[
  {
    "path": "README.md",
    "content": "# C++20 Fundamentals LiveLessons Code Examples\nSource code examples for our **C++20 Fundamentals LiveLessons** Videos.\n\nAt the moment, these videos are available only to O'Reilly Online Learning subscribers. For all our books, LiveLessons videos and Full Throttle live webinars on O'Reilly Online Learning, visit: https://deitel.com/LearnWithDeitel\n\nThese source-code files are (C) Copyright 2021 by Deitel & Associates, Inc. and Pearson Education, Inc. All Rights Reserved.\n\nYou may use these files for your personal purposes, but please do not repost them without our express written consent.\n\nIf you have any questions, open an issue in the Issues tab or email us: deitel at deitel dot com.\n\nThe authors and publisher of this video product have used their best efforts in preparing these videos. These efforts include the development, research, and testing of the theories and programs to determine their effectiveness. The authors and publisher make no warranty of any kind, expressed or implied, with regard to these programs or to the documentation contained in these videos. The authors and publisher shall not be liable in any event for incidental or consequential damages in connection with, or arising out of, the furnishing, performance, or use of these programs.\n"
  },
  {
    "path": "examples/docker/gcc13/dockerfile",
    "content": "FROM ubuntu:20.04\r\nRUN apt-get update -y\r\nRUN apt-get install -y build-essential wget\r\nRUN wget --quiet --content-disposition http://kayari.org/gcc-latest/gcc-latest.deb\r\nRUN dpkg -i gcc-latest*.deb\r\nRUN /opt/gcc-latest/bin/g++ --version\r\n\r\n"
  },
  {
    "path": "examples/lesson01/GuessNumber.cpp",
    "content": "// Randomly generate numbers between 1 and 1000 for user to guess.\n#include <iostream>\n#include <random> // contains C++11 random number generation features \nusing namespace std;\n\nbool isCorrect(int, int); // function prototype\n\nint main() {\n   // use the default random-number generation engine to                \n   // produce uniformly distributed pseudorandom int values from 1 to 1000\n   default_random_engine engine{random_device{}()};\n   uniform_int_distribution<int> randomInt{1, 1000};\n\n   char response = 'n'; // determines whether to continue playing\n\n   // loop until user types 'n' to quit game\n   do {\n      // generate random number between 1 and 1000\n      // 1 is shift, 1000 is scaling factor\n      const int answer{randomInt(engine)};\n\n      // prompt for guess\n      cout << \"I have a number between 1 and 1000.\\n\"\n         << \"Can you guess my number?\\n\"\n         << \"Please type your first guess.\\n? \";\n      int guess;\n      cin >> guess;\n\n      // loop until correct number\n      while (!isCorrect(guess, answer)) {\n         cin >> guess;\n      }\n\n      // prompt for another game\n      cout << \"\\nExcellent! You guessed the number!\\n\"\n         << \"Would you like to play again (y or n)? \";\n      cin >> response;\n\n      cout << endl;\n   } while (response == 'y');\n\n   return 0; // indicate successful termination\n} \n\n// isCorrect returns true if guess equals answer;\n// otherwise it displays a hint and returns false\nbool isCorrect(int guess, int answer) {\n   // guess is correct\n   if (guess == answer) {\n      return true;\n   }\n\n   // guess is incorrect; display hint\n   if (guess < answer) {\n      cout << \"Too low. Try again.\\n? \";\n   }\n   else {\n      cout << \"Too high. Try again.\\n? \";\n   }\n\n   return false;\n} // end function isCorrect\n\n\n\n/**************************************************************************\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson02/fig02_01.cpp",
    "content": "// fig02_01.cpp\r\n// Text-printing program.\r\n#include <iostream> // enables program to output data to the screen\r\n\r\n// function main begins program execution\r\nint main() {\r\n   std::cout << \"Welcome to C++!\\n\"; // display message\r\n   \r\n   return 0; // indicate that program ended successfully\r\n} // end function main\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n /*************************************************************************\r\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson02/fig02_02.cpp",
    "content": "// fig02_02.cpp\r\n// Displaying a line of text with multiple statements.\r\n#include <iostream> // enables program to output data to the screen\r\n\r\n// function main begins program execution\r\nint main() {\r\n   std::cout << \"Welcome \";\r\n   std::cout << \"to C++!\\n\";\r\n} // end function main\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson02/fig02_03.cpp",
    "content": "// fig02_03.cpp\r\n// Displayings multiple lines of text with a single statement.\r\n#include <iostream> // enables program to output data to the screen\r\n\r\n// function main begins program execution\r\nint main() {\r\n   std::cout << \"Welcome\\nto\\n\\nC++!\\n\";\r\n} // end function main\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson02/fig02_04.cpp",
    "content": "// fig02_04.cpp\r\n// Addition program that displays the sum of two integers.\r\n#include <iostream> // enables program to perform input and output\r\n\r\n// function main begins program execution\r\nint main() {\r\n   // declaring and initializing variables\r\n   int number1{0}; // first integer to add (initialized to 0)  \r\n   int number2{0}; // second integer to add (initialized to 0) \r\n   int sum{0}; // sum of number1 and number2 (initialized to 0)\r\n\r\n   std::cout << \"Enter first integer: \"; // prompt user for data\r\n   std::cin >> number1; // read first integer from user into number1\r\n\r\n   std::cout << \"Enter second integer: \"; // prompt user for data\r\n   std::cin >> number2; // read second integer from user into number2\r\n\r\n   sum = number1 + number2; // add the numbers; store result in sum\r\n\r\n   std::cout << \"Sum is \" << sum << \"\\n\"; // display sum\r\n} // end function main\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson02/fig02_05.cpp",
    "content": "// fig02_05.cpp\r\n// Comparing integers using if statements, relational operators\r\n// and equality operators.\r\n#include <iostream> // enables program to perform input and output\r\n\r\nusing std::cout; // program uses cout\r\nusing std::cin; // program uses cin\r\n\r\n// function main begins program execution\r\nint main() {\r\n   int number1{0}; // first integer to compare (initialized to 0)\r\n   int number2{0}; // second integer to compare (initialized to 0)\r\n   \r\n   cout << \"Enter two integers to compare: \"; // prompt user for data\r\n   cin >> number1 >> number2; // read two integers from user\r\n\r\n   if (number1 == number2) {\r\n      cout << number1 << \" == \" << number2 << \"\\n\";\r\n   }\r\n\r\n   if (number1 != number2) {\r\n      cout << number1 << \" != \" << number2 << \"\\n\";\r\n   }\r\n\r\n   if (number1 < number2) {\r\n      cout << number1 << \" < \" << number2 << \"\\n\";\r\n   }\r\n\r\n   if (number1 > number2) {\r\n      cout << number1 << \" > \" << number2 << \"\\n\";\r\n   }\r\n\r\n   if (number1 <= number2) {\r\n      cout << number1 << \" <= \" << number2 << \"\\n\";\r\n   }\r\n\r\n   if (number1 >= number2) {\r\n      cout << number1 << \" >= \" << number2 << \"\\n\";\r\n   }\r\n} // end function main\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson02/fig02_06.cpp",
    "content": "// fig02_06.cpp\r\n// Standard library string class test program. \r\n#include <iostream>\r\n#include <string> \r\nusing namespace std;\r\n\r\nint main() {\r\n   string s1{\"happy\"};    \r\n   string s2{\" birthday\"};\r\n   string s3; // creates an empty string\r\n              \r\n   // display the strings and show their lengths (length is C++20)\r\n   cout << \"s1: \\\"\" << s1 << \"\\\"; length: \" << s1.length()\r\n      << \"\\ns2: \\\"\" << s2 << \"\\\"; length: \" << s2.length()\r\n      << \"\\ns3: \\\"\" << s3 << \"\\\"; length: \" << s3.length();\r\n\r\n   // compare strings with == and !=\r\n   cout << \"\\n\\nThe results of comparing s2 and s1:\" << boolalpha\r\n      << \"\\ns2 == s1: \" << (s2 == s1)\r\n      << \"\\ns2 != s1: \" << (s2 != s1);\r\n   \r\n   // test string member function empty \r\n   cout << \"\\n\\nTesting s3.empty():\\n\";\r\n\r\n   if (s3.empty()) {\r\n      cout << \"s3 is empty; assigning to s3;\\n\";\r\n      s3 = s1 + s2; // assign s3 the result of concatenating s1 and s2\r\n      cout << \"s3: \\\"\" << s3 << \"\\\"\";\r\n   } \r\n\r\n   // testing new C++20 string member functions \r\n   cout << \"\\n\\ns1 starts with \\\"ha\\\": \" << s1.starts_with(\"ha\") << \"\\n\";\r\n   cout << \"s2 starts with \\\"ha\\\": \" << s2.starts_with(\"ha\") << \"\\n\";\r\n   cout << \"s1 ends with \\\"ay\\\": \" << s1.ends_with(\"ay\") << \"\\n\";\r\n   cout << \"s2 ends with \\\"ay\\\": \" << s2.ends_with(\"ay\") << \"\\n\";\r\n} \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson03/fig03_01.cpp",
    "content": "// fig03_01.cpp\r\n// Solving the class-average problem using counter-controlled iteration.\r\n#include <iostream>\r\nusing namespace std;\r\n\r\nint main() {\r\n   // initialization phase\r\n   int total{0}; // initialize sum of grades entered by the user\r\n   int gradeCounter{1}; // initialize grade # to be entered next\r\n\r\n   // processing phase uses counter-controlled iteration\r\n   while (gradeCounter <= 10) { // loop 10 times\r\n      cout << \"Enter grade: \"; // prompt \r\n      int grade;\r\n      cin >> grade; // input next grade\r\n      total = total + grade; // add grade to total\r\n      gradeCounter = gradeCounter + 1; // increment counter by 1\r\n   } \r\n\r\n   // termination phase\r\n   int average{total / 10}; // int division yields int result\r\n\r\n   // display total and average of grades\r\n   cout << \"\\nTotal of all 10 grades is \" << total;\r\n   cout << \"\\nClass average is \" << average << \"\\n\";\r\n} \r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson03/fig03_02.cpp",
    "content": "// fig03_02.cpp\r\n// Solving the class-average problem using sentinel-controlled iteration. \r\n#include <iostream>\r\n#include <iomanip> // parameterized stream manipulators  \r\nusing namespace std;\r\n\r\nint main() {\r\n   // initialization phase\r\n   double total{0.0}; // initialize sum of grades\r\n   int gradeCounter{0}; // initialize # of grades entered so far\r\n   \r\n   // processing phase\r\n   // prompt for input and read grade from user\r\n   cout << \"Enter grade or -1 to quit: \"; \r\n   int grade; \r\n   cin >> grade; \r\n\r\n   // loop until sentinel value is read from user\r\n   while (grade != -1) {\r\n      total = total + grade; // add grade to total\r\n      gradeCounter = gradeCounter + 1; // increment counter \r\n\r\n      // prompt for input and read next grade from user\r\n      cout << \"Enter grade or -1 to quit: \"; \r\n      cin >> grade; \r\n   }\r\n\r\n   // termination phase\r\n   // if user entered at least one grade\r\n   if (gradeCounter != 0) { // avoid division by zero\r\n      // calculate average of grades\r\n      double average{total / gradeCounter};\r\n\r\n      // display total and average (with two digits of precision)\r\n      cout << \"\\nTotal of the \" << gradeCounter \r\n         << \" grades entered is \" << total;\r\n      cout << setprecision(2) << fixed; \r\n      cout << \"\\nClass average is \" << average << \"\\n\"; \r\n   } \r\n   else { // no grades were entered, so output appropriate message\r\n      cout << \"No grades were entered\\n\"; \r\n   }\r\n} \r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson03/fig03_03.cpp",
    "content": "// fig03_03.cpp\r\n// Analysis of examination results using nested control statements.\r\n#include <iostream>\r\nusing namespace std;\r\n\r\nint main() {\r\n   // initializing variables in declarations\r\n   int passes{0}; \r\n   int failures{0};\r\n   int studentCounter{1}; \r\n\r\n   // process 10 students using counter-controlled loop\r\n   while (studentCounter <= 10) {\r\n      // prompt user for input and obtain value from user\r\n      cout << \"Enter result (1 = pass, 2 = fail): \";\r\n      int result;\r\n      cin >> result;\r\n\r\n      // if...else is nested in the while statement           \r\n      if (result == 1) {         \r\n         passes = passes + 1;  \r\n      }\r\n      else {    \r\n         failures = failures + 1; \r\n      }\r\n\r\n      // increment studentCounter so loop eventually terminates\r\n      studentCounter = studentCounter + 1;  \r\n   } \r\n\r\n   // termination phase; prepare and display results\r\n   cout << \"Passed: \" << passes << \"\\nFailed: \" << failures << \"\\n\";\r\n\r\n   // determine whether more than 8 students passed\r\n   if (passes > 8) {\r\n      cout << \"Bonus to instructor!\\n\";\r\n   }\r\n} \r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson03/fig03_04.cpp",
    "content": "// fig03_04.cpp\r\n// Prefix increment and postfix increment operators.\r\n#include <iostream>\r\nusing namespace std;\r\n\r\nint main() {\r\n   // demonstrate postfix increment operator\r\n   int c{5}; \r\n   cout << \"c before postincrement: \" << c << \"\\n\"; // prints 5\r\n   cout << \"    postincrementing c: \" << c++ << \"\\n\"; // prints 5\r\n   cout << \" c after postincrement: \" << c << \"\\n\"; // prints 6                     \r\n\r\n   cout << \"\\n\"; // skip a line\r\n\r\n   // demonstrate prefix increment operator\r\n   c = 5;  \r\n   cout << \" c before preincrement: \" << c << \"\\n\"; // prints 5\r\n   cout << \"     preincrementing c: \" << ++c << \"\\n\"; // prints 6\r\n   cout << \"  c after preincrement: \" << c << \"\\n\"; // prints 6                     \r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson03/fig03_05.cpp",
    "content": "// fig03_05.cpp\r\n// Conveniently creating and manipulating super-sized integers\r\n// with objects of the Boost Multiprecision library's cpp_int class.\r\n#include <boost/multiprecision/cpp_int.hpp>\r\n#include <iostream>\r\nusing namespace std;\r\nusing boost::multiprecision::cpp_int;\r\n\t\r\nint main() {\r\n   // initializing cpp_ints\r\n   const cpp_int value1{\"100000000000000000000000000000\"}; // 30 digits\r\n   const cpp_int value2{9223372036854775807LL}; // long long max\r\n   const int value3{3}; \r\n   \r\n   cout << \"INITIAL VALUES\"\r\n      << \"\\ncpp_int value1: \" << value1\r\n      << \"\\ncpp_int value2: \" << value2\r\n      << \"\\n    int value3: \" << value3;\r\n   \r\n   // arithmetic with cpp_ints\r\n   cout << \"\\n\\nADD, SUBTRACT AND MULTIPLY CPP_INT OBJECTS\"\r\n      << \"\\nvalue1 + value2: \" << value1 + value2\r\n      << \"\\nvalue1 - value2: \" << value1 - value2\r\n      << \"\\nvalue1 * value2: \" << value1 * value2;\r\n   \r\n   // arithmetic mixing cpp_ints and integers\r\n   cout << \"\\n\\nMULTIPLY A CPP_INT OBJECT BY INT VALUES\"\r\n      << \"\\nvalue1 * value3: \" << value1 * value3\r\n      << \"\\n    value1 * 17: \" << value1 * 17 << \"\\n\";\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n\r\n"
  },
  {
    "path": "examples/lesson04/decimalformatter.h",
    "content": "// decimalformatter.h\r\n// Custom std::formatter that formats a \r\n// boost::multiprecision::cpp_dec_float_50 as a std::string\r\n// with two digits to the right of the decimal point.\r\n#pragma once\r\n#include <boost/multiprecision/cpp_dec_float.hpp>\r\n#include <format> \r\n#include <iomanip>\r\n#include <sstream>\r\n#include <string>\r\n\r\n// short name for boost::multiprecision::cpp_dec_float_50\r\nusing decimal = boost::multiprecision::cpp_dec_float_50;\r\n\r\n// Custom formatter for boost::multiprecision::cpp_dec_float_50. \r\n// Formats as a string with two digits to the right of the decimal point.\r\n// More info at: https://fmt.dev/latest/api.html#format-api\r\ntemplate<> struct std::formatter<decimal> : std::formatter<string_view> {\r\n   template <typename FormatContext>\r\n   auto format(decimal d, FormatContext& ctx) const {\r\n      std::ostringstream out{};\r\n      out << std::fixed << std::setprecision(2) << d;\r\n      return formatter<string_view>::format(out.str(), ctx);\r\n   }\r\n};"
  },
  {
    "path": "examples/lesson04/decimalformatter_fmt.h",
    "content": "// decimalformatter.h\r\n// Custom fmt::formatter that formats a \r\n// boost::multiprecision::cpp_dec_float_50 as a std::string\r\n// with two digits to the right of the decimal point.\r\n#pragma once\r\n#include <boost/multiprecision/cpp_dec_float.hpp>\r\n#include <fmt/format.h> // in C++20, this will be #include <format>\r\n#include <iomanip>\r\n#include <sstream>\r\n#include <string>\r\n\r\n// short name for boost::multiprecision::cpp_dec_float_50\r\nusing decimal = boost::multiprecision::cpp_dec_float_50;\r\n\r\n// Custom formatter for boost::multiprecision::cpp_dec_float_50. \r\n// Formats as a string with two digits to the right of the decimal point.\r\n// More info at: https://fmt.dev/latest/api.html#format-api\r\ntemplate<> struct fmt::formatter<decimal> : fmt::formatter<string_view> {\r\n   template <typename FormatContext>\r\n   auto format(decimal d, FormatContext& ctx) const {\r\n      std::ostringstream out{};\r\n      out << std::fixed << std::setprecision(2) << d;\r\n      return formatter<string_view>::format(out.str(), ctx);\r\n   }\r\n};"
  },
  {
    "path": "examples/lesson04/ex04_06.cpp",
    "content": "// ex04_06.cpp\r\n#include <iostream>\r\nusing namespace std;\r\n\r\nint main() {\r\n   for (int i{1}; i <= 10; i++) {\r\n      for (int j{1}; j <= 5; j++) {\r\n         cout << '@';\r\n      }\r\n\r\n      cout << '\\n';\r\n   } \r\n} \r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson04/fig04_01.cpp",
    "content": "// fig04_01.cpp\r\n// Counter-controlled iteration with the while iteration statement.\r\n#include <iostream>\r\nusing namespace std;\r\n\r\nint main() {      \r\n   int counter{1}; // declare and initialize control variable\r\n\r\n   while (counter <= 10) { // loop-continuation condition\r\n      cout << counter << \"  \";\r\n      ++counter; // increment control variable \r\n   } \r\n\r\n   cout << \"\\n\"; \r\n} \r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson04/fig04_02.cpp",
    "content": "// fig04_02.cpp\r\n// Counter-controlled iteration with the for iteration statement.\r\n#include <iostream>\r\nusing namespace std;\r\n\r\nint main() {\r\n   // for statement header includes initialization,  \r\n   // loop-continuation condition and increment\r\n   for (int counter{1}; counter <= 10; ++counter) { \r\n      cout << counter << \"  \";\r\n   }\r\n\r\n   cout << \"\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson04/fig04_03.cpp",
    "content": "// fig04_03.cpp\n// Summing integers with the for statement; introducing text formatting.\n#include <format> \n#include <iostream>\nusing namespace std;\n\nint main() {\n   int total{0};\n\n   // total even integers from 2 through 20\n   for (int number{2}; number <= 20; number += 2) {\n      total += number;                             \n   }\n\n   cout << format(\"Sum is {}\\n\", total);\n} \n\n\n\n\n/**************************************************************************\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n *************************************************************************/\n"
  },
  {
    "path": "examples/lesson04/fig04_03fmt.cpp",
    "content": "// fig04_03.cpp\n// Summing integers with the for statement; introducing text formatting.\n#include <fmt/format.h> // C++20: This will be #include <format> \n#include <iostream>\nusing namespace std;\n\nint main() {\n   int total{0};\n\n   // total even integers from 2 through 20\n   for (int number{2}; number <= 20; number += 2) {\n      total += number;                             \n   }\n\n   cout << fmt::format(\"Sum is {}\\n\", total);\n} \n\n\n\n\n/**************************************************************************\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n *************************************************************************/\n"
  },
  {
    "path": "examples/lesson04/fig04_04.cpp",
    "content": "// fig04_04.cpp\r\n// Compound-interest calculations with for.\r\n#include <format> \r\n#include <iostream>\r\n#include <cmath> // for pow function\r\nusing namespace std;\r\n\r\nint main() {\r\n   double principal{1000.00}; // initial amount before interest\r\n   double rate{0.05}; // interest rate\r\n\r\n   cout << format(\"Initial principal: {:>7.2f}\\n\", principal)\r\n        << format(\"    Interest rate: {:>7.2f}\\n\", rate);\r\n\r\n   // display headers\r\n   cout << format(\"\\n{}{:>20}\\n\", \"Year\",  \"Amount on deposit\");\r\n\r\n   // calculate amount on deposit for each of ten years              \r\n   for (int year{1}; year <= 10; ++year) {                           \r\n      // calculate amount on deposit at the end of the specified year\r\n      double amount{principal * pow(1.0 + rate, year)} ;             \r\n                                                                     \r\n      // display the year and the amount                             \r\n      cout << format(\"{:>4d}{:>20.2f}\\n\", year, amount);\r\n   }                                                                 \r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson04/fig04_04fmt.cpp",
    "content": "// fig04_04.cpp\r\n// Compound-interest calculations with for.\r\n#include <fmt/format.h> // C++20: This will be #include <format> \r\n#include <iostream>\r\n#include <cmath> // for pow function\r\nusing namespace std;\r\n\r\nint main() {\r\n   double principal{1000.00}; // initial amount before interest\r\n   double rate{0.05}; // interest rate\r\n\r\n   cout << fmt::format(\"Initial principal: {:>7.2f}\\n\", principal)\r\n        << fmt::format(\"    Interest rate: {:>7.2f}\\n\", rate);\r\n\r\n   // display headers\r\n   cout << fmt::format(\"\\n{}{:>20}\\n\", \"Year\",  \"Amount on deposit\");\r\n\r\n   // calculate amount on deposit for each of ten years              \r\n   for (int year{1}; year <= 10; ++year) {                           \r\n      // calculate amount on deposit at the end of the specified year\r\n      double amount{principal * pow(1.0 + rate, year)} ;             \r\n                                                                     \r\n      // display the year and the amount                             \r\n      cout << fmt::format(\"{:>4d}{:>20.2f}\\n\", year, amount);\r\n   }                                                                 \r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson04/fig04_05.cpp",
    "content": "// fig04_05.cpp\r\n// do...while iteration statement.\r\n#include <iostream>\r\nusing namespace std;\r\n\r\nint main() {\r\n   int counter{1}; \r\n\r\n   do {\r\n      cout << counter << \"  \";\r\n      ++counter;\r\n   } while (counter <= 10); // end do...while \r\n\r\n   cout << \"\\n\"; \r\n} \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson04/fig04_06.cpp",
    "content": "// fig04_06.cpp\r\n// Using a switch statement to count letter grades.\r\n#include <format>\r\n#include <iostream>\r\nusing namespace std;\r\n\r\nint main() {\r\n   double total{0.0}; // sum of grades                  \r\n   int gradeCounter{0}; // number of grades entered\r\n   int aCount{0}; // count of A grades             \r\n   int bCount{0}; // count of B grades             \r\n   int cCount{0}; // count of C grades             \r\n   int dCount{0}; // count of D grades             \r\n   int fCount{0}; // count of F grades             \r\n\r\n   cout << \"Enter the integer grades in the range 0-100.\\n\"\r\n      << \"Type the end-of-file indicator to terminate input:\\n\"\r\n      << \"   On UNIX/Linux/macOS type <Ctrl> d then press Enter\\n\"\r\n      << \"   On Windows type <Ctrl> z then press Enter\\n\";\r\n\r\n   int grade;\r\n\r\n   // loop until user enters the end-of-file indicator\r\n   while (cin >> grade) { \r\n      total += grade; // add grade to total\r\n      ++gradeCounter; // increment number of grades\r\n      \r\n      //  increment appropriate letter-grade counter\r\n      switch (grade / 10) {                        \r\n         case 9:  // grade was between 90          \r\n         case 10: // and 100, inclusive            \r\n            ++aCount;                              \r\n            break; // exits switch                 \r\n                                                   \r\n         case 8: // grade was between 80 and 89    \r\n            ++bCount;                              \r\n            break; // exits switch                 \r\n                                                   \r\n         case 7: // grade was between 70 and 79    \r\n            ++cCount;                              \r\n            break; // exits switch                 \r\n                                                   \r\n         case 6: // grade was between 60 and 69    \r\n            ++dCount;                              \r\n            break; // exits switch                 \r\n                                                   \r\n         default: // grade was less than 60        \r\n            ++fCount;                              \r\n            break; // optional; exits switch anyway\r\n      } // end switch                              \r\n   } // end while \r\n\r\n   // display grade report\r\n   cout << \"\\nGrade Report:\\n\";\r\n\r\n   // if user entered at least one grade...\r\n   if (gradeCounter != 0) {\r\n      // calculate average of all grades entered\r\n      double average{total / gradeCounter};\r\n\r\n      // output summary of results\r\n      cout << format(\"Total of the {} grades entered is {}\\n\", \r\n                 gradeCounter, total)\r\n           << format(\"Class average is {:.2f}\\n\\n\", average)  \r\n           << \"Summary of student's grades:\\n\"\r\n           << format(\"A: {}\\nB: {}\\nC: {}\\nD: {}\\nF: {}\\n\",\r\n                 aCount, bCount, cCount, dCount, fCount); \r\n   } \r\n   else { // no grades were entered, so output appropriate message\r\n      cout << \"No grades were entered\\n\";\r\n   }\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson04/fig04_06fmt.cpp",
    "content": "// fig04_06.cpp\r\n// Using a switch statement to count letter grades.\r\n#include <fmt/format.h> // C++20: This will be #include <format> \r\n#include <iostream>\r\nusing namespace std;\r\n\r\nint main() {\r\n   double total{0.0}; // sum of grades                  \r\n   int gradeCounter{0}; // number of grades entered\r\n   int aCount{0}; // count of A grades             \r\n   int bCount{0}; // count of B grades             \r\n   int cCount{0}; // count of C grades             \r\n   int dCount{0}; // count of D grades             \r\n   int fCount{0}; // count of F grades             \r\n\r\n   cout << \"Enter the integer grades in the range 0-100.\\n\"\r\n      << \"Type the end-of-file indicator to terminate input:\\n\"\r\n      << \"   On UNIX/Linux/macOS type <Ctrl> d then press Enter\\n\"\r\n      << \"   On Windows type <Ctrl> z then press Enter\\n\";\r\n\r\n   int grade;\r\n\r\n   // loop until user enters the end-of-file indicator\r\n   while (cin >> grade) { \r\n      total += grade; // add grade to total\r\n      ++gradeCounter; // increment number of grades\r\n      \r\n      //  increment appropriate letter-grade counter\r\n      switch (grade / 10) {                        \r\n         case 9:  // grade was between 90          \r\n         case 10: // and 100, inclusive            \r\n            ++aCount;                              \r\n            break; // exits switch                 \r\n                                                   \r\n         case 8: // grade was between 80 and 89    \r\n            ++bCount;                              \r\n            break; // exits switch                 \r\n                                                   \r\n         case 7: // grade was between 70 and 79    \r\n            ++cCount;                              \r\n            break; // exits switch                 \r\n                                                   \r\n         case 6: // grade was between 60 and 69    \r\n            ++dCount;                              \r\n            break; // exits switch                 \r\n                                                   \r\n         default: // grade was less than 60        \r\n            ++fCount;                              \r\n            break; // optional; exits switch anyway\r\n      } // end switch                              \r\n   } // end while \r\n\r\n   // display grade report\r\n   cout << \"\\nGrade Report:\\n\";\r\n\r\n   // if user entered at least one grade...\r\n   if (gradeCounter != 0) {\r\n      // calculate average of all grades entered\r\n      double average{total / gradeCounter};\r\n\r\n      // output summary of results\r\n      cout << fmt::format(\"Total of the {} grades entered is {}\\n\", \r\n                 gradeCounter, total)\r\n           << fmt::format(\"Class average is {:.2f}\\n\\n\", average)  \r\n           << \"Summary of student's grades:\\n\"\r\n           << fmt::format(\"A: {}\\nB: {}\\nC: {}\\nD: {}\\nF: {}\\n\",\r\n                 aCount, bCount, cCount, dCount, fCount); \r\n   } \r\n   else { // no grades were entered, so output appropriate message\r\n      cout << \"No grades were entered\\n\";\r\n   }\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson04/fig04_07.cpp",
    "content": "// fig04_07.cpp\r\n// if statements with initializers.\r\n#include <format> \r\n#include <iostream>\r\nusing namespace std;\r\n\r\nint main() {\r\n   if (int value{7}; value == 7) {\r\n      cout << format(\"value is {}\\n\", value);\r\n   }\r\n   else {\r\n      cout << format(\"value is not 7; it is {}\\n\", value);\r\n   }\r\n\r\n   if (int value{13}; value == 9) {\r\n      cout << format(\"value is {}\\n\", value);\r\n   }\r\n   else {\r\n      cout << format(\"value is not 9; it is {}\\n\", value);\r\n   }\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson04/fig04_07_with_error.cpp",
    "content": "// fig04_07_with_error.cpp\r\n// C++17 if statements with initializers.\r\n#include <iostream>\r\nusing namespace std;\r\n\r\nint main() {\r\n   if (int value{7}; value == 7) {\r\n      cout << \"value is \" << value << endl;\r\n   }\r\n   else {\r\n      cout << \"value is not 7; it is \" << value << endl;\r\n   }\r\n\r\n   if (int value{13}; value == 9) {\r\n      cout << \"value is \" << value << endl;\r\n   }\r\n   else {\r\n      cout << \"value is not 9; it is \" << value << endl;\r\n   }\r\n\r\n   cout << value;\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2020 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson04/fig04_07fmt.cpp",
    "content": "// fig04_07.cpp\r\n// if statements with initializers.\r\n#include <fmt/format.h> // C++20: This will be #include <format> \r\n#include <iostream>\r\nusing namespace std;\r\n\r\nint main() {\r\n   if (int value{7}; value == 7) {\r\n      cout << fmt::format(\"value is {}\\n\", value);\r\n   }\r\n   else {\r\n      cout << fmt::format(\"value is not 7; it is {}\\n\", value);\r\n   }\r\n\r\n   if (int value{13}; value == 9) {\r\n      cout << fmt::format(\"value is {}\\n\", value);\r\n   }\r\n   else {\r\n      cout << fmt::format(\"value is not 9; it is {}\\n\", value);\r\n   }\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson04/fig04_08.cpp",
    "content": "// fig04_08.cpp\r\n// break statement exiting a for statement.\r\n#include <iostream>\r\nusing namespace std;\r\n\r\nint main() {\r\n   int count; // control variable also used after loop \r\n   \r\n   for (count = 1; count <= 10; ++count) { // loop 10 times\r\n      if (count == 5) {\r\n         break; // terminates for loop if count is 5\r\n      }\r\n\r\n      cout << count << \" \";\r\n   }\r\n\r\n   cout << \"\\nBroke out of loop at count = \" << count << \"\\n\";\r\n} \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson04/fig04_09.cpp",
    "content": "// fig04_09.cpp\r\n// continue statement terminating an iteration of a for statement.\r\n#include <iostream>\r\nusing namespace std;\r\n\r\nint main() {\r\n   for (int count{1}; count <= 10; ++count) { // loop 10 times\r\n      if (count == 5) {\r\n         continue; // skip remaining code in loop body if count is 5\r\n      }\r\n\r\n      cout << count << \" \";\r\n   } \r\n\r\n   cout << \"\\nUsed continue to skip printing 5\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson04/fig04_10.cpp",
    "content": "// fig04_10.cpp\r\n// Logical operators.\r\n#include <format>\r\n#include <iostream>\r\nusing namespace std;\r\n\r\nint main() {\r\n   // create truth table for && (logical AND) operator\r\n   cout << \"Logical AND (&&)\\n\"\r\n      << format(\"false && false: {}\\n\", false && false)\r\n      << format(\"false && true: {}\\n\", false && true)\r\n      << format(\"true && false: {}\\n\", true && false)\r\n      << format(\"true && true: {}\\n\\n\", true && true);\r\n\r\n   // create truth table for || (logical OR) operator\r\n   cout << \"Logical OR (||)\\n\"\r\n      << format(\"false || false: {}\\n\", false || false)\r\n      << format(\"false || true: {}\\n\", false || true)\r\n      << format(\"true || false: {}\\n\", true || false)\r\n      << format(\"true || true: {}\\n\\n\", true || true);\r\n\r\n   // create truth table for ! (logical negation) operator\r\n   cout << \"Logical negation (!)\\n\"\r\n      << format(\"!false: {}\\n\", !false)\r\n      << format(\"!true: {}\\n\", !true);\r\n} \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson04/fig04_11.cpp",
    "content": "// fig04_11.cpp\r\n// Using the miniz-cpp header-only library to write and read a ZIP file.\r\n#include <iostream>\r\n#include <string>\r\n#include \"zip_file.hpp\"\r\nusing namespace std;\r\n\r\nint main() {\r\n   cout << \"Enter a ZIP file name: \";\r\n   string zipFileName;\r\n   getline(cin, zipFileName); // inputs a line of text\r\n\r\n   // strings literals separated only by whitespace are combined \r\n   // into a single string by the compiler\r\n   string content{ \r\n      \"This chapter introduces all but one of the remaining control \"\r\n      \"statements--the for, do...while, switch, break and continue \"\r\n      \"statements. We explore the essentials of counter-controlled \"\r\n      \"iteration. We use compound-interest calculations to begin \"\r\n      \"investigating the issues of processing monetary amounts. First, \"\r\n      \"we discuss the representational errors associated with \"\r\n      \"floating-point types. We use a switch statement to count the \"\r\n      \"number of A, B, C, D and F grade equivalents in a set of \"\r\n      \"numeric grades. We show C++17's enhancements that allow you to \"\r\n      \"initialize one or more variables of the same type in the \"\r\n      \"headers of if and switch statements.\"};\r\n\r\n   cout << \"\\ncontent.length(): \" << content.length();\r\n\r\n   miniz_cpp::zip_file output; // create zip_file object\r\n\r\n   // write content into a text file in outputZipFile\r\n   output.writestr(\"intro.txt\", content); // create file in ZIP\r\n   output.save(zipFileName); // save outputZipFile to zipFileName\r\n\r\n   miniz_cpp::zip_file input{zipFileName}; // load zipFileName\r\n\r\n   // display input's file name and directory listing\r\n   cout << \"\\n\\nZIP file's name: \" << input.get_filename()\r\n      << \"\\n\\nZIP file's directory listing:\\n\";\r\n   input.printdir(); \r\n\r\n   // display info about the compressed intro.txt file\r\n   miniz_cpp::zip_info info{input.getinfo(\"intro.txt\")};\r\n\r\n   cout << \"\\nFile name: \" << info.filename\r\n      << \"\\nOriginal size: \" << info.file_size\r\n      << \"\\nCompressed size: \" << info.compress_size;\r\n\r\n   // original file contents\r\n   string extractedContent{input.read(info)};\r\n\r\n   cout << \"\\n\\nOriginal contents of intro.txt:\\n\" << \r\n      extractedContent << endl;\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2020 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson04/fig04_12/fig04_12.cpp",
    "content": "// fig04_12.cpp\r\n// Compound-interest example with C++20 text formatting.\r\n#include <iostream>\r\n#include <cmath> // for pow function\r\n#include \"fmt/format.h\" // in C++20, this will be #include <format>\r\nusing namespace std;\r\nusing namespace fmt; // not needed in C++20\r\n\r\nint main() {\r\n   double principal{1000.00}; // initial amount before interest\r\n   double rate{0.05}; // interest rate\r\n\r\n   cout << format(\"Initial principal: {:>7.2f}\\n\", principal)\r\n        << format(\"    Interest rate: {:>7.2f}\\n\", rate);\r\n\r\n   // display headers\r\n   cout << format(\"\\n{}{:>20}\\n\", \"Year\", \"Amount on deposit\");\r\n\r\n   // calculate amount on deposit for each of ten years\r\n   for (int year{1}; year <= 10; ++year) {\r\n      // calculate amount on deposit at the end of the specified year\r\n      double amount = principal * pow(1.0 + rate, year);\r\n\r\n      // display the year and the amount\r\n      cout << format(\"{:>4d}{:>20.2f}\\n\", year, amount);\r\n   }\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2020 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson04/fig04_12/fmt/core.h",
    "content": "// Formatting library for C++ - the core API\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#ifndef FMT_CORE_H_\n#define FMT_CORE_H_\n\n#include <cstdio>  // std::FILE\n#include <cstring>\n#include <functional>\n#include <iterator>\n#include <memory>\n#include <string>\n#include <type_traits>\n#include <vector>\n\n// The fmt library version in the form major * 10000 + minor * 100 + patch.\n#define FMT_VERSION 60200\n\n#ifdef __has_feature\n#  define FMT_HAS_FEATURE(x) __has_feature(x)\n#else\n#  define FMT_HAS_FEATURE(x) 0\n#endif\n\n#if defined(__has_include) && !defined(__INTELLISENSE__) && \\\n    !(defined(__INTEL_COMPILER) && __INTEL_COMPILER < 1600)\n#  define FMT_HAS_INCLUDE(x) __has_include(x)\n#else\n#  define FMT_HAS_INCLUDE(x) 0\n#endif\n\n#ifdef __has_cpp_attribute\n#  define FMT_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)\n#else\n#  define FMT_HAS_CPP_ATTRIBUTE(x) 0\n#endif\n\n#define FMT_HAS_CPP14_ATTRIBUTE(attribute) \\\n  (__cplusplus >= 201402L && FMT_HAS_CPP_ATTRIBUTE(attribute))\n\n#define FMT_HAS_CPP17_ATTRIBUTE(attribute) \\\n  (__cplusplus >= 201703L && FMT_HAS_CPP_ATTRIBUTE(attribute))\n\n#ifdef __clang__\n#  define FMT_CLANG_VERSION (__clang_major__ * 100 + __clang_minor__)\n#else\n#  define FMT_CLANG_VERSION 0\n#endif\n\n#if defined(__GNUC__) && !defined(__clang__)\n#  define FMT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)\n#else\n#  define FMT_GCC_VERSION 0\n#endif\n\n#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)\n#  define FMT_HAS_GXX_CXX11 FMT_GCC_VERSION\n#else\n#  define FMT_HAS_GXX_CXX11 0\n#endif\n\n#ifdef __NVCC__\n#  define FMT_NVCC __NVCC__\n#else\n#  define FMT_NVCC 0\n#endif\n\n#ifdef _MSC_VER\n#  define FMT_MSC_VER _MSC_VER\n#else\n#  define FMT_MSC_VER 0\n#endif\n\n// Check if relaxed C++14 constexpr is supported.\n// GCC doesn't allow throw in constexpr until version 6 (bug 67371).\n#ifndef FMT_USE_CONSTEXPR\n#  define FMT_USE_CONSTEXPR                                           \\\n    (FMT_HAS_FEATURE(cxx_relaxed_constexpr) || FMT_MSC_VER >= 1910 || \\\n     (FMT_GCC_VERSION >= 600 && __cplusplus >= 201402L)) &&           \\\n        !FMT_NVCC\n#endif\n#if FMT_USE_CONSTEXPR\n#  define FMT_CONSTEXPR constexpr\n#  define FMT_CONSTEXPR_DECL constexpr\n#else\n#  define FMT_CONSTEXPR inline\n#  define FMT_CONSTEXPR_DECL\n#endif\n\n#ifndef FMT_OVERRIDE\n#  if FMT_HAS_FEATURE(cxx_override) || \\\n      (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1900\n#    define FMT_OVERRIDE override\n#  else\n#    define FMT_OVERRIDE\n#  endif\n#endif\n\n// Check if exceptions are disabled.\n#ifndef FMT_EXCEPTIONS\n#  if (defined(__GNUC__) && !defined(__EXCEPTIONS)) || \\\n      FMT_MSC_VER && !_HAS_EXCEPTIONS\n#    define FMT_EXCEPTIONS 0\n#  else\n#    define FMT_EXCEPTIONS 1\n#  endif\n#endif\n\n// Define FMT_USE_NOEXCEPT to make fmt use noexcept (C++11 feature).\n#ifndef FMT_USE_NOEXCEPT\n#  define FMT_USE_NOEXCEPT 0\n#endif\n\n#if FMT_USE_NOEXCEPT || FMT_HAS_FEATURE(cxx_noexcept) || \\\n    (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1900\n#  define FMT_DETECTED_NOEXCEPT noexcept\n#  define FMT_HAS_CXX11_NOEXCEPT 1\n#else\n#  define FMT_DETECTED_NOEXCEPT throw()\n#  define FMT_HAS_CXX11_NOEXCEPT 0\n#endif\n\n#ifndef FMT_NOEXCEPT\n#  if FMT_EXCEPTIONS || FMT_HAS_CXX11_NOEXCEPT\n#    define FMT_NOEXCEPT FMT_DETECTED_NOEXCEPT\n#  else\n#    define FMT_NOEXCEPT\n#  endif\n#endif\n\n// [[noreturn]] is disabled on MSVC and NVCC because of bogus unreachable code\n// warnings.\n#if FMT_EXCEPTIONS && FMT_HAS_CPP_ATTRIBUTE(noreturn) && !FMT_MSC_VER && \\\n    !FMT_NVCC\n#  define FMT_NORETURN [[noreturn]]\n#else\n#  define FMT_NORETURN\n#endif\n\n#ifndef FMT_MAYBE_UNUSED\n#  if FMT_HAS_CPP17_ATTRIBUTE(maybe_unused)\n#    define FMT_MAYBE_UNUSED [[maybe_unused]]\n#  else\n#    define FMT_MAYBE_UNUSED\n#  endif\n#endif\n\n#ifndef FMT_DEPRECATED\n#  if FMT_HAS_CPP14_ATTRIBUTE(deprecated) || FMT_MSC_VER >= 1900\n#    define FMT_DEPRECATED [[deprecated]]\n#  else\n#    if defined(__GNUC__) || defined(__clang__)\n#      define FMT_DEPRECATED __attribute__((deprecated))\n#    elif FMT_MSC_VER\n#      define FMT_DEPRECATED __declspec(deprecated)\n#    else\n#      define FMT_DEPRECATED /* deprecated */\n#    endif\n#  endif\n#endif\n\n// Workaround broken [[deprecated]] in the Intel, PGI and NVCC compilers.\n#if defined(__INTEL_COMPILER) || defined(__PGI) || FMT_NVCC\n#  define FMT_DEPRECATED_ALIAS\n#else\n#  define FMT_DEPRECATED_ALIAS FMT_DEPRECATED\n#endif\n\n#ifndef FMT_BEGIN_NAMESPACE\n#  if FMT_HAS_FEATURE(cxx_inline_namespaces) || FMT_GCC_VERSION >= 404 || \\\n      FMT_MSC_VER >= 1900\n#    define FMT_INLINE_NAMESPACE inline namespace\n#    define FMT_END_NAMESPACE \\\n      }                       \\\n      }\n#  else\n#    define FMT_INLINE_NAMESPACE namespace\n#    define FMT_END_NAMESPACE \\\n      }                       \\\n      using namespace v6;     \\\n      }\n#  endif\n#  define FMT_BEGIN_NAMESPACE \\\n    namespace fmt {           \\\n    FMT_INLINE_NAMESPACE v6 {\n#endif\n\n#if !defined(FMT_HEADER_ONLY) && defined(_WIN32)\n#  if FMT_MSC_VER\n#    define FMT_NO_W4275 __pragma(warning(suppress : 4275))\n#  else\n#    define FMT_NO_W4275\n#  endif\n#  define FMT_CLASS_API FMT_NO_W4275\n#  ifdef FMT_EXPORT\n#    define FMT_API __declspec(dllexport)\n#  elif defined(FMT_SHARED)\n#    define FMT_API __declspec(dllimport)\n#    define FMT_EXTERN_TEMPLATE_API FMT_API\n#  endif\n#endif\n#ifndef FMT_CLASS_API\n#  define FMT_CLASS_API\n#endif\n#ifndef FMT_API\n#  if FMT_GCC_VERSION || FMT_CLANG_VERSION\n#    define FMT_API __attribute__((visibility(\"default\")))\n#    define FMT_EXTERN_TEMPLATE_API FMT_API\n#    define FMT_INSTANTIATION_DEF_API\n#  else\n#    define FMT_API\n#  endif\n#endif\n#ifndef FMT_EXTERN_TEMPLATE_API\n#  define FMT_EXTERN_TEMPLATE_API\n#endif\n#ifndef FMT_INSTANTIATION_DEF_API\n#  define FMT_INSTANTIATION_DEF_API FMT_API\n#endif\n\n#ifndef FMT_HEADER_ONLY\n#  define FMT_EXTERN extern\n#else\n#  define FMT_EXTERN\n#endif\n\n// libc++ supports string_view in pre-c++17.\n#if (FMT_HAS_INCLUDE(<string_view>) &&                       \\\n     (__cplusplus > 201402L || defined(_LIBCPP_VERSION))) || \\\n    (defined(_MSVC_LANG) && _MSVC_LANG > 201402L && _MSC_VER >= 1910)\n#  include <string_view>\n#  define FMT_USE_STRING_VIEW\n#elif FMT_HAS_INCLUDE(\"experimental/string_view\") && __cplusplus >= 201402L\n#  include <experimental/string_view>\n#  define FMT_USE_EXPERIMENTAL_STRING_VIEW\n#endif\n\n#ifndef FMT_UNICODE\n#  define FMT_UNICODE !FMT_MSC_VER\n#endif\n#if FMT_UNICODE && FMT_MSC_VER\n#  pragma execution_character_set(\"utf-8\")\n#endif\n\nFMT_BEGIN_NAMESPACE\n\n// Implementations of enable_if_t and other metafunctions for older systems.\ntemplate <bool B, class T = void>\nusing enable_if_t = typename std::enable_if<B, T>::type;\ntemplate <bool B, class T, class F>\nusing conditional_t = typename std::conditional<B, T, F>::type;\ntemplate <bool B> using bool_constant = std::integral_constant<bool, B>;\ntemplate <typename T>\nusing remove_reference_t = typename std::remove_reference<T>::type;\ntemplate <typename T>\nusing remove_const_t = typename std::remove_const<T>::type;\ntemplate <typename T>\nusing remove_cvref_t = typename std::remove_cv<remove_reference_t<T>>::type;\ntemplate <typename T> struct type_identity { using type = T; };\ntemplate <typename T> using type_identity_t = typename type_identity<T>::type;\n\nstruct monostate {};\n\n// An enable_if helper to be used in template parameters which results in much\n// shorter symbols: https://godbolt.org/z/sWw4vP. Extra parentheses are needed\n// to workaround a bug in MSVC 2019 (see #1140 and #1186).\n#define FMT_ENABLE_IF(...) enable_if_t<(__VA_ARGS__), int> = 0\n\nnamespace internal {\n\n// A helper function to suppress bogus \"conditional expression is constant\"\n// warnings.\ntemplate <typename T> FMT_CONSTEXPR T const_check(T value) { return value; }\n\n// A workaround for gcc 4.8 to make void_t work in a SFINAE context.\ntemplate <typename... Ts> struct void_t_impl { using type = void; };\n\nFMT_NORETURN FMT_API void assert_fail(const char* file, int line,\n                                      const char* message);\n\n#ifndef FMT_ASSERT\n#  ifdef NDEBUG\n// FMT_ASSERT is not empty to avoid -Werror=empty-body.\n#    define FMT_ASSERT(condition, message) ((void)0)\n#  else\n#    define FMT_ASSERT(condition, message)                                    \\\n      ((condition) /* void() fails with -Winvalid-constexpr on clang 4.0.1 */ \\\n           ? (void)0                                                          \\\n           : ::fmt::internal::assert_fail(__FILE__, __LINE__, (message)))\n#  endif\n#endif\n\n#if defined(FMT_USE_STRING_VIEW)\ntemplate <typename Char> using std_string_view = std::basic_string_view<Char>;\n#elif defined(FMT_USE_EXPERIMENTAL_STRING_VIEW)\ntemplate <typename Char>\nusing std_string_view = std::experimental::basic_string_view<Char>;\n#else\ntemplate <typename T> struct std_string_view {};\n#endif\n\n#ifdef FMT_USE_INT128\n// Do nothing.\n#elif defined(__SIZEOF_INT128__) && !FMT_NVCC\n#  define FMT_USE_INT128 1\nusing int128_t = __int128_t;\nusing uint128_t = __uint128_t;\n#else\n#  define FMT_USE_INT128 0\n#endif\n#if !FMT_USE_INT128\nstruct int128_t {};\nstruct uint128_t {};\n#endif\n\n// Casts a nonnegative integer to unsigned.\ntemplate <typename Int>\nFMT_CONSTEXPR typename std::make_unsigned<Int>::type to_unsigned(Int value) {\n  FMT_ASSERT(value >= 0, \"negative value\");\n  return static_cast<typename std::make_unsigned<Int>::type>(value);\n}\n\nconstexpr unsigned char micro[] = \"\\u00B5\";\n\ntemplate <typename Char> constexpr bool is_unicode() {\n  return FMT_UNICODE || sizeof(Char) != 1 ||\n         (sizeof(micro) == 3 && micro[0] == 0xC2 && micro[1] == 0xB5);\n}\n\n#ifdef __cpp_char8_t\nusing char8_type = char8_t;\n#else\nenum char8_type : unsigned char {};\n#endif\n}  // namespace internal\n\ntemplate <typename... Ts>\nusing void_t = typename internal::void_t_impl<Ts...>::type;\n\n/**\n  An implementation of ``std::basic_string_view`` for pre-C++17. It provides a\n  subset of the API. ``fmt::basic_string_view`` is used for format strings even\n  if ``std::string_view`` is available to prevent issues when a library is\n  compiled with a different ``-std`` option than the client code (which is not\n  recommended).\n */\ntemplate <typename Char> class basic_string_view {\n private:\n  const Char* data_;\n  size_t size_;\n\n public:\n  using char_type FMT_DEPRECATED_ALIAS = Char;\n  using value_type = Char;\n  using iterator = const Char*;\n\n  FMT_CONSTEXPR basic_string_view() FMT_NOEXCEPT : data_(nullptr), size_(0) {}\n\n  /** Constructs a string reference object from a C string and a size. */\n  FMT_CONSTEXPR basic_string_view(const Char* s, size_t count) FMT_NOEXCEPT\n      : data_(s),\n        size_(count) {}\n\n  /**\n    \\rst\n    Constructs a string reference object from a C string computing\n    the size with ``std::char_traits<Char>::length``.\n    \\endrst\n   */\n#if __cplusplus >= 201703L  // C++17's char_traits::length() is constexpr.\n  FMT_CONSTEXPR\n#endif\n  basic_string_view(const Char* s)\n      : data_(s), size_(std::char_traits<Char>::length(s)) {}\n\n  /** Constructs a string reference from a ``std::basic_string`` object. */\n  template <typename Traits, typename Alloc>\n  FMT_CONSTEXPR basic_string_view(\n      const std::basic_string<Char, Traits, Alloc>& s) FMT_NOEXCEPT\n      : data_(s.data()),\n        size_(s.size()) {}\n\n  template <\n      typename S,\n      FMT_ENABLE_IF(std::is_same<S, internal::std_string_view<Char>>::value)>\n  FMT_CONSTEXPR basic_string_view(S s) FMT_NOEXCEPT : data_(s.data()),\n                                                      size_(s.size()) {}\n\n  /** Returns a pointer to the string data. */\n  FMT_CONSTEXPR const Char* data() const { return data_; }\n\n  /** Returns the string size. */\n  FMT_CONSTEXPR size_t size() const { return size_; }\n\n  FMT_CONSTEXPR iterator begin() const { return data_; }\n  FMT_CONSTEXPR iterator end() const { return data_ + size_; }\n\n  FMT_CONSTEXPR const Char& operator[](size_t pos) const { return data_[pos]; }\n\n  FMT_CONSTEXPR void remove_prefix(size_t n) {\n    data_ += n;\n    size_ -= n;\n  }\n\n  // Lexicographically compare this string reference to other.\n  int compare(basic_string_view other) const {\n    size_t str_size = size_ < other.size_ ? size_ : other.size_;\n    int result = std::char_traits<Char>::compare(data_, other.data_, str_size);\n    if (result == 0)\n      result = size_ == other.size_ ? 0 : (size_ < other.size_ ? -1 : 1);\n    return result;\n  }\n\n  friend bool operator==(basic_string_view lhs, basic_string_view rhs) {\n    return lhs.compare(rhs) == 0;\n  }\n  friend bool operator!=(basic_string_view lhs, basic_string_view rhs) {\n    return lhs.compare(rhs) != 0;\n  }\n  friend bool operator<(basic_string_view lhs, basic_string_view rhs) {\n    return lhs.compare(rhs) < 0;\n  }\n  friend bool operator<=(basic_string_view lhs, basic_string_view rhs) {\n    return lhs.compare(rhs) <= 0;\n  }\n  friend bool operator>(basic_string_view lhs, basic_string_view rhs) {\n    return lhs.compare(rhs) > 0;\n  }\n  friend bool operator>=(basic_string_view lhs, basic_string_view rhs) {\n    return lhs.compare(rhs) >= 0;\n  }\n};\n\nusing string_view = basic_string_view<char>;\nusing wstring_view = basic_string_view<wchar_t>;\n\n#ifndef __cpp_char8_t\n// char8_t is deprecated; use char instead.\nusing char8_t FMT_DEPRECATED_ALIAS = internal::char8_type;\n#endif\n\n/** Specifies if ``T`` is a character type. Can be specialized by users. */\ntemplate <typename T> struct is_char : std::false_type {};\ntemplate <> struct is_char<char> : std::true_type {};\ntemplate <> struct is_char<wchar_t> : std::true_type {};\ntemplate <> struct is_char<internal::char8_type> : std::true_type {};\ntemplate <> struct is_char<char16_t> : std::true_type {};\ntemplate <> struct is_char<char32_t> : std::true_type {};\n\n/**\n  \\rst\n  Returns a string view of `s`. In order to add custom string type support to\n  {fmt} provide an overload of `to_string_view` for it in the same namespace as\n  the type for the argument-dependent lookup to work.\n\n  **Example**::\n\n    namespace my_ns {\n    inline string_view to_string_view(const my_string& s) {\n      return {s.data(), s.length()};\n    }\n    }\n    std::string message = fmt::format(my_string(\"The answer is {}\"), 42);\n  \\endrst\n */\ntemplate <typename Char, FMT_ENABLE_IF(is_char<Char>::value)>\ninline basic_string_view<Char> to_string_view(const Char* s) {\n  return s;\n}\n\ntemplate <typename Char, typename Traits, typename Alloc>\ninline basic_string_view<Char> to_string_view(\n    const std::basic_string<Char, Traits, Alloc>& s) {\n  return s;\n}\n\ntemplate <typename Char>\ninline basic_string_view<Char> to_string_view(basic_string_view<Char> s) {\n  return s;\n}\n\ntemplate <typename Char,\n          FMT_ENABLE_IF(!std::is_empty<internal::std_string_view<Char>>::value)>\ninline basic_string_view<Char> to_string_view(\n    internal::std_string_view<Char> s) {\n  return s;\n}\n\n// A base class for compile-time strings. It is defined in the fmt namespace to\n// make formatting functions visible via ADL, e.g. format(fmt(\"{}\"), 42).\nstruct compile_string {};\n\ntemplate <typename S>\nstruct is_compile_string : std::is_base_of<compile_string, S> {};\n\ntemplate <typename S, FMT_ENABLE_IF(is_compile_string<S>::value)>\nconstexpr basic_string_view<typename S::char_type> to_string_view(const S& s) {\n  return s;\n}\n\nnamespace internal {\nvoid to_string_view(...);\nusing fmt::v6::to_string_view;\n\n// Specifies whether S is a string type convertible to fmt::basic_string_view.\n// It should be a constexpr function but MSVC 2017 fails to compile it in\n// enable_if and MSVC 2015 fails to compile it as an alias template.\ntemplate <typename S>\nstruct is_string : std::is_class<decltype(to_string_view(std::declval<S>()))> {\n};\n\ntemplate <typename S, typename = void> struct char_t_impl {};\ntemplate <typename S> struct char_t_impl<S, enable_if_t<is_string<S>::value>> {\n  using result = decltype(to_string_view(std::declval<S>()));\n  using type = typename result::value_type;\n};\n\nstruct error_handler {\n  FMT_CONSTEXPR error_handler() = default;\n  FMT_CONSTEXPR error_handler(const error_handler&) = default;\n\n  // This function is intentionally not constexpr to give a compile-time error.\n  FMT_NORETURN FMT_API void on_error(const char* message);\n};\n}  // namespace internal\n\n/** String's character type. */\ntemplate <typename S> using char_t = typename internal::char_t_impl<S>::type;\n\n/**\n  \\rst\n  Parsing context consisting of a format string range being parsed and an\n  argument counter for automatic indexing.\n\n  You can use one of the following type aliases for common character types:\n\n  +-----------------------+-------------------------------------+\n  | Type                  | Definition                          |\n  +=======================+=====================================+\n  | format_parse_context  | basic_format_parse_context<char>    |\n  +-----------------------+-------------------------------------+\n  | wformat_parse_context | basic_format_parse_context<wchar_t> |\n  +-----------------------+-------------------------------------+\n  \\endrst\n */\ntemplate <typename Char, typename ErrorHandler = internal::error_handler>\nclass basic_format_parse_context : private ErrorHandler {\n private:\n  basic_string_view<Char> format_str_;\n  int next_arg_id_;\n\n public:\n  using char_type = Char;\n  using iterator = typename basic_string_view<Char>::iterator;\n\n  explicit FMT_CONSTEXPR basic_format_parse_context(\n      basic_string_view<Char> format_str, ErrorHandler eh = ErrorHandler())\n      : ErrorHandler(eh), format_str_(format_str), next_arg_id_(0) {}\n\n  /**\n    Returns an iterator to the beginning of the format string range being\n    parsed.\n   */\n  FMT_CONSTEXPR iterator begin() const FMT_NOEXCEPT {\n    return format_str_.begin();\n  }\n\n  /**\n    Returns an iterator past the end of the format string range being parsed.\n   */\n  FMT_CONSTEXPR iterator end() const FMT_NOEXCEPT { return format_str_.end(); }\n\n  /** Advances the begin iterator to ``it``. */\n  FMT_CONSTEXPR void advance_to(iterator it) {\n    format_str_.remove_prefix(internal::to_unsigned(it - begin()));\n  }\n\n  /**\n    Reports an error if using the manual argument indexing; otherwise returns\n    the next argument index and switches to the automatic indexing.\n   */\n  FMT_CONSTEXPR int next_arg_id() {\n    if (next_arg_id_ >= 0) return next_arg_id_++;\n    on_error(\"cannot switch from manual to automatic argument indexing\");\n    return 0;\n  }\n\n  /**\n    Reports an error if using the automatic argument indexing; otherwise\n    switches to the manual indexing.\n   */\n  FMT_CONSTEXPR void check_arg_id(int) {\n    if (next_arg_id_ > 0)\n      on_error(\"cannot switch from automatic to manual argument indexing\");\n    else\n      next_arg_id_ = -1;\n  }\n\n  FMT_CONSTEXPR void check_arg_id(basic_string_view<Char>) {}\n\n  FMT_CONSTEXPR void on_error(const char* message) {\n    ErrorHandler::on_error(message);\n  }\n\n  FMT_CONSTEXPR ErrorHandler error_handler() const { return *this; }\n};\n\nusing format_parse_context = basic_format_parse_context<char>;\nusing wformat_parse_context = basic_format_parse_context<wchar_t>;\n\ntemplate <typename Char, typename ErrorHandler = internal::error_handler>\nusing basic_parse_context FMT_DEPRECATED_ALIAS =\n    basic_format_parse_context<Char, ErrorHandler>;\nusing parse_context FMT_DEPRECATED_ALIAS = basic_format_parse_context<char>;\nusing wparse_context FMT_DEPRECATED_ALIAS = basic_format_parse_context<wchar_t>;\n\ntemplate <typename Context> class basic_format_arg;\ntemplate <typename Context> class basic_format_args;\n\n// A formatter for objects of type T.\ntemplate <typename T, typename Char = char, typename Enable = void>\nstruct formatter {\n  // A deleted default constructor indicates a disabled formatter.\n  formatter() = delete;\n};\n\ntemplate <typename T, typename Char, typename Enable = void>\nstruct FMT_DEPRECATED convert_to_int\n    : bool_constant<!std::is_arithmetic<T>::value &&\n                    std::is_convertible<T, int>::value> {};\n\n// Specifies if T has an enabled formatter specialization. A type can be\n// formattable even if it doesn't have a formatter e.g. via a conversion.\ntemplate <typename T, typename Context>\nusing has_formatter =\n    std::is_constructible<typename Context::template formatter_type<T>>;\n\nnamespace internal {\n\n/** A contiguous memory buffer with an optional growing ability. */\ntemplate <typename T> class buffer {\n private:\n  T* ptr_;\n  std::size_t size_;\n  std::size_t capacity_;\n\n protected:\n  // Don't initialize ptr_ since it is not accessed to save a few cycles.\n  buffer(std::size_t sz) FMT_NOEXCEPT : size_(sz), capacity_(sz) {}\n\n  buffer(T* p = nullptr, std::size_t sz = 0, std::size_t cap = 0) FMT_NOEXCEPT\n      : ptr_(p),\n        size_(sz),\n        capacity_(cap) {}\n\n  /** Sets the buffer data and capacity. */\n  void set(T* buf_data, std::size_t buf_capacity) FMT_NOEXCEPT {\n    ptr_ = buf_data;\n    capacity_ = buf_capacity;\n  }\n\n  /** Increases the buffer capacity to hold at least *capacity* elements. */\n  virtual void grow(std::size_t capacity) = 0;\n\n public:\n  using value_type = T;\n  using const_reference = const T&;\n\n  buffer(const buffer&) = delete;\n  void operator=(const buffer&) = delete;\n  virtual ~buffer() = default;\n\n  T* begin() FMT_NOEXCEPT { return ptr_; }\n  T* end() FMT_NOEXCEPT { return ptr_ + size_; }\n\n  const T* begin() const FMT_NOEXCEPT { return ptr_; }\n  const T* end() const FMT_NOEXCEPT { return ptr_ + size_; }\n\n  /** Returns the size of this buffer. */\n  std::size_t size() const FMT_NOEXCEPT { return size_; }\n\n  /** Returns the capacity of this buffer. */\n  std::size_t capacity() const FMT_NOEXCEPT { return capacity_; }\n\n  /** Returns a pointer to the buffer data. */\n  T* data() FMT_NOEXCEPT { return ptr_; }\n\n  /** Returns a pointer to the buffer data. */\n  const T* data() const FMT_NOEXCEPT { return ptr_; }\n\n  /**\n    Resizes the buffer. If T is a POD type new elements may not be initialized.\n   */\n  void resize(std::size_t new_size) {\n    reserve(new_size);\n    size_ = new_size;\n  }\n\n  /** Clears this buffer. */\n  void clear() { size_ = 0; }\n\n  /** Reserves space to store at least *capacity* elements. */\n  void reserve(std::size_t new_capacity) {\n    if (new_capacity > capacity_) grow(new_capacity);\n  }\n\n  void push_back(const T& value) {\n    reserve(size_ + 1);\n    ptr_[size_++] = value;\n  }\n\n  /** Appends data to the end of the buffer. */\n  template <typename U> void append(const U* begin, const U* end);\n\n  template <typename I> T& operator[](I index) { return ptr_[index]; }\n  template <typename I> const T& operator[](I index) const {\n    return ptr_[index];\n  }\n};\n\n// A container-backed buffer.\ntemplate <typename Container>\nclass container_buffer : public buffer<typename Container::value_type> {\n private:\n  Container& container_;\n\n protected:\n  void grow(std::size_t capacity) FMT_OVERRIDE {\n    container_.resize(capacity);\n    this->set(&container_[0], capacity);\n  }\n\n public:\n  explicit container_buffer(Container& c)\n      : buffer<typename Container::value_type>(c.size()), container_(c) {}\n};\n\n// Extracts a reference to the container from back_insert_iterator.\ntemplate <typename Container>\ninline Container& get_container(std::back_insert_iterator<Container> it) {\n  using bi_iterator = std::back_insert_iterator<Container>;\n  struct accessor : bi_iterator {\n    accessor(bi_iterator iter) : bi_iterator(iter) {}\n    using bi_iterator::container;\n  };\n  return *accessor(it).container;\n}\n\ntemplate <typename T, typename Char = char, typename Enable = void>\nstruct fallback_formatter {\n  fallback_formatter() = delete;\n};\n\n// Specifies if T has an enabled fallback_formatter specialization.\ntemplate <typename T, typename Context>\nusing has_fallback_formatter =\n    std::is_constructible<fallback_formatter<T, typename Context::char_type>>;\n\ntemplate <typename Char> struct named_arg_base;\ntemplate <typename T, typename Char> struct named_arg;\n\nenum class type {\n  none_type,\n  named_arg_type,\n  // Integer types should go first,\n  int_type,\n  uint_type,\n  long_long_type,\n  ulong_long_type,\n  int128_type,\n  uint128_type,\n  bool_type,\n  char_type,\n  last_integer_type = char_type,\n  // followed by floating-point types.\n  float_type,\n  double_type,\n  long_double_type,\n  last_numeric_type = long_double_type,\n  cstring_type,\n  string_type,\n  pointer_type,\n  custom_type\n};\n\n// Maps core type T to the corresponding type enum constant.\ntemplate <typename T, typename Char>\nstruct type_constant : std::integral_constant<type, type::custom_type> {};\n\n#define FMT_TYPE_CONSTANT(Type, constant) \\\n  template <typename Char>                \\\n  struct type_constant<Type, Char>        \\\n      : std::integral_constant<type, type::constant> {}\n\nFMT_TYPE_CONSTANT(const named_arg_base<Char>&, named_arg_type);\nFMT_TYPE_CONSTANT(int, int_type);\nFMT_TYPE_CONSTANT(unsigned, uint_type);\nFMT_TYPE_CONSTANT(long long, long_long_type);\nFMT_TYPE_CONSTANT(unsigned long long, ulong_long_type);\nFMT_TYPE_CONSTANT(int128_t, int128_type);\nFMT_TYPE_CONSTANT(uint128_t, uint128_type);\nFMT_TYPE_CONSTANT(bool, bool_type);\nFMT_TYPE_CONSTANT(Char, char_type);\nFMT_TYPE_CONSTANT(float, float_type);\nFMT_TYPE_CONSTANT(double, double_type);\nFMT_TYPE_CONSTANT(long double, long_double_type);\nFMT_TYPE_CONSTANT(const Char*, cstring_type);\nFMT_TYPE_CONSTANT(basic_string_view<Char>, string_type);\nFMT_TYPE_CONSTANT(const void*, pointer_type);\n\nFMT_CONSTEXPR bool is_integral_type(type t) {\n  FMT_ASSERT(t != type::named_arg_type, \"invalid argument type\");\n  return t > type::none_type && t <= type::last_integer_type;\n}\n\nFMT_CONSTEXPR bool is_arithmetic_type(type t) {\n  FMT_ASSERT(t != type::named_arg_type, \"invalid argument type\");\n  return t > type::none_type && t <= type::last_numeric_type;\n}\n\ntemplate <typename Char> struct string_value {\n  const Char* data;\n  std::size_t size;\n};\n\ntemplate <typename Context> struct custom_value {\n  using parse_context = basic_format_parse_context<typename Context::char_type>;\n  const void* value;\n  void (*format)(const void* arg, parse_context& parse_ctx, Context& ctx);\n};\n\n// A formatting argument value.\ntemplate <typename Context> class value {\n public:\n  using char_type = typename Context::char_type;\n\n  union {\n    int int_value;\n    unsigned uint_value;\n    long long long_long_value;\n    unsigned long long ulong_long_value;\n    int128_t int128_value;\n    uint128_t uint128_value;\n    bool bool_value;\n    char_type char_value;\n    float float_value;\n    double double_value;\n    long double long_double_value;\n    const void* pointer;\n    string_value<char_type> string;\n    custom_value<Context> custom;\n    const named_arg_base<char_type>* named_arg;\n  };\n\n  FMT_CONSTEXPR value(int val = 0) : int_value(val) {}\n  FMT_CONSTEXPR value(unsigned val) : uint_value(val) {}\n  value(long long val) : long_long_value(val) {}\n  value(unsigned long long val) : ulong_long_value(val) {}\n  value(int128_t val) : int128_value(val) {}\n  value(uint128_t val) : uint128_value(val) {}\n  value(float val) : float_value(val) {}\n  value(double val) : double_value(val) {}\n  value(long double val) : long_double_value(val) {}\n  value(bool val) : bool_value(val) {}\n  value(char_type val) : char_value(val) {}\n  value(const char_type* val) { string.data = val; }\n  value(basic_string_view<char_type> val) {\n    string.data = val.data();\n    string.size = val.size();\n  }\n  value(const void* val) : pointer(val) {}\n\n  template <typename T> value(const T& val) {\n    custom.value = &val;\n    // Get the formatter type through the context to allow different contexts\n    // have different extension points, e.g. `formatter<T>` for `format` and\n    // `printf_formatter<T>` for `printf`.\n    custom.format = format_custom_arg<\n        T, conditional_t<has_formatter<T, Context>::value,\n                         typename Context::template formatter_type<T>,\n                         fallback_formatter<T, char_type>>>;\n  }\n\n  value(const named_arg_base<char_type>& val) { named_arg = &val; }\n\n private:\n  // Formats an argument of a custom type, such as a user-defined class.\n  template <typename T, typename Formatter>\n  static void format_custom_arg(\n      const void* arg, basic_format_parse_context<char_type>& parse_ctx,\n      Context& ctx) {\n    Formatter f;\n    parse_ctx.advance_to(f.parse(parse_ctx));\n    ctx.advance_to(f.format(*static_cast<const T*>(arg), ctx));\n  }\n};\n\ntemplate <typename Context, typename T>\nFMT_CONSTEXPR basic_format_arg<Context> make_arg(const T& value);\n\n// To minimize the number of types we need to deal with, long is translated\n// either to int or to long long depending on its size.\nenum { long_short = sizeof(long) == sizeof(int) };\nusing long_type = conditional_t<long_short, int, long long>;\nusing ulong_type = conditional_t<long_short, unsigned, unsigned long long>;\n\n// Maps formatting arguments to core types.\ntemplate <typename Context> struct arg_mapper {\n  using char_type = typename Context::char_type;\n\n  FMT_CONSTEXPR int map(signed char val) { return val; }\n  FMT_CONSTEXPR unsigned map(unsigned char val) { return val; }\n  FMT_CONSTEXPR int map(short val) { return val; }\n  FMT_CONSTEXPR unsigned map(unsigned short val) { return val; }\n  FMT_CONSTEXPR int map(int val) { return val; }\n  FMT_CONSTEXPR unsigned map(unsigned val) { return val; }\n  FMT_CONSTEXPR long_type map(long val) { return val; }\n  FMT_CONSTEXPR ulong_type map(unsigned long val) { return val; }\n  FMT_CONSTEXPR long long map(long long val) { return val; }\n  FMT_CONSTEXPR unsigned long long map(unsigned long long val) { return val; }\n  FMT_CONSTEXPR int128_t map(int128_t val) { return val; }\n  FMT_CONSTEXPR uint128_t map(uint128_t val) { return val; }\n  FMT_CONSTEXPR bool map(bool val) { return val; }\n\n  template <typename T, FMT_ENABLE_IF(is_char<T>::value)>\n  FMT_CONSTEXPR char_type map(T val) {\n    static_assert(\n        std::is_same<T, char>::value || std::is_same<T, char_type>::value,\n        \"mixing character types is disallowed\");\n    return val;\n  }\n\n  FMT_CONSTEXPR float map(float val) { return val; }\n  FMT_CONSTEXPR double map(double val) { return val; }\n  FMT_CONSTEXPR long double map(long double val) { return val; }\n\n  FMT_CONSTEXPR const char_type* map(char_type* val) { return val; }\n  FMT_CONSTEXPR const char_type* map(const char_type* val) { return val; }\n  template <typename T, FMT_ENABLE_IF(is_string<T>::value)>\n  FMT_CONSTEXPR basic_string_view<char_type> map(const T& val) {\n    static_assert(std::is_same<char_type, char_t<T>>::value,\n                  \"mixing character types is disallowed\");\n    return to_string_view(val);\n  }\n  template <typename T,\n            FMT_ENABLE_IF(\n                std::is_constructible<basic_string_view<char_type>, T>::value &&\n                !is_string<T>::value && !has_formatter<T, Context>::value &&\n                !has_fallback_formatter<T, Context>::value)>\n  FMT_CONSTEXPR basic_string_view<char_type> map(const T& val) {\n    return basic_string_view<char_type>(val);\n  }\n  template <\n      typename T,\n      FMT_ENABLE_IF(\n          std::is_constructible<std_string_view<char_type>, T>::value &&\n          !std::is_constructible<basic_string_view<char_type>, T>::value &&\n          !is_string<T>::value && !has_formatter<T, Context>::value &&\n          !has_fallback_formatter<T, Context>::value)>\n  FMT_CONSTEXPR basic_string_view<char_type> map(const T& val) {\n    return std_string_view<char_type>(val);\n  }\n  FMT_CONSTEXPR const char* map(const signed char* val) {\n    static_assert(std::is_same<char_type, char>::value, \"invalid string type\");\n    return reinterpret_cast<const char*>(val);\n  }\n  FMT_CONSTEXPR const char* map(const unsigned char* val) {\n    static_assert(std::is_same<char_type, char>::value, \"invalid string type\");\n    return reinterpret_cast<const char*>(val);\n  }\n\n  FMT_CONSTEXPR const void* map(void* val) { return val; }\n  FMT_CONSTEXPR const void* map(const void* val) { return val; }\n  FMT_CONSTEXPR const void* map(std::nullptr_t val) { return val; }\n  template <typename T> FMT_CONSTEXPR int map(const T*) {\n    // Formatting of arbitrary pointers is disallowed. If you want to output\n    // a pointer cast it to \"void *\" or \"const void *\". In particular, this\n    // forbids formatting of \"[const] volatile char *\" which is printed as bool\n    // by iostreams.\n    static_assert(!sizeof(T), \"formatting of non-void pointers is disallowed\");\n    return 0;\n  }\n\n  template <typename T,\n            FMT_ENABLE_IF(std::is_enum<T>::value &&\n                          !has_formatter<T, Context>::value &&\n                          !has_fallback_formatter<T, Context>::value)>\n  FMT_CONSTEXPR auto map(const T& val)\n      -> decltype(std::declval<arg_mapper>().map(\n          static_cast<typename std::underlying_type<T>::type>(val))) {\n    return map(static_cast<typename std::underlying_type<T>::type>(val));\n  }\n  template <typename T,\n            FMT_ENABLE_IF(!is_string<T>::value && !is_char<T>::value &&\n                          (has_formatter<T, Context>::value ||\n                           has_fallback_formatter<T, Context>::value))>\n  FMT_CONSTEXPR const T& map(const T& val) {\n    return val;\n  }\n\n  template <typename T>\n  FMT_CONSTEXPR const named_arg_base<char_type>& map(\n      const named_arg<T, char_type>& val) {\n    auto arg = make_arg<Context>(val.value);\n    std::memcpy(val.data, &arg, sizeof(arg));\n    return val;\n  }\n\n  int map(...) {\n    constexpr bool formattable = sizeof(Context) == 0;\n    static_assert(\n        formattable,\n        \"Cannot format argument. To make type T formattable provide a \"\n        \"formatter<T> specialization: \"\n        \"https://fmt.dev/latest/api.html#formatting-user-defined-types\");\n    return 0;\n  }\n};\n\n// A type constant after applying arg_mapper<Context>.\ntemplate <typename T, typename Context>\nusing mapped_type_constant =\n    type_constant<decltype(arg_mapper<Context>().map(std::declval<const T&>())),\n                  typename Context::char_type>;\n\nenum { packed_arg_bits = 5 };\n// Maximum number of arguments with packed types.\nenum { max_packed_args = 63 / packed_arg_bits };\nenum : unsigned long long { is_unpacked_bit = 1ULL << 63 };\n\ntemplate <typename Context> class arg_map;\n}  // namespace internal\n\n// A formatting argument. It is a trivially copyable/constructible type to\n// allow storage in basic_memory_buffer.\ntemplate <typename Context> class basic_format_arg {\n private:\n  internal::value<Context> value_;\n  internal::type type_;\n\n  template <typename ContextType, typename T>\n  friend FMT_CONSTEXPR basic_format_arg<ContextType> internal::make_arg(\n      const T& value);\n\n  template <typename Visitor, typename Ctx>\n  friend FMT_CONSTEXPR auto visit_format_arg(Visitor&& vis,\n                                             const basic_format_arg<Ctx>& arg)\n      -> decltype(vis(0));\n\n  friend class basic_format_args<Context>;\n  friend class internal::arg_map<Context>;\n\n  using char_type = typename Context::char_type;\n\n public:\n  class handle {\n   public:\n    explicit handle(internal::custom_value<Context> custom) : custom_(custom) {}\n\n    void format(basic_format_parse_context<char_type>& parse_ctx,\n                Context& ctx) const {\n      custom_.format(custom_.value, parse_ctx, ctx);\n    }\n\n   private:\n    internal::custom_value<Context> custom_;\n  };\n\n  FMT_CONSTEXPR basic_format_arg() : type_(internal::type::none_type) {}\n\n  FMT_CONSTEXPR explicit operator bool() const FMT_NOEXCEPT {\n    return type_ != internal::type::none_type;\n  }\n\n  internal::type type() const { return type_; }\n\n  bool is_integral() const { return internal::is_integral_type(type_); }\n  bool is_arithmetic() const { return internal::is_arithmetic_type(type_); }\n};\n\n/**\n  \\rst\n  Visits an argument dispatching to the appropriate visit method based on\n  the argument type. For example, if the argument type is ``double`` then\n  ``vis(value)`` will be called with the value of type ``double``.\n  \\endrst\n */\ntemplate <typename Visitor, typename Context>\nFMT_CONSTEXPR auto visit_format_arg(Visitor&& vis,\n                                    const basic_format_arg<Context>& arg)\n    -> decltype(vis(0)) {\n  using char_type = typename Context::char_type;\n  switch (arg.type_) {\n  case internal::type::none_type:\n    break;\n  case internal::type::named_arg_type:\n    FMT_ASSERT(false, \"invalid argument type\");\n    break;\n  case internal::type::int_type:\n    return vis(arg.value_.int_value);\n  case internal::type::uint_type:\n    return vis(arg.value_.uint_value);\n  case internal::type::long_long_type:\n    return vis(arg.value_.long_long_value);\n  case internal::type::ulong_long_type:\n    return vis(arg.value_.ulong_long_value);\n#if FMT_USE_INT128\n  case internal::type::int128_type:\n    return vis(arg.value_.int128_value);\n  case internal::type::uint128_type:\n    return vis(arg.value_.uint128_value);\n#else\n  case internal::type::int128_type:\n  case internal::type::uint128_type:\n    break;\n#endif\n  case internal::type::bool_type:\n    return vis(arg.value_.bool_value);\n  case internal::type::char_type:\n    return vis(arg.value_.char_value);\n  case internal::type::float_type:\n    return vis(arg.value_.float_value);\n  case internal::type::double_type:\n    return vis(arg.value_.double_value);\n  case internal::type::long_double_type:\n    return vis(arg.value_.long_double_value);\n  case internal::type::cstring_type:\n    return vis(arg.value_.string.data);\n  case internal::type::string_type:\n    return vis(basic_string_view<char_type>(arg.value_.string.data,\n                                            arg.value_.string.size));\n  case internal::type::pointer_type:\n    return vis(arg.value_.pointer);\n  case internal::type::custom_type:\n    return vis(typename basic_format_arg<Context>::handle(arg.value_.custom));\n  }\n  return vis(monostate());\n}\n\nnamespace internal {\n// A map from argument names to their values for named arguments.\ntemplate <typename Context> class arg_map {\n private:\n  using char_type = typename Context::char_type;\n\n  struct entry {\n    basic_string_view<char_type> name;\n    basic_format_arg<Context> arg;\n  };\n\n  entry* map_;\n  unsigned size_;\n\n  void push_back(value<Context> val) {\n    const auto& named = *val.named_arg;\n    map_[size_] = {named.name, named.template deserialize<Context>()};\n    ++size_;\n  }\n\n public:\n  arg_map(const arg_map&) = delete;\n  void operator=(const arg_map&) = delete;\n  arg_map() : map_(nullptr), size_(0) {}\n  void init(const basic_format_args<Context>& args);\n  ~arg_map() { delete[] map_; }\n\n  basic_format_arg<Context> find(basic_string_view<char_type> name) const {\n    // The list is unsorted, so just return the first matching name.\n    for (entry *it = map_, *end = map_ + size_; it != end; ++it) {\n      if (it->name == name) return it->arg;\n    }\n    return {};\n  }\n};\n\n// A type-erased reference to an std::locale to avoid heavy <locale> include.\nclass locale_ref {\n private:\n  const void* locale_;  // A type-erased pointer to std::locale.\n\n public:\n  locale_ref() : locale_(nullptr) {}\n  template <typename Locale> explicit locale_ref(const Locale& loc);\n\n  explicit operator bool() const FMT_NOEXCEPT { return locale_ != nullptr; }\n\n  template <typename Locale> Locale get() const;\n};\n\ntemplate <typename> constexpr unsigned long long encode_types() { return 0; }\n\ntemplate <typename Context, typename Arg, typename... Args>\nconstexpr unsigned long long encode_types() {\n  return static_cast<unsigned>(mapped_type_constant<Arg, Context>::value) |\n         (encode_types<Context, Args...>() << packed_arg_bits);\n}\n\ntemplate <typename Context, typename T>\nFMT_CONSTEXPR basic_format_arg<Context> make_arg(const T& value) {\n  basic_format_arg<Context> arg;\n  arg.type_ = mapped_type_constant<T, Context>::value;\n  arg.value_ = arg_mapper<Context>().map(value);\n  return arg;\n}\n\ntemplate <bool IS_PACKED, typename Context, typename T,\n          FMT_ENABLE_IF(IS_PACKED)>\ninline value<Context> make_arg(const T& val) {\n  return arg_mapper<Context>().map(val);\n}\n\ntemplate <bool IS_PACKED, typename Context, typename T,\n          FMT_ENABLE_IF(!IS_PACKED)>\ninline basic_format_arg<Context> make_arg(const T& value) {\n  return make_arg<Context>(value);\n}\n\ntemplate <typename T> struct is_reference_wrapper : std::false_type {};\n\ntemplate <typename T>\nstruct is_reference_wrapper<std::reference_wrapper<T>> : std::true_type {};\n\nclass dynamic_arg_list {\n  // Workaround for clang's -Wweak-vtables. Unlike for regular classes, for\n  // templates it doesn't complain about inability to deduce single translation\n  // unit for placing vtable. So storage_node_base is made a fake template.\n  template <typename = void> struct node {\n    virtual ~node() = default;\n    std::unique_ptr<node<>> next;\n  };\n\n  template <typename T> struct typed_node : node<> {\n    T value;\n\n    template <typename Arg>\n    FMT_CONSTEXPR typed_node(const Arg& arg) : value(arg) {}\n\n    template <typename Char>\n    FMT_CONSTEXPR typed_node(const basic_string_view<Char>& arg)\n        : value(arg.data(), arg.size()) {}\n  };\n\n  std::unique_ptr<node<>> head_;\n\n public:\n  template <typename T, typename Arg> const T& push(const Arg& arg) {\n    auto node = std::unique_ptr<typed_node<T>>(new typed_node<T>(arg));\n    auto& value = node->value;\n    node->next = std::move(head_);\n    head_ = std::move(node);\n    return value;\n  }\n};\n}  // namespace internal\n\n// Formatting context.\ntemplate <typename OutputIt, typename Char> class basic_format_context {\n public:\n  /** The character type for the output. */\n  using char_type = Char;\n\n private:\n  OutputIt out_;\n  basic_format_args<basic_format_context> args_;\n  internal::arg_map<basic_format_context> map_;\n  internal::locale_ref loc_;\n\n public:\n  using iterator = OutputIt;\n  using format_arg = basic_format_arg<basic_format_context>;\n  template <typename T> using formatter_type = formatter<T, char_type>;\n\n  basic_format_context(const basic_format_context&) = delete;\n  void operator=(const basic_format_context&) = delete;\n  /**\n   Constructs a ``basic_format_context`` object. References to the arguments are\n   stored in the object so make sure they have appropriate lifetimes.\n   */\n  basic_format_context(OutputIt out,\n                       basic_format_args<basic_format_context> ctx_args,\n                       internal::locale_ref loc = internal::locale_ref())\n      : out_(out), args_(ctx_args), loc_(loc) {}\n\n  format_arg arg(int id) const { return args_.get(id); }\n\n  // Checks if manual indexing is used and returns the argument with the\n  // specified name.\n  format_arg arg(basic_string_view<char_type> name);\n\n  internal::error_handler error_handler() { return {}; }\n  void on_error(const char* message) { error_handler().on_error(message); }\n\n  // Returns an iterator to the beginning of the output range.\n  iterator out() { return out_; }\n\n  // Advances the begin iterator to ``it``.\n  void advance_to(iterator it) { out_ = it; }\n\n  internal::locale_ref locale() { return loc_; }\n};\n\ntemplate <typename Char>\nusing buffer_context =\n    basic_format_context<std::back_insert_iterator<internal::buffer<Char>>,\n                         Char>;\nusing format_context = buffer_context<char>;\nusing wformat_context = buffer_context<wchar_t>;\n\n/**\n  \\rst\n  An array of references to arguments. It can be implicitly converted into\n  `~fmt::basic_format_args` for passing into type-erased formatting functions\n  such as `~fmt::vformat`.\n  \\endrst\n */\ntemplate <typename Context, typename... Args>\nclass format_arg_store\n#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409\n    // Workaround a GCC template argument substitution bug.\n    : public basic_format_args<Context>\n#endif\n{\n private:\n  static const size_t num_args = sizeof...(Args);\n  static const bool is_packed = num_args < internal::max_packed_args;\n\n  using value_type = conditional_t<is_packed, internal::value<Context>,\n                                   basic_format_arg<Context>>;\n\n  // If the arguments are not packed, add one more element to mark the end.\n  value_type data_[num_args + (num_args == 0 ? 1 : 0)];\n\n  friend class basic_format_args<Context>;\n\n public:\n  static constexpr unsigned long long types =\n      is_packed ? internal::encode_types<Context, Args...>()\n                : internal::is_unpacked_bit | num_args;\n\n  format_arg_store(const Args&... args)\n      :\n#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409\n        basic_format_args<Context>(*this),\n#endif\n        data_{internal::make_arg<is_packed, Context>(args)...} {\n  }\n};\n\n/**\n  \\rst\n  Constructs an `~fmt::format_arg_store` object that contains references to\n  arguments and can be implicitly converted to `~fmt::format_args`. `Context`\n  can be omitted in which case it defaults to `~fmt::context`.\n  See `~fmt::arg` for lifetime considerations.\n  \\endrst\n */\ntemplate <typename Context = format_context, typename... Args>\ninline format_arg_store<Context, Args...> make_format_args(\n    const Args&... args) {\n  return {args...};\n}\n\n/**\n  \\rst\n  A dynamic version of `fmt::format_arg_store<>`.\n  It's equipped with a storage to potentially temporary objects which lifetime\n  could be shorter than the format arguments object.\n\n  It can be implicitly converted into `~fmt::basic_format_args` for passing\n  into type-erased formatting functions such as `~fmt::vformat`.\n  \\endrst\n */\ntemplate <typename Context>\nclass dynamic_format_arg_store\n#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409\n    // Workaround a GCC template argument substitution bug.\n    : public basic_format_args<Context>\n#endif\n{\n private:\n  using char_type = typename Context::char_type;\n\n  template <typename T> struct need_copy {\n    static constexpr internal::type mapped_type =\n        internal::mapped_type_constant<T, Context>::value;\n\n    enum {\n      value = !(internal::is_reference_wrapper<T>::value ||\n                std::is_same<T, basic_string_view<char_type>>::value ||\n                std::is_same<T, internal::std_string_view<char_type>>::value ||\n                (mapped_type != internal::type::cstring_type &&\n                 mapped_type != internal::type::string_type &&\n                 mapped_type != internal::type::custom_type &&\n                 mapped_type != internal::type::named_arg_type))\n    };\n  };\n\n  template <typename T>\n  using stored_type = conditional_t<internal::is_string<T>::value,\n                                    std::basic_string<char_type>, T>;\n\n  // Storage of basic_format_arg must be contiguous.\n  std::vector<basic_format_arg<Context>> data_;\n\n  // Storage of arguments not fitting into basic_format_arg must grow\n  // without relocation because items in data_ refer to it.\n  internal::dynamic_arg_list dynamic_args_;\n\n  friend class basic_format_args<Context>;\n\n  unsigned long long get_types() const {\n    return internal::is_unpacked_bit | data_.size();\n  }\n\n  template <typename T> void emplace_arg(const T& arg) {\n    data_.emplace_back(internal::make_arg<Context>(arg));\n  }\n\n public:\n  /**\n    \\rst\n    Adds an argument into the dynamic store for later passing to a formating\n    function.\n\n    Note that custom types and string types (but not string views!) are copied\n    into the store with dynamic memory (in addition to resizing vector).\n\n    **Example**::\n\n      fmt::dynamic_format_arg_store<fmt::format_context> store;\n      store.push_back(42);\n      store.push_back(\"abc\");\n      store.push_back(1.5f);\n      std::string result = fmt::vformat(\"{} and {} and {}\", store);\n    \\endrst\n  */\n  template <typename T> void push_back(const T& arg) {\n    static_assert(\n        !std::is_base_of<internal::named_arg_base<char_type>, T>::value,\n        \"named arguments are not supported yet\");\n    if (internal::const_check(need_copy<T>::value))\n      emplace_arg(dynamic_args_.push<stored_type<T>>(arg));\n    else\n      emplace_arg(arg);\n  }\n\n  /**\n    Adds a reference to the argument into the dynamic store for later passing to\n    a formating function.\n  */\n  template <typename T> void push_back(std::reference_wrapper<T> arg) {\n    static_assert(\n        need_copy<T>::value,\n        \"objects of built-in types and string views are always copied\");\n    emplace_arg(arg.get());\n  }\n};\n\n/**\n  \\rst\n  A view of a collection of formatting arguments. To avoid lifetime issues it\n  should only be used as a parameter type in type-erased functions such as\n  ``vformat``::\n\n    void vlog(string_view format_str, format_args args);  // OK\n    format_args args = make_format_args(42);  // Error: dangling reference\n  \\endrst\n */\ntemplate <typename Context> class basic_format_args {\n public:\n  using size_type = int;\n  using format_arg = basic_format_arg<Context>;\n\n private:\n  // To reduce compiled code size per formatting function call, types of first\n  // max_packed_args arguments are passed in the types_ field.\n  unsigned long long types_;\n  union {\n    // If the number of arguments is less than max_packed_args, the argument\n    // values are stored in values_, otherwise they are stored in args_.\n    // This is done to reduce compiled code size as storing larger objects\n    // may require more code (at least on x86-64) even if the same amount of\n    // data is actually copied to stack. It saves ~10% on the bloat test.\n    const internal::value<Context>* values_;\n    const format_arg* args_;\n  };\n\n  bool is_packed() const { return (types_ & internal::is_unpacked_bit) == 0; }\n\n  internal::type type(int index) const {\n    int shift = index * internal::packed_arg_bits;\n    unsigned int mask = (1 << internal::packed_arg_bits) - 1;\n    return static_cast<internal::type>((types_ >> shift) & mask);\n  }\n\n  friend class internal::arg_map<Context>;\n\n  void set_data(const internal::value<Context>* values) { values_ = values; }\n  void set_data(const format_arg* args) { args_ = args; }\n\n  format_arg do_get(int index) const {\n    format_arg arg;\n    if (!is_packed()) {\n      auto num_args = max_size();\n      if (index < num_args) arg = args_[index];\n      return arg;\n    }\n    if (index > internal::max_packed_args) return arg;\n    arg.type_ = type(index);\n    if (arg.type_ == internal::type::none_type) return arg;\n    internal::value<Context>& val = arg.value_;\n    val = values_[index];\n    return arg;\n  }\n\n public:\n  basic_format_args() : types_(0) {}\n\n  /**\n   \\rst\n   Constructs a `basic_format_args` object from `~fmt::format_arg_store`.\n   \\endrst\n   */\n  template <typename... Args>\n  basic_format_args(const format_arg_store<Context, Args...>& store)\n      : types_(store.types) {\n    set_data(store.data_);\n  }\n\n  /**\n   \\rst\n   Constructs a `basic_format_args` object from\n   `~fmt::dynamic_format_arg_store`.\n   \\endrst\n   */\n  basic_format_args(const dynamic_format_arg_store<Context>& store)\n      : types_(store.get_types()) {\n    set_data(store.data_.data());\n  }\n\n  /**\n   \\rst\n   Constructs a `basic_format_args` object from a dynamic set of arguments.\n   \\endrst\n   */\n  basic_format_args(const format_arg* args, int count)\n      : types_(internal::is_unpacked_bit | internal::to_unsigned(count)) {\n    set_data(args);\n  }\n\n  /** Returns the argument at specified index. */\n  format_arg get(int index) const {\n    format_arg arg = do_get(index);\n    if (arg.type_ == internal::type::named_arg_type)\n      arg = arg.value_.named_arg->template deserialize<Context>();\n    return arg;\n  }\n\n  int max_size() const {\n    unsigned long long max_packed = internal::max_packed_args;\n    return static_cast<int>(is_packed() ? max_packed\n                                        : types_ & ~internal::is_unpacked_bit);\n  }\n};\n\n/** An alias to ``basic_format_args<context>``. */\n// It is a separate type rather than an alias to make symbols readable.\nstruct format_args : basic_format_args<format_context> {\n  template <typename... Args>\n  format_args(Args&&... args)\n      : basic_format_args<format_context>(static_cast<Args&&>(args)...) {}\n};\nstruct wformat_args : basic_format_args<wformat_context> {\n  template <typename... Args>\n  wformat_args(Args&&... args)\n      : basic_format_args<wformat_context>(static_cast<Args&&>(args)...) {}\n};\n\ntemplate <typename Container> struct is_contiguous : std::false_type {};\n\ntemplate <typename Char>\nstruct is_contiguous<std::basic_string<Char>> : std::true_type {};\n\ntemplate <typename Char>\nstruct is_contiguous<internal::buffer<Char>> : std::true_type {};\n\nnamespace internal {\n\ntemplate <typename OutputIt>\nstruct is_contiguous_back_insert_iterator : std::false_type {};\ntemplate <typename Container>\nstruct is_contiguous_back_insert_iterator<std::back_insert_iterator<Container>>\n    : is_contiguous<Container> {};\n\ntemplate <typename Char> struct named_arg_base {\n  basic_string_view<Char> name;\n\n  // Serialized value<context>.\n  mutable char data[sizeof(basic_format_arg<buffer_context<Char>>)];\n\n  named_arg_base(basic_string_view<Char> nm) : name(nm) {}\n\n  template <typename Context> basic_format_arg<Context> deserialize() const {\n    basic_format_arg<Context> arg;\n    std::memcpy(&arg, data, sizeof(basic_format_arg<Context>));\n    return arg;\n  }\n};\n\nstruct view {};\n\ntemplate <typename T, typename Char>\nstruct named_arg : view, named_arg_base<Char> {\n  const T& value;\n\n  named_arg(basic_string_view<Char> name, const T& val)\n      : named_arg_base<Char>(name), value(val) {}\n};\n\ntemplate <typename..., typename S, FMT_ENABLE_IF(!is_compile_string<S>::value)>\ninline void check_format_string(const S&) {\n#if defined(FMT_ENFORCE_COMPILE_STRING)\n  static_assert(is_compile_string<S>::value,\n                \"FMT_ENFORCE_COMPILE_STRING requires all format strings to \"\n                \"utilize FMT_STRING() or fmt().\");\n#endif\n}\ntemplate <typename..., typename S, FMT_ENABLE_IF(is_compile_string<S>::value)>\nvoid check_format_string(S);\n\ntemplate <bool...> struct bool_pack;\ntemplate <bool... Args>\nusing all_true =\n    std::is_same<bool_pack<Args..., true>, bool_pack<true, Args...>>;\n\ntemplate <typename... Args, typename S, typename Char = char_t<S>>\ninline format_arg_store<buffer_context<Char>, remove_reference_t<Args>...>\nmake_args_checked(const S& format_str,\n                  const remove_reference_t<Args>&... args) {\n  static_assert(\n      all_true<(!std::is_base_of<view, remove_reference_t<Args>>::value ||\n                !std::is_reference<Args>::value)...>::value,\n      \"passing views as lvalues is disallowed\");\n  check_format_string<Args...>(format_str);\n  return {args...};\n}\n\ntemplate <typename Char>\nstd::basic_string<Char> vformat(\n    basic_string_view<Char> format_str,\n    basic_format_args<buffer_context<type_identity_t<Char>>> args);\n\ntemplate <typename Char>\ntypename buffer_context<Char>::iterator vformat_to(\n    buffer<Char>& buf, basic_string_view<Char> format_str,\n    basic_format_args<buffer_context<type_identity_t<Char>>> args);\n\ntemplate <typename Char, typename Args,\n          FMT_ENABLE_IF(!std::is_same<Char, char>::value)>\ninline void vprint_mojibake(std::FILE*, basic_string_view<Char>, const Args&) {}\n\nFMT_API void vprint_mojibake(std::FILE*, string_view, format_args);\n#ifndef _WIN32\ninline void vprint_mojibake(std::FILE*, string_view, format_args) {}\n#endif\n}  // namespace internal\n\n/**\n  \\rst\n  Returns a named argument to be used in a formatting function. It should only\n  be used in a call to a formatting function.\n\n  **Example**::\n\n    fmt::print(\"Elapsed time: {s:.2f} seconds\", fmt::arg(\"s\", 1.23));\n  \\endrst\n */\ntemplate <typename S, typename T, typename Char = char_t<S>>\ninline internal::named_arg<T, Char> arg(const S& name, const T& arg) {\n  static_assert(internal::is_string<S>::value, \"\");\n  return {name, arg};\n}\n\n// Disable nested named arguments, e.g. ``arg(\"a\", arg(\"b\", 42))``.\ntemplate <typename S, typename T, typename Char>\nvoid arg(S, internal::named_arg<T, Char>) = delete;\n\n/** Formats a string and writes the output to ``out``. */\n// GCC 8 and earlier cannot handle std::back_insert_iterator<Container> with\n// vformat_to<ArgFormatter>(...) overload, so SFINAE on iterator type instead.\ntemplate <typename OutputIt, typename S, typename Char = char_t<S>,\n          FMT_ENABLE_IF(\n              internal::is_contiguous_back_insert_iterator<OutputIt>::value)>\nOutputIt vformat_to(\n    OutputIt out, const S& format_str,\n    basic_format_args<buffer_context<type_identity_t<Char>>> args) {\n  using container = remove_reference_t<decltype(internal::get_container(out))>;\n  internal::container_buffer<container> buf((internal::get_container(out)));\n  internal::vformat_to(buf, to_string_view(format_str), args);\n  return out;\n}\n\ntemplate <typename Container, typename S, typename... Args,\n          FMT_ENABLE_IF(\n              is_contiguous<Container>::value&& internal::is_string<S>::value)>\ninline std::back_insert_iterator<Container> format_to(\n    std::back_insert_iterator<Container> out, const S& format_str,\n    Args&&... args) {\n  return vformat_to(out, to_string_view(format_str),\n                    internal::make_args_checked<Args...>(format_str, args...));\n}\n\ntemplate <typename S, typename Char = char_t<S>>\ninline std::basic_string<Char> vformat(\n    const S& format_str,\n    basic_format_args<buffer_context<type_identity_t<Char>>> args) {\n  return internal::vformat(to_string_view(format_str), args);\n}\n\n/**\n  \\rst\n  Formats arguments and returns the result as a string.\n\n  **Example**::\n\n    #include <fmt/core.h>\n    std::string message = fmt::format(\"The answer is {}\", 42);\n  \\endrst\n*/\n// Pass char_t as a default template parameter instead of using\n// std::basic_string<char_t<S>> to reduce the symbol size.\ntemplate <typename S, typename... Args, typename Char = char_t<S>>\ninline std::basic_string<Char> format(const S& format_str, Args&&... args) {\n  return internal::vformat(\n      to_string_view(format_str),\n      internal::make_args_checked<Args...>(format_str, args...));\n}\n\nFMT_API void vprint(string_view, format_args);\nFMT_API void vprint(std::FILE*, string_view, format_args);\n\n/**\n  \\rst\n  Formats ``args`` according to specifications in ``format_str`` and writes the\n  output to the file ``f``. Strings are assumed to be Unicode-encoded unless the\n  ``FMT_UNICODE`` macro is set to 0.\n\n  **Example**::\n\n    fmt::print(stderr, \"Don't {}!\", \"panic\");\n  \\endrst\n */\ntemplate <typename S, typename... Args, typename Char = char_t<S>>\ninline void print(std::FILE* f, const S& format_str, Args&&... args) {\n  return internal::is_unicode<Char>()\n             ? vprint(f, to_string_view(format_str),\n                      internal::make_args_checked<Args...>(format_str, args...))\n             : internal::vprint_mojibake(\n                   f, to_string_view(format_str),\n                   internal::make_args_checked<Args...>(format_str, args...));\n}\n\n/**\n  \\rst\n  Formats ``args`` according to specifications in ``format_str`` and writes\n  the output to ``stdout``. Strings are assumed to be Unicode-encoded unless\n  the ``FMT_UNICODE`` macro is set to 0.\n\n  **Example**::\n\n    fmt::print(\"Elapsed time: {0:.2f} seconds\", 1.23);\n  \\endrst\n */\ntemplate <typename S, typename... Args, typename Char = char_t<S>>\ninline void print(const S& format_str, Args&&... args) {\n  return internal::is_unicode<Char>()\n             ? vprint(to_string_view(format_str),\n                      internal::make_args_checked<Args...>(format_str, args...))\n             : internal::vprint_mojibake(\n                   stdout, to_string_view(format_str),\n                   internal::make_args_checked<Args...>(format_str, args...));\n}\nFMT_END_NAMESPACE\n\n#endif  // FMT_CORE_H_\n"
  },
  {
    "path": "examples/lesson04/fig04_12/fmt/format-inl.h",
    "content": "// Formatting library for C++ - implementation\n//\n// Copyright (c) 2012 - 2016, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#ifndef FMT_FORMAT_INL_H_\n#define FMT_FORMAT_INL_H_\n\n#include <cassert>\n#include <cctype>\n#include <climits>\n#include <cmath>\n#include <cstdarg>\n#include <cstring>  // for std::memmove\n#include <cwchar>\n\n#include \"format.h\"\n#if !defined(FMT_STATIC_THOUSANDS_SEPARATOR)\n#  include <locale>\n#endif\n\n#ifdef _WIN32\n#  include <io.h>\n#  include <windows.h>\n#endif\n\n#ifdef _MSC_VER\n#  pragma warning(push)\n#  pragma warning(disable : 4702)  // unreachable code\n#endif\n\n// Dummy implementations of strerror_r and strerror_s called if corresponding\n// system functions are not available.\ninline fmt::internal::null<> strerror_r(int, char*, ...) { return {}; }\ninline fmt::internal::null<> strerror_s(char*, std::size_t, ...) { return {}; }\n\nFMT_BEGIN_NAMESPACE\nnamespace internal {\n\nFMT_FUNC void assert_fail(const char* file, int line, const char* message) {\n  print(stderr, \"{}:{}: assertion failed: {}\", file, line, message);\n  std::abort();\n}\n\n#ifndef _MSC_VER\n#  define FMT_SNPRINTF snprintf\n#else  // _MSC_VER\ninline int fmt_snprintf(char* buffer, size_t size, const char* format, ...) {\n  va_list args;\n  va_start(args, format);\n  int result = vsnprintf_s(buffer, size, _TRUNCATE, format, args);\n  va_end(args);\n  return result;\n}\n#  define FMT_SNPRINTF fmt_snprintf\n#endif  // _MSC_VER\n\n// A portable thread-safe version of strerror.\n// Sets buffer to point to a string describing the error code.\n// This can be either a pointer to a string stored in buffer,\n// or a pointer to some static immutable string.\n// Returns one of the following values:\n//   0      - success\n//   ERANGE - buffer is not large enough to store the error message\n//   other  - failure\n// Buffer should be at least of size 1.\nFMT_FUNC int safe_strerror(int error_code, char*& buffer,\n                           std::size_t buffer_size) FMT_NOEXCEPT {\n  FMT_ASSERT(buffer != nullptr && buffer_size != 0, \"invalid buffer\");\n\n  class dispatcher {\n   private:\n    int error_code_;\n    char*& buffer_;\n    std::size_t buffer_size_;\n\n    // A noop assignment operator to avoid bogus warnings.\n    void operator=(const dispatcher&) {}\n\n    // Handle the result of XSI-compliant version of strerror_r.\n    int handle(int result) {\n      // glibc versions before 2.13 return result in errno.\n      return result == -1 ? errno : result;\n    }\n\n    // Handle the result of GNU-specific version of strerror_r.\n    FMT_MAYBE_UNUSED\n    int handle(char* message) {\n      // If the buffer is full then the message is probably truncated.\n      if (message == buffer_ && strlen(buffer_) == buffer_size_ - 1)\n        return ERANGE;\n      buffer_ = message;\n      return 0;\n    }\n\n    // Handle the case when strerror_r is not available.\n    FMT_MAYBE_UNUSED\n    int handle(internal::null<>) {\n      return fallback(strerror_s(buffer_, buffer_size_, error_code_));\n    }\n\n    // Fallback to strerror_s when strerror_r is not available.\n    FMT_MAYBE_UNUSED\n    int fallback(int result) {\n      // If the buffer is full then the message is probably truncated.\n      return result == 0 && strlen(buffer_) == buffer_size_ - 1 ? ERANGE\n                                                                : result;\n    }\n\n#if !FMT_MSC_VER\n    // Fallback to strerror if strerror_r and strerror_s are not available.\n    int fallback(internal::null<>) {\n      errno = 0;\n      buffer_ = strerror(error_code_);\n      return errno;\n    }\n#endif\n\n   public:\n    dispatcher(int err_code, char*& buf, std::size_t buf_size)\n        : error_code_(err_code), buffer_(buf), buffer_size_(buf_size) {}\n\n    int run() { return handle(strerror_r(error_code_, buffer_, buffer_size_)); }\n  };\n  return dispatcher(error_code, buffer, buffer_size).run();\n}\n\nFMT_FUNC void format_error_code(internal::buffer<char>& out, int error_code,\n                                string_view message) FMT_NOEXCEPT {\n  // Report error code making sure that the output fits into\n  // inline_buffer_size to avoid dynamic memory allocation and potential\n  // bad_alloc.\n  out.resize(0);\n  static const char SEP[] = \": \";\n  static const char ERROR_STR[] = \"error \";\n  // Subtract 2 to account for terminating null characters in SEP and ERROR_STR.\n  std::size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2;\n  auto abs_value = static_cast<uint32_or_64_or_128_t<int>>(error_code);\n  if (internal::is_negative(error_code)) {\n    abs_value = 0 - abs_value;\n    ++error_code_size;\n  }\n  error_code_size += internal::to_unsigned(internal::count_digits(abs_value));\n  internal::writer w(out);\n  if (message.size() <= inline_buffer_size - error_code_size) {\n    w.write(message);\n    w.write(SEP);\n  }\n  w.write(ERROR_STR);\n  w.write(error_code);\n  assert(out.size() <= inline_buffer_size);\n}\n\nFMT_FUNC void report_error(format_func func, int error_code,\n                           string_view message) FMT_NOEXCEPT {\n  memory_buffer full_message;\n  func(full_message, error_code, message);\n  // Don't use fwrite_fully because the latter may throw.\n  (void)std::fwrite(full_message.data(), full_message.size(), 1, stderr);\n  std::fputc('\\n', stderr);\n}\n\n// A wrapper around fwrite that throws on error.\nFMT_FUNC void fwrite_fully(const void* ptr, size_t size, size_t count,\n                           FILE* stream) {\n  size_t written = std::fwrite(ptr, size, count, stream);\n  if (written < count) FMT_THROW(system_error(errno, \"cannot write to file\"));\n}\n}  // namespace internal\n\n#if !defined(FMT_STATIC_THOUSANDS_SEPARATOR)\nnamespace internal {\n\ntemplate <typename Locale>\nlocale_ref::locale_ref(const Locale& loc) : locale_(&loc) {\n  static_assert(std::is_same<Locale, std::locale>::value, \"\");\n}\n\ntemplate <typename Locale> Locale locale_ref::get() const {\n  static_assert(std::is_same<Locale, std::locale>::value, \"\");\n  return locale_ ? *static_cast<const std::locale*>(locale_) : std::locale();\n}\n\ntemplate <typename Char> FMT_FUNC std::string grouping_impl(locale_ref loc) {\n  return std::use_facet<std::numpunct<Char>>(loc.get<std::locale>()).grouping();\n}\ntemplate <typename Char> FMT_FUNC Char thousands_sep_impl(locale_ref loc) {\n  return std::use_facet<std::numpunct<Char>>(loc.get<std::locale>())\n      .thousands_sep();\n}\ntemplate <typename Char> FMT_FUNC Char decimal_point_impl(locale_ref loc) {\n  return std::use_facet<std::numpunct<Char>>(loc.get<std::locale>())\n      .decimal_point();\n}\n}  // namespace internal\n#else\ntemplate <typename Char>\nFMT_FUNC std::string internal::grouping_impl(locale_ref) {\n  return \"\\03\";\n}\ntemplate <typename Char>\nFMT_FUNC Char internal::thousands_sep_impl(locale_ref) {\n  return FMT_STATIC_THOUSANDS_SEPARATOR;\n}\ntemplate <typename Char>\nFMT_FUNC Char internal::decimal_point_impl(locale_ref) {\n  return '.';\n}\n#endif\n\nFMT_API FMT_FUNC format_error::~format_error() FMT_NOEXCEPT = default;\nFMT_API FMT_FUNC system_error::~system_error() FMT_NOEXCEPT = default;\n\nFMT_FUNC void system_error::init(int err_code, string_view format_str,\n                                 format_args args) {\n  error_code_ = err_code;\n  memory_buffer buffer;\n  format_system_error(buffer, err_code, vformat(format_str, args));\n  std::runtime_error& base = *this;\n  base = std::runtime_error(to_string(buffer));\n}\n\nnamespace internal {\n\ntemplate <> FMT_FUNC int count_digits<4>(internal::fallback_uintptr n) {\n  // fallback_uintptr is always stored in little endian.\n  int i = static_cast<int>(sizeof(void*)) - 1;\n  while (i > 0 && n.value[i] == 0) --i;\n  auto char_digits = std::numeric_limits<unsigned char>::digits / 4;\n  return i >= 0 ? i * char_digits + count_digits<4, unsigned>(n.value[i]) : 1;\n}\n\ntemplate <typename T>\nconst char basic_data<T>::digits[] =\n    \"0001020304050607080910111213141516171819\"\n    \"2021222324252627282930313233343536373839\"\n    \"4041424344454647484950515253545556575859\"\n    \"6061626364656667686970717273747576777879\"\n    \"8081828384858687888990919293949596979899\";\n\ntemplate <typename T>\nconst char basic_data<T>::hex_digits[] = \"0123456789abcdef\";\n\n#define FMT_POWERS_OF_10(factor)                                             \\\n  factor * 10, (factor)*100, (factor)*1000, (factor)*10000, (factor)*100000, \\\n      (factor)*1000000, (factor)*10000000, (factor)*100000000,               \\\n      (factor)*1000000000\n\ntemplate <typename T>\nconst uint64_t basic_data<T>::powers_of_10_64[] = {\n    1, FMT_POWERS_OF_10(1), FMT_POWERS_OF_10(1000000000ULL),\n    10000000000000000000ULL};\n\ntemplate <typename T>\nconst uint32_t basic_data<T>::zero_or_powers_of_10_32[] = {0,\n                                                           FMT_POWERS_OF_10(1)};\n\ntemplate <typename T>\nconst uint64_t basic_data<T>::zero_or_powers_of_10_64[] = {\n    0, FMT_POWERS_OF_10(1), FMT_POWERS_OF_10(1000000000ULL),\n    10000000000000000000ULL};\n\n// Normalized 64-bit significands of pow(10, k), for k = -348, -340, ..., 340.\n// These are generated by support/compute-powers.py.\ntemplate <typename T>\nconst uint64_t basic_data<T>::pow10_significands[] = {\n    0xfa8fd5a0081c0288, 0xbaaee17fa23ebf76, 0x8b16fb203055ac76,\n    0xcf42894a5dce35ea, 0x9a6bb0aa55653b2d, 0xe61acf033d1a45df,\n    0xab70fe17c79ac6ca, 0xff77b1fcbebcdc4f, 0xbe5691ef416bd60c,\n    0x8dd01fad907ffc3c, 0xd3515c2831559a83, 0x9d71ac8fada6c9b5,\n    0xea9c227723ee8bcb, 0xaecc49914078536d, 0x823c12795db6ce57,\n    0xc21094364dfb5637, 0x9096ea6f3848984f, 0xd77485cb25823ac7,\n    0xa086cfcd97bf97f4, 0xef340a98172aace5, 0xb23867fb2a35b28e,\n    0x84c8d4dfd2c63f3b, 0xc5dd44271ad3cdba, 0x936b9fcebb25c996,\n    0xdbac6c247d62a584, 0xa3ab66580d5fdaf6, 0xf3e2f893dec3f126,\n    0xb5b5ada8aaff80b8, 0x87625f056c7c4a8b, 0xc9bcff6034c13053,\n    0x964e858c91ba2655, 0xdff9772470297ebd, 0xa6dfbd9fb8e5b88f,\n    0xf8a95fcf88747d94, 0xb94470938fa89bcf, 0x8a08f0f8bf0f156b,\n    0xcdb02555653131b6, 0x993fe2c6d07b7fac, 0xe45c10c42a2b3b06,\n    0xaa242499697392d3, 0xfd87b5f28300ca0e, 0xbce5086492111aeb,\n    0x8cbccc096f5088cc, 0xd1b71758e219652c, 0x9c40000000000000,\n    0xe8d4a51000000000, 0xad78ebc5ac620000, 0x813f3978f8940984,\n    0xc097ce7bc90715b3, 0x8f7e32ce7bea5c70, 0xd5d238a4abe98068,\n    0x9f4f2726179a2245, 0xed63a231d4c4fb27, 0xb0de65388cc8ada8,\n    0x83c7088e1aab65db, 0xc45d1df942711d9a, 0x924d692ca61be758,\n    0xda01ee641a708dea, 0xa26da3999aef774a, 0xf209787bb47d6b85,\n    0xb454e4a179dd1877, 0x865b86925b9bc5c2, 0xc83553c5c8965d3d,\n    0x952ab45cfa97a0b3, 0xde469fbd99a05fe3, 0xa59bc234db398c25,\n    0xf6c69a72a3989f5c, 0xb7dcbf5354e9bece, 0x88fcf317f22241e2,\n    0xcc20ce9bd35c78a5, 0x98165af37b2153df, 0xe2a0b5dc971f303a,\n    0xa8d9d1535ce3b396, 0xfb9b7cd9a4a7443c, 0xbb764c4ca7a44410,\n    0x8bab8eefb6409c1a, 0xd01fef10a657842c, 0x9b10a4e5e9913129,\n    0xe7109bfba19c0c9d, 0xac2820d9623bf429, 0x80444b5e7aa7cf85,\n    0xbf21e44003acdd2d, 0x8e679c2f5e44ff8f, 0xd433179d9c8cb841,\n    0x9e19db92b4e31ba9, 0xeb96bf6ebadf77d9, 0xaf87023b9bf0ee6b,\n};\n\n// Binary exponents of pow(10, k), for k = -348, -340, ..., 340, corresponding\n// to significands above.\ntemplate <typename T>\nconst int16_t basic_data<T>::pow10_exponents[] = {\n    -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, -954,\n    -927,  -901,  -874,  -847,  -821,  -794,  -768,  -741,  -715,  -688, -661,\n    -635,  -608,  -582,  -555,  -529,  -502,  -475,  -449,  -422,  -396, -369,\n    -343,  -316,  -289,  -263,  -236,  -210,  -183,  -157,  -130,  -103, -77,\n    -50,   -24,   3,     30,    56,    83,    109,   136,   162,   189,  216,\n    242,   269,   295,   322,   348,   375,   402,   428,   455,   481,  508,\n    534,   561,   588,   614,   641,   667,   694,   720,   747,   774,  800,\n    827,   853,   880,   907,   933,   960,   986,   1013,  1039,  1066};\n\ntemplate <typename T>\nconst char basic_data<T>::foreground_color[] = \"\\x1b[38;2;\";\ntemplate <typename T>\nconst char basic_data<T>::background_color[] = \"\\x1b[48;2;\";\ntemplate <typename T> const char basic_data<T>::reset_color[] = \"\\x1b[0m\";\ntemplate <typename T> const wchar_t basic_data<T>::wreset_color[] = L\"\\x1b[0m\";\ntemplate <typename T> const char basic_data<T>::signs[] = {0, '-', '+', ' '};\n\ntemplate <typename T> struct bits {\n  static FMT_CONSTEXPR_DECL const int value =\n      static_cast<int>(sizeof(T) * std::numeric_limits<unsigned char>::digits);\n};\n\nclass fp;\ntemplate <int SHIFT = 0> fp normalize(fp value);\n\n// Lower (upper) boundary is a value half way between a floating-point value\n// and its predecessor (successor). Boundaries have the same exponent as the\n// value so only significands are stored.\nstruct boundaries {\n  uint64_t lower;\n  uint64_t upper;\n};\n\n// A handmade floating-point number f * pow(2, e).\nclass fp {\n private:\n  using significand_type = uint64_t;\n\n public:\n  significand_type f;\n  int e;\n\n  // All sizes are in bits.\n  // Subtract 1 to account for an implicit most significant bit in the\n  // normalized form.\n  static FMT_CONSTEXPR_DECL const int double_significand_size =\n      std::numeric_limits<double>::digits - 1;\n  static FMT_CONSTEXPR_DECL const uint64_t implicit_bit =\n      1ULL << double_significand_size;\n  static FMT_CONSTEXPR_DECL const int significand_size =\n      bits<significand_type>::value;\n\n  fp() : f(0), e(0) {}\n  fp(uint64_t f_val, int e_val) : f(f_val), e(e_val) {}\n\n  // Constructs fp from an IEEE754 double. It is a template to prevent compile\n  // errors on platforms where double is not IEEE754.\n  template <typename Double> explicit fp(Double d) { assign(d); }\n\n  // Assigns d to this and return true iff predecessor is closer than successor.\n  template <typename Double, FMT_ENABLE_IF(sizeof(Double) == sizeof(uint64_t))>\n  bool assign(Double d) {\n    // Assume double is in the format [sign][exponent][significand].\n    using limits = std::numeric_limits<Double>;\n    const int exponent_size =\n        bits<Double>::value - double_significand_size - 1;  // -1 for sign\n    const uint64_t significand_mask = implicit_bit - 1;\n    const uint64_t exponent_mask = (~0ULL >> 1) & ~significand_mask;\n    const int exponent_bias = (1 << exponent_size) - limits::max_exponent - 1;\n    auto u = bit_cast<uint64_t>(d);\n    f = u & significand_mask;\n    int biased_e =\n        static_cast<int>((u & exponent_mask) >> double_significand_size);\n    // Predecessor is closer if d is a normalized power of 2 (f == 0) other than\n    // the smallest normalized number (biased_e > 1).\n    bool is_predecessor_closer = f == 0 && biased_e > 1;\n    if (biased_e != 0)\n      f += implicit_bit;\n    else\n      biased_e = 1;  // Subnormals use biased exponent 1 (min exponent).\n    e = biased_e - exponent_bias - double_significand_size;\n    return is_predecessor_closer;\n  }\n\n  template <typename Double, FMT_ENABLE_IF(sizeof(Double) != sizeof(uint64_t))>\n  bool assign(Double) {\n    *this = fp();\n    return false;\n  }\n\n  // Assigns d to this together with computing lower and upper boundaries,\n  // where a boundary is a value half way between the number and its predecessor\n  // (lower) or successor (upper). The upper boundary is normalized and lower\n  // has the same exponent but may be not normalized.\n  template <typename Double> boundaries assign_with_boundaries(Double d) {\n    bool is_lower_closer = assign(d);\n    fp lower =\n        is_lower_closer ? fp((f << 2) - 1, e - 2) : fp((f << 1) - 1, e - 1);\n    // 1 in normalize accounts for the exponent shift above.\n    fp upper = normalize<1>(fp((f << 1) + 1, e - 1));\n    lower.f <<= lower.e - upper.e;\n    return boundaries{lower.f, upper.f};\n  }\n\n  template <typename Double> boundaries assign_float_with_boundaries(Double d) {\n    assign(d);\n    constexpr int min_normal_e = std::numeric_limits<float>::min_exponent -\n                                 std::numeric_limits<double>::digits;\n    significand_type half_ulp = 1 << (std::numeric_limits<double>::digits -\n                                      std::numeric_limits<float>::digits - 1);\n    if (min_normal_e > e) half_ulp <<= min_normal_e - e;\n    fp upper = normalize<0>(fp(f + half_ulp, e));\n    fp lower = fp(\n        f - (half_ulp >> ((f == implicit_bit && e > min_normal_e) ? 1 : 0)), e);\n    lower.f <<= lower.e - upper.e;\n    return boundaries{lower.f, upper.f};\n  }\n};\n\n// Normalizes the value converted from double and multiplied by (1 << SHIFT).\ntemplate <int SHIFT> fp normalize(fp value) {\n  // Handle subnormals.\n  const auto shifted_implicit_bit = fp::implicit_bit << SHIFT;\n  while ((value.f & shifted_implicit_bit) == 0) {\n    value.f <<= 1;\n    --value.e;\n  }\n  // Subtract 1 to account for hidden bit.\n  const auto offset =\n      fp::significand_size - fp::double_significand_size - SHIFT - 1;\n  value.f <<= offset;\n  value.e -= offset;\n  return value;\n}\n\ninline bool operator==(fp x, fp y) { return x.f == y.f && x.e == y.e; }\n\n// Computes lhs * rhs / pow(2, 64) rounded to nearest with half-up tie breaking.\ninline uint64_t multiply(uint64_t lhs, uint64_t rhs) {\n#if FMT_USE_INT128\n  auto product = static_cast<__uint128_t>(lhs) * rhs;\n  auto f = static_cast<uint64_t>(product >> 64);\n  return (static_cast<uint64_t>(product) & (1ULL << 63)) != 0 ? f + 1 : f;\n#else\n  // Multiply 32-bit parts of significands.\n  uint64_t mask = (1ULL << 32) - 1;\n  uint64_t a = lhs >> 32, b = lhs & mask;\n  uint64_t c = rhs >> 32, d = rhs & mask;\n  uint64_t ac = a * c, bc = b * c, ad = a * d, bd = b * d;\n  // Compute mid 64-bit of result and round.\n  uint64_t mid = (bd >> 32) + (ad & mask) + (bc & mask) + (1U << 31);\n  return ac + (ad >> 32) + (bc >> 32) + (mid >> 32);\n#endif\n}\n\ninline fp operator*(fp x, fp y) { return {multiply(x.f, y.f), x.e + y.e + 64}; }\n\n// Returns a cached power of 10 `c_k = c_k.f * pow(2, c_k.e)` such that its\n// (binary) exponent satisfies `min_exponent <= c_k.e <= min_exponent + 28`.\ninline fp get_cached_power(int min_exponent, int& pow10_exponent) {\n  const int64_t one_over_log2_10 = 0x4d104d42;  // round(pow(2, 32) / log2(10))\n  int index = static_cast<int>(\n      ((min_exponent + fp::significand_size - 1) * one_over_log2_10 +\n       ((int64_t(1) << 32) - 1))  // ceil\n      >> 32                       // arithmetic shift\n  );\n  // Decimal exponent of the first (smallest) cached power of 10.\n  const int first_dec_exp = -348;\n  // Difference between 2 consecutive decimal exponents in cached powers of 10.\n  const int dec_exp_step = 8;\n  index = (index - first_dec_exp - 1) / dec_exp_step + 1;\n  pow10_exponent = first_dec_exp + index * dec_exp_step;\n  return {data::pow10_significands[index], data::pow10_exponents[index]};\n}\n\n// A simple accumulator to hold the sums of terms in bigint::square if uint128_t\n// is not available.\nstruct accumulator {\n  uint64_t lower;\n  uint64_t upper;\n\n  accumulator() : lower(0), upper(0) {}\n  explicit operator uint32_t() const { return static_cast<uint32_t>(lower); }\n\n  void operator+=(uint64_t n) {\n    lower += n;\n    if (lower < n) ++upper;\n  }\n  void operator>>=(int shift) {\n    assert(shift == 32);\n    (void)shift;\n    lower = (upper << 32) | (lower >> 32);\n    upper >>= 32;\n  }\n};\n\nclass bigint {\n private:\n  // A bigint is stored as an array of bigits (big digits), with bigit at index\n  // 0 being the least significant one.\n  using bigit = uint32_t;\n  using double_bigit = uint64_t;\n  enum { bigits_capacity = 32 };\n  basic_memory_buffer<bigit, bigits_capacity> bigits_;\n  int exp_;\n\n  bigit operator[](int index) const { return bigits_[to_unsigned(index)]; }\n  bigit& operator[](int index) { return bigits_[to_unsigned(index)]; }\n\n  static FMT_CONSTEXPR_DECL const int bigit_bits = bits<bigit>::value;\n\n  friend struct formatter<bigint>;\n\n  void subtract_bigits(int index, bigit other, bigit& borrow) {\n    auto result = static_cast<double_bigit>((*this)[index]) - other - borrow;\n    (*this)[index] = static_cast<bigit>(result);\n    borrow = static_cast<bigit>(result >> (bigit_bits * 2 - 1));\n  }\n\n  void remove_leading_zeros() {\n    int num_bigits = static_cast<int>(bigits_.size()) - 1;\n    while (num_bigits > 0 && (*this)[num_bigits] == 0) --num_bigits;\n    bigits_.resize(to_unsigned(num_bigits + 1));\n  }\n\n  // Computes *this -= other assuming aligned bigints and *this >= other.\n  void subtract_aligned(const bigint& other) {\n    FMT_ASSERT(other.exp_ >= exp_, \"unaligned bigints\");\n    FMT_ASSERT(compare(*this, other) >= 0, \"\");\n    bigit borrow = 0;\n    int i = other.exp_ - exp_;\n    for (size_t j = 0, n = other.bigits_.size(); j != n; ++i, ++j) {\n      subtract_bigits(i, other.bigits_[j], borrow);\n    }\n    while (borrow > 0) subtract_bigits(i, 0, borrow);\n    remove_leading_zeros();\n  }\n\n  void multiply(uint32_t value) {\n    const double_bigit wide_value = value;\n    bigit carry = 0;\n    for (size_t i = 0, n = bigits_.size(); i < n; ++i) {\n      double_bigit result = bigits_[i] * wide_value + carry;\n      bigits_[i] = static_cast<bigit>(result);\n      carry = static_cast<bigit>(result >> bigit_bits);\n    }\n    if (carry != 0) bigits_.push_back(carry);\n  }\n\n  void multiply(uint64_t value) {\n    const bigit mask = ~bigit(0);\n    const double_bigit lower = value & mask;\n    const double_bigit upper = value >> bigit_bits;\n    double_bigit carry = 0;\n    for (size_t i = 0, n = bigits_.size(); i < n; ++i) {\n      double_bigit result = bigits_[i] * lower + (carry & mask);\n      carry =\n          bigits_[i] * upper + (result >> bigit_bits) + (carry >> bigit_bits);\n      bigits_[i] = static_cast<bigit>(result);\n    }\n    while (carry != 0) {\n      bigits_.push_back(carry & mask);\n      carry >>= bigit_bits;\n    }\n  }\n\n public:\n  bigint() : exp_(0) {}\n  explicit bigint(uint64_t n) { assign(n); }\n  ~bigint() { assert(bigits_.capacity() <= bigits_capacity); }\n\n  bigint(const bigint&) = delete;\n  void operator=(const bigint&) = delete;\n\n  void assign(const bigint& other) {\n    bigits_.resize(other.bigits_.size());\n    auto data = other.bigits_.data();\n    std::copy(data, data + other.bigits_.size(), bigits_.data());\n    exp_ = other.exp_;\n  }\n\n  void assign(uint64_t n) {\n    size_t num_bigits = 0;\n    do {\n      bigits_[num_bigits++] = n & ~bigit(0);\n      n >>= bigit_bits;\n    } while (n != 0);\n    bigits_.resize(num_bigits);\n    exp_ = 0;\n  }\n\n  int num_bigits() const { return static_cast<int>(bigits_.size()) + exp_; }\n\n  bigint& operator<<=(int shift) {\n    assert(shift >= 0);\n    exp_ += shift / bigit_bits;\n    shift %= bigit_bits;\n    if (shift == 0) return *this;\n    bigit carry = 0;\n    for (size_t i = 0, n = bigits_.size(); i < n; ++i) {\n      bigit c = bigits_[i] >> (bigit_bits - shift);\n      bigits_[i] = (bigits_[i] << shift) + carry;\n      carry = c;\n    }\n    if (carry != 0) bigits_.push_back(carry);\n    return *this;\n  }\n\n  template <typename Int> bigint& operator*=(Int value) {\n    FMT_ASSERT(value > 0, \"\");\n    multiply(uint32_or_64_or_128_t<Int>(value));\n    return *this;\n  }\n\n  friend int compare(const bigint& lhs, const bigint& rhs) {\n    int num_lhs_bigits = lhs.num_bigits(), num_rhs_bigits = rhs.num_bigits();\n    if (num_lhs_bigits != num_rhs_bigits)\n      return num_lhs_bigits > num_rhs_bigits ? 1 : -1;\n    int i = static_cast<int>(lhs.bigits_.size()) - 1;\n    int j = static_cast<int>(rhs.bigits_.size()) - 1;\n    int end = i - j;\n    if (end < 0) end = 0;\n    for (; i >= end; --i, --j) {\n      bigit lhs_bigit = lhs[i], rhs_bigit = rhs[j];\n      if (lhs_bigit != rhs_bigit) return lhs_bigit > rhs_bigit ? 1 : -1;\n    }\n    if (i != j) return i > j ? 1 : -1;\n    return 0;\n  }\n\n  // Returns compare(lhs1 + lhs2, rhs).\n  friend int add_compare(const bigint& lhs1, const bigint& lhs2,\n                         const bigint& rhs) {\n    int max_lhs_bigits = (std::max)(lhs1.num_bigits(), lhs2.num_bigits());\n    int num_rhs_bigits = rhs.num_bigits();\n    if (max_lhs_bigits + 1 < num_rhs_bigits) return -1;\n    if (max_lhs_bigits > num_rhs_bigits) return 1;\n    auto get_bigit = [](const bigint& n, int i) -> bigit {\n      return i >= n.exp_ && i < n.num_bigits() ? n[i - n.exp_] : 0;\n    };\n    double_bigit borrow = 0;\n    int min_exp = (std::min)((std::min)(lhs1.exp_, lhs2.exp_), rhs.exp_);\n    for (int i = num_rhs_bigits - 1; i >= min_exp; --i) {\n      double_bigit sum =\n          static_cast<double_bigit>(get_bigit(lhs1, i)) + get_bigit(lhs2, i);\n      bigit rhs_bigit = get_bigit(rhs, i);\n      if (sum > rhs_bigit + borrow) return 1;\n      borrow = rhs_bigit + borrow - sum;\n      if (borrow > 1) return -1;\n      borrow <<= bigit_bits;\n    }\n    return borrow != 0 ? -1 : 0;\n  }\n\n  // Assigns pow(10, exp) to this bigint.\n  void assign_pow10(int exp) {\n    assert(exp >= 0);\n    if (exp == 0) return assign(1);\n    // Find the top bit.\n    int bitmask = 1;\n    while (exp >= bitmask) bitmask <<= 1;\n    bitmask >>= 1;\n    // pow(10, exp) = pow(5, exp) * pow(2, exp). First compute pow(5, exp) by\n    // repeated squaring and multiplication.\n    assign(5);\n    bitmask >>= 1;\n    while (bitmask != 0) {\n      square();\n      if ((exp & bitmask) != 0) *this *= 5;\n      bitmask >>= 1;\n    }\n    *this <<= exp;  // Multiply by pow(2, exp) by shifting.\n  }\n\n  void square() {\n    basic_memory_buffer<bigit, bigits_capacity> n(std::move(bigits_));\n    int num_bigits = static_cast<int>(bigits_.size());\n    int num_result_bigits = 2 * num_bigits;\n    bigits_.resize(to_unsigned(num_result_bigits));\n    using accumulator_t = conditional_t<FMT_USE_INT128, uint128_t, accumulator>;\n    auto sum = accumulator_t();\n    for (int bigit_index = 0; bigit_index < num_bigits; ++bigit_index) {\n      // Compute bigit at position bigit_index of the result by adding\n      // cross-product terms n[i] * n[j] such that i + j == bigit_index.\n      for (int i = 0, j = bigit_index; j >= 0; ++i, --j) {\n        // Most terms are multiplied twice which can be optimized in the future.\n        sum += static_cast<double_bigit>(n[i]) * n[j];\n      }\n      (*this)[bigit_index] = static_cast<bigit>(sum);\n      sum >>= bits<bigit>::value;  // Compute the carry.\n    }\n    // Do the same for the top half.\n    for (int bigit_index = num_bigits; bigit_index < num_result_bigits;\n         ++bigit_index) {\n      for (int j = num_bigits - 1, i = bigit_index - j; i < num_bigits;)\n        sum += static_cast<double_bigit>(n[i++]) * n[j--];\n      (*this)[bigit_index] = static_cast<bigit>(sum);\n      sum >>= bits<bigit>::value;\n    }\n    --num_result_bigits;\n    remove_leading_zeros();\n    exp_ *= 2;\n  }\n\n  // Divides this bignum by divisor, assigning the remainder to this and\n  // returning the quotient.\n  int divmod_assign(const bigint& divisor) {\n    FMT_ASSERT(this != &divisor, \"\");\n    if (compare(*this, divisor) < 0) return 0;\n    int num_bigits = static_cast<int>(bigits_.size());\n    FMT_ASSERT(divisor.bigits_[divisor.bigits_.size() - 1u] != 0, \"\");\n    int exp_difference = exp_ - divisor.exp_;\n    if (exp_difference > 0) {\n      // Align bigints by adding trailing zeros to simplify subtraction.\n      bigits_.resize(to_unsigned(num_bigits + exp_difference));\n      for (int i = num_bigits - 1, j = i + exp_difference; i >= 0; --i, --j)\n        bigits_[j] = bigits_[i];\n      std::uninitialized_fill_n(bigits_.data(), exp_difference, 0);\n      exp_ -= exp_difference;\n    }\n    int quotient = 0;\n    do {\n      subtract_aligned(divisor);\n      ++quotient;\n    } while (compare(*this, divisor) >= 0);\n    return quotient;\n  }\n};\n\nenum class round_direction { unknown, up, down };\n\n// Given the divisor (normally a power of 10), the remainder = v % divisor for\n// some number v and the error, returns whether v should be rounded up, down, or\n// whether the rounding direction can't be determined due to error.\n// error should be less than divisor / 2.\ninline round_direction get_round_direction(uint64_t divisor, uint64_t remainder,\n                                           uint64_t error) {\n  FMT_ASSERT(remainder < divisor, \"\");  // divisor - remainder won't overflow.\n  FMT_ASSERT(error < divisor, \"\");      // divisor - error won't overflow.\n  FMT_ASSERT(error < divisor - error, \"\");  // error * 2 won't overflow.\n  // Round down if (remainder + error) * 2 <= divisor.\n  if (remainder <= divisor - remainder && error * 2 <= divisor - remainder * 2)\n    return round_direction::down;\n  // Round up if (remainder - error) * 2 >= divisor.\n  if (remainder >= error &&\n      remainder - error >= divisor - (remainder - error)) {\n    return round_direction::up;\n  }\n  return round_direction::unknown;\n}\n\nnamespace digits {\nenum result {\n  more,  // Generate more digits.\n  done,  // Done generating digits.\n  error  // Digit generation cancelled due to an error.\n};\n}\n\n// A version of count_digits optimized for grisu_gen_digits.\ninline int grisu_count_digits(uint32_t n) {\n  if (n < 10) return 1;\n  if (n < 100) return 2;\n  if (n < 1000) return 3;\n  if (n < 10000) return 4;\n  if (n < 100000) return 5;\n  if (n < 1000000) return 6;\n  if (n < 10000000) return 7;\n  if (n < 100000000) return 8;\n  if (n < 1000000000) return 9;\n  return 10;\n}\n\n// Generates output using the Grisu digit-gen algorithm.\n// error: the size of the region (lower, upper) outside of which numbers\n// definitely do not round to value (Delta in Grisu3).\ntemplate <typename Handler>\nFMT_ALWAYS_INLINE digits::result grisu_gen_digits(fp value, uint64_t error,\n                                                  int& exp, Handler& handler) {\n  const fp one(1ULL << -value.e, value.e);\n  // The integral part of scaled value (p1 in Grisu) = value / one. It cannot be\n  // zero because it contains a product of two 64-bit numbers with MSB set (due\n  // to normalization) - 1, shifted right by at most 60 bits.\n  auto integral = static_cast<uint32_t>(value.f >> -one.e);\n  FMT_ASSERT(integral != 0, \"\");\n  FMT_ASSERT(integral == value.f >> -one.e, \"\");\n  // The fractional part of scaled value (p2 in Grisu) c = value % one.\n  uint64_t fractional = value.f & (one.f - 1);\n  exp = grisu_count_digits(integral);  // kappa in Grisu.\n  // Divide by 10 to prevent overflow.\n  auto result = handler.on_start(data::powers_of_10_64[exp - 1] << -one.e,\n                                 value.f / 10, error * 10, exp);\n  if (result != digits::more) return result;\n  // Generate digits for the integral part. This can produce up to 10 digits.\n  do {\n    uint32_t digit = 0;\n    auto divmod_integral = [&](uint32_t divisor) {\n      digit = integral / divisor;\n      integral %= divisor;\n    };\n    // This optimization by Milo Yip reduces the number of integer divisions by\n    // one per iteration.\n    switch (exp) {\n    case 10:\n      divmod_integral(1000000000);\n      break;\n    case 9:\n      divmod_integral(100000000);\n      break;\n    case 8:\n      divmod_integral(10000000);\n      break;\n    case 7:\n      divmod_integral(1000000);\n      break;\n    case 6:\n      divmod_integral(100000);\n      break;\n    case 5:\n      divmod_integral(10000);\n      break;\n    case 4:\n      divmod_integral(1000);\n      break;\n    case 3:\n      divmod_integral(100);\n      break;\n    case 2:\n      divmod_integral(10);\n      break;\n    case 1:\n      digit = integral;\n      integral = 0;\n      break;\n    default:\n      FMT_ASSERT(false, \"invalid number of digits\");\n    }\n    --exp;\n    uint64_t remainder =\n        (static_cast<uint64_t>(integral) << -one.e) + fractional;\n    result = handler.on_digit(static_cast<char>('0' + digit),\n                              data::powers_of_10_64[exp] << -one.e, remainder,\n                              error, exp, true);\n    if (result != digits::more) return result;\n  } while (exp > 0);\n  // Generate digits for the fractional part.\n  for (;;) {\n    fractional *= 10;\n    error *= 10;\n    char digit =\n        static_cast<char>('0' + static_cast<char>(fractional >> -one.e));\n    fractional &= one.f - 1;\n    --exp;\n    result = handler.on_digit(digit, one.f, fractional, error, exp, false);\n    if (result != digits::more) return result;\n  }\n}\n\n// The fixed precision digit handler.\nstruct fixed_handler {\n  char* buf;\n  int size;\n  int precision;\n  int exp10;\n  bool fixed;\n\n  digits::result on_start(uint64_t divisor, uint64_t remainder, uint64_t error,\n                          int& exp) {\n    // Non-fixed formats require at least one digit and no precision adjustment.\n    if (!fixed) return digits::more;\n    // Adjust fixed precision by exponent because it is relative to decimal\n    // point.\n    precision += exp + exp10;\n    // Check if precision is satisfied just by leading zeros, e.g.\n    // format(\"{:.2f}\", 0.001) gives \"0.00\" without generating any digits.\n    if (precision > 0) return digits::more;\n    if (precision < 0) return digits::done;\n    auto dir = get_round_direction(divisor, remainder, error);\n    if (dir == round_direction::unknown) return digits::error;\n    buf[size++] = dir == round_direction::up ? '1' : '0';\n    return digits::done;\n  }\n\n  digits::result on_digit(char digit, uint64_t divisor, uint64_t remainder,\n                          uint64_t error, int, bool integral) {\n    FMT_ASSERT(remainder < divisor, \"\");\n    buf[size++] = digit;\n    if (size < precision) return digits::more;\n    if (!integral) {\n      // Check if error * 2 < divisor with overflow prevention.\n      // The check is not needed for the integral part because error = 1\n      // and divisor > (1 << 32) there.\n      if (error >= divisor || error >= divisor - error) return digits::error;\n    } else {\n      FMT_ASSERT(error == 1 && divisor > 2, \"\");\n    }\n    auto dir = get_round_direction(divisor, remainder, error);\n    if (dir != round_direction::up)\n      return dir == round_direction::down ? digits::done : digits::error;\n    ++buf[size - 1];\n    for (int i = size - 1; i > 0 && buf[i] > '9'; --i) {\n      buf[i] = '0';\n      ++buf[i - 1];\n    }\n    if (buf[0] > '9') {\n      buf[0] = '1';\n      buf[size++] = '0';\n    }\n    return digits::done;\n  }\n};\n\n// The shortest representation digit handler.\nstruct grisu_shortest_handler {\n  char* buf;\n  int size;\n  // Distance between scaled value and upper bound (wp_W in Grisu3).\n  uint64_t diff;\n\n  digits::result on_start(uint64_t, uint64_t, uint64_t, int&) {\n    return digits::more;\n  }\n\n  // Decrement the generated number approaching value from above.\n  void round(uint64_t d, uint64_t divisor, uint64_t& remainder,\n             uint64_t error) {\n    while (\n        remainder < d && error - remainder >= divisor &&\n        (remainder + divisor < d || d - remainder >= remainder + divisor - d)) {\n      --buf[size - 1];\n      remainder += divisor;\n    }\n  }\n\n  // Implements Grisu's round_weed.\n  digits::result on_digit(char digit, uint64_t divisor, uint64_t remainder,\n                          uint64_t error, int exp, bool integral) {\n    buf[size++] = digit;\n    if (remainder >= error) return digits::more;\n    uint64_t unit = integral ? 1 : data::powers_of_10_64[-exp];\n    uint64_t up = (diff - 1) * unit;  // wp_Wup\n    round(up, divisor, remainder, error);\n    uint64_t down = (diff + 1) * unit;  // wp_Wdown\n    if (remainder < down && error - remainder >= divisor &&\n        (remainder + divisor < down ||\n         down - remainder > remainder + divisor - down)) {\n      return digits::error;\n    }\n    return 2 * unit <= remainder && remainder <= error - 4 * unit\n               ? digits::done\n               : digits::error;\n  }\n};\n\n// Formats value using a variation of the Fixed-Precision Positive\n// Floating-Point Printout ((FPP)^2) algorithm by Steele & White:\n// https://fmt.dev/p372-steele.pdf.\ntemplate <typename Double>\nvoid fallback_format(Double d, buffer<char>& buf, int& exp10) {\n  bigint numerator;    // 2 * R in (FPP)^2.\n  bigint denominator;  // 2 * S in (FPP)^2.\n  // lower and upper are differences between value and corresponding boundaries.\n  bigint lower;             // (M^- in (FPP)^2).\n  bigint upper_store;       // upper's value if different from lower.\n  bigint* upper = nullptr;  // (M^+ in (FPP)^2).\n  fp value;\n  // Shift numerator and denominator by an extra bit or two (if lower boundary\n  // is closer) to make lower and upper integers. This eliminates multiplication\n  // by 2 during later computations.\n  // TODO: handle float\n  int shift = value.assign(d) ? 2 : 1;\n  uint64_t significand = value.f << shift;\n  if (value.e >= 0) {\n    numerator.assign(significand);\n    numerator <<= value.e;\n    lower.assign(1);\n    lower <<= value.e;\n    if (shift != 1) {\n      upper_store.assign(1);\n      upper_store <<= value.e + 1;\n      upper = &upper_store;\n    }\n    denominator.assign_pow10(exp10);\n    denominator <<= 1;\n  } else if (exp10 < 0) {\n    numerator.assign_pow10(-exp10);\n    lower.assign(numerator);\n    if (shift != 1) {\n      upper_store.assign(numerator);\n      upper_store <<= 1;\n      upper = &upper_store;\n    }\n    numerator *= significand;\n    denominator.assign(1);\n    denominator <<= shift - value.e;\n  } else {\n    numerator.assign(significand);\n    denominator.assign_pow10(exp10);\n    denominator <<= shift - value.e;\n    lower.assign(1);\n    if (shift != 1) {\n      upper_store.assign(1ULL << 1);\n      upper = &upper_store;\n    }\n  }\n  if (!upper) upper = &lower;\n  // Invariant: value == (numerator / denominator) * pow(10, exp10).\n  bool even = (value.f & 1) == 0;\n  int num_digits = 0;\n  char* data = buf.data();\n  for (;;) {\n    int digit = numerator.divmod_assign(denominator);\n    bool low = compare(numerator, lower) - even < 0;  // numerator <[=] lower.\n    // numerator + upper >[=] pow10:\n    bool high = add_compare(numerator, *upper, denominator) + even > 0;\n    data[num_digits++] = static_cast<char>('0' + digit);\n    if (low || high) {\n      if (!low) {\n        ++data[num_digits - 1];\n      } else if (high) {\n        int result = add_compare(numerator, numerator, denominator);\n        // Round half to even.\n        if (result > 0 || (result == 0 && (digit % 2) != 0))\n          ++data[num_digits - 1];\n      }\n      buf.resize(to_unsigned(num_digits));\n      exp10 -= num_digits - 1;\n      return;\n    }\n    numerator *= 10;\n    lower *= 10;\n    if (upper != &lower) *upper *= 10;\n  }\n}\n\n// Formats value using the Grisu algorithm\n// (https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf)\n// if T is a IEEE754 binary32 or binary64 and snprintf otherwise.\ntemplate <typename T>\nint format_float(T value, int precision, float_specs specs, buffer<char>& buf) {\n  static_assert(!std::is_same<T, float>::value, \"\");\n  FMT_ASSERT(value >= 0, \"value is negative\");\n\n  const bool fixed = specs.format == float_format::fixed;\n  if (value <= 0) {  // <= instead of == to silence a warning.\n    if (precision <= 0 || !fixed) {\n      buf.push_back('0');\n      return 0;\n    }\n    buf.resize(to_unsigned(precision));\n    std::uninitialized_fill_n(buf.data(), precision, '0');\n    return -precision;\n  }\n\n  if (!specs.use_grisu) return snprintf_float(value, precision, specs, buf);\n\n  int exp = 0;\n  const int min_exp = -60;  // alpha in Grisu.\n  int cached_exp10 = 0;     // K in Grisu.\n  if (precision < 0) {\n    fp fp_value;\n    auto boundaries = specs.binary32\n                          ? fp_value.assign_float_with_boundaries(value)\n                          : fp_value.assign_with_boundaries(value);\n    fp_value = normalize(fp_value);\n    // Find a cached power of 10 such that multiplying value by it will bring\n    // the exponent in the range [min_exp, -32].\n    const fp cached_pow = get_cached_power(\n        min_exp - (fp_value.e + fp::significand_size), cached_exp10);\n    // Multiply value and boundaries by the cached power of 10.\n    fp_value = fp_value * cached_pow;\n    boundaries.lower = multiply(boundaries.lower, cached_pow.f);\n    boundaries.upper = multiply(boundaries.upper, cached_pow.f);\n    assert(min_exp <= fp_value.e && fp_value.e <= -32);\n    --boundaries.lower;  // \\tilde{M}^- - 1 ulp -> M^-_{\\downarrow}.\n    ++boundaries.upper;  // \\tilde{M}^+ + 1 ulp -> M^+_{\\uparrow}.\n    // Numbers outside of (lower, upper) definitely do not round to value.\n    grisu_shortest_handler handler{buf.data(), 0,\n                                   boundaries.upper - fp_value.f};\n    auto result =\n        grisu_gen_digits(fp(boundaries.upper, fp_value.e),\n                         boundaries.upper - boundaries.lower, exp, handler);\n    if (result == digits::error) {\n      exp += handler.size - cached_exp10 - 1;\n      fallback_format(value, buf, exp);\n      return exp;\n    }\n    buf.resize(to_unsigned(handler.size));\n  } else {\n    if (precision > 17) return snprintf_float(value, precision, specs, buf);\n    fp normalized = normalize(fp(value));\n    const auto cached_pow = get_cached_power(\n        min_exp - (normalized.e + fp::significand_size), cached_exp10);\n    normalized = normalized * cached_pow;\n    fixed_handler handler{buf.data(), 0, precision, -cached_exp10, fixed};\n    if (grisu_gen_digits(normalized, 1, exp, handler) == digits::error)\n      return snprintf_float(value, precision, specs, buf);\n    int num_digits = handler.size;\n    if (!fixed) {\n      // Remove trailing zeros.\n      while (num_digits > 0 && buf[num_digits - 1] == '0') {\n        --num_digits;\n        ++exp;\n      }\n    }\n    buf.resize(to_unsigned(num_digits));\n  }\n  return exp - cached_exp10;\n}\n\ntemplate <typename T>\nint snprintf_float(T value, int precision, float_specs specs,\n                   buffer<char>& buf) {\n  // Buffer capacity must be non-zero, otherwise MSVC's vsnprintf_s will fail.\n  FMT_ASSERT(buf.capacity() > buf.size(), \"empty buffer\");\n  static_assert(!std::is_same<T, float>::value, \"\");\n\n  // Subtract 1 to account for the difference in precision since we use %e for\n  // both general and exponent format.\n  if (specs.format == float_format::general ||\n      specs.format == float_format::exp)\n    precision = (precision >= 0 ? precision : 6) - 1;\n\n  // Build the format string.\n  enum { max_format_size = 7 };  // Ths longest format is \"%#.*Le\".\n  char format[max_format_size];\n  char* format_ptr = format;\n  *format_ptr++ = '%';\n  if (specs.showpoint && specs.format == float_format::hex) *format_ptr++ = '#';\n  if (precision >= 0) {\n    *format_ptr++ = '.';\n    *format_ptr++ = '*';\n  }\n  if (std::is_same<T, long double>()) *format_ptr++ = 'L';\n  *format_ptr++ = specs.format != float_format::hex\n                      ? (specs.format == float_format::fixed ? 'f' : 'e')\n                      : (specs.upper ? 'A' : 'a');\n  *format_ptr = '\\0';\n\n  // Format using snprintf.\n  auto offset = buf.size();\n  for (;;) {\n    auto begin = buf.data() + offset;\n    auto capacity = buf.capacity() - offset;\n#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION\n    if (precision > 100000)\n      throw std::runtime_error(\n          \"fuzz mode - avoid large allocation inside snprintf\");\n#endif\n    // Suppress the warning about a nonliteral format string.\n    // Cannot use auto becase of a bug in MinGW (#1532).\n    int (*snprintf_ptr)(char*, size_t, const char*, ...) = FMT_SNPRINTF;\n    int result = precision >= 0\n                     ? snprintf_ptr(begin, capacity, format, precision, value)\n                     : snprintf_ptr(begin, capacity, format, value);\n    if (result < 0) {\n      buf.reserve(buf.capacity() + 1);  // The buffer will grow exponentially.\n      continue;\n    }\n    auto size = to_unsigned(result);\n    // Size equal to capacity means that the last character was truncated.\n    if (size >= capacity) {\n      buf.reserve(size + offset + 1);  // Add 1 for the terminating '\\0'.\n      continue;\n    }\n    auto is_digit = [](char c) { return c >= '0' && c <= '9'; };\n    if (specs.format == float_format::fixed) {\n      if (precision == 0) {\n        buf.resize(size);\n        return 0;\n      }\n      // Find and remove the decimal point.\n      auto end = begin + size, p = end;\n      do {\n        --p;\n      } while (is_digit(*p));\n      int fraction_size = static_cast<int>(end - p - 1);\n      std::memmove(p, p + 1, to_unsigned(fraction_size));\n      buf.resize(size - 1);\n      return -fraction_size;\n    }\n    if (specs.format == float_format::hex) {\n      buf.resize(size + offset);\n      return 0;\n    }\n    // Find and parse the exponent.\n    auto end = begin + size, exp_pos = end;\n    do {\n      --exp_pos;\n    } while (*exp_pos != 'e');\n    char sign = exp_pos[1];\n    assert(sign == '+' || sign == '-');\n    int exp = 0;\n    auto p = exp_pos + 2;  // Skip 'e' and sign.\n    do {\n      assert(is_digit(*p));\n      exp = exp * 10 + (*p++ - '0');\n    } while (p != end);\n    if (sign == '-') exp = -exp;\n    int fraction_size = 0;\n    if (exp_pos != begin + 1) {\n      // Remove trailing zeros.\n      auto fraction_end = exp_pos - 1;\n      while (*fraction_end == '0') --fraction_end;\n      // Move the fractional part left to get rid of the decimal point.\n      fraction_size = static_cast<int>(fraction_end - begin - 1);\n      std::memmove(begin + 1, begin + 2, to_unsigned(fraction_size));\n    }\n    buf.resize(to_unsigned(fraction_size) + offset + 1);\n    return exp - fraction_size;\n  }\n}\n\n// A public domain branchless UTF-8 decoder by Christopher Wellons:\n// https://github.com/skeeto/branchless-utf8\n/* Decode the next character, c, from buf, reporting errors in e.\n *\n * Since this is a branchless decoder, four bytes will be read from the\n * buffer regardless of the actual length of the next character. This\n * means the buffer _must_ have at least three bytes of zero padding\n * following the end of the data stream.\n *\n * Errors are reported in e, which will be non-zero if the parsed\n * character was somehow invalid: invalid byte sequence, non-canonical\n * encoding, or a surrogate half.\n *\n * The function returns a pointer to the next character. When an error\n * occurs, this pointer will be a guess that depends on the particular\n * error, but it will always advance at least one byte.\n */\nFMT_FUNC const char* utf8_decode(const char* buf, uint32_t* c, int* e) {\n  static const char lengths[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n                                 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,\n                                 0, 0, 2, 2, 2, 2, 3, 3, 4, 0};\n  static const int masks[] = {0x00, 0x7f, 0x1f, 0x0f, 0x07};\n  static const uint32_t mins[] = {4194304, 0, 128, 2048, 65536};\n  static const int shiftc[] = {0, 18, 12, 6, 0};\n  static const int shifte[] = {0, 6, 4, 2, 0};\n\n  auto s = reinterpret_cast<const unsigned char*>(buf);\n  int len = lengths[s[0] >> 3];\n\n  // Compute the pointer to the next character early so that the next\n  // iteration can start working on the next character. Neither Clang\n  // nor GCC figure out this reordering on their own.\n  const char* next = buf + len + !len;\n\n  // Assume a four-byte character and load four bytes. Unused bits are\n  // shifted out.\n  *c = uint32_t(s[0] & masks[len]) << 18;\n  *c |= uint32_t(s[1] & 0x3f) << 12;\n  *c |= uint32_t(s[2] & 0x3f) << 6;\n  *c |= uint32_t(s[3] & 0x3f) << 0;\n  *c >>= shiftc[len];\n\n  // Accumulate the various error conditions.\n  *e = (*c < mins[len]) << 6;       // non-canonical encoding\n  *e |= ((*c >> 11) == 0x1b) << 7;  // surrogate half?\n  *e |= (*c > 0x10FFFF) << 8;       // out of range?\n  *e |= (s[1] & 0xc0) >> 2;\n  *e |= (s[2] & 0xc0) >> 4;\n  *e |= (s[3]) >> 6;\n  *e ^= 0x2a;  // top two bits of each tail byte correct?\n  *e >>= shifte[len];\n\n  return next;\n}\n}  // namespace internal\n\ntemplate <> struct formatter<internal::bigint> {\n  format_parse_context::iterator parse(format_parse_context& ctx) {\n    return ctx.begin();\n  }\n\n  format_context::iterator format(const internal::bigint& n,\n                                  format_context& ctx) {\n    auto out = ctx.out();\n    bool first = true;\n    for (auto i = n.bigits_.size(); i > 0; --i) {\n      auto value = n.bigits_[i - 1u];\n      if (first) {\n        out = format_to(out, \"{:x}\", value);\n        first = false;\n        continue;\n      }\n      out = format_to(out, \"{:08x}\", value);\n    }\n    if (n.exp_ > 0)\n      out = format_to(out, \"p{}\", n.exp_ * internal::bigint::bigit_bits);\n    return out;\n  }\n};\n\nFMT_FUNC internal::utf8_to_utf16::utf8_to_utf16(string_view s) {\n  auto transcode = [this](const char* p) {\n    auto cp = uint32_t();\n    auto error = 0;\n    p = utf8_decode(p, &cp, &error);\n    if (error != 0) FMT_THROW(std::runtime_error(\"invalid utf8\"));\n    if (cp <= 0xFFFF) {\n      buffer_.push_back(static_cast<wchar_t>(cp));\n    } else {\n      cp -= 0x10000;\n      buffer_.push_back(static_cast<wchar_t>(0xD800 + (cp >> 10)));\n      buffer_.push_back(static_cast<wchar_t>(0xDC00 + (cp & 0x3FF)));\n    }\n    return p;\n  };\n  auto p = s.data();\n  const size_t block_size = 4;  // utf8_decode always reads blocks of 4 chars.\n  if (s.size() >= block_size) {\n    for (auto end = p + s.size() - block_size + 1; p < end;) p = transcode(p);\n  }\n  if (auto num_chars_left = s.data() + s.size() - p) {\n    char buf[2 * block_size - 1] = {};\n    memcpy(buf, p, to_unsigned(num_chars_left));\n    p = buf;\n    do {\n      p = transcode(p);\n    } while (p - buf < num_chars_left);\n  }\n  buffer_.push_back(0);\n}\n\nFMT_FUNC void format_system_error(internal::buffer<char>& out, int error_code,\n                                  string_view message) FMT_NOEXCEPT {\n  FMT_TRY {\n    memory_buffer buf;\n    buf.resize(inline_buffer_size);\n    for (;;) {\n      char* system_message = &buf[0];\n      int result =\n          internal::safe_strerror(error_code, system_message, buf.size());\n      if (result == 0) {\n        internal::writer w(out);\n        w.write(message);\n        w.write(\": \");\n        w.write(system_message);\n        return;\n      }\n      if (result != ERANGE)\n        break;  // Can't get error message, report error code instead.\n      buf.resize(buf.size() * 2);\n    }\n  }\n  FMT_CATCH(...) {}\n  format_error_code(out, error_code, message);\n}\n\nFMT_FUNC void internal::error_handler::on_error(const char* message) {\n  FMT_THROW(format_error(message));\n}\n\nFMT_FUNC void report_system_error(int error_code,\n                                  fmt::string_view message) FMT_NOEXCEPT {\n  report_error(format_system_error, error_code, message);\n}\n\nFMT_FUNC void vprint(std::FILE* f, string_view format_str, format_args args) {\n  memory_buffer buffer;\n  internal::vformat_to(buffer, format_str,\n                       basic_format_args<buffer_context<char>>(args));\n#ifdef _WIN32\n  auto fd = _fileno(f);\n  if (_isatty(fd)) {\n    internal::utf8_to_utf16 u16(string_view(buffer.data(), buffer.size()));\n    auto written = DWORD();\n    if (!WriteConsoleW(reinterpret_cast<HANDLE>(_get_osfhandle(fd)),\n                       u16.c_str(), static_cast<DWORD>(u16.size()), &written,\n                       nullptr)) {\n      FMT_THROW(format_error(\"failed to write to console\"));\n    }\n    return;\n  }\n#endif\n  internal::fwrite_fully(buffer.data(), 1, buffer.size(), f);\n}\n\n#ifdef _WIN32\n// Print assuming legacy (non-Unicode) encoding.\nFMT_FUNC void internal::vprint_mojibake(std::FILE* f, string_view format_str,\n                                        format_args args) {\n  memory_buffer buffer;\n  internal::vformat_to(buffer, format_str,\n                       basic_format_args<buffer_context<char>>(args));\n  fwrite_fully(buffer.data(), 1, buffer.size(), f);\n}\n#endif\n\nFMT_FUNC void vprint(string_view format_str, format_args args) {\n  vprint(stdout, format_str, args);\n}\n\nFMT_END_NAMESPACE\n\n#ifdef _MSC_VER\n#  pragma warning(pop)\n#endif\n\n#endif  // FMT_FORMAT_INL_H_\n"
  },
  {
    "path": "examples/lesson04/fig04_12/fmt/format.h",
    "content": "/*\n Formatting library for C++\n\n Copyright (c) 2012 - present, Victor Zverovich\n\n Permission is hereby granted, free of charge, to any person obtaining\n a copy of this software and associated documentation files (the\n \"Software\"), to deal in the Software without restriction, including\n without limitation the rights to use, copy, modify, merge, publish,\n distribute, sublicense, and/or sell copies of the Software, and to\n permit persons to whom the Software is furnished to do so, subject to\n the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n --- Optional exception to the license ---\n\n As an exception, if, as a result of your compiling your source code, portions\n of this Software are embedded into a machine-executable object form of such\n source code, you may redistribute such embedded portions in such object form\n without including the above copyright and permission notices.\n */\n\n#ifndef FMT_FORMAT_H_\n#define FMT_FORMAT_H_\n\n#include <algorithm>\n#include <cerrno>\n#include <cmath>\n#include <cstdint>\n#include <limits>\n#include <memory>\n#include <stdexcept>\n\n#include \"core.h\"\n\n#ifdef FMT_DEPRECATED_INCLUDE_OS\n#  include \"os.h\"\n#endif\n\n#ifdef __INTEL_COMPILER\n#  define FMT_ICC_VERSION __INTEL_COMPILER\n#elif defined(__ICL)\n#  define FMT_ICC_VERSION __ICL\n#else\n#  define FMT_ICC_VERSION 0\n#endif\n\n#ifdef __NVCC__\n#  define FMT_CUDA_VERSION (__CUDACC_VER_MAJOR__ * 100 + __CUDACC_VER_MINOR__)\n#else\n#  define FMT_CUDA_VERSION 0\n#endif\n\n#ifdef __has_builtin\n#  define FMT_HAS_BUILTIN(x) __has_builtin(x)\n#else\n#  define FMT_HAS_BUILTIN(x) 0\n#endif\n\n#if FMT_GCC_VERSION || FMT_CLANG_VERSION\n#  define FMT_NOINLINE __attribute__((noinline))\n#else\n#  define FMT_NOINLINE\n#endif\n\n#if __cplusplus == 201103L || __cplusplus == 201402L\n#  if defined(__clang__)\n#    define FMT_FALLTHROUGH [[clang::fallthrough]]\n#  elif FMT_GCC_VERSION >= 700 && !defined(__PGI)\n#    define FMT_FALLTHROUGH [[gnu::fallthrough]]\n#  else\n#    define FMT_FALLTHROUGH\n#  endif\n#elif FMT_HAS_CPP17_ATTRIBUTE(fallthrough) || \\\n    (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)\n#  define FMT_FALLTHROUGH [[fallthrough]]\n#else\n#  define FMT_FALLTHROUGH\n#endif\n\n#ifndef FMT_THROW\n#  if FMT_EXCEPTIONS\n#    if FMT_MSC_VER || FMT_NVCC\nFMT_BEGIN_NAMESPACE\nnamespace internal {\ntemplate <typename Exception> inline void do_throw(const Exception& x) {\n  // Silence unreachable code warnings in MSVC and NVCC because these\n  // are nearly impossible to fix in a generic code.\n  volatile bool b = true;\n  if (b) throw x;\n}\n}  // namespace internal\nFMT_END_NAMESPACE\n#      define FMT_THROW(x) internal::do_throw(x)\n#    else\n#      define FMT_THROW(x) throw x\n#    endif\n#  else\n#    define FMT_THROW(x)              \\\n      do {                            \\\n        static_cast<void>(sizeof(x)); \\\n        FMT_ASSERT(false, \"\");        \\\n      } while (false)\n#  endif\n#endif\n\n#if FMT_EXCEPTIONS\n#  define FMT_TRY try\n#  define FMT_CATCH(x) catch (x)\n#else\n#  define FMT_TRY if (true)\n#  define FMT_CATCH(x) if (false)\n#endif\n\n#ifndef FMT_USE_USER_DEFINED_LITERALS\n// For Intel and NVIDIA compilers both they and the system gcc/msc support UDLs.\n#  if (FMT_HAS_FEATURE(cxx_user_literals) || FMT_GCC_VERSION >= 407 ||      \\\n       FMT_MSC_VER >= 1900) &&                                              \\\n      (!(FMT_ICC_VERSION || FMT_CUDA_VERSION) || FMT_ICC_VERSION >= 1500 || \\\n       FMT_CUDA_VERSION >= 700)\n#    define FMT_USE_USER_DEFINED_LITERALS 1\n#  else\n#    define FMT_USE_USER_DEFINED_LITERALS 0\n#  endif\n#endif\n\n#ifndef FMT_USE_UDL_TEMPLATE\n// EDG front end based compilers (icc, nvcc) and GCC < 6.4 do not propertly\n// support UDL templates and GCC >= 9 warns about them.\n#  if FMT_USE_USER_DEFINED_LITERALS && FMT_ICC_VERSION == 0 && \\\n      FMT_CUDA_VERSION == 0 &&                                 \\\n      ((FMT_GCC_VERSION >= 604 && FMT_GCC_VERSION <= 900 &&    \\\n        __cplusplus >= 201402L) ||                             \\\n       FMT_CLANG_VERSION >= 304)\n#    define FMT_USE_UDL_TEMPLATE 1\n#  else\n#    define FMT_USE_UDL_TEMPLATE 0\n#  endif\n#endif\n\n#ifndef FMT_USE_FLOAT\n#  define FMT_USE_FLOAT 1\n#endif\n\n#ifndef FMT_USE_DOUBLE\n#  define FMT_USE_DOUBLE 1\n#endif\n\n#ifndef FMT_USE_LONG_DOUBLE\n#  define FMT_USE_LONG_DOUBLE 1\n#endif\n\n// __builtin_clz is broken in clang with Microsoft CodeGen:\n// https://github.com/fmtlib/fmt/issues/519\n#if (FMT_GCC_VERSION || FMT_HAS_BUILTIN(__builtin_clz)) && !FMT_MSC_VER\n#  define FMT_BUILTIN_CLZ(n) __builtin_clz(n)\n#endif\n#if (FMT_GCC_VERSION || FMT_HAS_BUILTIN(__builtin_clzll)) && !FMT_MSC_VER\n#  define FMT_BUILTIN_CLZLL(n) __builtin_clzll(n)\n#endif\n\n// Some compilers masquerade as both MSVC and GCC-likes or otherwise support\n// __builtin_clz and __builtin_clzll, so only define FMT_BUILTIN_CLZ using the\n// MSVC intrinsics if the clz and clzll builtins are not available.\n#if FMT_MSC_VER && !defined(FMT_BUILTIN_CLZLL) && !defined(_MANAGED)\n#  include <intrin.h>  // _BitScanReverse, _BitScanReverse64\n\nFMT_BEGIN_NAMESPACE\nnamespace internal {\n// Avoid Clang with Microsoft CodeGen's -Wunknown-pragmas warning.\n#  ifndef __clang__\n#    pragma intrinsic(_BitScanReverse)\n#  endif\ninline uint32_t clz(uint32_t x) {\n  unsigned long r = 0;\n  _BitScanReverse(&r, x);\n\n  FMT_ASSERT(x != 0, \"\");\n  // Static analysis complains about using uninitialized data\n  // \"r\", but the only way that can happen is if \"x\" is 0,\n  // which the callers guarantee to not happen.\n#  pragma warning(suppress : 6102)\n  return 31 - r;\n}\n#  define FMT_BUILTIN_CLZ(n) internal::clz(n)\n\n#  if defined(_WIN64) && !defined(__clang__)\n#    pragma intrinsic(_BitScanReverse64)\n#  endif\n\ninline uint32_t clzll(uint64_t x) {\n  unsigned long r = 0;\n#  ifdef _WIN64\n  _BitScanReverse64(&r, x);\n#  else\n  // Scan the high 32 bits.\n  if (_BitScanReverse(&r, static_cast<uint32_t>(x >> 32))) return 63 - (r + 32);\n\n  // Scan the low 32 bits.\n  _BitScanReverse(&r, static_cast<uint32_t>(x));\n#  endif\n\n  FMT_ASSERT(x != 0, \"\");\n  // Static analysis complains about using uninitialized data\n  // \"r\", but the only way that can happen is if \"x\" is 0,\n  // which the callers guarantee to not happen.\n#  pragma warning(suppress : 6102)\n  return 63 - r;\n}\n#  define FMT_BUILTIN_CLZLL(n) internal::clzll(n)\n}  // namespace internal\nFMT_END_NAMESPACE\n#endif\n\n// Enable the deprecated numeric alignment.\n#ifndef FMT_NUMERIC_ALIGN\n#  define FMT_NUMERIC_ALIGN 1\n#endif\n\n// Enable the deprecated percent specifier.\n#ifndef FMT_DEPRECATED_PERCENT\n#  define FMT_DEPRECATED_PERCENT 0\n#endif\n\nFMT_BEGIN_NAMESPACE\nnamespace internal {\n\n// An equivalent of `*reinterpret_cast<Dest*>(&source)` that doesn't have\n// undefined behavior (e.g. due to type aliasing).\n// Example: uint64_t d = bit_cast<uint64_t>(2.718);\ntemplate <typename Dest, typename Source>\ninline Dest bit_cast(const Source& source) {\n  static_assert(sizeof(Dest) == sizeof(Source), \"size mismatch\");\n  Dest dest;\n  std::memcpy(&dest, &source, sizeof(dest));\n  return dest;\n}\n\ninline bool is_big_endian() {\n  const auto u = 1u;\n  struct bytes {\n    char data[sizeof(u)];\n  };\n  return bit_cast<bytes>(u).data[0] == 0;\n}\n\n// A fallback implementation of uintptr_t for systems that lack it.\nstruct fallback_uintptr {\n  unsigned char value[sizeof(void*)];\n\n  fallback_uintptr() = default;\n  explicit fallback_uintptr(const void* p) {\n    *this = bit_cast<fallback_uintptr>(p);\n    if (is_big_endian()) {\n      for (size_t i = 0, j = sizeof(void*) - 1; i < j; ++i, --j)\n        std::swap(value[i], value[j]);\n    }\n  }\n};\n#ifdef UINTPTR_MAX\nusing uintptr_t = ::uintptr_t;\ninline uintptr_t to_uintptr(const void* p) { return bit_cast<uintptr_t>(p); }\n#else\nusing uintptr_t = fallback_uintptr;\ninline fallback_uintptr to_uintptr(const void* p) {\n  return fallback_uintptr(p);\n}\n#endif\n\n// Returns the largest possible value for type T. Same as\n// std::numeric_limits<T>::max() but shorter and not affected by the max macro.\ntemplate <typename T> constexpr T max_value() {\n  return (std::numeric_limits<T>::max)();\n}\ntemplate <typename T> constexpr int num_bits() {\n  return std::numeric_limits<T>::digits;\n}\ntemplate <> constexpr int num_bits<fallback_uintptr>() {\n  return static_cast<int>(sizeof(void*) *\n                          std::numeric_limits<unsigned char>::digits);\n}\n\n// An approximation of iterator_t for pre-C++20 systems.\ntemplate <typename T>\nusing iterator_t = decltype(std::begin(std::declval<T&>()));\n\n// Detect the iterator category of *any* given type in a SFINAE-friendly way.\n// Unfortunately, older implementations of std::iterator_traits are not safe\n// for use in a SFINAE-context.\ntemplate <typename It, typename Enable = void>\nstruct iterator_category : std::false_type {};\n\ntemplate <typename T> struct iterator_category<T*> {\n  using type = std::random_access_iterator_tag;\n};\n\ntemplate <typename It>\nstruct iterator_category<It, void_t<typename It::iterator_category>> {\n  using type = typename It::iterator_category;\n};\n\n// Detect if *any* given type models the OutputIterator concept.\ntemplate <typename It> class is_output_iterator {\n  // Check for mutability because all iterator categories derived from\n  // std::input_iterator_tag *may* also meet the requirements of an\n  // OutputIterator, thereby falling into the category of 'mutable iterators'\n  // [iterator.requirements.general] clause 4. The compiler reveals this\n  // property only at the point of *actually dereferencing* the iterator!\n  template <typename U>\n  static decltype(*(std::declval<U>())) test(std::input_iterator_tag);\n  template <typename U> static char& test(std::output_iterator_tag);\n  template <typename U> static const char& test(...);\n\n  using type = decltype(test<It>(typename iterator_category<It>::type{}));\n\n public:\n  enum { value = !std::is_const<remove_reference_t<type>>::value };\n};\n\n// A workaround for std::string not having mutable data() until C++17.\ntemplate <typename Char> inline Char* get_data(std::basic_string<Char>& s) {\n  return &s[0];\n}\ntemplate <typename Container>\ninline typename Container::value_type* get_data(Container& c) {\n  return c.data();\n}\n\n#if defined(_SECURE_SCL) && _SECURE_SCL\n// Make a checked iterator to avoid MSVC warnings.\ntemplate <typename T> using checked_ptr = stdext::checked_array_iterator<T*>;\ntemplate <typename T> checked_ptr<T> make_checked(T* p, std::size_t size) {\n  return {p, size};\n}\n#else\ntemplate <typename T> using checked_ptr = T*;\ntemplate <typename T> inline T* make_checked(T* p, std::size_t) { return p; }\n#endif\n\ntemplate <typename Container, FMT_ENABLE_IF(is_contiguous<Container>::value)>\ninline checked_ptr<typename Container::value_type> reserve(\n    std::back_insert_iterator<Container>& it, std::size_t n) {\n  Container& c = get_container(it);\n  std::size_t size = c.size();\n  c.resize(size + n);\n  return make_checked(get_data(c) + size, n);\n}\n\ntemplate <typename Iterator>\ninline Iterator& reserve(Iterator& it, std::size_t) {\n  return it;\n}\n\n// An output iterator that counts the number of objects written to it and\n// discards them.\nclass counting_iterator {\n private:\n  std::size_t count_;\n\n public:\n  using iterator_category = std::output_iterator_tag;\n  using difference_type = std::ptrdiff_t;\n  using pointer = void;\n  using reference = void;\n  using _Unchecked_type = counting_iterator;  // Mark iterator as checked.\n\n  struct value_type {\n    template <typename T> void operator=(const T&) {}\n  };\n\n  counting_iterator() : count_(0) {}\n\n  std::size_t count() const { return count_; }\n\n  counting_iterator& operator++() {\n    ++count_;\n    return *this;\n  }\n\n  counting_iterator operator++(int) {\n    auto it = *this;\n    ++*this;\n    return it;\n  }\n\n  value_type operator*() const { return {}; }\n};\n\ntemplate <typename OutputIt> class truncating_iterator_base {\n protected:\n  OutputIt out_;\n  std::size_t limit_;\n  std::size_t count_;\n\n  truncating_iterator_base(OutputIt out, std::size_t limit)\n      : out_(out), limit_(limit), count_(0) {}\n\n public:\n  using iterator_category = std::output_iterator_tag;\n  using value_type = typename std::iterator_traits<OutputIt>::value_type;\n  using difference_type = void;\n  using pointer = void;\n  using reference = void;\n  using _Unchecked_type =\n      truncating_iterator_base;  // Mark iterator as checked.\n\n  OutputIt base() const { return out_; }\n  std::size_t count() const { return count_; }\n};\n\n// An output iterator that truncates the output and counts the number of objects\n// written to it.\ntemplate <typename OutputIt,\n          typename Enable = typename std::is_void<\n              typename std::iterator_traits<OutputIt>::value_type>::type>\nclass truncating_iterator;\n\ntemplate <typename OutputIt>\nclass truncating_iterator<OutputIt, std::false_type>\n    : public truncating_iterator_base<OutputIt> {\n  mutable typename truncating_iterator_base<OutputIt>::value_type blackhole_;\n\n public:\n  using value_type = typename truncating_iterator_base<OutputIt>::value_type;\n\n  truncating_iterator(OutputIt out, std::size_t limit)\n      : truncating_iterator_base<OutputIt>(out, limit) {}\n\n  truncating_iterator& operator++() {\n    if (this->count_++ < this->limit_) ++this->out_;\n    return *this;\n  }\n\n  truncating_iterator operator++(int) {\n    auto it = *this;\n    ++*this;\n    return it;\n  }\n\n  value_type& operator*() const {\n    return this->count_ < this->limit_ ? *this->out_ : blackhole_;\n  }\n};\n\ntemplate <typename OutputIt>\nclass truncating_iterator<OutputIt, std::true_type>\n    : public truncating_iterator_base<OutputIt> {\n public:\n  truncating_iterator(OutputIt out, std::size_t limit)\n      : truncating_iterator_base<OutputIt>(out, limit) {}\n\n  template <typename T> truncating_iterator& operator=(T val) {\n    if (this->count_++ < this->limit_) *this->out_++ = val;\n    return *this;\n  }\n\n  truncating_iterator& operator++() { return *this; }\n  truncating_iterator& operator++(int) { return *this; }\n  truncating_iterator& operator*() { return *this; }\n};\n\n// A range with the specified output iterator and value type.\ntemplate <typename OutputIt, typename T = typename OutputIt::value_type>\nclass output_range {\n private:\n  OutputIt it_;\n\n public:\n  using value_type = T;\n  using iterator = OutputIt;\n  struct sentinel {};\n\n  explicit output_range(OutputIt it) : it_(it) {}\n  OutputIt begin() const { return it_; }\n  sentinel end() const { return {}; }  // Sentinel is not used yet.\n};\n\ntemplate <typename Char>\ninline size_t count_code_points(basic_string_view<Char> s) {\n  return s.size();\n}\n\n// Counts the number of code points in a UTF-8 string.\ninline size_t count_code_points(basic_string_view<char> s) {\n  const char* data = s.data();\n  size_t num_code_points = 0;\n  for (size_t i = 0, size = s.size(); i != size; ++i) {\n    if ((data[i] & 0xc0) != 0x80) ++num_code_points;\n  }\n  return num_code_points;\n}\n\ninline size_t count_code_points(basic_string_view<char8_type> s) {\n  return count_code_points(basic_string_view<char>(\n      reinterpret_cast<const char*>(s.data()), s.size()));\n}\n\ntemplate <typename Char>\ninline size_t code_point_index(basic_string_view<Char> s, size_t n) {\n  size_t size = s.size();\n  return n < size ? n : size;\n}\n\n// Calculates the index of the nth code point in a UTF-8 string.\ninline size_t code_point_index(basic_string_view<char8_type> s, size_t n) {\n  const char8_type* data = s.data();\n  size_t num_code_points = 0;\n  for (size_t i = 0, size = s.size(); i != size; ++i) {\n    if ((data[i] & 0xc0) != 0x80 && ++num_code_points > n) {\n      return i;\n    }\n  }\n  return s.size();\n}\n\ninline char8_type to_char8_t(char c) { return static_cast<char8_type>(c); }\n\ntemplate <typename InputIt, typename OutChar>\nusing needs_conversion = bool_constant<\n    std::is_same<typename std::iterator_traits<InputIt>::value_type,\n                 char>::value &&\n    std::is_same<OutChar, char8_type>::value>;\n\ntemplate <typename OutChar, typename InputIt, typename OutputIt,\n          FMT_ENABLE_IF(!needs_conversion<InputIt, OutChar>::value)>\nOutputIt copy_str(InputIt begin, InputIt end, OutputIt it) {\n  return std::copy(begin, end, it);\n}\n\ntemplate <typename OutChar, typename InputIt, typename OutputIt,\n          FMT_ENABLE_IF(needs_conversion<InputIt, OutChar>::value)>\nOutputIt copy_str(InputIt begin, InputIt end, OutputIt it) {\n  return std::transform(begin, end, it, to_char8_t);\n}\n\n#ifndef FMT_USE_GRISU\n#  define FMT_USE_GRISU 1\n#endif\n\ntemplate <typename T> constexpr bool use_grisu() {\n  return FMT_USE_GRISU && std::numeric_limits<double>::is_iec559 &&\n         sizeof(T) <= sizeof(double);\n}\n\ntemplate <typename T>\ntemplate <typename U>\nvoid buffer<T>::append(const U* begin, const U* end) {\n  std::size_t new_size = size_ + to_unsigned(end - begin);\n  reserve(new_size);\n  std::uninitialized_copy(begin, end, make_checked(ptr_, capacity_) + size_);\n  size_ = new_size;\n}\n}  // namespace internal\n\n// A range with an iterator appending to a buffer.\ntemplate <typename T>\nclass buffer_range : public internal::output_range<\n                         std::back_insert_iterator<internal::buffer<T>>, T> {\n public:\n  using iterator = std::back_insert_iterator<internal::buffer<T>>;\n  using internal::output_range<iterator, T>::output_range;\n  buffer_range(internal::buffer<T>& buf)\n      : internal::output_range<iterator, T>(std::back_inserter(buf)) {}\n};\n\nclass FMT_DEPRECATED u8string_view\n    : public basic_string_view<internal::char8_type> {\n public:\n  u8string_view(const char* s)\n      : basic_string_view<internal::char8_type>(\n            reinterpret_cast<const internal::char8_type*>(s)) {}\n  u8string_view(const char* s, size_t count) FMT_NOEXCEPT\n      : basic_string_view<internal::char8_type>(\n            reinterpret_cast<const internal::char8_type*>(s), count) {}\n};\n\n#if FMT_USE_USER_DEFINED_LITERALS\ninline namespace literals {\nFMT_DEPRECATED inline basic_string_view<internal::char8_type> operator\"\" _u(\n    const char* s, std::size_t n) {\n  return {reinterpret_cast<const internal::char8_type*>(s), n};\n}\n}  // namespace literals\n#endif\n\n// The number of characters to store in the basic_memory_buffer object itself\n// to avoid dynamic memory allocation.\nenum { inline_buffer_size = 500 };\n\n/**\n  \\rst\n  A dynamically growing memory buffer for trivially copyable/constructible types\n  with the first ``SIZE`` elements stored in the object itself.\n\n  You can use one of the following type aliases for common character types:\n\n  +----------------+------------------------------+\n  | Type           | Definition                   |\n  +================+==============================+\n  | memory_buffer  | basic_memory_buffer<char>    |\n  +----------------+------------------------------+\n  | wmemory_buffer | basic_memory_buffer<wchar_t> |\n  +----------------+------------------------------+\n\n  **Example**::\n\n     fmt::memory_buffer out;\n     format_to(out, \"The answer is {}.\", 42);\n\n  This will append the following output to the ``out`` object:\n\n  .. code-block:: none\n\n     The answer is 42.\n\n  The output can be converted to an ``std::string`` with ``to_string(out)``.\n  \\endrst\n */\ntemplate <typename T, std::size_t SIZE = inline_buffer_size,\n          typename Allocator = std::allocator<T>>\nclass basic_memory_buffer : private Allocator, public internal::buffer<T> {\n private:\n  T store_[SIZE];\n\n  // Deallocate memory allocated by the buffer.\n  void deallocate() {\n    T* data = this->data();\n    if (data != store_) Allocator::deallocate(data, this->capacity());\n  }\n\n protected:\n  void grow(std::size_t size) FMT_OVERRIDE;\n\n public:\n  using value_type = T;\n  using const_reference = const T&;\n\n  explicit basic_memory_buffer(const Allocator& alloc = Allocator())\n      : Allocator(alloc) {\n    this->set(store_, SIZE);\n  }\n  ~basic_memory_buffer() FMT_OVERRIDE { deallocate(); }\n\n private:\n  // Move data from other to this buffer.\n  void move(basic_memory_buffer& other) {\n    Allocator &this_alloc = *this, &other_alloc = other;\n    this_alloc = std::move(other_alloc);\n    T* data = other.data();\n    std::size_t size = other.size(), capacity = other.capacity();\n    if (data == other.store_) {\n      this->set(store_, capacity);\n      std::uninitialized_copy(other.store_, other.store_ + size,\n                              internal::make_checked(store_, capacity));\n    } else {\n      this->set(data, capacity);\n      // Set pointer to the inline array so that delete is not called\n      // when deallocating.\n      other.set(other.store_, 0);\n    }\n    this->resize(size);\n  }\n\n public:\n  /**\n    \\rst\n    Constructs a :class:`fmt::basic_memory_buffer` object moving the content\n    of the other object to it.\n    \\endrst\n   */\n  basic_memory_buffer(basic_memory_buffer&& other) FMT_NOEXCEPT { move(other); }\n\n  /**\n    \\rst\n    Moves the content of the other ``basic_memory_buffer`` object to this one.\n    \\endrst\n   */\n  basic_memory_buffer& operator=(basic_memory_buffer&& other) FMT_NOEXCEPT {\n    FMT_ASSERT(this != &other, \"\");\n    deallocate();\n    move(other);\n    return *this;\n  }\n\n  // Returns a copy of the allocator associated with this buffer.\n  Allocator get_allocator() const { return *this; }\n};\n\ntemplate <typename T, std::size_t SIZE, typename Allocator>\nvoid basic_memory_buffer<T, SIZE, Allocator>::grow(std::size_t size) {\n#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION\n  if (size > 1000) throw std::runtime_error(\"fuzz mode - won't grow that much\");\n#endif\n  std::size_t old_capacity = this->capacity();\n  std::size_t new_capacity = old_capacity + old_capacity / 2;\n  if (size > new_capacity) new_capacity = size;\n  T* old_data = this->data();\n  T* new_data = std::allocator_traits<Allocator>::allocate(*this, new_capacity);\n  // The following code doesn't throw, so the raw pointer above doesn't leak.\n  std::uninitialized_copy(old_data, old_data + this->size(),\n                          internal::make_checked(new_data, new_capacity));\n  this->set(new_data, new_capacity);\n  // deallocate must not throw according to the standard, but even if it does,\n  // the buffer already uses the new storage and will deallocate it in\n  // destructor.\n  if (old_data != store_) Allocator::deallocate(old_data, old_capacity);\n}\n\nusing memory_buffer = basic_memory_buffer<char>;\nusing wmemory_buffer = basic_memory_buffer<wchar_t>;\n\n/** A formatting error such as invalid format string. */\nFMT_CLASS_API\nclass FMT_API format_error : public std::runtime_error {\n public:\n  explicit format_error(const char* message) : std::runtime_error(message) {}\n  explicit format_error(const std::string& message)\n      : std::runtime_error(message) {}\n  format_error(const format_error&) = default;\n  format_error& operator=(const format_error&) = default;\n  format_error(format_error&&) = default;\n  format_error& operator=(format_error&&) = default;\n  ~format_error() FMT_NOEXCEPT FMT_OVERRIDE;\n};\n\nnamespace internal {\n\n// Returns true if value is negative, false otherwise.\n// Same as `value < 0` but doesn't produce warnings if T is an unsigned type.\ntemplate <typename T, FMT_ENABLE_IF(std::numeric_limits<T>::is_signed)>\nFMT_CONSTEXPR bool is_negative(T value) {\n  return value < 0;\n}\ntemplate <typename T, FMT_ENABLE_IF(!std::numeric_limits<T>::is_signed)>\nFMT_CONSTEXPR bool is_negative(T) {\n  return false;\n}\n\ntemplate <typename T, FMT_ENABLE_IF(std::is_floating_point<T>::value)>\nFMT_CONSTEXPR bool is_supported_floating_point(T) {\n  return (std::is_same<T, float>::value && FMT_USE_FLOAT) ||\n         (std::is_same<T, double>::value && FMT_USE_DOUBLE) ||\n         (std::is_same<T, long double>::value && FMT_USE_LONG_DOUBLE);\n}\n\n// Smallest of uint32_t, uint64_t, uint128_t that is large enough to\n// represent all values of T.\ntemplate <typename T>\nusing uint32_or_64_or_128_t = conditional_t<\n    std::numeric_limits<T>::digits <= 32, uint32_t,\n    conditional_t<std::numeric_limits<T>::digits <= 64, uint64_t, uint128_t>>;\n\n// Static data is placed in this class template for the header-only config.\ntemplate <typename T = void> struct FMT_EXTERN_TEMPLATE_API basic_data {\n  static const uint64_t powers_of_10_64[];\n  static const uint32_t zero_or_powers_of_10_32[];\n  static const uint64_t zero_or_powers_of_10_64[];\n  static const uint64_t pow10_significands[];\n  static const int16_t pow10_exponents[];\n  static const char digits[];\n  static const char hex_digits[];\n  static const char foreground_color[];\n  static const char background_color[];\n  static const char reset_color[5];\n  static const wchar_t wreset_color[5];\n  static const char signs[];\n};\n\nFMT_EXTERN template struct basic_data<void>;\n\n// This is a struct rather than an alias to avoid shadowing warnings in gcc.\nstruct data : basic_data<> {};\n\n#ifdef FMT_BUILTIN_CLZLL\n// Returns the number of decimal digits in n. Leading zeros are not counted\n// except for n == 0 in which case count_digits returns 1.\ninline int count_digits(uint64_t n) {\n  // Based on http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10\n  // and the benchmark https://github.com/localvoid/cxx-benchmark-count-digits.\n  int t = (64 - FMT_BUILTIN_CLZLL(n | 1)) * 1233 >> 12;\n  return t - (n < data::zero_or_powers_of_10_64[t]) + 1;\n}\n#else\n// Fallback version of count_digits used when __builtin_clz is not available.\ninline int count_digits(uint64_t n) {\n  int count = 1;\n  for (;;) {\n    // Integer division is slow so do it for a group of four digits instead\n    // of for every digit. The idea comes from the talk by Alexandrescu\n    // \"Three Optimization Tips for C++\". See speed-test for a comparison.\n    if (n < 10) return count;\n    if (n < 100) return count + 1;\n    if (n < 1000) return count + 2;\n    if (n < 10000) return count + 3;\n    n /= 10000u;\n    count += 4;\n  }\n}\n#endif\n\n#if FMT_USE_INT128\ninline int count_digits(uint128_t n) {\n  int count = 1;\n  for (;;) {\n    // Integer division is slow so do it for a group of four digits instead\n    // of for every digit. The idea comes from the talk by Alexandrescu\n    // \"Three Optimization Tips for C++\". See speed-test for a comparison.\n    if (n < 10) return count;\n    if (n < 100) return count + 1;\n    if (n < 1000) return count + 2;\n    if (n < 10000) return count + 3;\n    n /= 10000U;\n    count += 4;\n  }\n}\n#endif\n\n// Counts the number of digits in n. BITS = log2(radix).\ntemplate <unsigned BITS, typename UInt> inline int count_digits(UInt n) {\n  int num_digits = 0;\n  do {\n    ++num_digits;\n  } while ((n >>= BITS) != 0);\n  return num_digits;\n}\n\ntemplate <> int count_digits<4>(internal::fallback_uintptr n);\n\n#if FMT_GCC_VERSION || FMT_CLANG_VERSION\n#  define FMT_ALWAYS_INLINE inline __attribute__((always_inline))\n#else\n#  define FMT_ALWAYS_INLINE\n#endif\n\n#ifdef FMT_BUILTIN_CLZ\n// Optional version of count_digits for better performance on 32-bit platforms.\ninline int count_digits(uint32_t n) {\n  int t = (32 - FMT_BUILTIN_CLZ(n | 1)) * 1233 >> 12;\n  return t - (n < data::zero_or_powers_of_10_32[t]) + 1;\n}\n#endif\n\ntemplate <typename Char> FMT_API std::string grouping_impl(locale_ref loc);\ntemplate <typename Char> inline std::string grouping(locale_ref loc) {\n  return grouping_impl<char>(loc);\n}\ntemplate <> inline std::string grouping<wchar_t>(locale_ref loc) {\n  return grouping_impl<wchar_t>(loc);\n}\n\ntemplate <typename Char> FMT_API Char thousands_sep_impl(locale_ref loc);\ntemplate <typename Char> inline Char thousands_sep(locale_ref loc) {\n  return Char(thousands_sep_impl<char>(loc));\n}\ntemplate <> inline wchar_t thousands_sep(locale_ref loc) {\n  return thousands_sep_impl<wchar_t>(loc);\n}\n\ntemplate <typename Char> FMT_API Char decimal_point_impl(locale_ref loc);\ntemplate <typename Char> inline Char decimal_point(locale_ref loc) {\n  return Char(decimal_point_impl<char>(loc));\n}\ntemplate <> inline wchar_t decimal_point(locale_ref loc) {\n  return decimal_point_impl<wchar_t>(loc);\n}\n\n// Formats a decimal unsigned integer value writing into buffer.\n// add_thousands_sep is called after writing each char to add a thousands\n// separator if necessary.\ntemplate <typename UInt, typename Char, typename F>\ninline Char* format_decimal(Char* buffer, UInt value, int num_digits,\n                            F add_thousands_sep) {\n  FMT_ASSERT(num_digits >= 0, \"invalid digit count\");\n  buffer += num_digits;\n  Char* end = buffer;\n  while (value >= 100) {\n    // Integer division is slow so do it for a group of two digits instead\n    // of for every digit. The idea comes from the talk by Alexandrescu\n    // \"Three Optimization Tips for C++\". See speed-test for a comparison.\n    auto index = static_cast<unsigned>((value % 100) * 2);\n    value /= 100;\n    *--buffer = static_cast<Char>(data::digits[index + 1]);\n    add_thousands_sep(buffer);\n    *--buffer = static_cast<Char>(data::digits[index]);\n    add_thousands_sep(buffer);\n  }\n  if (value < 10) {\n    *--buffer = static_cast<Char>('0' + value);\n    return end;\n  }\n  auto index = static_cast<unsigned>(value * 2);\n  *--buffer = static_cast<Char>(data::digits[index + 1]);\n  add_thousands_sep(buffer);\n  *--buffer = static_cast<Char>(data::digits[index]);\n  return end;\n}\n\ntemplate <typename Int> constexpr int digits10() FMT_NOEXCEPT {\n  return std::numeric_limits<Int>::digits10;\n}\ntemplate <> constexpr int digits10<int128_t>() FMT_NOEXCEPT { return 38; }\ntemplate <> constexpr int digits10<uint128_t>() FMT_NOEXCEPT { return 38; }\n\ntemplate <typename Char, typename UInt, typename Iterator, typename F>\ninline Iterator format_decimal(Iterator out, UInt value, int num_digits,\n                               F add_thousands_sep) {\n  FMT_ASSERT(num_digits >= 0, \"invalid digit count\");\n  // Buffer should be large enough to hold all digits (<= digits10 + 1).\n  enum { max_size = digits10<UInt>() + 1 };\n  Char buffer[2 * max_size];\n  auto end = format_decimal(buffer, value, num_digits, add_thousands_sep);\n  return internal::copy_str<Char>(buffer, end, out);\n}\n\ntemplate <typename Char, typename It, typename UInt>\ninline It format_decimal(It out, UInt value, int num_digits) {\n  return format_decimal<Char>(out, value, num_digits, [](Char*) {});\n}\n\ntemplate <unsigned BASE_BITS, typename Char, typename UInt>\ninline Char* format_uint(Char* buffer, UInt value, int num_digits,\n                         bool upper = false) {\n  buffer += num_digits;\n  Char* end = buffer;\n  do {\n    const char* digits = upper ? \"0123456789ABCDEF\" : data::hex_digits;\n    unsigned digit = (value & ((1 << BASE_BITS) - 1));\n    *--buffer = static_cast<Char>(BASE_BITS < 4 ? static_cast<char>('0' + digit)\n                                                : digits[digit]);\n  } while ((value >>= BASE_BITS) != 0);\n  return end;\n}\n\ntemplate <unsigned BASE_BITS, typename Char>\nChar* format_uint(Char* buffer, internal::fallback_uintptr n, int num_digits,\n                  bool = false) {\n  auto char_digits = std::numeric_limits<unsigned char>::digits / 4;\n  int start = (num_digits + char_digits - 1) / char_digits - 1;\n  if (int start_digits = num_digits % char_digits) {\n    unsigned value = n.value[start--];\n    buffer = format_uint<BASE_BITS>(buffer, value, start_digits);\n  }\n  for (; start >= 0; --start) {\n    unsigned value = n.value[start];\n    buffer += char_digits;\n    auto p = buffer;\n    for (int i = 0; i < char_digits; ++i) {\n      unsigned digit = (value & ((1 << BASE_BITS) - 1));\n      *--p = static_cast<Char>(data::hex_digits[digit]);\n      value >>= BASE_BITS;\n    }\n  }\n  return buffer;\n}\n\ntemplate <unsigned BASE_BITS, typename Char, typename It, typename UInt>\ninline It format_uint(It out, UInt value, int num_digits, bool upper = false) {\n  // Buffer should be large enough to hold all digits (digits / BASE_BITS + 1).\n  char buffer[num_bits<UInt>() / BASE_BITS + 1];\n  format_uint<BASE_BITS>(buffer, value, num_digits, upper);\n  return internal::copy_str<Char>(buffer, buffer + num_digits, out);\n}\n\n// A converter from UTF-8 to UTF-16.\nclass utf8_to_utf16 {\n private:\n  wmemory_buffer buffer_;\n\n public:\n  FMT_API explicit utf8_to_utf16(string_view s);\n  operator wstring_view() const { return {&buffer_[0], size()}; }\n  size_t size() const { return buffer_.size() - 1; }\n  const wchar_t* c_str() const { return &buffer_[0]; }\n  std::wstring str() const { return {&buffer_[0], size()}; }\n};\n\ntemplate <typename T = void> struct null {};\n\n// Workaround an array initialization issue in gcc 4.8.\ntemplate <typename Char> struct fill_t {\n private:\n  enum { max_size = 4 };\n  Char data_[max_size];\n  unsigned char size_;\n\n public:\n  FMT_CONSTEXPR void operator=(basic_string_view<Char> s) {\n    auto size = s.size();\n    if (size > max_size) {\n      FMT_THROW(format_error(\"invalid fill\"));\n      return;\n    }\n    for (size_t i = 0; i < size; ++i) data_[i] = s[i];\n    size_ = static_cast<unsigned char>(size);\n  }\n\n  size_t size() const { return size_; }\n  const Char* data() const { return data_; }\n\n  FMT_CONSTEXPR Char& operator[](size_t index) { return data_[index]; }\n  FMT_CONSTEXPR const Char& operator[](size_t index) const {\n    return data_[index];\n  }\n\n  static FMT_CONSTEXPR fill_t<Char> make() {\n    auto fill = fill_t<Char>();\n    fill[0] = Char(' ');\n    fill.size_ = 1;\n    return fill;\n  }\n};\n}  // namespace internal\n\n// We cannot use enum classes as bit fields because of a gcc bug\n// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61414.\nnamespace align {\nenum type { none, left, right, center, numeric };\n}\nusing align_t = align::type;\n\nnamespace sign {\nenum type { none, minus, plus, space };\n}\nusing sign_t = sign::type;\n\n// Format specifiers for built-in and string types.\ntemplate <typename Char> struct basic_format_specs {\n  int width;\n  int precision;\n  char type;\n  align_t align : 4;\n  sign_t sign : 3;\n  bool alt : 1;  // Alternate form ('#').\n  internal::fill_t<Char> fill;\n\n  constexpr basic_format_specs()\n      : width(0),\n        precision(-1),\n        type(0),\n        align(align::none),\n        sign(sign::none),\n        alt(false),\n        fill(internal::fill_t<Char>::make()) {}\n};\n\nusing format_specs = basic_format_specs<char>;\n\nnamespace internal {\n\n// A floating-point presentation format.\nenum class float_format : unsigned char {\n  general,  // General: exponent notation or fixed point based on magnitude.\n  exp,      // Exponent notation with the default precision of 6, e.g. 1.2e-3.\n  fixed,    // Fixed point with the default precision of 6, e.g. 0.0012.\n  hex\n};\n\nstruct float_specs {\n  int precision;\n  float_format format : 8;\n  sign_t sign : 8;\n  bool upper : 1;\n  bool locale : 1;\n  bool percent : 1;\n  bool binary32 : 1;\n  bool use_grisu : 1;\n  bool showpoint : 1;\n};\n\n// Writes the exponent exp in the form \"[+-]d{2,3}\" to buffer.\ntemplate <typename Char, typename It> It write_exponent(int exp, It it) {\n  FMT_ASSERT(-10000 < exp && exp < 10000, \"exponent out of range\");\n  if (exp < 0) {\n    *it++ = static_cast<Char>('-');\n    exp = -exp;\n  } else {\n    *it++ = static_cast<Char>('+');\n  }\n  if (exp >= 100) {\n    const char* top = data::digits + (exp / 100) * 2;\n    if (exp >= 1000) *it++ = static_cast<Char>(top[0]);\n    *it++ = static_cast<Char>(top[1]);\n    exp %= 100;\n  }\n  const char* d = data::digits + exp * 2;\n  *it++ = static_cast<Char>(d[0]);\n  *it++ = static_cast<Char>(d[1]);\n  return it;\n}\n\ntemplate <typename Char> class float_writer {\n private:\n  // The number is given as v = digits_ * pow(10, exp_).\n  const char* digits_;\n  int num_digits_;\n  int exp_;\n  size_t size_;\n  float_specs specs_;\n  Char decimal_point_;\n\n  template <typename It> It prettify(It it) const {\n    // pow(10, full_exp - 1) <= v <= pow(10, full_exp).\n    int full_exp = num_digits_ + exp_;\n    if (specs_.format == float_format::exp) {\n      // Insert a decimal point after the first digit and add an exponent.\n      *it++ = static_cast<Char>(*digits_);\n      int num_zeros = specs_.precision - num_digits_;\n      if (num_digits_ > 1 || specs_.showpoint) *it++ = decimal_point_;\n      it = copy_str<Char>(digits_ + 1, digits_ + num_digits_, it);\n      if (num_zeros > 0 && specs_.showpoint)\n        it = std::fill_n(it, num_zeros, static_cast<Char>('0'));\n      *it++ = static_cast<Char>(specs_.upper ? 'E' : 'e');\n      return write_exponent<Char>(full_exp - 1, it);\n    }\n    if (num_digits_ <= full_exp) {\n      // 1234e7 -> 12340000000[.0+]\n      it = copy_str<Char>(digits_, digits_ + num_digits_, it);\n      it = std::fill_n(it, full_exp - num_digits_, static_cast<Char>('0'));\n      if (specs_.showpoint || specs_.precision < 0) {\n        *it++ = decimal_point_;\n        int num_zeros = specs_.precision - full_exp;\n        if (num_zeros <= 0) {\n          if (specs_.format != float_format::fixed)\n            *it++ = static_cast<Char>('0');\n          return it;\n        }\n#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION\n        if (num_zeros > 1000)\n          throw std::runtime_error(\"fuzz mode - avoiding excessive cpu use\");\n#endif\n        it = std::fill_n(it, num_zeros, static_cast<Char>('0'));\n      }\n    } else if (full_exp > 0) {\n      // 1234e-2 -> 12.34[0+]\n      it = copy_str<Char>(digits_, digits_ + full_exp, it);\n      if (!specs_.showpoint) {\n        // Remove trailing zeros.\n        int num_digits = num_digits_;\n        while (num_digits > full_exp && digits_[num_digits - 1] == '0')\n          --num_digits;\n        if (num_digits != full_exp) *it++ = decimal_point_;\n        return copy_str<Char>(digits_ + full_exp, digits_ + num_digits, it);\n      }\n      *it++ = decimal_point_;\n      it = copy_str<Char>(digits_ + full_exp, digits_ + num_digits_, it);\n      if (specs_.precision > num_digits_) {\n        // Add trailing zeros.\n        int num_zeros = specs_.precision - num_digits_;\n        it = std::fill_n(it, num_zeros, static_cast<Char>('0'));\n      }\n    } else {\n      // 1234e-6 -> 0.001234\n      *it++ = static_cast<Char>('0');\n      int num_zeros = -full_exp;\n      int num_digits = num_digits_;\n      if (num_digits == 0 && specs_.precision >= 0 &&\n          specs_.precision < num_zeros) {\n        num_zeros = specs_.precision;\n      }\n      // Remove trailing zeros.\n      if (!specs_.showpoint)\n        while (num_digits > 0 && digits_[num_digits - 1] == '0') --num_digits;\n      if (num_zeros != 0 || num_digits != 0 || specs_.showpoint) {\n        *it++ = decimal_point_;\n        it = std::fill_n(it, num_zeros, static_cast<Char>('0'));\n        it = copy_str<Char>(digits_, digits_ + num_digits, it);\n      }\n    }\n    return it;\n  }\n\n public:\n  float_writer(const char* digits, int num_digits, int exp, float_specs specs,\n               Char decimal_point)\n      : digits_(digits),\n        num_digits_(num_digits),\n        exp_(exp),\n        specs_(specs),\n        decimal_point_(decimal_point) {\n    int full_exp = num_digits + exp - 1;\n    int precision = specs.precision > 0 ? specs.precision : 16;\n    if (specs_.format == float_format::general &&\n        !(full_exp >= -4 && full_exp < precision)) {\n      specs_.format = float_format::exp;\n    }\n    size_ = prettify(counting_iterator()).count();\n    size_ += specs.sign ? 1 : 0;\n  }\n\n  size_t size() const { return size_; }\n  size_t width() const { return size(); }\n\n  template <typename It> void operator()(It&& it) {\n    if (specs_.sign) *it++ = static_cast<Char>(data::signs[specs_.sign]);\n    it = prettify(it);\n  }\n};\n\ntemplate <typename T>\nint format_float(T value, int precision, float_specs specs, buffer<char>& buf);\n\n// Formats a floating-point number with snprintf.\ntemplate <typename T>\nint snprintf_float(T value, int precision, float_specs specs,\n                   buffer<char>& buf);\n\ntemplate <typename T> T promote_float(T value) { return value; }\ninline double promote_float(float value) { return static_cast<double>(value); }\n\ntemplate <typename Handler>\nFMT_CONSTEXPR void handle_int_type_spec(char spec, Handler&& handler) {\n  switch (spec) {\n  case 0:\n  case 'd':\n    handler.on_dec();\n    break;\n  case 'x':\n  case 'X':\n    handler.on_hex();\n    break;\n  case 'b':\n  case 'B':\n    handler.on_bin();\n    break;\n  case 'o':\n    handler.on_oct();\n    break;\n  case 'n':\n  case 'L':\n    handler.on_num();\n    break;\n  default:\n    handler.on_error();\n  }\n}\n\ntemplate <typename ErrorHandler = error_handler, typename Char>\nFMT_CONSTEXPR float_specs parse_float_type_spec(\n    const basic_format_specs<Char>& specs, ErrorHandler&& eh = {}) {\n  auto result = float_specs();\n  result.showpoint = specs.alt;\n  switch (specs.type) {\n  case 0:\n    result.format = float_format::general;\n    result.showpoint |= specs.precision > 0;\n    break;\n  case 'G':\n    result.upper = true;\n    FMT_FALLTHROUGH;\n  case 'g':\n    result.format = float_format::general;\n    break;\n  case 'E':\n    result.upper = true;\n    FMT_FALLTHROUGH;\n  case 'e':\n    result.format = float_format::exp;\n    result.showpoint |= specs.precision != 0;\n    break;\n  case 'F':\n    result.upper = true;\n    FMT_FALLTHROUGH;\n  case 'f':\n    result.format = float_format::fixed;\n    result.showpoint |= specs.precision != 0;\n    break;\n#if FMT_DEPRECATED_PERCENT\n  case '%':\n    result.format = float_format::fixed;\n    result.percent = true;\n    break;\n#endif\n  case 'A':\n    result.upper = true;\n    FMT_FALLTHROUGH;\n  case 'a':\n    result.format = float_format::hex;\n    break;\n  case 'n':\n    result.locale = true;\n    break;\n  default:\n    eh.on_error(\"invalid type specifier\");\n    break;\n  }\n  return result;\n}\n\ntemplate <typename Char, typename Handler>\nFMT_CONSTEXPR void handle_char_specs(const basic_format_specs<Char>* specs,\n                                     Handler&& handler) {\n  if (!specs) return handler.on_char();\n  if (specs->type && specs->type != 'c') return handler.on_int();\n  if (specs->align == align::numeric || specs->sign != sign::none || specs->alt)\n    handler.on_error(\"invalid format specifier for char\");\n  handler.on_char();\n}\n\ntemplate <typename Char, typename Handler>\nFMT_CONSTEXPR void handle_cstring_type_spec(Char spec, Handler&& handler) {\n  if (spec == 0 || spec == 's')\n    handler.on_string();\n  else if (spec == 'p')\n    handler.on_pointer();\n  else\n    handler.on_error(\"invalid type specifier\");\n}\n\ntemplate <typename Char, typename ErrorHandler>\nFMT_CONSTEXPR void check_string_type_spec(Char spec, ErrorHandler&& eh) {\n  if (spec != 0 && spec != 's') eh.on_error(\"invalid type specifier\");\n}\n\ntemplate <typename Char, typename ErrorHandler>\nFMT_CONSTEXPR void check_pointer_type_spec(Char spec, ErrorHandler&& eh) {\n  if (spec != 0 && spec != 'p') eh.on_error(\"invalid type specifier\");\n}\n\ntemplate <typename ErrorHandler> class int_type_checker : private ErrorHandler {\n public:\n  FMT_CONSTEXPR explicit int_type_checker(ErrorHandler eh) : ErrorHandler(eh) {}\n\n  FMT_CONSTEXPR void on_dec() {}\n  FMT_CONSTEXPR void on_hex() {}\n  FMT_CONSTEXPR void on_bin() {}\n  FMT_CONSTEXPR void on_oct() {}\n  FMT_CONSTEXPR void on_num() {}\n\n  FMT_CONSTEXPR void on_error() {\n    ErrorHandler::on_error(\"invalid type specifier\");\n  }\n};\n\ntemplate <typename ErrorHandler>\nclass char_specs_checker : public ErrorHandler {\n private:\n  char type_;\n\n public:\n  FMT_CONSTEXPR char_specs_checker(char type, ErrorHandler eh)\n      : ErrorHandler(eh), type_(type) {}\n\n  FMT_CONSTEXPR void on_int() {\n    handle_int_type_spec(type_, int_type_checker<ErrorHandler>(*this));\n  }\n  FMT_CONSTEXPR void on_char() {}\n};\n\ntemplate <typename ErrorHandler>\nclass cstring_type_checker : public ErrorHandler {\n public:\n  FMT_CONSTEXPR explicit cstring_type_checker(ErrorHandler eh)\n      : ErrorHandler(eh) {}\n\n  FMT_CONSTEXPR void on_string() {}\n  FMT_CONSTEXPR void on_pointer() {}\n};\n\ntemplate <typename Context>\nvoid arg_map<Context>::init(const basic_format_args<Context>& args) {\n  if (map_) return;\n  map_ = new entry[internal::to_unsigned(args.max_size())];\n  if (args.is_packed()) {\n    for (int i = 0;; ++i) {\n      internal::type arg_type = args.type(i);\n      if (arg_type == internal::type::none_type) return;\n      if (arg_type == internal::type::named_arg_type)\n        push_back(args.values_[i]);\n    }\n  }\n  for (int i = 0, n = args.max_size(); i < n; ++i) {\n    auto type = args.args_[i].type_;\n    if (type == internal::type::named_arg_type) push_back(args.args_[i].value_);\n  }\n}\n\ntemplate <typename Char> struct nonfinite_writer {\n  sign_t sign;\n  const char* str;\n  static constexpr size_t str_size = 3;\n\n  size_t size() const { return str_size + (sign ? 1 : 0); }\n  size_t width() const { return size(); }\n\n  template <typename It> void operator()(It&& it) const {\n    if (sign) *it++ = static_cast<Char>(data::signs[sign]);\n    it = copy_str<Char>(str, str + str_size, it);\n  }\n};\n\ntemplate <typename OutputIt, typename Char>\nFMT_NOINLINE OutputIt fill(OutputIt it, size_t n, const fill_t<Char>& fill) {\n  auto fill_size = fill.size();\n  if (fill_size == 1) return std::fill_n(it, n, fill[0]);\n  for (size_t i = 0; i < n; ++i) it = std::copy_n(fill.data(), fill_size, it);\n  return it;\n}\n\n// This template provides operations for formatting and writing data into a\n// character range.\ntemplate <typename Range> class basic_writer {\n public:\n  using char_type = typename Range::value_type;\n  using iterator = typename Range::iterator;\n  using format_specs = basic_format_specs<char_type>;\n\n private:\n  iterator out_;  // Output iterator.\n  locale_ref locale_;\n\n  // Attempts to reserve space for n extra characters in the output range.\n  // Returns a pointer to the reserved range or a reference to out_.\n  auto reserve(std::size_t n) -> decltype(internal::reserve(out_, n)) {\n    return internal::reserve(out_, n);\n  }\n\n  template <typename F> struct padded_int_writer {\n    size_t size_;\n    string_view prefix;\n    char_type fill;\n    std::size_t padding;\n    F f;\n\n    size_t size() const { return size_; }\n    size_t width() const { return size_; }\n\n    template <typename It> void operator()(It&& it) const {\n      if (prefix.size() != 0)\n        it = copy_str<char_type>(prefix.begin(), prefix.end(), it);\n      it = std::fill_n(it, padding, fill);\n      f(it);\n    }\n  };\n\n  // Writes an integer in the format\n  //   <left-padding><prefix><numeric-padding><digits><right-padding>\n  // where <digits> are written by f(it).\n  template <typename F>\n  void write_int(int num_digits, string_view prefix, format_specs specs, F f) {\n    std::size_t size = prefix.size() + to_unsigned(num_digits);\n    char_type fill = specs.fill[0];\n    std::size_t padding = 0;\n    if (specs.align == align::numeric) {\n      auto unsiged_width = to_unsigned(specs.width);\n      if (unsiged_width > size) {\n        padding = unsiged_width - size;\n        size = unsiged_width;\n      }\n    } else if (specs.precision > num_digits) {\n      size = prefix.size() + to_unsigned(specs.precision);\n      padding = to_unsigned(specs.precision - num_digits);\n      fill = static_cast<char_type>('0');\n    }\n    if (specs.align == align::none) specs.align = align::right;\n    write_padded(specs, padded_int_writer<F>{size, prefix, fill, padding, f});\n  }\n\n  // Writes a decimal integer.\n  template <typename Int> void write_decimal(Int value) {\n    auto abs_value = static_cast<uint32_or_64_or_128_t<Int>>(value);\n    bool negative = is_negative(value);\n    // Don't do -abs_value since it trips unsigned-integer-overflow sanitizer.\n    if (negative) abs_value = ~abs_value + 1;\n    int num_digits = count_digits(abs_value);\n    auto&& it = reserve((negative ? 1 : 0) + static_cast<size_t>(num_digits));\n    if (negative) *it++ = static_cast<char_type>('-');\n    it = format_decimal<char_type>(it, abs_value, num_digits);\n  }\n\n  // The handle_int_type_spec handler that writes an integer.\n  template <typename Int, typename Specs> struct int_writer {\n    using unsigned_type = uint32_or_64_or_128_t<Int>;\n\n    basic_writer<Range>& writer;\n    const Specs& specs;\n    unsigned_type abs_value;\n    char prefix[4];\n    unsigned prefix_size;\n\n    string_view get_prefix() const { return string_view(prefix, prefix_size); }\n\n    int_writer(basic_writer<Range>& w, Int value, const Specs& s)\n        : writer(w),\n          specs(s),\n          abs_value(static_cast<unsigned_type>(value)),\n          prefix_size(0) {\n      if (is_negative(value)) {\n        prefix[0] = '-';\n        ++prefix_size;\n        abs_value = 0 - abs_value;\n      } else if (specs.sign != sign::none && specs.sign != sign::minus) {\n        prefix[0] = specs.sign == sign::plus ? '+' : ' ';\n        ++prefix_size;\n      }\n    }\n\n    struct dec_writer {\n      unsigned_type abs_value;\n      int num_digits;\n\n      template <typename It> void operator()(It&& it) const {\n        it = internal::format_decimal<char_type>(it, abs_value, num_digits);\n      }\n    };\n\n    void on_dec() {\n      int num_digits = count_digits(abs_value);\n      writer.write_int(num_digits, get_prefix(), specs,\n                       dec_writer{abs_value, num_digits});\n    }\n\n    struct hex_writer {\n      int_writer& self;\n      int num_digits;\n\n      template <typename It> void operator()(It&& it) const {\n        it = format_uint<4, char_type>(it, self.abs_value, num_digits,\n                                       self.specs.type != 'x');\n      }\n    };\n\n    void on_hex() {\n      if (specs.alt) {\n        prefix[prefix_size++] = '0';\n        prefix[prefix_size++] = specs.type;\n      }\n      int num_digits = count_digits<4>(abs_value);\n      writer.write_int(num_digits, get_prefix(), specs,\n                       hex_writer{*this, num_digits});\n    }\n\n    template <int BITS> struct bin_writer {\n      unsigned_type abs_value;\n      int num_digits;\n\n      template <typename It> void operator()(It&& it) const {\n        it = format_uint<BITS, char_type>(it, abs_value, num_digits);\n      }\n    };\n\n    void on_bin() {\n      if (specs.alt) {\n        prefix[prefix_size++] = '0';\n        prefix[prefix_size++] = static_cast<char>(specs.type);\n      }\n      int num_digits = count_digits<1>(abs_value);\n      writer.write_int(num_digits, get_prefix(), specs,\n                       bin_writer<1>{abs_value, num_digits});\n    }\n\n    void on_oct() {\n      int num_digits = count_digits<3>(abs_value);\n      if (specs.alt && specs.precision <= num_digits && abs_value != 0) {\n        // Octal prefix '0' is counted as a digit, so only add it if precision\n        // is not greater than the number of digits.\n        prefix[prefix_size++] = '0';\n      }\n      writer.write_int(num_digits, get_prefix(), specs,\n                       bin_writer<3>{abs_value, num_digits});\n    }\n\n    enum { sep_size = 1 };\n\n    struct num_writer {\n      unsigned_type abs_value;\n      int size;\n      const std::string& groups;\n      char_type sep;\n\n      template <typename It> void operator()(It&& it) const {\n        basic_string_view<char_type> s(&sep, sep_size);\n        // Index of a decimal digit with the least significant digit having\n        // index 0.\n        int digit_index = 0;\n        std::string::const_iterator group = groups.cbegin();\n        it = format_decimal<char_type>(\n            it, abs_value, size,\n            [this, s, &group, &digit_index](char_type*& buffer) {\n              if (*group <= 0 || ++digit_index % *group != 0 ||\n                  *group == max_value<char>())\n                return;\n              if (group + 1 != groups.cend()) {\n                digit_index = 0;\n                ++group;\n              }\n              buffer -= s.size();\n              std::uninitialized_copy(s.data(), s.data() + s.size(),\n                                      make_checked(buffer, s.size()));\n            });\n      }\n    };\n\n    void on_num() {\n      std::string groups = grouping<char_type>(writer.locale_);\n      if (groups.empty()) return on_dec();\n      auto sep = thousands_sep<char_type>(writer.locale_);\n      if (!sep) return on_dec();\n      int num_digits = count_digits(abs_value);\n      int size = num_digits;\n      std::string::const_iterator group = groups.cbegin();\n      while (group != groups.cend() && num_digits > *group && *group > 0 &&\n             *group != max_value<char>()) {\n        size += sep_size;\n        num_digits -= *group;\n        ++group;\n      }\n      if (group == groups.cend())\n        size += sep_size * ((num_digits - 1) / groups.back());\n      writer.write_int(size, get_prefix(), specs,\n                       num_writer{abs_value, size, groups, sep});\n    }\n\n    FMT_NORETURN void on_error() {\n      FMT_THROW(format_error(\"invalid type specifier\"));\n    }\n  };\n\n  template <typename Char> struct str_writer {\n    const Char* s;\n    size_t size_;\n\n    size_t size() const { return size_; }\n    size_t width() const {\n      return count_code_points(basic_string_view<Char>(s, size_));\n    }\n\n    template <typename It> void operator()(It&& it) const {\n      it = copy_str<char_type>(s, s + size_, it);\n    }\n  };\n\n  struct bytes_writer {\n    string_view bytes;\n\n    size_t size() const { return bytes.size(); }\n    size_t width() const { return bytes.size(); }\n\n    template <typename It> void operator()(It&& it) const {\n      const char* data = bytes.data();\n      it = copy_str<char>(data, data + size(), it);\n    }\n  };\n\n  template <typename UIntPtr> struct pointer_writer {\n    UIntPtr value;\n    int num_digits;\n\n    size_t size() const { return to_unsigned(num_digits) + 2; }\n    size_t width() const { return size(); }\n\n    template <typename It> void operator()(It&& it) const {\n      *it++ = static_cast<char_type>('0');\n      *it++ = static_cast<char_type>('x');\n      it = format_uint<4, char_type>(it, value, num_digits);\n    }\n  };\n\n public:\n  explicit basic_writer(Range out, locale_ref loc = locale_ref())\n      : out_(out.begin()), locale_(loc) {}\n\n  iterator out() const { return out_; }\n\n  // Writes a value in the format\n  //   <left-padding><value><right-padding>\n  // where <value> is written by f(it).\n  template <typename F> void write_padded(const format_specs& specs, F&& f) {\n    // User-perceived width (in code points).\n    unsigned width = to_unsigned(specs.width);\n    size_t size = f.size();  // The number of code units.\n    size_t num_code_points = width != 0 ? f.width() : size;\n    if (width <= num_code_points) return f(reserve(size));\n    size_t padding = width - num_code_points;\n    size_t fill_size = specs.fill.size();\n    auto&& it = reserve(size + padding * fill_size);\n    if (specs.align == align::right) {\n      it = fill(it, padding, specs.fill);\n      f(it);\n    } else if (specs.align == align::center) {\n      std::size_t left_padding = padding / 2;\n      it = fill(it, left_padding, specs.fill);\n      f(it);\n      it = fill(it, padding - left_padding, specs.fill);\n    } else {\n      f(it);\n      it = fill(it, padding, specs.fill);\n    }\n  }\n\n  void write(int value) { write_decimal(value); }\n  void write(long value) { write_decimal(value); }\n  void write(long long value) { write_decimal(value); }\n\n  void write(unsigned value) { write_decimal(value); }\n  void write(unsigned long value) { write_decimal(value); }\n  void write(unsigned long long value) { write_decimal(value); }\n\n#if FMT_USE_INT128\n  void write(int128_t value) { write_decimal(value); }\n  void write(uint128_t value) { write_decimal(value); }\n#endif\n\n  template <typename T, typename Spec>\n  void write_int(T value, const Spec& spec) {\n    handle_int_type_spec(spec.type, int_writer<T, Spec>(*this, value, spec));\n  }\n\n  template <typename T, FMT_ENABLE_IF(std::is_floating_point<T>::value)>\n  void write(T value, format_specs specs = {}) {\n    if (const_check(!is_supported_floating_point(value))) {\n      return;\n    }\n    float_specs fspecs = parse_float_type_spec(specs);\n    fspecs.sign = specs.sign;\n    if (std::signbit(value)) {  // value < 0 is false for NaN so use signbit.\n      fspecs.sign = sign::minus;\n      value = -value;\n    } else if (fspecs.sign == sign::minus) {\n      fspecs.sign = sign::none;\n    }\n\n    if (!std::isfinite(value)) {\n      auto str = std::isinf(value) ? (fspecs.upper ? \"INF\" : \"inf\")\n                                   : (fspecs.upper ? \"NAN\" : \"nan\");\n      return write_padded(specs, nonfinite_writer<char_type>{fspecs.sign, str});\n    }\n\n    if (specs.align == align::none) {\n      specs.align = align::right;\n    } else if (specs.align == align::numeric) {\n      if (fspecs.sign) {\n        auto&& it = reserve(1);\n        *it++ = static_cast<char_type>(data::signs[fspecs.sign]);\n        fspecs.sign = sign::none;\n        if (specs.width != 0) --specs.width;\n      }\n      specs.align = align::right;\n    }\n\n    memory_buffer buffer;\n    if (fspecs.format == float_format::hex) {\n      if (fspecs.sign) buffer.push_back(data::signs[fspecs.sign]);\n      snprintf_float(promote_float(value), specs.precision, fspecs, buffer);\n      write_padded(specs, str_writer<char>{buffer.data(), buffer.size()});\n      return;\n    }\n    int precision = specs.precision >= 0 || !specs.type ? specs.precision : 6;\n    if (fspecs.format == float_format::exp) {\n      if (precision == max_value<int>())\n        FMT_THROW(format_error(\"number is too big\"));\n      else\n        ++precision;\n    }\n    if (const_check(std::is_same<T, float>())) fspecs.binary32 = true;\n    fspecs.use_grisu = use_grisu<T>();\n    if (const_check(FMT_DEPRECATED_PERCENT) && fspecs.percent) value *= 100;\n    int exp = format_float(promote_float(value), precision, fspecs, buffer);\n    if (const_check(FMT_DEPRECATED_PERCENT) && fspecs.percent) {\n      buffer.push_back('%');\n      --exp;  // Adjust decimal place position.\n    }\n    fspecs.precision = precision;\n    char_type point = fspecs.locale ? decimal_point<char_type>(locale_)\n                                    : static_cast<char_type>('.');\n    write_padded(specs, float_writer<char_type>(buffer.data(),\n                                                static_cast<int>(buffer.size()),\n                                                exp, fspecs, point));\n  }\n\n  void write(char value) {\n    auto&& it = reserve(1);\n    *it++ = value;\n  }\n\n  template <typename Char, FMT_ENABLE_IF(std::is_same<Char, char_type>::value)>\n  void write(Char value) {\n    auto&& it = reserve(1);\n    *it++ = value;\n  }\n\n  void write(string_view value) {\n    auto&& it = reserve(value.size());\n    it = copy_str<char_type>(value.begin(), value.end(), it);\n  }\n  void write(wstring_view value) {\n    static_assert(std::is_same<char_type, wchar_t>::value, \"\");\n    auto&& it = reserve(value.size());\n    it = std::copy(value.begin(), value.end(), it);\n  }\n\n  template <typename Char>\n  void write(const Char* s, std::size_t size, const format_specs& specs) {\n    write_padded(specs, str_writer<Char>{s, size});\n  }\n\n  template <typename Char>\n  void write(basic_string_view<Char> s, const format_specs& specs = {}) {\n    const Char* data = s.data();\n    std::size_t size = s.size();\n    if (specs.precision >= 0 && to_unsigned(specs.precision) < size)\n      size = code_point_index(s, to_unsigned(specs.precision));\n    write(data, size, specs);\n  }\n\n  void write_bytes(string_view bytes, const format_specs& specs) {\n    write_padded(specs, bytes_writer{bytes});\n  }\n\n  template <typename UIntPtr>\n  void write_pointer(UIntPtr value, const format_specs* specs) {\n    int num_digits = count_digits<4>(value);\n    auto pw = pointer_writer<UIntPtr>{value, num_digits};\n    if (!specs) return pw(reserve(to_unsigned(num_digits) + 2));\n    format_specs specs_copy = *specs;\n    if (specs_copy.align == align::none) specs_copy.align = align::right;\n    write_padded(specs_copy, pw);\n  }\n};\n\nusing writer = basic_writer<buffer_range<char>>;\n\ntemplate <typename T> struct is_integral : std::is_integral<T> {};\ntemplate <> struct is_integral<int128_t> : std::true_type {};\ntemplate <> struct is_integral<uint128_t> : std::true_type {};\n\ntemplate <typename Range, typename ErrorHandler = internal::error_handler>\nclass arg_formatter_base {\n public:\n  using char_type = typename Range::value_type;\n  using iterator = typename Range::iterator;\n  using format_specs = basic_format_specs<char_type>;\n\n private:\n  using writer_type = basic_writer<Range>;\n  writer_type writer_;\n  format_specs* specs_;\n\n  struct char_writer {\n    char_type value;\n\n    size_t size() const { return 1; }\n    size_t width() const { return 1; }\n\n    template <typename It> void operator()(It&& it) const { *it++ = value; }\n  };\n\n  void write_char(char_type value) {\n    if (specs_)\n      writer_.write_padded(*specs_, char_writer{value});\n    else\n      writer_.write(value);\n  }\n\n  void write_pointer(const void* p) {\n    writer_.write_pointer(internal::to_uintptr(p), specs_);\n  }\n\n protected:\n  writer_type& writer() { return writer_; }\n  FMT_DEPRECATED format_specs* spec() { return specs_; }\n  format_specs* specs() { return specs_; }\n  iterator out() { return writer_.out(); }\n\n  void write(bool value) {\n    string_view sv(value ? \"true\" : \"false\");\n    specs_ ? writer_.write(sv, *specs_) : writer_.write(sv);\n  }\n\n  void write(const char_type* value) {\n    if (!value) {\n      FMT_THROW(format_error(\"string pointer is null\"));\n    } else {\n      auto length = std::char_traits<char_type>::length(value);\n      basic_string_view<char_type> sv(value, length);\n      specs_ ? writer_.write(sv, *specs_) : writer_.write(sv);\n    }\n  }\n\n public:\n  arg_formatter_base(Range r, format_specs* s, locale_ref loc)\n      : writer_(r, loc), specs_(s) {}\n\n  iterator operator()(monostate) {\n    FMT_ASSERT(false, \"invalid argument type\");\n    return out();\n  }\n\n  template <typename T, FMT_ENABLE_IF(is_integral<T>::value)>\n  iterator operator()(T value) {\n    if (specs_)\n      writer_.write_int(value, *specs_);\n    else\n      writer_.write(value);\n    return out();\n  }\n\n  iterator operator()(char_type value) {\n    internal::handle_char_specs(\n        specs_, char_spec_handler(*this, static_cast<char_type>(value)));\n    return out();\n  }\n\n  iterator operator()(bool value) {\n    if (specs_ && specs_->type) return (*this)(value ? 1 : 0);\n    write(value != 0);\n    return out();\n  }\n\n  template <typename T, FMT_ENABLE_IF(std::is_floating_point<T>::value)>\n  iterator operator()(T value) {\n    if (const_check(is_supported_floating_point(value)))\n      writer_.write(value, specs_ ? *specs_ : format_specs());\n    else\n      FMT_ASSERT(false, \"unsupported float argument type\");\n    return out();\n  }\n\n  struct char_spec_handler : ErrorHandler {\n    arg_formatter_base& formatter;\n    char_type value;\n\n    char_spec_handler(arg_formatter_base& f, char_type val)\n        : formatter(f), value(val) {}\n\n    void on_int() {\n      if (formatter.specs_)\n        formatter.writer_.write_int(value, *formatter.specs_);\n      else\n        formatter.writer_.write(value);\n    }\n    void on_char() { formatter.write_char(value); }\n  };\n\n  struct cstring_spec_handler : internal::error_handler {\n    arg_formatter_base& formatter;\n    const char_type* value;\n\n    cstring_spec_handler(arg_formatter_base& f, const char_type* val)\n        : formatter(f), value(val) {}\n\n    void on_string() { formatter.write(value); }\n    void on_pointer() { formatter.write_pointer(value); }\n  };\n\n  iterator operator()(const char_type* value) {\n    if (!specs_) return write(value), out();\n    internal::handle_cstring_type_spec(specs_->type,\n                                       cstring_spec_handler(*this, value));\n    return out();\n  }\n\n  iterator operator()(basic_string_view<char_type> value) {\n    if (specs_) {\n      internal::check_string_type_spec(specs_->type, internal::error_handler());\n      writer_.write(value, *specs_);\n    } else {\n      writer_.write(value);\n    }\n    return out();\n  }\n\n  iterator operator()(const void* value) {\n    if (specs_)\n      check_pointer_type_spec(specs_->type, internal::error_handler());\n    write_pointer(value);\n    return out();\n  }\n};\n\ntemplate <typename Char> FMT_CONSTEXPR bool is_name_start(Char c) {\n  return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || '_' == c;\n}\n\n// Parses the range [begin, end) as an unsigned integer. This function assumes\n// that the range is non-empty and the first character is a digit.\ntemplate <typename Char, typename ErrorHandler>\nFMT_CONSTEXPR int parse_nonnegative_int(const Char*& begin, const Char* end,\n                                        ErrorHandler&& eh) {\n  FMT_ASSERT(begin != end && '0' <= *begin && *begin <= '9', \"\");\n  unsigned value = 0;\n  // Convert to unsigned to prevent a warning.\n  constexpr unsigned max_int = max_value<int>();\n  unsigned big = max_int / 10;\n  do {\n    // Check for overflow.\n    if (value > big) {\n      value = max_int + 1;\n      break;\n    }\n    value = value * 10 + unsigned(*begin - '0');\n    ++begin;\n  } while (begin != end && '0' <= *begin && *begin <= '9');\n  if (value > max_int) eh.on_error(\"number is too big\");\n  return static_cast<int>(value);\n}\n\ntemplate <typename Context> class custom_formatter {\n private:\n  using char_type = typename Context::char_type;\n\n  basic_format_parse_context<char_type>& parse_ctx_;\n  Context& ctx_;\n\n public:\n  explicit custom_formatter(basic_format_parse_context<char_type>& parse_ctx,\n                            Context& ctx)\n      : parse_ctx_(parse_ctx), ctx_(ctx) {}\n\n  bool operator()(typename basic_format_arg<Context>::handle h) const {\n    h.format(parse_ctx_, ctx_);\n    return true;\n  }\n\n  template <typename T> bool operator()(T) const { return false; }\n};\n\ntemplate <typename T>\nusing is_integer =\n    bool_constant<is_integral<T>::value && !std::is_same<T, bool>::value &&\n                  !std::is_same<T, char>::value &&\n                  !std::is_same<T, wchar_t>::value>;\n\ntemplate <typename ErrorHandler> class width_checker {\n public:\n  explicit FMT_CONSTEXPR width_checker(ErrorHandler& eh) : handler_(eh) {}\n\n  template <typename T, FMT_ENABLE_IF(is_integer<T>::value)>\n  FMT_CONSTEXPR unsigned long long operator()(T value) {\n    if (is_negative(value)) handler_.on_error(\"negative width\");\n    return static_cast<unsigned long long>(value);\n  }\n\n  template <typename T, FMT_ENABLE_IF(!is_integer<T>::value)>\n  FMT_CONSTEXPR unsigned long long operator()(T) {\n    handler_.on_error(\"width is not integer\");\n    return 0;\n  }\n\n private:\n  ErrorHandler& handler_;\n};\n\ntemplate <typename ErrorHandler> class precision_checker {\n public:\n  explicit FMT_CONSTEXPR precision_checker(ErrorHandler& eh) : handler_(eh) {}\n\n  template <typename T, FMT_ENABLE_IF(is_integer<T>::value)>\n  FMT_CONSTEXPR unsigned long long operator()(T value) {\n    if (is_negative(value)) handler_.on_error(\"negative precision\");\n    return static_cast<unsigned long long>(value);\n  }\n\n  template <typename T, FMT_ENABLE_IF(!is_integer<T>::value)>\n  FMT_CONSTEXPR unsigned long long operator()(T) {\n    handler_.on_error(\"precision is not integer\");\n    return 0;\n  }\n\n private:\n  ErrorHandler& handler_;\n};\n\n// A format specifier handler that sets fields in basic_format_specs.\ntemplate <typename Char> class specs_setter {\n public:\n  explicit FMT_CONSTEXPR specs_setter(basic_format_specs<Char>& specs)\n      : specs_(specs) {}\n\n  FMT_CONSTEXPR specs_setter(const specs_setter& other)\n      : specs_(other.specs_) {}\n\n  FMT_CONSTEXPR void on_align(align_t align) { specs_.align = align; }\n  FMT_CONSTEXPR void on_fill(basic_string_view<Char> fill) {\n    specs_.fill = fill;\n  }\n  FMT_CONSTEXPR void on_plus() { specs_.sign = sign::plus; }\n  FMT_CONSTEXPR void on_minus() { specs_.sign = sign::minus; }\n  FMT_CONSTEXPR void on_space() { specs_.sign = sign::space; }\n  FMT_CONSTEXPR void on_hash() { specs_.alt = true; }\n\n  FMT_CONSTEXPR void on_zero() {\n    specs_.align = align::numeric;\n    specs_.fill[0] = Char('0');\n  }\n\n  FMT_CONSTEXPR void on_width(int width) { specs_.width = width; }\n  FMT_CONSTEXPR void on_precision(int precision) {\n    specs_.precision = precision;\n  }\n  FMT_CONSTEXPR void end_precision() {}\n\n  FMT_CONSTEXPR void on_type(Char type) {\n    specs_.type = static_cast<char>(type);\n  }\n\n protected:\n  basic_format_specs<Char>& specs_;\n};\n\ntemplate <typename ErrorHandler> class numeric_specs_checker {\n public:\n  FMT_CONSTEXPR numeric_specs_checker(ErrorHandler& eh, internal::type arg_type)\n      : error_handler_(eh), arg_type_(arg_type) {}\n\n  FMT_CONSTEXPR void require_numeric_argument() {\n    if (!is_arithmetic_type(arg_type_))\n      error_handler_.on_error(\"format specifier requires numeric argument\");\n  }\n\n  FMT_CONSTEXPR void check_sign() {\n    require_numeric_argument();\n    if (is_integral_type(arg_type_) && arg_type_ != type::int_type &&\n        arg_type_ != type::long_long_type && arg_type_ != type::char_type) {\n      error_handler_.on_error(\"format specifier requires signed argument\");\n    }\n  }\n\n  FMT_CONSTEXPR void check_precision() {\n    if (is_integral_type(arg_type_) || arg_type_ == type::pointer_type)\n      error_handler_.on_error(\"precision not allowed for this argument type\");\n  }\n\n private:\n  ErrorHandler& error_handler_;\n  internal::type arg_type_;\n};\n\n// A format specifier handler that checks if specifiers are consistent with the\n// argument type.\ntemplate <typename Handler> class specs_checker : public Handler {\n public:\n  FMT_CONSTEXPR specs_checker(const Handler& handler, internal::type arg_type)\n      : Handler(handler), checker_(*this, arg_type) {}\n\n  FMT_CONSTEXPR specs_checker(const specs_checker& other)\n      : Handler(other), checker_(*this, other.arg_type_) {}\n\n  FMT_CONSTEXPR void on_align(align_t align) {\n    if (align == align::numeric) checker_.require_numeric_argument();\n    Handler::on_align(align);\n  }\n\n  FMT_CONSTEXPR void on_plus() {\n    checker_.check_sign();\n    Handler::on_plus();\n  }\n\n  FMT_CONSTEXPR void on_minus() {\n    checker_.check_sign();\n    Handler::on_minus();\n  }\n\n  FMT_CONSTEXPR void on_space() {\n    checker_.check_sign();\n    Handler::on_space();\n  }\n\n  FMT_CONSTEXPR void on_hash() {\n    checker_.require_numeric_argument();\n    Handler::on_hash();\n  }\n\n  FMT_CONSTEXPR void on_zero() {\n    checker_.require_numeric_argument();\n    Handler::on_zero();\n  }\n\n  FMT_CONSTEXPR void end_precision() { checker_.check_precision(); }\n\n private:\n  numeric_specs_checker<Handler> checker_;\n};\n\ntemplate <template <typename> class Handler, typename FormatArg,\n          typename ErrorHandler>\nFMT_CONSTEXPR int get_dynamic_spec(FormatArg arg, ErrorHandler eh) {\n  unsigned long long value = visit_format_arg(Handler<ErrorHandler>(eh), arg);\n  if (value > to_unsigned(max_value<int>())) eh.on_error(\"number is too big\");\n  return static_cast<int>(value);\n}\n\nstruct auto_id {};\n\ntemplate <typename Context>\nFMT_CONSTEXPR typename Context::format_arg get_arg(Context& ctx, int id) {\n  auto arg = ctx.arg(id);\n  if (!arg) ctx.on_error(\"argument index out of range\");\n  return arg;\n}\n\n// The standard format specifier handler with checking.\ntemplate <typename ParseContext, typename Context>\nclass specs_handler : public specs_setter<typename Context::char_type> {\n public:\n  using char_type = typename Context::char_type;\n\n  FMT_CONSTEXPR specs_handler(basic_format_specs<char_type>& specs,\n                              ParseContext& parse_ctx, Context& ctx)\n      : specs_setter<char_type>(specs),\n        parse_context_(parse_ctx),\n        context_(ctx) {}\n\n  template <typename Id> FMT_CONSTEXPR void on_dynamic_width(Id arg_id) {\n    this->specs_.width = get_dynamic_spec<width_checker>(\n        get_arg(arg_id), context_.error_handler());\n  }\n\n  template <typename Id> FMT_CONSTEXPR void on_dynamic_precision(Id arg_id) {\n    this->specs_.precision = get_dynamic_spec<precision_checker>(\n        get_arg(arg_id), context_.error_handler());\n  }\n\n  void on_error(const char* message) { context_.on_error(message); }\n\n private:\n  // This is only needed for compatibility with gcc 4.4.\n  using format_arg = typename Context::format_arg;\n\n  FMT_CONSTEXPR format_arg get_arg(auto_id) {\n    return internal::get_arg(context_, parse_context_.next_arg_id());\n  }\n\n  FMT_CONSTEXPR format_arg get_arg(int arg_id) {\n    parse_context_.check_arg_id(arg_id);\n    return internal::get_arg(context_, arg_id);\n  }\n\n  FMT_CONSTEXPR format_arg get_arg(basic_string_view<char_type> arg_id) {\n    parse_context_.check_arg_id(arg_id);\n    return context_.arg(arg_id);\n  }\n\n  ParseContext& parse_context_;\n  Context& context_;\n};\n\nenum class arg_id_kind { none, index, name };\n\n// An argument reference.\ntemplate <typename Char> struct arg_ref {\n  FMT_CONSTEXPR arg_ref() : kind(arg_id_kind::none), val() {}\n\n  FMT_CONSTEXPR explicit arg_ref(int index)\n      : kind(arg_id_kind::index), val(index) {}\n  FMT_CONSTEXPR explicit arg_ref(basic_string_view<Char> name)\n      : kind(arg_id_kind::name), val(name) {}\n\n  FMT_CONSTEXPR arg_ref& operator=(int idx) {\n    kind = arg_id_kind::index;\n    val.index = idx;\n    return *this;\n  }\n\n  arg_id_kind kind;\n  union value {\n    FMT_CONSTEXPR value(int id = 0) : index{id} {}\n    FMT_CONSTEXPR value(basic_string_view<Char> n) : name(n) {}\n\n    int index;\n    basic_string_view<Char> name;\n  } val;\n};\n\n// Format specifiers with width and precision resolved at formatting rather\n// than parsing time to allow re-using the same parsed specifiers with\n// different sets of arguments (precompilation of format strings).\ntemplate <typename Char>\nstruct dynamic_format_specs : basic_format_specs<Char> {\n  arg_ref<Char> width_ref;\n  arg_ref<Char> precision_ref;\n};\n\n// Format spec handler that saves references to arguments representing dynamic\n// width and precision to be resolved at formatting time.\ntemplate <typename ParseContext>\nclass dynamic_specs_handler\n    : public specs_setter<typename ParseContext::char_type> {\n public:\n  using char_type = typename ParseContext::char_type;\n\n  FMT_CONSTEXPR dynamic_specs_handler(dynamic_format_specs<char_type>& specs,\n                                      ParseContext& ctx)\n      : specs_setter<char_type>(specs), specs_(specs), context_(ctx) {}\n\n  FMT_CONSTEXPR dynamic_specs_handler(const dynamic_specs_handler& other)\n      : specs_setter<char_type>(other),\n        specs_(other.specs_),\n        context_(other.context_) {}\n\n  template <typename Id> FMT_CONSTEXPR void on_dynamic_width(Id arg_id) {\n    specs_.width_ref = make_arg_ref(arg_id);\n  }\n\n  template <typename Id> FMT_CONSTEXPR void on_dynamic_precision(Id arg_id) {\n    specs_.precision_ref = make_arg_ref(arg_id);\n  }\n\n  FMT_CONSTEXPR void on_error(const char* message) {\n    context_.on_error(message);\n  }\n\n private:\n  using arg_ref_type = arg_ref<char_type>;\n\n  FMT_CONSTEXPR arg_ref_type make_arg_ref(int arg_id) {\n    context_.check_arg_id(arg_id);\n    return arg_ref_type(arg_id);\n  }\n\n  FMT_CONSTEXPR arg_ref_type make_arg_ref(auto_id) {\n    return arg_ref_type(context_.next_arg_id());\n  }\n\n  FMT_CONSTEXPR arg_ref_type make_arg_ref(basic_string_view<char_type> arg_id) {\n    context_.check_arg_id(arg_id);\n    basic_string_view<char_type> format_str(\n        context_.begin(), to_unsigned(context_.end() - context_.begin()));\n    return arg_ref_type(arg_id);\n  }\n\n  dynamic_format_specs<char_type>& specs_;\n  ParseContext& context_;\n};\n\ntemplate <typename Char, typename IDHandler>\nFMT_CONSTEXPR const Char* parse_arg_id(const Char* begin, const Char* end,\n                                       IDHandler&& handler) {\n  FMT_ASSERT(begin != end, \"\");\n  Char c = *begin;\n  if (c == '}' || c == ':') {\n    handler();\n    return begin;\n  }\n  if (c >= '0' && c <= '9') {\n    int index = 0;\n    if (c != '0')\n      index = parse_nonnegative_int(begin, end, handler);\n    else\n      ++begin;\n    if (begin == end || (*begin != '}' && *begin != ':'))\n      handler.on_error(\"invalid format string\");\n    else\n      handler(index);\n    return begin;\n  }\n  if (!is_name_start(c)) {\n    handler.on_error(\"invalid format string\");\n    return begin;\n  }\n  auto it = begin;\n  do {\n    ++it;\n  } while (it != end && (is_name_start(c = *it) || ('0' <= c && c <= '9')));\n  handler(basic_string_view<Char>(begin, to_unsigned(it - begin)));\n  return it;\n}\n\n// Adapts SpecHandler to IDHandler API for dynamic width.\ntemplate <typename SpecHandler, typename Char> struct width_adapter {\n  explicit FMT_CONSTEXPR width_adapter(SpecHandler& h) : handler(h) {}\n\n  FMT_CONSTEXPR void operator()() { handler.on_dynamic_width(auto_id()); }\n  FMT_CONSTEXPR void operator()(int id) { handler.on_dynamic_width(id); }\n  FMT_CONSTEXPR void operator()(basic_string_view<Char> id) {\n    handler.on_dynamic_width(id);\n  }\n\n  FMT_CONSTEXPR void on_error(const char* message) {\n    handler.on_error(message);\n  }\n\n  SpecHandler& handler;\n};\n\n// Adapts SpecHandler to IDHandler API for dynamic precision.\ntemplate <typename SpecHandler, typename Char> struct precision_adapter {\n  explicit FMT_CONSTEXPR precision_adapter(SpecHandler& h) : handler(h) {}\n\n  FMT_CONSTEXPR void operator()() { handler.on_dynamic_precision(auto_id()); }\n  FMT_CONSTEXPR void operator()(int id) { handler.on_dynamic_precision(id); }\n  FMT_CONSTEXPR void operator()(basic_string_view<Char> id) {\n    handler.on_dynamic_precision(id);\n  }\n\n  FMT_CONSTEXPR void on_error(const char* message) {\n    handler.on_error(message);\n  }\n\n  SpecHandler& handler;\n};\n\ntemplate <typename Char>\nFMT_CONSTEXPR const Char* next_code_point(const Char* begin, const Char* end) {\n  if (const_check(sizeof(Char) != 1) || (*begin & 0x80) == 0) return begin + 1;\n  do {\n    ++begin;\n  } while (begin != end && (*begin & 0xc0) == 0x80);\n  return begin;\n}\n\n// Parses fill and alignment.\ntemplate <typename Char, typename Handler>\nFMT_CONSTEXPR const Char* parse_align(const Char* begin, const Char* end,\n                                      Handler&& handler) {\n  FMT_ASSERT(begin != end, \"\");\n  auto align = align::none;\n  auto p = next_code_point(begin, end);\n  if (p == end) p = begin;\n  for (;;) {\n    switch (static_cast<char>(*p)) {\n    case '<':\n      align = align::left;\n      break;\n    case '>':\n      align = align::right;\n      break;\n#if FMT_NUMERIC_ALIGN\n    case '=':\n      align = align::numeric;\n      break;\n#endif\n    case '^':\n      align = align::center;\n      break;\n    }\n    if (align != align::none) {\n      if (p != begin) {\n        auto c = *begin;\n        if (c == '{')\n          return handler.on_error(\"invalid fill character '{'\"), begin;\n        handler.on_fill(basic_string_view<Char>(begin, to_unsigned(p - begin)));\n        begin = p + 1;\n      } else\n        ++begin;\n      handler.on_align(align);\n      break;\n    } else if (p == begin) {\n      break;\n    }\n    p = begin;\n  }\n  return begin;\n}\n\ntemplate <typename Char, typename Handler>\nFMT_CONSTEXPR const Char* parse_width(const Char* begin, const Char* end,\n                                      Handler&& handler) {\n  FMT_ASSERT(begin != end, \"\");\n  if ('0' <= *begin && *begin <= '9') {\n    handler.on_width(parse_nonnegative_int(begin, end, handler));\n  } else if (*begin == '{') {\n    ++begin;\n    if (begin != end)\n      begin = parse_arg_id(begin, end, width_adapter<Handler, Char>(handler));\n    if (begin == end || *begin != '}')\n      return handler.on_error(\"invalid format string\"), begin;\n    ++begin;\n  }\n  return begin;\n}\n\ntemplate <typename Char, typename Handler>\nFMT_CONSTEXPR const Char* parse_precision(const Char* begin, const Char* end,\n                                          Handler&& handler) {\n  ++begin;\n  auto c = begin != end ? *begin : Char();\n  if ('0' <= c && c <= '9') {\n    handler.on_precision(parse_nonnegative_int(begin, end, handler));\n  } else if (c == '{') {\n    ++begin;\n    if (begin != end) {\n      begin =\n          parse_arg_id(begin, end, precision_adapter<Handler, Char>(handler));\n    }\n    if (begin == end || *begin++ != '}')\n      return handler.on_error(\"invalid format string\"), begin;\n  } else {\n    return handler.on_error(\"missing precision specifier\"), begin;\n  }\n  handler.end_precision();\n  return begin;\n}\n\n// Parses standard format specifiers and sends notifications about parsed\n// components to handler.\ntemplate <typename Char, typename SpecHandler>\nFMT_CONSTEXPR const Char* parse_format_specs(const Char* begin, const Char* end,\n                                             SpecHandler&& handler) {\n  if (begin == end || *begin == '}') return begin;\n\n  begin = parse_align(begin, end, handler);\n  if (begin == end) return begin;\n\n  // Parse sign.\n  switch (static_cast<char>(*begin)) {\n  case '+':\n    handler.on_plus();\n    ++begin;\n    break;\n  case '-':\n    handler.on_minus();\n    ++begin;\n    break;\n  case ' ':\n    handler.on_space();\n    ++begin;\n    break;\n  }\n  if (begin == end) return begin;\n\n  if (*begin == '#') {\n    handler.on_hash();\n    if (++begin == end) return begin;\n  }\n\n  // Parse zero flag.\n  if (*begin == '0') {\n    handler.on_zero();\n    if (++begin == end) return begin;\n  }\n\n  begin = parse_width(begin, end, handler);\n  if (begin == end) return begin;\n\n  // Parse precision.\n  if (*begin == '.') {\n    begin = parse_precision(begin, end, handler);\n  }\n\n  // Parse type.\n  if (begin != end && *begin != '}') handler.on_type(*begin++);\n  return begin;\n}\n\n// Return the result via the out param to workaround gcc bug 77539.\ntemplate <bool IS_CONSTEXPR, typename T, typename Ptr = const T*>\nFMT_CONSTEXPR bool find(Ptr first, Ptr last, T value, Ptr& out) {\n  for (out = first; out != last; ++out) {\n    if (*out == value) return true;\n  }\n  return false;\n}\n\ntemplate <>\ninline bool find<false, char>(const char* first, const char* last, char value,\n                              const char*& out) {\n  out = static_cast<const char*>(\n      std::memchr(first, value, internal::to_unsigned(last - first)));\n  return out != nullptr;\n}\n\ntemplate <typename Handler, typename Char> struct id_adapter {\n  FMT_CONSTEXPR void operator()() { handler.on_arg_id(); }\n  FMT_CONSTEXPR void operator()(int id) { handler.on_arg_id(id); }\n  FMT_CONSTEXPR void operator()(basic_string_view<Char> id) {\n    handler.on_arg_id(id);\n  }\n  FMT_CONSTEXPR void on_error(const char* message) {\n    handler.on_error(message);\n  }\n  Handler& handler;\n};\n\ntemplate <bool IS_CONSTEXPR, typename Char, typename Handler>\nFMT_CONSTEXPR void parse_format_string(basic_string_view<Char> format_str,\n                                       Handler&& handler) {\n  struct pfs_writer {\n    FMT_CONSTEXPR void operator()(const Char* begin, const Char* end) {\n      if (begin == end) return;\n      for (;;) {\n        const Char* p = nullptr;\n        if (!find<IS_CONSTEXPR>(begin, end, '}', p))\n          return handler_.on_text(begin, end);\n        ++p;\n        if (p == end || *p != '}')\n          return handler_.on_error(\"unmatched '}' in format string\");\n        handler_.on_text(begin, p);\n        begin = p + 1;\n      }\n    }\n    Handler& handler_;\n  } write{handler};\n  auto begin = format_str.data();\n  auto end = begin + format_str.size();\n  while (begin != end) {\n    // Doing two passes with memchr (one for '{' and another for '}') is up to\n    // 2.5x faster than the naive one-pass implementation on big format strings.\n    const Char* p = begin;\n    if (*begin != '{' && !find<IS_CONSTEXPR>(begin + 1, end, '{', p))\n      return write(begin, end);\n    write(begin, p);\n    ++p;\n    if (p == end) return handler.on_error(\"invalid format string\");\n    if (static_cast<char>(*p) == '}') {\n      handler.on_arg_id();\n      handler.on_replacement_field(p);\n    } else if (*p == '{') {\n      handler.on_text(p, p + 1);\n    } else {\n      p = parse_arg_id(p, end, id_adapter<Handler, Char>{handler});\n      Char c = p != end ? *p : Char();\n      if (c == '}') {\n        handler.on_replacement_field(p);\n      } else if (c == ':') {\n        p = handler.on_format_specs(p + 1, end);\n        if (p == end || *p != '}')\n          return handler.on_error(\"unknown format specifier\");\n      } else {\n        return handler.on_error(\"missing '}' in format string\");\n      }\n    }\n    begin = p + 1;\n  }\n}\n\ntemplate <typename T, typename ParseContext>\nFMT_CONSTEXPR const typename ParseContext::char_type* parse_format_specs(\n    ParseContext& ctx) {\n  using char_type = typename ParseContext::char_type;\n  using context = buffer_context<char_type>;\n  using mapped_type =\n      conditional_t<internal::mapped_type_constant<T, context>::value !=\n                        type::custom_type,\n                    decltype(arg_mapper<context>().map(std::declval<T>())), T>;\n  auto f = conditional_t<has_formatter<mapped_type, context>::value,\n                         formatter<mapped_type, char_type>,\n                         internal::fallback_formatter<T, char_type>>();\n  return f.parse(ctx);\n}\n\ntemplate <typename Char, typename ErrorHandler, typename... Args>\nclass format_string_checker {\n public:\n  explicit FMT_CONSTEXPR format_string_checker(\n      basic_string_view<Char> format_str, ErrorHandler eh)\n      : arg_id_(-1),\n        context_(format_str, eh),\n        parse_funcs_{&parse_format_specs<Args, parse_context_type>...} {}\n\n  FMT_CONSTEXPR void on_text(const Char*, const Char*) {}\n\n  FMT_CONSTEXPR void on_arg_id() {\n    arg_id_ = context_.next_arg_id();\n    check_arg_id();\n  }\n  FMT_CONSTEXPR void on_arg_id(int id) {\n    arg_id_ = id;\n    context_.check_arg_id(id);\n    check_arg_id();\n  }\n  FMT_CONSTEXPR void on_arg_id(basic_string_view<Char>) {\n    on_error(\"compile-time checks don't support named arguments\");\n  }\n\n  FMT_CONSTEXPR void on_replacement_field(const Char*) {}\n\n  FMT_CONSTEXPR const Char* on_format_specs(const Char* begin, const Char*) {\n    advance_to(context_, begin);\n    return arg_id_ < num_args ? parse_funcs_[arg_id_](context_) : begin;\n  }\n\n  FMT_CONSTEXPR void on_error(const char* message) {\n    context_.on_error(message);\n  }\n\n private:\n  using parse_context_type = basic_format_parse_context<Char, ErrorHandler>;\n  enum { num_args = sizeof...(Args) };\n\n  FMT_CONSTEXPR void check_arg_id() {\n    if (arg_id_ >= num_args) context_.on_error(\"argument index out of range\");\n  }\n\n  // Format specifier parsing function.\n  using parse_func = const Char* (*)(parse_context_type&);\n\n  int arg_id_;\n  parse_context_type context_;\n  parse_func parse_funcs_[num_args > 0 ? num_args : 1];\n};\n\ntemplate <typename Char, typename ErrorHandler, typename... Args>\nFMT_CONSTEXPR bool do_check_format_string(basic_string_view<Char> s,\n                                          ErrorHandler eh = ErrorHandler()) {\n  format_string_checker<Char, ErrorHandler, Args...> checker(s, eh);\n  parse_format_string<true>(s, checker);\n  return true;\n}\n\ntemplate <typename... Args, typename S,\n          enable_if_t<(is_compile_string<S>::value), int>>\nvoid check_format_string(S format_str) {\n  FMT_CONSTEXPR_DECL bool invalid_format = internal::do_check_format_string<\n      typename S::char_type, internal::error_handler,\n      remove_const_t<remove_reference_t<Args>>...>(to_string_view(format_str));\n  (void)invalid_format;\n}\n\ntemplate <template <typename> class Handler, typename Context>\nvoid handle_dynamic_spec(int& value, arg_ref<typename Context::char_type> ref,\n                         Context& ctx) {\n  switch (ref.kind) {\n  case arg_id_kind::none:\n    break;\n  case arg_id_kind::index:\n    value = internal::get_dynamic_spec<Handler>(ctx.arg(ref.val.index),\n                                                ctx.error_handler());\n    break;\n  case arg_id_kind::name:\n    value = internal::get_dynamic_spec<Handler>(ctx.arg(ref.val.name),\n                                                ctx.error_handler());\n    break;\n  }\n}\n\nusing format_func = void (*)(internal::buffer<char>&, int, string_view);\n\nFMT_API void format_error_code(buffer<char>& out, int error_code,\n                               string_view message) FMT_NOEXCEPT;\n\nFMT_API void report_error(format_func func, int error_code,\n                          string_view message) FMT_NOEXCEPT;\n}  // namespace internal\n\ntemplate <typename Range>\nusing basic_writer FMT_DEPRECATED_ALIAS = internal::basic_writer<Range>;\nusing writer FMT_DEPRECATED_ALIAS = internal::writer;\nusing wwriter FMT_DEPRECATED_ALIAS =\n    internal::basic_writer<buffer_range<wchar_t>>;\n\n/** The default argument formatter. */\ntemplate <typename Range>\nclass arg_formatter : public internal::arg_formatter_base<Range> {\n private:\n  using char_type = typename Range::value_type;\n  using base = internal::arg_formatter_base<Range>;\n  using context_type = basic_format_context<typename base::iterator, char_type>;\n\n  context_type& ctx_;\n  basic_format_parse_context<char_type>* parse_ctx_;\n\n public:\n  using range = Range;\n  using iterator = typename base::iterator;\n  using format_specs = typename base::format_specs;\n\n  /**\n    \\rst\n    Constructs an argument formatter object.\n    *ctx* is a reference to the formatting context,\n    *specs* contains format specifier information for standard argument types.\n    \\endrst\n   */\n  explicit arg_formatter(\n      context_type& ctx,\n      basic_format_parse_context<char_type>* parse_ctx = nullptr,\n      format_specs* specs = nullptr)\n      : base(Range(ctx.out()), specs, ctx.locale()),\n        ctx_(ctx),\n        parse_ctx_(parse_ctx) {}\n\n  using base::operator();\n\n  /** Formats an argument of a user-defined type. */\n  iterator operator()(typename basic_format_arg<context_type>::handle handle) {\n    handle.format(*parse_ctx_, ctx_);\n    return ctx_.out();\n  }\n};\n\n/**\n An error returned by an operating system or a language runtime,\n for example a file opening error.\n*/\nFMT_CLASS_API\nclass FMT_API system_error : public std::runtime_error {\n private:\n  void init(int err_code, string_view format_str, format_args args);\n\n protected:\n  int error_code_;\n\n  system_error() : std::runtime_error(\"\"), error_code_(0) {}\n\n public:\n  /**\n   \\rst\n   Constructs a :class:`fmt::system_error` object with a description\n   formatted with `fmt::format_system_error`. *message* and additional\n   arguments passed into the constructor are formatted similarly to\n   `fmt::format`.\n\n   **Example**::\n\n     // This throws a system_error with the description\n     //   cannot open file 'madeup': No such file or directory\n     // or similar (system message may vary).\n     const char *filename = \"madeup\";\n     std::FILE *file = std::fopen(filename, \"r\");\n     if (!file)\n       throw fmt::system_error(errno, \"cannot open file '{}'\", filename);\n   \\endrst\n  */\n  template <typename... Args>\n  system_error(int error_code, string_view message, const Args&... args)\n      : std::runtime_error(\"\") {\n    init(error_code, message, make_format_args(args...));\n  }\n  system_error(const system_error&) = default;\n  system_error& operator=(const system_error&) = default;\n  system_error(system_error&&) = default;\n  system_error& operator=(system_error&&) = default;\n  ~system_error() FMT_NOEXCEPT FMT_OVERRIDE;\n\n  int error_code() const { return error_code_; }\n};\n\n/**\n  \\rst\n  Formats an error returned by an operating system or a language runtime,\n  for example a file opening error, and writes it to *out* in the following\n  form:\n\n  .. parsed-literal::\n     *<message>*: *<system-message>*\n\n  where *<message>* is the passed message and *<system-message>* is\n  the system message corresponding to the error code.\n  *error_code* is a system error code as given by ``errno``.\n  If *error_code* is not a valid error code such as -1, the system message\n  may look like \"Unknown error -1\" and is platform-dependent.\n  \\endrst\n */\nFMT_API void format_system_error(internal::buffer<char>& out, int error_code,\n                                 string_view message) FMT_NOEXCEPT;\n\n// Reports a system error without throwing an exception.\n// Can be used to report errors from destructors.\nFMT_API void report_system_error(int error_code,\n                                 string_view message) FMT_NOEXCEPT;\n\n/** Fast integer formatter. */\nclass format_int {\n private:\n  // Buffer should be large enough to hold all digits (digits10 + 1),\n  // a sign and a null character.\n  enum { buffer_size = std::numeric_limits<unsigned long long>::digits10 + 3 };\n  mutable char buffer_[buffer_size];\n  char* str_;\n\n  // Formats value in reverse and returns a pointer to the beginning.\n  char* format_decimal(unsigned long long value) {\n    char* ptr = buffer_ + (buffer_size - 1);  // Parens to workaround MSVC bug.\n    while (value >= 100) {\n      // Integer division is slow so do it for a group of two digits instead\n      // of for every digit. The idea comes from the talk by Alexandrescu\n      // \"Three Optimization Tips for C++\". See speed-test for a comparison.\n      auto index = static_cast<unsigned>((value % 100) * 2);\n      value /= 100;\n      *--ptr = internal::data::digits[index + 1];\n      *--ptr = internal::data::digits[index];\n    }\n    if (value < 10) {\n      *--ptr = static_cast<char>('0' + value);\n      return ptr;\n    }\n    auto index = static_cast<unsigned>(value * 2);\n    *--ptr = internal::data::digits[index + 1];\n    *--ptr = internal::data::digits[index];\n    return ptr;\n  }\n\n  void format_signed(long long value) {\n    auto abs_value = static_cast<unsigned long long>(value);\n    bool negative = value < 0;\n    if (negative) abs_value = 0 - abs_value;\n    str_ = format_decimal(abs_value);\n    if (negative) *--str_ = '-';\n  }\n\n public:\n  explicit format_int(int value) { format_signed(value); }\n  explicit format_int(long value) { format_signed(value); }\n  explicit format_int(long long value) { format_signed(value); }\n  explicit format_int(unsigned value) : str_(format_decimal(value)) {}\n  explicit format_int(unsigned long value) : str_(format_decimal(value)) {}\n  explicit format_int(unsigned long long value) : str_(format_decimal(value)) {}\n\n  /** Returns the number of characters written to the output buffer. */\n  std::size_t size() const {\n    return internal::to_unsigned(buffer_ - str_ + buffer_size - 1);\n  }\n\n  /**\n    Returns a pointer to the output buffer content. No terminating null\n    character is appended.\n   */\n  const char* data() const { return str_; }\n\n  /**\n    Returns a pointer to the output buffer content with terminating null\n    character appended.\n   */\n  const char* c_str() const {\n    buffer_[buffer_size - 1] = '\\0';\n    return str_;\n  }\n\n  /**\n    \\rst\n    Returns the content of the output buffer as an ``std::string``.\n    \\endrst\n   */\n  std::string str() const { return std::string(str_, size()); }\n};\n\n// A formatter specialization for the core types corresponding to internal::type\n// constants.\ntemplate <typename T, typename Char>\nstruct formatter<T, Char,\n                 enable_if_t<internal::type_constant<T, Char>::value !=\n                             internal::type::custom_type>> {\n  FMT_CONSTEXPR formatter() = default;\n\n  // Parses format specifiers stopping either at the end of the range or at the\n  // terminating '}'.\n  template <typename ParseContext>\n  FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {\n    using handler_type = internal::dynamic_specs_handler<ParseContext>;\n    auto type = internal::type_constant<T, Char>::value;\n    internal::specs_checker<handler_type> handler(handler_type(specs_, ctx),\n                                                  type);\n    auto it = parse_format_specs(ctx.begin(), ctx.end(), handler);\n    auto eh = ctx.error_handler();\n    switch (type) {\n    case internal::type::none_type:\n    case internal::type::named_arg_type:\n      FMT_ASSERT(false, \"invalid argument type\");\n      break;\n    case internal::type::int_type:\n    case internal::type::uint_type:\n    case internal::type::long_long_type:\n    case internal::type::ulong_long_type:\n    case internal::type::int128_type:\n    case internal::type::uint128_type:\n    case internal::type::bool_type:\n      handle_int_type_spec(specs_.type,\n                           internal::int_type_checker<decltype(eh)>(eh));\n      break;\n    case internal::type::char_type:\n      handle_char_specs(\n          &specs_, internal::char_specs_checker<decltype(eh)>(specs_.type, eh));\n      break;\n    case internal::type::float_type:\n      if (internal::const_check(FMT_USE_FLOAT)) {\n        internal::parse_float_type_spec(specs_, eh);\n      } else {\n        FMT_ASSERT(false, \"float support disabled\");\n      }\n      break;\n    case internal::type::double_type:\n      if (internal::const_check(FMT_USE_DOUBLE)) {\n        internal::parse_float_type_spec(specs_, eh);\n      } else {\n        FMT_ASSERT(false, \"double support disabled\");\n      }\n      break;\n    case internal::type::long_double_type:\n      if (internal::const_check(FMT_USE_LONG_DOUBLE)) {\n        internal::parse_float_type_spec(specs_, eh);\n      } else {\n        FMT_ASSERT(false, \"long double support disabled\");\n      }\n      break;\n    case internal::type::cstring_type:\n      internal::handle_cstring_type_spec(\n          specs_.type, internal::cstring_type_checker<decltype(eh)>(eh));\n      break;\n    case internal::type::string_type:\n      internal::check_string_type_spec(specs_.type, eh);\n      break;\n    case internal::type::pointer_type:\n      internal::check_pointer_type_spec(specs_.type, eh);\n      break;\n    case internal::type::custom_type:\n      // Custom format specifiers should be checked in parse functions of\n      // formatter specializations.\n      break;\n    }\n    return it;\n  }\n\n  template <typename FormatContext>\n  auto format(const T& val, FormatContext& ctx) -> decltype(ctx.out()) {\n    internal::handle_dynamic_spec<internal::width_checker>(\n        specs_.width, specs_.width_ref, ctx);\n    internal::handle_dynamic_spec<internal::precision_checker>(\n        specs_.precision, specs_.precision_ref, ctx);\n    using range_type =\n        internal::output_range<typename FormatContext::iterator,\n                               typename FormatContext::char_type>;\n    return visit_format_arg(arg_formatter<range_type>(ctx, nullptr, &specs_),\n                            internal::make_arg<FormatContext>(val));\n  }\n\n private:\n  internal::dynamic_format_specs<Char> specs_;\n};\n\n#define FMT_FORMAT_AS(Type, Base)                                             \\\n  template <typename Char>                                                    \\\n  struct formatter<Type, Char> : formatter<Base, Char> {                      \\\n    template <typename FormatContext>                                         \\\n    auto format(Type const& val, FormatContext& ctx) -> decltype(ctx.out()) { \\\n      return formatter<Base, Char>::format(val, ctx);                         \\\n    }                                                                         \\\n  }\n\nFMT_FORMAT_AS(signed char, int);\nFMT_FORMAT_AS(unsigned char, unsigned);\nFMT_FORMAT_AS(short, int);\nFMT_FORMAT_AS(unsigned short, unsigned);\nFMT_FORMAT_AS(long, long long);\nFMT_FORMAT_AS(unsigned long, unsigned long long);\nFMT_FORMAT_AS(Char*, const Char*);\nFMT_FORMAT_AS(std::basic_string<Char>, basic_string_view<Char>);\nFMT_FORMAT_AS(std::nullptr_t, const void*);\nFMT_FORMAT_AS(internal::std_string_view<Char>, basic_string_view<Char>);\n\ntemplate <typename Char>\nstruct formatter<void*, Char> : formatter<const void*, Char> {\n  template <typename FormatContext>\n  auto format(void* val, FormatContext& ctx) -> decltype(ctx.out()) {\n    return formatter<const void*, Char>::format(val, ctx);\n  }\n};\n\ntemplate <typename Char, size_t N>\nstruct formatter<Char[N], Char> : formatter<basic_string_view<Char>, Char> {\n  template <typename FormatContext>\n  auto format(const Char* val, FormatContext& ctx) -> decltype(ctx.out()) {\n    return formatter<basic_string_view<Char>, Char>::format(val, ctx);\n  }\n};\n\n// A formatter for types known only at run time such as variant alternatives.\n//\n// Usage:\n//   using variant = std::variant<int, std::string>;\n//   template <>\n//   struct formatter<variant>: dynamic_formatter<> {\n//     void format(buffer &buf, const variant &v, context &ctx) {\n//       visit([&](const auto &val) { format(buf, val, ctx); }, v);\n//     }\n//   };\ntemplate <typename Char = char> class dynamic_formatter {\n private:\n  struct null_handler : internal::error_handler {\n    void on_align(align_t) {}\n    void on_plus() {}\n    void on_minus() {}\n    void on_space() {}\n    void on_hash() {}\n  };\n\n public:\n  template <typename ParseContext>\n  auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {\n    format_str_ = ctx.begin();\n    // Checks are deferred to formatting time when the argument type is known.\n    internal::dynamic_specs_handler<ParseContext> handler(specs_, ctx);\n    return parse_format_specs(ctx.begin(), ctx.end(), handler);\n  }\n\n  template <typename T, typename FormatContext>\n  auto format(const T& val, FormatContext& ctx) -> decltype(ctx.out()) {\n    handle_specs(ctx);\n    internal::specs_checker<null_handler> checker(\n        null_handler(),\n        internal::mapped_type_constant<T, FormatContext>::value);\n    checker.on_align(specs_.align);\n    switch (specs_.sign) {\n    case sign::none:\n      break;\n    case sign::plus:\n      checker.on_plus();\n      break;\n    case sign::minus:\n      checker.on_minus();\n      break;\n    case sign::space:\n      checker.on_space();\n      break;\n    }\n    if (specs_.alt) checker.on_hash();\n    if (specs_.precision >= 0) checker.end_precision();\n    using range = internal::output_range<typename FormatContext::iterator,\n                                         typename FormatContext::char_type>;\n    visit_format_arg(arg_formatter<range>(ctx, nullptr, &specs_),\n                     internal::make_arg<FormatContext>(val));\n    return ctx.out();\n  }\n\n private:\n  template <typename Context> void handle_specs(Context& ctx) {\n    internal::handle_dynamic_spec<internal::width_checker>(\n        specs_.width, specs_.width_ref, ctx);\n    internal::handle_dynamic_spec<internal::precision_checker>(\n        specs_.precision, specs_.precision_ref, ctx);\n  }\n\n  internal::dynamic_format_specs<Char> specs_;\n  const Char* format_str_;\n};\n\ntemplate <typename Range, typename Char>\ntypename basic_format_context<Range, Char>::format_arg\nbasic_format_context<Range, Char>::arg(basic_string_view<char_type> name) {\n  map_.init(args_);\n  format_arg arg = map_.find(name);\n  if (arg.type() == internal::type::none_type)\n    this->on_error(\"argument not found\");\n  return arg;\n}\n\ntemplate <typename Char, typename ErrorHandler>\nFMT_CONSTEXPR void advance_to(\n    basic_format_parse_context<Char, ErrorHandler>& ctx, const Char* p) {\n  ctx.advance_to(ctx.begin() + (p - &*ctx.begin()));\n}\n\ntemplate <typename ArgFormatter, typename Char, typename Context>\nstruct format_handler : internal::error_handler {\n  using range = typename ArgFormatter::range;\n\n  format_handler(range r, basic_string_view<Char> str,\n                 basic_format_args<Context> format_args,\n                 internal::locale_ref loc)\n      : parse_context(str), context(r.begin(), format_args, loc) {}\n\n  void on_text(const Char* begin, const Char* end) {\n    auto size = internal::to_unsigned(end - begin);\n    auto out = context.out();\n    auto&& it = internal::reserve(out, size);\n    it = std::copy_n(begin, size, it);\n    context.advance_to(out);\n  }\n\n  void get_arg(int id) { arg = internal::get_arg(context, id); }\n\n  void on_arg_id() { get_arg(parse_context.next_arg_id()); }\n  void on_arg_id(int id) {\n    parse_context.check_arg_id(id);\n    get_arg(id);\n  }\n  void on_arg_id(basic_string_view<Char> id) { arg = context.arg(id); }\n\n  void on_replacement_field(const Char* p) {\n    advance_to(parse_context, p);\n    context.advance_to(\n        visit_format_arg(ArgFormatter(context, &parse_context), arg));\n  }\n\n  const Char* on_format_specs(const Char* begin, const Char* end) {\n    advance_to(parse_context, begin);\n    internal::custom_formatter<Context> f(parse_context, context);\n    if (visit_format_arg(f, arg)) return parse_context.begin();\n    basic_format_specs<Char> specs;\n    using internal::specs_handler;\n    using parse_context_t = basic_format_parse_context<Char>;\n    internal::specs_checker<specs_handler<parse_context_t, Context>> handler(\n        specs_handler<parse_context_t, Context>(specs, parse_context, context),\n        arg.type());\n    begin = parse_format_specs(begin, end, handler);\n    if (begin == end || *begin != '}') on_error(\"missing '}' in format string\");\n    advance_to(parse_context, begin);\n    context.advance_to(\n        visit_format_arg(ArgFormatter(context, &parse_context, &specs), arg));\n    return begin;\n  }\n\n  basic_format_parse_context<Char> parse_context;\n  Context context;\n  basic_format_arg<Context> arg;\n};\n\n/** Formats arguments and writes the output to the range. */\ntemplate <typename ArgFormatter, typename Char, typename Context>\ntypename Context::iterator vformat_to(\n    typename ArgFormatter::range out, basic_string_view<Char> format_str,\n    basic_format_args<Context> args,\n    internal::locale_ref loc = internal::locale_ref()) {\n  format_handler<ArgFormatter, Char, Context> h(out, format_str, args, loc);\n  internal::parse_format_string<false>(format_str, h);\n  return h.context.out();\n}\n\n// Casts ``p`` to ``const void*`` for pointer formatting.\n// Example:\n//   auto s = format(\"{}\", ptr(p));\ntemplate <typename T> inline const void* ptr(const T* p) { return p; }\ntemplate <typename T> inline const void* ptr(const std::unique_ptr<T>& p) {\n  return p.get();\n}\ntemplate <typename T> inline const void* ptr(const std::shared_ptr<T>& p) {\n  return p.get();\n}\n\nclass bytes {\n private:\n  string_view data_;\n  friend struct formatter<bytes>;\n\n public:\n  explicit bytes(string_view data) : data_(data) {}\n};\n\ntemplate <> struct formatter<bytes> {\n  template <typename ParseContext>\n  FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {\n    using handler_type = internal::dynamic_specs_handler<ParseContext>;\n    internal::specs_checker<handler_type> handler(handler_type(specs_, ctx),\n                                                  internal::type::string_type);\n    auto it = parse_format_specs(ctx.begin(), ctx.end(), handler);\n    internal::check_string_type_spec(specs_.type, ctx.error_handler());\n    return it;\n  }\n\n  template <typename FormatContext>\n  auto format(bytes b, FormatContext& ctx) -> decltype(ctx.out()) {\n    internal::handle_dynamic_spec<internal::width_checker>(\n        specs_.width, specs_.width_ref, ctx);\n    internal::handle_dynamic_spec<internal::precision_checker>(\n        specs_.precision, specs_.precision_ref, ctx);\n    using range_type =\n        internal::output_range<typename FormatContext::iterator, char>;\n    internal::basic_writer<range_type> writer(range_type(ctx.out()));\n    writer.write_bytes(b.data_, specs_);\n    return writer.out();\n  }\n\n private:\n  internal::dynamic_format_specs<char> specs_;\n};\n\ntemplate <typename It, typename Char> struct arg_join : internal::view {\n  It begin;\n  It end;\n  basic_string_view<Char> sep;\n\n  arg_join(It b, It e, basic_string_view<Char> s) : begin(b), end(e), sep(s) {}\n};\n\ntemplate <typename It, typename Char>\nstruct formatter<arg_join<It, Char>, Char>\n    : formatter<typename std::iterator_traits<It>::value_type, Char> {\n  template <typename FormatContext>\n  auto format(const arg_join<It, Char>& value, FormatContext& ctx)\n      -> decltype(ctx.out()) {\n    using base = formatter<typename std::iterator_traits<It>::value_type, Char>;\n    auto it = value.begin;\n    auto out = ctx.out();\n    if (it != value.end) {\n      out = base::format(*it++, ctx);\n      while (it != value.end) {\n        out = std::copy(value.sep.begin(), value.sep.end(), out);\n        ctx.advance_to(out);\n        out = base::format(*it++, ctx);\n      }\n    }\n    return out;\n  }\n};\n\n/**\n  Returns an object that formats the iterator range `[begin, end)` with elements\n  separated by `sep`.\n */\ntemplate <typename It>\narg_join<It, char> join(It begin, It end, string_view sep) {\n  return {begin, end, sep};\n}\n\ntemplate <typename It>\narg_join<It, wchar_t> join(It begin, It end, wstring_view sep) {\n  return {begin, end, sep};\n}\n\n/**\n  \\rst\n  Returns an object that formats `range` with elements separated by `sep`.\n\n  **Example**::\n\n    std::vector<int> v = {1, 2, 3};\n    fmt::print(\"{}\", fmt::join(v, \", \"));\n    // Output: \"1, 2, 3\"\n\n  ``fmt::join`` applies passed format specifiers to the range elements::\n\n    fmt::print(\"{:02}\", fmt::join(v, \", \"));\n    // Output: \"01, 02, 03\"\n  \\endrst\n */\ntemplate <typename Range>\narg_join<internal::iterator_t<const Range>, char> join(const Range& range,\n                                                       string_view sep) {\n  return join(std::begin(range), std::end(range), sep);\n}\n\ntemplate <typename Range>\narg_join<internal::iterator_t<const Range>, wchar_t> join(const Range& range,\n                                                          wstring_view sep) {\n  return join(std::begin(range), std::end(range), sep);\n}\n\n/**\n  \\rst\n  Converts *value* to ``std::string`` using the default format for type *T*.\n\n  **Example**::\n\n    #include <fmt/format.h>\n\n    std::string answer = fmt::to_string(42);\n  \\endrst\n */\ntemplate <typename T> inline std::string to_string(const T& value) {\n  return format(\"{}\", value);\n}\n\n/**\n  Converts *value* to ``std::wstring`` using the default format for type *T*.\n */\ntemplate <typename T> inline std::wstring to_wstring(const T& value) {\n  return format(L\"{}\", value);\n}\n\ntemplate <typename Char, std::size_t SIZE>\nstd::basic_string<Char> to_string(const basic_memory_buffer<Char, SIZE>& buf) {\n  return std::basic_string<Char>(buf.data(), buf.size());\n}\n\ntemplate <typename Char>\ntypename buffer_context<Char>::iterator internal::vformat_to(\n    internal::buffer<Char>& buf, basic_string_view<Char> format_str,\n    basic_format_args<buffer_context<type_identity_t<Char>>> args) {\n  using range = buffer_range<Char>;\n  return vformat_to<arg_formatter<range>>(buf, to_string_view(format_str),\n                                          args);\n}\n\ntemplate <typename S, typename Char = char_t<S>,\n          FMT_ENABLE_IF(internal::is_string<S>::value)>\ninline typename buffer_context<Char>::iterator vformat_to(\n    internal::buffer<Char>& buf, const S& format_str,\n    basic_format_args<buffer_context<type_identity_t<Char>>> args) {\n  return internal::vformat_to(buf, to_string_view(format_str), args);\n}\n\ntemplate <typename S, typename... Args, std::size_t SIZE = inline_buffer_size,\n          typename Char = enable_if_t<internal::is_string<S>::value, char_t<S>>>\ninline typename buffer_context<Char>::iterator format_to(\n    basic_memory_buffer<Char, SIZE>& buf, const S& format_str, Args&&... args) {\n  internal::check_format_string<Args...>(format_str);\n  using context = buffer_context<Char>;\n  return internal::vformat_to(buf, to_string_view(format_str),\n                              make_format_args<context>(args...));\n}\n\ntemplate <typename OutputIt, typename Char = char>\nusing format_context_t = basic_format_context<OutputIt, Char>;\n\ntemplate <typename OutputIt, typename Char = char>\nusing format_args_t = basic_format_args<format_context_t<OutputIt, Char>>;\n\ntemplate <typename S, typename OutputIt, typename... Args,\n          FMT_ENABLE_IF(\n              internal::is_output_iterator<OutputIt>::value &&\n              !internal::is_contiguous_back_insert_iterator<OutputIt>::value)>\ninline OutputIt vformat_to(\n    OutputIt out, const S& format_str,\n    format_args_t<type_identity_t<OutputIt>, char_t<S>> args) {\n  using range = internal::output_range<OutputIt, char_t<S>>;\n  return vformat_to<arg_formatter<range>>(range(out),\n                                          to_string_view(format_str), args);\n}\n\n/**\n \\rst\n Formats arguments, writes the result to the output iterator ``out`` and returns\n the iterator past the end of the output range.\n\n **Example**::\n\n   std::vector<char> out;\n   fmt::format_to(std::back_inserter(out), \"{}\", 42);\n \\endrst\n */\ntemplate <typename OutputIt, typename S, typename... Args,\n          FMT_ENABLE_IF(\n              internal::is_output_iterator<OutputIt>::value &&\n              !internal::is_contiguous_back_insert_iterator<OutputIt>::value &&\n              internal::is_string<S>::value)>\ninline OutputIt format_to(OutputIt out, const S& format_str, Args&&... args) {\n  internal::check_format_string<Args...>(format_str);\n  using context = format_context_t<OutputIt, char_t<S>>;\n  return vformat_to(out, to_string_view(format_str),\n                    make_format_args<context>(args...));\n}\n\ntemplate <typename OutputIt> struct format_to_n_result {\n  /** Iterator past the end of the output range. */\n  OutputIt out;\n  /** Total (not truncated) output size. */\n  std::size_t size;\n};\n\ntemplate <typename OutputIt, typename Char = typename OutputIt::value_type>\nusing format_to_n_context =\n    format_context_t<internal::truncating_iterator<OutputIt>, Char>;\n\ntemplate <typename OutputIt, typename Char = typename OutputIt::value_type>\nusing format_to_n_args = basic_format_args<format_to_n_context<OutputIt, Char>>;\n\ntemplate <typename OutputIt, typename Char, typename... Args>\ninline format_arg_store<format_to_n_context<OutputIt, Char>, Args...>\nmake_format_to_n_args(const Args&... args) {\n  return format_arg_store<format_to_n_context<OutputIt, Char>, Args...>(\n      args...);\n}\n\ntemplate <typename OutputIt, typename Char, typename... Args,\n          FMT_ENABLE_IF(internal::is_output_iterator<OutputIt>::value)>\ninline format_to_n_result<OutputIt> vformat_to_n(\n    OutputIt out, std::size_t n, basic_string_view<Char> format_str,\n    format_to_n_args<type_identity_t<OutputIt>, type_identity_t<Char>> args) {\n  auto it = vformat_to(internal::truncating_iterator<OutputIt>(out, n),\n                       format_str, args);\n  return {it.base(), it.count()};\n}\n\n/**\n \\rst\n Formats arguments, writes up to ``n`` characters of the result to the output\n iterator ``out`` and returns the total output size and the iterator past the\n end of the output range.\n \\endrst\n */\ntemplate <typename OutputIt, typename S, typename... Args,\n          FMT_ENABLE_IF(internal::is_string<S>::value&&\n                            internal::is_output_iterator<OutputIt>::value)>\ninline format_to_n_result<OutputIt> format_to_n(OutputIt out, std::size_t n,\n                                                const S& format_str,\n                                                const Args&... args) {\n  internal::check_format_string<Args...>(format_str);\n  using context = format_to_n_context<OutputIt, char_t<S>>;\n  return vformat_to_n(out, n, to_string_view(format_str),\n                      make_format_args<context>(args...));\n}\n\ntemplate <typename Char>\ninline std::basic_string<Char> internal::vformat(\n    basic_string_view<Char> format_str,\n    basic_format_args<buffer_context<type_identity_t<Char>>> args) {\n  basic_memory_buffer<Char> buffer;\n  internal::vformat_to(buffer, format_str, args);\n  return to_string(buffer);\n}\n\n/**\n  Returns the number of characters in the output of\n  ``format(format_str, args...)``.\n */\ntemplate <typename... Args>\ninline std::size_t formatted_size(string_view format_str, const Args&... args) {\n  return format_to(internal::counting_iterator(), format_str, args...).count();\n}\n\ntemplate <typename Char, FMT_ENABLE_IF(std::is_same<Char, wchar_t>::value)>\nvoid vprint(std::FILE* f, basic_string_view<Char> format_str,\n            wformat_args args) {\n  wmemory_buffer buffer;\n  internal::vformat_to(buffer, format_str, args);\n  buffer.push_back(L'\\0');\n  if (std::fputws(buffer.data(), f) == -1)\n    FMT_THROW(system_error(errno, \"cannot write to file\"));\n}\n\ntemplate <typename Char, FMT_ENABLE_IF(std::is_same<Char, wchar_t>::value)>\nvoid vprint(basic_string_view<Char> format_str, wformat_args args) {\n  vprint(stdout, format_str, args);\n}\n\n#if FMT_USE_USER_DEFINED_LITERALS\nnamespace internal {\n\n#  if FMT_USE_UDL_TEMPLATE\ntemplate <typename Char, Char... CHARS> class udl_formatter {\n public:\n  template <typename... Args>\n  std::basic_string<Char> operator()(Args&&... args) const {\n    FMT_CONSTEXPR_DECL Char s[] = {CHARS..., '\\0'};\n    FMT_CONSTEXPR_DECL bool invalid_format =\n        do_check_format_string<Char, error_handler, remove_cvref_t<Args>...>(\n            basic_string_view<Char>(s, sizeof...(CHARS)));\n    (void)invalid_format;\n    return format(s, std::forward<Args>(args)...);\n  }\n};\n#  else\ntemplate <typename Char> struct udl_formatter {\n  basic_string_view<Char> str;\n\n  template <typename... Args>\n  std::basic_string<Char> operator()(Args&&... args) const {\n    return format(str, std::forward<Args>(args)...);\n  }\n};\n#  endif  // FMT_USE_UDL_TEMPLATE\n\ntemplate <typename Char> struct udl_arg {\n  basic_string_view<Char> str;\n\n  template <typename T> named_arg<T, Char> operator=(T&& value) const {\n    return {str, std::forward<T>(value)};\n  }\n};\n\n// Converts string literals to basic_string_view.\ntemplate <typename Char, size_t N>\nFMT_CONSTEXPR basic_string_view<Char> compile_string_to_view(\n    const Char (&s)[N]) {\n  // Remove trailing null character if needed. Won't be present if this is used\n  // with raw character array (i.e. not defined as a string).\n  return {s,\n          N - ((std::char_traits<Char>::to_int_type(s[N - 1]) == 0) ? 1 : 0)};\n}\n\n// Converts string_view to basic_string_view.\ntemplate <typename Char>\nFMT_CONSTEXPR basic_string_view<Char> compile_string_to_view(\n    const std_string_view<Char>& s) {\n  return {s.data(), s.size()};\n}\n}  // namespace internal\n\ninline namespace literals {\n#  if FMT_USE_UDL_TEMPLATE\n#    pragma GCC diagnostic push\n#    if FMT_CLANG_VERSION\n#      pragma GCC diagnostic ignored \"-Wgnu-string-literal-operator-template\"\n#    endif\ntemplate <typename Char, Char... CHARS>\nFMT_CONSTEXPR internal::udl_formatter<Char, CHARS...> operator\"\"_format() {\n  return {};\n}\n#    pragma GCC diagnostic pop\n#  else\n/**\n  \\rst\n  User-defined literal equivalent of :func:`fmt::format`.\n\n  **Example**::\n\n    using namespace fmt::literals;\n    std::string message = \"The answer is {}\"_format(42);\n  \\endrst\n */\nFMT_CONSTEXPR internal::udl_formatter<char> operator\"\" _format(const char* s,\n                                                               std::size_t n) {\n  return {{s, n}};\n}\nFMT_CONSTEXPR internal::udl_formatter<wchar_t> operator\"\" _format(\n    const wchar_t* s, std::size_t n) {\n  return {{s, n}};\n}\n#  endif  // FMT_USE_UDL_TEMPLATE\n\n/**\n  \\rst\n  User-defined literal equivalent of :func:`fmt::arg`.\n\n  **Example**::\n\n    using namespace fmt::literals;\n    fmt::print(\"Elapsed time: {s:.2f} seconds\", \"s\"_a=1.23);\n  \\endrst\n */\nFMT_CONSTEXPR internal::udl_arg<char> operator\"\" _a(const char* s,\n                                                    std::size_t n) {\n  return {{s, n}};\n}\nFMT_CONSTEXPR internal::udl_arg<wchar_t> operator\"\" _a(const wchar_t* s,\n                                                       std::size_t n) {\n  return {{s, n}};\n}\n}  // namespace literals\n#endif  // FMT_USE_USER_DEFINED_LITERALS\nFMT_END_NAMESPACE\n\n#define FMT_STRING_IMPL(s, ...)                                     \\\n  [] {                                                              \\\n    /* Use a macro-like name to avoid shadowing warnings. */        \\\n    struct FMT_COMPILE_STRING : fmt::compile_string {               \\\n      using char_type = fmt::remove_cvref_t<decltype(s[0])>;        \\\n      FMT_MAYBE_UNUSED __VA_ARGS__ FMT_CONSTEXPR                    \\\n      operator fmt::basic_string_view<char_type>() const {          \\\n        return fmt::internal::compile_string_to_view<char_type>(s); \\\n      }                                                             \\\n    };                                                              \\\n    return FMT_COMPILE_STRING();                                    \\\n  }()\n\n/**\n  \\rst\n  Constructs a compile-time format string from a string literal *s*.\n\n  **Example**::\n\n    // A compile-time error because 'd' is an invalid specifier for strings.\n    std::string s = format(FMT_STRING(\"{:d}\"), \"foo\");\n  \\endrst\n */\n#define FMT_STRING(s) FMT_STRING_IMPL(s, )\n\n#if defined(FMT_STRING_ALIAS) && FMT_STRING_ALIAS\n#  define fmt(s) FMT_STRING_IMPL(s, [[deprecated]])\n#endif\n\n#ifdef FMT_HEADER_ONLY\n#  define FMT_FUNC inline\n#  include \"format-inl.h\"\n#else\n#  define FMT_FUNC\n#endif\n\n#endif  // FMT_FORMAT_H_\n"
  },
  {
    "path": "examples/lesson04/fig04_12/format.cc",
    "content": "// Formatting library for C++\n//\n// Copyright (c) 2012 - 2016, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include \"fmt/format-inl.h\"\n\nFMT_BEGIN_NAMESPACE\nnamespace internal {\n\ntemplate <typename T>\nint format_float(char* buf, std::size_t size, const char* format, int precision,\n                 T value) {\n#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION\n  if (precision > 100000)\n    throw std::runtime_error(\n        \"fuzz mode - avoid large allocation inside snprintf\");\n#endif\n  // Suppress the warning about nonliteral format string.\n  int (*snprintf_ptr)(char*, size_t, const char*, ...) = FMT_SNPRINTF;\n  return precision < 0 ? snprintf_ptr(buf, size, format, value)\n                       : snprintf_ptr(buf, size, format, precision, value);\n}\nstruct sprintf_specs {\n  int precision;\n  char type;\n  bool alt : 1;\n\n  template <typename Char>\n  constexpr sprintf_specs(basic_format_specs<Char> specs)\n      : precision(specs.precision), type(specs.type), alt(specs.alt) {}\n\n  constexpr bool has_precision() const { return precision >= 0; }\n};\n\n// This is deprecated and is kept only to preserve ABI compatibility.\ntemplate <typename Double>\nchar* sprintf_format(Double value, internal::buffer<char>& buf,\n                     sprintf_specs specs) {\n  // Buffer capacity must be non-zero, otherwise MSVC's vsnprintf_s will fail.\n  FMT_ASSERT(buf.capacity() != 0, \"empty buffer\");\n\n  // Build format string.\n  enum { max_format_size = 10 };  // longest format: %#-*.*Lg\n  char format[max_format_size];\n  char* format_ptr = format;\n  *format_ptr++ = '%';\n  if (specs.alt || !specs.type) *format_ptr++ = '#';\n  if (specs.precision >= 0) {\n    *format_ptr++ = '.';\n    *format_ptr++ = '*';\n  }\n  if (std::is_same<Double, long double>::value) *format_ptr++ = 'L';\n\n  char type = specs.type;\n\n  if (type == '%')\n    type = 'f';\n  else if (type == 0 || type == 'n')\n    type = 'g';\n#if FMT_MSC_VER\n  if (type == 'F') {\n    // MSVC's printf doesn't support 'F'.\n    type = 'f';\n  }\n#endif\n  *format_ptr++ = type;\n  *format_ptr = '\\0';\n\n  // Format using snprintf.\n  char* start = nullptr;\n  char* decimal_point_pos = nullptr;\n  for (;;) {\n    std::size_t buffer_size = buf.capacity();\n    start = &buf[0];\n    int result =\n        format_float(start, buffer_size, format, specs.precision, value);\n    if (result >= 0) {\n      unsigned n = internal::to_unsigned(result);\n      if (n < buf.capacity()) {\n        // Find the decimal point.\n        auto p = buf.data(), end = p + n;\n        if (*p == '+' || *p == '-') ++p;\n        if (specs.type != 'a' && specs.type != 'A') {\n          while (p < end && *p >= '0' && *p <= '9') ++p;\n          if (p < end && *p != 'e' && *p != 'E') {\n            decimal_point_pos = p;\n            if (!specs.type) {\n              // Keep only one trailing zero after the decimal point.\n              ++p;\n              if (*p == '0') ++p;\n              while (p != end && *p >= '1' && *p <= '9') ++p;\n              char* where = p;\n              while (p != end && *p == '0') ++p;\n              if (p == end || *p < '0' || *p > '9') {\n                if (p != end) std::memmove(where, p, to_unsigned(end - p));\n                n -= static_cast<unsigned>(p - where);\n              }\n            }\n          }\n        }\n        buf.resize(n);\n        break;  // The buffer is large enough - continue with formatting.\n      }\n      buf.reserve(n + 1);\n    } else {\n      // If result is negative we ask to increase the capacity by at least 1,\n      // but as std::vector, the buffer grows exponentially.\n      buf.reserve(buf.capacity() + 1);\n    }\n  }\n  return decimal_point_pos;\n}\n}  // namespace internal\n\ntemplate FMT_API char* internal::sprintf_format(double, internal::buffer<char>&,\n                                                sprintf_specs);\ntemplate FMT_API char* internal::sprintf_format(long double,\n                                                internal::buffer<char>&,\n                                                sprintf_specs);\n\ntemplate struct FMT_INSTANTIATION_DEF_API internal::basic_data<void>;\n\n// Workaround a bug in MSVC2013 that prevents instantiation of format_float.\nint (*instantiate_format_float)(double, int, internal::float_specs,\n                                internal::buffer<char>&) =\n    internal::format_float;\n\n#ifndef FMT_STATIC_THOUSANDS_SEPARATOR\ntemplate FMT_API internal::locale_ref::locale_ref(const std::locale& loc);\ntemplate FMT_API std::locale internal::locale_ref::get<std::locale>() const;\n#endif\n\n// Explicit instantiations for char.\n\ntemplate FMT_API std::string internal::grouping_impl<char>(locale_ref);\ntemplate FMT_API char internal::thousands_sep_impl(locale_ref);\ntemplate FMT_API char internal::decimal_point_impl(locale_ref);\n\ntemplate FMT_API void internal::buffer<char>::append(const char*, const char*);\n\ntemplate FMT_API void internal::arg_map<format_context>::init(\n    const basic_format_args<format_context>& args);\n\ntemplate FMT_API std::string internal::vformat<char>(\n    string_view, basic_format_args<format_context>);\n\ntemplate FMT_API format_context::iterator internal::vformat_to(\n    internal::buffer<char>&, string_view, basic_format_args<format_context>);\n\ntemplate FMT_API int internal::snprintf_float(double, int,\n                                              internal::float_specs,\n                                              internal::buffer<char>&);\ntemplate FMT_API int internal::snprintf_float(long double, int,\n                                              internal::float_specs,\n                                              internal::buffer<char>&);\ntemplate FMT_API int internal::format_float(double, int, internal::float_specs,\n                                            internal::buffer<char>&);\ntemplate FMT_API int internal::format_float(long double, int,\n                                            internal::float_specs,\n                                            internal::buffer<char>&);\n\n// Explicit instantiations for wchar_t.\n\ntemplate FMT_API std::string internal::grouping_impl<wchar_t>(locale_ref);\ntemplate FMT_API wchar_t internal::thousands_sep_impl(locale_ref);\ntemplate FMT_API wchar_t internal::decimal_point_impl(locale_ref);\n\ntemplate FMT_API void internal::buffer<wchar_t>::append(const wchar_t*,\n                                                        const wchar_t*);\n\ntemplate FMT_API std::wstring internal::vformat<wchar_t>(\n    wstring_view, basic_format_args<wformat_context>);\nFMT_END_NAMESPACE\n"
  },
  {
    "path": "examples/lesson04/fig04_17.cpp",
    "content": "// fig04_17.cpp\r\n// Compound-interest example with boost::multiprecision::cpp_dec_float_50. \r\n#include <boost/multiprecision/cpp_dec_float.hpp>\r\n#include <format> \r\n#include <iostream>\r\n#include \"decimalformatter.h\" \r\n\r\nusing namespace std;\r\nusing boost::multiprecision::cpp_dec_float_50;\r\n\r\nint main() {\r\n   cpp_dec_float_50 principal{1000}; // $1000 initial principal\r\n   cpp_dec_float_50 rate{\"0.05\"}; // 5% interest rate\r\n \r\n   cout << format(\"Initial principal: {:>7}\\n\", principal)\r\n        << format(\"    Interest rate: {:>7}\\n\\n\", rate);\r\n\r\n   // display headers\r\n   cout << format(\"{}{:>20}\\n\", \"Year\", \"Amount on deposit\");\r\n\r\n   // calculate amount on deposit for each of 10 years\r\n   for (int year{1}; year <= 10; ++year) {\r\n      cpp_dec_float_50 amount{principal * pow(1 + rate, year)};\r\n      cout << format(\"{:>4}{:>20}\\n\", year, amount);\r\n   }\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson04/fig04_17fmt.cpp",
    "content": "// fig04_17.cpp\r\n// Compound-interest example with boost::multiprecision::cpp_dec_float_50. \r\n#include <boost/multiprecision/cpp_dec_float.hpp>\r\n#include <fmt/format.h> // in C++20, this will be #include <format>\r\n#include <iostream>\r\n#include \"decimalformatter_fmt.h\" \r\n\r\nusing namespace std;\r\nusing boost::multiprecision::cpp_dec_float_50;\r\n\r\nint main() {\r\n   cpp_dec_float_50 principal{1000}; // $1000 initial principal\r\n   cpp_dec_float_50 rate{\"0.05\"}; // 5% interest rate\r\n \r\n   cout << fmt::format(\"Initial principal: {:>7}\\n\", principal)\r\n      << fmt::format(\"    Interest rate: {:>7}\\n\\n\", rate);\r\n\r\n   // display headers\r\n   cout << fmt::format(\"{}{:>20}\\n\", \"Year\", \"Amount on deposit\");\r\n\r\n   // calculate amount on deposit for each of 10 years\r\n   for (int year{1}; year <= 10; ++year) {\r\n      cpp_dec_float_50 amount{principal * pow(1 + rate, year)};\r\n      cout << fmt::format(\"{:>4}{:>20}\\n\", year, amount);\r\n   }\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2023 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/cipher.h",
    "content": "// Fig. 9.37: cipher.h\r\n// Vigenre cipher implementation. \r\n#pragma once\r\n#include <algorithm>\r\n#include <array>\r\n#include <iostream>\r\n#include <string>\r\n#include <string_view>\r\n#include <cctype>\r\n#include <stdexcept>\r\n\r\nclass Cipher {\r\npublic:\r\n   // constructor to initialize the Vigenre square \r\n   Cipher() {\r\n      // array to store the 26 characters A-Z that will be \r\n      // used to initialize each row of the Vigenre square\r\n      std::array<char, m_size> alphabet{};\r\n\r\n      // fill alphabet with A-Z\r\n      for (size_t i{0}; i < m_size; ++i) {\r\n         // convert 'A' + i to a char and place in alphabet\r\n         alphabet.at(i) = static_cast<char>('A' + i);\r\n      }\r\n\r\n      // copy alphabet into row 0 of the Vigenre square\r\n      m_square.at(0) = alphabet;\r\n\r\n      // for each remaining row of the Vigenre square, move alphabet's\r\n      // first letter to the end then copy alphabet into the row\r\n      for (int row{1}; row < m_size; ++row) {\r\n         // rotate alphabet, moving its first letter to the end\r\n         std::ranges::rotate(alphabet, std::begin(alphabet) + 1);\r\n\r\n         // copy alphabet into current row of the Vigenre square\r\n         m_square.at(row) = alphabet;\r\n      }\r\n   }\r\n\r\n   // encrypt receives the plaintext and secret key, applies \r\n   // the Vigenre cipher returns the encrypted ciphertext\r\n   std::string encrypt(\r\n      std::string_view plaintext, std::string_view secret) {\r\n\r\n      checkKey(secret); // ensure secret key contains only letters\r\n\r\n      std::string ciphertext{}; // stores encrypted text\r\n      size_t keyIndex{0}; // current letter index in secret key\r\n\r\n      // iterate through each character in plaintext\r\n      for (size_t i{0}; i < plaintext.length(); ++i) {\r\n         // determine whether character at i is lowercase so we can \r\n         // place a corresponding lowercase letter in the ciphertext\r\n         const bool lower{std::islower(plaintext.at(i)) ? true : false};\r\n\r\n         // convert currentChar to uppercase; for uppercase \r\n         // letters and non-letters the character remains the same\r\n         const char currentChar{static_cast<const char>(\r\n            std::toupper(plaintext.at(i)))};\r\n\r\n         // if the current character is a letter, encrypt it  \r\n         // and add it to cipherText in its original case\r\n         if ('A' <= currentChar && currentChar <= 'Z') {\r\n            // to get the row index in the Vigenre square, select the \r\n            // character at keyIndex in the secret key, convert it to \r\n            // uppercase and subtract 'A' from it\r\n            const int row{std::toupper(secret.at(keyIndex)) - 'A'};\r\n\r\n            // increment the keyIndex, ensuring that it is  \r\n            // reset to 0 if keyIndex reaches secret.length()\r\n            keyIndex = (keyIndex + 1) % secret.length();\r\n\r\n            // to get the column index in the Vigenre square,  \r\n            // subtract 'A' from the currentChar\r\n            const int column{currentChar - 'A'};\r\n\r\n            // select the substitute character from the Vigenre square\r\n            const char substituteChar{m_square.at(row).at(column)};\r\n\r\n            // add substituteChar to the ciphertext, ensuring that\r\n            // it's lowercase if the plaintext character was lowerase\r\n            ciphertext +=\r\n               (lower ? std::tolower(substituteChar) : substituteChar);\r\n         }\r\n         else {\r\n            ciphertext += currentChar; // add non-letter to ciphertext\r\n         }\r\n      }\r\n\r\n      return ciphertext; // return the encrypted text\r\n   }\r\n\r\n   // decrypt receives the ciphertext and secret key, reverses\r\n   // Vigenre cipher process and returns the unencrypted plaintext\r\n   std::string decrypt(\r\n      std::string_view ciphertext, std::string_view secret) {\r\n\r\n      checkKey(secret); // ensure secret key contains only letters\r\n\r\n      std::string plaintext{}; // stores unencrypted text\r\n      size_t keyIndex{0}; // current letter index in secret key\r\n\r\n      for (size_t i{0}; i < ciphertext.length(); ++i) {\r\n         // determine whether character at i is lowercase so we can \r\n         // place a corresponding lowercase letter in plainText\r\n         const bool lower{std::islower(ciphertext.at(i)) ? true : false};\r\n\r\n         // convert currentChar to uppercase; for uppercase \r\n         // letters and non-letters the character remains the same\r\n         const char currentChar{static_cast<const char>(\r\n            std::toupper(ciphertext.at(i)))};\r\n\r\n         // if current is a letter decrypt it\r\n         if ('A' <= currentChar && currentChar <= 'Z') {\r\n            // to get the row index in the Vigenre square, select the \r\n            // character at keyIndex in the secret key, convert it to \r\n            // uppercase and subtract 'A' from it\r\n            const int row{std::toupper(secret.at(keyIndex)) - 'A'};\r\n\r\n            // increment the keyIndex, ensuring that it is  \r\n            // reset to 0 if keyIndex reaches secret.length()\r\n            keyIndex = (keyIndex + 1) % secret.length();\r\n\r\n            // column in the Vigenre square\r\n            int column{-1};\r\n\r\n            // find currentChar's column in Vigenre square's current row\r\n            for (int i{0}; i < m_square.at(row).size(); ++i) {\r\n               if (m_square.at(row).at(i) == currentChar) {\r\n                  column = i;\r\n                  break;\r\n               }\r\n            }\r\n\r\n            // determine original character  \r\n            const char originalChar{\r\n               static_cast<const char>('A' + column)};\r\n\r\n            // add originalChar to plaintext in the correct case\r\n            plaintext +=\r\n               (lower ? std::tolower(originalChar) : originalChar);\r\n         }\r\n         else {\r\n            plaintext += currentChar; // add non-letter to plaintext\r\n         }\r\n      }\r\n\r\n      return plaintext; // return the unencrypted text\r\n   }\r\nprivate:\r\n   // number of rows and columns in the Vigenre square\r\n   static constexpr size_t m_size{26};\r\n\r\n   // 26-by-26 array of characters to store the Vigenre square\r\n   std::array<std::array<char, m_size>, m_size> m_square;\r\n\r\n   // utility function checks that secret key contains only letters; \r\n   // throws an invalid_argument exception if key contains non-letters\r\n   static void checkKey(std::string_view secret) {\r\n      for (size_t i{0}; i < secret.size(); ++i) {\r\n         // if the uppercase version of the character at index i \r\n         // is not a letter throw an invalid_argument exception\r\n         if (std::toupper(secret.at(i)) < 'A' ||\r\n            std::toupper(secret.at(i)) > 'Z') {\r\n            throw std::invalid_argument(\r\n               \"key must contain only letters A-Z or a-z\");\r\n         }\r\n      }\r\n   }\r\n};\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/ex05_31.cpp",
    "content": "// ex05_31.cpp\r\n// What does this program do?\r\n#include <iostream>\r\nusing namespace std;\r\n\r\nint mystery(int, int); // function prototype\r\n      \r\nint main() {\r\n   cout << \"Enter two integers: \";\r\n   int x{0};\r\n   int y{0};\r\n   cin >> x >> y;\r\n   cout << \"The result is \" << mystery(x, y) << endl;\r\n} \r\n   \r\n// Parameter b must be a positive integer to prevent infinite recursion\r\nint mystery(int a, int b) {\r\n   if (1 == b) { // base case\r\n      return a;\r\n   } \r\n   else { // recursion step\r\n      return a + mystery(a, b - 1);\r\n   } \r\n} \r\n\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n*************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/fig05_01.cpp",
    "content": "// fig05_01.cpp\r\n// maximum function with a function prototype.\r\n#include <iostream>\r\n\r\nusing namespace std;\r\n\r\nint maximum(int x, int y, int z); // function prototype \r\n\r\nint main() {\r\n   cout << \"Enter three integer values: \";\r\n   int int1, int2, int3;\r\n   cin >> int1 >> int2 >> int3;\r\n\r\n   // invoke maximum \r\n   cout << \"The maximum integer value is: \" \r\n      << maximum(int1, int2, int3) << '\\n';\r\n}\r\n\r\n// returns the largest of three integers   \r\nint maximum(int x, int y, int z) {\r\n   int maximumValue{x}; // assume x is the largest to start\r\n\r\n   // determine whether y is greater than maximumValue\r\n   if (y > maximumValue) {\r\n      maximumValue = y; // make y the new maximumValue\r\n   }\r\n\r\n   // determine whether z is greater than maximumValue\r\n   if (z > maximumValue) {\r\n      maximumValue = z; // make z the new maximumValue\r\n   }\r\n\r\n   return maximumValue;\r\n}\r\n\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n*************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/fig05_02.cpp",
    "content": "// fig05_02.cpp\r\n// Producing random integers in the range 1 through 6.\r\n#include <iostream>\r\n#include <random> // contains random-number generation features \r\nusing namespace std;\r\n\r\nint main() {\r\n   // engine that produces random numbers \r\n   default_random_engine engine{};\r\n\r\n   // distribution that produces the int values 1-6 with equal likelihood\r\n   uniform_int_distribution randomDie{1, 6};\r\n\r\n   // display 10 random die rolls\r\n   for (int counter{1}; counter <= 10; ++counter) {\r\n      cout << randomDie(engine) << \" \"; \r\n   } \r\n\r\n   cout << '\\n';\r\n} \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/fig05_03.cpp",
    "content": "// fig05_03.cpp\r\n// Rolling a six-sided die randomly 60,000,000 times.\r\n#include <format>\r\n#include <iostream>\r\n#include <random> \r\nusing namespace std;\r\n\r\nint main() {\r\n   // set up random-number generation\r\n   default_random_engine engine{};\r\n   uniform_int_distribution randomDie{1, 6};\r\n\r\n   int frequency1{0}; // count of 1s rolled\r\n   int frequency2{0}; // count of 2s rolled\r\n   int frequency3{0}; // count of 3s rolled \r\n   int frequency4{0}; // count of 4s rolled\r\n   int frequency5{0}; // count of 5s rolled\r\n   int frequency6{0}; // count of 6s rolled\r\n\r\n   // summarize results of 60,000,000 rolls of a die\r\n   for (int roll{1}; roll <= 60'000'000; ++roll) {\r\n      // determine roll value 1-6 and increment appropriate counter\r\n      switch (const int face{randomDie(engine)}) {\r\n         case 1:          \r\n            ++frequency1; // increment the 1s counter\r\n            break;\r\n         case 2:          \r\n            ++frequency2; // increment the 2s counter\r\n            break;\r\n         case 3:          \r\n            ++frequency3; // increment the 3s counter\r\n            break;\r\n         case 4:         \r\n            ++frequency4; // increment the 4s counter\r\n            break;\r\n         case 5:          \r\n            ++frequency5; // increment the 5s counter\r\n            break;\r\n         case 6:         \r\n            ++frequency6; // increment the 6s counter\r\n            break;\r\n         default: // invalid value\r\n            cout << \"Program should never get here!\";\r\n            break;\r\n      } \r\n   } \r\n\r\n   cout << format(\"{:>4}{:>13}\\n\", \"Face\", \"Frequency\"); // headers\r\n   cout << format(\"{:>4d}{:>13d}\\n\", 1, frequency1)\r\n      << format(\"{:>4d}{:>13d}\\n\", 2, frequency2)\r\n      << format(\"{:>4d}{:>13d}\\n\", 3, frequency3)\r\n      << format(\"{:>4d}{:>13d}\\n\", 4, frequency4)\r\n      << format(\"{:>4d}{:>13d}\\n\", 5, frequency5)\r\n      << format(\"{:>4d}{:>13d}\\n\", 6, frequency6);\r\n} \r\n\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/fig05_04.cpp",
    "content": "// fig05_04.cpp\r\n// Randomizing the die-rolling program.\r\n#include <iostream>\r\n#include <random>\r\n\r\nusing namespace std;\r\n\r\nint main() {\r\n   unsigned int seed{0}; // stores the seed entered by the user\r\n\r\n   cout << \"Enter seed: \";\r\n   cin >> seed;\r\n\r\n   // set up random-number generation\r\n   default_random_engine engine{seed}; // seed the engine\r\n   uniform_int_distribution randomDie{1, 6};\r\n\r\n   // display 10 random die rolls\r\n   for (int counter{1}; counter <= 10; ++counter) {\r\n      cout << randomDie(engine) << \" \";\r\n   } \r\n\r\n   cout << '\\n';\r\n} \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/fig05_05.cpp",
    "content": "// fig05_05.cpp\r\n// Craps simulation.\r\n#include <format>\r\n#include <iostream>\r\n#include <random> \r\nusing namespace std;\r\n\r\nint rollDice(); // rolls dice, calculates and displays sum \r\n\r\nint main() {\r\n   // scoped enumeration with constants that represent the game status\r\n   enum class Status {keepRolling, won, lost};   \r\n   \r\n   int myPoint{0}; // point if no win or loss on first roll\r\n   Status gameStatus{Status::keepRolling}; // game is not over \r\n\r\n   // determine game status and point (if needed) based on first roll\r\n   switch (const int sumOfDice{rollDice()}) {\r\n      case 7: // win with 7 on first roll\r\n      case 11: // win with 11 on first roll           \r\n         gameStatus = Status::won;\r\n         break;\r\n      case 2: // lose with 2 on first roll\r\n      case 3: // lose with 3 on first roll\r\n      case 12: // lose with 12 on first roll             \r\n         gameStatus = Status::lost;\r\n         break;\r\n      default: // did not win or lose, so remember point\r\n         myPoint = sumOfDice; // remember the point\r\n         cout << format(\"Point is {}\\n\", myPoint);\r\n         break; // optional (but recommended) at end of switch  \r\n   }\r\n\r\n   // while game is not complete\r\n   while (Status::keepRolling == gameStatus) { // not won or lost\r\n      // roll dice again and determine game status\r\n      if (const int sumOfDice{rollDice()}; sumOfDice == myPoint) {\r\n         gameStatus = Status::won;\r\n      }\r\n      else if (sumOfDice == 7) { // lose by rolling 7 before point\r\n         gameStatus = Status::lost;\r\n      }\r\n   }\r\n\r\n   // display won or lost message\r\n   if (Status::won == gameStatus) {\r\n      cout << \"Player wins\\n\";\r\n   }\r\n   else {\r\n      cout << \"Player loses\\n\";\r\n   }\r\n}\r\n\r\n// roll dice, calculate sum and display results\r\nint rollDice() {\r\n   // set up random-number generation\r\n   static random_device rd; // used to seed the default_random_engine\r\n   static default_random_engine engine{rd()}; // rd() produces a seed \r\n   static uniform_int_distribution randomDie{1, 6};\r\n\r\n   const int die1{randomDie(engine)}; // first die roll\r\n   const int die2{randomDie(engine)}; // second die roll\r\n   const int sum{die1 + die2}; // compute sum of die values\r\n\r\n   // display results of this roll\r\n   cout << format(\"Player rolled {} + {} = {}\\n\", die1, die2, sum);\r\n\r\n   return sum;\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/fig05_06.cpp",
    "content": "// fig05_06.cpp\r\n// square function used to demonstrate the function \r\n// call stack and activation records.\r\n#include <iostream>\r\nusing namespace std;\r\n\r\nint square(int); // prototype for function square\r\n\r\nint main() {\r\n   int a{10}; // value to square (local variable in main)\r\n\r\n   int result{square(a)}; // calculate s squared and store in result\r\n} \r\n\r\n// returns the square of an integer\r\nint square(int x) { // x is a local variable\r\n   return x * x; // calculate square and return result\r\n} \r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/fig05_07.cpp",
    "content": "// fig05_07.cpp\r\n// inline function that calculates the volume of a cube.\r\n#include <iostream> \r\nusing namespace std;\r\n\r\n// Definition of inline function cube. Definition of function appears \r\n// before function is called, so a function prototype is not required. \r\n// First line of function definition also acts as the prototype.\r\ninline double cube(double side) {               \r\n   return side * side * side; // calculate cube \r\n}                                               \r\n\r\nint main() {\r\n   double sideValue; // stores value entered by user \r\n   cout << \"Enter the side length of your cube: \";\r\n   cin >> sideValue; // read value from user\r\n\r\n   // calculate cube of sideValue and display result\r\n   cout << \"Volume of cube with side \" \r\n      << sideValue << \" is \" << cube(sideValue) << '\\n';\r\n} \r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/fig05_08.cpp",
    "content": "// fig05_08.cpp\r\n// Passing arguments by value and by reference.\r\n#include <iostream>\r\nusing namespace std;\r\n\r\nint squareByValue(int number); // prototype (for value pass)             \r\nvoid squareByReference(int& numberRef); // prototype (for reference pass)\r\n   \r\nint main() {\r\n   int x{2}; // value to square using squareByValue\r\n   int z{4}; // value to square using squareByReference\r\n\r\n   // demonstrate squareByValue\r\n   cout << \"x = \" << x << \" before squareByValue\\n\";\r\n   cout << \"Value returned by squareByValue: \" \r\n      << squareByValue(x) << '\\n';  \r\n   cout << \"x = \" << x << \" after squareByValue\\n\\n\";\r\n\r\n   // demonstrate squareByReference\r\n   cout << \"z = \" << z << \" before squareByReference\\n\";\r\n   squareByReference(z);\r\n   cout << \"z = \" << z << \" after squareByReference\\n\";\r\n} \r\n\r\n// squareByValue multiplies number by itself, stores the     \r\n// result in number and returns the new value of number      \r\nint squareByValue(int number) {                               \r\n   return number *= number; // caller's argument not modified \r\n}                                                             \r\n\r\n// squareByReference multiplies numberRef by itself and stores the result\r\n// in the variable to which numberRef refers in function main            \r\nvoid squareByReference(int& numberRef) {                 \r\n   numberRef *= numberRef; // caller's argument modified \r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/fig05_09.cpp",
    "content": "// fig05_09.cpp\r\n// Using default arguments.\r\n#include <iostream>\r\nusing namespace std;\r\n\r\n// function prototype that specifies default arguments\r\nint boxVolume(int length = 1, int width = 1, int height = 1); \r\n \r\nint main() {\r\n   // no arguments--use default values for all dimensions\r\n   cout << \"The default box volume is: \" << boxVolume();\r\n   \r\n   // specify length; default width and height\r\n   cout << \"\\n\\nThe volume of a box with length 10,\\n\"\r\n      << \"width 1 and height 1 is: \" << boxVolume(10);\r\n        \r\n   // specify length and width; default height\r\n   cout << \"\\n\\nThe volume of a box with length 10,\\n\" \r\n      << \"width 5 and height 1 is: \" << boxVolume(10, 5);\r\n   \r\n   // specify all arguments \r\n   cout << \"\\n\\nThe volume of a box with length 10,\\n\"\r\n      << \"width 5 and height 2 is: \" << boxVolume(10, 5, 2)\r\n      << '\\n';\r\n} \r\n\r\n// function boxVolume calculates the volume of a box\r\nint boxVolume(int length, int width, int height) {                                       \r\n   return length * width * height;                              \r\n} \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/fig05_10.cpp",
    "content": "// fig05_10.cpp\r\n// Overloaded square functions.\r\n#include <iostream>\r\nusing namespace std;\r\n\r\n// function square for int values              \r\nint square(int x) {                            \r\n   cout << \"square of integer \" << x << \" is \";\r\n   return x * x;                               \r\n} \r\n\r\n// function square for double values           \r\ndouble square(double y) {                     \r\n   cout << \"square of double \" << y << \" is \"; \r\n   return y * y;                               \r\n} \r\n\r\nint main() {\r\n   cout << square(7); // calls int version\r\n   cout << '\\n';\r\n   cout << square(7.5); // calls double version\r\n   cout << '\\n';\r\n} \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/fig05_11.cpp",
    "content": "// fig05_11.cpp\r\n// Name mangling to enable type-safe linkage.\r\n\r\n// function square for int values\r\nint square(int x) {\r\n   return x * x; \r\n} \r\n\r\n// function square for double values\r\ndouble square(double y) {\r\n   return y * y; \r\n} \r\n\r\n// function that receives arguments of types \r\n// int, float, char and int&\r\nvoid nothing1(int a, float b, char c, int& d) { }\r\n\r\n// function that receives arguments of types \r\n// char, int, float& and double&\r\nint nothing2(char a, int b, float& c, double& d) {\r\n   return 0; \r\n} \r\n\r\nint main() { }\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/fig05_12.cpp",
    "content": "// fig05_12.cpp\r\n// Overloaded square functions.\r\n#include <iostream>\r\nusing namespace std;\r\n\r\n// function square for int values              \r\nint square(int x) {\r\n   cout << \"square of integer \" << x << \" is \";\r\n   return x * x;\r\n}\r\n\r\n// function square for double values           \r\ndouble square(double y) {\r\n   cout << \"square of double \" << y << \" is \";\r\n   return y * y;\r\n}\r\n\r\nint main() {\r\n   cout << square(7); // calls int version\r\n   cout << endl;\r\n   cout << square(7.5); // calls double version\r\n   cout << endl;\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2020 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/fig05_13.cpp",
    "content": "// fig05_13.cpp\r\n// Function template maximum test program.\r\n#include <iostream>\r\n#include \"maximum.h\" // include definition of function template maximum \r\nusing namespace std;\r\n\r\nint main() {\r\n   // demonstrate maximum with int values\r\n   cout << \"Input three integer values: \";\r\n   int int1, int2, int3;\r\n   cin >> int1 >> int2 >> int3;\r\n\r\n   // invoke int version of maximum\r\n   cout << \"The maximum integer value is: \"\r\n      << maximum(int1, int2, int3);        \r\n\r\n   // demonstrate maximum with double values\r\n   cout << \"\\n\\nInput three double values: \";\r\n   double double1, double2, double3;\r\n   cin >> double1 >> double2 >> double3;\r\n\r\n   // invoke double version of maximum\r\n   cout << \"The maximum double value is: \"\r\n      << maximum(double1, double2, double3);\r\n\r\n   // demonstrate maximum with char values\r\n   cout << \"\\n\\nInput three characters: \";\r\n   char char1, char2, char3;\r\n   cin >> char1 >> char2 >> char3;\r\n\r\n   // invoke char version of maximum\r\n   cout << \"The maximum character value is: \"\r\n      << maximum(char1, char2, char3) << '\\n';\r\n} \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/fig05_14.cpp",
    "content": "// fig05_14.cpp\r\n// Recursive function factorial.\r\n#include <boost/multiprecision/cpp_int.hpp>\r\n#include <format>\r\n#include <iostream>\r\nusing boost::multiprecision::cpp_int;\r\nusing namespace std;\r\n\r\ncpp_int factorial(int number); // function prototype \r\n\r\nint main() {\r\n   // calculate the factorials of 0 through 10\r\n   for (int counter{0}; counter <= 10; ++counter) {\r\n      cout << format(\"{:>2}! = \", counter) << factorial(counter) \r\n         << '\\n';\r\n   } \r\n\r\n   // display factorials of 20, 30 and 40\r\n   cout << format(\"\\n{:>2}! = \", 20) << factorial(20) \r\n      << format(\"\\n{:>2}! = \", 30) << factorial(30) \r\n      << format(\"\\n{:>2}! = \", 40) << factorial(40) << '\\n';\r\n} \r\n\r\n// recursive definition of function factorial    \r\ncpp_int factorial(int number) {                     \r\n   if (number <= 1) { // test for base case      \r\n      return 1; // base cases: 0! = 1 and 1! = 1 \r\n   }                                             \r\n   else { // recursion step                      \r\n      return number * factorial(number - 1);     \r\n   }                                             \r\n}                                                \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/fig05_15.cpp",
    "content": "// fig05_15.cpp\r\n// Recursive function fibonacci.\r\n#include <format>  \r\n#include <iostream>\r\nusing namespace std;\r\n\r\nlong fibonacci(long number); // function prototype \r\n\r\nint main() {\r\n   // calculate the fibonacci values of 0 through 10\r\n   for (int counter{0}; counter <= 10; ++counter) {\r\n      cout << format(\"fibonacci({}) = {}\\n\", \r\n         counter, fibonacci(counter));\r\n   }\r\n\r\n   // display higher fibonacci values\r\n   cout << format(\"\\nfibonacci(20) = {}\\n\", fibonacci(20))\r\n      << format(\"fibonacci(30) = {}\\n\", fibonacci(30))\r\n      << format(\"fibonacci(35) = {}\\n\", fibonacci(35));\r\n} \r\n\r\n// recursive function fibonacci                            \r\nlong fibonacci(long number) {            \r\n   if ((0 == number) || (1 == number)) { // base cases     \r\n      return number;                                       \r\n   }                                                       \r\n   else { // recursion step                                \r\n      return fibonacci(number - 1) + fibonacci(number - 2);\r\n   }                                                       \r\n}                                                          \r\n\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n*************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/fig05_16.cpp",
    "content": "// fig05_16.cpp\r\n// Scoping example.\r\n#include <iostream>\r\nusing namespace std;\r\n\r\nvoid useLocal(); // function prototype\r\nvoid useStaticLocal(); // function prototype\r\nvoid useGlobal(); // function prototype\r\n\r\nint x{1}; // global variable \r\n\r\nint main() {\r\n   cout << \"global x in main is \" << x << '\\n'; \r\n\r\n   const int x{5}; // local variable to main\r\n\r\n   cout << \"local x in main's outer scope is \" << x << '\\n';\r\n \r\n   { // block starts a new scope                                  \r\n      const int x{7}; // hides both x in outer scope and global x \r\n                                                                  \r\n      cout << \"local x in main's inner scope is \" << x << '\\n';   \r\n   }                                                               \r\n \r\n   cout << \"local x in main's outer scope is \" << x << '\\n';\r\n\r\n   useLocal(); // useLocal has local x\r\n   useStaticLocal(); // useStaticLocal has static local x\r\n   useGlobal(); // useGlobal uses global x\r\n   useLocal(); // useLocal reinitializes its local x\r\n   useStaticLocal(); // static local x retains its prior value\r\n   useGlobal(); // global x also retains its prior value\r\n\r\n   cout << \"\\nlocal x in main is \" << x << '\\n';\r\n} // end of main \r\n\r\n// useLocal reinitializes local variable x during each call\r\nvoid useLocal() {\r\n   int x{25}; // initialized each time useLocal is called\r\n\r\n   cout << \"\\nlocal x is \" << x << \" on entering useLocal\\n\";\r\n   ++x;\r\n   cout << \"local x is \" << x << \" on exiting useLocal\\n\";\r\n} \r\n\r\n// useStaticLocal initializes static local variable x only the\r\n// first time the function is called; value of x is saved\r\n// between calls to this function\r\nvoid useStaticLocal() {\r\n   static int x{50}; // initialized first time useStaticLocal is called\r\n\r\n   cout << \"\\nlocal static x is \" << x \r\n      << \" on entering useStaticLocal\\n\";\r\n   ++x; \r\n   cout << \"local static x is \" << x \r\n      << \" on exiting useStaticLocal\\n\";\r\n} \r\n\r\n// useGlobal modifies global variable x during each call\r\nvoid useGlobal() {\r\n   cout << \"\\nglobal x is \" << x << \" on entering useGlobal\\n\";\r\n   x *= 10;\r\n   cout << \"global x is \" << x << \" on exiting useGlobal\\n\";\r\n} \r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n*************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/fig05_17.cpp",
    "content": "// fig05_17.cpp\r\n// Unary scope resolution operator.\r\n#include <iostream>\r\nusing namespace std;\r\n\r\nconst int number{7}; // global variable named number \r\n\r\nint main() {\r\n   const double number{10.5}; // local variable named number\r\n\r\n   // display values of local and global variables\r\n   cout << \"Local double value of number = \" << number\r\n      << \"\\nGlobal int value of number = \" << ::number << '\\n';\r\n} \r\n\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n*************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/fig05_18.cpp",
    "content": "// fig05_18.cpp\r\n// Encrypting and decrypting text with a Vigenre cipher. \r\n#include \"cipher.h\"\r\n#include <iostream>\r\n#include <string>\r\nusing namespace std;\r\n\r\nint main() {\r\n   string plainText;\r\n   cout << \"Enter the text to encrypt:\\n\";\r\n   getline(cin, plainText);\r\n\r\n   string secretKey;\r\n   cout << \"\\nEnter the secret key:\\n\";\r\n   getline(cin, secretKey);\r\n\r\n   Cipher cipher; \r\n\r\n   // encrypt plainText using secretKey\r\n   string cipherText{cipher.encrypt(plainText, secretKey)};\r\n   cout << \"\\nEncrypted:\\n   \" << cipherText << '\\n';\r\n\r\n   // decrypt cipherText\r\n   cout << \"\\nDecrypted:\\n   \"  \r\n      << cipher.decrypt(cipherText, secretKey) << '\\n';\r\n   \r\n   // decrypt ciphertext entered by the user\r\n   cout << \"\\nEnter the ciphertext to decipher:\\n\";\r\n   getline(cin, cipherText);\r\n   cout << \"\\nDecrypted:\\n   \" \r\n      << cipher.decrypt(cipherText, secretKey) << '\\n';\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/fig05_19.cpp",
    "content": "// fig05_19.cpp\n// C++17 [[nodiscard]] attribute.\n\n[[nodiscard]]\nint cube(int x) {\n   return x * x * x;\n}\n\nint main() {\n   cube(10); // generates a compiler warning\n}\n\n/**************************************************************************\n * (C) Copyright 1992-2020 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson05/fig05_20.cpp",
    "content": "// fig15_20.cpp\r\n// Encrypting and decrypting text with a Vigenre cipher. \r\n#include \"cipher.h\"\r\n#include <iostream>\r\n#include <string>\r\nusing namespace std;\r\n\r\nint main() {\r\n   string plainText;\r\n   cout << \"Enter the text to encrypt:\\n\";\r\n   getline(cin, plainText);\r\n\r\n   string secretKey;\r\n   cout << \"\\nEnter the secret key:\\n\";\r\n   getline(cin, secretKey);\r\n\r\n   Cipher cipher; \r\n\r\n   // encrypt plainText using secretKey\r\n   string cipherText{cipher.encrypt(plainText, secretKey)};\r\n   cout << \"\\nEncrypted:\\n   \" << cipherText << endl;\r\n\r\n   // decrypt cipherText\r\n   cout << \"\\nDecrypted:\\n   \"  \r\n      << cipher.decrypt(cipherText, secretKey) << endl;\r\n   \r\n   // decrypt ciphertext entered by the user\r\n   cout << \"\\nEnter the ciphertext to decipher:\\n\";\r\n   getline(cin, cipherText);\r\n   cout << \"\\nDecrypted:\\n   \" \r\n      << cipher.decrypt(cipherText, secretKey) << endl;\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2020 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson05/maximum.h",
    "content": "// Fig. 5.12: maximum.h\r\n// Function template maximum header.\r\ntemplate <typename T>  // or template <class T>      \r\nT maximum(T value1, T value2, T value3) {                 \r\n   T maximumValue{value1}; // assume value1 is maximum   \r\n\r\n   // determine whether value2 is greater than maximumValue\r\n   if (value2 > maximumValue) {                           \r\n      maximumValue = value2;                               \r\n   }                                                        \r\n\r\n   // determine whether value3 is greater than maximumValue\r\n   if (value3 > maximumValue) {                           \r\n      maximumValue = value3;                               \r\n   }                                                        \r\n   \r\n   return maximumValue;                                    \r\n} \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson06/fig06_01.cpp",
    "content": "// fig06_01.cpp\r\n// Initializing an array's elements to zeros and printing the array.\r\n#include <format>\r\n#include <iostream>\r\n#include <array>\r\n\r\nint main() {\r\n   std::array<int, 5> values; // values is an array of 5 int values\r\n\r\n   // initialize elements of array values to 0        \r\n   for (size_t i{0}; i < values.size(); ++i) {\r\n      values[i] = 0; // set element at location i to 0\r\n   }\r\n\r\n   std::cout << std::format(\"{:>7}{:>10}\\n\", \"Element\", \"Value\");\r\n\r\n   // output each array element's value\r\n   for (size_t i{0}; i < values.size(); ++i) {\r\n      std::cout << std::format(\"{:>7}{:>10}\\n\", i, values[i]);\r\n   }\r\n\r\n   std::cout << std::format(\"\\n{:>7}{:>10}\\n\", \"Element\", \"Value\");\r\n\r\n   // access elements via the at member function\r\n   for (size_t i{0}; i < values.size(); ++i) {\r\n      std::cout << std::format(\"{:>7}{:>10}\\n\", i, values.at(i));\r\n   }\r\n\r\n   // accessing an element outside the array's bounds with at\r\n   values.at(10); // throws an exception\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson06/fig06_02.cpp",
    "content": "// fig06_02.cpp\r\n// Initializing an array in a declaration.\r\n#include <format>\r\n#include <iostream>\r\n#include <array>\r\n\r\nint main() {\r\n   std::array<int, 5> values{32, 27, 64, 18, 95}; // braced initializer\r\n\r\n   // output each array element's value\r\n   for (size_t i{0}; i < values.size(); ++i) {\r\n      std::cout << std::format(\"{}  \", values.at(i));\r\n   }\r\n\r\n   std::cout << \"\\n\\n\";\r\n\r\n   // using class template argument deduction to determine values2's type\r\n   std::array values2{1.1, 2.2, 3.3, 4.4};\r\n\r\n   // output each array element's value\r\n   for (size_t i{0}; i < values2.size(); ++i) {\r\n      std::cout << std::format(\"{}  \", values2.at(i));\r\n   }\r\n\r\n   std::cout << '\\n';\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson06/fig06_03.cpp",
    "content": "// fig06_03.cpp\r\n// Using range-based for.\r\n#include <format>\r\n#include <iostream>\r\n#include <array>\r\n\r\nint main() {\r\n   std::array items{1, 2, 3, 4, 5}; // type inferred as array<int, 5>\r\n\r\n   // display items before modification\r\n   std::cout << \"items before modification: \";\r\n   for (const int& item : items) { // item is a reference to a const int\r\n      std::cout << std::format(\"{} \", item); \r\n   }                       \r\n \r\n   // multiply the elements of items by 2\r\n   for (int& item : items) { // item is a reference to an int\r\n      item *= 2;\r\n   }\r\n\r\n   // display items after modification\r\n   std::cout << \"\\nitems after modification: \";\r\n   for (const int& item : items) {\r\n      std::cout << std::format(\"{} \", item);\r\n   }\r\n\r\n   // sum elements of items using range-based for with initialization\r\n   std::cout << \"\\n\\ncalculating a running total of items' values:\\n\";\r\n   for (int runningTotal{0}; const int& item : items) {\r\n      runningTotal += item;\r\n      std::cout << std::format(\"item: {}; running total: {}\\n\",\r\n         item, runningTotal);\r\n   }\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson06/fig06_04.cpp",
    "content": "// fig06_04.cpp\r\n// Set array values to the even integers from 2 to 10.\r\n#include <format>\r\n#include <iostream>\r\n#include <array>\r\n\r\nint main() {\r\n   // constant can be used to specify array size\r\n   constexpr size_t arraySize{5}; // must initialize in declaration\r\n\r\n   std::array<int, arraySize> values{}; // array values has 5 elements\r\n\r\n   for (int i{0}; i < values.size(); ++i) { // set the values\r\n      values.at(i) = 2 + 2 * i;\r\n   }\r\n\r\n   // output contents of array values in tabular format\r\n   for (const int& value : values) {\r\n      std::cout << std::format(\"{}  \", value);\r\n   }\r\n\r\n   std::cout << '\\n';\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson06/fig06_05.cpp",
    "content": "// fig06_05.cpp\r\n// Compute the sum of an array's elements.\r\n#include <format>\r\n#include <iostream>\r\n#include <array>\r\n\r\nint main() {\r\n   std::array items{10, 20, 30, 40}; // type inferred as array<int, 4>\r\n   int total{0};\r\n\r\n   // sum the contents of items            \r\n   for (const int& item : items) {\r\n      total += item;\r\n   }\r\n\r\n   std::cout << std::format(\"Total of array elements: {}\\n\", total);\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson06/fig06_06.cpp",
    "content": "// fig06_06.cpp\r\n// Printing a student grade distribution as a primitive bar chart.\r\n#include <format>\r\n#include <iostream>\r\n#include <array>\r\n\r\nint main() {\r\n   constexpr std::array frequencies{0, 0, 0, 0, 0, 0, 1, 2, 4, 2, 1};\r\n\r\n   std::cout << \"Grade distribution:\\n\";\r\n\r\n   // for each element of frequencies, output a bar of the chart\r\n   for (int i{0}; const int& frequency : frequencies) {\r\n      // output bar labels (\"00-09:\", ..., \"90-99:\", \"100:\")\r\n      if (i < 10) {\r\n         std::cout << std::format(\"{:02d}-{:02d}: \",\r\n            i * 10, (i * 10) + 9);\r\n      }\r\n      else {\r\n         std::cout << std::format(\"{:>5d}: \", 100);\r\n      }\r\n\r\n      ++i;\r\n\r\n      // print bar of asterisks\r\n      for (int stars{0}; stars < frequency; ++stars) {\r\n         std::cout << '*';\r\n      }\r\n\r\n      std::cout << '\\n'; // start a new line of output\r\n   }\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson06/fig06_07.cpp",
    "content": "// fig06_07.cpp\r\n// Die-rolling program using an array instead of switch.\r\n#include <format>\r\n#include <iostream>\r\n#include <array>\r\n#include <random>\r\n\r\nint main() {\r\n   // set up random-number generation\r\n   std::random_device rd; // used to seed the default_random_engine\r\n   std::default_random_engine engine{rd()}; // rd() produces a seed \r\n   std::uniform_int_distribution randomDie{1, 6};\r\n\r\n   constexpr size_t arraySize{7}; // ignore element zero\r\n   std::array<int, arraySize> frequency{}; // initialize to 0s\r\n\r\n   // roll die 60,000,000 times; use die value as frequency index\r\n   for (int roll{1}; roll <= 60'000'000; ++roll) {\r\n      ++frequency.at(randomDie(engine));\r\n   }\r\n\r\n   std::cout << std::format(\"{}{:>13}\\n\", \"Face\", \"Frequency\");\r\n\r\n   // output each array element's value\r\n   for (size_t face{1}; face < frequency.size(); ++face) {\r\n      std::cout << std::format(\"{:>4}{:>13}\\n\", face, frequency.at(face));\r\n   }\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson06/fig06_08.cpp",
    "content": "// fig06_08.cpp\r\n// Poll analysis program.\r\n#include <format>\r\n#include <iostream>\r\n#include <array>\r\n\r\nint main() {\r\n   // place survey responses in array responses\r\n   constexpr std::array responses{\r\n      1, 2, 5, 4, 3, 5, 2, 1, 3, 1, 4, 3, 3, 3, 2, 3, 3, 2, 2, 5};\r\n\r\n   // initialize frequency counters to 0\r\n   constexpr size_t frequencySize{6}; // size of array frequency\r\n   std::array<int, frequencySize> frequency{};\r\n\r\n   // for each response in responses, use that value \r\n   // as frequency index to determine element to increment\r\n   for (const int& response : responses) {\r\n      ++frequency.at(response);\r\n   }\r\n\r\n   std::cout << std::format(\"{}{:>12}\\n\", \"Rating\", \"Frequency\");\r\n\r\n   // output each array element's value\r\n   for (size_t rating{1}; rating < frequency.size(); ++rating) {\r\n      std::cout << std::format(\"{:>6}{:>12}\\n\",\r\n         rating, frequency.at(rating));\r\n   }\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson06/fig06_09.cpp",
    "content": "// fig06_09.cpp\r\n// Sorting and searching arrays.\r\n#include <array>\r\n#include <algorithm> // contains sort and binary_search\r\n#include <format>\r\n#include <iostream>\r\n#include <string>\r\n\r\nint main() {\r\n   using namespace std::string_literals; // enables string object literals\r\n\r\n   // colors is inferred to be an array<string, 7>\r\n   std::array colors{\"red\"s, \"orange\"s, \"yellow\"s,\r\n      \"green\"s, \"blue\"s, \"indigo\"s, \"violet\"s};\r\n\r\n   // output original array\r\n   std::cout << \"Unsorted colors array:\\n   \";\r\n   for (const std::string& color : colors) {\r\n      std::cout << std::format(\"{} \", color);\r\n   }\r\n\r\n   // sort contents of colors\r\n   std::sort(std::begin(colors), std::end(colors));\r\n\r\n   // output sorted array\r\n   std::cout << \"\\nSorted colors array:\\n   \";\r\n   for (const std::string& color : colors) {\r\n      std::cout << std::format(\"{} \", color);\r\n   }\r\n\r\n   // search for \"indigo\" in colors\r\n   bool found{std::binary_search(\r\n      std::begin(colors), std::end(colors), \"indigo\")};\r\n   std::cout << std::format(\"\\n\\n\\\"indigo\\\" {} found in colors array\\n\",\r\n      found ? \"was\" : \"was not\");\r\n\r\n   // search for \"cyan\" in colors\r\n   found = std::binary_search(\r\n      std::begin(colors), std::end(colors), \"cyan\");\r\n   std::cout << std::format(\"\\\"cyan\\\" {} found in colors array\\n\",\r\n      found ? \"was\" : \"was not\");\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson06/fig06_10.cpp",
    "content": "// fig06_10.cpp\r\n// Initializing multidimensional arrays.\r\n#include <iostream> \r\n#include <array> \r\n\r\nconstexpr size_t rows{2};\r\nconstexpr size_t columns{3};\r\nvoid printArray(const std::array<std::array<int, columns>, rows>& a);\r\n\r\nint main() {\r\n   constexpr std::array values1{std::array{1, 2, 3}, std::array{4, 5, 6}};\r\n   constexpr std::array values2{std::array{1, 2, 3}, std::array{4, 5, 0}};\r\n\r\n   std::cout << \"values1 by row:\\n\";\r\n   printArray(values1);\r\n\r\n   std::cout << \"\\nvalues2 by row:\\n\";\r\n   printArray(values2);\r\n}\r\n\r\n// output array with two rows and three columns                 \r\nvoid printArray(const std::array<std::array<int, columns>, rows>& a) {\r\n   // loop through array's rows             \r\n   for (const auto& row : a) {\r\n      // loop through columns of current row                \r\n      for (const auto& element : row) {\r\n         std::cout << element << ' ';\r\n      }\r\n\r\n      std::cout << '\\n'; // start new line of output             \r\n   }\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson06/fig06_11.cpp",
    "content": "// fig06_11.cpp\r\n// Compute the sum of the elements of an array using accumulate.\r\n#include <array>\r\n#include <format>\r\n#include <iostream>\r\n#include <numeric>\r\n\r\nint main() {\r\n   constexpr std::array integers{10, 20, 30, 40};\r\n   std::cout << std::format(\"Total of array elements: {}\\n\",\r\n      std::accumulate(std::begin(integers), std::end(integers), 0));\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson06/fig06_12.cpp",
    "content": "// fig06_12.cpp\r\n// Compute the product of an array's elements using accumulate.\r\n#include <array>\r\n#include <format>\r\n#include <iostream>\r\n#include <numeric>\r\n\r\nint multiply(int x, int y) {\r\n   return x * y;\r\n}\r\n\r\nint main() {\r\n   constexpr std::array integers{1, 2, 3, 4, 5};\r\n\r\n   std::cout << std::format(\"Product of integers: {}\\n\", std::accumulate(\r\n      std::begin(integers), std::end(integers), 1, multiply));\r\n\r\n   std::cout << std::format(\"Product of integers with a lambda: {}\\n\",\r\n      std::accumulate(std::begin(integers), std::end(integers), 1,\r\n         [](const auto& x, const auto& y) {return x * y;}));\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n\r\n"
  },
  {
    "path": "examples/lesson06/fig06_13.cpp",
    "content": "// fig06_13.cpp\r\n// Functional-style programming with C++20 ranges and views.\r\n#include <array>\r\n#include <format>\r\n#include <iostream>\r\n#include <numeric>\r\n#include <ranges>\r\n\r\nint main() {\r\n   // lambda to display results of range operations\r\n   auto showValues{\r\n      [](auto& values, const std::string& message) {\r\n         std::cout << std::format(\"{}: \", message);\r\n\r\n         for (const auto& value : values) {\r\n            std::cout << std::format(\"{} \", value);\r\n         }\r\n\r\n         std::cout << '\\n';\r\n      }\r\n   };\r\n\r\n   auto values1{std::views::iota(1, 11)}; // generate integers 1-10\r\n   showValues(values1, \"Generate integers 1-10\");\r\n\r\n   // filter each value in values1, keeping only the even integers\r\n   auto values2{values1 |\r\n      std::views::filter([](const auto& x) {return x % 2 == 0;})};\r\n   showValues(values2, \"Filtering even integers\");\r\n\r\n   // map each value in values2 to its square\r\n   auto values3{\r\n      values2 | std::views::transform([](const auto& x) {return x * x;})};\r\n   showValues(values3, \"Mapping even integers to squares\");\r\n\r\n   // combine filter and transform to get squares of the even integers\r\n   auto values4{\r\n      values1 | std::views::filter([](const auto& x) {return x % 2 == 0;})\r\n              | std::views::transform([](const auto& x) {return x * x; })};\r\n   showValues(values4, \"Squares of even integers\");\r\n\r\n   // total the squares of the even integers \r\n   std::cout << std::format(\"Sum squares of even integers 2-10: {}\\n\",\r\n      std::accumulate(std::begin(values4), std::end(values4), 0));\r\n\r\n   // process a container's elements\r\n   constexpr std::array numbers{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\r\n   auto values5{\r\n      numbers | std::views::filter([](const auto& x) {return x % 2 == 0;})\r\n              | std::views::transform([](const auto& x) {return x * x;})};\r\n   showValues(values5, \"Squares of even integers in array numbers\");\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson06/fig06_14.cpp",
    "content": "// fig06_14.cpp\r\n// Demonstrating C++ standard library class template vector.\r\n#include <iostream>\r\n#include <vector>    \r\n#include <stdexcept> \r\n\r\nvoid outputVector(const std::vector<int>& items); // display the vector\r\nvoid inputVector(std::vector<int>& items); // input values into the vector\r\n\r\nint main() {\r\n   std::vector<int> integers1(7); // 7-element vector<int>  \r\n   std::vector<int> integers2(10); // 10-element vector<int>\r\n\r\n   // print integers1 size and contents\r\n   std::cout << \"Size of vector integers1 is \" << integers1.size()\r\n      << \"\\nvector after initialization: \";\r\n   outputVector(integers1);\r\n\r\n   // print integers2 size and contents\r\n   std::cout << \"\\nSize of vector integers2 is \" << integers2.size()\r\n      << \"\\nvector after initialization: \";\r\n   outputVector(integers2);\r\n\r\n   // input and print integers1 and integers2\r\n   std::cout << \"\\nEnter 17 integers:\\n\";\r\n   inputVector(integers1);\r\n   inputVector(integers2);\r\n\r\n   std::cout << \"\\nAfter input, the vectors contain:\\n\"\r\n      << \"integers1: \";\r\n   outputVector(integers1);\r\n   std::cout << \"integers2: \";\r\n   outputVector(integers2);\r\n\r\n   // use inequality (!=) operator with vector objects\r\n   std::cout << \"\\nEvaluating: integers1 != integers2\\n\";\r\n\r\n   if (integers1 != integers2) {\r\n      std::cout << \"integers1 and integers2 are not equal\\n\";\r\n   }\r\n\r\n   // create vector integers3 using integers1 as an     \r\n   // initializer; print size and contents              \r\n   std::vector integers3{integers1}; // copy constructor\r\n\r\n   std::cout << \"\\nSize of vector integers3 is \" << integers3.size()\r\n      << \"\\nvector after initialization: \";\r\n   outputVector(integers3);\r\n\r\n   // use overloaded assignment (=) operator              \r\n   std::cout << \"\\nAssigning integers2 to integers1:\\n\";\r\n   integers1 = integers2; // assign integers2 to integers1\r\n\r\n   std::cout << \"integers1: \";\r\n   outputVector(integers1);\r\n   std::cout << \"integers2: \";\r\n   outputVector(integers2);\r\n\r\n   // use equality (==) operator with vector objects\r\n   std::cout << \"\\nEvaluating: integers1 == integers2\\n\";\r\n\r\n   if (integers1 == integers2) {\r\n      std::cout << \"integers1 and integers2 are equal\\n\";\r\n   }\r\n\r\n   // use the value at location 5 as an rvalue\r\n   std::cout << \"\\nintegers1.at(5) is \" << integers1.at(5);\r\n\r\n   // use integers1.at(5) as an lvalue\r\n   std::cout << \"\\n\\nAssigning 1000 to integers1.at(5)\\n\";\r\n   integers1.at(5) = 1000;\r\n   std::cout << \"integers1: \";\r\n   outputVector(integers1);\r\n\r\n   // attempt to use out-of-range index                   \r\n   try {\r\n      std::cout << \"\\nAttempt to display integers1.at(15)\\n\";\r\n      std::cout << integers1.at(15) << '\\n'; // ERROR: out of range\r\n   }\r\n   catch (const std::out_of_range& ex) {\r\n      std::cerr << \"An exception occurred: \" << ex.what() << '\\n';\r\n   }\r\n\r\n   // changing the size of a vector\r\n   std::cout << \"\\nCurrent integers3 size is: \" << integers3.size();\r\n   integers3.push_back(1000); // add 1000 to the end of the vector\r\n   std::cout << \"\\nNew integers3 size is: \" << integers3.size()\r\n      << \"\\nintegers3 now contains: \";\r\n   outputVector(integers3);\r\n}\r\n\r\n// output vector contents\r\nvoid outputVector(const std::vector<int>& items) {\r\n   for (const int& item : items) {\r\n      std::cout << item << ' ';\r\n   }\r\n\r\n   std::cout << '\\n';\r\n}\r\n\r\n// input vector contents\r\nvoid inputVector(std::vector<int>& items) {\r\n   for (int& item : items) {\r\n      std::cin >> item;\r\n   }\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson07/fig07_01.cpp",
    "content": "// fig07_01.cpp\r\n// Pointer operators & and *.\r\n#include <iostream>\r\nusing namespace std;\r\n\r\nint main() {\r\n   constexpr int a{7}; // initialize a with 7\r\n   const int* aPtr{&a}; // initialize aPtr with address of int variable a\r\n\r\n   std::cout << \"The address of a is \" << &a\r\n      << \"\\nThe value of aPtr is \" << aPtr;\r\n   std::cout << \"\\n\\nThe value of a is \" << a\r\n      << \"\\nThe value of *aPtr is \" << *aPtr << '\\n';\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson07/fig07_02.cpp",
    "content": "// fig07_02.cpp\r\n// Pass-by-value used to cube a variable's value.\r\n#include <format>\r\n#include <iostream>\r\n\r\nint cubeByValue(int n); // prototype \r\n\r\nint main() {\r\n   int number{5};\r\n\r\n   std::cout << std::format(\"Original value of number is {}\\n\", number);\r\n   number = cubeByValue(number); // pass number by value to cubeByValue\r\n   std::cout << std::format(\"New value of number is {}\\n\", number);\r\n}\r\n\r\n// calculate and return cube of integer argument                \r\nint cubeByValue(int n) {\r\n   return n * n * n; // cube local variable n and return result \r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson07/fig07_03.cpp",
    "content": "// fig07_03.cpp\r\n// Pass-by-reference with a pointer argument used to cube a \r\n// variable's value.\r\n#include <format>\r\n#include <iostream>\r\n\r\nvoid cubeByReference(int* nPtr); // prototype \r\n\r\nint main() {\r\n   int number{5};\r\n\r\n   std::cout << std::format(\"Original value of number is {}\\n\", number);\r\n   cubeByReference(&number); // pass number address to cubeByReference\r\n   std::cout << std::format(\"New value of number is {}\\n\", number);\r\n}\r\n\r\n// calculate cube of *nPtr; modifies variable number in main \r\nvoid cubeByReference(int* nPtr) {\r\n   *nPtr = *nPtr * *nPtr * *nPtr; // cube *nPtr              \r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson07/fig07_06.cpp",
    "content": "// fig07_06.cpp\n// C++20: Creating std::arrays with to_array.\n#include <format>\n#include <iostream>\n#include <array>\n\nint main() {\n   // generic lambda to display a collection of items\n   const auto display{\n      [](const auto& items) {\n         for (const auto& item : items) {\n            std::cout << std::format(\"{} \", item);\n         }\n      }\n   };\n\n   const int values1[]{10, 20, 30};\n\n   // creating a std::array from a built-in array\n   const auto array1{std::to_array(values1)};\n\n   std::cout << std::format(\"array1.size() = {}\\n\", array1.size())\n      << \"array1: \";\n   display(array1); // use lambda to display contents\n\n   // creating a std::array from an initializer list\n   const auto array2{std::to_array({1, 2, 3, 4})};\n   std::cout << std::format(\"\\n\\narray2.size() = {}\\n\", array2.size())\n      << \"array2: \";\n   display(array2); // use lambda to display contents\n\n   std::cout << '\\n';\n}\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson07/fig07_07.cpp",
    "content": "// fig07_07.cpp\r\n// Attempting to modify data through a \r\n// nonconstant pointer to constant data.\r\n\r\nint main() {\r\n   int y{0};\r\n   const int* yPtr{&y};\r\n   *yPtr = 100; // error: cannot modify a const object \r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson07/fig07_08.cpp",
    "content": "// fig07_08.cpp\n// Attempting to modify a constant pointer to nonconstant data.\n\nint main() {\n   int x, y;\n\n   // ptr is a constant pointer to an integer that can be modified \n   // through ptr, but ptr always points to the same memory location.                                  \n   int* const ptr{&x}; // const pointer must be initialized \n\n   *ptr = 7; // allowed: *ptr is not const\n   ptr = &y; // error: ptr is const; cannot assign to it a new address\n}\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n\n"
  },
  {
    "path": "examples/lesson07/fig07_09.cpp",
    "content": "// fig07_09.cpp\r\n// Attempting to modify a constant pointer to constant data.\r\n#include <iostream>\r\nusing namespace std;\r\n\r\nint main() {\r\n   int x{5}, y;\r\n\r\n   // ptr is a constant pointer to a constant integer. \r\n   // ptr always points to the same location; the integer\r\n   // at that location cannot be modified.\r\n   const int* const ptr{&x};\r\n\r\n   cout << *ptr << \"\\n\";\r\n\r\n   *ptr = 7; // error: *ptr is const; cannot assign new value \r\n   ptr = &y; // error: ptr is const; cannot assign new address\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson07/fig07_10.cpp",
    "content": "// fig07_10.cpp\r\n// Sizeof operator when used on a built-in array's name\r\n// returns the number of bytes in the built-in array.\r\n#include <format>\r\n#include <iostream>\r\n\r\nsize_t getSize(double* ptr); // prototype\r\n\r\nint main() {\r\n   double numbers[20]; // 20 doubles; occupies 160 bytes on our system\r\n\r\n   std::cout << std::format(\"Number of bytes in numbers is {}\\n\",\r\n      sizeof(numbers));\r\n\r\n   std::cout << std::format(\"Number of bytes returned by getSize is {}\\n\",\r\n      getSize(numbers));\r\n}\r\n\r\n// return size of ptr         \r\nsize_t getSize(double* ptr) {\r\n   return sizeof(ptr);\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson07/fig07_11.cpp",
    "content": "// fig07_11.cpp\r\n// sizeof operator used to determine standard data type sizes.\r\n#include <format>\r\n#include <iostream>\r\n\r\nint main() {\r\n   constexpr char c{}; // variable of type char\r\n   constexpr short s{}; // variable of type short\r\n   constexpr int i{}; // variable of type int\r\n   constexpr long l{}; // variable of type long\r\n   constexpr long long ll{}; // variable of type long long\r\n   constexpr float f{}; // variable of type float\r\n   constexpr double d{}; // variable of type double\r\n   constexpr long double ld{}; // variable of type long double\r\n   constexpr int array[20]{}; // built-in array of int\r\n   const int* const ptr{array}; // variable of type int*\r\n\r\n   std::cout << std::format(\"sizeof c = {}\\tsizeof(char) = {}\\n\",\r\n      sizeof c, sizeof(char));\r\n   std::cout << std::format(\"sizeof s = {}\\tsizeof(short) = {}\\n\",\r\n      sizeof s, sizeof(short));\r\n   std::cout << std::format(\"sizeof i = {}\\tsizeof(int) = {}\\n\",\r\n      sizeof i, sizeof(int));\r\n   std::cout << std::format(\"sizeof l = {}\\tsizeof(long) = {}\\n\",\r\n      sizeof l, sizeof(long));\r\n   std::cout << std::format(\"sizeof ll = {}\\tsizeof(long long) = {}\\n\",\r\n      sizeof ll, sizeof(long long));\r\n   std::cout << std::format(\"sizeof f = {}\\tsizeof(float) = {}\\n\",\r\n      sizeof f, sizeof(float));\r\n   std::cout << std::format(\"sizeof d = {}\\tsizeof(double) = {}\\n\",\r\n      sizeof d, sizeof(double));\r\n   std::cout << std::format(\"sizeof ld = {}\\tsizeof(long double) = {}\\n\",\r\n      sizeof ld, sizeof(long double));\r\n   std::cout << std::format(\"sizeof array = {}\\n\", sizeof array);\r\n   std::cout << std::format(\"sizeof ptr = {}\\n\", sizeof ptr);\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson07/fig07_12.cpp",
    "content": "// fig07_12.cpp\n// C++20 spans: Creating views into containers.\n#include <array>\n#include <format>\n#include <iostream>\n#include <numeric>\n#include <span>\n#include <vector>\n\n// items parameter is treated as a const int* so we also need the size to\n// know how to iterate over items with counter-controlled iteration\nvoid displayArray(const int items[], size_t size) {\n   for (size_t i{0}; i < size; ++i) {\n      std::cout << std::format(\"{} \", items[i]);\n   }\n}\n\n// span parameter contains both the location of the first item\n// and the number of elements, so we can iterate using range-based for\nvoid displaySpan(std::span<const int> items) {\n   for (const auto& item : items) { // spans are iterable\n      std::cout << std::format(\"{} \", item);\n   }\n}\n\n// spans can be used to modify elements in the original data structure\nvoid times2(std::span<int> items) {\n   for (int& item : items) {\n      item *= 2;\n   }\n}\n\nint main() {\n   int values1[]{1, 2, 3, 4, 5};\n   std::array values2{6, 7, 8, 9, 10};\n   std::vector values3{11, 12, 13, 14, 15};\n\n   // must specify size because the compiler treats displayArray's items \n   // parameter as a pointer to the first element of the argument\n   std::cout << \"values1 via displayArray: \";\n   displayArray(values1, 5);\n\n   // compiler knows values1's size and automatically creates a span\n   // representing &values1[0] and the array's length\n   std::cout << \"\\nvalues1 via displaySpan: \";\n   displaySpan(values1);\n\n   // compiler also can create spans from std::arrays and std::vectors\n   std::cout << \"\\nvalues2 via displaySpan: \";\n   displaySpan(values2);\n   std::cout << \"\\nvalues3 via displaySpan: \";\n   displaySpan(values3);\n\n   // changing a span's contents modifies the original data\n   times2(values1);\n   std::cout << \"\\n\\nvalues1 after times2 modifies its span argument: \";\n   displaySpan(values1);\n\n   // spans have various array-and-vector-like capabilities\n   std::span mySpan{values1}; // span<int>\n   std::cout << \"\\n\\nmySpan's first element: \" << mySpan.front()\n      << \"\\nmySpan's last element: \" << mySpan.back();\n\n   // spans can be used with standard library algorithms\n   std::cout << \"\\n\\nSum of mySpan's elements: \"\n      << std::accumulate(std::begin(mySpan), std::end(mySpan), 0);\n\n   // spans can be used to create subviews of a container\n   std::cout << \"\\n\\nFirst three elements of mySpan: \";\n   displaySpan(mySpan.first(3));\n   std::cout << \"\\nLast three elements of mySpan: \";\n   displaySpan(mySpan.last(3));\n   std::cout << \"\\nMiddle three elements of mySpan: \";\n   displaySpan(mySpan.subspan(1, 3));\n\n   // changing a subview's contents modifies the original data\n   times2(mySpan.subspan(1, 3));\n   std::cout << \"\\n\\nvalues1 after modifying elements via span: \";\n   displaySpan(values1);\n\n   // access a span element via []\n   std::cout << \"\\n\\nThe element at index 2 is: \" << mySpan[2];\n}\n\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson07/fig07_13.cpp",
    "content": "// fig07_13.cpp\n// Reading in command-line arguments.\n#include <format>\n#include <iostream>\n\nint main(int argc, char* argv[]) {\n   std::cout << std::format(\"Number of arguments: {}\\n\\n\", argc);\n\n   for (int i{0}; i < argc; ++i) {\n      std::cout << std::format(\"{}\\n\", argv[i]);\n   }\n}\n\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson07/fig07_14.cpp",
    "content": "// fig07_14.cpp\n// C++20: Creating std::arrays from string literals with to_array.\n#include <format>\n#include <iostream>\n#include <array>\n\nint main() {\n   // lambda to display a collection of items\n   const auto display{\n      [](const auto& items) {\n         for (const auto& item : items) {\n            std::cout << std::format(\"{} \", item);\n         }\n       }\n   };\n\n   // initializing an array with a string literal\n   // creates a one-element array<const char*>\n   const auto array1{std::array{\"abc\"}};\n   std::cout << std::format(\"array1.size() = {}\\narray1: \",\n      array1.size());\n   display(array1); // use lambda to display contents\n\n   // creating std::array of characters from a string literal \n   const auto array2{std::to_array(\"C++20\")};\n   std::cout << std::format(\"\\n\\narray2.size() = {}\\narray2: \",\n      array2.size());\n   display(array2); // use lambda to display contents\n\n   std::cout << '\\n';\n}\n\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson08/accounts.csv",
    "content": "account,name,balance\r\n100,Devi,24.98\r\n200,Taylor,345.67\r\n300,Huber,0.0\r\n400,Karimov,-42.16\r\n500,Sosa,224.62"
  },
  {
    "path": "examples/lesson08/fig08_01.cpp",
    "content": "// fig08_01.cpp\r\n// Demonstrating string assignment and concatenation.\r\n#include <format> \r\n#include <iostream>\r\n#include <string> \r\n\r\nint main() {\r\n   std::string s1{\"cat\"};\r\n   std::string s2; // initialized to the empty string\r\n   std::string s3; // initialized to the empty string\r\n\r\n   s2 = s1; // assign s1 to s2      \r\n   s3.assign(s1); // assign s1 to s3\r\n   std::cout << std::format(\"s1: {}\\ns2: {}\\ns3: {}\\n\\n\", s1, s2, s3);\r\n\r\n   s2.at(0) = 'r'; // modify s2 \r\n   s3.at(2) = 'r'; // modify s3\r\n   std::cout << std::format(\"After changes:\\ns2: {}\\ns3: {}\", s2, s3);\r\n\r\n   std::cout << \"\\n\\nAfter concatenations:\\n\";\r\n   std::string s4{s1 + \"apult\"}; // concatenation\r\n   s1.append(\"acomb\"); // create \"catacomb\"\r\n   s3 += \"pet\"; // create \"carpet\" with overloaded +=\r\n   std::cout << std::format(\"s1: {}\\ns3: {}\\ns4: {}\\n\", s1, s3, s4);\r\n\r\n   // append locations 4 through end of s1 to\r\n   // create string \"comb\" (s5 was initially empty)    \r\n   std::string s5; // initialized to the empty string\r\n   s5.append(s1, 4, s1.size() - 4);\r\n   std::cout << std::format(\"s5: {}\\n\", s5);\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson08/fig08_02.cpp",
    "content": "// fig08_02.cpp\r\n// Comparing strings.\r\n#include <format>\r\n#include <iostream>\r\n#include <string>\r\n\r\nvoid displayResult(const std::string& s, int result) {\r\n   if (result == 0) {\r\n      std::cout << std::format(\"{} == 0\\n\", s);\r\n   }\r\n   else if (result > 0) {\r\n      std::cout << std::format(\"{} > 0\\n\", s);\r\n   }\r\n   else { // result < 0\r\n      std::cout << std::format(\"{} < 0\\n\", s);\r\n   }\r\n}\r\n\r\nint main() {\r\n   const std::string s1{\"Testing the comparison functions.\"};\r\n   const std::string s2{\"Hello\"};\r\n   const std::string s3{\"stinger\"};\r\n   const std::string s4{s2}; // \"Hello\"\r\n\r\n   std::cout << std::format(\"s1: {}\\ns2: {}\\ns3: {}\\ns4: {}\\n\\n\",\r\n      s1, s2, s3, s4);\r\n\r\n   // comparing s1 and s4\r\n   if (s1 > s4) {\r\n      std::cout << \"s1 > s4\\n\";\r\n   }\r\n\r\n   // comparing s1 and s2\r\n   displayResult(\"s1.compare(s2)\", s1.compare(s2));\r\n\r\n   // comparing s1 (elements 2-6) and s3 (elements 0-4)\r\n   displayResult(\"s1.compare(2, 5, s3, 0, 5)\",\r\n      s1.compare(2, 5, s3, 0, 5));\r\n\r\n   // comparing s2 and s4\r\n   displayResult(\"s4.compare(0, s2.size(), s2)\",\r\n      s4.compare(0, s2.size(), s2));\r\n\r\n   // comparing s2 and s4\r\n   displayResult(\"s2.compare(0, 3, s4)\", s2.compare(0, 3, s4));\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson08/fig08_03.cpp",
    "content": "// fig08_03.cpp\r\n// Demonstrating string member function substr.\r\n#include <iostream>\r\n#include <string>\r\n\r\nint main() {\r\n   const std::string s{\"airplane\"};\r\n   std::cout << s.substr(3, 4) << '\\n'; // retrieve substring \"plan\" \r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n\r\n"
  },
  {
    "path": "examples/lesson08/fig08_04.cpp",
    "content": "// fig08_04.cpp\r\n// Using the swap function to swap two strings.\r\n#include <format> \r\n#include <iostream>\r\n#include <string>\r\n\r\nint main() {\r\n   std::string s1{\"one\"};\r\n   std::string s2{\"two\"};\r\n\r\n   std::cout << std::format(\"Before swap:\\ns1: {}; s2: {}\\n\\n\", s1, s2);\r\n   s1.swap(s2); // swap strings\r\n   std::cout << std::format(\"After swap:\\ns1: {}; s2: {}\\n\", s1, s2);\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson08/fig08_05.cpp",
    "content": "// fig08_05.cpp\r\n// Printing string characteristics.\r\n#include <format> \r\n#include <iostream>\r\n#include <string>\r\n\r\n// display string statistics\r\nvoid printStatistics(const std::string& s) {\r\n   std::cout << std::format(\r\n      \"capacity: {}\\nmax size: {}\\nsize: {}\\nempty: {}\",\r\n      s.capacity(), s.max_size(), s.size(), s.empty());\r\n}\r\n\r\nint main() {\r\n   std::string string1; // empty string\r\n\r\n   std::cout << \"Statistics before input:\\n\";\r\n   printStatistics(string1);\r\n\r\n   std::cout << \"\\n\\nEnter a string: \";\r\n   std::cin >> string1; // delimited by whitespace\r\n   std::cout << std::format(\"The string entered was: {}\\n\", string1);\r\n   std::cout << \"Statistics after input:\\n\";\r\n   printStatistics(string1);\r\n\r\n   std::cout << \"\\n\\nEnter a string: \";\r\n   std::cin >> string1; // delimited by whitespace\r\n   std::cout << std::format(\"The string entered was: {}\\n\", string1);\r\n   std::cout << \"Statistics after input:\\n\";\r\n   printStatistics(string1);\r\n\r\n   // append 46 characters to string1\r\n   string1 += \"1234567890abcdefghijklmnopqrstuvwxyz1234567890\";\r\n   std::cout << std::format(\"\\n\\nstring1 is now: {}\\n\", string1);\r\n   std::cout << \"Statistics after concatenation:\\n\";\r\n   printStatistics(string1);\r\n\r\n   string1.resize(string1.size() + 10); // add 10 elements to string1\r\n   std::cout << \"\\n\\nStatistics after resizing to add 10 characters:\\n\";\r\n   printStatistics(string1);\r\n   std::cout << '\\n';\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson08/fig08_06.cpp",
    "content": "// fig08_06.cpp\r\n// Demonstrating the string find member functions.\r\n#include <format> \r\n#include <iostream>\r\n#include <string>\r\n\r\nint main() {\r\n   const std::string s{\"noon is 12pm; midnight is not\"};\r\n   std::cout << \"Original string: \" << s;\r\n\r\n   // find \"is\" from the beginning and end of s\r\n   std::cout << std::format(\"\\ns.find(\\\"is\\\"): {}\\ns.rfind(\\\"is\\\"): {}\",\r\n      s.find(\"is\"), s.rfind(\"is\"));\r\n\r\n   // find 'o' from beginning\r\n   auto location{s.find_first_of(\"misop\")};\r\n   std::cout << std::format(\"\\ns.find_first_of(\\\"misop\\\") found {} at {}\",\r\n      s.at(location), location);\r\n\r\n   // find 'o' from end\r\n   location = s.find_last_of(\"misop\");\r\n   std::cout << std::format(\"\\ns.find_last_of(\\\"misop\\\") found {} at {}\",\r\n      s.at(location), location);\r\n\r\n   // find '1' from beginning\r\n   location = s.find_first_not_of(\"noi spm\");\r\n   std::cout << std::format(\r\n      \"\\ns.find_first_not_of(\\\"noi spm\\\") found {} at {}\",\r\n      s.at(location), location);\r\n\r\n   // find ';' at location 12\r\n   location = s.find_first_not_of(\"12noi spm\");\r\n   std::cout << std::format(\r\n      \"\\ns.find_first_not_of(\\\"12noi spm\\\") found {} at {}\",\r\n      s.at(location), location);\r\n\r\n   // search for characters not in \"noon is 12pm; midnight is not\"\r\n   location = s.find_first_not_of(\"noon is 12pm; midnight is not\");\r\n\r\n   if (location == std::string::npos) {\r\n      std::cout << std::format(\"\\n{}: not found\\n\",\r\n         \"s.find_first_not_of(\\\"noon is 12pm; midnight is not\\\")\");\r\n   }\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson08/fig08_07.cpp",
    "content": "// fig08_07.cpp\r\n// Demonstrating string member functions erase and replace.\r\n#include <format> \r\n#include <iostream>\r\n#include <string>\r\n\r\nint main() {\r\n   // compiler concatenates all parts into one string\r\n   std::string string1{\"The values in any left subtree\"\r\n      \"\\nare less than the value in the\"\r\n      \"\\nparent node and the values in\"\r\n      \"\\nany right subtree are greater\"\r\n      \"\\nthan the value in the parent node\"};\r\n\r\n   std::cout << std::format(\"Original string:\\n{}\\n\\n\", string1);\r\n\r\n   string1.erase(62); // remove from index 62 through end of string1\r\n   std::cout << std::format(\"string1 after erase:\\n{}\\n\\n\", string1);\r\n\r\n   size_t position{string1.find(\" \")}; // find first space\r\n\r\n   // replace all spaces with period\r\n   while (position != std::string::npos) {\r\n      string1.replace(position, 1, \".\");\r\n      position = string1.find(\" \", position + 1);\r\n   }\r\n\r\n   std::cout << std::format(\"After first replacement:\\n{}\\n\\n\", string1);\r\n\r\n   position = string1.find(\".\"); // find first period\r\n\r\n   // replace all periods with two semicolons\r\n   // NOTE: this will overwrite characters\r\n   while (position != std::string::npos) {\r\n      string1.replace(position, 2, \"xxxxx;;yyy\", 5, 2);\r\n      position = string1.find(\".\", position + 2);\r\n   }\r\n\r\n   std::cout << std::format(\"After second replacement:\\n{}\\n\", string1);\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n\r\n"
  },
  {
    "path": "examples/lesson08/fig08_08.cpp",
    "content": "// fig08_08.cpp\r\n// Demonstrating std::string insert member functions.\r\n#include <format> \r\n#include <iostream>\r\n#include <string>\r\n\r\nint main() {\r\n   std::string s1{\"beginning end\"};\r\n   std::string s2{\"12345678\"};\r\n\r\n   std::cout << std::format(\"Initial strings:\\ns1: {}\\ns2: {}\\n\\n\",\r\n      s1, s2);\r\n\r\n   s1.insert(10, \"middle \"); // insert \"middle \" at location 10 \r\n   s2.insert(3, \"xx\", 0, std::string::npos); // insert \"xx\" at location 3\r\n\r\n   std::cout << std::format(\"Strings after insert:\\ns1: {}\\ns2: {}\\n\",\r\n      s1, s2);\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson08/fig08_09.cpp",
    "content": "// fig08_09.cpp\r\n// Demonstrating string_view.\r\n#include <format> \r\n#include <iostream>\r\n#include <string>\r\n#include <string_view> \r\n\r\nint main() {\r\n   std::string s1{\"red\"};\r\n   std::string s2{s1};\r\n   std::string_view v1{s1}; // v1 \"sees\" the contents of s1\r\n   std::cout << std::format(\"s1: {}\\ns2: {}\\nv1: {}\\n\\n\", s1, s2, v1);\r\n\r\n   // string_views see changes to the characters they view\r\n   s1.at(0) = 'R'; // capitalize s1\r\n   std::cout << std::format(\"s1: {}\\ns2: {}\\nv1: {}\\n\\n\", s1, s2, v1);\r\n\r\n   // string_views are comparable with strings or string_views\r\n   std::cout << std::format(\"s1 == v1: {}\\ns2 == v1: {}\\n\\n\",\r\n      s1 == v1, s2 == v1);\r\n\r\n   // string_view can remove a prefix or suffix\r\n   v1.remove_prefix(1); // remove one character from the front\r\n   v1.remove_suffix(1); // remove one character from the back\r\n   std::cout << std::format(\"s1: {}\\nv1: {}\\n\\n\", s1, v1);\r\n\r\n   // string_views are iterable\r\n   std::string_view v2{\"C-string\"};\r\n   std::cout << \"The characters in v2 are: \";\r\n   for (char c : v2) {\r\n      std::cout << c << \" \";\r\n   }\r\n\r\n   // string_views enable various string operations on C-Strings\r\n   std::cout << std::format(\"\\n\\nv2.size(): {}\\n\", v2.size());\r\n   std::cout << std::format(\"v2.find('-'): {}\\n\", v2.find('-'));\r\n   std::cout << std::format(\"v2.starts_with('C'): {}\\n\",\r\n      v2.starts_with('C'));\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson08/fig08_10.cpp",
    "content": "// fig08_10.cpp\r\n// Creating a sequential file.\r\n#include <cstdlib> // exit function prototype              \r\n#include <format> \r\n#include <fstream> // contains file stream processing types\r\n#include <iostream>\r\n#include <string>\r\n\r\nint main() {\r\n   // ofstream opens the file                \r\n   if (std::ofstream output{\"clients.txt\", std::ios::out}) {\r\n      std::cout << \"Enter the account, name, and balance.\\n\"\r\n         << \"Enter end-of-file to end input.\\n? \";\r\n\r\n      int account;\r\n      std::string name;\r\n      double balance;\r\n\r\n      // read account, name and balance from cin, then place in file\r\n      while (std::cin >> account >> name >> balance) {\r\n         output << std::format(\"{} {} {}\\n\", account, name, balance);\r\n         std::cout << \"? \";\r\n      }\r\n   }\r\n   else {\r\n      std::cerr << \"File could not be opened\\n\";\r\n      std::exit(EXIT_FAILURE);\r\n   }\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson08/fig08_11.cpp",
    "content": "// fig08_11.cpp\r\n// Reading and printing a sequential file.\r\n#include <cstdlib> \r\n#include <format> \r\n#include <fstream> // file stream        \r\n#include <iostream>\r\n#include <string>\r\n\r\nint main() {\r\n   // ifstream opens the file          \r\n   if (std::ifstream input{\"clients.txt\", std::ios::in}) {\r\n      std::cout << std::format(\"{:<10}{:<13}{:>7}\\n\",\r\n         \"Account\", \"Name\", \"Balance\");\r\n\r\n      int account;\r\n      std::string name;\r\n      double balance;\r\n\r\n      // display each record in file\r\n      while (input >> account >> name >> balance) {\r\n         std::cout << std::format(\"{:<10}{:<13}{:>7.2f}\\n\",\r\n            account, name, balance);\r\n      }\r\n   }\r\n   else {\r\n      std::cerr << \"File could not be opened\\n\";\r\n      std::exit(EXIT_FAILURE);\r\n   }\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson08/fig08_12.cpp",
    "content": "// fig08_12.cpp\r\n// Using an ostringstream object.\r\n#include <iostream>\r\n#include <sstream> // header for string stream processing\r\n#include <string>\r\n\r\nint main() {\r\n   std::ostringstream output; // create ostringstream object\r\n\r\n   const std::string string1{\"Output of several data types \"};\r\n   const std::string string2{\"to an ostringstream object:\"};\r\n   const std::string string3{\"\\ndouble: \"};\r\n   const std::string string4{\"\\n   int: \"};\r\n\r\n   constexpr double d{123.4567};\r\n   constexpr int i{22};\r\n\r\n   // output strings, double and int to ostringstream \r\n   output << string1 << string2 << string3 << d << string4 << i;\r\n\r\n   // call str to obtain string contents of the ostringstream\r\n   std::cout << \"output contains:\\n\" << output.str();\r\n\r\n   // add additional characters and call str to output string\r\n   output << \"\\nmore characters added\";\r\n   std::cout << \"\\n\\noutput now contains:\\n\" << output.str() << '\\n';\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson08/fig08_13.cpp",
    "content": "// fig08_13.cpp\r\n// Demonstrating input from an istringstream object.\r\n#include <format> \r\n#include <iostream>\r\n#include <sstream> \r\n#include <string>\r\n\r\nint main() {\r\n   const std::string inputString{\"Atonia test 123 4.7 A\"};\r\n   std::istringstream input{inputString};\r\n   std::string s1;\r\n   std::string s2;\r\n   int i;\r\n   double d;\r\n   char c;\r\n\r\n   input >> s1 >> s2 >> i >> d >> c;\r\n\r\n   std::cout << \"Items extracted from the istringstream object:\\n\"\r\n      << std::format(\"{}\\n{}\\n{}\\n{}\\n{}\\n\", s1, s2, i, d, c);\r\n\r\n   // attempt to read from empty stream\r\n   if (long value; input >> value) {\r\n      std::cout << std::format(\"\\nlong value is: {}\\n\", value);\r\n   }\r\n   else {\r\n      std::cout << std::format(\"\\ninput is empty\\n\");\r\n   }\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson08/fig08_14.cpp",
    "content": "// fig08_14.cpp\r\n// Reading from a CSV file.\r\n#include <format> \r\n#include <iostream>\r\n#include <rapidcsv.h> \r\n#include <vector>\r\n\r\nint main() {\r\n   rapidcsv::Document document{\"accounts.csv\"}; // loads accounts.csv\r\n   std::vector<int> accounts{document.GetColumn<int>(\"account\")};\r\n   std::vector<std::string> names{\r\n      document.GetColumn<std::string>(\"name\")};\r\n   std::vector<double> balances{document.GetColumn<double>(\"balance\")};\r\n\r\n   std::cout << std::format(\r\n      \"{:<10}{:<13}{:>7}\\n\", \"Account\", \"Name\", \"Balance\");\r\n\r\n   for (size_t i{0}; i < accounts.size(); ++i) {\r\n      std::cout << std::format(\"{:<10}{:<13}{:>7.2f}\\n\",\r\n         accounts.at(i), names.at(i), balances.at(i));\r\n   }\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson08/fig08_15.cpp",
    "content": "// fig08_15.cpp\r\n// Reading the Titanic dataset from a CSV file, then analyzing it.\r\n#include <format> \r\n#include <algorithm>\r\n#include <cmath>\r\n#include <iostream>\r\n#include <numeric>\r\n#include <ranges>\r\n#include <rapidcsv.h> \r\n#include <string>\r\n#include <vector>\r\n\r\nint main() {\r\n   // load Titanic dataset; treat missing age values as NaN\r\n   rapidcsv::Document titanic{\"titanic.csv\",\r\n      rapidcsv::LabelParams{}, rapidcsv::SeparatorParams{},\r\n      rapidcsv::ConverterParams{true}};\r\n\r\n   // GetColumn returns column's data as a vector of the appropriate type\r\n   auto survived{titanic.GetColumn<int>(\"survived\")};\r\n   auto sex{titanic.GetColumn<std::string>(\"sex\")};\r\n   auto age{titanic.GetColumn<double>(\"age\")};\r\n   auto pclass{titanic.GetColumn<int>(\"pclass\")};\r\n\r\n   // display first 5 rows\r\n   std::cout << std::format(\"First five rows:\\n{:<10}{:<8}{:<6}{}\\n\",\r\n      \"survived\", \"sex\", \"age\", \"class\");\r\n   for (size_t i{0}; i < 5; ++i) {\r\n      std::cout << std::format(\"{:<10}{:<8}{:<6.1f}{}\\n\",\r\n         survived.at(i), sex.at(i), age.at(i), pclass.at(i));\r\n   }\r\n\r\n   // display last 5 rows\r\n   std::cout << std::format(\"\\nLast five rows:\\n{:<10}{:<8}{:<6}{}\\n\",\r\n      \"survived\", \"sex\", \"age\", \"class\");\r\n   const auto count{titanic.GetRowCount()};\r\n   for (size_t i{count - 5}; i < count; ++i) {\r\n      std::cout << std::format(\"{:<10}{:<8}{:<6.1f}{}\\n\",\r\n         survived.at(i), sex.at(i), age.at(i), pclass.at(i));\r\n   }\r\n\r\n   // use C++20 ranges to eliminate missing values from age column\r\n   auto removeNaN{age |\r\n      std::views::filter([](const auto& x) {return !std::isnan(x);})};\r\n   std::vector<double> cleanAge{\r\n      std::begin(removeNaN), std::end(removeNaN)};\r\n\r\n   // descriptive statistics for cleaned ages column\r\n   std::sort(std::begin(cleanAge), std::end(cleanAge));\r\n   size_t size{cleanAge.size()};\r\n   double median{};\r\n\r\n   if (size % 2 == 0) { // find median value for even number of items\r\n      median = (cleanAge.at(size / 2 - 1) + cleanAge.at(size / 2)) / 2;\r\n   }\r\n   else { // find median value for odd number of items\r\n      median = cleanAge.at(size / 2);\r\n   }\r\n\r\n   std::cout << \"\\nDescriptive statistics for the age column:\\n\"\r\n      << std::format(\"Passengers with age data: {}\\n\", size)\r\n      << std::format(\"Average age: {:.2f}\\n\", std::accumulate(\r\n         std::begin(cleanAge), std::end(cleanAge), 0.0) / size)\r\n      << std::format(\"Minimum age: {:.2f}\\n\", cleanAge.front())\r\n      << std::format(\"Maximum age: {:.2f}\\n\", cleanAge.back())\r\n      << std::format(\"Median age: {:.2f}\\n\", median);\r\n\r\n   // passenger counts by class\r\n   auto countClass{\r\n      [](const auto& column, const int classNumber) {\r\n         return std::ranges::count_if(column, \r\n            [classNumber](int x) {return classNumber == x;});\r\n      }\r\n   };\r\n\r\n   constexpr int firstClass{1};\r\n   constexpr int secondClass{2};\r\n   constexpr int thirdClass{3};\r\n   const auto firstCount{countClass(pclass, firstClass)};\r\n   const auto secondCount{countClass(pclass, secondClass)};\r\n   const auto thirdCount{countClass(pclass, thirdClass)};\r\n\r\n   std::cout << \"\\nPassenger counts by class:\\n\"\r\n      << std::format(\"1st: {}\\n2nd: {}\\n3rd: {}\\n\\n\",\r\n         firstCount, secondCount, thirdCount);\r\n\r\n   // percentage of people who survived\r\n   const auto survivorCount{\r\n      std::ranges::count_if(survived, [](auto x) {return x;})\r\n   };\r\n\r\n   std::cout << std::format(\"Survived count: {}\\nDied count: {}\\n\",\r\n      survivorCount, survived.size() - survivorCount);\r\n   std::cout << std::format(\"Percent who survived: {:.2f}%\\n\\n\",\r\n      100.0 * survivorCount / survived.size());\r\n\r\n   // count who survived by male/female, 1st/2nd/3rd class\r\n   int survivingMales{0};\r\n   int survivingFemales{0};\r\n   int surviving1st{0};\r\n   int surviving2nd{0};\r\n   int surviving3rd{0};\r\n\r\n   for (size_t i{0}; i < survived.size(); ++i) {\r\n      if (survived.at(i)) {\r\n         sex.at(i) == \"female\" ? ++survivingFemales : ++survivingMales;\r\n\r\n         if (firstClass == pclass.at(i)) {\r\n            ++surviving1st;\r\n         }\r\n         else if (secondClass == pclass.at(i)) {\r\n            ++surviving2nd;\r\n         }\r\n         else { // third class\r\n            ++surviving3rd;\r\n         }\r\n      }\r\n   }\r\n\r\n   // percentages who survived by male/female, 1st/2nd/3rd class\r\n   std::cout << std::format(\"Female survivor percentage: {:.2f}%\\n\",\r\n      100.0 * survivingFemales / survivorCount)\r\n      << std::format(\"Male survivor percentage: {:.2f}%\\n\\n\",\r\n         100.0 * survivingMales / survivorCount)\r\n      << std::format(\"1st class survivor percentage: {:.2f}%\\n\",\r\n         100.0 * surviving1st / survivorCount)\r\n      << std::format(\"2nd class survivor percentage: {:.2f}%\\n\",\r\n         100.0 * surviving2nd / survivorCount)\r\n      << std::format(\"3rd class survivor percentage: {:.2f}%\\n\",\r\n         100.0 * surviving3rd / survivorCount);\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson08/fig08_16.cpp",
    "content": "// fig08_16.cpp\r\n// Matching entire strings to regular expressions.\r\n#include <format> \r\n#include <iostream>\r\n#include <regex>\r\n\r\nint main() {\r\n   // fully match a pattern of literal characters\r\n   std::regex r1{\"02215\"};\r\n   std::cout << \"Matching against: 02215\\n\"\r\n      << std::format(\"02215: {}; 51220: {}\\n\\n\",\r\n            std::regex_match(\"02215\", r1), std::regex_match(\"51220\", r1));\r\n\r\n   // fully match five digits\r\n   std::regex r2{R\"(\\d{5})\"};\r\n   std::cout << R\"(Matching against: \\d{5})\" << \"\\n\"\r\n      << std::format(\"02215: {}; 9876: {}\\n\\n\",\r\n            std::regex_match(\"02215\", r2),\r\n            std::regex_match(\"9876\", r2));\r\n\r\n   // match a word that starts with a capital letter\r\n   std::regex r3{\"[A-Z][a-z]*\"};\r\n   std::cout << \"Matching against: [A-Z][a-z]*\\n\"\r\n      << std::format(\"Angel: {}; tina: {}\\n\\n\",\r\n            std::regex_match(\"Angel\", r3), std::regex_match(\"tina\", r3));\r\n\r\n   // match any character that's not a lowercase letter\r\n   std::regex r4{\"[^a-z]\"};\r\n   std::cout << \"Matching against: [^a-z]\\n\"\r\n      << std::format(\"A: {}; a: {}\\n\\n\",\r\n            std::regex_match(\"A\", r4), std::regex_match(\"a\", r4));\r\n\r\n   // match metacharacters as literals in a custom character class\r\n   std::regex r5{\"[*+$]\"};\r\n   std::cout << \"Matching against: [*+$]\\n\"\r\n      << std::format(\"*: {}; !: {}\\n\\n\",\r\n            std::regex_match(\"*\", r5), std::regex_match(\"!\", r5));\r\n\r\n   // matching a capital letter followed by at least one lowercase letter \r\n   std::regex r6{\"[A-Z][a-z]+\"};\r\n   std::cout << \"Matching against: [A-Z][a-z]+\\n\"\r\n      << std::format(\"Angel: {}; T: {}\\n\\n\",\r\n            std::regex_match(\"Angel\", r6), std::regex_match(\"T\", r6));\r\n\r\n   // matching zero or one occurrences of a subexpression\r\n   std::regex r7{\"labell?ed\"};\r\n   std::cout << \"Matching against: labell?ed\\n\"\r\n      << std::format(\"labelled: {}; labeled: {}; labellled: {}\\n\\n\",\r\n            std::regex_match(\"labelled\", r7),\r\n            std::regex_match(\"labeled\", r7),\r\n            std::regex_match(\"labellled\", r7));\r\n\r\n   // matching n (3) or more occurrences of a subexpression\r\n   std::regex r8{R\"(\\d{3,})\"};\r\n   std::cout << R\"(Matching against: \\d{3,})\" << \"\\n\"\r\n      << std::format(\"123: {}; 1234567890: {}; 12: {}\\n\\n\",\r\n            std::regex_match(\"123\", r8),\r\n            std::regex_match(\"1234567890\", r8),\r\n            std::regex_match(\"12\", r8));\r\n\r\n   // matching n to m inclusive (3-6), occurrences of a subexpression\r\n   std::regex r9{R\"(\\d{3,6})\"};\r\n   std::cout << R\"(Matching against: \\d{3,6})\" << \"\\n\"\r\n      << std::format(\"123: {}; 123456: {}; 1234567: {}; 12: {}\\n\",\r\n            std::regex_match(\"123\", r9), std::regex_match(\"123456\", r9),\r\n            std::regex_match(\"1234567\", r9), std::regex_match(\"12\", r9));\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson08/fig08_17.cpp",
    "content": "// fig08_17.cpp\r\n// Regular expression replacements.\r\n#include <format> \r\n#include <iostream>\r\n#include <regex>\r\n#include <string>\r\n\r\nint main() {\r\n   // replace tabs with commas\r\n   std::string s1{\"1\\t2\\t3\\t4\"};\r\n   std::cout << std::format(\"Original string: {}\\n\", R\"(1\\t2\\t3\\t4)\")\r\n      << std::format(\"After replacing tabs with commas: {}\\n\",\r\n            std::regex_replace(s1, std::regex{\"\\t\"}, \",\"));\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson08/fig08_18.cpp",
    "content": "// fig08_18.cpp\r\n// Matching patterns throughout a string.\r\n#include <format> \r\n#include <iostream>\r\n#include <regex>\r\n#include <string>\r\n\r\nint main() {\r\n   // performing a simple match\r\n   std::string s1{\"Programming is fun\"};\r\n   std::cout << std::format(\"s1: {}\\n\\n\", s1);\r\n   std::cout << \"Search anywhere in s1:\\n\"\r\n      << std::format(\"Programming: {}; fun: {}; fn: {}\\n\\n\",\r\n            std::regex_search(s1, std::regex{\"Programming\"}),\r\n            std::regex_search(s1, std::regex{\"fun\"}),\r\n            std::regex_search(s1, std::regex{\"fn\"}));\r\n\r\n   // ignoring case\r\n   std::string s2{\"AZUEL MAGAR\"};\r\n   std::smatch match; // store the text that matches the pattern\r\n   std::cout << std::format(\"s2: {}\\n\\n\", s2);\r\n   std::cout << \"Case insensitive search for Azuel in s2:\\n\"\r\n      << std::format(\"Azuel: {}\\n\", std::regex_search(s2, match,\r\n            std::regex{\"Azuel\", std::regex_constants::icase}))\r\n      << std::format(\"Matched text: {}\\n\\n\", match.str());\r\n\r\n   // finding all matches\r\n   std::string contact{\r\n      \"Ando Devi, Home: 555-555-1234, Work: 555-555-4321\"};\r\n   std::regex phone{R\"(\\d{3}-\\d{3}-\\d{4})\"};\r\n\r\n   std::cout << std::format(\"Finding phone numbers in:\\n{}\\n\", contact);\r\n   while (std::regex_search(contact, match, phone)) {\r\n      std::cout << std::format(\"   {}\\n\", match.str());\r\n      contact = match.suffix();\r\n   }\r\n}\r\n\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson08/format.cc",
    "content": "// Formatting library for C++\n//\n// Copyright (c) 2012 - 2016, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include \"fmt/format-inl.h\"\n\nFMT_BEGIN_NAMESPACE\nnamespace internal {\n\ntemplate <typename T>\nint format_float(char* buf, std::size_t size, const char* format, int precision,\n                 T value) {\n#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION\n  if (precision > 100000)\n    throw std::runtime_error(\n        \"fuzz mode - avoid large allocation inside snprintf\");\n#endif\n  // Suppress the warning about nonliteral format string.\n  int (*snprintf_ptr)(char*, size_t, const char*, ...) = FMT_SNPRINTF;\n  return precision < 0 ? snprintf_ptr(buf, size, format, value)\n                       : snprintf_ptr(buf, size, format, precision, value);\n}\nstruct sprintf_specs {\n  int precision;\n  char type;\n  bool alt : 1;\n\n  template <typename Char>\n  constexpr sprintf_specs(basic_format_specs<Char> specs)\n      : precision(specs.precision), type(specs.type), alt(specs.alt) {}\n\n  constexpr bool has_precision() const { return precision >= 0; }\n};\n\n// This is deprecated and is kept only to preserve ABI compatibility.\ntemplate <typename Double>\nchar* sprintf_format(Double value, internal::buffer<char>& buf,\n                     sprintf_specs specs) {\n  // Buffer capacity must be non-zero, otherwise MSVC's vsnprintf_s will fail.\n  FMT_ASSERT(buf.capacity() != 0, \"empty buffer\");\n\n  // Build format string.\n  enum { max_format_size = 10 };  // longest format: %#-*.*Lg\n  char format[max_format_size];\n  char* format_ptr = format;\n  *format_ptr++ = '%';\n  if (specs.alt || !specs.type) *format_ptr++ = '#';\n  if (specs.precision >= 0) {\n    *format_ptr++ = '.';\n    *format_ptr++ = '*';\n  }\n  if (std::is_same<Double, long double>::value) *format_ptr++ = 'L';\n\n  char type = specs.type;\n\n  if (type == '%')\n    type = 'f';\n  else if (type == 0 || type == 'n')\n    type = 'g';\n#if FMT_MSC_VER\n  if (type == 'F') {\n    // MSVC's printf doesn't support 'F'.\n    type = 'f';\n  }\n#endif\n  *format_ptr++ = type;\n  *format_ptr = '\\0';\n\n  // Format using snprintf.\n  char* start = nullptr;\n  char* decimal_point_pos = nullptr;\n  for (;;) {\n    std::size_t buffer_size = buf.capacity();\n    start = &buf[0];\n    int result =\n        format_float(start, buffer_size, format, specs.precision, value);\n    if (result >= 0) {\n      unsigned n = internal::to_unsigned(result);\n      if (n < buf.capacity()) {\n        // Find the decimal point.\n        auto p = buf.data(), end = p + n;\n        if (*p == '+' || *p == '-') ++p;\n        if (specs.type != 'a' && specs.type != 'A') {\n          while (p < end && *p >= '0' && *p <= '9') ++p;\n          if (p < end && *p != 'e' && *p != 'E') {\n            decimal_point_pos = p;\n            if (!specs.type) {\n              // Keep only one trailing zero after the decimal point.\n              ++p;\n              if (*p == '0') ++p;\n              while (p != end && *p >= '1' && *p <= '9') ++p;\n              char* where = p;\n              while (p != end && *p == '0') ++p;\n              if (p == end || *p < '0' || *p > '9') {\n                if (p != end) std::memmove(where, p, to_unsigned(end - p));\n                n -= static_cast<unsigned>(p - where);\n              }\n            }\n          }\n        }\n        buf.resize(n);\n        break;  // The buffer is large enough - continue with formatting.\n      }\n      buf.reserve(n + 1);\n    } else {\n      // If result is negative we ask to increase the capacity by at least 1,\n      // but as std::vector, the buffer grows exponentially.\n      buf.reserve(buf.capacity() + 1);\n    }\n  }\n  return decimal_point_pos;\n}\n}  // namespace internal\n\ntemplate FMT_API char* internal::sprintf_format(double, internal::buffer<char>&,\n                                                sprintf_specs);\ntemplate FMT_API char* internal::sprintf_format(long double,\n                                                internal::buffer<char>&,\n                                                sprintf_specs);\n\ntemplate struct FMT_INSTANTIATION_DEF_API internal::basic_data<void>;\n\n// Workaround a bug in MSVC2013 that prevents instantiation of format_float.\nint (*instantiate_format_float)(double, int, internal::float_specs,\n                                internal::buffer<char>&) =\n    internal::format_float;\n\n#ifndef FMT_STATIC_THOUSANDS_SEPARATOR\ntemplate FMT_API internal::locale_ref::locale_ref(const std::locale& loc);\ntemplate FMT_API std::locale internal::locale_ref::get<std::locale>() const;\n#endif\n\n// Explicit instantiations for char.\n\ntemplate FMT_API std::string internal::grouping_impl<char>(locale_ref);\ntemplate FMT_API char internal::thousands_sep_impl(locale_ref);\ntemplate FMT_API char internal::decimal_point_impl(locale_ref);\n\ntemplate FMT_API void internal::buffer<char>::append(const char*, const char*);\n\ntemplate FMT_API void internal::arg_map<format_context>::init(\n    const basic_format_args<format_context>& args);\n\ntemplate FMT_API std::string internal::vformat<char>(\n    string_view, basic_format_args<format_context>);\n\ntemplate FMT_API format_context::iterator internal::vformat_to(\n    internal::buffer<char>&, string_view, basic_format_args<format_context>);\n\ntemplate FMT_API int internal::snprintf_float(double, int,\n                                              internal::float_specs,\n                                              internal::buffer<char>&);\ntemplate FMT_API int internal::snprintf_float(long double, int,\n                                              internal::float_specs,\n                                              internal::buffer<char>&);\ntemplate FMT_API int internal::format_float(double, int, internal::float_specs,\n                                            internal::buffer<char>&);\ntemplate FMT_API int internal::format_float(long double, int,\n                                            internal::float_specs,\n                                            internal::buffer<char>&);\n\n// Explicit instantiations for wchar_t.\n\ntemplate FMT_API std::string internal::grouping_impl<wchar_t>(locale_ref);\ntemplate FMT_API wchar_t internal::thousands_sep_impl(locale_ref);\ntemplate FMT_API wchar_t internal::decimal_point_impl(locale_ref);\n\ntemplate FMT_API void internal::buffer<wchar_t>::append(const wchar_t*,\n                                                        const wchar_t*);\n\ntemplate FMT_API std::wstring internal::vformat<wchar_t>(\n    wstring_view, basic_format_args<wformat_context>);\nFMT_END_NAMESPACE\n"
  },
  {
    "path": "examples/lesson08/titanic.csv",
    "content": "\"pclass\",\"survived\",\"name\",\"sex\",\"age\",\"sibsp\",\"parch\",\"ticket\",\"fare\",\"cabin\",\"embarked\",\"boat\",\"body\",\"home.dest\"\n1,1,\"Allen, Miss. Elisabeth Walton\",\"female\",29,0,0,\"24160\",211.3375,\"B5\",\"S\",\"2\",?,\"St Louis, MO\"\n1,1,\"Allison, Master. Hudson Trevor\",\"male\",0.9167,1,2,\"113781\",151.55,\"C22 C26\",\"S\",\"11\",?,\"Montreal, PQ / Chesterville, ON\"\n1,0,\"Allison, Miss. Helen Loraine\",\"female\",2,1,2,\"113781\",151.55,\"C22 C26\",\"S\",?,?,\"Montreal, PQ / Chesterville, ON\"\n1,0,\"Allison, Mr. Hudson Joshua Creighton\",\"male\",30,1,2,\"113781\",151.55,\"C22 C26\",\"S\",?,135,\"Montreal, PQ / Chesterville, ON\"\n1,0,\"Allison, Mrs. Hudson J C (Bessie Waldo Daniels)\",\"female\",25,1,2,\"113781\",151.55,\"C22 C26\",\"S\",?,?,\"Montreal, PQ / Chesterville, ON\"\n1,1,\"Anderson, Mr. Harry\",\"male\",48,0,0,\"19952\",26.55,\"E12\",\"S\",\"3\",?,\"New York, NY\"\n1,1,\"Andrews, Miss. Kornelia Theodosia\",\"female\",63,1,0,\"13502\",77.9583,\"D7\",\"S\",\"10\",?,\"Hudson, NY\"\n1,0,\"Andrews, Mr. Thomas Jr\",\"male\",39,0,0,\"112050\",0,\"A36\",\"S\",?,?,\"Belfast, NI\"\n1,1,\"Appleton, Mrs. Edward Dale (Charlotte Lamson)\",\"female\",53,2,0,\"11769\",51.4792,\"C101\",\"S\",\"D\",?,\"Bayside, Queens, NY\"\n1,0,\"Artagaveytia, Mr. Ramon\",\"male\",71,0,0,\"PC 17609\",49.5042,?,\"C\",?,22,\"Montevideo, Uruguay\"\n1,0,\"Astor, Col. John Jacob\",\"male\",47,1,0,\"PC 17757\",227.525,\"C62 C64\",\"C\",?,124,\"New York, NY\"\n1,1,\"Astor, Mrs. John Jacob (Madeleine Talmadge Force)\",\"female\",18,1,0,\"PC 17757\",227.525,\"C62 C64\",\"C\",\"4\",?,\"New York, NY\"\n1,1,\"Aubart, Mme. Leontine Pauline\",\"female\",24,0,0,\"PC 17477\",69.3,\"B35\",\"C\",\"9\",?,\"Paris, France\"\n1,1,\"Barber, Miss. Ellen 'Nellie'\",\"female\",26,0,0,\"19877\",78.85,?,\"S\",\"6\",?,?\n1,1,\"Barkworth, Mr. Algernon Henry Wilson\",\"male\",80,0,0,\"27042\",30,\"A23\",\"S\",\"B\",?,\"Hessle, Yorks\"\n1,0,\"Baumann, Mr. John D\",\"male\",?,0,0,\"PC 17318\",25.925,?,\"S\",?,?,\"New York, NY\"\n1,0,\"Baxter, Mr. Quigg Edmond\",\"male\",24,0,1,\"PC 17558\",247.5208,\"B58 B60\",\"C\",?,?,\"Montreal, PQ\"\n1,1,\"Baxter, Mrs. James (Helene DeLaudeniere Chaput)\",\"female\",50,0,1,\"PC 17558\",247.5208,\"B58 B60\",\"C\",\"6\",?,\"Montreal, PQ\"\n1,1,\"Bazzani, Miss. Albina\",\"female\",32,0,0,\"11813\",76.2917,\"D15\",\"C\",\"8\",?,?\n1,0,\"Beattie, Mr. Thomson\",\"male\",36,0,0,\"13050\",75.2417,\"C6\",\"C\",\"A\",?,\"Winnipeg, MN\"\n1,1,\"Beckwith, Mr. Richard Leonard\",\"male\",37,1,1,\"11751\",52.5542,\"D35\",\"S\",\"5\",?,\"New York, NY\"\n1,1,\"Beckwith, Mrs. Richard Leonard (Sallie Monypeny)\",\"female\",47,1,1,\"11751\",52.5542,\"D35\",\"S\",\"5\",?,\"New York, NY\"\n1,1,\"Behr, Mr. Karl Howell\",\"male\",26,0,0,\"111369\",30,\"C148\",\"C\",\"5\",?,\"New York, NY\"\n1,1,\"Bidois, Miss. Rosalie\",\"female\",42,0,0,\"PC 17757\",227.525,?,\"C\",\"4\",?,?\n1,1,\"Bird, Miss. Ellen\",\"female\",29,0,0,\"PC 17483\",221.7792,\"C97\",\"S\",\"8\",?,?\n1,0,\"Birnbaum, Mr. Jakob\",\"male\",25,0,0,\"13905\",26,?,\"C\",?,148,\"San Francisco, CA\"\n1,1,\"Bishop, Mr. Dickinson H\",\"male\",25,1,0,\"11967\",91.0792,\"B49\",\"C\",\"7\",?,\"Dowagiac, MI\"\n1,1,\"Bishop, Mrs. Dickinson H (Helen Walton)\",\"female\",19,1,0,\"11967\",91.0792,\"B49\",\"C\",\"7\",?,\"Dowagiac, MI\"\n1,1,\"Bissette, Miss. Amelia\",\"female\",35,0,0,\"PC 17760\",135.6333,\"C99\",\"S\",\"8\",?,?\n1,1,\"Bjornstrom-Steffansson, Mr. Mauritz Hakan\",\"male\",28,0,0,\"110564\",26.55,\"C52\",\"S\",\"D\",?,\"Stockholm, Sweden / Washington, DC\"\n1,0,\"Blackwell, Mr. Stephen Weart\",\"male\",45,0,0,\"113784\",35.5,\"T\",\"S\",?,?,\"Trenton, NJ\"\n1,1,\"Blank, Mr. Henry\",\"male\",40,0,0,\"112277\",31,\"A31\",\"C\",\"7\",?,\"Glen Ridge, NJ\"\n1,1,\"Bonnell, Miss. Caroline\",\"female\",30,0,0,\"36928\",164.8667,\"C7\",\"S\",\"8\",?,\"Youngstown, OH\"\n1,1,\"Bonnell, Miss. Elizabeth\",\"female\",58,0,0,\"113783\",26.55,\"C103\",\"S\",\"8\",?,\"Birkdale, England Cleveland, Ohio\"\n1,0,\"Borebank, Mr. John James\",\"male\",42,0,0,\"110489\",26.55,\"D22\",\"S\",?,?,\"London / Winnipeg, MB\"\n1,1,\"Bowen, Miss. Grace Scott\",\"female\",45,0,0,\"PC 17608\",262.375,?,\"C\",\"4\",?,\"Cooperstown, NY\"\n1,1,\"Bowerman, Miss. Elsie Edith\",\"female\",22,0,1,\"113505\",55,\"E33\",\"S\",\"6\",?,\"St Leonards-on-Sea, England Ohio\"\n1,1,\"Bradley, Mr. George ('George Arthur Brayton')\",\"male\",?,0,0,\"111427\",26.55,?,\"S\",\"9\",?,\"Los Angeles, CA\"\n1,0,\"Brady, Mr. John Bertram\",\"male\",41,0,0,\"113054\",30.5,\"A21\",\"S\",?,?,\"Pomeroy, WA\"\n1,0,\"Brandeis, Mr. Emil\",\"male\",48,0,0,\"PC 17591\",50.4958,\"B10\",\"C\",?,208,\"Omaha, NE\"\n1,0,\"Brewe, Dr. Arthur Jackson\",\"male\",?,0,0,\"112379\",39.6,?,\"C\",?,?,\"Philadelphia, PA\"\n1,1,\"Brown, Mrs. James Joseph (Margaret Tobin)\",\"female\",44,0,0,\"PC 17610\",27.7208,\"B4\",\"C\",\"6\",?,\"Denver, CO\"\n1,1,\"Brown, Mrs. John Murray (Caroline Lane Lamson)\",\"female\",59,2,0,\"11769\",51.4792,\"C101\",\"S\",\"D\",?,\"Belmont, MA\"\n1,1,\"Bucknell, Mrs. William Robert (Emma Eliza Ward)\",\"female\",60,0,0,\"11813\",76.2917,\"D15\",\"C\",\"8\",?,\"Philadelphia, PA\"\n1,1,\"Burns, Miss. Elizabeth Margaret\",\"female\",41,0,0,\"16966\",134.5,\"E40\",\"C\",\"3\",?,?\n1,0,\"Butt, Major. Archibald Willingham\",\"male\",45,0,0,\"113050\",26.55,\"B38\",\"S\",?,?,\"Washington, DC\"\n1,0,\"Cairns, Mr. Alexander\",\"male\",?,0,0,\"113798\",31,?,\"S\",?,?,?\n1,1,\"Calderhead, Mr. Edward Pennington\",\"male\",42,0,0,\"PC 17476\",26.2875,\"E24\",\"S\",\"5\",?,\"New York, NY\"\n1,1,\"Candee, Mrs. Edward (Helen Churchill Hungerford)\",\"female\",53,0,0,\"PC 17606\",27.4458,?,\"C\",\"6\",?,\"Washington, DC\"\n1,1,\"Cardeza, Mr. Thomas Drake Martinez\",\"male\",36,0,1,\"PC 17755\",512.3292,\"B51 B53 B55\",\"C\",\"3\",?,\"Austria-Hungary / Germantown, Philadelphia, PA\"\n1,1,\"Cardeza, Mrs. James Warburton Martinez (Charlotte Wardle Drake)\",\"female\",58,0,1,\"PC 17755\",512.3292,\"B51 B53 B55\",\"C\",\"3\",?,\"Germantown, Philadelphia, PA\"\n1,0,\"Carlsson, Mr. Frans Olof\",\"male\",33,0,0,\"695\",5,\"B51 B53 B55\",\"S\",?,?,\"New York, NY\"\n1,0,\"Carrau, Mr. Francisco M\",\"male\",28,0,0,\"113059\",47.1,?,\"S\",?,?,\"Montevideo, Uruguay\"\n1,0,\"Carrau, Mr. Jose Pedro\",\"male\",17,0,0,\"113059\",47.1,?,\"S\",?,?,\"Montevideo, Uruguay\"\n1,1,\"Carter, Master. William Thornton II\",\"male\",11,1,2,\"113760\",120,\"B96 B98\",\"S\",\"4\",?,\"Bryn Mawr, PA\"\n1,1,\"Carter, Miss. Lucile Polk\",\"female\",14,1,2,\"113760\",120,\"B96 B98\",\"S\",\"4\",?,\"Bryn Mawr, PA\"\n1,1,\"Carter, Mr. William Ernest\",\"male\",36,1,2,\"113760\",120,\"B96 B98\",\"S\",\"C\",?,\"Bryn Mawr, PA\"\n1,1,\"Carter, Mrs. William Ernest (Lucile Polk)\",\"female\",36,1,2,\"113760\",120,\"B96 B98\",\"S\",\"4\",?,\"Bryn Mawr, PA\"\n1,0,\"Case, Mr. Howard Brown\",\"male\",49,0,0,\"19924\",26,?,\"S\",?,?,\"Ascot, Berkshire / Rochester, NY\"\n1,1,\"Cassebeer, Mrs. Henry Arthur Jr (Eleanor Genevieve Fosdick)\",\"female\",?,0,0,\"17770\",27.7208,?,\"C\",\"5\",?,\"New York, NY\"\n1,0,\"Cavendish, Mr. Tyrell William\",\"male\",36,1,0,\"19877\",78.85,\"C46\",\"S\",?,172,\"Little Onn Hall, Staffs\"\n1,1,\"Cavendish, Mrs. Tyrell William (Julia Florence Siegel)\",\"female\",76,1,0,\"19877\",78.85,\"C46\",\"S\",\"6\",?,\"Little Onn Hall, Staffs\"\n1,0,\"Chaffee, Mr. Herbert Fuller\",\"male\",46,1,0,\"W.E.P. 5734\",61.175,\"E31\",\"S\",?,?,\"Amenia, ND\"\n1,1,\"Chaffee, Mrs. Herbert Fuller (Carrie Constance Toogood)\",\"female\",47,1,0,\"W.E.P. 5734\",61.175,\"E31\",\"S\",\"4\",?,\"Amenia, ND\"\n1,1,\"Chambers, Mr. Norman Campbell\",\"male\",27,1,0,\"113806\",53.1,\"E8\",\"S\",\"5\",?,\"New York, NY / Ithaca, NY\"\n1,1,\"Chambers, Mrs. Norman Campbell (Bertha Griggs)\",\"female\",33,1,0,\"113806\",53.1,\"E8\",\"S\",\"5\",?,\"New York, NY / Ithaca, NY\"\n1,1,\"Chaudanson, Miss. Victorine\",\"female\",36,0,0,\"PC 17608\",262.375,\"B61\",\"C\",\"4\",?,?\n1,1,\"Cherry, Miss. Gladys\",\"female\",30,0,0,\"110152\",86.5,\"B77\",\"S\",\"8\",?,\"London, England\"\n1,1,\"Chevre, Mr. Paul Romaine\",\"male\",45,0,0,\"PC 17594\",29.7,\"A9\",\"C\",\"7\",?,\"Paris, France\"\n1,1,\"Chibnall, Mrs. (Edith Martha Bowerman)\",\"female\",?,0,1,\"113505\",55,\"E33\",\"S\",\"6\",?,\"St Leonards-on-Sea, England Ohio\"\n1,0,\"Chisholm, Mr. Roderick Robert Crispin\",\"male\",?,0,0,\"112051\",0,?,\"S\",?,?,\"Liverpool, England / Belfast\"\n1,0,\"Clark, Mr. Walter Miller\",\"male\",27,1,0,\"13508\",136.7792,\"C89\",\"C\",?,?,\"Los Angeles, CA\"\n1,1,\"Clark, Mrs. Walter Miller (Virginia McDowell)\",\"female\",26,1,0,\"13508\",136.7792,\"C89\",\"C\",\"4\",?,\"Los Angeles, CA\"\n1,1,\"Cleaver, Miss. Alice\",\"female\",22,0,0,\"113781\",151.55,?,\"S\",\"11\",?,?\n1,0,\"Clifford, Mr. George Quincy\",\"male\",?,0,0,\"110465\",52,\"A14\",\"S\",?,?,\"Stoughton, MA\"\n1,0,\"Colley, Mr. Edward Pomeroy\",\"male\",47,0,0,\"5727\",25.5875,\"E58\",\"S\",?,?,\"Victoria, BC\"\n1,1,\"Compton, Miss. Sara Rebecca\",\"female\",39,1,1,\"PC 17756\",83.1583,\"E49\",\"C\",\"14\",?,\"Lakewood, NJ\"\n1,0,\"Compton, Mr. Alexander Taylor Jr\",\"male\",37,1,1,\"PC 17756\",83.1583,\"E52\",\"C\",?,?,\"Lakewood, NJ\"\n1,1,\"Compton, Mrs. Alexander Taylor (Mary Eliza Ingersoll)\",\"female\",64,0,2,\"PC 17756\",83.1583,\"E45\",\"C\",\"14\",?,\"Lakewood, NJ\"\n1,1,\"Cornell, Mrs. Robert Clifford (Malvina Helen Lamson)\",\"female\",55,2,0,\"11770\",25.7,\"C101\",\"S\",\"2\",?,\"New York, NY\"\n1,0,\"Crafton, Mr. John Bertram\",\"male\",?,0,0,\"113791\",26.55,?,\"S\",?,?,\"Roachdale, IN\"\n1,0,\"Crosby, Capt. Edward Gifford\",\"male\",70,1,1,\"WE/P 5735\",71,\"B22\",\"S\",?,269,\"Milwaukee, WI\"\n1,1,\"Crosby, Miss. Harriet R\",\"female\",36,0,2,\"WE/P 5735\",71,\"B22\",\"S\",\"7\",?,\"Milwaukee, WI\"\n1,1,\"Crosby, Mrs. Edward Gifford (Catherine Elizabeth Halstead)\",\"female\",64,1,1,\"112901\",26.55,\"B26\",\"S\",\"7\",?,\"Milwaukee, WI\"\n1,0,\"Cumings, Mr. John Bradley\",\"male\",39,1,0,\"PC 17599\",71.2833,\"C85\",\"C\",?,?,\"New York, NY\"\n1,1,\"Cumings, Mrs. John Bradley (Florence Briggs Thayer)\",\"female\",38,1,0,\"PC 17599\",71.2833,\"C85\",\"C\",\"4\",?,\"New York, NY\"\n1,1,\"Daly, Mr. Peter Denis\",\"male\",51,0,0,\"113055\",26.55,\"E17\",\"S\",\"5 9\",?,\"Lima, Peru\"\n1,1,\"Daniel, Mr. Robert Williams\",\"male\",27,0,0,\"113804\",30.5,?,\"S\",\"3\",?,\"Philadelphia, PA\"\n1,1,\"Daniels, Miss. Sarah\",\"female\",33,0,0,\"113781\",151.55,?,\"S\",\"8\",?,?\n1,0,\"Davidson, Mr. Thornton\",\"male\",31,1,0,\"F.C. 12750\",52,\"B71\",\"S\",?,?,\"Montreal, PQ\"\n1,1,\"Davidson, Mrs. Thornton (Orian Hays)\",\"female\",27,1,2,\"F.C. 12750\",52,\"B71\",\"S\",\"3\",?,\"Montreal, PQ\"\n1,1,\"Dick, Mr. Albert Adrian\",\"male\",31,1,0,\"17474\",57,\"B20\",\"S\",\"3\",?,\"Calgary, AB\"\n1,1,\"Dick, Mrs. Albert Adrian (Vera Gillespie)\",\"female\",17,1,0,\"17474\",57,\"B20\",\"S\",\"3\",?,\"Calgary, AB\"\n1,1,\"Dodge, Dr. Washington\",\"male\",53,1,1,\"33638\",81.8583,\"A34\",\"S\",\"13\",?,\"San Francisco, CA\"\n1,1,\"Dodge, Master. Washington\",\"male\",4,0,2,\"33638\",81.8583,\"A34\",\"S\",\"5\",?,\"San Francisco, CA\"\n1,1,\"Dodge, Mrs. Washington (Ruth Vidaver)\",\"female\",54,1,1,\"33638\",81.8583,\"A34\",\"S\",\"5\",?,\"San Francisco, CA\"\n1,0,\"Douglas, Mr. Walter Donald\",\"male\",50,1,0,\"PC 17761\",106.425,\"C86\",\"C\",?,62,\"Deephaven, MN / Cedar Rapids, IA\"\n1,1,\"Douglas, Mrs. Frederick Charles (Mary Helene Baxter)\",\"female\",27,1,1,\"PC 17558\",247.5208,\"B58 B60\",\"C\",\"6\",?,\"Montreal, PQ\"\n1,1,\"Douglas, Mrs. Walter Donald (Mahala Dutton)\",\"female\",48,1,0,\"PC 17761\",106.425,\"C86\",\"C\",\"2\",?,\"Deephaven, MN / Cedar Rapids, IA\"\n1,1,\"Duff Gordon, Lady. (Lucille Christiana Sutherland) ('Mrs Morgan')\",\"female\",48,1,0,\"11755\",39.6,\"A16\",\"C\",\"1\",?,\"London / Paris\"\n1,1,\"Duff Gordon, Sir. Cosmo Edmund ('Mr Morgan')\",\"male\",49,1,0,\"PC 17485\",56.9292,\"A20\",\"C\",\"1\",?,\"London / Paris\"\n1,0,\"Dulles, Mr. William Crothers\",\"male\",39,0,0,\"PC 17580\",29.7,\"A18\",\"C\",?,133,\"Philadelphia, PA\"\n1,1,\"Earnshaw, Mrs. Boulton (Olive Potter)\",\"female\",23,0,1,\"11767\",83.1583,\"C54\",\"C\",\"7\",?,\"Mt Airy, Philadelphia, PA\"\n1,1,\"Endres, Miss. Caroline Louise\",\"female\",38,0,0,\"PC 17757\",227.525,\"C45\",\"C\",\"4\",?,\"New York, NY\"\n1,1,\"Eustis, Miss. Elizabeth Mussey\",\"female\",54,1,0,\"36947\",78.2667,\"D20\",\"C\",\"4\",?,\"Brookline, MA\"\n1,0,\"Evans, Miss. Edith Corse\",\"female\",36,0,0,\"PC 17531\",31.6792,\"A29\",\"C\",?,?,\"New York, NY\"\n1,0,\"Farthing, Mr. John\",\"male\",?,0,0,\"PC 17483\",221.7792,\"C95\",\"S\",?,?,?\n1,1,\"Flegenheim, Mrs. Alfred (Antoinette)\",\"female\",?,0,0,\"PC 17598\",31.6833,?,\"S\",\"7\",?,\"New York, NY\"\n1,1,\"Fleming, Miss. Margaret\",\"female\",?,0,0,\"17421\",110.8833,?,\"C\",\"4\",?,?\n1,1,\"Flynn, Mr. John Irwin ('Irving')\",\"male\",36,0,0,\"PC 17474\",26.3875,\"E25\",\"S\",\"5\",?,\"Brooklyn, NY\"\n1,0,\"Foreman, Mr. Benjamin Laventall\",\"male\",30,0,0,\"113051\",27.75,\"C111\",\"C\",?,?,\"New York, NY\"\n1,1,\"Fortune, Miss. Alice Elizabeth\",\"female\",24,3,2,\"19950\",263,\"C23 C25 C27\",\"S\",\"10\",?,\"Winnipeg, MB\"\n1,1,\"Fortune, Miss. Ethel Flora\",\"female\",28,3,2,\"19950\",263,\"C23 C25 C27\",\"S\",\"10\",?,\"Winnipeg, MB\"\n1,1,\"Fortune, Miss. Mabel Helen\",\"female\",23,3,2,\"19950\",263,\"C23 C25 C27\",\"S\",\"10\",?,\"Winnipeg, MB\"\n1,0,\"Fortune, Mr. Charles Alexander\",\"male\",19,3,2,\"19950\",263,\"C23 C25 C27\",\"S\",?,?,\"Winnipeg, MB\"\n1,0,\"Fortune, Mr. Mark\",\"male\",64,1,4,\"19950\",263,\"C23 C25 C27\",\"S\",?,?,\"Winnipeg, MB\"\n1,1,\"Fortune, Mrs. Mark (Mary McDougald)\",\"female\",60,1,4,\"19950\",263,\"C23 C25 C27\",\"S\",\"10\",?,\"Winnipeg, MB\"\n1,1,\"Francatelli, Miss. Laura Mabel\",\"female\",30,0,0,\"PC 17485\",56.9292,\"E36\",\"C\",\"1\",?,?\n1,0,\"Franklin, Mr. Thomas Parham\",\"male\",?,0,0,\"113778\",26.55,\"D34\",\"S\",?,?,\"Westcliff-on-Sea, Essex\"\n1,1,\"Frauenthal, Dr. Henry William\",\"male\",50,2,0,\"PC 17611\",133.65,?,\"S\",\"5\",?,\"New York, NY\"\n1,1,\"Frauenthal, Mr. Isaac Gerald\",\"male\",43,1,0,\"17765\",27.7208,\"D40\",\"C\",\"5\",?,\"New York, NY\"\n1,1,\"Frauenthal, Mrs. Henry William (Clara Heinsheimer)\",\"female\",?,1,0,\"PC 17611\",133.65,?,\"S\",\"5\",?,\"New York, NY\"\n1,1,\"Frolicher, Miss. Hedwig Margaritha\",\"female\",22,0,2,\"13568\",49.5,\"B39\",\"C\",\"5\",?,\"Zurich, Switzerland\"\n1,1,\"Frolicher-Stehli, Mr. Maxmillian\",\"male\",60,1,1,\"13567\",79.2,\"B41\",\"C\",\"5\",?,\"Zurich, Switzerland\"\n1,1,\"Frolicher-Stehli, Mrs. Maxmillian (Margaretha Emerentia Stehli)\",\"female\",48,1,1,\"13567\",79.2,\"B41\",\"C\",\"5\",?,\"Zurich, Switzerland\"\n1,0,\"Fry, Mr. Richard\",\"male\",?,0,0,\"112058\",0,\"B102\",\"S\",?,?,?\n1,0,\"Futrelle, Mr. Jacques Heath\",\"male\",37,1,0,\"113803\",53.1,\"C123\",\"S\",?,?,\"Scituate, MA\"\n1,1,\"Futrelle, Mrs. Jacques Heath (Lily May Peel)\",\"female\",35,1,0,\"113803\",53.1,\"C123\",\"S\",\"D\",?,\"Scituate, MA\"\n1,0,\"Gee, Mr. Arthur H\",\"male\",47,0,0,\"111320\",38.5,\"E63\",\"S\",?,275,\"St Anne's-on-Sea, Lancashire\"\n1,1,\"Geiger, Miss. Amalie\",\"female\",35,0,0,\"113503\",211.5,\"C130\",\"C\",\"4\",?,?\n1,1,\"Gibson, Miss. Dorothy Winifred\",\"female\",22,0,1,\"112378\",59.4,?,\"C\",\"7\",?,\"New York, NY\"\n1,1,\"Gibson, Mrs. Leonard (Pauline C Boeson)\",\"female\",45,0,1,\"112378\",59.4,?,\"C\",\"7\",?,\"New York, NY\"\n1,0,\"Giglio, Mr. Victor\",\"male\",24,0,0,\"PC 17593\",79.2,\"B86\",\"C\",?,?,?\n1,1,\"Goldenberg, Mr. Samuel L\",\"male\",49,1,0,\"17453\",89.1042,\"C92\",\"C\",\"5\",?,\"Paris, France / New York, NY\"\n1,1,\"Goldenberg, Mrs. Samuel L (Edwiga Grabowska)\",\"female\",?,1,0,\"17453\",89.1042,\"C92\",\"C\",\"5\",?,\"Paris, France / New York, NY\"\n1,0,\"Goldschmidt, Mr. George B\",\"male\",71,0,0,\"PC 17754\",34.6542,\"A5\",\"C\",?,?,\"New York, NY\"\n1,1,\"Gracie, Col. Archibald IV\",\"male\",53,0,0,\"113780\",28.5,\"C51\",\"C\",\"B\",?,\"Washington, DC\"\n1,1,\"Graham, Miss. Margaret Edith\",\"female\",19,0,0,\"112053\",30,\"B42\",\"S\",\"3\",?,\"Greenwich, CT\"\n1,0,\"Graham, Mr. George Edward\",\"male\",38,0,1,\"PC 17582\",153.4625,\"C91\",\"S\",?,147,\"Winnipeg, MB\"\n1,1,\"Graham, Mrs. William Thompson (Edith Junkins)\",\"female\",58,0,1,\"PC 17582\",153.4625,\"C125\",\"S\",\"3\",?,\"Greenwich, CT\"\n1,1,\"Greenfield, Mr. William Bertram\",\"male\",23,0,1,\"PC 17759\",63.3583,\"D10 D12\",\"C\",\"7\",?,\"New York, NY\"\n1,1,\"Greenfield, Mrs. Leo David (Blanche Strouse)\",\"female\",45,0,1,\"PC 17759\",63.3583,\"D10 D12\",\"C\",\"7\",?,\"New York, NY\"\n1,0,\"Guggenheim, Mr. Benjamin\",\"male\",46,0,0,\"PC 17593\",79.2,\"B82 B84\",\"C\",?,?,\"New York, NY\"\n1,1,\"Harder, Mr. George Achilles\",\"male\",25,1,0,\"11765\",55.4417,\"E50\",\"C\",\"5\",?,\"Brooklyn, NY\"\n1,1,\"Harder, Mrs. George Achilles (Dorothy Annan)\",\"female\",25,1,0,\"11765\",55.4417,\"E50\",\"C\",\"5\",?,\"Brooklyn, NY\"\n1,1,\"Harper, Mr. Henry Sleeper\",\"male\",48,1,0,\"PC 17572\",76.7292,\"D33\",\"C\",\"3\",?,\"New York, NY\"\n1,1,\"Harper, Mrs. Henry Sleeper (Myna Haxtun)\",\"female\",49,1,0,\"PC 17572\",76.7292,\"D33\",\"C\",\"3\",?,\"New York, NY\"\n1,0,\"Harrington, Mr. Charles H\",\"male\",?,0,0,\"113796\",42.4,?,\"S\",?,?,?\n1,0,\"Harris, Mr. Henry Birkhardt\",\"male\",45,1,0,\"36973\",83.475,\"C83\",\"S\",?,?,\"New York, NY\"\n1,1,\"Harris, Mrs. Henry Birkhardt (Irene Wallach)\",\"female\",35,1,0,\"36973\",83.475,\"C83\",\"S\",\"D\",?,\"New York, NY\"\n1,0,\"Harrison, Mr. William\",\"male\",40,0,0,\"112059\",0,\"B94\",\"S\",?,110,?\n1,1,\"Hassab, Mr. Hammad\",\"male\",27,0,0,\"PC 17572\",76.7292,\"D49\",\"C\",\"3\",?,?\n1,1,\"Hawksford, Mr. Walter James\",\"male\",?,0,0,\"16988\",30,\"D45\",\"S\",\"3\",?,\"Kingston, Surrey\"\n1,1,\"Hays, Miss. Margaret Bechstein\",\"female\",24,0,0,\"11767\",83.1583,\"C54\",\"C\",\"7\",?,\"New York, NY\"\n1,0,\"Hays, Mr. Charles Melville\",\"male\",55,1,1,\"12749\",93.5,\"B69\",\"S\",?,307,\"Montreal, PQ\"\n1,1,\"Hays, Mrs. Charles Melville (Clara Jennings Gregg)\",\"female\",52,1,1,\"12749\",93.5,\"B69\",\"S\",\"3\",?,\"Montreal, PQ\"\n1,0,\"Head, Mr. Christopher\",\"male\",42,0,0,\"113038\",42.5,\"B11\",\"S\",?,?,\"London / Middlesex\"\n1,0,\"Hilliard, Mr. Herbert Henry\",\"male\",?,0,0,\"17463\",51.8625,\"E46\",\"S\",?,?,\"Brighton, MA\"\n1,0,\"Hipkins, Mr. William Edward\",\"male\",55,0,0,\"680\",50,\"C39\",\"S\",?,?,\"London / Birmingham\"\n1,1,\"Hippach, Miss. Jean Gertrude\",\"female\",16,0,1,\"111361\",57.9792,\"B18\",\"C\",\"4\",?,\"Chicago, IL\"\n1,1,\"Hippach, Mrs. Louis Albert (Ida Sophia Fischer)\",\"female\",44,0,1,\"111361\",57.9792,\"B18\",\"C\",\"4\",?,\"Chicago, IL\"\n1,1,\"Hogeboom, Mrs. John C (Anna Andrews)\",\"female\",51,1,0,\"13502\",77.9583,\"D11\",\"S\",\"10\",?,\"Hudson, NY\"\n1,0,\"Holverson, Mr. Alexander Oskar\",\"male\",42,1,0,\"113789\",52,?,\"S\",?,38,\"New York, NY\"\n1,1,\"Holverson, Mrs. Alexander Oskar (Mary Aline Towner)\",\"female\",35,1,0,\"113789\",52,?,\"S\",\"8\",?,\"New York, NY\"\n1,1,\"Homer, Mr. Harry ('Mr E Haven')\",\"male\",35,0,0,\"111426\",26.55,?,\"C\",\"15\",?,\"Indianapolis, IN\"\n1,1,\"Hoyt, Mr. Frederick Maxfield\",\"male\",38,1,0,\"19943\",90,\"C93\",\"S\",\"D\",?,\"New York, NY /  Stamford CT\"\n1,0,\"Hoyt, Mr. William Fisher\",\"male\",?,0,0,\"PC 17600\",30.6958,?,\"C\",\"14\",?,\"New York, NY\"\n1,1,\"Hoyt, Mrs. Frederick Maxfield (Jane Anne Forby)\",\"female\",35,1,0,\"19943\",90,\"C93\",\"S\",\"D\",?,\"New York, NY /  Stamford CT\"\n1,1,\"Icard, Miss. Amelie\",\"female\",38,0,0,\"113572\",80,\"B28\",?,\"6\",?,?\n1,0,\"Isham, Miss. Ann Elizabeth\",\"female\",50,0,0,\"PC 17595\",28.7125,\"C49\",\"C\",?,?,\"Paris, France New York, NY\"\n1,1,\"Ismay, Mr. Joseph Bruce\",\"male\",49,0,0,\"112058\",0,\"B52 B54 B56\",\"S\",\"C\",?,\"Liverpool\"\n1,0,\"Jones, Mr. Charles Cresson\",\"male\",46,0,0,\"694\",26,?,\"S\",?,80,\"Bennington, VT\"\n1,0,\"Julian, Mr. Henry Forbes\",\"male\",50,0,0,\"113044\",26,\"E60\",\"S\",?,?,\"London\"\n1,0,\"Keeping, Mr. Edwin\",\"male\",32.5,0,0,\"113503\",211.5,\"C132\",\"C\",?,45,?\n1,0,\"Kent, Mr. Edward Austin\",\"male\",58,0,0,\"11771\",29.7,\"B37\",\"C\",?,258,\"Buffalo, NY\"\n1,0,\"Kenyon, Mr. Frederick R\",\"male\",41,1,0,\"17464\",51.8625,\"D21\",\"S\",?,?,\"Southington / Noank, CT\"\n1,1,\"Kenyon, Mrs. Frederick R (Marion)\",\"female\",?,1,0,\"17464\",51.8625,\"D21\",\"S\",\"8\",?,\"Southington / Noank, CT\"\n1,1,\"Kimball, Mr. Edwin Nelson Jr\",\"male\",42,1,0,\"11753\",52.5542,\"D19\",\"S\",\"5\",?,\"Boston, MA\"\n1,1,\"Kimball, Mrs. Edwin Nelson Jr (Gertrude Parsons)\",\"female\",45,1,0,\"11753\",52.5542,\"D19\",\"S\",\"5\",?,\"Boston, MA\"\n1,0,\"Klaber, Mr. Herman\",\"male\",?,0,0,\"113028\",26.55,\"C124\",\"S\",?,?,\"Portland, OR\"\n1,1,\"Kreuchen, Miss. Emilie\",\"female\",39,0,0,\"24160\",211.3375,?,\"S\",\"2\",?,?\n1,1,\"Leader, Dr. Alice (Farnham)\",\"female\",49,0,0,\"17465\",25.9292,\"D17\",\"S\",\"8\",?,\"New York, NY\"\n1,1,\"LeRoy, Miss. Bertha\",\"female\",30,0,0,\"PC 17761\",106.425,?,\"C\",\"2\",?,?\n1,1,\"Lesurer, Mr. Gustave J\",\"male\",35,0,0,\"PC 17755\",512.3292,\"B101\",\"C\",\"3\",?,?\n1,0,\"Lewy, Mr. Ervin G\",\"male\",?,0,0,\"PC 17612\",27.7208,?,\"C\",?,?,\"Chicago, IL\"\n1,0,\"Lindeberg-Lind, Mr. Erik Gustaf ('Mr Edward Lingrey')\",\"male\",42,0,0,\"17475\",26.55,?,\"S\",?,?,\"Stockholm, Sweden\"\n1,1,\"Lindstrom, Mrs. Carl Johan (Sigrid Posse)\",\"female\",55,0,0,\"112377\",27.7208,?,\"C\",\"6\",?,\"Stockholm, Sweden\"\n1,1,\"Lines, Miss. Mary Conover\",\"female\",16,0,1,\"PC 17592\",39.4,\"D28\",\"S\",\"9\",?,\"Paris, France\"\n1,1,\"Lines, Mrs. Ernest H (Elizabeth Lindsey James)\",\"female\",51,0,1,\"PC 17592\",39.4,\"D28\",\"S\",\"9\",?,\"Paris, France\"\n1,0,\"Long, Mr. Milton Clyde\",\"male\",29,0,0,\"113501\",30,\"D6\",\"S\",?,126,\"Springfield, MA\"\n1,1,\"Longley, Miss. Gretchen Fiske\",\"female\",21,0,0,\"13502\",77.9583,\"D9\",\"S\",\"10\",?,\"Hudson, NY\"\n1,0,\"Loring, Mr. Joseph Holland\",\"male\",30,0,0,\"113801\",45.5,?,\"S\",?,?,\"London / New York, NY\"\n1,1,\"Lurette, Miss. Elise\",\"female\",58,0,0,\"PC 17569\",146.5208,\"B80\",\"C\",?,?,?\n1,1,\"Madill, Miss. Georgette Alexandra\",\"female\",15,0,1,\"24160\",211.3375,\"B5\",\"S\",\"2\",?,\"St Louis, MO\"\n1,0,\"Maguire, Mr. John Edward\",\"male\",30,0,0,\"110469\",26,\"C106\",\"S\",?,?,\"Brockton, MA\"\n1,1,\"Maioni, Miss. Roberta\",\"female\",16,0,0,\"110152\",86.5,\"B79\",\"S\",\"8\",?,?\n1,1,\"Marechal, Mr. Pierre\",\"male\",?,0,0,\"11774\",29.7,\"C47\",\"C\",\"7\",?,\"Paris, France\"\n1,0,\"Marvin, Mr. Daniel Warner\",\"male\",19,1,0,\"113773\",53.1,\"D30\",\"S\",?,?,\"New York, NY\"\n1,1,\"Marvin, Mrs. Daniel Warner (Mary Graham Carmichael Farquarson)\",\"female\",18,1,0,\"113773\",53.1,\"D30\",\"S\",\"10\",?,\"New York, NY\"\n1,1,\"Mayne, Mlle. Berthe Antonine ('Mrs de Villiers')\",\"female\",24,0,0,\"PC 17482\",49.5042,\"C90\",\"C\",\"6\",?,\"Belgium  Montreal, PQ\"\n1,0,\"McCaffry, Mr. Thomas Francis\",\"male\",46,0,0,\"13050\",75.2417,\"C6\",\"C\",?,292,\"Vancouver, BC\"\n1,0,\"McCarthy, Mr. Timothy J\",\"male\",54,0,0,\"17463\",51.8625,\"E46\",\"S\",?,175,\"Dorchester, MA\"\n1,1,\"McGough, Mr. James Robert\",\"male\",36,0,0,\"PC 17473\",26.2875,\"E25\",\"S\",\"7\",?,\"Philadelphia, PA\"\n1,0,\"Meyer, Mr. Edgar Joseph\",\"male\",28,1,0,\"PC 17604\",82.1708,?,\"C\",?,?,\"New York, NY\"\n1,1,\"Meyer, Mrs. Edgar Joseph (Leila Saks)\",\"female\",?,1,0,\"PC 17604\",82.1708,?,\"C\",\"6\",?,\"New York, NY\"\n1,0,\"Millet, Mr. Francis Davis\",\"male\",65,0,0,\"13509\",26.55,\"E38\",\"S\",?,249,\"East Bridgewater, MA\"\n1,0,\"Minahan, Dr. William Edward\",\"male\",44,2,0,\"19928\",90,\"C78\",\"Q\",?,230,\"Fond du Lac, WI\"\n1,1,\"Minahan, Miss. Daisy E\",\"female\",33,1,0,\"19928\",90,\"C78\",\"Q\",\"14\",?,\"Green Bay, WI\"\n1,1,\"Minahan, Mrs. William Edward (Lillian E Thorpe)\",\"female\",37,1,0,\"19928\",90,\"C78\",\"Q\",\"14\",?,\"Fond du Lac, WI\"\n1,1,\"Mock, Mr. Philipp Edmund\",\"male\",30,1,0,\"13236\",57.75,\"C78\",\"C\",\"11\",?,\"New York, NY\"\n1,0,\"Molson, Mr. Harry Markland\",\"male\",55,0,0,\"113787\",30.5,\"C30\",\"S\",?,?,\"Montreal, PQ\"\n1,0,\"Moore, Mr. Clarence Bloomfield\",\"male\",47,0,0,\"113796\",42.4,?,\"S\",?,?,\"Washington, DC\"\n1,0,\"Natsch, Mr. Charles H\",\"male\",37,0,1,\"PC 17596\",29.7,\"C118\",\"C\",?,?,\"Brooklyn, NY\"\n1,1,\"Newell, Miss. Madeleine\",\"female\",31,1,0,\"35273\",113.275,\"D36\",\"C\",\"6\",?,\"Lexington, MA\"\n1,1,\"Newell, Miss. Marjorie\",\"female\",23,1,0,\"35273\",113.275,\"D36\",\"C\",\"6\",?,\"Lexington, MA\"\n1,0,\"Newell, Mr. Arthur Webster\",\"male\",58,0,2,\"35273\",113.275,\"D48\",\"C\",?,122,\"Lexington, MA\"\n1,1,\"Newsom, Miss. Helen Monypeny\",\"female\",19,0,2,\"11752\",26.2833,\"D47\",\"S\",\"5\",?,\"New York, NY\"\n1,0,\"Nicholson, Mr. Arthur Ernest\",\"male\",64,0,0,\"693\",26,?,\"S\",?,263,\"Isle of Wight, England\"\n1,1,\"Oliva y Ocana, Dona. Fermina\",\"female\",39,0,0,\"PC 17758\",108.9,\"C105\",\"C\",\"8\",?,?\n1,1,\"Omont, Mr. Alfred Fernand\",\"male\",?,0,0,\"F.C. 12998\",25.7417,?,\"C\",\"7\",?,\"Paris, France\"\n1,1,\"Ostby, Miss. Helene Ragnhild\",\"female\",22,0,1,\"113509\",61.9792,\"B36\",\"C\",\"5\",?,\"Providence, RI\"\n1,0,\"Ostby, Mr. Engelhart Cornelius\",\"male\",65,0,1,\"113509\",61.9792,\"B30\",\"C\",?,234,\"Providence, RI\"\n1,0,\"Ovies y Rodriguez, Mr. Servando\",\"male\",28.5,0,0,\"PC 17562\",27.7208,\"D43\",\"C\",?,189,\"?Havana, Cuba\"\n1,0,\"Parr, Mr. William Henry Marsh\",\"male\",?,0,0,\"112052\",0,?,\"S\",?,?,\"Belfast\"\n1,0,\"Partner, Mr. Austen\",\"male\",45.5,0,0,\"113043\",28.5,\"C124\",\"S\",?,166,\"Surbiton Hill, Surrey\"\n1,0,\"Payne, Mr. Vivian Ponsonby\",\"male\",23,0,0,\"12749\",93.5,\"B24\",\"S\",?,?,\"Montreal, PQ\"\n1,0,\"Pears, Mr. Thomas Clinton\",\"male\",29,1,0,\"113776\",66.6,\"C2\",\"S\",?,?,\"Isleworth, England\"\n1,1,\"Pears, Mrs. Thomas (Edith Wearne)\",\"female\",22,1,0,\"113776\",66.6,\"C2\",\"S\",\"8\",?,\"Isleworth, England\"\n1,0,\"Penasco y Castellana, Mr. Victor de Satode\",\"male\",18,1,0,\"PC 17758\",108.9,\"C65\",\"C\",?,?,\"Madrid, Spain\"\n1,1,\"Penasco y Castellana, Mrs. Victor de Satode (Maria Josefa Perez de Soto y Vallejo)\",\"female\",17,1,0,\"PC 17758\",108.9,\"C65\",\"C\",\"8\",?,\"Madrid, Spain\"\n1,1,\"Perreault, Miss. Anne\",\"female\",30,0,0,\"12749\",93.5,\"B73\",\"S\",\"3\",?,?\n1,1,\"Peuchen, Major. Arthur Godfrey\",\"male\",52,0,0,\"113786\",30.5,\"C104\",\"S\",\"6\",?,\"Toronto, ON\"\n1,0,\"Porter, Mr. Walter Chamberlain\",\"male\",47,0,0,\"110465\",52,\"C110\",\"S\",?,207,\"Worcester, MA\"\n1,1,\"Potter, Mrs. Thomas Jr (Lily Alexenia Wilson)\",\"female\",56,0,1,\"11767\",83.1583,\"C50\",\"C\",\"7\",?,\"Mt Airy, Philadelphia, PA\"\n1,0,\"Reuchlin, Jonkheer. John George\",\"male\",38,0,0,\"19972\",0,?,\"S\",?,?,\"Rotterdam, Netherlands\"\n1,1,\"Rheims, Mr. George Alexander Lucien\",\"male\",?,0,0,\"PC 17607\",39.6,?,\"S\",\"A\",?,\"Paris /  New York, NY\"\n1,0,\"Ringhini, Mr. Sante\",\"male\",22,0,0,\"PC 17760\",135.6333,?,\"C\",?,232,?\n1,0,\"Robbins, Mr. Victor\",\"male\",?,0,0,\"PC 17757\",227.525,?,\"C\",?,?,?\n1,1,\"Robert, Mrs. Edward Scott (Elisabeth Walton McMillan)\",\"female\",43,0,1,\"24160\",211.3375,\"B3\",\"S\",\"2\",?,\"St Louis, MO\"\n1,0,\"Roebling, Mr. Washington Augustus II\",\"male\",31,0,0,\"PC 17590\",50.4958,\"A24\",\"S\",?,?,\"Trenton, NJ\"\n1,1,\"Romaine, Mr. Charles Hallace ('Mr C Rolmane')\",\"male\",45,0,0,\"111428\",26.55,?,\"S\",\"9\",?,\"New York, NY\"\n1,0,\"Rood, Mr. Hugh Roscoe\",\"male\",?,0,0,\"113767\",50,\"A32\",\"S\",?,?,\"Seattle, WA\"\n1,1,\"Rosenbaum, Miss. Edith Louise\",\"female\",33,0,0,\"PC 17613\",27.7208,\"A11\",\"C\",\"11\",?,\"Paris, France\"\n1,0,\"Rosenshine, Mr. George ('Mr George Thorne')\",\"male\",46,0,0,\"PC 17585\",79.2,?,\"C\",?,16,\"New York, NY\"\n1,0,\"Ross, Mr. John Hugo\",\"male\",36,0,0,\"13049\",40.125,\"A10\",\"C\",?,?,\"Winnipeg, MB\"\n1,1,\"Rothes, the Countess. of (Lucy Noel Martha Dyer-Edwards)\",\"female\",33,0,0,\"110152\",86.5,\"B77\",\"S\",\"8\",?,\"London  Vancouver, BC\"\n1,0,\"Rothschild, Mr. Martin\",\"male\",55,1,0,\"PC 17603\",59.4,?,\"C\",?,?,\"New York, NY\"\n1,1,\"Rothschild, Mrs. Martin (Elizabeth L. Barrett)\",\"female\",54,1,0,\"PC 17603\",59.4,?,\"C\",\"6\",?,\"New York, NY\"\n1,0,\"Rowe, Mr. Alfred G\",\"male\",33,0,0,\"113790\",26.55,?,\"S\",?,109,\"London\"\n1,1,\"Ryerson, Master. John Borie\",\"male\",13,2,2,\"PC 17608\",262.375,\"B57 B59 B63 B66\",\"C\",\"4\",?,\"Haverford, PA / Cooperstown, NY\"\n1,1,\"Ryerson, Miss. Emily Borie\",\"female\",18,2,2,\"PC 17608\",262.375,\"B57 B59 B63 B66\",\"C\",\"4\",?,\"Haverford, PA / Cooperstown, NY\"\n1,1,\"Ryerson, Miss. Susan Parker 'Suzette'\",\"female\",21,2,2,\"PC 17608\",262.375,\"B57 B59 B63 B66\",\"C\",\"4\",?,\"Haverford, PA / Cooperstown, NY\"\n1,0,\"Ryerson, Mr. Arthur Larned\",\"male\",61,1,3,\"PC 17608\",262.375,\"B57 B59 B63 B66\",\"C\",?,?,\"Haverford, PA / Cooperstown, NY\"\n1,1,\"Ryerson, Mrs. Arthur Larned (Emily Maria Borie)\",\"female\",48,1,3,\"PC 17608\",262.375,\"B57 B59 B63 B66\",\"C\",\"4\",?,\"Haverford, PA / Cooperstown, NY\"\n1,1,\"Saalfeld, Mr. Adolphe\",\"male\",?,0,0,\"19988\",30.5,\"C106\",\"S\",\"3\",?,\"Manchester, England\"\n1,1,\"Sagesser, Mlle. Emma\",\"female\",24,0,0,\"PC 17477\",69.3,\"B35\",\"C\",\"9\",?,?\n1,1,\"Salomon, Mr. Abraham L\",\"male\",?,0,0,\"111163\",26,?,\"S\",\"1\",?,\"New York, NY\"\n1,1,\"Schabert, Mrs. Paul (Emma Mock)\",\"female\",35,1,0,\"13236\",57.75,\"C28\",\"C\",\"11\",?,\"New York, NY\"\n1,1,\"Serepeca, Miss. Augusta\",\"female\",30,0,0,\"113798\",31,?,\"C\",\"4\",?,?\n1,1,\"Seward, Mr. Frederic Kimber\",\"male\",34,0,0,\"113794\",26.55,?,\"S\",\"7\",?,\"New York, NY\"\n1,1,\"Shutes, Miss. Elizabeth W\",\"female\",40,0,0,\"PC 17582\",153.4625,\"C125\",\"S\",\"3\",?,\"New York, NY / Greenwich CT\"\n1,1,\"Silverthorne, Mr. Spencer Victor\",\"male\",35,0,0,\"PC 17475\",26.2875,\"E24\",\"S\",\"5\",?,\"St Louis, MO\"\n1,0,\"Silvey, Mr. William Baird\",\"male\",50,1,0,\"13507\",55.9,\"E44\",\"S\",?,?,\"Duluth, MN\"\n1,1,\"Silvey, Mrs. William Baird (Alice Munger)\",\"female\",39,1,0,\"13507\",55.9,\"E44\",\"S\",\"11\",?,\"Duluth, MN\"\n1,1,\"Simonius-Blumer, Col. Oberst Alfons\",\"male\",56,0,0,\"13213\",35.5,\"A26\",\"C\",\"3\",?,\"Basel, Switzerland\"\n1,1,\"Sloper, Mr. William Thompson\",\"male\",28,0,0,\"113788\",35.5,\"A6\",\"S\",\"7\",?,\"New Britain, CT\"\n1,0,\"Smart, Mr. John Montgomery\",\"male\",56,0,0,\"113792\",26.55,?,\"S\",?,?,\"New York, NY\"\n1,0,\"Smith, Mr. James Clinch\",\"male\",56,0,0,\"17764\",30.6958,\"A7\",\"C\",?,?,\"St James, Long Island, NY\"\n1,0,\"Smith, Mr. Lucien Philip\",\"male\",24,1,0,\"13695\",60,\"C31\",\"S\",?,?,\"Huntington, WV\"\n1,0,\"Smith, Mr. Richard William\",\"male\",?,0,0,\"113056\",26,\"A19\",\"S\",?,?,\"Streatham, Surrey\"\n1,1,\"Smith, Mrs. Lucien Philip (Mary Eloise Hughes)\",\"female\",18,1,0,\"13695\",60,\"C31\",\"S\",\"6\",?,\"Huntington, WV\"\n1,1,\"Snyder, Mr. John Pillsbury\",\"male\",24,1,0,\"21228\",82.2667,\"B45\",\"S\",\"7\",?,\"Minneapolis, MN\"\n1,1,\"Snyder, Mrs. John Pillsbury (Nelle Stevenson)\",\"female\",23,1,0,\"21228\",82.2667,\"B45\",\"S\",\"7\",?,\"Minneapolis, MN\"\n1,1,\"Spedden, Master. Robert Douglas\",\"male\",6,0,2,\"16966\",134.5,\"E34\",\"C\",\"3\",?,\"Tuxedo Park, NY\"\n1,1,\"Spedden, Mr. Frederic Oakley\",\"male\",45,1,1,\"16966\",134.5,\"E34\",\"C\",\"3\",?,\"Tuxedo Park, NY\"\n1,1,\"Spedden, Mrs. Frederic Oakley (Margaretta Corning Stone)\",\"female\",40,1,1,\"16966\",134.5,\"E34\",\"C\",\"3\",?,\"Tuxedo Park, NY\"\n1,0,\"Spencer, Mr. William Augustus\",\"male\",57,1,0,\"PC 17569\",146.5208,\"B78\",\"C\",?,?,\"Paris, France\"\n1,1,\"Spencer, Mrs. William Augustus (Marie Eugenie)\",\"female\",?,1,0,\"PC 17569\",146.5208,\"B78\",\"C\",\"6\",?,\"Paris, France\"\n1,1,\"Stahelin-Maeglin, Dr. Max\",\"male\",32,0,0,\"13214\",30.5,\"B50\",\"C\",\"3\",?,\"Basel, Switzerland\"\n1,0,\"Stead, Mr. William Thomas\",\"male\",62,0,0,\"113514\",26.55,\"C87\",\"S\",?,?,\"Wimbledon Park, London / Hayling Island, Hants\"\n1,1,\"Stengel, Mr. Charles Emil Henry\",\"male\",54,1,0,\"11778\",55.4417,\"C116\",\"C\",\"1\",?,\"Newark, NJ\"\n1,1,\"Stengel, Mrs. Charles Emil Henry (Annie May Morris)\",\"female\",43,1,0,\"11778\",55.4417,\"C116\",\"C\",\"5\",?,\"Newark, NJ\"\n1,1,\"Stephenson, Mrs. Walter Bertram (Martha Eustis)\",\"female\",52,1,0,\"36947\",78.2667,\"D20\",\"C\",\"4\",?,\"Haverford, PA\"\n1,0,\"Stewart, Mr. Albert A\",\"male\",?,0,0,\"PC 17605\",27.7208,?,\"C\",?,?,\"Gallipolis, Ohio / ? Paris / New York\"\n1,1,\"Stone, Mrs. George Nelson (Martha Evelyn)\",\"female\",62,0,0,\"113572\",80,\"B28\",?,\"6\",?,\"Cincinatti, OH\"\n1,0,\"Straus, Mr. Isidor\",\"male\",67,1,0,\"PC 17483\",221.7792,\"C55 C57\",\"S\",?,96,\"New York, NY\"\n1,0,\"Straus, Mrs. Isidor (Rosalie Ida Blun)\",\"female\",63,1,0,\"PC 17483\",221.7792,\"C55 C57\",\"S\",?,?,\"New York, NY\"\n1,0,\"Sutton, Mr. Frederick\",\"male\",61,0,0,\"36963\",32.3208,\"D50\",\"S\",?,46,\"Haddenfield, NJ\"\n1,1,\"Swift, Mrs. Frederick Joel (Margaret Welles Barron)\",\"female\",48,0,0,\"17466\",25.9292,\"D17\",\"S\",\"8\",?,\"Brooklyn, NY\"\n1,1,\"Taussig, Miss. Ruth\",\"female\",18,0,2,\"110413\",79.65,\"E68\",\"S\",\"8\",?,\"New York, NY\"\n1,0,\"Taussig, Mr. Emil\",\"male\",52,1,1,\"110413\",79.65,\"E67\",\"S\",?,?,\"New York, NY\"\n1,1,\"Taussig, Mrs. Emil (Tillie Mandelbaum)\",\"female\",39,1,1,\"110413\",79.65,\"E67\",\"S\",\"8\",?,\"New York, NY\"\n1,1,\"Taylor, Mr. Elmer Zebley\",\"male\",48,1,0,\"19996\",52,\"C126\",\"S\",\"5 7\",?,\"London /  East Orange, NJ\"\n1,1,\"Taylor, Mrs. Elmer Zebley (Juliet Cummins Wright)\",\"female\",?,1,0,\"19996\",52,\"C126\",\"S\",\"5 7\",?,\"London /  East Orange, NJ\"\n1,0,\"Thayer, Mr. John Borland\",\"male\",49,1,1,\"17421\",110.8833,\"C68\",\"C\",?,?,\"Haverford, PA\"\n1,1,\"Thayer, Mr. John Borland Jr\",\"male\",17,0,2,\"17421\",110.8833,\"C70\",\"C\",\"B\",?,\"Haverford, PA\"\n1,1,\"Thayer, Mrs. John Borland (Marian Longstreth Morris)\",\"female\",39,1,1,\"17421\",110.8833,\"C68\",\"C\",\"4\",?,\"Haverford, PA\"\n1,1,\"Thorne, Mrs. Gertrude Maybelle\",\"female\",?,0,0,\"PC 17585\",79.2,?,\"C\",\"D\",?,\"New York, NY\"\n1,1,\"Tucker, Mr. Gilbert Milligan Jr\",\"male\",31,0,0,\"2543\",28.5375,\"C53\",\"C\",\"7\",?,\"Albany, NY\"\n1,0,\"Uruchurtu, Don. Manuel E\",\"male\",40,0,0,\"PC 17601\",27.7208,?,\"C\",?,?,\"Mexico City, Mexico\"\n1,0,\"Van der hoef, Mr. Wyckoff\",\"male\",61,0,0,\"111240\",33.5,\"B19\",\"S\",?,245,\"Brooklyn, NY\"\n1,0,\"Walker, Mr. William Anderson\",\"male\",47,0,0,\"36967\",34.0208,\"D46\",\"S\",?,?,\"East Orange, NJ\"\n1,1,\"Ward, Miss. Anna\",\"female\",35,0,0,\"PC 17755\",512.3292,?,\"C\",\"3\",?,?\n1,0,\"Warren, Mr. Frank Manley\",\"male\",64,1,0,\"110813\",75.25,\"D37\",\"C\",?,?,\"Portland, OR\"\n1,1,\"Warren, Mrs. Frank Manley (Anna Sophia Atkinson)\",\"female\",60,1,0,\"110813\",75.25,\"D37\",\"C\",\"5\",?,\"Portland, OR\"\n1,0,\"Weir, Col. John\",\"male\",60,0,0,\"113800\",26.55,?,\"S\",?,?,\"England Salt Lake City, Utah\"\n1,0,\"White, Mr. Percival Wayland\",\"male\",54,0,1,\"35281\",77.2875,\"D26\",\"S\",?,?,\"Brunswick, ME\"\n1,0,\"White, Mr. Richard Frasar\",\"male\",21,0,1,\"35281\",77.2875,\"D26\",\"S\",?,169,\"Brunswick, ME\"\n1,1,\"White, Mrs. John Stuart (Ella Holmes)\",\"female\",55,0,0,\"PC 17760\",135.6333,\"C32\",\"C\",\"8\",?,\"New York, NY / Briarcliff Manor NY\"\n1,1,\"Wick, Miss. Mary Natalie\",\"female\",31,0,2,\"36928\",164.8667,\"C7\",\"S\",\"8\",?,\"Youngstown, OH\"\n1,0,\"Wick, Mr. George Dennick\",\"male\",57,1,1,\"36928\",164.8667,?,\"S\",?,?,\"Youngstown, OH\"\n1,1,\"Wick, Mrs. George Dennick (Mary Hitchcock)\",\"female\",45,1,1,\"36928\",164.8667,?,\"S\",\"8\",?,\"Youngstown, OH\"\n1,0,\"Widener, Mr. George Dunton\",\"male\",50,1,1,\"113503\",211.5,\"C80\",\"C\",?,?,\"Elkins Park, PA\"\n1,0,\"Widener, Mr. Harry Elkins\",\"male\",27,0,2,\"113503\",211.5,\"C82\",\"C\",?,?,\"Elkins Park, PA\"\n1,1,\"Widener, Mrs. George Dunton (Eleanor Elkins)\",\"female\",50,1,1,\"113503\",211.5,\"C80\",\"C\",\"4\",?,\"Elkins Park, PA\"\n1,1,\"Willard, Miss. Constance\",\"female\",21,0,0,\"113795\",26.55,?,\"S\",\"8 10\",?,\"Duluth, MN\"\n1,0,\"Williams, Mr. Charles Duane\",\"male\",51,0,1,\"PC 17597\",61.3792,?,\"C\",?,?,\"Geneva, Switzerland / Radnor, PA\"\n1,1,\"Williams, Mr. Richard Norris II\",\"male\",21,0,1,\"PC 17597\",61.3792,?,\"C\",\"A\",?,\"Geneva, Switzerland / Radnor, PA\"\n1,0,\"Williams-Lambert, Mr. Fletcher Fellows\",\"male\",?,0,0,\"113510\",35,\"C128\",\"S\",?,?,\"London, England\"\n1,1,\"Wilson, Miss. Helen Alice\",\"female\",31,0,0,\"16966\",134.5,\"E39 E41\",\"C\",\"3\",?,?\n1,1,\"Woolner, Mr. Hugh\",\"male\",?,0,0,\"19947\",35.5,\"C52\",\"S\",\"D\",?,\"London, England\"\n1,0,\"Wright, Mr. George\",\"male\",62,0,0,\"113807\",26.55,?,\"S\",?,?,\"Halifax, NS\"\n1,1,\"Young, Miss. Marie Grice\",\"female\",36,0,0,\"PC 17760\",135.6333,\"C32\",\"C\",\"8\",?,\"New York, NY / Washington, DC\"\n2,0,\"Abelson, Mr. Samuel\",\"male\",30,1,0,\"P/PP 3381\",24,?,\"C\",?,?,\"Russia New York, NY\"\n2,1,\"Abelson, Mrs. Samuel (Hannah Wizosky)\",\"female\",28,1,0,\"P/PP 3381\",24,?,\"C\",\"10\",?,\"Russia New York, NY\"\n2,0,\"Aldworth, Mr. Charles Augustus\",\"male\",30,0,0,\"248744\",13,?,\"S\",?,?,\"Bryn Mawr, PA, USA\"\n2,0,\"Andrew, Mr. Edgardo Samuel\",\"male\",18,0,0,\"231945\",11.5,?,\"S\",?,?,\"Buenos Aires, Argentina / New Jersey, NJ\"\n2,0,\"Andrew, Mr. Frank Thomas\",\"male\",25,0,0,\"C.A. 34050\",10.5,?,\"S\",?,?,\"Cornwall, England Houghton, MI\"\n2,0,\"Angle, Mr. William A\",\"male\",34,1,0,\"226875\",26,?,\"S\",?,?,\"Warwick, England\"\n2,1,\"Angle, Mrs. William A (Florence 'Mary' Agnes Hughes)\",\"female\",36,1,0,\"226875\",26,?,\"S\",\"11\",?,\"Warwick, England\"\n2,0,\"Ashby, Mr. John\",\"male\",57,0,0,\"244346\",13,?,\"S\",?,?,\"West Hoboken, NJ\"\n2,0,\"Bailey, Mr. Percy Andrew\",\"male\",18,0,0,\"29108\",11.5,?,\"S\",?,?,\"Penzance, Cornwall / Akron, OH\"\n2,0,\"Baimbrigge, Mr. Charles Robert\",\"male\",23,0,0,\"C.A. 31030\",10.5,?,\"S\",?,?,\"Guernsey\"\n2,1,\"Ball, Mrs. (Ada E Hall)\",\"female\",36,0,0,\"28551\",13,\"D\",\"S\",\"10\",?,\"Bristol, Avon / Jacksonville, FL\"\n2,0,\"Banfield, Mr. Frederick James\",\"male\",28,0,0,\"C.A./SOTON 34068\",10.5,?,\"S\",?,?,\"Plymouth, Dorset / Houghton, MI\"\n2,0,\"Bateman, Rev. Robert James\",\"male\",51,0,0,\"S.O.P. 1166\",12.525,?,\"S\",?,174,\"Jacksonville, FL\"\n2,1,\"Beane, Mr. Edward\",\"male\",32,1,0,\"2908\",26,?,\"S\",\"13\",?,\"Norwich / New York, NY\"\n2,1,\"Beane, Mrs. Edward (Ethel Clarke)\",\"female\",19,1,0,\"2908\",26,?,\"S\",\"13\",?,\"Norwich / New York, NY\"\n2,0,\"Beauchamp, Mr. Henry James\",\"male\",28,0,0,\"244358\",26,?,\"S\",?,?,\"England\"\n2,1,\"Becker, Master. Richard F\",\"male\",1,2,1,\"230136\",39,\"F4\",\"S\",\"11\",?,\"Guntur, India / Benton Harbour, MI\"\n2,1,\"Becker, Miss. Marion Louise\",\"female\",4,2,1,\"230136\",39,\"F4\",\"S\",\"11\",?,\"Guntur, India / Benton Harbour, MI\"\n2,1,\"Becker, Miss. Ruth Elizabeth\",\"female\",12,2,1,\"230136\",39,\"F4\",\"S\",\"13\",?,\"Guntur, India / Benton Harbour, MI\"\n2,1,\"Becker, Mrs. Allen Oliver (Nellie E Baumgardner)\",\"female\",36,0,3,\"230136\",39,\"F4\",\"S\",\"11\",?,\"Guntur, India / Benton Harbour, MI\"\n2,1,\"Beesley, Mr. Lawrence\",\"male\",34,0,0,\"248698\",13,\"D56\",\"S\",\"13\",?,\"London\"\n2,1,\"Bentham, Miss. Lilian W\",\"female\",19,0,0,\"28404\",13,?,\"S\",\"12\",?,\"Rochester, NY\"\n2,0,\"Berriman, Mr. William John\",\"male\",23,0,0,\"28425\",13,?,\"S\",?,?,\"St Ives, Cornwall / Calumet, MI\"\n2,0,\"Botsford, Mr. William Hull\",\"male\",26,0,0,\"237670\",13,?,\"S\",?,?,\"Elmira, NY / Orange, NJ\"\n2,0,\"Bowenur, Mr. Solomon\",\"male\",42,0,0,\"211535\",13,?,\"S\",?,?,\"London\"\n2,0,\"Bracken, Mr. James H\",\"male\",27,0,0,\"220367\",13,?,\"S\",?,?,\"Lake Arthur, Chavez County, NM\"\n2,1,\"Brown, Miss. Amelia 'Mildred'\",\"female\",24,0,0,\"248733\",13,\"F33\",\"S\",\"11\",?,\"London / Montreal, PQ\"\n2,1,\"Brown, Miss. Edith Eileen\",\"female\",15,0,2,\"29750\",39,?,\"S\",\"14\",?,\"Cape Town, South Africa / Seattle, WA\"\n2,0,\"Brown, Mr. Thomas William Solomon\",\"male\",60,1,1,\"29750\",39,?,\"S\",?,?,\"Cape Town, South Africa / Seattle, WA\"\n2,1,\"Brown, Mrs. Thomas William Solomon (Elizabeth Catherine Ford)\",\"female\",40,1,1,\"29750\",39,?,\"S\",\"14\",?,\"Cape Town, South Africa / Seattle, WA\"\n2,1,\"Bryhl, Miss. Dagmar Jenny Ingeborg\",\"female\",20,1,0,\"236853\",26,?,\"S\",\"12\",?,\"Skara, Sweden / Rockford, IL\"\n2,0,\"Bryhl, Mr. Kurt Arnold Gottfrid\",\"male\",25,1,0,\"236853\",26,?,\"S\",?,?,\"Skara, Sweden / Rockford, IL\"\n2,1,\"Buss, Miss. Kate\",\"female\",36,0,0,\"27849\",13,?,\"S\",\"9\",?,\"Sittingbourne, England / San Diego, CA\"\n2,0,\"Butler, Mr. Reginald Fenton\",\"male\",25,0,0,\"234686\",13,?,\"S\",?,97,\"Southsea, Hants\"\n2,0,\"Byles, Rev. Thomas Roussel Davids\",\"male\",42,0,0,\"244310\",13,?,\"S\",?,?,\"London\"\n2,1,\"Bystrom, Mrs. (Karolina)\",\"female\",42,0,0,\"236852\",13,?,\"S\",?,?,\"New York, NY\"\n2,1,\"Caldwell, Master. Alden Gates\",\"male\",0.8333,0,2,\"248738\",29,?,\"S\",\"13\",?,\"Bangkok, Thailand / Roseville, IL\"\n2,1,\"Caldwell, Mr. Albert Francis\",\"male\",26,1,1,\"248738\",29,?,\"S\",\"13\",?,\"Bangkok, Thailand / Roseville, IL\"\n2,1,\"Caldwell, Mrs. Albert Francis (Sylvia Mae Harbaugh)\",\"female\",22,1,1,\"248738\",29,?,\"S\",\"13\",?,\"Bangkok, Thailand / Roseville, IL\"\n2,1,\"Cameron, Miss. Clear Annie\",\"female\",35,0,0,\"F.C.C. 13528\",21,?,\"S\",\"14\",?,\"Mamaroneck, NY\"\n2,0,\"Campbell, Mr. William\",\"male\",?,0,0,\"239853\",0,?,\"S\",?,?,\"Belfast\"\n2,0,\"Carbines, Mr. William\",\"male\",19,0,0,\"28424\",13,?,\"S\",?,18,\"St Ives, Cornwall / Calumet, MI\"\n2,0,\"Carter, Mrs. Ernest Courtenay (Lilian Hughes)\",\"female\",44,1,0,\"244252\",26,?,\"S\",?,?,\"London\"\n2,0,\"Carter, Rev. Ernest Courtenay\",\"male\",54,1,0,\"244252\",26,?,\"S\",?,?,\"London\"\n2,0,\"Chapman, Mr. Charles Henry\",\"male\",52,0,0,\"248731\",13.5,?,\"S\",?,130,\"Bronx, NY\"\n2,0,\"Chapman, Mr. John Henry\",\"male\",37,1,0,\"SC/AH 29037\",26,?,\"S\",?,17,\"Cornwall / Spokane, WA\"\n2,0,\"Chapman, Mrs. John Henry (Sara Elizabeth Lawry)\",\"female\",29,1,0,\"SC/AH 29037\",26,?,\"S\",?,?,\"Cornwall / Spokane, WA\"\n2,1,\"Christy, Miss. Julie Rachel\",\"female\",25,1,1,\"237789\",30,?,\"S\",\"12\",?,\"London\"\n2,1,\"Christy, Mrs. (Alice Frances)\",\"female\",45,0,2,\"237789\",30,?,\"S\",\"12\",?,\"London\"\n2,0,\"Clarke, Mr. Charles Valentine\",\"male\",29,1,0,\"2003\",26,?,\"S\",?,?,\"England / San Francisco, CA\"\n2,1,\"Clarke, Mrs. Charles V (Ada Maria Winfield)\",\"female\",28,1,0,\"2003\",26,?,\"S\",\"14\",?,\"England / San Francisco, CA\"\n2,0,\"Coleridge, Mr. Reginald Charles\",\"male\",29,0,0,\"W./C. 14263\",10.5,?,\"S\",?,?,\"Hartford, Huntingdonshire\"\n2,0,\"Collander, Mr. Erik Gustaf\",\"male\",28,0,0,\"248740\",13,?,\"S\",?,?,\"Helsinki, Finland Ashtabula, Ohio\"\n2,1,\"Collett, Mr. Sidney C Stuart\",\"male\",24,0,0,\"28034\",10.5,?,\"S\",\"9\",?,\"London / Fort Byron, NY\"\n2,1,\"Collyer, Miss. Marjorie 'Lottie'\",\"female\",8,0,2,\"C.A. 31921\",26.25,?,\"S\",\"14\",?,\"Bishopstoke, Hants / Fayette Valley, ID\"\n2,0,\"Collyer, Mr. Harvey\",\"male\",31,1,1,\"C.A. 31921\",26.25,?,\"S\",?,?,\"Bishopstoke, Hants / Fayette Valley, ID\"\n2,1,\"Collyer, Mrs. Harvey (Charlotte Annie Tate)\",\"female\",31,1,1,\"C.A. 31921\",26.25,?,\"S\",\"14\",?,\"Bishopstoke, Hants / Fayette Valley, ID\"\n2,1,\"Cook, Mrs. (Selena Rogers)\",\"female\",22,0,0,\"W./C. 14266\",10.5,\"F33\",\"S\",\"14\",?,\"Pennsylvania\"\n2,0,\"Corbett, Mrs. Walter H (Irene Colvin)\",\"female\",30,0,0,\"237249\",13,?,\"S\",?,?,\"Provo, UT\"\n2,0,\"Corey, Mrs. Percy C (Mary Phyllis Elizabeth Miller)\",\"female\",?,0,0,\"F.C.C. 13534\",21,?,\"S\",?,?,\"Upper Burma, India Pittsburgh, PA\"\n2,0,\"Cotterill, Mr. Henry 'Harry'\",\"male\",21,0,0,\"29107\",11.5,?,\"S\",?,?,\"Penzance, Cornwall / Akron, OH\"\n2,0,\"Cunningham, Mr. Alfred Fleming\",\"male\",?,0,0,\"239853\",0,?,\"S\",?,?,\"Belfast\"\n2,1,\"Davies, Master. John Morgan Jr\",\"male\",8,1,1,\"C.A. 33112\",36.75,?,\"S\",\"14\",?,\"St Ives, Cornwall / Hancock, MI\"\n2,0,\"Davies, Mr. Charles Henry\",\"male\",18,0,0,\"S.O.C. 14879\",73.5,?,\"S\",?,?,\"Lyndhurst, England\"\n2,1,\"Davies, Mrs. John Morgan (Elizabeth Agnes Mary White)\",\"female\",48,0,2,\"C.A. 33112\",36.75,?,\"S\",\"14\",?,\"St Ives, Cornwall / Hancock, MI\"\n2,1,\"Davis, Miss. Mary\",\"female\",28,0,0,\"237668\",13,?,\"S\",\"13\",?,\"London / Staten Island, NY\"\n2,0,\"de Brito, Mr. Jose Joaquim\",\"male\",32,0,0,\"244360\",13,?,\"S\",?,?,\"Portugal / Sau Paulo, Brazil\"\n2,0,\"Deacon, Mr. Percy William\",\"male\",17,0,0,\"S.O.C. 14879\",73.5,?,\"S\",?,?,?\n2,0,\"del Carlo, Mr. Sebastiano\",\"male\",29,1,0,\"SC/PARIS 2167\",27.7208,?,\"C\",?,295,\"Lucca, Italy / California\"\n2,1,\"del Carlo, Mrs. Sebastiano (Argenia Genovesi)\",\"female\",24,1,0,\"SC/PARIS 2167\",27.7208,?,\"C\",\"12\",?,\"Lucca, Italy / California\"\n2,0,\"Denbury, Mr. Herbert\",\"male\",25,0,0,\"C.A. 31029\",31.5,?,\"S\",?,?,\"Guernsey / Elizabeth, NJ\"\n2,0,\"Dibden, Mr. William\",\"male\",18,0,0,\"S.O.C. 14879\",73.5,?,\"S\",?,?,\"New Forest, England\"\n2,1,\"Doling, Miss. Elsie\",\"female\",18,0,1,\"231919\",23,?,\"S\",?,?,\"Southampton\"\n2,1,\"Doling, Mrs. John T (Ada Julia Bone)\",\"female\",34,0,1,\"231919\",23,?,\"S\",?,?,\"Southampton\"\n2,0,\"Downton, Mr. William James\",\"male\",54,0,0,\"28403\",26,?,\"S\",?,?,\"Holley, NY\"\n2,1,\"Drew, Master. Marshall Brines\",\"male\",8,0,2,\"28220\",32.5,?,\"S\",\"10\",?,\"Greenport, NY\"\n2,0,\"Drew, Mr. James Vivian\",\"male\",42,1,1,\"28220\",32.5,?,\"S\",?,?,\"Greenport, NY\"\n2,1,\"Drew, Mrs. James Vivian (Lulu Thorne Christian)\",\"female\",34,1,1,\"28220\",32.5,?,\"S\",\"10\",?,\"Greenport, NY\"\n2,1,\"Duran y More, Miss. Asuncion\",\"female\",27,1,0,\"SC/PARIS 2149\",13.8583,?,\"C\",\"12\",?,\"Barcelona, Spain / Havana, Cuba\"\n2,1,\"Duran y More, Miss. Florentina\",\"female\",30,1,0,\"SC/PARIS 2148\",13.8583,?,\"C\",\"12\",?,\"Barcelona, Spain / Havana, Cuba\"\n2,0,\"Eitemiller, Mr. George Floyd\",\"male\",23,0,0,\"29751\",13,?,\"S\",?,?,\"England / Detroit, MI\"\n2,0,\"Enander, Mr. Ingvar\",\"male\",21,0,0,\"236854\",13,?,\"S\",?,?,\"Goteborg, Sweden / Rockford, IL\"\n2,0,\"Fahlstrom, Mr. Arne Jonas\",\"male\",18,0,0,\"236171\",13,?,\"S\",?,?,\"Oslo, Norway Bayonne, NJ\"\n2,0,\"Faunthorpe, Mr. Harry\",\"male\",40,1,0,\"2926\",26,?,\"S\",?,286,\"England / Philadelphia, PA\"\n2,1,\"Faunthorpe, Mrs. Lizzie (Elizabeth Anne Wilkinson)\",\"female\",29,1,0,\"2926\",26,?,\"S\",\"16\",?,?\n2,0,\"Fillbrook, Mr. Joseph Charles\",\"male\",18,0,0,\"C.A. 15185\",10.5,?,\"S\",?,?,\"Cornwall / Houghton, MI\"\n2,0,\"Fox, Mr. Stanley Hubert\",\"male\",36,0,0,\"229236\",13,?,\"S\",?,236,\"Rochester, NY\"\n2,0,\"Frost, Mr. Anthony Wood 'Archie'\",\"male\",?,0,0,\"239854\",0,?,\"S\",?,?,\"Belfast\"\n2,0,\"Funk, Miss. Annie Clemmer\",\"female\",38,0,0,\"237671\",13,?,\"S\",?,?,\"Janjgir, India / Pennsylvania\"\n2,0,\"Fynney, Mr. Joseph J\",\"male\",35,0,0,\"239865\",26,?,\"S\",?,322,\"Liverpool / Montreal, PQ\"\n2,0,\"Gale, Mr. Harry\",\"male\",38,1,0,\"28664\",21,?,\"S\",?,?,\"Cornwall / Clear Creek, CO\"\n2,0,\"Gale, Mr. Shadrach\",\"male\",34,1,0,\"28664\",21,?,\"S\",?,?,\"Cornwall / Clear Creek, CO\"\n2,1,\"Garside, Miss. Ethel\",\"female\",34,0,0,\"243880\",13,?,\"S\",\"12\",?,\"Brooklyn, NY\"\n2,0,\"Gaskell, Mr. Alfred\",\"male\",16,0,0,\"239865\",26,?,\"S\",?,?,\"Liverpool / Montreal, PQ\"\n2,0,\"Gavey, Mr. Lawrence\",\"male\",26,0,0,\"31028\",10.5,?,\"S\",?,?,\"Guernsey / Elizabeth, NJ\"\n2,0,\"Gilbert, Mr. William\",\"male\",47,0,0,\"C.A. 30769\",10.5,?,\"S\",?,?,\"Cornwall\"\n2,0,\"Giles, Mr. Edgar\",\"male\",21,1,0,\"28133\",11.5,?,\"S\",?,?,\"Cornwall / Camden, NJ\"\n2,0,\"Giles, Mr. Frederick Edward\",\"male\",21,1,0,\"28134\",11.5,?,\"S\",?,?,\"Cornwall / Camden, NJ\"\n2,0,\"Giles, Mr. Ralph\",\"male\",24,0,0,\"248726\",13.5,?,\"S\",?,297,\"West Kensington, London\"\n2,0,\"Gill, Mr. John William\",\"male\",24,0,0,\"233866\",13,?,\"S\",?,155,\"Clevedon, England\"\n2,0,\"Gillespie, Mr. William Henry\",\"male\",34,0,0,\"12233\",13,?,\"S\",?,?,\"Vancouver, BC\"\n2,0,\"Givard, Mr. Hans Kristensen\",\"male\",30,0,0,\"250646\",13,?,\"S\",?,305,?\n2,0,\"Greenberg, Mr. Samuel\",\"male\",52,0,0,\"250647\",13,?,\"S\",?,19,\"Bronx, NY\"\n2,0,\"Hale, Mr. Reginald\",\"male\",30,0,0,\"250653\",13,?,\"S\",?,75,\"Auburn, NY\"\n2,1,\"Hamalainen, Master. Viljo\",\"male\",0.6667,1,1,\"250649\",14.5,?,\"S\",\"4\",?,\"Detroit, MI\"\n2,1,\"Hamalainen, Mrs. William (Anna)\",\"female\",24,0,2,\"250649\",14.5,?,\"S\",\"4\",?,\"Detroit, MI\"\n2,0,\"Harbeck, Mr. William H\",\"male\",44,0,0,\"248746\",13,?,\"S\",?,35,\"Seattle, WA / Toledo, OH\"\n2,1,\"Harper, Miss. Annie Jessie 'Nina'\",\"female\",6,0,1,\"248727\",33,?,\"S\",\"11\",?,\"Denmark Hill, Surrey / Chicago\"\n2,0,\"Harper, Rev. John\",\"male\",28,0,1,\"248727\",33,?,\"S\",?,?,\"Denmark Hill, Surrey / Chicago\"\n2,1,\"Harris, Mr. George\",\"male\",62,0,0,\"S.W./PP 752\",10.5,?,\"S\",\"15\",?,\"London\"\n2,0,\"Harris, Mr. Walter\",\"male\",30,0,0,\"W/C 14208\",10.5,?,\"S\",?,?,\"Walthamstow, England\"\n2,1,\"Hart, Miss. Eva Miriam\",\"female\",7,0,2,\"F.C.C. 13529\",26.25,?,\"S\",\"14\",?,\"Ilford, Essex / Winnipeg, MB\"\n2,0,\"Hart, Mr. Benjamin\",\"male\",43,1,1,\"F.C.C. 13529\",26.25,?,\"S\",?,?,\"Ilford, Essex / Winnipeg, MB\"\n2,1,\"Hart, Mrs. Benjamin (Esther Ada Bloomfield)\",\"female\",45,1,1,\"F.C.C. 13529\",26.25,?,\"S\",\"14\",?,\"Ilford, Essex / Winnipeg, MB\"\n2,1,\"Herman, Miss. Alice\",\"female\",24,1,2,\"220845\",65,?,\"S\",\"9\",?,\"Somerset / Bernardsville, NJ\"\n2,1,\"Herman, Miss. Kate\",\"female\",24,1,2,\"220845\",65,?,\"S\",\"9\",?,\"Somerset / Bernardsville, NJ\"\n2,0,\"Herman, Mr. Samuel\",\"male\",49,1,2,\"220845\",65,?,\"S\",?,?,\"Somerset / Bernardsville, NJ\"\n2,1,\"Herman, Mrs. Samuel (Jane Laver)\",\"female\",48,1,2,\"220845\",65,?,\"S\",\"9\",?,\"Somerset / Bernardsville, NJ\"\n2,1,\"Hewlett, Mrs. (Mary D Kingcome)\",\"female\",55,0,0,\"248706\",16,?,\"S\",\"13\",?,\"India / Rapid City, SD\"\n2,0,\"Hickman, Mr. Leonard Mark\",\"male\",24,2,0,\"S.O.C. 14879\",73.5,?,\"S\",?,?,\"West Hampstead, London / Neepawa, MB\"\n2,0,\"Hickman, Mr. Lewis\",\"male\",32,2,0,\"S.O.C. 14879\",73.5,?,\"S\",?,256,\"West Hampstead, London / Neepawa, MB\"\n2,0,\"Hickman, Mr. Stanley George\",\"male\",21,2,0,\"S.O.C. 14879\",73.5,?,\"S\",?,?,\"West Hampstead, London / Neepawa, MB\"\n2,0,\"Hiltunen, Miss. Marta\",\"female\",18,1,1,\"250650\",13,?,\"S\",?,?,\"Kontiolahti, Finland / Detroit, MI\"\n2,1,\"Hocking, Miss. Ellen 'Nellie'\",\"female\",20,2,1,\"29105\",23,?,\"S\",\"4\",?,\"Cornwall / Akron, OH\"\n2,0,\"Hocking, Mr. Richard George\",\"male\",23,2,1,\"29104\",11.5,?,\"S\",?,?,\"Cornwall / Akron, OH\"\n2,0,\"Hocking, Mr. Samuel James Metcalfe\",\"male\",36,0,0,\"242963\",13,?,\"S\",?,?,\"Devonport, England\"\n2,1,\"Hocking, Mrs. Elizabeth (Eliza Needs)\",\"female\",54,1,3,\"29105\",23,?,\"S\",\"4\",?,\"Cornwall / Akron, OH\"\n2,0,\"Hodges, Mr. Henry Price\",\"male\",50,0,0,\"250643\",13,?,\"S\",?,149,\"Southampton\"\n2,0,\"Hold, Mr. Stephen\",\"male\",44,1,0,\"26707\",26,?,\"S\",?,?,\"England / Sacramento, CA\"\n2,1,\"Hold, Mrs. Stephen (Annie Margaret Hill)\",\"female\",29,1,0,\"26707\",26,?,\"S\",\"10\",?,\"England / Sacramento, CA\"\n2,0,\"Hood, Mr. Ambrose Jr\",\"male\",21,0,0,\"S.O.C. 14879\",73.5,?,\"S\",?,?,\"New Forest, England\"\n2,1,\"Hosono, Mr. Masabumi\",\"male\",42,0,0,\"237798\",13,?,\"S\",\"10\",?,\"Tokyo, Japan\"\n2,0,\"Howard, Mr. Benjamin\",\"male\",63,1,0,\"24065\",26,?,\"S\",?,?,\"Swindon, England\"\n2,0,\"Howard, Mrs. Benjamin (Ellen Truelove Arman)\",\"female\",60,1,0,\"24065\",26,?,\"S\",?,?,\"Swindon, England\"\n2,0,\"Hunt, Mr. George Henry\",\"male\",33,0,0,\"SCO/W 1585\",12.275,?,\"S\",?,?,\"Philadelphia, PA\"\n2,1,\"Ilett, Miss. Bertha\",\"female\",17,0,0,\"SO/C 14885\",10.5,?,\"S\",?,?,\"Guernsey\"\n2,0,\"Jacobsohn, Mr. Sidney Samuel\",\"male\",42,1,0,\"243847\",27,?,\"S\",?,?,\"London\"\n2,1,\"Jacobsohn, Mrs. Sidney Samuel (Amy Frances Christy)\",\"female\",24,2,1,\"243847\",27,?,\"S\",\"12\",?,\"London\"\n2,0,\"Jarvis, Mr. John Denzil\",\"male\",47,0,0,\"237565\",15,?,\"S\",?,?,\"North Evington, England\"\n2,0,\"Jefferys, Mr. Clifford Thomas\",\"male\",24,2,0,\"C.A. 31029\",31.5,?,\"S\",?,?,\"Guernsey / Elizabeth, NJ\"\n2,0,\"Jefferys, Mr. Ernest Wilfred\",\"male\",22,2,0,\"C.A. 31029\",31.5,?,\"S\",?,?,\"Guernsey / Elizabeth, NJ\"\n2,0,\"Jenkin, Mr. Stephen Curnow\",\"male\",32,0,0,\"C.A. 33111\",10.5,?,\"S\",?,?,\"St Ives, Cornwall / Houghton, MI\"\n2,1,\"Jerwan, Mrs. Amin S (Marie Marthe Thuillard)\",\"female\",23,0,0,\"SC/AH Basle 541\",13.7917,\"D\",\"C\",\"11\",?,\"New York, NY\"\n2,0,\"Kantor, Mr. Sinai\",\"male\",34,1,0,\"244367\",26,?,\"S\",?,283,\"Moscow / Bronx, NY\"\n2,1,\"Kantor, Mrs. Sinai (Miriam Sternin)\",\"female\",24,1,0,\"244367\",26,?,\"S\",\"12\",?,\"Moscow / Bronx, NY\"\n2,0,\"Karnes, Mrs. J Frank (Claire Bennett)\",\"female\",22,0,0,\"F.C.C. 13534\",21,?,\"S\",?,?,\"India / Pittsburgh, PA\"\n2,1,\"Keane, Miss. Nora A\",\"female\",?,0,0,\"226593\",12.35,\"E101\",\"Q\",\"10\",?,\"Harrisburg, PA\"\n2,0,\"Keane, Mr. Daniel\",\"male\",35,0,0,\"233734\",12.35,?,\"Q\",?,?,?\n2,1,\"Kelly, Mrs. Florence 'Fannie'\",\"female\",45,0,0,\"223596\",13.5,?,\"S\",\"9\",?,\"London / New York, NY\"\n2,0,\"Kirkland, Rev. Charles Leonard\",\"male\",57,0,0,\"219533\",12.35,?,\"Q\",?,?,\"Glasgow / Bangor, ME\"\n2,0,\"Knight, Mr. Robert J\",\"male\",?,0,0,\"239855\",0,?,\"S\",?,?,\"Belfast\"\n2,0,\"Kvillner, Mr. Johan Henrik Johannesson\",\"male\",31,0,0,\"C.A. 18723\",10.5,?,\"S\",?,165,\"Sweden / Arlington, NJ\"\n2,0,\"Lahtinen, Mrs. William (Anna Sylfven)\",\"female\",26,1,1,\"250651\",26,?,\"S\",?,?,\"Minneapolis, MN\"\n2,0,\"Lahtinen, Rev. William\",\"male\",30,1,1,\"250651\",26,?,\"S\",?,?,\"Minneapolis, MN\"\n2,0,\"Lamb, Mr. John Joseph\",\"male\",?,0,0,\"240261\",10.7083,?,\"Q\",?,?,?\n2,1,\"Laroche, Miss. Louise\",\"female\",1,1,2,\"SC/Paris 2123\",41.5792,?,\"C\",\"14\",?,\"Paris / Haiti\"\n2,1,\"Laroche, Miss. Simonne Marie Anne Andree\",\"female\",3,1,2,\"SC/Paris 2123\",41.5792,?,\"C\",\"14\",?,\"Paris / Haiti\"\n2,0,\"Laroche, Mr. Joseph Philippe Lemercier\",\"male\",25,1,2,\"SC/Paris 2123\",41.5792,?,\"C\",?,?,\"Paris / Haiti\"\n2,1,\"Laroche, Mrs. Joseph (Juliette Marie Louise Lafargue)\",\"female\",22,1,2,\"SC/Paris 2123\",41.5792,?,\"C\",\"14\",?,\"Paris / Haiti\"\n2,1,\"Lehmann, Miss. Bertha\",\"female\",17,0,0,\"SC 1748\",12,?,\"C\",\"12\",?,\"Berne, Switzerland / Central City, IA\"\n2,1,\"Leitch, Miss. Jessie Wills\",\"female\",?,0,0,\"248727\",33,?,\"S\",\"11\",?,\"London / Chicago, IL\"\n2,1,\"Lemore, Mrs. (Amelia Milley)\",\"female\",34,0,0,\"C.A. 34260\",10.5,\"F33\",\"S\",\"14\",?,\"Chicago, IL\"\n2,0,\"Levy, Mr. Rene Jacques\",\"male\",36,0,0,\"SC/Paris 2163\",12.875,\"D\",\"C\",?,?,\"Montreal, PQ\"\n2,0,\"Leyson, Mr. Robert William Norman\",\"male\",24,0,0,\"C.A. 29566\",10.5,?,\"S\",?,108,?\n2,0,\"Lingane, Mr. John\",\"male\",61,0,0,\"235509\",12.35,?,\"Q\",?,?,?\n2,0,\"Louch, Mr. Charles Alexander\",\"male\",50,1,0,\"SC/AH 3085\",26,?,\"S\",?,121,\"Weston-Super-Mare, Somerset\"\n2,1,\"Louch, Mrs. Charles Alexander (Alice Adelaide Slow)\",\"female\",42,1,0,\"SC/AH 3085\",26,?,\"S\",?,?,\"Weston-Super-Mare, Somerset\"\n2,0,\"Mack, Mrs. (Mary)\",\"female\",57,0,0,\"S.O./P.P. 3\",10.5,\"E77\",\"S\",?,52,\"Southampton / New York, NY\"\n2,0,\"Malachard, Mr. Noel\",\"male\",?,0,0,\"237735\",15.0458,\"D\",\"C\",?,?,\"Paris\"\n2,1,\"Mallet, Master. Andre\",\"male\",1,0,2,\"S.C./PARIS 2079\",37.0042,?,\"C\",\"10\",?,\"Paris / Montreal, PQ\"\n2,0,\"Mallet, Mr. Albert\",\"male\",31,1,1,\"S.C./PARIS 2079\",37.0042,?,\"C\",?,?,\"Paris / Montreal, PQ\"\n2,1,\"Mallet, Mrs. Albert (Antoinette Magnin)\",\"female\",24,1,1,\"S.C./PARIS 2079\",37.0042,?,\"C\",\"10\",?,\"Paris / Montreal, PQ\"\n2,0,\"Mangiavacchi, Mr. Serafino Emilio\",\"male\",?,0,0,\"SC/A.3 2861\",15.5792,?,\"C\",?,?,\"New York, NY\"\n2,0,\"Matthews, Mr. William John\",\"male\",30,0,0,\"28228\",13,?,\"S\",?,?,\"St Austall, Cornwall\"\n2,0,\"Maybery, Mr. Frank Hubert\",\"male\",40,0,0,\"239059\",16,?,\"S\",?,?,\"Weston-Super-Mare / Moose Jaw, SK\"\n2,0,\"McCrae, Mr. Arthur Gordon\",\"male\",32,0,0,\"237216\",13.5,?,\"S\",?,209,\"Sydney, Australia\"\n2,0,\"McCrie, Mr. James Matthew\",\"male\",30,0,0,\"233478\",13,?,\"S\",?,?,\"Sarnia, ON\"\n2,0,\"McKane, Mr. Peter David\",\"male\",46,0,0,\"28403\",26,?,\"S\",?,?,\"Rochester, NY\"\n2,1,\"Mellinger, Miss. Madeleine Violet\",\"female\",13,0,1,\"250644\",19.5,?,\"S\",\"14\",?,\"England / Bennington, VT\"\n2,1,\"Mellinger, Mrs. (Elizabeth Anne Maidment)\",\"female\",41,0,1,\"250644\",19.5,?,\"S\",\"14\",?,\"England / Bennington, VT\"\n2,1,\"Mellors, Mr. William John\",\"male\",19,0,0,\"SW/PP 751\",10.5,?,\"S\",\"B\",?,\"Chelsea, London\"\n2,0,\"Meyer, Mr. August\",\"male\",39,0,0,\"248723\",13,?,\"S\",?,?,\"Harrow-on-the-Hill, Middlesex\"\n2,0,\"Milling, Mr. Jacob Christian\",\"male\",48,0,0,\"234360\",13,?,\"S\",?,271,\"Copenhagen, Denmark\"\n2,0,\"Mitchell, Mr. Henry Michael\",\"male\",70,0,0,\"C.A. 24580\",10.5,?,\"S\",?,?,\"Guernsey / Montclair, NJ and/or Toledo, Ohio\"\n2,0,\"Montvila, Rev. Juozas\",\"male\",27,0,0,\"211536\",13,?,\"S\",?,?,\"Worcester, MA\"\n2,0,\"Moraweck, Dr. Ernest\",\"male\",54,0,0,\"29011\",14,?,\"S\",?,?,\"Frankfort, KY\"\n2,0,\"Morley, Mr. Henry Samuel ('Mr Henry Marshall')\",\"male\",39,0,0,\"250655\",26,?,\"S\",?,?,?\n2,0,\"Mudd, Mr. Thomas Charles\",\"male\",16,0,0,\"S.O./P.P. 3\",10.5,?,\"S\",?,?,\"Halesworth, England\"\n2,0,\"Myles, Mr. Thomas Francis\",\"male\",62,0,0,\"240276\",9.6875,?,\"Q\",?,?,\"Cambridge, MA\"\n2,0,\"Nasser, Mr. Nicholas\",\"male\",32.5,1,0,\"237736\",30.0708,?,\"C\",?,43,\"New York, NY\"\n2,1,\"Nasser, Mrs. Nicholas (Adele Achem)\",\"female\",14,1,0,\"237736\",30.0708,?,\"C\",?,?,\"New York, NY\"\n2,1,\"Navratil, Master. Edmond Roger\",\"male\",2,1,1,\"230080\",26,\"F2\",\"S\",\"D\",?,\"Nice, France\"\n2,1,\"Navratil, Master. Michel M\",\"male\",3,1,1,\"230080\",26,\"F2\",\"S\",\"D\",?,\"Nice, France\"\n2,0,\"Navratil, Mr. Michel ('Louis M Hoffman')\",\"male\",36.5,0,2,\"230080\",26,\"F2\",\"S\",?,15,\"Nice, France\"\n2,0,\"Nesson, Mr. Israel\",\"male\",26,0,0,\"244368\",13,\"F2\",\"S\",?,?,\"Boston, MA\"\n2,0,\"Nicholls, Mr. Joseph Charles\",\"male\",19,1,1,\"C.A. 33112\",36.75,?,\"S\",?,101,\"Cornwall / Hancock, MI\"\n2,0,\"Norman, Mr. Robert Douglas\",\"male\",28,0,0,\"218629\",13.5,?,\"S\",?,287,\"Glasgow\"\n2,1,\"Nourney, Mr. Alfred ('Baron von Drachstedt')\",\"male\",20,0,0,\"SC/PARIS 2166\",13.8625,\"D38\",\"C\",\"7\",?,\"Cologne, Germany\"\n2,1,\"Nye, Mrs. (Elizabeth Ramell)\",\"female\",29,0,0,\"C.A. 29395\",10.5,\"F33\",\"S\",\"11\",?,\"Folkstone, Kent / New York, NY\"\n2,0,\"Otter, Mr. Richard\",\"male\",39,0,0,\"28213\",13,?,\"S\",?,?,\"Middleburg Heights, OH\"\n2,1,\"Oxenham, Mr. Percy Thomas\",\"male\",22,0,0,\"W./C. 14260\",10.5,?,\"S\",\"13\",?,\"Pondersend, England / New Durham, NJ\"\n2,1,\"Padro y Manent, Mr. Julian\",\"male\",?,0,0,\"SC/PARIS 2146\",13.8625,?,\"C\",\"9\",?,\"Spain / Havana, Cuba\"\n2,0,\"Pain, Dr. Alfred\",\"male\",23,0,0,\"244278\",10.5,?,\"S\",?,?,\"Hamilton, ON\"\n2,1,\"Pallas y Castello, Mr. Emilio\",\"male\",29,0,0,\"SC/PARIS 2147\",13.8583,?,\"C\",\"9\",?,\"Spain / Havana, Cuba\"\n2,0,\"Parker, Mr. Clifford Richard\",\"male\",28,0,0,\"SC 14888\",10.5,?,\"S\",?,?,\"St Andrews, Guernsey\"\n2,0,\"Parkes, Mr. Francis 'Frank'\",\"male\",?,0,0,\"239853\",0,?,\"S\",?,?,\"Belfast\"\n2,1,\"Parrish, Mrs. (Lutie Davis)\",\"female\",50,0,1,\"230433\",26,?,\"S\",\"12\",?,\"Woodford County, KY\"\n2,0,\"Pengelly, Mr. Frederick William\",\"male\",19,0,0,\"28665\",10.5,?,\"S\",?,?,\"Gunnislake, England / Butte, MT\"\n2,0,\"Pernot, Mr. Rene\",\"male\",?,0,0,\"SC/PARIS 2131\",15.05,?,\"C\",?,?,?\n2,0,\"Peruschitz, Rev. Joseph Maria\",\"male\",41,0,0,\"237393\",13,?,\"S\",?,?,?\n2,1,\"Phillips, Miss. Alice Frances Louisa\",\"female\",21,0,1,\"S.O./P.P. 2\",21,?,\"S\",\"12\",?,\"Ilfracombe, Devon\"\n2,1,\"Phillips, Miss. Kate Florence ('Mrs Kate Louise Phillips Marshall')\",\"female\",19,0,0,\"250655\",26,?,\"S\",\"11\",?,\"Worcester, England\"\n2,0,\"Phillips, Mr. Escott Robert\",\"male\",43,0,1,\"S.O./P.P. 2\",21,?,\"S\",?,?,\"Ilfracombe, Devon\"\n2,1,\"Pinsky, Mrs. (Rosa)\",\"female\",32,0,0,\"234604\",13,?,\"S\",\"9\",?,\"Russia\"\n2,0,\"Ponesell, Mr. Martin\",\"male\",34,0,0,\"250647\",13,?,\"S\",?,?,\"Denmark / New York, NY\"\n2,1,\"Portaluppi, Mr. Emilio Ilario Giuseppe\",\"male\",30,0,0,\"C.A. 34644\",12.7375,?,\"C\",\"14\",?,\"Milford, NH\"\n2,0,\"Pulbaum, Mr. Franz\",\"male\",27,0,0,\"SC/PARIS 2168\",15.0333,?,\"C\",?,?,\"Paris\"\n2,1,\"Quick, Miss. Phyllis May\",\"female\",2,1,1,\"26360\",26,?,\"S\",\"11\",?,\"Plymouth, Devon / Detroit, MI\"\n2,1,\"Quick, Miss. Winifred Vera\",\"female\",8,1,1,\"26360\",26,?,\"S\",\"11\",?,\"Plymouth, Devon / Detroit, MI\"\n2,1,\"Quick, Mrs. Frederick Charles (Jane Richards)\",\"female\",33,0,2,\"26360\",26,?,\"S\",\"11\",?,\"Plymouth, Devon / Detroit, MI\"\n2,0,\"Reeves, Mr. David\",\"male\",36,0,0,\"C.A. 17248\",10.5,?,\"S\",?,?,\"Brighton, Sussex\"\n2,0,\"Renouf, Mr. Peter Henry\",\"male\",34,1,0,\"31027\",21,?,\"S\",\"12\",?,\"Elizabeth, NJ\"\n2,1,\"Renouf, Mrs. Peter Henry (Lillian Jefferys)\",\"female\",30,3,0,\"31027\",21,?,\"S\",?,?,\"Elizabeth, NJ\"\n2,1,\"Reynaldo, Ms. Encarnacion\",\"female\",28,0,0,\"230434\",13,?,\"S\",\"9\",?,\"Spain\"\n2,0,\"Richard, Mr. Emile\",\"male\",23,0,0,\"SC/PARIS 2133\",15.0458,?,\"C\",?,?,\"Paris / Montreal, PQ\"\n2,1,\"Richards, Master. George Sibley\",\"male\",0.8333,1,1,\"29106\",18.75,?,\"S\",\"4\",?,\"Cornwall / Akron, OH\"\n2,1,\"Richards, Master. William Rowe\",\"male\",3,1,1,\"29106\",18.75,?,\"S\",\"4\",?,\"Cornwall / Akron, OH\"\n2,1,\"Richards, Mrs. Sidney (Emily Hocking)\",\"female\",24,2,3,\"29106\",18.75,?,\"S\",\"4\",?,\"Cornwall / Akron, OH\"\n2,1,\"Ridsdale, Miss. Lucy\",\"female\",50,0,0,\"W./C. 14258\",10.5,?,\"S\",\"13\",?,\"London, England / Marietta, Ohio and Milwaukee, WI\"\n2,0,\"Rogers, Mr. Reginald Harry\",\"male\",19,0,0,\"28004\",10.5,?,\"S\",?,?,?\n2,1,\"Rugg, Miss. Emily\",\"female\",21,0,0,\"C.A. 31026\",10.5,?,\"S\",\"12\",?,\"Guernsey / Wilmington, DE\"\n2,0,\"Schmidt, Mr. August\",\"male\",26,0,0,\"248659\",13,?,\"S\",?,?,\"Newark, NJ\"\n2,0,\"Sedgwick, Mr. Charles Frederick Waddington\",\"male\",25,0,0,\"244361\",13,?,\"S\",?,?,\"Liverpool\"\n2,0,\"Sharp, Mr. Percival James R\",\"male\",27,0,0,\"244358\",26,?,\"S\",?,?,\"Hornsey, England\"\n2,1,\"Shelley, Mrs. William (Imanita Parrish Hall)\",\"female\",25,0,1,\"230433\",26,?,\"S\",\"12\",?,\"Deer Lodge, MT\"\n2,1,\"Silven, Miss. Lyyli Karoliina\",\"female\",18,0,2,\"250652\",13,?,\"S\",\"16\",?,\"Finland / Minneapolis, MN\"\n2,1,\"Sincock, Miss. Maude\",\"female\",20,0,0,\"C.A. 33112\",36.75,?,\"S\",\"11\",?,\"Cornwall / Hancock, MI\"\n2,1,\"Sinkkonen, Miss. Anna\",\"female\",30,0,0,\"250648\",13,?,\"S\",\"10\",?,\"Finland / Washington, DC\"\n2,0,\"Sjostedt, Mr. Ernst Adolf\",\"male\",59,0,0,\"237442\",13.5,?,\"S\",?,?,\"Sault St Marie, ON\"\n2,1,\"Slayter, Miss. Hilda Mary\",\"female\",30,0,0,\"234818\",12.35,?,\"Q\",\"13\",?,\"Halifax, NS\"\n2,0,\"Slemen, Mr. Richard James\",\"male\",35,0,0,\"28206\",10.5,?,\"S\",?,?,\"Cornwall\"\n2,1,\"Smith, Miss. Marion Elsie\",\"female\",40,0,0,\"31418\",13,?,\"S\",\"9\",?,?\n2,0,\"Sobey, Mr. Samuel James Hayden\",\"male\",25,0,0,\"C.A. 29178\",13,?,\"S\",?,?,\"Cornwall / Houghton, MI\"\n2,0,\"Stanton, Mr. Samuel Ward\",\"male\",41,0,0,\"237734\",15.0458,?,\"C\",?,?,\"New York, NY\"\n2,0,\"Stokes, Mr. Philip Joseph\",\"male\",25,0,0,\"F.C.C. 13540\",10.5,?,\"S\",?,81,\"Catford, Kent / Detroit, MI\"\n2,0,\"Swane, Mr. George\",\"male\",18.5,0,0,\"248734\",13,\"F\",\"S\",?,294,?\n2,0,\"Sweet, Mr. George Frederick\",\"male\",14,0,0,\"220845\",65,?,\"S\",?,?,\"Somerset / Bernardsville, NJ\"\n2,1,\"Toomey, Miss. Ellen\",\"female\",50,0,0,\"F.C.C. 13531\",10.5,?,\"S\",\"9\",?,\"Indianapolis, IN\"\n2,0,\"Troupiansky, Mr. Moses Aaron\",\"male\",23,0,0,\"233639\",13,?,\"S\",?,?,?\n2,1,\"Trout, Mrs. William H (Jessie L)\",\"female\",28,0,0,\"240929\",12.65,?,\"S\",?,?,\"Columbus, OH\"\n2,1,\"Troutt, Miss. Edwina Celia 'Winnie'\",\"female\",27,0,0,\"34218\",10.5,\"E101\",\"S\",\"16\",?,\"Bath, England / Massachusetts\"\n2,0,\"Turpin, Mr. William John Robert\",\"male\",29,1,0,\"11668\",21,?,\"S\",?,?,\"Plymouth, England\"\n2,0,\"Turpin, Mrs. William John Robert (Dorothy Ann Wonnacott)\",\"female\",27,1,0,\"11668\",21,?,\"S\",?,?,\"Plymouth, England\"\n2,0,\"Veal, Mr. James\",\"male\",40,0,0,\"28221\",13,?,\"S\",?,?,\"Barre, Co Washington, VT\"\n2,1,\"Walcroft, Miss. Nellie\",\"female\",31,0,0,\"F.C.C. 13528\",21,?,\"S\",\"14\",?,\"Mamaroneck, NY\"\n2,0,\"Ware, Mr. John James\",\"male\",30,1,0,\"CA 31352\",21,?,\"S\",?,?,\"Bristol, England / New Britain, CT\"\n2,0,\"Ware, Mr. William Jeffery\",\"male\",23,1,0,\"28666\",10.5,?,\"S\",?,?,?\n2,1,\"Ware, Mrs. John James (Florence Louise Long)\",\"female\",31,0,0,\"CA 31352\",21,?,\"S\",\"10\",?,\"Bristol, England / New Britain, CT\"\n2,0,\"Watson, Mr. Ennis Hastings\",\"male\",?,0,0,\"239856\",0,?,\"S\",?,?,\"Belfast\"\n2,1,\"Watt, Miss. Bertha J\",\"female\",12,0,0,\"C.A. 33595\",15.75,?,\"S\",\"9\",?,\"Aberdeen / Portland, OR\"\n2,1,\"Watt, Mrs. James (Elizabeth 'Bessie' Inglis Milne)\",\"female\",40,0,0,\"C.A. 33595\",15.75,?,\"S\",\"9\",?,\"Aberdeen / Portland, OR\"\n2,1,\"Webber, Miss. Susan\",\"female\",32.5,0,0,\"27267\",13,\"E101\",\"S\",\"12\",?,\"England / Hartford, CT\"\n2,0,\"Weisz, Mr. Leopold\",\"male\",27,1,0,\"228414\",26,?,\"S\",?,293,\"Bromsgrove, England / Montreal, PQ\"\n2,1,\"Weisz, Mrs. Leopold (Mathilde Francoise Pede)\",\"female\",29,1,0,\"228414\",26,?,\"S\",\"10\",?,\"Bromsgrove, England / Montreal, PQ\"\n2,1,\"Wells, Master. Ralph Lester\",\"male\",2,1,1,\"29103\",23,?,\"S\",\"14\",?,\"Cornwall / Akron, OH\"\n2,1,\"Wells, Miss. Joan\",\"female\",4,1,1,\"29103\",23,?,\"S\",\"14\",?,\"Cornwall / Akron, OH\"\n2,1,\"Wells, Mrs. Arthur Henry ('Addie' Dart Trevaskis)\",\"female\",29,0,2,\"29103\",23,?,\"S\",\"14\",?,\"Cornwall / Akron, OH\"\n2,1,\"West, Miss. Barbara J\",\"female\",0.9167,1,2,\"C.A. 34651\",27.75,?,\"S\",\"10\",?,\"Bournmouth, England\"\n2,1,\"West, Miss. Constance Mirium\",\"female\",5,1,2,\"C.A. 34651\",27.75,?,\"S\",\"10\",?,\"Bournmouth, England\"\n2,0,\"West, Mr. Edwy Arthur\",\"male\",36,1,2,\"C.A. 34651\",27.75,?,\"S\",?,?,\"Bournmouth, England\"\n2,1,\"West, Mrs. Edwy Arthur (Ada Mary Worth)\",\"female\",33,1,2,\"C.A. 34651\",27.75,?,\"S\",\"10\",?,\"Bournmouth, England\"\n2,0,\"Wheadon, Mr. Edward H\",\"male\",66,0,0,\"C.A. 24579\",10.5,?,\"S\",?,?,\"Guernsey, England / Edgewood, RI\"\n2,0,\"Wheeler, Mr. Edwin 'Frederick'\",\"male\",?,0,0,\"SC/PARIS 2159\",12.875,?,\"S\",?,?,?\n2,1,\"Wilhelms, Mr. Charles\",\"male\",31,0,0,\"244270\",13,?,\"S\",\"9\",?,\"London, England\"\n2,1,\"Williams, Mr. Charles Eugene\",\"male\",?,0,0,\"244373\",13,?,\"S\",\"14\",?,\"Harrow, England\"\n2,1,\"Wright, Miss. Marion\",\"female\",26,0,0,\"220844\",13.5,?,\"S\",\"9\",?,\"Yoevil, England / Cottage Grove, OR\"\n2,0,\"Yrois, Miss. Henriette ('Mrs Harbeck')\",\"female\",24,0,0,\"248747\",13,?,\"S\",?,?,\"Paris\"\n3,0,\"Abbing, Mr. Anthony\",\"male\",42,0,0,\"C.A. 5547\",7.55,?,\"S\",?,?,?\n3,0,\"Abbott, Master. Eugene Joseph\",\"male\",13,0,2,\"C.A. 2673\",20.25,?,\"S\",?,?,\"East Providence, RI\"\n3,0,\"Abbott, Mr. Rossmore Edward\",\"male\",16,1,1,\"C.A. 2673\",20.25,?,\"S\",?,190,\"East Providence, RI\"\n3,1,\"Abbott, Mrs. Stanton (Rosa Hunt)\",\"female\",35,1,1,\"C.A. 2673\",20.25,?,\"S\",\"A\",?,\"East Providence, RI\"\n3,1,\"Abelseth, Miss. Karen Marie\",\"female\",16,0,0,\"348125\",7.65,?,\"S\",\"16\",?,\"Norway Los Angeles, CA\"\n3,1,\"Abelseth, Mr. Olaus Jorgensen\",\"male\",25,0,0,\"348122\",7.65,\"F G63\",\"S\",\"A\",?,\"Perkins County, SD\"\n3,1,\"Abrahamsson, Mr. Abraham August Johannes\",\"male\",20,0,0,\"SOTON/O2 3101284\",7.925,?,\"S\",\"15\",?,\"Taalintehdas, Finland Hoboken, NJ\"\n3,1,\"Abrahim, Mrs. Joseph (Sophie Halaut Easu)\",\"female\",18,0,0,\"2657\",7.2292,?,\"C\",\"C\",?,\"Greensburg, PA\"\n3,0,\"Adahl, Mr. Mauritz Nils Martin\",\"male\",30,0,0,\"C 7076\",7.25,?,\"S\",?,72,\"Asarum, Sweden Brooklyn, NY\"\n3,0,\"Adams, Mr. John\",\"male\",26,0,0,\"341826\",8.05,?,\"S\",?,103,\"Bournemouth, England\"\n3,0,\"Ahlin, Mrs. Johan (Johanna Persdotter Larsson)\",\"female\",40,1,0,\"7546\",9.475,?,\"S\",?,?,\"Sweden Akeley, MN\"\n3,1,\"Aks, Master. Philip Frank\",\"male\",0.8333,0,1,\"392091\",9.35,?,\"S\",\"11\",?,\"London, England Norfolk, VA\"\n3,1,\"Aks, Mrs. Sam (Leah Rosen)\",\"female\",18,0,1,\"392091\",9.35,?,\"S\",\"13\",?,\"London, England Norfolk, VA\"\n3,1,\"Albimona, Mr. Nassef Cassem\",\"male\",26,0,0,\"2699\",18.7875,?,\"C\",\"15\",?,\"Syria Fredericksburg, VA\"\n3,0,\"Alexander, Mr. William\",\"male\",26,0,0,\"3474\",7.8875,?,\"S\",?,?,\"England Albion, NY\"\n3,0,\"Alhomaki, Mr. Ilmari Rudolf\",\"male\",20,0,0,\"SOTON/O2 3101287\",7.925,?,\"S\",?,?,\"Salo, Finland Astoria, OR\"\n3,0,\"Ali, Mr. Ahmed\",\"male\",24,0,0,\"SOTON/O.Q. 3101311\",7.05,?,\"S\",?,?,?\n3,0,\"Ali, Mr. William\",\"male\",25,0,0,\"SOTON/O.Q. 3101312\",7.05,?,\"S\",?,79,\"Argentina\"\n3,0,\"Allen, Mr. William Henry\",\"male\",35,0,0,\"373450\",8.05,?,\"S\",?,?,\"Lower Clapton, Middlesex or Erdington, Birmingham\"\n3,0,\"Allum, Mr. Owen George\",\"male\",18,0,0,\"2223\",8.3,?,\"S\",?,259,\"Windsor, England New York, NY\"\n3,0,\"Andersen, Mr. Albert Karvin\",\"male\",32,0,0,\"C 4001\",22.525,?,\"S\",?,260,\"Bergen, Norway\"\n3,1,\"Andersen-Jensen, Miss. Carla Christine Nielsine\",\"female\",19,1,0,\"350046\",7.8542,?,\"S\",\"16\",?,?\n3,0,\"Andersson, Master. Sigvard Harald Elias\",\"male\",4,4,2,\"347082\",31.275,?,\"S\",?,?,\"Sweden Winnipeg, MN\"\n3,0,\"Andersson, Miss. Ebba Iris Alfrida\",\"female\",6,4,2,\"347082\",31.275,?,\"S\",?,?,\"Sweden Winnipeg, MN\"\n3,0,\"Andersson, Miss. Ellis Anna Maria\",\"female\",2,4,2,\"347082\",31.275,?,\"S\",?,?,\"Sweden Winnipeg, MN\"\n3,1,\"Andersson, Miss. Erna Alexandra\",\"female\",17,4,2,\"3101281\",7.925,?,\"S\",\"D\",?,\"Ruotsinphyhtaa, Finland New York, NY\"\n3,0,\"Andersson, Miss. Ida Augusta Margareta\",\"female\",38,4,2,\"347091\",7.775,?,\"S\",?,?,\"Vadsbro, Sweden Ministee, MI\"\n3,0,\"Andersson, Miss. Ingeborg Constanzia\",\"female\",9,4,2,\"347082\",31.275,?,\"S\",?,?,\"Sweden Winnipeg, MN\"\n3,0,\"Andersson, Miss. Sigrid Elisabeth\",\"female\",11,4,2,\"347082\",31.275,?,\"S\",?,?,\"Sweden Winnipeg, MN\"\n3,0,\"Andersson, Mr. Anders Johan\",\"male\",39,1,5,\"347082\",31.275,?,\"S\",?,?,\"Sweden Winnipeg, MN\"\n3,1,\"Andersson, Mr. August Edvard ('Wennerstrom')\",\"male\",27,0,0,\"350043\",7.7958,?,\"S\",\"A\",?,?\n3,0,\"Andersson, Mr. Johan Samuel\",\"male\",26,0,0,\"347075\",7.775,?,\"S\",?,?,\"Hartford, CT\"\n3,0,\"Andersson, Mrs. Anders Johan (Alfrida Konstantia Brogren)\",\"female\",39,1,5,\"347082\",31.275,?,\"S\",?,?,\"Sweden Winnipeg, MN\"\n3,0,\"Andreasson, Mr. Paul Edvin\",\"male\",20,0,0,\"347466\",7.8542,?,\"S\",?,?,\"Sweden Chicago, IL\"\n3,0,\"Angheloff, Mr. Minko\",\"male\",26,0,0,\"349202\",7.8958,?,\"S\",?,?,\"Bulgaria Chicago, IL\"\n3,0,\"Arnold-Franchi, Mr. Josef\",\"male\",25,1,0,\"349237\",17.8,?,\"S\",?,?,\"Altdorf, Switzerland\"\n3,0,\"Arnold-Franchi, Mrs. Josef (Josefine Franchi)\",\"female\",18,1,0,\"349237\",17.8,?,\"S\",?,?,\"Altdorf, Switzerland\"\n3,0,\"Aronsson, Mr. Ernst Axel Algot\",\"male\",24,0,0,\"349911\",7.775,?,\"S\",?,?,\"Sweden Joliet, IL\"\n3,0,\"Asim, Mr. Adola\",\"male\",35,0,0,\"SOTON/O.Q. 3101310\",7.05,?,\"S\",?,?,?\n3,0,\"Asplund, Master. Carl Edgar\",\"male\",5,4,2,\"347077\",31.3875,?,\"S\",?,?,\"Sweden  Worcester, MA\"\n3,0,\"Asplund, Master. Clarence Gustaf Hugo\",\"male\",9,4,2,\"347077\",31.3875,?,\"S\",?,?,\"Sweden Worcester, MA\"\n3,1,\"Asplund, Master. Edvin Rojj Felix\",\"male\",3,4,2,\"347077\",31.3875,?,\"S\",\"15\",?,\"Sweden Worcester, MA\"\n3,0,\"Asplund, Master. Filip Oscar\",\"male\",13,4,2,\"347077\",31.3875,?,\"S\",?,?,\"Sweden Worcester, MA\"\n3,1,\"Asplund, Miss. Lillian Gertrud\",\"female\",5,4,2,\"347077\",31.3875,?,\"S\",\"15\",?,\"Sweden Worcester, MA\"\n3,0,\"Asplund, Mr. Carl Oscar Vilhelm Gustafsson\",\"male\",40,1,5,\"347077\",31.3875,?,\"S\",?,142,\"Sweden  Worcester, MA\"\n3,1,\"Asplund, Mr. Johan Charles\",\"male\",23,0,0,\"350054\",7.7958,?,\"S\",\"13\",?,\"Oskarshamn, Sweden Minneapolis, MN\"\n3,1,\"Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson)\",\"female\",38,1,5,\"347077\",31.3875,?,\"S\",\"15\",?,\"Sweden  Worcester, MA\"\n3,1,\"Assaf Khalil, Mrs. Mariana ('Miriam')\",\"female\",45,0,0,\"2696\",7.225,?,\"C\",\"C\",?,\"Ottawa, ON\"\n3,0,\"Assaf, Mr. Gerios\",\"male\",21,0,0,\"2692\",7.225,?,\"C\",?,?,\"Ottawa, ON\"\n3,0,\"Assam, Mr. Ali\",\"male\",23,0,0,\"SOTON/O.Q. 3101309\",7.05,?,\"S\",?,?,?\n3,0,\"Attalah, Miss. Malake\",\"female\",17,0,0,\"2627\",14.4583,?,\"C\",?,?,?\n3,0,\"Attalah, Mr. Sleiman\",\"male\",30,0,0,\"2694\",7.225,?,\"C\",?,?,\"Ottawa, ON\"\n3,0,\"Augustsson, Mr. Albert\",\"male\",23,0,0,\"347468\",7.8542,?,\"S\",?,?,\"Krakoryd, Sweden Bloomington, IL\"\n3,1,\"Ayoub, Miss. Banoura\",\"female\",13,0,0,\"2687\",7.2292,?,\"C\",\"C\",?,\"Syria Youngstown, OH\"\n3,0,\"Baccos, Mr. Raffull\",\"male\",20,0,0,\"2679\",7.225,?,\"C\",?,?,?\n3,0,\"Backstrom, Mr. Karl Alfred\",\"male\",32,1,0,\"3101278\",15.85,?,\"S\",\"D\",?,\"Ruotsinphytaa, Finland New York, NY\"\n3,1,\"Backstrom, Mrs. Karl Alfred (Maria Mathilda Gustafsson)\",\"female\",33,3,0,\"3101278\",15.85,?,\"S\",?,?,\"Ruotsinphytaa, Finland New York, NY\"\n3,1,\"Baclini, Miss. Eugenie\",\"female\",0.75,2,1,\"2666\",19.2583,?,\"C\",\"C\",?,\"Syria New York, NY\"\n3,1,\"Baclini, Miss. Helene Barbara\",\"female\",0.75,2,1,\"2666\",19.2583,?,\"C\",\"C\",?,\"Syria New York, NY\"\n3,1,\"Baclini, Miss. Marie Catherine\",\"female\",5,2,1,\"2666\",19.2583,?,\"C\",\"C\",?,\"Syria New York, NY\"\n3,1,\"Baclini, Mrs. Solomon (Latifa Qurban)\",\"female\",24,0,3,\"2666\",19.2583,?,\"C\",\"C\",?,\"Syria New York, NY\"\n3,1,\"Badman, Miss. Emily Louisa\",\"female\",18,0,0,\"A/4 31416\",8.05,?,\"S\",\"C\",?,\"London Skanteales, NY\"\n3,0,\"Badt, Mr. Mohamed\",\"male\",40,0,0,\"2623\",7.225,?,\"C\",?,?,?\n3,0,\"Balkic, Mr. Cerin\",\"male\",26,0,0,\"349248\",7.8958,?,\"S\",?,?,?\n3,1,\"Barah, Mr. Hanna Assi\",\"male\",20,0,0,\"2663\",7.2292,?,\"C\",\"15\",?,?\n3,0,\"Barbara, Miss. Saiide\",\"female\",18,0,1,\"2691\",14.4542,?,\"C\",?,?,\"Syria Ottawa, ON\"\n3,0,\"Barbara, Mrs. (Catherine David)\",\"female\",45,0,1,\"2691\",14.4542,?,\"C\",?,?,\"Syria Ottawa, ON\"\n3,0,\"Barry, Miss. Julia\",\"female\",27,0,0,\"330844\",7.8792,?,\"Q\",?,?,\"New York, NY\"\n3,0,\"Barton, Mr. David John\",\"male\",22,0,0,\"324669\",8.05,?,\"S\",?,?,\"England New York, NY\"\n3,0,\"Beavan, Mr. William Thomas\",\"male\",19,0,0,\"323951\",8.05,?,\"S\",?,?,\"England\"\n3,0,\"Bengtsson, Mr. John Viktor\",\"male\",26,0,0,\"347068\",7.775,?,\"S\",?,?,\"Krakudden, Sweden Moune, IL\"\n3,0,\"Berglund, Mr. Karl Ivar Sven\",\"male\",22,0,0,\"PP 4348\",9.35,?,\"S\",?,?,\"Tranvik, Finland New York\"\n3,0,\"Betros, Master. Seman\",\"male\",?,0,0,\"2622\",7.2292,?,\"C\",?,?,?\n3,0,\"Betros, Mr. Tannous\",\"male\",20,0,0,\"2648\",4.0125,?,\"C\",?,?,\"Syria\"\n3,1,\"Bing, Mr. Lee\",\"male\",32,0,0,\"1601\",56.4958,?,\"S\",\"C\",?,\"Hong Kong New York, NY\"\n3,0,\"Birkeland, Mr. Hans Martin Monsen\",\"male\",21,0,0,\"312992\",7.775,?,\"S\",?,?,\"Brennes, Norway New York\"\n3,0,\"Bjorklund, Mr. Ernst Herbert\",\"male\",18,0,0,\"347090\",7.75,?,\"S\",?,?,\"Stockholm, Sweden New York\"\n3,0,\"Bostandyeff, Mr. Guentcho\",\"male\",26,0,0,\"349224\",7.8958,?,\"S\",?,?,\"Bulgaria Chicago, IL\"\n3,0,\"Boulos, Master. Akar\",\"male\",6,1,1,\"2678\",15.2458,?,\"C\",?,?,\"Syria Kent, ON\"\n3,0,\"Boulos, Miss. Nourelain\",\"female\",9,1,1,\"2678\",15.2458,?,\"C\",?,?,\"Syria Kent, ON\"\n3,0,\"Boulos, Mr. Hanna\",\"male\",?,0,0,\"2664\",7.225,?,\"C\",?,?,\"Syria\"\n3,0,\"Boulos, Mrs. Joseph (Sultana)\",\"female\",?,0,2,\"2678\",15.2458,?,\"C\",?,?,\"Syria Kent, ON\"\n3,0,\"Bourke, Miss. Mary\",\"female\",?,0,2,\"364848\",7.75,?,\"Q\",?,?,\"Ireland Chicago, IL\"\n3,0,\"Bourke, Mr. John\",\"male\",40,1,1,\"364849\",15.5,?,\"Q\",?,?,\"Ireland Chicago, IL\"\n3,0,\"Bourke, Mrs. John (Catherine)\",\"female\",32,1,1,\"364849\",15.5,?,\"Q\",?,?,\"Ireland Chicago, IL\"\n3,0,\"Bowen, Mr. David John 'Dai'\",\"male\",21,0,0,\"54636\",16.1,?,\"S\",?,?,\"Treherbert, Cardiff, Wales\"\n3,1,\"Bradley, Miss. Bridget Delia\",\"female\",22,0,0,\"334914\",7.725,?,\"Q\",\"13\",?,\"Kingwilliamstown, Co Cork, Ireland Glens Falls, NY\"\n3,0,\"Braf, Miss. Elin Ester Maria\",\"female\",20,0,0,\"347471\",7.8542,?,\"S\",?,?,\"Medeltorp, Sweden Chicago, IL\"\n3,0,\"Braund, Mr. Lewis Richard\",\"male\",29,1,0,\"3460\",7.0458,?,\"S\",?,?,\"Bridgerule, Devon\"\n3,0,\"Braund, Mr. Owen Harris\",\"male\",22,1,0,\"A/5 21171\",7.25,?,\"S\",?,?,\"Bridgerule, Devon\"\n3,0,\"Brobeck, Mr. Karl Rudolf\",\"male\",22,0,0,\"350045\",7.7958,?,\"S\",?,?,\"Sweden Worcester, MA\"\n3,0,\"Brocklebank, Mr. William Alfred\",\"male\",35,0,0,\"364512\",8.05,?,\"S\",?,?,\"Broomfield, Chelmsford, England\"\n3,0,\"Buckley, Miss. Katherine\",\"female\",18.5,0,0,\"329944\",7.2833,?,\"Q\",?,299,\"Co Cork, Ireland Roxbury, MA\"\n3,1,\"Buckley, Mr. Daniel\",\"male\",21,0,0,\"330920\",7.8208,?,\"Q\",\"13\",?,\"Kingwilliamstown, Co Cork, Ireland New York, NY\"\n3,0,\"Burke, Mr. Jeremiah\",\"male\",19,0,0,\"365222\",6.75,?,\"Q\",?,?,\"Co Cork, Ireland Charlestown, MA\"\n3,0,\"Burns, Miss. Mary Delia\",\"female\",18,0,0,\"330963\",7.8792,?,\"Q\",?,?,\"Co Sligo, Ireland New York, NY\"\n3,0,\"Cacic, Miss. Manda\",\"female\",21,0,0,\"315087\",8.6625,?,\"S\",?,?,?\n3,0,\"Cacic, Miss. Marija\",\"female\",30,0,0,\"315084\",8.6625,?,\"S\",?,?,?\n3,0,\"Cacic, Mr. Jego Grga\",\"male\",18,0,0,\"315091\",8.6625,?,\"S\",?,?,?\n3,0,\"Cacic, Mr. Luka\",\"male\",38,0,0,\"315089\",8.6625,?,\"S\",?,?,\"Croatia\"\n3,0,\"Calic, Mr. Jovo\",\"male\",17,0,0,\"315093\",8.6625,?,\"S\",?,?,?\n3,0,\"Calic, Mr. Petar\",\"male\",17,0,0,\"315086\",8.6625,?,\"S\",?,?,?\n3,0,\"Canavan, Miss. Mary\",\"female\",21,0,0,\"364846\",7.75,?,\"Q\",?,?,?\n3,0,\"Canavan, Mr. Patrick\",\"male\",21,0,0,\"364858\",7.75,?,\"Q\",?,?,\"Ireland Philadelphia, PA\"\n3,0,\"Cann, Mr. Ernest Charles\",\"male\",21,0,0,\"A./5. 2152\",8.05,?,\"S\",?,?,?\n3,0,\"Caram, Mr. Joseph\",\"male\",?,1,0,\"2689\",14.4583,?,\"C\",?,?,\"Ottawa, ON\"\n3,0,\"Caram, Mrs. Joseph (Maria Elias)\",\"female\",?,1,0,\"2689\",14.4583,?,\"C\",?,?,\"Ottawa, ON\"\n3,0,\"Carlsson, Mr. August Sigfrid\",\"male\",28,0,0,\"350042\",7.7958,?,\"S\",?,?,\"Dagsas, Sweden Fower, MN\"\n3,0,\"Carlsson, Mr. Carl Robert\",\"male\",24,0,0,\"350409\",7.8542,?,\"S\",?,?,\"Goteborg, Sweden Huntley, IL\"\n3,1,\"Carr, Miss. Helen 'Ellen'\",\"female\",16,0,0,\"367231\",7.75,?,\"Q\",\"16\",?,\"Co Longford, Ireland New York, NY\"\n3,0,\"Carr, Miss. Jeannie\",\"female\",37,0,0,\"368364\",7.75,?,\"Q\",?,?,\"Co Sligo, Ireland Hartford, CT\"\n3,0,\"Carver, Mr. Alfred John\",\"male\",28,0,0,\"392095\",7.25,?,\"S\",?,?,\"St Denys, Southampton, Hants\"\n3,0,\"Celotti, Mr. Francesco\",\"male\",24,0,0,\"343275\",8.05,?,\"S\",?,?,\"London\"\n3,0,\"Charters, Mr. David\",\"male\",21,0,0,\"A/5. 13032\",7.7333,?,\"Q\",?,?,\"Ireland New York, NY\"\n3,1,\"Chip, Mr. Chang\",\"male\",32,0,0,\"1601\",56.4958,?,\"S\",\"C\",?,\"Hong Kong New York, NY\"\n3,0,\"Christmann, Mr. Emil\",\"male\",29,0,0,\"343276\",8.05,?,\"S\",?,?,?\n3,0,\"Chronopoulos, Mr. Apostolos\",\"male\",26,1,0,\"2680\",14.4542,?,\"C\",?,?,\"Greece\"\n3,0,\"Chronopoulos, Mr. Demetrios\",\"male\",18,1,0,\"2680\",14.4542,?,\"C\",?,?,\"Greece\"\n3,0,\"Coelho, Mr. Domingos Fernandeo\",\"male\",20,0,0,\"SOTON/O.Q. 3101307\",7.05,?,\"S\",?,?,\"Portugal\"\n3,1,\"Cohen, Mr. Gurshon 'Gus'\",\"male\",18,0,0,\"A/5 3540\",8.05,?,\"S\",\"12\",?,\"London Brooklyn, NY\"\n3,0,\"Colbert, Mr. Patrick\",\"male\",24,0,0,\"371109\",7.25,?,\"Q\",?,?,\"Co Limerick, Ireland Sherbrooke, PQ\"\n3,0,\"Coleff, Mr. Peju\",\"male\",36,0,0,\"349210\",7.4958,?,\"S\",?,?,\"Bulgaria Chicago, IL\"\n3,0,\"Coleff, Mr. Satio\",\"male\",24,0,0,\"349209\",7.4958,?,\"S\",?,?,?\n3,0,\"Conlon, Mr. Thomas Henry\",\"male\",31,0,0,\"21332\",7.7333,?,\"Q\",?,?,\"Philadelphia, PA\"\n3,0,\"Connaghton, Mr. Michael\",\"male\",31,0,0,\"335097\",7.75,?,\"Q\",?,?,\"Ireland Brooklyn, NY\"\n3,1,\"Connolly, Miss. Kate\",\"female\",22,0,0,\"370373\",7.75,?,\"Q\",\"13\",?,\"Ireland\"\n3,0,\"Connolly, Miss. Kate\",\"female\",30,0,0,\"330972\",7.6292,?,\"Q\",?,?,\"Ireland\"\n3,0,\"Connors, Mr. Patrick\",\"male\",70.5,0,0,\"370369\",7.75,?,\"Q\",?,171,?\n3,0,\"Cook, Mr. Jacob\",\"male\",43,0,0,\"A/5 3536\",8.05,?,\"S\",?,?,?\n3,0,\"Cor, Mr. Bartol\",\"male\",35,0,0,\"349230\",7.8958,?,\"S\",?,?,\"Austria\"\n3,0,\"Cor, Mr. Ivan\",\"male\",27,0,0,\"349229\",7.8958,?,\"S\",?,?,\"Austria\"\n3,0,\"Cor, Mr. Liudevit\",\"male\",19,0,0,\"349231\",7.8958,?,\"S\",?,?,\"Austria\"\n3,0,\"Corn, Mr. Harry\",\"male\",30,0,0,\"SOTON/OQ 392090\",8.05,?,\"S\",?,?,\"London\"\n3,1,\"Coutts, Master. Eden Leslie 'Neville'\",\"male\",9,1,1,\"C.A. 37671\",15.9,?,\"S\",\"2\",?,\"England Brooklyn, NY\"\n3,1,\"Coutts, Master. William Loch 'William'\",\"male\",3,1,1,\"C.A. 37671\",15.9,?,\"S\",\"2\",?,\"England Brooklyn, NY\"\n3,1,\"Coutts, Mrs. William (Winnie 'Minnie' Treanor)\",\"female\",36,0,2,\"C.A. 37671\",15.9,?,\"S\",\"2\",?,\"England Brooklyn, NY\"\n3,0,\"Coxon, Mr. Daniel\",\"male\",59,0,0,\"364500\",7.25,?,\"S\",?,?,\"Merrill, WI\"\n3,0,\"Crease, Mr. Ernest James\",\"male\",19,0,0,\"S.P. 3464\",8.1583,?,\"S\",?,?,\"Bristol, England Cleveland, OH\"\n3,1,\"Cribb, Miss. Laura Alice\",\"female\",17,0,1,\"371362\",16.1,?,\"S\",\"12\",?,\"Bournemouth, England Newark, NJ\"\n3,0,\"Cribb, Mr. John Hatfield\",\"male\",44,0,1,\"371362\",16.1,?,\"S\",?,?,\"Bournemouth, England Newark, NJ\"\n3,0,\"Culumovic, Mr. Jeso\",\"male\",17,0,0,\"315090\",8.6625,?,\"S\",?,?,\"Austria-Hungary\"\n3,0,\"Daher, Mr. Shedid\",\"male\",22.5,0,0,\"2698\",7.225,?,\"C\",?,9,?\n3,1,\"Dahl, Mr. Karl Edwart\",\"male\",45,0,0,\"7598\",8.05,?,\"S\",\"15\",?,\"Australia Fingal, ND\"\n3,0,\"Dahlberg, Miss. Gerda Ulrika\",\"female\",22,0,0,\"7552\",10.5167,?,\"S\",?,?,\"Norrlot, Sweden Chicago, IL\"\n3,0,\"Dakic, Mr. Branko\",\"male\",19,0,0,\"349228\",10.1708,?,\"S\",?,?,\"Austria\"\n3,1,\"Daly, Miss. Margaret Marcella 'Maggie'\",\"female\",30,0,0,\"382650\",6.95,?,\"Q\",\"15\",?,\"Co Athlone, Ireland New York, NY\"\n3,1,\"Daly, Mr. Eugene Patrick\",\"male\",29,0,0,\"382651\",7.75,?,\"Q\",\"13 15 B\",?,\"Co Athlone, Ireland New York, NY\"\n3,0,\"Danbom, Master. Gilbert Sigvard Emanuel\",\"male\",0.3333,0,2,\"347080\",14.4,?,\"S\",?,?,\"Stanton, IA\"\n3,0,\"Danbom, Mr. Ernst Gilbert\",\"male\",34,1,1,\"347080\",14.4,?,\"S\",?,197,\"Stanton, IA\"\n3,0,\"Danbom, Mrs. Ernst Gilbert (Anna Sigrid Maria Brogren)\",\"female\",28,1,1,\"347080\",14.4,?,\"S\",?,?,\"Stanton, IA\"\n3,0,\"Danoff, Mr. Yoto\",\"male\",27,0,0,\"349219\",7.8958,?,\"S\",?,?,\"Bulgaria Chicago, IL\"\n3,0,\"Dantcheff, Mr. Ristiu\",\"male\",25,0,0,\"349203\",7.8958,?,\"S\",?,?,\"Bulgaria Chicago, IL\"\n3,0,\"Davies, Mr. Alfred J\",\"male\",24,2,0,\"A/4 48871\",24.15,?,\"S\",?,?,\"West Bromwich, England Pontiac, MI\"\n3,0,\"Davies, Mr. Evan\",\"male\",22,0,0,\"SC/A4 23568\",8.05,?,\"S\",?,?,?\n3,0,\"Davies, Mr. John Samuel\",\"male\",21,2,0,\"A/4 48871\",24.15,?,\"S\",?,?,\"West Bromwich, England Pontiac, MI\"\n3,0,\"Davies, Mr. Joseph\",\"male\",17,2,0,\"A/4 48873\",8.05,?,\"S\",?,?,\"West Bromwich, England Pontiac, MI\"\n3,0,\"Davison, Mr. Thomas Henry\",\"male\",?,1,0,\"386525\",16.1,?,\"S\",?,?,\"Liverpool, England Bedford, OH\"\n3,1,\"Davison, Mrs. Thomas Henry (Mary E Finck)\",\"female\",?,1,0,\"386525\",16.1,?,\"S\",\"16\",?,\"Liverpool, England Bedford, OH\"\n3,1,\"de Messemaeker, Mr. Guillaume Joseph\",\"male\",36.5,1,0,\"345572\",17.4,?,\"S\",\"15\",?,\"Tampico, MT\"\n3,1,\"de Messemaeker, Mrs. Guillaume Joseph (Emma)\",\"female\",36,1,0,\"345572\",17.4,?,\"S\",\"13\",?,\"Tampico, MT\"\n3,1,\"de Mulder, Mr. Theodore\",\"male\",30,0,0,\"345774\",9.5,?,\"S\",\"11\",?,\"Belgium Detroit, MI\"\n3,0,\"de Pelsmaeker, Mr. Alfons\",\"male\",16,0,0,\"345778\",9.5,?,\"S\",?,?,?\n3,1,\"Dean, Master. Bertram Vere\",\"male\",1,1,2,\"C.A. 2315\",20.575,?,\"S\",\"10\",?,\"Devon, England Wichita, KS\"\n3,1,\"Dean, Miss. Elizabeth Gladys 'Millvina'\",\"female\",0.1667,1,2,\"C.A. 2315\",20.575,?,\"S\",\"10\",?,\"Devon, England Wichita, KS\"\n3,0,\"Dean, Mr. Bertram Frank\",\"male\",26,1,2,\"C.A. 2315\",20.575,?,\"S\",?,?,\"Devon, England Wichita, KS\"\n3,1,\"Dean, Mrs. Bertram (Eva Georgetta Light)\",\"female\",33,1,2,\"C.A. 2315\",20.575,?,\"S\",\"10\",?,\"Devon, England Wichita, KS\"\n3,0,\"Delalic, Mr. Redjo\",\"male\",25,0,0,\"349250\",7.8958,?,\"S\",?,?,?\n3,0,\"Demetri, Mr. Marinko\",\"male\",?,0,0,\"349238\",7.8958,?,\"S\",?,?,?\n3,0,\"Denkoff, Mr. Mitto\",\"male\",?,0,0,\"349225\",7.8958,?,\"S\",?,?,\"Bulgaria Coon Rapids, IA\"\n3,0,\"Dennis, Mr. Samuel\",\"male\",22,0,0,\"A/5 21172\",7.25,?,\"S\",?,?,?\n3,0,\"Dennis, Mr. William\",\"male\",36,0,0,\"A/5 21175\",7.25,?,\"S\",?,?,?\n3,1,\"Devaney, Miss. Margaret Delia\",\"female\",19,0,0,\"330958\",7.8792,?,\"Q\",\"C\",?,\"Kilmacowen, Co Sligo, Ireland New York, NY\"\n3,0,\"Dika, Mr. Mirko\",\"male\",17,0,0,\"349232\",7.8958,?,\"S\",?,?,?\n3,0,\"Dimic, Mr. Jovan\",\"male\",42,0,0,\"315088\",8.6625,?,\"S\",?,?,?\n3,0,\"Dintcheff, Mr. Valtcho\",\"male\",43,0,0,\"349226\",7.8958,?,\"S\",?,?,?\n3,0,\"Doharr, Mr. Tannous\",\"male\",?,0,0,\"2686\",7.2292,?,\"C\",?,?,?\n3,0,\"Dooley, Mr. Patrick\",\"male\",32,0,0,\"370376\",7.75,?,\"Q\",?,?,\"Ireland New York, NY\"\n3,1,\"Dorking, Mr. Edward Arthur\",\"male\",19,0,0,\"A/5. 10482\",8.05,?,\"S\",\"B\",?,\"England Oglesby, IL\"\n3,1,\"Dowdell, Miss. Elizabeth\",\"female\",30,0,0,\"364516\",12.475,?,\"S\",\"13\",?,\"Union Hill, NJ\"\n3,0,\"Doyle, Miss. Elizabeth\",\"female\",24,0,0,\"368702\",7.75,?,\"Q\",?,?,\"Ireland New York, NY\"\n3,1,\"Drapkin, Miss. Jennie\",\"female\",23,0,0,\"SOTON/OQ 392083\",8.05,?,\"S\",?,?,\"London New York, NY\"\n3,0,\"Drazenoic, Mr. Jozef\",\"male\",33,0,0,\"349241\",7.8958,?,\"C\",?,51,\"Austria Niagara Falls, NY\"\n3,0,\"Duane, Mr. Frank\",\"male\",65,0,0,\"336439\",7.75,?,\"Q\",?,?,?\n3,1,\"Duquemin, Mr. Joseph\",\"male\",24,0,0,\"S.O./P.P. 752\",7.55,?,\"S\",\"D\",?,\"England Albion, NY\"\n3,0,\"Dyker, Mr. Adolf Fredrik\",\"male\",23,1,0,\"347072\",13.9,?,\"S\",?,?,\"West Haven, CT\"\n3,1,\"Dyker, Mrs. Adolf Fredrik (Anna Elisabeth Judith Andersson)\",\"female\",22,1,0,\"347072\",13.9,?,\"S\",\"16\",?,\"West Haven, CT\"\n3,0,\"Edvardsson, Mr. Gustaf Hjalmar\",\"male\",18,0,0,\"349912\",7.775,?,\"S\",?,?,\"Tofta, Sweden Joliet, IL\"\n3,0,\"Eklund, Mr. Hans Linus\",\"male\",16,0,0,\"347074\",7.775,?,\"S\",?,?,\"Karberg, Sweden Jerome Junction, AZ\"\n3,0,\"Ekstrom, Mr. Johan\",\"male\",45,0,0,\"347061\",6.975,?,\"S\",?,?,\"Effington Rut, SD\"\n3,0,\"Elias, Mr. Dibo\",\"male\",?,0,0,\"2674\",7.225,?,\"C\",?,?,?\n3,0,\"Elias, Mr. Joseph\",\"male\",39,0,2,\"2675\",7.2292,?,\"C\",?,?,\"Syria Ottawa, ON\"\n3,0,\"Elias, Mr. Joseph Jr\",\"male\",17,1,1,\"2690\",7.2292,?,\"C\",?,?,?\n3,0,\"Elias, Mr. Tannous\",\"male\",15,1,1,\"2695\",7.2292,?,\"C\",?,?,\"Syria\"\n3,0,\"Elsbury, Mr. William James\",\"male\",47,0,0,\"A/5 3902\",7.25,?,\"S\",?,?,\"Illinois, USA\"\n3,1,\"Emanuel, Miss. Virginia Ethel\",\"female\",5,0,0,\"364516\",12.475,?,\"S\",\"13\",?,\"New York, NY\"\n3,0,\"Emir, Mr. Farred Chehab\",\"male\",?,0,0,\"2631\",7.225,?,\"C\",?,?,?\n3,0,\"Everett, Mr. Thomas James\",\"male\",40.5,0,0,\"C.A. 6212\",15.1,?,\"S\",?,187,?\n3,0,\"Farrell, Mr. James\",\"male\",40.5,0,0,\"367232\",7.75,?,\"Q\",?,68,\"Aughnacliff, Co Longford, Ireland New York, NY\"\n3,1,\"Finoli, Mr. Luigi\",\"male\",?,0,0,\"SOTON/O.Q. 3101308\",7.05,?,\"S\",\"15\",?,\"Italy Philadelphia, PA\"\n3,0,\"Fischer, Mr. Eberhard Thelander\",\"male\",18,0,0,\"350036\",7.7958,?,\"S\",?,?,?\n3,0,\"Fleming, Miss. Honora\",\"female\",?,0,0,\"364859\",7.75,?,\"Q\",?,?,?\n3,0,\"Flynn, Mr. James\",\"male\",?,0,0,\"364851\",7.75,?,\"Q\",?,?,?\n3,0,\"Flynn, Mr. John\",\"male\",?,0,0,\"368323\",6.95,?,\"Q\",?,?,?\n3,0,\"Foley, Mr. Joseph\",\"male\",26,0,0,\"330910\",7.8792,?,\"Q\",?,?,\"Ireland Chicago, IL\"\n3,0,\"Foley, Mr. William\",\"male\",?,0,0,\"365235\",7.75,?,\"Q\",?,?,\"Ireland\"\n3,1,\"Foo, Mr. Choong\",\"male\",?,0,0,\"1601\",56.4958,?,\"S\",\"13\",?,\"Hong Kong New York, NY\"\n3,0,\"Ford, Miss. Doolina Margaret 'Daisy'\",\"female\",21,2,2,\"W./C. 6608\",34.375,?,\"S\",?,?,\"Rotherfield, Sussex, England Essex Co, MA\"\n3,0,\"Ford, Miss. Robina Maggie 'Ruby'\",\"female\",9,2,2,\"W./C. 6608\",34.375,?,\"S\",?,?,\"Rotherfield, Sussex, England Essex Co, MA\"\n3,0,\"Ford, Mr. Arthur\",\"male\",?,0,0,\"A/5 1478\",8.05,?,\"S\",?,?,\"Bridgwater, Somerset, England\"\n3,0,\"Ford, Mr. Edward Watson\",\"male\",18,2,2,\"W./C. 6608\",34.375,?,\"S\",?,?,\"Rotherfield, Sussex, England Essex Co, MA\"\n3,0,\"Ford, Mr. William Neal\",\"male\",16,1,3,\"W./C. 6608\",34.375,?,\"S\",?,?,\"Rotherfield, Sussex, England Essex Co, MA\"\n3,0,\"Ford, Mrs. Edward (Margaret Ann Watson)\",\"female\",48,1,3,\"W./C. 6608\",34.375,?,\"S\",?,?,\"Rotherfield, Sussex, England Essex Co, MA\"\n3,0,\"Fox, Mr. Patrick\",\"male\",?,0,0,\"368573\",7.75,?,\"Q\",?,?,\"Ireland New York, NY\"\n3,0,\"Franklin, Mr. Charles (Charles Fardon)\",\"male\",?,0,0,\"SOTON/O.Q. 3101314\",7.25,?,\"S\",?,?,?\n3,0,\"Gallagher, Mr. Martin\",\"male\",25,0,0,\"36864\",7.7417,?,\"Q\",?,?,\"New York, NY\"\n3,0,\"Garfirth, Mr. John\",\"male\",?,0,0,\"358585\",14.5,?,\"S\",?,?,?\n3,0,\"Gheorgheff, Mr. Stanio\",\"male\",?,0,0,\"349254\",7.8958,?,\"C\",?,?,?\n3,0,\"Gilinski, Mr. Eliezer\",\"male\",22,0,0,\"14973\",8.05,?,\"S\",?,47,?\n3,1,\"Gilnagh, Miss. Katherine 'Katie'\",\"female\",16,0,0,\"35851\",7.7333,?,\"Q\",\"16\",?,\"Co Longford, Ireland New York, NY\"\n3,1,\"Glynn, Miss. Mary Agatha\",\"female\",?,0,0,\"335677\",7.75,?,\"Q\",\"13\",?,\"Co Clare, Ireland Washington, DC\"\n3,1,\"Goldsmith, Master. Frank John William 'Frankie'\",\"male\",9,0,2,\"363291\",20.525,?,\"S\",\"C D\",?,\"Strood, Kent, England Detroit, MI\"\n3,0,\"Goldsmith, Mr. Frank John\",\"male\",33,1,1,\"363291\",20.525,?,\"S\",?,?,\"Strood, Kent, England Detroit, MI\"\n3,0,\"Goldsmith, Mr. Nathan\",\"male\",41,0,0,\"SOTON/O.Q. 3101263\",7.85,?,\"S\",?,?,\"Philadelphia, PA\"\n3,1,\"Goldsmith, Mrs. Frank John (Emily Alice Brown)\",\"female\",31,1,1,\"363291\",20.525,?,\"S\",\"C D\",?,\"Strood, Kent, England Detroit, MI\"\n3,0,\"Goncalves, Mr. Manuel Estanslas\",\"male\",38,0,0,\"SOTON/O.Q. 3101306\",7.05,?,\"S\",?,?,\"Portugal\"\n3,0,\"Goodwin, Master. Harold Victor\",\"male\",9,5,2,\"CA 2144\",46.9,?,\"S\",?,?,\"Wiltshire, England Niagara Falls, NY\"\n3,0,\"Goodwin, Master. Sidney Leonard\",\"male\",1,5,2,\"CA 2144\",46.9,?,\"S\",?,?,\"Wiltshire, England Niagara Falls, NY\"\n3,0,\"Goodwin, Master. William Frederick\",\"male\",11,5,2,\"CA 2144\",46.9,?,\"S\",?,?,\"Wiltshire, England Niagara Falls, NY\"\n3,0,\"Goodwin, Miss. Jessie Allis\",\"female\",10,5,2,\"CA 2144\",46.9,?,\"S\",?,?,\"Wiltshire, England Niagara Falls, NY\"\n3,0,\"Goodwin, Miss. Lillian Amy\",\"female\",16,5,2,\"CA 2144\",46.9,?,\"S\",?,?,\"Wiltshire, England Niagara Falls, NY\"\n3,0,\"Goodwin, Mr. Charles Edward\",\"male\",14,5,2,\"CA 2144\",46.9,?,\"S\",?,?,\"Wiltshire, England Niagara Falls, NY\"\n3,0,\"Goodwin, Mr. Charles Frederick\",\"male\",40,1,6,\"CA 2144\",46.9,?,\"S\",?,?,\"Wiltshire, England Niagara Falls, NY\"\n3,0,\"Goodwin, Mrs. Frederick (Augusta Tyler)\",\"female\",43,1,6,\"CA 2144\",46.9,?,\"S\",?,?,\"Wiltshire, England Niagara Falls, NY\"\n3,0,\"Green, Mr. George Henry\",\"male\",51,0,0,\"21440\",8.05,?,\"S\",?,?,\"Dorking, Surrey, England\"\n3,0,\"Gronnestad, Mr. Daniel Danielsen\",\"male\",32,0,0,\"8471\",8.3625,?,\"S\",?,?,\"Foresvik, Norway Portland, ND\"\n3,0,\"Guest, Mr. Robert\",\"male\",?,0,0,\"376563\",8.05,?,\"S\",?,?,?\n3,0,\"Gustafsson, Mr. Alfred Ossian\",\"male\",20,0,0,\"7534\",9.8458,?,\"S\",?,?,\"Waukegan, Chicago, IL\"\n3,0,\"Gustafsson, Mr. Anders Vilhelm\",\"male\",37,2,0,\"3101276\",7.925,?,\"S\",?,98,\"Ruotsinphytaa, Finland New York, NY\"\n3,0,\"Gustafsson, Mr. Johan Birger\",\"male\",28,2,0,\"3101277\",7.925,?,\"S\",?,?,\"Ruotsinphytaa, Finland New York, NY\"\n3,0,\"Gustafsson, Mr. Karl Gideon\",\"male\",19,0,0,\"347069\",7.775,?,\"S\",?,?,\"Myren, Sweden New York, NY\"\n3,0,\"Haas, Miss. Aloisia\",\"female\",24,0,0,\"349236\",8.85,?,\"S\",?,?,?\n3,0,\"Hagardon, Miss. Kate\",\"female\",17,0,0,\"AQ/3. 30631\",7.7333,?,\"Q\",?,?,?\n3,0,\"Hagland, Mr. Ingvald Olai Olsen\",\"male\",?,1,0,\"65303\",19.9667,?,\"S\",?,?,?\n3,0,\"Hagland, Mr. Konrad Mathias Reiersen\",\"male\",?,1,0,\"65304\",19.9667,?,\"S\",?,?,?\n3,0,\"Hakkarainen, Mr. Pekka Pietari\",\"male\",28,1,0,\"STON/O2. 3101279\",15.85,?,\"S\",?,?,?\n3,1,\"Hakkarainen, Mrs. Pekka Pietari (Elin Matilda Dolck)\",\"female\",24,1,0,\"STON/O2. 3101279\",15.85,?,\"S\",\"15\",?,?\n3,0,\"Hampe, Mr. Leon\",\"male\",20,0,0,\"345769\",9.5,?,\"S\",?,?,?\n3,0,\"Hanna, Mr. Mansour\",\"male\",23.5,0,0,\"2693\",7.2292,?,\"C\",?,188,?\n3,0,\"Hansen, Mr. Claus Peter\",\"male\",41,2,0,\"350026\",14.1083,?,\"S\",?,?,?\n3,0,\"Hansen, Mr. Henrik Juul\",\"male\",26,1,0,\"350025\",7.8542,?,\"S\",?,?,?\n3,0,\"Hansen, Mr. Henry Damsgaard\",\"male\",21,0,0,\"350029\",7.8542,?,\"S\",?,69,?\n3,1,\"Hansen, Mrs. Claus Peter (Jennie L Howard)\",\"female\",45,1,0,\"350026\",14.1083,?,\"S\",\"11\",?,?\n3,0,\"Harknett, Miss. Alice Phoebe\",\"female\",?,0,0,\"W./C. 6609\",7.55,?,\"S\",?,?,?\n3,0,\"Harmer, Mr. Abraham (David Lishin)\",\"male\",25,0,0,\"374887\",7.25,?,\"S\",\"B\",?,?\n3,0,\"Hart, Mr. Henry\",\"male\",?,0,0,\"394140\",6.8583,?,\"Q\",?,?,?\n3,0,\"Hassan, Mr. Houssein G N\",\"male\",11,0,0,\"2699\",18.7875,?,\"C\",?,?,?\n3,1,\"Healy, Miss. Hanora 'Nora'\",\"female\",?,0,0,\"370375\",7.75,?,\"Q\",\"16\",?,?\n3,1,\"Hedman, Mr. Oskar Arvid\",\"male\",27,0,0,\"347089\",6.975,?,\"S\",\"15\",?,?\n3,1,\"Hee, Mr. Ling\",\"male\",?,0,0,\"1601\",56.4958,?,\"S\",\"C\",?,?\n3,0,\"Hegarty, Miss. Hanora 'Nora'\",\"female\",18,0,0,\"365226\",6.75,?,\"Q\",?,?,?\n3,1,\"Heikkinen, Miss. Laina\",\"female\",26,0,0,\"STON/O2. 3101282\",7.925,?,\"S\",?,?,?\n3,0,\"Heininen, Miss. Wendla Maria\",\"female\",23,0,0,\"STON/O2. 3101290\",7.925,?,\"S\",?,?,?\n3,1,\"Hellstrom, Miss. Hilda Maria\",\"female\",22,0,0,\"7548\",8.9625,?,\"S\",\"C\",?,?\n3,0,\"Hendekovic, Mr. Ignjac\",\"male\",28,0,0,\"349243\",7.8958,?,\"S\",?,306,?\n3,0,\"Henriksson, Miss. Jenny Lovisa\",\"female\",28,0,0,\"347086\",7.775,?,\"S\",?,?,?\n3,0,\"Henry, Miss. Delia\",\"female\",?,0,0,\"382649\",7.75,?,\"Q\",?,?,?\n3,1,\"Hirvonen, Miss. Hildur E\",\"female\",2,0,1,\"3101298\",12.2875,?,\"S\",\"15\",?,?\n3,1,\"Hirvonen, Mrs. Alexander (Helga E Lindqvist)\",\"female\",22,1,1,\"3101298\",12.2875,?,\"S\",\"15\",?,?\n3,0,\"Holm, Mr. John Fredrik Alexander\",\"male\",43,0,0,\"C 7075\",6.45,?,\"S\",?,?,?\n3,0,\"Holthen, Mr. Johan Martin\",\"male\",28,0,0,\"C 4001\",22.525,?,\"S\",?,?,?\n3,1,\"Honkanen, Miss. Eliina\",\"female\",27,0,0,\"STON/O2. 3101283\",7.925,?,\"S\",?,?,?\n3,0,\"Horgan, Mr. John\",\"male\",?,0,0,\"370377\",7.75,?,\"Q\",?,?,?\n3,1,\"Howard, Miss. May Elizabeth\",\"female\",?,0,0,\"A. 2. 39186\",8.05,?,\"S\",\"C\",?,?\n3,0,\"Humblen, Mr. Adolf Mathias Nicolai Olsen\",\"male\",42,0,0,\"348121\",7.65,\"F G63\",\"S\",?,120,?\n3,1,\"Hyman, Mr. Abraham\",\"male\",?,0,0,\"3470\",7.8875,?,\"S\",\"C\",?,?\n3,0,\"Ibrahim Shawah, Mr. Yousseff\",\"male\",30,0,0,\"2685\",7.2292,?,\"C\",?,?,?\n3,0,\"Ilieff, Mr. Ylio\",\"male\",?,0,0,\"349220\",7.8958,?,\"S\",?,?,?\n3,0,\"Ilmakangas, Miss. Ida Livija\",\"female\",27,1,0,\"STON/O2. 3101270\",7.925,?,\"S\",?,?,?\n3,0,\"Ilmakangas, Miss. Pieta Sofia\",\"female\",25,1,0,\"STON/O2. 3101271\",7.925,?,\"S\",?,?,?\n3,0,\"Ivanoff, Mr. Kanio\",\"male\",?,0,0,\"349201\",7.8958,?,\"S\",?,?,?\n3,1,\"Jalsevac, Mr. Ivan\",\"male\",29,0,0,\"349240\",7.8958,?,\"C\",\"15\",?,?\n3,1,\"Jansson, Mr. Carl Olof\",\"male\",21,0,0,\"350034\",7.7958,?,\"S\",\"A\",?,?\n3,0,\"Jardin, Mr. Jose Neto\",\"male\",?,0,0,\"SOTON/O.Q. 3101305\",7.05,?,\"S\",?,?,?\n3,0,\"Jensen, Mr. Hans Peder\",\"male\",20,0,0,\"350050\",7.8542,?,\"S\",?,?,?\n3,0,\"Jensen, Mr. Niels Peder\",\"male\",48,0,0,\"350047\",7.8542,?,\"S\",?,?,?\n3,0,\"Jensen, Mr. Svend Lauritz\",\"male\",17,1,0,\"350048\",7.0542,?,\"S\",?,?,?\n3,1,\"Jermyn, Miss. Annie\",\"female\",?,0,0,\"14313\",7.75,?,\"Q\",\"D\",?,?\n3,1,\"Johannesen-Bratthammer, Mr. Bernt\",\"male\",?,0,0,\"65306\",8.1125,?,\"S\",\"13\",?,?\n3,0,\"Johanson, Mr. Jakob Alfred\",\"male\",34,0,0,\"3101264\",6.4958,?,\"S\",?,143,?\n3,1,\"Johansson Palmquist, Mr. Oskar Leander\",\"male\",26,0,0,\"347070\",7.775,?,\"S\",\"15\",?,?\n3,0,\"Johansson, Mr. Erik\",\"male\",22,0,0,\"350052\",7.7958,?,\"S\",?,156,?\n3,0,\"Johansson, Mr. Gustaf Joel\",\"male\",33,0,0,\"7540\",8.6542,?,\"S\",?,285,?\n3,0,\"Johansson, Mr. Karl Johan\",\"male\",31,0,0,\"347063\",7.775,?,\"S\",?,?,?\n3,0,\"Johansson, Mr. Nils\",\"male\",29,0,0,\"347467\",7.8542,?,\"S\",?,?,?\n3,1,\"Johnson, Master. Harold Theodor\",\"male\",4,1,1,\"347742\",11.1333,?,\"S\",\"15\",?,?\n3,1,\"Johnson, Miss. Eleanor Ileen\",\"female\",1,1,1,\"347742\",11.1333,?,\"S\",\"15\",?,?\n3,0,\"Johnson, Mr. Alfred\",\"male\",49,0,0,\"LINE\",0,?,\"S\",?,?,?\n3,0,\"Johnson, Mr. Malkolm Joackim\",\"male\",33,0,0,\"347062\",7.775,?,\"S\",?,37,?\n3,0,\"Johnson, Mr. William Cahoone Jr\",\"male\",19,0,0,\"LINE\",0,?,\"S\",?,?,?\n3,1,\"Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)\",\"female\",27,0,2,\"347742\",11.1333,?,\"S\",\"15\",?,?\n3,0,\"Johnston, Master. William Arthur 'Willie'\",\"male\",?,1,2,\"W./C. 6607\",23.45,?,\"S\",?,?,?\n3,0,\"Johnston, Miss. Catherine Helen 'Carrie'\",\"female\",?,1,2,\"W./C. 6607\",23.45,?,\"S\",?,?,?\n3,0,\"Johnston, Mr. Andrew G\",\"male\",?,1,2,\"W./C. 6607\",23.45,?,\"S\",?,?,?\n3,0,\"Johnston, Mrs. Andrew G (Elizabeth 'Lily' Watson)\",\"female\",?,1,2,\"W./C. 6607\",23.45,?,\"S\",?,?,?\n3,0,\"Jonkoff, Mr. Lalio\",\"male\",23,0,0,\"349204\",7.8958,?,\"S\",?,?,?\n3,1,\"Jonsson, Mr. Carl\",\"male\",32,0,0,\"350417\",7.8542,?,\"S\",\"15\",?,?\n3,0,\"Jonsson, Mr. Nils Hilding\",\"male\",27,0,0,\"350408\",7.8542,?,\"S\",?,?,?\n3,0,\"Jussila, Miss. Katriina\",\"female\",20,1,0,\"4136\",9.825,?,\"S\",?,?,?\n3,0,\"Jussila, Miss. Mari Aina\",\"female\",21,1,0,\"4137\",9.825,?,\"S\",?,?,?\n3,1,\"Jussila, Mr. Eiriik\",\"male\",32,0,0,\"STON/O 2. 3101286\",7.925,?,\"S\",\"15\",?,?\n3,0,\"Kallio, Mr. Nikolai Erland\",\"male\",17,0,0,\"STON/O 2. 3101274\",7.125,?,\"S\",?,?,?\n3,0,\"Kalvik, Mr. Johannes Halvorsen\",\"male\",21,0,0,\"8475\",8.4333,?,\"S\",?,?,?\n3,0,\"Karaic, Mr. Milan\",\"male\",30,0,0,\"349246\",7.8958,?,\"S\",?,?,?\n3,1,\"Karlsson, Mr. Einar Gervasius\",\"male\",21,0,0,\"350053\",7.7958,?,\"S\",\"13\",?,?\n3,0,\"Karlsson, Mr. Julius Konrad Eugen\",\"male\",33,0,0,\"347465\",7.8542,?,\"S\",?,?,?\n3,0,\"Karlsson, Mr. Nils August\",\"male\",22,0,0,\"350060\",7.5208,?,\"S\",?,?,?\n3,1,\"Karun, Miss. Manca\",\"female\",4,0,1,\"349256\",13.4167,?,\"C\",\"15\",?,?\n3,1,\"Karun, Mr. Franz\",\"male\",39,0,1,\"349256\",13.4167,?,\"C\",\"15\",?,?\n3,0,\"Kassem, Mr. Fared\",\"male\",?,0,0,\"2700\",7.2292,?,\"C\",?,?,?\n3,0,\"Katavelas, Mr. Vassilios ('Catavelas Vassilios')\",\"male\",18.5,0,0,\"2682\",7.2292,?,\"C\",?,58,?\n3,0,\"Keane, Mr. Andrew 'Andy'\",\"male\",?,0,0,\"12460\",7.75,?,\"Q\",?,?,?\n3,0,\"Keefe, Mr. Arthur\",\"male\",?,0,0,\"323592\",7.25,?,\"S\",\"A\",?,?\n3,1,\"Kelly, Miss. Anna Katherine 'Annie Kate'\",\"female\",?,0,0,\"9234\",7.75,?,\"Q\",\"16\",?,?\n3,1,\"Kelly, Miss. Mary\",\"female\",?,0,0,\"14312\",7.75,?,\"Q\",\"D\",?,?\n3,0,\"Kelly, Mr. James\",\"male\",34.5,0,0,\"330911\",7.8292,?,\"Q\",?,70,?\n3,0,\"Kelly, Mr. James\",\"male\",44,0,0,\"363592\",8.05,?,\"S\",?,?,?\n3,1,\"Kennedy, Mr. John\",\"male\",?,0,0,\"368783\",7.75,?,\"Q\",?,?,?\n3,0,\"Khalil, Mr. Betros\",\"male\",?,1,0,\"2660\",14.4542,?,\"C\",?,?,?\n3,0,\"Khalil, Mrs. Betros (Zahie 'Maria' Elias)\",\"female\",?,1,0,\"2660\",14.4542,?,\"C\",?,?,?\n3,0,\"Kiernan, Mr. John\",\"male\",?,1,0,\"367227\",7.75,?,\"Q\",?,?,?\n3,0,\"Kiernan, Mr. Philip\",\"male\",?,1,0,\"367229\",7.75,?,\"Q\",?,?,?\n3,0,\"Kilgannon, Mr. Thomas J\",\"male\",?,0,0,\"36865\",7.7375,?,\"Q\",?,?,?\n3,0,\"Kink, Miss. Maria\",\"female\",22,2,0,\"315152\",8.6625,?,\"S\",?,?,?\n3,0,\"Kink, Mr. Vincenz\",\"male\",26,2,0,\"315151\",8.6625,?,\"S\",?,?,?\n3,1,\"Kink-Heilmann, Miss. Luise Gretchen\",\"female\",4,0,2,\"315153\",22.025,?,\"S\",\"2\",?,?\n3,1,\"Kink-Heilmann, Mr. Anton\",\"male\",29,3,1,\"315153\",22.025,?,\"S\",\"2\",?,?\n3,1,\"Kink-Heilmann, Mrs. Anton (Luise Heilmann)\",\"female\",26,1,1,\"315153\",22.025,?,\"S\",\"2\",?,?\n3,0,\"Klasen, Miss. Gertrud Emilia\",\"female\",1,1,1,\"350405\",12.1833,?,\"S\",?,?,?\n3,0,\"Klasen, Mr. Klas Albin\",\"male\",18,1,1,\"350404\",7.8542,?,\"S\",?,?,?\n3,0,\"Klasen, Mrs. (Hulda Kristina Eugenia Lofqvist)\",\"female\",36,0,2,\"350405\",12.1833,?,\"S\",?,?,?\n3,0,\"Kraeff, Mr. Theodor\",\"male\",?,0,0,\"349253\",7.8958,?,\"C\",?,?,?\n3,1,\"Krekorian, Mr. Neshan\",\"male\",25,0,0,\"2654\",7.2292,\"F E57\",\"C\",\"10\",?,?\n3,0,\"Lahoud, Mr. Sarkis\",\"male\",?,0,0,\"2624\",7.225,?,\"C\",?,?,?\n3,0,\"Laitinen, Miss. Kristina Sofia\",\"female\",37,0,0,\"4135\",9.5875,?,\"S\",?,?,?\n3,0,\"Laleff, Mr. Kristo\",\"male\",?,0,0,\"349217\",7.8958,?,\"S\",?,?,?\n3,1,\"Lam, Mr. Ali\",\"male\",?,0,0,\"1601\",56.4958,?,\"S\",\"C\",?,?\n3,0,\"Lam, Mr. Len\",\"male\",?,0,0,\"1601\",56.4958,?,\"S\",?,?,?\n3,1,\"Landergren, Miss. Aurora Adelia\",\"female\",22,0,0,\"C 7077\",7.25,?,\"S\",\"13\",?,?\n3,0,\"Lane, Mr. Patrick\",\"male\",?,0,0,\"7935\",7.75,?,\"Q\",?,?,?\n3,1,\"Lang, Mr. Fang\",\"male\",26,0,0,\"1601\",56.4958,?,\"S\",\"14\",?,?\n3,0,\"Larsson, Mr. August Viktor\",\"male\",29,0,0,\"7545\",9.4833,?,\"S\",?,?,?\n3,0,\"Larsson, Mr. Bengt Edvin\",\"male\",29,0,0,\"347067\",7.775,?,\"S\",?,?,?\n3,0,\"Larsson-Rondberg, Mr. Edvard A\",\"male\",22,0,0,\"347065\",7.775,?,\"S\",?,?,?\n3,1,\"Leeni, Mr. Fahim ('Philip Zenni')\",\"male\",22,0,0,\"2620\",7.225,?,\"C\",\"6\",?,?\n3,0,\"Lefebre, Master. Henry Forbes\",\"male\",?,3,1,\"4133\",25.4667,?,\"S\",?,?,?\n3,0,\"Lefebre, Miss. Ida\",\"female\",?,3,1,\"4133\",25.4667,?,\"S\",?,?,?\n3,0,\"Lefebre, Miss. Jeannie\",\"female\",?,3,1,\"4133\",25.4667,?,\"S\",?,?,?\n3,0,\"Lefebre, Miss. Mathilde\",\"female\",?,3,1,\"4133\",25.4667,?,\"S\",?,?,?\n3,0,\"Lefebre, Mrs. Frank (Frances)\",\"female\",?,0,4,\"4133\",25.4667,?,\"S\",?,?,?\n3,0,\"Leinonen, Mr. Antti Gustaf\",\"male\",32,0,0,\"STON/O 2. 3101292\",7.925,?,\"S\",?,?,?\n3,0,\"Lemberopolous, Mr. Peter L\",\"male\",34.5,0,0,\"2683\",6.4375,?,\"C\",?,196,?\n3,0,\"Lennon, Miss. Mary\",\"female\",?,1,0,\"370371\",15.5,?,\"Q\",?,?,?\n3,0,\"Lennon, Mr. Denis\",\"male\",?,1,0,\"370371\",15.5,?,\"Q\",?,?,?\n3,0,\"Leonard, Mr. Lionel\",\"male\",36,0,0,\"LINE\",0,?,\"S\",?,?,?\n3,0,\"Lester, Mr. James\",\"male\",39,0,0,\"A/4 48871\",24.15,?,\"S\",?,?,?\n3,0,\"Lievens, Mr. Rene Aime\",\"male\",24,0,0,\"345781\",9.5,?,\"S\",?,?,?\n3,0,\"Lindahl, Miss. Agda Thorilda Viktoria\",\"female\",25,0,0,\"347071\",7.775,?,\"S\",?,?,?\n3,0,\"Lindblom, Miss. Augusta Charlotta\",\"female\",45,0,0,\"347073\",7.75,?,\"S\",?,?,?\n3,0,\"Lindell, Mr. Edvard Bengtsson\",\"male\",36,1,0,\"349910\",15.55,?,\"S\",\"A\",?,?\n3,0,\"Lindell, Mrs. Edvard Bengtsson (Elin Gerda Persson)\",\"female\",30,1,0,\"349910\",15.55,?,\"S\",\"A\",?,?\n3,1,\"Lindqvist, Mr. Eino William\",\"male\",20,1,0,\"STON/O 2. 3101285\",7.925,?,\"S\",\"15\",?,?\n3,0,\"Linehan, Mr. Michael\",\"male\",?,0,0,\"330971\",7.8792,?,\"Q\",?,?,?\n3,0,\"Ling, Mr. Lee\",\"male\",28,0,0,\"1601\",56.4958,?,\"S\",?,?,?\n3,0,\"Lithman, Mr. Simon\",\"male\",?,0,0,\"S.O./P.P. 251\",7.55,?,\"S\",?,?,?\n3,0,\"Lobb, Mr. William Arthur\",\"male\",30,1,0,\"A/5. 3336\",16.1,?,\"S\",?,?,?\n3,0,\"Lobb, Mrs. William Arthur (Cordelia K Stanlick)\",\"female\",26,1,0,\"A/5. 3336\",16.1,?,\"S\",?,?,?\n3,0,\"Lockyer, Mr. Edward\",\"male\",?,0,0,\"1222\",7.8792,?,\"S\",?,153,?\n3,0,\"Lovell, Mr. John Hall ('Henry')\",\"male\",20.5,0,0,\"A/5 21173\",7.25,?,\"S\",?,?,?\n3,1,\"Lulic, Mr. Nikola\",\"male\",27,0,0,\"315098\",8.6625,?,\"S\",\"15\",?,?\n3,0,\"Lundahl, Mr. Johan Svensson\",\"male\",51,0,0,\"347743\",7.0542,?,\"S\",?,?,?\n3,1,\"Lundin, Miss. Olga Elida\",\"female\",23,0,0,\"347469\",7.8542,?,\"S\",\"10\",?,?\n3,1,\"Lundstrom, Mr. Thure Edvin\",\"male\",32,0,0,\"350403\",7.5792,?,\"S\",\"15\",?,?\n3,0,\"Lyntakoff, Mr. Stanko\",\"male\",?,0,0,\"349235\",7.8958,?,\"S\",?,?,?\n3,0,\"MacKay, Mr. George William\",\"male\",?,0,0,\"C.A. 42795\",7.55,?,\"S\",?,?,?\n3,1,\"Madigan, Miss. Margaret 'Maggie'\",\"female\",?,0,0,\"370370\",7.75,?,\"Q\",\"15\",?,?\n3,1,\"Madsen, Mr. Fridtjof Arne\",\"male\",24,0,0,\"C 17369\",7.1417,?,\"S\",\"13\",?,?\n3,0,\"Maenpaa, Mr. Matti Alexanteri\",\"male\",22,0,0,\"STON/O 2. 3101275\",7.125,?,\"S\",?,?,?\n3,0,\"Mahon, Miss. Bridget Delia\",\"female\",?,0,0,\"330924\",7.8792,?,\"Q\",?,?,?\n3,0,\"Mahon, Mr. John\",\"male\",?,0,0,\"AQ/4 3130\",7.75,?,\"Q\",?,?,?\n3,0,\"Maisner, Mr. Simon\",\"male\",?,0,0,\"A/S 2816\",8.05,?,\"S\",?,?,?\n3,0,\"Makinen, Mr. Kalle Edvard\",\"male\",29,0,0,\"STON/O 2. 3101268\",7.925,?,\"S\",?,?,?\n3,1,\"Mamee, Mr. Hanna\",\"male\",?,0,0,\"2677\",7.2292,?,\"C\",\"15\",?,?\n3,0,\"Mangan, Miss. Mary\",\"female\",30.5,0,0,\"364850\",7.75,?,\"Q\",?,61,?\n3,1,\"Mannion, Miss. Margareth\",\"female\",?,0,0,\"36866\",7.7375,?,\"Q\",\"16\",?,?\n3,0,\"Mardirosian, Mr. Sarkis\",\"male\",?,0,0,\"2655\",7.2292,\"F E46\",\"C\",?,?,?\n3,0,\"Markoff, Mr. Marin\",\"male\",35,0,0,\"349213\",7.8958,?,\"C\",?,?,?\n3,0,\"Markun, Mr. Johann\",\"male\",33,0,0,\"349257\",7.8958,?,\"S\",?,?,?\n3,1,\"Masselmani, Mrs. Fatima\",\"female\",?,0,0,\"2649\",7.225,?,\"C\",\"C\",?,?\n3,0,\"Matinoff, Mr. Nicola\",\"male\",?,0,0,\"349255\",7.8958,?,\"C\",?,?,?\n3,1,\"McCarthy, Miss. Catherine 'Katie'\",\"female\",?,0,0,\"383123\",7.75,?,\"Q\",\"15 16\",?,?\n3,1,\"McCormack, Mr. Thomas Joseph\",\"male\",?,0,0,\"367228\",7.75,?,\"Q\",?,?,?\n3,1,\"McCoy, Miss. Agnes\",\"female\",?,2,0,\"367226\",23.25,?,\"Q\",\"16\",?,?\n3,1,\"McCoy, Miss. Alicia\",\"female\",?,2,0,\"367226\",23.25,?,\"Q\",\"16\",?,?\n3,1,\"McCoy, Mr. Bernard\",\"male\",?,2,0,\"367226\",23.25,?,\"Q\",\"16\",?,?\n3,1,\"McDermott, Miss. Brigdet Delia\",\"female\",?,0,0,\"330932\",7.7875,?,\"Q\",\"13\",?,?\n3,0,\"McEvoy, Mr. Michael\",\"male\",?,0,0,\"36568\",15.5,?,\"Q\",?,?,?\n3,1,\"McGovern, Miss. Mary\",\"female\",?,0,0,\"330931\",7.8792,?,\"Q\",\"13\",?,?\n3,1,\"McGowan, Miss. Anna 'Annie'\",\"female\",15,0,0,\"330923\",8.0292,?,\"Q\",?,?,?\n3,0,\"McGowan, Miss. Katherine\",\"female\",35,0,0,\"9232\",7.75,?,\"Q\",?,?,?\n3,0,\"McMahon, Mr. Martin\",\"male\",?,0,0,\"370372\",7.75,?,\"Q\",?,?,?\n3,0,\"McNamee, Mr. Neal\",\"male\",24,1,0,\"376566\",16.1,?,\"S\",?,?,?\n3,0,\"McNamee, Mrs. Neal (Eileen O'Leary)\",\"female\",19,1,0,\"376566\",16.1,?,\"S\",?,53,?\n3,0,\"McNeill, Miss. Bridget\",\"female\",?,0,0,\"370368\",7.75,?,\"Q\",?,?,?\n3,0,\"Meanwell, Miss. (Marion Ogden)\",\"female\",?,0,0,\"SOTON/O.Q. 392087\",8.05,?,\"S\",?,?,?\n3,0,\"Meek, Mrs. Thomas (Annie Louise Rowley)\",\"female\",?,0,0,\"343095\",8.05,?,\"S\",?,?,?\n3,0,\"Meo, Mr. Alfonzo\",\"male\",55.5,0,0,\"A.5. 11206\",8.05,?,\"S\",?,201,?\n3,0,\"Mernagh, Mr. Robert\",\"male\",?,0,0,\"368703\",7.75,?,\"Q\",?,?,?\n3,1,\"Midtsjo, Mr. Karl Albert\",\"male\",21,0,0,\"345501\",7.775,?,\"S\",\"15\",?,?\n3,0,\"Miles, Mr. Frank\",\"male\",?,0,0,\"359306\",8.05,?,\"S\",?,?,?\n3,0,\"Mineff, Mr. Ivan\",\"male\",24,0,0,\"349233\",7.8958,?,\"S\",?,?,?\n3,0,\"Minkoff, Mr. Lazar\",\"male\",21,0,0,\"349211\",7.8958,?,\"S\",?,?,?\n3,0,\"Mionoff, Mr. Stoytcho\",\"male\",28,0,0,\"349207\",7.8958,?,\"S\",?,?,?\n3,0,\"Mitkoff, Mr. Mito\",\"male\",?,0,0,\"349221\",7.8958,?,\"S\",?,?,?\n3,1,\"Mockler, Miss. Helen Mary 'Ellie'\",\"female\",?,0,0,\"330980\",7.8792,?,\"Q\",\"16\",?,?\n3,0,\"Moen, Mr. Sigurd Hansen\",\"male\",25,0,0,\"348123\",7.65,\"F G73\",\"S\",?,309,?\n3,1,\"Moor, Master. Meier\",\"male\",6,0,1,\"392096\",12.475,\"E121\",\"S\",\"14\",?,?\n3,1,\"Moor, Mrs. (Beila)\",\"female\",27,0,1,\"392096\",12.475,\"E121\",\"S\",\"14\",?,?\n3,0,\"Moore, Mr. Leonard Charles\",\"male\",?,0,0,\"A4. 54510\",8.05,?,\"S\",?,?,?\n3,1,\"Moran, Miss. Bertha\",\"female\",?,1,0,\"371110\",24.15,?,\"Q\",\"16\",?,?\n3,0,\"Moran, Mr. Daniel J\",\"male\",?,1,0,\"371110\",24.15,?,\"Q\",?,?,?\n3,0,\"Moran, Mr. James\",\"male\",?,0,0,\"330877\",8.4583,?,\"Q\",?,?,?\n3,0,\"Morley, Mr. William\",\"male\",34,0,0,\"364506\",8.05,?,\"S\",?,?,?\n3,0,\"Morrow, Mr. Thomas Rowan\",\"male\",?,0,0,\"372622\",7.75,?,\"Q\",?,?,?\n3,1,\"Moss, Mr. Albert Johan\",\"male\",?,0,0,\"312991\",7.775,?,\"S\",\"B\",?,?\n3,1,\"Moubarek, Master. Gerios\",\"male\",?,1,1,\"2661\",15.2458,?,\"C\",\"C\",?,?\n3,1,\"Moubarek, Master. Halim Gonios ('William George')\",\"male\",?,1,1,\"2661\",15.2458,?,\"C\",\"C\",?,?\n3,1,\"Moubarek, Mrs. George (Omine 'Amenia' Alexander)\",\"female\",?,0,2,\"2661\",15.2458,?,\"C\",\"C\",?,?\n3,1,\"Moussa, Mrs. (Mantoura Boulos)\",\"female\",?,0,0,\"2626\",7.2292,?,\"C\",?,?,?\n3,0,\"Moutal, Mr. Rahamin Haim\",\"male\",?,0,0,\"374746\",8.05,?,\"S\",?,?,?\n3,1,\"Mullens, Miss. Katherine 'Katie'\",\"female\",?,0,0,\"35852\",7.7333,?,\"Q\",\"16\",?,?\n3,1,\"Mulvihill, Miss. Bertha E\",\"female\",24,0,0,\"382653\",7.75,?,\"Q\",\"15\",?,?\n3,0,\"Murdlin, Mr. Joseph\",\"male\",?,0,0,\"A./5. 3235\",8.05,?,\"S\",?,?,?\n3,1,\"Murphy, Miss. Katherine 'Kate'\",\"female\",?,1,0,\"367230\",15.5,?,\"Q\",\"16\",?,?\n3,1,\"Murphy, Miss. Margaret Jane\",\"female\",?,1,0,\"367230\",15.5,?,\"Q\",\"16\",?,?\n3,1,\"Murphy, Miss. Nora\",\"female\",?,0,0,\"36568\",15.5,?,\"Q\",\"16\",?,?\n3,0,\"Myhrman, Mr. Pehr Fabian Oliver Malkolm\",\"male\",18,0,0,\"347078\",7.75,?,\"S\",?,?,?\n3,0,\"Naidenoff, Mr. Penko\",\"male\",22,0,0,\"349206\",7.8958,?,\"S\",?,?,?\n3,1,\"Najib, Miss. Adele Kiamie 'Jane'\",\"female\",15,0,0,\"2667\",7.225,?,\"C\",\"C\",?,?\n3,1,\"Nakid, Miss. Maria ('Mary')\",\"female\",1,0,2,\"2653\",15.7417,?,\"C\",\"C\",?,?\n3,1,\"Nakid, Mr. Sahid\",\"male\",20,1,1,\"2653\",15.7417,?,\"C\",\"C\",?,?\n3,1,\"Nakid, Mrs. Said (Waika 'Mary' Mowad)\",\"female\",19,1,1,\"2653\",15.7417,?,\"C\",\"C\",?,?\n3,0,\"Nancarrow, Mr. William Henry\",\"male\",33,0,0,\"A./5. 3338\",8.05,?,\"S\",?,?,?\n3,0,\"Nankoff, Mr. Minko\",\"male\",?,0,0,\"349218\",7.8958,?,\"S\",?,?,?\n3,0,\"Nasr, Mr. Mustafa\",\"male\",?,0,0,\"2652\",7.2292,?,\"C\",?,?,?\n3,0,\"Naughton, Miss. Hannah\",\"female\",?,0,0,\"365237\",7.75,?,\"Q\",?,?,?\n3,0,\"Nenkoff, Mr. Christo\",\"male\",?,0,0,\"349234\",7.8958,?,\"S\",?,?,?\n3,1,\"Nicola-Yarred, Master. Elias\",\"male\",12,1,0,\"2651\",11.2417,?,\"C\",\"C\",?,?\n3,1,\"Nicola-Yarred, Miss. Jamila\",\"female\",14,1,0,\"2651\",11.2417,?,\"C\",\"C\",?,?\n3,0,\"Nieminen, Miss. Manta Josefina\",\"female\",29,0,0,\"3101297\",7.925,?,\"S\",?,?,?\n3,0,\"Niklasson, Mr. Samuel\",\"male\",28,0,0,\"363611\",8.05,?,\"S\",?,?,?\n3,1,\"Nilsson, Miss. Berta Olivia\",\"female\",18,0,0,\"347066\",7.775,?,\"S\",\"D\",?,?\n3,1,\"Nilsson, Miss. Helmina Josefina\",\"female\",26,0,0,\"347470\",7.8542,?,\"S\",\"13\",?,?\n3,0,\"Nilsson, Mr. August Ferdinand\",\"male\",21,0,0,\"350410\",7.8542,?,\"S\",?,?,?\n3,0,\"Nirva, Mr. Iisakki Antino Aijo\",\"male\",41,0,0,\"SOTON/O2 3101272\",7.125,?,\"S\",?,?,\"Finland Sudbury, ON\"\n3,1,\"Niskanen, Mr. Juha\",\"male\",39,0,0,\"STON/O 2. 3101289\",7.925,?,\"S\",\"9\",?,?\n3,0,\"Nosworthy, Mr. Richard Cater\",\"male\",21,0,0,\"A/4. 39886\",7.8,?,\"S\",?,?,?\n3,0,\"Novel, Mr. Mansouer\",\"male\",28.5,0,0,\"2697\",7.2292,?,\"C\",?,181,?\n3,1,\"Nysten, Miss. Anna Sofia\",\"female\",22,0,0,\"347081\",7.75,?,\"S\",\"13\",?,?\n3,0,\"Nysveen, Mr. Johan Hansen\",\"male\",61,0,0,\"345364\",6.2375,?,\"S\",?,?,?\n3,0,\"O'Brien, Mr. Thomas\",\"male\",?,1,0,\"370365\",15.5,?,\"Q\",?,?,?\n3,0,\"O'Brien, Mr. Timothy\",\"male\",?,0,0,\"330979\",7.8292,?,\"Q\",?,?,?\n3,1,\"O'Brien, Mrs. Thomas (Johanna 'Hannah' Godfrey)\",\"female\",?,1,0,\"370365\",15.5,?,\"Q\",?,?,?\n3,0,\"O'Connell, Mr. Patrick D\",\"male\",?,0,0,\"334912\",7.7333,?,\"Q\",?,?,?\n3,0,\"O'Connor, Mr. Maurice\",\"male\",?,0,0,\"371060\",7.75,?,\"Q\",?,?,?\n3,0,\"O'Connor, Mr. Patrick\",\"male\",?,0,0,\"366713\",7.75,?,\"Q\",?,?,?\n3,0,\"Odahl, Mr. Nils Martin\",\"male\",23,0,0,\"7267\",9.225,?,\"S\",?,?,?\n3,0,\"O'Donoghue, Ms. Bridget\",\"female\",?,0,0,\"364856\",7.75,?,\"Q\",?,?,?\n3,1,\"O'Driscoll, Miss. Bridget\",\"female\",?,0,0,\"14311\",7.75,?,\"Q\",\"D\",?,?\n3,1,\"O'Dwyer, Miss. Ellen 'Nellie'\",\"female\",?,0,0,\"330959\",7.8792,?,\"Q\",?,?,?\n3,1,\"Ohman, Miss. Velin\",\"female\",22,0,0,\"347085\",7.775,?,\"S\",\"C\",?,?\n3,1,\"O'Keefe, Mr. Patrick\",\"male\",?,0,0,\"368402\",7.75,?,\"Q\",\"B\",?,?\n3,1,\"O'Leary, Miss. Hanora 'Norah'\",\"female\",?,0,0,\"330919\",7.8292,?,\"Q\",\"13\",?,?\n3,1,\"Olsen, Master. Artur Karl\",\"male\",9,0,1,\"C 17368\",3.1708,?,\"S\",\"13\",?,?\n3,0,\"Olsen, Mr. Henry Margido\",\"male\",28,0,0,\"C 4001\",22.525,?,\"S\",?,173,?\n3,0,\"Olsen, Mr. Karl Siegwart Andreas\",\"male\",42,0,1,\"4579\",8.4042,?,\"S\",?,?,?\n3,0,\"Olsen, Mr. Ole Martin\",\"male\",?,0,0,\"Fa 265302\",7.3125,?,\"S\",?,?,?\n3,0,\"Olsson, Miss. Elina\",\"female\",31,0,0,\"350407\",7.8542,?,\"S\",?,?,?\n3,0,\"Olsson, Mr. Nils Johan Goransson\",\"male\",28,0,0,\"347464\",7.8542,?,\"S\",?,?,?\n3,1,\"Olsson, Mr. Oscar Wilhelm\",\"male\",32,0,0,\"347079\",7.775,?,\"S\",\"A\",?,?\n3,0,\"Olsvigen, Mr. Thor Anderson\",\"male\",20,0,0,\"6563\",9.225,?,\"S\",?,89,\"Oslo, Norway Cameron, WI\"\n3,0,\"Oreskovic, Miss. Jelka\",\"female\",23,0,0,\"315085\",8.6625,?,\"S\",?,?,?\n3,0,\"Oreskovic, Miss. Marija\",\"female\",20,0,0,\"315096\",8.6625,?,\"S\",?,?,?\n3,0,\"Oreskovic, Mr. Luka\",\"male\",20,0,0,\"315094\",8.6625,?,\"S\",?,?,?\n3,0,\"Osen, Mr. Olaf Elon\",\"male\",16,0,0,\"7534\",9.2167,?,\"S\",?,?,?\n3,1,\"Osman, Mrs. Mara\",\"female\",31,0,0,\"349244\",8.6833,?,\"S\",?,?,?\n3,0,\"O'Sullivan, Miss. Bridget Mary\",\"female\",?,0,0,\"330909\",7.6292,?,\"Q\",?,?,?\n3,0,\"Palsson, Master. Gosta Leonard\",\"male\",2,3,1,\"349909\",21.075,?,\"S\",?,4,?\n3,0,\"Palsson, Master. Paul Folke\",\"male\",6,3,1,\"349909\",21.075,?,\"S\",?,?,?\n3,0,\"Palsson, Miss. Stina Viola\",\"female\",3,3,1,\"349909\",21.075,?,\"S\",?,?,?\n3,0,\"Palsson, Miss. Torborg Danira\",\"female\",8,3,1,\"349909\",21.075,?,\"S\",?,?,?\n3,0,\"Palsson, Mrs. Nils (Alma Cornelia Berglund)\",\"female\",29,0,4,\"349909\",21.075,?,\"S\",?,206,?\n3,0,\"Panula, Master. Eino Viljami\",\"male\",1,4,1,\"3101295\",39.6875,?,\"S\",?,?,?\n3,0,\"Panula, Master. Juha Niilo\",\"male\",7,4,1,\"3101295\",39.6875,?,\"S\",?,?,?\n3,0,\"Panula, Master. Urho Abraham\",\"male\",2,4,1,\"3101295\",39.6875,?,\"S\",?,?,?\n3,0,\"Panula, Mr. Ernesti Arvid\",\"male\",16,4,1,\"3101295\",39.6875,?,\"S\",?,?,?\n3,0,\"Panula, Mr. Jaako Arnold\",\"male\",14,4,1,\"3101295\",39.6875,?,\"S\",?,?,?\n3,0,\"Panula, Mrs. Juha (Maria Emilia Ojala)\",\"female\",41,0,5,\"3101295\",39.6875,?,\"S\",?,?,?\n3,0,\"Pasic, Mr. Jakob\",\"male\",21,0,0,\"315097\",8.6625,?,\"S\",?,?,?\n3,0,\"Patchett, Mr. George\",\"male\",19,0,0,\"358585\",14.5,?,\"S\",?,?,?\n3,0,\"Paulner, Mr. Uscher\",\"male\",?,0,0,\"3411\",8.7125,?,\"C\",?,?,?\n3,0,\"Pavlovic, Mr. Stefo\",\"male\",32,0,0,\"349242\",7.8958,?,\"S\",?,?,?\n3,0,\"Peacock, Master. Alfred Edward\",\"male\",0.75,1,1,\"SOTON/O.Q. 3101315\",13.775,?,\"S\",?,?,?\n3,0,\"Peacock, Miss. Treasteall\",\"female\",3,1,1,\"SOTON/O.Q. 3101315\",13.775,?,\"S\",?,?,?\n3,0,\"Peacock, Mrs. Benjamin (Edith Nile)\",\"female\",26,0,2,\"SOTON/O.Q. 3101315\",13.775,?,\"S\",?,?,?\n3,0,\"Pearce, Mr. Ernest\",\"male\",?,0,0,\"343271\",7,?,\"S\",?,?,?\n3,0,\"Pedersen, Mr. Olaf\",\"male\",?,0,0,\"345498\",7.775,?,\"S\",?,?,?\n3,0,\"Peduzzi, Mr. Joseph\",\"male\",?,0,0,\"A/5 2817\",8.05,?,\"S\",?,?,?\n3,0,\"Pekoniemi, Mr. Edvard\",\"male\",21,0,0,\"STON/O 2. 3101294\",7.925,?,\"S\",?,?,?\n3,0,\"Peltomaki, Mr. Nikolai Johannes\",\"male\",25,0,0,\"STON/O 2. 3101291\",7.925,?,\"S\",?,?,?\n3,0,\"Perkin, Mr. John Henry\",\"male\",22,0,0,\"A/5 21174\",7.25,?,\"S\",?,?,?\n3,1,\"Persson, Mr. Ernst Ulrik\",\"male\",25,1,0,\"347083\",7.775,?,\"S\",\"15\",?,?\n3,1,\"Peter, Master. Michael J\",\"male\",?,1,1,\"2668\",22.3583,?,\"C\",\"C\",?,?\n3,1,\"Peter, Miss. Anna\",\"female\",?,1,1,\"2668\",22.3583,\"F E69\",\"C\",\"D\",?,?\n3,1,\"Peter, Mrs. Catherine (Catherine Rizk)\",\"female\",?,0,2,\"2668\",22.3583,?,\"C\",\"D\",?,?\n3,0,\"Peters, Miss. Katie\",\"female\",?,0,0,\"330935\",8.1375,?,\"Q\",?,?,?\n3,0,\"Petersen, Mr. Marius\",\"male\",24,0,0,\"342441\",8.05,?,\"S\",?,?,?\n3,0,\"Petranec, Miss. Matilda\",\"female\",28,0,0,\"349245\",7.8958,?,\"S\",?,?,?\n3,0,\"Petroff, Mr. Nedelio\",\"male\",19,0,0,\"349212\",7.8958,?,\"S\",?,?,?\n3,0,\"Petroff, Mr. Pastcho ('Pentcho')\",\"male\",?,0,0,\"349215\",7.8958,?,\"S\",?,?,?\n3,0,\"Petterson, Mr. Johan Emil\",\"male\",25,1,0,\"347076\",7.775,?,\"S\",?,?,?\n3,0,\"Pettersson, Miss. Ellen Natalia\",\"female\",18,0,0,\"347087\",7.775,?,\"S\",?,?,?\n3,1,\"Pickard, Mr. Berk (Berk Trembisky)\",\"male\",32,0,0,\"SOTON/O.Q. 392078\",8.05,\"E10\",\"S\",\"9\",?,?\n3,0,\"Plotcharsky, Mr. Vasil\",\"male\",?,0,0,\"349227\",7.8958,?,\"S\",?,?,?\n3,0,\"Pokrnic, Mr. Mate\",\"male\",17,0,0,\"315095\",8.6625,?,\"S\",?,?,?\n3,0,\"Pokrnic, Mr. Tome\",\"male\",24,0,0,\"315092\",8.6625,?,\"S\",?,?,?\n3,0,\"Radeff, Mr. Alexander\",\"male\",?,0,0,\"349223\",7.8958,?,\"S\",?,?,?\n3,0,\"Rasmussen, Mrs. (Lena Jacobsen Solvang)\",\"female\",?,0,0,\"65305\",8.1125,?,\"S\",?,?,?\n3,0,\"Razi, Mr. Raihed\",\"male\",?,0,0,\"2629\",7.2292,?,\"C\",?,?,?\n3,0,\"Reed, Mr. James George\",\"male\",?,0,0,\"362316\",7.25,?,\"S\",?,?,?\n3,0,\"Rekic, Mr. Tido\",\"male\",38,0,0,\"349249\",7.8958,?,\"S\",?,?,?\n3,0,\"Reynolds, Mr. Harold J\",\"male\",21,0,0,\"342684\",8.05,?,\"S\",?,?,?\n3,0,\"Rice, Master. Albert\",\"male\",10,4,1,\"382652\",29.125,?,\"Q\",?,?,?\n3,0,\"Rice, Master. Arthur\",\"male\",4,4,1,\"382652\",29.125,?,\"Q\",?,?,?\n3,0,\"Rice, Master. Eric\",\"male\",7,4,1,\"382652\",29.125,?,\"Q\",?,?,?\n3,0,\"Rice, Master. Eugene\",\"male\",2,4,1,\"382652\",29.125,?,\"Q\",?,?,?\n3,0,\"Rice, Master. George Hugh\",\"male\",8,4,1,\"382652\",29.125,?,\"Q\",?,?,?\n3,0,\"Rice, Mrs. William (Margaret Norton)\",\"female\",39,0,5,\"382652\",29.125,?,\"Q\",?,327,?\n3,0,\"Riihivouri, Miss. Susanna Juhantytar 'Sanni'\",\"female\",22,0,0,\"3101295\",39.6875,?,\"S\",?,?,?\n3,0,\"Rintamaki, Mr. Matti\",\"male\",35,0,0,\"STON/O 2. 3101273\",7.125,?,\"S\",?,?,?\n3,1,\"Riordan, Miss. Johanna 'Hannah'\",\"female\",?,0,0,\"334915\",7.7208,?,\"Q\",\"13\",?,?\n3,0,\"Risien, Mr. Samuel Beard\",\"male\",?,0,0,\"364498\",14.5,?,\"S\",?,?,?\n3,0,\"Risien, Mrs. Samuel (Emma)\",\"female\",?,0,0,\"364498\",14.5,?,\"S\",?,?,?\n3,0,\"Robins, Mr. Alexander A\",\"male\",50,1,0,\"A/5. 3337\",14.5,?,\"S\",?,119,?\n3,0,\"Robins, Mrs. Alexander A (Grace Charity Laury)\",\"female\",47,1,0,\"A/5. 3337\",14.5,?,\"S\",?,7,?\n3,0,\"Rogers, Mr. William John\",\"male\",?,0,0,\"S.C./A.4. 23567\",8.05,?,\"S\",?,?,?\n3,0,\"Rommetvedt, Mr. Knud Paust\",\"male\",?,0,0,\"312993\",7.775,?,\"S\",?,?,?\n3,0,\"Rosblom, Miss. Salli Helena\",\"female\",2,1,1,\"370129\",20.2125,?,\"S\",?,?,?\n3,0,\"Rosblom, Mr. Viktor Richard\",\"male\",18,1,1,\"370129\",20.2125,?,\"S\",?,?,?\n3,0,\"Rosblom, Mrs. Viktor (Helena Wilhelmina)\",\"female\",41,0,2,\"370129\",20.2125,?,\"S\",?,?,?\n3,1,\"Roth, Miss. Sarah A\",\"female\",?,0,0,\"342712\",8.05,?,\"S\",\"C\",?,?\n3,0,\"Rouse, Mr. Richard Henry\",\"male\",50,0,0,\"A/5 3594\",8.05,?,\"S\",?,?,?\n3,0,\"Rush, Mr. Alfred George John\",\"male\",16,0,0,\"A/4. 20589\",8.05,?,\"S\",?,?,?\n3,1,\"Ryan, Mr. Edward\",\"male\",?,0,0,\"383162\",7.75,?,\"Q\",\"14\",?,?\n3,0,\"Ryan, Mr. Patrick\",\"male\",?,0,0,\"371110\",24.15,?,\"Q\",?,?,?\n3,0,\"Saad, Mr. Amin\",\"male\",?,0,0,\"2671\",7.2292,?,\"C\",?,?,?\n3,0,\"Saad, Mr. Khalil\",\"male\",25,0,0,\"2672\",7.225,?,\"C\",?,?,?\n3,0,\"Saade, Mr. Jean Nassr\",\"male\",?,0,0,\"2676\",7.225,?,\"C\",?,?,?\n3,0,\"Sadlier, Mr. Matthew\",\"male\",?,0,0,\"367655\",7.7292,?,\"Q\",?,?,?\n3,0,\"Sadowitz, Mr. Harry\",\"male\",?,0,0,\"LP 1588\",7.575,?,\"S\",?,?,?\n3,0,\"Saether, Mr. Simon Sivertsen\",\"male\",38.5,0,0,\"SOTON/O.Q. 3101262\",7.25,?,\"S\",?,32,?\n3,0,\"Sage, Master. Thomas Henry\",\"male\",?,8,2,\"CA. 2343\",69.55,?,\"S\",?,?,?\n3,0,\"Sage, Master. William Henry\",\"male\",14.5,8,2,\"CA. 2343\",69.55,?,\"S\",?,67,?\n3,0,\"Sage, Miss. Ada\",\"female\",?,8,2,\"CA. 2343\",69.55,?,\"S\",?,?,?\n3,0,\"Sage, Miss. Constance Gladys\",\"female\",?,8,2,\"CA. 2343\",69.55,?,\"S\",?,?,?\n3,0,\"Sage, Miss. Dorothy Edith 'Dolly'\",\"female\",?,8,2,\"CA. 2343\",69.55,?,\"S\",?,?,?\n3,0,\"Sage, Miss. Stella Anna\",\"female\",?,8,2,\"CA. 2343\",69.55,?,\"S\",?,?,?\n3,0,\"Sage, Mr. Douglas Bullen\",\"male\",?,8,2,\"CA. 2343\",69.55,?,\"S\",?,?,?\n3,0,\"Sage, Mr. Frederick\",\"male\",?,8,2,\"CA. 2343\",69.55,?,\"S\",?,?,?\n3,0,\"Sage, Mr. George John Jr\",\"male\",?,8,2,\"CA. 2343\",69.55,?,\"S\",?,?,?\n3,0,\"Sage, Mr. John George\",\"male\",?,1,9,\"CA. 2343\",69.55,?,\"S\",?,?,?\n3,0,\"Sage, Mrs. John (Annie Bullen)\",\"female\",?,1,9,\"CA. 2343\",69.55,?,\"S\",?,?,?\n3,0,\"Salander, Mr. Karl Johan\",\"male\",24,0,0,\"7266\",9.325,?,\"S\",?,?,?\n3,1,\"Salkjelsvik, Miss. Anna Kristine\",\"female\",21,0,0,\"343120\",7.65,?,\"S\",\"C\",?,?\n3,0,\"Salonen, Mr. Johan Werner\",\"male\",39,0,0,\"3101296\",7.925,?,\"S\",?,?,?\n3,0,\"Samaan, Mr. Elias\",\"male\",?,2,0,\"2662\",21.6792,?,\"C\",?,?,?\n3,0,\"Samaan, Mr. Hanna\",\"male\",?,2,0,\"2662\",21.6792,?,\"C\",?,?,?\n3,0,\"Samaan, Mr. Youssef\",\"male\",?,2,0,\"2662\",21.6792,?,\"C\",?,?,?\n3,1,\"Sandstrom, Miss. Beatrice Irene\",\"female\",1,1,1,\"PP 9549\",16.7,\"G6\",\"S\",\"13\",?,?\n3,1,\"Sandstrom, Mrs. Hjalmar (Agnes Charlotta Bengtsson)\",\"female\",24,0,2,\"PP 9549\",16.7,\"G6\",\"S\",\"13\",?,?\n3,1,\"Sandstrom, Miss. Marguerite Rut\",\"female\",4,1,1,\"PP 9549\",16.7,\"G6\",\"S\",\"13\",?,?\n3,1,\"Sap, Mr. Julius\",\"male\",25,0,0,\"345768\",9.5,?,\"S\",\"11\",?,?\n3,0,\"Saundercock, Mr. William Henry\",\"male\",20,0,0,\"A/5. 2151\",8.05,?,\"S\",?,?,?\n3,0,\"Sawyer, Mr. Frederick Charles\",\"male\",24.5,0,0,\"342826\",8.05,?,\"S\",?,284,?\n3,0,\"Scanlan, Mr. James\",\"male\",?,0,0,\"36209\",7.725,?,\"Q\",?,?,?\n3,0,\"Sdycoff, Mr. Todor\",\"male\",?,0,0,\"349222\",7.8958,?,\"S\",?,?,?\n3,0,\"Shaughnessy, Mr. Patrick\",\"male\",?,0,0,\"370374\",7.75,?,\"Q\",?,?,?\n3,1,\"Sheerlinck, Mr. Jan Baptist\",\"male\",29,0,0,\"345779\",9.5,?,\"S\",\"11\",?,?\n3,0,\"Shellard, Mr. Frederick William\",\"male\",?,0,0,\"C.A. 6212\",15.1,?,\"S\",?,?,?\n3,1,\"Shine, Miss. Ellen Natalia\",\"female\",?,0,0,\"330968\",7.7792,?,\"Q\",?,?,?\n3,0,\"Shorney, Mr. Charles Joseph\",\"male\",?,0,0,\"374910\",8.05,?,\"S\",?,?,?\n3,0,\"Simmons, Mr. John\",\"male\",?,0,0,\"SOTON/OQ 392082\",8.05,?,\"S\",?,?,?\n3,0,\"Sirayanian, Mr. Orsen\",\"male\",22,0,0,\"2669\",7.2292,?,\"C\",?,?,?\n3,0,\"Sirota, Mr. Maurice\",\"male\",?,0,0,\"392092\",8.05,?,\"S\",?,?,?\n3,0,\"Sivic, Mr. Husein\",\"male\",40,0,0,\"349251\",7.8958,?,\"S\",?,?,?\n3,0,\"Sivola, Mr. Antti Wilhelm\",\"male\",21,0,0,\"STON/O 2. 3101280\",7.925,?,\"S\",?,?,?\n3,1,\"Sjoblom, Miss. Anna Sofia\",\"female\",18,0,0,\"3101265\",7.4958,?,\"S\",\"16\",?,?\n3,0,\"Skoog, Master. Harald\",\"male\",4,3,2,\"347088\",27.9,?,\"S\",?,?,?\n3,0,\"Skoog, Master. Karl Thorsten\",\"male\",10,3,2,\"347088\",27.9,?,\"S\",?,?,?\n3,0,\"Skoog, Miss. Mabel\",\"female\",9,3,2,\"347088\",27.9,?,\"S\",?,?,?\n3,0,\"Skoog, Miss. Margit Elizabeth\",\"female\",2,3,2,\"347088\",27.9,?,\"S\",?,?,?\n3,0,\"Skoog, Mr. Wilhelm\",\"male\",40,1,4,\"347088\",27.9,?,\"S\",?,?,?\n3,0,\"Skoog, Mrs. William (Anna Bernhardina Karlsson)\",\"female\",45,1,4,\"347088\",27.9,?,\"S\",?,?,?\n3,0,\"Slabenoff, Mr. Petco\",\"male\",?,0,0,\"349214\",7.8958,?,\"S\",?,?,?\n3,0,\"Slocovski, Mr. Selman Francis\",\"male\",?,0,0,\"SOTON/OQ 392086\",8.05,?,\"S\",?,?,?\n3,0,\"Smiljanic, Mr. Mile\",\"male\",?,0,0,\"315037\",8.6625,?,\"S\",?,?,?\n3,0,\"Smith, Mr. Thomas\",\"male\",?,0,0,\"384461\",7.75,?,\"Q\",?,?,?\n3,1,\"Smyth, Miss. Julia\",\"female\",?,0,0,\"335432\",7.7333,?,\"Q\",\"13\",?,?\n3,0,\"Soholt, Mr. Peter Andreas Lauritz Andersen\",\"male\",19,0,0,\"348124\",7.65,\"F G73\",\"S\",?,?,?\n3,0,\"Somerton, Mr. Francis William\",\"male\",30,0,0,\"A.5. 18509\",8.05,?,\"S\",?,?,?\n3,0,\"Spector, Mr. Woolf\",\"male\",?,0,0,\"A.5. 3236\",8.05,?,\"S\",?,?,?\n3,0,\"Spinner, Mr. Henry John\",\"male\",32,0,0,\"STON/OQ. 369943\",8.05,?,\"S\",?,?,?\n3,0,\"Staneff, Mr. Ivan\",\"male\",?,0,0,\"349208\",7.8958,?,\"S\",?,?,?\n3,0,\"Stankovic, Mr. Ivan\",\"male\",33,0,0,\"349239\",8.6625,?,\"C\",?,?,?\n3,1,\"Stanley, Miss. Amy Zillah Elsie\",\"female\",23,0,0,\"CA. 2314\",7.55,?,\"S\",\"C\",?,?\n3,0,\"Stanley, Mr. Edward Roland\",\"male\",21,0,0,\"A/4 45380\",8.05,?,\"S\",?,?,?\n3,0,\"Storey, Mr. Thomas\",\"male\",60.5,0,0,\"3701\",?,?,\"S\",?,261,?\n3,0,\"Stoytcheff, Mr. Ilia\",\"male\",19,0,0,\"349205\",7.8958,?,\"S\",?,?,?\n3,0,\"Strandberg, Miss. Ida Sofia\",\"female\",22,0,0,\"7553\",9.8375,?,\"S\",?,?,?\n3,1,\"Stranden, Mr. Juho\",\"male\",31,0,0,\"STON/O 2. 3101288\",7.925,?,\"S\",\"9\",?,?\n3,0,\"Strilic, Mr. Ivan\",\"male\",27,0,0,\"315083\",8.6625,?,\"S\",?,?,?\n3,0,\"Strom, Miss. Telma Matilda\",\"female\",2,0,1,\"347054\",10.4625,\"G6\",\"S\",?,?,?\n3,0,\"Strom, Mrs. Wilhelm (Elna Matilda Persson)\",\"female\",29,1,1,\"347054\",10.4625,\"G6\",\"S\",?,?,?\n3,1,\"Sunderland, Mr. Victor Francis\",\"male\",16,0,0,\"SOTON/OQ 392089\",8.05,?,\"S\",\"B\",?,?\n3,1,\"Sundman, Mr. Johan Julian\",\"male\",44,0,0,\"STON/O 2. 3101269\",7.925,?,\"S\",\"15\",?,?\n3,0,\"Sutehall, Mr. Henry Jr\",\"male\",25,0,0,\"SOTON/OQ 392076\",7.05,?,\"S\",?,?,?\n3,0,\"Svensson, Mr. Johan\",\"male\",74,0,0,\"347060\",7.775,?,\"S\",?,?,?\n3,1,\"Svensson, Mr. Johan Cervin\",\"male\",14,0,0,\"7538\",9.225,?,\"S\",\"13\",?,?\n3,0,\"Svensson, Mr. Olof\",\"male\",24,0,0,\"350035\",7.7958,?,\"S\",?,?,?\n3,1,\"Tenglin, Mr. Gunnar Isidor\",\"male\",25,0,0,\"350033\",7.7958,?,\"S\",\"13 15\",?,?\n3,0,\"Theobald, Mr. Thomas Leonard\",\"male\",34,0,0,\"363294\",8.05,?,\"S\",?,176,?\n3,1,\"Thomas, Master. Assad Alexander\",\"male\",0.4167,0,1,\"2625\",8.5167,?,\"C\",\"16\",?,?\n3,0,\"Thomas, Mr. Charles P\",\"male\",?,1,0,\"2621\",6.4375,?,\"C\",?,?,?\n3,0,\"Thomas, Mr. John\",\"male\",?,0,0,\"2681\",6.4375,?,\"C\",?,?,?\n3,0,\"Thomas, Mr. Tannous\",\"male\",?,0,0,\"2684\",7.225,?,\"C\",?,?,?\n3,1,\"Thomas, Mrs. Alexander (Thamine 'Thelma')\",\"female\",16,1,1,\"2625\",8.5167,?,\"C\",\"14\",?,?\n3,0,\"Thomson, Mr. Alexander Morrison\",\"male\",?,0,0,\"32302\",8.05,?,\"S\",?,?,?\n3,0,\"Thorneycroft, Mr. Percival\",\"male\",?,1,0,\"376564\",16.1,?,\"S\",?,?,?\n3,1,\"Thorneycroft, Mrs. Percival (Florence Kate White)\",\"female\",?,1,0,\"376564\",16.1,?,\"S\",\"10\",?,?\n3,0,\"Tikkanen, Mr. Juho\",\"male\",32,0,0,\"STON/O 2. 3101293\",7.925,?,\"S\",?,?,?\n3,0,\"Tobin, Mr. Roger\",\"male\",?,0,0,\"383121\",7.75,\"F38\",\"Q\",?,?,?\n3,0,\"Todoroff, Mr. Lalio\",\"male\",?,0,0,\"349216\",7.8958,?,\"S\",?,?,?\n3,0,\"Tomlin, Mr. Ernest Portage\",\"male\",30.5,0,0,\"364499\",8.05,?,\"S\",?,50,?\n3,0,\"Torber, Mr. Ernst William\",\"male\",44,0,0,\"364511\",8.05,?,\"S\",?,?,?\n3,0,\"Torfa, Mr. Assad\",\"male\",?,0,0,\"2673\",7.2292,?,\"C\",?,?,?\n3,1,\"Tornquist, Mr. William Henry\",\"male\",25,0,0,\"LINE\",0,?,\"S\",\"15\",?,?\n3,0,\"Toufik, Mr. Nakli\",\"male\",?,0,0,\"2641\",7.2292,?,\"C\",?,?,?\n3,1,\"Touma, Master. Georges Youssef\",\"male\",7,1,1,\"2650\",15.2458,?,\"C\",\"C\",?,?\n3,1,\"Touma, Miss. Maria Youssef\",\"female\",9,1,1,\"2650\",15.2458,?,\"C\",\"C\",?,?\n3,1,\"Touma, Mrs. Darwis (Hanne Youssef Razi)\",\"female\",29,0,2,\"2650\",15.2458,?,\"C\",\"C\",?,?\n3,0,\"Turcin, Mr. Stjepan\",\"male\",36,0,0,\"349247\",7.8958,?,\"S\",?,?,?\n3,1,\"Turja, Miss. Anna Sofia\",\"female\",18,0,0,\"4138\",9.8417,?,\"S\",\"15\",?,?\n3,1,\"Turkula, Mrs. (Hedwig)\",\"female\",63,0,0,\"4134\",9.5875,?,\"S\",\"15\",?,?\n3,0,\"van Billiard, Master. James William\",\"male\",?,1,1,\"A/5. 851\",14.5,?,\"S\",?,?,?\n3,0,\"van Billiard, Master. Walter John\",\"male\",11.5,1,1,\"A/5. 851\",14.5,?,\"S\",?,1,?\n3,0,\"van Billiard, Mr. Austin Blyler\",\"male\",40.5,0,2,\"A/5. 851\",14.5,?,\"S\",?,255,?\n3,0,\"Van Impe, Miss. Catharina\",\"female\",10,0,2,\"345773\",24.15,?,\"S\",?,?,?\n3,0,\"Van Impe, Mr. Jean Baptiste\",\"male\",36,1,1,\"345773\",24.15,?,\"S\",?,?,?\n3,0,\"Van Impe, Mrs. Jean Baptiste (Rosalie Paula Govaert)\",\"female\",30,1,1,\"345773\",24.15,?,\"S\",?,?,?\n3,0,\"van Melkebeke, Mr. Philemon\",\"male\",?,0,0,\"345777\",9.5,?,\"S\",?,?,?\n3,0,\"Vande Velde, Mr. Johannes Joseph\",\"male\",33,0,0,\"345780\",9.5,?,\"S\",?,?,?\n3,0,\"Vande Walle, Mr. Nestor Cyriel\",\"male\",28,0,0,\"345770\",9.5,?,\"S\",?,?,?\n3,0,\"Vanden Steen, Mr. Leo Peter\",\"male\",28,0,0,\"345783\",9.5,?,\"S\",?,?,?\n3,0,\"Vander Cruyssen, Mr. Victor\",\"male\",47,0,0,\"345765\",9,?,\"S\",?,?,?\n3,0,\"Vander Planke, Miss. Augusta Maria\",\"female\",18,2,0,\"345764\",18,?,\"S\",?,?,?\n3,0,\"Vander Planke, Mr. Julius\",\"male\",31,3,0,\"345763\",18,?,\"S\",?,?,?\n3,0,\"Vander Planke, Mr. Leo Edmondus\",\"male\",16,2,0,\"345764\",18,?,\"S\",?,?,?\n3,0,\"Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele)\",\"female\",31,1,0,\"345763\",18,?,\"S\",?,?,?\n3,1,\"Vartanian, Mr. David\",\"male\",22,0,0,\"2658\",7.225,?,\"C\",\"13 15\",?,?\n3,0,\"Vendel, Mr. Olof Edvin\",\"male\",20,0,0,\"350416\",7.8542,?,\"S\",?,?,?\n3,0,\"Vestrom, Miss. Hulda Amanda Adolfina\",\"female\",14,0,0,\"350406\",7.8542,?,\"S\",?,?,?\n3,0,\"Vovk, Mr. Janko\",\"male\",22,0,0,\"349252\",7.8958,?,\"S\",?,?,?\n3,0,\"Waelens, Mr. Achille\",\"male\",22,0,0,\"345767\",9,?,\"S\",?,?,\"Antwerp, Belgium / Stanton, OH\"\n3,0,\"Ware, Mr. Frederick\",\"male\",?,0,0,\"359309\",8.05,?,\"S\",?,?,?\n3,0,\"Warren, Mr. Charles William\",\"male\",?,0,0,\"C.A. 49867\",7.55,?,\"S\",?,?,?\n3,0,\"Webber, Mr. James\",\"male\",?,0,0,\"SOTON/OQ 3101316\",8.05,?,\"S\",?,?,?\n3,0,\"Wenzel, Mr. Linhart\",\"male\",32.5,0,0,\"345775\",9.5,?,\"S\",?,298,?\n3,1,\"Whabee, Mrs. George Joseph (Shawneene Abi-Saab)\",\"female\",38,0,0,\"2688\",7.2292,?,\"C\",\"C\",?,?\n3,0,\"Widegren, Mr. Carl/Charles Peter\",\"male\",51,0,0,\"347064\",7.75,?,\"S\",?,?,?\n3,0,\"Wiklund, Mr. Jakob Alfred\",\"male\",18,1,0,\"3101267\",6.4958,?,\"S\",?,314,?\n3,0,\"Wiklund, Mr. Karl Johan\",\"male\",21,1,0,\"3101266\",6.4958,?,\"S\",?,?,?\n3,1,\"Wilkes, Mrs. James (Ellen Needs)\",\"female\",47,1,0,\"363272\",7,?,\"S\",?,?,?\n3,0,\"Willer, Mr. Aaron ('Abi Weller')\",\"male\",?,0,0,\"3410\",8.7125,?,\"S\",?,?,?\n3,0,\"Willey, Mr. Edward\",\"male\",?,0,0,\"S.O./P.P. 751\",7.55,?,\"S\",?,?,?\n3,0,\"Williams, Mr. Howard Hugh 'Harry'\",\"male\",?,0,0,\"A/5 2466\",8.05,?,\"S\",?,?,?\n3,0,\"Williams, Mr. Leslie\",\"male\",28.5,0,0,\"54636\",16.1,?,\"S\",?,14,?\n3,0,\"Windelov, Mr. Einar\",\"male\",21,0,0,\"SOTON/OQ 3101317\",7.25,?,\"S\",?,?,?\n3,0,\"Wirz, Mr. Albert\",\"male\",27,0,0,\"315154\",8.6625,?,\"S\",?,131,?\n3,0,\"Wiseman, Mr. Phillippe\",\"male\",?,0,0,\"A/4. 34244\",7.25,?,\"S\",?,?,?\n3,0,\"Wittevrongel, Mr. Camille\",\"male\",36,0,0,\"345771\",9.5,?,\"S\",?,?,?\n3,0,\"Yasbeck, Mr. Antoni\",\"male\",27,1,0,\"2659\",14.4542,?,\"C\",\"C\",?,?\n3,1,\"Yasbeck, Mrs. Antoni (Selini Alexander)\",\"female\",15,1,0,\"2659\",14.4542,?,\"C\",?,?,?\n3,0,\"Youseff, Mr. Gerious\",\"male\",45.5,0,0,\"2628\",7.225,?,\"C\",?,312,?\n3,0,\"Yousif, Mr. Wazli\",\"male\",?,0,0,\"2647\",7.225,?,\"C\",?,?,?\n3,0,\"Yousseff, Mr. Gerious\",\"male\",?,0,0,\"2627\",14.4583,?,\"C\",?,?,?\n3,0,\"Zabour, Miss. Hileni\",\"female\",14.5,1,0,\"2665\",14.4542,?,\"C\",?,328,?\n3,0,\"Zabour, Miss. Thamine\",\"female\",?,1,0,\"2665\",14.4542,?,\"C\",?,?,?\n3,0,\"Zakarian, Mr. Mapriededer\",\"male\",26.5,0,0,\"2656\",7.225,?,\"C\",?,304,?\n3,0,\"Zakarian, Mr. Ortin\",\"male\",27,0,0,\"2670\",7.225,?,\"C\",?,?,?\n3,0,\"Zimmerman, Mr. Leo\",\"male\",29,0,0,\"315082\",7.875,?,\"S\",?,?,?\n"
  },
  {
    "path": "examples/lesson09/fig09_01-02/Account.h",
    "content": "// Fig. 9.2: Account.h\r\n// Account class with a data member and\r\n// member functions to set and get its value.\r\n#include <string> \r\n#include <string_view> \r\n\r\nclass Account {\r\npublic:\r\n   // member function that sets m_name in the object\r\n   void setName(std::string_view name) {\r\n      m_name = name; // replace m_name's value with name\r\n   }\r\n\r\n   // member function that retrieves the account name from the object\r\n   const std::string& getName() const {\r\n      return m_name; // return m_name's value to this function's caller \r\n   }\r\nprivate:\r\n   std::string m_name; // data member containing account holder's name\r\n}; // end class Account\r\n\r\n\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_01-02/AccountTest.cpp",
    "content": "// Fig. 9.1: AccountTest.cpp\r\n// Creating and manipulating an Account object.\r\n#include <format>\r\n#include <iostream>\r\n#include <string>\r\n#include \"Account.h\"\r\n\r\nint main() {\r\n   Account myAccount{}; // create Account object myAccount\r\n\r\n   // show that the initial value of myAccount's name is the empty string\r\n   std::cout << std::format(\"Initial account name: {}\\n\",\r\n      myAccount.getName());\r\n\r\n   // prompt for and read the name\r\n   std::cout << \"Enter the account name: \";\r\n   std::string name{};\r\n   std::getline(std::cin, name); // read a line of text       \r\n   myAccount.setName(name); // put name in the myAccount object\r\n\r\n   // display the name stored in object myAccount\r\n   std::cout << std::format(\"Updated account name: {}\\n\",\r\n      myAccount.getName());\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_03-04/Account.h",
    "content": "// Fig. 9.3: Account.h\r\n// Account class with a constructor that initializes the account name.\r\n#include <string>\r\n#include <string_view>\r\n\r\nclass Account {\r\npublic:\r\n   // constructor initializes data member m_name with the parameter name\r\n   explicit Account(std::string_view name)\r\n      : m_name{name} { // member initializer  \r\n     // empty body                                 \r\n   }\r\n\r\n   // function to set the account name\r\n   void setName(std::string_view name) {\r\n      m_name = name;\r\n   }\r\n\r\n   // function to retrieve the account name\r\n   const std::string& getName() const {\r\n      return m_name;\r\n   }\r\nprivate:\r\n   std::string m_name; // account name \r\n}; // end class Account\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_03-04/AccountTest.cpp",
    "content": "// Fig. 9.4: AccountTest.cpp\r\n// Using the Account constructor to initialize the m_name \r\n// data member when each Account object is created.\r\n#include <format>\r\n#include <iostream>\r\n#include \"Account.h\"\r\n\r\nint main() {\r\n   // create two Account objects\r\n   Account account1{\"Mia Gonzalez\"};\r\n   Account account2{\"Asahi Susuki\"};\r\n\r\n   // display each Account's corresponding name\r\n   std::cout << std::format(\r\n      \"account1 name is: {}\\naccount2 name is: {}\\n\",\r\n      account1.getName(), account2.getName());\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_05-06/Account.h",
    "content": "// Fig. 9.5: Account.h\r\n// Account class with m_name and m_balance data members, and a \r\n// constructor and deposit function that each perform validation.\r\n#include <algorithm>\r\n#include <string>\r\n#include <string_view>\r\n\r\nclass Account {\r\npublic:\r\n   // Account constructor with two parameters  \r\n   Account(std::string_view name, double balance)\r\n      : m_name{name}, m_balance{std::max(0.0, balance)} { // member init\r\n      // empty body\r\n   }\r\n\r\n   // function that deposits (adds) only a valid amount to the balance\r\n   void deposit(double amount) {\r\n      if (amount > 0.0) { // if the amount is valid\r\n         m_balance += amount; // add it to m_balance      \r\n      }\r\n   }\r\n\r\n   // function that returns the account balance\r\n   double getBalance() const {\r\n      return m_balance;\r\n   }\r\n\r\n   // function that sets the account name\r\n   void setName(std::string_view name) {\r\n      m_name = name; // replace m_name's value with name\r\n   }\r\n\r\n   // function that returns the account name\r\n   const std::string& getName() const {\r\n      return m_name;\r\n   }\r\nprivate:\r\n   std::string m_name; \r\n   double m_balance; \r\n}; // end class Account\r\n\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_05-06/AccountTest.cpp",
    "content": "// Fig. 9.6: AccountTest.cpp\r\n// Displaying and updating Account balances.\r\n#include <format>\r\n#include <iostream>\r\n#include \"Account.h\"\r\n\r\nint main() {\r\n   Account account1{\"Mia Gonzalez\", 50.00};\r\n   Account account2{\"Asahi Susuki\", -7.00};\r\n\r\n   // display initial balance of each object\r\n   std::cout << std::format(\"account1: {} balance is ${:.2f}\\n\",\r\n      account1.getName(), account1.getBalance());\r\n   std::cout << std::format(\"account2: {} balance is ${:.2f}\\n\\n\",\r\n      account2.getName(), account2.getBalance());\r\n\r\n   std::cout << \"Enter deposit amount for account1: \"; // prompt\r\n   double amount;\r\n   std::cin >> amount; // obtain user input\r\n   std::cout << std::format(\r\n      \"adding ${:.2f} to account1 balance\\n\\n\", amount);\r\n   account1.deposit(amount); // add to account1's balance\r\n\r\n   // display balances\r\n   std::cout << std::format(\"account1: {} balance is ${:.2f}\\n\",\r\n      account1.getName(), account1.getBalance());\r\n   std::cout << std::format(\"account2: {} balance is ${:.2f}\\n\\n\",\r\n      account2.getName(), account2.getBalance());\r\n\r\n   std::cout << \"Enter deposit amount for account2: \"; // prompt\r\n   std::cin >> amount; // obtain user input\r\n   std::cout << std::format(\r\n      \"adding ${:.2f} to account2 balance\\n\\n\", amount);\r\n   account2.deposit(amount); // add to account2 balance\r\n\r\n   // display balances\r\n   std::cout << std::format(\"account1: {} balance is ${:.2f}\\n\",\r\n      account1.getName(), account1.getBalance());\r\n   std::cout << std::format(\"account2: {} balance is ${:.2f}\\n\",\r\n      account2.getName(), account2.getBalance());\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_07-09/Time.cpp",
    "content": "// Fig. 9.8: Time.cpp\r\n// Time class member-function definitions. \r\n#include <format>\r\n#include <stdexcept> // for invalid_argument exception class     \r\n#include <string>\r\n#include \"Time.h\" // include definition of class Time from Time.h \r\n\r\n// set new Time value using 24-hour time\r\nvoid Time::setTime(int hour, int minute, int second) {\r\n   // validate hour, minute and second\r\n   if ((hour < 0 || hour >= 24) || (minute < 0 || minute >= 60) ||\r\n      (second < 0 || second >= 60)) {\r\n      throw std::invalid_argument{\r\n         \"hour, minute or second was out of range\"};\r\n   }\r\n\r\n   m_hour = hour;\r\n   m_minute = minute;\r\n   m_second = second;\r\n}\r\n\r\n// return Time as a string in 24-hour format (HH:MM:SS)\r\nstd::string Time::to24HourString() const {\r\n   return std::format(\"{:02d}:{:02d}:{:02d}\", m_hour, m_minute, m_second);\r\n}\r\n\r\n// return Time as string in 12-hour format (HH:MM:SS AM or PM)\r\nstd::string Time::to12HourString() const {\r\n   return std::format(\"{}:{:02d}:{:02d} {}\",\r\n      ((m_hour % 12 == 0) ? 12 : m_hour % 12), m_minute, m_second,\r\n      (m_hour < 12 ? \"AM\" : \"PM\"));\r\n}\r\n\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_07-09/Time.h",
    "content": "// Fig. 9.7: Time.h\r\n// Time class definition.                   \r\n// Member functions are defined in Time.cpp \r\n#pragma once // prevent multiple inclusions of header\r\n#include <string>\r\n\r\n// Time class definition\r\nclass Time {\r\npublic:\r\n   void setTime(int hour, int minute, int second);\r\n   std::string to24HourString() const; // 24-hour string format\r\n   std::string to12HourString() const; // 12-hour string format\r\nprivate:\r\n   int m_hour{0}; // 0 - 23 (24-hour clock format)\r\n   int m_minute{0}; // 0 - 59\r\n   int m_second{0}; // 0 - 59\r\n};\r\n   \r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_07-09/fig09_09.cpp",
    "content": "// fig09_09.cpp\r\n// Program to test class Time.                     \r\n// NOTE: This file must be linked with Time.cpp. \r\n#include <format>\r\n#include <iostream>\r\n#include <stdexcept> // invalid_argument exception class\r\n#include <string_view> \r\n#include \"Time.h\" // definition of class Time from Time.h \r\n\r\n// displays a Time in 24-hour and 12-hour formats\r\nvoid displayTime(std::string_view message, const Time& time) {\r\n   std::cout << std::format(\"{}\\n24-hour time: {}\\n12-hour time: {}\\n\\n\",\r\n      message, time.to24HourString(), time.to12HourString());\r\n}\r\n\r\nint main() {\r\n   Time t{}; // instantiate object t of class Time\r\n\r\n   displayTime(\"Initial time:\", t); // display t's initial value\r\n   t.setTime(13, 27, 6); // change time\r\n   displayTime(\"After setTime:\", t); // display t's new value\r\n\r\n   // attempt to set the time with invalid values\r\n   try {\r\n      t.setTime(99, 99, 99); // all values out of range\r\n   }\r\n   catch (const std::invalid_argument& e) {\r\n      std::cout << std::format(\"Exception: {}\\n\\n\", e.what());\r\n   }\r\n\r\n   // display t's value after attempting to set an invalid time\r\n   displayTime(\"After attempting to set an invalid time:\", t);\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_10-12/Time.cpp",
    "content": "// Fig. 9.11: Time.cpp\r\n// Member-function definitions for class Time.\r\n#include <format>\r\n#include <stdexcept>\r\n#include <string>\r\n#include \"Time.h\" // include definition of class Time from Time.h\r\n\r\n// Time constructor initializes each data member    \r\nTime::Time(int hour, int minute, int second) {             \r\n   setTime(hour, minute, second);\r\n}\r\n\r\n// set new Time value using 24-hour time\r\nvoid Time::setTime(int hour, int minute, int second) {\r\n   // validate hour, minute and second\r\n   if (hour < 0 || hour >= 24) {\r\n      throw std::invalid_argument{\"hour was out of range\"};\r\n   } \r\n\r\n   if (minute < 0 || minute >= 60) { \r\n      throw std::invalid_argument{\"minute was out of range\"};\r\n   } \r\n\r\n   if (second < 0 || second >= 60) {\r\n      throw std::invalid_argument{\"second was out of range\"};\r\n   } \r\n\r\n   m_hour = hour;\r\n   m_minute = minute;\r\n   m_second = second;\r\n} \r\n\r\n// set hour value\r\nvoid Time::setHour(int hour) {setTime(hour, m_minute, m_second);}\r\n\r\n// set minute value\r\nvoid Time::setMinute(int minute) {setTime(m_hour, minute, m_second);}\r\n\r\n// set second value\r\nvoid Time::setSecond(int second) {setTime(m_hour, m_minute, second);}\r\n\r\n// return hour value\r\nint Time::getHour() const {return m_hour;}\r\n\r\n// return minute value\r\nint Time::getMinute() const {return m_minute;}\r\n\r\n// return second value\r\nint Time::getSecond() const {return m_second;}\r\n\r\n// return Time as a string in 24-hour format (HH:MM:SS)\r\nstd::string Time::to24HourString() const {\r\n   return std::format(\"{:02d}:{:02d}:{:02d}\", \r\n      getHour(), getMinute(), getSecond());\r\n} \r\n\r\n// return Time as a string in 12-hour format (HH:MM:SS AM or PM)\r\nstd::string Time::to12HourString() const {\r\n   return std::format(\"{}:{:02d}:{:02d} {}\", \r\n      ((getHour() % 12 == 0) ? 12 : getHour() % 12), \r\n      getMinute(), getSecond(), (getHour() < 12 ? \"AM\" : \"PM\"));\r\n} \r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_10-12/Time.h",
    "content": "// Fig. 9.10: Time.h\r\n// Time class containing a constructor with default arguments.\r\n// Member functions defined in Time.cpp.\r\n#pragma once // prevent multiple inclusions of header\r\n#include <string>\r\n\r\n// Time class definition\r\nclass Time {\r\npublic:\r\n   // default constructor because it can be called with no arguments\r\n   explicit Time(int hour = 0, int minute = 0, int second = 0);\r\n\r\n   // set functions\r\n   void setTime(int hour, int minute, int second);\r\n   void setHour(int hour); // set hour (after validation)\r\n   void setMinute(int minute); // set minute (after validation)\r\n   void setSecond(int second); // set second (after validation)\r\n\r\n   // get functions\r\n   int getHour() const; // return hour\r\n   int getMinute() const; // return minute\r\n   int getSecond() const; // return second\r\n\r\n   std::string to24HourString() const; // 24-hour time format string\r\n   std::string to12HourString() const; // 12-hour time format string\r\nprivate:\r\n   int m_hour{0}; // 0 - 23 (24-hour clock format)\r\n   int m_minute{0}; // 0 - 59\r\n   int m_second{0}; // 0 - 59\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_10-12/fig09_12.cpp",
    "content": "// fig09_12.cpp \r\n// Constructor with default arguments.\r\n#include <format>\r\n#include <iostream>\r\n#include <stdexcept>\r\n#include <string>\r\n#include \"Time.h\" // include definition of class Time from Time.h\r\n\r\n// displays a Time in 24-hour and 12-hour formats\r\nvoid displayTime(std::string_view message, const Time& time) {\r\n   std::cout << std::format(\"{}\\n24-hour time: {}\\n12-hour time: {}\\n\\n\",\r\n      message, time.to24HourString(), time.to12HourString());\r\n}\r\n\r\nint main() {\r\n   const Time t1{}; // all arguments defaulted                            \r\n   const Time t2{2}; // hour specified; minute & second defaulted     \r\n   const Time t3{21, 34}; // hour & minute specified; second defaulted\r\n   const Time t4{12, 25, 42}; // hour, minute & second specified      \r\n\r\n   std::cout << \"Constructed with:\\n\\n\";\r\n   displayTime(\"t1: all arguments defaulted\", t1);\r\n   displayTime(\"t2: hour specified; minute and second defaulted\", t2);\r\n   displayTime(\"t3: hour and minute specified; second defaulted\", t3);\r\n   displayTime(\"t4: hour, minute and second specified\", t4);\r\n\r\n   // attempt to initialize t5 with invalid values\r\n   try {\r\n      const Time t5{27, 74, 99}; // all bad values specified\r\n   }\r\n   catch (const std::invalid_argument& e) {\r\n      std::cerr << std::format(\"t5 not created: {}\\n\", e.what());\r\n   }\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_13-15/CreateAndDestroy.cpp",
    "content": "// Fig. 9.14: CreateAndDestroy.cpp\r\n// CreateAndDestroy class member-function definitions.\r\n#include <format>\r\n#include <iostream>\r\n#include \"CreateAndDestroy.h\"// include CreateAndDestroy class definition\r\n\r\n// constructor sets object's ID number and descriptive message\r\nCreateAndDestroy::CreateAndDestroy(int ID, std::string_view message)\r\n   : m_ID{ID}, m_message{message} {\r\n   std::cout << std::format(\"Object {}   constructor runs   {}\\n\",\r\n      m_ID, m_message);\r\n}\r\n\r\n// destructor                                               \r\nCreateAndDestroy::~CreateAndDestroy() {\r\n   // output newline for certain objects; helps readability \r\n   std::cout << std::format(\"{}Object {}   destructor runs    {}\\n\",\r\n      (m_ID == 1 || m_ID == 6 ? \"\\n\" : \"\"), m_ID, m_message);\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_13-15/CreateAndDestroy.h",
    "content": "// Fig. 9.13: CreateAndDestroy.h\r\n// CreateAndDestroy class definition.\r\n// Member functions defined in CreateAndDestroy.cpp.\r\n#pragma once // prevent multiple inclusions of header\r\n#include <string>\r\n#include <string_view>\r\n\r\nclass CreateAndDestroy {\r\npublic:\r\n   CreateAndDestroy(int ID, std::string_view message); // constructor\r\n   ~CreateAndDestroy(); // destructor                \r\nprivate:\r\n   int m_ID; // ID number for object\r\n   std::string m_message; // message describing object\r\n};\r\n\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_13-15/fig09_15.cpp",
    "content": "// fig09_15.cpp\r\n// Order in which constructors and \r\n// destructors are called.\r\n#include <iostream>\r\n#include \"CreateAndDestroy.h\" // include CreateAndDestroy class definition\r\n\r\nvoid create(); // prototype\r\n\r\nconst CreateAndDestroy first{1, \"(global before main)\"}; // global object \r\n\r\nint main() {\r\n   std::cout << \"\\nMAIN FUNCTION: EXECUTION BEGINS\\n\";\r\n   const CreateAndDestroy second{2, \"(local in main)\"};\r\n   static const CreateAndDestroy third{3, \"(local static in main)\"};\r\n\r\n   create(); // call function to create objects\r\n\r\n   std::cout << \"\\nMAIN FUNCTION: EXECUTION RESUMES\\n\";\r\n   const CreateAndDestroy fourth{4, \"(local in main)\"};\r\n   std::cout << \"\\nMAIN FUNCTION: EXECUTION ENDS\\n\";\r\n}\r\n\r\n// function to create objects\r\nvoid create() {\r\n   std::cout << \"\\nCREATE FUNCTION: EXECUTION BEGINS\\n\";\r\n   const CreateAndDestroy fifth{5, \"(local in create)\"};\r\n   static const CreateAndDestroy sixth{6, \"(local static in create)\"};\r\n   const CreateAndDestroy seventh{7, \"(local in create)\"};\r\n   std::cout << \"\\nCREATE FUNCTION: EXECUTION ENDS\\n\";\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_16-18/Time.cpp",
    "content": "// Fig. 9.17: Time.cpp\r\n// Time class member-function definitions.\r\n#include <stdexcept>\r\n#include \"Time.h\" // include definition of class Time\r\n\r\n// set new Time value using 24-hour time\r\nvoid Time::setTime(int hour, int minute, int second) {\r\n   // validate hour, minute and second\r\n   if (hour < 0 || hour >= 24) {\r\n      throw std::invalid_argument{\"hour was out of range\"};\r\n   }\r\n\r\n   if (minute < 0 || minute >= 60) {\r\n      throw std::invalid_argument{\"minute was out of range\"};\r\n   }\r\n\r\n   if (second < 0 || second >= 60) {\r\n      throw std::invalid_argument{\"second was out of range\"};\r\n   }\r\n\r\n   m_hour = hour;\r\n   m_minute = minute;\r\n   m_second = second;\r\n}\r\n\r\n// return hour value\r\nint Time::getHour() const {return m_hour;}\r\n\r\n// poor practice: returning a reference to a private data member. \r\nint& Time::badSetHour(int hour) {\r\n   setTime(hour, m_minute, m_second);\r\n   return m_hour; // dangerous reference return                    \r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_16-18/Time.h",
    "content": "// Fig. 9.16: Time.h\r\n// Time class definition.\r\n// Member functions defined in Time.cpp\r\n\r\n// prevent multiple inclusions of header\r\n#pragma once \r\n\r\nclass Time {\r\npublic:\r\n   void setTime(int hour, int minute, int second);\r\n   int getHour() const;\r\n   int& badSetHour(int hour); // dangerous reference return\r\nprivate:\r\n   int m_hour{0};\r\n   int m_minute{0};\r\n   int m_second{0};\r\n};\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_16-18/fig09_18.cpp",
    "content": "// fig09_18.cpp\r\n// public member function that\r\n// returns a reference to private data.\r\n#include <iostream>\r\n#include <format>\r\n#include \"Time.h\" // include definition of class Time\r\n\r\nint main() {\r\n   Time t{}; // create Time object\r\n\r\n   // initialize hourRef with the reference returned by badSetHour\r\n   int& hourRef{t.badSetHour(20)}; // 20 is a valid hour \r\n\r\n   std::cout << std::format(\r\n      \"Valid hour before modification: {}\\n\", hourRef);\r\n   hourRef = 30; // use hourRef to set invalid value in Time object t\r\n   std::cout << std::format(\r\n      \"Invalid hour after modification: {}\\n\\n\", t.getHour());\r\n\r\n   // Dangerous: Function call that returns a reference can be \r\n   // used as an lvalue! POOR PROGRAMMING PRACTICE!!!!!!!!\r\n   t.badSetHour(12) = 74; // assign another invalid value to hour\r\n\r\n   std::cout << \"After using t.badSetHour(12) as an lvalue, \"\r\n      << std::format(\"hour is: {}\\n\", t.getHour());\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_19-21/Date.cpp",
    "content": "// Fig. 9.20: Date.cpp\r\n// Date class member-function definitions.\r\n#include <format>\r\n#include <string>\r\n#include \"Date.h\" // include definition of class Date from Date.h\r\n\r\n// Date constructor (should do range checking)\r\nDate::Date(int year, int month, int day)\r\n   : m_year{year}, m_month{month}, m_day{day} {}\r\n\r\n// return string representation of a Date in the format yyyy-mm-dd\r\nstd::string Date::toString() const {\r\n   return std::format(\"{}-{:02d}-{:02d}\", m_year, m_month, m_day);\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_19-21/Date.h",
    "content": "// Fig. 9.19: Date.h\r\n// Date class declaration. Member functions are defined in Date.cpp.\r\n#pragma once // prevent multiple inclusions of header\r\n#include <string>\r\n\r\n// class Date definition\r\nclass Date {\r\npublic:\r\n   Date(int year, int month, int day);\r\n   std::string toString() const;\r\nprivate:\r\n   int m_year;\r\n   int m_month;\r\n   int m_day;\r\n};\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_19-21/fig09_21.cpp",
    "content": "// fig09_21.cpp \r\n// Demonstrating that class objects can be assigned\r\n// to each other using the default assignment operator.\r\n#include <format>\r\n#include <iostream>\r\n#include \"Date.h\" // include definition of class Date from Date.h\r\n\r\nint main() {\r\n   const Date date1{2006, 7, 4};\r\n   Date date2{2022, 1, 1};\r\n\r\n   std::cout << std::format(\"date1: {}\\ndate2: {}\\n\\n\",\r\n      date1.toString(), date2.toString());\r\n   date2 = date1; // uses the default assignment operator\r\n   std::cout << std::format(\"After assignment, date2: {}\\n\",\r\n      date2.toString());\r\n}\r\n\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_22/Time.cpp",
    "content": "// Fig. 9.11: Time.cpp\r\n// Member-function definitions for class Time.\r\n#include <format>\r\n#include <stdexcept>\r\n#include <string>\r\n#include \"Time.h\" // include definition of class Time from Time.h\r\n\r\n// Time constructor initializes each data member    \r\nTime::Time(int hour, int minute, int second) {             \r\n   setTime(hour, minute, second);\r\n}\r\n\r\n// set new Time value using 24-hour time\r\nvoid Time::setTime(int hour, int minute, int second) {\r\n   // validate hour, minute and second\r\n   if (hour < 0 || hour >= 24) {\r\n      throw std::invalid_argument{\"hour was out of range\"};\r\n   } \r\n\r\n   if (minute < 0 || minute >= 60) { \r\n      throw std::invalid_argument{\"minute was out of range\"};\r\n   } \r\n\r\n   if (second < 0 || second >= 60) {\r\n      throw std::invalid_argument{\"second was out of range\"};\r\n   } \r\n\r\n   m_hour = hour;\r\n   m_minute = minute;\r\n   m_second = second;\r\n} \r\n\r\n// set hour value\r\nvoid Time::setHour(int hour) {setTime(hour, m_minute, m_second);}\r\n\r\n// set minute value\r\nvoid Time::setMinute(int minute) {setTime(m_hour, minute, m_second);}\r\n\r\n// set second value\r\nvoid Time::setSecond(int second) {setTime(m_hour, m_minute, second);}\r\n\r\n// return hour value\r\nint Time::getHour() const {return m_hour;}\r\n\r\n// return minute value\r\nint Time::getMinute() const {return m_minute;}\r\n\r\n// return second value\r\nint Time::getSecond() const {return m_second;}\r\n\r\n// return Time as a string in 24-hour format (HH:MM:SS)\r\nstd::string Time::to24HourString() const {\r\n   return std::format(\"{:02d}:{:02d}:{:02d}\", \r\n      getHour(), getMinute(), getSecond());\r\n} \r\n\r\n// return Time as string in 12-hour format (HH:MM:SS AM or PM)\r\nstd::string Time::to12HourString() {\r\n   return std::format(\"{}:{:02d}:{:02d} {}\", \r\n      ((getHour() % 12 == 0) ? 12 : getHour() % 12), \r\n      getMinute(), getSecond(), (getHour() < 12 ? \"AM\" : \"PM\"));\r\n} \r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_22/Time.h",
    "content": "// Fig. 9.10: Time.h\r\n// Time class containing a constructor with default arguments.\r\n// Member functions defined in Time.cpp.\r\n#pragma once // prevent multiple inclusions of header\r\n#include <string>\r\n\r\n// Time class definition\r\nclass Time {\r\npublic:\r\n   // default constructor because it can be called with no arguments\r\n   explicit Time(int hour = 0, int minute = 0, int second = 0);\r\n\r\n   // set functions\r\n   void setTime(int hour, int minute, int second);\r\n   void setHour(int hour); // set hour (after validation)\r\n   void setMinute(int minute); // set minute (after validation)\r\n   void setSecond(int second); // set second (after validation)\r\n\r\n   // get functions\r\n   int getHour() const; // return hour\r\n   int getMinute() const; // return minute\r\n   int getSecond() const; // return second\r\n\r\n   std::string to24HourString() const; // 24-hour time format string\r\n   std::string to12HourString(); // 12-hour time format string\r\nprivate:\r\n   int m_hour{0}; // 0 - 23 (24-hour clock format)\r\n   int m_minute{0}; // 0 - 59\r\n   int m_second{0}; // 0 - 59\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_22/fig09_22.cpp",
    "content": "// fig09_22.cpp\r\n// const objects and const member functions.\r\n#include \"Time.h\" // include Time class definition\r\n\r\nint main() {\r\n   Time wakeUp{6, 45, 0}; // non-constant object\r\n   const Time noon{12, 0, 0}; // constant object\r\n\r\n                             // OBJECT      MEMBER FUNCTION\r\n   wakeUp.setHour(18);       // non-const   non-const\r\n   noon.setHour(12);         // const       non-const\r\n   wakeUp.getHour();         // non-const   const\r\n   noon.getMinute();         // const       const\r\n   noon.to24HourString();    // const       const\r\n   noon.to12HourString();    // const       non-const\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_23-27/Date.cpp",
    "content": "// Fig. 9.24: Date.cpp\r\n// Date class member-function definitions.\r\n#include <array>\r\n#include <format>\r\n#include <iostream>\r\n#include <stdexcept>\r\n#include \"Date.h\" // include Date class definition\r\n\r\n// constructor confirms proper value for month; calls\r\n// utility function checkDay to confirm proper value for day\r\nDate::Date(int year, int month, int day)\r\n   : m_year{year}, m_month{month}, m_day{day} {\r\n   if (m_month < 1 || m_month > monthsPerYear) { // validate the month\r\n      throw std::invalid_argument{\"month must be 1-12\"};\r\n   }\r\n\r\n   if (!checkDay(day)) { // validate the day\r\n      throw std::invalid_argument{\r\n         \"Invalid day for current month and year\"};\r\n   }\r\n\r\n   // output Date object to show when its constructor is called\r\n   std::cout << std::format(\"Date object constructor: {}\\n\", toString());\r\n}\r\n\r\n// gets string representation of a Date in the form yyyy-mm-dd\r\nstd::string Date::toString() const {\r\n   return std::format(\"{}-{:02d}-{:02d}\", m_year, m_month, m_day);\r\n}\r\n\r\n// output Date object to show when its destructor is called\r\nDate::~Date() {\r\n   std::cout << std::format(\"Date object destructor: {}\\n\", toString());\r\n}\r\n\r\n// utility function to confirm proper day value based on \r\n// month and year; handles leap years, too\r\nbool Date::checkDay(int day) const {\r\n   // we ignore element 0\r\n   static const std::array daysPerMonth{\r\n      0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};\r\n\r\n   // determine whether testDay is valid for specified month\r\n   if (1 <= day && day <= daysPerMonth.at(m_month)) {\r\n      return true;\r\n   }\r\n\r\n   // February 29 check for leap year \r\n   if (m_month == 2 && day == 29 && (m_year % 400 == 0 ||\r\n      (m_year % 4 == 0 && m_year % 100 != 0))) {\r\n      return true;\r\n   }\r\n\r\n   return false; // invalid day, based on current m_month and m_year\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_23-27/Date.h",
    "content": "// Fig. 9.23: Date.h \r\n// Date class definition; member functions defined in Date.cpp\r\n#pragma once // prevent multiple inclusions of header\r\n#include <string>\r\n\r\nclass Date {\r\npublic:\r\n   static const int monthsPerYear{12}; // months in a year\r\n   Date(int year, int month, int day);\r\n   std::string toString() const; // date string in yyyy-mm-dd format\r\n   ~Date(); // implementation displays when destruction occurs\r\nprivate:\r\n   int m_year; // any year\r\n   int m_month; // 1-12 (January-December)\r\n   int m_day; // 1-31 based on month\r\n\r\n   // utility function to check if day is proper for month and year\r\n   bool checkDay(int day) const;\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_23-27/Employee.cpp",
    "content": "// Fig. 9.26: Employee.cpp\r\n// Employee class member-function definitions.\r\n#include <format>\r\n#include <iostream>\r\n#include \"Employee.h\" // Employee class definition\r\nusing namespace std;\r\n\r\n// constructor uses member initializer list to pass initializer \r\n// values to constructors of member objects \r\nEmployee::Employee(std::string_view firstName, std::string_view lastName,\r\n   const Date& birthDate, const Date& hireDate)\r\n   : m_firstName{firstName}, m_lastName{lastName},\r\n   m_birthDate{birthDate}, m_hireDate{hireDate} {\r\n   // output Employee object to show when constructor is called\r\n   std::cout << std::format(\"Employee object constructor: {} {}\\n\",\r\n      m_firstName, m_lastName);\r\n}\r\n\r\n// gets string representation of an Employee object\r\nstd::string Employee::toString() const {\r\n   return std::format(\"{}, {}  Hired: {}  Birthday: {}\", m_lastName,\r\n      m_firstName, m_hireDate.toString(), m_birthDate.toString());\r\n}\r\n\r\n// output Employee object to show when its destructor is called\r\nEmployee::~Employee() {\r\n   cout << std::format(\"Employee object destructor: {}, {}\\n\",\r\n      m_lastName, m_firstName);\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_23-27/Employee.h",
    "content": "// Fig. 9.25: Employee.h\r\n// Employee class definition showing composition.\r\n// Member functions defined in Employee.cpp.\r\n#pragma once // prevent multiple inclusions of header\r\n#include <string>\r\n#include <string_view>\r\n#include \"Date.h\" // include Date class definition\r\n\r\nclass Employee {\r\npublic:\r\n   Employee(std::string_view firstName, std::string_view lastName,\r\n      const Date& birthDate, const Date& hireDate);\r\n   std::string toString() const;\r\n   ~Employee(); // provided to confirm destruction order\r\nprivate:\r\n   std::string m_firstName; // composition: member object\r\n   std::string m_lastName; // composition: member object\r\n   Date m_birthDate; // composition: member object\r\n   Date m_hireDate; // composition: member object\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_23-27/fig09_27.cpp",
    "content": "// fig09_27.cpp\r\n// Demonstrating composition--an object with member objects.\r\n#include <format>\r\n#include <iostream>\r\n#include \"Date.h\" // Date class definition\r\n#include \"Employee.h\" // Employee class definition\r\n\r\nint main() {\r\n   const Date birth{1987 ,7, 24};\r\n   const Date hire{2018, 3, 12};\r\n   const Employee manager{\"Aisha\", \"Khan\", birth, hire};\r\n\r\n   std::cout << std::format(\"\\n{}\\n\\n\", manager.toString());\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_28/fig09_28.cpp",
    "content": "// fig09_28.cpp  \r\n// Friends can access private members of a class.\r\n#include <format>\r\n#include <iostream>\r\n\r\n// Count class definition \r\nclass Count {\r\n   friend void modifyX(Count& c, int value); // friend declaration\r\npublic:\r\n   int getX() const { return m_x; }\r\nprivate:\r\n   int m_x{0};\r\n};\r\n\r\n// function modifyX can modify private data of Count         \r\n// because modifyX is declared as a friend of Count (line 8)\r\nvoid modifyX(Count& c, int value) {\r\n   c.m_x = value; // allowed because modifyX is a friend of Count \r\n}\r\n\r\nint main() {\r\n   Count counter{}; // create Count object\r\n\r\n   std::cout << std::format(\"Initial counter.m_x: {}\\n\", counter.getX());\r\n   modifyX(counter, 8); // change x's value using a friend function\r\n   std::cout << std::format(\"counter.m_x after modifyX: {}\\n\",\r\n      counter.getX());\r\n}\r\n\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/"
  },
  {
    "path": "examples/lesson09/fig09_29/fig09_29.cpp",
    "content": "// fig09_29.cpp  \r\n// Using the this pointer to refer to object members.\r\n#include <format>\r\n#include <iostream>\r\n\r\nclass Test {\r\npublic:\r\n   explicit Test(int value);\r\n   void print() const;\r\nprivate:\r\n   int m_x{0};\r\n};\r\n\r\n// constructor\r\nTest::Test(int value) : m_x{value} {} // initialize x to value\r\n\r\n// print x using implicit then explicit this pointers;\r\n// the parentheses around *this are required due to precedence\r\nvoid Test::print() const {\r\n   // implicitly use the this pointer to access the member x\r\n   std::cout << std::format(\"        m_x = {}\\n\", m_x);\r\n\r\n   // explicitly use the this pointer and the arrow operator\r\n   // to access the member x                                \r\n   std::cout << std::format(\"  this->m_x = {}\\n\", this->m_x);\r\n\r\n   // explicitly use the dereferenced this pointer and\r\n   // the dot operator to access the member x         \r\n   std::cout << std::format(\"(*this).m_x = {}\\n\", (*this).m_x);\r\n}\r\n\r\nint main() {\r\n   const Test testObject{12}; // instantiate and initialize testObject\r\n   testObject.print();\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_30-32/Time.cpp",
    "content": "// Fig. 9.31: Time.cpp \r\n// Time class member-function definitions.\r\n#include <format>\r\n#include <stdexcept>\r\n#include \"Time.h\" // Time class definition\r\n\r\n// Time constructor initializes each data member    \r\nTime::Time(int hour, int minute, int second) {             \r\n   setTime(hour, minute, second);\r\n}\r\n\r\n// set new Time value using 24-hour time\r\nTime& Time::setTime(int hour, int minute, int second) {\r\n   // validate hour, minute and second\r\n   if (hour < 0 || hour >= 24) {\r\n      throw std::invalid_argument{\"hour was out of range\"};\r\n   } \r\n\r\n   if (minute < 0 || minute >= 60) { \r\n      throw std::invalid_argument{\"minute was out of range\"};\r\n   } \r\n\r\n   if (second < 0 || second >= 60) {\r\n      throw std::invalid_argument{\"second was out of range\"};\r\n   } \r\n\r\n   m_hour = hour;\r\n   m_minute = minute;\r\n   m_second = second;\r\n   return *this; // enables cascading\r\n} \r\n\r\n// set hour value\r\nTime& Time::setHour(int hour) {\r\n   return setTime(hour, m_minute, m_second);\r\n}\r\n\r\n// set minute value\r\nTime&  Time::setMinute(int minute) {\r\n   return setTime(m_hour, minute, m_second);\r\n}\r\n\r\n// set second value\r\nTime&  Time::setSecond(int second) {\r\n   return setTime(m_hour, m_minute, second);\r\n}\r\n\r\n// get hour value\r\nint Time::getHour() const {return m_hour;}\r\n\r\n// get minute value\r\nint Time::getMinute() const {return m_minute;}\r\n\r\n// get second value\r\nint Time::getSecond() const {return m_second;}\r\n\r\n// return Time as a string in 24-hour format (HH:MM:SS)\r\nstd::string Time::to24HourString() const {\r\n   return std::format(\"{:02d}:{:02d}:{:02d}\", \r\n      getHour(), getMinute(), getSecond());\r\n} \r\n\r\n// return Time as string in 12-hour format (HH:MM:SS AM or PM)\r\nstd::string Time::to12HourString() const {\r\n   return std::format(\"{}:{:02d}:{:02d} {}\", \r\n      ((getHour() % 12 == 0) ? 12 : getHour() % 12), \r\n      getMinute(), getSecond(), (getHour() < 12 ? \"AM\" : \"PM\"));\r\n} \r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_30-32/Time.h",
    "content": "// Fig. 9.30: Time.h\r\n// Time class modified to enable cascaded member-function calls.\r\n#pragma once // prevent multiple inclusions of header\r\n#include <string>\r\n\r\nclass Time {\r\npublic:\r\n   // default constructor because it can be called with no arguments\r\n   explicit Time(int hour = 0, int minute = 0, int second = 0);\r\n\r\n   // set functions\r\n   Time& setTime(int hour, int minute, int second);\r\n   Time& setHour(int hour); // set hour (after validation)\r\n   Time& setMinute(int minute); // set minute (after validation)\r\n   Time& setSecond(int second); // set second (after validation)\r\n\r\n   int getHour() const; // return hour\r\n   int getMinute() const; // return minute\r\n   int getSecond() const; // return second\r\n   std::string to24HourString() const; // 24-hour time format string\r\n   std::string to12HourString() const; // 12-hour time format string\r\nprivate:\r\n   int m_hour{0}; // 0 - 23 (24-hour clock format)\r\n   int m_minute{0}; // 0 - 59\r\n   int m_second{0}; // 0 - 59\r\n};\r\n\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_30-32/fig09_32.cpp",
    "content": "// fig09_32.cpp\r\n// Cascading member-function calls with the this pointer.\r\n#include <format>\r\n#include <iostream>\r\n#include \"Time.h\" // Time class definition\r\nusing namespace std;\r\n\r\nint main() {\r\n   Time t{}; // create Time object\r\n\r\n   t.setHour(18).setMinute(30).setSecond(22); // cascaded function calls\r\n\r\n   // output time in 24-hour and 12-hour formats\r\n   std::cout << std::format(\"24-hour time: {}\\n12-hour time: {}\\n\\n\",\r\n      t.to24HourString(), t.to12HourString());\r\n\r\n   // cascaded function calls        \r\n   std::cout << std::format(\"New 12-hour time: {}\\n\",\r\n      t.setTime(20, 20, 20).to12HourString());\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_33-35/Employee.cpp",
    "content": "// Fig. 9.34: Employee.cpp\r\n// Employee class member-function definitions.\r\n#include <format>\r\n#include <iostream>\r\n#include \"Employee.h\" // Employee class definition \r\nusing namespace std;\r\n\r\n// define static member function that returns number of         \r\n// Employee objects instantiated (declared static in Employee.h)\r\nint Employee::getCount() {return m_count;} \r\n\r\n// constructor initializes non-static data members and \r\n// increments static data member count\r\nEmployee::Employee(string_view firstName, string_view lastName)\r\n   : m_firstName(firstName), m_lastName(lastName) {\r\n   ++m_count; // increment static count of employees\r\n   std::cout << std::format(\"Employee constructor called for {} {}\\n\", \r\n      m_firstName, m_lastName);\r\n} \r\n\r\n// destructor decrements the count\r\nEmployee::~Employee() {\r\n   std::cout << std::format(\"~Employee() called for {} {}\\n\", \r\n      m_firstName, m_lastName);\r\n   --m_count; // decrement static count of employees\r\n}\r\n\r\n// return first name of employee\r\nconst string& Employee::getFirstName() const {return m_firstName;}\r\n\r\n// return last name of employee\r\nconst string& Employee::getLastName() const {return m_lastName;}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_33-35/Employee.h",
    "content": "// Fig. 9.33: Employee.h\r\n// Employee class definition with a static data member to \r\n// track the number of Employee objects in memory\r\n#pragma once\r\n#include <string>\r\n#include <string_view>\r\n\r\nclass Employee {\r\npublic:\r\n   Employee(std::string_view firstName, std::string_view lastName);\r\n   ~Employee(); // destructor\r\n   const std::string& getFirstName() const; // return first name\r\n   const std::string& getLastName() const; // return last name\r\n\r\n   // static member function                                          \r\n   static int getCount(); // return # of objects instantiated\r\nprivate:\r\n   std::string m_firstName;\r\n   std::string m_lastName;\r\n\r\n   // static data\r\n   inline static int m_count{0}; // number of objects instantiated\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_33-35/fig09_35.cpp",
    "content": "// fig09_35.cpp\r\n// static data member tracking the number of objects of a class.\r\n#include <format>\r\n#include <iostream>\r\n#include \"Employee.h\" // Employee class definition\r\n\r\nint main() {\r\n   // no objects exist; use class name and scope resolution \r\n   // operator to access static member function getCount\r\n   std::cout << std::format(\"Initial employee count: {}\\n\",\r\n      Employee::getCount()); // use class name\r\n\r\n   // the following scope creates and destroys \r\n   // Employee objects before main terminates\r\n   {\r\n      const Employee e1{\"Susan\", \"Baker\"};\r\n      const Employee e2{\"Robert\", \"Jones\"};\r\n\r\n      // two objects exist; call static member function getCount again \r\n      // using the class name and the scope resolution operator\r\n      std::cout << std::format(\r\n         \"Employee count after creating objects: {}\\n\\n\",\r\n         Employee::getCount());\r\n\r\n      std::cout << std::format(\"Employee 1: {} {}\\nEmployee 2: {} {}\\n\\n\",\r\n         e1.getFirstName(), e1.getLastName(),\r\n         e2.getFirstName(), e2.getLastName());\r\n   }\r\n\r\n   // no objects exist, so call static member function getCount again \r\n   // using the class name and the scope resolution operator\r\n   std::cout << std::format(\r\n      \"Employee count after objects are destroyed: {}\\n\",\r\n      Employee::getCount());\r\n}\r\n\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_36-37/cipher.h",
    "content": "// Fig. 9.37: cipher.h\r\n// Vigenre cipher implementation. \r\n#pragma once\r\n#include <algorithm>\r\n#include <array>\r\n#include <iostream>\r\n#include <string>\r\n#include <string_view>\r\n#include <cctype>\r\n#include <stdexcept>\r\n#include <gsl/gsl>\r\n\r\nclass Cipher {\r\npublic:\r\n   // constructor to initialize the Vigenre square \r\n   Cipher() {\r\n      // array to store the 26 characters A-Z that will be \r\n      // used to initialize each row of the Vigenre square\r\n      std::array<char, m_size> alphabet{};\r\n\r\n      // fill alphabet with A-Z\r\n      for (size_t i{0}; i < m_size; ++i) {\r\n         // convert 'A' + i to a char and place in alphabet\r\n         alphabet.at(i) = gsl::narrow_cast<char>('A' + i);\r\n      }\r\n\r\n      // copy alphabet into row 0 of the Vigenre square\r\n      m_square.at(0) = alphabet;\r\n\r\n      // for each remaining row of the Vigenre square, move alphabet's\r\n      // first letter to the end then copy alphabet into the row\r\n      for (int row{1}; row < m_size; ++row) {\r\n         // rotate alphabet, moving its first letter to the end\r\n         std::ranges::rotate(alphabet, std::begin(alphabet) + 1);\r\n\r\n         // copy alphabet into current row of the Vigenre square\r\n         m_square.at(row) = alphabet;\r\n      }\r\n   }\r\n\r\n   // encrypt receives the plaintext and secret key, applies \r\n   // the Vigenre cipher returns the encrypted ciphertext\r\n   std::string encrypt(\r\n      std::string_view plaintext, std::string_view secret) {\r\n\r\n      checkKey(secret); // ensure secret key contains only letters\r\n\r\n      std::string ciphertext{}; // stores encrypted text\r\n      size_t keyIndex{0}; // current letter index in secret key\r\n\r\n      // iterate through each character in plaintext\r\n      for (size_t i{0}; i < plaintext.size(); ++i) {\r\n         // determine whether character at i is lowercase so we can \r\n         // place a corresponding lowercase letter in the ciphertext\r\n         const bool lower{std::islower(plaintext.at(i)) ? true : false};\r\n\r\n         // convert currentChar to uppercase; for uppercase \r\n         // letters and non-letters the character remains the same\r\n         const char currentChar{gsl::narrow_cast<const char>(\r\n            std::toupper(plaintext.at(i)))};\r\n\r\n         // if the current character is a letter, encrypt it  \r\n         // and add it to cipherText in its original case\r\n         if ('A' <= currentChar && currentChar <= 'Z') {\r\n            // to get the row index in the Vigenre square, select the \r\n            // character at keyIndex in the secret key, convert it to \r\n            // uppercase and subtract 'A' from it\r\n            const int row{std::toupper(secret.at(keyIndex)) - 'A'};\r\n\r\n            // increment the keyIndex, ensuring that it is  \r\n            // reset to 0 if keyIndex reaches secret.size()\r\n            keyIndex = (keyIndex + 1) % secret.size();\r\n\r\n            // to get the column index in the Vigenre square,  \r\n            // subtract 'A' from the currentChar\r\n            const int column{currentChar - 'A'};\r\n\r\n            // select the substitute character from the Vigenre square\r\n            const char substituteChar{m_square.at(row).at(column)};\r\n\r\n            // add substituteChar to the ciphertext, ensuring that\r\n            // it's lowercase if the plaintext character was lowerase\r\n            ciphertext +=\r\n               (lower ? std::tolower(substituteChar) : substituteChar);\r\n         }\r\n         else {\r\n            ciphertext += currentChar; // add non-letter to ciphertext\r\n         }\r\n      }\r\n\r\n      return ciphertext; // return the encrypted text\r\n   }\r\n\r\n   // decrypt receives the ciphertext and secret key, reverses\r\n   // Vigenre cipher process and returns the unencrypted plaintext\r\n   std::string decrypt(\r\n      std::string_view ciphertext, std::string_view secret) {\r\n\r\n      checkKey(secret); // ensure secret key contains only letters\r\n\r\n      std::string plaintext{}; // stores unencrypted text\r\n      size_t keyIndex{0}; // current letter index in secret key\r\n\r\n      for (size_t i{0}; i < ciphertext.size(); ++i) {\r\n         // determine whether character at i is lowercase so we can \r\n         // place a corresponding lowercase letter in plainText\r\n         const bool lower{std::islower(ciphertext.at(i)) ? true : false};\r\n\r\n         // convert currentChar to uppercase; for uppercase \r\n         // letters and non-letters the character remains the same\r\n         const char currentChar{gsl::narrow_cast<const char>(\r\n            std::toupper(ciphertext.at(i)))};\r\n\r\n         // if current is a letter decrypt it\r\n         if ('A' <= currentChar && currentChar <= 'Z') {\r\n            // to get the row index in the Vigenre square, select the \r\n            // character at keyIndex in the secret key, convert it to \r\n            // uppercase and subtract 'A' from it\r\n            const int row{std::toupper(secret.at(keyIndex)) - 'A'};\r\n\r\n            // increment the keyIndex, ensuring that it is  \r\n            // reset to 0 if keyIndex reaches secret.size()\r\n            keyIndex = (keyIndex + 1) % secret.size();\r\n\r\n            // column in the Vigenre square\r\n            int column{-1};\r\n\r\n            // find currentChar's column in Vigenre square's current row\r\n            for (int i{0}; i < m_square.at(row).size(); ++i) {\r\n               if (m_square.at(row).at(i) == currentChar) {\r\n                  column = i;\r\n                  break;\r\n               }\r\n            }\r\n\r\n            // determine original character  \r\n            const char originalChar{\r\n               gsl::narrow_cast<const char>('A' + column)};\r\n\r\n            // add originalChar to plaintext in the correct case\r\n            plaintext +=\r\n               (lower ? std::tolower(originalChar) : originalChar);\r\n         }\r\n         else {\r\n            plaintext += currentChar; // add non-letter to plaintext\r\n         }\r\n      }\r\n\r\n      return plaintext; // return the unencrypted text\r\n   }\r\nprivate:\r\n   // number of rows and columns in the Vigenre square\r\n   static constexpr size_t m_size{26};\r\n\r\n   // 26-by-26 array of characters to store the Vigenre square\r\n   std::array<std::array<char, m_size>, m_size> m_square;\r\n\r\n   // utility function checks that secret key contains only letters; \r\n   // throws an invalid_argument exception if key contains non-letters\r\n   static void checkKey(std::string_view secret) {\r\n      for (size_t i{0}; i < secret.size(); ++i) {\r\n         // if the uppercase version of the character at index i \r\n         // is not a letter throw an invalid_argument exception\r\n         if (std::toupper(secret.at(i)) < 'A' ||\r\n            std::toupper(secret.at(i)) > 'Z') {\r\n            throw std::invalid_argument(\r\n               \"key must contain only letters A-Z or a-z\");\r\n         }\r\n      }\r\n   }\r\n};\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_36-37/fig09_36.cpp",
    "content": "// fig09_36.cpp\r\n// Encrypting and decrypting text with a Vigenre cipher. \r\n#include \"cipher.h\"\r\n#include <iostream>\r\n#include <string>\r\n\r\nint main() {\r\n   std::string plainText;\r\n   std::cout << \"Enter the text to encrypt:\\n\";\r\n   std::getline(std::cin, plainText);\r\n\r\n   std::string secretKey;\r\n   std::cout << \"\\nEnter the secret key:\\n\";\r\n   std::getline(std::cin, secretKey);\r\n\r\n   Cipher cipher;\r\n\r\n   // encrypt plainText using secretKey\r\n   std::string cipherText{cipher.encrypt(plainText, secretKey)};\r\n   std::cout << \"\\nEncrypted:\\n   \" << cipherText << '\\n';\r\n\r\n   // decrypt cipherText\r\n   std::cout << \"\\nDecrypted:\\n   \" \r\n      << cipher.decrypt(cipherText, secretKey) << '\\n';\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_38/fig09_38.cpp",
    "content": "// fig09_38.cpp\r\n// Serializing and deserializing objects with the cereal library.\r\n#include <cereal/archives/json.hpp> \r\n#include <cereal/types/vector.hpp>  \r\n#include <format>\r\n#include <fstream>\r\n#include <iostream>\r\n#include <vector>\r\n\r\nstruct Record {\r\n   int account{};\r\n   std::string first{};\r\n   std::string last{};\r\n   double balance{};\r\n};\r\n\r\n// function template serialize is responsible for serializing and \r\n// deserializing Record objects to/from the specified Archive\r\ntemplate <typename Archive>\r\nvoid serialize(Archive& archive, Record& record) {\r\n   archive(cereal::make_nvp(\"account\", record.account),\r\n      cereal::make_nvp(\"first\", record.first),\r\n      cereal::make_nvp(\"last\", record.last),\r\n      cereal::make_nvp(\"balance\", record.balance));\r\n}\r\n\r\n// display record at command line\r\nvoid displayRecords(const std::vector<Record>& records) {\r\n   for (const auto& r : records) {\r\n      std::cout << std::format(\"{} {} {} {:.2f}\\n\",\r\n         r.account, r.first, r.last, r.balance);\r\n   }\r\n}\r\n\r\nint main() {\r\n   std::vector records{\r\n      Record{100, \"Bakary\", \"Zongo\", 123.45},\r\n      Record{200, \"Sofia\", \"Smirnova\", 987.65}\r\n   };\r\n\r\n   std::cout << \"Records to serialize:\\n\";\r\n   displayRecords(records);\r\n\r\n   // serialize vector of Records to JSON and store in text file\r\n   if (std::ofstream output{\"records.json\"}) {\r\n      cereal::JSONOutputArchive archive{output};\r\n      archive(cereal::make_nvp(\"records\", records)); // serialize records\r\n   }\r\n\r\n   // deserialize JSON from text file into vector of Records\r\n   if (std::ifstream input{\"records.json\"}) {\r\n      cereal::JSONInputArchive archive{input};\r\n      std::vector<Record> deserializedRecords{};\r\n      archive(deserializedRecords); // deserialize records\r\n      std::cout << \"\\nDeserialized records:\\n\";\r\n      displayRecords(deserializedRecords);\r\n   }\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n *************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson09/fig09_38/records.json",
    "content": "{\n    \"records\": [\n        {\n            \"account\": 100,\n            \"first\": \"Brian\",\n            \"last\": \"Blue\",\n            \"balance\": 123.45\n        },\n        {\n            \"account\": 200,\n            \"first\": \"Sue\",\n            \"last\": \"Green\",\n            \"balance\": 987.65\n        }\n    ]\n}"
  },
  {
    "path": "examples/lesson10/fig10_01-03/SalariedEmployee.cpp",
    "content": "// Fig. 10.2: SalariedEmployee.cpp\r\n// Class SalariedEmployee member-function definitions.\r\n#include <format>\r\n#include <stdexcept>\r\n#include \"SalariedEmployee.h\" // SalariedEmployee class definition\r\n\r\n// constructor                                                        \r\nSalariedEmployee::SalariedEmployee(std::string_view name, double salary)\r\n   : m_name{name} {\r\n   setSalary(salary); \r\n}                                                                     \r\n\r\n// set name\r\nvoid SalariedEmployee::setName(std::string_view name) {\r\n   m_name = name; // should validate\r\n} \r\n\r\n// return name\r\nstd::string SalariedEmployee::getName() const {return m_name;}\r\n\r\n// set salary\r\nvoid SalariedEmployee::setSalary(double salary) {\r\n   if (salary < 0.0) {                                       \r\n      throw std::invalid_argument(\"Salary must be >= 0.0\");       \r\n   } \r\n\r\n   m_salary = salary;                                     \r\n} \r\n\r\n// return salary\r\ndouble SalariedEmployee::getSalary() const {return m_salary;}\r\n\r\n// calculate earnings                        \r\ndouble SalariedEmployee::earnings() const {return getSalary();}\r\n\r\n// return string representation of SalariedEmployee object        \r\nstd::string SalariedEmployee::toString() const {                       \r\n   return std::format(\"name: {}\\nsalary: ${:.2f}\\n\", getName(), \r\n      getSalary());\r\n}                                                                   \r\n                                                            \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_01-03/SalariedEmployee.h",
    "content": "// Fig. 10.1: SalariedEmployee.h\r\n// SalariedEmployee class definition.\r\n#pragma once // prevent multiple inclusions of header\r\n#include <string> \r\n#include <string_view> \r\n\r\nclass SalariedEmployee {\r\npublic:\r\n   SalariedEmployee(std::string_view name, double salary);\r\n\r\n   void setName(std::string_view name);\r\n   std::string getName() const;\r\n\r\n   void setSalary(double salary);\r\n   double getSalary() const;\r\n\r\n   double earnings() const;\r\n   std::string toString() const;\r\nprivate:\r\n   std::string m_name{};\r\n   double m_salary{0.0};\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_01-03/fig10_03.cpp",
    "content": "// fig10_03.cpp\r\n// SalariedEmployee class test program.\r\n#include <format>\r\n#include <iostream>\r\n#include \"SalariedEmployee.h\" // SalariedEmployee class definition\r\n\r\nint main() {\r\n   // instantiate a SalariedEmployee object     \r\n   SalariedEmployee employee{\"Sierra Dembo\", 300.0};\r\n\r\n   // get SalariedEmployee data\r\n   std::cout << \"Employee information obtained by get functions:\\n\"\r\n      << std::format(\"name: {}\\nsalary: ${:.2f}\\n\", employee.getName(),\r\n            employee.getSalary());\r\n\r\n   employee.setSalary(500.0); // change salary      \r\n   std::cout << \"\\nUpdated employee information from function toString:\\n\"\r\n      << employee.toString();\r\n\r\n   // display only the employee's earnings\r\n   std::cout << std::format(\"\\nearnings: ${:.2f}\\n\", employee.earnings());\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_04-06/SalariedCommissionEmployee.cpp",
    "content": "// Fig. 10.5: SalariedCommissionEmployee.cpp\r\n// Class SalariedCommissionEmployee member-function definitions.\r\n#include <format>\r\n#include <stdexcept>\r\n#include \"SalariedCommissionEmployee.h\"\r\n\r\n// constructor\r\nSalariedCommissionEmployee::SalariedCommissionEmployee(\r\n   std::string_view name, double salary, double grossSales, \r\n   double commissionRate)\r\n   : SalariedEmployee{name, salary} { // call base-class constructor \r\n\r\n   setGrossSales(grossSales); // validate & store gross sales   \r\n   setCommissionRate(commissionRate); // validate & store commission rate\r\n}                                                              \r\n\r\n// set gross sales amount\r\nvoid SalariedCommissionEmployee::setGrossSales(double grossSales) {\r\n   if (grossSales < 0.0) {\r\n      throw std::invalid_argument(\"Gross sales must be >= 0.0\");\r\n   } \r\n\r\n   m_grossSales = grossSales;\r\n} \r\n\r\n// return gross sales amount\r\ndouble SalariedCommissionEmployee::getGrossSales() const {\r\n   return m_grossSales;\r\n}\r\n\r\n// return commission rate\r\nvoid SalariedCommissionEmployee::setCommissionRate(\r\n   double commissionRate) {\r\n\r\n   if (commissionRate <= 0.0 || commissionRate >= 1.0) {\r\n      throw std::invalid_argument(\r\n         \"Commission rate must be > 0.0 and < 1.0\");\r\n   } \r\n\r\n   m_commissionRate = commissionRate;\r\n} \r\n\r\n// get commission rate\r\ndouble SalariedCommissionEmployee::getCommissionRate() const {\r\n   return m_commissionRate;\r\n}\r\n\r\n// calculate earnings--uses SalariedEmployee::earnings()\r\ndouble SalariedCommissionEmployee::earnings() const {\r\n   return SalariedEmployee::earnings() + \r\n      getGrossSales() * getCommissionRate();\r\n} \r\n\r\n// returns string representation of SalariedCommissionEmployee object\r\nstd::string SalariedCommissionEmployee::toString() const {\r\n   return std::format(\r\n      \"{}gross sales: ${:.2f}\\ncommission rate: {:.2f}\\n\",\r\n      SalariedEmployee::toString(), getGrossSales(), getCommissionRate());\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_04-06/SalariedCommissionEmployee.h",
    "content": "// Fig. 10.4: SalariedCommissionEmployee.h\r\n// SalariedCommissionEmployee class derived from class SalariedEmployee.\r\n#pragma once\r\n#include <string> \r\n#include <string_view> \r\n#include \"SalariedEmployee.h\" \r\n\r\nclass SalariedCommissionEmployee : public SalariedEmployee {\r\npublic:\r\n   SalariedCommissionEmployee(std::string_view name, double salary,\r\n      double grossSales, double commissionRate);\r\n\r\n   void setGrossSales(double grossSales);\r\n   double getGrossSales() const;\r\n\r\n   void setCommissionRate(double commissionRate);\r\n   double getCommissionRate() const;\r\n\r\n   double earnings() const;\r\n   std::string toString() const;\r\nprivate:\r\n   double m_grossSales{0.0};\r\n   double m_commissionRate{0.0};\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_04-06/SalariedEmployee.cpp",
    "content": "// Fig. 10.2: SalariedEmployee.cpp\r\n// Class SalariedEmployee member-function definitions.\r\n#include <format>\r\n#include <stdexcept>\r\n#include \"SalariedEmployee.h\" // SalariedEmployee class definition\r\n\r\n// constructor                                                        \r\nSalariedEmployee::SalariedEmployee(std::string_view name, double salary)\r\n   : m_name{name} {\r\n   setSalary(salary); \r\n}                                                                     \r\n\r\n// set name\r\nvoid SalariedEmployee::setName(std::string_view name) {\r\n   m_name = name; // should validate\r\n} \r\n\r\n// return name\r\nstd::string SalariedEmployee::getName() const {return m_name;}\r\n\r\n// set salary\r\nvoid SalariedEmployee::setSalary(double salary) {\r\n   if (salary < 0.0) {                                       \r\n      throw std::invalid_argument(\"Salary must be >= 0.0\");       \r\n   } \r\n\r\n   m_salary = salary;                                     \r\n} \r\n\r\n// return salary\r\ndouble SalariedEmployee::getSalary() const {return m_salary;}\r\n\r\n// calculate earnings                        \r\ndouble SalariedEmployee::earnings() const {return getSalary();}\r\n\r\n// return string representation of SalariedEmployee object        \r\nstd::string SalariedEmployee::toString() const {                       \r\n   return std::format(\"name: {}\\nsalary: ${:.2f}\\n\", getName(), \r\n      getSalary());\r\n}                                                                   \r\n                                                            \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_04-06/SalariedEmployee.h",
    "content": "// Fig. 10.1: SalariedEmployee.h\r\n// SalariedEmployee class definition.\r\n#pragma once // prevent multiple inclusions of header\r\n#include <string> \r\n#include <string_view> \r\n\r\nclass SalariedEmployee {\r\npublic:\r\n   SalariedEmployee(std::string_view name, double salary);\r\n\r\n   void setName(std::string_view name);\r\n   std::string getName() const;\r\n\r\n   void setSalary(double salary);\r\n   double getSalary() const;\r\n\r\n   double earnings() const;\r\n   std::string toString() const;\r\nprivate:\r\n   std::string m_name{};\r\n   double m_salary{0.0};\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_04-06/fig10_06.cpp",
    "content": "// fig10_06.cpp\r\n// SalariedCommissionEmployee class test program.\r\n#include <format>\r\n#include <iostream>\r\n#include \"SalariedCommissionEmployee.h\" \r\n\r\nint main() {\r\n   // instantiate SalariedCommissionEmployee object             \r\n   SalariedCommissionEmployee employee{\"Ivano Lal\", 300.0, 5000.0, .04};\r\n\r\n   // get SalariedCommissionEmployee data\r\n   std::cout << \"Employee information obtained by get functions:\\n\"\r\n      << std::format(\"{}: {}\\n{}: {:.2f}\\n{}: {:.2f}\\n{}: {:.2f}\\n\",\r\n            \"name\", employee.getName(), \"salary\", employee.getSalary(),\r\n            \"gross sales\", employee.getGrossSales(),\r\n            \"commission\", employee.getCommissionRate());\r\n\r\n   employee.setGrossSales(8000.0); // change gross sales      \r\n   employee.setCommissionRate(0.1); // change commission rate\r\n   std::cout << \"\\nUpdated employee information from function toString:\\n\"\r\n      << employee.toString();\r\n\r\n   // display the employee's earnings\r\n   std::cout << std::format(\"\\nearnings: ${:.2f}\\n\", employee.earnings());\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_07/SalariedCommissionEmployee.cpp",
    "content": "// Fig. 10.5: SalariedCommissionEmployee.cpp\r\n// Class SalariedCommissionEmployee member-function definitions.\r\n#include <format>\r\n#include <stdexcept>\r\n#include \"SalariedCommissionEmployee.h\"\r\n\r\n// constructor\r\nSalariedCommissionEmployee::SalariedCommissionEmployee(\r\n   std::string_view name, double salary, double grossSales, \r\n   double commissionRate)\r\n   : SalariedEmployee{name, salary} { // call base-class constructor \r\n\r\n   setGrossSales(grossSales); // validate & store gross sales   \r\n   setCommissionRate(commissionRate); // validate & store commission rate\r\n}                                                              \r\n\r\n// set gross sales amount\r\nvoid SalariedCommissionEmployee::setGrossSales(double grossSales) {\r\n   if (grossSales < 0.0) {\r\n      throw std::invalid_argument(\"Gross sales must be >= 0.0\");\r\n   } \r\n\r\n   m_grossSales = grossSales;\r\n} \r\n\r\n// return gross sales amount\r\ndouble SalariedCommissionEmployee::getGrossSales() const {\r\n   return m_grossSales;\r\n}\r\n\r\n// return commission rate\r\nvoid SalariedCommissionEmployee::setCommissionRate(\r\n   double commissionRate) {\r\n\r\n   if (commissionRate <= 0.0 || commissionRate >= 1.0) {\r\n      throw std::invalid_argument(\r\n         \"Commission rate must be > 0.0 and < 1.0\");\r\n   } \r\n\r\n   m_commissionRate = commissionRate;\r\n} \r\n\r\n// get commission rate\r\ndouble SalariedCommissionEmployee::getCommissionRate() const {\r\n   return m_commissionRate;\r\n}\r\n\r\n// calculate earnings--uses SalariedEmployee::earnings()\r\ndouble SalariedCommissionEmployee::earnings() const {\r\n   return SalariedEmployee::earnings() + \r\n      getGrossSales() * getCommissionRate();\r\n} \r\n\r\n// returns string representation of SalariedCommissionEmployee object\r\nstd::string SalariedCommissionEmployee::toString() const {\r\n   return std::format(\r\n      \"{}gross sales: ${:.2f}\\ncommission rate: {:.2f}\\n\",\r\n      SalariedEmployee::toString(), getGrossSales(), getCommissionRate());\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_07/SalariedCommissionEmployee.h",
    "content": "// Fig. 10.4: SalariedCommissionEmployee.h\r\n// SalariedCommissionEmployee class derived from class SalariedEmployee.\r\n#pragma once\r\n#include <string> \r\n#include <string_view> \r\n#include \"SalariedEmployee.h\" \r\n\r\nclass SalariedCommissionEmployee : public SalariedEmployee {\r\npublic:\r\n   SalariedCommissionEmployee(std::string_view name, double salary,\r\n      double grossSales, double commissionRate);\r\n\r\n   void setGrossSales(double grossSales);\r\n   double getGrossSales() const;\r\n\r\n   void setCommissionRate(double commissionRate);\r\n   double getCommissionRate() const;\r\n\r\n   double earnings() const;\r\n   std::string toString() const;\r\nprivate:\r\n   double m_grossSales{0.0};\r\n   double m_commissionRate{0.0};\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_07/SalariedEmployee.cpp",
    "content": "// Fig. 10.2: SalariedEmployee.cpp\r\n// Class SalariedEmployee member-function definitions.\r\n#include <format>\r\n#include <stdexcept>\r\n#include \"SalariedEmployee.h\" // SalariedEmployee class definition\r\n\r\n// constructor                                                        \r\nSalariedEmployee::SalariedEmployee(std::string_view name, double salary)\r\n   : m_name{name} {\r\n   setSalary(salary); \r\n}                                                                     \r\n\r\n// set name\r\nvoid SalariedEmployee::setName(std::string_view name) {\r\n   m_name = name; // should validate\r\n} \r\n\r\n// return name\r\nstd::string SalariedEmployee::getName() const {return m_name;}\r\n\r\n// set salary\r\nvoid SalariedEmployee::setSalary(double salary) {\r\n   if (salary < 0.0) {                                       \r\n      throw std::invalid_argument(\"Salary must be >= 0.0\");       \r\n   } \r\n\r\n   m_salary = salary;                                     \r\n} \r\n\r\n// return salary\r\ndouble SalariedEmployee::getSalary() const {return m_salary;}\r\n\r\n// calculate earnings                        \r\ndouble SalariedEmployee::earnings() const {return getSalary();}\r\n\r\n// return string representation of SalariedEmployee object        \r\nstd::string SalariedEmployee::toString() const {                       \r\n   return std::format(\"name: {}\\nsalary: ${:.2f}\\n\", getName(), \r\n      getSalary());\r\n}                                                                   \r\n                                                            \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_07/SalariedEmployee.h",
    "content": "// Fig. 10.1: SalariedEmployee.h\r\n// SalariedEmployee class definition.\r\n#pragma once // prevent multiple inclusions of header\r\n#include <string> \r\n#include <string_view> \r\n\r\nclass SalariedEmployee {\r\npublic:\r\n   SalariedEmployee(std::string_view name, double salary);\r\n\r\n   void setName(std::string_view name);\r\n   std::string getName() const;\r\n\r\n   void setSalary(double salary);\r\n   double getSalary() const;\r\n\r\n   double earnings() const;\r\n   std::string toString() const;\r\nprivate:\r\n   std::string m_name{};\r\n   double m_salary{0.0};\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_07/fig10_07.cpp",
    "content": "// fig10_07.cpp\r\n// Aiming base-class and derived-class pointers at base-class\r\n// and derived-class objects, respectively.\r\n#include <format>\r\n#include <iostream>\r\n#include \"SalariedEmployee.h\"\r\n#include \"SalariedCommissionEmployee.h\" \r\n\r\nint main() {\r\n   // create base-class object\r\n   SalariedEmployee salaried{\"Sierra Dembo\", 500.0};\r\n\r\n   // create derived-class object\r\n   SalariedCommissionEmployee salariedCommission{\r\n      \"Ivano Lal\", 300.0, 5000.0, .04};\r\n\r\n   // output objects salaried and salariedCommission\r\n   std::cout << std::format(\"{}:\\n{}\\n{}\\n\",\r\n      \"DISPLAY BASE-CLASS AND DERIVED-CLASS OBJECTS\",\r\n      salaried.toString(), // base-class toString\r\n      salariedCommission.toString()); // derived-class toString\r\n\r\n   // natural: aim base-class pointer at base-class object        \r\n   SalariedEmployee* salariedPtr{&salaried};\r\n   std::cout << std::format(\"{}\\n{}:\\n{}\\n\",\r\n      \"CALLING TOSTRING WITH BASE-CLASS POINTER TO\",\r\n      \"BASE-CLASS OBJECT INVOKES BASE-CLASS FUNCTIONALITY\",\r\n      salariedPtr->toString()); // base-class version\r\n\r\n   // natural: aim derived-class pointer at derived-class object\r\n   SalariedCommissionEmployee* salariedCommissionPtr{&salariedCommission};\r\n\r\n   std::cout << std::format(\"{}\\n{}:\\n{}\\n\",\r\n      \"CALLING TOSTRING WITH DERIVED-CLASS POINTER TO\",\r\n      \"DERIVED-CLASS OBJECT INVOKES DERIVED-CLASS FUNCTIONALITY\",\r\n      salariedCommissionPtr->toString()); // derived-class version\r\n\r\n   // aim base-class pointer at derived-class object   \r\n   salariedPtr = &salariedCommission;\r\n   std::cout << std::format(\"{}\\n{}:\\n{}\\n\",\r\n      \"CALLING TOSTRING WITH BASE-CLASS POINTER TO DERIVED-CLASS\",\r\n      \"OBJECT INVOKES BASE-CLASS FUNCTIONALITY\",\r\n      salariedPtr->toString()); // base class version\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_08/SalariedCommissionEmployee.cpp",
    "content": "// Fig. 10.5: SalariedCommissionEmployee.cpp\r\n// Class SalariedCommissionEmployee member-function definitions.\r\n#include <format>\r\n#include <stdexcept>\r\n#include \"SalariedCommissionEmployee.h\"\r\n\r\n// constructor\r\nSalariedCommissionEmployee::SalariedCommissionEmployee(\r\n   std::string_view name, double salary, double grossSales, \r\n   double commissionRate)\r\n   : SalariedEmployee{name, salary} { // call base-class constructor \r\n\r\n   setGrossSales(grossSales); // validate & store gross sales   \r\n   setCommissionRate(commissionRate); // validate & store commission rate\r\n}                                                              \r\n\r\n// set gross sales amount\r\nvoid SalariedCommissionEmployee::setGrossSales(double grossSales) {\r\n   if (grossSales < 0.0) {\r\n      throw std::invalid_argument(\"Gross sales must be >= 0.0\");\r\n   } \r\n\r\n   m_grossSales = grossSales;\r\n} \r\n\r\n// return gross sales amount\r\ndouble SalariedCommissionEmployee::getGrossSales() const {\r\n   return m_grossSales;\r\n}\r\n\r\n// return commission rate\r\nvoid SalariedCommissionEmployee::setCommissionRate(\r\n   double commissionRate) {\r\n\r\n   if (commissionRate <= 0.0 || commissionRate >= 1.0) {\r\n      throw std::invalid_argument(\r\n         \"Commission rate must be > 0.0 and < 1.0\");\r\n   } \r\n\r\n   m_commissionRate = commissionRate;\r\n} \r\n\r\n// get commission rate\r\ndouble SalariedCommissionEmployee::getCommissionRate() const {\r\n   return m_commissionRate;\r\n}\r\n\r\n// calculate earnings--uses SalariedEmployee::earnings()\r\ndouble SalariedCommissionEmployee::earnings() const {\r\n   return SalariedEmployee::earnings() + \r\n      getGrossSales() * getCommissionRate();\r\n} \r\n\r\n// returns string representation of SalariedCommissionEmployee object\r\nstd::string SalariedCommissionEmployee::toString() const {\r\n   return std::format(\r\n      \"{}gross sales: ${:.2f}\\ncommission rate: {:.2f}\\n\",\r\n      SalariedEmployee::toString(), getGrossSales(), getCommissionRate());\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_08/SalariedCommissionEmployee.h",
    "content": "// Fig. 10.4: SalariedCommissionEmployee.h\r\n// SalariedCommissionEmployee class derived from class SalariedEmployee.\r\n#pragma once\r\n#include <string> \r\n#include <string_view> \r\n#include \"SalariedEmployee.h\" \r\n\r\nclass SalariedCommissionEmployee : public SalariedEmployee {\r\npublic:\r\n   SalariedCommissionEmployee(std::string_view name, double salary,\r\n      double grossSales, double commissionRate);\r\n\r\n   void setGrossSales(double grossSales);\r\n   double getGrossSales() const;\r\n\r\n   void setCommissionRate(double commissionRate);\r\n   double getCommissionRate() const;\r\n\r\n   double earnings() const;\r\n   std::string toString() const;\r\nprivate:\r\n   double m_grossSales{0.0};\r\n   double m_commissionRate{0.0};\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_08/SalariedEmployee.cpp",
    "content": "// Fig. 10.2: SalariedEmployee.cpp\r\n// Class SalariedEmployee member-function definitions.\r\n#include <format>\r\n#include <stdexcept>\r\n#include \"SalariedEmployee.h\" // SalariedEmployee class definition\r\n\r\n// constructor                                                        \r\nSalariedEmployee::SalariedEmployee(std::string_view name, double salary)\r\n   : m_name{name} {\r\n   setSalary(salary); \r\n}                                                                     \r\n\r\n// set name\r\nvoid SalariedEmployee::setName(std::string_view name) {\r\n   m_name = name; // should validate\r\n} \r\n\r\n// return name\r\nstd::string SalariedEmployee::getName() const {return m_name;}\r\n\r\n// set salary\r\nvoid SalariedEmployee::setSalary(double salary) {\r\n   if (salary < 0.0) {                                       \r\n      throw std::invalid_argument(\"Salary must be >= 0.0\");       \r\n   } \r\n\r\n   m_salary = salary;                                     \r\n} \r\n\r\n// return salary\r\ndouble SalariedEmployee::getSalary() const {return m_salary;}\r\n\r\n// calculate earnings                        \r\ndouble SalariedEmployee::earnings() const {return getSalary();}\r\n\r\n// return string representation of SalariedEmployee object        \r\nstd::string SalariedEmployee::toString() const {                       \r\n   return std::format(\"name: {}\\nsalary: ${:.2f}\\n\", getName(), \r\n      getSalary());\r\n}                                                                   \r\n                                                            \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_08/SalariedEmployee.h",
    "content": "// Fig. 10.1: SalariedEmployee.h\r\n// SalariedEmployee class definition.\r\n#pragma once // prevent multiple inclusions of header\r\n#include <string> \r\n#include <string_view> \r\n\r\nclass SalariedEmployee {\r\npublic:\r\n   SalariedEmployee(std::string_view name, double salary);\r\n\r\n   void setName(std::string_view name);\r\n   std::string getName() const;\r\n\r\n   void setSalary(double salary);\r\n   double getSalary() const;\r\n\r\n   double earnings() const;\r\n   std::string toString() const;\r\nprivate:\r\n   std::string m_name{};\r\n   double m_salary{0.0};\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_08/fig10_08.cpp",
    "content": "// fig10_08.cpp\r\n// Aiming a derived-class pointer at a base-class object.\r\n#include \"SalariedEmployee.h\"\r\n#include \"SalariedCommissionEmployee.h\"\r\n\r\nint main() {\r\n   SalariedEmployee salaried{\"Sierra Dembo\", 500.0};\r\n\r\n   // aim derived-class pointer at base-class object                 \r\n   // Error: a SalariedEmployee is not a SalariedCommissionEmployee\r\n   SalariedCommissionEmployee* salariedCommissionPtr{&salaried};\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_09/SalariedCommissionEmployee.cpp",
    "content": "// Fig. 10.5: SalariedCommissionEmployee.cpp\r\n// Class SalariedCommissionEmployee member-function definitions.\r\n#include <format>\r\n#include <stdexcept>\r\n#include \"SalariedCommissionEmployee.h\"\r\n\r\n// constructor\r\nSalariedCommissionEmployee::SalariedCommissionEmployee(\r\n   std::string_view name, double salary, double grossSales, \r\n   double commissionRate)\r\n   : SalariedEmployee{name, salary} { // call base-class constructor \r\n\r\n   setGrossSales(grossSales); // validate & store gross sales   \r\n   setCommissionRate(commissionRate); // validate & store commission rate\r\n}                                                              \r\n\r\n// set gross sales amount\r\nvoid SalariedCommissionEmployee::setGrossSales(double grossSales) {\r\n   if (grossSales < 0.0) {\r\n      throw std::invalid_argument(\"Gross sales must be >= 0.0\");\r\n   } \r\n\r\n   m_grossSales = grossSales;\r\n} \r\n\r\n// return gross sales amount\r\ndouble SalariedCommissionEmployee::getGrossSales() const {\r\n   return m_grossSales;\r\n}\r\n\r\n// return commission rate\r\nvoid SalariedCommissionEmployee::setCommissionRate(\r\n   double commissionRate) {\r\n\r\n   if (commissionRate <= 0.0 || commissionRate >= 1.0) {\r\n      throw std::invalid_argument(\r\n         \"Commission rate must be > 0.0 and < 1.0\");\r\n   } \r\n\r\n   m_commissionRate = commissionRate;\r\n} \r\n\r\n// get commission rate\r\ndouble SalariedCommissionEmployee::getCommissionRate() const {\r\n   return m_commissionRate;\r\n}\r\n\r\n// calculate earnings--uses SalariedEmployee::earnings()\r\ndouble SalariedCommissionEmployee::earnings() const {\r\n   return SalariedEmployee::earnings() + \r\n      getGrossSales() * getCommissionRate();\r\n} \r\n\r\n// returns string representation of SalariedCommissionEmployee object\r\nstd::string SalariedCommissionEmployee::toString() const {\r\n   return std::format(\r\n      \"{}gross sales: ${:.2f}\\ncommission rate: {:.2f}\\n\",\r\n      SalariedEmployee::toString(), getGrossSales(), getCommissionRate());\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_09/SalariedCommissionEmployee.h",
    "content": "// Fig. 10.4: SalariedCommissionEmployee.h\r\n// SalariedCommissionEmployee class derived from class SalariedEmployee.\r\n#pragma once\r\n#include <string> \r\n#include <string_view> \r\n#include \"SalariedEmployee.h\" \r\n\r\nclass SalariedCommissionEmployee : public SalariedEmployee {\r\npublic:\r\n   SalariedCommissionEmployee(std::string_view name, double salary,\r\n      double grossSales, double commissionRate);\r\n\r\n   void setGrossSales(double grossSales);\r\n   double getGrossSales() const;\r\n\r\n   void setCommissionRate(double commissionRate);\r\n   double getCommissionRate() const;\r\n\r\n   double earnings() const;\r\n   std::string toString() const;\r\nprivate:\r\n   double m_grossSales{0.0};\r\n   double m_commissionRate{0.0};\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_09/SalariedEmployee.cpp",
    "content": "// Fig. 10.2: SalariedEmployee.cpp\r\n// Class SalariedEmployee member-function definitions.\r\n#include <format>\r\n#include <stdexcept>\r\n#include \"SalariedEmployee.h\" // SalariedEmployee class definition\r\n\r\n// constructor                                                        \r\nSalariedEmployee::SalariedEmployee(std::string_view name, double salary)\r\n   : m_name{name} {\r\n   setSalary(salary); \r\n}                                                                     \r\n\r\n// set name\r\nvoid SalariedEmployee::setName(std::string_view name) {\r\n   m_name = name; // should validate\r\n} \r\n\r\n// return name\r\nstd::string SalariedEmployee::getName() const {return m_name;}\r\n\r\n// set salary\r\nvoid SalariedEmployee::setSalary(double salary) {\r\n   if (salary < 0.0) {                                       \r\n      throw std::invalid_argument(\"Salary must be >= 0.0\");       \r\n   } \r\n\r\n   m_salary = salary;                                     \r\n} \r\n\r\n// return salary\r\ndouble SalariedEmployee::getSalary() const {return m_salary;}\r\n\r\n// calculate earnings                        \r\ndouble SalariedEmployee::earnings() const {return getSalary();}\r\n\r\n// return string representation of SalariedEmployee object        \r\nstd::string SalariedEmployee::toString() const {                       \r\n   return std::format(\"name: {}\\nsalary: ${:.2f}\\n\", getName(), \r\n      getSalary());\r\n}                                                                   \r\n                                                            \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_09/SalariedEmployee.h",
    "content": "// Fig. 10.1: SalariedEmployee.h\r\n// SalariedEmployee class definition.\r\n#pragma once // prevent multiple inclusions of header\r\n#include <string> \r\n#include <string_view> \r\n\r\nclass SalariedEmployee {\r\npublic:\r\n   SalariedEmployee(std::string_view name, double salary);\r\n\r\n   void setName(std::string_view name);\r\n   std::string getName() const;\r\n\r\n   void setSalary(double salary);\r\n   double getSalary() const;\r\n\r\n   double earnings() const;\r\n   std::string toString() const;\r\nprivate:\r\n   std::string m_name{};\r\n   double m_salary{0.0};\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_09/fig10_09.cpp",
    "content": "// fig10_09.cpp\r\n// Attempting to call derived-class-only functions\r\n// via a base-class pointer.\r\n#include <string>\r\n#include \"SalariedEmployee.h\"\r\n#include \"SalariedCommissionEmployee.h\"\r\n\r\nint main() {\r\n   SalariedCommissionEmployee salariedCommission{\r\n      \"Ivano Lal\", 300.0, 5000.0, .04};\r\n   \r\n   // aim base-class pointer at derived-class object (allowed)\r\n   SalariedEmployee* salariedPtr{&salariedCommission};\r\n\r\n   // invoke base-class member functions on derived-class\r\n   // object through base-class pointer (allowed)\r\n   std::string name{salariedPtr->getName()};\r\n   double salary{salariedPtr->getSalary()};        \r\n   \r\n   // attempt to invoke derived-class-only member functions          \r\n   // on derived-class object through base-class pointer (disallowed)\r\n   double grossSales{salariedPtr->getGrossSales()};  \r\n   double commissionRate{salariedPtr->getCommissionRate()}; \r\n   salariedPtr->setGrossSales(8000.0);                      \r\n} \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_10/SalariedCommissionEmployee.cpp",
    "content": "// Fig. 10.5: SalariedCommissionEmployee.cpp\r\n// Class SalariedCommissionEmployee member-function definitions.\r\n#include <format>\r\n#include <stdexcept>\r\n#include \"SalariedCommissionEmployee.h\"\r\n\r\n// constructor\r\nSalariedCommissionEmployee::SalariedCommissionEmployee(\r\n   std::string_view name, double salary, double grossSales, \r\n   double commissionRate)\r\n   : SalariedEmployee{name, salary} { // call base-class constructor \r\n\r\n   setGrossSales(grossSales); // validate & store gross sales   \r\n   setCommissionRate(commissionRate); // validate & store commission rate\r\n}                                                              \r\n\r\n// set gross sales amount\r\nvoid SalariedCommissionEmployee::setGrossSales(double grossSales) {\r\n   if (grossSales < 0.0) {\r\n      throw std::invalid_argument(\"Gross sales must be >= 0.0\");\r\n   } \r\n\r\n   m_grossSales = grossSales;\r\n} \r\n\r\n// return gross sales amount\r\ndouble SalariedCommissionEmployee::getGrossSales() const {\r\n   return m_grossSales;\r\n}\r\n\r\n// return commission rate\r\nvoid SalariedCommissionEmployee::setCommissionRate(\r\n   double commissionRate) {\r\n\r\n   if (commissionRate <= 0.0 || commissionRate >= 1.0) {\r\n      throw std::invalid_argument(\r\n         \"Commission rate must be > 0.0 and < 1.0\");\r\n   } \r\n\r\n   m_commissionRate = commissionRate;\r\n} \r\n\r\n// get commission rate\r\ndouble SalariedCommissionEmployee::getCommissionRate() const {\r\n   return m_commissionRate;\r\n}\r\n\r\n// calculate earnings--uses SalariedEmployee::earnings()\r\ndouble SalariedCommissionEmployee::earnings() const {\r\n   return SalariedEmployee::earnings() + \r\n      getGrossSales() * getCommissionRate();\r\n} \r\n\r\n// returns string representation of SalariedCommissionEmployee object\r\nstd::string SalariedCommissionEmployee::toString() const {\r\n   return std::format(\r\n      \"{}gross sales: ${:.2f}\\ncommission rate: {:.2f}\\n\",\r\n      SalariedEmployee::toString(), getGrossSales(), getCommissionRate());\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_10/SalariedCommissionEmployee.h",
    "content": "// Fig. 10.4: SalariedCommissionEmployee.h\r\n// SalariedCommissionEmployee class derived from class SalariedEmployee.\r\n#pragma once\r\n#include <string> \r\n#include <string_view> \r\n#include \"SalariedEmployee.h\" \r\n\r\nclass SalariedCommissionEmployee : public SalariedEmployee {\r\npublic:\r\n   SalariedCommissionEmployee(std::string_view name, double salary,\r\n      double grossSales, double commissionRate);\r\n\r\n   void setGrossSales(double grossSales);\r\n   double getGrossSales() const;\r\n\r\n   void setCommissionRate(double commissionRate);\r\n   double getCommissionRate() const;\r\n\r\n   double earnings() const override;\r\n   std::string toString() const override;\r\nprivate:\r\n   double m_grossSales{0.0};\r\n   double m_commissionRate{0.0};\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_10/SalariedEmployee.cpp",
    "content": "// Fig. 10.2: SalariedEmployee.cpp\r\n// Class SalariedEmployee member-function definitions.\r\n#include <format>\r\n#include <stdexcept>\r\n#include \"SalariedEmployee.h\" // SalariedEmployee class definition\r\n\r\n// constructor                                                        \r\nSalariedEmployee::SalariedEmployee(std::string_view name, double salary)\r\n   : m_name{name} {\r\n   setSalary(salary); \r\n}                                                                     \r\n\r\n// set name\r\nvoid SalariedEmployee::setName(std::string_view name) {\r\n   m_name = name; // should validate\r\n} \r\n\r\n// return name\r\nstd::string SalariedEmployee::getName() const {return m_name;}\r\n\r\n// set salary\r\nvoid SalariedEmployee::setSalary(double salary) {\r\n   if (salary < 0.0) {                                       \r\n      throw std::invalid_argument(\"Salary must be >= 0.0\");       \r\n   } \r\n\r\n   m_salary = salary;                                     \r\n} \r\n\r\n// return salary\r\ndouble SalariedEmployee::getSalary() const {return m_salary;}\r\n\r\n// calculate earnings                        \r\ndouble SalariedEmployee::earnings() const {return getSalary();}\r\n\r\n// return string representation of SalariedEmployee object        \r\nstd::string SalariedEmployee::toString() const {                       \r\n   return std::format(\"name: {}\\nsalary: ${:.2f}\\n\", getName(), \r\n      getSalary());\r\n}                                                                   \r\n                                                            \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_10/SalariedEmployee.h",
    "content": "// Fig. 10.1: SalariedEmployee.h\r\n// SalariedEmployee class definition.\r\n#pragma once // prevent multiple inclusions of header\r\n#include <string> \r\n#include <string_view> \r\n\r\nclass SalariedEmployee {\r\npublic:\r\n   SalariedEmployee(std::string_view name, double salary);\r\n\r\n   void setName(std::string_view name);\r\n   std::string getName() const;\r\n\r\n   void setSalary(double salary);\r\n   double getSalary() const;\r\n\r\n   virtual double earnings() const;\r\n   virtual std::string toString() const;\r\nprivate:\r\n   std::string m_name{};\r\n   double m_salary{0.0};\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_10/fig10_10.cpp",
    "content": "// fig10_10.cpp\r\n// Introducing polymorphism, virtual functions and dynamic binding.\r\n#include <format>\r\n#include <iostream>\r\n#include \"SalariedEmployee.h\"\r\n#include \"SalariedCommissionEmployee.h\" \r\n\r\nint main() {\r\n   // create base-class object\r\n   SalariedEmployee salaried{\"Sierra Dembo\", 500.0};\r\n\r\n   // create derived-class object\r\n   SalariedCommissionEmployee salariedCommission{\r\n      \"Ivano Lal\", 300.0, 5000.0, .04};\r\n\r\n   // output objects using static binding\r\n   std::cout << std::format(\"{}\\n{}:\\n{}\\n{}\\n\",\r\n      \"INVOKING TOSTRING FUNCTION ON BASE-CLASS AND\",\r\n      \"DERIVED-CLASS OBJECTS WITH STATIC BINDING\",\r\n      salaried.toString(), // static binding\r\n      salariedCommission.toString()); // static binding\r\n\r\n   std::cout << \"INVOKING TOSTRING FUNCTION ON BASE-CLASS AND\\n\"\r\n      << \"DERIVED-CLASS OBJECTS WITH DYNAMIC BINDING\\n\\n\";\r\n\r\n   // natural: aim base-class pointer at base-class object        \r\n   SalariedEmployee* salariedPtr{&salaried};\r\n   std::cout << std::format(\"{}\\n{}:\\n{}\\n\",\r\n      \"CALLING VIRTUAL FUNCTION TOSTRING WITH BASE-CLASS POINTER\",\r\n      \"TO BASE-CLASS OBJECT INVOKES BASE-CLASS FUNCTIONALITY\",\r\n      salariedPtr->toString()); // base-class version\r\n\r\n   // natural: aim derived-class pointer at derived-class object\r\n   SalariedCommissionEmployee* salariedCommissionPtr{&salariedCommission};\r\n   std::cout << std::format(\"{}\\n{}:\\n{}\\n\",\r\n      \"CALLING VIRTUAL FUNCTION TOSTRING WITH DERIVED-CLASS POINTER\",\r\n      \"TO DERIVED-CLASS OBJECT INVOKES DERIVED-CLASS FUNCTIONALITY\",\r\n      salariedCommissionPtr->toString()); // derived-class version\r\n\r\n   // aim base-class pointer at derived-class object\r\n   salariedPtr = &salariedCommission;\r\n\r\n   // runtime polymorphism: invokes SalariedCommissionEmployee\r\n   // via base-class pointer to derived-class object  \r\n   std::cout << std::format(\"{}\\n{}:\\n{}\\n\",\r\n      \"CALLING VIRTUAL FUNCTION TOSTRING WITH BASE-CLASS POINTER\",\r\n      \"TO DERIVED-CLASS OBJECT INVOKES DERIVED-CLASS FUNCTIONALITY\",\r\n      salariedPtr->toString()); // derived-class version\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_11-17/CommissionEmployee.cpp",
    "content": "// Fig. 10.16: CommissionEmployee.cpp\r\n// CommissionEmployee class member-function definitions.\r\n#include <format>\r\n#include <stdexcept>\r\n#include \"CommissionEmployee.h\" // CommissionEmployee class definition\r\n\r\n// constructor                                                        \r\nCommissionEmployee::CommissionEmployee(std::string_view name, \r\n   double grossSales, double commissionRate) : Employee{name} {\r\n   setGrossSales(grossSales); \r\n   setCommissionRate(commissionRate); \r\n}                                      \r\n\r\n// set gross sales amount\r\nvoid CommissionEmployee::setGrossSales(double grossSales) {\r\n   if (grossSales < 0.0) {\r\n      throw std::invalid_argument(\"Gross sales must be >= 0.0\");\r\n   } \r\n\r\n   m_grossSales = grossSales;\r\n} \r\n\r\n// return gross sales amount\r\ndouble CommissionEmployee::getGrossSales() const {return m_grossSales;}\r\n\r\n// set commission rate\r\nvoid CommissionEmployee::setCommissionRate(double commissionRate) {\r\n   if (commissionRate <= 0.0 || commissionRate >= 1.0) {\r\n      throw std::invalid_argument(\r\n         \"Commission rate must be > 0.0 and < 1.0\");\r\n   } \r\n\r\n   m_commissionRate = commissionRate;\r\n} \r\n\r\n// return commission rate\r\ndouble CommissionEmployee::getCommissionRate() const {\r\n   return m_commissionRate;\r\n} \r\n\r\n// calculate earnings                        \r\ndouble CommissionEmployee::earnings() const {\r\n   return getGrossSales() * getCommissionRate();\r\n}                                            \r\n\r\n// return string representation of CommissionEmployee object        \r\nstd::string CommissionEmployee::toString() const {                       \r\n   return std::format(\"{}\\n{}: ${:.2f}\\n{}: {:.2f}\", Employee::toString(),\r\n      \"gross sales\", getGrossSales(),\r\n      \"commission rate\", getCommissionRate());                  \r\n}                                                                   \r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_11-17/CommissionEmployee.h",
    "content": "// Fig. 10.15: CommissionEmployee.h\r\n// CommissionEmployee class derived from Employee.\r\n#pragma once\r\n#include <string> \r\n#include <string_view> \r\n#include \"Employee.h\" // Employee class definition\r\n\r\nclass CommissionEmployee final : public Employee {\r\npublic:\r\n   CommissionEmployee(std::string_view name, double grossSales,\r\n      double commissionRate);\r\n   virtual ~CommissionEmployee() = default; // virtual destructor\r\n\r\n   void setGrossSales(double grossSales);\r\n   double getGrossSales() const;\r\n\r\n   void setCommissionRate(double commissionRate);\r\n   double getCommissionRate() const;\r\n\r\n   // keyword override signals intent to override                 \r\n   double earnings() const override; // calculate earnings        \r\n   std::string toString() const override; // string representation\r\nprivate:\r\n   double m_grossSales{0.0};\r\n   double m_commissionRate{0.0};\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_11-17/Employee.cpp",
    "content": "// Fig. 10.12: Employee.cpp\r\n// Abstract-base-class Employee member-function definitions.\r\n// Note: No definitions are given for pure virtual functions.\r\n#include <format>\r\n#include \"Employee.h\" // Employee class definition\r\n\r\n// constructor                                                        \r\nEmployee::Employee(std::string_view name) : m_name{name} {} // empty body\r\n\r\n// set name\r\nvoid Employee::setName(std::string_view name) {m_name = name;}\r\n\r\n// get name\r\nstd::string Employee::getName() const {return m_name;}\r\n\r\n// return string representation of an Employee\r\nstd::string Employee::toString() const {                       \r\n   return std::format(\"name: {}\", getName());\r\n}                                                                   \r\n                                                                                                                 \r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_11-17/Employee.h",
    "content": "// Fig. 10.11: Employee.h\r\n// Employee abstract base class.\r\n#pragma once // prevent multiple inclusions of header\r\n#include <string> \r\n#include <string_view> \r\n\r\nclass Employee {\r\npublic:\r\n   explicit Employee(std::string_view name);\r\n   virtual ~Employee() = default; // compiler generates virtual destructor\r\n\r\n   void setName(std::string_view name);\r\n   std::string getName() const;\r\n\r\n   // pure virtual function makes Employee an abstract base class\r\n   virtual double earnings() const = 0; // pure virtual\r\n   virtual std::string toString() const; // virtual\r\nprivate:\r\n   std::string m_name;\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_11-17/SalariedEmployee.cpp",
    "content": "// Fig. 10.14: SalariedEmployee.cpp\r\n// SalariedEmployee class member-function definitions.\r\n#include <format>\r\n#include <stdexcept>\r\n#include \"SalariedEmployee.h\" // SalariedEmployee class definition\r\n\r\n// constructor \r\nSalariedEmployee::SalariedEmployee(std::string_view name, double salary)\r\n   : Employee{name} {\r\n   setSalary(salary); \r\n} \r\n\r\n// set salary\r\nvoid SalariedEmployee::setSalary(double salary) {\r\n   if (salary < 0.0) {\r\n      throw std::invalid_argument(\"Weekly salary must be >= 0.0\");\r\n   } \r\n\r\n   m_salary = salary;\r\n} \r\n\r\n// return salary\r\ndouble SalariedEmployee::getSalary() const {return m_salary;}\r\n\r\n// calculate earnings; \r\n// override pure virtual function earnings in Employee\r\ndouble SalariedEmployee::earnings() const {return getSalary();}\r\n\r\n// return a string representation of SalariedEmployee\r\nstd::string SalariedEmployee::toString() const {\r\n   return std::format(\"{}\\n{}: ${:.2f}\", Employee::toString(), \r\n      \"salary\", getSalary());\r\n} \r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_11-17/SalariedEmployee.h",
    "content": "// Fig. 10.13: SalariedEmployee.h\r\n// SalariedEmployee class derived from Employee.\r\n#pragma once\r\n#include <string> // C++ standard string class\r\n#include <string_view> \r\n#include \"Employee.h\" // Employee class definition\r\n\r\nclass SalariedEmployee final : public Employee {\r\npublic:\r\n   SalariedEmployee(std::string_view name, double salary);\r\n   virtual ~SalariedEmployee() = default; // virtual destructor\r\n\r\n   void setSalary(double salary);\r\n   double getSalary() const;\r\n\r\n   // keyword override signals intent to override               \r\n   double earnings() const override; // calculate earnings        \r\n   std::string toString() const override; // string representation\r\nprivate:\r\n   double m_salary{0.0};\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_11-17/fig10_17.cpp",
    "content": "// fig10_17.cpp\r\n// Processing Employee derived-class objects with variable-name handles \r\n// then polymorphically using base-class pointers and references\r\n#include <format>\r\n#include <iostream>\r\n#include <vector>\r\n#include \"Employee.h\"\r\n#include \"SalariedEmployee.h\" \r\n#include \"CommissionEmployee.h\"  \r\n\r\nvoid virtualViaPointer(const Employee* baseClassPtr); // prototype\r\nvoid virtualViaReference(const Employee& baseClassRef); // prototype\r\n\r\nint main() {\r\n   // create derived-class objects                        \r\n   SalariedEmployee salaried{\"Pierre Simon\", 800.0};\r\n   CommissionEmployee commission{\"Sierra Dembo\", 10000, .06};\r\n\r\n   // output each Employee\r\n   std::cout << \"EMPLOYEES PROCESSED INDIVIDUALLY VIA VARIABLE NAMES\\n\"\r\n      << std::format(\"{}\\n{}{:.2f}\\n\\n{}\\n{}{:.2f}\\n\\n\",\r\n            salaried.toString(), \"earned $\", salaried.earnings(),\r\n            commission.toString(), \"earned $\", commission.earnings());\r\n\r\n   // create and initialize vector of base-class pointers        \r\n   std::vector<Employee*> employees{&salaried, &commission};\r\n\r\n   std::cout << \"EMPLOYEES PROCESSED POLYMORPHICALLY VIA\"\r\n      << \" DYNAMIC BINDING\\n\\n\";\r\n\r\n   // call virtualViaPointer to print each Employee\r\n   // and earnings using dynamic binding\r\n   std::cout << \"VIRTUAL FUNCTION CALLS MADE VIA BASE-CLASS POINTERS\\n\";\r\n\r\n   for (const Employee* employeePtr : employees) {\r\n      virtualViaPointer(employeePtr);\r\n   }\r\n\r\n   // call virtualViaReference to print each Employee\r\n   // and earnings using dynamic binding\r\n   std::cout << \"VIRTUAL FUNCTION CALLS MADE VIA BASE-CLASS REFERENCES\\n\";\r\n\r\n   for (const Employee* employeePtr : employees) {\r\n      virtualViaReference(*employeePtr); // note dereferenced pointer\r\n   }\r\n}\r\n\r\n// call Employee virtual functions toString and earnings via a   \r\n// base-class pointer using dynamic binding                   \r\nvoid virtualViaPointer(const Employee* baseClassPtr) {\r\n   std::cout << std::format(\"{}\\nearned ${:.2f}\\n\\n\",\r\n      baseClassPtr->toString(), baseClassPtr->earnings());\r\n}\r\n\r\n// call Employee virtual functions toString and earnings via a  \r\n// base-class reference using dynamic binding                \r\nvoid virtualViaReference(const Employee& baseClassRef) {\r\n   std::cout << std::format(\"{}\\nearned ${:.2f}\\n\\n\",\r\n      baseClassRef.toString(), baseClassRef.earnings());\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_19-26/Commission.cpp",
    "content": "// Fig. 10.25: Commission.cpp\r\n// Commission member-function definitions.\r\n#include <format>\r\n#include <stdexcept>\r\n#include \"Commission.h\" // class definition\r\n\r\n// constructor                                                        \r\nCommission::Commission(double grossSales, double commissionRate)         \r\n   : m_grossSales{grossSales}, m_commissionRate{commissionRate} {\r\n\r\n   if (m_grossSales < 0.0) {\r\n      throw std::invalid_argument(\"Gross sales must be >= 0.0\");\r\n   } \r\n\r\n   if (m_commissionRate <= 0.0 || m_commissionRate >= 1.0) {\r\n      throw std::invalid_argument(\r\n         \"Commission rate must be > 0.0 and < 1.0\");\r\n   } \r\n}                                      \r\n\r\n// override CompensationModel pure virtual function earnings\r\ndouble Commission::earnings() const {\r\n   return m_grossSales * m_commissionRate;       \r\n}                                            \r\n\r\n// override CompensationModel pure virtual function toString  \r\nstd::string Commission::toString() const {                       \r\n   return std::format(\"gross sales: ${:.2f}; commission rate: {:.2f}\", \r\n      m_grossSales, m_commissionRate);\r\n}       \r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_19-26/Commission.h",
    "content": "// Fig. 10.24: Commission.h\r\n// Commission implements the CompensationModel interface.\r\n#pragma once\r\n#include <string> \r\n#include \"CompensationModel.h\" // CompensationModel definition\r\n\r\nclass Commission final : public CompensationModel {\r\npublic:\r\n   Commission(double grossSales, double commissionRate);\r\n   double earnings() const override;\r\n   std::string toString() const override;\r\nprivate:\r\n   double m_grossSales{0.0};\r\n   double m_commissionRate{0.0};\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_19-26/CompensationModel.h",
    "content": "// Fig. 10.19: CompensationModel.h\r\n// CompensationModel \"interface\" is a pure abstract base class.\r\n#pragma once // prevent multiple inclusions of header\r\n#include <string> \r\n\r\nclass CompensationModel {\r\npublic:\r\n   virtual ~CompensationModel() = default; // generated destructor \r\n   virtual double earnings() const = 0; // pure virtual\r\n   virtual std::string toString() const = 0; // pure virtual              \r\n};\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_19-26/Employee.cpp",
    "content": "// Fig. 10.21: Employee.cpp\r\n// Class Employee member-function definitions.\r\n#include <format> \r\n#include <string> \r\n#include \"CompensationModel.h\"\r\n#include \"Employee.h\" \r\n\r\n// constructor performs \"constructor injection\" to initialize  \r\n// the CompensationModel pointer to a CompensationModel implementation \r\nEmployee::Employee(std::string_view name, CompensationModel* modelPtr)\r\n   : m_name{name}, m_modelPtr{modelPtr} {}\r\n\r\n// set function performs \"property injection\" to change the   \r\n// CompensationModel pointer to a new CompensationModel implementation \r\nvoid Employee::setCompensationModel(CompensationModel* modelPtr) {\r\n   m_modelPtr = modelPtr;\r\n}\r\n\r\n// use the CompensationModel to calculate the Employee's earnings\r\ndouble Employee::earnings() const {\r\n   return m_modelPtr->earnings();\r\n}; \r\n\r\n// return string representation of Employee object        \r\nstd::string Employee::toString() const {                       \r\n   return std::format(\"{}\\n{}\", m_name, m_modelPtr->toString());\r\n}                    \r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_19-26/Employee.h",
    "content": "// Fig. 10.20: Employee.h\r\n// An Employee \"has a\" CompensationModel.\r\n#pragma once // prevent multiple inclusions of header\r\n#include <string> \r\n#include <string_view> \r\n#include \"CompensationModel.h\"\r\n\r\nclass Employee final {\r\npublic:\r\n   Employee(std::string_view name, CompensationModel* modelPtr);\r\n   void setCompensationModel(CompensationModel* modelPtr);\r\n   double earnings() const;\r\n   std::string toString() const;\r\nprivate:\r\n   std::string m_name{};\r\n   CompensationModel* m_modelPtr{}; // pointer to an implementation object\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_19-26/Salaried.cpp",
    "content": "// Fig. 10.23: Salaried.cpp\r\n// Salaried compensation model member-function definitions.\r\n#include <format>\r\n#include <stdexcept>\r\n#include \"Salaried.h\" // class definition\r\n\r\n// constructor \r\nSalaried::Salaried(double salary) : m_salary{salary} {\r\n   if (m_salary < 0.0) {\r\n      throw std::invalid_argument(\"Weekly salary must be >= 0.0\");\r\n   } \r\n} \r\n\r\n// override CompensationModel pure virtual function earnings\r\ndouble Salaried::earnings() const {return m_salary;}\r\n\r\n// override CompensationModel pure virtual function toString  \r\nstd::string Salaried::toString() const {\r\n   return std::format(\"salary: ${:.2f}\", m_salary);\r\n} \r\n\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_19-26/Salaried.h",
    "content": "// Fig. 10.22: Salaried.h\r\n// Salaried implements the CompensationModel interface.\r\n#pragma once\r\n#include <string> \r\n#include \"CompensationModel.h\" // CompensationModel definition\r\n\r\nclass Salaried final : public CompensationModel {\r\npublic:\r\n   explicit Salaried(double salary);\r\n   double earnings() const override;\r\n   std::string toString() const override;\r\nprivate:\r\n   double m_salary{0.0};\r\n};\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson10/fig10_19-26/fig10_26.cpp",
    "content": "// fig10_26.cpp\r\n// Processing Employees with various CompensationModels.\r\n#include <format>\r\n#include <iostream>\r\n#include <vector>\r\n#include \"Employee.h\"\r\n#include \"Salaried.h\" \r\n#include \"Commission.h\"  \r\n\r\nint main() {\r\n   // create CompensationModels and Employees\r\n   Salaried salaried{800.0};\r\n   Employee salariedEmployee{\"Pierre Simon\", &salaried};\r\n\r\n   Commission commission{10000, .06};\r\n   Employee commissionEmployee{\"Sierra Dembo\", &commission};\r\n\r\n   // create and initialize vector of Employees\r\n   std::vector employees{salariedEmployee, commissionEmployee};\r\n\r\n   // print each Employee's information and earnings \r\n   for (const Employee& employee : employees) {\r\n      std::cout << std::format(\"{}\\nearned: ${:.2f}\\n\\n\",\r\n         employee.toString(), employee.earnings());\r\n   }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson11/fig11_01/fig11_01.cpp",
    "content": "// fig11_01.cpp\r\n// Standard library string class test program.\r\n#include <iostream>\r\n#include <string> \r\n#include <string_view> \r\n#include \"fmt/format.h\" // in C++20, this will be #include <format>\r\nusing namespace std;\r\n\r\nint main() {\r\n   string s1{\"happy\"}; // initialize string from char*\r\n   string s2{\" birthday\"}; // initialize string from char*\r\n   string s3; // creates an empty string\r\n   string_view v{\"hello\"}; // initialize string_view from char*\r\n\r\n   // output strings and string_view\r\n   cout << fmt::format(\"s1: \\\"{}\\\"; s2: \\\"{}\\\"; s3: \\\"{}\\\"; v: \\\"{}\\\"\\n\\n\",\r\n              s1, s2, s3, v);\r\n\r\n   // test overloaded equality and relational operators\r\n   cout << \"The results of comparing s2 and s1:\\n\"   \r\n      << fmt::format(\"s2 == s1: {}\\n\", s2 == s1)\r\n      << fmt::format(\"s2 != s1: {}\\n\", s2 != s1)\r\n      << fmt::format(\"s2 > s1: {}\\n\", s2 > s1)\r\n      << fmt::format(\"s2 < s1: {}\\n\", s2 < s1)\r\n      << fmt::format(\"s2 >= s1: {}\\n\", s2 >= s1)\r\n      << fmt::format(\"s2 <= s1: {}\\n\\n\", s2 <= s1);\r\n      \r\n   // test string member function empty \r\n   cout << \"Testing s3.empty():\\n\";\r\n\r\n   if (s3.empty()) {\r\n      cout << \"s3 is empty; assigning s1 to s3;\\n\";\r\n      s3 = s1; // assign s1 to s3\r\n      cout << fmt::format(\"s3 is \\\"{}\\\"\\n\\n\", s3);\r\n   } \r\n\r\n   // test overloaded string concatenation assignment operator\r\n   s1 += s2; // test overloaded concatenation\r\n   cout << fmt::format(\"s1 += s2 yields s1 = {}\\n\\n\", s1);\r\n\r\n   // test string concatenation with a C string\r\n   s1 += \" to you\";  \r\n   cout << fmt::format(\"s1 += \\\" to you\\\" yields s1 = {}\\n\\n\", s1);\r\n\r\n   // test string concatenation with a C++14 string-object literal\r\n   s1 += \", have a great day!\"s; // s after \" for string-object literal\r\n   cout << fmt::format(\r\n              \"s1 += \\\", have a great day!\\\"s yields\\ns1 = {}\\n\\n\", s1);\r\n\r\n   // test string member function substr\r\n   cout << fmt::format(\"{} {}\\n{}\\n\\n\",\r\n              \"The substring of s1 starting at location 0 for\",\r\n              \"14 characters, s1.substr(0, 14), is:\", s1.substr(0, 14));\r\n\r\n   // test substr \"to-end-of-string\" option\r\n   cout << fmt::format(\"{} {}\\n{}\\n\\n\",\r\n              \"The substring of s1 starting at\",\r\n              \"location 15, s1.substr(15), is:\", s1.substr(15)); \r\n\r\n   // test copy constructor\r\n   string s4{s1};\r\n   cout << fmt::format(\"s4 = {}\\n\\n\", s4);\r\n\r\n   // test overloaded copy assignment (=) operator with self-assignment\r\n   cout << \"assigning s4 to s4\\n\";\r\n   s4 = s4;\r\n   cout << fmt::format(\"s4 = {}\\n\\n\", s4);\r\n\r\n   // test string's string_view constructor\r\n   cout << \"initializing s5 with string_view v\\n\";\r\n   string s5{v};\r\n   cout << fmt::format(\"s5 is {}\\n\\n\", s5);\r\n\r\n   // test using overloaded subscript operator to create lvalue\r\n   s1[0] = 'H';\r\n   s1[6] = 'B';\r\n   cout << fmt::format(\"{}:\\n{}\\n\\n\", \r\n              \"after s1[0] = 'H' and s1[6] = 'B', s1 is\", s1);\r\n\r\n   // test index out of range with string member function \"at\"   \r\n   try {                                                              \r\n      cout << \"Attempt to assign 'd' to s1.at(100) yields:\\n\";\r\n      s1.at(100) = 'd'; // ERROR: subscript out of range            \r\n   } \r\n   catch (const out_of_range& ex) {                                       \r\n      cout << fmt::format(\"An exception occurred: {}\\n\", ex.what());        \r\n   }\r\n} \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2017 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson11/fig11_02/fig11_02.cpp",
    "content": "// fig11_02.cpp\r\n// Demonstrating unique_ptr.\r\n#include <iostream>\r\n#include <memory>\r\nusing namespace std;\r\n\r\nclass Integer {\r\npublic:\r\n   // constructor\r\n   Integer(int i) : value{i} {\r\n      cout << \"Constructor for Integer \" << value << \"\\n\";\r\n   }\r\n\r\n   // destructor\r\n   ~Integer() {\r\n      cout << \"Destructor for Integer \" << value << \"\\n\";\r\n   }\r\n\r\n   int getValue() const {return value;} // return Integer value\r\nprivate:\r\n   int value{0};\r\n};\r\n\r\n// use unique_ptr to manipulate Integer object\r\nint main() {\r\n   cout << \"Creating a unique_ptr object that points to an Integer\\n\";\r\n\r\n   // create a unique_ptr object and \"aim\" it at a new Integer object \r\n   auto ptr{make_unique<Integer>(7)};\r\n\r\n   // use unique_ptr to call an Integer member function\r\n   cout << \"Integer value: \" << ptr->getValue()\r\n      << \"\\n\\nMain ends\\n\";\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2017 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson11/fig11_03-05/MyArray.cpp",
    "content": "// Fig. 11.5: MyArray.cpp\r\n// MyArray class member- and friend-function definitions.\r\n#include <algorithm>\r\n#include <initializer_list>\r\n#include <iostream>\r\n#include <memory>\r\n#include <span>\r\n#include <sstream> \r\n#include <stdexcept>\r\n#include <utility>\r\n#include \"fmt/format.h\" // In C++20, this will be #include <format> \r\n#include \"MyArray.h\" // MyArray class definition\r\nusing namespace std;\r\n\r\n// MyArray constructor to create a MyArray of size elements containing 0\r\nMyArray::MyArray(size_t size) \r\n   : m_size{size}, m_ptr{make_unique<int[]>(size)} {\r\n   cout << \"MyArray(size_t) constructor\\n\";\r\n}\r\n\r\n// MyArray constructor that accepts an initializer list\r\nMyArray::MyArray(initializer_list<int> list)\r\n   : m_size{list.size()}, m_ptr{make_unique<int[]>(list.size())} {\r\n   cout << \"MyArray(initializer_list) constructor\\n\";\r\n\r\n   // copy list argument's elements into m_ptr's underlying int array;\r\n   // m_ptr.get() returns the int array's starting memory location\r\n   copy(begin(list), end(list), m_ptr.get());\r\n}\r\n\r\n// copy constructor: must receive a reference to a MyArray\r\nMyArray::MyArray(const MyArray& original)\r\n   : m_size{original.size()}, m_ptr{make_unique<int[]>(original.size())} {\r\n   cout << \"MyArray copy constructor\\n\";\r\n\r\n   // copy original's elements into m_ptr's underlying int array \r\n   const span<const int> source{original.m_ptr.get(), original.size()};\r\n   copy(begin(source), end(source), m_ptr.get());\r\n}\r\n\r\n// copy assignment operator: implemented with copy-and-swap idiom\r\nMyArray& MyArray::operator=(const MyArray& right) {\r\n   cout << \"MyArray copy assignment operator\\n\";\r\n   MyArray temp{right}; // invoke copy constructor\r\n   swap(*this, temp); // exchange contents of this object and temp\r\n   return *this;\r\n}\r\n\r\n// move constructor: must receive an rvalue reference to a MyArray                      \r\nMyArray::MyArray(MyArray&& original) noexcept\r\n   : m_size{exchange(original.m_size, 0)}, \r\n     m_ptr{std::move(original.m_ptr)} {  // move original.m_ptr into m_ptr\r\n   cout << \"MyArray move constructor\\n\";\r\n}\r\n\r\n// move assignment operator\r\nMyArray& MyArray::operator=(MyArray&& right) noexcept {\r\n   cout << \"MyArray move assignment operator\\n\";\r\n\r\n   if (this != &right) { // avoid self-assignment  \r\n      // move right's data into this MyArray\r\n      m_size = std::exchange(right.m_size, 0); // indicate right is empty\r\n      m_ptr = std::move(right.m_ptr);\r\n   }\r\n\r\n   return *this; // enables x = y = z, for example                    \r\n}\r\n\r\n// destructor: This could be compiler-generated. We included it here so\r\n// we could output when each MyArray is destroyed.\r\nMyArray::~MyArray() {\r\n   cout << \"MyArray destructor\\n\";\r\n}\r\n\r\n// return a string representation of a MyArray\r\nstring MyArray::toString() const {\r\n   const span<const int> items{m_ptr.get(), m_size};\r\n   ostringstream output;\r\n   output << \"{\";\r\n   \r\n   // insert each item in the dynamic array into the ostringstream\r\n   for (size_t count{0}; const auto& item : items) {\r\n      ++count;\r\n      output << item << (count < m_size ? \", \" : \"\");\r\n   }\r\n\r\n   output << \"}\";\r\n   return output.str();\r\n}\r\n\r\n// determine if two MyArrays are equal and\r\n// return true, otherwise return false\r\nbool MyArray::operator==(const MyArray& right) const noexcept {\r\n   // compare corresponding elements of both MyArrays\r\n   const span<const int> lhs{m_ptr.get(), size()};\r\n   const span<const int> rhs{right.m_ptr.get(), right.size()};\r\n   return equal(begin(lhs), end(lhs), begin(rhs), end(rhs));\r\n} \r\n\r\n// overloaded subscript operator for non-const MyArrays;\r\n// reference return creates a modifiable lvalue\r\nint& MyArray::operator[](size_t index) {\r\n   // check for index out-of-range error\r\n   if (index >= m_size) {\r\n      throw out_of_range{\"Index out of range\"};\r\n   }\r\n\r\n   return m_ptr[index]; // reference return\r\n} \r\n\r\n// overloaded subscript operator for const MyArrays;\r\n// const reference return creates a non-modifiable lvalue\r\nconst int& MyArray::operator[](size_t index) const {\r\n   // check for subscript out-of-range error\r\n   if (index >= m_size) {\r\n      throw out_of_range{\"Index out of range\"};\r\n   }\r\n\r\n   return m_ptr[index]; // returns copy of this element\r\n} \r\n\r\n// preincrement every element, then return updated MyArray  \r\nMyArray& MyArray::operator++() {\r\n   // use a span and for_each to increment every element \r\n   const span<int> items{m_ptr.get(), m_size};\r\n   for_each(begin(items), end(items), [](auto& item){++item;});\r\n   return *this; \r\n}\r\n\r\n// postincrement every element, and return copy of original MyArray  \r\nMyArray MyArray::operator++(int) {\r\n   MyArray temp(*this);\r\n   ++(*this); // call preincrement operator++ to do the incrementing\r\n   return temp; // return the temporary copy made before incrementing\r\n}\r\n\r\n// add value to every element, then return updated MyArray\r\nMyArray& MyArray::operator+=(int value) {\r\n   // use a span and for_each to increment every element \r\n   const span<int> items{m_ptr.get(), m_size};\r\n   for_each(begin(items), end(items), \r\n      [value](auto& item) {item += value;});\r\n   return *this;\r\n}\r\n\r\n// overloaded input operator for class MyArray;\r\n// inputs values for entire MyArray\r\nistream& operator>>(istream& in, MyArray& a) {\r\n   span<int> items{a.m_ptr.get(), a.m_size};\r\n\r\n   for (auto& item : items) {\r\n      in >> item;\r\n   }\r\n\r\n   return in; // enables cin >> x >> y;\r\n} \r\n\r\n// overloaded output operator for class MyArray \r\nostream& operator<<(ostream& out, const MyArray& a) {\r\n   out << a.toString();\r\n   return out; // enables cout << x << y;\r\n} \r\n\r\n// swap function used to implement copy-and-swap copy assignment operator\r\nvoid swap(MyArray& a, MyArray& b) noexcept {\r\n   std::swap(a.m_size, b.m_size); // swap using std::swap\r\n   a.m_ptr.swap(b.m_ptr); // swap using unique_ptr swap member function\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2017 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson11/fig11_03-05/MyArray.h",
    "content": "// Fig. 11.4: MyArray.h\r\n// MyArray class definition with overloaded operators.\r\n#pragma once\r\n#include <initializer_list>\r\n#include <iostream>\r\n#include <memory>\r\n\r\nclass MyArray final {\r\n   // overloaded stream extraction operator\r\n   friend std::istream& operator>>(std::istream& in, MyArray& a);\r\n\r\n   // used by copy assignment operator to implement copy-and-swap idiom\r\n   friend void swap(MyArray& a, MyArray& b) noexcept;\r\n\r\npublic:\r\n   explicit MyArray(size_t size); // construct a MyArray of size elements\r\n\r\n   // construct a MyArray with a braced-initializer list of ints\r\n   explicit MyArray(std::initializer_list<int> list);\r\n\r\n   MyArray(const MyArray& original); // copy constructor\r\n   MyArray& operator=(const MyArray& right); // copy assignment operator\r\n\r\n   MyArray(MyArray&& original) noexcept; // move constructor\r\n   MyArray& operator=(MyArray&& right) noexcept; // move assignment\r\n\r\n   ~MyArray(); // destructor                 \r\n\r\n   size_t size() const noexcept {return m_size;}; // return size\r\n   std::string toString() const; // create string representation\r\n\r\n   // equality operator; compiler autogenerates !=\r\n   bool operator==(const MyArray& right) const noexcept; \r\n\r\n   // subscript operator for non-const objects returns modifiable lvalue\r\n   int& operator[](size_t index);\r\n\r\n   // subscript operator for const objects returns non-modifiable lvalue\r\n   const int& operator[](size_t index) const;\r\n\r\n   // convert MyArray to a bool value: true if non-empty; false if empty\r\n   explicit operator bool() const noexcept {return size() != 0;}\r\n   \r\n   // preincrement every element, then return updated MyArray  \r\n   MyArray& operator++();      \r\n\r\n   // postincrement every element, and return copy of original MyArray  \r\n   MyArray operator++(int); // postfix increment operator\r\n\r\n   // add value to every element, then return updated MyArray\r\n   MyArray& operator+=(int value);\r\nprivate:\r\n   size_t m_size{0}; // pointer-based array size\r\n   std::unique_ptr<int[]> m_ptr; // smart pointer to integer array\r\n};\r\n\r\n// overloaded operator<< is not a friend--does not access private data\r\nstd::ostream& operator<<(std::ostream& out, const MyArray& a);\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson11/fig11_03-05/fig11_03.cpp",
    "content": "// fig11_03.cpp\r\n// MyArray class test program.\r\n#include <iostream>\r\n#include <stdexcept>\r\n#include <utility> // for std::move\r\n#include \"MyArray.h\"\r\nusing namespace std;\r\n\r\n// function to return a MyArray by value\r\nMyArray getArrayByValue() {\r\n   MyArray localInts{10, 20, 30}; // create three-element MyArray\r\n   return localInts; // return by value creates an rvalue\r\n}\r\n\r\nint main() {\r\n   MyArray ints1(7); // 7-element MyArray; note () rather than {}\r\n   MyArray ints2(10); // 10-element MyArray; note () rather than {}\r\n\r\n   // print ints1 size and contents\r\n   cout << \"\\nints1 size: \" << ints1.size()\r\n      << \"\\ncontents: \" << ints1; // uses overloaded <<\r\n\r\n   // print ints2 size and contents\r\n   cout << \"\\n\\nints2 size: \" << ints2.size()\r\n      << \"\\ncontents: \" << ints2; // uses overloaded <<\r\n\r\n   // input and print ints1 and ints2\r\n   cout << \"\\n\\nEnter 17 integers: \";\r\n   cin >> ints1 >> ints2; // uses overloaded >>\r\n\r\n   cout << \"\\nints1: \" << ints1 << \"\\nints2: \" << ints2;\r\n\r\n   // use overloaded inequality (!=) operator\r\n   cout << \"\\n\\nEvaluating: ints1 != ints2\\n\";\r\n\r\n   if (ints1 != ints2) {\r\n      cout << \"ints1 and ints2 are not equal\\n\\n\";\r\n   }\r\n\r\n   // create MyArray ints3 by copying ints1      \r\n   MyArray ints3{ints1}; // invokes copy constructor \r\n\r\n   // print ints3 size and contents                \r\n   cout << \"\\nints3 size: \" << ints3.size() << \"\\ncontents: \" << ints3;\r\n\r\n   // use overloaded copy assignment (=) operator\r\n   cout << \"\\n\\nAssigning ints2 to ints1:\\n\";\r\n   ints1 = ints2; // note target MyArray is smaller\r\n  \r\n   cout << \"\\nints1: \" << ints1 << \"\\nints2: \" << ints2;\r\n\r\n   // use overloaded equality (==) operator\r\n   cout << \"\\n\\nEvaluating: ints1 == ints2\\n\";\r\n\r\n   if (ints1 == ints2) { \r\n      cout << \"ints1 and ints2 are equal\\n\\n\";\r\n   }\r\n\r\n   // use overloaded subscript operator to create an rvalue\r\n   cout << \"ints1[5] is \" << ints1[5];\r\n\r\n   // use overloaded subscript operator to create an lvalue\r\n   cout << \"\\n\\nAssigning 1000 to ints1[5]\\n\";\r\n   ints1[5] = 1000;\r\n   cout << \"ints1: \" << ints1;\r\n\r\n   // attempt to use out-of-range subscript\r\n   try {                                                              \r\n      cout << \"\\n\\nAttempt to assign 1000 to ints1[15]\\n\";\r\n      ints1[15] = 1000; // ERROR: subscript out of range\r\n   } \r\n   catch (const out_of_range& ex) {                                       \r\n      cout << \"An exception occurred: \" << ex.what() << \"\\n\";\r\n   } \r\n\r\n   // initialize ints4 with contents of the MyArray returned by \r\n   // getArrayByValue; print size and contents\r\n   cout << \"\\nInitialize ints4 with temporary MyArray object\\n\";\r\n   MyArray ints4{getArrayByValue()}; \r\n\r\n   cout << \"\\nints4 size: \" << ints4.size() << \"\\ncontents: \" << ints4;\r\n\r\n   // convert ints4 to an rvalue reference with std::move and\r\n   // use the result to initialize MyArray ints5\r\n   cout << \"\\n\\nInitialize ints5 with the result of std::move(ints4)\\n\";\r\n   MyArray ints5{std::move(ints4)}; // invokes move constructor\r\n\r\n   cout << \"\\nints5 size: \" << ints5.size() << \"\\ncontents: \" << ints5;\r\n   cout << \"\\n\\nSize of ints4 is now: \" << ints4.size();\r\n\r\n   // move contents of ints5 into ints4\r\n   cout << \"\\n\\nMove ints5 into ints4 via move assignment\\n\";\r\n   ints4 = std::move(ints5); // invokes move assignment\r\n\r\n   cout << \"\\nints4 size: \" << ints4.size() << \"\\ncontents: \" << ints4;\r\n   cout << \"\\n\\nSize of ints5 is now: \" << ints5.size();\r\n\r\n   // check if ints5 is empty by contextually converting it to a bool\r\n   if (ints5) { \r\n      cout << \"\\n\\nints5 contains elements\\n\";\r\n   }\r\n   else {\r\n      cout << \"\\n\\nints5 is empty\\n\";\r\n   }\r\n\r\n   // add one to every element of ints4 using preincrement\r\n   cout << \"\\nints4: \" << ints4;\r\n   cout << \"\\npreincrementing ints4: \" << ++ints4;\r\n\r\n   // add one to every element of ints4 using postincrement\r\n   cout << \"\\n\\npostincrementing ints4: \" << ints4++ << \"\\n\";\r\n   cout << \"\\nints4 now contains: \" << ints4;\r\n   \r\n   // add a value to every element of ints4 using +=\r\n   cout << \"\\n\\nAdd 7 to every ints4 element: \" << (ints4 += 7) << \"\\n\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson11/fig11_06/fig11_06.cpp",
    "content": "// fig11_06.cpp\r\n// C++20 three-way comparison (spaceship) operator.\r\n#include <compare>\r\n#include <iostream>\r\n#include <string>\r\n#include \"fmt/format.h\"\r\nusing namespace std;\r\n\r\nclass Time {\r\npublic:\r\n   Time(int hr, int min, int sec) noexcept\r\n      : m_hr{hr}, m_min{min}, m_sec{sec} {}\r\n\r\n   string toString() const {\r\n      return fmt::format(\"hr={}, min={}, sec={}\", m_hr, m_min, m_sec);\r\n   }\r\n\r\n   // <=> operator automatically supports equality/relational operators\r\n   auto operator<=>(const Time& t) const noexcept = default;\r\nprivate:\r\n   int m_hr{0};\r\n   int m_min{0};\r\n   int m_sec{0};\r\n};\r\n\r\nint main() {\r\n   const Time t1(12, 15, 30);\r\n   const Time t2(12, 15, 30);\r\n   const Time t3(6, 30, 0);\r\n\r\n   cout << fmt::format(\"t1: {}\\nt2: {}\\nt3: {}\\n\\n\", \r\n              t1.toString(), t2.toString(), t3.toString());\r\n\r\n   // using the equality and relational operators \r\n   cout << fmt::format(\"t1 == t2: {}\\n\", t1 == t2); // (t1 <=> t2) == 0 \r\n   cout << fmt::format(\"t1 != t2: {}\\n\", t1 != t2); // (t1 <=> t2) != 0\r\n   cout << fmt::format(\"t1 < t2: {}\\n\", t1 < t2);\r\n   cout << fmt::format(\"t1 <= t2: {}\\n\", t1 <= t2);\r\n   cout << fmt::format(\"t1 > t2: {}\\n\", t1 > t2);\r\n   cout << fmt::format(\"t1 >= t2: {}\\n\\n\", t1 >= t2);\r\n\r\n   cout << fmt::format(\"t1 == t3: {}\\n\", t1 == t3);\r\n   cout << fmt::format(\"t1 != t3: {}\\n\", t1 != t3);\r\n   cout << fmt::format(\"t1 < t3: {}\\n\", t1 < t3);\r\n   cout << fmt::format(\"t1 <= t3: {}\\n\", t1 <= t3);\r\n   cout << fmt::format(\"t1 > t3: {}\\n\", t1 > t3);\r\n   cout << fmt::format(\"t1 >= t3: {}\\n\\n\", t1 >= t3);\r\n\r\n   // using <=> to perform comparisons\r\n   if ((t1 <=> t2) == 0) {\r\n      cout << \"t1 is equal to t2\\n\";\r\n   }\r\n\r\n   if ((t1 <=> t3) > 0) {\r\n      cout << \"t1 is greater than t3\\n\";\r\n   }\r\n\r\n   if ((t3 <=> t1) < 0) {\r\n      cout << \"t3 is less than t1\\n\";\r\n   }\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2017 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson11/fig11_07/MyArray.cpp",
    "content": "// Fig. 11.5: MyArray.cpp\r\n// MyArray class member- and friend-function definitions.\r\n#include <algorithm>\r\n#include <initializer_list>\r\n#include <iostream>\r\n#include <memory>\r\n#include <span>\r\n#include <sstream> \r\n#include <stdexcept>\r\n#include <utility>\r\n#include \"fmt/format.h\" // In C++20, this will be #include <format> \r\n#include \"MyArray.h\" // MyArray class definition\r\nusing namespace std;\r\n\r\n// MyArray constructor to create a MyArray of size elements containing 0\r\nMyArray::MyArray(size_t size) \r\n   : m_size{size}, m_ptr{make_unique<int[]>(size)} {\r\n   cout << \"MyArray(size_t) constructor\\n\";\r\n}\r\n\r\n// MyArray constructor that accepts an initializer list\r\nMyArray::MyArray(initializer_list<int> list)\r\n   : m_size{list.size()}, m_ptr{make_unique<int[]>(list.size())} {\r\n   cout << \"MyArray(initializer_list) constructor\\n\";\r\n\r\n   // copy list argument's elements into m_ptr's underlying int array;\r\n   // m_ptr.get() returns the int array's starting memory location\r\n   copy(begin(list), end(list), m_ptr.get());\r\n}\r\n\r\n// copy constructor: must receive a reference to a MyArray\r\nMyArray::MyArray(const MyArray& original)\r\n   : m_size{original.size()}, m_ptr{make_unique<int[]>(original.size())} {\r\n   cout << \"MyArray copy constructor\\n\";\r\n\r\n   // copy original's elements into m_ptr's underlying int array \r\n   const span<const int> source{original.m_ptr.get(), original.size()};\r\n   copy(begin(source), end(source), m_ptr.get());\r\n}\r\n\r\n// copy assignment operator: implemented with copy-and-swap idiom\r\nMyArray& MyArray::operator=(const MyArray& right) {\r\n   cout << \"MyArray copy assignment operator\\n\";\r\n   MyArray temp{right}; // invoke copy constructor\r\n   swap(*this, temp); // exchange contents of this object and temp\r\n   return *this;\r\n}\r\n\r\n// move constructor: must receive an rvalue reference to a MyArray                      \r\nMyArray::MyArray(MyArray&& original) noexcept\r\n   : m_size{exchange(original.m_size, 0)}, \r\n     m_ptr{std::move(original.m_ptr)} {  // move original.m_ptr into m_ptr\r\n   cout << \"MyArray move constructor\\n\";\r\n}\r\n\r\n// move assignment operator\r\nMyArray& MyArray::operator=(MyArray&& right) noexcept {\r\n   cout << \"MyArray move assignment operator\\n\";\r\n\r\n   if (this != &right) { // avoid self-assignment  \r\n      // move right's data into this MyArray\r\n      m_size = std::exchange(right.m_size, 0); // indicate right is empty\r\n      m_ptr = std::move(right.m_ptr);\r\n   }\r\n\r\n   return *this; // enables x = y = z, for example                    \r\n}\r\n\r\n// destructor: This could be compiler-generated. We included it here so\r\n// we could output when each MyArray is destroyed.\r\nMyArray::~MyArray() {\r\n   cout << \"MyArray destructor\\n\";\r\n}\r\n\r\n// return a string representation of a MyArray\r\nstring MyArray::toString() const {\r\n   const span<const int> items{m_ptr.get(), m_size};\r\n   ostringstream output;\r\n   output << \"{\";\r\n   \r\n   // insert each item in the dynamic array into the ostringstream\r\n   for (size_t count{0}; const auto& item : items) {\r\n      ++count;\r\n      output << item << (count < m_size ? \", \" : \"\");\r\n   }\r\n\r\n   output << \"}\";\r\n   return output.str();\r\n}\r\n\r\n// determine if two MyArrays are equal and\r\n// return true, otherwise return false\r\nbool MyArray::operator==(const MyArray& right) const noexcept {\r\n   // compare corresponding elements of both MyArrays\r\n   const span<const int> lhs{m_ptr.get(), size()};\r\n   const span<const int> rhs{right.m_ptr.get(), right.size()};\r\n   return equal(begin(lhs), end(lhs), begin(rhs), end(rhs));\r\n} \r\n\r\n// overloaded subscript operator for non-const MyArrays;\r\n// reference return creates a modifiable lvalue\r\nint& MyArray::operator[](size_t index) {\r\n   // check for index out-of-range error\r\n   if (index >= m_size) {\r\n      throw out_of_range{\"Index out of range\"};\r\n   }\r\n\r\n   return m_ptr[index]; // reference return\r\n} \r\n\r\n// overloaded subscript operator for const MyArrays;\r\n// const reference return creates a non-modifiable lvalue\r\nconst int& MyArray::operator[](size_t index) const {\r\n   // check for subscript out-of-range error\r\n   if (index >= m_size) {\r\n      throw out_of_range{\"Index out of range\"};\r\n   }\r\n\r\n   return m_ptr[index]; // returns copy of this element\r\n} \r\n\r\n// preincrement every element, then return updated MyArray  \r\nMyArray& MyArray::operator++() {\r\n   // use a span and for_each to increment every element \r\n   const span<int> items{m_ptr.get(), m_size};\r\n   for_each(begin(items), end(items), [](auto& item){++item;});\r\n   return *this; \r\n}\r\n\r\n// postincrement every element, and return copy of original MyArray  \r\nMyArray MyArray::operator++(int) {\r\n   MyArray temp(*this);\r\n   ++(*this); // call preincrement operator++ to do the incrementing\r\n   return temp; // return the temporary copy made before incrementing\r\n}\r\n\r\n// add value to every element, then return updated MyArray\r\nMyArray& MyArray::operator+=(int value) {\r\n   // use a span and for_each to increment every element \r\n   const span<int> items{m_ptr.get(), m_size};\r\n   for_each(begin(items), end(items), \r\n      [value](auto& item) {item += value;});\r\n   return *this;\r\n}\r\n\r\n// overloaded input operator for class MyArray;\r\n// inputs values for entire MyArray\r\nistream& operator>>(istream& in, MyArray& a) {\r\n   span<int> items{a.m_ptr.get(), a.m_size};\r\n\r\n   for (auto& item : items) {\r\n      in >> item;\r\n   }\r\n\r\n   return in; // enables cin >> x >> y;\r\n} \r\n\r\n// overloaded output operator for class MyArray \r\nostream& operator<<(ostream& out, const MyArray& a) {\r\n   out << a.toString();\r\n   return out; // enables cout << x << y;\r\n} \r\n\r\n// swap function used to implement copy-and-swap copy assignment operator\r\nvoid swap(MyArray& a, MyArray& b) noexcept {\r\n   std::swap(a.m_size, b.m_size); // swap using std::swap\r\n   a.m_ptr.swap(b.m_ptr); // swap using unique_ptr swap member function\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2017 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson11/fig11_07/MyArray.h",
    "content": "// Fig. 11.4: MyArray.h\r\n// MyArray class definition with overloaded operators.\r\n#pragma once\r\n#include <initializer_list>\r\n#include <iostream>\r\n#include <memory>\r\n\r\nclass MyArray final {\r\n   // overloaded stream extraction operator\r\n   friend std::istream& operator>>(std::istream& in, MyArray& a);\r\n\r\n   // used by copy assignment operator to implement copy-and-swap idiom\r\n   friend void swap(MyArray& a, MyArray& b) noexcept;\r\n\r\npublic:\r\n   MyArray(size_t size); // construct a MyArray of size elements\r\n\r\n   // construct a MyArray with a braced-initializer list of ints\r\n   explicit MyArray(std::initializer_list<int> list);\r\n\r\n   MyArray(const MyArray& original); // copy constructor\r\n   MyArray& operator=(const MyArray& right); // copy assignment operator\r\n\r\n   MyArray(MyArray&& original) noexcept; // move constructor\r\n   MyArray& operator=(MyArray&& right) noexcept; // move assignment\r\n\r\n   ~MyArray(); // destructor                 \r\n\r\n   size_t size() const noexcept {return m_size;}; // return size\r\n   std::string toString() const; // create string representation\r\n\r\n   // equality operator; compiler autogenerates !=\r\n   bool operator==(const MyArray& right) const noexcept; \r\n\r\n   // subscript operator for non-const objects returns modifiable lvalue\r\n   int& operator[](size_t index);\r\n\r\n   // subscript operator for const objects returns non-modifiable lvalue\r\n   const int& operator[](size_t index) const;\r\n\r\n   // convert MyArray to a bool value: true if non-empty; false if empty\r\n   explicit operator bool() const noexcept {return size() != 0;}\r\n\r\n   // preincrement every element, then return updated MyArray  \r\n   MyArray& operator++();      \r\n\r\n   // postincrement every element, and return copy of original MyArray  \r\n   MyArray operator++(int); // postfix increment operator\r\n\r\n   // add value to every element, then return updated MyArray\r\n   MyArray& operator+=(int value);\r\nprivate:\r\n   size_t m_size{0}; // pointer-based array size\r\n   std::unique_ptr<int[]> m_ptr; // smart pointer to integer array\r\n};\r\n\r\n// overloaded operator<< is not a friend--does not access private data\r\nstd::ostream& operator<<(std::ostream& out, const MyArray& a);\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson11/fig11_07/fig11_07.cpp",
    "content": "// fig11_07.cpp\r\n// Single-argument constructors and implicit conversions.\r\n#include <iostream>\r\n#include \"MyArray.h\"\r\nusing namespace std;\r\n\r\nvoid outputArray(const MyArray&); // prototype\r\n\r\nint main() {\r\n   MyArray ints1(7); // 7-element MyArray\r\n   outputArray(ints1); // output MyArray ints1\r\n   outputArray(3); // convert 3 to a MyArray and output the contents\r\n}  \r\n\r\n// print MyArray contents\r\nvoid outputArray(const MyArray& arrayToOutput) {\r\n   cout << \"The MyArray received has \" << arrayToOutput.size() \r\n      << \" elements. The contents are: \" << arrayToOutput << \"\\n\";\r\n} \r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2017 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson11/fig11_08/MyArray.cpp",
    "content": "// Fig. 11.5: MyArray.cpp\r\n// MyArray class member- and friend-function definitions.\r\n#include <algorithm>\r\n#include <initializer_list>\r\n#include <iostream>\r\n#include <memory>\r\n#include <span>\r\n#include <sstream> \r\n#include <stdexcept>\r\n#include <utility>\r\n#include \"fmt/format.h\" // In C++20, this will be #include <format> \r\n#include \"MyArray.h\" // MyArray class definition\r\nusing namespace std;\r\n\r\n// MyArray constructor to create a MyArray of size elements containing 0\r\nMyArray::MyArray(size_t size) \r\n   : m_size{size}, m_ptr{make_unique<int[]>(size)} {\r\n   cout << \"MyArray(size_t) constructor\\n\";\r\n}\r\n\r\n// MyArray constructor that accepts an initializer list\r\nMyArray::MyArray(initializer_list<int> list)\r\n   : m_size{list.size()}, m_ptr{make_unique<int[]>(list.size())} {\r\n   cout << \"MyArray(initializer_list) constructor\\n\";\r\n\r\n   // copy list argument's elements into m_ptr's underlying int array;\r\n   // m_ptr.get() returns the int array's starting memory location\r\n   copy(begin(list), end(list), m_ptr.get());\r\n}\r\n\r\n// copy constructor: must receive a reference to a MyArray\r\nMyArray::MyArray(const MyArray& original)\r\n   : m_size{original.size()}, m_ptr{make_unique<int[]>(original.size())} {\r\n   cout << \"MyArray copy constructor\\n\";\r\n\r\n   // copy original's elements into m_ptr's underlying int array \r\n   const span<const int> source{original.m_ptr.get(), original.size()};\r\n   copy(begin(source), end(source), m_ptr.get());\r\n}\r\n\r\n// copy assignment operator: implemented with copy-and-swap idiom\r\nMyArray& MyArray::operator=(const MyArray& right) {\r\n   cout << \"MyArray copy assignment operator\\n\";\r\n   MyArray temp{right}; // invoke copy constructor\r\n   swap(*this, temp); // exchange contents of this object and temp\r\n   return *this;\r\n}\r\n\r\n// move constructor: must receive an rvalue reference to a MyArray                      \r\nMyArray::MyArray(MyArray&& original) noexcept\r\n   : m_size{exchange(original.m_size, 0)}, \r\n     m_ptr{std::move(original.m_ptr)} {  // move original.m_ptr into m_ptr\r\n   cout << \"MyArray move constructor\\n\";\r\n}\r\n\r\n// move assignment operator\r\nMyArray& MyArray::operator=(MyArray&& right) noexcept {\r\n   cout << \"MyArray move assignment operator\\n\";\r\n\r\n   if (this != &right) { // avoid self-assignment  \r\n      // move right's data into this MyArray\r\n      m_size = std::exchange(right.m_size, 0); // indicate right is empty\r\n      m_ptr = std::move(right.m_ptr);\r\n   }\r\n\r\n   return *this; // enables x = y = z, for example                    \r\n}\r\n\r\n// destructor: This could be compiler-generated. We included it here so\r\n// we could output when each MyArray is destroyed.\r\nMyArray::~MyArray() {\r\n   cout << \"MyArray destructor\\n\";\r\n}\r\n\r\n// return a string representation of a MyArray\r\nstring MyArray::toString() const {\r\n   const span<const int> items{m_ptr.get(), m_size};\r\n   ostringstream output;\r\n   output << \"{\";\r\n   \r\n   // insert each item in the dynamic array into the ostringstream\r\n   for (size_t count{0}; const auto& item : items) {\r\n      ++count;\r\n      output << item << (count < m_size ? \", \" : \"\");\r\n   }\r\n\r\n   output << \"}\";\r\n   return output.str();\r\n}\r\n\r\n// determine if two MyArrays are equal and\r\n// return true, otherwise return false\r\nbool MyArray::operator==(const MyArray& right) const noexcept {\r\n   // compare corresponding elements of both MyArrays\r\n   const span<const int> lhs{m_ptr.get(), size()};\r\n   const span<const int> rhs{right.m_ptr.get(), right.size()};\r\n   return equal(begin(lhs), end(lhs), begin(rhs), end(rhs));\r\n} \r\n\r\n// overloaded subscript operator for non-const MyArrays;\r\n// reference return creates a modifiable lvalue\r\nint& MyArray::operator[](size_t index) {\r\n   // check for index out-of-range error\r\n   if (index >= m_size) {\r\n      throw out_of_range{\"Index out of range\"};\r\n   }\r\n\r\n   return m_ptr[index]; // reference return\r\n} \r\n\r\n// overloaded subscript operator for const MyArrays;\r\n// const reference return creates a non-modifiable lvalue\r\nconst int& MyArray::operator[](size_t index) const {\r\n   // check for subscript out-of-range error\r\n   if (index >= m_size) {\r\n      throw out_of_range{\"Index out of range\"};\r\n   }\r\n\r\n   return m_ptr[index]; // returns copy of this element\r\n} \r\n\r\n// preincrement every element, then return updated MyArray  \r\nMyArray& MyArray::operator++() {\r\n   // use a span and for_each to increment every element \r\n   const span<int> items{m_ptr.get(), m_size};\r\n   for_each(begin(items), end(items), [](auto& item){++item;});\r\n   return *this; \r\n}\r\n\r\n// postincrement every element, and return copy of original MyArray  \r\nMyArray MyArray::operator++(int) {\r\n   MyArray temp(*this);\r\n   ++(*this); // call preincrement operator++ to do the incrementing\r\n   return temp; // return the temporary copy made before incrementing\r\n}\r\n\r\n// add value to every element, then return updated MyArray\r\nMyArray& MyArray::operator+=(int value) {\r\n   // use a span and for_each to increment every element \r\n   const span<int> items{m_ptr.get(), m_size};\r\n   for_each(begin(items), end(items), \r\n      [value](auto& item) {item += value;});\r\n   return *this;\r\n}\r\n\r\n// overloaded input operator for class MyArray;\r\n// inputs values for entire MyArray\r\nistream& operator>>(istream& in, MyArray& a) {\r\n   span<int> items{a.m_ptr.get(), a.m_size};\r\n\r\n   for (auto& item : items) {\r\n      in >> item;\r\n   }\r\n\r\n   return in; // enables cin >> x >> y;\r\n} \r\n\r\n// overloaded output operator for class MyArray \r\nostream& operator<<(ostream& out, const MyArray& a) {\r\n   out << a.toString();\r\n   return out; // enables cout << x << y;\r\n} \r\n\r\n// swap function used to implement copy-and-swap copy assignment operator\r\nvoid swap(MyArray& a, MyArray& b) noexcept {\r\n   std::swap(a.m_size, b.m_size); // swap using std::swap\r\n   a.m_ptr.swap(b.m_ptr); // swap using unique_ptr swap member function\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2017 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson11/fig11_08/MyArray.h",
    "content": "// Fig. 11.4: MyArray.h\r\n// MyArray class definition with overloaded operators.\r\n#pragma once\r\n#include <initializer_list>\r\n#include <iostream>\r\n#include <memory>\r\n\r\nclass MyArray final {\r\n   // overloaded stream extraction operator\r\n   friend std::istream& operator>>(std::istream& in, MyArray& a);\r\n\r\n   // used by copy assignment operator to implement copy-and-swap idiom\r\n   friend void swap(MyArray& a, MyArray& b) noexcept;\r\n\r\npublic:\r\n   explicit MyArray(size_t size); // construct a MyArray of size elements\r\n\r\n   // construct a MyArray with a braced-initializer list of ints\r\n   explicit MyArray(std::initializer_list<int> list);\r\n\r\n   MyArray(const MyArray& original); // copy constructor\r\n   MyArray& operator=(const MyArray& right); // copy assignment operator\r\n\r\n   MyArray(MyArray&& original) noexcept; // move constructor\r\n   MyArray& operator=(MyArray&& right) noexcept; // move assignment\r\n\r\n   ~MyArray(); // destructor                 \r\n\r\n   size_t size() const noexcept {return m_size;}; // return size\r\n   std::string toString() const; // create string representation\r\n\r\n   // equality operator; compiler autogenerates !=\r\n   bool operator==(const MyArray& right) const noexcept; \r\n\r\n   // subscript operator for non-const objects returns modifiable lvalue\r\n   int& operator[](size_t index);\r\n\r\n   // subscript operator for const objects returns non-modifiable lvalue\r\n   const int& operator[](size_t index) const;\r\n\r\n   // convert MyArray to a bool value: true if non-empty; false if empty\r\n   explicit operator bool() const noexcept {return size() != 0;}\r\n\r\n   // preincrement every element, then return updated MyArray  \r\n   MyArray& operator++();      \r\n\r\n   // postincrement every element, and return copy of original MyArray  \r\n   MyArray operator++(int); // postfix increment operator\r\n\r\n   // add value to every element, then return updated MyArray\r\n   MyArray& operator+=(int value);\r\nprivate:\r\n   size_t m_size{0}; // pointer-based array size\r\n   std::unique_ptr<int[]> m_ptr; // smart pointer to integer array\r\n};\r\n\r\n// overloaded operator<< is not a friend--does not access private data\r\nstd::ostream& operator<<(std::ostream& out, const MyArray& a);\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson11/fig11_08/fig11_08.cpp",
    "content": "// fig11_08.cpp\r\n// Demonstrating an explicit constructor.\r\n#include <iostream>\r\n#include \"MyArray.h\"\r\nusing namespace std;\r\n\r\nvoid outputArray(const MyArray&); // prototype\r\n\r\nint main() {\r\n   MyArray ints1(7); // 7-element MyArray\r\n   outputArray(ints1); // output MyArray ints1\r\n   outputArray(3); // convert 3 to a MyArray and output its contents\r\n   outputArray(MyArray(3)); // explicit single-argument constructor call\r\n}  \r\n\r\n// print MyArray contents\r\nvoid outputArray(const MyArray& arrayToOutput) {\r\n   cout << \"The MyArray received has \" << arrayToOutput.size() \r\n      << \" elements. The contents are: \" << arrayToOutput << \"\\n\";\r\n} \r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2017 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson12/fig12_01-02/DivideByZeroException.h",
    "content": "// Fig. 12.1: DivideByZeroException.h\r\n// Class DivideByZeroException definition.\r\n#include <stdexcept> // stdexcept header contains runtime_error          \r\n\r\n// DivideByZeroException objects should be thrown \r\n// by functions upon detecting division-by-zero \r\nclass DivideByZeroException : public std::runtime_error {\r\npublic:\r\n   // constructor specifies default error message\r\n   DivideByZeroException()\r\n      : std::runtime_error{\"attempted to divide by zero\"} {}\r\n};\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson12/fig12_01-02/fig12_02.cpp",
    "content": "// fig12_02.cpp\r\n// Example that throws an exception on \r\n// an attempt to divide by zero.\r\n#include <fmt/format.h>\r\n#include <iostream>\r\n#include \"DivideByZeroException.h\" // DivideByZeroException class \r\n\r\n// performs division only if the denominator is not zero; \r\n// otherwise, throws DivideByZeroException object \r\ndouble quotient(double numerator, double denominator) {\r\n   // throw DivideByZeroException if trying to divide by zero\r\n   if (denominator == 0.0) {\r\n      throw DivideByZeroException{}; \r\n   }\r\n\r\n   // return division result\r\n   return numerator / denominator;\r\n}\r\n\r\nint main() {\r\n   int number1{0}; // user-specified numerator\r\n   int number2{0}; // user-specified denominator\r\n\r\n   std::cout << \"Enter two integers (end-of-file to end): \";\r\n\r\n   // enable user to enter two integers to divide\r\n   while (std::cin >> number1 >> number2) {\r\n      // try block contains code that might throw exception       \r\n      // and code that will not execute if an exception occurs    \r\n      try {\r\n         double result{quotient(number1, number2)};\r\n         std::cout << fmt::format(\"The quotient is: {}\\n\", result);\r\n      }\r\n      catch (const DivideByZeroException& divideByZeroException) {\r\n         std::cout << fmt::format(\"Exception occurred: {}\\n\",\r\n            divideByZeroException.what());\r\n      }\r\n\r\n      std::cout << \"\\nEnter two integers (end-of-file to end): \";\r\n   }\r\n\r\n   std::cout << '\\n';\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson12/fig12_03/fig12_03.cpp",
    "content": "// fig12_03.cpp\r\n// Rethrowing an exception.\r\n#include <iostream>\r\n#include <exception>\r\n\r\n// throw, catch and rethrow exception\r\nvoid throwException() {\r\n   // throw exception and catch it immediately\r\n   try {\r\n      std::cout << \"  Function throwException throws an exception\\n\";\r\n      throw std::exception{}; // generate exception\r\n   }\r\n   catch (const std::exception&) { // handle exception\r\n      std::cout << \"  Exception handled in function throwException\"\r\n         << \"\\n  Function throwException rethrows exception\";\r\n      throw; // rethrow exception for further processing\r\n   }\r\n\r\n   std::cout << \"This should not print\\n\";\r\n}\r\n\r\nint main() {\r\n   // call throwException\r\n   try {\r\n      std::cout << \"main invokes function throwException\\n\";\r\n      throwException();\r\n      std::cout << \"This should not print\\n\";\r\n   }\r\n   catch (const std::exception&) { // handle exception\r\n      std::cout << \"\\n\\nException handled in main\\n\";\r\n   }\r\n\r\n   std::cout << \"Program control continues after catch in main\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson12/fig12_04/fig12_04.cpp",
    "content": "// fig12_04.cpp\r\n// Demonstrating stack unwinding.\r\n#include <iostream>\r\n#include <stdexcept>     \r\n\r\n// function3 throws runtime error\r\nvoid function3() {\r\n   std::cout << \"In function 3\\n\";\r\n\r\n   // no try block, stack unwinding occurs, return control to function2\r\n   throw std::runtime_error{\"runtime_error in function3\"};\r\n}\r\n\r\n// function2 invokes function3\r\nvoid function2() {\r\n   std::cout << \"function3 is called inside function2\\n\";\r\n   function3(); // stack unwinding occurs, return control to function1\r\n}\r\n\r\n// function1 invokes function2\r\nvoid function1() {\r\n   std::cout << \"function2 is called inside function1\\n\";\r\n   function2(); // stack unwinding occurs, return control to main\r\n}\r\n\r\n// demonstrate stack unwinding\r\nint main() {\r\n   // invoke function1\r\n   try {\r\n      std::cout << \"function1 is called inside main\\n\";\r\n      function1(); // call function1 which leads to a runtime_error\r\n   }\r\n   catch (const std::runtime_error& error) { // handle runtime error\r\n      std::cout << \"Exception occurred: \" << error.what()\r\n         << \"\\nException handled in main\\n\";\r\n   }\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson12/fig12_04/fig12_04modified.cpp",
    "content": "// fig12_04.cpp\r\n// Demonstrating stack unwinding.\r\n#include <iostream>\r\n#include <stdexcept>     \r\n\r\n// function3 throws runtime error\r\nvoid function3() {\r\n   std::cout << \"In function 3\\n\";\r\n\r\n   // no try block, stack unwinding occurs, return control to function2\r\n   throw std::runtime_error{\"runtime_error in function3\"}; \r\n} \r\n\r\n// function2 invokes function3\r\nvoid function2() {\r\n   std::cout << \"function3 is called inside function2\\n\";\r\n   function3(); // stack unwinding occurs, return control to function1\r\n} \r\n\r\n// function1 invokes function2\r\nvoid function1() {\r\n   std::cout << \"function2 is called inside function1\\n\";\r\n   function2(); // stack unwinding occurs, return control to main\r\n} \r\n\r\n// demonstrate stack unwinding\r\nint main() {\r\n   // invoke function1\r\n   std::cout << \"function1 is called inside main\\n\";\r\n   function1(); // call function1 which leads to a runtime_error\r\n} \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson12/fig12_05/fig12_05.cpp",
    "content": "// fig12_05.cpp\r\n// Demonstrating a function try block.\r\n#include <fmt/format.h>\r\n#include <iostream>\r\n#include <limits>\r\n#include <stdexcept>\r\n\r\n// class Integer purposely throws an exception from its constructor\r\nclass Integer {\r\npublic:\r\n   explicit Integer(int i) : value{i} {\r\n      std::cout << fmt::format(\"Integer constructor: {}\\n\", value)\r\n         << \"Purposely throwing exception from Integer constructor\\n\";\r\n      throw std::runtime_error(\"Integer constructor failed\");\r\n   }\r\nprivate:\r\n   int value{};\r\n};\r\n\r\nclass ResourceManager {\r\npublic:\r\n   ResourceManager(int i) try : myInteger(i) {\r\n      std::cout << \"ResourceManager constructor called\\n\";\r\n   }\r\n   catch (const std::runtime_error& ex) {\r\n      std::cout << fmt::format(\r\n         \"Exception while constructing ResourceManager: \", ex.what())\r\n         << \"\\nAutomatically rethrowing the exception\\n\";\r\n   }\r\nprivate:\r\n   Integer myInteger;\r\n};\r\n\r\nint main() {\r\n   try {\r\n      const ResourceManager resource{7};\r\n   }\r\n   catch (const std::runtime_error& ex) {\r\n      std::cout << fmt::format(\"Rethrown exception caught in main: {}\\n\",\r\n         ex.what());\r\n   }\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson12/fig12_06/fig12_06.cpp",
    "content": "// fig12_06.cpp\r\n// Demonstrating standard new throwing bad_alloc when memory\r\n// cannot be allocated.\r\n#include <array>\r\n#include <fmt/format.h>\r\n#include <iostream>\r\n#include <memory>\r\n#include <new> // bad_alloc class is defined here\r\n\r\nint main() {\r\n   std::array<std::unique_ptr<double[]>, 1000> items{};\r\n\r\n   // aim each unique_ptr at a big block of memory\r\n   try {\r\n      for (int i{0}; auto & item : items) {\r\n         item = std::make_unique<double[]>(500'000'000);\r\n         std::cout << fmt::format(\r\n            \"items[{}] points to 500,000,000 doubles\\n\", i++);\r\n      }\r\n   }\r\n   catch (const std::bad_alloc& memoryAllocationException) {\r\n      std::cerr << fmt::format(\"Exception occurred: {}\\n\",\r\n         memoryAllocationException.what());\r\n   }\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson12/fig12_07/fig12_07.cpp",
    "content": "// fig12_07.cpp\r\n// Demonstrating set_new_handler.\r\n#include <array>\r\n#include <fmt/format.h>\r\n#include <iostream>\r\n#include <memory>\r\n#include <new> // set_new_handler is defined here\r\n\r\n// handle memory allocation failure      \r\nvoid customNewHandler() {\r\n   std::cerr << \"customNewHandler was called\\n\";\r\n   std::exit(EXIT_FAILURE);\r\n}\r\n\r\nint main() {\r\n   std::array<std::unique_ptr<double[]>, 1000> items{};\r\n\r\n   // specify that customNewHandler should be called on \r\n   // memory allocation failure                         \r\n   std::set_new_handler(customNewHandler);\r\n\r\n   // aim each unique_ptr at a big block of memory\r\n   for (int i{0}; auto & item : items) {\r\n      item = std::make_unique<double[]>(500'000'000);\r\n      std::cout << fmt::format(\r\n         \"items[{}] points to 500,000,000 doubles\\n\", i++);\r\n   }\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson12/fig12_08/fig12_08.cpp",
    "content": "// fig12_08.cpp\n// Division by zero with a precondition.\n#include <iostream>\n\ndouble quotient(double numerator, double denominator) \n   [[pre: denominator != 0.0]];\n\nint main() {\n   std::cout << \"quotient(100, 7): \" << quotient(100, 7)\n      << \"\\nquotient(100, 0): \" << quotient(100, 0) << '\\n';\n} \n\n// perform division \ndouble quotient(double numerator, double denominator) {\n   return numerator / denominator;\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson12/fig12_09/fig12_09.cpp",
    "content": "// fig12_09.cpp\n// binarySearch function with a precondition requiring a sorted vector.\n#include <algorithm>\n#include <iostream>\n#include <vector>\n\ntemplate<class T>\nint binarySearch(const std::vector<T>& items, const T& key)\n   [[pre: items.size() > 0]]\n   [[pre audit: std::is_sorted(items.begin(), items.end())]] {\n   size_t low{0}; // low index of elements to search                 \n   size_t high{items.size() - 1}; // high index\n   size_t middle{(low + high + 1) / 2}; // middle element            \n   int loc{-1}; // key's index; -1 if not found              \n\n   do { // loop to search for element                             \n      // if the element is found at the middle                \n      if (key == items[middle]) {                             \n         loc = middle; // loc is the current middle \n      }                                                       \n      else if (key < items[middle]) { // middle is too high   \n         high = middle - 1; // eliminate the higher half      \n      }                                                       \n      else { // middle element is too low                     \n         low = middle + 1; // eliminate the lower half        \n      }                                                       \n\n      middle = (low + high + 1) / 2; // recalculate the middle\n   } while ((low <= high) && (loc == -1));               \n\n   return loc; // return location of key\n} \n\nint main() {\n   // sorted vector v1 satisfies binarySearch's sorted vector precondition\n   std::vector v1{10, 20, 30, 40, 50, 60, 70, 80, 90};\n   int result1{binarySearch(v1, 70)};\n   std::cout << \"70 was \" << (result1 != -1 ? \"\" : \"not \") << \"found in v1\\n\";\n\n   // unsorted vector v2 violates binarySearch's sorted vector precondition\n   std::vector v2{60, 70, 80, 90, 10, 20, 30, 40, 50};\n   int result2{binarySearch(v2, 60)};\n   std::cout << \"60 was \" << (result2 != -1 ? \"\" : \"not \") << \"found in v2\\n\";\n}\n\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson13/fig13_01.cpp",
    "content": "// fig13_01.cpp\r\n// Demonstrating input and output with iterators.\r\n#include <iostream>\r\n#include <iterator> // ostream_iterator and istream_iterator\r\n\r\nint main() {\r\n   std::cout << \"Enter two integers: \";\r\n\r\n   // create istream_iterator for reading int values from cin\r\n   std::istream_iterator<int> inputInt{std::cin};\r\n\r\n   const int number1{*inputInt}; // read int from standard input\r\n   ++inputInt; // move iterator to next input value        \r\n   const int number2{*inputInt}; // read int from standard input\r\n\r\n   // create ostream_iterator for writing int values to cout\r\n   std::ostream_iterator<int> outputInt{std::cout};\r\n\r\n   std::cout << \"The sum is: \";\r\n   *outputInt = number1 + number2; // output result to cout\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson13/fig13_02.cpp",
    "content": "// fig13_02.cpp\r\n// Standard library vector class template.\r\n#include <fmt/format.h> // C++20: This will be #include <format>\r\n#include <iostream>\r\n#include <ranges>\r\n#include <vector> // vector class-template definition\r\n\r\n// display value appended to vector and updated vector size and capacity\r\nvoid showResult(int value, size_t size, size_t capacity) {\r\n   std::cout << fmt::format(\"appended: {}; size: {}; capacity: {}\\n\",\r\n      value, size, capacity);\r\n}\r\n\r\nint main() {\r\n   std::vector<int> integers{}; // create vector of ints\r\n\r\n   std::cout << \"Size of integers: \" << integers.size()\r\n      << \"\\nCapacity of integers: \" << integers.capacity() << \"\\n\\n\";\r\n\r\n   // append 1-10 to integers and display updated size and capacity\r\n   for (int i : std::views::iota(1, 11)) {\r\n      integers.push_back(i); // push_back is in vector, deque and list\r\n      showResult(i, integers.size(), integers.capacity());\r\n   }\r\n\r\n   std::cout << \"\\nOutput integers using iterators: \";\r\n\r\n   for (auto constIterator{integers.cbegin()};\r\n      constIterator != integers.cend(); ++constIterator) {\r\n      std::cout << *constIterator << ' ';\r\n   }\r\n\r\n   std::cout << \"\\nOutput integers in reverse using iterators: \";\r\n\r\n   // display vector in reverse order using const_reverse_iterator\r\n   for (auto reverseIterator{integers.crbegin()};\r\n      reverseIterator != integers.crend(); ++reverseIterator) {\r\n      std::cout << *reverseIterator << ' ';\r\n   }\r\n\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson13/fig13_03.cpp",
    "content": "// fig13_03.cpp\r\n// Testing standard library vector class template\r\n// element-manipulation functions.\r\n#include <algorithm> // copy algorithm\r\n#include <fmt/format.h> // C++20: This will be #include <format>\r\n#include <iostream>\r\n#include <ranges> \r\n#include <iterator> // ostream_iterator iterator\r\n#include <vector> \r\n\r\nint main() {\r\n   std::vector values{1, 2, 3, 4, 5}; // class template argument deduction\r\n   std::vector<int> integers{values.cbegin(), values.cend()};\r\n   std::ostream_iterator<int> output{std::cout, \" \"};\r\n\r\n   std::cout << \"integers contains: \";\r\n   std::copy(integers.cbegin(), integers.cend(), output);\r\n\r\n   std::cout << fmt::format(\"\\nfront: {}\\nback: {}\\n\\n\",\r\n      integers.front(), integers.back());\r\n\r\n   integers[0] = 7; // set first element to 7             \r\n   integers.at(2) = 10; // set element at position 2 to 10\r\n\r\n   // insert 22 as second element                  \r\n   integers.insert(integers.cbegin() + 1, 22);\r\n\r\n   std::cout << \"Contents of vector integers after changes: \";\r\n   std::ranges::copy(integers, output);\r\n\r\n   integers.erase(integers.cbegin()); // erase first element\r\n   std::cout << \"\\n\\nintegers after erasing first element: \";\r\n   std::ranges::copy(integers, output);\r\n\r\n   // erase remaining elements                          \r\n   integers.erase(integers.cbegin(), integers.cend());\r\n   std::cout << fmt::format(\"\\nErased all elements: integers {} empty\\n\",\r\n      integers.empty() ? \"is\" : \"is not\");\r\n\r\n   // insert elements from the vector values                             \r\n   integers.insert(integers.cbegin(), values.cbegin(), values.cend());\r\n   std::cout << \"\\nContents of vector integers before clear: \";\r\n   std::ranges::copy(integers, output);\r\n\r\n   // empty integers; clear empties a collection\r\n   integers.clear();\r\n   std::cout << fmt::format(\"\\nAfter clear, integers {} empty\\n\",\r\n      integers.empty() ? \"is\" : \"is not\");\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson13/fig13_04.cpp",
    "content": "// fig13_04.cpp\r\n// Standard library list class template.\r\n#include <algorithm> // copy algorithm\r\n#include <iostream>\r\n#include <iterator> // ostream_iterator\r\n#include <list> // list class-template definition\r\n#include <vector>\r\n\r\n// printList function template definition; uses \r\n// ostream_iterator and copy algorithm to output list elements\r\ntemplate <typename T>\r\nvoid printList(const std::list<T>& items) {\r\n   if (items.empty()) { // list is empty\r\n      std::cout << \"List is empty\";\r\n   }\r\n   else {\r\n      std::ostream_iterator<T> output{std::cout, \" \"};\r\n      std::ranges::copy(items, output);\r\n   }\r\n}\r\n\r\nint main() {\r\n   std::list<int> values{}; // create list of ints     \r\n\r\n   // insert items in values\r\n   values.push_front(1);\r\n   values.push_front(2);\r\n   values.push_back(4);\r\n   values.push_back(3);\r\n\r\n   std::cout << \"values contains: \";\r\n   printList(values);\r\n\r\n   values.sort(); // sort values\r\n   std::cout << \"\\nvalues after sorting contains: \";\r\n   printList(values);\r\n\r\n   // insert elements of ints into otherValues                            \r\n   std::vector ints{2, 6, 4, 8};\r\n   std::list<int> otherValues{}; // create list of ints\r\n   otherValues.insert(otherValues.cbegin(), ints.cbegin(), ints.cend());\r\n   std::cout << \"\\nAfter insert, otherValues contains: \";\r\n   printList(otherValues);\r\n\r\n   // remove otherValues elements and insert at end of values\r\n   values.splice(values.cend(), otherValues);\r\n   std::cout << \"\\nAfter splice, values contains: \";\r\n   printList(values);\r\n\r\n   values.sort(); // sort values\r\n   std::cout << \"\\nAfter sort, values contains: \";\r\n   printList(values);\r\n\r\n   // insert elements of ints into otherValues                            \r\n   otherValues.insert(otherValues.cbegin(), ints.cbegin(), ints.cend());\r\n   otherValues.sort(); // sort the list                                 \r\n   std::cout << \"\\nAfter insert and sort, otherValues contains: \";\r\n   printList(otherValues);\r\n\r\n   // remove otherValues elements and insert into values in sorted order\r\n   values.merge(otherValues);\r\n   std::cout << \"\\nAfter merge:\\n   values contains: \";\r\n   printList(values);\r\n   std::cout << \"\\n   otherValues contains: \";\r\n   printList(otherValues);\r\n\r\n   values.pop_front(); // remove element from front\r\n   values.pop_back(); // remove element from back  \r\n   std::cout << \"\\nAfter pop_front and pop_back:\\n   values contains: \";\r\n   printList(values);\r\n\r\n   values.unique(); // remove duplicate elements\r\n   std::cout << \"\\nAfter unique, values contains: \";\r\n   printList(values);\r\n\r\n   values.swap(otherValues); // swap elements of values and otherValues\r\n   std::cout << \"\\nAfter swap:\\n   values contains: \";\r\n   printList(values);\r\n   std::cout << \"\\n   otherValues contains: \";\r\n   printList(otherValues);\r\n\r\n   // replace contents of values with elements of otherValues\r\n   values.assign(otherValues.cbegin(), otherValues.cend());\r\n   std::cout << \"\\nAfter assign, values contains: \";\r\n   printList(values);\r\n\r\n   // remove otherValues elements and insert into values in sorted order\r\n   values.merge(otherValues);\r\n   std::cout << \"\\nAfter merge, values contains: \";\r\n   printList(values);\r\n\r\n   values.remove(4); // remove all 4s\r\n   std::cout << \"\\nAfter remove(4), values contains: \";\r\n   printList(values);\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n\r\n"
  },
  {
    "path": "examples/lesson13/fig13_05.cpp",
    "content": "// fig13_05.cpp\r\n// Standard library deque class template.\r\n#include <algorithm> // copy algorithm\r\n#include <deque> // deque class-template definition\r\n#include <iostream>\r\n#include <iterator> // ostream_iterator\r\n\r\nint main() {\r\n   std::deque<double> values; // create deque of doubles\r\n   std::ostream_iterator<double> output{std::cout, \" \"};\r\n\r\n   // insert elements in values\r\n   values.push_front(2.2);\r\n   values.push_front(3.5);\r\n   values.push_back(1.1);\r\n\r\n   std::cout << \"values contains: \";\r\n\r\n   // use subscript operator to obtain elements of values\r\n   for (size_t i{0}; i < values.size(); ++i) {\r\n      std::cout << values[i] << ' ';\r\n   }\r\n\r\n   values.pop_front(); // remove first element\r\n   std::cout << \"\\nAfter pop_front, values contains: \";\r\n   std::ranges::copy(values, output);\r\n\r\n   // use subscript operator to modify element at location 1\r\n   values[1] = 5.4;\r\n   std::cout << \"\\nAfter values[1] = 5.4, values contains: \";\r\n   std::ranges::copy(values, output);\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson13/fig13_06.cpp",
    "content": "// fig13_06.cpp\r\n// Standard library multiset class template\r\n#include <algorithm> // copy algorithm\r\n#include <fmt/format.h> // C++20: This will be #include <format>\r\n#include <iostream>\r\n#include <iterator> // ostream_iterator\r\n#include <ranges> \r\n#include <set> // multiset class-template definition\r\n#include <vector>\r\n\r\nint main() {\r\n   std::multiset<int, std::less<int>> ints{}; // multiset of int values\r\n   std::cout << fmt::format(\"15s in ints: {}\\n\", ints.count(15));\r\n\r\n   std::cout << \"\\nInserting two 15s into ints\\n\";\r\n   ints.insert(15); // insert 15 in ints\r\n   ints.insert(15); // insert 15 in ints\r\n   std::cout << fmt::format(\"15s in ints: {}\\n\\n\", ints.count(15));\r\n\r\n   // search for 15 and 20 in ints; find returns an iterator\r\n   for (int i : {15, 20}) {\r\n      if (auto result{ints.find(i)}; result != ints.end()) {\r\n         std::cout << fmt::format(\"Found {} in ints\\n\", i);\r\n      }\r\n      else {\r\n         std::cout << fmt::format(\"Did not find {} in ints\\n\", i);\r\n      }\r\n   }\r\n\r\n   // search for 15 and 20 in ints; contains returns a bool\r\n   for (int i : {15, 20}) {\r\n      if (ints.contains(i)) {\r\n         std::cout << fmt::format(\"Found {} in ints\\n\", i);\r\n      }\r\n      else {\r\n         std::cout << fmt::format(\"Did not find {} in ints\\n\", i);\r\n      }\r\n   }\r\n\r\n   // insert elements of vector values into ints\r\n   const std::vector values{7, 22, 9, 1, 18, 30, 100, 22, 85, 13};\r\n   ints.insert(values.cbegin(), values.cend());\r\n   std::cout << \"\\nAfter insert, ints contains:\\n\";\r\n   std::ranges::copy(ints, std::ostream_iterator<int>{std::cout, \" \"});\r\n\r\n   // determine lower and upper bound of 22 in ints\r\n   std::cout << fmt::format(\r\n      \"\\n\\nlower_bound(22): {}\\nupper_bound(22): {}\\n\\n\",\r\n      *ints.lower_bound(22), *ints.upper_bound(22));\r\n\r\n   // use equal_range to determine lower and upper bound of 22 in ints \r\n   auto p{ints.equal_range(22)};\r\n   std::cout << fmt::format(\r\n      \"lower_bound(22): {}\\nupper_bound(22): {}\\n\",\r\n      *(p.first), *(p.second));\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson13/fig13_07.cpp",
    "content": "// fig13_07.cpp\r\n// Standard library set class template.\r\n#include <algorithm>\r\n#include <fmt/format.h> // C++20: This will be #include <format>\r\n#include <iostream>\r\n#include <iterator> // ostream_iterator\r\n#include <set>\r\n\r\nint main() {\r\n   std::set doubles{2.1, 4.2, 9.5, 2.1, 3.7}; // CTAD \r\n\r\n   std::ostream_iterator<double> output{std::cout, \" \"};\r\n   std::cout << \"doubles contains: \";\r\n   std::ranges::copy(doubles, output);\r\n\r\n   // insert 13.8 in doubles; insert returns pair in which\r\n   // p.first represents location of 13.8 in doubles and  \r\n   // p.second represents whether 13.8 was inserted         \r\n   auto p{doubles.insert(13.8)}; // value not in set   \r\n   std::cout << fmt::format(\"\\n{} {} inserted\\n\", *(p.first),\r\n      (p.second ? \"was\" : \"was not\"));\r\n   std::cout << \"doubles contains: \";\r\n   std::ranges::copy(doubles, output);\r\n\r\n   // insert 9.5 in doubles                          \r\n   p = doubles.insert(9.5); // value already in set\r\n   std::cout << fmt::format(\"\\n{} {} inserted\\n\", *(p.first),\r\n      (p.second ? \"was\" : \"was not\"));\r\n   std::cout << \"doubles contains: \";\r\n   std::ranges::copy(doubles, output);\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson13/fig13_08.cpp",
    "content": "// fig13_08.cpp\r\n// Standard library multimap class template.\r\n#include <fmt/format.h> // C++20: This will be #include <format>\r\n#include <iostream>\r\n#include <map> // multimap class-template definition\r\n\r\nint main() {\r\n   std::multimap<int, double> pairs{}; // create multimap\r\n   std::cout << fmt::format(\"Number of 15 keys in pairs: {}\\n\",\r\n      pairs.count(15));\r\n\r\n   // insert two pairs\r\n   pairs.insert(std::make_pair(15, 99.3));\r\n   pairs.insert(std::make_pair(15, 2.7));\r\n   std::cout << fmt::format(\"Number of 15 keys in pairs: {}\\n\\n\",\r\n      pairs.count(15));\r\n\r\n   // insert five pairs\r\n   pairs.insert({30, 111.11});\r\n   pairs.insert({10, 22.22});\r\n   pairs.insert({25, 33.333});\r\n   pairs.insert({20, 9.345});\r\n   pairs.insert({5, 77.54});\r\n\r\n   std::cout << \"Multimap pairs contains:\\nKey\\tValue\\n\";\r\n\r\n   // walk through elements of pairs                    \r\n   for (const auto& mapItem : pairs) {\r\n      std::cout << fmt::format(\"{}\\t{}\\n\", mapItem.first, mapItem.second);\r\n   }\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson13/fig13_09.cpp",
    "content": "// fig13_09.cpp\r\n// Standard library class map class template.\r\n#include <iostream>\r\n#include <fmt/format.h> // C++20: This will be #include <format>\r\n#include <map> // map class-template definition\r\n\r\nint main() {\r\n   // create a map; duplicate keys are ignored\r\n   std::map<int, double> pairs{{15, 2.7}, {30, 111.11}, {5, 1010.1},\r\n      {10, 22.22}, {25, 33.333}, {5, 77.54}, {20, 9.345}, {15, 99.3}};\r\n\r\n   // walk through elements of pairs\r\n   std::cout << \"pairs contains:\\nKey\\tValue\\n\";\r\n   for (const auto& pair : pairs) {\r\n      std::cout << fmt::format(\"{}\\t{}\\n\", pair.first, pair.second);\r\n   }\r\n   \r\n   pairs[25] = 9999.99; // use subscripting to change value for key 25\r\n   pairs[40] = 8765.43; // use subscripting to insert value for key 40\r\n\r\n   // walk through elements of pairs\r\n   std::cout << \"\\nAfter updates, pairs contains:\\nKey\\tValue\\n\";\r\n   for (const auto& pair : pairs) {\r\n      std::cout << fmt::format(\"{}\\t{}\\n\", pair.first, pair.second);\r\n   }\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson13/fig13_10.cpp",
    "content": "// fig13_10.cpp\r\n// Standard library stack adaptor class.\r\n#include <iostream>\r\n#include <list> // list class-template definition\r\n#include <ranges> \r\n#include <stack> // stack adaptor definition\r\n#include <vector> // vector class-template definition\r\n\r\n// pushElements generic lambda to push values onto a stack\r\nauto pushElements = [](auto& stack) {\r\n   for (auto i : std::views::iota(0, 10)) {\r\n      stack.push(i); // push element onto stack                  \r\n      std::cout << stack.top() << ' '; // view (and display) top element\r\n   }\r\n};\r\n\r\n// popElements generic lambda to pop elements off a stack\r\nauto popElements = [](auto& stack) {\r\n   while (!stack.empty()) {\r\n      std::cout << stack.top() << ' '; // view (and display) top element\r\n      stack.pop(); // remove top element                           \r\n   }\r\n};\r\n\r\nint main() {\r\n   std::stack<int> dequeStack{}; // uses a deque by default\r\n   std::stack<int, std::vector<int>> vectorStack{}; // use a vector \r\n   std::stack<int, std::list<int>> listStack{}; // use a list\r\n\r\n   // push the values 0-9 onto each stack \r\n   std::cout << \"Pushing onto dequeStack: \";\r\n   pushElements(dequeStack);\r\n   std::cout << \"\\nPushing onto vectorStack: \";\r\n   pushElements(vectorStack);\r\n   std::cout << \"\\nPushing onto listStack: \";\r\n   pushElements(listStack);\r\n\r\n   // display and remove elements from each stack\r\n   std::cout << \"\\n\\nPopping from dequeStack: \";\r\n   popElements(dequeStack);\r\n   std::cout << \"\\nPopping from vectorStack: \";\r\n   popElements(vectorStack);\r\n   std::cout << \"\\nPopping from listStack: \";\r\n   popElements(listStack);\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson13/fig13_11.cpp",
    "content": "// fig13_11.cpp\r\n// Standard library queue adaptor class template.\r\n#include <iostream>\r\n#include <queue> // queue adaptor definition\r\n\r\nint main() {\r\n   std::queue<double> values{}; // queue with doubles\r\n\r\n   // push elements onto queue values\r\n   values.push(3.2);\r\n   values.push(9.8);\r\n   values.push(5.4);\r\n\r\n   std::cout << \"Popping from values: \";\r\n\r\n   // pop elements from queue\r\n   while (!values.empty()) {\r\n      std::cout << values.front() << ' '; // view front element\r\n      values.pop(); // remove element                     \r\n   }\r\n\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson13/fig13_12.cpp",
    "content": "// fig13_12.cpp\r\n// Standard library priority_queue adaptor class.\r\n#include <iostream>\r\n#include <queue> // priority_queue adaptor definition\r\n\r\nint main() {\r\n   std::priority_queue<double> priorities; // create priority_queue\r\n\r\n   // push elements onto priorities\r\n   priorities.push(3.2);\r\n   priorities.push(9.8);\r\n   priorities.push(5.4);\r\n\r\n   std::cout << \"Popping from priorities: \";\r\n\r\n   // pop element from priority_queue\r\n   while (!priorities.empty()) {\r\n      std::cout << priorities.top() << ' '; // view top element\r\n      priorities.pop(); // remove top element             \r\n   }\r\n\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson14/fig14_01.cpp",
    "content": "// fig14_01.cpp\r\n// Lambda expressions.\r\n#include <algorithm>\r\n#include <array>\r\n#include <iostream>\r\n#include <iterator>\r\n\r\nint main() {\r\n   std::array values{1, 2, 3, 4}; // initialize values\r\n   std::ostream_iterator<int> output{std::cout, \" \"};\r\n\r\n   std::cout << \"values contains: \";\r\n   std::ranges::copy(values, output);\r\n\r\n   // output each element multiplied by two\r\n   std::cout << \"\\nDisplay each element multiplied by two: \";\r\n   std::ranges::for_each(values, [](auto i) {std::cout << i * 2 << \" \";});\r\n\r\n   // add each element to sum\r\n   int sum{0}; // initialize sum to zero\r\n   std::ranges::for_each(values, [&sum](auto i) {sum += i;});\r\n   std::cout << \"\\nSum of value's elements is: \" << sum << \"\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson14/fig14_02.cpp",
    "content": "// fig14_02.cpp\r\n// Algorithms fill, fill_n, generate and generate_n.\r\n#include <algorithm> // algorithm definitions\r\n#include <array> // array class-template definition\r\n#include <iostream>\r\n#include <iterator> // ostream_iterator\r\n\r\n// returns the next letter (starts with A)\r\nchar nextLetter() {\r\n   static char letter{'A'};\r\n   return letter++;\r\n}\r\n\r\nint main() {\r\n   std::array<char, 10> chars{};\r\n   std::ranges::fill(chars, '5'); // fill chars with 5s\r\n\r\n   std::cout << \"chars after filling with 5s: \";\r\n   std::ostream_iterator<char> output{std::cout, \" \"};\r\n   std::ranges::copy(chars, output);\r\n\r\n   // fill first five elements of chars with 'A's\r\n   std::ranges::fill_n(chars.begin(), 5, 'A');\r\n\r\n   std::cout << \"\\nchars after filling five elements with 'A's: \";\r\n   std::ranges::copy(chars, output);\r\n\r\n   // generate values for all elements of chars with nextLetter\r\n   std::ranges::generate(chars, nextLetter);\r\n\r\n   std::cout << \"\\nchars after generating letters A-J: \";\r\n   std::ranges::copy(chars, output);\r\n\r\n   // generate values for first five elements of chars with nextLetter\r\n   std::ranges::generate_n(chars.begin(), 5, nextLetter);\r\n\r\n   std::cout << \"\\nchars after generating K-O into elements 0-4: \";\r\n   std::ranges::copy(chars, output);\r\n\r\n   // generate values for first three elements of chars with a lambda\r\n   std::ranges::generate_n(chars.begin(), 3,\r\n      []() { // lambda that takes no arguments\r\n         static char letter{'A'};\r\n         return letter++;\r\n      }\r\n   );\r\n\r\n   std::cout << \"\\nchars after generating A-C into elements 0-2: \";\r\n   std::ranges::copy(chars, output);\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson14/fig14_03.cpp",
    "content": "// fig14_03.cpp\r\n// Algorithms equal, mismatch and lexicographical_compare.\r\n#include <algorithm> // algorithm definitions\r\n#include <array> // array class-template definition\r\n#include <fmt/format.h> // C++20: This will be #include <format>\r\n#include <iomanip>\r\n#include <iostream>\r\n#include <iterator> // ostream_iterator\r\n#include <string>\r\n\r\nint main() {\r\n   std::array a1{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\r\n   std::array a2{a1}; // initializes a2 with copy of a1\r\n   std::array a3{1, 2, 3, 4, 1000, 6, 7, 8, 9, 10};\r\n   std::ostream_iterator<int> output{std::cout, \" \"};\r\n\r\n   std::cout << \"a1 contains: \";\r\n   std::ranges::copy(a1, output);\r\n   std::cout << \"\\na2 contains: \";\r\n   std::ranges::copy(a2, output);\r\n   std::cout << \"\\na3 contains: \";\r\n   std::ranges::copy(a3, output);\r\n\r\n   // compare a1 and a2 for equality                        \r\n   std::cout << fmt::format(\"\\n\\na1 is equal to a2: {}\\n\",\r\n      std::ranges::equal(a1, a2));\r\n\r\n   // compare a1 and a3 for equality                     \r\n   std::cout << fmt::format(\"a1 is equal to a3: {}\\n\",\r\n      std::ranges::equal(a1, a3));\r\n\r\n   // check for mismatch between a1 and a3 \r\n   auto location{std::ranges::mismatch(a1, a3)};\r\n   std::cout << fmt::format(\"a1 and a3 mismatch at index {} ({} vs. {})\\n\",\r\n      (location.in1 - a1.begin()), *location.in1, *location.in2);\r\n\r\n   std::string s1{\"HELLO\"};\r\n   std::string s2{\"BYE BYE\"};\r\n\r\n   // perform lexicographical comparison of c1 and c2  \r\n   std::cout << fmt::format(\"\\\"{}\\\" < \\\"{}\\\": {}\\n\", s1, s2,\r\n      std::ranges::lexicographical_compare(s1, s2));\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson14/fig14_04.cpp",
    "content": "// fig14_04.cpp\r\n// Algorithms remove, remove_if, remove_copy and remove_copy_if.\r\n#include <algorithm> // algorithm definitions\r\n#include <iostream>\r\n#include <iterator> // ostream_iterator\r\n#include <vector> \r\n\r\nint main() {\r\n   std::vector init{10, 2, 15, 4, 10, 6};\r\n   std::ostream_iterator<int> output{std::cout, \" \"};\r\n\r\n   std::vector v1{init}; // initialize with copy of init\r\n   std::cout << \"v1: \";\r\n   std::ranges::copy(v1, output);\r\n\r\n   // remove all 10s from v1                                \r\n   auto removed{std::ranges::remove(v1, 10)};\r\n   v1.erase(removed.begin(), removed.end());\r\n   std::cout << \"\\nv1 after removing 10s: \";\r\n   std::ranges::copy(v1, output);\r\n\r\n   std::vector v2{init}; // initialize with copy of init\r\n   std::cout << \"\\n\\nv2: \";\r\n   std::ranges::copy(v2, output);\r\n\r\n   // copy from v2 to c1, removing 10s in the process    \r\n   std::vector<int> c1{};\r\n   std::ranges::remove_copy(v2, std::back_inserter(c1), 10);\r\n   std::cout << \"\\nc1 after copying v2 without 10s: \";\r\n   std::ranges::copy(c1, output);\r\n\r\n   std::vector v3{init}; // initialize with copy of init\r\n   std::cout << \"\\n\\nv3: \";\r\n   std::ranges::copy(v3, output);\r\n\r\n   // remove elements greater than 9 from v3                    \r\n   auto greaterThan9{[](auto x) {return x > 9;}};\r\n   auto removed2{std::ranges::remove_if(v3, greaterThan9)};\r\n   v3.erase(removed2.begin(), removed2.end());\r\n   std::cout << \"\\nv3 after removing elements greater than 9: \";\r\n   std::ranges::copy(v3, output);\r\n\r\n   std::vector v4{init}; // initialize with copy of init\r\n   std::cout << \"\\n\\nv4: \";\r\n   std::ranges::copy(v4, output);\r\n\r\n   // copy elements from v4 to c2, removing elements greater than 9\r\n   std::vector<int> c2{}; \r\n   std::ranges::remove_copy_if(v4, std::back_inserter(c2), greaterThan9);\r\n   std::cout << \"\\nc2 after copying v4 without elements greater than 9: \";\r\n   std::ranges::copy(c2, output);\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson14/fig14_05.cpp",
    "content": "// fig14_05.cpp\r\n// Algorithms replace, replace_if, replace_copy and replace_copy_if.\r\n#include <algorithm>\r\n#include <array>\r\n#include <iostream>\r\n#include <iterator> // ostream_iterator\r\n\r\nint main() {\r\n   std::ostream_iterator<int> output{std::cout, \" \"};\r\n\r\n   std::array a1{10, 2, 15, 4, 10, 6};\r\n   std::cout << \"a1: \";\r\n   std::ranges::copy(a1, output);\r\n\r\n   // replace all 10s in a1 with 100        \r\n   std::ranges::replace(a1, 10, 100);\r\n   std::cout << \"\\na1 after replacing 10s with 100s: \";\r\n   std::ranges::copy(a1, output);\r\n\r\n   std::array a2{10, 2, 15, 4, 10, 6};\r\n   std::array<int, a2.size()> c1{};\r\n   std::cout << \"\\n\\na2: \";\r\n   std::ranges::copy(a2, output);\r\n\r\n   // copy from a2 to c1, replacing 10s with 100s              \r\n   std::ranges::replace_copy(a2, c1.begin(), 10, 100);\r\n   std::cout << \"\\nc1 after replacing a2's 10s with 100s: \";\r\n   std::ranges::copy(c1, output);\r\n\r\n   std::array a3{10, 2, 15, 4, 10, 6};\r\n   std::cout << \"\\n\\na3: \";\r\n   std::ranges::copy(a3, output);\r\n\r\n   // replace values greater than 9 in a3 with 100   \r\n   auto greaterThan9{[](auto x) {return x > 9; }};\r\n   std::ranges::replace_if(a3, greaterThan9, 100);\r\n   std::cout << \"\\na3 after replacing values greater than 9 with 100s: \";\r\n   std::ranges::copy(a3, output);\r\n\r\n   std::array a4{10, 2, 15, 4, 10, 6};\r\n   std::array<int, a4.size()> c2{};\r\n   std::cout << \"\\n\\na4: \";\r\n   std::ranges::copy(a4, output);\r\n\r\n   // copy a4 to c2, replacing elements greater than 9 with 100         \r\n   std::ranges::replace_copy_if(a4, c2.begin(), greaterThan9, 100);\r\n   std::cout << \"\\nc2 after replacing a4's values \"\r\n      << \"greater than 9 with 100s: \";\r\n   std::ranges::copy(c2, output);\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson14/fig14_06.cpp",
    "content": "// fig14_06.cpp\r\n// Shuffling, counting, and minimum and maximum element algorithms.\r\n#include <algorithm> \r\n#include <array>\r\n#include <iostream>\r\n#include <iterator> \r\n#include <random> \r\n\r\nint main() {\r\n   std::array a1{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\r\n   std::ostream_iterator<int> output{std::cout, \" \"};\r\n\r\n   std::cout << \"a1: \";\r\n   std::ranges::copy(a1, output);\r\n\r\n   // create random-number engine and use it to help shuffle a1\r\n   std::default_random_engine randomEngine{std::random_device{}()};\r\n   std::ranges::shuffle(a1, randomEngine); // randomly order elements\r\n   std::cout << \"\\na1 shuffled: \";\r\n   std::ranges::copy(a1, output);\r\n\r\n   std::array a2{100, 2, 8, 1, 50, 3, 8, 8, 9, 10};\r\n   std::cout << \"\\n\\na2: \";\r\n   std::ranges::copy(a2, output);\r\n\r\n   // count number of elements in a2 with value 8  \r\n   auto result1{std::ranges::count(a2, 8)};\r\n   std::cout << \"\\nCount of 8s in a2: \" << result1;\r\n\r\n   // count number of elements in a2 that are greater than 9\r\n   auto result2{std::ranges::count_if(a2, [](auto x){return x > 9;})};\r\n   std::cout << \"\\nCount of a2 elements greater than 9: \" << result2;\r\n\r\n   // locate minimum element in a2\r\n   if (auto result{std::ranges::min_element(a2)}; result != a2.end()) {\r\n      std::cout << \"\\n\\na2 minimum element: \" << *result;\r\n   }\r\n\r\n   // locate maximum element in a2\r\n   if (auto result{std::ranges::max_element(a2)}; result != a2.end()) {\r\n      std::cout << \"\\na2 maximum element: \" << *result;\r\n   }\r\n\r\n   // locate minimum and maximum elements in a2\r\n   auto [min, max] {std::ranges::minmax_element(a2)};\r\n   std::cout << \"\\na2 minimum and maximum elements: \"\r\n      << *min << \" and \" << *max;\r\n\r\n   // calculate cube of each element in a1; place results in cubes\r\n   std::array<int, a1.size()> cubes{};\r\n   std::ranges::transform(a1, cubes.begin(),\r\n      [](auto x) {return x * x * x;});\r\n   std::cout << \"\\n\\na1 values cubed: \";\r\n   std::ranges::copy(cubes, output);\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson14/fig14_07.cpp",
    "content": "// fig14_07.cpp\r\n// Standard library search and sort algorithms.\r\n#include <algorithm> // algorithm definitions\r\n#include <array> // array class-template definition\r\n#include <iostream>\r\n#include <iterator> \r\n\r\nint main() {\r\n   std::array values{10, 2, 17, 5, 16, 8, 13, 11, 20, 7};\r\n   std::ostream_iterator<int> output{std::cout, \" \"};\r\n\r\n   std::cout << \"values contains: \";\r\n   std::ranges::copy(values, output); // display output vector\r\n\r\n   // locate first occurrence of 16 in values          \r\n   if (auto loc1{std::ranges::find(values, 16)}; loc1 != values.cend()) {\r\n      std::cout << \"\\n\\nFound 16 at index: \" << (loc1 - values.cbegin());\r\n   }\r\n   else { // 16 not found\r\n      std::cout << \"\\n\\n16 not found\";\r\n   }\r\n\r\n   // locate first occurrence of 100 in values  \r\n   if (auto loc2{std::ranges::find(values, 100)}; loc2 != values.cend()) {\r\n      std::cout << \"\\nFound 100 at index: \" << (loc2 - values.cbegin());\r\n   }\r\n   else { // 100 not found \r\n      std::cout << \"\\n100 not found\";\r\n   }\r\n\r\n   // create variable to store lambda for reuse later\r\n   auto isGreaterThan10{[](auto x) {return x > 10;}};\r\n\r\n   // locate first occurrence of value greater than 10 in values\r\n   auto loc3{std::ranges::find_if(values, isGreaterThan10)};\r\n\r\n   if (loc3 != values.cend()) { // found value greater than 10\r\n      std::cout << \"\\n\\nFirst value greater than 10: \" << *loc3\r\n         << \"\\nfound at index: \" << (loc3 - values.cbegin());\r\n   }\r\n   else { // value greater than 10 not found\r\n      std::cout << \"\\n\\nNo values greater than 10 were found\";\r\n   }\r\n\r\n   // sort elements of values      \r\n   std::ranges::sort(values);\r\n   std::cout << \"\\n\\nvalues after sort: \";\r\n   std::ranges::copy(values, output);\r\n\r\n   // use binary_search to check whether 13 exists in values\r\n   if (std::ranges::binary_search(values, 13)) {\r\n      std::cout << \"\\n\\n13 was found in values\";\r\n   }\r\n   else {\r\n      std::cout << \"\\n\\n13 was not found in values\";\r\n   }\r\n\r\n   // use binary_search to check whether 100 exists in values\r\n   if (std::ranges::binary_search(values, 100)) {\r\n      std::cout << \"\\n100 was found in values\";\r\n   }\r\n   else {\r\n      std::cout << \"\\n100 was not found in values\";\r\n   }\r\n\r\n   // determine whether all of values' elements are greater than 10\r\n   if (std::ranges::all_of(values, isGreaterThan10)) {\r\n      std::cout << \"\\n\\nAll values elements are greater than 10\";\r\n   }\r\n   else {\r\n      std::cout << \"\\n\\nSome values elements are not greater than 10\";\r\n   }\r\n\r\n   // determine whether any of values' elements are greater than 10\r\n   if (std::ranges::any_of(values, isGreaterThan10)) {\r\n      std::cout << \"\\n\\nSome values elements are greater than 10\";\r\n   }\r\n   else {\r\n      std::cout << \"\\n\\nNo values elements are greater than 10\";\r\n   }\r\n\r\n   // determine whether none of values' elements are greater than 10\r\n   if (std::ranges::none_of(values, isGreaterThan10)) {\r\n      std::cout << \"\\n\\nNo values elements are greater than 10\";\r\n   }\r\n   else {\r\n      std::cout << \"\\n\\nSome values elements are greater than 10\";\r\n   }\r\n\r\n   // locate first occurrence of value that is not greater than 10\r\n   auto loc4{std::ranges::find_if_not(values, isGreaterThan10)};\r\n\r\n   if (loc4 != values.cend()) { // found a value less than or equal to 10\r\n      std::cout << \"\\n\\nFirst value not greater than 10: \" << *loc4\r\n         << \"\\nfound at index: \" << (loc4 - values.cbegin());\r\n   }\r\n   else { // no values less than or equal to 10 were found\r\n      std::cout << \"\\n\\nOnly values greater than 10 were found\";\r\n   }\r\n\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson14/fig14_08.cpp",
    "content": "// fig14_08.cpp\r\n// Algorithms swap, iter_swap and swap_ranges.\r\n#include <algorithm> \r\n#include <array>\r\n#include <iostream>\r\n#include <iterator> \r\n\r\nint main() {\r\n   std::array values{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\r\n   std::ostream_iterator<int> output{std::cout, \" \"};\r\n\r\n   std::cout << \"values contains: \";\r\n   std::ranges::copy(values, output);\r\n\r\n   std::swap(values[0], values[1]); // swap elements at index 0 and 1\r\n\r\n   std::cout << \"\\nafter std::swap of values[0] and values[1]: \";\r\n   std::ranges::copy(values, output);\r\n\r\n   // use iterators to swap elements at locations 0 and 1 \r\n   std::iter_swap(values.begin(), values.begin() + 1);\r\n   std::cout << \"\\nafter std::iter_swap of values[0] and values[1]: \";\r\n   std::ranges::copy(values, output);\r\n\r\n   // swap values and values2  \r\n   std::array values2{10, 9, 8, 7, 6, 5, 4, 3, 2, 1};\r\n   std::cout << \"\\n\\nBefore swap_ranges\\nvalues contains: \";\r\n   std::ranges::copy(values, output);\r\n   std::cout << \"\\nvalues2 contains: \";\r\n   std::ranges::copy(values2, output);\r\n   std::ranges::swap_ranges(values, values2);\r\n   std::cout << \"\\n\\nAfter swap_ranges\\nvalues contains: \";\r\n   std::ranges::copy(values, output);\r\n   std::cout << \"\\nvalues2 contains: \";\r\n   std::ranges::copy(values2, output);\r\n\r\n   // swap first five elements of values and values2\r\n   std::ranges::swap_ranges(values.begin(), values.begin() + 5,\r\n      values2.begin(), values2.begin() + 5);\r\n\r\n   std::cout << \"\\n\\nAfter swap_ranges for 5 elements\"\r\n      << \"\\nvalues contains: \";\r\n   std::ranges::copy(values, output);\r\n   std::cout << \"\\nvalues2 contains: \";\r\n   std::ranges::copy(values2, output);\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson14/fig14_09.cpp",
    "content": "// fig14_09.cpp\r\n// Algorithms copy_backward, merge, unique, reverse, copy_if and copy_n.\r\n#include <algorithm> \r\n#include <array>  \r\n#include <iostream>\r\n#include <iterator> \r\n#include <vector>\r\n\r\nint main() {\r\n   std::array a1{1, 3, 5, 7, 9};\r\n   std::array a2{2, 4, 5, 7, 9};\r\n   std::ostream_iterator<int> output{std::cout, \" \"};\r\n\r\n   std::cout << \"array a1 contains: \";\r\n   std::ranges::copy(a1, output); // display a1\r\n   std::cout << \"\\narray a2 contains: \";\r\n   std::ranges::copy(a2, output); // display a2\r\n\r\n   // place elements of a1 into results in reverse order  \r\n   std::array<int, a1.size()> results{};\r\n   std::ranges::copy_backward(a1, results.end());\r\n   std::cout << \"\\n\\nAfter copy_backward, results contains: \";\r\n   std::ranges::copy(results, output);\r\n\r\n   // merge elements of a1 and a2 into results2 in sorted order\r\n   std::array<int, a1.size() + a2.size()> results2{};\r\n   std::ranges::merge(a1, a2, results2.begin());\r\n\r\n   std::cout << \"\\n\\nAfter merge of a1 and a2, results2 contains: \";\r\n   std::ranges::copy(results2, output);\r\n\r\n   // eliminate duplicate values from v \r\n   std::vector v(results2.begin(), results2.end());\r\n   auto [first, last] {std::ranges::unique(v)};\r\n   v.erase(first, last); // remove elements that no longer contain values\r\n\r\n   std::cout << \"\\n\\nAfter unique v contains: \";\r\n   std::ranges::copy(v, output);\r\n\r\n   std::cout << \"\\n\\nAfter reverse, a1 contains: \";\r\n   std::ranges::reverse(a1); // reverse elements of a1\r\n   std::ranges::copy(a1, output);\r\n\r\n   // copy odd elements of a2 into v2\r\n   std::vector<int> v2{};\r\n   std::cout << \"\\n\\nAfter copy_if, v2 contains: \";\r\n   std::ranges::copy_if(a2, std::back_inserter(v2),\r\n      [](auto x) {return x % 2 == 0; });\r\n   std::ranges::copy(v2, output);\r\n\r\n   // copy three elements of a2 into v3\r\n   std::vector<int> v3{};\r\n   std::cout << \"\\n\\nAfter copy_n, v3 contains: \";\r\n   std::ranges::copy_n(a2.begin(), 3, std::back_inserter(v3));\r\n   std::ranges::copy(v3, output);\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson14/fig14_10.cpp",
    "content": "// fig14_10.cpp\r\n// Algorithms inplace_merge, unique_copy and reverse_copy.\r\n#include <algorithm>\r\n#include <array> \r\n#include <iostream>\r\n#include <iterator> \r\n#include <vector> \r\n\r\nint main() {\r\n   std::array a1{1, 3, 5, 7, 9, 1, 3, 5, 7, 9};\r\n   std::ostream_iterator<int> output{std::cout, \" \"};\r\n\r\n   std::cout << \"array a1 contains: \";\r\n   std::ranges::copy(a1, output);\r\n\r\n   // merge first half of a1 with second half of a1 such that\r\n   // a1 contains sorted set of elements after merge         \r\n   std::ranges::inplace_merge(a1, a1.begin() + 5);\r\n   std::cout << \"\\nAfter inplace_merge, a1 contains: \";\r\n   std::ranges::copy(a1, output);\r\n\r\n   // copy only unique elements of a1 into results1                 \r\n   std::vector<int> results1{};\r\n   std::ranges::unique_copy(a1, std::back_inserter(results1));\r\n   std::cout << \"\\nAfter unique_copy, results1 contains: \";\r\n   std::ranges::copy(results1, output);\r\n\r\n   // copy elements of a1 into results2 in reverse order             \r\n   std::vector<int> results2{};\r\n   std::ranges::reverse_copy(a1, std::back_inserter(results2));\r\n   std::cout << \"\\nAfter reverse_copy, results2 contains: \";\r\n   std::ranges::copy(results2, output);\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson14/fig14_11.cpp",
    "content": "// fig14_11.cpp\r\n// Algorithms includes, set_difference, set_intersection, \r\n// set_symmetric_difference and set_union.\r\n#include <array>\r\n#include <algorithm>\r\n#include <fmt/format.h> // C++20: This will be #include <format>\r\n#include <iostream>\r\n#include <iterator> \r\n#include <vector> \r\n\r\nint main() {\r\n   std::array a1{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\r\n   std::array a2{4, 5, 6, 7, 8};\r\n   std::array a3{4, 5, 6, 11, 15};\r\n   std::ostream_iterator<int> output{std::cout, \" \"};\r\n\r\n   std::cout << \"a1 contains: \";\r\n   std::ranges::copy(a1, output); // display array a1\r\n   std::cout << \"\\na2 contains: \";\r\n   std::ranges::copy(a2, output); // display array a2\r\n   std::cout << \"\\na3 contains: \";\r\n   std::ranges::copy(a3, output); // display array a3\r\n\r\n   // determine whether a2 is completely contained in a1\r\n   std::cout << fmt::format(\"\\n\\na1 {} a2\",\r\n      std::ranges::includes(a1, a2) ? \"includes\" : \"does not include\");\r\n\r\n   // determine whether a3 is completely contained in a1\r\n   std::cout << fmt::format(\"\\n\\na1 {} a3\",\r\n      std::ranges::includes(a1, a3) ? \"includes\" : \"does not include\");\r\n\r\n   // determine elements of a1 not in a2 \r\n   std::vector<int> difference{};\r\n   std::ranges::set_difference(a1, a2, std::back_inserter(difference));\r\n   std::cout << \"\\n\\nset_difference of a1 and a2 is: \";\r\n   std::ranges::copy(difference, output);\r\n\r\n   // determine elements in both a1 and a2                 \r\n   std::vector<int> intersection{};\r\n   std::ranges::set_intersection(a1, a2,\r\n      std::back_inserter(intersection));\r\n   std::cout << \"\\n\\nset_intersection of a1 and a2 is: \";\r\n   std::ranges::copy(intersection, output);\r\n\r\n   // determine elements of a1 that are not in a3 and              \r\n   // elements of a3 that are not in a1                            \r\n   std::vector<int> symmetricDifference{};\r\n   std::ranges::set_symmetric_difference(a1, a3,\r\n      std::back_inserter(symmetricDifference));\r\n   std::cout << \"\\n\\nset_symmetric_difference of a1 and a3 is: \";\r\n   std::ranges::copy(symmetricDifference, output);\r\n\r\n   // determine elements that are in either or both sets\r\n   std::vector<int> unionSet{};\r\n   std::ranges::set_union(a1, a3, std::back_inserter(unionSet));\r\n   std::cout << \"\\n\\nset_union of a1 and a3 is: \";\r\n   std::ranges::copy(unionSet, output);\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson14/fig14_12.cpp",
    "content": "// fig14_12.cpp\r\n// Algorithms lower_bound, upper_bound and \r\n// equal_range for a sorted sequence of values.\r\n#include <algorithm> \r\n#include <array> \r\n#include <iostream>\r\n#include <iterator> \r\n\r\nint main() {\r\n   std::array values{2, 2, 4, 4, 4, 6, 6, 6, 6, 8};\r\n   std::ostream_iterator<int> output{std::cout, \" \"};\r\n\r\n   std::cout << \"values contains: \";\r\n   std::ranges::copy(values, output);\r\n\r\n   // determine lower-bound insertion point for 6 in values \r\n   auto lower{std::ranges::lower_bound(values, 6)};\r\n   std::cout << \"\\n\\nLower bound of 6 is index: \"\r\n      << (lower - values.begin());\r\n\r\n   // determine upper-bound insertion point for 6 in values \r\n   auto upper{std::ranges::upper_bound(values, 6)};\r\n   std::cout << \"\\nUpper bound of 6 is index: \"\r\n      << (upper - values.begin());\r\n\r\n   // use equal_range to determine the lower and upper bound of 6\r\n   auto [first, last]{std::ranges::equal_range(values, 6)};\r\n   std::cout << \"\\nUsing equal_range:\\n   Lower bound of 6 is index: \"\r\n      << (first - values.begin());\r\n   std::cout << \"\\n   Upper bound of 6 is index: \"\r\n      << (last - values.begin());\r\n\r\n   // determine lower-bound insertion point for 3 in values\r\n   std::cout << \"\\n\\nUse lower_bound to locate the first point \"\r\n      << \"at which 3 can be inserted in order\";\r\n   lower = std::ranges::lower_bound(values, 3);\r\n   std::cout << \"\\n   Lower bound of 3 is index: \"\r\n      << (lower - values.begin());\r\n\r\n   // determine upper-bound insertion point for 7 in values\r\n   std::cout << \"\\n\\nUse upper_bound to locate the last point \"\r\n      << \"at which 7 can be inserted in order\";\r\n   upper = std::ranges::upper_bound(values, 7);\r\n   std::cout << \"\\n   Upper bound of 7 is index: \"\r\n      << (upper - values.begin()) << \"\\n\";\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson14/fig14_13.cpp",
    "content": "// fig14_13.cpp\r\n// Algorithms min, max and minmax.\r\n#include <array>\r\n#include <algorithm>\r\n#include <iostream>\r\n\r\nint main() {\r\n   std::cout << \"Minimum of 12 and 7 is: \" << std::min(12, 7)\r\n      << \"\\nMaximum of 12 and 7 is: \" << std::max(12, 7)\r\n      << \"\\nMinimum of 'G' and 'Z' is: '\" << std::min('G', 'Z') << \"'\"\r\n      << \"\\nMaximum of 'G' and 'Z' is: '\" << std::max('G', 'Z') << \"'\"\r\n      << \"\\nMinimum of 'z' and 'Z' is: '\" << std::min('z', 'Z') << \"'\";\r\n\r\n   // determine which argument is the min and which is the max\r\n   auto [smaller, larger]{std::minmax(12, 7)};\r\n   std::cout << \"\\n\\nMinimum of 12 and 7 is: \" << smaller\r\n      << \"\\nMaximum of 12 and 7 is: \" << larger;\r\n\r\n   std::array items{3, 100, 52, 77, 22, 31, 1, 98, 13, 40};\r\n   std::ostream_iterator<int> output{std::cout, \" \"};\r\n\r\n   std::cout << \"\\n\\nitems: \";\r\n   std::ranges::copy(items, output);\r\n\r\n   auto [smallest, largest]{std::ranges::minmax(items)};\r\n   std::cout << \"\\nMinimum value in items: \" << smallest\r\n      << \"\\nMaximum value in items is: \" << largest << \"\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson14/fig14_14.cpp",
    "content": "// fig14_14.cpp\r\n// Demonstrating algorithms gcd, lcm, iota, reduce and partial_sum.\r\n#include <array> \r\n#include <algorithm>\r\n#include <functional>\r\n#include <iostream>\r\n#include <iterator>\r\n#include <numeric> \r\n\r\nint main() {\r\n   std::ostream_iterator<int> output{std::cout, \" \"};\r\n\r\n   // calculate the greatest common divisor of two integers\r\n   std::cout << \"std::gcd(75, 20): \" << std::gcd(75, 20)\r\n      << \"\\nstd::gcd(75, 13): \" << std::gcd(75, 13);\r\n\r\n   // calculate the least common multiple of two integers\r\n   std::cout << \"\\n\\nstd::lcm(3, 5): \" << std::lcm(3, 5)\r\n      << \"\\nstd::lcm(12, 9): \" << std::lcm(12, 9);\r\n\r\n   // fill an array with integers using the std::iota algorithm\r\n   std::array<int, 5> ints{};\r\n   std::iota(ints.begin(), ints.end(), 1);\r\n   std::cout << \"\\n\\nints: \";\r\n   std::ranges::copy(ints, output);\r\n\r\n   // reduce elements of a container to a single value\r\n   std::cout << \"\\n\\nsum of ints: \"\r\n      << std::reduce(ints.begin(), ints.end())\r\n      << \"\\nproduct of ints: \"\r\n      << std::reduce(ints.begin(), ints.end(), 1, std::multiplies{});\r\n\r\n   // calculate the partial sums of ints' elements \r\n   std::cout << \"\\n\\nints: \";\r\n   std::ranges::copy(ints, output);\r\n   std::cout << \"\\n\\npartial_sum of ints using std::plus by default: \";\r\n   std::partial_sum(ints.begin(), ints.end(), output);\r\n   std::cout << \"\\npartial_sum of ints using std::multiplies: \";\r\n   std::partial_sum(ints.begin(), ints.end(), output, std::multiplies{});\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson14/fig14_15.cpp",
    "content": "// fig14_15.cpp\r\n// Algorithms make_heap, sort_heap, push_heap and pop_heap.\r\n#include <iostream>\r\n#include <algorithm>\r\n#include <array>\r\n#include <vector>\r\n#include <iterator> \r\n\r\nint main() {\r\n   std::ostream_iterator<int> output{std::cout, \" \"};\r\n\r\n   std::array heapArray{3, 100, 52, 77, 22, 31, 1, 98, 13, 40};\r\n   std::cout << \"heapArray before make_heap:\\n\";\r\n   std::ranges::copy(heapArray, output);\r\n\r\n   std::ranges::make_heap(heapArray); // create heap from heapArray\r\n   std::cout << \"\\nheapArray after make_heap:\\n\";\r\n   std::ranges::copy(heapArray, output);\r\n\r\n   std::ranges::sort_heap(heapArray); // sort elements with sort_heap\r\n   std::cout << \"\\nheapArray after sort_heap:\\n\";\r\n   std::ranges::copy(heapArray, output);\r\n\r\n   // lambda to add an int to a heap\r\n   auto push{\r\n      [&](std::vector<int>& heap, int value) {\r\n         std::cout << \"\\n\\npushing \" << value << \" onto heap\";\r\n         heap.push_back(value); // add value to the heap\r\n         std::ranges::push_heap(heap); // insert last element into heap\r\n         std::cout << \"\\nheap: \";\r\n         std::ranges::copy(heap, output);\r\n      }\r\n   };\r\n\r\n   // lambda to remove an item from the heap\r\n   auto pop{\r\n      [&](std::vector<int>& heap) {\r\n         std::ranges::pop_heap(heap); // remove max item from heap\r\n         std::cout << \"\\n\\npopping highest priority item: \" << heap.back();\r\n         heap.pop_back(); // remove vector's last element\r\n         std::cout << \"\\nheap: \";\r\n         std::ranges::copy(heap, output);\r\n      }\r\n   };\r\n\r\n   std::vector<int> heapVector{};\r\n\r\n   // place five integers into heapVector, maintaining it as a heap\r\n   for (auto value : {3, 52, 100}) {\r\n      push(heapVector, value);\r\n   }\r\n\r\n   pop(heapVector); // remove max item \r\n   push(heapVector, 22); // add new item to heap\r\n\r\n   pop(heapVector); // remove max item \r\n   push(heapVector, 77); // add new item to heap\r\n\r\n   pop(heapVector); // remove max item \r\n   pop(heapVector); // remove max item \r\n   pop(heapVector); // remove max item \r\n   std::cout << \"\\n\";\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson14/fig14_16.cpp",
    "content": "// fig14_16.cpp\r\n// Demonstrating function objects.\r\n#include <array> \r\n#include <algorithm>\r\n#include <functional>\r\n#include <iostream>\r\n#include <iterator>\r\n#include <numeric> \r\n\r\n// binary function returns the sum of its first argument total \r\n// and the square of its second argument value\r\nint sumSquares(int total, int value) {\r\n   return total + value * value;\r\n}\r\n\r\n// class SumSquaresClass defines overloaded operator()\r\n// that returns the sum of its first argument total \r\n// and the square of its second argument value               \r\nclass SumSquaresClass {\r\npublic:\r\n   // add square of value to total and return result           \r\n   int operator()(int total, int value) {\r\n      return total + value * value;\r\n   }\r\n};\r\n\r\nint main() {\r\n   std::array integers{1, 2, 3, 4};\r\n   std::ostream_iterator<int> output{std::cout, \" \"};\r\n\r\n   std::cout << \"array integers contains: \";\r\n   std::ranges::copy(integers, output);\r\n\r\n   // calculate sum of squares of elements of array integers\r\n   // using binary function sumSquares                      \r\n   int result{std::accumulate(integers.cbegin(), integers.cend(),\r\n      0, sumSquares)};\r\n\r\n   std::cout << \"\\n\\nSum of squares\\n\"\r\n      << \"via binary function sumSquares: \" << result;\r\n\r\n   // calculate sum of squares of elements of array integers\r\n   // using binary function object                           \r\n   result = std::accumulate(integers.cbegin(), integers.cend(),\r\n      0, SumSquaresClass{});\r\n\r\n   std::cout << \"\\nvia a SumSquaresClass function object: \" << result;\r\n\r\n   // calculate sum of squares array\r\n   result = std::accumulate(integers.cbegin(), integers.cend(),\r\n      0, [](auto total, auto value) {return total + value * value;});\r\n\r\n   std::cout << \"\\nvia a lambda: \" << result << \"\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson14/fig14_17.cpp",
    "content": "// fig14_17.cpp\r\n// Demonstrating projections with C++20 range algorithms.\r\n#include <array> \r\n#include <algorithm>\r\n#include <fmt/format.h>\r\n#include <iostream>\r\n#include <iterator>\r\n#include <string> \r\n#include <string_view> \r\n\r\nclass Employee {\r\npublic:\r\n   Employee(std::string_view first, std::string_view last, int salary)\r\n      : m_first{first}, m_last{last}, m_salary{salary} {}\r\n   std::string getFirst() const {return m_first;}\r\n   std::string getLast() const {return m_last;}\r\n   int getSalary() const {return m_salary;}\r\nprivate:\r\n   std::string m_first;\r\n   std::string m_last;\r\n   int m_salary;\r\n};\r\n\r\n// operator<< for an Employee\r\nstd::ostream& operator<<(std::ostream& out, const Employee& e) {\r\n   out << fmt::format(\"{:10}{:10}{}\", \r\n      e.getLast(), e.getFirst(), e.getSalary());\r\n   return out;\r\n}\r\n\r\nint main() {\r\n   std::array employees{\r\n      Employee{\"Jason\", \"Red\", 5000},\r\n      Employee{\"Ashley\", \"Green\", 7600},\r\n      Employee{\"Matthew\", \"Indigo\", 3587}\r\n   };\r\n\r\n   std::ostream_iterator<Employee> output{std::cout, \"\\n\"};\r\n\r\n   std::cout << \"Employees:\\n\";\r\n   std::ranges::copy(employees, output);\r\n\r\n   // sort Employees by salary; {} indicates that the algorithm should\r\n   // use its default comparison function\r\n   std::ranges::sort(employees, {},\r\n      [](const auto& e) {return e.getSalary(); });\r\n   std::cout << \"\\nEmployees sorted in ascending order by salary:\\n\";\r\n   std::ranges::copy(employees, output);\r\n\r\n   // sort Employees by salary in descending order\r\n   std::ranges::sort(employees, std::ranges::greater{},\r\n      &Employee::getSalary);\r\n   std::cout << \"\\nEmployees sorted in descending order by salary:\\n\";\r\n   std::ranges::copy(employees, output);\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson14/fig14_18.cpp",
    "content": "// fig14_18.cpp\r\n// Working with C++20 std::views.\r\n#include <algorithm>\r\n#include <iostream>\r\n#include <iterator>\r\n#include <map> \r\n#include <ranges> \r\n#include <string> \r\n#include <vector> \r\n\r\nint main() {\r\n   std::ostream_iterator<int> output{std::cout, \" \"};\r\n   auto isEven{[](int x) {return x % 2 == 0;}}; // true if x is even\r\n\r\n   // infinite view of even integers starting at 0\r\n   auto evens{std::views::iota(0) | std::views::filter(isEven)};\r\n\r\n   std::cout << \"First five even ints: \";\r\n   std::ranges::copy(evens | std::views::take(5), output);\r\n\r\n   std::cout << \"\\nEven ints less than 12: \";\r\n   auto lessThan12{\r\n      evens | std::views::take_while([](int x) {return x < 12;})};\r\n   std::ranges::copy(lessThan12, output);\r\n\r\n   std::cout << \"\\nEven ints less than 12 reversed: \";\r\n   std::ranges::copy(lessThan12 | std::views::reverse, output);\r\n\r\n   std::cout << \"\\nSquares of even ints less than 12 reversed: \";\r\n   std::ranges::copy(\r\n      lessThan12\r\n         | std::views::reverse\r\n         | std::views::transform([](int x) {return x * x;}), \r\n      output);\r\n\r\n   std::cout << \"\\nSkip 1000 even ints, then take five: \";\r\n   std::ranges::copy(\r\n      evens | std::views::drop(1000) | std::views::take(5),\r\n      output);\r\n\r\n   std::cout << \"\\nFirst five even ints greater than 1000: \";\r\n   std::ranges::copy(\r\n      evens\r\n         | std::views::drop_while([](int x) {return x <= 1000;})\r\n         | std::views::take(5),\r\n      output);\r\n\r\n   // allow std::string object literals\r\n   using namespace std::string_literals;\r\n\r\n   std::map<std::string, int> romanNumerals{\r\n      {\"I\"s, 1}, {\"II\"s, 2}, {\"III\"s, 3}, {\"IV\"s, 4}, {\"V\"s, 5}};\r\n   auto displayPair{[](const auto& p) {\r\n         std::cout << p.first << \" = \" << p.second << \"\\n\"; }};\r\n   std::cout << \"\\n\\nromanNumerals:\\n\";\r\n   std::ranges::for_each(romanNumerals, displayPair);\r\n\r\n   std::ostream_iterator<std::string> stringOutput{std::cout, \" \"};\r\n   std::cout << \"\\nKeys in romanNumerals: \";\r\n   std::ranges::copy(romanNumerals | std::views::keys, stringOutput);\r\n\r\n   std::cout << \"\\nValues in romanNumerals: \";\r\n   std::ranges::copy(romanNumerals | std::views::values, output);\r\n\r\n   std::cout << \"\\nKeys in romanNumerals via std::views::elements: \";\r\n   std::ranges::copy(\r\n      romanNumerals | std::views::elements<0>, stringOutput);\r\n\r\n   std::cout << \"\\nvalues in romanNumerals via std::views::elements: \";\r\n   std::ranges::copy(romanNumerals | std::views::elements<1>, output);\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_01-02/Stack.h",
    "content": "// Fig. 15.1: Stack.h\r\n// Stack class template.\r\n#pragma once\r\n#include <deque>\r\n\r\ntemplate<typename T>\r\nclass Stack {\r\npublic:\r\n   // return the top element of Stack\r\n   const T& top() const {return stack.front();}\r\n\r\n   // push an element onto Stack\r\n   void push(const T& pushValue) {stack.push_front(pushValue);}\r\n\r\n   // pop an element from Stack\r\n   void pop() {stack.pop_front();}\r\n\r\n   // determine whether Stack is empty\r\n   bool isEmpty() const {return stack.empty();}\r\n\r\n   // return size of Stack\r\n   size_t size() const {return stack.size();}\r\nprivate:\r\n   std::deque<T> stack{}; // internal representation of Stack\r\n}; \r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_01-02/fig15_02.cpp",
    "content": "// fig15_02.cpp\r\n// Stack class template test program.\r\n#include <iostream>\r\n#include \"Stack.h\" // Stack class template definition\r\n\r\nint main() {\r\n   Stack<double> doubleStack{}; // create a Stack of double\r\n   constexpr size_t doubleStackSize{5}; // stack size\r\n   double doubleValue{1.1}; // first value to push\r\n\r\n   std::cout << \"Pushing elements onto doubleStack\\n\";\r\n\r\n   // push 5 doubles onto doubleStack\r\n   for (size_t i{0}; i < doubleStackSize; ++i) {\r\n      doubleStack.push(doubleValue);\r\n      std::cout << doubleValue << ' ';\r\n      doubleValue += 1.1;\r\n   } \r\n\r\n   std::cout << \"\\n\\nPopping elements from doubleStack\\n\";\r\n\r\n   // pop elements from doubleStack\r\n   while (!doubleStack.isEmpty()) { // loop while Stack is not empty\r\n      std::cout << doubleStack.top() << ' '; // display top element\r\n      doubleStack.pop(); // remove top element\r\n   } \r\n\r\n   std::cout << \"\\nStack is empty, cannot pop.\\n\";\r\n\r\n   Stack<int> intStack{}; // create a Stack of int\r\n   constexpr size_t intStackSize{10}; // stack size\r\n   int intValue{1}; // first value to push\r\n\r\n   std::cout << \"\\nPushing elements onto intStack\\n\";\r\n\r\n   // push 10 integers onto intStack\r\n   for (size_t i{0}; i < intStackSize; ++i) {\r\n      intStack.push(intValue);\r\n      std::cout << intValue++ << ' ';\r\n   } \r\n\r\n   std::cout << \"\\n\\nPopping elements from intStack\\n\";\r\n\r\n   // pop elements from intStack\r\n   while (!intStack.isEmpty()) { // loop while Stack is not empty\r\n      std::cout << intStack.top() << ' '; // display top element\r\n      intStack.pop(); // remove top element\r\n   } \r\n\r\n   std::cout << \"\\nStack is empty, cannot pop.\\n\";\r\n} \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_03.cpp",
    "content": "// fig15_03.cpp\r\n// Abbreviated function template.\r\n#include <array>\r\n#include <iostream>\r\n#include <string>\r\n#include <vector>\r\n\r\n// abbreviated function template printContainer displays a \r\n// container's elements separated by spaces.\r\nvoid printContainer(const auto& items) {\r\n   for (const auto& item : items) {\r\n      std::cout << item << \" \";\r\n   }\r\n}\r\n\r\nint main() {\r\n   using namespace std::string_literals; // for string object literals\r\n\r\n   std::array ints{1, 2, 3, 4, 5};\r\n   std::vector strings{\"red\"s, \"green\"s, \"blue\"s};\r\n\r\n   std::cout << \"ints: \";\r\n   printContainer(ints);\r\n   std::cout << \"\\nstrings: \";\r\n   printContainer(strings);\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_04.cpp",
    "content": "// fig15_04.cpp\r\n// Simple unconstrained multiply function template.\r\n#include <iostream>\r\n\r\ntemplate<typename T>\r\nT multiply(T first, T second) {return first * second;}\r\n\r\nint main() {\r\n   std::cout << \"Product of 5 and 3: \" << multiply(5, 3)\r\n      << \"\\nProduct of 7.25 and 2.0: \" << multiply(7.25, 2.0) << \"\\n\";\r\n\r\n   // std::string s1{\"hi\"};\r\n   // std::string s2{\"bye\"};\r\n   // auto result{multiply(s1, s2)}; // string does not have * operator\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_05.cpp",
    "content": "// fig15_05.cpp\r\n// Constrained multiply function template that allows \r\n// only integers and floating-point values.\r\n#include <concepts>\r\n#include <iostream>\r\n\r\ntemplate<typename T>\r\n   requires std::integral<T> || std::floating_point<T>\r\nT multiply(T first, T second) {return first * second;}\r\n\r\nint main() {\r\n   std::cout << \"Product of 5 and 3: \" << multiply(5, 3)\r\n      << \"\\nProduct of 7.25 and 2.0: \" << multiply(7.25, 2.0) << \"\\n\";\r\n\r\n   std::string s1{\"hi\"};\r\n   std::string s2{\"bye\"};\r\n   auto result{multiply(s1, s2)};\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_06.cpp",
    "content": "// fig15_06.cpp\r\n// Using type traits to test whether types are \r\n// integral types, floating-point types or arithmetic types.\r\n#include <fmt/format.h>\r\n#include <iostream>\r\n#include <string>\r\n#include <type_traits> \r\n\r\nint main() {\r\n   std::cout << fmt::format(\"{}\\n{}{}\\n{}{}\\n{}{}\\n{}{}\\n{}{}\\n\\n\",\r\n      \"CHECK WITH TYPE TRAITS WHETHER TYPES ARE INTEGRAL\",\r\n      \"std::is_integral<int>::value: \", std::is_integral<int>::value,\r\n      \"std::is_integral_v<int>: \", std::is_integral_v<int>,\r\n      \"std::is_integral_v<long>: \", std::is_integral_v<long>,\r\n      \"std::is_integral_v<float>: \", std::is_integral_v<float>,\r\n      \"std::is_integral_v<std::string>: \",\r\n      std::is_integral_v<std::string>);\r\n\r\n   std::cout << fmt::format(\"{}\\n{}{}\\n{}{}\\n{}{}\\n{}{}\\n{}{}\\n\\n\",\r\n      \"CHECK WITH TYPE TRAITS WHETHER TYPES ARE FLOATING POINT\",\r\n      \"std::is_floating_point<float>::value: \",\r\n      std::is_floating_point<float>::value,\r\n      \"std::is_floating_point_v<float>: \",\r\n      std::is_floating_point_v<float>,\r\n      \"std::is_floating_point_v<double>: \",\r\n      std::is_floating_point_v<double>,\r\n      \"std::is_floating_point_v<int>: \",\r\n      std::is_floating_point_v<int>,\r\n      \"std::is_floating_point_v<std::string>: \",\r\n      std::is_floating_point_v<std::string>);\r\n\r\n   std::cout << fmt::format(\"{}\\n{}{}\\n{}{}\\n{}{}\\n{}{}\\n\",\r\n      \"CHECK WITH TYPE TRAITS WHETHER TYPES CAN BE USED IN ARITHMETIC\",\r\n      \"std::is_arithmetic<int>::value: \", std::is_arithmetic<int>::value,\r\n      \"std::is_arithmetic_v<int>: \", std::is_arithmetic_v<int>,\r\n      \"std::is_arithmetic_v<double>: \", std::is_arithmetic_v<double>,\r\n      \"std::is_arithmetic_v<std::string>: \",\r\n      std::is_arithmetic_v<std::string>);\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_07.cpp",
    "content": "// fig15_07.cpp\r\n// Constrained multiply abbreviated function template.\r\n#include <concepts>\r\n#include <iostream>\r\n\r\n// Numeric concept aggregates std::integral and std::floating_point\r\ntemplate<typename T>\r\nconcept Numeric = std::integral<T> || std::floating_point<T>;\r\n\r\n// abbreviated function template with constrained auto\r\nauto multiply(Numeric auto first, Numeric auto second) {\r\n   return first * second;\r\n}\r\n\r\nint main() {\r\n   std::cout << \"Product of 5 and 3: \" << multiply(5, 3)\r\n      << \"\\nProduct of 7.25 and 2.0: \" << multiply(7.25, 2.0)\r\n      << \"\\nProduct of 5 and 7.25: \" << multiply(5, 7.25) << \"\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_08.cpp",
    "content": "// fig15_08.cpp\r\n// Using concepts to select overloads.\r\n#include <array>\r\n#include <iostream>\r\n#include <iterator>\r\n#include <list>\r\n\r\n// calculate the distance (number of items) between two iterators \r\n// using input iterators; requires incrementing between iterators, \r\n// so this is an O(n) operation\r\ntemplate <std::input_iterator Iterator>\r\nauto customDistance(Iterator begin, Iterator end) {\r\n   std::cout << \"Called customDistance with input iterators\\n\";\r\n   std::ptrdiff_t count{0};\r\n\r\n   // increment from begin to end and count number of iterations\r\n   for (auto& iter{begin}; iter != end; ++iter) {\r\n      ++count;\r\n   }\r\n\r\n   return count;\r\n}\r\n\r\n// calculate the distance (number of items) between two iterators \r\n// using random-access iterators and an O(1) operation\r\ntemplate <std::random_access_iterator Iterator>\r\nauto customDistance(Iterator begin, Iterator end) {\r\n   std::cout << \"Called customDistance with random-access iterators\\n\";\r\n   return end - begin; // returns a std::ptrdiff_t value\r\n}\r\n\r\nint main() {\r\n   std::array ints1{1, 2, 3, 4, 5}; // has random-access iterators\r\n   std::list ints2{1, 2, 3}; // has bidirectional iterators\r\n\r\n   auto result1{customDistance(ints1.begin(), ints1.end())};\r\n   std::cout << \"ints1 number of elements: \" << result1 << \"\\n\";\r\n   auto result2{customDistance(ints2.begin(), ints2.end())};\r\n   std::cout << \"ints2 number of elements: \" << result2 << \"\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_09.cpp",
    "content": "// fig15_09.cpp\r\n// Testing custom concepts with static_assert.\r\n#include <iostream>\r\n#include <string>\r\n\r\ntemplate<typename T>\r\nconcept Numeric = std::integral<T> || std::floating_point<T>;\r\n\r\ntemplate<typename T>     \r\nauto multiply(T a, T b) {      \r\n   static_assert(Numeric<T>);      \r\n   return a * b;     \r\n} \r\n\r\nint main() {\r\n   using namespace std::string_literals;\r\n   multiply(2, 5); // OK: int is Numeric\r\n   multiply(2.5, 5.5); // OK: double is Numeric\r\n   multiply(\"2\"s, \"5\"s); // error: string is not Numeric\r\n} \r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_10.cpp",
    "content": "// fig15_10.cpp\r\n// A custom algorithm to calculate the average of \r\n// a numeric input range's elements.\r\n#include <algorithm>\r\n#include <array>\r\n#include <concepts>\r\n#include <iostream>\r\n#include <iterator>\r\n#include <list>\r\n#include <ranges>\r\n#include <vector>\r\n\r\n// concept for an input range containing integer or floating-point values\r\ntemplate<typename T>\r\nconcept NumericInputRange = std::ranges::input_range<T> &&\r\n   (std::integral<typename T::value_type> ||\r\n    std::floating_point<typename T::value_type>);\r\n\r\n// calculate the average of a NumericInputRange's elements\r\nauto average(NumericInputRange auto const& range) {\r\n   long double total{0};\r\n\r\n   for (auto i{range.begin()}; i != range.end(); ++i) {\r\n      total += *i; // dereference iterator and add value to total  \r\n   }\r\n\r\n   // divide total by the number of elements in range\r\n   return total / std::ranges::distance(range);\r\n}\r\n\r\nint main() {\r\n   std::ostream_iterator<int> outputInt(std::cout, \" \");\r\n   const std::array ints{1, 2, 3, 4, 5};\r\n   std::cout << \"array ints: \";\r\n   std::ranges::copy(ints, outputInt);\r\n   std::cout << \"\\naverage of ints: \" << average(ints);\r\n\r\n   std::ostream_iterator<double> outputDouble(std::cout, \" \");\r\n   const std::vector doubles{10.1, 20.2, 35.3};\r\n   std::cout << \"\\n\\nvector doubles: \";\r\n   std::ranges::copy(doubles, outputDouble);\r\n   std::cout << \"\\naverage of doubles: \" << average(doubles);\r\n\r\n   std::ostream_iterator<long double> outputLongDouble(std::cout, \" \");\r\n   const std::list longDoubles{10.1L, 20.2L, 35.3L};\r\n   std::cout << \"\\n\\nlist longDoubles: \";\r\n   std::ranges::copy(longDoubles, outputLongDouble);\r\n   std::cout << \"\\naverage of longDoubles: \" << average(longDoubles)\r\n      << \"\\n\";\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_11-12/MyArray.h",
    "content": "// Fig. 15.11: MyArray.h\r\n// Class template MyArray with custom iterators implemented \r\n// by class templates ConstIterator and Iterator\r\n#pragma once\r\n#include <algorithm>\r\n#include <compare>\r\n#include <initializer_list>\r\n#include <iostream>\r\n#include <iterator>\r\n#include <stdexcept>\r\n#include <utility>\r\n\r\n// class template ConstIterator for a MyArray const iterator \r\ntemplate <typename T>\r\nclass ConstIterator {\r\npublic:\r\n   // public iterator nested type names\r\n   using iterator_category = std::bidirectional_iterator_tag;\r\n   using difference_type = std::ptrdiff_t; \r\n   using value_type = T;\r\n   using pointer = const value_type*;\r\n   using reference = const value_type&;\r\n\r\n   // default constructor\r\n   ConstIterator() = default;\r\n\r\n   // initialize a ConstIterator with a pointer into a MyArray\r\n   ConstIterator(pointer p) : m_ptr{p} {}\r\n   \r\n   // OPERATIONS ALL ITERATORS MUST PROVIDE\r\n   // increment the iterator to the next element and \r\n   // return a reference to the iterator\r\n   ConstIterator& operator++() noexcept {\r\n      ++m_ptr;\r\n      return *this;\r\n   }\r\n\r\n   // increment the iterator to the next element and \r\n   // return the iterator before the increment\r\n   ConstIterator operator++(int) noexcept {\r\n      ConstIterator temp{*this};\r\n      ++(*this);\r\n      return temp; \r\n   }\r\n\r\n   // OPERATIONS INPUT ITERATORS MUST PROVIDE\r\n   // return a const reference to the element m_ptr points to\r\n   reference operator*() const noexcept {return *m_ptr;}\r\n\r\n   // return a const pointer to the element m_ptr points to\r\n   pointer operator->() const noexcept {return m_ptr;}\r\n\r\n   // <=> operator automatically supports equality/relational operators.\r\n   // Only == and != are needed for bidirectional iterators.\r\n   // This implementation would support the <, <=, > and >= required \r\n   // by random-access iterators.\r\n   auto operator<=>(const ConstIterator& other) const = default;\r\n\r\n   // OPERATIONS BIDIRECTIONAL ITERATORS MUST PROVIDE\r\n   // decrement the iterator to the previous element and \r\n   // return a reference to the iterator\r\n   ConstIterator& operator--() noexcept {\r\n      --m_ptr;\r\n      return *this;\r\n   }\r\n\r\n   // decrement the iterator to the previous element and \r\n   // return the iterator before the decrement\r\n   ConstIterator operator--(int) noexcept {\r\n      ConstIterator temp{*this};\r\n      --(*this);\r\n      return temp; \r\n   }\r\nprivate:\r\n   pointer m_ptr{nullptr};\r\n};\r\n\r\n// class template Iterator for a MyArray non-const iterator;\r\n// redefines several inherited operators to return non-const results\r\ntemplate <typename T>\r\nclass Iterator : public ConstIterator<T> {\r\npublic:\r\n   // public iterator nested type names\r\n   using iterator_category = std::bidirectional_iterator_tag;\r\n   using difference_type = std::ptrdiff_t; \r\n   using value_type = T;\r\n   using pointer = value_type*;\r\n   using reference = value_type&;\r\n\r\n   // inherit ConstIterator constructors\r\n   using ConstIterator<T>::ConstIterator;\r\n\r\n   // OPERATIONS ALL ITERATORS MUST PROVIDE\r\n   // increment the iterator to the next element and \r\n   // return a reference to the iterator\r\n   Iterator& operator++() noexcept {\r\n      ConstIterator<T>::operator++(); // call base-class version\r\n      return *this;\r\n   }\r\n\r\n   // increment the iterator to the next element and \r\n   // return the iterator before the increment\r\n   Iterator operator++(int) noexcept {\r\n      Iterator temp{*this};\r\n      ConstIterator<T>::operator++(); // call base-class version\r\n      return temp;\r\n   }\r\n\r\n   // OPERATIONS INPUT ITERATORS MUST PROVIDE\r\n   // return a reference to the element m_ptr points to; this\r\n   // operator returns a non-const reference for output iterator support\r\n   reference operator*() const noexcept {\r\n      return const_cast<reference>(ConstIterator<T>::operator*());\r\n   }\r\n\r\n   // return a pointer to the element m_ptr points to\r\n   pointer operator->() const noexcept {\r\n      return const_cast<pointer>(ConstIterator<T>::operator->());\r\n   }\r\n\r\n   // OPERATIONS BIDIRECTIONAL ITERATORS MUST PROVIDE\r\n   // decrement the iterator to the previous element and \r\n   // return a reference to the iterator\r\n   Iterator& operator--() noexcept {\r\n      ConstIterator<T>::operator--(); // call base-class version\r\n      return *this;\r\n   }\r\n\r\n   // decrement the iterator to the previous element and \r\n   // return the iterator before the decrement\r\n   Iterator operator--(int) noexcept {\r\n      Iterator temp{*this};\r\n      ConstIterator<T>::operator--(); // call base-class version\r\n      return temp;\r\n   }\r\n};\r\n\r\n// class template MyArray contains a fixed-size T[SIZE] array;\r\n// MyArray is an aggregate type with public data, like std::array\r\ntemplate <typename T, size_t SIZE>\r\nstruct MyArray {\r\n   // type names used in standard library containers\r\n   using value_type = T;\r\n   using size_type = size_t;\r\n   using difference_type = ptrdiff_t;\r\n   using pointer = value_type*;\r\n   using const_pointer = const value_type*;\r\n   using reference = value_type&;\r\n   using const_reference = const value_type&;\r\n\r\n   // iterator type names used in standard library containers\r\n   using iterator = Iterator<T>;\r\n   using const_iterator = ConstIterator<T>;\r\n   using reverse_iterator = std::reverse_iterator<iterator>;\r\n   using const_reverse_iterator = std::reverse_iterator<const_iterator>;\r\n\r\n   // Rule of Zero: MyArray's special member functions are autogenerated\r\n\r\n   constexpr size_type size() const noexcept {return SIZE;} // return size\r\n\r\n   // member functions that return iterators\r\n   iterator begin() {return iterator{&m_data[0]};}\r\n   iterator end() {return iterator{&m_data[0] + size()};}\r\n   const_iterator begin() const {return const_iterator{&m_data[0]};}\r\n   const_iterator end() const {\r\n      return const_iterator{&m_data[0] + size()};\r\n   }\r\n   const_iterator cbegin() const {return begin();}\r\n   const_iterator cend() const {return end();}\r\n\r\n   // member functions that return reverse iterators\r\n   reverse_iterator rbegin() {return reverse_iterator{end()};}\r\n   reverse_iterator rend() {return reverse_iterator{begin()};}\r\n   const_reverse_iterator rbegin() const {\r\n      return const_reverse_iterator{end()};\r\n   }\r\n   const_reverse_iterator rend() const {\r\n      return const_reverse_iterator{begin()};\r\n   }\r\n   const_reverse_iterator crbegin() const {return rbegin();}\r\n   const_reverse_iterator crend() const {return rend();}\r\n\r\n   // autogenerated three-way comparison operator\r\n   auto operator<=>(const MyArray& t) const noexcept = default;\r\n\r\n   // overloaded subscript operator for non-const MyArrays;\r\n   // reference return creates a modifiable lvalue\r\n   T& operator[](size_type index) {\r\n      // check for index out-of-range error\r\n      if (index >= size()) {\r\n         throw std::out_of_range{\"Index out of range\"};\r\n      }\r\n\r\n      return m_data[index]; // reference return\r\n   }\r\n\r\n   // overloaded subscript operator for const MyArrays;\r\n   // const reference return creates a non-modifiable lvalue\r\n   const T& operator[](size_type index) const {\r\n      // check for subscript out-of-range error\r\n      if (index >= size()) {\r\n         throw std::out_of_range{\"Index out of range\"};\r\n      }\r\n\r\n      return m_data[index]; // returns copy of this element\r\n   }\r\n\t\r\n   // like std::array the data is public to make this an aggregate type\r\n   T m_data[SIZE]; // built-in array of type T with SIZE elements\r\n};\r\n\r\n// deduction guide to enable MyArrays to be brace initialized\r\ntemplate<typename T, std::same_as<T>... Us>\r\nMyArray(T first, Us... rest) -> MyArray<T, 1 + sizeof...(Us)>;\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_11-12/fig15_12.cpp",
    "content": "// fig15_12.cpp\r\n// Using MyArray with range-based for and with \r\n// C++ standard library algorithms.\r\n#include <algorithm>\r\n#include <iostream>\r\n#include <iterator>\r\n#include \"MyArray.h\"\r\n\r\nint main() {\r\n   std::ostream_iterator<int> outputInt{std::cout, \" \"};\r\n   std::ostream_iterator<double> outputDouble{std::cout, \" \"};\r\n   std::ostream_iterator<std::string> outputString{std::cout, \" \"};\r\n\r\n   std::cout << \"Displaying MyArrays with std::ranges::copy, \"\r\n      << \"which requires input iterators:\\n\";\r\n   MyArray ints{1, 2, 3, 4, 5, 6, 7, 8};\r\n   std::cout << \"ints: \";\r\n   std::ranges::copy(ints, outputInt);\r\n\r\n   MyArray doubles{1.1, 2.2, 3.3, 4.4, 5.5};\r\n   std::cout << \"\\ndoubles: \";\r\n   std::ranges::copy(doubles, outputDouble);\r\n\r\n   using namespace std::string_literals; // for string object literals \r\n   MyArray strings{\"red\"s, \"orange\"s, \"yellow\"s};\r\n   std::cout << \"\\nstrings: \";\r\n   std::ranges::copy(strings, outputString);\r\n\r\n   std::cout << \"\\n\\nDisplaying a MyArray with a range-based for \"\r\n      << \"statement, which requires input iterators:\\n\";\r\n   for (const auto& item : doubles) {\r\n      std::cout << item << \" \";\r\n   }\r\n\r\n   std::cout << \"\\n\\nCopying a MyArray with std::ranges::copy, \"\r\n      << \"which requires an input range and output iterator:\\n\";\r\n   MyArray<std::string, strings.size()> strings2{};\r\n   std::ranges::copy(strings, strings2.begin());\r\n   std::cout << \"strings2 after copying from strings: \";\r\n   std::ranges::copy(strings2, outputString);\r\n\r\n   std::cout << \"\\n\\nFinding min and max elements in a MyArray \"\r\n      << \"with std::ranges::minmax_element, which requires \"\r\n      << \"a forward range:\\n\";\r\n   auto [min, max] {std::ranges::minmax_element(strings)};\r\n   std::cout << \"min and max elements of strings are: \"\r\n      << *min << \", \" << *max;\r\n\r\n   std::cout << \"\\n\\nReversing a MyArray with std::ranges::reverse, \"\r\n      << \"which requires a bidirectional range:\\n\";\r\n   std::ranges::reverse(ints);\r\n   std::cout << \"ints after reversing elements: \";\r\n   std::ranges::copy(ints, outputInt);\r\n   std::cout << \"\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_11-12/sorttest.cpp",
    "content": "// sorttest.cpp\r\n// Using MyArray with range-based for and with \r\n// C++ standard library algorithms.\r\n#include <algorithm>\r\n#include \"MyArray.h\"\r\n\r\nint main() {\r\n   MyArray integers{10, 2, 33, 4, 7, 1, 80};\r\n   std::ranges::sort(integers);\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_13.cpp",
    "content": "// fig15_13.cpp\r\n// Manipulating tuples.\r\n#include <fmt/format.h> \r\n#include <iostream>\r\n#include <string>\r\n#include <tuple>\r\n\r\n// type alias for a tuple representing a hardware part's inventory\r\nusing Part = std::tuple<int, std::string, int, double>;\r\n\r\n// return a part's inventory tuple \r\nPart getInventory(int partNumber) {\r\n   using namespace std::string_literals; // for string object literals \r\n\r\n   switch (partNumber) {\r\n   case 1:\r\n      return {1, \"Hammer\"s, 32, 9.95}; // return a Part tuple\r\n   case 2:\r\n      return {2, \"Screwdriver\"s, 106, 6.99}; // return a Part tuple\r\n   default:\r\n      return {0, \"INVALID PART\"s, 0, 0.0}; // return a Part tuple\r\n   }\r\n}\r\n\r\nint main() {\r\n   // display the hardware part inventory\r\n   for (int i{1}; i <= 2; ++i) {\r\n      // unpack the returned tuple into four variables;\r\n      // variables' types are inferred from the tuple's element values\r\n      auto [partNumber, partName, quantity, price] {getInventory(i)};\r\n\r\n      std::cout << fmt::format(\"{}: {}, {}: {}, {}: {}, {}: {:.2f}\\n\",\r\n         \"Part number\", partNumber, \"Tool\", partName,\r\n         \"Quantity\", quantity, \"Price\", price);\r\n   }\r\n\r\n   std::cout << \"\\nAccessing a tuple's elements by index number:\\n\";\r\n   auto hammer{getInventory(1)};\r\n   std::cout << fmt::format(\"{}: {}, {}: {}, {}: {}, {}: {:.2f}\\n\",\r\n      \"Part number\", std::get<0>(hammer), \"Tool\", std::get<1>(hammer),\r\n      \"Quantity\", std::get<2>(hammer), \"Price\", std::get<3>(hammer));\r\n\r\n   std::cout << fmt::format(\"A Part tuple has {} elements\\n\",\r\n      std::tuple_size<Part>{}); // get the tuple size\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_14.cpp",
    "content": "// fig15_14.cpp\r\n// Variadic function templates.\r\n#include <fmt/format.h> \r\n#include <iostream>\r\n#include <string>\r\n\r\n// base-case function for one argument \r\ntemplate <typename T>\r\nauto sum(T item) {\r\n   return item;\r\n}\r\n\r\n// recursively add one or more arguments\r\ntemplate <typename FirstItem, typename... RemainingItems>\r\nauto sum(FirstItem first, RemainingItems... theRest) {\r\n   return first + sum(theRest...); // expand parameter pack for next call\r\n}\r\n\r\n// add one or more arguments with a fold expression\r\ntemplate <typename FirstItem, typename... RemainingItems>\r\nauto foldingSum(FirstItem first, RemainingItems... theRest) {\r\n   return (first + ... + theRest); // expand the parameter \r\n}\r\n\r\nint main() {\r\n   using namespace std::literals;\r\n\r\n   std::cout << \"Recursive variadic function template sum:\"\r\n      << fmt::format(\"\\n{}{}\\n{}{}\\n{}{}\\n{}{}\\n\\n\",\r\n         \"sum(1): \", sum(1), \"sum(1, 2): \", sum(1, 2),\r\n         \"sum(1, 2, 3): \", sum(1, 2, 3),\r\n         \"sum(\\\"s\\\"s, \\\"u\\\"s, \\\"m\\\"s): \", sum(\"s\"s, \"u\"s, \"m\"s));\r\n\r\n   std::cout << \"Variadic function template foldingSum:\"\r\n      << fmt::format(\"\\n{}{}\\n{}{}\\n{}{}\\n{}{}\\n\",\r\n         \"sum(1): \", foldingSum(1), \"sum(1, 2): \", foldingSum(1, 2),\r\n         \"sum(1, 2, 3): \", foldingSum(1, 2, 3),\r\n         \"sum(\\\"s\\\"s, \\\"u\\\"s, \\\"m\\\"s): \",\r\n         foldingSum(\"s\"s, \"u\"s, \"m\"s));\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_15.cpp",
    "content": "// fig15_15.cpp\r\n// Unary fold expressions.\r\n#include <fmt/format.h> \r\n#include <iostream>\r\n\r\ntemplate <typename... Items>\r\nauto unaryLeftAdd(Items... items) {\r\n   return (... + items); // unary left fold\r\n}\r\n\r\ntemplate <typename... Items>\r\nauto unaryRightAdd(Items... items) {\r\n   return (items + ...); // unary right fold\r\n}\r\n\r\ntemplate <typename... Items>\r\nauto unaryLeftSubtract(Items... items) {\r\n   return (... - items); // unary left fold\r\n}\r\n\r\ntemplate <typename... Items>\r\nauto unaryRightSubtract(Items... items) {\r\n   return (items - ...); // unary right fold\r\n}\r\n\r\nint main() {\r\n   std::cout << \"Unary left and right fold with addition:\"\r\n      << fmt::format(\"\\n{}{}\\n{}{}\\n\\n\",\r\n         \"unaryLeftAdd(1, 2, 3, 4): \", unaryLeftAdd(1, 2, 3, 4),\r\n         \"unaryRightAdd(1, 2, 3, 4): \", unaryRightAdd(1, 2, 3, 4));\r\n\r\n   std::cout << \"Unary left and right fold with subtraction:\"\r\n      << fmt::format(\"\\n{}{}\\n{}{}\\n\",\r\n         \"unaryLeftSubtract(1, 2, 3, 4): \",\r\n         unaryLeftSubtract(1, 2, 3, 4),\r\n         \"unaryRightSubtract(1, 2, 3, 4): \",\r\n         unaryRightSubtract(1, 2, 3, 4));\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_16.cpp",
    "content": "// fig15_16.cpp\r\n// Binary fold expressions.\r\n#include <fmt/format.h> \r\n#include <iostream>\r\n\r\ntemplate <typename... Items>\r\nauto binaryLeftAdd(Items... items) {\r\n   return (0 + ... + items); // binary left fold\r\n}\r\n\r\ntemplate <typename... Items>\r\nauto binaryRightAdd(Items... items) {\r\n   return (items + ... + 0); // binary right fold\r\n}\r\n\r\ntemplate <typename... Items>\r\nauto binaryLeftSubtract(Items... items) {\r\n   return (0 - ... - items); // binary left fold\r\n}\r\n\r\ntemplate <typename... Items>\r\nauto binaryRightSubtract(Items... items) {\r\n   return (items - ... - 0); // binary right fold\r\n}\r\n\r\nint main() {\r\n   std::cout << \"Binary left and right fold with addition:\"\r\n      << fmt::format(\"\\n{}{}\\n{}{}\\n{}{}\\n{}{}\\n\\n\",\r\n         \"binaryLeftAdd(): \", binaryLeftAdd(),\r\n         \"binaryLeftAdd(1, 2, 3, 4): \", binaryLeftAdd(1, 2, 3, 4),\r\n         \"binaryRightAdd(): \", binaryRightAdd(),\r\n         \"binaryRightAdd(1, 2, 3, 4): \", binaryRightAdd(1, 2, 3, 4));\r\n\r\n   std::cout << \"Binary left and right fold with subtraction:\"\r\n      << fmt::format(\"\\n{}{}\\n{}{}\\n{}{}\\n{}{}\\n\",\r\n         \"binaryLeftSubtract(): \", binaryLeftSubtract(),\r\n         \"binaryLeftSubtract(1, 2, 3, 4): \",\r\n         binaryLeftSubtract(1, 2, 3, 4),\r\n         \"binaryRightSubtract(): \", binaryRightSubtract(),\r\n         \"binaryRightSubtract(1, 2, 3, 4): \",\r\n         binaryRightSubtract(1, 2, 3, 4));\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_17.cpp",
    "content": "// fig15_17.cpp\r\n// Repeating a task using the comma operator and fold expressions.\r\n#include <iostream>\r\n\r\ntemplate <typename... Items>\r\nvoid printItems(Items... items) {\r\n   ((std::cout << items << \"\\n\"), ...); // unary right fold\r\n}\r\n\r\nint main() {\r\n   std::cout << \"printItems(1, 2.2, \\\"hello\\\"):\\n\";\r\n   printItems(1, 2.2, \"hello\");\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_18.cpp",
    "content": "// fig15_18.cpp\r\n// Constraining a variadic-function-template parameter pack to\r\n// elements of the same type.\r\n#include <concepts> \r\n#include <iostream>\r\n#include <string>\r\n\r\ntemplate <typename T, typename... Us>\r\nconcept SameTypeElements = (std::same_as<T, Us> && ...);\r\n\r\n// add one or more arguments with a fold expression\r\ntemplate <typename FirstItem, typename... RemainingItems>\r\n   requires SameTypeElements<FirstItem, RemainingItems...>\r\nauto foldingSum(FirstItem first, RemainingItems... theRest) {\r\n   return (first + ... + theRest); // expand the parameter \r\n}\r\n\r\nint main() {\r\n   using namespace std::literals;\r\n\r\n   foldingSum(1, 2, 3); // valid: all are int values\r\n   foldingSum(\"s\"s, \"u\"s, \"m\"s); // valid: all are std::string objects\r\n   foldingSum(1, 2.2, \"hello\"s); // error: three different types\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/"
  },
  {
    "path": "examples/lesson15/fig15_19.cpp",
    "content": "// fig15_19.cpp\r\n// Calculating factorials at compile time.\r\n#include <iostream>\r\n\r\n// Factorial value metafunction calculates factorials recursively\r\ntemplate <int N>\r\nstruct Factorial {\r\n   static constexpr long long value{N * Factorial<N - 1>::value};\r\n};\r\n\r\n// Factorial specialization for the base case\r\ntemplate <>\r\nstruct Factorial<0> {\r\n   static constexpr long long value{1}; // 0! is 1\r\n};\r\n\r\n// constexpr compile-time recursive factorial\r\nconstexpr long long recursiveFactorial(int number) {\r\n   if (number <= 1) {\r\n      return 1; // base cases: 0! = 1 and 1! = 1 \r\n   }\r\n   else { // recursion step                      \r\n      return number * recursiveFactorial(number - 1);\r\n   }\r\n}\r\n\r\n// constexpr compile-time iterative factorial\r\nconstexpr long long iterativeFactorial(int number) {\r\n   long long factorial{1}; // result for 0! and 1!\r\n\r\n   for (long long i{2}; i <= number; ++i) {\r\n      factorial *= i;\r\n   }\r\n\r\n   return factorial;\r\n}\r\n\r\nint main() {\r\n   // \"calling\" a value metafunction requires instantiating \r\n   // the template and accessing its static value member\r\n   std::cout << \"CALCULATING FACTORIALS AT COMPILE TIME \"\r\n      << \"WITH A RECURSIVE METAFUNCTION\"\r\n      << \"\\nFactorial(0): \" << Factorial<0>::value\r\n      << \"\\nFactorial(1): \" << Factorial<1>::value\r\n      << \"\\nFactorial(2): \" << Factorial<2>::value\r\n      << \"\\nFactorial(3): \" << Factorial<3>::value\r\n      << \"\\nFactorial(4): \" << Factorial<4>::value\r\n      << \"\\nFactorial(5): \" << Factorial<5>::value;\r\n\r\n   // calling the recursive constexpr function recursiveFactorial\r\n   std::cout << \"\\n\\nCALCULATING FACTORIALS AT COMPILE TIME \"\r\n      << \"WITH A RECURSIVE CONSTEXPR FUNCTION\"\r\n      << \"\\nrecursiveFactorial(0): \" << recursiveFactorial(0)\r\n      << \"\\nrecursiveFactorial(1): \" << recursiveFactorial(1)\r\n      << \"\\nrecursiveFactorial(2): \" << recursiveFactorial(2)\r\n      << \"\\nrecursiveFactorial(3): \" << recursiveFactorial(3)\r\n      << \"\\nrecursiveFactorial(4): \" << recursiveFactorial(4)\r\n      << \"\\nrecursiveFactorial(5): \" << recursiveFactorial(5);\r\n\r\n   // calling the iterative constexpr function iterativeFactorial\r\n   std::cout << \"\\n\\nCALCULATING FACTORIALS AT COMPILE TIME \"\r\n      << \"WITH AN ITERATIVE CONSTEXPR FUNCTION\"\r\n      << \"\\niterativeFactorial(0): \" << iterativeFactorial(0)\r\n      << \"\\niterativeFactorial(1): \" << iterativeFactorial(1)\r\n      << \"\\niterativeFactorial(2): \" << iterativeFactorial(2)\r\n      << \"\\niterativeFactorial(3): \" << iterativeFactorial(3)\r\n      << \"\\niterativeFactorial(4): \" << iterativeFactorial(4)\r\n      << \"\\niterativeFactorial(5): \" << iterativeFactorial(5) << \"\\n\";\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_20.cpp",
    "content": "// fig15_20.cpp\r\n// Implementing customDistance using template metaprogramming.\r\n#include <array>\r\n#include <iostream>\r\n#include <iterator>\r\n#include <list>\r\n#include <ranges>\r\n#include <type_traits>\r\n\r\n// calculate the distance (number of items) between two iterators;\r\n// requires at least input iterators\r\ntemplate <std::input_iterator Iterator>\r\nauto customDistance(Iterator begin, Iterator end) {\r\n   // for random-access iterators subtract the iterators\r\n   if constexpr (std::is_base_of_v<std::random_access_iterator_tag,\r\n      typename Iterator::iterator_category>) {\r\n\r\n      std::cout << \"customDistance with random-access iterators\\n\";\r\n      return end - begin; // O(1) operation for random-access iterators\r\n   }\r\n   else { // for all other iterators\r\n      std::cout << \"customDistance with non-random-access iterators\\n\";\r\n      std::ptrdiff_t count{0};\r\n\r\n      // increment from begin to end and count number of iterations;\r\n      // O(n) operation for non-random-access iterators\r\n      for (auto iter{begin}; iter != end; ++iter) {\r\n         ++count;\r\n      }\r\n\r\n      return count;\r\n   }\r\n}\r\n\r\nint main() {\r\n   const std::array ints1{1, 2, 3, 4, 5}; // has random-access iterators\r\n   const std::list ints2{1, 2, 3}; // has bidirectional iterators\r\n\r\n   auto result1{customDistance(ints1.begin(), ints1.end())};\r\n   std::cout << \"ints1 number of elements: \" << result1 << \"\\n\";\r\n   auto result2{customDistance(ints2.begin(), ints2.end())};\r\n   std::cout << \"ints2 number of elements: \" << result2 << \"\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson15/fig15_21.cpp",
    "content": "// fig15_21.cpp\r\n// Adding and removing type attributes with type metafunctions.\r\n#include <fmt/format.h>\r\n#include <iostream>\r\n#include <type_traits>\r\n\r\n// add const to a type T\r\ntemplate <typename T>\r\nstruct my_add_const {\r\n   using type = const T;\r\n};\r\n\r\n// general case: no pointer in type, so set nested type variable to T\r\ntemplate <typename T>\r\nstruct my_remove_ptr {\r\n   using type = T;\r\n};\r\n\r\n// partial template specialization: T is a pointer type, so remove *\r\ntemplate <typename T>\r\nstruct my_remove_ptr<T*> {\r\n   using type = T;\r\n};\r\n\r\nint main() {\r\n   std::cout << fmt::format(\"{}\\n{}{}\\n{}{}\\n\\n\",\r\n      \"ADD CONST TO A TYPE VIA A CUSTOM TYPE METAFUNCTION\",\r\n      \"std::is_same_v<const int, my_add_const<int>::type>: \",\r\n      std::is_same_v<const int, my_add_const<int>::type>,\r\n      \"std::is_same_v<int* const, my_add_const<int*>::type>: \",\r\n      std::is_same_v<int* const, my_add_const<int*>::type>);\r\n\r\n   std::cout << fmt::format(\"{}\\n{}{}\\n{}{}\\n\\n\",\r\n      \"REMOVE POINTER FROM TYPES VIA A CUSTOM TYPE METAFUNCTION\",\r\n      \"std::is_same_v<int, my_remove_ptr<int>::type>: \",\r\n      std::is_same_v<int, my_remove_ptr<int>::type>,\r\n      \"std::is_same_v<int, my_remove_ptr<int*>::type>: \",\r\n      std::is_same_v<int, my_remove_ptr<int*>::type>);\r\n\r\n   std::cout << fmt::format(\"{}\\n{}{}\\n{}{}\\n\\n\",\r\n      \"ADD REFERENCES TO TYPES USING STANDARD TYPE TRAITS\",\r\n      \"std::is_same_v<int&, std::add_lvalue_reference<int>::type>: \",\r\n      std::is_same_v<int&, std::add_lvalue_reference<int>::type>,\r\n      \"std::is_same_v<int&&, std::add_rvalue_reference<int>::type>: \",\r\n      std::is_same_v<int&&, std::add_rvalue_reference<int>::type>);\r\n\r\n   std::cout << fmt::format(\"{}\\n{}{}\\n{}{}\\n{}{}\\n\",\r\n      \"REMOVE REFERENCES FROM TYPES USING STANDARD TYPE TRAITS\",\r\n      \"std::is_same_v<int, std::remove_reference<int>::type>: \",\r\n      std::is_same_v<int, std::remove_reference<int>::type>,\r\n      \"std::is_same_v<int, std::remove_reference<int&>::type>: \",\r\n      std::is_same_v<int, std::remove_reference<int&>::type>,\r\n      \"std::is_same_v<int, std::remove_reference<int&&>::type>: \",\r\n      std::is_same_v<int, std::remove_reference<int&&>::type>);\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/compilation_commands.txt",
    "content": "************\n* fig16_01 *\n************\ng++:\n------------\ng++ -fmodules-ts -x c++-system-header iostream \n\ng++ -fmodules-ts fig16_01.cpp -o fig16_01\n\n\n------------------------------------------------------------------------------\nclang++ (-16 may need to be removed or changed based on your clang++ version):\n------------\nclang++-16 -std=c++20 -xc++-system-header --precompile iostream -o iostream.pcm \n\nclang++-16 -std=c++20 -fmodule-file=iostream.pcm fig16_01.cpp -o fig16_01\n\n\n\n***************\n* fig16_02-03 *\n***************\ng++:\n------------\ng++ -fmodules-ts -x c++-system-header string  \n\ng++ -fmodules-ts -x c++-system-header iostream \n\ng++ -fmodules-ts -c -x c++ welcome.ixx \n\ng++ -fmodules-ts fig16_03.cpp welcome.o -o fig16_03\n\n------------------------------------------------------------------------------\nclang++ (-16 may need to be removed or changed based on your clang++ version):\n------------\nclang++-16 -std=c++20 -xc++-system-header --precompile string -o string.pcm \n\nclang++-16 -std=c++20 -xc++-system-header --precompile iostream -o iostream.pcm \n\nclang++-16 -std=c++20 -fmodule-file=string.pcm -x c++-module welcome.ixx --precompile -o welcome.pcm \n\nclang++-16 -std=c++20 -fmodule-file=iostream.pcm fig16_03.cpp -fprebuilt-module-path=. string.pcm welcome.pcm -o fig16_03\n\n\n***************\n* fig16_04-05 *\n***************\ng++:\n------------\ng++ -fmodules-ts -x c++-system-header iostream \n\ng++ -fmodules-ts -c -x c++ deitel.math.ixx \n\ng++ -fmodules-ts fig16_05.cpp deitel.math.o \n\n\n------------------------------------------------------------------------------\nclang++ (-16 may need to be removed or changed based on your clang++ version):\n------------\nclang++-16 -std=c++20 -xc++-system-header --precompile iostream -o iostream.pcm \n\nclang++-16 -std=c++20 -x c++-module deitel.math.ixx --precompile -o deitel.math.pcm \n\nclang++-16 -std=c++20 -fmodule-file=deitel.math.pcm -fmodule-file=iostream.pcm fig16_05.cpp -o fig16_05 \n\n\n***************\n* fig16_06-08 *\n***************\ng++:\n------------\ng++ -fmodules-ts -x c++-system-header algorithm \ng++ -fmodules-ts -x c++-system-header iostream \ng++ -fmodules-ts -x c++-system-header iterator \ng++ -fmodules-ts -x c++-system-header numeric \ng++ -fmodules-ts -x c++-system-header vector \n\ng++ -fmodules-ts -c -x c++ deitel.math.ixx \ng++ -fmodules-ts -c deitel.math-impl.cpp \ng++ -fmodules-ts fig16_08.cpp deitel.math.o deitel.math-impl.o -o fig16_08\n\n------------------------------------------------------------------------------\nclang++ (-16 may need to be removed or changed based on your clang++ version):\n------------\nclang++-16 -std=c++20 -xc++-system-header --precompile algorithm -o algorithm.pcm \n\nclang++-16 -std=c++20 -xc++-system-header --precompile iostream -o iostream.pcm \n\nclang++-16 -std=c++20 -xc++-system-header --precompile iterator -o iterator.pcm \n\nclang++-16 -std=c++20 -xc++-system-header --precompile numeric -o numeric.pcm \n\nclang++-16 -std=c++20 -xc++-system-header --precompile vector -o vector.pcm \n\nclang++-16 -std=c++20 -fmodule-file=vector.pcm -x c++-module deitel.math.ixx --precompile -o deitel.math.pcm \n\nclang++-16 -std=c++20 -fmodule-file=deitel.math.pcm -fmodule-file=vector.pcm -fmodule-file=numeric.pcm -c deitel.math-impl.cpp -o deitel.math-impl.o\n\nclang++-16 -std=c++20 -fmodule-file=algorithm.pcm -fmodule-file=iostream.pcm -fmodule-file=iterator.pcm -fmodule-file=vector.pcm fig16_08.cpp deitel.math-impl.o -fprebuilt-module-path=. deitel.math.pcm -o fig16_08\n\n\n***************\n* fig16_09-11 *\n***************\ng++:\n------------\nNot working at the time of this writing. Investigating the issue.\n\ng++ -fmodules-ts -x c++-system-header iostream \n\ng++ -fmodules-ts -x c++-system-header string \n\ng++ -fmodules-ts -x c++-system-header stdexcept \n\ng++ -fmodules-ts -c -x c++ deitel.time.ixx \n\ng++ -fmodules-ts -c deitel.time-impl.cpp\n\ng++ -fmodules-ts fig16_11.cpp deitel.time.o deitel.time-impl.o -o fig16_11\n\n\n------------------------------------------------------------------------------\nclang++ (-16 may need to be removed or changed based on your clang++ version):\n------------\nclang++-16 -std=c++20 -xc++-system-header --precompile iostream -o iostream.pcm \n\nclang++-16 -std=c++20 -xc++-system-header --precompile string -o string.pcm \n\nclang++-16 -std=c++20 -xc++-system-header --precompile stdexcept -o stdexcept.pcm \n\nclang++-16 -std=c++20 -fmodule-file=string.pcm -x c++-module deitel.time.ixx --precompile -o deitel.time.pcm \n\nclang++-16 -std=c++20 -fmodule-file=deitel.time.pcm -fmodule-file=string.pcm -fmodule-file=stdexcept.pcm -c deitel.time-impl.cpp -o deitel.time-impl.o\n\nclang++-16 -std=c++20 fig16_11.cpp deitel.time-impl.o -fmodule-file=iostream.pcm -fmodule-file=string.pcm -fmodule-file=stdexcept.pcm -fprebuilt-module-path=. deitel.time.pcm -o fig16_11\n\n\n***************\n* fig16_12-15 *\n***************\ng++:\ncd ..\ng++ -fmodules-ts -x c++-system-header cmath \n\ng++ -fmodules-ts -x c++-system-header iostream \n\ng++ -fmodules-ts -c -x c++ deitel.math-powers.ixx \n\ng++ -fmodules-ts -c -x c++ deitel.math-roots.ixx \n\ng++ -fmodules-ts -c -x c++ deitel.math.ixx \n\ng++ -fmodules-ts fig16_15.cpp deitel.math-powers.o deitel.math-roots.o deitel.math.o -o fig16_15\n\n------------------------------------------------------------------------------\nclang++ (-16 may need to be removed or changed based on your clang++ version):\n------------\nIMPORTANT: Use the version of this example in the folder fig16_12-15clang. At the time of this writing, clang++ would not compile the <cmath> header into a header unit. So we replaced the import statement with\n\n\t#include <cmath>\n\t\nclang++-16 -std=c++20 -xc++-system-header --precompile iostream -o iostream.pcm \n\nclang++-16 -std=c++20 -x c++-module deitel.math-powers.ixx --precompile -o deitel.math-powers.pcm \n\nclang++-16 -std=c++20 -x c++-module deitel.math-roots.ixx --precompile -o deitel.math-roots.pcm \n\nclang++-16 -std=c++20 -x c++-module deitel.math.ixx -fprebuilt-module-path=. --precompile -o deitel.math.pcm\n\nclang++-16 -std=c++20 -fmodule-file=iostream.pcm fig16_15.cpp -fprebuilt-module-path=. deitel.math\t.pcm deitel.math-powers.pcm deitel.math-roots.pcm -o fig16_15\n\n\n***************\n* fig16_16-21 *\n***************\ng++:\n------------\ng++ -fmodules-ts -x c++-system-header iostream \n\ng++ -fmodules-ts -c -x c++ deitel.math.powers.ixx \n\ng++ -fmodules-ts fig16_17.cpp deitel.math.powers.o -o fig16_17\n\n\ng++ -fmodules-ts -x c++-system-header cmath\n \ng++ -fmodules-ts -c -x c++ deitel.math.roots.ixx \n\ng++ -fmodules-ts fig16_19.cpp deitel.math.roots.o -o fig16_19\n\n\ng++ -fmodules-ts -c -x c++ deitel.math.ixx \n\ng++ -fmodules-ts fig16_21.cpp deitel.math.powers.o deitel.math.roots.o deitel.math.o -o fig16_21\n\n------------------------------------------------------------------------------\nclang++ (-16 may need to be removed or changed based on your clang++ version):\n------------\nIMPORTANT: Use the version of this example in the folder fig16_16-21clang. At the time of this writing, clang++ would not compile the <cmath> header into a header unit. So we replaced the import statement with\n\n\t#include <cmath>\n\nclang++-16 -std=c++20 -xc++-system-header --precompile iostream -o iostream.pcm \n\nclang++-16 -std=c++20 -x c++-module deitel.math.powers.ixx --precompile -o deitel.math.powers.pcm \n\nclang++-16 -std=c++20 -fmodule-file=iostream.pcm fig16_17.cpp -fprebuilt-module-path=. deitel.math.powers.pcm -o fig16_17\n\n\nclang++-16 -std=c++20 -x c++-module deitel.math.roots.ixx --precompile -o deitel.math.roots.pcm \n\nclang++-16 -std=c++20 -fmodule-file=iostream.pcm fig16_19.cpp -fprebuilt-module-path=. deitel.math.roots.pcm -o fig16_19\n\n\nclang++-16 -std=c++20 -x c++-module deitel.math.ixx -fprebuilt-module-path=. --precompile -o deitel.math.pcm\n\nclang++-16 -std=c++20 -fmodule-file=iostream.pcm fig16_21.cpp -fprebuilt-module-path=. deitel.math.pcm deitel.math.powers.pcm deitel.math.roots.pcm -o fig16_21\n\t\n\t\n************\n* fig16_22 *\n************\ng++:\n------------\nNo instructions--this example is currently only for Visual C++.\n\n------------------------------------------------------------------------------\nclang++ (-16 may need to be removed or changed based on your clang++ version):\n------------\nNo instructions--this example is currently only for Visual C++.\n\n\n\n***************\n* fig16_23-24 *\n***************\nNo instructions--Visual C++ only.\n\n\n\n***************\n* fig16_25-27 *\n***************\nNo instructions--see the error messages shown in the video\n\n\n\n***************\n* fig16_28-29 *\n***************\ng++:\n------------\nSee the instructions for fig16_09-11.\n\n\n------------------------------------------------------------------------------\nclang++ (-16 may need to be removed or changed based on your clang++ version):\n------------\nSee the instructions for fig16_09-11.\n"
  },
  {
    "path": "examples/lesson16/fig16_01/fig16_01.cpp",
    "content": "// fig16_01.cpp\r\n// Importing a standard library header as a header unit.\r\nimport <iostream>; // instead of #include <iostream>\r\n\r\nint main() {\r\n   std::cout << \"Welcome to C++20 Modules!\\n\"; \r\n}\r\n\r\n\r\n\r\n\r\n\r\n /*************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_02-03/fig16_03.cpp",
    "content": "// fig16_03.cpp\r\n// Importing a module and using its exported items.\r\nimport <iostream>; \r\nimport welcome; // import the welcome module\r\n\r\nint main() {\r\n   std::cout << welcomeStandalone() << '\\n' \r\n      << welcomeFromExportBlock() << '\\n'\r\n      << TestNamespace1::welcomeFromTestNamespace1() << '\\n'\r\n      << TestNamespace2::welcomeFromTestNamespace2() << '\\n';\r\n}\r\n\r\n\r\n\r\n\r\n\r\n /*************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_02-03/welcome.ixx",
    "content": "// Fig. 16.2: welcome.ixx\r\n// Primary module interface for a module named welcome.\r\nexport module welcome; // introduces the module name\r\n\r\nimport <string>; // class string is used in this module\r\n\r\n// exporting a function\r\nexport std::string welcomeStandalone() {\r\n   return \"welcomeStandalone function called\";\r\n}\r\n\r\n// exporting all items in the braces that follow export\r\nexport {\r\n   std::string welcomeFromExportBlock() {\r\n      return \"welcomeFromExportBlock function called\";\r\n   }\r\n}\r\n\r\n// exporting a namespace exports all items in the namespace\r\nexport namespace TestNamespace1 {\r\n   std::string welcomeFromTestNamespace1() {\r\n      return \"welcomeFromTestNamespace1 function called\";\r\n   }\r\n}\r\n\r\n// exporting an item in a namespace exports the namespace name, too\r\nnamespace TestNamespace2 {\r\n   export std::string welcomeFromTestNamespace2() {\r\n      return \"welcomeFromTestNamespace2 function called\";\r\n   }\r\n}\r\n\r\n\r\n\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n**************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_04-05/deitel.math.ixx",
    "content": "// Fig. 16.4: deitel.math.ixx\r\n// Primary module interface for a module named deitel.math.\r\nexport module deitel.math; // introduces the module name\r\n\r\nnamespace deitel::math {\r\n   // exported function square; namespace deitel::math implicitly exported\r\n   export int square(int x) {\r\n      return x * x;\r\n   }\r\n\r\n   // non-exported function cube is not implicitly exported\r\n   int cube(int x) {\r\n      return x * x * x;\r\n   }\r\n};\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n**************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_04-05/fig16_05.cpp",
    "content": "// fig16_05.cpp\r\n// Showing that a module's non-exported identifiers are inaccessible.\r\nimport <iostream>; \r\nimport deitel.math; // import the deitel.math module\r\n\r\nint main() {\r\n   // can call square because it's exported from namespace deitel::math, \r\n   // which implicitly exports the namespace\r\n   std::cout << \"square(3) = \" << deitel::math::square(3) << '\\n';\r\n\r\n   // cannot call cube because it's not exported \r\n   std::cout << \"cube(3) = \" << deitel::math::cube(3) << '\\n';\r\n}\r\n\r\n\r\n\r\n\r\n\r\n /*************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_06-08/deitel.math-impl.cpp",
    "content": "// Fig. 16.7: deitel.math-impl.cpp\r\n// Module implementation unit for the module deitel.math.\r\nmodule deitel.math; // this file's contents belong to module deitel.math\r\n\r\nimport <numeric>;\r\nimport <vector>;\r\n\r\nnamespace deitel::math {\r\n   // average function's implementation\r\n   double average(const std::vector<int>& values) {\r\n      double total{std::accumulate(values.begin(), values.end(), 0.0)};\r\n      return total / values.size();\r\n   }\r\n};\r\n\r\n\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n**************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_06-08/deitel.math.ixx",
    "content": "// Fig. 16.6: deitel.math.ixx\r\n// Primary module interface for a module named deitel.math.\r\nexport module deitel.math; // introduces the module name\r\n\r\nimport <vector>;\r\n\r\nexport namespace deitel::math {\r\n   // calculate the average of a vector<int>'s elements\r\n   double average(const std::vector<int>& values);\r\n};\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n**************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_06-08/fig16_08.cpp",
    "content": "// fig16_08.cpp\r\n// Using the deitel.math modules average function.\r\nimport <algorithm>;\r\nimport <iostream>;\r\nimport <iterator>;\r\nimport <vector>;\r\nimport deitel.math; // import the deitel.math module\r\n\r\nint main() {\r\n   std::ostream_iterator<int> output(std::cout, \" \");\r\n   std::vector integers{1, 2, 3, 4};\r\n\r\n   std::cout << \"vector integers: \";\r\n   std::copy(integers.begin(), integers.end(), output);\r\n\r\n   std::cout << \"\\naverage of integer's elements: \"\r\n      << deitel::math::average(integers) << '\\n';\r\n}\r\n\r\n\r\n\r\n\r\n\r\n /*************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_09-11/deitel.time-impl.cpp",
    "content": "// Fig. 16.10: deitel.time-impl.cpp\r\n// deitel.time module implementation unit containing the \r\n// Time class member function definitions. \r\nmodule deitel.time; // module implementation unit for deitel.time\r\n\r\nimport <stdexcept>;\r\nimport <string>;\r\nusing namespace deitel::time;\r\n\r\n// Time constructor initializes each data member    \r\nTime::Time(int hour, int minute, int second) {\r\n   // validate hour, minute and second\r\n   if ((hour < 0 || hour >= 24) || (minute < 0 || minute >= 60) ||\r\n      (second < 0 || second >= 60)) {\r\n      throw std::invalid_argument{\r\n         \"hour, minute or second was out of range\" };\r\n   }\r\n\r\n   m_hour = hour;\r\n   m_minute = minute;\r\n   m_second = second;\r\n}\r\n\r\n// return a string representation of the Time\r\nstd::string Time::toString() const {\r\n   using namespace std::string_literals;\r\n\r\n   return \"Hour: \"s + std::to_string(m_hour) +\r\n      \"\\nMinute: \"s + std::to_string(m_minute) +\r\n      \"\\nSecond: \"s + std::to_string(m_second);\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_09-11/deitel.time.ixx",
    "content": "// Fig. 16.9: deitel.time.ixx\r\n// Primary module interface for a simple Time class.\r\nexport module deitel.time; // declare the primary module interface\r\n\r\nimport <string>; // rather than #include <string>\r\n\r\nexport namespace deitel::time {\r\n   class Time { \r\n   public:\r\n      // default constructor because it can be called with no arguments\r\n      explicit Time(int hour = 0, int minute = 0, int second = 0);\r\n\r\n      std::string toString() const; \r\n   private:\r\n      int m_hour{0}; // 0 - 23 (24-hour clock format)\r\n      int m_minute{0}; // 0 - 59\r\n      int m_second{0}; // 0 - 59\r\n   };\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_09-11/fig16_11.cpp",
    "content": "// fig16_11.cpp \r\n// Importing the deitel.time module and using its Time class.\r\nimport <iostream>;\r\nimport <stdexcept>;\r\nimport <string>;\r\n\r\nimport deitel.time;\r\nusing namespace deitel::time;\r\n\r\nint main() {\r\n   const Time t{12, 25, 42}; // hour, minute and second specified      \r\n\r\n   std::cout << \"Time t:\\n\" << t.toString() << \"\\n\\n\";\r\n\r\n   // attempt to initialize t2 with invalid values\r\n   try {\r\n      const Time t2{27, 74, 99}; // all bad values specified\r\n   }\r\n   catch (const std::invalid_argument& e) {\r\n      std::cout << \"t2 not created: \" << e.what() << '\\n';\r\n   }\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_12-15/deitel.math-powers.ixx",
    "content": "// Fig. 16.12: deitel.math-powers.ixx\r\n// Module interface partition unit deitel.math:powers.\r\nexport module deitel.math:powers; \r\n\r\nexport namespace deitel::math {\r\n   double square(double x) {return x * x;}\r\n   double cube(double x) {return x * x * x;}\r\n}\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n**************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_12-15/deitel.math-roots.ixx",
    "content": "// Fig. 16.13: deitel.math-roots.ixx\r\n// Module interface partition unit deitel.math:roots. \r\nexport module deitel.math:roots;\r\n\r\nimport <cmath>;\r\n\r\nexport namespace deitel::math {\r\n   double squareRoot(double x) {return std::sqrt(x);}\r\n   double cubeRoot(double x) {return std::cbrt(x);}\r\n}\r\n\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n**************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_12-15/deitel.math.ixx",
    "content": "// Fig. 16.14: deitel.math.ixx\r\n// Primary module interface unit deitel.math exports declarations from\r\n// the module interface partitions :powers and :roots.\r\nexport module deitel.math; // declares the primary module interface unit\r\n\r\n// import and re-export the declarations in the module\r\n// interface partitions :powers and :roots\r\nexport import :powers;\r\nexport import :roots;\r\n\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n**************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_12-15/fig16_15.cpp",
    "content": "// fig16_15.cpp\r\n// Using the deitel.math module's functions.\r\nimport <iostream>;\r\nimport deitel.math; // import the deitel.math module\r\n\r\nusing namespace deitel::math; \r\n\r\nint main() {\r\n   std::cout << \"square(6): \" << square(6)\r\n      << \"\\ncube(5): \" << cube(5)\r\n      << \"\\nsquareRoot(9): \" << squareRoot(9)\r\n      << \"\\ncubeRoot(1000): \" << cubeRoot(1000) << '\\n';\r\n}\r\n\r\n\r\n\r\n\r\n\r\n /*************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_12-15clang/deitel.math-powers.ixx",
    "content": "// Fig. 16.12: deitel.math-powers.ixx\r\n// Module interface partition unit deitel.math:powers.\r\nexport module deitel.math:powers; \r\n\r\nexport namespace deitel::math {\r\n   double square(double x) { return x * x; }\r\n   double cube(double x) { return x * x * x; }\r\n}\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n**************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_12-15clang/deitel.math-roots.ixx",
    "content": "// Fig. 16.13: deitel.math-roots.ixx\r\n// Module interface partition unit deitel.math:roots. \r\nexport module deitel.math:roots;\r\n\r\n//import <cmath>;\r\n#include <cmath>\r\n\r\nexport namespace deitel::math {\r\n   double squareRoot(double x) { return std::sqrt(x); }\r\n   double cubeRoot(double x) { return std::cbrt(x); }\r\n}\r\n\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n**************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_12-15clang/deitel.math.ixx",
    "content": "// Fig. 16.14: deitel.math.ixx\r\n// Primary module interface unit deitel.math exports declarations from\r\n// the module interface partitions :powers and :roots.\r\nexport module deitel.math; // declares the primary module interface unit\r\n\r\n// import and re-export the declarations in the module\r\n// interface partitions :powers and :roots\r\nexport import :powers;\r\nexport import :roots;\r\n\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n**************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_12-15clang/fig16_15.cpp",
    "content": "// fig16_15.cpp\r\n// Using the deitel.math module's functions.\r\nimport <iostream>;\r\nimport deitel.math; // import the deitel.math module\r\n\r\nusing namespace deitel::math; \r\n\r\nint main() {\r\n   std::cout << \"square(6): \" << square(6)\r\n      << \"\\ncube(5): \" << cube(5)\r\n      << \"\\nsquareRoot(9): \" << squareRoot(9)\r\n      << \"\\ncubeRoot(1000): \" << cubeRoot(1000) << '\\n';\r\n}\r\n\r\n\r\n\r\n\r\n\r\n /*************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_16-21/deitel.math.ixx",
    "content": "// Fig. 16.20: deitel.math.ixx\r\n// Primary module interface unit deitel.math aggregates declarations\r\n// from \"submodules\" deitel.math.powers and deitel.math.roots.\r\nexport module deitel.math; // primary module interface unit\r\n\r\n// import and re-export deitel.math.powers and deitel.math.roots\r\nexport import deitel.math.powers;\r\nexport import deitel.math.roots;\r\n\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n**************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_16-21/deitel.math.powers.ixx",
    "content": "// Fig. 16.16: deitel.math.powers.ixx\r\n// Primary module interface unit deitel.math.powers.\r\nexport module deitel.math.powers; \r\n\r\nexport namespace deitel::math {\r\n   double square(double x) { return x * x; }\r\n   double cube(double x) { return x * x * x; }\r\n}\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n**************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_16-21/deitel.math.roots.ixx",
    "content": "// Fig. 16.18: deitel.math.roots.ixx\r\n// Primary module interface unit deitel.math.roots. \r\nexport module deitel.math.roots;\r\n\r\nimport <cmath>;\r\n\r\nexport namespace deitel::math {\r\n   double squareRoot(double x) { return std::sqrt(x); }\r\n   double cubeRoot(double x) { return std::cbrt(x); }\r\n}\r\n\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n**************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_16-21/fig16_17.cpp",
    "content": "// fig16_17.cpp\r\n// Using the deitel.math.powers module's functions.\r\nimport <iostream>;\r\nimport deitel.math.powers; // import the deitel.math.powers module\r\n\r\nusing namespace deitel::math;\r\n\r\nint main() {\r\n   std::cout << \"square(6): \" << square(6)\r\n      << \"\\ncube(5): \" << cube(5) << '\\n';\r\n}\r\n\r\n\r\n /*************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_16-21/fig16_19.cpp",
    "content": "// fig16_19.cpp\r\n// Using the deitel.math.roots module's functions.\r\nimport <iostream>;\r\nimport deitel.math.roots; // import the deitel.math.roots module\r\n\r\nusing namespace deitel::math; \r\n\r\nint main() {\r\n   std::cout << \"squareRoot(9): \" << squareRoot(9)\r\n      << \"\\ncubeRoot(1000): \" << cubeRoot(1000) << '\\n';\r\n}\r\n\r\n\r\n\r\n\r\n\r\n /*************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_16-21/fig16_21.cpp",
    "content": "// fig16_21.cpp\r\n// Using the deitel.math module's functions.\r\nimport <iostream>;\r\nimport deitel.math; // import the deitel.math module\r\n\r\nusing namespace deitel::math; \r\n\r\nint main() {\r\n   std::cout << \"square(6): \" << square(6)\r\n      << \"\\ncube(5): \" << cube(5)\r\n      << \"\\nsquareRoot(9): \" << squareRoot(9)\r\n      << \"\\ncubeRoot(1000): \" << cubeRoot(1000) << '\\n';\r\n}\r\n\r\n\r\n\r\n\r\n\r\n /*************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_16-21clang/deitel.math.ixx",
    "content": "// Fig. 16.20: deitel.math.ixx\r\n// Primary module interface unit deitel.math aggregates declarations\r\n// from \"submodules\" deitel.math.powers and deitel.math.roots.\r\nexport module deitel.math; // primary module interface unit\r\n\r\n// import and re-export deitel.math.powers and deitel.math.roots\r\nexport import deitel.math.powers;\r\nexport import deitel.math.roots;\r\n\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n**************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_16-21clang/deitel.math.powers.ixx",
    "content": "// Fig. 16.16: deitel.math.powers.ixx\r\n// Primary module interface unit deitel.math.powers.\r\nexport module deitel.math.powers; \r\n\r\nexport namespace deitel::math {\r\n   double square(double x) { return x * x; }\r\n   double cube(double x) { return x * x * x; }\r\n}\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n**************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_16-21clang/deitel.math.roots.ixx",
    "content": "// Fig. 16.18: deitel.math.roots.ixx\r\n// Primary module interface unit deitel.math.roots. \r\nmodule; \n#include <cmath>\r\n\nexport module deitel.math.roots;\r\n\r\nexport namespace deitel::math {\r\n   double squareRoot(double x) { return std::sqrt(x); }\r\n   double cubeRoot(double x) { return std::cbrt(x); }\r\n}\r\n\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n**************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_16-21clang/fig16_17.cpp",
    "content": "// fig16_17.cpp\r\n// Using the deitel.math.powers module's functions.\r\nimport <iostream>;\r\nimport deitel.math.powers; // import the deitel.math.powers module\r\n\r\nusing namespace deitel::math;\r\n\r\nint main() {\r\n   std::cout << \"square(6): \" << square(6)\r\n      << \"\\ncube(5): \" << cube(5) << '\\n';\r\n}\r\n\r\n\r\n /*************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_16-21clang/fig16_19.cpp",
    "content": "// fig16_19.cpp\r\n// Using the deitel.math.roots module's functions.\r\nimport <iostream>;\r\nimport deitel.math.roots; // import the deitel.math.roots module\r\n\r\nusing namespace deitel::math; \r\n\r\nint main() {\r\n   std::cout << \"squareRoot(9): \" << squareRoot(9)\r\n      << \"\\ncubeRoot(1000): \" << cubeRoot(1000) << '\\n';\r\n}\r\n\r\n\r\n\r\n\r\n\r\n /*************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_16-21clang/fig16_21.cpp",
    "content": "// fig16_21.cpp\r\n// Using the deitel.math module's functions.\r\nimport <iostream>;\r\nimport deitel.math; // import the deitel.math module\r\n\r\nusing namespace deitel::math; \r\n\r\nint main() {\r\n   std::cout << \"square(6): \" << square(6)\r\n      << \"\\ncube(5): \" << cube(5)\r\n      << \"\\nsquareRoot(9): \" << squareRoot(9)\r\n      << \"\\ncubeRoot(1000): \" << cubeRoot(1000) << '\\n';\r\n}\r\n\r\n\r\n\r\n\r\n\r\n /*************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_22/fig16_22.cpp",
    "content": "// fig16_22.cpp\r\n// Importing Microsoft's modularized standard library.\r\nimport std.core; // provides access to most of the C++ standard library\r\n\r\nint main() {\r\n   std::cout << \"Welcome to C++20 Modules!\\n\"; \r\n}\r\n\r\n\r\n\r\n\r\n\r\n /*************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_23-24/moduleA.ixx",
    "content": "// Fig. 16.23: moduleA.ixx\r\n// Primary module interface unit that imports moduleB.\r\nexport module moduleA; // declares the primary module interface unit\r\n\r\nexport import moduleB; // import and re-export moduleB\r\n\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n**************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_23-24/moduleB.ixx",
    "content": "// Fig. 16.24: moduleB.ixx\r\n// Primary module interface unit that imports moduleA.\r\nexport module moduleB; // declares the primary module interface unit\r\n\r\nexport import moduleA; // import and re-export moduleA\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n**************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_25-27/fig16_27.cpp",
    "content": "// fig16_27.cpp\r\n// Showing that moduleB does not implicitly export moduleA's function.\r\nimport <iostream>;\r\nimport moduleB; \r\n\r\nint main() {\r\n   std::cout << \"square(6): \" << square(6) // exported from moduleB\r\n      << \"\\ncube(5): \" << cube(5) << '\\n'; // not exported from moduleB\r\n}\r\n\r\n\r\n /*************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_25-27/moduleA.ixx",
    "content": "// Fig. 16.25: moduleA.ixx\r\n// Primary module interface unit that exports function cube.\r\nexport module moduleA; // declares the primary module interface unit\r\n\r\nexport int cube(int x) { return x * x * x; }\r\n\r\n\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n**************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_25-27/moduleB.ixx",
    "content": "// Fig. 16.26: moduleB.ixx\r\n// Primary module interface unit that imports, but does not export, \r\n// moduleA and exports function square.\r\nexport module moduleB; // declares the primary module interface unit\r\n\r\nimport moduleA; // import but do not export moduleA\r\n\r\nexport int square(int x) {return x * x;}\r\n\r\n\r\n/*************************************************************************\r\n* (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n* Pearson Education, Inc. All Rights Reserved.                           *\r\n*                                                                        *\r\n* DISCLAIMER: The authors and publisher of this book have used their     *\r\n* best efforts in preparing the book. These efforts include the          *\r\n* development, research, and testing of the theories and programs        *\r\n* to determine their effectiveness. The authors and publisher make       *\r\n* no warranty of any kind, expressed or implied, with regard to these    *\r\n* programs or to the documentation contained in these books. The authors *\r\n* and publisher shall not be liable in any event for incidental or       *\r\n* consequential damages in connection with, or arising out of, the       *\r\n* furnishing, performance, or use of these programs.                     *\r\n**************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_28-29/deitel.time-impl.cpp",
    "content": "// Fig. 16.10: deitel.time-impl.cpp\r\n// deitel.time module implementation unit containing the \r\n// Time class member function definitions. \r\nmodule deitel.time; // module implementation unit for deitel.time\r\n\r\nimport <stdexcept>;\r\nimport <string>;\r\nusing namespace deitel::time;\r\n\r\n// Time constructor initializes each data member    \r\nTime::Time(int hour, int minute, int second) {\r\n   // validate hour, minute and second\r\n   if ((hour < 0 || hour >= 24) || (minute < 0 || minute >= 60) ||\r\n      (second < 0 || second >= 60)) {\r\n      throw std::invalid_argument{\r\n         \"hour, minute or second was out of range\" };\r\n   }\r\n\r\n   m_hour = hour;\r\n   m_minute = minute;\r\n   m_second = second;\r\n}\r\n\r\n// return a string representation of the Time\r\nstd::string Time::toString() const {\r\n   using namespace std::string_literals;\r\n\r\n   return \"Hour: \"s + std::to_string(m_hour) +\r\n      \"\\nMinute: \"s + std::to_string(m_minute) +\r\n      \"\\nSecond: \"s + std::to_string(m_second);\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_28-29/deitel.time.ixx",
    "content": "// Fig. 16.28: deitel.time.ixx\r\n// Primary module interface unit for the deitel.time module.\r\nexport module deitel.time; // declare the primary module interface\r\n\r\nimport <string>; // rather than #include <string>\r\n\r\nnamespace deitel::time {\r\n   class Time { // not exported\r\n   public:\r\n      // default constructor because it can be called with no arguments\r\n      explicit Time(int hour = 0, int minute = 0, int second = 0);\r\n\r\n      std::string toString() const; \r\n   private:\r\n      int m_hour{0}; // 0 - 23 (24-hour clock format)\r\n      int m_minute{0}; // 0 - 59\r\n      int m_second{0}; // 0 - 59\r\n   };\r\n\r\n   // exported function returns a valid Time\r\n   export Time getTime() {return Time(6, 45, 0);}\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson16/fig16_28-29/fig16_29.cpp",
    "content": "// fig16_29.cpp \r\n// Showing that type deitel::time::Time is reachable  \r\n// and its public members are visible.\r\nimport <iostream>;\r\nimport deitel.time;\r\n\r\nint main() {\r\n   // initalize t with the object returned by getTime; cannot declare t \r\n   // as type Time because the type is not exported, and thus not visible\r\n   auto t{deitel::time::getTime()};\r\n\r\n   // Time's toString function is reachable, even though\r\n   // class Time was not exported by module deitel.time\r\n   std::cout << \"Time t:\\n\" << t.toString() << \"\\n\\n\";\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson17/fig17_01/fig17_01.cpp",
    "content": "// fig17_01.cpp\r\n// Profiling sequential and parallel sorting with the std::sort algorithm.\r\n#include <algorithm>\r\n#include <chrono> // for timing operations\r\n#include <execution> // for execution policies\r\n#include <iostream>\r\n#include <iterator>\r\n#include <random>\r\n#include <vector>\r\n\r\nint main() {\r\n   // set up random-number generation \r\n   std::random_device rd;\r\n   std::default_random_engine engine{rd()}; \r\n   std::uniform_int_distribution ints{};\r\n\r\n   std::cout << \"Creating a vector v1 to hold 100,000,000 ints\\n\";\r\n   std::vector<int> v1(100'000'000); // 100,000,000 element vector\r\n\r\n   std::cout << \"Filling vector v1 with random ints\\n\";\r\n   std::ranges::generate(v1, [&]() {return ints(engine);});\r\n\r\n   // copy v1 to create identical data sets for each sort demonstration\r\n   std::cout << \"Copying v1 to vector v2 to create identical data sets\\n\";\r\n   std::vector v2{v1};\r\n\r\n   // <chrono> library features we'll use for timing\r\n   using std::chrono::steady_clock;\r\n   using std::chrono::duration_cast;\r\n   using std::chrono::milliseconds;\r\n\r\n   // sequentially sort v1\r\n   std::cout << \"\\nSorting 100,000,000 ints sequentially\\n\";\r\n   auto start1{steady_clock::now()}; // get current time\r\n   std::sort(v1.begin(), v1.end()); // sequential sort\r\n   auto end1{steady_clock::now()}; // get current time\r\n\r\n   // calculate and display time in milliseconds\r\n   auto time1{duration_cast<milliseconds>(end1 - start1)};\r\n   std::cout << \"Time: \" << (time1.count() / 1000.0) << \" seconds\\n\";\r\n\r\n   // parallel sort v2\r\n   std::cout << \"\\nSorting the same 100,000,000 ints in parallel\\n\";\r\n   auto start2{steady_clock::now()}; // get current time\r\n   std::sort(std::execution::par, v2.begin(), v2.end()); // parallel sort\r\n   auto end2{steady_clock::now()}; // get current time\r\n\r\n   // calculate and display time in milliseconds\r\n   auto time2{duration_cast<milliseconds>(end2 - start2)};\r\n   std::cout << \"Time: \" << (time2.count() / 1000.0) << \" seconds\\n\";\r\n}\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson17/fig17_02/fig17_02.cpp",
    "content": "// fig17_02.cpp\r\n// Performing transforms with execution policies par and unseq.\r\n#include <algorithm>\r\n#include <chrono> // for timing operations\r\n#include <cmath>\r\n#include <execution> // for execution policies\r\n#include <format>\r\n#include <iostream>\r\n#include <random>\r\n#include <vector>\r\n\r\n// time each std::transform call and return its duration in seconds\r\ndouble timeTransform(auto policy, const std::vector<int>& v) {\r\n   // <chrono> library features we'll use for timing\r\n   using std::chrono::steady_clock;\r\n   using std::chrono::duration_cast;\r\n   using std::chrono::milliseconds;\r\n\r\n   std::vector<double> result(v.size());\r\n   auto start{steady_clock::now()}; // get current time\r\n   std::transform(policy, v.begin(), v.end(),\r\n      result.begin(), [](auto x) {return std::sqrt(x);});\r\n   auto end{steady_clock::now()}; // get current time\r\n\r\n   // calculate and return time in seconds\r\n   auto time{duration_cast<milliseconds>(end - start)};\r\n   return time.count() / 1000.0;\r\n}\r\n\r\nint main() {\r\n   // set up random-number generation \r\n   std::random_device rd;\r\n   std::default_random_engine engine{rd()}; \r\n   std::uniform_int_distribution ints{0, 1000};\r\n\r\n   std::cout << \"Creating vectors\\n\";\r\n   std::vector<int> v1(100'000'000); \r\n   std::vector<int> v2(1'000'000'000); \r\n\r\n   std::cout << \"Filling vectors with random ints\\n\";\r\n   std::generate(std::execution::par, v1.begin(), v1.end(),\r\n      [&]() {return ints(engine);});\r\n   std::generate(std::execution::par, v2.begin(), v2.end(),\r\n      [&]() {return ints(engine);});\r\n\r\n   std::cout << \"\\nCalculating square roots:\\n\";\r\n\r\n   // time the transforms on 100,000,000 elements\r\n   std::cout << std::format(\"{} elements with par\\n\", v1.size());\r\n   double parTime1{timeTransform(std::execution::par, v1)};\r\n   std::cout << std::format(\"{} elements with unseq\\n\", v1.size());\r\n   double unseqTime1{timeTransform(std::execution::unseq, v1)};\r\n\r\n   // time the transforms on 1,000,000,000 elements\r\n   std::cout << std::format(\"{} elements with par\\n\", v2.size());\r\n   double parTime2{timeTransform(std::execution::par, v2)};\r\n   std::cout << std::format(\"{} elements with unseq\\n\", v2.size());\r\n   double unseqTime2{timeTransform(std::execution::unseq, v2)};\r\n\r\n   // display table of timing results\r\n   std::cout << \"\\nExecution times (in seconds):\\n\\n\"\r\n      << std::format(\"{:>13}{:>17}{:>21}\\n\", \"# of elements\", \r\n            \"par (parallel)\", \"unseq (vectorized)\")\r\n      << std::format(\"{:>13}{:>17.3f}{:>21.3f}\\n\",\r\n            v1.size(), parTime1, unseqTime1)\r\n      << std::format(\"{:>13}{:>17.3f}{:>21.3f}\\n\",\r\n            v2.size(), parTime2, unseqTime2);\r\n}\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson17/fig17_03-04/printtask.cpp",
    "content": "// Fig. 17.4: printtask.cpp\r\n// Concurrently executing tasks with std::jthreads.\r\n#include <chrono>\r\n#include <format>\r\n#include <iostream>\r\n#include <random>\r\n#include <string>\r\n#include <thread>\r\n#include <vector>\r\n#include \"printtask.h\"\r\n\r\nint main() {\r\n   // set up random-number generation \r\n   std::random_device rd;\r\n   std::default_random_engine engine{rd()}; \r\n   std::uniform_int_distribution ints{0, 5000};\r\n\r\n   std::vector<std::jthread> threads; // stores the jthreads\r\n\r\n   std::cout << \"STARTING JTHREADS\\n\";\r\n\r\n   // start two jthreads\r\n   for (int i{1}; i < 3; ++i) {\r\n      std::chrono::milliseconds sleepTime{ints(engine)};\r\n      std::string name{std::format(\"Task {}\", i)};\r\n\r\n      // create a jthread that calls printTask, passing name and sleepTime\r\n      // as arguments and store the jthread, so it is not destructed until\r\n      // the vector goes out of scope at the end of main; each jthread's\r\n      // destructor automatically joins the jthread\r\n      threads.push_back(std::jthread{printTask, name, sleepTime});\r\n   }\r\n\r\n   std::cout << \"\\nJTHREADS STARTED\\n\";\r\n   std::cout << \"\\nMAIN ENDS\\n\";\r\n}\r\n\r\n\r\n\r\n/************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and             *\r\n * Pearson Education, Inc. All Rights Reserved.                         *\r\n *                                                                      *\r\n * DISCLAIMER: The authors and publisher of this book have used their   *\r\n * best efforts in preparing the book. These efforts include the        *\r\n * development, research, and testing of the theories and programs      *\r\n * to determine their effectiveness. The authors and publisher make     *\r\n * no warranty of any kind, expressed or implied, with regard to these  *\r\n * programs or to the documentation contained in these books. The       *\r\n * authors and publisher shall not be liable in any event for           *\r\n * incidental or consequential damages in connection with, or arising   *\r\n * out of, the furnishing, performance, or use of these programs.       *\r\n ***********************************************************************/\r\n\r\n"
  },
  {
    "path": "examples/lesson17/fig17_03-04/printtask.h",
    "content": "// Fig. 17.3: printtask.h\r\n// Function printTask defines a task to perform in a separate thread.\r\n#include <chrono>\r\n#include <format> \r\n#include <iostream>\r\n#include <sstream>\r\n#include <string>\r\n#include <thread>\r\n\r\n// get current thread's ID as a string\r\nstd::string id() {\r\n    std::ostringstream out;\r\n    out << std::this_thread::get_id();\r\n    return out.str();\r\n}\r\n\r\n// task to perform in a separate thread \r\nvoid printTask(const std::string& name, \r\n   std::chrono::milliseconds sleepTime) {\r\n\r\n   // <chrono> library features we'll use for timing\r\n   using std::chrono::steady_clock;\r\n   using std::chrono::duration_cast;\r\n   using std::chrono::milliseconds;\r\n\r\n   std::cout << std::format(\"{} (ID {}) going to sleep for {} ms\\n\",\r\n      name, id(), sleepTime.count());\r\n\r\n   auto startTime{steady_clock::now()}; // get current time\r\n\r\n   // put thread to sleep for sleepTime milliseconds \r\n   std::this_thread::sleep_for(sleepTime); \r\n\r\n   auto endTime{steady_clock::now()}; // get current time\r\n   auto time{duration_cast<milliseconds>(endTime - startTime)};\r\n   auto difference{duration_cast<milliseconds>(time - sleepTime)};\r\n   std::cout << std::format(\"{} (ID {}) awakens after {} ms ({} + {})\\n\",\r\n      name, id(), time.count(), sleepTime.count(), difference.count());\r\n}\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson17/fig17_05-06/SharedBufferTest.cpp",
    "content": "// Fig. 17.6: SharedBufferTest.cpp\r\n// Application with concurrent jthreads sharing an unsynchronized buffer.\r\n#include <chrono>\r\n#include <format>\r\n#include <iostream>\r\n#include <random>\r\n#include <thread>\r\n#include \"UnsynchronizedBuffer.h\"\r\n\r\nint main() {\r\n   // create UnsynchronizedBuffer to store ints       \r\n   UnsynchronizedBuffer buffer;\r\n\r\n   // lambda expression that produces the values 1-10 and sums them \r\n   auto produce{\r\n      [&buffer]() {\r\n         // set up random-number generation \r\n         std::random_device rd;\r\n         std::default_random_engine engine{rd()};\r\n         std::uniform_int_distribution ints{0, 3000};\r\n\r\n         int sum{0};\r\n\r\n         for (int count{1}; count <= 10; ++count) {\r\n            // get random sleep time then sleep\r\n            std::chrono::milliseconds sleepTime{ints(engine)};\r\n            std::this_thread::sleep_for(sleepTime);\r\n\r\n            buffer.put(count); // set value in buffer\r\n            sum += count; // add count to sum of values produced\r\n            std::cout << std::format(\"\\t{:2d}\\n\", sum);\r\n         }\r\n   \r\n         std::cout << \"Producer done producing\\nTerminating Producer\\n\";      \r\n      }\r\n   };\r\n\r\n   // lambda expression that consumes the values 1-10 and sums them\r\n   auto consume{\r\n      [&buffer]() {\r\n         // set up random-number generation \r\n         std::random_device rd;\r\n         std::default_random_engine engine{rd()};\r\n         std::uniform_int_distribution ints{0, 3000};\r\n\r\n         int sum{0};\r\n\r\n         for (int count{1}; count <= 10; ++count) {\r\n            // get random sleep time then sleep\r\n            std::chrono::milliseconds sleepTime{ints(engine)};\r\n            std::this_thread::sleep_for(sleepTime);\r\n\r\n            sum += buffer.get(); // get buffer value and add to sum\r\n            std::cout << std::format(\"\\t\\t\\t{:2d}\\n\", sum);\r\n        }\r\n\r\n         std::cout << std::format(\"\\n{} {}\\n{}\\n\",\r\n            \"Consumer read values totaling\", sum, \"Terminating Consumer\");\r\n      }\r\n   };\r\n\r\n   std::cout << \"Action\\t\\tValue\\tSum of Produced\\tSum of Consumed\\n\";\r\n   std::cout << \"------\\t\\t-----\\t---------------\\t---------------\\n\";\r\n\r\n   std::jthread producer{produce}; // start producer jthread\r\n   std::jthread consumer{consume}; // start consumer jthread \r\n} \r\n\r\n\r\n/************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and             *\r\n * Pearson Education, Inc. All Rights Reserved.                         *\r\n *                                                                      *\r\n * DISCLAIMER: The authors and publisher of this book have used their   *\r\n * best efforts in preparing the book. These efforts include the        *\r\n * development, research, and testing of the theories and programs      *\r\n * to determine their effectiveness. The authors and publisher make     *\r\n * no warranty of any kind, expressed or implied, with regard to these  *\r\n * programs or to the documentation contained in these books. The       *\r\n * authors and publisher shall not be liable in any event for           *\r\n * incidental or consequential damages in connection with, or arising   *\r\n * out of, the furnishing, performance, or use of these programs.       *\r\n ***********************************************************************/\r\n\r\n"
  },
  {
    "path": "examples/lesson17/fig17_05-06/UnsynchronizedBuffer.h",
    "content": "// Fig. 17.5: UnsynchronizedBuffer.h\r\n// UnsynchronizedBuffer incorrectly maintains a shared integer that is \r\n// accessed by a producer thread and a consumer thread.\r\n#pragma once\r\n#include <format>\r\n#include <iostream>\r\n#include <string>\r\n\r\nclass UnsynchronizedBuffer {\r\npublic:\r\n   // place value into buffer\r\n   void put(int value) {\r\n      std::cout << std::format(\"Producer writes\\t{:2d}\", value);\r\n      m_buffer = value;\r\n   }\r\n\r\n   // return value from buffer\r\n   int get() const {\r\n      std::cout << std::format(\"Consumer reads\\t{:2d}\", m_buffer);\r\n      return m_buffer;\r\n   }\r\nprivate:\r\n   int m_buffer{-1}; // shared by producer and consumer threads\r\n};\r\n\r\n\r\n/************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and             *\r\n * Pearson Education, Inc. All Rights Reserved.                         *\r\n *                                                                      *\r\n * DISCLAIMER: The authors and publisher of this book have used their   *\r\n * best efforts in preparing the book. These efforts include the        *\r\n * development, research, and testing of the theories and programs      *\r\n * to determine their effectiveness. The authors and publisher make     *\r\n * no warranty of any kind, expressed or implied, with regard to these  *\r\n * programs or to the documentation contained in these books. The       *\r\n * authors and publisher shall not be liable in any event for           *\r\n * incidental or consequential damages in connection with, or arising   *\r\n * out of, the furnishing, performance, or use of these programs.       *\r\n ***********************************************************************/\r\n\r\n"
  },
  {
    "path": "examples/lesson17/fig17_07-08/SharedBufferTest.cpp",
    "content": "// Fig. 17.8: SharedBufferTest.cpp\r\n// Concurrent threads correctly manipulating a synchronized buffer.\r\n#include <chrono>\r\n#include <format>\r\n#include <iostream>\r\n#include <mutex>\r\n#include <random>\r\n#include <thread>\r\n#include \"SynchronizedBuffer.h\"\r\n\r\nint main() {\r\n   // set up random-number generation \r\n   std::random_device rd;\r\n   std::default_random_engine engine{rd()};\r\n   std::uniform_int_distribution ints{0, 3000};\r\n   std::mutex intsMutex;\r\n\r\n   // lambda for synchronized random sleep time generation\r\n   auto getSleepTime{\r\n      [&]() {\r\n         std::lock_guard lock{intsMutex};\r\n         return std::chrono::milliseconds{ints(engine)};\r\n      }\r\n   };\r\n\r\n   // create SynchronizedBuffer to store ints       \r\n   SynchronizedBuffer buffer;\r\n\r\n   // lambda expression that produces the values 1-10 and sums them \r\n   auto produce{\r\n      [&buffer, &getSleepTime]() {\r\n         int sum{0};\r\n\r\n         for (int count{1}; count <= 10; ++count) {\r\n            // get random sleep time then sleep\r\n            std::this_thread::sleep_for(getSleepTime());\r\n\r\n            buffer.put(count); // set value in buffer\r\n            sum += count; // add count to sum of values produced\r\n         }\r\n\r\n         std::cout << \"Producer done producing\\nTerminating Producer\\n\";\r\n      }\r\n   };\r\n\r\n   // lambda expression that consumes the values 1-10 and sums them\r\n   auto consume{\r\n      [&buffer, &getSleepTime]() {\r\n         int sum{0};\r\n\r\n         for (int count{1}; count <= 10; ++count) {\r\n            // get random sleep time then sleep\r\n            std::this_thread::sleep_for(getSleepTime());\r\n\r\n            sum += buffer.get(); // get buffer value and add to sum\r\n         }\r\n\r\n         std::cout << std::format(\"\\n{} {}\\n{}\\n\",\r\n            \"Consumer read values totaling\", sum, \"Terminating Consumer\");\r\n      }\r\n   };\r\n\r\n   std::cout << std::format(\"{:<40}{}\\t\\t{}\\n{:<40}{}\\t\\t{}\\n\\n\",\r\n      \"Operation\", \"Buffer\", \"Occupied\",\r\n      \"---------\", \"------\", \"--------\");\r\n\r\n   std::jthread producer{produce}; // start producer thread\r\n   std::jthread consumer{consume}; // start consumer thread \r\n}\r\n\r\n/************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and             *\r\n * Pearson Education, Inc. All Rights Reserved.                         *\r\n *                                                                      *\r\n * DISCLAIMER: The authors and publisher of this book have used their   *\r\n * best efforts in preparing the book. These efforts include the        *\r\n * development, research, and testing of the theories and programs      *\r\n * to determine their effectiveness. The authors and publisher make     *\r\n * no warranty of any kind, expressed or implied, with regard to these  *\r\n * programs or to the documentation contained in these books. The       *\r\n * authors and publisher shall not be liable in any event for           *\r\n * incidental or consequential damages in connection with, or arising   *\r\n * out of, the furnishing, performance, or use of these programs.       *\r\n ***********************************************************************/\r\n\r\n"
  },
  {
    "path": "examples/lesson17/fig17_07-08/SynchronizedBuffer.h",
    "content": "// Fig. 17.7: SynchronizedBuffer.h \r\n// SynchronizedBuffer maintains synchronized access to a shared mutable\r\n// integer that is accessed by a producer thread and a consumer thread.\r\n#pragma once\r\n#include <condition_variable> \r\n#include <format> \r\n#include <mutex>\r\n#include <iostream>\r\n#include <string>\r\n\r\nusing namespace std::string_literals;\r\n\r\nclass SynchronizedBuffer {\r\npublic:\r\n   // place value into m_buffer\r\n   void put(int value) {\r\n      // critical section that requires a lock to modify shared data\r\n      {\r\n         // lock on m_mutex to be able to write to m_buffer\r\n         std::unique_lock dataLock{m_mutex};\r\n\r\n         if (m_occupied) {\r\n            std::cout << std::format(\r\n               \"Producer tries to write.\\n{:<40}{}\\t\\t{}\\n\\n\",\r\n               \"Buffer full. Producer waits.\", m_buffer, m_occupied);\r\n\r\n            // wait on condition variable m_cv; the lambda in the second\r\n            // argument ensures that if the thread gets the processor\r\n            // before m_occupied is false, the thread continues waiting\r\n            m_cv.wait(dataLock, [&]() {return !m_occupied;});\r\n         }\r\n\r\n         // write to m_buffer\r\n         m_buffer = value;\r\n         m_occupied = true;\r\n\r\n         std::cout << std::format(\"{:<40}{}\\t\\t{}\\n\\n\",\r\n            \"Producer writes \"s + std::to_string(value),\r\n            m_buffer, m_occupied);\r\n      } // dataLock's destructor releases the lock on m_mutex \r\n\r\n      // if consumer is waiting, notify it that it can now read\r\n      m_cv.notify_one();\r\n   }\r\n\r\n   // return value from m_buffer\r\n   int get() {\r\n      int value; // will store the value returned by get\r\n\r\n      // critical section that requires a lock to modify shared data\r\n      {\r\n         // lock on m_mutex to be able to read from m_buffer\r\n         std::unique_lock dataLock{m_mutex};\r\n\r\n         if (!m_occupied) {\r\n            std::cout << std::format(\r\n               \"Consumer tries to read.\\n{:<40}{}\\t\\t{}\\n\\n\",\r\n               \"Buffer empty. Consumer waits.\", m_buffer, m_occupied);\r\n\r\n            // wait on condition variable m_cv; the lambda in the second \r\n            // argument ensures that if the thread gets the processor\r\n            // before m_occupied is true, the thread continues waiting\r\n            m_cv.wait(dataLock, [&]() {return m_occupied;});\r\n         }\r\n\r\n         value = m_buffer;\r\n         m_occupied = false;\r\n\r\n         std::cout << std::format(\"{:<40}{}\\t\\t{}\\n{}\\n\",\r\n            \"Consumer reads \"s + std::to_string(m_buffer),\r\n            m_buffer, m_occupied, std::string(64, '-'));\r\n      } // dataLock's destructor releases the lock on m_mutex \r\n\r\n      // if producer is waiting, notify it that it can now write\r\n      m_cv.notify_one();\r\n\r\n      return value;\r\n   }\r\nprivate:\r\n   int m_buffer{-1}; // shared by producer and consumer threads\r\n   bool m_occupied{false};\r\n   std::condition_variable m_cv;\r\n   std::mutex m_mutex;\r\n};\r\n\r\n\r\n/************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and             *\r\n * Pearson Education, Inc. All Rights Reserved.                         *\r\n *                                                                      *\r\n * DISCLAIMER: The authors and publisher of this book have used their   *\r\n * best efforts in preparing the book. These efforts include the        *\r\n * development, research, and testing of the theories and programs      *\r\n * to determine their effectiveness. The authors and publisher make     *\r\n * no warranty of any kind, expressed or implied, with regard to these  *\r\n * programs or to the documentation contained in these books. The       *\r\n * authors and publisher shall not be liable in any event for           *\r\n * incidental or consequential damages in connection with, or arising   *\r\n * out of, the furnishing, performance, or use of these programs.       *\r\n ***********************************************************************/\r\n\r\n"
  },
  {
    "path": "examples/lesson17/fig17_09-10/CircularBuffer.h",
    "content": "// Fig. 17.9: CircularBuffer.h\r\n// Synchronizing access to a shared three-element circular buffer.\r\n#pragma once\r\n#include <array> \r\n#include <condition_variable> \r\n#include <format> \r\n#include <mutex>\r\n#include <iostream>\r\n#include <string>\r\n#include <string_view>\r\n\r\nusing namespace std::string_literals;\r\n\r\nclass CircularBuffer {\r\npublic:\r\n   // place value into m_bu ffer\r\n   void put(int value) {\r\n      // critical section that requires a lock to modify shared data\r\n      {\r\n         // lock on m_mutex to be able to write to m_buffer\r\n         std::unique_lock dataLock{m_mutex};\r\n\r\n         // if no empty locations, wait on condition variable m_cv  \r\n         if (m_occupiedCells == m_buffer.size()) {\r\n            std::cout << \"Buffer is full. Producer waits.\\n\\n\";\r\n\r\n            // wait on the condition variable; the lambda argument \r\n            // ensures that if the thread gets the processor before\r\n            // the m_buffer has open cells, the thread continues waiting\r\n            m_cv.wait(dataLock,\r\n               [&] {return m_occupiedCells < m_buffer.size();});\r\n         }\r\n\r\n         m_buffer[m_writeIndex] = value; // write to m_buffer\r\n         ++m_occupiedCells; // one more m_buffer cell is occupied\r\n         m_writeIndex = (m_writeIndex + 1) % m_buffer.size();\r\n         displayState(std::format(\"Producer writes {}\", value));\r\n      } // dataLock's destructor releases the lock on m_mutex here\r\n\r\n      m_cv.notify_one(); // notify threads waiting to read from m_buffer\r\n   }\r\n\r\n   // return value from m_buffer\r\n   int get() {\r\n      int readValue; // will temporarily hold the next value read \r\n\r\n      // critical section that requires a lock to modify shared data\r\n      {\r\n         // lock on m_mutex to be able to write to m_buffer\r\n         std::unique_lock dataLock{m_mutex};\r\n\r\n         // if no data to read, place thread in waiting state\r\n         if (m_occupiedCells == 0) {\r\n            std::cout << \"Buffer is empty. Consumer waits.\\n\\n\";\r\n\r\n            // wait on the condition variable; the lambda argument \r\n            // ensures that if the thread gets the processor before\r\n            // there is data in the m_buffer, the thread continues waiting\r\n            m_cv.wait(dataLock, [&]() {return m_occupiedCells > 0;});\r\n         }\r\n\r\n         readValue = m_buffer[m_readIndex]; // read value from m_buffer\r\n         m_readIndex = (m_readIndex + 1) % m_buffer.size();\r\n         --m_occupiedCells; // one fewer m_buffer cells is occupied\r\n         displayState(std::format(\"Consumer reads {}\", readValue));\r\n      } // dataLock's destructor releases the lock on m_mutex here\r\n\r\n      m_cv.notify_one(); // notify threads waiting to write to m_buffer\r\n      return readValue;\r\n   }\r\n\r\n   // display current operation and m_buffer state\r\n   void displayState(std::string_view operation) const {\r\n      std::string s;\r\n\r\n      // add operation argument and number of occupied m_buffer cells\r\n      s += std::format(\"{} (buffer cells occupied: {})\\n{:<15}\",\r\n         operation, m_occupiedCells, \"buffer cells:\");\r\n\r\n      // add values in m_buffer \r\n      for (int value : m_buffer) {\r\n         s += std::format(\" {:2d}  \", value);\r\n      }\r\n\r\n      s += std::format(\"\\n{:<15}\", \"\"); // padding\r\n\r\n      // add underlines\r\n      for (int i{0}; i < m_buffer.size(); ++i) {\r\n         s += \"---- \"s;\r\n      }\r\n\r\n      s += std::format(\"\\n{:<15}\", \"\"); // padding\r\n\r\n      for (int i{0}; i < m_buffer.size(); ++i) {\r\n         s += std::format(\" {}{}  \",\r\n            (i == m_writeIndex ? 'W' : ' '),\r\n            (i == m_readIndex ? 'R' : ' '));\r\n      }\r\n\r\n      s += \"\\n\\n\";\r\n      std::cout << s; // display the state string\r\n   }\r\nprivate:\r\n   std::condition_variable m_cv;\r\n   std::mutex m_mutex;\r\n\r\n   std::array<int, 3> m_buffer{-1, -1, -1}; // shared m_buffer\r\n   int m_occupiedCells{0}; // count number of buffers used\r\n   int m_writeIndex{0}; // index of next element to write to\r\n   int m_readIndex{0}; // index of next element to read\r\n};\r\n\r\n/************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and             *\r\n * Pearson Education, Inc. All Rights Reserved.                         *\r\n *                                                                      *\r\n * DISCLAIMER: The authors and publisher of this book have used their   *\r\n * best efforts in preparing the book. These efforts include the        *\r\n * development, research, and testing of the theories and programs      *\r\n * to determine their effectiveness. The authors and publisher make     *\r\n * no warranty of any kind, expressed or implied, with regard to these  *\r\n * programs or to the documentation contained in these books. The       *\r\n * authors and publisher shall not be liable in any event for           *\r\n * incidental or consequential damages in connection with, or arising   *\r\n * out of, the furnishing, performance, or use of these programs.       *\r\n ***********************************************************************/"
  },
  {
    "path": "examples/lesson17/fig17_09-10/SharedBufferTest.cpp",
    "content": "// Fig. 17.10: SharedBufferTest.cpp\r\n// Concurrent threads manipulating a synchronized circular buffer.\r\n#include <chrono>\r\n#include <format>\r\n#include <iostream>\r\n#include <mutex>\r\n#include <random>\r\n#include <thread>\r\n#include \"CircularBuffer.h\"\r\n\r\nint main() {\r\n   // create CircularBuffer to store ints and display initial state       \r\n   CircularBuffer buffer;\r\n   buffer.displayState(\"Initial State\");\r\n\r\n   // lambda expression that produces the values 1-10 and sums them \r\n   auto produce{\r\n      [&buffer]() {\r\n         // set up random-number generation \r\n         std::random_device rd;\r\n         std::default_random_engine engine{rd()};\r\n         std::uniform_int_distribution ints{0, 3000};\r\n\r\n         int sum{0};\r\n\r\n         for (int count{1}; count <= 10; ++count) {\r\n            // get random sleep time then sleep\r\n            std::chrono::milliseconds sleepTime{ints(engine)};\r\n            std::this_thread::sleep_for(sleepTime);\r\n\r\n            buffer.put(count); // set value in buffer\r\n            sum += count; // add count to sum of values produced\r\n         }\r\n   \r\n         std::cout << \"Producer done producing\\nTerminating Producer\\n\\n\";\r\n      }\r\n   };\r\n\r\n   // lambda expression that consumes the values 1-10 and sums them\r\n   auto consume{\r\n      [&buffer]() {\r\n         // set up random-number generation \r\n         std::random_device rd;\r\n         std::default_random_engine engine{rd()};\r\n         std::uniform_int_distribution ints{0, 3000};\r\n\r\n         int sum{0};\r\n\r\n         for (int count{1}; count <= 10; ++count) {\r\n            // get random sleep time then sleep\r\n            std::chrono::milliseconds sleepTime{ints(engine)};\r\n            std::this_thread::sleep_for(sleepTime);\r\n\r\n            sum += buffer.get(); // get buffer value and add to sum\r\n         }\r\n\r\n         std::cout << std::format(\"{} {}\\n{}\\n\\n\",\r\n            \"Consumer read values totaling\", sum, \"Terminating Consumer\");\r\n      }\r\n   };\r\n\r\n   std::jthread producer{produce}; // start producer thread\r\n   std::jthread consumer{consume}; // start consumer thread \r\n} \r\n\r\n\r\n\r\n/************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and             *\r\n * Pearson Education, Inc. All Rights Reserved.                         *\r\n *                                                                      *\r\n * DISCLAIMER: The authors and publisher of this book have used their   *\r\n * best efforts in preparing the book. These efforts include the        *\r\n * development, research, and testing of the theories and programs      *\r\n * to determine their effectiveness. The authors and publisher make     *\r\n * no warranty of any kind, expressed or implied, with regard to these  *\r\n * programs or to the documentation contained in these books. The       *\r\n * authors and publisher shall not be liable in any event for           *\r\n * incidental or consequential damages in connection with, or arising   *\r\n * out of, the furnishing, performance, or use of these programs.       *\r\n ***********************************************************************/\r\n\r\n"
  },
  {
    "path": "examples/lesson17/fig17_11/CooperativeCancelation.cpp",
    "content": "// Fig. 17.11: CooperativeCancelation.cpp\r\n// Using a std::jthread's built-in stop_source \r\n// to request that the std::jthread stop executing.\r\n#include <chrono>\r\n#include <format>\r\n#include <iostream>\r\n#include <mutex>\r\n#include <random>\r\n#include <sstream>\r\n#include <stop_token>\r\n#include <string>\r\n#include <string_view>\r\n#include <thread>\r\n\r\n// get current thread's ID as a string\r\nstd::string id() {\r\n    std::ostringstream out;\r\n    out << std::this_thread::get_id();\r\n    return out.str();\r\n}\r\n\r\nint main() {\r\n   // each printTask iterates until a stop is requested by another thread\r\n   auto printTask{\r\n      [&](std::stop_token token, std::string name) {\r\n         // set up random-number generation \r\n         std::random_device rd;\r\n         std::default_random_engine engine{rd()};\r\n         std::uniform_int_distribution ints{500, 1000};\r\n\r\n         // register a function to call when a stop is requested \r\n         std::stop_callback callback(token, [&]() {\r\n            std::cout << std::format(\r\n               \"{} told to stop by thread with id {}\\n\", name, id());\r\n         });\r\n\r\n         while (!token.stop_requested()) { // run until stop requested\r\n            auto sleepTime{std::chrono::milliseconds{ints(engine)}};\r\n\r\n            std::cout << std::format(\r\n               \"{} (id: {}) going to sleep for {} ms\\n\",\r\n               name, id(), sleepTime.count());\r\n\r\n            // put thread to sleep for sleepTime milliseconds \r\n            std::this_thread::sleep_for(sleepTime);\r\n\r\n            // show that task woke up \r\n            std::cout << std::format(\"{} working.\\n\", name);\r\n         }\r\n\r\n         std::cout << std::format(\"{} terminating.\\n\", name);\r\n      }\r\n   };\r\n\r\n   std::cout << std::format(\"MAIN (id: {}) STARTING TASKS\\n\", id());\r\n\r\n   // create two jthreads that each call printTask with a string argument\r\n   std::jthread task1{printTask, \"Task 1\"};\r\n   std::jthread task2{printTask, \"Task 2\"};\r\n\r\n   // put main thread to sleep for 2 seconds \r\n   std::cout << \"\\nMAIN GOING TO SLEEP FOR 2 SECONDS\\n\\n\";\r\n   std::this_thread::sleep_for(std::chrono::seconds{2});\r\n\r\n   std::cout << std::format(\"\\nMAIN (id: {}) ENDS\\n\\n\", id()); \r\n}\r\n\r\n\r\n\r\n/************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and             *\r\n * Pearson Education, Inc. All Rights Reserved.                         *\r\n *                                                                      *\r\n * DISCLAIMER: The authors and publisher of this book have used their   *\r\n * best efforts in preparing the book. These efforts include the        *\r\n * development, research, and testing of the theories and programs      *\r\n * to determine their effectiveness. The authors and publisher make     *\r\n * no warranty of any kind, expressed or implied, with regard to these  *\r\n * programs or to the documentation contained in these books. The       *\r\n * authors and publisher shall not be liable in any event for           *\r\n * incidental or consequential damages in connection with, or arising   *\r\n * out of, the furnishing, performance, or use of these programs.       *\r\n ***********************************************************************/\r\n\r\n"
  },
  {
    "path": "examples/lesson17/fig17_11/CooperativeCancelationFMT.cpp",
    "content": "// Fig. 17.11: CooperativeCancelation.cpp\r\n// Using a std::jthread's built-in stop_source \r\n// to request that the std::jthread stop executing.\r\n#include <chrono>\r\n#include <fmt/format.h>\r\n#include <iostream>\r\n#include <mutex>\r\n#include <random>\r\n#include <sstream>\r\n#include <stop_token>\r\n#include <string>\r\n#include <string_view>\r\n#include <thread>\r\n\r\n// get current thread's ID as a string\r\nstd::string id() {\r\n    std::ostringstream out;\r\n    out << std::this_thread::get_id();\r\n    return out.str();\r\n}\r\n\r\nint main() {\r\n   // each printTask iterates until a stop is requested by another thread\r\n   auto printTask{\r\n      [&](std::stop_token token, std::string name) {\r\n         // set up random-number generation \r\n         std::random_device rd;\r\n         std::default_random_engine engine{rd()};\r\n         std::uniform_int_distribution ints{500, 1000};\r\n\r\n         // register a function to call when a stop is requested \r\n         std::stop_callback callback(token, [&]() {\r\n            std::cout << fmt::format(\r\n               \"{} told to stop by thread with id {}\\n\", name, id());\r\n         });\r\n\r\n         while (!token.stop_requested()) { // run until stop requested\r\n            auto sleepTime{std::chrono::milliseconds{ints(engine)}};\r\n\r\n            std::cout << fmt::format(\r\n               \"{} (id: {}) going to sleep for {} ms\\n\",\r\n               name, id(), sleepTime.count());\r\n\r\n            // put thread to sleep for sleepTime milliseconds \r\n            std::this_thread::sleep_for(sleepTime);\r\n\r\n            // show that task woke up \r\n            std::cout << fmt::format(\"{} working.\\n\", name);\r\n         }\r\n\r\n         std::cout << fmt::format(\"{} terminating.\\n\", name);\r\n      }\r\n   };\r\n\r\n   std::cout << fmt::format(\"MAIN (id: {}) STARTING TASKS\\n\", id());\r\n\r\n   // create two jthreads that each call printTask with a string argument\r\n   std::jthread task1{printTask, \"Task 1\"};\r\n   std::jthread task2{printTask, \"Task 2\"};\r\n\r\n   // put main thread to sleep for 2 seconds \r\n   std::cout << \"\\nMAIN GOING TO SLEEP FOR 2 SECONDS\\n\\n\";\r\n   std::this_thread::sleep_for(std::chrono::seconds{2});\r\n\r\n   std::cout << fmt::format(\"\\nMAIN (id: {}) ENDS\\n\\n\", id()); \r\n}\r\n\r\n\r\n\r\n/************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and             *\r\n * Pearson Education, Inc. All Rights Reserved.                         *\r\n *                                                                      *\r\n * DISCLAIMER: The authors and publisher of this book have used their   *\r\n * best efforts in preparing the book. These efforts include the        *\r\n * development, research, and testing of the theories and programs      *\r\n * to determine their effectiveness. The authors and publisher make     *\r\n * no warranty of any kind, expressed or implied, with regard to these  *\r\n * programs or to the documentation contained in these books. The       *\r\n * authors and publisher shall not be liable in any event for           *\r\n * incidental or consequential damages in connection with, or arising   *\r\n * out of, the furnishing, performance, or use of these programs.       *\r\n ***********************************************************************/\r\n\r\n"
  },
  {
    "path": "examples/lesson17/fig17_12/async.cpp",
    "content": "// Fig. 17.12: async.cpp\r\n// Prime-factorization tasks performed in separate threads\r\n#include <cmath>\r\n#include <format>\r\n#include <future> // std::async\r\n#include <iostream>\r\n#include <sstream>\r\n#include <string>\r\n#include <tuple>\r\n#include <vector>\r\n\r\n// get current thread's ID as a string\r\nstd::string id() {\r\n   std::ostringstream out;\r\n   out << std::this_thread::get_id();\r\n   return out.str();\r\n}\r\n\r\n// type alias for vector of factor/count pairs\r\nusing Factors = std::vector<std::pair<long long, int>>;\r\n\r\n// type alias for a tuple containing a task name,   \r\n// a number, whether the number is prime and its factors \r\nusing FactorResults = std::tuple<std::string, long long, bool, Factors>;\r\n\r\n// performs prime factorization   \r\nFactorResults getFactors(std::string name, long long number) {\r\n   std::cout << std::format(\r\n      \"{}: Thread {} executing getFactors for {}\\n\", name, id(), number);\r\n\r\n   long long originalNumber{number}; // copy to place in FactorResults\r\n   Factors factors; // vector of factor/count pairs\r\n\r\n   // lambda that divides number by a factor and stores factor/count\r\n   auto factorCount{\r\n      [&](int factor) {\r\n         int count{0}; // how many times number is divisible by factor\r\n\r\n         // count how many times number is divisible by factor\r\n         while (number % factor == 0) {\r\n            ++count;\r\n            number /= factor;\r\n         }\r\n\r\n         // store pair containing the factor and its count\r\n         if (count > 0) {\r\n            factors.push_back({factor, count});\r\n         }\r\n      }\r\n   };\r\n\r\n   factorCount(2); // count how many times number is divisible by 2\r\n\r\n   // number is now odd; store each factor and its count \r\n   for (int i{3}; i <= std::sqrt(number); i += 2) {\r\n      factorCount(i); // count how many times number is divisible by i\r\n   }\r\n\r\n   // add last prime factor\r\n   if (number > 2) {\r\n      factors.push_back({number, 1});\r\n   }\r\n\r\n   bool isPrime{factors.size() == 1 && get<int>(factors[0]) == 1};\r\n\r\n   // initialize the FactorResults object returned by getFactors\r\n   return {name, originalNumber, isPrime, factors};\r\n}\r\n\r\n// multiply the factors and confirm they reproduce number\r\nvoid proveFactors(long long number, const Factors& factors) {\r\n   long long proof{1};\r\n\r\n   // for each factor/count pair, unpack it then multiply proof \r\n   // by factor the number of times specified by count\r\n   for (const auto& [factor, count] : factors) {\r\n      for (int i{0}; i < count; ++i) {\r\n         proof *= factor;\r\n      }\r\n   }\r\n\r\n   // confirm proof and number are equal\r\n   if (proof == number) {\r\n      std::cout << std::format(\r\n         \"\\nProduct of factors matches original value ({})\\n\", proof);\r\n   }\r\n   else {\r\n      std::cout << std::format(\"\\n{} != {}\\n\", proof, number);\r\n   }\r\n}\r\n\r\n// show a task's FactorResults\r\nvoid displayResults(const FactorResults& results) {\r\n   // unpack results into name (std::string), number (long long), \r\n   // isPrime (bool) and factors (Factors) \r\n   const auto& [name, number, isPrime, factors] {results};\r\n\r\n   std::cout << std::format(\"\\n{} results:\\n\", name);\r\n\r\n   // display whether value is prime\r\n   if (isPrime) {\r\n      std::cout << std::format(\"{} is prime\\n\", number);\r\n   }\r\n   else { // display prime factors\r\n      std::cout << std::format(\"{}'s prime factors:\\n\\n\", number);\r\n      std::cout << std::format(\"{:<12}{:<8}\\n\", \"Factor\", \"Count\");\r\n\r\n      for (const auto& [factor, count] : factors) {\r\n         std::cout << std::format(\"{:<12}{:<8}\\n\", factor, count);\r\n      }\r\n   }\r\n\r\n   // if not prime, prove that factors produce the original number \r\n   if (!isPrime) {\r\n      proveFactors(number, factors);\r\n   }\r\n}\r\n\r\nint main() {\r\n   std::cout << \"MAIN LAUNCHING TASKS\\n\";\r\n   auto future1{std::async(std::launch::async,\r\n      getFactors, \"Task 1\", 1016669006116682993)}; // not prime\r\n   auto future2{std::async(std::launch::async,\r\n      getFactors, \"Task 2\", 1000000000000000003)}; // prime\r\n\r\n   std::cout << \"\\nWAITING FOR TASK RESULTS\\n\";\r\n\r\n   // wait for results from each task, then display the results    \r\n   displayResults(future1.get());\r\n   displayResults(future2.get());\r\n\r\n   std::cout << \"\\nMAIN ENDS\\n\";\r\n}\r\n\r\n\r\n \r\n\r\n/************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and             *\r\n * Pearson Education, Inc. All Rights Reserved.                         *\r\n *                                                                      *\r\n * DISCLAIMER: The authors and publisher of this book have used their   *\r\n * best efforts in preparing the book. These efforts include the        *\r\n * development, research, and testing of the theories and programs      *\r\n * to determine their effectiveness. The authors and publisher make     *\r\n * no warranty of any kind, expressed or implied, with regard to these  *\r\n * programs or to the documentation contained in these books. The       *\r\n * authors and publisher shall not be liable in any event for           *\r\n * incidental or consequential damages in connection with, or arising   *\r\n * out of, the furnishing, performance, or use of these programs.       *\r\n ***********************************************************************/\r\n\r\n"
  },
  {
    "path": "examples/lesson17/fig17_13/atomic.cpp",
    "content": "// Fig. 17.13: atomic.cpp\r\n// Incrementing integers from concurrent threads \r\n// with and without atomics.\r\n#include <atomic>\r\n#include <format>\r\n#include <iostream>\r\n#include <thread>\r\n\r\nint main() {\r\n   int count1{0};\r\n   std::atomic<int> atomicCount{0};\r\n   int count2{0};\r\n   std::atomic_ref<int> atomicRefCount{count2};\r\n\r\n   {\r\n      std::cout << \"Two concurrent threads incrementing int count1, \"\r\n         << \"atomicCount and atomicRefCount\\n\\n\";\r\n\r\n      // lambda to increment counters \r\n      auto incrementer{\r\n         [&]() {\r\n            for (int i{0}; i < 1000; ++i) {\r\n               ++count1; // no synchronization\r\n               ++atomicCount; // ++ is an atomic operation\r\n               ++atomicRefCount; // ++ is an atomic operation\r\n               std::this_thread::yield(); // force thread to give up CPU\r\n            }\r\n         }\r\n      };\r\n\r\n      std::jthread t1{incrementer};\r\n      std::jthread t2{incrementer};\r\n   }\r\n\r\n   std::cout << std::format(\"Final count1: {}\\n\", count1);\r\n   std::cout << std::format(\"Final atomicCount: {}\\n\", \r\n      atomicCount.load());\r\n   std::cout << std::format(\"Final count2: {}\\n\", count2);\r\n}\r\n\r\n \r\n\r\n/************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and             *\r\n * Pearson Education, Inc. All Rights Reserved.                         *\r\n *                                                                      *\r\n * DISCLAIMER: The authors and publisher of this book have used their   *\r\n * best efforts in preparing the book. These efforts include the        *\r\n * development, research, and testing of the theories and programs      *\r\n * to determine their effectiveness. The authors and publisher make     *\r\n * no warranty of any kind, expressed or implied, with regard to these  *\r\n * programs or to the documentation contained in these books. The       *\r\n * authors and publisher shall not be liable in any event for           *\r\n * incidental or consequential damages in connection with, or arising   *\r\n * out of, the furnishing, performance, or use of these programs.       *\r\n ***********************************************************************/\r\n\r\n/************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and             *\r\n * Pearson Education, Inc. All Rights Reserved.                         *\r\n *                                                                      *\r\n * DISCLAIMER: The authors and publisher of this book have used their   *\r\n * best efforts in preparing the book. These efforts include the        *\r\n * development, research, and testing of the theories and programs      *\r\n * to determine their effectiveness. The authors and publisher make     *\r\n * no warranty of any kind, expressed or implied, with regard to these  *\r\n * programs or to the documentation contained in these books. The       *\r\n * authors and publisher shall not be liable in any event for           *\r\n * incidental or consequential damages in connection with, or arising   *\r\n * out of, the furnishing, performance, or use of these programs.       *\r\n ***********************************************************************/\r\n"
  },
  {
    "path": "examples/lesson17/fig17_14/LatchDemo.cpp",
    "content": "// Fig. 17.14: LatchDemo.cpp\r\n// Coordinate threads with a std::latch object.\r\n#include <chrono>\r\n#include <format>\r\n#include <iostream>\r\n#include <latch>\r\n#include <random>\r\n#include <string_view>\r\n#include <thread>\r\n#include <vector>\r\n\r\nint main() {\r\n   // set up random-number generation \r\n   std::random_device rd;\r\n   std::default_random_engine engine{rd()};\r\n   std::uniform_int_distribution ints{2000, 3000};\r\n\r\n   // latch that 3 threads must signal before the main thread continues\r\n   std::latch mainLatch{3};\r\n\r\n   // lambda representing the task to execute\r\n   auto task{\r\n      [&](std::string_view name, std::chrono::milliseconds workTime) {\r\n         std::cout << std::format(\"Proceeding with {} work for {} ms.\\n\",\r\n            name, workTime.count());\r\n\r\n         // simulate work by sleeping \r\n         std::this_thread::sleep_for(workTime);\r\n\r\n         // show that task arrived at mainLatch\r\n         std::cout << std::format(\"{} done; signals mainLatch.\\n\", name);\r\n         mainLatch.count_down();\r\n      }\r\n   };\r\n\r\n   std::vector<std::jthread> threads; // stores the threads\r\n   std::cout << \"Main starting three jthreads.\\n\";\r\n\r\n   // start three jthreads\r\n   for (int i{1}; i < 4; ++i) {\r\n      // create jthread that calls task lambda, \r\n      // passing a task name and work time\r\n      threads.push_back(std::jthread{task,\r\n         std::format(\"Task {}\", i),\r\n         std::chrono::milliseconds{ints(engine)}});\r\n   }\r\n\r\n   std::cout << \"\\nMain waiting for jthreads to reach the latch.\\n\\n\";\r\n   mainLatch.wait();\r\n\r\n   std::cout << \"\\nAll jthreads reached the latch. Main working.\\n\";\r\n   std::cout << \"Showing that mainLatch is permanently open.\\n\";\r\n   mainLatch.wait(); // latch is already open \r\n   std::cout << \"mainLatch is already open. Main continues.\\n\";\r\n}\r\n\r\n\r\n\r\n/************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and             *\r\n * Pearson Education, Inc. All Rights Reserved.                         *\r\n *                                                                      *\r\n * DISCLAIMER: The authors and publisher of this book have used their   *\r\n * best efforts in preparing the book. These efforts include the        *\r\n * development, research, and testing of the theories and programs      *\r\n * to determine their effectiveness. The authors and publisher make     *\r\n * no warranty of any kind, expressed or implied, with regard to these  *\r\n * programs or to the documentation contained in these books. The       *\r\n * authors and publisher shall not be liable in any event for           *\r\n * incidental or consequential damages in connection with, or arising   *\r\n * out of, the furnishing, performance, or use of these programs.       *\r\n ***********************************************************************/\r\n\r\n"
  },
  {
    "path": "examples/lesson17/fig17_15/BarrierDemo.cpp",
    "content": "// Fig. 17.15: BarrierDemo.cpp\r\n// Coordinating threads with a std::barrier object.\r\n#include <barrier>\r\n#include <chrono>\r\n#include <format>\r\n#include <iostream>\r\n#include <random>\r\n#include <string_view>\r\n#include <thread>\r\n\r\nint main() {\r\n   // simulate moving car into painting position\r\n   auto moveCarIntoPosition{\r\n      []() {\r\n         std::cout << \"Moving next car into painting position.\\n\";\r\n         std::this_thread::sleep_for(std::chrono::seconds(1)); \r\n         std::cout << \"Car ready for painting.\\n\\n\";\r\n      }\r\n   };\r\n\r\n   int carsToPaint{3}; \r\n\r\n   // stop_source used to notify robots assembly line is shutting down\r\n   std::stop_source assemblyLineStopSource;\r\n\r\n   // stop_token used by paintingRobotTask to determine when to shut down\r\n   std::stop_token stopToken{assemblyLineStopSource.get_token()};\r\n\r\n   // assembly line waits for two painting robots to reach this barrier \r\n   std::barrier paintingDone{2, \r\n      [&]() noexcept { // lambda called when robots finish\r\n         static int count{0}; // # of cars that have been painted\r\n         std::cout << \"Painting robots completed tasks\\n\\n\";\r\n         \r\n         // check whether it's time to shut down the assembly line\r\n         if (++count == carsToPaint) {\r\n            std::cout << \"Shutting down assembly line\\n\\n\";\r\n            assemblyLineStopSource.request_stop(); \r\n         }\r\n         else { \r\n            moveCarIntoPosition();\r\n         }\r\n      }\r\n   };\r\n\r\n   // lambda that simulates painting work\r\n   auto paintingRobotTask{\r\n      [&](std::string_view name) {\r\n         // set up random-number generation \r\n         std::random_device rd;\r\n         std::default_random_engine engine{rd()};\r\n         std::uniform_int_distribution ints{2500, 5000};\r\n\r\n         // check whether the assembly line is shutting down\r\n         // and, if not, do the painting work\r\n         while (!stopToken.stop_requested()) {\r\n            auto workTime{std::chrono::milliseconds{ints(engine)}};\r\n\r\n            std::cout << std::format(\"{} painting for {} ms\\n\",\r\n               name, workTime.count());\r\n            std::this_thread::sleep_for(workTime); // simulate work\r\n\r\n            // show that task woke up and arrived at continuationBarrier\r\n            std::cout << std::format(\r\n               \"{} done painting. Waiting for next car.\\n\", name);\r\n\r\n            // decrement paintingDone barrier's counter and\r\n            // wait for other painting robots to arrive here\r\n            paintingDone.arrive_and_wait(); \r\n         }\r\n\r\n         std::cout << std::format(\"{} shut down.\\n\", name);\r\n      }\r\n   };\r\n\r\n   moveCarIntoPosition(); // move the first car into position\r\n\r\n   // start up two painting robots\r\n   std::cout << \"Starting robots.\\n\\n\";\r\n   std::jthread leftSideRobot{paintingRobotTask, \"Left side robot\"};\r\n   std::jthread rightSideRobot{paintingRobotTask, \"Right side robot\"};\r\n}\r\n\r\n\r\n/************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and             *\r\n * Pearson Education, Inc. All Rights Reserved.                         *\r\n *                                                                      *\r\n * DISCLAIMER: The authors and publisher of this book have used their   *\r\n * best efforts in preparing the book. These efforts include the        *\r\n * development, research, and testing of the theories and programs      *\r\n * to determine their effectiveness. The authors and publisher make     *\r\n * no warranty of any kind, expressed or implied, with regard to these  *\r\n * programs or to the documentation contained in these books. The       *\r\n * authors and publisher shall not be liable in any event for           *\r\n * incidental or consequential damages in connection with, or arising   *\r\n * out of, the furnishing, performance, or use of these programs.       *\r\n ***********************************************************************/\r\n\r\n"
  },
  {
    "path": "examples/lesson17/fig17_16/SharedBufferTest.cpp",
    "content": "// Fig. 17.8: SharedBufferTest.cpp\r\n// Concurrent threads correctly manipulating a synchronized buffer.\r\n#include <chrono>\r\n#include <format>\r\n#include <iostream>\r\n#include <mutex>\r\n#include <random>\r\n#include <thread>\r\n#include \"SynchronizedBuffer.h\"\r\n\r\nint main() {\r\n   // set up random-number generation \r\n   std::random_device rd;\r\n   std::default_random_engine engine{rd()};\r\n   std::uniform_int_distribution ints{0, 3000};\r\n   std::mutex intsMutex;\r\n\r\n   // lambda for synchronized random sleep time generation\r\n   auto getSleepTime{\r\n      [&]() {\r\n         std::lock_guard lock{intsMutex};\r\n         return std::chrono::milliseconds{ints(engine)};\r\n      }\r\n   };\r\n\r\n   // create SynchronizedBuffer to store ints       \r\n   SynchronizedBuffer buffer;\r\n\r\n   // lambda expression that produces the values 1-10 and sums them \r\n   auto produce{\r\n      [&buffer, &getSleepTime]() {\r\n         int sum{0};\r\n\r\n         for (int count{1}; count <= 10; ++count) {\r\n            // get random sleep time then sleep\r\n            std::this_thread::sleep_for(getSleepTime());\r\n\r\n            buffer.put(count); // set value in buffer\r\n            sum += count; // add count to sum of values produced\r\n         }\r\n\r\n         std::cout << \"Producer done producing\\nTerminating Producer\\n\";\r\n      }\r\n   };\r\n\r\n   // lambda expression that consumes the values 1-10 and sums them\r\n   auto consume{\r\n      [&buffer, &getSleepTime]() {\r\n         int sum{0};\r\n\r\n         for (int count{1}; count <= 10; ++count) {\r\n            // get random sleep time then sleep\r\n            std::this_thread::sleep_for(getSleepTime());\r\n\r\n            sum += buffer.get(); // get buffer value and add to sum\r\n         }\r\n\r\n         std::cout << std::format(\"\\n{} {}\\n{}\\n\",\r\n            \"Consumer read values totaling\", sum, \"Terminating Consumer\");\r\n      }\r\n   };\r\n\r\n   std::cout << std::format(\"{:<40}{}\\t\\t{}\\n{:<40}{}\\t\\t{}\\n\\n\",\r\n      \"Operation\", \"Buffer\", \"Occupied\",\r\n      \"---------\", \"------\", \"--------\");\r\n\r\n   std::jthread producer{produce}; // start producer thread\r\n   std::jthread consumer{consume}; // start consumer thread \r\n}\r\n\r\n/************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and             *\r\n * Pearson Education, Inc. All Rights Reserved.                         *\r\n *                                                                      *\r\n * DISCLAIMER: The authors and publisher of this book have used their   *\r\n * best efforts in preparing the book. These efforts include the        *\r\n * development, research, and testing of the theories and programs      *\r\n * to determine their effectiveness. The authors and publisher make     *\r\n * no warranty of any kind, expressed or implied, with regard to these  *\r\n * programs or to the documentation contained in these books. The       *\r\n * authors and publisher shall not be liable in any event for           *\r\n * incidental or consequential damages in connection with, or arising   *\r\n * out of, the furnishing, performance, or use of these programs.       *\r\n ***********************************************************************/\r\n\r\n"
  },
  {
    "path": "examples/lesson17/fig17_16/SynchronizedBuffer.h",
    "content": "// Fig. 17.16: SynchronizedBuffer.h \r\n// SynchronizedBuffer using two binary_semaphores to  \r\n// maintain synchronized access to a shared mutable int.\r\n#pragma once\r\n#include <format> \r\n#include <iostream>\r\n#include <semaphore>\r\n#include <string>\r\n\r\nusing namespace std::string_literals;\r\n\r\nclass SynchronizedBuffer {\r\npublic:\r\n   // place value into m_buffer\r\n   void put(int value) {\r\n      // acquire m_produce semaphore to be able to write to m_buffer\r\n      m_produce.acquire(); // blocks if it's not the producer's turn \r\n\r\n      m_buffer = value; // write to m_buffer\r\n      m_occupied = true;\r\n\r\n      std::cout << std::format(\"{:<40}{}\\t\\t{}\\n\",\r\n         \"Producer writes \"s + std::to_string(value),\r\n         m_buffer, m_occupied);\r\n\r\n      m_consume.release(); // allow consumer to read\r\n   }\r\n\r\n   // return value from m_buffer\r\n   int get() {\r\n      int value; // will store the value returned by get\r\n\r\n      // acquire m_consume semaphore to be able to read from m_buffer\r\n      m_consume.acquire(); // blocks if it's not the consumer's turn\r\n\r\n      value = m_buffer; // read from m_buffer\r\n      m_occupied = false;\r\n\r\n      std::cout << std::format(\"{:<40}{}\\t\\t{}\\n\",\r\n         \"Consumer reads \"s + std::to_string(m_buffer),\r\n         m_buffer, m_occupied);\r\n\r\n      m_produce.release(); // allow producer to write\r\n      return value;\r\n   }\r\nprivate:\r\n   std::binary_semaphore m_produce{1}; // producer can produce\r\n   std::binary_semaphore m_consume{0}; // consumer can't consume\r\n   bool m_occupied{false};\r\n   int m_buffer{-1}; // shared by producer and consumer threads\r\n};\r\n\r\n\r\n\r\n/************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and             *\r\n * Pearson Education, Inc. All Rights Reserved.                         *\r\n *                                                                      *\r\n * DISCLAIMER: The authors and publisher of this book have used their   *\r\n * best efforts in preparing the book. These efforts include the        *\r\n * development, research, and testing of the theories and programs      *\r\n * to determine their effectiveness. The authors and publisher make     *\r\n * no warranty of any kind, expressed or implied, with regard to these  *\r\n * programs or to the documentation contained in these books. The       *\r\n * authors and publisher shall not be liable in any event for           *\r\n * incidental or consequential damages in connection with, or arising   *\r\n * out of, the furnishing, performance, or use of these programs.       *\r\n ***********************************************************************/\r\n\r\n"
  },
  {
    "path": "examples/lesson18/fig18_01.cpp",
    "content": "// fig18_01.cpp\r\n// Creating a generator coroutine with co_yield.\r\n#include <fmt/format.h>\r\n#include <iostream>\r\n#include <sstream>\r\n#include <thread> \r\n#include <tl/generator.hpp>\r\n\r\n// get current thread's ID as a string\r\nstd::string id() {\r\n   std::ostringstream out;\r\n   out << std::this_thread::get_id();\r\n   return out.str();\r\n}\r\n\r\n// coroutine that repeatedly yields the next Fibonacci value in sequence\r\ntl::generator<int> fibonacciGenerator(int limit) {\r\n   std::cout << fmt::format(\r\n      \"Thread {}: fibonacciGenerator started executing\\n\", id());\r\n\r\n   int value1{0}; // Fibonacci(0)\r\n   int value2{1}; // Fibonacci(1)\r\n\r\n   for (int i{0}; i < limit; ++i) {\r\n      co_yield value1; // yield current value of value1\r\n\r\n      // update value1 and value2 for next iteration\r\n      int temp{value1 + value2};\r\n      value1 = value2;\r\n      value2 = temp;\r\n   }\r\n\r\n   std::cout << fmt::format(\r\n      \"Thread {}: fibonacciGenerator finished executing\\n\", id());\r\n}\r\n\r\nint main() {\r\n   std::cout << fmt::format(\"Thread {}: main begins\\n\", id());\r\n\r\n   // display first 10 Fibonacci values \r\n   for (int i{0}; auto value : fibonacciGenerator(10)) {\r\n      std::cout << fmt::format(\"Fibonacci({}) is {}\\n\", i++, value);\r\n   }  \r\n\r\n   std::cout << fmt::format(\"Thread {}: main ends\\n\", id());\r\n}\r\n\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson18/fig18_02.cpp",
    "content": "// fig18_02.cpp\r\n// Setting up the concurrencpp::runtime and scheduling tasks with it.\r\n#include <chrono>\r\n#include <concurrencpp/concurrencpp.h>\r\n#include <fmt/format.h>\r\n#include <iostream>\r\n#include <random>\r\n#include <sstream>\r\n#include <thread>\r\n#include <vector>\r\n\r\n// get current thread's ID as a string\r\nstd::string id() {\r\n    std::ostringstream out;\r\n    out << std::this_thread::get_id();\r\n    return out.str();\r\n}\r\n\r\n// Function printTask sleeps for a specified period in milliseconds. \r\n// When it continues executing, it prints its name and completes.\r\nvoid printTask(std::string name, std::chrono::milliseconds sleep) {\r\n   std::cout << fmt::format(\r\n      \"{} (thread ID: {}) going to sleep for {} ms\\n\",\r\n      name, id(), sleep.count());\r\n\r\n   // put the calling thread to sleep for sleep milliseconds \r\n   std::this_thread::sleep_for(sleep);\r\n\r\n   std::cout << fmt::format(\"{} (thread ID: {}) done sleeping\\n\",\r\n      name, id());\r\n}\r\n\r\nint main() {\r\n   // set up the concurrencpp runtime for scheduling tasks to execute\r\n   concurrencpp::runtime runtime;\r\n\r\n   std::cout << fmt::format(\"main's thread ID: {}\\n\\n\", id());\r\n\r\n   // set up random number generation for random sleep times\r\n   std::random_device rd;\r\n   std::default_random_engine engine{rd()};\r\n   std::uniform_int_distribution ints{0, 5000};\r\n\r\n   // stores the tasks so we can wait for them to complete later;\r\n   // concurrencpp::result<void> indicates that each task returns void\r\n   std::vector<concurrencpp::result<void>> results;\r\n\r\n   std::cout << \"STARTING THREE CONCURRENCPP TASKS\\n\";\r\n\r\n   // schedule three tasks\r\n   for (int i{1}; i < 4; ++i) {\r\n      std::chrono::milliseconds sleepTime{ints(engine)};\r\n      std::string name{fmt::format(\"Task {}\", i)};\r\n\r\n      // use a concurrencpp thread_pool_executor to schedule a call\r\n      // to printTask with name and sleepTime as its arguments\r\n      results.push_back(runtime.thread_pool_executor()->submit(\r\n         printTask, name, sleepTime));\r\n   }\r\n\r\n   std::cout << \"\\nALL TASKS STARTED\\n\";\r\n   std::cout << \"\\nWAITING FOR TASKS TO COMPLETE\\n\";\r\n  \r\n   // wait for each task to complete\r\n   for (auto& result : results) {\r\n      result.get(); // wait for each task to return its result\r\n   } \r\n\r\n   std::cout << fmt::format(\"main's thread ID: {}\\nMAIN ENDS\\n\", id());\r\n}\r\n\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson18/fig18_03.cpp",
    "content": "// fig18_03.cpp\r\n// Implementing a coroutine with co_await and co_return.\r\n#include <concurrencpp/concurrencpp.h>\r\n#include <fmt/format.h>\r\n#include <iostream>\r\n#include <memory> // for shared_ptr\r\n#include <random>\r\n#include <sstream>\r\n#include <string>\r\n#include <thread>\r\n#include <vector>\r\n\r\n// get current thread's ID as a string\r\nstd::string id() {\r\n   std::ostringstream out;\r\n   out << std::this_thread::get_id();\r\n   return out.str();\r\n}\r\n\r\n// coroutine that sorts a vector<int> using two tasks \r\nconcurrencpp::result<void> sortCoroutine(\r\n   std::shared_ptr<concurrencpp::thread_pool_executor> executor,\r\n   std::vector<int>& values) {\r\n\r\n   std::cout << fmt::format(\"Thread {}: sortCoroutine started\\n\\n\", id());\r\n\r\n   // lambda that sorts a portion of a vector\r\n   auto sortTask{\r\n      [&](auto begin, auto end) {\r\n         std::cout << fmt::format(\r\n            \"Thread {}: Sorting {} elements\\n\", id(), end - begin);\r\n         std::sort(begin, end); \r\n         std::cout << fmt::format(\"Thread {}: Finished sorting\\n\", id());\r\n      }\r\n   };\r\n\r\n   // stores task results\r\n   std::vector<concurrencpp::result<void>> results;\r\n\r\n   size_t middle{values.size() / 2}; // middle element index\r\n\r\n   std::cout << fmt::format(\r\n      \"Thread {}: sortCoroutine starting first half sortTask\\n\", id());\r\n\r\n   // use a concurrencpp thread_pool_executor to schedule \r\n   // a sortTask call that sorts the first half of values\r\n   results.push_back(\r\n      executor->submit(\r\n         [&]() {sortTask(values.begin(), values.begin() + middle);}\r\n      )\r\n   );\r\n\r\n   std::cout << fmt::format(\r\n      \"Thread {}: sortCoroutine starting second half sortTask\\n\", id());\r\n\r\n   // use a concurrencpp thread_pool_executor to schedule \r\n   // a sortTask call that sorts the second half of values\r\n   results.push_back(\r\n      executor->submit(\r\n         [&]() {sortTask(values.begin() + middle, values.end());}\r\n      )\r\n   );\r\n\r\n   // suspend coroutine while waiting for all sortTasks to complete \r\n   std::cout << fmt::format(\"\\nThread {}: {}\\n\", id(),\r\n      \"sortCoroutine co_awaiting sortTask completion\");\r\n   co_await concurrencpp::when_all(\r\n      executor, results.begin(), results.end());\r\n\r\n   // merge the two sorted sub-vectors\r\n   std::cout << fmt::format(\r\n      \"\\nThread {}: sortCoroutine merging results\\n\", id());\r\n   std::inplace_merge(\r\n      values.begin(), values.begin() + middle, values.end());\r\n\r\n   std::cout << fmt::format(\"Thread {}: sortCoroutine done\\n\", id());\r\n   co_return; // terminate coroutine and resume caller\r\n}\r\n\r\nint main() {\r\n   concurrencpp::runtime runtime; // set up concurrencpp runtime\r\n   auto executor{runtime.thread_pool_executor()}; // get the executor\r\n\r\n   // set up random number generation \r\n   std::random_device rd;\r\n   std::default_random_engine engine{rd()};\r\n   std::uniform_int_distribution ints;\r\n\r\n   std::cout << fmt::format(\r\n      \"Thread {}: main creating vector of random ints\\n\", id());\r\n   std::vector<int> values(100'000'000);\r\n   std::ranges::generate(values, [&]() {return ints(engine);});\r\n\r\n   std::cout << fmt::format(\r\n      \"Thread {}: main starting sortCoroutine\\n\", id());\r\n   auto result{sortCoroutine(executor, values)};\r\n\r\n   std::cout << fmt::format(\"\\nThread {}: {}\\n\", id(),\r\n     \"main resumed. Waiting for sortCoroutine to complete.\");\r\n   result.get(); // wait for sortCoroutine to complete\r\n\r\n   std::cout << fmt::format(\r\n      \"\\nThread {}: main confirming that vector is sorted\\n\", id());\r\n   bool sorted{std::ranges::is_sorted(values)};\r\n   std::cout << fmt::format(\"Thread {}: values is{} sorted\\n\", \r\n      id(), sorted ? \"\" : \" not\");\r\n}\r\n\r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2021 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson18/vcpkg.json",
    "content": "{\n  \"name\": \"cpp20-test\",\n  \"version-string\": \"1.0.0\",\n  \"dependencies\": [\n    \"concurrencpp\"\n  ]\n}\n"
  },
  {
    "path": "examples/lesson19/fig19_01.cpp",
    "content": "// fig19_01.cpp\n// Printing the address stored in a char* variable.\n#include <iostream>\n\nint main() {\n   const char* const word{\"again\"};\n\n   // display the value of char* variable word, then display \n   // the value of word after a static_cast to void*\n   std::cout << \"Value of word is: \" << word \n      << \"\\nValue of static_cast<const void*>(word) is: \" \n      << static_cast<const void*>(word) << '\\n';\n} \n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_02.cpp",
    "content": "// fig19_02.cpp \n// get, put and eof member functions.\n#include <format>\n#include <iostream>\n\nint main() {\n   int character{0}; // use int, because char cannot represent EOF\n\n   // prompt user to enter line of text\n   std::cout << std::format(\"Before input, cin.eof(): {}\", std::cin.eof())\n      << \"\\nEnter a sentence followed by Enter and end-of-file:\\n\";\n\n   // use get to read each character; use put to display it\n   while ((character = std::cin.get()) != EOF) {\n      std::cout.put(character);\n   }\n\n   // display end-of-file character\n   std::cout << std::format(\"\\nEOF on this system is: {}\\n\", character)\n      << std::format(\"After EOF input, cin.eof(): {}\\n\", std::cin.eof());\n}\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_03.cpp",
    "content": "// fig19_03.cpp \n// Contrasting input of a string via cin and cin.get.\n#include <format>\n#include <iostream>\n\nint main() {\n   // create two char arrays, each with 80 elements\n   constexpr int size{80};\n   char buffer1[size]{}; \n   char buffer2[size]{};\n\n   // use cin to input characters into buffer1\n   std::cout << \"Enter a sentence:\\n\";\n   std::cin >> buffer1;\n\n   // display buffer1 contents\n   std::cout << std::format(\"\\nThe cin input was:\\n{}\\n\\n\", buffer1);\n \n   // use cin.get to input characters into buffer2\n   std::cin.get(buffer2, size);\n\n   // display buffer2 contents\n   std::cout << std::format(\"The cin.get input was:\\n{}\\n\", buffer2);\n} \n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_04.cpp",
    "content": "// fig19_04.cpp \n// Inputting characters using cin member function getline.\n#include <format>\n#include <iostream>\n\nint main() {\n   const int size{80};\n   char buffer[size]{}; // create array of 80 characters\n\n   // input characters in buffer via cin function getline\n   std::cout << \"Enter a sentence:\\n\";\n   std::cin.getline(buffer, size);\n\n   // display buffer contents\n   std::cout << std::format(\"\\nYou entered:\\n{}\\n\", buffer);\n} \n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_05.cpp",
    "content": "// fig19_05.cpp \n// Unformatted I/O using read, gcount and write.\n#include <iostream>\n\nint main() {\n   char buffer[80]{}; // create array of 80 characters\n\n   // use function read to input characters into buffer\n   std::cout << \"Enter a sentence:\\n\";\n   std::cin.read(buffer, 20);\n\n   // use functions write and gcount to display buffer characters\n   std::cout << \"\\nThe sentence entered was:\\n\";\n   std::cout.write(buffer, std::cin.gcount());\n   std::cout << '\\n';\n} \n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_06.cpp",
    "content": "// fig19_06.cpp \n// Using stream manipulators dec, oct, hex and setbase.\n#include <iomanip>\n#include <iostream>\n\nint main() {\n   int number{0};\n\n   std::cout << \"Enter a decimal number: \";\n   std::cin >> number; // input number\n\n   // use hex stream manipulator to show hexadecimal number\n   std::cout << number << \" in hexadecimal is: \"\n      << std::hex << number << \"\\n\";\n\n   // use oct stream manipulator to show octal number\n   std::cout << std::dec << number << \" in octal is: \"\n      << std::oct << number << \"\\n\";\n\n   // use setbase stream manipulator to show decimal number\n   std::cout << std::setbase(10) << number << \" in decimal is: \"\n      << number << \"\\n\";\n}\n\n\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_07.cpp",
    "content": "// fig19_07.cpp \n// Controlling precision of floating-point values.\n#include <iomanip>      \n#include <iostream>\n#include <cmath> \n\nint main() {\n   double root2{std::sqrt(2.0)}; // calculate square root of 2\n\n   std::cout << \"Square root of 2 with precisions 0-9.\\n\"\n      << \"Precision set by ostream member function precision:\\n\";\n   std::cout << std::fixed; // use fixed-point notation\n\n   // display square root using ostream function precision\n   for (int places{0}; places <= 9; ++places) {\n      std::cout.precision(places);\n      std::cout << root2 << \"\\n\";\n   } \n\n   std::cout << \"\\nPrecision set by stream manipulator setprecision:\\n\"; \n\n   // set precision for each digit, then display square root\n   for (int places{0}; places <= 9; ++places) {\n      std::cout << std::setprecision(places) << root2 << \"\\n\";\n   } \n} \n\n\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_08.cpp",
    "content": "// fig19_08.cpp \n// width member function of classes istream and ostream.\n#include <iostream>\n\nint main() {\n   int widthValue{4};\n   char sentence[10]{};\n\n   std::cout << \"Enter a sentence:\\n\";\n   std::cin.width(5); // input up to 4 characters from sentence\n\n   // set field width, then display characters based on that width \n   while (std::cin >> sentence) {\n      std::cout.width(widthValue++);\n      std::cout << sentence << \"\\n\";\n      std::cin.width(5); // input up to 4 more characters from sentence\n   } \n} \n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_09.cpp",
    "content": "// fig19_09.cpp\n// Creating and testing user-defined, nonparameterized \n// stream manipulators.\n#include <iostream>\n\n// bell manipulator (using escape sequence \\a)\nstd::ostream& bell(std::ostream& output) {             \n   return output << '\\a'; // issue system beep\n}\n\n// tab manipulator (using escape sequence \\t)\nstd::ostream& tab(std::ostream& output) {            \n   return output << '\\t'; // issue tab \n}\n\nint main() {\n   // use tab and bell manipulators\n   std::cout << \"Testing the tab manipulator:\\n\"\n      << 'a' << tab << 'b' << tab << 'c' << '\\n';\n\n   std::cout << \"Testing the bell manipulator\\n\" << bell;\n} \n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_10.cpp",
    "content": "// fig19_10.cpp \n// Displaying trailing zeros and decimal points in floating-point values.\n#include <iostream>\n\nint main() {\n   // display double values with default stream format\n   std::cout << \"Before using showpoint\"\n      << \"\\n9.9900 prints as: \" << 9.9900 \n      << \"\\n9.9000 prints as: \" << 9.9000 \n      << \"\\n9.0000 prints as: \" << 9.0000;\n\n   // display double value after showpoint\n   std::cout << std::showpoint\n      << \"\\n\\nAfter using showpoint\" \n      << \"\\n9.9900 prints as: \" << 9.9900 \n      << \"\\n9.9000 prints as: \" << 9.9000 \n      << \"\\n9.0000 prints as: \" << 9.0000 << '\\n';\n} \n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_11.cpp",
    "content": "// fig19_11.cpp \n// Left and right alignment with stream manipulators left and right.\n#include <iomanip>\n#include <iostream>\n\nint main() {\n   int x{12345};\n\n   // display x right aligned (default)\n   std::cout << \"Default is right aligned:\\n\\\"\"\n      << std::setw(10) << x << \"\\\"\";\n\n   // use left manipulator to display x left aligned\n   std::cout << \"\\n\\nUse left to left align x:\\n\\\"\"\n      << std::left << std::setw(10) << x << \"\\\"\";\n\n   // use right manipulator to display x right aligned\n   std::cout << \"\\n\\nUse right to right align x:\\n\\\"\"\n      << std::right << std::setw(10) << x << \"\\\"\\n\";\n}\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_12.cpp",
    "content": "// fig19_12.cpp \n// Printing an integer with internal spacing and plus sign.\n#include <iomanip>\n#include <iostream>\n\nint main() {\n   // display value with internal spacing and plus sign\n   std::cout << std::internal << std::showpos \n      << std::setw(10) << 123 << \"\\n\";\n}\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_13.cpp",
    "content": "// fig19_13.cpp \n// Using member function fill and stream manipulator setfill to change\n// the padding character for fields larger than the printed value.\n#include <iomanip>\n#include <iostream>\n\nint main() {\n   int x{10000};\n\n   // display x\n   std::cout << x << \" printed as int right and left aligned\\n\"\n      << \"and as hex with internal alignment.\\n\"\n      << \"Using the default pad character (space):\\n\";\n\n   // display x \n   std::cout << std::setw(10) << x << \"\\n\";\n\n   // display x with left alignment\n   std::cout << std::left << std::setw(10) << x << \"\\n\";\n\n   // display x with base as hex with internal alignment\n   std::cout << std::showbase << std::internal << std::setw(10) \n      << std::hex << x << \"\\n\\n\";\n\n   std::cout << \"Using various padding characters:\\n\";\n\n   // display x using padded characters (right alignment)\n   std::cout << std::right;\n   std::cout.fill('*');\n   std::cout << std::setw(10) << std::dec << x << \"\\n\";\n\n   // display x using padded characters (left alignment)\n   std::cout << std::left << std::setw(10) << std::setfill('%') \n      << x << \"\\n\";\n\n   // display x using padded characters (internal alignment)\n   std::cout << std::internal << std::setw(10) \n      << std::setfill('^') << std::hex << x << \"\\n\";\n} \n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_14.cpp",
    "content": "// fig19_14.cpp \n// Stream manipulator showbase.\n#include <iostream>\n\nint main() {\n   int x{100};\n\n   // use showbase to show number base\n   std::cout << \"Printing octal and hexadecimal values with showbase:\\n\" \n      << std::showbase;\n\n   std::cout << x << \"\\n\"; // print decimal value\n   std::cout << std::oct << x << \"\\n\"; // print octal value\n   std::cout << std::hex << x << \"\\n\"; // print hexadecimal value\n} \n\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_15.cpp",
    "content": "// fig19_15.cpp \n// Floating-point values displayed in system default,\n// scientific and fixed formats.\n#include <iostream>\n\nint main() {\n   double x{0.001234567};\n   double y{1.946e9};\n\n   // display x and y in default format\n   std::cout << \"Displayed in default format:\\n\" << x << '\\t' << y;\n\n   // display x and y in scientific format\n   std::cout << \"\\n\\nDisplayed in scientific format:\\n\"\n      << std::scientific << x << '\\t' << y;\n\n   // display x and y in fixed format\n   std::cout << \"\\n\\nDisplayed in fixed format:\\n\"\n      << std::fixed << x << '\\t' << y << \"\\n\";\n} \n\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_16.cpp",
    "content": "// fig19_16.cpp \n// Stream manipulator uppercase.\n#include <iostream>\n\nint main() {\n   std::cout << \"Printing uppercase letters in scientific\\n\"\n      << \"notation exponents and hexadecimal values:\\n\";\n\n   // use std::uppercase to display uppercase letters; use std::hex and \n   // std::showbase to display hexadecimal value and its base\n   std::cout << std::uppercase << 4.345e10 << \"\\n\" \n      << std::hex << std::showbase << 123456789 << \"\\n\";\n} \n\n\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_17.cpp",
    "content": "// fig19_17.cpp\n// Stream manipulators boolalpha and noboolalpha.\n#include <iostream>\n\nint main() {\n   bool booleanValue{true};\n\n   // display default true booleanValue\n   std::cout << \"booleanValue is \" << booleanValue;\n\n   // display booleanValue after using boolalpha\n   std::cout << \"\\nbooleanValue (after using boolalpha) is \"\n      << std::boolalpha << booleanValue;\n\n   std::cout << \"\\n\\nswitch booleanValue and use noboolalpha\\n\";\n   booleanValue = false; // change booleanValue\n   std::cout << std::noboolalpha; // use noboolalpha\n\n   // display default false booleanValue after using noboolalpha\n   std::cout << \"\\nbooleanValue is \" << booleanValue;\n\n   // display booleanValue after using boolalpha again\n   std::cout << \"\\nbooleanValue (after using boolalpha) is \"\n      << std::boolalpha << booleanValue << \"\\n\";\n} \n\n\n\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_18.cpp",
    "content": "// fig19_18.cpp \n// flags member function.\n#include <format>\n#include <iostream>\n\nint main() {\n   int integerValue{1000};\n   double doubleValue{0.0947628};\n\n   // display flags value, int and double values (original format)\n   std::cout << std::format(\"flags value: {}\\n\", std::cout.flags())\n      << \"int and double in original format:\\n\"\n      << integerValue << '\\t' << doubleValue << \"\\n\\n\";\n\n   // save original format, then change the format\n   auto originalFormat{std::cout.flags()};\n   std::cout << std::showbase << std::oct << std::scientific;\n\n   // display flags value, int and double values (new format)\n   std::cout << std::format(\"flags value: {}\\n\", std::cout.flags())\n      << \"int and double in new format:\\n\"\n      << integerValue << '\\t' << doubleValue << \"\\n\\n\";\n\n   std::cout.flags(originalFormat); // restore format\n\n   // display flags value, int and double values (original format)\n   std::cout << std::format(\"flags value: {}\\n\", std::cout.flags())\n      << \"int and double in original format:\\n\"\n      << integerValue << '\\t' << doubleValue << \"\\n\";\n}\n\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_19.cpp",
    "content": "// fig19_19.cpp \n// Testing error states.\n#include <iostream>\n\nint main() {\n   int integerValue{0};\n\n   // display results of cin functions\n   std::cout << std::boolalpha << \"Before a bad input operation:\"\n      << \"\\ncin.rdstate(): \" << std::cin.rdstate()\n      << \"\\n    cin.eof(): \" << std::cin.eof()\n      << \"\\n   cin.fail(): \" << std::cin.fail()\n      << \"\\n    cin.bad(): \" << std::cin.bad() \n      << \"\\n   cin.good(): \" << std::cin.good()\n      << \"\\n\\nExpects an integer, but enter a character: \";\n\n   std::cin >> integerValue; // enter character value\n\n   // display results of cin functions after bad input\n   std::cout << \"\\nAfter a bad input operation:\"\n      << \"\\ncin.rdstate(): \" << std::cin.rdstate()\n      << \"\\n    cin.eof(): \" << std::cin.eof() \n      << \"\\n   cin.fail(): \" << std::cin.fail()\n      << \"\\n    cin.bad(): \" << std::cin.bad()\n      << \"\\n   cin.good(): \" << std::cin.good();\n\n   std::cin.clear(); // clear stream\n\n   // display results of cin functions after clearing cin\n   std::cout << \"\\n\\nAfter cin.clear()\" \n      << \"\\ncin.fail(): \" << std::cin.fail()\n      << \"\\ncin.good(): \" << std::cin.good() << \"\\n\";\n} \n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_20.cpp",
    "content": "// fig19_20.cpp \n// C++20 text-formatting presentation types.\n#include <format>\n#include <iostream>\n\nint main() {\n   // floating-point presentation types\n   std::cout << \"Display 17.489 with default, .1 and .2 precisions:\\n\"\n      << std::format(\"f: {0:f}\\n.1f: {0:.1f}\\n.2f: {0:.2f}\\n\\n\", 17.489);\n\n   std::cout << \"Display 10000000000000000.0 with f, e, g and a\\n\"\n      << std::format(\"f: {0:f}\\ne: {0:e}\\ng: {0:g}\\na: {0:a}\\n\\n\", \n            10000000000000000.0);\n\n   // integer presentation types; # displays a base prefix\n   std::cout << \"Display 100 with d, #b, #o and #x:\\n\"\n      << std::format(\n            \"d: {0:d}\\n#b: {0:#b}\\n#o: {0:#o}\\n#x: {0:#x}\\n\\n\", 100);\n\n   // character presentation type\n   std::cout << \"Display 65 and 97 with c:\\n\"\n      << std::format(\"{:c} {:c}\\n\\n\", 65, 97);\n\n   // string presentation type\n   std::cout << \"Display \\\"hello\\\" with s:\\n\" \n      << std::format(\"{:s}\\n\", \"hello\");\n}\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_21.cpp",
    "content": "// fig19_21.cpp \n// C++20 text-formatting with field widths and alignment.\n#include <format>\n#include <iostream>\n\nint main() {\n   std::cout << \"Default alignment with field width 10:\\n\"\n      << std::format(\"[{:10d}]\\n[{:10f}]\\n[{:10}]\\n\\n\", 27, 3.5, \"hello\");\n   \n   std::cout << \"Specifying left or right alignment in a field:\\n\"\n      << std::format(\"[{:<15d}]\\n[{:<15f}]\\n[{:>15}]\\n\\n\", \n            27, 3.5, \"hello\");\n\n   std::cout << \"Centering text in a field:\\n\"\n      << std::format(\"[{:^7d}]\\n[{:^7.1f}]\\n[{:^7}]\\n\", 27, 3.5, \"hello\");\n}\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_22.cpp",
    "content": "// fig19_22.cpp \n// C++20 text-formatting numeric formatting options.\n#include <format>\n#include <iostream>\n\nint main() {\n   std::cout << \"Displaying signs and padding with leading 0s:\\n\"\n      << std::format(\"[{0:+10d}]\\n[{0:+010d}]\\n\\n\", 27);\n\n   std::cout << \"Displaying a space before a positive value:\\n\"\n      << std::format(\"{0:d}\\n{0: d}\\n{1: d}\\n\\n\", 27, -27);\n   \n   std::cout << \"Displaying a base indicator before a number:\\n\"\n      << std::format(\"{0:d}\\n{0:#b}\\n{0:#o}\\n{0:#x}\\n\", 100);\n}\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson19/fig19_23.cpp",
    "content": "// fig19_23.cpp \n// C++20 text-formatting field width and precision placeholders.\n#include <format>\n#include <iostream>\n\nint main() {\n   std::cout << \"Demonstrating field width and precision placeholders:\\n\";\n\n   double value{123.456};\n   int width{8};\n\n   for (int precision{0}; precision < 5; ++precision) {\n      std::cout << std::format(\"{:{}.{}f}\\n\", value, width, precision);\n   }\n}\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson20/fig20_01.cpp",
    "content": "// fig20_01.cpp\n// Demonstrating const_cast.\n#include <cctype> // contains prototype for function toupper\n#include <iostream>\n#include <string>\n\n// returns the larger of two strings\nconst std::string& maximum(\n   const std::string& first, const std::string& second) {\n   return (first > second ? first : second);\n}\n\nint main() {\n   std::string s1{\"hello\"}; // non-const string\n   std::string s2{\"goodbye\"}; // non-const string\n\n   // const_cast required to allow the const reference returned by \n   // maximum to be assigned to the std::string reference max\n   std::string& max{const_cast<std::string&>(maximum(s1, s2))};\n\n   std::cout << \"The larger string is: \" << max << \"\\n\";\n\n   for (char& character : max) {\n      character = std::toupper(character);\n   }\n\n   std::cout << \"The larger string capitalized is: \" << max << \"\\n\";\n}\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson20/fig20_02.cpp",
    "content": "// fig20_02.cpp\n// Demonstrating storage-class specifier mutable.\n#include <iostream>\n\n// class TestMutable definition\nclass TestMutable {\npublic:\n   TestMutable(int v = 0) : value{v} {}\n\n   int getValue() const {\n      return ++value; // increments value\n   }\nprivate:\n   mutable int value; // mutable member\n};\n\nint main() {\n   const TestMutable test{99};\n\n   std::cout << \"Initial value: \" << test.getValue()\n      << \"\\nModified value: \" << test.getValue() << \"\\n\";\n}\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson20/fig20_03.cpp",
    "content": "// fig20_03.cpp\n// Demonstrating namespaces.\n#include <fmt/format.h>\n#include <iostream>\n\nint integer1{98}; // global variable\n\n// create namespace Example                           \nnamespace Example {\n   // declare two constants and one variable          \n   const double pi{3.14159};\n   const double e{2.71828};\n   int integer1{8};\n\n   void printValues(); // prototype                   \n\n   // nested namespace                                \n   namespace Inner {\n      // define enumeration                           \n      enum Years { fiscal1 = 2020, fiscal2, fiscal3 };\n   }\n}\n\n// create unnamed namespace                           \nnamespace {\n   double doubleInUnnamed{88.22}; // declare variable\n}\n\nint main() {\n   // output value doubleInUnnamed of unnamed namespace\n   std::cout << fmt::format(\"doubleInUnnamed = {}\\n\", doubleInUnnamed);\n\n   // output global variable\n   std::cout << fmt::format(\"(global) integer1 = {}\\n\", integer1);\n\n   // output values of Example namespace\n   std::cout << fmt::format(\n      \"pi = {}\\ne = {}\\ninteger1 = {}\\nfiscal3 = {}\\n\", Example::pi,\n      Example::e, Example::integer1, Example::Inner::fiscal3);\n\n   Example::printValues(); // invoke printValues function\n}\n\n// display variable and constant values\nvoid Example::printValues() {\n   std::cout << \"\\nIn printValues:\\n\";\n   std::cout << fmt::format(\n      \"integer1 = {}\\npi = {}\\ne = {}\\n\", integer1, pi, e);\n   std::cout << fmt::format(\n      \"doubleInUnnamed = {}\\n(global) integer1 = {}\\nfiscal3 = {}\\n\",\n      doubleInUnnamed, ::integer1, Inner::fiscal3);\n}\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson20/fig20_04.cpp",
    "content": "// fig20_04.cpp\n// Demonstrating operator keywords.\n#include <fmt/format.h>\n#include <iostream>\n\nint main() {\n   bool a{true};\n   bool b{false};\n\n   std::cout << fmt::format(\"a = {}; b = {}\\n\\n\", a, b);\n\n   std::cout << \"Logical operator keywords:\\n\"\n      << fmt::format(\"   a and a: {}\\n\", a and a)\n      << fmt::format(\"   a and b: {}\\n\", a and b)\n      << fmt::format(\"    a or a: {}\\n\", a or a)\n      << fmt::format(\"    a or b: {}\\n\", a or b)\n      << fmt::format(\"     not a: {}\\n\", not a)\n      << fmt::format(\"     not b: {}\\n\", not b)\n      << fmt::format(\"a not_eq b: {}\\n\", a not_eq b);\n}\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson20/fig20_05.cpp",
    "content": "// fig20_05.cpp\n// Demonstrating operators .* and ->*.\n#include <iostream>\n\n// class Test definition\nclass Test {\npublic:\n   Test(int x) : value{x} {};\n\n   void testFunction() {\n      std::cout << \"testFunction called\\n\";\n   }\n\n   int value; // public data member\n};\n\nvoid arrowStar(Test* ptr); // prototype\nvoid dotStar(Test* ptr); // prototype\n\nint main() {\n   Test test{8};\n   arrowStar(&test); // pass address to arrowStar\n   dotStar(&test); // pass address to dotStar\n}\n\n// access member function of Test object using ->*\nvoid arrowStar(Test* ptr) {\n   auto functionPtr{&Test::testFunction}; // pointer to a member function\n   (ptr->*functionPtr)(); // invoke function indirectly              \n}\n\n// access members of Test object data member using .*\nvoid dotStar(Test* ptr) {\n   auto valuePtr{&Test::value}; // pointer to a data member  \n   std::cout << \"value is \" << (*ptr).*valuePtr << \"\\n\"; // access value\n}\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson20/fig20_06/CommissionEmployee.cpp",
    "content": "// Fig. 10.16: CommissionEmployee.cpp\r\n// CommissionEmployee class member-function definitions.\r\n#include <fmt/format.h>\r\n#include <stdexcept>\r\n#include \"CommissionEmployee.h\" // CommissionEmployee class definition\r\n\r\n// constructor                                                        \r\nCommissionEmployee::CommissionEmployee(std::string_view name, \r\n   double grossSales, double commissionRate) : Employee{name} {\r\n   setGrossSales(grossSales); \r\n   setCommissionRate(commissionRate); \r\n}                                      \r\n\r\n// set gross sales amount\r\nvoid CommissionEmployee::setGrossSales(double grossSales) {\r\n   if (grossSales < 0.0) {\r\n      throw std::invalid_argument(\"Gross sales must be >= 0.0\");\r\n   } \r\n\r\n   m_grossSales = grossSales;\r\n} \r\n\r\n// return gross sales amount\r\ndouble CommissionEmployee::getGrossSales() const {return m_grossSales;}\r\n\r\n// set commission rate\r\nvoid CommissionEmployee::setCommissionRate(double commissionRate) {\r\n   if (commissionRate <= 0.0 || commissionRate >= 1.0) {\r\n      throw std::invalid_argument(\r\n         \"Commission rate must be > 0.0 and < 1.0\");\r\n   } \r\n\r\n   m_commissionRate = commissionRate;\r\n} \r\n\r\n// return commission rate\r\ndouble CommissionEmployee::getCommissionRate() const {\r\n   return m_commissionRate;\r\n} \r\n\r\n// calculate earnings                        \r\ndouble CommissionEmployee::earnings() const {\r\n   return getGrossSales() * getCommissionRate();\r\n}                                            \r\n\r\n// return string representation of CommissionEmployee object        \r\nstd::string CommissionEmployee::toString() const {                       \r\n   return fmt::format(\"{}\\n{}: ${:.2f}\\n{}: {:.2f}\", Employee::toString(),\r\n      \"gross sales\", getGrossSales(),\r\n      \"commission rate\", getCommissionRate());                  \r\n}                                                                   \r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson20/fig20_06/CommissionEmployee.h",
    "content": "// Fig. 10.15: CommissionEmployee.h\r\n// CommissionEmployee class derived from Employee.\r\n#pragma once\r\n#include <string> \r\n#include <string_view> \r\n#include \"Employee.h\" // Employee class definition\r\n\r\nclass CommissionEmployee final : public Employee {\r\npublic:\r\n   CommissionEmployee(std::string_view name, double grossSales,\r\n      double commissionRate);\r\n   virtual ~CommissionEmployee() = default; // virtual destructor\r\n\r\n   void setGrossSales(double grossSales);\r\n   double getGrossSales() const;\r\n\r\n   void setCommissionRate(double commissionRate);\r\n   double getCommissionRate() const;\r\n\r\n   // keyword override signals intent to override                 \r\n   double earnings() const override; // calculate earnings        \r\n   std::string toString() const override; // string representation\r\nprivate:\r\n   double m_grossSales{0.0};\r\n   double m_commissionRate{0.0};\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson20/fig20_06/Employee.cpp",
    "content": "// Fig. 10.12: Employee.cpp\r\n// Abstract-base-class Employee member-function definitions.\r\n// Note: No definitions are given for pure virtual functions.\r\n#include <fmt/format.h>\r\n#include \"Employee.h\" // Employee class definition\r\n\r\n// constructor                                                        \r\nEmployee::Employee(std::string_view name) : m_name{name} {} // empty body\r\n\r\n// set name\r\nvoid Employee::setName(std::string_view name) {m_name = name;}\r\n\r\n// get name\r\nstd::string Employee::getName() const {return m_name;}\r\n\r\n// return string representation of an Employee\r\nstd::string Employee::toString() const {                       \r\n   return fmt::format(\"name: {}\", getName());\r\n}                                                                   \r\n                                                                                                                 \r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson20/fig20_06/Employee.h",
    "content": "// Fig. 10.11: Employee.h\r\n// Employee abstract base class.\r\n#pragma once // prevent multiple inclusions of header\r\n#include <string> \r\n#include <string_view> \r\n\r\nclass Employee {\r\npublic:\r\n   explicit Employee(std::string_view name);\r\n   virtual ~Employee() = default; // compiler generates virtual destructor\r\n\r\n   void setName(std::string_view name);\r\n   std::string getName() const;\r\n\r\n   // pure virtual function makes Employee an abstract base class\r\n   virtual double earnings() const = 0; // pure virtual\r\n   virtual std::string toString() const; // virtual\r\nprivate:\r\n   std::string m_name;\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson20/fig20_06/SalariedEmployee.cpp",
    "content": "// Fig. 10.14: SalariedEmployee.cpp\r\n// SalariedEmployee class member-function definitions.\r\n#include <fmt/format.h>\r\n#include <stdexcept>\r\n#include \"SalariedEmployee.h\" // SalariedEmployee class definition\r\n\r\n// constructor \r\nSalariedEmployee::SalariedEmployee(std::string_view name, double salary)\r\n   : Employee{name} {\r\n   setSalary(salary); \r\n} \r\n\r\n// set salary\r\nvoid SalariedEmployee::setSalary(double salary) {\r\n   if (salary < 0.0) {\r\n      throw std::invalid_argument(\"Weekly salary must be >= 0.0\");\r\n   } \r\n\r\n   m_salary = salary;\r\n} \r\n\r\n// return salary\r\ndouble SalariedEmployee::getSalary() const {return m_salary;}\r\n\r\n// calculate earnings; \r\n// override pure virtual function earnings in Employee\r\ndouble SalariedEmployee::earnings() const {return getSalary();}\r\n\r\n// return a string representation of SalariedEmployee\r\nstd::string SalariedEmployee::toString() const {\r\n   return fmt::format(\"{}\\n{}: ${:.2f}\", Employee::toString(), \r\n      \"salary\", getSalary());\r\n} \r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson20/fig20_06/SalariedEmployee.h",
    "content": "// Fig. 10.13: SalariedEmployee.h\r\n// SalariedEmployee class derived from Employee.\r\n#pragma once\r\n#include <string> // C++ standard string class\r\n#include <string_view> \r\n#include \"Employee.h\" // Employee class definition\r\n\r\nclass SalariedEmployee final : public Employee {\r\npublic:\r\n   SalariedEmployee(std::string_view name, double salary);\r\n   virtual ~SalariedEmployee() = default; // virtual destructor\r\n\r\n   void setSalary(double salary);\r\n   double getSalary() const;\r\n\r\n   // keyword override signals intent to override               \r\n   double earnings() const override; // calculate earnings        \r\n   std::string toString() const override; // string representation\r\nprivate:\r\n   double m_salary{0.0};\r\n};\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson20/fig20_06/fig20_06.cpp",
    "content": "// fig20_06.cpp\r\n// Demonstrating downcasting and runtime type information (RTTI). \r\n#include <fmt/format.h> \r\n#include <iostream>\r\n#include <typeinfo>\r\n#include <vector>\r\n#include \"Employee.h\"\r\n#include \"SalariedEmployee.h\" \r\n#include \"CommissionEmployee.h\"  \r\n\r\nint main() {\r\n   // create derived-class objects                        \r\n   SalariedEmployee salaried{\"John Smith\", 800.0}; \r\n   CommissionEmployee commission{\"Sue Jones\", 10000.0, .06};\r\n\r\n   // create and initialize vector of base-class pointers        \r\n   std::vector<Employee*> employees{&salaried, &commission};\r\n \r\n   // polymorphically process each element in vector employees\r\n   for (Employee* employeePtr : employees) {\r\n      std::cout << fmt::format(\"{}\\n\", employeePtr->toString());\r\n\r\n      // determine whether employeePtr points to a SalariedEmployee; \r\n      // if not, dynamic_cast returns nullptr which evaluates to false\r\n      if (auto ptr{dynamic_cast<SalariedEmployee*>(employeePtr)}) {\r\n         double oldBaseSalary = ptr->getSalary();\r\n         std::cout << fmt::format(\"old salary: ${:.2f}\\n\", oldBaseSalary);\r\n         ptr->setSalary(1.10 * oldBaseSalary);\r\n         std::cout << fmt::format(\r\n            \"new salary with 10% increase is: ${:.2f}\\n\",\r\n            ptr->getSalary());\r\n      } \r\n      \r\n      std::cout << fmt::format(\"earned ${:.2f}\\n\\n\", \r\n         employeePtr->earnings());\r\n   } \r\n \r\n   // display each objects type\r\n   for (const Employee* employeePtr : employees) {\r\n      std::cout << fmt::format(\"{}\\n\", typeid(*employeePtr).name());\r\n   } \r\n} \r\n\r\n\r\n\r\n/**************************************************************************\r\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\r\n * Pearson Education, Inc. All Rights Reserved.                           *\r\n *                                                                        *\r\n * DISCLAIMER: The authors and publisher of this book have used their     *\r\n * best efforts in preparing the book. These efforts include the          *\r\n * development, research, and testing of the theories and programs        *\r\n * to determine their effectiveness. The authors and publisher make       *\r\n * no warranty of any kind, expressed or implied, with regard to these    *\r\n * programs or to the documentation contained in these books. The authors *\r\n * and publisher shall not be liable in any event for incidental or       *\r\n * consequential damages in connection with, or arising out of, the       *\r\n * furnishing, performance, or use of these programs.                     *\r\n **************************************************************************/\r\n"
  },
  {
    "path": "examples/lesson20/fig20_07.cpp",
    "content": "// fig20_07.cpp\n// [[nodiscard]] attribute.\n\n[[nodiscard(\"Do not ignore! Otherwise, you won't know the cube of x.\")]]\nint cube(int x) {\n   return x * x * x;\n}\n\nint main() {\n   cube(10); // generates a compiler warning\n}\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson20/fig20_08.cpp",
    "content": "// fig20_08.cpp\n// Demonstrate shared_ptrs.\n#include <algorithm>\n#include <fmt/format.h>\n#include <iostream>\n#include <memory>\n#include <string>\n#include <string_view>\n#include <vector>\n\n// class Book\nclass Book {\npublic:\n   explicit Book(std::string_view bookTitle) : title{bookTitle} {}\n   ~Book() { std::cout << fmt::format(\"Destroying Book: {}\\n\", title); }\n   std::string title; // title of the Book\n};\n\n// a custom delete function for a pointer to a Book\nvoid deleteBook(Book* book) {\n   std::cout << \"Custom deleter for a Book, \";\n   delete book; // delete the Book pointer\n}\n\n// compare the titles of two Books for sorting\nbool compareTitles(\n   std::shared_ptr<Book> ptr1, std::shared_ptr<Book> ptr2) {\n   return (ptr1->title < ptr2->title);\n}\n\nint main() {\n   // create a shared_ptr to a Book and display the reference count\n   std::shared_ptr<Book> bookPtr{\n      std::make_shared<Book>(\"C++ How to Program\")};\n   std::cout << fmt::format(\"Reference count for Book {} is: {}\\n\",\n      bookPtr->title, bookPtr.use_count());\n\n   // create another shared_ptr to the Book and display reference count\n   std::shared_ptr<Book> bookPtr2{bookPtr};\n   std::cout << fmt::format(\"Reference count for Book {} is: {}\\n\",\n      bookPtr->title, bookPtr.use_count());\n\n   // change the Books title and access it from both pointers\n   bookPtr2->title = \"Java How to Program\";\n   std::cout << fmt::format(\n      \"Updated Book title:\\nbookPtr: {}\\nbookPtr2: {}\\n\",\n      bookPtr->title, bookPtr2->title);\n\n   // create a std::vector of shared_ptrs to Books (BookPtrs)\n   std::vector<std::shared_ptr<Book>> books{\n      std::make_shared<Book>(\"C How to Program\"),\n      std::make_shared<Book>(\"Intro to Python\"),\n      std::make_shared<Book>(\"C# How to Program\"),\n      std::make_shared<Book>(\"C++ How to Program\")};\n\n   // print the Books in the vector\n   std::cout << \"\\nBooks before sorting:\\n\";\n   for (auto book : books) {\n      std::cout << book->title << \"\\n\";\n   }\n\n   // sort the vector by Book title and print the sorted vector\n   std::sort(books.begin(), books.end(), compareTitles);\n   std::cout << \"\\nBooks after sorting:\\n\";\n   for (auto book : books) {\n      std::cout << book->title << \"\\n\";\n   }\n\n   // create a shared_ptr with a custom deleter\n   std::cout << \"\\nshared_ptr with a custom deleter.\\n\";\n   std::shared_ptr<Book> bookPtr3{\n      new Book(\"Android How to Program\"), deleteBook};\n   bookPtr3.reset(); // release the Book this shared_ptr manages\n\n   // shared_ptrs are going out of scope\n   std::cout << \"\\nEnd of main: shared_ptr objects going out of scope.\\n\";\n}\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson20/fig20_09-13/Author.cpp",
    "content": "// Fig. 20.11: Author.cpp\n// Author member-function definitions.\n#include <fmt/format.h>\n#include <iostream>\n#include <memory>\n#include <string>\n#include <string_view>\n#include \"Author.h\"\n#include \"Book.h\"\n\nAuthor::Author(std::string_view authorName) : name(authorName) {}\n\nAuthor::~Author() {\n   std::cout << fmt::format(\"Destroying Author: {}\\n\", name);\n}\n\n// print the title of the Book this Author wrote\nvoid Author::printBookTitle() {\n   // if weakBookPtr.lock() returns a non-empty shared_ptr\n   if (std::shared_ptr<Book> bookPtr{weakBookPtr.lock()}) {\n      // show the reference count increase and print the Book's title\n      std::cout << fmt::format(\"Reference count for Book {} is {}\\n\",\n         bookPtr->title, bookPtr.use_count());\n      std::cout << fmt::format(\"Author {} wrote the book {}\\n\", \n         name, bookPtr->title);\n   }\n   else { // weakBookPtr points to NULL\n      std::cout << \"This Author has no Books.\\n\";\n   }\n}\n\n\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson20/fig20_09-13/Author.h",
    "content": "// Fig. 20.9: Author.h\n// Author class definition.\n#pragma once\n#include <memory>\n#include <string>\n#include <string_view>\n\nclass Book; // forward declaration of class Book\n\n// Author class definition\nclass Author {\npublic:\n   explicit Author(std::string_view authorName);\n   ~Author();\n\n   // print the title of the Book this Author wrote\n   void printBookTitle();\n\n   std::string name; // name of the Author\n   std::weak_ptr<Book> weakBookPtr; // Book the Author wrote    \n   std::shared_ptr<Book> sharedBookPtr; // Book the Author wrote\n};\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson20/fig20_09-13/Book.cpp",
    "content": "// Fig. 20.12: Book.cpp\n// Book member-function definitions.\n#include <fmt/format.h>\n#include <iostream>\n#include <memory>\n#include <string>\n#include <string_view>\n#include \"Author.h\"\n#include \"Book.h\"\n\nBook::Book(std::string_view bookTitle) : title(bookTitle) {}\n\nBook::~Book() {\n   std::cout << fmt::format(\"Destroying Book: {}\\n\", title);\n}\n\n// print the name of this Book's Author\nvoid Book::printAuthorName() {\n   // if weakAuthorPtr.lock() returns a non-empty shared_ptr\n   if (std::shared_ptr<Author> authorPtr{weakAuthorPtr.lock()}) {\n      // show the reference count increase and print the Author's name\n      std::cout << fmt::format(\"Reference count for Author {} is {}\\n\",\n         authorPtr->name, authorPtr.use_count());\n      std::cout << fmt::format(\"The book {} was written by {}\\n\",\n         title, authorPtr->name);\n   }\n   else { // weakAuthorPtr points to NULL\n      std::cout << \"This Book has no Author.\\n\";\n   }\n}\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson20/fig20_09-13/Book.h",
    "content": "// Fig. 20.10: Book.h\n// Book class definition.\n#pragma once\n#include <memory>\n#include <string>\n#include <string_view>\n\nclass Author; // forward declaration of class Author\n\n// Book class definition\nclass Book {\npublic:\n   explicit Book(std::string_view bookTitle);\n   ~Book();\n\n   // print the name of this Book's Author\n   void printAuthorName();\n\n   std::string title; // title of the Book\n   std::weak_ptr<Author> weakAuthorPtr; // Author of the Book    \n   std::shared_ptr<Author> sharedAuthorPtr; // Author of the Book\n};\n\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson20/fig20_09-13/fig20_13.cpp",
    "content": "// fig20_13.cpp\n// Demonstrate use of weak_ptr.\n#include <fmt/format.h>\n#include <iostream>\n#include <memory>\n#include \"Author.h\"\n#include \"Book.h\"\n\nint main() {\n   // create a Book and an Author\n   std::shared_ptr<Book> bookPtr(\n      std::make_shared<Book>(\"C++ How to Program\"));\n   std::shared_ptr<Author> authorPtr(\n      std::make_shared<Author>(\"Deitel & Deitel\"));\n\n   // reference the Book and Author to each other\n   bookPtr->weakAuthorPtr = authorPtr;\n   authorPtr->weakBookPtr = bookPtr;\n\n   // set the shared_ptr data members to create the memory leak\n   bookPtr->sharedAuthorPtr = authorPtr;\n   authorPtr->sharedBookPtr = bookPtr;\n\n   // reference count for bookPtr and authorPtr is two\n   std::cout << fmt::format(\"Reference count for Book {} is {}\\n\",\n      bookPtr->title, bookPtr.use_count());\n   std::cout << fmt::format(\"Reference count for Author {} is {}\\n\\n\",\n      authorPtr->name, authorPtr.use_count());\n\n   // access the cross references to print the data they point to\n   std::cout << \"Access Author name and Book title via weak_ptrs:\\n\";\n   bookPtr->printAuthorName();\n   std::cout << \"\\n\";\n   authorPtr->printBookTitle();\n\n   // reference count for each shared_ptr is two\n   std::cout << fmt::format(\"\\nReference count for Book {} is {}\\n\",\n      bookPtr->title, bookPtr.use_count());\n   std::cout << fmt::format(\"Reference count for Author {} is {}\\n\\n\",\n      authorPtr->name, authorPtr.use_count());\n\n   // the shared_ptrs go out of scope, the Book and Author are destroyed\n   std::cout << \"End of main. shared_ptrs going out of scope.\\n\";\n}\n\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/lesson20/fig20_14.cpp",
    "content": "// fig20_14.cpp\n// Summing the elements of a braced initializer\n#include <fmt/format.h>\n#include <initializer_list>\n#include <iostream>\n#include <string>\n\n// sum the elements of an initializer_list\ntemplate <typename T>\nT sum(std::initializer_list<T> list) {\n   T total{}; // value initialize total based on type T\n\n   // sum all the elements in list; requires += operator for type T \n   for (auto item : list) {\n      total += item;\n   }\n\n   return total;\n}\n\nint main() {\n   // display the sum of four ints contained in a braced initializer\n   std::cout << fmt::format(\"The sum of {} is: {}\\n\",\n      \"{1, 2, 3, 4}\", sum({1, 2, 3, 4}));\n\n   // display the sum of three doubles contained in a braced initializer\n   std::cout << fmt::format(\"The sum of {} is: {}\\n\",\n      \"{1.1, 2.2, 3.3}\", sum({1.1, 2.2, 3.3}));\n      \n   // display the sum of two strings contained in a braced initializer\n   std::string s1{\"Happy \"};\n   std::string s2{\"birthday!\"};\n   std::cout << fmt::format(\"The sum of {} is: {}\\n\",\n      \"{\\\"Happy \\\", \\\"birthday!\\\"}\", sum({s1, s2}));\n}\n\n\n\n/**************************************************************************\n * (C) Copyright 1992-2022 by Deitel & Associates, Inc. and               *\n * Pearson Education, Inc. All Rights Reserved.                           *\n *                                                                        *\n * DISCLAIMER: The authors and publisher of this book have used their     *\n * best efforts in preparing the book. These efforts include the          *\n * development, research, and testing of the theories and programs        *\n * to determine their effectiveness. The authors and publisher make       *\n * no warranty of any kind, expressed or implied, with regard to these    *\n * programs or to the documentation contained in these books. The authors *\n * and publisher shall not be liable in any event for incidental or       *\n * consequential damages in connection with, or arising out of, the       *\n * furnishing, performance, or use of these programs.                     *\n **************************************************************************/\n"
  },
  {
    "path": "examples/libraries/BigNumber/CMakeLists.txt",
    "content": "# CMakeLists.txt\n# Mark Guerra\n# 11/1/2015\n\ncmake_minimum_required(VERSION 2.8)\nproject(BigNumber)\n\nset(BigNumber_VERSION_MAJOR 1)\nset(BigNumber_VERSION_MINOR 0)\n\nif (WIN32)\n    set(c++version -std=gnu++14)\nelse()\n    set(c++version -std=c++14)\nendif()\n\nset(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Wall -Wextra -Weffc++ -pedantic -Wno-unused-function ${c++version}\")\n\nset(CMAKE_BUILD_TYPE Release)\n\nset(SOURCE_FILES\n        src/bignumber.cpp  main.cpp )\n\nadd_library(BigNumber ${SOURCE_FILES})\n\nset(CMAKE_BUILD_TYPE Debug)\n\nif(WIN32)\n    install(TARGETS BigNumber DESTINATION C:/Libs/BigNumber/lib)\n    install(FILES src/bignumber.h DESTINATION C:/Libs/BigNumber/include)\nelse()\n    install(TARGETS BigNumber DESTINATION ~/Library/Frameworks/BigNumber/lib)\n    install(FILES src/bignumber.h DESTINATION ~/Library/Frameworks/BigNumber/include)\nendif()\ninstall(TARGETS BigNumber DESTINATION ${CMAKE_CURRENT_LIST_DIR}/bin/BigNumber/lib)\ninstall(FILES src/bignumber.h DESTINATION ${CMAKE_CURRENT_LIST_DIR}/bin/BigNumber/include)\n\nadd_custom_command(\n        TARGET BigNumber\n        POST_BUILD\n        COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target install\n)\n\nadd_executable(BigNumberRun ${SOURCE_FILES})\n"
  },
  {
    "path": "examples/libraries/BigNumber/LICENSE.md",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2016-2017 Mark Guerra\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "examples/libraries/BigNumber/README.md",
    "content": "# BigNumber\n\n![BigNumber build](https://travis-ci.org/Limeoats/BigNumber.svg?branch=master)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/Limeoats/BigNumber/blob/master/LICENSE.md)\n\nBigNumber is a C++ class that allows for the creation and computation of arbitrary-length\nintegers.\n\nThe maximum possible length of a BigNumber is `std::string::max_size`.\n\n## Installation\nTo add BigNumber to your C++ project, you can download the `bin` folder from this repository, which \ncontains the library and include files.\n\nThen, simply include the header file in whichever file you need a BigNumber and link to the library file.\n\n`#include \"bignumber.h\"`\n\n## Usage\n### `BigNumber(string)`\n\n\nYou can also use the `=` operator to set a BigNumber equal to an existing BigNumber, a number, or \na string of numbers.\n\nExamples:\n\n    BigNumber b(\"5\");       //BigNumber b is created with value 5.\n    BigNumber c(\"-20\");     //BigNumber c is created with value -20.\n    BigNumber d(\"0\");       //BigNumber d is created with value 0.\n    BigNumber e = b;        //BigNumber e is created with value 5.\n    BigNumber f = 30;       //BigNumber f is created with value 30.\n    BigNumber g = \"2060\";   //BigNumber g is created with value 2060.\n    BigNumber h(22);        //BigNumber h is created with value 22.\n\n\n## Methods\n### `add(BigNumber other)`\nAdds another BigNumber to the current instance\n\n`BigNumber(\"4\").add(BigNumber(\"20\")) => BigNumber(\"24\")`\n\n### `subtract(BigNumber other)`\nSubtracts another BigNumber from the current instance\n\n`BigNumber(\"30\").subtract(BigNumber(\"45\")) => BigNumber(\"-15\")`\n\n### `multiply(BigNumber other)`\nMultiplies the BigNumber by another BigNumber\n\n`BigNumber(\"12\").multiply(BigNumber(\"4\")) => BigNumber(\"48\")`\n\n### `divide(BigNumber other)`\nDivides the BigNumber by another BigNumber\n\n`BigNumber(\"30\").divide(BigNumber(\"5\")) => BigNumber(\"6\")`\n\n### `pow(int exponent)`\nRaises the BigNumber to the power of the exponent\n\n`BigNumber(\"2\").pow(3) => BigNumber(\"8\")`\n\n### `getString()`\nReturns the BigNumber as an std::string\n\n`BigNumber(\"3824\").getString() => \"3824\"`\n\n### `setString(std::string newStr)`\nSets the BigNumber's internal number string to a new string\n\n`BigNumber(\"2847\").setString(\"38\") => BigNumber(\"38\")`\n\n### `negate()`\nChanges the sign of the BigNumber\n\n    BigNumber(\"3\").negate() => BigNumber(\"-3\")\n    BigNumber(\"-27\").negate() => BigNumber(\"27\")\n\n### `equals(BigNumber other)`\nChecks if the other BigNumber is equal to this one\n\n`BigNumber(\"24\").equals(BigNumber(\"28\")) => false`\n\n### `digits()`\nReturns the number of digits in the BigNumber\n\n`BigNumber(\"28374\").digits() => 5`\n\n### `isNegative()`\nDetermines whether a BigNumber is negative\n\n`BigNumber(\"-278\").isNegative() => true`\n\n### `isPositive()`\nDetermines whether a BigNumber is positive\n\n`BigNumber(\"-3\").isPositive() => false`\n\n### `isEven()`\nDetermines whether a BigNumber is even\n\n`BigNumber(\"28472310\").isEven() => true`\n\n### `isOdd()`\nDetermines whether a BigNumber is odd\n\n`BigNumber(\"283427\").isOdd() => true`\n\n### `abs()`\nGets the absolute value of the BigNumber\n\n`BigNumber(\"-26\").abs() => BigNumber(\"26\")`\n\n\n## Operator overloads\nThe following operators have been overloaded to work with BigNumbers:\n\n### `<<`\nOutput stream operator\n\n`std::cout << BigNumber(\"26\") << std::endl => 26`\n\n### `+`\nAddition operator\n\n`BigNumber(\"2\") + BigNumber(\"4\") => BigNumber(\"6\")`\n\n### `-`\nSubtraction operator\n\n`BigNumber(\"0\") - BigNumber(\"2000\") => BigNumber(\"-2000\")`\n\n### `*`\nMultiplication operator\n\n`BigNumber(\"-20\") * BigNumber(\"-5\") => BigNumber(\"100\")`\n\n### `/`\nDivision operator\n\n`BigNumber(\"10\") / BigNumber(\"-2\") => BigNumber(\"-5\")`\n\n### `==`\nEqual to operator\n\n`BigNumber(\"24\") == BigNumber(\"24\") => true`\n\n### `>`\nGreater than operator\n\n`BigNumber(\"2\") > BigNumber(\"6\") => false`\n\n### `<`\nLess than operator\n\n`BigNumber(\"2\") < BigNumber(\"6\") => true`\n\n### `>=`\nGreater than or equal to operator\n\n`BigNumber(\"34\") >= BigNumber(\"22\") => true`\n\n### `<=`\nLess than or equal to operator\n\n`BigNumber(\"383\") <= BigNumber(\"383\") => true`\n\n### `=`\nAssignment operator\n\n`BigNumber c(\"3\") = BigNumber(\"8\") => BigNumber(\"8\")`\n\n### `+=`\nAdds and assigns to the BigNumber\n\n`BigNumber c(\"4\") += BigNumber(\"3\") => BigNumber(\"7\")`\n\n### `-=`\nSubtracts and assigns to the BigNumber\n\n`BigNumber c(\"28\") -= BigNumber(\"3\") => BigNumber(\"25\")`\n\n### `*=`\nMultiplies and assigns to the BigNumber\n\n`BigNumber c(\"3\") *= BigNumber(\"4\") => BigNumber(\"12\")`\n\n### `/=`\nDivides and assigns to the BigNumber\n\n`BigNumber c(\"30\") /= BigNumber(\"30\") => BigNumer(\"1\")`\n\n### `++ (Prefix)`\nIncrements the BigNumber and returns the newly incremented number\n\n`++BigNumber(\"10\") => BigNumber(\"11\")`\n\n### `-- (Prefix)`\nDecrements the BigNumber and returns the newly decremented number\n\n`--BigNumber(\"34\") => BigNumber(\"33\")`\n\n### `++ (Postfix)`\nIncrements the BigNumber but returns the original value\n\n`BigNumber(\"20\")++ => BigNumber(\"20\")`\n\n### `-- (Postfix)`\nDecrements the BigNumber but returns the original value\n\n`BigNumber(\"14\")-- => BigNumber(\"14\")`\n\n### `[]`\nIndexing operator\n\n`BigNumber d(\"26\")[1] => 6`\n\n## License\nThis project is under the [Apache License](https://github.com/Limeoats/BigNumber/blob/master/LICENSE.md).\n\n## Credit\nThe BigNumber class was created by [Mark Guerra](http://www.twitter.com/Limeoats). Visit\n[Limeoats.com](http://www.limeoats.com) for more information.\n"
  },
  {
    "path": "examples/libraries/BigNumber/bin/BigNumber/include/bignumber.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 Mark Guerra\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this\n * software and associated documentation files (the \"Software\"), to deal in the Software\n * without restriction, including without limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons\n * to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE\n * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF\n * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#ifndef BIGNUMBER_H\n#define BIGNUMBER_H\n\n#include <vector>\n#include <string>\n#include <iostream>\n\n/**\n * BigNumber class\n */\nclass BigNumber {\npublic:\n    //@{\n    /**\n     * BigNumber constructor\n     * @param number - The initial value of the BigNumber\n     */\n    BigNumber(std::string number);\n    BigNumber(long long number);\n    //@}\n\n    /**\n     * Add another BigNumber to the current instance\n     * @param other - The other BigNumber\n     * @return The sum of the two BigNumbers\n     */\n    BigNumber add(BigNumber other);\n\n    /**\n     * Subtract another BigNumber from the current instance\n     * @param other - The other BigNumber\n     * @return The difference of the two BigNumbers\n     */\n    BigNumber subtract(BigNumber other);\n\n    /**\n     * Multiply the current instance by another BigNumber\n     * @param other - The other BigNumber\n     * @return The product of the two BigNumbers\n     */\n    BigNumber multiply(BigNumber other);\n    \n    /**\n     * Divide the current instance by another BigNumber\n     * @param other - The other BigNumber\n     * @return The quotient of the two BigNumbers\n     */\n    BigNumber divide(BigNumber other);\n\n    /**\n     * Raise the current instance to the power of an exponent\n     * @param exponent - The power to be raised by\n     * @return - The resulting BigNumber after exponentiation\n     */\n    BigNumber pow(int exponent);\n\n    /**\n     * Get the string value of the current instance\n     * @return The BigNumber as a string\n     */\n    std::string getString();\n\n    /**\n     * Set the value of the current instance with a string\n     * @param newStr - The new value for the BigNumber\n     * @return The BigNumber with the new value\n     */\n    BigNumber setString(const std::string &newStr);\n\n    /**\n     * Negates the current instance\n     * @return The BigNumber after negation\n     */\n    BigNumber negate();\n    \n    BigNumber trimLeadingZeros();\n\n    //@{\n    /**\n     * Check if another BigNumber is equal to the current instance\n     * @param other - The other BigNumber\n     * @return True if equal, otherwise false\n     */\n    bool equals(const BigNumber &other);\n    bool equals(const long long &other);\n    bool equals(const std::string &other);\n    //@}\n\n    /**\n     * Get the number of digits in the current instance\n     * @return The number of digits\n     */\n    unsigned int digits();\n\n    /**\n     * Get whether or not the current instance is a negative number\n     * @return True if negative, otherwise false\n     */\n    bool isNegative() const;\n\n    /**\n     * Get whether or not the current instance is a positive number\n     * @return True if positive, otherwise false\n     */\n    bool isPositive();\n\n    /**\n     * Get whether or not the current instance is an even number\n     * @return True if even, otherwise false\n     */\n    bool isEven();\n\n    /**\n     * Get whether or not the current instance is an odd number\n     * @return True if odd, otherwise false\n     */\n    bool isOdd();\n\n    /**\n     * Get the absolute value of the current instance\n     * @return The absolute value of the BigNumber\n     */\n    BigNumber abs() const;\n    \n    /**\n     * Output stream operator\n     * @param os The output stream\n     * @param num The current instance\n     * @return The output stream with the current instance\n     */\n    friend std::ostream &operator<<(std::ostream &os, const BigNumber &num);\n    \n    //@{\n    /**\n     * Addition operator\n     * @param b1 - The current instance\n     * @param b2 - The number being added\n     * @return The sum of the two numbers\n     */\n    friend BigNumber operator+(BigNumber b1, const BigNumber &b2);\n    friend BigNumber operator+(BigNumber b1, const long long &b2);\n    friend BigNumber operator+(BigNumber b1, const std::string &b2);\n    //@}\n    \n    //@{\n    /**\n     * Subtraction operator\n     * @param b1 - The current instance\n     * @param b2 - The number being subtracted\n     * @return The difference of the two numbers\n     */\n    friend BigNumber operator-(BigNumber b1, const BigNumber &b2);\n    friend BigNumber operator-(BigNumber b1, const long long &b2);\n    friend BigNumber operator-(BigNumber b1, const std::string &b2);\n    //@}\n    \n    //@{\n    /**\n     * Multiplication operator\n     * @param b1 - The current instance\n     * @param b2 - The number being multiplied by\n     * @return The product of the two numbers\n     */\n    friend BigNumber operator*(BigNumber b1, const BigNumber &b2);\n    friend BigNumber operator*(BigNumber b1, const long long &b2);\n    friend BigNumber operator*(BigNumber b1, const std::string &b2);\n    //@}\n    \n    //@{\n    /**\n     * Division operator\n     * @param b1 - The current instance\n     * @param b2 - The number being divided by\n     * @return The quotient of the two numbers\n     */\n    friend BigNumber operator/(BigNumber b1, const BigNumber &b2);\n    friend BigNumber operator/(BigNumber b1, const long long &b2);\n    friend BigNumber operator/(BigNumber b1, const std::string &b2);\n    //@}\n    \n    /**\n     * Exponent operator\n     * @param b1 - The current instance\n     * @param b2 - The exponent\n     * @return The value after exponentiation\n     */\n    friend BigNumber operator^(BigNumber b1, const int &b2);\n    \n    //@{\n    /**\n     * Equality operator\n     * @param b1 - The current instance\n     * @param b2 - Another value\n     * @return True if equal, otherwise false\n     */\n    friend bool operator==(BigNumber b1, const BigNumber &b2);\n    friend bool operator==(BigNumber b1, const long long &b2);\n    friend bool operator==(BigNumber b1, const std::string &b2);\n    //@}\n    \n    /**\n     * Greater-than operator\n     * @param b1 - The current instance\n     * @param b2 - Another BigNumber\n     * @return True if current instance is greater, otherwise false\n     */\n    friend bool operator>(BigNumber b1, const BigNumber &b2);\n    \n    /**\n     * Less-than operator\n     * @param b1 - The current instance\n     * @param b2 - Another BigNumber\n     * @return True if current instance is less, otherwise false\n     */\n    friend bool operator<(BigNumber b1, const BigNumber &b2);\n    \n    /**\n     * Greater-than or equal-to operator\n     * @param b1 - The current instance\n     * @param b2 - Another BigNumber\n     * @return True if current instance is greater or equal, otherwise false\n     */\n    friend bool operator>=(BigNumber b1, const BigNumber &b2);\n    \n    /**\n     * Less-than or equal-to operator\n     * @param b1 - The current instance\n     * @param b2 - Another BigNumber\n     * @return True if current instance is less or equal, otherwise false\n     */\n    friend bool operator<=(BigNumber b1, const BigNumber &b2);\n\n    //@{\n    /**\n     * Assignment operator\n     * @param other - The new value for the BigNumber\n     * @return A BigNumber containing the new value\n     */\n    BigNumber& operator=(const BigNumber &other);\n    BigNumber& operator=(const long long &other);\n    BigNumber& operator=(const std::string &other);\n    //@}\n    \n    //@{\n    /**\n     * Addition assignment operator\\n\n     * Adds and assigns a value to the current instance\n     * @param other - The value being added\n     * @return The new value after addition and assignment\n     */\n    BigNumber& operator+=(const BigNumber &other);\n    BigNumber& operator+=(const long long &other);\n    BigNumber& operator+=(const std::string &other);\n    //@}\n    \n    //@{\n    /**\n     * Subtraction assignment operator\\n\n     * Subtracts and assigns a value to the current instance\n     * @param other - The value being subtracted\n     * @return The new value after subtraction and assignment\n     */\n    BigNumber& operator-=(const BigNumber &other);\n    BigNumber& operator-=(const long long &other);\n    BigNumber& operator-=(const std::string &other);\n    //@}\n    \n    //@{\n    /**\n     * Multiplication assignment operator\\n\n     * Multiplies and assigns a value to the current instance\n     * @param other - The value being multiplied\n     * @return The new value after multiplication and assignment\n     */\n    BigNumber& operator*=(const BigNumber &other);\n    BigNumber& operator*=(const long long &other);\n    BigNumber& operator*=(const std::string &other);\n    //@}\n    \n    //@{\n    /**\n     * Division assignment operator\\n\n     * Divides and assigns a value to the current instance\n     * @param other - The value being divided\n     * @return The new value after division and assignment\n     */\n    BigNumber& operator/=(const BigNumber &other);\n    BigNumber& operator/=(const long long &other);\n    BigNumber& operator/=(const std::string &other);\n    //@}\n\n    /**\n     * Pre-increment operator\n     * @return The incremented BigNumber\n     */\n    BigNumber& operator++();\n    \n    /**\n     * Pre-decrement operator\n     * @return The decremented BigNumber\n     */\n    BigNumber& operator--();\n    \n    /**\n     * Post-increment operator\n     * @return The incremented BigNumber\n     */\n    BigNumber operator++(int);\n    \n    /**\n     * Post-decrement operator\n     * @return The decremented BigNumber\n     */\n    BigNumber operator--(int);\n\n    /**\n     * The index operator\n     * @param index The position being looked at\n     * @return The number at the specified position in the BigNumber string\n     */\n    unsigned int operator[](int index);\n\nprivate:\n    std::string _numberString;      //The big number represented as a string\n\n    //Methods\n    BigNumber addll(const long long &other);\n    BigNumber addstr(const std::string &other);\n    BigNumber subtractll(const long long &other);\n    BigNumber subtractstr(const std::string  &other);\n    BigNumber multiplyll(const long long &other);\n    BigNumber multiplystr(const std::string &other);\n    BigNumber dividell(const long long &other);\n    BigNumber dividestr(const std::string &other);\n};\n\n\n\n#endif"
  },
  {
    "path": "examples/libraries/BigNumber/main.cpp",
    "content": "////////////////////////////\n//To make sure assert works:\n#ifdef NDEBUG\n#undef NDEBUG\n#endif\n////////////////////////////\n\n#include \"src/bignumber.h\"\n#include <assert.h>\n\nint main() {\n    //Addition\n    assert((BigNumber(50) + BigNumber(32)).getString() == \"82\");\n    assert((BigNumber(5) + BigNumber(622)).getString() == \"627\");\n    assert((BigNumber(\"-33\") + BigNumber(\"8\")).getString() == \"-25\");\n    assert((BigNumber(\"15535\") + BigNumber(\"0\")).getString() == \"15535\");\n    assert((BigNumber(\"126\") + BigNumber(\"39285\")).getString() == \"39411\");\n    assert((BigNumber(\"0\") + BigNumber(\"0\")).getString() == \"0\");\n    assert(BigNumber(5) + 10 == 15);\n    assert(BigNumber(\"-41\") + 40 == -1);\n    BigNumber ad1(600);\n    ad1 += 50;\n    ad1 += \"50\";\n    assert(ad1.getString() == \"700\");\n    assert(ad1 == 700);\n\n    //Subtraction\n    assert((BigNumber(\"50\") - BigNumber(\"32\")).getString() == \"18\");\n    assert((BigNumber(\"50\") - BigNumber(\"60\")).getString() == \"-10\");\n    assert((BigNumber(\"0\") - BigNumber(\"46\")).getString() == \"-46\");\n    assert((BigNumber(\"50\") - BigNumber(\"50\")).getString() == \"0\");\n    assert((BigNumber(\"482847\") - BigNumber(\"89787941\")).getString() == \"-89305094\");\n    assert((BigNumber(\"6828\") - BigNumber(\"1\")).getString() == \"6827\");\n    assert((BigNumber(\"100\") - BigNumber(\"50\")).getString() == \"50\");\n    assert((BigNumber(\"42\") - BigNumber(\"49\")).getString() == \"-7\");\n    assert((BigNumber(\"100\") - BigNumber(\"5\")) == 95);\n    BigNumber sb1 = 200;\n    sb1 -= 40;\n    assert(sb1 == 160);\n    sb1 = sb1 - 180;\n    assert(sb1 == \"-20\");\n    sb1 -= \"20\";\n    assert(sb1 == BigNumber(-40));\n\n    //Multiplication\n    assert((BigNumber(\"4\") * BigNumber(\"12\")).getString() == \"48\");\n    assert((BigNumber(\"3002\") * BigNumber(\"1\")).getString() == \"3002\");\n    assert((BigNumber(\"99\") * BigNumber(\"0\")).getString() == \"0\");\n    assert((BigNumber(\"-5\") * BigNumber(\"5\")).getString() == \"-25\");\n    assert((BigNumber(\"-33\") * BigNumber(\"-2\")).getString() == \"66\");\n    assert((BigNumber(\"283\") * BigNumber(\"382871\")).getString() == \"108352493\");\n    BigNumber ml1 = 4;\n    ml1 *= 6;\n    assert(ml1 == \"24\");\n    ml1 = BigNumber(5) * 6;\n    assert(ml1 == 30);\n    ml1 *= \"5000\";\n    assert(ml1 == 150000);\n\n    //Division\n    assert(BigNumber(\"25\").divide(BigNumber(\"5\")) == 5);\n    assert(BigNumber(\"48\").divide(BigNumber(\"6\")) == 8);\n    assert(BigNumber(\"100\").divide(BigNumber(\"5\")) == 20);\n    BigNumber dv1 = 100;\n    dv1 /= 25;\n    assert(dv1 == 4);\n    dv1 = dv1 / dv1;\n    assert(dv1 == 1);\n    dv1 /= 1;\n    assert(dv1 == 1);\n    dv1 = -5;\n    dv1 /= 5;\n    assert(dv1 == -1);\n    dv1 = 3000;\n    dv1 /= 300;\n    assert(dv1 == 10);\n    dv1 = 25485;\n    dv1 /= 5;\n    assert(dv1 == \"5097\");\n\n    //Exponentiation\n    assert((BigNumber(\"2\").pow(3)).getString() == \"8\");\n    assert((BigNumber(\"1\").pow(38)).getString() == \"1\");\n    assert((BigNumber(\"5\").pow(2)).getString() == \"25\");\n    assert((BigNumber(\"10\").pow(10)).getString() == \"10000000000\");\n    assert((BigNumber(\"5\").pow(1)).getString() == \"5\");\n    assert((BigNumber(\"5\").pow(0)).getString() == \"1\");\n    assert((BigNumber(\"-5\").pow(2)).getString() == \"25\");\n\n    //Equals\n    assert(BigNumber(\"4\") == BigNumber(\"4\"));\n    assert(BigNumber(\"-3\") == BigNumber(\"-3\"));\n    assert(BigNumber(\"0\") == BigNumber(\"0\"));\n    assert(BigNumber(\"938283828178273\") == BigNumber(\"938283828178273\"));\n\n    //Greater than\n    assert(BigNumber(\"5\") > BigNumber(\"2\"));\n    assert(BigNumber(\"30\") > BigNumber(\"-40\"));\n    assert(BigNumber(\"-5\") > BigNumber(\"-10\"));\n    assert(BigNumber(\"0\") > BigNumber(\"-1\"));\n\n    //Less than\n    assert(BigNumber(\"10\") < BigNumber(\"20\"));\n    assert(BigNumber(\"-5\") < BigNumber(\"0\"));\n    assert(BigNumber(\"30\") < BigNumber(\"30000\"));\n\n    //Greater than or equal to\n    assert(BigNumber(\"5\") >= BigNumber(\"0\"));\n    assert(BigNumber(\"-5\") >= BigNumber(\"-5\"));\n    assert(BigNumber(\"-5\") >= BigNumber(\"-10\"));\n    assert(BigNumber(\"0\") >= BigNumber(\"0\"));\n    assert(BigNumber(\"32\") >= BigNumber(\"-32\"));\n    assert(BigNumber(\"2\") >= BigNumber(\"0001\"));\n\n    //Less than or equal to\n    assert(BigNumber(\"5\") <= BigNumber(\"10\"));\n    assert(BigNumber(\"0\") <= BigNumber(\"0\"));\n    assert(BigNumber(\"-5\") <= BigNumber(\"0\"));\n    assert(BigNumber(\"30\") <= BigNumber(\"30\"));\n    assert(BigNumber(\"400\") <= BigNumber(\"392342\"));\n\n    //Index\n    assert(BigNumber(\"423\")[1] == 2);\n    assert(BigNumber(\"0\")[0] == 0);\n    assert(BigNumber(\"-5\")[1] == 5);\n\n    //Even\n    assert(BigNumber(\"426\").isEven());\n    assert(BigNumber(\"-20\").isEven());\n\n    //Odd\n    assert(BigNumber(\"83\").isOdd());\n    assert(BigNumber(\"-27\").isOdd());\n\n    //Positive\n    assert(BigNumber(\"38\").isPositive());\n\n    //Negative\n    assert(BigNumber(\"-28382\").isNegative());\n\n    //Increment/Decrement operators\n    assert(BigNumber(\"5\")--.getString() == \"5\");\n    assert((--BigNumber(\"5\")).getString() == \"4\");\n    assert(BigNumber(\"10\")++.getString() == \"10\");\n    assert((++BigNumber(\"10\")).getString() == \"11\");\n\n    BigNumber a(\"10\");\n    a++;\n    assert(a.getString() == \"11\");\n    ++a;\n    assert(a.getString() == \"12\");\n    a--;\n    assert(a.getString() == \"11\");\n    --a;\n    assert(a.getString() == \"10\");\n\n    //Absolute value\n    assert(BigNumber(\"45\").abs().getString() == \"45\");\n    assert(BigNumber(\"-325\").abs().getString() == \"325\");\n\n    //Digits\n    assert(BigNumber(\"28374765\").digits() == 8);\n    assert(BigNumber(\"-3092\").digits() == 4);\n\n    //Set string\n    assert(BigNumber(\"234\").setString(\"-45\").getString() == \"-45\");\n\n    //Assignment operator\n    BigNumber c(10);\n    c = 5;\n    assert(c == 5);\n    assert(c == BigNumber(5));\n    assert(c == BigNumber(\"5\"));\n    c = \"83833\";\n    assert(c == 83833);\n    assert(c == BigNumber(83833));\n    assert(c == BigNumber(\"83833\"));\n\n    //Equals testing\n    BigNumber d(40);\n    assert(d == 40);\n    assert(d == \"40\");\n    assert(d == BigNumber(\"40\"));\n    assert(d == BigNumber(40));\n    d = 40;\n    assert(d == 40);\n    d = \"40\";\n    assert(d == 40);\n\n\n    std::cout << \"BigNumber ran successfully.\" << std::endl;\n}\n"
  },
  {
    "path": "examples/libraries/BigNumber/src/bignumber.cpp",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 Mark Guerra\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this\n * software and associated documentation files (the \"Software\"), to deal in the Software\n * without restriction, including without limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons\n * to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE\n * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF\n * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#include <sstream>\n#include <stack>\n#include <iostream>\n\n#include \"bignumber.h\"\n\n\nBigNumber::BigNumber(std::string number) :\n        _numberString(number)\n{\n}\n\nBigNumber::BigNumber(long long number) :\n    _numberString(std::to_string(number))\n{}\n\nBigNumber BigNumber::add(BigNumber other) {\n    BigNumber b1 = other > *this ? other : *this;\n    BigNumber b2 = other > *this ? *this : other;\n    if (b1.isNegative() || b2.isNegative()) {\n        if (b1.isNegative() && b2.isNegative()) {\n            return b1.negate().add(b2.negate()).negate();\n        }\n        else if (b1.isNegative() && !b2.isNegative()) {\n            return b1.negate().subtract(b2).negate();\n        }\n        else {\n            return b2.negate().subtract(b1).negate();\n        }\n    }\n    std::string results;\n    int carry = 0;\n    int diff = int(b1._numberString.size() - b2._numberString.size());\n    for (int i = 0; i < diff; ++i) {\n        b2._numberString.insert(b2._numberString.begin(), '0');\n    }\n    for (int i = int(b1._numberString.size() - 1); i >= 0; --i) {\n        int sum = (b1._numberString[i] - '0') + (b2._numberString[i] - '0') + carry;\n        carry = 0;\n        if (sum <= 9 || i == 0) {\n            results.insert(0, std::to_string(sum));\n        }\n        else {\n            results.insert(0, std::to_string(sum % 10));\n            carry = 1;\n        }\n    }\n    return BigNumber(results);\n}\n\nBigNumber BigNumber::addll(const long long &other) {\n    return this->add(BigNumber(other));\n}\n\nBigNumber BigNumber::addstr(const std::string &other) {\n    return this->add(BigNumber(other));\n}\n\n\nBigNumber BigNumber::subtract(BigNumber other) {\n    BigNumber b1 = *this, b2 = other;\n    if (b1.isNegative() || b2.isNegative()) {\n        if (b1.isNegative() && b2.isNegative()) {\n            return b1.negate().add(b2.negate()).negate();\n        }\n        else if (b1.isNegative() && !b2.isNegative()) {\n            return b1.negate().add(b2).negate();\n        }\n        else {\n            return b2.negate().add(b1);\n        }\n    }\n    std::string results;\n    int n = 0, p = 0;\n    bool takeOffOne = false;\n    bool shouldBeTen = false;\n\n    if (b1 < b2) {\n        //Negative answer\n        std::string t = b2.subtract(*this).negate().getString();\n        for (unsigned int i = 1; i < t.length(); ++i) {\n            if (t[i] != '0') break;\n            t.erase(1, 1);\n        }\n        return BigNumber(t);\n    }\n\n    //This next if-block fixes the case where the digit difference is greater than 1\n    //100 - 5 is an example. This code adds 0's to make it, for example, 100 - 05, which\n    //allows the rest of the subtraction code to work.\n    if (b1._numberString.size() - b2.getString().size() > 1) {\n        for (unsigned long i = 0; i < b1._numberString.size() - b2.getString().size() - 1; ++i) {\n            b2._numberString.insert(b2._numberString.begin(), '0');\n        }\n    }\n    int i = int(b1._numberString.size() - 1);\n    for (int j = int(b2._numberString.size() - 1); j >= 0; --j) {\n        if (((b1._numberString[i] - '0') < (b2._numberString[j] - '0')) && i > 0) {\n            n = char((b1._numberString[i] - '0') + 10);\n            takeOffOne = true;\n            if (j > 0 || b1._numberString[i - 1] != '0') {\n                p = char((b1._numberString[i - 1] - '0') - 1);\n                if (p == -1) {\n                    p = 9;\n                    shouldBeTen = true;\n                }\n                takeOffOne = false;\n            }\n            if (shouldBeTen) {\n                int index = i - 1;\n                for (int a = i - 1; (b1._numberString[a] - '0') == 0; --a) {\n                    b1._numberString[a] = static_cast<char>(p + '0');\n                    --index;\n                }\n                int t = (b1._numberString[index] - '0') - 1;\n                b1._numberString[index] = static_cast<char>(t + '0');\n            }\n            b1._numberString[i - 1] = static_cast<char>(p + '0');\n            shouldBeTen = false;\n        }\n        std::stringstream ss;\n        if (((b1._numberString[i] - '0') == (b2._numberString[j] - '0'))) {\n            ss << \"0\";\n        }\n        else {\n            if (n <= 0) {\n                ss << ((b1._numberString[i] - '0') - (b2._numberString[j] - '0'));\n            }\n            else {\n                ss << (n - (b2._numberString[j] - '0'));\n            }\n        }\n\n        results.insert(0, ss.str());\n        --i;\n        n = 0;\n    }\n    if (takeOffOne) {\n        std::string number = \"\";\n        for (int j = b1._numberString.length() - b2._numberString.length() - 1; j >= 0; --j) {\n            if (b1._numberString[j] == '0') {\n                number += \"0\";\n                continue;\n            }\n            else {\n                number.insert(number.begin(), b1._numberString[j]);\n                int t = atoi(number.c_str());\n                --t;\n                b1._numberString.replace(0, number.size(), std::to_string(t));\n                break;\n            }\n        }\n    }\n    while (i >= 0) {\n        std::stringstream ss;\n        if (i == 0) {\n            if (b1._numberString[i] - '0' != 0) {\n                ss << (b1._numberString[i] - '0');\n                results.insert(0, ss.str());\n            }\n        }\n        else {\n            ss << (b1._numberString[i] - '0');\n            results.insert(0, ss.str());\n        }\n\n        --i;\n    }\n    //In the case of all 0's, we only want to return one of them\n    if (results.find_first_not_of('0') == std::string::npos) {\n        results = \"0\";\n    }\n    else if (results[0] == '0') {\n        int index = results.find_first_not_of('0');\n        results = results.substr(index, results.length() - 1);\n    }\n    return BigNumber(results);\n}\n\nBigNumber BigNumber::subtractll(const long long &other) {\n    return this->subtract(BigNumber(other));\n}\n\nBigNumber BigNumber::subtractstr(const std::string &other) {\n    return this->subtract(BigNumber(other));\n}\n\nBigNumber BigNumber::multiply(BigNumber other) {\n    BigNumber b1 = other > *this ? other : *this;\n    BigNumber b2 = other > *this ? *this : other;\n    if (b1.isNegative() || b2.isNegative()) {\n        if (b1.isNegative() && b2.isNegative()) {\n            return b1.negate().multiply(b2.negate());\n        }\n        else if (b1.isNegative() && !b2.isNegative()) {\n            return b1.negate().multiply(b2).negate();\n        }\n        else {\n            return b2.negate().multiply(b1).negate();\n        }\n    }\n    if (b1 == 0 || b2 == 0) return 0;\n    int carry = 0;\n    int zeroCounter = 0;\n    BigNumber b = 0;\n    \n    for (unsigned int i = 0; i < b1._numberString.size() - b2._numberString.size(); ++i) {\n        b2._numberString.insert(b2._numberString.begin(), '0');\n    }\n    for (long long int i = (b2._numberString.size() - 1); i >= 0; --i) {\n        std::string rr;\n        for (long long int j = int(b1._numberString.size() - 1); j >= 0; --j) {\n            int val = ((b2._numberString[i] - '0') * (b1._numberString[j] - '0')) + carry;\n            carry = 0;\n            if (val > 9 && j != 0) {\n                carry = val / 10;\n                rr.insert(0, std::to_string(val % 10));\n            }\n            else {\n                rr.insert(0, std::to_string(val));\n            }\n        }\n        if (zeroCounter > 0) {\n            for (int x = 0; x < zeroCounter; ++x) {\n                rr.append(\"0\");\n            }\n        }\n        ++zeroCounter;\n        b += BigNumber(rr);\n    }\n    if (b._numberString.find_first_not_of('0') != std::string::npos) {\n        b.setString(b._numberString.erase(0, b._numberString.find_first_not_of('0')));\n    }\n    else {\n        //In the case of all 0's, we only want to return one of them\n        b.setString(\"0\");\n    }\n    return b;\n}\n\nBigNumber BigNumber::multiplyll(const long long &other) {\n    if (other == 0)\n        return 0;\n    if (other == 1)\n        return *this;\n    auto original = *this;\n    for (auto i = 0; i < other - 1; ++i) {\n        *this += original;\n    }\n    return *this;\n}\n\nBigNumber BigNumber::multiplystr(const std::string &other) {\n    return this->multiply(BigNumber(other));\n}\n\nBigNumber BigNumber::divide(BigNumber other) {\n    if (other == 0) {\n        std::cerr << \"You cannot divide by 0!\" << std::endl;\n    }\n    BigNumber b1 = *this, b2 = other;\n    bool sign = false;\n    if (b1.isNegative() && b2.isNegative()) {\n        b1.negate();\n        b2.negate();\n    }\n    else if (b1.isNegative() && !b2.isNegative()) {\n        b1.negate();\n        sign = true;\n    }\n    else if (!b1.isNegative() && b2.isNegative()) {\n        b2.negate();\n        sign = true;\n    }\n    BigNumber quotient = 0;\n    while (b1 >= b2) {\n        b1 -= b2;\n        ++quotient;\n    }\n    if (sign) quotient.negate();\n    return quotient;\n}\n\nBigNumber BigNumber::dividell(const long long &other) {\n    return this->divide(BigNumber(other));\n}\n\nBigNumber BigNumber::dividestr(const std::string &other) {\n    return this->divide(BigNumber(other));\n}\n\nBigNumber BigNumber::pow(int exponent) {\n    if (exponent < 0) std::cerr << \"Powers less than 0 are not supported\" << std::endl;\n    if (exponent == 0) return BigNumber(\"1\");\n    if (exponent == 1) return *this;\n    BigNumber result = 1, base = *this;\n    while (exponent) {\n        if (exponent & 1) {\n            result *= base;\n        }\n        exponent >>= 1;\n        base *= base;\n    }\n    return result;\n}\n\nstd::string BigNumber::getString() {\n    return this->_numberString;\n}\n\nBigNumber BigNumber::setString(const std::string &newStr) {\n    this->_numberString = newStr;\n    return *this;\n}\n\nBigNumber BigNumber::negate() {\n    if (this->_numberString[0] == '-') {\n        this->_numberString.erase(0, 1);\n    }\n    else {\n        this->_numberString.insert(this->_numberString.begin(), '-');\n    }\n    return *this;\n}\n\nBigNumber BigNumber::trimLeadingZeros() {\n    BigNumber b = *this;\n    if (b._numberString.find_first_not_of('0') != std::string::npos) {\n        b.setString(b._numberString.erase(0, b._numberString.find_first_not_of('0')));\n    }\n    return b;\n}\n\nbool BigNumber::equals(const BigNumber &other) {\n    return this->_numberString == other._numberString;\n}\n\nbool BigNumber::equals(const long long &other) {\n    return this->getString() == std::to_string(other);\n}\n\nbool BigNumber::equals(const std::string &other) {\n    return this->getString() == other;\n}\n\nunsigned int BigNumber::digits() {\n    return this->_numberString.length() - static_cast<int>(this->isNegative());\n}\n\nbool BigNumber::isNegative() const {\n    return this->_numberString[0] == '-';\n}\n\nbool BigNumber::isPositive() {\n    return !this->isNegative();\n}\n\nbool BigNumber::isEven() {\n    return this->_numberString[this->_numberString.length() - 1] % 2 == 0;\n}\n\nbool BigNumber::isOdd() {\n    return !this->isEven();\n}\n\nBigNumber BigNumber::abs() const {\n    return BigNumber(this->_numberString.substr(static_cast<unsigned int>(this->isNegative())));\n}\n\nstd::ostream &operator<<(std::ostream &os, const BigNumber &num) {\n    os << num._numberString;\n    return os;\n}\n\nBigNumber operator+(BigNumber b1, const BigNumber &b2) {\n    return b1.add(b2);\n}\n\nBigNumber operator+(BigNumber b1, const long long &b2) {\n    return b1.addll(b2);\n}\n\nBigNumber operator+(BigNumber b1, const std::string &b2) {\n    return b1.addstr(b2);\n}\n\nBigNumber operator-(BigNumber b1, const BigNumber &b2) {\n    return b1.subtract(b2);\n}\n\nBigNumber operator-(BigNumber b1, const long long &b2) {\n    return b1.subtractll(b2);\n}\n\nBigNumber operator-(BigNumber b1, const std::string &b2) {\n    return b1.subtractstr(b2);\n}\n\nBigNumber operator*(BigNumber b1, const BigNumber &b2) {\n    return b1.multiply(b2);\n}\n\nBigNumber operator*(BigNumber b1, const long long &b2) {\n    return b1.multiplyll(b2);\n}\n\nBigNumber operator*(BigNumber b1, const std::string &b2) {\n    return b1.multiplystr(b2);\n}\n\nBigNumber operator/(BigNumber b1, const BigNumber &b2) {\n    return b1.divide(b2);\n}\n\nBigNumber operator/(BigNumber b1, const long long &b2) {\n    return b1.dividell(b2);\n}\n\nBigNumber operator/(BigNumber b1, const std::string &b2) {\n    return b1.dividestr(b2);\n}\n\nBigNumber operator^(BigNumber b1, const int &b2) {\n    return b1.pow(b2);\n}\n\nbool operator==(BigNumber b1, const BigNumber &b2) {\n    return b1.equals(b2);\n}\n\nbool operator==(BigNumber b1, const long long &b2) {\n    return b1.equals(b2);\n}\n\nbool operator==(BigNumber b1, const std::string &b2) {\n    return b1.equals(b2);\n}\n\nbool operator>(BigNumber b1, const BigNumber &b2) {\n    if (b1.isNegative() || b2.isNegative()) {\n        if (b1.isNegative() && b2.isNegative()) {\n            BigNumber bt = b2;\n            b1._numberString.erase(0, 1);\n            bt._numberString.erase(0, 1);\n            return b1 < bt;\n        }\n        else {\n            return !(b1.isNegative() && !b2.isNegative());\n        }\n    }\n    b1 = b1.trimLeadingZeros();\n    auto c = BigNumber(b2);\n    c = c.trimLeadingZeros();\n    if (b1 == c) {\n        return false;\n    }\n    if (b1._numberString.size() > c._numberString.size()) {\n        return true;\n    }\n    else if (c._numberString.size() > b1._numberString.size()) {\n        return false;\n    }\n    else {\n        for (unsigned int i = 0; i < b1._numberString.size(); ++i) {\n            if (b1[i] == static_cast<unsigned int>(c._numberString[i] - '0')) {\n                continue;\n            }\n            return b1[i] > static_cast<unsigned int>(c._numberString[i] - '0');\n        }\n    }\n    return false;\n}\n\nbool operator<(BigNumber b1, const BigNumber &b2) {\n    return !(b1 == b2) && !(b1 > b2);\n}\n\nbool operator>=(BigNumber b1, const BigNumber &b2) {\n    return b1 > b2 || b1 == b2;\n}\n\nbool operator<=(BigNumber b1, const BigNumber &b2) {\n    return b1 < b2 || b1 == b2;\n}\n\nunsigned int BigNumber::operator[](int index) {\n    if (this->_numberString[index] == '-') {\n        std::cerr << \"You cannot get the negative sign from the number\" << std::endl;\n    }\n    return static_cast<unsigned int>(this->_numberString[index] - '0');\n}\n\nBigNumber& BigNumber::operator=(const BigNumber &other) {\n    this->_numberString = other._numberString;\n    return *this;\n}\n\nBigNumber& BigNumber::operator=(const long long &other) {\n    this->_numberString = std::to_string(other);\n    return *this;\n}\n\nBigNumber& BigNumber::operator=(const std::string &other) {\n    this->_numberString = other;\n    return *this;\n}\n\nBigNumber& BigNumber::operator+=(const BigNumber &other) {\n    *this = *this + other;\n    return *this;\n}\n\nBigNumber& BigNumber::operator+=(const long long &other) {\n    *this = *this + other;\n    return *this;\n}\n\nBigNumber& BigNumber::operator+=(const std::string &other) {\n    *this = *this + other;\n    return *this;\n}\n\nBigNumber& BigNumber::operator-=(const BigNumber &other) {\n    *this = *this - other;\n    return *this;\n}\n\nBigNumber& BigNumber::operator-=(const long long &other) {\n    *this = *this - other;\n    return *this;\n}\n\nBigNumber& BigNumber::operator-=(const std::string &other) {\n    *this = *this - other;\n    return *this;\n}\n\nBigNumber& BigNumber::operator*=(const BigNumber &other) {\n    *this = *this * other;\n    return *this;\n}\n\nBigNumber& BigNumber::operator*=(const long long &other) {\n    *this = *this * other;\n    return *this;\n}\n\nBigNumber& BigNumber::operator*=(const std::string &other) {\n    *this = *this * other;\n    return *this;\n}\n\nBigNumber& BigNumber::operator/=(const BigNumber &other) {\n    *this = *this / other;\n    return *this;\n}\n\nBigNumber& BigNumber::operator/=(const long long &other) {\n    *this = *this / other;\n    return *this;\n}\n\nBigNumber& BigNumber::operator/=(const std::string &other) {\n    *this = *this / other;\n    return *this;\n}\n\nBigNumber& BigNumber::operator++() {\n    *this += BigNumber(\"1\");\n    return *this;\n}\n\nBigNumber& BigNumber::operator--() {\n    *this -= BigNumber(\"1\");\n    return *this;\n}\n\nBigNumber BigNumber::operator++(int) {\n    BigNumber t(this->getString());\n    ++(*this);\n    return t;\n}\n\nBigNumber BigNumber::operator--(int) {\n    BigNumber t(this->getString());\n    --(*this);\n    return t;\n}"
  },
  {
    "path": "examples/libraries/BigNumber/src/bignumber.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 Mark Guerra\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this\n * software and associated documentation files (the \"Software\"), to deal in the Software\n * without restriction, including without limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons\n * to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE\n * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF\n * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#ifndef BIGNUMBER_H\n#define BIGNUMBER_H\n\n#include <vector>\n#include <string>\n#include <iostream>\n\n/**\n * BigNumber class\n */\nclass BigNumber {\npublic:\n    //@{\n    /**\n     * BigNumber constructor\n     * @param number - The initial value of the BigNumber\n     */\n    BigNumber(std::string number);\n    BigNumber(long long number);\n    //@}\n\n    /**\n     * Add another BigNumber to the current instance\n     * @param other - The other BigNumber\n     * @return The sum of the two BigNumbers\n     */\n    BigNumber add(BigNumber other);\n\n    /**\n     * Subtract another BigNumber from the current instance\n     * @param other - The other BigNumber\n     * @return The difference of the two BigNumbers\n     */\n    BigNumber subtract(BigNumber other);\n\n    /**\n     * Multiply the current instance by another BigNumber\n     * @param other - The other BigNumber\n     * @return The product of the two BigNumbers\n     */\n    BigNumber multiply(BigNumber other);\n    \n    /**\n     * Divide the current instance by another BigNumber\n     * @param other - The other BigNumber\n     * @return The quotient of the two BigNumbers\n     */\n    BigNumber divide(BigNumber other);\n\n    /**\n     * Raise the current instance to the power of an exponent\n     * @param exponent - The power to be raised by\n     * @return - The resulting BigNumber after exponentiation\n     */\n    BigNumber pow(int exponent);\n\n    /**\n     * Get the string value of the current instance\n     * @return The BigNumber as a string\n     */\n    std::string getString();\n\n    /**\n     * Set the value of the current instance with a string\n     * @param newStr - The new value for the BigNumber\n     * @return The BigNumber with the new value\n     */\n    BigNumber setString(const std::string &newStr);\n\n    /**\n     * Negates the current instance\n     * @return The BigNumber after negation\n     */\n    BigNumber negate();\n    \n    BigNumber trimLeadingZeros();\n\n    //@{\n    /**\n     * Check if another BigNumber is equal to the current instance\n     * @param other - The other BigNumber\n     * @return True if equal, otherwise false\n     */\n    bool equals(const BigNumber &other);\n    bool equals(const long long &other);\n    bool equals(const std::string &other);\n    //@}\n\n    /**\n     * Get the number of digits in the current instance\n     * @return The number of digits\n     */\n    unsigned int digits();\n\n    /**\n     * Get whether or not the current instance is a negative number\n     * @return True if negative, otherwise false\n     */\n    bool isNegative() const;\n\n    /**\n     * Get whether or not the current instance is a positive number\n     * @return True if positive, otherwise false\n     */\n    bool isPositive();\n\n    /**\n     * Get whether or not the current instance is an even number\n     * @return True if even, otherwise false\n     */\n    bool isEven();\n\n    /**\n     * Get whether or not the current instance is an odd number\n     * @return True if odd, otherwise false\n     */\n    bool isOdd();\n\n    /**\n     * Get the absolute value of the current instance\n     * @return The absolute value of the BigNumber\n     */\n    BigNumber abs() const;\n    \n    /**\n     * Output stream operator\n     * @param os The output stream\n     * @param num The current instance\n     * @return The output stream with the current instance\n     */\n    friend std::ostream &operator<<(std::ostream &os, const BigNumber &num);\n    \n    //@{\n    /**\n     * Addition operator\n     * @param b1 - The current instance\n     * @param b2 - The number being added\n     * @return The sum of the two numbers\n     */\n    friend BigNumber operator+(BigNumber b1, const BigNumber &b2);\n    friend BigNumber operator+(BigNumber b1, const long long &b2);\n    friend BigNumber operator+(BigNumber b1, const std::string &b2);\n    //@}\n    \n    //@{\n    /**\n     * Subtraction operator\n     * @param b1 - The current instance\n     * @param b2 - The number being subtracted\n     * @return The difference of the two numbers\n     */\n    friend BigNumber operator-(BigNumber b1, const BigNumber &b2);\n    friend BigNumber operator-(BigNumber b1, const long long &b2);\n    friend BigNumber operator-(BigNumber b1, const std::string &b2);\n    //@}\n    \n    //@{\n    /**\n     * Multiplication operator\n     * @param b1 - The current instance\n     * @param b2 - The number being multiplied by\n     * @return The product of the two numbers\n     */\n    friend BigNumber operator*(BigNumber b1, const BigNumber &b2);\n    friend BigNumber operator*(BigNumber b1, const long long &b2);\n    friend BigNumber operator*(BigNumber b1, const std::string &b2);\n    //@}\n    \n    //@{\n    /**\n     * Division operator\n     * @param b1 - The current instance\n     * @param b2 - The number being divided by\n     * @return The quotient of the two numbers\n     */\n    friend BigNumber operator/(BigNumber b1, const BigNumber &b2);\n    friend BigNumber operator/(BigNumber b1, const long long &b2);\n    friend BigNumber operator/(BigNumber b1, const std::string &b2);\n    //@}\n    \n    /**\n     * Exponent operator\n     * @param b1 - The current instance\n     * @param b2 - The exponent\n     * @return The value after exponentiation\n     */\n    friend BigNumber operator^(BigNumber b1, const int &b2);\n    \n    //@{\n    /**\n     * Equality operator\n     * @param b1 - The current instance\n     * @param b2 - Another value\n     * @return True if equal, otherwise false\n     */\n    friend bool operator==(BigNumber b1, const BigNumber &b2);\n    friend bool operator==(BigNumber b1, const long long &b2);\n    friend bool operator==(BigNumber b1, const std::string &b2);\n    //@}\n    \n    /**\n     * Greater-than operator\n     * @param b1 - The current instance\n     * @param b2 - Another BigNumber\n     * @return True if current instance is greater, otherwise false\n     */\n    friend bool operator>(BigNumber b1, const BigNumber &b2);\n    \n    /**\n     * Less-than operator\n     * @param b1 - The current instance\n     * @param b2 - Another BigNumber\n     * @return True if current instance is less, otherwise false\n     */\n    friend bool operator<(BigNumber b1, const BigNumber &b2);\n    \n    /**\n     * Greater-than or equal-to operator\n     * @param b1 - The current instance\n     * @param b2 - Another BigNumber\n     * @return True if current instance is greater or equal, otherwise false\n     */\n    friend bool operator>=(BigNumber b1, const BigNumber &b2);\n    \n    /**\n     * Less-than or equal-to operator\n     * @param b1 - The current instance\n     * @param b2 - Another BigNumber\n     * @return True if current instance is less or equal, otherwise false\n     */\n    friend bool operator<=(BigNumber b1, const BigNumber &b2);\n\n    //@{\n    /**\n     * Assignment operator\n     * @param other - The new value for the BigNumber\n     * @return A BigNumber containing the new value\n     */\n    BigNumber& operator=(const BigNumber &other);\n    BigNumber& operator=(const long long &other);\n    BigNumber& operator=(const std::string &other);\n    //@}\n    \n    //@{\n    /**\n     * Addition assignment operator\\n\n     * Adds and assigns a value to the current instance\n     * @param other - The value being added\n     * @return The new value after addition and assignment\n     */\n    BigNumber& operator+=(const BigNumber &other);\n    BigNumber& operator+=(const long long &other);\n    BigNumber& operator+=(const std::string &other);\n    //@}\n    \n    //@{\n    /**\n     * Subtraction assignment operator\\n\n     * Subtracts and assigns a value to the current instance\n     * @param other - The value being subtracted\n     * @return The new value after subtraction and assignment\n     */\n    BigNumber& operator-=(const BigNumber &other);\n    BigNumber& operator-=(const long long &other);\n    BigNumber& operator-=(const std::string &other);\n    //@}\n    \n    //@{\n    /**\n     * Multiplication assignment operator\\n\n     * Multiplies and assigns a value to the current instance\n     * @param other - The value being multiplied\n     * @return The new value after multiplication and assignment\n     */\n    BigNumber& operator*=(const BigNumber &other);\n    BigNumber& operator*=(const long long &other);\n    BigNumber& operator*=(const std::string &other);\n    //@}\n    \n    //@{\n    /**\n     * Division assignment operator\\n\n     * Divides and assigns a value to the current instance\n     * @param other - The value being divided\n     * @return The new value after division and assignment\n     */\n    BigNumber& operator/=(const BigNumber &other);\n    BigNumber& operator/=(const long long &other);\n    BigNumber& operator/=(const std::string &other);\n    //@}\n\n    /**\n     * Pre-increment operator\n     * @return The incremented BigNumber\n     */\n    BigNumber& operator++();\n    \n    /**\n     * Pre-decrement operator\n     * @return The decremented BigNumber\n     */\n    BigNumber& operator--();\n    \n    /**\n     * Post-increment operator\n     * @return The incremented BigNumber\n     */\n    BigNumber operator++(int);\n    \n    /**\n     * Post-decrement operator\n     * @return The decremented BigNumber\n     */\n    BigNumber operator--(int);\n\n    /**\n     * The index operator\n     * @param index The position being looked at\n     * @return The number at the specified position in the BigNumber string\n     */\n    unsigned int operator[](int index);\n\nprivate:\n    std::string _numberString;      //The big number represented as a string\n\n    //Methods\n    BigNumber addll(const long long &other);\n    BigNumber addstr(const std::string &other);\n    BigNumber subtractll(const long long &other);\n    BigNumber subtractstr(const std::string  &other);\n    BigNumber multiplyll(const long long &other);\n    BigNumber multiplystr(const std::string &other);\n    BigNumber dividell(const long long &other);\n    BigNumber dividestr(const std::string &other);\n};\n\n\n\n#endif"
  },
  {
    "path": "examples/libraries/GSL/.clang-format",
    "content": "ColumnLimit: 100\n\nUseTab: Never\nIndentWidth: 4\nAccessModifierOffset: -4\nNamespaceIndentation: Inner\n\nBreakBeforeBraces: Custom\nBraceWrapping:\n  AfterNamespace: true\n  AfterEnum: true\n  AfterStruct: true\n  AfterClass: true\n  SplitEmptyFunction: false\n  AfterControlStatement: true\n  AfterFunction: true\n  AfterUnion: true\n  BeforeElse: true\n\n\nAlwaysBreakTemplateDeclarations: true\nBreakConstructorInitializersBeforeComma: true\nConstructorInitializerAllOnOneLineOrOnePerLine: true\nAllowShortBlocksOnASingleLine: true\nAllowShortFunctionsOnASingleLine: All\nAllowShortIfStatementsOnASingleLine: true\nAllowShortLoopsOnASingleLine: true\n\nPointerAlignment: Left\nAlignConsecutiveAssignments: false\nAlignTrailingComments: true\n\nSpaceAfterCStyleCast: true\nCommentPragmas: '^ NO-FORMAT:'\n"
  },
  {
    "path": "examples/libraries/GSL/.github/workflows/main.yml",
    "content": "name: CI\non:\n  push:\n    branches: [ master ]\n  pull_request:\n    branches: [ master ]\n\njobs:\n  iOS:\n    runs-on: macos-latest\n    defaults:\n      run:\n        working-directory: build\n    steps:\n      - uses: actions/checkout@v2\n\n      - name: Create build directory\n        run: mkdir -p build\n        working-directory: .\n\n      - name: Configure\n        run: |\n          cmake \\\n            -GXcode \\\n            -DCMAKE_SYSTEM_NAME=iOS \\\n            \"-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64\" \\\n            -DCMAKE_OSX_DEPLOYMENT_TARGET=8 \\\n            -DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY \\\n            \"-DMACOSX_BUNDLE_GUI_IDENTIFIER=GSL.\\$(EXECUTABLE_NAME)\" \\\n            -DMACOSX_BUNDLE_BUNDLE_VERSION=3.0.1 \\\n            -DMACOSX_BUNDLE_SHORT_VERSION_STRING=3.0.1 \\\n            ..\n\n      - name: Build\n        run: cmake --build . --parallel `sysctl -n hw.ncpu` --config Release -- -sdk iphonesimulator\n\n      - name: Start simulator\n        run: |\n          RUNTIME=`xcrun simctl list runtimes iOS -j|jq '.runtimes|last.identifier'`\n          UDID=`xcrun simctl list devices iPhone available -j|jq -r \".devices[$RUNTIME]|last.udid\"`\n          xcrun simctl bootstatus $UDID -b\n\n      - name: Test\n        run: |\n          for TEST in `find tests/Release-iphonesimulator -depth 1 -name \"*.app\"`\n          do\n            xcrun simctl install booted $TEST\n            TEST_ID=`plutil -convert json -o - $TEST/Info.plist|jq -r \".CFBundleIdentifier\"`\n            xcrun simctl launch --console booted $TEST_ID\n            xcrun simctl uninstall booted $TEST_ID\n          done\n\n  Android:\n    runs-on: macos-latest\n    defaults:\n      run:\n        working-directory: build\n    steps:\n      - uses: actions/checkout@v2\n\n      - name: Create build directory\n        run: mkdir -p build\n        working-directory: .\n\n      - name: Start emulator\n        run: |\n          echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager --install 'system-images;android-24;default;x86_64'\n          echo \"no\" | $ANDROID_HOME/tools/bin/avdmanager create avd -n xamarin_android_emulator -k 'system-images;android-24;default;x86_64' --force\n          $ANDROID_HOME/emulator/emulator -list-avds\n          echo \"Starting emulator\"\n          # Start emulator in background\n          nohup $ANDROID_HOME/emulator/emulator -avd xamarin_android_emulator -no-snapshot > /dev/null 2>&1 &\n          echo \"Emulator starting\"\n\n      - name: Configure\n        run: cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_HOME/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=16 -DANDROID_ABI=x86_64 -DCMAKE_BUILD_TYPE=Debug ..\n\n      - name: Build\n        run: cmake --build . --parallel\n\n      - name: Wait for emulator ready\n        run: |\n          $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\\r') ]]; do sleep 10; done; input keyevent 82'\n          $ANDROID_HOME/platform-tools/adb devices\n          $ANDROID_HOME/platform-tools/adb shell getprop ro.product.cpu.abi\n          echo \"Emulator started\"\n\n      - name: Deploy tests\n        run: |\n          adb push tests /data/local/tmp\n          adb shell find /data/local/tmp/tests -maxdepth 1 -exec chmod +x {} \\\\\\;\n\n      - name: Test\n        run: adb shell find /data/local/tmp/tests -name \"*_tests\" -maxdepth 1 -exec {} \\\\\\;"
  },
  {
    "path": "examples/libraries/GSL/.gitignore",
    "content": "CMakeFiles\nbuild\ntests/CMakeFiles\ntests/Debug\n*.opensdf\n*.sdf\ntests/*tests.dir\n*.vcxproj\n*.vcxproj.filters\n*.sln\n*.tlog\nTesting/Temporary/*.*\nCMakeCache.txt\n*.suo\n.vs/\n.vscode/\n"
  },
  {
    "path": "examples/libraries/GSL/.travis.yml",
    "content": "\nlanguage: cpp\nnotifications:\n  email: false\n\n# Use Linux unless specified otherwise\nos: linux\ndist: bionic\n\ncache:\n  directories:\n    - ${TRAVIS_BUILD_DIR}/deps\n\nstages:\n  - name: Latest     # build jobs to run first and always\n  - name: Validation # run other jobs\n  - name: Legacy     # build with all other supported compilers\n\njobs:\n  include:\n\n    ##########################################################################\n    # Validate CMake configuration\n    ##########################################################################\n\n    - name: CMake 3.1.3 - latest\n      stage: Validation\n      env: &CMAKE_VERSION_LIST\n      - CMAKE_VERSION: '\"3.17.0 3.16.5 3.15.7 3.14.7 3.13.5 3.12.4 3.11.4 3.10.3 3.9.6 3.8.2 3.7.2 3.6.3 3.5.2 3.4.3 3.3.2 3.2.3 3.1.3\"'\n      - GSL_CXX_STANDARD: 14\n      addons: # Get latest release (candidate)\n        apt:\n          sources:\n          - sourceline: 'deb https://apt.kitware.com/ubuntu/ bionic main'\n            key_url: 'https://apt.kitware.com/keys/kitware-archive-latest.asc'\n          - sourceline: 'deb https://apt.kitware.com/ubuntu/ bionic-rc main'\n          packages:\n          - cmake\n      script:\n      - |\n        cd ./build\n        ( set -eu\n          for CMAKE in ${CMAKE_path[@]}; do test_CMake_generate $CMAKE; done\n          export CXX=clang++\n          for CMAKE in ${CMAKE_path[@]}; do test_CMake_generate $CMAKE; done\n        )\n\n    - name: CMake 3.2.3 - 3.17.0\n      stage: Validation\n      os: osx\n      osx_image: xcode11.3\n      env:\n      - CMAKE_VERSION: '\"3.17.0 3.16.5 3.15.7 3.14.7 3.13.5 3.12.4 3.11.4 3.10.3 3.9.6 3.8.2 3.7.2 3.6.3 3.5.2 3.4.3 3.3.2 3.2.3\"'\n      script:\n      - |\n        cd ./build\n        ( set -eu\n          for CMAKE in ${CMAKE_path[@]}; do test_CMake_generate $CMAKE; done\n        )\n\n    ##########################################################################\n    # AppleClang on OSX\n    ##########################################################################\n\n    # Xcode 8.3\n    - name: AppleClang Xcode-8.3 C++14 Debug\n      stage: Legacy\n      env: BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n      os: osx\n      osx_image: xcode8.3\n    - name: AppleClang Xcode-8.3 C++14 Release\n      env: BUILD_TYPE=Release GSL_CXX_STANDARD=14\n      os: osx\n      osx_image: xcode8.3\n\n    # Xcode 9.0 earliest C++17 support\n    - name: AppleClang Xcode-9.0 C++17 Debug\n      env: BUILD_TYPE=Debug GSL_CXX_STANDARD=17\n      os: osx\n      osx_image: xcode9 # AppleClang 9.1.0 same compiler in Xcode 9.0, 9.1 and 9.2\n    - name: AppleClang Xcode-9.0 C++17 Release\n      env: BUILD_TYPE=Release GSL_CXX_STANDARD=17\n      os: osx\n      osx_image: xcode9\n    - name: AppleClang Xcode-9.0 C++14 Debug\n      env: BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n      os: osx\n      osx_image: xcode9\n    - name: AppleClang Xcode-9.0 C++14 Release\n      env: BUILD_TYPE=Release GSL_CXX_STANDARD=14\n      os: osx\n      osx_image: xcode9\n\n    # Xcode 9.4\n    - name: AppleClang Xcode-9.4 C++14 Debug\n      env: BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n      os: osx\n      osx_image: xcode9.4 # AppleClang 9.1.0 same compiler as Xcode 9.3\n    - name: AppleClang Xcode-9.4 C++14 Release\n      env: BUILD_TYPE=Release GSL_CXX_STANDARD=14\n      os: osx\n      osx_image: xcode9.4\n    - name: AppleClang Xcode-9.4 C++17 Debug\n      env: BUILD_TYPE=Debug GSL_CXX_STANDARD=17\n      os: osx\n      osx_image: xcode9.4\n    - name: AppleClang Xcode-9.4 C++17 Release\n      env: BUILD_TYPE=Release GSL_CXX_STANDARD=17\n      os: osx\n      osx_image: xcode9.4\n\n    # Xcode 10.1\n    - name: AppleClang Xcode-10.1 C++14 Debug\n      env: BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n      os: osx\n      osx_image: xcode10.1 # AppleClang 10.0.0 same compiler as Xcode 10.0\n    - name: AppleClang Xcode-10.1 C++14 Release\n      env: BUILD_TYPE=Release GSL_CXX_STANDARD=14\n      os: osx\n      osx_image: xcode10.1\n    - name: AppleClang Xcode-10.1 C++17 Debug\n      env: BUILD_TYPE=Debug GSL_CXX_STANDARD=17\n      os: osx\n      osx_image: xcode10.1\n    - name: AppleClang Xcode-10.1 C++17 Release\n      env: BUILD_TYPE=Release GSL_CXX_STANDARD=17\n      os: osx\n      osx_image: xcode10.1\n\n    # Xcode 10.3\n    - name: AppleClang Xcode-10.3 C++14 Debug\n      env: BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n      os: osx\n      osx_image: xcode10.3 # AppleClang 10.0.1 same compiler as Xcode 10.2\n    - name: AppleClang Xcode-10.3 C++14 Release\n      env: BUILD_TYPE=Release GSL_CXX_STANDARD=14\n      os: osx\n      osx_image: xcode10.3\n    - name: AppleClang Xcode-10.3 C++17 Debug\n      env: BUILD_TYPE=Debug GSL_CXX_STANDARD=17\n      os: osx\n      osx_image: xcode10.3\n    - name: AppleClang Xcode-10.3 C++17 Release\n      env: BUILD_TYPE=Release GSL_CXX_STANDARD=17\n      os: osx\n      osx_image: xcode10.3\n\n    # Xcode 11.3\n    - name: AppleClang Xcode-11.3 C++17 Debug\n      stage: Latest\n      env: BUILD_TYPE=Debug GSL_CXX_STANDARD=17\n      os: osx\n      osx_image: xcode11.3 # AppleClang 11.0.0 linker update / same as Xcode 11.2\n    - name: AppleClang Xcode-11.3 C++17 Release\n      env: BUILD_TYPE=Release GSL_CXX_STANDARD=17\n      os: osx\n      osx_image: xcode11.3\n    - name: AppleClang Xcode-11.3 C++14 Debug\n      env: BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n      os: osx\n      osx_image: xcode11.3\n    - name: AppleClang Xcode-11.3 C++14 Release\n      env: BUILD_TYPE=Release GSL_CXX_STANDARD=14\n      os: osx\n      osx_image: xcode11.3\n\n    ##########################################################################\n    # Clang on Linux\n    ##########################################################################\n\n    # Clang 3.6\n    - name: Clang-3.6 C++14 Debug\n      stage: Legacy\n      dist: xenial\n      env: CXX=clang++-3.6 BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n      addons: &clang36\n        apt:\n          packages:\n            - clang-3.6\n    - name: Clang-3.6 C++14 Release\n      dist: xenial\n      env: CXX=clang++-3.6 BUILD_TYPE=Release GSL_CXX_STANDARD=14\n      addons: *clang36\n\n    # Clang 3.7\n    - name: Clang-3.7 C++14 Debug\n      dist: xenial\n      env: CXX=clang++-3.7 BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n      addons: &clang37\n        apt:\n          packages:\n            - clang-3.7\n    - name: Clang-3.7 C++14 Release\n      dist: xenial\n      env: CXX=clang++-3.7 BUILD_TYPE=Release GSL_CXX_STANDARD=14\n      addons: *clang37\n\n    # Clang 3.8\n    - name: Clang-3.8 C++14 Debug\n      dist: xenial\n      env: CXX=clang++-3.8 BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n      addons: &clang38\n        apt:\n          packages:\n            - clang-3.8\n    - name: Clang-3.8 C++14 Release\n      dist: xenial\n      env: CXX=clang++-3.8 BUILD_TYPE=Release GSL_CXX_STANDARD=14\n      addons: *clang38\n\n    # Clang 3.9\n    - name: Clang-3.9 C++14 Debug\n      env: CXX=clang++-3.9 BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n      addons: &clang39\n        apt:\n          packages:\n            - clang-3.9\n    - name: Clang-3.9 C++14 Release\n      env: CXX=clang++-3.9 BUILD_TYPE=Release GSL_CXX_STANDARD=14\n      addons: *clang39\n\n    # Clang 4.0\n    - name: Clang-4.0 C++14 Debug\n      env: CXX=clang++-4.0 BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n      addons: &clang40\n        apt:\n          packages:\n            - clang-4.0\n    - name: Clang-4.0 C++14 Release\n      env: CXX=clang++-4.0 BUILD_TYPE=Release GSL_CXX_STANDARD=14\n      addons: *clang40\n\n    # Clang 5.0\n    - name: Clang-5.0 C++14 Debug\n      env: CXX=clang++-5.0 BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n      addons: &clang50\n        apt:\n          packages:\n            - clang-5.0\n    - name: Clang-5.0 C++14 Release\n      env: CXX=clang++-5.0 BUILD_TYPE=Release GSL_CXX_STANDARD=14\n      addons: *clang50\n    - name: Clang-5.0 C++17 Debug\n      env: CXX=clang++-5.0 BUILD_TYPE=Debug GSL_CXX_STANDARD=17\n      addons: *clang50\n    - name: Clang 5.0 C++17 Release\n      env: CXX=clang++-5.0 BUILD_TYPE=Release GSL_CXX_STANDARD=17\n      addons: *clang50\n\n    # Clang 6.0\n    - name: Clang-6.0 C++14 Debug\n      env: CXX=clang++-6.0 BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n      addons: &clang60\n        apt:\n          packages:\n            - clang-6.0\n    - name: Clang 6.0 C++14 Release\n      env: CXX=clang++-6.0 BUILD_TYPE=Release GSL_CXX_STANDARD=14\n      addons: *clang60\n    - name: Clang-6.0 C++17 Debug\n      env: CXX=clang++-6.0 BUILD_TYPE=Debug GSL_CXX_STANDARD=17\n      addons: *clang60\n    - name: Clang 6.0 C++17 Release\n      env: CXX=clang++-6.0 BUILD_TYPE=Release GSL_CXX_STANDARD=17\n      addons: *clang60\n\n    # Clang 7 (default on Xenial and Bionic images)\n    - name: Clang-7 C++14 Debug\n      env: CXX=clang++ BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n    - name: Clang-7 C++14 Release\n      env: CXX=clang++ BUILD_TYPE=Release GSL_CXX_STANDARD=14\n    - name: Clang-7 C++17 Debug\n      env: CXX=clang++ BUILD_TYPE=Debug GSL_CXX_STANDARD=17\n    - name: Clang-7 C++17 Release\n      env: CXX=clang++ BUILD_TYPE=Release GSL_CXX_STANDARD=17\n\n    # Clang 8\n    - name: Clang-8 C++14 Debug\n      env: CXX=clang++-8 BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n      addons: &clang8\n        apt:\n          sources:\n          - sourceline: 'deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-8 main'\n            key_url: https://apt.llvm.org/llvm-snapshot.gpg.key\n          packages:\n          - clang-8\n    - name: Clang-8 C++14 Release\n      env: CXX=clang++-8 BUILD_TYPE=Release GSL_CXX_STANDARD=14\n      addons: *clang8\n    - name: Clang-8 C++17 Debug\n      env: CXX=clang++-8 BUILD_TYPE=Debug GSL_CXX_STANDARD=17\n      addons: *clang8\n    - name: Clang-8 C++17 Release\n      env: CXX=clang++-8 BUILD_TYPE=Release GSL_CXX_STANDARD=17\n      addons: *clang8\n\n    # Clang 9\n    - name: Clang-9 C++14 Debug\n      env: CXX=clang++-9 BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n      addons: &clang9\n        apt:\n          sources:\n          - sourceline: 'deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-9 main'\n            key_url: https://apt.llvm.org/llvm-snapshot.gpg.key\n          packages:\n          - clang-9\n    - name: Clang-9 C++14 Release\n      env: CXX=clang++-9 BUILD_TYPE=Release GSL_CXX_STANDARD=14\n      addons: *clang9\n    - name: Clang-9 C++17 Debug\n      env: CXX=clang++-9 BUILD_TYPE=Debug GSL_CXX_STANDARD=17\n      addons: *clang9\n    - name: Clang-9 C++17 Release\n      env: CXX=clang++-9 BUILD_TYPE=Release GSL_CXX_STANDARD=17\n      addons: *clang9\n\n    # Clang 10\n    - name: Clang-10 C++14 Debug\n      stage: Latest\n      env: CXX=clang++-10 BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n      addons: &clang10\n        apt:\n          sources:\n          - sourceline: 'deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-10 main'\n            key_url: https://apt.llvm.org/llvm-snapshot.gpg.key\n          packages:\n          - clang-10\n    - name: Clang-10 C++14 Release\n      env: CXX=clang++-10 BUILD_TYPE=Release GSL_CXX_STANDARD=14\n      addons: *clang10\n    - name: Clang-10 C++17 Debug\n      env: CXX=clang++-10 BUILD_TYPE=Debug GSL_CXX_STANDARD=17\n      addons: *clang10\n    - name: Clang-10 C++17 Release\n      env: CXX=clang++-10 BUILD_TYPE=Release GSL_CXX_STANDARD=17\n      addons: *clang10\n\n    ##########################################################################\n    # GCC on Linux\n    ##########################################################################\n\n    # GCC 5 (default on the Xenial image)\n    - name: GCC-5 C++14 Debug\n      stage: Legacy\n      dist: xenial\n      env: CXX=g++-5 BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n    - name: GCC-5 C++14 Release\n      dist: xenial\n      env: CXX=g++-5 BUILD_TYPE=Release GSL_CXX_STANDARD=14\n\n    # GCC 6\n    - name: GCC-6 C++14 Debug\n      env: CXX=g++-6 BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n      addons: &gcc6\n        apt:\n          packages: g++-6\n    - name: GCC-6 C++14 Release\n      env: CXX=g++-6 BUILD_TYPE=Release GSL_CXX_STANDARD=14\n      addons: *gcc6\n\n    # GCC 7 (default on the Bionic image)\n    - name: GCC-7 C++14 Debug\n      env: CXX=g++-7 BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n    - name: GCC-7 C++14 Release\n      env: CXX=g++-7 BUILD_TYPE=Release GSL_CXX_STANDARD=14\n    - name: GCC-7 C++17 Debug\n      env: CXX=g++-7 BUILD_TYPE=Debug GSL_CXX_STANDARD=17\n    - name: GCC-7 C++17 Release\n      env: CXX=g++-7 BUILD_TYPE=Release GSL_CXX_STANDARD=17\n\n    # GCC 8\n    - name: GCC-8 C++14 Debug\n      env: CXX=g++-8 BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n      addons: &gcc8\n        apt:\n          packages: g++-8\n    - name: GCC-8 C++14 Release\n      env: CXX=g++-8 BUILD_TYPE=Release GSL_CXX_STANDARD=14\n      addons: *gcc8\n    - name: GCC-8 C++17 Debug\n      env: CXX=g++-8 BUILD_TYPE=Debug GSL_CXX_STANDARD=17\n      addons: *gcc8\n    - name: GCC-8 C++17 Release\n      env: CXX=g++-8 BUILD_TYPE=Release GSL_CXX_STANDARD=17\n      addons: *gcc8\n\n    # GCC 9\n    - name: GCC-9 C++14 Debug\n      stage: Latest\n      env: CXX=g++-9 BUILD_TYPE=Debug GSL_CXX_STANDARD=14\n      addons: &gcc9\n        apt:\n          sources:\n          - sourceline: ppa:ubuntu-toolchain-r/test\n          packages:\n          - g++-9\n    - name: GCC-9 C++14 Release\n      env: CXX=g++-9 BUILD_TYPE=Release GSL_CXX_STANDARD=14\n      addons: *gcc9\n    - name: GCC-9 C++17 Debug\n      env: CXX=g++-9 BUILD_TYPE=Debug GSL_CXX_STANDARD=17\n      addons: *gcc9\n    - name: GCC-9 C++17 Release\n      env: CXX=g++-9 BUILD_TYPE=Release GSL_CXX_STANDARD=17\n      addons: *gcc9\n\nbefore_install:\n  - |\n    # Configuration\n    JOBS=2 # Travis machines have 2 cores\n    # Dependencies required by the CI (cached directory)\n    DEPS_DIR=\"${TRAVIS_BUILD_DIR}/deps\"\n  - |\n    # Setup\n    mkdir -p \"${DEPS_DIR:?}\" && cd \"${DEPS_DIR:?}\"\n    mkdir -p ~/tools && cd ~/tools\n    if [[ ${TRAVIS_OS_NAME:?} == \"osx\" ]]; then\n      export PATH=\"/usr/local/opt/coreutils/libexec/gnubin:$PATH\"\n    fi\n  - |\n    # Helper functions\n    # usage: if [[ $(check_url '<url>') ]]; then ...\n    function check_url {( set +e\n      if [[ \"$1\" =~ 'github.com' ]]; then # check for first byte\n        if curl --fail --silent --output /dev/null --connect-timeout 12 --range 0-0 \"$1\"\n        then echo true; fi\n      else # request head\n        if curl --fail --silent --output /dev/null --connect-timeout 12 --head \"$1\"\n        then echo true; fi\n      fi\n      return\n    )}\n\ninstall:\n  ############################################################################\n  # Install a different CMake version (or several)\n  ############################################################################\n  - |\n    # Install CMake versions\n    ( set -euo pipefail\n      if [[ ${CMAKE_VERSION:-} ]]; then\n        if [[ \"${TRAVIS_OS_NAME}\" == \"linux\" ]]; then\n          OS=\"Linux\"; EXT=\"sh\"\n          if [[ ! (\"${CMAKE_VERSION:-}\" =~ .+[' '].+) ]]; then\n            # Single entry -> default CMake version\n            CMAKE_DEFAULT_DIR=\"/usr/local\"\n          fi\n        elif [[ \"${TRAVIS_OS_NAME}\" == \"osx\" ]]; then OS=\"Darwin\"; EXT=\"tar.gz\"\n        else echo \"CMake install not supported for this OS.\"; exit 1\n        fi\n        CMAKE_INSTALLER=\"install-cmake.${EXT}\"\n      fi\n      for VERSION in ${CMAKE_VERSION:-}; do\n        CMAKE_URL=\"https://github.com/Kitware/CMake/releases/download/v${VERSION}/cmake-${VERSION}-${OS}-x86_64.${EXT}\"\n        if [[ $(check_url \"$CMAKE_URL\") ]]; then\n          curl -sSL ${CMAKE_URL} -o ${CMAKE_INSTALLER}\n          CMAKE_DIR=\"${CMAKE_DEFAULT_DIR:-\"${HOME}/tools/cmake-${VERSION}\"}\"\n          mkdir -p ${CMAKE_DIR}\n          if [[ \"${TRAVIS_OS_NAME}\" == \"linux\" ]]; then\n            chmod +x ${CMAKE_INSTALLER}\n            sudo ./${CMAKE_INSTALLER} --prefix=${CMAKE_DIR} --skip-license\n          else # OSX\n            mkdir -p ./CMake_tmp\n            tar --extract --gzip --file=${CMAKE_INSTALLER} --directory=./CMake_tmp\n            mv ./CMake_tmp/*/CMake.app/Contents/* ${CMAKE_DIR}\n          fi\n          rm --recursive --force ./CMake_tmp ${CMAKE_INSTALLER}\n        else echo 'Invalid url!'; echo \"Version: ${VERSION}\"\n        fi\n      done\n    )\n    if [[ ${CMAKE_VERSION:-} && \"${TRAVIS_OS_NAME:?}\" == \"osx\" && ! (\"${CMAKE_VERSION:-}\" =~ .+[' '].+) ]]\n    then # Single entry -> default CMake version\n      export PATH=${HOME}/tools/cmake-${CMAKE_VERSION:?}/bin:$PATH\n    fi\n    CMAKE_path=(\"cmake\") # start with installed CMake version\n    for VERSION in ${CMAKE_VERSION:-}; do\n      tmp_path=\"$HOME/tools/cmake-${VERSION:?}/bin/cmake\"\n      if [[ -x \"$(command -v ${tmp_path:?})\" ]]; then CMAKE_path+=(\"${tmp_path:?}\"); fi\n    done\n    function test_CMake_generate {\n      # $1: cmake or full path to cmake\n      shopt -s extglob\n      if [[ \"$1\" == \"cmake\" || -x \"$(command -v $1)\" && \"$1\" =~ .*cmake$ ]]; then\n        echo \"----------------\"\n        $1 --version\n        echo \"Configuration = ${BUILD_TYPE:-Debug}\"\n        $1 -DCMAKE_BUILD_TYPE=${BUILD_TYPE:-Debug} ${CMAKE_GEN_FLAGS[@]:?} ..\n        rm -rf !(tests/googletest-*)\n        if [[ ! ${BUILD_TYPE:-} ]]; then echo \"\" && echo \"Configuration = Release\"\n          $1 -DCMAKE_BUILD_TYPE=Release ${CMAKE_GEN_FLAGS[@]:?} ..\n          rm -rf !(tests/googletest-*)\n        fi\n      else echo \"Non existing command: $1\"\n      fi\n    }\n  - |\n    # CMake wrapper (Trusty, Xenial & Bionic); restore default behaviour.\n    if [[ \"${TRAVIS_OS_NAME:?}\" == \"linux\" &&\n          \"$(lsb_release --codename)\" =~ (trusty|xenial|bionic)$ ]]\n    then\n      if [[ -x $(command -v /usr/local/bin/cmake) ]]; then\n        function cmake { command /usr/local/bin/cmake $@; }\n      elif [[ -x $(command -v /usr/bin/cmake) ]]; then\n        function cmake { command /usr/bin/cmake $@; }\n      fi\n    fi\n\n  ############################################################################\n  # [linux]: Install the right version of libc++\n  # Based on https://github.com/ldionne/hana/blob/master/.travis.yml\n  ############################################################################\n  - |\n    LLVM_INSTALL=${DEPS_DIR:?}/llvm/install\n    # if in linux and compiler clang and llvm not installed\n    if [[ \"${TRAVIS_OS_NAME:?}\" == \"linux\" && \"${CXX%%+*}\" == \"clang\" && -n \"$(ls -A ${LLVM_INSTALL:?})\" ]]; then\n      if   [[ \"${CXX}\" == \"clang++-3.6\" ]]; then LLVM_VERSION=\"3.6.2\";\n      elif [[ \"${CXX}\" == \"clang++-3.7\" ]]; then LLVM_VERSION=\"3.7.1\";\n      elif [[ \"${CXX}\" == \"clang++-3.8\" ]]; then LLVM_VERSION=\"3.8.1\";\n      elif [[ \"${CXX}\" == \"clang++-3.9\" ]]; then LLVM_VERSION=\"3.9.1\";\n      fi\n      LLVM_URL=\"http://llvm.org/releases/${LLVM_VERSION}/llvm-${LLVM_VERSION}.src.tar.xz\"\n      LIBCXX_URL=\"http://llvm.org/releases/${LLVM_VERSION}/libcxx-${LLVM_VERSION}.src.tar.xz\"\n      LIBCXXABI_URL=\"http://llvm.org/releases/${LLVM_VERSION}/libcxxabi-${LLVM_VERSION}.src.tar.xz\"\n      mkdir -p llvm llvm/build llvm/projects/libcxx llvm/projects/libcxxabi\n      travis_retry wget -O - ${LLVM_URL} | tar --strip-components=1 -xJ -C llvm\n      travis_retry wget -O - ${LIBCXX_URL} | tar --strip-components=1 -xJ -C llvm/projects/libcxx\n      travis_retry wget -O - ${LIBCXXABI_URL} | tar --strip-components=1 -xJ -C llvm/projects/libcxxabi\n      (cd llvm/build && cmake .. -DCMAKE_INSTALL_PREFIX=${LLVM_INSTALL})\n      (cd llvm/build/projects/libcxx && make install -j2)\n      (cd llvm/build/projects/libcxxabi && make install -j2)\n      export CXXFLAGS=\"-isystem ${LLVM_INSTALL}/include/c++/v1\"\n      export LDFLAGS=\"-L ${LLVM_INSTALL}/lib -l c++ -l c++abi\"\n      export LD_LIBRARY_PATH=\"${LD_LIBRARY_PATH}:${LLVM_INSTALL}/lib\"\n    fi\n\nbefore_script:\n  - |\n    cd \"${TRAVIS_BUILD_DIR:?}\"\n    mkdir build && cd build\n    if [[ ${GSL_CXX_STANDARD:-} ]]; then \n      CMAKE_GEN_FLAGS=(\"-DGSL_CXX_STANDARD=$GSL_CXX_STANDARD\")\n    fi\n    CMAKE_GEN_FLAGS+=(\"-Wdev -Werror=dev --warn-uninitialized\")\n\nscript:\n  # generate build files\n  - cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE:?} ${CMAKE_GEN_FLAGS[@]:?}\n  # build and run tests\n  - cmake --build . -- -j${JOBS}\n  - ctest --output-on-failure -j${JOBS}\n"
  },
  {
    "path": "examples/libraries/GSL/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.1.3...3.16)\n\nproject(GSL VERSION 3.0.2 LANGUAGES CXX)\n\ninclude(ExternalProject)\nfind_package(Git)\n\n# Use GNUInstallDirs to provide the right locations on all platforms\ninclude(GNUInstallDirs)\n\n# creates a library GSL which is an interface (header files only)\nadd_library(GSL INTERFACE)\n\n# determine whether this is a standalone project or included by other projects\nset(GSL_STANDALONE_PROJECT OFF)\nif (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)\n    set(GSL_STANDALONE_PROJECT ON)\nendif ()\n\nset(GSL_CXX_STANDARD \"14\" CACHE STRING \"Use c++ standard\")\nset(GSL_CXX_STD \"cxx_std_${GSL_CXX_STANDARD}\")\n\nif (MSVC)\n    set(GSL_CXX_STD_OPT \"-std:c++${GSL_CXX_STANDARD}\")\nelse()\n    set(GSL_CXX_STD_OPT \"-std=c++${GSL_CXX_STANDARD}\")\nendif()\n\n# when minimum version required is 3.8.0 remove if below\n# both branches do exactly the same thing\nif (CMAKE_VERSION VERSION_LESS 3.7.9)\n    include(CheckCXXCompilerFlag)\n    CHECK_CXX_COMPILER_FLAG(\"${GSL_CXX_STD_OPT}\" COMPILER_SUPPORTS_CXX_STANDARD)\n\n    if(COMPILER_SUPPORTS_CXX_STANDARD)\n        target_compile_options(GSL INTERFACE \"${GSL_CXX_STD_OPT}\")\n    else()\n        message(FATAL_ERROR \"The compiler ${CMAKE_CXX_COMPILER} has no c++${GSL_CXX_STANDARD} support. Please use a different C++ compiler.\")\n    endif()\nelse ()\n    target_compile_features(GSL INTERFACE \"${GSL_CXX_STD}\")\n    # on *nix systems force the use of -std=c++XX instead of -std=gnu++XX (default)\n    set(CMAKE_CXX_EXTENSIONS OFF)\nendif()\n\n# add definitions to the library and targets that consume it\ntarget_compile_definitions(GSL INTERFACE\n    $<$<CXX_COMPILER_ID:MSVC>:\n        # remove unnecessary warnings about unchecked iterators\n        _SCL_SECURE_NO_WARNINGS\n        # remove deprecation warnings about std::uncaught_exception() (from catch)\n        _SILENCE_CXX17_UNCAUGHT_EXCEPTION_DEPRECATION_WARNING\n    >\n)\n\n# add include folders to the library and targets that consume it\n# the SYSTEM keyword suppresses warnings for users of the library\nif(GSL_STANDALONE_PROJECT)\n    target_include_directories(GSL INTERFACE\n        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>\n        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>\n    )\nelse()\n    target_include_directories(GSL SYSTEM INTERFACE\n        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>\n        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>\n    )\nendif()\n\n\nif (CMAKE_VERSION VERSION_GREATER 3.7.8)\n    if (MSVC_IDE)\n        option(VS_ADD_NATIVE_VISUALIZERS \"Configure project to use Visual Studio native visualizers\" TRUE)\n    else()\n        set(VS_ADD_NATIVE_VISUALIZERS FALSE CACHE INTERNAL \"Native visualizers are Visual Studio extension\" FORCE)\n    endif()\n\n    # add natvis file to the library so it will automatically be loaded into Visual Studio\n    if(VS_ADD_NATIVE_VISUALIZERS)\n        target_sources(GSL INTERFACE\n            $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/GSL.natvis>\n        )\n    endif()\nendif()\n\ninstall(TARGETS GSL EXPORT Microsoft.GSLConfig)\ninstall(\n    DIRECTORY include/gsl\n    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}\n)\n# Make library importable by other projects\ninstall(EXPORT Microsoft.GSLConfig NAMESPACE Microsoft.GSL:: DESTINATION ${CMAKE_INSTALL_DATADIR}/cmake/Microsoft.GSL)\nexport(TARGETS GSL NAMESPACE Microsoft.GSL:: FILE Microsoft.GSLConfig.cmake)\n\n# Add find_package() versioning support. The version for\n# generated Microsoft.GSLConfigVersion.cmake will be used from\n# last project() command. The version's compatibility is set between all\n# minor versions (as it was in prev. GSL releases).\ninclude(CMakePackageConfigHelpers)\nwrite_basic_package_version_file(\n    ${CMAKE_CURRENT_BINARY_DIR}/Microsoft.GSLConfigVersion.cmake\n    COMPATIBILITY SameMajorVersion\n)\ninstall(FILES ${CMAKE_CURRENT_BINARY_DIR}/Microsoft.GSLConfigVersion.cmake DESTINATION ${CMAKE_INSTALL_DATADIR}/cmake/Microsoft.GSL)\n\n# Add Microsoft.GSL::GSL alias for GSL so that dependents can be agnostic about\n# whether GSL was added via `add_subdirectory` or `find_package`\nadd_library(Microsoft.GSL::GSL ALIAS GSL)\n\noption(GSL_TEST \"Generate tests.\" ${GSL_STANDALONE_PROJECT})\nif (GSL_TEST)\n    enable_testing()\n    if(IOS)\n        add_compile_definitions(\n            GTEST_HAS_DEATH_TEST=1\n        )\n    endif()\n    add_subdirectory(tests)\nendif ()\n"
  },
  {
    "path": "examples/libraries/GSL/CMakeSettings.json",
    "content": "{\n  \"configurations\": [\n    {\n      \"name\": \"x64-Debug\",\n      \"generator\": \"Ninja\",\n      \"configurationType\": \"Debug\",\n      \"inheritEnvironments\": [\n        \"msvc_x64_x64\"\n      ],\n      \"buildRoot\": \"${env.USERPROFILE}\\\\CMakeBuilds\\\\${workspaceHash}\\\\build\\\\${name}\",\n      \"installRoot\": \"${env.USERPROFILE}\\\\CMakeBuilds\\\\${workspaceHash}\\\\install\\\\${name}\",\n      \"cmakeCommandArgs\": \"-DGSL_CXX_STANDARD=17\",\n      \"buildCommandArgs\": \"-v\",\n      \"ctestCommandArgs\": \"\",\n      \"codeAnalysisRuleset\": \"CppCoreCheckRules.ruleset\"\n    }\n  ]\n}"
  },
  {
    "path": "examples/libraries/GSL/CONTRIBUTING.md",
    "content": "## Contributing to the Guidelines Support Library\n\nThe Guidelines Support Library (GSL) contains functions and types that are suggested for use by the\n[C++ Core Guidelines](https://github.com/isocpp/CppCoreGuidelines). GSL design changes are made only as a result of modifications to the Guidelines. \n\nGSL is accepting contributions that improve or refine any of the types in this library as well as ports to other platforms. Changes should have an issue \ntracking the suggestion that has been approved by the maintainers. Your pull request should include a link to the bug that you are fixing. If you've submitted \na PR, please post a comment in the associated issue to avoid duplication of effort.\n\n## Legal\nYou will need to complete a Contributor License Agreement (CLA). Briefly, this agreement testifies that you are granting us and the community permission to \nuse the submitted change according to the terms of the project's license, and that the work being submitted is under appropriate copyright.\n\nPlease submit a Contributor License Agreement (CLA) before submitting a pull request. You may visit https://cla.microsoft.com to sign digitally.\n\n## Housekeeping\nYour pull request should: \n\n* Include a description of what your change intends to do\n* Be a child commit of a reasonably recent commit in the **master** branch \n    * Requests need not be a single commit, but should be a linear sequence of commits (i.e. no merge commits in your PR)\n* It is desirable, but not necessary, for the tests to pass at each commit. Please see [README.md](./README.md) for instructions to build the test suite. \n* Have clear commit messages \n    * e.g. \"Fix issue\", \"Add tests for type\", etc.\n* Include appropriate tests \n    * Tests should include reasonable permutations of the target fix/change\n    * Include baseline changes with your change\n    * All changed code must have 100% code coverage\n* To avoid line ending issues, set `autocrlf = input` and `whitespace = cr-at-eol` in your git configuration\n"
  },
  {
    "path": "examples/libraries/GSL/GSL.natvis",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- \n    This will make GitHub and some editors recognize this code as XML: \n    vim: syntax=xml\n-->\n<AutoVisualizer xmlns=\"http://schemas.microsoft.com/vstudio/debugger/natvis/2010\">\n    <!-- These types are from the gsl_assert header. -->\n    <Type Name=\"gsl::fail_fast\">\n        <!-- na hides the address, otherwise it would appear as 0x.... \"Message\" -->\n        <DisplayString>{_Data._What,nasb}</DisplayString>\n    </Type>\n\n    <!-- These types are from the gsl_util header. -->\n    <Type Name=\"gsl::final_action&lt;*&gt;\">\n        <DisplayString>{{ invoke = {invoke_}, action = {f_} }}</DisplayString>\n        <Expand>\n            <Item Name=\"[invoke]\">invoke_</Item>\n            <Item Name=\"[callback]\">f_</Item>\n        </Expand>\n    </Type>\n\n    <!-- These types are from the span header. -->\n    <!-- This is for dynamic_extent spans. -->\n    <Type Name=\"gsl::span&lt;*, -1&gt;\">\n        <DisplayString>{{ extent = {storage_.size_} }}</DisplayString>\n        <Expand>\n            <ArrayItems>\n                <Size>storage_.size_</Size>\n                <ValuePointer>storage_.data_</ValuePointer>\n            </ArrayItems>\n        </Expand>\n    </Type>\n\n    <!-- This works for constexpr size spans. -->\n    <Type Name=\"gsl::span&lt;*, *&gt;\">\n        <DisplayString>{{ extent = {extent} }}</DisplayString>\n        <Expand>\n            <ArrayItems>\n                <Size>extent</Size>\n                <ValuePointer>storage_.data_</ValuePointer>\n            </ArrayItems>\n        </Expand>\n    </Type>\n\n    <!-- This is for dynamic_extent string_spans. -->\n    <Type Name=\"gsl::basic_string_span&lt;*, -1&gt;\">\n        <DisplayString>{span_.storage_.data_,[span_.storage_.size_]na}</DisplayString>\n        <Expand>\n            <Item Name=\"[size]\">span_.storage_.size_</Item>\n            <ArrayItems>\n                <Size>span_.storage_.size_</Size>\n                <ValuePointer>span_.storage_.data_</ValuePointer>\n            </ArrayItems>\n        </Expand>\n    </Type>\n\n    <!-- This works for constexpr size string_spans. -->\n    <Type Name=\"gsl::basic_string_span&lt;*, *&gt;\">\n        <DisplayString>{span_.storage_.data_,[span_.extent]na}</DisplayString>\n        <Expand>\n            <Item Name=\"[size]\">span_.extent</Item>\n            <ArrayItems>\n                <Size>span_.extent</Size>\n                <ValuePointer>span_.storage_.data_</ValuePointer>\n            </ArrayItems>\n        </Expand>\n    </Type>\n\n    <!-- This is for dynamic_extent zstring_spans. -->\n    <Type Name=\"gsl::basic_zstring_span&lt;*, -1&gt;\">\n        <DisplayString>{span_.storage_.data_,[span_.storage_.size_]na}</DisplayString>\n        <Expand>\n            <Item Name=\"[size]\">span_.storage_.size_</Item>\n            <ArrayItems>\n                <Size>span_.storage_.size_</Size>\n                <ValuePointer>span_.storage_.data_</ValuePointer>\n            </ArrayItems>\n        </Expand>\n    </Type>\n    \n    <!-- This works for constexpr size string_spans. -->\n    <Type Name=\"gsl::basic_zstring_span&lt;*, *&gt;\">\n        <DisplayString>{span_.storage_.data_,[span_.extent]na}</DisplayString>\n        <Expand>\n            <Item Name=\"[size]\">span_.extent</Item>\n            <ArrayItems>\n                <Size>span_.extent</Size>\n                <ValuePointer>span_.storage_.data_</ValuePointer>\n            </ArrayItems>\n        </Expand>\n    </Type>\n    \n    <!-- These types are from the gsl header. -->\n    <Type Name=\"gsl::not_null&lt;*&gt;\">\n        <!-- We can always dereference this since it's an invariant. -->\n        <DisplayString>value = {*ptr_}</DisplayString>\n    </Type>\n</AutoVisualizer>  \n"
  },
  {
    "path": "examples/libraries/GSL/LICENSE",
    "content": "Copyright (c) 2015 Microsoft Corporation. All rights reserved. \n \nThis code is licensed under the MIT License (MIT). \n\nPermission is hereby granted, free of charge, to any person obtaining a copy \nof this software and associated documentation files (the \"Software\"), to deal \nin the Software without restriction, including without limitation the rights \nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \nof the Software, and to permit persons to whom the Software is furnished to do \nso, subject to the following conditions: \n\nThe above copyright notice and this permission notice shall be included in all \ncopies or substantial portions of the Software. \n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR \nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, \nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE \nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER \nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, \nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN \nTHE SOFTWARE. \n"
  },
  {
    "path": "examples/libraries/GSL/README.md",
    "content": "# GSL: Guidelines Support Library [![Build Status](https://travis-ci.org/Microsoft/GSL.svg?branch=master)](https://travis-ci.org/Microsoft/GSL) [![Build status](https://ci.appveyor.com/api/projects/status/github/Microsoft/GSL?svg=true)](https://ci.appveyor.com/project/neilmacintosh/GSL)\n\nThe Guidelines Support Library (GSL) contains functions and types that are suggested for use by the\n[C++ Core Guidelines](https://github.com/isocpp/CppCoreGuidelines) maintained by the [Standard C++ Foundation](https://isocpp.org).\nThis repo contains Microsoft's implementation of GSL.\n\nThe library includes types like `span<T>`, `string_span`, `owner<>` and others.\n\nThe entire implementation is provided inline in the headers under the [gsl](./include/gsl) directory. The implementation generally assumes a platform that implements C++14 support. There are specific workarounds to support MSVC 2015.\n\nWhile some types have been broken out into their own headers (e.g. [gsl/span](./include/gsl/span)),\nit is simplest to just include [gsl/gsl](./include/gsl/gsl) and gain access to the entire library.\n\n> NOTE: We encourage contributions that improve or refine any of the types in this library as well as ports to\nother platforms. Please see [CONTRIBUTING.md](./CONTRIBUTING.md) for more information about contributing.\n\n# Project Code of Conduct\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n# Usage of Third Party Libraries\nThis project makes use of the [Google Test](https://github.com/google/googletest) testing library. Please see the [ThirdPartyNotices.txt](./ThirdPartyNotices.txt) file for details regarding the licensing of Google Test.\n\n# Quick Start\n## Supported Platforms\nThe test suite that exercises GSL has been built and passes successfully on the following platforms:<sup>1)</sup>\n\n* Windows using Visual Studio 2015\n* Windows using Visual Studio 2017\n* Windows using Clang/LLVM 3.6\n* Windows using Clang/LLVM 7.0.0\n* Windows using GCC 5.1\n* Windows using Intel C++ Compiler 18.0\n* GNU/Linux using Clang/LLVM 3.6-3.9\n* GNU/Linux using Clang/LLVM 4.0\n* GNU/Linux using Clang/LLVM 5.0\n* GNU/Linux using Clang/LLVM 6.0\n* GNU/Linux using Clang/LLVM 7.0\n* GNU/Linux using GCC 5.1\n* OS X Mojave 10.14.4 using Apple LLVM version 10.0.0 (10.0.1.10010046)\n* OS X Mojave 10.14.3 using Apple LLVM version 10.0.0 (clang-1000.11.45.5)\n* OS X Yosemite using Xcode with Apple Clang 7.0.0.7000072\n* OS X Yosemite using GCC-5.2.0\n* OS X Sierra 10.12.4 using Apple LLVM version 8.1.0 (Clang-802.0.42)\n* OS X El Capitan (10.11) using Xcode with AppleClang 8.0.0.8000042\n* OS X High Sierra 10.13.2 (17C88) using Apple LLVM version 9.0.0 (clang-900.0.39.2)\n* FreeBSD 10.x with Clang/LLVM 3.6\n* iOS 8 and newer using AppleClang 11.0.3.11030032\n* Android 4.1 and newer (API Level 16 and above) using NDK r21b\n\n> If you successfully port GSL to another platform, we would love to hear from you. Please submit an issue to let us know. Also please consider\ncontributing any changes that were necessary back to this project to benefit the wider community.\n\n<sup>1)</sup> For `gsl::byte` to work correctly with Clang and GCC you might have to use the ` -fno-strict-aliasing` compiler option.\n\n## Building the tests\nTo build the tests, you will require the following:\n\n* [CMake](http://cmake.org), version 3.1.3 (3.2.3 for AppleClang) or later to be installed and in your PATH.\n\nThese steps assume the source code of this repository has been cloned into a directory named `c:\\GSL`.\n\n1. Create a directory to contain the build outputs for a particular architecture (we name it c:\\GSL\\build-x86 in this example).\n\n        cd GSL\n        md build-x86\n        cd build-x86\n\n2. Configure CMake to use the compiler of your choice (you can see a list by running `cmake --help`).\n\n        cmake -G \"Visual Studio 14 2015\" c:\\GSL\n\n3. Build the test suite (in this case, in the Debug configuration, Release is another good choice).\n\n        cmake --build . --config Debug\n\n4. Run the test suite.\n\n        ctest -C Debug\n\nAll tests should pass - indicating your platform is fully supported and you are ready to use the GSL types!\n\n## Building GSL - Using vcpkg\n\nYou can download and install GSL using the [vcpkg](https://github.com/Microsoft/vcpkg) dependency manager:\n\n    git clone https://github.com/Microsoft/vcpkg.git\n    cd vcpkg\n    ./bootstrap-vcpkg.sh\n    ./vcpkg integrate install\n    vcpkg install ms-gsl\n\nThe GSL port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository.\n\n## Using the libraries\nAs the types are entirely implemented inline in headers, there are no linking requirements.\n\nYou can copy the [gsl](./include/gsl) directory into your source tree so it is available\nto your compiler, then include the appropriate headers in your program.\n\nAlternatively set your compiler's *include path* flag to point to the GSL development folder (`c:\\GSL\\include` in the example above) or installation folder (after running the install). Eg.\n\nMSVC++\n\n    /I c:\\GSL\\include\n\nGCC/clang\n\n    -I$HOME/dev/GSL/include\n\nInclude the library using:\n\n    #include <gsl/gsl>\n\n## Usage in CMake\n\nThe library provides a Config file for CMake, once installed it can be found via\n\n    find_package(Microsoft.GSL CONFIG)\n\nWhich, when successful, will add library target called `Microsoft.GSL::GSL` which you can use via the usual\n`target_link_libraries` mechanism.\n\n## Debugging visualization support\nFor Visual Studio users, the file [GSL.natvis](./GSL.natvis) in the root directory of the repository can be added to your project if you would like more helpful visualization of GSL types in the Visual Studio debugger than would be offered by default.\n"
  },
  {
    "path": "examples/libraries/GSL/ThirdPartyNotices.txt",
    "content": "\nTHIRD-PARTY SOFTWARE NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nGSL: Guidelines Support Library incorporates third party material from the projects listed below.\n\n-------------------------------------------------------------------------------\nSoftware: Google Test\nOwner: Google Inc.\nSource URL: github.com/google/googletest\nLicense: BSD 3 - Clause\nText:\n    Copyright 2008, Google Inc.\n    All rights reserved.\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions are\n    met:\n\n        * Redistributions of source code must retain the above copyright\n    notice, this list of conditions and the following disclaimer.\n        * Redistributions in binary form must reproduce the above\n    copyright notice, this list of conditions and the following disclaimer\n    in the documentation and/or other materials provided with the\n    distribution.\n        * Neither the name of Google Inc. nor the names of its\n    contributors may be used to endorse or promote products derived from\n    this software without specific prior written permission.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n    \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n-------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/libraries/GSL/appveyor.yml",
    "content": "shallow_clone: true\n\nplatform:\n  - x86\n  - x64\n\nconfiguration:\n  - Debug\n  - Release\n\nimage:\n  - Visual Studio 2015\n  - Visual Studio 2017\n  - Visual Studio 2019\n\nenvironment:\n  NINJA_TAG: v1.8.2\n  NINJA_SHA512: 9B9CE248240665FCD6404B989F3B3C27ED9682838225E6DC9B67B551774F251E4FF8A207504F941E7C811E7A8BE1945E7BCB94472A335EF15E23A0200A32E6D5\n  NINJA_PATH: C:\\Tools\\ninja\\ninja-%NINJA_TAG%\n  VCVAR2015: 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\vcvarsall.bat'\n  VCVAR2017: 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat'\n  VCVAR2019: 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat'\n  matrix:\n    - GSL_CXX_STANDARD: 14\n      USE_TOOLSET: MSVC\n      USE_GENERATOR: MSBuild\n    - GSL_CXX_STANDARD: 17\n      USE_TOOLSET: MSVC\n      USE_GENERATOR: MSBuild\n    - GSL_CXX_STANDARD: 14\n      USE_TOOLSET: LLVM\n      USE_GENERATOR: Ninja\n    - GSL_CXX_STANDARD: 17\n      USE_TOOLSET: LLVM\n      USE_GENERATOR: Ninja\n\nmatrix:\n    exclude:\n    - image: Visual Studio 2015\n      GSL_CXX_STANDARD: 17\n    - image: Visual Studio 2015\n      USE_TOOLSET: LLVM\n      USE_GENERATOR: MSBuild\n\ncache:\n  - C:\\cmake-3.14.4-win32-x86\n  - C:\\Tools\\ninja\n\ninstall:\n  - ps: |\n      if (![IO.File]::Exists(\"$env:NINJA_PATH\\ninja.exe\")) {\n        Start-FileDownload `\n          \"https://github.com/ninja-build/ninja/releases/download/$env:NINJA_TAG/ninja-win.zip\"\n        $hash = (Get-FileHash ninja-win.zip -Algorithm SHA512).Hash\n        if ($env:NINJA_SHA512 -eq $hash) {\n          7z e -y -bso0 ninja-win.zip -o\"$env:NINJA_PATH\"\n        } else { Write-Warning \"Ninja download hash changed!\"; Write-Output \"$hash\" }\n      }\n      if ([IO.File]::Exists(\"$env:NINJA_PATH\\ninja.exe\")) {\n        $env:PATH = \"$env:NINJA_PATH;$env:PATH\"\n      } else { Write-Warning \"Failed to find ninja.exe in expected location.\" }\n      if ($env:USE_TOOLSET -ne \"LLVM\") {\n        if (![IO.File]::Exists(\"C:\\cmake-3.14.0-win32-x86\\bin\\cmake.exe\")) {\n          Start-FileDownload 'https://cmake.org/files/v3.14/cmake-3.14.4-win32-x86.zip'\n          7z x -y -bso0 cmake-3.14.4-win32-x86.zip -oC:\\\n        }\n        $env:PATH=\"C:\\cmake-3.14.4-win32-x86\\bin;$env:PATH\"\n      }\n\nbefore_build:\n  - ps: |\n      if (\"$env:USE_GENERATOR\" -eq \"Ninja\") {\n        $GeneratorFlags = '-k 10'\n        $Architecture = $env:PLATFORM\n        if (\"$env:APPVEYOR_BUILD_WORKER_IMAGE\" -eq \"Visual Studio 2015\") {\n          $env:VCVARSALL = \"`\"$env:VCVAR2015`\" $Architecture\"\n        } elseif (\"$env:APPVEYOR_BUILD_WORKER_IMAGE\" -eq \"Visual Studio 2017\") {\n          $env:VCVARSALL = \"`\"$env:VCVAR2017`\" $Architecture\"\n        } else {\n          $env:VCVARSALL = \"`\"$env:VCVAR2019`\" $Architecture\"\n        }\n        $env:CMakeGenFlags = \"-G Ninja -DGSL_CXX_STANDARD=$env:GSL_CXX_STANDARD\"\n      } else {\n        $GeneratorFlags = '/m /v:minimal'\n        if (\"$env:APPVEYOR_BUILD_WORKER_IMAGE\" -eq \"Visual Studio 2015\") {\n          $Generator = 'Visual Studio 14 2015'\n        } elseif (\"$env:APPVEYOR_BUILD_WORKER_IMAGE\" -eq \"Visual Studio 2017\") {\n          $Generator = 'Visual Studio 15 2017'\n        } else {\n          $Generator = 'Visual Studio 16 2019'\n        }\n        if (\"$env:PLATFORM\" -eq \"x86\") { \n            $Architecture = \"Win32\"\n        } else { \n            $Architecture = \"x64\" \n        }\n        if (\"$env:USE_TOOLSET\" -eq \"LLVM\") {\n          $env:CMakeGenFlags = \"-G `\"$Generator`\" -A $Architecture -T llvm -DGSL_CXX_STANDARD=$env:GSL_CXX_STANDARD\"\n        } else {\n          $env:CMakeGenFlags = \"-G `\"$Generator`\" -A $Architecture -DGSL_CXX_STANDARD=$env:GSL_CXX_STANDARD\"\n        }\n      }\n      if (\"$env:USE_TOOLSET\" -eq \"LLVM\") {\n        $env:CC  = \"clang-cl\"\n        $env:CXX = \"clang-cl\"\n        if (\"$env:PLATFORM\" -eq \"x86\") {\n          $env:CFLAGS   = \"-m32\";\n          $env:CXXFLAGS = \"-m32\";\n        } else {\n          $env:CFLAGS   = \"-m64\";\n          $env:CXXFLAGS = \"-m64\";\n        }\n      }\n      $env:CMakeBuildFlags = \"--config $env:CONFIGURATION -- $GeneratorFlags\"\n  - mkdir build\n  - cd build\n  - if %USE_GENERATOR%==Ninja (call %VCVARSALL%)\n  - echo %CMakeGenFlags%\n  - cmake .. %CMakeGenFlags%\n\nbuild_script:\n  - echo %CMakeBuildFlags%\n  - cmake --build . %CMakeBuildFlags%\n\ntest_script:\n  - ctest -j2\n\ndeploy: off\n"
  },
  {
    "path": "examples/libraries/GSL/include/gsl/gsl",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#ifndef GSL_GSL_H\n#define GSL_GSL_H\n\n#include <gsl/gsl_algorithm> // copy\n#include <gsl/gsl_assert>    // Ensures/Expects\n#include <gsl/gsl_byte>      // byte\n#include <gsl/gsl_util>      // finally()/narrow()/narrow_cast()...\n#include <gsl/multi_span>    // multi_span, strided_span...\n#include <gsl/pointers>      // owner, not_null\n#include <gsl/span>          // span\n#include <gsl/string_span>   // zstring, string_span, zstring_builder...\n\n#endif // GSL_GSL_H\n"
  },
  {
    "path": "examples/libraries/GSL/include/gsl/gsl_algorithm",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#ifndef GSL_ALGORITHM_H\n#define GSL_ALGORITHM_H\n\n#include <gsl/gsl_assert> // for Expects\n#include <gsl/span>       // for dynamic_extent, span\n\n#include <algorithm>   // for copy_n\n#include <cstddef>     // for ptrdiff_t\n#include <type_traits> // for is_assignable\n\n#ifdef _MSC_VER\n#pragma warning(push)\n\n// turn off some warnings that are noisy about our Expects statements\n#pragma warning(disable : 4127) // conditional expression is constant\n#pragma warning(disable : 4996) // unsafe use of std::copy_n\n\n#endif // _MSC_VER\n\nnamespace gsl\n{\n// Note: this will generate faster code than std::copy using span iterator in older msvc+stl\n// not necessary for msvc since VS2017 15.8 (_MSC_VER >= 1915)\ntemplate <class SrcElementType, std::size_t SrcExtent, class DestElementType,\n          std::size_t DestExtent>\nvoid copy(span<SrcElementType, SrcExtent> src, span<DestElementType, DestExtent> dest)\n{\n    static_assert(std::is_assignable<decltype(*dest.data()), decltype(*src.data())>::value,\n                  \"Elements of source span can not be assigned to elements of destination span\");\n    static_assert(SrcExtent == dynamic_extent || DestExtent == dynamic_extent ||\n                      (SrcExtent <= DestExtent),\n                  \"Source range is longer than target range\");\n\n    Expects(dest.size() >= src.size());\n    GSL_SUPPRESS(stl.1) // NO-FORMAT: attribute\n    std::copy_n(src.data(), src.size(), dest.data());\n}\n\n} // namespace gsl\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif // _MSC_VER\n\n#endif // GSL_ALGORITHM_H\n"
  },
  {
    "path": "examples/libraries/GSL/include/gsl/gsl_assert",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#ifndef GSL_CONTRACTS_H\n#define GSL_CONTRACTS_H\n\n//\n// Temporary until MSVC STL supports no-exceptions mode.\n// Currently terminate is a no-op in this mode, so we add termination behavior back\n//\n#if defined(_MSC_VER) && (defined(_KERNEL_MODE) || (defined(_HAS_EXCEPTIONS) && !_HAS_EXCEPTIONS))\n\n#define GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND\n#include <intrin.h>\n#define RANGE_CHECKS_FAILURE 0\n\n#if defined(__clang__)\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Winvalid-noreturn\"\n#endif // defined(__clang__)\n\n#else // defined(_MSC_VER) && (defined(_KERNEL_MODE) || (defined(_HAS_EXCEPTIONS) && !_HAS_EXCEPTIONS))\n\n#include <exception>\n\n#endif // defined(_MSC_VER) && (defined(_KERNEL_MODE) || (defined(_HAS_EXCEPTIONS) && !_HAS_EXCEPTIONS))\n\n//\n// make suppress attributes parse for some compilers\n// Hopefully temporary until suppression standardization occurs\n//\n#if defined(__clang__)\n#define GSL_SUPPRESS(x) [[gsl::suppress(\"x\")]]\n#else\n#if defined(_MSC_VER)\n#define GSL_SUPPRESS(x) [[gsl::suppress(x)]]\n#else\n#define GSL_SUPPRESS(x)\n#endif // _MSC_VER\n#endif // __clang__\n\n#define GSL_STRINGIFY_DETAIL(x) #x\n#define GSL_STRINGIFY(x) GSL_STRINGIFY_DETAIL(x)\n\n#if defined(__clang__) || defined(__GNUC__)\n#define GSL_LIKELY(x) __builtin_expect(!!(x), 1)\n#define GSL_UNLIKELY(x) __builtin_expect(!!(x), 0)\n\n#else\n\n#define GSL_LIKELY(x) (!!(x))\n#define GSL_UNLIKELY(x) (!!(x))\n#endif // defined(__clang__) || defined(__GNUC__)\n\n//\n// GSL_ASSUME(cond)\n//\n// Tell the optimizer that the predicate cond must hold. It is unspecified\n// whether or not cond is actually evaluated.\n//\n#ifdef _MSC_VER\n#define GSL_ASSUME(cond) __assume(cond)\n#elif defined(__GNUC__)\n#define GSL_ASSUME(cond) ((cond) ? static_cast<void>(0) : __builtin_unreachable())\n#else\n#define GSL_ASSUME(cond) static_cast<void>((cond) ? 0 : 0)\n#endif\n\n//\n// GSL.assert: assertions\n//\n\nnamespace gsl\n{\n\nnamespace details\n{\n#if defined(GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND)\n\n    typedef void(__cdecl* terminate_handler)();\n\n    // clang-format off\n    GSL_SUPPRESS(f.6) // NO-FORMAT: attribute\n    // clang-format on\n    [[noreturn]] inline void __cdecl default_terminate_handler()\n    {\n        __fastfail(RANGE_CHECKS_FAILURE);\n    }\n\n    inline gsl::details::terminate_handler& get_terminate_handler() noexcept\n    {\n        static terminate_handler handler = &default_terminate_handler;\n        return handler;\n    }\n\n#endif // defined(GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND)\n\n    [[noreturn]] inline void terminate() noexcept\n    {\n#if defined(GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND)\n        (*gsl::details::get_terminate_handler())();\n#else\n        std::terminate();\n#endif // defined(GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND)\n    }\n\n} // namespace details\n} // namespace gsl\n\n#define GSL_CONTRACT_CHECK(type, cond)                                                             \\\n    (GSL_LIKELY(cond) ? static_cast<void>(0) : gsl::details::terminate())\n\n#define Expects(cond) GSL_CONTRACT_CHECK(\"Precondition\", cond)\n#define Ensures(cond) GSL_CONTRACT_CHECK(\"Postcondition\", cond)\n\n#if defined(GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND) && defined(__clang__)\n#pragma clang diagnostic pop\n#endif\n\n#endif // GSL_CONTRACTS_H\n"
  },
  {
    "path": "examples/libraries/GSL/include/gsl/gsl_byte",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#ifndef GSL_BYTE_H\n#define GSL_BYTE_H\n\n//\n// make suppress attributes work for some compilers\n// Hopefully temporary until suppression standardization occurs\n//\n#if defined(__clang__)\n#define GSL_SUPPRESS(x) [[gsl::suppress(\"x\")]]\n#else\n#if defined(_MSC_VER)\n#define GSL_SUPPRESS(x) [[gsl::suppress(x)]]\n#else\n#define GSL_SUPPRESS(x)\n#endif // _MSC_VER\n#endif // __clang__\n\n#include <type_traits>\n\n// VS2017 15.8 added support for the __cpp_lib_byte definition\n// To do: drop _HAS_STD_BYTE when support for pre 15.8 expires\n#ifdef _MSC_VER\n\n#pragma warning(push)\n\n// Turn MSVC /analyze rules that generate too much noise. TODO: fix in the tool.\n#pragma warning(disable : 26493) // don't use c-style casts // TODO: MSVC suppression in templates does not always work\n\n#ifndef GSL_USE_STD_BYTE\n// this tests if we are under MSVC and the standard lib has std::byte and it is enabled\n#if (defined(_HAS_STD_BYTE) && _HAS_STD_BYTE) || (defined(__cpp_lib_byte) && __cpp_lib_byte >= 201603)\n\n#define GSL_USE_STD_BYTE 1\n\n#else // (defined(_HAS_STD_BYTE) && _HAS_STD_BYTE) || (defined(__cpp_lib_byte) && __cpp_lib_byte >= 201603)\n\n#define GSL_USE_STD_BYTE 0\n\n#endif // (defined(_HAS_STD_BYTE) && _HAS_STD_BYTE) || (defined(__cpp_lib_byte) && __cpp_lib_byte >= 201603)\n#endif // GSL_USE_STD_BYTE\n\n#else // _MSC_VER\n\n#ifndef GSL_USE_STD_BYTE\n#include <cstddef> /* __cpp_lib_byte */\n// this tests if we are under GCC or Clang with enough -std:c++1z power to get us std::byte\n// also check if libc++ version is sufficient (> 5.0) or libstc++ actually contains std::byte\n#if defined(__cplusplus) && (__cplusplus >= 201703L) && \\\n  (defined(__cpp_lib_byte) && (__cpp_lib_byte >= 201603)  || \\\n   defined(_LIBCPP_VERSION) && (_LIBCPP_VERSION >= 5000))\n\n#define GSL_USE_STD_BYTE 1\n\n#else // defined(__cplusplus) && (__cplusplus >= 201703L) &&\n      //   (defined(__cpp_lib_byte) && (__cpp_lib_byte >= 201603)  ||\n      //    defined(_LIBCPP_VERSION) && (_LIBCPP_VERSION >= 5000))\n\n#define GSL_USE_STD_BYTE 0\n\n#endif //defined(__cplusplus) && (__cplusplus >= 201703L) &&\n       //   (defined(__cpp_lib_byte) && (__cpp_lib_byte >= 201603)  ||\n       //    defined(_LIBCPP_VERSION) && (_LIBCPP_VERSION >= 5000))\n#endif // GSL_USE_STD_BYTE\n\n#endif // _MSC_VER\n\n// Use __may_alias__ attribute on gcc and clang\n#if defined __clang__ || (defined(__GNUC__) && __GNUC__ > 5)\n#define byte_may_alias __attribute__((__may_alias__))\n#else // defined __clang__ || defined __GNUC__\n#define byte_may_alias\n#endif // defined __clang__ || defined __GNUC__\n\n#if GSL_USE_STD_BYTE\n#include <cstddef>\n#endif\n\nnamespace gsl\n{\n#if GSL_USE_STD_BYTE\n\nusing std::byte;\nusing std::to_integer;\n\n#else // GSL_USE_STD_BYTE\n\n// This is a simple definition for now that allows\n// use of byte within span<> to be standards-compliant\nenum class byte_may_alias byte : unsigned char\n{\n};\n\ntemplate <class IntegerType, class = std::enable_if_t<std::is_integral<IntegerType>::value>>\nconstexpr byte& operator<<=(byte& b, IntegerType shift) noexcept\n{\n    return b = byte(static_cast<unsigned char>(b) << shift);\n}\n\ntemplate <class IntegerType, class = std::enable_if_t<std::is_integral<IntegerType>::value>>\nconstexpr byte operator<<(byte b, IntegerType shift) noexcept\n{\n    return byte(static_cast<unsigned char>(b) << shift);\n}\n\ntemplate <class IntegerType, class = std::enable_if_t<std::is_integral<IntegerType>::value>>\nconstexpr byte& operator>>=(byte& b, IntegerType shift) noexcept\n{\n    return b = byte(static_cast<unsigned char>(b) >> shift);\n}\n\ntemplate <class IntegerType, class = std::enable_if_t<std::is_integral<IntegerType>::value>>\nconstexpr byte operator>>(byte b, IntegerType shift) noexcept\n{\n    return byte(static_cast<unsigned char>(b) >> shift);\n}\n\nconstexpr byte& operator|=(byte& l, byte r) noexcept\n{\n    return l = byte(static_cast<unsigned char>(l) | static_cast<unsigned char>(r));\n}\n\nconstexpr byte operator|(byte l, byte r) noexcept\n{\n    return byte(static_cast<unsigned char>(l) | static_cast<unsigned char>(r));\n}\n\nconstexpr byte& operator&=(byte& l, byte r) noexcept\n{\n    return l = byte(static_cast<unsigned char>(l) & static_cast<unsigned char>(r));\n}\n\nconstexpr byte operator&(byte l, byte r) noexcept\n{\n    return byte(static_cast<unsigned char>(l) & static_cast<unsigned char>(r));\n}\n\nconstexpr byte& operator^=(byte& l, byte r) noexcept\n{\n    return l = byte(static_cast<unsigned char>(l) ^ static_cast<unsigned char>(r));\n}\n\nconstexpr byte operator^(byte l, byte r) noexcept\n{\n    return byte(static_cast<unsigned char>(l) ^ static_cast<unsigned char>(r));\n}\n\nconstexpr byte operator~(byte b) noexcept { return byte(~static_cast<unsigned char>(b)); }\n\ntemplate <class IntegerType, class = std::enable_if_t<std::is_integral<IntegerType>::value>>\nconstexpr IntegerType to_integer(byte b) noexcept\n{\n    return static_cast<IntegerType>(b);\n}\n\n#endif // GSL_USE_STD_BYTE\n\ntemplate <bool E, typename T>\nconstexpr byte to_byte_impl(T t) noexcept\n{\n    static_assert(\n        E, \"gsl::to_byte(t) must be provided an unsigned char, otherwise data loss may occur. \"\n           \"If you are calling to_byte with an integer contant use: gsl::to_byte<t>() version.\");\n    return static_cast<byte>(t);\n}\ntemplate <>\n// NOTE: need suppression since c++14 does not allow \"return {t}\"\n// GSL_SUPPRESS(type.4) // NO-FORMAT: attribute // TODO: suppression does not work\nconstexpr byte to_byte_impl<true, unsigned char>(unsigned char t) noexcept\n{\n    return byte(t);\n}\n\ntemplate <typename T>\nconstexpr byte to_byte(T t) noexcept\n{\n    return to_byte_impl<std::is_same<T, unsigned char>::value, T>(t);\n}\n\ntemplate <int I>\nconstexpr byte to_byte() noexcept\n{\n    static_assert(I >= 0 && I <= 255,\n                  \"gsl::byte only has 8 bits of storage, values must be in range 0-255\");\n    return static_cast<byte>(I);\n}\n\n} // namespace gsl\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif // _MSC_VER\n\n#endif // GSL_BYTE_H\n"
  },
  {
    "path": "examples/libraries/GSL/include/gsl/gsl_util",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#ifndef GSL_UTIL_H\n#define GSL_UTIL_H\n\n#include <gsl/gsl_assert> // for Expects\n\n#include <array>\n#include <cstddef>          // for ptrdiff_t, size_t\n#include <initializer_list> // for initializer_list\n#include <type_traits>      // for is_signed, integral_constant\n#include <utility>          // for exchange, forward\n\n#if defined(_MSC_VER) && !defined(__clang__)\n\n#pragma warning(push)\n#pragma warning(disable : 4127) // conditional expression is constant\n\n#if _MSC_VER < 1910\n#pragma push_macro(\"constexpr\")\n#define constexpr /*constexpr*/\n#endif            // _MSC_VER < 1910\n#endif            // _MSC_VER\n\n#if (defined(_MSC_VER) && _MSC_VER < 1910) || (!defined(__clang__) && defined(__GNUC__) && __GNUC__ < 6)\n#define GSL_CONSTEXPR_NARROW 0\n#else\n#define GSL_CONSTEXPR_NARROW 1\n#endif\n\nnamespace gsl\n{\n//\n// GSL.util: utilities\n//\n\n// index type for all container indexes/subscripts/sizes\nusing index = std::ptrdiff_t;\n\n// final_action allows you to ensure something gets run at the end of a scope\ntemplate <class F>\nclass final_action\n{\npublic:\n    explicit final_action(F f) noexcept : f_(std::move(f)) {}\n\n    final_action(final_action&& other) noexcept : f_(std::move(other.f_)), invoke_(std::exchange(other.invoke_, false)) {}\n\n    final_action(const final_action&) = delete;\n    final_action& operator=(const final_action&) = delete;\n    final_action& operator=(final_action&&) = delete;\n\n    GSL_SUPPRESS(f.6) // NO-FORMAT: attribute // terminate if throws\n    ~final_action() noexcept\n    {\n        if (invoke_) f_();\n    }\n\nprivate:\n    F f_;\n    bool invoke_{true};\n};\n\n// finally() - convenience function to generate a final_action\ntemplate <class F>\nfinal_action<F> finally(const F& f) noexcept\n{\n    return final_action<F>(f);\n}\n\ntemplate <class F>\nfinal_action<F> finally(F&& f) noexcept\n{\n    return final_action<F>(std::forward<F>(f));\n}\n\n// narrow_cast(): a searchable way to do narrowing casts of values\ntemplate <class T, class U>\nGSL_SUPPRESS(type.1) // NO-FORMAT: attribute\nconstexpr T narrow_cast(U&& u) noexcept\n{\n    return static_cast<T>(std::forward<U>(u));\n}\n\nstruct narrowing_error : public std::exception\n{\n};\n\nnamespace details\n{\n    template <class T, class U>\n    struct is_same_signedness\n        : public std::integral_constant<bool, std::is_signed<T>::value == std::is_signed<U>::value>\n    {\n    };\n} // namespace details\n\n// narrow() : a checked version of narrow_cast() that throws if the cast changed the value\ntemplate <class T, class U>\nGSL_SUPPRESS(type.1) // NO-FORMAT: attribute\nGSL_SUPPRESS(f.6) // NO-FORMAT: attribute // TODO: MSVC /analyze does not recognise noexcept(false)\n#if GSL_CONSTEXPR_NARROW\nconstexpr\n#endif\nT narrow(U u) noexcept(false)\n{\n    T t = narrow_cast<T>(u);\n    if (static_cast<U>(t) != u) throw narrowing_error{};\n    if (!details::is_same_signedness<T, U>::value && ((t < T{}) != (u < U{})))\n        throw narrowing_error{};\n    return t;\n}\n\n//\n// at() - Bounds-checked way of accessing builtin arrays, std::array, std::vector\n//\ntemplate <class T, std::size_t N>\nGSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\nGSL_SUPPRESS(bounds.2) // NO-FORMAT: attribute\nconstexpr T& at(T (&arr)[N], const index i)\n{\n    Expects(i >= 0 && i < narrow_cast<index>(N));\n    return arr[narrow_cast<std::size_t>(i)];\n}\n\ntemplate <class Cont>\nGSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\nGSL_SUPPRESS(bounds.2) // NO-FORMAT: attribute\nconstexpr auto at(Cont& cont, const index i) -> decltype(cont[cont.size()])\n{\n    Expects(i >= 0 && i < narrow_cast<index>(cont.size()));\n    using size_type = decltype(cont.size());\n    return cont[narrow_cast<size_type>(i)];\n}\n\ntemplate <class T>\nGSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\nconstexpr T at(const std::initializer_list<T> cont, const index i)\n{\n    Expects(i >= 0 && i < narrow_cast<index>(cont.size()));\n    return *(cont.begin() + i);\n}\n\n} // namespace gsl\n\n#if defined(_MSC_VER) && !defined(__clang__)\n#if _MSC_VER < 1910\n#undef constexpr\n#pragma pop_macro(\"constexpr\")\n\n#endif // _MSC_VER < 1910\n\n#pragma warning(pop)\n\n#endif // _MSC_VER\n\n#endif // GSL_UTIL_H\n"
  },
  {
    "path": "examples/libraries/GSL/include/gsl/multi_span",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#ifndef GSL_MULTI_SPAN_H\n#define GSL_MULTI_SPAN_H\n\n#include <gsl/gsl_assert> // for Expects\n#include <gsl/gsl_byte>   // for byte\n#include <gsl/gsl_util>   // for narrow_cast\n\n#include <algorithm> // for transform, lexicographical_compare\n#include <array>     // for array\n#include <cstddef>          // for std::ptrdiff_t, size_t, nullptr_t\n#include <cstdint>          // for PTRDIFF_MAX\n#include <functional>       // for divides, multiplies, minus, negate, plus\n#include <initializer_list> // for initializer_list\n#include <iterator>         // for iterator, random_access_iterator_tag\n#include <limits>           // for numeric_limits\n#include <new>\n#include <numeric>\n#include <stdexcept>\n#include <string>      // for basic_string\n#include <type_traits> // for enable_if_t, remove_cv_t, is_same, is_co...\n#include <utility>\n\n#if defined(_MSC_VER) && !defined(__clang__)\n\n// turn off some warnings that are noisy about our Expects statements\n#pragma warning(push)\n#pragma warning(disable : 4127) // conditional expression is constant\n#pragma warning(disable : 4702) // unreachable code\n\n// Turn MSVC /analyze rules that generate too much noise. TODO: fix in the tool.\n#pragma warning(disable : 26495) // uninitalized member when constructor calls constructor\n#pragma warning(disable : 26473) // in some instantiations we cast to the same type\n#pragma warning(disable : 26490) // TODO: bug in parser - attributes and templates\n#pragma warning(disable : 26465) // TODO: bug - suppression does not work on template functions\n#pragma warning(disable : 4996)  // use of function or classes marked [[deprecated]]\n\n#if _MSC_VER < 1910\n#pragma push_macro(\"constexpr\")\n#define constexpr /*constexpr*/\n\n#endif // _MSC_VER < 1910\n#endif // _MSC_VER\n\n#if defined(__GNUC__) || defined(__clang__)\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wdeprecated-declarations\"\n#endif\n\n// GCC 7 does not like the signed unsigned missmatch (size_t std::ptrdiff_t)\n// While there is a conversion from signed to unsigned, it happens at\n// compiletime, so the compiler wouldn't have to warn indiscriminently, but\n// could check if the source value actually doesn't fit into the target type\n// and only warn in those cases.\n#if defined(__GNUC__) && __GNUC__ > 6\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wsign-conversion\"\n#endif\n\nnamespace gsl\n{\n\n/*\n** begin definitions of index and bounds\n*/\nnamespace details\n{\n    template <typename SizeType>\n    struct [[deprecated]] SizeTypeTraits\n    {\n        static const SizeType max_value = std::numeric_limits<SizeType>::max();\n    };\n\n    template <typename... Ts>\n    class [[deprecated]] are_integral : public std::integral_constant<bool, true>\n    {\n    };\n\n    template <typename T, typename... Ts>\n    class [[deprecated]] are_integral<T, Ts...>\n        : public std::integral_constant<bool,\n                                        std::is_integral<T>::value && are_integral<Ts...>::value>\n    {\n    };\n} // namespace details\n\ntemplate <std::size_t Rank>\nclass [[deprecated]] multi_span_index final {\n    static_assert(Rank > 0, \"Rank must be greater than 0!\");\n\n    template <std::size_t OtherRank>\n    friend class multi_span_index;\n\npublic:\n    static const std::size_t rank = Rank;\n    using value_type = std::ptrdiff_t;\n    using size_type = value_type;\n    using reference = std::add_lvalue_reference_t<value_type>;\n    using const_reference = std::add_lvalue_reference_t<std::add_const_t<value_type>>;\n\n    constexpr multi_span_index() noexcept {}\n\n    constexpr multi_span_index(const value_type(&values)[Rank]) noexcept\n    {\n        GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n        GSL_SUPPRESS(bounds.3) // NO-FORMAT: attribute\n        std::copy(values, values + Rank, elems);\n    }\n\n    template <typename... Ts, typename = std::enable_if_t<(sizeof...(Ts) == Rank) &&\n                                                          details::are_integral<Ts...>::value>>\n    constexpr multi_span_index(Ts... ds) noexcept : elems{narrow_cast<value_type>(ds)...}\n    {}\n\n    constexpr multi_span_index(const multi_span_index& other) noexcept = default;\n\n    constexpr multi_span_index& operator=(const multi_span_index& rhs) noexcept = default;\n\n    // Preconditions: component_idx < rank\n    GSL_SUPPRESS(bounds.2) // NO-FORMAT: attribute\n    GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\n    constexpr reference operator[](std::size_t component_idx)\n    {\n        Expects(component_idx < Rank); // Component index must be less than rank\n        return elems[component_idx];\n    }\n\n    // Preconditions: component_idx < rank\n    GSL_SUPPRESS(bounds.2) // NO-FORMAT: attribute\n    GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\n    constexpr const_reference operator[](std::size_t component_idx) const\n    {\n        Expects(component_idx < Rank); // Component index must be less than rank\n        return elems[component_idx];\n    }\n\n    GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n    GSL_SUPPRESS(bounds.3) // NO-FORMAT: attribute\n    constexpr bool operator==(const multi_span_index& rhs) const\n    {\n        return std::equal(elems, elems + rank, rhs.elems);\n    }\n\n    constexpr bool operator!=(const multi_span_index& rhs) const { return !(*this == rhs); }\n\n    constexpr multi_span_index operator+() const noexcept { return *this; }\n\n    constexpr multi_span_index operator-() const\n    {\n        multi_span_index ret = *this;\n        std::transform(ret, ret + rank, ret, std::negate<value_type>{});\n        return ret;\n    }\n\n    constexpr multi_span_index operator+(const multi_span_index& rhs) const\n    {\n        multi_span_index ret = *this;\n        ret += rhs;\n        return ret;\n    }\n\n    constexpr multi_span_index operator-(const multi_span_index& rhs) const\n    {\n        multi_span_index ret = *this;\n        ret -= rhs;\n        return ret;\n    }\n\n    constexpr multi_span_index& operator+=(const multi_span_index& rhs)\n    {\n        GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n        GSL_SUPPRESS(bounds.3) // NO-FORMAT: attribute\n        std::transform(elems, elems + rank, rhs.elems, elems, std::plus<value_type>{});\n        return *this;\n    }\n\n    constexpr multi_span_index& operator-=(const multi_span_index& rhs)\n    {\n        GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n        GSL_SUPPRESS(bounds.3) // NO-FORMAT: attribute\n        std::transform(elems, elems + rank, rhs.elems, elems, std::minus<value_type>{});\n        return *this;\n    }\n\n    constexpr multi_span_index operator*(value_type v) const\n    {\n        multi_span_index ret = *this;\n        ret *= v;\n        return ret;\n    }\n\n    constexpr multi_span_index operator/(value_type v) const\n    {\n        multi_span_index ret = *this;\n        ret /= v;\n        return ret;\n    }\n\n    friend constexpr multi_span_index operator*(value_type v, const multi_span_index& rhs)\n    {\n        return rhs * v;\n    }\n\n    constexpr multi_span_index& operator*=(value_type v)\n    {\n        GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n        GSL_SUPPRESS(bounds.3) // NO-FORMAT: attribute\n        std::transform(elems, elems + rank, elems,\n                       [v](value_type x) { return std::multiplies<value_type>{}(x, v); });\n        return *this;\n    }\n\n    constexpr multi_span_index& operator/=(value_type v)\n    {\n        GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n        GSL_SUPPRESS(bounds.3) // NO-FORMAT: attribute\n        std::transform(elems, elems + rank, elems,\n                       [v](value_type x) { return std::divides<value_type>{}(x, v); });\n        return *this;\n    }\n\nprivate:\n    value_type elems[Rank] = {};\n};\n\n#if !defined(_MSC_VER) || _MSC_VER >= 1910\n\nstruct [[deprecated]] static_bounds_dynamic_range_t\n{\n    template <typename T, typename = std::enable_if_t<std::is_integral<T>::value>>\n    constexpr operator T() const noexcept\n    {\n        return narrow_cast<T>(-1);\n    }\n};\n\nconstexpr bool operator==(static_bounds_dynamic_range_t, static_bounds_dynamic_range_t) noexcept\n{\n    return true;\n}\n\nconstexpr bool operator!=(static_bounds_dynamic_range_t, static_bounds_dynamic_range_t) noexcept\n{\n    return false;\n}\n\ntemplate <typename T, typename = std::enable_if_t<std::is_integral<T>::value>>\nconstexpr bool operator==(static_bounds_dynamic_range_t, T other) noexcept\n{\n    return narrow_cast<T>(-1) == other;\n}\n\ntemplate <typename T, typename = std::enable_if_t<std::is_integral<T>::value>>\nconstexpr bool operator==(T left, static_bounds_dynamic_range_t right) noexcept\n{\n    return right == left;\n}\n\ntemplate <typename T, typename = std::enable_if_t<std::is_integral<T>::value>>\nconstexpr bool operator!=(static_bounds_dynamic_range_t, T other) noexcept\n{\n    return narrow_cast<T>(-1) != other;\n}\n\ntemplate <typename T, typename = std::enable_if_t<std::is_integral<T>::value>>\nconstexpr bool operator!=(T left, static_bounds_dynamic_range_t right) noexcept\n{\n    return right != left;\n}\n\nconstexpr static_bounds_dynamic_range_t dynamic_range{};\n#else\nconst std::ptrdiff_t dynamic_range = -1;\n#endif\n\nstruct [[deprecated]] generalized_mapping_tag\n{\n};\nstruct[[deprecated]] contiguous_mapping_tag : generalized_mapping_tag{};\n\nnamespace details\n{\n\n    template <std::ptrdiff_t Left, std::ptrdiff_t Right>\n    struct [[deprecated]] LessThan\n    {\n        static const bool value = Left < Right;\n    };\n\n    template <std::ptrdiff_t... Ranges>\n    struct [[deprecated]] BoundsRanges {\n        using size_type = std::ptrdiff_t;\n        static const size_type Depth = 0;\n        static const size_type DynamicNum = 0;\n        static const size_type CurrentRange = 1;\n        static const size_type TotalSize = 1;\n\n        // TODO : following signature is for work around VS bug\n        template <typename OtherRange>\n        constexpr BoundsRanges(const OtherRange&, bool /* firstLevel */)\n        {}\n\n        constexpr BoundsRanges(const std::ptrdiff_t* const) {}\n        constexpr BoundsRanges() noexcept = default;\n\n        template <typename T, std::size_t Dim>\n        constexpr void serialize(T&) const\n        {}\n\n        template <typename T, std::size_t Dim>\n        constexpr size_type linearize(const T&) const\n        {\n            return 0;\n        }\n\n        template <typename T, std::size_t Dim>\n        constexpr size_type contains(const T&) const\n        {\n            return -1;\n        }\n\n        constexpr size_type elementNum(std::size_t) const noexcept { return 0; }\n\n        constexpr size_type totalSize() const noexcept { return TotalSize; }\n\n        constexpr bool operator==(const BoundsRanges&) const noexcept { return true; }\n    };\n\n    template <std::ptrdiff_t... RestRanges>\n    struct[[deprecated]] BoundsRanges<dynamic_range, RestRanges...> : BoundsRanges<RestRanges...>\n    {\n        using Base = BoundsRanges<RestRanges...>;\n        using size_type = std::ptrdiff_t;\n        static const std::size_t Depth = Base::Depth + 1;\n        static const std::size_t DynamicNum = Base::DynamicNum + 1;\n        static const size_type CurrentRange = dynamic_range;\n        static const size_type TotalSize = dynamic_range;\n\n    private:\n        size_type m_bound;\n\n    public:\n        GSL_SUPPRESS(\n            f.23) // NO-FORMAT: attribute // this pointer type is cannot be assigned nullptr - issue in not_null\n        GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n        constexpr BoundsRanges(const std::ptrdiff_t* const arr)\n            : Base(arr + 1), m_bound(*arr * this->Base::totalSize())\n        {\n            Expects(0 <= *arr);\n        }\n\n        constexpr BoundsRanges() noexcept : m_bound(0) {}\n\n        template <std::ptrdiff_t OtherRange, std::ptrdiff_t... RestOtherRanges>\n        constexpr BoundsRanges(const BoundsRanges<OtherRange, RestOtherRanges...>& other,\n                               bool /* firstLevel */ = true)\n            : Base(static_cast<const BoundsRanges<RestOtherRanges...>&>(other), false)\n            , m_bound(other.totalSize())\n        {}\n\n        template <typename T, std::size_t Dim = 0>\n        constexpr void serialize(T & arr) const\n        {\n            arr[Dim] = elementNum();\n            this->Base::template serialize<T, Dim + 1>(arr);\n        }\n\n        template <typename T, std::size_t Dim = 0>\n        GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\n        constexpr size_type linearize(const T& arr) const\n        {\n            const size_type index = this->Base::totalSize() * arr[Dim];\n            Expects(index < m_bound);\n            return index + this->Base::template linearize<T, Dim + 1>(arr);\n        }\n\n        template <typename T, std::size_t Dim = 0>\n        constexpr size_type contains(const T& arr) const\n        {\n            const std::ptrdiff_t last = this->Base::template contains<T, Dim + 1>(arr);\n            if (last == -1) return -1;\n            const std::ptrdiff_t cur = this->Base::totalSize() * arr[Dim];\n            return cur < m_bound ? cur + last : -1;\n        }\n\n        GSL_SUPPRESS(\n            c.128) // NO-FORMAT: attribute // no pointers to BoundsRanges should be ever used\n        constexpr size_type totalSize() const noexcept { return m_bound; }\n\n        GSL_SUPPRESS(\n            c.128) // NO-FORMAT: attribute // no pointers to BoundsRanges should be ever used\n        constexpr size_type elementNum() const noexcept\n        {\n            return totalSize() / this->Base::totalSize();\n        }\n\n        GSL_SUPPRESS(\n            c.128) // NO-FORMAT: attribute // no pointers to BoundsRanges should be ever used\n        constexpr size_type elementNum(std::size_t dim) const noexcept\n        {\n            if (dim > 0)\n                return this->Base::elementNum(dim - 1);\n            else\n                return elementNum();\n        }\n\n        constexpr bool operator==(const BoundsRanges& rhs) const noexcept\n        {\n            return m_bound == rhs.m_bound &&\n                   static_cast<const Base&>(*this) == static_cast<const Base&>(rhs);\n        }\n    };\n\n    template <std::ptrdiff_t CurRange, std::ptrdiff_t... RestRanges>\n    struct[[deprecated]] BoundsRanges<CurRange, RestRanges...> : BoundsRanges<RestRanges...>\n    {\n        using Base = BoundsRanges<RestRanges...>;\n        using size_type = std::ptrdiff_t;\n        static const std::size_t Depth = Base::Depth + 1;\n        static const std::size_t DynamicNum = Base::DynamicNum;\n        static const size_type CurrentRange = CurRange;\n        static const size_type TotalSize =\n            Base::TotalSize == dynamic_range ? dynamic_range : CurrentRange * Base::TotalSize;\n\n        constexpr BoundsRanges(const std::ptrdiff_t* const arr) : Base(arr) {}\n        constexpr BoundsRanges() = default;\n\n        template <std::ptrdiff_t OtherRange, std::ptrdiff_t... RestOtherRanges>\n        constexpr BoundsRanges(const BoundsRanges<OtherRange, RestOtherRanges...>& other,\n                               bool firstLevel = true)\n            : Base(static_cast<const BoundsRanges<RestOtherRanges...>&>(other), false)\n        {\n            GSL_SUPPRESS(type.4) // NO-FORMAT: attribute // TODO: false positive\n            (void) firstLevel;\n        }\n\n        template <typename T, std::size_t Dim = 0>\n        constexpr void serialize(T & arr) const\n        {\n            arr[Dim] = elementNum();\n            this->Base::template serialize<T, Dim + 1>(arr);\n        }\n\n        template <typename T, std::size_t Dim = 0>\n        constexpr size_type linearize(const T& arr) const\n        {\n            GSL_SUPPRESS(bounds.4)                            // NO-FORMAT: attribute\n            Expects(arr[Dim] >= 0 && arr[Dim] < CurrentRange); // Index is out of range\n            GSL_SUPPRESS(bounds.4)                            // NO-FORMAT: attribute\n            const std::ptrdiff_t d = arr[Dim];\n            return this->Base::totalSize() * d + this->Base::template linearize<T, Dim + 1>(arr);\n        }\n\n        template <typename T, std::size_t Dim = 0>\n        constexpr size_type contains(const T& arr) const\n        {\n            if (arr[Dim] >= CurrentRange) return -1;\n            const size_type last = this->Base::template contains<T, Dim + 1>(arr);\n            if (last == -1) return -1;\n            return this->Base::totalSize() * arr[Dim] + last;\n        }\n\n        GSL_SUPPRESS(\n            c.128) // NO-FORMAT: attribute // no pointers to BoundsRanges should be ever used\n        constexpr size_type totalSize() const noexcept\n        {\n            return CurrentRange * this->Base::totalSize();\n        }\n\n        GSL_SUPPRESS(\n            c.128) // NO-FORMAT: attribute // no pointers to BoundsRanges should be ever used\n        constexpr size_type elementNum() const noexcept { return CurrentRange; }\n\n        GSL_SUPPRESS(\n            c.128) // NO-FORMAT: attribute // no pointers to BoundsRanges should be ever used\n        constexpr size_type elementNum(std::size_t dim) const noexcept\n        {\n            if (dim > 0)\n                return this->Base::elementNum(dim - 1);\n            else\n                return elementNum();\n        }\n\n        constexpr bool operator==(const BoundsRanges& rhs) const noexcept\n        {\n            return static_cast<const Base&>(*this) == static_cast<const Base&>(rhs);\n        }\n    };\n\n    template <typename SourceType, typename TargetType>\n    struct[[deprecated]] BoundsRangeConvertible\n        : public std::integral_constant<bool, (SourceType::TotalSize >= TargetType::TotalSize ||\n                                               TargetType::TotalSize == dynamic_range ||\n                                               SourceType::TotalSize == dynamic_range ||\n                                               TargetType::TotalSize == 0)>{};\n\n    template <typename TypeChain>\n    struct [[deprecated]] TypeListIndexer {\n        const TypeChain& obj_;\n        constexpr TypeListIndexer(const TypeChain& obj) : obj_(obj) {}\n\n        template <std::size_t N>\n        constexpr const TypeChain& getObj(std::true_type)\n        {\n            return obj_;\n        }\n\n        template <std::size_t N, typename MyChain = TypeChain,\n                  typename MyBase = typename MyChain::Base>\n        constexpr auto getObj(std::false_type)\n            ->decltype(TypeListIndexer<MyBase>(static_cast<const MyBase&>(obj_)).template get<N>())\n        {\n            return TypeListIndexer<MyBase>(static_cast<const MyBase&>(obj_)).template get<N>();\n        }\n\n        template <std::size_t N>\n        constexpr auto get()->decltype(getObj<N - 1>(std::integral_constant<bool, N == 0>()))\n        {\n            return getObj<N - 1>(std::integral_constant<bool, N == 0>());\n        }\n    };\n\n    template <typename TypeChain>\n    constexpr TypeListIndexer<TypeChain> createTypeListIndexer(const TypeChain& obj)\n    {\n        return TypeListIndexer<TypeChain>(obj);\n    }\n\n    template <std::size_t Rank, bool Enabled = (Rank > 1),\n              typename Ret = std::enable_if_t<Enabled, multi_span_index<Rank - 1>>>\n    constexpr Ret shift_left(const multi_span_index<Rank>& other) noexcept\n    {\n        Ret ret{};\n        for (std::size_t i = 0; i < Rank - 1; ++i)\n        {\n            GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\n            ret[i] = other[i + 1];\n        }\n        return ret;\n    }\n} // namespace details\n\ntemplate <typename IndexType>\nclass [[deprecated]] bounds_iterator;\n\ntemplate <std::ptrdiff_t... Ranges>\nclass [[deprecated]] static_bounds {\npublic:\n    static_bounds(const details::BoundsRanges<Ranges...>&) {}\n};\n\ntemplate <std::ptrdiff_t FirstRange, std::ptrdiff_t... RestRanges>\nclass[[deprecated]] static_bounds<FirstRange, RestRanges...>\n{\n    using MyRanges = details::BoundsRanges<FirstRange, RestRanges...>;\n\n    MyRanges m_ranges;\n    constexpr static_bounds(const MyRanges& range) noexcept : m_ranges(range) {}\n\n    template <std::ptrdiff_t... OtherRanges>\n    friend class static_bounds;\n\npublic:\n    static const std::size_t rank = MyRanges::Depth;\n    static const std::size_t dynamic_rank = MyRanges::DynamicNum;\n    static const std::ptrdiff_t static_size = MyRanges::TotalSize;\n\n    using size_type = std::ptrdiff_t;\n    using index_type = multi_span_index<rank>;\n    using const_index_type = std::add_const_t<index_type>;\n    using iterator = bounds_iterator<const_index_type>;\n    using const_iterator = bounds_iterator<const_index_type>;\n    using difference_type = std::ptrdiff_t;\n    using sliced_type = static_bounds<RestRanges...>;\n    using mapping_type = contiguous_mapping_tag;\n\n    constexpr static_bounds() /*noexcept*/ = default;\n\n    template <typename SourceType, typename TargetType, std::size_t Rank>\n    struct BoundsRangeConvertible2;\n\n    template <std::size_t Rank, typename SourceType, typename TargetType,\n              typename Ret = BoundsRangeConvertible2<typename SourceType::Base,\n                                                     typename TargetType::Base, Rank>>\n    static auto helpBoundsRangeConvertible(SourceType, TargetType, std::true_type)->Ret;\n\n    template <std::size_t Rank, typename SourceType, typename TargetType>\n    static auto helpBoundsRangeConvertible(SourceType, TargetType, ...)->std::false_type;\n\n    template <typename SourceType, typename TargetType, std::size_t Rank>\n    struct BoundsRangeConvertible2\n        : decltype(helpBoundsRangeConvertible<Rank - 1>(\n              SourceType(), TargetType(),\n              std::integral_constant<bool,\n                                     SourceType::Depth == TargetType::Depth &&\n                                         (SourceType::CurrentRange == TargetType::CurrentRange ||\n                                          TargetType::CurrentRange == dynamic_range ||\n                                          SourceType::CurrentRange == dynamic_range)>()))\n    {\n    };\n\n    template <typename SourceType, typename TargetType>\n    struct BoundsRangeConvertible2<SourceType, TargetType, 0> : std::true_type\n    {\n    };\n\n    template <typename SourceType, typename TargetType, std::ptrdiff_t Rank = TargetType::Depth>\n    struct BoundsRangeConvertible\n        : decltype(helpBoundsRangeConvertible<Rank - 1>(\n              SourceType(), TargetType(),\n              std::integral_constant<bool,\n                                     SourceType::Depth == TargetType::Depth &&\n                                         (!details::LessThan<SourceType::CurrentRange,\n                                                             TargetType::CurrentRange>::value ||\n                                          TargetType::CurrentRange == dynamic_range ||\n                                          SourceType::CurrentRange == dynamic_range)>()))\n    {\n    };\n\n    template <typename SourceType, typename TargetType>\n    struct BoundsRangeConvertible<SourceType, TargetType, 0> : std::true_type\n    {\n    };\n\n    template <std::ptrdiff_t... Ranges,\n              typename = std::enable_if_t<details::BoundsRangeConvertible<\n                  details::BoundsRanges<Ranges...>,\n                  details::BoundsRanges<FirstRange, RestRanges...>>::value>>\n    constexpr static_bounds(const static_bounds<Ranges...>& other) : m_ranges(other.m_ranges)\n    {\n        Expects((MyRanges::DynamicNum == 0 && details::BoundsRanges<Ranges...>::DynamicNum == 0) ||\n                MyRanges::DynamicNum > 0 || other.m_ranges.totalSize() >= m_ranges.totalSize());\n    }\n\n    constexpr static_bounds(std::initializer_list<size_type> il) : m_ranges(il.begin())\n    {\n        // Size of the initializer list must match the rank of the array\n        Expects((MyRanges::DynamicNum == 0 && il.size() == 1 && *il.begin() == static_size) ||\n                MyRanges::DynamicNum == il.size());\n        // Size of the range must be less than the max element of the size type\n        Expects(m_ranges.totalSize() <= PTRDIFF_MAX);\n    }\n\n    constexpr sliced_type slice() const noexcept\n    {\n        return sliced_type{static_cast<const details::BoundsRanges<RestRanges...>&>(m_ranges)};\n    }\n\n    constexpr size_type stride() const noexcept { return rank > 1 ? slice().size() : 1; }\n\n    constexpr size_type size() const noexcept { return m_ranges.totalSize(); }\n\n    constexpr size_type total_size() const noexcept { return m_ranges.totalSize(); }\n\n    constexpr size_type linearize(const index_type& idx) const { return m_ranges.linearize(idx); }\n\n    constexpr bool contains(const index_type& idx) const noexcept\n    {\n        return m_ranges.contains(idx) != -1;\n    }\n\n    constexpr size_type operator[](std::size_t idx) const noexcept\n    {\n        return m_ranges.elementNum(idx);\n    }\n\n    template <std::size_t Dim = 0>\n    constexpr size_type extent() const noexcept\n    {\n        static_assert(Dim < rank,\n                      \"dimension should be less than rank (dimension count starts from 0)\");\n        return details::createTypeListIndexer(m_ranges).template get<Dim>().elementNum();\n    }\n\n    template <typename IntType>\n    constexpr size_type extent(IntType dim) const\n    {\n        static_assert(std::is_integral<IntType>::value,\n                      \"Dimension parameter must be supplied as an integral type.\");\n        auto real_dim = narrow_cast<std::size_t>(dim);\n        Expects(real_dim < rank);\n\n        return m_ranges.elementNum(real_dim);\n    }\n\n    constexpr index_type index_bounds() const noexcept\n    {\n        size_type extents[rank] = {};\n        m_ranges.serialize(extents);\n        return {extents};\n    }\n\n    template <std::ptrdiff_t... Ranges>\n    constexpr bool operator==(const static_bounds<Ranges...>& rhs) const noexcept\n    {\n        return this->size() == rhs.size();\n    }\n\n    template <std::ptrdiff_t... Ranges>\n    constexpr bool operator!=(const static_bounds<Ranges...>& rhs) const noexcept\n    {\n        return !(*this == rhs);\n    }\n\n    constexpr const_iterator begin() const noexcept { return const_iterator(*this, index_type{}); }\n\n    constexpr const_iterator end() const noexcept\n    {\n        return const_iterator(*this, this->index_bounds());\n    }\n};\n\ntemplate <std::size_t Rank>\nclass [[deprecated]] strided_bounds {\n    template <std::size_t OtherRank>\n    friend class strided_bounds;\n\npublic:\n    static const std::size_t rank = Rank;\n    using value_type = std::ptrdiff_t;\n    using reference = std::add_lvalue_reference_t<value_type>;\n    using const_reference = std::add_const_t<reference>;\n    using size_type = value_type;\n    using difference_type = value_type;\n    using index_type = multi_span_index<rank>;\n    using const_index_type = std::add_const_t<index_type>;\n    using iterator = bounds_iterator<const_index_type>;\n    using const_iterator = bounds_iterator<const_index_type>;\n    static const value_type dynamic_rank = rank;\n    static const value_type static_size = dynamic_range;\n    using sliced_type = std::conditional_t<rank != 0, strided_bounds<rank - 1>, void>;\n    using mapping_type = generalized_mapping_tag;\n\n    constexpr strided_bounds(const strided_bounds&) noexcept = default;\n\n    constexpr strided_bounds& operator=(const strided_bounds&) noexcept = default;\n\n    constexpr strided_bounds(const value_type(&values)[rank], index_type strides)\n        : m_extents(values), m_strides(std::move(strides))\n    {}\n\n    constexpr strided_bounds(const index_type& extents, const index_type& strides) noexcept\n        : m_extents(extents), m_strides(strides)\n    {}\n\n    constexpr index_type strides() const noexcept { return m_strides; }\n\n    GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\n    constexpr size_type total_size() const noexcept\n    {\n        size_type ret = 0;\n        for (std::size_t i = 0; i < rank; ++i) { ret += (m_extents[i] - 1) * m_strides[i]; }\n        return ret + 1;\n    }\n\n    GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\n    constexpr size_type size() const noexcept\n    {\n        size_type ret = 1;\n        for (std::size_t i = 0; i < rank; ++i) { ret *= m_extents[i]; }\n        return ret;\n    }\n\n    constexpr bool contains(const index_type& idx) const noexcept\n    {\n        for (std::size_t i = 0; i < rank; ++i)\n        {\n            if (idx[i] < 0 || idx[i] >= m_extents[i]) return false;\n        }\n        return true;\n    }\n\n    GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\n    constexpr size_type linearize(const index_type& idx) const\n    {\n        size_type ret = 0;\n        for (std::size_t i = 0; i < rank; i++)\n        {\n            Expects(idx[i] < m_extents[i]); // index is out of bounds of the array\n            ret += idx[i] * m_strides[i];\n        }\n        return ret;\n    }\n\n    GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\n    constexpr size_type stride() const noexcept { return m_strides[0]; }\n\n    template <bool Enabled = (rank > 1), typename Ret = std::enable_if_t<Enabled, sliced_type>>\n    constexpr sliced_type slice() const\n    {\n        return {details::shift_left(m_extents), details::shift_left(m_strides)};\n    }\n\n    template <std::size_t Dim = 0>\n\n    GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\n    constexpr size_type extent() const noexcept\n    {\n        static_assert(Dim < Rank,\n                      \"dimension should be less than rank (dimension count starts from 0)\");\n        return m_extents[Dim];\n    }\n\n    constexpr index_type index_bounds() const noexcept { return m_extents; }\n\n    constexpr const_iterator begin() const noexcept { return const_iterator{*this, index_type{}}; }\n\n    constexpr const_iterator end() const noexcept { return const_iterator{*this, index_bounds()}; }\n\nprivate:\n    index_type m_extents;\n    index_type m_strides;\n};\n\ntemplate <typename T>\nstruct[[deprecated]] is_bounds : std::integral_constant<bool, false>{};\ntemplate <std::ptrdiff_t... Ranges>\nstruct[[deprecated]] is_bounds<static_bounds<Ranges...>> : std::integral_constant<bool, true>{};\ntemplate <std::size_t Rank>\nstruct[[deprecated]] is_bounds<strided_bounds<Rank>> : std::integral_constant<bool, true>{};\n\ntemplate <typename IndexType>\nclass [[deprecated]] bounds_iterator {\npublic:\n    static const std::size_t rank = IndexType::rank;\n    using iterator_category = std::random_access_iterator_tag;\n    using value_type = IndexType;\n    using difference_type = std::ptrdiff_t;\n    using pointer = value_type*;\n    using reference = value_type&;\n    using index_type = value_type;\n    using index_size_type = typename IndexType::value_type;\n    template <typename Bounds>\n    explicit bounds_iterator(const Bounds& bnd, value_type curr) noexcept\n        : boundary_(bnd.index_bounds()), curr_(std::move(curr))\n    {\n        static_assert(is_bounds<Bounds>::value, \"Bounds type must be provided\");\n    }\n\n    constexpr reference operator*() const noexcept { return curr_; }\n\n    constexpr pointer operator->() const noexcept { return &curr_; }\n\n    GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\n    GSL_SUPPRESS(bounds.2) // NO-FORMAT: attribute\n    constexpr bounds_iterator& operator++() noexcept\n\n    {\n        for (std::size_t i = rank; i-- > 0;)\n        {\n            if (curr_[i] < boundary_[i] - 1)\n            {\n                curr_[i]++;\n                return *this;\n            }\n            curr_[i] = 0;\n        }\n        // If we're here we've wrapped over - set to past-the-end.\n        curr_ = boundary_;\n        return *this;\n    }\n\n    constexpr bounds_iterator operator++(int) noexcept\n    {\n        auto ret = *this;\n        ++(*this);\n        return ret;\n    }\n\n    GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\n    constexpr bounds_iterator& operator--()\n    {\n        if (!less(curr_, boundary_))\n        {\n            // if at the past-the-end, set to last element\n            for (std::size_t i = 0; i < rank; ++i) { curr_[i] = boundary_[i] - 1; }\n            return *this;\n        }\n        for (std::size_t i = rank; i-- > 0;)\n        {\n            if (curr_[i] >= 1)\n            {\n                curr_[i]--;\n                return *this;\n            }\n            curr_[i] = boundary_[i] - 1;\n        }\n        // If we're here the preconditions were violated\n        // \"pre: there exists s such that r == ++s\"\n        Expects(false);\n        return *this;\n    }\n\n    constexpr bounds_iterator operator--(int) noexcept\n    {\n        auto ret = *this;\n        --(*this);\n        return ret;\n    }\n\n    constexpr bounds_iterator operator+(difference_type n) const noexcept\n    {\n        bounds_iterator ret{*this};\n        return ret += n;\n    }\n\n    GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\n    constexpr bounds_iterator& operator+=(difference_type n)\n    {\n        auto linear_idx = linearize(curr_) + n;\n        std::remove_const_t<value_type> stride = 0;\n        stride[rank - 1] = 1;\n        for (std::size_t i = rank - 1; i-- > 0;) { stride[i] = stride[i + 1] * boundary_[i + 1]; }\n        for (std::size_t i = 0; i < rank; ++i)\n        {\n            curr_[i] = linear_idx / stride[i];\n            linear_idx = linear_idx % stride[i];\n        }\n        // index is out of bounds of the array\n        Expects(!less(curr_, index_type{}) && !less(boundary_, curr_));\n        return *this;\n    }\n\n    constexpr bounds_iterator operator-(difference_type n) const noexcept\n    {\n        bounds_iterator ret{*this};\n        return ret -= n;\n    }\n\n    constexpr bounds_iterator& operator-=(difference_type n) noexcept { return *this += -n; }\n\n    constexpr difference_type operator-(const bounds_iterator& rhs) const noexcept\n    {\n        return linearize(curr_) - linearize(rhs.curr_);\n    }\n\n    constexpr value_type operator[](difference_type n) const noexcept { return *(*this + n); }\n\n    constexpr bool operator==(const bounds_iterator& rhs) const noexcept\n    {\n        return curr_ == rhs.curr_;\n    }\n\n    constexpr bool operator!=(const bounds_iterator& rhs) const noexcept { return !(*this == rhs); }\n\n    constexpr bool operator<(const bounds_iterator& rhs) const noexcept\n    {\n        return less(curr_, rhs.curr_);\n    }\n\n    constexpr bool operator<=(const bounds_iterator& rhs) const noexcept { return !(rhs < *this); }\n\n    constexpr bool operator>(const bounds_iterator& rhs) const noexcept { return rhs < *this; }\n\n    constexpr bool operator>=(const bounds_iterator& rhs) const noexcept { return !(rhs > *this); }\n\n    void swap(bounds_iterator & rhs) noexcept\n    {\n        std::swap(boundary_, rhs.boundary_);\n        std::swap(curr_, rhs.curr_);\n    }\n\nprivate:\n    GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\n    constexpr bool less(index_type & one, index_type & other) const noexcept\n    {\n        for (std::size_t i = 0; i < rank; ++i)\n        {\n            if (one[i] < other[i]) return true;\n        }\n        return false;\n    }\n\n    GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\n    constexpr index_size_type linearize(const value_type& idx) const noexcept\n    {\n        // TODO: Smarter impl.\n        // Check if past-the-end\n        index_size_type multiplier = 1;\n        index_size_type res = 0;\n        if (!less(idx, boundary_))\n        {\n            res = 1;\n            for (std::size_t i = rank; i-- > 0;)\n            {\n                res += (idx[i] - 1) * multiplier;\n                multiplier *= boundary_[i];\n            }\n        }\n        else\n        {\n            for (std::size_t i = rank; i-- > 0;)\n            {\n                res += idx[i] * multiplier;\n                multiplier *= boundary_[i];\n            }\n        }\n        return res;\n    }\n\n    value_type boundary_;\n    std::remove_const_t<value_type> curr_;\n};\n\ntemplate <typename IndexType>\nbounds_iterator<IndexType> operator+(typename bounds_iterator<IndexType>::difference_type n,\n                                     const bounds_iterator<IndexType>& rhs) noexcept\n{\n    return rhs + n;\n}\n\nnamespace details\n{\n    template <typename Bounds>\n    constexpr std::enable_if_t<\n        std::is_same<typename Bounds::mapping_type, generalized_mapping_tag>::value,\n        typename Bounds::index_type>\n    make_stride(const Bounds& bnd) noexcept\n    {\n        return bnd.strides();\n    }\n\n    // Make a stride vector from bounds, assuming contiguous memory.\n    template <typename Bounds>\n    constexpr std::enable_if_t<\n        std::is_same<typename Bounds::mapping_type, contiguous_mapping_tag>::value,\n        typename Bounds::index_type>\n    make_stride(const Bounds& bnd) noexcept\n    {\n        auto extents = bnd.index_bounds();\n        typename Bounds::size_type stride[Bounds::rank] = {};\n\n        stride[Bounds::rank - 1] = 1;\n        for (std::size_t i = 1; i < Bounds::rank; ++i)\n        {\n            GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\n            GSL_SUPPRESS(bounds.2) // NO-FORMAT: attribute\n            stride[Bounds::rank - i - 1] = stride[Bounds::rank - i] * extents[Bounds::rank - i];\n        }\n        return {stride};\n    }\n\n    template <typename BoundsSrc, typename BoundsDest>\n    void verifyBoundsReshape(const BoundsSrc& src, const BoundsDest& dest)\n    {\n        static_assert(is_bounds<BoundsSrc>::value && is_bounds<BoundsDest>::value,\n                      \"The src type and dest type must be bounds\");\n        static_assert(std::is_same<typename BoundsSrc::mapping_type, contiguous_mapping_tag>::value,\n                      \"The source type must be a contiguous bounds\");\n        static_assert(BoundsDest::static_size == dynamic_range ||\n                          BoundsSrc::static_size == dynamic_range ||\n                          BoundsDest::static_size == BoundsSrc::static_size,\n                      \"The source bounds must have same size as dest bounds\");\n        Expects(src.size() == dest.size());\n    }\n\n} // namespace details\n\ntemplate <typename Span>\nclass [[deprecated]] contiguous_span_iterator;\ntemplate <typename Span>\nclass [[deprecated]] general_span_iterator;\n\ntemplate <std::ptrdiff_t DimSize = dynamic_range>\nstruct [[deprecated]] dim_t\n{\n    static const std::ptrdiff_t value = DimSize;\n};\ntemplate <>\nstruct [[deprecated]] dim_t<dynamic_range>\n{\n    static const std::ptrdiff_t value = dynamic_range;\n    const std::ptrdiff_t dvalue;\n    constexpr dim_t(std::ptrdiff_t size) noexcept : dvalue(size) {}\n};\n\ntemplate <std::ptrdiff_t N, class = std::enable_if_t<(N >= 0)>>\nconstexpr dim_t<N> dim() noexcept\n{\n    return dim_t<N>();\n}\n\ntemplate <std::ptrdiff_t N = dynamic_range, class = std::enable_if_t<N == dynamic_range>>\nconstexpr dim_t<N> dim(std::ptrdiff_t n) noexcept\n{\n    return dim_t<>(n);\n}\n\ntemplate <typename ValueType, std::ptrdiff_t FirstDimension = dynamic_range,\n          std::ptrdiff_t... RestDimensions>\nclass [[deprecated(\"gsl::multi_span is deprecated because it is not in the C++ Core Guidelines\")]] multi_span;\n\ntemplate <typename ValueType, std::size_t Rank>\nclass [[deprecated(\"gsl::strided_span is deprecated because it is not in the C++ Core Guidelines\")]] strided_span;\n\nnamespace details\n{\n    template <typename T, typename = std::true_type>\n    struct [[deprecated]] SpanTypeTraits\n    {\n        using value_type = T;\n        using size_type = std::size_t;\n    };\n\n    template <typename Traits>\n    struct [[deprecated]] SpanTypeTraits<\n        Traits, typename std::is_reference<typename Traits::span_traits&>::type>\n    {\n        using value_type = typename Traits::span_traits::value_type;\n        using size_type = typename Traits::span_traits::size_type;\n    };\n\n    template <typename T, std::ptrdiff_t... Ranks>\n    struct [[deprecated]] SpanArrayTraits\n    {\n        using type = multi_span<T, Ranks...>;\n        using value_type = T;\n        using bounds_type = static_bounds<Ranks...>;\n        using pointer = T*;\n        using reference = T&;\n    };\n    template <typename T, std::ptrdiff_t N, std::ptrdiff_t... Ranks>\n    struct [[deprecated]] SpanArrayTraits<T[N], Ranks...> : SpanArrayTraits<T, Ranks..., N>\n    {\n    };\n\n    template <typename BoundsType>\n    BoundsType newBoundsHelperImpl(std::ptrdiff_t totalSize, std::true_type) // dynamic size\n    {\n        Expects(totalSize >= 0 && totalSize <= PTRDIFF_MAX);\n        return BoundsType{totalSize};\n    }\n    template <typename BoundsType>\n    BoundsType newBoundsHelperImpl(std::ptrdiff_t totalSize, std::false_type) // static size\n    {\n        Expects(BoundsType::static_size <= totalSize);\n        return {};\n    }\n    template <typename BoundsType>\n    BoundsType newBoundsHelper(std::ptrdiff_t totalSize)\n    {\n        static_assert(BoundsType::dynamic_rank <= 1, \"dynamic rank must less or equal to 1\");\n        return newBoundsHelperImpl<BoundsType>(\n            totalSize, std::integral_constant<bool, BoundsType::dynamic_rank == 1>());\n    }\n\n    struct [[deprecated]] Sep\n    {\n    };\n\n    template <typename T, typename... Args>\n    T static_as_multi_span_helper(Sep, Args... args)\n    {\n        return T{narrow_cast<typename T::size_type>(args)...};\n    }\n    template <typename T, typename Arg, typename... Args>\n    std::enable_if_t<\n        !std::is_same<Arg, dim_t<dynamic_range>>::value && !std::is_same<Arg, Sep>::value, T>\n    static_as_multi_span_helper(Arg, Args... args)\n    {\n        return static_as_multi_span_helper<T>(args...);\n    }\n    template <typename T, typename... Args>\n    T static_as_multi_span_helper(dim_t<dynamic_range> val, Args... args)\n    {\n        return static_as_multi_span_helper<T>(args..., val.dvalue);\n    }\n\n    template <typename... Dimensions>\n    struct [[deprecated]] static_as_multi_span_static_bounds_helper\n    {\n        using type = static_bounds<(Dimensions::value)...>;\n    };\n\n    template <typename T>\n    struct [[deprecated]] is_multi_span_oracle : std::false_type\n    {\n    };\n\n    template <typename ValueType, std::ptrdiff_t FirstDimension, std::ptrdiff_t... RestDimensions>\n    struct [[deprecated]] is_multi_span_oracle<multi_span<ValueType, FirstDimension, RestDimensions...>>\n        : std::true_type\n    {\n    };\n\n    template <typename ValueType, std::ptrdiff_t Rank>\n    struct [[deprecated]] is_multi_span_oracle<strided_span<ValueType, Rank>> : std::true_type\n    {\n    };\n\n    template <typename T>\n    struct [[deprecated]] is_multi_span : is_multi_span_oracle<std::remove_cv_t<T>>\n    {\n    };\n} // namespace details\n\ntemplate <typename ValueType, std::ptrdiff_t FirstDimension, std::ptrdiff_t... RestDimensions>\nclass [[deprecated(\"gsl::multi_span is deprecated because it is not in the C++ Core Guidelines\")]] multi_span {\n    // TODO do we still need this?\n    template <typename ValueType2, std::ptrdiff_t FirstDimension2,\n              std::ptrdiff_t... RestDimensions2>\n    friend class multi_span;\n\npublic:\n    using bounds_type = static_bounds<FirstDimension, RestDimensions...>;\n    static const std::size_t Rank = bounds_type::rank;\n    using size_type = typename bounds_type::size_type;\n    using index_type = typename bounds_type::index_type;\n    using value_type = ValueType;\n    using const_value_type = std::add_const_t<value_type>;\n    using pointer = std::add_pointer_t<value_type>;\n    using reference = std::add_lvalue_reference_t<value_type>;\n    using iterator = contiguous_span_iterator<multi_span>;\n    using const_span = multi_span<const_value_type, FirstDimension, RestDimensions...>;\n    using const_iterator = contiguous_span_iterator<const_span>;\n    using reverse_iterator = std::reverse_iterator<iterator>;\n    using const_reverse_iterator = std::reverse_iterator<const_iterator>;\n    using sliced_type =\n        std::conditional_t<Rank == 1, value_type, multi_span<value_type, RestDimensions...>>;\n\nprivate:\n    pointer data_;\n    bounds_type bounds_;\n\n    friend iterator;\n    friend const_iterator;\n\npublic:\n    // default constructor - same as constructing from nullptr_t\n    GSL_SUPPRESS(type.6) // NO-FORMAT: attribute // TODO: false positive\n    constexpr multi_span() noexcept : multi_span(nullptr, bounds_type{})\n    {\n        static_assert(bounds_type::dynamic_rank != 0 ||\n                          (bounds_type::dynamic_rank == 0 && bounds_type::static_size == 0),\n                      \"Default construction of multi_span<T> only possible \"\n                      \"for dynamic or fixed, zero-length spans.\");\n    }\n\n    // construct from nullptr - get an empty multi_span\n    GSL_SUPPRESS(type.6) // NO-FORMAT: attribute // TODO: false positive\n    constexpr multi_span(std::nullptr_t) noexcept : multi_span(nullptr, bounds_type{})\n    {\n        static_assert(bounds_type::dynamic_rank != 0 ||\n                          (bounds_type::dynamic_rank == 0 && bounds_type::static_size == 0),\n                      \"nullptr_t construction of multi_span<T> only possible \"\n                      \"for dynamic or fixed, zero-length spans.\");\n    }\n\n    // construct from nullptr with size of 0 (helps with template function calls)\n    template <class IntType, typename = std::enable_if_t<std::is_integral<IntType>::value>>\n\n    // GSL_SUPPRESS(type.6) // NO-FORMAT: attribute // TODO: false positive // TODO: parser bug\n    constexpr multi_span(std::nullptr_t, IntType size) : multi_span(nullptr, bounds_type{})\n    {\n        static_assert(bounds_type::dynamic_rank != 0 ||\n                          (bounds_type::dynamic_rank == 0 && bounds_type::static_size == 0),\n                      \"nullptr_t construction of multi_span<T> only possible \"\n                      \"for dynamic or fixed, zero-length spans.\");\n        Expects(size == 0);\n    }\n\n    // construct from a single element\n\n    GSL_SUPPRESS(type.6) // NO-FORMAT: attribute // TODO: false positive\n    constexpr multi_span(reference data) noexcept : multi_span(&data, bounds_type{1})\n    {\n        static_assert(bounds_type::dynamic_rank > 0 || bounds_type::static_size == 0 ||\n                          bounds_type::static_size == 1,\n                      \"Construction from a single element only possible \"\n                      \"for dynamic or fixed spans of length 0 or 1.\");\n    }\n\n    // prevent constructing from temporaries for single-elements\n    constexpr multi_span(value_type &&) = delete;\n\n    // construct from pointer + length\n    GSL_SUPPRESS(type.6) // NO-FORMAT: attribute // TODO: false positive\n    constexpr multi_span(pointer ptr, size_type size) : multi_span(ptr, bounds_type{size}) {}\n\n    // construct from pointer + length - multidimensional\n    constexpr multi_span(pointer data, bounds_type bounds) : data_(data), bounds_(std::move(bounds))\n    {\n        Expects((bounds_.size() > 0 && data != nullptr) || bounds_.size() == 0);\n    }\n\n    // construct from begin,end pointer pair\n    template <typename Ptr,\n              typename = std::enable_if_t<std::is_convertible<Ptr, pointer>::value &&\n                                          details::LessThan<bounds_type::dynamic_rank, 2>::value>>\n    constexpr multi_span(pointer begin, Ptr end)\n        : multi_span(begin,\n                     details::newBoundsHelper<bounds_type>(static_cast<pointer>(end) - begin))\n    {\n        Expects(begin != nullptr && end != nullptr && begin <= static_cast<pointer>(end));\n    }\n\n    // construct from n-dimensions static array\n    template <typename T, std::size_t N, typename Helper = details::SpanArrayTraits<T, N>>\n    constexpr multi_span(T(&arr)[N])\n        : multi_span(reinterpret_cast<pointer>(arr), bounds_type{typename Helper::bounds_type{}})\n    {\n        static_assert(std::is_convertible<typename Helper::value_type(*)[], value_type(*)[]>::value,\n                      \"Cannot convert from source type to target multi_span type.\");\n        static_assert(std::is_convertible<typename Helper::bounds_type, bounds_type>::value,\n                      \"Cannot construct a multi_span from an array with fewer elements.\");\n    }\n\n    // construct from n-dimensions dynamic array (e.g. new int[m][4])\n    // (precedence will be lower than the 1-dimension pointer)\n    template <typename T, typename Helper = details::SpanArrayTraits<T, dynamic_range>>\n    constexpr multi_span(T* const& data, size_type size)\n        : multi_span(reinterpret_cast<pointer>(data), typename Helper::bounds_type{size})\n    {\n        static_assert(std::is_convertible<typename Helper::value_type(*)[], value_type(*)[]>::value,\n                      \"Cannot convert from source type to target multi_span type.\");\n    }\n\n    // construct from std::array\n    template <typename T, std::size_t N>\n    constexpr multi_span(std::array<T, N> & arr)\n        : multi_span(arr.data(), bounds_type{static_bounds<N>{}})\n    {\n        static_assert(\n            std::is_convertible<T(*)[], typename std::remove_const_t<value_type>(*)[]>::value,\n            \"Cannot convert from source type to target multi_span type.\");\n        static_assert(std::is_convertible<static_bounds<N>, bounds_type>::value,\n                      \"You cannot construct a multi_span from a std::array of smaller size.\");\n    }\n\n    // construct from const std::array\n    template <typename T, std::size_t N>\n    constexpr multi_span(const std::array<T, N>& arr)\n        : multi_span(arr.data(), bounds_type{static_bounds<N>{}})\n    {\n        static_assert(\n            std::is_convertible<T(*)[], typename std::remove_const_t<value_type>(*)[]>::value,\n            \"Cannot convert from source type to target multi_span type.\");\n        static_assert(std::is_convertible<static_bounds<N>, bounds_type>::value,\n                      \"You cannot construct a multi_span from a std::array of smaller size.\");\n    }\n\n    // prevent constructing from temporary std::array\n    template <typename T, std::size_t N>\n    constexpr multi_span(std::array<T, N> && arr) = delete;\n\n    // construct from containers\n    // future: could use contiguous_iterator_traits to identify only contiguous containers\n    // type-requirements: container must have .size(), operator[] which are value_type compatible\n    template <typename Cont, typename DataType = typename Cont::value_type,\n              typename = std::enable_if_t<\n                  !details::is_multi_span<Cont>::value &&\n                  std::is_convertible<DataType(*)[], value_type(*)[]>::value &&\n                  std::is_same<std::decay_t<decltype(std::declval<Cont>().size(),\n                                                     *std::declval<Cont>().data())>,\n                               DataType>::value>>\n    constexpr multi_span(Cont & cont)\n        : multi_span(static_cast<pointer>(cont.data()),\n                     details::newBoundsHelper<bounds_type>(narrow_cast<size_type>(cont.size())))\n    {}\n\n    // prevent constructing from temporary containers\n    template <typename Cont, typename DataType = typename Cont::value_type,\n              typename = std::enable_if_t<\n                  !details::is_multi_span<Cont>::value &&\n                  std::is_convertible<DataType(*)[], value_type(*)[]>::value &&\n                  std::is_same<std::decay_t<decltype(std::declval<Cont>().size(),\n                                                     *std::declval<Cont>().data())>,\n                               DataType>::value>>\n    explicit constexpr multi_span(Cont && cont) = delete;\n\n    // construct from a convertible multi_span\n    template <typename OtherValueType, std::ptrdiff_t... OtherDimensions,\n              typename OtherBounds = static_bounds<OtherDimensions...>,\n              typename = std::enable_if_t<std::is_convertible<OtherValueType, ValueType>::value &&\n                                          std::is_convertible<OtherBounds, bounds_type>::value>>\n    constexpr multi_span(multi_span<OtherValueType, OtherDimensions...> other)\n        : data_(other.data_), bounds_(other.bounds_)\n    {}\n\n    // trivial copy and move\n    constexpr multi_span(const multi_span&) = default;\n    constexpr multi_span(multi_span &&) = default;\n\n    // trivial assignment\n    constexpr multi_span& operator=(const multi_span&) = default;\n    constexpr multi_span& operator=(multi_span&&) = default;\n\n    // first() - extract the first Count elements into a new multi_span\n    template <std::ptrdiff_t Count>\n\n    constexpr multi_span<ValueType, Count> first() const\n    {\n        static_assert(Count >= 0, \"Count must be >= 0.\");\n        static_assert(bounds_type::static_size == dynamic_range ||\n                          Count <= bounds_type::static_size,\n                      \"Count is out of bounds.\");\n\n        Expects(bounds_type::static_size != dynamic_range || Count <= this->size());\n        return {this->data(), Count};\n    }\n\n    // first() - extract the first count elements into a new multi_span\n    constexpr multi_span<ValueType, dynamic_range> first(size_type count) const\n    {\n        Expects(count >= 0 && count <= this->size());\n        return {this->data(), count};\n    }\n\n    // last() - extract the last Count elements into a new multi_span\n    template <std::ptrdiff_t Count>\n    constexpr multi_span<ValueType, Count> last() const\n    {\n        static_assert(Count >= 0, \"Count must be >= 0.\");\n        static_assert(bounds_type::static_size == dynamic_range ||\n                          Count <= bounds_type::static_size,\n                      \"Count is out of bounds.\");\n\n        Expects(bounds_type::static_size != dynamic_range || Count <= this->size());\n        return {this->data() + this->size() - Count, Count};\n    }\n\n    // last() - extract the last count elements into a new multi_span\n    constexpr multi_span<ValueType, dynamic_range> last(size_type count) const\n    {\n        Expects(count >= 0 && count <= this->size());\n        return {this->data() + this->size() - count, count};\n    }\n\n    // subspan() - create a subview of Count elements starting at Offset\n    template <std::ptrdiff_t Offset, std::ptrdiff_t Count>\n    constexpr multi_span<ValueType, Count> subspan() const\n    {\n        static_assert(Count >= 0, \"Count must be >= 0.\");\n        static_assert(Offset >= 0, \"Offset must be >= 0.\");\n        static_assert(bounds_type::static_size == dynamic_range ||\n                          ((Offset <= bounds_type::static_size) &&\n                           Count <= bounds_type::static_size - Offset),\n                      \"You must describe a sub-range within bounds of the multi_span.\");\n\n        Expects(bounds_type::static_size != dynamic_range ||\n                (Offset <= this->size() && Count <= this->size() - Offset));\n        return {this->data() + Offset, Count};\n    }\n\n    // subspan() - create a subview of count elements starting at offset\n    // supplying dynamic_range for count will consume all available elements from offset\n    constexpr multi_span<ValueType, dynamic_range> subspan(size_type offset,\n                                                           size_type count = dynamic_range) const\n    {\n        Expects((offset >= 0 && offset <= this->size()) &&\n                (count == dynamic_range || (count <= this->size() - offset)));\n        return {this->data() + offset, count == dynamic_range ? this->length() - offset : count};\n    }\n\n    // section - creates a non-contiguous, strided multi_span from a contiguous one\n    constexpr strided_span<ValueType, Rank> section(index_type origin, index_type extents) const\n    {\n        const size_type size = this->bounds().total_size() - this->bounds().linearize(origin);\n        return {&this->operator[](origin), size,\n                strided_bounds<Rank>{extents, details::make_stride(bounds())}};\n    }\n\n    // length of the multi_span in elements\n    constexpr size_type size() const noexcept { return bounds_.size(); }\n\n    // length of the multi_span in elements\n    constexpr size_type length() const noexcept { return this->size(); }\n\n    // length of the multi_span in bytes\n    constexpr size_type size_bytes() const noexcept\n    {\n        return narrow_cast<size_type>(sizeof(value_type)) * this->size();\n    }\n\n    // length of the multi_span in bytes\n    constexpr size_type length_bytes() const noexcept { return this->size_bytes(); }\n\n    constexpr bool empty() const noexcept { return this->size() == 0; }\n\n    static constexpr std::size_t rank() { return Rank; }\n\n    template <std::size_t Dim = 0>\n    constexpr size_type extent() const noexcept\n    {\n        static_assert(Dim < Rank,\n                      \"Dimension should be less than rank (dimension count starts from 0).\");\n        return bounds_.template extent<Dim>();\n    }\n\n    template <typename IntType>\n    constexpr size_type extent(IntType dim) const\n    {\n        return bounds_.extent(dim);\n    }\n\n    constexpr bounds_type bounds() const noexcept { return bounds_; }\n\n    constexpr pointer data() const noexcept { return data_; }\n\n    template <typename FirstIndex>\n    constexpr reference operator()(FirstIndex idx)\n    {\n        return this->operator[](narrow_cast<std::ptrdiff_t>(idx));\n    }\n\n    template <typename FirstIndex, typename... OtherIndices>\n    constexpr reference operator()(FirstIndex firstIndex, OtherIndices... indices)\n    {\n        const index_type idx = {narrow_cast<std::ptrdiff_t>(firstIndex),\n                                narrow_cast<std::ptrdiff_t>(indices)...};\n        return this->operator[](idx);\n    }\n\n    GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n    constexpr reference operator[](const index_type& idx) const\n    {\n        return data_[bounds_.linearize(idx)];\n    }\n\n    template <bool Enabled = (Rank > 1), typename Ret = std::enable_if_t<Enabled, sliced_type>>\n\n    GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n    constexpr Ret operator[](size_type idx) const\n    {\n        Expects(idx >= 0 && idx < bounds_.size()); // index is out of bounds of the array\n        const size_type ridx = idx * bounds_.stride();\n\n        // index is out of bounds of the underlying data\n        Expects(ridx < bounds_.total_size());\n        return Ret{data_ + ridx, bounds_.slice()};\n    }\n\n    constexpr iterator begin() const noexcept { return iterator{this, true}; }\n\n    constexpr iterator end() const noexcept { return iterator{this, false}; }\n\n    GSL_SUPPRESS(type.1) // NO-FORMAT: attribute\n    constexpr const_iterator cbegin() const noexcept\n    {\n        return const_iterator{reinterpret_cast<const const_span*>(this), true};\n    }\n\n    constexpr const_iterator cend() const noexcept\n    {\n        return const_iterator{reinterpret_cast<const const_span*>(this), false};\n    }\n\n    constexpr reverse_iterator rbegin() const noexcept { return reverse_iterator{end()}; }\n\n    constexpr reverse_iterator rend() const noexcept { return reverse_iterator{begin()}; }\n\n    constexpr const_reverse_iterator crbegin() const noexcept\n    {\n        return const_reverse_iterator{cend()};\n    }\n\n    constexpr const_reverse_iterator crend() const noexcept\n    {\n        return const_reverse_iterator{cbegin()};\n    }\n\n    template <typename OtherValueType, std::ptrdiff_t... OtherDimensions,\n              typename = std::enable_if_t<std::is_same<std::remove_cv_t<value_type>,\n                                                       std::remove_cv_t<OtherValueType>>::value>>\n    constexpr bool operator==(const multi_span<OtherValueType, OtherDimensions...>& other) const\n    {\n        return bounds_.size() == other.bounds_.size() &&\n               (data_ == other.data_ || std::equal(this->begin(), this->end(), other.begin()));\n    }\n\n    template <typename OtherValueType, std::ptrdiff_t... OtherDimensions,\n              typename = std::enable_if_t<std::is_same<std::remove_cv_t<value_type>,\n                                                       std::remove_cv_t<OtherValueType>>::value>>\n    constexpr bool operator!=(const multi_span<OtherValueType, OtherDimensions...>& other) const\n    {\n        return !(*this == other);\n    }\n\n    template <typename OtherValueType, std::ptrdiff_t... OtherDimensions,\n              typename = std::enable_if_t<std::is_same<std::remove_cv_t<value_type>,\n                                                       std::remove_cv_t<OtherValueType>>::value>>\n    constexpr bool operator<(const multi_span<OtherValueType, OtherDimensions...>& other) const\n    {\n        return std::lexicographical_compare(this->begin(), this->end(), other.begin(), other.end());\n    }\n\n    template <typename OtherValueType, std::ptrdiff_t... OtherDimensions,\n              typename = std::enable_if_t<std::is_same<std::remove_cv_t<value_type>,\n                                                       std::remove_cv_t<OtherValueType>>::value>>\n    constexpr bool operator<=(const multi_span<OtherValueType, OtherDimensions...>& other) const\n    {\n        return !(other < *this);\n    }\n\n    template <typename OtherValueType, std::ptrdiff_t... OtherDimensions,\n              typename = std::enable_if_t<std::is_same<std::remove_cv_t<value_type>,\n                                                       std::remove_cv_t<OtherValueType>>::value>>\n    constexpr bool operator>(const multi_span<OtherValueType, OtherDimensions...>& other)\n        const noexcept\n    {\n        return (other < *this);\n    }\n\n    template <typename OtherValueType, std::ptrdiff_t... OtherDimensions,\n              typename = std::enable_if_t<std::is_same<std::remove_cv_t<value_type>,\n                                                       std::remove_cv_t<OtherValueType>>::value>>\n    constexpr bool operator>=(const multi_span<OtherValueType, OtherDimensions...>& other) const\n    {\n        return !(*this < other);\n    }\n};\n\n//\n// Free functions for manipulating spans\n//\n\n// reshape a multi_span into a different dimensionality\n// DimCount and Enabled here are workarounds for a bug in MSVC 2015\ntemplate <typename SpanType, typename... Dimensions2, std::size_t DimCount = sizeof...(Dimensions2),\n          bool Enabled = (DimCount > 0), typename = std::enable_if_t<Enabled>>\nconstexpr auto as_multi_span(SpanType s, Dimensions2... dims)\n    -> multi_span<typename SpanType::value_type, Dimensions2::value...>\n{\n    static_assert(details::is_multi_span<SpanType>::value,\n                  \"Variadic as_multi_span() is for reshaping existing spans.\");\n    using BoundsType =\n        typename multi_span<typename SpanType::value_type, (Dimensions2::value)...>::bounds_type;\n    const auto tobounds = details::static_as_multi_span_helper<BoundsType>(dims..., details::Sep{});\n    details::verifyBoundsReshape(s.bounds(), tobounds);\n    return {s.data(), tobounds};\n}\n\n// convert a multi_span<T> to a multi_span<const byte>\ntemplate <typename U, std::ptrdiff_t... Dimensions>\nmulti_span<const byte, dynamic_range>\nas_bytes(multi_span<U, Dimensions...> s) noexcept\n{\n    static_assert(std::is_trivial<std::decay_t<U>>::value,\n                  \"The value_type of multi_span must be a trivial type.\");\n    return {reinterpret_cast<const byte*>(s.data()), s.size_bytes()};\n}\n\n// convert a multi_span<T> to a multi_span<byte> (a writeable byte multi_span)\n// this is not currently a portable function that can be relied upon to work\n// on all implementations. It should be considered an experimental extension\n// to the standard GSL interface.\ntemplate <typename U, std::ptrdiff_t... Dimensions>\nmulti_span<byte> as_writeable_bytes(multi_span<U, Dimensions...> s) noexcept\n{\n    static_assert(std::is_trivial<std::decay_t<U>>::value,\n                  \"The value_type of multi_span must be a trivial type.\");\n    return {reinterpret_cast<byte*>(s.data()), s.size_bytes()};\n}\n\n// convert a multi_span<const byte> to a multi_span<const T>\n// this is not currently a portable function that can be relied upon to work\n// on all implementations. It should be considered an experimental extension\n// to the standard GSL interface.\ntemplate <typename U, std::ptrdiff_t... Dimensions>\nconstexpr auto as_multi_span(multi_span<const byte, Dimensions...> s) -> multi_span<\n    const U, static_cast<std::ptrdiff_t>(\n                 multi_span<const byte, Dimensions...>::bounds_type::static_size != dynamic_range\n                     ? (static_cast<std::size_t>(\n                            multi_span<const byte, Dimensions...>::bounds_type::static_size) /\n                        sizeof(U))\n                     : dynamic_range)>\n{\n    using ConstByteSpan = multi_span<const byte, Dimensions...>;\n    static_assert(\n        std::is_trivial<std::decay_t<U>>::value &&\n            (ConstByteSpan::bounds_type::static_size == dynamic_range ||\n             ConstByteSpan::bounds_type::static_size % narrow_cast<std::ptrdiff_t>(sizeof(U)) == 0),\n        \"Target type must be a trivial type and its size must match the byte array size\");\n\n    Expects((s.size_bytes() % narrow_cast<std::ptrdiff_t>(sizeof(U))) == 0 &&\n            (s.size_bytes() / narrow_cast<std::ptrdiff_t>(sizeof(U))) < PTRDIFF_MAX);\n    return {reinterpret_cast<const U*>(s.data()),\n            s.size_bytes() / narrow_cast<std::ptrdiff_t>(sizeof(U))};\n}\n\n// convert a multi_span<byte> to a multi_span<T>\n// this is not currently a portable function that can be relied upon to work\n// on all implementations. It should be considered an experimental extension\n// to the standard GSL interface.\ntemplate <typename U, std::ptrdiff_t... Dimensions>\nconstexpr auto as_multi_span(multi_span<byte, Dimensions...> s)\n    -> multi_span<U, narrow_cast<std::ptrdiff_t>(\n                         multi_span<byte, Dimensions...>::bounds_type::static_size != dynamic_range\n                             ? static_cast<std::size_t>(\n                                   multi_span<byte, Dimensions...>::bounds_type::static_size) /\n                                   sizeof(U)\n                             : dynamic_range)>\n{\n    using ByteSpan = multi_span<byte, Dimensions...>;\n    static_assert(std::is_trivial<std::decay_t<U>>::value &&\n                      (ByteSpan::bounds_type::static_size == dynamic_range ||\n                       ByteSpan::bounds_type::static_size % sizeof(U) == 0),\n                  \"Target type must be a trivial type and its size must match the byte array size\");\n\n    Expects((s.size_bytes() % sizeof(U)) == 0);\n    return {reinterpret_cast<U*>(s.data()),\n            s.size_bytes() / narrow_cast<std::ptrdiff_t>(sizeof(U))};\n}\n\ntemplate <typename T, std::ptrdiff_t... Dimensions>\nconstexpr auto as_multi_span(T* const& ptr, dim_t<Dimensions>... args)\n    -> multi_span<std::remove_all_extents_t<T>, Dimensions...>\n{\n    return {reinterpret_cast<std::remove_all_extents_t<T>*>(ptr),\n            details::static_as_multi_span_helper<static_bounds<Dimensions...>>(args...,\n                                                                               details::Sep{})};\n}\n\ntemplate <typename T>\nconstexpr auto as_multi_span(T* arr, std::ptrdiff_t len) ->\n    typename details::SpanArrayTraits<T, dynamic_range>::type\n{\n    return {reinterpret_cast<std::remove_all_extents_t<T>*>(arr), len};\n}\n\ntemplate <typename T, std::size_t N>\nconstexpr auto as_multi_span(T (&arr)[N]) ->\n    typename details::SpanArrayTraits<T, N>::type\n{\n    return {arr};\n}\n\ntemplate <typename T, std::size_t N>\nconstexpr multi_span<const T, N> as_multi_span(const std::array<T, N>& arr)\n{\n    return {arr};\n}\n\ntemplate <typename T, std::size_t N>\nconstexpr multi_span<const T, N> as_multi_span(const std::array<T, N>&&) = delete;\n\ntemplate <typename T, std::size_t N>\nconstexpr multi_span<T, N> as_multi_span(std::array<T, N>& arr)\n{\n    return {arr};\n}\n\ntemplate <typename T>\nconstexpr multi_span<T, dynamic_range> as_multi_span(T* begin, T* end)\n{\n    return {begin, end};\n}\n\ntemplate <typename Cont>\nconstexpr auto as_multi_span(Cont& arr) -> std::enable_if_t<\n    !details::is_multi_span<std::decay_t<Cont>>::value,\n    multi_span<std::remove_reference_t<decltype(arr.size(), *arr.data())>, dynamic_range>>\n{\n    Expects(arr.size() < PTRDIFF_MAX);\n    return {arr.data(), narrow_cast<std::ptrdiff_t>(arr.size())};\n}\n\ntemplate <typename Cont>\nconstexpr auto as_multi_span(Cont&& arr) -> std::enable_if_t<\n    !details::is_multi_span<std::decay_t<Cont>>::value,\n    multi_span<std::remove_reference_t<decltype(arr.size(), *arr.data())>, dynamic_range>> = delete;\n\n// from basic_string which doesn't have nonconst .data() member like other contiguous containers\ntemplate <typename CharT, typename Traits, typename Allocator>\nGSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\nconstexpr auto as_multi_span(std::basic_string<CharT, Traits, Allocator>& str)\n    -> multi_span<CharT, dynamic_range>\n{\n    Expects(str.size() < PTRDIFF_MAX);\n    return {&str[0], narrow_cast<std::ptrdiff_t>(str.size())};\n}\n\n// strided_span is an extension that is not strictly part of the GSL at this time.\n// It is kept here while the multidimensional interface is still being defined.\ntemplate <typename ValueType, std::size_t Rank>\nclass [[deprecated(\"gsl::strided_span is deprecated because it is not in the C++ Core Guidelines\")]] strided_span\n{\npublic:\n    using bounds_type = strided_bounds<Rank>;\n    using size_type = typename bounds_type::size_type;\n    using index_type = typename bounds_type::index_type;\n    using value_type = ValueType;\n    using const_value_type = std::add_const_t<value_type>;\n    using pointer = std::add_pointer_t<value_type>;\n    using reference = std::add_lvalue_reference_t<value_type>;\n    using iterator = general_span_iterator<strided_span>;\n    using const_strided_span = strided_span<const_value_type, Rank>;\n    using const_iterator = general_span_iterator<const_strided_span>;\n    using reverse_iterator = std::reverse_iterator<iterator>;\n    using const_reverse_iterator = std::reverse_iterator<const_iterator>;\n    using sliced_type =\n        std::conditional_t<Rank == 1, value_type, strided_span<value_type, Rank - 1>>;\n\nprivate:\n    pointer data_;\n    bounds_type bounds_;\n\n    friend iterator;\n    friend const_iterator;\n    template <typename OtherValueType, std::size_t OtherRank>\n    friend class strided_span;\n\npublic:\n    // from raw data\n    constexpr strided_span(pointer ptr, size_type size, bounds_type bounds)\n        : data_(ptr), bounds_(std::move(bounds))\n    {\n        Expects((bounds_.size() > 0 && ptr != nullptr) || bounds_.size() == 0);\n        // Bounds cross data boundaries\n        Expects(this->bounds().total_size() <= size);\n        GSL_SUPPRESS(type.4) // NO-FORMAT: attribute // TODO: false positive\n        (void) size;\n    }\n\n    // from static array of size N\n    template <size_type N>\n    constexpr strided_span(value_type (&values)[N], bounds_type bounds)\n        : strided_span(values, N, std::move(bounds))\n    {}\n\n    // from array view\n    template <typename OtherValueType, std::ptrdiff_t... Dimensions,\n              bool Enabled1 = (sizeof...(Dimensions) == Rank),\n              bool Enabled2 = std::is_convertible<OtherValueType*, ValueType*>::value,\n              typename = std::enable_if_t<Enabled1 && Enabled2>>\n    constexpr strided_span(multi_span<OtherValueType, Dimensions...> av, bounds_type bounds)\n        : strided_span(av.data(), av.bounds().total_size(), std::move(bounds))\n    {}\n\n    // convertible\n    template <typename OtherValueType, typename = std::enable_if_t<std::is_convertible<\n                                           OtherValueType (*)[], value_type (*)[]>::value>>\n    constexpr strided_span(const strided_span<OtherValueType, Rank>& other)\n        : data_(other.data_), bounds_(other.bounds_)\n    {}\n\n    // convert from bytes\n    template <typename OtherValueType>\n    constexpr strided_span<\n        typename std::enable_if<std::is_same<value_type, const byte>::value, OtherValueType>::type,\n        Rank>\n    as_strided_span() const\n    {\n        static_assert((sizeof(OtherValueType) >= sizeof(value_type)) &&\n                          (sizeof(OtherValueType) % sizeof(value_type) == 0),\n                      \"OtherValueType should have a size to contain a multiple of ValueTypes\");\n        auto d = narrow_cast<size_type>(sizeof(OtherValueType) / sizeof(value_type));\n\n        const size_type size = this->bounds().total_size() / d;\n\n        GSL_SUPPRESS(type.3) // NO-FORMAT: attribute\n        return {const_cast<OtherValueType*>(reinterpret_cast<const OtherValueType*>(this->data())),\n                size,\n                bounds_type{resize_extent(this->bounds().index_bounds(), d),\n                            resize_stride(this->bounds().strides(), d)}};\n    }\n\n    constexpr strided_span section(index_type origin, index_type extents) const\n    {\n        const size_type size = this->bounds().total_size() - this->bounds().linearize(origin);\n        return {&this->operator[](origin), size,\n                bounds_type{extents, details::make_stride(bounds())}};\n    }\n\n    GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n    constexpr reference operator[](const index_type& idx) const\n    {\n        return data_[bounds_.linearize(idx)];\n    }\n\n    template <bool Enabled = (Rank > 1), typename Ret = std::enable_if_t<Enabled, sliced_type>>\n    GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n    constexpr Ret operator[](size_type idx) const\n    {\n        Expects(idx < bounds_.size()); // index is out of bounds of the array\n        const size_type ridx = idx * bounds_.stride();\n\n        // index is out of bounds of the underlying data\n        Expects(ridx < bounds_.total_size());\n        return {data_ + ridx, bounds_.slice().total_size(), bounds_.slice()};\n    }\n\n    constexpr bounds_type bounds() const noexcept { return bounds_; }\n\n    template <std::size_t Dim = 0>\n    constexpr size_type extent() const noexcept\n    {\n        static_assert(Dim < Rank,\n                      \"dimension should be less than Rank (dimension count starts from 0)\");\n        return bounds_.template extent<Dim>();\n    }\n\n    constexpr size_type size() const noexcept { return bounds_.size(); }\n\n    constexpr pointer data() const noexcept { return data_; }\n\n    constexpr bool empty() const noexcept { return this->size() == 0; }\n\n    constexpr explicit operator bool() const noexcept { return data_ != nullptr; }\n\n    constexpr iterator begin() const { return iterator{this, true}; }\n\n    constexpr iterator end() const { return iterator{this, false}; }\n\n    constexpr const_iterator cbegin() const\n    {\n        return const_iterator{reinterpret_cast<const const_strided_span*>(this), true};\n    }\n\n    constexpr const_iterator cend() const\n    {\n        return const_iterator{reinterpret_cast<const const_strided_span*>(this), false};\n    }\n\n    constexpr reverse_iterator rbegin() const { return reverse_iterator{end()}; }\n\n    constexpr reverse_iterator rend() const { return reverse_iterator{begin()}; }\n\n    constexpr const_reverse_iterator crbegin() const { return const_reverse_iterator{cend()}; }\n\n    constexpr const_reverse_iterator crend() const { return const_reverse_iterator{cbegin()}; }\n\n    template <typename OtherValueType, std::ptrdiff_t OtherRank,\n              typename = std::enable_if_t<std::is_same<std::remove_cv_t<value_type>,\n                                                       std::remove_cv_t<OtherValueType>>::value>>\n    constexpr bool operator==(const strided_span<OtherValueType, OtherRank>& other) const\n    {\n        return bounds_.size() == other.bounds_.size() &&\n               (data_ == other.data_ || std::equal(this->begin(), this->end(), other.begin()));\n    }\n\n    template <typename OtherValueType, std::ptrdiff_t OtherRank,\n              typename = std::enable_if_t<std::is_same<std::remove_cv_t<value_type>,\n                                                       std::remove_cv_t<OtherValueType>>::value>>\n    constexpr bool operator!=(const strided_span<OtherValueType, OtherRank>& other) const\n    {\n        return !(*this == other);\n    }\n\n    template <typename OtherValueType, std::ptrdiff_t OtherRank,\n              typename = std::enable_if_t<std::is_same<std::remove_cv_t<value_type>,\n                                                       std::remove_cv_t<OtherValueType>>::value>>\n    constexpr bool operator<(const strided_span<OtherValueType, OtherRank>& other) const\n    {\n        return std::lexicographical_compare(this->begin(), this->end(), other.begin(), other.end());\n    }\n\n    template <typename OtherValueType, std::ptrdiff_t OtherRank,\n              typename = std::enable_if_t<std::is_same<std::remove_cv_t<value_type>,\n                                                       std::remove_cv_t<OtherValueType>>::value>>\n    constexpr bool operator<=(const strided_span<OtherValueType, OtherRank>& other) const\n    {\n        return !(other < *this);\n    }\n\n    template <typename OtherValueType, std::ptrdiff_t OtherRank,\n              typename = std::enable_if_t<std::is_same<std::remove_cv_t<value_type>,\n                                                       std::remove_cv_t<OtherValueType>>::value>>\n    constexpr bool operator>(const strided_span<OtherValueType, OtherRank>& other) const\n    {\n        return (other < *this);\n    }\n\n    template <typename OtherValueType, std::ptrdiff_t OtherRank,\n              typename = std::enable_if_t<std::is_same<std::remove_cv_t<value_type>,\n                                                       std::remove_cv_t<OtherValueType>>::value>>\n    constexpr bool operator>=(const strided_span<OtherValueType, OtherRank>& other) const\n    {\n        return !(*this < other);\n    }\n\nprivate:\n    static index_type resize_extent(const index_type& extent, std::ptrdiff_t d)\n    {\n        // The last dimension of the array needs to contain a multiple of new type elements\n        GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\n        Expects(extent[Rank - 1] >= d && (extent[Rank - 1] % d == 0));\n\n        index_type ret = extent;\n        ret[Rank - 1] /= d;\n\n        return ret;\n    }\n\n    template <bool Enabled = (Rank == 1), typename = std::enable_if_t<Enabled>>\n    static index_type resize_stride(const index_type& strides, std::ptrdiff_t, void* = nullptr)\n    {\n        // Only strided arrays with regular strides can be resized\n        GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\n        Expects(strides[Rank - 1] == 1);\n\n        return strides;\n    }\n\n    template <bool Enabled = (Rank > 1), typename = std::enable_if_t<Enabled>>\n    GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\n    static index_type resize_stride(const index_type& strides, std::ptrdiff_t d)\n    {\n        // Only strided arrays with regular strides can be resized\n        Expects(strides[Rank - 1] == 1);\n        // The strides must have contiguous chunks of\n        // memory that can contain a multiple of new type elements\n        Expects(strides[Rank - 2] >= d && (strides[Rank - 2] % d == 0));\n\n        for (std::size_t i = Rank - 1; i > 0; --i)\n        {\n            // Only strided arrays with regular strides can be resized\n            Expects((strides[i - 1] >= strides[i]) && (strides[i - 1] % strides[i] == 0));\n        }\n\n        index_type ret = strides / d;\n        ret[Rank - 1] = 1;\n\n        return ret;\n    }\n};\n\ntemplate <class Span>\nclass [[deprecated]] contiguous_span_iterator {\npublic:\n    using iterator_category = std::random_access_iterator_tag;\n    using value_type = typename Span::value_type;\n    using difference_type = std::ptrdiff_t;\n    using pointer = value_type*;\n    using reference = value_type&;\n\nprivate:\n    template <typename ValueType, std::ptrdiff_t FirstDimension, std::ptrdiff_t... RestDimensions>\n    friend class multi_span;\n\n    pointer data_;\n    const Span* m_validator;\n\n    GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n    void validateThis() const\n    {\n        // iterator is out of range of the array\n        Expects(data_ >= m_validator->data_ && data_ < m_validator->data_ + m_validator->size());\n    }\n\n    GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n    contiguous_span_iterator(const Span* container, bool isbegin)\n        : data_(isbegin ? container->data_ : container->data_ + container->size())\n        , m_validator(container)\n    {}\n\npublic:\n    reference operator*() const\n    {\n        validateThis();\n        return *data_;\n    }\n    pointer operator->() const\n    {\n        validateThis();\n        return data_;\n    }\n\n    GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n    contiguous_span_iterator& operator++() noexcept\n    {\n        ++data_;\n        return *this;\n    }\n    contiguous_span_iterator operator++(int) noexcept\n    {\n        auto ret = *this;\n        ++(*this);\n        return ret;\n    }\n\n    GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n    contiguous_span_iterator& operator--() noexcept\n    {\n        --data_;\n        return *this;\n    }\n    contiguous_span_iterator operator--(int) noexcept\n    {\n        auto ret = *this;\n        --(*this);\n        return ret;\n    }\n    contiguous_span_iterator operator+(difference_type n) const noexcept\n    {\n        contiguous_span_iterator ret{*this};\n        return ret += n;\n    }\n    contiguous_span_iterator& operator+=(difference_type n) noexcept\n    {\n        data_ += n;\n        return *this;\n    }\n    contiguous_span_iterator operator-(difference_type n) const noexcept\n    {\n        contiguous_span_iterator ret{*this};\n        return ret -= n;\n    }\n\n    contiguous_span_iterator& operator-=(difference_type n) { return *this += -n; }\n    difference_type operator-(const contiguous_span_iterator& rhs) const\n    {\n        Expects(m_validator == rhs.m_validator);\n        return data_ - rhs.data_;\n    }\n    reference operator[](difference_type n) const { return *(*this + n); }\n    bool operator==(const contiguous_span_iterator& rhs) const\n    {\n        Expects(m_validator == rhs.m_validator);\n        return data_ == rhs.data_;\n    }\n\n    bool operator!=(const contiguous_span_iterator& rhs) const { return !(*this == rhs); }\n\n    bool operator<(const contiguous_span_iterator& rhs) const\n    {\n        Expects(m_validator == rhs.m_validator);\n        return data_ < rhs.data_;\n    }\n\n    bool operator<=(const contiguous_span_iterator& rhs) const { return !(rhs < *this); }\n    bool operator>(const contiguous_span_iterator& rhs) const { return rhs < *this; }\n    bool operator>=(const contiguous_span_iterator& rhs) const { return !(rhs > *this); }\n\n    void swap(contiguous_span_iterator & rhs) noexcept\n    {\n        std::swap(data_, rhs.data_);\n        std::swap(m_validator, rhs.m_validator);\n    }\n};\n\ntemplate <typename Span>\ncontiguous_span_iterator<Span> operator+(typename contiguous_span_iterator<Span>::difference_type n,\n                                         const contiguous_span_iterator<Span>& rhs) noexcept\n{\n    return rhs + n;\n}\n\ntemplate <typename Span>\nclass [[deprecated]] general_span_iterator {\npublic:\n    using iterator_category = std::random_access_iterator_tag;\n    using value_type = typename Span::value_type;\n    using difference_type = std::ptrdiff_t;\n    using pointer = value_type*;\n    using reference = value_type&;\n\nprivate:\n    template <typename ValueType, std::size_t Rank>\n    friend class strided_span;\n\n    const Span* m_container;\n    typename Span::bounds_type::iterator m_itr;\n    general_span_iterator(const Span* container, bool isbegin)\n        : m_container(container)\n        , m_itr(isbegin ? m_container->bounds().begin() : m_container->bounds().end())\n    {}\n\npublic:\n    reference operator*() noexcept { return (*m_container)[*m_itr]; }\n    pointer operator->() noexcept { return &(*m_container)[*m_itr]; }\n    general_span_iterator& operator++() noexcept\n    {\n        ++m_itr;\n        return *this;\n    }\n    general_span_iterator operator++(int) noexcept\n    {\n        auto ret = *this;\n        ++(*this);\n        return ret;\n    }\n    general_span_iterator& operator--() noexcept\n    {\n        --m_itr;\n        return *this;\n    }\n    general_span_iterator operator--(int) noexcept\n    {\n        auto ret = *this;\n        --(*this);\n        return ret;\n    }\n    general_span_iterator operator+(difference_type n) const noexcept\n    {\n        general_span_iterator ret{*this};\n        return ret += n;\n    }\n    general_span_iterator& operator+=(difference_type n) noexcept\n    {\n        m_itr += n;\n        return *this;\n    }\n    general_span_iterator operator-(difference_type n) const noexcept\n    {\n        general_span_iterator ret{*this};\n        return ret -= n;\n    }\n    general_span_iterator& operator-=(difference_type n) noexcept { return *this += -n; }\n    difference_type operator-(const general_span_iterator& rhs) const\n    {\n        Expects(m_container == rhs.m_container);\n        return m_itr - rhs.m_itr;\n    }\n\n    GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\n    value_type operator[](difference_type n) const { return (*m_container)[m_itr[n]]; }\n\n    bool operator==(const general_span_iterator& rhs) const\n    {\n        Expects(m_container == rhs.m_container);\n        return m_itr == rhs.m_itr;\n    }\n    bool operator!=(const general_span_iterator& rhs) const { return !(*this == rhs); }\n    bool operator<(const general_span_iterator& rhs) const\n    {\n        Expects(m_container == rhs.m_container);\n        return m_itr < rhs.m_itr;\n    }\n    bool operator<=(const general_span_iterator& rhs) const { return !(rhs < *this); }\n    bool operator>(const general_span_iterator& rhs) const { return rhs < *this; }\n    bool operator>=(const general_span_iterator& rhs) const { return !(rhs > *this); }\n    void swap(general_span_iterator & rhs) noexcept\n    {\n        std::swap(m_itr, rhs.m_itr);\n        std::swap(m_container, rhs.m_container);\n    }\n};\n\ntemplate <typename Span>\ngeneral_span_iterator<Span> operator+(typename general_span_iterator<Span>::difference_type n,\n                                      const general_span_iterator<Span>& rhs) noexcept\n{\n    return rhs + n;\n}\n\n} // namespace gsl\n\n#if defined(_MSC_VER) && !defined(__clang__)\n#if _MSC_VER < 1910\n\n#undef constexpr\n#pragma pop_macro(\"constexpr\")\n#endif // _MSC_VER < 1910\n\n#pragma warning(pop)\n\n#endif // _MSC_VER\n\n#if defined(__GNUC__) && __GNUC__ > 6\n#pragma GCC diagnostic pop\n#endif // __GNUC__ > 6\n\n#if defined(__GNUC__) || defined(__clang__)\n#pragma GCC diagnostic pop\n#endif\n\n#endif // GSL_MULTI_SPAN_H\n"
  },
  {
    "path": "examples/libraries/GSL/include/gsl/pointers",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#ifndef GSL_POINTERS_H\n#define GSL_POINTERS_H\n\n#include <gsl/gsl_assert>  // for Ensures, Expects\n\n#include <algorithm>    // for forward\n#include <iosfwd>       // for ptrdiff_t, nullptr_t, ostream, size_t\n#include <memory>       // for shared_ptr, unique_ptr\n#include <system_error> // for hash\n#include <type_traits>  // for enable_if_t, is_convertible, is_assignable\n\n#if defined(_MSC_VER) && _MSC_VER < 1910 && !defined(__clang__)\n#pragma push_macro(\"constexpr\")\n#define constexpr /*constexpr*/\n\n#endif                          // defined(_MSC_VER) && _MSC_VER < 1910\n\nnamespace gsl\n{\n\n//\n// GSL.owner: ownership pointers\n//\nusing std::unique_ptr;\nusing std::shared_ptr;\n\n//\n// owner\n//\n// owner<T> is designed as a bridge for code that must deal directly with owning pointers for some reason\n//\n// T must be a pointer type\n// - disallow construction from any type other than pointer type\n//\ntemplate <class T, class = std::enable_if_t<std::is_pointer<T>::value>>\nusing owner = T;\n\n//\n// not_null\n//\n// Restricts a pointer or smart pointer to only hold non-null values.\n//\n// Has zero size overhead over T.\n//\n// If T is a pointer (i.e. T == U*) then\n// - allow construction from U*\n// - disallow construction from nullptr_t\n// - disallow default construction\n// - ensure construction from null U* fails\n// - allow implicit conversion to U*\n//\ntemplate <class T>\nclass not_null\n{\npublic:\n    static_assert(std::is_assignable<T&, std::nullptr_t>::value, \"T cannot be assigned nullptr.\");\n\n    template <typename U, typename = std::enable_if_t<std::is_convertible<U, T>::value>>\n    constexpr not_null(U&& u) : ptr_(std::forward<U>(u))\n    {\n        Expects(ptr_ != nullptr);\n    }\n\n    template <typename = std::enable_if_t<!std::is_same<std::nullptr_t, T>::value>>\n    constexpr not_null(T u) : ptr_(u)\n    {\n        Expects(ptr_ != nullptr);\n    }\n\n    template <typename U, typename = std::enable_if_t<std::is_convertible<U, T>::value>>\n    constexpr not_null(const not_null<U>& other) : not_null(other.get())\n    {\n    }\n\n    not_null(const not_null& other) = default;\n    not_null& operator=(const not_null& other) = default;\n\n    constexpr T get() const\n    {\n        Ensures(ptr_ != nullptr);\n        return ptr_;\n    }\n\n    constexpr operator T() const { return get(); }\n    constexpr T operator->() const { return get(); }\n    constexpr decltype(auto) operator*() const { return *get(); }\n\n    // prevents compilation when someone attempts to assign a null pointer constant\n    not_null(std::nullptr_t) = delete;\n    not_null& operator=(std::nullptr_t) = delete;\n\n    // unwanted operators...pointers only point to single objects!\n    not_null& operator++() = delete;\n    not_null& operator--() = delete;\n    not_null operator++(int) = delete;\n    not_null operator--(int) = delete;\n    not_null& operator+=(std::ptrdiff_t) = delete;\n    not_null& operator-=(std::ptrdiff_t) = delete;\n    void operator[](std::ptrdiff_t) const = delete;\n\nprivate:\n    T ptr_;\n};\n\ntemplate <class T>\nauto make_not_null(T&& t) {\n    return not_null<std::remove_cv_t<std::remove_reference_t<T>>>{std::forward<T>(t)};\n}\n\ntemplate <class T>\nstd::ostream& operator<<(std::ostream& os, const not_null<T>& val)\n{\n    os << val.get();\n    return os;\n}\n\ntemplate <class T, class U>\nauto operator==(const not_null<T>& lhs, const not_null<U>& rhs) -> decltype(lhs.get() == rhs.get())\n{\n    return lhs.get() == rhs.get();\n}\n\ntemplate <class T, class U>\nauto operator!=(const not_null<T>& lhs, const not_null<U>& rhs) -> decltype(lhs.get() != rhs.get())\n{\n    return lhs.get() != rhs.get();\n}\n\ntemplate <class T, class U>\nauto operator<(const not_null<T>& lhs, const not_null<U>& rhs) -> decltype(lhs.get() < rhs.get())\n{\n    return lhs.get() < rhs.get();\n}\n\ntemplate <class T, class U>\nauto operator<=(const not_null<T>& lhs, const not_null<U>& rhs) -> decltype(lhs.get() <= rhs.get())\n{\n    return lhs.get() <= rhs.get();\n}\n\ntemplate <class T, class U>\nauto operator>(const not_null<T>& lhs, const not_null<U>& rhs) -> decltype(lhs.get() > rhs.get())\n{\n    return lhs.get() > rhs.get();\n}\n\ntemplate <class T, class U>\nauto operator>=(const not_null<T>& lhs, const not_null<U>& rhs) -> decltype(lhs.get() >= rhs.get())\n{\n    return lhs.get() >= rhs.get();\n}\n\n// more unwanted operators\ntemplate <class T, class U>\nstd::ptrdiff_t operator-(const not_null<T>&, const not_null<U>&) = delete;\ntemplate <class T>\nnot_null<T> operator-(const not_null<T>&, std::ptrdiff_t) = delete;\ntemplate <class T>\nnot_null<T> operator+(const not_null<T>&, std::ptrdiff_t) = delete;\ntemplate <class T>\nnot_null<T> operator+(std::ptrdiff_t, const not_null<T>&) = delete;\n\n} // namespace gsl\n\nnamespace std\n{\ntemplate <class T>\nstruct hash<gsl::not_null<T>>\n{\n    std::size_t operator()(const gsl::not_null<T>& value) const { return hash<T>{}(value); }\n};\n\n} // namespace std\n\nnamespace gsl\n{\n\n//\n// strict_not_null\n//\n// Restricts a pointer or smart pointer to only hold non-null values,\n//\n// - provides a strict (i.e. explicit constructor from T) wrapper of not_null\n// - to be used for new code that wishes the design to be cleaner and make not_null\n//   checks intentional, or in old code that would like to make the transition.\n//\n//   To make the transition from not_null, incrementally replace not_null\n//   by strict_not_null and fix compilation errors\n//\n//   Expect to\n//   - remove all unneeded conversions from raw pointer to not_null and back\n//   - make API clear by specifying not_null in parameters where needed\n//   - remove unnecessary asserts\n//\ntemplate <class T>\nclass strict_not_null: public not_null<T>\n{\npublic:\n\n    template <typename U, typename = std::enable_if_t<std::is_convertible<U, T>::value>>\n    constexpr explicit strict_not_null(U&& u) :\n        not_null<T>(std::forward<U>(u))\n    {}\n\n    template <typename = std::enable_if_t<!std::is_same<std::nullptr_t, T>::value>>\n    constexpr explicit strict_not_null(T u) :\n        not_null<T>(u)\n    {}\n\n    template <typename U, typename = std::enable_if_t<std::is_convertible<U, T>::value>>\n    constexpr strict_not_null(const not_null<U>& other) :\n        not_null<T>(other)\n    {}\n\n    template <typename U, typename = std::enable_if_t<std::is_convertible<U, T>::value>>\n    constexpr strict_not_null(const strict_not_null<U>& other) :\n        not_null<T>(other)\n    {}\n\n    strict_not_null(strict_not_null&& other) = default;\n    strict_not_null(const strict_not_null& other) = default;\n    strict_not_null& operator=(const strict_not_null& other) = default;\n    strict_not_null& operator=(const not_null<T>& other)\n    {\n        not_null<T>::operator=(other);\n        return *this;\n    }\n\n    // prevents compilation when someone attempts to assign a null pointer constant\n    strict_not_null(std::nullptr_t) = delete;\n    strict_not_null& operator=(std::nullptr_t) = delete;\n\n    // unwanted operators...pointers only point to single objects!\n    strict_not_null& operator++() = delete;\n    strict_not_null& operator--() = delete;\n    strict_not_null operator++(int) = delete;\n    strict_not_null operator--(int) = delete;\n    strict_not_null& operator+=(std::ptrdiff_t) = delete;\n    strict_not_null& operator-=(std::ptrdiff_t) = delete;\n    void operator[](std::ptrdiff_t) const = delete;\n};\n\n// more unwanted operators\ntemplate <class T, class U>\nstd::ptrdiff_t operator-(const strict_not_null<T>&, const strict_not_null<U>&) = delete;\ntemplate <class T>\nstrict_not_null<T> operator-(const strict_not_null<T>&, std::ptrdiff_t) = delete;\ntemplate <class T>\nstrict_not_null<T> operator+(const strict_not_null<T>&, std::ptrdiff_t) = delete;\ntemplate <class T>\nstrict_not_null<T> operator+(std::ptrdiff_t, const strict_not_null<T>&) = delete;\n\ntemplate <class T>\nauto make_strict_not_null(T&& t) {\n    return strict_not_null<std::remove_cv_t<std::remove_reference_t<T>>>{std::forward<T>(t)};\n}\n\n#if ( defined(__cpp_deduction_guides) && (__cpp_deduction_guides >= 201611L) )\n\n// deduction guides to prevent the ctad-maybe-unsupported warning\ntemplate <class T> not_null(T) -> not_null<T>;\ntemplate <class T> strict_not_null(T) -> strict_not_null<T>;\n\n#endif // ( defined(__cpp_deduction_guides) && (__cpp_deduction_guides >= 201611L) )\n\n} // namespace gsl\n\nnamespace std\n{\ntemplate <class T>\nstruct hash<gsl::strict_not_null<T>>\n{\n    std::size_t operator()(const gsl::strict_not_null<T>& value) const { return hash<T>{}(value); }\n};\n\n} // namespace std\n\n#if defined(_MSC_VER) && _MSC_VER < 1910 && !defined(__clang__)\n\n#undef constexpr\n#pragma pop_macro(\"constexpr\")\n\n#endif // defined(_MSC_VER) && _MSC_VER < 1910 && !defined(__clang__)\n\n#endif // GSL_POINTERS_H\n"
  },
  {
    "path": "examples/libraries/GSL/include/gsl/span",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#ifndef GSL_SPAN_H\n#define GSL_SPAN_H\n\n#include <gsl/gsl_assert> // for Expects\n#include <gsl/gsl_byte>   // for byte\n\n#include <array>       // for array\n#include <cstddef>     // for ptrdiff_t, size_t, nullptr_t\n#include <iterator>    // for reverse_iterator, distance, random_access_...\n#include <type_traits> // for enable_if_t, declval, is_convertible, inte...\n\n#if defined(_MSC_VER) && !defined(__clang__)\n#pragma warning(push)\n\n// turn off some warnings that are noisy about our Expects statements\n#pragma warning(disable : 4127) // conditional expression is constant\n#pragma warning(                                                                                   \\\n    disable : 4146) // unary minus operator applied to unsigned type, result still unsigned\n#pragma warning(disable : 4702) // unreachable code\n\n// Turn MSVC /analyze rules that generate too much noise. TODO: fix in the tool.\n#pragma warning(disable : 26495) // uninitalized member when constructor calls constructor\n#pragma warning(disable : 26446) // parser bug does not allow attributes on some templates\n\n#if _MSC_VER < 1910\n#pragma push_macro(\"constexpr\")\n#define constexpr /*constexpr*/\n#define GSL_USE_STATIC_CONSTEXPR_WORKAROUND\n\n#endif // _MSC_VER < 1910\n#endif // _MSC_VER\n\n// See if we have enough C++17 power to use a static constexpr data member\n// without needing an out-of-line definition\n#if !(defined(__cplusplus) && (__cplusplus >= 201703L))\n#define GSL_USE_STATIC_CONSTEXPR_WORKAROUND\n#endif // !(defined(__cplusplus) && (__cplusplus >= 201703L))\n\n// GCC 7 does not like the signed unsigned missmatch (size_t ptrdiff_t)\n// While there is a conversion from signed to unsigned, it happens at\n// compiletime, so the compiler wouldn't have to warn indiscriminately, but\n// could check if the source value actually doesn't fit into the target type\n// and only warn in those cases.\n#if defined(__GNUC__) && __GNUC__ > 6\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wsign-conversion\"\n#endif\n\nnamespace gsl\n{\n\n// [views.constants], constants\nconstexpr const std::size_t dynamic_extent = static_cast<std::size_t>(-1);\n\ntemplate <class ElementType, std::size_t Extent = dynamic_extent>\nclass span;\n\n// implementation details\nnamespace details\n{\n    template <class T>\n    struct is_span_oracle : std::false_type\n    {\n    };\n\n    template <class ElementType, std::size_t Extent>\n    struct is_span_oracle<gsl::span<ElementType, Extent>> : std::true_type\n    {\n    };\n\n    template <class T>\n    struct is_span : public is_span_oracle<std::remove_cv_t<T>>\n    {\n    };\n\n    template <class T>\n    struct is_std_array_oracle : std::false_type\n    {\n    };\n\n    template <class ElementType, std::size_t Extent>\n    struct is_std_array_oracle<std::array<ElementType, Extent>> : std::true_type\n    {\n    };\n\n    template <class T>\n    struct is_std_array : is_std_array_oracle<std::remove_cv_t<T>>\n    {\n    };\n\n    template <std::size_t From, std::size_t To>\n    struct is_allowed_extent_conversion\n        : std::integral_constant<bool, From == To || To == gsl::dynamic_extent>\n    {\n    };\n\n    template <class From, class To>\n    struct is_allowed_element_type_conversion\n        : std::integral_constant<bool, std::is_convertible<From (*)[], To (*)[]>::value>\n    {\n    };\n\n    template <class Type>\n    class span_iterator\n    {\n    public:\n        using iterator_category = std::random_access_iterator_tag;\n        using value_type = std::remove_cv_t<Type>;\n        using difference_type = std::ptrdiff_t;\n        using pointer = Type*;\n        using reference = Type&;\n\n#ifdef _MSC_VER\n        using _Unchecked_type = pointer;\n#endif // _MSC_VER\n        constexpr span_iterator() = default;\n\n        constexpr span_iterator(pointer begin, pointer end, pointer current)\n            : begin_(begin), end_(end), current_(current)\n        {}\n\n        constexpr operator span_iterator<const Type>() const noexcept\n        {\n            return {begin_, end_, current_};\n        }\n\n        constexpr reference operator*() const noexcept\n        {\n            Expects(begin_ && end_);\n            Expects(begin_ <= current_ && current_ < end_);\n            return *current_;\n        }\n\n        constexpr pointer operator->() const noexcept\n        {\n            Expects(begin_ && end_);\n            Expects(begin_ <= current_ && current_ < end_);\n            return current_;\n        }\n        constexpr span_iterator& operator++() noexcept\n        {\n            Expects(begin_ && current_ && end_);\n            Expects(current_ < end_);\n            ++current_;\n            return *this;\n        }\n\n        constexpr span_iterator operator++(int) noexcept\n        {\n            span_iterator ret = *this;\n            ++*this;\n            return ret;\n        }\n\n        constexpr span_iterator& operator--() noexcept\n        {\n            Expects(begin_ && end_);\n            Expects(begin_ < current_);\n            --current_;\n            return *this;\n        }\n\n        constexpr span_iterator operator--(int) noexcept\n        {\n            span_iterator ret = *this;\n            --*this;\n            return ret;\n        }\n\n        constexpr span_iterator& operator+=(const difference_type n) noexcept\n        {\n            if (n != 0) Expects(begin_ && current_ && end_);\n            if (n > 0) Expects(end_ - current_ >= n);\n            if (n < 0) Expects(current_ - begin_ >= -n);\n            current_ += n;\n            return *this;\n        }\n\n        constexpr span_iterator operator+(const difference_type n) const noexcept\n        {\n            span_iterator ret = *this;\n            ret += n;\n            return ret;\n        }\n\n        friend constexpr span_iterator operator+(const difference_type n,\n                                                 const span_iterator& rhs) noexcept\n        {\n            return rhs + n;\n        }\n\n        constexpr span_iterator& operator-=(const difference_type n) noexcept\n        {\n            if (n != 0) Expects(begin_ && current_ && end_);\n            if (n > 0) Expects(current_ - begin_ >= n);\n            if (n < 0) Expects(end_ - current_ >= -n);\n            current_ -= n;\n            return *this;\n        }\n\n        constexpr span_iterator operator-(const difference_type n) const noexcept\n        {\n            span_iterator ret = *this;\n            ret -= n;\n            return ret;\n        }\n\n        template <\n            class Type2,\n            std::enable_if_t<std::is_same<std::remove_cv_t<Type2>, value_type>::value, int> = 0>\n        constexpr difference_type operator-(const span_iterator<Type2>& rhs) const noexcept\n        {\n            Expects(begin_ == rhs.begin_ && end_ == rhs.end_);\n            return current_ - rhs.current_;\n        }\n\n        constexpr reference operator[](const difference_type n) const noexcept\n        {\n            return *(*this + n);\n        }\n\n        template <\n            class Type2,\n            std::enable_if_t<std::is_same<std::remove_cv_t<Type2>, value_type>::value, int> = 0>\n        constexpr bool operator==(const span_iterator<Type2>& rhs) const noexcept\n        {\n            Expects(begin_ == rhs.begin_ && end_ == rhs.end_);\n            return current_ == rhs.current_;\n        }\n\n        template <\n            class Type2,\n            std::enable_if_t<std::is_same<std::remove_cv_t<Type2>, value_type>::value, int> = 0>\n        constexpr bool operator!=(const span_iterator<Type2>& rhs) const noexcept\n        {\n            return !(*this == rhs);\n        }\n\n        template <\n            class Type2,\n            std::enable_if_t<std::is_same<std::remove_cv_t<Type2>, value_type>::value, int> = 0>\n        constexpr bool operator<(const span_iterator<Type2>& rhs) const noexcept\n        {\n            Expects(begin_ == rhs.begin_ && end_ == rhs.end_);\n            return current_ < rhs.current_;\n        }\n\n        template <\n            class Type2,\n            std::enable_if_t<std::is_same<std::remove_cv_t<Type2>, value_type>::value, int> = 0>\n        constexpr bool operator>(const span_iterator<Type2>& rhs) const noexcept\n        {\n            return rhs < *this;\n        }\n\n        template <\n            class Type2,\n            std::enable_if_t<std::is_same<std::remove_cv_t<Type2>, value_type>::value, int> = 0>\n        constexpr bool operator<=(const span_iterator<Type2>& rhs) const noexcept\n        {\n            return !(rhs < *this);\n        }\n\n        template <\n            class Type2,\n            std::enable_if_t<std::is_same<std::remove_cv_t<Type2>, value_type>::value, int> = 0>\n        constexpr bool operator>=(const span_iterator<Type2>& rhs) const noexcept\n        {\n            return !(*this < rhs);\n        }\n\n#ifdef _MSC_VER\n        // MSVC++ iterator debugging support; allows STL algorithms in 15.8+\n        // to unwrap span_iterator to a pointer type after a range check in STL\n        // algorithm calls\n        friend constexpr void _Verify_range(span_iterator lhs, span_iterator rhs) noexcept\n        { // test that [lhs, rhs) forms a valid range inside an STL algorithm\n            Expects(lhs.begin_ == rhs.begin_ // range spans have to match\n                    && lhs.end_ == rhs.end_ &&\n                    lhs.current_ <= rhs.current_); // range must not be transposed\n        }\n\n        constexpr void _Verify_offset(const difference_type n) const noexcept\n        { // test that *this + n is within the range of this call\n            if (n != 0) Expects(begin_ && current_ && end_);\n            if (n > 0) Expects(end_ - current_ >= n);\n            if (n < 0) Expects(current_ - begin_ >= -n);\n        }\n\n        // clang-format off\n        GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n        // clang-format on\n        constexpr pointer _Unwrapped() const noexcept\n        { // after seeking *this to a high water mark, or using one of the\n            // _Verify_xxx functions above, unwrap this span_iterator to a raw\n            // pointer\n            return current_;\n        }\n\n        // Tell the STL that span_iterator should not be unwrapped if it can't\n        // validate in advance, even in release / optimized builds:\n#if defined(GSL_USE_STATIC_CONSTEXPR_WORKAROUND)\n        static constexpr const bool _Unwrap_when_unverified = false;\n#else\n        static constexpr bool _Unwrap_when_unverified = false;\n#endif\n        // clang-format off\n        GSL_SUPPRESS(con.3) // NO-FORMAT: attribute // TODO: false positive\n        // clang-format on\n        constexpr void _Seek_to(const pointer p) noexcept\n        { // adjust the position of *this to previously verified location p\n            // after _Unwrapped\n            current_ = p;\n        }\n#endif\n\n        pointer begin_ = nullptr;\n        pointer end_ = nullptr;\n        pointer current_ = nullptr;\n    };\n\n    template <std::size_t Ext>\n    class extent_type\n    {\n    public:\n        using size_type = std::size_t;\n\n        constexpr extent_type() noexcept = default;\n\n        template <size_type Other>\n        constexpr extent_type(extent_type<Other> ext)\n        {\n            static_assert(Other == Ext,\n                          \"Mismatch between fixed-size extent and size of initializing data.\");\n            Expects(ext.size() == Ext);\n        }\n\n        constexpr extent_type(size_type size) { Expects(size == Ext); }\n\n        constexpr size_type size() const noexcept { return Ext; }\n    };\n\n    template <>\n    class extent_type<dynamic_extent>\n    {\n    public:\n        using size_type = std::size_t;\n\n        template <size_type Other>\n        explicit constexpr extent_type(extent_type<Other> ext) : size_(ext.size())\n        {}\n\n        explicit constexpr extent_type(size_type size) : size_(size)\n        {\n            Expects(size != dynamic_extent);\n        }\n\n        constexpr size_type size() const noexcept { return size_; }\n\n    private:\n        size_type size_;\n    };\n\n    template <class ElementType, std::size_t Extent, std::size_t Offset, std::size_t Count>\n    struct calculate_subspan_type\n    {\n        using type = span<ElementType, Count != dynamic_extent\n                                           ? Count\n                                           : (Extent != dynamic_extent ? Extent - Offset : Extent)>;\n    };\n} // namespace details\n\n// [span], class template span\ntemplate <class ElementType, std::size_t Extent>\nclass span\n{\npublic:\n    // constants and types\n    using element_type = ElementType;\n    using value_type = std::remove_cv_t<ElementType>;\n    using size_type = std::size_t;\n    using pointer = element_type*;\n    using const_pointer = const element_type*;\n    using reference = element_type&;\n    using const_reference = const element_type&;\n    using difference_type = std::ptrdiff_t;\n\n    using iterator = details::span_iterator<ElementType>;\n    using reverse_iterator = std::reverse_iterator<iterator>;\n\n#if defined(GSL_USE_STATIC_CONSTEXPR_WORKAROUND)\n    static constexpr const size_type extent{Extent};\n#else\n    static constexpr size_type extent{Extent};\n#endif\n\n    // [span.cons], span constructors, copy, assignment, and destructor\n    template <bool Dependent = false,\n              // \"Dependent\" is needed to make \"std::enable_if_t<Dependent || Extent == 0 || Extent\n              // == dynamic_extent>\" SFINAE, since \"std::enable_if_t<Extent == 0 || Extent ==\n              // dynamic_extent>\" is ill-formed when Extent is greater than 0.\n              class = std::enable_if_t<(Dependent ||\n                                        details::is_allowed_extent_conversion<0, Extent>::value)>>\n    constexpr span() noexcept : storage_(nullptr, details::extent_type<0>())\n    {}\n\n    constexpr span(pointer ptr, size_type count) noexcept : storage_(ptr, count)\n    {\n        if (Extent != dynamic_extent) Expects(count == Extent);\n    }\n\n    constexpr span(pointer firstElem, pointer lastElem) noexcept\n        : storage_(firstElem, static_cast<std::size_t>(lastElem - firstElem))\n    {\n        if (Extent != dynamic_extent)\n        { Expects(lastElem - firstElem == static_cast<difference_type>(Extent)); }\n    }\n\n    template <std::size_t N,\n              std::enable_if_t<details::is_allowed_extent_conversion<N, Extent>::value, int> = 0>\n    constexpr span(element_type (&arr)[N]) noexcept\n        : storage_(KnownNotNull{arr + 0}, details::extent_type<N>())\n    {}\n\n    template <\n        class T, std::size_t N,\n        std::enable_if_t<(details::is_allowed_extent_conversion<N, Extent>::value &&\n                          details::is_allowed_element_type_conversion<T, element_type>::value),\n                         int> = 0>\n    constexpr span(std::array<T, N>& arr) noexcept\n        : storage_(KnownNotNull{arr.data()}, details::extent_type<N>())\n    {}\n\n    template <class T, std::size_t N,\n              std::enable_if_t<\n                  (details::is_allowed_extent_conversion<N, Extent>::value &&\n                   details::is_allowed_element_type_conversion<const T, element_type>::value),\n                  int> = 0>\n    constexpr span(const std::array<T, N>& arr) noexcept\n        : storage_(KnownNotNull{arr.data()}, details::extent_type<N>())\n    {}\n\n    // NB: the SFINAE here uses .data() as an incomplete/imperfect proxy for the requirement\n    // on Container to be a contiguous sequence container.\n    template <class Container,\n              class = std::enable_if_t<\n                  !details::is_span<Container>::value && !details::is_std_array<Container>::value &&\n                  std::is_pointer<decltype(std::declval<Container&>().data())>::value &&\n                  std::is_convertible<\n                      std::remove_pointer_t<decltype(std::declval<Container&>().data())> (*)[],\n                      element_type (*)[]>::value>>\n    constexpr span(Container& cont) noexcept : span(cont.data(), cont.size())\n    {}\n\n    template <class Container,\n              class = std::enable_if_t<\n                  std::is_const<element_type>::value && !details::is_span<Container>::value &&\n                  !details::is_std_array<Container>::value &&\n                  std::is_pointer<decltype(std::declval<const Container&>().data())>::value &&\n                  std::is_convertible<std::remove_pointer_t<\n                                          decltype(std::declval<const Container&>().data())> (*)[],\n                                      element_type (*)[]>::value>>\n    constexpr span(const Container& cont) noexcept : span(cont.data(), cont.size())\n    {}\n\n    constexpr span(const span& other) noexcept = default;\n\n    template <\n        class OtherElementType, std::size_t OtherExtent,\n        class = std::enable_if_t<\n            details::is_allowed_extent_conversion<OtherExtent, Extent>::value &&\n            details::is_allowed_element_type_conversion<OtherElementType, element_type>::value>>\n    constexpr span(const span<OtherElementType, OtherExtent>& other) noexcept\n        : storage_(other.data(), details::extent_type<OtherExtent>(other.size()))\n    {}\n\n    ~span() noexcept = default;\n    constexpr span& operator=(const span& other) noexcept = default;\n\n    // [span.sub], span subviews\n    template <std::size_t Count>\n    constexpr span<element_type, Count> first() const noexcept\n    {\n        Expects(Count <= size());\n        return {data(), Count};\n    }\n\n    template <std::size_t Count>\n    // clang-format off\n    GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n        // clang-format on\n        constexpr span<element_type, Count> last() const noexcept\n    {\n        Expects(Count <= size());\n        return {data() + (size() - Count), Count};\n    }\n\n    template <std::size_t Offset, std::size_t Count = dynamic_extent>\n    // clang-format off\n    GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n        // clang-format on\n        constexpr auto subspan() const noexcept ->\n        typename details::calculate_subspan_type<ElementType, Extent, Offset, Count>::type\n    {\n        Expects((size() >= Offset) && (Count == dynamic_extent || (Count <= size() - Offset)));\n\n        return {data() + Offset, Count == dynamic_extent ? size() - Offset : Count};\n    }\n\n    constexpr span<element_type, dynamic_extent> first(size_type count) const noexcept\n    {\n        Expects(count <= size());\n        return {data(), count};\n    }\n\n    constexpr span<element_type, dynamic_extent> last(size_type count) const noexcept\n    {\n        Expects(count <= size());\n        return make_subspan(size() - count, dynamic_extent, subspan_selector<Extent>{});\n    }\n\n    constexpr span<element_type, dynamic_extent> subspan(size_type offset,\n                                                         size_type count = dynamic_extent) const\n        noexcept\n    {\n        return make_subspan(offset, count, subspan_selector<Extent>{});\n    }\n\n    // [span.obs], span observers\n    constexpr size_type size() const noexcept { return storage_.size(); }\n\n    constexpr size_type size_bytes() const noexcept\n    {\n        Expects(size() < dynamic_extent / sizeof(element_type));\n        return size() * sizeof(element_type);\n    }\n\n    constexpr bool empty() const noexcept { return size() == 0; }\n\n    // [span.elem], span element access\n    // clang-format off\n    GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n    // clang-format on\n    constexpr reference operator[](size_type idx) const noexcept\n    {\n        Expects(idx < size());\n        return data()[idx];\n    }\n\n    constexpr reference front() const noexcept\n    {\n        Expects(size() > 0);\n        return data()[0];\n    }\n\n    constexpr reference back() const noexcept\n    {\n        Expects(size() > 0);\n        return data()[size() - 1];\n    }\n\n    constexpr pointer data() const noexcept { return storage_.data(); }\n\n    // [span.iter], span iterator support\n    constexpr iterator begin() const noexcept\n    {\n        const auto data = storage_.data();\n        // clang-format off\n        GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n        // clang-format on\n        return {data, data + size(), data};\n    }\n\n    constexpr iterator end() const noexcept\n    {\n        const auto data = storage_.data();\n        // clang-format off\n        GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n        // clang-format on\n        const auto endData = data + storage_.size();\n        return {data, endData, endData};\n    }\n\n    constexpr reverse_iterator rbegin() const noexcept { return reverse_iterator{end()}; }\n    constexpr reverse_iterator rend() const noexcept { return reverse_iterator{begin()}; }\n\n#ifdef _MSC_VER\n    // Tell MSVC how to unwrap spans in range-based-for\n    constexpr pointer _Unchecked_begin() const noexcept { return data(); }\n    constexpr pointer _Unchecked_end() const noexcept\n    {\n        // clang-format off\n        GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n        // clang-format on\n        return data() + size();\n    }\n#endif // _MSC_VER\n\nprivate:\n    // Needed to remove unnecessary null check in subspans\n    struct KnownNotNull\n    {\n        pointer p;\n    };\n\n    // this implementation detail class lets us take advantage of the\n    // empty base class optimization to pay for only storage of a single\n    // pointer in the case of fixed-size spans\n    template <class ExtentType>\n    class storage_type : public ExtentType\n    {\n    public:\n        // KnownNotNull parameter is needed to remove unnecessary null check\n        // in subspans and constructors from arrays\n        template <class OtherExtentType>\n        constexpr storage_type(KnownNotNull data, OtherExtentType ext)\n            : ExtentType(ext), data_(data.p)\n        {\n            Expects(ExtentType::size() != dynamic_extent);\n        }\n\n        template <class OtherExtentType>\n        constexpr storage_type(pointer data, OtherExtentType ext) : ExtentType(ext), data_(data)\n        {\n            Expects(ExtentType::size() != dynamic_extent);\n            Expects(data || ExtentType::size() == 0);\n        }\n\n        constexpr pointer data() const noexcept { return data_; }\n\n    private:\n        pointer data_;\n    };\n\n    storage_type<details::extent_type<Extent>> storage_;\n\n    // The rest is needed to remove unnecessary null check\n    // in subspans and constructors from arrays\n    constexpr span(KnownNotNull ptr, size_type count) noexcept : storage_(ptr, count) {}\n\n    template <std::size_t CallerExtent>\n    class subspan_selector\n    {\n    };\n\n    template <std::size_t CallerExtent>\n    constexpr span<element_type, dynamic_extent> make_subspan(size_type offset, size_type count,\n                                                              subspan_selector<CallerExtent>) const\n        noexcept\n    {\n        const span<element_type, dynamic_extent> tmp(*this);\n        return tmp.subspan(offset, count);\n    }\n\n    // clang-format off\n    GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\n    // clang-format on\n    constexpr span<element_type, dynamic_extent>\n    make_subspan(size_type offset, size_type count, subspan_selector<dynamic_extent>) const noexcept\n    {\n        Expects(size() >= offset);\n\n        if (count == dynamic_extent) { return {KnownNotNull{data() + offset}, size() - offset}; }\n\n        Expects(size() - offset >= count);\n        return {KnownNotNull{data() + offset}, count};\n    }\n};\n\n#if (defined(__cpp_deduction_guides) && (__cpp_deduction_guides >= 201611L))\n\n// Deduction Guides\ntemplate <class Type, std::size_t Extent>\nspan(Type (&)[Extent])->span<Type, Extent>;\n\ntemplate <class Type, std::size_t Size>\nspan(std::array<Type, Size>&)->span<Type, Size>;\n\ntemplate <class Type, std::size_t Size>\nspan(const std::array<Type, Size>&)->span<const Type, Size>;\n\n#endif // ( defined(__cpp_deduction_guides) && (__cpp_deduction_guides >= 201611L) )\n\n#if defined(GSL_USE_STATIC_CONSTEXPR_WORKAROUND)\ntemplate <class ElementType, std::size_t Extent>\nconstexpr const typename span<ElementType, Extent>::size_type span<ElementType, Extent>::extent;\n#endif\n\nnamespace details\n{\n    // if we only supported compilers with good constexpr support then\n    // this pair of classes could collapse down to a constexpr function\n\n    // we should use a narrow_cast<> to go to std::size_t, but older compilers may not see it as\n    // constexpr\n    // and so will fail compilation of the template\n    template <class ElementType, std::size_t Extent>\n    struct calculate_byte_size : std::integral_constant<std::size_t, sizeof(ElementType) * Extent>\n    {\n        static_assert(Extent < dynamic_extent / sizeof(ElementType), \"Size is too big.\");\n    };\n\n    template <class ElementType>\n    struct calculate_byte_size<ElementType, dynamic_extent>\n        : std::integral_constant<std::size_t, dynamic_extent>\n    {\n    };\n} // namespace details\n\n// [span.objectrep], views of object representation\ntemplate <class ElementType, std::size_t Extent>\nspan<const byte, details::calculate_byte_size<ElementType, Extent>::value>\nas_bytes(span<ElementType, Extent> s) noexcept\n{\n    // clang-format off\n    GSL_SUPPRESS(type.1) // NO-FORMAT: attribute\n    // clang-format on\n    return {reinterpret_cast<const byte*>(s.data()), s.size_bytes()};\n}\n\ntemplate <class ElementType, std::size_t Extent,\n          std::enable_if_t<!std::is_const<ElementType>::value, int> = 0>\nspan<byte, details::calculate_byte_size<ElementType, Extent>::value>\nas_writable_bytes(span<ElementType, Extent> s) noexcept\n{\n    // clang-format off\n    GSL_SUPPRESS(type.1) // NO-FORMAT: attribute\n    // clang-format on\n    return {reinterpret_cast<byte*>(s.data()), s.size_bytes()};\n}\n\n} // namespace gsl\n\n#if defined(_MSC_VER) && !defined(__clang__)\n#if _MSC_VER < 1910\n#undef constexpr\n#pragma pop_macro(\"constexpr\")\n\n#endif // _MSC_VER < 1910\n\n#pragma warning(pop)\n#endif // _MSC_VER\n\n#if defined(__GNUC__) && __GNUC__ > 6\n#pragma GCC diagnostic pop\n#endif // __GNUC__ > 6\n\n#endif // GSL_SPAN_H\n"
  },
  {
    "path": "examples/libraries/GSL/include/gsl/span_ext",
    "content": "///////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\r\n//\r\n// This code is licensed under the MIT License (MIT).\r\n//\r\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n// THE SOFTWARE.\r\n//\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\n#ifndef GSL_SPAN_EXT_H\r\n#define GSL_SPAN_EXT_H\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n//\r\n// File: span_ext\r\n// Purpose: continue offering features that have been cut from the official\r\n//   implementation of span.\r\n//   While modernizing gsl::span a number of features needed to be removed to\r\n//   be compliant with the design of std::span\r\n//\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\n\r\n#include <gsl/gsl_util> // for narrow_cast, narrow\r\n#include <gsl/span>     // for span\r\n\r\n#include <algorithm> // for lexicographical_compare\r\n#include <cstddef>   // for ptrdiff_t, size_t\r\n#include <utility>\r\n\r\nnamespace gsl\r\n{\r\n\r\n// [span.comparison], span comparison operators\r\ntemplate <class ElementType, std::size_t FirstExtent, std::size_t SecondExtent>\r\nconstexpr bool operator==(span<ElementType, FirstExtent> l, span<ElementType, SecondExtent> r)\r\n{\r\n    return std::equal(l.begin(), l.end(), r.begin(), r.end());\r\n}\r\n\r\ntemplate <class ElementType, std::size_t Extent>\r\nconstexpr bool operator!=(span<ElementType, Extent> l, span<ElementType, Extent> r)\r\n{\r\n    return !(l == r);\r\n}\r\n\r\ntemplate <class ElementType, std::size_t Extent>\r\nconstexpr bool operator<(span<ElementType, Extent> l, span<ElementType, Extent> r)\r\n{\r\n    return std::lexicographical_compare(l.begin(), l.end(), r.begin(), r.end());\r\n}\r\n\r\ntemplate <class ElementType, std::size_t Extent>\r\nconstexpr bool operator<=(span<ElementType, Extent> l, span<ElementType, Extent> r)\r\n{\r\n    return !(l > r);\r\n}\r\n\r\ntemplate <class ElementType, std::size_t Extent>\r\nconstexpr bool operator>(span<ElementType, Extent> l, span<ElementType, Extent> r)\r\n{\r\n    return r < l;\r\n}\r\n\r\ntemplate <class ElementType, std::size_t Extent>\r\nconstexpr bool operator>=(span<ElementType, Extent> l, span<ElementType, Extent> r)\r\n{\r\n    return !(l < r);\r\n}\r\n\r\n//\r\n// make_span() - Utility functions for creating spans\r\n//\r\ntemplate <class ElementType>\r\nconstexpr span<ElementType> make_span(ElementType* ptr, typename span<ElementType>::size_type count)\r\n{\r\n    return span<ElementType>(ptr, count);\r\n}\r\n\r\ntemplate <class ElementType>\r\nconstexpr span<ElementType> make_span(ElementType* firstElem, ElementType* lastElem)\r\n{\r\n    return span<ElementType>(firstElem, lastElem);\r\n}\r\n\r\ntemplate <class ElementType, std::size_t N>\r\nconstexpr span<ElementType, N> make_span(ElementType (&arr)[N]) noexcept\r\n{\r\n    return span<ElementType, N>(arr);\r\n}\r\n\r\ntemplate <class Container>\r\nconstexpr span<typename Container::value_type> make_span(Container& cont)\r\n{\r\n    return span<typename Container::value_type>(cont);\r\n}\r\n\r\ntemplate <class Container>\r\nconstexpr span<const typename Container::value_type> make_span(const Container& cont)\r\n{\r\n    return span<const typename Container::value_type>(cont);\r\n}\r\n\r\ntemplate <class Ptr>\r\nconstexpr span<typename Ptr::element_type> make_span(Ptr& cont, std::size_t count)\r\n{\r\n    return span<typename Ptr::element_type>(cont, count);\r\n}\r\n\r\ntemplate <class Ptr>\r\nconstexpr span<typename Ptr::element_type> make_span(Ptr& cont)\r\n{\r\n    return span<typename Ptr::element_type>(cont);\r\n}\r\n\r\n// Specialization of gsl::at for span\r\ntemplate <class ElementType, std::size_t Extent>\r\nconstexpr ElementType& at(span<ElementType, Extent> s, index i)\r\n{\r\n    // No bounds checking here because it is done in span::operator[] called below\r\n    Ensures(i >= 0);\r\n    return s[narrow_cast<std::size_t>(i)];\r\n}\r\n\r\n// [span.obs] Free observer functions\r\ntemplate <class ElementType, std::size_t Extent>\r\nconstexpr std::ptrdiff_t ssize(const span<ElementType, Extent>& s) noexcept\r\n{\r\n    return static_cast<std::ptrdiff_t>(s.size());\r\n}\r\n\r\n// [span.iter] Free functions for begin/end functions\r\ntemplate <class ElementType, std::size_t Extent>\r\nconstexpr typename span<ElementType, Extent>::iterator\r\nbegin(const span<ElementType, Extent>& s) noexcept\r\n{\r\n    return s.begin();\r\n}\r\n\r\ntemplate <class ElementType, std::size_t Extent = dynamic_extent>\r\nconstexpr typename span<ElementType, Extent>::iterator\r\nend(const span<ElementType, Extent>& s) noexcept\r\n{\r\n    return s.end();\r\n}\r\n\r\ntemplate <class ElementType, std::size_t Extent>\r\nconstexpr typename span<ElementType, Extent>::reverse_iterator\r\nrbegin(const span<ElementType, Extent>& s) noexcept\r\n{\r\n    return s.rbegin();\r\n}\r\n\r\ntemplate <class ElementType, std::size_t Extent>\r\nconstexpr typename span<ElementType, Extent>::reverse_iterator\r\nrend(const span<ElementType, Extent>& s) noexcept\r\n{\r\n    return s.rend();\r\n}\r\n\r\ntemplate <class ElementType, std::size_t Extent>\r\nconstexpr typename span<ElementType, Extent>::iterator\r\ncbegin(const span<ElementType, Extent>& s) noexcept\r\n{\r\n    return s.begin();\r\n}\r\n\r\ntemplate <class ElementType, std::size_t Extent = dynamic_extent>\r\nconstexpr typename span<ElementType, Extent>::iterator\r\ncend(const span<ElementType, Extent>& s) noexcept\r\n{\r\n    return s.end();\r\n}\r\n\r\ntemplate <class ElementType, std::size_t Extent>\r\nconstexpr typename span<ElementType, Extent>::reverse_iterator\r\ncrbegin(const span<ElementType, Extent>& s) noexcept\r\n{\r\n    return s.rbegin();\r\n}\r\n\r\ntemplate <class ElementType, std::size_t Extent>\r\nconstexpr typename span<ElementType, Extent>::reverse_iterator\r\ncrend(const span<ElementType, Extent>& s) noexcept\r\n{\r\n    return s.rend();\r\n}\r\n\r\n} // namespace gsl\r\n\r\n#endif // GSL_SPAN_EXT_H\r\n"
  },
  {
    "path": "examples/libraries/GSL/include/gsl/string_span",
    "content": "///////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\r\n//\r\n// This code is licensed under the MIT License (MIT).\r\n//\r\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n// THE SOFTWARE.\r\n//\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\n#ifndef GSL_STRING_SPAN_H\r\n#define GSL_STRING_SPAN_H\r\n\r\n#include <gsl/gsl_assert> // for Ensures, Expects\r\n#include <gsl/gsl_util>   // for narrow_cast\r\n#include <gsl/span_ext>       // for operator!=, operator==, dynamic_extent\r\n\r\n#include <algorithm> // for equal, lexicographical_compare\r\n#include <array>     // for array\r\n#include <cstddef>   // for size_t, nullptr_t\r\n#include <cstdint>   // for PTRDIFF_MAX\r\n#include <cstring>\r\n#include <string>    // for basic_string, allocator, char_traits\r\n#include <type_traits> // for declval, is_convertible, enable_if_t, add_...\r\n\r\n#if defined(_MSC_VER) && !defined(__clang__)\r\n#pragma warning(push)\r\n\r\n// Turn MSVC /analyze rules that generate too much noise. TODO: fix in the tool.\r\n#pragma warning(disable : 26446) // TODO: bug in parser - attributes and templates\r\n#pragma warning(disable : 26481) // TODO: suppress does not work inside templates sometimes\r\n\r\n#if _MSC_VER < 1910\r\n#pragma push_macro(\"constexpr\")\r\n#define constexpr /*constexpr*/\r\n\r\n#endif // _MSC_VER < 1910\r\n#endif // _MSC_VER\r\n\r\nnamespace gsl\r\n{\r\n//\r\n// czstring and wzstring\r\n//\r\n// These are \"tag\" typedefs for C-style strings (i.e. null-terminated character arrays)\r\n// that allow static analysis to help find bugs.\r\n//\r\n// There are no additional features/semantics that we can find a way to add inside the\r\n// type system for these types that will not either incur significant runtime costs or\r\n// (sometimes needlessly) break existing programs when introduced.\r\n//\r\n\r\ntemplate <typename CharT, std::size_t Extent = dynamic_extent>\r\nusing basic_zstring = CharT*;\r\n\r\ntemplate <std::size_t Extent = dynamic_extent>\r\nusing czstring = basic_zstring<const char, Extent>;\r\n\r\ntemplate <std::size_t Extent = dynamic_extent>\r\nusing cwzstring = basic_zstring<const wchar_t, Extent>;\r\n\r\ntemplate <std::size_t Extent = dynamic_extent>\r\nusing cu16zstring = basic_zstring<const char16_t, Extent>;\r\n\r\ntemplate <std::size_t Extent = dynamic_extent>\r\nusing cu32zstring = basic_zstring<const char32_t, Extent>;\r\n\r\ntemplate <std::size_t Extent = dynamic_extent>\r\nusing zstring = basic_zstring<char, Extent>;\r\n\r\ntemplate <std::size_t Extent = dynamic_extent>\r\nusing wzstring = basic_zstring<wchar_t, Extent>;\r\n\r\ntemplate <std::size_t Extent = dynamic_extent>\r\nusing u16zstring = basic_zstring<char16_t, Extent>;\r\n\r\ntemplate <std::size_t Extent = dynamic_extent>\r\nusing u32zstring = basic_zstring<char32_t, Extent>;\r\n\r\nnamespace details\r\n{\r\n    template <class CharT>\r\n    std::size_t string_length(const CharT* str, std::size_t n)\r\n    {\r\n        if (str == nullptr || n == dynamic_extent) return 0;\r\n\r\n        const span<const CharT> str_span{str, n};\r\n\r\n        std::size_t len = 0;\r\n        while (len < n && str_span[len]) len++;\r\n\r\n        return len;\r\n    }\r\n} // namespace details\r\n\r\n//\r\n// ensure_sentinel()\r\n//\r\n// Provides a way to obtain an span from a contiguous sequence\r\n// that ends with a (non-inclusive) sentinel value.\r\n//\r\n// Will fail-fast if sentinel cannot be found before max elements are examined.\r\n//\r\ntemplate <typename T, const T Sentinel>\r\nspan<T, dynamic_extent> ensure_sentinel(T* seq,\r\n                                        std::size_t max = static_cast<std::size_t>(-1))\r\n{\r\n    Ensures(seq != nullptr);\r\n\r\n    GSL_SUPPRESS(\r\n        f.23) // NO-FORMAT: attribute // TODO: false positive // TODO: suppress does not work\r\n    auto cur = seq;\r\n    Ensures(cur != nullptr); // workaround for removing the warning\r\n\r\n    GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute // TODO: suppress does not work\r\n    while (static_cast<std::size_t>(cur - seq) < max && *cur != Sentinel) ++cur;\r\n    Ensures(*cur == Sentinel);\r\n    return {seq, static_cast<std::size_t>(cur - seq)};\r\n}\r\n\r\n//\r\n// ensure_z - creates a span for a zero terminated strings.\r\n// Will fail fast if a null-terminator cannot be found before\r\n// the limit of size_type.\r\n//\r\ntemplate <typename CharT>\r\nspan<CharT, dynamic_extent> ensure_z(CharT* const& sz,\r\n                                     std::size_t max = static_cast<std::size_t>(-1))\r\n{\r\n    return ensure_sentinel<CharT, CharT(0)>(sz, max);\r\n}\r\n\r\ntemplate <typename CharT, std::size_t N>\r\nspan<CharT, dynamic_extent> ensure_z(CharT (&sz)[N])\r\n{\r\n    return ensure_z(&sz[0], N);\r\n}\r\n\r\ntemplate <class Cont>\r\nspan<typename std::remove_pointer<typename Cont::pointer>::type, dynamic_extent>\r\nensure_z(Cont& cont)\r\n{\r\n    return ensure_z(cont.data(), cont.size());\r\n}\r\n\r\ntemplate <typename CharT, std::size_t>\r\nclass basic_string_span;\r\n\r\nnamespace details\r\n{\r\n    template <typename T>\r\n    struct is_basic_string_span_oracle : std::false_type\r\n    {\r\n    };\r\n\r\n    template <typename CharT, std::size_t Extent>\r\n    struct is_basic_string_span_oracle<basic_string_span<CharT, Extent>> : std::true_type\r\n    {\r\n    };\r\n\r\n    template <typename T>\r\n    struct is_basic_string_span : is_basic_string_span_oracle<std::remove_cv_t<T>>\r\n    {\r\n    };\r\n} // namespace details\r\n\r\n//\r\n// string_span and relatives\r\n//\r\ntemplate <typename CharT, std::size_t Extent = dynamic_extent>\r\nclass basic_string_span\r\n{\r\npublic:\r\n    using element_type = CharT;\r\n    using value_type = std::remove_cv_t<element_type>;\r\n    using pointer = std::add_pointer_t<element_type>;\r\n    using reference = std::add_lvalue_reference_t<element_type>;\r\n    using const_reference = std::add_lvalue_reference_t<std::add_const_t<element_type>>;\r\n    using impl_type = span<element_type, Extent>;\r\n\r\n    using size_type = typename impl_type::size_type;\r\n    using iterator = typename impl_type::iterator;\r\n    using reverse_iterator = typename impl_type::reverse_iterator;\r\n\r\n    // default (empty)\r\n    constexpr basic_string_span() noexcept = default;\r\n\r\n    // copy\r\n    constexpr basic_string_span(const basic_string_span& other) noexcept = default;\r\n\r\n    // assign\r\n    constexpr basic_string_span& operator=(const basic_string_span& other) noexcept = default;\r\n\r\n    constexpr basic_string_span(pointer ptr, size_type length) : span_(ptr, length) {}\r\n    constexpr basic_string_span(pointer firstElem, pointer lastElem) : span_(firstElem, lastElem) {}\r\n\r\n    // From static arrays - if 0-terminated, remove 0 from the view\r\n    // All other containers allow 0s within the length, so we do not remove them\r\n    template <std::size_t N>\r\n    constexpr basic_string_span(element_type (&arr)[N]) : span_(remove_z(arr))\r\n    {}\r\n\r\n    template <std::size_t N, class ArrayElementType = std::remove_const_t<element_type>>\r\n    constexpr basic_string_span(std::array<ArrayElementType, N>& arr) noexcept : span_(arr)\r\n    {}\r\n\r\n    template <std::size_t N, class ArrayElementType = std::remove_const_t<element_type>>\r\n    constexpr basic_string_span(const std::array<ArrayElementType, N>& arr) noexcept : span_(arr)\r\n    {}\r\n\r\n    // Container signature should work for basic_string after C++17 version exists\r\n    template <class Traits, class Allocator>\r\n    // GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute // TODO: parser bug\r\n    constexpr basic_string_span(std::basic_string<element_type, Traits, Allocator>& str)\r\n        : span_(&str[0], str.length())\r\n    {}\r\n\r\n    template <class Traits, class Allocator>\r\n    constexpr basic_string_span(const std::basic_string<element_type, Traits, Allocator>& str)\r\n        : span_(&str[0], str.length())\r\n    {}\r\n\r\n    // from containers. Containers must have a pointer type and data() function signatures\r\n    template <class Container,\r\n              class = std::enable_if_t<\r\n                  !details::is_basic_string_span<Container>::value &&\r\n                  std::is_convertible<typename Container::pointer, pointer>::value &&\r\n                  std::is_convertible<typename Container::pointer,\r\n                                      decltype(std::declval<Container>().data())>::value>>\r\n    constexpr basic_string_span(Container& cont) : span_(cont)\r\n    {}\r\n\r\n    template <class Container,\r\n              class = std::enable_if_t<\r\n                  !details::is_basic_string_span<Container>::value &&\r\n                  std::is_convertible<typename Container::pointer, pointer>::value &&\r\n                  std::is_convertible<typename Container::pointer,\r\n                                      decltype(std::declval<Container>().data())>::value>>\r\n    constexpr basic_string_span(const Container& cont) : span_(cont)\r\n    {}\r\n\r\n    // from string_span\r\n    template <\r\n        class OtherValueType, std::size_t OtherExtent,\r\n        class = std::enable_if_t<std::is_convertible<\r\n            typename basic_string_span<OtherValueType, OtherExtent>::impl_type, impl_type>::value>>\r\n    constexpr basic_string_span(basic_string_span<OtherValueType, OtherExtent> other)\r\n        : span_(other.data(), other.length())\r\n    {}\r\n\r\n    template <size_type Count>\r\n    constexpr basic_string_span<element_type, Count> first() const\r\n    {\r\n        return {span_.template first<Count>()};\r\n    }\r\n\r\n    constexpr basic_string_span<element_type, dynamic_extent> first(size_type count) const\r\n    {\r\n        return {span_.first(count)};\r\n    }\r\n\r\n    template <size_type Count>\r\n    constexpr basic_string_span<element_type, Count> last() const\r\n    {\r\n        return {span_.template last<Count>()};\r\n    }\r\n\r\n    constexpr basic_string_span<element_type, dynamic_extent> last(size_type count) const\r\n    {\r\n        return {span_.last(count)};\r\n    }\r\n\r\n    template <size_type Offset, size_type Count>\r\n    constexpr basic_string_span<element_type, Count> subspan() const\r\n    {\r\n        return {span_.template subspan<Offset, Count>()};\r\n    }\r\n\r\n    constexpr basic_string_span<element_type, dynamic_extent>\r\n    subspan(size_type offset, size_type count = dynamic_extent) const\r\n    {\r\n        return {span_.subspan(offset, count)};\r\n    }\r\n\r\n    constexpr reference operator[](size_type idx) const { return span_[idx]; }\r\n    constexpr reference operator()(size_type idx) const { return span_[idx]; }\r\n\r\n    constexpr pointer data() const { return span_.data(); }\r\n\r\n    constexpr size_type length() const noexcept { return span_.size(); }\r\n    constexpr size_type size() const noexcept { return span_.size(); }\r\n    constexpr size_type size_bytes() const noexcept { return span_.size_bytes(); }\r\n    constexpr size_type length_bytes() const noexcept { return span_.length_bytes(); }\r\n    constexpr bool empty() const noexcept { return size() == 0; }\r\n\r\n    constexpr iterator begin() const noexcept { return span_.begin(); }\r\n    constexpr iterator end() const noexcept { return span_.end(); }\r\n\r\n    constexpr reverse_iterator rbegin() const noexcept { return span_.rbegin(); }\r\n    constexpr reverse_iterator rend() const noexcept { return span_.rend(); }\r\n\r\nprivate:\r\n    static impl_type remove_z(pointer const& sz, std::size_t max)\r\n    {\r\n        return {sz, details::string_length(sz, max)};\r\n    }\r\n\r\n    template <std::size_t N>\r\n    static impl_type remove_z(element_type (&sz)[N])\r\n    {\r\n        return remove_z(&sz[0], N);\r\n    }\r\n\r\n    impl_type span_;\r\n};\r\n\r\ntemplate <std::size_t Extent = dynamic_extent>\r\nusing string_span = basic_string_span<char, Extent>;\r\n\r\ntemplate <std::size_t Extent = dynamic_extent>\r\nusing cstring_span = basic_string_span<const char, Extent>;\r\n\r\ntemplate <std::size_t Extent = dynamic_extent>\r\nusing wstring_span = basic_string_span<wchar_t, Extent>;\r\n\r\ntemplate <std::size_t Extent = dynamic_extent>\r\nusing cwstring_span = basic_string_span<const wchar_t, Extent>;\r\n\r\ntemplate <std::size_t Extent = dynamic_extent>\r\nusing u16string_span = basic_string_span<char16_t, Extent>;\r\n\r\ntemplate <std::size_t Extent = dynamic_extent>\r\nusing cu16string_span = basic_string_span<const char16_t, Extent>;\r\n\r\ntemplate <std::size_t Extent = dynamic_extent>\r\nusing u32string_span = basic_string_span<char32_t, Extent>;\r\n\r\ntemplate <std::size_t Extent = dynamic_extent>\r\nusing cu32string_span = basic_string_span<const char32_t, Extent>;\r\n\r\n//\r\n// to_string() allow (explicit) conversions from string_span to string\r\n//\r\n\r\ntemplate <typename CharT, std::size_t Extent>\r\nstd::basic_string<typename std::remove_const<CharT>::type>\r\nto_string(basic_string_span<CharT, Extent> view)\r\n{\r\n    return {view.data(), narrow_cast<std::size_t>(view.length())};\r\n}\r\n\r\ntemplate <typename CharT, typename Traits = typename std::char_traits<CharT>,\r\n          typename Allocator = std::allocator<CharT>, typename gCharT, std::size_t Extent>\r\nstd::basic_string<CharT, Traits, Allocator> to_basic_string(basic_string_span<gCharT, Extent> view)\r\n{\r\n    return {view.data(), narrow_cast<std::size_t>(view.length())};\r\n}\r\n\r\ntemplate <class ElementType, std::size_t Extent>\r\nbasic_string_span<const byte, details::calculate_byte_size<ElementType, Extent>::value>\r\nas_bytes(basic_string_span<ElementType, Extent> s) noexcept\r\n{\r\n    GSL_SUPPRESS(type.1) // NO-FORMAT: attribute\r\n    return {reinterpret_cast<const byte*>(s.data()), s.size_bytes()};\r\n}\r\n\r\ntemplate <class ElementType, std::size_t Extent,\r\n          class = std::enable_if_t<!std::is_const<ElementType>::value>>\r\nbasic_string_span<byte, details::calculate_byte_size<ElementType, Extent>::value>\r\nas_writable_bytes(basic_string_span<ElementType, Extent> s) noexcept\r\n{\r\n    GSL_SUPPRESS(type.1) // NO-FORMAT: attribute\r\n    return {reinterpret_cast<byte*>(s.data()), s.size_bytes()};\r\n}\r\n\r\n// zero-terminated string span, used to convert\r\n// zero-terminated spans to legacy strings\r\ntemplate <typename CharT, std::size_t Extent = dynamic_extent>\r\nclass basic_zstring_span\r\n{\r\npublic:\r\n    using value_type = CharT;\r\n    using const_value_type = std::add_const_t<CharT>;\r\n\r\n    using pointer = std::add_pointer_t<value_type>;\r\n    using const_pointer = std::add_pointer_t<const_value_type>;\r\n\r\n    using zstring_type = basic_zstring<value_type, Extent>;\r\n    using const_zstring_type = basic_zstring<const_value_type, Extent>;\r\n\r\n    using impl_type = span<value_type, Extent>;\r\n    using string_span_type = basic_string_span<value_type, Extent>;\r\n\r\n    constexpr basic_zstring_span(impl_type s) : span_(s)\r\n    {\r\n        // expects a zero-terminated span\r\n        Expects(s[s.size() - 1] == '\\0');\r\n    }\r\n\r\n    // copy\r\n    constexpr basic_zstring_span(const basic_zstring_span& other) = default;\r\n\r\n    // move\r\n    constexpr basic_zstring_span(basic_zstring_span&& other) = default;\r\n\r\n    // assign\r\n    constexpr basic_zstring_span& operator=(const basic_zstring_span& other) = default;\r\n\r\n    // move assign\r\n    constexpr basic_zstring_span& operator=(basic_zstring_span&& other) = default;\r\n\r\n    constexpr bool empty() const noexcept { return span_.size() == 0; }\r\n\r\n    constexpr string_span_type as_string_span() const noexcept\r\n    {\r\n        const auto sz = span_.size();\r\n        return {span_.data(), sz > 1 ? sz - 1 : 0};\r\n    }\r\n    constexpr string_span_type ensure_z() const { return gsl::ensure_z(span_); }\r\n\r\n    constexpr const_zstring_type assume_z() const noexcept { return span_.data(); }\r\n\r\nprivate:\r\n    impl_type span_;\r\n};\r\n\r\ntemplate <std::size_t Max = dynamic_extent>\r\nusing zstring_span = basic_zstring_span<char, Max>;\r\n\r\ntemplate <std::size_t Max = dynamic_extent>\r\nusing wzstring_span = basic_zstring_span<wchar_t, Max>;\r\n\r\ntemplate <std::size_t Max = dynamic_extent>\r\nusing u16zstring_span = basic_zstring_span<char16_t, Max>;\r\n\r\ntemplate <std::size_t Max = dynamic_extent>\r\nusing u32zstring_span = basic_zstring_span<char32_t, Max>;\r\n\r\ntemplate <std::size_t Max = dynamic_extent>\r\nusing czstring_span = basic_zstring_span<const char, Max>;\r\n\r\ntemplate <std::size_t Max = dynamic_extent>\r\nusing cwzstring_span = basic_zstring_span<const wchar_t, Max>;\r\n\r\ntemplate <std::size_t Max = dynamic_extent>\r\nusing cu16zstring_span = basic_zstring_span<const char16_t, Max>;\r\n\r\ntemplate <std::size_t Max = dynamic_extent>\r\nusing cu32zstring_span = basic_zstring_span<const char32_t, Max>;\r\n\r\n// operator ==\r\ntemplate <class CharT, std::size_t Extent, class T,\r\n          class = std::enable_if_t<\r\n              details::is_basic_string_span<T>::value ||\r\n              std::is_convertible<T, gsl::basic_string_span<std::add_const_t<CharT>>>::value>>\r\nbool operator==(const gsl::basic_string_span<CharT, Extent>& one, const T& other)\r\n{\r\n    const gsl::basic_string_span<std::add_const_t<CharT>> tmp(other);\r\n    return std::equal(one.begin(), one.end(), tmp.begin(), tmp.end());\r\n}\r\n\r\ntemplate <class CharT, std::size_t Extent, class T,\r\n          class = std::enable_if_t<\r\n              !details::is_basic_string_span<T>::value &&\r\n              std::is_convertible<T, gsl::basic_string_span<std::add_const_t<CharT>>>::value>>\r\nbool operator==(const T& one, const gsl::basic_string_span<CharT, Extent>& other)\r\n{\r\n    const gsl::basic_string_span<std::add_const_t<CharT>> tmp(one);\r\n    return std::equal(tmp.begin(), tmp.end(), other.begin(), other.end());\r\n}\r\n\r\n// operator !=\r\ntemplate <typename CharT, std::size_t Extent = gsl::dynamic_extent, typename T,\r\n          typename = std::enable_if_t<std::is_convertible<\r\n              T, gsl::basic_string_span<std::add_const_t<CharT>, Extent>>::value>>\r\nbool operator!=(gsl::basic_string_span<CharT, Extent> one, const T& other)\r\n{\r\n    return !(one == other);\r\n}\r\n\r\ntemplate <\r\n    typename CharT, std::size_t Extent = gsl::dynamic_extent, typename T,\r\n    typename = std::enable_if_t<\r\n        std::is_convertible<T, gsl::basic_string_span<std::add_const_t<CharT>, Extent>>::value &&\r\n        !gsl::details::is_basic_string_span<T>::value>>\r\nbool operator!=(const T& one, gsl::basic_string_span<CharT, Extent> other)\r\n{\r\n    return !(one == other);\r\n}\r\n\r\n// operator<\r\ntemplate <typename CharT, std::size_t Extent = gsl::dynamic_extent, typename T,\r\n          typename = std::enable_if_t<std::is_convertible<\r\n              T, gsl::basic_string_span<std::add_const_t<CharT>, Extent>>::value>>\r\nbool operator<(gsl::basic_string_span<CharT, Extent> one, const T& other)\r\n{\r\n    const gsl::basic_string_span<std::add_const_t<CharT>, Extent> tmp(other);\r\n    return std::lexicographical_compare(one.begin(), one.end(), tmp.begin(), tmp.end());\r\n}\r\n\r\ntemplate <\r\n    typename CharT, std::size_t Extent = gsl::dynamic_extent, typename T,\r\n    typename = std::enable_if_t<\r\n        std::is_convertible<T, gsl::basic_string_span<std::add_const_t<CharT>, Extent>>::value &&\r\n        !gsl::details::is_basic_string_span<T>::value>>\r\nbool operator<(const T& one, gsl::basic_string_span<CharT, Extent> other)\r\n{\r\n    gsl::basic_string_span<std::add_const_t<CharT>, Extent> tmp(one);\r\n    return std::lexicographical_compare(tmp.begin(), tmp.end(), other.begin(), other.end());\r\n}\r\n\r\n#ifndef _MSC_VER\r\n\r\n// VS treats temp and const containers as convertible to basic_string_span,\r\n// so the cases below are already covered by the previous operators\r\n\r\ntemplate <\r\n    typename CharT, std::size_t Extent = gsl::dynamic_extent, typename T,\r\n    typename DataType = typename T::value_type,\r\n    typename = std::enable_if_t<\r\n        !gsl::details::is_span<T>::value && !gsl::details::is_basic_string_span<T>::value &&\r\n        std::is_convertible<DataType*, CharT*>::value &&\r\n        std::is_same<std::decay_t<decltype(std::declval<T>().size(), *std::declval<T>().data())>,\r\n                     DataType>::value>>\r\nbool operator<(gsl::basic_string_span<CharT, Extent> one, const T& other)\r\n{\r\n    gsl::basic_string_span<std::add_const_t<CharT>, Extent> tmp(other);\r\n    return std::lexicographical_compare(one.begin(), one.end(), tmp.begin(), tmp.end());\r\n}\r\n\r\ntemplate <\r\n    typename CharT, std::size_t Extent = gsl::dynamic_extent, typename T,\r\n    typename DataType = typename T::value_type,\r\n    typename = std::enable_if_t<\r\n        !gsl::details::is_span<T>::value && !gsl::details::is_basic_string_span<T>::value &&\r\n        std::is_convertible<DataType*, CharT*>::value &&\r\n        std::is_same<std::decay_t<decltype(std::declval<T>().size(), *std::declval<T>().data())>,\r\n                     DataType>::value>>\r\nbool operator<(const T& one, gsl::basic_string_span<CharT, Extent> other)\r\n{\r\n    gsl::basic_string_span<std::add_const_t<CharT>, Extent> tmp(one);\r\n    return std::lexicographical_compare(tmp.begin(), tmp.end(), other.begin(), other.end());\r\n}\r\n#endif\r\n\r\n// operator <=\r\ntemplate <typename CharT, std::size_t Extent = gsl::dynamic_extent, typename T,\r\n          typename = std::enable_if_t<std::is_convertible<\r\n              T, gsl::basic_string_span<std::add_const_t<CharT>, Extent>>::value>>\r\nbool operator<=(gsl::basic_string_span<CharT, Extent> one, const T& other)\r\n{\r\n    return !(other < one);\r\n}\r\n\r\ntemplate <\r\n    typename CharT, std::size_t Extent = gsl::dynamic_extent, typename T,\r\n    typename = std::enable_if_t<\r\n        std::is_convertible<T, gsl::basic_string_span<std::add_const_t<CharT>, Extent>>::value &&\r\n        !gsl::details::is_basic_string_span<T>::value>>\r\nbool operator<=(const T& one, gsl::basic_string_span<CharT, Extent> other)\r\n{\r\n    return !(other < one);\r\n}\r\n\r\n#ifndef _MSC_VER\r\n\r\n// VS treats temp and const containers as convertible to basic_string_span,\r\n// so the cases below are already covered by the previous operators\r\n\r\ntemplate <\r\n    typename CharT, std::size_t Extent = gsl::dynamic_extent, typename T,\r\n    typename DataType = typename T::value_type,\r\n    typename = std::enable_if_t<\r\n        !gsl::details::is_span<T>::value && !gsl::details::is_basic_string_span<T>::value &&\r\n        std::is_convertible<DataType*, CharT*>::value &&\r\n        std::is_same<std::decay_t<decltype(std::declval<T>().size(), *std::declval<T>().data())>,\r\n                     DataType>::value>>\r\nbool operator<=(gsl::basic_string_span<CharT, Extent> one, const T& other)\r\n{\r\n    return !(other < one);\r\n}\r\n\r\ntemplate <\r\n    typename CharT, std::size_t Extent = gsl::dynamic_extent, typename T,\r\n    typename DataType = typename T::value_type,\r\n    typename = std::enable_if_t<\r\n        !gsl::details::is_span<T>::value && !gsl::details::is_basic_string_span<T>::value &&\r\n        std::is_convertible<DataType*, CharT*>::value &&\r\n        std::is_same<std::decay_t<decltype(std::declval<T>().size(), *std::declval<T>().data())>,\r\n                     DataType>::value>>\r\nbool operator<=(const T& one, gsl::basic_string_span<CharT, Extent> other)\r\n{\r\n    return !(other < one);\r\n}\r\n#endif\r\n\r\n// operator>\r\ntemplate <typename CharT, std::size_t Extent = gsl::dynamic_extent, typename T,\r\n          typename = std::enable_if_t<std::is_convertible<\r\n              T, gsl::basic_string_span<std::add_const_t<CharT>, Extent>>::value>>\r\nbool operator>(gsl::basic_string_span<CharT, Extent> one, const T& other)\r\n{\r\n    return other < one;\r\n}\r\n\r\ntemplate <\r\n    typename CharT, std::size_t Extent = gsl::dynamic_extent, typename T,\r\n    typename = std::enable_if_t<\r\n        std::is_convertible<T, gsl::basic_string_span<std::add_const_t<CharT>, Extent>>::value &&\r\n        !gsl::details::is_basic_string_span<T>::value>>\r\nbool operator>(const T& one, gsl::basic_string_span<CharT, Extent> other)\r\n{\r\n    return other < one;\r\n}\r\n\r\n#ifndef _MSC_VER\r\n\r\n// VS treats temp and const containers as convertible to basic_string_span,\r\n// so the cases below are already covered by the previous operators\r\n\r\ntemplate <\r\n    typename CharT, std::size_t Extent = gsl::dynamic_extent, typename T,\r\n    typename DataType = typename T::value_type,\r\n    typename = std::enable_if_t<\r\n        !gsl::details::is_span<T>::value && !gsl::details::is_basic_string_span<T>::value &&\r\n        std::is_convertible<DataType*, CharT*>::value &&\r\n        std::is_same<std::decay_t<decltype(std::declval<T>().size(), *std::declval<T>().data())>,\r\n                     DataType>::value>>\r\nbool operator>(gsl::basic_string_span<CharT, Extent> one, const T& other)\r\n{\r\n    return other < one;\r\n}\r\n\r\ntemplate <\r\n    typename CharT, std::size_t Extent = gsl::dynamic_extent, typename T,\r\n    typename DataType = typename T::value_type,\r\n    typename = std::enable_if_t<\r\n        !gsl::details::is_span<T>::value && !gsl::details::is_basic_string_span<T>::value &&\r\n        std::is_convertible<DataType*, CharT*>::value &&\r\n        std::is_same<std::decay_t<decltype(std::declval<T>().size(), *std::declval<T>().data())>,\r\n                     DataType>::value>>\r\nbool operator>(const T& one, gsl::basic_string_span<CharT, Extent> other)\r\n{\r\n    return other < one;\r\n}\r\n#endif\r\n\r\n// operator >=\r\ntemplate <typename CharT, std::size_t Extent = gsl::dynamic_extent, typename T,\r\n          typename = std::enable_if_t<std::is_convertible<\r\n              T, gsl::basic_string_span<std::add_const_t<CharT>, Extent>>::value>>\r\nbool operator>=(gsl::basic_string_span<CharT, Extent> one, const T& other)\r\n{\r\n    return !(one < other);\r\n}\r\n\r\ntemplate <\r\n    typename CharT, std::size_t Extent = gsl::dynamic_extent, typename T,\r\n    typename = std::enable_if_t<\r\n        std::is_convertible<T, gsl::basic_string_span<std::add_const_t<CharT>, Extent>>::value &&\r\n        !gsl::details::is_basic_string_span<T>::value>>\r\nbool operator>=(const T& one, gsl::basic_string_span<CharT, Extent> other)\r\n{\r\n    return !(one < other);\r\n}\r\n\r\n#ifndef _MSC_VER\r\n\r\n// VS treats temp and const containers as convertible to basic_string_span,\r\n// so the cases below are already covered by the previous operators\r\n\r\ntemplate <\r\n    typename CharT, std::size_t Extent = gsl::dynamic_extent, typename T,\r\n    typename DataType = typename T::value_type,\r\n    typename = std::enable_if_t<\r\n        !gsl::details::is_span<T>::value && !gsl::details::is_basic_string_span<T>::value &&\r\n        std::is_convertible<DataType*, CharT*>::value &&\r\n        std::is_same<std::decay_t<decltype(std::declval<T>().size(), *std::declval<T>().data())>,\r\n                     DataType>::value>>\r\nbool operator>=(gsl::basic_string_span<CharT, Extent> one, const T& other)\r\n{\r\n    return !(one < other);\r\n}\r\n\r\ntemplate <\r\n    typename CharT, std::size_t Extent = gsl::dynamic_extent, typename T,\r\n    typename DataType = typename T::value_type,\r\n    typename = std::enable_if_t<\r\n        !gsl::details::is_span<T>::value && !gsl::details::is_basic_string_span<T>::value &&\r\n        std::is_convertible<DataType*, CharT*>::value &&\r\n        std::is_same<std::decay_t<decltype(std::declval<T>().size(), *std::declval<T>().data())>,\r\n                     DataType>::value>>\r\nbool operator>=(const T& one, gsl::basic_string_span<CharT, Extent> other)\r\n{\r\n    return !(one < other);\r\n}\r\n#endif\r\n} // namespace gsl\r\n\r\n#if defined(_MSC_VER) && !defined(__clang__)\r\n#pragma warning(pop)\r\n\r\n#if _MSC_VER < 1910\r\n#undef constexpr\r\n#pragma pop_macro(\"constexpr\")\r\n\r\n#endif // _MSC_VER < 1910\r\n#endif // _MSC_VER\r\n\r\n#endif // GSL_STRING_SPAN_H\r\n"
  },
  {
    "path": "examples/libraries/GSL/tests/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.0.2)\n\nproject(GSLTests CXX)\n\n# will make visual studio generated project group files\nset_property(GLOBAL PROPERTY USE_FOLDERS ON)\n\nconfigure_file(CMakeLists.txt.in googletest-download/CMakeLists.txt)\nexecute_process(\n    COMMAND ${CMAKE_COMMAND} -G \"${CMAKE_GENERATOR}\" .\n    RESULT_VARIABLE result\n    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download\n)\nif(result)\n    message(FATAL_ERROR \"CMake step for googletest failed: ${result}\")\nendif()\n\nexecute_process(\n    COMMAND ${CMAKE_COMMAND} --build .\n    RESULT_VARIABLE result\n    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download\n)\nif(result)\n    message(FATAL_ERROR \"CMake step for googletest failed: ${result}\")\nendif()\n\nset(gtest_force_shared_crt ON CACHE BOOL \"\" FORCE)\n\nadd_subdirectory(\n    ${CMAKE_CURRENT_BINARY_DIR}/googletest-src\n    ${CMAKE_CURRENT_BINARY_DIR}/googletest-build\n    EXCLUDE_FROM_ALL\n)\n\nif (MSVC AND (GSL_CXX_STANDARD EQUAL 17))\n    set(GSL_CPLUSPLUS_OPT -Zc:__cplusplus -permissive-)\nendif()\n\n# this interface adds compile options to how the tests are run\n# please try to keep entries ordered =)\nadd_library(gsl_tests_config INTERFACE)\nif(MSVC) # MSVC or simulating MSVC\n    target_compile_options(gsl_tests_config INTERFACE\n        ${GSL_CPLUSPLUS_OPT}\n        /EHsc\n        /W4\n        /WX\n        $<$<CXX_COMPILER_ID:MSVC>:\n          /wd4996  # Use of function or classes marked [[deprecated]]\n          /wd26409 # CppCoreCheck - GTest\n          /wd26426 # CppCoreCheck - GTest\n          /wd26440 # CppCoreCheck - GTest\n          /wd26446 # CppCoreCheck - prefer gsl::at()\n          /wd26472 # CppCoreCheck - use gsl::narrow(_cast)\n          /wd26481 # CppCoreCheck - use span instead of pointer arithmetic\n          $<$<VERSION_LESS:$<CXX_COMPILER_VERSION>,1920>: # VS2015\n            /wd4189 # variable is initialized but not referenced\n            $<$<NOT:$<CONFIG:Debug>>: # Release, RelWithDebInfo\n              /wd4702 # Unreachable code\n            >\n          >\n        >\n        $<$<CXX_COMPILER_ID:Clang>:\n          -Weverything\n          -Wno-c++98-compat\n          -Wno-c++98-compat-pedantic\n          -Wno-covered-switch-default # GTest\n          -Wno-deprecated-declarations # Allow tests for [[deprecated]] elements\n          -Wno-global-constructors # GTest\n          -Wno-language-extension-token # GTest gtest-port.h\n          -Wno-missing-braces\n          -Wno-missing-prototypes\n          -Wno-shift-sign-overflow # GTest gtest-port.h\n          -Wno-undef # GTest\n          -Wno-used-but-marked-unused # GTest EXPECT_DEATH\n          $<$<EQUAL:${GSL_CXX_STANDARD},14>: # no support for [[maybe_unused]]\n            -Wno-unused-member-function\n            -Wno-unused-variable\n          >\n        >\n    )\nelse()\n    target_compile_options(gsl_tests_config INTERFACE\n        -fno-strict-aliasing\n        -Wall\n        -Wcast-align\n        -Wconversion\n        -Wctor-dtor-privacy\n        -Werror\n        -Wextra\n        -Wpedantic\n        -Wshadow\n        -Wsign-conversion\n        -Wno-deprecated-declarations # Allow tests for [[deprecated]] elements\n        $<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:\n          -Weverything\n          -Wno-c++98-compat\n          -Wno-c++98-compat-pedantic\n          -Wno-missing-braces\n          -Wno-covered-switch-default # GTest\n          -Wno-global-constructors # GTest\n          -Wno-missing-prototypes\n          -Wno-padded\n          -Wno-unknown-attributes\n          -Wno-used-but-marked-unused # GTest EXPECT_DEATH\n          -Wno-weak-vtables\n          $<$<EQUAL:${GSL_CXX_STANDARD},14>: # no support for [[maybe_unused]]\n            -Wno-unused-member-function\n            -Wno-unused-variable\n          >\n        >\n        $<$<CXX_COMPILER_ID:Clang>:\n          $<$<AND:$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,4.99>,$<VERSION_LESS:$<CXX_COMPILER_VERSION>,6>>:\n            $<$<EQUAL:${GSL_CXX_STANDARD},17>:-Wno-undefined-func-template>\n          >\n        >\n        $<$<CXX_COMPILER_ID:AppleClang>:\n          $<$<AND:$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,9.1>,$<VERSION_LESS:$<CXX_COMPILER_VERSION>,10>>:\n            $<$<EQUAL:${GSL_CXX_STANDARD},17>:-Wno-undefined-func-template>\n          >\n        >\n        $<$<CXX_COMPILER_ID:GNU>:\n          -Wdouble-promotion # float implicit to double\n          -Wlogical-op # suspicious uses of logical operators\n          $<$<NOT:$<VERSION_LESS:$<CXX_COMPILER_VERSION>,6>>:\n            -Wduplicated-cond # duplicated if-else conditions\n            -Wmisleading-indentation\n            -Wnull-dereference\n            $<$<EQUAL:${GSL_CXX_STANDARD},14>: # no support for [[maybe_unused]]\n              -Wno-unused-variable\n            >\n          >\n          $<$<NOT:$<VERSION_LESS:$<CXX_COMPILER_VERSION>,7>>:\n            -Wduplicated-branches # identical if-else branches\n          >\n        >\n    )\nendif(MSVC)\n\n# for tests to find the gtest header\ntarget_include_directories(gsl_tests_config SYSTEM INTERFACE\n    googletest/googletest/include\n)\n\nset_property(TARGET  PROPERTY FOLDER \"GSL_tests\")\n\nfunction(add_gsl_test name)\n    add_executable(${name} ${name}.cpp)\n    target_link_libraries(${name}\n        GSL\n        gsl_tests_config\n        gtest_main\n    )\n    add_test(\n        ${name}\n        ${name}\n    )\n    # group all tests under GSL_tests\n    set_property(TARGET ${name} PROPERTY FOLDER \"GSL_tests\")\nendfunction()\n\nadd_gsl_test(span_tests)\nadd_gsl_test(span_ext_tests)\nadd_gsl_test(span_compatibility_tests)\nadd_gsl_test(multi_span_tests)\nadd_gsl_test(strided_span_tests)\nadd_gsl_test(string_span_tests)\nadd_gsl_test(at_tests)\nadd_gsl_test(bounds_tests)\nadd_gsl_test(notnull_tests)\nadd_gsl_test(assertion_tests)\nadd_gsl_test(utils_tests)\nadd_gsl_test(owner_tests)\nadd_gsl_test(byte_tests)\nadd_gsl_test(algorithm_tests)\nadd_gsl_test(strict_notnull_tests)\n\n\n# No exception tests\n\nforeach(flag_var\n        CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE\n        CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)\n    STRING (REGEX REPLACE \"/EHsc\" \"\" ${flag_var} \"${${flag_var}}\")\nendforeach(flag_var)\n\n# this interface adds compile options to how the tests are run\n# please try to keep entries ordered =)\nadd_library(gsl_tests_config_noexcept INTERFACE)\nif(MSVC) # MSVC or simulating MSVC\n    target_compile_definitions(gsl_tests_config_noexcept INTERFACE\n        _HAS_EXCEPTIONS=0 # disable exceptions in the Microsoft STL\n    )\n    target_compile_options(gsl_tests_config_noexcept INTERFACE\n        ${GSL_CPLUSPLUS_OPT}\n        /W4\n        /WX\n        $<$<CXX_COMPILER_ID:MSVC>:\n          /wd4577\n          /wd4702\n          /wd26440 # CppCoreCheck - GTest\n          /wd26446 # CppCoreCheck - prefer gsl::at()\n        >\n        $<$<CXX_COMPILER_ID:Clang>:\n          -Weverything\n          -Wno-c++98-compat\n          -Wno-c++98-compat-pedantic\n          -Wno-missing-prototypes\n          -Wno-unknown-attributes\n        >\n    )\nelse()\n    target_compile_options(gsl_tests_config_noexcept INTERFACE\n        -fno-exceptions\n        -fno-strict-aliasing\n        -Wall\n        -Wcast-align\n        -Wconversion\n        -Wctor-dtor-privacy\n        -Werror\n        -Wextra\n        -Wpedantic\n        -Wshadow\n        -Wsign-conversion\n        $<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:\n          -Weverything\n          -Wno-c++98-compat\n          -Wno-c++98-compat-pedantic\n          -Wno-missing-prototypes\n          -Wno-unknown-attributes\n          -Wno-weak-vtables\n        >\n        $<$<CXX_COMPILER_ID:GNU>:\n          -Wdouble-promotion # float implicit to double\n          -Wlogical-op # suspicious uses of logical operators\n          -Wuseless-cast # casting to its own type\n          $<$<NOT:$<VERSION_LESS:$<CXX_COMPILER_VERSION>,6>>:\n            -Wduplicated-cond # duplicated if-else conditions\n            -Wmisleading-indentation\n            -Wnull-dereference\n          >\n          $<$<NOT:$<VERSION_LESS:$<CXX_COMPILER_VERSION>,7>>:\n            -Wduplicated-branches # identical if-else branches\n          >\n          $<$<NOT:$<VERSION_LESS:$<CXX_COMPILER_VERSION>,8>>:\n            -Wcast-align=strict # increase alignment (i.e. char* to int*)\n          >\n        >\n    )\nendif(MSVC)\n\nfunction(add_gsl_test_noexcept name)\n    add_executable(${name} ${name}.cpp)\n    target_link_libraries(${name}\n        GSL\n        gsl_tests_config_noexcept\n        gtest_main\n    )\n    add_test(\n      ${name}\n      ${name}\n    )\n    # group all tests under GSL_tests_noexcept\n    set_property(TARGET ${name} PROPERTY FOLDER \"GSL_tests_noexcept\")\nendfunction()\n\nadd_gsl_test_noexcept(no_exception_ensure_tests)\n"
  },
  {
    "path": "examples/libraries/GSL/tests/CMakeLists.txt.in",
    "content": "cmake_minimum_required(VERSION 3.0.2)\nproject(googletest-download NONE)\n\ninclude(ExternalProject)\nExternalProject_Add(googletest\n  GIT_REPOSITORY    https://github.com/google/googletest.git\n  GIT_TAG           703bd9caab50b139428cea1aaff9974ebee5742e\n  SOURCE_DIR        \"${CMAKE_CURRENT_BINARY_DIR}/googletest-src\"\n  BINARY_DIR        \"${CMAKE_CURRENT_BINARY_DIR}/googletest-build\"\n  CONFIGURE_COMMAND \"\"\n  BUILD_COMMAND     \"\"\n  INSTALL_COMMAND   \"\"\n  TEST_COMMAND      \"\"\n)\n"
  },
  {
    "path": "examples/libraries/GSL/tests/algorithm_tests.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#include <gtest/gtest.h>\n#include <gsl/gsl_algorithm> // for copy\n#include <gsl/span>          // for span\n#include <array>   // for array\n#include <cstddef> // for size_t\n\nnamespace\n{\n    static constexpr char deathstring[] = \"Expected Death\";\n}\n\nnamespace gsl\n{\nstruct fail_fast;\n} // namespace gsl\n\nusing namespace std;\nusing namespace gsl;\n\nTEST(algorithm_tests, same_type)\n{\n    // dynamic source and destination span\n    {\n        std::array<int, 5> src{1, 2, 3, 4, 5};\n        std::array<int, 10> dst{};\n\n        const span<int> src_span(src);\n        const span<int> dst_span(dst);\n\n        copy(src_span, dst_span);\n        copy(src_span, dst_span.subspan(src_span.size()));\n\n        for (std::size_t i = 0; i < src.size(); ++i)\n        {\n            EXPECT_TRUE(dst[i] == src[i]);\n            EXPECT_TRUE(dst[i + src.size()] == src[i]);\n        }\n    }\n\n    // static source and dynamic destination span\n    {\n        std::array<int, 5> src{1, 2, 3, 4, 5};\n        std::array<int, 10> dst{};\n\n        const span<int, 5> src_span(src);\n        const span<int> dst_span(dst);\n\n        copy(src_span, dst_span);\n        copy(src_span, dst_span.subspan(src_span.size()));\n\n        for (std::size_t i = 0; i < src.size(); ++i)\n        {\n            EXPECT_TRUE(dst[i] == src[i]);\n            EXPECT_TRUE(dst[i + src.size()] == src[i]);\n        }\n    }\n\n    // dynamic source and static destination span\n    {\n        std::array<int, 5> src{1, 2, 3, 4, 5};\n        std::array<int, 10> dst{};\n\n        const span<int> src_span(src);\n        const span<int, 10> dst_span(dst);\n\n        copy(src_span, dst_span);\n        copy(src_span, dst_span.subspan(src_span.size()));\n\n        for (std::size_t i = 0; i < src.size(); ++i)\n        {\n            EXPECT_TRUE(dst[i] == src[i]);\n            EXPECT_TRUE(dst[i + src.size()] == src[i]);\n        }\n    }\n\n    // static source and destination span\n    {\n        std::array<int, 5> src{1, 2, 3, 4, 5};\n        std::array<int, 10> dst{};\n\n        const span<int, 5> src_span(src);\n        const span<int, 10> dst_span(dst);\n\n        copy(src_span, dst_span);\n        copy(src_span, dst_span.subspan(src_span.size()));\n\n        for (std::size_t i = 0; i < src.size(); ++i)\n        {\n            EXPECT_TRUE(dst[i] == src[i]);\n            EXPECT_TRUE(dst[i + src.size()] == src[i]);\n        }\n    }\n}\n\nTEST(algorithm_tests, compatible_type)\n{\n    // dynamic source and destination span\n    {\n        std::array<short, 5> src{1, 2, 3, 4, 5};\n        std::array<int, 10> dst{};\n\n        const span<short> src_span(src);\n        const span<int> dst_span(dst);\n\n        copy(src_span, dst_span);\n        copy(src_span, dst_span.subspan(src_span.size()));\n\n        for (std::size_t i = 0; i < src.size(); ++i)\n        {\n            EXPECT_TRUE(dst[i] == src[i]);\n            EXPECT_TRUE(dst[i + src.size()] == src[i]);\n        }\n    }\n\n    // static source and dynamic destination span\n    {\n        std::array<short, 5> src{1, 2, 3, 4, 5};\n        std::array<int, 10> dst{};\n\n        const span<short, 5> src_span(src);\n        const span<int> dst_span(dst);\n\n        copy(src_span, dst_span);\n        copy(src_span, dst_span.subspan(src_span.size()));\n\n        for (std::size_t i = 0; i < src.size(); ++i)\n        {\n            EXPECT_TRUE(dst[i] == src[i]);\n            EXPECT_TRUE(dst[i + src.size()] == src[i]);\n        }\n    }\n\n    // dynamic source and static destination span\n    {\n        std::array<short, 5> src{1, 2, 3, 4, 5};\n        std::array<int, 10> dst{};\n\n        const span<short> src_span(src);\n        const span<int, 10> dst_span(dst);\n\n        copy(src_span, dst_span);\n        copy(src_span, dst_span.subspan(src_span.size()));\n\n        for (std::size_t i = 0; i < src.size(); ++i)\n        {\n            EXPECT_TRUE(dst[i] == src[i]);\n            EXPECT_TRUE(dst[i + src.size()] == src[i]);\n        }\n    }\n\n    // static source and destination span\n    {\n        std::array<short, 5> src{1, 2, 3, 4, 5};\n        std::array<int, 10> dst{};\n\n        const span<short, 5> src_span(src);\n        const span<int, 10> dst_span(dst);\n\n        copy(src_span, dst_span);\n        copy(src_span, dst_span.subspan(src_span.size()));\n\n        for (std::size_t i = 0; i < src.size(); ++i)\n        {\n            EXPECT_TRUE(dst[i] == src[i]);\n            EXPECT_TRUE(dst[i + src.size()] == src[i]);\n        }\n    }\n}\n\n#ifdef CONFIRM_COMPILATION_ERRORS\nTEST(algorithm_tests, incompatible_type)\n{\n    std::array<int, 4> src{1, 2, 3, 4};\n    std::array<int*, 12> dst{};\n\n    span<int> src_span_dyn(src);\n    span<int, 4> src_span_static(src);\n    span<int*> dst_span_dyn(dst);\n    span<int*, 4> dst_span_static(dst);\n\n    // every line should produce a compilation error\n    copy(src_span_dyn, dst_span_dyn);\n    copy(src_span_dyn, dst_span_static);\n    copy(src_span_static, dst_span_dyn);\n    copy(src_span_static, dst_span_static);\n}\n#endif\n\nTEST(algorithm_tests, small_destination_span)\n{\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. small_destination_span\";\n        std::abort();\n    });\n\n    std::array<int, 12> src{1, 2, 3, 4};\n    std::array<int, 4> dst{};\n\n    const span<int> src_span_dyn(src);\n    const span<int, 12> src_span_static(src);\n    const span<int> dst_span_dyn(dst);\n    const span<int, 4> dst_span_static(dst);\n\n    EXPECT_DEATH(copy(src_span_dyn, dst_span_dyn), deathstring);\n    EXPECT_DEATH(copy(src_span_dyn, dst_span_static), deathstring);\n    EXPECT_DEATH(copy(src_span_static, dst_span_dyn), deathstring);\n\n#ifdef CONFIRM_COMPILATION_ERRORS\n    copy(src_span_static, dst_span_static);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/GSL/tests/assertion_tests.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#include <gtest/gtest.h>\n#include <gsl/gsl_assert> // for fail_fast (ptr only), Ensures, Expects\n\nusing namespace gsl;\n\nnamespace\n{\nstatic constexpr char deathstring[] = \"Expected Death\";\n\nint f(int i)\n{\n    Expects(i > 0 && i < 10);\n    return i;\n}\n\nint g(int i)\n{\n    i++;\n    Ensures(i > 0 && i < 10);\n    return i;\n}\n} // namespace\n\nTEST(assertion_tests, expects)\n{\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. expects\";\n        std::abort();\n    });\n\n    EXPECT_TRUE(f(2) == 2);\n    EXPECT_DEATH(f(10), deathstring);\n}\n\n\nTEST(assertion_tests, ensures)\n{\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. ensures\";\n        std::abort();\n    });\n\n    EXPECT_TRUE(g(2) == 3);\n    EXPECT_DEATH(g(9), deathstring);\n}\n"
  },
  {
    "path": "examples/libraries/GSL/tests/at_tests.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#include <gtest/gtest.h>\n\n#include <gsl/gsl_util> // for at\n\n#include <array>            // for array\n#include <cstddef>          // for size_t\n#include <initializer_list> // for initializer_list\n#include <vector>           // for vector\n\nnamespace\n{\n    static constexpr char deathstring[] = \"Expected Death\";\n}\n\nTEST(at_tests, static_array)\n{\n    int a[4] = {1, 2, 3, 4};\n    const int(&c_a)[4] = a;\n\n    for (int i = 0; i < 4; ++i) {\n        EXPECT_TRUE(&gsl::at(a, i) == &a[i]);\n        EXPECT_TRUE(&gsl::at(c_a, i) == &a[i]);\n    }\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. static_array\";\n        std::abort();\n    });\n\n    EXPECT_DEATH(gsl::at(a, -1), deathstring);\n    EXPECT_DEATH(gsl::at(a, 4), deathstring);\n    EXPECT_DEATH(gsl::at(c_a, -1), deathstring);\n    EXPECT_DEATH(gsl::at(c_a, 4), deathstring);\n}\n\nTEST(at_tests, std_array)\n{\n    std::array<int, 4> a = {1, 2, 3, 4};\n    const std::array<int, 4>& c_a = a;\n\n    for (int i = 0; i < 4; ++i) {\n        EXPECT_TRUE(&gsl::at(a, i) == &a[static_cast<std::size_t>(i)]);\n        EXPECT_TRUE(&gsl::at(c_a, i) == &a[static_cast<std::size_t>(i)]);\n    }\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. std_array\";\n        std::abort();\n    });\n\n    EXPECT_DEATH(gsl::at(a, -1), deathstring);\n    EXPECT_DEATH(gsl::at(a, 4), deathstring);\n    EXPECT_DEATH(gsl::at(c_a, -1), deathstring);\n    EXPECT_DEATH(gsl::at(c_a, 4), deathstring);\n}\n\nTEST(at_tests, std_vector)\n{\n    std::vector<int> a = {1, 2, 3, 4};\n    const std::vector<int>& c_a = a;\n\n    for (int i = 0; i < 4; ++i) {\n        EXPECT_TRUE(&gsl::at(a, i) == &a[static_cast<std::size_t>(i)]);\n        EXPECT_TRUE(&gsl::at(c_a, i) == &a[static_cast<std::size_t>(i)]);\n    }\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. std_vector\";\n        std::abort();\n    });\n\n    EXPECT_DEATH(gsl::at(a, -1), deathstring);\n    EXPECT_DEATH(gsl::at(a, 4), deathstring);\n    EXPECT_DEATH(gsl::at(c_a, -1), deathstring);\n    EXPECT_DEATH(gsl::at(c_a, 4), deathstring);\n}\n\nTEST(at_tests, InitializerList)\n{\n    const std::initializer_list<int> a = {1, 2, 3, 4};\n\n    for (int i = 0; i < 4; ++i) {\n        EXPECT_TRUE(gsl::at(a, i) == i + 1);\n        EXPECT_TRUE(gsl::at({1, 2, 3, 4}, i) == i + 1);\n    }\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. InitializerList\";\n        std::abort();\n    });\n\n    EXPECT_DEATH(gsl::at(a, -1), deathstring);\n    EXPECT_DEATH(gsl::at(a, 4), deathstring);\n    EXPECT_DEATH(gsl::at({1, 2, 3, 4}, -1), deathstring);\n    EXPECT_DEATH(gsl::at({1, 2, 3, 4}, 4), deathstring);\n}\n\n#if !defined(_MSC_VER) || defined(__clang__) || _MSC_VER >= 1910\nstatic constexpr bool test_constexpr()\n{\n    int a1[4] = {1, 2, 3, 4};\n    const int(&c_a1)[4] = a1;\n    std::array<int, 4> a2 = {1, 2, 3, 4};\n    const std::array<int, 4>& c_a2 = a2;\n\n    for (int i = 0; i < 4; ++i) {\n        if (&gsl::at(a1, i) != &a1[i]) return false;\n        if (&gsl::at(c_a1, i) != &a1[i]) return false;\n        // requires C++17:\n        // if (&gsl::at(a2, i) != &a2[static_cast<std::size_t>(i)]) return false;\n        if (&gsl::at(c_a2, i) != &c_a2[static_cast<std::size_t>(i)]) return false;\n        if (gsl::at({1, 2, 3, 4}, i) != i + 1) return false;\n    }\n\n    return true;\n}\n\nstatic_assert(test_constexpr(), \"FAIL\");\n#endif\n"
  },
  {
    "path": "examples/libraries/GSL/tests/bounds_tests.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#include <gtest/gtest.h>\n\n#include <gsl/multi_span> // for static_bounds, static_bounds_dynamic_range_t\n\n#include <cstddef> // for ptrdiff_t, size_t\n\nusing namespace std;\nusing namespace gsl;\n\nnamespace\n{\nvoid use(std::ptrdiff_t&) {}\n}\n\nTEST(bounds_tests, basic_bounds)\n{\n    for (auto point : static_bounds<dynamic_range, 3, 4>{2}) {\n        for (decltype(point)::size_type j = 0;\n             j < static_cast<decltype(point)::size_type>(decltype(point)::rank); j++)\n        {\n            use(j);\n            use(point[static_cast<std::size_t>(j)]);\n        }\n    }\n}\n\nTEST(bounds_tests, bounds_basic)\n{\n    static_bounds<3, 4, 5> b;\n    const auto a = b.slice();\n    (void) a;\n    static_bounds<4, dynamic_range, 2> x{4};\n    x.slice().slice();\n}\n\nTEST(bounds_tests, arrayview_iterator)\n{\n    static_bounds<4, dynamic_range, 2> bounds{3};\n\n    const auto itr = bounds.begin();\n    (void) itr;\n#ifdef CONFIRM_COMPILATION_ERRORS\n    multi_span<int, 4, dynamic_range, 2> av(nullptr, bounds);\n\n    auto itr2 = av.cbegin();\n\n    for (auto& v : av) {\n        v = 4;\n    }\n    fill(av.begin(), av.end(), 0);\n#endif\n}\n\nTEST(bounds_tests, bounds_convertible)\n{\n    static_bounds<7, 4, 2> b1;\n    static_bounds<7, dynamic_range, 2> b2 = b1;\n    (void) b2;\n#ifdef CONFIRM_COMPILATION_ERRORS\n    static_bounds<7, dynamic_range, 1> b4 = b2;\n#endif\n\n    static_bounds<dynamic_range, dynamic_range, dynamic_range> b3 = b1;\n    static_bounds<7, 4, 2> b4 = b3;\n    (void) b4;\n\n    static_bounds<dynamic_range> b5;\n    static_bounds<34> b6;\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. bounds_convertible\";\n        std::abort();\n    });\n\n    b5 = static_bounds<20>();\n    EXPECT_DEATH(b6 = b5, \".*\");\n    b5 = static_bounds<34>();\n    b6 = b5;\n\n    EXPECT_TRUE(b5 == b6);\n    EXPECT_TRUE(b5.size() == b6.size());\n}\n\n#ifdef CONFIRM_COMPILATION_ERRORS\ncopy(src_span_static, dst_span_static);\n#endif\n"
  },
  {
    "path": "examples/libraries/GSL/tests/byte_tests.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#include <gtest/gtest.h>\n\n#include <gsl/gsl_byte> // for to_byte, to_integer, byte, operator&, ope...\n\nusing namespace std;\nusing namespace gsl;\n\nnamespace\n{\nint modify_both(gsl::byte& b, int& i)\n{\n    i = 10;\n    b = to_byte<5>();\n    return i;\n}\n\nTEST(byte_tests, construction)\n{\n    {\n        const byte b = static_cast<byte>(4);\n        EXPECT_TRUE(static_cast<unsigned char>(b) == 4);\n    }\n\n    GSL_SUPPRESS(es.49)\n    {\n        const byte b = byte(12);\n        EXPECT_TRUE(static_cast<unsigned char>(b) == 12);\n    }\n\n    {\n        const byte b = to_byte<12>();\n        EXPECT_TRUE(static_cast<unsigned char>(b) == 12);\n    }\n    {\n        const unsigned char uc = 12;\n        const byte b = to_byte(uc);\n        EXPECT_TRUE(static_cast<unsigned char>(b) == 12);\n    }\n\n#if defined(__cplusplus) && (__cplusplus >= 201703L)\n    {\n        const byte b { 14 };\n        EXPECT_TRUE(static_cast<unsigned char>(b) == 14);\n    }\n#endif\n}\n\nTEST(byte_tests, bitwise_operations)\n{\n    const byte b = to_byte<0xFF>();\n\n    byte a = to_byte<0x00>();\n    EXPECT_TRUE((b | a) == to_byte<0xFF>());\n    EXPECT_TRUE(a == to_byte<0x00>());\n\n    a |= b;\n    EXPECT_TRUE(a == to_byte<0xFF>());\n\n    a = to_byte<0x01>();\n    EXPECT_TRUE((b & a) == to_byte<0x01>());\n\n    a &= b;\n    EXPECT_TRUE(a == to_byte<0x01>());\n\n    EXPECT_TRUE((b ^ a) == to_byte<0xFE>());\n\n    EXPECT_TRUE(a == to_byte<0x01>());\n    a ^= b;\n    EXPECT_TRUE(a == to_byte<0xFE>());\n\n    a = to_byte<0x01>();\n    EXPECT_TRUE(~a == to_byte<0xFE>());\n\n    a = to_byte<0xFF>();\n    EXPECT_TRUE((a << 4) == to_byte<0xF0>());\n    EXPECT_TRUE((a >> 4) == to_byte<0x0F>());\n\n    a <<= 4;\n    EXPECT_TRUE(a == to_byte<0xF0>());\n    a >>= 4;\n    EXPECT_TRUE(a == to_byte<0x0F>());\n}\n\nTEST(byte_tests, to_integer)\n{\n    const byte b = to_byte<0x12>();\n\n    EXPECT_TRUE(0x12 == gsl::to_integer<char>(b));\n    EXPECT_TRUE(0x12 == gsl::to_integer<short>(b));\n    EXPECT_TRUE(0x12 == gsl::to_integer<long>(b));\n    EXPECT_TRUE(0x12 == gsl::to_integer<long long>(b));\n\n    EXPECT_TRUE(0x12 == gsl::to_integer<unsigned char>(b));\n    EXPECT_TRUE(0x12 == gsl::to_integer<unsigned short>(b));\n    EXPECT_TRUE(0x12 == gsl::to_integer<unsigned long>(b));\n    EXPECT_TRUE(0x12 == gsl::to_integer<unsigned long long>(b));\n\n    //      EXPECT_TRUE(0x12 == gsl::to_integer<float>(b));   // expect compile-time error\n    //      EXPECT_TRUE(0x12 == gsl::to_integer<double>(b));  // expect compile-time error\n}\n\nTEST(byte_tests, aliasing)\n{\n    int i{0};\n    const int res = modify_both(reinterpret_cast<byte&>(i), i);\n    EXPECT_TRUE(res == i);\n}\n\n}\n\n#ifdef CONFIRM_COMPILATION_ERRORS\ncopy(src_span_static, dst_span_static);\n#endif\n"
  },
  {
    "path": "examples/libraries/GSL/tests/multi_span_tests.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#include <gtest/gtest.h>\n\n#include <gsl/gsl_byte>   // for byte\n#include <gsl/gsl_util>   // for narrow_cast\n#include <gsl/multi_span> // for multi_span, contiguous_span_iterator, dim\n\n#include <algorithm> // for fill, for_each\n#include <array>     // for array\n#include <iostream>  // for ptrdiff_t, size_t\n#include <iterator>  // for reverse_iterator, begin, end, operator!=\n#include <numeric>   // for iota\n#include <stddef.h>  // for ptrdiff_t\n#include <string>    // for string\n#include <vector>    // for vector\n\nnamespace gsl\n{\nstruct fail_fast;\n} // namespace gsl\n\nusing namespace std;\nusing namespace gsl;\n\nnamespace\n{\nstatic constexpr char deathstring[] = \"Expected Death\";\nstruct BaseClass\n{\n};\nstruct DerivedClass : BaseClass\n{\n};\n\nvoid overloaded_func(multi_span<const int, dynamic_range, 3, 5> exp, int expected_value)\n{\n    for (auto val : exp) { EXPECT_TRUE(val == expected_value); }\n}\n\nvoid overloaded_func(multi_span<const char, dynamic_range, 3, 5> exp, char expected_value)\n{\n    for (auto val : exp) { EXPECT_TRUE(val == expected_value); }\n}\n\nvoid iterate_second_column(multi_span<int, dynamic_range, dynamic_range> av)\n{\n    auto length = av.size() / 2;\n\n    // view to the second column\n    auto section = av.section({0, 1}, {length, 1});\n\n    EXPECT_TRUE(section.size() == length);\n    for (auto i = 0; i < section.size(); ++i) { EXPECT_TRUE(section[i][0] == av[i][1]); }\n\n    for (auto i = 0; i < section.size(); ++i)\n    {\n        auto idx = multi_span_index<2>{i, 0}; // avoid braces inside the CHECK macro\n        EXPECT_TRUE(section[idx] == av[i][1]);\n    }\n\n    EXPECT_TRUE(section.bounds().index_bounds()[0] == length);\n    EXPECT_TRUE(section.bounds().index_bounds()[1] == 1);\n    for (auto i = 0; i < section.bounds().index_bounds()[0]; ++i)\n    {\n        for (auto j = 0; j < section.bounds().index_bounds()[1]; ++j)\n        {\n            auto idx = multi_span_index<2>{i, j}; // avoid braces inside the CHECK macro\n            EXPECT_TRUE(section[idx] == av[i][1]);\n        }\n    }\n\n    auto check_sum = 0;\n    for (auto i = 0; i < length; ++i) { check_sum += av[i][1]; }\n\n    {\n        auto idx = 0;\n        auto sum = 0;\n        for (auto num : section)\n        {\n            EXPECT_TRUE(num == av[idx][1]);\n            sum += num;\n            idx++;\n        }\n\n        EXPECT_TRUE(sum == check_sum);\n    }\n    {\n        auto idx = length - 1;\n        auto sum = 0;\n        for (auto iter = section.rbegin(); iter != section.rend(); ++iter)\n        {\n            EXPECT_TRUE(*iter == av[idx][1]);\n            sum += *iter;\n            idx--;\n        }\n\n        EXPECT_TRUE(sum == check_sum);\n    }\n}\ntemplate <class Bounds>\nvoid fn(const Bounds&)\n{\n    static_assert(Bounds::static_size == 60, \"static bounds is wrong size\");\n}\n\n} // namespace\n\nTEST(multi_span_test, default_constructor)\n{\n    {\n        multi_span<int> s;\n        EXPECT_TRUE(s.length() ==  0);\n        EXPECT_TRUE(s.data() == nullptr);\n\n        multi_span<const int> cs;\n        EXPECT_TRUE(cs.length() ==  0);\n        EXPECT_TRUE(cs.data() == nullptr);\n    }\n\n    {\n        multi_span<int, 0> s;\n        EXPECT_TRUE(s.length() ==  0);\n        EXPECT_TRUE(s.data() == nullptr);\n\n        multi_span<const int, 0> cs;\n        EXPECT_TRUE(cs.length() ==  0);\n        EXPECT_TRUE(cs.data() == nullptr);\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        multi_span<int, 1> s;\n        EXPECT_TRUE(s.length() ==  1);\n        EXPECT_TRUE(s.data() == nullptr); // explains why it can't compile\n#endif\n    }\n\n    {\n        multi_span<int> s{};\n        EXPECT_TRUE(s.length() ==  0);\n        EXPECT_TRUE(s.data() == nullptr);\n\n        multi_span<const int> cs{};\n        EXPECT_TRUE(cs.length() ==  0);\n        EXPECT_TRUE(cs.data() == nullptr);\n    }\n}\n\nTEST(multi_span_test, from_nullptr_constructor)\n{\n    {\n        multi_span<int> s = nullptr;\n        EXPECT_TRUE(s.length() ==  0);\n        EXPECT_TRUE(s.data() == nullptr);\n\n        multi_span<const int> cs = nullptr;\n        EXPECT_TRUE(cs.length() ==  0);\n        EXPECT_TRUE(cs.data() == nullptr);\n    }\n\n    {\n        multi_span<int, 0> s = nullptr;\n        EXPECT_TRUE(s.length() ==  0);\n        EXPECT_TRUE(s.data() == nullptr);\n\n        multi_span<const int, 0> cs = nullptr;\n        EXPECT_TRUE(cs.length() ==  0);\n        EXPECT_TRUE(cs.data() == nullptr);\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        multi_span<int, 1> s = nullptr;\n        EXPECT_TRUE(s.length() ==  1);\n        EXPECT_TRUE(s.data() == nullptr); // explains why it can't compile\n#endif\n    }\n\n    {\n        multi_span<int> s{nullptr};\n        EXPECT_TRUE(s.length() ==  0);\n        EXPECT_TRUE(s.data() == nullptr);\n\n        multi_span<const int> cs{nullptr};\n        EXPECT_TRUE(cs.length() ==  0);\n        EXPECT_TRUE(cs.data() == nullptr);\n    }\n\n    {\n        multi_span<int*> s{nullptr};\n        EXPECT_TRUE(s.length() ==  0);\n        EXPECT_TRUE(s.data() == nullptr);\n\n        multi_span<const int*> cs{nullptr};\n        EXPECT_TRUE(cs.length() ==  0);\n        EXPECT_TRUE(cs.data() == nullptr);\n    }\n}\n\nTEST(multi_span_test, from_nullptr_length_constructor) {\n    {\n        multi_span<int> s{nullptr, 0};\n        EXPECT_TRUE(s.length() ==  0);\n        EXPECT_TRUE(s.data() == nullptr);\n\n        multi_span<const int> cs{nullptr, 0};\n        EXPECT_TRUE(cs.length() ==  0);\n        EXPECT_TRUE(cs.data() == nullptr);\n    }\n\n    {\n        multi_span<int, 0> s{nullptr, 0};\n        EXPECT_TRUE(s.length() ==  0);\n        EXPECT_TRUE(s.data() == nullptr);\n\n        multi_span<const int, 0> cs{nullptr, 0};\n        EXPECT_TRUE(cs.length() ==  0);\n        EXPECT_TRUE(cs.data() == nullptr);\n    }\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. from_nullptr_length_constructor\";\n        std::abort();\n    });\n\n    {\n        auto workaround_macro = []() { const multi_span<int> s{nullptr, 1}; };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n\n        auto const_workaround_macro = []() { const multi_span<const int> cs{nullptr, 1}; };\n        EXPECT_DEATH(const_workaround_macro(), deathstring);\n    }\n\n    {\n        auto workaround_macro = []() { const multi_span<int, 0> s{nullptr, 1}; };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n\n        auto const_workaround_macro = []() { const multi_span<const int, 0> s{nullptr, 1}; };\n        EXPECT_DEATH(const_workaround_macro(), deathstring);\n    }\n\n    {\n        multi_span<int*> s{nullptr, 0};\n        EXPECT_TRUE(s.length() ==  0);\n        EXPECT_TRUE(s.data() == nullptr);\n\n        multi_span<const int*> cs{nullptr, 0};\n        EXPECT_TRUE(cs.length() ==  0);\n        EXPECT_TRUE(cs.data() == nullptr);\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        multi_span<int, 1> s{nullptr, 0};\n        EXPECT_TRUE(s.length() ==  1);\n        EXPECT_TRUE(s.data() == nullptr); // explains why it can't compile\n#endif\n    }\n}\n\nTEST(multi_span_test, from_element_constructor)\n{\n    int i = 5;\n\n    {\n        multi_span<int> s = i;\n        EXPECT_TRUE(s.length() ==  1);\n        EXPECT_TRUE(s.data() == &i);\n        EXPECT_TRUE(s[0] == 5);\n\n        multi_span<const int> cs = i;\n        EXPECT_TRUE(cs.length() ==  1);\n        EXPECT_TRUE(cs.data() == &i);\n        EXPECT_TRUE(cs[0] == 5);\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        const j = 1;\n        multi_span<int, 0> s = j;\n#endif\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        multi_span<int, 0> s = i;\n        EXPECT_TRUE(s.length() ==  0);\n        EXPECT_TRUE(s.data() == &i);\n#endif\n    }\n\n    {\n        multi_span<int, 1> s = i;\n        EXPECT_TRUE(s.length() ==  1);\n        EXPECT_TRUE(s.data() == &i);\n        EXPECT_TRUE(s[0] == 5);\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        multi_span<int, 2> s = i;\n        EXPECT_TRUE(s.length() ==  2);\n        EXPECT_TRUE(s.data() == &i);\n#endif\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        auto get_a_temp = []() -> int { return 4; };\n        auto use_a_span = [](multi_span<int> s) { (void) s; };\n        use_a_span(get_a_temp());\n#endif\n    }\n}\n\nTEST(multi_span_test, from_pointer_length_constructor)\n{\n    int arr[4] = {1, 2, 3, 4};\n\n    {\n        multi_span<int> s{&arr[0], 2};\n        EXPECT_TRUE(s.length() ==  2);\n        EXPECT_TRUE(s.data() == &arr[0]);\n        EXPECT_TRUE(s[0] ==  1);\n        EXPECT_TRUE(s[1] == 2);\n    }\n\n    {\n        multi_span<int, 2> s{&arr[0], 2};\n        EXPECT_TRUE(s.length() ==  2);\n        EXPECT_TRUE(s.data() == &arr[0]);\n        EXPECT_TRUE(s[0] ==  1);\n        EXPECT_TRUE(s[1] == 2);\n    }\n\n    {\n        int* p = nullptr;\n        multi_span<int> s{p, 0};\n        EXPECT_TRUE(s.length() ==  0);\n        EXPECT_TRUE(s.data() == nullptr);\n    }\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. from_pointer_length_constructor\";\n        std::abort();\n    });\n\n    {\n        int* p = nullptr;\n        auto workaround_macro = [=]() { const multi_span<int> s{p, 2}; };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n    }\n}\n\nTEST(multi_span_test, from_pointer_pointer_constructor)\n{\n    int arr[4] = {1, 2, 3, 4};\n\n    {\n        multi_span<int> s{&arr[0], &arr[2]};\n        EXPECT_TRUE(s.length() ==  2);\n        EXPECT_TRUE(s.data() == &arr[0]);\n        EXPECT_TRUE(s[0] ==  1);\n        EXPECT_TRUE(s[1] == 2);\n    }\n\n    {\n        multi_span<int, 2> s{&arr[0], &arr[2]};\n        EXPECT_TRUE(s.length() ==  2);\n        EXPECT_TRUE(s.data() == &arr[0]);\n        EXPECT_TRUE(s[0] ==  1);\n        EXPECT_TRUE(s[1] == 2);\n    }\n\n    {\n        multi_span<int> s{&arr[0], &arr[0]};\n        EXPECT_TRUE(s.length() ==  0);\n        EXPECT_TRUE(s.data() == &arr[0]);\n    }\n\n    {\n        multi_span<int, 0> s{&arr[0], &arr[0]};\n        EXPECT_TRUE(s.length() ==  0);\n        EXPECT_TRUE(s.data() == &arr[0]);\n    }\n\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. from_pointer_pointer_constructor\";\n        std::abort();\n    });\n\n    {\n        auto workaround_macro = [&]() { const multi_span<int> s{&arr[1], &arr[0]}; };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n    }\n\n    {\n        int* p = nullptr;\n        auto workaround_macro = [&]() { const multi_span<int> s{&arr[0], p}; };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n    }\n\n    {\n        int* p = nullptr;\n        auto workaround_macro = [&]() { const multi_span<int> s{p, p}; };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n    }\n\n    {\n        int* p = nullptr;\n        auto workaround_macro = [&]() { const multi_span<int> s{&arr[0], p}; };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n    }\n}\n\nTEST(multi_span_test, from_array_constructor)\n{\n    int arr[5] = {1, 2, 3, 4, 5};\n\n    {\n        multi_span<int> s{arr};\n        EXPECT_TRUE(s.length() ==  5);\n        EXPECT_TRUE(s.data() == &arr[0]);\n    }\n\n    {\n        multi_span<int, 5> s{arr};\n        EXPECT_TRUE(s.length() ==  5);\n        EXPECT_TRUE(s.data() == &arr[0]);\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        multi_span<int, 6> s{arr};\n#endif\n    }\n\n    {\n        multi_span<int, 0> s{arr};\n        EXPECT_TRUE(s.length() ==  0);\n        EXPECT_TRUE(s.data() == &arr[0]);\n    }\n\n    int arr2d[2][3] = {1, 2, 3, 4, 5, 6};\n\n    {\n        multi_span<int> s{arr2d};\n        EXPECT_TRUE(s.length() ==  6);\n        EXPECT_TRUE(s.data() == &arr2d[0][0]);\n        EXPECT_TRUE(s[0] ==  1);\n        EXPECT_TRUE(s[5] == 6);\n    }\n\n    {\n        multi_span<int, 0> s{arr2d};\n        EXPECT_TRUE(s.length() ==  0);\n        EXPECT_TRUE(s.data() == &arr2d[0][0]);\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        multi_span<int, 5> s{arr2d};\n#endif\n    }\n\n    {\n        multi_span<int, 6> s{arr2d};\n        EXPECT_TRUE(s.length() ==  6);\n        EXPECT_TRUE(s.data() == &arr2d[0][0]);\n        EXPECT_TRUE(s[0] ==  1);\n        EXPECT_TRUE(s[5] == 6);\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        multi_span<int, 7> s{arr2d};\n#endif\n    }\n\n    {\n        multi_span<int[3]> s{arr2d[0]};\n        EXPECT_TRUE(s.length() ==  1);\n        EXPECT_TRUE(s.data() == &arr2d[0]);\n    }\n\n    {\n        multi_span<int, 2, 3> s{arr2d};\n        EXPECT_TRUE(s.length() ==  6);\n        EXPECT_TRUE(s.data() == &arr2d[0][0]);\n        auto workaround_macro = [&]() { return s[{1, 2}] == 6; };\n        EXPECT_TRUE(workaround_macro());\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        multi_span<int, 3, 3> s{arr2d};\n#endif\n    }\n\n    int arr3d[2][3][2] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};\n\n    {\n        multi_span<int> s{arr3d};\n        EXPECT_TRUE(s.length() ==  12);\n        EXPECT_TRUE(s.data() == &arr3d[0][0][0]);\n        EXPECT_TRUE(s[0] ==  1);\n        EXPECT_TRUE(s[11] == 12);\n    }\n\n    {\n        multi_span<int, 0> s{arr3d};\n        EXPECT_TRUE(s.length() ==  0);\n        EXPECT_TRUE(s.data() == &arr3d[0][0][0]);\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        multi_span<int, 11> s{arr3d};\n#endif\n    }\n\n    {\n        multi_span<int, 12> s{arr3d};\n        EXPECT_TRUE(s.length() ==  12);\n        EXPECT_TRUE(s.data() == &arr3d[0][0][0]);\n        EXPECT_TRUE(s[0] ==  1);\n        EXPECT_TRUE(s[5] == 6);\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        multi_span<int, 13> s{arr3d};\n#endif\n    }\n\n    {\n        multi_span<int[3][2]> s{arr3d[0]};\n        EXPECT_TRUE(s.length() ==  1);\n        EXPECT_TRUE(s.data() == &arr3d[0]);\n    }\n\n    {\n        multi_span<int, 3, 2, 2> s{arr3d};\n        EXPECT_TRUE(s.length() ==  12);\n        EXPECT_TRUE(s.data() == &arr3d[0][0][0]);\n        auto workaround_macro = [&]() { return s[{2, 1, 0}] == 11; };\n        EXPECT_TRUE(workaround_macro());\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        multi_span<int, 3, 3, 3> s{arr3d};\n#endif\n    }\n}\n\nTEST(multi_span_test, from_dynamic_array_constructor)\n{\n    double(*arr)[3][4] = new double[100][3][4];\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. from_nullptr_length_constructor\";\n        std::abort();\n    });\n\n    {\n        multi_span<double, dynamic_range, 3, 4> s(arr, 10);\n        EXPECT_TRUE(s.length() ==  120);\n        EXPECT_TRUE(s.data() == &arr[0][0][0]);\n        EXPECT_DEATH(s[10][3][4], deathstring);\n    }\n\n    {\n        multi_span<double, dynamic_range, 4, 3> s(arr, 10);\n        EXPECT_TRUE(s.length() ==  120);\n        EXPECT_TRUE(s.data() == &arr[0][0][0]);\n    }\n\n    {\n        multi_span<double> s(arr, 10);\n        EXPECT_TRUE(s.length() ==  120);\n        EXPECT_TRUE(s.data() == &arr[0][0][0]);\n    }\n\n    {\n        multi_span<double, dynamic_range, 3, 4> s(arr, 0);\n        EXPECT_TRUE(s.length() ==  0);\n        EXPECT_TRUE(s.data() == &arr[0][0][0]);\n    }\n\n    delete[] arr;\n}\n\nTEST(multi_span_test, from_std_array_constructor)\n{\n    std::array<int, 4> arr = {1, 2, 3, 4};\n\n    {\n        multi_span<int> s{arr};\n        EXPECT_TRUE(s.size() ==  narrow_cast<ptrdiff_t>(arr.size()));\n        EXPECT_TRUE(s.data() == arr.data());\n\n        multi_span<const int> cs{arr};\n        EXPECT_TRUE(cs.size() ==  narrow_cast<ptrdiff_t>(arr.size()));\n        EXPECT_TRUE(cs.data() == arr.data());\n    }\n\n    {\n        multi_span<int, 4> s{arr};\n        EXPECT_TRUE(s.size() ==  narrow_cast<ptrdiff_t>(arr.size()));\n        EXPECT_TRUE(s.data() == arr.data());\n\n        multi_span<const int, 4> cs{arr};\n        EXPECT_TRUE(cs.size() ==  narrow_cast<ptrdiff_t>(arr.size()));\n        EXPECT_TRUE(cs.data() == arr.data());\n    }\n\n    {\n        multi_span<int, 2> s{arr};\n        EXPECT_TRUE(s.size() ==  2);\n        EXPECT_TRUE(s.data() == arr.data());\n\n        multi_span<const int, 2> cs{arr};\n        EXPECT_TRUE(cs.size() ==  2);\n        EXPECT_TRUE(cs.data() == arr.data());\n    }\n\n    {\n        multi_span<int, 0> s{arr};\n        EXPECT_TRUE(s.size() ==  0);\n        EXPECT_TRUE(s.data() == arr.data());\n\n        multi_span<const int, 0> cs{arr};\n        EXPECT_TRUE(cs.size() ==  0);\n        EXPECT_TRUE(cs.data() == arr.data());\n    }\n\n    // TODO This is currently an unsupported scenario. We will come back to it as we revise\n    // the multidimensional interface and what transformations between dimensionality look like\n    //{\n    //    multi_span<int, 2, 2> s{arr};\n    //    EXPECT_TRUE(s.size() == narrow_cast<ptrdiff_t>(arr.size()));\n    //    EXPECT_TRUE(s.data() == arr.data());\n    //}\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        multi_span<int, 5> s{arr};\n#endif\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        auto get_an_array = []() { return std::array<int, 4>{1, 2, 3, 4}; };\n        auto take_a_span = [](multi_span<int> s) { (void) s; };\n        // try to take a temporary std::array\n        take_a_span(get_an_array());\n#endif\n    }\n}\n\nTEST(multi_span_test, from_const_std_array_constructor)\n{\n    const std::array<int, 4> arr = {1, 2, 3, 4};\n\n    {\n        multi_span<const int> s{arr};\n        EXPECT_TRUE(s.size() ==  narrow_cast<ptrdiff_t>(arr.size()));\n        EXPECT_TRUE(s.data() == arr.data());\n    }\n\n    {\n        multi_span<const int, 4> s{arr};\n        EXPECT_TRUE(s.size() ==  narrow_cast<ptrdiff_t>(arr.size()));\n        EXPECT_TRUE(s.data() == arr.data());\n    }\n\n    {\n        multi_span<const int, 2> s{arr};\n        EXPECT_TRUE(s.size() ==  2);\n        EXPECT_TRUE(s.data() == arr.data());\n    }\n\n    {\n        multi_span<const int, 0> s{arr};\n        EXPECT_TRUE(s.size() ==  0);\n        EXPECT_TRUE(s.data() == arr.data());\n    }\n\n    // TODO This is currently an unsupported scenario. We will come back to it as we revise\n    // the multidimensional interface and what transformations between dimensionality look like\n    //{\n    //    multi_span<int, 2, 2> s{arr};\n    //    EXPECT_TRUE(s.size() == narrow_cast<ptrdiff_t>(arr.size()));\n    //    EXPECT_TRUE(s.data() == arr.data());\n    //}\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        multi_span<const int, 5> s{arr};\n#endif\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        auto get_an_array = []() -> const std::array<int, 4> { return {1, 2, 3, 4}; };\n        auto take_a_span = [](multi_span<const int> s) { (void) s; };\n        // try to take a temporary std::array\n        take_a_span(get_an_array());\n#endif\n    }\n}\n\nTEST(multi_span_test, from_container_constructor)\n{\n    std::vector<int> v = {1, 2, 3};\n    const std::vector<int> cv = v;\n\n    {\n        multi_span<int> s{v};\n        EXPECT_TRUE(s.size() ==  narrow_cast<std::ptrdiff_t>(v.size()));\n        EXPECT_TRUE(s.data() == v.data());\n\n        multi_span<const int> cs{v};\n        EXPECT_TRUE(cs.size() ==  narrow_cast<std::ptrdiff_t>(v.size()));\n        EXPECT_TRUE(cs.data() == v.data());\n    }\n\n    std::string str = \"hello\";\n    const std::string cstr = \"hello\";\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        multi_span<char> s{str};\n        EXPECT_TRUE(s.size() ==  narrow_cast<std::ptrdiff_t>(str.size()));\n        EXPECT_TRUE(s.data() == str.data());\n#endif\n        multi_span<const char> cs{str};\n        EXPECT_TRUE(cs.size() ==  narrow_cast<std::ptrdiff_t>(str.size()));\n        EXPECT_TRUE(cs.data() == str.data());\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        multi_span<char> s{cstr};\n#endif\n        multi_span<const char> cs{cstr};\n        EXPECT_TRUE(cs.size() ==  narrow_cast<std::ptrdiff_t>(cstr.size()));\n        EXPECT_TRUE(cs.data() == cstr.data());\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        auto get_temp_vector = []() -> std::vector<int> { return {}; };\n        auto use_span = [](multi_span<int> s) { (void) s; };\n        use_span(get_temp_vector());\n#endif\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        auto get_temp_string = []() -> std::string { return {}; };\n        auto use_span = [](multi_span<char> s) { (void) s; };\n        use_span(get_temp_string());\n#endif\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        auto get_temp_vector = []() -> const std::vector<int> { return {}; };\n        auto use_span = [](multi_span<const char> s) { (void) s; };\n        use_span(get_temp_vector());\n#endif\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        auto get_temp_string = []() -> const std::string { return {}; };\n        auto use_span = [](multi_span<const char> s) { (void) s; };\n        use_span(get_temp_string());\n#endif\n    }\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        std::map<int, int> m;\n        multi_span<int> s{m};\n#endif\n    }\n}\n\nTEST(multi_span_test, from_convertible_span_constructor)\n{\n#ifdef CONFIRM_COMPILATION_ERRORS\n    multi_span<int, 7, 4, 2> av1(nullptr, b1);\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. from_convertible_span_constructor\";\n        std::abort();\n    });\n\n    auto f = [&]() { multi_span<int, 7, 4, 2> av1(nullptr); };\n    EXPECT_DEATH(f(), deathstring);\n#endif\n\n#ifdef CONFIRM_COMPILATION_ERRORS\n    static_bounds<std::size_t, 7, dynamic_range, 2> b12(b11);\n    b12 = b11;\n    b11 = b12;\n\n    multi_span<int, dynamic_range> av1 = nullptr;\n    multi_span<int, 7, dynamic_range, 2> av2(av1);\n    multi_span<int, 7, 4, 2> av2(av1);\n#endif\n\n    multi_span<DerivedClass> avd;\n#ifdef CONFIRM_COMPILATION_ERRORS\n    multi_span<BaseClass> avb = avd;\n#endif\n    multi_span<const DerivedClass> avcd = avd;\n    (void) avcd;\n}\n\nTEST(multi_span_test, copy_move_and_assignment)\n{\n    multi_span<int> s1;\n    EXPECT_TRUE(s1.empty());\n\n    int arr[] = {3, 4, 5};\n\n    multi_span<const int> s2 = arr;\n    EXPECT_TRUE(s2.length() ==  3);\n    EXPECT_TRUE(s2.data() == &arr[0]);\n\n    s2 = s1;\n    EXPECT_TRUE(s2.empty());\n\n    auto get_temp_span = [&]() -> multi_span<int> { return {&arr[1], 2}; };\n    auto use_span = [&](multi_span<const int> s) {\n        EXPECT_TRUE(s.length() ==  2);\n        EXPECT_TRUE(s.data() == &arr[1]);\n    };\n    use_span(get_temp_span());\n\n    s1 = get_temp_span();\n    EXPECT_TRUE(s1.length() ==  2);\n    EXPECT_TRUE(s1.data() == &arr[1]);\n}\n\nTEST(multi_span_test, as_multi_span_reshape)\n{\n    int a[3][4][5];\n    auto av = as_multi_span(a);\n    fn(av.bounds());\n    auto av2 = as_multi_span(av, dim<60>());\n    auto av3 = as_multi_span(av2, dim<3>(), dim<4>(), dim<5>());\n    auto av4 = as_multi_span(av3, dim<4>(), dim(3), dim<5>());\n    auto av5 = as_multi_span(av4, dim<3>(), dim<4>(), dim<5>());\n    auto av6 = as_multi_span(av5, dim<12>(), dim(5));\n\n    fill(av6.begin(), av6.end(), 1);\n\n    auto av7 = as_bytes(av6);\n\n    auto av8 = as_multi_span<int>(av7);\n\n    EXPECT_TRUE(av8.size() == av6.size());\n    for (auto i = 0; i < av8.size(); i++) { EXPECT_TRUE(av8[i] == 1); }\n}\n\nTEST(multi_span_test, first)\n{\n    int arr[5] = {1, 2, 3, 4, 5};\n\n    {\n        multi_span<int, 5> av = arr;\n        EXPECT_TRUE(av.first<2>().bounds() == static_bounds<2>());\n        EXPECT_TRUE(av.first<2>().length() == 2);\n        EXPECT_TRUE(av.first(2).length() == 2);\n    }\n\n    {\n        multi_span<int, 5> av = arr;\n        EXPECT_TRUE(av.first<0>().bounds() == static_bounds<0>());\n        EXPECT_TRUE(av.first<0>().length() == 0);\n        EXPECT_TRUE(av.first(0).length() == 0);\n    }\n\n    {\n        multi_span<int, 5> av = arr;\n        EXPECT_TRUE(av.first<5>().bounds() == static_bounds<5>());\n        EXPECT_TRUE(av.first<5>().length() == 5);\n        EXPECT_TRUE(av.first(5).length() == 5);\n    }\n\n    {\n        multi_span<int, 5> av = arr;\n#ifdef CONFIRM_COMPILATION_ERRORS\n        EXPECT_TRUE(av.first<6>().bounds() == static_bounds<6>());\n        EXPECT_TRUE(av.first<6>().length() == 6);\n        EXPECT_TRUE(av.first<-1>().length() == -1);\n#endif\n\n        std::set_terminate([] {\n            std::cerr << \"Expected Death. first\";\n            std::abort();\n        });\n\n        EXPECT_DEATH(av.first(6).length(), deathstring);\n    }\n\n    {\n        multi_span<int, dynamic_range> av;\n        EXPECT_TRUE(av.first<0>().bounds() == static_bounds<0>());\n        EXPECT_TRUE(av.first<0>().length() == 0);\n        EXPECT_TRUE(av.first(0).length() == 0);\n    }\n}\n\nTEST(multi_span_test, last)\n{\n    int arr[5] = {1, 2, 3, 4, 5};\n\n    {\n        multi_span<int, 5> av = arr;\n        EXPECT_TRUE(av.last<2>().bounds() == static_bounds<2>());\n        EXPECT_TRUE(av.last<2>().length() == 2);\n        EXPECT_TRUE(av.last(2).length() == 2);\n    }\n\n    {\n        multi_span<int, 5> av = arr;\n        EXPECT_TRUE(av.last<0>().bounds() == static_bounds<0>());\n        EXPECT_TRUE(av.last<0>().length() == 0);\n        EXPECT_TRUE(av.last(0).length() == 0);\n    }\n\n    {\n        multi_span<int, 5> av = arr;\n        EXPECT_TRUE(av.last<5>().bounds() == static_bounds<5>());\n        EXPECT_TRUE(av.last<5>().length() == 5);\n        EXPECT_TRUE(av.last(5).length() == 5);\n    }\n\n    {\n        multi_span<int, 5> av = arr;\n#ifdef CONFIRM_COMPILATION_ERRORS\n        EXPECT_TRUE(av.last<6>().bounds() == static_bounds<6>());\n        EXPECT_TRUE(av.last<6>().length() == 6);\n#endif\n\n        std::set_terminate([] {\n            std::cerr << \"Expected Death. last\";\n            std::abort();\n        });\n\n        EXPECT_DEATH(av.last(6).length(), deathstring);\n    }\n\n    {\n        multi_span<int, dynamic_range> av;\n        EXPECT_TRUE(av.last<0>().bounds() == static_bounds<0>());\n        EXPECT_TRUE(av.last<0>().length() == 0);\n        EXPECT_TRUE(av.last(0).length() == 0);\n    }\n}\n\nTEST(multi_span_test, subspan)\n{\n    int arr[5] = {1, 2, 3, 4, 5};\n\n    {\n        multi_span<int, 5> av = arr;\n        EXPECT_TRUE((av.subspan<2, 2>().bounds()) == static_bounds<2>());\n        EXPECT_TRUE((av.subspan<2, 2>().length()) == 2);\n        EXPECT_TRUE(av.subspan(2, 2).length() == 2);\n        EXPECT_TRUE(av.subspan(2, 3).length() == 3);\n    }\n\n    {\n        multi_span<int, 5> av = arr;\n        EXPECT_TRUE((av.subspan<0, 0>().bounds()) == static_bounds<0>());\n        EXPECT_TRUE((av.subspan<0, 0>().length()) == 0);\n        EXPECT_TRUE(av.subspan(0, 0).length() == 0);\n    }\n\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. subspan\";\n        std::abort();\n    });\n    {\n        multi_span<int, 5> av = arr;\n        EXPECT_TRUE((av.subspan<0, 5>().bounds()) == static_bounds<5>());\n        EXPECT_TRUE((av.subspan<0, 5>().length()) == 5);\n        EXPECT_TRUE(av.subspan(0, 5).length() == 5);\n        EXPECT_DEATH(av.subspan(0, 6).length(), deathstring);\n        EXPECT_DEATH(av.subspan(1, 5).length(), deathstring);\n    }\n\n    {\n        multi_span<int, 5> av = arr;\n        EXPECT_TRUE((av.subspan<5, 0>().bounds()) == static_bounds<0>());\n        EXPECT_TRUE((av.subspan<5, 0>().length()) == 0);\n        EXPECT_TRUE(av.subspan(5, 0).length() == 0);\n        EXPECT_DEATH(av.subspan(6, 0).length(), deathstring);\n    }\n\n    {\n        multi_span<int, dynamic_range> av;\n        EXPECT_TRUE((av.subspan<0, 0>().bounds()) == static_bounds<0>());\n        EXPECT_TRUE((av.subspan<0, 0>().length()) == 0);\n        EXPECT_TRUE(av.subspan(0, 0).length() == 0);\n        EXPECT_DEATH((av.subspan<1, 0>().length()), deathstring);\n    }\n\n    {\n        multi_span<int> av;\n        EXPECT_TRUE(av.subspan(0).length() == 0);\n        EXPECT_DEATH(av.subspan(1).length(), deathstring);\n    }\n\n    {\n        multi_span<int> av = arr;\n        EXPECT_TRUE(av.subspan(0).length() == 5);\n        EXPECT_TRUE(av.subspan(1).length() == 4);\n        EXPECT_TRUE(av.subspan(4).length() == 1);\n        EXPECT_TRUE(av.subspan(5).length() == 0);\n        // Disabled test instead of fixing since multi_span is deprecated. (PR#835)\n#if !(defined(__GNUC__) && __GNUC__ == 8)\n        EXPECT_DEATH(av.subspan(6).length(), deathstring);\n#endif\n        auto av2 = av.subspan(1);\n        for (int i = 0; i < 4; ++i) EXPECT_TRUE(av2[i] == i + 2);\n    }\n\n    {\n        multi_span<int, 5> av = arr;\n        EXPECT_TRUE(av.subspan(0).length() == 5);\n        EXPECT_TRUE(av.subspan(1).length() == 4);\n        EXPECT_TRUE(av.subspan(4).length() == 1);\n        EXPECT_TRUE(av.subspan(5).length() == 0);\n        EXPECT_DEATH(av.subspan(6).length(), deathstring);\n        auto av2 = av.subspan(1);\n        for (int i = 0; i < 4; ++i) EXPECT_TRUE(av2[i] == i + 2);\n    }\n}\n\nTEST(multi_span_test, rank)\n{\n    int arr[2] = {1, 2};\n\n    {\n        multi_span<int> s;\n        EXPECT_TRUE(s.rank() == static_cast<size_t>(1));\n    }\n\n    {\n        multi_span<int, 2> s = arr;\n        EXPECT_TRUE(s.rank() == static_cast<size_t>(1));\n    }\n\n    int arr2d[1][1] = {};\n    {\n        multi_span<int, 1, 1> s = arr2d;\n        EXPECT_TRUE(s.rank() == static_cast<size_t>(2));\n    }\n}\n\nTEST(multi_span_test, extent)\n{\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. extent\";\n        std::abort();\n    });\n\n    {\n        multi_span<int> s;\n        EXPECT_TRUE(s.extent() == 0);\n        EXPECT_TRUE(s.extent(0) == 0);\n        EXPECT_DEATH(s.extent(1), deathstring);\n#ifdef CONFIRM_COMPILATION_ERRORS\n        EXPECT_TRUE(s.extent<1>() == 0);\n#endif\n    }\n\n    {\n        multi_span<int, 0> s;\n        EXPECT_TRUE(s.extent() == 0);\n        EXPECT_TRUE(s.extent(0) == 0);\n        EXPECT_DEATH(s.extent(1), deathstring);\n    }\n\n    {\n        int arr2d[1][2] = {};\n\n        multi_span<int, 1, 2> s = arr2d;\n        EXPECT_TRUE(s.extent() == 1);\n        EXPECT_TRUE(s.extent<0>() == 1);\n        EXPECT_TRUE(s.extent<1>() == 2);\n        EXPECT_TRUE(s.extent(0) == 1);\n        EXPECT_TRUE(s.extent(1) == 2);\n        EXPECT_DEATH(s.extent(3), deathstring);\n    }\n\n    {\n        int arr2d[1][2] = {};\n\n        multi_span<int, 0, 2> s = arr2d;\n        EXPECT_TRUE(s.extent() == 0);\n        EXPECT_TRUE(s.extent<0>() == 0);\n        EXPECT_TRUE(s.extent<1>() == 2);\n        EXPECT_TRUE(s.extent(0) == 0);\n        EXPECT_TRUE(s.extent(1) == 2);\n        EXPECT_DEATH(s.extent(3), deathstring);\n    }\n}\n\nTEST(multi_span_test, operator_function_call)\n{\n    int arr[4] = {1, 2, 3, 4};\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. operator_function_call\";\n        std::abort();\n    });\n\n    {\n        multi_span<int> s = arr;\n        EXPECT_TRUE(s(0) == 1);\n        EXPECT_DEATH(s(5), deathstring);\n    }\n\n    int arr2d[2][3] = {1, 2, 3, 4, 5, 6};\n\n    {\n        multi_span<int, 2, 3> s = arr2d;\n        EXPECT_TRUE(s(0, 0) == 1);\n        EXPECT_TRUE(s(0, 1) == 2);\n        EXPECT_TRUE(s(1, 2) == 6);\n    }\n\n    int arr3d[2][2][2] = {1, 2, 3, 4, 5, 6, 7, 8};\n\n    {\n        multi_span<int, 2, 2, 2> s = arr3d;\n        EXPECT_TRUE(s(0, 0, 0) == 1);\n        EXPECT_TRUE(s(1, 1, 1) == 8);\n    }\n}\n\nTEST(multi_span_test, comparison_operators)\n{\n    {\n        int arr[10][2];\n        auto s1 = as_multi_span(arr);\n        multi_span<const int, dynamic_range, 2> s2 = s1;\n\n        EXPECT_TRUE(s1 == s2);\n\n        multi_span<int, 20> s3 = as_multi_span(s1, dim(20));\n        EXPECT_TRUE(s3 == s2);\n        EXPECT_TRUE(s3 == s1);\n    }\n    {\n        multi_span<int> s1 = nullptr;\n        multi_span<int> s2 = nullptr;\n        EXPECT_TRUE(s1 == s2);\n        EXPECT_FALSE(s1 != s2);\n        EXPECT_FALSE(s1 < s2);\n        EXPECT_TRUE(s1 <= s2);\n        EXPECT_FALSE(s1 > s2);\n        EXPECT_TRUE(s1 >= s2);\n        EXPECT_TRUE(s2 == s1);\n        EXPECT_FALSE(s2 != s1);\n        EXPECT_FALSE(s2 < s1);\n        EXPECT_TRUE(s2 <= s1);\n        EXPECT_FALSE(s2 > s1);\n        EXPECT_TRUE(s2 >= s1);\n    }\n\n\n    {\n        int arr[] = {2, 1}; // bigger\n\n        multi_span<int> s1 = nullptr;\n        multi_span<int> s2 = arr;\n\n        EXPECT_TRUE(s1 != s2);\n        EXPECT_TRUE(s2 != s1);\n        EXPECT_FALSE(s1 == s2);\n        EXPECT_FALSE(s2 == s1);\n        EXPECT_TRUE(s1 < s2);\n        EXPECT_FALSE(s2 < s1);\n        EXPECT_TRUE(s1 <= s2);\n        EXPECT_FALSE(s2 <= s1);\n        EXPECT_TRUE(s2 > s1);\n        EXPECT_FALSE(s1 > s2);\n        EXPECT_TRUE(s2 >= s1);\n        EXPECT_FALSE(s1 >= s2);\n    }\n\n    {\n        int arr1[] = {1, 2};\n        int arr2[] = {1, 2};\n        multi_span<int> s1 = arr1;\n        multi_span<int> s2 = arr2;\n\n        EXPECT_TRUE(s1 == s2);\n        EXPECT_FALSE(s1 != s2);\n        EXPECT_FALSE(s1 < s2);\n        EXPECT_TRUE(s1 <= s2);\n        EXPECT_FALSE(s1 > s2);\n        EXPECT_TRUE(s1 >= s2);\n        EXPECT_TRUE(s2 == s1);\n        EXPECT_FALSE(s2 != s1);\n        EXPECT_FALSE(s2 < s1);\n        EXPECT_TRUE(s2 <= s1);\n        EXPECT_FALSE(s2 > s1);\n        EXPECT_TRUE(s2 >= s1);\n    }\n\n    {\n        int arr[] = {1, 2, 3};\n\n        multi_span<int> s1 = {&arr[0], 2}; // shorter\n        multi_span<int> s2 = arr;          // longer\n\n        EXPECT_TRUE(s1 != s2);\n        EXPECT_TRUE(s2 != s1);\n        EXPECT_FALSE(s1 == s2);\n        EXPECT_FALSE(s2 == s1);\n        EXPECT_TRUE(s1 < s2);\n        EXPECT_FALSE(s2 < s1);\n        EXPECT_TRUE(s1 <= s2);\n        EXPECT_FALSE(s2 <= s1);\n        EXPECT_TRUE(s2 > s1);\n        EXPECT_FALSE(s1 > s2);\n        EXPECT_TRUE(s2 >= s1);\n        EXPECT_FALSE(s1 >= s2);\n    }\n\n    {\n        int arr1[] = {1, 2}; // smaller\n        int arr2[] = {2, 1}; // bigger\n\n        multi_span<int> s1 = arr1;\n        multi_span<int> s2 = arr2;\n\n        EXPECT_TRUE(s1 != s2);\n        EXPECT_TRUE(s2 != s1);\n        EXPECT_FALSE(s1 == s2);\n        EXPECT_FALSE(s2 == s1);\n        EXPECT_TRUE(s1 < s2);\n        EXPECT_FALSE(s2 < s1);\n        EXPECT_TRUE(s1 <= s2);\n        EXPECT_FALSE(s2 <= s1);\n        EXPECT_TRUE(s2 > s1);\n        EXPECT_FALSE(s1 > s2);\n        EXPECT_TRUE(s2 >= s1);\n        EXPECT_FALSE(s1 >= s2);\n    }\n}\n\nTEST(multi_span_test, basics)\n{\n    auto ptr = as_multi_span(new int[10], 10);\n    fill(ptr.begin(), ptr.end(), 99);\n    for (int num : ptr) { EXPECT_TRUE(num == 99); }\n\n    delete[] ptr.data();\n}\n\nTEST(multi_span_test, bounds_checks)\n{\n    int arr[10][2];\n    auto av = as_multi_span(arr);\n\n    fill(begin(av), end(av), 0);\n\n    av[2][0] = 1;\n    av[1][1] = 3;\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. bounds_check\";\n        std::abort();\n    });\n\n    // out of bounds\n    EXPECT_DEATH(av[1][3] = 3, deathstring);\n    EXPECT_DEATH((av[{1, 3}] = 3), deathstring);\n\n    EXPECT_DEATH(av[10][2], deathstring);\n    EXPECT_DEATH((av[{10, 2}]), deathstring);\n\n    EXPECT_DEATH(av[-1][0], deathstring);\n    EXPECT_DEATH((av[{-1, 0}]), deathstring);\n\n    EXPECT_DEATH(av[0][-1], deathstring);\n    EXPECT_DEATH((av[{0, -1}]), deathstring);\n}\n\nTEST(multi_span_test, span_parameter_test)\n{\n    auto data = new int[4][3][5];\n\n    auto av = as_multi_span(data, 4);\n\n    EXPECT_TRUE(av.size() == 60);\n\n    fill(av.begin(), av.end(), 34);\n\n    int count = 0;\n    for_each(av.rbegin(), av.rend(), [&](int val) { count += val; });\n    EXPECT_TRUE(count == 34 * 60);\n    overloaded_func(av, 34);\n\n    overloaded_func(as_multi_span(av, dim(4), dim(3), dim(5)), 34);\n\n    delete[] data;\n}\n\nTEST(multi_span_test, md_access)\n{\n    auto width = 5, height = 20;\n\n    auto imgSize = width * height;\n    auto image_ptr = new int[narrow_cast<std::size_t>(imgSize)][3];\n\n    // size check will be done\n    auto image_view =\n        as_multi_span(as_multi_span(image_ptr, imgSize), dim(height), dim(width), dim<3>());\n\n    iota(image_view.begin(), image_view.end(), 1);\n\n    int expected = 0;\n    for (auto i = 0; i < height; i++)\n    {\n        for (auto j = 0; j < width; j++)\n        {\n            EXPECT_TRUE(expected + 1 == image_view[i][j][0]);\n            EXPECT_TRUE(expected + 2 == image_view[i][j][1]);\n            EXPECT_TRUE(expected + 3 == image_view[i][j][2]);\n\n            auto val = image_view[{i, j, 0}];\n            EXPECT_TRUE(expected + 1 == val);\n            val = image_view[{i, j, 1}];\n            EXPECT_TRUE(expected + 2 == val);\n            val = image_view[{i, j, 2}];\n            EXPECT_TRUE(expected + 3 == val);\n\n            expected += 3;\n        }\n    }\n\n    delete[] image_ptr;\n}\n\nTEST(multi_span_test, as_multi_span)\n{\n    {\n        int* arr = new int[150];\n\n        auto av = as_multi_span(arr, dim<10>(), dim(3), dim<5>());\n\n        fill(av.begin(), av.end(), 24);\n        overloaded_func(av, 24);\n\n        delete[] arr;\n\n        array<int, 15> stdarr{0};\n        auto av2 = as_multi_span(stdarr);\n        overloaded_func(as_multi_span(av2, dim(1), dim<3>(), dim<5>()), 0);\n\n        string str = \"ttttttttttttttt\"; // size = 15\n        auto t = str.data();\n        GSL_SUPPRESS(type.4) // NO-FORMAT: attribute // TODO: false positive\n        (void) t;\n        auto av3 = as_multi_span(str);\n        overloaded_func(as_multi_span(av3, dim(1), dim<3>(), dim<5>()), 't');\n    }\n\n    {\n        string str;\n        multi_span<char> strspan = as_multi_span(str);\n        (void) strspan;\n        const string cstr;\n        multi_span<const char> cstrspan = as_multi_span(cstr);\n        (void) cstrspan;\n    }\n\n    {\n        int a[3][4][5];\n        auto av = as_multi_span(a);\n        const int(*b)[4][5];\n        b = a;\n        auto bv = as_multi_span(b, 3);\n\n        EXPECT_TRUE(av == bv);\n\n        const std::array<double, 3> arr = {0.0, 0.0, 0.0};\n        auto cv = as_multi_span(arr);\n        (void) cv;\n\n        vector<float> vec(3);\n        auto dv = as_multi_span(vec);\n        (void) dv;\n\n    #ifdef CONFIRM_COMPILATION_ERRORS\n        auto dv2 = as_multi_span(std::move(vec));\n    #endif\n\n    }\n}\n\nTEST(multi_span_test, empty_spans)\n{\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. empty_spans\";\n        std::abort();\n    });\n\n    {\n        multi_span<int, 0> empty_av(nullptr);\n\n        EXPECT_TRUE(empty_av.bounds().index_bounds() == multi_span_index<1>{0});\n        EXPECT_DEATH(empty_av[0], deathstring);\n        EXPECT_DEATH(empty_av.begin()[0], deathstring);\n        EXPECT_DEATH(empty_av.cbegin()[0], deathstring);\n        for (auto& v : empty_av)\n        {\n            (void) v;\n            EXPECT_TRUE(false);\n        }\n    }\n\n    {\n        multi_span<int> empty_av = {};\n        EXPECT_TRUE(empty_av.bounds().index_bounds() == multi_span_index<1>{0});\n        EXPECT_DEATH(empty_av[0], deathstring);\n        EXPECT_DEATH(empty_av.begin()[0], deathstring);\n        EXPECT_DEATH(empty_av.cbegin()[0], deathstring);\n        for (auto& v : empty_av)\n        {\n            (void) v;\n            EXPECT_TRUE(false);\n        }\n    }\n}\n\nTEST(multi_span_test, index_constructor)\n{\n    auto arr = new int[8];\n    for (int i = 0; i < 4; ++i)\n    {\n        arr[2 * i] = 4 + i;\n        arr[2 * i + 1] = i;\n    }\n\n    multi_span<int, dynamic_range> av(arr, 8);\n\n    ptrdiff_t a[1] = {0};\n    multi_span_index<1> i = a;\n\n    EXPECT_TRUE(av[i] == 4);\n\n    auto av2 = as_multi_span(av, dim<4>(), dim(2));\n    ptrdiff_t a2[2] = {0, 1};\n    multi_span_index<2> i2 = a2;\n\n    EXPECT_TRUE(av2[i2] == 0);\n    EXPECT_TRUE(av2[0][i] == 4);\n\n    delete[] arr;\n}\n\nTEST(multi_span_test, index_constructors)\n{\n    {\n        // components of the same type\n        multi_span_index<3> i1(0, 1, 2);\n        EXPECT_TRUE(i1[0] == 0);\n\n        // components of different types\n        std::size_t c0 = 0;\n        std::size_t c1 = 1;\n        multi_span_index<3> i2(c0, c1, 2);\n        EXPECT_TRUE(i2[0] == 0);\n\n        // from array\n        multi_span_index<3> i3 = {0, 1, 2};\n        EXPECT_TRUE(i3[0] == 0);\n\n        // from other index of the same size type\n        multi_span_index<3> i4 = i3;\n        EXPECT_TRUE(i4[0] == 0);\n\n        // default\n        multi_span_index<3> i7;\n        EXPECT_TRUE(i7[0] == 0);\n\n        // default\n        multi_span_index<3> i9 = {};\n        EXPECT_TRUE(i9[0] == 0);\n    }\n\n    {\n        // components of the same type\n        multi_span_index<1> i1(0);\n        EXPECT_TRUE(i1[0] == 0);\n\n        // components of different types\n        std::size_t c0 = 0;\n        multi_span_index<1> i2(c0);\n        EXPECT_TRUE(i2[0] == 0);\n\n        // from array\n        multi_span_index<1> i3 = {0};\n        EXPECT_TRUE(i3[0] == 0);\n\n        // from int\n        multi_span_index<1> i4 = 0;\n        EXPECT_TRUE(i4[0] == 0);\n\n        // from other index of the same size type\n        multi_span_index<1> i5 = i3;\n        EXPECT_TRUE(i5[0] == 0);\n\n        // default\n        multi_span_index<1> i8;\n        EXPECT_TRUE(i8[0] == 0);\n\n        // default\n        multi_span_index<1> i9 = {};\n        EXPECT_TRUE(i9[0] == 0);\n    }\n\n#ifdef CONFIRM_COMPILATION_ERRORS\n    {\n        multi_span_index<3> i1(0, 1);\n        multi_span_index<3> i2(0, 1, 2, 3);\n        multi_span_index<3> i3 = {0};\n        multi_span_index<3> i4 = {0, 1, 2, 3};\n        multi_span_index<1> i5 = {0, 1};\n    }\n#endif\n}\n\nTEST(multi_span_test, index_operations)\n{\n    ptrdiff_t a[3] = {0, 1, 2};\n    ptrdiff_t b[3] = {3, 4, 5};\n    multi_span_index<3> i = a;\n    multi_span_index<3> j = b;\n\n    EXPECT_TRUE(i[0] == 0);\n    EXPECT_TRUE(i[1] == 1);\n    EXPECT_TRUE(i[2] == 2);\n\n    {\n        multi_span_index<3> k = i + j;\n\n        EXPECT_TRUE(i[0] == 0);\n        EXPECT_TRUE(i[1] == 1);\n        EXPECT_TRUE(i[2] == 2);\n        EXPECT_TRUE(k[0] == 3);\n        EXPECT_TRUE(k[1] == 5);\n        EXPECT_TRUE(k[2] == 7);\n    }\n\n    {\n        multi_span_index<3> k = i * 3;\n\n        EXPECT_TRUE(i[0] == 0);\n        EXPECT_TRUE(i[1] == 1);\n        EXPECT_TRUE(i[2] == 2);\n        EXPECT_TRUE(k[0] == 0);\n        EXPECT_TRUE(k[1] == 3);\n        EXPECT_TRUE(k[2] == 6);\n    }\n\n    {\n        multi_span_index<3> k = 3 * i;\n\n        EXPECT_TRUE(i[0] == 0);\n        EXPECT_TRUE(i[1] == 1);\n        EXPECT_TRUE(i[2] == 2);\n        EXPECT_TRUE(k[0] == 0);\n        EXPECT_TRUE(k[1] == 3);\n        EXPECT_TRUE(k[2] == 6);\n    }\n\n    {\n        multi_span_index<2> k = details::shift_left(i);\n\n        EXPECT_TRUE(i[0] == 0);\n        EXPECT_TRUE(i[1] == 1);\n        EXPECT_TRUE(i[2] == 2);\n        EXPECT_TRUE(k[0] == 1);\n        EXPECT_TRUE(k[1] == 2);\n    }\n}\n\nTEST(multi_span_test, span_section_iteration)\n{\n    int arr[4][2] = {{4, 0}, {5, 1}, {6, 2}, {7, 3}};\n\n    // static bounds\n    {\n        multi_span<int, 4, 2> av = arr;\n        iterate_second_column(av);\n    }\n    // first bound is dynamic\n    {\n        multi_span<int, dynamic_range, 2> av = arr;\n        iterate_second_column(av);\n    }\n    // second bound is dynamic\n    {\n        multi_span<int, 4, dynamic_range> av = arr;\n        iterate_second_column(av);\n    }\n    // both bounds are dynamic\n    {\n        multi_span<int, dynamic_range, dynamic_range> av = arr;\n        iterate_second_column(av);\n    }\n}\n\nTEST(multi_span_test, dynamic_span_section_iteration)\n{\n    auto height = 4, width = 2;\n    auto size = height * width;\n\n    auto arr = new int[narrow_cast<std::size_t>(size)];\n    for (auto i = 0; i < size; ++i) { arr[i] = i; }\n\n    auto av = as_multi_span(arr, size);\n\n    // first bound is dynamic\n    {\n        multi_span<int, dynamic_range, 2> av2 = as_multi_span(av, dim(height), dim(width));\n        iterate_second_column(av2);\n    }\n    // second bound is dynamic\n    {\n        multi_span<int, 4, dynamic_range> av2 = as_multi_span(av, dim(height), dim(width));\n        iterate_second_column(av2);\n    }\n    // both bounds are dynamic\n    {\n        multi_span<int, dynamic_range, dynamic_range> av2 =\n            as_multi_span(av, dim(height), dim(width));\n        iterate_second_column(av2);\n    }\n\n    delete[] arr;\n}\n\nTEST(multi_span_test, span_structure_size)\n{\n    double(*arr)[3][4] = new double[100][3][4];\n    multi_span<double, dynamic_range, 3, 4> av1(arr, 10);\n\n    struct EffectiveStructure\n    {\n        double* v1;\n        ptrdiff_t v2;\n    };\n    EXPECT_TRUE(sizeof(av1) == sizeof(EffectiveStructure));\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. span_structure_size\";\n        std::abort();\n    });\n\n    EXPECT_DEATH(av1[10][3][4], deathstring);\n\n    multi_span<const double, dynamic_range, 6, 4> av2 =\n        as_multi_span(av1, dim(5), dim<6>(), dim<4>());\n    (void) av2;\n\n    delete[] arr;\n}\n\nTEST(multi_span_test, fixed_size_conversions)\n{\n    int arr[] = {1, 2, 3, 4};\n\n    // converting to an multi_span from an equal size array is ok\n    multi_span<int, 4> av4 = arr;\n    EXPECT_TRUE(av4.length() == 4);\n\n    // converting to dynamic_range a_v is always ok\n    {\n        multi_span<int, dynamic_range> av = av4;\n        (void) av;\n    }\n    {\n        multi_span<int, dynamic_range> av = arr;\n        (void) av;\n    }\n\n// initialization or assignment to static multi_span that REDUCES size is NOT ok\n#ifdef CONFIRM_COMPILATION_ERRORS\n    {\n        multi_span<int, 2> av2 = arr;\n    }\n    {\n        multi_span<int, 2> av2 = av4;\n    }\n#endif\n\n    {\n        multi_span<int, dynamic_range> av = arr;\n        multi_span<int, 2> av2 = av;\n        (void) av2;\n    }\n\n#ifdef CONFIRM_COMPILATION_ERRORS\n    {\n        multi_span<int, dynamic_range> av = arr;\n        multi_span<int, 2, 1> av2 = av.as_multi_span(dim<2>(), dim<2>());\n    }\n#endif\n\n    {\n        multi_span<int, dynamic_range> av = arr;\n        multi_span<int, 2, 1> av2 = as_multi_span(av, dim(2), dim(2));\n        auto workaround_macro = [&]() { return av2[{1, 0}] == 2; };\n        EXPECT_TRUE(workaround_macro());\n    }\n\n    // but doing so explicitly is ok\n\n    // you can convert statically\n    {\n        multi_span<int, 2> av2 = {arr, 2};\n        (void) av2;\n    }\n    {\n        multi_span<int, 1> av2 = av4.first<1>();\n        (void) av2;\n    }\n\n    // ...or dynamically\n    {\n        // NB: implicit conversion to multi_span<int,2> from multi_span<int,dynamic_range>\n        multi_span<int, 1> av2 = av4.first(1);\n        (void) av2;\n    }\n\n    // initialization or assignment to static multi_span that requires size INCREASE is not ok.\n    int arr2[2] = {1, 2};\n\n#ifdef CONFIRM_COMPILATION_ERRORS\n    {\n        multi_span<int, 4> av4 = arr2;\n    }\n    {\n        multi_span<int, 2> av2 = arr2;\n        multi_span<int, 4> av4 = av2;\n    }\n#endif\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. fixed_size_conversions\";\n        std::abort();\n    });\n\n    {\n        auto f = [&]() {\n            const multi_span<int, 4> av9 = {arr2, 2};\n            (void) av9;\n        };\n        EXPECT_DEATH(f(), deathstring);\n    }\n\n    // this should fail - we are trying to assign a small dynamic a_v to a fixed_size larger one\n    multi_span<int, dynamic_range> av = arr2;\n    auto f = [&]() {\n        const multi_span<int, 4> av2 = av;\n        (void) av2;\n    };\n    EXPECT_DEATH(f(), deathstring);\n}\n\nTEST(multi_span_test, as_writeable_bytes)\n{\n    int a[] = {1, 2, 3, 4};\n\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        // you should not be able to get writeable bytes for const objects\n        multi_span<const int, dynamic_range> av = a;\n        auto wav = av.as_writeable_bytes();\n#endif\n    }\n\n    {\n        multi_span<int, dynamic_range> av;\n        auto wav = as_writeable_bytes(av);\n        EXPECT_TRUE(wav.length() == av.length());\n        EXPECT_TRUE(wav.length() == 0);\n        EXPECT_TRUE(wav.size_bytes() == 0);\n    }\n\n    {\n        multi_span<int, dynamic_range> av = a;\n        auto wav = as_writeable_bytes(av);\n        EXPECT_TRUE(wav.data() == reinterpret_cast<byte*>(&a[0]));\n        EXPECT_TRUE(static_cast<std::size_t>(wav.length()) == sizeof(a));\n    }\n}\n\nTEST(multi_span_test, iterator)\n{\n    int a[] = {1, 2, 3, 4};\n\n    {\n        multi_span<int, dynamic_range> av = a;\n        auto wav = as_writeable_bytes(av);\n        for (auto& b : wav) {\n#if defined(__cplusplus) && (__cplusplus >= 201703L)\n            b = byte{0};\n#else\n            GSL_SUPPRESS(es.49)\n            b = byte(0);\n#endif\n        }\n\n        for (std::size_t i = 0; i < 4; ++i) {\n            EXPECT_TRUE(a[i] == 0);\n        }\n    }\n\n    {\n        multi_span<int, dynamic_range> av = a;\n        for (auto& n : av) {\n            n = 1;\n        }\n        for (std::size_t i = 0; i < 4; ++i) {\n            EXPECT_TRUE(a[i] == 1);\n        }\n    }\n}\n\n#ifdef CONFIRM_COMPILATION_ERRORS\ncopy(src_span_static, dst_span_static);\n#endif\n"
  },
  {
    "path": "examples/libraries/GSL/tests/no_exception_ensure_tests.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\r\n//\r\n// This code is licensed under the MIT License (MIT).\r\n//\r\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n// THE SOFTWARE.\r\n//\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\n#include <cstdlib>  // for std::exit\r\n#include <gsl/span> // for span\r\n\r\nint operator_subscript_no_throw() noexcept\r\n{\r\n    int arr[10];\r\n    const gsl::span<int> sp{arr};\r\n    return sp[11];\r\n}\r\n\r\n[[noreturn]] void test_terminate() { std::exit(0); }\r\n\r\nvoid setup_termination_handler() noexcept\r\n{\r\n#if defined(GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND)\r\n\r\n    auto& handler = gsl::details::get_terminate_handler();\r\n    handler = &test_terminate;\r\n\r\n#else\r\n\r\n    std::set_terminate(test_terminate);\r\n\r\n#endif\r\n}\r\n\r\nint main() noexcept\r\n{\r\n    setup_termination_handler();\r\n    operator_subscript_no_throw();\r\n    return -1;\r\n}\r\n"
  },
  {
    "path": "examples/libraries/GSL/tests/notnull_tests.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#include <gtest/gtest.h>\n\n#include <gsl/pointers> // for not_null, operator<, operator<=, operator>\n\n#include <algorithm> // for addressof\n#include <memory>    // for shared_ptr, make_shared, operator<, opera...\n#include <sstream>   // for operator<<, ostringstream, basic_ostream:...\n#include <stdint.h>  // for uint16_t\n#include <string>    // for basic_string, operator==, string, operator<<\n#include <typeinfo>  // for type_info\n\nusing namespace gsl;\n\nnamespace\n{\nstatic constexpr char deathstring[] = \"Expected Death\";\n} //namespace\n\nstruct MyBase\n{\n};\nstruct MyDerived : public MyBase\n{\n};\nstruct Unrelated\n{\n};\n\n// stand-in for a user-defined ref-counted class\ntemplate <typename T>\nstruct RefCounted\n{\n    RefCounted(T* p) : p_(p) {}\n    operator T*() { return p_; }\n    T* p_;\n};\n\n// user defined smart pointer with comparison operators returning non bool value\ntemplate <typename T>\nstruct CustomPtr\n{\n    CustomPtr(T* p) : p_(p) {}\n    operator T*() { return p_; }\n    bool operator!=(std::nullptr_t) const { return p_ != nullptr; }\n    T* p_ = nullptr;\n};\n\ntemplate <typename T, typename U>\nstd::string operator==(CustomPtr<T> const& lhs, CustomPtr<U> const& rhs)\n{\n    GSL_SUPPRESS(type.1) // NO-FORMAT: attribute\n    return reinterpret_cast<const void*>(lhs.p_) == reinterpret_cast<const void*>(rhs.p_) ? \"true\"\n                                                                                          : \"false\";\n}\n\ntemplate <typename T, typename U>\nstd::string operator!=(CustomPtr<T> const& lhs, CustomPtr<U> const& rhs)\n{\n    GSL_SUPPRESS(type.1) // NO-FORMAT: attribute\n    return reinterpret_cast<const void*>(lhs.p_) != reinterpret_cast<const void*>(rhs.p_) ? \"true\"\n                                                                                          : \"false\";\n}\n\ntemplate <typename T, typename U>\nstd::string operator<(CustomPtr<T> const& lhs, CustomPtr<U> const& rhs)\n{\n    GSL_SUPPRESS(type.1) // NO-FORMAT: attribute\n    return reinterpret_cast<const void*>(lhs.p_) < reinterpret_cast<const void*>(rhs.p_) ? \"true\"\n                                                                                         : \"false\";\n}\n\ntemplate <typename T, typename U>\nstd::string operator>(CustomPtr<T> const& lhs, CustomPtr<U> const& rhs)\n{\n    GSL_SUPPRESS(type.1) // NO-FORMAT: attribute\n    return reinterpret_cast<const void*>(lhs.p_) > reinterpret_cast<const void*>(rhs.p_) ? \"true\"\n                                                                                         : \"false\";\n}\n\ntemplate <typename T, typename U>\nstd::string operator<=(CustomPtr<T> const& lhs, CustomPtr<U> const& rhs)\n{\n    GSL_SUPPRESS(type.1) // NO-FORMAT: attribute\n    return reinterpret_cast<const void*>(lhs.p_) <= reinterpret_cast<const void*>(rhs.p_) ? \"true\"\n                                                                                          : \"false\";\n}\n\ntemplate <typename T, typename U>\nstd::string operator>=(CustomPtr<T> const& lhs, CustomPtr<U> const& rhs)\n{\n    GSL_SUPPRESS(type.1) // NO-FORMAT: attribute\n    return reinterpret_cast<const void*>(lhs.p_) >= reinterpret_cast<const void*>(rhs.p_) ? \"true\"\n                                                                                          : \"false\";\n}\n\nstruct NonCopyableNonMovable\n{\n    NonCopyableNonMovable() = default;\n    NonCopyableNonMovable(const NonCopyableNonMovable&) = delete;\n    NonCopyableNonMovable& operator=(const NonCopyableNonMovable&) = delete;\n    NonCopyableNonMovable(NonCopyableNonMovable&&) = delete;\n    NonCopyableNonMovable& operator=(NonCopyableNonMovable&&) = delete;\n};\n\nGSL_SUPPRESS(f.4) // NO-FORMAT: attribute\nbool helper(not_null<int*> p) { return *p == 12; }\nGSL_SUPPRESS(f.4) // NO-FORMAT: attribute\nbool helper_const(not_null<const int*> p) { return *p == 12; }\n\nint* return_pointer() { return nullptr; }\n\nTEST(notnull_tests, TestNotNullConstructors)\n{\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        not_null<int*> p = nullptr;          // yay...does not compile!\n        not_null<std::vector<char>*> p1 = 0; // yay...does not compile!\n        not_null<int*> p2;                   // yay...does not compile!\n        std::unique_ptr<int> up = std::make_unique<int>(120);\n        not_null<int*> p3 = up;\n\n        // Forbid non-nullptr assignable types\n        not_null<std::vector<int>> f(std::vector<int>{1});\n        not_null<int> z(10);\n        not_null<std::vector<int>> y({1, 2});\n#endif\n    }\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. TestNotNullConstructors\";\n        std::abort();\n    });\n    {\n        // from shared pointer\n        int i = 12;\n        auto rp = RefCounted<int>(&i);\n        not_null<int*> p(rp);\n        EXPECT_TRUE(p.get() == &i);\n\n        not_null<std::shared_ptr<int>> x(\n            std::make_shared<int>(10)); // shared_ptr<int> is nullptr assignable\n\n        int* pi = nullptr;\n        EXPECT_DEATH((not_null<decltype(pi)>(pi)), deathstring);\n    }\n\n    {\n        // from pointer to local\n        int t = 42;\n\n        not_null<int*> x = &t;\n        helper(&t);\n        helper_const(&t);\n\n        EXPECT_TRUE(*x == 42);\n    }\n\n    {\n        // from raw pointer\n        // from not_null pointer\n\n        int t = 42;\n        int* p = &t;\n\n        not_null<int*> x = p;\n        helper(p);\n        helper_const(p);\n        helper(x);\n        helper_const(x);\n\n        EXPECT_TRUE(*x == 42);\n    }\n\n    {\n        // from raw const pointer\n        // from not_null const pointer\n\n        int t = 42;\n        const int* cp = &t;\n\n        not_null<const int*> x = cp;\n        helper_const(cp);\n        helper_const(x);\n\n        EXPECT_TRUE(*x == 42);\n    }\n\n    {\n        // from not_null const pointer, using auto\n        int t = 42;\n        const int* cp = &t;\n\n        auto x = not_null<const int*>{cp};\n\n        EXPECT_TRUE(*x == 42);\n    }\n\n    {\n        // from returned pointer\n\n        EXPECT_DEATH(helper(return_pointer()), deathstring);\n        EXPECT_DEATH(helper_const(return_pointer()), deathstring);\n    }\n}\n\ntemplate <typename T>\nvoid ostream_helper(T v)\n{\n    not_null<T*> p(&v);\n    {\n        std::ostringstream os;\n        std::ostringstream ref;\n        os << static_cast<void*>(p);\n        ref << static_cast<void*>(&v);\n        EXPECT_TRUE(os.str() == ref.str());\n    }\n    {\n        std::ostringstream os;\n        std::ostringstream ref;\n        os << *p;\n        ref << v;\n        EXPECT_TRUE(os.str() == ref.str());\n    }\n}\n\nTEST(notnull_tests, TestNotNullostream)\n{\n    ostream_helper<int>(17);\n    ostream_helper<float>(21.5f);\n    ostream_helper<double>(3.4566e-7);\n    ostream_helper<char>('c');\n    ostream_helper<uint16_t>(0x0123u);\n    ostream_helper<const char*>(\"cstring\");\n    ostream_helper<std::string>(\"string\");\n}\n\nTEST(notnull_tests, TestNotNullCasting)\n{\n    MyBase base;\n    MyDerived derived;\n    Unrelated unrelated;\n    not_null<Unrelated*> u{&unrelated};\n    (void) u;\n    not_null<MyDerived*> p{&derived};\n    not_null<MyBase*> q(&base);\n    q = p; // allowed with heterogeneous copy ctor\n    EXPECT_TRUE(q == p);\n\n#ifdef CONFIRM_COMPILATION_ERRORS\n    q = u; // no viable conversion possible between MyBase* and Unrelated*\n    p = q; // not possible to implicitly convert MyBase* to MyDerived*\n\n    not_null<Unrelated*> r = p;\n    not_null<Unrelated*> s = reinterpret_cast<Unrelated*>(p);\n#endif\n    not_null<Unrelated*> t(reinterpret_cast<Unrelated*>(p.get()));\n    EXPECT_TRUE(reinterpret_cast<void*>(p.get()) == reinterpret_cast<void*>(t.get()));\n}\n\nTEST(notnull_tests, TestNotNullAssignment)\n{\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. TestNotNullAssignmentd\";\n        std::abort();\n    });\n\n    int i = 12;\n    not_null<int*> p(&i);\n    EXPECT_TRUE(helper(p));\n\n    int* q = nullptr;\n    EXPECT_DEATH(p = not_null<int*>(q), deathstring);\n}\n\nTEST(notnull_tests, TestNotNullRawPointerComparison)\n{\n    int ints[2] = {42, 43};\n    int* p1 = &ints[0];\n    const int* p2 = &ints[1];\n\n    using NotNull1 = not_null<decltype(p1)>;\n    using NotNull2 = not_null<decltype(p2)>;\n\n    EXPECT_TRUE((NotNull1(p1) == NotNull1(p1)) == true);\n    EXPECT_TRUE((NotNull1(p1) == NotNull2(p2)) == false);\n\n    EXPECT_TRUE((NotNull1(p1) != NotNull1(p1)) == false);\n    EXPECT_TRUE((NotNull1(p1) != NotNull2(p2)) == true);\n\n    EXPECT_TRUE((NotNull1(p1) < NotNull1(p1)) == false);\n    EXPECT_TRUE((NotNull1(p1) < NotNull2(p2)) == (p1 < p2));\n    EXPECT_TRUE((NotNull2(p2) < NotNull1(p1)) == (p2 < p1));\n\n    EXPECT_TRUE((NotNull1(p1) > NotNull1(p1)) == false);\n    EXPECT_TRUE((NotNull1(p1) > NotNull2(p2)) == (p1 > p2));\n    EXPECT_TRUE((NotNull2(p2) > NotNull1(p1)) == (p2 > p1));\n\n    EXPECT_TRUE((NotNull1(p1) <= NotNull1(p1)) == true);\n    EXPECT_TRUE((NotNull1(p1) <= NotNull2(p2)) == (p1 <= p2));\n    EXPECT_TRUE((NotNull2(p2) <= NotNull1(p1)) == (p2 <= p1));\n}\n\nTEST(notnull_tests, TestNotNullDereferenceOperator)\n{\n    {\n        auto sp1 = std::make_shared<NonCopyableNonMovable>();\n\n        using NotNullSp1 = not_null<decltype(sp1)>;\n        EXPECT_TRUE(typeid(*sp1) == typeid(*NotNullSp1(sp1)));\n        EXPECT_TRUE(std::addressof(*NotNullSp1(sp1)) == std::addressof(*sp1));\n    }\n\n    {\n        int ints[1] = {42};\n        CustomPtr<int> p1(&ints[0]);\n\n        using NotNull1 = not_null<decltype(p1)>;\n        EXPECT_TRUE(typeid(*NotNull1(p1)) == typeid(*p1));\n        EXPECT_TRUE(*NotNull1(p1) == 42);\n        *NotNull1(p1) = 43;\n        EXPECT_TRUE(ints[0] == 43);\n    }\n\n    {\n        int v = 42;\n        gsl::not_null<int*> p(&v);\n        EXPECT_TRUE(typeid(*p) == typeid(*(&v)));\n        *p = 43;\n        EXPECT_TRUE(v == 43);\n    }\n}\n\nTEST(notnull_tests, TestNotNullSharedPtrComparison)\n{\n    auto sp1 = std::make_shared<int>(42);\n    auto sp2 = std::make_shared<const int>(43);\n\n    using NotNullSp1 = not_null<decltype(sp1)>;\n    using NotNullSp2 = not_null<decltype(sp2)>;\n\n    EXPECT_TRUE((NotNullSp1(sp1) == NotNullSp1(sp1)) == true);\n    EXPECT_TRUE((NotNullSp1(sp1) == NotNullSp2(sp2)) == false);\n\n    EXPECT_TRUE((NotNullSp1(sp1) != NotNullSp1(sp1)) == false);\n    EXPECT_TRUE((NotNullSp1(sp1) != NotNullSp2(sp2)) == true);\n\n    EXPECT_TRUE((NotNullSp1(sp1) < NotNullSp1(sp1)) == false);\n    EXPECT_TRUE((NotNullSp1(sp1) < NotNullSp2(sp2)) == (sp1 < sp2));\n    EXPECT_TRUE((NotNullSp2(sp2) < NotNullSp1(sp1)) == (sp2 < sp1));\n\n    EXPECT_TRUE((NotNullSp1(sp1) > NotNullSp1(sp1)) == false);\n    EXPECT_TRUE((NotNullSp1(sp1) > NotNullSp2(sp2)) == (sp1 > sp2));\n    EXPECT_TRUE((NotNullSp2(sp2) > NotNullSp1(sp1)) == (sp2 > sp1));\n\n    EXPECT_TRUE((NotNullSp1(sp1) <= NotNullSp1(sp1)) == true);\n    EXPECT_TRUE((NotNullSp1(sp1) <= NotNullSp2(sp2)) == (sp1 <= sp2));\n    EXPECT_TRUE((NotNullSp2(sp2) <= NotNullSp1(sp1)) == (sp2 <= sp1));\n\n    EXPECT_TRUE((NotNullSp1(sp1) >= NotNullSp1(sp1)) == true);\n    EXPECT_TRUE((NotNullSp1(sp1) >= NotNullSp2(sp2)) == (sp1 >= sp2));\n    EXPECT_TRUE((NotNullSp2(sp2) >= NotNullSp1(sp1)) == (sp2 >= sp1));\n}\n\nTEST(notnull_tests, TestNotNullCustomPtrComparison)\n{\n    int ints[2] = {42, 43};\n    CustomPtr<int> p1(&ints[0]);\n    CustomPtr<const int> p2(&ints[1]);\n\n    using NotNull1 = not_null<decltype(p1)>;\n    using NotNull2 = not_null<decltype(p2)>;\n\n    EXPECT_TRUE((NotNull1(p1) == NotNull1(p1)) == \"true\");\n    EXPECT_TRUE((NotNull1(p1) == NotNull2(p2)) == \"false\");\n\n    EXPECT_TRUE((NotNull1(p1) != NotNull1(p1)) == \"false\");\n    EXPECT_TRUE((NotNull1(p1) != NotNull2(p2)) == \"true\");\n\n    EXPECT_TRUE((NotNull1(p1) < NotNull1(p1)) == \"false\");\n    EXPECT_TRUE((NotNull1(p1) < NotNull2(p2)) == (p1 < p2));\n    EXPECT_TRUE((NotNull2(p2) < NotNull1(p1)) == (p2 < p1));\n\n    EXPECT_TRUE((NotNull1(p1) > NotNull1(p1)) == \"false\");\n    EXPECT_TRUE((NotNull1(p1) > NotNull2(p2)) == (p1 > p2));\n    EXPECT_TRUE((NotNull2(p2) > NotNull1(p1)) == (p2 > p1));\n\n    EXPECT_TRUE((NotNull1(p1) <= NotNull1(p1)) == \"true\");\n    EXPECT_TRUE((NotNull1(p1) <= NotNull2(p2)) == (p1 <= p2));\n    EXPECT_TRUE((NotNull2(p2) <= NotNull1(p1)) == (p2 <= p1));\n\n    EXPECT_TRUE((NotNull1(p1) >= NotNull1(p1)) == \"true\");\n    EXPECT_TRUE((NotNull1(p1) >= NotNull2(p2)) == (p1 >= p2));\n    EXPECT_TRUE((NotNull2(p2) >= NotNull1(p1)) == (p2 >= p1));\n}\n\n#if defined(__cplusplus) && (__cplusplus >= 201703L)\n\nTEST(notnull_tests, TestNotNullConstructorTypeDeduction)\n{\n    {\n        int i = 42;\n\n        not_null x{&i};\n        helper(not_null{&i});\n        helper_const(not_null{&i});\n\n        EXPECT_TRUE(*x == 42);\n    }\n\n    {\n        int i = 42;\n        int* p = &i;\n\n        not_null x{p};\n        helper(not_null{p});\n        helper_const(not_null{p});\n\n        EXPECT_TRUE(*x == 42);\n    }\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. TestNotNullConstructorTypeDeduction\";\n        std::abort();\n    });\n\n    {\n        auto workaround_macro = []() {\n            int* p1 = nullptr;\n            const not_null x{p1};\n        };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n    }\n\n    {\n        auto workaround_macro = []() {\n            const int* p1 = nullptr;\n            const not_null x{p1};\n        };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n    }\n\n    {\n        int* p = nullptr;\n\n        EXPECT_DEATH(helper(not_null{p}), deathstring);\n        EXPECT_DEATH(helper_const(not_null{p}), deathstring);\n    }\n\n#ifdef CONFIRM_COMPILATION_ERRORS\n    {\n        not_null x{nullptr};\n        helper(not_null{nullptr});\n        helper_const(not_null{nullptr});\n    }\n#endif\n}\n#endif // #if defined(__cplusplus) && (__cplusplus >= 201703L)\n\nTEST(notnull_tests, TestMakeNotNull)\n{\n    {\n        int i = 42;\n\n        const auto x = make_not_null(&i);\n        helper(make_not_null(&i));\n        helper_const(make_not_null(&i));\n\n        EXPECT_TRUE(*x == 42);\n    }\n\n    {\n        int i = 42;\n        int* p = &i;\n\n        const auto x = make_not_null(p);\n        helper(make_not_null(p));\n        helper_const(make_not_null(p));\n\n        EXPECT_TRUE(*x == 42);\n    }\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. TestMakeNotNull\";\n        std::abort();\n    });\n\n    {\n        const auto workaround_macro = []() {\n            int* p1 = nullptr;\n            const auto x = make_not_null(p1);\n            EXPECT_TRUE(*x == 42);\n        };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n    }\n\n    {\n        const auto workaround_macro = []() {\n            const int* p1 = nullptr;\n            const auto x = make_not_null(p1);\n            EXPECT_TRUE(*x == 42);\n        };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n    }\n\n    {\n        int* p = nullptr;\n\n        EXPECT_DEATH(helper(make_not_null(p)), deathstring);\n        EXPECT_DEATH(helper_const(make_not_null(p)), deathstring);\n    }\n\n#ifdef CONFIRM_COMPILATION_ERRORS\n    {\n        EXPECT_DEATH(make_not_null(nullptr), deathstring);\n        EXPECT_DEATH(helper(make_not_null(nullptr)), deathstring);\n        EXPECT_DEATH(helper_const(make_not_null(nullptr)), deathstring);\n    }\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/GSL/tests/owner_tests.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#include <gtest/gtest.h>\n\n#include <gsl/pointers> // for owner\n\nusing namespace gsl;\n\nGSL_SUPPRESS(f.23) // NO-FORMAT: attribute\nvoid f(int* i) { *i += 1; }\n\nTEST(owner_tests, basic_test)\n{\n    owner<int*> p = new int(120);\n    EXPECT_TRUE(*p == 120);\n    f(p);\n    EXPECT_TRUE(*p == 121);\n    delete p;\n}\n\nTEST(owner_tests, check_pointer_constraint)\n{\n    #ifdef CONFIRM_COMPILATION_ERRORS\n    {\n        owner<int> integerTest = 10;\n        owner<std::shared_ptr<int>> sharedPtrTest(new int(10));\n    }\n    #endif\n}\n"
  },
  {
    "path": "examples/libraries/GSL/tests/span_compatibility_tests.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#include <gtest/gtest.h>\n\n#include <gsl/gsl_byte> // for byte\n#include <gsl/span>     // for span, span_iterator, operator==, operator!=\n\n#include <array>       // for array\n#include <cstddef>     // for ptrdiff_t\n#include <iterator>    // for reverse_iterator, operator-, operator==\n#include <type_traits> // for integral_constant<>::value, is_default_co...\n#include <utility>\n#include <vector> // for vector\n\nusing namespace std;\nusing namespace gsl;\n\n// Below are tests that verify the gsl interface support the same things as the std\n// Ranges and Concepts support need to be added later.\n\nstruct Base\n{\n};\nstruct Derived : Base\n{\n};\nstatic_assert(std::is_convertible<Derived*, Base*>::value, \"std::is_convertible<Derived*, Base*>\");\nstatic_assert(!std::is_convertible<Derived (*)[], Base (*)[]>::value,\n              \"!std::is_convertible<Derived(*)[], Base(*)[]>\");\n\n// int*(*) [], int const* const(*)[] was identified as an issue in CWG330 and the resolution was\n// provided with N4261.\ntemplate <class T = int>\nvoid ArrayConvertibilityCheck()\n{\n#if __cplusplus >= 201703l\n    if constexpr (std::is_convertible<T*(*) [], T const* const(*)[]>::value)\n    {\n        std::array<T*, 3> stl_nullptr{{nullptr, nullptr, nullptr}};\n        gsl::span<const T* const> sp_const_nullptr_1{stl_nullptr};\n        EXPECT_TRUE(sp_const_nullptr_1.data() == stl_nullptr.data());\n        EXPECT_TRUE(sp_const_nullptr_1.size() == 3);\n\n        span<const T* const> sp_const_nullptr_2{std::as_const(stl_nullptr)};\n        EXPECT_TRUE(sp_const_nullptr_2.data() == stl_nullptr.data());\n        EXPECT_TRUE(sp_const_nullptr_2.size() == 3);\n\n        static_assert(std::is_same<decltype(span{stl_nullptr}), span<T*, 3>>::value,\n                      \"std::is_same< decltype(span{stl_nullptr}), span<T*, 3>>::value\");\n        static_assert(\n            std::is_same<decltype(span{std::as_const(stl_nullptr)}), span<T* const, 3>>::value,\n            \"std::is_same< decltype(span{std::as_const(stl_nullptr)}), span<T* const, \"\n            \"3>>::value\");\n    }\n#endif\n}\n\nTEST(span_compatibility_tests, assertion_tests)\n{\n    int arr[3]{10, 20, 30};\n    std::array<int, 3> stl{{100, 200, 300}};\n\n    ArrayConvertibilityCheck();\n\n    {\n        gsl::span<int> sp_dyn;\n        EXPECT_TRUE(sp_dyn.data() == nullptr);\n        EXPECT_TRUE(sp_dyn.size() == 0);\n        EXPECT_TRUE(sp_dyn.empty());\n    }\n    {\n        gsl::span<int, 0> sp_zero;\n        EXPECT_TRUE(sp_zero.data() == nullptr);\n        EXPECT_TRUE(sp_zero.size() == 0);\n        EXPECT_TRUE(sp_zero.empty());\n\n        gsl::span<int> sp_dyn_a(arr, 3);\n        gsl::span<int> sp_dyn_b(begin(arr), 3);\n        EXPECT_TRUE(sp_dyn_a.data() == std::begin(arr));\n        EXPECT_TRUE(sp_dyn_b.data() == std::begin(arr));\n        EXPECT_TRUE(sp_dyn_a.size() == 3);\n        EXPECT_TRUE(sp_dyn_b.size() == 3);\n\n        gsl::span<int, 3> sp_three_a(arr, 3);\n        gsl::span<int, 3> sp_three_b(begin(arr), 3);\n        EXPECT_TRUE(sp_three_a.data() == std::begin(arr));\n        EXPECT_TRUE(sp_three_b.data() == std::begin(arr));\n        EXPECT_TRUE(sp_three_a.size() == 3);\n        EXPECT_TRUE(sp_three_b.size() == 3);\n\n        gsl::span<const int> sp_const_a(arr, 3);\n        gsl::span<const int> sp_const_b(begin(arr), 3);\n        EXPECT_TRUE(sp_const_a.data() == std::begin(arr));\n        EXPECT_TRUE(sp_const_b.data() == std::begin(arr));\n        EXPECT_TRUE(sp_const_a.size() == 3);\n        EXPECT_TRUE(sp_const_b.size() == 3);\n\n#if __cplusplus >= 201703l\n        gsl::span<const int> sp_const_c(std::as_const(arr), 3);\n        EXPECT_TRUE(sp_const_c.data() == std::begin(arr));\n        EXPECT_TRUE(sp_const_c.size() == 3);\n#endif // __cplusplus >= 201703l\n\n        gsl::span<const int> sp_const_d(cbegin(arr), 3);\n        EXPECT_TRUE(sp_const_d.data() == std::begin(arr));\n        EXPECT_TRUE(sp_const_d.size() == 3);\n    }\n    {\n        gsl::span<int> sp_dyn_a(begin(arr), std::end(arr));\n        EXPECT_TRUE(sp_dyn_a.data() == std::begin(arr));\n        EXPECT_TRUE(sp_dyn_a.size() == 3);\n\n        gsl::span<int, 3> sp_three_a(begin(arr), std::end(arr));\n        EXPECT_TRUE(sp_three_a.data() == std::begin(arr));\n        EXPECT_TRUE(sp_three_a.size() == 3);\n\n        gsl::span<const int> sp_const_a(begin(arr), std::end(arr));\n        gsl::span<const int> sp_const_b(begin(arr), std::cend(arr));\n        gsl::span<const int> sp_const_c(cbegin(arr), std::end(arr));\n        gsl::span<const int> sp_const_d(cbegin(arr), std::cend(arr));\n        EXPECT_TRUE(sp_const_a.data() == std::begin(arr));\n        EXPECT_TRUE(sp_const_b.data() == std::begin(arr));\n        EXPECT_TRUE(sp_const_c.data() == std::begin(arr));\n        EXPECT_TRUE(sp_const_d.data() == std::begin(arr));\n        EXPECT_TRUE(sp_const_a.size() == 3);\n        EXPECT_TRUE(sp_const_b.size() == 3);\n        EXPECT_TRUE(sp_const_c.size() == 3);\n        EXPECT_TRUE(sp_const_d.size() == 3);\n    }\n    {\n        gsl::span<int> sp_dyn_a(arr);\n        gsl::span<int> sp_dyn_b(stl);\n        gsl::span<int> sp_dyn_c{stl};\n        gsl::span<const int> sp_dyn_d{stl};\n        EXPECT_TRUE(sp_dyn_a.data() == std::begin(arr));\n        EXPECT_TRUE(sp_dyn_b.data() == stl.data());\n        EXPECT_TRUE(sp_dyn_a.size() == 3);\n        EXPECT_TRUE(sp_dyn_b.size() == 3);\n\n        gsl::span<int, 3> sp_three_a(arr);\n        gsl::span<int, 3> sp_three_b(stl);\n        EXPECT_TRUE(sp_three_a.data() == std::begin(arr));\n        EXPECT_TRUE(sp_three_b.data() == stl.data());\n        EXPECT_TRUE(sp_three_a.size() == 3);\n        EXPECT_TRUE(sp_three_b.size() == 3);\n\n        gsl::span<const int> sp_const_w(arr);\n        gsl::span<const int> sp_const_y(stl);\n        EXPECT_TRUE(sp_const_w.data() == std::begin(arr));\n        EXPECT_TRUE(sp_const_y.data() == stl.data());\n        EXPECT_TRUE(sp_const_w.size() == 3);\n        EXPECT_TRUE(sp_const_y.size() == 3);\n\n#if __cplusplus >= 201703l\n        gsl::span<const int> sp_const_x(std::as_const(arr));\n        EXPECT_TRUE(sp_const_x.data() == std::begin(arr));\n        EXPECT_TRUE(sp_const_x.size() == 3);\n\n        gsl::span<const int> sp_const_z(std::as_const(stl));\n        EXPECT_TRUE(sp_const_z.data() == stl.data());\n        EXPECT_TRUE(sp_const_z.size() == 3);\n#endif // __cplusplus >= 201703l\n    }\n    {\n        const gsl::span<int> orig_dyn(arr);\n        const gsl::span<int, 3> orig_three(arr);\n        const gsl::span<const int> orig_const_dyn(arr);\n        const gsl::span<const int, 3> orig_const_three(arr);\n\n        gsl::span<int> sp_a(orig_dyn);\n        gsl::span<int> sp_b(orig_three);\n\n        gsl::span<int, 3> sp_c(orig_three);\n\n        gsl::span<const int> sp_d(orig_dyn);\n        gsl::span<const int> sp_e(orig_three);\n        gsl::span<const int> sp_f(orig_const_dyn);\n        gsl::span<const int> sp_g(orig_const_three);\n\n        gsl::span<const int, 3> sp_h(orig_three);\n        gsl::span<const int, 3> sp_i(orig_const_three);\n\n        EXPECT_TRUE(sp_a.data() == std::begin(arr));\n        EXPECT_TRUE(sp_b.data() == std::begin(arr));\n        EXPECT_TRUE(sp_c.data() == std::begin(arr));\n        EXPECT_TRUE(sp_d.data() == std::begin(arr));\n        EXPECT_TRUE(sp_e.data() == std::begin(arr));\n        EXPECT_TRUE(sp_f.data() == std::begin(arr));\n        EXPECT_TRUE(sp_g.data() == std::begin(arr));\n        EXPECT_TRUE(sp_h.data() == std::begin(arr));\n        EXPECT_TRUE(sp_i.data() == std::begin(arr));\n        EXPECT_TRUE(sp_a.size() == 3);\n        EXPECT_TRUE(sp_b.size() == 3);\n        EXPECT_TRUE(sp_c.size() == 3);\n        EXPECT_TRUE(sp_d.size() == 3);\n        EXPECT_TRUE(sp_e.size() == 3);\n        EXPECT_TRUE(sp_f.size() == 3);\n        EXPECT_TRUE(sp_g.size() == 3);\n        EXPECT_TRUE(sp_h.size() == 3);\n        EXPECT_TRUE(sp_i.size() == 3);\n    }\n    {\n        gsl::span<int> sp_dyn(arr);\n        gsl::span<int, 3> sp_three(arr);\n        gsl::span<const int> sp_const_dyn(arr);\n        gsl::span<const int, 3> sp_const_three(arr);\n\n        EXPECT_TRUE(sp_dyn.data() == std::begin(arr));\n        EXPECT_TRUE(sp_three.data() == std::begin(arr));\n        EXPECT_TRUE(sp_const_dyn.data() == std::begin(arr));\n        EXPECT_TRUE(sp_const_three.data() == std::begin(arr));\n        EXPECT_TRUE(sp_dyn.size() == 3);\n        EXPECT_TRUE(sp_three.size() == 3);\n        EXPECT_TRUE(sp_const_dyn.size() == 3);\n        EXPECT_TRUE(sp_const_three.size() == 3);\n\n        int other[4]{12, 34, 56, 78};\n\n        sp_dyn = gsl::span<int>{other};\n        sp_three = gsl::span<int, 3>{stl};\n        sp_const_dyn = gsl::span<const int>{other};\n        sp_const_three = gsl::span<const int, 3>{stl};\n\n        EXPECT_TRUE(sp_dyn.data() == std::begin(other));\n        EXPECT_TRUE(sp_three.data() == stl.data());\n        EXPECT_TRUE(sp_const_dyn.data() == std::begin(other));\n        EXPECT_TRUE(sp_const_three.data() == stl.data());\n        EXPECT_TRUE(sp_dyn.size() == 4);\n        EXPECT_TRUE(sp_three.size() == 3);\n        EXPECT_TRUE(sp_const_dyn.size() == 4);\n        EXPECT_TRUE(sp_const_three.size() == 3);\n    }\n    {\n        gsl::span<int>::iterator it_dyn{};\n\n        {\n            gsl::span<int> sp_dyn(arr);\n            it_dyn = sp_dyn.begin();\n        }\n\n        EXPECT_TRUE(*it_dyn == arr[0]);\n        EXPECT_TRUE(it_dyn[2] == arr[2]);\n\n        gsl::span<int, 3>::iterator it_three{};\n\n        {\n            gsl::span<int, 3> sp_three(stl);\n            it_three = sp_three.begin();\n        }\n\n        EXPECT_TRUE(*it_three == stl[0]);\n        EXPECT_TRUE(it_three[2] == stl[2]);\n    }\n\n    {\n        int sequence[9]{10, 20, 30, 40, 50, 60, 70, 80, 90};\n\n        const gsl::span<int> sp_dyn(sequence);\n        const gsl::span<int, 9> sp_nine(sequence);\n\n        auto first_3 = sp_dyn.first<3>();\n        auto first_4 = sp_nine.first<4>();\n        auto first_5 = sp_dyn.first(5);\n        auto first_6 = sp_nine.first(6);\n        static_assert(noexcept(sp_dyn.first<3>()), \"noexcept(sp_dyn.first<3>())\");   // strengthened\n        static_assert(noexcept(sp_nine.first<4>()), \"noexcept(sp_nine.first<4>())\"); // strengthened\n        static_assert(noexcept(sp_dyn.first(5)), \"noexcept(sp_dyn.first(5))\");       // strengthened\n        static_assert(noexcept(sp_nine.first(6)), \"noexcept(sp_nine.first(6))\");     // strengthened\n        static_assert(is_same<decltype(first_3), gsl::span<int, 3>>::value,\n                      \"is_same<decltype(first_3), gsl::span<int, 3>>::value\");\n        static_assert(is_same<decltype(first_4), gsl::span<int, 4>>::value,\n                      \"is_same<decltype(first_4), gsl::span<int, 4>>::value\");\n        static_assert(is_same<decltype(first_5), gsl::span<int>>::value,\n                      \"is_same<decltype(first_5), gsl::span<int>>::value\");\n        static_assert(is_same<decltype(first_6), gsl::span<int>>::value,\n                      \"is_same<decltype(first_6), gsl::span<int>>::value\");\n        EXPECT_TRUE(first_3.data() == std::begin(sequence));\n        EXPECT_TRUE(first_4.data() == std::begin(sequence));\n        EXPECT_TRUE(first_5.data() == std::begin(sequence));\n        EXPECT_TRUE(first_6.data() == std::begin(sequence));\n        EXPECT_TRUE(first_3.size() == 3);\n        EXPECT_TRUE(first_4.size() == 4);\n        EXPECT_TRUE(first_5.size() == 5);\n        EXPECT_TRUE(first_6.size() == 6);\n\n        auto last_3 = sp_dyn.last<3>();\n        auto last_4 = sp_nine.last<4>();\n        auto last_5 = sp_dyn.last(5);\n        auto last_6 = sp_nine.last(6);\n        static_assert(noexcept(sp_dyn.last<3>()), \"noexcept(sp_dyn.last<3>())\");   // strengthened\n        static_assert(noexcept(sp_nine.last<4>()), \"noexcept(sp_nine.last<4>())\"); // strengthened\n        static_assert(noexcept(sp_dyn.last(5)), \"noexcept(sp_dyn.last(5))\");       // strengthened\n        static_assert(noexcept(sp_nine.last(6)), \"noexcept(sp_nine.last(6))\");     // strengthened\n        static_assert(is_same<decltype(last_3), gsl::span<int, 3>>::value,\n                      \"is_same<decltype(last_3), gsl::span<int, 3>>::value\");\n        static_assert(is_same<decltype(last_4), gsl::span<int, 4>>::value,\n                      \"is_same<decltype(last_4), gsl::span<int, 4>>::value\");\n        static_assert(is_same<decltype(last_5), gsl::span<int>>::value,\n                      \"is_same<decltype(last_5), gsl::span<int>>::value\");\n        static_assert(is_same<decltype(last_6), gsl::span<int>>::value,\n                      \"is_same<decltype(last_6), gsl::span<int>>::value\");\n        EXPECT_TRUE(last_3.data() == std::begin(sequence) + 6);\n        EXPECT_TRUE(last_4.data() == std::begin(sequence) + 5);\n        EXPECT_TRUE(last_5.data() == std::begin(sequence) + 4);\n        EXPECT_TRUE(last_6.data() == std::begin(sequence) + 3);\n        EXPECT_TRUE(last_3.size() == 3);\n        EXPECT_TRUE(last_4.size() == 4);\n        EXPECT_TRUE(last_5.size() == 5);\n        EXPECT_TRUE(last_6.size() == 6);\n\n        auto offset_3 = sp_dyn.subspan<3>();\n        auto offset_4 = sp_nine.subspan<4>();\n        auto offset_5 = sp_dyn.subspan(5);\n        auto offset_6 = sp_nine.subspan(6);\n        static_assert(noexcept(sp_dyn.subspan<3>()),\n                      \"noexcept(sp_dyn.subspan<3>())\"); // strengthened\n        static_assert(noexcept(sp_nine.subspan<4>()),\n                      \"noexcept(sp_nine.subspan<4>())\");                             // strengthened\n        static_assert(noexcept(sp_dyn.subspan(5)), \"noexcept(sp_dyn.subspan(5))\");   // strengthened\n        static_assert(noexcept(sp_nine.subspan(6)), \"noexcept(sp_nine.subspan(6))\"); // strengthened\n        static_assert(is_same<decltype(offset_3), gsl::span<int>>::value,\n                      \"is_same<decltype(offset_3), gsl::span<int>>::value\");\n        static_assert(is_same<decltype(offset_4), gsl::span<int, 5>>::value,\n                      \"is_same<decltype(offset_4), gsl::span<int, 5>>::value\");\n        static_assert(is_same<decltype(offset_5), gsl::span<int>>::value,\n                      \"is_same<decltype(offset_5), gsl::span<int>>::value\");\n        static_assert(is_same<decltype(offset_6), gsl::span<int>>::value,\n                      \"is_same<decltype(offset_6), gsl::span<int>>::value\");\n        EXPECT_TRUE(offset_3.data() == std::begin(sequence) + 3);\n        EXPECT_TRUE(offset_4.data() == std::begin(sequence) + 4);\n        EXPECT_TRUE(offset_5.data() == std::begin(sequence) + 5);\n        EXPECT_TRUE(offset_6.data() == std::begin(sequence) + 6);\n        EXPECT_TRUE(offset_3.size() == 6);\n        EXPECT_TRUE(offset_4.size() == 5);\n        EXPECT_TRUE(offset_5.size() == 4);\n        EXPECT_TRUE(offset_6.size() == 3);\n\n        auto subspan_3 = sp_dyn.subspan<3, 2>();\n        auto subspan_4 = sp_nine.subspan<4, 2>();\n        auto subspan_5 = sp_dyn.subspan(5, 2);\n        auto subspan_6 = sp_nine.subspan(6, 2);\n        static_assert(noexcept(sp_dyn.subspan<3, 2>()),\n                      \"noexcept(sp_dyn.subspan<3, 2>())\"); // strengthened\n        static_assert(noexcept(sp_nine.subspan<4, 2>()),\n                      \"noexcept(sp_nine.subspan<4, 2>())\"); // strengthened\n        static_assert(noexcept(sp_dyn.subspan(5, 2)),\n                      \"noexcept(sp_dyn.subspan(5, 2))\"); // strengthened\n        static_assert(noexcept(sp_nine.subspan(6, 2)),\n                      \"noexcept(sp_nine.subspan(6, 2))\"); // strengthened\n        static_assert(is_same<decltype(subspan_3), gsl::span<int, 2>>::value,\n                      \"is_same<decltype(subspan_3), gsl::span<int, 2>>::value\");\n        static_assert(is_same<decltype(subspan_4), gsl::span<int, 2>>::value,\n                      \"is_same<decltype(subspan_4), gsl::span<int, 2>>::value\");\n        static_assert(is_same<decltype(subspan_5), gsl::span<int>>::value,\n                      \"is_same<decltype(subspan_5), gsl::span<int>>::value\");\n        static_assert(is_same<decltype(subspan_6), gsl::span<int>>::value,\n                      \"is_same<decltype(subspan_6), gsl::span<int>>::value\");\n        EXPECT_TRUE(subspan_3.data() == std::begin(sequence) + 3);\n        EXPECT_TRUE(subspan_4.data() == std::begin(sequence) + 4);\n        EXPECT_TRUE(subspan_5.data() == std::begin(sequence) + 5);\n        EXPECT_TRUE(subspan_6.data() == std::begin(sequence) + 6);\n        EXPECT_TRUE(subspan_3.size() == 2);\n        EXPECT_TRUE(subspan_4.size() == 2);\n        EXPECT_TRUE(subspan_5.size() == 2);\n        EXPECT_TRUE(subspan_6.size() == 2);\n\n        static_assert(noexcept(sp_dyn.size()), \"noexcept(sp_dyn.size())\");\n        static_assert(noexcept(sp_dyn.size_bytes()), \"noexcept(sp_dyn.size_bytes())\");\n        static_assert(noexcept(sp_dyn.empty()), \"noexcept(sp_dyn.empty())\");\n        static_assert(noexcept(sp_dyn[0]), \"noexcept(sp_dyn[0])\");           // strengthened\n        static_assert(noexcept(sp_dyn.front()), \"noexcept(sp_dyn.front())\"); // strengthened\n        static_assert(noexcept(sp_dyn.back()), \"noexcept(sp_dyn.back())\");   // strengthened\n        static_assert(noexcept(sp_dyn.data()), \"noexcept(sp_dyn.data())\");\n        static_assert(noexcept(sp_dyn.begin()), \"noexcept(sp_dyn.begin())\");\n        static_assert(noexcept(sp_dyn.end()), \"noexcept(sp_dyn.end())\");\n        static_assert(noexcept(sp_dyn.rbegin()), \"noexcept(sp_dyn.rbegin())\");\n        static_assert(noexcept(sp_dyn.rend()), \"noexcept(sp_dyn.rend())\");\n\n        static_assert(noexcept(sp_nine.size()), \"noexcept(sp_nine.size())\");\n        static_assert(noexcept(sp_nine.size_bytes()), \"noexcept(sp_nine.size_bytes())\");\n        static_assert(noexcept(sp_nine.empty()), \"noexcept(sp_nine.empty())\");\n        static_assert(noexcept(sp_nine[0]), \"noexcept(sp_nine[0])\");           // strengthened\n        static_assert(noexcept(sp_nine.front()), \"noexcept(sp_nine.front())\"); // strengthened\n        static_assert(noexcept(sp_nine.back()), \"noexcept(sp_nine.back())\");   // strengthened\n        static_assert(noexcept(sp_nine.data()), \"noexcept(sp_nine.data())\");\n        static_assert(noexcept(sp_nine.begin()), \"noexcept(sp_nine.begin())\");\n        static_assert(noexcept(sp_nine.end()), \"noexcept(sp_nine.end())\");\n        static_assert(noexcept(sp_nine.rbegin()), \"noexcept(sp_nine.rbegin())\");\n        static_assert(noexcept(sp_nine.rend()), \"noexcept(sp_nine.rend())\");\n\n        EXPECT_TRUE(sp_dyn.size() == 9);\n        EXPECT_TRUE(sp_nine.size() == 9);\n\n        EXPECT_TRUE(sp_dyn.size_bytes() == 9 * sizeof(int));\n        EXPECT_TRUE(sp_nine.size_bytes() == 9 * sizeof(int));\n\n        EXPECT_TRUE(!sp_dyn.empty());\n        EXPECT_TRUE(!sp_nine.empty());\n\n        EXPECT_TRUE(sp_dyn[0] == 10);\n        EXPECT_TRUE(sp_nine[0] == 10);\n        EXPECT_TRUE(sp_dyn[8] == 90);\n        EXPECT_TRUE(sp_nine[8] == 90);\n\n        EXPECT_TRUE(sp_dyn.front() == 10);\n        EXPECT_TRUE(sp_nine.front() == 10);\n\n        EXPECT_TRUE(sp_dyn.back() == 90);\n        EXPECT_TRUE(sp_nine.back() == 90);\n\n        EXPECT_TRUE(&sp_dyn.front() == std::begin(sequence));\n        EXPECT_TRUE(&sp_nine.front() == std::begin(sequence));\n        EXPECT_TRUE(&sp_dyn[4] == std::begin(sequence) + 4);\n        EXPECT_TRUE(&sp_nine[4] == std::begin(sequence) + 4);\n        EXPECT_TRUE(&sp_dyn.back() == std::begin(sequence) + 8);\n        EXPECT_TRUE(&sp_nine.back() == std::begin(sequence) + 8);\n\n        EXPECT_TRUE(sp_dyn.data() == std::begin(sequence));\n        EXPECT_TRUE(sp_nine.data() == std::begin(sequence));\n\n        EXPECT_TRUE(*sp_dyn.begin() == 10);\n        EXPECT_TRUE(*sp_nine.begin() == 10);\n\n        EXPECT_TRUE(sp_dyn.end()[-2] == 80);\n        EXPECT_TRUE(sp_nine.end()[-2] == 80);\n\n        EXPECT_TRUE(*sp_dyn.rbegin() == 90);\n        EXPECT_TRUE(*sp_nine.rbegin() == 90);\n\n        EXPECT_TRUE(sp_dyn.rend()[-2] == 20);\n        EXPECT_TRUE(sp_nine.rend()[-2] == 20);\n\n        static_assert(is_same<decltype(sp_dyn.begin()), gsl::span<int>::iterator>::value,\n                      \"is_same<decltype(sp_dyn.begin()), gsl::span<int>::iterator>::value\");\n        static_assert(is_same<decltype(sp_nine.begin()), gsl::span<int, 9>::iterator>::value,\n                      \"is_same<decltype(sp_nine.begin()), gsl::span<int, 9>::iterator>::value\");\n        static_assert(is_same<decltype(sp_dyn.end()), gsl::span<int>::iterator>::value,\n                      \"is_same<decltype(sp_dyn.end()), gsl::span<int>::iterator>::value\");\n        static_assert(is_same<decltype(sp_nine.end()), gsl::span<int, 9>::iterator>::value,\n                      \"is_same<decltype(sp_nine.end()), gsl::span<int, 9>::iterator>::value\");\n        static_assert(\n            is_same<decltype(sp_dyn.rbegin()), gsl::span<int>::reverse_iterator>::value,\n            \"is_same<decltype(sp_dyn.rbegin()), gsl::span<int>::reverse_iterator>::value\");\n        static_assert(\n            is_same<decltype(sp_nine.rbegin()), gsl::span<int, 9>::reverse_iterator>::value,\n            \"is_same<decltype(sp_nine.rbegin()), gsl::span<int, 9>::reverse_iterator>::value\");\n        static_assert(is_same<decltype(sp_dyn.rend()), gsl::span<int>::reverse_iterator>::value,\n                      \"is_same<decltype(sp_dyn.rend()), gsl::span<int>::reverse_iterator>::value\");\n        static_assert(\n            is_same<decltype(sp_nine.rend()), gsl::span<int, 9>::reverse_iterator>::value,\n            \"is_same<decltype(sp_nine.rend()), gsl::span<int, 9>::reverse_iterator>::value\");\n    }\n    {\n        int sequence[9]{10, 20, 30, 40, 50, 60, 70, 80, 90};\n\n        constexpr size_t SizeBytes = sizeof(sequence);\n\n        const gsl::span<int> sp_dyn(sequence);\n        const gsl::span<int, 9> sp_nine(sequence);\n        const gsl::span<const int> sp_const_dyn(sequence);\n        const gsl::span<const int, 9> sp_const_nine(sequence);\n\n        static_assert(noexcept(as_bytes(sp_dyn)), \"noexcept(as_bytes(sp_dyn))\");\n        static_assert(noexcept(as_bytes(sp_nine)), \"noexcept(as_bytes(sp_nine))\");\n        static_assert(noexcept(as_bytes(sp_const_dyn)), \"noexcept(as_bytes(sp_const_dyn))\");\n        static_assert(noexcept(as_bytes(sp_const_nine)), \"noexcept(as_bytes(sp_const_nine))\");\n        static_assert(noexcept(as_writable_bytes(sp_dyn)), \"noexcept(as_writable_bytes(sp_dyn))\");\n        static_assert(noexcept(as_writable_bytes(sp_nine)), \"noexcept(as_writable_bytes(sp_nine))\");\n\n        auto sp_1 = as_bytes(sp_dyn);\n        auto sp_2 = as_bytes(sp_nine);\n        auto sp_3 = as_bytes(sp_const_dyn);\n        auto sp_4 = as_bytes(sp_const_nine);\n        auto sp_5 = as_writable_bytes(sp_dyn);\n        auto sp_6 = as_writable_bytes(sp_nine);\n\n        static_assert(is_same<decltype(sp_1), gsl::span<const byte>>::value,\n                      \"is_same<decltype(sp_1), gsl::span<const byte>>::value\");\n        static_assert(is_same<decltype(sp_2), gsl::span<const byte, SizeBytes>>::value,\n                      \"is_same<decltype(sp_2), gsl::span<const byte, SizeBytes>>::value\");\n        static_assert(is_same<decltype(sp_3), gsl::span<const byte>>::value,\n                      \"is_same<decltype(sp_3), gsl::span<const byte>>::value\");\n        static_assert(is_same<decltype(sp_4), gsl::span<const byte, SizeBytes>>::value,\n                      \"is_same<decltype(sp_4), gsl::span<const byte, SizeBytes>>::value\");\n        static_assert(is_same<decltype(sp_5), gsl::span<byte>>::value,\n                      \"is_same<decltype(sp_5), gsl::span<byte>>::value\");\n        static_assert(is_same<decltype(sp_6), gsl::span<byte, SizeBytes>>::value,\n                      \"is_same<decltype(sp_6), gsl::span<byte, SizeBytes>>::value\");\n\n        EXPECT_TRUE(sp_1.data() == reinterpret_cast<const byte*>(begin(sequence)));\n        EXPECT_TRUE(sp_2.data() == reinterpret_cast<const byte*>(begin(sequence)));\n        EXPECT_TRUE(sp_3.data() == reinterpret_cast<const byte*>(begin(sequence)));\n        EXPECT_TRUE(sp_4.data() == reinterpret_cast<const byte*>(begin(sequence)));\n        EXPECT_TRUE(sp_5.data() == reinterpret_cast<byte*>(begin(sequence)));\n        EXPECT_TRUE(sp_6.data() == reinterpret_cast<byte*>(begin(sequence)));\n\n        EXPECT_TRUE(sp_1.size() == SizeBytes);\n        EXPECT_TRUE(sp_2.size() == SizeBytes);\n        EXPECT_TRUE(sp_3.size() == SizeBytes);\n        EXPECT_TRUE(sp_4.size() == SizeBytes);\n        EXPECT_TRUE(sp_5.size() == SizeBytes);\n        EXPECT_TRUE(sp_6.size() == SizeBytes);\n    }\n}\n\n// assertions for span's definition\nstatic_assert(std::is_same<decltype(gsl::dynamic_extent), const std::size_t>::value,\n              \"gsl::dynamic_extent must be respresented as std::size_t\");\nstatic_assert(gsl::dynamic_extent == static_cast<std::size_t>(-1),\n              \"gsl::dynamic_extent must be defined as the max value of std::size_t\");\n\nstatic_assert(std::is_same<decltype(gsl::span<int>::extent), const std::size_t>::value,\n              \"Ensure that the type of  gsl::span::extent is std::size_t\");\nstatic_assert(gsl::span<int>::extent == gsl::dynamic_extent,\n              \"gsl::span<int>::extent should be equivalent to gsl::dynamic_extent\");\n\nstatic_assert(std::is_same<decltype(gsl::span<int, 3>::extent), const std::size_t>::value,\n              \"Ensure that the type of gsl::span::extent is std::size_t\");\nstatic_assert(gsl::span<int, 3>::extent == 3, \"Ensure that span<int, 3>::extent is equal to 3\");\n\nstatic_assert(std::is_same<gsl::span<int>::element_type, int>::value,\n              \"span<int>::element_type should be int\");\nstatic_assert(std::is_same<gsl::span<int>::value_type, int>::value,\n              \"span<int>::value_type should be int\");\nstatic_assert(std::is_same<gsl::span<int>::size_type, std::size_t>::value,\n              \"span<int>::size_type should be std::size_t\");\nstatic_assert(std::is_same<gsl::span<int>::difference_type, ptrdiff_t>::value,\n              \"span<int>::difference_type should be std::ptrdiff_t\");\nstatic_assert(std::is_same<gsl::span<int>::pointer, int*>::value,\n              \"span<int>::pointer should be int*\");\nstatic_assert(std::is_same<gsl::span<int>::const_pointer, const int*>::value,\n              \"span<int>::const_pointer should be const int*\");\nstatic_assert(std::is_same<gsl::span<int>::reference, int&>::value,\n              \"span<int>::reference should be int&\");\nstatic_assert(std::is_same<gsl::span<int>::const_reference, const int&>::value,\n              \"span<int>::const_reference should be const int&\");\n\nstatic_assert(std::is_same<gsl::span<int, 3>::element_type, int>::value,\n              \"span<int, 3>::element_type should be int\");\nstatic_assert(std::is_same<gsl::span<int, 3>::value_type, int>::value,\n              \"span<int, 3>::value_type should be int\");\nstatic_assert(std::is_same<gsl::span<int, 3>::size_type, std::size_t>::value,\n              \"span<int, 3>::size_type should be std::size_t\");\nstatic_assert(std::is_same<gsl::span<int, 3>::difference_type, ptrdiff_t>::value,\n              \"span<int, 3>::difference_type should be std::ptrdiff_t\");\nstatic_assert(std::is_same<gsl::span<int, 3>::pointer, int*>::value,\n              \"span<int, 3>::pointer should be int*\");\nstatic_assert(std::is_same<gsl::span<int, 3>::const_pointer, const int*>::value,\n              \"span<int, 3>::const_pointer should be const int*\");\nstatic_assert(std::is_same<gsl::span<int, 3>::reference, int&>::value,\n              \"span<int, 3>::reference should be int&\");\nstatic_assert(std::is_same<gsl::span<int, 3>::const_reference, const int&>::value,\n              \"span<int, 3>::const_reference should be const int&\");\n\nstatic_assert(std::is_same<gsl::span<const int>::element_type, const int>::value,\n              \"span<const int>::element_type should be const int\");\nstatic_assert(std::is_same<gsl::span<const int>::value_type, int>::value,\n              \"span<const int>::value_type should be int\");\nstatic_assert(std::is_same<gsl::span<const int>::size_type, std::size_t>::value,\n              \"span<const int>::size_type should be size_t\");\nstatic_assert(std::is_same<gsl::span<const int>::difference_type, ptrdiff_t>::value,\n              \"span<const int>::difference_type should be ptrdiff_t\");\nstatic_assert(std::is_same<gsl::span<const int>::pointer, const int*>::value,\n              \"span<const int>::pointer should be const int*\");\nstatic_assert(std::is_same<gsl::span<const int>::const_pointer, const int*>::value,\n              \"span<const int>::const_pointer should be const int*\");\nstatic_assert(std::is_same<gsl::span<const int>::reference, const int&>::value,\n              \"span<const int>::reference should be const int&\");\nstatic_assert(std::is_same<gsl::span<const int>::const_reference, const int&>::value,\n              \"span<const int>::const_reference should be const int&\");\n\nstatic_assert(std::is_same<gsl::span<const int, 3>::element_type, const int>::value,\n              \"span<const int, 3>::element_type should be const int\");\nstatic_assert(std::is_same<gsl::span<const int, 3>::value_type, int>::value,\n              \"span<const int, 3>::value_type should be int\");\nstatic_assert(std::is_same<gsl::span<const int, 3>::size_type, std::size_t>::value,\n              \"span<const int, 3>::size_type should be size_t\");\nstatic_assert(std::is_same<gsl::span<const int, 3>::difference_type, ptrdiff_t>::value,\n              \"span<const int, 3>::difference_type should be ptrdiff_t\");\nstatic_assert(std::is_same<gsl::span<const int, 3>::pointer, const int*>::value,\n              \"span<const int, 3>::pointer should be const int*\");\nstatic_assert(std::is_same<gsl::span<const int, 3>::const_pointer, const int*>::value,\n              \"span<const int, 3>::const_pointer should be const int*\");\nstatic_assert(std::is_same<gsl::span<const int, 3>::reference, const int&>::value,\n              \"span<const int, 3>::reference should be const int&\");\nstatic_assert(std::is_same<gsl::span<const int, 3>::const_reference, const int&>::value,\n              \"span<const int, 3>::const_reference should be const int&\");\n\n// assertions for span_iterator\nstatic_assert(std::is_same<std::iterator_traits<gsl::span<int>::iterator>::pointer, int*>::value,\n              \"span<int>::iterator's pointer should be int*\");\nstatic_assert(\n    std::is_same<gsl::span<int>::reverse_iterator,\n                 std::reverse_iterator<gsl::span<int>::iterator>>::value,\n    \"span<int>::reverse_iterator should equal std::reverse_iterator<span<int>::iterator>\");\n\nstatic_assert(std::is_same<std::iterator_traits<gsl::span<int, 3>::iterator>::pointer, int*>::value,\n              \"span<int, 3>::iterator's pointer should be int*\");\nstatic_assert(\n    std::is_same<gsl::span<int, 3>::reverse_iterator,\n                 std::reverse_iterator<gsl::span<int, 3>::iterator>>::value,\n    \"span<int, 3>::reverse_iterator should equal std::reverse_iterator<span<int, 3>::iterator>\");\n\nstatic_assert(\n    std::is_same<std::iterator_traits<gsl::span<const int>::iterator>::pointer, const int*>::value,\n    \"span<const int>::iterator's pointer should be int*\");\nstatic_assert(std::is_same<gsl::span<const int>::reverse_iterator,\n                           std::reverse_iterator<gsl::span<const int>::iterator>>::value,\n              \"span<const int>::reverse_iterator should equal std::reverse_iterator<span<const \"\n              \"int>::iterator>\");\n\nstatic_assert(std::is_same<std::iterator_traits<gsl::span<const int, 3>::iterator>::pointer,\n                           const int*>::value,\n              \"span<const int, 3>::iterator's pointer should be int*\");\nstatic_assert(std::is_same<gsl::span<const int, 3>::reverse_iterator,\n                           std::reverse_iterator<gsl::span<const int, 3>::iterator>>::value,\n              \"span<const int, 3>::reverse_iterator should equal std::reverse_iterator<span<const \"\n              \"int, 3>::iterator>\");\n\n// copyability assertions\nstatic_assert(std::is_trivially_copyable<gsl::span<int>>::value,\n              \"span<int> should be trivially copyable\");\nstatic_assert(std::is_trivially_copyable<gsl::span<int>::iterator>::value,\n              \"span<int>::iterator should be trivially copyable\");\n\nstatic_assert(std::is_trivially_copyable<gsl::span<int, 3>>::value,\n              \"span<int, 3> should be trivially copyable\");\nstatic_assert(std::is_trivially_copyable<gsl::span<int, 3>::iterator>::value,\n              \"span<int, 3>::iterator should be trivially copyable\");\n\nstatic_assert(std::is_trivially_copyable<gsl::span<const int>>::value,\n              \"span<const int> should be trivially copyable\");\nstatic_assert(std::is_trivially_copyable<gsl::span<const int>::iterator>::value,\n              \"span<const int>::iterator should be trivially copyable\");\n\nstatic_assert(std::is_trivially_copyable<gsl::span<const int, 3>>::value,\n              \"span<const int, 3> should be trivially copyable\");\nstatic_assert(std::is_trivially_copyable<gsl::span<const int, 3>::iterator>::value,\n              \"span<const int, 3>::iterator should be trivially copyable\");\n\n// nothrow constructible assertions\nstatic_assert(std::is_nothrow_constructible<gsl::span<int>, int*, std::size_t>::value,\n              \"std::is_nothrow_constructible<gsl::span<int>, int*, std::size_t>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<int>, int*, std::uint16_t>::value,\n              \"std::is_nothrow_constructible<gsl::span<int>, int*, std::uint16_t>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<int>, int*, int*>::value,\n              \"std::is_nothrow_constructible<gsl::span<int>, int*, int*>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<int>, int (&)[3]>::value,\n              \"std::is_nothrow_constructible<gsl::span<int>, int(&)[3]>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<int>, const gsl::span<int>&>::value,\n              \"std::is_nothrow_constructible<gsl::span<int>, const gsl::span<int>&>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<int>, const gsl::span<int, 3>&>::value,\n              \"std::is_nothrow_constructible<gsl::span<int>, const gsl::span<int, 3>&>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<int>, const gsl::span<int, 500>&>::value,\n              \"std::is_nothrow_constructible<gsl::span<int>, const gsl::span<int, 500>&>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<int>, std::array<int, 3>&>::value,\n              \"std::is_nothrow_constructible<gsl::span<int>, std::array<int, 3>&>\");\n\nstatic_assert(std::is_nothrow_constructible<gsl::span<int, 3>, int*, std::size_t>::value,\n              \"std::is_nothrow_constructible<gsl::span<int, 3>, int*, std::size_t>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<int, 3>, int*, std::uint16_t>::value,\n              \"std::is_nothrow_constructible<gsl::span<int, 3>, int*, std::uint16_t>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<int, 3>, int*, int*>::value,\n              \"std::is_nothrow_constructible<gsl::span<int, 3>, int*, int*>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<int, 3>, int (&)[3]>::value,\n              \"std::is_nothrow_constructible<gsl::span<int, 3>, int(&)[3]>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<int, 3>, const gsl::span<int, 3>&>::value,\n              \"std::is_nothrow_constructible<gsl::span<int, 3>, const gsl::span<int, 3>&>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<int, 3>, std::array<int, 3>&>::value,\n              \"std::is_nothrow_constructible<gsl::span<int, 3>, std::array<int, 3>&>\");\n\nstatic_assert(std::is_nothrow_constructible<gsl::span<const int>, int*, std::size_t>::value,\n              \"std::is_nothrow_constructible<gsl::span<const int>, int*, std::size_t>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<const int>, int*, int*>::value,\n              \"std::is_nothrow_constructible<gsl::span<const int>, int*, int*>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<const int>, int*, const int*>::value,\n              \"std::is_nothrow_constructible<gsl::span<const int>, int*, const int*>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<const int>, int (&)[3]>::value,\n              \"std::is_nothrow_constructible<gsl::span<const int>, int(&)[3]>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<const int>, const int*, int*>::value,\n              \"std::is_nothrow_constructible<gsl::span<const int>, const int*, int*>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<const int>, const int*, const int*>::value,\n              \"std::is_nothrow_constructible<gsl::span<const int>, const int*, const int*>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<const int>, const int*, std::size_t>::value,\n              \"std::is_nothrow_constructible<gsl::span<const int>, const int*, std::size_t>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<const int>, const int (&)[3]>::value,\n              \"std::is_nothrow_constructible<gsl::span<const int>, const int(&)[3]>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<const int>, const gsl::span<int>&>::value,\n              \"std::is_nothrow_constructible<gsl::span<const int>, const gsl::span<int>&>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<const int>, const gsl::span<int, 3>&>::value,\n              \"std::is_nothrow_constructible<gsl::span<const int>, const gsl::span<int, 3>&>\");\nstatic_assert(\n    std::is_nothrow_constructible<gsl::span<const int>, const gsl::span<int, 500>&>::value,\n    \"std::is_nothrow_constructible<gsl::span<const int>, const gsl::span<int, 500>&>\");\nstatic_assert(\n    std::is_nothrow_constructible<gsl::span<const int>, const gsl::span<const int>&>::value,\n    \"std::is_nothrow_constructible<gsl::span<const int>, const gsl::span<const int>&>\");\nstatic_assert(\n    std::is_nothrow_constructible<gsl::span<const int>, const gsl::span<const int, 3>&>::value,\n    \"std::is_nothrow_constructible<gsl::span<const int>, const gsl::span<const int, 3>&>\");\nstatic_assert(\n    std::is_nothrow_constructible<gsl::span<const int>, const gsl::span<const int, 500>&>::value,\n    \"std::is_nothrow_constructible<gsl::span<const int>, const gsl::span<const int, 500>&>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<const int>, std::array<int, 3>&>::value,\n              \"std::is_nothrow_constructible<gsl::span<const int>, std::array<int, 3>&>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<const int>, const std::array<int, 3>&>::value,\n              \"std::is_nothrow_constructible<gsl::span<const int>, const std::array<int, 3>&>\");\n\nstatic_assert(\n    std::is_nothrow_constructible<gsl::span<const int, 3>, const gsl::span<int, 3>&>::value,\n    \"std::is_nothrow_constructible<gsl::span<const int, 3>, const gsl::span<int, 3>&>\");\nstatic_assert(\n    std::is_nothrow_constructible<gsl::span<const int, 3>, const gsl::span<const int, 3>&>::value,\n    \"std::is_nothrow_constructible<gsl::span<const int, 3>, const gsl::span<const int, 3>&>\");\n\nstatic_assert(std::is_nothrow_constructible<gsl::span<Base>, Base (&)[3]>::value,\n              \"std::is_nothrow_constructible<gsl::span<Base>, Base(&)[3]>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<Base>, const gsl::span<Base>&>::value,\n              \"std::is_nothrow_constructible<gsl::span<Base>, const gsl::span<Base>&>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<Base>, const gsl::span<Base, 3>&>::value,\n              \"std::is_nothrow_constructible<gsl::span<Base>, const gsl::span<Base, 3>&>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<Base>, std::array<Base, 3>&>::value,\n              \"std::is_nothrow_constructible<gsl::span<Base>, std::array<Base, 3>&>\");\n\nstatic_assert(std::is_nothrow_constructible<gsl::span<Base, 3>, Base (&)[3]>::value,\n              \"std::is_nothrow_constructible<gsl::span<Base, 3>, Base(&)[3]>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<Base, 3>, const gsl::span<Base, 3>&>::value,\n              \"std::is_nothrow_constructible<gsl::span<Base, 3>, const gsl::span<Base, 3>&>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<Base, 3>, std::array<Base, 3>&>::value,\n              \"std::is_nothrow_constructible<gsl::span<Base, 3>, std::array<Base, 3>&>\");\n\nstatic_assert(std::is_nothrow_constructible<gsl::span<const Base>, Base (&)[3]>::value,\n              \"std::is_nothrow_constructible<gsl::span<const Base>, Base(&)[3]>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<const Base>, const Base (&)[3]>::value,\n              \"std::is_nothrow_constructible<gsl::span<const Base>, const Base(&)[3]>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<const Base>, const gsl::span<Base>&>::value,\n              \"std::is_nothrow_constructible<gsl::span<const Base>, const gsl::span<Base>&>\");\nstatic_assert(\n    std::is_nothrow_constructible<gsl::span<const Base>, const gsl::span<Base, 3>&>::value,\n    \"std::is_nothrow_constructible<gsl::span<const Base>, const gsl::span<Base, 3>&>\");\nstatic_assert(\n    std::is_nothrow_constructible<gsl::span<const Base>, const gsl::span<const Base>&>::value,\n    \"std::is_nothrow_constructible<gsl::span<const Base>, const gsl::span<const Base>&>\");\nstatic_assert(\n    std::is_nothrow_constructible<gsl::span<const Base>, const gsl::span<const Base, 3>&>::value,\n    \"std::is_nothrow_constructible<gsl::span<const Base>, const gsl::span<const Base, 3>&>\");\nstatic_assert(std::is_nothrow_constructible<gsl::span<const Base>, std::array<Base, 3>&>::value,\n              \"std::is_nothrow_constructible<gsl::span<const Base>, std::array<Base, 3>&>\");\nstatic_assert(\n    std::is_nothrow_constructible<gsl::span<const Base>, const std::array<Base, 3>&>::value,\n    \"std::is_nothrow_constructible<gsl::span<const Base>, const std::array<Base, 3>&>\");\n\nstatic_assert(\n    std::is_nothrow_constructible<gsl::span<const Base, 3>, const gsl::span<Base, 3>&>::value,\n    \"std::is_nothrow_constructible<gsl::span<const Base, 3>, const gsl::span<Base, 3>&>\");\nstatic_assert(\n    std::is_nothrow_constructible<gsl::span<const Base, 3>, const gsl::span<const Base, 3>&>::value,\n    \"std::is_nothrow_constructible<gsl::span<const Base, 3>, const gsl::span<const Base, 3>&>\");\n\n// non-constructible assertions\nstatic_assert(!std::is_constructible<gsl::span<int>, const int*, int*>::value,\n              \"!std::is_constructible<gsl::span<int>, const int*, int*>\");\nstatic_assert(!std::is_constructible<gsl::span<int>, const int*, const int*>::value,\n              \"!std::is_constructible<gsl::span<int>, const int*, const int*>\");\nstatic_assert(!std::is_constructible<gsl::span<int>, const int*, double*>::value,\n              \"!std::is_constructible<gsl::span<int>, const int*, double*>\");\nstatic_assert(!std::is_constructible<gsl::span<int>, const int*, std::size_t>::value,\n              \"!std::is_constructible<gsl::span<int>, const int*, std::size_t>\");\nstatic_assert(!std::is_constructible<gsl::span<int>, const int (&)[3]>::value,\n              \"!std::is_constructible<gsl::span<int>, const int(&)[3]>\");\nstatic_assert(!std::is_constructible<gsl::span<int>, double*, int*>::value,\n              \"!std::is_constructible<gsl::span<int>, double*, int*>\");\nstatic_assert(!std::is_constructible<gsl::span<int>, double*, const int*>::value,\n              \"!std::is_constructible<gsl::span<int>, double*, const int*>\");\nstatic_assert(!std::is_constructible<gsl::span<int>, double*, double*>::value,\n              \"!std::is_constructible<gsl::span<int>, double*, double*>\");\nstatic_assert(!std::is_constructible<gsl::span<int>, double*, std::size_t>::value,\n              \"!std::is_constructible<gsl::span<int>, double*, std::size_t>\");\nstatic_assert(!std::is_constructible<gsl::span<int>, double (&)[3]>::value,\n              \"!std::is_constructible<gsl::span<int>, double(&)[3]>\");\nstatic_assert(!std::is_constructible<gsl::span<int>, int*, double*>::value,\n              \"!std::is_constructible<gsl::span<int>, int*, double*>\");\nstatic_assert(!std::is_constructible<gsl::span<int>, std::size_t, int*>::value,\n              \"!std::is_constructible<gsl::span<int>, std::size_t, int*>\");\nstatic_assert(!std::is_constructible<gsl::span<int>, std::size_t, std::size_t>::value,\n              \"!std::is_constructible<gsl::span<int>, std::size_t, std::size_t>\");\nstatic_assert(!std::is_constructible<gsl::span<int>, const gsl::span<const int>&>::value,\n              \"!std::is_constructible<gsl::span<int>, const gsl::span<const int>&>\");\nstatic_assert(!std::is_constructible<gsl::span<int>, const gsl::span<const int, 3>&>::value,\n              \"!std::is_constructible<gsl::span<int>, const gsl::span<const int, 3>&>\");\nstatic_assert(!std::is_constructible<gsl::span<int>, const gsl::span<const int, 500>&>::value,\n              \"!std::is_constructible<gsl::span<int>, const gsl::span<const int, 500>&>\");\nstatic_assert(!std::is_constructible<gsl::span<int>, const gsl::span<double, 3>&>::value,\n              \"!std::is_constructible<gsl::span<int>, const gsl::span<double, 3>&>\");\nstatic_assert(!std::is_constructible<gsl::span<int>, std::array<double, 3>&>::value,\n              \"!std::is_constructible<gsl::span<int>, std::array<double, 3>&>\");\nstatic_assert(!std::is_constructible<gsl::span<int>, const std::array<int, 3>&>::value,\n              \"!std::is_constructible<gsl::span<int>, const std::array<int, 3>&>\");\n\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, int*, double*>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, int*, double*>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, int (&)[500]>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, int(&)[500]>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, const int*, int*>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, const int*, int*>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, const int*, const int*>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, const int*, const int*>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, const int*, std::size_t>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, const int*, std::size_t>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, const int*, double*>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, const int*, double*>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, const int (&)[3]>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, const int(&)[3]>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, double*, std::size_t>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, double*, std::size_t>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, double*, int*>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, double*, int*>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, double*, const int*>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, double*, const int*>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, double*, double*>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, double*, double*>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, double (&)[3]>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, double(&)[3]>\");\n\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, std::size_t, int*>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, std::size_t, int*>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, std::size_t, std::size_t>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, std::size_t, std::size_t>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, std::array<double, 3>&>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, std::array<double, 3>&>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, std::array<int, 500>&>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, std::array<int, 500>&>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, const std::array<int, 3>&>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, const std::array<int, 3>&>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, const gsl::span<int>&>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, const gsl::span<int>&>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, const gsl::span<int, 500>&>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, const gsl::span<int, 500>&>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, const gsl::span<const int>&>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, const gsl::span<const int>&>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, const gsl::span<const int, 3>&>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, const gsl::span<const int, 3>&>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, const gsl::span<const int, 500>&>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, const gsl::span<const int, 500>&>\");\nstatic_assert(!std::is_constructible<gsl::span<int, 3>, const gsl::span<double, 3>&>::value,\n              \"!std::is_constructible<gsl::span<int, 3>, const gsl::span<double, 3>&>\");\n\nstatic_assert(!std::is_constructible<gsl::span<const int>, double (&)[3]>::value,\n              \"!std::is_constructible<gsl::span<const int>, double(&)[3]>\");\nstatic_assert(!std::is_constructible<gsl::span<const int>, std::array<double, 3>&>::value,\n              \"!std::is_constructible<gsl::span<const int>, std::array<double, 3>&>\");\nstatic_assert(!std::is_constructible<gsl::span<const int>, const gsl::span<double, 3>&>::value,\n              \"!std::is_constructible<gsl::span<const int>, const gsl::span<double, 3>&>\");\n\nstatic_assert(!std::is_constructible<gsl::span<const int, 3>, const gsl::span<int>&>::value,\n              \"!std::is_constructible<gsl::span<const int, 3>, const gsl::span<int>&>\");\nstatic_assert(!std::is_constructible<gsl::span<const int, 3>, const gsl::span<int, 500>&>::value,\n              \"!std::is_constructible<gsl::span<const int, 3>, const gsl::span<int, 500>&>\");\nstatic_assert(!std::is_constructible<gsl::span<const int, 3>, const gsl::span<const int>&>::value,\n              \"!std::is_constructible<gsl::span<const int, 3>, const gsl::span<const int>&>\");\nstatic_assert(\n    !std::is_constructible<gsl::span<const int, 3>, const gsl::span<const int, 500>&>::value,\n    \"!std::is_constructible<gsl::span<const int, 3>, const gsl::span<const int, 500>&>\");\nstatic_assert(!std::is_constructible<gsl::span<const int, 3>, const gsl::span<double, 3>&>::value,\n              \"!std::is_constructible<gsl::span<const int, 3>, const gsl::span<double, 3>&>\");\n\nstatic_assert(!std::is_constructible<gsl::span<Base>, Derived (&)[3]>::value,\n              \"!std::is_constructible<gsl::span<Base>, Derived(&)[3]>\");\nstatic_assert(!std::is_constructible<gsl::span<Base>, std::array<Derived, 3>&>::value,\n              \"!std::is_constructible<gsl::span<Base>, std::array<Derived, 3>&>\");\nstatic_assert(!std::is_constructible<gsl::span<Base>, std::vector<Derived>&>::value,\n              \"!std::is_constructible<gsl::span<Base>, std::vector<Derived>&>\");\nstatic_assert(!std::is_constructible<gsl::span<Base>, const gsl::span<Derived>&>::value,\n              \"!std::is_constructible<gsl::span<Base>, const gsl::span<Derived>&>\");\nstatic_assert(!std::is_constructible<gsl::span<Base>, const gsl::span<Derived, 3>&>::value,\n              \"!std::is_constructible<gsl::span<Base>, const gsl::span<Derived, 3>&>\");\n\nstatic_assert(!std::is_constructible<gsl::span<Base, 3>, const gsl::span<Derived, 3>&>::value,\n              \"!std::is_constructible<gsl::span<Base, 3>, const gsl::span<Derived, 3>&>\");\nstatic_assert(!std::is_constructible<gsl::span<Base, 3>, Derived (&)[3]>::value,\n              \"!std::is_constructible<gsl::span<Base, 3>, Derived(&)[3]>\");\nstatic_assert(!std::is_constructible<gsl::span<Base, 3>, std::array<Derived, 3>&>::value,\n              \"!std::is_constructible<gsl::span<Base, 3>, std::array<Derived, 3>&>\");\n\nstatic_assert(!std::is_constructible<gsl::span<const Base>, Derived (&)[3]>::value,\n              \"!std::is_constructible<gsl::span<const Base>, Derived(&)[3]>\");\nstatic_assert(!std::is_constructible<gsl::span<const Base>, const Derived (&)[3]>::value,\n              \"!std::is_constructible<gsl::span<const Base>, const Derived(&)[3]>\");\nstatic_assert(!std::is_constructible<gsl::span<const Base>, std::array<Derived, 3>&>::value,\n              \"!std::is_constructible<gsl::span<const Base>, std::array<Derived, 3>&>\");\nstatic_assert(!std::is_constructible<gsl::span<const Base>, const std::array<Derived, 3>&>::value,\n              \"!std::is_constructible<gsl::span<const Base>, const std::array<Derived, 3>&>\");\nstatic_assert(!std::is_constructible<gsl::span<const Base>, const gsl::span<Derived>&>::value,\n              \"!std::is_constructible<gsl::span<const Base>, const gsl::span<Derived>&>\");\nstatic_assert(!std::is_constructible<gsl::span<const Base>, const gsl::span<Derived, 3>&>::value,\n              \"!std::is_constructible<gsl::span<const Base>, const gsl::span<Derived, 3>&>\");\nstatic_assert(!std::is_constructible<gsl::span<const Base>, const gsl::span<const Derived>&>::value,\n              \"!std::is_constructible<gsl::span<const Base>, const gsl::span<const Derived>&>\");\nstatic_assert(\n    !std::is_constructible<gsl::span<const Base>, const gsl::span<const Derived, 3>&>::value,\n    \"!std::is_constructible<gsl::span<const Base>, const gsl::span<const Derived, 3>&>\");\n\nstatic_assert(!std::is_constructible<gsl::span<const Base, 3>, const gsl::span<Derived, 3>&>::value,\n              \"!std::is_constructible<gsl::span<const Base, 3>, const gsl::span<Derived, 3>&>\");\nstatic_assert(\n    !std::is_constructible<gsl::span<const Base, 3>, const gsl::span<const Derived, 3>&>::value,\n    \"!std::is_constructible<gsl::span<const Base, 3>, const gsl::span<const Derived, 3>&>\");\n\nstatic_assert(!std::is_constructible<gsl::span<const Derived>, std::array<Base, 3>&>::value,\n              \"!std::is_constructible<gsl::span<const Derived>, std::array<Base, 3>&>\");\nstatic_assert(!std::is_constructible<gsl::span<const Derived>, const std::array<Base, 3>&>::value,\n              \"!std::is_constructible<gsl::span<const Derived>, const std::array<Base, 3>&>\");\n\n// no throw copy constructor\nstatic_assert(std::is_nothrow_copy_constructible<gsl::span<int>>::value,\n              \"std::is_nothrow_copy_constructible<gsl::span<int>>\");\nstatic_assert(std::is_nothrow_copy_constructible<gsl::span<int, 3>>::value,\n              \"std::is_nothrow_copy_constructible<gsl::span<int, 3>>\");\nstatic_assert(std::is_nothrow_copy_constructible<gsl::span<const int>>::value,\n              \"std::is_nothrow_copy_constructible<gsl::span<const int>>\");\nstatic_assert(std::is_nothrow_copy_constructible<gsl::span<const int, 3>>::value,\n              \"std::is_nothrow_copy_constructible<gsl::span<const int, 3>>\");\n\n// no throw copy assignment\nstatic_assert(std::is_nothrow_copy_assignable<gsl::span<int>>::value,\n              \"std::is_nothrow_copy_assignable<gsl::span<int>>\");\nstatic_assert(std::is_nothrow_copy_assignable<gsl::span<int, 3>>::value,\n              \"std::is_nothrow_copy_assignable<gsl::span<int, 3>>\");\nstatic_assert(std::is_nothrow_copy_assignable<gsl::span<const int>>::value,\n              \"std::is_nothrow_copy_assignable<gsl::span<const int>>\");\nstatic_assert(std::is_nothrow_copy_assignable<gsl::span<const int, 3>>::value,\n              \"std::is_nothrow_copy_assignable<gsl::span<const int, 3>>\");\n\n// no throw destruction\nstatic_assert(std::is_nothrow_destructible<gsl::span<int>>::value,\n              \"std::is_nothrow_destructible<gsl::span<int>>\");\nstatic_assert(std::is_nothrow_destructible<gsl::span<int, 3>>::value,\n              \"std::is_nothrow_destructible<gsl::span<int, 3>>\");\nstatic_assert(std::is_nothrow_destructible<gsl::span<const int>>::value,\n              \"std::is_nothrow_destructible<gsl::span<const int>>\");\n\n// conversions\nstatic_assert(std::is_convertible<int (&)[3], gsl::span<int>>::value,\n              \"std::is_convertible<int(&)[3], gsl::span<int>>\");\nstatic_assert(std::is_convertible<int (&)[3], gsl::span<int, 3>>::value,\n              \"std::is_convertible<int(&)[3], gsl::span<int, 3>>\");\nstatic_assert(std::is_convertible<int (&)[3], gsl::span<const int>>::value,\n              \"std::is_convertible<int(&)[3], gsl::span<const int>>\");\n\nstatic_assert(std::is_convertible<const int (&)[3], gsl::span<const int>>::value,\n              \"std::is_convertible<const int(&)[3], gsl::span<const int>>\");\n\nstatic_assert(std::is_convertible<const gsl::span<int>&, gsl::span<int>>::value,\n              \"std::is_convertible<const gsl::span<int>&, gsl::span<int>>\");\nstatic_assert(std::is_convertible<const gsl::span<int>&, gsl::span<const int>>::value,\n              \"std::is_convertible<const gsl::span<int>&, gsl::span<const int>>\");\n\nstatic_assert(std::is_convertible<const gsl::span<int, 3>&, gsl::span<int>>::value,\n              \"std::is_convertible<const gsl::span<int, 3>&, gsl::span<int>>\");\nstatic_assert(std::is_convertible<const gsl::span<int, 3>&, gsl::span<int, 3>>::value,\n              \"std::is_convertible<const gsl::span<int, 3>&, gsl::span<int, 3>>\");\nstatic_assert(std::is_convertible<const gsl::span<int, 3>&, gsl::span<const int>>::value,\n              \"std::is_convertible<const gsl::span<int, 3>&, gsl::span<const int>>\");\nstatic_assert(std::is_convertible<const gsl::span<int, 3>&, gsl::span<const int, 3>>::value,\n              \"std::is_convertible<const gsl::span<int, 3>&, gsl::span<const int, 3>>\");\nstatic_assert(std::is_convertible<const gsl::span<int, 500>&, gsl::span<int>>::value,\n              \"std::is_convertible<const gsl::span<int, 500>&, gsl::span<int>>\");\nstatic_assert(std::is_convertible<const gsl::span<int, 500>&, gsl::span<const int>>::value,\n              \"std::is_convertible<const gsl::span<int, 500>&, gsl::span<const int>>\");\n\nstatic_assert(std::is_convertible<const gsl::span<const int>&, gsl::span<const int>>::value,\n              \"std::is_convertible<const gsl::span<const int>&, gsl::span<const int>>\");\n\nstatic_assert(std::is_convertible<const gsl::span<const int, 3>&, gsl::span<const int>>::value,\n              \"std::is_convertible<const gsl::span<const int, 3>&, gsl::span<const int>>\");\nstatic_assert(std::is_convertible<const gsl::span<const int, 3>&, gsl::span<const int, 3>>::value,\n              \"std::is_convertible<const gsl::span<const int, 3>&, gsl::span<const int, 3>>\");\nstatic_assert(std::is_convertible<const gsl::span<const int, 500>&, gsl::span<const int>>::value,\n              \"std::is_convertible<const gsl::span<const int, 500>&, gsl::span<const int>>\");\n\nstatic_assert(std::is_convertible<std::array<int, 3>&, gsl::span<int>>::value,\n              \"std::is_convertible<std::array<int, 3>&, gsl::span<int>>\");\nstatic_assert(std::is_convertible<std::array<int, 3>&, gsl::span<int, 3>>::value,\n              \"std::is_convertible<std::array<int, 3>&, gsl::span<int, 3>>\");\nstatic_assert(std::is_convertible<std::array<int, 3>&, gsl::span<const int>>::value,\n              \"std::is_convertible<std::array<int, 3>&, gsl::span<const int>>\");\n\nstatic_assert(std::is_convertible<const std::array<int, 3>&, gsl::span<const int>>::value,\n              \"std::is_convertible<const std::array<int, 3>&, gsl::span<const int>>\");\n\n#if __cplusplus >= 201703l\ntemplate <typename U, typename = void>\nstatic constexpr bool AsWritableBytesCompilesFor = false;\n\ntemplate <typename U>\nstatic constexpr bool\n    AsWritableBytesCompilesFor<U, void_t<decltype(as_writable_bytes(declval<U>()))>> = true;\n\nstatic_assert(AsWritableBytesCompilesFor<gsl::span<int>>,\n              \"AsWritableBytesCompilesFor<gsl::span<int>>\");\nstatic_assert(AsWritableBytesCompilesFor<gsl::span<int, 9>>,\n              \"AsWritableBytesCompilesFor<gsl::span<int, 9>>\");\nstatic_assert(!AsWritableBytesCompilesFor<gsl::span<const int>>,\n              \"!AsWritableBytesCompilesFor<gsl::span<const int>>\");\nstatic_assert(!AsWritableBytesCompilesFor<gsl::span<const int, 9>>,\n              \"!AsWritableBytesCompilesFor<gsl::span<const int, 9>>\");\n#endif // __cplusplus >= 201703l\n"
  },
  {
    "path": "examples/libraries/GSL/tests/span_ext_tests.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\r\n//\r\n// This code is licensed under the MIT License (MIT).\r\n//\r\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n// THE SOFTWARE.\r\n//\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\n#include <gtest/gtest.h>\r\n\r\n#include <gsl/gsl_util> // for narrow_cast, at\r\n#include <gsl/span_ext> // for operator==, operator!=, make_span\r\n\r\n#include <array>       // for array\r\n#include <iostream>    // for cerr\r\n#include <vector>      // for vector\r\n\r\nusing namespace std;\r\nusing namespace gsl;\r\n\r\nnamespace\r\n{\r\nstatic constexpr char deathstring[] = \"Expected Death\";\r\n} // namespace\r\n\r\nTEST(span_ext_test, make_span_from_pointer_length_constructor)\r\n{\r\n    std::set_terminate([] {\r\n        std::cerr << \"Expected Death. from_pointer_length_constructor\";\r\n        std::abort();\r\n    });\r\n    int arr[4] = {1, 2, 3, 4};\r\n\r\n    {\r\n        auto s = make_span(&arr[0], 2);\r\n        EXPECT_TRUE(s.size() == 2);\r\n        EXPECT_TRUE(s.data() == &arr[0]);\r\n        EXPECT_TRUE(s[0] == 1);\r\n        EXPECT_TRUE(s[1] == 2);\r\n    }\r\n\r\n    {\r\n        int* p = nullptr;\r\n        auto s = make_span(p, narrow_cast<span<int>::size_type>(0));\r\n        EXPECT_TRUE(s.size() == 0);\r\n        EXPECT_TRUE(s.data() == nullptr);\r\n    }\r\n\r\n    {\r\n        int* p = nullptr;\r\n        auto workaround_macro = [=]() { make_span(p, 2); };\r\n        EXPECT_DEATH(workaround_macro(), deathstring);\r\n    }\r\n}\r\n\r\nTEST(span_ext_test, make_span_from_pointer_pointer_construction)\r\n{\r\n    int arr[4] = {1, 2, 3, 4};\r\n\r\n    {\r\n        auto s = make_span(&arr[0], &arr[2]);\r\n        EXPECT_TRUE(s.size() == 2);\r\n        EXPECT_TRUE(s.data() == &arr[0]);\r\n        EXPECT_TRUE(s[0] == 1);\r\n        EXPECT_TRUE(s[1] == 2);\r\n    }\r\n\r\n    {\r\n        auto s = make_span(&arr[0], &arr[0]);\r\n        EXPECT_TRUE(s.size() == 0);\r\n        EXPECT_TRUE(s.data() == &arr[0]);\r\n    }\r\n\r\n    {\r\n        int* p = nullptr;\r\n        auto s = make_span(p, p);\r\n        EXPECT_TRUE(s.size() == 0);\r\n        EXPECT_TRUE(s.data() == nullptr);\r\n    }\r\n}\r\n\r\nTEST(span_ext_test, make_span_from_array_constructor)\r\n {\r\n     int arr[5] = {1, 2, 3, 4, 5};\r\n     int arr2d[2][3] = {1, 2, 3, 4, 5, 6};\r\n     int arr3d[2][3][2] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};\r\n\r\n     {\r\n         const auto s = make_span(arr);\r\n         EXPECT_TRUE(s.size() == 5);\r\n         EXPECT_TRUE(s.data() == std::addressof(arr[0]));\r\n     }\r\n\r\n     {\r\n         const auto s = make_span(std::addressof(arr2d[0]), 1);\r\n         EXPECT_TRUE(s.size() == 1);\r\n         EXPECT_TRUE(s.data() == std::addressof(arr2d[0]));\r\n     }\r\n\r\n     {\r\n         const auto s = make_span(std::addressof(arr3d[0]), 1);\r\n         EXPECT_TRUE(s.size() == 1);\r\n         EXPECT_TRUE(s.data() == std::addressof(arr3d[0]));\r\n     }\r\n }\r\n\r\n TEST(span_ext_test, make_span_from_dynamic_array_constructor)\r\n {\r\n     double(*arr)[3][4] = new double[100][3][4];\r\n\r\n     {\r\n         auto s = make_span(&arr[0][0][0], 10);\r\n         EXPECT_TRUE(s.size() == 10);\r\n         EXPECT_TRUE(s.data() == &arr[0][0][0]);\r\n     }\r\n\r\n     delete[] arr;\r\n }\r\n\r\n TEST(span_ext_test, make_span_from_std_array_constructor)\r\n {\r\n     std::array<int, 4> arr = {1, 2, 3, 4};\r\n\r\n     {\r\n         auto s = make_span(arr);\r\n         EXPECT_TRUE(s.size() == arr.size());\r\n         EXPECT_TRUE(s.data() == arr.data());\r\n     }\r\n\r\n     // This test checks for the bug found in gcc 6.1, 6.2, 6.3, 6.4, 6.5 7.1, 7.2, 7.3 - issue #590\r\n     {\r\n         span<int> s1 = make_span(arr);\r\n\r\n         static span<int> s2;\r\n         s2 = s1;\r\n\r\n #if defined(__GNUC__) && __GNUC__ == 6 && (__GNUC_MINOR__ == 4 || __GNUC_MINOR__ == 5) &&          \\\r\n     __GNUC_PATCHLEVEL__ == 0 && defined(__OPTIMIZE__)\r\n         // Known to be broken in gcc 6.4 and 6.5 with optimizations\r\n         // Issue in gcc: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83116\r\n         EXPECT_TRUE(s1.size() == 4);\r\n         EXPECT_TRUE(s2.size() == 0);\r\n #else\r\n         EXPECT_TRUE(s1.size() == s2.size());\r\n #endif\r\n     }\r\n }\r\n\r\n TEST(span_ext_test, make_span_from_const_std_array_constructor)\r\n {\r\n     const std::array<int, 4> arr = {1, 2, 3, 4};\r\n\r\n     {\r\n         auto s = make_span(arr);\r\n         EXPECT_TRUE(s.size() == arr.size());\r\n         EXPECT_TRUE(s.data() == arr.data());\r\n     }\r\n }\r\n\r\n TEST(span_ext_test, make_span_from_std_array_const_constructor)\r\n {\r\n     std::array<const int, 4> arr = {1, 2, 3, 4};\r\n\r\n     {\r\n         auto s = make_span(arr);\r\n         EXPECT_TRUE(s.size() == arr.size());\r\n         EXPECT_TRUE(s.data() == arr.data());\r\n     }\r\n }\r\n\r\n TEST(span_ext_test, make_span_from_container_constructor)\r\n {\r\n     std::vector<int> v = {1, 2, 3};\r\n     const std::vector<int> cv = v;\r\n\r\n     {\r\n         auto s = make_span(v);\r\n         EXPECT_TRUE(s.size() == v.size());\r\n         EXPECT_TRUE(s.data() == v.data());\r\n\r\n         auto cs = make_span(cv);\r\n         EXPECT_TRUE(cs.size() == cv.size());\r\n         EXPECT_TRUE(cs.data() == cv.data());\r\n     }\r\n }\r\n\r\n TEST(span_test, interop_with_gsl_at)\r\n {\r\n     int arr[5] = {1, 2, 3, 4, 5};\r\n     span<int> s{arr};\r\n     EXPECT_TRUE(at(s, 0) ==  1);\r\n     EXPECT_TRUE(at(s, 1) == 2);\r\n }\r\n\r\n TEST(span_ext_test, iterator_free_functions)\r\n {\r\n     int a[] = {1, 2, 3, 4};\r\n     span<int> s{a};\r\n\r\n     EXPECT_TRUE((std::is_same<decltype(s.begin()), decltype(begin(s))>::value));\r\n     EXPECT_TRUE((std::is_same<decltype(s.end()), decltype(end(s))>::value));\r\n\r\n     EXPECT_TRUE((std::is_same<decltype(std::cbegin(s)), decltype(cbegin(s))>::value));\r\n     EXPECT_TRUE((std::is_same<decltype(std::cend(s)), decltype(cend(s))>::value));\r\n\r\n     EXPECT_TRUE((std::is_same<decltype(s.rbegin()), decltype(rbegin(s))>::value));\r\n     EXPECT_TRUE((std::is_same<decltype(s.rend()), decltype(rend(s))>::value));\r\n\r\n     EXPECT_TRUE((std::is_same<decltype(std::crbegin(s)), decltype(crbegin(s))>::value));\r\n     EXPECT_TRUE((std::is_same<decltype(std::crend(s)), decltype(crend(s))>::value));\r\n\r\n     EXPECT_TRUE(s.begin() == begin(s));\r\n     EXPECT_TRUE(s.end() == end(s));\r\n\r\n     EXPECT_TRUE(s.rbegin() == rbegin(s));\r\n     EXPECT_TRUE(s.rend() == rend(s));\r\n\r\n     EXPECT_TRUE(s.begin() == cbegin(s));\r\n     EXPECT_TRUE(s.end() == cend(s));\r\n\r\n     EXPECT_TRUE(s.rbegin() == crbegin(s));\r\n     EXPECT_TRUE(s.rend() == crend(s));\r\n }\r\n\r\n TEST(span_ext_test, ssize_free_function)\r\n {\r\n     int a[] = {1, 2, 3, 4};\r\n     span<int> s{a};\r\n\r\n     EXPECT_FALSE((std::is_same<decltype(s.size()), decltype(ssize(s))>::value));\r\n     EXPECT_TRUE(s.size() == static_cast<std::size_t>(ssize(s)));\r\n }\r\n\r\n  TEST(span_ext_test, comparison_operators)\r\n {\r\n     {\r\n         span<int> s1;\r\n         span<int> s2;\r\n         EXPECT_TRUE(s1 == s2);\r\n         EXPECT_FALSE(s1 != s2);\r\n         EXPECT_FALSE(s1 < s2);\r\n         EXPECT_TRUE(s1 <= s2);\r\n         EXPECT_FALSE(s1 > s2);\r\n         EXPECT_TRUE(s1 >= s2);\r\n         EXPECT_TRUE(s2 == s1);\r\n         EXPECT_FALSE(s2 != s1);\r\n         EXPECT_FALSE(s2 != s1);\r\n         EXPECT_TRUE(s2 <= s1);\r\n         EXPECT_FALSE(s2 > s1);\r\n         EXPECT_TRUE(s2 >= s1);\r\n     }\r\n\r\n     {\r\n         int arr[] = {2, 1};\r\n         span<int> s1 = arr;\r\n         span<int> s2 = arr;\r\n\r\n         EXPECT_TRUE(s1 == s2);\r\n         EXPECT_FALSE(s1 != s2);\r\n         EXPECT_FALSE(s1 < s2);\r\n         EXPECT_TRUE(s1 <= s2);\r\n         EXPECT_FALSE(s1 > s2);\r\n         EXPECT_TRUE(s1 >= s2);\r\n         EXPECT_TRUE(s2 == s1);\r\n         EXPECT_FALSE(s2 != s1);\r\n         EXPECT_FALSE(s2 < s1);\r\n         EXPECT_TRUE(s2 <= s1);\r\n         EXPECT_FALSE(s2 > s1);\r\n         EXPECT_TRUE(s2 >= s1);\r\n     }\r\n\r\n     {\r\n         int arr[] = {2, 1}; // bigger\r\n\r\n         span<int> s1;\r\n         span<int> s2 = arr;\r\n\r\n         EXPECT_TRUE(s1 != s2);\r\n         EXPECT_TRUE(s2 != s1);\r\n         EXPECT_FALSE(s1 == s2);\r\n         EXPECT_FALSE(s2 == s1);\r\n         EXPECT_TRUE(s1 < s2);\r\n         EXPECT_FALSE(s2 < s1);\r\n         EXPECT_TRUE(s1 <= s2);\r\n         EXPECT_FALSE(s2 <= s1);\r\n         EXPECT_TRUE(s2 > s1);\r\n         EXPECT_FALSE(s1 > s2);\r\n         EXPECT_TRUE(s2 >= s1);\r\n         EXPECT_FALSE(s1 >= s2);\r\n     }\r\n\r\n     {\r\n         int arr1[] = {1, 2};\r\n         int arr2[] = {1, 2};\r\n         span<int> s1 = arr1;\r\n         span<int> s2 = arr2;\r\n\r\n         EXPECT_TRUE(s1 == s2);\r\n         EXPECT_FALSE(s1 != s2);\r\n         EXPECT_FALSE(s1 < s2);\r\n         EXPECT_TRUE(s1 <= s2);\r\n         EXPECT_FALSE(s1 > s2);\r\n         EXPECT_TRUE(s1 >= s2);\r\n         EXPECT_TRUE(s2 == s1);\r\n         EXPECT_FALSE(s2 != s1);\r\n         EXPECT_FALSE(s2 < s1);\r\n         EXPECT_TRUE(s2 <= s1);\r\n         EXPECT_FALSE(s2 > s1);\r\n         EXPECT_TRUE(s2 >= s1);\r\n     }\r\n\r\n     {\r\n         int arr[] = {1, 2, 3};\r\n\r\n         span<int> s1 = {&arr[0], 2}; // shorter\r\n         span<int> s2 = arr;          // longer\r\n\r\n         EXPECT_TRUE(s1 != s2);\r\n         EXPECT_TRUE(s2 != s1);\r\n         EXPECT_FALSE(s1 == s2);\r\n         EXPECT_FALSE(s2 == s1);\r\n         EXPECT_TRUE(s1 < s2);\r\n         EXPECT_FALSE(s2 < s1);\r\n         EXPECT_TRUE(s1 <= s2);\r\n         EXPECT_FALSE(s2 <= s1);\r\n         EXPECT_TRUE(s2 > s1);\r\n         EXPECT_FALSE(s1 > s2);\r\n         EXPECT_TRUE(s2 >= s1);\r\n         EXPECT_FALSE(s1 >= s2);\r\n     }\r\n\r\n     {\r\n         int arr1[] = {1, 2}; // smaller\r\n         int arr2[] = {2, 1}; // bigger\r\n\r\n         span<int> s1 = arr1;\r\n         span<int> s2 = arr2;\r\n\r\n         EXPECT_TRUE(s1 != s2);\r\n         EXPECT_TRUE(s2 != s1);\r\n         EXPECT_FALSE(s1 == s2);\r\n         EXPECT_FALSE(s2 == s1);\r\n         EXPECT_TRUE(s1 < s2);\r\n         EXPECT_FALSE(s2 < s1);\r\n         EXPECT_TRUE(s1 <= s2);\r\n         EXPECT_FALSE(s2 <= s1);\r\n         EXPECT_TRUE(s2 > s1);\r\n         EXPECT_FALSE(s1 > s2);\r\n         EXPECT_TRUE(s2 >= s1);\r\n         EXPECT_FALSE(s1 >= s2);\r\n     }\r\n }\r\n"
  },
  {
    "path": "examples/libraries/GSL/tests/span_tests.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#include <gtest/gtest.h>\n\n#include <gsl/gsl_byte> // for byte\n#include <gsl/gsl_util> // for narrow_cast, at\n#include <gsl/span>     // for span, span_iterator, operator==, operator!=\n\n#include <array>       // for array\n#include <iostream>    // for ptrdiff_t\n#include <iterator>    // for reverse_iterator, operator-, operator==\n#include <memory>      // for unique_ptr, shared_ptr, make_unique, allo...\n#include <regex>       // for match_results, sub_match, match_results<>...\n#include <cstddef>     // for ptrdiff_t\n#include <string>      // for string\n#include <type_traits> // for integral_constant<>::value, is_default_co...\n#include <vector>      // for vector\n#include <utility>\n\nusing namespace std;\nusing namespace gsl;\n\nnamespace\n{\nstatic constexpr char deathstring[] = \"Expected Death\";\n\nstruct BaseClass\n{\n};\nstruct DerivedClass : BaseClass\n{\n};\nstruct AddressOverloaded\n{\n#if (__cplusplus > 201402L)\n    [[maybe_unused]]\n#endif\n    AddressOverloaded\n    operator&() const\n    {\n        return {};\n    }\n};\n} // namespace\n\nTEST(span_test, constructors)\n{\n    span<int> s;\n    EXPECT_TRUE(s.size() == 0);\n    EXPECT_TRUE(s.data() == nullptr);\n\n    span<const int> cs;\n    EXPECT_TRUE(cs.size() == 0);\n    EXPECT_TRUE(cs.data() == nullptr);\n}\n\nTEST(span_test, constructors_with_extent)\n{\n    span<int, 0> s;\n    EXPECT_TRUE(s.size() == 0);\n    EXPECT_TRUE(s.data() == nullptr);\n\n    span<const int, 0> cs;\n    EXPECT_TRUE(cs.size() == 0);\n    EXPECT_TRUE(cs.data() == nullptr);\n}\n\nTEST(span_test, constructors_with_bracket_init)\n{\n    span<int> s{};\n    EXPECT_TRUE(s.size() == 0);\n    EXPECT_TRUE(s.data() == nullptr);\n\n    span<const int> cs{};\n    EXPECT_TRUE(cs.size() == 0);\n    EXPECT_TRUE(cs.data() == nullptr);\n}\n\nTEST(span_test, size_optimization)\n{\n    span<int> s;\n    EXPECT_TRUE(sizeof(s) == sizeof(int*) + sizeof(ptrdiff_t));\n\n    span<int, 0> se;\n    EXPECT_TRUE(sizeof(se) == sizeof(int*));\n}\n\nTEST(span_test, from_nullptr_size_constructor)\n{\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. from_nullptr_size_constructor\";\n        std::abort();\n    });\n    {\n        span<int> s{nullptr, narrow_cast<span<int>::size_type>(0)};\n        EXPECT_TRUE(s.size() == 0);\n        EXPECT_TRUE(s.data() == nullptr);\n\n        span<int> cs{nullptr, narrow_cast<span<int>::size_type>(0)};\n        EXPECT_TRUE(cs.size() == 0);\n        EXPECT_TRUE(cs.data() == nullptr);\n    }\n    {\n        auto workaround_macro = []() {\n            const span<int, 1> s{nullptr, narrow_cast<span<int>::size_type>(0)};\n        };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n    }\n    {\n        auto workaround_macro = []() { const span<int> s{nullptr, 1}; };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n\n        auto const_workaround_macro = []() { const span<const int> s{nullptr, 1}; };\n        EXPECT_DEATH(const_workaround_macro(), deathstring);\n    }\n    {\n        auto workaround_macro = []() { const span<int, 0> s{nullptr, 1}; };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n\n        auto const_workaround_macro = []() { const span<const int, 0> s{nullptr, 1}; };\n        EXPECT_DEATH(const_workaround_macro(), deathstring);\n    }\n    {\n        span<int*> s{nullptr, narrow_cast<span<int>::size_type>(0)};\n        EXPECT_TRUE(s.size() == 0);\n        EXPECT_TRUE(s.data() == nullptr);\n\n        span<const int*> cs{nullptr, narrow_cast<span<int>::size_type>(0)};\n        EXPECT_TRUE(cs.size() == 0);\n        EXPECT_TRUE(cs.data() == nullptr);\n    }\n}\n\nTEST(span_test, from_pointer_length_constructor)\n{\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. from_pointer_length_constructor\";\n        std::abort();\n    });\n    int arr[4] = {1, 2, 3, 4};\n\n    {\n        for (int i = 0; i < 4; ++i)\n        {\n            {\n                span<int> s = {&arr[0], narrow_cast<std::size_t>(i)};\n                EXPECT_TRUE(s.size() == narrow_cast<std::size_t>(i));\n                EXPECT_TRUE(s.data() == &arr[0]);\n                EXPECT_TRUE(s.empty() == (i == 0));\n                for (int j = 0; j < i; ++j)\n                    EXPECT_TRUE(arr[j] == s[narrow_cast<std::size_t>(j)]);\n            }\n            {\n                span<int> s = {&arr[i], 4 - narrow_cast<std::size_t>(i)};\n                EXPECT_TRUE(s.size() == 4 - narrow_cast<std::size_t>(i));\n                EXPECT_TRUE(s.data() == &arr[i]);\n                EXPECT_TRUE(s.empty() == ((4 - i) == 0));\n\n                for (int j = 0; j < 4 - i; ++j)\n                    EXPECT_TRUE(arr[j + i] == s[narrow_cast<std::size_t>(j)]);\n            }\n        }\n    }\n\n    {\n        span<int, 2> s{&arr[0], 2};\n        EXPECT_TRUE(s.size() == 2);\n        EXPECT_TRUE(s.data() == &arr[0]);\n        EXPECT_TRUE(s[0] == 1);\n        EXPECT_TRUE(s[1] == 2);\n    }\n\n    {\n        int* p = nullptr;\n        span<int> s{p, narrow_cast<span<int>::size_type>(0)};\n        EXPECT_TRUE(s.size() == 0);\n        EXPECT_TRUE(s.data() == nullptr);\n    }\n\n    {\n        int* p = nullptr;\n        auto workaround_macro = [=]() { const span<int> s{p, 2}; };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n    }\n}\n\nTEST(span_test, from_pointer_pointer_construction)\n{\n    int arr[4] = {1, 2, 3, 4};\n\n    {\n        span<int> s{&arr[0], &arr[2]};\n        EXPECT_TRUE(s.size() == 2);\n        EXPECT_TRUE(s.data() == &arr[0]);\n        EXPECT_TRUE(s[0] == 1);\n        EXPECT_TRUE(s[1] == 2);\n    }\n    {\n        span<int, 2> s{&arr[0], &arr[2]};\n        EXPECT_TRUE(s.size() == 2);\n        EXPECT_TRUE(s.data() == &arr[0]);\n        EXPECT_TRUE(s[0] == 1);\n        EXPECT_TRUE(s[1] == 2);\n    }\n\n    {\n        span<int> s{&arr[0], &arr[0]};\n        EXPECT_TRUE(s.size() == 0);\n        EXPECT_TRUE(s.data() == &arr[0]);\n    }\n\n    {\n        span<int, 0> s{&arr[0], &arr[0]};\n        EXPECT_TRUE(s.size() == 0);\n        EXPECT_TRUE(s.data() == &arr[0]);\n    }\n\n    // this will fail the std::distance() precondition, which asserts on MSVC debug builds\n    //{\n    //    auto workaround_macro = [&]() { span<int> s{&arr[1], &arr[0]}; };\n    //    EXPECT_DEATH(workaround_macro(), deathstring);\n    //}\n\n    // this will fail the std::distance() precondition, which asserts on MSVC debug builds\n    //{\n    //    int* p = nullptr;\n    //    auto workaround_macro = [&]() { span<int> s{&arr[0], p}; };\n    //    EXPECT_DEATH(workaround_macro(), deathstring);\n    //}\n\n    {\n        int* p = nullptr;\n        span<int> s{p, p};\n        EXPECT_TRUE(s.size() == 0);\n        EXPECT_TRUE(s.data() == nullptr);\n    }\n\n    {\n        int* p = nullptr;\n        span<int, 0> s{p, p};\n        EXPECT_TRUE(s.size() == 0);\n        EXPECT_TRUE(s.data() == nullptr);\n    }\n\n    // this will fail the std::distance() precondition, which asserts on MSVC debug builds\n    //{\n    //    int* p = nullptr;\n    //    auto workaround_macro = [&]() { span<int> s{&arr[0], p}; };\n    //    EXPECT_DEATH(workaround_macro(), deathstring);\n    //}\n}\n\nTEST(span_test, from_array_constructor)\n {\n     int arr[5] = {1, 2, 3, 4, 5};\n\n     {\n         const span<int> s{arr};\n         EXPECT_TRUE(s.size() == 5);\n         EXPECT_TRUE(s.data() == &arr[0]);\n     }\n\n     {\n         const span<int, 5> s{arr};\n         EXPECT_TRUE(s.size() == 5);\n         EXPECT_TRUE(s.data() == &arr[0]);\n     }\n\n     int arr2d[2][3] = {1, 2, 3, 4, 5, 6};\n\n #ifdef CONFIRM_COMPILATION_ERRORS\n     {\n         span<int, 6> s{arr};\n     }\n\n     {\n         span<int, 0> s{arr};\n         EXPECT_TRUE(s.size() == 0);\n         EXPECT_TRUE(s.data() == &arr[0]);\n     }\n\n     {\n         span<int> s{arr2d};\n         EXPECT_TRUE(s.size() == 6);\n         EXPECT_TRUE(s.data() == &arr2d[0][0]);\n         EXPECT_TRUE(s[0] == 1);\n         EXPECT_TRUE(s[5] == 6);\n     }\n\n     {\n         span<int, 0> s{arr2d};\n         EXPECT_TRUE(s.size() == 0);\n         EXPECT_TRUE(s.data() == &arr2d[0][0]);\n     }\n\n     {\n         span<int, 6> s{arr2d};\n     }\n #endif\n     {\n         const span<int[3]> s{std::addressof(arr2d[0]), 1};\n         EXPECT_TRUE(s.size() == 1);\n         EXPECT_TRUE(s.data() == std::addressof(arr2d[0]));\n     }\n\n     int arr3d[2][3][2] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};\n\n #ifdef CONFIRM_COMPILATION_ERRORS\n     {\n         span<int> s{arr3d};\n         EXPECT_TRUE(s.size() == 12);\n         EXPECT_TRUE(s.data() == &arr3d[0][0][0]);\n         EXPECT_TRUE(s[0] == 1);\n         EXPECT_TRUE(s[11] == 12);\n     }\n\n     {\n         span<int, 0> s{arr3d};\n         EXPECT_TRUE(s.size() == 0);\n         EXPECT_TRUE(s.data() == &arr3d[0][0][0]);\n     }\n\n     {\n         span<int, 11> s{arr3d};\n     }\n\n     {\n         span<int, 12> s{arr3d};\n         EXPECT_TRUE(s.size() == 12);\n         EXPECT_TRUE(s.data() == &arr3d[0][0][0]);\n         EXPECT_TRUE(s[0] == 1);\n         EXPECT_TRUE(s[5] == 6);\n     }\n #endif\n     {\n         const span<int[3][2]> s{std::addressof(arr3d[0]), 1};\n         EXPECT_TRUE(s.size() ==  1);\n     }\n\n     AddressOverloaded ao_arr[5] = {};\n\n     {\n         const span<AddressOverloaded, 5> s{ao_arr};\n         EXPECT_TRUE(s.size() == 5);\n         EXPECT_TRUE(s.data() == std::addressof(ao_arr[0]));\n     }\n }\n\n TEST(span_test, from_dynamic_array_constructor)\n {\n     double(*arr)[3][4] = new double[100][3][4];\n\n     {\n         span<double> s(&arr[0][0][0], 10);\n         EXPECT_TRUE(s.size() == 10);\n         EXPECT_TRUE(s.data() == &arr[0][0][0]);\n     }\n\n     delete[] arr;\n }\n\n TEST(span_test, from_std_array_constructor)\n {\n     std::array<int, 4> arr = {1, 2, 3, 4};\n\n     {\n         span<int> s{arr};\n         EXPECT_TRUE(s.size() == arr.size());\n         EXPECT_TRUE(s.data() == arr.data());\n\n         span<const int> cs{arr};\n         EXPECT_TRUE(cs.size() == arr.size());\n         EXPECT_TRUE(cs.data() == arr.data());\n     }\n\n     {\n         span<int, 4> s{arr};\n         EXPECT_TRUE(s.size() == arr.size());\n         EXPECT_TRUE(s.data() == arr.data());\n\n         span<const int, 4> cs{arr};\n         EXPECT_TRUE(cs.size() == arr.size());\n         EXPECT_TRUE(cs.data() == arr.data());\n     }\n\n     {\n         std::array<int, 0> empty_arr{};\n         span<int> s{empty_arr};\n         EXPECT_TRUE(s.size() == 0);\n         EXPECT_TRUE(s.empty());\n     }\n\n     std::array<AddressOverloaded, 4> ao_arr{};\n\n     {\n         span<AddressOverloaded, 4> fs{ao_arr};\n         EXPECT_TRUE(fs.size() == ao_arr.size());\n         EXPECT_TRUE(ao_arr.data() == fs.data());\n     }\n\n #ifdef CONFIRM_COMPILATION_ERRORS\n     {\n         span<int, 2> s{arr};\n         EXPECT_TRUE(s.size() == 2);\n         EXPECT_TRUE(s.data() == arr.data());\n\n         span<const int, 2> cs{arr};\n         EXPECT_TRUE(cs.size() == 2);\n         EXPECT_TRUE(cs.data() == arr.data());\n     }\n\n     {\n         span<int, 0> s{arr};\n         EXPECT_TRUE(s.size() == 0);\n         EXPECT_TRUE(s.data() == arr.data());\n\n         span<const int, 0> cs{arr};\n         EXPECT_TRUE(cs.size() == 0);\n         EXPECT_TRUE(cs.data() == arr.data());\n     }\n\n     {\n         span<int, 5> s{arr};\n     }\n\n     {\n         auto get_an_array = []() -> std::array<int, 4> { return {1, 2, 3, 4}; };\n         auto take_a_span = [](span<int> s) { static_cast<void>(s); };\n         // try to take a temporary std::array\n         take_a_span(get_an_array());\n     }\n #endif\n\n     {\n         auto get_an_array = []() -> std::array<int, 4> { return {1, 2, 3, 4}; };\n         auto take_a_span = [](span<const int> s) { static_cast<void>(s); };\n         // try to take a temporary std::array\n         take_a_span(get_an_array());\n     }\n }\n\n TEST(span_test, from_const_std_array_constructor)\n {\n     const std::array<int, 4> arr = {1, 2, 3, 4};\n\n     {\n         span<const int> s{arr};\n         EXPECT_TRUE(s.size() == arr.size());\n         EXPECT_TRUE(s.data() == arr.data());\n     }\n\n     {\n         span<const int, 4> s{arr};\n         EXPECT_TRUE(s.size() == arr.size());\n         EXPECT_TRUE(s.data() == arr.data());\n     }\n\n     const std::array<AddressOverloaded, 4> ao_arr{};\n\n     {\n         span<const AddressOverloaded, 4> s{ao_arr};\n         EXPECT_TRUE(s.size() == ao_arr.size());\n         EXPECT_TRUE(s.data() == ao_arr.data());\n     }\n\n #ifdef CONFIRM_COMPILATION_ERRORS\n     {\n         span<const int, 2> s{arr};\n         EXPECT_TRUE(s.size() == 2);\n         EXPECT_TRUE(s.data() == arr.data());\n     }\n\n     {\n         span<const int, 0> s{arr};\n         EXPECT_TRUE(s.size() == 0);\n         EXPECT_TRUE(s.data() == arr.data());\n     }\n\n     {\n         span<const int, 5> s{arr};\n     }\n #endif\n\n     {\n         auto get_an_array = []() -> const std::array<int, 4> { return {1, 2, 3, 4}; };\n         auto take_a_span = [](span<const int> s) { static_cast<void>(s); };\n         // try to take a temporary std::array\n         take_a_span(get_an_array());\n     }\n }\n\n TEST(span_test, from_std_array_const_constructor)\n {\n     std::array<const int, 4> arr = {1, 2, 3, 4};\n\n     {\n         span<const int> s{arr};\n         EXPECT_TRUE(s.size() == arr.size());\n         EXPECT_TRUE(s.data() == arr.data());\n     }\n\n     {\n         span<const int, 4> s{arr};\n         EXPECT_TRUE(s.size() ==  arr.size());\n         EXPECT_TRUE(s.data() == arr.data());\n     }\n\n #ifdef CONFIRM_COMPILATION_ERRORS\n     {\n         span<const int, 2> s{arr};\n         EXPECT_TRUE(s.size() == 2);\n         EXPECT_TRUE(s.data() == arr.data());\n     }\n\n     {\n         span<const int, 0> s{arr};\n         EXPECT_TRUE(s.size() == 0);\n         EXPECT_TRUE(s.data() == arr.data());\n     }\n\n     {\n         span<const int, 5> s{arr};\n     }\n\n     {\n         span<int, 4> s{arr};\n     }\n #endif\n }\n\n TEST(span_test, from_container_constructor)\n {\n     std::vector<int> v = {1, 2, 3};\n     const std::vector<int> cv = v;\n\n     {\n         span<int> s{v};\n         EXPECT_TRUE(s.size() == v.size());\n         EXPECT_TRUE(s.data() == v.data());\n\n         span<const int> cs{v};\n         EXPECT_TRUE(cs.size() == v.size());\n         EXPECT_TRUE(cs.data() == v.data());\n     }\n\n     std::string str = \"hello\";\n     const std::string cstr = \"hello\";\n\n     {\n #ifdef CONFIRM_COMPILATION_ERRORS\n         span<char> s{str};\n         EXPECT_TRUE(s.size() == str.size());\n         EXPECT_TRUE(s.data() == str.data()));\n #endif\n         span<const char> cs{str};\n         EXPECT_TRUE(cs.size() == str.size());\n         EXPECT_TRUE(cs.data() == str.data());\n     }\n\n     {\n #ifdef CONFIRM_COMPILATION_ERRORS\n         span<char> s{cstr};\n #endif\n         span<const char> cs{cstr};\n         EXPECT_TRUE(cs.size() == cstr.size());\n         EXPECT_TRUE(cs.data() == cstr.data());\n     }\n\n     {\n #ifdef CONFIRM_COMPILATION_ERRORS\n         auto get_temp_vector = []() -> std::vector<int> { return {}; };\n         auto use_span = [](span<int> s) { static_cast<void>(s); };\n         use_span(get_temp_vector());\n #endif\n     }\n\n     {\n         auto get_temp_vector = []() -> std::vector<int> { return {}; };\n         auto use_span = [](span<const int> s) { static_cast<void>(s); };\n         use_span(get_temp_vector());\n     }\n\n     {\n #ifdef CONFIRM_COMPILATION_ERRORS\n         auto get_temp_string = []() -> std::string { return {}; };\n         auto use_span = [](span<char> s) { static_cast<void>(s); };\n         use_span(get_temp_string());\n #endif\n     }\n\n     {\n         auto get_temp_string = []() -> std::string { return {}; };\n         auto use_span = [](span<const char> s) { static_cast<void>(s); };\n         use_span(get_temp_string());\n     }\n\n     {\n #ifdef CONFIRM_COMPILATION_ERRORS\n         auto get_temp_vector = []() -> const std::vector<int> { return {}; };\n         auto use_span = [](span<const char> s) { static_cast<void>(s); };\n         use_span(get_temp_vector());\n #endif\n     }\n\n     {\n         auto get_temp_string = []() -> const std::string { return {}; };\n         auto use_span = [](span<const char> s) { static_cast<void>(s); };\n         use_span(get_temp_string());\n     }\n\n     {\n #ifdef CONFIRM_COMPILATION_ERRORS\n         std::map<int, int> m;\n         span<int> s{m};\n #endif\n     }\n }\n\n TEST(span_test, from_convertible_span_constructor){{span<DerivedClass> avd;\n span<const DerivedClass> avcd = avd;\n static_cast<void>(avcd);\n }\n\n {\n #ifdef CONFIRM_COMPILATION_ERRORS\n     span<DerivedClass> avd;\n     span<BaseClass> avb = avd;\n     static_cast<void>(avb);\n #endif\n }\n\n #ifdef CONFIRM_COMPILATION_ERRORS\n {\n     span<int> s;\n     span<unsigned int> s2 = s;\n     static_cast<void>(s2);\n }\n\n {\n     span<int> s;\n     span<const unsigned int> s2 = s;\n     static_cast<void>(s2);\n }\n\n {\n     span<int> s;\n     span<short> s2 = s;\n     static_cast<void>(s2);\n }\n #endif\n }\n\n TEST(span_test, copy_move_and_assignment)\n {\n     span<int> s1;\n     EXPECT_TRUE(s1.empty());\n\n     int arr[] = {3, 4, 5};\n\n     span<const int> s2 = arr;\n     EXPECT_TRUE(s2.size() ==  3);\n     EXPECT_TRUE(s2.data() == &arr[0]);\n\n     s2 = s1;\n     EXPECT_TRUE(s2.empty());\n\n     auto get_temp_span = [&]() -> span<int> { return {&arr[1], 2}; };\n     auto use_span = [&](span<const int> s) {\n         EXPECT_TRUE(s.size() ==  2);\n         EXPECT_TRUE(s.data() == &arr[1]);\n     }; use_span(get_temp_span());\n\n     s1 = get_temp_span();\n     EXPECT_TRUE(s1.size() ==  2);\n     EXPECT_TRUE(s1.data() == &arr[1]);\n }\n\n TEST(span_test, first)\n {\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. first\";\n        std::abort();\n    });\n     int arr[5] = {1, 2, 3, 4, 5};\n\n     {\n         span<int, 5> av = arr;\n         EXPECT_TRUE(av.first<2>().size() == 2);\n         EXPECT_TRUE(av.first(2).size() == 2);\n     }\n\n     {\n         span<int, 5> av = arr;\n         EXPECT_TRUE(av.first<0>().size() == 0);\n         EXPECT_TRUE(av.first(0).size() == 0);\n     }\n\n     {\n         span<int, 5> av = arr;\n         EXPECT_TRUE(av.first<5>().size() == 5);\n         EXPECT_TRUE(av.first(5).size() == 5);\n     }\n\n     {\n         span<int, 5> av = arr;\n #ifdef CONFIRM_COMPILATION_ERRORS\n         EXPECT_TRUE(av.first<6>().size() == 6);\n         EXPECT_TRUE(av.first<-1>().size() == -1);\n #endif\n         EXPECT_DEATH(av.first(6).size(), deathstring);\n     }\n\n     {\n         span<int> av;\n         EXPECT_TRUE(av.first<0>().size() == 0);\n         EXPECT_TRUE(av.first(0).size() == 0);\n     }\n }\n\n TEST(span_test, last)\n {\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. last\";\n        std::abort();\n    });\n     int arr[5] = {1, 2, 3, 4, 5};\n\n     {\n         span<int, 5> av = arr;\n         EXPECT_TRUE(av.last<2>().size() == 2);\n         EXPECT_TRUE(av.last(2).size() == 2);\n     }\n\n     {\n         span<int, 5> av = arr;\n         EXPECT_TRUE(av.last<0>().size() == 0);\n         EXPECT_TRUE(av.last(0).size() == 0);\n     }\n\n     {\n         span<int, 5> av = arr;\n         EXPECT_TRUE(av.last<5>().size() == 5);\n         EXPECT_TRUE(av.last(5).size() == 5);\n     }\n\n     {\n         span<int, 5> av = arr;\n #ifdef CONFIRM_COMPILATION_ERRORS\n         EXPECT_TRUE(av.last<6>().size() == 6);\n #endif\n         EXPECT_DEATH(av.last(6).size(), deathstring);\n     }\n\n     {\n         span<int> av;\n         EXPECT_TRUE(av.last<0>().size() == 0);\n         EXPECT_TRUE(av.last(0).size() == 0);\n     }\n }\n\n TEST(span_test, subspan)\n {\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. subspan\";\n        std::abort();\n    });\n     int arr[5] = {1, 2, 3, 4, 5};\n\n     {\n         span<int, 5> av = arr;\n         EXPECT_TRUE((av.subspan<2, 2>().size()) == 2);\n         EXPECT_TRUE(decltype(av.subspan<2, 2>())::extent == 2);\n         EXPECT_TRUE(av.subspan(2, 2).size() == 2);\n         EXPECT_TRUE(av.subspan(2, 3).size() == 3);\n     }\n\n     {\n         span<int, 5> av = arr;\n         EXPECT_TRUE((av.subspan<0, 0>().size()) == 0);\n         EXPECT_TRUE(decltype(av.subspan<0, 0>())::extent == 0);\n         EXPECT_TRUE(av.subspan(0, 0).size() == 0);\n     }\n\n     {\n         span<int, 5> av = arr;\n         EXPECT_TRUE((av.subspan<0, 5>().size()) == 5);\n         EXPECT_TRUE(decltype(av.subspan<0, 5>())::extent == 5);\n         EXPECT_TRUE(av.subspan(0, 5).size() == 5);\n\n         EXPECT_DEATH(av.subspan(0, 6).size(), deathstring);\n         EXPECT_DEATH(av.subspan(1, 5).size(), deathstring);\n     }\n\n     {\n         span<int, 5> av = arr;\n         EXPECT_TRUE((av.subspan<4, 0>().size()) == 0);\n         EXPECT_TRUE(decltype(av.subspan<4, 0>())::extent == 0);\n         EXPECT_TRUE(av.subspan(4, 0).size() == 0);\n         EXPECT_TRUE(av.subspan(5, 0).size() == 0);\n         EXPECT_DEATH(av.subspan(6, 0).size(), deathstring);\n     }\n\n     {\n         span<int, 5> av = arr;\n         EXPECT_TRUE(av.subspan<1>().size() == 4);\n         EXPECT_TRUE(decltype(av.subspan<1>())::extent == 4);\n     }\n\n     {\n         span<int> av;\n         EXPECT_TRUE((av.subspan<0, 0>().size()) == 0);\n         EXPECT_TRUE(decltype(av.subspan<0, 0>())::extent == 0);\n         EXPECT_TRUE(av.subspan(0, 0).size() == 0);\n         EXPECT_DEATH((av.subspan<1, 0>().size()), deathstring);\n     }\n\n     {\n         span<int> av;\n         EXPECT_TRUE(av.subspan(0).size() == 0);\n         EXPECT_DEATH(av.subspan(1).size(), deathstring);\n     }\n\n     {\n         span<int> av = arr;\n         EXPECT_TRUE(av.subspan(0).size() == 5);\n         EXPECT_TRUE(av.subspan(1).size() == 4);\n         EXPECT_TRUE(av.subspan(4).size() == 1);\n         EXPECT_TRUE(av.subspan(5).size() == 0);\n         EXPECT_DEATH(av.subspan(6).size(), deathstring);\n         const auto av2 = av.subspan(1);\n         for (std::size_t i = 0; i < 4; ++i) EXPECT_TRUE(av2[i] == static_cast<int>(i) + 2);\n     }\n\n     {\n         span<int, 5> av = arr;\n         EXPECT_TRUE(av.subspan(0).size() == 5);\n         EXPECT_TRUE(av.subspan(1).size() == 4);\n         EXPECT_TRUE(av.subspan(4).size() == 1);\n         EXPECT_TRUE(av.subspan(5).size() == 0);\n         EXPECT_DEATH(av.subspan(6).size(), deathstring);\n         const auto av2 = av.subspan(1);\n         for (std::size_t i = 0; i < 4; ++i) EXPECT_TRUE(av2[i] == static_cast<int>(i) + 2);\n     }\n }\n\n TEST(span_test, iterator_default_init)\n {\n     span<int>::iterator it1;\n     span<int>::iterator it2;\n     EXPECT_TRUE(it1 == it2);\n }\n\n TEST(span_test, iterator_comparisons)\n {\n     int a[] = {1, 2, 3, 4};\n     {\n         span<int> s = a;\n         span<int>::iterator it = s.begin();\n         auto it2 = it + 1;\n\n         EXPECT_TRUE(it == it);\n         EXPECT_TRUE(it == s.begin());\n         EXPECT_TRUE(s.begin() == it);\n\n         EXPECT_TRUE(it != it2);\n         EXPECT_TRUE(it2 != it);\n         EXPECT_TRUE(it != s.end());\n         EXPECT_TRUE(it2 != s.end());\n         EXPECT_TRUE(s.end() != it);\n\n         EXPECT_TRUE(it < it2);\n         EXPECT_TRUE(it <= it2);\n         EXPECT_TRUE(it2 <= s.end());\n         EXPECT_TRUE(it < s.end());\n\n         EXPECT_TRUE(it2 > it);\n         EXPECT_TRUE(it2 >= it);\n         EXPECT_TRUE(s.end() > it2);\n         EXPECT_TRUE(s.end() >= it2);\n     }\n }\n\n TEST(span_test, incomparable_iterators)\n {\n     std::set_terminate([] {\n         std::cerr << \"Expected Death. incomparable_iterators\";\n         std::abort();\n     });\n\n     int a[] = {1, 2, 3, 4};\n     int b[] = {1, 2, 3, 4};\n     {\n         span<int> s = a;\n         span<int> s2 = b;\n#if (__cplusplus > 201402L)\n         EXPECT_DEATH([[maybe_unused]] bool _ = (s.begin() == s2.begin()), deathstring);\n         EXPECT_DEATH([[maybe_unused]] bool _ = (s.begin() <= s2.begin()), deathstring);\n#else\n         EXPECT_DEATH(bool _ = (s.begin() == s2.begin()), deathstring);\n         EXPECT_DEATH(bool _ = (s.begin() <= s2.begin()), deathstring);\n#endif\n     }\n }\n\n TEST(span_test, begin_end)\n {\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. begin_end\";\n        std::abort();\n    });\n     {\n         int a[] = {1, 2, 3, 4};\n         span<int> s = a;\n\n         span<int>::iterator it = s.begin();\n         span<int>::iterator it2 = std::begin(s);\n         EXPECT_TRUE(it == it2);\n\n         it = s.end();\n         it2 = std::end(s);\n         EXPECT_TRUE(it == it2);\n     }\n\n     {\n         int a[] = {1, 2, 3, 4};\n         span<int> s = a;\n\n         auto it = s.begin();\n         auto first = it;\n         EXPECT_TRUE(it == first);\n         EXPECT_TRUE(*it == 1);\n\n         auto beyond = s.end();\n         EXPECT_TRUE(it != beyond);\n         EXPECT_DEATH(*beyond, deathstring);\n\n         EXPECT_TRUE(beyond - first == 4);\n         EXPECT_TRUE(first - first == 0);\n         EXPECT_TRUE(beyond - beyond == 0);\n\n         ++it;\n         EXPECT_TRUE(it - first == 1);\n         EXPECT_TRUE(*it == 2);\n         *it = 22;\n         EXPECT_TRUE(*it == 22);\n         EXPECT_TRUE(beyond - it == 3);\n\n         it = first;\n         EXPECT_TRUE(it == first);\n         while (it != s.end())\n         {\n             *it = 5;\n             ++it;\n         }\n\n         EXPECT_TRUE(it == beyond);\n         EXPECT_TRUE(it - beyond == 0);\n\n         for (const auto& n : s) { EXPECT_TRUE(n == 5); }\n     }\n }\n\n TEST(span_test, rbegin_rend)\n {\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. rbegin_rend\";\n        std::abort();\n    });\n     {\n         int a[] = {1, 2, 3, 4};\n         span<int> s = a;\n\n         auto it = s.rbegin();\n         auto first = it;\n         EXPECT_TRUE(it == first);\n         EXPECT_TRUE(*it == 4);\n\n         auto beyond = s.rend();\n         EXPECT_TRUE(it != beyond);\n#if (__cplusplus > 201402L)\n        EXPECT_DEATH([[maybe_unused]] auto _ = *beyond , deathstring);\n#else\n        EXPECT_DEATH(auto _ = *beyond , deathstring);\n#endif\n\n         EXPECT_TRUE(beyond - first == 4);\n         EXPECT_TRUE(first - first == 0);\n         EXPECT_TRUE(beyond - beyond == 0);\n\n         ++it;\n         EXPECT_TRUE(it - s.rbegin() == 1);\n         EXPECT_TRUE(*it == 3);\n         *it = 22;\n         EXPECT_TRUE(*it == 22);\n         EXPECT_TRUE(beyond - it == 3);\n\n         it = first;\n         EXPECT_TRUE(it == first);\n         while (it != s.rend())\n         {\n             *it = 5;\n             ++it;\n         }\n\n         EXPECT_TRUE(it == beyond);\n         EXPECT_TRUE(it - beyond == 0);\n\n         for (const auto& n : s) { EXPECT_TRUE(n == 5); }\n     }\n }\n\n TEST(span_test, as_bytes)\n {\n     std::set_terminate([] {\n         std::cerr << \"Expected Death. as_bytes\";\n         std::abort();\n     });\n\n     int a[] = {1, 2, 3, 4};\n     {\n         const span<const int> s = a;\n         EXPECT_TRUE(s.size() == 4);\n         const span<const byte> bs = as_bytes(s);\n         EXPECT_TRUE(static_cast<const void*>(bs.data()) == static_cast<const void*>(s.data()));\n         EXPECT_TRUE(bs.size() == s.size_bytes());\n     }\n\n     {\n         span<int> s;\n         const auto bs = as_bytes(s);\n         EXPECT_TRUE(bs.size() == s.size());\n         EXPECT_TRUE(bs.size() == 0);\n         EXPECT_TRUE(bs.size_bytes() == 0);\n         EXPECT_TRUE(static_cast<const void*>(bs.data()) == static_cast<const void*>(s.data()));\n         EXPECT_TRUE(bs.data() == nullptr);\n     }\n\n     {\n         span<int> s = a;\n         const auto bs = as_bytes(s);\n         EXPECT_TRUE(static_cast<const void*>(bs.data()) == static_cast<const void*>(s.data()));\n         EXPECT_TRUE(bs.size() == s.size_bytes());\n     }\n\n     int b[5] = {1, 2, 3, 4, 5};\n     {\n         span<int> sp(begin(b), static_cast<size_t>(-2));\n         EXPECT_DEATH((void) sp.size_bytes(), deathstring);\n     }\n }\n\n TEST(span_test, as_writable_bytes)\n {\n     int a[] = {1, 2, 3, 4};\n\n     {\n #ifdef CONFIRM_COMPILATION_ERRORS\n         // you should not be able to get writeable bytes for const objects\n         span<const int> s = a;\n         EXPECT_TRUE(s.size() == 4);\n         span<const byte> bs = as_writable_bytes(s);\n         EXPECT_TRUE(static_cast<void*>(bs.data()) == static_cast<void*>(s.data()));\n         EXPECT_TRUE(bs.size() == s.size_bytes());\n #endif\n     }\n\n     {\n         span<int> s;\n         const auto bs = as_writable_bytes(s);\n         EXPECT_TRUE(bs.size() == s.size());\n         EXPECT_TRUE(bs.size() == 0);\n         EXPECT_TRUE(bs.size_bytes() == 0);\n         EXPECT_TRUE(static_cast<void*>(bs.data()) == static_cast<void*>(s.data()));\n         EXPECT_TRUE(bs.data() == nullptr);\n     }\n\n     {\n         span<int> s = a;\n         const auto bs = as_writable_bytes(s);\n         EXPECT_TRUE(static_cast<void*>(bs.data()) == static_cast<void*>(s.data()));\n         EXPECT_TRUE(bs.size() == s.size_bytes());\n     }\n }\n\n TEST(span_test, fixed_size_conversions)\n {\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. fixed_size_conversions\";\n        std::abort();\n    });\n     int arr[] = {1, 2, 3, 4};\n\n     // converting to an span from an equal size array is ok\n     span<int, 4> s4 = arr;\n     EXPECT_TRUE(s4.size() == 4);\n\n     // converting to dynamic_range is always ok\n     {\n         span<int> s = s4;\n         EXPECT_TRUE(s.size() == s4.size());\n         static_cast<void>(s);\n     }\n\n // initialization or assignment to static span that REDUCES size is NOT ok\n #ifdef CONFIRM_COMPILATION_ERRORS\n     {\n         span<int, 2> s = arr;\n     }\n     {\n         span<int, 2> s2 = s4;\n         static_cast<void>(s2);\n     }\n #endif\n\n     // even when done dynamically\n     {\n         /*\n         // this now results in a compile-time error, rather than runtime.\n         // There is no suitable conversion from dynamic span to fixed span.\n         span<int> s = arr;\n         auto f = [&]() {\n             const span<int, 2> s2 = s;\n             static_cast<void>(s2);\n         };\n         EXPECT_DEATH(f(), deathstring);\n         */\n     }\n\n     // but doing so explicitly is ok\n\n     // you can convert statically\n     {\n         const span<int, 2> s2 = {&arr[0], 2};\n         static_cast<void>(s2);\n     }\n     {\n         const span<int, 1> s1 = s4.first<1>();\n         static_cast<void>(s1);\n     }\n\n    /*\n     // this is not a legal operation in std::span, so we are no longer supporting it\n     // conversion from span<int, 4> to span<int, dynamic_extent> via call to `first`\n     // then convert from span<int, dynamic_extent> to span<int, 1>\n     // The dynamic to fixed extents are not supported in the standard\n     // to make this work, span<int, 1> would need to be span<int>.\n     {\n\n         // NB: implicit conversion to span<int,1> from span<int>\n         span<int, 1> s1 = s4.first(1);\n         static_cast<void>(s1);\n     }\n     */\n\n     // initialization or assignment to static span that requires size INCREASE is not ok.\n     int arr2[2] = {1, 2};\n\n #ifdef CONFIRM_COMPILATION_ERRORS\n     {\n         span<int, 4> s3 = arr2;\n     }\n     {\n         span<int, 2> s2 = arr2;\n         span<int, 4> s4a = s2;\n     }\n #endif\n     {\n         auto f = [&]() {\n             const span<int, 4> _s4 = {arr2, 2};\n             static_cast<void>(_s4);\n         };\n         EXPECT_DEATH(f(), deathstring);\n     }\n\n    /*\n     // This no longer compiles. There is no suitable conversion from dynamic span to a fixed size span.\n     // this should fail - we are trying to assign a small dynamic span to a fixed_size larger one\n     span<int> av = arr2; auto f = [&]() {\n         const span<int, 4> _s4 = av;\n         static_cast<void>(_s4);\n     };\n     EXPECT_DEATH(f(), deathstring);\n     */\n }\n\n TEST(span_test, interop_with_std_regex)\n {\n     char lat[] = {'1', '2', '3', '4', '5', '6', 'E', 'F', 'G'};\n     span<char> s = lat;\n     const auto f_it = s.begin() + 7;\n\n     std::match_results<span<char>::iterator> match;\n\n     std::regex_match(s.begin(), s.end(), match, std::regex(\".*\"));\n     EXPECT_TRUE(match.ready());\n     EXPECT_FALSE(match.empty());\n     EXPECT_TRUE(match[0].matched);\n     EXPECT_TRUE(match[0].first == s.begin());\n     EXPECT_TRUE(match[0].second == s.end());\n\n     std::regex_search(s.begin(), s.end(), match, std::regex(\"F\"));\n     EXPECT_TRUE(match.ready());\n     EXPECT_FALSE(match.empty());\n     EXPECT_TRUE(match[0].matched);\n     EXPECT_TRUE(match[0].first == f_it);\n     EXPECT_TRUE(match[0].second == (f_it + 1));\n }\n\n TEST(span_test, default_constructible)\n {\n     EXPECT_TRUE((std::is_default_constructible<span<int>>::value));\n     EXPECT_TRUE((std::is_default_constructible<span<int, 0>>::value));\n     EXPECT_FALSE((std::is_default_constructible<span<int, 42>>::value));\n }\n\n TEST(span_test, front_back)\n {\n    int arr[5] = {1,2,3,4,5};\n    span<int> s{arr};\n    EXPECT_TRUE(s.front() == 1);\n    EXPECT_TRUE(s.back() == 5);\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. front_back\";\n        std::abort();\n    });\n    span<int> s2;\n    EXPECT_DEATH(s2.front(), deathstring);\n    EXPECT_DEATH(s2.back(), deathstring);\n }\n"
  },
  {
    "path": "examples/libraries/GSL/tests/strict_notnull_tests.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#include <gtest/gtest.h>\n#include <gsl/pointers>           // for not_null, operator<, operator<=, operator>\n\nnamespace gsl\n{\nstruct fail_fast;\n} // namespace gsl\n\nusing namespace gsl;\n\nGSL_SUPPRESS(f.4)  // NO-FORMAT: attribute\nbool helper(not_null<int*> p) { return *p == 12; }\n\nGSL_SUPPRESS(f.4) // NO-FORMAT: attribute\nbool helper_const(not_null<const int*> p) { return *p == 12; }\n\nGSL_SUPPRESS(f.4) // NO-FORMAT: attribute\nbool strict_helper(strict_not_null<int*> p) { return *p == 12; }\n\nGSL_SUPPRESS(f.4) // NO-FORMAT: attribute\nbool strict_helper_const(strict_not_null<const int*> p) { return *p == 12; }\n\nint* return_pointer() { return nullptr; }\nconst int* return_pointer_const() { return nullptr; }\n\nTEST(strict_notnull_tests, TestStrictNotNull)\n{\n    {\n        // raw ptr <-> strict_not_null\n        int x = 42;\n\n#ifdef CONFIRM_COMPILATION_ERRORS\n        strict_not_null<int*> snn = &x;\n        strict_helper(&x);\n        strict_helper_const(&x);\n        strict_helper(return_pointer());\n        strict_helper_const(return_pointer_const());\n#endif\n\n        const strict_not_null<int*> snn1{&x};\n\n        helper(snn1);\n        helper_const(snn1);\n\n        EXPECT_TRUE(*snn1 == 42);\n    }\n\n    {\n        // strict_not_null -> strict_not_null\n        int x = 42;\n\n        strict_not_null<int*> snn1{&x};\n        const strict_not_null<int*> snn2{&x};\n\n        strict_helper(snn1);\n        strict_helper_const(snn1);\n        strict_helper_const(snn2);\n\n        EXPECT_TRUE(snn1 == snn2);\n    }\n\n    {\n        // strict_not_null -> not_null\n        int x = 42;\n\n        strict_not_null<int*> snn{&x};\n\n        const not_null<int*> nn1 = snn;\n        const not_null<int*> nn2{snn};\n\n        helper(snn);\n        helper_const(snn);\n\n        EXPECT_TRUE(snn == nn1);\n        EXPECT_TRUE(snn == nn2);\n    }\n\n    {\n        // not_null -> strict_not_null\n        int x = 42;\n\n        not_null<int*> nn{&x};\n\n        const strict_not_null<int*> snn1{nn};\n        const strict_not_null<int*> snn2{nn};\n\n        strict_helper(nn);\n        strict_helper_const(nn);\n\n        EXPECT_TRUE(snn1 == nn);\n        EXPECT_TRUE(snn2 == nn);\n\n        std::hash<strict_not_null<int*>> hash_snn;\n        std::hash<not_null<int*>> hash_nn;\n\n        EXPECT_TRUE(hash_nn(snn1) == hash_nn(nn));\n        EXPECT_TRUE(hash_snn(snn1) == hash_nn(nn));\n        EXPECT_TRUE(hash_nn(snn1) == hash_nn(snn2));\n        EXPECT_TRUE(hash_snn(snn1) == hash_snn(nn));\n    }\n\n#ifdef CONFIRM_COMPILATION_ERRORS\n    {\n        strict_not_null<int*> p{nullptr};\n    }\n#endif\n}\n\n#if defined(__cplusplus) && (__cplusplus >= 201703L)\nnamespace\n{\nstatic constexpr char deathstring[] = \"Expected Death\";\n}\n\nTEST(strict_notnull_tests, TestStrictNotNullConstructorTypeDeduction)\n{\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. TestStrictNotNullConstructorTypeDeduction\";\n        std::abort();\n    });\n\n    {\n        int i = 42;\n\n        strict_not_null x{&i};\n        helper(strict_not_null{&i});\n        helper_const(strict_not_null{&i});\n\n        EXPECT_TRUE(*x == 42);\n    }\n\n    {\n        int i = 42;\n        int* p = &i;\n\n        strict_not_null x{p};\n        helper(strict_not_null{p});\n        helper_const(strict_not_null{p});\n\n        EXPECT_TRUE(*x == 42);\n    }\n\n    {\n        auto workaround_macro = []() {\n            int* p1 = nullptr;\n            const strict_not_null x{p1};\n        };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n    }\n\n    {\n        auto workaround_macro = []() {\n            const int* p1 = nullptr;\n            const strict_not_null x{p1};\n        };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n    }\n\n    {\n        int* p = nullptr;\n\n        EXPECT_DEATH(helper(strict_not_null{p}), deathstring);\n        EXPECT_DEATH(helper_const(strict_not_null{p}), deathstring);\n    }\n\n#ifdef CONFIRM_COMPILATION_ERRORS\n    {\n        strict_not_null x{nullptr};\n        helper(strict_not_null{nullptr});\n        helper_const(strict_not_null{nullptr});\n    }\n#endif\n}\n#endif // #if defined(__cplusplus) && (__cplusplus >= 201703L)\n"
  },
  {
    "path": "examples/libraries/GSL/tests/strided_span_tests.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#include <gtest/gtest.h>\n#include <gsl/gsl_byte>   // for byte\n#include <gsl/gsl_util>   // for narrow_cast\n#include <gsl/multi_span> // for strided_span, index, multi_span, strided_...\n\n#include <iostream>    // for size_t\n#include <iterator>    // for begin, end\n#include <numeric>     // for iota\n#include <type_traits> // for integral_constant<>::value, is_convertible\n#include <vector>      // for vector\n\nusing namespace std;\nusing namespace gsl;\n\n\nnamespace\n{\nstatic constexpr char deathstring[] = \"Expected Death\";\n\nstruct BaseClass\n{\n};\nstruct DerivedClass : BaseClass\n{\n};\n\nGSL_SUPPRESS(con.4) // NO-FORMAT: attribute\nGSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute\nvoid iterate_every_other_element(multi_span<int, dynamic_range> av)\n{\n    // pick every other element\n\n    auto length = av.size() / 2;\n#if defined(_MSC_VER) && _MSC_VER > 1800\n    auto bounds = strided_bounds<1>({length}, {2});\n#else\n    auto bounds = strided_bounds<1>(multi_span_index<1>{length}, multi_span_index<1>{2});\n#endif\n    strided_span<int, 1> strided(&av.data()[1], av.size() - 1, bounds);\n\n    EXPECT_TRUE(strided.size() == length);\n    EXPECT_TRUE(strided.bounds().index_bounds()[0] == length);\n    for (auto i = 0; i < strided.size(); ++i) {\n        EXPECT_TRUE(strided[i] == av[2 * i + 1]);\n    }\n\n    int idx = 0;\n    for (auto num : strided) {\n        EXPECT_TRUE(num == av[2 * idx + 1]);\n        idx++;\n    }\n}\n\nGSL_SUPPRESS(con.4) // NO-FORMAT: attribute\nGSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute\nGSL_SUPPRESS(bounds.2) // NO-FORMAT: attribute // TODO: does not work\nvoid iterate_second_slice(multi_span<int, dynamic_range, dynamic_range, dynamic_range> av)\n{\n    const int expected[6] = {2, 3, 10, 11, 18, 19};\n    auto section = av.section({0, 1, 0}, {3, 1, 2});\n\n    for (auto i = 0; i < section.extent<0>(); ++i) {\n        for (auto j = 0; j < section.extent<1>(); ++j)\n            for (auto k = 0; k < section.extent<2>(); ++k) {\n                auto idx = multi_span_index<3>{i, j, k}; // avoid braces in the EXPECT_TRUE macro\n                EXPECT_TRUE(section[idx] == expected[2 * i + 2 * j + k]);\n            }\n    }\n\n    for (auto i = 0; i < section.extent<0>(); ++i) {\n        for (auto j = 0; j < section.extent<1>(); ++j)\n            for (auto k = 0; k < section.extent<2>(); ++k)\n                EXPECT_TRUE(section[i][j][k] == expected[2 * i + 2 * j + k]);\n    }\n\n    int i = 0;\n    for (const auto num : section) {\n        EXPECT_TRUE(num == expected[i]);\n        i++;\n    }\n}\n\n}\n\nTEST(strided_span_tests, span_section_test)\n{\n    int a[30][4][5];\n\n    const auto av = as_multi_span(a);\n    const auto sub = av.section({15, 0, 0}, gsl::multi_span_index<3>{2, 2, 2});\n    const auto subsub = sub.section({1, 0, 0}, gsl::multi_span_index<3>{1, 1, 1});\n    (void) subsub;\n}\n\nTEST(strided_span_tests, span_section)\n{\n    std::vector<int> data(5 * 10);\n    std::iota(begin(data), end(data), 0);\n    const multi_span<int, 5, 10> av = as_multi_span(multi_span<int>{data}, dim<5>(), dim<10>());\n\n    const strided_span<int, 2> av_section_1 = av.section({1, 2}, {3, 4});\n    EXPECT_TRUE(!av_section_1.empty());\n    EXPECT_TRUE((av_section_1[{0, 0}] == 12));\n    EXPECT_TRUE((av_section_1[{0, 1}] == 13));\n    EXPECT_TRUE((av_section_1[{1, 0}] == 22));\n    EXPECT_TRUE((av_section_1[{2, 3}] == 35));\n\n    const strided_span<int, 2> av_section_2 = av_section_1.section({1, 2}, {2, 2});\n    EXPECT_TRUE(!av_section_2.empty());\n    EXPECT_TRUE((av_section_2[{0, 0}] == 24));\n    EXPECT_TRUE((av_section_2[{0, 1}] == 25));\n    EXPECT_TRUE((av_section_2[{1, 0}] == 34));\n}\n\nTEST(strided_span_tests, strided_span_constructors)\n{\n    // EXPECT_TRUE stride constructor\n    {\n        int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};\n        const int carr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};\n\n        strided_span<int, 1> sav1{arr, {{9}, {1}}}; // T -> T\n        EXPECT_TRUE(sav1.bounds().index_bounds() == multi_span_index<1>{9});\n        EXPECT_TRUE(sav1.bounds().stride() == 1);\n        EXPECT_TRUE(sav1[0] == 1);\n        EXPECT_TRUE(sav1[8] == 9);\n\n        strided_span<const int, 1> sav2{carr, {{4}, {2}}}; // const T -> const T\n        EXPECT_TRUE(sav2.bounds().index_bounds() == multi_span_index<1>{4});\n        EXPECT_TRUE(sav2.bounds().strides() == multi_span_index<1>{2});\n        EXPECT_TRUE(sav2[0] == 1);\n        EXPECT_TRUE(sav2[3] == 7);\n\n        strided_span<int, 2> sav3{arr, {{2, 2}, {6, 2}}}; // T -> const T\n        EXPECT_TRUE((sav3.bounds().index_bounds() == multi_span_index<2>{2, 2}));\n        EXPECT_TRUE((sav3.bounds().strides() == multi_span_index<2>{6, 2}));\n        EXPECT_TRUE((sav3[{0, 0}]) == 1);\n        EXPECT_TRUE((sav3[{0, 1}]) ==  3);\n        EXPECT_TRUE((sav3[{1, 0}]) == 7);\n    }\n\n    // EXPECT_TRUE multi_span constructor\n    {\n        int arr[] = {1, 2};\n\n        // From non-cv-qualified source\n        {\n            const multi_span<int> src = arr;\n\n            strided_span<int, 1> sav{src, {2, 1}};\n            EXPECT_TRUE(sav.bounds().index_bounds() == multi_span_index<1>{2});\n            EXPECT_TRUE(sav.bounds().strides() == multi_span_index<1>{1});\n            EXPECT_TRUE(sav[1] == 2);\n\n#if defined(_MSC_VER) && _MSC_VER > 1800\n            // strided_span<const int, 1> sav_c{ {src}, {2, 1} };\n            strided_span<const int, 1> sav_c{multi_span<const int>{src},\n                                             strided_bounds<1>{2, 1}};\n#else\n            strided_span<const int, 1> sav_c{multi_span<const int>{src},\n                                             strided_bounds<1>{2, 1}};\n#endif\n            EXPECT_TRUE(sav_c.bounds().index_bounds() == multi_span_index<1>{2});\n            EXPECT_TRUE(sav_c.bounds().strides() == multi_span_index<1>{1});\n            EXPECT_TRUE(sav_c[1] == 2);\n\n#if defined(_MSC_VER) && _MSC_VER > 1800\n            strided_span<volatile int, 1> sav_v{src, {2, 1}};\n#else\n            strided_span<volatile int, 1> sav_v{multi_span<volatile int>{src},\n                                                strided_bounds<1>{2, 1}};\n#endif\n            EXPECT_TRUE(sav_v.bounds().index_bounds() == multi_span_index<1>{2});\n            EXPECT_TRUE(sav_v.bounds().strides() == multi_span_index<1>{1});\n            EXPECT_TRUE(sav_v[1] == 2);\n\n#if defined(_MSC_VER) && _MSC_VER > 1800\n            strided_span<const volatile int, 1> sav_cv{src, {2, 1}};\n#else\n            strided_span<const volatile int, 1> sav_cv{multi_span<const volatile int>{src},\n                                                       strided_bounds<1>{2, 1}};\n#endif\n            EXPECT_TRUE(sav_cv.bounds().index_bounds() == multi_span_index<1>{2});\n            EXPECT_TRUE(sav_cv.bounds().strides() == multi_span_index<1>{1});\n            EXPECT_TRUE(sav_cv[1] == 2);\n        }\n\n        // From const-qualified source\n        {\n            const multi_span<const int> src{arr};\n\n            strided_span<const int, 1> sav_c{src, {2, 1}};\n            EXPECT_TRUE(sav_c.bounds().index_bounds() == multi_span_index<1>{2});\n            EXPECT_TRUE(sav_c.bounds().strides() == multi_span_index<1>{1});\n            EXPECT_TRUE(sav_c[1] == 2);\n\n#if defined(_MSC_VER) && _MSC_VER > 1800\n            strided_span<const volatile int, 1> sav_cv{src, {2, 1}};\n#else\n            strided_span<const volatile int, 1> sav_cv{multi_span<const volatile int>{src},\n                                                       strided_bounds<1>{2, 1}};\n#endif\n\n            EXPECT_TRUE(sav_cv.bounds().index_bounds() == multi_span_index<1>{2});\n            EXPECT_TRUE(sav_cv.bounds().strides() == multi_span_index<1>{1});\n            EXPECT_TRUE(sav_cv[1] == 2);\n        }\n\n        // From volatile-qualified source\n        {\n            const multi_span<volatile int> src{arr};\n\n            strided_span<volatile int, 1> sav_v{src, {2, 1}};\n            EXPECT_TRUE(sav_v.bounds().index_bounds() == multi_span_index<1>{2});\n            EXPECT_TRUE(sav_v.bounds().strides() == multi_span_index<1>{1});\n            EXPECT_TRUE(sav_v[1] == 2);\n\n#if defined(_MSC_VER) && _MSC_VER > 1800\n            strided_span<const volatile int, 1> sav_cv{src, {2, 1}};\n#else\n            strided_span<const volatile int, 1> sav_cv{multi_span<const volatile int>{src},\n                                                       strided_bounds<1>{2, 1}};\n#endif\n            EXPECT_TRUE(sav_cv.bounds().index_bounds() == multi_span_index<1>{2});\n            EXPECT_TRUE(sav_cv.bounds().strides() == multi_span_index<1>{1});\n            EXPECT_TRUE(sav_cv[1] == 2);\n        }\n\n        // From cv-qualified source\n        {\n            const multi_span<const volatile int> src{arr};\n\n            strided_span<const volatile int, 1> sav_cv{src, {2, 1}};\n            EXPECT_TRUE(sav_cv.bounds().index_bounds() == multi_span_index<1>{2});\n            EXPECT_TRUE(sav_cv.bounds().strides() == multi_span_index<1>{1});\n            EXPECT_TRUE(sav_cv[1] == 2);\n        }\n    }\n\n    // EXPECT_TRUE const-casting constructor\n    {\n        int arr[2] = {4, 5};\n\n        const multi_span<int, 2> av(arr, 2);\n        multi_span<const int, 2> av2{av};\n        EXPECT_TRUE(av2[1] == 5);\n\n        static_assert(\n            std::is_convertible<const multi_span<int, 2>, multi_span<const int, 2>>::value,\n            \"ctor is not implicit!\");\n\n        const strided_span<int, 1> src{arr, {2, 1}};\n        strided_span<const int, 1> sav{src};\n        EXPECT_TRUE(sav.bounds().index_bounds() == multi_span_index<1>{2});\n        EXPECT_TRUE(sav.bounds().stride() == 1);\n        EXPECT_TRUE(sav[1] == 5);\n\n        static_assert(\n            std::is_convertible<const strided_span<int, 1>, strided_span<const int, 1>>::value,\n            \"ctor is not implicit!\");\n    }\n\n    // EXPECT_TRUE copy constructor\n    {\n        int arr1[2] = {3, 4};\n        const strided_span<int, 1> src1{arr1, {2, 1}};\n        strided_span<int, 1> sav1{src1};\n\n        EXPECT_TRUE(sav1.bounds().index_bounds() == multi_span_index<1>{2});\n        EXPECT_TRUE(sav1.bounds().stride() == 1);\n        EXPECT_TRUE(sav1[0] == 3);\n\n        int arr2[6] = {1, 2, 3, 4, 5, 6};\n        const strided_span<const int, 2> src2{arr2, {{3, 2}, {2, 1}}};\n        strided_span<const int, 2> sav2{src2};\n        EXPECT_TRUE((sav2.bounds().index_bounds() == multi_span_index<2>{3, 2}));\n        EXPECT_TRUE((sav2.bounds().strides() == multi_span_index<2>{2, 1}));\n        EXPECT_TRUE((sav2[{0, 0}]) ==  1);\n        EXPECT_TRUE((sav2[{2, 0}]) == 5);\n    }\n\n    // EXPECT_TRUE const-casting assignment operator\n    {\n        int arr1[2] = {1, 2};\n        int arr2[6] = {3, 4, 5, 6, 7, 8};\n\n        const strided_span<int, 1> src{arr1, {{2}, {1}}};\n        strided_span<const int, 1> sav{arr2, {{3}, {2}}};\n        strided_span<const int, 1>& sav_ref = (sav = src);\n        EXPECT_TRUE(sav.bounds().index_bounds() == multi_span_index<1>{2});\n        EXPECT_TRUE(sav.bounds().strides() == multi_span_index<1>{1});\n        EXPECT_TRUE(sav[0] == 1);\n        EXPECT_TRUE(&sav_ref == &sav);\n    }\n\n    // EXPECT_TRUE copy assignment operator\n    {\n        int arr1[2] = {3, 4};\n        int arr1b[1] = {0};\n        const strided_span<int, 1> src1{arr1, {2, 1}};\n        strided_span<int, 1> sav1{arr1b, {1, 1}};\n        strided_span<int, 1>& sav1_ref = (sav1 = src1);\n        EXPECT_TRUE(sav1.bounds().index_bounds() == multi_span_index<1>{2});\n        EXPECT_TRUE(sav1.bounds().strides() == multi_span_index<1>{1});\n        EXPECT_TRUE(sav1[0] == 3);\n        EXPECT_TRUE(&sav1_ref == &sav1);\n\n        const int arr2[6] = {1, 2, 3, 4, 5, 6};\n        const int arr2b[1] = {0};\n        const strided_span<const int, 2> src2{arr2, {{3, 2}, {2, 1}}};\n        strided_span<const int, 2> sav2{arr2b, {{1, 1}, {1, 1}}};\n        strided_span<const int, 2>& sav2_ref = (sav2 = src2);\n        EXPECT_TRUE((sav2.bounds().index_bounds() == multi_span_index<2>{3, 2}));\n        EXPECT_TRUE((sav2.bounds().strides() == multi_span_index<2>{2, 1}));\n        EXPECT_TRUE((sav2[{0, 0}] == 1));\n        EXPECT_TRUE((sav2[{2, 0}] == 5));\n        EXPECT_TRUE(&sav2_ref == &sav2);\n    }\n}\n\nTEST(strided_span_tests, strided_span_slice)\n{\n    std::vector<int> data(5 * 10);\n    std::iota(begin(data), end(data), 0);\n    const multi_span<int, 5, 10> src =\n        as_multi_span(multi_span<int>{data}, dim<5>(), dim<10>());\n\n    const strided_span<int, 2> sav{src, {{5, 10}, {10, 1}}};\n#ifdef CONFIRM_COMPILATION_ERRORS\n    const strided_span<const int, 2> csav{{src}, {{5, 10}, {10, 1}}};\n#endif\n    const strided_span<const int, 2> csav{multi_span<const int, 5, 10>{src},\n                                          {{5, 10}, {10, 1}}};\n\n    strided_span<int, 1> sav_sl = sav[2];\n    EXPECT_TRUE(sav_sl[0] == 20);\n    EXPECT_TRUE(sav_sl[9] == 29);\n\n    strided_span<const int, 1> csav_sl = sav[3];\n    EXPECT_TRUE(csav_sl[0] == 30);\n    EXPECT_TRUE(csav_sl[9] == 39);\n\n    EXPECT_TRUE(sav[4][0] == 40);\n    EXPECT_TRUE(sav[4][9] == 49);\n}\n\nTEST(strided_span_tests, strided_span_column_major)\n{\n    // strided_span may be used to accommodate more peculiar\n    // use cases, such as column-major multidimensional array\n    // (aka. \"FORTRAN\" layout).\n\n    int cm_array[3 * 5] = {1, 4, 7, 10, 13, 2, 5, 8, 11, 14, 3, 6, 9, 12, 15};\n    strided_span<int, 2> cm_sav{cm_array, {{5, 3}, {1, 5}}};\n\n    // Accessing elements\n    EXPECT_TRUE((cm_sav[{0, 0}] == 1));\n    EXPECT_TRUE((cm_sav[{0, 1}] == 2));\n    EXPECT_TRUE((cm_sav[{1, 0}] == 4));\n    EXPECT_TRUE((cm_sav[{4, 2}] == 15));\n\n    // Slice\n    strided_span<int, 1> cm_sl = cm_sav[3];\n\n    EXPECT_TRUE(cm_sl[0] == 10);\n    EXPECT_TRUE(cm_sl[1] == 11);\n    EXPECT_TRUE(cm_sl[2] == 12);\n\n    // Section\n    strided_span<int, 2> cm_sec = cm_sav.section({2, 1}, {3, 2});\n\n    EXPECT_TRUE((cm_sec.bounds().index_bounds() == multi_span_index<2>{3, 2}));\n    EXPECT_TRUE((cm_sec[{0, 0}] == 8));\n    EXPECT_TRUE((cm_sec[{0, 1}] == 9));\n    EXPECT_TRUE((cm_sec[{1, 0}] == 11));\n    EXPECT_TRUE((cm_sec[{2, 1}] == 15));\n}\n\nTEST(strided_span_tests, strided_span_bounds)\n{\n    int arr[] = {0, 1, 2, 3};\n    multi_span<int> av(arr);\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. strided_span_bounds\";\n        std::abort();\n    });\n\n    {\n        // incorrect sections\n\n        EXPECT_DEATH(av.section(0, 0)[0], deathstring);\n        EXPECT_DEATH(av.section(1, 0)[0], deathstring);\n        EXPECT_DEATH(av.section(1, 1)[1], deathstring);\n\n        EXPECT_DEATH(av.section(2, 5), deathstring);\n        EXPECT_DEATH(av.section(5, 2), deathstring);\n        EXPECT_DEATH(av.section(5, 0), deathstring);\n        EXPECT_DEATH(av.section(0, 5), deathstring);\n        EXPECT_DEATH(av.section(5, 5), deathstring);\n    }\n\n    {\n        // zero stride\n        strided_span<int, 1> sav{av, {{4}, {}}};\n        EXPECT_TRUE(sav[0] == 0);\n        EXPECT_TRUE(sav[3] == 0);\n        EXPECT_DEATH(sav[4], deathstring);\n    }\n\n    {\n        // zero extent\n        strided_span<int, 1> sav{av, {{}, {1}}};\n        EXPECT_DEATH(sav[0], deathstring);\n    }\n\n    {\n        // zero extent and stride\n        strided_span<int, 1> sav{av, {{}, {}}};\n        EXPECT_DEATH(sav[0], deathstring);\n    }\n\n    {\n        // strided array ctor with matching strided bounds\n        strided_span<int, 1> sav{arr, {4, 1}};\n        EXPECT_TRUE(sav.bounds().index_bounds() == multi_span_index<1>{4});\n        EXPECT_TRUE(sav[3] == 3);\n        EXPECT_DEATH(sav[4], deathstring);\n    }\n\n    {\n        // strided array ctor with smaller strided bounds\n        strided_span<int, 1> sav{arr, {2, 1}};\n        EXPECT_TRUE(sav.bounds().index_bounds() == multi_span_index<1>{2});\n        EXPECT_TRUE(sav[1] == 1);\n        EXPECT_DEATH(sav[2], deathstring);\n    }\n\n    {\n        // strided array ctor with fitting irregular bounds\n        strided_span<int, 1> sav{arr, {2, 3}};\n        EXPECT_TRUE(sav.bounds().index_bounds() == multi_span_index<1>{2});\n        EXPECT_TRUE(sav[0] == 0);\n        EXPECT_TRUE(sav[1] == 3);\n        EXPECT_DEATH(sav[2], deathstring);\n    }\n\n    {\n        // bounds cross data boundaries - from static arrays\n        EXPECT_DEATH((strided_span<int, 1>{arr, {3, 2}}), deathstring);\n        EXPECT_DEATH((strided_span<int, 1>{arr, {3, 3}}), deathstring);\n        EXPECT_DEATH((strided_span<int, 1>{arr, {4, 5}}), deathstring);\n        EXPECT_DEATH((strided_span<int, 1>{arr, {5, 1}}), deathstring);\n        EXPECT_DEATH((strided_span<int, 1>{arr, {5, 5}}), deathstring);\n    }\n\n    {\n        // bounds cross data boundaries - from array view\n        EXPECT_DEATH((strided_span<int, 1>{av, {3, 2}}), deathstring);\n        EXPECT_DEATH((strided_span<int, 1>{av, {3, 3}}), deathstring);\n        EXPECT_DEATH((strided_span<int, 1>{av, {4, 5}}), deathstring);\n        EXPECT_DEATH((strided_span<int, 1>{av, {5, 1}}), deathstring);\n        EXPECT_DEATH((strided_span<int, 1>{av, {5, 5}}), deathstring);\n    }\n\n    {\n        // bounds cross data boundaries - from dynamic arrays\n        EXPECT_DEATH((strided_span<int, 1>{av.data(), 4, {3, 2}}), deathstring);\n        EXPECT_DEATH((strided_span<int, 1>{av.data(), 4, {3, 3}}), deathstring);\n        EXPECT_DEATH((strided_span<int, 1>{av.data(), 4, {4, 5}}), deathstring);\n        EXPECT_DEATH((strided_span<int, 1>{av.data(), 4, {5, 1}}), deathstring);\n        EXPECT_DEATH((strided_span<int, 1>{av.data(), 4, {5, 5}}), deathstring);\n        EXPECT_DEATH((strided_span<int, 1>{av.data(), 2, {2, 2}}), deathstring);\n    }\n\n#ifdef CONFIRM_COMPILATION_ERRORS\n    {\n        strided_span<int, 1> sav0{av.data(), {3, 2}};\n        strided_span<int, 1> sav1{arr, {1}};\n        strided_span<int, 1> sav2{arr, {1, 1, 1}};\n        strided_span<int, 1> sav3{av, {1}};\n        strided_span<int, 1> sav4{av, {1, 1, 1}};\n        strided_span<int, 2> sav5{av.as_multi_span(dim<2>(), dim<2>()), {1}};\n        strided_span<int, 2> sav6{av.as_multi_span(dim<2>(), dim<2>()), {1, 1, 1}};\n        strided_span<int, 2> sav7{av.as_multi_span(dim<2>(), dim<2>()),\n                                  {{1, 1}, {1, 1}, {1, 1}}};\n\n        multi_span_index<1> index{0, 1};\n        strided_span<int, 1> sav8{arr, {1, {1, 1}}};\n        strided_span<int, 1> sav9{arr, {{1, 1}, {1, 1}}};\n        strided_span<int, 1> sav10{av, {1, {1, 1}}};\n        strided_span<int, 1> sav11{av, {{1, 1}, {1, 1}}};\n        strided_span<int, 2> sav12{av.as_multi_span(dim<2>(), dim<2>()), {{1}, {1}}};\n        strided_span<int, 2> sav13{av.as_multi_span(dim<2>(), dim<2>()), {{1}, {1, 1, 1}}};\n        strided_span<int, 2> sav14{av.as_multi_span(dim<2>(), dim<2>()), {{1, 1, 1}, {1}}};\n    }\n#endif\n}\n\nTEST(strided_span_tests, strided_span_type_conversion)\n{\n    int arr[] = {0, 1, 2, 3};\n    multi_span<int> av(arr);\n\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. strided_span_type_conversion\";\n        std::abort();\n    });\n\n    {\n        strided_span<int, 1> sav{av.data(), av.size(), {av.size() / 2, 2}};\n#ifdef CONFIRM_COMPILATION_ERRORS\n        strided_span<long, 1> lsav1 = sav.as_strided_span<long, 1>();\n#endif\n    }\n    {\n        strided_span<int, 1> sav{av, {av.size() / 2, 2}};\n#ifdef CONFIRM_COMPILATION_ERRORS\n        strided_span<long, 1> lsav1 = sav.as_strided_span<long, 1>();\n#endif\n    }\n\n    multi_span<const byte, dynamic_range> bytes = as_bytes(av);\n\n    // retype strided array with regular strides - from raw data\n    {\n        strided_bounds<2> bounds{{2, bytes.size() / 4}, {bytes.size() / 2, 1}};\n        strided_span<const byte, 2> sav2{bytes.data(), bytes.size(), bounds};\n        strided_span<const int, 2> sav3 = sav2.as_strided_span<const int>();\n        EXPECT_TRUE(sav3[0][0] == 0);\n        EXPECT_TRUE(sav3[1][0] == 2);\n        EXPECT_DEATH(sav3[1][1], deathstring);\n        EXPECT_DEATH(sav3[0][1], deathstring);\n    }\n\n    // retype strided array with regular strides - from multi_span\n    {\n        strided_bounds<2> bounds{{2, bytes.size() / 4}, {bytes.size() / 2, 1}};\n        multi_span<const byte, 2, dynamic_range> bytes2 =\n            as_multi_span(bytes, dim<2>(), dim(bytes.size() / 2));\n        strided_span<const byte, 2> sav2{bytes2, bounds};\n        strided_span<int, 2> sav3 = sav2.as_strided_span<int>();\n        EXPECT_TRUE(sav3[0][0] == 0);\n        EXPECT_TRUE(sav3[1][0] == 2);\n        EXPECT_DEATH(sav3[1][1], deathstring);\n        EXPECT_DEATH(sav3[0][1], deathstring);\n    }\n\n    // retype strided array with not enough elements - last dimension of the array is too small\n    {\n        strided_bounds<2> bounds{{4, 2}, {4, 1}};\n        multi_span<const byte, 2, dynamic_range> bytes2 =\n            as_multi_span(bytes, dim<2>(), dim(bytes.size() / 2));\n        strided_span<const byte, 2> sav2{bytes2, bounds};\n        EXPECT_DEATH(sav2.as_strided_span<int>(), deathstring);\n    }\n\n    // retype strided array with not enough elements - strides are too small\n    {\n        strided_bounds<2> bounds{{4, 2}, {2, 1}};\n        multi_span<const byte, 2, dynamic_range> bytes2 =\n            as_multi_span(bytes, dim<2>(), dim(bytes.size() / 2));\n        strided_span<const byte, 2> sav2{bytes2, bounds};\n        EXPECT_DEATH(sav2.as_strided_span<int>(), deathstring);\n    }\n\n    // retype strided array with not enough elements - last dimension does not divide by the new\n    // typesize\n    {\n        strided_bounds<2> bounds{{2, 6}, {4, 1}};\n        multi_span<const byte, 2, dynamic_range> bytes2 =\n            as_multi_span(bytes, dim<2>(), dim(bytes.size() / 2));\n        strided_span<const byte, 2> sav2{bytes2, bounds};\n        EXPECT_DEATH(sav2.as_strided_span<int>(), deathstring);\n    }\n\n    // retype strided array with not enough elements - strides does not divide by the new\n    // typesize\n    {\n        strided_bounds<2> bounds{{2, 1}, {6, 1}};\n        multi_span<const byte, 2, dynamic_range> bytes2 =\n            as_multi_span(bytes, dim<2>(), dim(bytes.size() / 2));\n        strided_span<const byte, 2> sav2{bytes2, bounds};\n        EXPECT_DEATH(sav2.as_strided_span<int>(), deathstring);\n    }\n\n    // retype strided array with irregular strides - from raw data\n    {\n        strided_bounds<1> bounds{bytes.size() / 2, 2};\n        strided_span<const byte, 1> sav2{bytes.data(), bytes.size(), bounds};\n        EXPECT_DEATH(sav2.as_strided_span<int>(), deathstring);\n    }\n\n    // retype strided array with irregular strides - from multi_span\n    {\n        strided_bounds<1> bounds{bytes.size() / 2, 2};\n        strided_span<const byte, 1> sav2{bytes, bounds};\n        EXPECT_DEATH(sav2.as_strided_span<int>(), deathstring);\n    }\n}\n\nTEST(strided_span_tests, empty_strided_spans)\n{\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. empty_strided_spans\";\n        std::abort();\n    });\n\n    {\n        multi_span<int, 0> empty_av(nullptr);\n        strided_span<int, 1> empty_sav{empty_av, {0, 1}};\n\n        EXPECT_TRUE(empty_sav.bounds().index_bounds() == multi_span_index<1>{0});\n        EXPECT_TRUE(empty_sav.empty());\n        EXPECT_DEATH(empty_sav[0], deathstring);\n        EXPECT_DEATH(empty_sav.begin()[0], deathstring);\n        EXPECT_DEATH(empty_sav.cbegin()[0], deathstring);\n\n        for (const auto& v : empty_sav) {\n            (void) v;\n            EXPECT_TRUE(false);\n        }\n    }\n\n    {\n        strided_span<int, 1> empty_sav{nullptr, 0, {0, 1}};\n\n        EXPECT_TRUE(empty_sav.bounds().index_bounds() == multi_span_index<1>{0});\n        EXPECT_DEATH(empty_sav[0], deathstring);\n        EXPECT_DEATH(empty_sav.begin()[0], deathstring);\n        EXPECT_DEATH(empty_sav.cbegin()[0], deathstring);\n\n        for (const auto& v : empty_sav) {\n            (void) v;\n            EXPECT_TRUE(false);\n        }\n    }\n}\n\nTEST(strided_span_tests, strided_span_section_iteration)\n{\n    int arr[8] = {4, 0, 5, 1, 6, 2, 7, 3};\n\n    // static bounds\n    {\n        multi_span<int, 8> av(arr, 8);\n        iterate_every_other_element(av);\n    }\n\n    // dynamic bounds\n    {\n        multi_span<int, dynamic_range> av(arr, 8);\n        iterate_every_other_element(av);\n    }\n}\n\nTEST(strided_span_tests, dynamic_strided_span_section_iteration)\n{\n    auto arr = new int[8];\n    for (int i = 0; i < 4; ++i) {\n        arr[2 * i] = 4 + i;\n        arr[2 * i + 1] = i;\n    }\n\n    auto av = as_multi_span(arr, 8);\n    iterate_every_other_element(av);\n\n    delete[] arr;\n}\n\nTEST(strided_span_tests, strided_span_section_iteration_3d)\n{\n    int arr[3][4][2]{};\n    for (auto i = 0; i < 3; ++i) {\n        for (auto j = 0; j < 4; ++j)\n            for (auto k = 0; k < 2; ++k) arr[i][j][k] = 8 * i + 2 * j + k;\n    }\n\n    {\n        multi_span<int, 3, 4, 2> av = arr;\n        iterate_second_slice(av);\n    }\n}\n\nTEST(strided_span_tests, dynamic_strided_span_section_iteration_3d)\n{\n    const auto height = 12, width = 2;\n    const auto size = height * width;\n\n    auto arr = new int[static_cast<std::size_t>(size)];\n    for (auto i = 0; i < size; ++i) {\n        arr[i] = i;\n    }\n\n    {\n        auto av = as_multi_span(as_multi_span(arr, 24), dim<3>(), dim<4>(), dim<2>());\n        iterate_second_slice(av);\n    }\n\n    {\n        auto av = as_multi_span(as_multi_span(arr, 24), dim(3), dim<4>(), dim<2>());\n        iterate_second_slice(av);\n    }\n\n    {\n        auto av = as_multi_span(as_multi_span(arr, 24), dim<3>(), dim(4), dim<2>());\n        iterate_second_slice(av);\n    }\n\n    {\n        auto av = as_multi_span(as_multi_span(arr, 24), dim<3>(), dim<4>(), dim(2));\n        iterate_second_slice(av);\n    }\n    delete[] arr;\n}\n\nTEST(strided_span_tests, strided_span_conversion)\n{\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. strided_span_conversion\";\n        std::abort();\n    });\n\n    // get an multi_span of 'c' values from the list of X's\n\n    struct X\n    {\n        int a;\n        int b;\n        int c;\n    };\n\n    X arr[4] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {9, 10, 11}};\n\n    int s = sizeof(int) / sizeof(byte);\n    auto d2 = 3 * s;\n    auto d1 = narrow_cast<int>(sizeof(int)) * 12 / d2;\n\n    // convert to 4x12 array of bytes\n    auto av = as_multi_span(as_bytes(as_multi_span(&arr[0], 4)), dim(d1), dim(d2));\n\n    EXPECT_TRUE(av.bounds().index_bounds()[0] == 4);\n    EXPECT_TRUE(av.bounds().index_bounds()[1] == 12);\n\n    // get the last 4 columns\n    auto section = av.section({0, 2 * s}, {4, s}); // { { arr[0].c[0], arr[0].c[1], arr[0].c[2],\n                                                   // arr[0].c[3] } , { arr[1].c[0], ... } , ...\n                                                   // }\n\n    // convert to array 4x1 array of integers\n    auto cs = section.as_strided_span<int>(); // { { arr[0].c }, {arr[1].c } , ... }\n\n    EXPECT_TRUE(cs.bounds().index_bounds()[0] == 4);\n    EXPECT_TRUE(cs.bounds().index_bounds()[1] == 1);\n\n    // transpose to 1x4 array\n    strided_bounds<2> reverse_bounds{\n        {cs.bounds().index_bounds()[1], cs.bounds().index_bounds()[0]},\n        {cs.bounds().strides()[1], cs.bounds().strides()[0]}};\n\n    strided_span<int, 2> transposed{cs.data(), cs.bounds().total_size(), reverse_bounds};\n\n    // slice to get a one-dimensional array of c's\n    strided_span<int, 1> result = transposed[0];\n\n    EXPECT_TRUE(result.bounds().index_bounds()[0] == 4);\n    EXPECT_DEATH(result.bounds().index_bounds()[1], deathstring);\n\n    int i = 0;\n    for (auto& num : result) {\n        EXPECT_TRUE(num == arr[i].c);\n        i++;\n    }\n}\n"
  },
  {
    "path": "examples/libraries/GSL/tests/string_span_tests.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#include <gtest/gtest.h>\n\n#include <gsl/gsl_assert>  // for Expects, fail_fast (ptr only)\n#include <gsl/pointers>    // for owner\n#include <gsl/span>        // for span, dynamic_extent\n#include <gsl/string_span> // for basic_string_span, operator==, ensure_z\n\n#include <algorithm>   // for move, find\n#include <cstddef>     // for size_t\n#include <map>         // for map\n#include <string>      // for basic_string, string, char_traits, operat...\n#include <type_traits> // for remove_reference<>::type\n#include <vector>      // for vector, allocator\n\nusing namespace std;\nusing namespace gsl;\n\nnamespace\n{\nstatic constexpr char deathstring[] = \"Expected Death\";\n}\n// Generic string functions\n\nnamespace generic\n{\n\ntemplate <typename CharT>\nauto strlen(const CharT* s)\n{\n    auto p = s;\n    while (*p) ++p;\n    return p - s;\n}\n\ntemplate <typename CharT>\nauto strnlen(const CharT* s, std::size_t n)\n{\n    return std::find(s, s + n, CharT{0}) - s;\n}\n\n} // namespace generic\n\nnamespace\n{\n\ntemplate <typename T>\nT move_wrapper(T&& t)\n{\n    return std::move(t);\n}\n\n// not used otherwise\n#ifdef CONFIRM_COMPILATION_ERRORS\n\ntemplate <class T>\nT create()\n{\n    return T{};\n}\n\ntemplate <class T>\nvoid use(basic_string_span<T, gsl::dynamic_extent>)\n{\n}\n#endif\n\nczstring_span<> CreateTempName(string_span<> span)\n{\n    Expects(span.size() > 1);\n\n    std::size_t last = 0;\n    if (span.size() > 4) {\n        span[0] = 't';\n        span[1] = 'm';\n        span[2] = 'p';\n        last = 3;\n    }\n    span[last] = '\\0';\n\n    auto ret = span.subspan(0, 4);\n    return {ret};\n}\n\ncwzstring_span<> CreateTempNameW(wstring_span<> span)\n{\n    Expects(span.size() > 1);\n\n    std::size_t last = 0;\n    if (span.size() > 4) {\n        span[0] = L't';\n        span[1] = L'm';\n        span[2] = L'p';\n        last = 3;\n    }\n    span[last] = L'\\0';\n\n    auto ret = span.subspan(0, 4);\n    return {ret};\n}\n\ncu16zstring_span<> CreateTempNameU16(u16string_span<> span)\n{\n    Expects(span.size() > 1);\n\n    std::size_t last = 0;\n    if (span.size() > 4) {\n        span[0] = u't';\n        span[1] = u'm';\n        span[2] = u'p';\n        last = 3;\n    }\n    span[last] = u'\\0';\n\n    auto ret = span.subspan(0, 4);\n    return {ret};\n}\n\ncu32zstring_span<> CreateTempNameU32(u32string_span<> span)\n{\n    Expects(span.size() > 1);\n\n    std::size_t last = 0;\n    if (span.size() > 4) {\n        span[0] = U't';\n        span[1] = U'm';\n        span[2] = U'p';\n        last = 3;\n    }\n    span[last] = U'\\0';\n\n    auto ret = span.subspan(0, 4);\n    return {ret};\n}\n} // namespace\n\nTEST(string_span_tests, TestLiteralConstruction)\n{\n    cwstring_span<> v = ensure_z(L\"Hello\");\n    EXPECT_TRUE(5 == v.length());\n\n#ifdef CONFIRM_COMPILATION_ERRORS\n    wstring_span<> v2 = ensure0(L\"Hello\");\n#endif\n}\n\nTEST(string_span_tests, TestConstructFromStdString)\n{\n    std::string s = \"Hello there world\";\n    cstring_span<> v = s;\n    EXPECT_TRUE(v.length() == static_cast<cstring_span<>::size_type>(s.length()));\n}\n\nTEST(string_span_tests, TestConstructFromStdVector)\n{\n    std::vector<char> vec(5, 'h');\n    string_span<> v{vec};\n    EXPECT_TRUE(v.length() == static_cast<string_span<>::size_type>(vec.size()));\n}\n\nTEST(string_span_tests, TestStackArrayConstruction)\n{\n    wchar_t stack_string[] = L\"Hello\";\n\n    {\n        cwstring_span<> v = ensure_z(stack_string);\n        EXPECT_TRUE(v.length() == 5);\n    }\n\n    {\n        cwstring_span<> v = stack_string;\n        EXPECT_TRUE(v.length() == 5);\n    }\n\n    {\n        wstring_span<> v = ensure_z(stack_string);\n        EXPECT_TRUE(v.length() == 5);\n    }\n\n    {\n        wstring_span<> v = stack_string;\n        EXPECT_TRUE(v.length() == 5);\n    }\n}\n\nTEST(string_span_tests, TestConstructFromConstCharPointer)\n{\n    const char* s = \"Hello\";\n    cstring_span<> v = ensure_z(s);\n    EXPECT_TRUE(v.length() == 5);\n}\n\nTEST(string_span_tests, TestConversionToConst)\n{\n    char stack_string[] = \"Hello\";\n    string_span<> v = ensure_z(stack_string);\n    cstring_span<> v2 = v;\n    EXPECT_TRUE(v.length() == v2.length());\n}\n\nTEST(string_span_tests, TestConversionFromConst)\n{\n    char stack_string[] = \"Hello\";\n    cstring_span<> v = ensure_z(stack_string);\n    (void) v;\n#ifdef CONFIRM_COMPILATION_ERRORS\n    string_span<> v2 = v;\n    string_span<> v3 = \"Hello\";\n#endif\n}\n\nTEST(string_span_tests, TestToString)\n{\n    auto s = gsl::to_string(cstring_span<>{});\n    EXPECT_TRUE(s.length() == static_cast<size_t>(0));\n\n    char stack_string[] = \"Hello\";\n    cstring_span<> v = ensure_z(stack_string);\n    auto s2 = gsl::to_string(v);\n    EXPECT_TRUE(static_cast<cstring_span<>::size_type>(s2.length()) == v.length());\n    EXPECT_TRUE(s2.length() == static_cast<size_t>(5));\n}\n\nTEST(string_span_tests, TestToBasicString)\n{\n    auto s = gsl::to_basic_string<char, std::char_traits<char>, ::std::allocator<char>>(\n        cstring_span<>{});\n    EXPECT_TRUE(s.length() == static_cast<size_t>(0));\n\n    char stack_string[] = \"Hello\";\n    cstring_span<> v = ensure_z(stack_string);\n    auto s2 = gsl::to_basic_string<char, std::char_traits<char>, ::std::allocator<char>>(v);\n    EXPECT_TRUE(static_cast<cstring_span<>::size_type>(s2.length()) == v.length());\n    EXPECT_TRUE(s2.length() == static_cast<size_t>(5));\n}\n\nTEST(string_span_tests, EqualityAndImplicitConstructors)\n{\n    {\n        cstring_span<> span = \"Hello\";\n        cstring_span<> span1;\n\n        // comparison to empty span\n        EXPECT_TRUE(span1 != span);\n        EXPECT_TRUE(span != span1);\n    }\n\n    {\n        cstring_span<> span = \"Hello\";\n        cstring_span<> span1 = \"Hello1\";\n\n        // comparison to different span\n        EXPECT_TRUE(span1 != span);\n        EXPECT_TRUE(span != span1);\n    }\n\n    {\n        cstring_span<> span = \"Hello\";\n\n        const char ar[] = {'H', 'e', 'l', 'l', 'o'};\n        const char ar1[] = \"Hello\";\n        const char ar2[10] = \"Hello\";\n        const char* ptr = \"Hello\";\n        const std::string str = \"Hello\";\n        const std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n        gsl::span<const char> sp = ensure_z(\"Hello\");\n\n        // comparison to  literal\n        EXPECT_TRUE(span == cstring_span<>(\"Hello\"));\n\n        // comparison to static array with no null termination\n        EXPECT_TRUE(span == cstring_span<>(ar));\n\n        // comparison to static array with null at the end\n        EXPECT_TRUE(span == cstring_span<>(ar1));\n\n        // comparison to static array with null in the middle\n        EXPECT_TRUE(span == cstring_span<>(ar2));\n\n        // comparison to null-terminated c string\n        EXPECT_TRUE(span == cstring_span<>(ptr, 5));\n\n        // comparison to string\n        EXPECT_TRUE(span == cstring_span<>(str));\n\n        // comparison to vector of charaters with no null termination\n        EXPECT_TRUE(span == cstring_span<>(vec));\n\n        // comparison to span\n        EXPECT_TRUE(span == cstring_span<>(sp));\n\n        // comparison to string_span\n        EXPECT_TRUE(span == span);\n    }\n\n    {\n        char ar[] = {'H', 'e', 'l', 'l', 'o'};\n\n        string_span<> span = ar;\n\n        char ar1[] = \"Hello\";\n        char ar2[10] = \"Hello\";\n        char* ptr = ar;\n        std::string str = \"Hello\";\n        std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n        gsl::span<char> sp = ensure_z(ar1);\n\n        // comparison to static array with no null termination\n        EXPECT_TRUE(span == string_span<>(ar));\n\n        // comparison to static array with null at the end\n        EXPECT_TRUE(span == string_span<>(ar1));\n\n        // comparison to static array with null in the middle\n        EXPECT_TRUE(span == string_span<>(ar2));\n\n        // comparison to null-terminated c string\n        EXPECT_TRUE(span == string_span<>(ptr, 5));\n\n        // comparison to string\n        EXPECT_TRUE(span == string_span<>(str));\n\n        // comparison to vector of charaters with no null termination\n        EXPECT_TRUE(span == string_span<>(vec));\n\n        // comparison to span\n        EXPECT_TRUE(span == string_span<>(sp));\n\n        // comparison to string_span\n        EXPECT_TRUE(span == span);\n    }\n\n    {\n        const char ar[] = {'H', 'e', 'l', 'l', 'o'};\n        const char ar1[] = \"Hello\";\n        const char ar2[10] = \"Hello\";\n        const std::string str = \"Hello\";\n        const std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n        const gsl::span<const char> sp = ensure_z(\"Hello\");\n\n        cstring_span<> span = \"Hello\";\n\n        // const span, const other type\n\n        EXPECT_TRUE(span == \"Hello\");\n        EXPECT_TRUE(span == ar);\n        EXPECT_TRUE(span == ar1);\n        EXPECT_TRUE(span == ar2);\n#ifdef CONFIRM_COMPILATION_ERRORS\n        const char* ptr = \"Hello\";\n        EXPECT_TRUE(span == ptr);\n#endif\n        EXPECT_TRUE(span == str);\n        EXPECT_TRUE(span == vec);\n        EXPECT_TRUE(span == sp);\n\n        EXPECT_TRUE(\"Hello\" == span);\n        EXPECT_TRUE(ar == span);\n        EXPECT_TRUE(ar1 == span);\n        EXPECT_TRUE(ar2 == span);\n#ifdef CONFIRM_COMPILATION_ERRORS\n        EXPECT_TRUE(ptr == span);\n#endif\n        EXPECT_TRUE(str == span);\n        EXPECT_TRUE(vec == span);\n        EXPECT_TRUE(sp == span);\n\n        // const span, non-const other type\n\n        char _ar[] = {'H', 'e', 'l', 'l', 'o'};\n        char _ar1[] = \"Hello\";\n        char _ar2[10] = \"Hello\";\n        char* _ptr = _ar;\n        std::string _str = \"Hello\";\n        std::vector<char> _vec = {'H', 'e', 'l', 'l', 'o'};\n        gsl::span<char> _sp{_ar, 5};\n\n        EXPECT_TRUE(span == _ar);\n        EXPECT_TRUE(span == _ar1);\n        EXPECT_TRUE(span == _ar2);\n#ifdef CONFIRM_COMPILATION_ERRORS\n        EXPECT_TRUE(span == _ptr);\n#endif\n        EXPECT_TRUE(span == _str);\n        EXPECT_TRUE(span == _vec);\n        EXPECT_TRUE(span == _sp);\n\n        EXPECT_TRUE(_ar == span);\n        EXPECT_TRUE(_ar1 == span);\n        EXPECT_TRUE(_ar2 == span);\n#ifdef CONFIRM_COMPILATION_ERRORS\n        EXPECT_TRUE(_ptr == span);\n#endif\n        EXPECT_TRUE(_str == span);\n        EXPECT_TRUE(_vec == span);\n        EXPECT_TRUE(_sp == span);\n\n        string_span<> _span{_ptr, 5};\n\n        // non-const span, non-const other type\n\n        EXPECT_TRUE(_span == _ar);\n        EXPECT_TRUE(_span == _ar1);\n        EXPECT_TRUE(_span == _ar2);\n#ifdef CONFIRM_COMPILATION_ERRORS\n        EXPECT_TRUE(_span == _ptr);\n#endif\n        EXPECT_TRUE(_span == _str);\n        EXPECT_TRUE(_span == _vec);\n        EXPECT_TRUE(_span == _sp);\n\n        EXPECT_TRUE(_ar == _span);\n        EXPECT_TRUE(_ar1 == _span);\n        EXPECT_TRUE(_ar2 == _span);\n#ifdef CONFIRM_COMPILATION_ERRORS\n        EXPECT_TRUE(_ptr == _span);\n#endif\n        EXPECT_TRUE(_str == _span);\n        EXPECT_TRUE(_vec == _span);\n        EXPECT_TRUE(_sp == _span);\n\n        // non-const span, const other type\n\n        EXPECT_TRUE(_span == \"Hello\");\n        EXPECT_TRUE(_span == ar);\n        EXPECT_TRUE(_span == ar1);\n        EXPECT_TRUE(_span == ar2);\n#ifdef CONFIRM_COMPILATION_ERRORS\n        EXPECT_TRUE(_span == ptr);\n#endif\n        EXPECT_TRUE(_span == str);\n        EXPECT_TRUE(_span == vec);\n        EXPECT_TRUE(_span == sp);\n\n        EXPECT_TRUE(\"Hello\" == _span);\n        EXPECT_TRUE(ar == _span);\n        EXPECT_TRUE(ar1 == _span);\n        EXPECT_TRUE(ar2 == _span);\n#ifdef CONFIRM_COMPILATION_ERRORS\n        EXPECT_TRUE(ptr == _span);\n#endif\n        EXPECT_TRUE(str == _span);\n        EXPECT_TRUE(vec == _span);\n        EXPECT_TRUE(sp == _span);\n\n        // two spans\n\n        EXPECT_TRUE(_span == span);\n        EXPECT_TRUE(span == _span);\n    }\n\n    {\n        std::vector<char> str1 = {'H', 'e', 'l', 'l', 'o'};\n        cstring_span<> span1 = str1;\n        std::vector<char> str2 = std::move(str1);\n        cstring_span<> span2 = str2;\n\n        // comparison of spans from the same vector before and after move (ok)\n        EXPECT_TRUE(span1 == span2);\n    }\n}\n\nTEST(string_span_tests, ComparisonAndImplicitConstructors)\n{\n    {\n        cstring_span<> span = \"Hello\";\n\n        const char ar[] = {'H', 'e', 'l', 'l', 'o'};\n        const char ar1[] = \"Hello\";\n        const char ar2[10] = \"Hello\";\n        const char* ptr = \"Hello\";\n        const std::string str = \"Hello\";\n        const std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n\n        // comparison to  literal\n        EXPECT_TRUE(span < cstring_span<>(\"Helloo\"));\n        EXPECT_TRUE(span > cstring_span<>(\"Hell\"));\n\n        // comparison to static array with no null termination\n        EXPECT_TRUE(span >= cstring_span<>(ar));\n\n        // comparison to static array with null at the end\n        EXPECT_TRUE(span <= cstring_span<>(ar1));\n\n        // comparison to static array with null in the middle\n        EXPECT_TRUE(span >= cstring_span<>(ar2));\n\n        // comparison to null-terminated c string\n        EXPECT_TRUE(span <= cstring_span<>(ptr, 5));\n\n        // comparison to string\n        EXPECT_TRUE(span >= cstring_span<>(str));\n\n        // comparison to vector of charaters with no null termination\n        EXPECT_TRUE(span <= cstring_span<>(vec));\n    }\n\n    {\n        char ar[] = {'H', 'e', 'l', 'l', 'o'};\n\n        string_span<> span = ar;\n\n        char larr[] = \"Hell\";\n        char rarr[] = \"Helloo\";\n\n        char ar1[] = \"Hello\";\n        char ar2[10] = \"Hello\";\n        char* ptr = ar;\n        std::string str = \"Hello\";\n        std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n\n        // comparison to static array with no null termination\n        EXPECT_TRUE(span <= string_span<>(ar));\n        EXPECT_TRUE(span < string_span<>(rarr));\n        EXPECT_TRUE(span > string_span<>(larr));\n\n        // comparison to static array with null at the end\n        EXPECT_TRUE(span >= string_span<>(ar1));\n\n        // comparison to static array with null in the middle\n        EXPECT_TRUE(span <= string_span<>(ar2));\n\n        // comparison to null-terminated c string\n        EXPECT_TRUE(span >= string_span<>(ptr, 5));\n\n        // comparison to string\n        EXPECT_TRUE(span <= string_span<>(str));\n\n        // comparison to vector of charaters with no null termination\n        EXPECT_TRUE(span >= string_span<>(vec));\n    }\n}\n\nTEST(string_span_tests, ConstrutorsEnsureZ)\n{\n    // remove z from literals\n    {\n        cstring_span<> sp = \"hello\";\n        EXPECT_TRUE(sp.length() == 5);\n    }\n\n    // take the string as is\n    {\n        auto str = std::string(\"hello\");\n        cstring_span<> sp = str;\n        EXPECT_TRUE(sp.length() == 5);\n    }\n\n    // ensure z on c strings\n    {\n        gsl::owner<char*> ptr = new char[3];\n\n        ptr[0] = 'a';\n        ptr[1] = 'b';\n        ptr[2] = '\\0';\n\n        string_span<> span = ensure_z(ptr);\n        EXPECT_TRUE(span.length() == 2);\n\n        delete[] ptr;\n    }\n}\n\nTEST(string_span_tests, Constructors)\n{\n    // creating cstring_span\n\n    // from span of a final extent\n    {\n        span<const char, 6> sp = \"Hello\";\n        cstring_span<> span = sp;\n        EXPECT_TRUE(span.length() == 6);\n    }\n\n// from const span of a final extent to non-const string_span\n#ifdef CONFIRM_COMPILATION_ERRORS\n    {\n        span<const char, 6> sp = \"Hello\";\n        string_span<> span = sp;\n        EXPECT_TRUE(span.length() == 6);\n    }\n#endif\n\n// from string temporary\n#ifdef CONFIRM_COMPILATION_ERRORS\n    {\n        cstring_span<> span = std::string(\"Hello\");\n    }\n#endif\n\n    // default\n    {\n        cstring_span<> span;\n        EXPECT_TRUE(span.length() == 0);\n    }\n\n    // from string literal\n    {\n        cstring_span<> span = \"Hello\";\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // from const static array\n    {\n        const char ar[] = {'H', 'e', 'l', 'l', 'o'};\n        cstring_span<> span = ar;\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // from non-const static array\n    {\n        char ar[] = {'H', 'e', 'l', 'l', 'o'};\n        cstring_span<> span = ar;\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // from const ptr and length\n    {\n        const char* ptr = \"Hello\";\n        cstring_span<> span{ptr, 5};\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // from const ptr and length, include 0\n    {\n        const char* ptr = \"Hello\";\n        cstring_span<> span{ptr, 6};\n        EXPECT_TRUE(span.length() == 6);\n    }\n\n    // from const ptr and length, 0 inside\n    {\n        const char* ptr = \"He\\0lo\";\n        cstring_span<> span{ptr, 5};\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // from non-const ptr and length\n    {\n        char ar[] = {'H', 'e', 'l', 'l', 'o'};\n        char* ptr = ar;\n        cstring_span<> span{ptr, 5};\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // from non-const ptr and length, 0 inside\n    {\n        char ar[] = {'H', 'e', '\\0', 'l', 'o'};\n        char* ptr = ar;\n        cstring_span<> span{ptr, 5};\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // from const string\n    {\n        const std::string str = \"Hello\";\n        const cstring_span<> span = str;\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // from non-const string\n    {\n        std::string str = \"Hello\";\n        const cstring_span<> span = str;\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // from const vector\n    {\n        const std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n        const cstring_span<> span = vec;\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // from non-const vector\n    {\n        std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n        const cstring_span<> span = vec;\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // from const span\n    {\n        const std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n        const span<const char> inner = vec;\n        const cstring_span<> span = inner;\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // from non-const span\n    {\n        std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n        const span<char> inner = vec;\n        const cstring_span<> span = inner;\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // from const string_span\n    {\n        const std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n        const cstring_span<> tmp = vec;\n        const cstring_span<> span = tmp;\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // from non-const string_span\n    {\n        std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n        string_span<> tmp = vec;\n        cstring_span<> span = tmp;\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // creating string_span\n\n    // from string literal\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        string_span<> span = \"Hello\";\n#endif\n    }\n\n    // from const static array\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        const char ar[] = {'H', 'e', 'l', 'l', 'o'};\n        string_span<> span = ar;\n        EXPECT_TRUE(span.length() == 5);\n#endif\n    }\n\n    // from non-const static array\n    {\n        char ar[] = {'H', 'e', 'l', 'l', 'o'};\n        string_span<> span = ar;\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // from const ptr and length\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        const char* ptr = \"Hello\";\n        string_span<> span{ptr, 5};\n        EXPECT_TRUE(span.length() == 5);\n#endif\n    }\n\n    // from non-const ptr and length\n    {\n        char ar[] = {'H', 'e', 'l', 'l', 'o'};\n        char* ptr = ar;\n        string_span<> span{ptr, 5};\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // from const string\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        const std::string str = \"Hello\";\n        string_span<> span = str;\n        EXPECT_TRUE(span.length() == 5);\n#endif\n    }\n\n    // from non-const string\n    {\n        std::string str = \"Hello\";\n        string_span<> span = str;\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // from const vector\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        const std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n        string_span<> span = vec;\n        EXPECT_TRUE(span.length() == 5);\n#endif\n    }\n\n    // from non-const vector\n    {\n        std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n        string_span<> span = vec;\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // from const span\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n        const span<const char> inner = vec;\n        string_span<> span = inner;\n        EXPECT_TRUE(span.length() == 5);\n#endif\n    }\n\n    // from non-const span\n    {\n        std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n        span<char> inner = vec;\n        string_span<> span = inner;\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // from non-const span of non-const data from const vector\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        const std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n        const span<char> inner = vec;\n        string_span<> span = inner;\n        EXPECT_TRUE(span.length() == 5);\n#endif\n    }\n\n    // from const string_span\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n        cstring_span<> tmp = vec;\n        string_span<> span = tmp;\n        EXPECT_TRUE(span.length() == 5);\n#endif\n    }\n\n    // from non-const string_span\n    {\n        std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n        const string_span<> tmp = vec;\n        const string_span<> span = tmp;\n        EXPECT_TRUE(span.length() == 5);\n    }\n\n    // from non-const string_span from const vector\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        const std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n        string_span<> tmp = vec;\n        string_span<> span = tmp;\n        EXPECT_TRUE(span.length() == 5);\n#endif\n    }\n\n    // from const string_span of non-const data\n    {\n        std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n        const string_span<> tmp = vec;\n        const string_span<> span = tmp;\n        EXPECT_TRUE(span.length() == 5);\n    }\n}\n\nTEST(string_span_tests, MoveConstructors)\n{\n    // move string_span\n    {\n        cstring_span<> span = \"Hello\";\n        const auto span1 = std::move(span);\n        EXPECT_TRUE(span1.length() == 5);\n    }\n    {\n        cstring_span<> span = \"Hello\";\n        const auto span1 = move_wrapper(std::move(span));\n        EXPECT_TRUE(span1.length() == 5);\n    }\n    {\n        cstring_span<> span = \"Hello\";\n        const auto span1 = move_wrapper(std::move(span));\n        EXPECT_TRUE(span1.length() == 5);\n    }\n\n    // move span\n    {\n        span<const char> span = ensure_z(\"Hello\");\n        const cstring_span<> span1 = std::move(span);\n        EXPECT_TRUE(span1.length() == 5);\n    }\n    {\n        span<const char> span = ensure_z(\"Hello\");\n        const cstring_span<> span2 = move_wrapper(std::move(span));\n        EXPECT_TRUE(span2.length() == 5);\n    }\n\n    // move string\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        std::string str = \"Hello\";\n        string_span<> span = std::move(str);\n        EXPECT_TRUE(span.length() == 5);\n#endif\n    }\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        std::string str = \"Hello\";\n        string_span<> span = move_wrapper<std::string>(std::move(str));\n        EXPECT_TRUE(span.length() == 5);\n#endif\n    }\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        use<char>(create<string>());\n#endif\n    }\n\n    // move container\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n        string_span<> span = std::move(vec);\n        EXPECT_TRUE(span.length() == 5);\n#endif\n    }\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};\n        string_span<> span = move_wrapper<std::vector<char>>(std::move(vec));\n        EXPECT_TRUE(span.length() == 5);\n#endif\n    }\n    {\n#ifdef CONFIRM_COMPILATION_ERRORS\n        use<char>(create<std::vector<char>>());\n#endif\n    }\n}\n\nTEST(string_span_tests, Conversion)\n{\n#ifdef CONFIRM_COMPILATION_ERRORS\n    cstring_span<> span = \"Hello\";\n    cwstring_span<> wspan{span};\n    EXPECT_TRUE(wspan.length() == 5);\n#endif\n}\n\nTEST(string_span_tests, zstring)\n{\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. zstring\";\n        std::abort();\n    });\n\n    // create zspan from zero terminated string\n    {\n        char buf[1];\n        buf[0] = '\\0';\n\n        zstring_span<> zspan({buf, 1});\n\n        EXPECT_TRUE(generic::strlen(zspan.assume_z()) == 0);\n        EXPECT_TRUE(zspan.as_string_span().size() == 0);\n        EXPECT_TRUE(zspan.ensure_z().size() == 0);\n    }\n\n    // create zspan from non-zero terminated string\n    {\n        char buf[1];\n        buf[0] = 'a';\n\n        auto workaround_macro = [&]() { const zstring_span<> zspan({buf, 1}); };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n    }\n\n    // usage scenario: create zero-terminated temp file name and pass to a legacy API\n    {\n        char buf[10];\n\n        auto name = CreateTempName({buf, 10});\n        if (!name.empty()) {\n            czstring<> str = name.assume_z();\n            EXPECT_TRUE(generic::strlen(str) == 3);\n            EXPECT_TRUE(*(str + 3) == '\\0');\n        }\n    }\n}\n\nTEST(string_span_tests, wzstring)\n{\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. wzstring\";\n        std::abort();\n    });\n\n    // create zspan from zero terminated string\n    {\n        wchar_t buf[1];\n        buf[0] = L'\\0';\n\n        wzstring_span<> zspan({buf, 1});\n\n        EXPECT_TRUE(generic::strnlen(zspan.assume_z(), 1) == 0);\n        EXPECT_TRUE(zspan.as_string_span().size() == 0);\n        EXPECT_TRUE(zspan.ensure_z().size() == 0);\n    }\n\n    // create zspan from non-zero terminated string\n    {\n        wchar_t buf[1];\n        buf[0] = L'a';\n\n        const auto workaround_macro = [&]() { const wzstring_span<> zspan({buf, 1}); };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n    }\n\n    // usage scenario: create zero-terminated temp file name and pass to a legacy API\n    {\n        wchar_t buf[10];\n\n        const auto name = CreateTempNameW({buf, 10});\n        if (!name.empty()) {\n            cwzstring<> str = name.assume_z();\n            EXPECT_TRUE(generic::strnlen(str, 10) == 3);\n            EXPECT_TRUE(*(str + 3) == L'\\0');\n        }\n    }\n}\n\nTEST(string_span_tests, u16zstring)\n{\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. u16zstring\";\n        std::abort();\n    });\n\n    // create zspan from zero terminated string\n    {\n        char16_t buf[1];\n        buf[0] = L'\\0';\n\n        u16zstring_span<> zspan({buf, 1});\n\n        EXPECT_TRUE(generic::strnlen(zspan.assume_z(), 1) == 0);\n        EXPECT_TRUE(zspan.as_string_span().size() == 0);\n        EXPECT_TRUE(zspan.ensure_z().size() == 0);\n    }\n\n    // create zspan from non-zero terminated string\n    {\n        char16_t buf[1];\n        buf[0] = u'a';\n\n        const auto workaround_macro = [&]() { const u16zstring_span<> zspan({buf, 1}); };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n    }\n\n    // usage scenario: create zero-terminated temp file name and pass to a legacy API\n    {\n        char16_t buf[10];\n\n        const auto name = CreateTempNameU16({buf, 10});\n        if (!name.empty()) {\n            cu16zstring<> str = name.assume_z();\n            EXPECT_TRUE(generic::strnlen(str, 10) == 3);\n            EXPECT_TRUE(*(str + 3) == L'\\0');\n        }\n    }\n}\n\nTEST(string_span_tests, u32zstring)\n{\n    std::set_terminate([] {\n        std::cerr << \"Expected Death. u31zstring\";\n        std::abort();\n    });\n\n    // create zspan from zero terminated string\n    {\n        char32_t buf[1];\n        buf[0] = L'\\0';\n\n        u32zstring_span<> zspan({buf, 1});\n\n        EXPECT_TRUE(generic::strnlen(zspan.assume_z(), 1) == 0);\n        EXPECT_TRUE(zspan.as_string_span().size() == 0);\n        EXPECT_TRUE(zspan.ensure_z().size() == 0);\n    }\n\n    // create zspan from non-zero terminated string\n    {\n        char32_t buf[1];\n        buf[0] = u'a';\n\n        const auto workaround_macro = [&]() { const u32zstring_span<> zspan({buf, 1}); };\n        EXPECT_DEATH(workaround_macro(), deathstring);\n    }\n\n    // usage scenario: create zero-terminated temp file name and pass to a legacy API\n    {\n        char32_t buf[10];\n\n        const auto name = CreateTempNameU32({buf, 10});\n        if (!name.empty()) {\n            cu32zstring<> str = name.assume_z();\n            EXPECT_TRUE(generic::strnlen(str, 10) == 3);\n            EXPECT_TRUE(*(str + 3) == L'\\0');\n        }\n    }\n}\n\nTEST(string_span_tests, Issue305)\n{\n    std::map<gsl::cstring_span<>, int> foo = {{\"foo\", 0}, {\"bar\", 1}};\n    EXPECT_TRUE(foo[\"foo\"] == 0);\n    EXPECT_TRUE(foo[\"bar\"] == 1);\n}\n\nTEST(string_span_tests, char16_t_type)\n{\n    gsl::cu16string_span<> ss1 = gsl::ensure_z(u\"abc\");\n    EXPECT_TRUE(ss1.size() == 3);\n    EXPECT_TRUE(ss1.size_bytes() == 6);\n\n    std::u16string s1 = gsl::to_string(ss1);\n    EXPECT_TRUE(s1 == u\"abc\");\n\n    std::u16string s2 = u\"abc\";\n    gsl::u16string_span<> ss2 = s2;\n    EXPECT_TRUE(ss2.size() == 3);\n\n    gsl::u16string_span<> ss3 = ss2.subspan(1, 1);\n    EXPECT_TRUE(ss3.size() == 1);\n    EXPECT_TRUE(ss3[0] == u'b');\n\n    char16_t buf[4]{u'a', u'b', u'c', u'\\0'};\n    gsl::u16string_span<> ss4{buf, 4};\n    EXPECT_TRUE(ss4[3] == u'\\0');\n\n    gsl::cu16zstring_span<> ss5(u\"abc\");\n    EXPECT_TRUE((ss5.as_string_span().size()) == 3);\n\n    gsl::cu16string_span<> ss6 = ss5.as_string_span();\n    EXPECT_TRUE(ss6 == ss1);\n\n    std::vector<char16_t> v7 = {u'a', u'b', u'c'};\n    gsl::cu16string_span<> ss7{v7};\n    EXPECT_TRUE(ss7 == ss1);\n\n    gsl::cu16string_span<> ss8 = gsl::ensure_z(u\"abc\");\n    gsl::cu16string_span<> ss9 = gsl::ensure_z(u\"abc\");\n    EXPECT_TRUE(ss8 == ss9);\n\n    ss9 = gsl::ensure_z(u\"abd\");\n    EXPECT_TRUE(ss8 < ss9);\n    EXPECT_TRUE(ss8 <= ss9);\n    EXPECT_TRUE(ss8 != ss9);\n}\n\nTEST(string_span_tests, char32_t_type)\n{\n    gsl::cu32string_span<> ss1 = gsl::ensure_z(U\"abc\");\n    EXPECT_TRUE(ss1.size() == 3);\n    EXPECT_TRUE(ss1.size_bytes() == 12);\n\n    std::u32string s1 = gsl::to_string(ss1);\n    EXPECT_TRUE(s1 == U\"abc\");\n\n    std::u32string s2 = U\"abc\";\n    gsl::u32string_span<> ss2 = s2;\n    EXPECT_TRUE(ss2.size() == 3);\n\n    gsl::u32string_span<> ss3 = ss2.subspan(1, 1);\n    EXPECT_TRUE(ss3.size() == 1);\n    EXPECT_TRUE(ss3[0] == U'b');\n\n    char32_t buf[4]{U'a', U'b', U'c', U'\\0'};\n    gsl::u32string_span<> ss4{buf, 4};\n    EXPECT_TRUE(ss4[3] == u'\\0');\n\n    gsl::cu32zstring_span<> ss5(U\"abc\");\n    EXPECT_TRUE(ss5.as_string_span().size() == 3);\n\n    gsl::cu32string_span<> ss6 = ss5.as_string_span();\n    EXPECT_TRUE(ss6 == ss1);\n\n    gsl::cu32string_span<> ss8 = gsl::ensure_z(U\"abc\");\n    gsl::cu32string_span<> ss9 = gsl::ensure_z(U\"abc\");\n    EXPECT_TRUE(ss8 == ss9);\n\n    ss9 = gsl::ensure_z(U\"abd\");\n    EXPECT_TRUE(ss8 < ss9);\n    EXPECT_TRUE(ss8 <= ss9);\n    EXPECT_TRUE(ss8 != ss9);\n}\n\nTEST(string_span_tests, as_bytes)\n{\n    cwzstring_span<> v(L\"qwerty\");\n    const auto s = v.as_string_span();\n    const auto bs = as_bytes(s);\n    EXPECT_TRUE(static_cast<const void*>(bs.data()) == static_cast<const void*>(s.data()));\n    EXPECT_TRUE(bs.size() == s.size_bytes());\n}\n\nTEST(string_span_tests, as_writable_bytes)\n{\n    wchar_t buf[]{L\"qwerty\"};\n    wzstring_span<> v(buf);\n    const auto s = v.as_string_span();\n    const auto bs = as_writable_bytes(s);\n    EXPECT_TRUE(static_cast<const void*>(bs.data()) == static_cast<const void*>(s.data()));\n    EXPECT_TRUE(bs.size() == s.size_bytes());\n}\n"
  },
  {
    "path": "examples/libraries/GSL/tests/utils_tests.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2015 Microsoft Corporation. All rights reserved.\n//\n// This code is licensed under the MIT License (MIT).\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#include <gtest/gtest.h>\n\n#include <gsl/gsl_util> // for narrow, finally, narrow_cast, narrowing_e...\n\n#include <algorithm>   // for move\n#include <functional>  // for reference_wrapper, _Bind_helper<>::type\n#include <limits>      // for numeric_limits\n#include <stdint.h>    // for uint32_t, int32_t\n#include <type_traits> // for is_same\n#include <cstddef>     // for std::ptrdiff_t\n\nusing namespace gsl;\n\nnamespace\n{\nvoid f(int& i) { i += 1; }\nstatic int j = 0;\nvoid g() { j += 1; }\n}\n\n\nTEST(utils_tests, sanity_check_for_gsl_index_typedef)\n{\n    static_assert(std::is_same<gsl::index, std::ptrdiff_t>::value,\n                  \"gsl::index represents wrong arithmetic type\");\n}\n\nTEST(utils_tests, finally_lambda)\n{\n    int i = 0;\n    {\n        auto _ = finally([&]() { f(i); });\n        EXPECT_TRUE(i == 0);\n    }\n    EXPECT_TRUE(i == 1);\n}\n\nTEST(utils_tests, finally_lambda_move)\n{\n    int i = 0;\n    {\n        auto _1 = finally([&]() { f(i); });\n        {\n            auto _2 = std::move(_1);\n            EXPECT_TRUE(i == 0);\n        }\n        EXPECT_TRUE(i == 1);\n        {\n            auto _2 = std::move(_1);\n            EXPECT_TRUE(i == 1);\n        }\n        EXPECT_TRUE(i == 1);\n    }\n    EXPECT_TRUE(i == 1);\n}\n\nTEST(utils_tests, finally_function_with_bind)\n{\n    int i = 0;\n    {\n        auto _ = finally(std::bind(&f, std::ref(i)));\n        EXPECT_TRUE(i == 0);\n    }\n    EXPECT_TRUE(i == 1);\n}\n\nTEST(utils_tests, finally_function_ptr)\n{\n    j = 0;\n    {\n        auto _ = finally(&g);\n        EXPECT_TRUE(j == 0);\n    }\n    EXPECT_TRUE(j == 1);\n}\n\nTEST(utils_tests, narrow_cast)\n{\n    int n = 120;\n    char c = narrow_cast<char>(n);\n    EXPECT_TRUE(c == 120);\n\n    n = 300;\n    unsigned char uc = narrow_cast<unsigned char>(n);\n    EXPECT_TRUE(uc == 44);\n}\n\nTEST(utils_tests, narrow)\n{\n    int n = 120;\n    const char c = narrow<char>(n);\n    EXPECT_TRUE(c == 120);\n\n    n = 300;\n    EXPECT_THROW(narrow<char>(n), narrowing_error);\n\n    const auto int32_max = std::numeric_limits<int32_t>::max();\n    const auto int32_min = std::numeric_limits<int32_t>::min();\n\n    EXPECT_TRUE(narrow<uint32_t>(int32_t(0)) == 0);\n    EXPECT_TRUE(narrow<uint32_t>(int32_t(1)) == 1);\n    EXPECT_TRUE(narrow<uint32_t>(int32_max) == static_cast<uint32_t>(int32_max));\n\n    EXPECT_THROW(narrow<uint32_t>(int32_t(-1)), narrowing_error);\n    EXPECT_THROW(narrow<uint32_t>(int32_min), narrowing_error);\n\n    n = -42;\n    EXPECT_THROW(narrow<unsigned>(n), narrowing_error);\n\n#if GSL_CONSTEXPR_NARROW\n    static_assert(narrow<char>(120) == 120, \"Fix GSL_CONSTEXPR_NARROW\");\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/.gitignore",
    "content": "# Compiled Object files\n*.slo\n*.lo\n*.o\n\n# Compiled Dynamic libraries\n*.so\n*.dylib\n\n# Compiled Static libraries\n*.lai\n*.la\n*.a\n\n# Visual studio cruft\n*.opensdf\n*.sdf\n*.suo\n*.user\n*/x64\n*\\Debug*\n*\\Release*\n*.log\n*.tlog*\n*.obj\n*.VC.db\n*.VC.VC.opendb\n*.pdb\n*.idb\n*\\build_*\n\n# misc files mostly used for testing\nout.txt\nptr.txt\ntest.txt\nboost_serialize\narr.txt\nperformance\ninclude_renamed\n.ycm_extra_conf.py*\ndoc/html\nrtti.txt\ndoc/latex\nportability64\nportability32\nfile.json\nout.xml\ncereal_version.out\nxml_ordering.out\nbuild\n/out/"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/.travis.yml",
    "content": "# Portions of this file based on https://github.com/Microsoft/GSL/blob/master/.travis.yml\n\nlanguage: cpp\nos: linux\ndist: trusty\nsudo: false\ngroup: beta\n\naddons:\n  apt:\n    sources: &default_sources\n      - ubuntu-toolchain-r-test\n      - libboost-latest\n    packages: &default_packages\n      - libboost-serialization-dev\n      - libboost-dev\n\nmatrix:\n  include:\n\n    # |---------- LINUX GCC ----------|\n    - compiler: g++-4.7\n      env: [\"CMAKE_OPTIONS='-DSKIP_PORTABILITY_TEST=ON'\", \"COMPILER=g++-4.7\"]\n      addons:\n        apt:\n          sources: *default_sources\n          packages: ['g++-4.7', *default_packages]\n\n    - compiler: g++-4.8\n      env: [\"CMAKE_OPTIONS='-DSKIP_PORTABILITY_TEST=ON'\", \"COMPILER=g++-4.8\"]\n      addons:\n        apt:\n          sources: *default_sources\n          packages: ['g++-4.8', *default_packages]\n         \n    - compiler: g++-4.9\n      env: [\"CMAKE_OPTIONS='-DSKIP_PORTABILITY_TEST=ON'\", \"COMPILER=g++-4.9\"]\n      addons:\n        apt:\n          sources: *default_sources\n          packages: ['g++-4.9', *default_packages]\n         \n    - compiler: g++-5\n      env: [\"CMAKE_OPTIONS='-DSKIP_PORTABILITY_TEST=ON'\", \"COMPILER=g++-5\"]\n      addons:\n        apt:\n          sources: *default_sources\n          packages: ['g++-5', *default_packages]\n    \n    - compiler: g++-5\n      name: \"g++-5 multilib\"\n      env: [\"COMPILER=g++-5\"]\n      addons:\n        apt:\n          sources: *default_sources\n          packages: ['gcc-multilib g++-5-multilib linux-libc-dev', *default_packages]\n                  \n    - compiler: g++-6\n      env: [\"CMAKE_OPTIONS='-DSKIP_PORTABILITY_TEST=ON'\", \"COMPILER=g++-6\"]\n      addons:\n        apt:\n          sources: *default_sources\n          packages: ['g++-6', *default_packages]\n\n    - compiler: g++-7\n      name: \"g++-7 c++17\"\n      env: [\"CMAKE_OPTIONS='-DSKIP_PORTABILITY_TEST=ON -DCMAKE_CXX_STANDARD=17'\", \"COMPILER=g++-7\"]\n      addons:\n        apt:\n          sources: *default_sources\n          packages: ['g++-7', *default_packages]\n\n    # |---------- LINUX GCC ----------|\n    - dist: xenial\n      compiler: g++-8\n      name: \"g++-8 c++17\"\n      env: [\"CMAKE_OPTIONS='-DSKIP_PORTABILITY_TEST=ON -DCMAKE_CXX_STANDARD=17'\", \"COMPILER=g++-8\"]\n      addons:\n        apt:\n            sources: *default_sources\n            packages: ['g++-8', *default_packages]\n\n\n    # |---------- LINUX CLANG ----------|\n    - compiler: clang++-3.5\n      env: [\"CMAKE_OPTIONS='-DSKIP_PORTABILITY_TEST=ON'\", \"COMPILER=clang++-3.5\"]\n      addons:\n        apt:\n          sources: [*default_sources, llvm-toolchain-precise-3.5]\n          packages: ['clang-3.5', *default_packages]\n\n    - compiler: clang++-3.6\n      env: [\"CMAKE_OPTIONS='-DSKIP_PORTABILITY_TEST=ON'\", \"COMPILER=clang++-3.6\"]\n      addons:\n        apt:\n          sources: [*default_sources, llvm-toolchain-precise-3.6]\n          packages: ['clang-3.6', *default_packages]\n\n    - compiler: clang++-3.7\n      env: [\"CMAKE_OPTIONS='-DSKIP_PORTABILITY_TEST=ON'\", \"COMPILER=clang++-3.7\"]\n      addons:\n        apt:\n          sources: [*default_sources, llvm-toolchain-precise-3.7]\n          packages: ['clang-3.7', *default_packages]\n\n    - compiler: clang++-3.8\n      env: [\"CMAKE_OPTIONS='-DSKIP_PORTABILITY_TEST=ON'\", \"COMPILER=clang++-3.8\"]\n      addons:\n        apt:\n          sources: [*default_sources, llvm-toolchain-precise-3.8]\n          packages: ['clang-3.8', *default_packages]\n\n    - compiler: clang++-3.9\n      env: [\"CMAKE_OPTIONS='-DSKIP_PORTABILITY_TEST=ON'\", \"COMPILER=clang++-3.9\"]\n      addons:\n        apt:\n          sources: [*default_sources, llvm-toolchain-precise-3.9]\n          packages: ['clang-3.9', *default_packages]\n\n    - compiler: clang++-4.0\n      env: [\"CMAKE_OPTIONS='-DSKIP_PORTABILITY_TEST=ON'\", \"COMPILER=clang++-4.0\"]\n      addons:\n        apt:\n          sources: [*default_sources, llvm-toolchain-trusty-4.0]\n          packages: ['clang-4.0', 'g++-5', *default_packages]\n\n    - compiler: clang++-5.0\n      env: [\"CMAKE_OPTIONS='-DSKIP_PORTABILITY_TEST=ON'\", \"COMPILER=clang++-5.0\"]\n      addons: &clang50\n        apt:\n          packages: \n            - clang-5.0\n            - g++-7\n            - *default_packages\n          sources: \n            - *default_sources\n            - llvm-toolchain-trusty-5.0\n            - sourceline: 'deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-5.0 main'\n              key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key'\n\n    - env: [\"CMAKE_OPTIONS='-DSKIP_PORTABILITY_TEST=ON -DCMAKE_CXX_STANDARD=17'\", \"COMPILER=clang++-5.0\"]\n      name: \"clang++-5.0 c++17\"\n      addons: *clang50\n\n    - compiler: clang++-7\n      name: \"clang++-7 c++17\"\n      env: [\"CMAKE_OPTIONS='-DSKIP_PORTABILITY_TEST=ON -DCMAKE_CXX_STANDARD=17'\", \"COMPILER=clang++-7\"]\n      addons: \n        apt:\n          packages: \n            - clang-7\n            - g++-7\n            - *default_packages\n          sources: \n            - *default_sources\n            - llvm-toolchain-trusty-7\n\n    - compiler: clang++-8\n      name: \"clang++-8 c++17 libc++\"\n      env: [\"CMAKE_OPTIONS='-DSKIP_PORTABILITY_TEST=ON -DCMAKE_CXX_STANDARD=17 -DCLANG_USE_LIBCPP=ON -DSKIP_PERFORMANCE_COMPARISON=ON'\", \"COMPILER=clang++-8\"]\n      addons: \n        apt:\n          packages: \n            - clang-8\n            - g++-8\n            - libc++-8-dev\n            - libc++abi-8-dev\n            - *default_packages\n          sources: \n            - *default_sources\n            - llvm-toolchain-trusty-8\n\n    # # |---------- LINUX CLANG (32-bit) ----------|\n    # # Doesn't work.\n    # - compiler: clang++\n    #   addons:\n    #     apt:\n    #       sources: [*default_sources]\n    #       packages: ['clang', 'gcc-multilib', 'g++-multilib', *default_packages]\n\n\n    # |---------- OSX CLANG ----------|\n    - compiler: clang++\n      os: osx\n      osx_image: xcode7.3\n      env: COMPILER=clang++\n\n    - compiler: clang++\n      os: osx\n      osx_image: xcode8\n      env: COMPILER=clang++\n\n    # # Missing CMake\n    # - compiler: clang++\n    #   os: osx\n    #   osx_image: xcode8.1\n\n    - compiler: clang++\n      os: osx\n      osx_image: xcode8.2\n      env: COMPILER=clang++\n\n    - compiler: clang++\n      os: osx\n      osx_image: xcode8.3\n      env: COMPILER=clang++\n\n    - compiler: clang++\n      env: [\"CMAKE_OPTIONS='-DWITH_WERROR=OFF'\"]\n      os: osx\n      osx_image: xcode9\n      env: COMPILER=clang++\n    \n    - compiler: clang++\n      env: [\"CMAKE_OPTIONS='-DWITH_WERROR=OFF'\"]\n      os: osx\n      osx_image: xcode10\n      env: COMPILER=clang++\n\ninstall:\n  # Set the ${CXX} variable properly\n  - export CXX=${COMPILER}\n  - ${CXX} --version\n\n  # Dependencies required by the CI are installed in ${TRAVIS_BUILD_DIR}/deps/\n  - DEPS_DIR=\"${TRAVIS_BUILD_DIR}/deps\"\n  - mkdir -p \"${DEPS_DIR}\"\n  - cd \"${DEPS_DIR}\"\n\n  - JOBS=2\n\n  # [linux]: Install the right version of libc++\n  - |\n    LLVM_INSTALL=${DEPS_DIR}/llvm/install\n    # if in linux and compiler clang and llvm not installed\n    if [[ \"${TRAVIS_OS_NAME}\" == \"linux\" && \"${CXX%%+*}\" == \"clang\" && -n \"$(ls -A ${LLVM_INSTALL})\" ]]; then\n      if   [[ \"${CXX}\" == \"clang++-3.6\" ]]; then LLVM_VERSION=\"3.6.2\";\n      elif [[ \"${CXX}\" == \"clang++-3.7\" ]]; then LLVM_VERSION=\"3.7.1\";\n      elif [[ \"${CXX}\" == \"clang++-3.8\" ]]; then LLVM_VERSION=\"3.8.1\";\n      elif [[ \"${CXX}\" == \"clang++-3.9\" ]]; then LLVM_VERSION=\"3.9.1\";\n      fi\n      LLVM_URL=\"http://llvm.org/releases/${LLVM_VERSION}/llvm-${LLVM_VERSION}.src.tar.xz\"\n      LIBCXX_URL=\"http://llvm.org/releases/${LLVM_VERSION}/libcxx-${LLVM_VERSION}.src.tar.xz\"\n      LIBCXXABI_URL=\"http://llvm.org/releases/${LLVM_VERSION}/libcxxabi-${LLVM_VERSION}.src.tar.xz\"\n      mkdir -p llvm llvm/build llvm/projects/libcxx llvm/projects/libcxxabi\n      travis_retry wget -O - ${LLVM_URL} | tar --strip-components=1 -xJ -C llvm\n      travis_retry wget -O - ${LIBCXX_URL} | tar --strip-components=1 -xJ -C llvm/projects/libcxx\n      travis_retry wget -O - ${LIBCXXABI_URL} | tar --strip-components=1 -xJ -C llvm/projects/libcxxabi\n      (cd llvm/build && cmake .. -DCMAKE_INSTALL_PREFIX=${LLVM_INSTALL})\n      (cd llvm/build/projects/libcxx && make install -j2)\n      (cd llvm/build/projects/libcxxabi && make install -j2)\n      export CXXFLAGS=\"-isystem ${LLVM_INSTALL}/include/c++/v1\"\n      export LDFLAGS=\"-L ${LLVM_INSTALL}/lib -l c++ -l c++abi\"\n      export LD_LIBRARY_PATH=\"${LD_LIBRARY_PATH}:${LLVM_INSTALL}/lib\"\n    fi\n\nscript:\n  - cd \"${TRAVIS_BUILD_DIR}\"\n  - if [[ \"${COMPILERCC}\" != \"\" ]]; then export CC=\"${COMPILERCC}\"; fi\n  - if [[ \"${COMPILER}\" != \"\" ]]; then export CXX=\"${COMPILER}\"; fi\n  - $CXX --version\n  - cmake --version\n  - mkdir build && cd build\n  - cmake ${CMAKE_OPTIONS} .. && make -j4\n  - ctest . --output-on-failure\n\nbranches:\n  only:\n    - master\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/CMakeLists.txt",
    "content": "cmake_minimum_required (VERSION 2.6.2)\nproject (cereal)\n\noption(SKIP_PORTABILITY_TEST \"Skip portability (32 bit) tests\" OFF)\noption(SKIP_PERFORMANCE_COMPARISON \"Skip building performance comparison (requires boost)\" OFF)\nif(NOT CMAKE_VERSION VERSION_LESS 3.0) # installing cereal requires INTERFACE lib\n    option(JUST_INSTALL_CEREAL \"Don't do anything besides installing the library\" OFF)\nendif()\n\noption(THREAD_SAFE \"Use mutexes to ensure thread safety\" OFF)\nif(THREAD_SAFE)\n    add_definitions(-DCEREAL_THREAD_SAFE=1)\n    set(CEREAL_THREAD_LIBS \"pthread\")\nelse()\n    set(CEREAL_THREAD_LIBS \"\")\nendif()\n\nif(MSVC)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} /bigobj /W3 /WX\")\nelse()\n    set(CMAKE_CXX_FLAGS \"-Wall -g -Wextra -Wshadow -pedantic -Wold-style-cast ${CMAKE_CXX_FLAGS}\")\n    option(WITH_WERROR \"Compile with '-Werror' C++ compiler flag\" ON)\n    if(WITH_WERROR)\n        set(CMAKE_CXX_FLAGS \"-Werror ${CMAKE_CXX_FLAGS}\")\n    endif(WITH_WERROR)\n\n    option(CLANG_USE_LIBCPP \"Use libc++ for clang compilation\" OFF)\n    if(CLANG_USE_LIBCPP)\n        set(CMAKE_CXX_FLAGS \"-stdlib=libc++ ${CMAKE_CXX_FLAGS}\")\n        set(CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -lc++abi\")\n    endif()\n\n    if(CMAKE_VERSION VERSION_LESS 3.1)\n        set(CMAKE_CXX_FLAGS \"-std=c++11 ${CMAKE_CXX_FLAGS}\")\n    else()\n      if(NOT DEFINED CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD STREQUAL \"98\")\n        set(CMAKE_CXX_STANDARD 11)\n      endif()\n\n      if(CMAKE_CXX_STANDARD GREATER 14)\n        cmake_minimum_required(VERSION 3.8)\n      endif()\n\n      set(CMAKE_CXX_STANDARD_REQUIRED ON)\n    endif()\n\nendif()\n\nif(NOT CMAKE_VERSION VERSION_LESS 3.0)\n    add_library(cereal INTERFACE)\n    target_include_directories(cereal INTERFACE\n        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>\n        $<INSTALL_INTERFACE:include>\n    )\n    install(TARGETS cereal EXPORT cereal\n        DESTINATION lib) # ignored\n    install(EXPORT cereal FILE cereal-config.cmake\n        DESTINATION share/cmake/cereal)\n    install(DIRECTORY include/cereal DESTINATION include)\nendif()\n\nif(JUST_INSTALL_CEREAL)\n    return()\nendif()\n\ninclude_directories(./include)\n\nif(NOT CMAKE_VERSION VERSION_LESS 3.12)\n  cmake_policy(VERSION 3.12)\nendif()\n\n# Boost serialization for performance sandbox\nfind_package(Boost COMPONENTS serialization)\n\nif(Boost_FOUND)\n  include_directories(SYSTEM ${Boost_INCLUDE_DIRS})\nendif(Boost_FOUND)\n  \nenable_testing()\nadd_subdirectory(unittests)\n\nadd_subdirectory(sandbox)\n\nadd_subdirectory(doc)\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/LICENSE",
    "content": "Copyright (c) 2014, Randolph Voorhies, Shane Grant\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of cereal nor the\n      names of its contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/README.md",
    "content": "cereal - A C++11 library for serialization\n==========================================\n\n<img src=\"http://uscilab.github.io/cereal/assets/img/cerealboxside.png\" align=\"right\"/><p>cereal is a header-only C++11 serialization library.  cereal takes arbitrary data types and reversibly turns them into different representations, such as compact binary encodings, XML, or JSON.  cereal was designed to be fast, light-weight, and easy to extend - it has no external dependencies and can be easily bundled with other code or used standalone.</p>\n\n### cereal has great documentation\n\nLooking for more information on how cereal works and its documentation?  Visit [cereal's web page](http://USCiLab.github.com/cereal) to get the latest information.\n\n### cereal is easy to use\n\nInstallation and use of of cereal is fully documented on the [main web page](http://USCiLab.github.com/cereal), but this is a quick and dirty version:\n\n* Download cereal and place the headers somewhere your code can see them\n* Write serialization functions for your custom types or use the built in support for the standard library cereal provides\n* Use the serialization archives to load and save data\n\n```cpp\n#include <cereal/types/unordered_map.hpp>\n#include <cereal/types/memory.hpp>\n#include <cereal/archives/binary.hpp>\n#include <fstream>\n    \nstruct MyRecord\n{\n  uint8_t x, y;\n  float z;\n  \n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( x, y, z );\n  }\n};\n    \nstruct SomeData\n{\n  int32_t id;\n  std::shared_ptr<std::unordered_map<uint32_t, MyRecord>> data;\n  \n  template <class Archive>\n  void save( Archive & ar ) const\n  {\n    ar( data );\n  }\n      \n  template <class Archive>\n  void load( Archive & ar )\n  {\n    static int32_t idGen = 0;\n    id = idGen++;\n    ar( data );\n  }\n};\n\nint main()\n{\n  std::ofstream os(\"out.cereal\", std::ios::binary);\n  cereal::BinaryOutputArchive archive( os );\n\n  SomeData myData;\n  archive( myData );\n\n  return 0;\n}\n```    \n\n### cereal has a mailing list\n\nEither get in touch over <a href=\"mailto:cerealcpp@googlegroups.com\">email</a> or [on the web](https://groups.google.com/forum/#!forum/cerealcpp).\n\n\n\n## cereal has a permissive license\n\ncereal is licensed under the [BSD license](http://opensource.org/licenses/BSD-3-Clause).\n\n## cereal build status\n\n* master : [![Build Status](https://travis-ci.com/USCiLab/cereal.svg?branch=master)](https://travis-ci.com/USCiLab/cereal)\n[![Build status](https://ci.appveyor.com/api/projects/status/91aou6smj36or0vb/branch/master?svg=true)](https://ci.appveyor.com/project/AzothAmmo/cereal/branch/master)\n\n---\n\nWere you looking for the Haskell cereal?  Go <a href=\"https://github.com/GaloisInc/cereal\">here</a>.\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/appveyor.yml",
    "content": "# can use variables like {build} and {branch}\nversion: 1.2.{build}\npull_requests:\n  do_not_increment_build_number: true\n\nbranches:\n  only:\n    - master\n\nconfiguration:\n  - Debug\n  - Release\n\nenvironment:\n  matrix:\n    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013\n      VS_VERSION_MAJOR: 12\n      BOOST_ROOT: C:\\Libraries\\boost_1_58_0\n    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015\n      VS_VERSION_MAJOR: 14\n      BOOST_ROOT: C:\\Libraries\\boost_1_60_0\n    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017\n      VS_VERSION_MAJOR: 15\n      BOOST_ROOT: C:\\Libraries\\boost_1_66_0\n      #    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 Preview\n      #      VS_VERSION_MAJOR: 16\n      #      BOOST_ROOT: C:\\Libraries\\boost_1_66_0\n\nplatform:\n  - Win32\n  - x64\n\nbefore_build: \"scripts\\\\appveyor.bat\"\n\nbuild:\n  parallel: true\n  project: build/cereal.sln\n  verbosity: minimal\n\ntest_script: \"scripts\\\\appveyor.bat test\"\n\nartifacts:\n  - path: build\\Testing\n  - path: out\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/doc/CMakeLists.txt",
    "content": "find_package(Doxygen)\nif(DOXYGEN_FOUND)\n\n  configure_file(\"${CMAKE_CURRENT_SOURCE_DIR}/doxygen.in\" \"${CMAKE_CURRENT_BINARY_DIR}/doxygen.cfg\" @ONLY)\n  add_custom_target(doc\n    COMMAND ${DOXYGEN_EXECUTABLE} \"${CMAKE_CURRENT_BINARY_DIR}/doxygen.cfg\"\n    WORKING_DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}/..\"\n    COMMENT \"Generating API documentation with Doxygen\" VERBATIM\n    )\n\n  configure_file(\"${CMAKE_CURRENT_SOURCE_DIR}/../scripts/updatedoc.in\" \"${CMAKE_CURRENT_BINARY_DIR}/updatedoc.sh\" @ONLY)\n  add_custom_target(update-doc\n    COMMAND \"${CMAKE_CURRENT_BINARY_DIR}/updatedoc.sh\"\n    DEPENDS doc\n    COMMENT \"Copying documentation to gh-pages branch\" VERBATIM\n    )\n\nendif(DOXYGEN_FOUND)"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/doc/DoxygenLayout.xml",
    "content": "<doxygenlayout version=\"1.0\">\n  <!-- Generated by doxygen 1.8.3.1-20130402 -->\n  <!-- Navigation index tabs for HTML output -->\n  <navindex>\n    <tab type=\"user\" visible=\"true\" title=\"cereal\" url=\"../../index.html\"/>\n    <tab type=\"mainpage\" visible=\"yes\" title=\"Doxygen Documentation\"/>\n    <tab type=\"pages\" visible=\"no\" title=\"\" intro=\"\"/>\n    <tab type=\"modules\" visible=\"yes\" title=\"Code Modules\" intro=\"\"/>\n    <tab type=\"namespaces\" visible=\"no\" title=\"\">\n      <tab type=\"namespacelist\" visible=\"yes\" title=\"\" intro=\"\"/>\n      <tab type=\"namespacemembers\" visible=\"yes\" title=\"\" intro=\"\"/>\n    </tab>\n    <tab type=\"classes\" visible=\"no\" title=\"\">\n      <tab type=\"classlist\" visible=\"yes\" title=\"\" intro=\"\"/>\n      <tab type=\"classindex\" visible=\"$ALPHABETICAL_INDEX\" title=\"\"/>\n      <tab type=\"hierarchy\" visible=\"yes\" title=\"\" intro=\"\"/>\n      <tab type=\"classmembers\" visible=\"yes\" title=\"\" intro=\"\"/>\n    </tab>\n    <tab type=\"files\" visible=\"yes\" title=\"Source File Documentation\">\n      <tab type=\"filelist\" visible=\"yes\" title=\"\" intro=\"\"/>\n      <tab type=\"globals\" visible=\"yes\" title=\"\" intro=\"\"/>\n    </tab>\n    <tab type=\"examples\" visible=\"no\" title=\"\" intro=\"\"/>\n    <tab type=\"user\" visible=\"true\" title=\"Github\" url=\"https://github.com/USCiLab/cereal\"/>\n  </navindex>\n\n  <!-- Layout definition for a class page -->\n  <class>\n    <briefdescription visible=\"yes\"/>\n    <includes visible=\"$SHOW_INCLUDE_FILES\"/>\n    <inheritancegraph visible=\"$CLASS_GRAPH\"/>\n    <collaborationgraph visible=\"$COLLABORATION_GRAPH\"/>\n    <memberdecl>\n      <nestedclasses visible=\"yes\" title=\"\"/>\n      <publictypes title=\"\"/>\n      <publicslots title=\"\"/>\n      <signals title=\"\"/>\n      <publicmethods title=\"\"/>\n      <publicstaticmethods title=\"\"/>\n      <publicattributes title=\"\"/>\n      <publicstaticattributes title=\"\"/>\n      <protectedtypes title=\"\"/>\n      <protectedslots title=\"\"/>\n      <protectedmethods title=\"\"/>\n      <protectedstaticmethods title=\"\"/>\n      <protectedattributes title=\"\"/>\n      <protectedstaticattributes title=\"\"/>\n      <packagetypes title=\"\"/>\n      <packagemethods title=\"\"/>\n      <packagestaticmethods title=\"\"/>\n      <packageattributes title=\"\"/>\n      <packagestaticattributes title=\"\"/>\n      <properties title=\"\"/>\n      <events title=\"\"/>\n      <privatetypes title=\"\"/>\n      <privateslots title=\"\"/>\n      <privatemethods title=\"\"/>\n      <privatestaticmethods title=\"\"/>\n      <privateattributes title=\"\"/>\n      <privatestaticattributes title=\"\"/>\n      <friends title=\"\"/>\n      <related title=\"\" subtitle=\"\"/>\n      <membergroups visible=\"yes\"/>\n    </memberdecl>\n    <detaileddescription title=\"\"/>\n    <memberdef>\n      <inlineclasses title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <constructors title=\"\"/>\n      <functions title=\"\"/>\n      <related title=\"\"/>\n      <variables title=\"\"/>\n      <properties title=\"\"/>\n      <events title=\"\"/>\n    </memberdef>\n    <allmemberslink visible=\"yes\"/>\n    <usedfiles visible=\"$SHOW_USED_FILES\"/>\n    <authorsection visible=\"yes\"/>\n  </class>\n\n  <!-- Layout definition for a namespace page -->\n  <namespace>\n    <briefdescription visible=\"yes\"/>\n    <memberdecl>\n      <nestednamespaces visible=\"yes\" title=\"\"/>\n      <classes visible=\"yes\" title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n      <membergroups visible=\"yes\"/>\n    </memberdecl>\n    <detaileddescription title=\"\"/>\n    <memberdef>\n      <inlineclasses title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n    </memberdef>\n    <authorsection visible=\"yes\"/>\n  </namespace>\n\n  <!-- Layout definition for a file page -->\n  <file>\n    <briefdescription visible=\"yes\"/>\n    <includes visible=\"$SHOW_INCLUDE_FILES\"/>\n    <includegraph visible=\"$INCLUDE_GRAPH\"/>\n    <includedbygraph visible=\"$INCLUDED_BY_GRAPH\"/>\n    <sourcelink visible=\"yes\"/>\n    <memberdecl>\n      <classes visible=\"yes\" title=\"\"/>\n      <namespaces visible=\"yes\" title=\"\"/>\n      <defines title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n      <membergroups visible=\"yes\"/>\n    </memberdecl>\n    <detaileddescription title=\"\"/>\n    <memberdef>\n      <inlineclasses title=\"\"/>\n      <defines title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n    </memberdef>\n    <authorsection/>\n  </file>\n\n  <!-- Layout definition for a group page -->\n  <group>\n    <briefdescription visible=\"yes\"/>\n    <groupgraph visible=\"$GROUP_GRAPHS\"/>\n    <memberdecl>\n      <nestedgroups visible=\"yes\" title=\"\"/>\n      <dirs visible=\"yes\" title=\"\"/>\n      <files visible=\"yes\" title=\"\"/>\n      <namespaces visible=\"yes\" title=\"\"/>\n      <classes visible=\"yes\" title=\"\"/>\n      <defines title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <enumvalues title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n      <signals title=\"\"/>\n      <publicslots title=\"\"/>\n      <protectedslots title=\"\"/>\n      <privateslots title=\"\"/>\n      <events title=\"\"/>\n      <properties title=\"\"/>\n      <friends title=\"\"/>\n      <membergroups visible=\"yes\"/>\n    </memberdecl>\n    <detaileddescription title=\"\"/>\n    <memberdef>\n      <pagedocs/>\n      <inlineclasses title=\"\"/>\n      <defines title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <enumvalues title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n      <signals title=\"\"/>\n      <publicslots title=\"\"/>\n      <protectedslots title=\"\"/>\n      <privateslots title=\"\"/>\n      <events title=\"\"/>\n      <properties title=\"\"/>\n      <friends title=\"\"/>\n    </memberdef>\n    <authorsection visible=\"yes\"/>\n  </group>\n\n  <!-- Layout definition for a directory page -->\n  <directory>\n    <briefdescription visible=\"yes\"/>\n    <directorygraph visible=\"yes\"/>\n    <memberdecl>\n      <dirs visible=\"yes\"/>\n      <files visible=\"yes\"/>\n    </memberdecl>\n    <detaileddescription title=\"\"/>\n  </directory>\n</doxygenlayout>\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/doc/doxygen.in",
    "content": "# Doxyfile 1.8.3.1\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) for a project.\n#\n# All text after a hash (#) is considered a comment and will be ignored.\n# The format is:\n#       TAG = value [value, ...]\n# For lists items can also be appended using:\n#       TAG += value [value, ...]\n# Values that contain spaces should be placed between quotes (\" \").\n\n#---------------------------------------------------------------------------\n# Project related configuration options\n#---------------------------------------------------------------------------\n\n# This tag specifies the encoding used for all characters in the config file\n# that follow. The default is UTF-8 which is also the encoding used for all\n# text before the first occurrence of this tag. Doxygen uses libiconv (or the\n# iconv built into libc) for the transcoding. See\n# http://www.gnu.org/software/libiconv for the list of possible encodings.\n\nDOXYFILE_ENCODING      = UTF-8\n\n# The PROJECT_NAME tag is a single word (or sequence of words) that should\n# identify the project. Note that if you do not use Doxywizard you need\n# to put quotes around the project name if it contains spaces.\n\nPROJECT_NAME           = \"cereal\"\n\n# The PROJECT_NUMBER tag can be used to enter a project or revision number.\n# This could be handy for archiving the generated documentation or\n# if some version control system is used.\n\nPROJECT_NUMBER         =\n\n# Using the PROJECT_BRIEF tag one can provide an optional one line description\n# for a project that appears at the top of each page and should give viewer\n# a quick idea about the purpose of the project. Keep the description short.\n\nPROJECT_BRIEF          = \"A C++11 library for serialization\"\n\n# With the PROJECT_LOGO tag one can specify an logo or icon that is\n# included in the documentation. The maximum height of the logo should not\n# exceed 55 pixels and the maximum width should not exceed 200 pixels.\n# Doxygen will copy the logo to the output directory.\n\nPROJECT_LOGO           =\n\n# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)\n# base path where the generated documentation will be put.\n# If a relative path is entered, it will be relative to the location\n# where doxygen was started. If left blank the current directory will be used.\n\nOUTPUT_DIRECTORY       = @CMAKE_CURRENT_BINARY_DIR@/\n\n# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create\n# 4096 sub-directories (in 2 levels) under the output directory of each output\n# format and will distribute the generated files over these directories.\n# Enabling this option can be useful when feeding doxygen a huge amount of\n# source files, where putting all generated files in the same directory would\n# otherwise cause performance problems for the file system.\n\nCREATE_SUBDIRS         = NO\n\n# The OUTPUT_LANGUAGE tag is used to specify the language in which all\n# documentation generated by doxygen is written. Doxygen will use this\n# information to generate all constant output in the proper language.\n# The default language is English, other supported languages are:\n# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,\n# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,\n# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English\n# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,\n# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,\n# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.\n\nOUTPUT_LANGUAGE        = English\n\n# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will\n# include brief member descriptions after the members that are listed in\n# the file and class documentation (similar to JavaDoc).\n# Set to NO to disable this.\n\nBRIEF_MEMBER_DESC      = YES\n\n# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend\n# the brief description of a member or function before the detailed description.\n# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the\n# brief descriptions will be completely suppressed.\n\nREPEAT_BRIEF           = YES\n\n# This tag implements a quasi-intelligent brief description abbreviator\n# that is used to form the text in various listings. Each string\n# in this list, if found as the leading text of the brief description, will be\n# stripped from the text and the result after processing the whole list, is\n# used as the annotated text. Otherwise, the brief description is used as-is.\n# If left blank, the following values are used (\"$name\" is automatically\n# replaced with the name of the entity): \"The $name class\" \"The $name widget\"\n# \"The $name file\" \"is\" \"provides\" \"specifies\" \"contains\"\n# \"represents\" \"a\" \"an\" \"the\"\n\nABBREVIATE_BRIEF       =\n\n# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then\n# Doxygen will generate a detailed section even if there is only a brief\n# description.\n\nALWAYS_DETAILED_SEC    = NO\n\n# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all\n# inherited members of a class in the documentation of that class as if those\n# members were ordinary class members. Constructors, destructors and assignment\n# operators of the base classes will not be shown.\n\nINLINE_INHERITED_MEMB  = NO\n\n# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full\n# path before files name in the file list and in the header files. If set\n# to NO the shortest path that makes the file name unique will be used.\n\nFULL_PATH_NAMES        = YES\n\n# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag\n# can be used to strip a user-defined part of the path. Stripping is\n# only done if one of the specified strings matches the left-hand part of\n# the path. The tag can be used to show relative paths in the file list.\n# If left blank the directory from which doxygen is run is used as the\n# path to strip. Note that you specify absolute paths here, but also\n# relative paths, which will be relative from the directory where doxygen is\n# started.\n\nSTRIP_FROM_PATH        =\n\n# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of\n# the path mentioned in the documentation of a class, which tells\n# the reader which header file to include in order to use a class.\n# If left blank only the name of the header file containing the class\n# definition is used. Otherwise one should specify the include paths that\n# are normally passed to the compiler using the -I flag.\n\nSTRIP_FROM_INC_PATH    = include\n\n# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter\n# (but less readable) file names. This can be useful if your file system\n# doesn't support long names like on DOS, Mac, or CD-ROM.\n\nSHORT_NAMES            = NO\n\n# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen\n# will interpret the first line (until the first dot) of a JavaDoc-style\n# comment as the brief description. If set to NO, the JavaDoc\n# comments will behave just like regular Qt-style comments\n# (thus requiring an explicit @brief command for a brief description.)\n\nJAVADOC_AUTOBRIEF      = NO\n\n# If the QT_AUTOBRIEF tag is set to YES then Doxygen will\n# interpret the first line (until the first dot) of a Qt-style\n# comment as the brief description. If set to NO, the comments\n# will behave just like regular Qt-style comments (thus requiring\n# an explicit \\brief command for a brief description.)\n\nQT_AUTOBRIEF           = NO\n\n# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen\n# treat a multi-line C++ special comment block (i.e. a block of //! or ///\n# comments) as a brief description. This used to be the default behaviour.\n# The new default is to treat a multi-line C++ comment block as a detailed\n# description. Set this tag to YES if you prefer the old behaviour instead.\n\nMULTILINE_CPP_IS_BRIEF = NO\n\n# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented\n# member inherits the documentation from any documented member that it\n# re-implements.\n\nINHERIT_DOCS           = YES\n\n# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce\n# a new page for each member. If set to NO, the documentation of a member will\n# be part of the file/class/namespace that contains it.\n\nSEPARATE_MEMBER_PAGES  = NO\n\n# The TAB_SIZE tag can be used to set the number of spaces in a tab.\n# Doxygen uses this value to replace tabs by spaces in code fragments.\n\nTAB_SIZE               = 2\n\n# This tag can be used to specify a number of aliases that acts\n# as commands in the documentation. An alias has the form \"name=value\".\n# For example adding \"sideeffect=\\par Side Effects:\\n\" will allow you to\n# put the command \\sideeffect (or @sideeffect) in the documentation, which\n# will result in a user-defined paragraph with heading \"Side Effects:\".\n# You can put \\n's in the value part of an alias to insert newlines.\n\nALIASES                =\n\n# This tag can be used to specify a number of word-keyword mappings (TCL only).\n# A mapping has the form \"name=value\". For example adding\n# \"class=itcl::class\" will allow you to use the command class in the\n# itcl::class meaning.\n\nTCL_SUBST              =\n\n# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C\n# sources only. Doxygen will then generate output that is more tailored for C.\n# For instance, some of the names that are used will be different. The list\n# of all members will be omitted, etc.\n\nOPTIMIZE_OUTPUT_FOR_C  = NO\n\n# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java\n# sources only. Doxygen will then generate output that is more tailored for\n# Java. For instance, namespaces will be presented as packages, qualified\n# scopes will look different, etc.\n\nOPTIMIZE_OUTPUT_JAVA   = NO\n\n# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran\n# sources only. Doxygen will then generate output that is more tailored for\n# Fortran.\n\nOPTIMIZE_FOR_FORTRAN   = NO\n\n# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL\n# sources. Doxygen will then generate output that is tailored for\n# VHDL.\n\nOPTIMIZE_OUTPUT_VHDL   = NO\n\n# Doxygen selects the parser to use depending on the extension of the files it\n# parses. With this tag you can assign which parser to use for a given\n# extension. Doxygen has a built-in mapping, but you can override or extend it\n# using this tag. The format is ext=language, where ext is a file extension,\n# and language is one of the parsers supported by doxygen: IDL, Java,\n# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C,\n# C++. For instance to make doxygen treat .inc files as Fortran files (default\n# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note\n# that for custom extensions you also need to set FILE_PATTERNS otherwise the\n# files are not read by doxygen.\n\nEXTENSION_MAPPING      =\n\n# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all\n# comments according to the Markdown format, which allows for more readable\n# documentation. See http://daringfireball.net/projects/markdown/ for details.\n# The output of markdown processing is further processed by doxygen, so you\n# can mix doxygen, HTML, and XML commands with Markdown formatting.\n# Disable only in case of backward compatibilities issues.\n\nMARKDOWN_SUPPORT       = YES\n\n# When enabled doxygen tries to link words that correspond to documented classes,\n# or namespaces to their corresponding documentation. Such a link can be\n# prevented in individual cases by by putting a % sign in front of the word or\n# globally by setting AUTOLINK_SUPPORT to NO.\n\nAUTOLINK_SUPPORT       = YES\n\n# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want\n# to include (a tag file for) the STL sources as input, then you should\n# set this tag to YES in order to let doxygen match functions declarations and\n# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.\n# func(std::string) {}). This also makes the inheritance and collaboration\n# diagrams that involve STL classes more complete and accurate.\n\nBUILTIN_STL_SUPPORT    = YES\n\n# If you use Microsoft's C++/CLI language, you should set this option to YES to\n# enable parsing support.\n\nCPP_CLI_SUPPORT        = NO\n\n# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.\n# Doxygen will parse them like normal C++ but will assume all classes use public\n# instead of private inheritance when no explicit protection keyword is present.\n\nSIP_SUPPORT            = NO\n\n# For Microsoft's IDL there are propget and propput attributes to indicate\n# getter and setter methods for a property. Setting this option to YES (the\n# default) will make doxygen replace the get and set methods by a property in\n# the documentation. This will only work if the methods are indeed getting or\n# setting a simple type. If this is not the case, or you want to show the\n# methods anyway, you should set this option to NO.\n\nIDL_PROPERTY_SUPPORT   = YES\n\n# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC\n# tag is set to YES, then doxygen will reuse the documentation of the first\n# member in the group (if any) for the other members of the group. By default\n# all members of a group must be documented explicitly.\n\nDISTRIBUTE_GROUP_DOC   = NO\n\n# Set the SUBGROUPING tag to YES (the default) to allow class member groups of\n# the same type (for instance a group of public functions) to be put as a\n# subgroup of that type (e.g. under the Public Functions section). Set it to\n# NO to prevent subgrouping. Alternatively, this can be done per class using\n# the \\nosubgrouping command.\n\nSUBGROUPING            = YES\n\n# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and\n# unions are shown inside the group in which they are included (e.g. using\n# @ingroup) instead of on a separate page (for HTML and Man pages) or\n# section (for LaTeX and RTF).\n\nINLINE_GROUPED_CLASSES = NO\n\n# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and\n# unions with only public data fields will be shown inline in the documentation\n# of the scope in which they are defined (i.e. file, namespace, or group\n# documentation), provided this scope is documented. If set to NO (the default),\n# structs, classes, and unions are shown on a separate page (for HTML and Man\n# pages) or section (for LaTeX and RTF).\n\nINLINE_SIMPLE_STRUCTS  = NO\n\n# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum\n# is documented as struct, union, or enum with the name of the typedef. So\n# typedef struct TypeS {} TypeT, will appear in the documentation as a struct\n# with name TypeT. When disabled the typedef will appear as a member of a file,\n# namespace, or class. And the struct will be named TypeS. This can typically\n# be useful for C code in case the coding convention dictates that all compound\n# types are typedef'ed and only the typedef is referenced, never the tag name.\n\nTYPEDEF_HIDES_STRUCT   = NO\n\n# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to\n# determine which symbols to keep in memory and which to flush to disk.\n# When the cache is full, less often used symbols will be written to disk.\n# For small to medium size projects (<1000 input files) the default value is\n# probably good enough. For larger projects a too small cache size can cause\n# doxygen to be busy swapping symbols to and from disk most of the time\n# causing a significant performance penalty.\n# If the system has enough physical memory increasing the cache will improve the\n# performance by keeping more symbols in memory. Note that the value works on\n# a logarithmic scale so increasing the size by one will roughly double the\n# memory usage. The cache size is given by this formula:\n# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,\n# corresponding to a cache size of 2^16 = 65536 symbols.\n\n#SYMBOL_CACHE_SIZE      = 0\n\n# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be\n# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given\n# their name and scope. Since this can be an expensive process and often the\n# same symbol appear multiple times in the code, doxygen keeps a cache of\n# pre-resolved symbols. If the cache is too small doxygen will become slower.\n# If the cache is too large, memory is wasted. The cache size is given by this\n# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0,\n# corresponding to a cache size of 2^16 = 65536 symbols.\n\nLOOKUP_CACHE_SIZE      = 0\n\n#---------------------------------------------------------------------------\n# Build related configuration options\n#---------------------------------------------------------------------------\n\n# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in\n# documentation are documented, even if no documentation was available.\n# Private class members and static file members will be hidden unless\n# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES\n\nEXTRACT_ALL            = NO\n\n# If the EXTRACT_PRIVATE tag is set to YES all private members of a class\n# will be included in the documentation.\n\nEXTRACT_PRIVATE        = NO\n\n# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal\n# scope will be included in the documentation.\n\nEXTRACT_PACKAGE        = NO\n\n# If the EXTRACT_STATIC tag is set to YES all static members of a file\n# will be included in the documentation.\n\nEXTRACT_STATIC         = NO\n\n# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)\n# defined locally in source files will be included in the documentation.\n# If set to NO only classes defined in header files are included.\n\nEXTRACT_LOCAL_CLASSES  = YES\n\n# This flag is only useful for Objective-C code. When set to YES local\n# methods, which are defined in the implementation section but not in\n# the interface are included in the documentation.\n# If set to NO (the default) only methods in the interface are included.\n\nEXTRACT_LOCAL_METHODS  = NO\n\n# If this flag is set to YES, the members of anonymous namespaces will be\n# extracted and appear in the documentation as a namespace called\n# 'anonymous_namespace{file}', where file will be replaced with the base\n# name of the file that contains the anonymous namespace. By default\n# anonymous namespaces are hidden.\n\nEXTRACT_ANON_NSPACES   = NO\n\n# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all\n# undocumented members of documented classes, files or namespaces.\n# If set to NO (the default) these members will be included in the\n# various overviews, but no documentation section is generated.\n# This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_MEMBERS     = NO\n\n# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all\n# undocumented classes that are normally visible in the class hierarchy.\n# If set to NO (the default) these classes will be included in the various\n# overviews. This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_CLASSES     = NO\n\n# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all\n# friend (class|struct|union) declarations.\n# If set to NO (the default) these declarations will be included in the\n# documentation.\n\nHIDE_FRIEND_COMPOUNDS  = NO\n\n# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any\n# documentation blocks found inside the body of a function.\n# If set to NO (the default) these blocks will be appended to the\n# function's detailed documentation block.\n\nHIDE_IN_BODY_DOCS      = NO\n\n# The INTERNAL_DOCS tag determines if documentation\n# that is typed after a \\internal command is included. If the tag is set\n# to NO (the default) then the documentation will be excluded.\n# Set it to YES to include the internal documentation.\n\nINTERNAL_DOCS          = NO\n\n# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate\n# file names in lower-case letters. If set to YES upper-case letters are also\n# allowed. This is useful if you have classes or files whose names only differ\n# in case and if your file system supports case sensitive file names. Windows\n# and Mac users are advised to set this option to NO.\n\nCASE_SENSE_NAMES       = YES\n\n# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen\n# will show members with their full class and namespace scopes in the\n# documentation. If set to YES the scope will be hidden.\n\nHIDE_SCOPE_NAMES       = NO\n\n# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen\n# will put a list of the files that are included by a file in the documentation\n# of that file.\n\nSHOW_INCLUDE_FILES     = YES\n\n# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen\n# will list include files with double quotes in the documentation\n# rather than with sharp brackets.\n\nFORCE_LOCAL_INCLUDES   = NO\n\n# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]\n# is inserted in the documentation for inline members.\n\nINLINE_INFO            = YES\n\n# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen\n# will sort the (detailed) documentation of file and class members\n# alphabetically by member name. If set to NO the members will appear in\n# declaration order.\n\nSORT_MEMBER_DOCS       = YES\n\n# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the\n# brief documentation of file, namespace and class members alphabetically\n# by member name. If set to NO (the default) the members will appear in\n# declaration order.\n\nSORT_BRIEF_DOCS        = NO\n\n# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen\n# will sort the (brief and detailed) documentation of class members so that\n# constructors and destructors are listed first. If set to NO (the default)\n# the constructors will appear in the respective orders defined by\n# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.\n# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO\n# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.\n\nSORT_MEMBERS_CTORS_1ST = NO\n\n# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the\n# hierarchy of group names into alphabetical order. If set to NO (the default)\n# the group names will appear in their defined order.\n\nSORT_GROUP_NAMES       = NO\n\n# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be\n# sorted by fully-qualified names, including namespaces. If set to\n# NO (the default), the class list will be sorted only by class name,\n# not including the namespace part.\n# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n# Note: This option applies only to the class list, not to the\n# alphabetical list.\n\nSORT_BY_SCOPE_NAME     = NO\n\n# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to\n# do proper type resolution of all parameters of a function it will reject a\n# match between the prototype and the implementation of a member function even\n# if there is only one candidate or it is obvious which candidate to choose\n# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen\n# will still accept a match between prototype and implementation in such cases.\n\nSTRICT_PROTO_MATCHING  = NO\n\n# The GENERATE_TODOLIST tag can be used to enable (YES) or\n# disable (NO) the todo list. This list is created by putting \\todo\n# commands in the documentation.\n\nGENERATE_TODOLIST      = YES\n\n# The GENERATE_TESTLIST tag can be used to enable (YES) or\n# disable (NO) the test list. This list is created by putting \\test\n# commands in the documentation.\n\nGENERATE_TESTLIST      = YES\n\n# The GENERATE_BUGLIST tag can be used to enable (YES) or\n# disable (NO) the bug list. This list is created by putting \\bug\n# commands in the documentation.\n\nGENERATE_BUGLIST       = YES\n\n# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or\n# disable (NO) the deprecated list. This list is created by putting\n# \\deprecated commands in the documentation.\n\nGENERATE_DEPRECATEDLIST= YES\n\n# The ENABLED_SECTIONS tag can be used to enable conditional\n# documentation sections, marked by \\if section-label ... \\endif\n# and \\cond section-label ... \\endcond blocks.\n\nENABLED_SECTIONS       =\n\n# The MAX_INITIALIZER_LINES tag determines the maximum number of lines\n# the initial value of a variable or macro consists of for it to appear in\n# the documentation. If the initializer consists of more lines than specified\n# here it will be hidden. Use a value of 0 to hide initializers completely.\n# The appearance of the initializer of individual variables and macros in the\n# documentation can be controlled using \\showinitializer or \\hideinitializer\n# command in the documentation regardless of this setting.\n\nMAX_INITIALIZER_LINES  = 30\n\n# Set the SHOW_USED_FILES tag to NO to disable the list of files generated\n# at the bottom of the documentation of classes and structs. If set to YES the\n# list will mention the files that were used to generate the documentation.\n\nSHOW_USED_FILES        = YES\n\n# Set the SHOW_FILES tag to NO to disable the generation of the Files page.\n# This will remove the Files entry from the Quick Index and from the\n# Folder Tree View (if specified). The default is YES.\n\nSHOW_FILES             = YES\n\n# Set the SHOW_NAMESPACES tag to NO to disable the generation of the\n# Namespaces page.\n# This will remove the Namespaces entry from the Quick Index\n# and from the Folder Tree View (if specified). The default is YES.\n\nSHOW_NAMESPACES        = YES\n\n# The FILE_VERSION_FILTER tag can be used to specify a program or script that\n# doxygen should invoke to get the current version for each file (typically from\n# the version control system). Doxygen will invoke the program by executing (via\n# popen()) the command <command> <input-file>, where <command> is the value of\n# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file\n# provided by doxygen. Whatever the program writes to standard output\n# is used as the file version. See the manual for examples.\n\nFILE_VERSION_FILTER    =\n\n# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed\n# by doxygen. The layout file controls the global structure of the generated\n# output files in an output format independent way. To create the layout file\n# that represents doxygen's defaults, run doxygen with the -l option.\n# You can optionally specify a file name after the option, if omitted\n# DoxygenLayout.xml will be used as the name of the layout file.\n\nLAYOUT_FILE            = \"@CMAKE_CURRENT_SOURCE_DIR@/DoxygenLayout.xml\"\n\n# The CITE_BIB_FILES tag can be used to specify one or more bib files\n# containing the references data. This must be a list of .bib files. The\n# .bib extension is automatically appended if omitted. Using this command\n# requires the bibtex tool to be installed. See also\n# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style\n# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this\n# feature you need bibtex and perl available in the search path. Do not use\n# file names with spaces, bibtex cannot handle them.\n\nCITE_BIB_FILES         =\n\n#---------------------------------------------------------------------------\n# configuration options related to warning and progress messages\n#---------------------------------------------------------------------------\n\n# The QUIET tag can be used to turn on/off the messages that are generated\n# by doxygen. Possible values are YES and NO. If left blank NO is used.\n\nQUIET                  = YES\n\n# The WARNINGS tag can be used to turn on/off the warning messages that are\n# generated by doxygen. Possible values are YES and NO. If left blank\n# NO is used.\n\nWARNINGS               = YES\n\n# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings\n# for undocumented members. If EXTRACT_ALL is set to YES then this flag will\n# automatically be disabled.\n\nWARN_IF_UNDOCUMENTED   = NO\n\n# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for\n# potential errors in the documentation, such as not documenting some\n# parameters in a documented function, or documenting parameters that\n# don't exist or using markup commands wrongly.\n\nWARN_IF_DOC_ERROR      = YES\n\n# The WARN_NO_PARAMDOC option can be enabled to get warnings for\n# functions that are documented, but have no documentation for their parameters\n# or return value. If set to NO (the default) doxygen will only warn about\n# wrong or incomplete parameter documentation, but not about the absence of\n# documentation.\n\nWARN_NO_PARAMDOC       = NO\n\n# The WARN_FORMAT tag determines the format of the warning messages that\n# doxygen can produce. The string should contain the $file, $line, and $text\n# tags, which will be replaced by the file and line number from which the\n# warning originated and the warning text. Optionally the format may contain\n# $version, which will be replaced by the version of the file (if it could\n# be obtained via FILE_VERSION_FILTER)\n\nWARN_FORMAT            = \"$file:$line: $text\"\n\n# The WARN_LOGFILE tag can be used to specify a file to which warning\n# and error messages should be written. If left blank the output is written\n# to stderr.\n\nWARN_LOGFILE           =\n\n#---------------------------------------------------------------------------\n# configuration options related to the input files\n#---------------------------------------------------------------------------\n\n# The INPUT tag can be used to specify the files and/or directories that contain\n# documented source files. You may enter file names like \"myfile.cpp\" or\n# directories like \"/usr/src/myproject\". Separate the files or directories\n# with spaces.\n\nINPUT                  = @CMAKE_CURRENT_SOURCE_DIR@/../include @CMAKE_CURRENT_SOURCE_DIR@/\n\n# This tag can be used to specify the character encoding of the source files\n# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is\n# also the default input encoding. Doxygen uses libiconv (or the iconv built\n# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for\n# the list of possible encodings.\n\nINPUT_ENCODING         = UTF-8\n\n# If the value of the INPUT tag contains directories, you can use the\n# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\n# and *.h) to filter out the source-files in the directories. If left\n# blank the following patterns are tested:\n# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh\n# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py\n# *.f90 *.f *.for *.vhd *.vhdl\n\nFILE_PATTERNS          = *.hpp\nFILE_PATTERNS          += *.dox\n\n# The RECURSIVE tag can be used to turn specify whether or not subdirectories\n# should be searched for input files as well. Possible values are YES and NO.\n# If left blank NO is used.\n\nRECURSIVE              = YES\n\n# The EXCLUDE tag can be used to specify files and/or directories that should be\n# excluded from the INPUT source files. This way you can easily exclude a\n# subdirectory from a directory tree whose root is specified with the INPUT tag.\n# Note that relative paths are relative to the directory from which doxygen is\n# run.\n\nEXCLUDE                = @CMAKE_CURRENT_SOURCE_DIR@/../external\n\n# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or\n# directories that are symbolic links (a Unix file system feature) are excluded\n# from the input.\n\nEXCLUDE_SYMLINKS       = NO\n\n# If the value of the INPUT tag contains directories, you can use the\n# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\n# certain files from those directories. Note that the wildcards are matched\n# against the file with absolute path, so to exclude all test directories\n# for example use the pattern */test/*\n\nEXCLUDE_PATTERNS       = .* *.cpp */external/*\n\n# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names\n# (namespaces, classes, functions, etc.) that should be excluded from the\n# output. The symbol name can be a fully qualified name, a word, or if the\n# wildcard * is used, a substring. Examples: ANamespace, AClass,\n# AClass::ANamespace, ANamespace::*Test\n\nEXCLUDE_SYMBOLS        =\n\n# The EXAMPLE_PATH tag can be used to specify one or more files or\n# directories that contain example code fragments that are included (see\n# the \\include command).\n\nEXAMPLE_PATH           =\n\n# If the value of the EXAMPLE_PATH tag contains directories, you can use the\n# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\n# and *.h) to filter out the source-files in the directories. If left\n# blank all files are included.\n\nEXAMPLE_PATTERNS       =\n\n# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be\n# searched for input files to be used with the \\include or \\dontinclude\n# commands irrespective of the value of the RECURSIVE tag.\n# Possible values are YES and NO. If left blank NO is used.\n\nEXAMPLE_RECURSIVE      = NO\n\n# The IMAGE_PATH tag can be used to specify one or more files or\n# directories that contain image that are included in the documentation (see\n# the \\image command).\n\nIMAGE_PATH             =\n\n# The INPUT_FILTER tag can be used to specify a program that doxygen should\n# invoke to filter for each input file. Doxygen will invoke the filter program\n# by executing (via popen()) the command <filter> <input-file>, where <filter>\n# is the value of the INPUT_FILTER tag, and <input-file> is the name of an\n# input file. Doxygen will then use the output that the filter program writes\n# to standard output.\n# If FILTER_PATTERNS is specified, this tag will be\n# ignored.\n\nINPUT_FILTER           =\n\n# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern\n# basis.\n# Doxygen will compare the file name with each pattern and apply the\n# filter if there is a match.\n# The filters are a list of the form:\n# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further\n# info on how filters are used. If FILTER_PATTERNS is empty or if\n# non of the patterns match the file name, INPUT_FILTER is applied.\n\nFILTER_PATTERNS        =\n\n# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using\n# INPUT_FILTER) will be used to filter the input files when producing source\n# files to browse (i.e. when SOURCE_BROWSER is set to YES).\n\nFILTER_SOURCE_FILES    = NO\n\n# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file\n# pattern. A pattern will override the setting for FILTER_PATTERN (if any)\n# and it is also possible to disable source filtering for a specific pattern\n# using *.ext= (so without naming a filter). This option only has effect when\n# FILTER_SOURCE_FILES is enabled.\n\nFILTER_SOURCE_PATTERNS =\n\n# If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that\n# is part of the input, its contents will be placed on the main page (index.html).\n# This can be useful if you have a project on for instance GitHub and want reuse\n# the introduction page also for the doxygen output.\n\nUSE_MDFILE_AS_MAINPAGE =\n\n#---------------------------------------------------------------------------\n# configuration options related to source browsing\n#---------------------------------------------------------------------------\n\n# If the SOURCE_BROWSER tag is set to YES then a list of source files will\n# be generated. Documented entities will be cross-referenced with these sources.\n# Note: To get rid of all source code in the generated output, make sure also\n# VERBATIM_HEADERS is set to NO.\n\nSOURCE_BROWSER         = NO\n\n# Setting the INLINE_SOURCES tag to YES will include the body\n# of functions and classes directly in the documentation.\n\nINLINE_SOURCES         = NO\n\n# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct\n# doxygen to hide any special comment blocks from generated source code\n# fragments. Normal C, C++ and Fortran comments will always remain visible.\n\nSTRIP_CODE_COMMENTS    = YES\n\n# If the REFERENCED_BY_RELATION tag is set to YES\n# then for each documented function all documented\n# functions referencing it will be listed.\n\nREFERENCED_BY_RELATION = NO\n\n# If the REFERENCES_RELATION tag is set to YES\n# then for each documented function all documented entities\n# called/used by that function will be listed.\n\nREFERENCES_RELATION    = NO\n\n# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)\n# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from\n# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will\n# link to the source code.\n# Otherwise they will link to the documentation.\n\nREFERENCES_LINK_SOURCE = YES\n\n# If the USE_HTAGS tag is set to YES then the references to source code\n# will point to the HTML generated by the htags(1) tool instead of doxygen\n# built-in source browser. The htags tool is part of GNU's global source\n# tagging system (see http://www.gnu.org/software/global/global.html). You\n# will need version 4.8.6 or higher.\n\nUSE_HTAGS              = NO\n\n# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen\n# will generate a verbatim copy of the header file for each class for\n# which an include is specified. Set to NO to disable this.\n\nVERBATIM_HEADERS       = YES\n\n#---------------------------------------------------------------------------\n# configuration options related to the alphabetical class index\n#---------------------------------------------------------------------------\n\n# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index\n# of all compounds will be generated. Enable this if the project\n# contains a lot of classes, structs, unions or interfaces.\n\nALPHABETICAL_INDEX     = YES\n\n# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then\n# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns\n# in which this list will be split (can be a number in the range [1..20])\n\nCOLS_IN_ALPHA_INDEX    = 5\n\n# In case all classes in a project start with a common prefix, all\n# classes will be put under the same header in the alphabetical index.\n# The IGNORE_PREFIX tag can be used to specify one or more prefixes that\n# should be ignored while generating the index headers.\n\nIGNORE_PREFIX          =\n\n#---------------------------------------------------------------------------\n# configuration options related to the HTML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_HTML tag is set to YES (the default) Doxygen will\n# generate HTML output.\n\nGENERATE_HTML          = YES\n\n# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `html' will be used as the default path.\n\nHTML_OUTPUT            = html\n\n# The HTML_FILE_EXTENSION tag can be used to specify the file extension for\n# each generated HTML page (for example: .htm,.php,.asp). If it is left blank\n# doxygen will generate files with .html extension.\n\nHTML_FILE_EXTENSION    = .html\n\n# The HTML_HEADER tag can be used to specify a personal HTML header for\n# each generated HTML page. If it is left blank doxygen will generate a\n# standard header. Note that when using a custom header you are responsible\n#  for the proper inclusion of any scripts and style sheets that doxygen\n# needs, which is dependent on the configuration options used.\n# It is advised to generate a default header using \"doxygen -w html\n# header.html footer.html stylesheet.css YourConfigFile\" and then modify\n# that header. Note that the header is subject to change so you typically\n# have to redo this when upgrading to a newer version of doxygen or when\n# changing the value of configuration settings such as GENERATE_TREEVIEW!\n\nHTML_HEADER            =\n\n# The HTML_FOOTER tag can be used to specify a personal HTML footer for\n# each generated HTML page. If it is left blank doxygen will generate a\n# standard footer.\n\nHTML_FOOTER            =\"@CMAKE_CURRENT_SOURCE_DIR@/footer.html\"\n\n# The HTML_STYLESHEET tag can be used to specify a user-defined cascading\n# style sheet that is used by each HTML page. It can be used to\n# fine-tune the look of the HTML output. If left blank doxygen will\n# generate a default style sheet. Note that it is recommended to use\n# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this\n# tag will in the future become obsolete.\n\nHTML_STYLESHEET        =\n\n# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional\n# user-defined cascading style sheet that is included after the standard\n# style sheets created by doxygen. Using this option one can overrule\n# certain style aspects. This is preferred over using HTML_STYLESHEET\n# since it does not replace the standard style sheet and is therefor more\n# robust against future updates. Doxygen will copy the style sheet file to\n# the output directory.\n\nHTML_EXTRA_STYLESHEET  =\n\n# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or\n# other source files which should be copied to the HTML output directory. Note\n# that these files will be copied to the base HTML output directory. Use the\n# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\n# files. In the HTML_STYLESHEET file, use the file name only. Also note that\n# the files will be copied as-is; there are no commands or markers available.\n\nHTML_EXTRA_FILES       =\n\n# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.\n# Doxygen will adjust the colors in the style sheet and background images\n# according to this color. Hue is specified as an angle on a colorwheel,\n# see http://en.wikipedia.org/wiki/Hue for more information.\n# For instance the value 0 represents red, 60 is yellow, 120 is green,\n# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.\n# The allowed range is 0 to 359.\n\nHTML_COLORSTYLE_HUE    = 220\n\n# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of\n# the colors in the HTML output. For a value of 0 the output will use\n# grayscales only. A value of 255 will produce the most vivid colors.\n\nHTML_COLORSTYLE_SAT    = 100\n\n# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to\n# the luminance component of the colors in the HTML output. Values below\n# 100 gradually make the output lighter, whereas values above 100 make\n# the output darker. The value divided by 100 is the actual gamma applied,\n# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,\n# and 100 does not change the gamma.\n\nHTML_COLORSTYLE_GAMMA  = 80\n\n# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML\n# page will contain the date and time when the page was generated. Setting\n# this to NO can help when comparing the output of multiple runs.\n\nHTML_TIMESTAMP         = YES\n\n# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML\n# documentation will contain sections that can be hidden and shown after the\n# page has loaded.\n\nHTML_DYNAMIC_SECTIONS  = NO\n\n# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of\n# entries shown in the various tree structured indices initially; the user\n# can expand and collapse entries dynamically later on. Doxygen will expand\n# the tree to such a level that at most the specified number of entries are\n# visible (unless a fully collapsed tree already exceeds this amount).\n# So setting the number of entries 1 will produce a full collapsed tree by\n# default. 0 is a special value representing an infinite number of entries\n# and will result in a full expanded tree by default.\n\nHTML_INDEX_NUM_ENTRIES = 100\n\n# If the GENERATE_DOCSET tag is set to YES, additional index files\n# will be generated that can be used as input for Apple's Xcode 3\n# integrated development environment, introduced with OSX 10.5 (Leopard).\n# To create a documentation set, doxygen will generate a Makefile in the\n# HTML output directory. Running make will produce the docset in that\n# directory and running \"make install\" will install the docset in\n# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find\n# it at startup.\n# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html\n# for more information.\n\nGENERATE_DOCSET        = NO\n\n# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the\n# feed. A documentation feed provides an umbrella under which multiple\n# documentation sets from a single provider (such as a company or product suite)\n# can be grouped.\n\nDOCSET_FEEDNAME        = \"Doxygen generated docs\"\n\n# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that\n# should uniquely identify the documentation set bundle. This should be a\n# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen\n# will append .docset to the name.\n\nDOCSET_BUNDLE_ID       = org.doxygen.Project\n\n# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely\n# identify the documentation publisher. This should be a reverse domain-name\n# style string, e.g. com.mycompany.MyDocSet.documentation.\n\nDOCSET_PUBLISHER_ID    = org.doxygen.Publisher\n\n# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.\n\nDOCSET_PUBLISHER_NAME  = Publisher\n\n# If the GENERATE_HTMLHELP tag is set to YES, additional index files\n# will be generated that can be used as input for tools like the\n# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)\n# of the generated HTML documentation.\n\nGENERATE_HTMLHELP      = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can\n# be used to specify the file name of the resulting .chm file. You\n# can add a path in front of the file if the result should not be\n# written to the html output directory.\n\nCHM_FILE               =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can\n# be used to specify the location (absolute path including file name) of\n# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run\n# the HTML help compiler on the generated index.hhp.\n\nHHC_LOCATION           =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag\n# controls if a separate .chi index file is generated (YES) or that\n# it should be included in the master .chm file (NO).\n\nGENERATE_CHI           = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING\n# is used to encode HtmlHelp index (hhk), content (hhc) and project file\n# content.\n\nCHM_INDEX_ENCODING     =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag\n# controls whether a binary table of contents is generated (YES) or a\n# normal table of contents (NO) in the .chm file.\n\nBINARY_TOC             = NO\n\n# The TOC_EXPAND flag can be set to YES to add extra items for group members\n# to the contents of the HTML help documentation and to the tree view.\n\nTOC_EXPAND             = NO\n\n# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and\n# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated\n# that can be used as input for Qt's qhelpgenerator to generate a\n# Qt Compressed Help (.qch) of the generated HTML documentation.\n\nGENERATE_QHP           = NO\n\n# If the QHG_LOCATION tag is specified, the QCH_FILE tag can\n# be used to specify the file name of the resulting .qch file.\n# The path specified is relative to the HTML output folder.\n\nQCH_FILE               =\n\n# The QHP_NAMESPACE tag specifies the namespace to use when generating\n# Qt Help Project output. For more information please see\n# http://doc.trolltech.com/qthelpproject.html#namespace\n\nQHP_NAMESPACE          = org.doxygen.Project\n\n# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating\n# Qt Help Project output. For more information please see\n# http://doc.trolltech.com/qthelpproject.html#virtual-folders\n\nQHP_VIRTUAL_FOLDER     = doc\n\n# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to\n# add. For more information please see\n# http://doc.trolltech.com/qthelpproject.html#custom-filters\n\nQHP_CUST_FILTER_NAME   =\n\n# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the\n# custom filter to add. For more information please see\n# <a href=\"http://doc.trolltech.com/qthelpproject.html#custom-filters\">\n# Qt Help Project / Custom Filters</a>.\n\nQHP_CUST_FILTER_ATTRS  =\n\n# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this\n# project's\n# filter section matches.\n# <a href=\"http://doc.trolltech.com/qthelpproject.html#filter-attributes\">\n# Qt Help Project / Filter Attributes</a>.\n\nQHP_SECT_FILTER_ATTRS  =\n\n# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can\n# be used to specify the location of Qt's qhelpgenerator.\n# If non-empty doxygen will try to run qhelpgenerator on the generated\n# .qhp file.\n\nQHG_LOCATION           =\n\n# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files\n#  will be generated, which together with the HTML files, form an Eclipse help\n# plugin. To install this plugin and make it available under the help contents\n# menu in Eclipse, the contents of the directory containing the HTML and XML\n# files needs to be copied into the plugins directory of eclipse. The name of\n# the directory within the plugins directory should be the same as\n# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before\n# the help appears.\n\nGENERATE_ECLIPSEHELP   = NO\n\n# A unique identifier for the eclipse help plugin. When installing the plugin\n# the directory name containing the HTML and XML files should also have\n# this name.\n\nECLIPSE_DOC_ID         = org.doxygen.Project\n\n# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs)\n# at top of each HTML page. The value NO (the default) enables the index and\n# the value YES disables it. Since the tabs have the same information as the\n# navigation tree you can set this option to NO if you already set\n# GENERATE_TREEVIEW to YES.\n\nDISABLE_INDEX          = NO\n\n# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index\n# structure should be generated to display hierarchical information.\n# If the tag value is set to YES, a side panel will be generated\n# containing a tree-like index structure (just like the one that\n# is generated for HTML Help). For this to work a browser that supports\n# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).\n# Windows users are probably better off using the HTML help feature.\n# Since the tree basically has the same information as the tab index you\n# could consider to set DISABLE_INDEX to NO when enabling this option.\n\nGENERATE_TREEVIEW      = NO\n\n# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values\n# (range [0,1..20]) that doxygen will group on one line in the generated HTML\n# documentation. Note that a value of 0 will completely suppress the enum\n# values from appearing in the overview section.\n\nENUM_VALUES_PER_LINE   = 4\n\n# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be\n# used to set the initial width (in pixels) of the frame in which the tree\n# is shown.\n\nTREEVIEW_WIDTH         = 250\n\n# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open\n# links to external symbols imported via tag files in a separate window.\n\nEXT_LINKS_IN_WINDOW    = NO\n\n# Use this tag to change the font size of Latex formulas included\n# as images in the HTML documentation. The default is 10. Note that\n# when you change the font size after a successful doxygen run you need\n# to manually remove any form_*.png images from the HTML output directory\n# to force them to be regenerated.\n\nFORMULA_FONTSIZE       = 10\n\n# Use the FORMULA_TRANPARENT tag to determine whether or not the images\n# generated for formulas are transparent PNGs. Transparent PNGs are\n# not supported properly for IE 6.0, but are supported on all modern browsers.\n# Note that when changing this option you need to delete any form_*.png files\n# in the HTML output before the changes have effect.\n\nFORMULA_TRANSPARENT    = YES\n\n# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax\n# (see http://www.mathjax.org) which uses client side Javascript for the\n# rendering instead of using prerendered bitmaps. Use this if you do not\n# have LaTeX installed or if you want to formulas look prettier in the HTML\n# output. When enabled you may also need to install MathJax separately and\n# configure the path to it using the MATHJAX_RELPATH option.\n\nUSE_MATHJAX            = NO\n\n# When MathJax is enabled you can set the default output format to be used for\n# thA MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and\n# SVG. The default value is HTML-CSS, which is slower, but has the best\n# compatibility.\n\nMATHJAX_FORMAT         = HTML-CSS\n\n# When MathJax is enabled you need to specify the location relative to the\n# HTML output directory using the MATHJAX_RELPATH option. The destination\n# directory should contain the MathJax.js script. For instance, if the mathjax\n# directory is located at the same level as the HTML output directory, then\n# MATHJAX_RELPATH should be ../mathjax. The default value points to\n# the MathJax Content Delivery Network so you can quickly see the result without\n# installing MathJax.\n# However, it is strongly recommended to install a local\n# copy of MathJax from http://www.mathjax.org before deployment.\n\nMATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest\n\n# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension\n# names that should be enabled during MathJax rendering.\n\nMATHJAX_EXTENSIONS     =\n\n# When the SEARCHENGINE tag is enabled doxygen will generate a search box\n# for the HTML output. The underlying search engine uses javascript\n# and DHTML and should work on any modern browser. Note that when using\n# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets\n# (GENERATE_DOCSET) there is already a search function so this one should\n# typically be disabled. For large projects the javascript based search engine\n# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.\n\nSEARCHENGINE           = YES\n\n# When the SERVER_BASED_SEARCH tag is enabled the search engine will be\n# implemented using a web server instead of a web client using Javascript.\n# There are two flavours of web server based search depending on the\n# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for\n# searching and an index file used by the script. When EXTERNAL_SEARCH is\n# enabled the indexing and searching needs to be provided by external tools.\n# See the manual for details.\n\nSERVER_BASED_SEARCH    = NO\n\n# When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP\n# script for searching. Instead the search results are written to an XML file\n# which needs to be processed by an external indexer. Doxygen will invoke an\n# external search engine pointed to by the SEARCHENGINE_URL option to obtain\n# the search results. Doxygen ships with an example indexer (doxyindexer) and\n# search engine (doxysearch.cgi) which are based on the open source search engine\n# library Xapian. See the manual for configuration details.\n\nEXTERNAL_SEARCH        = NO\n\n# The SEARCHENGINE_URL should point to a search engine hosted by a web server\n# which will returned the search results when EXTERNAL_SEARCH is enabled.\n# Doxygen ships with an example search engine (doxysearch) which is based on\n# the open source search engine library Xapian. See the manual for configuration\n# details.\n\nSEARCHENGINE_URL       =\n\n# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed\n# search data is written to a file for indexing by an external tool. With the\n# SEARCHDATA_FILE tag the name of this file can be specified.\n\nSEARCHDATA_FILE        = searchdata.xml\n\n# When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the\n# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is\n# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple\n# projects and redirect the results back to the right project.\n\nEXTERNAL_SEARCH_ID     =\n\n# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen\n# projects other than the one defined by this configuration file, but that are\n# all added to the same external search index. Each project needs to have a\n# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id\n# of to a relative location where the documentation can be found.\n# The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ...\n\nEXTRA_SEARCH_MAPPINGS  =\n\n#---------------------------------------------------------------------------\n# configuration options related to the LaTeX output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will\n# generate Latex output.\n\nGENERATE_LATEX         = NO\n\n# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `latex' will be used as the default path.\n\nLATEX_OUTPUT           = latex\n\n# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be\n# invoked. If left blank `latex' will be used as the default command name.\n# Note that when enabling USE_PDFLATEX this option is only used for\n# generating bitmaps for formulas in the HTML output, but not in the\n# Makefile that is written to the output directory.\n\nLATEX_CMD_NAME         = latex\n\n# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to\n# generate index for LaTeX. If left blank `makeindex' will be used as the\n# default command name.\n\nMAKEINDEX_CMD_NAME     = makeindex\n\n# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact\n# LaTeX documents. This may be useful for small projects and may help to\n# save some trees in general.\n\nCOMPACT_LATEX          = NO\n\n# The PAPER_TYPE tag can be used to set the paper type that is used\n# by the printer. Possible values are: a4, letter, legal and\n# executive. If left blank a4wide will be used.\n\nPAPER_TYPE             = a4\n\n# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX\n# packages that should be included in the LaTeX output.\n\nEXTRA_PACKAGES         =\n\n# The LATEX_HEADER tag can be used to specify a personal LaTeX header for\n# the generated latex document. The header should contain everything until\n# the first chapter. If it is left blank doxygen will generate a\n# standard header. Notice: only use this tag if you know what you are doing!\n\nLATEX_HEADER           =\n\n# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for\n# the generated latex document. The footer should contain everything after\n# the last chapter. If it is left blank doxygen will generate a\n# standard footer. Notice: only use this tag if you know what you are doing!\n\nLATEX_FOOTER           =\n\n# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated\n# is prepared for conversion to pdf (using ps2pdf). The pdf file will\n# contain links (just like the HTML output) instead of page references\n# This makes the output suitable for online browsing using a pdf viewer.\n\nPDF_HYPERLINKS         = YES\n\n# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of\n# plain latex in the generated Makefile. Set this option to YES to get a\n# higher quality PDF documentation.\n\nUSE_PDFLATEX           = YES\n\n# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\\\batchmode.\n# command to the generated LaTeX files. This will instruct LaTeX to keep\n# running if errors occur, instead of asking the user for help.\n# This option is also used when generating formulas in HTML.\n\nLATEX_BATCHMODE        = NO\n\n# If LATEX_HIDE_INDICES is set to YES then doxygen will not\n# include the index chapters (such as File Index, Compound Index, etc.)\n# in the output.\n\nLATEX_HIDE_INDICES     = NO\n\n# If LATEX_SOURCE_CODE is set to YES then doxygen will include\n# source code with syntax highlighting in the LaTeX output.\n# Note that which sources are shown also depends on other settings\n# such as SOURCE_BROWSER.\n\nLATEX_SOURCE_CODE      = NO\n\n# The LATEX_BIB_STYLE tag can be used to specify the style to use for the\n# bibliography, e.g. plainnat, or ieeetr. The default style is \"plain\". See\n# http://en.wikipedia.org/wiki/BibTeX for more info.\n\nLATEX_BIB_STYLE        = plain\n\n#---------------------------------------------------------------------------\n# configuration options related to the RTF output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output\n# The RTF output is optimized for Word 97 and may not look very pretty with\n# other RTF readers or editors.\n\nGENERATE_RTF           = NO\n\n# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `rtf' will be used as the default path.\n\nRTF_OUTPUT             = rtf\n\n# If the COMPACT_RTF tag is set to YES Doxygen generates more compact\n# RTF documents. This may be useful for small projects and may help to\n# save some trees in general.\n\nCOMPACT_RTF            = NO\n\n# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated\n# will contain hyperlink fields. The RTF file will\n# contain links (just like the HTML output) instead of page references.\n# This makes the output suitable for online browsing using WORD or other\n# programs which support those fields.\n# Note: wordpad (write) and others do not support links.\n\nRTF_HYPERLINKS         = NO\n\n# Load style sheet definitions from file. Syntax is similar to doxygen's\n# config file, i.e. a series of assignments. You only have to provide\n# replacements, missing definitions are set to their default value.\n\nRTF_STYLESHEET_FILE    =\n\n# Set optional variables used in the generation of an rtf document.\n# Syntax is similar to doxygen's config file.\n\nRTF_EXTENSIONS_FILE    =\n\n#---------------------------------------------------------------------------\n# configuration options related to the man page output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_MAN tag is set to YES (the default) Doxygen will\n# generate man pages\n\nGENERATE_MAN           = NO\n\n# The MAN_OUTPUT tag is used to specify where the man pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `man' will be used as the default path.\n\nMAN_OUTPUT             = man\n\n# The MAN_EXTENSION tag determines the extension that is added to\n# the generated man pages (default is the subroutine's section .3)\n\nMAN_EXTENSION          = .3\n\n# If the MAN_LINKS tag is set to YES and Doxygen generates man output,\n# then it will generate one additional man file for each entity\n# documented in the real man page(s). These additional files\n# only source the real man page, but without them the man command\n# would be unable to find the correct page. The default is NO.\n\nMAN_LINKS              = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the XML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_XML tag is set to YES Doxygen will\n# generate an XML file that captures the structure of\n# the code including all documentation.\n\nGENERATE_XML           = NO\n\n# The XML_OUTPUT tag is used to specify where the XML pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `xml' will be used as the default path.\n\nXML_OUTPUT             = xml\n\n# The XML_SCHEMA tag can be used to specify an XML schema,\n# which can be used by a validating XML parser to check the\n# syntax of the XML files.\n\n# XML_SCHEMA             =\n\n# The XML_DTD tag can be used to specify an XML DTD,\n# which can be used by a validating XML parser to check the\n# syntax of the XML files.\n\n# XML_DTD                =\n\n# If the XML_PROGRAMLISTING tag is set to YES Doxygen will\n# dump the program listings (including syntax highlighting\n# and cross-referencing information) to the XML output. Note that\n# enabling this will significantly increase the size of the XML output.\n\nXML_PROGRAMLISTING     = YES\n\n#---------------------------------------------------------------------------\n# configuration options for the AutoGen Definitions output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will\n# generate an AutoGen Definitions (see autogen.sf.net) file\n# that captures the structure of the code including all\n# documentation. Note that this feature is still experimental\n# and incomplete at the moment.\n\nGENERATE_AUTOGEN_DEF   = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the Perl module output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_PERLMOD tag is set to YES Doxygen will\n# generate a Perl module file that captures the structure of\n# the code including all documentation. Note that this\n# feature is still experimental and incomplete at the\n# moment.\n\nGENERATE_PERLMOD       = NO\n\n# If the PERLMOD_LATEX tag is set to YES Doxygen will generate\n# the necessary Makefile rules, Perl scripts and LaTeX code to be able\n# to generate PDF and DVI output from the Perl module output.\n\nPERLMOD_LATEX          = NO\n\n# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be\n# nicely formatted so it can be parsed by a human reader.\n# This is useful\n# if you want to understand what is going on.\n# On the other hand, if this\n# tag is set to NO the size of the Perl module output will be much smaller\n# and Perl will parse it just the same.\n\nPERLMOD_PRETTY         = YES\n\n# The names of the make variables in the generated doxyrules.make file\n# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.\n# This is useful so different doxyrules.make files included by the same\n# Makefile don't overwrite each other's variables.\n\nPERLMOD_MAKEVAR_PREFIX =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the preprocessor\n#---------------------------------------------------------------------------\n\n# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will\n# evaluate all C-preprocessor directives found in the sources and include\n# files.\n\nENABLE_PREPROCESSING   = YES\n\n# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro\n# names in the source code. If set to NO (the default) only conditional\n# compilation will be performed. Macro expansion can be done in a controlled\n# way by setting EXPAND_ONLY_PREDEF to YES.\n\nMACRO_EXPANSION        = NO\n\n# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES\n# then the macro expansion is limited to the macros specified with the\n# PREDEFINED and EXPAND_AS_DEFINED tags.\n\nEXPAND_ONLY_PREDEF     = NO\n\n# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files\n# pointed to by INCLUDE_PATH will be searched when a #include is found.\n\nSEARCH_INCLUDES        = YES\n\n# The INCLUDE_PATH tag can be used to specify one or more directories that\n# contain include files that are not input files but should be processed by\n# the preprocessor.\n\nINCLUDE_PATH           =\n\n# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard\n# patterns (like *.h and *.hpp) to filter out the header-files in the\n# directories. If left blank, the patterns specified with FILE_PATTERNS will\n# be used.\n\nINCLUDE_FILE_PATTERNS  =\n\n# The PREDEFINED tag can be used to specify one or more macro names that\n# are defined before the preprocessor is started (similar to the -D option of\n# gcc). The argument of the tag is a list of macros of the form: name\n# or name=definition (no spaces). If the definition and the = are\n# omitted =1 is assumed. To prevent a macro definition from being\n# undefined via #undef or recursively expanded use the := operator\n# instead of the = operator.\n\nPREDEFINED             =\n\n# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then\n# this tag can be used to specify a list of macro names that should be expanded.\n# The macro definition that is found in the sources will be used.\n# Use the PREDEFINED tag if you want to use a different macro definition that\n# overrules the definition found in the source code.\n\nEXPAND_AS_DEFINED      =\n\n# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then\n# doxygen's preprocessor will remove all references to function-like macros\n# that are alone on a line, have an all uppercase name, and do not end with a\n# semicolon, because these will confuse the parser if not removed.\n\nSKIP_FUNCTION_MACROS   = YES\n\n#---------------------------------------------------------------------------\n# Configuration::additions related to external references\n#---------------------------------------------------------------------------\n\n# The TAGFILES option can be used to specify one or more tagfiles. For each\n# tag file the location of the external documentation should be added. The\n# format of a tag file without this location is as follows:\n#\n# TAGFILES = file1 file2 ...\n# Adding location for the tag files is done as follows:\n#\n# TAGFILES = file1=loc1 \"file2 = loc2\" ...\n# where \"loc1\" and \"loc2\" can be relative or absolute paths\n# or URLs. Note that each tag file must have a unique name (where the name does\n# NOT include the path). If a tag file is not located in the directory in which\n# doxygen is run, you must also specify the path to the tagfile here.\n\nTAGFILES               =\n\n# When a file name is specified after GENERATE_TAGFILE, doxygen will create\n# a tag file that is based on the input files it reads.\n\nGENERATE_TAGFILE       = cereal.doxytags\n\n# If the ALLEXTERNALS tag is set to YES all external classes will be listed\n# in the class index. If set to NO only the inherited external classes\n# will be listed.\n\nALLEXTERNALS           = NO\n\n# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed\n# in the modules index. If set to NO, only the current project's groups will\n# be listed.\n\nEXTERNAL_GROUPS        = YES\n\n# The PERL_PATH should be the absolute path and name of the perl script\n# interpreter (i.e. the result of `which perl').\n\nPERL_PATH              = /usr/bin/perl\n\n#---------------------------------------------------------------------------\n# Configuration options related to the dot tool\n#---------------------------------------------------------------------------\n\n# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will\n# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base\n# or super classes. Setting the tag to NO turns the diagrams off. Note that\n# this option also works with HAVE_DOT disabled, but it is recommended to\n# install and use dot, since it yields more powerful graphs.\n\nCLASS_DIAGRAMS         = YES\n\n# You can define message sequence charts within doxygen comments using the \\msc\n# command. Doxygen will then run the mscgen tool (see\n# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the\n# documentation. The MSCGEN_PATH tag allows you to specify the directory where\n# the mscgen tool resides. If left empty the tool is assumed to be found in the\n# default search path.\n\nMSCGEN_PATH            =\n\n# If set to YES, the inheritance and collaboration graphs will hide\n# inheritance and usage relations if the target is undocumented\n# or is not a class.\n\nHIDE_UNDOC_RELATIONS   = YES\n\n# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is\n# available from the path. This tool is part of Graphviz, a graph visualization\n# toolkit from AT&T and Lucent Bell Labs. The other options in this section\n# have no effect if this option is set to NO (the default)\n\nHAVE_DOT               = NO\n\n# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is\n# allowed to run in parallel. When set to 0 (the default) doxygen will\n# base this on the number of processors available in the system. You can set it\n# explicitly to a value larger than 0 to get control over the balance\n# between CPU load and processing speed.\n\nDOT_NUM_THREADS        = 0\n\n# By default doxygen will use the Helvetica font for all dot files that\n# doxygen generates. When you want a differently looking font you can specify\n# the font name using DOT_FONTNAME. You need to make sure dot is able to find\n# the font, which can be done by putting it in a standard location or by setting\n# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the\n# directory containing the font.\n\nDOT_FONTNAME           = Helvetica\n\n# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.\n# The default size is 10pt.\n\nDOT_FONTSIZE           = 10\n\n# By default doxygen will tell dot to use the Helvetica font.\n# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to\n# set the path where dot can find it.\n\nDOT_FONTPATH           =\n\n# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for each documented class showing the direct and\n# indirect inheritance relations. Setting this tag to YES will force the\n# CLASS_DIAGRAMS tag to NO.\n\nCLASS_GRAPH            = YES\n\n# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for each documented class showing the direct and\n# indirect implementation dependencies (inheritance, containment, and\n# class references variables) of the class with other documented classes.\n\nCOLLABORATION_GRAPH    = YES\n\n# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for groups, showing the direct groups dependencies\n\nGROUP_GRAPHS           = YES\n\n# If the UML_LOOK tag is set to YES doxygen will generate inheritance and\n# collaboration diagrams in a style similar to the OMG's Unified Modeling\n# Language.\n\nUML_LOOK               = NO\n\n# If the UML_LOOK tag is enabled, the fields and methods are shown inside\n# the class node. If there are many fields or methods and many nodes the\n# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS\n# threshold limits the number of items for each type to make the size more\n# managable. Set this to 0 for no limit. Note that the threshold may be\n# exceeded by 50% before the limit is enforced.\n\nUML_LIMIT_NUM_FIELDS   = 10\n\n# If set to YES, the inheritance and collaboration graphs will show the\n# relations between templates and their instances.\n\nTEMPLATE_RELATIONS     = NO\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT\n# tags are set to YES then doxygen will generate a graph for each documented\n# file showing the direct and indirect include dependencies of the file with\n# other documented files.\n\nINCLUDE_GRAPH          = YES\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and\n# HAVE_DOT tags are set to YES then doxygen will generate a graph for each\n# documented header file showing the documented files that directly or\n# indirectly include this file.\n\nINCLUDED_BY_GRAPH      = YES\n\n# If the CALL_GRAPH and HAVE_DOT options are set to YES then\n# doxygen will generate a call dependency graph for every global function\n# or class method. Note that enabling this option will significantly increase\n# the time of a run. So in most cases it will be better to enable call graphs\n# for selected functions only using the \\callgraph command.\n\nCALL_GRAPH             = NO\n\n# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then\n# doxygen will generate a caller dependency graph for every global function\n# or class method. Note that enabling this option will significantly increase\n# the time of a run. So in most cases it will be better to enable caller\n# graphs for selected functions only using the \\callergraph command.\n\nCALLER_GRAPH           = NO\n\n# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen\n# will generate a graphical hierarchy of all classes instead of a textual one.\n\nGRAPHICAL_HIERARCHY    = YES\n\n# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES\n# then doxygen will show the dependencies a directory has on other directories\n# in a graphical way. The dependency relations are determined by the #include\n# relations between the files in the directories.\n\nDIRECTORY_GRAPH        = YES\n\n# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images\n# generated by dot. Possible values are svg, png, jpg, or gif.\n# If left blank png will be used. If you choose svg you need to set\n# HTML_FILE_EXTENSION to xhtml in order to make the SVG files\n# visible in IE 9+ (other browsers do not have this requirement).\n\nDOT_IMAGE_FORMAT       = png\n\n# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to\n# enable generation of interactive SVG images that allow zooming and panning.\n# Note that this requires a modern browser other than Internet Explorer.\n# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you\n# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files\n# visible. Older versions of IE do not have SVG support.\n\nINTERACTIVE_SVG        = NO\n\n# The tag DOT_PATH can be used to specify the path where the dot tool can be\n# found. If left blank, it is assumed the dot tool can be found in the path.\n\nDOT_PATH               =\n\n# The DOTFILE_DIRS tag can be used to specify one or more directories that\n# contain dot files that are included in the documentation (see the\n# \\dotfile command).\n\nDOTFILE_DIRS           =\n\n# The MSCFILE_DIRS tag can be used to specify one or more directories that\n# contain msc files that are included in the documentation (see the\n# \\mscfile command).\n\nMSCFILE_DIRS           =\n\n# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of\n# nodes that will be shown in the graph. If the number of nodes in a graph\n# becomes larger than this value, doxygen will truncate the graph, which is\n# visualized by representing a node as a red box. Note that doxygen if the\n# number of direct children of the root node in a graph is already larger than\n# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note\n# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.\n\nDOT_GRAPH_MAX_NODES    = 50\n\n# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the\n# graphs generated by dot. A depth value of 3 means that only nodes reachable\n# from the root by following a path via at most 3 edges will be shown. Nodes\n# that lay further from the root node will be omitted. Note that setting this\n# option to 1 or 2 may greatly reduce the computation time needed for large\n# code bases. Also note that the size of a graph can be further restricted by\n# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.\n\nMAX_DOT_GRAPH_DEPTH    = 0\n\n# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent\n# background. This is disabled by default, because dot on Windows does not\n# seem to support this out of the box. Warning: Depending on the platform used,\n# enabling this option may lead to badly anti-aliased labels on the edges of\n# a graph (i.e. they become hard to read).\n\nDOT_TRANSPARENT        = NO\n\n# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output\n# files in one run (i.e. multiple -o and -T options on the command line). This\n# makes dot run faster, but since only newer versions of dot (>1.8.10)\n# support this, this feature is disabled by default.\n\nDOT_MULTI_TARGETS      = YES\n\n# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will\n# generate a legend page explaining the meaning of the various boxes and\n# arrows in the dot generated graphs.\n\nGENERATE_LEGEND        = YES\n\n# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will\n# remove the intermediate dot files that are used to generate\n# the various graphs.\n\nDOT_CLEANUP            = YES\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/doc/footer.html",
    "content": "<!-- HTML footer for doxygen 1.8.3.1-->\n<!-- start footer part -->\n<!--BEGIN GENERATE_TREEVIEW-->\n<div id=\"nav-path\" class=\"navpath\"><!-- id is needed for treeview function! -->\n  <ul>\n    $navpath\n    <li class=\"footer\">$generatedby\n    <a href=\"http://www.doxygen.org/index.html\">\n    <img class=\"footer\" src=\"$relpath^doxygen.png\" alt=\"doxygen\"/></a> $doxygenversion </li>\n  </ul>\n</div>\n<!--END GENERATE_TREEVIEW-->\n<!--BEGIN !GENERATE_TREEVIEW-->\n<hr class=\"footer\"/><address class=\"footer\"><small>\n$generatedby &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"$relpath^doxygen.png\" alt=\"doxygen\"/>\n</a> $doxygenversion\n</small></address>\n<!--END !GENERATE_TREEVIEW-->\n<script>\n  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n\n  ga('create', 'UA-42360142-1', 'uscilab.github.io');\n  ga('send', 'pageview');\n\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/doc/mainpage.dox",
    "content": "/**\n\\mainpage cereal code documentation\n\n\\tableofcontents\n\nAside from the <a href=\"../../index.html\">documentation</a> presented on the main cereal site, this doxygen\npage offers code level documentation.\n\n\\section modules Browse modules\n\ncereal's code is organized into modules of similar functionality.  Take a look at the <a href=\"modules.html\">modules</a>\nsection to learn more.  Average users will not need to understand the workings of any code that falls under the\n<i>internal</i> module.\n\n\\section files Browse files\n\nIf you need reference on a specific file, the <a href=\"files.html\">files</a> page lists all files in cereal.\n*/\n\n  //! \\defgroup Archives Input and Output Archive Types\n\n  /*! \\defgroup Access Access Control and Disambiguation\n      Provides ways to give cereal access to protected member functions, disambiguate\n      which serialization function cereal should use, and provide ways of using smart\n      pointers with types that have no default constructor. */\n\n  /*! \\defgroup Utility Utility Functionality\n      Name-value pairs, binary data wrappers, exceptions, and other utility functions */\n\n  /*! \\defgroup TypeSupport Support for Serializing Various Types\n      Serialization of many types is shipped with cereal, including most of the standard library as well as a few others.  */\n\n  /*! \\defgroup STLSupport Standard Library Support\n      Serialization methods for nearly all types found in the C++ standard library.\n      \\ingroup TypeSupport */\n  \n  /*! \\defgroup TypeConcepts Abstract Type Concept Support\n      Serialization methods for more abstract type concepts that can generalize over many types.\n      \\ingroup TypeSupport */\n\n  /*! \\defgroup OtherTypes Miscellaneous Types Support\n      Support for various other types such as smart pointers to polymorphic base classes, boost::variant, etc.\n      \\ingroup TypeSupport */\n\n  /*! \\defgroup Internal Internal Functionality\n      Various classes and functions that are critical for the operation of cereal but of no\n      interest to users */\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/access.hpp",
    "content": "/*! \\file access.hpp\n    \\brief Access control and default construction */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_ACCESS_HPP_\n#define CEREAL_ACCESS_HPP_\n\n#include <type_traits>\n#include <iostream>\n#include <cstdint>\n#include <functional>\n\n#include \"cereal/macros.hpp\"\n#include \"cereal/specialize.hpp\"\n#include \"cereal/details/helpers.hpp\"\n\nnamespace cereal\n{\n  // ######################################################################\n  //! A class that allows cereal to load smart pointers to types that have no default constructor\n  /*! If your class does not have a default constructor, cereal will not be able\n      to load any smart pointers to it unless you overload LoadAndConstruct\n      for your class, and provide an appropriate load_and_construct method.  You can also\n      choose to define a member static function instead of specializing this class.\n\n      The specialization of LoadAndConstruct must be placed within the cereal namespace:\n\n      @code{.cpp}\n      struct MyType\n      {\n        MyType( int x ); // note: no default ctor\n        int myX;\n\n        // Define a serialize or load/save pair as you normally would\n        template <class Archive>\n        void serialize( Archive & ar )\n        {\n          ar( myX );\n        }\n      };\n\n      // Provide a specialization for LoadAndConstruct for your type\n      namespace cereal\n      {\n        template <> struct LoadAndConstruct<MyType>\n        {\n          // load_and_construct will be passed the archive that you will be loading\n          // from as well as a construct object which you can use as if it were the\n          // constructor for your type.  cereal will handle all memory management for you.\n          template <class Archive>\n          static void load_and_construct( Archive & ar, cereal::construct<MyType> & construct )\n          {\n            int x;\n            ar( x );\n            construct( x );\n          }\n\n          // if you require versioning, simply add a const std::uint32_t as the final parameter, e.g.:\n          // load_and_construct( Archive & ar, cereal::construct<MyType> & construct, std::uint32_t const version )\n        };\n      } // end namespace cereal\n      @endcode\n\n      Please note that just as in using external serialization functions, you cannot get\n      access to non-public members of your class by befriending cereal::access.  If you\n      have the ability to modify the class you wish to serialize, it is recommended that you\n      use member serialize functions and a static member load_and_construct function.\n\n      load_and_construct functions, regardless of whether they are static members of your class or\n      whether you create one in the LoadAndConstruct specialization, have the following signature:\n\n      @code{.cpp}\n      // generally Archive will be templated, but it can be specific if desired\n      template <class Archive>\n      static void load_and_construct( Archive & ar, cereal::construct<MyType> & construct );\n      // with an optional last parameter specifying the version: const std::uint32_t version\n      @endcode\n\n      Versioning behaves the same way as it does for standard serialization functions.\n\n      @tparam T The type to specialize for\n      @ingroup Access */\n  template <class T>\n  struct LoadAndConstruct\n  { };\n\n  // forward decl for construct\n  //! @cond PRIVATE_NEVERDEFINED\n  namespace memory_detail{ template <class Ar, class T> struct LoadAndConstructLoadWrapper; }\n  namespace boost_variant_detail{ template <class Ar, class T> struct LoadAndConstructLoadWrapper; }\n  //! @endcond\n\n  //! Used to construct types with no default constructor\n  /*! When serializing a type that has no default constructor, cereal\n      will attempt to call either the class static function load_and_construct\n      or the appropriate template specialization of LoadAndConstruct.  cereal\n      will pass that function a reference to the archive as well as a reference\n      to a construct object which should be used to perform the allocation once\n      data has been appropriately loaded.\n\n      @code{.cpp}\n      struct MyType\n      {\n        // note the lack of default constructor\n        MyType( int xx, int yy );\n\n        int x, y;\n        double notInConstructor;\n\n        template <class Archive>\n        void serialize( Archive & ar )\n        {\n          ar( x, y );\n          ar( notInConstructor );\n        }\n\n        template <class Archive>\n        static void load_and_construct( Archive & ar, cereal::construct<MyType> & construct )\n        {\n          int x, y;\n          ar( x, y );\n\n          // use construct object to initialize with loaded data\n          construct( x, y );\n\n          // access to member variables and functions via -> operator\n          ar( construct->notInConstructor );\n\n          // could also do the above section by:\n          double z;\n          ar( z );\n          construct->notInConstructor = z;\n        }\n      };\n      @endcode\n\n      @tparam T The class type being serialized\n      */\n  template <class T>\n  class construct\n  {\n    public:\n      //! Construct and initialize the type T with the given arguments\n      /*! This will forward all arguments to the underlying type T,\n          calling an appropriate constructor.\n\n          Calling this function more than once will result in an exception\n          being thrown.\n\n          @param args The arguments to the constructor for T\n          @throw Exception If called more than once */\n      template <class ... Args>\n      void operator()( Args && ... args );\n      // implementation deferred due to reliance on cereal::access\n\n      //! Get a reference to the initialized underlying object\n      /*! This must be called after the object has been initialized.\n\n          @return A reference to the initialized object\n          @throw Exception If called before initialization */\n      T * operator->()\n      {\n        if( !itsValid )\n          throw Exception(\"Object must be initialized prior to accessing members\");\n\n        return itsPtr;\n      }\n\n      //! Returns a raw pointer to the initialized underlying object\n      /*! This is mainly intended for use with passing an instance of\n          a constructed object to cereal::base_class.\n\n          It is strongly recommended to avoid using this function in\n          any other circumstance.\n\n          @return A raw pointer to the initialized type */\n      T * ptr()\n      {\n        return operator->();\n      }\n\n    private:\n      template <class Ar, class TT> friend struct ::cereal::memory_detail::LoadAndConstructLoadWrapper;\n      template <class Ar, class TT> friend struct ::cereal::boost_variant_detail::LoadAndConstructLoadWrapper;\n\n      construct( T * p ) : itsPtr( p ), itsEnableSharedRestoreFunction( [](){} ), itsValid( false ) {}\n      construct( T * p, std::function<void()> enableSharedFunc ) : // g++4.7 ice with default lambda to std func\n        itsPtr( p ), itsEnableSharedRestoreFunction( enableSharedFunc ), itsValid( false ) {}\n      construct( construct const & ) = delete;\n      construct & operator=( construct const & ) = delete;\n\n      T * itsPtr;\n      std::function<void()> itsEnableSharedRestoreFunction;\n      bool itsValid;\n  };\n\n  // ######################################################################\n  //! A class that can be made a friend to give cereal access to non public functions\n  /*! If you desire non-public serialization functions within a class, cereal can only\n      access these if you declare cereal::access a friend.\n\n      @code{.cpp}\n      class MyClass\n      {\n        private:\n          friend class cereal::access; // gives access to the private serialize\n\n          template <class Archive>\n          void serialize( Archive & ar )\n          {\n            // some code\n          }\n      };\n      @endcode\n      @ingroup Access */\n  class access\n  {\n    public:\n      // ####### Standard Serialization ########################################\n      template<class Archive, class T> inline\n      static auto member_serialize(Archive & ar, T & t) -> decltype(t.CEREAL_SERIALIZE_FUNCTION_NAME(ar))\n      { return t.CEREAL_SERIALIZE_FUNCTION_NAME(ar); }\n\n      template<class Archive, class T> inline\n      static auto member_save(Archive & ar, T const & t) -> decltype(t.CEREAL_SAVE_FUNCTION_NAME(ar))\n      { return t.CEREAL_SAVE_FUNCTION_NAME(ar); }\n\n      template<class Archive, class T> inline\n      static auto member_save_non_const(Archive & ar, T & t) -> decltype(t.CEREAL_SAVE_FUNCTION_NAME(ar))\n      { return t.CEREAL_SAVE_FUNCTION_NAME(ar); }\n\n      template<class Archive, class T> inline\n      static auto member_load(Archive & ar, T & t) -> decltype(t.CEREAL_LOAD_FUNCTION_NAME(ar))\n      { return t.CEREAL_LOAD_FUNCTION_NAME(ar); }\n\n      template<class Archive, class T> inline\n      static auto member_save_minimal(Archive const & ar, T const & t) -> decltype(t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar))\n      { return t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar); }\n\n      template<class Archive, class T> inline\n      static auto member_save_minimal_non_const(Archive const & ar, T & t) -> decltype(t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar))\n      { return t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar); }\n\n      template<class Archive, class T, class U> inline\n      static auto member_load_minimal(Archive const & ar, T & t, U && u) -> decltype(t.CEREAL_LOAD_MINIMAL_FUNCTION_NAME(ar, std::forward<U>(u)))\n      { return t.CEREAL_LOAD_MINIMAL_FUNCTION_NAME(ar, std::forward<U>(u)); }\n\n      // ####### Versioned Serialization #######################################\n      template<class Archive, class T> inline\n      static auto member_serialize(Archive & ar, T & t, const std::uint32_t version ) -> decltype(t.CEREAL_SERIALIZE_FUNCTION_NAME(ar, version))\n      { return t.CEREAL_SERIALIZE_FUNCTION_NAME(ar, version); }\n\n      template<class Archive, class T> inline\n      static auto member_save(Archive & ar, T const & t, const std::uint32_t version ) -> decltype(t.CEREAL_SAVE_FUNCTION_NAME(ar, version))\n      { return t.CEREAL_SAVE_FUNCTION_NAME(ar, version); }\n\n      template<class Archive, class T> inline\n      static auto member_save_non_const(Archive & ar, T & t, const std::uint32_t version ) -> decltype(t.CEREAL_SAVE_FUNCTION_NAME(ar, version))\n      { return t.CEREAL_SAVE_FUNCTION_NAME(ar, version); }\n\n      template<class Archive, class T> inline\n      static auto member_load(Archive & ar, T & t, const std::uint32_t version ) -> decltype(t.CEREAL_LOAD_FUNCTION_NAME(ar, version))\n      { return t.CEREAL_LOAD_FUNCTION_NAME(ar, version); }\n\n      template<class Archive, class T> inline\n      static auto member_save_minimal(Archive const & ar, T const & t, const std::uint32_t version) -> decltype(t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar, version))\n      { return t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar, version); }\n\n      template<class Archive, class T> inline\n      static auto member_save_minimal_non_const(Archive const & ar, T & t, const std::uint32_t version) -> decltype(t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar, version))\n      { return t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar, version); }\n\n      template<class Archive, class T, class U> inline\n      static auto member_load_minimal(Archive const & ar, T & t, U && u, const std::uint32_t version) -> decltype(t.CEREAL_LOAD_MINIMAL_FUNCTION_NAME(ar, std::forward<U>(u), version))\n      { return t.CEREAL_LOAD_MINIMAL_FUNCTION_NAME(ar, std::forward<U>(u), version); }\n\n      // ####### Other Functionality ##########################################\n      // for detecting inheritance from enable_shared_from_this\n      template <class T> inline\n      static auto shared_from_this(T & t) -> decltype(t.shared_from_this());\n\n      // for placement new\n      template <class T, class ... Args> inline\n      static void construct( T *& ptr, Args && ... args )\n      {\n        new (ptr) T( std::forward<Args>( args )... );\n      }\n\n      // for non-placement new with a default constructor\n      template <class T> inline\n      static T * construct()\n      {\n        return new T();\n      }\n\n      template <class T> inline\n      static std::false_type load_and_construct(...)\n      { return std::false_type(); }\n\n      template<class T, class Archive> inline\n      static auto load_and_construct(Archive & ar, ::cereal::construct<T> & construct) -> decltype(T::load_and_construct(ar, construct))\n      {\n        T::load_and_construct( ar, construct );\n      }\n\n      template<class T, class Archive> inline\n      static auto load_and_construct(Archive & ar, ::cereal::construct<T> & construct, const std::uint32_t version) -> decltype(T::load_and_construct(ar, construct, version))\n      {\n        T::load_and_construct( ar, construct, version );\n      }\n  }; // end class access\n\n  // ######################################################################\n  // Deferred Implementation, see construct for more information\n  template <class T> template <class ... Args> inline\n  void construct<T>::operator()( Args && ... args )\n  {\n    if( itsValid )\n      throw Exception(\"Attempting to construct an already initialized object\");\n\n    ::cereal::access::construct( itsPtr, std::forward<Args>( args )... );\n    itsEnableSharedRestoreFunction();\n    itsValid = true;\n  }\n} // namespace cereal\n\n#endif // CEREAL_ACCESS_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/archives/adapters.hpp",
    "content": "/*! \\file adapters.hpp\n    \\brief Archive adapters that provide additional functionality\n           on top of an existing archive */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_ARCHIVES_ADAPTERS_HPP_\n#define CEREAL_ARCHIVES_ADAPTERS_HPP_\n\n#include \"cereal/details/helpers.hpp\"\n#include <utility>\n\nnamespace cereal\n{\n  #ifdef CEREAL_FUTURE_EXPERIMENTAL\n\n  // Forward declaration for friend access\n  template <class U, class A> U & get_user_data( A & );\n\n  //! Wraps an archive and gives access to user data\n  /*! This adapter is useful if you require access to\n      either raw pointers or references within your\n      serialization functions.\n\n      While cereal does not directly support serialization\n      raw pointers or references, it is sometimes the case\n      that you may want to supply something such as a raw\n      pointer or global reference to some constructor.\n      In this situation this adapter would likely be used\n      with the construct class to allow for non-default\n      constructors.\n\n      @note This feature is experimental and may be altered or removed in a future release. See issue #46.\n\n      @code{.cpp}\n      struct MyUserData\n      {\n        int * myRawPointer;\n        std::reference_wrapper<MyOtherType> myReference;\n      };\n\n      struct MyClass\n      {\n        // Note the raw pointer parameter\n        MyClass( int xx, int * rawP );\n\n        int x;\n\n        template <class Archive>\n        void serialize( Archive & ar )\n        { ar( x ); }\n\n        template <class Archive>\n        static void load_and_construct( Archive & ar, cereal::construct<MyClass> & construct )\n        {\n          int xx;\n          ar( xx );\n          // note the need to use get_user_data to retrieve user data from the archive\n          construct( xx, cereal::get_user_data<MyUserData>( ar ).myRawPointer );\n        }\n      };\n\n      int main()\n      {\n        {\n          MyUserData md;\n          md.myRawPointer = &something;\n          md.myReference = someInstanceOfType;\n\n          std::ifstream is( \"data.xml\" );\n          cereal::UserDataAdapter<MyUserData, cereal::XMLInputArchive> ar( md, is );\n\n          std::unique_ptr<MyClass> sc;\n          ar( sc ); // use as normal\n        }\n\n        return 0;\n      }\n      @endcode\n\n      @relates get_user_data\n\n      @tparam UserData The type to give the archive access to\n      @tparam Archive The archive to wrap */\n  template <class UserData, class Archive>\n  class UserDataAdapter : public Archive\n  {\n    public:\n      //! Construct the archive with some user data struct\n      /*! This will forward all arguments (other than the user\n          data) to the wrapped archive type.  The UserDataAdapter\n          can then be used identically to the wrapped archive type\n\n          @tparam Args The arguments to pass to the constructor of\n                       the archive. */\n      template <class ... Args>\n      UserDataAdapter( UserData & ud, Args && ... args ) :\n        Archive( std::forward<Args>( args )... ),\n        userdata( ud )\n      { }\n\n    private:\n      //! Overload the rtti function to enable dynamic_cast\n      void rtti() {}\n      friend UserData & get_user_data<UserData>( Archive & ar );\n      UserData & userdata; //!< The actual user data\n  };\n\n  //! Retrieves user data from an archive wrapped by UserDataAdapter\n  /*! This will attempt to retrieve the user data associated with\n      some archive wrapped by UserDataAdapter.  If this is used on\n      an archive that is not wrapped, a run-time exception will occur.\n\n      @note This feature is experimental and may be altered or removed in a future release. See issue #46.\n\n      @note The correct use of this function cannot be enforced at compile\n            time.\n\n      @relates UserDataAdapter\n      @tparam UserData The data struct contained in the archive\n      @tparam Archive The archive, which should be wrapped by UserDataAdapter\n      @param ar The archive\n      @throws Exception if the archive this is used upon is not wrapped with\n                        UserDataAdapter. */\n  template <class UserData, class Archive>\n  UserData & get_user_data( Archive & ar )\n  {\n    try\n    {\n      return dynamic_cast<UserDataAdapter<UserData, Archive> &>( ar ).userdata;\n    }\n    catch( std::bad_cast const & )\n    {\n      throw ::cereal::Exception(\"Attempting to get user data from archive not wrapped in UserDataAdapter\");\n    }\n  }\n  #endif // CEREAL_FUTURE_EXPERIMENTAL\n} // namespace cereal\n\n#endif // CEREAL_ARCHIVES_ADAPTERS_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/archives/binary.hpp",
    "content": "/*! \\file binary.hpp\n    \\brief Binary input and output archives */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_ARCHIVES_BINARY_HPP_\n#define CEREAL_ARCHIVES_BINARY_HPP_\n\n#include \"cereal/cereal.hpp\"\n#include <sstream>\n\nnamespace cereal\n{\n  // ######################################################################\n  //! An output archive designed to save data in a compact binary representation\n  /*! This archive outputs data to a stream in an extremely compact binary\n      representation with as little extra metadata as possible.\n\n      This archive does nothing to ensure that the endianness of the saved\n      and loaded data is the same.  If you need to have portability over\n      architectures with different endianness, use PortableBinaryOutputArchive.\n\n      When using a binary archive and a file stream, you must use the\n      std::ios::binary format flag to avoid having your data altered\n      inadvertently.\n\n      \\ingroup Archives */\n  class BinaryOutputArchive : public OutputArchive<BinaryOutputArchive, AllowEmptyClassElision>\n  {\n    public:\n      //! Construct, outputting to the provided stream\n      /*! @param stream The stream to output to.  Can be a stringstream, a file stream, or\n                        even cout! */\n      BinaryOutputArchive(std::ostream & stream) :\n        OutputArchive<BinaryOutputArchive, AllowEmptyClassElision>(this),\n        itsStream(stream)\n      { }\n\n      ~BinaryOutputArchive() CEREAL_NOEXCEPT = default;\n\n      //! Writes size bytes of data to the output stream\n      void saveBinary( const void * data, std::streamsize size )\n      {\n        auto const writtenSize = itsStream.rdbuf()->sputn( reinterpret_cast<const char*>( data ), size );\n\n        if(writtenSize != size)\n          throw Exception(\"Failed to write \" + std::to_string(size) + \" bytes to output stream! Wrote \" + std::to_string(writtenSize));\n      }\n\n    private:\n      std::ostream & itsStream;\n  };\n\n  // ######################################################################\n  //! An input archive designed to load data saved using BinaryOutputArchive\n  /*  This archive does nothing to ensure that the endianness of the saved\n      and loaded data is the same.  If you need to have portability over\n      architectures with different endianness, use PortableBinaryOutputArchive.\n\n      When using a binary archive and a file stream, you must use the\n      std::ios::binary format flag to avoid having your data altered\n      inadvertently.\n\n      \\ingroup Archives */\n  class BinaryInputArchive : public InputArchive<BinaryInputArchive, AllowEmptyClassElision>\n  {\n    public:\n      //! Construct, loading from the provided stream\n      BinaryInputArchive(std::istream & stream) :\n        InputArchive<BinaryInputArchive, AllowEmptyClassElision>(this),\n        itsStream(stream)\n      { }\n\n      ~BinaryInputArchive() CEREAL_NOEXCEPT = default;\n\n      //! Reads size bytes of data from the input stream\n      void loadBinary( void * const data, std::streamsize size )\n      {\n        auto const readSize = itsStream.rdbuf()->sgetn( reinterpret_cast<char*>( data ), size );\n\n        if(readSize != size)\n          throw Exception(\"Failed to read \" + std::to_string(size) + \" bytes from input stream! Read \" + std::to_string(readSize));\n      }\n\n    private:\n      std::istream & itsStream;\n  };\n\n  // ######################################################################\n  // Common BinaryArchive serialization functions\n\n  //! Saving for POD types to binary\n  template<class T> inline\n  typename std::enable_if<std::is_arithmetic<T>::value, void>::type\n  CEREAL_SAVE_FUNCTION_NAME(BinaryOutputArchive & ar, T const & t)\n  {\n    ar.saveBinary(std::addressof(t), sizeof(t));\n  }\n\n  //! Loading for POD types from binary\n  template<class T> inline\n  typename std::enable_if<std::is_arithmetic<T>::value, void>::type\n  CEREAL_LOAD_FUNCTION_NAME(BinaryInputArchive & ar, T & t)\n  {\n    ar.loadBinary(std::addressof(t), sizeof(t));\n  }\n\n  //! Serializing NVP types to binary\n  template <class Archive, class T> inline\n  CEREAL_ARCHIVE_RESTRICT(BinaryInputArchive, BinaryOutputArchive)\n  CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar, NameValuePair<T> & t )\n  {\n    ar( t.value );\n  }\n\n  //! Serializing SizeTags to binary\n  template <class Archive, class T> inline\n  CEREAL_ARCHIVE_RESTRICT(BinaryInputArchive, BinaryOutputArchive)\n  CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar, SizeTag<T> & t )\n  {\n    ar( t.size );\n  }\n\n  //! Saving binary data\n  template <class T> inline\n  void CEREAL_SAVE_FUNCTION_NAME(BinaryOutputArchive & ar, BinaryData<T> const & bd)\n  {\n    ar.saveBinary( bd.data, static_cast<std::streamsize>( bd.size ) );\n  }\n\n  //! Loading binary data\n  template <class T> inline\n  void CEREAL_LOAD_FUNCTION_NAME(BinaryInputArchive & ar, BinaryData<T> & bd)\n  {\n    ar.loadBinary(bd.data, static_cast<std::streamsize>( bd.size ) );\n  }\n} // namespace cereal\n\n// register archives for polymorphic support\nCEREAL_REGISTER_ARCHIVE(cereal::BinaryOutputArchive)\nCEREAL_REGISTER_ARCHIVE(cereal::BinaryInputArchive)\n\n// tie input and output archives together\nCEREAL_SETUP_ARCHIVE_TRAITS(cereal::BinaryInputArchive, cereal::BinaryOutputArchive)\n\n#endif // CEREAL_ARCHIVES_BINARY_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/archives/json.hpp",
    "content": "/*! \\file json.hpp\n    \\brief JSON input and output archives */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_ARCHIVES_JSON_HPP_\n#define CEREAL_ARCHIVES_JSON_HPP_\n\n#include \"cereal/cereal.hpp\"\n#include \"cereal/details/util.hpp\"\n\nnamespace cereal\n{\n  //! An exception thrown when rapidjson fails an internal assertion\n  /*! @ingroup Utility */\n  struct RapidJSONException : Exception\n  { RapidJSONException( const char * what_ ) : Exception( what_ ) {} };\n}\n\n// Inform rapidjson that assert will throw\n#ifndef CEREAL_RAPIDJSON_ASSERT_THROWS\n#define CEREAL_RAPIDJSON_ASSERT_THROWS\n#endif // CEREAL_RAPIDJSON_ASSERT_THROWS\n\n// Override rapidjson assertions to throw exceptions by default\n#ifndef CEREAL_RAPIDJSON_ASSERT\n#define CEREAL_RAPIDJSON_ASSERT(x) if(!(x)){ \\\n  throw ::cereal::RapidJSONException(\"rapidjson internal assertion failure: \" #x); }\n#endif // RAPIDJSON_ASSERT\n\n// Enable support for parsing of nan, inf, -inf\n#ifndef CEREAL_RAPIDJSON_WRITE_DEFAULT_FLAGS\n#define CEREAL_RAPIDJSON_WRITE_DEFAULT_FLAGS kWriteNanAndInfFlag\n#endif\n\n// Enable support for parsing of nan, inf, -inf\n#ifndef CEREAL_RAPIDJSON_PARSE_DEFAULT_FLAGS\n#define CEREAL_RAPIDJSON_PARSE_DEFAULT_FLAGS kParseFullPrecisionFlag | kParseNanAndInfFlag\n#endif\n\n#include \"cereal/external/rapidjson/prettywriter.h\"\n#include \"cereal/external/rapidjson/ostreamwrapper.h\"\n#include \"cereal/external/rapidjson/istreamwrapper.h\"\n#include \"cereal/external/rapidjson/document.h\"\n#include \"cereal/external/base64.hpp\"\n\n#include <limits>\n#include <sstream>\n#include <stack>\n#include <vector>\n#include <string>\n\nnamespace cereal\n{\n  // ######################################################################\n  //! An output archive designed to save data to JSON\n  /*! This archive uses RapidJSON to build serialize data to JSON.\n\n      JSON archives provides a human readable output but at decreased\n      performance (both in time and space) compared to binary archives.\n\n      JSON archives are only guaranteed to finish flushing their contents\n      upon destruction and should thus be used in an RAII fashion.\n\n      JSON benefits greatly from name-value pairs, which if present, will\n      name the nodes in the output.  If these are not present, each level\n      of the output will be given an automatically generated delimited name.\n\n      The precision of the output archive controls the number of decimals output\n      for floating point numbers and should be sufficiently large (i.e. at least 20)\n      if there is a desire to have binary equality between the numbers output and\n      those read in.  In general you should expect a loss of precision when going\n      from floating point to text and back.\n\n      JSON archives do not output the size information for any dynamically sized structure\n      and instead infer it from the number of children for a node.  This means that data\n      can be hand edited for dynamic sized structures and will still be readable.  This\n      is accomplished through the cereal::SizeTag object, which will cause the archive\n      to output the data as a JSON array (e.g. marked by [] instead of {}), which indicates\n      that the container is variable sized and may be edited.\n\n      \\ingroup Archives */\n  class JSONOutputArchive : public OutputArchive<JSONOutputArchive>, public traits::TextArchive\n  {\n    enum class NodeType { StartObject, InObject, StartArray, InArray };\n\n    using WriteStream = CEREAL_RAPIDJSON_NAMESPACE::OStreamWrapper;\n    using JSONWriter = CEREAL_RAPIDJSON_NAMESPACE::PrettyWriter<WriteStream>;\n\n    public:\n      /*! @name Common Functionality\n          Common use cases for directly interacting with an JSONOutputArchive */\n      //! @{\n\n      //! A class containing various advanced options for the JSON archive\n      class Options\n      {\n        public:\n          //! Default options\n          static Options Default(){ return Options(); }\n\n          //! Default options with no indentation\n          static Options NoIndent(){ return Options( JSONWriter::kDefaultMaxDecimalPlaces, IndentChar::space, 0 ); }\n\n          //! The character to use for indenting\n          enum class IndentChar : char\n          {\n            space = ' ',\n            tab = '\\t',\n            newline = '\\n',\n            carriage_return = '\\r'\n          };\n\n          //! Specify specific options for the JSONOutputArchive\n          /*! @param precision The precision used for floating point numbers\n              @param indentChar The type of character to indent with\n              @param indentLength The number of indentChar to use for indentation\n                             (0 corresponds to no indentation) */\n          explicit Options( int precision = JSONWriter::kDefaultMaxDecimalPlaces,\n                            IndentChar indentChar = IndentChar::space,\n                            unsigned int indentLength = 4 ) :\n            itsPrecision( precision ),\n            itsIndentChar( static_cast<char>(indentChar) ),\n            itsIndentLength( indentLength ) { }\n\n        private:\n          friend class JSONOutputArchive;\n          int itsPrecision;\n          char itsIndentChar;\n          unsigned int itsIndentLength;\n      };\n\n      //! Construct, outputting to the provided stream\n      /*! @param stream The stream to output to.\n          @param options The JSON specific options to use.  See the Options struct\n                         for the values of default parameters */\n      JSONOutputArchive(std::ostream & stream, Options const & options = Options::Default() ) :\n        OutputArchive<JSONOutputArchive>(this),\n        itsWriteStream(stream),\n        itsWriter(itsWriteStream),\n        itsNextName(nullptr)\n      {\n        itsWriter.SetMaxDecimalPlaces( options.itsPrecision );\n        itsWriter.SetIndent( options.itsIndentChar, options.itsIndentLength );\n        itsNameCounter.push(0);\n        itsNodeStack.push(NodeType::StartObject);\n      }\n\n      //! Destructor, flushes the JSON\n      ~JSONOutputArchive() CEREAL_NOEXCEPT\n      {\n        if (itsNodeStack.top() == NodeType::InObject)\n          itsWriter.EndObject();\n        else if (itsNodeStack.top() == NodeType::InArray)\n          itsWriter.EndArray();\n      }\n\n      //! Saves some binary data, encoded as a base64 string, with an optional name\n      /*! This will create a new node, optionally named, and insert a value that consists of\n          the data encoded as a base64 string */\n      void saveBinaryValue( const void * data, size_t size, const char * name = nullptr )\n      {\n        setNextName( name );\n        writeName();\n\n        auto base64string = base64::encode( reinterpret_cast<const unsigned char *>( data ), size );\n        saveValue( base64string );\n      };\n\n      //! @}\n      /*! @name Internal Functionality\n          Functionality designed for use by those requiring control over the inner mechanisms of\n          the JSONOutputArchive */\n      //! @{\n\n      //! Starts a new node in the JSON output\n      /*! The node can optionally be given a name by calling setNextName prior\n          to creating the node\n\n          Nodes only need to be started for types that are themselves objects or arrays */\n      void startNode()\n      {\n        writeName();\n        itsNodeStack.push(NodeType::StartObject);\n        itsNameCounter.push(0);\n      }\n\n      //! Designates the most recently added node as finished\n      void finishNode()\n      {\n        // if we ended up serializing an empty object or array, writeName\n        // will never have been called - so start and then immediately end\n        // the object/array.\n        //\n        // We'll also end any object/arrays we happen to be in\n        switch(itsNodeStack.top())\n        {\n          case NodeType::StartArray:\n            itsWriter.StartArray();\n            // fall through\n          case NodeType::InArray:\n            itsWriter.EndArray();\n            break;\n          case NodeType::StartObject:\n            itsWriter.StartObject();\n            // fall through\n          case NodeType::InObject:\n            itsWriter.EndObject();\n            break;\n        }\n\n        itsNodeStack.pop();\n        itsNameCounter.pop();\n      }\n\n      //! Sets the name for the next node created with startNode\n      void setNextName( const char * name )\n      {\n        itsNextName = name;\n      }\n\n      //! Saves a bool to the current node\n      void saveValue(bool b)                { itsWriter.Bool(b);                                                         }\n      //! Saves an int to the current node\n      void saveValue(int i)                 { itsWriter.Int(i);                                                          }\n      //! Saves a uint to the current node\n      void saveValue(unsigned u)            { itsWriter.Uint(u);                                                         }\n      //! Saves an int64 to the current node\n      void saveValue(int64_t i64)           { itsWriter.Int64(i64);                                                      }\n      //! Saves a uint64 to the current node\n      void saveValue(uint64_t u64)          { itsWriter.Uint64(u64);                                                     }\n      //! Saves a double to the current node\n      void saveValue(double d)              { itsWriter.Double(d);                                                       }\n      //! Saves a string to the current node\n      void saveValue(std::string const & s) { itsWriter.String(s.c_str(), static_cast<CEREAL_RAPIDJSON_NAMESPACE::SizeType>( s.size() )); }\n      //! Saves a const char * to the current node\n      void saveValue(char const * s)        { itsWriter.String(s);                                                       }\n      //! Saves a nullptr to the current node\n      void saveValue(std::nullptr_t)        { itsWriter.Null();                                                          }\n\n    private:\n      // Some compilers/OS have difficulty disambiguating the above for various flavors of longs, so we provide\n      // special overloads to handle these cases.\n\n      //! 32 bit signed long saving to current node\n      template <class T, traits::EnableIf<sizeof(T) == sizeof(std::int32_t),\n                                          std::is_signed<T>::value> = traits::sfinae> inline\n      void saveLong(T l){ saveValue( static_cast<std::int32_t>( l ) ); }\n\n      //! non 32 bit signed long saving to current node\n      template <class T, traits::EnableIf<sizeof(T) != sizeof(std::int32_t),\n                                          std::is_signed<T>::value> = traits::sfinae> inline\n      void saveLong(T l){ saveValue( static_cast<std::int64_t>( l ) ); }\n\n      //! 32 bit unsigned long saving to current node\n      template <class T, traits::EnableIf<sizeof(T) == sizeof(std::int32_t),\n                                          std::is_unsigned<T>::value> = traits::sfinae> inline\n      void saveLong(T lu){ saveValue( static_cast<std::uint32_t>( lu ) ); }\n\n      //! non 32 bit unsigned long saving to current node\n      template <class T, traits::EnableIf<sizeof(T) != sizeof(std::int32_t),\n                                          std::is_unsigned<T>::value> = traits::sfinae> inline\n      void saveLong(T lu){ saveValue( static_cast<std::uint64_t>( lu ) ); }\n\n    public:\n#ifdef _MSC_VER\n      //! MSVC only long overload to current node\n      void saveValue( unsigned long lu ){ saveLong( lu ); };\n#else // _MSC_VER\n      //! Serialize a long if it would not be caught otherwise\n      template <class T, traits::EnableIf<std::is_same<T, long>::value,\n                                          !std::is_same<T, std::int32_t>::value,\n                                          !std::is_same<T, std::int64_t>::value> = traits::sfinae> inline\n      void saveValue( T t ){ saveLong( t ); }\n\n      //! Serialize an unsigned long if it would not be caught otherwise\n      template <class T, traits::EnableIf<std::is_same<T, unsigned long>::value,\n                                          !std::is_same<T, std::uint32_t>::value,\n                                          !std::is_same<T, std::uint64_t>::value> = traits::sfinae> inline\n      void saveValue( T t ){ saveLong( t ); }\n#endif // _MSC_VER\n\n      //! Save exotic arithmetic as strings to current node\n      /*! Handles long long (if distinct from other types), unsigned long (if distinct), and long double */\n      template <class T, traits::EnableIf<std::is_arithmetic<T>::value,\n                                          !std::is_same<T, long>::value,\n                                          !std::is_same<T, unsigned long>::value,\n                                          !std::is_same<T, std::int64_t>::value,\n                                          !std::is_same<T, std::uint64_t>::value,\n                                          (sizeof(T) >= sizeof(long double) || sizeof(T) >= sizeof(long long))> = traits::sfinae> inline\n      void saveValue(T const & t)\n      {\n        std::stringstream ss; ss.precision( std::numeric_limits<long double>::max_digits10 );\n        ss << t;\n        saveValue( ss.str() );\n      }\n\n      //! Write the name of the upcoming node and prepare object/array state\n      /*! Since writeName is called for every value that is output, regardless of\n          whether it has a name or not, it is the place where we will do a deferred\n          check of our node state and decide whether we are in an array or an object.\n\n          The general workflow of saving to the JSON archive is:\n\n            1. (optional) Set the name for the next node to be created, usually done by an NVP\n            2. Start the node\n            3. (if there is data to save) Write the name of the node (this function)\n            4. (if there is data to save) Save the data (with saveValue)\n            5. Finish the node\n          */\n      void writeName()\n      {\n        NodeType const & nodeType = itsNodeStack.top();\n\n        // Start up either an object or an array, depending on state\n        if(nodeType == NodeType::StartArray)\n        {\n          itsWriter.StartArray();\n          itsNodeStack.top() = NodeType::InArray;\n        }\n        else if(nodeType == NodeType::StartObject)\n        {\n          itsNodeStack.top() = NodeType::InObject;\n          itsWriter.StartObject();\n        }\n\n        // Array types do not output names\n        if(nodeType == NodeType::InArray) return;\n\n        if(itsNextName == nullptr)\n        {\n          std::string name = \"value\" + std::to_string( itsNameCounter.top()++ ) + \"\\0\";\n          saveValue(name);\n        }\n        else\n        {\n          saveValue(itsNextName);\n          itsNextName = nullptr;\n        }\n      }\n\n      //! Designates that the current node should be output as an array, not an object\n      void makeArray()\n      {\n        itsNodeStack.top() = NodeType::StartArray;\n      }\n\n      //! @}\n\n    private:\n      WriteStream itsWriteStream;          //!< Rapidjson write stream\n      JSONWriter itsWriter;                //!< Rapidjson writer\n      char const * itsNextName;            //!< The next name\n      std::stack<uint32_t> itsNameCounter; //!< Counter for creating unique names for unnamed nodes\n      std::stack<NodeType> itsNodeStack;\n  }; // JSONOutputArchive\n\n  // ######################################################################\n  //! An input archive designed to load data from JSON\n  /*! This archive uses RapidJSON to read in a JSON archive.\n\n      As with the output JSON archive, the preferred way to use this archive is in\n      an RAII fashion, ensuring its destruction after all data has been read.\n\n      Input JSON should have been produced by the JSONOutputArchive.  Data can\n      only be added to dynamically sized containers (marked by JSON arrays) -\n      the input archive will determine their size by looking at the number of child nodes.\n      Only JSON originating from a JSONOutputArchive is officially supported, but data\n      from other sources may work if properly formatted.\n\n      The JSONInputArchive does not require that nodes are loaded in the same\n      order they were saved by JSONOutputArchive.  Using name value pairs (NVPs),\n      it is possible to load in an out of order fashion or otherwise skip/select\n      specific nodes to load.\n\n      The default behavior of the input archive is to read sequentially starting\n      with the first node and exploring its children.  When a given NVP does\n      not match the read in name for a node, the archive will search for that\n      node at the current level and load it if it exists.  After loading an out of\n      order node, the archive will then proceed back to loading sequentially from\n      its new position.\n\n      Consider this simple example where loading of some data is skipped:\n\n      @code{cpp}\n      // imagine the input file has someData(1-9) saved in order at the top level node\n      ar( someData1, someData2, someData3 );        // XML loads in the order it sees in the file\n      ar( cereal::make_nvp( \"hello\", someData6 ) ); // NVP given does not\n                                                    // match expected NVP name, so we search\n                                                    // for the given NVP and load that value\n      ar( someData7, someData8, someData9 );        // with no NVP given, loading resumes at its\n                                                    // current location, proceeding sequentially\n      @endcode\n\n      \\ingroup Archives */\n  class JSONInputArchive : public InputArchive<JSONInputArchive>, public traits::TextArchive\n  {\n    private:\n      using ReadStream = CEREAL_RAPIDJSON_NAMESPACE::IStreamWrapper;\n      typedef CEREAL_RAPIDJSON_NAMESPACE::GenericValue<CEREAL_RAPIDJSON_NAMESPACE::UTF8<>> JSONValue;\n      typedef JSONValue::ConstMemberIterator MemberIterator;\n      typedef JSONValue::ConstValueIterator ValueIterator;\n      typedef CEREAL_RAPIDJSON_NAMESPACE::Document::GenericValue GenericValue;\n\n    public:\n      /*! @name Common Functionality\n          Common use cases for directly interacting with an JSONInputArchive */\n      //! @{\n\n      //! Construct, reading from the provided stream\n      /*! @param stream The stream to read from */\n      JSONInputArchive(std::istream & stream) :\n        InputArchive<JSONInputArchive>(this),\n        itsNextName( nullptr ),\n        itsReadStream(stream)\n      {\n        itsDocument.ParseStream<>(itsReadStream);\n        if (itsDocument.IsArray())\n          itsIteratorStack.emplace_back(itsDocument.Begin(), itsDocument.End());\n        else\n          itsIteratorStack.emplace_back(itsDocument.MemberBegin(), itsDocument.MemberEnd());\n      }\n\n      ~JSONInputArchive() CEREAL_NOEXCEPT = default;\n\n      //! Loads some binary data, encoded as a base64 string\n      /*! This will automatically start and finish a node to load the data, and can be called directly by\n          users.\n\n          Note that this follows the same ordering rules specified in the class description in regards\n          to loading in/out of order */\n      void loadBinaryValue( void * data, size_t size, const char * name = nullptr )\n      {\n        itsNextName = name;\n\n        std::string encoded;\n        loadValue( encoded );\n        auto decoded = base64::decode( encoded );\n\n        if( size != decoded.size() )\n          throw Exception(\"Decoded binary data size does not match specified size\");\n\n        std::memcpy( data, decoded.data(), decoded.size() );\n        itsNextName = nullptr;\n      };\n\n    private:\n      //! @}\n      /*! @name Internal Functionality\n          Functionality designed for use by those requiring control over the inner mechanisms of\n          the JSONInputArchive */\n      //! @{\n\n      //! An internal iterator that handles both array and object types\n      /*! This class is a variant and holds both types of iterators that\n          rapidJSON supports - one for arrays and one for objects. */\n      class Iterator\n      {\n        public:\n          Iterator() : itsIndex( 0 ), itsType(Null_) {}\n\n          Iterator(MemberIterator begin, MemberIterator end) :\n            itsMemberItBegin(begin), itsMemberItEnd(end), itsIndex(0), itsType(Member)\n          {\n            if( std::distance( begin, end ) == 0 )\n              itsType = Null_;\n          }\n\n          Iterator(ValueIterator begin, ValueIterator end) :\n            itsValueItBegin(begin), itsIndex(0), itsType(Value)\n          {\n            if( std::distance( begin, end ) == 0 )\n              itsType = Null_;\n          }\n\n          //! Advance to the next node\n          Iterator & operator++()\n          {\n            ++itsIndex;\n            return *this;\n          }\n\n          //! Get the value of the current node\n          GenericValue const & value()\n          {\n            switch(itsType)\n            {\n              case Value : return itsValueItBegin[itsIndex];\n              case Member: return itsMemberItBegin[itsIndex].value;\n              default: throw cereal::Exception(\"JSONInputArchive internal error: null or empty iterator to object or array!\");\n            }\n          }\n\n          //! Get the name of the current node, or nullptr if it has no name\n          const char * name() const\n          {\n            if( itsType == Member && (itsMemberItBegin + itsIndex) != itsMemberItEnd )\n              return itsMemberItBegin[itsIndex].name.GetString();\n            else\n              return nullptr;\n          }\n\n          //! Adjust our position such that we are at the node with the given name\n          /*! @throws Exception if no such named node exists */\n          inline void search( const char * searchName )\n          {\n            const auto len = std::strlen( searchName );\n            size_t index = 0;\n            for( auto it = itsMemberItBegin; it != itsMemberItEnd; ++it, ++index )\n            {\n              const auto currentName = it->name.GetString();\n              if( ( std::strncmp( searchName, currentName, len ) == 0 ) &&\n                  ( std::strlen( currentName ) == len ) )\n              {\n                itsIndex = index;\n                return;\n              }\n            }\n\n            throw Exception(\"JSON Parsing failed - provided NVP (\" + std::string(searchName) + \") not found\");\n          }\n\n        private:\n          MemberIterator itsMemberItBegin, itsMemberItEnd; //!< The member iterator (object)\n          ValueIterator itsValueItBegin;                   //!< The value iterator (array)\n          size_t itsIndex;                                 //!< The current index of this iterator\n          enum Type {Value, Member, Null_} itsType;        //!< Whether this holds values (array) or members (objects) or nothing\n      };\n\n      //! Searches for the expectedName node if it doesn't match the actualName\n      /*! This needs to be called before every load or node start occurs.  This function will\n          check to see if an NVP has been provided (with setNextName) and if so, see if that name matches the actual\n          next name given.  If the names do not match, it will search in the current level of the JSON for that name.\n          If the name is not found, an exception will be thrown.\n\n          Resets the NVP name after called.\n\n          @throws Exception if an expectedName is given and not found */\n      inline void search()\n      {\n        // The name an NVP provided with setNextName()\n        if( itsNextName )\n        {\n          // The actual name of the current node\n          auto const actualName = itsIteratorStack.back().name();\n\n          // Do a search if we don't see a name coming up, or if the names don't match\n          if( !actualName || std::strcmp( itsNextName, actualName ) != 0 )\n            itsIteratorStack.back().search( itsNextName );\n        }\n\n        itsNextName = nullptr;\n      }\n\n    public:\n      //! Starts a new node, going into its proper iterator\n      /*! This places an iterator for the next node to be parsed onto the iterator stack.  If the next\n          node is an array, this will be a value iterator, otherwise it will be a member iterator.\n\n          By default our strategy is to start with the document root node and then recursively iterate through\n          all children in the order they show up in the document.\n          We don't need to know NVPs to do this; we'll just blindly load in the order things appear in.\n\n          If we were given an NVP, we will search for it if it does not match our the name of the next node\n          that would normally be loaded.  This functionality is provided by search(). */\n      void startNode()\n      {\n        search();\n\n        if(itsIteratorStack.back().value().IsArray())\n          itsIteratorStack.emplace_back(itsIteratorStack.back().value().Begin(), itsIteratorStack.back().value().End());\n        else\n          itsIteratorStack.emplace_back(itsIteratorStack.back().value().MemberBegin(), itsIteratorStack.back().value().MemberEnd());\n      }\n\n      //! Finishes the most recently started node\n      void finishNode()\n      {\n        itsIteratorStack.pop_back();\n        ++itsIteratorStack.back();\n      }\n\n      //! Retrieves the current node name\n      /*! @return nullptr if no name exists */\n      const char * getNodeName() const\n      {\n        return itsIteratorStack.back().name();\n      }\n\n      //! Sets the name for the next node created with startNode\n      void setNextName( const char * name )\n      {\n        itsNextName = name;\n      }\n\n      //! Loads a value from the current node - small signed overload\n      template <class T, traits::EnableIf<std::is_signed<T>::value,\n                                          sizeof(T) < sizeof(int64_t)> = traits::sfinae> inline\n      void loadValue(T & val)\n      {\n        search();\n\n        val = static_cast<T>( itsIteratorStack.back().value().GetInt() );\n        ++itsIteratorStack.back();\n      }\n\n      //! Loads a value from the current node - small unsigned overload\n      template <class T, traits::EnableIf<std::is_unsigned<T>::value,\n                                          sizeof(T) < sizeof(uint64_t),\n                                          !std::is_same<bool, T>::value> = traits::sfinae> inline\n      void loadValue(T & val)\n      {\n        search();\n\n        val = static_cast<T>( itsIteratorStack.back().value().GetUint() );\n        ++itsIteratorStack.back();\n      }\n\n      //! Loads a value from the current node - bool overload\n      void loadValue(bool & val)        { search(); val = itsIteratorStack.back().value().GetBool(); ++itsIteratorStack.back(); }\n      //! Loads a value from the current node - int64 overload\n      void loadValue(int64_t & val)     { search(); val = itsIteratorStack.back().value().GetInt64(); ++itsIteratorStack.back(); }\n      //! Loads a value from the current node - uint64 overload\n      void loadValue(uint64_t & val)    { search(); val = itsIteratorStack.back().value().GetUint64(); ++itsIteratorStack.back(); }\n      //! Loads a value from the current node - float overload\n      void loadValue(float & val)       { search(); val = static_cast<float>(itsIteratorStack.back().value().GetDouble()); ++itsIteratorStack.back(); }\n      //! Loads a value from the current node - double overload\n      void loadValue(double & val)      { search(); val = itsIteratorStack.back().value().GetDouble(); ++itsIteratorStack.back(); }\n      //! Loads a value from the current node - string overload\n      void loadValue(std::string & val) { search(); val = itsIteratorStack.back().value().GetString(); ++itsIteratorStack.back(); }\n      //! Loads a nullptr from the current node\n      void loadValue(std::nullptr_t&)   { search(); CEREAL_RAPIDJSON_ASSERT(itsIteratorStack.back().value().IsNull()); ++itsIteratorStack.back(); }\n\n      // Special cases to handle various flavors of long, which tend to conflict with\n      // the int32_t or int64_t on various compiler/OS combinations.  MSVC doesn't need any of this.\n      #ifndef _MSC_VER\n    private:\n      //! 32 bit signed long loading from current node\n      template <class T> inline\n      typename std::enable_if<sizeof(T) == sizeof(std::int32_t) && std::is_signed<T>::value, void>::type\n      loadLong(T & l){ loadValue( reinterpret_cast<std::int32_t&>( l ) ); }\n\n      //! non 32 bit signed long loading from current node\n      template <class T> inline\n      typename std::enable_if<sizeof(T) == sizeof(std::int64_t) && std::is_signed<T>::value, void>::type\n      loadLong(T & l){ loadValue( reinterpret_cast<std::int64_t&>( l ) ); }\n\n      //! 32 bit unsigned long loading from current node\n      template <class T> inline\n      typename std::enable_if<sizeof(T) == sizeof(std::uint32_t) && !std::is_signed<T>::value, void>::type\n      loadLong(T & lu){ loadValue( reinterpret_cast<std::uint32_t&>( lu ) ); }\n\n      //! non 32 bit unsigned long loading from current node\n      template <class T> inline\n      typename std::enable_if<sizeof(T) == sizeof(std::uint64_t) && !std::is_signed<T>::value, void>::type\n      loadLong(T & lu){ loadValue( reinterpret_cast<std::uint64_t&>( lu ) ); }\n\n    public:\n      //! Serialize a long if it would not be caught otherwise\n      template <class T> inline\n      typename std::enable_if<std::is_same<T, long>::value &&\n                              sizeof(T) >= sizeof(std::int64_t) &&\n                              !std::is_same<T, std::int64_t>::value, void>::type\n      loadValue( T & t ){ loadLong(t); }\n\n      //! Serialize an unsigned long if it would not be caught otherwise\n      template <class T> inline\n      typename std::enable_if<std::is_same<T, unsigned long>::value &&\n                              sizeof(T) >= sizeof(std::uint64_t) &&\n                              !std::is_same<T, std::uint64_t>::value, void>::type\n      loadValue( T & t ){ loadLong(t); }\n      #endif // _MSC_VER\n\n    private:\n      //! Convert a string to a long long\n      void stringToNumber( std::string const & str, long long & val ) { val = std::stoll( str ); }\n      //! Convert a string to an unsigned long long\n      void stringToNumber( std::string const & str, unsigned long long & val ) { val = std::stoull( str ); }\n      //! Convert a string to a long double\n      void stringToNumber( std::string const & str, long double & val ) { val = std::stold( str ); }\n\n    public:\n      //! Loads a value from the current node - long double and long long overloads\n      template <class T, traits::EnableIf<std::is_arithmetic<T>::value,\n                                          !std::is_same<T, long>::value,\n                                          !std::is_same<T, unsigned long>::value,\n                                          !std::is_same<T, std::int64_t>::value,\n                                          !std::is_same<T, std::uint64_t>::value,\n                                          (sizeof(T) >= sizeof(long double) || sizeof(T) >= sizeof(long long))> = traits::sfinae>\n      inline void loadValue(T & val)\n      {\n        std::string encoded;\n        loadValue( encoded );\n        stringToNumber( encoded, val );\n      }\n\n      //! Loads the size for a SizeTag\n      void loadSize(size_type & size)\n      {\n        if (itsIteratorStack.size() == 1)\n          size = itsDocument.Size();\n        else\n          size = (itsIteratorStack.rbegin() + 1)->value().Size();\n      }\n\n      //! @}\n\n    private:\n      const char * itsNextName;               //!< Next name set by NVP\n      ReadStream itsReadStream;               //!< Rapidjson write stream\n      std::vector<Iterator> itsIteratorStack; //!< 'Stack' of rapidJSON iterators\n      CEREAL_RAPIDJSON_NAMESPACE::Document itsDocument; //!< Rapidjson document\n  };\n\n  // ######################################################################\n  // JSONArchive prologue and epilogue functions\n  // ######################################################################\n\n  // ######################################################################\n  //! Prologue for NVPs for JSON archives\n  /*! NVPs do not start or finish nodes - they just set up the names */\n  template <class T> inline\n  void prologue( JSONOutputArchive &, NameValuePair<T> const & )\n  { }\n\n  //! Prologue for NVPs for JSON archives\n  template <class T> inline\n  void prologue( JSONInputArchive &, NameValuePair<T> const & )\n  { }\n\n  // ######################################################################\n  //! Epilogue for NVPs for JSON archives\n  /*! NVPs do not start or finish nodes - they just set up the names */\n  template <class T> inline\n  void epilogue( JSONOutputArchive &, NameValuePair<T> const & )\n  { }\n\n  //! Epilogue for NVPs for JSON archives\n  /*! NVPs do not start or finish nodes - they just set up the names */\n  template <class T> inline\n  void epilogue( JSONInputArchive &, NameValuePair<T> const & )\n  { }\n\n  // ######################################################################\n  //! Prologue for deferred data for JSON archives\n  /*! Do nothing for the defer wrapper */\n  template <class T> inline\n  void prologue( JSONOutputArchive &, DeferredData<T> const & )\n  { }\n\n  //! Prologue for deferred data for JSON archives\n  template <class T> inline\n  void prologue( JSONInputArchive &, DeferredData<T> const & )\n  { }\n\n  // ######################################################################\n  //! Epilogue for deferred for JSON archives\n  /*! NVPs do not start or finish nodes - they just set up the names */\n  template <class T> inline\n  void epilogue( JSONOutputArchive &, DeferredData<T> const & )\n  { }\n\n  //! Epilogue for deferred for JSON archives\n  /*! Do nothing for the defer wrapper */\n  template <class T> inline\n  void epilogue( JSONInputArchive &, DeferredData<T> const & )\n  { }\n\n  // ######################################################################\n  //! Prologue for SizeTags for JSON archives\n  /*! SizeTags are strictly ignored for JSON, they just indicate\n      that the current node should be made into an array */\n  template <class T> inline\n  void prologue( JSONOutputArchive & ar, SizeTag<T> const & )\n  {\n    ar.makeArray();\n  }\n\n  //! Prologue for SizeTags for JSON archives\n  template <class T> inline\n  void prologue( JSONInputArchive &, SizeTag<T> const & )\n  { }\n\n  // ######################################################################\n  //! Epilogue for SizeTags for JSON archives\n  /*! SizeTags are strictly ignored for JSON */\n  template <class T> inline\n  void epilogue( JSONOutputArchive &, SizeTag<T> const & )\n  { }\n\n  //! Epilogue for SizeTags for JSON archives\n  template <class T> inline\n  void epilogue( JSONInputArchive &, SizeTag<T> const & )\n  { }\n\n  // ######################################################################\n  //! Prologue for all other types for JSON archives (except minimal types)\n  /*! Starts a new node, named either automatically or by some NVP,\n      that may be given data by the type about to be archived\n\n      Minimal types do not start or finish nodes */\n  template <class T, traits::EnableIf<!std::is_arithmetic<T>::value,\n                                      !traits::has_minimal_base_class_serialization<T, traits::has_minimal_output_serialization, JSONOutputArchive>::value,\n                                      !traits::has_minimal_output_serialization<T, JSONOutputArchive>::value> = traits::sfinae>\n  inline void prologue( JSONOutputArchive & ar, T const & )\n  {\n    ar.startNode();\n  }\n\n  //! Prologue for all other types for JSON archives\n  template <class T, traits::EnableIf<!std::is_arithmetic<T>::value,\n                                      !traits::has_minimal_base_class_serialization<T, traits::has_minimal_input_serialization, JSONInputArchive>::value,\n                                      !traits::has_minimal_input_serialization<T, JSONInputArchive>::value> = traits::sfinae>\n  inline void prologue( JSONInputArchive & ar, T const & )\n  {\n    ar.startNode();\n  }\n\n  // ######################################################################\n  //! Epilogue for all other types other for JSON archives (except minimal types)\n  /*! Finishes the node created in the prologue\n\n      Minimal types do not start or finish nodes */\n  template <class T, traits::EnableIf<!std::is_arithmetic<T>::value,\n                                      !traits::has_minimal_base_class_serialization<T, traits::has_minimal_output_serialization, JSONOutputArchive>::value,\n                                      !traits::has_minimal_output_serialization<T, JSONOutputArchive>::value> = traits::sfinae>\n  inline void epilogue( JSONOutputArchive & ar, T const & )\n  {\n    ar.finishNode();\n  }\n\n  //! Epilogue for all other types other for JSON archives\n  template <class T, traits::EnableIf<!std::is_arithmetic<T>::value,\n                                      !traits::has_minimal_base_class_serialization<T, traits::has_minimal_input_serialization, JSONInputArchive>::value,\n                                      !traits::has_minimal_input_serialization<T, JSONInputArchive>::value> = traits::sfinae>\n  inline void epilogue( JSONInputArchive & ar, T const & )\n  {\n    ar.finishNode();\n  }\n\n  // ######################################################################\n  //! Prologue for arithmetic types for JSON archives\n  inline\n  void prologue( JSONOutputArchive & ar, std::nullptr_t const & )\n  {\n    ar.writeName();\n  }\n\n  //! Prologue for arithmetic types for JSON archives\n  inline\n  void prologue( JSONInputArchive &, std::nullptr_t const & )\n  { }\n\n  // ######################################################################\n  //! Epilogue for arithmetic types for JSON archives\n  inline\n  void epilogue( JSONOutputArchive &, std::nullptr_t const & )\n  { }\n\n  //! Epilogue for arithmetic types for JSON archives\n  inline\n  void epilogue( JSONInputArchive &, std::nullptr_t const & )\n  { }\n\n  // ######################################################################\n  //! Prologue for arithmetic types for JSON archives\n  template <class T, traits::EnableIf<std::is_arithmetic<T>::value> = traits::sfinae> inline\n  void prologue( JSONOutputArchive & ar, T const & )\n  {\n    ar.writeName();\n  }\n\n  //! Prologue for arithmetic types for JSON archives\n  template <class T, traits::EnableIf<std::is_arithmetic<T>::value> = traits::sfinae> inline\n  void prologue( JSONInputArchive &, T const & )\n  { }\n\n  // ######################################################################\n  //! Epilogue for arithmetic types for JSON archives\n  template <class T, traits::EnableIf<std::is_arithmetic<T>::value> = traits::sfinae> inline\n  void epilogue( JSONOutputArchive &, T const & )\n  { }\n\n  //! Epilogue for arithmetic types for JSON archives\n  template <class T, traits::EnableIf<std::is_arithmetic<T>::value> = traits::sfinae> inline\n  void epilogue( JSONInputArchive &, T const & )\n  { }\n\n  // ######################################################################\n  //! Prologue for strings for JSON archives\n  template<class CharT, class Traits, class Alloc> inline\n  void prologue(JSONOutputArchive & ar, std::basic_string<CharT, Traits, Alloc> const &)\n  {\n    ar.writeName();\n  }\n\n  //! Prologue for strings for JSON archives\n  template<class CharT, class Traits, class Alloc> inline\n  void prologue(JSONInputArchive &, std::basic_string<CharT, Traits, Alloc> const &)\n  { }\n\n  // ######################################################################\n  //! Epilogue for strings for JSON archives\n  template<class CharT, class Traits, class Alloc> inline\n  void epilogue(JSONOutputArchive &, std::basic_string<CharT, Traits, Alloc> const &)\n  { }\n\n  //! Epilogue for strings for JSON archives\n  template<class CharT, class Traits, class Alloc> inline\n  void epilogue(JSONInputArchive &, std::basic_string<CharT, Traits, Alloc> const &)\n  { }\n\n  // ######################################################################\n  // Common JSONArchive serialization functions\n  // ######################################################################\n  //! Serializing NVP types to JSON\n  template <class T> inline\n  void CEREAL_SAVE_FUNCTION_NAME( JSONOutputArchive & ar, NameValuePair<T> const & t )\n  {\n    ar.setNextName( t.name );\n    ar( t.value );\n  }\n\n  template <class T> inline\n  void CEREAL_LOAD_FUNCTION_NAME( JSONInputArchive & ar, NameValuePair<T> & t )\n  {\n    ar.setNextName( t.name );\n    ar( t.value );\n  }\n\n  //! Saving for nullptr to JSON\n  inline\n  void CEREAL_SAVE_FUNCTION_NAME(JSONOutputArchive & ar, std::nullptr_t const & t)\n  {\n    ar.saveValue( t );\n  }\n\n  //! Loading arithmetic from JSON\n  inline\n  void CEREAL_LOAD_FUNCTION_NAME(JSONInputArchive & ar, std::nullptr_t & t)\n  {\n    ar.loadValue( t );\n  }\n\n  //! Saving for arithmetic to JSON\n  template <class T, traits::EnableIf<std::is_arithmetic<T>::value> = traits::sfinae> inline\n  void CEREAL_SAVE_FUNCTION_NAME(JSONOutputArchive & ar, T const & t)\n  {\n    ar.saveValue( t );\n  }\n\n  //! Loading arithmetic from JSON\n  template <class T, traits::EnableIf<std::is_arithmetic<T>::value> = traits::sfinae> inline\n  void CEREAL_LOAD_FUNCTION_NAME(JSONInputArchive & ar, T & t)\n  {\n    ar.loadValue( t );\n  }\n\n  //! saving string to JSON\n  template<class CharT, class Traits, class Alloc> inline\n  void CEREAL_SAVE_FUNCTION_NAME(JSONOutputArchive & ar, std::basic_string<CharT, Traits, Alloc> const & str)\n  {\n    ar.saveValue( str );\n  }\n\n  //! loading string from JSON\n  template<class CharT, class Traits, class Alloc> inline\n  void CEREAL_LOAD_FUNCTION_NAME(JSONInputArchive & ar, std::basic_string<CharT, Traits, Alloc> & str)\n  {\n    ar.loadValue( str );\n  }\n\n  // ######################################################################\n  //! Saving SizeTags to JSON\n  template <class T> inline\n  void CEREAL_SAVE_FUNCTION_NAME( JSONOutputArchive &, SizeTag<T> const & )\n  {\n    // nothing to do here, we don't explicitly save the size\n  }\n\n  //! Loading SizeTags from JSON\n  template <class T> inline\n  void CEREAL_LOAD_FUNCTION_NAME( JSONInputArchive & ar, SizeTag<T> & st )\n  {\n    ar.loadSize( st.size );\n  }\n} // namespace cereal\n\n// register archives for polymorphic support\nCEREAL_REGISTER_ARCHIVE(cereal::JSONInputArchive)\nCEREAL_REGISTER_ARCHIVE(cereal::JSONOutputArchive)\n\n// tie input and output archives together\nCEREAL_SETUP_ARCHIVE_TRAITS(cereal::JSONInputArchive, cereal::JSONOutputArchive)\n\n#endif // CEREAL_ARCHIVES_JSON_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/archives/portable_binary.hpp",
    "content": "/*! \\file binary.hpp\n    \\brief Binary input and output archives */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_ARCHIVES_PORTABLE_BINARY_HPP_\n#define CEREAL_ARCHIVES_PORTABLE_BINARY_HPP_\n\n#include \"cereal/cereal.hpp\"\n#include <sstream>\n#include <limits>\n\nnamespace cereal\n{\n  namespace portable_binary_detail\n  {\n    //! Returns true if the current machine is little endian\n    /*! @ingroup Internal */\n    inline std::uint8_t is_little_endian()\n    {\n      static std::int32_t test = 1;\n      return *reinterpret_cast<std::int8_t*>( &test ) == 1;\n    }\n\n    //! Swaps the order of bytes for some chunk of memory\n    /*! @param data The data as a uint8_t pointer\n        @tparam DataSize The true size of the data\n        @ingroup Internal */\n    template <std::size_t DataSize>\n    inline void swap_bytes( std::uint8_t * data )\n    {\n      for( std::size_t i = 0, end = DataSize / 2; i < end; ++i )\n        std::swap( data[i], data[DataSize - i - 1] );\n    }\n  } // end namespace portable_binary_detail\n\n  // ######################################################################\n  //! An output archive designed to save data in a compact binary representation portable over different architectures\n  /*! This archive outputs data to a stream in an extremely compact binary\n      representation with as little extra metadata as possible.\n\n      This archive will record the endianness of the data as well as the desired in/out endianness\n      and assuming that the user takes care of ensuring serialized types are the same size\n      across machines, is portable over different architectures.\n\n      When using a binary archive and a file stream, you must use the\n      std::ios::binary format flag to avoid having your data altered\n      inadvertently.\n\n      \\warning This archive has not been thoroughly tested across different architectures.\n               Please report any issues, optimizations, or feature requests at\n               <a href=\"www.github.com/USCiLab/cereal\">the project github</a>.\n\n    \\ingroup Archives */\n  class PortableBinaryOutputArchive : public OutputArchive<PortableBinaryOutputArchive, AllowEmptyClassElision>\n  {\n    public:\n      //! A class containing various advanced options for the PortableBinaryOutput archive\n      class Options\n      {\n        public:\n          //! Represents desired endianness\n          enum class Endianness : std::uint8_t\n          { big, little };\n\n          //! Default options, preserve system endianness\n          static Options Default(){ return Options(); }\n\n          //! Save as little endian\n          static Options LittleEndian(){ return Options( Endianness::little ); }\n\n          //! Save as big endian\n          static Options BigEndian(){ return Options( Endianness::big ); }\n\n          //! Specify specific options for the PortableBinaryOutputArchive\n          /*! @param outputEndian The desired endianness of saved (output) data */\n          explicit Options( Endianness outputEndian = getEndianness() ) :\n            itsOutputEndianness( outputEndian ) { }\n\n        private:\n          //! Gets the endianness of the system\n          inline static Endianness getEndianness()\n          { return portable_binary_detail::is_little_endian() ? Endianness::little : Endianness::big; }\n\n          //! Checks if Options is set for little endian\n          inline std::uint8_t is_little_endian() const\n          { return itsOutputEndianness == Endianness::little; }\n\n          friend class PortableBinaryOutputArchive;\n          Endianness itsOutputEndianness;\n      };\n\n      //! Construct, outputting to the provided stream\n      /*! @param stream The stream to output to. Should be opened with std::ios::binary flag.\n          @param options The PortableBinary specific options to use.  See the Options struct\n                         for the values of default parameters */\n      PortableBinaryOutputArchive(std::ostream & stream, Options const & options = Options::Default()) :\n        OutputArchive<PortableBinaryOutputArchive, AllowEmptyClassElision>(this),\n        itsStream(stream),\n        itsConvertEndianness( portable_binary_detail::is_little_endian() ^ options.is_little_endian() )\n      {\n        this->operator()( options.is_little_endian() );\n      }\n\n      ~PortableBinaryOutputArchive() CEREAL_NOEXCEPT = default;\n\n      //! Writes size bytes of data to the output stream\n      template <std::streamsize DataSize> inline\n      void saveBinary( const void * data, std::streamsize size )\n      {\n        std::streamsize writtenSize = 0;\n\n        if( itsConvertEndianness )\n        {\n          for( std::streamsize i = 0; i < size; i += DataSize )\n            for( std::streamsize j = 0; j < DataSize; ++j )\n              writtenSize += itsStream.rdbuf()->sputn( reinterpret_cast<const char*>( data ) + DataSize - j - 1 + i, 1 );\n        }\n        else\n          writtenSize = itsStream.rdbuf()->sputn( reinterpret_cast<const char*>( data ), size );\n\n        if(writtenSize != size)\n          throw Exception(\"Failed to write \" + std::to_string(size) + \" bytes to output stream! Wrote \" + std::to_string(writtenSize));\n      }\n\n    private:\n      std::ostream & itsStream;\n      const uint8_t itsConvertEndianness; //!< If set to true, we will need to swap bytes upon saving\n  };\n\n  // ######################################################################\n  //! An input archive designed to load data saved using PortableBinaryOutputArchive\n  /*! This archive outputs data to a stream in an extremely compact binary\n      representation with as little extra metadata as possible.\n\n      This archive will load the endianness of the serialized data and\n      if necessary transform it to match that of the local machine.  This comes\n      at a significant performance cost compared to non portable archives if\n      the transformation is necessary, and also causes a small performance hit\n      even if it is not necessary.\n\n      It is recommended to use portable archives only if you know that you will\n      be sending binary data to machines with different endianness.\n\n      The archive will do nothing to ensure types are the same size - that is\n      the responsibility of the user.\n\n      When using a binary archive and a file stream, you must use the\n      std::ios::binary format flag to avoid having your data altered\n      inadvertently.\n\n      \\warning This archive has not been thoroughly tested across different architectures.\n               Please report any issues, optimizations, or feature requests at\n               <a href=\"www.github.com/USCiLab/cereal\">the project github</a>.\n\n    \\ingroup Archives */\n  class PortableBinaryInputArchive : public InputArchive<PortableBinaryInputArchive, AllowEmptyClassElision>\n  {\n    public:\n      //! A class containing various advanced options for the PortableBinaryInput archive\n      class Options\n      {\n        public:\n          //! Represents desired endianness\n          enum class Endianness : std::uint8_t\n          { big, little };\n\n          //! Default options, preserve system endianness\n          static Options Default(){ return Options(); }\n\n          //! Load into little endian\n          static Options LittleEndian(){ return Options( Endianness::little ); }\n\n          //! Load into big endian\n          static Options BigEndian(){ return Options( Endianness::big ); }\n\n          //! Specify specific options for the PortableBinaryInputArchive\n          /*! @param inputEndian The desired endianness of loaded (input) data */\n          explicit Options( Endianness inputEndian = getEndianness() ) :\n            itsInputEndianness( inputEndian ) { }\n\n        private:\n          //! Gets the endianness of the system\n          inline static Endianness getEndianness()\n          { return portable_binary_detail::is_little_endian() ? Endianness::little : Endianness::big; }\n\n          //! Checks if Options is set for little endian\n          inline std::uint8_t is_little_endian() const\n          { return itsInputEndianness == Endianness::little; }\n\n          friend class PortableBinaryInputArchive;\n          Endianness itsInputEndianness;\n      };\n\n      //! Construct, loading from the provided stream\n      /*! @param stream The stream to read from. Should be opened with std::ios::binary flag.\n          @param options The PortableBinary specific options to use.  See the Options struct\n                         for the values of default parameters */\n      PortableBinaryInputArchive(std::istream & stream, Options const & options = Options::Default()) :\n        InputArchive<PortableBinaryInputArchive, AllowEmptyClassElision>(this),\n        itsStream(stream),\n        itsConvertEndianness( false )\n      {\n        uint8_t streamLittleEndian;\n        this->operator()( streamLittleEndian );\n        itsConvertEndianness = options.is_little_endian() ^ streamLittleEndian;\n      }\n\n      ~PortableBinaryInputArchive() CEREAL_NOEXCEPT = default;\n\n      //! Reads size bytes of data from the input stream\n      /*! @param data The data to save\n          @param size The number of bytes in the data\n          @tparam DataSize T The size of the actual type of the data elements being loaded */\n      template <std::streamsize DataSize> inline\n      void loadBinary( void * const data, std::streamsize size )\n      {\n        // load data\n        auto const readSize = itsStream.rdbuf()->sgetn( reinterpret_cast<char*>( data ), size );\n\n        if(readSize != size)\n          throw Exception(\"Failed to read \" + std::to_string(size) + \" bytes from input stream! Read \" + std::to_string(readSize));\n\n        // flip bits if needed\n        if( itsConvertEndianness )\n        {\n          std::uint8_t * ptr = reinterpret_cast<std::uint8_t*>( data );\n          for( std::streamsize i = 0; i < size; i += DataSize )\n            portable_binary_detail::swap_bytes<DataSize>( ptr + i );\n        }\n      }\n\n    private:\n      std::istream & itsStream;\n      uint8_t itsConvertEndianness; //!< If set to true, we will need to swap bytes upon loading\n  };\n\n  // ######################################################################\n  // Common BinaryArchive serialization functions\n\n  //! Saving for POD types to portable binary\n  template<class T> inline\n  typename std::enable_if<std::is_arithmetic<T>::value, void>::type\n  CEREAL_SAVE_FUNCTION_NAME(PortableBinaryOutputArchive & ar, T const & t)\n  {\n    static_assert( !std::is_floating_point<T>::value ||\n                   (std::is_floating_point<T>::value && std::numeric_limits<T>::is_iec559),\n                   \"Portable binary only supports IEEE 754 standardized floating point\" );\n    ar.template saveBinary<sizeof(T)>(std::addressof(t), sizeof(t));\n  }\n\n  //! Loading for POD types from portable binary\n  template<class T> inline\n  typename std::enable_if<std::is_arithmetic<T>::value, void>::type\n  CEREAL_LOAD_FUNCTION_NAME(PortableBinaryInputArchive & ar, T & t)\n  {\n    static_assert( !std::is_floating_point<T>::value ||\n                   (std::is_floating_point<T>::value && std::numeric_limits<T>::is_iec559),\n                   \"Portable binary only supports IEEE 754 standardized floating point\" );\n    ar.template loadBinary<sizeof(T)>(std::addressof(t), sizeof(t));\n  }\n\n  //! Serializing NVP types to portable binary\n  template <class Archive, class T> inline\n  CEREAL_ARCHIVE_RESTRICT(PortableBinaryInputArchive, PortableBinaryOutputArchive)\n  CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar, NameValuePair<T> & t )\n  {\n    ar( t.value );\n  }\n\n  //! Serializing SizeTags to portable binary\n  template <class Archive, class T> inline\n  CEREAL_ARCHIVE_RESTRICT(PortableBinaryInputArchive, PortableBinaryOutputArchive)\n  CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar, SizeTag<T> & t )\n  {\n    ar( t.size );\n  }\n\n  //! Saving binary data to portable binary\n  template <class T> inline\n  void CEREAL_SAVE_FUNCTION_NAME(PortableBinaryOutputArchive & ar, BinaryData<T> const & bd)\n  {\n    typedef typename std::remove_pointer<T>::type TT;\n    static_assert( !std::is_floating_point<TT>::value ||\n                   (std::is_floating_point<TT>::value && std::numeric_limits<TT>::is_iec559),\n                   \"Portable binary only supports IEEE 754 standardized floating point\" );\n\n    ar.template saveBinary<sizeof(TT)>( bd.data, static_cast<std::streamsize>( bd.size ) );\n  }\n\n  //! Loading binary data from portable binary\n  template <class T> inline\n  void CEREAL_LOAD_FUNCTION_NAME(PortableBinaryInputArchive & ar, BinaryData<T> & bd)\n  {\n    typedef typename std::remove_pointer<T>::type TT;\n    static_assert( !std::is_floating_point<TT>::value ||\n                   (std::is_floating_point<TT>::value && std::numeric_limits<TT>::is_iec559),\n                   \"Portable binary only supports IEEE 754 standardized floating point\" );\n\n    ar.template loadBinary<sizeof(TT)>( bd.data, static_cast<std::streamsize>( bd.size ) );\n  }\n} // namespace cereal\n\n// register archives for polymorphic support\nCEREAL_REGISTER_ARCHIVE(cereal::PortableBinaryOutputArchive)\nCEREAL_REGISTER_ARCHIVE(cereal::PortableBinaryInputArchive)\n\n// tie input and output archives together\nCEREAL_SETUP_ARCHIVE_TRAITS(cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive)\n\n#endif // CEREAL_ARCHIVES_PORTABLE_BINARY_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/archives/xml.hpp",
    "content": "/*! \\file xml.hpp\n    \\brief XML input and output archives */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_ARCHIVES_XML_HPP_\n#define CEREAL_ARCHIVES_XML_HPP_\n#include \"cereal/cereal.hpp\"\n#include \"cereal/details/util.hpp\"\n\n#include \"cereal/external/rapidxml/rapidxml.hpp\"\n#include \"cereal/external/rapidxml/rapidxml_print.hpp\"\n#include \"cereal/external/base64.hpp\"\n\n#include <sstream>\n#include <stack>\n#include <vector>\n#include <limits>\n#include <string>\n#include <cstring>\n#include <cmath>\n\nnamespace cereal\n{\n  namespace xml_detail\n  {\n    #ifndef CEREAL_XML_STRING_VALUE\n    //! The default name for the root node in a cereal xml archive.\n    /*! You can define CEREAL_XML_STRING_VALUE to be different assuming you do so\n        before this file is included. */\n    #define CEREAL_XML_STRING_VALUE \"cereal\"\n    #endif // CEREAL_XML_STRING_VALUE\n\n    //! The name given to the root node in a cereal xml archive\n    static const char * CEREAL_XML_STRING = CEREAL_XML_STRING_VALUE;\n\n    //! Returns true if the character is whitespace\n    inline bool isWhitespace( char c )\n    {\n      return c == ' ' || c == '\\t' || c == '\\n' || c == '\\r';\n    }\n  }\n\n  // ######################################################################\n  //! An output archive designed to save data to XML\n  /*! This archive uses RapidXML to build an in memory XML tree of the\n      data it serializes before outputting it to its stream upon destruction.\n      This archive should be used in an RAII fashion, letting\n      the automatic destruction of the object cause the flush to its stream.\n\n      XML archives provides a human readable output but at decreased\n      performance (both in time and space) compared to binary archives.\n\n      XML benefits greatly from name-value pairs, which if present, will\n      name the nodes in the output.  If these are not present, each level\n      of the output tree will be given an automatically generated delimited name.\n\n      The precision of the output archive controls the number of decimals output\n      for floating point numbers and should be sufficiently large (i.e. at least 20)\n      if there is a desire to have binary equality between the numbers output and\n      those read in.  In general you should expect a loss of precision when going\n      from floating point to text and back.\n\n      XML archives can optionally print the type of everything they serialize, which\n      adds an attribute to each node.\n\n      XML archives do not output the size information for any dynamically sized structure\n      and instead infer it from the number of children for a node.  This means that data\n      can be hand edited for dynamic sized structures and will still be readable.  This\n      is accomplished through the cereal::SizeTag object, which will also add an attribute\n      to its parent field.\n      \\ingroup Archives */\n  class XMLOutputArchive : public OutputArchive<XMLOutputArchive>, public traits::TextArchive\n  {\n    public:\n      /*! @name Common Functionality\n          Common use cases for directly interacting with an XMLOutputArchive */\n      //! @{\n\n      //! A class containing various advanced options for the XML archive\n      /*! Options can either be directly passed to the constructor, or chained using the\n          modifier functions for an interface analogous to named parameters */\n      class Options\n      {\n        public:\n          //! Default options\n          static Options Default(){ return Options(); }\n\n          //! Specify specific options for the XMLOutputArchive\n          /*! @param precision_ The precision used for floating point numbers\n              @param indent_ Whether to indent each line of XML\n              @param outputType_ Whether to output the type of each serialized object as an attribute\n              @param sizeAttributes_ Whether dynamically sized containers output the size=dynamic attribute */\n          explicit Options( int precision_ = std::numeric_limits<double>::max_digits10,\n                            bool indent_ = true,\n                            bool outputType_ = false,\n                            bool sizeAttributes_ = true ) :\n            itsPrecision( precision_ ),\n            itsIndent( indent_ ),\n            itsOutputType( outputType_ ),\n            itsSizeAttributes( sizeAttributes_ )\n          { }\n\n          /*! @name Option Modifiers\n              An interface for setting option settings analogous to named parameters.\n\n              @code{cpp}\n              cereal::XMLOutputArchive ar( myStream,\n                                           cereal::XMLOutputArchive::Options()\n                                           .indent(true)\n                                           .sizeAttributes(false) );\n              @endcode\n              */\n          //! @{\n\n          //! Sets the precision used for floaing point numbers\n          Options & precision( int value ){ itsPrecision = value; return * this; }\n          //! Whether to indent each line of XML\n          Options & indent( bool enable ){ itsIndent = enable; return *this; }\n          //! Whether to output the type of each serialized object as an attribute\n          Options & outputType( bool enable ){ itsOutputType = enable; return *this; }\n          //! Whether dynamically sized containers (e.g. vector) output the size=dynamic attribute\n          Options & sizeAttributes( bool enable ){ itsSizeAttributes = enable; return *this; }\n\n          //! @}\n\n        private:\n          friend class XMLOutputArchive;\n          int itsPrecision;\n          bool itsIndent;\n          bool itsOutputType;\n          bool itsSizeAttributes;\n      };\n\n      //! Construct, outputting to the provided stream upon destruction\n      /*! @param stream  The stream to output to.  Note that XML is only guaranteed to flush\n                         its output to the stream upon destruction.\n          @param options The XML specific options to use.  See the Options struct\n                         for the values of default parameters */\n      XMLOutputArchive( std::ostream & stream, Options const & options = Options::Default() ) :\n        OutputArchive<XMLOutputArchive>(this),\n        itsStream(stream),\n        itsOutputType( options.itsOutputType ),\n        itsIndent( options.itsIndent ),\n        itsSizeAttributes(options.itsSizeAttributes)\n      {\n        // rapidxml will delete all allocations when xml_document is cleared\n        auto node = itsXML.allocate_node( rapidxml::node_declaration );\n        node->append_attribute( itsXML.allocate_attribute( \"version\", \"1.0\" ) );\n        node->append_attribute( itsXML.allocate_attribute( \"encoding\", \"utf-8\" ) );\n        itsXML.append_node( node );\n\n        // allocate root node\n        auto root = itsXML.allocate_node( rapidxml::node_element, xml_detail::CEREAL_XML_STRING );\n        itsXML.append_node( root );\n        itsNodes.emplace( root );\n\n        // set attributes on the streams\n        itsStream << std::boolalpha;\n        itsStream.precision( options.itsPrecision );\n        itsOS << std::boolalpha;\n        itsOS.precision( options.itsPrecision );\n      }\n\n      //! Destructor, flushes the XML\n      ~XMLOutputArchive() CEREAL_NOEXCEPT\n      {\n        const int flags = itsIndent ? 0x0 : rapidxml::print_no_indenting;\n        rapidxml::print( itsStream, itsXML, flags );\n        itsXML.clear();\n      }\n\n      //! Saves some binary data, encoded as a base64 string, with an optional name\n      /*! This can be called directly by users and it will automatically create a child node for\n          the current XML node, populate it with a base64 encoded string, and optionally name\n          it.  The node will be finished after it has been populated.  */\n      void saveBinaryValue( const void * data, size_t size, const char * name = nullptr )\n      {\n        itsNodes.top().name = name;\n\n        startNode();\n\n        auto base64string = base64::encode( reinterpret_cast<const unsigned char *>( data ), size );\n        saveValue( base64string );\n\n        if( itsOutputType )\n          itsNodes.top().node->append_attribute( itsXML.allocate_attribute( \"type\", \"cereal binary data\" ) );\n\n        finishNode();\n      }\n\n      //! @}\n      /*! @name Internal Functionality\n          Functionality designed for use by those requiring control over the inner mechanisms of\n          the XMLOutputArchive */\n      //! @{\n\n      //! Creates a new node that is a child of the node at the top of the stack\n      /*! Nodes will be given a name that has either been pre-set by a name value pair,\n          or generated based upon a counter unique to the parent node.  If you want to\n          give a node a specific name, use setNextName prior to calling startNode.\n\n          The node will then be pushed onto the node stack. */\n      void startNode()\n      {\n        // generate a name for this new node\n        const auto nameString = itsNodes.top().getValueName();\n\n        // allocate strings for all of the data in the XML object\n        auto namePtr = itsXML.allocate_string( nameString.data(), nameString.length() + 1 );\n\n        // insert into the XML\n        auto node = itsXML.allocate_node( rapidxml::node_element, namePtr, nullptr, nameString.size() );\n        itsNodes.top().node->append_node( node );\n        itsNodes.emplace( node );\n      }\n\n      //! Designates the most recently added node as finished\n      void finishNode()\n      {\n        itsNodes.pop();\n      }\n\n      //! Sets the name for the next node created with startNode\n      void setNextName( const char * name )\n      {\n        itsNodes.top().name = name;\n      }\n\n      //! Saves some data, encoded as a string, into the current top level node\n      /*! The data will be be named with the most recent name if one exists,\n          otherwise it will be given some default delimited value that depends upon\n          the parent node */\n      template <class T> inline\n      void saveValue( T const & value )\n      {\n        itsOS.clear(); itsOS.seekp( 0, std::ios::beg );\n        itsOS << value << std::ends;\n\n        auto strValue = itsOS.str();\n\n        // itsOS.str() may contain data from previous calls after the first '\\0' that was just inserted\n        // and this data is counted in the length call. We make sure to remove that section so that the\n        // whitespace validation is done properly\n        strValue.resize(std::strlen(strValue.c_str()));\n\n        // If the first or last character is a whitespace, add xml:space attribute\n        const auto len = strValue.length();\n        if ( len > 0 && ( xml_detail::isWhitespace( strValue[0] ) || xml_detail::isWhitespace( strValue[len - 1] ) ) )\n        {\n          itsNodes.top().node->append_attribute( itsXML.allocate_attribute( \"xml:space\", \"preserve\" ) );\n        }\n\n        // allocate strings for all of the data in the XML object\n        auto dataPtr = itsXML.allocate_string(strValue.c_str(), strValue.length() + 1 );\n\n        // insert into the XML\n        itsNodes.top().node->append_node( itsXML.allocate_node( rapidxml::node_data, nullptr, dataPtr ) );\n      }\n\n      //! Overload for uint8_t prevents them from being serialized as characters\n      void saveValue( uint8_t const & value )\n      {\n        saveValue( static_cast<uint32_t>( value ) );\n      }\n\n      //! Overload for int8_t prevents them from being serialized as characters\n      void saveValue( int8_t const & value )\n      {\n        saveValue( static_cast<int32_t>( value ) );\n      }\n\n      //! Causes the type to be appended as an attribute to the most recently made node if output type is set to true\n      template <class T> inline\n      void insertType()\n      {\n        if( !itsOutputType )\n          return;\n\n        // generate a name for this new node\n        const auto nameString = util::demangledName<T>();\n\n        // allocate strings for all of the data in the XML object\n        auto namePtr = itsXML.allocate_string( nameString.data(), nameString.length() + 1 );\n\n        itsNodes.top().node->append_attribute( itsXML.allocate_attribute( \"type\", namePtr ) );\n      }\n\n      //! Appends an attribute to the current top level node\n      void appendAttribute( const char * name, const char * value )\n      {\n        auto namePtr =  itsXML.allocate_string( name );\n        auto valuePtr = itsXML.allocate_string( value );\n        itsNodes.top().node->append_attribute( itsXML.allocate_attribute( namePtr, valuePtr ) );\n      }\n\n      bool hasSizeAttributes() const { return itsSizeAttributes; }\n\n    protected:\n      //! A struct that contains metadata about a node\n      struct NodeInfo\n      {\n        NodeInfo( rapidxml::xml_node<> * n = nullptr,\n                  const char * nm = nullptr ) :\n          node( n ),\n          counter( 0 ),\n          name( nm )\n        { }\n\n        rapidxml::xml_node<> * node; //!< A pointer to this node\n        size_t counter;              //!< The counter for naming child nodes\n        const char * name;           //!< The name for the next child node\n\n        //! Gets the name for the next child node created from this node\n        /*! The name will be automatically generated using the counter if\n            a name has not been previously set.  If a name has been previously\n            set, that name will be returned only once */\n        std::string getValueName()\n        {\n          if( name )\n          {\n            auto n = name;\n            name = nullptr;\n            return {n};\n          }\n          else\n            return \"value\" + std::to_string( counter++ ) + \"\\0\";\n        }\n      }; // NodeInfo\n\n      //! @}\n\n    private:\n      std::ostream & itsStream;        //!< The output stream\n      rapidxml::xml_document<> itsXML; //!< The XML document\n      std::stack<NodeInfo> itsNodes;   //!< A stack of nodes added to the document\n      std::ostringstream itsOS;        //!< Used to format strings internally\n      bool itsOutputType;              //!< Controls whether type information is printed\n      bool itsIndent;                  //!< Controls whether indenting is used\n      bool itsSizeAttributes;          //!< Controls whether lists have a size attribute\n  }; // XMLOutputArchive\n\n  // ######################################################################\n  //! An output archive designed to load data from XML\n  /*! This archive uses RapidXML to build an in memory XML tree of the\n      data in the stream it is given before loading any types serialized.\n\n      As with the output XML archive, the preferred way to use this archive is in\n      an RAII fashion, ensuring its destruction after all data has been read.\n\n      Input XML should have been produced by the XMLOutputArchive.  Data can\n      only be added to dynamically sized containers - the input archive will\n      determine their size by looking at the number of child nodes.  Data that\n      did not originate from an XMLOutputArchive is not officially supported,\n      but may be possible to use if properly formatted.\n\n      The XMLInputArchive does not require that nodes are loaded in the same\n      order they were saved by XMLOutputArchive.  Using name value pairs (NVPs),\n      it is possible to load in an out of order fashion or otherwise skip/select\n      specific nodes to load.\n\n      The default behavior of the input archive is to read sequentially starting\n      with the first node and exploring its children.  When a given NVP does\n      not match the read in name for a node, the archive will search for that\n      node at the current level and load it if it exists.  After loading an out of\n      order node, the archive will then proceed back to loading sequentially from\n      its new position.\n\n      Consider this simple example where loading of some data is skipped:\n\n      @code{cpp}\n      // imagine the input file has someData(1-9) saved in order at the top level node\n      ar( someData1, someData2, someData3 );        // XML loads in the order it sees in the file\n      ar( cereal::make_nvp( \"hello\", someData6 ) ); // NVP given does not\n                                                    // match expected NVP name, so we search\n                                                    // for the given NVP and load that value\n      ar( someData7, someData8, someData9 );        // with no NVP given, loading resumes at its\n                                                    // current location, proceeding sequentially\n      @endcode\n\n      \\ingroup Archives */\n  class XMLInputArchive : public InputArchive<XMLInputArchive>, public traits::TextArchive\n  {\n    public:\n      /*! @name Common Functionality\n          Common use cases for directly interacting with an XMLInputArchive */\n      //! @{\n\n      //! Construct, reading in from the provided stream\n      /*! Reads in an entire XML document from some stream and parses it as soon\n          as serialization starts\n\n          @param stream The stream to read from.  Can be a stringstream or a file. */\n      XMLInputArchive( std::istream & stream ) :\n        InputArchive<XMLInputArchive>( this ),\n        itsData( std::istreambuf_iterator<char>( stream ), std::istreambuf_iterator<char>() )\n      {\n        try\n        {\n          itsData.push_back('\\0'); // rapidxml will do terrible things without the data being null terminated\n          itsXML.parse<rapidxml::parse_trim_whitespace | rapidxml::parse_no_data_nodes | rapidxml::parse_declaration_node>( reinterpret_cast<char *>( itsData.data() ) );\n        }\n        catch( rapidxml::parse_error const & )\n        {\n          //std::cerr << \"-----Original-----\" << std::endl;\n          //stream.seekg(0);\n          //std::cout << std::string( std::istreambuf_iterator<char>( stream ), std::istreambuf_iterator<char>() ) << std::endl;\n\n          //std::cerr << \"-----Error-----\" << std::endl;\n          //std::cerr << e.what() << std::endl;\n          //std::cerr << e.where<char>() << std::endl;\n          throw Exception(\"XML Parsing failed - likely due to invalid characters or invalid naming\");\n        }\n\n        // Parse the root\n        auto root = itsXML.first_node( xml_detail::CEREAL_XML_STRING );\n        if( root == nullptr )\n          throw Exception(\"Could not detect cereal root node - likely due to empty or invalid input\");\n        else\n          itsNodes.emplace( root );\n      }\n\n      ~XMLInputArchive() CEREAL_NOEXCEPT = default;\n\n      //! Loads some binary data, encoded as a base64 string, optionally specified by some name\n      /*! This will automatically start and finish a node to load the data, and can be called directly by\n          users.\n\n          Note that this follows the same ordering rules specified in the class description in regards\n          to loading in/out of order */\n      void loadBinaryValue( void * data, size_t size, const char * name = nullptr )\n      {\n        setNextName( name );\n        startNode();\n\n        std::string encoded;\n        loadValue( encoded );\n\n        auto decoded = base64::decode( encoded );\n\n        if( size != decoded.size() )\n          throw Exception(\"Decoded binary data size does not match specified size\");\n\n        std::memcpy( data, decoded.data(), decoded.size() );\n\n        finishNode();\n      }\n\n      //! @}\n      /*! @name Internal Functionality\n          Functionality designed for use by those requiring control over the inner mechanisms of\n          the XMLInputArchive */\n      //! @{\n\n      //! Prepares to start reading the next node\n      /*! This places the next node to be parsed onto the nodes stack.\n\n          By default our strategy is to start with the document root node and then\n          recursively iterate through all children in the order they show up in the document.\n          We don't need to know NVPs do to this; we'll just blindly load in the order things appear in.\n\n          We check to see if the specified NVP matches what the next automatically loaded node is.  If they\n          match, we just continue as normal, going in order.  If they don't match, we attempt to find a node\n          named after the NVP that is being loaded.  If that NVP does not exist, we throw an exception. */\n      void startNode()\n      {\n        auto next = itsNodes.top().child; // By default we would move to the next child node\n        auto const expectedName = itsNodes.top().name; // this is the expected name from the NVP, if provided\n\n        // If we were given an NVP name, look for it in the current level of the document.\n        //    We only need to do this if either we have exhausted the siblings of the current level or\n        //    the NVP name does not match the name of the node we would normally read next\n        if( expectedName && ( next == nullptr || std::strcmp( next->name(), expectedName ) != 0 ) )\n        {\n          next = itsNodes.top().search( expectedName );\n\n          if( next == nullptr )\n            throw Exception(\"XML Parsing failed - provided NVP (\" + std::string(expectedName) + \") not found\");\n        }\n\n        itsNodes.emplace( next );\n      }\n\n      //! Finishes reading the current node\n      void finishNode()\n      {\n        // remove current\n        itsNodes.pop();\n\n        // advance parent\n        itsNodes.top().advance();\n\n        // Reset name\n        itsNodes.top().name = nullptr;\n      }\n\n      //! Retrieves the current node name\n      //! will return @c nullptr if the node does not have a name\n      const char * getNodeName() const\n      {\n        return itsNodes.top().getChildName();\n      }\n\n      //! Sets the name for the next node created with startNode\n      void setNextName( const char * name )\n      {\n        itsNodes.top().name = name;\n      }\n\n      //! Loads a bool from the current top node\n      template <class T, traits::EnableIf<std::is_unsigned<T>::value,\n                                          std::is_same<T, bool>::value> = traits::sfinae> inline\n      void loadValue( T & value )\n      {\n        std::istringstream is( itsNodes.top().node->value() );\n        is.setf( std::ios::boolalpha );\n        is >> value;\n      }\n\n      //! Loads a char (signed or unsigned) from the current top node\n      template <class T, traits::EnableIf<std::is_integral<T>::value,\n                                          !std::is_same<T, bool>::value,\n                                          sizeof(T) == sizeof(char)> = traits::sfinae> inline\n      void loadValue( T & value )\n      {\n        value = *reinterpret_cast<T*>( itsNodes.top().node->value() );\n      }\n\n      //! Load an int8_t from the current top node (ensures we parse entire number)\n      void loadValue( int8_t & value )\n      {\n        int32_t val; loadValue( val ); value = static_cast<int8_t>( val );\n      }\n\n      //! Load a uint8_t from the current top node (ensures we parse entire number)\n      void loadValue( uint8_t & value )\n      {\n        uint32_t val; loadValue( val ); value = static_cast<uint8_t>( val );\n      }\n\n      //! Loads a type best represented as an unsigned long from the current top node\n      template <class T, traits::EnableIf<std::is_unsigned<T>::value,\n                                          !std::is_same<T, bool>::value,\n                                          !std::is_same<T, char>::value,\n                                          !std::is_same<T, unsigned char>::value,\n                                          sizeof(T) < sizeof(long long)> = traits::sfinae> inline\n      void loadValue( T & value )\n      {\n        value = static_cast<T>( std::stoul( itsNodes.top().node->value() ) );\n      }\n\n      //! Loads a type best represented as an unsigned long long from the current top node\n      template <class T, traits::EnableIf<std::is_unsigned<T>::value,\n                                          !std::is_same<T, bool>::value,\n                                          sizeof(T) >= sizeof(long long)> = traits::sfinae> inline\n      void loadValue( T & value )\n      {\n        value = static_cast<T>( std::stoull( itsNodes.top().node->value() ) );\n      }\n\n      //! Loads a type best represented as an int from the current top node\n      template <class T, traits::EnableIf<std::is_signed<T>::value,\n                                          !std::is_same<T, char>::value,\n                                          sizeof(T) <= sizeof(int)> = traits::sfinae> inline\n      void loadValue( T & value )\n      {\n        value = static_cast<T>( std::stoi( itsNodes.top().node->value() ) );\n      }\n\n      //! Loads a type best represented as a long from the current top node\n      template <class T, traits::EnableIf<std::is_signed<T>::value,\n                                          (sizeof(T) > sizeof(int)),\n                                          sizeof(T) <= sizeof(long)> = traits::sfinae> inline\n      void loadValue( T & value )\n      {\n        value = static_cast<T>( std::stol( itsNodes.top().node->value() ) );\n      }\n\n      //! Loads a type best represented as a long long from the current top node\n      template <class T, traits::EnableIf<std::is_signed<T>::value,\n                                          (sizeof(T) > sizeof(long)),\n                                          sizeof(T) <= sizeof(long long)> = traits::sfinae> inline\n      void loadValue( T & value )\n      {\n        value = static_cast<T>( std::stoll( itsNodes.top().node->value() ) );\n      }\n\n      //! Loads a type best represented as a float from the current top node\n      void loadValue( float & value )\n      {\n        try\n        {\n          value = std::stof( itsNodes.top().node->value() );\n        }\n        catch( std::out_of_range const & )\n        {\n          // special case for denormalized values\n          std::istringstream is( itsNodes.top().node->value() );\n          is >> value;\n          if( std::fpclassify( value ) != FP_SUBNORMAL )\n            throw;\n        }\n      }\n\n      //! Loads a type best represented as a double from the current top node\n      void loadValue( double & value )\n      {\n        try\n        {\n          value = std::stod( itsNodes.top().node->value() );\n        }\n        catch( std::out_of_range const & )\n        {\n          // special case for denormalized values\n          std::istringstream is( itsNodes.top().node->value() );\n          is >> value;\n          if( std::fpclassify( value ) != FP_SUBNORMAL )\n            throw;\n        }\n      }\n\n      //! Loads a type best represented as a long double from the current top node\n      void loadValue( long double & value )\n      {\n        try\n        {\n          value = std::stold( itsNodes.top().node->value() );\n        }\n        catch( std::out_of_range const & )\n        {\n          // special case for denormalized values\n          std::istringstream is( itsNodes.top().node->value() );\n          is >> value;\n          if( std::fpclassify( value ) != FP_SUBNORMAL )\n            throw;\n        }\n      }\n\n      //! Loads a string from the current node from the current top node\n      template<class CharT, class Traits, class Alloc> inline\n      void loadValue( std::basic_string<CharT, Traits, Alloc> & str )\n      {\n        std::basic_istringstream<CharT, Traits> is( itsNodes.top().node->value() );\n\n        str.assign( std::istreambuf_iterator<CharT, Traits>( is ),\n                    std::istreambuf_iterator<CharT, Traits>() );\n      }\n\n      //! Loads the size of the current top node\n      template <class T> inline\n      void loadSize( T & value )\n      {\n        value = getNumChildren( itsNodes.top().node );\n      }\n\n    protected:\n      //! Gets the number of children (usually interpreted as size) for the specified node\n      static size_t getNumChildren( rapidxml::xml_node<> * node )\n      {\n        size_t size = 0;\n        node = node->first_node(); // get first child\n\n        while( node != nullptr )\n        {\n          ++size;\n          node = node->next_sibling();\n        }\n\n        return size;\n      }\n\n      //! A struct that contains metadata about a node\n      /*! Keeps track of some top level node, its number of\n          remaining children, and the current active child node */\n      struct NodeInfo\n      {\n        NodeInfo( rapidxml::xml_node<> * n = nullptr ) :\n          node( n ),\n          child( n->first_node() ),\n          size( XMLInputArchive::getNumChildren( n ) ),\n          name( nullptr )\n        { }\n\n        //! Advances to the next sibling node of the child\n        /*! If this is the last sibling child will be null after calling */\n        void advance()\n        {\n          if( size > 0 )\n          {\n            --size;\n            child = child->next_sibling();\n          }\n        }\n\n        //! Searches for a child with the given name in this node\n        /*! @param searchName The name to search for (must be null terminated)\n            @return The node if found, nullptr otherwise */\n        rapidxml::xml_node<> * search( const char * searchName )\n        {\n          if( searchName )\n          {\n            size_t new_size = XMLInputArchive::getNumChildren( node );\n            const size_t name_size = rapidxml::internal::measure( searchName );\n\n            for( auto new_child = node->first_node(); new_child != nullptr; new_child = new_child->next_sibling() )\n            {\n              if( rapidxml::internal::compare( new_child->name(), new_child->name_size(), searchName, name_size, true ) )\n              {\n                size = new_size;\n                child = new_child;\n\n                return new_child;\n              }\n              --new_size;\n            }\n          }\n\n          return nullptr;\n        }\n\n        //! Returns the actual name of the next child node, if it exists\n        const char * getChildName() const\n        {\n          return child ? child->name() : nullptr;\n        }\n\n        rapidxml::xml_node<> * node;  //!< A pointer to this node\n        rapidxml::xml_node<> * child; //!< A pointer to its current child\n        size_t size;                  //!< The remaining number of children for this node\n        const char * name;            //!< The NVP name for next child node\n      }; // NodeInfo\n\n      //! @}\n\n    private:\n      std::vector<char> itsData;       //!< The raw data loaded\n      rapidxml::xml_document<> itsXML; //!< The XML document\n      std::stack<NodeInfo> itsNodes;   //!< A stack of nodes read from the document\n  };\n\n  // ######################################################################\n  // XMLArchive prologue and epilogue functions\n  // ######################################################################\n\n  // ######################################################################\n  //! Prologue for NVPs for XML output archives\n  /*! NVPs do not start or finish nodes - they just set up the names */\n  template <class T> inline\n  void prologue( XMLOutputArchive &, NameValuePair<T> const & )\n  { }\n\n  //! Prologue for NVPs for XML input archives\n  template <class T> inline\n  void prologue( XMLInputArchive &, NameValuePair<T> const & )\n  { }\n\n  // ######################################################################\n  //! Epilogue for NVPs for XML output archives\n  /*! NVPs do not start or finish nodes - they just set up the names */\n  template <class T> inline\n  void epilogue( XMLOutputArchive &, NameValuePair<T> const & )\n  { }\n\n  //! Epilogue for NVPs for XML input archives\n  template <class T> inline\n  void epilogue( XMLInputArchive &, NameValuePair<T> const & )\n  { }\n\n  // ######################################################################\n  //! Prologue for deferred data for XML archives\n  /*! Do nothing for the defer wrapper */\n  template <class T> inline\n  void prologue( XMLOutputArchive &, DeferredData<T> const & )\n  { }\n\n  //! Prologue for deferred data for XML archives\n  template <class T> inline\n  void prologue( XMLInputArchive &, DeferredData<T> const & )\n  { }\n\n  // ######################################################################\n  //! Epilogue for deferred for XML archives\n  /*! NVPs do not start or finish nodes - they just set up the names */\n  template <class T> inline\n  void epilogue( XMLOutputArchive &, DeferredData<T> const & )\n  { }\n\n  //! Epilogue for deferred for XML archives\n  /*! Do nothing for the defer wrapper */\n  template <class T> inline\n  void epilogue( XMLInputArchive &, DeferredData<T> const & )\n  { }\n\n  // ######################################################################\n  //! Prologue for SizeTags for XML output archives\n  /*! SizeTags do not start or finish nodes */\n  template <class T> inline\n  void prologue( XMLOutputArchive & ar, SizeTag<T> const & )\n  {\n      if (ar.hasSizeAttributes())\n      {\n          ar.appendAttribute(\"size\", \"dynamic\");\n      }\n  }\n\n  template <class T> inline\n  void prologue( XMLInputArchive &, SizeTag<T> const & )\n  { }\n\n  //! Epilogue for SizeTags for XML output archives\n  /*! SizeTags do not start or finish nodes */\n  template <class T> inline\n  void epilogue( XMLOutputArchive &, SizeTag<T> const & )\n  { }\n\n  template <class T> inline\n  void epilogue( XMLInputArchive &, SizeTag<T> const & )\n  { }\n\n  // ######################################################################\n  //! Prologue for all other types for XML output archives (except minimal types)\n  /*! Starts a new node, named either automatically or by some NVP,\n      that may be given data by the type about to be archived\n\n      Minimal types do not start or end nodes */\n  template <class T, traits::DisableIf<traits::has_minimal_base_class_serialization<T, traits::has_minimal_output_serialization, XMLOutputArchive>::value ||\n                                       traits::has_minimal_output_serialization<T, XMLOutputArchive>::value> = traits::sfinae> inline\n  void prologue( XMLOutputArchive & ar, T const & )\n  {\n    ar.startNode();\n    ar.insertType<T>();\n  }\n\n  //! Prologue for all other types for XML input archives (except minimal types)\n  template <class T, traits::DisableIf<traits::has_minimal_base_class_serialization<T, traits::has_minimal_input_serialization, XMLInputArchive>::value ||\n                                       traits::has_minimal_input_serialization<T, XMLInputArchive>::value> = traits::sfinae> inline\n  void prologue( XMLInputArchive & ar, T const & )\n  {\n    ar.startNode();\n  }\n\n  // ######################################################################\n  //! Epilogue for all other types other for XML output archives (except minimal types)\n  /*! Finishes the node created in the prologue\n\n      Minimal types do not start or end nodes */\n  template <class T, traits::DisableIf<traits::has_minimal_base_class_serialization<T, traits::has_minimal_output_serialization, XMLOutputArchive>::value ||\n                                       traits::has_minimal_output_serialization<T, XMLOutputArchive>::value> = traits::sfinae> inline\n  void epilogue( XMLOutputArchive & ar, T const & )\n  {\n    ar.finishNode();\n  }\n\n  //! Epilogue for all other types other for XML output archives (except minimal types)\n  template <class T, traits::DisableIf<traits::has_minimal_base_class_serialization<T, traits::has_minimal_input_serialization, XMLInputArchive>::value ||\n                                       traits::has_minimal_input_serialization<T, XMLInputArchive>::value> = traits::sfinae> inline\n  void epilogue( XMLInputArchive & ar, T const & )\n  {\n    ar.finishNode();\n  }\n\n  // ######################################################################\n  // Common XMLArchive serialization functions\n  // ######################################################################\n\n  //! Saving NVP types to XML\n  template <class T> inline\n  void CEREAL_SAVE_FUNCTION_NAME( XMLOutputArchive & ar, NameValuePair<T> const & t )\n  {\n    ar.setNextName( t.name );\n    ar( t.value );\n  }\n\n  //! Loading NVP types from XML\n  template <class T> inline\n  void CEREAL_LOAD_FUNCTION_NAME( XMLInputArchive & ar, NameValuePair<T> & t )\n  {\n    ar.setNextName( t.name );\n    ar( t.value );\n  }\n\n  // ######################################################################\n  //! Saving SizeTags to XML\n  template <class T> inline\n  void CEREAL_SAVE_FUNCTION_NAME( XMLOutputArchive &, SizeTag<T> const & )\n  { }\n\n  //! Loading SizeTags from XML\n  template <class T> inline\n  void CEREAL_LOAD_FUNCTION_NAME( XMLInputArchive & ar, SizeTag<T> & st )\n  {\n    ar.loadSize( st.size );\n  }\n\n  // ######################################################################\n  //! Saving for POD types to xml\n  template <class T, traits::EnableIf<std::is_arithmetic<T>::value> = traits::sfinae> inline\n  void CEREAL_SAVE_FUNCTION_NAME(XMLOutputArchive & ar, T const & t)\n  {\n    ar.saveValue( t );\n  }\n\n  //! Loading for POD types from xml\n  template <class T, traits::EnableIf<std::is_arithmetic<T>::value> = traits::sfinae> inline\n  void CEREAL_LOAD_FUNCTION_NAME(XMLInputArchive & ar, T & t)\n  {\n    ar.loadValue( t );\n  }\n\n  // ######################################################################\n  //! saving string to xml\n  template<class CharT, class Traits, class Alloc> inline\n  void CEREAL_SAVE_FUNCTION_NAME(XMLOutputArchive & ar, std::basic_string<CharT, Traits, Alloc> const & str)\n  {\n    ar.saveValue( str );\n  }\n\n  //! loading string from xml\n  template<class CharT, class Traits, class Alloc> inline\n  void CEREAL_LOAD_FUNCTION_NAME(XMLInputArchive & ar, std::basic_string<CharT, Traits, Alloc> & str)\n  {\n    ar.loadValue( str );\n  }\n} // namespace cereal\n\n// register archives for polymorphic support\nCEREAL_REGISTER_ARCHIVE(cereal::XMLOutputArchive)\nCEREAL_REGISTER_ARCHIVE(cereal::XMLInputArchive)\n\n// tie input and output archives together\nCEREAL_SETUP_ARCHIVE_TRAITS(cereal::XMLInputArchive, cereal::XMLOutputArchive)\n\n#endif // CEREAL_ARCHIVES_XML_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/cereal.hpp",
    "content": "/*! \\file cereal.hpp\n    \\brief Main cereal functionality */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_CEREAL_HPP_\n#define CEREAL_CEREAL_HPP_\n\n#include <type_traits>\n#include <string>\n#include <memory>\n#include <functional>\n#include <unordered_map>\n#include <unordered_set>\n#include <vector>\n#include <cstddef>\n#include <cstdint>\n#include <functional>\n\n#include \"cereal/macros.hpp\"\n#include \"cereal/details/traits.hpp\"\n#include \"cereal/details/helpers.hpp\"\n#include \"cereal/types/base_class.hpp\"\n\nnamespace cereal\n{\n  // ######################################################################\n  //! Creates a name value pair\n  /*! @relates NameValuePair\n      @ingroup Utility */\n  template <class T> inline\n  NameValuePair<T> make_nvp( std::string const & name, T && value )\n  {\n    return {name.c_str(), std::forward<T>(value)};\n  }\n\n  //! Creates a name value pair\n  /*! @relates NameValuePair\n      @ingroup Utility */\n  template <class T> inline\n  NameValuePair<T> make_nvp( const char * name, T && value )\n  {\n    return {name, std::forward<T>(value)};\n  }\n\n  //! Creates a name value pair for the variable T with the same name as the variable\n  /*! @relates NameValuePair\n      @ingroup Utility */\n  #define CEREAL_NVP(T) ::cereal::make_nvp(#T, T)\n\n  // ######################################################################\n  //! Convenience function to create binary data for both const and non const pointers\n  /*! @param data Pointer to beginning of the data\n      @param size The size in bytes of the data\n      @relates BinaryData\n      @ingroup Utility */\n  template <class T> inline\n  BinaryData<T> binary_data( T && data, size_t size )\n  {\n    return {std::forward<T>(data), size};\n  }\n\n  // ######################################################################\n  //! Creates a size tag from some variable.\n  /*! Will normally be used to serialize size (e.g. size()) information for\n      variable size containers.  If you have a variable sized container,\n      the very first thing it serializes should be its size, wrapped in\n      a SizeTag.\n\n      @relates SizeTag\n      @ingroup Utility */\n  template <class T> inline\n  SizeTag<T> make_size_tag( T && sz )\n  {\n    return {std::forward<T>(sz)};\n  }\n\n  // ######################################################################\n  //! Marks data for deferred serialization\n  /*! cereal performs a recursive depth-first traversal of data it serializes. When\n      serializing smart pointers to large, nested, or cyclical data structures, it\n      is possible to encounter a stack overflow from excessive recursion when following\n      a chain of pointers.\n\n      Deferment can help in these situations if the data can be serialized separately from\n      the pointers used to traverse the structure. For example, a graph structure can have its\n      nodes serialized before its edges:\n\n      @code{.cpp}\n      struct MyEdge\n      {\n        std::shared_ptr<MyNode> connection;\n        int some_value;\n\n        template<class Archive>\n        void serialize(Archive & archive)\n        {\n          // when we serialize an edge, we'll defer serializing the associated node\n          archive( cereal::defer( connection ),\n                   some_value );\n        }\n      };\n\n      struct MyGraphStructure\n      {\n        std::vector<MyEdge> edges;\n        std::vector<MyNodes> nodes;\n\n        template<class Archive>\n        void serialize(Archive & archive)\n        {\n          // because of the deferment, we ensure all nodes are fully serialized\n          // before any connection pointers to those nodes are serialized\n          archive( edges, nodes );\n\n          // we have to explicitly inform the archive when it is safe to serialize\n          // the deferred data\n          archive.serializeDeferments();\n        }\n      };\n      @endcode\n\n      @relates DeferredData\n      @ingroup Utility */\n  template <class T> inline\n  DeferredData<T> defer( T && value )\n  {\n    return {std::forward<T>(value)};\n  }\n\n  // ######################################################################\n  //! Called before a type is serialized to set up any special archive state\n  //! for processing some type\n  /*! If designing a serializer that needs to set up any kind of special\n      state or output extra information for a type, specialize this function\n      for the archive type and the types that require the extra information.\n      @ingroup Internal */\n  template <class Archive, class T> inline\n  void prologue( Archive & /* archive */, T const & /* data */)\n  { }\n\n  //! Called after a type is serialized to tear down any special archive state\n  //! for processing some type\n  /*! @ingroup Internal */\n  template <class Archive, class T> inline\n  void epilogue( Archive & /* archive */, T const & /* data */)\n  { }\n\n  // ######################################################################\n  //! Special flags for archives\n  /*! AllowEmptyClassElision\n        This allows for empty classes to be serialized even if they do not provide\n        a serialization function.  Classes with no data members are considered to be\n        empty.  Be warned that if this is enabled and you attempt to serialize an\n        empty class with improperly formed serialize or load/save functions, no\n        static error will occur - the error will propogate silently and your\n        intended serialization functions may not be called.  You can manually\n        ensure that your classes that have custom serialization are correct\n        by using the traits is_output_serializable and is_input_serializable\n        in cereal/details/traits.hpp.\n      @ingroup Internal */\n  enum Flags { AllowEmptyClassElision = 1 };\n\n  // ######################################################################\n  //! Registers a specific Archive type with cereal\n  /*! This registration should be done once per archive.  A good place to\n      put this is immediately following the definition of your archive.\n      Archive registration is only strictly necessary if you wish to\n      support pointers to polymorphic data types.  All archives that\n      come with cereal are already registered.\n      @ingroup Internal */\n  #define CEREAL_REGISTER_ARCHIVE(Archive)                              \\\n  namespace cereal { namespace detail {                                 \\\n  template <class T, class BindingTag>                                  \\\n  typename polymorphic_serialization_support<Archive, T>::type          \\\n  instantiate_polymorphic_binding( T*, Archive*, BindingTag, adl_tag ); \\\n  } } /* end namespaces */\n\n  //! Helper macro to omit unused warning\n  #if defined(__GNUC__)\n    // GCC / clang don't want the function\n    #define CEREAL_UNUSED_FUNCTION\n  #else\n    #define CEREAL_UNUSED_FUNCTION static void unused() { (void)version; }\n  #endif\n\n  // ######################################################################\n  //! Defines a class version for some type\n  /*! Versioning information is optional and adds some small amount of\n      overhead to serialization.  This overhead will occur both in terms of\n      space in the archive (the version information for each class will be\n      stored exactly once) as well as runtime (versioned serialization functions\n      must check to see if they need to load or store version information).\n\n      Versioning is useful if you plan on fundamentally changing the way some\n      type is serialized in the future.  Versioned serialization functions\n      cannot be used to load non-versioned data.\n\n      By default, all types have an assumed version value of zero.  By\n      using this macro, you may change the version number associated with\n      some type.  cereal will then use this value as a second parameter\n      to your serialization functions.\n\n      The interface for the serialization functions is nearly identical\n      to non-versioned serialization with the addition of a second parameter,\n      const std::uint32_t version, which will be supplied with the correct\n      version number.  Serializing the version number on a save happens\n      automatically.\n\n      Versioning cannot be mixed with non-versioned serialization functions.\n      Having both types will result result in a compile time error.  Data\n      serialized without versioning cannot be loaded by a serialization\n      function with added versioning support.\n\n      Example interface for versioning on a non-member serialize function:\n\n      @code{cpp}\n      CEREAL_CLASS_VERSION( Mytype, 77 ); // register class version\n\n      template <class Archive>\n      void serialize( Archive & ar, Mytype & t, const std::uint32_t version )\n      {\n        // When performing a load, the version associated with the class\n        // is whatever it was when that data was originally serialized\n        //\n        // When we save, we'll use the version that is defined in the macro\n\n        if( version >= some_number )\n          // do this\n        else\n          // do that\n      }\n      @endcode\n\n      Interfaces for other forms of serialization functions is similar.  This\n      macro should be placed at global scope.\n      @ingroup Utility */\n  #define CEREAL_CLASS_VERSION(TYPE, VERSION_NUMBER)                             \\\n  namespace cereal { namespace detail {                                          \\\n    template <> struct Version<TYPE>                                             \\\n    {                                                                            \\\n      static const std::uint32_t version;                                        \\\n      static std::uint32_t registerVersion()                                     \\\n      {                                                                          \\\n        ::cereal::detail::StaticObject<Versions>::getInstance().mapping.emplace( \\\n             std::type_index(typeid(TYPE)).hash_code(), VERSION_NUMBER );        \\\n        return VERSION_NUMBER;                                                   \\\n      }                                                                          \\\n      CEREAL_UNUSED_FUNCTION                                                     \\\n    }; /* end Version */                                                         \\\n    const std::uint32_t Version<TYPE>::version =                                 \\\n      Version<TYPE>::registerVersion();                                          \\\n  } } // end namespaces\n\n  // ######################################################################\n  //! The base output archive class\n  /*! This is the base output archive for all output archives.  If you create\n      a custom archive class, it should derive from this, passing itself as\n      a template parameter for the ArchiveType.\n\n      The base class provides all of the functionality necessary to\n      properly forward data to the correct serialization functions.\n\n      Individual archives should use a combination of prologue and\n      epilogue functions together with specializations of serialize, save,\n      and load to alter the functionality of their serialization.\n\n      @tparam ArchiveType The archive type that derives from OutputArchive\n      @tparam Flags Flags to control advanced functionality.  See the Flags\n                    enum for more information.\n      @ingroup Internal */\n  template<class ArchiveType, std::uint32_t Flags = 0>\n  class OutputArchive : public detail::OutputArchiveBase\n  {\n    public:\n      //! Construct the output archive\n      /*! @param derived A pointer to the derived ArchiveType (pass this from the derived archive) */\n      OutputArchive(ArchiveType * const derived) : self(derived), itsCurrentPointerId(1), itsCurrentPolymorphicTypeId(1)\n      { }\n\n      OutputArchive & operator=( OutputArchive const & ) = delete;\n\n      //! Serializes all passed in data\n      /*! This is the primary interface for serializing data with an archive */\n      template <class ... Types> inline\n      ArchiveType & operator()( Types && ... args )\n      {\n        self->process( std::forward<Types>( args )... );\n        return *self;\n      }\n\n      //! Serializes any data marked for deferment using defer\n      /*! This will cause any data wrapped in DeferredData to be immediately serialized */\n      void serializeDeferments()\n      {\n        for( auto & deferment : itsDeferments )\n          deferment();\n      }\n\n      /*! @name Boost Transition Layer\n          Functionality that mirrors the syntax for Boost.  This is useful if you are transitioning\n          a large project from Boost to cereal.  The preferred interface for cereal is using operator(). */\n      //! @{\n\n      //! Indicates this archive is not intended for loading\n      /*! This ensures compatibility with boost archive types.  If you are transitioning\n          from boost, you can check this value within a member or external serialize function\n          (i.e., Archive::is_loading::value) to disable behavior specific to loading, until\n          you can transition to split save/load or save_minimal/load_minimal functions */\n      using is_loading = std::false_type;\n\n      //! Indicates this archive is intended for saving\n      /*! This ensures compatibility with boost archive types.  If you are transitioning\n          from boost, you can check this value within a member or external serialize function\n          (i.e., Archive::is_saving::value) to enable behavior specific to loading, until\n          you can transition to split save/load or save_minimal/load_minimal functions */\n      using is_saving = std::true_type;\n\n      //! Serializes passed in data\n      /*! This is a boost compatability layer and is not the preferred way of using\n          cereal.  If you are transitioning from boost, use this until you can\n          transition to the operator() overload */\n      template <class T> inline\n      ArchiveType & operator&( T && arg )\n      {\n        self->process( std::forward<T>( arg ) );\n        return *self;\n      }\n\n      //! Serializes passed in data\n      /*! This is a boost compatability layer and is not the preferred way of using\n          cereal.  If you are transitioning from boost, use this until you can\n          transition to the operator() overload */\n      template <class T> inline\n      ArchiveType & operator<<( T && arg )\n      {\n        self->process( std::forward<T>( arg ) );\n        return *self;\n      }\n\n      //! @}\n\n      //! Registers a shared pointer with the archive\n      /*! This function is used to track shared pointer targets to prevent\n          unnecessary saves from taking place if multiple shared pointers\n          point to the same data.\n\n          @internal\n          @param addr The address (see shared_ptr get()) pointed to by the shared pointer\n          @return A key that uniquely identifies the pointer */\n      inline std::uint32_t registerSharedPointer( void const * addr )\n      {\n        // Handle null pointers by just returning 0\n        if(addr == 0) return 0;\n\n        auto id = itsSharedPointerMap.find( addr );\n        if( id == itsSharedPointerMap.end() )\n        {\n          auto ptrId = itsCurrentPointerId++;\n          itsSharedPointerMap.insert( {addr, ptrId} );\n          return ptrId | detail::msb_32bit; // mask MSB to be 1\n        }\n        else\n          return id->second;\n      }\n\n      //! Registers a polymorphic type name with the archive\n      /*! This function is used to track polymorphic types to prevent\n          unnecessary saves of identifying strings used by the polymorphic\n          support functionality.\n\n          @internal\n          @param name The name to associate with a polymorphic type\n          @return A key that uniquely identifies the polymorphic type name */\n      inline std::uint32_t registerPolymorphicType( char const * name )\n      {\n        auto id = itsPolymorphicTypeMap.find( name );\n        if( id == itsPolymorphicTypeMap.end() )\n        {\n          auto polyId = itsCurrentPolymorphicTypeId++;\n          itsPolymorphicTypeMap.insert( {name, polyId} );\n          return polyId | detail::msb_32bit; // mask MSB to be 1\n        }\n        else\n          return id->second;\n      }\n\n    private:\n      //! Serializes data after calling prologue, then calls epilogue\n      template <class T> inline\n      void process( T && head )\n      {\n        prologue( *self, head );\n        self->processImpl( head );\n        epilogue( *self, head );\n      }\n\n      //! Unwinds to process all data\n      template <class T, class ... Other> inline\n      void process( T && head, Other && ... tail )\n      {\n        self->process( std::forward<T>( head ) );\n        self->process( std::forward<Other>( tail )... );\n      }\n\n      //! Serialization of a virtual_base_class wrapper\n      /*! \\sa virtual_base_class */\n      template <class T> inline\n      ArchiveType & processImpl(virtual_base_class<T> const & b)\n      {\n        traits::detail::base_class_id id(b.base_ptr);\n        if(itsBaseClassSet.count(id) == 0)\n        {\n          itsBaseClassSet.insert(id);\n          self->processImpl( *b.base_ptr );\n        }\n        return *self;\n      }\n\n      //! Serialization of a base_class wrapper\n      /*! \\sa base_class */\n      template <class T> inline\n      ArchiveType & processImpl(base_class<T> const & b)\n      {\n        self->processImpl( *b.base_ptr );\n        return *self;\n      }\n\n      std::vector<std::function<void(void)>> itsDeferments;\n\n      template <class T> inline\n      ArchiveType & processImpl(DeferredData<T> const & d)\n      {\n        std::function<void(void)> deferment( [=](){ self->process( d.value ); } );\n        itsDeferments.emplace_back( std::move(deferment) );\n\n        return *self;\n      }\n\n      //! Helper macro that expands the requirements for activating an overload\n      /*! Requirements:\n            Has the requested serialization function\n            Does not have version and unversioned at the same time\n            Is output serializable AND\n              is specialized for this type of function OR\n              has no specialization at all */\n      #define PROCESS_IF(name)                                                             \\\n      traits::EnableIf<traits::has_##name<T, ArchiveType>::value,                          \\\n                       !traits::has_invalid_output_versioning<T, ArchiveType>::value,      \\\n                       (traits::is_output_serializable<T, ArchiveType>::value &&           \\\n                        (traits::is_specialized_##name<T, ArchiveType>::value ||           \\\n                         !traits::is_specialized<T, ArchiveType>::value))> = traits::sfinae\n\n      //! Member serialization\n      template <class T, PROCESS_IF(member_serialize)> inline\n      ArchiveType & processImpl(T const & t)\n      {\n        access::member_serialize(*self, const_cast<T &>(t));\n        return *self;\n      }\n\n      //! Non member serialization\n      template <class T, PROCESS_IF(non_member_serialize)> inline\n      ArchiveType & processImpl(T const & t)\n      {\n        CEREAL_SERIALIZE_FUNCTION_NAME(*self, const_cast<T &>(t));\n        return *self;\n      }\n\n      //! Member split (save)\n      template <class T, PROCESS_IF(member_save)> inline\n      ArchiveType & processImpl(T const & t)\n      {\n        access::member_save(*self, t);\n        return *self;\n      }\n\n      //! Non member split (save)\n      template <class T, PROCESS_IF(non_member_save)> inline\n      ArchiveType & processImpl(T const & t)\n      {\n        CEREAL_SAVE_FUNCTION_NAME(*self, t);\n        return *self;\n      }\n\n      //! Member split (save_minimal)\n      template <class T, PROCESS_IF(member_save_minimal)> inline\n      ArchiveType & processImpl(T const & t)\n      {\n        self->process( access::member_save_minimal(*self, t) );\n        return *self;\n      }\n\n      //! Non member split (save_minimal)\n      template <class T, PROCESS_IF(non_member_save_minimal)> inline\n      ArchiveType & processImpl(T const & t)\n      {\n        self->process( CEREAL_SAVE_MINIMAL_FUNCTION_NAME(*self, t) );\n        return *self;\n      }\n\n      //! Empty class specialization\n      template <class T, traits::EnableIf<(Flags & AllowEmptyClassElision),\n                                          !traits::is_output_serializable<T, ArchiveType>::value,\n                                          std::is_empty<T>::value> = traits::sfinae> inline\n      ArchiveType & processImpl(T const &)\n      {\n        return *self;\n      }\n\n      //! No matching serialization\n      /*! Invalid if we have invalid output versioning or\n          we are not output serializable, and either\n          don't allow empty class ellision or allow it but are not serializing an empty class */\n      template <class T, traits::EnableIf<traits::has_invalid_output_versioning<T, ArchiveType>::value ||\n                                          (!traits::is_output_serializable<T, ArchiveType>::value &&\n                                           (!(Flags & AllowEmptyClassElision) || ((Flags & AllowEmptyClassElision) && !std::is_empty<T>::value)))> = traits::sfinae> inline\n      ArchiveType & processImpl(T const &)\n      {\n        static_assert(traits::detail::count_output_serializers<T, ArchiveType>::value != 0,\n            \"cereal could not find any output serialization functions for the provided type and archive combination. \\n\\n \"\n            \"Types must either have a serialize function, load/save pair, or load_minimal/save_minimal pair (you may not mix these). \\n \"\n            \"Serialize functions generally have the following signature: \\n\\n \"\n            \"template<class Archive> \\n \"\n            \"  void serialize(Archive & ar) \\n \"\n            \"  { \\n \"\n            \"    ar( member1, member2, member3 ); \\n \"\n            \"  } \\n\\n \" );\n\n        static_assert(traits::detail::count_output_serializers<T, ArchiveType>::value < 2,\n            \"cereal found more than one compatible output serialization function for the provided type and archive combination. \\n\\n \"\n            \"Types must either have a serialize function, load/save pair, or load_minimal/save_minimal pair (you may not mix these). \\n \"\n            \"Use specialization (see access.hpp) if you need to disambiguate between serialize vs load/save functions.  \\n \"\n            \"Note that serialization functions can be inherited which may lead to the aforementioned ambiguities. \\n \"\n            \"In addition, you may not mix versioned with non-versioned serialization functions. \\n\\n \");\n\n        return *self;\n      }\n\n      //! Registers a class version with the archive and serializes it if necessary\n      /*! If this is the first time this class has been serialized, we will record its\n          version number and serialize that.\n\n          @tparam T The type of the class being serialized */\n      template <class T> inline\n      std::uint32_t registerClassVersion()\n      {\n        static const auto hash = std::type_index(typeid(T)).hash_code();\n        const auto insertResult = itsVersionedTypes.insert( hash );\n        const auto lock = detail::StaticObject<detail::Versions>::lock();\n        const auto version =\n          detail::StaticObject<detail::Versions>::getInstance().find( hash, detail::Version<T>::version );\n\n        if( insertResult.second ) // insertion took place, serialize the version number\n          process( make_nvp<ArchiveType>(\"cereal_class_version\", version) );\n\n        return version;\n      }\n\n      //! Member serialization\n      /*! Versioning implementation */\n      template <class T, PROCESS_IF(member_versioned_serialize)> inline\n      ArchiveType & processImpl(T const & t)\n      {\n        access::member_serialize(*self, const_cast<T &>(t), registerClassVersion<T>());\n        return *self;\n      }\n\n      //! Non member serialization\n      /*! Versioning implementation */\n      template <class T, PROCESS_IF(non_member_versioned_serialize)> inline\n      ArchiveType & processImpl(T const & t)\n      {\n        CEREAL_SERIALIZE_FUNCTION_NAME(*self, const_cast<T &>(t), registerClassVersion<T>());\n        return *self;\n      }\n\n      //! Member split (save)\n      /*! Versioning implementation */\n      template <class T, PROCESS_IF(member_versioned_save)> inline\n      ArchiveType & processImpl(T const & t)\n      {\n        access::member_save(*self, t, registerClassVersion<T>());\n        return *self;\n      }\n\n      //! Non member split (save)\n      /*! Versioning implementation */\n      template <class T, PROCESS_IF(non_member_versioned_save)> inline\n      ArchiveType & processImpl(T const & t)\n      {\n        CEREAL_SAVE_FUNCTION_NAME(*self, t, registerClassVersion<T>());\n        return *self;\n      }\n\n      //! Member split (save_minimal)\n      /*! Versioning implementation */\n      template <class T, PROCESS_IF(member_versioned_save_minimal)> inline\n      ArchiveType & processImpl(T const & t)\n      {\n        self->process( access::member_save_minimal(*self, t, registerClassVersion<T>()) );\n        return *self;\n      }\n\n      //! Non member split (save_minimal)\n      /*! Versioning implementation */\n      template <class T, PROCESS_IF(non_member_versioned_save_minimal)> inline\n      ArchiveType & processImpl(T const & t)\n      {\n        self->process( CEREAL_SAVE_MINIMAL_FUNCTION_NAME(*self, t, registerClassVersion<T>()) );\n        return *self;\n      }\n\n    #undef PROCESS_IF\n\n    private:\n      ArchiveType * const self;\n\n      //! A set of all base classes that have been serialized\n      std::unordered_set<traits::detail::base_class_id, traits::detail::base_class_id_hash> itsBaseClassSet;\n\n      //! Maps from addresses to pointer ids\n      std::unordered_map<void const *, std::uint32_t> itsSharedPointerMap;\n\n      //! The id to be given to the next pointer\n      std::uint32_t itsCurrentPointerId;\n\n      //! Maps from polymorphic type name strings to ids\n      std::unordered_map<char const *, std::uint32_t> itsPolymorphicTypeMap;\n\n      //! The id to be given to the next polymorphic type name\n      std::uint32_t itsCurrentPolymorphicTypeId;\n\n      //! Keeps track of classes that have versioning information associated with them\n      std::unordered_set<size_type> itsVersionedTypes;\n  }; // class OutputArchive\n\n  // ######################################################################\n  //! The base input archive class\n  /*! This is the base input archive for all input archives.  If you create\n      a custom archive class, it should derive from this, passing itself as\n      a template parameter for the ArchiveType.\n\n      The base class provides all of the functionality necessary to\n      properly forward data to the correct serialization functions.\n\n      Individual archives should use a combination of prologue and\n      epilogue functions together with specializations of serialize, save,\n      and load to alter the functionality of their serialization.\n\n      @tparam ArchiveType The archive type that derives from InputArchive\n      @tparam Flags Flags to control advanced functionality.  See the Flags\n                    enum for more information.\n      @ingroup Internal */\n  template<class ArchiveType, std::uint32_t Flags = 0>\n  class InputArchive : public detail::InputArchiveBase\n  {\n    public:\n      //! Construct the output archive\n      /*! @param derived A pointer to the derived ArchiveType (pass this from the derived archive) */\n      InputArchive(ArchiveType * const derived) :\n        self(derived),\n        itsBaseClassSet(),\n        itsSharedPointerMap(),\n        itsPolymorphicTypeMap(),\n        itsVersionedTypes()\n      { }\n\n      InputArchive & operator=( InputArchive const & ) = delete;\n\n      //! Serializes all passed in data\n      /*! This is the primary interface for serializing data with an archive */\n      template <class ... Types> inline\n      ArchiveType & operator()( Types && ... args )\n      {\n        process( std::forward<Types>( args )... );\n        return *self;\n      }\n\n      //! Serializes any data marked for deferment using defer\n      /*! This will cause any data wrapped in DeferredData to be immediately serialized */\n      void serializeDeferments()\n      {\n        for( auto & deferment : itsDeferments )\n          deferment();\n      }\n\n      /*! @name Boost Transition Layer\n          Functionality that mirrors the syntax for Boost.  This is useful if you are transitioning\n          a large project from Boost to cereal.  The preferred interface for cereal is using operator(). */\n      //! @{\n\n      //! Indicates this archive is intended for loading\n      /*! This ensures compatibility with boost archive types.  If you are transitioning\n          from boost, you can check this value within a member or external serialize function\n          (i.e., Archive::is_loading::value) to enable behavior specific to loading, until\n          you can transition to split save/load or save_minimal/load_minimal functions */\n      using is_loading = std::true_type;\n\n      //! Indicates this archive is not intended for saving\n      /*! This ensures compatibility with boost archive types.  If you are transitioning\n          from boost, you can check this value within a member or external serialize function\n          (i.e., Archive::is_saving::value) to disable behavior specific to loading, until\n          you can transition to split save/load or save_minimal/load_minimal functions */\n      using is_saving = std::false_type;\n\n      //! Serializes passed in data\n      /*! This is a boost compatability layer and is not the preferred way of using\n          cereal.  If you are transitioning from boost, use this until you can\n          transition to the operator() overload */\n      template <class T> inline\n      ArchiveType & operator&( T && arg )\n      {\n        self->process( std::forward<T>( arg ) );\n        return *self;\n      }\n\n      //! Serializes passed in data\n      /*! This is a boost compatability layer and is not the preferred way of using\n          cereal.  If you are transitioning from boost, use this until you can\n          transition to the operator() overload */\n      template <class T> inline\n      ArchiveType & operator>>( T && arg )\n      {\n        self->process( std::forward<T>( arg ) );\n        return *self;\n      }\n\n      //! @}\n\n      //! Retrieves a shared pointer given a unique key for it\n      /*! This is used to retrieve a previously registered shared_ptr\n          which has already been loaded.\n\n          @internal\n          @param id The unique id that was serialized for the pointer\n          @return A shared pointer to the data\n          @throw Exception if the id does not exist */\n      inline std::shared_ptr<void> getSharedPointer(std::uint32_t const id)\n      {\n        if(id == 0) return std::shared_ptr<void>(nullptr);\n\n        auto iter = itsSharedPointerMap.find( id );\n        if(iter == itsSharedPointerMap.end())\n          throw Exception(\"Error while trying to deserialize a smart pointer. Could not find id \" + std::to_string(id));\n\n        return iter->second;\n      }\n\n      //! Registers a shared pointer to its unique identifier\n      /*! After a shared pointer has been allocated for the first time, it should\n          be registered with its loaded id for future references to it.\n\n          @internal\n          @param id The unique identifier for the shared pointer\n          @param ptr The actual shared pointer */\n      inline void registerSharedPointer(std::uint32_t const id, std::shared_ptr<void> ptr)\n      {\n        std::uint32_t const stripped_id = id & ~detail::msb_32bit;\n        itsSharedPointerMap[stripped_id] = ptr;\n      }\n\n      //! Retrieves the string for a polymorphic type given a unique key for it\n      /*! This is used to retrieve a string previously registered during\n          a polymorphic load.\n\n          @internal\n          @param id The unique id that was serialized for the polymorphic type\n          @return The string identifier for the tyep */\n      inline std::string getPolymorphicName(std::uint32_t const id)\n      {\n        auto name = itsPolymorphicTypeMap.find( id );\n        if(name == itsPolymorphicTypeMap.end())\n        {\n          throw Exception(\"Error while trying to deserialize a polymorphic pointer. Could not find type id \" + std::to_string(id));\n        }\n        return name->second;\n      }\n\n      //! Registers a polymorphic name string to its unique identifier\n      /*! After a polymorphic type has been loaded for the first time, it should\n          be registered with its loaded id for future references to it.\n\n          @internal\n          @param id The unique identifier for the polymorphic type\n          @param name The name associated with the tyep */\n      inline void registerPolymorphicName(std::uint32_t const id, std::string const & name)\n      {\n        std::uint32_t const stripped_id = id & ~detail::msb_32bit;\n        itsPolymorphicTypeMap.insert( {stripped_id, name} );\n      }\n\n    private:\n      //! Serializes data after calling prologue, then calls epilogue\n      template <class T> inline\n      void process( T && head )\n      {\n        prologue( *self, head );\n        self->processImpl( head );\n        epilogue( *self, head );\n      }\n\n      //! Unwinds to process all data\n      template <class T, class ... Other> inline\n      void process( T && head, Other && ... tail )\n      {\n        process( std::forward<T>( head ) );\n        process( std::forward<Other>( tail )... );\n      }\n\n      //! Serialization of a virtual_base_class wrapper\n      /*! \\sa virtual_base_class */\n      template <class T> inline\n      ArchiveType & processImpl(virtual_base_class<T> & b)\n      {\n        traits::detail::base_class_id id(b.base_ptr);\n        if(itsBaseClassSet.count(id) == 0)\n        {\n          itsBaseClassSet.insert(id);\n          self->processImpl( *b.base_ptr );\n        }\n        return *self;\n      }\n\n      //! Serialization of a base_class wrapper\n      /*! \\sa base_class */\n      template <class T> inline\n      ArchiveType & processImpl(base_class<T> & b)\n      {\n        self->processImpl( *b.base_ptr );\n        return *self;\n      }\n\n      std::vector<std::function<void(void)>> itsDeferments;\n\n      template <class T> inline\n      ArchiveType & processImpl(DeferredData<T> const & d)\n      {\n        std::function<void(void)> deferment( [=](){ self->process( d.value ); } );\n        itsDeferments.emplace_back( std::move(deferment) );\n\n        return *self;\n      }\n\n      //! Helper macro that expands the requirements for activating an overload\n      /*! Requirements:\n            Has the requested serialization function\n            Does not have version and unversioned at the same time\n            Is input serializable AND\n              is specialized for this type of function OR\n              has no specialization at all */\n      #define PROCESS_IF(name)                                                              \\\n      traits::EnableIf<traits::has_##name<T, ArchiveType>::value,                           \\\n                       !traits::has_invalid_input_versioning<T, ArchiveType>::value,        \\\n                       (traits::is_input_serializable<T, ArchiveType>::value &&             \\\n                        (traits::is_specialized_##name<T, ArchiveType>::value ||            \\\n                         !traits::is_specialized<T, ArchiveType>::value))> = traits::sfinae\n\n      //! Member serialization\n      template <class T, PROCESS_IF(member_serialize)> inline\n      ArchiveType & processImpl(T & t)\n      {\n        access::member_serialize(*self, t);\n        return *self;\n      }\n\n      //! Non member serialization\n      template <class T, PROCESS_IF(non_member_serialize)> inline\n      ArchiveType & processImpl(T & t)\n      {\n        CEREAL_SERIALIZE_FUNCTION_NAME(*self, t);\n        return *self;\n      }\n\n      //! Member split (load)\n      template <class T, PROCESS_IF(member_load)> inline\n      ArchiveType & processImpl(T & t)\n      {\n        access::member_load(*self, t);\n        return *self;\n      }\n\n      //! Non member split (load)\n      template <class T, PROCESS_IF(non_member_load)> inline\n      ArchiveType & processImpl(T & t)\n      {\n        CEREAL_LOAD_FUNCTION_NAME(*self, t);\n        return *self;\n      }\n\n      //! Member split (load_minimal)\n      template <class T, PROCESS_IF(member_load_minimal)> inline\n      ArchiveType & processImpl(T & t)\n      {\n        using OutArchiveType = typename traits::detail::get_output_from_input<ArchiveType>::type;\n        typename traits::has_member_save_minimal<T, OutArchiveType>::type value;\n        self->process( value );\n        access::member_load_minimal(*self, t, value);\n        return *self;\n      }\n\n      //! Non member split (load_minimal)\n      template <class T, PROCESS_IF(non_member_load_minimal)> inline\n      ArchiveType & processImpl(T & t)\n      {\n        using OutArchiveType = typename traits::detail::get_output_from_input<ArchiveType>::type;\n        typename traits::has_non_member_save_minimal<T, OutArchiveType>::type value;\n        self->process( value );\n        CEREAL_LOAD_MINIMAL_FUNCTION_NAME(*self, t, value);\n        return *self;\n      }\n\n      //! Empty class specialization\n      template <class T, traits::EnableIf<(Flags & AllowEmptyClassElision),\n                                          !traits::is_input_serializable<T, ArchiveType>::value,\n                                          std::is_empty<T>::value> = traits::sfinae> inline\n      ArchiveType & processImpl(T const &)\n      {\n        return *self;\n      }\n\n      //! No matching serialization\n      /*! Invalid if we have invalid input versioning or\n          we are not input serializable, and either\n          don't allow empty class ellision or allow it but are not serializing an empty class */\n      template <class T, traits::EnableIf<traits::has_invalid_input_versioning<T, ArchiveType>::value ||\n                                          (!traits::is_input_serializable<T, ArchiveType>::value &&\n                                           (!(Flags & AllowEmptyClassElision) || ((Flags & AllowEmptyClassElision) && !std::is_empty<T>::value)))> = traits::sfinae> inline\n      ArchiveType & processImpl(T const &)\n      {\n        static_assert(traits::detail::count_input_serializers<T, ArchiveType>::value != 0,\n            \"cereal could not find any input serialization functions for the provided type and archive combination. \\n\\n \"\n            \"Types must either have a serialize function, load/save pair, or load_minimal/save_minimal pair (you may not mix these). \\n \"\n            \"Serialize functions generally have the following signature: \\n\\n \"\n            \"template<class Archive> \\n \"\n            \"  void serialize(Archive & ar) \\n \"\n            \"  { \\n \"\n            \"    ar( member1, member2, member3 ); \\n \"\n            \"  } \\n\\n \" );\n\n        static_assert(traits::detail::count_input_serializers<T, ArchiveType>::value < 2,\n            \"cereal found more than one compatible input serialization function for the provided type and archive combination. \\n\\n \"\n            \"Types must either have a serialize function, load/save pair, or load_minimal/save_minimal pair (you may not mix these). \\n \"\n            \"Use specialization (see access.hpp) if you need to disambiguate between serialize vs load/save functions.  \\n \"\n            \"Note that serialization functions can be inherited which may lead to the aforementioned ambiguities. \\n \"\n            \"In addition, you may not mix versioned with non-versioned serialization functions. \\n\\n \");\n\n        return *self;\n      }\n\n      //! Befriend for versioning in load_and_construct\n      template <class A, class B, bool C, bool D, bool E, bool F> friend struct detail::Construct;\n\n      //! Registers a class version with the archive and serializes it if necessary\n      /*! If this is the first time this class has been serialized, we will record its\n          version number and serialize that.\n\n          @tparam T The type of the class being serialized */\n      template <class T> inline\n      std::uint32_t loadClassVersion()\n      {\n        static const auto hash = std::type_index(typeid(T)).hash_code();\n        auto lookupResult = itsVersionedTypes.find( hash );\n\n        if( lookupResult != itsVersionedTypes.end() ) // already exists\n          return lookupResult->second;\n        else // need to load\n        {\n          std::uint32_t version;\n\n          process( make_nvp<ArchiveType>(\"cereal_class_version\", version) );\n          itsVersionedTypes.emplace_hint( lookupResult, hash, version );\n\n          return version;\n        }\n      }\n\n      //! Member serialization\n      /*! Versioning implementation */\n      template <class T, PROCESS_IF(member_versioned_serialize)> inline\n      ArchiveType & processImpl(T & t)\n      {\n        const auto version = loadClassVersion<T>();\n        access::member_serialize(*self, t, version);\n        return *self;\n      }\n\n      //! Non member serialization\n      /*! Versioning implementation */\n      template <class T, PROCESS_IF(non_member_versioned_serialize)> inline\n      ArchiveType & processImpl(T & t)\n      {\n        const auto version = loadClassVersion<T>();\n        CEREAL_SERIALIZE_FUNCTION_NAME(*self, t, version);\n        return *self;\n      }\n\n      //! Member split (load)\n      /*! Versioning implementation */\n      template <class T, PROCESS_IF(member_versioned_load)> inline\n      ArchiveType & processImpl(T & t)\n      {\n        const auto version = loadClassVersion<T>();\n        access::member_load(*self, t, version);\n        return *self;\n      }\n\n      //! Non member split (load)\n      /*! Versioning implementation */\n      template <class T, PROCESS_IF(non_member_versioned_load)> inline\n      ArchiveType & processImpl(T & t)\n      {\n        const auto version = loadClassVersion<T>();\n        CEREAL_LOAD_FUNCTION_NAME(*self, t, version);\n        return *self;\n      }\n\n      //! Member split (load_minimal)\n      /*! Versioning implementation */\n      template <class T, PROCESS_IF(member_versioned_load_minimal)> inline\n      ArchiveType & processImpl(T & t)\n      {\n        using OutArchiveType = typename traits::detail::get_output_from_input<ArchiveType>::type;\n        const auto version = loadClassVersion<T>();\n        typename traits::has_member_versioned_save_minimal<T, OutArchiveType>::type value;\n        self->process(value);\n        access::member_load_minimal(*self, t, value, version);\n        return *self;\n      }\n\n      //! Non member split (load_minimal)\n      /*! Versioning implementation */\n      template <class T, PROCESS_IF(non_member_versioned_load_minimal)> inline\n      ArchiveType & processImpl(T & t)\n      {\n        using OutArchiveType = typename traits::detail::get_output_from_input<ArchiveType>::type;\n        const auto version = loadClassVersion<T>();\n        typename traits::has_non_member_versioned_save_minimal<T, OutArchiveType>::type value;\n        self->process(value);\n        CEREAL_LOAD_MINIMAL_FUNCTION_NAME(*self, t, value, version);\n        return *self;\n      }\n\n      #undef PROCESS_IF\n\n    private:\n      ArchiveType * const self;\n\n      //! A set of all base classes that have been serialized\n      std::unordered_set<traits::detail::base_class_id, traits::detail::base_class_id_hash> itsBaseClassSet;\n\n      //! Maps from pointer ids to metadata\n      std::unordered_map<std::uint32_t, std::shared_ptr<void>> itsSharedPointerMap;\n\n      //! Maps from name ids to names\n      std::unordered_map<std::uint32_t, std::string> itsPolymorphicTypeMap;\n\n      //! Maps from type hash codes to version numbers\n      std::unordered_map<std::size_t, std::uint32_t> itsVersionedTypes;\n  }; // class InputArchive\n} // namespace cereal\n\n// This include needs to come after things such as binary_data, make_nvp, etc\n#include \"cereal/types/common.hpp\"\n\n#endif // CEREAL_CEREAL_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/details/helpers.hpp",
    "content": "/*! \\file helpers.hpp\n    \\brief Internal helper functionality\n    \\ingroup Internal */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_DETAILS_HELPERS_HPP_\n#define CEREAL_DETAILS_HELPERS_HPP_\n\n#include <type_traits>\n#include <cstdint>\n#include <utility>\n#include <memory>\n#include <unordered_map>\n#include <stdexcept>\n\n#include \"cereal/macros.hpp\"\n#include \"cereal/details/static_object.hpp\"\n\nnamespace cereal\n{\n  // ######################################################################\n  //! An exception class thrown when things go wrong at runtime\n  /*! @ingroup Utility */\n  struct Exception : public std::runtime_error\n  {\n    explicit Exception( const std::string & what_ ) : std::runtime_error(what_) {}\n    explicit Exception( const char * what_ ) : std::runtime_error(what_) {}\n  };\n\n  // ######################################################################\n  //! The size type used by cereal\n  /*! To ensure compatability between 32, 64, etc bit machines, we need to use\n      a fixed size type instead of size_t, which may vary from machine to\n      machine.\n\n      The default value for CEREAL_SIZE_TYPE is specified in cereal/macros.hpp */\n  using size_type = CEREAL_SIZE_TYPE;\n\n  // forward decls\n  class BinaryOutputArchive;\n  class BinaryInputArchive;\n\n  // ######################################################################\n  namespace detail\n  {\n    struct NameValuePairCore {}; //!< Traits struct for NVPs\n    struct DeferredDataCore {}; //!< Traits struct for DeferredData\n  }\n\n  // ######################################################################\n  //! For holding name value pairs\n  /*! This pairs a name (some string) with some value such that an archive\n      can potentially take advantage of the pairing.\n\n      In serialization functions, NameValuePairs are usually created like so:\n      @code{.cpp}\n      struct MyStruct\n      {\n        int a, b, c, d, e;\n\n        template<class Archive>\n        void serialize(Archive & archive)\n        {\n          archive( CEREAL_NVP(a),\n                   CEREAL_NVP(b),\n                   CEREAL_NVP(c),\n                   CEREAL_NVP(d),\n                   CEREAL_NVP(e) );\n        }\n      };\n      @endcode\n\n      Alternatively, you can give you data members custom names like so:\n      @code{.cpp}\n      struct MyStruct\n      {\n        int a, b, my_embarrassing_variable_name, d, e;\n\n        template<class Archive>\n        void serialize(Archive & archive)\n        {\n          archive( CEREAL_NVP(a),\n                   CEREAL_NVP(b),\n                   cereal::make_nvp(\"var\", my_embarrassing_variable_name) );\n                   CEREAL_NVP(d),\n                   CEREAL_NVP(e) );\n        }\n      };\n      @endcode\n\n      There is a slight amount of overhead to creating NameValuePairs, so there\n      is a third method which will elide the names when they are not used by\n      the Archive:\n\n      @code{.cpp}\n      struct MyStruct\n      {\n        int a, b;\n\n        template<class Archive>\n        void serialize(Archive & archive)\n        {\n          archive( cereal::make_nvp<Archive>(a),\n                   cereal::make_nvp<Archive>(b) );\n        }\n      };\n      @endcode\n\n      This third method is generally only used when providing generic type\n      support.  Users writing their own serialize functions will normally\n      explicitly control whether they want to use NVPs or not.\n\n      @internal */\n  template <class T>\n  class NameValuePair : detail::NameValuePairCore\n  {\n    private:\n      // If we get passed an array, keep the type as is, otherwise store\n      // a reference if we were passed an l value reference, else copy the value\n      using Type = typename std::conditional<std::is_array<typename std::remove_reference<T>::type>::value,\n                                             typename std::remove_cv<T>::type,\n                                             typename std::conditional<std::is_lvalue_reference<T>::value,\n                                                                       T,\n                                                                       typename std::decay<T>::type>::type>::type;\n\n      // prevent nested nvps\n      static_assert( !std::is_base_of<detail::NameValuePairCore, T>::value,\n                     \"Cannot pair a name to a NameValuePair\" );\n\n      NameValuePair & operator=( NameValuePair const & ) = delete;\n\n    public:\n      //! Constructs a new NameValuePair\n      /*! @param n The name of the pair\n          @param v The value to pair.  Ideally this should be an l-value reference so that\n                   the value can be both loaded and saved to.  If you pass an r-value reference,\n                   the NameValuePair will store a copy of it instead of a reference.  Thus you should\n                   only pass r-values in cases where this makes sense, such as the result of some\n                   size() call.\n          @internal */\n      NameValuePair( char const * n, T && v ) : name(n), value(std::forward<T>(v)) {}\n\n      char const * name;\n      Type value;\n  };\n\n  //! A specialization of make_nvp<> that simply forwards the value for binary archives\n  /*! @relates NameValuePair\n      @internal */\n  template<class Archive, class T> inline\n  typename\n  std::enable_if<std::is_same<Archive, ::cereal::BinaryInputArchive>::value ||\n                 std::is_same<Archive, ::cereal::BinaryOutputArchive>::value,\n  T && >::type\n  make_nvp( const char *, T && value )\n  {\n    return std::forward<T>(value);\n  }\n\n  //! A specialization of make_nvp<> that actually creates an nvp for non-binary archives\n  /*! @relates NameValuePair\n      @internal */\n  template<class Archive, class T> inline\n  typename\n  std::enable_if<!std::is_same<Archive, ::cereal::BinaryInputArchive>::value &&\n                 !std::is_same<Archive, ::cereal::BinaryOutputArchive>::value,\n  NameValuePair<T> >::type\n  make_nvp( const char * name, T && value)\n  {\n    return {name, std::forward<T>(value)};\n  }\n\n  //! Convenience for creating a templated NVP\n  /*! For use in internal generic typing functions which have an\n      Archive type declared\n      @internal */\n  #define CEREAL_NVP_(name, value) ::cereal::make_nvp<Archive>(name, value)\n\n  // ######################################################################\n  //! A wrapper around data that can be serialized in a binary fashion\n  /*! This class is used to demarcate data that can safely be serialized\n      as a binary chunk of data.  Individual archives can then choose how\n      best represent this during serialization.\n\n      @internal */\n  template <class T>\n  struct BinaryData\n  {\n    //! Internally store the pointer as a void *, keeping const if created with\n    //! a const pointer\n    using PT = typename std::conditional<std::is_const<typename std::remove_pointer<typename std::remove_reference<T>::type>::type>::value,\n                                         const void *,\n                                         void *>::type;\n\n    BinaryData( T && d, uint64_t s ) : data(std::forward<T>(d)), size(s) {}\n\n    PT data;       //!< pointer to beginning of data\n    uint64_t size; //!< size in bytes\n  };\n\n  // ######################################################################\n  //! A wrapper around data that should be serialized after all non-deferred data\n  /*! This class is used to demarcate data that can only be safely serialized after\n      any data not wrapped in this class.\n\n      @internal */\n  template <class T>\n  class DeferredData : detail::DeferredDataCore\n  {\n    private:\n      // If we get passed an array, keep the type as is, otherwise store\n      // a reference if we were passed an l value reference, else copy the value\n      using Type = typename std::conditional<std::is_array<typename std::remove_reference<T>::type>::value,\n                                             typename std::remove_cv<T>::type,\n                                             typename std::conditional<std::is_lvalue_reference<T>::value,\n                                                                       T,\n                                                                       typename std::decay<T>::type>::type>::type;\n\n      // prevent nested nvps\n      static_assert( !std::is_base_of<detail::DeferredDataCore, T>::value,\n                     \"Cannot defer DeferredData\" );\n\n      DeferredData & operator=( DeferredData const & ) = delete;\n\n    public:\n      //! Constructs a new NameValuePair\n      /*! @param v The value to defer.  Ideally this should be an l-value reference so that\n                   the value can be both loaded and saved to.  If you pass an r-value reference,\n                   the DeferredData will store a copy of it instead of a reference.  Thus you should\n                   only pass r-values in cases where this makes sense, such as the result of some\n                   size() call.\n          @internal */\n      DeferredData( T && v ) : value(std::forward<T>(v)) {}\n\n      Type value;\n  };\n\n  // ######################################################################\n  namespace detail\n  {\n    // base classes for type checking\n    /* The rtti virtual function only exists to enable an archive to\n       be used in a polymorphic fashion, if necessary.  See the\n       archive adapters for an example of this */\n    class OutputArchiveBase\n    {\n      public:\n        OutputArchiveBase() = default;\n        OutputArchiveBase( OutputArchiveBase && ) CEREAL_NOEXCEPT {}\n        OutputArchiveBase & operator=( OutputArchiveBase && ) CEREAL_NOEXCEPT { return *this; }\n        virtual ~OutputArchiveBase() CEREAL_NOEXCEPT = default;\n\n      private:\n        virtual void rtti() {}\n    };\n\n    class InputArchiveBase\n    {\n      public:\n        InputArchiveBase() = default;\n        InputArchiveBase( InputArchiveBase && ) CEREAL_NOEXCEPT {}\n        InputArchiveBase & operator=( InputArchiveBase && ) CEREAL_NOEXCEPT { return *this; }\n        virtual ~InputArchiveBase() CEREAL_NOEXCEPT = default;\n\n      private:\n        virtual void rtti() {}\n    };\n\n    // forward decls for polymorphic support\n    template <class Archive, class T> struct polymorphic_serialization_support;\n    struct adl_tag;\n\n    // used during saving pointers\n    static const uint32_t msb_32bit  = 0x80000000;\n    static const int32_t msb2_32bit = 0x40000000;\n  }\n\n  // ######################################################################\n  //! A wrapper around size metadata\n  /*! This class provides a way for archives to have more flexibility over how\n      they choose to serialize size metadata for containers.  For some archive\n      types, the size may be implicitly encoded in the output (e.g. JSON) and\n      not need an explicit entry.  Specializing serialize or load/save for\n      your archive and SizeTags allows you to choose what happens.\n\n      @internal */\n  template <class T>\n  class SizeTag\n  {\n    private:\n      // Store a reference if passed an lvalue reference, otherwise\n      // make a copy of the data\n      using Type = typename std::conditional<std::is_lvalue_reference<T>::value,\n                                             T,\n                                             typename std::decay<T>::type>::type;\n\n      SizeTag & operator=( SizeTag const & ) = delete;\n\n    public:\n      SizeTag( T && sz ) : size(std::forward<T>(sz)) {}\n\n      Type size;\n  };\n\n  // ######################################################################\n  //! A wrapper around a key and value for serializing data into maps.\n  /*! This class just provides a grouping of keys and values into a struct for\n      human readable archives. For example, XML archives will use this wrapper\n      to write maps like so:\n\n      @code{.xml}\n      <mymap>\n        <item0>\n          <key>MyFirstKey</key>\n          <value>MyFirstValue</value>\n        </item0>\n        <item1>\n          <key>MySecondKey</key>\n          <value>MySecondValue</value>\n        </item1>\n      </mymap>\n      @endcode\n\n      \\sa make_map_item\n      @internal */\n  template <class Key, class Value>\n  struct MapItem\n  {\n    using KeyType = typename std::conditional<\n      std::is_lvalue_reference<Key>::value,\n      Key,\n      typename std::decay<Key>::type>::type;\n\n    using ValueType = typename std::conditional<\n      std::is_lvalue_reference<Value>::value,\n      Value,\n      typename std::decay<Value>::type>::type;\n\n    //! Construct a MapItem from a key and a value\n    /*! @internal */\n    MapItem( Key && key_, Value && value_ ) : key(std::forward<Key>(key_)), value(std::forward<Value>(value_)) {}\n\n    MapItem & operator=( MapItem const & ) = delete;\n\n    KeyType key;\n    ValueType value;\n\n    //! Serialize the MapItem with the NVPs \"key\" and \"value\"\n    template <class Archive> inline\n    void CEREAL_SERIALIZE_FUNCTION_NAME(Archive & archive)\n    {\n      archive( make_nvp<Archive>(\"key\",   key),\n               make_nvp<Archive>(\"value\", value) );\n    }\n  };\n\n  //! Create a MapItem so that human readable archives will group keys and values together\n  /*! @internal\n      @relates MapItem */\n  template <class KeyType, class ValueType> inline\n  MapItem<KeyType, ValueType> make_map_item(KeyType && key, ValueType && value)\n  {\n    return {std::forward<KeyType>(key), std::forward<ValueType>(value)};\n  }\n\n  namespace detail\n  {\n    //! Tag for Version, which due to its anonymous namespace, becomes a different\n    //! type in each translation unit\n    /*! This allows CEREAL_CLASS_VERSION to be safely called in a header file */\n    namespace{ struct version_binding_tag {}; }\n\n    // ######################################################################\n    //! Version information class\n    /*! This is the base case for classes that have not been explicitly\n        registered */\n    template <class T, class BindingTag = version_binding_tag> struct Version\n    {\n      static const std::uint32_t version = 0;\n      // we don't need to explicitly register these types since they\n      // always get a version number of 0\n    };\n\n    //! Holds all registered version information\n    struct Versions\n    {\n      std::unordered_map<std::size_t, std::uint32_t> mapping;\n\n      std::uint32_t find( std::size_t hash, std::uint32_t version )\n      {\n        const auto result = mapping.emplace( hash, version );\n        return result.first->second;\n      }\n    }; // struct Versions\n  } // namespace detail\n} // namespace cereal\n\n#endif // CEREAL_DETAILS_HELPERS_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/details/polymorphic_impl.hpp",
    "content": "/*! \\file polymorphic_impl.hpp\n    \\brief Internal polymorphism support\n    \\ingroup Internal */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/* This code is heavily inspired by the boost serialization implementation by the following authors\n\n   (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n   Use, modification and distribution is subject to the Boost Software\n   License, Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt)\n\n    See http://www.boost.org for updates, documentation, and revision history.\n\n   (C) Copyright 2006 David Abrahams - http://www.boost.org.\n\n   See /boost/serialization/export.hpp, /boost/archive/detail/register_archive.hpp,\n   and /boost/serialization/void_cast.hpp for their implementation. Additional details\n   found in other files split across serialization and archive.\n*/\n#ifndef CEREAL_DETAILS_POLYMORPHIC_IMPL_HPP_\n#define CEREAL_DETAILS_POLYMORPHIC_IMPL_HPP_\n\n#include \"cereal/details/polymorphic_impl_fwd.hpp\"\n#include \"cereal/details/static_object.hpp\"\n#include \"cereal/types/memory.hpp\"\n#include \"cereal/types/string.hpp\"\n#include <functional>\n#include <typeindex>\n#include <map>\n#include <limits>\n#include <set>\n#include <stack>\n\n//! Helper macro to omit unused warning\n#if defined(__GNUC__)\n  // GCC / clang don't want the function\n  #define CEREAL_BIND_TO_ARCHIVES_UNUSED_FUNCTION\n#else\n  #define CEREAL_BIND_TO_ARCHIVES_UNUSED_FUNCTION static void unused() { (void)b; }\n#endif\n\n//! Binds a polymorhic type to all registered archives\n/*! This binds a polymorphic type to all compatible registered archives that\n    have been registered with CEREAL_REGISTER_ARCHIVE.  This must be called\n    after all archives are registered (usually after the archives themselves\n    have been included). */\n#define CEREAL_BIND_TO_ARCHIVES(...)                                     \\\n    namespace cereal {                                                   \\\n    namespace detail {                                                   \\\n    template<>                                                           \\\n    struct init_binding<__VA_ARGS__> {                                   \\\n        static bind_to_archives<__VA_ARGS__> const & b;                  \\\n        CEREAL_BIND_TO_ARCHIVES_UNUSED_FUNCTION                          \\\n    };                                                                   \\\n    bind_to_archives<__VA_ARGS__> const & init_binding<__VA_ARGS__>::b = \\\n        ::cereal::detail::StaticObject<                                  \\\n            bind_to_archives<__VA_ARGS__>                                \\\n        >::getInstance().bind();                                         \\\n    }} /* end namespaces */\n\nnamespace cereal\n{\n  /* Polymorphic casting support */\n  namespace detail\n  {\n    //! Base type for polymorphic void casting\n    /*! Contains functions for casting between registered base and derived types.\n\n        This is necessary so that cereal can properly cast between polymorphic types\n        even though void pointers are used, which normally have no type information.\n        Runtime type information is used instead to index a compile-time made mapping\n        that can perform the proper cast. In the case of multiple levels of inheritance,\n        cereal will attempt to find the shortest path by using registered relationships to\n        perform the cast.\n\n        This class will be allocated as a StaticObject and only referenced by pointer,\n        allowing a templated derived version of it to define strongly typed functions\n        that cast between registered base and derived types. */\n    struct PolymorphicCaster\n    {\n      PolymorphicCaster() = default;\n      PolymorphicCaster( const PolymorphicCaster & ) = default;\n      PolymorphicCaster & operator=( const PolymorphicCaster & ) = default;\n      PolymorphicCaster( PolymorphicCaster && ) CEREAL_NOEXCEPT {}\n      PolymorphicCaster & operator=( PolymorphicCaster && ) CEREAL_NOEXCEPT { return *this; }\n      virtual ~PolymorphicCaster() CEREAL_NOEXCEPT = default;\n\n      //! Downcasts to the proper derived type\n      virtual void const * downcast( void const * const ptr ) const = 0;\n      //! Upcast to proper base type\n      virtual void * upcast( void * const ptr ) const = 0;\n      //! Upcast to proper base type, shared_ptr version\n      virtual std::shared_ptr<void> upcast( std::shared_ptr<void> const & ptr ) const = 0;\n    };\n\n    //! Holds registered mappings between base and derived types for casting\n    /*! This will be allocated as a StaticObject and holds a map containing\n        all registered mappings between base and derived types. */\n    struct PolymorphicCasters\n    {\n      //! Maps from a derived type index to a set of chainable casters\n      using DerivedCasterMap = std::unordered_map<std::type_index, std::vector<PolymorphicCaster const *>>;\n      //! Maps from base type index to a map from derived type index to caster\n      std::unordered_map<std::type_index, DerivedCasterMap> map;\n\n      std::multimap<std::type_index, std::type_index> reverseMap;\n\n      //! Error message used for unregistered polymorphic casts\n      #define UNREGISTERED_POLYMORPHIC_CAST_EXCEPTION(LoadSave)                                                                                                                \\\n        throw cereal::Exception(\"Trying to \" #LoadSave \" a registered polymorphic type with an unregistered polymorphic cast.\\n\"                                               \\\n                                \"Could not find a path to a base class (\" + util::demangle(baseInfo.name()) + \") for type: \" + ::cereal::util::demangledName<Derived>() + \"\\n\" \\\n                                \"Make sure you either serialize the base class at some point via cereal::base_class or cereal::virtual_base_class.\\n\"                          \\\n                                \"Alternatively, manually register the association with CEREAL_REGISTER_POLYMORPHIC_RELATION.\");\n\n      //! Checks if the mapping object that can perform the upcast or downcast exists, and returns it if so\n      /*! Uses the type index from the base and derived class to find the matching\n          registered caster. If no matching caster exists, the bool in the pair will be false and the vector\n          reference should not be used. */\n      static std::pair<bool, std::vector<PolymorphicCaster const *> const &>\n      lookup_if_exists( std::type_index const & baseIndex, std::type_index const & derivedIndex )\n      {\n        // First phase of lookup - match base type index\n        auto const & baseMap = StaticObject<PolymorphicCasters>::getInstance().map;\n        auto baseIter = baseMap.find( baseIndex );\n        if (baseIter == baseMap.end())\n          return {false, {}};\n\n        // Second phase - find a match from base to derived\n        auto const & derivedMap = baseIter->second;\n        auto derivedIter = derivedMap.find( derivedIndex );\n        if (derivedIter == derivedMap.end())\n          return {false, {}};\n\n        return {true, derivedIter->second};\n      }\n\n      //! Gets the mapping object that can perform the upcast or downcast\n      /*! Uses the type index from the base and derived class to find the matching\n          registered caster. If no matching caster exists, calls the exception function.\n\n          The returned PolymorphicCaster is capable of upcasting or downcasting between the two types. */\n      template <class F> inline\n      static std::vector<PolymorphicCaster const *> const & lookup( std::type_index const & baseIndex, std::type_index const & derivedIndex, F && exceptionFunc )\n      {\n        // First phase of lookup - match base type index\n        auto const & baseMap = StaticObject<PolymorphicCasters>::getInstance().map;\n        auto baseIter = baseMap.find( baseIndex );\n        if( baseIter == baseMap.end() )\n          exceptionFunc();\n\n        // Second phase - find a match from base to derived\n        auto const & derivedMap = baseIter->second;\n        auto derivedIter = derivedMap.find( derivedIndex );\n        if( derivedIter == derivedMap.end() )\n          exceptionFunc();\n\n        return derivedIter->second;\n      }\n\n      //! Performs a downcast to the derived type using a registered mapping\n      template <class Derived> inline\n      static const Derived * downcast( const void * dptr, std::type_info const & baseInfo )\n      {\n        auto const & mapping = lookup( baseInfo, typeid(Derived), [&](){ UNREGISTERED_POLYMORPHIC_CAST_EXCEPTION(save) } );\n\n        for( auto const * dmap : mapping )\n          dptr = dmap->downcast( dptr );\n\n        return static_cast<Derived const *>( dptr );\n      }\n\n      //! Performs an upcast to the registered base type using the given a derived type\n      /*! The return is untyped because the final casting to the base type must happen in the polymorphic\n          serialization function, where the type is known at compile time */\n      template <class Derived> inline\n      static void * upcast( Derived * const dptr, std::type_info const & baseInfo )\n      {\n        auto const & mapping = lookup( baseInfo, typeid(Derived), [&](){ UNREGISTERED_POLYMORPHIC_CAST_EXCEPTION(load) } );\n\n        void * uptr = dptr;\n        for( auto mIter = mapping.rbegin(), mEnd = mapping.rend(); mIter != mEnd; ++mIter )\n          uptr = (*mIter)->upcast( uptr );\n\n        return uptr;\n      }\n\n      //! Upcasts for shared pointers\n      template <class Derived> inline\n      static std::shared_ptr<void> upcast( std::shared_ptr<Derived> const & dptr, std::type_info const & baseInfo )\n      {\n        auto const & mapping = lookup( baseInfo, typeid(Derived), [&](){ UNREGISTERED_POLYMORPHIC_CAST_EXCEPTION(load) } );\n\n        std::shared_ptr<void> uptr = dptr;\n        for( auto mIter = mapping.rbegin(), mEnd = mapping.rend(); mIter != mEnd; ++mIter )\n          uptr = (*mIter)->upcast( uptr );\n\n        return uptr;\n      }\n\n      #undef UNREGISTERED_POLYMORPHIC_CAST_EXCEPTION\n    };\n\n    #ifdef CEREAL_OLDER_GCC\n      #define CEREAL_EMPLACE_MAP(map, key, value)                     \\\n      map.insert( std::make_pair(std::move(key), std::move(value)) );\n    #else // NOT CEREAL_OLDER_GCC\n      #define CEREAL_EMPLACE_MAP(map, key, value)                     \\\n      map.emplace( key, value );\n    #endif // NOT_CEREAL_OLDER_GCC\n\n    //! Strongly typed derivation of PolymorphicCaster\n    template <class Base, class Derived>\n    struct PolymorphicVirtualCaster : PolymorphicCaster\n    {\n      //! Inserts an entry in the polymorphic casting map for this pairing\n      /*! Creates an explicit mapping between Base and Derived in both upwards and\n          downwards directions, allowing void pointers to either to be properly cast\n          assuming dynamic type information is available */\n      PolymorphicVirtualCaster()\n      {\n        const auto baseKey = std::type_index(typeid(Base));\n        const auto derivedKey = std::type_index(typeid(Derived));\n\n        // First insert the relation Base->Derived\n        const auto lock = StaticObject<PolymorphicCasters>::lock();\n        auto & baseMap = StaticObject<PolymorphicCasters>::getInstance().map;\n\n        {\n          auto & derivedMap = baseMap.insert( {baseKey, PolymorphicCasters::DerivedCasterMap{}} ).first->second;\n          auto & derivedVec = derivedMap.insert( {derivedKey, {}} ).first->second;\n          derivedVec.push_back( this );\n        }\n\n        // Insert reverse relation Derived->Base\n        auto & reverseMap = StaticObject<PolymorphicCasters>::getInstance().reverseMap;\n        CEREAL_EMPLACE_MAP(reverseMap, derivedKey, baseKey);\n\n        // Find all chainable unregistered relations\n        /* The strategy here is to process only the nodes in the class hierarchy graph that have been\n           affected by the new insertion. The aglorithm iteratively processes a node an ensures that it\n           is updated with all new shortest length paths. It then rocesses the parents of the active node,\n           with the knowledge that all children have already been processed.\n\n           Note that for the following, we'll use the nomenclature of parent and child to not confuse with\n           the inserted base derived relationship */\n        {\n          // Checks whether there is a path from parent->child and returns a <dist, path> pair\n          // dist is set to MAX if the path does not exist\n          auto checkRelation = [](std::type_index const & parentInfo, std::type_index const & childInfo) ->\n            std::pair<size_t, std::vector<PolymorphicCaster const *> const &>\n          {\n            auto result = PolymorphicCasters::lookup_if_exists( parentInfo, childInfo );\n            if( result.first )\n            {\n              auto const & path = result.second;\n              return {path.size(), path};\n            }\n            else\n              return {(std::numeric_limits<size_t>::max)(), {}};\n          };\n\n          std::stack<std::type_index>         parentStack;      // Holds the parent nodes to be processed\n          std::vector<std::type_index> dirtySet;                // Marks child nodes that have been changed\n          std::unordered_set<std::type_index> processedParents; // Marks parent nodes that have been processed\n\n          // Checks if a child has been marked dirty\n          auto isDirty = [&](std::type_index const & c)\n          {\n            auto const dirtySetSize = dirtySet.size();\n            for( size_t i = 0; i < dirtySetSize; ++i )\n              if( dirtySet[i] == c )\n                return true;\n\n            return false;\n          };\n\n          // Begin processing the base key and mark derived as dirty\n          parentStack.push( baseKey );\n          dirtySet.emplace_back( derivedKey );\n\n          while( !parentStack.empty() )\n          {\n            using Relations = std::unordered_multimap<std::type_index, std::pair<std::type_index, std::vector<PolymorphicCaster const *>>>;\n            Relations unregisteredRelations; // Defer insertions until after main loop to prevent iterator invalidation\n\n            const auto parent = parentStack.top();\n            parentStack.pop();\n\n            // Update paths to all children marked dirty\n            for( auto const & childPair : baseMap[parent] )\n            {\n              const auto child = childPair.first;\n              if( isDirty( child ) && baseMap.count( child ) )\n              {\n                auto parentChildPath = checkRelation( parent, child );\n\n                // Search all paths from the child to its own children (finalChild),\n                // looking for a shorter parth from parent to finalChild\n                for( auto const & finalChildPair : baseMap[child] )\n                {\n                  const auto finalChild = finalChildPair.first;\n\n                  auto parentFinalChildPath = checkRelation( parent, finalChild );\n                  auto childFinalChildPath  = checkRelation( child, finalChild );\n\n                  const size_t newLength = 1u + parentChildPath.first;\n\n                  if( newLength < parentFinalChildPath.first )\n                  {\n                    std::vector<PolymorphicCaster const *> path = parentChildPath.second;\n                    path.insert( path.end(), childFinalChildPath.second.begin(), childFinalChildPath.second.end() );\n\n                    // Check to see if we have a previous uncommitted path in unregisteredRelations\n                    // that is shorter. If so, ignore this path\n                    auto hintRange = unregisteredRelations.equal_range( parent );\n                    auto hint = hintRange.first;\n                    for( ; hint != hintRange.second; ++hint )\n                      if( hint->second.first == finalChild )\n                        break;\n\n                    const bool uncommittedExists = hint != unregisteredRelations.end();\n                    if( uncommittedExists && (hint->second.second.size() <= newLength) )\n                      continue;\n\n                    auto newPath = std::pair<std::type_index, std::vector<PolymorphicCaster const *>>{finalChild, std::move(path)};\n\n                    // Insert the new path if it doesn't exist, otherwise this will just lookup where to do the\n                    // replacement\n                    #ifdef CEREAL_OLDER_GCC\n                    auto old = unregisteredRelations.insert( hint, std::make_pair(parent, newPath) );\n                    #else // NOT CEREAL_OLDER_GCC\n                    auto old = unregisteredRelations.emplace_hint( hint, parent, newPath );\n                    #endif // NOT CEREAL_OLDER_GCC\n\n                    // If there was an uncommitted path, we need to perform a replacement\n                    if( uncommittedExists )\n                      old->second = newPath;\n                  }\n                } // end loop over child's children\n              } // end if dirty and child has children\n            } // end loop over children\n\n            // Insert chained relations\n            for( auto const & it : unregisteredRelations )\n            {\n              auto & derivedMap = baseMap.find( it.first )->second;\n              derivedMap[it.second.first] = it.second.second;\n              CEREAL_EMPLACE_MAP(reverseMap, it.second.first, it.first );\n            }\n\n            // Mark current parent as modified\n            dirtySet.emplace_back( parent );\n\n            // Insert all parents of the current parent node that haven't yet been processed\n            auto parentRange = reverseMap.equal_range( parent );\n            for( auto pIter = parentRange.first; pIter != parentRange.second; ++pIter )\n            {\n              const auto pParent = pIter->second;\n              if( !processedParents.count( pParent ) )\n              {\n                parentStack.push( pParent );\n                processedParents.insert( pParent );\n              }\n            }\n          } // end loop over parent stack\n        } // end chainable relations\n      } // end PolymorphicVirtualCaster()\n\n      #undef CEREAL_EMPLACE_MAP\n\n      //! Performs the proper downcast with the templated types\n      void const * downcast( void const * const ptr ) const override\n      {\n        return dynamic_cast<Derived const*>( static_cast<Base const*>( ptr ) );\n      }\n\n      //! Performs the proper upcast with the templated types\n      void * upcast( void * const ptr ) const override\n      {\n        return dynamic_cast<Base*>( static_cast<Derived*>( ptr ) );\n      }\n\n      //! Performs the proper upcast with the templated types (shared_ptr version)\n      std::shared_ptr<void> upcast( std::shared_ptr<void> const & ptr ) const override\n      {\n        return std::dynamic_pointer_cast<Base>( std::static_pointer_cast<Derived>( ptr ) );\n      }\n    };\n\n    //! Registers a polymorphic casting relation between a Base and Derived type\n    /*! Registering a relation allows cereal to properly cast between the two types\n        given runtime type information and void pointers.\n\n        Registration happens automatically via cereal::base_class and cereal::virtual_base_class\n        instantiations. For cases where neither is called, see the CEREAL_REGISTER_POLYMORPHIC_RELATION\n        macro */\n    template <class Base, class Derived>\n    struct RegisterPolymorphicCaster\n    {\n      static PolymorphicCaster const * bind( std::true_type /* is_polymorphic<Base> */)\n      {\n        return &StaticObject<PolymorphicVirtualCaster<Base, Derived>>::getInstance();\n      }\n\n      static PolymorphicCaster const * bind( std::false_type /* is_polymorphic<Base> */ )\n      { return nullptr; }\n\n      //! Performs registration (binding) between Base and Derived\n      /*! If the type is not polymorphic, nothing will happen */\n      static PolymorphicCaster const * bind()\n      { return bind( typename std::is_polymorphic<Base>::type() ); }\n    };\n  }\n\n  /* General polymorphism support */\n  namespace detail\n  {\n    //! Binds a compile time type with a user defined string\n    template <class T>\n    struct binding_name {};\n\n    //! A structure holding a map from type_indices to output serializer functions\n    /*! A static object of this map should be created for each registered archive\n        type, containing entries for every registered type that describe how to\n        properly cast the type to its real type in polymorphic scenarios for\n        shared_ptr, weak_ptr, and unique_ptr. */\n    template <class Archive>\n    struct OutputBindingMap\n    {\n      //! A serializer function\n      /*! Serializer functions return nothing and take an archive as\n          their first parameter (will be cast properly inside the function,\n          a pointer to actual data (contents of smart_ptr's get() function)\n          as their second parameter, and the type info of the owning smart_ptr\n          as their final parameter */\n      typedef std::function<void(void*, void const *, std::type_info const &)> Serializer;\n\n      //! Struct containing the serializer functions for all pointer types\n      struct Serializers\n      {\n        Serializer shared_ptr, //!< Serializer function for shared/weak pointers\n                   unique_ptr; //!< Serializer function for unique pointers\n      };\n\n      //! A map of serializers for pointers of all registered types\n      std::map<std::type_index, Serializers> map;\n    };\n\n    //! An empty noop deleter\n    template<class T> struct EmptyDeleter { void operator()(T *) const {} };\n\n    //! A structure holding a map from type name strings to input serializer functions\n    /*! A static object of this map should be created for each registered archive\n        type, containing entries for every registered type that describe how to\n        properly cast the type to its real type in polymorphic scenarios for\n        shared_ptr, weak_ptr, and unique_ptr. */\n    template <class Archive>\n    struct InputBindingMap\n    {\n      //! Shared ptr serializer function\n      /*! Serializer functions return nothing and take an archive as\n          their first parameter (will be cast properly inside the function,\n          a shared_ptr (or unique_ptr for the unique case) of any base\n          type, and the type id of said base type as the third parameter.\n          Internally it will properly be loaded and cast to the correct type. */\n      typedef std::function<void(void*, std::shared_ptr<void> &, std::type_info const &)> SharedSerializer;\n      //! Unique ptr serializer function\n      typedef std::function<void(void*, std::unique_ptr<void, EmptyDeleter<void>> &, std::type_info const &)> UniqueSerializer;\n\n      //! Struct containing the serializer functions for all pointer types\n      struct Serializers\n      {\n        SharedSerializer shared_ptr; //!< Serializer function for shared/weak pointers\n        UniqueSerializer unique_ptr; //!< Serializer function for unique pointers\n      };\n\n      //! A map of serializers for pointers of all registered types\n      std::map<std::string, Serializers> map;\n    };\n\n    // forward decls for archives from cereal.hpp\n    class InputArchiveBase;\n    class OutputArchiveBase;\n\n    //! Creates a binding (map entry) between an input archive type and a polymorphic type\n    /*! Bindings are made when types are registered, assuming that at least one\n        archive has already been registered.  When this struct is created,\n        it will insert (at run time) an entry into a map that properly handles\n        casting for serializing polymorphic objects */\n    template <class Archive, class T> struct InputBindingCreator\n    {\n      //! Initialize the binding\n      InputBindingCreator()\n      {\n        auto & map = StaticObject<InputBindingMap<Archive>>::getInstance().map;\n        auto lock = StaticObject<InputBindingMap<Archive>>::lock();\n        auto key = std::string(binding_name<T>::name());\n        auto lb = map.lower_bound(key);\n\n        if (lb != map.end() && lb->first == key)\n          return;\n\n        typename InputBindingMap<Archive>::Serializers serializers;\n\n        serializers.shared_ptr =\n          [](void * arptr, std::shared_ptr<void> & dptr, std::type_info const & baseInfo)\n          {\n            Archive & ar = *static_cast<Archive*>(arptr);\n            std::shared_ptr<T> ptr;\n\n            ar( CEREAL_NVP_(\"ptr_wrapper\", ::cereal::memory_detail::make_ptr_wrapper(ptr)) );\n\n            dptr = PolymorphicCasters::template upcast<T>( ptr, baseInfo );\n          };\n\n        serializers.unique_ptr =\n          [](void * arptr, std::unique_ptr<void, EmptyDeleter<void>> & dptr, std::type_info const & baseInfo)\n          {\n            Archive & ar = *static_cast<Archive*>(arptr);\n            std::unique_ptr<T> ptr;\n\n            ar( CEREAL_NVP_(\"ptr_wrapper\", ::cereal::memory_detail::make_ptr_wrapper(ptr)) );\n\n            dptr.reset( PolymorphicCasters::template upcast<T>( ptr.release(), baseInfo ));\n          };\n\n        map.insert( lb, { std::move(key), std::move(serializers) } );\n      }\n    };\n\n    //! Creates a binding (map entry) between an output archive type and a polymorphic type\n    /*! Bindings are made when types are registered, assuming that at least one\n        archive has already been registered.  When this struct is created,\n        it will insert (at run time) an entry into a map that properly handles\n        casting for serializing polymorphic objects */\n    template <class Archive, class T> struct OutputBindingCreator\n    {\n      //! Writes appropriate metadata to the archive for this polymorphic type\n      static void writeMetadata(Archive & ar)\n      {\n        // Register the polymorphic type name with the archive, and get the id\n        char const * name = binding_name<T>::name();\n        std::uint32_t id = ar.registerPolymorphicType(name);\n\n        // Serialize the id\n        ar( CEREAL_NVP_(\"polymorphic_id\", id) );\n\n        // If the msb of the id is 1, then the type name is new, and we should serialize it\n        if( id & detail::msb_32bit )\n        {\n          std::string namestring(name);\n          ar( CEREAL_NVP_(\"polymorphic_name\", namestring) );\n        }\n      }\n\n      //! Holds a properly typed shared_ptr to the polymorphic type\n      class PolymorphicSharedPointerWrapper\n      {\n        public:\n          /*! Wrap a raw polymorphic pointer in a shared_ptr to its true type\n\n              The wrapped pointer will not be responsible for ownership of the held pointer\n              so it will not attempt to destroy it; instead the refcount of the wrapped\n              pointer will be tied to a fake 'ownership pointer' that will do nothing\n              when it ultimately goes out of scope.\n\n              The main reason for doing this, other than not to destroy the true object\n              with our wrapper pointer, is to avoid meddling with the internal reference\n              count in a polymorphic type that inherits from std::enable_shared_from_this.\n\n              @param dptr A void pointer to the contents of the shared_ptr to serialize */\n          PolymorphicSharedPointerWrapper( T const * dptr ) : refCount(), wrappedPtr( refCount, dptr )\n          { }\n\n          //! Get the wrapped shared_ptr */\n          inline std::shared_ptr<T const> const & operator()() const { return wrappedPtr; }\n\n        private:\n          std::shared_ptr<void> refCount;      //!< The ownership pointer\n          std::shared_ptr<T const> wrappedPtr; //!< The wrapped pointer\n      };\n\n      //! Does the actual work of saving a polymorphic shared_ptr\n      /*! This function will properly create a shared_ptr from the void * that is passed in\n          before passing it to the archive for serialization.\n\n          In addition, this will also preserve the state of any internal enable_shared_from_this mechanisms\n\n          @param ar The archive to serialize to\n          @param dptr Pointer to the actual data held by the shared_ptr */\n      static inline void savePolymorphicSharedPtr( Archive & ar, T const * dptr, std::true_type /* has_shared_from_this */ )\n      {\n        ::cereal::memory_detail::EnableSharedStateHelper<T> state( const_cast<T *>(dptr) );\n        PolymorphicSharedPointerWrapper psptr( dptr );\n        ar( CEREAL_NVP_(\"ptr_wrapper\", memory_detail::make_ptr_wrapper( psptr() ) ) );\n      }\n\n      //! Does the actual work of saving a polymorphic shared_ptr\n      /*! This function will properly create a shared_ptr from the void * that is passed in\n          before passing it to the archive for serialization.\n\n          This version is for types that do not inherit from std::enable_shared_from_this.\n\n          @param ar The archive to serialize to\n          @param dptr Pointer to the actual data held by the shared_ptr */\n      static inline void savePolymorphicSharedPtr( Archive & ar, T const * dptr, std::false_type /* has_shared_from_this */ )\n      {\n        PolymorphicSharedPointerWrapper psptr( dptr );\n        ar( CEREAL_NVP_(\"ptr_wrapper\", memory_detail::make_ptr_wrapper( psptr() ) ) );\n      }\n\n      //! Initialize the binding\n      OutputBindingCreator()\n      {\n        auto & map = StaticObject<OutputBindingMap<Archive>>::getInstance().map;\n        auto key = std::type_index(typeid(T));\n        auto lb = map.lower_bound(key);\n\n        if (lb != map.end() && lb->first == key)\n          return;\n\n        typename OutputBindingMap<Archive>::Serializers serializers;\n\n        serializers.shared_ptr =\n          [&](void * arptr, void const * dptr, std::type_info const & baseInfo)\n          {\n            Archive & ar = *static_cast<Archive*>(arptr);\n            writeMetadata(ar);\n\n            auto ptr = PolymorphicCasters::template downcast<T>( dptr, baseInfo );\n\n            #ifdef _MSC_VER\n            savePolymorphicSharedPtr( ar, ptr, ::cereal::traits::has_shared_from_this<T>::type() ); // MSVC doesn't like typename here\n            #else // not _MSC_VER\n            savePolymorphicSharedPtr( ar, ptr, typename ::cereal::traits::has_shared_from_this<T>::type() );\n            #endif // _MSC_VER\n          };\n\n        serializers.unique_ptr =\n          [&](void * arptr, void const * dptr, std::type_info const & baseInfo)\n          {\n            Archive & ar = *static_cast<Archive*>(arptr);\n            writeMetadata(ar);\n\n            std::unique_ptr<T const, EmptyDeleter<T const>> const ptr( PolymorphicCasters::template downcast<T>( dptr, baseInfo ) );\n\n            ar( CEREAL_NVP_(\"ptr_wrapper\", memory_detail::make_ptr_wrapper(ptr)) );\n          };\n\n        map.insert( { std::move(key), std::move(serializers) } );\n      }\n    };\n\n    //! Used to help out argument dependent lookup for finding potential overloads\n    //! of instantiate_polymorphic_binding\n    struct adl_tag {};\n\n    //! Tag for init_binding, bind_to_archives and instantiate_polymorphic_binding. Due to the use of anonymous\n    //! namespace it becomes a different type in each translation unit.\n    namespace { struct polymorphic_binding_tag {}; }\n\n    //! Causes the static object bindings between an archive type and a serializable type T\n    template <class Archive, class T>\n    struct create_bindings\n    {\n      static const InputBindingCreator<Archive, T> &\n      load(std::true_type)\n      {\n        return cereal::detail::StaticObject<InputBindingCreator<Archive, T>>::getInstance();\n      }\n\n      static const OutputBindingCreator<Archive, T> &\n      save(std::true_type)\n      {\n        return cereal::detail::StaticObject<OutputBindingCreator<Archive, T>>::getInstance();\n      }\n\n      inline static void load(std::false_type) {}\n      inline static void save(std::false_type) {}\n    };\n\n    //! When specialized, causes the compiler to instantiate its parameter\n    template <void(*)()>\n    struct instantiate_function {};\n\n    /*! This struct is used as the return type of instantiate_polymorphic_binding\n        for specific Archive types.  When the compiler looks for overloads of\n        instantiate_polymorphic_binding, it will be forced to instantiate this\n        struct during overload resolution, even though it will not be part of a valid\n        overload */\n    template <class Archive, class T>\n    struct polymorphic_serialization_support\n    {\n      #if defined(_MSC_VER) && !defined(__INTEL_COMPILER)\n      //! Creates the appropriate bindings depending on whether the archive supports\n      //! saving or loading\n      virtual CEREAL_DLL_EXPORT void instantiate() CEREAL_USED;\n      #else // NOT _MSC_VER\n      //! Creates the appropriate bindings depending on whether the archive supports\n      //! saving or loading\n      static CEREAL_DLL_EXPORT void instantiate() CEREAL_USED;\n      //! This typedef causes the compiler to instantiate this static function\n      typedef instantiate_function<instantiate> unused;\n      #endif // _MSC_VER\n    };\n\n    // instantiate implementation\n    template <class Archive, class T>\n    CEREAL_DLL_EXPORT void polymorphic_serialization_support<Archive,T>::instantiate()\n    {\n      create_bindings<Archive,T>::save( std::integral_constant<bool,\n                                          std::is_base_of<detail::OutputArchiveBase, Archive>::value &&\n                                          traits::is_output_serializable<T, Archive>::value>{} );\n\n      create_bindings<Archive,T>::load( std::integral_constant<bool,\n                                          std::is_base_of<detail::InputArchiveBase, Archive>::value &&\n                                          traits::is_input_serializable<T, Archive>::value>{} );\n    }\n\n    //! Begins the binding process of a type to all registered archives\n    /*! Archives need to be registered prior to this struct being instantiated via\n        the CEREAL_REGISTER_ARCHIVE macro.  Overload resolution will then force\n        several static objects to be made that allow us to bind together all\n        registered archive types with the parameter type T. */\n    template <class T, class Tag = polymorphic_binding_tag>\n    struct bind_to_archives\n    {\n      //! Binding for non abstract types\n      void bind(std::false_type) const\n      {\n        instantiate_polymorphic_binding(static_cast<T*>(nullptr), 0, Tag{}, adl_tag{});\n      }\n\n      //! Binding for abstract types\n      void bind(std::true_type) const\n      { }\n\n      //! Binds the type T to all registered archives\n      /*! If T is abstract, we will not serialize it and thus\n          do not need to make a binding */\n      bind_to_archives const & bind() const\n      {\n        static_assert( std::is_polymorphic<T>::value,\n                       \"Attempting to register non polymorphic type\" );\n        bind( std::is_abstract<T>() );\n        return *this;\n      }\n    };\n\n    //! Used to hide the static object used to bind T to registered archives\n    template <class T, class Tag = polymorphic_binding_tag>\n    struct init_binding;\n\n    //! Base case overload for instantiation\n    /*! This will end up always being the best overload due to the second\n        parameter always being passed as an int.  All other overloads will\n        accept pointers to archive types and have lower precedence than int.\n\n        Since the compiler needs to check all possible overloads, the\n        other overloads created via CEREAL_REGISTER_ARCHIVE, which will have\n        lower precedence due to requring a conversion from int to (Archive*),\n        will cause their return types to be instantiated through the static object\n        mechanisms even though they are never called.\n\n        See the documentation for the other functions to try and understand this */\n    template <class T, typename BindingTag>\n    void instantiate_polymorphic_binding( T*, int, BindingTag, adl_tag ) {}\n  } // namespace detail\n} // namespace cereal\n\n#endif // CEREAL_DETAILS_POLYMORPHIC_IMPL_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/details/polymorphic_impl_fwd.hpp",
    "content": "/*! \\file polymorphic_impl_fwd.hpp\n    \\brief Internal polymorphism support forward declarations\n    \\ingroup Internal */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/* This code is heavily inspired by the boost serialization implementation by the following authors\n\n   (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n   Use, modification and distribution is subject to the Boost Software\n   License, Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt)\n\n    See http://www.boost.org for updates, documentation, and revision history.\n\n   (C) Copyright 2006 David Abrahams - http://www.boost.org.\n\n   See /boost/serialization/export.hpp and /boost/archive/detail/register_archive.hpp for their\n   implementation.\n*/\n\n#ifndef CEREAL_DETAILS_POLYMORPHIC_IMPL_FWD_HPP_\n#define CEREAL_DETAILS_POLYMORPHIC_IMPL_FWD_HPP_\n\nnamespace cereal\n{\n  namespace detail\n  {\n    //! Forward declaration, see polymorphic_impl.hpp for more information\n    template <class Base, class Derived>\n    struct RegisterPolymorphicCaster;\n\n    //! Forward declaration, see polymorphic_impl.hpp for more information\n    struct PolymorphicCasters;\n\n    //! Forward declaration, see polymorphic_impl.hpp for more information\n    template <class Base, class Derived>\n    struct PolymorphicRelation;\n  } // namespace detail\n} // namespace cereal\n\n#endif // CEREAL_DETAILS_POLYMORPHIC_IMPL_FWD_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/details/static_object.hpp",
    "content": "/*! \\file static_object.hpp\n    \\brief Internal polymorphism static object support\n    \\ingroup Internal */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_DETAILS_STATIC_OBJECT_HPP_\n#define CEREAL_DETAILS_STATIC_OBJECT_HPP_\n\n#include \"cereal/macros.hpp\"\n\n#if CEREAL_THREAD_SAFE\n#include <mutex>\n#endif\n\n//! Prevent link optimization from removing non-referenced static objects\n/*! Especially for polymorphic support, we create static objects which\n    may not ever be explicitly referenced.  Most linkers will detect this\n    and remove the code causing various unpleasant runtime errors.  These\n    macros, adopted from Boost (see force_include.hpp) prevent this\n    (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n    Use, modification and distribution is subject to the Boost Software\n    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n    http://www.boost.org/LICENSE_1_0.txt) */\n\n#ifdef _MSC_VER\n#   define CEREAL_DLL_EXPORT __declspec(dllexport)\n#   define CEREAL_USED\n#else // clang or gcc\n#   define CEREAL_DLL_EXPORT __attribute__ ((visibility(\"default\")))\n#   define CEREAL_USED __attribute__ ((__used__))\n#endif\n\nnamespace cereal\n{\n  namespace detail\n  {\n    //! A static, pre-execution object\n    /*! This class will create a single copy (singleton) of some\n        type and ensures that merely referencing this type will\n        cause it to be instantiated and initialized pre-execution.\n        For example, this is used heavily in the polymorphic pointer\n        serialization mechanisms to bind various archive types with\n        different polymorphic classes */\n    template <class T>\n    class CEREAL_DLL_EXPORT StaticObject\n    {\n      private:\n\n        static T & create()\n        {\n          static T t;\n          //! Forces instantiation at pre-execution time\n          (void)instance;\n          return t;\n        }\n\n        StaticObject( StaticObject const & /*other*/ ) {}\n\n      public:\n        static T & getInstance()\n        {\n          return create();\n        }\n\n        //! A class that acts like std::lock_guard\n        class LockGuard\n        {\n          #if CEREAL_THREAD_SAFE\n          public:\n            LockGuard(std::mutex & m) : lock(m) {}\n          private:\n            std::unique_lock<std::mutex> lock;\n          #else\n          public:\n\t          LockGuard(LockGuard const &) = default; // prevents implicit copy ctor warning\n            ~LockGuard() CEREAL_NOEXCEPT {} // prevents variable not used\n          #endif\n        };\n\n        //! Attempts to lock this static object for the current scope\n        /*! @note This function is a no-op if cereal is not compiled with\n                  thread safety enabled (CEREAL_THREAD_SAFE = 1).\n\n            This function returns an object that holds a lock for\n            this StaticObject that will release its lock upon destruction. This\n            call will block until the lock is available. */\n        static LockGuard lock()\n        {\n          #if CEREAL_THREAD_SAFE\n          static std::mutex instanceMutex;\n          return LockGuard{instanceMutex};\n          #else\n          return LockGuard{};\n          #endif\n        }\n\n      private:\n        static T & instance;\n    };\n\n    template <class T> T & StaticObject<T>::instance = StaticObject<T>::create();\n  } // namespace detail\n} // namespace cereal\n\n#endif // CEREAL_DETAILS_STATIC_OBJECT_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/details/traits.hpp",
    "content": "/*! \\file traits.hpp\n    \\brief Internal type trait support\n    \\ingroup Internal */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_DETAILS_TRAITS_HPP_\n#define CEREAL_DETAILS_TRAITS_HPP_\n\n#ifndef __clang__\n#if (__GNUC__ == 4 && __GNUC_MINOR__ <= 7)\n#define CEREAL_OLDER_GCC\n#endif // gcc 4.7 or earlier\n#endif // __clang__\n\n#include <type_traits>\n#include <typeindex>\n\n#include \"cereal/macros.hpp\"\n#include \"cereal/access.hpp\"\n\nnamespace cereal\n{\n  namespace traits\n  {\n    using yes = std::true_type;\n    using no  = std::false_type;\n\n    namespace detail\n    {\n      // ######################################################################\n      //! Used to delay a static_assert until template instantiation\n      template <class T>\n      struct delay_static_assert : std::false_type {};\n\n      // ######################################################################\n      // SFINAE Helpers\n      #ifdef CEREAL_OLDER_GCC // when VS supports better SFINAE, we can use this as the default\n      template<typename> struct Void { typedef void type; };\n      #endif // CEREAL_OLDER_GCC\n\n      //! Return type for SFINAE Enablers\n      enum class sfinae {};\n\n      // ######################################################################\n      // Helper functionality for boolean integral constants and Enable/DisableIf\n      template <bool H, bool ... T> struct meta_bool_and : std::integral_constant<bool, H && meta_bool_and<T...>::value> {};\n      template <bool B> struct meta_bool_and<B> : std::integral_constant<bool, B> {};\n\n      template <bool H, bool ... T> struct meta_bool_or : std::integral_constant<bool, H || meta_bool_or<T...>::value> {};\n      template <bool B> struct meta_bool_or<B> : std::integral_constant<bool, B> {};\n\n      // workaround needed due to bug in MSVC 2013, see\n      // http://connect.microsoft.com/VisualStudio/feedback/details/800231/c-11-alias-template-issue\n      template <bool ... Conditions>\n      struct EnableIfHelper : std::enable_if<meta_bool_and<Conditions...>::value, sfinae> {};\n\n      template <bool ... Conditions>\n      struct DisableIfHelper : std::enable_if<!meta_bool_or<Conditions...>::value, sfinae> {};\n    } // namespace detail\n\n    //! Used as the default value for EnableIf and DisableIf template parameters\n    /*! @relates EnableIf\n        @relates DisableIf */\n    static const detail::sfinae sfinae = {};\n\n    // ######################################################################\n    //! Provides a way to enable a function if conditions are met\n    /*! This is intended to be used in a near identical fashion to std::enable_if\n        while being significantly easier to read at the cost of not allowing for as\n        complicated of a condition.\n\n        This will compile (allow the function) if every condition evaluates to true.\n        at compile time.  This should be used with SFINAE to ensure that at least\n        one other candidate function works when one fails due to an EnableIf.\n\n        This should be used as the las template parameter to a function as\n        an unnamed parameter with a default value of cereal::traits::sfinae:\n\n        @code{cpp}\n        // using by making the last template argument variadic\n        template <class T, EnableIf<std::is_same<T, bool>::value> = sfinae>\n        void func(T t );\n        @endcode\n\n        Note that this performs a logical AND of all conditions, so you will need\n        to construct more complicated requirements with this fact in mind.\n\n        @relates DisableIf\n        @relates sfinae\n        @tparam Conditions The conditions which will be logically ANDed to enable the function. */\n    template <bool ... Conditions>\n    using EnableIf = typename detail::EnableIfHelper<Conditions...>::type;\n\n    // ######################################################################\n    //! Provides a way to disable a function if conditions are met\n    /*! This is intended to be used in a near identical fashion to std::enable_if\n        while being significantly easier to read at the cost of not allowing for as\n        complicated of a condition.\n\n        This will compile (allow the function) if every condition evaluates to false.\n        This should be used with SFINAE to ensure that at least one other candidate\n        function works when one fails due to a DisableIf.\n\n        This should be used as the las template parameter to a function as\n        an unnamed parameter with a default value of cereal::traits::sfinae:\n\n        @code{cpp}\n        // using by making the last template argument variadic\n        template <class T, DisableIf<std::is_same<T, bool>::value> = sfinae>\n        void func(T t );\n        @endcode\n\n        This is often used in conjunction with EnableIf to form an enable/disable pair of\n        overloads.\n\n        Note that this performs a logical AND of all conditions, so you will need\n        to construct more complicated requirements with this fact in mind.  If all conditions\n        hold, the function will be disabled.\n\n        @relates EnableIf\n        @relates sfinae\n        @tparam Conditions The conditions which will be logically ANDed to disable the function. */\n    template <bool ... Conditions>\n    using DisableIf = typename detail::DisableIfHelper<Conditions...>::type;\n\n    // ######################################################################\n    namespace detail\n    {\n      template <class InputArchive>\n      struct get_output_from_input : no\n      {\n        static_assert( detail::delay_static_assert<InputArchive>::value,\n            \"Could not find an associated output archive for input archive.\" );\n      };\n\n      template <class OutputArchive>\n      struct get_input_from_output : no\n      {\n        static_assert( detail::delay_static_assert<OutputArchive>::value,\n            \"Could not find an associated input archive for output archive.\" );\n      };\n    }\n\n    //! Sets up traits that relate an input archive to an output archive\n    #define CEREAL_SETUP_ARCHIVE_TRAITS(InputArchive, OutputArchive)  \\\n    namespace cereal { namespace traits { namespace detail {          \\\n      template <> struct get_output_from_input<InputArchive>          \\\n      { using type = OutputArchive; };                                \\\n      template <> struct get_input_from_output<OutputArchive>         \\\n      { using type = InputArchive; }; } } } /* end namespaces */\n\n    // ######################################################################\n    //! Used to convert a MAKE_HAS_XXX macro into a versioned variant\n    #define CEREAL_MAKE_VERSIONED_TEST ,0\n\n    // ######################################################################\n    //! Creates a test for whether a non const member function exists\n    /*! This creates a class derived from std::integral_constant that will be true if\n        the type has the proper member function for the given archive.\n\n        @param name The name of the function to test for (e.g. serialize, load, save)\n        @param test_name The name to give the test for the function being tested for (e.g. serialize, versioned_serialize)\n        @param versioned Either blank or the macro CEREAL_MAKE_VERSIONED_TEST */\n    #ifdef CEREAL_OLDER_GCC\n    #define CEREAL_MAKE_HAS_MEMBER_TEST(name, test_name, versioned)                                                                         \\\n    template <class T, class A, class SFINAE = void>                                                                                        \\\n    struct has_member_##test_name : no {};                                                                                                  \\\n    template <class T, class A>                                                                                                             \\\n    struct has_member_##test_name<T, A,                                                                                                     \\\n      typename detail::Void< decltype( cereal::access::member_##name( std::declval<A&>(), std::declval<T&>() versioned ) ) >::type> : yes {}\n    #else // NOT CEREAL_OLDER_GCC\n    #define CEREAL_MAKE_HAS_MEMBER_TEST(name, test_name, versioned)                                                                     \\\n    namespace detail                                                                                                                    \\\n    {                                                                                                                                   \\\n      template <class T, class A>                                                                                                       \\\n      struct has_member_##name##_##versioned##_impl                                                                                     \\\n      {                                                                                                                                 \\\n        template <class TT, class AA>                                                                                                   \\\n        static auto test(int) -> decltype( cereal::access::member_##name( std::declval<AA&>(), std::declval<TT&>() versioned ), yes()); \\\n        template <class, class>                                                                                                         \\\n        static no test(...);                                                                                                            \\\n        static const bool value = std::is_same<decltype(test<T, A>(0)), yes>::value;                                                    \\\n      };                                                                                                                                \\\n    } /* end namespace detail */                                                                                                        \\\n    template <class T, class A>                                                                                                         \\\n    struct has_member_##test_name : std::integral_constant<bool, detail::has_member_##name##_##versioned##_impl<T, A>::value> {}\n    #endif // NOT CEREAL_OLDER_GCC\n\n    // ######################################################################\n    //! Creates a test for whether a non const non-member function exists\n    /*! This creates a class derived from std::integral_constant that will be true if\n        the type has the proper non-member function for the given archive. */\n    #define CEREAL_MAKE_HAS_NON_MEMBER_TEST(test_name, func, versioned)                                                         \\\n    namespace detail                                                                                                            \\\n    {                                                                                                                           \\\n      template <class T, class A>                                                                                               \\\n      struct has_non_member_##test_name##_impl                                                                                  \\\n      {                                                                                                                         \\\n        template <class TT, class AA>                                                                                           \\\n        static auto test(int) -> decltype( func( std::declval<AA&>(), std::declval<TT&>() versioned ), yes());                  \\\n        template <class, class>                                                                                                 \\\n        static no test( ... );                                                                                                  \\\n        static const bool value = std::is_same<decltype( test<T, A>( 0 ) ), yes>::value;                                        \\\n      };                                                                                                                        \\\n    } /* end namespace detail */                                                                                                \\\n    template <class T, class A>                                                                                                 \\\n    struct has_non_member_##test_name : std::integral_constant<bool, detail::has_non_member_##test_name##_impl<T, A>::value> {}\n\n    // ######################################################################\n    // Member Serialize\n    CEREAL_MAKE_HAS_MEMBER_TEST(serialize, serialize,);\n\n    // ######################################################################\n    // Member Serialize (versioned)\n    CEREAL_MAKE_HAS_MEMBER_TEST(serialize, versioned_serialize, CEREAL_MAKE_VERSIONED_TEST);\n\n    // ######################################################################\n    // Non Member Serialize\n    CEREAL_MAKE_HAS_NON_MEMBER_TEST(serialize, CEREAL_SERIALIZE_FUNCTION_NAME,);\n\n    // ######################################################################\n    // Non Member Serialize (versioned)\n    CEREAL_MAKE_HAS_NON_MEMBER_TEST(versioned_serialize, CEREAL_SERIALIZE_FUNCTION_NAME, CEREAL_MAKE_VERSIONED_TEST);\n\n    // ######################################################################\n    // Member Load\n    CEREAL_MAKE_HAS_MEMBER_TEST(load, load,);\n\n    // ######################################################################\n    // Member Load (versioned)\n    CEREAL_MAKE_HAS_MEMBER_TEST(load, versioned_load, CEREAL_MAKE_VERSIONED_TEST);\n\n    // ######################################################################\n    // Non Member Load\n    CEREAL_MAKE_HAS_NON_MEMBER_TEST(load, CEREAL_LOAD_FUNCTION_NAME,);\n\n    // ######################################################################\n    // Non Member Load (versioned)\n    CEREAL_MAKE_HAS_NON_MEMBER_TEST(versioned_load, CEREAL_LOAD_FUNCTION_NAME, CEREAL_MAKE_VERSIONED_TEST);\n\n    // ######################################################################\n    #undef CEREAL_MAKE_HAS_NON_MEMBER_TEST\n    #undef CEREAL_MAKE_HAS_MEMBER_TEST\n\n    // ######################################################################\n    //! Creates a test for whether a member save function exists\n    /*! This creates a class derived from std::integral_constant that will be true if\n        the type has the proper member function for the given archive.\n\n        @param test_name The name to give the test (e.g. save or versioned_save)\n        @param versioned Either blank or the macro CEREAL_MAKE_VERSIONED_TEST */\n    #ifdef CEREAL_OLDER_GCC\n    #define CEREAL_MAKE_HAS_MEMBER_SAVE_IMPL(test_name, versioned)                                                                  \\\n    namespace detail                                                                                                                \\\n    {                                                                                                                               \\\n    template <class T, class A>                                                                                                     \\\n    struct has_member_##test_name##_impl                                                                                            \\\n      {                                                                                                                             \\\n        template <class TT, class AA, class SFINAE = void> struct test : no {};                                                     \\\n        template <class TT, class AA>                                                                                               \\\n        struct test<TT, AA,                                                                                                         \\\n          typename detail::Void< decltype( cereal::access::member_save( std::declval<AA&>(),                                        \\\n                                                                        std::declval<TT const &>() versioned ) ) >::type> : yes {}; \\\n        static const bool value = test<T, A>();                                                                                     \\\n                                                                                                                                    \\\n        template <class TT, class AA, class SFINAE = void> struct test2 : no {};                                                    \\\n        template <class TT, class AA>                                                                                               \\\n        struct test2<TT, AA,                                                                                                        \\\n          typename detail::Void< decltype( cereal::access::member_save_non_const(                                                   \\\n                                            std::declval<AA&>(),                                                                    \\\n                                            std::declval<typename std::remove_const<TT>::type&>() versioned ) ) >::type> : yes {};  \\\n        static const bool not_const_type = test2<T, A>();                                                                           \\\n      };                                                                                                                            \\\n    } /* end namespace detail */\n    #else /* NOT CEREAL_OLDER_GCC =================================== */\n    #define CEREAL_MAKE_HAS_MEMBER_SAVE_IMPL(test_name, versioned)                                                                  \\\n    namespace detail                                                                                                                \\\n    {                                                                                                                               \\\n    template <class T, class A>                                                                                                     \\\n    struct has_member_##test_name##_impl                                                                                            \\\n      {                                                                                                                             \\\n        template <class TT, class AA>                                                                                               \\\n        static auto test(int) -> decltype( cereal::access::member_save( std::declval<AA&>(),                                        \\\n                                                                        std::declval<TT const &>() versioned ), yes());             \\\n        template <class, class> static no test(...);                                                                                \\\n        static const bool value = std::is_same<decltype(test<T, A>(0)), yes>::value;                                                \\\n                                                                                                                                    \\\n        template <class TT, class AA>                                                                                               \\\n        static auto test2(int) -> decltype( cereal::access::member_save_non_const(                                                  \\\n                                              std::declval<AA &>(),                                                                 \\\n                                              std::declval<typename std::remove_const<TT>::type&>() versioned ), yes());            \\\n        template <class, class> static no test2(...);                                                                               \\\n        static const bool not_const_type = std::is_same<decltype(test2<T, A>(0)), yes>::value;                                      \\\n      };                                                                                                                            \\\n    } /* end namespace detail */\n    #endif /* NOT CEREAL_OLDER_GCC */\n\n    // ######################################################################\n    // Member Save\n    CEREAL_MAKE_HAS_MEMBER_SAVE_IMPL(save, )\n\n    template <class T, class A>\n    struct has_member_save : std::integral_constant<bool, detail::has_member_save_impl<T, A>::value>\n    {\n      typedef typename detail::has_member_save_impl<T, A> check;\n      static_assert( check::value || !check::not_const_type,\n        \"cereal detected a non-const save. \\n \"\n        \"save member functions must always be const\" );\n    };\n\n    // ######################################################################\n    // Member Save (versioned)\n    CEREAL_MAKE_HAS_MEMBER_SAVE_IMPL(versioned_save, CEREAL_MAKE_VERSIONED_TEST)\n\n    template <class T, class A>\n    struct has_member_versioned_save : std::integral_constant<bool, detail::has_member_versioned_save_impl<T, A>::value>\n    {\n      typedef typename detail::has_member_versioned_save_impl<T, A> check;\n      static_assert( check::value || !check::not_const_type,\n        \"cereal detected a versioned non-const save. \\n \"\n        \"save member functions must always be const\" );\n    };\n\n    // ######################################################################\n    #undef CEREAL_MAKE_HAS_MEMBER_SAVE_IMPL\n\n    // ######################################################################\n    //! Creates a test for whether a non-member save function exists\n    /*! This creates a class derived from std::integral_constant that will be true if\n        the type has the proper non-member function for the given archive.\n\n        @param test_name The name to give the test (e.g. save or versioned_save)\n        @param versioned Either blank or the macro CEREAL_MAKE_VERSIONED_TEST */\n    #define CEREAL_MAKE_HAS_NON_MEMBER_SAVE_TEST(test_name, versioned)                                                       \\\n    namespace detail                                                                                                         \\\n    {                                                                                                                        \\\n      template <class T, class A>                                                                                            \\\n      struct has_non_member_##test_name##_impl                                                                               \\\n      {                                                                                                                      \\\n        template <class TT, class AA>                                                                                        \\\n        static auto test(int) -> decltype( CEREAL_SAVE_FUNCTION_NAME(                                                        \\\n                                              std::declval<AA&>(),                                                           \\\n                                              std::declval<TT const &>() versioned ), yes());                                \\\n        template <class, class> static no test(...);                                                                         \\\n        static const bool value = std::is_same<decltype(test<T, A>(0)), yes>::value;                                         \\\n                                                                                                                             \\\n        template <class TT, class AA>                                                                                        \\\n        static auto test2(int) -> decltype( CEREAL_SAVE_FUNCTION_NAME(                                                       \\\n                                              std::declval<AA &>(),                                                          \\\n                                              std::declval<typename std::remove_const<TT>::type&>() versioned ), yes());     \\\n        template <class, class> static no test2(...);                                                                        \\\n        static const bool not_const_type = std::is_same<decltype(test2<T, A>(0)), yes>::value;                               \\\n      };                                                                                                                     \\\n    } /* end namespace detail */                                                                                             \\\n                                                                                                                             \\\n    template <class T, class A>                                                                                              \\\n    struct has_non_member_##test_name : std::integral_constant<bool, detail::has_non_member_##test_name##_impl<T, A>::value> \\\n    {                                                                                                                        \\\n      using check = typename detail::has_non_member_##test_name##_impl<T, A>;                                                \\\n      static_assert( check::value || !check::not_const_type,                                                                 \\\n        \"cereal detected a non-const type parameter in non-member \" #test_name \". \\n \"                                       \\\n        #test_name \" non-member functions must always pass their types as const\" );                                          \\\n    };\n\n    // ######################################################################\n    // Non Member Save\n    CEREAL_MAKE_HAS_NON_MEMBER_SAVE_TEST(save, )\n\n    // ######################################################################\n    // Non Member Save (versioned)\n    CEREAL_MAKE_HAS_NON_MEMBER_SAVE_TEST(versioned_save, CEREAL_MAKE_VERSIONED_TEST)\n\n    // ######################################################################\n    #undef CEREAL_MAKE_HAS_NON_MEMBER_SAVE_TEST\n\n    // ######################################################################\n    // Minimal Utilities\n    namespace detail\n    {\n      // Determines if the provided type is an std::string\n      template <class> struct is_string : std::false_type {};\n\n      template <class CharT, class Traits, class Alloc>\n      struct is_string<std::basic_string<CharT, Traits, Alloc>> : std::true_type {};\n    }\n\n    // Determines if the type is valid for use with a minimal serialize function\n    template <class T>\n    struct is_minimal_type : std::integral_constant<bool,\n      detail::is_string<T>::value || std::is_arithmetic<T>::value> {};\n\n    // ######################################################################\n    //! Creates implementation details for whether a member save_minimal function exists\n    /*! This creates a class derived from std::integral_constant that will be true if\n        the type has the proper member function for the given archive.\n\n        @param test_name The name to give the test (e.g. save_minimal or versioned_save_minimal)\n        @param versioned Either blank or the macro CEREAL_MAKE_VERSIONED_TEST */\n    #ifdef CEREAL_OLDER_GCC\n    #define CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_IMPL(test_name, versioned)                                                                        \\\n    namespace detail                                                                                                                              \\\n    {                                                                                                                                             \\\n      template <class T, class A>                                                                                                                 \\\n      struct has_member_##test_name##_impl                                                                                                        \\\n      {                                                                                                                                           \\\n        template <class TT, class AA, class SFINAE = void> struct test : no {};                                                                   \\\n        template <class TT, class AA>                                                                                                             \\\n        struct test<TT, AA, typename detail::Void< decltype(                                                                                      \\\n            cereal::access::member_save_minimal( std::declval<AA const &>(),                                                                      \\\n                                                 std::declval<TT const &>() versioned ) ) >::type> : yes {};                                      \\\n                                                                                                                                                  \\\n        static const bool value = test<T, A>();                                                                                                   \\\n                                                                                                                                                  \\\n        template <class TT, class AA, class SFINAE = void> struct test2 : no {};                                                                  \\\n        template <class TT, class AA>                                                                                                             \\\n        struct test2<TT, AA, typename detail::Void< decltype(                                                                                     \\\n            cereal::access::member_save_minimal_non_const( std::declval<AA const &>(),                                                            \\\n                                                           std::declval<typename std::remove_const<TT>::type&>() versioned ) ) >::type> : yes {}; \\\n        static const bool not_const_type = test2<T, A>();                                                                                         \\\n                                                                                                                                                  \\\n        static const bool valid = value || !not_const_type;                                                                                       \\\n      };                                                                                                                                          \\\n    } /* end namespace detail */\n    #else /* NOT CEREAL_OLDER_GCC =================================== */\n    #define CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_IMPL(test_name, versioned)                     \\\n    namespace detail                                                                           \\\n    {                                                                                          \\\n      template <class T, class A>                                                              \\\n      struct has_member_##test_name##_impl                                                     \\\n      {                                                                                        \\\n        template <class TT, class AA>                                                          \\\n        static auto test(int) -> decltype( cereal::access::member_save_minimal(                \\\n              std::declval<AA const &>(),                                                      \\\n              std::declval<TT const &>() versioned ), yes());                                  \\\n        template <class, class> static no test(...);                                           \\\n        static const bool value = std::is_same<decltype(test<T, A>(0)), yes>::value;           \\\n                                                                                               \\\n        template <class TT, class AA>                                                          \\\n        static auto test2(int) -> decltype( cereal::access::member_save_minimal_non_const(     \\\n              std::declval<AA const &>(),                                                      \\\n              std::declval<typename std::remove_const<TT>::type&>() versioned ), yes());       \\\n        template <class, class> static no test2(...);                                          \\\n        static const bool not_const_type = std::is_same<decltype(test2<T, A>(0)), yes>::value; \\\n                                                                                               \\\n        static const bool valid = value || !not_const_type;                                    \\\n      };                                                                                       \\\n    } /* end namespace detail */\n    #endif // NOT CEREAL_OLDER_GCC\n\n    // ######################################################################\n    //! Creates helpers for minimal save functions\n    /*! The get_member_*_type structs allow access to the return type of a save_minimal,\n        assuming that the function actually exists.  If the function does not\n        exist, the type will be void.\n\n        @param test_name The name to give the test (e.g. save_minimal or versioned_save_minimal)\n        @param versioned Either blank or the macro CEREAL_MAKE_VERSIONED_TEST */\n    #define CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_HELPERS_IMPL(test_name, versioned)                           \\\n    namespace detail                                                                                         \\\n    {                                                                                                        \\\n      template <class T, class A, bool Valid>                                                                \\\n      struct get_member_##test_name##_type { using type = void; };                                           \\\n                                                                                                             \\\n      template <class T, class A>                                                                            \\\n      struct get_member_##test_name##_type<T, A, true>                                                       \\\n      {                                                                                                      \\\n        using type = decltype( cereal::access::member_save_minimal( std::declval<A const &>(),               \\\n                                                                    std::declval<T const &>() versioned ) ); \\\n      };                                                                                                     \\\n    } /* end namespace detail */\n\n    // ######################################################################\n    //! Creates a test for whether a member save_minimal function exists\n    /*! This creates a class derived from std::integral_constant that will be true if\n        the type has the proper member function for the given archive.\n\n        @param test_name The name to give the test (e.g. save_minimal or versioned_save_minimal) */\n    #define CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_TEST(test_name)                                                      \\\n    template <class T, class A>                                                                                      \\\n    struct has_member_##test_name : std::integral_constant<bool, detail::has_member_##test_name##_impl<T, A>::value> \\\n    {                                                                                                                \\\n      using check = typename detail::has_member_##test_name##_impl<T, A>;                                            \\\n      static_assert( check::valid,                                                                                   \\\n        \"cereal detected a non-const member \" #test_name \". \\n \"                                                     \\\n        #test_name \" member functions must always be const\" );                                                       \\\n                                                                                                                     \\\n      using type = typename detail::get_member_##test_name##_type<T, A, check::value>::type;                         \\\n      static_assert( (check::value && is_minimal_type<type>::value) || !check::value,                                \\\n        \"cereal detected a member \" #test_name \" with an invalid return type. \\n \"                                   \\\n        \"return type must be arithmetic or string\" );                                                                \\\n    };\n\n    // ######################################################################\n    // Member Save Minimal\n    CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_IMPL(save_minimal, )\n    CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_HELPERS_IMPL(save_minimal, )\n    CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_TEST(save_minimal)\n\n    // ######################################################################\n    // Member Save Minimal (versioned)\n    CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_IMPL(versioned_save_minimal, CEREAL_MAKE_VERSIONED_TEST)\n    CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_HELPERS_IMPL(versioned_save_minimal, CEREAL_MAKE_VERSIONED_TEST)\n    CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_TEST(versioned_save_minimal)\n\n    // ######################################################################\n    #undef CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_IMPL\n    #undef CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_HELPERS_IMPL\n    #undef CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_TEST\n\n    // ######################################################################\n    //! Creates a test for whether a non-member save_minimal function exists\n    /*! This creates a class derived from std::integral_constant that will be true if\n        the type has the proper member function for the given archive.\n\n        @param test_name The name to give the test (e.g. save_minimal or versioned_save_minimal)\n        @param versioned Either blank or the macro CEREAL_MAKE_VERSIONED_TEST */\n    #define CEREAL_MAKE_HAS_NON_MEMBER_SAVE_MINIMAL_TEST(test_name, versioned)                                               \\\n    namespace detail                                                                                                         \\\n    {                                                                                                                        \\\n      template <class T, class A>                                                                                            \\\n      struct has_non_member_##test_name##_impl                                                                               \\\n      {                                                                                                                      \\\n        template <class TT, class AA>                                                                                        \\\n        static auto test(int) -> decltype( CEREAL_SAVE_MINIMAL_FUNCTION_NAME(                                                \\\n              std::declval<AA const &>(),                                                                                    \\\n              std::declval<TT const &>() versioned ), yes());                                                                \\\n        template <class, class> static no test(...);                                                                         \\\n        static const bool value = std::is_same<decltype(test<T, A>(0)), yes>::value;                                         \\\n                                                                                                                             \\\n        template <class TT, class AA>                                                                                        \\\n        static auto test2(int) -> decltype( CEREAL_SAVE_MINIMAL_FUNCTION_NAME(                                               \\\n              std::declval<AA const &>(),                                                                                    \\\n              std::declval<typename std::remove_const<TT>::type&>() versioned ), yes());                                     \\\n        template <class, class> static no test2(...);                                                                        \\\n        static const bool not_const_type = std::is_same<decltype(test2<T, A>(0)), yes>::value;                               \\\n                                                                                                                             \\\n        static const bool valid = value || !not_const_type;                                                                  \\\n      };                                                                                                                     \\\n                                                                                                                             \\\n      template <class T, class A, bool Valid>                                                                                \\\n      struct get_non_member_##test_name##_type { using type = void; };                                                       \\\n                                                                                                                             \\\n      template <class T, class A>                                                                                            \\\n      struct get_non_member_##test_name##_type <T, A, true>                                                                  \\\n      {                                                                                                                      \\\n        using type = decltype( CEREAL_SAVE_MINIMAL_FUNCTION_NAME( std::declval<A const &>(),                                 \\\n                                                                  std::declval<T const &>() versioned ) );                   \\\n      };                                                                                                                     \\\n    } /* end namespace detail */                                                                                             \\\n                                                                                                                             \\\n    template <class T, class A>                                                                                              \\\n    struct has_non_member_##test_name : std::integral_constant<bool, detail::has_non_member_##test_name##_impl<T, A>::value> \\\n    {                                                                                                                        \\\n      using check = typename detail::has_non_member_##test_name##_impl<T, A>;                                                \\\n      static_assert( check::valid,                                                                                           \\\n        \"cereal detected a non-const type parameter in non-member \" #test_name \". \\n \"                                       \\\n        #test_name \" non-member functions must always pass their types as const\" );                                          \\\n                                                                                                                             \\\n      using type = typename detail::get_non_member_##test_name##_type<T, A, check::value>::type;                             \\\n      static_assert( (check::value && is_minimal_type<type>::value) || !check::value,                                        \\\n        \"cereal detected a non-member \" #test_name \" with an invalid return type. \\n \"                                       \\\n        \"return type must be arithmetic or string\" );                                                                        \\\n    };\n\n    // ######################################################################\n    // Non-Member Save Minimal\n    CEREAL_MAKE_HAS_NON_MEMBER_SAVE_MINIMAL_TEST(save_minimal, )\n\n    // ######################################################################\n    // Non-Member Save Minimal (versioned)\n    CEREAL_MAKE_HAS_NON_MEMBER_SAVE_MINIMAL_TEST(versioned_save_minimal, CEREAL_MAKE_VERSIONED_TEST)\n\n    // ######################################################################\n    #undef CEREAL_MAKE_HAS_NON_MEMBER_SAVE_MINIMAL_TEST\n\n    // ######################################################################\n    // Load Minimal Utilities\n    namespace detail\n    {\n      //! Used to help strip away conversion wrappers\n      /*! If someone writes a non-member load/save minimal function that accepts its\n          parameter as some generic template type and needs to perform trait checks\n          on that type, our NoConvert wrappers will interfere with this.  Using\n          the struct strip_minmal, users can strip away our wrappers to get to\n          the underlying type, allowing traits to work properly */\n      struct NoConvertBase {};\n\n      //! A struct that prevents implicit conversion\n      /*! Any type instantiated with this struct will be unable to implicitly convert\n          to another type.  Is designed to only allow conversion to Source const &.\n\n          @tparam Source the type of the original source */\n      template <class Source>\n      struct NoConvertConstRef : NoConvertBase\n      {\n        using type = Source; //!< Used to get underlying type easily\n\n        template <class Dest, class = typename std::enable_if<std::is_same<Source, Dest>::value>::type>\n        operator Dest () = delete;\n\n        //! only allow conversion if the types are the same and we are converting into a const reference\n        template <class Dest, class = typename std::enable_if<std::is_same<Source, Dest>::value>::type>\n        operator Dest const & ();\n      };\n\n      //! A struct that prevents implicit conversion\n      /*! Any type instantiated with this struct will be unable to implicitly convert\n          to another type.  Is designed to only allow conversion to Source &.\n\n          @tparam Source the type of the original source */\n      template <class Source>\n      struct NoConvertRef : NoConvertBase\n      {\n        using type = Source; //!< Used to get underlying type easily\n\n        template <class Dest, class = typename std::enable_if<std::is_same<Source, Dest>::value>::type>\n        operator Dest () = delete;\n\n        #ifdef __clang__\n        template <class Dest, class = typename std::enable_if<std::is_same<Source, Dest>::value>::type>\n        operator Dest const & () = delete;\n        #endif // __clang__\n\n        //! only allow conversion if the types are the same and we are converting into a const reference\n        template <class Dest, class = typename std::enable_if<std::is_same<Source, Dest>::value>::type>\n        operator Dest & ();\n      };\n\n      //! A type that can implicitly convert to anything else\n      struct AnyConvert\n      {\n        template <class Dest>\n        operator Dest & ();\n\n        template <class Dest>\n        operator Dest const & () const;\n      };\n    } // namespace detail\n\n    // ######################################################################\n    //! Creates a test for whether a member load_minimal function exists\n    /*! This creates a class derived from std::integral_constant that will be true if\n        the type has the proper member function for the given archive.\n\n        Our strategy here is to first check if a function matching the signature more or less exists\n        (allow anything like load_minimal(xxx) using AnyConvert, and then secondly enforce\n        that it has the correct signature using NoConvertConstRef\n\n        @param test_name The name to give the test (e.g. load_minimal or versioned_load_minimal)\n        @param versioned Either blank or the macro CEREAL_MAKE_VERSIONED_TEST */\n    #ifdef CEREAL_OLDER_GCC\n    #define CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_IMPL(test_name, versioned)                                                    \\\n    namespace detail                                                                                                          \\\n    {                                                                                                                         \\\n      template <class T, class A, class SFINAE = void> struct has_member_##test_name##_impl : no {};                          \\\n      template <class T, class A>                                                                                             \\\n      struct has_member_##test_name##_impl<T, A, typename detail::Void< decltype(                                             \\\n          cereal::access::member_load_minimal( std::declval<A const &>(),                                                     \\\n                                               std::declval<T &>(), AnyConvert() versioned ) ) >::type> : yes {};             \\\n                                                                                                                              \\\n        template <class T, class A, class U, class SFINAE = void> struct has_member_##test_name##_type_impl : no {};          \\\n        template <class T, class A, class U>                                                                                  \\\n        struct has_member_##test_name##_type_impl<T, A, U, typename detail::Void< decltype(                                   \\\n            cereal::access::member_load_minimal( std::declval<A const &>(),                                                   \\\n                                                 std::declval<T &>(), NoConvertConstRef<U>() versioned ) ) >::type> : yes {}; \\\n    } /* end namespace detail */\n    #else /* NOT CEREAL_OLDER_GCC =================================== */\n    #define CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_IMPL(test_name, versioned)              \\\n    namespace detail                                                                    \\\n    {                                                                                   \\\n      template <class T, class A>                                                       \\\n      struct has_member_##test_name##_impl                                              \\\n      {                                                                                 \\\n        template <class TT, class AA>                                                   \\\n        static auto test(int) -> decltype( cereal::access::member_load_minimal(         \\\n              std::declval<AA const &>(),                                               \\\n              std::declval<TT &>(), AnyConvert() versioned ), yes());                   \\\n        template <class, class> static no test(...);                                    \\\n        static const bool value = std::is_same<decltype(test<T, A>(0)), yes>::value;    \\\n      };                                                                                \\\n      template <class T, class A, class U>                                              \\\n      struct has_member_##test_name##_type_impl                                         \\\n      {                                                                                 \\\n        template <class TT, class AA, class UU>                                         \\\n        static auto test(int) -> decltype( cereal::access::member_load_minimal(         \\\n              std::declval<AA const &>(),                                               \\\n              std::declval<TT &>(), NoConvertConstRef<UU>() versioned ), yes());        \\\n        template <class, class, class> static no test(...);                             \\\n        static const bool value = std::is_same<decltype(test<T, A, U>(0)), yes>::value; \\\n                                                                                        \\\n      };                                                                                \\\n    } /* end namespace detail */\n    #endif // NOT CEREAL_OLDER_GCC\n\n    // ######################################################################\n    //! Creates helpers for minimal load functions\n    /*! The has_member_*_wrapper structs ensure that the load and save types for the\n        requested function type match appropriately.\n\n        @param load_test_name The name to give the test (e.g. load_minimal or versioned_load_minimal)\n        @param save_test_name The name to give the test (e.g. save_minimal or versioned_save_minimal,\n                              should match the load name.\n        @param save_test_prefix The name to give the test (e.g. save_minimal or versioned_save_minimal,\n                              should match the load name, without the trailing \"_minimal\" (e.g.\n                              save or versioned_save).  Needed because the preprocessor is an abomination.\n        @param versioned Either blank or the macro CEREAL_MAKE_VERSIONED_TEST */\n    #define CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_HELPERS_IMPL(load_test_name, save_test_name, save_test_prefix, versioned) \\\n    namespace detail                                                                                                      \\\n    {                                                                                                                     \\\n      template <class T, class A, bool Valid>                                                                             \\\n      struct has_member_##load_test_name##_wrapper : std::false_type {};                                                  \\\n                                                                                                                          \\\n      template <class T, class A>                                                                                         \\\n      struct has_member_##load_test_name##_wrapper<T, A, true>                                                            \\\n      {                                                                                                                   \\\n        using AOut = typename detail::get_output_from_input<A>::type;                                                     \\\n                                                                                                                          \\\n        static_assert( has_member_##save_test_prefix##_minimal<T, AOut>::value,                                           \\\n          \"cereal detected member \" #load_test_name \" but no valid member \" #save_test_name \". \\n \"                       \\\n          \"cannot evaluate correctness of \" #load_test_name \" without valid \" #save_test_name \".\" );                      \\\n                                                                                                                          \\\n        using SaveType = typename detail::get_member_##save_test_prefix##_minimal_type<T, AOut, true>::type;              \\\n        const static bool value = has_member_##load_test_name##_impl<T, A>::value;                                        \\\n        const static bool valid = has_member_##load_test_name##_type_impl<T, A, SaveType>::value;                         \\\n                                                                                                                          \\\n        static_assert( valid || !value, \"cereal detected different or invalid types in corresponding member \"             \\\n            #load_test_name \" and \" #save_test_name \" functions. \\n \"                                                     \\\n            \"the paramater to \" #load_test_name \" must be a constant reference to the type that \"                         \\\n            #save_test_name \" returns.\" );                                                                                \\\n      };                                                                                                                  \\\n    } /* end namespace detail */\n\n    // ######################################################################\n    //! Creates a test for whether a member load_minimal function exists\n    /*! This creates a class derived from std::integral_constant that will be true if\n        the type has the proper member function for the given archive.\n\n        @param load_test_name The name to give the test (e.g. load_minimal or versioned_load_minimal)\n        @param load_test_prefix The above parameter minus the trailing \"_minimal\" */\n    #define CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_TEST(load_test_name, load_test_prefix)                                         \\\n    template <class T, class A>                                                                                                \\\n    struct has_member_##load_test_prefix##_minimal : std::integral_constant<bool,                                              \\\n      detail::has_member_##load_test_name##_wrapper<T, A, detail::has_member_##load_test_name##_impl<T, A>::value>::value> {};\n\n    // ######################################################################\n    // Member Load Minimal\n    CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_IMPL(load_minimal, )\n    CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_HELPERS_IMPL(load_minimal, save_minimal, save, )\n    CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_TEST(load_minimal, load)\n\n    // ######################################################################\n    // Member Load Minimal (versioned)\n    CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_IMPL(versioned_load_minimal, CEREAL_MAKE_VERSIONED_TEST)\n    CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_HELPERS_IMPL(versioned_load_minimal, versioned_save_minimal, versioned_save, CEREAL_MAKE_VERSIONED_TEST)\n    CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_TEST(versioned_load_minimal, versioned_load)\n\n    // ######################################################################\n    #undef CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_IMPL\n    #undef CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_HELPERS_IMPL\n    #undef CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_TEST\n\n    // ######################################################################\n    // Non-Member Load Minimal\n    namespace detail\n    {\n      #ifdef CEREAL_OLDER_GCC\n      void CEREAL_LOAD_MINIMAL_FUNCTION_NAME(); // prevents nonsense complaining about not finding this\n      void CEREAL_SAVE_MINIMAL_FUNCTION_NAME();\n      #endif // CEREAL_OLDER_GCC\n    } // namespace detail\n\n    // ######################################################################\n    //! Creates a test for whether a non-member load_minimal function exists\n    /*! This creates a class derived from std::integral_constant that will be true if\n        the type has the proper member function for the given archive.\n\n        See notes from member load_minimal implementation.\n\n        Note that there should be an additional const check on load_minimal after the valid check,\n        but this currently interferes with many valid uses of minimal serialization.  It has been\n        removed (see #565 on github) and previously was:\n\n        @code\n        static_assert( check::const_valid || !check::exists,\n            \"cereal detected an invalid serialization type parameter in non-member \" #test_name \".  \"\n            #test_name \" non-member functions must accept their serialization type by non-const reference\" );\n        @endcode\n\n        See #132, #436, #263, and #565 on https://github.com/USCiLab/cereal for more details.\n\n        @param test_name The name to give the test (e.g. load_minimal or versioned_load_minimal)\n        @param save_name The corresponding name the save test would have (e.g. save_minimal or versioned_save_minimal)\n        @param versioned Either blank or the macro CEREAL_MAKE_VERSIONED_TEST */\n    #define CEREAL_MAKE_HAS_NON_MEMBER_LOAD_MINIMAL_TEST(test_name, save_name, versioned)                                    \\\n    namespace detail                                                                                                         \\\n    {                                                                                                                        \\\n      template <class T, class A, class U = void>                                                                            \\\n      struct has_non_member_##test_name##_impl                                                                               \\\n      {                                                                                                                      \\\n        template <class TT, class AA>                                                                                        \\\n        static auto test(int) -> decltype( CEREAL_LOAD_MINIMAL_FUNCTION_NAME(                                                \\\n              std::declval<AA const &>(), std::declval<TT&>(), AnyConvert() versioned ), yes() );                            \\\n        template <class, class> static no test( ... );                                                                       \\\n        static const bool exists = std::is_same<decltype( test<T, A>( 0 ) ), yes>::value;                                    \\\n                                                                                                                             \\\n        template <class TT, class AA, class UU>                                                                              \\\n        static auto test2(int) -> decltype( CEREAL_LOAD_MINIMAL_FUNCTION_NAME(                                               \\\n              std::declval<AA const &>(), std::declval<TT&>(), NoConvertConstRef<UU>() versioned ), yes() );                 \\\n        template <class, class, class> static no test2( ... );                                                               \\\n        static const bool valid = std::is_same<decltype( test2<T, A, U>( 0 ) ), yes>::value;                                 \\\n                                                                                                                             \\\n        template <class TT, class AA>                                                                                        \\\n        static auto test3(int) -> decltype( CEREAL_LOAD_MINIMAL_FUNCTION_NAME(                                               \\\n              std::declval<AA const &>(), NoConvertRef<TT>(), AnyConvert() versioned ), yes() );                             \\\n        template <class, class> static no test3( ... );                                                                      \\\n        static const bool const_valid = std::is_same<decltype( test3<T, A>( 0 ) ), yes>::value;                              \\\n      };                                                                                                                     \\\n                                                                                                                             \\\n      template <class T, class A, bool Valid>                                                                                \\\n      struct has_non_member_##test_name##_wrapper : std::false_type {};                                                      \\\n                                                                                                                             \\\n      template <class T, class A>                                                                                            \\\n      struct has_non_member_##test_name##_wrapper<T, A, true>                                                                \\\n      {                                                                                                                      \\\n        using AOut = typename detail::get_output_from_input<A>::type;                                                        \\\n                                                                                                                             \\\n        static_assert( detail::has_non_member_##save_name##_impl<T, AOut>::valid,                                            \\\n          \"cereal detected non-member \" #test_name \" but no valid non-member \" #save_name \". \\n \"                            \\\n          \"cannot evaluate correctness of \" #test_name \" without valid \" #save_name \".\" );                                   \\\n                                                                                                                             \\\n        using SaveType = typename detail::get_non_member_##save_name##_type<T, AOut, true>::type;                            \\\n        using check = has_non_member_##test_name##_impl<T, A, SaveType>;                                                     \\\n        static const bool value = check::exists;                                                                             \\\n                                                                                                                             \\\n        static_assert( check::valid || !check::exists, \"cereal detected different types in corresponding non-member \"        \\\n            #test_name \" and \" #save_name \" functions. \\n \"                                                                  \\\n            \"the paramater to \" #test_name \" must be a constant reference to the type that \" #save_name \" returns.\" );       \\\n      };                                                                                                                     \\\n    } /* namespace detail */                                                                                                 \\\n                                                                                                                             \\\n    template <class T, class A>                                                                                              \\\n    struct has_non_member_##test_name : std::integral_constant<bool,                                                         \\\n      detail::has_non_member_##test_name##_wrapper<T, A, detail::has_non_member_##test_name##_impl<T, A>::exists>::value> {};\n\n    // ######################################################################\n    // Non-Member Load Minimal\n    CEREAL_MAKE_HAS_NON_MEMBER_LOAD_MINIMAL_TEST(load_minimal, save_minimal, )\n\n    // ######################################################################\n    // Non-Member Load Minimal (versioned)\n    CEREAL_MAKE_HAS_NON_MEMBER_LOAD_MINIMAL_TEST(versioned_load_minimal, versioned_save_minimal, CEREAL_MAKE_VERSIONED_TEST)\n\n    // ######################################################################\n    #undef CEREAL_MAKE_HAS_NON_MEMBER_LOAD_MINIMAL_TEST\n\n    // ######################################################################\n    namespace detail\n    {\n      // const stripped away before reaching here, prevents errors on conversion from\n      // construct<const T> to construct<T>\n      template<typename T, typename A>\n      struct has_member_load_and_construct_impl : std::integral_constant<bool,\n        std::is_same<decltype( access::load_and_construct<T>( std::declval<A&>(), std::declval< ::cereal::construct<T>&>() ) ), void>::value>\n      { };\n\n      template<typename T, typename A>\n      struct has_member_versioned_load_and_construct_impl : std::integral_constant<bool,\n        std::is_same<decltype( access::load_and_construct<T>( std::declval<A&>(), std::declval< ::cereal::construct<T>&>(), 0 ) ), void>::value>\n      { };\n    } // namespace detail\n\n    //! Member load and construct check\n    template<typename T, typename A>\n    struct has_member_load_and_construct : detail::has_member_load_and_construct_impl<typename std::remove_const<T>::type, A>\n    { };\n\n    //! Member load and construct check (versioned)\n    template<typename T, typename A>\n    struct has_member_versioned_load_and_construct : detail::has_member_versioned_load_and_construct_impl<typename std::remove_const<T>::type, A>\n    { };\n\n    // ######################################################################\n    //! Creates a test for whether a non-member load_and_construct specialization exists\n    /*! This creates a class derived from std::integral_constant that will be true if\n        the type has the proper non-member function for the given archive. */\n    #define CEREAL_MAKE_HAS_NON_MEMBER_LOAD_AND_CONSTRUCT_TEST(test_name, versioned)                                            \\\n    namespace detail                                                                                                            \\\n    {                                                                                                                           \\\n      template <class T, class A>                                                                                               \\\n      struct has_non_member_##test_name##_impl                                                                                  \\\n      {                                                                                                                         \\\n        template <class TT, class AA>                                                                                           \\\n        static auto test(int) -> decltype( LoadAndConstruct<TT>::load_and_construct(                                            \\\n                                           std::declval<AA&>(), std::declval< ::cereal::construct<TT>&>() versioned ), yes());  \\\n        template <class, class>                                                                                                 \\\n        static no test( ... );                                                                                                  \\\n        static const bool value = std::is_same<decltype( test<T, A>( 0 ) ), yes>::value;                                        \\\n      };                                                                                                                        \\\n    } /* end namespace detail */                                                                                                \\\n    template <class T, class A>                                                                                                 \\\n    struct has_non_member_##test_name :                                                                                         \\\n      std::integral_constant<bool, detail::has_non_member_##test_name##_impl<typename std::remove_const<T>::type, A>::value> {};\n\n    // ######################################################################\n    //! Non member load and construct check\n    CEREAL_MAKE_HAS_NON_MEMBER_LOAD_AND_CONSTRUCT_TEST(load_and_construct, )\n\n    // ######################################################################\n    //! Non member load and construct check (versioned)\n    CEREAL_MAKE_HAS_NON_MEMBER_LOAD_AND_CONSTRUCT_TEST(versioned_load_and_construct, CEREAL_MAKE_VERSIONED_TEST)\n\n    // ######################################################################\n    //! Has either a member or non member load and construct\n    template<typename T, typename A>\n    struct has_load_and_construct : std::integral_constant<bool,\n      has_member_load_and_construct<T, A>::value || has_non_member_load_and_construct<T, A>::value ||\n      has_member_versioned_load_and_construct<T, A>::value || has_non_member_versioned_load_and_construct<T, A>::value>\n    { };\n\n    // ######################################################################\n    #undef CEREAL_MAKE_HAS_NON_MEMBER_LOAD_AND_CONSTRUCT_TEST\n\n    // ######################################################################\n    // End of serialization existence tests\n    #undef CEREAL_MAKE_VERSIONED_TEST\n\n    // ######################################################################\n    template <class T, class InputArchive, class OutputArchive>\n    struct has_member_split : std::integral_constant<bool,\n      (has_member_load<T, InputArchive>::value && has_member_save<T, OutputArchive>::value) ||\n      (has_member_versioned_load<T, InputArchive>::value && has_member_versioned_save<T, OutputArchive>::value)> {};\n\n    // ######################################################################\n    template <class T, class InputArchive, class OutputArchive>\n    struct has_non_member_split : std::integral_constant<bool,\n      (has_non_member_load<T, InputArchive>::value && has_non_member_save<T, OutputArchive>::value) ||\n      (has_non_member_versioned_load<T, InputArchive>::value && has_non_member_versioned_save<T, OutputArchive>::value)> {};\n\n    // ######################################################################\n    template <class T, class OutputArchive>\n    struct has_invalid_output_versioning : std::integral_constant<bool,\n      (has_member_versioned_save<T, OutputArchive>::value && has_member_save<T, OutputArchive>::value) ||\n      (has_non_member_versioned_save<T, OutputArchive>::value && has_non_member_save<T, OutputArchive>::value) ||\n      (has_member_versioned_serialize<T, OutputArchive>::value && has_member_serialize<T, OutputArchive>::value) ||\n      (has_non_member_versioned_serialize<T, OutputArchive>::value && has_non_member_serialize<T, OutputArchive>::value) ||\n      (has_member_versioned_save_minimal<T, OutputArchive>::value && has_member_save_minimal<T, OutputArchive>::value) ||\n      (has_non_member_versioned_save_minimal<T, OutputArchive>::value &&  has_non_member_save_minimal<T, OutputArchive>::value)> {};\n\n    // ######################################################################\n    template <class T, class InputArchive>\n    struct has_invalid_input_versioning : std::integral_constant<bool,\n      (has_member_versioned_load<T, InputArchive>::value && has_member_load<T, InputArchive>::value) ||\n      (has_non_member_versioned_load<T, InputArchive>::value && has_non_member_load<T, InputArchive>::value) ||\n      (has_member_versioned_serialize<T, InputArchive>::value && has_member_serialize<T, InputArchive>::value) ||\n      (has_non_member_versioned_serialize<T, InputArchive>::value && has_non_member_serialize<T, InputArchive>::value) ||\n      (has_member_versioned_load_minimal<T, InputArchive>::value && has_member_load_minimal<T, InputArchive>::value) ||\n      (has_non_member_versioned_load_minimal<T, InputArchive>::value &&  has_non_member_load_minimal<T, InputArchive>::value)> {};\n\n    // ######################################################################\n    namespace detail\n    {\n      //! Create a test for a cereal::specialization entry\n      #define CEREAL_MAKE_IS_SPECIALIZED_IMPL(name)                                          \\\n      template <class T, class A>                                                            \\\n      struct is_specialized_##name : std::integral_constant<bool,                            \\\n        !std::is_base_of<std::false_type, specialize<A, T, specialization::name>>::value> {}\n\n      CEREAL_MAKE_IS_SPECIALIZED_IMPL(member_serialize);\n      CEREAL_MAKE_IS_SPECIALIZED_IMPL(member_load_save);\n      CEREAL_MAKE_IS_SPECIALIZED_IMPL(member_load_save_minimal);\n      CEREAL_MAKE_IS_SPECIALIZED_IMPL(non_member_serialize);\n      CEREAL_MAKE_IS_SPECIALIZED_IMPL(non_member_load_save);\n      CEREAL_MAKE_IS_SPECIALIZED_IMPL(non_member_load_save_minimal);\n\n      #undef CEREAL_MAKE_IS_SPECIALIZED_IMPL\n\n      //! Number of specializations detected\n      template <class T, class A>\n      struct count_specializations : std::integral_constant<int,\n        is_specialized_member_serialize<T, A>::value +\n        is_specialized_member_load_save<T, A>::value +\n        is_specialized_member_load_save_minimal<T, A>::value +\n        is_specialized_non_member_serialize<T, A>::value +\n        is_specialized_non_member_load_save<T, A>::value +\n        is_specialized_non_member_load_save_minimal<T, A>::value> {};\n    } // namespace detail\n\n    //! Check if any specialization exists for a type\n    template <class T, class A>\n    struct is_specialized : std::integral_constant<bool,\n      detail::is_specialized_member_serialize<T, A>::value ||\n      detail::is_specialized_member_load_save<T, A>::value ||\n      detail::is_specialized_member_load_save_minimal<T, A>::value ||\n      detail::is_specialized_non_member_serialize<T, A>::value ||\n      detail::is_specialized_non_member_load_save<T, A>::value ||\n      detail::is_specialized_non_member_load_save_minimal<T, A>::value>\n    {\n      static_assert(detail::count_specializations<T, A>::value <= 1, \"More than one explicit specialization detected for type.\");\n    };\n\n    //! Create the static assertion for some specialization\n    /*! This assertion will fail if the type is indeed specialized and does not have the appropriate\n        type of serialization functions */\n    #define CEREAL_MAKE_IS_SPECIALIZED_ASSERT(name, versioned_name, print_name, spec_name)                      \\\n    static_assert( (is_specialized<T, A>::value && detail::is_specialized_##spec_name<T, A>::value &&           \\\n                   (has_##name<T, A>::value || has_##versioned_name<T, A>::value))                              \\\n                   || !(is_specialized<T, A>::value && detail::is_specialized_##spec_name<T, A>::value),        \\\n                   \"cereal detected \" #print_name \" specialization but no \" #print_name \" serialize function\" )\n\n    //! Generates a test for specialization for versioned and unversioned functions\n    /*! This creates checks that can be queried to see if a given type of serialization function\n        has been specialized for this type */\n    #define CEREAL_MAKE_IS_SPECIALIZED(name, versioned_name, spec_name)                     \\\n    template <class T, class A>                                                             \\\n    struct is_specialized_##name : std::integral_constant<bool,                             \\\n      is_specialized<T, A>::value && detail::is_specialized_##spec_name<T, A>::value>       \\\n    { CEREAL_MAKE_IS_SPECIALIZED_ASSERT(name, versioned_name, name, spec_name); };          \\\n    template <class T, class A>                                                             \\\n    struct is_specialized_##versioned_name : std::integral_constant<bool,                   \\\n      is_specialized<T, A>::value && detail::is_specialized_##spec_name<T, A>::value>       \\\n    { CEREAL_MAKE_IS_SPECIALIZED_ASSERT(name, versioned_name, versioned_name, spec_name); }\n\n    CEREAL_MAKE_IS_SPECIALIZED(member_serialize, member_versioned_serialize, member_serialize);\n    CEREAL_MAKE_IS_SPECIALIZED(non_member_serialize, non_member_versioned_serialize, non_member_serialize);\n\n    CEREAL_MAKE_IS_SPECIALIZED(member_save, member_versioned_save, member_load_save);\n    CEREAL_MAKE_IS_SPECIALIZED(non_member_save, non_member_versioned_save, non_member_load_save);\n    CEREAL_MAKE_IS_SPECIALIZED(member_load, member_versioned_load, member_load_save);\n    CEREAL_MAKE_IS_SPECIALIZED(non_member_load, non_member_versioned_load, non_member_load_save);\n\n    CEREAL_MAKE_IS_SPECIALIZED(member_save_minimal, member_versioned_save_minimal, member_load_save_minimal);\n    CEREAL_MAKE_IS_SPECIALIZED(non_member_save_minimal, non_member_versioned_save_minimal, non_member_load_save_minimal);\n    CEREAL_MAKE_IS_SPECIALIZED(member_load_minimal, member_versioned_load_minimal, member_load_save_minimal);\n    CEREAL_MAKE_IS_SPECIALIZED(non_member_load_minimal, non_member_versioned_load_minimal, non_member_load_save_minimal);\n\n    #undef CEREAL_MAKE_IS_SPECIALIZED_ASSERT\n    #undef CEREAL_MAKE_IS_SPECIALIZED\n\n    // ######################################################################\n    // detects if a type has any active minimal output serialization\n    template <class T, class OutputArchive>\n    struct has_minimal_output_serialization : std::integral_constant<bool,\n      is_specialized_member_save_minimal<T, OutputArchive>::value ||\n      ((has_member_save_minimal<T, OutputArchive>::value ||\n        has_non_member_save_minimal<T, OutputArchive>::value ||\n        has_member_versioned_save_minimal<T, OutputArchive>::value ||\n        has_non_member_versioned_save_minimal<T, OutputArchive>::value) &&\n       !(is_specialized_member_serialize<T, OutputArchive>::value ||\n         is_specialized_member_save<T, OutputArchive>::value))> {};\n\n    // ######################################################################\n    // detects if a type has any active minimal input serialization\n    template <class T, class InputArchive>\n    struct has_minimal_input_serialization : std::integral_constant<bool,\n      is_specialized_member_load_minimal<T, InputArchive>::value ||\n      ((has_member_load_minimal<T, InputArchive>::value ||\n        has_non_member_load_minimal<T, InputArchive>::value ||\n        has_member_versioned_load_minimal<T, InputArchive>::value ||\n        has_non_member_versioned_load_minimal<T, InputArchive>::value) &&\n       !(is_specialized_member_serialize<T, InputArchive>::value ||\n         is_specialized_member_load<T, InputArchive>::value))> {};\n\n    // ######################################################################\n    namespace detail\n    {\n      //! The number of output serialization functions available\n      /*! If specialization is being used, we'll count only those; otherwise we'll count everything */\n      template <class T, class OutputArchive>\n      struct count_output_serializers : std::integral_constant<int,\n        count_specializations<T, OutputArchive>::value ? count_specializations<T, OutputArchive>::value :\n        has_member_save<T, OutputArchive>::value +\n        has_non_member_save<T, OutputArchive>::value +\n        has_member_serialize<T, OutputArchive>::value +\n        has_non_member_serialize<T, OutputArchive>::value +\n        has_member_save_minimal<T, OutputArchive>::value +\n        has_non_member_save_minimal<T, OutputArchive>::value +\n        /*-versioned---------------------------------------------------------*/\n        has_member_versioned_save<T, OutputArchive>::value +\n        has_non_member_versioned_save<T, OutputArchive>::value +\n        has_member_versioned_serialize<T, OutputArchive>::value +\n        has_non_member_versioned_serialize<T, OutputArchive>::value +\n        has_member_versioned_save_minimal<T, OutputArchive>::value +\n        has_non_member_versioned_save_minimal<T, OutputArchive>::value> {};\n    }\n\n    template <class T, class OutputArchive>\n    struct is_output_serializable : std::integral_constant<bool,\n      detail::count_output_serializers<T, OutputArchive>::value == 1> {};\n\n    // ######################################################################\n    namespace detail\n    {\n      //! The number of input serialization functions available\n      /*! If specialization is being used, we'll count only those; otherwise we'll count everything */\n      template <class T, class InputArchive>\n      struct count_input_serializers : std::integral_constant<int,\n        count_specializations<T, InputArchive>::value ? count_specializations<T, InputArchive>::value :\n        has_member_load<T, InputArchive>::value +\n        has_non_member_load<T, InputArchive>::value +\n        has_member_serialize<T, InputArchive>::value +\n        has_non_member_serialize<T, InputArchive>::value +\n        has_member_load_minimal<T, InputArchive>::value +\n        has_non_member_load_minimal<T, InputArchive>::value +\n        /*-versioned---------------------------------------------------------*/\n        has_member_versioned_load<T, InputArchive>::value +\n        has_non_member_versioned_load<T, InputArchive>::value +\n        has_member_versioned_serialize<T, InputArchive>::value +\n        has_non_member_versioned_serialize<T, InputArchive>::value +\n        has_member_versioned_load_minimal<T, InputArchive>::value +\n        has_non_member_versioned_load_minimal<T, InputArchive>::value> {};\n    }\n\n    template <class T, class InputArchive>\n    struct is_input_serializable : std::integral_constant<bool,\n      detail::count_input_serializers<T, InputArchive>::value == 1> {};\n\n    // ######################################################################\n    // Base Class Support\n    namespace detail\n    {\n      struct base_class_id\n      {\n        template<class T>\n          base_class_id(T const * const t) :\n          type(typeid(T)),\n          ptr(t),\n          hash(std::hash<std::type_index>()(typeid(T)) ^ (std::hash<void const *>()(t) << 1))\n          { }\n\n          bool operator==(base_class_id const & other) const\n          { return (type == other.type) && (ptr == other.ptr); }\n\n          std::type_index type;\n          void const * ptr;\n          size_t hash;\n      };\n      struct base_class_id_hash { size_t operator()(base_class_id const & id) const { return id.hash; }  };\n    } // namespace detail\n\n    namespace detail\n    {\n      //! Common base type for base class casting\n      struct BaseCastBase {};\n\n      template <class>\n      struct get_base_class;\n\n      template <template<typename> class Cast, class Base>\n      struct get_base_class<Cast<Base>>\n      {\n        using type = Base;\n      };\n\n      //! Base class cast, behave as the test\n      template <class Cast, template<class, class> class Test, class Archive,\n                bool IsBaseCast = std::is_base_of<BaseCastBase, Cast>::value>\n      struct has_minimal_base_class_serialization_impl : Test<typename get_base_class<Cast>::type, Archive>\n      { };\n\n      //! Not a base class cast\n      template <class Cast, template<class, class> class Test, class Archive>\n      struct has_minimal_base_class_serialization_impl<Cast,Test, Archive, false> : std::false_type\n      { };\n    }\n\n    //! Checks to see if the base class used in a cast has a minimal serialization\n    /*! @tparam Cast Either base_class or virtual_base_class wrapped type\n        @tparam Test A has_minimal test (for either input or output)\n        @tparam Archive The archive to use with the test */\n    template <class Cast, template<class, class> class Test, class Archive>\n    struct has_minimal_base_class_serialization : detail::has_minimal_base_class_serialization_impl<Cast, Test, Archive>\n    { };\n\n\n    // ######################################################################\n    namespace detail\n    {\n      struct shared_from_this_wrapper\n      {\n        template <class U>\n        static auto (check)( U const & t ) -> decltype( ::cereal::access::shared_from_this(t), std::true_type() );\n\n        static auto (check)( ... ) -> decltype( std::false_type() );\n\n        template <class U>\n        static auto get( U const & t ) -> decltype( t.shared_from_this() );\n      };\n    }\n\n    //! Determine if T or any base class of T has inherited from std::enable_shared_from_this\n    template<class T>\n    struct has_shared_from_this : decltype((detail::shared_from_this_wrapper::check)(std::declval<T>()))\n    { };\n\n    //! Get the type of the base class of T which inherited from std::enable_shared_from_this\n    template <class T>\n    struct get_shared_from_this_base\n    {\n      private:\n        using PtrType = decltype(detail::shared_from_this_wrapper::get(std::declval<T>()));\n      public:\n        //! The type of the base of T that inherited from std::enable_shared_from_this\n        using type = typename std::decay<typename PtrType::element_type>::type;\n    };\n\n    // ######################################################################\n    //! Extracts the true type from something possibly wrapped in a cereal NoConvert\n    /*! Internally cereal uses some wrapper classes to test the validity of non-member\n        minimal load and save functions.  This can interfere with user type traits on\n        templated load and save minimal functions.  To get to the correct underlying type,\n        users should use strip_minimal when performing any enable_if type type trait checks.\n\n        See the enum serialization in types/common.hpp for an example of using this */\n    template <class T, bool IsCerealMinimalTrait = std::is_base_of<detail::NoConvertBase, T>::value>\n    struct strip_minimal\n    {\n      using type = T;\n    };\n\n    //! Specialization for types wrapped in a NoConvert\n    template <class T>\n    struct strip_minimal<T, true>\n    {\n      using type = typename T::type;\n    };\n\n    // ######################################################################\n    //! Determines whether the class T can be default constructed by cereal::access\n    template <class T>\n    struct is_default_constructible\n    {\n      #ifdef CEREAL_OLDER_GCC\n      template <class TT, class SFINAE = void>\n      struct test : no {};\n      template <class TT>\n      struct test<TT, typename detail::Void< decltype( cereal::access::construct<TT>() ) >::type> : yes {};\n      static const bool value = test<T>();\n      #else // NOT CEREAL_OLDER_GCC =========================================\n      template <class TT>\n      static auto test(int) -> decltype( cereal::access::construct<TT>(), yes());\n      template <class>\n      static no test(...);\n      static const bool value = std::is_same<decltype(test<T>(0)), yes>::value;\n      #endif // NOT CEREAL_OLDER_GCC\n    };\n\n    // ######################################################################\n    namespace detail\n    {\n      //! Removes all qualifiers and minimal wrappers from an archive\n      template <class A>\n      using decay_archive = typename std::decay<typename strip_minimal<A>::type>::type;\n    }\n\n    //! Checks if the provided archive type is equal to some cereal archive type\n    /*! This automatically does things such as std::decay and removing any other wrappers that may be\n        on the Archive template parameter.\n\n        Example use:\n        @code{cpp}\n        // example use to disable a serialization function\n        template <class Archive, EnableIf<cereal::traits::is_same_archive<Archive, cereal::BinaryOutputArchive>::value> = sfinae>\n        void save( Archive & ar, MyType const & mt );\n        @endcode */\n    template <class ArchiveT, class CerealArchiveT>\n    struct is_same_archive : std::integral_constant<bool,\n      std::is_same<detail::decay_archive<ArchiveT>, CerealArchiveT>::value>\n    { };\n\n    // ######################################################################\n    //! A macro to use to restrict which types of archives your function will work for.\n    /*! This requires you to have a template class parameter named Archive and replaces the void return\n        type for your function.\n\n        INTYPE refers to the input archive type you wish to restrict on.\n        OUTTYPE refers to the output archive type you wish to restrict on.\n\n        For example, if we want to limit a serialize to only work with binary serialization:\n\n        @code{.cpp}\n        template <class Archive>\n        CEREAL_ARCHIVE_RESTRICT(BinaryInputArchive, BinaryOutputArchive)\n        serialize( Archive & ar, MyCoolType & m )\n        {\n          ar & m;\n        }\n        @endcode\n\n        If you need to do more restrictions in your enable_if, you will need to do this by hand.\n     */\n    #define CEREAL_ARCHIVE_RESTRICT(INTYPE, OUTTYPE) \\\n    typename std::enable_if<cereal::traits::is_same_archive<Archive, INTYPE>::value || cereal::traits::is_same_archive<Archive, OUTTYPE>::value, void>::type\n\n    //! Type traits only struct used to mark an archive as human readable (text based)\n    /*! Archives that wish to identify as text based/human readable should inherit from\n        this struct */\n    struct TextArchive {};\n\n    //! Checks if an archive is a text archive (human readable)\n    template <class A>\n    struct is_text_archive : std::integral_constant<bool,\n      std::is_base_of<TextArchive, detail::decay_archive<A>>::value>\n    { };\n  } // namespace traits\n\n  // ######################################################################\n  namespace detail\n  {\n    template <class T, class A,\n              bool Member = traits::has_member_load_and_construct<T, A>::value,\n              bool MemberVersioned = traits::has_member_versioned_load_and_construct<T, A>::value,\n              bool NonMember = traits::has_non_member_load_and_construct<T, A>::value,\n              bool NonMemberVersioned = traits::has_non_member_versioned_load_and_construct<T, A>::value>\n    struct Construct\n    {\n      static_assert( cereal::traits::detail::delay_static_assert<T>::value,\n        \"cereal found more than one compatible load_and_construct function for the provided type and archive combination. \\n\\n \"\n        \"Types must either have a member load_and_construct function or a non-member specialization of LoadAndConstruct (you may not mix these). \\n \"\n        \"In addition, you may not mix versioned with non-versioned load_and_construct functions. \\n\\n \" );\n      static T * load_andor_construct( A & /*ar*/, construct<T> & /*construct*/ )\n      { return nullptr; }\n    };\n\n    // no load and construct case\n    template <class T, class A>\n    struct Construct<T, A, false, false, false, false>\n    {\n      static_assert( ::cereal::traits::is_default_constructible<T>::value,\n                     \"Trying to serialize a an object with no default constructor. \\n\\n \"\n                     \"Types must either be default constructible or define either a member or non member Construct function. \\n \"\n                     \"Construct functions generally have the signature: \\n\\n \"\n                     \"template <class Archive> \\n \"\n                     \"static void load_and_construct(Archive & ar, cereal::construct<T> & construct) \\n \"\n                     \"{ \\n \"\n                     \"  var a; \\n \"\n                     \"  ar( a ) \\n \"\n                     \"  construct( a ); \\n \"\n                     \"} \\n\\n\" );\n      static T * load_andor_construct()\n      { return ::cereal::access::construct<T>(); }\n    };\n\n    // member non-versioned\n    template <class T, class A>\n    struct Construct<T, A, true, false, false, false>\n    {\n      static void load_andor_construct( A & ar, construct<T> & construct )\n      {\n        access::load_and_construct<T>( ar, construct );\n      }\n    };\n\n    // member versioned\n    template <class T, class A>\n    struct Construct<T, A, false, true, false, false>\n    {\n      static void load_andor_construct( A & ar, construct<T> & construct )\n      {\n        const auto version = ar.template loadClassVersion<T>();\n        access::load_and_construct<T>( ar, construct, version );\n      }\n    };\n\n    // non-member non-versioned\n    template <class T, class A>\n    struct Construct<T, A, false, false, true, false>\n    {\n      static void load_andor_construct( A & ar, construct<T> & construct )\n      {\n        LoadAndConstruct<T>::load_and_construct( ar, construct );\n      }\n    };\n\n    // non-member versioned\n    template <class T, class A>\n    struct Construct<T, A, false, false, false, true>\n    {\n      static void load_andor_construct( A & ar, construct<T> & construct )\n      {\n        const auto version = ar.template loadClassVersion<T>();\n        LoadAndConstruct<T>::load_and_construct( ar, construct, version );\n      }\n    };\n  } // namespace detail\n} // namespace cereal\n\n#endif // CEREAL_DETAILS_TRAITS_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/details/util.hpp",
    "content": "/*! \\file util.hpp\n    \\brief Internal misc utilities\n    \\ingroup Internal */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_DETAILS_UTIL_HPP_\n#define CEREAL_DETAILS_UTIL_HPP_\n\n#include <typeinfo>\n#include <string>\n\n#ifdef _MSC_VER\nnamespace cereal\n{\n  namespace util\n  {\n    //! Demangles the type encoded in a string\n    /*! @internal */\n    inline std::string demangle( std::string const & name )\n    { return name; }\n\n    //! Gets the demangled name of a type\n    /*! @internal */\n    template <class T> inline\n    std::string demangledName()\n    { return typeid( T ).name(); }\n  } // namespace util\n} // namespace cereal\n#else // clang or gcc\n#include <cxxabi.h>\n#include <cstdlib>\nnamespace cereal\n{\n  namespace util\n  {\n    //! Demangles the type encoded in a string\n    /*! @internal */\n    inline std::string demangle(std::string mangledName)\n    {\n      int status = 0;\n      char *demangledName = nullptr;\n      std::size_t len;\n\n      demangledName = abi::__cxa_demangle(mangledName.c_str(), 0, &len, &status);\n\n      std::string retName(demangledName);\n      free(demangledName);\n\n      return retName;\n    }\n\n    //! Gets the demangled name of a type\n    /*! @internal */\n    template<class T> inline\n    std::string demangledName()\n    { return demangle(typeid(T).name()); }\n  }\n} // namespace cereal\n#endif // clang or gcc branch of _MSC_VER\n#endif // CEREAL_DETAILS_UTIL_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/base64.hpp",
    "content": "/*\n   Copyright (C) 2004-2008 René Nyffenegger\n\n   This source code is provided 'as-is', without any express or implied\n   warranty. In no event will the author be held liable for any damages\n   arising from the use of this software.\n\n   Permission is granted to anyone to use this software for any purpose,\n   including commercial applications, and to alter it and redistribute it\n   freely, subject to the following restrictions:\n\n   1. The origin of this source code must not be misrepresented; you must not\n      claim that you wrote the original source code. If you use this source code\n      in a product, an acknowledgment in the product documentation would be\n      appreciated but is not required.\n\n   2. Altered source versions must be plainly marked as such, and must not be\n      misrepresented as being the original source code.\n\n   3. This notice may not be removed or altered from any source distribution.\n\n   René Nyffenegger rene.nyffenegger@adp-gmbh.ch\n*/\n\n#ifndef CEREAL_EXTERNAL_BASE64_HPP_\n#define CEREAL_EXTERNAL_BASE64_HPP_\n\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wconversion\"\n#endif\n\n#include <string>\n\nnamespace cereal\n{\n  namespace base64\n  {\n    static const std::string chars =\n      \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n      \"abcdefghijklmnopqrstuvwxyz\"\n      \"0123456789+/\";\n\n    static inline bool is_base64(unsigned char c) {\n      return (isalnum(c) || (c == '+') || (c == '/'));\n    }\n\n    inline std::string encode(unsigned char const* bytes_to_encode, size_t in_len) {\n      std::string ret;\n      int i = 0;\n      int j = 0;\n      unsigned char char_array_3[3];\n      unsigned char char_array_4[4];\n\n      while (in_len--) {\n        char_array_3[i++] = *(bytes_to_encode++);\n        if (i == 3) {\n          char_array_4[0] = static_cast<unsigned char>((char_array_3[0] & 0xfc) >> 2);\n          char_array_4[1] = static_cast<unsigned char>( ( ( char_array_3[0] & 0x03 ) << 4 ) + ( ( char_array_3[1] & 0xf0 ) >> 4 ) );\n          char_array_4[2] = static_cast<unsigned char>( ( ( char_array_3[1] & 0x0f ) << 2 ) + ( ( char_array_3[2] & 0xc0 ) >> 6 ) );\n          char_array_4[3] = static_cast<unsigned char>( char_array_3[2] & 0x3f );\n\n          for(i = 0; (i <4) ; i++)\n            ret += chars[char_array_4[i]];\n          i = 0;\n        }\n      }\n\n      if (i)\n      {\n        for(j = i; j < 3; j++)\n          char_array_3[j] = '\\0';\n\n        char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;\n        char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);\n        char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);\n        char_array_4[3] = char_array_3[2] & 0x3f;\n\n        for (j = 0; (j < i + 1); j++)\n          ret += chars[char_array_4[j]];\n\n        while((i++ < 3))\n          ret += '=';\n      }\n\n      return ret;\n    }\n\n    inline std::string decode(std::string const& encoded_string) {\n      size_t in_len = encoded_string.size();\n      size_t i = 0;\n      size_t j = 0;\n      int in_ = 0;\n      unsigned char char_array_4[4], char_array_3[3];\n      std::string ret;\n\n      while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {\n        char_array_4[i++] = encoded_string[in_]; in_++;\n        if (i ==4) {\n          for (i = 0; i <4; i++)\n            char_array_4[i] = static_cast<unsigned char>(chars.find( char_array_4[i] ));\n\n          char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);\n          char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);\n          char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];\n\n          for (i = 0; (i < 3); i++)\n            ret += char_array_3[i];\n          i = 0;\n        }\n      }\n\n      if (i) {\n        for (j = i; j <4; j++)\n          char_array_4[j] = 0;\n\n        for (j = 0; j <4; j++)\n          char_array_4[j] = static_cast<unsigned char>(chars.find( char_array_4[j] ));\n\n        char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);\n        char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);\n        char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];\n\n        for (j = 0; (j < i - 1); j++) ret += char_array_3[j];\n      }\n\n      return ret;\n    }\n  } // namespace base64\n} // namespace cereal\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n#endif // CEREAL_EXTERNAL_BASE64_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/allocators.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_ALLOCATORS_H_\n#define CEREAL_RAPIDJSON_ALLOCATORS_H_\n\n#include \"rapidjson.h\"\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n///////////////////////////////////////////////////////////////////////////////\n// Allocator\n\n/*! \\class rapidjson::Allocator\n    \\brief Concept for allocating, resizing and freeing memory block.\n    \n    Note that Malloc() and Realloc() are non-static but Free() is static.\n    \n    So if an allocator need to support Free(), it needs to put its pointer in \n    the header of memory block.\n\n\\code\nconcept Allocator {\n    static const bool kNeedFree;    //!< Whether this allocator needs to call Free().\n\n    // Allocate a memory block.\n    // \\param size of the memory block in bytes.\n    // \\returns pointer to the memory block.\n    void* Malloc(size_t size);\n\n    // Resize a memory block.\n    // \\param originalPtr The pointer to current memory block. Null pointer is permitted.\n    // \\param originalSize The current size in bytes. (Design issue: since some allocator may not book-keep this, explicitly pass to it can save memory.)\n    // \\param newSize the new size in bytes.\n    void* Realloc(void* originalPtr, size_t originalSize, size_t newSize);\n\n    // Free a memory block.\n    // \\param pointer to the memory block. Null pointer is permitted.\n    static void Free(void *ptr);\n};\n\\endcode\n*/\n\n\n/*! \\def CEREAL_RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY\n    \\ingroup CEREAL_RAPIDJSON_CONFIG\n    \\brief User-defined kDefaultChunkCapacity definition.\n\n    User can define this as any \\c size that is a power of 2.\n*/\n\n#ifndef CEREAL_RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY\n#define CEREAL_RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY (64 * 1024)\n#endif\n\n\n///////////////////////////////////////////////////////////////////////////////\n// CrtAllocator\n\n//! C-runtime library allocator.\n/*! This class is just wrapper for standard C library memory routines.\n    \\note implements Allocator concept\n*/\nclass CrtAllocator {\npublic:\n    static const bool kNeedFree = true;\n    void* Malloc(size_t size) { \n        if (size) //  behavior of malloc(0) is implementation defined.\n            return std::malloc(size);\n        else\n            return NULL; // standardize to returning NULL.\n    }\n    void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) {\n        (void)originalSize;\n        if (newSize == 0) {\n            std::free(originalPtr);\n            return NULL;\n        }\n        return std::realloc(originalPtr, newSize);\n    }\n    static void Free(void *ptr) { std::free(ptr); }\n};\n\n///////////////////////////////////////////////////////////////////////////////\n// MemoryPoolAllocator\n\n//! Default memory allocator used by the parser and DOM.\n/*! This allocator allocate memory blocks from pre-allocated memory chunks. \n\n    It does not free memory blocks. And Realloc() only allocate new memory.\n\n    The memory chunks are allocated by BaseAllocator, which is CrtAllocator by default.\n\n    User may also supply a buffer as the first chunk.\n\n    If the user-buffer is full then additional chunks are allocated by BaseAllocator.\n\n    The user-buffer is not deallocated by this allocator.\n\n    \\tparam BaseAllocator the allocator type for allocating memory chunks. Default is CrtAllocator.\n    \\note implements Allocator concept\n*/\ntemplate <typename BaseAllocator = CrtAllocator>\nclass MemoryPoolAllocator {\npublic:\n    static const bool kNeedFree = false;    //!< Tell users that no need to call Free() with this allocator. (concept Allocator)\n\n    //! Constructor with chunkSize.\n    /*! \\param chunkSize The size of memory chunk. The default is kDefaultChunkSize.\n        \\param baseAllocator The allocator for allocating memory chunks.\n    */\n    MemoryPoolAllocator(size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : \n        chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(0), baseAllocator_(baseAllocator), ownBaseAllocator_(0)\n    {\n    }\n\n    //! Constructor with user-supplied buffer.\n    /*! The user buffer will be used firstly. When it is full, memory pool allocates new chunk with chunk size.\n\n        The user buffer will not be deallocated when this allocator is destructed.\n\n        \\param buffer User supplied buffer.\n        \\param size Size of the buffer in bytes. It must at least larger than sizeof(ChunkHeader).\n        \\param chunkSize The size of memory chunk. The default is kDefaultChunkSize.\n        \\param baseAllocator The allocator for allocating memory chunks.\n    */\n    MemoryPoolAllocator(void *buffer, size_t size, size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) :\n        chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(buffer), baseAllocator_(baseAllocator), ownBaseAllocator_(0)\n    {\n        CEREAL_RAPIDJSON_ASSERT(buffer != 0);\n        CEREAL_RAPIDJSON_ASSERT(size > sizeof(ChunkHeader));\n        chunkHead_ = reinterpret_cast<ChunkHeader*>(buffer);\n        chunkHead_->capacity = size - sizeof(ChunkHeader);\n        chunkHead_->size = 0;\n        chunkHead_->next = 0;\n    }\n\n    //! Destructor.\n    /*! This deallocates all memory chunks, excluding the user-supplied buffer.\n    */\n    ~MemoryPoolAllocator() {\n        Clear();\n        CEREAL_RAPIDJSON_DELETE(ownBaseAllocator_);\n    }\n\n    //! Deallocates all memory chunks, excluding the user-supplied buffer.\n    void Clear() {\n        while (chunkHead_ && chunkHead_ != userBuffer_) {\n            ChunkHeader* next = chunkHead_->next;\n            baseAllocator_->Free(chunkHead_);\n            chunkHead_ = next;\n        }\n        if (chunkHead_ && chunkHead_ == userBuffer_)\n            chunkHead_->size = 0; // Clear user buffer\n    }\n\n    //! Computes the total capacity of allocated memory chunks.\n    /*! \\return total capacity in bytes.\n    */\n    size_t Capacity() const {\n        size_t capacity = 0;\n        for (ChunkHeader* c = chunkHead_; c != 0; c = c->next)\n            capacity += c->capacity;\n        return capacity;\n    }\n\n    //! Computes the memory blocks allocated.\n    /*! \\return total used bytes.\n    */\n    size_t Size() const {\n        size_t size = 0;\n        for (ChunkHeader* c = chunkHead_; c != 0; c = c->next)\n            size += c->size;\n        return size;\n    }\n\n    //! Allocates a memory block. (concept Allocator)\n    void* Malloc(size_t size) {\n        if (!size)\n            return NULL;\n\n        size = CEREAL_RAPIDJSON_ALIGN(size);\n        if (chunkHead_ == 0 || chunkHead_->size + size > chunkHead_->capacity)\n            if (!AddChunk(chunk_capacity_ > size ? chunk_capacity_ : size))\n                return NULL;\n\n        void *buffer = reinterpret_cast<char *>(chunkHead_) + CEREAL_RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size;\n        chunkHead_->size += size;\n        return buffer;\n    }\n\n    //! Resizes a memory block (concept Allocator)\n    void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) {\n        if (originalPtr == 0)\n            return Malloc(newSize);\n\n        if (newSize == 0)\n            return NULL;\n\n        originalSize = CEREAL_RAPIDJSON_ALIGN(originalSize);\n        newSize = CEREAL_RAPIDJSON_ALIGN(newSize);\n\n        // Do not shrink if new size is smaller than original\n        if (originalSize >= newSize)\n            return originalPtr;\n\n        // Simply expand it if it is the last allocation and there is sufficient space\n        if (originalPtr == reinterpret_cast<char *>(chunkHead_) + CEREAL_RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size - originalSize) {\n            size_t increment = static_cast<size_t>(newSize - originalSize);\n            if (chunkHead_->size + increment <= chunkHead_->capacity) {\n                chunkHead_->size += increment;\n                return originalPtr;\n            }\n        }\n\n        // Realloc process: allocate and copy memory, do not free original buffer.\n        if (void* newBuffer = Malloc(newSize)) {\n            if (originalSize)\n                std::memcpy(newBuffer, originalPtr, originalSize);\n            return newBuffer;\n        }\n        else\n            return NULL;\n    }\n\n    //! Frees a memory block (concept Allocator)\n    static void Free(void *ptr) { (void)ptr; } // Do nothing\n\nprivate:\n    //! Copy constructor is not permitted.\n    MemoryPoolAllocator(const MemoryPoolAllocator& rhs) /* = delete */;\n    //! Copy assignment operator is not permitted.\n    MemoryPoolAllocator& operator=(const MemoryPoolAllocator& rhs) /* = delete */;\n\n    //! Creates a new chunk.\n    /*! \\param capacity Capacity of the chunk in bytes.\n        \\return true if success.\n    */\n    bool AddChunk(size_t capacity) {\n        if (!baseAllocator_)\n            ownBaseAllocator_ = baseAllocator_ = CEREAL_RAPIDJSON_NEW(BaseAllocator)();\n        if (ChunkHeader* chunk = reinterpret_cast<ChunkHeader*>(baseAllocator_->Malloc(CEREAL_RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + capacity))) {\n            chunk->capacity = capacity;\n            chunk->size = 0;\n            chunk->next = chunkHead_;\n            chunkHead_ =  chunk;\n            return true;\n        }\n        else\n            return false;\n    }\n\n    static const int kDefaultChunkCapacity = CEREAL_RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY; //!< Default chunk capacity.\n\n    //! Chunk header for perpending to each chunk.\n    /*! Chunks are stored as a singly linked list.\n    */\n    struct ChunkHeader {\n        size_t capacity;    //!< Capacity of the chunk in bytes (excluding the header itself).\n        size_t size;        //!< Current size of allocated memory in bytes.\n        ChunkHeader *next;  //!< Next chunk in the linked list.\n    };\n\n    ChunkHeader *chunkHead_;    //!< Head of the chunk linked-list. Only the head chunk serves allocation.\n    size_t chunk_capacity_;     //!< The minimum capacity of chunk when they are allocated.\n    void *userBuffer_;          //!< User supplied buffer.\n    BaseAllocator* baseAllocator_;  //!< base allocator for allocating memory chunks.\n    BaseAllocator* ownBaseAllocator_;   //!< base allocator created by this object.\n};\n\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#endif // CEREAL_RAPIDJSON_ENCODINGS_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/cursorstreamwrapper.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n//\n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed\n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n// CONDITIONS OF ANY KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_CURSORSTREAMWRAPPER_H_\n#define CEREAL_RAPIDJSON_CURSORSTREAMWRAPPER_H_\n\n#include \"stream.h\"\n\n#if defined(__GNUC__)\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(effc++)\n#endif\n\n#if defined(_MSC_VER) && _MSC_VER <= 1800\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(4702)  // unreachable code\nCEREAL_RAPIDJSON_DIAG_OFF(4512)  // assignment operator could not be generated\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n\n//! Cursor stream wrapper for counting line and column number if error exists.\n/*!\n    \\tparam InputStream     Any stream that implements Stream Concept\n*/\ntemplate <typename InputStream, typename Encoding = UTF8<> >\nclass CursorStreamWrapper : public GenericStreamWrapper<InputStream, Encoding> {\npublic:\n    typedef typename Encoding::Ch Ch;\n\n    CursorStreamWrapper(InputStream& is):\n        GenericStreamWrapper<InputStream, Encoding>(is), line_(1), col_(0) {}\n\n    // counting line and column number\n    Ch Take() {\n        Ch ch = this->is_.Take();\n        if(ch == '\\n') {\n            line_ ++;\n            col_ = 0;\n        } else {\n            col_ ++;\n        }\n        return ch;\n    }\n\n    //! Get the error line number, if error exists.\n    size_t GetLine() const { return line_; }\n    //! Get the error column number, if error exists.\n    size_t GetColumn() const { return col_; }\n\nprivate:\n    size_t line_;   //!< Current Line\n    size_t col_;    //!< Current Column\n};\n\n#if defined(_MSC_VER) && _MSC_VER <= 1800\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#if defined(__GNUC__)\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#endif // CEREAL_RAPIDJSON_CURSORSTREAMWRAPPER_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/document.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n//\n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed\n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n// CONDITIONS OF ANY KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_DOCUMENT_H_\n#define CEREAL_RAPIDJSON_DOCUMENT_H_\n\n/*! \\file document.h */\n\n#include \"reader.h\"\n#include \"internal/meta.h\"\n#include \"internal/strfunc.h\"\n#include \"memorystream.h\"\n#include \"encodedstream.h\"\n#include <new>      // placement new\n#include <limits>\n\nCEREAL_RAPIDJSON_DIAG_PUSH\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_OFF(padded)\nCEREAL_RAPIDJSON_DIAG_OFF(switch-enum)\nCEREAL_RAPIDJSON_DIAG_OFF(c++98-compat)\n#elif defined(_MSC_VER)\nCEREAL_RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant\nCEREAL_RAPIDJSON_DIAG_OFF(4244) // conversion from kXxxFlags to 'uint16_t', possible loss of data\n#endif\n\n#ifdef __GNUC__\nCEREAL_RAPIDJSON_DIAG_OFF(effc++)\n#endif // __GNUC__\n\n#ifndef CEREAL_RAPIDJSON_NOMEMBERITERATORCLASS\n#include <iterator> // std::random_access_iterator_tag\n#endif\n\n#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n#include <utility> // std::move\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n// Forward declaration.\ntemplate <typename Encoding, typename Allocator>\nclass GenericValue;\n\ntemplate <typename Encoding, typename Allocator, typename StackAllocator>\nclass GenericDocument;\n\n//! Name-value pair in a JSON object value.\n/*!\n    This class was internal to GenericValue. It used to be a inner struct.\n    But a compiler (IBM XL C/C++ for AIX) have reported to have problem with that so it moved as a namespace scope struct.\n    https://code.google.com/p/rapidjson/issues/detail?id=64\n*/\ntemplate <typename Encoding, typename Allocator>\nstruct GenericMember {\n    GenericValue<Encoding, Allocator> name;     //!< name of member (must be a string)\n    GenericValue<Encoding, Allocator> value;    //!< value of member.\n\n    // swap() for std::sort() and other potential use in STL.\n    friend inline void swap(GenericMember& a, GenericMember& b) CEREAL_RAPIDJSON_NOEXCEPT {\n        a.name.Swap(b.name);\n        a.value.Swap(b.value);\n    }\n};\n\n///////////////////////////////////////////////////////////////////////////////\n// GenericMemberIterator\n\n#ifndef CEREAL_RAPIDJSON_NOMEMBERITERATORCLASS\n\n//! (Constant) member iterator for a JSON object value\n/*!\n    \\tparam Const Is this a constant iterator?\n    \\tparam Encoding    Encoding of the value. (Even non-string values need to have the same encoding in a document)\n    \\tparam Allocator   Allocator type for allocating memory of object, array and string.\n\n    This class implements a Random Access Iterator for GenericMember elements\n    of a GenericValue, see ISO/IEC 14882:2003(E) C++ standard, 24.1 [lib.iterator.requirements].\n\n    \\note This iterator implementation is mainly intended to avoid implicit\n        conversions from iterator values to \\c NULL,\n        e.g. from GenericValue::FindMember.\n\n    \\note Define \\c CEREAL_RAPIDJSON_NOMEMBERITERATORCLASS to fall back to a\n        pointer-based implementation, if your platform doesn't provide\n        the C++ <iterator> header.\n\n    \\see GenericMember, GenericValue::MemberIterator, GenericValue::ConstMemberIterator\n */\ntemplate <bool Const, typename Encoding, typename Allocator>\nclass GenericMemberIterator {\n\n    friend class GenericValue<Encoding,Allocator>;\n    template <bool, typename, typename> friend class GenericMemberIterator;\n\n    typedef GenericMember<Encoding,Allocator> PlainType;\n    typedef typename internal::MaybeAddConst<Const,PlainType>::Type ValueType;\n\npublic:\n    //! Iterator type itself\n    typedef GenericMemberIterator Iterator;\n    //! Constant iterator type\n    typedef GenericMemberIterator<true,Encoding,Allocator>  ConstIterator;\n    //! Non-constant iterator type\n    typedef GenericMemberIterator<false,Encoding,Allocator> NonConstIterator;\n\n    /** \\name std::iterator_traits support */\n    //@{\n    typedef ValueType      value_type;\n    typedef ValueType *    pointer;\n    typedef ValueType &    reference;\n    typedef std::ptrdiff_t difference_type;\n    typedef std::random_access_iterator_tag iterator_category;\n    //@}\n\n    //! Pointer to (const) GenericMember\n    typedef pointer         Pointer;\n    //! Reference to (const) GenericMember\n    typedef reference       Reference;\n    //! Signed integer type (e.g. \\c ptrdiff_t)\n    typedef difference_type DifferenceType;\n\n    //! Default constructor (singular value)\n    /*! Creates an iterator pointing to no element.\n        \\note All operations, except for comparisons, are undefined on such values.\n     */\n    GenericMemberIterator() : ptr_() {}\n\n    //! Iterator conversions to more const\n    /*!\n        \\param it (Non-const) iterator to copy from\n\n        Allows the creation of an iterator from another GenericMemberIterator\n        that is \"less const\".  Especially, creating a non-constant iterator\n        from a constant iterator are disabled:\n        \\li const -> non-const (not ok)\n        \\li const -> const (ok)\n        \\li non-const -> const (ok)\n        \\li non-const -> non-const (ok)\n\n        \\note If the \\c Const template parameter is already \\c false, this\n            constructor effectively defines a regular copy-constructor.\n            Otherwise, the copy constructor is implicitly defined.\n    */\n    GenericMemberIterator(const NonConstIterator & it) : ptr_(it.ptr_) {}\n    Iterator& operator=(const NonConstIterator & it) { ptr_ = it.ptr_; return *this; }\n\n    //! @name stepping\n    //@{\n    Iterator& operator++(){ ++ptr_; return *this; }\n    Iterator& operator--(){ --ptr_; return *this; }\n    Iterator  operator++(int){ Iterator old(*this); ++ptr_; return old; }\n    Iterator  operator--(int){ Iterator old(*this); --ptr_; return old; }\n    //@}\n\n    //! @name increment/decrement\n    //@{\n    Iterator operator+(DifferenceType n) const { return Iterator(ptr_+n); }\n    Iterator operator-(DifferenceType n) const { return Iterator(ptr_-n); }\n\n    Iterator& operator+=(DifferenceType n) { ptr_+=n; return *this; }\n    Iterator& operator-=(DifferenceType n) { ptr_-=n; return *this; }\n    //@}\n\n    //! @name relations\n    //@{\n    bool operator==(ConstIterator that) const { return ptr_ == that.ptr_; }\n    bool operator!=(ConstIterator that) const { return ptr_ != that.ptr_; }\n    bool operator<=(ConstIterator that) const { return ptr_ <= that.ptr_; }\n    bool operator>=(ConstIterator that) const { return ptr_ >= that.ptr_; }\n    bool operator< (ConstIterator that) const { return ptr_ < that.ptr_; }\n    bool operator> (ConstIterator that) const { return ptr_ > that.ptr_; }\n    //@}\n\n    //! @name dereference\n    //@{\n    Reference operator*() const { return *ptr_; }\n    Pointer   operator->() const { return ptr_; }\n    Reference operator[](DifferenceType n) const { return ptr_[n]; }\n    //@}\n\n    //! Distance\n    DifferenceType operator-(ConstIterator that) const { return ptr_-that.ptr_; }\n\nprivate:\n    //! Internal constructor from plain pointer\n    explicit GenericMemberIterator(Pointer p) : ptr_(p) {}\n\n    Pointer ptr_; //!< raw pointer\n};\n\n#else // CEREAL_RAPIDJSON_NOMEMBERITERATORCLASS\n\n// class-based member iterator implementation disabled, use plain pointers\n\ntemplate <bool Const, typename Encoding, typename Allocator>\nclass GenericMemberIterator;\n\n//! non-const GenericMemberIterator\ntemplate <typename Encoding, typename Allocator>\nclass GenericMemberIterator<false,Encoding,Allocator> {\n    //! use plain pointer as iterator type\n    typedef GenericMember<Encoding,Allocator>* Iterator;\n};\n//! const GenericMemberIterator\ntemplate <typename Encoding, typename Allocator>\nclass GenericMemberIterator<true,Encoding,Allocator> {\n    //! use plain const pointer as iterator type\n    typedef const GenericMember<Encoding,Allocator>* Iterator;\n};\n\n#endif // CEREAL_RAPIDJSON_NOMEMBERITERATORCLASS\n\n///////////////////////////////////////////////////////////////////////////////\n// GenericStringRef\n\n//! Reference to a constant string (not taking a copy)\n/*!\n    \\tparam CharType character type of the string\n\n    This helper class is used to automatically infer constant string\n    references for string literals, especially from \\c const \\b (!)\n    character arrays.\n\n    The main use is for creating JSON string values without copying the\n    source string via an \\ref Allocator.  This requires that the referenced\n    string pointers have a sufficient lifetime, which exceeds the lifetime\n    of the associated GenericValue.\n\n    \\b Example\n    \\code\n    Value v(\"foo\");   // ok, no need to copy & calculate length\n    const char foo[] = \"foo\";\n    v.SetString(foo); // ok\n\n    const char* bar = foo;\n    // Value x(bar); // not ok, can't rely on bar's lifetime\n    Value x(StringRef(bar)); // lifetime explicitly guaranteed by user\n    Value y(StringRef(bar, 3));  // ok, explicitly pass length\n    \\endcode\n\n    \\see StringRef, GenericValue::SetString\n*/\ntemplate<typename CharType>\nstruct GenericStringRef {\n    typedef CharType Ch; //!< character type of the string\n\n    //! Create string reference from \\c const character array\n#ifndef __clang__ // -Wdocumentation\n    /*!\n        This constructor implicitly creates a constant string reference from\n        a \\c const character array.  It has better performance than\n        \\ref StringRef(const CharType*) by inferring the string \\ref length\n        from the array length, and also supports strings containing null\n        characters.\n\n        \\tparam N length of the string, automatically inferred\n\n        \\param str Constant character array, lifetime assumed to be longer\n            than the use of the string in e.g. a GenericValue\n\n        \\post \\ref s == str\n\n        \\note Constant complexity.\n        \\note There is a hidden, private overload to disallow references to\n            non-const character arrays to be created via this constructor.\n            By this, e.g. function-scope arrays used to be filled via\n            \\c snprintf are excluded from consideration.\n            In such cases, the referenced string should be \\b copied to the\n            GenericValue instead.\n     */\n#endif\n    template<SizeType N>\n    GenericStringRef(const CharType (&str)[N]) CEREAL_RAPIDJSON_NOEXCEPT\n        : s(str), length(N-1) {}\n\n    //! Explicitly create string reference from \\c const character pointer\n#ifndef __clang__ // -Wdocumentation\n    /*!\n        This constructor can be used to \\b explicitly  create a reference to\n        a constant string pointer.\n\n        \\see StringRef(const CharType*)\n\n        \\param str Constant character pointer, lifetime assumed to be longer\n            than the use of the string in e.g. a GenericValue\n\n        \\post \\ref s == str\n\n        \\note There is a hidden, private overload to disallow references to\n            non-const character arrays to be created via this constructor.\n            By this, e.g. function-scope arrays used to be filled via\n            \\c snprintf are excluded from consideration.\n            In such cases, the referenced string should be \\b copied to the\n            GenericValue instead.\n     */\n#endif\n    explicit GenericStringRef(const CharType* str)\n        : s(str), length(NotNullStrLen(str)) {}\n\n    //! Create constant string reference from pointer and length\n#ifndef __clang__ // -Wdocumentation\n    /*! \\param str constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue\n        \\param len length of the string, excluding the trailing NULL terminator\n\n        \\post \\ref s == str && \\ref length == len\n        \\note Constant complexity.\n     */\n#endif\n    GenericStringRef(const CharType* str, SizeType len)\n        : s(CEREAL_RAPIDJSON_LIKELY(str) ? str : emptyString), length(len) { CEREAL_RAPIDJSON_ASSERT(str != 0 || len == 0u); }\n\n    GenericStringRef(const GenericStringRef& rhs) : s(rhs.s), length(rhs.length) {}\n\n    //! implicit conversion to plain CharType pointer\n    operator const Ch *() const { return s; }\n\n    const Ch* const s; //!< plain CharType pointer\n    const SizeType length; //!< length of the string (excluding the trailing NULL terminator)\n\nprivate:\n    SizeType NotNullStrLen(const CharType* str) {\n        CEREAL_RAPIDJSON_ASSERT(str != 0);\n        return internal::StrLen(str);\n    }\n\n    /// Empty string - used when passing in a NULL pointer\n    static const Ch emptyString[];\n\n    //! Disallow construction from non-const array\n    template<SizeType N>\n    GenericStringRef(CharType (&str)[N]) /* = delete */;\n    //! Copy assignment operator not permitted - immutable type\n    GenericStringRef& operator=(const GenericStringRef& rhs) /* = delete */;\n};\n\ntemplate<typename CharType>\nconst CharType GenericStringRef<CharType>::emptyString[] = { CharType() };\n\n//! Mark a character pointer as constant string\n/*! Mark a plain character pointer as a \"string literal\".  This function\n    can be used to avoid copying a character string to be referenced as a\n    value in a JSON GenericValue object, if the string's lifetime is known\n    to be valid long enough.\n    \\tparam CharType Character type of the string\n    \\param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue\n    \\return GenericStringRef string reference object\n    \\relatesalso GenericStringRef\n\n    \\see GenericValue::GenericValue(StringRefType), GenericValue::operator=(StringRefType), GenericValue::SetString(StringRefType), GenericValue::PushBack(StringRefType, Allocator&), GenericValue::AddMember\n*/\ntemplate<typename CharType>\ninline GenericStringRef<CharType> StringRef(const CharType* str) {\n    return GenericStringRef<CharType>(str);\n}\n\n//! Mark a character pointer as constant string\n/*! Mark a plain character pointer as a \"string literal\".  This function\n    can be used to avoid copying a character string to be referenced as a\n    value in a JSON GenericValue object, if the string's lifetime is known\n    to be valid long enough.\n\n    This version has better performance with supplied length, and also\n    supports string containing null characters.\n\n    \\tparam CharType character type of the string\n    \\param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue\n    \\param length The length of source string.\n    \\return GenericStringRef string reference object\n    \\relatesalso GenericStringRef\n*/\ntemplate<typename CharType>\ninline GenericStringRef<CharType> StringRef(const CharType* str, size_t length) {\n    return GenericStringRef<CharType>(str, SizeType(length));\n}\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n//! Mark a string object as constant string\n/*! Mark a string object (e.g. \\c std::string) as a \"string literal\".\n    This function can be used to avoid copying a string to be referenced as a\n    value in a JSON GenericValue object, if the string's lifetime is known\n    to be valid long enough.\n\n    \\tparam CharType character type of the string\n    \\param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue\n    \\return GenericStringRef string reference object\n    \\relatesalso GenericStringRef\n    \\note Requires the definition of the preprocessor symbol \\ref CEREAL_RAPIDJSON_HAS_STDSTRING.\n*/\ntemplate<typename CharType>\ninline GenericStringRef<CharType> StringRef(const std::basic_string<CharType>& str) {\n    return GenericStringRef<CharType>(str.data(), SizeType(str.size()));\n}\n#endif\n\n///////////////////////////////////////////////////////////////////////////////\n// GenericValue type traits\nnamespace internal {\n\ntemplate <typename T, typename Encoding = void, typename Allocator = void>\nstruct IsGenericValueImpl : FalseType {};\n\n// select candidates according to nested encoding and allocator types\ntemplate <typename T> struct IsGenericValueImpl<T, typename Void<typename T::EncodingType>::Type, typename Void<typename T::AllocatorType>::Type>\n    : IsBaseOf<GenericValue<typename T::EncodingType, typename T::AllocatorType>, T>::Type {};\n\n// helper to match arbitrary GenericValue instantiations, including derived classes\ntemplate <typename T> struct IsGenericValue : IsGenericValueImpl<T>::Type {};\n\n} // namespace internal\n\n///////////////////////////////////////////////////////////////////////////////\n// TypeHelper\n\nnamespace internal {\n\ntemplate <typename ValueType, typename T>\nstruct TypeHelper {};\n\ntemplate<typename ValueType>\nstruct TypeHelper<ValueType, bool> {\n    static bool Is(const ValueType& v) { return v.IsBool(); }\n    static bool Get(const ValueType& v) { return v.GetBool(); }\n    static ValueType& Set(ValueType& v, bool data) { return v.SetBool(data); }\n    static ValueType& Set(ValueType& v, bool data, typename ValueType::AllocatorType&) { return v.SetBool(data); }\n};\n\ntemplate<typename ValueType>\nstruct TypeHelper<ValueType, int> {\n    static bool Is(const ValueType& v) { return v.IsInt(); }\n    static int Get(const ValueType& v) { return v.GetInt(); }\n    static ValueType& Set(ValueType& v, int data) { return v.SetInt(data); }\n    static ValueType& Set(ValueType& v, int data, typename ValueType::AllocatorType&) { return v.SetInt(data); }\n};\n\ntemplate<typename ValueType>\nstruct TypeHelper<ValueType, unsigned> {\n    static bool Is(const ValueType& v) { return v.IsUint(); }\n    static unsigned Get(const ValueType& v) { return v.GetUint(); }\n    static ValueType& Set(ValueType& v, unsigned data) { return v.SetUint(data); }\n    static ValueType& Set(ValueType& v, unsigned data, typename ValueType::AllocatorType&) { return v.SetUint(data); }\n};\n\n#ifdef _MSC_VER\nCEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(long) == sizeof(int));\ntemplate<typename ValueType>\nstruct TypeHelper<ValueType, long> {\n    static bool Is(const ValueType& v) { return v.IsInt(); }\n    static long Get(const ValueType& v) { return v.GetInt(); }\n    static ValueType& Set(ValueType& v, long data) { return v.SetInt(data); }\n    static ValueType& Set(ValueType& v, long data, typename ValueType::AllocatorType&) { return v.SetInt(data); }\n};\n\nCEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(unsigned long) == sizeof(unsigned));\ntemplate<typename ValueType>\nstruct TypeHelper<ValueType, unsigned long> {\n    static bool Is(const ValueType& v) { return v.IsUint(); }\n    static unsigned long Get(const ValueType& v) { return v.GetUint(); }\n    static ValueType& Set(ValueType& v, unsigned long data) { return v.SetUint(data); }\n    static ValueType& Set(ValueType& v, unsigned long data, typename ValueType::AllocatorType&) { return v.SetUint(data); }\n};\n#endif\n\ntemplate<typename ValueType>\nstruct TypeHelper<ValueType, int64_t> {\n    static bool Is(const ValueType& v) { return v.IsInt64(); }\n    static int64_t Get(const ValueType& v) { return v.GetInt64(); }\n    static ValueType& Set(ValueType& v, int64_t data) { return v.SetInt64(data); }\n    static ValueType& Set(ValueType& v, int64_t data, typename ValueType::AllocatorType&) { return v.SetInt64(data); }\n};\n\ntemplate<typename ValueType>\nstruct TypeHelper<ValueType, uint64_t> {\n    static bool Is(const ValueType& v) { return v.IsUint64(); }\n    static uint64_t Get(const ValueType& v) { return v.GetUint64(); }\n    static ValueType& Set(ValueType& v, uint64_t data) { return v.SetUint64(data); }\n    static ValueType& Set(ValueType& v, uint64_t data, typename ValueType::AllocatorType&) { return v.SetUint64(data); }\n};\n\ntemplate<typename ValueType>\nstruct TypeHelper<ValueType, double> {\n    static bool Is(const ValueType& v) { return v.IsDouble(); }\n    static double Get(const ValueType& v) { return v.GetDouble(); }\n    static ValueType& Set(ValueType& v, double data) { return v.SetDouble(data); }\n    static ValueType& Set(ValueType& v, double data, typename ValueType::AllocatorType&) { return v.SetDouble(data); }\n};\n\ntemplate<typename ValueType>\nstruct TypeHelper<ValueType, float> {\n    static bool Is(const ValueType& v) { return v.IsFloat(); }\n    static float Get(const ValueType& v) { return v.GetFloat(); }\n    static ValueType& Set(ValueType& v, float data) { return v.SetFloat(data); }\n    static ValueType& Set(ValueType& v, float data, typename ValueType::AllocatorType&) { return v.SetFloat(data); }\n};\n\ntemplate<typename ValueType>\nstruct TypeHelper<ValueType, const typename ValueType::Ch*> {\n    typedef const typename ValueType::Ch* StringType;\n    static bool Is(const ValueType& v) { return v.IsString(); }\n    static StringType Get(const ValueType& v) { return v.GetString(); }\n    static ValueType& Set(ValueType& v, const StringType data) { return v.SetString(typename ValueType::StringRefType(data)); }\n    static ValueType& Set(ValueType& v, const StringType data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); }\n};\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\ntemplate<typename ValueType>\nstruct TypeHelper<ValueType, std::basic_string<typename ValueType::Ch> > {\n    typedef std::basic_string<typename ValueType::Ch> StringType;\n    static bool Is(const ValueType& v) { return v.IsString(); }\n    static StringType Get(const ValueType& v) { return StringType(v.GetString(), v.GetStringLength()); }\n    static ValueType& Set(ValueType& v, const StringType& data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); }\n};\n#endif\n\ntemplate<typename ValueType>\nstruct TypeHelper<ValueType, typename ValueType::Array> {\n    typedef typename ValueType::Array ArrayType;\n    static bool Is(const ValueType& v) { return v.IsArray(); }\n    static ArrayType Get(ValueType& v) { return v.GetArray(); }\n    static ValueType& Set(ValueType& v, ArrayType data) { return v = data; }\n    static ValueType& Set(ValueType& v, ArrayType data, typename ValueType::AllocatorType&) { return v = data; }\n};\n\ntemplate<typename ValueType>\nstruct TypeHelper<ValueType, typename ValueType::ConstArray> {\n    typedef typename ValueType::ConstArray ArrayType;\n    static bool Is(const ValueType& v) { return v.IsArray(); }\n    static ArrayType Get(const ValueType& v) { return v.GetArray(); }\n};\n\ntemplate<typename ValueType>\nstruct TypeHelper<ValueType, typename ValueType::Object> {\n    typedef typename ValueType::Object ObjectType;\n    static bool Is(const ValueType& v) { return v.IsObject(); }\n    static ObjectType Get(ValueType& v) { return v.GetObject(); }\n    static ValueType& Set(ValueType& v, ObjectType data) { return v = data; }\n    static ValueType& Set(ValueType& v, ObjectType data, typename ValueType::AllocatorType&) { return v = data; }\n};\n\ntemplate<typename ValueType>\nstruct TypeHelper<ValueType, typename ValueType::ConstObject> {\n    typedef typename ValueType::ConstObject ObjectType;\n    static bool Is(const ValueType& v) { return v.IsObject(); }\n    static ObjectType Get(const ValueType& v) { return v.GetObject(); }\n};\n\n} // namespace internal\n\n// Forward declarations\ntemplate <bool, typename> class GenericArray;\ntemplate <bool, typename> class GenericObject;\n\n///////////////////////////////////////////////////////////////////////////////\n// GenericValue\n\n//! Represents a JSON value. Use Value for UTF8 encoding and default allocator.\n/*!\n    A JSON value can be one of 7 types. This class is a variant type supporting\n    these types.\n\n    Use the Value if UTF8 and default allocator\n\n    \\tparam Encoding    Encoding of the value. (Even non-string values need to have the same encoding in a document)\n    \\tparam Allocator   Allocator type for allocating memory of object, array and string.\n*/\ntemplate <typename Encoding, typename Allocator = MemoryPoolAllocator<> >\nclass GenericValue {\npublic:\n    //! Name-value pair in an object.\n    typedef GenericMember<Encoding, Allocator> Member;\n    typedef Encoding EncodingType;                  //!< Encoding type from template parameter.\n    typedef Allocator AllocatorType;                //!< Allocator type from template parameter.\n    typedef typename Encoding::Ch Ch;               //!< Character type derived from Encoding.\n    typedef GenericStringRef<Ch> StringRefType;     //!< Reference to a constant string\n    typedef typename GenericMemberIterator<false,Encoding,Allocator>::Iterator MemberIterator;  //!< Member iterator for iterating in object.\n    typedef typename GenericMemberIterator<true,Encoding,Allocator>::Iterator ConstMemberIterator;  //!< Constant member iterator for iterating in object.\n    typedef GenericValue* ValueIterator;            //!< Value iterator for iterating in array.\n    typedef const GenericValue* ConstValueIterator; //!< Constant value iterator for iterating in array.\n    typedef GenericValue<Encoding, Allocator> ValueType;    //!< Value type of itself.\n    typedef GenericArray<false, ValueType> Array;\n    typedef GenericArray<true, ValueType> ConstArray;\n    typedef GenericObject<false, ValueType> Object;\n    typedef GenericObject<true, ValueType> ConstObject;\n\n    //!@name Constructors and destructor.\n    //@{\n\n    //! Default constructor creates a null value.\n    GenericValue() CEREAL_RAPIDJSON_NOEXCEPT : data_() { data_.f.flags = kNullFlag; }\n\n#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n    //! Move constructor in C++11\n    GenericValue(GenericValue&& rhs) CEREAL_RAPIDJSON_NOEXCEPT : data_(rhs.data_) {\n        rhs.data_.f.flags = kNullFlag; // give up contents\n    }\n#endif\n\nprivate:\n    //! Copy constructor is not permitted.\n    GenericValue(const GenericValue& rhs);\n\n#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n    //! Moving from a GenericDocument is not permitted.\n    template <typename StackAllocator>\n    GenericValue(GenericDocument<Encoding,Allocator,StackAllocator>&& rhs);\n\n    //! Move assignment from a GenericDocument is not permitted.\n    template <typename StackAllocator>\n    GenericValue& operator=(GenericDocument<Encoding,Allocator,StackAllocator>&& rhs);\n#endif\n\npublic:\n\n    //! Constructor with JSON value type.\n    /*! This creates a Value of specified type with default content.\n        \\param type Type of the value.\n        \\note Default content for number is zero.\n    */\n    explicit GenericValue(Type type) CEREAL_RAPIDJSON_NOEXCEPT : data_() {\n        static const uint16_t defaultFlags[] = {\n            kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag,\n            kNumberAnyFlag\n        };\n        CEREAL_RAPIDJSON_NOEXCEPT_ASSERT(type >= kNullType && type <= kNumberType);\n        data_.f.flags = defaultFlags[type];\n\n        // Use ShortString to store empty string.\n        if (type == kStringType)\n            data_.ss.SetLength(0);\n    }\n\n    //! Explicit copy constructor (with allocator)\n    /*! Creates a copy of a Value by using the given Allocator\n        \\tparam SourceAllocator allocator of \\c rhs\n        \\param rhs Value to copy from (read-only)\n        \\param allocator Allocator for allocating copied elements and buffers. Commonly use GenericDocument::GetAllocator().\n        \\param copyConstStrings Force copying of constant strings (e.g. referencing an in-situ buffer)\n        \\see CopyFrom()\n    */\n    template <typename SourceAllocator>\n    GenericValue(const GenericValue<Encoding,SourceAllocator>& rhs, Allocator& allocator, bool copyConstStrings = false) {\n        switch (rhs.GetType()) {\n        case kObjectType: {\n                SizeType count = rhs.data_.o.size;\n                Member* lm = reinterpret_cast<Member*>(allocator.Malloc(count * sizeof(Member)));\n                const typename GenericValue<Encoding,SourceAllocator>::Member* rm = rhs.GetMembersPointer();\n                for (SizeType i = 0; i < count; i++) {\n                    new (&lm[i].name) GenericValue(rm[i].name, allocator, copyConstStrings);\n                    new (&lm[i].value) GenericValue(rm[i].value, allocator, copyConstStrings);\n                }\n                data_.f.flags = kObjectFlag;\n                data_.o.size = data_.o.capacity = count;\n                SetMembersPointer(lm);\n            }\n            break;\n        case kArrayType: {\n                SizeType count = rhs.data_.a.size;\n                GenericValue* le = reinterpret_cast<GenericValue*>(allocator.Malloc(count * sizeof(GenericValue)));\n                const GenericValue<Encoding,SourceAllocator>* re = rhs.GetElementsPointer();\n                for (SizeType i = 0; i < count; i++)\n                    new (&le[i]) GenericValue(re[i], allocator, copyConstStrings);\n                data_.f.flags = kArrayFlag;\n                data_.a.size = data_.a.capacity = count;\n                SetElementsPointer(le);\n            }\n            break;\n        case kStringType:\n            if (rhs.data_.f.flags == kConstStringFlag && !copyConstStrings) {\n                data_.f.flags = rhs.data_.f.flags;\n                data_  = *reinterpret_cast<const Data*>(&rhs.data_);\n            }\n            else\n                SetStringRaw(StringRef(rhs.GetString(), rhs.GetStringLength()), allocator);\n            break;\n        default:\n            data_.f.flags = rhs.data_.f.flags;\n            data_  = *reinterpret_cast<const Data*>(&rhs.data_);\n            break;\n        }\n    }\n\n    //! Constructor for boolean value.\n    /*! \\param b Boolean value\n        \\note This constructor is limited to \\em real boolean values and rejects\n            implicitly converted types like arbitrary pointers.  Use an explicit cast\n            to \\c bool, if you want to construct a boolean JSON value in such cases.\n     */\n#ifndef CEREAL_RAPIDJSON_DOXYGEN_RUNNING // hide SFINAE from Doxygen\n    template <typename T>\n    explicit GenericValue(T b, CEREAL_RAPIDJSON_ENABLEIF((internal::IsSame<bool, T>))) CEREAL_RAPIDJSON_NOEXCEPT  // See #472\n#else\n    explicit GenericValue(bool b) CEREAL_RAPIDJSON_NOEXCEPT\n#endif\n        : data_() {\n            // safe-guard against failing SFINAE\n            CEREAL_RAPIDJSON_STATIC_ASSERT((internal::IsSame<bool,T>::Value));\n            data_.f.flags = b ? kTrueFlag : kFalseFlag;\n    }\n\n    //! Constructor for int value.\n    explicit GenericValue(int i) CEREAL_RAPIDJSON_NOEXCEPT : data_() {\n        data_.n.i64 = i;\n        data_.f.flags = (i >= 0) ? (kNumberIntFlag | kUintFlag | kUint64Flag) : kNumberIntFlag;\n    }\n\n    //! Constructor for unsigned value.\n    explicit GenericValue(unsigned u) CEREAL_RAPIDJSON_NOEXCEPT : data_() {\n        data_.n.u64 = u;\n        data_.f.flags = (u & 0x80000000) ? kNumberUintFlag : (kNumberUintFlag | kIntFlag | kInt64Flag);\n    }\n\n    //! Constructor for int64_t value.\n    explicit GenericValue(int64_t i64) CEREAL_RAPIDJSON_NOEXCEPT : data_() {\n        data_.n.i64 = i64;\n        data_.f.flags = kNumberInt64Flag;\n        if (i64 >= 0) {\n            data_.f.flags |= kNumberUint64Flag;\n            if (!(static_cast<uint64_t>(i64) & CEREAL_RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000)))\n                data_.f.flags |= kUintFlag;\n            if (!(static_cast<uint64_t>(i64) & CEREAL_RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000)))\n                data_.f.flags |= kIntFlag;\n        }\n        else if (i64 >= static_cast<int64_t>(CEREAL_RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000)))\n            data_.f.flags |= kIntFlag;\n    }\n\n    //! Constructor for uint64_t value.\n    explicit GenericValue(uint64_t u64) CEREAL_RAPIDJSON_NOEXCEPT : data_() {\n        data_.n.u64 = u64;\n        data_.f.flags = kNumberUint64Flag;\n        if (!(u64 & CEREAL_RAPIDJSON_UINT64_C2(0x80000000, 0x00000000)))\n            data_.f.flags |= kInt64Flag;\n        if (!(u64 & CEREAL_RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000)))\n            data_.f.flags |= kUintFlag;\n        if (!(u64 & CEREAL_RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000)))\n            data_.f.flags |= kIntFlag;\n    }\n\n    //! Constructor for double value.\n    explicit GenericValue(double d) CEREAL_RAPIDJSON_NOEXCEPT : data_() { data_.n.d = d; data_.f.flags = kNumberDoubleFlag; }\n\n    //! Constructor for float value.\n    explicit GenericValue(float f) CEREAL_RAPIDJSON_NOEXCEPT : data_() { data_.n.d = static_cast<double>(f); data_.f.flags = kNumberDoubleFlag; }\n\n    //! Constructor for constant string (i.e. do not make a copy of string)\n    GenericValue(const Ch* s, SizeType length) CEREAL_RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(StringRef(s, length)); }\n\n    //! Constructor for constant string (i.e. do not make a copy of string)\n    explicit GenericValue(StringRefType s) CEREAL_RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(s); }\n\n    //! Constructor for copy-string (i.e. do make a copy of string)\n    GenericValue(const Ch* s, SizeType length, Allocator& allocator) : data_() { SetStringRaw(StringRef(s, length), allocator); }\n\n    //! Constructor for copy-string (i.e. do make a copy of string)\n    GenericValue(const Ch*s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); }\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    //! Constructor for copy-string from a string object (i.e. do make a copy of string)\n    /*! \\note Requires the definition of the preprocessor symbol \\ref CEREAL_RAPIDJSON_HAS_STDSTRING.\n     */\n    GenericValue(const std::basic_string<Ch>& s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); }\n#endif\n\n    //! Constructor for Array.\n    /*!\n        \\param a An array obtained by \\c GetArray().\n        \\note \\c Array is always pass-by-value.\n        \\note the source array is moved into this value and the sourec array becomes empty.\n    */\n    GenericValue(Array a) CEREAL_RAPIDJSON_NOEXCEPT : data_(a.value_.data_) {\n        a.value_.data_ = Data();\n        a.value_.data_.f.flags = kArrayFlag;\n    }\n\n    //! Constructor for Object.\n    /*!\n        \\param o An object obtained by \\c GetObject().\n        \\note \\c Object is always pass-by-value.\n        \\note the source object is moved into this value and the sourec object becomes empty.\n    */\n    GenericValue(Object o) CEREAL_RAPIDJSON_NOEXCEPT : data_(o.value_.data_) {\n        o.value_.data_ = Data();\n        o.value_.data_.f.flags = kObjectFlag;\n    }\n\n    //! Destructor.\n    /*! Need to destruct elements of array, members of object, or copy-string.\n    */\n    ~GenericValue() {\n        if (Allocator::kNeedFree) { // Shortcut by Allocator's trait\n            switch(data_.f.flags) {\n            case kArrayFlag:\n                {\n                    GenericValue* e = GetElementsPointer();\n                    for (GenericValue* v = e; v != e + data_.a.size; ++v)\n                        v->~GenericValue();\n                    Allocator::Free(e);\n                }\n                break;\n\n            case kObjectFlag:\n                for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m)\n                    m->~Member();\n                Allocator::Free(GetMembersPointer());\n                break;\n\n            case kCopyStringFlag:\n                Allocator::Free(const_cast<Ch*>(GetStringPointer()));\n                break;\n\n            default:\n                break;  // Do nothing for other types.\n            }\n        }\n    }\n\n    //@}\n\n    //!@name Assignment operators\n    //@{\n\n    //! Assignment with move semantics.\n    /*! \\param rhs Source of the assignment. It will become a null value after assignment.\n    */\n    GenericValue& operator=(GenericValue& rhs) CEREAL_RAPIDJSON_NOEXCEPT {\n        if (CEREAL_RAPIDJSON_LIKELY(this != &rhs)) {\n            this->~GenericValue();\n            RawAssign(rhs);\n        }\n        return *this;\n    }\n\n#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n    //! Move assignment in C++11\n    GenericValue& operator=(GenericValue&& rhs) CEREAL_RAPIDJSON_NOEXCEPT {\n        return *this = rhs.Move();\n    }\n#endif\n\n    //! Assignment of constant string reference (no copy)\n    /*! \\param str Constant string reference to be assigned\n        \\note This overload is needed to avoid clashes with the generic primitive type assignment overload below.\n        \\see GenericStringRef, operator=(T)\n    */\n    GenericValue& operator=(StringRefType str) CEREAL_RAPIDJSON_NOEXCEPT {\n        GenericValue s(str);\n        return *this = s;\n    }\n\n    //! Assignment with primitive types.\n    /*! \\tparam T Either \\ref Type, \\c int, \\c unsigned, \\c int64_t, \\c uint64_t\n        \\param value The value to be assigned.\n\n        \\note The source type \\c T explicitly disallows all pointer types,\n            especially (\\c const) \\ref Ch*.  This helps avoiding implicitly\n            referencing character strings with insufficient lifetime, use\n            \\ref SetString(const Ch*, Allocator&) (for copying) or\n            \\ref StringRef() (to explicitly mark the pointer as constant) instead.\n            All other pointer types would implicitly convert to \\c bool,\n            use \\ref SetBool() instead.\n    */\n    template <typename T>\n    CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::IsPointer<T>), (GenericValue&))\n    operator=(T value) {\n        GenericValue v(value);\n        return *this = v;\n    }\n\n    //! Deep-copy assignment from Value\n    /*! Assigns a \\b copy of the Value to the current Value object\n        \\tparam SourceAllocator Allocator type of \\c rhs\n        \\param rhs Value to copy from (read-only)\n        \\param allocator Allocator to use for copying\n        \\param copyConstStrings Force copying of constant strings (e.g. referencing an in-situ buffer)\n     */\n    template <typename SourceAllocator>\n    GenericValue& CopyFrom(const GenericValue<Encoding, SourceAllocator>& rhs, Allocator& allocator, bool copyConstStrings = false) {\n        CEREAL_RAPIDJSON_ASSERT(static_cast<void*>(this) != static_cast<void const*>(&rhs));\n        this->~GenericValue();\n        new (this) GenericValue(rhs, allocator, copyConstStrings);\n        return *this;\n    }\n\n    //! Exchange the contents of this value with those of other.\n    /*!\n        \\param other Another value.\n        \\note Constant complexity.\n    */\n    GenericValue& Swap(GenericValue& other) CEREAL_RAPIDJSON_NOEXCEPT {\n        GenericValue temp;\n        temp.RawAssign(*this);\n        RawAssign(other);\n        other.RawAssign(temp);\n        return *this;\n    }\n\n    //! free-standing swap function helper\n    /*!\n        Helper function to enable support for common swap implementation pattern based on \\c std::swap:\n        \\code\n        void swap(MyClass& a, MyClass& b) {\n            using std::swap;\n            swap(a.value, b.value);\n            // ...\n        }\n        \\endcode\n        \\see Swap()\n     */\n    friend inline void swap(GenericValue& a, GenericValue& b) CEREAL_RAPIDJSON_NOEXCEPT { a.Swap(b); }\n\n    //! Prepare Value for move semantics\n    /*! \\return *this */\n    GenericValue& Move() CEREAL_RAPIDJSON_NOEXCEPT { return *this; }\n    //@}\n\n    //!@name Equal-to and not-equal-to operators\n    //@{\n    //! Equal-to operator\n    /*!\n        \\note If an object contains duplicated named member, comparing equality with any object is always \\c false.\n        \\note Complexity is quadratic in Object's member number and linear for the rest (number of all values in the subtree and total lengths of all strings).\n    */\n    template <typename SourceAllocator>\n    bool operator==(const GenericValue<Encoding, SourceAllocator>& rhs) const {\n        typedef GenericValue<Encoding, SourceAllocator> RhsType;\n        if (GetType() != rhs.GetType())\n            return false;\n\n        switch (GetType()) {\n        case kObjectType: // Warning: O(n^2) inner-loop\n            if (data_.o.size != rhs.data_.o.size)\n                return false;\n            for (ConstMemberIterator lhsMemberItr = MemberBegin(); lhsMemberItr != MemberEnd(); ++lhsMemberItr) {\n                typename RhsType::ConstMemberIterator rhsMemberItr = rhs.FindMember(lhsMemberItr->name);\n                if (rhsMemberItr == rhs.MemberEnd() || lhsMemberItr->value != rhsMemberItr->value)\n                    return false;\n            }\n            return true;\n\n        case kArrayType:\n            if (data_.a.size != rhs.data_.a.size)\n                return false;\n            for (SizeType i = 0; i < data_.a.size; i++)\n                if ((*this)[i] != rhs[i])\n                    return false;\n            return true;\n\n        case kStringType:\n            return StringEqual(rhs);\n\n        case kNumberType:\n            if (IsDouble() || rhs.IsDouble()) {\n                double a = GetDouble();     // May convert from integer to double.\n                double b = rhs.GetDouble(); // Ditto\n                return a >= b && a <= b;    // Prevent -Wfloat-equal\n            }\n            else\n                return data_.n.u64 == rhs.data_.n.u64;\n\n        default:\n            return true;\n        }\n    }\n\n    //! Equal-to operator with const C-string pointer\n    bool operator==(const Ch* rhs) const { return *this == GenericValue(StringRef(rhs)); }\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    //! Equal-to operator with string object\n    /*! \\note Requires the definition of the preprocessor symbol \\ref CEREAL_RAPIDJSON_HAS_STDSTRING.\n     */\n    bool operator==(const std::basic_string<Ch>& rhs) const { return *this == GenericValue(StringRef(rhs)); }\n#endif\n\n    //! Equal-to operator with primitive types\n    /*! \\tparam T Either \\ref Type, \\c int, \\c unsigned, \\c int64_t, \\c uint64_t, \\c double, \\c true, \\c false\n    */\n    template <typename T> CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>,internal::IsGenericValue<T> >), (bool)) operator==(const T& rhs) const { return *this == GenericValue(rhs); }\n\n    //! Not-equal-to operator\n    /*! \\return !(*this == rhs)\n     */\n    template <typename SourceAllocator>\n    bool operator!=(const GenericValue<Encoding, SourceAllocator>& rhs) const { return !(*this == rhs); }\n\n    //! Not-equal-to operator with const C-string pointer\n    bool operator!=(const Ch* rhs) const { return !(*this == rhs); }\n\n    //! Not-equal-to operator with arbitrary types\n    /*! \\return !(*this == rhs)\n     */\n    template <typename T> CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue<T>), (bool)) operator!=(const T& rhs) const { return !(*this == rhs); }\n\n    //! Equal-to operator with arbitrary types (symmetric version)\n    /*! \\return (rhs == lhs)\n     */\n    template <typename T> friend CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue<T>), (bool)) operator==(const T& lhs, const GenericValue& rhs) { return rhs == lhs; }\n\n    //! Not-Equal-to operator with arbitrary types (symmetric version)\n    /*! \\return !(rhs == lhs)\n     */\n    template <typename T> friend CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue<T>), (bool)) operator!=(const T& lhs, const GenericValue& rhs) { return !(rhs == lhs); }\n    //@}\n\n    //!@name Type\n    //@{\n\n    Type GetType()  const { return static_cast<Type>(data_.f.flags & kTypeMask); }\n    bool IsNull()   const { return data_.f.flags == kNullFlag; }\n    bool IsFalse()  const { return data_.f.flags == kFalseFlag; }\n    bool IsTrue()   const { return data_.f.flags == kTrueFlag; }\n    bool IsBool()   const { return (data_.f.flags & kBoolFlag) != 0; }\n    bool IsObject() const { return data_.f.flags == kObjectFlag; }\n    bool IsArray()  const { return data_.f.flags == kArrayFlag; }\n    bool IsNumber() const { return (data_.f.flags & kNumberFlag) != 0; }\n    bool IsInt()    const { return (data_.f.flags & kIntFlag) != 0; }\n    bool IsUint()   const { return (data_.f.flags & kUintFlag) != 0; }\n    bool IsInt64()  const { return (data_.f.flags & kInt64Flag) != 0; }\n    bool IsUint64() const { return (data_.f.flags & kUint64Flag) != 0; }\n    bool IsDouble() const { return (data_.f.flags & kDoubleFlag) != 0; }\n    bool IsString() const { return (data_.f.flags & kStringFlag) != 0; }\n\n    // Checks whether a number can be losslessly converted to a double.\n    bool IsLosslessDouble() const {\n        if (!IsNumber()) return false;\n        if (IsUint64()) {\n            uint64_t u = GetUint64();\n            volatile double d = static_cast<double>(u);\n            return (d >= 0.0)\n                && (d < static_cast<double>((std::numeric_limits<uint64_t>::max)()))\n                && (u == static_cast<uint64_t>(d));\n        }\n        if (IsInt64()) {\n            int64_t i = GetInt64();\n            volatile double d = static_cast<double>(i);\n            return (d >= static_cast<double>((std::numeric_limits<int64_t>::min)()))\n                && (d < static_cast<double>((std::numeric_limits<int64_t>::max)()))\n                && (i == static_cast<int64_t>(d));\n        }\n        return true; // double, int, uint are always lossless\n    }\n\n    // Checks whether a number is a float (possible lossy).\n    bool IsFloat() const  {\n        if ((data_.f.flags & kDoubleFlag) == 0)\n            return false;\n        double d = GetDouble();\n        return d >= -3.4028234e38 && d <= 3.4028234e38;\n    }\n    // Checks whether a number can be losslessly converted to a float.\n    bool IsLosslessFloat() const {\n        if (!IsNumber()) return false;\n        double a = GetDouble();\n        if (a < static_cast<double>(-(std::numeric_limits<float>::max)())\n                || a > static_cast<double>((std::numeric_limits<float>::max)()))\n            return false;\n        double b = static_cast<double>(static_cast<float>(a));\n        return a >= b && a <= b;    // Prevent -Wfloat-equal\n    }\n\n    //@}\n\n    //!@name Null\n    //@{\n\n    GenericValue& SetNull() { this->~GenericValue(); new (this) GenericValue(); return *this; }\n\n    //@}\n\n    //!@name Bool\n    //@{\n\n    bool GetBool() const { CEREAL_RAPIDJSON_ASSERT(IsBool()); return data_.f.flags == kTrueFlag; }\n    //!< Set boolean value\n    /*! \\post IsBool() == true */\n    GenericValue& SetBool(bool b) { this->~GenericValue(); new (this) GenericValue(b); return *this; }\n\n    //@}\n\n    //!@name Object\n    //@{\n\n    //! Set this value as an empty object.\n    /*! \\post IsObject() == true */\n    GenericValue& SetObject() { this->~GenericValue(); new (this) GenericValue(kObjectType); return *this; }\n\n    //! Get the number of members in the object.\n    SizeType MemberCount() const { CEREAL_RAPIDJSON_ASSERT(IsObject()); return data_.o.size; }\n\n    //! Get the capacity of object.\n    SizeType MemberCapacity() const { CEREAL_RAPIDJSON_ASSERT(IsObject()); return data_.o.capacity; }\n\n    //! Check whether the object is empty.\n    bool ObjectEmpty() const { CEREAL_RAPIDJSON_ASSERT(IsObject()); return data_.o.size == 0; }\n\n    //! Get a value from an object associated with the name.\n    /*! \\pre IsObject() == true\n        \\tparam T Either \\c Ch or \\c const \\c Ch (template used for disambiguation with \\ref operator[](SizeType))\n        \\note In version 0.1x, if the member is not found, this function returns a null value. This makes issue 7.\n        Since 0.2, if the name is not correct, it will assert.\n        If user is unsure whether a member exists, user should use HasMember() first.\n        A better approach is to use FindMember().\n        \\note Linear time complexity.\n    */\n    template <typename T>\n    CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr<internal::IsSame<typename internal::RemoveConst<T>::Type, Ch> >),(GenericValue&)) operator[](T* name) {\n        GenericValue n(StringRef(name));\n        return (*this)[n];\n    }\n    template <typename T>\n    CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr<internal::IsSame<typename internal::RemoveConst<T>::Type, Ch> >),(const GenericValue&)) operator[](T* name) const { return const_cast<GenericValue&>(*this)[name]; }\n\n    //! Get a value from an object associated with the name.\n    /*! \\pre IsObject() == true\n        \\tparam SourceAllocator Allocator of the \\c name value\n\n        \\note Compared to \\ref operator[](T*), this version is faster because it does not need a StrLen().\n        And it can also handle strings with embedded null characters.\n\n        \\note Linear time complexity.\n    */\n    template <typename SourceAllocator>\n    GenericValue& operator[](const GenericValue<Encoding, SourceAllocator>& name) {\n        MemberIterator member = FindMember(name);\n        if (member != MemberEnd())\n            return member->value;\n        else {\n            CEREAL_RAPIDJSON_ASSERT(false);    // see above note\n\n            // This will generate -Wexit-time-destructors in clang\n            // static GenericValue NullValue;\n            // return NullValue;\n\n            // Use static buffer and placement-new to prevent destruction\n            static char buffer[sizeof(GenericValue)];\n            return *new (buffer) GenericValue();\n        }\n    }\n    template <typename SourceAllocator>\n    const GenericValue& operator[](const GenericValue<Encoding, SourceAllocator>& name) const { return const_cast<GenericValue&>(*this)[name]; }\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    //! Get a value from an object associated with name (string object).\n    GenericValue& operator[](const std::basic_string<Ch>& name) { return (*this)[GenericValue(StringRef(name))]; }\n    const GenericValue& operator[](const std::basic_string<Ch>& name) const { return (*this)[GenericValue(StringRef(name))]; }\n#endif\n\n    //! Const member iterator\n    /*! \\pre IsObject() == true */\n    ConstMemberIterator MemberBegin() const { CEREAL_RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer()); }\n    //! Const \\em past-the-end member iterator\n    /*! \\pre IsObject() == true */\n    ConstMemberIterator MemberEnd() const   { CEREAL_RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer() + data_.o.size); }\n    //! Member iterator\n    /*! \\pre IsObject() == true */\n    MemberIterator MemberBegin()            { CEREAL_RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer()); }\n    //! \\em Past-the-end member iterator\n    /*! \\pre IsObject() == true */\n    MemberIterator MemberEnd()              { CEREAL_RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer() + data_.o.size); }\n\n    //! Request the object to have enough capacity to store members.\n    /*! \\param newCapacity  The capacity that the object at least need to have.\n        \\param allocator    Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().\n        \\return The value itself for fluent API.\n        \\note Linear time complexity.\n    */\n    GenericValue& MemberReserve(SizeType newCapacity, Allocator &allocator) {\n        CEREAL_RAPIDJSON_ASSERT(IsObject());\n        if (newCapacity > data_.o.capacity) {\n            SetMembersPointer(reinterpret_cast<Member*>(allocator.Realloc(GetMembersPointer(), data_.o.capacity * sizeof(Member), newCapacity * sizeof(Member))));\n            data_.o.capacity = newCapacity;\n        }\n        return *this;\n    }\n\n    //! Check whether a member exists in the object.\n    /*!\n        \\param name Member name to be searched.\n        \\pre IsObject() == true\n        \\return Whether a member with that name exists.\n        \\note It is better to use FindMember() directly if you need the obtain the value as well.\n        \\note Linear time complexity.\n    */\n    bool HasMember(const Ch* name) const { return FindMember(name) != MemberEnd(); }\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    //! Check whether a member exists in the object with string object.\n    /*!\n        \\param name Member name to be searched.\n        \\pre IsObject() == true\n        \\return Whether a member with that name exists.\n        \\note It is better to use FindMember() directly if you need the obtain the value as well.\n        \\note Linear time complexity.\n    */\n    bool HasMember(const std::basic_string<Ch>& name) const { return FindMember(name) != MemberEnd(); }\n#endif\n\n    //! Check whether a member exists in the object with GenericValue name.\n    /*!\n        This version is faster because it does not need a StrLen(). It can also handle string with null character.\n        \\param name Member name to be searched.\n        \\pre IsObject() == true\n        \\return Whether a member with that name exists.\n        \\note It is better to use FindMember() directly if you need the obtain the value as well.\n        \\note Linear time complexity.\n    */\n    template <typename SourceAllocator>\n    bool HasMember(const GenericValue<Encoding, SourceAllocator>& name) const { return FindMember(name) != MemberEnd(); }\n\n    //! Find member by name.\n    /*!\n        \\param name Member name to be searched.\n        \\pre IsObject() == true\n        \\return Iterator to member, if it exists.\n            Otherwise returns \\ref MemberEnd().\n\n        \\note Earlier versions of Rapidjson returned a \\c NULL pointer, in case\n            the requested member doesn't exist. For consistency with e.g.\n            \\c std::map, this has been changed to MemberEnd() now.\n        \\note Linear time complexity.\n    */\n    MemberIterator FindMember(const Ch* name) {\n        GenericValue n(StringRef(name));\n        return FindMember(n);\n    }\n\n    ConstMemberIterator FindMember(const Ch* name) const { return const_cast<GenericValue&>(*this).FindMember(name); }\n\n    //! Find member by name.\n    /*!\n        This version is faster because it does not need a StrLen(). It can also handle string with null character.\n        \\param name Member name to be searched.\n        \\pre IsObject() == true\n        \\return Iterator to member, if it exists.\n            Otherwise returns \\ref MemberEnd().\n\n        \\note Earlier versions of Rapidjson returned a \\c NULL pointer, in case\n            the requested member doesn't exist. For consistency with e.g.\n            \\c std::map, this has been changed to MemberEnd() now.\n        \\note Linear time complexity.\n    */\n    template <typename SourceAllocator>\n    MemberIterator FindMember(const GenericValue<Encoding, SourceAllocator>& name) {\n        CEREAL_RAPIDJSON_ASSERT(IsObject());\n        CEREAL_RAPIDJSON_ASSERT(name.IsString());\n        MemberIterator member = MemberBegin();\n        for ( ; member != MemberEnd(); ++member)\n            if (name.StringEqual(member->name))\n                break;\n        return member;\n    }\n    template <typename SourceAllocator> ConstMemberIterator FindMember(const GenericValue<Encoding, SourceAllocator>& name) const { return const_cast<GenericValue&>(*this).FindMember(name); }\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    //! Find member by string object name.\n    /*!\n        \\param name Member name to be searched.\n        \\pre IsObject() == true\n        \\return Iterator to member, if it exists.\n            Otherwise returns \\ref MemberEnd().\n    */\n    MemberIterator FindMember(const std::basic_string<Ch>& name) { return FindMember(GenericValue(StringRef(name))); }\n    ConstMemberIterator FindMember(const std::basic_string<Ch>& name) const { return FindMember(GenericValue(StringRef(name))); }\n#endif\n\n    //! Add a member (name-value pair) to the object.\n    /*! \\param name A string value as name of member.\n        \\param value Value of any type.\n        \\param allocator    Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().\n        \\return The value itself for fluent API.\n        \\note The ownership of \\c name and \\c value will be transferred to this object on success.\n        \\pre  IsObject() && name.IsString()\n        \\post name.IsNull() && value.IsNull()\n        \\note Amortized Constant time complexity.\n    */\n    GenericValue& AddMember(GenericValue& name, GenericValue& value, Allocator& allocator) {\n        CEREAL_RAPIDJSON_ASSERT(IsObject());\n        CEREAL_RAPIDJSON_ASSERT(name.IsString());\n\n        ObjectData& o = data_.o;\n        if (o.size >= o.capacity)\n            MemberReserve(o.capacity == 0 ? kDefaultObjectCapacity : (o.capacity + (o.capacity + 1) / 2), allocator);\n        Member* members = GetMembersPointer();\n        members[o.size].name.RawAssign(name);\n        members[o.size].value.RawAssign(value);\n        o.size++;\n        return *this;\n    }\n\n    //! Add a constant string value as member (name-value pair) to the object.\n    /*! \\param name A string value as name of member.\n        \\param value constant string reference as value of member.\n        \\param allocator    Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().\n        \\return The value itself for fluent API.\n        \\pre  IsObject()\n        \\note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below.\n        \\note Amortized Constant time complexity.\n    */\n    GenericValue& AddMember(GenericValue& name, StringRefType value, Allocator& allocator) {\n        GenericValue v(value);\n        return AddMember(name, v, allocator);\n    }\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    //! Add a string object as member (name-value pair) to the object.\n    /*! \\param name A string value as name of member.\n        \\param value constant string reference as value of member.\n        \\param allocator    Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().\n        \\return The value itself for fluent API.\n        \\pre  IsObject()\n        \\note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below.\n        \\note Amortized Constant time complexity.\n    */\n    GenericValue& AddMember(GenericValue& name, std::basic_string<Ch>& value, Allocator& allocator) {\n        GenericValue v(value, allocator);\n        return AddMember(name, v, allocator);\n    }\n#endif\n\n    //! Add any primitive value as member (name-value pair) to the object.\n    /*! \\tparam T Either \\ref Type, \\c int, \\c unsigned, \\c int64_t, \\c uint64_t\n        \\param name A string value as name of member.\n        \\param value Value of primitive type \\c T as value of member\n        \\param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator().\n        \\return The value itself for fluent API.\n        \\pre  IsObject()\n\n        \\note The source type \\c T explicitly disallows all pointer types,\n            especially (\\c const) \\ref Ch*.  This helps avoiding implicitly\n            referencing character strings with insufficient lifetime, use\n            \\ref AddMember(StringRefType, GenericValue&, Allocator&) or \\ref\n            AddMember(StringRefType, StringRefType, Allocator&).\n            All other pointer types would implicitly convert to \\c bool,\n            use an explicit cast instead, if needed.\n        \\note Amortized Constant time complexity.\n    */\n    template <typename T>\n    CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericValue&))\n    AddMember(GenericValue& name, T value, Allocator& allocator) {\n        GenericValue v(value);\n        return AddMember(name, v, allocator);\n    }\n\n#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n    GenericValue& AddMember(GenericValue&& name, GenericValue&& value, Allocator& allocator) {\n        return AddMember(name, value, allocator);\n    }\n    GenericValue& AddMember(GenericValue&& name, GenericValue& value, Allocator& allocator) {\n        return AddMember(name, value, allocator);\n    }\n    GenericValue& AddMember(GenericValue& name, GenericValue&& value, Allocator& allocator) {\n        return AddMember(name, value, allocator);\n    }\n    GenericValue& AddMember(StringRefType name, GenericValue&& value, Allocator& allocator) {\n        GenericValue n(name);\n        return AddMember(n, value, allocator);\n    }\n#endif // CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n\n\n    //! Add a member (name-value pair) to the object.\n    /*! \\param name A constant string reference as name of member.\n        \\param value Value of any type.\n        \\param allocator    Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().\n        \\return The value itself for fluent API.\n        \\note The ownership of \\c value will be transferred to this object on success.\n        \\pre  IsObject()\n        \\post value.IsNull()\n        \\note Amortized Constant time complexity.\n    */\n    GenericValue& AddMember(StringRefType name, GenericValue& value, Allocator& allocator) {\n        GenericValue n(name);\n        return AddMember(n, value, allocator);\n    }\n\n    //! Add a constant string value as member (name-value pair) to the object.\n    /*! \\param name A constant string reference as name of member.\n        \\param value constant string reference as value of member.\n        \\param allocator    Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().\n        \\return The value itself for fluent API.\n        \\pre  IsObject()\n        \\note This overload is needed to avoid clashes with the generic primitive type AddMember(StringRefType,T,Allocator&) overload below.\n        \\note Amortized Constant time complexity.\n    */\n    GenericValue& AddMember(StringRefType name, StringRefType value, Allocator& allocator) {\n        GenericValue v(value);\n        return AddMember(name, v, allocator);\n    }\n\n    //! Add any primitive value as member (name-value pair) to the object.\n    /*! \\tparam T Either \\ref Type, \\c int, \\c unsigned, \\c int64_t, \\c uint64_t\n        \\param name A constant string reference as name of member.\n        \\param value Value of primitive type \\c T as value of member\n        \\param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator().\n        \\return The value itself for fluent API.\n        \\pre  IsObject()\n\n        \\note The source type \\c T explicitly disallows all pointer types,\n            especially (\\c const) \\ref Ch*.  This helps avoiding implicitly\n            referencing character strings with insufficient lifetime, use\n            \\ref AddMember(StringRefType, GenericValue&, Allocator&) or \\ref\n            AddMember(StringRefType, StringRefType, Allocator&).\n            All other pointer types would implicitly convert to \\c bool,\n            use an explicit cast instead, if needed.\n        \\note Amortized Constant time complexity.\n    */\n    template <typename T>\n    CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericValue&))\n    AddMember(StringRefType name, T value, Allocator& allocator) {\n        GenericValue n(name);\n        return AddMember(n, value, allocator);\n    }\n\n    //! Remove all members in the object.\n    /*! This function do not deallocate memory in the object, i.e. the capacity is unchanged.\n        \\note Linear time complexity.\n    */\n    void RemoveAllMembers() {\n        CEREAL_RAPIDJSON_ASSERT(IsObject());\n        for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m)\n            m->~Member();\n        data_.o.size = 0;\n    }\n\n    //! Remove a member in object by its name.\n    /*! \\param name Name of member to be removed.\n        \\return Whether the member existed.\n        \\note This function may reorder the object members. Use \\ref\n            EraseMember(ConstMemberIterator) if you need to preserve the\n            relative order of the remaining members.\n        \\note Linear time complexity.\n    */\n    bool RemoveMember(const Ch* name) {\n        GenericValue n(StringRef(name));\n        return RemoveMember(n);\n    }\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    bool RemoveMember(const std::basic_string<Ch>& name) { return RemoveMember(GenericValue(StringRef(name))); }\n#endif\n\n    template <typename SourceAllocator>\n    bool RemoveMember(const GenericValue<Encoding, SourceAllocator>& name) {\n        MemberIterator m = FindMember(name);\n        if (m != MemberEnd()) {\n            RemoveMember(m);\n            return true;\n        }\n        else\n            return false;\n    }\n\n    //! Remove a member in object by iterator.\n    /*! \\param m member iterator (obtained by FindMember() or MemberBegin()).\n        \\return the new iterator after removal.\n        \\note This function may reorder the object members. Use \\ref\n            EraseMember(ConstMemberIterator) if you need to preserve the\n            relative order of the remaining members.\n        \\note Constant time complexity.\n    */\n    MemberIterator RemoveMember(MemberIterator m) {\n        CEREAL_RAPIDJSON_ASSERT(IsObject());\n        CEREAL_RAPIDJSON_ASSERT(data_.o.size > 0);\n        CEREAL_RAPIDJSON_ASSERT(GetMembersPointer() != 0);\n        CEREAL_RAPIDJSON_ASSERT(m >= MemberBegin() && m < MemberEnd());\n\n        MemberIterator last(GetMembersPointer() + (data_.o.size - 1));\n        if (data_.o.size > 1 && m != last)\n            *m = *last; // Move the last one to this place\n        else\n            m->~Member(); // Only one left, just destroy\n        --data_.o.size;\n        return m;\n    }\n\n    //! Remove a member from an object by iterator.\n    /*! \\param pos iterator to the member to remove\n        \\pre IsObject() == true && \\ref MemberBegin() <= \\c pos < \\ref MemberEnd()\n        \\return Iterator following the removed element.\n            If the iterator \\c pos refers to the last element, the \\ref MemberEnd() iterator is returned.\n        \\note This function preserves the relative order of the remaining object\n            members. If you do not need this, use the more efficient \\ref RemoveMember(MemberIterator).\n        \\note Linear time complexity.\n    */\n    MemberIterator EraseMember(ConstMemberIterator pos) {\n        return EraseMember(pos, pos +1);\n    }\n\n    //! Remove members in the range [first, last) from an object.\n    /*! \\param first iterator to the first member to remove\n        \\param last  iterator following the last member to remove\n        \\pre IsObject() == true && \\ref MemberBegin() <= \\c first <= \\c last <= \\ref MemberEnd()\n        \\return Iterator following the last removed element.\n        \\note This function preserves the relative order of the remaining object\n            members.\n        \\note Linear time complexity.\n    */\n    MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) {\n        CEREAL_RAPIDJSON_ASSERT(IsObject());\n        CEREAL_RAPIDJSON_ASSERT(data_.o.size > 0);\n        CEREAL_RAPIDJSON_ASSERT(GetMembersPointer() != 0);\n        CEREAL_RAPIDJSON_ASSERT(first >= MemberBegin());\n        CEREAL_RAPIDJSON_ASSERT(first <= last);\n        CEREAL_RAPIDJSON_ASSERT(last <= MemberEnd());\n\n        MemberIterator pos = MemberBegin() + (first - MemberBegin());\n        for (MemberIterator itr = pos; itr != last; ++itr)\n            itr->~Member();\n        std::memmove(static_cast<void*>(&*pos), &*last, static_cast<size_t>(MemberEnd() - last) * sizeof(Member));\n        data_.o.size -= static_cast<SizeType>(last - first);\n        return pos;\n    }\n\n    //! Erase a member in object by its name.\n    /*! \\param name Name of member to be removed.\n        \\return Whether the member existed.\n        \\note Linear time complexity.\n    */\n    bool EraseMember(const Ch* name) {\n        GenericValue n(StringRef(name));\n        return EraseMember(n);\n    }\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    bool EraseMember(const std::basic_string<Ch>& name) { return EraseMember(GenericValue(StringRef(name))); }\n#endif\n\n    template <typename SourceAllocator>\n    bool EraseMember(const GenericValue<Encoding, SourceAllocator>& name) {\n        MemberIterator m = FindMember(name);\n        if (m != MemberEnd()) {\n            EraseMember(m);\n            return true;\n        }\n        else\n            return false;\n    }\n\n    Object GetObject() { CEREAL_RAPIDJSON_ASSERT(IsObject()); return Object(*this); }\n    ConstObject GetObject() const { CEREAL_RAPIDJSON_ASSERT(IsObject()); return ConstObject(*this); }\n\n    //@}\n\n    //!@name Array\n    //@{\n\n    //! Set this value as an empty array.\n    /*! \\post IsArray == true */\n    GenericValue& SetArray() { this->~GenericValue(); new (this) GenericValue(kArrayType); return *this; }\n\n    //! Get the number of elements in array.\n    SizeType Size() const { CEREAL_RAPIDJSON_ASSERT(IsArray()); return data_.a.size; }\n\n    //! Get the capacity of array.\n    SizeType Capacity() const { CEREAL_RAPIDJSON_ASSERT(IsArray()); return data_.a.capacity; }\n\n    //! Check whether the array is empty.\n    bool Empty() const { CEREAL_RAPIDJSON_ASSERT(IsArray()); return data_.a.size == 0; }\n\n    //! Remove all elements in the array.\n    /*! This function do not deallocate memory in the array, i.e. the capacity is unchanged.\n        \\note Linear time complexity.\n    */\n    void Clear() {\n        CEREAL_RAPIDJSON_ASSERT(IsArray());\n        GenericValue* e = GetElementsPointer();\n        for (GenericValue* v = e; v != e + data_.a.size; ++v)\n            v->~GenericValue();\n        data_.a.size = 0;\n    }\n\n    //! Get an element from array by index.\n    /*! \\pre IsArray() == true\n        \\param index Zero-based index of element.\n        \\see operator[](T*)\n    */\n    GenericValue& operator[](SizeType index) {\n        CEREAL_RAPIDJSON_ASSERT(IsArray());\n        CEREAL_RAPIDJSON_ASSERT(index < data_.a.size);\n        return GetElementsPointer()[index];\n    }\n    const GenericValue& operator[](SizeType index) const { return const_cast<GenericValue&>(*this)[index]; }\n\n    //! Element iterator\n    /*! \\pre IsArray() == true */\n    ValueIterator Begin() { CEREAL_RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer(); }\n    //! \\em Past-the-end element iterator\n    /*! \\pre IsArray() == true */\n    ValueIterator End() { CEREAL_RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer() + data_.a.size; }\n    //! Constant element iterator\n    /*! \\pre IsArray() == true */\n    ConstValueIterator Begin() const { return const_cast<GenericValue&>(*this).Begin(); }\n    //! Constant \\em past-the-end element iterator\n    /*! \\pre IsArray() == true */\n    ConstValueIterator End() const { return const_cast<GenericValue&>(*this).End(); }\n\n    //! Request the array to have enough capacity to store elements.\n    /*! \\param newCapacity  The capacity that the array at least need to have.\n        \\param allocator    Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().\n        \\return The value itself for fluent API.\n        \\note Linear time complexity.\n    */\n    GenericValue& Reserve(SizeType newCapacity, Allocator &allocator) {\n        CEREAL_RAPIDJSON_ASSERT(IsArray());\n        if (newCapacity > data_.a.capacity) {\n            SetElementsPointer(reinterpret_cast<GenericValue*>(allocator.Realloc(GetElementsPointer(), data_.a.capacity * sizeof(GenericValue), newCapacity * sizeof(GenericValue))));\n            data_.a.capacity = newCapacity;\n        }\n        return *this;\n    }\n\n    //! Append a GenericValue at the end of the array.\n    /*! \\param value        Value to be appended.\n        \\param allocator    Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().\n        \\pre IsArray() == true\n        \\post value.IsNull() == true\n        \\return The value itself for fluent API.\n        \\note The ownership of \\c value will be transferred to this array on success.\n        \\note If the number of elements to be appended is known, calls Reserve() once first may be more efficient.\n        \\note Amortized constant time complexity.\n    */\n    GenericValue& PushBack(GenericValue& value, Allocator& allocator) {\n        CEREAL_RAPIDJSON_ASSERT(IsArray());\n        if (data_.a.size >= data_.a.capacity)\n            Reserve(data_.a.capacity == 0 ? kDefaultArrayCapacity : (data_.a.capacity + (data_.a.capacity + 1) / 2), allocator);\n        GetElementsPointer()[data_.a.size++].RawAssign(value);\n        return *this;\n    }\n\n#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n    GenericValue& PushBack(GenericValue&& value, Allocator& allocator) {\n        return PushBack(value, allocator);\n    }\n#endif // CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n\n    //! Append a constant string reference at the end of the array.\n    /*! \\param value        Constant string reference to be appended.\n        \\param allocator    Allocator for reallocating memory. It must be the same one used previously. Commonly use GenericDocument::GetAllocator().\n        \\pre IsArray() == true\n        \\return The value itself for fluent API.\n        \\note If the number of elements to be appended is known, calls Reserve() once first may be more efficient.\n        \\note Amortized constant time complexity.\n        \\see GenericStringRef\n    */\n    GenericValue& PushBack(StringRefType value, Allocator& allocator) {\n        return (*this).template PushBack<StringRefType>(value, allocator);\n    }\n\n    //! Append a primitive value at the end of the array.\n    /*! \\tparam T Either \\ref Type, \\c int, \\c unsigned, \\c int64_t, \\c uint64_t\n        \\param value Value of primitive type T to be appended.\n        \\param allocator    Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().\n        \\pre IsArray() == true\n        \\return The value itself for fluent API.\n        \\note If the number of elements to be appended is known, calls Reserve() once first may be more efficient.\n\n        \\note The source type \\c T explicitly disallows all pointer types,\n            especially (\\c const) \\ref Ch*.  This helps avoiding implicitly\n            referencing character strings with insufficient lifetime, use\n            \\ref PushBack(GenericValue&, Allocator&) or \\ref\n            PushBack(StringRefType, Allocator&).\n            All other pointer types would implicitly convert to \\c bool,\n            use an explicit cast instead, if needed.\n        \\note Amortized constant time complexity.\n    */\n    template <typename T>\n    CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericValue&))\n    PushBack(T value, Allocator& allocator) {\n        GenericValue v(value);\n        return PushBack(v, allocator);\n    }\n\n    //! Remove the last element in the array.\n    /*!\n        \\note Constant time complexity.\n    */\n    GenericValue& PopBack() {\n        CEREAL_RAPIDJSON_ASSERT(IsArray());\n        CEREAL_RAPIDJSON_ASSERT(!Empty());\n        GetElementsPointer()[--data_.a.size].~GenericValue();\n        return *this;\n    }\n\n    //! Remove an element of array by iterator.\n    /*!\n        \\param pos iterator to the element to remove\n        \\pre IsArray() == true && \\ref Begin() <= \\c pos < \\ref End()\n        \\return Iterator following the removed element. If the iterator pos refers to the last element, the End() iterator is returned.\n        \\note Linear time complexity.\n    */\n    ValueIterator Erase(ConstValueIterator pos) {\n        return Erase(pos, pos + 1);\n    }\n\n    //! Remove elements in the range [first, last) of the array.\n    /*!\n        \\param first iterator to the first element to remove\n        \\param last  iterator following the last element to remove\n        \\pre IsArray() == true && \\ref Begin() <= \\c first <= \\c last <= \\ref End()\n        \\return Iterator following the last removed element.\n        \\note Linear time complexity.\n    */\n    ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) {\n        CEREAL_RAPIDJSON_ASSERT(IsArray());\n        CEREAL_RAPIDJSON_ASSERT(data_.a.size > 0);\n        CEREAL_RAPIDJSON_ASSERT(GetElementsPointer() != 0);\n        CEREAL_RAPIDJSON_ASSERT(first >= Begin());\n        CEREAL_RAPIDJSON_ASSERT(first <= last);\n        CEREAL_RAPIDJSON_ASSERT(last <= End());\n        ValueIterator pos = Begin() + (first - Begin());\n        for (ValueIterator itr = pos; itr != last; ++itr)\n            itr->~GenericValue();\n        std::memmove(static_cast<void*>(pos), last, static_cast<size_t>(End() - last) * sizeof(GenericValue));\n        data_.a.size -= static_cast<SizeType>(last - first);\n        return pos;\n    }\n\n    Array GetArray() { CEREAL_RAPIDJSON_ASSERT(IsArray()); return Array(*this); }\n    ConstArray GetArray() const { CEREAL_RAPIDJSON_ASSERT(IsArray()); return ConstArray(*this); }\n\n    //@}\n\n    //!@name Number\n    //@{\n\n    int GetInt() const          { CEREAL_RAPIDJSON_ASSERT(data_.f.flags & kIntFlag);   return data_.n.i.i;   }\n    unsigned GetUint() const    { CEREAL_RAPIDJSON_ASSERT(data_.f.flags & kUintFlag);  return data_.n.u.u;   }\n    int64_t GetInt64() const    { CEREAL_RAPIDJSON_ASSERT(data_.f.flags & kInt64Flag); return data_.n.i64; }\n    uint64_t GetUint64() const  { CEREAL_RAPIDJSON_ASSERT(data_.f.flags & kUint64Flag); return data_.n.u64; }\n\n    //! Get the value as double type.\n    /*! \\note If the value is 64-bit integer type, it may lose precision. Use \\c IsLosslessDouble() to check whether the converison is lossless.\n    */\n    double GetDouble() const {\n        CEREAL_RAPIDJSON_ASSERT(IsNumber());\n        if ((data_.f.flags & kDoubleFlag) != 0)                return data_.n.d;   // exact type, no conversion.\n        if ((data_.f.flags & kIntFlag) != 0)                   return data_.n.i.i; // int -> double\n        if ((data_.f.flags & kUintFlag) != 0)                  return data_.n.u.u; // unsigned -> double\n        if ((data_.f.flags & kInt64Flag) != 0)                 return static_cast<double>(data_.n.i64); // int64_t -> double (may lose precision)\n        CEREAL_RAPIDJSON_ASSERT((data_.f.flags & kUint64Flag) != 0);  return static_cast<double>(data_.n.u64); // uint64_t -> double (may lose precision)\n    }\n\n    //! Get the value as float type.\n    /*! \\note If the value is 64-bit integer type, it may lose precision. Use \\c IsLosslessFloat() to check whether the converison is lossless.\n    */\n    float GetFloat() const {\n        return static_cast<float>(GetDouble());\n    }\n\n    GenericValue& SetInt(int i)             { this->~GenericValue(); new (this) GenericValue(i);    return *this; }\n    GenericValue& SetUint(unsigned u)       { this->~GenericValue(); new (this) GenericValue(u);    return *this; }\n    GenericValue& SetInt64(int64_t i64)     { this->~GenericValue(); new (this) GenericValue(i64);  return *this; }\n    GenericValue& SetUint64(uint64_t u64)   { this->~GenericValue(); new (this) GenericValue(u64);  return *this; }\n    GenericValue& SetDouble(double d)       { this->~GenericValue(); new (this) GenericValue(d);    return *this; }\n    GenericValue& SetFloat(float f)         { this->~GenericValue(); new (this) GenericValue(static_cast<double>(f)); return *this; }\n\n    //@}\n\n    //!@name String\n    //@{\n\n    const Ch* GetString() const { CEREAL_RAPIDJSON_ASSERT(IsString()); return (data_.f.flags & kInlineStrFlag) ? data_.ss.str : GetStringPointer(); }\n\n    //! Get the length of string.\n    /*! Since rapidjson permits \"\\\\u0000\" in the json string, strlen(v.GetString()) may not equal to v.GetStringLength().\n    */\n    SizeType GetStringLength() const { CEREAL_RAPIDJSON_ASSERT(IsString()); return ((data_.f.flags & kInlineStrFlag) ? (data_.ss.GetLength()) : data_.s.length); }\n\n    //! Set this value as a string without copying source string.\n    /*! This version has better performance with supplied length, and also support string containing null character.\n        \\param s source string pointer.\n        \\param length The length of source string, excluding the trailing null terminator.\n        \\return The value itself for fluent API.\n        \\post IsString() == true && GetString() == s && GetStringLength() == length\n        \\see SetString(StringRefType)\n    */\n    GenericValue& SetString(const Ch* s, SizeType length) { return SetString(StringRef(s, length)); }\n\n    //! Set this value as a string without copying source string.\n    /*! \\param s source string reference\n        \\return The value itself for fluent API.\n        \\post IsString() == true && GetString() == s && GetStringLength() == s.length\n    */\n    GenericValue& SetString(StringRefType s) { this->~GenericValue(); SetStringRaw(s); return *this; }\n\n    //! Set this value as a string by copying from source string.\n    /*! This version has better performance with supplied length, and also support string containing null character.\n        \\param s source string.\n        \\param length The length of source string, excluding the trailing null terminator.\n        \\param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator().\n        \\return The value itself for fluent API.\n        \\post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length\n    */\n    GenericValue& SetString(const Ch* s, SizeType length, Allocator& allocator) { return SetString(StringRef(s, length), allocator); }\n\n    //! Set this value as a string by copying from source string.\n    /*! \\param s source string.\n        \\param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator().\n        \\return The value itself for fluent API.\n        \\post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length\n    */\n    GenericValue& SetString(const Ch* s, Allocator& allocator) { return SetString(StringRef(s), allocator); }\n\n    //! Set this value as a string by copying from source string.\n    /*! \\param s source string reference\n        \\param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator().\n        \\return The value itself for fluent API.\n        \\post IsString() == true && GetString() != s.s && strcmp(GetString(),s) == 0 && GetStringLength() == length\n    */\n    GenericValue& SetString(StringRefType s, Allocator& allocator) { this->~GenericValue(); SetStringRaw(s, allocator); return *this; }\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    //! Set this value as a string by copying from source string.\n    /*! \\param s source string.\n        \\param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator().\n        \\return The value itself for fluent API.\n        \\post IsString() == true && GetString() != s.data() && strcmp(GetString(),s.data() == 0 && GetStringLength() == s.size()\n        \\note Requires the definition of the preprocessor symbol \\ref CEREAL_RAPIDJSON_HAS_STDSTRING.\n    */\n    GenericValue& SetString(const std::basic_string<Ch>& s, Allocator& allocator) { return SetString(StringRef(s), allocator); }\n#endif\n\n    //@}\n\n    //!@name Array\n    //@{\n\n    //! Templated version for checking whether this value is type T.\n    /*!\n        \\tparam T Either \\c bool, \\c int, \\c unsigned, \\c int64_t, \\c uint64_t, \\c double, \\c float, \\c const \\c char*, \\c std::basic_string<Ch>\n    */\n    template <typename T>\n    bool Is() const { return internal::TypeHelper<ValueType, T>::Is(*this); }\n\n    template <typename T>\n    T Get() const { return internal::TypeHelper<ValueType, T>::Get(*this); }\n\n    template <typename T>\n    T Get() { return internal::TypeHelper<ValueType, T>::Get(*this); }\n\n    template<typename T>\n    ValueType& Set(const T& data) { return internal::TypeHelper<ValueType, T>::Set(*this, data); }\n\n    template<typename T>\n    ValueType& Set(const T& data, AllocatorType& allocator) { return internal::TypeHelper<ValueType, T>::Set(*this, data, allocator); }\n\n    //@}\n\n    //! Generate events of this value to a Handler.\n    /*! This function adopts the GoF visitor pattern.\n        Typical usage is to output this JSON value as JSON text via Writer, which is a Handler.\n        It can also be used to deep clone this value via GenericDocument, which is also a Handler.\n        \\tparam Handler type of handler.\n        \\param handler An object implementing concept Handler.\n    */\n    template <typename Handler>\n    bool Accept(Handler& handler) const {\n        switch(GetType()) {\n        case kNullType:     return handler.Null();\n        case kFalseType:    return handler.Bool(false);\n        case kTrueType:     return handler.Bool(true);\n\n        case kObjectType:\n            if (CEREAL_RAPIDJSON_UNLIKELY(!handler.StartObject()))\n                return false;\n            for (ConstMemberIterator m = MemberBegin(); m != MemberEnd(); ++m) {\n                CEREAL_RAPIDJSON_ASSERT(m->name.IsString()); // User may change the type of name by MemberIterator.\n                if (CEREAL_RAPIDJSON_UNLIKELY(!handler.Key(m->name.GetString(), m->name.GetStringLength(), (m->name.data_.f.flags & kCopyFlag) != 0)))\n                    return false;\n                if (CEREAL_RAPIDJSON_UNLIKELY(!m->value.Accept(handler)))\n                    return false;\n            }\n            return handler.EndObject(data_.o.size);\n\n        case kArrayType:\n            if (CEREAL_RAPIDJSON_UNLIKELY(!handler.StartArray()))\n                return false;\n            for (const GenericValue* v = Begin(); v != End(); ++v)\n                if (CEREAL_RAPIDJSON_UNLIKELY(!v->Accept(handler)))\n                    return false;\n            return handler.EndArray(data_.a.size);\n\n        case kStringType:\n            return handler.String(GetString(), GetStringLength(), (data_.f.flags & kCopyFlag) != 0);\n\n        default:\n            CEREAL_RAPIDJSON_ASSERT(GetType() == kNumberType);\n            if (IsDouble())         return handler.Double(data_.n.d);\n            else if (IsInt())       return handler.Int(data_.n.i.i);\n            else if (IsUint())      return handler.Uint(data_.n.u.u);\n            else if (IsInt64())     return handler.Int64(data_.n.i64);\n            else                    return handler.Uint64(data_.n.u64);\n        }\n    }\n\nprivate:\n    template <typename, typename> friend class GenericValue;\n    template <typename, typename, typename> friend class GenericDocument;\n\n    enum {\n        kBoolFlag       = 0x0008,\n        kNumberFlag     = 0x0010,\n        kIntFlag        = 0x0020,\n        kUintFlag       = 0x0040,\n        kInt64Flag      = 0x0080,\n        kUint64Flag     = 0x0100,\n        kDoubleFlag     = 0x0200,\n        kStringFlag     = 0x0400,\n        kCopyFlag       = 0x0800,\n        kInlineStrFlag  = 0x1000,\n\n        // Initial flags of different types.\n        kNullFlag = kNullType,\n        kTrueFlag = kTrueType | kBoolFlag,\n        kFalseFlag = kFalseType | kBoolFlag,\n        kNumberIntFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag,\n        kNumberUintFlag = kNumberType | kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag,\n        kNumberInt64Flag = kNumberType | kNumberFlag | kInt64Flag,\n        kNumberUint64Flag = kNumberType | kNumberFlag | kUint64Flag,\n        kNumberDoubleFlag = kNumberType | kNumberFlag | kDoubleFlag,\n        kNumberAnyFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag | kUintFlag | kUint64Flag | kDoubleFlag,\n        kConstStringFlag = kStringType | kStringFlag,\n        kCopyStringFlag = kStringType | kStringFlag | kCopyFlag,\n        kShortStringFlag = kStringType | kStringFlag | kCopyFlag | kInlineStrFlag,\n        kObjectFlag = kObjectType,\n        kArrayFlag = kArrayType,\n\n        kTypeMask = 0x07\n    };\n\n    static const SizeType kDefaultArrayCapacity = 16;\n    static const SizeType kDefaultObjectCapacity = 16;\n\n    struct Flag {\n#if CEREAL_RAPIDJSON_48BITPOINTER_OPTIMIZATION\n        char payload[sizeof(SizeType) * 2 + 6];     // 2 x SizeType + lower 48-bit pointer\n#elif CEREAL_RAPIDJSON_64BIT\n        char payload[sizeof(SizeType) * 2 + sizeof(void*) + 6]; // 6 padding bytes\n#else\n        char payload[sizeof(SizeType) * 2 + sizeof(void*) + 2]; // 2 padding bytes\n#endif\n        uint16_t flags;\n    };\n\n    struct String {\n        SizeType length;\n        SizeType hashcode;  //!< reserved\n        const Ch* str;\n    };  // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode\n\n    // implementation detail: ShortString can represent zero-terminated strings up to MaxSize chars\n    // (excluding the terminating zero) and store a value to determine the length of the contained\n    // string in the last character str[LenPos] by storing \"MaxSize - length\" there. If the string\n    // to store has the maximal length of MaxSize then str[LenPos] will be 0 and therefore act as\n    // the string terminator as well. For getting the string length back from that value just use\n    // \"MaxSize - str[LenPos]\".\n    // This allows to store 13-chars strings in 32-bit mode, 21-chars strings in 64-bit mode,\n    // 13-chars strings for CEREAL_RAPIDJSON_48BITPOINTER_OPTIMIZATION=1 inline (for `UTF8`-encoded strings).\n    struct ShortString {\n        enum { MaxChars = sizeof(static_cast<Flag*>(0)->payload) / sizeof(Ch), MaxSize = MaxChars - 1, LenPos = MaxSize };\n        Ch str[MaxChars];\n\n        inline static bool Usable(SizeType len) { return                       (MaxSize >= len); }\n        inline void     SetLength(SizeType len) { str[LenPos] = static_cast<Ch>(MaxSize -  len); }\n        inline SizeType GetLength() const       { return  static_cast<SizeType>(MaxSize -  str[LenPos]); }\n    };  // at most as many bytes as \"String\" above => 12 bytes in 32-bit mode, 16 bytes in 64-bit mode\n\n    // By using proper binary layout, retrieval of different integer types do not need conversions.\n    union Number {\n#if CEREAL_RAPIDJSON_ENDIAN == CEREAL_RAPIDJSON_LITTLEENDIAN\n        struct I {\n            int i;\n            char padding[4];\n        }i;\n        struct U {\n            unsigned u;\n            char padding2[4];\n        }u;\n#else\n        struct I {\n            char padding[4];\n            int i;\n        }i;\n        struct U {\n            char padding2[4];\n            unsigned u;\n        }u;\n#endif\n        int64_t i64;\n        uint64_t u64;\n        double d;\n    };  // 8 bytes\n\n    struct ObjectData {\n        SizeType size;\n        SizeType capacity;\n        Member* members;\n    };  // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode\n\n    struct ArrayData {\n        SizeType size;\n        SizeType capacity;\n        GenericValue* elements;\n    };  // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode\n\n    union Data {\n        String s;\n        ShortString ss;\n        Number n;\n        ObjectData o;\n        ArrayData a;\n        Flag f;\n    };  // 16 bytes in 32-bit mode, 24 bytes in 64-bit mode, 16 bytes in 64-bit with CEREAL_RAPIDJSON_48BITPOINTER_OPTIMIZATION\n\n    CEREAL_RAPIDJSON_FORCEINLINE const Ch* GetStringPointer() const { return CEREAL_RAPIDJSON_GETPOINTER(Ch, data_.s.str); }\n    CEREAL_RAPIDJSON_FORCEINLINE const Ch* SetStringPointer(const Ch* str) { return CEREAL_RAPIDJSON_SETPOINTER(Ch, data_.s.str, str); }\n    CEREAL_RAPIDJSON_FORCEINLINE GenericValue* GetElementsPointer() const { return CEREAL_RAPIDJSON_GETPOINTER(GenericValue, data_.a.elements); }\n    CEREAL_RAPIDJSON_FORCEINLINE GenericValue* SetElementsPointer(GenericValue* elements) { return CEREAL_RAPIDJSON_SETPOINTER(GenericValue, data_.a.elements, elements); }\n    CEREAL_RAPIDJSON_FORCEINLINE Member* GetMembersPointer() const { return CEREAL_RAPIDJSON_GETPOINTER(Member, data_.o.members); }\n    CEREAL_RAPIDJSON_FORCEINLINE Member* SetMembersPointer(Member* members) { return CEREAL_RAPIDJSON_SETPOINTER(Member, data_.o.members, members); }\n\n    // Initialize this value as array with initial data, without calling destructor.\n    void SetArrayRaw(GenericValue* values, SizeType count, Allocator& allocator) {\n        data_.f.flags = kArrayFlag;\n        if (count) {\n            GenericValue* e = static_cast<GenericValue*>(allocator.Malloc(count * sizeof(GenericValue)));\n            SetElementsPointer(e);\n            std::memcpy(static_cast<void*>(e), values, count * sizeof(GenericValue));\n        }\n        else\n            SetElementsPointer(0);\n        data_.a.size = data_.a.capacity = count;\n    }\n\n    //! Initialize this value as object with initial data, without calling destructor.\n    void SetObjectRaw(Member* members, SizeType count, Allocator& allocator) {\n        data_.f.flags = kObjectFlag;\n        if (count) {\n            Member* m = static_cast<Member*>(allocator.Malloc(count * sizeof(Member)));\n            SetMembersPointer(m);\n            std::memcpy(static_cast<void*>(m), members, count * sizeof(Member));\n        }\n        else\n            SetMembersPointer(0);\n        data_.o.size = data_.o.capacity = count;\n    }\n\n    //! Initialize this value as constant string, without calling destructor.\n    void SetStringRaw(StringRefType s) CEREAL_RAPIDJSON_NOEXCEPT {\n        data_.f.flags = kConstStringFlag;\n        SetStringPointer(s);\n        data_.s.length = s.length;\n    }\n\n    //! Initialize this value as copy string with initial data, without calling destructor.\n    void SetStringRaw(StringRefType s, Allocator& allocator) {\n        Ch* str = 0;\n        if (ShortString::Usable(s.length)) {\n            data_.f.flags = kShortStringFlag;\n            data_.ss.SetLength(s.length);\n            str = data_.ss.str;\n        } else {\n            data_.f.flags = kCopyStringFlag;\n            data_.s.length = s.length;\n            str = static_cast<Ch *>(allocator.Malloc((s.length + 1) * sizeof(Ch)));\n            SetStringPointer(str);\n        }\n        std::memcpy(str, s, s.length * sizeof(Ch));\n        str[s.length] = '\\0';\n    }\n\n    //! Assignment without calling destructor\n    void RawAssign(GenericValue& rhs) CEREAL_RAPIDJSON_NOEXCEPT {\n        data_ = rhs.data_;\n        // data_.f.flags = rhs.data_.f.flags;\n        rhs.data_.f.flags = kNullFlag;\n    }\n\n    template <typename SourceAllocator>\n    bool StringEqual(const GenericValue<Encoding, SourceAllocator>& rhs) const {\n        CEREAL_RAPIDJSON_ASSERT(IsString());\n        CEREAL_RAPIDJSON_ASSERT(rhs.IsString());\n\n        const SizeType len1 = GetStringLength();\n        const SizeType len2 = rhs.GetStringLength();\n        if(len1 != len2) { return false; }\n\n        const Ch* const str1 = GetString();\n        const Ch* const str2 = rhs.GetString();\n        if(str1 == str2) { return true; } // fast path for constant string\n\n        return (std::memcmp(str1, str2, sizeof(Ch) * len1) == 0);\n    }\n\n    Data data_;\n};\n\n//! GenericValue with UTF8 encoding\ntypedef GenericValue<UTF8<> > Value;\n\n///////////////////////////////////////////////////////////////////////////////\n// GenericDocument\n\n//! A document for parsing JSON text as DOM.\n/*!\n    \\note implements Handler concept\n    \\tparam Encoding Encoding for both parsing and string storage.\n    \\tparam Allocator Allocator for allocating memory for the DOM\n    \\tparam StackAllocator Allocator for allocating memory for stack during parsing.\n    \\warning Although GenericDocument inherits from GenericValue, the API does \\b not provide any virtual functions, especially no virtual destructor.  To avoid memory leaks, do not \\c delete a GenericDocument object via a pointer to a GenericValue.\n*/\ntemplate <typename Encoding, typename Allocator = MemoryPoolAllocator<>, typename StackAllocator = CrtAllocator>\nclass GenericDocument : public GenericValue<Encoding, Allocator> {\npublic:\n    typedef typename Encoding::Ch Ch;                       //!< Character type derived from Encoding.\n    typedef GenericValue<Encoding, Allocator> ValueType;    //!< Value type of the document.\n    typedef Allocator AllocatorType;                        //!< Allocator type from template parameter.\n\n    //! Constructor\n    /*! Creates an empty document of specified type.\n        \\param type             Mandatory type of object to create.\n        \\param allocator        Optional allocator for allocating memory.\n        \\param stackCapacity    Optional initial capacity of stack in bytes.\n        \\param stackAllocator   Optional allocator for allocating memory for stack.\n    */\n    explicit GenericDocument(Type type, Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) :\n        GenericValue<Encoding, Allocator>(type),  allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_()\n    {\n        if (!allocator_)\n            ownAllocator_ = allocator_ = CEREAL_RAPIDJSON_NEW(Allocator)();\n    }\n\n    //! Constructor\n    /*! Creates an empty document which type is Null.\n        \\param allocator        Optional allocator for allocating memory.\n        \\param stackCapacity    Optional initial capacity of stack in bytes.\n        \\param stackAllocator   Optional allocator for allocating memory for stack.\n    */\n    GenericDocument(Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) :\n        allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_()\n    {\n        if (!allocator_)\n            ownAllocator_ = allocator_ = CEREAL_RAPIDJSON_NEW(Allocator)();\n    }\n\n#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n    //! Move constructor in C++11\n    GenericDocument(GenericDocument&& rhs) CEREAL_RAPIDJSON_NOEXCEPT\n        : ValueType(std::forward<ValueType>(rhs)), // explicit cast to avoid prohibited move from Document\n          allocator_(rhs.allocator_),\n          ownAllocator_(rhs.ownAllocator_),\n          stack_(std::move(rhs.stack_)),\n          parseResult_(rhs.parseResult_)\n    {\n        rhs.allocator_ = 0;\n        rhs.ownAllocator_ = 0;\n        rhs.parseResult_ = ParseResult();\n    }\n#endif\n\n    ~GenericDocument() {\n        Destroy();\n    }\n\n#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n    //! Move assignment in C++11\n    GenericDocument& operator=(GenericDocument&& rhs) CEREAL_RAPIDJSON_NOEXCEPT\n    {\n        // The cast to ValueType is necessary here, because otherwise it would\n        // attempt to call GenericValue's templated assignment operator.\n        ValueType::operator=(std::forward<ValueType>(rhs));\n\n        // Calling the destructor here would prematurely call stack_'s destructor\n        Destroy();\n\n        allocator_ = rhs.allocator_;\n        ownAllocator_ = rhs.ownAllocator_;\n        stack_ = std::move(rhs.stack_);\n        parseResult_ = rhs.parseResult_;\n\n        rhs.allocator_ = 0;\n        rhs.ownAllocator_ = 0;\n        rhs.parseResult_ = ParseResult();\n\n        return *this;\n    }\n#endif\n\n    //! Exchange the contents of this document with those of another.\n    /*!\n        \\param rhs Another document.\n        \\note Constant complexity.\n        \\see GenericValue::Swap\n    */\n    GenericDocument& Swap(GenericDocument& rhs) CEREAL_RAPIDJSON_NOEXCEPT {\n        ValueType::Swap(rhs);\n        stack_.Swap(rhs.stack_);\n        internal::Swap(allocator_, rhs.allocator_);\n        internal::Swap(ownAllocator_, rhs.ownAllocator_);\n        internal::Swap(parseResult_, rhs.parseResult_);\n        return *this;\n    }\n\n    // Allow Swap with ValueType.\n    // Refer to Effective C++ 3rd Edition/Item 33: Avoid hiding inherited names.\n    using ValueType::Swap;\n\n    //! free-standing swap function helper\n    /*!\n        Helper function to enable support for common swap implementation pattern based on \\c std::swap:\n        \\code\n        void swap(MyClass& a, MyClass& b) {\n            using std::swap;\n            swap(a.doc, b.doc);\n            // ...\n        }\n        \\endcode\n        \\see Swap()\n     */\n    friend inline void swap(GenericDocument& a, GenericDocument& b) CEREAL_RAPIDJSON_NOEXCEPT { a.Swap(b); }\n\n    //! Populate this document by a generator which produces SAX events.\n    /*! \\tparam Generator A functor with <tt>bool f(Handler)</tt> prototype.\n        \\param g Generator functor which sends SAX events to the parameter.\n        \\return The document itself for fluent API.\n    */\n    template <typename Generator>\n    GenericDocument& Populate(Generator& g) {\n        ClearStackOnExit scope(*this);\n        if (g(*this)) {\n            CEREAL_RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object\n            ValueType::operator=(*stack_.template Pop<ValueType>(1));// Move value from stack to document\n        }\n        return *this;\n    }\n\n    //!@name Parse from stream\n    //!@{\n\n    //! Parse JSON text from an input stream (with Encoding conversion)\n    /*! \\tparam parseFlags Combination of \\ref ParseFlag.\n        \\tparam SourceEncoding Encoding of input stream\n        \\tparam InputStream Type of input stream, implementing Stream concept\n        \\param is Input stream to be parsed.\n        \\return The document itself for fluent API.\n    */\n    template <unsigned parseFlags, typename SourceEncoding, typename InputStream>\n    GenericDocument& ParseStream(InputStream& is) {\n        GenericReader<SourceEncoding, Encoding, StackAllocator> reader(\n            stack_.HasAllocator() ? &stack_.GetAllocator() : 0);\n        ClearStackOnExit scope(*this);\n        parseResult_ = reader.template Parse<parseFlags>(is, *this);\n        if (parseResult_) {\n            CEREAL_RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object\n            ValueType::operator=(*stack_.template Pop<ValueType>(1));// Move value from stack to document\n        }\n        return *this;\n    }\n\n    //! Parse JSON text from an input stream\n    /*! \\tparam parseFlags Combination of \\ref ParseFlag.\n        \\tparam InputStream Type of input stream, implementing Stream concept\n        \\param is Input stream to be parsed.\n        \\return The document itself for fluent API.\n    */\n    template <unsigned parseFlags, typename InputStream>\n    GenericDocument& ParseStream(InputStream& is) {\n        return ParseStream<parseFlags, Encoding, InputStream>(is);\n    }\n\n    //! Parse JSON text from an input stream (with \\ref kParseDefaultFlags)\n    /*! \\tparam InputStream Type of input stream, implementing Stream concept\n        \\param is Input stream to be parsed.\n        \\return The document itself for fluent API.\n    */\n    template <typename InputStream>\n    GenericDocument& ParseStream(InputStream& is) {\n        return ParseStream<kParseDefaultFlags, Encoding, InputStream>(is);\n    }\n    //!@}\n\n    //!@name Parse in-place from mutable string\n    //!@{\n\n    //! Parse JSON text from a mutable string\n    /*! \\tparam parseFlags Combination of \\ref ParseFlag.\n        \\param str Mutable zero-terminated string to be parsed.\n        \\return The document itself for fluent API.\n    */\n    template <unsigned parseFlags>\n    GenericDocument& ParseInsitu(Ch* str) {\n        GenericInsituStringStream<Encoding> s(str);\n        return ParseStream<parseFlags | kParseInsituFlag>(s);\n    }\n\n    //! Parse JSON text from a mutable string (with \\ref kParseDefaultFlags)\n    /*! \\param str Mutable zero-terminated string to be parsed.\n        \\return The document itself for fluent API.\n    */\n    GenericDocument& ParseInsitu(Ch* str) {\n        return ParseInsitu<kParseDefaultFlags>(str);\n    }\n    //!@}\n\n    //!@name Parse from read-only string\n    //!@{\n\n    //! Parse JSON text from a read-only string (with Encoding conversion)\n    /*! \\tparam parseFlags Combination of \\ref ParseFlag (must not contain \\ref kParseInsituFlag).\n        \\tparam SourceEncoding Transcoding from input Encoding\n        \\param str Read-only zero-terminated string to be parsed.\n    */\n    template <unsigned parseFlags, typename SourceEncoding>\n    GenericDocument& Parse(const typename SourceEncoding::Ch* str) {\n        CEREAL_RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag));\n        GenericStringStream<SourceEncoding> s(str);\n        return ParseStream<parseFlags, SourceEncoding>(s);\n    }\n\n    //! Parse JSON text from a read-only string\n    /*! \\tparam parseFlags Combination of \\ref ParseFlag (must not contain \\ref kParseInsituFlag).\n        \\param str Read-only zero-terminated string to be parsed.\n    */\n    template <unsigned parseFlags>\n    GenericDocument& Parse(const Ch* str) {\n        return Parse<parseFlags, Encoding>(str);\n    }\n\n    //! Parse JSON text from a read-only string (with \\ref kParseDefaultFlags)\n    /*! \\param str Read-only zero-terminated string to be parsed.\n    */\n    GenericDocument& Parse(const Ch* str) {\n        return Parse<kParseDefaultFlags>(str);\n    }\n\n    template <unsigned parseFlags, typename SourceEncoding>\n    GenericDocument& Parse(const typename SourceEncoding::Ch* str, size_t length) {\n        CEREAL_RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag));\n        MemoryStream ms(reinterpret_cast<const char*>(str), length * sizeof(typename SourceEncoding::Ch));\n        EncodedInputStream<SourceEncoding, MemoryStream> is(ms);\n        ParseStream<parseFlags, SourceEncoding>(is);\n        return *this;\n    }\n\n    template <unsigned parseFlags>\n    GenericDocument& Parse(const Ch* str, size_t length) {\n        return Parse<parseFlags, Encoding>(str, length);\n    }\n\n    GenericDocument& Parse(const Ch* str, size_t length) {\n        return Parse<kParseDefaultFlags>(str, length);\n    }\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    template <unsigned parseFlags, typename SourceEncoding>\n    GenericDocument& Parse(const std::basic_string<typename SourceEncoding::Ch>& str) {\n        // c_str() is constant complexity according to standard. Should be faster than Parse(const char*, size_t)\n        return Parse<parseFlags, SourceEncoding>(str.c_str());\n    }\n\n    template <unsigned parseFlags>\n    GenericDocument& Parse(const std::basic_string<Ch>& str) {\n        return Parse<parseFlags, Encoding>(str.c_str());\n    }\n\n    GenericDocument& Parse(const std::basic_string<Ch>& str) {\n        return Parse<kParseDefaultFlags>(str);\n    }\n#endif // CEREAL_RAPIDJSON_HAS_STDSTRING\n\n    //!@}\n\n    //!@name Handling parse errors\n    //!@{\n\n    //! Whether a parse error has occurred in the last parsing.\n    bool HasParseError() const { return parseResult_.IsError(); }\n\n    //! Get the \\ref ParseErrorCode of last parsing.\n    ParseErrorCode GetParseError() const { return parseResult_.Code(); }\n\n    //! Get the position of last parsing error in input, 0 otherwise.\n    size_t GetErrorOffset() const { return parseResult_.Offset(); }\n\n    //! Implicit conversion to get the last parse result\n#ifndef __clang // -Wdocumentation\n    /*! \\return \\ref ParseResult of the last parse operation\n\n        \\code\n          Document doc;\n          ParseResult ok = doc.Parse(json);\n          if (!ok)\n            printf( \"JSON parse error: %s (%u)\\n\", GetParseError_En(ok.Code()), ok.Offset());\n        \\endcode\n     */\n#endif\n    operator ParseResult() const { return parseResult_; }\n    //!@}\n\n    //! Get the allocator of this document.\n    Allocator& GetAllocator() {\n        CEREAL_RAPIDJSON_ASSERT(allocator_);\n        return *allocator_;\n    }\n\n    //! Get the capacity of stack in bytes.\n    size_t GetStackCapacity() const { return stack_.GetCapacity(); }\n\nprivate:\n    // clear stack on any exit from ParseStream, e.g. due to exception\n    struct ClearStackOnExit {\n        explicit ClearStackOnExit(GenericDocument& d) : d_(d) {}\n        ~ClearStackOnExit() { d_.ClearStack(); }\n    private:\n        ClearStackOnExit(const ClearStackOnExit&);\n        ClearStackOnExit& operator=(const ClearStackOnExit&);\n        GenericDocument& d_;\n    };\n\n    // callers of the following private Handler functions\n    // template <typename,typename,typename> friend class GenericReader; // for parsing\n    template <typename, typename> friend class GenericValue; // for deep copying\n\npublic:\n    // Implementation of Handler\n    bool Null() { new (stack_.template Push<ValueType>()) ValueType(); return true; }\n    bool Bool(bool b) { new (stack_.template Push<ValueType>()) ValueType(b); return true; }\n    bool Int(int i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }\n    bool Uint(unsigned i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }\n    bool Int64(int64_t i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }\n    bool Uint64(uint64_t i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }\n    bool Double(double d) { new (stack_.template Push<ValueType>()) ValueType(d); return true; }\n\n    bool RawNumber(const Ch* str, SizeType length, bool copy) {\n        if (copy)\n            new (stack_.template Push<ValueType>()) ValueType(str, length, GetAllocator());\n        else\n            new (stack_.template Push<ValueType>()) ValueType(str, length);\n        return true;\n    }\n\n    bool String(const Ch* str, SizeType length, bool copy) {\n        if (copy)\n            new (stack_.template Push<ValueType>()) ValueType(str, length, GetAllocator());\n        else\n            new (stack_.template Push<ValueType>()) ValueType(str, length);\n        return true;\n    }\n\n    bool StartObject() { new (stack_.template Push<ValueType>()) ValueType(kObjectType); return true; }\n\n    bool Key(const Ch* str, SizeType length, bool copy) { return String(str, length, copy); }\n\n    bool EndObject(SizeType memberCount) {\n        typename ValueType::Member* members = stack_.template Pop<typename ValueType::Member>(memberCount);\n        stack_.template Top<ValueType>()->SetObjectRaw(members, memberCount, GetAllocator());\n        return true;\n    }\n\n    bool StartArray() { new (stack_.template Push<ValueType>()) ValueType(kArrayType); return true; }\n\n    bool EndArray(SizeType elementCount) {\n        ValueType* elements = stack_.template Pop<ValueType>(elementCount);\n        stack_.template Top<ValueType>()->SetArrayRaw(elements, elementCount, GetAllocator());\n        return true;\n    }\n\nprivate:\n    //! Prohibit copying\n    GenericDocument(const GenericDocument&);\n    //! Prohibit assignment\n    GenericDocument& operator=(const GenericDocument&);\n\n    void ClearStack() {\n        if (Allocator::kNeedFree)\n            while (stack_.GetSize() > 0)    // Here assumes all elements in stack array are GenericValue (Member is actually 2 GenericValue objects)\n                (stack_.template Pop<ValueType>(1))->~ValueType();\n        else\n            stack_.Clear();\n        stack_.ShrinkToFit();\n    }\n\n    void Destroy() {\n        CEREAL_RAPIDJSON_DELETE(ownAllocator_);\n    }\n\n    static const size_t kDefaultStackCapacity = 1024;\n    Allocator* allocator_;\n    Allocator* ownAllocator_;\n    internal::Stack<StackAllocator> stack_;\n    ParseResult parseResult_;\n};\n\n//! GenericDocument with UTF8 encoding\ntypedef GenericDocument<UTF8<> > Document;\n\n//! Helper class for accessing Value of array type.\n/*!\n    Instance of this helper class is obtained by \\c GenericValue::GetArray().\n    In addition to all APIs for array type, it provides range-based for loop if \\c CEREAL_RAPIDJSON_HAS_CXX11_RANGE_FOR=1.\n*/\ntemplate <bool Const, typename ValueT>\nclass GenericArray {\npublic:\n    typedef GenericArray<true, ValueT> ConstArray;\n    typedef GenericArray<false, ValueT> Array;\n    typedef ValueT PlainType;\n    typedef typename internal::MaybeAddConst<Const,PlainType>::Type ValueType;\n    typedef ValueType* ValueIterator;  // This may be const or non-const iterator\n    typedef const ValueT* ConstValueIterator;\n    typedef typename ValueType::AllocatorType AllocatorType;\n    typedef typename ValueType::StringRefType StringRefType;\n\n    template <typename, typename>\n    friend class GenericValue;\n\n    GenericArray(const GenericArray& rhs) : value_(rhs.value_) {}\n    GenericArray& operator=(const GenericArray& rhs) { value_ = rhs.value_; return *this; }\n    ~GenericArray() {}\n\n    SizeType Size() const { return value_.Size(); }\n    SizeType Capacity() const { return value_.Capacity(); }\n    bool Empty() const { return value_.Empty(); }\n    void Clear() const { value_.Clear(); }\n    ValueType& operator[](SizeType index) const {  return value_[index]; }\n    ValueIterator Begin() const { return value_.Begin(); }\n    ValueIterator End() const { return value_.End(); }\n    GenericArray Reserve(SizeType newCapacity, AllocatorType &allocator) const { value_.Reserve(newCapacity, allocator); return *this; }\n    GenericArray PushBack(ValueType& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; }\n#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n    GenericArray PushBack(ValueType&& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; }\n#endif // CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n    GenericArray PushBack(StringRefType value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; }\n    template <typename T> CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (const GenericArray&)) PushBack(T value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; }\n    GenericArray PopBack() const { value_.PopBack(); return *this; }\n    ValueIterator Erase(ConstValueIterator pos) const { return value_.Erase(pos); }\n    ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) const { return value_.Erase(first, last); }\n\n#if CEREAL_RAPIDJSON_HAS_CXX11_RANGE_FOR\n    ValueIterator begin() const { return value_.Begin(); }\n    ValueIterator end() const { return value_.End(); }\n#endif\n\nprivate:\n    GenericArray();\n    GenericArray(ValueType& value) : value_(value) {}\n    ValueType& value_;\n};\n\n//! Helper class for accessing Value of object type.\n/*!\n    Instance of this helper class is obtained by \\c GenericValue::GetObject().\n    In addition to all APIs for array type, it provides range-based for loop if \\c CEREAL_RAPIDJSON_HAS_CXX11_RANGE_FOR=1.\n*/\ntemplate <bool Const, typename ValueT>\nclass GenericObject {\npublic:\n    typedef GenericObject<true, ValueT> ConstObject;\n    typedef GenericObject<false, ValueT> Object;\n    typedef ValueT PlainType;\n    typedef typename internal::MaybeAddConst<Const,PlainType>::Type ValueType;\n    typedef GenericMemberIterator<Const, typename ValueT::EncodingType, typename ValueT::AllocatorType> MemberIterator;  // This may be const or non-const iterator\n    typedef GenericMemberIterator<true, typename ValueT::EncodingType, typename ValueT::AllocatorType> ConstMemberIterator;\n    typedef typename ValueType::AllocatorType AllocatorType;\n    typedef typename ValueType::StringRefType StringRefType;\n    typedef typename ValueType::EncodingType EncodingType;\n    typedef typename ValueType::Ch Ch;\n\n    template <typename, typename>\n    friend class GenericValue;\n\n    GenericObject(const GenericObject& rhs) : value_(rhs.value_) {}\n    GenericObject& operator=(const GenericObject& rhs) { value_ = rhs.value_; return *this; }\n    ~GenericObject() {}\n\n    SizeType MemberCount() const { return value_.MemberCount(); }\n    SizeType MemberCapacity() const { return value_.MemberCapacity(); }\n    bool ObjectEmpty() const { return value_.ObjectEmpty(); }\n    template <typename T> ValueType& operator[](T* name) const { return value_[name]; }\n    template <typename SourceAllocator> ValueType& operator[](const GenericValue<EncodingType, SourceAllocator>& name) const { return value_[name]; }\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    ValueType& operator[](const std::basic_string<Ch>& name) const { return value_[name]; }\n#endif\n    MemberIterator MemberBegin() const { return value_.MemberBegin(); }\n    MemberIterator MemberEnd() const { return value_.MemberEnd(); }\n    GenericObject MemberReserve(SizeType newCapacity, AllocatorType &allocator) const { value_.MemberReserve(newCapacity, allocator); return *this; }\n    bool HasMember(const Ch* name) const { return value_.HasMember(name); }\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    bool HasMember(const std::basic_string<Ch>& name) const { return value_.HasMember(name); }\n#endif\n    template <typename SourceAllocator> bool HasMember(const GenericValue<EncodingType, SourceAllocator>& name) const { return value_.HasMember(name); }\n    MemberIterator FindMember(const Ch* name) const { return value_.FindMember(name); }\n    template <typename SourceAllocator> MemberIterator FindMember(const GenericValue<EncodingType, SourceAllocator>& name) const { return value_.FindMember(name); }\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    MemberIterator FindMember(const std::basic_string<Ch>& name) const { return value_.FindMember(name); }\n#endif\n    GenericObject AddMember(ValueType& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }\n    GenericObject AddMember(ValueType& name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    GenericObject AddMember(ValueType& name, std::basic_string<Ch>& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }\n#endif\n    template <typename T> CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (ValueType&)) AddMember(ValueType& name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }\n#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n    GenericObject AddMember(ValueType&& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }\n    GenericObject AddMember(ValueType&& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }\n    GenericObject AddMember(ValueType& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }\n    GenericObject AddMember(StringRefType name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }\n#endif // CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n    GenericObject AddMember(StringRefType name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }\n    GenericObject AddMember(StringRefType name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }\n    template <typename T> CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericObject)) AddMember(StringRefType name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }\n    void RemoveAllMembers() { value_.RemoveAllMembers(); }\n    bool RemoveMember(const Ch* name) const { return value_.RemoveMember(name); }\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    bool RemoveMember(const std::basic_string<Ch>& name) const { return value_.RemoveMember(name); }\n#endif\n    template <typename SourceAllocator> bool RemoveMember(const GenericValue<EncodingType, SourceAllocator>& name) const { return value_.RemoveMember(name); }\n    MemberIterator RemoveMember(MemberIterator m) const { return value_.RemoveMember(m); }\n    MemberIterator EraseMember(ConstMemberIterator pos) const { return value_.EraseMember(pos); }\n    MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) const { return value_.EraseMember(first, last); }\n    bool EraseMember(const Ch* name) const { return value_.EraseMember(name); }\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    bool EraseMember(const std::basic_string<Ch>& name) const { return EraseMember(ValueType(StringRef(name))); }\n#endif\n    template <typename SourceAllocator> bool EraseMember(const GenericValue<EncodingType, SourceAllocator>& name) const { return value_.EraseMember(name); }\n\n#if CEREAL_RAPIDJSON_HAS_CXX11_RANGE_FOR\n    MemberIterator begin() const { return value_.MemberBegin(); }\n    MemberIterator end() const { return value_.MemberEnd(); }\n#endif\n\nprivate:\n    GenericObject();\n    GenericObject(ValueType& value) : value_(value) {}\n    ValueType& value_;\n};\n\nCEREAL_RAPIDJSON_NAMESPACE_END\nCEREAL_RAPIDJSON_DIAG_POP\n\n#endif // CEREAL_RAPIDJSON_DOCUMENT_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/encodedstream.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_ENCODEDSTREAM_H_\n#define CEREAL_RAPIDJSON_ENCODEDSTREAM_H_\n\n#include \"stream.h\"\n#include \"memorystream.h\"\n\n#ifdef __GNUC__\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(effc++)\n#endif\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(padded)\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n//! Input byte stream wrapper with a statically bound encoding.\n/*!\n    \\tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE.\n    \\tparam InputByteStream Type of input byte stream. For example, FileReadStream.\n*/\ntemplate <typename Encoding, typename InputByteStream>\nclass EncodedInputStream {\n    CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1);\npublic:\n    typedef typename Encoding::Ch Ch;\n\n    EncodedInputStream(InputByteStream& is) : is_(is) { \n        current_ = Encoding::TakeBOM(is_);\n    }\n\n    Ch Peek() const { return current_; }\n    Ch Take() { Ch c = current_; current_ = Encoding::Take(is_); return c; }\n    size_t Tell() const { return is_.Tell(); }\n\n    // Not implemented\n    void Put(Ch) { CEREAL_RAPIDJSON_ASSERT(false); }\n    void Flush() { CEREAL_RAPIDJSON_ASSERT(false); } \n    Ch* PutBegin() { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n    size_t PutEnd(Ch*) { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n\nprivate:\n    EncodedInputStream(const EncodedInputStream&);\n    EncodedInputStream& operator=(const EncodedInputStream&);\n\n    InputByteStream& is_;\n    Ch current_;\n};\n\n//! Specialized for UTF8 MemoryStream.\ntemplate <>\nclass EncodedInputStream<UTF8<>, MemoryStream> {\npublic:\n    typedef UTF8<>::Ch Ch;\n\n    EncodedInputStream(MemoryStream& is) : is_(is) {\n        if (static_cast<unsigned char>(is_.Peek()) == 0xEFu) is_.Take();\n        if (static_cast<unsigned char>(is_.Peek()) == 0xBBu) is_.Take();\n        if (static_cast<unsigned char>(is_.Peek()) == 0xBFu) is_.Take();\n    }\n    Ch Peek() const { return is_.Peek(); }\n    Ch Take() { return is_.Take(); }\n    size_t Tell() const { return is_.Tell(); }\n\n    // Not implemented\n    void Put(Ch) {}\n    void Flush() {} \n    Ch* PutBegin() { return 0; }\n    size_t PutEnd(Ch*) { return 0; }\n\n    MemoryStream& is_;\n\nprivate:\n    EncodedInputStream(const EncodedInputStream&);\n    EncodedInputStream& operator=(const EncodedInputStream&);\n};\n\n//! Output byte stream wrapper with statically bound encoding.\n/*!\n    \\tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE.\n    \\tparam OutputByteStream Type of input byte stream. For example, FileWriteStream.\n*/\ntemplate <typename Encoding, typename OutputByteStream>\nclass EncodedOutputStream {\n    CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1);\npublic:\n    typedef typename Encoding::Ch Ch;\n\n    EncodedOutputStream(OutputByteStream& os, bool putBOM = true) : os_(os) { \n        if (putBOM)\n            Encoding::PutBOM(os_);\n    }\n\n    void Put(Ch c) { Encoding::Put(os_, c);  }\n    void Flush() { os_.Flush(); }\n\n    // Not implemented\n    Ch Peek() const { CEREAL_RAPIDJSON_ASSERT(false); return 0;}\n    Ch Take() { CEREAL_RAPIDJSON_ASSERT(false); return 0;}\n    size_t Tell() const { CEREAL_RAPIDJSON_ASSERT(false);  return 0; }\n    Ch* PutBegin() { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n    size_t PutEnd(Ch*) { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n\nprivate:\n    EncodedOutputStream(const EncodedOutputStream&);\n    EncodedOutputStream& operator=(const EncodedOutputStream&);\n\n    OutputByteStream& os_;\n};\n\n#define CEREAL_RAPIDJSON_ENCODINGS_FUNC(x) UTF8<Ch>::x, UTF16LE<Ch>::x, UTF16BE<Ch>::x, UTF32LE<Ch>::x, UTF32BE<Ch>::x\n\n//! Input stream wrapper with dynamically bound encoding and automatic encoding detection.\n/*!\n    \\tparam CharType Type of character for reading.\n    \\tparam InputByteStream type of input byte stream to be wrapped.\n*/\ntemplate <typename CharType, typename InputByteStream>\nclass AutoUTFInputStream {\n    CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1);\npublic:\n    typedef CharType Ch;\n\n    //! Constructor.\n    /*!\n        \\param is input stream to be wrapped.\n        \\param type UTF encoding type if it is not detected from the stream.\n    */\n    AutoUTFInputStream(InputByteStream& is, UTFType type = kUTF8) : is_(&is), type_(type), hasBOM_(false) {\n        CEREAL_RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE);        \n        DetectType();\n        static const TakeFunc f[] = { CEREAL_RAPIDJSON_ENCODINGS_FUNC(Take) };\n        takeFunc_ = f[type_];\n        current_ = takeFunc_(*is_);\n    }\n\n    UTFType GetType() const { return type_; }\n    bool HasBOM() const { return hasBOM_; }\n\n    Ch Peek() const { return current_; }\n    Ch Take() { Ch c = current_; current_ = takeFunc_(*is_); return c; }\n    size_t Tell() const { return is_->Tell(); }\n\n    // Not implemented\n    void Put(Ch) { CEREAL_RAPIDJSON_ASSERT(false); }\n    void Flush() { CEREAL_RAPIDJSON_ASSERT(false); } \n    Ch* PutBegin() { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n    size_t PutEnd(Ch*) { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n\nprivate:\n    AutoUTFInputStream(const AutoUTFInputStream&);\n    AutoUTFInputStream& operator=(const AutoUTFInputStream&);\n\n    // Detect encoding type with BOM or RFC 4627\n    void DetectType() {\n        // BOM (Byte Order Mark):\n        // 00 00 FE FF  UTF-32BE\n        // FF FE 00 00  UTF-32LE\n        // FE FF        UTF-16BE\n        // FF FE        UTF-16LE\n        // EF BB BF     UTF-8\n\n        const unsigned char* c = reinterpret_cast<const unsigned char *>(is_->Peek4());\n        if (!c)\n            return;\n\n        unsigned bom = static_cast<unsigned>(c[0] | (c[1] << 8) | (c[2] << 16) | (c[3] << 24));\n        hasBOM_ = false;\n        if (bom == 0xFFFE0000)                  { type_ = kUTF32BE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); }\n        else if (bom == 0x0000FEFF)             { type_ = kUTF32LE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); }\n        else if ((bom & 0xFFFF) == 0xFFFE)      { type_ = kUTF16BE; hasBOM_ = true; is_->Take(); is_->Take();                           }\n        else if ((bom & 0xFFFF) == 0xFEFF)      { type_ = kUTF16LE; hasBOM_ = true; is_->Take(); is_->Take();                           }\n        else if ((bom & 0xFFFFFF) == 0xBFBBEF)  { type_ = kUTF8;    hasBOM_ = true; is_->Take(); is_->Take(); is_->Take();              }\n\n        // RFC 4627: Section 3\n        // \"Since the first two characters of a JSON text will always be ASCII\n        // characters [RFC0020], it is possible to determine whether an octet\n        // stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking\n        // at the pattern of nulls in the first four octets.\"\n        // 00 00 00 xx  UTF-32BE\n        // 00 xx 00 xx  UTF-16BE\n        // xx 00 00 00  UTF-32LE\n        // xx 00 xx 00  UTF-16LE\n        // xx xx xx xx  UTF-8\n\n        if (!hasBOM_) {\n            int pattern = (c[0] ? 1 : 0) | (c[1] ? 2 : 0) | (c[2] ? 4 : 0) | (c[3] ? 8 : 0);\n            switch (pattern) {\n            case 0x08: type_ = kUTF32BE; break;\n            case 0x0A: type_ = kUTF16BE; break;\n            case 0x01: type_ = kUTF32LE; break;\n            case 0x05: type_ = kUTF16LE; break;\n            case 0x0F: type_ = kUTF8;    break;\n            default: break; // Use type defined by user.\n            }\n        }\n\n        // Runtime check whether the size of character type is sufficient. It only perform checks with assertion.\n        if (type_ == kUTF16LE || type_ == kUTF16BE) CEREAL_RAPIDJSON_ASSERT(sizeof(Ch) >= 2);\n        if (type_ == kUTF32LE || type_ == kUTF32BE) CEREAL_RAPIDJSON_ASSERT(sizeof(Ch) >= 4);\n    }\n\n    typedef Ch (*TakeFunc)(InputByteStream& is);\n    InputByteStream* is_;\n    UTFType type_;\n    Ch current_;\n    TakeFunc takeFunc_;\n    bool hasBOM_;\n};\n\n//! Output stream wrapper with dynamically bound encoding and automatic encoding detection.\n/*!\n    \\tparam CharType Type of character for writing.\n    \\tparam OutputByteStream type of output byte stream to be wrapped.\n*/\ntemplate <typename CharType, typename OutputByteStream>\nclass AutoUTFOutputStream {\n    CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1);\npublic:\n    typedef CharType Ch;\n\n    //! Constructor.\n    /*!\n        \\param os output stream to be wrapped.\n        \\param type UTF encoding type.\n        \\param putBOM Whether to write BOM at the beginning of the stream.\n    */\n    AutoUTFOutputStream(OutputByteStream& os, UTFType type, bool putBOM) : os_(&os), type_(type) {\n        CEREAL_RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE);\n\n        // Runtime check whether the size of character type is sufficient. It only perform checks with assertion.\n        if (type_ == kUTF16LE || type_ == kUTF16BE) CEREAL_RAPIDJSON_ASSERT(sizeof(Ch) >= 2);\n        if (type_ == kUTF32LE || type_ == kUTF32BE) CEREAL_RAPIDJSON_ASSERT(sizeof(Ch) >= 4);\n\n        static const PutFunc f[] = { CEREAL_RAPIDJSON_ENCODINGS_FUNC(Put) };\n        putFunc_ = f[type_];\n\n        if (putBOM)\n            PutBOM();\n    }\n\n    UTFType GetType() const { return type_; }\n\n    void Put(Ch c) { putFunc_(*os_, c); }\n    void Flush() { os_->Flush(); } \n\n    // Not implemented\n    Ch Peek() const { CEREAL_RAPIDJSON_ASSERT(false); return 0;}\n    Ch Take() { CEREAL_RAPIDJSON_ASSERT(false); return 0;}\n    size_t Tell() const { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n    Ch* PutBegin() { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n    size_t PutEnd(Ch*) { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n\nprivate:\n    AutoUTFOutputStream(const AutoUTFOutputStream&);\n    AutoUTFOutputStream& operator=(const AutoUTFOutputStream&);\n\n    void PutBOM() { \n        typedef void (*PutBOMFunc)(OutputByteStream&);\n        static const PutBOMFunc f[] = { CEREAL_RAPIDJSON_ENCODINGS_FUNC(PutBOM) };\n        f[type_](*os_);\n    }\n\n    typedef void (*PutFunc)(OutputByteStream&, Ch);\n\n    OutputByteStream* os_;\n    UTFType type_;\n    PutFunc putFunc_;\n};\n\n#undef CEREAL_RAPIDJSON_ENCODINGS_FUNC\n\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#ifdef __GNUC__\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#endif // CEREAL_RAPIDJSON_FILESTREAM_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/encodings.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_ENCODINGS_H_\n#define CEREAL_RAPIDJSON_ENCODINGS_H_\n\n#include \"rapidjson.h\"\n\n#if defined(_MSC_VER) && !defined(__clang__)\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(4244) // conversion from 'type1' to 'type2', possible loss of data\nCEREAL_RAPIDJSON_DIAG_OFF(4702)  // unreachable code\n#elif defined(__GNUC__)\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(effc++)\nCEREAL_RAPIDJSON_DIAG_OFF(overflow)\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n///////////////////////////////////////////////////////////////////////////////\n// Encoding\n\n/*! \\class rapidjson::Encoding\n    \\brief Concept for encoding of Unicode characters.\n\n\\code\nconcept Encoding {\n    typename Ch;    //! Type of character. A \"character\" is actually a code unit in unicode's definition.\n\n    enum { supportUnicode = 1 }; // or 0 if not supporting unicode\n\n    //! \\brief Encode a Unicode codepoint to an output stream.\n    //! \\param os Output stream.\n    //! \\param codepoint An unicode codepoint, ranging from 0x0 to 0x10FFFF inclusively.\n    template<typename OutputStream>\n    static void Encode(OutputStream& os, unsigned codepoint);\n\n    //! \\brief Decode a Unicode codepoint from an input stream.\n    //! \\param is Input stream.\n    //! \\param codepoint Output of the unicode codepoint.\n    //! \\return true if a valid codepoint can be decoded from the stream.\n    template <typename InputStream>\n    static bool Decode(InputStream& is, unsigned* codepoint);\n\n    //! \\brief Validate one Unicode codepoint from an encoded stream.\n    //! \\param is Input stream to obtain codepoint.\n    //! \\param os Output for copying one codepoint.\n    //! \\return true if it is valid.\n    //! \\note This function just validating and copying the codepoint without actually decode it.\n    template <typename InputStream, typename OutputStream>\n    static bool Validate(InputStream& is, OutputStream& os);\n\n    // The following functions are deal with byte streams.\n\n    //! Take a character from input byte stream, skip BOM if exist.\n    template <typename InputByteStream>\n    static CharType TakeBOM(InputByteStream& is);\n\n    //! Take a character from input byte stream.\n    template <typename InputByteStream>\n    static Ch Take(InputByteStream& is);\n\n    //! Put BOM to output byte stream.\n    template <typename OutputByteStream>\n    static void PutBOM(OutputByteStream& os);\n\n    //! Put a character to output byte stream.\n    template <typename OutputByteStream>\n    static void Put(OutputByteStream& os, Ch c);\n};\n\\endcode\n*/\n\n///////////////////////////////////////////////////////////////////////////////\n// UTF8\n\n//! UTF-8 encoding.\n/*! http://en.wikipedia.org/wiki/UTF-8\n    http://tools.ietf.org/html/rfc3629\n    \\tparam CharType Code unit for storing 8-bit UTF-8 data. Default is char.\n    \\note implements Encoding concept\n*/\ntemplate<typename CharType = char>\nstruct UTF8 {\n    typedef CharType Ch;\n\n    enum { supportUnicode = 1 };\n\n    template<typename OutputStream>\n    static void Encode(OutputStream& os, unsigned codepoint) {\n        if (codepoint <= 0x7F) \n            os.Put(static_cast<Ch>(codepoint & 0xFF));\n        else if (codepoint <= 0x7FF) {\n            os.Put(static_cast<Ch>(0xC0 | ((codepoint >> 6) & 0xFF)));\n            os.Put(static_cast<Ch>(0x80 | ((codepoint & 0x3F))));\n        }\n        else if (codepoint <= 0xFFFF) {\n            os.Put(static_cast<Ch>(0xE0 | ((codepoint >> 12) & 0xFF)));\n            os.Put(static_cast<Ch>(0x80 | ((codepoint >> 6) & 0x3F)));\n            os.Put(static_cast<Ch>(0x80 | (codepoint & 0x3F)));\n        }\n        else {\n            CEREAL_RAPIDJSON_ASSERT(codepoint <= 0x10FFFF);\n            os.Put(static_cast<Ch>(0xF0 | ((codepoint >> 18) & 0xFF)));\n            os.Put(static_cast<Ch>(0x80 | ((codepoint >> 12) & 0x3F)));\n            os.Put(static_cast<Ch>(0x80 | ((codepoint >> 6) & 0x3F)));\n            os.Put(static_cast<Ch>(0x80 | (codepoint & 0x3F)));\n        }\n    }\n\n    template<typename OutputStream>\n    static void EncodeUnsafe(OutputStream& os, unsigned codepoint) {\n        if (codepoint <= 0x7F) \n            PutUnsafe(os, static_cast<Ch>(codepoint & 0xFF));\n        else if (codepoint <= 0x7FF) {\n            PutUnsafe(os, static_cast<Ch>(0xC0 | ((codepoint >> 6) & 0xFF)));\n            PutUnsafe(os, static_cast<Ch>(0x80 | ((codepoint & 0x3F))));\n        }\n        else if (codepoint <= 0xFFFF) {\n            PutUnsafe(os, static_cast<Ch>(0xE0 | ((codepoint >> 12) & 0xFF)));\n            PutUnsafe(os, static_cast<Ch>(0x80 | ((codepoint >> 6) & 0x3F)));\n            PutUnsafe(os, static_cast<Ch>(0x80 | (codepoint & 0x3F)));\n        }\n        else {\n            CEREAL_RAPIDJSON_ASSERT(codepoint <= 0x10FFFF);\n            PutUnsafe(os, static_cast<Ch>(0xF0 | ((codepoint >> 18) & 0xFF)));\n            PutUnsafe(os, static_cast<Ch>(0x80 | ((codepoint >> 12) & 0x3F)));\n            PutUnsafe(os, static_cast<Ch>(0x80 | ((codepoint >> 6) & 0x3F)));\n            PutUnsafe(os, static_cast<Ch>(0x80 | (codepoint & 0x3F)));\n        }\n    }\n\n    template <typename InputStream>\n    static bool Decode(InputStream& is, unsigned* codepoint) {\n#define CEREAL_RAPIDJSON_COPY() c = is.Take(); *codepoint = (*codepoint << 6) | (static_cast<unsigned char>(c) & 0x3Fu)\n#define CEREAL_RAPIDJSON_TRANS(mask) result &= ((GetRange(static_cast<unsigned char>(c)) & mask) != 0)\n#define CEREAL_RAPIDJSON_TAIL() CEREAL_RAPIDJSON_COPY(); CEREAL_RAPIDJSON_TRANS(0x70)\n        typename InputStream::Ch c = is.Take();\n        if (!(c & 0x80)) {\n            *codepoint = static_cast<unsigned char>(c);\n            return true;\n        }\n\n        unsigned char type = GetRange(static_cast<unsigned char>(c));\n        if (type >= 32) {\n            *codepoint = 0;\n        } else {\n            *codepoint = (0xFFu >> type) & static_cast<unsigned char>(c);\n        }\n        bool result = true;\n        switch (type) {\n        case 2: CEREAL_RAPIDJSON_TAIL(); return result;\n        case 3: CEREAL_RAPIDJSON_TAIL(); CEREAL_RAPIDJSON_TAIL(); return result;\n        case 4: CEREAL_RAPIDJSON_COPY(); CEREAL_RAPIDJSON_TRANS(0x50); CEREAL_RAPIDJSON_TAIL(); return result;\n        case 5: CEREAL_RAPIDJSON_COPY(); CEREAL_RAPIDJSON_TRANS(0x10); CEREAL_RAPIDJSON_TAIL(); CEREAL_RAPIDJSON_TAIL(); return result;\n        case 6: CEREAL_RAPIDJSON_TAIL(); CEREAL_RAPIDJSON_TAIL(); CEREAL_RAPIDJSON_TAIL(); return result;\n        case 10: CEREAL_RAPIDJSON_COPY(); CEREAL_RAPIDJSON_TRANS(0x20); CEREAL_RAPIDJSON_TAIL(); return result;\n        case 11: CEREAL_RAPIDJSON_COPY(); CEREAL_RAPIDJSON_TRANS(0x60); CEREAL_RAPIDJSON_TAIL(); CEREAL_RAPIDJSON_TAIL(); return result;\n        default: return false;\n        }\n#undef CEREAL_RAPIDJSON_COPY\n#undef CEREAL_RAPIDJSON_TRANS\n#undef CEREAL_RAPIDJSON_TAIL\n    }\n\n    template <typename InputStream, typename OutputStream>\n    static bool Validate(InputStream& is, OutputStream& os) {\n#define CEREAL_RAPIDJSON_COPY() os.Put(c = is.Take())\n#define CEREAL_RAPIDJSON_TRANS(mask) result &= ((GetRange(static_cast<unsigned char>(c)) & mask) != 0)\n#define CEREAL_RAPIDJSON_TAIL() CEREAL_RAPIDJSON_COPY(); CEREAL_RAPIDJSON_TRANS(0x70)\n        Ch c;\n        CEREAL_RAPIDJSON_COPY();\n        if (!(c & 0x80))\n            return true;\n\n        bool result = true;\n        switch (GetRange(static_cast<unsigned char>(c))) {\n        case 2: CEREAL_RAPIDJSON_TAIL(); return result;\n        case 3: CEREAL_RAPIDJSON_TAIL(); CEREAL_RAPIDJSON_TAIL(); return result;\n        case 4: CEREAL_RAPIDJSON_COPY(); CEREAL_RAPIDJSON_TRANS(0x50); CEREAL_RAPIDJSON_TAIL(); return result;\n        case 5: CEREAL_RAPIDJSON_COPY(); CEREAL_RAPIDJSON_TRANS(0x10); CEREAL_RAPIDJSON_TAIL(); CEREAL_RAPIDJSON_TAIL(); return result;\n        case 6: CEREAL_RAPIDJSON_TAIL(); CEREAL_RAPIDJSON_TAIL(); CEREAL_RAPIDJSON_TAIL(); return result;\n        case 10: CEREAL_RAPIDJSON_COPY(); CEREAL_RAPIDJSON_TRANS(0x20); CEREAL_RAPIDJSON_TAIL(); return result;\n        case 11: CEREAL_RAPIDJSON_COPY(); CEREAL_RAPIDJSON_TRANS(0x60); CEREAL_RAPIDJSON_TAIL(); CEREAL_RAPIDJSON_TAIL(); return result;\n        default: return false;\n        }\n#undef CEREAL_RAPIDJSON_COPY\n#undef CEREAL_RAPIDJSON_TRANS\n#undef CEREAL_RAPIDJSON_TAIL\n    }\n\n    static unsigned char GetRange(unsigned char c) {\n        // Referring to DFA of http://bjoern.hoehrmann.de/utf-8/decoder/dfa/\n        // With new mapping 1 -> 0x10, 7 -> 0x20, 9 -> 0x40, such that AND operation can test multiple types.\n        static const unsigned char type[] = {\n            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n            0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,\n            0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,\n            0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,\n            0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,\n            8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,\n            10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8,\n        };\n        return type[c];\n    }\n\n    template <typename InputByteStream>\n    static CharType TakeBOM(InputByteStream& is) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1);\n        typename InputByteStream::Ch c = Take(is);\n        if (static_cast<unsigned char>(c) != 0xEFu) return c;\n        c = is.Take();\n        if (static_cast<unsigned char>(c) != 0xBBu) return c;\n        c = is.Take();\n        if (static_cast<unsigned char>(c) != 0xBFu) return c;\n        c = is.Take();\n        return c;\n    }\n\n    template <typename InputByteStream>\n    static Ch Take(InputByteStream& is) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1);\n        return static_cast<Ch>(is.Take());\n    }\n\n    template <typename OutputByteStream>\n    static void PutBOM(OutputByteStream& os) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1);\n        os.Put(static_cast<typename OutputByteStream::Ch>(0xEFu));\n        os.Put(static_cast<typename OutputByteStream::Ch>(0xBBu));\n        os.Put(static_cast<typename OutputByteStream::Ch>(0xBFu));\n    }\n\n    template <typename OutputByteStream>\n    static void Put(OutputByteStream& os, Ch c) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1);\n        os.Put(static_cast<typename OutputByteStream::Ch>(c));\n    }\n};\n\n///////////////////////////////////////////////////////////////////////////////\n// UTF16\n\n//! UTF-16 encoding.\n/*! http://en.wikipedia.org/wiki/UTF-16\n    http://tools.ietf.org/html/rfc2781\n    \\tparam CharType Type for storing 16-bit UTF-16 data. Default is wchar_t. C++11 may use char16_t instead.\n    \\note implements Encoding concept\n\n    \\note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness.\n    For streaming, use UTF16LE and UTF16BE, which handle endianness.\n*/\ntemplate<typename CharType = wchar_t>\nstruct UTF16 {\n    typedef CharType Ch;\n    CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 2);\n\n    enum { supportUnicode = 1 };\n\n    template<typename OutputStream>\n    static void Encode(OutputStream& os, unsigned codepoint) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2);\n        if (codepoint <= 0xFFFF) {\n            CEREAL_RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair \n            os.Put(static_cast<typename OutputStream::Ch>(codepoint));\n        }\n        else {\n            CEREAL_RAPIDJSON_ASSERT(codepoint <= 0x10FFFF);\n            unsigned v = codepoint - 0x10000;\n            os.Put(static_cast<typename OutputStream::Ch>((v >> 10) | 0xD800));\n            os.Put(static_cast<typename OutputStream::Ch>((v & 0x3FF) | 0xDC00));\n        }\n    }\n\n\n    template<typename OutputStream>\n    static void EncodeUnsafe(OutputStream& os, unsigned codepoint) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2);\n        if (codepoint <= 0xFFFF) {\n            CEREAL_RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair \n            PutUnsafe(os, static_cast<typename OutputStream::Ch>(codepoint));\n        }\n        else {\n            CEREAL_RAPIDJSON_ASSERT(codepoint <= 0x10FFFF);\n            unsigned v = codepoint - 0x10000;\n            PutUnsafe(os, static_cast<typename OutputStream::Ch>((v >> 10) | 0xD800));\n            PutUnsafe(os, static_cast<typename OutputStream::Ch>((v & 0x3FF) | 0xDC00));\n        }\n    }\n\n    template <typename InputStream>\n    static bool Decode(InputStream& is, unsigned* codepoint) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2);\n        typename InputStream::Ch c = is.Take();\n        if (c < 0xD800 || c > 0xDFFF) {\n            *codepoint = static_cast<unsigned>(c);\n            return true;\n        }\n        else if (c <= 0xDBFF) {\n            *codepoint = (static_cast<unsigned>(c) & 0x3FF) << 10;\n            c = is.Take();\n            *codepoint |= (static_cast<unsigned>(c) & 0x3FF);\n            *codepoint += 0x10000;\n            return c >= 0xDC00 && c <= 0xDFFF;\n        }\n        return false;\n    }\n\n    template <typename InputStream, typename OutputStream>\n    static bool Validate(InputStream& is, OutputStream& os) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2);\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2);\n        typename InputStream::Ch c;\n        os.Put(static_cast<typename OutputStream::Ch>(c = is.Take()));\n        if (c < 0xD800 || c > 0xDFFF)\n            return true;\n        else if (c <= 0xDBFF) {\n            os.Put(c = is.Take());\n            return c >= 0xDC00 && c <= 0xDFFF;\n        }\n        return false;\n    }\n};\n\n//! UTF-16 little endian encoding.\ntemplate<typename CharType = wchar_t>\nstruct UTF16LE : UTF16<CharType> {\n    template <typename InputByteStream>\n    static CharType TakeBOM(InputByteStream& is) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1);\n        CharType c = Take(is);\n        return static_cast<uint16_t>(c) == 0xFEFFu ? Take(is) : c;\n    }\n\n    template <typename InputByteStream>\n    static CharType Take(InputByteStream& is) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1);\n        unsigned c = static_cast<uint8_t>(is.Take());\n        c |= static_cast<unsigned>(static_cast<uint8_t>(is.Take())) << 8;\n        return static_cast<CharType>(c);\n    }\n\n    template <typename OutputByteStream>\n    static void PutBOM(OutputByteStream& os) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1);\n        os.Put(static_cast<typename OutputByteStream::Ch>(0xFFu));\n        os.Put(static_cast<typename OutputByteStream::Ch>(0xFEu));\n    }\n\n    template <typename OutputByteStream>\n    static void Put(OutputByteStream& os, CharType c) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1);\n        os.Put(static_cast<typename OutputByteStream::Ch>(static_cast<unsigned>(c) & 0xFFu));\n        os.Put(static_cast<typename OutputByteStream::Ch>((static_cast<unsigned>(c) >> 8) & 0xFFu));\n    }\n};\n\n//! UTF-16 big endian encoding.\ntemplate<typename CharType = wchar_t>\nstruct UTF16BE : UTF16<CharType> {\n    template <typename InputByteStream>\n    static CharType TakeBOM(InputByteStream& is) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1);\n        CharType c = Take(is);\n        return static_cast<uint16_t>(c) == 0xFEFFu ? Take(is) : c;\n    }\n\n    template <typename InputByteStream>\n    static CharType Take(InputByteStream& is) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1);\n        unsigned c = static_cast<unsigned>(static_cast<uint8_t>(is.Take())) << 8;\n        c |= static_cast<unsigned>(static_cast<uint8_t>(is.Take()));\n        return static_cast<CharType>(c);\n    }\n\n    template <typename OutputByteStream>\n    static void PutBOM(OutputByteStream& os) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1);\n        os.Put(static_cast<typename OutputByteStream::Ch>(0xFEu));\n        os.Put(static_cast<typename OutputByteStream::Ch>(0xFFu));\n    }\n\n    template <typename OutputByteStream>\n    static void Put(OutputByteStream& os, CharType c) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1);\n        os.Put(static_cast<typename OutputByteStream::Ch>((static_cast<unsigned>(c) >> 8) & 0xFFu));\n        os.Put(static_cast<typename OutputByteStream::Ch>(static_cast<unsigned>(c) & 0xFFu));\n    }\n};\n\n///////////////////////////////////////////////////////////////////////////////\n// UTF32\n\n//! UTF-32 encoding. \n/*! http://en.wikipedia.org/wiki/UTF-32\n    \\tparam CharType Type for storing 32-bit UTF-32 data. Default is unsigned. C++11 may use char32_t instead.\n    \\note implements Encoding concept\n\n    \\note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness.\n    For streaming, use UTF32LE and UTF32BE, which handle endianness.\n*/\ntemplate<typename CharType = unsigned>\nstruct UTF32 {\n    typedef CharType Ch;\n    CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 4);\n\n    enum { supportUnicode = 1 };\n\n    template<typename OutputStream>\n    static void Encode(OutputStream& os, unsigned codepoint) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4);\n        CEREAL_RAPIDJSON_ASSERT(codepoint <= 0x10FFFF);\n        os.Put(codepoint);\n    }\n\n    template<typename OutputStream>\n    static void EncodeUnsafe(OutputStream& os, unsigned codepoint) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4);\n        CEREAL_RAPIDJSON_ASSERT(codepoint <= 0x10FFFF);\n        PutUnsafe(os, codepoint);\n    }\n\n    template <typename InputStream>\n    static bool Decode(InputStream& is, unsigned* codepoint) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4);\n        Ch c = is.Take();\n        *codepoint = c;\n        return c <= 0x10FFFF;\n    }\n\n    template <typename InputStream, typename OutputStream>\n    static bool Validate(InputStream& is, OutputStream& os) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4);\n        Ch c;\n        os.Put(c = is.Take());\n        return c <= 0x10FFFF;\n    }\n};\n\n//! UTF-32 little endian enocoding.\ntemplate<typename CharType = unsigned>\nstruct UTF32LE : UTF32<CharType> {\n    template <typename InputByteStream>\n    static CharType TakeBOM(InputByteStream& is) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1);\n        CharType c = Take(is);\n        return static_cast<uint32_t>(c) == 0x0000FEFFu ? Take(is) : c;\n    }\n\n    template <typename InputByteStream>\n    static CharType Take(InputByteStream& is) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1);\n        unsigned c = static_cast<uint8_t>(is.Take());\n        c |= static_cast<unsigned>(static_cast<uint8_t>(is.Take())) << 8;\n        c |= static_cast<unsigned>(static_cast<uint8_t>(is.Take())) << 16;\n        c |= static_cast<unsigned>(static_cast<uint8_t>(is.Take())) << 24;\n        return static_cast<CharType>(c);\n    }\n\n    template <typename OutputByteStream>\n    static void PutBOM(OutputByteStream& os) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1);\n        os.Put(static_cast<typename OutputByteStream::Ch>(0xFFu));\n        os.Put(static_cast<typename OutputByteStream::Ch>(0xFEu));\n        os.Put(static_cast<typename OutputByteStream::Ch>(0x00u));\n        os.Put(static_cast<typename OutputByteStream::Ch>(0x00u));\n    }\n\n    template <typename OutputByteStream>\n    static void Put(OutputByteStream& os, CharType c) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1);\n        os.Put(static_cast<typename OutputByteStream::Ch>(c & 0xFFu));\n        os.Put(static_cast<typename OutputByteStream::Ch>((c >> 8) & 0xFFu));\n        os.Put(static_cast<typename OutputByteStream::Ch>((c >> 16) & 0xFFu));\n        os.Put(static_cast<typename OutputByteStream::Ch>((c >> 24) & 0xFFu));\n    }\n};\n\n//! UTF-32 big endian encoding.\ntemplate<typename CharType = unsigned>\nstruct UTF32BE : UTF32<CharType> {\n    template <typename InputByteStream>\n    static CharType TakeBOM(InputByteStream& is) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1);\n        CharType c = Take(is);\n        return static_cast<uint32_t>(c) == 0x0000FEFFu ? Take(is) : c; \n    }\n\n    template <typename InputByteStream>\n    static CharType Take(InputByteStream& is) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1);\n        unsigned c = static_cast<unsigned>(static_cast<uint8_t>(is.Take())) << 24;\n        c |= static_cast<unsigned>(static_cast<uint8_t>(is.Take())) << 16;\n        c |= static_cast<unsigned>(static_cast<uint8_t>(is.Take())) << 8;\n        c |= static_cast<unsigned>(static_cast<uint8_t>(is.Take()));\n        return static_cast<CharType>(c);\n    }\n\n    template <typename OutputByteStream>\n    static void PutBOM(OutputByteStream& os) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1);\n        os.Put(static_cast<typename OutputByteStream::Ch>(0x00u));\n        os.Put(static_cast<typename OutputByteStream::Ch>(0x00u));\n        os.Put(static_cast<typename OutputByteStream::Ch>(0xFEu));\n        os.Put(static_cast<typename OutputByteStream::Ch>(0xFFu));\n    }\n\n    template <typename OutputByteStream>\n    static void Put(OutputByteStream& os, CharType c) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1);\n        os.Put(static_cast<typename OutputByteStream::Ch>((c >> 24) & 0xFFu));\n        os.Put(static_cast<typename OutputByteStream::Ch>((c >> 16) & 0xFFu));\n        os.Put(static_cast<typename OutputByteStream::Ch>((c >> 8) & 0xFFu));\n        os.Put(static_cast<typename OutputByteStream::Ch>(c & 0xFFu));\n    }\n};\n\n///////////////////////////////////////////////////////////////////////////////\n// ASCII\n\n//! ASCII encoding.\n/*! http://en.wikipedia.org/wiki/ASCII\n    \\tparam CharType Code unit for storing 7-bit ASCII data. Default is char.\n    \\note implements Encoding concept\n*/\ntemplate<typename CharType = char>\nstruct ASCII {\n    typedef CharType Ch;\n\n    enum { supportUnicode = 0 };\n\n    template<typename OutputStream>\n    static void Encode(OutputStream& os, unsigned codepoint) {\n        CEREAL_RAPIDJSON_ASSERT(codepoint <= 0x7F);\n        os.Put(static_cast<Ch>(codepoint & 0xFF));\n    }\n\n    template<typename OutputStream>\n    static void EncodeUnsafe(OutputStream& os, unsigned codepoint) {\n        CEREAL_RAPIDJSON_ASSERT(codepoint <= 0x7F);\n        PutUnsafe(os, static_cast<Ch>(codepoint & 0xFF));\n    }\n\n    template <typename InputStream>\n    static bool Decode(InputStream& is, unsigned* codepoint) {\n        uint8_t c = static_cast<uint8_t>(is.Take());\n        *codepoint = c;\n        return c <= 0X7F;\n    }\n\n    template <typename InputStream, typename OutputStream>\n    static bool Validate(InputStream& is, OutputStream& os) {\n        uint8_t c = static_cast<uint8_t>(is.Take());\n        os.Put(static_cast<typename OutputStream::Ch>(c));\n        return c <= 0x7F;\n    }\n\n    template <typename InputByteStream>\n    static CharType TakeBOM(InputByteStream& is) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1);\n        uint8_t c = static_cast<uint8_t>(Take(is));\n        return static_cast<Ch>(c);\n    }\n\n    template <typename InputByteStream>\n    static Ch Take(InputByteStream& is) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1);\n        return static_cast<Ch>(is.Take());\n    }\n\n    template <typename OutputByteStream>\n    static void PutBOM(OutputByteStream& os) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1);\n        (void)os;\n    }\n\n    template <typename OutputByteStream>\n    static void Put(OutputByteStream& os, Ch c) {\n        CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1);\n        os.Put(static_cast<typename OutputByteStream::Ch>(c));\n    }\n};\n\n///////////////////////////////////////////////////////////////////////////////\n// AutoUTF\n\n//! Runtime-specified UTF encoding type of a stream.\nenum UTFType {\n    kUTF8 = 0,      //!< UTF-8.\n    kUTF16LE = 1,   //!< UTF-16 little endian.\n    kUTF16BE = 2,   //!< UTF-16 big endian.\n    kUTF32LE = 3,   //!< UTF-32 little endian.\n    kUTF32BE = 4    //!< UTF-32 big endian.\n};\n\n//! Dynamically select encoding according to stream's runtime-specified UTF encoding type.\n/*! \\note This class can be used with AutoUTFInputtStream and AutoUTFOutputStream, which provides GetType().\n*/\ntemplate<typename CharType>\nstruct AutoUTF {\n    typedef CharType Ch;\n\n    enum { supportUnicode = 1 };\n\n#define CEREAL_RAPIDJSON_ENCODINGS_FUNC(x) UTF8<Ch>::x, UTF16LE<Ch>::x, UTF16BE<Ch>::x, UTF32LE<Ch>::x, UTF32BE<Ch>::x\n\n    template<typename OutputStream>\n    static CEREAL_RAPIDJSON_FORCEINLINE void Encode(OutputStream& os, unsigned codepoint) {\n        typedef void (*EncodeFunc)(OutputStream&, unsigned);\n        static const EncodeFunc f[] = { CEREAL_RAPIDJSON_ENCODINGS_FUNC(Encode) };\n        (*f[os.GetType()])(os, codepoint);\n    }\n\n    template<typename OutputStream>\n    static CEREAL_RAPIDJSON_FORCEINLINE void EncodeUnsafe(OutputStream& os, unsigned codepoint) {\n        typedef void (*EncodeFunc)(OutputStream&, unsigned);\n        static const EncodeFunc f[] = { CEREAL_RAPIDJSON_ENCODINGS_FUNC(EncodeUnsafe) };\n        (*f[os.GetType()])(os, codepoint);\n    }\n\n    template <typename InputStream>\n    static CEREAL_RAPIDJSON_FORCEINLINE bool Decode(InputStream& is, unsigned* codepoint) {\n        typedef bool (*DecodeFunc)(InputStream&, unsigned*);\n        static const DecodeFunc f[] = { CEREAL_RAPIDJSON_ENCODINGS_FUNC(Decode) };\n        return (*f[is.GetType()])(is, codepoint);\n    }\n\n    template <typename InputStream, typename OutputStream>\n    static CEREAL_RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) {\n        typedef bool (*ValidateFunc)(InputStream&, OutputStream&);\n        static const ValidateFunc f[] = { CEREAL_RAPIDJSON_ENCODINGS_FUNC(Validate) };\n        return (*f[is.GetType()])(is, os);\n    }\n\n#undef CEREAL_RAPIDJSON_ENCODINGS_FUNC\n};\n\n///////////////////////////////////////////////////////////////////////////////\n// Transcoder\n\n//! Encoding conversion.\ntemplate<typename SourceEncoding, typename TargetEncoding>\nstruct Transcoder {\n    //! Take one Unicode codepoint from source encoding, convert it to target encoding and put it to the output stream.\n    template<typename InputStream, typename OutputStream>\n    static CEREAL_RAPIDJSON_FORCEINLINE bool Transcode(InputStream& is, OutputStream& os) {\n        unsigned codepoint;\n        if (!SourceEncoding::Decode(is, &codepoint))\n            return false;\n        TargetEncoding::Encode(os, codepoint);\n        return true;\n    }\n\n    template<typename InputStream, typename OutputStream>\n    static CEREAL_RAPIDJSON_FORCEINLINE bool TranscodeUnsafe(InputStream& is, OutputStream& os) {\n        unsigned codepoint;\n        if (!SourceEncoding::Decode(is, &codepoint))\n            return false;\n        TargetEncoding::EncodeUnsafe(os, codepoint);\n        return true;\n    }\n\n    //! Validate one Unicode codepoint from an encoded stream.\n    template<typename InputStream, typename OutputStream>\n    static CEREAL_RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) {\n        return Transcode(is, os);   // Since source/target encoding is different, must transcode.\n    }\n};\n\n// Forward declaration.\ntemplate<typename Stream>\ninline void PutUnsafe(Stream& stream, typename Stream::Ch c);\n\n//! Specialization of Transcoder with same source and target encoding.\ntemplate<typename Encoding>\nstruct Transcoder<Encoding, Encoding> {\n    template<typename InputStream, typename OutputStream>\n    static CEREAL_RAPIDJSON_FORCEINLINE bool Transcode(InputStream& is, OutputStream& os) {\n        os.Put(is.Take());  // Just copy one code unit. This semantic is different from primary template class.\n        return true;\n    }\n    \n    template<typename InputStream, typename OutputStream>\n    static CEREAL_RAPIDJSON_FORCEINLINE bool TranscodeUnsafe(InputStream& is, OutputStream& os) {\n        PutUnsafe(os, is.Take());  // Just copy one code unit. This semantic is different from primary template class.\n        return true;\n    }\n    \n    template<typename InputStream, typename OutputStream>\n    static CEREAL_RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) {\n        return Encoding::Validate(is, os);  // source/target encoding are the same\n    }\n};\n\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#if defined(__GNUC__) || (defined(_MSC_VER) && !defined(__clang__))\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#endif // CEREAL_RAPIDJSON_ENCODINGS_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/error/en.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_ERROR_EN_H_\n#define CEREAL_RAPIDJSON_ERROR_EN_H_\n\n#include \"error.h\"\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(switch-enum)\nCEREAL_RAPIDJSON_DIAG_OFF(covered-switch-default)\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n//! Maps error code of parsing into error message.\n/*!\n    \\ingroup CEREAL_RAPIDJSON_ERRORS\n    \\param parseErrorCode Error code obtained in parsing.\n    \\return the error message.\n    \\note User can make a copy of this function for localization.\n        Using switch-case is safer for future modification of error codes.\n*/\ninline const CEREAL_RAPIDJSON_ERROR_CHARTYPE* GetParseError_En(ParseErrorCode parseErrorCode) {\n    switch (parseErrorCode) {\n        case kParseErrorNone:                           return CEREAL_RAPIDJSON_ERROR_STRING(\"No error.\");\n\n        case kParseErrorDocumentEmpty:                  return CEREAL_RAPIDJSON_ERROR_STRING(\"The document is empty.\");\n        case kParseErrorDocumentRootNotSingular:        return CEREAL_RAPIDJSON_ERROR_STRING(\"The document root must not be followed by other values.\");\n    \n        case kParseErrorValueInvalid:                   return CEREAL_RAPIDJSON_ERROR_STRING(\"Invalid value.\");\n    \n        case kParseErrorObjectMissName:                 return CEREAL_RAPIDJSON_ERROR_STRING(\"Missing a name for object member.\");\n        case kParseErrorObjectMissColon:                return CEREAL_RAPIDJSON_ERROR_STRING(\"Missing a colon after a name of object member.\");\n        case kParseErrorObjectMissCommaOrCurlyBracket:  return CEREAL_RAPIDJSON_ERROR_STRING(\"Missing a comma or '}' after an object member.\");\n    \n        case kParseErrorArrayMissCommaOrSquareBracket:  return CEREAL_RAPIDJSON_ERROR_STRING(\"Missing a comma or ']' after an array element.\");\n\n        case kParseErrorStringUnicodeEscapeInvalidHex:  return CEREAL_RAPIDJSON_ERROR_STRING(\"Incorrect hex digit after \\\\u escape in string.\");\n        case kParseErrorStringUnicodeSurrogateInvalid:  return CEREAL_RAPIDJSON_ERROR_STRING(\"The surrogate pair in string is invalid.\");\n        case kParseErrorStringEscapeInvalid:            return CEREAL_RAPIDJSON_ERROR_STRING(\"Invalid escape character in string.\");\n        case kParseErrorStringMissQuotationMark:        return CEREAL_RAPIDJSON_ERROR_STRING(\"Missing a closing quotation mark in string.\");\n        case kParseErrorStringInvalidEncoding:          return CEREAL_RAPIDJSON_ERROR_STRING(\"Invalid encoding in string.\");\n\n        case kParseErrorNumberTooBig:                   return CEREAL_RAPIDJSON_ERROR_STRING(\"Number too big to be stored in double.\");\n        case kParseErrorNumberMissFraction:             return CEREAL_RAPIDJSON_ERROR_STRING(\"Miss fraction part in number.\");\n        case kParseErrorNumberMissExponent:             return CEREAL_RAPIDJSON_ERROR_STRING(\"Miss exponent in number.\");\n\n        case kParseErrorTermination:                    return CEREAL_RAPIDJSON_ERROR_STRING(\"Terminate parsing due to Handler error.\");\n        case kParseErrorUnspecificSyntaxError:          return CEREAL_RAPIDJSON_ERROR_STRING(\"Unspecific syntax error.\");\n\n        default:                                        return CEREAL_RAPIDJSON_ERROR_STRING(\"Unknown error.\");\n    }\n}\n\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#endif // CEREAL_RAPIDJSON_ERROR_EN_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/error/error.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_ERROR_ERROR_H_\n#define CEREAL_RAPIDJSON_ERROR_ERROR_H_\n\n#include \"../rapidjson.h\"\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(padded)\n#endif\n\n/*! \\file error.h */\n\n/*! \\defgroup CEREAL_RAPIDJSON_ERRORS RapidJSON error handling */\n\n///////////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDJSON_ERROR_CHARTYPE\n\n//! Character type of error messages.\n/*! \\ingroup CEREAL_RAPIDJSON_ERRORS\n    The default character type is \\c char.\n    On Windows, user can define this macro as \\c TCHAR for supporting both\n    unicode/non-unicode settings.\n*/\n#ifndef CEREAL_RAPIDJSON_ERROR_CHARTYPE\n#define CEREAL_RAPIDJSON_ERROR_CHARTYPE char\n#endif\n\n///////////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDJSON_ERROR_STRING\n\n//! Macro for converting string literial to \\ref CEREAL_RAPIDJSON_ERROR_CHARTYPE[].\n/*! \\ingroup CEREAL_RAPIDJSON_ERRORS\n    By default this conversion macro does nothing.\n    On Windows, user can define this macro as \\c _T(x) for supporting both\n    unicode/non-unicode settings.\n*/\n#ifndef CEREAL_RAPIDJSON_ERROR_STRING\n#define CEREAL_RAPIDJSON_ERROR_STRING(x) x\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n///////////////////////////////////////////////////////////////////////////////\n// ParseErrorCode\n\n//! Error code of parsing.\n/*! \\ingroup CEREAL_RAPIDJSON_ERRORS\n    \\see GenericReader::Parse, GenericReader::GetParseErrorCode\n*/\nenum ParseErrorCode {\n    kParseErrorNone = 0,                        //!< No error.\n\n    kParseErrorDocumentEmpty,                   //!< The document is empty.\n    kParseErrorDocumentRootNotSingular,         //!< The document root must not follow by other values.\n\n    kParseErrorValueInvalid,                    //!< Invalid value.\n\n    kParseErrorObjectMissName,                  //!< Missing a name for object member.\n    kParseErrorObjectMissColon,                 //!< Missing a colon after a name of object member.\n    kParseErrorObjectMissCommaOrCurlyBracket,   //!< Missing a comma or '}' after an object member.\n\n    kParseErrorArrayMissCommaOrSquareBracket,   //!< Missing a comma or ']' after an array element.\n\n    kParseErrorStringUnicodeEscapeInvalidHex,   //!< Incorrect hex digit after \\\\u escape in string.\n    kParseErrorStringUnicodeSurrogateInvalid,   //!< The surrogate pair in string is invalid.\n    kParseErrorStringEscapeInvalid,             //!< Invalid escape character in string.\n    kParseErrorStringMissQuotationMark,         //!< Missing a closing quotation mark in string.\n    kParseErrorStringInvalidEncoding,           //!< Invalid encoding in string.\n\n    kParseErrorNumberTooBig,                    //!< Number too big to be stored in double.\n    kParseErrorNumberMissFraction,              //!< Miss fraction part in number.\n    kParseErrorNumberMissExponent,              //!< Miss exponent in number.\n\n    kParseErrorTermination,                     //!< Parsing was terminated.\n    kParseErrorUnspecificSyntaxError            //!< Unspecific syntax error.\n};\n\n//! Result of parsing (wraps ParseErrorCode)\n/*!\n    \\ingroup CEREAL_RAPIDJSON_ERRORS\n    \\code\n        Document doc;\n        ParseResult ok = doc.Parse(\"[42]\");\n        if (!ok) {\n            fprintf(stderr, \"JSON parse error: %s (%u)\",\n                    GetParseError_En(ok.Code()), ok.Offset());\n            exit(EXIT_FAILURE);\n        }\n    \\endcode\n    \\see GenericReader::Parse, GenericDocument::Parse\n*/\nstruct ParseResult {\n    //!! Unspecified boolean type\n    typedef bool (ParseResult::*BooleanType)() const;\npublic:\n    //! Default constructor, no error.\n    ParseResult() : code_(kParseErrorNone), offset_(0) {}\n    //! Constructor to set an error.\n    ParseResult(ParseErrorCode code, size_t offset) : code_(code), offset_(offset) {}\n\n    //! Get the error code.\n    ParseErrorCode Code() const { return code_; }\n    //! Get the error offset, if \\ref IsError(), 0 otherwise.\n    size_t Offset() const { return offset_; }\n\n    //! Explicit conversion to \\c bool, returns \\c true, iff !\\ref IsError().\n    operator BooleanType() const { return !IsError() ? &ParseResult::IsError : NULL; }\n    //! Whether the result is an error.\n    bool IsError() const { return code_ != kParseErrorNone; }\n\n    bool operator==(const ParseResult& that) const { return code_ == that.code_; }\n    bool operator==(ParseErrorCode code) const { return code_ == code; }\n    friend bool operator==(ParseErrorCode code, const ParseResult & err) { return code == err.code_; }\n\n    bool operator!=(const ParseResult& that) const { return !(*this == that); }\n    bool operator!=(ParseErrorCode code) const { return !(*this == code); }\n    friend bool operator!=(ParseErrorCode code, const ParseResult & err) { return err != code; }\n\n    //! Reset error code.\n    void Clear() { Set(kParseErrorNone); }\n    //! Update error code and offset.\n    void Set(ParseErrorCode code, size_t offset = 0) { code_ = code; offset_ = offset; }\n\nprivate:\n    ParseErrorCode code_;\n    size_t offset_;\n};\n\n//! Function pointer type of GetParseError().\n/*! \\ingroup CEREAL_RAPIDJSON_ERRORS\n\n    This is the prototype for \\c GetParseError_X(), where \\c X is a locale.\n    User can dynamically change locale in runtime, e.g.:\n\\code\n    GetParseErrorFunc GetParseError = GetParseError_En; // or whatever\n    const CEREAL_RAPIDJSON_ERROR_CHARTYPE* s = GetParseError(document.GetParseErrorCode());\n\\endcode\n*/\ntypedef const CEREAL_RAPIDJSON_ERROR_CHARTYPE* (*GetParseErrorFunc)(ParseErrorCode);\n\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#endif // CEREAL_RAPIDJSON_ERROR_ERROR_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/filereadstream.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_FILEREADSTREAM_H_\n#define CEREAL_RAPIDJSON_FILEREADSTREAM_H_\n\n#include \"stream.h\"\n#include <cstdio>\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(padded)\nCEREAL_RAPIDJSON_DIAG_OFF(unreachable-code)\nCEREAL_RAPIDJSON_DIAG_OFF(missing-noreturn)\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n//! File byte stream for input using fread().\n/*!\n    \\note implements Stream concept\n*/\nclass FileReadStream {\npublic:\n    typedef char Ch;    //!< Character type (byte).\n\n    //! Constructor.\n    /*!\n        \\param fp File pointer opened for read.\n        \\param buffer user-supplied buffer.\n        \\param bufferSize size of buffer in bytes. Must >=4 bytes.\n    */\n    FileReadStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { \n        CEREAL_RAPIDJSON_ASSERT(fp_ != 0);\n        CEREAL_RAPIDJSON_ASSERT(bufferSize >= 4);\n        Read();\n    }\n\n    Ch Peek() const { return *current_; }\n    Ch Take() { Ch c = *current_; Read(); return c; }\n    size_t Tell() const { return count_ + static_cast<size_t>(current_ - buffer_); }\n\n    // Not implemented\n    void Put(Ch) { CEREAL_RAPIDJSON_ASSERT(false); }\n    void Flush() { CEREAL_RAPIDJSON_ASSERT(false); } \n    Ch* PutBegin() { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n    size_t PutEnd(Ch*) { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n\n    // For encoding detection only.\n    const Ch* Peek4() const {\n        return (current_ + 4 - !eof_ <= bufferLast_) ? current_ : 0;\n    }\n\nprivate:\n    void Read() {\n        if (current_ < bufferLast_)\n            ++current_;\n        else if (!eof_) {\n            count_ += readCount_;\n            readCount_ = std::fread(buffer_, 1, bufferSize_, fp_);\n            bufferLast_ = buffer_ + readCount_ - 1;\n            current_ = buffer_;\n\n            if (readCount_ < bufferSize_) {\n                buffer_[readCount_] = '\\0';\n                ++bufferLast_;\n                eof_ = true;\n            }\n        }\n    }\n\n    std::FILE* fp_;\n    Ch *buffer_;\n    size_t bufferSize_;\n    Ch *bufferLast_;\n    Ch *current_;\n    size_t readCount_;\n    size_t count_;  //!< Number of characters read\n    bool eof_;\n};\n\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#endif // CEREAL_RAPIDJSON_FILESTREAM_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/filewritestream.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_FILEWRITESTREAM_H_\n#define CEREAL_RAPIDJSON_FILEWRITESTREAM_H_\n\n#include \"stream.h\"\n#include <cstdio>\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(unreachable-code)\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n//! Wrapper of C file stream for output using fwrite().\n/*!\n    \\note implements Stream concept\n*/\nclass FileWriteStream {\npublic:\n    typedef char Ch;    //!< Character type. Only support char.\n\n    FileWriteStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferEnd_(buffer + bufferSize), current_(buffer_) { \n        CEREAL_RAPIDJSON_ASSERT(fp_ != 0);\n    }\n\n    void Put(char c) { \n        if (current_ >= bufferEnd_)\n            Flush();\n\n        *current_++ = c;\n    }\n\n    void PutN(char c, size_t n) {\n        size_t avail = static_cast<size_t>(bufferEnd_ - current_);\n        while (n > avail) {\n            std::memset(current_, c, avail);\n            current_ += avail;\n            Flush();\n            n -= avail;\n            avail = static_cast<size_t>(bufferEnd_ - current_);\n        }\n\n        if (n > 0) {\n            std::memset(current_, c, n);\n            current_ += n;\n        }\n    }\n\n    void Flush() {\n        if (current_ != buffer_) {\n            size_t result = std::fwrite(buffer_, 1, static_cast<size_t>(current_ - buffer_), fp_);\n            if (result < static_cast<size_t>(current_ - buffer_)) {\n                // failure deliberately ignored at this time\n                // added to avoid warn_unused_result build errors\n            }\n            current_ = buffer_;\n        }\n    }\n\n    // Not implemented\n    char Peek() const { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n    char Take() { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n    size_t Tell() const { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n    char* PutBegin() { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n    size_t PutEnd(char*) { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n\nprivate:\n    // Prohibit copy constructor & assignment operator.\n    FileWriteStream(const FileWriteStream&);\n    FileWriteStream& operator=(const FileWriteStream&);\n\n    std::FILE* fp_;\n    char *buffer_;\n    char *bufferEnd_;\n    char *current_;\n};\n\n//! Implement specialized version of PutN() with memset() for better performance.\ntemplate<>\ninline void PutN(FileWriteStream& stream, char c, size_t n) {\n    stream.PutN(c, n);\n}\n\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#endif // CEREAL_RAPIDJSON_FILESTREAM_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/fwd.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_FWD_H_\n#define CEREAL_RAPIDJSON_FWD_H_\n\n#include \"rapidjson.h\"\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n// encodings.h\n\ntemplate<typename CharType> struct UTF8;\ntemplate<typename CharType> struct UTF16;\ntemplate<typename CharType> struct UTF16BE;\ntemplate<typename CharType> struct UTF16LE;\ntemplate<typename CharType> struct UTF32;\ntemplate<typename CharType> struct UTF32BE;\ntemplate<typename CharType> struct UTF32LE;\ntemplate<typename CharType> struct ASCII;\ntemplate<typename CharType> struct AutoUTF;\n\ntemplate<typename SourceEncoding, typename TargetEncoding>\nstruct Transcoder;\n\n// allocators.h\n\nclass CrtAllocator;\n\ntemplate <typename BaseAllocator>\nclass MemoryPoolAllocator;\n\n// stream.h\n\ntemplate <typename Encoding>\nstruct GenericStringStream;\n\ntypedef GenericStringStream<UTF8<char> > StringStream;\n\ntemplate <typename Encoding>\nstruct GenericInsituStringStream;\n\ntypedef GenericInsituStringStream<UTF8<char> > InsituStringStream;\n\n// stringbuffer.h\n\ntemplate <typename Encoding, typename Allocator>\nclass GenericStringBuffer;\n\ntypedef GenericStringBuffer<UTF8<char>, CrtAllocator> StringBuffer;\n\n// filereadstream.h\n\nclass FileReadStream;\n\n// filewritestream.h\n\nclass FileWriteStream;\n\n// memorybuffer.h\n\ntemplate <typename Allocator>\nstruct GenericMemoryBuffer;\n\ntypedef GenericMemoryBuffer<CrtAllocator> MemoryBuffer;\n\n// memorystream.h\n\nstruct MemoryStream;\n\n// reader.h\n\ntemplate<typename Encoding, typename Derived>\nstruct BaseReaderHandler;\n\ntemplate <typename SourceEncoding, typename TargetEncoding, typename StackAllocator>\nclass GenericReader;\n\ntypedef GenericReader<UTF8<char>, UTF8<char>, CrtAllocator> Reader;\n\n// writer.h\n\ntemplate<typename OutputStream, typename SourceEncoding, typename TargetEncoding, typename StackAllocator, unsigned writeFlags>\nclass Writer;\n\n// prettywriter.h\n\ntemplate<typename OutputStream, typename SourceEncoding, typename TargetEncoding, typename StackAllocator, unsigned writeFlags>\nclass PrettyWriter;\n\n// document.h\n\ntemplate <typename Encoding, typename Allocator> \nstruct GenericMember;\n\ntemplate <bool Const, typename Encoding, typename Allocator>\nclass GenericMemberIterator;\n\ntemplate<typename CharType>\nstruct GenericStringRef;\n\ntemplate <typename Encoding, typename Allocator> \nclass GenericValue;\n\ntypedef GenericValue<UTF8<char>, MemoryPoolAllocator<CrtAllocator> > Value;\n\ntemplate <typename Encoding, typename Allocator, typename StackAllocator>\nclass GenericDocument;\n\ntypedef GenericDocument<UTF8<char>, MemoryPoolAllocator<CrtAllocator>, CrtAllocator> Document;\n\n// pointer.h\n\ntemplate <typename ValueType, typename Allocator>\nclass GenericPointer;\n\ntypedef GenericPointer<Value, CrtAllocator> Pointer;\n\n// schema.h\n\ntemplate <typename SchemaDocumentType>\nclass IGenericRemoteSchemaDocumentProvider;\n\ntemplate <typename ValueT, typename Allocator>\nclass GenericSchemaDocument;\n\ntypedef GenericSchemaDocument<Value, CrtAllocator> SchemaDocument;\ntypedef IGenericRemoteSchemaDocumentProvider<SchemaDocument> IRemoteSchemaDocumentProvider;\n\ntemplate <\n    typename SchemaDocumentType,\n    typename OutputHandler,\n    typename StateAllocator>\nclass GenericSchemaValidator;\n\ntypedef GenericSchemaValidator<SchemaDocument, BaseReaderHandler<UTF8<char>, void>, CrtAllocator> SchemaValidator;\n\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#endif // CEREAL_RAPIDJSON_RAPIDJSONFWD_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/internal/biginteger.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_BIGINTEGER_H_\n#define CEREAL_RAPIDJSON_BIGINTEGER_H_\n\n#include \"../rapidjson.h\"\n\n#if defined(_MSC_VER) && !__INTEL_COMPILER && defined(_M_AMD64)\n#include <intrin.h> // for _umul128\n#pragma intrinsic(_umul128)\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\nnamespace internal {\n\nclass BigInteger {\npublic:\n    typedef uint64_t Type;\n\n    BigInteger(const BigInteger& rhs) : count_(rhs.count_) {\n        std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type));\n    }\n\n    explicit BigInteger(uint64_t u) : count_(1) {\n        digits_[0] = u;\n    }\n\n    BigInteger(const char* decimals, size_t length) : count_(1) {\n        CEREAL_RAPIDJSON_ASSERT(length > 0);\n        digits_[0] = 0;\n        size_t i = 0;\n        const size_t kMaxDigitPerIteration = 19;  // 2^64 = 18446744073709551616 > 10^19\n        while (length >= kMaxDigitPerIteration) {\n            AppendDecimal64(decimals + i, decimals + i + kMaxDigitPerIteration);\n            length -= kMaxDigitPerIteration;\n            i += kMaxDigitPerIteration;\n        }\n\n        if (length > 0)\n            AppendDecimal64(decimals + i, decimals + i + length);\n    }\n    \n    BigInteger& operator=(const BigInteger &rhs)\n    {\n        if (this != &rhs) {\n            count_ = rhs.count_;\n            std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type));\n        }\n        return *this;\n    }\n    \n    BigInteger& operator=(uint64_t u) {\n        digits_[0] = u;            \n        count_ = 1;\n        return *this;\n    }\n\n    BigInteger& operator+=(uint64_t u) {\n        Type backup = digits_[0];\n        digits_[0] += u;\n        for (size_t i = 0; i < count_ - 1; i++) {\n            if (digits_[i] >= backup)\n                return *this; // no carry\n            backup = digits_[i + 1];\n            digits_[i + 1] += 1;\n        }\n\n        // Last carry\n        if (digits_[count_ - 1] < backup)\n            PushBack(1);\n\n        return *this;\n    }\n\n    BigInteger& operator*=(uint64_t u) {\n        if (u == 0) return *this = 0;\n        if (u == 1) return *this;\n        if (*this == 1) return *this = u;\n\n        uint64_t k = 0;\n        for (size_t i = 0; i < count_; i++) {\n            uint64_t hi;\n            digits_[i] = MulAdd64(digits_[i], u, k, &hi);\n            k = hi;\n        }\n        \n        if (k > 0)\n            PushBack(k);\n\n        return *this;\n    }\n\n    BigInteger& operator*=(uint32_t u) {\n        if (u == 0) return *this = 0;\n        if (u == 1) return *this;\n        if (*this == 1) return *this = u;\n\n        uint64_t k = 0;\n        for (size_t i = 0; i < count_; i++) {\n            const uint64_t c = digits_[i] >> 32;\n            const uint64_t d = digits_[i] & 0xFFFFFFFF;\n            const uint64_t uc = u * c;\n            const uint64_t ud = u * d;\n            const uint64_t p0 = ud + k;\n            const uint64_t p1 = uc + (p0 >> 32);\n            digits_[i] = (p0 & 0xFFFFFFFF) | (p1 << 32);\n            k = p1 >> 32;\n        }\n        \n        if (k > 0)\n            PushBack(k);\n\n        return *this;\n    }\n\n    BigInteger& operator<<=(size_t shift) {\n        if (IsZero() || shift == 0) return *this;\n\n        size_t offset = shift / kTypeBit;\n        size_t interShift = shift % kTypeBit;\n        CEREAL_RAPIDJSON_ASSERT(count_ + offset <= kCapacity);\n\n        if (interShift == 0) {\n            std::memmove(digits_ + offset, digits_, count_ * sizeof(Type));\n            count_ += offset;\n        }\n        else {\n            digits_[count_] = 0;\n            for (size_t i = count_; i > 0; i--)\n                digits_[i + offset] = (digits_[i] << interShift) | (digits_[i - 1] >> (kTypeBit - interShift));\n            digits_[offset] = digits_[0] << interShift;\n            count_ += offset;\n            if (digits_[count_])\n                count_++;\n        }\n\n        std::memset(digits_, 0, offset * sizeof(Type));\n\n        return *this;\n    }\n\n    bool operator==(const BigInteger& rhs) const {\n        return count_ == rhs.count_ && std::memcmp(digits_, rhs.digits_, count_ * sizeof(Type)) == 0;\n    }\n\n    bool operator==(const Type rhs) const {\n        return count_ == 1 && digits_[0] == rhs;\n    }\n\n    BigInteger& MultiplyPow5(unsigned exp) {\n        static const uint32_t kPow5[12] = {\n            5,\n            5 * 5,\n            5 * 5 * 5,\n            5 * 5 * 5 * 5,\n            5 * 5 * 5 * 5 * 5,\n            5 * 5 * 5 * 5 * 5 * 5,\n            5 * 5 * 5 * 5 * 5 * 5 * 5,\n            5 * 5 * 5 * 5 * 5 * 5 * 5 * 5,\n            5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5,\n            5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5,\n            5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5,\n            5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5\n        };\n        if (exp == 0) return *this;\n        for (; exp >= 27; exp -= 27) *this *= CEREAL_RAPIDJSON_UINT64_C2(0X6765C793, 0XFA10079D); // 5^27\n        for (; exp >= 13; exp -= 13) *this *= static_cast<uint32_t>(1220703125u); // 5^13\n        if (exp > 0)                 *this *= kPow5[exp - 1];\n        return *this;\n    }\n\n    // Compute absolute difference of this and rhs.\n    // Assume this != rhs\n    bool Difference(const BigInteger& rhs, BigInteger* out) const {\n        int cmp = Compare(rhs);\n        CEREAL_RAPIDJSON_ASSERT(cmp != 0);\n        const BigInteger *a, *b;  // Makes a > b\n        bool ret;\n        if (cmp < 0) { a = &rhs; b = this; ret = true; }\n        else         { a = this; b = &rhs; ret = false; }\n\n        Type borrow = 0;\n        for (size_t i = 0; i < a->count_; i++) {\n            Type d = a->digits_[i] - borrow;\n            if (i < b->count_)\n                d -= b->digits_[i];\n            borrow = (d > a->digits_[i]) ? 1 : 0;\n            out->digits_[i] = d;\n            if (d != 0)\n                out->count_ = i + 1;\n        }\n\n        return ret;\n    }\n\n    int Compare(const BigInteger& rhs) const {\n        if (count_ != rhs.count_)\n            return count_ < rhs.count_ ? -1 : 1;\n\n        for (size_t i = count_; i-- > 0;)\n            if (digits_[i] != rhs.digits_[i])\n                return digits_[i] < rhs.digits_[i] ? -1 : 1;\n\n        return 0;\n    }\n\n    size_t GetCount() const { return count_; }\n    Type GetDigit(size_t index) const { CEREAL_RAPIDJSON_ASSERT(index < count_); return digits_[index]; }\n    bool IsZero() const { return count_ == 1 && digits_[0] == 0; }\n\nprivate:\n    void AppendDecimal64(const char* begin, const char* end) {\n        uint64_t u = ParseUint64(begin, end);\n        if (IsZero())\n            *this = u;\n        else {\n            unsigned exp = static_cast<unsigned>(end - begin);\n            (MultiplyPow5(exp) <<= exp) += u;   // *this = *this * 10^exp + u\n        }\n    }\n\n    void PushBack(Type digit) {\n        CEREAL_RAPIDJSON_ASSERT(count_ < kCapacity);\n        digits_[count_++] = digit;\n    }\n\n    static uint64_t ParseUint64(const char* begin, const char* end) {\n        uint64_t r = 0;\n        for (const char* p = begin; p != end; ++p) {\n            CEREAL_RAPIDJSON_ASSERT(*p >= '0' && *p <= '9');\n            r = r * 10u + static_cast<unsigned>(*p - '0');\n        }\n        return r;\n    }\n\n    // Assume a * b + k < 2^128\n    static uint64_t MulAdd64(uint64_t a, uint64_t b, uint64_t k, uint64_t* outHigh) {\n#if defined(_MSC_VER) && defined(_M_AMD64)\n        uint64_t low = _umul128(a, b, outHigh) + k;\n        if (low < k)\n            (*outHigh)++;\n        return low;\n#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__)\n        __extension__ typedef unsigned __int128 uint128;\n        uint128 p = static_cast<uint128>(a) * static_cast<uint128>(b);\n        p += k;\n        *outHigh = static_cast<uint64_t>(p >> 64);\n        return static_cast<uint64_t>(p);\n#else\n        const uint64_t a0 = a & 0xFFFFFFFF, a1 = a >> 32, b0 = b & 0xFFFFFFFF, b1 = b >> 32;\n        uint64_t x0 = a0 * b0, x1 = a0 * b1, x2 = a1 * b0, x3 = a1 * b1;\n        x1 += (x0 >> 32); // can't give carry\n        x1 += x2;\n        if (x1 < x2)\n            x3 += (static_cast<uint64_t>(1) << 32);\n        uint64_t lo = (x1 << 32) + (x0 & 0xFFFFFFFF);\n        uint64_t hi = x3 + (x1 >> 32);\n\n        lo += k;\n        if (lo < k)\n            hi++;\n        *outHigh = hi;\n        return lo;\n#endif\n    }\n\n    static const size_t kBitCount = 3328;  // 64bit * 54 > 10^1000\n    static const size_t kCapacity = kBitCount / sizeof(Type);\n    static const size_t kTypeBit = sizeof(Type) * 8;\n\n    Type digits_[kCapacity];\n    size_t count_;\n};\n\n} // namespace internal\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#endif // CEREAL_RAPIDJSON_BIGINTEGER_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/internal/diyfp.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n//\n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed\n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n// CONDITIONS OF ANY KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations under the License.\n\n// This is a C++ header-only implementation of Grisu2 algorithm from the publication:\n// Loitsch, Florian. \"Printing floating-point numbers quickly and accurately with\n// integers.\" ACM Sigplan Notices 45.6 (2010): 233-243.\n\n#ifndef CEREAL_RAPIDJSON_DIYFP_H_\n#define CEREAL_RAPIDJSON_DIYFP_H_\n\n#include \"../rapidjson.h\"\n#include <limits>\n\n#if defined(_MSC_VER) && defined(_M_AMD64) && !defined(__INTEL_COMPILER)\n#include <intrin.h>\n#pragma intrinsic(_BitScanReverse64)\n#pragma intrinsic(_umul128)\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\nnamespace internal {\n\n#ifdef __GNUC__\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(effc++)\n#endif\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(padded)\n#endif\n\nstruct DiyFp {\n    DiyFp() : f(), e() {}\n\n    DiyFp(uint64_t fp, int exp) : f(fp), e(exp) {}\n\n    explicit DiyFp(double d) {\n        union {\n            double d;\n            uint64_t u64;\n        } u = { d };\n\n        int biased_e = static_cast<int>((u.u64 & kDpExponentMask) >> kDpSignificandSize);\n        uint64_t significand = (u.u64 & kDpSignificandMask);\n        if (biased_e != 0) {\n            f = significand + kDpHiddenBit;\n            e = biased_e - kDpExponentBias;\n        }\n        else {\n            f = significand;\n            e = kDpMinExponent + 1;\n        }\n    }\n\n    DiyFp operator-(const DiyFp& rhs) const {\n        return DiyFp(f - rhs.f, e);\n    }\n\n    DiyFp operator*(const DiyFp& rhs) const {\n#if defined(_MSC_VER) && defined(_M_AMD64)\n        uint64_t h;\n        uint64_t l = _umul128(f, rhs.f, &h);\n        if (l & (uint64_t(1) << 63)) // rounding\n            h++;\n        return DiyFp(h, e + rhs.e + 64);\n#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__)\n        __extension__ typedef unsigned __int128 uint128;\n        uint128 p = static_cast<uint128>(f) * static_cast<uint128>(rhs.f);\n        uint64_t h = static_cast<uint64_t>(p >> 64);\n        uint64_t l = static_cast<uint64_t>(p);\n        if (l & (uint64_t(1) << 63)) // rounding\n            h++;\n        return DiyFp(h, e + rhs.e + 64);\n#else\n        const uint64_t M32 = 0xFFFFFFFF;\n        const uint64_t a = f >> 32;\n        const uint64_t b = f & M32;\n        const uint64_t c = rhs.f >> 32;\n        const uint64_t d = rhs.f & M32;\n        const uint64_t ac = a * c;\n        const uint64_t bc = b * c;\n        const uint64_t ad = a * d;\n        const uint64_t bd = b * d;\n        uint64_t tmp = (bd >> 32) + (ad & M32) + (bc & M32);\n        tmp += 1U << 31;  /// mult_round\n        return DiyFp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32), e + rhs.e + 64);\n#endif\n    }\n\n    DiyFp Normalize() const {\n        CEREAL_RAPIDJSON_ASSERT(f != 0); // https://stackoverflow.com/a/26809183/291737\n#if defined(_MSC_VER) && defined(_M_AMD64)\n        unsigned long index;\n        _BitScanReverse64(&index, f);\n        return DiyFp(f << (63 - index), e - (63 - index));\n#elif defined(__GNUC__) && __GNUC__ >= 4\n        int s = __builtin_clzll(f);\n        return DiyFp(f << s, e - s);\n#else\n        DiyFp res = *this;\n        while (!(res.f & (static_cast<uint64_t>(1) << 63))) {\n            res.f <<= 1;\n            res.e--;\n        }\n        return res;\n#endif\n    }\n\n    DiyFp NormalizeBoundary() const {\n        DiyFp res = *this;\n        while (!(res.f & (kDpHiddenBit << 1))) {\n            res.f <<= 1;\n            res.e--;\n        }\n        res.f <<= (kDiySignificandSize - kDpSignificandSize - 2);\n        res.e = res.e - (kDiySignificandSize - kDpSignificandSize - 2);\n        return res;\n    }\n\n    void NormalizedBoundaries(DiyFp* minus, DiyFp* plus) const {\n        DiyFp pl = DiyFp((f << 1) + 1, e - 1).NormalizeBoundary();\n        DiyFp mi = (f == kDpHiddenBit) ? DiyFp((f << 2) - 1, e - 2) : DiyFp((f << 1) - 1, e - 1);\n        mi.f <<= mi.e - pl.e;\n        mi.e = pl.e;\n        *plus = pl;\n        *minus = mi;\n    }\n\n    double ToDouble() const {\n        union {\n            double d;\n            uint64_t u64;\n        }u;\n        CEREAL_RAPIDJSON_ASSERT(f <= kDpHiddenBit + kDpSignificandMask);\n        if (e < kDpDenormalExponent) {\n            // Underflow.\n            return 0.0;\n        }\n        if (e >= kDpMaxExponent) {\n            // Overflow.\n            return std::numeric_limits<double>::infinity();\n        }\n        const uint64_t be = (e == kDpDenormalExponent && (f & kDpHiddenBit) == 0) ? 0 :\n            static_cast<uint64_t>(e + kDpExponentBias);\n        u.u64 = (f & kDpSignificandMask) | (be << kDpSignificandSize);\n        return u.d;\n    }\n\n    static const int kDiySignificandSize = 64;\n    static const int kDpSignificandSize = 52;\n    static const int kDpExponentBias = 0x3FF + kDpSignificandSize;\n    static const int kDpMaxExponent = 0x7FF - kDpExponentBias;\n    static const int kDpMinExponent = -kDpExponentBias;\n    static const int kDpDenormalExponent = -kDpExponentBias + 1;\n    static const uint64_t kDpExponentMask = CEREAL_RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000);\n    static const uint64_t kDpSignificandMask = CEREAL_RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF);\n    static const uint64_t kDpHiddenBit = CEREAL_RAPIDJSON_UINT64_C2(0x00100000, 0x00000000);\n\n    uint64_t f;\n    int e;\n};\n\ninline DiyFp GetCachedPowerByIndex(size_t index) {\n    // 10^-348, 10^-340, ..., 10^340\n    static const uint64_t kCachedPowers_F[] = {\n        CEREAL_RAPIDJSON_UINT64_C2(0xfa8fd5a0, 0x081c0288), CEREAL_RAPIDJSON_UINT64_C2(0xbaaee17f, 0xa23ebf76),\n        CEREAL_RAPIDJSON_UINT64_C2(0x8b16fb20, 0x3055ac76), CEREAL_RAPIDJSON_UINT64_C2(0xcf42894a, 0x5dce35ea),\n        CEREAL_RAPIDJSON_UINT64_C2(0x9a6bb0aa, 0x55653b2d), CEREAL_RAPIDJSON_UINT64_C2(0xe61acf03, 0x3d1a45df),\n        CEREAL_RAPIDJSON_UINT64_C2(0xab70fe17, 0xc79ac6ca), CEREAL_RAPIDJSON_UINT64_C2(0xff77b1fc, 0xbebcdc4f),\n        CEREAL_RAPIDJSON_UINT64_C2(0xbe5691ef, 0x416bd60c), CEREAL_RAPIDJSON_UINT64_C2(0x8dd01fad, 0x907ffc3c),\n        CEREAL_RAPIDJSON_UINT64_C2(0xd3515c28, 0x31559a83), CEREAL_RAPIDJSON_UINT64_C2(0x9d71ac8f, 0xada6c9b5),\n        CEREAL_RAPIDJSON_UINT64_C2(0xea9c2277, 0x23ee8bcb), CEREAL_RAPIDJSON_UINT64_C2(0xaecc4991, 0x4078536d),\n        CEREAL_RAPIDJSON_UINT64_C2(0x823c1279, 0x5db6ce57), CEREAL_RAPIDJSON_UINT64_C2(0xc2109436, 0x4dfb5637),\n        CEREAL_RAPIDJSON_UINT64_C2(0x9096ea6f, 0x3848984f), CEREAL_RAPIDJSON_UINT64_C2(0xd77485cb, 0x25823ac7),\n        CEREAL_RAPIDJSON_UINT64_C2(0xa086cfcd, 0x97bf97f4), CEREAL_RAPIDJSON_UINT64_C2(0xef340a98, 0x172aace5),\n        CEREAL_RAPIDJSON_UINT64_C2(0xb23867fb, 0x2a35b28e), CEREAL_RAPIDJSON_UINT64_C2(0x84c8d4df, 0xd2c63f3b),\n        CEREAL_RAPIDJSON_UINT64_C2(0xc5dd4427, 0x1ad3cdba), CEREAL_RAPIDJSON_UINT64_C2(0x936b9fce, 0xbb25c996),\n        CEREAL_RAPIDJSON_UINT64_C2(0xdbac6c24, 0x7d62a584), CEREAL_RAPIDJSON_UINT64_C2(0xa3ab6658, 0x0d5fdaf6),\n        CEREAL_RAPIDJSON_UINT64_C2(0xf3e2f893, 0xdec3f126), CEREAL_RAPIDJSON_UINT64_C2(0xb5b5ada8, 0xaaff80b8),\n        CEREAL_RAPIDJSON_UINT64_C2(0x87625f05, 0x6c7c4a8b), CEREAL_RAPIDJSON_UINT64_C2(0xc9bcff60, 0x34c13053),\n        CEREAL_RAPIDJSON_UINT64_C2(0x964e858c, 0x91ba2655), CEREAL_RAPIDJSON_UINT64_C2(0xdff97724, 0x70297ebd),\n        CEREAL_RAPIDJSON_UINT64_C2(0xa6dfbd9f, 0xb8e5b88f), CEREAL_RAPIDJSON_UINT64_C2(0xf8a95fcf, 0x88747d94),\n        CEREAL_RAPIDJSON_UINT64_C2(0xb9447093, 0x8fa89bcf), CEREAL_RAPIDJSON_UINT64_C2(0x8a08f0f8, 0xbf0f156b),\n        CEREAL_RAPIDJSON_UINT64_C2(0xcdb02555, 0x653131b6), CEREAL_RAPIDJSON_UINT64_C2(0x993fe2c6, 0xd07b7fac),\n        CEREAL_RAPIDJSON_UINT64_C2(0xe45c10c4, 0x2a2b3b06), CEREAL_RAPIDJSON_UINT64_C2(0xaa242499, 0x697392d3),\n        CEREAL_RAPIDJSON_UINT64_C2(0xfd87b5f2, 0x8300ca0e), CEREAL_RAPIDJSON_UINT64_C2(0xbce50864, 0x92111aeb),\n        CEREAL_RAPIDJSON_UINT64_C2(0x8cbccc09, 0x6f5088cc), CEREAL_RAPIDJSON_UINT64_C2(0xd1b71758, 0xe219652c),\n        CEREAL_RAPIDJSON_UINT64_C2(0x9c400000, 0x00000000), CEREAL_RAPIDJSON_UINT64_C2(0xe8d4a510, 0x00000000),\n        CEREAL_RAPIDJSON_UINT64_C2(0xad78ebc5, 0xac620000), CEREAL_RAPIDJSON_UINT64_C2(0x813f3978, 0xf8940984),\n        CEREAL_RAPIDJSON_UINT64_C2(0xc097ce7b, 0xc90715b3), CEREAL_RAPIDJSON_UINT64_C2(0x8f7e32ce, 0x7bea5c70),\n        CEREAL_RAPIDJSON_UINT64_C2(0xd5d238a4, 0xabe98068), CEREAL_RAPIDJSON_UINT64_C2(0x9f4f2726, 0x179a2245),\n        CEREAL_RAPIDJSON_UINT64_C2(0xed63a231, 0xd4c4fb27), CEREAL_RAPIDJSON_UINT64_C2(0xb0de6538, 0x8cc8ada8),\n        CEREAL_RAPIDJSON_UINT64_C2(0x83c7088e, 0x1aab65db), CEREAL_RAPIDJSON_UINT64_C2(0xc45d1df9, 0x42711d9a),\n        CEREAL_RAPIDJSON_UINT64_C2(0x924d692c, 0xa61be758), CEREAL_RAPIDJSON_UINT64_C2(0xda01ee64, 0x1a708dea),\n        CEREAL_RAPIDJSON_UINT64_C2(0xa26da399, 0x9aef774a), CEREAL_RAPIDJSON_UINT64_C2(0xf209787b, 0xb47d6b85),\n        CEREAL_RAPIDJSON_UINT64_C2(0xb454e4a1, 0x79dd1877), CEREAL_RAPIDJSON_UINT64_C2(0x865b8692, 0x5b9bc5c2),\n        CEREAL_RAPIDJSON_UINT64_C2(0xc83553c5, 0xc8965d3d), CEREAL_RAPIDJSON_UINT64_C2(0x952ab45c, 0xfa97a0b3),\n        CEREAL_RAPIDJSON_UINT64_C2(0xde469fbd, 0x99a05fe3), CEREAL_RAPIDJSON_UINT64_C2(0xa59bc234, 0xdb398c25),\n        CEREAL_RAPIDJSON_UINT64_C2(0xf6c69a72, 0xa3989f5c), CEREAL_RAPIDJSON_UINT64_C2(0xb7dcbf53, 0x54e9bece),\n        CEREAL_RAPIDJSON_UINT64_C2(0x88fcf317, 0xf22241e2), CEREAL_RAPIDJSON_UINT64_C2(0xcc20ce9b, 0xd35c78a5),\n        CEREAL_RAPIDJSON_UINT64_C2(0x98165af3, 0x7b2153df), CEREAL_RAPIDJSON_UINT64_C2(0xe2a0b5dc, 0x971f303a),\n        CEREAL_RAPIDJSON_UINT64_C2(0xa8d9d153, 0x5ce3b396), CEREAL_RAPIDJSON_UINT64_C2(0xfb9b7cd9, 0xa4a7443c),\n        CEREAL_RAPIDJSON_UINT64_C2(0xbb764c4c, 0xa7a44410), CEREAL_RAPIDJSON_UINT64_C2(0x8bab8eef, 0xb6409c1a),\n        CEREAL_RAPIDJSON_UINT64_C2(0xd01fef10, 0xa657842c), CEREAL_RAPIDJSON_UINT64_C2(0x9b10a4e5, 0xe9913129),\n        CEREAL_RAPIDJSON_UINT64_C2(0xe7109bfb, 0xa19c0c9d), CEREAL_RAPIDJSON_UINT64_C2(0xac2820d9, 0x623bf429),\n        CEREAL_RAPIDJSON_UINT64_C2(0x80444b5e, 0x7aa7cf85), CEREAL_RAPIDJSON_UINT64_C2(0xbf21e440, 0x03acdd2d),\n        CEREAL_RAPIDJSON_UINT64_C2(0x8e679c2f, 0x5e44ff8f), CEREAL_RAPIDJSON_UINT64_C2(0xd433179d, 0x9c8cb841),\n        CEREAL_RAPIDJSON_UINT64_C2(0x9e19db92, 0xb4e31ba9), CEREAL_RAPIDJSON_UINT64_C2(0xeb96bf6e, 0xbadf77d9),\n        CEREAL_RAPIDJSON_UINT64_C2(0xaf87023b, 0x9bf0ee6b)\n    };\n    static const int16_t kCachedPowers_E[] = {\n        -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007,  -980,\n        -954,  -927,  -901,  -874,  -847,  -821,  -794,  -768,  -741,  -715,\n        -688,  -661,  -635,  -608,  -582,  -555,  -529,  -502,  -475,  -449,\n        -422,  -396,  -369,  -343,  -316,  -289,  -263,  -236,  -210,  -183,\n        -157,  -130,  -103,   -77,   -50,   -24,     3,    30,    56,    83,\n        109,   136,   162,   189,   216,   242,   269,   295,   322,   348,\n        375,   402,   428,   455,   481,   508,   534,   561,   588,   614,\n        641,   667,   694,   720,   747,   774,   800,   827,   853,   880,\n        907,   933,   960,   986,  1013,  1039,  1066\n    };\n    CEREAL_RAPIDJSON_ASSERT(index < 87);\n    return DiyFp(kCachedPowers_F[index], kCachedPowers_E[index]);\n}\n\ninline DiyFp GetCachedPower(int e, int* K) {\n\n    //int k = static_cast<int>(ceil((-61 - e) * 0.30102999566398114)) + 374;\n    double dk = (-61 - e) * 0.30102999566398114 + 347;  // dk must be positive, so can do ceiling in positive\n    int k = static_cast<int>(dk);\n    if (dk - k > 0.0)\n        k++;\n\n    unsigned index = static_cast<unsigned>((k >> 3) + 1);\n    *K = -(-348 + static_cast<int>(index << 3));    // decimal exponent no need lookup table\n\n    return GetCachedPowerByIndex(index);\n}\n\ninline DiyFp GetCachedPower10(int exp, int *outExp) {\n    CEREAL_RAPIDJSON_ASSERT(exp >= -348);\n    unsigned index = static_cast<unsigned>(exp + 348) / 8u;\n    *outExp = -348 + static_cast<int>(index) * 8;\n    return GetCachedPowerByIndex(index);\n}\n\n#ifdef __GNUC__\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_POP\nCEREAL_RAPIDJSON_DIAG_OFF(padded)\n#endif\n\n} // namespace internal\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#endif // CEREAL_RAPIDJSON_DIYFP_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/internal/dtoa.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n// This is a C++ header-only implementation of Grisu2 algorithm from the publication:\n// Loitsch, Florian. \"Printing floating-point numbers quickly and accurately with\n// integers.\" ACM Sigplan Notices 45.6 (2010): 233-243.\n\n#ifndef CEREAL_RAPIDJSON_DTOA_\n#define CEREAL_RAPIDJSON_DTOA_\n\n#include \"itoa.h\" // GetDigitsLut()\n#include \"diyfp.h\"\n#include \"ieee754.h\"\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\nnamespace internal {\n\n#ifdef __GNUC__\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(effc++)\nCEREAL_RAPIDJSON_DIAG_OFF(array-bounds) // some gcc versions generate wrong warnings https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59124\n#endif\n\ninline void GrisuRound(char* buffer, int len, uint64_t delta, uint64_t rest, uint64_t ten_kappa, uint64_t wp_w) {\n    while (rest < wp_w && delta - rest >= ten_kappa &&\n           (rest + ten_kappa < wp_w ||  /// closer\n            wp_w - rest > rest + ten_kappa - wp_w)) {\n        buffer[len - 1]--;\n        rest += ten_kappa;\n    }\n}\n\ninline int CountDecimalDigit32(uint32_t n) {\n    // Simple pure C++ implementation was faster than __builtin_clz version in this situation.\n    if (n < 10) return 1;\n    if (n < 100) return 2;\n    if (n < 1000) return 3;\n    if (n < 10000) return 4;\n    if (n < 100000) return 5;\n    if (n < 1000000) return 6;\n    if (n < 10000000) return 7;\n    if (n < 100000000) return 8;\n    // Will not reach 10 digits in DigitGen()\n    //if (n < 1000000000) return 9;\n    //return 10;\n    return 9;\n}\n\ninline void DigitGen(const DiyFp& W, const DiyFp& Mp, uint64_t delta, char* buffer, int* len, int* K) {\n    static const uint32_t kPow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };\n    const DiyFp one(uint64_t(1) << -Mp.e, Mp.e);\n    const DiyFp wp_w = Mp - W;\n    uint32_t p1 = static_cast<uint32_t>(Mp.f >> -one.e);\n    uint64_t p2 = Mp.f & (one.f - 1);\n    int kappa = CountDecimalDigit32(p1); // kappa in [0, 9]\n    *len = 0;\n\n    while (kappa > 0) {\n        uint32_t d = 0;\n        switch (kappa) {\n            case  9: d = p1 /  100000000; p1 %=  100000000; break;\n            case  8: d = p1 /   10000000; p1 %=   10000000; break;\n            case  7: d = p1 /    1000000; p1 %=    1000000; break;\n            case  6: d = p1 /     100000; p1 %=     100000; break;\n            case  5: d = p1 /      10000; p1 %=      10000; break;\n            case  4: d = p1 /       1000; p1 %=       1000; break;\n            case  3: d = p1 /        100; p1 %=        100; break;\n            case  2: d = p1 /         10; p1 %=         10; break;\n            case  1: d = p1;              p1 =           0; break;\n            default:;\n        }\n        if (d || *len)\n            buffer[(*len)++] = static_cast<char>('0' + static_cast<char>(d));\n        kappa--;\n        uint64_t tmp = (static_cast<uint64_t>(p1) << -one.e) + p2;\n        if (tmp <= delta) {\n            *K += kappa;\n            GrisuRound(buffer, *len, delta, tmp, static_cast<uint64_t>(kPow10[kappa]) << -one.e, wp_w.f);\n            return;\n        }\n    }\n\n    // kappa = 0\n    for (;;) {\n        p2 *= 10;\n        delta *= 10;\n        char d = static_cast<char>(p2 >> -one.e);\n        if (d || *len)\n            buffer[(*len)++] = static_cast<char>('0' + d);\n        p2 &= one.f - 1;\n        kappa--;\n        if (p2 < delta) {\n            *K += kappa;\n            int index = -kappa;\n            GrisuRound(buffer, *len, delta, p2, one.f, wp_w.f * (index < 9 ? kPow10[index] : 0));\n            return;\n        }\n    }\n}\n\ninline void Grisu2(double value, char* buffer, int* length, int* K) {\n    const DiyFp v(value);\n    DiyFp w_m, w_p;\n    v.NormalizedBoundaries(&w_m, &w_p);\n\n    const DiyFp c_mk = GetCachedPower(w_p.e, K);\n    const DiyFp W = v.Normalize() * c_mk;\n    DiyFp Wp = w_p * c_mk;\n    DiyFp Wm = w_m * c_mk;\n    Wm.f++;\n    Wp.f--;\n    DigitGen(W, Wp, Wp.f - Wm.f, buffer, length, K);\n}\n\ninline char* WriteExponent(int K, char* buffer) {\n    if (K < 0) {\n        *buffer++ = '-';\n        K = -K;\n    }\n\n    if (K >= 100) {\n        *buffer++ = static_cast<char>('0' + static_cast<char>(K / 100));\n        K %= 100;\n        const char* d = GetDigitsLut() + K * 2;\n        *buffer++ = d[0];\n        *buffer++ = d[1];\n    }\n    else if (K >= 10) {\n        const char* d = GetDigitsLut() + K * 2;\n        *buffer++ = d[0];\n        *buffer++ = d[1];\n    }\n    else\n        *buffer++ = static_cast<char>('0' + static_cast<char>(K));\n\n    return buffer;\n}\n\ninline char* Prettify(char* buffer, int length, int k, int maxDecimalPlaces) {\n    const int kk = length + k;  // 10^(kk-1) <= v < 10^kk\n\n    if (0 <= k && kk <= 21) {\n        // 1234e7 -> 12340000000\n        for (int i = length; i < kk; i++)\n            buffer[i] = '0';\n        buffer[kk] = '.';\n        buffer[kk + 1] = '0';\n        return &buffer[kk + 2];\n    }\n    else if (0 < kk && kk <= 21) {\n        // 1234e-2 -> 12.34\n        std::memmove(&buffer[kk + 1], &buffer[kk], static_cast<size_t>(length - kk));\n        buffer[kk] = '.';\n        if (0 > k + maxDecimalPlaces) {\n            // When maxDecimalPlaces = 2, 1.2345 -> 1.23, 1.102 -> 1.1\n            // Remove extra trailing zeros (at least one) after truncation.\n            for (int i = kk + maxDecimalPlaces; i > kk + 1; i--)\n                if (buffer[i] != '0')\n                    return &buffer[i + 1];\n            return &buffer[kk + 2]; // Reserve one zero\n        }\n        else\n            return &buffer[length + 1];\n    }\n    else if (-6 < kk && kk <= 0) {\n        // 1234e-6 -> 0.001234\n        const int offset = 2 - kk;\n        std::memmove(&buffer[offset], &buffer[0], static_cast<size_t>(length));\n        buffer[0] = '0';\n        buffer[1] = '.';\n        for (int i = 2; i < offset; i++)\n            buffer[i] = '0';\n        if (length - kk > maxDecimalPlaces) {\n            // When maxDecimalPlaces = 2, 0.123 -> 0.12, 0.102 -> 0.1\n            // Remove extra trailing zeros (at least one) after truncation.\n            for (int i = maxDecimalPlaces + 1; i > 2; i--)\n                if (buffer[i] != '0')\n                    return &buffer[i + 1];\n            return &buffer[3]; // Reserve one zero\n        }\n        else\n            return &buffer[length + offset];\n    }\n    else if (kk < -maxDecimalPlaces) {\n        // Truncate to zero\n        buffer[0] = '0';\n        buffer[1] = '.';\n        buffer[2] = '0';\n        return &buffer[3];\n    }\n    else if (length == 1) {\n        // 1e30\n        buffer[1] = 'e';\n        return WriteExponent(kk - 1, &buffer[2]);\n    }\n    else {\n        // 1234e30 -> 1.234e33\n        std::memmove(&buffer[2], &buffer[1], static_cast<size_t>(length - 1));\n        buffer[1] = '.';\n        buffer[length + 1] = 'e';\n        return WriteExponent(kk - 1, &buffer[0 + length + 2]);\n    }\n}\n\ninline char* dtoa(double value, char* buffer, int maxDecimalPlaces = 324) {\n    CEREAL_RAPIDJSON_ASSERT(maxDecimalPlaces >= 1);\n    Double d(value);\n    if (d.IsZero()) {\n        if (d.Sign())\n            *buffer++ = '-';     // -0.0, Issue #289\n        buffer[0] = '0';\n        buffer[1] = '.';\n        buffer[2] = '0';\n        return &buffer[3];\n    }\n    else {\n        if (value < 0) {\n            *buffer++ = '-';\n            value = -value;\n        }\n        int length, K;\n        Grisu2(value, buffer, &length, &K);\n        return Prettify(buffer, length, K, maxDecimalPlaces);\n    }\n}\n\n#ifdef __GNUC__\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n} // namespace internal\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#endif // CEREAL_RAPIDJSON_DTOA_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/internal/ieee754.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_IEEE754_\n#define CEREAL_RAPIDJSON_IEEE754_\n\n#include \"../rapidjson.h\"\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\nnamespace internal {\n\nclass Double {\npublic:\n    Double() {}\n    Double(double d) : d_(d) {}\n    Double(uint64_t u) : u_(u) {}\n\n    double Value() const { return d_; }\n    uint64_t Uint64Value() const { return u_; }\n\n    double NextPositiveDouble() const {\n        CEREAL_RAPIDJSON_ASSERT(!Sign());\n        return Double(u_ + 1).Value();\n    }\n\n    bool Sign() const { return (u_ & kSignMask) != 0; }\n    uint64_t Significand() const { return u_ & kSignificandMask; }\n    int Exponent() const { return static_cast<int>(((u_ & kExponentMask) >> kSignificandSize) - kExponentBias); }\n\n    bool IsNan() const { return (u_ & kExponentMask) == kExponentMask && Significand() != 0; }\n    bool IsInf() const { return (u_ & kExponentMask) == kExponentMask && Significand() == 0; }\n    bool IsNanOrInf() const { return (u_ & kExponentMask) == kExponentMask; }\n    bool IsNormal() const { return (u_ & kExponentMask) != 0 || Significand() == 0; }\n    bool IsZero() const { return (u_ & (kExponentMask | kSignificandMask)) == 0; }\n\n    uint64_t IntegerSignificand() const { return IsNormal() ? Significand() | kHiddenBit : Significand(); }\n    int IntegerExponent() const { return (IsNormal() ? Exponent() : kDenormalExponent) - kSignificandSize; }\n    uint64_t ToBias() const { return (u_ & kSignMask) ? ~u_ + 1 : u_ | kSignMask; }\n\n    static int EffectiveSignificandSize(int order) {\n        if (order >= -1021)\n            return 53;\n        else if (order <= -1074)\n            return 0;\n        else\n            return order + 1074;\n    }\n\nprivate:\n    static const int kSignificandSize = 52;\n    static const int kExponentBias = 0x3FF;\n    static const int kDenormalExponent = 1 - kExponentBias;\n    static const uint64_t kSignMask = CEREAL_RAPIDJSON_UINT64_C2(0x80000000, 0x00000000);\n    static const uint64_t kExponentMask = CEREAL_RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000);\n    static const uint64_t kSignificandMask = CEREAL_RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF);\n    static const uint64_t kHiddenBit = CEREAL_RAPIDJSON_UINT64_C2(0x00100000, 0x00000000);\n\n    union {\n        double d_;\n        uint64_t u_;\n    };\n};\n\n} // namespace internal\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#endif // CEREAL_RAPIDJSON_IEEE754_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/internal/itoa.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n//\n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed\n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n// CONDITIONS OF ANY KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_ITOA_\n#define CEREAL_RAPIDJSON_ITOA_\n\n#include \"../rapidjson.h\"\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\nnamespace internal {\n\ninline const char* GetDigitsLut() {\n    static const char cDigitsLut[200] = {\n        '0','0','0','1','0','2','0','3','0','4','0','5','0','6','0','7','0','8','0','9',\n        '1','0','1','1','1','2','1','3','1','4','1','5','1','6','1','7','1','8','1','9',\n        '2','0','2','1','2','2','2','3','2','4','2','5','2','6','2','7','2','8','2','9',\n        '3','0','3','1','3','2','3','3','3','4','3','5','3','6','3','7','3','8','3','9',\n        '4','0','4','1','4','2','4','3','4','4','4','5','4','6','4','7','4','8','4','9',\n        '5','0','5','1','5','2','5','3','5','4','5','5','5','6','5','7','5','8','5','9',\n        '6','0','6','1','6','2','6','3','6','4','6','5','6','6','6','7','6','8','6','9',\n        '7','0','7','1','7','2','7','3','7','4','7','5','7','6','7','7','7','8','7','9',\n        '8','0','8','1','8','2','8','3','8','4','8','5','8','6','8','7','8','8','8','9',\n        '9','0','9','1','9','2','9','3','9','4','9','5','9','6','9','7','9','8','9','9'\n    };\n    return cDigitsLut;\n}\n\ninline char* u32toa(uint32_t value, char* buffer) {\n    CEREAL_RAPIDJSON_ASSERT(buffer != 0);\n\n    const char* cDigitsLut = GetDigitsLut();\n\n    if (value < 10000) {\n        const uint32_t d1 = (value / 100) << 1;\n        const uint32_t d2 = (value % 100) << 1;\n\n        if (value >= 1000)\n            *buffer++ = cDigitsLut[d1];\n        if (value >= 100)\n            *buffer++ = cDigitsLut[d1 + 1];\n        if (value >= 10)\n            *buffer++ = cDigitsLut[d2];\n        *buffer++ = cDigitsLut[d2 + 1];\n    }\n    else if (value < 100000000) {\n        // value = bbbbcccc\n        const uint32_t b = value / 10000;\n        const uint32_t c = value % 10000;\n\n        const uint32_t d1 = (b / 100) << 1;\n        const uint32_t d2 = (b % 100) << 1;\n\n        const uint32_t d3 = (c / 100) << 1;\n        const uint32_t d4 = (c % 100) << 1;\n\n        if (value >= 10000000)\n            *buffer++ = cDigitsLut[d1];\n        if (value >= 1000000)\n            *buffer++ = cDigitsLut[d1 + 1];\n        if (value >= 100000)\n            *buffer++ = cDigitsLut[d2];\n        *buffer++ = cDigitsLut[d2 + 1];\n\n        *buffer++ = cDigitsLut[d3];\n        *buffer++ = cDigitsLut[d3 + 1];\n        *buffer++ = cDigitsLut[d4];\n        *buffer++ = cDigitsLut[d4 + 1];\n    }\n    else {\n        // value = aabbbbcccc in decimal\n\n        const uint32_t a = value / 100000000; // 1 to 42\n        value %= 100000000;\n\n        if (a >= 10) {\n            const unsigned i = a << 1;\n            *buffer++ = cDigitsLut[i];\n            *buffer++ = cDigitsLut[i + 1];\n        }\n        else\n            *buffer++ = static_cast<char>('0' + static_cast<char>(a));\n\n        const uint32_t b = value / 10000; // 0 to 9999\n        const uint32_t c = value % 10000; // 0 to 9999\n\n        const uint32_t d1 = (b / 100) << 1;\n        const uint32_t d2 = (b % 100) << 1;\n\n        const uint32_t d3 = (c / 100) << 1;\n        const uint32_t d4 = (c % 100) << 1;\n\n        *buffer++ = cDigitsLut[d1];\n        *buffer++ = cDigitsLut[d1 + 1];\n        *buffer++ = cDigitsLut[d2];\n        *buffer++ = cDigitsLut[d2 + 1];\n        *buffer++ = cDigitsLut[d3];\n        *buffer++ = cDigitsLut[d3 + 1];\n        *buffer++ = cDigitsLut[d4];\n        *buffer++ = cDigitsLut[d4 + 1];\n    }\n    return buffer;\n}\n\ninline char* i32toa(int32_t value, char* buffer) {\n    CEREAL_RAPIDJSON_ASSERT(buffer != 0);\n    uint32_t u = static_cast<uint32_t>(value);\n    if (value < 0) {\n        *buffer++ = '-';\n        u = ~u + 1;\n    }\n\n    return u32toa(u, buffer);\n}\n\ninline char* u64toa(uint64_t value, char* buffer) {\n    CEREAL_RAPIDJSON_ASSERT(buffer != 0);\n    const char* cDigitsLut = GetDigitsLut();\n    const uint64_t  kTen8 = 100000000;\n    const uint64_t  kTen9 = kTen8 * 10;\n    const uint64_t kTen10 = kTen8 * 100;\n    const uint64_t kTen11 = kTen8 * 1000;\n    const uint64_t kTen12 = kTen8 * 10000;\n    const uint64_t kTen13 = kTen8 * 100000;\n    const uint64_t kTen14 = kTen8 * 1000000;\n    const uint64_t kTen15 = kTen8 * 10000000;\n    const uint64_t kTen16 = kTen8 * kTen8;\n\n    if (value < kTen8) {\n        uint32_t v = static_cast<uint32_t>(value);\n        if (v < 10000) {\n            const uint32_t d1 = (v / 100) << 1;\n            const uint32_t d2 = (v % 100) << 1;\n\n            if (v >= 1000)\n                *buffer++ = cDigitsLut[d1];\n            if (v >= 100)\n                *buffer++ = cDigitsLut[d1 + 1];\n            if (v >= 10)\n                *buffer++ = cDigitsLut[d2];\n            *buffer++ = cDigitsLut[d2 + 1];\n        }\n        else {\n            // value = bbbbcccc\n            const uint32_t b = v / 10000;\n            const uint32_t c = v % 10000;\n\n            const uint32_t d1 = (b / 100) << 1;\n            const uint32_t d2 = (b % 100) << 1;\n\n            const uint32_t d3 = (c / 100) << 1;\n            const uint32_t d4 = (c % 100) << 1;\n\n            if (value >= 10000000)\n                *buffer++ = cDigitsLut[d1];\n            if (value >= 1000000)\n                *buffer++ = cDigitsLut[d1 + 1];\n            if (value >= 100000)\n                *buffer++ = cDigitsLut[d2];\n            *buffer++ = cDigitsLut[d2 + 1];\n\n            *buffer++ = cDigitsLut[d3];\n            *buffer++ = cDigitsLut[d3 + 1];\n            *buffer++ = cDigitsLut[d4];\n            *buffer++ = cDigitsLut[d4 + 1];\n        }\n    }\n    else if (value < kTen16) {\n        const uint32_t v0 = static_cast<uint32_t>(value / kTen8);\n        const uint32_t v1 = static_cast<uint32_t>(value % kTen8);\n\n        const uint32_t b0 = v0 / 10000;\n        const uint32_t c0 = v0 % 10000;\n\n        const uint32_t d1 = (b0 / 100) << 1;\n        const uint32_t d2 = (b0 % 100) << 1;\n\n        const uint32_t d3 = (c0 / 100) << 1;\n        const uint32_t d4 = (c0 % 100) << 1;\n\n        const uint32_t b1 = v1 / 10000;\n        const uint32_t c1 = v1 % 10000;\n\n        const uint32_t d5 = (b1 / 100) << 1;\n        const uint32_t d6 = (b1 % 100) << 1;\n\n        const uint32_t d7 = (c1 / 100) << 1;\n        const uint32_t d8 = (c1 % 100) << 1;\n\n        if (value >= kTen15)\n            *buffer++ = cDigitsLut[d1];\n        if (value >= kTen14)\n            *buffer++ = cDigitsLut[d1 + 1];\n        if (value >= kTen13)\n            *buffer++ = cDigitsLut[d2];\n        if (value >= kTen12)\n            *buffer++ = cDigitsLut[d2 + 1];\n        if (value >= kTen11)\n            *buffer++ = cDigitsLut[d3];\n        if (value >= kTen10)\n            *buffer++ = cDigitsLut[d3 + 1];\n        if (value >= kTen9)\n            *buffer++ = cDigitsLut[d4];\n\n        *buffer++ = cDigitsLut[d4 + 1];\n        *buffer++ = cDigitsLut[d5];\n        *buffer++ = cDigitsLut[d5 + 1];\n        *buffer++ = cDigitsLut[d6];\n        *buffer++ = cDigitsLut[d6 + 1];\n        *buffer++ = cDigitsLut[d7];\n        *buffer++ = cDigitsLut[d7 + 1];\n        *buffer++ = cDigitsLut[d8];\n        *buffer++ = cDigitsLut[d8 + 1];\n    }\n    else {\n        const uint32_t a = static_cast<uint32_t>(value / kTen16); // 1 to 1844\n        value %= kTen16;\n\n        if (a < 10)\n            *buffer++ = static_cast<char>('0' + static_cast<char>(a));\n        else if (a < 100) {\n            const uint32_t i = a << 1;\n            *buffer++ = cDigitsLut[i];\n            *buffer++ = cDigitsLut[i + 1];\n        }\n        else if (a < 1000) {\n            *buffer++ = static_cast<char>('0' + static_cast<char>(a / 100));\n\n            const uint32_t i = (a % 100) << 1;\n            *buffer++ = cDigitsLut[i];\n            *buffer++ = cDigitsLut[i + 1];\n        }\n        else {\n            const uint32_t i = (a / 100) << 1;\n            const uint32_t j = (a % 100) << 1;\n            *buffer++ = cDigitsLut[i];\n            *buffer++ = cDigitsLut[i + 1];\n            *buffer++ = cDigitsLut[j];\n            *buffer++ = cDigitsLut[j + 1];\n        }\n\n        const uint32_t v0 = static_cast<uint32_t>(value / kTen8);\n        const uint32_t v1 = static_cast<uint32_t>(value % kTen8);\n\n        const uint32_t b0 = v0 / 10000;\n        const uint32_t c0 = v0 % 10000;\n\n        const uint32_t d1 = (b0 / 100) << 1;\n        const uint32_t d2 = (b0 % 100) << 1;\n\n        const uint32_t d3 = (c0 / 100) << 1;\n        const uint32_t d4 = (c0 % 100) << 1;\n\n        const uint32_t b1 = v1 / 10000;\n        const uint32_t c1 = v1 % 10000;\n\n        const uint32_t d5 = (b1 / 100) << 1;\n        const uint32_t d6 = (b1 % 100) << 1;\n\n        const uint32_t d7 = (c1 / 100) << 1;\n        const uint32_t d8 = (c1 % 100) << 1;\n\n        *buffer++ = cDigitsLut[d1];\n        *buffer++ = cDigitsLut[d1 + 1];\n        *buffer++ = cDigitsLut[d2];\n        *buffer++ = cDigitsLut[d2 + 1];\n        *buffer++ = cDigitsLut[d3];\n        *buffer++ = cDigitsLut[d3 + 1];\n        *buffer++ = cDigitsLut[d4];\n        *buffer++ = cDigitsLut[d4 + 1];\n        *buffer++ = cDigitsLut[d5];\n        *buffer++ = cDigitsLut[d5 + 1];\n        *buffer++ = cDigitsLut[d6];\n        *buffer++ = cDigitsLut[d6 + 1];\n        *buffer++ = cDigitsLut[d7];\n        *buffer++ = cDigitsLut[d7 + 1];\n        *buffer++ = cDigitsLut[d8];\n        *buffer++ = cDigitsLut[d8 + 1];\n    }\n\n    return buffer;\n}\n\ninline char* i64toa(int64_t value, char* buffer) {\n    CEREAL_RAPIDJSON_ASSERT(buffer != 0);\n    uint64_t u = static_cast<uint64_t>(value);\n    if (value < 0) {\n        *buffer++ = '-';\n        u = ~u + 1;\n    }\n\n    return u64toa(u, buffer);\n}\n\n} // namespace internal\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#endif // CEREAL_RAPIDJSON_ITOA_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/internal/meta.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_INTERNAL_META_H_\n#define CEREAL_RAPIDJSON_INTERNAL_META_H_\n\n#include \"../rapidjson.h\"\n\n#ifdef __GNUC__\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(effc++)\n#endif\n\n#if defined(_MSC_VER) && !defined(__clang__)\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(6334)\n#endif\n\n#if CEREAL_RAPIDJSON_HAS_CXX11_TYPETRAITS\n#include <type_traits>\n#endif\n\n//@cond CEREAL_RAPIDJSON_INTERNAL\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\nnamespace internal {\n\n// Helper to wrap/convert arbitrary types to void, useful for arbitrary type matching\ntemplate <typename T> struct Void { typedef void Type; };\n\n///////////////////////////////////////////////////////////////////////////////\n// BoolType, TrueType, FalseType\n//\ntemplate <bool Cond> struct BoolType {\n    static const bool Value = Cond;\n    typedef BoolType Type;\n};\ntypedef BoolType<true> TrueType;\ntypedef BoolType<false> FalseType;\n\n\n///////////////////////////////////////////////////////////////////////////////\n// SelectIf, BoolExpr, NotExpr, AndExpr, OrExpr\n//\n\ntemplate <bool C> struct SelectIfImpl { template <typename T1, typename T2> struct Apply { typedef T1 Type; }; };\ntemplate <> struct SelectIfImpl<false> { template <typename T1, typename T2> struct Apply { typedef T2 Type; }; };\ntemplate <bool C, typename T1, typename T2> struct SelectIfCond : SelectIfImpl<C>::template Apply<T1,T2> {};\ntemplate <typename C, typename T1, typename T2> struct SelectIf : SelectIfCond<C::Value, T1, T2> {};\n\ntemplate <bool Cond1, bool Cond2> struct AndExprCond : FalseType {};\ntemplate <> struct AndExprCond<true, true> : TrueType {};\ntemplate <bool Cond1, bool Cond2> struct OrExprCond : TrueType {};\ntemplate <> struct OrExprCond<false, false> : FalseType {};\n\ntemplate <typename C> struct BoolExpr : SelectIf<C,TrueType,FalseType>::Type {};\ntemplate <typename C> struct NotExpr  : SelectIf<C,FalseType,TrueType>::Type {};\ntemplate <typename C1, typename C2> struct AndExpr : AndExprCond<C1::Value, C2::Value>::Type {};\ntemplate <typename C1, typename C2> struct OrExpr  : OrExprCond<C1::Value, C2::Value>::Type {};\n\n\n///////////////////////////////////////////////////////////////////////////////\n// AddConst, MaybeAddConst, RemoveConst\ntemplate <typename T> struct AddConst { typedef const T Type; };\ntemplate <bool Constify, typename T> struct MaybeAddConst : SelectIfCond<Constify, const T, T> {};\ntemplate <typename T> struct RemoveConst { typedef T Type; };\ntemplate <typename T> struct RemoveConst<const T> { typedef T Type; };\n\n\n///////////////////////////////////////////////////////////////////////////////\n// IsSame, IsConst, IsMoreConst, IsPointer\n//\ntemplate <typename T, typename U> struct IsSame : FalseType {};\ntemplate <typename T> struct IsSame<T, T> : TrueType {};\n\ntemplate <typename T> struct IsConst : FalseType {};\ntemplate <typename T> struct IsConst<const T> : TrueType {};\n\ntemplate <typename CT, typename T>\nstruct IsMoreConst\n    : AndExpr<IsSame<typename RemoveConst<CT>::Type, typename RemoveConst<T>::Type>,\n              BoolType<IsConst<CT>::Value >= IsConst<T>::Value> >::Type {};\n\ntemplate <typename T> struct IsPointer : FalseType {};\ntemplate <typename T> struct IsPointer<T*> : TrueType {};\n\n///////////////////////////////////////////////////////////////////////////////\n// IsBaseOf\n//\n#if CEREAL_RAPIDJSON_HAS_CXX11_TYPETRAITS\n\ntemplate <typename B, typename D> struct IsBaseOf\n    : BoolType< ::std::is_base_of<B,D>::value> {};\n\n#else // simplified version adopted from Boost\n\ntemplate<typename B, typename D> struct IsBaseOfImpl {\n    CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(B) != 0);\n    CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(D) != 0);\n\n    typedef char (&Yes)[1];\n    typedef char (&No) [2];\n\n    template <typename T>\n    static Yes Check(const D*, T);\n    static No  Check(const B*, int);\n\n    struct Host {\n        operator const B*() const;\n        operator const D*();\n    };\n\n    enum { Value = (sizeof(Check(Host(), 0)) == sizeof(Yes)) };\n};\n\ntemplate <typename B, typename D> struct IsBaseOf\n    : OrExpr<IsSame<B, D>, BoolExpr<IsBaseOfImpl<B, D> > >::Type {};\n\n#endif // CEREAL_RAPIDJSON_HAS_CXX11_TYPETRAITS\n\n\n//////////////////////////////////////////////////////////////////////////\n// EnableIf / DisableIf\n//\ntemplate <bool Condition, typename T = void> struct EnableIfCond  { typedef T Type; };\ntemplate <typename T> struct EnableIfCond<false, T> { /* empty */ };\n\ntemplate <bool Condition, typename T = void> struct DisableIfCond { typedef T Type; };\ntemplate <typename T> struct DisableIfCond<true, T> { /* empty */ };\n\ntemplate <typename Condition, typename T = void>\nstruct EnableIf : EnableIfCond<Condition::Value, T> {};\n\ntemplate <typename Condition, typename T = void>\nstruct DisableIf : DisableIfCond<Condition::Value, T> {};\n\n// SFINAE helpers\nstruct SfinaeTag {};\ntemplate <typename T> struct RemoveSfinaeTag;\ntemplate <typename T> struct RemoveSfinaeTag<SfinaeTag&(*)(T)> { typedef T Type; };\n\n#define CEREAL_RAPIDJSON_REMOVEFPTR_(type) \\\n    typename ::CEREAL_RAPIDJSON_NAMESPACE::internal::RemoveSfinaeTag \\\n        < ::CEREAL_RAPIDJSON_NAMESPACE::internal::SfinaeTag&(*) type>::Type\n\n#define CEREAL_RAPIDJSON_ENABLEIF(cond) \\\n    typename ::CEREAL_RAPIDJSON_NAMESPACE::internal::EnableIf \\\n        <CEREAL_RAPIDJSON_REMOVEFPTR_(cond)>::Type * = NULL\n\n#define CEREAL_RAPIDJSON_DISABLEIF(cond) \\\n    typename ::CEREAL_RAPIDJSON_NAMESPACE::internal::DisableIf \\\n        <CEREAL_RAPIDJSON_REMOVEFPTR_(cond)>::Type * = NULL\n\n#define CEREAL_RAPIDJSON_ENABLEIF_RETURN(cond,returntype) \\\n    typename ::CEREAL_RAPIDJSON_NAMESPACE::internal::EnableIf \\\n        <CEREAL_RAPIDJSON_REMOVEFPTR_(cond), \\\n         CEREAL_RAPIDJSON_REMOVEFPTR_(returntype)>::Type\n\n#define CEREAL_RAPIDJSON_DISABLEIF_RETURN(cond,returntype) \\\n    typename ::CEREAL_RAPIDJSON_NAMESPACE::internal::DisableIf \\\n        <CEREAL_RAPIDJSON_REMOVEFPTR_(cond), \\\n         CEREAL_RAPIDJSON_REMOVEFPTR_(returntype)>::Type\n\n} // namespace internal\nCEREAL_RAPIDJSON_NAMESPACE_END\n//@endcond\n\n#if defined(_MSC_VER) && !defined(__clang__)\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#ifdef __GNUC__\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#endif // CEREAL_RAPIDJSON_INTERNAL_META_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/internal/pow10.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_POW10_\n#define CEREAL_RAPIDJSON_POW10_\n\n#include \"../rapidjson.h\"\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\nnamespace internal {\n\n//! Computes integer powers of 10 in double (10.0^n).\n/*! This function uses lookup table for fast and accurate results.\n    \\param n non-negative exponent. Must <= 308.\n    \\return 10.0^n\n*/\ninline double Pow10(int n) {\n    static const double e[] = { // 1e-0...1e308: 309 * 8 bytes = 2472 bytes\n        1e+0,  \n        1e+1,  1e+2,  1e+3,  1e+4,  1e+5,  1e+6,  1e+7,  1e+8,  1e+9,  1e+10, 1e+11, 1e+12, 1e+13, 1e+14, 1e+15, 1e+16, 1e+17, 1e+18, 1e+19, 1e+20, \n        1e+21, 1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33, 1e+34, 1e+35, 1e+36, 1e+37, 1e+38, 1e+39, 1e+40,\n        1e+41, 1e+42, 1e+43, 1e+44, 1e+45, 1e+46, 1e+47, 1e+48, 1e+49, 1e+50, 1e+51, 1e+52, 1e+53, 1e+54, 1e+55, 1e+56, 1e+57, 1e+58, 1e+59, 1e+60,\n        1e+61, 1e+62, 1e+63, 1e+64, 1e+65, 1e+66, 1e+67, 1e+68, 1e+69, 1e+70, 1e+71, 1e+72, 1e+73, 1e+74, 1e+75, 1e+76, 1e+77, 1e+78, 1e+79, 1e+80,\n        1e+81, 1e+82, 1e+83, 1e+84, 1e+85, 1e+86, 1e+87, 1e+88, 1e+89, 1e+90, 1e+91, 1e+92, 1e+93, 1e+94, 1e+95, 1e+96, 1e+97, 1e+98, 1e+99, 1e+100,\n        1e+101,1e+102,1e+103,1e+104,1e+105,1e+106,1e+107,1e+108,1e+109,1e+110,1e+111,1e+112,1e+113,1e+114,1e+115,1e+116,1e+117,1e+118,1e+119,1e+120,\n        1e+121,1e+122,1e+123,1e+124,1e+125,1e+126,1e+127,1e+128,1e+129,1e+130,1e+131,1e+132,1e+133,1e+134,1e+135,1e+136,1e+137,1e+138,1e+139,1e+140,\n        1e+141,1e+142,1e+143,1e+144,1e+145,1e+146,1e+147,1e+148,1e+149,1e+150,1e+151,1e+152,1e+153,1e+154,1e+155,1e+156,1e+157,1e+158,1e+159,1e+160,\n        1e+161,1e+162,1e+163,1e+164,1e+165,1e+166,1e+167,1e+168,1e+169,1e+170,1e+171,1e+172,1e+173,1e+174,1e+175,1e+176,1e+177,1e+178,1e+179,1e+180,\n        1e+181,1e+182,1e+183,1e+184,1e+185,1e+186,1e+187,1e+188,1e+189,1e+190,1e+191,1e+192,1e+193,1e+194,1e+195,1e+196,1e+197,1e+198,1e+199,1e+200,\n        1e+201,1e+202,1e+203,1e+204,1e+205,1e+206,1e+207,1e+208,1e+209,1e+210,1e+211,1e+212,1e+213,1e+214,1e+215,1e+216,1e+217,1e+218,1e+219,1e+220,\n        1e+221,1e+222,1e+223,1e+224,1e+225,1e+226,1e+227,1e+228,1e+229,1e+230,1e+231,1e+232,1e+233,1e+234,1e+235,1e+236,1e+237,1e+238,1e+239,1e+240,\n        1e+241,1e+242,1e+243,1e+244,1e+245,1e+246,1e+247,1e+248,1e+249,1e+250,1e+251,1e+252,1e+253,1e+254,1e+255,1e+256,1e+257,1e+258,1e+259,1e+260,\n        1e+261,1e+262,1e+263,1e+264,1e+265,1e+266,1e+267,1e+268,1e+269,1e+270,1e+271,1e+272,1e+273,1e+274,1e+275,1e+276,1e+277,1e+278,1e+279,1e+280,\n        1e+281,1e+282,1e+283,1e+284,1e+285,1e+286,1e+287,1e+288,1e+289,1e+290,1e+291,1e+292,1e+293,1e+294,1e+295,1e+296,1e+297,1e+298,1e+299,1e+300,\n        1e+301,1e+302,1e+303,1e+304,1e+305,1e+306,1e+307,1e+308\n    };\n    CEREAL_RAPIDJSON_ASSERT(n >= 0 && n <= 308);\n    return e[n];\n}\n\n} // namespace internal\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#endif // CEREAL_RAPIDJSON_POW10_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/internal/regex.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_INTERNAL_REGEX_H_\n#define CEREAL_RAPIDJSON_INTERNAL_REGEX_H_\n\n#include \"../allocators.h\"\n#include \"../stream.h\"\n#include \"stack.h\"\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(padded)\nCEREAL_RAPIDJSON_DIAG_OFF(switch-enum)\nCEREAL_RAPIDJSON_DIAG_OFF(implicit-fallthrough)\n#elif defined(_MSC_VER)\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated\n#endif\n\n#ifdef __GNUC__\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(effc++)\n#if __GNUC__ >= 7\nCEREAL_RAPIDJSON_DIAG_OFF(implicit-fallthrough)\n#endif\n#endif\n\n#ifndef CEREAL_RAPIDJSON_REGEX_VERBOSE\n#define CEREAL_RAPIDJSON_REGEX_VERBOSE 0\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\nnamespace internal {\n\n///////////////////////////////////////////////////////////////////////////////\n// DecodedStream\n\ntemplate <typename SourceStream, typename Encoding>\nclass DecodedStream {\npublic:\n    DecodedStream(SourceStream& ss) : ss_(ss), codepoint_() { Decode(); }\n    unsigned Peek() { return codepoint_; }\n    unsigned Take() {\n        unsigned c = codepoint_;\n        if (c) // No further decoding when '\\0'\n            Decode();\n        return c;\n    }\n\nprivate:\n    void Decode() {\n        if (!Encoding::Decode(ss_, &codepoint_))\n            codepoint_ = 0;\n    }\n\n    SourceStream& ss_;\n    unsigned codepoint_;\n};\n\n///////////////////////////////////////////////////////////////////////////////\n// GenericRegex\n\nstatic const SizeType kRegexInvalidState = ~SizeType(0);  //!< Represents an invalid index in GenericRegex::State::out, out1\nstatic const SizeType kRegexInvalidRange = ~SizeType(0);\n\ntemplate <typename Encoding, typename Allocator>\nclass GenericRegexSearch;\n\n//! Regular expression engine with subset of ECMAscript grammar.\n/*!\n    Supported regular expression syntax:\n    - \\c ab     Concatenation\n    - \\c a|b    Alternation\n    - \\c a?     Zero or one\n    - \\c a*     Zero or more\n    - \\c a+     One or more\n    - \\c a{3}   Exactly 3 times\n    - \\c a{3,}  At least 3 times\n    - \\c a{3,5} 3 to 5 times\n    - \\c (ab)   Grouping\n    - \\c ^a     At the beginning\n    - \\c a$     At the end\n    - \\c .      Any character\n    - \\c [abc]  Character classes\n    - \\c [a-c]  Character class range\n    - \\c [a-z0-9_] Character class combination\n    - \\c [^abc] Negated character classes\n    - \\c [^a-c] Negated character class range\n    - \\c [\\b]   Backspace (U+0008)\n    - \\c \\\\| \\\\\\\\ ...  Escape characters\n    - \\c \\\\f Form feed (U+000C)\n    - \\c \\\\n Line feed (U+000A)\n    - \\c \\\\r Carriage return (U+000D)\n    - \\c \\\\t Tab (U+0009)\n    - \\c \\\\v Vertical tab (U+000B)\n\n    \\note This is a Thompson NFA engine, implemented with reference to \n        Cox, Russ. \"Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby,...).\", \n        https://swtch.com/~rsc/regexp/regexp1.html \n*/\ntemplate <typename Encoding, typename Allocator = CrtAllocator>\nclass GenericRegex {\npublic:\n    typedef Encoding EncodingType;\n    typedef typename Encoding::Ch Ch;\n    template <typename, typename> friend class GenericRegexSearch;\n\n    GenericRegex(const Ch* source, Allocator* allocator = 0) : \n        ownAllocator_(allocator ? 0 : CEREAL_RAPIDJSON_NEW(Allocator)()), allocator_(allocator ? allocator : ownAllocator_), \n        states_(allocator_, 256), ranges_(allocator_, 256), root_(kRegexInvalidState), stateCount_(), rangeCount_(), \n        anchorBegin_(), anchorEnd_()\n    {\n        GenericStringStream<Encoding> ss(source);\n        DecodedStream<GenericStringStream<Encoding>, Encoding> ds(ss);\n        Parse(ds);\n    }\n\n    ~GenericRegex()\n    {\n        CEREAL_RAPIDJSON_DELETE(ownAllocator_);\n    }\n\n    bool IsValid() const {\n        return root_ != kRegexInvalidState;\n    }\n\nprivate:\n    enum Operator {\n        kZeroOrOne,\n        kZeroOrMore,\n        kOneOrMore,\n        kConcatenation,\n        kAlternation,\n        kLeftParenthesis\n    };\n\n    static const unsigned kAnyCharacterClass = 0xFFFFFFFF;   //!< For '.'\n    static const unsigned kRangeCharacterClass = 0xFFFFFFFE;\n    static const unsigned kRangeNegationFlag = 0x80000000;\n\n    struct Range {\n        unsigned start; // \n        unsigned end;\n        SizeType next;\n    };\n\n    struct State {\n        SizeType out;     //!< Equals to kInvalid for matching state\n        SizeType out1;    //!< Equals to non-kInvalid for split\n        SizeType rangeStart;\n        unsigned codepoint;\n    };\n\n    struct Frag {\n        Frag(SizeType s, SizeType o, SizeType m) : start(s), out(o), minIndex(m) {}\n        SizeType start;\n        SizeType out; //!< link-list of all output states\n        SizeType minIndex;\n    };\n\n    State& GetState(SizeType index) {\n        CEREAL_RAPIDJSON_ASSERT(index < stateCount_);\n        return states_.template Bottom<State>()[index];\n    }\n\n    const State& GetState(SizeType index) const {\n        CEREAL_RAPIDJSON_ASSERT(index < stateCount_);\n        return states_.template Bottom<State>()[index];\n    }\n\n    Range& GetRange(SizeType index) {\n        CEREAL_RAPIDJSON_ASSERT(index < rangeCount_);\n        return ranges_.template Bottom<Range>()[index];\n    }\n\n    const Range& GetRange(SizeType index) const {\n        CEREAL_RAPIDJSON_ASSERT(index < rangeCount_);\n        return ranges_.template Bottom<Range>()[index];\n    }\n\n    template <typename InputStream>\n    void Parse(DecodedStream<InputStream, Encoding>& ds) {\n        Stack<Allocator> operandStack(allocator_, 256);    // Frag\n        Stack<Allocator> operatorStack(allocator_, 256);   // Operator\n        Stack<Allocator> atomCountStack(allocator_, 256);  // unsigned (Atom per parenthesis)\n\n        *atomCountStack.template Push<unsigned>() = 0;\n\n        unsigned codepoint;\n        while (ds.Peek() != 0) {\n            switch (codepoint = ds.Take()) {\n                case '^':\n                    anchorBegin_ = true;\n                    break;\n\n                case '$':\n                    anchorEnd_ = true;\n                    break;\n\n                case '|':\n                    while (!operatorStack.Empty() && *operatorStack.template Top<Operator>() < kAlternation)\n                        if (!Eval(operandStack, *operatorStack.template Pop<Operator>(1)))\n                            return;\n                    *operatorStack.template Push<Operator>() = kAlternation;\n                    *atomCountStack.template Top<unsigned>() = 0;\n                    break;\n\n                case '(':\n                    *operatorStack.template Push<Operator>() = kLeftParenthesis;\n                    *atomCountStack.template Push<unsigned>() = 0;\n                    break;\n\n                case ')':\n                    while (!operatorStack.Empty() && *operatorStack.template Top<Operator>() != kLeftParenthesis)\n                        if (!Eval(operandStack, *operatorStack.template Pop<Operator>(1)))\n                            return;\n                    if (operatorStack.Empty())\n                        return;\n                    operatorStack.template Pop<Operator>(1);\n                    atomCountStack.template Pop<unsigned>(1);\n                    ImplicitConcatenation(atomCountStack, operatorStack);\n                    break;\n\n                case '?':\n                    if (!Eval(operandStack, kZeroOrOne))\n                        return;\n                    break;\n\n                case '*':\n                    if (!Eval(operandStack, kZeroOrMore))\n                        return;\n                    break;\n\n                case '+':\n                    if (!Eval(operandStack, kOneOrMore))\n                        return;\n                    break;\n\n                case '{':\n                    {\n                        unsigned n, m;\n                        if (!ParseUnsigned(ds, &n))\n                            return;\n\n                        if (ds.Peek() == ',') {\n                            ds.Take();\n                            if (ds.Peek() == '}')\n                                m = kInfinityQuantifier;\n                            else if (!ParseUnsigned(ds, &m) || m < n)\n                                return;\n                        }\n                        else\n                            m = n;\n\n                        if (!EvalQuantifier(operandStack, n, m) || ds.Peek() != '}')\n                            return;\n                        ds.Take();\n                    }\n                    break;\n\n                case '.':\n                    PushOperand(operandStack, kAnyCharacterClass);\n                    ImplicitConcatenation(atomCountStack, operatorStack);\n                    break;\n\n                case '[':\n                    {\n                        SizeType range;\n                        if (!ParseRange(ds, &range))\n                            return;\n                        SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, kRangeCharacterClass);\n                        GetState(s).rangeStart = range;\n                        *operandStack.template Push<Frag>() = Frag(s, s, s);\n                    }\n                    ImplicitConcatenation(atomCountStack, operatorStack);\n                    break;\n\n                case '\\\\': // Escape character\n                    if (!CharacterEscape(ds, &codepoint))\n                        return; // Unsupported escape character\n                    // fall through to default\n\n                default: // Pattern character\n                    PushOperand(operandStack, codepoint);\n                    ImplicitConcatenation(atomCountStack, operatorStack);\n            }\n        }\n\n        while (!operatorStack.Empty())\n            if (!Eval(operandStack, *operatorStack.template Pop<Operator>(1)))\n                return;\n\n        // Link the operand to matching state.\n        if (operandStack.GetSize() == sizeof(Frag)) {\n            Frag* e = operandStack.template Pop<Frag>(1);\n            Patch(e->out, NewState(kRegexInvalidState, kRegexInvalidState, 0));\n            root_ = e->start;\n\n#if CEREAL_RAPIDJSON_REGEX_VERBOSE\n            printf(\"root: %d\\n\", root_);\n            for (SizeType i = 0; i < stateCount_ ; i++) {\n                State& s = GetState(i);\n                printf(\"[%2d] out: %2d out1: %2d c: '%c'\\n\", i, s.out, s.out1, (char)s.codepoint);\n            }\n            printf(\"\\n\");\n#endif\n        }\n    }\n\n    SizeType NewState(SizeType out, SizeType out1, unsigned codepoint) {\n        State* s = states_.template Push<State>();\n        s->out = out;\n        s->out1 = out1;\n        s->codepoint = codepoint;\n        s->rangeStart = kRegexInvalidRange;\n        return stateCount_++;\n    }\n\n    void PushOperand(Stack<Allocator>& operandStack, unsigned codepoint) {\n        SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, codepoint);\n        *operandStack.template Push<Frag>() = Frag(s, s, s);\n    }\n\n    void ImplicitConcatenation(Stack<Allocator>& atomCountStack, Stack<Allocator>& operatorStack) {\n        if (*atomCountStack.template Top<unsigned>())\n            *operatorStack.template Push<Operator>() = kConcatenation;\n        (*atomCountStack.template Top<unsigned>())++;\n    }\n\n    SizeType Append(SizeType l1, SizeType l2) {\n        SizeType old = l1;\n        while (GetState(l1).out != kRegexInvalidState)\n            l1 = GetState(l1).out;\n        GetState(l1).out = l2;\n        return old;\n    }\n\n    void Patch(SizeType l, SizeType s) {\n        for (SizeType next; l != kRegexInvalidState; l = next) {\n            next = GetState(l).out;\n            GetState(l).out = s;\n        }\n    }\n\n    bool Eval(Stack<Allocator>& operandStack, Operator op) {\n        switch (op) {\n            case kConcatenation:\n                CEREAL_RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag) * 2);\n                {\n                    Frag e2 = *operandStack.template Pop<Frag>(1);\n                    Frag e1 = *operandStack.template Pop<Frag>(1);\n                    Patch(e1.out, e2.start);\n                    *operandStack.template Push<Frag>() = Frag(e1.start, e2.out, Min(e1.minIndex, e2.minIndex));\n                }\n                return true;\n\n            case kAlternation:\n                if (operandStack.GetSize() >= sizeof(Frag) * 2) {\n                    Frag e2 = *operandStack.template Pop<Frag>(1);\n                    Frag e1 = *operandStack.template Pop<Frag>(1);\n                    SizeType s = NewState(e1.start, e2.start, 0);\n                    *operandStack.template Push<Frag>() = Frag(s, Append(e1.out, e2.out), Min(e1.minIndex, e2.minIndex));\n                    return true;\n                }\n                return false;\n\n            case kZeroOrOne:\n                if (operandStack.GetSize() >= sizeof(Frag)) {\n                    Frag e = *operandStack.template Pop<Frag>(1);\n                    SizeType s = NewState(kRegexInvalidState, e.start, 0);\n                    *operandStack.template Push<Frag>() = Frag(s, Append(e.out, s), e.minIndex);\n                    return true;\n                }\n                return false;\n\n            case kZeroOrMore:\n                if (operandStack.GetSize() >= sizeof(Frag)) {\n                    Frag e = *operandStack.template Pop<Frag>(1);\n                    SizeType s = NewState(kRegexInvalidState, e.start, 0);\n                    Patch(e.out, s);\n                    *operandStack.template Push<Frag>() = Frag(s, s, e.minIndex);\n                    return true;\n                }\n                return false;\n\n            case kOneOrMore:\n                if (operandStack.GetSize() >= sizeof(Frag)) {\n                    Frag e = *operandStack.template Pop<Frag>(1);\n                    SizeType s = NewState(kRegexInvalidState, e.start, 0);\n                    Patch(e.out, s);\n                    *operandStack.template Push<Frag>() = Frag(e.start, s, e.minIndex);\n                    return true;\n                }\n                return false;\n\n            default: \n                // syntax error (e.g. unclosed kLeftParenthesis)\n                return false;\n        }\n    }\n\n    bool EvalQuantifier(Stack<Allocator>& operandStack, unsigned n, unsigned m) {\n        CEREAL_RAPIDJSON_ASSERT(n <= m);\n        CEREAL_RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag));\n\n        if (n == 0) {\n            if (m == 0)                             // a{0} not support\n                return false;\n            else if (m == kInfinityQuantifier)\n                Eval(operandStack, kZeroOrMore);    // a{0,} -> a*\n            else {\n                Eval(operandStack, kZeroOrOne);         // a{0,5} -> a?\n                for (unsigned i = 0; i < m - 1; i++)\n                    CloneTopOperand(operandStack);      // a{0,5} -> a? a? a? a? a?\n                for (unsigned i = 0; i < m - 1; i++)\n                    Eval(operandStack, kConcatenation); // a{0,5} -> a?a?a?a?a?\n            }\n            return true;\n        }\n\n        for (unsigned i = 0; i < n - 1; i++)        // a{3} -> a a a\n            CloneTopOperand(operandStack);\n\n        if (m == kInfinityQuantifier)\n            Eval(operandStack, kOneOrMore);         // a{3,} -> a a a+\n        else if (m > n) {\n            CloneTopOperand(operandStack);          // a{3,5} -> a a a a\n            Eval(operandStack, kZeroOrOne);         // a{3,5} -> a a a a?\n            for (unsigned i = n; i < m - 1; i++)\n                CloneTopOperand(operandStack);      // a{3,5} -> a a a a? a?\n            for (unsigned i = n; i < m; i++)\n                Eval(operandStack, kConcatenation); // a{3,5} -> a a aa?a?\n        }\n\n        for (unsigned i = 0; i < n - 1; i++)\n            Eval(operandStack, kConcatenation);     // a{3} -> aaa, a{3,} -> aaa+, a{3.5} -> aaaa?a?\n\n        return true;\n    }\n\n    static SizeType Min(SizeType a, SizeType b) { return a < b ? a : b; }\n\n    void CloneTopOperand(Stack<Allocator>& operandStack) {\n        const Frag src = *operandStack.template Top<Frag>(); // Copy constructor to prevent invalidation\n        SizeType count = stateCount_ - src.minIndex; // Assumes top operand contains states in [src->minIndex, stateCount_)\n        State* s = states_.template Push<State>(count);\n        memcpy(s, &GetState(src.minIndex), count * sizeof(State));\n        for (SizeType j = 0; j < count; j++) {\n            if (s[j].out != kRegexInvalidState)\n                s[j].out += count;\n            if (s[j].out1 != kRegexInvalidState)\n                s[j].out1 += count;\n        }\n        *operandStack.template Push<Frag>() = Frag(src.start + count, src.out + count, src.minIndex + count);\n        stateCount_ += count;\n    }\n\n    template <typename InputStream>\n    bool ParseUnsigned(DecodedStream<InputStream, Encoding>& ds, unsigned* u) {\n        unsigned r = 0;\n        if (ds.Peek() < '0' || ds.Peek() > '9')\n            return false;\n        while (ds.Peek() >= '0' && ds.Peek() <= '9') {\n            if (r >= 429496729 && ds.Peek() > '5') // 2^32 - 1 = 4294967295\n                return false; // overflow\n            r = r * 10 + (ds.Take() - '0');\n        }\n        *u = r;\n        return true;\n    }\n\n    template <typename InputStream>\n    bool ParseRange(DecodedStream<InputStream, Encoding>& ds, SizeType* range) {\n        bool isBegin = true;\n        bool negate = false;\n        int step = 0;\n        SizeType start = kRegexInvalidRange;\n        SizeType current = kRegexInvalidRange;\n        unsigned codepoint;\n        while ((codepoint = ds.Take()) != 0) {\n            if (isBegin) {\n                isBegin = false;\n                if (codepoint == '^') {\n                    negate = true;\n                    continue;\n                }\n            }\n\n            switch (codepoint) {\n            case ']':\n                if (start == kRegexInvalidRange)\n                    return false;   // Error: nothing inside []\n                if (step == 2) { // Add trailing '-'\n                    SizeType r = NewRange('-');\n                    CEREAL_RAPIDJSON_ASSERT(current != kRegexInvalidRange);\n                    GetRange(current).next = r;\n                }\n                if (negate)\n                    GetRange(start).start |= kRangeNegationFlag;\n                *range = start;\n                return true;\n\n            case '\\\\':\n                if (ds.Peek() == 'b') {\n                    ds.Take();\n                    codepoint = 0x0008; // Escape backspace character\n                }\n                else if (!CharacterEscape(ds, &codepoint))\n                    return false;\n                // fall through to default\n\n            default:\n                switch (step) {\n                case 1:\n                    if (codepoint == '-') {\n                        step++;\n                        break;\n                    }\n                    // fall through to step 0 for other characters\n\n                case 0:\n                    {\n                        SizeType r = NewRange(codepoint);\n                        if (current != kRegexInvalidRange)\n                            GetRange(current).next = r;\n                        if (start == kRegexInvalidRange)\n                            start = r;\n                        current = r;\n                    }\n                    step = 1;\n                    break;\n\n                default:\n                    CEREAL_RAPIDJSON_ASSERT(step == 2);\n                    GetRange(current).end = codepoint;\n                    step = 0;\n                }\n            }\n        }\n        return false;\n    }\n    \n    SizeType NewRange(unsigned codepoint) {\n        Range* r = ranges_.template Push<Range>();\n        r->start = r->end = codepoint;\n        r->next = kRegexInvalidRange;\n        return rangeCount_++;\n    }\n\n    template <typename InputStream>\n    bool CharacterEscape(DecodedStream<InputStream, Encoding>& ds, unsigned* escapedCodepoint) {\n        unsigned codepoint;\n        switch (codepoint = ds.Take()) {\n            case '^':\n            case '$':\n            case '|':\n            case '(':\n            case ')':\n            case '?':\n            case '*':\n            case '+':\n            case '.':\n            case '[':\n            case ']':\n            case '{':\n            case '}':\n            case '\\\\':\n                *escapedCodepoint = codepoint; return true;\n            case 'f': *escapedCodepoint = 0x000C; return true;\n            case 'n': *escapedCodepoint = 0x000A; return true;\n            case 'r': *escapedCodepoint = 0x000D; return true;\n            case 't': *escapedCodepoint = 0x0009; return true;\n            case 'v': *escapedCodepoint = 0x000B; return true;\n            default:\n                return false; // Unsupported escape character\n        }\n    }\n\n    Allocator* ownAllocator_;\n    Allocator* allocator_;\n    Stack<Allocator> states_;\n    Stack<Allocator> ranges_;\n    SizeType root_;\n    SizeType stateCount_;\n    SizeType rangeCount_;\n\n    static const unsigned kInfinityQuantifier = ~0u;\n\n    // For SearchWithAnchoring()\n    bool anchorBegin_;\n    bool anchorEnd_;\n};\n\ntemplate <typename RegexType, typename Allocator = CrtAllocator>\nclass GenericRegexSearch {\npublic:\n    typedef typename RegexType::EncodingType Encoding;\n    typedef typename Encoding::Ch Ch;\n\n    GenericRegexSearch(const RegexType& regex, Allocator* allocator = 0) : \n        regex_(regex), allocator_(allocator), ownAllocator_(0),\n        state0_(allocator, 0), state1_(allocator, 0), stateSet_()\n    {\n        CEREAL_RAPIDJSON_ASSERT(regex_.IsValid());\n        if (!allocator_)\n            ownAllocator_ = allocator_ = CEREAL_RAPIDJSON_NEW(Allocator)();\n        stateSet_ = static_cast<unsigned*>(allocator_->Malloc(GetStateSetSize()));\n        state0_.template Reserve<SizeType>(regex_.stateCount_);\n        state1_.template Reserve<SizeType>(regex_.stateCount_);\n    }\n\n    ~GenericRegexSearch() {\n        Allocator::Free(stateSet_);\n        CEREAL_RAPIDJSON_DELETE(ownAllocator_);\n    }\n\n    template <typename InputStream>\n    bool Match(InputStream& is) {\n        return SearchWithAnchoring(is, true, true);\n    }\n\n    bool Match(const Ch* s) {\n        GenericStringStream<Encoding> is(s);\n        return Match(is);\n    }\n\n    template <typename InputStream>\n    bool Search(InputStream& is) {\n        return SearchWithAnchoring(is, regex_.anchorBegin_, regex_.anchorEnd_);\n    }\n\n    bool Search(const Ch* s) {\n        GenericStringStream<Encoding> is(s);\n        return Search(is);\n    }\n\nprivate:\n    typedef typename RegexType::State State;\n    typedef typename RegexType::Range Range;\n\n    template <typename InputStream>\n    bool SearchWithAnchoring(InputStream& is, bool anchorBegin, bool anchorEnd) {\n        DecodedStream<InputStream, Encoding> ds(is);\n\n        state0_.Clear();\n        Stack<Allocator> *current = &state0_, *next = &state1_;\n        const size_t stateSetSize = GetStateSetSize();\n        std::memset(stateSet_, 0, stateSetSize);\n\n        bool matched = AddState(*current, regex_.root_);\n        unsigned codepoint;\n        while (!current->Empty() && (codepoint = ds.Take()) != 0) {\n            std::memset(stateSet_, 0, stateSetSize);\n            next->Clear();\n            matched = false;\n            for (const SizeType* s = current->template Bottom<SizeType>(); s != current->template End<SizeType>(); ++s) {\n                const State& sr = regex_.GetState(*s);\n                if (sr.codepoint == codepoint ||\n                    sr.codepoint == RegexType::kAnyCharacterClass || \n                    (sr.codepoint == RegexType::kRangeCharacterClass && MatchRange(sr.rangeStart, codepoint)))\n                {\n                    matched = AddState(*next, sr.out) || matched;\n                    if (!anchorEnd && matched)\n                        return true;\n                }\n                if (!anchorBegin)\n                    AddState(*next, regex_.root_);\n            }\n            internal::Swap(current, next);\n        }\n\n        return matched;\n    }\n\n    size_t GetStateSetSize() const {\n        return (regex_.stateCount_ + 31) / 32 * 4;\n    }\n\n    // Return whether the added states is a match state\n    bool AddState(Stack<Allocator>& l, SizeType index) {\n        CEREAL_RAPIDJSON_ASSERT(index != kRegexInvalidState);\n\n        const State& s = regex_.GetState(index);\n        if (s.out1 != kRegexInvalidState) { // Split\n            bool matched = AddState(l, s.out);\n            return AddState(l, s.out1) || matched;\n        }\n        else if (!(stateSet_[index >> 5] & (1u << (index & 31)))) {\n            stateSet_[index >> 5] |= (1u << (index & 31));\n            *l.template PushUnsafe<SizeType>() = index;\n        }\n        return s.out == kRegexInvalidState; // by using PushUnsafe() above, we can ensure s is not validated due to reallocation.\n    }\n\n    bool MatchRange(SizeType rangeIndex, unsigned codepoint) const {\n        bool yes = (regex_.GetRange(rangeIndex).start & RegexType::kRangeNegationFlag) == 0;\n        while (rangeIndex != kRegexInvalidRange) {\n            const Range& r = regex_.GetRange(rangeIndex);\n            if (codepoint >= (r.start & ~RegexType::kRangeNegationFlag) && codepoint <= r.end)\n                return yes;\n            rangeIndex = r.next;\n        }\n        return !yes;\n    }\n\n    const RegexType& regex_;\n    Allocator* allocator_;\n    Allocator* ownAllocator_;\n    Stack<Allocator> state0_;\n    Stack<Allocator> state1_;\n    uint32_t* stateSet_;\n};\n\ntypedef GenericRegex<UTF8<> > Regex;\ntypedef GenericRegexSearch<Regex> RegexSearch;\n\n} // namespace internal\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#ifdef __GNUC__\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#if defined(__clang__) || defined(_MSC_VER)\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#endif // CEREAL_RAPIDJSON_INTERNAL_REGEX_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/internal/stack.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_INTERNAL_STACK_H_\n#define CEREAL_RAPIDJSON_INTERNAL_STACK_H_\n\n#include \"../allocators.h\"\n#include \"swap.h\"\n#include <cstddef>\n\n#if defined(__clang__)\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(c++98-compat)\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\nnamespace internal {\n\n///////////////////////////////////////////////////////////////////////////////\n// Stack\n\n//! A type-unsafe stack for storing different types of data.\n/*! \\tparam Allocator Allocator for allocating stack memory.\n*/\ntemplate <typename Allocator>\nclass Stack {\npublic:\n    // Optimization note: Do not allocate memory for stack_ in constructor.\n    // Do it lazily when first Push() -> Expand() -> Resize().\n    Stack(Allocator* allocator, size_t stackCapacity) : allocator_(allocator), ownAllocator_(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) {\n    }\n\n#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n    Stack(Stack&& rhs)\n        : allocator_(rhs.allocator_),\n          ownAllocator_(rhs.ownAllocator_),\n          stack_(rhs.stack_),\n          stackTop_(rhs.stackTop_),\n          stackEnd_(rhs.stackEnd_),\n          initialCapacity_(rhs.initialCapacity_)\n    {\n        rhs.allocator_ = 0;\n        rhs.ownAllocator_ = 0;\n        rhs.stack_ = 0;\n        rhs.stackTop_ = 0;\n        rhs.stackEnd_ = 0;\n        rhs.initialCapacity_ = 0;\n    }\n#endif\n\n    ~Stack() {\n        Destroy();\n    }\n\n#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n    Stack& operator=(Stack&& rhs) {\n        if (&rhs != this)\n        {\n            Destroy();\n\n            allocator_ = rhs.allocator_;\n            ownAllocator_ = rhs.ownAllocator_;\n            stack_ = rhs.stack_;\n            stackTop_ = rhs.stackTop_;\n            stackEnd_ = rhs.stackEnd_;\n            initialCapacity_ = rhs.initialCapacity_;\n\n            rhs.allocator_ = 0;\n            rhs.ownAllocator_ = 0;\n            rhs.stack_ = 0;\n            rhs.stackTop_ = 0;\n            rhs.stackEnd_ = 0;\n            rhs.initialCapacity_ = 0;\n        }\n        return *this;\n    }\n#endif\n\n    void Swap(Stack& rhs) CEREAL_RAPIDJSON_NOEXCEPT {\n        internal::Swap(allocator_, rhs.allocator_);\n        internal::Swap(ownAllocator_, rhs.ownAllocator_);\n        internal::Swap(stack_, rhs.stack_);\n        internal::Swap(stackTop_, rhs.stackTop_);\n        internal::Swap(stackEnd_, rhs.stackEnd_);\n        internal::Swap(initialCapacity_, rhs.initialCapacity_);\n    }\n\n    void Clear() { stackTop_ = stack_; }\n\n    void ShrinkToFit() { \n        if (Empty()) {\n            // If the stack is empty, completely deallocate the memory.\n            Allocator::Free(stack_); // NOLINT (+clang-analyzer-unix.Malloc)\n            stack_ = 0;\n            stackTop_ = 0;\n            stackEnd_ = 0;\n        }\n        else\n            Resize(GetSize());\n    }\n\n    // Optimization note: try to minimize the size of this function for force inline.\n    // Expansion is run very infrequently, so it is moved to another (probably non-inline) function.\n    template<typename T>\n    CEREAL_RAPIDJSON_FORCEINLINE void Reserve(size_t count = 1) {\n         // Expand the stack if needed\n        if (CEREAL_RAPIDJSON_UNLIKELY(static_cast<std::ptrdiff_t>(sizeof(T) * count) > (stackEnd_ - stackTop_)))\n            Expand<T>(count);\n    }\n\n    template<typename T>\n    CEREAL_RAPIDJSON_FORCEINLINE T* Push(size_t count = 1) {\n        Reserve<T>(count);\n        return PushUnsafe<T>(count);\n    }\n\n    template<typename T>\n    CEREAL_RAPIDJSON_FORCEINLINE T* PushUnsafe(size_t count = 1) {\n        CEREAL_RAPIDJSON_ASSERT(stackTop_);\n        CEREAL_RAPIDJSON_ASSERT(static_cast<std::ptrdiff_t>(sizeof(T) * count) <= (stackEnd_ - stackTop_));\n        T* ret = reinterpret_cast<T*>(stackTop_);\n        stackTop_ += sizeof(T) * count;\n        return ret;\n    }\n\n    template<typename T>\n    T* Pop(size_t count) {\n        CEREAL_RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T));\n        stackTop_ -= count * sizeof(T);\n        return reinterpret_cast<T*>(stackTop_);\n    }\n\n    template<typename T>\n    T* Top() { \n        CEREAL_RAPIDJSON_ASSERT(GetSize() >= sizeof(T));\n        return reinterpret_cast<T*>(stackTop_ - sizeof(T));\n    }\n\n    template<typename T>\n    const T* Top() const {\n        CEREAL_RAPIDJSON_ASSERT(GetSize() >= sizeof(T));\n        return reinterpret_cast<T*>(stackTop_ - sizeof(T));\n    }\n\n    template<typename T>\n    T* End() { return reinterpret_cast<T*>(stackTop_); }\n\n    template<typename T>\n    const T* End() const { return reinterpret_cast<T*>(stackTop_); }\n\n    template<typename T>\n    T* Bottom() { return reinterpret_cast<T*>(stack_); }\n\n    template<typename T>\n    const T* Bottom() const { return reinterpret_cast<T*>(stack_); }\n\n    bool HasAllocator() const {\n        return allocator_ != 0;\n    }\n\n    Allocator& GetAllocator() {\n        CEREAL_RAPIDJSON_ASSERT(allocator_);\n        return *allocator_;\n    }\n\n    bool Empty() const { return stackTop_ == stack_; }\n    size_t GetSize() const { return static_cast<size_t>(stackTop_ - stack_); }\n    size_t GetCapacity() const { return static_cast<size_t>(stackEnd_ - stack_); }\n\nprivate:\n    template<typename T>\n    void Expand(size_t count) {\n        // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity.\n        size_t newCapacity;\n        if (stack_ == 0) {\n            if (!allocator_)\n                ownAllocator_ = allocator_ = CEREAL_RAPIDJSON_NEW(Allocator)();\n            newCapacity = initialCapacity_;\n        } else {\n            newCapacity = GetCapacity();\n            newCapacity += (newCapacity + 1) / 2;\n        }\n        size_t newSize = GetSize() + sizeof(T) * count;\n        if (newCapacity < newSize)\n            newCapacity = newSize;\n\n        Resize(newCapacity);\n    }\n\n    void Resize(size_t newCapacity) {\n        const size_t size = GetSize();  // Backup the current size\n        stack_ = static_cast<char*>(allocator_->Realloc(stack_, GetCapacity(), newCapacity));\n        stackTop_ = stack_ + size;\n        stackEnd_ = stack_ + newCapacity;\n    }\n\n    void Destroy() {\n        Allocator::Free(stack_);\n        CEREAL_RAPIDJSON_DELETE(ownAllocator_); // Only delete if it is owned by the stack\n    }\n\n    // Prohibit copy constructor & assignment operator.\n    Stack(const Stack&);\n    Stack& operator=(const Stack&);\n\n    Allocator* allocator_;\n    Allocator* ownAllocator_;\n    char *stack_;\n    char *stackTop_;\n    char *stackEnd_;\n    size_t initialCapacity_;\n};\n\n} // namespace internal\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#if defined(__clang__)\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#endif // CEREAL_RAPIDJSON_STACK_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/internal/strfunc.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_INTERNAL_STRFUNC_H_\n#define CEREAL_RAPIDJSON_INTERNAL_STRFUNC_H_\n\n#include \"../stream.h\"\n#include <cwchar>\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\nnamespace internal {\n\n//! Custom strlen() which works on different character types.\n/*! \\tparam Ch Character type (e.g. char, wchar_t, short)\n    \\param s Null-terminated input string.\n    \\return Number of characters in the string. \n    \\note This has the same semantics as strlen(), the return value is not number of Unicode codepoints.\n*/\ntemplate <typename Ch>\ninline SizeType StrLen(const Ch* s) {\n    CEREAL_RAPIDJSON_ASSERT(s != 0);\n    const Ch* p = s;\n    while (*p) ++p;\n    return SizeType(p - s);\n}\n\ntemplate <>\ninline SizeType StrLen(const char* s) {\n    return SizeType(std::strlen(s));\n}\n\ntemplate <>\ninline SizeType StrLen(const wchar_t* s) {\n    return SizeType(std::wcslen(s));\n}\n\n//! Returns number of code points in a encoded string.\ntemplate<typename Encoding>\nbool CountStringCodePoint(const typename Encoding::Ch* s, SizeType length, SizeType* outCount) {\n    CEREAL_RAPIDJSON_ASSERT(s != 0);\n    CEREAL_RAPIDJSON_ASSERT(outCount != 0);\n    GenericStringStream<Encoding> is(s);\n    const typename Encoding::Ch* end = s + length;\n    SizeType count = 0;\n    while (is.src_ < end) {\n        unsigned codepoint;\n        if (!Encoding::Decode(is, &codepoint))\n            return false;\n        count++;\n    }\n    *outCount = count;\n    return true;\n}\n\n} // namespace internal\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#endif // CEREAL_RAPIDJSON_INTERNAL_STRFUNC_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/internal/strtod.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_STRTOD_\n#define CEREAL_RAPIDJSON_STRTOD_\n\n#include \"ieee754.h\"\n#include \"biginteger.h\"\n#include \"diyfp.h\"\n#include \"pow10.h\"\n#include <climits>\n#include <limits>\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\nnamespace internal {\n\ninline double FastPath(double significand, int exp) {\n    if (exp < -308)\n        return 0.0;\n    else if (exp >= 0)\n        return significand * internal::Pow10(exp);\n    else\n        return significand / internal::Pow10(-exp);\n}\n\ninline double StrtodNormalPrecision(double d, int p) {\n    if (p < -308) {\n        // Prevent expSum < -308, making Pow10(p) = 0\n        d = FastPath(d, -308);\n        d = FastPath(d, p + 308);\n    }\n    else\n        d = FastPath(d, p);\n    return d;\n}\n\ntemplate <typename T>\ninline T Min3(T a, T b, T c) {\n    T m = a;\n    if (m > b) m = b;\n    if (m > c) m = c;\n    return m;\n}\n\ninline int CheckWithinHalfULP(double b, const BigInteger& d, int dExp) {\n    const Double db(b);\n    const uint64_t bInt = db.IntegerSignificand();\n    const int bExp = db.IntegerExponent();\n    const int hExp = bExp - 1;\n\n    int dS_Exp2 = 0, dS_Exp5 = 0, bS_Exp2 = 0, bS_Exp5 = 0, hS_Exp2 = 0, hS_Exp5 = 0;\n\n    // Adjust for decimal exponent\n    if (dExp >= 0) {\n        dS_Exp2 += dExp;\n        dS_Exp5 += dExp;\n    }\n    else {\n        bS_Exp2 -= dExp;\n        bS_Exp5 -= dExp;\n        hS_Exp2 -= dExp;\n        hS_Exp5 -= dExp;\n    }\n\n    // Adjust for binary exponent\n    if (bExp >= 0)\n        bS_Exp2 += bExp;\n    else {\n        dS_Exp2 -= bExp;\n        hS_Exp2 -= bExp;\n    }\n\n    // Adjust for half ulp exponent\n    if (hExp >= 0)\n        hS_Exp2 += hExp;\n    else {\n        dS_Exp2 -= hExp;\n        bS_Exp2 -= hExp;\n    }\n\n    // Remove common power of two factor from all three scaled values\n    int common_Exp2 = Min3(dS_Exp2, bS_Exp2, hS_Exp2);\n    dS_Exp2 -= common_Exp2;\n    bS_Exp2 -= common_Exp2;\n    hS_Exp2 -= common_Exp2;\n\n    BigInteger dS = d;\n    dS.MultiplyPow5(static_cast<unsigned>(dS_Exp5)) <<= static_cast<unsigned>(dS_Exp2);\n\n    BigInteger bS(bInt);\n    bS.MultiplyPow5(static_cast<unsigned>(bS_Exp5)) <<= static_cast<unsigned>(bS_Exp2);\n\n    BigInteger hS(1);\n    hS.MultiplyPow5(static_cast<unsigned>(hS_Exp5)) <<= static_cast<unsigned>(hS_Exp2);\n\n    BigInteger delta(0);\n    dS.Difference(bS, &delta);\n\n    return delta.Compare(hS);\n}\n\ninline bool StrtodFast(double d, int p, double* result) {\n    // Use fast path for string-to-double conversion if possible\n    // see http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/\n    if (p > 22  && p < 22 + 16) {\n        // Fast Path Cases In Disguise\n        d *= internal::Pow10(p - 22);\n        p = 22;\n    }\n\n    if (p >= -22 && p <= 22 && d <= 9007199254740991.0) { // 2^53 - 1\n        *result = FastPath(d, p);\n        return true;\n    }\n    else\n        return false;\n}\n\n// Compute an approximation and see if it is within 1/2 ULP\ninline bool StrtodDiyFp(const char* decimals, int dLen, int dExp, double* result) {\n    uint64_t significand = 0;\n    int i = 0;   // 2^64 - 1 = 18446744073709551615, 1844674407370955161 = 0x1999999999999999    \n    for (; i < dLen; i++) {\n        if (significand  >  CEREAL_RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) ||\n            (significand == CEREAL_RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) && decimals[i] > '5'))\n            break;\n        significand = significand * 10u + static_cast<unsigned>(decimals[i] - '0');\n    }\n    \n    if (i < dLen && decimals[i] >= '5') // Rounding\n        significand++;\n\n    int remaining = dLen - i;\n    const int kUlpShift = 3;\n    const int kUlp = 1 << kUlpShift;\n    int64_t error = (remaining == 0) ? 0 : kUlp / 2;\n\n    DiyFp v(significand, 0);\n    v = v.Normalize();\n    error <<= -v.e;\n\n    dExp += remaining;\n\n    int actualExp;\n    DiyFp cachedPower = GetCachedPower10(dExp, &actualExp);\n    if (actualExp != dExp) {\n        static const DiyFp kPow10[] = {\n            DiyFp(CEREAL_RAPIDJSON_UINT64_C2(0xa0000000, 0x00000000), -60),  // 10^1\n            DiyFp(CEREAL_RAPIDJSON_UINT64_C2(0xc8000000, 0x00000000), -57),  // 10^2\n            DiyFp(CEREAL_RAPIDJSON_UINT64_C2(0xfa000000, 0x00000000), -54),  // 10^3\n            DiyFp(CEREAL_RAPIDJSON_UINT64_C2(0x9c400000, 0x00000000), -50),  // 10^4\n            DiyFp(CEREAL_RAPIDJSON_UINT64_C2(0xc3500000, 0x00000000), -47),  // 10^5\n            DiyFp(CEREAL_RAPIDJSON_UINT64_C2(0xf4240000, 0x00000000), -44),  // 10^6\n            DiyFp(CEREAL_RAPIDJSON_UINT64_C2(0x98968000, 0x00000000), -40)   // 10^7\n        };\n        int adjustment = dExp - actualExp;\n        CEREAL_RAPIDJSON_ASSERT(adjustment >= 1 && adjustment < 8);\n        v = v * kPow10[adjustment - 1];\n        if (dLen + adjustment > 19) // has more digits than decimal digits in 64-bit\n            error += kUlp / 2;\n    }\n\n    v = v * cachedPower;\n\n    error += kUlp + (error == 0 ? 0 : 1);\n\n    const int oldExp = v.e;\n    v = v.Normalize();\n    error <<= oldExp - v.e;\n\n    const int effectiveSignificandSize = Double::EffectiveSignificandSize(64 + v.e);\n    int precisionSize = 64 - effectiveSignificandSize;\n    if (precisionSize + kUlpShift >= 64) {\n        int scaleExp = (precisionSize + kUlpShift) - 63;\n        v.f >>= scaleExp;\n        v.e += scaleExp; \n        error = (error >> scaleExp) + 1 + kUlp;\n        precisionSize -= scaleExp;\n    }\n\n    DiyFp rounded(v.f >> precisionSize, v.e + precisionSize);\n    const uint64_t precisionBits = (v.f & ((uint64_t(1) << precisionSize) - 1)) * kUlp;\n    const uint64_t halfWay = (uint64_t(1) << (precisionSize - 1)) * kUlp;\n    if (precisionBits >= halfWay + static_cast<unsigned>(error)) {\n        rounded.f++;\n        if (rounded.f & (DiyFp::kDpHiddenBit << 1)) { // rounding overflows mantissa (issue #340)\n            rounded.f >>= 1;\n            rounded.e++;\n        }\n    }\n\n    *result = rounded.ToDouble();\n\n    return halfWay - static_cast<unsigned>(error) >= precisionBits || precisionBits >= halfWay + static_cast<unsigned>(error);\n}\n\ninline double StrtodBigInteger(double approx, const char* decimals, int dLen, int dExp) {\n    CEREAL_RAPIDJSON_ASSERT(dLen >= 0);\n    const BigInteger dInt(decimals, static_cast<unsigned>(dLen));\n    Double a(approx);\n    int cmp = CheckWithinHalfULP(a.Value(), dInt, dExp);\n    if (cmp < 0)\n        return a.Value();  // within half ULP\n    else if (cmp == 0) {\n        // Round towards even\n        if (a.Significand() & 1)\n            return a.NextPositiveDouble();\n        else\n            return a.Value();\n    }\n    else // adjustment\n        return a.NextPositiveDouble();\n}\n\ninline double StrtodFullPrecision(double d, int p, const char* decimals, size_t length, size_t decimalPosition, int exp) {\n    CEREAL_RAPIDJSON_ASSERT(d >= 0.0);\n    CEREAL_RAPIDJSON_ASSERT(length >= 1);\n\n    double result = 0.0;\n    if (StrtodFast(d, p, &result))\n        return result;\n\n    CEREAL_RAPIDJSON_ASSERT(length <= INT_MAX);\n    int dLen = static_cast<int>(length);\n\n    CEREAL_RAPIDJSON_ASSERT(length >= decimalPosition);\n    CEREAL_RAPIDJSON_ASSERT(length - decimalPosition <= INT_MAX);\n    int dExpAdjust = static_cast<int>(length - decimalPosition);\n\n    CEREAL_RAPIDJSON_ASSERT(exp >= INT_MIN + dExpAdjust);\n    int dExp = exp - dExpAdjust;\n\n    // Make sure length+dExp does not overflow\n    CEREAL_RAPIDJSON_ASSERT(dExp <= INT_MAX - dLen);\n\n    // Trim leading zeros\n    while (dLen > 0 && *decimals == '0') {\n        dLen--;\n        decimals++;\n    }\n\n    // Trim trailing zeros\n    while (dLen > 0 && decimals[dLen - 1] == '0') {\n        dLen--;\n        dExp++;\n    }\n\n    if (dLen == 0) { // Buffer only contains zeros.\n        return 0.0;\n    }\n\n    // Trim right-most digits\n    const int kMaxDecimalDigit = 767 + 1;\n    if (dLen > kMaxDecimalDigit) {\n        dExp += dLen - kMaxDecimalDigit;\n        dLen = kMaxDecimalDigit;\n    }\n\n    // If too small, underflow to zero.\n    // Any x <= 10^-324 is interpreted as zero.\n    if (dLen + dExp <= -324)\n        return 0.0;\n\n    // If too large, overflow to infinity.\n    // Any x >= 10^309 is interpreted as +infinity.\n    if (dLen + dExp > 309)\n        return std::numeric_limits<double>::infinity();\n\n    if (StrtodDiyFp(decimals, dLen, dExp, &result))\n        return result;\n\n    // Use approximation from StrtodDiyFp and make adjustment with BigInteger comparison\n    return StrtodBigInteger(result, decimals, dLen, dExp);\n}\n\n} // namespace internal\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#endif // CEREAL_RAPIDJSON_STRTOD_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/internal/swap.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n//\n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed\n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n// CONDITIONS OF ANY KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_INTERNAL_SWAP_H_\n#define CEREAL_RAPIDJSON_INTERNAL_SWAP_H_\n\n#include \"../rapidjson.h\"\n\n#if defined(__clang__)\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(c++98-compat)\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\nnamespace internal {\n\n//! Custom swap() to avoid dependency on C++ <algorithm> header\n/*! \\tparam T Type of the arguments to swap, should be instantiated with primitive C++ types only.\n    \\note This has the same semantics as std::swap().\n*/\ntemplate <typename T>\ninline void Swap(T& a, T& b) CEREAL_RAPIDJSON_NOEXCEPT {\n    T tmp = a;\n        a = b;\n        b = tmp;\n}\n\n} // namespace internal\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#if defined(__clang__)\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#endif // CEREAL_RAPIDJSON_INTERNAL_SWAP_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/istreamwrapper.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_ISTREAMWRAPPER_H_\n#define CEREAL_RAPIDJSON_ISTREAMWRAPPER_H_\n\n#include \"stream.h\"\n#include <iosfwd>\n#include <ios>\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(padded)\n#elif defined(_MSC_VER)\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(4351) // new behavior: elements of array 'array' will be default initialized\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n//! Wrapper of \\c std::basic_istream into RapidJSON's Stream concept.\n/*!\n    The classes can be wrapped including but not limited to:\n\n    - \\c std::istringstream\n    - \\c std::stringstream\n    - \\c std::wistringstream\n    - \\c std::wstringstream\n    - \\c std::ifstream\n    - \\c std::fstream\n    - \\c std::wifstream\n    - \\c std::wfstream\n\n    \\tparam StreamType Class derived from \\c std::basic_istream.\n*/\n   \ntemplate <typename StreamType>\nclass BasicIStreamWrapper {\npublic:\n    typedef typename StreamType::char_type Ch;\n\n    //! Constructor.\n    /*!\n        \\param stream stream opened for read.\n    */\n    BasicIStreamWrapper(StreamType &stream) : stream_(stream), buffer_(peekBuffer_), bufferSize_(4), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { \n        Read();\n    }\n\n    //! Constructor.\n    /*!\n        \\param stream stream opened for read.\n        \\param buffer user-supplied buffer.\n        \\param bufferSize size of buffer in bytes. Must >=4 bytes.\n    */\n    BasicIStreamWrapper(StreamType &stream, char* buffer, size_t bufferSize) : stream_(stream), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { \n        CEREAL_RAPIDJSON_ASSERT(bufferSize >= 4);\n        Read();\n    }\n\n    Ch Peek() const { return *current_; }\n    Ch Take() { Ch c = *current_; Read(); return c; }\n    size_t Tell() const { return count_ + static_cast<size_t>(current_ - buffer_); }\n\n    // Not implemented\n    void Put(Ch) { CEREAL_RAPIDJSON_ASSERT(false); }\n    void Flush() { CEREAL_RAPIDJSON_ASSERT(false); } \n    Ch* PutBegin() { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n    size_t PutEnd(Ch*) { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n\n    // For encoding detection only.\n    const Ch* Peek4() const {\n        return (current_ + 4 - !eof_ <= bufferLast_) ? current_ : 0;\n    }\n\nprivate:\n    BasicIStreamWrapper();\n    BasicIStreamWrapper(const BasicIStreamWrapper&);\n    BasicIStreamWrapper& operator=(const BasicIStreamWrapper&);\n\n    void Read() {\n        if (current_ < bufferLast_)\n            ++current_;\n        else if (!eof_) {\n            count_ += readCount_;\n            readCount_ = bufferSize_;\n            bufferLast_ = buffer_ + readCount_ - 1;\n            current_ = buffer_;\n\n            if (!stream_.read(buffer_, static_cast<std::streamsize>(bufferSize_))) {\n                readCount_ = static_cast<size_t>(stream_.gcount());\n                *(bufferLast_ = buffer_ + readCount_) = '\\0';\n                eof_ = true;\n            }\n        }\n    }\n\n    StreamType &stream_;\n    Ch peekBuffer_[4], *buffer_;\n    size_t bufferSize_;\n    Ch *bufferLast_;\n    Ch *current_;\n    size_t readCount_;\n    size_t count_;  //!< Number of characters read\n    bool eof_;\n};\n\ntypedef BasicIStreamWrapper<std::istream> IStreamWrapper;\ntypedef BasicIStreamWrapper<std::wistream> WIStreamWrapper;\n\n#if defined(__clang__) || defined(_MSC_VER)\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#endif // CEREAL_RAPIDJSON_ISTREAMWRAPPER_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/memorybuffer.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_MEMORYBUFFER_H_\n#define CEREAL_RAPIDJSON_MEMORYBUFFER_H_\n\n#include \"stream.h\"\n#include \"internal/stack.h\"\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n//! Represents an in-memory output byte stream.\n/*!\n    This class is mainly for being wrapped by EncodedOutputStream or AutoUTFOutputStream.\n\n    It is similar to FileWriteBuffer but the destination is an in-memory buffer instead of a file.\n\n    Differences between MemoryBuffer and StringBuffer:\n    1. StringBuffer has Encoding but MemoryBuffer is only a byte buffer. \n    2. StringBuffer::GetString() returns a null-terminated string. MemoryBuffer::GetBuffer() returns a buffer without terminator.\n\n    \\tparam Allocator type for allocating memory buffer.\n    \\note implements Stream concept\n*/\ntemplate <typename Allocator = CrtAllocator>\nstruct GenericMemoryBuffer {\n    typedef char Ch; // byte\n\n    GenericMemoryBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {}\n\n    void Put(Ch c) { *stack_.template Push<Ch>() = c; }\n    void Flush() {}\n\n    void Clear() { stack_.Clear(); }\n    void ShrinkToFit() { stack_.ShrinkToFit(); }\n    Ch* Push(size_t count) { return stack_.template Push<Ch>(count); }\n    void Pop(size_t count) { stack_.template Pop<Ch>(count); }\n\n    const Ch* GetBuffer() const {\n        return stack_.template Bottom<Ch>();\n    }\n\n    size_t GetSize() const { return stack_.GetSize(); }\n\n    static const size_t kDefaultCapacity = 256;\n    mutable internal::Stack<Allocator> stack_;\n};\n\ntypedef GenericMemoryBuffer<> MemoryBuffer;\n\n//! Implement specialized version of PutN() with memset() for better performance.\ntemplate<>\ninline void PutN(MemoryBuffer& memoryBuffer, char c, size_t n) {\n    std::memset(memoryBuffer.stack_.Push<char>(n), c, n * sizeof(c));\n}\n\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#endif // CEREAL_RAPIDJSON_MEMORYBUFFER_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/memorystream.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_MEMORYSTREAM_H_\n#define CEREAL_RAPIDJSON_MEMORYSTREAM_H_\n\n#include \"stream.h\"\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(unreachable-code)\nCEREAL_RAPIDJSON_DIAG_OFF(missing-noreturn)\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n//! Represents an in-memory input byte stream.\n/*!\n    This class is mainly for being wrapped by EncodedInputStream or AutoUTFInputStream.\n\n    It is similar to FileReadBuffer but the source is an in-memory buffer instead of a file.\n\n    Differences between MemoryStream and StringStream:\n    1. StringStream has encoding but MemoryStream is a byte stream.\n    2. MemoryStream needs size of the source buffer and the buffer don't need to be null terminated. StringStream assume null-terminated string as source.\n    3. MemoryStream supports Peek4() for encoding detection. StringStream is specified with an encoding so it should not have Peek4().\n    \\note implements Stream concept\n*/\nstruct MemoryStream {\n    typedef char Ch; // byte\n\n    MemoryStream(const Ch *src, size_t size) : src_(src), begin_(src), end_(src + size), size_(size) {}\n\n    Ch Peek() const { return CEREAL_RAPIDJSON_UNLIKELY(src_ == end_) ? '\\0' : *src_; }\n    Ch Take() { return CEREAL_RAPIDJSON_UNLIKELY(src_ == end_) ? '\\0' : *src_++; }\n    size_t Tell() const { return static_cast<size_t>(src_ - begin_); }\n\n    Ch* PutBegin() { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n    void Put(Ch) { CEREAL_RAPIDJSON_ASSERT(false); }\n    void Flush() { CEREAL_RAPIDJSON_ASSERT(false); }\n    size_t PutEnd(Ch*) { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n\n    // For encoding detection only.\n    const Ch* Peek4() const {\n        return Tell() + 4 <= size_ ? src_ : 0;\n    }\n\n    const Ch* src_;     //!< Current read position.\n    const Ch* begin_;   //!< Original head of the string.\n    const Ch* end_;     //!< End of stream.\n    size_t size_;       //!< Size of the stream.\n};\n\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#endif // CEREAL_RAPIDJSON_MEMORYBUFFER_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/msinttypes/inttypes.h",
    "content": "// ISO C9x  compliant inttypes.h for Microsoft Visual Studio\n// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 \n// \n//  Copyright (c) 2006-2013 Alexander Chemeris\n// \n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n// \n//   1. Redistributions of source code must retain the above copyright notice,\n//      this list of conditions and the following disclaimer.\n// \n//   2. Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n// \n//   3. Neither the name of the product nor the names of its contributors may\n//      be used to endorse or promote products derived from this software\n//      without specific prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, \n// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n// \n///////////////////////////////////////////////////////////////////////////////\n\n// The above software in this distribution may have been modified by \n// THL A29 Limited (\"Tencent Modifications\"). \n// All Tencent Modifications are Copyright (C) 2015 THL A29 Limited.\n\n#ifndef _MSC_VER // [\n#error \"Use this header only with Microsoft Visual C++ compilers!\"\n#endif // _MSC_VER ]\n\n#ifndef _MSC_INTTYPES_H_ // [\n#define _MSC_INTTYPES_H_\n\n#if _MSC_VER > 1000\n#pragma once\n#endif\n\n#include \"stdint.h\"\n\n// miloyip: VC supports inttypes.h since VC2013\n#if _MSC_VER >= 1800\n#include <inttypes.h>\n#else\n\n// 7.8 Format conversion of integer types\n\ntypedef struct {\n   intmax_t quot;\n   intmax_t rem;\n} imaxdiv_t;\n\n// 7.8.1 Macros for format specifiers\n\n#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [   See footnote 185 at page 198\n\n// The fprintf macros for signed integers are:\n#define PRId8       \"d\"\n#define PRIi8       \"i\"\n#define PRIdLEAST8  \"d\"\n#define PRIiLEAST8  \"i\"\n#define PRIdFAST8   \"d\"\n#define PRIiFAST8   \"i\"\n\n#define PRId16       \"hd\"\n#define PRIi16       \"hi\"\n#define PRIdLEAST16  \"hd\"\n#define PRIiLEAST16  \"hi\"\n#define PRIdFAST16   \"hd\"\n#define PRIiFAST16   \"hi\"\n\n#define PRId32       \"I32d\"\n#define PRIi32       \"I32i\"\n#define PRIdLEAST32  \"I32d\"\n#define PRIiLEAST32  \"I32i\"\n#define PRIdFAST32   \"I32d\"\n#define PRIiFAST32   \"I32i\"\n\n#define PRId64       \"I64d\"\n#define PRIi64       \"I64i\"\n#define PRIdLEAST64  \"I64d\"\n#define PRIiLEAST64  \"I64i\"\n#define PRIdFAST64   \"I64d\"\n#define PRIiFAST64   \"I64i\"\n\n#define PRIdMAX     \"I64d\"\n#define PRIiMAX     \"I64i\"\n\n#define PRIdPTR     \"Id\"\n#define PRIiPTR     \"Ii\"\n\n// The fprintf macros for unsigned integers are:\n#define PRIo8       \"o\"\n#define PRIu8       \"u\"\n#define PRIx8       \"x\"\n#define PRIX8       \"X\"\n#define PRIoLEAST8  \"o\"\n#define PRIuLEAST8  \"u\"\n#define PRIxLEAST8  \"x\"\n#define PRIXLEAST8  \"X\"\n#define PRIoFAST8   \"o\"\n#define PRIuFAST8   \"u\"\n#define PRIxFAST8   \"x\"\n#define PRIXFAST8   \"X\"\n\n#define PRIo16       \"ho\"\n#define PRIu16       \"hu\"\n#define PRIx16       \"hx\"\n#define PRIX16       \"hX\"\n#define PRIoLEAST16  \"ho\"\n#define PRIuLEAST16  \"hu\"\n#define PRIxLEAST16  \"hx\"\n#define PRIXLEAST16  \"hX\"\n#define PRIoFAST16   \"ho\"\n#define PRIuFAST16   \"hu\"\n#define PRIxFAST16   \"hx\"\n#define PRIXFAST16   \"hX\"\n\n#define PRIo32       \"I32o\"\n#define PRIu32       \"I32u\"\n#define PRIx32       \"I32x\"\n#define PRIX32       \"I32X\"\n#define PRIoLEAST32  \"I32o\"\n#define PRIuLEAST32  \"I32u\"\n#define PRIxLEAST32  \"I32x\"\n#define PRIXLEAST32  \"I32X\"\n#define PRIoFAST32   \"I32o\"\n#define PRIuFAST32   \"I32u\"\n#define PRIxFAST32   \"I32x\"\n#define PRIXFAST32   \"I32X\"\n\n#define PRIo64       \"I64o\"\n#define PRIu64       \"I64u\"\n#define PRIx64       \"I64x\"\n#define PRIX64       \"I64X\"\n#define PRIoLEAST64  \"I64o\"\n#define PRIuLEAST64  \"I64u\"\n#define PRIxLEAST64  \"I64x\"\n#define PRIXLEAST64  \"I64X\"\n#define PRIoFAST64   \"I64o\"\n#define PRIuFAST64   \"I64u\"\n#define PRIxFAST64   \"I64x\"\n#define PRIXFAST64   \"I64X\"\n\n#define PRIoMAX     \"I64o\"\n#define PRIuMAX     \"I64u\"\n#define PRIxMAX     \"I64x\"\n#define PRIXMAX     \"I64X\"\n\n#define PRIoPTR     \"Io\"\n#define PRIuPTR     \"Iu\"\n#define PRIxPTR     \"Ix\"\n#define PRIXPTR     \"IX\"\n\n// The fscanf macros for signed integers are:\n#define SCNd8       \"d\"\n#define SCNi8       \"i\"\n#define SCNdLEAST8  \"d\"\n#define SCNiLEAST8  \"i\"\n#define SCNdFAST8   \"d\"\n#define SCNiFAST8   \"i\"\n\n#define SCNd16       \"hd\"\n#define SCNi16       \"hi\"\n#define SCNdLEAST16  \"hd\"\n#define SCNiLEAST16  \"hi\"\n#define SCNdFAST16   \"hd\"\n#define SCNiFAST16   \"hi\"\n\n#define SCNd32       \"ld\"\n#define SCNi32       \"li\"\n#define SCNdLEAST32  \"ld\"\n#define SCNiLEAST32  \"li\"\n#define SCNdFAST32   \"ld\"\n#define SCNiFAST32   \"li\"\n\n#define SCNd64       \"I64d\"\n#define SCNi64       \"I64i\"\n#define SCNdLEAST64  \"I64d\"\n#define SCNiLEAST64  \"I64i\"\n#define SCNdFAST64   \"I64d\"\n#define SCNiFAST64   \"I64i\"\n\n#define SCNdMAX     \"I64d\"\n#define SCNiMAX     \"I64i\"\n\n#ifdef _WIN64 // [\n#  define SCNdPTR     \"I64d\"\n#  define SCNiPTR     \"I64i\"\n#else  // _WIN64 ][\n#  define SCNdPTR     \"ld\"\n#  define SCNiPTR     \"li\"\n#endif  // _WIN64 ]\n\n// The fscanf macros for unsigned integers are:\n#define SCNo8       \"o\"\n#define SCNu8       \"u\"\n#define SCNx8       \"x\"\n#define SCNX8       \"X\"\n#define SCNoLEAST8  \"o\"\n#define SCNuLEAST8  \"u\"\n#define SCNxLEAST8  \"x\"\n#define SCNXLEAST8  \"X\"\n#define SCNoFAST8   \"o\"\n#define SCNuFAST8   \"u\"\n#define SCNxFAST8   \"x\"\n#define SCNXFAST8   \"X\"\n\n#define SCNo16       \"ho\"\n#define SCNu16       \"hu\"\n#define SCNx16       \"hx\"\n#define SCNX16       \"hX\"\n#define SCNoLEAST16  \"ho\"\n#define SCNuLEAST16  \"hu\"\n#define SCNxLEAST16  \"hx\"\n#define SCNXLEAST16  \"hX\"\n#define SCNoFAST16   \"ho\"\n#define SCNuFAST16   \"hu\"\n#define SCNxFAST16   \"hx\"\n#define SCNXFAST16   \"hX\"\n\n#define SCNo32       \"lo\"\n#define SCNu32       \"lu\"\n#define SCNx32       \"lx\"\n#define SCNX32       \"lX\"\n#define SCNoLEAST32  \"lo\"\n#define SCNuLEAST32  \"lu\"\n#define SCNxLEAST32  \"lx\"\n#define SCNXLEAST32  \"lX\"\n#define SCNoFAST32   \"lo\"\n#define SCNuFAST32   \"lu\"\n#define SCNxFAST32   \"lx\"\n#define SCNXFAST32   \"lX\"\n\n#define SCNo64       \"I64o\"\n#define SCNu64       \"I64u\"\n#define SCNx64       \"I64x\"\n#define SCNX64       \"I64X\"\n#define SCNoLEAST64  \"I64o\"\n#define SCNuLEAST64  \"I64u\"\n#define SCNxLEAST64  \"I64x\"\n#define SCNXLEAST64  \"I64X\"\n#define SCNoFAST64   \"I64o\"\n#define SCNuFAST64   \"I64u\"\n#define SCNxFAST64   \"I64x\"\n#define SCNXFAST64   \"I64X\"\n\n#define SCNoMAX     \"I64o\"\n#define SCNuMAX     \"I64u\"\n#define SCNxMAX     \"I64x\"\n#define SCNXMAX     \"I64X\"\n\n#ifdef _WIN64 // [\n#  define SCNoPTR     \"I64o\"\n#  define SCNuPTR     \"I64u\"\n#  define SCNxPTR     \"I64x\"\n#  define SCNXPTR     \"I64X\"\n#else  // _WIN64 ][\n#  define SCNoPTR     \"lo\"\n#  define SCNuPTR     \"lu\"\n#  define SCNxPTR     \"lx\"\n#  define SCNXPTR     \"lX\"\n#endif  // _WIN64 ]\n\n#endif // __STDC_FORMAT_MACROS ]\n\n// 7.8.2 Functions for greatest-width integer types\n\n// 7.8.2.1 The imaxabs function\n#define imaxabs _abs64\n\n// 7.8.2.2 The imaxdiv function\n\n// This is modified version of div() function from Microsoft's div.c found\n// in %MSVC.NET%\\crt\\src\\div.c\n#ifdef STATIC_IMAXDIV // [\nstatic\n#else // STATIC_IMAXDIV ][\n_inline\n#endif // STATIC_IMAXDIV ]\nimaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom)\n{\n   imaxdiv_t result;\n\n   result.quot = numer / denom;\n   result.rem = numer % denom;\n\n   if (numer < 0 && result.rem > 0) {\n      // did division wrong; must fix up\n      ++result.quot;\n      result.rem -= denom;\n   }\n\n   return result;\n}\n\n// 7.8.2.3 The strtoimax and strtoumax functions\n#define strtoimax _strtoi64\n#define strtoumax _strtoui64\n\n// 7.8.2.4 The wcstoimax and wcstoumax functions\n#define wcstoimax _wcstoi64\n#define wcstoumax _wcstoui64\n\n#endif // _MSC_VER >= 1800\n\n#endif // _MSC_INTTYPES_H_ ]\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/msinttypes/stdint.h",
    "content": "// ISO C9x  compliant stdint.h for Microsoft Visual Studio\n// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 \n// \n//  Copyright (c) 2006-2013 Alexander Chemeris\n// \n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n// \n//   1. Redistributions of source code must retain the above copyright notice,\n//      this list of conditions and the following disclaimer.\n// \n//   2. Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n// \n//   3. Neither the name of the product nor the names of its contributors may\n//      be used to endorse or promote products derived from this software\n//      without specific prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, \n// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n// \n///////////////////////////////////////////////////////////////////////////////\n\n// The above software in this distribution may have been modified by \n// THL A29 Limited (\"Tencent Modifications\"). \n// All Tencent Modifications are Copyright (C) 2015 THL A29 Limited.\n\n#ifndef _MSC_VER // [\n#error \"Use this header only with Microsoft Visual C++ compilers!\"\n#endif // _MSC_VER ]\n\n#ifndef _MSC_STDINT_H_ // [\n#define _MSC_STDINT_H_\n\n#if _MSC_VER > 1000\n#pragma once\n#endif\n\n// miloyip: Originally Visual Studio 2010 uses its own stdint.h. However it generates warning with INT64_C(), so change to use this file for vs2010.\n#if _MSC_VER >= 1600 // [\n#include <stdint.h>\n\n#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [   See footnote 224 at page 260\n\n#undef INT8_C\n#undef INT16_C\n#undef INT32_C\n#undef INT64_C\n#undef UINT8_C\n#undef UINT16_C\n#undef UINT32_C\n#undef UINT64_C\n\n// 7.18.4.1 Macros for minimum-width integer constants\n\n#define INT8_C(val)  val##i8\n#define INT16_C(val) val##i16\n#define INT32_C(val) val##i32\n#define INT64_C(val) val##i64\n\n#define UINT8_C(val)  val##ui8\n#define UINT16_C(val) val##ui16\n#define UINT32_C(val) val##ui32\n#define UINT64_C(val) val##ui64\n\n// 7.18.4.2 Macros for greatest-width integer constants\n// These #ifndef's are needed to prevent collisions with <boost/cstdint.hpp>.\n// Check out Issue 9 for the details.\n#ifndef INTMAX_C //   [\n#  define INTMAX_C   INT64_C\n#endif // INTMAX_C    ]\n#ifndef UINTMAX_C //  [\n#  define UINTMAX_C  UINT64_C\n#endif // UINTMAX_C   ]\n\n#endif // __STDC_CONSTANT_MACROS ]\n\n#else // ] _MSC_VER >= 1700 [\n\n#include <limits.h>\n\n// For Visual Studio 6 in C++ mode and for many Visual Studio versions when\n// compiling for ARM we have to wrap <wchar.h> include with 'extern \"C++\" {}'\n// or compiler would give many errors like this:\n//   error C2733: second C linkage of overloaded function 'wmemchr' not allowed\n#if defined(__cplusplus) && !defined(_M_ARM)\nextern \"C\" {\n#endif\n#  include <wchar.h>\n#if defined(__cplusplus) && !defined(_M_ARM)\n}\n#endif\n\n// Define _W64 macros to mark types changing their size, like intptr_t.\n#ifndef _W64\n#  if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300\n#     define _W64 __w64\n#  else\n#     define _W64\n#  endif\n#endif\n\n\n// 7.18.1 Integer types\n\n// 7.18.1.1 Exact-width integer types\n\n// Visual Studio 6 and Embedded Visual C++ 4 doesn't\n// realize that, e.g. char has the same size as __int8\n// so we give up on __intX for them.\n#if (_MSC_VER < 1300)\n   typedef signed char       int8_t;\n   typedef signed short      int16_t;\n   typedef signed int        int32_t;\n   typedef unsigned char     uint8_t;\n   typedef unsigned short    uint16_t;\n   typedef unsigned int      uint32_t;\n#else\n   typedef signed __int8     int8_t;\n   typedef signed __int16    int16_t;\n   typedef signed __int32    int32_t;\n   typedef unsigned __int8   uint8_t;\n   typedef unsigned __int16  uint16_t;\n   typedef unsigned __int32  uint32_t;\n#endif\ntypedef signed __int64       int64_t;\ntypedef unsigned __int64     uint64_t;\n\n\n// 7.18.1.2 Minimum-width integer types\ntypedef int8_t    int_least8_t;\ntypedef int16_t   int_least16_t;\ntypedef int32_t   int_least32_t;\ntypedef int64_t   int_least64_t;\ntypedef uint8_t   uint_least8_t;\ntypedef uint16_t  uint_least16_t;\ntypedef uint32_t  uint_least32_t;\ntypedef uint64_t  uint_least64_t;\n\n// 7.18.1.3 Fastest minimum-width integer types\ntypedef int8_t    int_fast8_t;\ntypedef int16_t   int_fast16_t;\ntypedef int32_t   int_fast32_t;\ntypedef int64_t   int_fast64_t;\ntypedef uint8_t   uint_fast8_t;\ntypedef uint16_t  uint_fast16_t;\ntypedef uint32_t  uint_fast32_t;\ntypedef uint64_t  uint_fast64_t;\n\n// 7.18.1.4 Integer types capable of holding object pointers\n#ifdef _WIN64 // [\n   typedef signed __int64    intptr_t;\n   typedef unsigned __int64  uintptr_t;\n#else // _WIN64 ][\n   typedef _W64 signed int   intptr_t;\n   typedef _W64 unsigned int uintptr_t;\n#endif // _WIN64 ]\n\n// 7.18.1.5 Greatest-width integer types\ntypedef int64_t   intmax_t;\ntypedef uint64_t  uintmax_t;\n\n\n// 7.18.2 Limits of specified-width integer types\n\n#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [   See footnote 220 at page 257 and footnote 221 at page 259\n\n// 7.18.2.1 Limits of exact-width integer types\n#define INT8_MIN     ((int8_t)_I8_MIN)\n#define INT8_MAX     _I8_MAX\n#define INT16_MIN    ((int16_t)_I16_MIN)\n#define INT16_MAX    _I16_MAX\n#define INT32_MIN    ((int32_t)_I32_MIN)\n#define INT32_MAX    _I32_MAX\n#define INT64_MIN    ((int64_t)_I64_MIN)\n#define INT64_MAX    _I64_MAX\n#define UINT8_MAX    _UI8_MAX\n#define UINT16_MAX   _UI16_MAX\n#define UINT32_MAX   _UI32_MAX\n#define UINT64_MAX   _UI64_MAX\n\n// 7.18.2.2 Limits of minimum-width integer types\n#define INT_LEAST8_MIN    INT8_MIN\n#define INT_LEAST8_MAX    INT8_MAX\n#define INT_LEAST16_MIN   INT16_MIN\n#define INT_LEAST16_MAX   INT16_MAX\n#define INT_LEAST32_MIN   INT32_MIN\n#define INT_LEAST32_MAX   INT32_MAX\n#define INT_LEAST64_MIN   INT64_MIN\n#define INT_LEAST64_MAX   INT64_MAX\n#define UINT_LEAST8_MAX   UINT8_MAX\n#define UINT_LEAST16_MAX  UINT16_MAX\n#define UINT_LEAST32_MAX  UINT32_MAX\n#define UINT_LEAST64_MAX  UINT64_MAX\n\n// 7.18.2.3 Limits of fastest minimum-width integer types\n#define INT_FAST8_MIN    INT8_MIN\n#define INT_FAST8_MAX    INT8_MAX\n#define INT_FAST16_MIN   INT16_MIN\n#define INT_FAST16_MAX   INT16_MAX\n#define INT_FAST32_MIN   INT32_MIN\n#define INT_FAST32_MAX   INT32_MAX\n#define INT_FAST64_MIN   INT64_MIN\n#define INT_FAST64_MAX   INT64_MAX\n#define UINT_FAST8_MAX   UINT8_MAX\n#define UINT_FAST16_MAX  UINT16_MAX\n#define UINT_FAST32_MAX  UINT32_MAX\n#define UINT_FAST64_MAX  UINT64_MAX\n\n// 7.18.2.4 Limits of integer types capable of holding object pointers\n#ifdef _WIN64 // [\n#  define INTPTR_MIN   INT64_MIN\n#  define INTPTR_MAX   INT64_MAX\n#  define UINTPTR_MAX  UINT64_MAX\n#else // _WIN64 ][\n#  define INTPTR_MIN   INT32_MIN\n#  define INTPTR_MAX   INT32_MAX\n#  define UINTPTR_MAX  UINT32_MAX\n#endif // _WIN64 ]\n\n// 7.18.2.5 Limits of greatest-width integer types\n#define INTMAX_MIN   INT64_MIN\n#define INTMAX_MAX   INT64_MAX\n#define UINTMAX_MAX  UINT64_MAX\n\n// 7.18.3 Limits of other integer types\n\n#ifdef _WIN64 // [\n#  define PTRDIFF_MIN  _I64_MIN\n#  define PTRDIFF_MAX  _I64_MAX\n#else  // _WIN64 ][\n#  define PTRDIFF_MIN  _I32_MIN\n#  define PTRDIFF_MAX  _I32_MAX\n#endif  // _WIN64 ]\n\n#define SIG_ATOMIC_MIN  INT_MIN\n#define SIG_ATOMIC_MAX  INT_MAX\n\n#ifndef SIZE_MAX // [\n#  ifdef _WIN64 // [\n#     define SIZE_MAX  _UI64_MAX\n#  else // _WIN64 ][\n#     define SIZE_MAX  _UI32_MAX\n#  endif // _WIN64 ]\n#endif // SIZE_MAX ]\n\n// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>\n#ifndef WCHAR_MIN // [\n#  define WCHAR_MIN  0\n#endif  // WCHAR_MIN ]\n#ifndef WCHAR_MAX // [\n#  define WCHAR_MAX  _UI16_MAX\n#endif  // WCHAR_MAX ]\n\n#define WINT_MIN  0\n#define WINT_MAX  _UI16_MAX\n\n#endif // __STDC_LIMIT_MACROS ]\n\n\n// 7.18.4 Limits of other integer types\n\n#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [   See footnote 224 at page 260\n\n// 7.18.4.1 Macros for minimum-width integer constants\n\n#define INT8_C(val)  val##i8\n#define INT16_C(val) val##i16\n#define INT32_C(val) val##i32\n#define INT64_C(val) val##i64\n\n#define UINT8_C(val)  val##ui8\n#define UINT16_C(val) val##ui16\n#define UINT32_C(val) val##ui32\n#define UINT64_C(val) val##ui64\n\n// 7.18.4.2 Macros for greatest-width integer constants\n// These #ifndef's are needed to prevent collisions with <boost/cstdint.hpp>.\n// Check out Issue 9 for the details.\n#ifndef INTMAX_C //   [\n#  define INTMAX_C   INT64_C\n#endif // INTMAX_C    ]\n#ifndef UINTMAX_C //  [\n#  define UINTMAX_C  UINT64_C\n#endif // UINTMAX_C   ]\n\n#endif // __STDC_CONSTANT_MACROS ]\n\n#endif // _MSC_VER >= 1600 ]\n\n#endif // _MSC_STDINT_H_ ]\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/ostreamwrapper.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_OSTREAMWRAPPER_H_\n#define CEREAL_RAPIDJSON_OSTREAMWRAPPER_H_\n\n#include \"stream.h\"\n#include <iosfwd>\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(padded)\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n//! Wrapper of \\c std::basic_ostream into RapidJSON's Stream concept.\n/*!\n    The classes can be wrapped including but not limited to:\n\n    - \\c std::ostringstream\n    - \\c std::stringstream\n    - \\c std::wpstringstream\n    - \\c std::wstringstream\n    - \\c std::ifstream\n    - \\c std::fstream\n    - \\c std::wofstream\n    - \\c std::wfstream\n\n    \\tparam StreamType Class derived from \\c std::basic_ostream.\n*/\n   \ntemplate <typename StreamType>\nclass BasicOStreamWrapper {\npublic:\n    typedef typename StreamType::char_type Ch;\n    BasicOStreamWrapper(StreamType& stream) : stream_(stream) {}\n\n    void Put(Ch c) {\n        stream_.put(c);\n    }\n\n    void Flush() {\n        stream_.flush();\n    }\n\n    // Not implemented\n    char Peek() const { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n    char Take() { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n    size_t Tell() const { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n    char* PutBegin() { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n    size_t PutEnd(char*) { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n\nprivate:\n    BasicOStreamWrapper(const BasicOStreamWrapper&);\n    BasicOStreamWrapper& operator=(const BasicOStreamWrapper&);\n\n    StreamType& stream_;\n};\n\ntypedef BasicOStreamWrapper<std::ostream> OStreamWrapper;\ntypedef BasicOStreamWrapper<std::wostream> WOStreamWrapper;\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#endif // CEREAL_RAPIDJSON_OSTREAMWRAPPER_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/pointer.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_POINTER_H_\n#define CEREAL_RAPIDJSON_POINTER_H_\n\n#include \"document.h\"\n#include \"internal/itoa.h\"\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(switch-enum)\n#elif defined(_MSC_VER)\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\nstatic const SizeType kPointerInvalidIndex = ~SizeType(0);  //!< Represents an invalid index in GenericPointer::Token\n\n//! Error code of parsing.\n/*! \\ingroup CEREAL_RAPIDJSON_ERRORS\n    \\see GenericPointer::GenericPointer, GenericPointer::GetParseErrorCode\n*/\nenum PointerParseErrorCode {\n    kPointerParseErrorNone = 0,                     //!< The parse is successful\n\n    kPointerParseErrorTokenMustBeginWithSolidus,    //!< A token must begin with a '/'\n    kPointerParseErrorInvalidEscape,                //!< Invalid escape\n    kPointerParseErrorInvalidPercentEncoding,       //!< Invalid percent encoding in URI fragment\n    kPointerParseErrorCharacterMustPercentEncode    //!< A character must percent encoded in URI fragment\n};\n\n///////////////////////////////////////////////////////////////////////////////\n// GenericPointer\n\n//! Represents a JSON Pointer. Use Pointer for UTF8 encoding and default allocator.\n/*!\n    This class implements RFC 6901 \"JavaScript Object Notation (JSON) Pointer\" \n    (https://tools.ietf.org/html/rfc6901).\n\n    A JSON pointer is for identifying a specific value in a JSON document\n    (GenericDocument). It can simplify coding of DOM tree manipulation, because it\n    can access multiple-level depth of DOM tree with single API call.\n\n    After it parses a string representation (e.g. \"/foo/0\" or URI fragment \n    representation (e.g. \"#/foo/0\") into its internal representation (tokens),\n    it can be used to resolve a specific value in multiple documents, or sub-tree \n    of documents.\n\n    Contrary to GenericValue, Pointer can be copy constructed and copy assigned.\n    Apart from assignment, a Pointer cannot be modified after construction.\n\n    Although Pointer is very convenient, please aware that constructing Pointer\n    involves parsing and dynamic memory allocation. A special constructor with user-\n    supplied tokens eliminates these.\n\n    GenericPointer depends on GenericDocument and GenericValue.\n    \n    \\tparam ValueType The value type of the DOM tree. E.g. GenericValue<UTF8<> >\n    \\tparam Allocator The allocator type for allocating memory for internal representation.\n    \n    \\note GenericPointer uses same encoding of ValueType.\n    However, Allocator of GenericPointer is independent of Allocator of Value.\n*/\ntemplate <typename ValueType, typename Allocator = CrtAllocator>\nclass GenericPointer {\npublic:\n    typedef typename ValueType::EncodingType EncodingType;  //!< Encoding type from Value\n    typedef typename ValueType::Ch Ch;                      //!< Character type from Value\n\n    //! A token is the basic units of internal representation.\n    /*!\n        A JSON pointer string representation \"/foo/123\" is parsed to two tokens: \n        \"foo\" and 123. 123 will be represented in both numeric form and string form.\n        They are resolved according to the actual value type (object or array).\n\n        For token that are not numbers, or the numeric value is out of bound\n        (greater than limits of SizeType), they are only treated as string form\n        (i.e. the token's index will be equal to kPointerInvalidIndex).\n\n        This struct is public so that user can create a Pointer without parsing and \n        allocation, using a special constructor.\n    */\n    struct Token {\n        const Ch* name;             //!< Name of the token. It has null character at the end but it can contain null character.\n        SizeType length;            //!< Length of the name.\n        SizeType index;             //!< A valid array index, if it is not equal to kPointerInvalidIndex.\n    };\n\n    //!@name Constructors and destructor.\n    //@{\n\n    //! Default constructor.\n    GenericPointer(Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {}\n\n    //! Constructor that parses a string or URI fragment representation.\n    /*!\n        \\param source A null-terminated, string or URI fragment representation of JSON pointer.\n        \\param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one.\n    */\n    explicit GenericPointer(const Ch* source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {\n        Parse(source, internal::StrLen(source));\n    }\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    //! Constructor that parses a string or URI fragment representation.\n    /*!\n        \\param source A string or URI fragment representation of JSON pointer.\n        \\param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one.\n        \\note Requires the definition of the preprocessor symbol \\ref CEREAL_RAPIDJSON_HAS_STDSTRING.\n    */\n    explicit GenericPointer(const std::basic_string<Ch>& source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {\n        Parse(source.c_str(), source.size());\n    }\n#endif\n\n    //! Constructor that parses a string or URI fragment representation, with length of the source string.\n    /*!\n        \\param source A string or URI fragment representation of JSON pointer.\n        \\param length Length of source.\n        \\param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one.\n        \\note Slightly faster than the overload without length.\n    */\n    GenericPointer(const Ch* source, size_t length, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {\n        Parse(source, length);\n    }\n\n    //! Constructor with user-supplied tokens.\n    /*!\n        This constructor let user supplies const array of tokens.\n        This prevents the parsing process and eliminates allocation.\n        This is preferred for memory constrained environments.\n\n        \\param tokens An constant array of tokens representing the JSON pointer.\n        \\param tokenCount Number of tokens.\n\n        \\b Example\n        \\code\n        #define NAME(s) { s, sizeof(s) / sizeof(s[0]) - 1, kPointerInvalidIndex }\n        #define INDEX(i) { #i, sizeof(#i) - 1, i }\n\n        static const Pointer::Token kTokens[] = { NAME(\"foo\"), INDEX(123) };\n        static const Pointer p(kTokens, sizeof(kTokens) / sizeof(kTokens[0]));\n        // Equivalent to static const Pointer p(\"/foo/123\");\n\n        #undef NAME\n        #undef INDEX\n        \\endcode\n    */\n    GenericPointer(const Token* tokens, size_t tokenCount) : allocator_(), ownAllocator_(), nameBuffer_(), tokens_(const_cast<Token*>(tokens)), tokenCount_(tokenCount), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {}\n\n    //! Copy constructor.\n    GenericPointer(const GenericPointer& rhs) : allocator_(rhs.allocator_), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {\n        *this = rhs;\n    }\n\n    //! Copy constructor.\n    GenericPointer(const GenericPointer& rhs, Allocator* allocator) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {\n        *this = rhs;\n    }\n\n    //! Destructor.\n    ~GenericPointer() {\n        if (nameBuffer_)    // If user-supplied tokens constructor is used, nameBuffer_ is nullptr and tokens_ are not deallocated.\n            Allocator::Free(tokens_);\n        CEREAL_RAPIDJSON_DELETE(ownAllocator_);\n    }\n\n    //! Assignment operator.\n    GenericPointer& operator=(const GenericPointer& rhs) {\n        if (this != &rhs) {\n            // Do not delete ownAllcator\n            if (nameBuffer_)\n                Allocator::Free(tokens_);\n\n            tokenCount_ = rhs.tokenCount_;\n            parseErrorOffset_ = rhs.parseErrorOffset_;\n            parseErrorCode_ = rhs.parseErrorCode_;\n\n            if (rhs.nameBuffer_)\n                CopyFromRaw(rhs); // Normally parsed tokens.\n            else {\n                tokens_ = rhs.tokens_; // User supplied const tokens.\n                nameBuffer_ = 0;\n            }\n        }\n        return *this;\n    }\n\n    //! Swap the content of this pointer with an other.\n    /*!\n        \\param other The pointer to swap with.\n        \\note Constant complexity.\n    */\n    GenericPointer& Swap(GenericPointer& other) CEREAL_RAPIDJSON_NOEXCEPT {\n        internal::Swap(allocator_, other.allocator_);\n        internal::Swap(ownAllocator_, other.ownAllocator_);\n        internal::Swap(nameBuffer_, other.nameBuffer_);\n        internal::Swap(tokens_, other.tokens_);\n        internal::Swap(tokenCount_, other.tokenCount_);\n        internal::Swap(parseErrorOffset_, other.parseErrorOffset_);\n        internal::Swap(parseErrorCode_, other.parseErrorCode_);\n        return *this;\n    }\n\n    //! free-standing swap function helper\n    /*!\n        Helper function to enable support for common swap implementation pattern based on \\c std::swap:\n        \\code\n        void swap(MyClass& a, MyClass& b) {\n            using std::swap;\n            swap(a.pointer, b.pointer);\n            // ...\n        }\n        \\endcode\n        \\see Swap()\n     */\n    friend inline void swap(GenericPointer& a, GenericPointer& b) CEREAL_RAPIDJSON_NOEXCEPT { a.Swap(b); }\n\n    //@}\n\n    //!@name Append token\n    //@{\n\n    //! Append a token and return a new Pointer\n    /*!\n        \\param token Token to be appended.\n        \\param allocator Allocator for the newly return Pointer.\n        \\return A new Pointer with appended token.\n    */\n    GenericPointer Append(const Token& token, Allocator* allocator = 0) const {\n        GenericPointer r;\n        r.allocator_ = allocator;\n        Ch *p = r.CopyFromRaw(*this, 1, token.length + 1);\n        std::memcpy(p, token.name, (token.length + 1) * sizeof(Ch));\n        r.tokens_[tokenCount_].name = p;\n        r.tokens_[tokenCount_].length = token.length;\n        r.tokens_[tokenCount_].index = token.index;\n        return r;\n    }\n\n    //! Append a name token with length, and return a new Pointer\n    /*!\n        \\param name Name to be appended.\n        \\param length Length of name.\n        \\param allocator Allocator for the newly return Pointer.\n        \\return A new Pointer with appended token.\n    */\n    GenericPointer Append(const Ch* name, SizeType length, Allocator* allocator = 0) const {\n        Token token = { name, length, kPointerInvalidIndex };\n        return Append(token, allocator);\n    }\n\n    //! Append a name token without length, and return a new Pointer\n    /*!\n        \\param name Name (const Ch*) to be appended.\n        \\param allocator Allocator for the newly return Pointer.\n        \\return A new Pointer with appended token.\n    */\n    template <typename T>\n    CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr<internal::IsSame<typename internal::RemoveConst<T>::Type, Ch> >), (GenericPointer))\n    Append(T* name, Allocator* allocator = 0) const {\n        return Append(name, internal::StrLen(name), allocator);\n    }\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    //! Append a name token, and return a new Pointer\n    /*!\n        \\param name Name to be appended.\n        \\param allocator Allocator for the newly return Pointer.\n        \\return A new Pointer with appended token.\n    */\n    GenericPointer Append(const std::basic_string<Ch>& name, Allocator* allocator = 0) const {\n        return Append(name.c_str(), static_cast<SizeType>(name.size()), allocator);\n    }\n#endif\n\n    //! Append a index token, and return a new Pointer\n    /*!\n        \\param index Index to be appended.\n        \\param allocator Allocator for the newly return Pointer.\n        \\return A new Pointer with appended token.\n    */\n    GenericPointer Append(SizeType index, Allocator* allocator = 0) const {\n        char buffer[21];\n        char* end = sizeof(SizeType) == 4 ? internal::u32toa(index, buffer) : internal::u64toa(index, buffer);\n        SizeType length = static_cast<SizeType>(end - buffer);\n        buffer[length] = '\\0';\n\n        if (sizeof(Ch) == 1) {\n            Token token = { reinterpret_cast<Ch*>(buffer), length, index };\n            return Append(token, allocator);\n        }\n        else {\n            Ch name[21];\n            for (size_t i = 0; i <= length; i++)\n                name[i] = static_cast<Ch>(buffer[i]);\n            Token token = { name, length, index };\n            return Append(token, allocator);\n        }\n    }\n\n    //! Append a token by value, and return a new Pointer\n    /*!\n        \\param token token to be appended.\n        \\param allocator Allocator for the newly return Pointer.\n        \\return A new Pointer with appended token.\n    */\n    GenericPointer Append(const ValueType& token, Allocator* allocator = 0) const {\n        if (token.IsString())\n            return Append(token.GetString(), token.GetStringLength(), allocator);\n        else {\n            CEREAL_RAPIDJSON_ASSERT(token.IsUint64());\n            CEREAL_RAPIDJSON_ASSERT(token.GetUint64() <= SizeType(~0));\n            return Append(static_cast<SizeType>(token.GetUint64()), allocator);\n        }\n    }\n\n    //!@name Handling Parse Error\n    //@{\n\n    //! Check whether this is a valid pointer.\n    bool IsValid() const { return parseErrorCode_ == kPointerParseErrorNone; }\n\n    //! Get the parsing error offset in code unit.\n    size_t GetParseErrorOffset() const { return parseErrorOffset_; }\n\n    //! Get the parsing error code.\n    PointerParseErrorCode GetParseErrorCode() const { return parseErrorCode_; }\n\n    //@}\n\n    //! Get the allocator of this pointer.\n    Allocator& GetAllocator() { return *allocator_; }\n\n    //!@name Tokens\n    //@{\n\n    //! Get the token array (const version only).\n    const Token* GetTokens() const { return tokens_; }\n\n    //! Get the number of tokens.\n    size_t GetTokenCount() const { return tokenCount_; }\n\n    //@}\n\n    //!@name Equality/inequality operators\n    //@{\n\n    //! Equality operator.\n    /*!\n        \\note When any pointers are invalid, always returns false.\n    */\n    bool operator==(const GenericPointer& rhs) const {\n        if (!IsValid() || !rhs.IsValid() || tokenCount_ != rhs.tokenCount_)\n            return false;\n\n        for (size_t i = 0; i < tokenCount_; i++) {\n            if (tokens_[i].index != rhs.tokens_[i].index ||\n                tokens_[i].length != rhs.tokens_[i].length || \n                (tokens_[i].length != 0 && std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch)* tokens_[i].length) != 0))\n            {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    //! Inequality operator.\n    /*!\n        \\note When any pointers are invalid, always returns true.\n    */\n    bool operator!=(const GenericPointer& rhs) const { return !(*this == rhs); }\n\n    //! Less than operator.\n    /*!\n        \\note Invalid pointers are always greater than valid ones.\n    */\n    bool operator<(const GenericPointer& rhs) const {\n        if (!IsValid())\n            return false;\n        if (!rhs.IsValid())\n            return true;\n\n        if (tokenCount_ != rhs.tokenCount_)\n            return tokenCount_ < rhs.tokenCount_;\n\n        for (size_t i = 0; i < tokenCount_; i++) {\n            if (tokens_[i].index != rhs.tokens_[i].index)\n                return tokens_[i].index < rhs.tokens_[i].index;\n\n            if (tokens_[i].length != rhs.tokens_[i].length)\n                return tokens_[i].length < rhs.tokens_[i].length;\n\n            if (int cmp = std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch) * tokens_[i].length))\n                return cmp < 0;\n        }\n\n        return false;\n    }\n\n    //@}\n\n    //!@name Stringify\n    //@{\n\n    //! Stringify the pointer into string representation.\n    /*!\n        \\tparam OutputStream Type of output stream.\n        \\param os The output stream.\n    */\n    template<typename OutputStream>\n    bool Stringify(OutputStream& os) const {\n        return Stringify<false, OutputStream>(os);\n    }\n\n    //! Stringify the pointer into URI fragment representation.\n    /*!\n        \\tparam OutputStream Type of output stream.\n        \\param os The output stream.\n    */\n    template<typename OutputStream>\n    bool StringifyUriFragment(OutputStream& os) const {\n        return Stringify<true, OutputStream>(os);\n    }\n\n    //@}\n\n    //!@name Create value\n    //@{\n\n    //! Create a value in a subtree.\n    /*!\n        If the value is not exist, it creates all parent values and a JSON Null value.\n        So it always succeed and return the newly created or existing value.\n\n        Remind that it may change types of parents according to tokens, so it \n        potentially removes previously stored values. For example, if a document \n        was an array, and \"/foo\" is used to create a value, then the document \n        will be changed to an object, and all existing array elements are lost.\n\n        \\param root Root value of a DOM subtree to be resolved. It can be any value other than document root.\n        \\param allocator Allocator for creating the values if the specified value or its parents are not exist.\n        \\param alreadyExist If non-null, it stores whether the resolved value is already exist.\n        \\return The resolved newly created (a JSON Null value), or already exists value.\n    */\n    ValueType& Create(ValueType& root, typename ValueType::AllocatorType& allocator, bool* alreadyExist = 0) const {\n        CEREAL_RAPIDJSON_ASSERT(IsValid());\n        ValueType* v = &root;\n        bool exist = true;\n        for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) {\n            if (v->IsArray() && t->name[0] == '-' && t->length == 1) {\n                v->PushBack(ValueType().Move(), allocator);\n                v = &((*v)[v->Size() - 1]);\n                exist = false;\n            }\n            else {\n                if (t->index == kPointerInvalidIndex) { // must be object name\n                    if (!v->IsObject())\n                        v->SetObject(); // Change to Object\n                }\n                else { // object name or array index\n                    if (!v->IsArray() && !v->IsObject())\n                        v->SetArray(); // Change to Array\n                }\n\n                if (v->IsArray()) {\n                    if (t->index >= v->Size()) {\n                        v->Reserve(t->index + 1, allocator);\n                        while (t->index >= v->Size())\n                            v->PushBack(ValueType().Move(), allocator);\n                        exist = false;\n                    }\n                    v = &((*v)[t->index]);\n                }\n                else {\n                    typename ValueType::MemberIterator m = v->FindMember(GenericStringRef<Ch>(t->name, t->length));\n                    if (m == v->MemberEnd()) {\n                        v->AddMember(ValueType(t->name, t->length, allocator).Move(), ValueType().Move(), allocator);\n                        v = &(--v->MemberEnd())->value; // Assumes AddMember() appends at the end\n                        exist = false;\n                    }\n                    else\n                        v = &m->value;\n                }\n            }\n        }\n\n        if (alreadyExist)\n            *alreadyExist = exist;\n\n        return *v;\n    }\n\n    //! Creates a value in a document.\n    /*!\n        \\param document A document to be resolved.\n        \\param alreadyExist If non-null, it stores whether the resolved value is already exist.\n        \\return The resolved newly created, or already exists value.\n    */\n    template <typename stackAllocator>\n    ValueType& Create(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& document, bool* alreadyExist = 0) const {\n        return Create(document, document.GetAllocator(), alreadyExist);\n    }\n\n    //@}\n\n    //!@name Query value\n    //@{\n\n    //! Query a value in a subtree.\n    /*!\n        \\param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root.\n        \\param unresolvedTokenIndex If the pointer cannot resolve a token in the pointer, this parameter can obtain the index of unresolved token.\n        \\return Pointer to the value if it can be resolved. Otherwise null.\n\n        \\note\n        There are only 3 situations when a value cannot be resolved:\n        1. A value in the path is not an array nor object.\n        2. An object value does not contain the token.\n        3. A token is out of range of an array value.\n\n        Use unresolvedTokenIndex to retrieve the token index.\n    */\n    ValueType* Get(ValueType& root, size_t* unresolvedTokenIndex = 0) const {\n        CEREAL_RAPIDJSON_ASSERT(IsValid());\n        ValueType* v = &root;\n        for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) {\n            switch (v->GetType()) {\n            case kObjectType:\n                {\n                    typename ValueType::MemberIterator m = v->FindMember(GenericStringRef<Ch>(t->name, t->length));\n                    if (m == v->MemberEnd())\n                        break;\n                    v = &m->value;\n                }\n                continue;\n            case kArrayType:\n                if (t->index == kPointerInvalidIndex || t->index >= v->Size())\n                    break;\n                v = &((*v)[t->index]);\n                continue;\n            default:\n                break;\n            }\n\n            // Error: unresolved token\n            if (unresolvedTokenIndex)\n                *unresolvedTokenIndex = static_cast<size_t>(t - tokens_);\n            return 0;\n        }\n        return v;\n    }\n\n    //! Query a const value in a const subtree.\n    /*!\n        \\param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root.\n        \\return Pointer to the value if it can be resolved. Otherwise null.\n    */\n    const ValueType* Get(const ValueType& root, size_t* unresolvedTokenIndex = 0) const { \n        return Get(const_cast<ValueType&>(root), unresolvedTokenIndex);\n    }\n\n    //@}\n\n    //!@name Query a value with default\n    //@{\n\n    //! Query a value in a subtree with default value.\n    /*!\n        Similar to Get(), but if the specified value do not exists, it creates all parents and clone the default value.\n        So that this function always succeed.\n\n        \\param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root.\n        \\param defaultValue Default value to be cloned if the value was not exists.\n        \\param allocator Allocator for creating the values if the specified value or its parents are not exist.\n        \\see Create()\n    */\n    ValueType& GetWithDefault(ValueType& root, const ValueType& defaultValue, typename ValueType::AllocatorType& allocator) const {\n        bool alreadyExist;\n        ValueType& v = Create(root, allocator, &alreadyExist);\n        return alreadyExist ? v : v.CopyFrom(defaultValue, allocator);\n    }\n\n    //! Query a value in a subtree with default null-terminated string.\n    ValueType& GetWithDefault(ValueType& root, const Ch* defaultValue, typename ValueType::AllocatorType& allocator) const {\n        bool alreadyExist;\n        ValueType& v = Create(root, allocator, &alreadyExist);\n        return alreadyExist ? v : v.SetString(defaultValue, allocator);\n    }\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    //! Query a value in a subtree with default std::basic_string.\n    ValueType& GetWithDefault(ValueType& root, const std::basic_string<Ch>& defaultValue, typename ValueType::AllocatorType& allocator) const {\n        bool alreadyExist;\n        ValueType& v = Create(root, allocator, &alreadyExist);\n        return alreadyExist ? v : v.SetString(defaultValue, allocator);\n    }\n#endif\n\n    //! Query a value in a subtree with default primitive value.\n    /*!\n        \\tparam T Either \\ref Type, \\c int, \\c unsigned, \\c int64_t, \\c uint64_t, \\c bool\n    */\n    template <typename T>\n    CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (ValueType&))\n    GetWithDefault(ValueType& root, T defaultValue, typename ValueType::AllocatorType& allocator) const {\n        return GetWithDefault(root, ValueType(defaultValue).Move(), allocator);\n    }\n\n    //! Query a value in a document with default value.\n    template <typename stackAllocator>\n    ValueType& GetWithDefault(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& document, const ValueType& defaultValue) const {\n        return GetWithDefault(document, defaultValue, document.GetAllocator());\n    }\n\n    //! Query a value in a document with default null-terminated string.\n    template <typename stackAllocator>\n    ValueType& GetWithDefault(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& document, const Ch* defaultValue) const {\n        return GetWithDefault(document, defaultValue, document.GetAllocator());\n    }\n    \n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    //! Query a value in a document with default std::basic_string.\n    template <typename stackAllocator>\n    ValueType& GetWithDefault(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& document, const std::basic_string<Ch>& defaultValue) const {\n        return GetWithDefault(document, defaultValue, document.GetAllocator());\n    }\n#endif\n\n    //! Query a value in a document with default primitive value.\n    /*!\n        \\tparam T Either \\ref Type, \\c int, \\c unsigned, \\c int64_t, \\c uint64_t, \\c bool\n    */\n    template <typename T, typename stackAllocator>\n    CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (ValueType&))\n    GetWithDefault(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& document, T defaultValue) const {\n        return GetWithDefault(document, defaultValue, document.GetAllocator());\n    }\n\n    //@}\n\n    //!@name Set a value\n    //@{\n\n    //! Set a value in a subtree, with move semantics.\n    /*!\n        It creates all parents if they are not exist or types are different to the tokens.\n        So this function always succeeds but potentially remove existing values.\n\n        \\param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root.\n        \\param value Value to be set.\n        \\param allocator Allocator for creating the values if the specified value or its parents are not exist.\n        \\see Create()\n    */\n    ValueType& Set(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const {\n        return Create(root, allocator) = value;\n    }\n\n    //! Set a value in a subtree, with copy semantics.\n    ValueType& Set(ValueType& root, const ValueType& value, typename ValueType::AllocatorType& allocator) const {\n        return Create(root, allocator).CopyFrom(value, allocator);\n    }\n\n    //! Set a null-terminated string in a subtree.\n    ValueType& Set(ValueType& root, const Ch* value, typename ValueType::AllocatorType& allocator) const {\n        return Create(root, allocator) = ValueType(value, allocator).Move();\n    }\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    //! Set a std::basic_string in a subtree.\n    ValueType& Set(ValueType& root, const std::basic_string<Ch>& value, typename ValueType::AllocatorType& allocator) const {\n        return Create(root, allocator) = ValueType(value, allocator).Move();\n    }\n#endif\n\n    //! Set a primitive value in a subtree.\n    /*!\n        \\tparam T Either \\ref Type, \\c int, \\c unsigned, \\c int64_t, \\c uint64_t, \\c bool\n    */\n    template <typename T>\n    CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (ValueType&))\n    Set(ValueType& root, T value, typename ValueType::AllocatorType& allocator) const {\n        return Create(root, allocator) = ValueType(value).Move();\n    }\n\n    //! Set a value in a document, with move semantics.\n    template <typename stackAllocator>\n    ValueType& Set(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& document, ValueType& value) const {\n        return Create(document) = value;\n    }\n\n    //! Set a value in a document, with copy semantics.\n    template <typename stackAllocator>\n    ValueType& Set(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& document, const ValueType& value) const {\n        return Create(document).CopyFrom(value, document.GetAllocator());\n    }\n\n    //! Set a null-terminated string in a document.\n    template <typename stackAllocator>\n    ValueType& Set(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& document, const Ch* value) const {\n        return Create(document) = ValueType(value, document.GetAllocator()).Move();\n    }\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    //! Sets a std::basic_string in a document.\n    template <typename stackAllocator>\n    ValueType& Set(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& document, const std::basic_string<Ch>& value) const {\n        return Create(document) = ValueType(value, document.GetAllocator()).Move();\n    }\n#endif\n\n    //! Set a primitive value in a document.\n    /*!\n    \\tparam T Either \\ref Type, \\c int, \\c unsigned, \\c int64_t, \\c uint64_t, \\c bool\n    */\n    template <typename T, typename stackAllocator>\n    CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (ValueType&))\n        Set(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& document, T value) const {\n            return Create(document) = value;\n    }\n\n    //@}\n\n    //!@name Swap a value\n    //@{\n\n    //! Swap a value with a value in a subtree.\n    /*!\n        It creates all parents if they are not exist or types are different to the tokens.\n        So this function always succeeds but potentially remove existing values.\n\n        \\param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root.\n        \\param value Value to be swapped.\n        \\param allocator Allocator for creating the values if the specified value or its parents are not exist.\n        \\see Create()\n    */\n    ValueType& Swap(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const {\n        return Create(root, allocator).Swap(value);\n    }\n\n    //! Swap a value with a value in a document.\n    template <typename stackAllocator>\n    ValueType& Swap(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& document, ValueType& value) const {\n        return Create(document).Swap(value);\n    }\n\n    //@}\n\n    //! Erase a value in a subtree.\n    /*!\n        \\param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root.\n        \\return Whether the resolved value is found and erased.\n\n        \\note Erasing with an empty pointer \\c Pointer(\"\"), i.e. the root, always fail and return false.\n    */\n    bool Erase(ValueType& root) const {\n        CEREAL_RAPIDJSON_ASSERT(IsValid());\n        if (tokenCount_ == 0) // Cannot erase the root\n            return false;\n\n        ValueType* v = &root;\n        const Token* last = tokens_ + (tokenCount_ - 1);\n        for (const Token *t = tokens_; t != last; ++t) {\n            switch (v->GetType()) {\n            case kObjectType:\n                {\n                    typename ValueType::MemberIterator m = v->FindMember(GenericStringRef<Ch>(t->name, t->length));\n                    if (m == v->MemberEnd())\n                        return false;\n                    v = &m->value;\n                }\n                break;\n            case kArrayType:\n                if (t->index == kPointerInvalidIndex || t->index >= v->Size())\n                    return false;\n                v = &((*v)[t->index]);\n                break;\n            default:\n                return false;\n            }\n        }\n\n        switch (v->GetType()) {\n        case kObjectType:\n            return v->EraseMember(GenericStringRef<Ch>(last->name, last->length));\n        case kArrayType:\n            if (last->index == kPointerInvalidIndex || last->index >= v->Size())\n                return false;\n            v->Erase(v->Begin() + last->index);\n            return true;\n        default:\n            return false;\n        }\n    }\n\nprivate:\n    //! Clone the content from rhs to this.\n    /*!\n        \\param rhs Source pointer.\n        \\param extraToken Extra tokens to be allocated.\n        \\param extraNameBufferSize Extra name buffer size (in number of Ch) to be allocated.\n        \\return Start of non-occupied name buffer, for storing extra names.\n    */\n    Ch* CopyFromRaw(const GenericPointer& rhs, size_t extraToken = 0, size_t extraNameBufferSize = 0) {\n        if (!allocator_) // allocator is independently owned.\n            ownAllocator_ = allocator_ = CEREAL_RAPIDJSON_NEW(Allocator)();\n\n        size_t nameBufferSize = rhs.tokenCount_; // null terminators for tokens\n        for (Token *t = rhs.tokens_; t != rhs.tokens_ + rhs.tokenCount_; ++t)\n            nameBufferSize += t->length;\n\n        tokenCount_ = rhs.tokenCount_ + extraToken;\n        tokens_ = static_cast<Token *>(allocator_->Malloc(tokenCount_ * sizeof(Token) + (nameBufferSize + extraNameBufferSize) * sizeof(Ch)));\n        nameBuffer_ = reinterpret_cast<Ch *>(tokens_ + tokenCount_);\n        if (rhs.tokenCount_ > 0) {\n            std::memcpy(tokens_, rhs.tokens_, rhs.tokenCount_ * sizeof(Token));\n        }\n        if (nameBufferSize > 0) {\n            std::memcpy(nameBuffer_, rhs.nameBuffer_, nameBufferSize * sizeof(Ch));\n        }\n\n        // Adjust pointers to name buffer\n        std::ptrdiff_t diff = nameBuffer_ - rhs.nameBuffer_;\n        for (Token *t = tokens_; t != tokens_ + rhs.tokenCount_; ++t)\n            t->name += diff;\n\n        return nameBuffer_ + nameBufferSize;\n    }\n\n    //! Check whether a character should be percent-encoded.\n    /*!\n        According to RFC 3986 2.3 Unreserved Characters.\n        \\param c The character (code unit) to be tested.\n    */\n    bool NeedPercentEncode(Ch c) const {\n        return !((c >= '0' && c <= '9') || (c >= 'A' && c <='Z') || (c >= 'a' && c <= 'z') || c == '-' || c == '.' || c == '_' || c =='~');\n    }\n\n    //! Parse a JSON String or its URI fragment representation into tokens.\n#ifndef __clang__ // -Wdocumentation\n    /*!\n        \\param source Either a JSON Pointer string, or its URI fragment representation. Not need to be null terminated.\n        \\param length Length of the source string.\n        \\note Source cannot be JSON String Representation of JSON Pointer, e.g. In \"/\\u0000\", \\u0000 will not be unescaped.\n    */\n#endif\n    void Parse(const Ch* source, size_t length) {\n        CEREAL_RAPIDJSON_ASSERT(source != NULL);\n        CEREAL_RAPIDJSON_ASSERT(nameBuffer_ == 0);\n        CEREAL_RAPIDJSON_ASSERT(tokens_ == 0);\n\n        // Create own allocator if user did not supply.\n        if (!allocator_)\n            ownAllocator_ = allocator_ = CEREAL_RAPIDJSON_NEW(Allocator)();\n\n        // Count number of '/' as tokenCount\n        tokenCount_ = 0;\n        for (const Ch* s = source; s != source + length; s++) \n            if (*s == '/')\n                tokenCount_++;\n\n        Token* token = tokens_ = static_cast<Token *>(allocator_->Malloc(tokenCount_ * sizeof(Token) + length * sizeof(Ch)));\n        Ch* name = nameBuffer_ = reinterpret_cast<Ch *>(tokens_ + tokenCount_);\n        size_t i = 0;\n\n        // Detect if it is a URI fragment\n        bool uriFragment = false;\n        if (source[i] == '#') {\n            uriFragment = true;\n            i++;\n        }\n\n        if (i != length && source[i] != '/') {\n            parseErrorCode_ = kPointerParseErrorTokenMustBeginWithSolidus;\n            goto error;\n        }\n\n        while (i < length) {\n            CEREAL_RAPIDJSON_ASSERT(source[i] == '/');\n            i++; // consumes '/'\n\n            token->name = name;\n            bool isNumber = true;\n\n            while (i < length && source[i] != '/') {\n                Ch c = source[i];\n                if (uriFragment) {\n                    // Decoding percent-encoding for URI fragment\n                    if (c == '%') {\n                        PercentDecodeStream is(&source[i], source + length);\n                        GenericInsituStringStream<EncodingType> os(name);\n                        Ch* begin = os.PutBegin();\n                        if (!Transcoder<UTF8<>, EncodingType>().Validate(is, os) || !is.IsValid()) {\n                            parseErrorCode_ = kPointerParseErrorInvalidPercentEncoding;\n                            goto error;\n                        }\n                        size_t len = os.PutEnd(begin);\n                        i += is.Tell() - 1;\n                        if (len == 1)\n                            c = *name;\n                        else {\n                            name += len;\n                            isNumber = false;\n                            i++;\n                            continue;\n                        }\n                    }\n                    else if (NeedPercentEncode(c)) {\n                        parseErrorCode_ = kPointerParseErrorCharacterMustPercentEncode;\n                        goto error;\n                    }\n                }\n\n                i++;\n                \n                // Escaping \"~0\" -> '~', \"~1\" -> '/'\n                if (c == '~') {\n                    if (i < length) {\n                        c = source[i];\n                        if (c == '0')       c = '~';\n                        else if (c == '1')  c = '/';\n                        else {\n                            parseErrorCode_ = kPointerParseErrorInvalidEscape;\n                            goto error;\n                        }\n                        i++;\n                    }\n                    else {\n                        parseErrorCode_ = kPointerParseErrorInvalidEscape;\n                        goto error;\n                    }\n                }\n\n                // First check for index: all of characters are digit\n                if (c < '0' || c > '9')\n                    isNumber = false;\n\n                *name++ = c;\n            }\n            token->length = static_cast<SizeType>(name - token->name);\n            if (token->length == 0)\n                isNumber = false;\n            *name++ = '\\0'; // Null terminator\n\n            // Second check for index: more than one digit cannot have leading zero\n            if (isNumber && token->length > 1 && token->name[0] == '0')\n                isNumber = false;\n\n            // String to SizeType conversion\n            SizeType n = 0;\n            if (isNumber) {\n                for (size_t j = 0; j < token->length; j++) {\n                    SizeType m = n * 10 + static_cast<SizeType>(token->name[j] - '0');\n                    if (m < n) {   // overflow detection\n                        isNumber = false;\n                        break;\n                    }\n                    n = m;\n                }\n            }\n\n            token->index = isNumber ? n : kPointerInvalidIndex;\n            token++;\n        }\n\n        CEREAL_RAPIDJSON_ASSERT(name <= nameBuffer_ + length); // Should not overflow buffer\n        parseErrorCode_ = kPointerParseErrorNone;\n        return;\n\n    error:\n        Allocator::Free(tokens_);\n        nameBuffer_ = 0;\n        tokens_ = 0;\n        tokenCount_ = 0;\n        parseErrorOffset_ = i;\n        return;\n    }\n\n    //! Stringify to string or URI fragment representation.\n    /*!\n        \\tparam uriFragment True for stringifying to URI fragment representation. False for string representation.\n        \\tparam OutputStream type of output stream.\n        \\param os The output stream.\n    */\n    template<bool uriFragment, typename OutputStream>\n    bool Stringify(OutputStream& os) const {\n        CEREAL_RAPIDJSON_ASSERT(IsValid());\n\n        if (uriFragment)\n            os.Put('#');\n\n        for (Token *t = tokens_; t != tokens_ + tokenCount_; ++t) {\n            os.Put('/');\n            for (size_t j = 0; j < t->length; j++) {\n                Ch c = t->name[j];\n                if (c == '~') {\n                    os.Put('~');\n                    os.Put('0');\n                }\n                else if (c == '/') {\n                    os.Put('~');\n                    os.Put('1');\n                }\n                else if (uriFragment && NeedPercentEncode(c)) { \n                    // Transcode to UTF8 sequence\n                    GenericStringStream<typename ValueType::EncodingType> source(&t->name[j]);\n                    PercentEncodeStream<OutputStream> target(os);\n                    if (!Transcoder<EncodingType, UTF8<> >().Validate(source, target))\n                        return false;\n                    j += source.Tell() - 1;\n                }\n                else\n                    os.Put(c);\n            }\n        }\n        return true;\n    }\n\n    //! A helper stream for decoding a percent-encoded sequence into code unit.\n    /*!\n        This stream decodes %XY triplet into code unit (0-255).\n        If it encounters invalid characters, it sets output code unit as 0 and \n        mark invalid, and to be checked by IsValid().\n    */\n    class PercentDecodeStream {\n    public:\n        typedef typename ValueType::Ch Ch;\n\n        //! Constructor\n        /*!\n            \\param source Start of the stream\n            \\param end Past-the-end of the stream.\n        */\n        PercentDecodeStream(const Ch* source, const Ch* end) : src_(source), head_(source), end_(end), valid_(true) {}\n\n        Ch Take() {\n            if (*src_ != '%' || src_ + 3 > end_) { // %XY triplet\n                valid_ = false;\n                return 0;\n            }\n            src_++;\n            Ch c = 0;\n            for (int j = 0; j < 2; j++) {\n                c = static_cast<Ch>(c << 4);\n                Ch h = *src_;\n                if      (h >= '0' && h <= '9') c = static_cast<Ch>(c + h - '0');\n                else if (h >= 'A' && h <= 'F') c = static_cast<Ch>(c + h - 'A' + 10);\n                else if (h >= 'a' && h <= 'f') c = static_cast<Ch>(c + h - 'a' + 10);\n                else {\n                    valid_ = false;\n                    return 0;\n                }\n                src_++;\n            }\n            return c;\n        }\n\n        size_t Tell() const { return static_cast<size_t>(src_ - head_); }\n        bool IsValid() const { return valid_; }\n\n    private:\n        const Ch* src_;     //!< Current read position.\n        const Ch* head_;    //!< Original head of the string.\n        const Ch* end_;     //!< Past-the-end position.\n        bool valid_;        //!< Whether the parsing is valid.\n    };\n\n    //! A helper stream to encode character (UTF-8 code unit) into percent-encoded sequence.\n    template <typename OutputStream>\n    class PercentEncodeStream {\n    public:\n        PercentEncodeStream(OutputStream& os) : os_(os) {}\n        void Put(char c) { // UTF-8 must be byte\n            unsigned char u = static_cast<unsigned char>(c);\n            static const char hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };\n            os_.Put('%');\n            os_.Put(static_cast<typename OutputStream::Ch>(hexDigits[u >> 4]));\n            os_.Put(static_cast<typename OutputStream::Ch>(hexDigits[u & 15]));\n        }\n    private:\n        OutputStream& os_;\n    };\n\n    Allocator* allocator_;                  //!< The current allocator. It is either user-supplied or equal to ownAllocator_.\n    Allocator* ownAllocator_;               //!< Allocator owned by this Pointer.\n    Ch* nameBuffer_;                        //!< A buffer containing all names in tokens.\n    Token* tokens_;                         //!< A list of tokens.\n    size_t tokenCount_;                     //!< Number of tokens in tokens_.\n    size_t parseErrorOffset_;               //!< Offset in code unit when parsing fail.\n    PointerParseErrorCode parseErrorCode_;  //!< Parsing error code.\n};\n\n//! GenericPointer for Value (UTF-8, default allocator).\ntypedef GenericPointer<Value> Pointer;\n\n//!@name Helper functions for GenericPointer\n//@{\n\n//////////////////////////////////////////////////////////////////////////////\n\ntemplate <typename T>\ntypename T::ValueType& CreateValueByPointer(T& root, const GenericPointer<typename T::ValueType>& pointer, typename T::AllocatorType& a) {\n    return pointer.Create(root, a);\n}\n\ntemplate <typename T, typename CharType, size_t N>\ntypename T::ValueType& CreateValueByPointer(T& root, const CharType(&source)[N], typename T::AllocatorType& a) {\n    return GenericPointer<typename T::ValueType>(source, N - 1).Create(root, a);\n}\n\n// No allocator parameter\n\ntemplate <typename DocumentType>\ntypename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const GenericPointer<typename DocumentType::ValueType>& pointer) {\n    return pointer.Create(document);\n}\n\ntemplate <typename DocumentType, typename CharType, size_t N>\ntypename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const CharType(&source)[N]) {\n    return GenericPointer<typename DocumentType::ValueType>(source, N - 1).Create(document);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\ntemplate <typename T>\ntypename T::ValueType* GetValueByPointer(T& root, const GenericPointer<typename T::ValueType>& pointer, size_t* unresolvedTokenIndex = 0) {\n    return pointer.Get(root, unresolvedTokenIndex);\n}\n\ntemplate <typename T>\nconst typename T::ValueType* GetValueByPointer(const T& root, const GenericPointer<typename T::ValueType>& pointer, size_t* unresolvedTokenIndex = 0) {\n    return pointer.Get(root, unresolvedTokenIndex);\n}\n\ntemplate <typename T, typename CharType, size_t N>\ntypename T::ValueType* GetValueByPointer(T& root, const CharType (&source)[N], size_t* unresolvedTokenIndex = 0) {\n    return GenericPointer<typename T::ValueType>(source, N - 1).Get(root, unresolvedTokenIndex);\n}\n\ntemplate <typename T, typename CharType, size_t N>\nconst typename T::ValueType* GetValueByPointer(const T& root, const CharType(&source)[N], size_t* unresolvedTokenIndex = 0) {\n    return GenericPointer<typename T::ValueType>(source, N - 1).Get(root, unresolvedTokenIndex);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\ntemplate <typename T>\ntypename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer<typename T::ValueType>& pointer, const typename T::ValueType& defaultValue, typename T::AllocatorType& a) {\n    return pointer.GetWithDefault(root, defaultValue, a);\n}\n\ntemplate <typename T>\ntypename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer<typename T::ValueType>& pointer, const typename T::Ch* defaultValue, typename T::AllocatorType& a) {\n    return pointer.GetWithDefault(root, defaultValue, a);\n}\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\ntemplate <typename T>\ntypename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer<typename T::ValueType>& pointer, const std::basic_string<typename T::Ch>& defaultValue, typename T::AllocatorType& a) {\n    return pointer.GetWithDefault(root, defaultValue, a);\n}\n#endif\n\ntemplate <typename T, typename T2>\nCEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename T::ValueType&))\nGetValueByPointerWithDefault(T& root, const GenericPointer<typename T::ValueType>& pointer, T2 defaultValue, typename T::AllocatorType& a) {\n    return pointer.GetWithDefault(root, defaultValue, a);\n}\n\ntemplate <typename T, typename CharType, size_t N>\ntypename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::ValueType& defaultValue, typename T::AllocatorType& a) {\n    return GenericPointer<typename T::ValueType>(source, N - 1).GetWithDefault(root, defaultValue, a);\n}\n\ntemplate <typename T, typename CharType, size_t N>\ntypename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::Ch* defaultValue, typename T::AllocatorType& a) {\n    return GenericPointer<typename T::ValueType>(source, N - 1).GetWithDefault(root, defaultValue, a);\n}\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\ntemplate <typename T, typename CharType, size_t N>\ntypename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const std::basic_string<typename T::Ch>& defaultValue, typename T::AllocatorType& a) {\n    return GenericPointer<typename T::ValueType>(source, N - 1).GetWithDefault(root, defaultValue, a);\n}\n#endif\n\ntemplate <typename T, typename CharType, size_t N, typename T2>\nCEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename T::ValueType&))\nGetValueByPointerWithDefault(T& root, const CharType(&source)[N], T2 defaultValue, typename T::AllocatorType& a) {\n    return GenericPointer<typename T::ValueType>(source, N - 1).GetWithDefault(root, defaultValue, a);\n}\n\n// No allocator parameter\n\ntemplate <typename DocumentType>\ntypename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer<typename DocumentType::ValueType>& pointer, const typename DocumentType::ValueType& defaultValue) {\n    return pointer.GetWithDefault(document, defaultValue);\n}\n\ntemplate <typename DocumentType>\ntypename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer<typename DocumentType::ValueType>& pointer, const typename DocumentType::Ch* defaultValue) {\n    return pointer.GetWithDefault(document, defaultValue);\n}\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\ntemplate <typename DocumentType>\ntypename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer<typename DocumentType::ValueType>& pointer, const std::basic_string<typename DocumentType::Ch>& defaultValue) {\n    return pointer.GetWithDefault(document, defaultValue);\n}\n#endif\n\ntemplate <typename DocumentType, typename T2>\nCEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename DocumentType::ValueType&))\nGetValueByPointerWithDefault(DocumentType& document, const GenericPointer<typename DocumentType::ValueType>& pointer, T2 defaultValue) {\n    return pointer.GetWithDefault(document, defaultValue);\n}\n\ntemplate <typename DocumentType, typename CharType, size_t N>\ntypename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& defaultValue) {\n    return GenericPointer<typename DocumentType::ValueType>(source, N - 1).GetWithDefault(document, defaultValue);\n}\n\ntemplate <typename DocumentType, typename CharType, size_t N>\ntypename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* defaultValue) {\n    return GenericPointer<typename DocumentType::ValueType>(source, N - 1).GetWithDefault(document, defaultValue);\n}\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\ntemplate <typename DocumentType, typename CharType, size_t N>\ntypename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const std::basic_string<typename DocumentType::Ch>& defaultValue) {\n    return GenericPointer<typename DocumentType::ValueType>(source, N - 1).GetWithDefault(document, defaultValue);\n}\n#endif\n\ntemplate <typename DocumentType, typename CharType, size_t N, typename T2>\nCEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename DocumentType::ValueType&))\nGetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], T2 defaultValue) {\n    return GenericPointer<typename DocumentType::ValueType>(source, N - 1).GetWithDefault(document, defaultValue);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\ntemplate <typename T>\ntypename T::ValueType& SetValueByPointer(T& root, const GenericPointer<typename T::ValueType>& pointer, typename T::ValueType& value, typename T::AllocatorType& a) {\n    return pointer.Set(root, value, a);\n}\n\ntemplate <typename T>\ntypename T::ValueType& SetValueByPointer(T& root, const GenericPointer<typename T::ValueType>& pointer, const typename T::ValueType& value, typename T::AllocatorType& a) {\n    return pointer.Set(root, value, a);\n}\n\ntemplate <typename T>\ntypename T::ValueType& SetValueByPointer(T& root, const GenericPointer<typename T::ValueType>& pointer, const typename T::Ch* value, typename T::AllocatorType& a) {\n    return pointer.Set(root, value, a);\n}\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\ntemplate <typename T>\ntypename T::ValueType& SetValueByPointer(T& root, const GenericPointer<typename T::ValueType>& pointer, const std::basic_string<typename T::Ch>& value, typename T::AllocatorType& a) {\n    return pointer.Set(root, value, a);\n}\n#endif\n\ntemplate <typename T, typename T2>\nCEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename T::ValueType&))\nSetValueByPointer(T& root, const GenericPointer<typename T::ValueType>& pointer, T2 value, typename T::AllocatorType& a) {\n    return pointer.Set(root, value, a);\n}\n\ntemplate <typename T, typename CharType, size_t N>\ntypename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) {\n    return GenericPointer<typename T::ValueType>(source, N - 1).Set(root, value, a);\n}\n\ntemplate <typename T, typename CharType, size_t N>\ntypename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::ValueType& value, typename T::AllocatorType& a) {\n    return GenericPointer<typename T::ValueType>(source, N - 1).Set(root, value, a);\n}\n\ntemplate <typename T, typename CharType, size_t N>\ntypename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::Ch* value, typename T::AllocatorType& a) {\n    return GenericPointer<typename T::ValueType>(source, N - 1).Set(root, value, a);\n}\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\ntemplate <typename T, typename CharType, size_t N>\ntypename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const std::basic_string<typename T::Ch>& value, typename T::AllocatorType& a) {\n    return GenericPointer<typename T::ValueType>(source, N - 1).Set(root, value, a);\n}\n#endif\n\ntemplate <typename T, typename CharType, size_t N, typename T2>\nCEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename T::ValueType&))\nSetValueByPointer(T& root, const CharType(&source)[N], T2 value, typename T::AllocatorType& a) {\n    return GenericPointer<typename T::ValueType>(source, N - 1).Set(root, value, a);\n}\n\n// No allocator parameter\n\ntemplate <typename DocumentType>\ntypename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer<typename DocumentType::ValueType>& pointer, typename DocumentType::ValueType& value) {\n    return pointer.Set(document, value);\n}\n\ntemplate <typename DocumentType>\ntypename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer<typename DocumentType::ValueType>& pointer, const typename DocumentType::ValueType& value) {\n    return pointer.Set(document, value);\n}\n\ntemplate <typename DocumentType>\ntypename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer<typename DocumentType::ValueType>& pointer, const typename DocumentType::Ch* value) {\n    return pointer.Set(document, value);\n}\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\ntemplate <typename DocumentType>\ntypename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer<typename DocumentType::ValueType>& pointer, const std::basic_string<typename DocumentType::Ch>& value) {\n    return pointer.Set(document, value);\n}\n#endif\n\ntemplate <typename DocumentType, typename T2>\nCEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename DocumentType::ValueType&))\nSetValueByPointer(DocumentType& document, const GenericPointer<typename DocumentType::ValueType>& pointer, T2 value) {\n    return pointer.Set(document, value);\n}\n\ntemplate <typename DocumentType, typename CharType, size_t N>\ntypename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) {\n    return GenericPointer<typename DocumentType::ValueType>(source, N - 1).Set(document, value);\n}\n\ntemplate <typename DocumentType, typename CharType, size_t N>\ntypename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& value) {\n    return GenericPointer<typename DocumentType::ValueType>(source, N - 1).Set(document, value);\n}\n\ntemplate <typename DocumentType, typename CharType, size_t N>\ntypename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* value) {\n    return GenericPointer<typename DocumentType::ValueType>(source, N - 1).Set(document, value);\n}\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\ntemplate <typename DocumentType, typename CharType, size_t N>\ntypename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const std::basic_string<typename DocumentType::Ch>& value) {\n    return GenericPointer<typename DocumentType::ValueType>(source, N - 1).Set(document, value);\n}\n#endif\n\ntemplate <typename DocumentType, typename CharType, size_t N, typename T2>\nCEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename DocumentType::ValueType&))\nSetValueByPointer(DocumentType& document, const CharType(&source)[N], T2 value) {\n    return GenericPointer<typename DocumentType::ValueType>(source, N - 1).Set(document, value);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\ntemplate <typename T>\ntypename T::ValueType& SwapValueByPointer(T& root, const GenericPointer<typename T::ValueType>& pointer, typename T::ValueType& value, typename T::AllocatorType& a) {\n    return pointer.Swap(root, value, a);\n}\n\ntemplate <typename T, typename CharType, size_t N>\ntypename T::ValueType& SwapValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) {\n    return GenericPointer<typename T::ValueType>(source, N - 1).Swap(root, value, a);\n}\n\ntemplate <typename DocumentType>\ntypename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const GenericPointer<typename DocumentType::ValueType>& pointer, typename DocumentType::ValueType& value) {\n    return pointer.Swap(document, value);\n}\n\ntemplate <typename DocumentType, typename CharType, size_t N>\ntypename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) {\n    return GenericPointer<typename DocumentType::ValueType>(source, N - 1).Swap(document, value);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\ntemplate <typename T>\nbool EraseValueByPointer(T& root, const GenericPointer<typename T::ValueType>& pointer) {\n    return pointer.Erase(root);\n}\n\ntemplate <typename T, typename CharType, size_t N>\nbool EraseValueByPointer(T& root, const CharType(&source)[N]) {\n    return GenericPointer<typename T::ValueType>(source, N - 1).Erase(root);\n}\n\n//@}\n\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#if defined(__clang__) || defined(_MSC_VER)\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#endif // CEREAL_RAPIDJSON_POINTER_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/prettywriter.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_PRETTYWRITER_H_\n#define CEREAL_RAPIDJSON_PRETTYWRITER_H_\n\n#include \"writer.h\"\n\n#ifdef __GNUC__\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(effc++)\n#endif\n\n#if defined(__clang__)\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(c++98-compat)\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n//! Combination of PrettyWriter format flags.\n/*! \\see PrettyWriter::SetFormatOptions\n */\nenum PrettyFormatOptions {\n    kFormatDefault = 0,         //!< Default pretty formatting.\n    kFormatSingleLineArray = 1  //!< Format arrays on a single line.\n};\n\n//! Writer with indentation and spacing.\n/*!\n    \\tparam OutputStream Type of output os.\n    \\tparam SourceEncoding Encoding of source string.\n    \\tparam TargetEncoding Encoding of output stream.\n    \\tparam StackAllocator Type of allocator for allocating memory of stack.\n*/\ntemplate<typename OutputStream, typename SourceEncoding = UTF8<>, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags>\nclass PrettyWriter : public Writer<OutputStream, SourceEncoding, TargetEncoding, StackAllocator, writeFlags> {\npublic:\n    typedef Writer<OutputStream, SourceEncoding, TargetEncoding, StackAllocator, writeFlags> Base;\n    typedef typename Base::Ch Ch;\n\n    //! Constructor\n    /*! \\param os Output stream.\n        \\param allocator User supplied allocator. If it is null, it will create a private one.\n        \\param levelDepth Initial capacity of stack.\n    */\n    explicit PrettyWriter(OutputStream& os, StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : \n        Base(os, allocator, levelDepth), indentChar_(' '), indentCharCount_(4), formatOptions_(kFormatDefault) {}\n\n\n    explicit PrettyWriter(StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : \n        Base(allocator, levelDepth), indentChar_(' '), indentCharCount_(4) {}\n\n#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n    PrettyWriter(PrettyWriter&& rhs) :\n        Base(std::forward<PrettyWriter>(rhs)), indentChar_(rhs.indentChar_), indentCharCount_(rhs.indentCharCount_), formatOptions_(rhs.formatOptions_) {}\n#endif\n\n    //! Set custom indentation.\n    /*! \\param indentChar       Character for indentation. Must be whitespace character (' ', '\\\\t', '\\\\n', '\\\\r').\n        \\param indentCharCount  Number of indent characters for each indentation level.\n        \\note The default indentation is 4 spaces.\n    */\n    PrettyWriter& SetIndent(Ch indentChar, unsigned indentCharCount) {\n        CEREAL_RAPIDJSON_ASSERT(indentChar == ' ' || indentChar == '\\t' || indentChar == '\\n' || indentChar == '\\r');\n        indentChar_ = indentChar;\n        indentCharCount_ = indentCharCount;\n        return *this;\n    }\n\n    //! Set pretty writer formatting options.\n    /*! \\param options Formatting options.\n    */\n    PrettyWriter& SetFormatOptions(PrettyFormatOptions options) {\n        formatOptions_ = options;\n        return *this;\n    }\n\n    /*! @name Implementation of Handler\n        \\see Handler\n    */\n    //@{\n\n    bool Null()                 { PrettyPrefix(kNullType);   return Base::EndValue(Base::WriteNull()); }\n    bool Bool(bool b)           { PrettyPrefix(b ? kTrueType : kFalseType); return Base::EndValue(Base::WriteBool(b)); }\n    bool Int(int i)             { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteInt(i)); }\n    bool Uint(unsigned u)       { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteUint(u)); }\n    bool Int64(int64_t i64)     { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteInt64(i64)); }\n    bool Uint64(uint64_t u64)   { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteUint64(u64));  }\n    bool Double(double d)       { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteDouble(d)); }\n\n    bool RawNumber(const Ch* str, SizeType length, bool copy = false) {\n        CEREAL_RAPIDJSON_ASSERT(str != 0);\n        (void)copy;\n        PrettyPrefix(kNumberType);\n        return Base::EndValue(Base::WriteString(str, length));\n    }\n\n    bool String(const Ch* str, SizeType length, bool copy = false) {\n        CEREAL_RAPIDJSON_ASSERT(str != 0);\n        (void)copy;\n        PrettyPrefix(kStringType);\n        return Base::EndValue(Base::WriteString(str, length));\n    }\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    bool String(const std::basic_string<Ch>& str) {\n        return String(str.data(), SizeType(str.size()));\n    }\n#endif\n\n    bool StartObject() {\n        PrettyPrefix(kObjectType);\n        new (Base::level_stack_.template Push<typename Base::Level>()) typename Base::Level(false);\n        return Base::WriteStartObject();\n    }\n\n    bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); }\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    bool Key(const std::basic_string<Ch>& str) {\n        return Key(str.data(), SizeType(str.size()));\n    }\n#endif\n\t\n    bool EndObject(SizeType memberCount = 0) {\n        (void)memberCount;\n        CEREAL_RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); // not inside an Object\n        CEREAL_RAPIDJSON_ASSERT(!Base::level_stack_.template Top<typename Base::Level>()->inArray); // currently inside an Array, not Object\n        CEREAL_RAPIDJSON_ASSERT(0 == Base::level_stack_.template Top<typename Base::Level>()->valueCount % 2); // Object has a Key without a Value\n       \n        bool empty = Base::level_stack_.template Pop<typename Base::Level>(1)->valueCount == 0;\n\n        if (!empty) {\n            Base::os_->Put('\\n');\n            WriteIndent();\n        }\n        bool ret = Base::EndValue(Base::WriteEndObject());\n        (void)ret;\n        CEREAL_RAPIDJSON_ASSERT(ret == true);\n        if (Base::level_stack_.Empty()) // end of json text\n            Base::Flush();\n        return true;\n    }\n\n    bool StartArray() {\n        PrettyPrefix(kArrayType);\n        new (Base::level_stack_.template Push<typename Base::Level>()) typename Base::Level(true);\n        return Base::WriteStartArray();\n    }\n\n    bool EndArray(SizeType memberCount = 0) {\n        (void)memberCount;\n        CEREAL_RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level));\n        CEREAL_RAPIDJSON_ASSERT(Base::level_stack_.template Top<typename Base::Level>()->inArray);\n        bool empty = Base::level_stack_.template Pop<typename Base::Level>(1)->valueCount == 0;\n\n        if (!empty && !(formatOptions_ & kFormatSingleLineArray)) {\n            Base::os_->Put('\\n');\n            WriteIndent();\n        }\n        bool ret = Base::EndValue(Base::WriteEndArray());\n        (void)ret;\n        CEREAL_RAPIDJSON_ASSERT(ret == true);\n        if (Base::level_stack_.Empty()) // end of json text\n            Base::Flush();\n        return true;\n    }\n\n    //@}\n\n    /*! @name Convenience extensions */\n    //@{\n\n    //! Simpler but slower overload.\n    bool String(const Ch* str) { return String(str, internal::StrLen(str)); }\n    bool Key(const Ch* str) { return Key(str, internal::StrLen(str)); }\n\n    //@}\n\n    //! Write a raw JSON value.\n    /*!\n        For user to write a stringified JSON as a value.\n\n        \\param json A well-formed JSON value. It should not contain null character within [0, length - 1] range.\n        \\param length Length of the json.\n        \\param type Type of the root of json.\n        \\note When using PrettyWriter::RawValue(), the result json may not be indented correctly.\n    */\n    bool RawValue(const Ch* json, size_t length, Type type) {\n        CEREAL_RAPIDJSON_ASSERT(json != 0);\n        PrettyPrefix(type);\n        return Base::EndValue(Base::WriteRawValue(json, length));\n    }\n\nprotected:\n    void PrettyPrefix(Type type) {\n        (void)type;\n        if (Base::level_stack_.GetSize() != 0) { // this value is not at root\n            typename Base::Level* level = Base::level_stack_.template Top<typename Base::Level>();\n\n            if (level->inArray) {\n                if (level->valueCount > 0) {\n                    Base::os_->Put(','); // add comma if it is not the first element in array\n                    if (formatOptions_ & kFormatSingleLineArray)\n                        Base::os_->Put(' ');\n                }\n\n                if (!(formatOptions_ & kFormatSingleLineArray)) {\n                    Base::os_->Put('\\n');\n                    WriteIndent();\n                }\n            }\n            else {  // in object\n                if (level->valueCount > 0) {\n                    if (level->valueCount % 2 == 0) {\n                        Base::os_->Put(',');\n                        Base::os_->Put('\\n');\n                    }\n                    else {\n                        Base::os_->Put(':');\n                        Base::os_->Put(' ');\n                    }\n                }\n                else\n                    Base::os_->Put('\\n');\n\n                if (level->valueCount % 2 == 0)\n                    WriteIndent();\n            }\n            if (!level->inArray && level->valueCount % 2 == 0)\n                CEREAL_RAPIDJSON_ASSERT(type == kStringType);  // if it's in object, then even number should be a name\n            level->valueCount++;\n        }\n        else {\n            CEREAL_RAPIDJSON_ASSERT(!Base::hasRoot_);  // Should only has one and only one root.\n            Base::hasRoot_ = true;\n        }\n    }\n\n    void WriteIndent()  {\n        size_t count = (Base::level_stack_.GetSize() / sizeof(typename Base::Level)) * indentCharCount_;\n        PutN(*Base::os_, static_cast<typename OutputStream::Ch>(indentChar_), count);\n    }\n\n    Ch indentChar_;\n    unsigned indentCharCount_;\n    PrettyFormatOptions formatOptions_;\n\nprivate:\n    // Prohibit copy constructor & assignment operator.\n    PrettyWriter(const PrettyWriter&);\n    PrettyWriter& operator=(const PrettyWriter&);\n};\n\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#if defined(__clang__)\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#ifdef __GNUC__\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#endif // CEREAL_RAPIDJSON_CEREAL_RAPIDJSON_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/rapidjson.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_CEREAL_RAPIDJSON_H_\n#define CEREAL_RAPIDJSON_CEREAL_RAPIDJSON_H_\n\n/*!\\file rapidjson.h\n    \\brief common definitions and configuration\n    \n    \\see CEREAL_RAPIDJSON_CONFIG\n */\n\n/*! \\defgroup CEREAL_RAPIDJSON_CONFIG RapidJSON configuration\n    \\brief Configuration macros for library features\n\n    Some RapidJSON features are configurable to adapt the library to a wide\n    variety of platforms, environments and usage scenarios.  Most of the\n    features can be configured in terms of overridden or predefined\n    preprocessor macros at compile-time.\n\n    Some additional customization is available in the \\ref CEREAL_RAPIDJSON_ERRORS APIs.\n\n    \\note These macros should be given on the compiler command-line\n          (where applicable)  to avoid inconsistent values when compiling\n          different translation units of a single application.\n */\n\n#include <cstdlib>  // malloc(), realloc(), free(), size_t\n#include <cstring>  // memset(), memcpy(), memmove(), memcmp()\n\n///////////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDJSON_VERSION_STRING\n//\n// ALWAYS synchronize the following 3 macros with corresponding variables in /CMakeLists.txt.\n//\n\n//!@cond CEREAL_RAPIDJSON_HIDDEN_FROM_DOXYGEN\n// token stringification\n#define CEREAL_RAPIDJSON_STRINGIFY(x) CEREAL_RAPIDJSON_DO_STRINGIFY(x)\n#define CEREAL_RAPIDJSON_DO_STRINGIFY(x) #x\n\n// token concatenation\n#define CEREAL_RAPIDJSON_JOIN(X, Y) CEREAL_RAPIDJSON_DO_JOIN(X, Y)\n#define CEREAL_RAPIDJSON_DO_JOIN(X, Y) CEREAL_RAPIDJSON_DO_JOIN2(X, Y)\n#define CEREAL_RAPIDJSON_DO_JOIN2(X, Y) X##Y\n//!@endcond\n\n/*! \\def CEREAL_RAPIDJSON_MAJOR_VERSION\n    \\ingroup CEREAL_RAPIDJSON_CONFIG\n    \\brief Major version of RapidJSON in integer.\n*/\n/*! \\def CEREAL_RAPIDJSON_MINOR_VERSION\n    \\ingroup CEREAL_RAPIDJSON_CONFIG\n    \\brief Minor version of RapidJSON in integer.\n*/\n/*! \\def CEREAL_RAPIDJSON_PATCH_VERSION\n    \\ingroup CEREAL_RAPIDJSON_CONFIG\n    \\brief Patch version of RapidJSON in integer.\n*/\n/*! \\def CEREAL_RAPIDJSON_VERSION_STRING\n    \\ingroup CEREAL_RAPIDJSON_CONFIG\n    \\brief Version of RapidJSON in \"<major>.<minor>.<patch>\" string format.\n*/\n#define CEREAL_RAPIDJSON_MAJOR_VERSION 1\n#define CEREAL_RAPIDJSON_MINOR_VERSION 1\n#define CEREAL_RAPIDJSON_PATCH_VERSION 0\n#define CEREAL_RAPIDJSON_VERSION_STRING \\\n    CEREAL_RAPIDJSON_STRINGIFY(CEREAL_RAPIDJSON_MAJOR_VERSION.CEREAL_RAPIDJSON_MINOR_VERSION.CEREAL_RAPIDJSON_PATCH_VERSION)\n\n///////////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDJSON_NAMESPACE_(BEGIN|END)\n/*! \\def CEREAL_RAPIDJSON_NAMESPACE\n    \\ingroup CEREAL_RAPIDJSON_CONFIG\n    \\brief   provide custom rapidjson namespace\n\n    In order to avoid symbol clashes and/or \"One Definition Rule\" errors\n    between multiple inclusions of (different versions of) RapidJSON in\n    a single binary, users can customize the name of the main RapidJSON\n    namespace.\n\n    In case of a single nesting level, defining \\c CEREAL_RAPIDJSON_NAMESPACE\n    to a custom name (e.g. \\c MyRapidJSON) is sufficient.  If multiple\n    levels are needed, both \\ref CEREAL_RAPIDJSON_NAMESPACE_BEGIN and \\ref\n    CEREAL_RAPIDJSON_NAMESPACE_END need to be defined as well:\n\n    \\code\n    // in some .cpp file\n    #define CEREAL_RAPIDJSON_NAMESPACE my::rapidjson\n    #define CEREAL_RAPIDJSON_NAMESPACE_BEGIN namespace my { namespace rapidjson {\n    #define CEREAL_RAPIDJSON_NAMESPACE_END   } }\n    #include \"rapidjson/...\"\n    \\endcode\n\n    \\see rapidjson\n */\n/*! \\def CEREAL_RAPIDJSON_NAMESPACE_BEGIN\n    \\ingroup CEREAL_RAPIDJSON_CONFIG\n    \\brief   provide custom rapidjson namespace (opening expression)\n    \\see CEREAL_RAPIDJSON_NAMESPACE\n*/\n/*! \\def CEREAL_RAPIDJSON_NAMESPACE_END\n    \\ingroup CEREAL_RAPIDJSON_CONFIG\n    \\brief   provide custom rapidjson namespace (closing expression)\n    \\see CEREAL_RAPIDJSON_NAMESPACE\n*/\n#ifndef CEREAL_RAPIDJSON_NAMESPACE\n#define CEREAL_RAPIDJSON_NAMESPACE rapidjson\n#endif\n#ifndef CEREAL_RAPIDJSON_NAMESPACE_BEGIN\n#define CEREAL_RAPIDJSON_NAMESPACE_BEGIN namespace CEREAL_RAPIDJSON_NAMESPACE {\n#endif\n#ifndef CEREAL_RAPIDJSON_NAMESPACE_END\n#define CEREAL_RAPIDJSON_NAMESPACE_END }\n#endif\n\n///////////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDJSON_HAS_STDSTRING\n\n#ifndef CEREAL_RAPIDJSON_HAS_STDSTRING\n#ifdef CEREAL_RAPIDJSON_DOXYGEN_RUNNING\n#define CEREAL_RAPIDJSON_HAS_STDSTRING 1 // force generation of documentation\n#else\n#define CEREAL_RAPIDJSON_HAS_STDSTRING 0 // no std::string support by default\n#endif\n/*! \\def CEREAL_RAPIDJSON_HAS_STDSTRING\n    \\ingroup CEREAL_RAPIDJSON_CONFIG\n    \\brief Enable RapidJSON support for \\c std::string\n\n    By defining this preprocessor symbol to \\c 1, several convenience functions for using\n    \\ref rapidjson::GenericValue with \\c std::string are enabled, especially\n    for construction and comparison.\n\n    \\hideinitializer\n*/\n#endif // !defined(CEREAL_RAPIDJSON_HAS_STDSTRING)\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n#include <string>\n#endif // CEREAL_RAPIDJSON_HAS_STDSTRING\n\n///////////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDJSON_NO_INT64DEFINE\n\n/*! \\def CEREAL_RAPIDJSON_NO_INT64DEFINE\n    \\ingroup CEREAL_RAPIDJSON_CONFIG\n    \\brief Use external 64-bit integer types.\n\n    RapidJSON requires the 64-bit integer types \\c int64_t and  \\c uint64_t types\n    to be available at global scope.\n\n    If users have their own definition, define CEREAL_RAPIDJSON_NO_INT64DEFINE to\n    prevent RapidJSON from defining its own types.\n*/\n#ifndef CEREAL_RAPIDJSON_NO_INT64DEFINE\n//!@cond CEREAL_RAPIDJSON_HIDDEN_FROM_DOXYGEN\n#if defined(_MSC_VER) && (_MSC_VER < 1800)\t// Visual Studio 2013\n#include \"msinttypes/stdint.h\"\n#include \"msinttypes/inttypes.h\"\n#else\n// Other compilers should have this.\n#include <stdint.h>\n#include <inttypes.h>\n#endif\n//!@endcond\n#ifdef CEREAL_RAPIDJSON_DOXYGEN_RUNNING\n#define CEREAL_RAPIDJSON_NO_INT64DEFINE\n#endif\n#endif // CEREAL_RAPIDJSON_NO_INT64TYPEDEF\n\n///////////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDJSON_FORCEINLINE\n\n#ifndef CEREAL_RAPIDJSON_FORCEINLINE\n//!@cond CEREAL_RAPIDJSON_HIDDEN_FROM_DOXYGEN\n#if defined(_MSC_VER) && defined(NDEBUG)\n#define CEREAL_RAPIDJSON_FORCEINLINE __forceinline\n#elif defined(__GNUC__) && __GNUC__ >= 4 && defined(NDEBUG)\n#define CEREAL_RAPIDJSON_FORCEINLINE __attribute__((always_inline))\n#else\n#define CEREAL_RAPIDJSON_FORCEINLINE\n#endif\n//!@endcond\n#endif // CEREAL_RAPIDJSON_FORCEINLINE\n\n///////////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDJSON_ENDIAN\n#define CEREAL_RAPIDJSON_LITTLEENDIAN  0   //!< Little endian machine\n#define CEREAL_RAPIDJSON_BIGENDIAN     1   //!< Big endian machine\n\n//! Endianness of the machine.\n/*!\n    \\def CEREAL_RAPIDJSON_ENDIAN\n    \\ingroup CEREAL_RAPIDJSON_CONFIG\n\n    GCC 4.6 provided macro for detecting endianness of the target machine. But other\n    compilers may not have this. User can define CEREAL_RAPIDJSON_ENDIAN to either\n    \\ref CEREAL_RAPIDJSON_LITTLEENDIAN or \\ref CEREAL_RAPIDJSON_BIGENDIAN.\n\n    Default detection implemented with reference to\n    \\li https://gcc.gnu.org/onlinedocs/gcc-4.6.0/cpp/Common-Predefined-Macros.html\n    \\li http://www.boost.org/doc/libs/1_42_0/boost/detail/endian.hpp\n*/\n#ifndef CEREAL_RAPIDJSON_ENDIAN\n// Detect with GCC 4.6's macro\n#  ifdef __BYTE_ORDER__\n#    if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__\n#      define CEREAL_RAPIDJSON_ENDIAN CEREAL_RAPIDJSON_LITTLEENDIAN\n#    elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__\n#      define CEREAL_RAPIDJSON_ENDIAN CEREAL_RAPIDJSON_BIGENDIAN\n#    else\n#      error Unknown machine endianness detected. User needs to define CEREAL_RAPIDJSON_ENDIAN.\n#    endif // __BYTE_ORDER__\n// Detect with GLIBC's endian.h\n#  elif defined(__GLIBC__)\n#    include <endian.h>\n#    if (__BYTE_ORDER == __LITTLE_ENDIAN)\n#      define CEREAL_RAPIDJSON_ENDIAN CEREAL_RAPIDJSON_LITTLEENDIAN\n#    elif (__BYTE_ORDER == __BIG_ENDIAN)\n#      define CEREAL_RAPIDJSON_ENDIAN CEREAL_RAPIDJSON_BIGENDIAN\n#    else\n#      error Unknown machine endianness detected. User needs to define CEREAL_RAPIDJSON_ENDIAN.\n#   endif // __GLIBC__\n// Detect with _LITTLE_ENDIAN and _BIG_ENDIAN macro\n#  elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)\n#    define CEREAL_RAPIDJSON_ENDIAN CEREAL_RAPIDJSON_LITTLEENDIAN\n#  elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)\n#    define CEREAL_RAPIDJSON_ENDIAN CEREAL_RAPIDJSON_BIGENDIAN\n// Detect with architecture macros\n#  elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__)\n#    define CEREAL_RAPIDJSON_ENDIAN CEREAL_RAPIDJSON_BIGENDIAN\n#  elif defined(__i386__) || defined(__alpha__) || defined(__ia64) || defined(__ia64__) || defined(_M_IX86) || defined(_M_IA64) || defined(_M_ALPHA) || defined(__amd64) || defined(__amd64__) || defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || defined(__bfin__)\n#    define CEREAL_RAPIDJSON_ENDIAN CEREAL_RAPIDJSON_LITTLEENDIAN\n#  elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64))\n#    define CEREAL_RAPIDJSON_ENDIAN CEREAL_RAPIDJSON_LITTLEENDIAN\n#  elif defined(CEREAL_RAPIDJSON_DOXYGEN_RUNNING)\n#    define CEREAL_RAPIDJSON_ENDIAN\n#  else\n#    error Unknown machine endianness detected. User needs to define CEREAL_RAPIDJSON_ENDIAN.   \n#  endif\n#endif // CEREAL_RAPIDJSON_ENDIAN\n\n///////////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDJSON_64BIT\n\n//! Whether using 64-bit architecture\n#ifndef CEREAL_RAPIDJSON_64BIT\n#if defined(__LP64__) || (defined(__x86_64__) && defined(__ILP32__)) || defined(_WIN64) || defined(__EMSCRIPTEN__)\n#define CEREAL_RAPIDJSON_64BIT 1\n#else\n#define CEREAL_RAPIDJSON_64BIT 0\n#endif\n#endif // CEREAL_RAPIDJSON_64BIT\n\n///////////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDJSON_ALIGN\n\n//! Data alignment of the machine.\n/*! \\ingroup CEREAL_RAPIDJSON_CONFIG\n    \\param x pointer to align\n\n    Some machines require strict data alignment. The default is 8 bytes.\n    User can customize by defining the CEREAL_RAPIDJSON_ALIGN function macro.\n*/\n#ifndef CEREAL_RAPIDJSON_ALIGN\n#define CEREAL_RAPIDJSON_ALIGN(x) (((x) + static_cast<size_t>(7u)) & ~static_cast<size_t>(7u))\n#endif\n\n///////////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDJSON_UINT64_C2\n\n//! Construct a 64-bit literal by a pair of 32-bit integer.\n/*!\n    64-bit literal with or without ULL suffix is prone to compiler warnings.\n    UINT64_C() is C macro which cause compilation problems.\n    Use this macro to define 64-bit constants by a pair of 32-bit integer.\n*/\n#ifndef CEREAL_RAPIDJSON_UINT64_C2\n#define CEREAL_RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))\n#endif\n\n///////////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDJSON_48BITPOINTER_OPTIMIZATION\n\n//! Use only lower 48-bit address for some pointers.\n/*!\n    \\ingroup CEREAL_RAPIDJSON_CONFIG\n\n    This optimization uses the fact that current X86-64 architecture only implement lower 48-bit virtual address.\n    The higher 16-bit can be used for storing other data.\n    \\c GenericValue uses this optimization to reduce its size form 24 bytes to 16 bytes in 64-bit architecture.\n*/\n#ifndef CEREAL_RAPIDJSON_48BITPOINTER_OPTIMIZATION\n#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64)\n#define CEREAL_RAPIDJSON_48BITPOINTER_OPTIMIZATION 1\n#else\n#define CEREAL_RAPIDJSON_48BITPOINTER_OPTIMIZATION 0\n#endif\n#endif // CEREAL_RAPIDJSON_48BITPOINTER_OPTIMIZATION\n\n#if CEREAL_RAPIDJSON_48BITPOINTER_OPTIMIZATION == 1\n#if CEREAL_RAPIDJSON_64BIT != 1\n#error CEREAL_RAPIDJSON_48BITPOINTER_OPTIMIZATION can only be set to 1 when CEREAL_RAPIDJSON_64BIT=1\n#endif\n#define CEREAL_RAPIDJSON_SETPOINTER(type, p, x) (p = reinterpret_cast<type *>((reinterpret_cast<uintptr_t>(p) & static_cast<uintptr_t>(CEREAL_RAPIDJSON_UINT64_C2(0xFFFF0000, 0x00000000))) | reinterpret_cast<uintptr_t>(reinterpret_cast<const void*>(x))))\n#define CEREAL_RAPIDJSON_GETPOINTER(type, p) (reinterpret_cast<type *>(reinterpret_cast<uintptr_t>(p) & static_cast<uintptr_t>(CEREAL_RAPIDJSON_UINT64_C2(0x0000FFFF, 0xFFFFFFFF))))\n#else\n#define CEREAL_RAPIDJSON_SETPOINTER(type, p, x) (p = (x))\n#define CEREAL_RAPIDJSON_GETPOINTER(type, p) (p)\n#endif\n\n///////////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDJSON_SSE2/CEREAL_RAPIDJSON_SSE42/CEREAL_RAPIDJSON_NEON/CEREAL_RAPIDJSON_SIMD\n\n/*! \\def CEREAL_RAPIDJSON_SIMD\n    \\ingroup CEREAL_RAPIDJSON_CONFIG\n    \\brief Enable SSE2/SSE4.2/Neon optimization.\n\n    RapidJSON supports optimized implementations for some parsing operations\n    based on the SSE2, SSE4.2 or NEon SIMD extensions on modern Intel\n    or ARM compatible processors.\n\n    To enable these optimizations, three different symbols can be defined;\n    \\code\n    // Enable SSE2 optimization.\n    #define CEREAL_RAPIDJSON_SSE2\n\n    // Enable SSE4.2 optimization.\n    #define CEREAL_RAPIDJSON_SSE42\n    \\endcode\n\n    // Enable ARM Neon optimization.\n    #define CEREAL_RAPIDJSON_NEON\n    \\endcode\n\n    \\c CEREAL_RAPIDJSON_SSE42 takes precedence over SSE2, if both are defined.\n\n    If any of these symbols is defined, RapidJSON defines the macro\n    \\c CEREAL_RAPIDJSON_SIMD to indicate the availability of the optimized code.\n*/\n#if defined(CEREAL_RAPIDJSON_SSE2) || defined(CEREAL_RAPIDJSON_SSE42) \\\n    || defined(CEREAL_RAPIDJSON_NEON) || defined(CEREAL_RAPIDJSON_DOXYGEN_RUNNING)\n#define CEREAL_RAPIDJSON_SIMD\n#endif\n\n///////////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDJSON_NO_SIZETYPEDEFINE\n\n#ifndef CEREAL_RAPIDJSON_NO_SIZETYPEDEFINE\n/*! \\def CEREAL_RAPIDJSON_NO_SIZETYPEDEFINE\n    \\ingroup CEREAL_RAPIDJSON_CONFIG\n    \\brief User-provided \\c SizeType definition.\n\n    In order to avoid using 32-bit size types for indexing strings and arrays,\n    define this preprocessor symbol and provide the type rapidjson::SizeType\n    before including RapidJSON:\n    \\code\n    #define CEREAL_RAPIDJSON_NO_SIZETYPEDEFINE\n    namespace rapidjson { typedef ::std::size_t SizeType; }\n    #include \"rapidjson/...\"\n    \\endcode\n\n    \\see rapidjson::SizeType\n*/\n#ifdef CEREAL_RAPIDJSON_DOXYGEN_RUNNING\n#define CEREAL_RAPIDJSON_NO_SIZETYPEDEFINE\n#endif\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n//! Size type (for string lengths, array sizes, etc.)\n/*! RapidJSON uses 32-bit array/string indices even on 64-bit platforms,\n    instead of using \\c size_t. Users may override the SizeType by defining\n    \\ref CEREAL_RAPIDJSON_NO_SIZETYPEDEFINE.\n*/\ntypedef unsigned SizeType;\nCEREAL_RAPIDJSON_NAMESPACE_END\n#endif\n\n// always import std::size_t to rapidjson namespace\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\nusing std::size_t;\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n///////////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDJSON_ASSERT\n\n//! Assertion.\n/*! \\ingroup CEREAL_RAPIDJSON_CONFIG\n    By default, rapidjson uses C \\c assert() for internal assertions.\n    User can override it by defining CEREAL_RAPIDJSON_ASSERT(x) macro.\n\n    \\note Parsing errors are handled and can be customized by the\n          \\ref CEREAL_RAPIDJSON_ERRORS APIs.\n*/\n#ifndef CEREAL_RAPIDJSON_ASSERT\n#include <cassert>\n#define CEREAL_RAPIDJSON_ASSERT(x) assert(x)\n#endif // CEREAL_RAPIDJSON_ASSERT\n\n///////////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDJSON_STATIC_ASSERT\n\n// Prefer C++11 static_assert, if available\n#ifndef CEREAL_RAPIDJSON_STATIC_ASSERT\n#if __cplusplus >= 201103L || ( defined(_MSC_VER) && _MSC_VER >= 1800 )\n#define CEREAL_RAPIDJSON_STATIC_ASSERT(x) \\\n   static_assert(x, CEREAL_RAPIDJSON_STRINGIFY(x))\n#endif // C++11\n#endif // CEREAL_RAPIDJSON_STATIC_ASSERT\n\n// Adopt C++03 implementation from boost\n#ifndef CEREAL_RAPIDJSON_STATIC_ASSERT\n#ifndef __clang__\n//!@cond CEREAL_RAPIDJSON_HIDDEN_FROM_DOXYGEN\n#endif\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\ntemplate <bool x> struct STATIC_ASSERTION_FAILURE;\ntemplate <> struct STATIC_ASSERTION_FAILURE<true> { enum { value = 1 }; };\ntemplate <size_t x> struct StaticAssertTest {};\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#if defined(__GNUC__) || defined(__clang__)\n#define CEREAL_RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused))\n#else\n#define CEREAL_RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE \n#endif\n#ifndef __clang__\n//!@endcond\n#endif\n\n/*! \\def CEREAL_RAPIDJSON_STATIC_ASSERT\n    \\brief (Internal) macro to check for conditions at compile-time\n    \\param x compile-time condition\n    \\hideinitializer\n */\n#define CEREAL_RAPIDJSON_STATIC_ASSERT(x) \\\n    typedef ::CEREAL_RAPIDJSON_NAMESPACE::StaticAssertTest< \\\n      sizeof(::CEREAL_RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE<bool(x) >)> \\\n    CEREAL_RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) CEREAL_RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE\n#endif // CEREAL_RAPIDJSON_STATIC_ASSERT\n\n///////////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDJSON_LIKELY, CEREAL_RAPIDJSON_UNLIKELY\n\n//! Compiler branching hint for expression with high probability to be true.\n/*!\n    \\ingroup CEREAL_RAPIDJSON_CONFIG\n    \\param x Boolean expression likely to be true.\n*/\n#ifndef CEREAL_RAPIDJSON_LIKELY\n#if defined(__GNUC__) || defined(__clang__)\n#define CEREAL_RAPIDJSON_LIKELY(x) __builtin_expect(!!(x), 1)\n#else\n#define CEREAL_RAPIDJSON_LIKELY(x) (x)\n#endif\n#endif\n\n//! Compiler branching hint for expression with low probability to be true.\n/*!\n    \\ingroup CEREAL_RAPIDJSON_CONFIG\n    \\param x Boolean expression unlikely to be true.\n*/\n#ifndef CEREAL_RAPIDJSON_UNLIKELY\n#if defined(__GNUC__) || defined(__clang__)\n#define CEREAL_RAPIDJSON_UNLIKELY(x) __builtin_expect(!!(x), 0)\n#else\n#define CEREAL_RAPIDJSON_UNLIKELY(x) (x)\n#endif\n#endif\n\n///////////////////////////////////////////////////////////////////////////////\n// Helpers\n\n//!@cond CEREAL_RAPIDJSON_HIDDEN_FROM_DOXYGEN\n\n#define CEREAL_RAPIDJSON_MULTILINEMACRO_BEGIN do {  \n#define CEREAL_RAPIDJSON_MULTILINEMACRO_END \\\n} while((void)0, 0)\n\n// adopted from Boost\n#define CEREAL_RAPIDJSON_VERSION_CODE(x,y,z) \\\n  (((x)*100000) + ((y)*100) + (z))\n\n///////////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDJSON_DIAG_PUSH/POP, CEREAL_RAPIDJSON_DIAG_OFF\n\n#if defined(__GNUC__)\n#define CEREAL_RAPIDJSON_GNUC \\\n    CEREAL_RAPIDJSON_VERSION_CODE(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__)\n#endif\n\n#if defined(__clang__) || (defined(CEREAL_RAPIDJSON_GNUC) && CEREAL_RAPIDJSON_GNUC >= CEREAL_RAPIDJSON_VERSION_CODE(4,2,0))\n\n#define CEREAL_RAPIDJSON_PRAGMA(x) _Pragma(CEREAL_RAPIDJSON_STRINGIFY(x))\n#define CEREAL_RAPIDJSON_DIAG_PRAGMA(x) CEREAL_RAPIDJSON_PRAGMA(GCC diagnostic x)\n#define CEREAL_RAPIDJSON_DIAG_OFF(x) \\\n    CEREAL_RAPIDJSON_DIAG_PRAGMA(ignored CEREAL_RAPIDJSON_STRINGIFY(CEREAL_RAPIDJSON_JOIN(-W,x)))\n\n// push/pop support in Clang and GCC>=4.6\n#if defined(__clang__) || (defined(CEREAL_RAPIDJSON_GNUC) && CEREAL_RAPIDJSON_GNUC >= CEREAL_RAPIDJSON_VERSION_CODE(4,6,0))\n#define CEREAL_RAPIDJSON_DIAG_PUSH CEREAL_RAPIDJSON_DIAG_PRAGMA(push)\n#define CEREAL_RAPIDJSON_DIAG_POP  CEREAL_RAPIDJSON_DIAG_PRAGMA(pop)\n#else // GCC >= 4.2, < 4.6\n#define CEREAL_RAPIDJSON_DIAG_PUSH /* ignored */\n#define CEREAL_RAPIDJSON_DIAG_POP /* ignored */\n#endif\n\n#elif defined(_MSC_VER)\n\n// pragma (MSVC specific)\n#define CEREAL_RAPIDJSON_PRAGMA(x) __pragma(x)\n#define CEREAL_RAPIDJSON_DIAG_PRAGMA(x) CEREAL_RAPIDJSON_PRAGMA(warning(x))\n\n#define CEREAL_RAPIDJSON_DIAG_OFF(x) CEREAL_RAPIDJSON_DIAG_PRAGMA(disable: x)\n#define CEREAL_RAPIDJSON_DIAG_PUSH CEREAL_RAPIDJSON_DIAG_PRAGMA(push)\n#define CEREAL_RAPIDJSON_DIAG_POP  CEREAL_RAPIDJSON_DIAG_PRAGMA(pop)\n\n#else\n\n#define CEREAL_RAPIDJSON_DIAG_OFF(x) /* ignored */\n#define CEREAL_RAPIDJSON_DIAG_PUSH   /* ignored */\n#define CEREAL_RAPIDJSON_DIAG_POP    /* ignored */\n\n#endif // CEREAL_RAPIDJSON_DIAG_*\n\n///////////////////////////////////////////////////////////////////////////////\n// C++11 features\n\n#ifndef CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n#if defined(__clang__)\n#if __has_feature(cxx_rvalue_references) && \\\n    (defined(_MSC_VER) || defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306)\n#define CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS 1\n#else\n#define CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS 0\n#endif\n#elif (defined(CEREAL_RAPIDJSON_GNUC) && (CEREAL_RAPIDJSON_GNUC >= CEREAL_RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \\\n      (defined(_MSC_VER) && _MSC_VER >= 1600) || \\\n      (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__))\n\n#define CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS 1\n#else\n#define CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS 0\n#endif\n#endif // CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n\n#ifndef CEREAL_RAPIDJSON_HAS_CXX11_NOEXCEPT\n#if defined(__clang__)\n#define CEREAL_RAPIDJSON_HAS_CXX11_NOEXCEPT __has_feature(cxx_noexcept)\n#elif (defined(CEREAL_RAPIDJSON_GNUC) && (CEREAL_RAPIDJSON_GNUC >= CEREAL_RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \\\n    (defined(_MSC_VER) && _MSC_VER >= 1900) || \\\n    (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__))\n#define CEREAL_RAPIDJSON_HAS_CXX11_NOEXCEPT 1\n#else\n#define CEREAL_RAPIDJSON_HAS_CXX11_NOEXCEPT 0\n#endif\n#endif\n#if CEREAL_RAPIDJSON_HAS_CXX11_NOEXCEPT\n#define CEREAL_RAPIDJSON_NOEXCEPT noexcept\n#else\n#define CEREAL_RAPIDJSON_NOEXCEPT /* noexcept */\n#endif // CEREAL_RAPIDJSON_HAS_CXX11_NOEXCEPT\n\n// no automatic detection, yet\n#ifndef CEREAL_RAPIDJSON_HAS_CXX11_TYPETRAITS\n#if (defined(_MSC_VER) && _MSC_VER >= 1700)\n#define CEREAL_RAPIDJSON_HAS_CXX11_TYPETRAITS 1\n#else\n#define CEREAL_RAPIDJSON_HAS_CXX11_TYPETRAITS 0\n#endif\n#endif\n\n#ifndef CEREAL_RAPIDJSON_HAS_CXX11_RANGE_FOR\n#if defined(__clang__)\n#define CEREAL_RAPIDJSON_HAS_CXX11_RANGE_FOR __has_feature(cxx_range_for)\n#elif (defined(CEREAL_RAPIDJSON_GNUC) && (CEREAL_RAPIDJSON_GNUC >= CEREAL_RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \\\n      (defined(_MSC_VER) && _MSC_VER >= 1700) || \\\n      (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__))\n#define CEREAL_RAPIDJSON_HAS_CXX11_RANGE_FOR 1\n#else\n#define CEREAL_RAPIDJSON_HAS_CXX11_RANGE_FOR 0\n#endif\n#endif // CEREAL_RAPIDJSON_HAS_CXX11_RANGE_FOR\n\n//!@endcond\n\n//! Assertion (in non-throwing contexts).\n /*! \\ingroup CEREAL_RAPIDJSON_CONFIG\n    Some functions provide a \\c noexcept guarantee, if the compiler supports it.\n    In these cases, the \\ref CEREAL_RAPIDJSON_ASSERT macro cannot be overridden to\n    throw an exception.  This macro adds a separate customization point for\n    such cases.\n\n    Defaults to C \\c assert() (as \\ref CEREAL_RAPIDJSON_ASSERT), if \\c noexcept is\n    supported, and to \\ref CEREAL_RAPIDJSON_ASSERT otherwise.\n */\n\n///////////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDJSON_NOEXCEPT_ASSERT\n\n#ifndef CEREAL_RAPIDJSON_NOEXCEPT_ASSERT\n#ifdef CEREAL_RAPIDJSON_ASSERT_THROWS\n#if CEREAL_RAPIDJSON_HAS_CXX11_NOEXCEPT\n#define CEREAL_RAPIDJSON_NOEXCEPT_ASSERT(x)\n#else\n#define CEREAL_RAPIDJSON_NOEXCEPT_ASSERT(x) CEREAL_RAPIDJSON_ASSERT(x)\n#endif // CEREAL_RAPIDJSON_HAS_CXX11_NOEXCEPT\n#else\n#define CEREAL_RAPIDJSON_NOEXCEPT_ASSERT(x) CEREAL_RAPIDJSON_ASSERT(x)\n#endif // CEREAL_RAPIDJSON_ASSERT_THROWS\n#endif // CEREAL_RAPIDJSON_NOEXCEPT_ASSERT\n\n///////////////////////////////////////////////////////////////////////////////\n// new/delete\n\n#ifndef CEREAL_RAPIDJSON_NEW\n///! customization point for global \\c new\n#define CEREAL_RAPIDJSON_NEW(TypeName) new TypeName\n#endif\n#ifndef CEREAL_RAPIDJSON_DELETE\n///! customization point for global \\c delete\n#define CEREAL_RAPIDJSON_DELETE(x) delete x\n#endif\n\n///////////////////////////////////////////////////////////////////////////////\n// Type\n\n/*! \\namespace rapidjson\n    \\brief main RapidJSON namespace\n    \\see CEREAL_RAPIDJSON_NAMESPACE\n*/\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n//! Type of JSON value\nenum Type {\n    kNullType = 0,      //!< null\n    kFalseType = 1,     //!< false\n    kTrueType = 2,      //!< true\n    kObjectType = 3,    //!< object\n    kArrayType = 4,     //!< array \n    kStringType = 5,    //!< string\n    kNumberType = 6     //!< number\n};\n\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#endif // CEREAL_RAPIDJSON_CEREAL_RAPIDJSON_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/reader.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n//\n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed\n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n// CONDITIONS OF ANY KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_READER_H_\n#define CEREAL_RAPIDJSON_READER_H_\n\n/*! \\file reader.h */\n\n#include \"allocators.h\"\n#include \"stream.h\"\n#include \"encodedstream.h\"\n#include \"internal/meta.h\"\n#include \"internal/stack.h\"\n#include \"internal/strtod.h\"\n#include <limits>\n\n#if defined(CEREAL_RAPIDJSON_SIMD) && defined(_MSC_VER)\n#include <intrin.h>\n#pragma intrinsic(_BitScanForward)\n#endif\n#ifdef CEREAL_RAPIDJSON_SSE42\n#include <nmmintrin.h>\n#elif defined(CEREAL_RAPIDJSON_SSE2)\n#include <emmintrin.h>\n#elif defined(CEREAL_RAPIDJSON_NEON)\n#include <arm_neon.h>\n#endif\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(old-style-cast)\nCEREAL_RAPIDJSON_DIAG_OFF(padded)\nCEREAL_RAPIDJSON_DIAG_OFF(switch-enum)\n#elif defined(_MSC_VER)\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(4127)  // conditional expression is constant\nCEREAL_RAPIDJSON_DIAG_OFF(4702)  // unreachable code\n#endif\n\n#ifdef __GNUC__\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(effc++)\n#endif\n\n//!@cond CEREAL_RAPIDJSON_HIDDEN_FROM_DOXYGEN\n#define CEREAL_RAPIDJSON_NOTHING /* deliberately empty */\n#ifndef CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN\n#define CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN(value) \\\n    CEREAL_RAPIDJSON_MULTILINEMACRO_BEGIN \\\n    if (CEREAL_RAPIDJSON_UNLIKELY(HasParseError())) { return value; } \\\n    CEREAL_RAPIDJSON_MULTILINEMACRO_END\n#endif\n#define CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID \\\n    CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN(CEREAL_RAPIDJSON_NOTHING)\n//!@endcond\n\n/*! \\def CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN\n    \\ingroup CEREAL_RAPIDJSON_ERRORS\n    \\brief Macro to indicate a parse error.\n    \\param parseErrorCode \\ref rapidjson::ParseErrorCode of the error\n    \\param offset  position of the error in JSON input (\\c size_t)\n\n    This macros can be used as a customization point for the internal\n    error handling mechanism of RapidJSON.\n\n    A common usage model is to throw an exception instead of requiring the\n    caller to explicitly check the \\ref rapidjson::GenericReader::Parse's\n    return value:\n\n    \\code\n    #define CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode,offset) \\\n       throw ParseException(parseErrorCode, #parseErrorCode, offset)\n\n    #include <stdexcept>               // std::runtime_error\n    #include \"rapidjson/error/error.h\" // rapidjson::ParseResult\n\n    struct ParseException : std::runtime_error, rapidjson::ParseResult {\n      ParseException(rapidjson::ParseErrorCode code, const char* msg, size_t offset)\n        : std::runtime_error(msg), ParseResult(code, offset) {}\n    };\n\n    #include \"rapidjson/reader.h\"\n    \\endcode\n\n    \\see CEREAL_RAPIDJSON_PARSE_ERROR, rapidjson::GenericReader::Parse\n */\n#ifndef CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN\n#define CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset) \\\n    CEREAL_RAPIDJSON_MULTILINEMACRO_BEGIN \\\n    CEREAL_RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \\\n    SetParseError(parseErrorCode, offset); \\\n    CEREAL_RAPIDJSON_MULTILINEMACRO_END\n#endif\n\n/*! \\def CEREAL_RAPIDJSON_PARSE_ERROR\n    \\ingroup CEREAL_RAPIDJSON_ERRORS\n    \\brief (Internal) macro to indicate and handle a parse error.\n    \\param parseErrorCode \\ref rapidjson::ParseErrorCode of the error\n    \\param offset  position of the error in JSON input (\\c size_t)\n\n    Invokes CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN and stops the parsing.\n\n    \\see CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN\n    \\hideinitializer\n */\n#ifndef CEREAL_RAPIDJSON_PARSE_ERROR\n#define CEREAL_RAPIDJSON_PARSE_ERROR(parseErrorCode, offset) \\\n    CEREAL_RAPIDJSON_MULTILINEMACRO_BEGIN \\\n    CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \\\n    CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \\\n    CEREAL_RAPIDJSON_MULTILINEMACRO_END\n#endif\n\n#include \"error/error.h\" // ParseErrorCode, ParseResult\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n///////////////////////////////////////////////////////////////////////////////\n// ParseFlag\n\n/*! \\def CEREAL_RAPIDJSON_PARSE_DEFAULT_FLAGS\n    \\ingroup CEREAL_RAPIDJSON_CONFIG\n    \\brief User-defined kParseDefaultFlags definition.\n\n    User can define this as any \\c ParseFlag combinations.\n*/\n#ifndef CEREAL_RAPIDJSON_PARSE_DEFAULT_FLAGS\n#define CEREAL_RAPIDJSON_PARSE_DEFAULT_FLAGS kParseNoFlags\n#endif\n\n//! Combination of parseFlags\n/*! \\see Reader::Parse, Document::Parse, Document::ParseInsitu, Document::ParseStream\n */\nenum ParseFlag {\n    kParseNoFlags = 0,              //!< No flags are set.\n    kParseInsituFlag = 1,           //!< In-situ(destructive) parsing.\n    kParseValidateEncodingFlag = 2, //!< Validate encoding of JSON strings.\n    kParseIterativeFlag = 4,        //!< Iterative(constant complexity in terms of function call stack size) parsing.\n    kParseStopWhenDoneFlag = 8,     //!< After parsing a complete JSON root from stream, stop further processing the rest of stream. When this flag is used, parser will not generate kParseErrorDocumentRootNotSingular error.\n    kParseFullPrecisionFlag = 16,   //!< Parse number in full precision (but slower).\n    kParseCommentsFlag = 32,        //!< Allow one-line (//) and multi-line (/**/) comments.\n    kParseNumbersAsStringsFlag = 64,    //!< Parse all numbers (ints/doubles) as strings.\n    kParseTrailingCommasFlag = 128, //!< Allow trailing commas at the end of objects and arrays.\n    kParseNanAndInfFlag = 256,      //!< Allow parsing NaN, Inf, Infinity, -Inf and -Infinity as doubles.\n    kParseDefaultFlags = CEREAL_RAPIDJSON_PARSE_DEFAULT_FLAGS  //!< Default parse flags. Can be customized by defining CEREAL_RAPIDJSON_PARSE_DEFAULT_FLAGS\n};\n\n///////////////////////////////////////////////////////////////////////////////\n// Handler\n\n/*! \\class rapidjson::Handler\n    \\brief Concept for receiving events from GenericReader upon parsing.\n    The functions return true if no error occurs. If they return false,\n    the event publisher should terminate the process.\n\\code\nconcept Handler {\n    typename Ch;\n\n    bool Null();\n    bool Bool(bool b);\n    bool Int(int i);\n    bool Uint(unsigned i);\n    bool Int64(int64_t i);\n    bool Uint64(uint64_t i);\n    bool Double(double d);\n    /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length)\n    bool RawNumber(const Ch* str, SizeType length, bool copy);\n    bool String(const Ch* str, SizeType length, bool copy);\n    bool StartObject();\n    bool Key(const Ch* str, SizeType length, bool copy);\n    bool EndObject(SizeType memberCount);\n    bool StartArray();\n    bool EndArray(SizeType elementCount);\n};\n\\endcode\n*/\n///////////////////////////////////////////////////////////////////////////////\n// BaseReaderHandler\n\n//! Default implementation of Handler.\n/*! This can be used as base class of any reader handler.\n    \\note implements Handler concept\n*/\ntemplate<typename Encoding = UTF8<>, typename Derived = void>\nstruct BaseReaderHandler {\n    typedef typename Encoding::Ch Ch;\n\n    typedef typename internal::SelectIf<internal::IsSame<Derived, void>, BaseReaderHandler, Derived>::Type Override;\n\n    bool Default() { return true; }\n    bool Null() { return static_cast<Override&>(*this).Default(); }\n    bool Bool(bool) { return static_cast<Override&>(*this).Default(); }\n    bool Int(int) { return static_cast<Override&>(*this).Default(); }\n    bool Uint(unsigned) { return static_cast<Override&>(*this).Default(); }\n    bool Int64(int64_t) { return static_cast<Override&>(*this).Default(); }\n    bool Uint64(uint64_t) { return static_cast<Override&>(*this).Default(); }\n    bool Double(double) { return static_cast<Override&>(*this).Default(); }\n    /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length)\n    bool RawNumber(const Ch* str, SizeType len, bool copy) { return static_cast<Override&>(*this).String(str, len, copy); }\n    bool String(const Ch*, SizeType, bool) { return static_cast<Override&>(*this).Default(); }\n    bool StartObject() { return static_cast<Override&>(*this).Default(); }\n    bool Key(const Ch* str, SizeType len, bool copy) { return static_cast<Override&>(*this).String(str, len, copy); }\n    bool EndObject(SizeType) { return static_cast<Override&>(*this).Default(); }\n    bool StartArray() { return static_cast<Override&>(*this).Default(); }\n    bool EndArray(SizeType) { return static_cast<Override&>(*this).Default(); }\n};\n\n///////////////////////////////////////////////////////////////////////////////\n// StreamLocalCopy\n\nnamespace internal {\n\ntemplate<typename Stream, int = StreamTraits<Stream>::copyOptimization>\nclass StreamLocalCopy;\n\n//! Do copy optimization.\ntemplate<typename Stream>\nclass StreamLocalCopy<Stream, 1> {\npublic:\n    StreamLocalCopy(Stream& original) : s(original), original_(original) {}\n    ~StreamLocalCopy() { original_ = s; }\n\n    Stream s;\n\nprivate:\n    StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */;\n\n    Stream& original_;\n};\n\n//! Keep reference.\ntemplate<typename Stream>\nclass StreamLocalCopy<Stream, 0> {\npublic:\n    StreamLocalCopy(Stream& original) : s(original) {}\n\n    Stream& s;\n\nprivate:\n    StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */;\n};\n\n} // namespace internal\n\n///////////////////////////////////////////////////////////////////////////////\n// SkipWhitespace\n\n//! Skip the JSON white spaces in a stream.\n/*! \\param is A input stream for skipping white spaces.\n    \\note This function has SSE2/SSE4.2 specialization.\n*/\ntemplate<typename InputStream>\nvoid SkipWhitespace(InputStream& is) {\n    internal::StreamLocalCopy<InputStream> copy(is);\n    InputStream& s(copy.s);\n\n    typename InputStream::Ch c;\n    while ((c = s.Peek()) == ' ' || c == '\\n' || c == '\\r' || c == '\\t')\n        s.Take();\n}\n\ninline const char* SkipWhitespace(const char* p, const char* end) {\n    while (p != end && (*p == ' ' || *p == '\\n' || *p == '\\r' || *p == '\\t'))\n        ++p;\n    return p;\n}\n\n#ifdef CEREAL_RAPIDJSON_SSE42\n//! Skip whitespace with SSE 4.2 pcmpistrm instruction, testing 16 8-byte characters at once.\ninline const char *SkipWhitespace_SIMD(const char* p) {\n    // Fast return for single non-whitespace\n    if (*p == ' ' || *p == '\\n' || *p == '\\r' || *p == '\\t')\n        ++p;\n    else\n        return p;\n\n    // 16-byte align to the next boundary\n    const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & static_cast<size_t>(~15));\n    while (p != nextAligned)\n        if (*p == ' ' || *p == '\\n' || *p == '\\r' || *p == '\\t')\n            ++p;\n        else\n            return p;\n\n    // The rest of string using SIMD\n    static const char whitespace[16] = \" \\n\\r\\t\";\n    const __m128i w = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&whitespace[0]));\n\n    for (;; p += 16) {\n        const __m128i s = _mm_load_si128(reinterpret_cast<const __m128i *>(p));\n        const int r = _mm_cmpistri(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | _SIDD_NEGATIVE_POLARITY);\n        if (r != 16)    // some of characters is non-whitespace\n            return p + r;\n    }\n}\n\ninline const char *SkipWhitespace_SIMD(const char* p, const char* end) {\n    // Fast return for single non-whitespace\n    if (p != end && (*p == ' ' || *p == '\\n' || *p == '\\r' || *p == '\\t'))\n        ++p;\n    else\n        return p;\n\n    // The middle of string using SIMD\n    static const char whitespace[16] = \" \\n\\r\\t\";\n    const __m128i w = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&whitespace[0]));\n\n    for (; p <= end - 16; p += 16) {\n        const __m128i s = _mm_loadu_si128(reinterpret_cast<const __m128i *>(p));\n        const int r = _mm_cmpistri(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | _SIDD_NEGATIVE_POLARITY);\n        if (r != 16)    // some of characters is non-whitespace\n            return p + r;\n    }\n\n    return SkipWhitespace(p, end);\n}\n\n#elif defined(CEREAL_RAPIDJSON_SSE2)\n\n//! Skip whitespace with SSE2 instructions, testing 16 8-byte characters at once.\ninline const char *SkipWhitespace_SIMD(const char* p) {\n    // Fast return for single non-whitespace\n    if (*p == ' ' || *p == '\\n' || *p == '\\r' || *p == '\\t')\n        ++p;\n    else\n        return p;\n\n    // 16-byte align to the next boundary\n    const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & static_cast<size_t>(~15));\n    while (p != nextAligned)\n        if (*p == ' ' || *p == '\\n' || *p == '\\r' || *p == '\\t')\n            ++p;\n        else\n            return p;\n\n    // The rest of string\n    #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c }\n    static const char whitespaces[4][16] = { C16(' '), C16('\\n'), C16('\\r'), C16('\\t') };\n    #undef C16\n\n    const __m128i w0 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&whitespaces[0][0]));\n    const __m128i w1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&whitespaces[1][0]));\n    const __m128i w2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&whitespaces[2][0]));\n    const __m128i w3 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&whitespaces[3][0]));\n\n    for (;; p += 16) {\n        const __m128i s = _mm_load_si128(reinterpret_cast<const __m128i *>(p));\n        __m128i x = _mm_cmpeq_epi8(s, w0);\n        x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1));\n        x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2));\n        x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3));\n        unsigned short r = static_cast<unsigned short>(~_mm_movemask_epi8(x));\n        if (r != 0) {   // some of characters may be non-whitespace\n#ifdef _MSC_VER         // Find the index of first non-whitespace\n            unsigned long offset;\n            _BitScanForward(&offset, r);\n            return p + offset;\n#else\n            return p + __builtin_ffs(r) - 1;\n#endif\n        }\n    }\n}\n\ninline const char *SkipWhitespace_SIMD(const char* p, const char* end) {\n    // Fast return for single non-whitespace\n    if (p != end && (*p == ' ' || *p == '\\n' || *p == '\\r' || *p == '\\t'))\n        ++p;\n    else\n        return p;\n\n    // The rest of string\n    #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c }\n    static const char whitespaces[4][16] = { C16(' '), C16('\\n'), C16('\\r'), C16('\\t') };\n    #undef C16\n\n    const __m128i w0 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&whitespaces[0][0]));\n    const __m128i w1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&whitespaces[1][0]));\n    const __m128i w2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&whitespaces[2][0]));\n    const __m128i w3 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&whitespaces[3][0]));\n\n    for (; p <= end - 16; p += 16) {\n        const __m128i s = _mm_loadu_si128(reinterpret_cast<const __m128i *>(p));\n        __m128i x = _mm_cmpeq_epi8(s, w0);\n        x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1));\n        x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2));\n        x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3));\n        unsigned short r = static_cast<unsigned short>(~_mm_movemask_epi8(x));\n        if (r != 0) {   // some of characters may be non-whitespace\n#ifdef _MSC_VER         // Find the index of first non-whitespace\n            unsigned long offset;\n            _BitScanForward(&offset, r);\n            return p + offset;\n#else\n            return p + __builtin_ffs(r) - 1;\n#endif\n        }\n    }\n\n    return SkipWhitespace(p, end);\n}\n\n#elif defined(CEREAL_RAPIDJSON_NEON)\n\n//! Skip whitespace with ARM Neon instructions, testing 16 8-byte characters at once.\ninline const char *SkipWhitespace_SIMD(const char* p) {\n    // Fast return for single non-whitespace\n    if (*p == ' ' || *p == '\\n' || *p == '\\r' || *p == '\\t')\n        ++p;\n    else\n        return p;\n\n    // 16-byte align to the next boundary\n    const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & static_cast<size_t>(~15));\n    while (p != nextAligned)\n        if (*p == ' ' || *p == '\\n' || *p == '\\r' || *p == '\\t')\n            ++p;\n        else\n            return p;\n\n    const uint8x16_t w0 = vmovq_n_u8(' ');\n    const uint8x16_t w1 = vmovq_n_u8('\\n');\n    const uint8x16_t w2 = vmovq_n_u8('\\r');\n    const uint8x16_t w3 = vmovq_n_u8('\\t');\n\n    for (;; p += 16) {\n        const uint8x16_t s = vld1q_u8(reinterpret_cast<const uint8_t *>(p));\n        uint8x16_t x = vceqq_u8(s, w0);\n        x = vorrq_u8(x, vceqq_u8(s, w1));\n        x = vorrq_u8(x, vceqq_u8(s, w2));\n        x = vorrq_u8(x, vceqq_u8(s, w3));\n\n        x = vmvnq_u8(x);                       // Negate\n        x = vrev64q_u8(x);                     // Rev in 64\n        uint64_t low = vgetq_lane_u64(reinterpret_cast<uint64x2_t>(x), 0);   // extract\n        uint64_t high = vgetq_lane_u64(reinterpret_cast<uint64x2_t>(x), 1);  // extract\n\n        if (low == 0) {\n            if (high != 0) {\n                int lz =__builtin_clzll(high);;\n                return p + 8 + (lz >> 3);\n            }\n        } else {\n            int lz = __builtin_clzll(low);;\n            return p + (lz >> 3);\n        }\n    }\n}\n\ninline const char *SkipWhitespace_SIMD(const char* p, const char* end) {\n    // Fast return for single non-whitespace\n    if (p != end && (*p == ' ' || *p == '\\n' || *p == '\\r' || *p == '\\t'))\n        ++p;\n    else\n        return p;\n\n    const uint8x16_t w0 = vmovq_n_u8(' ');\n    const uint8x16_t w1 = vmovq_n_u8('\\n');\n    const uint8x16_t w2 = vmovq_n_u8('\\r');\n    const uint8x16_t w3 = vmovq_n_u8('\\t');\n\n    for (; p <= end - 16; p += 16) {\n        const uint8x16_t s = vld1q_u8(reinterpret_cast<const uint8_t *>(p));\n        uint8x16_t x = vceqq_u8(s, w0);\n        x = vorrq_u8(x, vceqq_u8(s, w1));\n        x = vorrq_u8(x, vceqq_u8(s, w2));\n        x = vorrq_u8(x, vceqq_u8(s, w3));\n\n        x = vmvnq_u8(x);                       // Negate\n        x = vrev64q_u8(x);                     // Rev in 64\n        uint64_t low = vgetq_lane_u64(reinterpret_cast<uint64x2_t>(x), 0);   // extract\n        uint64_t high = vgetq_lane_u64(reinterpret_cast<uint64x2_t>(x), 1);  // extract\n\n        if (low == 0) {\n            if (high != 0) {\n                int lz = __builtin_clzll(high);\n                return p + 8 + (lz >> 3);\n            }\n        } else {\n            int lz = __builtin_clzll(low);\n            return p + (lz >> 3);\n        }\n    }\n\n    return SkipWhitespace(p, end);\n}\n\n#endif // CEREAL_RAPIDJSON_NEON\n\n#ifdef CEREAL_RAPIDJSON_SIMD\n//! Template function specialization for InsituStringStream\ntemplate<> inline void SkipWhitespace(InsituStringStream& is) {\n    is.src_ = const_cast<char*>(SkipWhitespace_SIMD(is.src_));\n}\n\n//! Template function specialization for StringStream\ntemplate<> inline void SkipWhitespace(StringStream& is) {\n    is.src_ = SkipWhitespace_SIMD(is.src_);\n}\n\ntemplate<> inline void SkipWhitespace(EncodedInputStream<UTF8<>, MemoryStream>& is) {\n    is.is_.src_ = SkipWhitespace_SIMD(is.is_.src_, is.is_.end_);\n}\n#endif // CEREAL_RAPIDJSON_SIMD\n\n///////////////////////////////////////////////////////////////////////////////\n// GenericReader\n\n//! SAX-style JSON parser. Use \\ref Reader for UTF8 encoding and default allocator.\n/*! GenericReader parses JSON text from a stream, and send events synchronously to an\n    object implementing Handler concept.\n\n    It needs to allocate a stack for storing a single decoded string during\n    non-destructive parsing.\n\n    For in-situ parsing, the decoded string is directly written to the source\n    text string, no temporary buffer is required.\n\n    A GenericReader object can be reused for parsing multiple JSON text.\n\n    \\tparam SourceEncoding Encoding of the input stream.\n    \\tparam TargetEncoding Encoding of the parse output.\n    \\tparam StackAllocator Allocator type for stack.\n*/\ntemplate <typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>\nclass GenericReader {\npublic:\n    typedef typename SourceEncoding::Ch Ch; //!< SourceEncoding character type\n\n    //! Constructor.\n    /*! \\param stackAllocator Optional allocator for allocating stack memory. (Only use for non-destructive parsing)\n        \\param stackCapacity stack capacity in bytes for storing a single decoded string.  (Only use for non-destructive parsing)\n    */\n    GenericReader(StackAllocator* stackAllocator = 0, size_t stackCapacity = kDefaultStackCapacity) :\n        stack_(stackAllocator, stackCapacity), parseResult_(), state_(IterativeParsingStartState) {}\n\n    //! Parse JSON text.\n    /*! \\tparam parseFlags Combination of \\ref ParseFlag.\n        \\tparam InputStream Type of input stream, implementing Stream concept.\n        \\tparam Handler Type of handler, implementing Handler concept.\n        \\param is Input stream to be parsed.\n        \\param handler The handler to receive events.\n        \\return Whether the parsing is successful.\n    */\n    template <unsigned parseFlags, typename InputStream, typename Handler>\n    ParseResult Parse(InputStream& is, Handler& handler) {\n        if (parseFlags & kParseIterativeFlag)\n            return IterativeParse<parseFlags>(is, handler);\n\n        parseResult_.Clear();\n\n        ClearStackOnExit scope(*this);\n\n        SkipWhitespaceAndComments<parseFlags>(is);\n        CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);\n\n        if (CEREAL_RAPIDJSON_UNLIKELY(is.Peek() == '\\0')) {\n            CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentEmpty, is.Tell());\n            CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);\n        }\n        else {\n            ParseValue<parseFlags>(is, handler);\n            CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);\n\n            if (!(parseFlags & kParseStopWhenDoneFlag)) {\n                SkipWhitespaceAndComments<parseFlags>(is);\n                CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);\n\n                if (CEREAL_RAPIDJSON_UNLIKELY(is.Peek() != '\\0')) {\n                    CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentRootNotSingular, is.Tell());\n                    CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);\n                }\n            }\n        }\n\n        return parseResult_;\n    }\n\n    //! Parse JSON text (with \\ref kParseDefaultFlags)\n    /*! \\tparam InputStream Type of input stream, implementing Stream concept\n        \\tparam Handler Type of handler, implementing Handler concept.\n        \\param is Input stream to be parsed.\n        \\param handler The handler to receive events.\n        \\return Whether the parsing is successful.\n    */\n    template <typename InputStream, typename Handler>\n    ParseResult Parse(InputStream& is, Handler& handler) {\n        return Parse<kParseDefaultFlags>(is, handler);\n    }\n\n    //! Initialize JSON text token-by-token parsing\n    /*!\n     */\n    void IterativeParseInit() {\n        parseResult_.Clear();\n        state_ = IterativeParsingStartState;\n    }\n\n    //! Parse one token from JSON text\n    /*! \\tparam InputStream Type of input stream, implementing Stream concept\n        \\tparam Handler Type of handler, implementing Handler concept.\n        \\param is Input stream to be parsed.\n        \\param handler The handler to receive events.\n        \\return Whether the parsing is successful.\n     */\n    template <unsigned parseFlags, typename InputStream, typename Handler>\n    bool IterativeParseNext(InputStream& is, Handler& handler) {\n        while (CEREAL_RAPIDJSON_LIKELY(is.Peek() != '\\0')) {\n            SkipWhitespaceAndComments<parseFlags>(is);\n\n            Token t = Tokenize(is.Peek());\n            IterativeParsingState n = Predict(state_, t);\n            IterativeParsingState d = Transit<parseFlags>(state_, t, n, is, handler);\n\n            // If we've finished or hit an error...\n            if (CEREAL_RAPIDJSON_UNLIKELY(IsIterativeParsingCompleteState(d))) {\n                // Report errors.\n                if (d == IterativeParsingErrorState) {\n                    HandleError(state_, is);\n                    return false;\n                }\n\n                // Transition to the finish state.\n                CEREAL_RAPIDJSON_ASSERT(d == IterativeParsingFinishState);\n                state_ = d;\n\n                // If StopWhenDone is not set...\n                if (!(parseFlags & kParseStopWhenDoneFlag)) {\n                    // ... and extra non-whitespace data is found...\n                    SkipWhitespaceAndComments<parseFlags>(is);\n                    if (is.Peek() != '\\0') {\n                        // ... this is considered an error.\n                        HandleError(state_, is);\n                        return false;\n                    }\n                }\n\n                // Success! We are done!\n                return true;\n            }\n\n            // Transition to the new state.\n            state_ = d;\n\n            // If we parsed anything other than a delimiter, we invoked the handler, so we can return true now.\n            if (!IsIterativeParsingDelimiterState(n))\n                return true;\n        }\n\n        // We reached the end of file.\n        stack_.Clear();\n\n        if (state_ != IterativeParsingFinishState) {\n            HandleError(state_, is);\n            return false;\n        }\n\n        return true;\n    }\n\n    //! Check if token-by-token parsing JSON text is complete\n    /*! \\return Whether the JSON has been fully decoded.\n     */\n    CEREAL_RAPIDJSON_FORCEINLINE bool IterativeParseComplete() const {\n        return IsIterativeParsingCompleteState(state_);\n    }\n\n    //! Whether a parse error has occurred in the last parsing.\n    bool HasParseError() const { return parseResult_.IsError(); }\n\n    //! Get the \\ref ParseErrorCode of last parsing.\n    ParseErrorCode GetParseErrorCode() const { return parseResult_.Code(); }\n\n    //! Get the position of last parsing error in input, 0 otherwise.\n    size_t GetErrorOffset() const { return parseResult_.Offset(); }\n\nprotected:\n    void SetParseError(ParseErrorCode code, size_t offset) { parseResult_.Set(code, offset); }\n\nprivate:\n    // Prohibit copy constructor & assignment operator.\n    GenericReader(const GenericReader&);\n    GenericReader& operator=(const GenericReader&);\n\n    void ClearStack() { stack_.Clear(); }\n\n    // clear stack on any exit from ParseStream, e.g. due to exception\n    struct ClearStackOnExit {\n        explicit ClearStackOnExit(GenericReader& r) : r_(r) {}\n        ~ClearStackOnExit() { r_.ClearStack(); }\n    private:\n        GenericReader& r_;\n        ClearStackOnExit(const ClearStackOnExit&);\n        ClearStackOnExit& operator=(const ClearStackOnExit&);\n    };\n\n    template<unsigned parseFlags, typename InputStream>\n    void SkipWhitespaceAndComments(InputStream& is) {\n        SkipWhitespace(is);\n\n        if (parseFlags & kParseCommentsFlag) {\n            while (CEREAL_RAPIDJSON_UNLIKELY(Consume(is, '/'))) {\n                if (Consume(is, '*')) {\n                    while (true) {\n                        if (CEREAL_RAPIDJSON_UNLIKELY(is.Peek() == '\\0'))\n                            CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell());\n                        else if (Consume(is, '*')) {\n                            if (Consume(is, '/'))\n                                break;\n                        }\n                        else\n                            is.Take();\n                    }\n                }\n                else if (CEREAL_RAPIDJSON_LIKELY(Consume(is, '/')))\n                    while (is.Peek() != '\\0' && is.Take() != '\\n') {}\n                else\n                    CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell());\n\n                SkipWhitespace(is);\n            }\n        }\n    }\n\n    // Parse object: { string : value, ... }\n    template<unsigned parseFlags, typename InputStream, typename Handler>\n    void ParseObject(InputStream& is, Handler& handler) {\n        CEREAL_RAPIDJSON_ASSERT(is.Peek() == '{');\n        is.Take();  // Skip '{'\n\n        if (CEREAL_RAPIDJSON_UNLIKELY(!handler.StartObject()))\n            CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell());\n\n        SkipWhitespaceAndComments<parseFlags>(is);\n        CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;\n\n        if (Consume(is, '}')) {\n            if (CEREAL_RAPIDJSON_UNLIKELY(!handler.EndObject(0)))  // empty object\n                CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell());\n            return;\n        }\n\n        for (SizeType memberCount = 0;;) {\n            if (CEREAL_RAPIDJSON_UNLIKELY(is.Peek() != '\"'))\n                CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell());\n\n            ParseString<parseFlags>(is, handler, true);\n            CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;\n\n            SkipWhitespaceAndComments<parseFlags>(is);\n            CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;\n\n            if (CEREAL_RAPIDJSON_UNLIKELY(!Consume(is, ':')))\n                CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell());\n\n            SkipWhitespaceAndComments<parseFlags>(is);\n            CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;\n\n            ParseValue<parseFlags>(is, handler);\n            CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;\n\n            SkipWhitespaceAndComments<parseFlags>(is);\n            CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;\n\n            ++memberCount;\n\n            switch (is.Peek()) {\n                case ',':\n                    is.Take();\n                    SkipWhitespaceAndComments<parseFlags>(is);\n                    CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;\n                    break;\n                case '}':\n                    is.Take();\n                    if (CEREAL_RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount)))\n                        CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell());\n                    return;\n                default:\n                    CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); break; // This useless break is only for making warning and coverage happy\n            }\n\n            if (parseFlags & kParseTrailingCommasFlag) {\n                if (is.Peek() == '}') {\n                    if (CEREAL_RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount)))\n                        CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell());\n                    is.Take();\n                    return;\n                }\n            }\n        }\n    }\n\n    // Parse array: [ value, ... ]\n    template<unsigned parseFlags, typename InputStream, typename Handler>\n    void ParseArray(InputStream& is, Handler& handler) {\n        CEREAL_RAPIDJSON_ASSERT(is.Peek() == '[');\n        is.Take();  // Skip '['\n\n        if (CEREAL_RAPIDJSON_UNLIKELY(!handler.StartArray()))\n            CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell());\n\n        SkipWhitespaceAndComments<parseFlags>(is);\n        CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;\n\n        if (Consume(is, ']')) {\n            if (CEREAL_RAPIDJSON_UNLIKELY(!handler.EndArray(0))) // empty array\n                CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell());\n            return;\n        }\n\n        for (SizeType elementCount = 0;;) {\n            ParseValue<parseFlags>(is, handler);\n            CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;\n\n            ++elementCount;\n            SkipWhitespaceAndComments<parseFlags>(is);\n            CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;\n\n            if (Consume(is, ',')) {\n                SkipWhitespaceAndComments<parseFlags>(is);\n                CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;\n            }\n            else if (Consume(is, ']')) {\n                if (CEREAL_RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount)))\n                    CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell());\n                return;\n            }\n            else\n                CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell());\n\n            if (parseFlags & kParseTrailingCommasFlag) {\n                if (is.Peek() == ']') {\n                    if (CEREAL_RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount)))\n                        CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell());\n                    is.Take();\n                    return;\n                }\n            }\n        }\n    }\n\n    template<unsigned parseFlags, typename InputStream, typename Handler>\n    void ParseNull(InputStream& is, Handler& handler) {\n        CEREAL_RAPIDJSON_ASSERT(is.Peek() == 'n');\n        is.Take();\n\n        if (CEREAL_RAPIDJSON_LIKELY(Consume(is, 'u') && Consume(is, 'l') && Consume(is, 'l'))) {\n            if (CEREAL_RAPIDJSON_UNLIKELY(!handler.Null()))\n                CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell());\n        }\n        else\n            CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell());\n    }\n\n    template<unsigned parseFlags, typename InputStream, typename Handler>\n    void ParseTrue(InputStream& is, Handler& handler) {\n        CEREAL_RAPIDJSON_ASSERT(is.Peek() == 't');\n        is.Take();\n\n        if (CEREAL_RAPIDJSON_LIKELY(Consume(is, 'r') && Consume(is, 'u') && Consume(is, 'e'))) {\n            if (CEREAL_RAPIDJSON_UNLIKELY(!handler.Bool(true)))\n                CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell());\n        }\n        else\n            CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell());\n    }\n\n    template<unsigned parseFlags, typename InputStream, typename Handler>\n    void ParseFalse(InputStream& is, Handler& handler) {\n        CEREAL_RAPIDJSON_ASSERT(is.Peek() == 'f');\n        is.Take();\n\n        if (CEREAL_RAPIDJSON_LIKELY(Consume(is, 'a') && Consume(is, 'l') && Consume(is, 's') && Consume(is, 'e'))) {\n            if (CEREAL_RAPIDJSON_UNLIKELY(!handler.Bool(false)))\n                CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell());\n        }\n        else\n            CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell());\n    }\n\n    template<typename InputStream>\n    CEREAL_RAPIDJSON_FORCEINLINE static bool Consume(InputStream& is, typename InputStream::Ch expect) {\n        if (CEREAL_RAPIDJSON_LIKELY(is.Peek() == expect)) {\n            is.Take();\n            return true;\n        }\n        else\n            return false;\n    }\n\n    // Helper function to parse four hexadecimal digits in \\uXXXX in ParseString().\n    template<typename InputStream>\n    unsigned ParseHex4(InputStream& is, size_t escapeOffset) {\n        unsigned codepoint = 0;\n        for (int i = 0; i < 4; i++) {\n            Ch c = is.Peek();\n            codepoint <<= 4;\n            codepoint += static_cast<unsigned>(c);\n            if (c >= '0' && c <= '9')\n                codepoint -= '0';\n            else if (c >= 'A' && c <= 'F')\n                codepoint -= 'A' - 10;\n            else if (c >= 'a' && c <= 'f')\n                codepoint -= 'a' - 10;\n            else {\n                CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorStringUnicodeEscapeInvalidHex, escapeOffset);\n                CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0);\n            }\n            is.Take();\n        }\n        return codepoint;\n    }\n\n    template <typename CharType>\n    class StackStream {\n    public:\n        typedef CharType Ch;\n\n        StackStream(internal::Stack<StackAllocator>& stack) : stack_(stack), length_(0) {}\n        CEREAL_RAPIDJSON_FORCEINLINE void Put(Ch c) {\n            *stack_.template Push<Ch>() = c;\n            ++length_;\n        }\n\n        CEREAL_RAPIDJSON_FORCEINLINE void* Push(SizeType count) {\n            length_ += count;\n            return stack_.template Push<Ch>(count);\n        }\n\n        size_t Length() const { return length_; }\n\n        Ch* Pop() {\n            return stack_.template Pop<Ch>(length_);\n        }\n\n    private:\n        StackStream(const StackStream&);\n        StackStream& operator=(const StackStream&);\n\n        internal::Stack<StackAllocator>& stack_;\n        SizeType length_;\n    };\n\n    // Parse string and generate String event. Different code paths for kParseInsituFlag.\n    template<unsigned parseFlags, typename InputStream, typename Handler>\n    void ParseString(InputStream& is, Handler& handler, bool isKey = false) {\n        internal::StreamLocalCopy<InputStream> copy(is);\n        InputStream& s(copy.s);\n\n        CEREAL_RAPIDJSON_ASSERT(s.Peek() == '\\\"');\n        s.Take();  // Skip '\\\"'\n\n        bool success = false;\n        if (parseFlags & kParseInsituFlag) {\n            typename InputStream::Ch *head = s.PutBegin();\n            ParseStringToStream<parseFlags, SourceEncoding, SourceEncoding>(s, s);\n            CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;\n            size_t length = s.PutEnd(head) - 1;\n            CEREAL_RAPIDJSON_ASSERT(length <= 0xFFFFFFFF);\n            const typename TargetEncoding::Ch* const str = reinterpret_cast<typename TargetEncoding::Ch*>(head);\n            success = (isKey ? handler.Key(str, SizeType(length), false) : handler.String(str, SizeType(length), false));\n        }\n        else {\n            StackStream<typename TargetEncoding::Ch> stackStream(stack_);\n            ParseStringToStream<parseFlags, SourceEncoding, TargetEncoding>(s, stackStream);\n            CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;\n            SizeType length = static_cast<SizeType>(stackStream.Length()) - 1;\n            const typename TargetEncoding::Ch* const str = stackStream.Pop();\n            success = (isKey ? handler.Key(str, length, true) : handler.String(str, length, true));\n        }\n        if (CEREAL_RAPIDJSON_UNLIKELY(!success))\n            CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell());\n    }\n\n    // Parse string to an output is\n    // This function handles the prefix/suffix double quotes, escaping, and optional encoding validation.\n    template<unsigned parseFlags, typename SEncoding, typename TEncoding, typename InputStream, typename OutputStream>\n    CEREAL_RAPIDJSON_FORCEINLINE void ParseStringToStream(InputStream& is, OutputStream& os) {\n//!@cond CEREAL_RAPIDJSON_HIDDEN_FROM_DOXYGEN\n#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n        static const char escape[256] = {\n            Z16, Z16, 0, 0,'\\\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'/',\n            Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\\\', 0, 0, 0,\n            0, 0,'\\b', 0, 0, 0,'\\f', 0, 0, 0, 0, 0, 0, 0,'\\n', 0,\n            0, 0,'\\r', 0,'\\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16\n        };\n#undef Z16\n//!@endcond\n\n        for (;;) {\n            // Scan and copy string before \"\\\\\\\"\" or < 0x20. This is an optional optimzation.\n            if (!(parseFlags & kParseValidateEncodingFlag))\n                ScanCopyUnescapedString(is, os);\n\n            Ch c = is.Peek();\n            if (CEREAL_RAPIDJSON_UNLIKELY(c == '\\\\')) {    // Escape\n                size_t escapeOffset = is.Tell();    // For invalid escaping, report the initial '\\\\' as error offset\n                is.Take();\n                Ch e = is.Peek();\n                if ((sizeof(Ch) == 1 || unsigned(e) < 256) && CEREAL_RAPIDJSON_LIKELY(escape[static_cast<unsigned char>(e)])) {\n                    is.Take();\n                    os.Put(static_cast<typename TEncoding::Ch>(escape[static_cast<unsigned char>(e)]));\n                }\n                else if (CEREAL_RAPIDJSON_LIKELY(e == 'u')) {    // Unicode\n                    is.Take();\n                    unsigned codepoint = ParseHex4(is, escapeOffset);\n                    CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;\n                    if (CEREAL_RAPIDJSON_UNLIKELY(codepoint >= 0xD800 && codepoint <= 0xDBFF)) {\n                        // Handle UTF-16 surrogate pair\n                        if (CEREAL_RAPIDJSON_UNLIKELY(!Consume(is, '\\\\') || !Consume(is, 'u')))\n                            CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset);\n                        unsigned codepoint2 = ParseHex4(is, escapeOffset);\n                        CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;\n                        if (CEREAL_RAPIDJSON_UNLIKELY(codepoint2 < 0xDC00 || codepoint2 > 0xDFFF))\n                            CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset);\n                        codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000;\n                    }\n                    TEncoding::Encode(os, codepoint);\n                }\n                else\n                    CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, escapeOffset);\n            }\n            else if (CEREAL_RAPIDJSON_UNLIKELY(c == '\"')) {    // Closing double quote\n                is.Take();\n                os.Put('\\0');   // null-terminate the string\n                return;\n            }\n            else if (CEREAL_RAPIDJSON_UNLIKELY(static_cast<unsigned>(c) < 0x20)) { // RFC 4627: unescaped = %x20-21 / %x23-5B / %x5D-10FFFF\n                if (c == '\\0')\n                    CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorStringMissQuotationMark, is.Tell());\n                else\n                    CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, is.Tell());\n            }\n            else {\n                size_t offset = is.Tell();\n                if (CEREAL_RAPIDJSON_UNLIKELY((parseFlags & kParseValidateEncodingFlag ?\n                    !Transcoder<SEncoding, TEncoding>::Validate(is, os) :\n                    !Transcoder<SEncoding, TEncoding>::Transcode(is, os))))\n                    CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, offset);\n            }\n        }\n    }\n\n    template<typename InputStream, typename OutputStream>\n    static CEREAL_RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InputStream&, OutputStream&) {\n            // Do nothing for generic version\n    }\n\n#if defined(CEREAL_RAPIDJSON_SSE2) || defined(CEREAL_RAPIDJSON_SSE42)\n    // StringStream -> StackStream<char>\n    static CEREAL_RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(StringStream& is, StackStream<char>& os) {\n        const char* p = is.src_;\n\n        // Scan one by one until alignment (unaligned load may cross page boundary and cause crash)\n        const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & static_cast<size_t>(~15));\n        while (p != nextAligned)\n            if (CEREAL_RAPIDJSON_UNLIKELY(*p == '\\\"') || CEREAL_RAPIDJSON_UNLIKELY(*p == '\\\\') || CEREAL_RAPIDJSON_UNLIKELY(static_cast<unsigned>(*p) < 0x20)) {\n                is.src_ = p;\n                return;\n            }\n            else\n                os.Put(*p++);\n\n        // The rest of string using SIMD\n        static const char dquote[16] = { '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"' };\n        static const char bslash[16] = { '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\' };\n        static const char space[16]  = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F };\n        const __m128i dq = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&dquote[0]));\n        const __m128i bs = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&bslash[0]));\n        const __m128i sp = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&space[0]));\n\n        for (;; p += 16) {\n            const __m128i s = _mm_load_si128(reinterpret_cast<const __m128i *>(p));\n            const __m128i t1 = _mm_cmpeq_epi8(s, dq);\n            const __m128i t2 = _mm_cmpeq_epi8(s, bs);\n            const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F\n            const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3);\n            unsigned short r = static_cast<unsigned short>(_mm_movemask_epi8(x));\n            if (CEREAL_RAPIDJSON_UNLIKELY(r != 0)) {   // some of characters is escaped\n                SizeType length;\n    #ifdef _MSC_VER         // Find the index of first escaped\n                unsigned long offset;\n                _BitScanForward(&offset, r);\n                length = offset;\n    #else\n                length = static_cast<SizeType>(__builtin_ffs(r) - 1);\n    #endif\n                if (length != 0) {\n                    char* q = reinterpret_cast<char*>(os.Push(length));\n                    for (size_t i = 0; i < length; i++)\n                        q[i] = p[i];\n\n                    p += length;\n                }\n                break;\n            }\n            _mm_storeu_si128(reinterpret_cast<__m128i *>(os.Push(16)), s);\n        }\n\n        is.src_ = p;\n    }\n\n    // InsituStringStream -> InsituStringStream\n    static CEREAL_RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) {\n        CEREAL_RAPIDJSON_ASSERT(&is == &os);\n        (void)os;\n\n        if (is.src_ == is.dst_) {\n            SkipUnescapedString(is);\n            return;\n        }\n\n        char* p = is.src_;\n        char *q = is.dst_;\n\n        // Scan one by one until alignment (unaligned load may cross page boundary and cause crash)\n        const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & static_cast<size_t>(~15));\n        while (p != nextAligned)\n            if (CEREAL_RAPIDJSON_UNLIKELY(*p == '\\\"') || CEREAL_RAPIDJSON_UNLIKELY(*p == '\\\\') || CEREAL_RAPIDJSON_UNLIKELY(static_cast<unsigned>(*p) < 0x20)) {\n                is.src_ = p;\n                is.dst_ = q;\n                return;\n            }\n            else\n                *q++ = *p++;\n\n        // The rest of string using SIMD\n        static const char dquote[16] = { '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"' };\n        static const char bslash[16] = { '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\' };\n        static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F };\n        const __m128i dq = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&dquote[0]));\n        const __m128i bs = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&bslash[0]));\n        const __m128i sp = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&space[0]));\n\n        for (;; p += 16, q += 16) {\n            const __m128i s = _mm_load_si128(reinterpret_cast<const __m128i *>(p));\n            const __m128i t1 = _mm_cmpeq_epi8(s, dq);\n            const __m128i t2 = _mm_cmpeq_epi8(s, bs);\n            const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F\n            const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3);\n            unsigned short r = static_cast<unsigned short>(_mm_movemask_epi8(x));\n            if (CEREAL_RAPIDJSON_UNLIKELY(r != 0)) {   // some of characters is escaped\n                size_t length;\n#ifdef _MSC_VER         // Find the index of first escaped\n                unsigned long offset;\n                _BitScanForward(&offset, r);\n                length = offset;\n#else\n                length = static_cast<size_t>(__builtin_ffs(r) - 1);\n#endif\n                for (const char* pend = p + length; p != pend; )\n                    *q++ = *p++;\n                break;\n            }\n            _mm_storeu_si128(reinterpret_cast<__m128i *>(q), s);\n        }\n\n        is.src_ = p;\n        is.dst_ = q;\n    }\n\n    // When read/write pointers are the same for insitu stream, just skip unescaped characters\n    static CEREAL_RAPIDJSON_FORCEINLINE void SkipUnescapedString(InsituStringStream& is) {\n        CEREAL_RAPIDJSON_ASSERT(is.src_ == is.dst_);\n        char* p = is.src_;\n\n        // Scan one by one until alignment (unaligned load may cross page boundary and cause crash)\n        const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & static_cast<size_t>(~15));\n        for (; p != nextAligned; p++)\n            if (CEREAL_RAPIDJSON_UNLIKELY(*p == '\\\"') || CEREAL_RAPIDJSON_UNLIKELY(*p == '\\\\') || CEREAL_RAPIDJSON_UNLIKELY(static_cast<unsigned>(*p) < 0x20)) {\n                is.src_ = is.dst_ = p;\n                return;\n            }\n\n        // The rest of string using SIMD\n        static const char dquote[16] = { '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"' };\n        static const char bslash[16] = { '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\' };\n        static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F };\n        const __m128i dq = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&dquote[0]));\n        const __m128i bs = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&bslash[0]));\n        const __m128i sp = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&space[0]));\n\n        for (;; p += 16) {\n            const __m128i s = _mm_load_si128(reinterpret_cast<const __m128i *>(p));\n            const __m128i t1 = _mm_cmpeq_epi8(s, dq);\n            const __m128i t2 = _mm_cmpeq_epi8(s, bs);\n            const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F\n            const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3);\n            unsigned short r = static_cast<unsigned short>(_mm_movemask_epi8(x));\n            if (CEREAL_RAPIDJSON_UNLIKELY(r != 0)) {   // some of characters is escaped\n                size_t length;\n#ifdef _MSC_VER         // Find the index of first escaped\n                unsigned long offset;\n                _BitScanForward(&offset, r);\n                length = offset;\n#else\n                length = static_cast<size_t>(__builtin_ffs(r) - 1);\n#endif\n                p += length;\n                break;\n            }\n        }\n\n        is.src_ = is.dst_ = p;\n    }\n#elif defined(CEREAL_RAPIDJSON_NEON)\n    // StringStream -> StackStream<char>\n    static CEREAL_RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(StringStream& is, StackStream<char>& os) {\n        const char* p = is.src_;\n\n        // Scan one by one until alignment (unaligned load may cross page boundary and cause crash)\n        const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & static_cast<size_t>(~15));\n        while (p != nextAligned)\n            if (CEREAL_RAPIDJSON_UNLIKELY(*p == '\\\"') || CEREAL_RAPIDJSON_UNLIKELY(*p == '\\\\') || CEREAL_RAPIDJSON_UNLIKELY(static_cast<unsigned>(*p) < 0x20)) {\n                is.src_ = p;\n                return;\n            }\n            else\n                os.Put(*p++);\n\n        // The rest of string using SIMD\n        const uint8x16_t s0 = vmovq_n_u8('\"');\n        const uint8x16_t s1 = vmovq_n_u8('\\\\');\n        const uint8x16_t s2 = vmovq_n_u8('\\b');\n        const uint8x16_t s3 = vmovq_n_u8(32);\n\n        for (;; p += 16) {\n            const uint8x16_t s = vld1q_u8(reinterpret_cast<const uint8_t *>(p));\n            uint8x16_t x = vceqq_u8(s, s0);\n            x = vorrq_u8(x, vceqq_u8(s, s1));\n            x = vorrq_u8(x, vceqq_u8(s, s2));\n            x = vorrq_u8(x, vcltq_u8(s, s3));\n\n            x = vrev64q_u8(x);                     // Rev in 64\n            uint64_t low = vgetq_lane_u64(reinterpret_cast<uint64x2_t>(x), 0);   // extract\n            uint64_t high = vgetq_lane_u64(reinterpret_cast<uint64x2_t>(x), 1);  // extract\n\n            SizeType length = 0;\n            bool escaped = false;\n            if (low == 0) {\n                if (high != 0) {\n                    unsigned lz = (unsigned)__builtin_clzll(high);;\n                    length = 8 + (lz >> 3);\n                    escaped = true;\n                }\n            } else {\n                unsigned lz = (unsigned)__builtin_clzll(low);;\n                length = lz >> 3;\n                escaped = true;\n            }\n            if (CEREAL_RAPIDJSON_UNLIKELY(escaped)) {   // some of characters is escaped\n                if (length != 0) {\n                    char* q = reinterpret_cast<char*>(os.Push(length));\n                    for (size_t i = 0; i < length; i++)\n                        q[i] = p[i];\n\n                    p += length;\n                }\n                break;\n            }\n            vst1q_u8(reinterpret_cast<uint8_t *>(os.Push(16)), s);\n        }\n\n        is.src_ = p;\n    }\n\n    // InsituStringStream -> InsituStringStream\n    static CEREAL_RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) {\n        CEREAL_RAPIDJSON_ASSERT(&is == &os);\n        (void)os;\n\n        if (is.src_ == is.dst_) {\n            SkipUnescapedString(is);\n            return;\n        }\n\n        char* p = is.src_;\n        char *q = is.dst_;\n\n        // Scan one by one until alignment (unaligned load may cross page boundary and cause crash)\n        const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & static_cast<size_t>(~15));\n        while (p != nextAligned)\n            if (CEREAL_RAPIDJSON_UNLIKELY(*p == '\\\"') || CEREAL_RAPIDJSON_UNLIKELY(*p == '\\\\') || CEREAL_RAPIDJSON_UNLIKELY(static_cast<unsigned>(*p) < 0x20)) {\n                is.src_ = p;\n                is.dst_ = q;\n                return;\n            }\n            else\n                *q++ = *p++;\n\n        // The rest of string using SIMD\n        const uint8x16_t s0 = vmovq_n_u8('\"');\n        const uint8x16_t s1 = vmovq_n_u8('\\\\');\n        const uint8x16_t s2 = vmovq_n_u8('\\b');\n        const uint8x16_t s3 = vmovq_n_u8(32);\n\n        for (;; p += 16, q += 16) {\n            const uint8x16_t s = vld1q_u8(reinterpret_cast<uint8_t *>(p));\n            uint8x16_t x = vceqq_u8(s, s0);\n            x = vorrq_u8(x, vceqq_u8(s, s1));\n            x = vorrq_u8(x, vceqq_u8(s, s2));\n            x = vorrq_u8(x, vcltq_u8(s, s3));\n\n            x = vrev64q_u8(x);                     // Rev in 64\n            uint64_t low = vgetq_lane_u64(reinterpret_cast<uint64x2_t>(x), 0);   // extract\n            uint64_t high = vgetq_lane_u64(reinterpret_cast<uint64x2_t>(x), 1);  // extract\n\n            SizeType length = 0;\n            bool escaped = false;\n            if (low == 0) {\n                if (high != 0) {\n                    unsigned lz = (unsigned)__builtin_clzll(high);\n                    length = 8 + (lz >> 3);\n                    escaped = true;\n                }\n            } else {\n                unsigned lz = (unsigned)__builtin_clzll(low);\n                length = lz >> 3;\n                escaped = true;\n            }\n            if (CEREAL_RAPIDJSON_UNLIKELY(escaped)) {   // some of characters is escaped\n                for (const char* pend = p + length; p != pend; ) {\n                    *q++ = *p++;\n                }\n                break;\n            }\n            vst1q_u8(reinterpret_cast<uint8_t *>(q), s);\n        }\n\n        is.src_ = p;\n        is.dst_ = q;\n    }\n\n    // When read/write pointers are the same for insitu stream, just skip unescaped characters\n    static CEREAL_RAPIDJSON_FORCEINLINE void SkipUnescapedString(InsituStringStream& is) {\n        CEREAL_RAPIDJSON_ASSERT(is.src_ == is.dst_);\n        char* p = is.src_;\n\n        // Scan one by one until alignment (unaligned load may cross page boundary and cause crash)\n        const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & static_cast<size_t>(~15));\n        for (; p != nextAligned; p++)\n            if (CEREAL_RAPIDJSON_UNLIKELY(*p == '\\\"') || CEREAL_RAPIDJSON_UNLIKELY(*p == '\\\\') || CEREAL_RAPIDJSON_UNLIKELY(static_cast<unsigned>(*p) < 0x20)) {\n                is.src_ = is.dst_ = p;\n                return;\n            }\n\n        // The rest of string using SIMD\n        const uint8x16_t s0 = vmovq_n_u8('\"');\n        const uint8x16_t s1 = vmovq_n_u8('\\\\');\n        const uint8x16_t s2 = vmovq_n_u8('\\b');\n        const uint8x16_t s3 = vmovq_n_u8(32);\n\n        for (;; p += 16) {\n            const uint8x16_t s = vld1q_u8(reinterpret_cast<uint8_t *>(p));\n            uint8x16_t x = vceqq_u8(s, s0);\n            x = vorrq_u8(x, vceqq_u8(s, s1));\n            x = vorrq_u8(x, vceqq_u8(s, s2));\n            x = vorrq_u8(x, vcltq_u8(s, s3));\n\n            x = vrev64q_u8(x);                     // Rev in 64\n            uint64_t low = vgetq_lane_u64(reinterpret_cast<uint64x2_t>(x), 0);   // extract\n            uint64_t high = vgetq_lane_u64(reinterpret_cast<uint64x2_t>(x), 1);  // extract\n\n            if (low == 0) {\n                if (high != 0) {\n                    int lz = __builtin_clzll(high);\n                    p += 8 + (lz >> 3);\n                    break;\n                }\n            } else {\n                int lz = __builtin_clzll(low);\n                p += lz >> 3;\n                break;\n            }\n        }\n\n        is.src_ = is.dst_ = p;\n    }\n#endif // CEREAL_RAPIDJSON_NEON\n\n    template<typename InputStream, bool backup, bool pushOnTake>\n    class NumberStream;\n\n    template<typename InputStream>\n    class NumberStream<InputStream, false, false> {\n    public:\n        typedef typename InputStream::Ch Ch;\n\n        NumberStream(GenericReader& reader, InputStream& s) : is(s) { (void)reader;  }\n\n        CEREAL_RAPIDJSON_FORCEINLINE Ch Peek() const { return is.Peek(); }\n        CEREAL_RAPIDJSON_FORCEINLINE Ch TakePush() { return is.Take(); }\n        CEREAL_RAPIDJSON_FORCEINLINE Ch Take() { return is.Take(); }\n\t\t  CEREAL_RAPIDJSON_FORCEINLINE void Push(char) {}\n\n        size_t Tell() { return is.Tell(); }\n        size_t Length() { return 0; }\n        const char* Pop() { return 0; }\n\n    protected:\n        NumberStream& operator=(const NumberStream&);\n\n        InputStream& is;\n    };\n\n    template<typename InputStream>\n    class NumberStream<InputStream, true, false> : public NumberStream<InputStream, false, false> {\n        typedef NumberStream<InputStream, false, false> Base;\n    public:\n        NumberStream(GenericReader& reader, InputStream& s) : Base(reader, s), stackStream(reader.stack_) {}\n\n        CEREAL_RAPIDJSON_FORCEINLINE Ch TakePush() {\n            stackStream.Put(static_cast<char>(Base::is.Peek()));\n            return Base::is.Take();\n        }\n\n        CEREAL_RAPIDJSON_FORCEINLINE void Push(char c) {\n            stackStream.Put(c);\n        }\n\n        size_t Length() { return stackStream.Length(); }\n\n        const char* Pop() {\n            stackStream.Put('\\0');\n            return stackStream.Pop();\n        }\n\n    private:\n        StackStream<char> stackStream;\n    };\n\n    template<typename InputStream>\n    class NumberStream<InputStream, true, true> : public NumberStream<InputStream, true, false> {\n        typedef NumberStream<InputStream, true, false> Base;\n    public:\n        NumberStream(GenericReader& reader, InputStream& is) : Base(reader, is) {}\n\n        CEREAL_RAPIDJSON_FORCEINLINE Ch Take() { return Base::TakePush(); }\n    };\n\n    template<unsigned parseFlags, typename InputStream, typename Handler>\n    void ParseNumber(InputStream& is, Handler& handler) {\n        internal::StreamLocalCopy<InputStream> copy(is);\n        NumberStream<InputStream,\n            ((parseFlags & kParseNumbersAsStringsFlag) != 0) ?\n                ((parseFlags & kParseInsituFlag) == 0) :\n                ((parseFlags & kParseFullPrecisionFlag) != 0),\n            (parseFlags & kParseNumbersAsStringsFlag) != 0 &&\n                (parseFlags & kParseInsituFlag) == 0> s(*this, copy.s);\n\n        size_t startOffset = s.Tell();\n        double d = 0.0;\n        bool useNanOrInf = false;\n\n        // Parse minus\n        bool minus = Consume(s, '-');\n\n        // Parse int: zero / ( digit1-9 *DIGIT )\n        unsigned i = 0;\n        uint64_t i64 = 0;\n        bool use64bit = false;\n        int significandDigit = 0;\n        if (CEREAL_RAPIDJSON_UNLIKELY(s.Peek() == '0')) {\n            i = 0;\n            s.TakePush();\n        }\n        else if (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '1' && s.Peek() <= '9')) {\n            i = static_cast<unsigned>(s.TakePush() - '0');\n\n            if (minus)\n                while (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) {\n                    if (CEREAL_RAPIDJSON_UNLIKELY(i >= 214748364)) { // 2^31 = 2147483648\n                        if (CEREAL_RAPIDJSON_LIKELY(i != 214748364 || s.Peek() > '8')) {\n                            i64 = i;\n                            use64bit = true;\n                            break;\n                        }\n                    }\n                    i = i * 10 + static_cast<unsigned>(s.TakePush() - '0');\n                    significandDigit++;\n                }\n            else\n                while (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) {\n                    if (CEREAL_RAPIDJSON_UNLIKELY(i >= 429496729)) { // 2^32 - 1 = 4294967295\n                        if (CEREAL_RAPIDJSON_LIKELY(i != 429496729 || s.Peek() > '5')) {\n                            i64 = i;\n                            use64bit = true;\n                            break;\n                        }\n                    }\n                    i = i * 10 + static_cast<unsigned>(s.TakePush() - '0');\n                    significandDigit++;\n                }\n        }\n        // Parse NaN or Infinity here\n        else if ((parseFlags & kParseNanAndInfFlag) && CEREAL_RAPIDJSON_LIKELY((s.Peek() == 'I' || s.Peek() == 'N'))) {\n            if (Consume(s, 'N')) {\n                if (Consume(s, 'a') && Consume(s, 'N')) {\n                    d = std::numeric_limits<double>::quiet_NaN();\n                    useNanOrInf = true;\n                }\n            }\n            else if (CEREAL_RAPIDJSON_LIKELY(Consume(s, 'I'))) {\n                if (Consume(s, 'n') && Consume(s, 'f')) {\n                    d = (minus ? -std::numeric_limits<double>::infinity() : std::numeric_limits<double>::infinity());\n                    useNanOrInf = true;\n\n                    if (CEREAL_RAPIDJSON_UNLIKELY(s.Peek() == 'i' && !(Consume(s, 'i') && Consume(s, 'n')\n                                                                && Consume(s, 'i') && Consume(s, 't') && Consume(s, 'y')))) {\n                        CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell());\n                    }\n                }\n            }\n\n            if (CEREAL_RAPIDJSON_UNLIKELY(!useNanOrInf)) {\n                CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell());\n            }\n        }\n        else\n            CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell());\n\n        // Parse 64bit int\n        bool useDouble = false;\n        if (use64bit) {\n            if (minus)\n                while (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) {\n                     if (CEREAL_RAPIDJSON_UNLIKELY(i64 >= CEREAL_RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC))) // 2^63 = 9223372036854775808\n                        if (CEREAL_RAPIDJSON_LIKELY(i64 != CEREAL_RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC) || s.Peek() > '8')) {\n                            d = static_cast<double>(i64);\n                            useDouble = true;\n                            break;\n                        }\n                    i64 = i64 * 10 + static_cast<unsigned>(s.TakePush() - '0');\n                    significandDigit++;\n                }\n            else\n                while (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) {\n                    if (CEREAL_RAPIDJSON_UNLIKELY(i64 >= CEREAL_RAPIDJSON_UINT64_C2(0x19999999, 0x99999999))) // 2^64 - 1 = 18446744073709551615\n                        if (CEREAL_RAPIDJSON_LIKELY(i64 != CEREAL_RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || s.Peek() > '5')) {\n                            d = static_cast<double>(i64);\n                            useDouble = true;\n                            break;\n                        }\n                    i64 = i64 * 10 + static_cast<unsigned>(s.TakePush() - '0');\n                    significandDigit++;\n                }\n        }\n\n        // Force double for big integer\n        if (useDouble) {\n            while (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) {\n                d = d * 10 + (s.TakePush() - '0');\n            }\n        }\n\n        // Parse frac = decimal-point 1*DIGIT\n        int expFrac = 0;\n        size_t decimalPosition;\n        if (Consume(s, '.')) {\n            decimalPosition = s.Length();\n\n            if (CEREAL_RAPIDJSON_UNLIKELY(!(s.Peek() >= '0' && s.Peek() <= '9')))\n                CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissFraction, s.Tell());\n\n            if (!useDouble) {\n#if CEREAL_RAPIDJSON_64BIT\n                // Use i64 to store significand in 64-bit architecture\n                if (!use64bit)\n                    i64 = i;\n\n                while (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) {\n                    if (i64 > CEREAL_RAPIDJSON_UINT64_C2(0x1FFFFF, 0xFFFFFFFF)) // 2^53 - 1 for fast path\n                        break;\n                    else {\n                        i64 = i64 * 10 + static_cast<unsigned>(s.TakePush() - '0');\n                        --expFrac;\n                        if (i64 != 0)\n                            significandDigit++;\n                    }\n                }\n\n                d = static_cast<double>(i64);\n#else\n                // Use double to store significand in 32-bit architecture\n                d = static_cast<double>(use64bit ? i64 : i);\n#endif\n                useDouble = true;\n            }\n\n            while (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) {\n                if (significandDigit < 17) {\n                    d = d * 10.0 + (s.TakePush() - '0');\n                    --expFrac;\n                    if (CEREAL_RAPIDJSON_LIKELY(d > 0.0))\n                        significandDigit++;\n                }\n                else\n                    s.TakePush();\n            }\n        }\n        else\n            decimalPosition = s.Length(); // decimal position at the end of integer.\n\n        // Parse exp = e [ minus / plus ] 1*DIGIT\n        int exp = 0;\n        if (Consume(s, 'e') || Consume(s, 'E')) {\n            if (!useDouble) {\n                d = static_cast<double>(use64bit ? i64 : i);\n                useDouble = true;\n            }\n\n            bool expMinus = false;\n            if (Consume(s, '+'))\n                ;\n            else if (Consume(s, '-'))\n                expMinus = true;\n\n            if (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) {\n                exp = static_cast<int>(s.Take() - '0');\n                if (expMinus) {\n                    // (exp + expFrac) must not underflow int => we're detecting when -exp gets\n                    // dangerously close to INT_MIN (a pessimistic next digit 9 would push it into\n                    // underflow territory):\n                    //\n                    //        -(exp * 10 + 9) + expFrac >= INT_MIN\n                    //   <=>  exp <= (expFrac - INT_MIN - 9) / 10\n                    CEREAL_RAPIDJSON_ASSERT(expFrac <= 0);\n                    int maxExp = (expFrac + 2147483639) / 10;\n\n                    while (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) {\n                        exp = exp * 10 + static_cast<int>(s.Take() - '0');\n                        if (CEREAL_RAPIDJSON_UNLIKELY(exp > maxExp)) {\n                            while (CEREAL_RAPIDJSON_UNLIKELY(s.Peek() >= '0' && s.Peek() <= '9'))  // Consume the rest of exponent\n                                s.Take();\n                        }\n                    }\n                }\n                else {  // positive exp\n                    int maxExp = 308 - expFrac;\n                    while (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) {\n                        exp = exp * 10 + static_cast<int>(s.Take() - '0');\n                        if (CEREAL_RAPIDJSON_UNLIKELY(exp > maxExp))\n                            CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset);\n                    }\n                }\n            }\n            else\n                CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissExponent, s.Tell());\n\n            if (expMinus)\n                exp = -exp;\n        }\n\n        // Finish parsing, call event according to the type of number.\n        bool cont = true;\n\n        if (parseFlags & kParseNumbersAsStringsFlag) {\n            if (parseFlags & kParseInsituFlag) {\n                s.Pop();  // Pop stack no matter if it will be used or not.\n                typename InputStream::Ch* head = is.PutBegin();\n                const size_t length = s.Tell() - startOffset;\n                CEREAL_RAPIDJSON_ASSERT(length <= 0xFFFFFFFF);\n                // unable to insert the \\0 character here, it will erase the comma after this number\n                const typename TargetEncoding::Ch* const str = reinterpret_cast<typename TargetEncoding::Ch*>(head);\n                cont = handler.RawNumber(str, SizeType(length), false);\n            }\n            else {\n                SizeType numCharsToCopy = static_cast<SizeType>(s.Length());\n                StringStream srcStream(s.Pop());\n                StackStream<typename TargetEncoding::Ch> dstStream(stack_);\n                while (numCharsToCopy--) {\n                    Transcoder<UTF8<>, TargetEncoding>::Transcode(srcStream, dstStream);\n                }\n                dstStream.Put('\\0');\n                const typename TargetEncoding::Ch* str = dstStream.Pop();\n                const SizeType length = static_cast<SizeType>(dstStream.Length()) - 1;\n                cont = handler.RawNumber(str, SizeType(length), true);\n            }\n        }\n        else {\n           size_t length = s.Length();\n           const char* decimal = s.Pop();  // Pop stack no matter if it will be used or not.\n\n           if (useDouble) {\n               int p = exp + expFrac;\n               if (parseFlags & kParseFullPrecisionFlag)\n                   d = internal::StrtodFullPrecision(d, p, decimal, length, decimalPosition, exp);\n               else\n                   d = internal::StrtodNormalPrecision(d, p);\n\n               // Use > max, instead of == inf, to fix bogus warning -Wfloat-equal\n               if (d > (std::numeric_limits<double>::max)()) {\n                   // Overflow\n                   // TODO: internal::StrtodX should report overflow (or underflow)\n                   CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset);\n               }\n\n               cont = handler.Double(minus ? -d : d);\n           }\n           else if (useNanOrInf) {\n               cont = handler.Double(d);\n           }\n           else {\n               if (use64bit) {\n                   if (minus)\n                       cont = handler.Int64(static_cast<int64_t>(~i64 + 1));\n                   else\n                       cont = handler.Uint64(i64);\n               }\n               else {\n                   if (minus)\n                       cont = handler.Int(static_cast<int32_t>(~i + 1));\n                   else\n                       cont = handler.Uint(i);\n               }\n           }\n        }\n        if (CEREAL_RAPIDJSON_UNLIKELY(!cont))\n            CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, startOffset);\n    }\n\n    // Parse any JSON value\n    template<unsigned parseFlags, typename InputStream, typename Handler>\n    void ParseValue(InputStream& is, Handler& handler) {\n        switch (is.Peek()) {\n            case 'n': ParseNull  <parseFlags>(is, handler); break;\n            case 't': ParseTrue  <parseFlags>(is, handler); break;\n            case 'f': ParseFalse <parseFlags>(is, handler); break;\n            case '\"': ParseString<parseFlags>(is, handler); break;\n            case '{': ParseObject<parseFlags>(is, handler); break;\n            case '[': ParseArray <parseFlags>(is, handler); break;\n            default :\n                      ParseNumber<parseFlags>(is, handler);\n                      break;\n\n        }\n    }\n\n    // Iterative Parsing\n\n    // States\n    enum IterativeParsingState {\n        IterativeParsingFinishState = 0, // sink states at top\n        IterativeParsingErrorState,      // sink states at top\n        IterativeParsingStartState,\n\n        // Object states\n        IterativeParsingObjectInitialState,\n        IterativeParsingMemberKeyState,\n        IterativeParsingMemberValueState,\n        IterativeParsingObjectFinishState,\n\n        // Array states\n        IterativeParsingArrayInitialState,\n        IterativeParsingElementState,\n        IterativeParsingArrayFinishState,\n\n        // Single value state\n        IterativeParsingValueState,\n\n        // Delimiter states (at bottom)\n        IterativeParsingElementDelimiterState,\n        IterativeParsingMemberDelimiterState,\n        IterativeParsingKeyValueDelimiterState,\n\n        cIterativeParsingStateCount\n    };\n\n    // Tokens\n    enum Token {\n        LeftBracketToken = 0,\n        RightBracketToken,\n\n        LeftCurlyBracketToken,\n        RightCurlyBracketToken,\n\n        CommaToken,\n        ColonToken,\n\n        StringToken,\n        FalseToken,\n        TrueToken,\n        NullToken,\n        NumberToken,\n\n        kTokenCount\n    };\n\n    CEREAL_RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) const {\n\n//!@cond CEREAL_RAPIDJSON_HIDDEN_FROM_DOXYGEN\n#define N NumberToken\n#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N\n        // Maps from ASCII to Token\n        static const unsigned char tokenMap[256] = {\n            N16, // 00~0F\n            N16, // 10~1F\n            N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F\n            N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F\n            N16, // 40~4F\n            N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F\n            N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F\n            N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F\n            N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF\n        };\n#undef N\n#undef N16\n//!@endcond\n\n        if (sizeof(Ch) == 1 || static_cast<unsigned>(c) < 256)\n            return static_cast<Token>(tokenMap[static_cast<unsigned char>(c)]);\n        else\n            return NumberToken;\n    }\n\n    CEREAL_RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) const {\n        // current state x one lookahead token -> new state\n        static const char G[cIterativeParsingStateCount][kTokenCount] = {\n            // Finish(sink state)\n            {\n                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,\n                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,\n                IterativeParsingErrorState\n            },\n            // Error(sink state)\n            {\n                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,\n                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,\n                IterativeParsingErrorState\n            },\n            // Start\n            {\n                IterativeParsingArrayInitialState,  // Left bracket\n                IterativeParsingErrorState,         // Right bracket\n                IterativeParsingObjectInitialState, // Left curly bracket\n                IterativeParsingErrorState,         // Right curly bracket\n                IterativeParsingErrorState,         // Comma\n                IterativeParsingErrorState,         // Colon\n                IterativeParsingValueState,         // String\n                IterativeParsingValueState,         // False\n                IterativeParsingValueState,         // True\n                IterativeParsingValueState,         // Null\n                IterativeParsingValueState          // Number\n            },\n            // ObjectInitial\n            {\n                IterativeParsingErrorState,         // Left bracket\n                IterativeParsingErrorState,         // Right bracket\n                IterativeParsingErrorState,         // Left curly bracket\n                IterativeParsingObjectFinishState,  // Right curly bracket\n                IterativeParsingErrorState,         // Comma\n                IterativeParsingErrorState,         // Colon\n                IterativeParsingMemberKeyState,     // String\n                IterativeParsingErrorState,         // False\n                IterativeParsingErrorState,         // True\n                IterativeParsingErrorState,         // Null\n                IterativeParsingErrorState          // Number\n            },\n            // MemberKey\n            {\n                IterativeParsingErrorState,             // Left bracket\n                IterativeParsingErrorState,             // Right bracket\n                IterativeParsingErrorState,             // Left curly bracket\n                IterativeParsingErrorState,             // Right curly bracket\n                IterativeParsingErrorState,             // Comma\n                IterativeParsingKeyValueDelimiterState, // Colon\n                IterativeParsingErrorState,             // String\n                IterativeParsingErrorState,             // False\n                IterativeParsingErrorState,             // True\n                IterativeParsingErrorState,             // Null\n                IterativeParsingErrorState              // Number\n            },\n            // MemberValue\n            {\n                IterativeParsingErrorState,             // Left bracket\n                IterativeParsingErrorState,             // Right bracket\n                IterativeParsingErrorState,             // Left curly bracket\n                IterativeParsingObjectFinishState,      // Right curly bracket\n                IterativeParsingMemberDelimiterState,   // Comma\n                IterativeParsingErrorState,             // Colon\n                IterativeParsingErrorState,             // String\n                IterativeParsingErrorState,             // False\n                IterativeParsingErrorState,             // True\n                IterativeParsingErrorState,             // Null\n                IterativeParsingErrorState              // Number\n            },\n            // ObjectFinish(sink state)\n            {\n                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,\n                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,\n                IterativeParsingErrorState\n            },\n            // ArrayInitial\n            {\n                IterativeParsingArrayInitialState,      // Left bracket(push Element state)\n                IterativeParsingArrayFinishState,       // Right bracket\n                IterativeParsingObjectInitialState,     // Left curly bracket(push Element state)\n                IterativeParsingErrorState,             // Right curly bracket\n                IterativeParsingErrorState,             // Comma\n                IterativeParsingErrorState,             // Colon\n                IterativeParsingElementState,           // String\n                IterativeParsingElementState,           // False\n                IterativeParsingElementState,           // True\n                IterativeParsingElementState,           // Null\n                IterativeParsingElementState            // Number\n            },\n            // Element\n            {\n                IterativeParsingErrorState,             // Left bracket\n                IterativeParsingArrayFinishState,       // Right bracket\n                IterativeParsingErrorState,             // Left curly bracket\n                IterativeParsingErrorState,             // Right curly bracket\n                IterativeParsingElementDelimiterState,  // Comma\n                IterativeParsingErrorState,             // Colon\n                IterativeParsingErrorState,             // String\n                IterativeParsingErrorState,             // False\n                IterativeParsingErrorState,             // True\n                IterativeParsingErrorState,             // Null\n                IterativeParsingErrorState              // Number\n            },\n            // ArrayFinish(sink state)\n            {\n                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,\n                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,\n                IterativeParsingErrorState\n            },\n            // Single Value (sink state)\n            {\n                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,\n                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,\n                IterativeParsingErrorState\n            },\n            // ElementDelimiter\n            {\n                IterativeParsingArrayInitialState,      // Left bracket(push Element state)\n                IterativeParsingArrayFinishState,       // Right bracket\n                IterativeParsingObjectInitialState,     // Left curly bracket(push Element state)\n                IterativeParsingErrorState,             // Right curly bracket\n                IterativeParsingErrorState,             // Comma\n                IterativeParsingErrorState,             // Colon\n                IterativeParsingElementState,           // String\n                IterativeParsingElementState,           // False\n                IterativeParsingElementState,           // True\n                IterativeParsingElementState,           // Null\n                IterativeParsingElementState            // Number\n            },\n            // MemberDelimiter\n            {\n                IterativeParsingErrorState,         // Left bracket\n                IterativeParsingErrorState,         // Right bracket\n                IterativeParsingErrorState,         // Left curly bracket\n                IterativeParsingObjectFinishState,  // Right curly bracket\n                IterativeParsingErrorState,         // Comma\n                IterativeParsingErrorState,         // Colon\n                IterativeParsingMemberKeyState,     // String\n                IterativeParsingErrorState,         // False\n                IterativeParsingErrorState,         // True\n                IterativeParsingErrorState,         // Null\n                IterativeParsingErrorState          // Number\n            },\n            // KeyValueDelimiter\n            {\n                IterativeParsingArrayInitialState,      // Left bracket(push MemberValue state)\n                IterativeParsingErrorState,             // Right bracket\n                IterativeParsingObjectInitialState,     // Left curly bracket(push MemberValue state)\n                IterativeParsingErrorState,             // Right curly bracket\n                IterativeParsingErrorState,             // Comma\n                IterativeParsingErrorState,             // Colon\n                IterativeParsingMemberValueState,       // String\n                IterativeParsingMemberValueState,       // False\n                IterativeParsingMemberValueState,       // True\n                IterativeParsingMemberValueState,       // Null\n                IterativeParsingMemberValueState        // Number\n            },\n        }; // End of G\n\n        return static_cast<IterativeParsingState>(G[state][token]);\n    }\n\n    // Make an advance in the token stream and state based on the candidate destination state which was returned by Transit().\n    // May return a new state on state pop.\n    template <unsigned parseFlags, typename InputStream, typename Handler>\n    CEREAL_RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) {\n        (void)token;\n\n        switch (dst) {\n        case IterativeParsingErrorState:\n            return dst;\n\n        case IterativeParsingObjectInitialState:\n        case IterativeParsingArrayInitialState:\n        {\n            // Push the state(Element or MemeberValue) if we are nested in another array or value of member.\n            // In this way we can get the correct state on ObjectFinish or ArrayFinish by frame pop.\n            IterativeParsingState n = src;\n            if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState)\n                n = IterativeParsingElementState;\n            else if (src == IterativeParsingKeyValueDelimiterState)\n                n = IterativeParsingMemberValueState;\n            // Push current state.\n            *stack_.template Push<SizeType>(1) = n;\n            // Initialize and push the member/element count.\n            *stack_.template Push<SizeType>(1) = 0;\n            // Call handler\n            bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray();\n            // On handler short circuits the parsing.\n            if (!hr) {\n                CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell());\n                return IterativeParsingErrorState;\n            }\n            else {\n                is.Take();\n                return dst;\n            }\n        }\n\n        case IterativeParsingMemberKeyState:\n            ParseString<parseFlags>(is, handler, true);\n            if (HasParseError())\n                return IterativeParsingErrorState;\n            else\n                return dst;\n\n        case IterativeParsingKeyValueDelimiterState:\n            CEREAL_RAPIDJSON_ASSERT(token == ColonToken);\n            is.Take();\n            return dst;\n\n        case IterativeParsingMemberValueState:\n            // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state.\n            ParseValue<parseFlags>(is, handler);\n            if (HasParseError()) {\n                return IterativeParsingErrorState;\n            }\n            return dst;\n\n        case IterativeParsingElementState:\n            // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state.\n            ParseValue<parseFlags>(is, handler);\n            if (HasParseError()) {\n                return IterativeParsingErrorState;\n            }\n            return dst;\n\n        case IterativeParsingMemberDelimiterState:\n        case IterativeParsingElementDelimiterState:\n            is.Take();\n            // Update member/element count.\n            *stack_.template Top<SizeType>() = *stack_.template Top<SizeType>() + 1;\n            return dst;\n\n        case IterativeParsingObjectFinishState:\n        {\n            // Transit from delimiter is only allowed when trailing commas are enabled\n            if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingMemberDelimiterState) {\n                CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorObjectMissName, is.Tell());\n                return IterativeParsingErrorState;\n            }\n            // Get member count.\n            SizeType c = *stack_.template Pop<SizeType>(1);\n            // If the object is not empty, count the last member.\n            if (src == IterativeParsingMemberValueState)\n                ++c;\n            // Restore the state.\n            IterativeParsingState n = static_cast<IterativeParsingState>(*stack_.template Pop<SizeType>(1));\n            // Transit to Finish state if this is the topmost scope.\n            if (n == IterativeParsingStartState)\n                n = IterativeParsingFinishState;\n            // Call handler\n            bool hr = handler.EndObject(c);\n            // On handler short circuits the parsing.\n            if (!hr) {\n                CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell());\n                return IterativeParsingErrorState;\n            }\n            else {\n                is.Take();\n                return n;\n            }\n        }\n\n        case IterativeParsingArrayFinishState:\n        {\n            // Transit from delimiter is only allowed when trailing commas are enabled\n            if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingElementDelimiterState) {\n                CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorValueInvalid, is.Tell());\n                return IterativeParsingErrorState;\n            }\n            // Get element count.\n            SizeType c = *stack_.template Pop<SizeType>(1);\n            // If the array is not empty, count the last element.\n            if (src == IterativeParsingElementState)\n                ++c;\n            // Restore the state.\n            IterativeParsingState n = static_cast<IterativeParsingState>(*stack_.template Pop<SizeType>(1));\n            // Transit to Finish state if this is the topmost scope.\n            if (n == IterativeParsingStartState)\n                n = IterativeParsingFinishState;\n            // Call handler\n            bool hr = handler.EndArray(c);\n            // On handler short circuits the parsing.\n            if (!hr) {\n                CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell());\n                return IterativeParsingErrorState;\n            }\n            else {\n                is.Take();\n                return n;\n            }\n        }\n\n        default:\n            // This branch is for IterativeParsingValueState actually.\n            // Use `default:` rather than\n            // `case IterativeParsingValueState:` is for code coverage.\n\n            // The IterativeParsingStartState is not enumerated in this switch-case.\n            // It is impossible for that case. And it can be caught by following assertion.\n\n            // The IterativeParsingFinishState is not enumerated in this switch-case either.\n            // It is a \"derivative\" state which cannot triggered from Predict() directly.\n            // Therefore it cannot happen here. And it can be caught by following assertion.\n            CEREAL_RAPIDJSON_ASSERT(dst == IterativeParsingValueState);\n\n            // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state.\n            ParseValue<parseFlags>(is, handler);\n            if (HasParseError()) {\n                return IterativeParsingErrorState;\n            }\n            return IterativeParsingFinishState;\n        }\n    }\n\n    template <typename InputStream>\n    void HandleError(IterativeParsingState src, InputStream& is) {\n        if (HasParseError()) {\n            // Error flag has been set.\n            return;\n        }\n\n        switch (src) {\n        case IterativeParsingStartState:            CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorDocumentEmpty, is.Tell()); return;\n        case IterativeParsingFinishState:           CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorDocumentRootNotSingular, is.Tell()); return;\n        case IterativeParsingObjectInitialState:\n        case IterativeParsingMemberDelimiterState:  CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); return;\n        case IterativeParsingMemberKeyState:        CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); return;\n        case IterativeParsingMemberValueState:      CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); return;\n        case IterativeParsingKeyValueDelimiterState:\n        case IterativeParsingArrayInitialState:\n        case IterativeParsingElementDelimiterState: CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); return;\n        default: CEREAL_RAPIDJSON_ASSERT(src == IterativeParsingElementState); CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); return;\n        }\n    }\n\n    CEREAL_RAPIDJSON_FORCEINLINE bool IsIterativeParsingDelimiterState(IterativeParsingState s) const {\n        return s >= IterativeParsingElementDelimiterState;\n    }\n\n    CEREAL_RAPIDJSON_FORCEINLINE bool IsIterativeParsingCompleteState(IterativeParsingState s) const {\n        return s <= IterativeParsingErrorState;\n    }\n\n    template <unsigned parseFlags, typename InputStream, typename Handler>\n    ParseResult IterativeParse(InputStream& is, Handler& handler) {\n        parseResult_.Clear();\n        ClearStackOnExit scope(*this);\n        IterativeParsingState state = IterativeParsingStartState;\n\n        SkipWhitespaceAndComments<parseFlags>(is);\n        CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);\n        while (is.Peek() != '\\0') {\n            Token t = Tokenize(is.Peek());\n            IterativeParsingState n = Predict(state, t);\n            IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler);\n\n            if (d == IterativeParsingErrorState) {\n                HandleError(state, is);\n                break;\n            }\n\n            state = d;\n\n            // Do not further consume streams if a root JSON has been parsed.\n            if ((parseFlags & kParseStopWhenDoneFlag) && state == IterativeParsingFinishState)\n                break;\n\n            SkipWhitespaceAndComments<parseFlags>(is);\n            CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);\n        }\n\n        // Handle the end of file.\n        if (state != IterativeParsingFinishState)\n            HandleError(state, is);\n\n        return parseResult_;\n    }\n\n    static const size_t kDefaultStackCapacity = 256;    //!< Default stack capacity in bytes for storing a single decoded string.\n    internal::Stack<StackAllocator> stack_;  //!< A stack for storing decoded string temporarily during non-destructive parsing.\n    ParseResult parseResult_;\n    IterativeParsingState state_;\n}; // class GenericReader\n\n//! Reader with UTF8 encoding and default allocator.\ntypedef GenericReader<UTF8<>, UTF8<> > Reader;\n\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#if defined(__clang__) || defined(_MSC_VER)\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n\n#ifdef __GNUC__\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#endif // CEREAL_RAPIDJSON_READER_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/schema.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available->\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip-> All rights reserved->\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License-> You may obtain a copy of the License at\n//\n// http://opensource->org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied-> See the License for the \n// specific language governing permissions and limitations under the License->\n\n#ifndef CEREAL_RAPIDJSON_SCHEMA_H_\n#define CEREAL_RAPIDJSON_SCHEMA_H_\n\n#include \"document.h\"\n#include \"pointer.h\"\n#include \"stringbuffer.h\"\n#include <cmath> // abs, floor\n\n#if !defined(CEREAL_RAPIDJSON_SCHEMA_USE_INTERNALREGEX)\n#define CEREAL_RAPIDJSON_SCHEMA_USE_INTERNALREGEX 1\n#else\n#define CEREAL_RAPIDJSON_SCHEMA_USE_INTERNALREGEX 0\n#endif\n\n#if !CEREAL_RAPIDJSON_SCHEMA_USE_INTERNALREGEX && defined(CEREAL_RAPIDJSON_SCHEMA_USE_STDREGEX) && (__cplusplus >=201103L || (defined(_MSC_VER) && _MSC_VER >= 1800))\n#define CEREAL_RAPIDJSON_SCHEMA_USE_STDREGEX 1\n#else\n#define CEREAL_RAPIDJSON_SCHEMA_USE_STDREGEX 0\n#endif\n\n#if CEREAL_RAPIDJSON_SCHEMA_USE_INTERNALREGEX\n#include \"internal/regex.h\"\n#elif CEREAL_RAPIDJSON_SCHEMA_USE_STDREGEX\n#include <regex>\n#endif\n\n#if CEREAL_RAPIDJSON_SCHEMA_USE_INTERNALREGEX || CEREAL_RAPIDJSON_SCHEMA_USE_STDREGEX\n#define CEREAL_RAPIDJSON_SCHEMA_HAS_REGEX 1\n#else\n#define CEREAL_RAPIDJSON_SCHEMA_HAS_REGEX 0\n#endif\n\n#ifndef CEREAL_RAPIDJSON_SCHEMA_VERBOSE\n#define CEREAL_RAPIDJSON_SCHEMA_VERBOSE 0\n#endif\n\n#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE\n#include \"stringbuffer.h\"\n#endif\n\nCEREAL_RAPIDJSON_DIAG_PUSH\n\n#if defined(__GNUC__)\nCEREAL_RAPIDJSON_DIAG_OFF(effc++)\n#endif\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_OFF(weak-vtables)\nCEREAL_RAPIDJSON_DIAG_OFF(exit-time-destructors)\nCEREAL_RAPIDJSON_DIAG_OFF(c++98-compat-pedantic)\nCEREAL_RAPIDJSON_DIAG_OFF(variadic-macros)\n#elif defined(_MSC_VER)\nCEREAL_RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n///////////////////////////////////////////////////////////////////////////////\n// Verbose Utilities\n\n#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE\n\nnamespace internal {\n\ninline void PrintInvalidKeyword(const char* keyword) {\n    printf(\"Fail keyword: %s\\n\", keyword);\n}\n\ninline void PrintInvalidKeyword(const wchar_t* keyword) {\n    wprintf(L\"Fail keyword: %ls\\n\", keyword);\n}\n\ninline void PrintInvalidDocument(const char* document) {\n    printf(\"Fail document: %s\\n\\n\", document);\n}\n\ninline void PrintInvalidDocument(const wchar_t* document) {\n    wprintf(L\"Fail document: %ls\\n\\n\", document);\n}\n\ninline void PrintValidatorPointers(unsigned depth, const char* s, const char* d) {\n    printf(\"S: %*s%s\\nD: %*s%s\\n\\n\", depth * 4, \" \", s, depth * 4, \" \", d);\n}\n\ninline void PrintValidatorPointers(unsigned depth, const wchar_t* s, const wchar_t* d) {\n    wprintf(L\"S: %*ls%ls\\nD: %*ls%ls\\n\\n\", depth * 4, L\" \", s, depth * 4, L\" \", d);\n}\n\n} // namespace internal\n\n#endif // CEREAL_RAPIDJSON_SCHEMA_VERBOSE\n\n///////////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN\n\n#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE\n#define CEREAL_RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword) internal::PrintInvalidKeyword(keyword)\n#else\n#define CEREAL_RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword)\n#endif\n\n#define CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(keyword)\\\nCEREAL_RAPIDJSON_MULTILINEMACRO_BEGIN\\\n    context.invalidKeyword = keyword.GetString();\\\n    CEREAL_RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword.GetString());\\\n    return false;\\\nCEREAL_RAPIDJSON_MULTILINEMACRO_END\n\n///////////////////////////////////////////////////////////////////////////////\n// Forward declarations\n\ntemplate <typename ValueType, typename Allocator>\nclass GenericSchemaDocument;\n\nnamespace internal {\n\ntemplate <typename SchemaDocumentType>\nclass Schema;\n\n///////////////////////////////////////////////////////////////////////////////\n// ISchemaValidator\n\nclass ISchemaValidator {\npublic:\n    virtual ~ISchemaValidator() {}\n    virtual bool IsValid() const = 0;\n};\n\n///////////////////////////////////////////////////////////////////////////////\n// ISchemaStateFactory\n\ntemplate <typename SchemaType>\nclass ISchemaStateFactory {\npublic:\n    virtual ~ISchemaStateFactory() {}\n    virtual ISchemaValidator* CreateSchemaValidator(const SchemaType&) = 0;\n    virtual void DestroySchemaValidator(ISchemaValidator* validator) = 0;\n    virtual void* CreateHasher() = 0;\n    virtual uint64_t GetHashCode(void* hasher) = 0;\n    virtual void DestroryHasher(void* hasher) = 0;\n    virtual void* MallocState(size_t size) = 0;\n    virtual void FreeState(void* p) = 0;\n};\n\n///////////////////////////////////////////////////////////////////////////////\n// IValidationErrorHandler\n\ntemplate <typename SchemaType>\nclass IValidationErrorHandler {\npublic:\n    typedef typename SchemaType::Ch Ch;\n    typedef typename SchemaType::SValue SValue;\n\n    virtual ~IValidationErrorHandler() {}\n\n    virtual void NotMultipleOf(int64_t actual, const SValue& expected) = 0;\n    virtual void NotMultipleOf(uint64_t actual, const SValue& expected) = 0;\n    virtual void NotMultipleOf(double actual, const SValue& expected) = 0;\n    virtual void AboveMaximum(int64_t actual, const SValue& expected, bool exclusive) = 0;\n    virtual void AboveMaximum(uint64_t actual, const SValue& expected, bool exclusive) = 0;\n    virtual void AboveMaximum(double actual, const SValue& expected, bool exclusive) = 0;\n    virtual void BelowMinimum(int64_t actual, const SValue& expected, bool exclusive) = 0;\n    virtual void BelowMinimum(uint64_t actual, const SValue& expected, bool exclusive) = 0;\n    virtual void BelowMinimum(double actual, const SValue& expected, bool exclusive) = 0;\n\n    virtual void TooLong(const Ch* str, SizeType length, SizeType expected) = 0;\n    virtual void TooShort(const Ch* str, SizeType length, SizeType expected) = 0;\n    virtual void DoesNotMatch(const Ch* str, SizeType length) = 0;\n\n    virtual void DisallowedItem(SizeType index) = 0;\n    virtual void TooFewItems(SizeType actualCount, SizeType expectedCount) = 0;\n    virtual void TooManyItems(SizeType actualCount, SizeType expectedCount) = 0;\n    virtual void DuplicateItems(SizeType index1, SizeType index2) = 0;\n\n    virtual void TooManyProperties(SizeType actualCount, SizeType expectedCount) = 0;\n    virtual void TooFewProperties(SizeType actualCount, SizeType expectedCount) = 0;\n    virtual void StartMissingProperties() = 0;\n    virtual void AddMissingProperty(const SValue& name) = 0;\n    virtual bool EndMissingProperties() = 0;\n    virtual void PropertyViolations(ISchemaValidator** subvalidators, SizeType count) = 0;\n    virtual void DisallowedProperty(const Ch* name, SizeType length) = 0;\n\n    virtual void StartDependencyErrors() = 0;\n    virtual void StartMissingDependentProperties() = 0;\n    virtual void AddMissingDependentProperty(const SValue& targetName) = 0;\n    virtual void EndMissingDependentProperties(const SValue& sourceName) = 0;\n    virtual void AddDependencySchemaError(const SValue& souceName, ISchemaValidator* subvalidator) = 0;\n    virtual bool EndDependencyErrors() = 0;\n\n    virtual void DisallowedValue() = 0;\n    virtual void StartDisallowedType() = 0;\n    virtual void AddExpectedType(const typename SchemaType::ValueType& expectedType) = 0;\n    virtual void EndDisallowedType(const typename SchemaType::ValueType& actualType) = 0;\n    virtual void NotAllOf(ISchemaValidator** subvalidators, SizeType count) = 0;\n    virtual void NoneOf(ISchemaValidator** subvalidators, SizeType count) = 0;\n    virtual void NotOneOf(ISchemaValidator** subvalidators, SizeType count) = 0;\n    virtual void Disallowed() = 0;\n};\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Hasher\n\n// For comparison of compound value\ntemplate<typename Encoding, typename Allocator>\nclass Hasher {\npublic:\n    typedef typename Encoding::Ch Ch;\n\n    Hasher(Allocator* allocator = 0, size_t stackCapacity = kDefaultSize) : stack_(allocator, stackCapacity) {}\n\n    bool Null() { return WriteType(kNullType); }\n    bool Bool(bool b) { return WriteType(b ? kTrueType : kFalseType); }\n    bool Int(int i) { Number n; n.u.i = i; n.d = static_cast<double>(i); return WriteNumber(n); }\n    bool Uint(unsigned u) { Number n; n.u.u = u; n.d = static_cast<double>(u); return WriteNumber(n); }\n    bool Int64(int64_t i) { Number n; n.u.i = i; n.d = static_cast<double>(i); return WriteNumber(n); }\n    bool Uint64(uint64_t u) { Number n; n.u.u = u; n.d = static_cast<double>(u); return WriteNumber(n); }\n    bool Double(double d) { \n        Number n; \n        if (d < 0) n.u.i = static_cast<int64_t>(d);\n        else       n.u.u = static_cast<uint64_t>(d); \n        n.d = d;\n        return WriteNumber(n);\n    }\n\n    bool RawNumber(const Ch* str, SizeType len, bool) {\n        WriteBuffer(kNumberType, str, len * sizeof(Ch));\n        return true;\n    }\n\n    bool String(const Ch* str, SizeType len, bool) {\n        WriteBuffer(kStringType, str, len * sizeof(Ch));\n        return true;\n    }\n\n    bool StartObject() { return true; }\n    bool Key(const Ch* str, SizeType len, bool copy) { return String(str, len, copy); }\n    bool EndObject(SizeType memberCount) { \n        uint64_t h = Hash(0, kObjectType);\n        uint64_t* kv = stack_.template Pop<uint64_t>(memberCount * 2);\n        for (SizeType i = 0; i < memberCount; i++)\n            h ^= Hash(kv[i * 2], kv[i * 2 + 1]);  // Use xor to achieve member order insensitive\n        *stack_.template Push<uint64_t>() = h;\n        return true;\n    }\n    \n    bool StartArray() { return true; }\n    bool EndArray(SizeType elementCount) { \n        uint64_t h = Hash(0, kArrayType);\n        uint64_t* e = stack_.template Pop<uint64_t>(elementCount);\n        for (SizeType i = 0; i < elementCount; i++)\n            h = Hash(h, e[i]); // Use hash to achieve element order sensitive\n        *stack_.template Push<uint64_t>() = h;\n        return true;\n    }\n\n    bool IsValid() const { return stack_.GetSize() == sizeof(uint64_t); }\n\n    uint64_t GetHashCode() const {\n        CEREAL_RAPIDJSON_ASSERT(IsValid());\n        return *stack_.template Top<uint64_t>();\n    }\n\nprivate:\n    static const size_t kDefaultSize = 256;\n    struct Number {\n        union U {\n            uint64_t u;\n            int64_t i;\n        }u;\n        double d;\n    };\n\n    bool WriteType(Type type) { return WriteBuffer(type, 0, 0); }\n    \n    bool WriteNumber(const Number& n) { return WriteBuffer(kNumberType, &n, sizeof(n)); }\n    \n    bool WriteBuffer(Type type, const void* data, size_t len) {\n        // FNV-1a from http://isthe.com/chongo/tech/comp/fnv/\n        uint64_t h = Hash(CEREAL_RAPIDJSON_UINT64_C2(0x84222325, 0xcbf29ce4), type);\n        const unsigned char* d = static_cast<const unsigned char*>(data);\n        for (size_t i = 0; i < len; i++)\n            h = Hash(h, d[i]);\n        *stack_.template Push<uint64_t>() = h;\n        return true;\n    }\n\n    static uint64_t Hash(uint64_t h, uint64_t d) {\n        static const uint64_t kPrime = CEREAL_RAPIDJSON_UINT64_C2(0x00000100, 0x000001b3);\n        h ^= d;\n        h *= kPrime;\n        return h;\n    }\n\n    Stack<Allocator> stack_;\n};\n\n///////////////////////////////////////////////////////////////////////////////\n// SchemaValidationContext\n\ntemplate <typename SchemaDocumentType>\nstruct SchemaValidationContext {\n    typedef Schema<SchemaDocumentType> SchemaType;\n    typedef ISchemaStateFactory<SchemaType> SchemaValidatorFactoryType;\n    typedef IValidationErrorHandler<SchemaType> ErrorHandlerType;\n    typedef typename SchemaType::ValueType ValueType;\n    typedef typename ValueType::Ch Ch;\n\n    enum PatternValidatorType {\n        kPatternValidatorOnly,\n        kPatternValidatorWithProperty,\n        kPatternValidatorWithAdditionalProperty\n    };\n\n    SchemaValidationContext(SchemaValidatorFactoryType& f, ErrorHandlerType& eh, const SchemaType* s) :\n        factory(f),\n        error_handler(eh),\n        schema(s),\n        valueSchema(),\n        invalidKeyword(),\n        hasher(),\n        arrayElementHashCodes(),\n        validators(),\n        validatorCount(),\n        patternPropertiesValidators(),\n        patternPropertiesValidatorCount(),\n        patternPropertiesSchemas(),\n        patternPropertiesSchemaCount(),\n        valuePatternValidatorType(kPatternValidatorOnly),\n        propertyExist(),\n        inArray(false),\n        valueUniqueness(false),\n        arrayUniqueness(false)\n    {\n    }\n\n    ~SchemaValidationContext() {\n        if (hasher)\n            factory.DestroryHasher(hasher);\n        if (validators) {\n            for (SizeType i = 0; i < validatorCount; i++)\n                factory.DestroySchemaValidator(validators[i]);\n            factory.FreeState(validators);\n        }\n        if (patternPropertiesValidators) {\n            for (SizeType i = 0; i < patternPropertiesValidatorCount; i++)\n                factory.DestroySchemaValidator(patternPropertiesValidators[i]);\n            factory.FreeState(patternPropertiesValidators);\n        }\n        if (patternPropertiesSchemas)\n            factory.FreeState(patternPropertiesSchemas);\n        if (propertyExist)\n            factory.FreeState(propertyExist);\n    }\n\n    SchemaValidatorFactoryType& factory;\n    ErrorHandlerType& error_handler;\n    const SchemaType* schema;\n    const SchemaType* valueSchema;\n    const Ch* invalidKeyword;\n    void* hasher; // Only validator access\n    void* arrayElementHashCodes; // Only validator access this\n    ISchemaValidator** validators;\n    SizeType validatorCount;\n    ISchemaValidator** patternPropertiesValidators;\n    SizeType patternPropertiesValidatorCount;\n    const SchemaType** patternPropertiesSchemas;\n    SizeType patternPropertiesSchemaCount;\n    PatternValidatorType valuePatternValidatorType;\n    PatternValidatorType objectPatternValidatorType;\n    SizeType arrayElementIndex;\n    bool* propertyExist;\n    bool inArray;\n    bool valueUniqueness;\n    bool arrayUniqueness;\n};\n\n///////////////////////////////////////////////////////////////////////////////\n// Schema\n\ntemplate <typename SchemaDocumentType>\nclass Schema {\npublic:\n    typedef typename SchemaDocumentType::ValueType ValueType;\n    typedef typename SchemaDocumentType::AllocatorType AllocatorType;\n    typedef typename SchemaDocumentType::PointerType PointerType;\n    typedef typename ValueType::EncodingType EncodingType;\n    typedef typename EncodingType::Ch Ch;\n    typedef SchemaValidationContext<SchemaDocumentType> Context;\n    typedef Schema<SchemaDocumentType> SchemaType;\n    typedef GenericValue<EncodingType, AllocatorType> SValue;\n    typedef IValidationErrorHandler<Schema> ErrorHandler;\n    friend class GenericSchemaDocument<ValueType, AllocatorType>;\n\n    Schema(SchemaDocumentType* schemaDocument, const PointerType& p, const ValueType& value, const ValueType& document, AllocatorType* allocator) :\n        allocator_(allocator),\n        uri_(schemaDocument->GetURI(), *allocator),\n        pointer_(p, allocator),\n        typeless_(schemaDocument->GetTypeless()),\n        enum_(),\n        enumCount_(),\n        not_(),\n        type_((1 << kTotalSchemaType) - 1), // typeless\n        validatorCount_(),\n        notValidatorIndex_(),\n        properties_(),\n        additionalPropertiesSchema_(),\n        patternProperties_(),\n        patternPropertyCount_(),\n        propertyCount_(),\n        minProperties_(),\n        maxProperties_(SizeType(~0)),\n        additionalProperties_(true),\n        hasDependencies_(),\n        hasRequired_(),\n        hasSchemaDependencies_(),\n        additionalItemsSchema_(),\n        itemsList_(),\n        itemsTuple_(),\n        itemsTupleCount_(),\n        minItems_(),\n        maxItems_(SizeType(~0)),\n        additionalItems_(true),\n        uniqueItems_(false),\n        pattern_(),\n        minLength_(0),\n        maxLength_(~SizeType(0)),\n        exclusiveMinimum_(false),\n        exclusiveMaximum_(false),\n        defaultValueLength_(0)\n    {\n        typedef typename SchemaDocumentType::ValueType ValueType;\n        typedef typename ValueType::ConstValueIterator ConstValueIterator;\n        typedef typename ValueType::ConstMemberIterator ConstMemberIterator;\n\n        if (!value.IsObject())\n            return;\n\n        if (const ValueType* v = GetMember(value, GetTypeString())) {\n            type_ = 0;\n            if (v->IsString())\n                AddType(*v);\n            else if (v->IsArray())\n                for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr)\n                    AddType(*itr);\n        }\n\n        if (const ValueType* v = GetMember(value, GetEnumString()))\n            if (v->IsArray() && v->Size() > 0) {\n                enum_ = static_cast<uint64_t*>(allocator_->Malloc(sizeof(uint64_t) * v->Size()));\n                for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) {\n                    typedef Hasher<EncodingType, MemoryPoolAllocator<> > EnumHasherType;\n                    char buffer[256u + 24];\n                    MemoryPoolAllocator<> hasherAllocator(buffer, sizeof(buffer));\n                    EnumHasherType h(&hasherAllocator, 256);\n                    itr->Accept(h);\n                    enum_[enumCount_++] = h.GetHashCode();\n                }\n            }\n\n        if (schemaDocument) {\n            AssignIfExist(allOf_, *schemaDocument, p, value, GetAllOfString(), document);\n            AssignIfExist(anyOf_, *schemaDocument, p, value, GetAnyOfString(), document);\n            AssignIfExist(oneOf_, *schemaDocument, p, value, GetOneOfString(), document);\n        }\n\n        if (const ValueType* v = GetMember(value, GetNotString())) {\n            schemaDocument->CreateSchema(&not_, p.Append(GetNotString(), allocator_), *v, document);\n            notValidatorIndex_ = validatorCount_;\n            validatorCount_++;\n        }\n\n        // Object\n\n        const ValueType* properties = GetMember(value, GetPropertiesString());\n        const ValueType* required = GetMember(value, GetRequiredString());\n        const ValueType* dependencies = GetMember(value, GetDependenciesString());\n        {\n            // Gather properties from properties/required/dependencies\n            SValue allProperties(kArrayType);\n\n            if (properties && properties->IsObject())\n                for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr)\n                    AddUniqueElement(allProperties, itr->name);\n            \n            if (required && required->IsArray())\n                for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr)\n                    if (itr->IsString())\n                        AddUniqueElement(allProperties, *itr);\n\n            if (dependencies && dependencies->IsObject())\n                for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) {\n                    AddUniqueElement(allProperties, itr->name);\n                    if (itr->value.IsArray())\n                        for (ConstValueIterator i = itr->value.Begin(); i != itr->value.End(); ++i)\n                            if (i->IsString())\n                                AddUniqueElement(allProperties, *i);\n                }\n\n            if (allProperties.Size() > 0) {\n                propertyCount_ = allProperties.Size();\n                properties_ = static_cast<Property*>(allocator_->Malloc(sizeof(Property) * propertyCount_));\n                for (SizeType i = 0; i < propertyCount_; i++) {\n                    new (&properties_[i]) Property();\n                    properties_[i].name = allProperties[i];\n                    properties_[i].schema = typeless_;\n                }\n            }\n        }\n\n        if (properties && properties->IsObject()) {\n            PointerType q = p.Append(GetPropertiesString(), allocator_);\n            for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) {\n                SizeType index;\n                if (FindPropertyIndex(itr->name, &index))\n                    schemaDocument->CreateSchema(&properties_[index].schema, q.Append(itr->name, allocator_), itr->value, document);\n            }\n        }\n\n        if (const ValueType* v = GetMember(value, GetPatternPropertiesString())) {\n            PointerType q = p.Append(GetPatternPropertiesString(), allocator_);\n            patternProperties_ = static_cast<PatternProperty*>(allocator_->Malloc(sizeof(PatternProperty) * v->MemberCount()));\n            patternPropertyCount_ = 0;\n\n            for (ConstMemberIterator itr = v->MemberBegin(); itr != v->MemberEnd(); ++itr) {\n                new (&patternProperties_[patternPropertyCount_]) PatternProperty();\n                patternProperties_[patternPropertyCount_].pattern = CreatePattern(itr->name);\n                schemaDocument->CreateSchema(&patternProperties_[patternPropertyCount_].schema, q.Append(itr->name, allocator_), itr->value, document);\n                patternPropertyCount_++;\n            }\n        }\n\n        if (required && required->IsArray())\n            for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr)\n                if (itr->IsString()) {\n                    SizeType index;\n                    if (FindPropertyIndex(*itr, &index)) {\n                        properties_[index].required = true;\n                        hasRequired_ = true;\n                    }\n                }\n\n        if (dependencies && dependencies->IsObject()) {\n            PointerType q = p.Append(GetDependenciesString(), allocator_);\n            hasDependencies_ = true;\n            for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) {\n                SizeType sourceIndex;\n                if (FindPropertyIndex(itr->name, &sourceIndex)) {\n                    if (itr->value.IsArray()) {\n                        properties_[sourceIndex].dependencies = static_cast<bool*>(allocator_->Malloc(sizeof(bool) * propertyCount_));\n                        std::memset(properties_[sourceIndex].dependencies, 0, sizeof(bool)* propertyCount_);\n                        for (ConstValueIterator targetItr = itr->value.Begin(); targetItr != itr->value.End(); ++targetItr) {\n                            SizeType targetIndex;\n                            if (FindPropertyIndex(*targetItr, &targetIndex))\n                                properties_[sourceIndex].dependencies[targetIndex] = true;\n                        }\n                    }\n                    else if (itr->value.IsObject()) {\n                        hasSchemaDependencies_ = true;\n                        schemaDocument->CreateSchema(&properties_[sourceIndex].dependenciesSchema, q.Append(itr->name, allocator_), itr->value, document);\n                        properties_[sourceIndex].dependenciesValidatorIndex = validatorCount_;\n                        validatorCount_++;\n                    }\n                }\n            }\n        }\n\n        if (const ValueType* v = GetMember(value, GetAdditionalPropertiesString())) {\n            if (v->IsBool())\n                additionalProperties_ = v->GetBool();\n            else if (v->IsObject())\n                schemaDocument->CreateSchema(&additionalPropertiesSchema_, p.Append(GetAdditionalPropertiesString(), allocator_), *v, document);\n        }\n\n        AssignIfExist(minProperties_, value, GetMinPropertiesString());\n        AssignIfExist(maxProperties_, value, GetMaxPropertiesString());\n\n        // Array\n        if (const ValueType* v = GetMember(value, GetItemsString())) {\n            PointerType q = p.Append(GetItemsString(), allocator_);\n            if (v->IsObject()) // List validation\n                schemaDocument->CreateSchema(&itemsList_, q, *v, document);\n            else if (v->IsArray()) { // Tuple validation\n                itemsTuple_ = static_cast<const Schema**>(allocator_->Malloc(sizeof(const Schema*) * v->Size()));\n                SizeType index = 0;\n                for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr, index++)\n                    schemaDocument->CreateSchema(&itemsTuple_[itemsTupleCount_++], q.Append(index, allocator_), *itr, document);\n            }\n        }\n\n        AssignIfExist(minItems_, value, GetMinItemsString());\n        AssignIfExist(maxItems_, value, GetMaxItemsString());\n\n        if (const ValueType* v = GetMember(value, GetAdditionalItemsString())) {\n            if (v->IsBool())\n                additionalItems_ = v->GetBool();\n            else if (v->IsObject())\n                schemaDocument->CreateSchema(&additionalItemsSchema_, p.Append(GetAdditionalItemsString(), allocator_), *v, document);\n        }\n\n        AssignIfExist(uniqueItems_, value, GetUniqueItemsString());\n\n        // String\n        AssignIfExist(minLength_, value, GetMinLengthString());\n        AssignIfExist(maxLength_, value, GetMaxLengthString());\n\n        if (const ValueType* v = GetMember(value, GetPatternString()))\n            pattern_ = CreatePattern(*v);\n\n        // Number\n        if (const ValueType* v = GetMember(value, GetMinimumString()))\n            if (v->IsNumber())\n                minimum_.CopyFrom(*v, *allocator_);\n\n        if (const ValueType* v = GetMember(value, GetMaximumString()))\n            if (v->IsNumber())\n                maximum_.CopyFrom(*v, *allocator_);\n\n        AssignIfExist(exclusiveMinimum_, value, GetExclusiveMinimumString());\n        AssignIfExist(exclusiveMaximum_, value, GetExclusiveMaximumString());\n\n        if (const ValueType* v = GetMember(value, GetMultipleOfString()))\n            if (v->IsNumber() && v->GetDouble() > 0.0)\n                multipleOf_.CopyFrom(*v, *allocator_);\n\n        // Default\n        if (const ValueType* v = GetMember(value, GetDefaultValueString()))\n            if (v->IsString())\n                defaultValueLength_ = v->GetStringLength();\n\n    }\n\n    ~Schema() {\n        AllocatorType::Free(enum_);\n        if (properties_) {\n            for (SizeType i = 0; i < propertyCount_; i++)\n                properties_[i].~Property();\n            AllocatorType::Free(properties_);\n        }\n        if (patternProperties_) {\n            for (SizeType i = 0; i < patternPropertyCount_; i++)\n                patternProperties_[i].~PatternProperty();\n            AllocatorType::Free(patternProperties_);\n        }\n        AllocatorType::Free(itemsTuple_);\n#if CEREAL_RAPIDJSON_SCHEMA_HAS_REGEX\n        if (pattern_) {\n            pattern_->~RegexType();\n            AllocatorType::Free(pattern_);\n        }\n#endif\n    }\n\n    const SValue& GetURI() const {\n        return uri_;\n    }\n\n    const PointerType& GetPointer() const {\n        return pointer_;\n    }\n\n    bool BeginValue(Context& context) const {\n        if (context.inArray) {\n            if (uniqueItems_)\n                context.valueUniqueness = true;\n\n            if (itemsList_)\n                context.valueSchema = itemsList_;\n            else if (itemsTuple_) {\n                if (context.arrayElementIndex < itemsTupleCount_)\n                    context.valueSchema = itemsTuple_[context.arrayElementIndex];\n                else if (additionalItemsSchema_)\n                    context.valueSchema = additionalItemsSchema_;\n                else if (additionalItems_)\n                    context.valueSchema = typeless_;\n                else {\n                    context.error_handler.DisallowedItem(context.arrayElementIndex);\n                    CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetItemsString());\n                }\n            }\n            else\n                context.valueSchema = typeless_;\n\n            context.arrayElementIndex++;\n        }\n        return true;\n    }\n\n    CEREAL_RAPIDJSON_FORCEINLINE bool EndValue(Context& context) const {\n        if (context.patternPropertiesValidatorCount > 0) {\n            bool otherValid = false;\n            SizeType count = context.patternPropertiesValidatorCount;\n            if (context.objectPatternValidatorType != Context::kPatternValidatorOnly)\n                otherValid = context.patternPropertiesValidators[--count]->IsValid();\n\n            bool patternValid = true;\n            for (SizeType i = 0; i < count; i++)\n                if (!context.patternPropertiesValidators[i]->IsValid()) {\n                    patternValid = false;\n                    break;\n                }\n\n            if (context.objectPatternValidatorType == Context::kPatternValidatorOnly) {\n                if (!patternValid) {\n                    context.error_handler.PropertyViolations(context.patternPropertiesValidators, count);\n                    CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString());\n                }\n            }\n            else if (context.objectPatternValidatorType == Context::kPatternValidatorWithProperty) {\n                if (!patternValid || !otherValid) {\n                    context.error_handler.PropertyViolations(context.patternPropertiesValidators, count + 1);\n                    CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString());\n                }\n            }\n            else if (!patternValid && !otherValid) { // kPatternValidatorWithAdditionalProperty)\n                context.error_handler.PropertyViolations(context.patternPropertiesValidators, count + 1);\n                CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString());\n            }\n        }\n\n        if (enum_) {\n            const uint64_t h = context.factory.GetHashCode(context.hasher);\n            for (SizeType i = 0; i < enumCount_; i++)\n                if (enum_[i] == h)\n                    goto foundEnum;\n            context.error_handler.DisallowedValue();\n            CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetEnumString());\n            foundEnum:;\n        }\n\n        if (allOf_.schemas)\n            for (SizeType i = allOf_.begin; i < allOf_.begin + allOf_.count; i++)\n                if (!context.validators[i]->IsValid()) {\n                    context.error_handler.NotAllOf(&context.validators[allOf_.begin], allOf_.count);\n                    CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetAllOfString());\n                }\n        \n        if (anyOf_.schemas) {\n            for (SizeType i = anyOf_.begin; i < anyOf_.begin + anyOf_.count; i++)\n                if (context.validators[i]->IsValid())\n                    goto foundAny;\n            context.error_handler.NoneOf(&context.validators[anyOf_.begin], anyOf_.count);\n            CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetAnyOfString());\n            foundAny:;\n        }\n\n        if (oneOf_.schemas) {\n            bool oneValid = false;\n            for (SizeType i = oneOf_.begin; i < oneOf_.begin + oneOf_.count; i++)\n                if (context.validators[i]->IsValid()) {\n                    if (oneValid) {\n                        context.error_handler.NotOneOf(&context.validators[oneOf_.begin], oneOf_.count);\n                        CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetOneOfString());\n                    } else\n                        oneValid = true;\n                }\n            if (!oneValid) {\n                context.error_handler.NotOneOf(&context.validators[oneOf_.begin], oneOf_.count);\n                CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetOneOfString());\n            }\n        }\n\n        if (not_ && context.validators[notValidatorIndex_]->IsValid()) {\n            context.error_handler.Disallowed();\n            CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetNotString());\n        }\n\n        return true;\n    }\n\n    bool Null(Context& context) const {\n        if (!(type_ & (1 << kNullSchemaType))) {\n            DisallowedType(context, GetNullString());\n            CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString());\n        }\n        return CreateParallelValidator(context);\n    }\n    \n    bool Bool(Context& context, bool) const {\n        if (!(type_ & (1 << kBooleanSchemaType))) {\n            DisallowedType(context, GetBooleanString());\n            CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString());\n        }\n        return CreateParallelValidator(context);\n    }\n\n    bool Int(Context& context, int i) const {\n        if (!CheckInt(context, i))\n            return false;\n        return CreateParallelValidator(context);\n    }\n\n    bool Uint(Context& context, unsigned u) const {\n        if (!CheckUint(context, u))\n            return false;\n        return CreateParallelValidator(context);\n    }\n\n    bool Int64(Context& context, int64_t i) const {\n        if (!CheckInt(context, i))\n            return false;\n        return CreateParallelValidator(context);\n    }\n\n    bool Uint64(Context& context, uint64_t u) const {\n        if (!CheckUint(context, u))\n            return false;\n        return CreateParallelValidator(context);\n    }\n\n    bool Double(Context& context, double d) const {\n        if (!(type_ & (1 << kNumberSchemaType))) {\n            DisallowedType(context, GetNumberString());\n            CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString());\n        }\n\n        if (!minimum_.IsNull() && !CheckDoubleMinimum(context, d))\n            return false;\n\n        if (!maximum_.IsNull() && !CheckDoubleMaximum(context, d))\n            return false;\n        \n        if (!multipleOf_.IsNull() && !CheckDoubleMultipleOf(context, d))\n            return false;\n        \n        return CreateParallelValidator(context);\n    }\n    \n    bool String(Context& context, const Ch* str, SizeType length, bool) const {\n        if (!(type_ & (1 << kStringSchemaType))) {\n            DisallowedType(context, GetStringString());\n            CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString());\n        }\n\n        if (minLength_ != 0 || maxLength_ != SizeType(~0)) {\n            SizeType count;\n            if (internal::CountStringCodePoint<EncodingType>(str, length, &count)) {\n                if (count < minLength_) {\n                    context.error_handler.TooShort(str, length, minLength_);\n                    CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinLengthString());\n                }\n                if (count > maxLength_) {\n                    context.error_handler.TooLong(str, length, maxLength_);\n                    CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxLengthString());\n                }\n            }\n        }\n\n        if (pattern_ && !IsPatternMatch(pattern_, str, length)) {\n            context.error_handler.DoesNotMatch(str, length);\n            CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternString());\n        }\n\n        return CreateParallelValidator(context);\n    }\n\n    bool StartObject(Context& context) const {\n        if (!(type_ & (1 << kObjectSchemaType))) {\n            DisallowedType(context, GetObjectString());\n            CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString());\n        }\n\n        if (hasDependencies_ || hasRequired_) {\n            context.propertyExist = static_cast<bool*>(context.factory.MallocState(sizeof(bool) * propertyCount_));\n            std::memset(context.propertyExist, 0, sizeof(bool) * propertyCount_);\n        }\n\n        if (patternProperties_) { // pre-allocate schema array\n            SizeType count = patternPropertyCount_ + 1; // extra for valuePatternValidatorType\n            context.patternPropertiesSchemas = static_cast<const SchemaType**>(context.factory.MallocState(sizeof(const SchemaType*) * count));\n            context.patternPropertiesSchemaCount = 0;\n            std::memset(context.patternPropertiesSchemas, 0, sizeof(SchemaType*) * count);\n        }\n\n        return CreateParallelValidator(context);\n    }\n    \n    bool Key(Context& context, const Ch* str, SizeType len, bool) const {\n        if (patternProperties_) {\n            context.patternPropertiesSchemaCount = 0;\n            for (SizeType i = 0; i < patternPropertyCount_; i++)\n                if (patternProperties_[i].pattern && IsPatternMatch(patternProperties_[i].pattern, str, len)) {\n                    context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = patternProperties_[i].schema;\n                    context.valueSchema = typeless_;\n                }\n        }\n\n        SizeType index;\n        if (FindPropertyIndex(ValueType(str, len).Move(), &index)) {\n            if (context.patternPropertiesSchemaCount > 0) {\n                context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = properties_[index].schema;\n                context.valueSchema = typeless_;\n                context.valuePatternValidatorType = Context::kPatternValidatorWithProperty;\n            }\n            else\n                context.valueSchema = properties_[index].schema;\n\n            if (context.propertyExist)\n                context.propertyExist[index] = true;\n\n            return true;\n        }\n\n        if (additionalPropertiesSchema_) {\n            if (additionalPropertiesSchema_ && context.patternPropertiesSchemaCount > 0) {\n                context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = additionalPropertiesSchema_;\n                context.valueSchema = typeless_;\n                context.valuePatternValidatorType = Context::kPatternValidatorWithAdditionalProperty;\n            }\n            else\n                context.valueSchema = additionalPropertiesSchema_;\n            return true;\n        }\n        else if (additionalProperties_) {\n            context.valueSchema = typeless_;\n            return true;\n        }\n\n        if (context.patternPropertiesSchemaCount == 0) { // patternProperties are not additional properties\n            context.error_handler.DisallowedProperty(str, len);\n            CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetAdditionalPropertiesString());\n        }\n\n        return true;\n    }\n\n    bool EndObject(Context& context, SizeType memberCount) const {\n        if (hasRequired_) {\n            context.error_handler.StartMissingProperties();\n            for (SizeType index = 0; index < propertyCount_; index++)\n                if (properties_[index].required && !context.propertyExist[index])\n                    if (properties_[index].schema->defaultValueLength_ == 0 )\n                        context.error_handler.AddMissingProperty(properties_[index].name);\n            if (context.error_handler.EndMissingProperties())\n                CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetRequiredString());\n        }\n\n        if (memberCount < minProperties_) {\n            context.error_handler.TooFewProperties(memberCount, minProperties_);\n            CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinPropertiesString());\n        }\n\n        if (memberCount > maxProperties_) {\n            context.error_handler.TooManyProperties(memberCount, maxProperties_);\n            CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxPropertiesString());\n        }\n\n        if (hasDependencies_) {\n            context.error_handler.StartDependencyErrors();\n            for (SizeType sourceIndex = 0; sourceIndex < propertyCount_; sourceIndex++) {\n                const Property& source = properties_[sourceIndex];\n                if (context.propertyExist[sourceIndex]) {\n                    if (source.dependencies) {\n                        context.error_handler.StartMissingDependentProperties();\n                        for (SizeType targetIndex = 0; targetIndex < propertyCount_; targetIndex++)\n                            if (source.dependencies[targetIndex] && !context.propertyExist[targetIndex])\n                                context.error_handler.AddMissingDependentProperty(properties_[targetIndex].name);\n                        context.error_handler.EndMissingDependentProperties(source.name);\n                    }\n                    else if (source.dependenciesSchema) {\n                        ISchemaValidator* dependenciesValidator = context.validators[source.dependenciesValidatorIndex];\n                        if (!dependenciesValidator->IsValid())\n                            context.error_handler.AddDependencySchemaError(source.name, dependenciesValidator);\n                    }\n                }\n            }\n            if (context.error_handler.EndDependencyErrors())\n                CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetDependenciesString());\n        }\n\n        return true;\n    }\n\n    bool StartArray(Context& context) const {\n        if (!(type_ & (1 << kArraySchemaType))) {\n            DisallowedType(context, GetArrayString());\n            CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString());\n        }\n\n        context.arrayElementIndex = 0;\n        context.inArray = true;\n\n        return CreateParallelValidator(context);\n    }\n\n    bool EndArray(Context& context, SizeType elementCount) const {\n        context.inArray = false;\n        \n        if (elementCount < minItems_) {\n            context.error_handler.TooFewItems(elementCount, minItems_);\n            CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinItemsString());\n        }\n        \n        if (elementCount > maxItems_) {\n            context.error_handler.TooManyItems(elementCount, maxItems_);\n            CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxItemsString());\n        }\n\n        return true;\n    }\n\n    // Generate functions for string literal according to Ch\n#define CEREAL_RAPIDJSON_STRING_(name, ...) \\\n    static const ValueType& Get##name##String() {\\\n        static const Ch s[] = { __VA_ARGS__, '\\0' };\\\n        static const ValueType v(s, static_cast<SizeType>(sizeof(s) / sizeof(Ch) - 1));\\\n        return v;\\\n    }\n\n    CEREAL_RAPIDJSON_STRING_(Null, 'n', 'u', 'l', 'l')\n    CEREAL_RAPIDJSON_STRING_(Boolean, 'b', 'o', 'o', 'l', 'e', 'a', 'n')\n    CEREAL_RAPIDJSON_STRING_(Object, 'o', 'b', 'j', 'e', 'c', 't')\n    CEREAL_RAPIDJSON_STRING_(Array, 'a', 'r', 'r', 'a', 'y')\n    CEREAL_RAPIDJSON_STRING_(String, 's', 't', 'r', 'i', 'n', 'g')\n    CEREAL_RAPIDJSON_STRING_(Number, 'n', 'u', 'm', 'b', 'e', 'r')\n    CEREAL_RAPIDJSON_STRING_(Integer, 'i', 'n', 't', 'e', 'g', 'e', 'r')\n    CEREAL_RAPIDJSON_STRING_(Type, 't', 'y', 'p', 'e')\n    CEREAL_RAPIDJSON_STRING_(Enum, 'e', 'n', 'u', 'm')\n    CEREAL_RAPIDJSON_STRING_(AllOf, 'a', 'l', 'l', 'O', 'f')\n    CEREAL_RAPIDJSON_STRING_(AnyOf, 'a', 'n', 'y', 'O', 'f')\n    CEREAL_RAPIDJSON_STRING_(OneOf, 'o', 'n', 'e', 'O', 'f')\n    CEREAL_RAPIDJSON_STRING_(Not, 'n', 'o', 't')\n    CEREAL_RAPIDJSON_STRING_(Properties, 'p', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's')\n    CEREAL_RAPIDJSON_STRING_(Required, 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd')\n    CEREAL_RAPIDJSON_STRING_(Dependencies, 'd', 'e', 'p', 'e', 'n', 'd', 'e', 'n', 'c', 'i', 'e', 's')\n    CEREAL_RAPIDJSON_STRING_(PatternProperties, 'p', 'a', 't', 't', 'e', 'r', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's')\n    CEREAL_RAPIDJSON_STRING_(AdditionalProperties, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's')\n    CEREAL_RAPIDJSON_STRING_(MinProperties, 'm', 'i', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's')\n    CEREAL_RAPIDJSON_STRING_(MaxProperties, 'm', 'a', 'x', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's')\n    CEREAL_RAPIDJSON_STRING_(Items, 'i', 't', 'e', 'm', 's')\n    CEREAL_RAPIDJSON_STRING_(MinItems, 'm', 'i', 'n', 'I', 't', 'e', 'm', 's')\n    CEREAL_RAPIDJSON_STRING_(MaxItems, 'm', 'a', 'x', 'I', 't', 'e', 'm', 's')\n    CEREAL_RAPIDJSON_STRING_(AdditionalItems, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'I', 't', 'e', 'm', 's')\n    CEREAL_RAPIDJSON_STRING_(UniqueItems, 'u', 'n', 'i', 'q', 'u', 'e', 'I', 't', 'e', 'm', 's')\n    CEREAL_RAPIDJSON_STRING_(MinLength, 'm', 'i', 'n', 'L', 'e', 'n', 'g', 't', 'h')\n    CEREAL_RAPIDJSON_STRING_(MaxLength, 'm', 'a', 'x', 'L', 'e', 'n', 'g', 't', 'h')\n    CEREAL_RAPIDJSON_STRING_(Pattern, 'p', 'a', 't', 't', 'e', 'r', 'n')\n    CEREAL_RAPIDJSON_STRING_(Minimum, 'm', 'i', 'n', 'i', 'm', 'u', 'm')\n    CEREAL_RAPIDJSON_STRING_(Maximum, 'm', 'a', 'x', 'i', 'm', 'u', 'm')\n    CEREAL_RAPIDJSON_STRING_(ExclusiveMinimum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'i', 'n', 'i', 'm', 'u', 'm')\n    CEREAL_RAPIDJSON_STRING_(ExclusiveMaximum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'a', 'x', 'i', 'm', 'u', 'm')\n    CEREAL_RAPIDJSON_STRING_(MultipleOf, 'm', 'u', 'l', 't', 'i', 'p', 'l', 'e', 'O', 'f')\n    CEREAL_RAPIDJSON_STRING_(DefaultValue, 'd', 'e', 'f', 'a', 'u', 'l', 't')\n\n#undef CEREAL_RAPIDJSON_STRING_\n\nprivate:\n    enum SchemaValueType {\n        kNullSchemaType,\n        kBooleanSchemaType,\n        kObjectSchemaType,\n        kArraySchemaType,\n        kStringSchemaType,\n        kNumberSchemaType,\n        kIntegerSchemaType,\n        kTotalSchemaType\n    };\n\n#if CEREAL_RAPIDJSON_SCHEMA_USE_INTERNALREGEX\n        typedef internal::GenericRegex<EncodingType, AllocatorType> RegexType;\n#elif CEREAL_RAPIDJSON_SCHEMA_USE_STDREGEX\n        typedef std::basic_regex<Ch> RegexType;\n#else\n        typedef char RegexType;\n#endif\n\n    struct SchemaArray {\n        SchemaArray() : schemas(), count() {}\n        ~SchemaArray() { AllocatorType::Free(schemas); }\n        const SchemaType** schemas;\n        SizeType begin; // begin index of context.validators\n        SizeType count;\n    };\n\n    template <typename V1, typename V2>\n    void AddUniqueElement(V1& a, const V2& v) {\n        for (typename V1::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr)\n            if (*itr == v)\n                return;\n        V1 c(v, *allocator_);\n        a.PushBack(c, *allocator_);\n    }\n\n    static const ValueType* GetMember(const ValueType& value, const ValueType& name) {\n        typename ValueType::ConstMemberIterator itr = value.FindMember(name);\n        return itr != value.MemberEnd() ? &(itr->value) : 0;\n    }\n\n    static void AssignIfExist(bool& out, const ValueType& value, const ValueType& name) {\n        if (const ValueType* v = GetMember(value, name))\n            if (v->IsBool())\n                out = v->GetBool();\n    }\n\n    static void AssignIfExist(SizeType& out, const ValueType& value, const ValueType& name) {\n        if (const ValueType* v = GetMember(value, name))\n            if (v->IsUint64() && v->GetUint64() <= SizeType(~0))\n                out = static_cast<SizeType>(v->GetUint64());\n    }\n\n    void AssignIfExist(SchemaArray& out, SchemaDocumentType& schemaDocument, const PointerType& p, const ValueType& value, const ValueType& name, const ValueType& document) {\n        if (const ValueType* v = GetMember(value, name)) {\n            if (v->IsArray() && v->Size() > 0) {\n                PointerType q = p.Append(name, allocator_);\n                out.count = v->Size();\n                out.schemas = static_cast<const Schema**>(allocator_->Malloc(out.count * sizeof(const Schema*)));\n                memset(out.schemas, 0, sizeof(Schema*)* out.count);\n                for (SizeType i = 0; i < out.count; i++)\n                    schemaDocument.CreateSchema(&out.schemas[i], q.Append(i, allocator_), (*v)[i], document);\n                out.begin = validatorCount_;\n                validatorCount_ += out.count;\n            }\n        }\n    }\n\n#if CEREAL_RAPIDJSON_SCHEMA_USE_INTERNALREGEX\n    template <typename ValueType>\n    RegexType* CreatePattern(const ValueType& value) {\n        if (value.IsString()) {\n            RegexType* r = new (allocator_->Malloc(sizeof(RegexType))) RegexType(value.GetString(), allocator_);\n            if (!r->IsValid()) {\n                r->~RegexType();\n                AllocatorType::Free(r);\n                r = 0;\n            }\n            return r;\n        }\n        return 0;\n    }\n\n    static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType) {\n        GenericRegexSearch<RegexType> rs(*pattern);\n        return rs.Search(str);\n    }\n#elif CEREAL_RAPIDJSON_SCHEMA_USE_STDREGEX\n    template <typename ValueType>\n    RegexType* CreatePattern(const ValueType& value) {\n        if (value.IsString()) {\n            RegexType *r = static_cast<RegexType*>(allocator_->Malloc(sizeof(RegexType)));\n            try {\n                return new (r) RegexType(value.GetString(), std::size_t(value.GetStringLength()), std::regex_constants::ECMAScript);\n            }\n            catch (const std::regex_error&) {\n                AllocatorType::Free(r);\n            }\n        }\n        return 0;\n    }\n\n    static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType length) {\n        std::match_results<const Ch*> r;\n        return std::regex_search(str, str + length, r, *pattern);\n    }\n#else\n    template <typename ValueType>\n    RegexType* CreatePattern(const ValueType&) { return 0; }\n\n    static bool IsPatternMatch(const RegexType*, const Ch *, SizeType) { return true; }\n#endif // CEREAL_RAPIDJSON_SCHEMA_USE_STDREGEX\n\n    void AddType(const ValueType& type) {\n        if      (type == GetNullString()   ) type_ |= 1 << kNullSchemaType;\n        else if (type == GetBooleanString()) type_ |= 1 << kBooleanSchemaType;\n        else if (type == GetObjectString() ) type_ |= 1 << kObjectSchemaType;\n        else if (type == GetArrayString()  ) type_ |= 1 << kArraySchemaType;\n        else if (type == GetStringString() ) type_ |= 1 << kStringSchemaType;\n        else if (type == GetIntegerString()) type_ |= 1 << kIntegerSchemaType;\n        else if (type == GetNumberString() ) type_ |= (1 << kNumberSchemaType) | (1 << kIntegerSchemaType);\n    }\n\n    bool CreateParallelValidator(Context& context) const {\n        if (enum_ || context.arrayUniqueness)\n            context.hasher = context.factory.CreateHasher();\n\n        if (validatorCount_) {\n            CEREAL_RAPIDJSON_ASSERT(context.validators == 0);\n            context.validators = static_cast<ISchemaValidator**>(context.factory.MallocState(sizeof(ISchemaValidator*) * validatorCount_));\n            context.validatorCount = validatorCount_;\n\n            if (allOf_.schemas)\n                CreateSchemaValidators(context, allOf_);\n\n            if (anyOf_.schemas)\n                CreateSchemaValidators(context, anyOf_);\n            \n            if (oneOf_.schemas)\n                CreateSchemaValidators(context, oneOf_);\n            \n            if (not_)\n                context.validators[notValidatorIndex_] = context.factory.CreateSchemaValidator(*not_);\n            \n            if (hasSchemaDependencies_) {\n                for (SizeType i = 0; i < propertyCount_; i++)\n                    if (properties_[i].dependenciesSchema)\n                        context.validators[properties_[i].dependenciesValidatorIndex] = context.factory.CreateSchemaValidator(*properties_[i].dependenciesSchema);\n            }\n        }\n\n        return true;\n    }\n\n    void CreateSchemaValidators(Context& context, const SchemaArray& schemas) const {\n        for (SizeType i = 0; i < schemas.count; i++)\n            context.validators[schemas.begin + i] = context.factory.CreateSchemaValidator(*schemas.schemas[i]);\n    }\n\n    // O(n)\n    bool FindPropertyIndex(const ValueType& name, SizeType* outIndex) const {\n        SizeType len = name.GetStringLength();\n        const Ch* str = name.GetString();\n        for (SizeType index = 0; index < propertyCount_; index++)\n            if (properties_[index].name.GetStringLength() == len && \n                (std::memcmp(properties_[index].name.GetString(), str, sizeof(Ch) * len) == 0))\n            {\n                *outIndex = index;\n                return true;\n            }\n        return false;\n    }\n\n    bool CheckInt(Context& context, int64_t i) const {\n        if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) {\n            DisallowedType(context, GetIntegerString());\n            CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString());\n        }\n\n        if (!minimum_.IsNull()) {\n            if (minimum_.IsInt64()) {\n                if (exclusiveMinimum_ ? i <= minimum_.GetInt64() : i < minimum_.GetInt64()) {\n                    context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_);\n                    CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString());\n                }\n            }\n            else if (minimum_.IsUint64()) {\n                context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_);\n                CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); // i <= max(int64_t) < minimum.GetUint64()\n            }\n            else if (!CheckDoubleMinimum(context, static_cast<double>(i)))\n                return false;\n        }\n\n        if (!maximum_.IsNull()) {\n            if (maximum_.IsInt64()) {\n                if (exclusiveMaximum_ ? i >= maximum_.GetInt64() : i > maximum_.GetInt64()) {\n                    context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_);\n                    CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString());\n                }\n            }\n            else if (maximum_.IsUint64()) { }\n                /* do nothing */ // i <= max(int64_t) < maximum_.GetUint64()\n            else if (!CheckDoubleMaximum(context, static_cast<double>(i)))\n                return false;\n        }\n\n        if (!multipleOf_.IsNull()) {\n            if (multipleOf_.IsUint64()) {\n                if (static_cast<uint64_t>(i >= 0 ? i : -i) % multipleOf_.GetUint64() != 0) {\n                    context.error_handler.NotMultipleOf(i, multipleOf_);\n                    CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString());\n                }\n            }\n            else if (!CheckDoubleMultipleOf(context, static_cast<double>(i)))\n                return false;\n        }\n\n        return true;\n    }\n\n    bool CheckUint(Context& context, uint64_t i) const {\n        if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) {\n            DisallowedType(context, GetIntegerString());\n            CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString());\n        }\n\n        if (!minimum_.IsNull()) {\n            if (minimum_.IsUint64()) {\n                if (exclusiveMinimum_ ? i <= minimum_.GetUint64() : i < minimum_.GetUint64()) {\n                    context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_);\n                    CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString());\n                }\n            }\n            else if (minimum_.IsInt64())\n                /* do nothing */; // i >= 0 > minimum.Getint64()\n            else if (!CheckDoubleMinimum(context, static_cast<double>(i)))\n                return false;\n        }\n\n        if (!maximum_.IsNull()) {\n            if (maximum_.IsUint64()) {\n                if (exclusiveMaximum_ ? i >= maximum_.GetUint64() : i > maximum_.GetUint64()) {\n                    context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_);\n                    CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString());\n                }\n            }\n            else if (maximum_.IsInt64()) {\n                context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_);\n                CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); // i >= 0 > maximum_\n            }\n            else if (!CheckDoubleMaximum(context, static_cast<double>(i)))\n                return false;\n        }\n\n        if (!multipleOf_.IsNull()) {\n            if (multipleOf_.IsUint64()) {\n                if (i % multipleOf_.GetUint64() != 0) {\n                    context.error_handler.NotMultipleOf(i, multipleOf_);\n                    CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString());\n                }\n            }\n            else if (!CheckDoubleMultipleOf(context, static_cast<double>(i)))\n                return false;\n        }\n\n        return true;\n    }\n\n    bool CheckDoubleMinimum(Context& context, double d) const {\n        if (exclusiveMinimum_ ? d <= minimum_.GetDouble() : d < minimum_.GetDouble()) {\n            context.error_handler.BelowMinimum(d, minimum_, exclusiveMinimum_);\n            CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString());\n        }\n        return true;\n    }\n\n    bool CheckDoubleMaximum(Context& context, double d) const {\n        if (exclusiveMaximum_ ? d >= maximum_.GetDouble() : d > maximum_.GetDouble()) {\n            context.error_handler.AboveMaximum(d, maximum_, exclusiveMaximum_);\n            CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString());\n        }\n        return true;\n    }\n\n    bool CheckDoubleMultipleOf(Context& context, double d) const {\n        double a = std::abs(d), b = std::abs(multipleOf_.GetDouble());\n        double q = std::floor(a / b);\n        double r = a - q * b;\n        if (r > 0.0) {\n            context.error_handler.NotMultipleOf(d, multipleOf_);\n            CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString());\n        }\n        return true;\n    }\n\n    void DisallowedType(Context& context, const ValueType& actualType) const {\n        ErrorHandler& eh = context.error_handler;\n        eh.StartDisallowedType();\n\n        if (type_ & (1 << kNullSchemaType)) eh.AddExpectedType(GetNullString());\n        if (type_ & (1 << kBooleanSchemaType)) eh.AddExpectedType(GetBooleanString());\n        if (type_ & (1 << kObjectSchemaType)) eh.AddExpectedType(GetObjectString());\n        if (type_ & (1 << kArraySchemaType)) eh.AddExpectedType(GetArrayString());\n        if (type_ & (1 << kStringSchemaType)) eh.AddExpectedType(GetStringString());\n\n        if (type_ & (1 << kNumberSchemaType)) eh.AddExpectedType(GetNumberString());\n        else if (type_ & (1 << kIntegerSchemaType)) eh.AddExpectedType(GetIntegerString());\n\n        eh.EndDisallowedType(actualType);\n    }\n\n    struct Property {\n        Property() : schema(), dependenciesSchema(), dependenciesValidatorIndex(), dependencies(), required(false) {}\n        ~Property() { AllocatorType::Free(dependencies); }\n        SValue name;\n        const SchemaType* schema;\n        const SchemaType* dependenciesSchema;\n        SizeType dependenciesValidatorIndex;\n        bool* dependencies;\n        bool required;\n    };\n\n    struct PatternProperty {\n        PatternProperty() : schema(), pattern() {}\n        ~PatternProperty() { \n            if (pattern) {\n                pattern->~RegexType();\n                AllocatorType::Free(pattern);\n            }\n        }\n        const SchemaType* schema;\n        RegexType* pattern;\n    };\n\n    AllocatorType* allocator_;\n    SValue uri_;\n    PointerType pointer_;\n    const SchemaType* typeless_;\n    uint64_t* enum_;\n    SizeType enumCount_;\n    SchemaArray allOf_;\n    SchemaArray anyOf_;\n    SchemaArray oneOf_;\n    const SchemaType* not_;\n    unsigned type_; // bitmask of kSchemaType\n    SizeType validatorCount_;\n    SizeType notValidatorIndex_;\n\n    Property* properties_;\n    const SchemaType* additionalPropertiesSchema_;\n    PatternProperty* patternProperties_;\n    SizeType patternPropertyCount_;\n    SizeType propertyCount_;\n    SizeType minProperties_;\n    SizeType maxProperties_;\n    bool additionalProperties_;\n    bool hasDependencies_;\n    bool hasRequired_;\n    bool hasSchemaDependencies_;\n\n    const SchemaType* additionalItemsSchema_;\n    const SchemaType* itemsList_;\n    const SchemaType** itemsTuple_;\n    SizeType itemsTupleCount_;\n    SizeType minItems_;\n    SizeType maxItems_;\n    bool additionalItems_;\n    bool uniqueItems_;\n\n    RegexType* pattern_;\n    SizeType minLength_;\n    SizeType maxLength_;\n\n    SValue minimum_;\n    SValue maximum_;\n    SValue multipleOf_;\n    bool exclusiveMinimum_;\n    bool exclusiveMaximum_;\n    \n    SizeType defaultValueLength_;\n};\n\ntemplate<typename Stack, typename Ch>\nstruct TokenHelper {\n    CEREAL_RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) {\n        *documentStack.template Push<Ch>() = '/';\n        char buffer[21];\n        size_t length = static_cast<size_t>((sizeof(SizeType) == 4 ? u32toa(index, buffer) : u64toa(index, buffer)) - buffer);\n        for (size_t i = 0; i < length; i++)\n            *documentStack.template Push<Ch>() = static_cast<Ch>(buffer[i]);\n    }\n};\n\n// Partial specialized version for char to prevent buffer copying.\ntemplate <typename Stack>\nstruct TokenHelper<Stack, char> {\n    CEREAL_RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) {\n        if (sizeof(SizeType) == 4) {\n            char *buffer = documentStack.template Push<char>(1 + 10); // '/' + uint\n            *buffer++ = '/';\n            const char* end = internal::u32toa(index, buffer);\n             documentStack.template Pop<char>(static_cast<size_t>(10 - (end - buffer)));\n        }\n        else {\n            char *buffer = documentStack.template Push<char>(1 + 20); // '/' + uint64\n            *buffer++ = '/';\n            const char* end = internal::u64toa(index, buffer);\n            documentStack.template Pop<char>(static_cast<size_t>(20 - (end - buffer)));\n        }\n    }\n};\n\n} // namespace internal\n\n///////////////////////////////////////////////////////////////////////////////\n// IGenericRemoteSchemaDocumentProvider\n\ntemplate <typename SchemaDocumentType>\nclass IGenericRemoteSchemaDocumentProvider {\npublic:\n    typedef typename SchemaDocumentType::Ch Ch;\n\n    virtual ~IGenericRemoteSchemaDocumentProvider() {}\n    virtual const SchemaDocumentType* GetRemoteDocument(const Ch* uri, SizeType length) = 0;\n};\n\n///////////////////////////////////////////////////////////////////////////////\n// GenericSchemaDocument\n\n//! JSON schema document.\n/*!\n    A JSON schema document is a compiled version of a JSON schema.\n    It is basically a tree of internal::Schema.\n\n    \\note This is an immutable class (i.e. its instance cannot be modified after construction).\n    \\tparam ValueT Type of JSON value (e.g. \\c Value ), which also determine the encoding.\n    \\tparam Allocator Allocator type for allocating memory of this document.\n*/\ntemplate <typename ValueT, typename Allocator = CrtAllocator>\nclass GenericSchemaDocument {\npublic:\n    typedef ValueT ValueType;\n    typedef IGenericRemoteSchemaDocumentProvider<GenericSchemaDocument> IRemoteSchemaDocumentProviderType;\n    typedef Allocator AllocatorType;\n    typedef typename ValueType::EncodingType EncodingType;\n    typedef typename EncodingType::Ch Ch;\n    typedef internal::Schema<GenericSchemaDocument> SchemaType;\n    typedef GenericPointer<ValueType, Allocator> PointerType;\n    typedef GenericValue<EncodingType, Allocator> URIType;\n    friend class internal::Schema<GenericSchemaDocument>;\n    template <typename, typename, typename>\n    friend class GenericSchemaValidator;\n\n    //! Constructor.\n    /*!\n        Compile a JSON document into schema document.\n\n        \\param document A JSON document as source.\n        \\param uri The base URI of this schema document for purposes of violation reporting.\n        \\param uriLength Length of \\c name, in code points.\n        \\param remoteProvider An optional remote schema document provider for resolving remote reference. Can be null.\n        \\param allocator An optional allocator instance for allocating memory. Can be null.\n    */\n    explicit GenericSchemaDocument(const ValueType& document, const Ch* uri = 0, SizeType uriLength = 0,\n        IRemoteSchemaDocumentProviderType* remoteProvider = 0, Allocator* allocator = 0) :\n        remoteProvider_(remoteProvider),\n        allocator_(allocator),\n        ownAllocator_(),\n        root_(),\n        typeless_(),\n        schemaMap_(allocator, kInitialSchemaMapSize),\n        schemaRef_(allocator, kInitialSchemaRefSize)\n    {\n        if (!allocator_)\n            ownAllocator_ = allocator_ = CEREAL_RAPIDJSON_NEW(Allocator)();\n\n        Ch noUri[1] = {0};\n        uri_.SetString(uri ? uri : noUri, uriLength, *allocator_);\n\n        typeless_ = static_cast<SchemaType*>(allocator_->Malloc(sizeof(SchemaType)));\n        new (typeless_) SchemaType(this, PointerType(), ValueType(kObjectType).Move(), ValueType(kObjectType).Move(), allocator_);\n\n        // Generate root schema, it will call CreateSchema() to create sub-schemas,\n        // And call AddRefSchema() if there are $ref.\n        CreateSchemaRecursive(&root_, PointerType(), document, document);\n\n        // Resolve $ref\n        while (!schemaRef_.Empty()) {\n            SchemaRefEntry* refEntry = schemaRef_.template Pop<SchemaRefEntry>(1);\n            if (const SchemaType* s = GetSchema(refEntry->target)) {\n                if (refEntry->schema)\n                    *refEntry->schema = s;\n\n                // Create entry in map if not exist\n                if (!GetSchema(refEntry->source)) {\n                    new (schemaMap_.template Push<SchemaEntry>()) SchemaEntry(refEntry->source, const_cast<SchemaType*>(s), false, allocator_);\n                }\n            }\n            else if (refEntry->schema)\n                *refEntry->schema = typeless_;\n\n            refEntry->~SchemaRefEntry();\n        }\n\n        CEREAL_RAPIDJSON_ASSERT(root_ != 0);\n\n        schemaRef_.ShrinkToFit(); // Deallocate all memory for ref\n    }\n\n#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n    //! Move constructor in C++11\n    GenericSchemaDocument(GenericSchemaDocument&& rhs) CEREAL_RAPIDJSON_NOEXCEPT :\n        remoteProvider_(rhs.remoteProvider_),\n        allocator_(rhs.allocator_),\n        ownAllocator_(rhs.ownAllocator_),\n        root_(rhs.root_),\n        typeless_(rhs.typeless_),\n        schemaMap_(std::move(rhs.schemaMap_)),\n        schemaRef_(std::move(rhs.schemaRef_)),\n        uri_(std::move(rhs.uri_))\n    {\n        rhs.remoteProvider_ = 0;\n        rhs.allocator_ = 0;\n        rhs.ownAllocator_ = 0;\n        rhs.typeless_ = 0;\n    }\n#endif\n\n    //! Destructor\n    ~GenericSchemaDocument() {\n        while (!schemaMap_.Empty())\n            schemaMap_.template Pop<SchemaEntry>(1)->~SchemaEntry();\n\n        if (typeless_) {\n            typeless_->~SchemaType();\n            Allocator::Free(typeless_);\n        }\n\n        CEREAL_RAPIDJSON_DELETE(ownAllocator_);\n    }\n\n    const URIType& GetURI() const { return uri_; }\n\n    //! Get the root schema.\n    const SchemaType& GetRoot() const { return *root_; }\n\nprivate:\n    //! Prohibit copying\n    GenericSchemaDocument(const GenericSchemaDocument&);\n    //! Prohibit assignment\n    GenericSchemaDocument& operator=(const GenericSchemaDocument&);\n\n    struct SchemaRefEntry {\n        SchemaRefEntry(const PointerType& s, const PointerType& t, const SchemaType** outSchema, Allocator *allocator) : source(s, allocator), target(t, allocator), schema(outSchema) {}\n        PointerType source;\n        PointerType target;\n        const SchemaType** schema;\n    };\n\n    struct SchemaEntry {\n        SchemaEntry(const PointerType& p, SchemaType* s, bool o, Allocator* allocator) : pointer(p, allocator), schema(s), owned(o) {}\n        ~SchemaEntry() {\n            if (owned) {\n                schema->~SchemaType();\n                Allocator::Free(schema);\n            }\n        }\n        PointerType pointer;\n        SchemaType* schema;\n        bool owned;\n    };\n\n    void CreateSchemaRecursive(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document) {\n        if (schema)\n            *schema = typeless_;\n\n        if (v.GetType() == kObjectType) {\n            const SchemaType* s = GetSchema(pointer);\n            if (!s)\n                CreateSchema(schema, pointer, v, document);\n\n            for (typename ValueType::ConstMemberIterator itr = v.MemberBegin(); itr != v.MemberEnd(); ++itr)\n                CreateSchemaRecursive(0, pointer.Append(itr->name, allocator_), itr->value, document);\n        }\n        else if (v.GetType() == kArrayType)\n            for (SizeType i = 0; i < v.Size(); i++)\n                CreateSchemaRecursive(0, pointer.Append(i, allocator_), v[i], document);\n    }\n\n    void CreateSchema(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document) {\n        CEREAL_RAPIDJSON_ASSERT(pointer.IsValid());\n        if (v.IsObject()) {\n            if (!HandleRefSchema(pointer, schema, v, document)) {\n                SchemaType* s = new (allocator_->Malloc(sizeof(SchemaType))) SchemaType(this, pointer, v, document, allocator_);\n                new (schemaMap_.template Push<SchemaEntry>()) SchemaEntry(pointer, s, true, allocator_);\n                if (schema)\n                    *schema = s;\n            }\n        }\n    }\n\n    bool HandleRefSchema(const PointerType& source, const SchemaType** schema, const ValueType& v, const ValueType& document) {\n        static const Ch kRefString[] = { '$', 'r', 'e', 'f', '\\0' };\n        static const ValueType kRefValue(kRefString, 4);\n\n        typename ValueType::ConstMemberIterator itr = v.FindMember(kRefValue);\n        if (itr == v.MemberEnd())\n            return false;\n\n        if (itr->value.IsString()) {\n            SizeType len = itr->value.GetStringLength();\n            if (len > 0) {\n                const Ch* s = itr->value.GetString();\n                SizeType i = 0;\n                while (i < len && s[i] != '#') // Find the first #\n                    i++;\n\n                if (i > 0) { // Remote reference, resolve immediately\n                    if (remoteProvider_) {\n                        if (const GenericSchemaDocument* remoteDocument = remoteProvider_->GetRemoteDocument(s, i)) {\n                            PointerType pointer(&s[i], len - i, allocator_);\n                            if (pointer.IsValid()) {\n                                if (const SchemaType* sc = remoteDocument->GetSchema(pointer)) {\n                                    if (schema)\n                                        *schema = sc;\n                                    new (schemaMap_.template Push<SchemaEntry>()) SchemaEntry(source, const_cast<SchemaType*>(sc), false, allocator_);\n                                    return true;\n                                }\n                            }\n                        }\n                    }\n                }\n                else if (s[i] == '#') { // Local reference, defer resolution\n                    PointerType pointer(&s[i], len - i, allocator_);\n                    if (pointer.IsValid()) {\n                        if (const ValueType* nv = pointer.Get(document))\n                            if (HandleRefSchema(source, schema, *nv, document))\n                                return true;\n\n                        new (schemaRef_.template Push<SchemaRefEntry>()) SchemaRefEntry(source, pointer, schema, allocator_);\n                        return true;\n                    }\n                }\n            }\n        }\n        return false;\n    }\n\n    const SchemaType* GetSchema(const PointerType& pointer) const {\n        for (const SchemaEntry* target = schemaMap_.template Bottom<SchemaEntry>(); target != schemaMap_.template End<SchemaEntry>(); ++target)\n            if (pointer == target->pointer)\n                return target->schema;\n        return 0;\n    }\n\n    PointerType GetPointer(const SchemaType* schema) const {\n        for (const SchemaEntry* target = schemaMap_.template Bottom<SchemaEntry>(); target != schemaMap_.template End<SchemaEntry>(); ++target)\n            if (schema == target->schema)\n                return target->pointer;\n        return PointerType();\n    }\n\n    const SchemaType* GetTypeless() const { return typeless_; }\n\n    static const size_t kInitialSchemaMapSize = 64;\n    static const size_t kInitialSchemaRefSize = 64;\n\n    IRemoteSchemaDocumentProviderType* remoteProvider_;\n    Allocator *allocator_;\n    Allocator *ownAllocator_;\n    const SchemaType* root_;                //!< Root schema.\n    SchemaType* typeless_;\n    internal::Stack<Allocator> schemaMap_;  // Stores created Pointer -> Schemas\n    internal::Stack<Allocator> schemaRef_;  // Stores Pointer from $ref and schema which holds the $ref\n    URIType uri_;\n};\n\n//! GenericSchemaDocument using Value type.\ntypedef GenericSchemaDocument<Value> SchemaDocument;\n//! IGenericRemoteSchemaDocumentProvider using SchemaDocument.\ntypedef IGenericRemoteSchemaDocumentProvider<SchemaDocument> IRemoteSchemaDocumentProvider;\n\n///////////////////////////////////////////////////////////////////////////////\n// GenericSchemaValidator\n\n//! JSON Schema Validator.\n/*!\n    A SAX style JSON schema validator.\n    It uses a \\c GenericSchemaDocument to validate SAX events.\n    It delegates the incoming SAX events to an output handler.\n    The default output handler does nothing.\n    It can be reused multiple times by calling \\c Reset().\n\n    \\tparam SchemaDocumentType Type of schema document.\n    \\tparam OutputHandler Type of output handler. Default handler does nothing.\n    \\tparam StateAllocator Allocator for storing the internal validation states.\n*/\ntemplate <\n    typename SchemaDocumentType,\n    typename OutputHandler = BaseReaderHandler<typename SchemaDocumentType::SchemaType::EncodingType>,\n    typename StateAllocator = CrtAllocator>\nclass GenericSchemaValidator :\n    public internal::ISchemaStateFactory<typename SchemaDocumentType::SchemaType>, \n    public internal::ISchemaValidator,\n    public internal::IValidationErrorHandler<typename SchemaDocumentType::SchemaType>\n{\npublic:\n    typedef typename SchemaDocumentType::SchemaType SchemaType;\n    typedef typename SchemaDocumentType::PointerType PointerType;\n    typedef typename SchemaType::EncodingType EncodingType;\n    typedef typename SchemaType::SValue SValue;\n    typedef typename EncodingType::Ch Ch;\n    typedef GenericStringRef<Ch> StringRefType;\n    typedef GenericValue<EncodingType, StateAllocator> ValueType;\n\n    //! Constructor without output handler.\n    /*!\n        \\param schemaDocument The schema document to conform to.\n        \\param allocator Optional allocator for storing internal validation states.\n        \\param schemaStackCapacity Optional initial capacity of schema path stack.\n        \\param documentStackCapacity Optional initial capacity of document path stack.\n    */\n    GenericSchemaValidator(\n        const SchemaDocumentType& schemaDocument,\n        StateAllocator* allocator = 0, \n        size_t schemaStackCapacity = kDefaultSchemaStackCapacity,\n        size_t documentStackCapacity = kDefaultDocumentStackCapacity)\n        :\n        schemaDocument_(&schemaDocument),\n        root_(schemaDocument.GetRoot()),\n        stateAllocator_(allocator),\n        ownStateAllocator_(0),\n        schemaStack_(allocator, schemaStackCapacity),\n        documentStack_(allocator, documentStackCapacity),\n        outputHandler_(0),\n        error_(kObjectType),\n        currentError_(),\n        missingDependents_(),\n        valid_(true)\n#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE\n        , depth_(0)\n#endif\n    {\n    }\n\n    //! Constructor with output handler.\n    /*!\n        \\param schemaDocument The schema document to conform to.\n        \\param allocator Optional allocator for storing internal validation states.\n        \\param schemaStackCapacity Optional initial capacity of schema path stack.\n        \\param documentStackCapacity Optional initial capacity of document path stack.\n    */\n    GenericSchemaValidator(\n        const SchemaDocumentType& schemaDocument,\n        OutputHandler& outputHandler,\n        StateAllocator* allocator = 0, \n        size_t schemaStackCapacity = kDefaultSchemaStackCapacity,\n        size_t documentStackCapacity = kDefaultDocumentStackCapacity)\n        :\n        schemaDocument_(&schemaDocument),\n        root_(schemaDocument.GetRoot()),\n        stateAllocator_(allocator),\n        ownStateAllocator_(0),\n        schemaStack_(allocator, schemaStackCapacity),\n        documentStack_(allocator, documentStackCapacity),\n        outputHandler_(&outputHandler),\n        error_(kObjectType),\n        currentError_(),\n        missingDependents_(),\n        valid_(true)\n#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE\n        , depth_(0)\n#endif\n    {\n    }\n\n    //! Destructor.\n    ~GenericSchemaValidator() {\n        Reset();\n        CEREAL_RAPIDJSON_DELETE(ownStateAllocator_);\n    }\n\n    //! Reset the internal states.\n    void Reset() {\n        while (!schemaStack_.Empty())\n            PopSchema();\n        documentStack_.Clear();\n        error_.SetObject();\n        currentError_.SetNull();\n        missingDependents_.SetNull();\n        valid_ = true;\n    }\n\n    //! Checks whether the current state is valid.\n    // Implementation of ISchemaValidator\n    virtual bool IsValid() const { return valid_; }\n\n    //! Gets the error object.\n    ValueType& GetError() { return error_; }\n    const ValueType& GetError() const { return error_; }\n\n    //! Gets the JSON pointer pointed to the invalid schema.\n    PointerType GetInvalidSchemaPointer() const {\n        return schemaStack_.Empty() ? PointerType() : CurrentSchema().GetPointer();\n    }\n\n    //! Gets the keyword of invalid schema.\n    const Ch* GetInvalidSchemaKeyword() const {\n        return schemaStack_.Empty() ? 0 : CurrentContext().invalidKeyword;\n    }\n\n    //! Gets the JSON pointer pointed to the invalid value.\n    PointerType GetInvalidDocumentPointer() const {\n        if (documentStack_.Empty()) {\n            return PointerType();\n        }\n        else {\n            return PointerType(documentStack_.template Bottom<Ch>(), documentStack_.GetSize() / sizeof(Ch));\n        }\n    }\n\n    void NotMultipleOf(int64_t actual, const SValue& expected) {\n        AddNumberError(SchemaType::GetMultipleOfString(), ValueType(actual).Move(), expected);\n    }\n    void NotMultipleOf(uint64_t actual, const SValue& expected) {\n        AddNumberError(SchemaType::GetMultipleOfString(), ValueType(actual).Move(), expected);\n    }\n    void NotMultipleOf(double actual, const SValue& expected) {\n        AddNumberError(SchemaType::GetMultipleOfString(), ValueType(actual).Move(), expected);\n    }\n    void AboveMaximum(int64_t actual, const SValue& expected, bool exclusive) {\n        AddNumberError(SchemaType::GetMaximumString(), ValueType(actual).Move(), expected,\n            exclusive ? &SchemaType::GetExclusiveMaximumString : 0);\n    }\n    void AboveMaximum(uint64_t actual, const SValue& expected, bool exclusive) {\n        AddNumberError(SchemaType::GetMaximumString(), ValueType(actual).Move(), expected,\n            exclusive ? &SchemaType::GetExclusiveMaximumString : 0);\n    }\n    void AboveMaximum(double actual, const SValue& expected, bool exclusive) {\n        AddNumberError(SchemaType::GetMaximumString(), ValueType(actual).Move(), expected,\n            exclusive ? &SchemaType::GetExclusiveMaximumString : 0);\n    }\n    void BelowMinimum(int64_t actual, const SValue& expected, bool exclusive) {\n        AddNumberError(SchemaType::GetMinimumString(), ValueType(actual).Move(), expected,\n            exclusive ? &SchemaType::GetExclusiveMinimumString : 0);\n    }\n    void BelowMinimum(uint64_t actual, const SValue& expected, bool exclusive) {\n        AddNumberError(SchemaType::GetMinimumString(), ValueType(actual).Move(), expected,\n            exclusive ? &SchemaType::GetExclusiveMinimumString : 0);\n    }\n    void BelowMinimum(double actual, const SValue& expected, bool exclusive) {\n        AddNumberError(SchemaType::GetMinimumString(), ValueType(actual).Move(), expected,\n            exclusive ? &SchemaType::GetExclusiveMinimumString : 0);\n    }\n\n    void TooLong(const Ch* str, SizeType length, SizeType expected) {\n        AddNumberError(SchemaType::GetMaxLengthString(),\n            ValueType(str, length, GetStateAllocator()).Move(), SValue(expected).Move());\n    }\n    void TooShort(const Ch* str, SizeType length, SizeType expected) {\n        AddNumberError(SchemaType::GetMinLengthString(),\n            ValueType(str, length, GetStateAllocator()).Move(), SValue(expected).Move());\n    }\n    void DoesNotMatch(const Ch* str, SizeType length) {\n        currentError_.SetObject();\n        currentError_.AddMember(GetActualString(), ValueType(str, length, GetStateAllocator()).Move(), GetStateAllocator());\n        AddCurrentError(SchemaType::GetPatternString());\n    }\n\n    void DisallowedItem(SizeType index) {\n        currentError_.SetObject();\n        currentError_.AddMember(GetDisallowedString(), ValueType(index).Move(), GetStateAllocator());\n        AddCurrentError(SchemaType::GetAdditionalItemsString(), true);\n    }\n    void TooFewItems(SizeType actualCount, SizeType expectedCount) {\n        AddNumberError(SchemaType::GetMinItemsString(),\n            ValueType(actualCount).Move(), SValue(expectedCount).Move());\n    }\n    void TooManyItems(SizeType actualCount, SizeType expectedCount) {\n        AddNumberError(SchemaType::GetMaxItemsString(),\n            ValueType(actualCount).Move(), SValue(expectedCount).Move());\n    }\n    void DuplicateItems(SizeType index1, SizeType index2) {\n        ValueType duplicates(kArrayType);\n        duplicates.PushBack(index1, GetStateAllocator());\n        duplicates.PushBack(index2, GetStateAllocator());\n        currentError_.SetObject();\n        currentError_.AddMember(GetDuplicatesString(), duplicates, GetStateAllocator());\n        AddCurrentError(SchemaType::GetUniqueItemsString(), true);\n    }\n\n    void TooManyProperties(SizeType actualCount, SizeType expectedCount) {\n        AddNumberError(SchemaType::GetMaxPropertiesString(),\n            ValueType(actualCount).Move(), SValue(expectedCount).Move());\n    }\n    void TooFewProperties(SizeType actualCount, SizeType expectedCount) {\n        AddNumberError(SchemaType::GetMinPropertiesString(),\n            ValueType(actualCount).Move(), SValue(expectedCount).Move());\n    }\n    void StartMissingProperties() {\n        currentError_.SetArray();\n    }\n    void AddMissingProperty(const SValue& name) {\n        currentError_.PushBack(ValueType(name, GetStateAllocator()).Move(), GetStateAllocator());\n    }\n    bool EndMissingProperties() {\n        if (currentError_.Empty())\n            return false;\n        ValueType error(kObjectType);\n        error.AddMember(GetMissingString(), currentError_, GetStateAllocator());\n        currentError_ = error;\n        AddCurrentError(SchemaType::GetRequiredString());\n        return true;\n    }\n    void PropertyViolations(ISchemaValidator** subvalidators, SizeType count) {\n        for (SizeType i = 0; i < count; ++i)\n            MergeError(static_cast<GenericSchemaValidator*>(subvalidators[i])->GetError());\n    }\n    void DisallowedProperty(const Ch* name, SizeType length) {\n        currentError_.SetObject();\n        currentError_.AddMember(GetDisallowedString(), ValueType(name, length, GetStateAllocator()).Move(), GetStateAllocator());\n        AddCurrentError(SchemaType::GetAdditionalPropertiesString(), true);\n    }\n\n    void StartDependencyErrors() {\n        currentError_.SetObject();\n    }\n    void StartMissingDependentProperties() {\n        missingDependents_.SetArray();\n    }\n    void AddMissingDependentProperty(const SValue& targetName) {\n        missingDependents_.PushBack(ValueType(targetName, GetStateAllocator()).Move(), GetStateAllocator());\n    }\n    void EndMissingDependentProperties(const SValue& sourceName) {\n        if (!missingDependents_.Empty())\n            currentError_.AddMember(ValueType(sourceName, GetStateAllocator()).Move(),\n                missingDependents_, GetStateAllocator());\n    }\n    void AddDependencySchemaError(const SValue& sourceName, ISchemaValidator* subvalidator) {\n        currentError_.AddMember(ValueType(sourceName, GetStateAllocator()).Move(),\n            static_cast<GenericSchemaValidator*>(subvalidator)->GetError(), GetStateAllocator());\n    }\n    bool EndDependencyErrors() {\n        if (currentError_.ObjectEmpty())\n            return false;\n        ValueType error(kObjectType);\n        error.AddMember(GetErrorsString(), currentError_, GetStateAllocator());\n        currentError_ = error;\n        AddCurrentError(SchemaType::GetDependenciesString());\n        return true;\n    }\n\n    void DisallowedValue() {\n        currentError_.SetObject();\n        AddCurrentError(SchemaType::GetEnumString());\n    }\n    void StartDisallowedType() {\n        currentError_.SetArray();\n    }\n    void AddExpectedType(const typename SchemaType::ValueType& expectedType) {\n        currentError_.PushBack(ValueType(expectedType, GetStateAllocator()).Move(), GetStateAllocator());\n    }\n    void EndDisallowedType(const typename SchemaType::ValueType& actualType) {\n        ValueType error(kObjectType);\n        error.AddMember(GetExpectedString(), currentError_, GetStateAllocator());\n        error.AddMember(GetActualString(), ValueType(actualType, GetStateAllocator()).Move(), GetStateAllocator());\n        currentError_ = error;\n        AddCurrentError(SchemaType::GetTypeString());\n    }\n    void NotAllOf(ISchemaValidator** subvalidators, SizeType count) {\n        for (SizeType i = 0; i < count; ++i) {\n            MergeError(static_cast<GenericSchemaValidator*>(subvalidators[i])->GetError());\n        }\n    }\n    void NoneOf(ISchemaValidator** subvalidators, SizeType count) {\n        AddErrorArray(SchemaType::GetAnyOfString(), subvalidators, count);\n    }\n    void NotOneOf(ISchemaValidator** subvalidators, SizeType count) {\n        AddErrorArray(SchemaType::GetOneOfString(), subvalidators, count);\n    }\n    void Disallowed() {\n        currentError_.SetObject();\n        AddCurrentError(SchemaType::GetNotString());\n    }\n\n#define CEREAL_RAPIDJSON_STRING_(name, ...) \\\n    static const StringRefType& Get##name##String() {\\\n        static const Ch s[] = { __VA_ARGS__, '\\0' };\\\n        static const StringRefType v(s, static_cast<SizeType>(sizeof(s) / sizeof(Ch) - 1)); \\\n        return v;\\\n    }\n\n    CEREAL_RAPIDJSON_STRING_(InstanceRef, 'i', 'n', 's', 't', 'a', 'n', 'c', 'e', 'R', 'e', 'f')\n    CEREAL_RAPIDJSON_STRING_(SchemaRef, 's', 'c', 'h', 'e', 'm', 'a', 'R', 'e', 'f')\n    CEREAL_RAPIDJSON_STRING_(Expected, 'e', 'x', 'p', 'e', 'c', 't', 'e', 'd')\n    CEREAL_RAPIDJSON_STRING_(Actual, 'a', 'c', 't', 'u', 'a', 'l')\n    CEREAL_RAPIDJSON_STRING_(Disallowed, 'd', 'i', 's', 'a', 'l', 'l', 'o', 'w', 'e', 'd')\n    CEREAL_RAPIDJSON_STRING_(Missing, 'm', 'i', 's', 's', 'i', 'n', 'g')\n    CEREAL_RAPIDJSON_STRING_(Errors, 'e', 'r', 'r', 'o', 'r', 's')\n    CEREAL_RAPIDJSON_STRING_(Duplicates, 'd', 'u', 'p', 'l', 'i', 'c', 'a', 't', 'e', 's')\n\n#undef CEREAL_RAPIDJSON_STRING_\n\n#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE\n#define CEREAL_RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_() \\\nCEREAL_RAPIDJSON_MULTILINEMACRO_BEGIN\\\n    *documentStack_.template Push<Ch>() = '\\0';\\\n    documentStack_.template Pop<Ch>(1);\\\n    internal::PrintInvalidDocument(documentStack_.template Bottom<Ch>());\\\nCEREAL_RAPIDJSON_MULTILINEMACRO_END\n#else\n#define CEREAL_RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_()\n#endif\n\n#define CEREAL_RAPIDJSON_SCHEMA_HANDLE_BEGIN_(method, arg1)\\\n    if (!valid_) return false; \\\n    if (!BeginValue() || !CurrentSchema().method arg1) {\\\n        CEREAL_RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_();\\\n        return valid_ = false;\\\n    }\n\n#define CEREAL_RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2)\\\n    for (Context* context = schemaStack_.template Bottom<Context>(); context != schemaStack_.template End<Context>(); context++) {\\\n        if (context->hasher)\\\n            static_cast<HasherType*>(context->hasher)->method arg2;\\\n        if (context->validators)\\\n            for (SizeType i_ = 0; i_ < context->validatorCount; i_++)\\\n                static_cast<GenericSchemaValidator*>(context->validators[i_])->method arg2;\\\n        if (context->patternPropertiesValidators)\\\n            for (SizeType i_ = 0; i_ < context->patternPropertiesValidatorCount; i_++)\\\n                static_cast<GenericSchemaValidator*>(context->patternPropertiesValidators[i_])->method arg2;\\\n    }\n\n#define CEREAL_RAPIDJSON_SCHEMA_HANDLE_END_(method, arg2)\\\n    return valid_ = EndValue() && (!outputHandler_ || outputHandler_->method arg2)\n\n#define CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_(method, arg1, arg2) \\\n    CEREAL_RAPIDJSON_SCHEMA_HANDLE_BEGIN_   (method, arg1);\\\n    CEREAL_RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2);\\\n    CEREAL_RAPIDJSON_SCHEMA_HANDLE_END_     (method, arg2)\n\n    bool Null()             { CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_(Null,   (CurrentContext()), ( )); }\n    bool Bool(bool b)       { CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_(Bool,   (CurrentContext(), b), (b)); }\n    bool Int(int i)         { CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int,    (CurrentContext(), i), (i)); }\n    bool Uint(unsigned u)   { CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint,   (CurrentContext(), u), (u)); }\n    bool Int64(int64_t i)   { CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int64,  (CurrentContext(), i), (i)); }\n    bool Uint64(uint64_t u) { CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint64, (CurrentContext(), u), (u)); }\n    bool Double(double d)   { CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_(Double, (CurrentContext(), d), (d)); }\n    bool RawNumber(const Ch* str, SizeType length, bool copy)\n                                    { CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); }\n    bool String(const Ch* str, SizeType length, bool copy)\n                                    { CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); }\n\n    bool StartObject() {\n        CEREAL_RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartObject, (CurrentContext()));\n        CEREAL_RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartObject, ());\n        return valid_ = !outputHandler_ || outputHandler_->StartObject();\n    }\n    \n    bool Key(const Ch* str, SizeType len, bool copy) {\n        if (!valid_) return false;\n        AppendToken(str, len);\n        if (!CurrentSchema().Key(CurrentContext(), str, len, copy)) return valid_ = false;\n        CEREAL_RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(Key, (str, len, copy));\n        return valid_ = !outputHandler_ || outputHandler_->Key(str, len, copy);\n    }\n    \n    bool EndObject(SizeType memberCount) { \n        if (!valid_) return false;\n        CEREAL_RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndObject, (memberCount));\n        if (!CurrentSchema().EndObject(CurrentContext(), memberCount)) return valid_ = false;\n        CEREAL_RAPIDJSON_SCHEMA_HANDLE_END_(EndObject, (memberCount));\n    }\n\n    bool StartArray() {\n        CEREAL_RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartArray, (CurrentContext()));\n        CEREAL_RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartArray, ());\n        return valid_ = !outputHandler_ || outputHandler_->StartArray();\n    }\n    \n    bool EndArray(SizeType elementCount) {\n        if (!valid_) return false;\n        CEREAL_RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndArray, (elementCount));\n        if (!CurrentSchema().EndArray(CurrentContext(), elementCount)) return valid_ = false;\n        CEREAL_RAPIDJSON_SCHEMA_HANDLE_END_(EndArray, (elementCount));\n    }\n\n#undef CEREAL_RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_\n#undef CEREAL_RAPIDJSON_SCHEMA_HANDLE_BEGIN_\n#undef CEREAL_RAPIDJSON_SCHEMA_HANDLE_PARALLEL_\n#undef CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_\n\n    // Implementation of ISchemaStateFactory<SchemaType>\n    virtual ISchemaValidator* CreateSchemaValidator(const SchemaType& root) {\n        return new (GetStateAllocator().Malloc(sizeof(GenericSchemaValidator))) GenericSchemaValidator(*schemaDocument_, root, documentStack_.template Bottom<char>(), documentStack_.GetSize(),\n#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE\n        depth_ + 1,\n#endif\n        &GetStateAllocator());\n    }\n\n    virtual void DestroySchemaValidator(ISchemaValidator* validator) {\n        GenericSchemaValidator* v = static_cast<GenericSchemaValidator*>(validator);\n        v->~GenericSchemaValidator();\n        StateAllocator::Free(v);\n    }\n\n    virtual void* CreateHasher() {\n        return new (GetStateAllocator().Malloc(sizeof(HasherType))) HasherType(&GetStateAllocator());\n    }\n\n    virtual uint64_t GetHashCode(void* hasher) {\n        return static_cast<HasherType*>(hasher)->GetHashCode();\n    }\n\n    virtual void DestroryHasher(void* hasher) {\n        HasherType* h = static_cast<HasherType*>(hasher);\n        h->~HasherType();\n        StateAllocator::Free(h);\n    }\n\n    virtual void* MallocState(size_t size) {\n        return GetStateAllocator().Malloc(size);\n    }\n\n    virtual void FreeState(void* p) {\n        StateAllocator::Free(p);\n    }\n\nprivate:\n    typedef typename SchemaType::Context Context;\n    typedef GenericValue<UTF8<>, StateAllocator> HashCodeArray;\n    typedef internal::Hasher<EncodingType, StateAllocator> HasherType;\n\n    GenericSchemaValidator( \n        const SchemaDocumentType& schemaDocument,\n        const SchemaType& root,\n        const char* basePath, size_t basePathSize,\n#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE\n        unsigned depth,\n#endif\n        StateAllocator* allocator = 0,\n        size_t schemaStackCapacity = kDefaultSchemaStackCapacity,\n        size_t documentStackCapacity = kDefaultDocumentStackCapacity)\n        :\n        schemaDocument_(&schemaDocument),\n        root_(root),\n        stateAllocator_(allocator),\n        ownStateAllocator_(0),\n        schemaStack_(allocator, schemaStackCapacity),\n        documentStack_(allocator, documentStackCapacity),\n        outputHandler_(0),\n        error_(kObjectType),\n        currentError_(),\n        missingDependents_(),\n        valid_(true)\n#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE\n        , depth_(depth)\n#endif\n    {\n        if (basePath && basePathSize)\n            memcpy(documentStack_.template Push<char>(basePathSize), basePath, basePathSize);\n    }\n\n    StateAllocator& GetStateAllocator() {\n        if (!stateAllocator_)\n            stateAllocator_ = ownStateAllocator_ = CEREAL_RAPIDJSON_NEW(StateAllocator)();\n        return *stateAllocator_;\n    }\n\n    bool BeginValue() {\n        if (schemaStack_.Empty())\n            PushSchema(root_);\n        else {\n            if (CurrentContext().inArray)\n                internal::TokenHelper<internal::Stack<StateAllocator>, Ch>::AppendIndexToken(documentStack_, CurrentContext().arrayElementIndex);\n\n            if (!CurrentSchema().BeginValue(CurrentContext()))\n                return false;\n\n            SizeType count = CurrentContext().patternPropertiesSchemaCount;\n            const SchemaType** sa = CurrentContext().patternPropertiesSchemas;\n            typename Context::PatternValidatorType patternValidatorType = CurrentContext().valuePatternValidatorType;\n            bool valueUniqueness = CurrentContext().valueUniqueness;\n            CEREAL_RAPIDJSON_ASSERT(CurrentContext().valueSchema);\n            PushSchema(*CurrentContext().valueSchema);\n\n            if (count > 0) {\n                CurrentContext().objectPatternValidatorType = patternValidatorType;\n                ISchemaValidator**& va = CurrentContext().patternPropertiesValidators;\n                SizeType& validatorCount = CurrentContext().patternPropertiesValidatorCount;\n                va = static_cast<ISchemaValidator**>(MallocState(sizeof(ISchemaValidator*) * count));\n                for (SizeType i = 0; i < count; i++)\n                    va[validatorCount++] = CreateSchemaValidator(*sa[i]);\n            }\n\n            CurrentContext().arrayUniqueness = valueUniqueness;\n        }\n        return true;\n    }\n\n    bool EndValue() {\n        if (!CurrentSchema().EndValue(CurrentContext()))\n            return false;\n\n#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE\n        GenericStringBuffer<EncodingType> sb;\n        schemaDocument_->GetPointer(&CurrentSchema()).Stringify(sb);\n\n        *documentStack_.template Push<Ch>() = '\\0';\n        documentStack_.template Pop<Ch>(1);\n        internal::PrintValidatorPointers(depth_, sb.GetString(), documentStack_.template Bottom<Ch>());\n#endif\n\n        uint64_t h = CurrentContext().arrayUniqueness ? static_cast<HasherType*>(CurrentContext().hasher)->GetHashCode() : 0;\n        \n        PopSchema();\n\n        if (!schemaStack_.Empty()) {\n            Context& context = CurrentContext();\n            if (context.valueUniqueness) {\n                HashCodeArray* a = static_cast<HashCodeArray*>(context.arrayElementHashCodes);\n                if (!a)\n                    CurrentContext().arrayElementHashCodes = a = new (GetStateAllocator().Malloc(sizeof(HashCodeArray))) HashCodeArray(kArrayType);\n                for (typename HashCodeArray::ConstValueIterator itr = a->Begin(); itr != a->End(); ++itr)\n                    if (itr->GetUint64() == h) {\n                        DuplicateItems(static_cast<SizeType>(itr - a->Begin()), a->Size());\n                        CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(SchemaType::GetUniqueItemsString());\n                    }\n                a->PushBack(h, GetStateAllocator());\n            }\n        }\n\n        // Remove the last token of document pointer\n        while (!documentStack_.Empty() && *documentStack_.template Pop<Ch>(1) != '/')\n            ;\n\n        return true;\n    }\n\n    void AppendToken(const Ch* str, SizeType len) {\n        documentStack_.template Reserve<Ch>(1 + len * 2); // worst case all characters are escaped as two characters\n        *documentStack_.template PushUnsafe<Ch>() = '/';\n        for (SizeType i = 0; i < len; i++) {\n            if (str[i] == '~') {\n                *documentStack_.template PushUnsafe<Ch>() = '~';\n                *documentStack_.template PushUnsafe<Ch>() = '0';\n            }\n            else if (str[i] == '/') {\n                *documentStack_.template PushUnsafe<Ch>() = '~';\n                *documentStack_.template PushUnsafe<Ch>() = '1';\n            }\n            else\n                *documentStack_.template PushUnsafe<Ch>() = str[i];\n        }\n    }\n\n    CEREAL_RAPIDJSON_FORCEINLINE void PushSchema(const SchemaType& schema) { new (schemaStack_.template Push<Context>()) Context(*this, *this, &schema); }\n    \n    CEREAL_RAPIDJSON_FORCEINLINE void PopSchema() {\n        Context* c = schemaStack_.template Pop<Context>(1);\n        if (HashCodeArray* a = static_cast<HashCodeArray*>(c->arrayElementHashCodes)) {\n            a->~HashCodeArray();\n            StateAllocator::Free(a);\n        }\n        c->~Context();\n    }\n\n    void AddErrorLocation(ValueType& result, bool parent) {\n        GenericStringBuffer<EncodingType> sb;\n        PointerType instancePointer = GetInvalidDocumentPointer();\n        ((parent && instancePointer.GetTokenCount() > 0)\n            ? PointerType(instancePointer.GetTokens(), instancePointer.GetTokenCount() - 1)\n            : instancePointer).StringifyUriFragment(sb);\n        ValueType instanceRef(sb.GetString(), static_cast<SizeType>(sb.GetSize() / sizeof(Ch)),\n            GetStateAllocator());\n        result.AddMember(GetInstanceRefString(), instanceRef, GetStateAllocator());\n        sb.Clear();\n        memcpy(sb.Push(CurrentSchema().GetURI().GetStringLength()),\n            CurrentSchema().GetURI().GetString(),\n            CurrentSchema().GetURI().GetStringLength() * sizeof(Ch));\n        GetInvalidSchemaPointer().StringifyUriFragment(sb);\n        ValueType schemaRef(sb.GetString(), static_cast<SizeType>(sb.GetSize() / sizeof(Ch)),\n            GetStateAllocator());\n        result.AddMember(GetSchemaRefString(), schemaRef, GetStateAllocator());\n    }\n\n    void AddError(ValueType& keyword, ValueType& error) {\n        typename ValueType::MemberIterator member = error_.FindMember(keyword);\n        if (member == error_.MemberEnd())\n            error_.AddMember(keyword, error, GetStateAllocator());\n        else {\n            if (member->value.IsObject()) {\n                ValueType errors(kArrayType);\n                errors.PushBack(member->value, GetStateAllocator());\n                member->value = errors;\n            }\n            member->value.PushBack(error, GetStateAllocator());\n        }\n    }\n\n    void AddCurrentError(const typename SchemaType::ValueType& keyword, bool parent = false) {\n        AddErrorLocation(currentError_, parent);\n        AddError(ValueType(keyword, GetStateAllocator(), false).Move(), currentError_);\n    }\n\n    void MergeError(ValueType& other) {\n        for (typename ValueType::MemberIterator it = other.MemberBegin(), end = other.MemberEnd(); it != end; ++it) {\n            AddError(it->name, it->value);\n        }\n    }\n\n    void AddNumberError(const typename SchemaType::ValueType& keyword, ValueType& actual, const SValue& expected,\n        const typename SchemaType::ValueType& (*exclusive)() = 0) {\n        currentError_.SetObject();\n        currentError_.AddMember(GetActualString(), actual, GetStateAllocator());\n        currentError_.AddMember(GetExpectedString(), ValueType(expected, GetStateAllocator()).Move(), GetStateAllocator());\n        if (exclusive)\n            currentError_.AddMember(ValueType(exclusive(), GetStateAllocator()).Move(), true, GetStateAllocator());\n        AddCurrentError(keyword);\n    }\n\n    void AddErrorArray(const typename SchemaType::ValueType& keyword,\n        ISchemaValidator** subvalidators, SizeType count) {\n        ValueType errors(kArrayType);\n        for (SizeType i = 0; i < count; ++i)\n            errors.PushBack(static_cast<GenericSchemaValidator*>(subvalidators[i])->GetError(), GetStateAllocator());\n        currentError_.SetObject();\n        currentError_.AddMember(GetErrorsString(), errors, GetStateAllocator());\n        AddCurrentError(keyword);\n    }\n\n    const SchemaType& CurrentSchema() const { return *schemaStack_.template Top<Context>()->schema; }\n    Context& CurrentContext() { return *schemaStack_.template Top<Context>(); }\n    const Context& CurrentContext() const { return *schemaStack_.template Top<Context>(); }\n\n    static const size_t kDefaultSchemaStackCapacity = 1024;\n    static const size_t kDefaultDocumentStackCapacity = 256;\n    const SchemaDocumentType* schemaDocument_;\n    const SchemaType& root_;\n    StateAllocator* stateAllocator_;\n    StateAllocator* ownStateAllocator_;\n    internal::Stack<StateAllocator> schemaStack_;    //!< stack to store the current path of schema (BaseSchemaType *)\n    internal::Stack<StateAllocator> documentStack_;  //!< stack to store the current path of validating document (Ch)\n    OutputHandler* outputHandler_;\n    ValueType error_;\n    ValueType currentError_;\n    ValueType missingDependents_;\n    bool valid_;\n#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE\n    unsigned depth_;\n#endif\n};\n\ntypedef GenericSchemaValidator<SchemaDocument> SchemaValidator;\n\n///////////////////////////////////////////////////////////////////////////////\n// SchemaValidatingReader\n\n//! A helper class for parsing with validation.\n/*!\n    This helper class is a functor, designed as a parameter of \\ref GenericDocument::Populate().\n\n    \\tparam parseFlags Combination of \\ref ParseFlag.\n    \\tparam InputStream Type of input stream, implementing Stream concept.\n    \\tparam SourceEncoding Encoding of the input stream.\n    \\tparam SchemaDocumentType Type of schema document.\n    \\tparam StackAllocator Allocator type for stack.\n*/\ntemplate <\n    unsigned parseFlags,\n    typename InputStream,\n    typename SourceEncoding,\n    typename SchemaDocumentType = SchemaDocument,\n    typename StackAllocator = CrtAllocator>\nclass SchemaValidatingReader {\npublic:\n    typedef typename SchemaDocumentType::PointerType PointerType;\n    typedef typename InputStream::Ch Ch;\n    typedef GenericValue<SourceEncoding, StackAllocator> ValueType;\n\n    //! Constructor\n    /*!\n        \\param is Input stream.\n        \\param sd Schema document.\n    */\n    SchemaValidatingReader(InputStream& is, const SchemaDocumentType& sd) : is_(is), sd_(sd), invalidSchemaKeyword_(), error_(kObjectType), isValid_(true) {}\n\n    template <typename Handler>\n    bool operator()(Handler& handler) {\n        GenericReader<SourceEncoding, typename SchemaDocumentType::EncodingType, StackAllocator> reader;\n        GenericSchemaValidator<SchemaDocumentType, Handler> validator(sd_, handler);\n        parseResult_ = reader.template Parse<parseFlags>(is_, validator);\n\n        isValid_ = validator.IsValid();\n        if (isValid_) {\n            invalidSchemaPointer_ = PointerType();\n            invalidSchemaKeyword_ = 0;\n            invalidDocumentPointer_ = PointerType();\n            error_.SetObject();\n        }\n        else {\n            invalidSchemaPointer_ = validator.GetInvalidSchemaPointer();\n            invalidSchemaKeyword_ = validator.GetInvalidSchemaKeyword();\n            invalidDocumentPointer_ = validator.GetInvalidDocumentPointer();\n            error_.CopyFrom(validator.GetError(), allocator_);\n        }\n\n        return parseResult_;\n    }\n\n    const ParseResult& GetParseResult() const { return parseResult_; }\n    bool IsValid() const { return isValid_; }\n    const PointerType& GetInvalidSchemaPointer() const { return invalidSchemaPointer_; }\n    const Ch* GetInvalidSchemaKeyword() const { return invalidSchemaKeyword_; }\n    const PointerType& GetInvalidDocumentPointer() const { return invalidDocumentPointer_; }\n    const ValueType& GetError() const { return error_; }\n\nprivate:\n    InputStream& is_;\n    const SchemaDocumentType& sd_;\n\n    ParseResult parseResult_;\n    PointerType invalidSchemaPointer_;\n    const Ch* invalidSchemaKeyword_;\n    PointerType invalidDocumentPointer_;\n    StackAllocator allocator_;\n    ValueType error_;\n    bool isValid_;\n};\n\nCEREAL_RAPIDJSON_NAMESPACE_END\nCEREAL_RAPIDJSON_DIAG_POP\n\n#endif // CEREAL_RAPIDJSON_SCHEMA_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/stream.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n//\n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed\n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n// CONDITIONS OF ANY KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations under the License.\n\n#include \"rapidjson.h\"\n\n#ifndef CEREAL_RAPIDJSON_STREAM_H_\n#define CEREAL_RAPIDJSON_STREAM_H_\n\n#include \"encodings.h\"\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n///////////////////////////////////////////////////////////////////////////////\n//  Stream\n\n/*! \\class rapidjson::Stream\n    \\brief Concept for reading and writing characters.\n\n    For read-only stream, no need to implement PutBegin(), Put(), Flush() and PutEnd().\n\n    For write-only stream, only need to implement Put() and Flush().\n\n\\code\nconcept Stream {\n    typename Ch;    //!< Character type of the stream.\n\n    //! Read the current character from stream without moving the read cursor.\n    Ch Peek() const;\n\n    //! Read the current character from stream and moving the read cursor to next character.\n    Ch Take();\n\n    //! Get the current read cursor.\n    //! \\return Number of characters read from start.\n    size_t Tell();\n\n    //! Begin writing operation at the current read pointer.\n    //! \\return The begin writer pointer.\n    Ch* PutBegin();\n\n    //! Write a character.\n    void Put(Ch c);\n\n    //! Flush the buffer.\n    void Flush();\n\n    //! End the writing operation.\n    //! \\param begin The begin write pointer returned by PutBegin().\n    //! \\return Number of characters written.\n    size_t PutEnd(Ch* begin);\n}\n\\endcode\n*/\n\n//! Provides additional information for stream.\n/*!\n    By using traits pattern, this type provides a default configuration for stream.\n    For custom stream, this type can be specialized for other configuration.\n    See TEST(Reader, CustomStringStream) in readertest.cpp for example.\n*/\ntemplate<typename Stream>\nstruct StreamTraits {\n    //! Whether to make local copy of stream for optimization during parsing.\n    /*!\n        By default, for safety, streams do not use local copy optimization.\n        Stream that can be copied fast should specialize this, like StreamTraits<StringStream>.\n    */\n    enum { copyOptimization = 0 };\n};\n\n//! Reserve n characters for writing to a stream.\ntemplate<typename Stream>\ninline void PutReserve(Stream& stream, size_t count) {\n    (void)stream;\n    (void)count;\n}\n\n//! Write character to a stream, presuming buffer is reserved.\ntemplate<typename Stream>\ninline void PutUnsafe(Stream& stream, typename Stream::Ch c) {\n    stream.Put(c);\n}\n\n//! Put N copies of a character to a stream.\ntemplate<typename Stream, typename Ch>\ninline void PutN(Stream& stream, Ch c, size_t n) {\n    PutReserve(stream, n);\n    for (size_t i = 0; i < n; i++)\n        PutUnsafe(stream, c);\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// GenericStreamWrapper\n\n//! A Stream Wrapper\n/*! \\tThis string stream is a wrapper for any stream by just forwarding any\n    \\treceived message to the origin stream.\n    \\note implements Stream concept\n*/\n\n#if defined(_MSC_VER) && _MSC_VER <= 1800\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(4702)  // unreachable code\nCEREAL_RAPIDJSON_DIAG_OFF(4512)  // assignment operator could not be generated\n#endif\n\ntemplate <typename InputStream, typename Encoding = UTF8<> >\nclass GenericStreamWrapper {\npublic:\n    typedef typename Encoding::Ch Ch;\n    GenericStreamWrapper(InputStream& is): is_(is) {}\n\n    Ch Peek() const { return is_.Peek(); }\n    Ch Take() { return is_.Take(); }\n    size_t Tell() { return is_.Tell(); }\n    Ch* PutBegin() { return is_.PutBegin(); }\n    void Put(Ch ch) { is_.Put(ch); }\n    void Flush() { is_.Flush(); }\n    size_t PutEnd(Ch* ch) { return is_.PutEnd(ch); }\n\n    // wrapper for MemoryStream\n    const Ch* Peek4() const { return is_.Peek4(); }\n\n    // wrapper for AutoUTFInputStream\n    UTFType GetType() const { return is_.GetType(); }\n    bool HasBOM() const { return is_.HasBOM(); }\n\nprotected:\n    InputStream& is_;\n};\n\n#if defined(_MSC_VER) && _MSC_VER <= 1800\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n///////////////////////////////////////////////////////////////////////////////\n// StringStream\n\n//! Read-only string stream.\n/*! \\note implements Stream concept\n*/\ntemplate <typename Encoding>\nstruct GenericStringStream {\n    typedef typename Encoding::Ch Ch;\n\n    GenericStringStream(const Ch *src) : src_(src), head_(src) {}\n\n    Ch Peek() const { return *src_; }\n    Ch Take() { return *src_++; }\n    size_t Tell() const { return static_cast<size_t>(src_ - head_); }\n\n    Ch* PutBegin() { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n    void Put(Ch) { CEREAL_RAPIDJSON_ASSERT(false); }\n    void Flush() { CEREAL_RAPIDJSON_ASSERT(false); }\n    size_t PutEnd(Ch*) { CEREAL_RAPIDJSON_ASSERT(false); return 0; }\n\n    const Ch* src_;     //!< Current read position.\n    const Ch* head_;    //!< Original head of the string.\n};\n\ntemplate <typename Encoding>\nstruct StreamTraits<GenericStringStream<Encoding> > {\n    enum { copyOptimization = 1 };\n};\n\n//! String stream with UTF8 encoding.\ntypedef GenericStringStream<UTF8<> > StringStream;\n\n///////////////////////////////////////////////////////////////////////////////\n// InsituStringStream\n\n//! A read-write string stream.\n/*! This string stream is particularly designed for in-situ parsing.\n    \\note implements Stream concept\n*/\ntemplate <typename Encoding>\nstruct GenericInsituStringStream {\n    typedef typename Encoding::Ch Ch;\n\n    GenericInsituStringStream(Ch *src) : src_(src), dst_(0), head_(src) {}\n\n    // Read\n    Ch Peek() { return *src_; }\n    Ch Take() { return *src_++; }\n    size_t Tell() { return static_cast<size_t>(src_ - head_); }\n\n    // Write\n    void Put(Ch c) { CEREAL_RAPIDJSON_ASSERT(dst_ != 0); *dst_++ = c; }\n\n    Ch* PutBegin() { return dst_ = src_; }\n    size_t PutEnd(Ch* begin) { return static_cast<size_t>(dst_ - begin); }\n    void Flush() {}\n\n    Ch* Push(size_t count) { Ch* begin = dst_; dst_ += count; return begin; }\n    void Pop(size_t count) { dst_ -= count; }\n\n    Ch* src_;\n    Ch* dst_;\n    Ch* head_;\n};\n\ntemplate <typename Encoding>\nstruct StreamTraits<GenericInsituStringStream<Encoding> > {\n    enum { copyOptimization = 1 };\n};\n\n//! Insitu string stream with UTF8 encoding.\ntypedef GenericInsituStringStream<UTF8<> > InsituStringStream;\n\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#endif // CEREAL_RAPIDJSON_STREAM_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/stringbuffer.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_STRINGBUFFER_H_\n#define CEREAL_RAPIDJSON_STRINGBUFFER_H_\n\n#include \"stream.h\"\n#include \"internal/stack.h\"\n\n#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n#include <utility> // std::move\n#endif\n\n#include \"internal/stack.h\"\n\n#if defined(__clang__)\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(c++98-compat)\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n//! Represents an in-memory output stream.\n/*!\n    \\tparam Encoding Encoding of the stream.\n    \\tparam Allocator type for allocating memory buffer.\n    \\note implements Stream concept\n*/\ntemplate <typename Encoding, typename Allocator = CrtAllocator>\nclass GenericStringBuffer {\npublic:\n    typedef typename Encoding::Ch Ch;\n\n    GenericStringBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {}\n\n#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n    GenericStringBuffer(GenericStringBuffer&& rhs) : stack_(std::move(rhs.stack_)) {}\n    GenericStringBuffer& operator=(GenericStringBuffer&& rhs) {\n        if (&rhs != this)\n            stack_ = std::move(rhs.stack_);\n        return *this;\n    }\n#endif\n\n    void Put(Ch c) { *stack_.template Push<Ch>() = c; }\n    void PutUnsafe(Ch c) { *stack_.template PushUnsafe<Ch>() = c; }\n    void Flush() {}\n\n    void Clear() { stack_.Clear(); }\n    void ShrinkToFit() {\n        // Push and pop a null terminator. This is safe.\n        *stack_.template Push<Ch>() = '\\0';\n        stack_.ShrinkToFit();\n        stack_.template Pop<Ch>(1);\n    }\n\n    void Reserve(size_t count) { stack_.template Reserve<Ch>(count); }\n    Ch* Push(size_t count) { return stack_.template Push<Ch>(count); }\n    Ch* PushUnsafe(size_t count) { return stack_.template PushUnsafe<Ch>(count); }\n    void Pop(size_t count) { stack_.template Pop<Ch>(count); }\n\n    const Ch* GetString() const {\n        // Push and pop a null terminator. This is safe.\n        *stack_.template Push<Ch>() = '\\0';\n        stack_.template Pop<Ch>(1);\n\n        return stack_.template Bottom<Ch>();\n    }\n\n    //! Get the size of string in bytes in the string buffer.\n    size_t GetSize() const { return stack_.GetSize(); }\n\n    //! Get the length of string in Ch in the string buffer.\n    size_t GetLength() const { return stack_.GetSize() / sizeof(Ch); }\n\n    static const size_t kDefaultCapacity = 256;\n    mutable internal::Stack<Allocator> stack_;\n\nprivate:\n    // Prohibit copy constructor & assignment operator.\n    GenericStringBuffer(const GenericStringBuffer&);\n    GenericStringBuffer& operator=(const GenericStringBuffer&);\n};\n\n//! String buffer with UTF8 encoding\ntypedef GenericStringBuffer<UTF8<> > StringBuffer;\n\ntemplate<typename Encoding, typename Allocator>\ninline void PutReserve(GenericStringBuffer<Encoding, Allocator>& stream, size_t count) {\n    stream.Reserve(count);\n}\n\ntemplate<typename Encoding, typename Allocator>\ninline void PutUnsafe(GenericStringBuffer<Encoding, Allocator>& stream, typename Encoding::Ch c) {\n    stream.PutUnsafe(c);\n}\n\n//! Implement specialized version of PutN() with memset() for better performance.\ntemplate<>\ninline void PutN(GenericStringBuffer<UTF8<> >& stream, char c, size_t n) {\n    std::memset(stream.stack_.Push<char>(n), c, n * sizeof(c));\n}\n\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#if defined(__clang__)\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#endif // CEREAL_RAPIDJSON_STRINGBUFFER_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidjson/writer.h",
    "content": "// Tencent is pleased to support the open source community by making RapidJSON available.\n// \n// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\n//\n// Licensed under the MIT License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// http://opensource.org/licenses/MIT\n//\n// Unless required by applicable law or agreed to in writing, software distributed \n// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \n// CONDITIONS OF ANY KIND, either express or implied. See the License for the \n// specific language governing permissions and limitations under the License.\n\n#ifndef CEREAL_RAPIDJSON_WRITER_H_\n#define CEREAL_RAPIDJSON_WRITER_H_\n\n#include \"stream.h\"\n#include \"internal/meta.h\"\n#include \"internal/stack.h\"\n#include \"internal/strfunc.h\"\n#include \"internal/dtoa.h\"\n#include \"internal/itoa.h\"\n#include \"stringbuffer.h\"\n#include <new>      // placement new\n\n#if defined(CEREAL_RAPIDJSON_SIMD) && defined(_MSC_VER)\n#include <intrin.h>\n#pragma intrinsic(_BitScanForward)\n#endif\n#ifdef CEREAL_RAPIDJSON_SSE42\n#include <nmmintrin.h>\n#elif defined(CEREAL_RAPIDJSON_SSE2)\n#include <emmintrin.h>\n#elif defined(CEREAL_RAPIDJSON_NEON)\n#include <arm_neon.h>\n#endif\n\n#ifdef __clang__\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(padded)\nCEREAL_RAPIDJSON_DIAG_OFF(unreachable-code)\nCEREAL_RAPIDJSON_DIAG_OFF(c++98-compat)\n#elif defined(_MSC_VER)\nCEREAL_RAPIDJSON_DIAG_PUSH\nCEREAL_RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant\n#endif\n\nCEREAL_RAPIDJSON_NAMESPACE_BEGIN\n\n///////////////////////////////////////////////////////////////////////////////\n// WriteFlag\n\n/*! \\def CEREAL_RAPIDJSON_WRITE_DEFAULT_FLAGS \n    \\ingroup CEREAL_RAPIDJSON_CONFIG\n    \\brief User-defined kWriteDefaultFlags definition.\n\n    User can define this as any \\c WriteFlag combinations.\n*/\n#ifndef CEREAL_RAPIDJSON_WRITE_DEFAULT_FLAGS\n#define CEREAL_RAPIDJSON_WRITE_DEFAULT_FLAGS kWriteNoFlags\n#endif\n\n//! Combination of writeFlags\nenum WriteFlag {\n    kWriteNoFlags = 0,              //!< No flags are set.\n    kWriteValidateEncodingFlag = 1, //!< Validate encoding of JSON strings.\n    kWriteNanAndInfFlag = 2,        //!< Allow writing of Infinity, -Infinity and NaN.\n    kWriteDefaultFlags = CEREAL_RAPIDJSON_WRITE_DEFAULT_FLAGS  //!< Default write flags. Can be customized by defining CEREAL_RAPIDJSON_WRITE_DEFAULT_FLAGS\n};\n\n//! JSON writer\n/*! Writer implements the concept Handler.\n    It generates JSON text by events to an output os.\n\n    User may programmatically calls the functions of a writer to generate JSON text.\n\n    On the other side, a writer can also be passed to objects that generates events, \n\n    for example Reader::Parse() and Document::Accept().\n\n    \\tparam OutputStream Type of output stream.\n    \\tparam SourceEncoding Encoding of source string.\n    \\tparam TargetEncoding Encoding of output stream.\n    \\tparam StackAllocator Type of allocator for allocating memory of stack.\n    \\note implements Handler concept\n*/\ntemplate<typename OutputStream, typename SourceEncoding = UTF8<>, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags>\nclass Writer {\npublic:\n    typedef typename SourceEncoding::Ch Ch;\n\n    static const int kDefaultMaxDecimalPlaces = 324;\n\n    //! Constructor\n    /*! \\param os Output stream.\n        \\param stackAllocator User supplied allocator. If it is null, it will create a private one.\n        \\param levelDepth Initial capacity of stack.\n    */\n    explicit\n    Writer(OutputStream& os, StackAllocator* stackAllocator = 0, size_t levelDepth = kDefaultLevelDepth) : \n        os_(&os), level_stack_(stackAllocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {}\n\n    explicit\n    Writer(StackAllocator* allocator = 0, size_t levelDepth = kDefaultLevelDepth) :\n        os_(0), level_stack_(allocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {}\n\n#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS\n    Writer(Writer&& rhs) :\n        os_(rhs.os_), level_stack_(std::move(rhs.level_stack_)), maxDecimalPlaces_(rhs.maxDecimalPlaces_), hasRoot_(rhs.hasRoot_) {\n        rhs.os_ = 0;\n    }\n#endif\n\n    //! Reset the writer with a new stream.\n    /*!\n        This function reset the writer with a new stream and default settings,\n        in order to make a Writer object reusable for output multiple JSONs.\n\n        \\param os New output stream.\n        \\code\n        Writer<OutputStream> writer(os1);\n        writer.StartObject();\n        // ...\n        writer.EndObject();\n\n        writer.Reset(os2);\n        writer.StartObject();\n        // ...\n        writer.EndObject();\n        \\endcode\n    */\n    void Reset(OutputStream& os) {\n        os_ = &os;\n        hasRoot_ = false;\n        level_stack_.Clear();\n    }\n\n    //! Checks whether the output is a complete JSON.\n    /*!\n        A complete JSON has a complete root object or array.\n    */\n    bool IsComplete() const {\n        return hasRoot_ && level_stack_.Empty();\n    }\n\n    int GetMaxDecimalPlaces() const {\n        return maxDecimalPlaces_;\n    }\n\n    //! Sets the maximum number of decimal places for double output.\n    /*!\n        This setting truncates the output with specified number of decimal places.\n\n        For example, \n\n        \\code\n        writer.SetMaxDecimalPlaces(3);\n        writer.StartArray();\n        writer.Double(0.12345);                 // \"0.123\"\n        writer.Double(0.0001);                  // \"0.0\"\n        writer.Double(1.234567890123456e30);    // \"1.234567890123456e30\" (do not truncate significand for positive exponent)\n        writer.Double(1.23e-4);                 // \"0.0\"                  (do truncate significand for negative exponent)\n        writer.EndArray();\n        \\endcode\n\n        The default setting does not truncate any decimal places. You can restore to this setting by calling\n        \\code\n        writer.SetMaxDecimalPlaces(Writer::kDefaultMaxDecimalPlaces);\n        \\endcode\n    */\n    void SetMaxDecimalPlaces(int maxDecimalPlaces) {\n        maxDecimalPlaces_ = maxDecimalPlaces;\n    }\n\n    /*!@name Implementation of Handler\n        \\see Handler\n    */\n    //@{\n\n    bool Null()                 { Prefix(kNullType);   return EndValue(WriteNull()); }\n    bool Bool(bool b)           { Prefix(b ? kTrueType : kFalseType); return EndValue(WriteBool(b)); }\n    bool Int(int i)             { Prefix(kNumberType); return EndValue(WriteInt(i)); }\n    bool Uint(unsigned u)       { Prefix(kNumberType); return EndValue(WriteUint(u)); }\n    bool Int64(int64_t i64)     { Prefix(kNumberType); return EndValue(WriteInt64(i64)); }\n    bool Uint64(uint64_t u64)   { Prefix(kNumberType); return EndValue(WriteUint64(u64)); }\n\n    //! Writes the given \\c double value to the stream\n    /*!\n        \\param d The value to be written.\n        \\return Whether it is succeed.\n    */\n    bool Double(double d)       { Prefix(kNumberType); return EndValue(WriteDouble(d)); }\n\n    bool RawNumber(const Ch* str, SizeType length, bool copy = false) {\n        CEREAL_RAPIDJSON_ASSERT(str != 0);\n        (void)copy;\n        Prefix(kNumberType);\n        return EndValue(WriteString(str, length));\n    }\n\n    bool String(const Ch* str, SizeType length, bool copy = false) {\n        CEREAL_RAPIDJSON_ASSERT(str != 0);\n        (void)copy;\n        Prefix(kStringType);\n        return EndValue(WriteString(str, length));\n    }\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    bool String(const std::basic_string<Ch>& str) {\n        return String(str.data(), SizeType(str.size()));\n    }\n#endif\n\n    bool StartObject() {\n        Prefix(kObjectType);\n        new (level_stack_.template Push<Level>()) Level(false);\n        return WriteStartObject();\n    }\n\n    bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); }\n\n#if CEREAL_RAPIDJSON_HAS_STDSTRING\n    bool Key(const std::basic_string<Ch>& str)\n    {\n      return Key(str.data(), SizeType(str.size()));\n    }\n#endif\n\t\n    bool EndObject(SizeType memberCount = 0) {\n        (void)memberCount;\n        CEREAL_RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); // not inside an Object\n        CEREAL_RAPIDJSON_ASSERT(!level_stack_.template Top<Level>()->inArray); // currently inside an Array, not Object\n        CEREAL_RAPIDJSON_ASSERT(0 == level_stack_.template Top<Level>()->valueCount % 2); // Object has a Key without a Value\n        level_stack_.template Pop<Level>(1);\n        return EndValue(WriteEndObject());\n    }\n\n    bool StartArray() {\n        Prefix(kArrayType);\n        new (level_stack_.template Push<Level>()) Level(true);\n        return WriteStartArray();\n    }\n\n    bool EndArray(SizeType elementCount = 0) {\n        (void)elementCount;\n        CEREAL_RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level));\n        CEREAL_RAPIDJSON_ASSERT(level_stack_.template Top<Level>()->inArray);\n        level_stack_.template Pop<Level>(1);\n        return EndValue(WriteEndArray());\n    }\n    //@}\n\n    /*! @name Convenience extensions */\n    //@{\n\n    //! Simpler but slower overload.\n    bool String(const Ch* const& str) { return String(str, internal::StrLen(str)); }\n    bool Key(const Ch* const& str) { return Key(str, internal::StrLen(str)); }\n    \n    //@}\n\n    //! Write a raw JSON value.\n    /*!\n        For user to write a stringified JSON as a value.\n\n        \\param json A well-formed JSON value. It should not contain null character within [0, length - 1] range.\n        \\param length Length of the json.\n        \\param type Type of the root of json.\n    */\n    bool RawValue(const Ch* json, size_t length, Type type) {\n        CEREAL_RAPIDJSON_ASSERT(json != 0);\n        Prefix(type);\n        return EndValue(WriteRawValue(json, length));\n    }\n\n    //! Flush the output stream.\n    /*!\n        Allows the user to flush the output stream immediately.\n     */\n    void Flush() {\n        os_->Flush();\n    }\n\nprotected:\n    //! Information for each nested level\n    struct Level {\n        Level(bool inArray_) : valueCount(0), inArray(inArray_) {}\n        size_t valueCount;  //!< number of values in this level\n        bool inArray;       //!< true if in array, otherwise in object\n    };\n\n    static const size_t kDefaultLevelDepth = 32;\n\n    bool WriteNull()  {\n        PutReserve(*os_, 4);\n        PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 'l'); return true;\n    }\n\n    bool WriteBool(bool b)  {\n        if (b) {\n            PutReserve(*os_, 4);\n            PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'r'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'e');\n        }\n        else {\n            PutReserve(*os_, 5);\n            PutUnsafe(*os_, 'f'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 's'); PutUnsafe(*os_, 'e');\n        }\n        return true;\n    }\n\n    bool WriteInt(int i) {\n        char buffer[11];\n        const char* end = internal::i32toa(i, buffer);\n        PutReserve(*os_, static_cast<size_t>(end - buffer));\n        for (const char* p = buffer; p != end; ++p)\n            PutUnsafe(*os_, static_cast<typename OutputStream::Ch>(*p));\n        return true;\n    }\n\n    bool WriteUint(unsigned u) {\n        char buffer[10];\n        const char* end = internal::u32toa(u, buffer);\n        PutReserve(*os_, static_cast<size_t>(end - buffer));\n        for (const char* p = buffer; p != end; ++p)\n            PutUnsafe(*os_, static_cast<typename OutputStream::Ch>(*p));\n        return true;\n    }\n\n    bool WriteInt64(int64_t i64) {\n        char buffer[21];\n        const char* end = internal::i64toa(i64, buffer);\n        PutReserve(*os_, static_cast<size_t>(end - buffer));\n        for (const char* p = buffer; p != end; ++p)\n            PutUnsafe(*os_, static_cast<typename OutputStream::Ch>(*p));\n        return true;\n    }\n\n    bool WriteUint64(uint64_t u64) {\n        char buffer[20];\n        char* end = internal::u64toa(u64, buffer);\n        PutReserve(*os_, static_cast<size_t>(end - buffer));\n        for (char* p = buffer; p != end; ++p)\n            PutUnsafe(*os_, static_cast<typename OutputStream::Ch>(*p));\n        return true;\n    }\n\n    bool WriteDouble(double d) {\n        if (internal::Double(d).IsNanOrInf()) {\n            if (!(writeFlags & kWriteNanAndInfFlag))\n                return false;\n            if (internal::Double(d).IsNan()) {\n                PutReserve(*os_, 3);\n                PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N');\n                return true;\n            }\n            if (internal::Double(d).Sign()) {\n                PutReserve(*os_, 9);\n                PutUnsafe(*os_, '-');\n            }\n            else\n                PutReserve(*os_, 8);\n            PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f');\n            PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y');\n            return true;\n        }\n\n        char buffer[25];\n        char* end = internal::dtoa(d, buffer, maxDecimalPlaces_);\n        PutReserve(*os_, static_cast<size_t>(end - buffer));\n        for (char* p = buffer; p != end; ++p)\n            PutUnsafe(*os_, static_cast<typename OutputStream::Ch>(*p));\n        return true;\n    }\n\n    bool WriteString(const Ch* str, SizeType length)  {\n        static const typename OutputStream::Ch hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };\n        static const char escape[256] = {\n#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n            //0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F\n            'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'b', 't', 'n', 'u', 'f', 'r', 'u', 'u', // 00\n            'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', // 10\n              0,   0, '\"',   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, // 20\n            Z16, Z16,                                                                       // 30~4F\n              0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,'\\\\',   0,   0,   0, // 50\n            Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16                                // 60~FF\n#undef Z16\n        };\n\n        if (TargetEncoding::supportUnicode)\n            PutReserve(*os_, 2 + length * 6); // \"\\uxxxx...\"\n        else\n            PutReserve(*os_, 2 + length * 12);  // \"\\uxxxx\\uyyyy...\"\n\n        PutUnsafe(*os_, '\\\"');\n        GenericStringStream<SourceEncoding> is(str);\n        while (ScanWriteUnescapedString(is, length)) {\n            const Ch c = is.Peek();\n            if (!TargetEncoding::supportUnicode && static_cast<unsigned>(c) >= 0x80) {\n                // Unicode escaping\n                unsigned codepoint;\n                if (CEREAL_RAPIDJSON_UNLIKELY(!SourceEncoding::Decode(is, &codepoint)))\n                    return false;\n                PutUnsafe(*os_, '\\\\');\n                PutUnsafe(*os_, 'u');\n                if (codepoint <= 0xD7FF || (codepoint >= 0xE000 && codepoint <= 0xFFFF)) {\n                    PutUnsafe(*os_, hexDigits[(codepoint >> 12) & 15]);\n                    PutUnsafe(*os_, hexDigits[(codepoint >>  8) & 15]);\n                    PutUnsafe(*os_, hexDigits[(codepoint >>  4) & 15]);\n                    PutUnsafe(*os_, hexDigits[(codepoint      ) & 15]);\n                }\n                else {\n                    CEREAL_RAPIDJSON_ASSERT(codepoint >= 0x010000 && codepoint <= 0x10FFFF);\n                    // Surrogate pair\n                    unsigned s = codepoint - 0x010000;\n                    unsigned lead = (s >> 10) + 0xD800;\n                    unsigned trail = (s & 0x3FF) + 0xDC00;\n                    PutUnsafe(*os_, hexDigits[(lead >> 12) & 15]);\n                    PutUnsafe(*os_, hexDigits[(lead >>  8) & 15]);\n                    PutUnsafe(*os_, hexDigits[(lead >>  4) & 15]);\n                    PutUnsafe(*os_, hexDigits[(lead      ) & 15]);\n                    PutUnsafe(*os_, '\\\\');\n                    PutUnsafe(*os_, 'u');\n                    PutUnsafe(*os_, hexDigits[(trail >> 12) & 15]);\n                    PutUnsafe(*os_, hexDigits[(trail >>  8) & 15]);\n                    PutUnsafe(*os_, hexDigits[(trail >>  4) & 15]);\n                    PutUnsafe(*os_, hexDigits[(trail      ) & 15]);                    \n                }\n            }\n            else if ((sizeof(Ch) == 1 || static_cast<unsigned>(c) < 256) && CEREAL_RAPIDJSON_UNLIKELY(escape[static_cast<unsigned char>(c)]))  {\n                is.Take();\n                PutUnsafe(*os_, '\\\\');\n                PutUnsafe(*os_, static_cast<typename OutputStream::Ch>(escape[static_cast<unsigned char>(c)]));\n                if (escape[static_cast<unsigned char>(c)] == 'u') {\n                    PutUnsafe(*os_, '0');\n                    PutUnsafe(*os_, '0');\n                    PutUnsafe(*os_, hexDigits[static_cast<unsigned char>(c) >> 4]);\n                    PutUnsafe(*os_, hexDigits[static_cast<unsigned char>(c) & 0xF]);\n                }\n            }\n            else if (CEREAL_RAPIDJSON_UNLIKELY(!(writeFlags & kWriteValidateEncodingFlag ? \n                Transcoder<SourceEncoding, TargetEncoding>::Validate(is, *os_) :\n                Transcoder<SourceEncoding, TargetEncoding>::TranscodeUnsafe(is, *os_))))\n                return false;\n        }\n        PutUnsafe(*os_, '\\\"');\n        return true;\n    }\n\n    bool ScanWriteUnescapedString(GenericStringStream<SourceEncoding>& is, size_t length) {\n        return CEREAL_RAPIDJSON_LIKELY(is.Tell() < length);\n    }\n\n    bool WriteStartObject() { os_->Put('{'); return true; }\n    bool WriteEndObject()   { os_->Put('}'); return true; }\n    bool WriteStartArray()  { os_->Put('['); return true; }\n    bool WriteEndArray()    { os_->Put(']'); return true; }\n\n    bool WriteRawValue(const Ch* json, size_t length) {\n        PutReserve(*os_, length);\n        GenericStringStream<SourceEncoding> is(json);\n        while (CEREAL_RAPIDJSON_LIKELY(is.Tell() < length)) {\n            CEREAL_RAPIDJSON_ASSERT(is.Peek() != '\\0');\n            if (CEREAL_RAPIDJSON_UNLIKELY(!(writeFlags & kWriteValidateEncodingFlag ? \n                Transcoder<SourceEncoding, TargetEncoding>::Validate(is, *os_) :\n                Transcoder<SourceEncoding, TargetEncoding>::TranscodeUnsafe(is, *os_))))\n                return false;\n        }\n        return true;\n    }\n\n    void Prefix(Type type) {\n        (void)type;\n        if (CEREAL_RAPIDJSON_LIKELY(level_stack_.GetSize() != 0)) { // this value is not at root\n            Level* level = level_stack_.template Top<Level>();\n            if (level->valueCount > 0) {\n                if (level->inArray) \n                    os_->Put(','); // add comma if it is not the first element in array\n                else  // in object\n                    os_->Put((level->valueCount % 2 == 0) ? ',' : ':');\n            }\n            if (!level->inArray && level->valueCount % 2 == 0)\n                CEREAL_RAPIDJSON_ASSERT(type == kStringType);  // if it's in object, then even number should be a name\n            level->valueCount++;\n        }\n        else {\n            CEREAL_RAPIDJSON_ASSERT(!hasRoot_);    // Should only has one and only one root.\n            hasRoot_ = true;\n        }\n    }\n\n    // Flush the value if it is the top level one.\n    bool EndValue(bool ret) {\n        if (CEREAL_RAPIDJSON_UNLIKELY(level_stack_.Empty()))   // end of json text\n            Flush();\n        return ret;\n    }\n\n    OutputStream* os_;\n    internal::Stack<StackAllocator> level_stack_;\n    int maxDecimalPlaces_;\n    bool hasRoot_;\n\nprivate:\n    // Prohibit copy constructor & assignment operator.\n    Writer(const Writer&);\n    Writer& operator=(const Writer&);\n};\n\n// Full specialization for StringStream to prevent memory copying\n\ntemplate<>\ninline bool Writer<StringBuffer>::WriteInt(int i) {\n    char *buffer = os_->Push(11);\n    const char* end = internal::i32toa(i, buffer);\n    os_->Pop(static_cast<size_t>(11 - (end - buffer)));\n    return true;\n}\n\ntemplate<>\ninline bool Writer<StringBuffer>::WriteUint(unsigned u) {\n    char *buffer = os_->Push(10);\n    const char* end = internal::u32toa(u, buffer);\n    os_->Pop(static_cast<size_t>(10 - (end - buffer)));\n    return true;\n}\n\ntemplate<>\ninline bool Writer<StringBuffer>::WriteInt64(int64_t i64) {\n    char *buffer = os_->Push(21);\n    const char* end = internal::i64toa(i64, buffer);\n    os_->Pop(static_cast<size_t>(21 - (end - buffer)));\n    return true;\n}\n\ntemplate<>\ninline bool Writer<StringBuffer>::WriteUint64(uint64_t u) {\n    char *buffer = os_->Push(20);\n    const char* end = internal::u64toa(u, buffer);\n    os_->Pop(static_cast<size_t>(20 - (end - buffer)));\n    return true;\n}\n\ntemplate<>\ninline bool Writer<StringBuffer>::WriteDouble(double d) {\n    if (internal::Double(d).IsNanOrInf()) {\n        // Note: This code path can only be reached if (CEREAL_RAPIDJSON_WRITE_DEFAULT_FLAGS & kWriteNanAndInfFlag).\n        if (!(kWriteDefaultFlags & kWriteNanAndInfFlag))\n            return false;\n        if (internal::Double(d).IsNan()) {\n            PutReserve(*os_, 3);\n            PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N');\n            return true;\n        }\n        if (internal::Double(d).Sign()) {\n            PutReserve(*os_, 9);\n            PutUnsafe(*os_, '-');\n        }\n        else\n            PutReserve(*os_, 8);\n        PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f');\n        PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y');\n        return true;\n    }\n    \n    char *buffer = os_->Push(25);\n    char* end = internal::dtoa(d, buffer, maxDecimalPlaces_);\n    os_->Pop(static_cast<size_t>(25 - (end - buffer)));\n    return true;\n}\n\n#if defined(CEREAL_RAPIDJSON_SSE2) || defined(CEREAL_RAPIDJSON_SSE42)\ntemplate<>\ninline bool Writer<StringBuffer>::ScanWriteUnescapedString(StringStream& is, size_t length) {\n    if (length < 16)\n        return CEREAL_RAPIDJSON_LIKELY(is.Tell() < length);\n\n    if (!CEREAL_RAPIDJSON_LIKELY(is.Tell() < length))\n        return false;\n\n    const char* p = is.src_;\n    const char* end = is.head_ + length;\n    const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & static_cast<size_t>(~15));\n    const char* endAligned = reinterpret_cast<const char*>(reinterpret_cast<size_t>(end) & static_cast<size_t>(~15));\n    if (nextAligned > end)\n        return true;\n\n    while (p != nextAligned)\n        if (*p < 0x20 || *p == '\\\"' || *p == '\\\\') {\n            is.src_ = p;\n            return CEREAL_RAPIDJSON_LIKELY(is.Tell() < length);\n        }\n        else\n            os_->PutUnsafe(*p++);\n\n    // The rest of string using SIMD\n    static const char dquote[16] = { '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"', '\\\"' };\n    static const char bslash[16] = { '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\', '\\\\' };\n    static const char space[16]  = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F };\n    const __m128i dq = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&dquote[0]));\n    const __m128i bs = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&bslash[0]));\n    const __m128i sp = _mm_loadu_si128(reinterpret_cast<const __m128i *>(&space[0]));\n\n    for (; p != endAligned; p += 16) {\n        const __m128i s = _mm_load_si128(reinterpret_cast<const __m128i *>(p));\n        const __m128i t1 = _mm_cmpeq_epi8(s, dq);\n        const __m128i t2 = _mm_cmpeq_epi8(s, bs);\n        const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F\n        const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3);\n        unsigned short r = static_cast<unsigned short>(_mm_movemask_epi8(x));\n        if (CEREAL_RAPIDJSON_UNLIKELY(r != 0)) {   // some of characters is escaped\n            SizeType len;\n#ifdef _MSC_VER         // Find the index of first escaped\n            unsigned long offset;\n            _BitScanForward(&offset, r);\n            len = offset;\n#else\n            len = static_cast<SizeType>(__builtin_ffs(r) - 1);\n#endif\n            char* q = reinterpret_cast<char*>(os_->PushUnsafe(len));\n            for (size_t i = 0; i < len; i++)\n                q[i] = p[i];\n\n            p += len;\n            break;\n        }\n        _mm_storeu_si128(reinterpret_cast<__m128i *>(os_->PushUnsafe(16)), s);\n    }\n\n    is.src_ = p;\n    return CEREAL_RAPIDJSON_LIKELY(is.Tell() < length);\n}\n#elif defined(CEREAL_RAPIDJSON_NEON)\ntemplate<>\ninline bool Writer<StringBuffer>::ScanWriteUnescapedString(StringStream& is, size_t length) {\n    if (length < 16)\n        return CEREAL_RAPIDJSON_LIKELY(is.Tell() < length);\n\n    if (!CEREAL_RAPIDJSON_LIKELY(is.Tell() < length))\n        return false;\n\n    const char* p = is.src_;\n    const char* end = is.head_ + length;\n    const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & static_cast<size_t>(~15));\n    const char* endAligned = reinterpret_cast<const char*>(reinterpret_cast<size_t>(end) & static_cast<size_t>(~15));\n    if (nextAligned > end)\n        return true;\n\n    while (p != nextAligned)\n        if (*p < 0x20 || *p == '\\\"' || *p == '\\\\') {\n            is.src_ = p;\n            return CEREAL_RAPIDJSON_LIKELY(is.Tell() < length);\n        }\n        else\n            os_->PutUnsafe(*p++);\n\n    // The rest of string using SIMD\n    const uint8x16_t s0 = vmovq_n_u8('\"');\n    const uint8x16_t s1 = vmovq_n_u8('\\\\');\n    const uint8x16_t s2 = vmovq_n_u8('\\b');\n    const uint8x16_t s3 = vmovq_n_u8(32);\n\n    for (; p != endAligned; p += 16) {\n        const uint8x16_t s = vld1q_u8(reinterpret_cast<const uint8_t *>(p));\n        uint8x16_t x = vceqq_u8(s, s0);\n        x = vorrq_u8(x, vceqq_u8(s, s1));\n        x = vorrq_u8(x, vceqq_u8(s, s2));\n        x = vorrq_u8(x, vcltq_u8(s, s3));\n\n        x = vrev64q_u8(x);                     // Rev in 64\n        uint64_t low = vgetq_lane_u64(reinterpret_cast<uint64x2_t>(x), 0);   // extract\n        uint64_t high = vgetq_lane_u64(reinterpret_cast<uint64x2_t>(x), 1);  // extract\n\n        SizeType len = 0;\n        bool escaped = false;\n        if (low == 0) {\n            if (high != 0) {\n                unsigned lz = (unsigned)__builtin_clzll(high);\n                len = 8 + (lz >> 3);\n                escaped = true;\n            }\n        } else {\n            unsigned lz = (unsigned)__builtin_clzll(low);\n            len = lz >> 3;\n            escaped = true;\n        }\n        if (CEREAL_RAPIDJSON_UNLIKELY(escaped)) {   // some of characters is escaped\n            char* q = reinterpret_cast<char*>(os_->PushUnsafe(len));\n            for (size_t i = 0; i < len; i++)\n                q[i] = p[i];\n\n            p += len;\n            break;\n        }\n        vst1q_u8(reinterpret_cast<uint8_t *>(os_->PushUnsafe(16)), s);\n    }\n\n    is.src_ = p;\n    return CEREAL_RAPIDJSON_LIKELY(is.Tell() < length);\n}\n#endif // CEREAL_RAPIDJSON_NEON\n\nCEREAL_RAPIDJSON_NAMESPACE_END\n\n#if defined(_MSC_VER) || defined(__clang__)\nCEREAL_RAPIDJSON_DIAG_POP\n#endif\n\n#endif // CEREAL_RAPIDJSON_CEREAL_RAPIDJSON_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidxml/license.txt",
    "content": "Use of this software is granted under one of the following two licenses,\r\nto be chosen freely by the user.\r\n\r\n1. Boost Software License - Version 1.0 - August 17th, 2003\r\n===============================================================================\r\n\r\nCopyright (c) 2006, 2007 Marcin Kalicinski\r\n\r\nPermission is hereby granted, free of charge, to any person or organization\r\nobtaining a copy of the software and accompanying documentation covered by\r\nthis license (the \"Software\") to use, reproduce, display, distribute,\r\nexecute, and transmit the Software, and to prepare derivative works of the\r\nSoftware, and to permit third-parties to whom the Software is furnished to\r\ndo so, all subject to the following:\r\n\r\nThe copyright notices in the Software and this entire statement, including\r\nthe above license grant, this restriction and the following disclaimer,\r\nmust be included in all copies of the Software, in whole or in part, and\r\nall derivative works of the Software, unless such copies or derivative\r\nworks are solely in the form of machine-executable object code generated by\r\na source language processor.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\r\nSHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\r\nFOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\r\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r\nDEALINGS IN THE SOFTWARE.\r\n\r\n2. The MIT License\r\n===============================================================================\r\n\r\nCopyright (c) 2006, 2007 Marcin Kalicinski\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy \r\nof this software and associated documentation files (the \"Software\"), to deal \r\nin the Software without restriction, including without limitation the rights \r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \r\nof the Software, and to permit persons to whom the Software is furnished to do so, \r\nsubject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all \r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR \r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, \r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL \r\nTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER \r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, \r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS \r\nIN THE SOFTWARE.\r\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidxml/manual.html",
    "content": "<html><head><style type=\"text/css\">\r\n\r\n          body\r\n          {\r\n          font-family: sans-serif;\r\n          font-size: 90%;\r\n          margin: 8pt 8pt 8pt 8pt;\r\n          text-align: justify;\r\n          background-color: White;\r\n          }\r\n\r\n          h1 { font-weight: bold; text-align: left;  }\r\n          h2 { font: 140% sans-serif; font-weight: bold; text-align: left;  }\r\n          h3 { font: 120% sans-serif; font-weight: bold; text-align: left;  }\r\n          h4 { font: bold 100% sans-serif; font-weight: bold; text-align: left;  }\r\n          h5 { font: italic 100% sans-serif; font-weight: bold; text-align: left;  }\r\n          h6 { font: small-caps 100% sans-serif; font-weight: bold; text-align: left;  }\r\n\r\n          code\r\n          {\r\n          font-family: &quot;Courier New&quot;, Courier, mono;\r\n          }\r\n\r\n          pre\r\n          {\r\n          border-top: gray 0.5pt solid;\r\n          border-right: gray 0.5pt solid;\r\n          border-left: gray 0.5pt solid;\r\n          border-bottom: gray 0.5pt solid;\r\n          padding-top: 2pt;\r\n          padding-right: 2pt;\r\n          padding-left: 2pt;\r\n          padding-bottom: 2pt;\r\n          display: block;\r\n          font-family: &quot;courier new&quot;, courier, mono;\r\n          background-color: #eeeeee;\r\n          }\r\n\r\n          a\r\n          {\r\n          color: #000080;\r\n          text-decoration: none;\r\n          }\r\n\r\n          a:hover\r\n          {\r\n          text-decoration: underline;\r\n          }\r\n\r\n          .reference-header\r\n          {\r\n          border-top: gray 0.5pt solid;\r\n          border-right: gray 0.5pt solid;\r\n          border-left: gray 0.5pt solid;\r\n          border-bottom: gray 0.5pt solid;\r\n          padding-top: 2pt;\r\n          padding-right: 2pt;\r\n          padding-left: 2pt;\r\n          padding-bottom: 2pt;\r\n          background-color: #dedede;\r\n          }\r\n\r\n          .parameter-name\r\n          {\r\n          font-style: italic;\r\n          }\r\n\r\n          .indented\r\n          {\r\n          margin-left: 0.5cm;\r\n          }\r\n\r\n          a.toc1\r\n          {\r\n          margin-left: 0.0cm;\r\n          }\r\n\r\n          a.toc2\r\n          {\r\n          margin-left: 0.75cm;\r\n          }\r\n\r\n          a.toc3\r\n          {\r\n          margin-left: 1.5cm;\r\n          }\r\n\r\n        </style></head><body><h1>RAPIDXML Manual</h1><h3>Version 1.13</h3><detaileddescription xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><para><i>Copyright (C) 2006, 2009 Marcin Kalicinski</i><br/><i>See accompanying file <a href=\"license.txt\">license.txt</a> for license information.</i><hr/><h2 level=\"2\">Table of Contents</h2></para><para><toc><toc-contents><a href=\"#namespacerapidxml_1what_is_rapidxml\" class=\"toc1\">1. What is RapidXml?</a><br/><a href=\"#namespacerapidxml_1dependencies_and_compatibility\" class=\"toc2\">1.1 Dependencies And Compatibility</a><br/><a href=\"#namespacerapidxml_1character_types_and_encodings\" class=\"toc2\">1.2 Character Types And Encodings</a><br/><a href=\"#namespacerapidxml_1error_handling\" class=\"toc2\">1.3 Error Handling</a><br/><a href=\"#namespacerapidxml_1memory_allocation\" class=\"toc2\">1.4 Memory Allocation</a><br/><a href=\"#namespacerapidxml_1w3c_compliance\" class=\"toc2\">1.5 W3C Compliance</a><br/><a href=\"#namespacerapidxml_1api_design\" class=\"toc2\">1.6 API Design</a><br/><a href=\"#namespacerapidxml_1reliability\" class=\"toc2\">1.7 Reliability</a><br/><a href=\"#namespacerapidxml_1acknowledgements\" class=\"toc2\">1.8 Acknowledgements</a><br/><a href=\"#namespacerapidxml_1two_minute_tutorial\" class=\"toc1\">2. Two Minute Tutorial</a><br/><a href=\"#namespacerapidxml_1parsing\" class=\"toc2\">2.1 Parsing</a><br/><a href=\"#namespacerapidxml_1accessing_dom_tree\" class=\"toc2\">2.2 Accessing The DOM Tree</a><br/><a href=\"#namespacerapidxml_1modifying_dom_tree\" class=\"toc2\">2.3 Modifying The DOM Tree</a><br/><a href=\"#namespacerapidxml_1printing\" class=\"toc2\">2.4 Printing XML</a><br/><a href=\"#namespacerapidxml_1differences\" class=\"toc1\">3. Differences From Regular XML Parsers</a><br/><a href=\"#namespacerapidxml_1lifetime_of_source_text\" class=\"toc2\">3.1 Lifetime Of Source Text</a><br/><a href=\"#namespacerapidxml_1ownership_of_strings\" class=\"toc2\">3.2 Ownership Of Strings</a><br/><a href=\"#namespacerapidxml_1destructive_non_destructive\" class=\"toc2\">3.3 Destructive Vs Non-Destructive Mode</a><br/><a href=\"#namespacerapidxml_1performance\" class=\"toc1\">4. Performance</a><br/><a href=\"#namespacerapidxml_1performance_charts\" class=\"toc2\">4.1 Comparison With Other Parsers</a><br/><a href=\"#namespacerapidxml_1reference\" class=\"toc1\">5. Reference</a><br/></toc-contents></toc><br/></para><sect1><h2 id=\"namespacerapidxml_1what_is_rapidxml\">1. What is RapidXml?</h2><para><a href=\"http://rapidxml.sourceforge.net\">RapidXml</a> is an attempt to create the fastest XML DOM parser possible, while retaining useability, portability and reasonable W3C compatibility. It is an in-situ parser written in C++, with parsing speed approaching that of <code>strlen()</code> function executed on the same data. <br/><br/>\r\n Entire parser is contained in a single header file, so no building or linking is neccesary. To use it you just need to copy <code>rapidxml.hpp</code> file to a convenient place (such as your project directory), and include it where needed. You may also want to use printing functions contained in header <code>rapidxml_print.hpp</code>.</para><sect2><h3 id=\"namespacerapidxml_1dependencies_and_compatibility\">1.1 Dependencies And Compatibility</h3><para>RapidXml has <i>no dependencies</i> other than a very small subset of standard C++ library (<code>&lt;cassert&gt;</code>, <code>&lt;cstdlib&gt;</code>, <code>&lt;new&gt;</code> and <code>&lt;exception&gt;</code>, unless exceptions are disabled). It should compile on any reasonably conformant compiler, and was tested on Visual C++ 2003, Visual C++ 2005, Visual C++ 2008, gcc 3, gcc 4, and Comeau 4.3.3. Care was taken that no warnings are produced on these compilers, even with highest warning levels enabled.</para></sect2><sect2><h3 id=\"namespacerapidxml_1character_types_and_encodings\">1.2 Character Types And Encodings</h3><para>RapidXml is character type agnostic, and can work both with narrow and wide characters. Current version does not fully support UTF-16 or UTF-32, so use of wide characters is somewhat incapacitated. However, it should succesfully parse <code>wchar_t</code> strings containing UTF-16 or UTF-32 if endianness of the data matches that of the machine. UTF-8 is fully supported, including all numeric character references, which are expanded into appropriate UTF-8 byte sequences (unless you enable parse_no_utf8 flag). <br/><br/>\r\n Note that RapidXml performs no decoding - strings returned by name() and value() functions will contain text encoded using the same encoding as source file. Rapidxml understands and expands the following character references: <code>&amp;apos; &amp;amp; &amp;quot; &amp;lt; &amp;gt; &amp;#...;</code> Other character references are not expanded.</para></sect2><sect2><h3 id=\"namespacerapidxml_1error_handling\">1.3 Error Handling</h3><para>By default, RapidXml uses C++ exceptions to report errors. If this behaviour is undesirable, RAPIDXML_NO_EXCEPTIONS can be defined to suppress exception code. See <a href=\"#classrapidxml_1_1parse__error\" kindref=\"compound\">parse_error</a> class and <a href=\"#namespacerapidxml_ff5d67f74437199d316d2b2660653ae1_1ff5d67f74437199d316d2b2660653ae1\" kindref=\"member\">parse_error_handler()</a> function for more information.</para></sect2><sect2><h3 id=\"namespacerapidxml_1memory_allocation\">1.4 Memory Allocation</h3><para>RapidXml uses a special memory pool object to allocate nodes and attributes, because direct allocation using <code>new</code> operator would be far too slow. Underlying memory allocations performed by the pool can be customized by use of <a href=\"#classrapidxml_1_1memory__pool_c0a55a6ef0837dca67572e357100d78a_1c0a55a6ef0837dca67572e357100d78a\" kindref=\"member\">memory_pool::set_allocator()</a> function. See class <a href=\"#classrapidxml_1_1memory__pool\" kindref=\"compound\">memory_pool</a> for more information.</para></sect2><sect2><h3 id=\"namespacerapidxml_1w3c_compliance\">1.5 W3C Compliance</h3><para>RapidXml is not a W3C compliant parser, primarily because it ignores DOCTYPE declarations. There is a number of other, minor incompatibilities as well. Still, it can successfully parse and produce complete trees of all valid XML files in W3C conformance suite (over 1000 files specially designed to find flaws in XML processors). In destructive mode it performs whitespace normalization and character entity substitution for a small set of built-in entities.</para></sect2><sect2><h3 id=\"namespacerapidxml_1api_design\">1.6 API Design</h3><para>RapidXml API is minimalistic, to reduce code size as much as possible, and facilitate use in embedded environments. Additional convenience functions are provided in separate headers: <code>rapidxml_utils.hpp</code> and <code><a href=\"#rapidxml__print_8hpp\" kindref=\"compound\">rapidxml_print.hpp</a></code>. Contents of these headers is not an essential part of the library, and is currently not documented (otherwise than with comments in code).</para></sect2><sect2><h3 id=\"namespacerapidxml_1reliability\">1.7 Reliability</h3><para>RapidXml is very robust and comes with a large harness of unit tests. Special care has been taken to ensure stability of the parser no matter what source text is thrown at it. One of the unit tests produces 100,000 randomly corrupted variants of XML document, which (when uncorrupted) contains all constructs recognized by RapidXml. RapidXml passes this test when it correctly recognizes that errors have been introduced, and does not crash or loop indefinitely. <br/><br/>\r\n Another unit test puts RapidXml head-to-head with another, well estabilished XML parser, and verifies that their outputs match across a wide variety of small and large documents. <br/><br/>\r\n Yet another test feeds RapidXml with over 1000 test files from W3C compliance suite, and verifies that correct results are obtained. There are also additional tests that verify each API function separately, and test that various parsing modes work as expected.</para></sect2><sect2><h3 id=\"namespacerapidxml_1acknowledgements\">1.8 Acknowledgements</h3><para>I would like to thank Arseny Kapoulkine for his work on <a href=\"http://code.google.com/p/pugixml\">pugixml</a>, which was an inspiration for this project. Additional thanks go to Kristen Wegner for creating <a href=\"http://www.codeproject.com/soap/pugxml.asp\">pugxml</a>, from which pugixml was derived. Janusz Wohlfeil kindly ran RapidXml speed tests on hardware that I did not have access to, allowing me to expand performance comparison table.</para></sect2></sect1><sect1><h2 id=\"namespacerapidxml_1two_minute_tutorial\">2. Two Minute Tutorial</h2><sect2><h3 id=\"namespacerapidxml_1parsing\">2.1 Parsing</h3><para>The following code causes RapidXml to parse a zero-terminated string named <code>text</code>: <pre>using namespace rapidxml;\r\nxml_document&lt;&gt; doc;    // character type defaults to char\r\ndoc.parse&lt;0&gt;(text);    // 0 means default parse flags\r\n</pre><code>doc</code> object is now a root of DOM tree containing representation of the parsed XML. Because all RapidXml interface is contained inside namespace <code>rapidxml</code>, users must either bring contents of this namespace into scope, or fully qualify all the names. Class <a href=\"#classrapidxml_1_1xml__document\" kindref=\"compound\">xml_document</a> represents a root of the DOM hierarchy. By means of public inheritance, it is also an <a href=\"#classrapidxml_1_1xml__node\" kindref=\"compound\">xml_node</a> and a <a href=\"#classrapidxml_1_1memory__pool\" kindref=\"compound\">memory_pool</a>. Template parameter of <a href=\"#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\" kindref=\"member\">xml_document::parse()</a> function is used to specify parsing flags, with which you can fine-tune behaviour of the parser. Note that flags must be a compile-time constant.</para></sect2><sect2><h3 id=\"namespacerapidxml_1accessing_dom_tree\">2.2 Accessing The DOM Tree</h3><para>To access the DOM tree, use methods of <a href=\"#classrapidxml_1_1xml__node\" kindref=\"compound\">xml_node</a> and <a href=\"#classrapidxml_1_1xml__attribute\" kindref=\"compound\">xml_attribute</a> classes: <pre>cout &lt;&lt; &quot;Name of my first node is: &quot; &lt;&lt; doc.first_node()-&gt;name() &lt;&lt; &quot;\\n&quot;;\r\nxml_node&lt;&gt; *node = doc.first_node(&quot;foobar&quot;);\r\ncout &lt;&lt; &quot;Node foobar has value &quot; &lt;&lt; node-&gt;value() &lt;&lt; &quot;\\n&quot;;\r\nfor (xml_attribute&lt;&gt; *attr = node-&gt;first_attribute();\r\n     attr; attr = attr-&gt;next_attribute())\r\n{\r\n    cout &lt;&lt; &quot;Node foobar has attribute &quot; &lt;&lt; attr-&gt;name() &lt;&lt; &quot; &quot;;\r\n    cout &lt;&lt; &quot;with value &quot; &lt;&lt; attr-&gt;value() &lt;&lt; &quot;\\n&quot;;\r\n}\r\n</pre></para></sect2><sect2><h3 id=\"namespacerapidxml_1modifying_dom_tree\">2.3 Modifying The DOM Tree</h3><para>DOM tree produced by the parser is fully modifiable. Nodes and attributes can be added/removed, and their contents changed. The below example creates a HTML document, whose sole contents is a link to google.com website: <pre>xml_document&lt;&gt; doc;\r\nxml_node&lt;&gt; *node = doc.allocate_node(node_element, &quot;a&quot;, &quot;Google&quot;);\r\ndoc.append_node(node);\r\nxml_attribute&lt;&gt; *attr = doc.allocate_attribute(&quot;href&quot;, &quot;google.com&quot;);\r\nnode-&gt;append_attribute(attr);\r\n</pre> One quirk is that nodes and attributes <i>do not own</i> the text of their names and values. This is because normally they only store pointers to the source text. So, when assigning a new name or value to the node, care must be taken to ensure proper lifetime of the string. The easiest way to achieve it is to allocate the string from the <a href=\"#classrapidxml_1_1xml__document\" kindref=\"compound\">xml_document</a> memory pool. In the above example this is not necessary, because we are only assigning character constants. But the code below uses <a href=\"#classrapidxml_1_1memory__pool_69729185bc59b0875192d667c47b8859_169729185bc59b0875192d667c47b8859\" kindref=\"member\">memory_pool::allocate_string()</a> function to allocate node name (which will have the same lifetime as the document), and assigns it to a new node: <pre>xml_document&lt;&gt; doc;\r\nchar *node_name = doc.allocate_string(name);        // Allocate string and copy name into it\r\nxml_node&lt;&gt; *node = doc.allocate_node(node_element, node_name);  // Set node name to node_name\r\n</pre> Check <a href=\"#namespacerapidxml_1reference\" kindref=\"member\">Reference</a>  section for description of the entire interface.</para></sect2><sect2><h3 id=\"namespacerapidxml_1printing\">2.4 Printing XML</h3><para>You can print <code><a href=\"#classrapidxml_1_1xml__document\" kindref=\"compound\">xml_document</a></code> and <code><a href=\"#classrapidxml_1_1xml__node\" kindref=\"compound\">xml_node</a></code> objects into an XML string. Use <a href=\"#namespacerapidxml_b94d570fc4c4ab2423813cd0243326b1_1b94d570fc4c4ab2423813cd0243326b1\" kindref=\"member\">print()</a> function or operator &lt;&lt;, which are defined in <code><a href=\"#rapidxml__print_8hpp\" kindref=\"compound\">rapidxml_print.hpp</a></code> header. <pre>using namespace rapidxml;\r\nxml_document&lt;&gt; doc;    // character type defaults to char\r\n// ... some code to fill the document\r\n\r\n// Print to stream using operator &lt;&lt;\r\nstd::cout &lt;&lt; doc;   \r\n\r\n// Print to stream using print function, specifying printing flags\r\nprint(std::cout, doc, 0);   // 0 means default printing flags\r\n\r\n// Print to string using output iterator\r\nstd::string s;\r\nprint(std::back_inserter(s), doc, 0);\r\n\r\n// Print to memory buffer using output iterator\r\nchar buffer[4096];                      // You are responsible for making the buffer large enough!\r\nchar *end = print(buffer, doc, 0);      // end contains pointer to character after last printed character\r\n*end = 0;                               // Add string terminator after XML\r\n</pre></para></sect2></sect1><sect1><h2 id=\"namespacerapidxml_1differences\">3. Differences From Regular XML Parsers</h2><para>RapidXml is an <i>in-situ parser</i>, which allows it to achieve very high parsing speed. In-situ means that parser does not make copies of strings. Instead, it places pointers to the <i>source text</i> in the DOM hierarchy.</para><sect2><h3 id=\"namespacerapidxml_1lifetime_of_source_text\">3.1 Lifetime Of Source Text</h3><para>In-situ parsing requires that source text lives at least as long as the document object. If source text is destroyed, names and values of nodes in DOM tree will become destroyed as well. Additionally, whitespace processing, character entity translation, and zero-termination of strings require that source text be modified during parsing (but see non-destructive mode). This makes the text useless for further processing once it was parsed by RapidXml. <br/><br/>\r\n In many cases however, these are not serious issues.</para></sect2><sect2><h3 id=\"namespacerapidxml_1ownership_of_strings\">3.2 Ownership Of Strings</h3><para>Nodes and attributes produced by RapidXml do not own their name and value strings. They merely hold the pointers to them. This means you have to be careful when setting these values manually, by using <a href=\"#classrapidxml_1_1xml__base_e099c291e104a0d277307fe71f5e0f9e_1e099c291e104a0d277307fe71f5e0f9e\" kindref=\"member\">xml_base::name(const Ch *)</a> or <a href=\"#classrapidxml_1_1xml__base_18c7469acdca771de9b4f3054053029c_118c7469acdca771de9b4f3054053029c\" kindref=\"member\">xml_base::value(const Ch *)</a> functions. Care must be taken to ensure that lifetime of the string passed is at least as long as lifetime of the node/attribute. The easiest way to achieve it is to allocate the string from <a href=\"#classrapidxml_1_1memory__pool\" kindref=\"compound\">memory_pool</a> owned by the document. Use <a href=\"#classrapidxml_1_1memory__pool_69729185bc59b0875192d667c47b8859_169729185bc59b0875192d667c47b8859\" kindref=\"member\">memory_pool::allocate_string()</a> function for this purpose.</para></sect2><sect2><h3 id=\"namespacerapidxml_1destructive_non_destructive\">3.3 Destructive Vs Non-Destructive Mode</h3><para>By default, the parser modifies source text during the parsing process. This is required to achieve character entity translation, whitespace normalization, and zero-termination of strings. <br/><br/>\r\n In some cases this behaviour may be undesirable, for example if source text resides in read only memory, or is mapped to memory directly from file. By using appropriate parser flags (parse_non_destructive), source text modifications can be disabled. However, because RapidXml does in-situ parsing, it obviously has the following side-effects:<ul><li><para>no whitespace normalization is done</para></li><li><para>no entity reference translation is done</para></li><li><para>names and values are not zero-terminated, you must use <a href=\"#classrapidxml_1_1xml__base_0dae694c8f7e4d89f1003e2f3a15a43c_10dae694c8f7e4d89f1003e2f3a15a43c\" kindref=\"member\">xml_base::name_size()</a> and <a href=\"#classrapidxml_1_1xml__base_aed5ae791b7164c1ee5e649198cbb3db_1aed5ae791b7164c1ee5e649198cbb3db\" kindref=\"member\">xml_base::value_size()</a> functions to tell where they end</para></li></ul></para></sect2></sect1><sect1><h2 id=\"namespacerapidxml_1performance\">4. Performance</h2><para>RapidXml achieves its speed through use of several techniques:<ul><li><para>In-situ parsing. When building DOM tree, RapidXml does not make copies of string data, such as node names and values. Instead, it stores pointers to interior of the source text.</para></li><li><para>Use of template metaprogramming techniques. This allows it to move much of the work to compile time. Through magic of the templates, C++ compiler generates a separate copy of parsing code for any combination of parser flags you use. In each copy, all possible decisions are made at compile time and all unused code is omitted.</para></li><li><para>Extensive use of lookup tables for parsing.</para></li><li><para>Hand-tuned C++ with profiling done on several most popular CPUs.</para></li></ul></para><para>This results in a very small and fast code: a parser which is custom tailored to exact needs with each invocation.</para><sect2><h3 id=\"namespacerapidxml_1performance_charts\">4.1 Comparison With Other Parsers</h3><para>The table below compares speed of RapidXml to some other parsers, and to <code>strlen()</code> function executed on the same data. On a modern CPU (as of 2007), you can expect parsing throughput to be close to 1 GB/s. As a rule of thumb, parsing speed is about 50-100x faster than Xerces DOM, 30-60x faster than TinyXml, 3-12x faster than pugxml, and about 5% - 30% faster than pugixml, the fastest XML parser I know of.</para><para><ul><li><para>The test file is a real-world, 50kB large, moderately dense XML file. </para></li><li><para>All timing is done by using RDTSC instruction present in Pentium-compatible CPUs. </para></li><li><para>No profile-guided optimizations are used. </para></li><li><para>All parsers are running in their fastest modes. </para></li><li><para>The results are given in CPU cycles per character, so frequency of CPUs is irrelevant. </para></li><li><para>The results are minimum values from a large number of runs, to minimize effects of operating system activity, task switching, interrupt handling etc. </para></li><li><para>A single parse of the test file takes about 1/10th of a millisecond, so with large number of runs there is a good chance of hitting at least one no-interrupt streak, and obtaining undisturbed results. </para></li></ul><table rows=\"9\" cols=\"7\" border=\"1\" cellpadding=\"3pt\"><tr><th thead=\"yes\"><para><center>Platform</center></para></th><th thead=\"yes\"><para><center>Compiler</center></para></th><th thead=\"yes\"><para>strlen() </para></th><th thead=\"yes\"><para>RapidXml </para></th><th thead=\"yes\"><para>pugixml 0.3 </para></th><th thead=\"yes\"><para>pugxml </para></th><th thead=\"yes\"><para>TinyXml  </para></th></tr><tr><td thead=\"no\"><para><center>Pentium 4</center></para></td><td thead=\"no\"><para><center>MSVC 8.0</center></para></td><td thead=\"no\"><para><center>2.5</center></para></td><td thead=\"no\"><para><center>5.4</center></para></td><td thead=\"no\"><para><center>7.0</center></para></td><td thead=\"no\"><para><center>61.7</center></para></td><td thead=\"no\"><para><center>298.8</center></para></td></tr><tr><td thead=\"no\"><para><center>Pentium 4</center></para></td><td thead=\"no\"><para><center>gcc 4.1.1</center></para></td><td thead=\"no\"><para><center>0.8</center></para></td><td thead=\"no\"><para><center>6.1</center></para></td><td thead=\"no\"><para><center>9.5</center></para></td><td thead=\"no\"><para><center>67.0</center></para></td><td thead=\"no\"><para><center>413.2</center></para></td></tr><tr><td thead=\"no\"><para><center>Core 2</center></para></td><td thead=\"no\"><para><center>MSVC 8.0</center></para></td><td thead=\"no\"><para><center>1.0</center></para></td><td thead=\"no\"><para><center>4.5</center></para></td><td thead=\"no\"><para><center>5.0</center></para></td><td thead=\"no\"><para><center>24.6</center></para></td><td thead=\"no\"><para><center>154.8</center></para></td></tr><tr><td thead=\"no\"><para><center>Core 2</center></para></td><td thead=\"no\"><para><center>gcc 4.1.1</center></para></td><td thead=\"no\"><para><center>0.6</center></para></td><td thead=\"no\"><para><center>4.6</center></para></td><td thead=\"no\"><para><center>5.4</center></para></td><td thead=\"no\"><para><center>28.3</center></para></td><td thead=\"no\"><para><center>229.3</center></para></td></tr><tr><td thead=\"no\"><para><center>Athlon XP</center></para></td><td thead=\"no\"><para><center>MSVC 8.0</center></para></td><td thead=\"no\"><para><center>3.1</center></para></td><td thead=\"no\"><para><center>7.7</center></para></td><td thead=\"no\"><para><center>8.0</center></para></td><td thead=\"no\"><para><center>25.5</center></para></td><td thead=\"no\"><para><center>182.6</center></para></td></tr><tr><td thead=\"no\"><para><center>Athlon XP</center></para></td><td thead=\"no\"><para><center>gcc 4.1.1</center></para></td><td thead=\"no\"><para><center>0.9</center></para></td><td thead=\"no\"><para><center>8.2</center></para></td><td thead=\"no\"><para><center>9.2</center></para></td><td thead=\"no\"><para><center>33.7</center></para></td><td thead=\"no\"><para><center>265.2</center></para></td></tr><tr><td thead=\"no\"><para><center>Pentium 3</center></para></td><td thead=\"no\"><para><center>MSVC 8.0</center></para></td><td thead=\"no\"><para><center>2.0</center></para></td><td thead=\"no\"><para><center>6.3</center></para></td><td thead=\"no\"><para><center>7.0</center></para></td><td thead=\"no\"><para><center>30.9</center></para></td><td thead=\"no\"><para><center>211.9</center></para></td></tr><tr><td thead=\"no\"><para><center>Pentium 3</center></para></td><td thead=\"no\"><para><center>gcc 4.1.1</center></para></td><td thead=\"no\"><para><center>1.0</center></para></td><td thead=\"no\"><para><center>6.7</center></para></td><td thead=\"no\"><para><center>8.9</center></para></td><td thead=\"no\"><para><center>35.3</center></para></td><td thead=\"no\"><para><center>316.0</center></para></td></tr></table><i>(*) All results are in CPU cycles per character of source text</i></para></sect2></sect1><sect1><h2 id=\"namespacerapidxml_1reference\">5. Reference</h2><para>This section lists all classes, functions, constants etc. and describes them in detail. </para></sect1></detaileddescription><dl><dt>class\r\n\t\t\t\t\t\t\t\t  template\r\n\t\t\t\t\t\t\t   <a href=\"#classrapidxml_1_1memory__pool\">rapidxml::memory_pool</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstructor\r\n\t\t\t <a href=\"#classrapidxml_1_1memory__pool_f8fb3c8f1a564f8045c40bcd07a89866_1f8fb3c8f1a564f8045c40bcd07a89866\">memory_pool()</a></dt><dt class=\"indented\">\r\n\t\t\t\tdestructor\r\n\t\t\t <a href=\"#classrapidxml_1_1memory__pool_6f8c7990d9ec1ed2acf6558b238570eb_16f8c7990d9ec1ed2acf6558b238570eb\">~memory_pool()</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1memory__pool_750ba3c610b129ac057d817509d08f41_1750ba3c610b129ac057d817509d08f41\">allocate_node(node_type type, const Ch *name=0, const Ch *value=0, std::size_t name_size=0, std::size_t value_size=0)</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1memory__pool_462de142669e0ff649e8e615b82bf457_1462de142669e0ff649e8e615b82bf457\">allocate_attribute(const Ch *name=0, const Ch *value=0, std::size_t name_size=0, std::size_t value_size=0)</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1memory__pool_69729185bc59b0875192d667c47b8859_169729185bc59b0875192d667c47b8859\">allocate_string(const Ch *source=0, std::size_t size=0)</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1memory__pool_95c49fcb056e9103ec906a59e3e01d76_195c49fcb056e9103ec906a59e3e01d76\">clone_node(const xml_node&lt; Ch &gt; *source, xml_node&lt; Ch &gt; *result=0)</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1memory__pool_c8bb3912a3ce86b15842e79d0b421204_1c8bb3912a3ce86b15842e79d0b421204\">clear()</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1memory__pool_c0a55a6ef0837dca67572e357100d78a_1c0a55a6ef0837dca67572e357100d78a\">set_allocator(alloc_func *af, free_func *ff)</a></dt><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><p/><p/><dt>class <a href=\"#classrapidxml_1_1parse__error\">rapidxml::parse_error</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstructor\r\n\t\t\t <a href=\"#classrapidxml_1_1parse__error_4dd8d1bdbd9221df4dcb90cafaee3332_14dd8d1bdbd9221df4dcb90cafaee3332\">parse_error(const char *what, void *where)</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1parse__error_ff06f49065b54a8a86e02e9a2441a8ba_1ff06f49065b54a8a86e02e9a2441a8ba\">what() const </a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1parse__error_377be7d201d95221c318682c35377aca_1377be7d201d95221c318682c35377aca\">where() const </a></dt><dt class=\"indented\"/><dt class=\"indented\"/><p/><dt>class\r\n\t\t\t\t\t\t\t\t  template\r\n\t\t\t\t\t\t\t   <a href=\"#classrapidxml_1_1xml__attribute\">rapidxml::xml_attribute</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstructor\r\n\t\t\t <a href=\"#classrapidxml_1_1xml__attribute_d5464aadf08269a886b730993525db34_1d5464aadf08269a886b730993525db34\">xml_attribute()</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__attribute_77aea7d8d996ba4f6bd61cc478a4e72d_177aea7d8d996ba4f6bd61cc478a4e72d\">document() const </a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__attribute_5c4a98d2b75f9b41b12c110108fd55ab_15c4a98d2b75f9b41b12c110108fd55ab\">previous_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const </a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__attribute_1b8a814d0d3a7165396b08433eee8a91_11b8a814d0d3a7165396b08433eee8a91\">next_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const </a></dt><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><p/><dt>class\r\n\t\t\t\t\t\t\t\t  template\r\n\t\t\t\t\t\t\t   <a href=\"#classrapidxml_1_1xml__base\">rapidxml::xml_base</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstructor\r\n\t\t\t <a href=\"#classrapidxml_1_1xml__base_23630d2c130a9e0e3f3afa7584a9b218_123630d2c130a9e0e3f3afa7584a9b218\">xml_base()</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__base_622eade29fdf7806d3ef93ac4d90e707_1622eade29fdf7806d3ef93ac4d90e707\">name() const </a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__base_0dae694c8f7e4d89f1003e2f3a15a43c_10dae694c8f7e4d89f1003e2f3a15a43c\">name_size() const </a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__base_c54fa4987fb503916a7b541eb15c9c7f_1c54fa4987fb503916a7b541eb15c9c7f\">value() const </a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__base_aed5ae791b7164c1ee5e649198cbb3db_1aed5ae791b7164c1ee5e649198cbb3db\">value_size() const </a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__base_4e7e23d06d48126c65b1f6266acfba5c_14e7e23d06d48126c65b1f6266acfba5c\">name(const Ch *name, std::size_t size)</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__base_e099c291e104a0d277307fe71f5e0f9e_1e099c291e104a0d277307fe71f5e0f9e\">name(const Ch *name)</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__base_d9640aa3f5374673cb72a5289b6c91eb_1d9640aa3f5374673cb72a5289b6c91eb\">value(const Ch *value, std::size_t size)</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__base_18c7469acdca771de9b4f3054053029c_118c7469acdca771de9b4f3054053029c\">value(const Ch *value)</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__base_798e8df7ea53ade4d9f0701017dce80e_1798e8df7ea53ade4d9f0701017dce80e\">parent() const </a></dt><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><p/><dt>class\r\n\t\t\t\t\t\t\t\t  template\r\n\t\t\t\t\t\t\t   <a href=\"#classrapidxml_1_1xml__document\">rapidxml::xml_document</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstructor\r\n\t\t\t <a href=\"#classrapidxml_1_1xml__document_6ce266cc52d549c42abe3a3d5e8af9ba_16ce266cc52d549c42abe3a3d5e8af9ba\">xml_document()</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\">parse(Ch *text)</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__document_c8bb3912a3ce86b15842e79d0b421204_1c8bb3912a3ce86b15842e79d0b421204\">clear()</a></dt><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><p/><p/><p/><p/><p/><p/><p/><p/><p/><dt>class\r\n\t\t\t\t\t\t\t\t  template\r\n\t\t\t\t\t\t\t   <a href=\"#classrapidxml_1_1xml__node\">rapidxml::xml_node</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstructor\r\n\t\t\t <a href=\"#classrapidxml_1_1xml__node_34c55af3504549a475e5b9dfcaa6adf5_134c55af3504549a475e5b9dfcaa6adf5\">xml_node(node_type type)</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_975e86937621ae4afe6a423219de30d0_1975e86937621ae4afe6a423219de30d0\">type() const </a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_77aea7d8d996ba4f6bd61cc478a4e72d_177aea7d8d996ba4f6bd61cc478a4e72d\">document() const </a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_7823e36687669e59c2afdf66334ef35a_17823e36687669e59c2afdf66334ef35a\">first_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const </a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_fcb6e2209b591a36d2dadba20d2bc7cc_1fcb6e2209b591a36d2dadba20d2bc7cc\">last_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const </a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_ac2f6886c0107e9d5f156e9542546df6_1ac2f6886c0107e9d5f156e9542546df6\">previous_sibling(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const </a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_b3ead2cefecc03a813836203e3f6f38f_1b3ead2cefecc03a813836203e3f6f38f\">next_sibling(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const </a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_5810a09f82f8d53efbe9456286dcec83_15810a09f82f8d53efbe9456286dcec83\">first_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const </a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_16953d66751b5b949ee4ee2d9c0bc63a_116953d66751b5b949ee4ee2d9c0bc63a\">last_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const </a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_a78759bfa429fa2ab6bc5fe617cfa3cf_1a78759bfa429fa2ab6bc5fe617cfa3cf\">type(node_type type)</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_0c39df6617e709eb2fba11300dea63f2_10c39df6617e709eb2fba11300dea63f2\">prepend_node(xml_node&lt; Ch &gt; *child)</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_86de2e22276826089b7baed2599f8dee_186de2e22276826089b7baed2599f8dee\">append_node(xml_node&lt; Ch &gt; *child)</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_780972a57fc447250ab47cc8f421b65e_1780972a57fc447250ab47cc8f421b65e\">insert_node(xml_node&lt; Ch &gt; *where, xml_node&lt; Ch &gt; *child)</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_9a31d861e1bddc710839c551a5d2b3a4_19a31d861e1bddc710839c551a5d2b3a4\">remove_first_node()</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_87addf2bc127ee31aa4b5295d3c9b530_187addf2bc127ee31aa4b5295d3c9b530\">remove_last_node()</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_9316463a2201631e7e2062b17729f9cd_19316463a2201631e7e2062b17729f9cd\">remove_node(xml_node&lt; Ch &gt; *where)</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_0218147d13e41d5fa60ced4e7a7e9726_10218147d13e41d5fa60ced4e7a7e9726\">remove_all_nodes()</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_f6dffa513da74cc0be71a7ba84f8265e_1f6dffa513da74cc0be71a7ba84f8265e\">prepend_attribute(xml_attribute&lt; Ch &gt; *attribute)</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_8fbd4f5ef7169d493da9f8d87ac04b77_18fbd4f5ef7169d493da9f8d87ac04b77\">append_attribute(xml_attribute&lt; Ch &gt; *attribute)</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_070d5888b0557fe06a5b24961de1b988_1070d5888b0557fe06a5b24961de1b988\">insert_attribute(xml_attribute&lt; Ch &gt; *where, xml_attribute&lt; Ch &gt; *attribute)</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_4eea4a7f6cb484ca9944f7eafe6e1843_14eea4a7f6cb484ca9944f7eafe6e1843\">remove_first_attribute()</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_37d87c4d5d89fa0cf05b72ee8d4cba3b_137d87c4d5d89fa0cf05b72ee8d4cba3b\">remove_last_attribute()</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_c75154db2e768c0e5b541fc8cd0775ab_1c75154db2e768c0e5b541fc8cd0775ab\">remove_attribute(xml_attribute&lt; Ch &gt; *where)</a></dt><dt class=\"indented\">function <a href=\"#classrapidxml_1_1xml__node_59e6ad4cfd5e8096c052e71d79561eda_159e6ad4cfd5e8096c052e71d79561eda\">remove_all_attributes()</a></dt><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><p/><dt>namespace <a href=\"#namespacerapidxml\">rapidxml</a></dt><dt class=\"indented\">enum <a href=\"#namespacerapidxml_6a276b85e2da28c5f9c3dbce61c55682_16a276b85e2da28c5f9c3dbce61c55682\">node_type</a></dt><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\"/><dt class=\"indented\">function <a href=\"#namespacerapidxml_ff5d67f74437199d316d2b2660653ae1_1ff5d67f74437199d316d2b2660653ae1\">parse_error_handler(const char *what, void *where)</a></dt><dt class=\"indented\">function <a href=\"#namespacerapidxml_b94d570fc4c4ab2423813cd0243326b1_1b94d570fc4c4ab2423813cd0243326b1\">print(OutIt out, const xml_node&lt; Ch &gt; &amp;node, int flags=0)</a></dt><dt class=\"indented\">function <a href=\"#namespacerapidxml_13bc37d6d1047acb0efdbc1689221a5e_113bc37d6d1047acb0efdbc1689221a5e\">print(std::basic_ostream&lt; Ch &gt; &amp;out, const xml_node&lt; Ch &gt; &amp;node, int flags=0)</a></dt><dt class=\"indented\">function <a href=\"#namespacerapidxml_5619b38000d967fb223b2b0a8c17463a_15619b38000d967fb223b2b0a8c17463a\">operator&lt;&lt;(std::basic_ostream&lt; Ch &gt; &amp;out, const xml_node&lt; Ch &gt; &amp;node)</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstant\r\n\t\t\t <a href=\"#namespacerapidxml_87e8bbab53702cf3b438bd553c10b6b9_187e8bbab53702cf3b438bd553c10b6b9\">parse_no_data_nodes</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstant\r\n\t\t\t <a href=\"#namespacerapidxml_97e2c4fdc04fae17126f9971a4fc993e_197e2c4fdc04fae17126f9971a4fc993e\">parse_no_element_values</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstant\r\n\t\t\t <a href=\"#namespacerapidxml_9cae3801e70437cbc410c24bf6be691c_19cae3801e70437cbc410c24bf6be691c\">parse_no_string_terminators</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstant\r\n\t\t\t <a href=\"#namespacerapidxml_7223b7815c4fb8b42e6e4e77e1ea6b97_17223b7815c4fb8b42e6e4e77e1ea6b97\">parse_no_entity_translation</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstant\r\n\t\t\t <a href=\"#namespacerapidxml_ccde57f6054857ee4042a1b4d98c83b9_1ccde57f6054857ee4042a1b4d98c83b9\">parse_no_utf8</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstant\r\n\t\t\t <a href=\"#namespacerapidxml_52e2c934ad9c845a5f4cc49570470556_152e2c934ad9c845a5f4cc49570470556\">parse_declaration_node</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstant\r\n\t\t\t <a href=\"#namespacerapidxml_0f7479dacbc868456d07897a8c072784_10f7479dacbc868456d07897a8c072784\">parse_comment_nodes</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstant\r\n\t\t\t <a href=\"#namespacerapidxml_8e187746ba1ca04f107951ad32df962e_18e187746ba1ca04f107951ad32df962e\">parse_doctype_node</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstant\r\n\t\t\t <a href=\"#namespacerapidxml_1c20b2b2b75711cd76423e119c49f830_11c20b2b2b75711cd76423e119c49f830\">parse_pi_nodes</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstant\r\n\t\t\t <a href=\"#namespacerapidxml_a5daff9d61c7d4eaf98e4d42efe628ee_1a5daff9d61c7d4eaf98e4d42efe628ee\">parse_validate_closing_tags</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstant\r\n\t\t\t <a href=\"#namespacerapidxml_ac1f06b1afd47b812732fb521b146fd9_1ac1f06b1afd47b812732fb521b146fd9\">parse_trim_whitespace</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstant\r\n\t\t\t <a href=\"#namespacerapidxml_88f95d4e275ba01408fefde83078651b_188f95d4e275ba01408fefde83078651b\">parse_normalize_whitespace</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstant\r\n\t\t\t <a href=\"#namespacerapidxml_45751cf2f38fd6915f35b3122b46d5b6_145751cf2f38fd6915f35b3122b46d5b6\">parse_default</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstant\r\n\t\t\t <a href=\"#namespacerapidxml_a97ba1a0a79a6d66f4eef3612508d943_1a97ba1a0a79a6d66f4eef3612508d943\">parse_non_destructive</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstant\r\n\t\t\t <a href=\"#namespacerapidxml_398c5476e76102f8bd76c10bb0abbe10_1398c5476e76102f8bd76c10bb0abbe10\">parse_fastest</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstant\r\n\t\t\t <a href=\"#namespacerapidxml_b4f2515265facb42291570307924bd57_1b4f2515265facb42291570307924bd57\">parse_full</a></dt><dt class=\"indented\">\r\n\t\t\t\tconstant\r\n\t\t\t <a href=\"#namespacerapidxml_b08b8d4293c203b69ed6c5ae77ac1907_1b08b8d4293c203b69ed6c5ae77ac1907\">print_no_indenting</a></dt><p/><p/><p/><p/></dl><hr/><h3 class=\"reference-header\" id=\"classrapidxml_1_1memory__pool\">class\r\n\t\t\t\t\t\t\t\t\t  template\r\n\t\t\t\t\t\t\t\t   rapidxml::memory_pool</h3>\r\n\r\n\t\t\t\t\t\t\t  Defined in <a href=\"rapidxml.hpp\">rapidxml.hpp</a><br/>\r\n\t\t\t\t\t\t\t\t  Base class for\r\n\t\t\t\t\t\t\t\t  <a href=\"#classrapidxml_1_1xml__document\">xml_document</a> <h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">This class is used by the parser to create new nodes and attributes, without overheads of dynamic memory allocation. In most cases, you will not need to use this class directly. However, if you need to create nodes manually or modify names/values of nodes, you are encouraged to use <a href=\"#classrapidxml_1_1memory__pool\" kindref=\"compound\">memory_pool</a> of relevant <a href=\"#classrapidxml_1_1xml__document\" kindref=\"compound\">xml_document</a> to allocate the memory. Not only is this faster than allocating them by using <code>new</code> operator, but also their lifetime will be tied to the lifetime of document, possibly simplyfing memory management. <br/><br/>\r\n Call <a href=\"#classrapidxml_1_1memory__pool_750ba3c610b129ac057d817509d08f41_1750ba3c610b129ac057d817509d08f41\" kindref=\"member\">allocate_node()</a> or <a href=\"#classrapidxml_1_1memory__pool_462de142669e0ff649e8e615b82bf457_1462de142669e0ff649e8e615b82bf457\" kindref=\"member\">allocate_attribute()</a> functions to obtain new nodes or attributes from the pool. You can also call <a href=\"#classrapidxml_1_1memory__pool_69729185bc59b0875192d667c47b8859_169729185bc59b0875192d667c47b8859\" kindref=\"member\">allocate_string()</a> function to allocate strings. Such strings can then be used as names or values of nodes without worrying about their lifetime. Note that there is no <code>free()</code> function -- all allocations are freed at once when <a href=\"#classrapidxml_1_1memory__pool_c8bb3912a3ce86b15842e79d0b421204_1c8bb3912a3ce86b15842e79d0b421204\" kindref=\"member\">clear()</a> function is called, or when the pool is destroyed. <br/><br/>\r\n It is also possible to create a standalone <a href=\"#classrapidxml_1_1memory__pool\" kindref=\"compound\">memory_pool</a>, and use it to allocate nodes, whose lifetime will not be tied to any document. <br/><br/>\r\n Pool maintains <code>RAPIDXML_STATIC_POOL_SIZE</code> bytes of statically allocated memory. Until static memory is exhausted, no dynamic memory allocations are done. When static memory is exhausted, pool allocates additional blocks of memory of size <code>RAPIDXML_DYNAMIC_POOL_SIZE</code> each, by using global <code>new[]</code> and <code>delete[]</code> operators. This behaviour can be changed by setting custom allocation routines. Use <a href=\"#classrapidxml_1_1memory__pool_c0a55a6ef0837dca67572e357100d78a_1c0a55a6ef0837dca67572e357100d78a\" kindref=\"member\">set_allocator()</a> function to set them. <br/><br/>\r\n Allocations for nodes, attributes and strings are aligned at <code>RAPIDXML_ALIGNMENT</code> bytes. This value defaults to the size of pointer on target architecture. <br/><br/>\r\n To obtain absolutely top performance from the parser, it is important that all nodes are allocated from a single, contiguous block of memory. Otherwise, cache misses when jumping between two (or more) disjoint blocks of memory can slow down parsing quite considerably. If required, you can tweak <code>RAPIDXML_STATIC_POOL_SIZE</code>, <code>RAPIDXML_DYNAMIC_POOL_SIZE</code> and <code>RAPIDXML_ALIGNMENT</code> to obtain best wasted memory to performance compromise. To do it, define their values before <a href=\"#rapidxml_8hpp\" kindref=\"compound\">rapidxml.hpp</a> file is included. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">Ch</dt><dd>Character type of created nodes. </dd></dl><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1memory__pool_f8fb3c8f1a564f8045c40bcd07a89866_1f8fb3c8f1a564f8045c40bcd07a89866\">\r\n\t\t\t\tconstructor\r\n\t\t\t memory_pool::memory_pool</h3><h4>Synopsis</h4><code class=\"synopsis\">memory_pool();\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Constructs empty pool with default allocator functions. </para><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1memory__pool_6f8c7990d9ec1ed2acf6558b238570eb_16f8c7990d9ec1ed2acf6558b238570eb\">\r\n\t\t\t\tdestructor\r\n\t\t\t memory_pool::~memory_pool</h3><h4>Synopsis</h4><code class=\"synopsis\">~memory_pool();\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Destroys pool and frees all the memory. This causes memory occupied by nodes allocated by the pool to be freed. Nodes allocated from the pool are no longer valid. </para><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1memory__pool_750ba3c610b129ac057d817509d08f41_1750ba3c610b129ac057d817509d08f41\">function memory_pool::allocate_node</h3><h4>Synopsis</h4><code class=\"synopsis\">xml_node&lt;Ch&gt;* allocate_node(node_type type, const Ch *name=0, const Ch *value=0, std::size_t name_size=0, std::size_t value_size=0);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Allocates a new node from the pool, and optionally assigns name and value to it. If the allocation request cannot be accomodated, this function will throw <code>std::bad_alloc</code>. If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function will call <a href=\"#namespacerapidxml_ff5d67f74437199d316d2b2660653ae1_1ff5d67f74437199d316d2b2660653ae1\" kindref=\"member\">rapidxml::parse_error_handler()</a> function. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">type</dt><dd class=\"parameter-def\">Type of node to create. </dd></dl><dl><dt class=\"parameter-name\">name</dt><dd class=\"parameter-def\">Name to assign to the node, or 0 to assign no name. </dd></dl><dl><dt class=\"parameter-name\">value</dt><dd class=\"parameter-def\">Value to assign to the node, or 0 to assign no value. </dd></dl><dl><dt class=\"parameter-name\">name_size</dt><dd class=\"parameter-def\">Size of name to assign, or 0 to automatically calculate size from name string. </dd></dl><dl><dt class=\"parameter-name\">value_size</dt><dd class=\"parameter-def\">Size of value to assign, or 0 to automatically calculate size from value string. </dd></dl><h4>Returns</h4>Pointer to allocated node. This pointer will never be NULL. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1memory__pool_462de142669e0ff649e8e615b82bf457_1462de142669e0ff649e8e615b82bf457\">function memory_pool::allocate_attribute</h3><h4>Synopsis</h4><code class=\"synopsis\">xml_attribute&lt;Ch&gt;* allocate_attribute(const Ch *name=0, const Ch *value=0, std::size_t name_size=0, std::size_t value_size=0);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Allocates a new attribute from the pool, and optionally assigns name and value to it. If the allocation request cannot be accomodated, this function will throw <code>std::bad_alloc</code>. If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function will call <a href=\"#namespacerapidxml_ff5d67f74437199d316d2b2660653ae1_1ff5d67f74437199d316d2b2660653ae1\" kindref=\"member\">rapidxml::parse_error_handler()</a> function. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">name</dt><dd class=\"parameter-def\">Name to assign to the attribute, or 0 to assign no name. </dd></dl><dl><dt class=\"parameter-name\">value</dt><dd class=\"parameter-def\">Value to assign to the attribute, or 0 to assign no value. </dd></dl><dl><dt class=\"parameter-name\">name_size</dt><dd class=\"parameter-def\">Size of name to assign, or 0 to automatically calculate size from name string. </dd></dl><dl><dt class=\"parameter-name\">value_size</dt><dd class=\"parameter-def\">Size of value to assign, or 0 to automatically calculate size from value string. </dd></dl><h4>Returns</h4>Pointer to allocated attribute. This pointer will never be NULL. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1memory__pool_69729185bc59b0875192d667c47b8859_169729185bc59b0875192d667c47b8859\">function memory_pool::allocate_string</h3><h4>Synopsis</h4><code class=\"synopsis\">Ch* allocate_string(const Ch *source=0, std::size_t size=0);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Allocates a char array of given size from the pool, and optionally copies a given string to it. If the allocation request cannot be accomodated, this function will throw <code>std::bad_alloc</code>. If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function will call <a href=\"#namespacerapidxml_ff5d67f74437199d316d2b2660653ae1_1ff5d67f74437199d316d2b2660653ae1\" kindref=\"member\">rapidxml::parse_error_handler()</a> function. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">source</dt><dd class=\"parameter-def\">String to initialize the allocated memory with, or 0 to not initialize it. </dd></dl><dl><dt class=\"parameter-name\">size</dt><dd class=\"parameter-def\">Number of characters to allocate, or zero to calculate it automatically from source string length; if size is 0, source string must be specified and null terminated. </dd></dl><h4>Returns</h4>Pointer to allocated char array. This pointer will never be NULL. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1memory__pool_95c49fcb056e9103ec906a59e3e01d76_195c49fcb056e9103ec906a59e3e01d76\">function memory_pool::clone_node</h3><h4>Synopsis</h4><code class=\"synopsis\">xml_node&lt;Ch&gt;* clone_node(const xml_node&lt; Ch &gt; *source, xml_node&lt; Ch &gt; *result=0);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Clones an <a href=\"#classrapidxml_1_1xml__node\" kindref=\"compound\">xml_node</a> and its hierarchy of child nodes and attributes. Nodes and attributes are allocated from this memory pool. Names and values are not cloned, they are shared between the clone and the source. Result node can be optionally specified as a second parameter, in which case its contents will be replaced with cloned source node. This is useful when you want to clone entire document. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">source</dt><dd class=\"parameter-def\">Node to clone. </dd></dl><dl><dt class=\"parameter-name\">result</dt><dd class=\"parameter-def\">Node to put results in, or 0 to automatically allocate result node </dd></dl><h4>Returns</h4>Pointer to cloned node. This pointer will never be NULL. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1memory__pool_c8bb3912a3ce86b15842e79d0b421204_1c8bb3912a3ce86b15842e79d0b421204\">function memory_pool::clear</h3><h4>Synopsis</h4><code class=\"synopsis\">void clear();\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Clears the pool. This causes memory occupied by nodes allocated by the pool to be freed. Any nodes or strings allocated from the pool will no longer be valid. </para><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1memory__pool_c0a55a6ef0837dca67572e357100d78a_1c0a55a6ef0837dca67572e357100d78a\">function memory_pool::set_allocator</h3><h4>Synopsis</h4><code class=\"synopsis\">void set_allocator(alloc_func *af, free_func *ff);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Sets or resets the user-defined memory allocation functions for the pool. This can only be called when no memory is allocated from the pool yet, otherwise results are undefined. Allocation function must not return invalid pointer on failure. It should either throw, stop the program, or use <code>longjmp()</code> function to pass control to other place of program. If it returns invalid pointer, results are undefined. <br/><br/>\r\n User defined allocation functions must have the following forms: <br/><code><br/>\r\nvoid *allocate(std::size_t size); <br/>\r\nvoid free(void *pointer); </code><br/></para><h4>Parameters</h4><dl><dt class=\"parameter-name\">af</dt><dd class=\"parameter-def\">Allocation function, or 0 to restore default function </dd></dl><dl><dt class=\"parameter-name\">ff</dt><dd class=\"parameter-def\">Free function, or 0 to restore default function </dd></dl><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1parse__error\">class rapidxml::parse_error</h3>\r\n\r\n\t\t\t\t\t\t\t  Defined in <a href=\"rapidxml.hpp\">rapidxml.hpp</a><br/><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Parse error exception. This exception is thrown by the parser when an error occurs. Use <a href=\"#classrapidxml_1_1parse__error_ff06f49065b54a8a86e02e9a2441a8ba_1ff06f49065b54a8a86e02e9a2441a8ba\" kindref=\"member\">what()</a> function to get human-readable error message. Use <a href=\"#classrapidxml_1_1parse__error_377be7d201d95221c318682c35377aca_1377be7d201d95221c318682c35377aca\" kindref=\"member\">where()</a> function to get a pointer to position within source text where error was detected. <br/><br/>\r\n If throwing exceptions by the parser is undesirable, it can be disabled by defining RAPIDXML_NO_EXCEPTIONS macro before <a href=\"#rapidxml_8hpp\" kindref=\"compound\">rapidxml.hpp</a> is included. This will cause the parser to call <a href=\"#namespacerapidxml_ff5d67f74437199d316d2b2660653ae1_1ff5d67f74437199d316d2b2660653ae1\" kindref=\"member\">rapidxml::parse_error_handler()</a> function instead of throwing an exception. This function must be defined by the user. <br/><br/>\r\n This class derives from <code>std::exception</code> class. </para><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1parse__error_4dd8d1bdbd9221df4dcb90cafaee3332_14dd8d1bdbd9221df4dcb90cafaee3332\">\r\n\t\t\t\tconstructor\r\n\t\t\t parse_error::parse_error</h3><h4>Synopsis</h4><code class=\"synopsis\">parse_error(const char *what, void *where);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Constructs parse error. </para><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1parse__error_ff06f49065b54a8a86e02e9a2441a8ba_1ff06f49065b54a8a86e02e9a2441a8ba\">function parse_error::what</h3><h4>Synopsis</h4><code class=\"synopsis\">virtual const char* what() const;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Gets human readable description of error. </para><h4>Returns</h4>Pointer to null terminated description of the error. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1parse__error_377be7d201d95221c318682c35377aca_1377be7d201d95221c318682c35377aca\">function parse_error::where</h3><h4>Synopsis</h4><code class=\"synopsis\">Ch* where() const;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Gets pointer to character data where error happened. Ch should be the same as char type of <a href=\"#classrapidxml_1_1xml__document\" kindref=\"compound\">xml_document</a> that produced the error. </para><h4>Returns</h4>Pointer to location within the parsed string where error occured. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__attribute\">class\r\n\t\t\t\t\t\t\t\t\t  template\r\n\t\t\t\t\t\t\t\t   rapidxml::xml_attribute</h3>\r\n\r\n\t\t\t\t\t\t\t  Defined in <a href=\"rapidxml.hpp\">rapidxml.hpp</a><br/>\r\n\t\t\t\t\t\t\t\t  Inherits from\r\n\t\t\t\t\t\t\t\t  <a href=\"#classrapidxml_1_1xml__base\">xml_base</a> <br/><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Class representing attribute node of XML document. Each attribute has name and value strings, which are available through <a href=\"#classrapidxml_1_1xml__base_622eade29fdf7806d3ef93ac4d90e707_1622eade29fdf7806d3ef93ac4d90e707\" kindref=\"member\">name()</a> and <a href=\"#classrapidxml_1_1xml__base_c54fa4987fb503916a7b541eb15c9c7f_1c54fa4987fb503916a7b541eb15c9c7f\" kindref=\"member\">value()</a> functions (inherited from <a href=\"#classrapidxml_1_1xml__base\" kindref=\"compound\">xml_base</a>). Note that after parse, both name and value of attribute will point to interior of source text used for parsing. Thus, this text must persist in memory for the lifetime of attribute. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">Ch</dt><dd>Character type to use. </dd></dl><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__attribute_d5464aadf08269a886b730993525db34_1d5464aadf08269a886b730993525db34\">\r\n\t\t\t\tconstructor\r\n\t\t\t xml_attribute::xml_attribute</h3><h4>Synopsis</h4><code class=\"synopsis\">xml_attribute();\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Constructs an empty attribute with the specified type. Consider using <a href=\"#classrapidxml_1_1memory__pool\" kindref=\"compound\">memory_pool</a> of appropriate <a href=\"#classrapidxml_1_1xml__document\" kindref=\"compound\">xml_document</a> if allocating attributes manually. </para><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__attribute_77aea7d8d996ba4f6bd61cc478a4e72d_177aea7d8d996ba4f6bd61cc478a4e72d\">function xml_attribute::document</h3><h4>Synopsis</h4><code class=\"synopsis\">xml_document&lt;Ch&gt;* document() const;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Gets document of which attribute is a child. </para><h4>Returns</h4>Pointer to document that contains this attribute, or 0 if there is no parent document. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__attribute_5c4a98d2b75f9b41b12c110108fd55ab_15c4a98d2b75f9b41b12c110108fd55ab\">function xml_attribute::previous_attribute</h3><h4>Synopsis</h4><code class=\"synopsis\">xml_attribute&lt;Ch&gt;* previous_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Gets previous attribute, optionally matching attribute name. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">name</dt><dd class=\"parameter-def\">Name of attribute to find, or 0 to return previous attribute regardless of its name; this string doesn&apos;t have to be zero-terminated if name_size is non-zero </dd></dl><dl><dt class=\"parameter-name\">name_size</dt><dd class=\"parameter-def\">Size of name, in characters, or 0 to have size calculated automatically from string </dd></dl><dl><dt class=\"parameter-name\">case_sensitive</dt><dd class=\"parameter-def\">Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters </dd></dl><h4>Returns</h4>Pointer to found attribute, or 0 if not found. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__attribute_1b8a814d0d3a7165396b08433eee8a91_11b8a814d0d3a7165396b08433eee8a91\">function xml_attribute::next_attribute</h3><h4>Synopsis</h4><code class=\"synopsis\">xml_attribute&lt;Ch&gt;* next_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Gets next attribute, optionally matching attribute name. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">name</dt><dd class=\"parameter-def\">Name of attribute to find, or 0 to return next attribute regardless of its name; this string doesn&apos;t have to be zero-terminated if name_size is non-zero </dd></dl><dl><dt class=\"parameter-name\">name_size</dt><dd class=\"parameter-def\">Size of name, in characters, or 0 to have size calculated automatically from string </dd></dl><dl><dt class=\"parameter-name\">case_sensitive</dt><dd class=\"parameter-def\">Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters </dd></dl><h4>Returns</h4>Pointer to found attribute, or 0 if not found. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__base\">class\r\n\t\t\t\t\t\t\t\t\t  template\r\n\t\t\t\t\t\t\t\t   rapidxml::xml_base</h3>\r\n\r\n\t\t\t\t\t\t\t  Defined in <a href=\"rapidxml.hpp\">rapidxml.hpp</a><br/>\r\n\t\t\t\t\t\t\t\t  Base class for\r\n\t\t\t\t\t\t\t\t  <a href=\"#classrapidxml_1_1xml__attribute\">xml_attribute</a> <a href=\"#classrapidxml_1_1xml__node\">xml_node</a> <h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Base class for <a href=\"#classrapidxml_1_1xml__node\" kindref=\"compound\">xml_node</a> and <a href=\"#classrapidxml_1_1xml__attribute\" kindref=\"compound\">xml_attribute</a> implementing common functions: <a href=\"#classrapidxml_1_1xml__base_622eade29fdf7806d3ef93ac4d90e707_1622eade29fdf7806d3ef93ac4d90e707\" kindref=\"member\">name()</a>, <a href=\"#classrapidxml_1_1xml__base_0dae694c8f7e4d89f1003e2f3a15a43c_10dae694c8f7e4d89f1003e2f3a15a43c\" kindref=\"member\">name_size()</a>, <a href=\"#classrapidxml_1_1xml__base_c54fa4987fb503916a7b541eb15c9c7f_1c54fa4987fb503916a7b541eb15c9c7f\" kindref=\"member\">value()</a>, <a href=\"#classrapidxml_1_1xml__base_aed5ae791b7164c1ee5e649198cbb3db_1aed5ae791b7164c1ee5e649198cbb3db\" kindref=\"member\">value_size()</a> and <a href=\"#classrapidxml_1_1xml__base_798e8df7ea53ade4d9f0701017dce80e_1798e8df7ea53ade4d9f0701017dce80e\" kindref=\"member\">parent()</a>. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">Ch</dt><dd>Character type to use </dd></dl><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__base_23630d2c130a9e0e3f3afa7584a9b218_123630d2c130a9e0e3f3afa7584a9b218\">\r\n\t\t\t\tconstructor\r\n\t\t\t xml_base::xml_base</h3><h4>Synopsis</h4><code class=\"synopsis\">xml_base();\r\n\t\t\t\t\t\t\t\t\t  </code><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__base_622eade29fdf7806d3ef93ac4d90e707_1622eade29fdf7806d3ef93ac4d90e707\">function xml_base::name</h3><h4>Synopsis</h4><code class=\"synopsis\">Ch* name() const;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Gets name of the node. Interpretation of name depends on type of node. Note that name will not be zero-terminated if <a href=\"#namespacerapidxml_9cae3801e70437cbc410c24bf6be691c_19cae3801e70437cbc410c24bf6be691c\" kindref=\"member\">rapidxml::parse_no_string_terminators</a> option was selected during parse. <br/><br/>\r\n Use <a href=\"#classrapidxml_1_1xml__base_0dae694c8f7e4d89f1003e2f3a15a43c_10dae694c8f7e4d89f1003e2f3a15a43c\" kindref=\"member\">name_size()</a> function to determine length of the name. </para><h4>Returns</h4>Name of node, or empty string if node has no name. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__base_0dae694c8f7e4d89f1003e2f3a15a43c_10dae694c8f7e4d89f1003e2f3a15a43c\">function xml_base::name_size</h3><h4>Synopsis</h4><code class=\"synopsis\">std::size_t name_size() const;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Gets size of node name, not including terminator character. This function works correctly irrespective of whether name is or is not zero terminated. </para><h4>Returns</h4>Size of node name, in characters. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__base_c54fa4987fb503916a7b541eb15c9c7f_1c54fa4987fb503916a7b541eb15c9c7f\">function xml_base::value</h3><h4>Synopsis</h4><code class=\"synopsis\">Ch* value() const;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Gets value of node. Interpretation of value depends on type of node. Note that value will not be zero-terminated if <a href=\"#namespacerapidxml_9cae3801e70437cbc410c24bf6be691c_19cae3801e70437cbc410c24bf6be691c\" kindref=\"member\">rapidxml::parse_no_string_terminators</a> option was selected during parse. <br/><br/>\r\n Use <a href=\"#classrapidxml_1_1xml__base_aed5ae791b7164c1ee5e649198cbb3db_1aed5ae791b7164c1ee5e649198cbb3db\" kindref=\"member\">value_size()</a> function to determine length of the value. </para><h4>Returns</h4>Value of node, or empty string if node has no value. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__base_aed5ae791b7164c1ee5e649198cbb3db_1aed5ae791b7164c1ee5e649198cbb3db\">function xml_base::value_size</h3><h4>Synopsis</h4><code class=\"synopsis\">std::size_t value_size() const;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Gets size of node value, not including terminator character. This function works correctly irrespective of whether value is or is not zero terminated. </para><h4>Returns</h4>Size of node value, in characters. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__base_4e7e23d06d48126c65b1f6266acfba5c_14e7e23d06d48126c65b1f6266acfba5c\">function xml_base::name</h3><h4>Synopsis</h4><code class=\"synopsis\">void name(const Ch *name, std::size_t size);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Sets name of node to a non zero-terminated string. See <a href=\"#namespacerapidxml_1ownership_of_strings\" kindref=\"member\">Ownership Of Strings</a> . <br/><br/>\r\n Note that node does not own its name or value, it only stores a pointer to it. It will not delete or otherwise free the pointer on destruction. It is reponsibility of the user to properly manage lifetime of the string. The easiest way to achieve it is to use <a href=\"#classrapidxml_1_1memory__pool\" kindref=\"compound\">memory_pool</a> of the document to allocate the string - on destruction of the document the string will be automatically freed. <br/><br/>\r\n Size of name must be specified separately, because name does not have to be zero terminated. Use <a href=\"#classrapidxml_1_1xml__base_e099c291e104a0d277307fe71f5e0f9e_1e099c291e104a0d277307fe71f5e0f9e\" kindref=\"member\">name(const Ch *)</a> function to have the length automatically calculated (string must be zero terminated). </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">name</dt><dd class=\"parameter-def\">Name of node to set. Does not have to be zero terminated. </dd></dl><dl><dt class=\"parameter-name\">size</dt><dd class=\"parameter-def\">Size of name, in characters. This does not include zero terminator, if one is present. </dd></dl><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__base_e099c291e104a0d277307fe71f5e0f9e_1e099c291e104a0d277307fe71f5e0f9e\">function xml_base::name</h3><h4>Synopsis</h4><code class=\"synopsis\">void name(const Ch *name);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Sets name of node to a zero-terminated string. See also <a href=\"#namespacerapidxml_1ownership_of_strings\" kindref=\"member\">Ownership Of Strings</a>  and <a href=\"#classrapidxml_1_1xml__base_4e7e23d06d48126c65b1f6266acfba5c_14e7e23d06d48126c65b1f6266acfba5c\" kindref=\"member\">xml_node::name(const Ch *, std::size_t)</a>. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">name</dt><dd class=\"parameter-def\">Name of node to set. Must be zero terminated. </dd></dl><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__base_d9640aa3f5374673cb72a5289b6c91eb_1d9640aa3f5374673cb72a5289b6c91eb\">function xml_base::value</h3><h4>Synopsis</h4><code class=\"synopsis\">void value(const Ch *value, std::size_t size);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Sets value of node to a non zero-terminated string. See <a href=\"#namespacerapidxml_1ownership_of_strings\" kindref=\"member\">Ownership Of Strings</a> . <br/><br/>\r\n Note that node does not own its name or value, it only stores a pointer to it. It will not delete or otherwise free the pointer on destruction. It is reponsibility of the user to properly manage lifetime of the string. The easiest way to achieve it is to use <a href=\"#classrapidxml_1_1memory__pool\" kindref=\"compound\">memory_pool</a> of the document to allocate the string - on destruction of the document the string will be automatically freed. <br/><br/>\r\n Size of value must be specified separately, because it does not have to be zero terminated. Use <a href=\"#classrapidxml_1_1xml__base_18c7469acdca771de9b4f3054053029c_118c7469acdca771de9b4f3054053029c\" kindref=\"member\">value(const Ch *)</a> function to have the length automatically calculated (string must be zero terminated). <br/><br/>\r\n If an element has a child node of type node_data, it will take precedence over element value when printing. If you want to manipulate data of elements using values, use parser flag <a href=\"#namespacerapidxml_87e8bbab53702cf3b438bd553c10b6b9_187e8bbab53702cf3b438bd553c10b6b9\" kindref=\"member\">rapidxml::parse_no_data_nodes</a> to prevent creation of data nodes by the parser. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">value</dt><dd class=\"parameter-def\">value of node to set. Does not have to be zero terminated. </dd></dl><dl><dt class=\"parameter-name\">size</dt><dd class=\"parameter-def\">Size of value, in characters. This does not include zero terminator, if one is present. </dd></dl><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__base_18c7469acdca771de9b4f3054053029c_118c7469acdca771de9b4f3054053029c\">function xml_base::value</h3><h4>Synopsis</h4><code class=\"synopsis\">void value(const Ch *value);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Sets value of node to a zero-terminated string. See also <a href=\"#namespacerapidxml_1ownership_of_strings\" kindref=\"member\">Ownership Of Strings</a>  and <a href=\"#classrapidxml_1_1xml__base_d9640aa3f5374673cb72a5289b6c91eb_1d9640aa3f5374673cb72a5289b6c91eb\" kindref=\"member\">xml_node::value(const Ch *, std::size_t)</a>. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">value</dt><dd class=\"parameter-def\">Vame of node to set. Must be zero terminated. </dd></dl><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__base_798e8df7ea53ade4d9f0701017dce80e_1798e8df7ea53ade4d9f0701017dce80e\">function xml_base::parent</h3><h4>Synopsis</h4><code class=\"synopsis\">xml_node&lt;Ch&gt;* parent() const;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Gets node parent. </para><h4>Returns</h4>Pointer to parent node, or 0 if there is no parent. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__document\">class\r\n\t\t\t\t\t\t\t\t\t  template\r\n\t\t\t\t\t\t\t\t   rapidxml::xml_document</h3>\r\n\r\n\t\t\t\t\t\t\t  Defined in <a href=\"rapidxml.hpp\">rapidxml.hpp</a><br/>\r\n\t\t\t\t\t\t\t\t  Inherits from\r\n\t\t\t\t\t\t\t\t  <a href=\"#classrapidxml_1_1xml__node\">xml_node</a> <a href=\"#classrapidxml_1_1memory__pool\">memory_pool</a> <br/><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">This class represents root of the DOM hierarchy. It is also an <a href=\"#classrapidxml_1_1xml__node\" kindref=\"compound\">xml_node</a> and a <a href=\"#classrapidxml_1_1memory__pool\" kindref=\"compound\">memory_pool</a> through public inheritance. Use <a href=\"#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\" kindref=\"member\">parse()</a> function to build a DOM tree from a zero-terminated XML text string. <a href=\"#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\" kindref=\"member\">parse()</a> function allocates memory for nodes and attributes by using functions of <a href=\"#classrapidxml_1_1xml__document\" kindref=\"compound\">xml_document</a>, which are inherited from <a href=\"#classrapidxml_1_1memory__pool\" kindref=\"compound\">memory_pool</a>. To access root node of the document, use the document itself, as if it was an <a href=\"#classrapidxml_1_1xml__node\" kindref=\"compound\">xml_node</a>. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">Ch</dt><dd>Character type to use. </dd></dl><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__document_6ce266cc52d549c42abe3a3d5e8af9ba_16ce266cc52d549c42abe3a3d5e8af9ba\">\r\n\t\t\t\tconstructor\r\n\t\t\t xml_document::xml_document</h3><h4>Synopsis</h4><code class=\"synopsis\">xml_document();\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Constructs empty XML document. </para><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\">function xml_document::parse</h3><h4>Synopsis</h4><code class=\"synopsis\">void parse(Ch *text);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Parses zero-terminated XML string according to given flags. Passed string will be modified by the parser, unless <a href=\"#namespacerapidxml_a97ba1a0a79a6d66f4eef3612508d943_1a97ba1a0a79a6d66f4eef3612508d943\" kindref=\"member\">rapidxml::parse_non_destructive</a> flag is used. The string must persist for the lifetime of the document. In case of error, <a href=\"#classrapidxml_1_1parse__error\" kindref=\"compound\">rapidxml::parse_error</a> exception will be thrown. <br/><br/>\r\n If you want to parse contents of a file, you must first load the file into the memory, and pass pointer to its beginning. Make sure that data is zero-terminated. <br/><br/>\r\n Document can be parsed into multiple times. Each new call to parse removes previous nodes and attributes (if any), but does not clear memory pool. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">text</dt><dd class=\"parameter-def\">XML data to parse; pointer is non-const to denote fact that this data may be modified by the parser. </dd></dl><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__document_c8bb3912a3ce86b15842e79d0b421204_1c8bb3912a3ce86b15842e79d0b421204\">function xml_document::clear</h3><h4>Synopsis</h4><code class=\"synopsis\">void clear();\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Clears the document by deleting all nodes and clearing the memory pool. All nodes owned by document pool are destroyed. </para><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node\">class\r\n\t\t\t\t\t\t\t\t\t  template\r\n\t\t\t\t\t\t\t\t   rapidxml::xml_node</h3>\r\n\r\n\t\t\t\t\t\t\t  Defined in <a href=\"rapidxml.hpp\">rapidxml.hpp</a><br/>\r\n\t\t\t\t\t\t\t\t  Inherits from\r\n\t\t\t\t\t\t\t\t  <a href=\"#classrapidxml_1_1xml__base\">xml_base</a> <br/>\r\n\t\t\t\t\t\t\t\t  Base class for\r\n\t\t\t\t\t\t\t\t  <a href=\"#classrapidxml_1_1xml__document\">xml_document</a> <h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Class representing a node of XML document. Each node may have associated name and value strings, which are available through <a href=\"#classrapidxml_1_1xml__base_622eade29fdf7806d3ef93ac4d90e707_1622eade29fdf7806d3ef93ac4d90e707\" kindref=\"member\">name()</a> and <a href=\"#classrapidxml_1_1xml__base_c54fa4987fb503916a7b541eb15c9c7f_1c54fa4987fb503916a7b541eb15c9c7f\" kindref=\"member\">value()</a> functions. Interpretation of name and value depends on type of the node. Type of node can be determined by using <a href=\"#classrapidxml_1_1xml__node_975e86937621ae4afe6a423219de30d0_1975e86937621ae4afe6a423219de30d0\" kindref=\"member\">type()</a> function. <br/><br/>\r\n Note that after parse, both name and value of node, if any, will point interior of source text used for parsing. Thus, this text must persist in the memory for the lifetime of node. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">Ch</dt><dd>Character type to use. </dd></dl><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_34c55af3504549a475e5b9dfcaa6adf5_134c55af3504549a475e5b9dfcaa6adf5\">\r\n\t\t\t\tconstructor\r\n\t\t\t xml_node::xml_node</h3><h4>Synopsis</h4><code class=\"synopsis\">xml_node(node_type type);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Constructs an empty node with the specified type. Consider using <a href=\"#classrapidxml_1_1memory__pool\" kindref=\"compound\">memory_pool</a> of appropriate document to allocate nodes manually. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">type</dt><dd class=\"parameter-def\">Type of node to construct. </dd></dl><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_975e86937621ae4afe6a423219de30d0_1975e86937621ae4afe6a423219de30d0\">function xml_node::type</h3><h4>Synopsis</h4><code class=\"synopsis\">node_type type() const;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Gets type of node. </para><h4>Returns</h4>Type of node. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_77aea7d8d996ba4f6bd61cc478a4e72d_177aea7d8d996ba4f6bd61cc478a4e72d\">function xml_node::document</h3><h4>Synopsis</h4><code class=\"synopsis\">xml_document&lt;Ch&gt;* document() const;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Gets document of which node is a child. </para><h4>Returns</h4>Pointer to document that contains this node, or 0 if there is no parent document. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_7823e36687669e59c2afdf66334ef35a_17823e36687669e59c2afdf66334ef35a\">function xml_node::first_node</h3><h4>Synopsis</h4><code class=\"synopsis\">xml_node&lt;Ch&gt;* first_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Gets first child node, optionally matching node name. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">name</dt><dd class=\"parameter-def\">Name of child to find, or 0 to return first child regardless of its name; this string doesn&apos;t have to be zero-terminated if name_size is non-zero </dd></dl><dl><dt class=\"parameter-name\">name_size</dt><dd class=\"parameter-def\">Size of name, in characters, or 0 to have size calculated automatically from string </dd></dl><dl><dt class=\"parameter-name\">case_sensitive</dt><dd class=\"parameter-def\">Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters </dd></dl><h4>Returns</h4>Pointer to found child, or 0 if not found. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_fcb6e2209b591a36d2dadba20d2bc7cc_1fcb6e2209b591a36d2dadba20d2bc7cc\">function xml_node::last_node</h3><h4>Synopsis</h4><code class=\"synopsis\">xml_node&lt;Ch&gt;* last_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Gets last child node, optionally matching node name. Behaviour is undefined if node has no children. Use <a href=\"#classrapidxml_1_1xml__node_7823e36687669e59c2afdf66334ef35a_17823e36687669e59c2afdf66334ef35a\" kindref=\"member\">first_node()</a> to test if node has children. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">name</dt><dd class=\"parameter-def\">Name of child to find, or 0 to return last child regardless of its name; this string doesn&apos;t have to be zero-terminated if name_size is non-zero </dd></dl><dl><dt class=\"parameter-name\">name_size</dt><dd class=\"parameter-def\">Size of name, in characters, or 0 to have size calculated automatically from string </dd></dl><dl><dt class=\"parameter-name\">case_sensitive</dt><dd class=\"parameter-def\">Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters </dd></dl><h4>Returns</h4>Pointer to found child, or 0 if not found. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_ac2f6886c0107e9d5f156e9542546df6_1ac2f6886c0107e9d5f156e9542546df6\">function xml_node::previous_sibling</h3><h4>Synopsis</h4><code class=\"synopsis\">xml_node&lt;Ch&gt;* previous_sibling(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Gets previous sibling node, optionally matching node name. Behaviour is undefined if node has no parent. Use <a href=\"#classrapidxml_1_1xml__base_798e8df7ea53ade4d9f0701017dce80e_1798e8df7ea53ade4d9f0701017dce80e\" kindref=\"member\">parent()</a> to test if node has a parent. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">name</dt><dd class=\"parameter-def\">Name of sibling to find, or 0 to return previous sibling regardless of its name; this string doesn&apos;t have to be zero-terminated if name_size is non-zero </dd></dl><dl><dt class=\"parameter-name\">name_size</dt><dd class=\"parameter-def\">Size of name, in characters, or 0 to have size calculated automatically from string </dd></dl><dl><dt class=\"parameter-name\">case_sensitive</dt><dd class=\"parameter-def\">Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters </dd></dl><h4>Returns</h4>Pointer to found sibling, or 0 if not found. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_b3ead2cefecc03a813836203e3f6f38f_1b3ead2cefecc03a813836203e3f6f38f\">function xml_node::next_sibling</h3><h4>Synopsis</h4><code class=\"synopsis\">xml_node&lt;Ch&gt;* next_sibling(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Gets next sibling node, optionally matching node name. Behaviour is undefined if node has no parent. Use <a href=\"#classrapidxml_1_1xml__base_798e8df7ea53ade4d9f0701017dce80e_1798e8df7ea53ade4d9f0701017dce80e\" kindref=\"member\">parent()</a> to test if node has a parent. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">name</dt><dd class=\"parameter-def\">Name of sibling to find, or 0 to return next sibling regardless of its name; this string doesn&apos;t have to be zero-terminated if name_size is non-zero </dd></dl><dl><dt class=\"parameter-name\">name_size</dt><dd class=\"parameter-def\">Size of name, in characters, or 0 to have size calculated automatically from string </dd></dl><dl><dt class=\"parameter-name\">case_sensitive</dt><dd class=\"parameter-def\">Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters </dd></dl><h4>Returns</h4>Pointer to found sibling, or 0 if not found. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_5810a09f82f8d53efbe9456286dcec83_15810a09f82f8d53efbe9456286dcec83\">function xml_node::first_attribute</h3><h4>Synopsis</h4><code class=\"synopsis\">xml_attribute&lt;Ch&gt;* first_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Gets first attribute of node, optionally matching attribute name. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">name</dt><dd class=\"parameter-def\">Name of attribute to find, or 0 to return first attribute regardless of its name; this string doesn&apos;t have to be zero-terminated if name_size is non-zero </dd></dl><dl><dt class=\"parameter-name\">name_size</dt><dd class=\"parameter-def\">Size of name, in characters, or 0 to have size calculated automatically from string </dd></dl><dl><dt class=\"parameter-name\">case_sensitive</dt><dd class=\"parameter-def\">Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters </dd></dl><h4>Returns</h4>Pointer to found attribute, or 0 if not found. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_16953d66751b5b949ee4ee2d9c0bc63a_116953d66751b5b949ee4ee2d9c0bc63a\">function xml_node::last_attribute</h3><h4>Synopsis</h4><code class=\"synopsis\">xml_attribute&lt;Ch&gt;* last_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Gets last attribute of node, optionally matching attribute name. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">name</dt><dd class=\"parameter-def\">Name of attribute to find, or 0 to return last attribute regardless of its name; this string doesn&apos;t have to be zero-terminated if name_size is non-zero </dd></dl><dl><dt class=\"parameter-name\">name_size</dt><dd class=\"parameter-def\">Size of name, in characters, or 0 to have size calculated automatically from string </dd></dl><dl><dt class=\"parameter-name\">case_sensitive</dt><dd class=\"parameter-def\">Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters </dd></dl><h4>Returns</h4>Pointer to found attribute, or 0 if not found. <p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_a78759bfa429fa2ab6bc5fe617cfa3cf_1a78759bfa429fa2ab6bc5fe617cfa3cf\">function xml_node::type</h3><h4>Synopsis</h4><code class=\"synopsis\">void type(node_type type);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Sets type of node. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">type</dt><dd class=\"parameter-def\">Type of node to set. </dd></dl><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_0c39df6617e709eb2fba11300dea63f2_10c39df6617e709eb2fba11300dea63f2\">function xml_node::prepend_node</h3><h4>Synopsis</h4><code class=\"synopsis\">void prepend_node(xml_node&lt; Ch &gt; *child);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Prepends a new child node. The prepended child becomes the first child, and all existing children are moved one position back. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">child</dt><dd class=\"parameter-def\">Node to prepend. </dd></dl><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_86de2e22276826089b7baed2599f8dee_186de2e22276826089b7baed2599f8dee\">function xml_node::append_node</h3><h4>Synopsis</h4><code class=\"synopsis\">void append_node(xml_node&lt; Ch &gt; *child);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Appends a new child node. The appended child becomes the last child. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">child</dt><dd class=\"parameter-def\">Node to append. </dd></dl><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_780972a57fc447250ab47cc8f421b65e_1780972a57fc447250ab47cc8f421b65e\">function xml_node::insert_node</h3><h4>Synopsis</h4><code class=\"synopsis\">void insert_node(xml_node&lt; Ch &gt; *where, xml_node&lt; Ch &gt; *child);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Inserts a new child node at specified place inside the node. All children after and including the specified node are moved one position back. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">where</dt><dd class=\"parameter-def\">Place where to insert the child, or 0 to insert at the back. </dd></dl><dl><dt class=\"parameter-name\">child</dt><dd class=\"parameter-def\">Node to insert. </dd></dl><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_9a31d861e1bddc710839c551a5d2b3a4_19a31d861e1bddc710839c551a5d2b3a4\">function xml_node::remove_first_node</h3><h4>Synopsis</h4><code class=\"synopsis\">void remove_first_node();\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Removes first child node. If node has no children, behaviour is undefined. Use <a href=\"#classrapidxml_1_1xml__node_7823e36687669e59c2afdf66334ef35a_17823e36687669e59c2afdf66334ef35a\" kindref=\"member\">first_node()</a> to test if node has children. </para><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_87addf2bc127ee31aa4b5295d3c9b530_187addf2bc127ee31aa4b5295d3c9b530\">function xml_node::remove_last_node</h3><h4>Synopsis</h4><code class=\"synopsis\">void remove_last_node();\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Removes last child of the node. If node has no children, behaviour is undefined. Use <a href=\"#classrapidxml_1_1xml__node_7823e36687669e59c2afdf66334ef35a_17823e36687669e59c2afdf66334ef35a\" kindref=\"member\">first_node()</a> to test if node has children. </para><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_9316463a2201631e7e2062b17729f9cd_19316463a2201631e7e2062b17729f9cd\">function xml_node::remove_node</h3><h4>Synopsis</h4><code class=\"synopsis\">void remove_node(xml_node&lt; Ch &gt; *where);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Removes specified child from the node. </para><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_0218147d13e41d5fa60ced4e7a7e9726_10218147d13e41d5fa60ced4e7a7e9726\">function xml_node::remove_all_nodes</h3><h4>Synopsis</h4><code class=\"synopsis\">void remove_all_nodes();\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Removes all child nodes (but not attributes). </para><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_f6dffa513da74cc0be71a7ba84f8265e_1f6dffa513da74cc0be71a7ba84f8265e\">function xml_node::prepend_attribute</h3><h4>Synopsis</h4><code class=\"synopsis\">void prepend_attribute(xml_attribute&lt; Ch &gt; *attribute);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Prepends a new attribute to the node. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">attribute</dt><dd class=\"parameter-def\">Attribute to prepend. </dd></dl><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_8fbd4f5ef7169d493da9f8d87ac04b77_18fbd4f5ef7169d493da9f8d87ac04b77\">function xml_node::append_attribute</h3><h4>Synopsis</h4><code class=\"synopsis\">void append_attribute(xml_attribute&lt; Ch &gt; *attribute);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Appends a new attribute to the node. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">attribute</dt><dd class=\"parameter-def\">Attribute to append. </dd></dl><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_070d5888b0557fe06a5b24961de1b988_1070d5888b0557fe06a5b24961de1b988\">function xml_node::insert_attribute</h3><h4>Synopsis</h4><code class=\"synopsis\">void insert_attribute(xml_attribute&lt; Ch &gt; *where, xml_attribute&lt; Ch &gt; *attribute);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Inserts a new attribute at specified place inside the node. All attributes after and including the specified attribute are moved one position back. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">where</dt><dd class=\"parameter-def\">Place where to insert the attribute, or 0 to insert at the back. </dd></dl><dl><dt class=\"parameter-name\">attribute</dt><dd class=\"parameter-def\">Attribute to insert. </dd></dl><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_4eea4a7f6cb484ca9944f7eafe6e1843_14eea4a7f6cb484ca9944f7eafe6e1843\">function xml_node::remove_first_attribute</h3><h4>Synopsis</h4><code class=\"synopsis\">void remove_first_attribute();\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Removes first attribute of the node. If node has no attributes, behaviour is undefined. Use <a href=\"#classrapidxml_1_1xml__node_5810a09f82f8d53efbe9456286dcec83_15810a09f82f8d53efbe9456286dcec83\" kindref=\"member\">first_attribute()</a> to test if node has attributes. </para><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_37d87c4d5d89fa0cf05b72ee8d4cba3b_137d87c4d5d89fa0cf05b72ee8d4cba3b\">function xml_node::remove_last_attribute</h3><h4>Synopsis</h4><code class=\"synopsis\">void remove_last_attribute();\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Removes last attribute of the node. If node has no attributes, behaviour is undefined. Use <a href=\"#classrapidxml_1_1xml__node_5810a09f82f8d53efbe9456286dcec83_15810a09f82f8d53efbe9456286dcec83\" kindref=\"member\">first_attribute()</a> to test if node has attributes. </para><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_c75154db2e768c0e5b541fc8cd0775ab_1c75154db2e768c0e5b541fc8cd0775ab\">function xml_node::remove_attribute</h3><h4>Synopsis</h4><code class=\"synopsis\">void remove_attribute(xml_attribute&lt; Ch &gt; *where);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Removes specified attribute from node. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">where</dt><dd class=\"parameter-def\">Pointer to attribute to be removed. </dd></dl><p/><h3 class=\"reference-header\" id=\"classrapidxml_1_1xml__node_59e6ad4cfd5e8096c052e71d79561eda_159e6ad4cfd5e8096c052e71d79561eda\">function xml_node::remove_all_attributes</h3><h4>Synopsis</h4><code class=\"synopsis\">void remove_all_attributes();\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Removes all attributes of node. </para><p/><h3 class=\"reference-header\" id=\"namespacerapidxml_6a276b85e2da28c5f9c3dbce61c55682_16a276b85e2da28c5f9c3dbce61c55682\">enum node_type</h3><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Enumeration listing all node types produced by the parser. Use <a href=\"#classrapidxml_1_1xml__node_975e86937621ae4afe6a423219de30d0_1975e86937621ae4afe6a423219de30d0\" kindref=\"member\">xml_node::type()</a> function to query node type. </para><h4>Values</h4><dl><dt class=\"parameter-name\">node_document</dt><dd class=\"parameter-def\">A document node. Name and value are empty. </dd></dl><dl><dt class=\"parameter-name\">node_element</dt><dd class=\"parameter-def\">An element node. Name contains element name. Value contains text of first data node. </dd></dl><dl><dt class=\"parameter-name\">node_data</dt><dd class=\"parameter-def\">A data node. Name is empty. Value contains data text. </dd></dl><dl><dt class=\"parameter-name\">node_cdata</dt><dd class=\"parameter-def\">A CDATA node. Name is empty. Value contains data text. </dd></dl><dl><dt class=\"parameter-name\">node_comment</dt><dd class=\"parameter-def\">A comment node. Name is empty. Value contains comment text. </dd></dl><dl><dt class=\"parameter-name\">node_declaration</dt><dd class=\"parameter-def\">A declaration node. Name and value are empty. Declaration parameters (version, encoding and standalone) are in node attributes. </dd></dl><dl><dt class=\"parameter-name\">node_doctype</dt><dd class=\"parameter-def\">A DOCTYPE node. Name is empty. Value contains DOCTYPE text. </dd></dl><dl><dt class=\"parameter-name\">node_pi</dt><dd class=\"parameter-def\">A PI node. Name contains target. Value contains instructions. </dd></dl><p/><h3 class=\"reference-header\" id=\"namespacerapidxml_ff5d67f74437199d316d2b2660653ae1_1ff5d67f74437199d316d2b2660653ae1\">function parse_error_handler</h3><h4>Synopsis</h4><code class=\"synopsis\">void rapidxml::parse_error_handler(const char *what, void *where);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">When exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function is called to notify user about the error. It must be defined by the user. <br/><br/>\r\n This function cannot return. If it does, the results are undefined. <br/><br/>\r\n A very simple definition might look like that: <preformatted>\r\n        void rapidxml::parse_error_handler(const char *what, void *where)\r\n        {\r\n            std::cout &lt;&lt; &quot;Parse error: &quot; &lt;&lt; what &lt;&lt; &quot;\\n&quot;;\r\n            std::abort();\r\n        }\r\n        </preformatted></para><h4>Parameters</h4><dl><dt class=\"parameter-name\">what</dt><dd class=\"parameter-def\">Human readable description of the error. </dd></dl><dl><dt class=\"parameter-name\">where</dt><dd class=\"parameter-def\">Pointer to character data where error was detected. </dd></dl><p/><h3 class=\"reference-header\" id=\"namespacerapidxml_b94d570fc4c4ab2423813cd0243326b1_1b94d570fc4c4ab2423813cd0243326b1\">function print</h3><h4>Synopsis</h4><code class=\"synopsis\">OutIt rapidxml::print(OutIt out, const xml_node&lt; Ch &gt; &amp;node, int flags=0);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Prints XML to given output iterator. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">out</dt><dd class=\"parameter-def\">Output iterator to print to. </dd></dl><dl><dt class=\"parameter-name\">node</dt><dd class=\"parameter-def\">Node to be printed. Pass xml_document to print entire document. </dd></dl><dl><dt class=\"parameter-name\">flags</dt><dd class=\"parameter-def\">Flags controlling how XML is printed. </dd></dl><h4>Returns</h4>Output iterator pointing to position immediately after last character of printed text. <p/><h3 class=\"reference-header\" id=\"namespacerapidxml_13bc37d6d1047acb0efdbc1689221a5e_113bc37d6d1047acb0efdbc1689221a5e\">function print</h3><h4>Synopsis</h4><code class=\"synopsis\">std::basic_ostream&lt;Ch&gt;&amp; rapidxml::print(std::basic_ostream&lt; Ch &gt; &amp;out, const xml_node&lt; Ch &gt; &amp;node, int flags=0);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Prints XML to given output stream. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">out</dt><dd class=\"parameter-def\">Output stream to print to. </dd></dl><dl><dt class=\"parameter-name\">node</dt><dd class=\"parameter-def\">Node to be printed. Pass xml_document to print entire document. </dd></dl><dl><dt class=\"parameter-name\">flags</dt><dd class=\"parameter-def\">Flags controlling how XML is printed. </dd></dl><h4>Returns</h4>Output stream. <p/><h3 class=\"reference-header\" id=\"namespacerapidxml_5619b38000d967fb223b2b0a8c17463a_15619b38000d967fb223b2b0a8c17463a\">function operator&lt;&lt;</h3><h4>Synopsis</h4><code class=\"synopsis\">std::basic_ostream&lt;Ch&gt;&amp; rapidxml::operator&lt;&lt;(std::basic_ostream&lt; Ch &gt; &amp;out, const xml_node&lt; Ch &gt; &amp;node);\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Prints formatted XML to given output stream. Uses default printing flags. Use <a href=\"#namespacerapidxml_b94d570fc4c4ab2423813cd0243326b1_1b94d570fc4c4ab2423813cd0243326b1\" kindref=\"member\">print()</a> function to customize printing process. </para><h4>Parameters</h4><dl><dt class=\"parameter-name\">out</dt><dd class=\"parameter-def\">Output stream to print to. </dd></dl><dl><dt class=\"parameter-name\">node</dt><dd class=\"parameter-def\">Node to be printed. </dd></dl><h4>Returns</h4>Output stream. <p/><h3 class=\"reference-header\" id=\"namespacerapidxml_87e8bbab53702cf3b438bd553c10b6b9_187e8bbab53702cf3b438bd553c10b6b9\">\r\n\t\t\t\tconstant\r\n\t\t\t parse_no_data_nodes</h3><h4>Synopsis</h4><code class=\"synopsis\">const int parse_no_data_nodes\r\n\t\t\t\t\t\t\t\t\t\t\t  = 0x1;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Parse flag instructing the parser to not create data nodes. Text of first data node will still be placed in value of parent element, unless <a href=\"#namespacerapidxml_97e2c4fdc04fae17126f9971a4fc993e_197e2c4fdc04fae17126f9971a4fc993e\" kindref=\"member\">rapidxml::parse_no_element_values</a> flag is also specified. Can be combined with other flags by use of | operator. <br/><br/>\r\n See <a href=\"#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\" kindref=\"member\">xml_document::parse()</a> function. </para><p/><h3 class=\"reference-header\" id=\"namespacerapidxml_97e2c4fdc04fae17126f9971a4fc993e_197e2c4fdc04fae17126f9971a4fc993e\">\r\n\t\t\t\tconstant\r\n\t\t\t parse_no_element_values</h3><h4>Synopsis</h4><code class=\"synopsis\">const int parse_no_element_values\r\n\t\t\t\t\t\t\t\t\t\t\t  = 0x2;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Parse flag instructing the parser to not use text of first data node as a value of parent element. Can be combined with other flags by use of | operator. Note that child data nodes of element node take precendence over its value when printing. That is, if element has one or more child data nodes <i>and</i> a value, the value will be ignored. Use <a href=\"#namespacerapidxml_87e8bbab53702cf3b438bd553c10b6b9_187e8bbab53702cf3b438bd553c10b6b9\" kindref=\"member\">rapidxml::parse_no_data_nodes</a> flag to prevent creation of data nodes if you want to manipulate data using values of elements. <br/><br/>\r\n See <a href=\"#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\" kindref=\"member\">xml_document::parse()</a> function. </para><p/><h3 class=\"reference-header\" id=\"namespacerapidxml_9cae3801e70437cbc410c24bf6be691c_19cae3801e70437cbc410c24bf6be691c\">\r\n\t\t\t\tconstant\r\n\t\t\t parse_no_string_terminators</h3><h4>Synopsis</h4><code class=\"synopsis\">const int parse_no_string_terminators\r\n\t\t\t\t\t\t\t\t\t\t\t  = 0x4;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Parse flag instructing the parser to not place zero terminators after strings in the source text. By default zero terminators are placed, modifying source text. Can be combined with other flags by use of | operator. <br/><br/>\r\n See <a href=\"#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\" kindref=\"member\">xml_document::parse()</a> function. </para><p/><h3 class=\"reference-header\" id=\"namespacerapidxml_7223b7815c4fb8b42e6e4e77e1ea6b97_17223b7815c4fb8b42e6e4e77e1ea6b97\">\r\n\t\t\t\tconstant\r\n\t\t\t parse_no_entity_translation</h3><h4>Synopsis</h4><code class=\"synopsis\">const int parse_no_entity_translation\r\n\t\t\t\t\t\t\t\t\t\t\t  = 0x8;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Parse flag instructing the parser to not translate entities in the source text. By default entities are translated, modifying source text. Can be combined with other flags by use of | operator. <br/><br/>\r\n See <a href=\"#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\" kindref=\"member\">xml_document::parse()</a> function. </para><p/><h3 class=\"reference-header\" id=\"namespacerapidxml_ccde57f6054857ee4042a1b4d98c83b9_1ccde57f6054857ee4042a1b4d98c83b9\">\r\n\t\t\t\tconstant\r\n\t\t\t parse_no_utf8</h3><h4>Synopsis</h4><code class=\"synopsis\">const int parse_no_utf8\r\n\t\t\t\t\t\t\t\t\t\t\t  = 0x10;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Parse flag instructing the parser to disable UTF-8 handling and assume plain 8 bit characters. By default, UTF-8 handling is enabled. Can be combined with other flags by use of | operator. <br/><br/>\r\n See <a href=\"#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\" kindref=\"member\">xml_document::parse()</a> function. </para><p/><h3 class=\"reference-header\" id=\"namespacerapidxml_52e2c934ad9c845a5f4cc49570470556_152e2c934ad9c845a5f4cc49570470556\">\r\n\t\t\t\tconstant\r\n\t\t\t parse_declaration_node</h3><h4>Synopsis</h4><code class=\"synopsis\">const int parse_declaration_node\r\n\t\t\t\t\t\t\t\t\t\t\t  = 0x20;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Parse flag instructing the parser to create XML declaration node. By default, declaration node is not created. Can be combined with other flags by use of | operator. <br/><br/>\r\n See <a href=\"#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\" kindref=\"member\">xml_document::parse()</a> function. </para><p/><h3 class=\"reference-header\" id=\"namespacerapidxml_0f7479dacbc868456d07897a8c072784_10f7479dacbc868456d07897a8c072784\">\r\n\t\t\t\tconstant\r\n\t\t\t parse_comment_nodes</h3><h4>Synopsis</h4><code class=\"synopsis\">const int parse_comment_nodes\r\n\t\t\t\t\t\t\t\t\t\t\t  = 0x40;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Parse flag instructing the parser to create comments nodes. By default, comment nodes are not created. Can be combined with other flags by use of | operator. <br/><br/>\r\n See <a href=\"#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\" kindref=\"member\">xml_document::parse()</a> function. </para><p/><h3 class=\"reference-header\" id=\"namespacerapidxml_8e187746ba1ca04f107951ad32df962e_18e187746ba1ca04f107951ad32df962e\">\r\n\t\t\t\tconstant\r\n\t\t\t parse_doctype_node</h3><h4>Synopsis</h4><code class=\"synopsis\">const int parse_doctype_node\r\n\t\t\t\t\t\t\t\t\t\t\t  = 0x80;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Parse flag instructing the parser to create DOCTYPE node. By default, doctype node is not created. Although W3C specification allows at most one DOCTYPE node, RapidXml will silently accept documents with more than one. Can be combined with other flags by use of | operator. <br/><br/>\r\n See <a href=\"#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\" kindref=\"member\">xml_document::parse()</a> function. </para><p/><h3 class=\"reference-header\" id=\"namespacerapidxml_1c20b2b2b75711cd76423e119c49f830_11c20b2b2b75711cd76423e119c49f830\">\r\n\t\t\t\tconstant\r\n\t\t\t parse_pi_nodes</h3><h4>Synopsis</h4><code class=\"synopsis\">const int parse_pi_nodes\r\n\t\t\t\t\t\t\t\t\t\t\t  = 0x100;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Parse flag instructing the parser to create PI nodes. By default, PI nodes are not created. Can be combined with other flags by use of | operator. <br/><br/>\r\n See <a href=\"#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\" kindref=\"member\">xml_document::parse()</a> function. </para><p/><h3 class=\"reference-header\" id=\"namespacerapidxml_a5daff9d61c7d4eaf98e4d42efe628ee_1a5daff9d61c7d4eaf98e4d42efe628ee\">\r\n\t\t\t\tconstant\r\n\t\t\t parse_validate_closing_tags</h3><h4>Synopsis</h4><code class=\"synopsis\">const int parse_validate_closing_tags\r\n\t\t\t\t\t\t\t\t\t\t\t  = 0x200;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Parse flag instructing the parser to validate closing tag names. If not set, name inside closing tag is irrelevant to the parser. By default, closing tags are not validated. Can be combined with other flags by use of | operator. <br/><br/>\r\n See <a href=\"#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\" kindref=\"member\">xml_document::parse()</a> function. </para><p/><h3 class=\"reference-header\" id=\"namespacerapidxml_ac1f06b1afd47b812732fb521b146fd9_1ac1f06b1afd47b812732fb521b146fd9\">\r\n\t\t\t\tconstant\r\n\t\t\t parse_trim_whitespace</h3><h4>Synopsis</h4><code class=\"synopsis\">const int parse_trim_whitespace\r\n\t\t\t\t\t\t\t\t\t\t\t  = 0x400;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Parse flag instructing the parser to trim all leading and trailing whitespace of data nodes. By default, whitespace is not trimmed. This flag does not cause the parser to modify source text. Can be combined with other flags by use of | operator. <br/><br/>\r\n See <a href=\"#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\" kindref=\"member\">xml_document::parse()</a> function. </para><p/><h3 class=\"reference-header\" id=\"namespacerapidxml_88f95d4e275ba01408fefde83078651b_188f95d4e275ba01408fefde83078651b\">\r\n\t\t\t\tconstant\r\n\t\t\t parse_normalize_whitespace</h3><h4>Synopsis</h4><code class=\"synopsis\">const int parse_normalize_whitespace\r\n\t\t\t\t\t\t\t\t\t\t\t  = 0x800;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Parse flag instructing the parser to condense all whitespace runs of data nodes to a single space character. Trimming of leading and trailing whitespace of data is controlled by <a href=\"#namespacerapidxml_ac1f06b1afd47b812732fb521b146fd9_1ac1f06b1afd47b812732fb521b146fd9\" kindref=\"member\">rapidxml::parse_trim_whitespace</a> flag. By default, whitespace is not normalized. If this flag is specified, source text will be modified. Can be combined with other flags by use of | operator. <br/><br/>\r\n See <a href=\"#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\" kindref=\"member\">xml_document::parse()</a> function. </para><p/><h3 class=\"reference-header\" id=\"namespacerapidxml_45751cf2f38fd6915f35b3122b46d5b6_145751cf2f38fd6915f35b3122b46d5b6\">\r\n\t\t\t\tconstant\r\n\t\t\t parse_default</h3><h4>Synopsis</h4><code class=\"synopsis\">const int parse_default\r\n\t\t\t\t\t\t\t\t\t\t\t  = 0;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Parse flags which represent default behaviour of the parser. This is always equal to 0, so that all other flags can be simply ored together. Normally there is no need to inconveniently disable flags by anding with their negated (~) values. This also means that meaning of each flag is a <i>negation</i> of the default setting. For example, if flag name is <a href=\"#namespacerapidxml_ccde57f6054857ee4042a1b4d98c83b9_1ccde57f6054857ee4042a1b4d98c83b9\" kindref=\"member\">rapidxml::parse_no_utf8</a>, it means that utf-8 is <i>enabled</i> by default, and using the flag will disable it. <br/><br/>\r\n See <a href=\"#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\" kindref=\"member\">xml_document::parse()</a> function. </para><p/><h3 class=\"reference-header\" id=\"namespacerapidxml_a97ba1a0a79a6d66f4eef3612508d943_1a97ba1a0a79a6d66f4eef3612508d943\">\r\n\t\t\t\tconstant\r\n\t\t\t parse_non_destructive</h3><h4>Synopsis</h4><code class=\"synopsis\">const int parse_non_destructive\r\n\t\t\t\t\t\t\t\t\t\t\t  = parse_no_string_terminators | parse_no_entity_translation;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">A combination of parse flags that forbids any modifications of the source text. This also results in faster parsing. However, note that the following will occur: <ul><li><para>names and values of nodes will not be zero terminated, you have to use <a href=\"#classrapidxml_1_1xml__base_0dae694c8f7e4d89f1003e2f3a15a43c_10dae694c8f7e4d89f1003e2f3a15a43c\" kindref=\"member\">xml_base::name_size()</a> and <a href=\"#classrapidxml_1_1xml__base_aed5ae791b7164c1ee5e649198cbb3db_1aed5ae791b7164c1ee5e649198cbb3db\" kindref=\"member\">xml_base::value_size()</a> functions to determine where name and value ends </para></li><li><para>entities will not be translated </para></li><li><para>whitespace will not be normalized </para></li></ul>\r\nSee <a href=\"#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\" kindref=\"member\">xml_document::parse()</a> function. </para><p/><h3 class=\"reference-header\" id=\"namespacerapidxml_398c5476e76102f8bd76c10bb0abbe10_1398c5476e76102f8bd76c10bb0abbe10\">\r\n\t\t\t\tconstant\r\n\t\t\t parse_fastest</h3><h4>Synopsis</h4><code class=\"synopsis\">const int parse_fastest\r\n\t\t\t\t\t\t\t\t\t\t\t  = parse_non_destructive | parse_no_data_nodes;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">A combination of parse flags resulting in fastest possible parsing, without sacrificing important data. <br/><br/>\r\n See <a href=\"#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\" kindref=\"member\">xml_document::parse()</a> function. </para><p/><h3 class=\"reference-header\" id=\"namespacerapidxml_b4f2515265facb42291570307924bd57_1b4f2515265facb42291570307924bd57\">\r\n\t\t\t\tconstant\r\n\t\t\t parse_full</h3><h4>Synopsis</h4><code class=\"synopsis\">const int parse_full\r\n\t\t\t\t\t\t\t\t\t\t\t  = parse_declaration_node | parse_comment_nodes | parse_doctype_node | parse_pi_nodes | parse_validate_closing_tags;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">A combination of parse flags resulting in largest amount of data being extracted. This usually results in slowest parsing. <br/><br/>\r\n See <a href=\"#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c\" kindref=\"member\">xml_document::parse()</a> function. </para><p/><h3 class=\"reference-header\" id=\"namespacerapidxml_b08b8d4293c203b69ed6c5ae77ac1907_1b08b8d4293c203b69ed6c5ae77ac1907\">\r\n\t\t\t\tconstant\r\n\t\t\t print_no_indenting</h3><h4>Synopsis</h4><code class=\"synopsis\">const int print_no_indenting\r\n\t\t\t\t\t\t\t\t\t\t\t  = 0x1;\r\n\t\t\t\t\t\t\t\t\t  </code><h4>Description</h4><para xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Printer flag instructing the printer to suppress indenting of XML. See <a href=\"#namespacerapidxml_b94d570fc4c4ab2423813cd0243326b1_1b94d570fc4c4ab2423813cd0243326b1\" kindref=\"member\">print()</a> function. </para><p/></body></html>"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidxml/rapidxml.hpp",
    "content": "#ifndef CEREAL_RAPIDXML_HPP_INCLUDED\n#define CEREAL_RAPIDXML_HPP_INCLUDED\n\n// Copyright (C) 2006, 2009 Marcin Kalicinski\n// Version 1.13\n// Revision $DateTime: 2009/05/13 01:46:17 $\n\n// If standard library is disabled, user must provide implementations of required functions and typedefs\n#if !defined(CEREAL_RAPIDXML_NO_STDLIB)\n    #include <cstdlib>      // For std::size_t\n    #include <cassert>      // For assert\n    #include <new>          // For placement new\n#endif\n\n// On MSVC, disable \"conditional expression is constant\" warning (level 4).\n// This warning is almost impossible to avoid with certain types of templated code\n#ifdef _MSC_VER\n    #pragma warning(push)\n    #pragma warning(disable:4127)   // Conditional expression is constant\n    #pragma warning(disable:4100)   // unreferenced formal parameter\n#endif\n\n///////////////////////////////////////////////////////////////////////////\n// CEREAL_RAPIDXML_PARSE_ERROR\n\n#if defined(CEREAL_RAPIDXML_NO_EXCEPTIONS)\n\n#define CEREAL_RAPIDXML_PARSE_ERROR(what, where) { parse_error_handler(what, where); assert(0); }\n\nnamespace cereal {\nnamespace rapidxml\n{\n    //! When exceptions are disabled by defining CEREAL_RAPIDXML_NO_EXCEPTIONS,\n    //! this function is called to notify user about the error.\n    //! It must be defined by the user.\n    //! <br><br>\n    //! This function cannot return. If it does, the results are undefined.\n    //! <br><br>\n    //! A very simple definition might look like that:\n    //! <pre>\n    //! void %rapidxml::%parse_error_handler(const char *what, void *where)\n    //! {\n    //!     std::cout << \"Parse error: \" << what << \"\\n\";\n    //!     std::abort();\n    //! }\n    //! </pre>\n    //! \\param what Human readable description of the error.\n    //! \\param where Pointer to character data where error was detected.\n    void parse_error_handler(const char *what, void *where);\n}\n} // end namespace cereal\n\n#else\n\n#include <exception>    // For std::exception\n\n#define CEREAL_RAPIDXML_PARSE_ERROR(what, where) throw parse_error(what, where)\n\nnamespace cereal {\nnamespace rapidxml\n{\n\n    //! Parse error exception.\n    //! This exception is thrown by the parser when an error occurs.\n    //! Use what() function to get human-readable error message.\n    //! Use where() function to get a pointer to position within source text where error was detected.\n    //! <br><br>\n    //! If throwing exceptions by the parser is undesirable,\n    //! it can be disabled by defining CEREAL_RAPIDXML_NO_EXCEPTIONS macro before rapidxml.hpp is included.\n    //! This will cause the parser to call rapidxml::parse_error_handler() function instead of throwing an exception.\n    //! This function must be defined by the user.\n    //! <br><br>\n    //! This class derives from <code>std::exception</code> class.\n    class parse_error: public std::exception\n    {\n\n    public:\n\n        //! Constructs parse error\n        parse_error(const char *what_, void *where_)\n            : m_what(what_)\n            , m_where(where_)\n        {\n        }\n\n        //! Gets human readable description of error.\n        //! \\return Pointer to null terminated description of the error.\n        virtual const char *what() const CEREAL_NOEXCEPT override\n        {\n            return m_what;\n        }\n\n        //! Gets pointer to character data where error happened.\n        //! Ch should be the same as char type of xml_document that produced the error.\n        //! \\return Pointer to location within the parsed string where error occured.\n        template<class Ch>\n        Ch *where() const\n        {\n            return reinterpret_cast<Ch *>(m_where);\n        }\n\n    private:\n\n        const char *m_what;\n        void *m_where;\n\n    };\n}\n} // end namespace cereal\n\n#endif\n\n///////////////////////////////////////////////////////////////////////////\n// Pool sizes\n\n#ifndef CEREAL_RAPIDXML_STATIC_POOL_SIZE\n    // Size of static memory block of memory_pool.\n    // Define CEREAL_RAPIDXML_STATIC_POOL_SIZE before including rapidxml.hpp if you want to override the default value.\n    // No dynamic memory allocations are performed by memory_pool until static memory is exhausted.\n    #define CEREAL_RAPIDXML_STATIC_POOL_SIZE (64 * 1024)\n#endif\n\n#ifndef CEREAL_RAPIDXML_DYNAMIC_POOL_SIZE\n    // Size of dynamic memory block of memory_pool.\n    // Define CEREAL_RAPIDXML_DYNAMIC_POOL_SIZE before including rapidxml.hpp if you want to override the default value.\n    // After the static block is exhausted, dynamic blocks with approximately this size are allocated by memory_pool.\n    #define CEREAL_RAPIDXML_DYNAMIC_POOL_SIZE (64 * 1024)\n#endif\n\n#ifndef CEREAL_RAPIDXML_ALIGNMENT\n    // Memory allocation alignment.\n    // Define CEREAL_RAPIDXML_ALIGNMENT before including rapidxml.hpp if you want to override the default value, which is the size of pointer.\n    // All memory allocations for nodes, attributes and strings will be aligned to this value.\n    // This must be a power of 2 and at least 1, otherwise memory_pool will not work.\n    #define CEREAL_RAPIDXML_ALIGNMENT sizeof(void *)\n#endif\n\nnamespace cereal {\nnamespace rapidxml\n{\n    // Forward declarations\n    template<class Ch> class xml_node;\n    template<class Ch> class xml_attribute;\n    template<class Ch> class xml_document;\n\n    //! Enumeration listing all node types produced by the parser.\n    //! Use xml_node::type() function to query node type.\n    enum node_type\n    {\n        node_document,      //!< A document node. Name and value are empty.\n        node_element,       //!< An element node. Name contains element name. Value contains text of first data node.\n        node_data,          //!< A data node. Name is empty. Value contains data text.\n        node_cdata,         //!< A CDATA node. Name is empty. Value contains data text.\n        node_comment,       //!< A comment node. Name is empty. Value contains comment text.\n        node_declaration,   //!< A declaration node. Name and value are empty. Declaration parameters (version, encoding and standalone) are in node attributes.\n        node_doctype,       //!< A DOCTYPE node. Name is empty. Value contains DOCTYPE text.\n        node_pi             //!< A PI node. Name contains target. Value contains instructions.\n    };\n\n    ///////////////////////////////////////////////////////////////////////\n    // Parsing flags\n\n    //! Parse flag instructing the parser to not create data nodes.\n    //! Text of first data node will still be placed in value of parent element, unless rapidxml::parse_no_element_values flag is also specified.\n    //! Can be combined with other flags by use of | operator.\n    //! <br><br>\n    //! See xml_document::parse() function.\n    const int parse_no_data_nodes = 0x1;\n\n    //! Parse flag instructing the parser to not use text of first data node as a value of parent element.\n    //! Can be combined with other flags by use of | operator.\n    //! Note that child data nodes of element node take precendence over its value when printing.\n    //! That is, if element has one or more child data nodes <em>and</em> a value, the value will be ignored.\n    //! Use rapidxml::parse_no_data_nodes flag to prevent creation of data nodes if you want to manipulate data using values of elements.\n    //! <br><br>\n    //! See xml_document::parse() function.\n    const int parse_no_element_values = 0x2;\n\n    //! Parse flag instructing the parser to not place zero terminators after strings in the source text.\n    //! By default zero terminators are placed, modifying source text.\n    //! Can be combined with other flags by use of | operator.\n    //! <br><br>\n    //! See xml_document::parse() function.\n    const int parse_no_string_terminators = 0x4;\n\n    //! Parse flag instructing the parser to not translate entities in the source text.\n    //! By default entities are translated, modifying source text.\n    //! Can be combined with other flags by use of | operator.\n    //! <br><br>\n    //! See xml_document::parse() function.\n    const int parse_no_entity_translation = 0x8;\n\n    //! Parse flag instructing the parser to disable UTF-8 handling and assume plain 8 bit characters.\n    //! By default, UTF-8 handling is enabled.\n    //! Can be combined with other flags by use of | operator.\n    //! <br><br>\n    //! See xml_document::parse() function.\n    const int parse_no_utf8 = 0x10;\n\n    //! Parse flag instructing the parser to create XML declaration node.\n    //! By default, declaration node is not created.\n    //! Can be combined with other flags by use of | operator.\n    //! <br><br>\n    //! See xml_document::parse() function.\n    const int parse_declaration_node = 0x20;\n\n    //! Parse flag instructing the parser to create comments nodes.\n    //! By default, comment nodes are not created.\n    //! Can be combined with other flags by use of | operator.\n    //! <br><br>\n    //! See xml_document::parse() function.\n    const int parse_comment_nodes = 0x40;\n\n    //! Parse flag instructing the parser to create DOCTYPE node.\n    //! By default, doctype node is not created.\n    //! Although W3C specification allows at most one DOCTYPE node, RapidXml will silently accept documents with more than one.\n    //! Can be combined with other flags by use of | operator.\n    //! <br><br>\n    //! See xml_document::parse() function.\n    const int parse_doctype_node = 0x80;\n\n    //! Parse flag instructing the parser to create PI nodes.\n    //! By default, PI nodes are not created.\n    //! Can be combined with other flags by use of | operator.\n    //! <br><br>\n    //! See xml_document::parse() function.\n    const int parse_pi_nodes = 0x100;\n\n    //! Parse flag instructing the parser to validate closing tag names.\n    //! If not set, name inside closing tag is irrelevant to the parser.\n    //! By default, closing tags are not validated.\n    //! Can be combined with other flags by use of | operator.\n    //! <br><br>\n    //! See xml_document::parse() function.\n    const int parse_validate_closing_tags = 0x200;\n\n    //! Parse flag instructing the parser to trim all leading and trailing whitespace of data nodes.\n    //! By default, whitespace is not trimmed.\n    //! This flag does not cause the parser to modify source text.\n    //! Can be combined with other flags by use of | operator.\n    //! <br><br>\n    //! See xml_document::parse() function.\n    const int parse_trim_whitespace = 0x400;\n\n    //! Parse flag instructing the parser to condense all whitespace runs of data nodes to a single space character.\n    //! Trimming of leading and trailing whitespace of data is controlled by rapidxml::parse_trim_whitespace flag.\n    //! By default, whitespace is not normalized.\n    //! If this flag is specified, source text will be modified.\n    //! Can be combined with other flags by use of | operator.\n    //! <br><br>\n    //! See xml_document::parse() function.\n    const int parse_normalize_whitespace = 0x800;\n\n    // Compound flags\n\n    //! Parse flags which represent default behaviour of the parser.\n    //! This is always equal to 0, so that all other flags can be simply ored together.\n    //! Normally there is no need to inconveniently disable flags by anding with their negated (~) values.\n    //! This also means that meaning of each flag is a <i>negation</i> of the default setting.\n    //! For example, if flag name is rapidxml::parse_no_utf8, it means that utf-8 is <i>enabled</i> by default,\n    //! and using the flag will disable it.\n    //! <br><br>\n    //! See xml_document::parse() function.\n    const int parse_default = 0;\n\n    //! A combination of parse flags that forbids any modifications of the source text.\n    //! This also results in faster parsing. However, note that the following will occur:\n    //! <ul>\n    //! <li>names and values of nodes will not be zero terminated, you have to use xml_base::name_size() and xml_base::value_size() functions to determine where name and value ends</li>\n    //! <li>entities will not be translated</li>\n    //! <li>whitespace will not be normalized</li>\n    //! </ul>\n    //! See xml_document::parse() function.\n    const int parse_non_destructive = parse_no_string_terminators | parse_no_entity_translation;\n\n    //! A combination of parse flags resulting in fastest possible parsing, without sacrificing important data.\n    //! <br><br>\n    //! See xml_document::parse() function.\n    const int parse_fastest = parse_non_destructive | parse_no_data_nodes;\n\n    //! A combination of parse flags resulting in largest amount of data being extracted.\n    //! This usually results in slowest parsing.\n    //! <br><br>\n    //! See xml_document::parse() function.\n    const int parse_full = parse_declaration_node | parse_comment_nodes | parse_doctype_node | parse_pi_nodes | parse_validate_closing_tags;\n\n    ///////////////////////////////////////////////////////////////////////\n    // Internals\n\n    //! \\cond internal\n    namespace internal\n    {\n\n        // Struct that contains lookup tables for the parser\n        // It must be a template to allow correct linking (because it has static data members, which are defined in a header file).\n        template<int Dummy>\n        struct lookup_tables\n        {\n            static const unsigned char lookup_whitespace[256];              // Whitespace table\n            static const unsigned char lookup_node_name[256];               // Node name table\n            static const unsigned char lookup_text[256];                    // Text table\n            static const unsigned char lookup_text_pure_no_ws[256];         // Text table\n            static const unsigned char lookup_text_pure_with_ws[256];       // Text table\n            static const unsigned char lookup_attribute_name[256];          // Attribute name table\n            static const unsigned char lookup_attribute_data_1[256];        // Attribute data table with single quote\n            static const unsigned char lookup_attribute_data_1_pure[256];   // Attribute data table with single quote\n            static const unsigned char lookup_attribute_data_2[256];        // Attribute data table with double quotes\n            static const unsigned char lookup_attribute_data_2_pure[256];   // Attribute data table with double quotes\n            static const unsigned char lookup_digits[256];                  // Digits\n            static const unsigned char lookup_upcase[256];                  // To uppercase conversion table for ASCII characters\n        };\n\n        // Find length of the string\n        template<class Ch>\n        inline std::size_t measure(const Ch *p)\n        {\n            const Ch *tmp = p;\n            while (*tmp)\n                ++tmp;\n            return static_cast<std::size_t>(tmp - p);\n        }\n\n        // Compare strings for equality\n        template<class Ch>\n        inline bool compare(const Ch *p1, std::size_t size1, const Ch *p2, std::size_t size2, bool case_sensitive)\n        {\n            if (size1 != size2)\n                return false;\n            if (case_sensitive)\n            {\n                for (const Ch *end = p1 + size1; p1 < end; ++p1, ++p2)\n                    if (*p1 != *p2)\n                        return false;\n            }\n            else\n            {\n                for (const Ch *end = p1 + size1; p1 < end; ++p1, ++p2)\n                    if (lookup_tables<0>::lookup_upcase[static_cast<unsigned char>(*p1)] != lookup_tables<0>::lookup_upcase[static_cast<unsigned char>(*p2)])\n                        return false;\n            }\n            return true;\n        }\n\n        template<class Ch>\n        inline bool preserve_space(xml_node<Ch>* node)\n        {\n            const Ch preserve_value[] = { Ch('p'), Ch('r'), Ch('e'), Ch('s'), Ch('e'), Ch('r'), Ch('v'), Ch('e') };\n            const xml_attribute<Ch>* space = node->first_attribute(\"xml:space\");\n            return space && internal::compare(space->value(), space->value_size(), preserve_value, sizeof(preserve_value) / sizeof(Ch), true);\n        }\n    }\n    //! \\endcond\n\n    ///////////////////////////////////////////////////////////////////////\n    // Memory pool\n\n    //! This class is used by the parser to create new nodes and attributes, without overheads of dynamic memory allocation.\n    //! In most cases, you will not need to use this class directly.\n    //! However, if you need to create nodes manually or modify names/values of nodes,\n    //! you are encouraged to use memory_pool of relevant xml_document to allocate the memory.\n    //! Not only is this faster than allocating them by using <code>new</code> operator,\n    //! but also their lifetime will be tied to the lifetime of document,\n    //! possibly simplyfing memory management.\n    //! <br><br>\n    //! Call allocate_node() or allocate_attribute() functions to obtain new nodes or attributes from the pool.\n    //! You can also call allocate_string() function to allocate strings.\n    //! Such strings can then be used as names or values of nodes without worrying about their lifetime.\n    //! Note that there is no <code>free()</code> function -- all allocations are freed at once when clear() function is called,\n    //! or when the pool is destroyed.\n    //! <br><br>\n    //! It is also possible to create a standalone memory_pool, and use it\n    //! to allocate nodes, whose lifetime will not be tied to any document.\n    //! <br><br>\n    //! Pool maintains <code>CEREAL_RAPIDXML_STATIC_POOL_SIZE</code> bytes of statically allocated memory.\n    //! Until static memory is exhausted, no dynamic memory allocations are done.\n    //! When static memory is exhausted, pool allocates additional blocks of memory of size <code>CEREAL_RAPIDXML_DYNAMIC_POOL_SIZE</code> each,\n    //! by using global <code>new[]</code> and <code>delete[]</code> operators.\n    //! This behaviour can be changed by setting custom allocation routines.\n    //! Use set_allocator() function to set them.\n    //! <br><br>\n    //! Allocations for nodes, attributes and strings are aligned at <code>CEREAL_RAPIDXML_ALIGNMENT</code> bytes.\n    //! This value defaults to the size of pointer on target architecture.\n    //! <br><br>\n    //! To obtain absolutely top performance from the parser,\n    //! it is important that all nodes are allocated from a single, contiguous block of memory.\n    //! Otherwise, cache misses when jumping between two (or more) disjoint blocks of memory can slow down parsing quite considerably.\n    //! If required, you can tweak <code>CEREAL_RAPIDXML_STATIC_POOL_SIZE</code>, <code>CEREAL_RAPIDXML_DYNAMIC_POOL_SIZE</code> and <code>CEREAL_RAPIDXML_ALIGNMENT</code>\n    //! to obtain best wasted memory to performance compromise.\n    //! To do it, define their values before rapidxml.hpp file is included.\n    //! \\tparam Ch Character type of created nodes.\n    template<class Ch = char>\n    class memory_pool\n    {\n\n    public:\n\n        //! \\cond internal\n        typedef void *(alloc_func)(std::size_t);       // Type of user-defined function used to allocate memory\n        typedef void (free_func)(void *);              // Type of user-defined function used to free memory\n        //! \\endcond\n\n        //! Constructs empty pool with default allocator functions.\n        memory_pool()\n            : m_alloc_func(0)\n            , m_free_func(0)\n        {\n            init();\n        }\n\n        //! Destroys pool and frees all the memory.\n        //! This causes memory occupied by nodes allocated by the pool to be freed.\n        //! Nodes allocated from the pool are no longer valid.\n        ~memory_pool()\n        {\n            clear();\n        }\n\n        //! Allocates a new node from the pool, and optionally assigns name and value to it.\n        //! If the allocation request cannot be accomodated, this function will throw <code>std::bad_alloc</code>.\n        //! If exceptions are disabled by defining CEREAL_RAPIDXML_NO_EXCEPTIONS, this function\n        //! will call rapidxml::parse_error_handler() function.\n        //! \\param type Type of node to create.\n        //! \\param name Name to assign to the node, or 0 to assign no name.\n        //! \\param value Value to assign to the node, or 0 to assign no value.\n        //! \\param name_size Size of name to assign, or 0 to automatically calculate size from name string.\n        //! \\param value_size Size of value to assign, or 0 to automatically calculate size from value string.\n        //! \\return Pointer to allocated node. This pointer will never be NULL.\n        xml_node<Ch> *allocate_node(node_type type,\n                                    const Ch *name = 0, const Ch *value = 0,\n                                    std::size_t name_size = 0, std::size_t value_size = 0)\n        {\n            void *memory = allocate_aligned(sizeof(xml_node<Ch>));\n            xml_node<Ch> *node = new(memory) xml_node<Ch>(type);\n            if (name)\n            {\n                if (name_size > 0)\n                    node->name(name, name_size);\n                else\n                    node->name(name);\n            }\n            if (value)\n            {\n                if (value_size > 0)\n                    node->value(value, value_size);\n                else\n                    node->value(value);\n            }\n            return node;\n        }\n\n        //! Allocates a new attribute from the pool, and optionally assigns name and value to it.\n        //! If the allocation request cannot be accomodated, this function will throw <code>std::bad_alloc</code>.\n        //! If exceptions are disabled by defining CEREAL_RAPIDXML_NO_EXCEPTIONS, this function\n        //! will call rapidxml::parse_error_handler() function.\n        //! \\param name Name to assign to the attribute, or 0 to assign no name.\n        //! \\param value Value to assign to the attribute, or 0 to assign no value.\n        //! \\param name_size Size of name to assign, or 0 to automatically calculate size from name string.\n        //! \\param value_size Size of value to assign, or 0 to automatically calculate size from value string.\n        //! \\return Pointer to allocated attribute. This pointer will never be NULL.\n        xml_attribute<Ch> *allocate_attribute(const Ch *name = 0, const Ch *value = 0,\n                                              std::size_t name_size = 0, std::size_t value_size = 0)\n        {\n            void *memory = allocate_aligned(sizeof(xml_attribute<Ch>));\n            xml_attribute<Ch> *attribute = new(memory) xml_attribute<Ch>;\n            if (name)\n            {\n                if (name_size > 0)\n                    attribute->name(name, name_size);\n                else\n                    attribute->name(name);\n            }\n            if (value)\n            {\n                if (value_size > 0)\n                    attribute->value(value, value_size);\n                else\n                    attribute->value(value);\n            }\n            return attribute;\n        }\n\n        //! Allocates a char array of given size from the pool, and optionally copies a given string to it.\n        //! If the allocation request cannot be accomodated, this function will throw <code>std::bad_alloc</code>.\n        //! If exceptions are disabled by defining CEREAL_RAPIDXML_NO_EXCEPTIONS, this function\n        //! will call rapidxml::parse_error_handler() function.\n        //! \\param source String to initialize the allocated memory with, or 0 to not initialize it.\n        //! \\param size Number of characters to allocate, or zero to calculate it automatically from source string length; if size is 0, source string must be specified and null terminated.\n        //! \\return Pointer to allocated char array. This pointer will never be NULL.\n        Ch *allocate_string(const Ch *source = 0, std::size_t size = 0)\n        {\n            assert(source || size);     // Either source or size (or both) must be specified\n            if (size == 0)\n                size = internal::measure(source) + 1;\n            Ch *result = static_cast<Ch *>(allocate_aligned(size * sizeof(Ch)));\n            if (source)\n                for (std::size_t i = 0; i < size; ++i)\n                    result[i] = source[i];\n            return result;\n        }\n\n        //! Clones an xml_node and its hierarchy of child nodes and attributes.\n        //! Nodes and attributes are allocated from this memory pool.\n        //! Names and values are not cloned, they are shared between the clone and the source.\n        //! Result node can be optionally specified as a second parameter,\n        //! in which case its contents will be replaced with cloned source node.\n        //! This is useful when you want to clone entire document.\n        //! \\param source Node to clone.\n        //! \\param result Node to put results in, or 0 to automatically allocate result node\n        //! \\return Pointer to cloned node. This pointer will never be NULL.\n        xml_node<Ch> *clone_node(const xml_node<Ch> *source, xml_node<Ch> *result = 0)\n        {\n            // Prepare result node\n            if (result)\n            {\n                result->remove_all_attributes();\n                result->remove_all_nodes();\n                result->type(source->type());\n            }\n            else\n                result = allocate_node(source->type());\n\n            // Clone name and value\n            result->name(source->name(), source->name_size());\n            result->value(source->value(), source->value_size());\n\n            // Clone child nodes and attributes\n            for (xml_node<Ch> *child = source->first_node(); child; child = child->next_sibling())\n                result->append_node(clone_node(child));\n            for (xml_attribute<Ch> *attr = source->first_attribute(); attr; attr = attr->next_attribute())\n                result->append_attribute(allocate_attribute(attr->name(), attr->value(), attr->name_size(), attr->value_size()));\n\n            return result;\n        }\n\n        //! Clears the pool.\n        //! This causes memory occupied by nodes allocated by the pool to be freed.\n        //! Any nodes or strings allocated from the pool will no longer be valid.\n        void clear()\n        {\n            while (m_begin != m_static_memory)\n            {\n                char *previous_begin = reinterpret_cast<header *>(align(m_begin))->previous_begin;\n                if (m_free_func)\n                    m_free_func(m_begin);\n                else\n                    delete[] m_begin;\n                m_begin = previous_begin;\n            }\n            init();\n        }\n\n        //! Sets or resets the user-defined memory allocation functions for the pool.\n        //! This can only be called when no memory is allocated from the pool yet, otherwise results are undefined.\n        //! Allocation function must not return invalid pointer on failure. It should either throw,\n        //! stop the program, or use <code>longjmp()</code> function to pass control to other place of program.\n        //! If it returns invalid pointer, results are undefined.\n        //! <br><br>\n        //! User defined allocation functions must have the following forms:\n        //! <br><code>\n        //! <br>void *allocate(std::size_t size);\n        //! <br>void free(void *pointer);\n        //! </code><br>\n        //! \\param af Allocation function, or 0 to restore default function\n        //! \\param ff Free function, or 0 to restore default function\n        void set_allocator(alloc_func *af, free_func *ff)\n        {\n            assert(m_begin == m_static_memory && m_ptr == align(m_begin));    // Verify that no memory is allocated yet\n            m_alloc_func = af;\n            m_free_func = ff;\n        }\n\n    private:\n\n        struct header\n        {\n            char *previous_begin;\n        };\n\n        void init()\n        {\n            m_begin = m_static_memory;\n            m_ptr = align(m_begin);\n            m_end = m_static_memory + sizeof(m_static_memory);\n        }\n\n        char *align(char *ptr)\n        {\n            std::size_t alignment = ((CEREAL_RAPIDXML_ALIGNMENT - (std::size_t(ptr) & (CEREAL_RAPIDXML_ALIGNMENT - 1))) & (CEREAL_RAPIDXML_ALIGNMENT - 1));\n            return ptr + alignment;\n        }\n\n        char *allocate_raw(std::size_t size)\n        {\n            // Allocate\n            void *memory;\n            if (m_alloc_func)   // Allocate memory using either user-specified allocation function or global operator new[]\n            {\n                memory = m_alloc_func(size);\n                assert(memory); // Allocator is not allowed to return 0, on failure it must either throw, stop the program or use longjmp\n            }\n            else\n            {\n                memory = new char[size];\n#ifdef CEREAL_RAPIDXML_NO_EXCEPTIONS\n                if (!memory)            // If exceptions are disabled, verify memory allocation, because new will not be able to throw bad_alloc\n                    CEREAL_RAPIDXML_PARSE_ERROR(\"out of memory\", 0);\n#endif\n            }\n            return static_cast<char *>(memory);\n        }\n\n        void *allocate_aligned(std::size_t size)\n        {\n            // Calculate aligned pointer\n            char *result = align(m_ptr);\n\n            // If not enough memory left in current pool, allocate a new pool\n            if (result + size > m_end)\n            {\n                // Calculate required pool size (may be bigger than CEREAL_RAPIDXML_DYNAMIC_POOL_SIZE)\n                std::size_t pool_size = CEREAL_RAPIDXML_DYNAMIC_POOL_SIZE;\n                if (pool_size < size)\n                    pool_size = size;\n\n                // Allocate\n                std::size_t alloc_size = sizeof(header) + (2 * CEREAL_RAPIDXML_ALIGNMENT - 2) + pool_size;     // 2 alignments required in worst case: one for header, one for actual allocation\n                char *raw_memory = allocate_raw(alloc_size);\n\n                // Setup new pool in allocated memory\n                char *pool = align(raw_memory);\n                header *new_header = reinterpret_cast<header *>(pool);\n                new_header->previous_begin = m_begin;\n                m_begin = raw_memory;\n                m_ptr = pool + sizeof(header);\n                m_end = raw_memory + alloc_size;\n\n                // Calculate aligned pointer again using new pool\n                result = align(m_ptr);\n            }\n\n            // Update pool and return aligned pointer\n            m_ptr = result + size;\n            return result;\n        }\n\n        char *m_begin;                                      // Start of raw memory making up current pool\n        char *m_ptr;                                        // First free byte in current pool\n        char *m_end;                                        // One past last available byte in current pool\n        char m_static_memory[CEREAL_RAPIDXML_STATIC_POOL_SIZE];    // Static raw memory\n        alloc_func *m_alloc_func;                           // Allocator function, or 0 if default is to be used\n        free_func *m_free_func;                             // Free function, or 0 if default is to be used\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n    // XML base\n\n    //! Base class for xml_node and xml_attribute implementing common functions:\n    //! name(), name_size(), value(), value_size() and parent().\n    //! \\tparam Ch Character type to use\n    template<class Ch = char>\n    class xml_base\n    {\n\n    public:\n\n        ///////////////////////////////////////////////////////////////////////////\n        // Construction & destruction\n\n        // Construct a base with empty name, value and parent\n        xml_base()\n            : m_name(0)\n            , m_value(0)\n            , m_parent(0)\n        {\n        }\n\n        ///////////////////////////////////////////////////////////////////////////\n        // Node data access\n\n        //! Gets name of the node.\n        //! Interpretation of name depends on type of node.\n        //! Note that name will not be zero-terminated if rapidxml::parse_no_string_terminators option was selected during parse.\n        //! <br><br>\n        //! Use name_size() function to determine length of the name.\n        //! \\return Name of node, or empty string if node has no name.\n        Ch *name() const\n        {\n            return m_name ? m_name : nullstr();\n        }\n\n        //! Gets size of node name, not including terminator character.\n        //! This function works correctly irrespective of whether name is or is not zero terminated.\n        //! \\return Size of node name, in characters.\n        std::size_t name_size() const\n        {\n            return m_name ? m_name_size : 0;\n        }\n\n        //! Gets value of node.\n        //! Interpretation of value depends on type of node.\n        //! Note that value will not be zero-terminated if rapidxml::parse_no_string_terminators option was selected during parse.\n        //! <br><br>\n        //! Use value_size() function to determine length of the value.\n        //! \\return Value of node, or empty string if node has no value.\n        Ch *value() const\n        {\n            return m_value ? m_value : nullstr();\n        }\n\n        //! Gets size of node value, not including terminator character.\n        //! This function works correctly irrespective of whether value is or is not zero terminated.\n        //! \\return Size of node value, in characters.\n        std::size_t value_size() const\n        {\n            return m_value ? m_value_size : 0;\n        }\n\n        ///////////////////////////////////////////////////////////////////////////\n        // Node modification\n\n        //! Sets name of node to a non zero-terminated string.\n        //! See \\ref ownership_of_strings.\n        //! <br><br>\n        //! Note that node does not own its name or value, it only stores a pointer to it.\n        //! It will not delete or otherwise free the pointer on destruction.\n        //! It is reponsibility of the user to properly manage lifetime of the string.\n        //! The easiest way to achieve it is to use memory_pool of the document to allocate the string -\n        //! on destruction of the document the string will be automatically freed.\n        //! <br><br>\n        //! Size of name must be specified separately, because name does not have to be zero terminated.\n        //! Use name(const Ch *) function to have the length automatically calculated (string must be zero terminated).\n        //! \\param name_ Name of node to set. Does not have to be zero terminated.\n        //! \\param size Size of name, in characters. This does not include zero terminator, if one is present.\n        void name(const Ch *name_, std::size_t size)\n        {\n            m_name = const_cast<Ch *>(name_);\n            m_name_size = size;\n        }\n\n        //! Sets name of node to a zero-terminated string.\n        //! See also \\ref ownership_of_strings and xml_node::name(const Ch *, std::size_t).\n        //! \\param name_ Name of node to set. Must be zero terminated.\n        void name(const Ch *name_)\n        {\n            this->name(name_, internal::measure(name_));\n        }\n\n        //! Sets value of node to a non zero-terminated string.\n        //! See \\ref ownership_of_strings.\n        //! <br><br>\n        //! Note that node does not own its name or value, it only stores a pointer to it.\n        //! It will not delete or otherwise free the pointer on destruction.\n        //! It is reponsibility of the user to properly manage lifetime of the string.\n        //! The easiest way to achieve it is to use memory_pool of the document to allocate the string -\n        //! on destruction of the document the string will be automatically freed.\n        //! <br><br>\n        //! Size of value must be specified separately, because it does not have to be zero terminated.\n        //! Use value(const Ch *) function to have the length automatically calculated (string must be zero terminated).\n        //! <br><br>\n        //! If an element has a child node of type node_data, it will take precedence over element value when printing.\n        //! If you want to manipulate data of elements using values, use parser flag rapidxml::parse_no_data_nodes to prevent creation of data nodes by the parser.\n        //! \\param value_ value of node to set. Does not have to be zero terminated.\n        //! \\param size Size of value, in characters. This does not include zero terminator, if one is present.\n        void value(const Ch *value_, std::size_t size)\n        {\n            m_value = const_cast<Ch *>(value_);\n            m_value_size = size;\n        }\n\n        //! Sets value of node to a zero-terminated string.\n        //! See also \\ref ownership_of_strings and xml_node::value(const Ch *, std::size_t).\n        //! \\param value_ Vame of node to set. Must be zero terminated.\n        void value(const Ch *value_)\n        {\n            this->value(value_, internal::measure(value_));\n        }\n\n        ///////////////////////////////////////////////////////////////////////////\n        // Related nodes access\n\n        //! Gets node parent.\n        //! \\return Pointer to parent node, or 0 if there is no parent.\n        xml_node<Ch> *parent() const\n        {\n            return m_parent;\n        }\n\n    protected:\n\n        // Return empty string\n        static Ch *nullstr()\n        {\n            static Ch zero = Ch('\\0');\n            return &zero;\n        }\n\n        Ch *m_name;                         // Name of node, or 0 if no name\n        Ch *m_value;                        // Value of node, or 0 if no value\n        std::size_t m_name_size;            // Length of node name, or undefined of no name\n        std::size_t m_value_size;           // Length of node value, or undefined if no value\n        xml_node<Ch> *m_parent;             // Pointer to parent node, or 0 if none\n\n    };\n\n    //! Class representing attribute node of XML document.\n    //! Each attribute has name and value strings, which are available through name() and value() functions (inherited from xml_base).\n    //! Note that after parse, both name and value of attribute will point to interior of source text used for parsing.\n    //! Thus, this text must persist in memory for the lifetime of attribute.\n    //! \\tparam Ch Character type to use.\n    template<class Ch = char>\n    class xml_attribute: public xml_base<Ch>\n    {\n\n        friend class xml_node<Ch>;\n\n    public:\n\n        ///////////////////////////////////////////////////////////////////////////\n        // Construction & destruction\n\n        //! Constructs an empty attribute with the specified type.\n        //! Consider using memory_pool of appropriate xml_document if allocating attributes manually.\n        xml_attribute()\n        {\n        }\n\n        ///////////////////////////////////////////////////////////////////////////\n        // Related nodes access\n\n        //! Gets document of which attribute is a child.\n        //! \\return Pointer to document that contains this attribute, or 0 if there is no parent document.\n        xml_document<Ch> *document() const\n        {\n            if (xml_node<Ch> *node = this->parent())\n            {\n                while (node->parent())\n                    node = node->parent();\n                return node->type() == node_document ? static_cast<xml_document<Ch> *>(node) : 0;\n            }\n            else\n                return 0;\n        }\n\n        //! Gets previous attribute, optionally matching attribute name.\n        //! \\param name Name of attribute to find, or 0 to return previous attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero\n        //! \\param name_size Size of name, in characters, or 0 to have size calculated automatically from string\n        //! \\param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters\n        //! \\return Pointer to found attribute, or 0 if not found.\n        xml_attribute<Ch> *previous_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const\n        {\n            if (name)\n            {\n                if (name_size == 0)\n                    name_size = internal::measure(name);\n                for (xml_attribute<Ch> *attribute = m_prev_attribute; attribute; attribute = attribute->m_prev_attribute)\n                    if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive))\n                        return attribute;\n                return 0;\n            }\n            else\n                return this->m_parent ? m_prev_attribute : 0;\n        }\n\n        //! Gets next attribute, optionally matching attribute name.\n        //! \\param name_ Name of attribute to find, or 0 to return next attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero\n        //! \\param name_size_ Size of name, in characters, or 0 to have size calculated automatically from string\n        //! \\param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters\n        //! \\return Pointer to found attribute, or 0 if not found.\n        xml_attribute<Ch> *next_attribute(const Ch *name_ = 0, std::size_t name_size_ = 0, bool case_sensitive = true) const\n        {\n            if (name_)\n            {\n                if (name_size_ == 0)\n                    name_size_ = internal::measure(name_);\n                for (xml_attribute<Ch> *attribute = m_next_attribute; attribute; attribute = attribute->m_next_attribute)\n                    if (internal::compare(attribute->name(), attribute->name_size(), name_, name_size_, case_sensitive))\n                        return attribute;\n                return 0;\n            }\n            else\n                return this->m_parent ? m_next_attribute : 0;\n        }\n\n    private:\n\n        xml_attribute<Ch> *m_prev_attribute;        // Pointer to previous sibling of attribute, or 0 if none; only valid if parent is non-zero\n        xml_attribute<Ch> *m_next_attribute;        // Pointer to next sibling of attribute, or 0 if none; only valid if parent is non-zero\n\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n    // XML node\n\n    //! Class representing a node of XML document.\n    //! Each node may have associated name and value strings, which are available through name() and value() functions.\n    //! Interpretation of name and value depends on type of the node.\n    //! Type of node can be determined by using type() function.\n    //! <br><br>\n    //! Note that after parse, both name and value of node, if any, will point interior of source text used for parsing.\n    //! Thus, this text must persist in the memory for the lifetime of node.\n    //! \\tparam Ch Character type to use.\n    template<class Ch = char>\n    class xml_node: public xml_base<Ch>\n    {\n\n    public:\n\n        ///////////////////////////////////////////////////////////////////////////\n        // Construction & destruction\n\n        //! Constructs an empty node with the specified type.\n        //! Consider using memory_pool of appropriate document to allocate nodes manually.\n        //! \\param type_ Type of node to construct.\n        xml_node(node_type type_)\n            : m_type(type_)\n            , m_first_node(0)\n            , m_first_attribute(0)\n        {\n        }\n\n        ///////////////////////////////////////////////////////////////////////////\n        // Node data access\n\n        //! Gets type of node.\n        //! \\return Type of node.\n        node_type type() const\n        {\n            return m_type;\n        }\n\n        ///////////////////////////////////////////////////////////////////////////\n        // Related nodes access\n\n        //! Gets document of which node is a child.\n        //! \\return Pointer to document that contains this node, or 0 if there is no parent document.\n        xml_document<Ch> *document() const\n        {\n            xml_node<Ch> *node = const_cast<xml_node<Ch> *>(this);\n            while (node->parent())\n                node = node->parent();\n            return node->type() == node_document ? static_cast<xml_document<Ch> *>(node) : 0;\n        }\n\n        //! Gets first child node, optionally matching node name.\n        //! \\param name_ Name of child to find, or 0 to return first child regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero\n        //! \\param name_size_ Size of name, in characters, or 0 to have size calculated automatically from string\n        //! \\param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters\n        //! \\return Pointer to found child, or 0 if not found.\n        xml_node<Ch> *first_node(const Ch *name_ = 0, std::size_t name_size_ = 0, bool case_sensitive = true) const\n        {\n            if (name_)\n            {\n                if (name_size_ == 0)\n                    name_size_ = internal::measure(name_);\n                for (xml_node<Ch> *child = m_first_node; child; child = child->next_sibling())\n                    if (internal::compare(child->name(), child->name_size(), name_, name_size_, case_sensitive))\n                        return child;\n                return 0;\n            }\n            else\n                return m_first_node;\n        }\n\n        //! Gets last child node, optionally matching node name.\n        //! Behaviour is undefined if node has no children.\n        //! Use first_node() to test if node has children.\n        //! \\param name Name of child to find, or 0 to return last child regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero\n        //! \\param name_size Size of name, in characters, or 0 to have size calculated automatically from string\n        //! \\param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters\n        //! \\return Pointer to found child, or 0 if not found.\n        xml_node<Ch> *last_node(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const\n        {\n            assert(m_first_node);  // Cannot query for last child if node has no children\n            if (name)\n            {\n                if (name_size == 0)\n                    name_size = internal::measure(name);\n                for (xml_node<Ch> *child = m_last_node; child; child = child->previous_sibling())\n                    if (internal::compare(child->name(), child->name_size(), name, name_size, case_sensitive))\n                        return child;\n                return 0;\n            }\n            else\n                return m_last_node;\n        }\n\n        //! Gets previous sibling node, optionally matching node name.\n        //! Behaviour is undefined if node has no parent.\n        //! Use parent() to test if node has a parent.\n        //! \\param name Name of sibling to find, or 0 to return previous sibling regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero\n        //! \\param name_size Size of name, in characters, or 0 to have size calculated automatically from string\n        //! \\param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters\n        //! \\return Pointer to found sibling, or 0 if not found.\n        xml_node<Ch> *previous_sibling(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const\n        {\n            assert(this->m_parent);     // Cannot query for siblings if node has no parent\n            if (name)\n            {\n                if (name_size == 0)\n                    name_size = internal::measure(name);\n                for (xml_node<Ch> *sibling = m_prev_sibling; sibling; sibling = sibling->m_prev_sibling)\n                    if (internal::compare(sibling->name(), sibling->name_size(), name, name_size, case_sensitive))\n                        return sibling;\n                return 0;\n            }\n            else\n                return m_prev_sibling;\n        }\n\n        //! Gets next sibling node, optionally matching node name.\n        //! Behaviour is undefined if node has no parent.\n        //! Use parent() to test if node has a parent.\n        //! \\param name_ Name of sibling to find, or 0 to return next sibling regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero\n        //! \\param name_size_ Size of name, in characters, or 0 to have size calculated automatically from string\n        //! \\param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters\n        //! \\return Pointer to found sibling, or 0 if not found.\n        xml_node<Ch> *next_sibling(const Ch *name_ = 0, std::size_t name_size_ = 0, bool case_sensitive = true) const\n        {\n            assert(this->m_parent);     // Cannot query for siblings if node has no parent\n            if (name_)\n            {\n                if (name_size_ == 0)\n                    name_size_ = internal::measure(name_);\n                for (xml_node<Ch> *sibling = m_next_sibling; sibling; sibling = sibling->m_next_sibling)\n                    if (internal::compare(sibling->name(), sibling->name_size(), name_, name_size_, case_sensitive))\n                        return sibling;\n                return 0;\n            }\n            else\n                return m_next_sibling;\n        }\n\n        //! Gets first attribute of node, optionally matching attribute name.\n        //! \\param name_ Name of attribute to find, or 0 to return first attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero\n        //! \\param name_size_ Size of name, in characters, or 0 to have size calculated automatically from string\n        //! \\param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters\n        //! \\return Pointer to found attribute, or 0 if not found.\n        xml_attribute<Ch> *first_attribute(const Ch *name_ = 0, std::size_t name_size_ = 0, bool case_sensitive = true) const\n        {\n            if (name_)\n            {\n                if (name_size_ == 0)\n                    name_size_ = internal::measure(name_);\n                for (xml_attribute<Ch> *attribute = m_first_attribute; attribute; attribute = attribute->m_next_attribute)\n                    if (internal::compare(attribute->name(), attribute->name_size(), name_, name_size_, case_sensitive))\n                        return attribute;\n                return 0;\n            }\n            else\n                return m_first_attribute;\n        }\n\n        //! Gets last attribute of node, optionally matching attribute name.\n        //! \\param name Name of attribute to find, or 0 to return last attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero\n        //! \\param name_size Size of name, in characters, or 0 to have size calculated automatically from string\n        //! \\param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters\n        //! \\return Pointer to found attribute, or 0 if not found.\n        xml_attribute<Ch> *last_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const\n        {\n            if (name)\n            {\n                if (name_size == 0)\n                    name_size = internal::measure(name);\n                for (xml_attribute<Ch> *attribute = m_last_attribute; attribute; attribute = attribute->m_prev_attribute)\n                    if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive))\n                        return attribute;\n                return 0;\n            }\n            else\n                return m_first_attribute ? m_last_attribute : 0;\n        }\n\n        ///////////////////////////////////////////////////////////////////////////\n        // Node modification\n\n        //! Sets type of node.\n        //! \\param type_ Type of node to set.\n        void type(node_type type_)\n        {\n            m_type = type_;\n        }\n\n        ///////////////////////////////////////////////////////////////////////////\n        // Node manipulation\n\n        //! Prepends a new child node.\n        //! The prepended child becomes the first child, and all existing children are moved one position back.\n        //! \\param child Node to prepend.\n        void prepend_node(xml_node<Ch> *child)\n        {\n            assert(child && !child->parent() && child->type() != node_document);\n            if (first_node())\n            {\n                child->m_next_sibling = m_first_node;\n                m_first_node->m_prev_sibling = child;\n            }\n            else\n            {\n                child->m_next_sibling = 0;\n                m_last_node = child;\n            }\n            m_first_node = child;\n            child->m_parent = this;\n            child->m_prev_sibling = 0;\n        }\n\n        //! Appends a new child node.\n        //! The appended child becomes the last child.\n        //! \\param child Node to append.\n        void append_node(xml_node<Ch> *child)\n        {\n            assert(child && !child->parent() && child->type() != node_document);\n            if (first_node())\n            {\n                child->m_prev_sibling = m_last_node;\n                m_last_node->m_next_sibling = child;\n            }\n            else\n            {\n                child->m_prev_sibling = 0;\n                m_first_node = child;\n            }\n            m_last_node = child;\n            child->m_parent = this;\n            child->m_next_sibling = 0;\n        }\n\n        //! Inserts a new child node at specified place inside the node.\n        //! All children after and including the specified node are moved one position back.\n        //! \\param where Place where to insert the child, or 0 to insert at the back.\n        //! \\param child Node to insert.\n        void insert_node(xml_node<Ch> *where, xml_node<Ch> *child)\n        {\n            assert(!where || where->parent() == this);\n            assert(child && !child->parent() && child->type() != node_document);\n            if (where == m_first_node)\n                prepend_node(child);\n            else if (where == 0)\n                append_node(child);\n            else\n            {\n                child->m_prev_sibling = where->m_prev_sibling;\n                child->m_next_sibling = where;\n                where->m_prev_sibling->m_next_sibling = child;\n                where->m_prev_sibling = child;\n                child->m_parent = this;\n            }\n        }\n\n        //! Removes first child node.\n        //! If node has no children, behaviour is undefined.\n        //! Use first_node() to test if node has children.\n        void remove_first_node()\n        {\n            assert(first_node());\n            xml_node<Ch> *child = m_first_node;\n            m_first_node = child->m_next_sibling;\n            if (child->m_next_sibling)\n                child->m_next_sibling->m_prev_sibling = 0;\n            else\n                m_last_node = 0;\n            child->m_parent = 0;\n        }\n\n        //! Removes last child of the node.\n        //! If node has no children, behaviour is undefined.\n        //! Use first_node() to test if node has children.\n        void remove_last_node()\n        {\n            assert(first_node());\n            xml_node<Ch> *child = m_last_node;\n            if (child->m_prev_sibling)\n            {\n                m_last_node = child->m_prev_sibling;\n                child->m_prev_sibling->m_next_sibling = 0;\n            }\n            else\n                m_first_node = 0;\n            child->m_parent = 0;\n        }\n\n        //! Removes specified child from the node\n        // \\param where Pointer to child to be removed.\n        void remove_node(xml_node<Ch> *where)\n        {\n            assert(where && where->parent() == this);\n            assert(first_node());\n            if (where == m_first_node)\n                remove_first_node();\n            else if (where == m_last_node)\n                remove_last_node();\n            else\n            {\n                where->m_prev_sibling->m_next_sibling = where->m_next_sibling;\n                where->m_next_sibling->m_prev_sibling = where->m_prev_sibling;\n                where->m_parent = 0;\n            }\n        }\n\n        //! Removes all child nodes (but not attributes).\n        void remove_all_nodes()\n        {\n            for (xml_node<Ch> *node = first_node(); node; node = node->m_next_sibling)\n                node->m_parent = 0;\n            m_first_node = 0;\n        }\n\n        //! Prepends a new attribute to the node.\n        //! \\param attribute Attribute to prepend.\n        void prepend_attribute(xml_attribute<Ch> *attribute)\n        {\n            assert(attribute && !attribute->parent());\n            if (first_attribute())\n            {\n                attribute->m_next_attribute = m_first_attribute;\n                m_first_attribute->m_prev_attribute = attribute;\n            }\n            else\n            {\n                attribute->m_next_attribute = 0;\n                m_last_attribute = attribute;\n            }\n            m_first_attribute = attribute;\n            attribute->m_parent = this;\n            attribute->m_prev_attribute = 0;\n        }\n\n        //! Appends a new attribute to the node.\n        //! \\param attribute Attribute to append.\n        void append_attribute(xml_attribute<Ch> *attribute)\n        {\n            assert(attribute && !attribute->parent());\n            if (first_attribute())\n            {\n                attribute->m_prev_attribute = m_last_attribute;\n                m_last_attribute->m_next_attribute = attribute;\n            }\n            else\n            {\n                attribute->m_prev_attribute = 0;\n                m_first_attribute = attribute;\n            }\n            m_last_attribute = attribute;\n            attribute->m_parent = this;\n            attribute->m_next_attribute = 0;\n        }\n\n        //! Inserts a new attribute at specified place inside the node.\n        //! All attributes after and including the specified attribute are moved one position back.\n        //! \\param where Place where to insert the attribute, or 0 to insert at the back.\n        //! \\param attribute Attribute to insert.\n        void insert_attribute(xml_attribute<Ch> *where, xml_attribute<Ch> *attribute)\n        {\n            assert(!where || where->parent() == this);\n            assert(attribute && !attribute->parent());\n            if (where == m_first_attribute)\n                prepend_attribute(attribute);\n            else if (where == 0)\n                append_attribute(attribute);\n            else\n            {\n                attribute->m_prev_attribute = where->m_prev_attribute;\n                attribute->m_next_attribute = where;\n                where->m_prev_attribute->m_next_attribute = attribute;\n                where->m_prev_attribute = attribute;\n                attribute->m_parent = this;\n            }\n        }\n\n        //! Removes first attribute of the node.\n        //! If node has no attributes, behaviour is undefined.\n        //! Use first_attribute() to test if node has attributes.\n        void remove_first_attribute()\n        {\n            assert(first_attribute());\n            xml_attribute<Ch> *attribute = m_first_attribute;\n            if (attribute->m_next_attribute)\n            {\n                attribute->m_next_attribute->m_prev_attribute = 0;\n            }\n            else\n                m_last_attribute = 0;\n            attribute->m_parent = 0;\n            m_first_attribute = attribute->m_next_attribute;\n        }\n\n        //! Removes last attribute of the node.\n        //! If node has no attributes, behaviour is undefined.\n        //! Use first_attribute() to test if node has attributes.\n        void remove_last_attribute()\n        {\n            assert(first_attribute());\n            xml_attribute<Ch> *attribute = m_last_attribute;\n            if (attribute->m_prev_attribute)\n            {\n                attribute->m_prev_attribute->m_next_attribute = 0;\n                m_last_attribute = attribute->m_prev_attribute;\n            }\n            else\n                m_first_attribute = 0;\n            attribute->m_parent = 0;\n        }\n\n        //! Removes specified attribute from node.\n        //! \\param where Pointer to attribute to be removed.\n        void remove_attribute(xml_attribute<Ch> *where)\n        {\n            assert(first_attribute() && where->parent() == this);\n            if (where == m_first_attribute)\n                remove_first_attribute();\n            else if (where == m_last_attribute)\n                remove_last_attribute();\n            else\n            {\n                where->m_prev_attribute->m_next_attribute = where->m_next_attribute;\n                where->m_next_attribute->m_prev_attribute = where->m_prev_attribute;\n                where->m_parent = 0;\n            }\n        }\n\n        //! Removes all attributes of node.\n        void remove_all_attributes()\n        {\n            for (xml_attribute<Ch> *attribute = first_attribute(); attribute; attribute = attribute->m_next_attribute)\n                attribute->m_parent = 0;\n            m_first_attribute = 0;\n        }\n\n    private:\n\n        ///////////////////////////////////////////////////////////////////////////\n        // Restrictions\n\n        // No copying\n        xml_node(const xml_node &);\n        void operator =(const xml_node &);\n\n        ///////////////////////////////////////////////////////////////////////////\n        // Data members\n\n        // Note that some of the pointers below have UNDEFINED values if certain other pointers are 0.\n        // This is required for maximum performance, as it allows the parser to omit initialization of\n        // unneded/redundant values.\n        //\n        // The rules are as follows:\n        // 1. first_node and first_attribute contain valid pointers, or 0 if node has no children/attributes respectively\n        // 2. last_node and last_attribute are valid only if node has at least one child/attribute respectively, otherwise they contain garbage\n        // 3. prev_sibling and next_sibling are valid only if node has a parent, otherwise they contain garbage\n\n        node_type m_type;                       // Type of node; always valid\n        xml_node<Ch> *m_first_node;             // Pointer to first child node, or 0 if none; always valid\n        xml_node<Ch> *m_last_node;              // Pointer to last child node, or 0 if none; this value is only valid if m_first_node is non-zero\n        xml_attribute<Ch> *m_first_attribute;   // Pointer to first attribute of node, or 0 if none; always valid\n        xml_attribute<Ch> *m_last_attribute;    // Pointer to last attribute of node, or 0 if none; this value is only valid if m_first_attribute is non-zero\n        xml_node<Ch> *m_prev_sibling;           // Pointer to previous sibling of node, or 0 if none; this value is only valid if m_parent is non-zero\n        xml_node<Ch> *m_next_sibling;           // Pointer to next sibling of node, or 0 if none; this value is only valid if m_parent is non-zero\n\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n    // XML document\n\n    //! This class represents root of the DOM hierarchy.\n    //! It is also an xml_node and a memory_pool through public inheritance.\n    //! Use parse() function to build a DOM tree from a zero-terminated XML text string.\n    //! parse() function allocates memory for nodes and attributes by using functions of xml_document,\n    //! which are inherited from memory_pool.\n    //! To access root node of the document, use the document itself, as if it was an xml_node.\n    //! \\tparam Ch Character type to use.\n    template<class Ch = char>\n    class xml_document: public xml_node<Ch>, public memory_pool<Ch>\n    {\n\n    public:\n\n        //! Constructs empty XML document\n        xml_document()\n            : xml_node<Ch>(node_document)\n        {\n        }\n\n        //! Parses zero-terminated XML string according to given flags.\n        //! Passed string will be modified by the parser, unless rapidxml::parse_non_destructive flag is used.\n        //! The string must persist for the lifetime of the document.\n        //! In case of error, rapidxml::parse_error exception will be thrown.\n        //! <br><br>\n        //! If you want to parse contents of a file, you must first load the file into the memory, and pass pointer to its beginning.\n        //! Make sure that data is zero-terminated.\n        //! <br><br>\n        //! Document can be parsed into multiple times.\n        //! Each new call to parse removes previous nodes and attributes (if any), but does not clear memory pool.\n        //! \\param text XML data to parse; pointer is non-const to denote fact that this data may be modified by the parser.\n        template<int Flags>\n        void parse(Ch *text)\n        {\n            assert(text);\n\n            // Remove current contents\n            this->remove_all_nodes();\n            this->remove_all_attributes();\n\n            // Parse BOM, if any\n            parse_bom<Flags>(text);\n\n            // Parse children\n            while (1)\n            {\n                // Skip whitespace before node\n                skip<whitespace_pred, Flags>(text);\n                if (*text == 0)\n                    break;\n\n                // Parse and append new child\n                if (*text == Ch('<'))\n                {\n                    ++text;     // Skip '<'\n                    if (xml_node<Ch> *node = parse_node<Flags>(text))\n                        this->append_node(node);\n                }\n                else\n                    CEREAL_RAPIDXML_PARSE_ERROR(\"expected <\", text);\n            }\n\n        }\n\n        //! Clears the document by deleting all nodes and clearing the memory pool.\n        //! All nodes owned by document pool are destroyed.\n        void clear()\n        {\n            this->remove_all_nodes();\n            this->remove_all_attributes();\n            memory_pool<Ch>::clear();\n        }\n\n    private:\n\n        ///////////////////////////////////////////////////////////////////////\n        // Internal character utility functions\n\n        // Detect whitespace character\n        struct whitespace_pred\n        {\n            static unsigned char test(Ch ch)\n            {\n                return internal::lookup_tables<0>::lookup_whitespace[static_cast<unsigned char>(ch)];\n            }\n        };\n\n        // Detect node name character\n        struct node_name_pred\n        {\n            static unsigned char test(Ch ch)\n            {\n                return internal::lookup_tables<0>::lookup_node_name[static_cast<unsigned char>(ch)];\n            }\n        };\n\n        // Detect attribute name character\n        struct attribute_name_pred\n        {\n            static unsigned char test(Ch ch)\n            {\n                return internal::lookup_tables<0>::lookup_attribute_name[static_cast<unsigned char>(ch)];\n            }\n        };\n\n        // Detect text character (PCDATA)\n        struct text_pred\n        {\n            static unsigned char test(Ch ch)\n            {\n                return internal::lookup_tables<0>::lookup_text[static_cast<unsigned char>(ch)];\n            }\n        };\n\n        // Detect text character (PCDATA) that does not require processing\n        struct text_pure_no_ws_pred\n        {\n            static unsigned char test(Ch ch)\n            {\n                return internal::lookup_tables<0>::lookup_text_pure_no_ws[static_cast<unsigned char>(ch)];\n            }\n        };\n\n        // Detect text character (PCDATA) that does not require processing\n        struct text_pure_with_ws_pred\n        {\n            static unsigned char test(Ch ch)\n            {\n                return internal::lookup_tables<0>::lookup_text_pure_with_ws[static_cast<unsigned char>(ch)];\n            }\n        };\n\n        // Detect attribute value character\n        template<Ch Quote>\n        struct attribute_value_pred\n        {\n            static unsigned char test(Ch ch)\n            {\n                if (Quote == Ch('\\''))\n                    return internal::lookup_tables<0>::lookup_attribute_data_1[static_cast<unsigned char>(ch)];\n                if (Quote == Ch('\\\"'))\n                    return internal::lookup_tables<0>::lookup_attribute_data_2[static_cast<unsigned char>(ch)];\n                return 0;       // Should never be executed, to avoid warnings on Comeau\n            }\n        };\n\n        // Detect attribute value character\n        template<Ch Quote>\n        struct attribute_value_pure_pred\n        {\n            static unsigned char test(Ch ch)\n            {\n                if (Quote == Ch('\\''))\n                    return internal::lookup_tables<0>::lookup_attribute_data_1_pure[static_cast<unsigned char>(ch)];\n                if (Quote == Ch('\\\"'))\n                    return internal::lookup_tables<0>::lookup_attribute_data_2_pure[static_cast<unsigned char>(ch)];\n                return 0;       // Should never be executed, to avoid warnings on Comeau\n            }\n        };\n\n        // Insert coded character, using UTF8 or 8-bit ASCII\n        template<int Flags>\n        static void insert_coded_character(Ch *&text, unsigned long code)\n        {\n            if (Flags & parse_no_utf8)\n            {\n                // Insert 8-bit ASCII character\n                // Todo: possibly verify that code is less than 256 and use replacement char otherwise?\n                text[0] = static_cast<Ch>(code);\n                text += 1;\n            }\n            else\n            {\n                // Insert UTF8 sequence\n                if (code < 0x80)    // 1 byte sequence\n                {\n\t                text[0] = static_cast<Ch>(code);\n                    text += 1;\n                }\n                else if (code < 0x800)  // 2 byte sequence\n                {\n\t                text[1] = static_cast<Ch>((code | 0x80) & 0xBF); code >>= 6;\n\t                text[0] = static_cast<Ch>(code | 0xC0);\n                    text += 2;\n                }\n\t            else if (code < 0x10000)    // 3 byte sequence\n                {\n\t                text[2] = static_cast<Ch>((code | 0x80) & 0xBF); code >>= 6;\n\t                text[1] = static_cast<Ch>((code | 0x80) & 0xBF); code >>= 6;\n\t                text[0] = static_cast<Ch>(code | 0xE0);\n                    text += 3;\n                }\n\t            else if (code < 0x110000)   // 4 byte sequence\n                {\n\t                text[3] = static_cast<Ch>((code | 0x80) & 0xBF); code >>= 6;\n\t                text[2] = static_cast<Ch>((code | 0x80) & 0xBF); code >>= 6;\n\t                text[1] = static_cast<Ch>((code | 0x80) & 0xBF); code >>= 6;\n\t                text[0] = static_cast<Ch>(code | 0xF0);\n                    text += 4;\n                }\n                else    // Invalid, only codes up to 0x10FFFF are allowed in Unicode\n                {\n                    CEREAL_RAPIDXML_PARSE_ERROR(\"invalid numeric character entity\", text);\n                }\n            }\n        }\n\n        // Skip characters until predicate evaluates to true\n        template<class StopPred, int Flags>\n        static void skip(Ch *&text)\n        {\n            Ch *tmp = text;\n            while (StopPred::test(*tmp))\n                ++tmp;\n            text = tmp;\n        }\n\n        // Skip characters until predicate evaluates to true while doing the following:\n        // - replacing XML character entity references with proper characters (&apos; &amp; &quot; &lt; &gt; &#...;)\n        // - condensing whitespace sequences to single space character\n        template<class StopPred, class StopPredPure, int Flags>\n        static Ch *skip_and_expand_character_refs(Ch *&text, bool preserve_space)\n        {\n            // If entity translation, whitespace condense and whitespace trimming is disabled, use plain skip\n            if (Flags & parse_no_entity_translation &&\n                !(Flags & parse_normalize_whitespace) &&\n                !(Flags & parse_trim_whitespace))\n            {\n                skip<StopPred, Flags>(text);\n                return text;\n            }\n\n            // Use simple skip until first modification is detected\n            skip<StopPredPure, Flags>(text);\n\n            // Use translation skip\n            Ch *src = text;\n            Ch *dest = src;\n            while (StopPred::test(*src))\n            {\n                // If entity translation is enabled\n                if (!(Flags & parse_no_entity_translation))\n                {\n                    // Test if replacement is needed\n                    if (src[0] == Ch('&'))\n                    {\n                        switch (src[1])\n                        {\n\n                        // &amp; &apos;\n                        case Ch('a'):\n                            if (src[2] == Ch('m') && src[3] == Ch('p') && src[4] == Ch(';'))\n                            {\n                                *dest = Ch('&');\n                                ++dest;\n                                src += 5;\n                                continue;\n                            }\n                            if (src[2] == Ch('p') && src[3] == Ch('o') && src[4] == Ch('s') && src[5] == Ch(';'))\n                            {\n                                *dest = Ch('\\'');\n                                ++dest;\n                                src += 6;\n                                continue;\n                            }\n                            break;\n\n                        // &quot;\n                        case Ch('q'):\n                            if (src[2] == Ch('u') && src[3] == Ch('o') && src[4] == Ch('t') && src[5] == Ch(';'))\n                            {\n                                *dest = Ch('\"');\n                                ++dest;\n                                src += 6;\n                                continue;\n                            }\n                            break;\n\n                        // &gt;\n                        case Ch('g'):\n                            if (src[2] == Ch('t') && src[3] == Ch(';'))\n                            {\n                                *dest = Ch('>');\n                                ++dest;\n                                src += 4;\n                                continue;\n                            }\n                            break;\n\n                        // &lt;\n                        case Ch('l'):\n                            if (src[2] == Ch('t') && src[3] == Ch(';'))\n                            {\n                                *dest = Ch('<');\n                                ++dest;\n                                src += 4;\n                                continue;\n                            }\n                            break;\n\n                        // &#...; - assumes ASCII\n                        case Ch('#'):\n                            if (src[2] == Ch('x'))\n                            {\n                                unsigned long code = 0;\n                                src += 3;   // Skip &#x\n                                while (1)\n                                {\n                                    unsigned char digit = internal::lookup_tables<0>::lookup_digits[static_cast<unsigned char>(*src)];\n                                    if (digit == 0xFF)\n                                        break;\n                                    code = code * 16 + digit;\n                                    ++src;\n                                }\n                                insert_coded_character<Flags>(dest, code);    // Put character in output\n                            }\n                            else\n                            {\n                                unsigned long code = 0;\n                                src += 2;   // Skip &#\n                                while (1)\n                                {\n                                    unsigned char digit = internal::lookup_tables<0>::lookup_digits[static_cast<unsigned char>(*src)];\n                                    if (digit == 0xFF)\n                                        break;\n                                    code = code * 10 + digit;\n                                    ++src;\n                                }\n                                insert_coded_character<Flags>(dest, code);    // Put character in output\n                            }\n                            if (*src == Ch(';'))\n                                ++src;\n                            else\n                                CEREAL_RAPIDXML_PARSE_ERROR(\"expected ;\", src);\n                            continue;\n\n                        // Something else\n                        default:\n                            // Ignore, just copy '&' verbatim\n                            break;\n\n                        }\n                    }\n                }\n\n                // If whitespace condensing is enabled\n                if ((Flags & parse_normalize_whitespace) && !preserve_space)\n                {\n                    // Test if condensing is needed\n                    if (whitespace_pred::test(*src))\n                    {\n                        *dest = Ch(' '); ++dest;    // Put single space in dest\n                        ++src;                      // Skip first whitespace char\n                        // Skip remaining whitespace chars\n                        while (whitespace_pred::test(*src))\n                            ++src;\n                        continue;\n                    }\n                }\n\n                // No replacement, only copy character\n                *dest++ = *src++;\n\n            }\n\n            // Return new end\n            text = src;\n            return dest;\n\n        }\n\n        ///////////////////////////////////////////////////////////////////////\n        // Internal parsing functions\n\n        // Parse BOM, if any\n        template<int Flags>\n        void parse_bom(Ch *&text)\n        {\n            // UTF-8?\n            if (static_cast<unsigned char>(text[0]) == 0xEF &&\n                static_cast<unsigned char>(text[1]) == 0xBB &&\n                static_cast<unsigned char>(text[2]) == 0xBF)\n            {\n                text += 3;      // Skup utf-8 bom\n            }\n        }\n\n        // Parse XML declaration (<?xml...)\n        template<int Flags>\n        xml_node<Ch> *parse_xml_declaration(Ch *&text)\n        {\n            // If parsing of declaration is disabled\n            if (!(Flags & parse_declaration_node))\n            {\n                // Skip until end of declaration\n                while (text[0] != Ch('?') || text[1] != Ch('>'))\n                {\n                    if (!text[0])\n                        CEREAL_RAPIDXML_PARSE_ERROR(\"unexpected end of data\", text);\n                    ++text;\n                }\n                text += 2;    // Skip '?>'\n                return 0;\n            }\n\n            // Create declaration\n            xml_node<Ch> *declaration = this->allocate_node(node_declaration);\n\n            // Skip whitespace before attributes or ?>\n            skip<whitespace_pred, Flags>(text);\n\n            // Parse declaration attributes\n            parse_node_attributes<Flags>(text, declaration);\n\n            // Skip ?>\n            if (text[0] != Ch('?') || text[1] != Ch('>'))\n                CEREAL_RAPIDXML_PARSE_ERROR(\"expected ?>\", text);\n            text += 2;\n\n            return declaration;\n        }\n\n        // Parse XML comment (<!--...)\n        template<int Flags>\n        xml_node<Ch> *parse_comment(Ch *&text)\n        {\n            // If parsing of comments is disabled\n            if (!(Flags & parse_comment_nodes))\n            {\n                // Skip until end of comment\n                while (text[0] != Ch('-') || text[1] != Ch('-') || text[2] != Ch('>'))\n                {\n                    if (!text[0])\n                        CEREAL_RAPIDXML_PARSE_ERROR(\"unexpected end of data\", text);\n                    ++text;\n                }\n                text += 3;     // Skip '-->'\n                return 0;      // Do not produce comment node\n            }\n\n            // Remember value start\n            Ch *value_ = text;\n\n            // Skip until end of comment\n            while (text[0] != Ch('-') || text[1] != Ch('-') || text[2] != Ch('>'))\n            {\n                if (!text[0])\n                    CEREAL_RAPIDXML_PARSE_ERROR(\"unexpected end of data\", text);\n                ++text;\n            }\n\n            // Create comment node\n            xml_node<Ch> *comment = this->allocate_node(node_comment);\n            comment->value(value_, static_cast<std::size_t>(text - value_));\n\n            // Place zero terminator after comment value\n            if (!(Flags & parse_no_string_terminators))\n                *text = Ch('\\0');\n\n            text += 3;     // Skip '-->'\n            return comment;\n        }\n\n        // Parse DOCTYPE\n        template<int Flags>\n        xml_node<Ch> *parse_doctype(Ch *&text)\n        {\n            // Remember value start\n            Ch *value_ = text;\n\n            // Skip to >\n            while (*text != Ch('>'))\n            {\n                // Determine character type\n                switch (*text)\n                {\n\n                // If '[' encountered, scan for matching ending ']' using naive algorithm with depth\n                // This works for all W3C test files except for 2 most wicked\n                case Ch('['):\n                {\n                    ++text;     // Skip '['\n                    int depth = 1;\n                    while (depth > 0)\n                    {\n                        switch (*text)\n                        {\n                            case Ch('['): ++depth; break;\n                            case Ch(']'): --depth; break;\n                            case 0: CEREAL_RAPIDXML_PARSE_ERROR(\"unexpected end of data\", text);\n                        }\n                        ++text;\n                    }\n                    break;\n                }\n\n                // Error on end of text\n                case Ch('\\0'):\n                    CEREAL_RAPIDXML_PARSE_ERROR(\"unexpected end of data\", text);\n\n                // Other character, skip it\n                default:\n                    ++text;\n\n                }\n            }\n\n            // If DOCTYPE nodes enabled\n            if (Flags & parse_doctype_node)\n            {\n                // Create a new doctype node\n                xml_node<Ch> *doctype = this->allocate_node(node_doctype);\n                doctype->value(value_, static_cast<std::size_t>(text - value_));\n\n                // Place zero terminator after value\n                if (!(Flags & parse_no_string_terminators))\n                    *text = Ch('\\0');\n\n                text += 1;      // skip '>'\n                return doctype;\n            }\n            else\n            {\n                text += 1;      // skip '>'\n                return 0;\n            }\n\n        }\n\n        // Parse PI\n        template<int Flags>\n        xml_node<Ch> *parse_pi(Ch *&text)\n        {\n            // If creation of PI nodes is enabled\n            if (Flags & parse_pi_nodes)\n            {\n                // Create pi node\n                xml_node<Ch> *pi = this->allocate_node(node_pi);\n\n                // Extract PI target name\n                Ch *name_ = text;\n                skip<node_name_pred, Flags>(text);\n                if (text == name_)\n                    CEREAL_RAPIDXML_PARSE_ERROR(\"expected PI target\", text);\n                pi->name(name_, static_cast<std::size_t>(text - name_));\n\n                // Skip whitespace between pi target and pi\n                skip<whitespace_pred, Flags>(text);\n\n                // Remember start of pi\n                Ch *value_ = text;\n\n                // Skip to '?>'\n                while (text[0] != Ch('?') || text[1] != Ch('>'))\n                {\n                    if (*text == Ch('\\0'))\n                        CEREAL_RAPIDXML_PARSE_ERROR(\"unexpected end of data\", text);\n                    ++text;\n                }\n\n                // Set pi value (verbatim, no entity expansion or whitespace normalization)\n                pi->value(value_, static_cast<std::size_t>(text - value_));\n\n                // Place zero terminator after name and value\n                if (!(Flags & parse_no_string_terminators))\n                {\n                    pi->name()[pi->name_size()] = Ch('\\0');\n                    pi->value()[pi->value_size()] = Ch('\\0');\n                }\n\n                text += 2;                          // Skip '?>'\n                return pi;\n            }\n            else\n            {\n                // Skip to '?>'\n                while (text[0] != Ch('?') || text[1] != Ch('>'))\n                {\n                    if (*text == Ch('\\0'))\n                        CEREAL_RAPIDXML_PARSE_ERROR(\"unexpected end of data\", text);\n                    ++text;\n                }\n                text += 2;    // Skip '?>'\n                return 0;\n            }\n        }\n\n        // Parse and append data\n        // Return character that ends data.\n        // This is necessary because this character might have been overwritten by a terminating 0\n        template<int Flags>\n        Ch parse_and_append_data(xml_node<Ch> *node, Ch *&text, Ch *contents_start)\n        {\n            // Backup to contents start if whitespace trimming is disabled\n            if (!(Flags & parse_trim_whitespace))\n                text = contents_start;\n\n            const bool preserve_space =  internal::preserve_space(node);\n\n            // Skip until end of data\n            Ch *value_ = text, *end;\n            if ((Flags & parse_normalize_whitespace) && !preserve_space)\n                end = skip_and_expand_character_refs<text_pred, text_pure_with_ws_pred, Flags>(text, false);\n            else\n                end = skip_and_expand_character_refs<text_pred, text_pure_no_ws_pred, Flags>(text, preserve_space);\n\n            // Trim trailing whitespace if flag is set; leading was already trimmed by whitespace skip after >\n            if ((Flags & parse_trim_whitespace) && !preserve_space)\n            {\n                if (Flags & parse_normalize_whitespace)\n                {\n                    // Whitespace is already condensed to single space characters by skipping function, so just trim 1 char off the end\n                    if (*(end - 1) == Ch(' '))\n                        --end;\n                }\n                else\n                {\n                    // Backup until non-whitespace character is found\n                    while (whitespace_pred::test(*(end - 1)))\n                        --end;\n                }\n            }\n\n            // If characters are still left between end and value (this test is only necessary if normalization is enabled)\n            // Create new data node\n            if (!(Flags & parse_no_data_nodes))\n            {\n                xml_node<Ch> *data = this->allocate_node(node_data);\n                data->value(value_, static_cast<std::size_t>(end - value_));\n                node->append_node(data);\n            }\n\n            // Add data to parent node if no data exists yet\n            if (!(Flags & parse_no_element_values))\n                if (*node->value() == Ch('\\0'))\n                    node->value(value_, static_cast<std::size_t>(end - value_));\n\n            // Place zero terminator after value\n            if (!(Flags & parse_no_string_terminators))\n            {\n                Ch ch = *text;\n                *end = Ch('\\0');\n                return ch;      // Return character that ends data; this is required because zero terminator overwritten it\n            }\n\n            // Return character that ends data\n            return *text;\n        }\n\n        // Parse CDATA\n        template<int Flags>\n        xml_node<Ch> *parse_cdata(Ch *&text)\n        {\n            // If CDATA is disabled\n            if (Flags & parse_no_data_nodes)\n            {\n                // Skip until end of cdata\n                while (text[0] != Ch(']') || text[1] != Ch(']') || text[2] != Ch('>'))\n                {\n                    if (!text[0])\n                        CEREAL_RAPIDXML_PARSE_ERROR(\"unexpected end of data\", text);\n                    ++text;\n                }\n                text += 3;      // Skip ]]>\n                return 0;       // Do not produce CDATA node\n            }\n\n            // Skip until end of cdata\n            Ch *value_ = text;\n            while (text[0] != Ch(']') || text[1] != Ch(']') || text[2] != Ch('>'))\n            {\n                if (!text[0])\n                    CEREAL_RAPIDXML_PARSE_ERROR(\"unexpected end of data\", text);\n                ++text;\n            }\n\n            // Create new cdata node\n            xml_node<Ch> *cdata = this->allocate_node(node_cdata);\n            cdata->value(value_, static_cast<std::size_t>(text - value_));\n\n            // Place zero terminator after value\n            if (!(Flags & parse_no_string_terminators))\n                *text = Ch('\\0');\n\n            text += 3;      // Skip ]]>\n            return cdata;\n        }\n\n        // Parse element node\n        template<int Flags>\n        xml_node<Ch> *parse_element(Ch *&text)\n        {\n            // Create element node\n            xml_node<Ch> *element = this->allocate_node(node_element);\n\n            // Extract element name\n            Ch *name_ = text;\n            skip<node_name_pred, Flags>(text);\n            if (text == name_)\n                CEREAL_RAPIDXML_PARSE_ERROR(\"expected element name\", text);\n            element->name(name_, static_cast<std::size_t>(text - name_));\n\n            // Skip whitespace between element name and attributes or >\n            skip<whitespace_pred, Flags>(text);\n\n            // Parse attributes, if any\n            parse_node_attributes<Flags>(text, element);\n\n            // Determine ending type\n            if (*text == Ch('>'))\n            {\n                ++text;\n                parse_node_contents<Flags>(text, element);\n            }\n            else if (*text == Ch('/'))\n            {\n                ++text;\n                if (*text != Ch('>'))\n                    CEREAL_RAPIDXML_PARSE_ERROR(\"expected >\", text);\n                ++text;\n            }\n            else\n                CEREAL_RAPIDXML_PARSE_ERROR(\"expected >\", text);\n\n            // Place zero terminator after name\n            if (!(Flags & parse_no_string_terminators))\n                element->name()[element->name_size()] = Ch('\\0');\n\n            // Return parsed element\n            return element;\n        }\n\n        // Determine node type, and parse it\n        template<int Flags>\n        xml_node<Ch> *parse_node(Ch *&text)\n        {\n            // Parse proper node type\n            switch (text[0])\n            {\n\n            // <...\n            default:\n                // Parse and append element node\n                return parse_element<Flags>(text);\n\n            // <?...\n            case Ch('?'):\n                ++text;     // Skip ?\n                if ((text[0] == Ch('x') || text[0] == Ch('X')) &&\n                    (text[1] == Ch('m') || text[1] == Ch('M')) &&\n                    (text[2] == Ch('l') || text[2] == Ch('L')) &&\n                    whitespace_pred::test(text[3]))\n                {\n                    // '<?xml ' - xml declaration\n                    text += 4;      // Skip 'xml '\n                    return parse_xml_declaration<Flags>(text);\n                }\n                else\n                {\n                    // Parse PI\n                    return parse_pi<Flags>(text);\n                }\n\n            // <!...\n            case Ch('!'):\n\n                // Parse proper subset of <! node\n                switch (text[1])\n                {\n\n                // <!-\n                case Ch('-'):\n                    if (text[2] == Ch('-'))\n                    {\n                        // '<!--' - xml comment\n                        text += 3;     // Skip '!--'\n                        return parse_comment<Flags>(text);\n                    }\n                    break;\n\n                // <![\n                case Ch('['):\n                    if (text[2] == Ch('C') && text[3] == Ch('D') && text[4] == Ch('A') &&\n                        text[5] == Ch('T') && text[6] == Ch('A') && text[7] == Ch('['))\n                    {\n                        // '<![CDATA[' - cdata\n                        text += 8;     // Skip '![CDATA['\n                        return parse_cdata<Flags>(text);\n                    }\n                    break;\n\n                // <!D\n                case Ch('D'):\n                    if (text[2] == Ch('O') && text[3] == Ch('C') && text[4] == Ch('T') &&\n                        text[5] == Ch('Y') && text[6] == Ch('P') && text[7] == Ch('E') &&\n                        whitespace_pred::test(text[8]))\n                    {\n                        // '<!DOCTYPE ' - doctype\n                        text += 9;      // skip '!DOCTYPE '\n                        return parse_doctype<Flags>(text);\n                    }\n\n                }   // switch\n\n                // Attempt to skip other, unrecognized node types starting with <!\n                ++text;     // Skip !\n                while (*text != Ch('>'))\n                {\n                    if (*text == 0)\n                        CEREAL_RAPIDXML_PARSE_ERROR(\"unexpected end of data\", text);\n                    ++text;\n                }\n                ++text;     // Skip '>'\n                return 0;   // No node recognized\n\n            }\n        }\n\n        // Parse contents of the node - children, data etc.\n        template<int Flags>\n        void parse_node_contents(Ch *&text, xml_node<Ch> *node)\n        {\n            // For all children and text\n            while (1)\n            {\n                // Skip whitespace between > and node contents\n                Ch *contents_start = text;      // Store start of node contents before whitespace is skipped\n                skip<whitespace_pred, Flags>(text);\n                Ch next_char = *text;\n\n            // After data nodes, instead of continuing the loop, control jumps here.\n            // This is because zero termination inside parse_and_append_data() function\n            // would wreak havoc with the above code.\n            // Also, skipping whitespace after data nodes is unnecessary.\n            after_data_node:\n\n                // Determine what comes next: node closing, child node, data node, or 0?\n                switch (next_char)\n                {\n\n                // Node closing or child node\n                case Ch('<'):\n                    if (text[1] == Ch('/'))\n                    {\n                        Ch *contents_end = 0;\n                        if (internal::preserve_space(node))\n                        {\n                            contents_end = text;\n                        }\n\n                        // Node closing\n                        text += 2;      // Skip '</'\n                        if (Flags & parse_validate_closing_tags)\n                        {\n                            // Skip and validate closing tag name\n                            Ch *closing_name = text;\n                            skip<node_name_pred, Flags>(text);\n                            if (!internal::compare(node->name(), node->name_size(), closing_name, static_cast<std::size_t>(text - closing_name), true))\n                                CEREAL_RAPIDXML_PARSE_ERROR(\"invalid closing tag name\", text);\n                        }\n                        else\n                        {\n                            // No validation, just skip name\n                            skip<node_name_pred, Flags>(text);\n                        }\n                        // Skip remaining whitespace after node name\n                        skip<whitespace_pred, Flags>(text);\n                        if (*text != Ch('>'))\n                            CEREAL_RAPIDXML_PARSE_ERROR(\"expected >\", text);\n                        ++text;     // Skip '>'\n\n                        if (contents_end && contents_end != contents_start)\n                        {\n                            node->value(contents_start, static_cast<std::size_t>(contents_end - contents_start));\n                            node->value()[node->value_size()] = Ch('\\0');\n                        }\n                        return;     // Node closed, finished parsing contents\n                    }\n                    else\n                    {\n                        // Child node\n                        ++text;     // Skip '<'\n                        if (xml_node<Ch> *child = parse_node<Flags>(text))\n                            node->append_node(child);\n                    }\n                    break;\n\n                // End of data - error\n                case Ch('\\0'):\n                    CEREAL_RAPIDXML_PARSE_ERROR(\"unexpected end of data\", text);\n\n                // Data node\n                default:\n                    next_char = parse_and_append_data<Flags>(node, text, contents_start);\n                    goto after_data_node;   // Bypass regular processing after data nodes\n\n                }\n            }\n        }\n\n        // Parse XML attributes of the node\n        template<int Flags>\n        void parse_node_attributes(Ch *&text, xml_node<Ch> *node)\n        {\n            // For all attributes\n            while (attribute_name_pred::test(*text))\n            {\n                // Extract attribute name\n                Ch *name_ = text;\n                ++text;     // Skip first character of attribute name\n                skip<attribute_name_pred, Flags>(text);\n                if (text == name_)\n                    CEREAL_RAPIDXML_PARSE_ERROR(\"expected attribute name\", name_);\n\n                // Create new attribute\n                xml_attribute<Ch> *attribute = this->allocate_attribute();\n                attribute->name(name_, static_cast<std::size_t>(text - name_));\n                node->append_attribute(attribute);\n\n                // Skip whitespace after attribute name\n                skip<whitespace_pred, Flags>(text);\n\n                // Skip =\n                if (*text != Ch('='))\n                    CEREAL_RAPIDXML_PARSE_ERROR(\"expected =\", text);\n                ++text;\n\n                // Add terminating zero after name\n                if (!(Flags & parse_no_string_terminators))\n                    attribute->name()[attribute->name_size()] = 0;\n\n                // Skip whitespace after =\n                skip<whitespace_pred, Flags>(text);\n\n                // Skip quote and remember if it was ' or \"\n                Ch quote = *text;\n                if (quote != Ch('\\'') && quote != Ch('\"'))\n                    CEREAL_RAPIDXML_PARSE_ERROR(\"expected ' or \\\"\", text);\n                ++text;\n\n                // Extract attribute value and expand char refs in it\n                Ch *value_ = text, *end;\n                const int AttFlags = Flags & ~parse_normalize_whitespace;   // No whitespace normalization in attributes\n                if (quote == Ch('\\''))\n                    end = skip_and_expand_character_refs<attribute_value_pred<Ch('\\'')>, attribute_value_pure_pred<Ch('\\'')>, AttFlags>(text, false);\n                else\n                    end = skip_and_expand_character_refs<attribute_value_pred<Ch('\"')>, attribute_value_pure_pred<Ch('\"')>, AttFlags>(text, false);\n\n                // Set attribute value\n                attribute->value(value_, static_cast<std::size_t>(end - value_));\n\n                // Make sure that end quote is present\n                if (*text != quote)\n                    CEREAL_RAPIDXML_PARSE_ERROR(\"expected ' or \\\"\", text);\n                ++text;     // Skip quote\n\n                // Add terminating zero after value\n                if (!(Flags & parse_no_string_terminators))\n                    attribute->value()[attribute->value_size()] = 0;\n\n                // Skip whitespace after attribute value\n                skip<whitespace_pred, Flags>(text);\n            }\n        }\n\n    };\n\n    //! \\cond internal\n    namespace internal\n    {\n\n        // Whitespace (space \\n \\r \\t)\n        template<int Dummy>\n        const unsigned char lookup_tables<Dummy>::lookup_whitespace[256] =\n        {\n          // 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F\n             0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  0,  1,  0,  0,  // 0\n             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  // 1\n             1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  // 2\n             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  // 3\n             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  // 4\n             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  // 5\n             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  // 6\n             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  // 7\n             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  // 8\n             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  // 9\n             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  // A\n             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  // B\n             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  // C\n             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  // D\n             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  // E\n             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0   // F\n        };\n\n        // Node name (anything but space \\n \\r \\t / > ? \\0)\n        template<int Dummy>\n        const unsigned char lookup_tables<Dummy>::lookup_node_name[256] =\n        {\n          // 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F\n             0,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  1,  1,  0,  1,  1,  // 0\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 1\n             0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  // 2\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  // 3\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 4\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 5\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 6\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 7\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 8\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 9\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // A\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // B\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // C\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // D\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // E\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1   // F\n        };\n\n        // Text (i.e. PCDATA) (anything but < \\0)\n        template<int Dummy>\n        const unsigned char lookup_tables<Dummy>::lookup_text[256] =\n        {\n          // 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F\n             0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 0\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 1\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 2\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  // 3\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 4\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 5\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 6\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 7\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 8\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 9\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // A\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // B\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // C\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // D\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // E\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1   // F\n        };\n\n        // Text (i.e. PCDATA) that does not require processing when ws normalization is disabled\n        // (anything but < \\0 &)\n        template<int Dummy>\n        const unsigned char lookup_tables<Dummy>::lookup_text_pure_no_ws[256] =\n        {\n          // 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F\n             0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 0\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 1\n             1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 2\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  // 3\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 4\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 5\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 6\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 7\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 8\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 9\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // A\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // B\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // C\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // D\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // E\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1   // F\n        };\n\n        // Text (i.e. PCDATA) that does not require processing when ws normalizationis is enabled\n        // (anything but < \\0 & space \\n \\r \\t)\n        template<int Dummy>\n        const unsigned char lookup_tables<Dummy>::lookup_text_pure_with_ws[256] =\n        {\n          // 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F\n             0,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  1,  1,  0,  1,  1,  // 0\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 1\n             0,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 2\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  // 3\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 4\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 5\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 6\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 7\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 8\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 9\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // A\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // B\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // C\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // D\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // E\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1   // F\n        };\n\n        // Attribute name (anything but space \\n \\r \\t / < > = ? ! \\0)\n        template<int Dummy>\n        const unsigned char lookup_tables<Dummy>::lookup_attribute_name[256] =\n        {\n          // 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F\n             0,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  1,  1,  0,  1,  1,  // 0\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 1\n             0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  // 2\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  // 3\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 4\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 5\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 6\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 7\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 8\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 9\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // A\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // B\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // C\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // D\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // E\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1   // F\n        };\n\n        // Attribute data with single quote (anything but ' \\0)\n        template<int Dummy>\n        const unsigned char lookup_tables<Dummy>::lookup_attribute_data_1[256] =\n        {\n          // 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F\n             0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 0\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 1\n             1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  1,  // 2\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 3\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 4\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 5\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 6\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 7\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 8\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 9\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // A\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // B\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // C\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // D\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // E\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1   // F\n        };\n\n        // Attribute data with single quote that does not require processing (anything but ' \\0 &)\n        template<int Dummy>\n        const unsigned char lookup_tables<Dummy>::lookup_attribute_data_1_pure[256] =\n        {\n          // 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F\n             0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 0\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 1\n             1,  1,  1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  // 2\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 3\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 4\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 5\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 6\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 7\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 8\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 9\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // A\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // B\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // C\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // D\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // E\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1   // F\n        };\n\n        // Attribute data with double quote (anything but \" \\0)\n        template<int Dummy>\n        const unsigned char lookup_tables<Dummy>::lookup_attribute_data_2[256] =\n        {\n          // 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F\n             0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 0\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 1\n             1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 2\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 3\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 4\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 5\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 6\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 7\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 8\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 9\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // A\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // B\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // C\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // D\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // E\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1   // F\n        };\n\n        // Attribute data with double quote that does not require processing (anything but \" \\0 &)\n        template<int Dummy>\n        const unsigned char lookup_tables<Dummy>::lookup_attribute_data_2_pure[256] =\n        {\n          // 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F\n             0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 0\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 1\n             1,  1,  0,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 2\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 3\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 4\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 5\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 6\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 7\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 8\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // 9\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // A\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // B\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // C\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // D\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  // E\n             1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1   // F\n        };\n\n        // Digits (dec and hex, 255 denotes end of numeric character reference)\n        template<int Dummy>\n        const unsigned char lookup_tables<Dummy>::lookup_digits[256] =\n        {\n          // 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F\n           255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  // 0\n           255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  // 1\n           255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  // 2\n             0,  1,  2,  3,  4,  5,  6,  7,  8,  9,255,255,255,255,255,255,  // 3\n           255, 10, 11, 12, 13, 14, 15,255,255,255,255,255,255,255,255,255,  // 4\n           255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  // 5\n           255, 10, 11, 12, 13, 14, 15,255,255,255,255,255,255,255,255,255,  // 6\n           255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  // 7\n           255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  // 8\n           255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  // 9\n           255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  // A\n           255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  // B\n           255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  // C\n           255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  // D\n           255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  // E\n           255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255   // F\n        };\n\n        // Upper case conversion\n        template<int Dummy>\n        const unsigned char lookup_tables<Dummy>::lookup_upcase[256] =\n        {\n          // 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  A   B   C   D   E   F\n           0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15,   // 0\n           16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,   // 1\n           32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,   // 2\n           48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,   // 3\n           64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,   // 4\n           80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,   // 5\n           96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,   // 6\n           80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 123,124,125,126,127,  // 7\n           128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,  // 8\n           144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,  // 9\n           160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,  // A\n           176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,  // B\n           192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,  // C\n           208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,  // D\n           224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,  // E\n           240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255   // F\n        };\n    }\n    //! \\endcond\n\n}\n} // end namespace cereal\n\n// Undefine internal macros\n#undef CEREAL_RAPIDXML_PARSE_ERROR\n\n// On MSVC, restore warnings state\n#ifdef _MSC_VER\n    #pragma warning(pop)\n#endif\n\n#endif\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidxml/rapidxml_iterators.hpp",
    "content": "#ifndef CEREAL_RAPIDXML_ITERATORS_HPP_INCLUDED\n#define CEREAL_RAPIDXML_ITERATORS_HPP_INCLUDED\n\n// Copyright (C) 2006, 2009 Marcin Kalicinski\n// Version 1.13\n// Revision $DateTime: 2009/05/13 01:46:17 $\n\n#include \"rapidxml.hpp\"\n\nnamespace cereal {\nnamespace rapidxml\n{\n\n    //! Iterator of child nodes of xml_node\n    template<class Ch>\n    class node_iterator\n    {\n\n    public:\n\n        typedef typename xml_node<Ch> value_type;\n        typedef typename xml_node<Ch> &reference;\n        typedef typename xml_node<Ch> *pointer;\n        typedef std::ptrdiff_t difference_type;\n        typedef std::bidirectional_iterator_tag iterator_category;\n\n        node_iterator()\n            : m_node(0)\n        {\n        }\n\n        node_iterator(xml_node<Ch> *node)\n            : m_node(node->first_node())\n        {\n        }\n\n        reference operator *() const\n        {\n            assert(m_node);\n            return *m_node;\n        }\n\n        pointer operator->() const\n        {\n            assert(m_node);\n            return m_node;\n        }\n\n        node_iterator& operator++()\n        {\n            assert(m_node);\n            m_node = m_node->next_sibling();\n            return *this;\n        }\n\n        node_iterator operator++(int)\n        {\n            node_iterator tmp = *this;\n            ++this;\n            return tmp;\n        }\n\n        node_iterator& operator--()\n        {\n            assert(m_node && m_node->previous_sibling());\n            m_node = m_node->previous_sibling();\n            return *this;\n        }\n\n        node_iterator operator--(int)\n        {\n            node_iterator tmp = *this;\n            ++this;\n            return tmp;\n        }\n\n        bool operator ==(const node_iterator<Ch> &rhs)\n        {\n            return m_node == rhs.m_node;\n        }\n\n        bool operator !=(const node_iterator<Ch> &rhs)\n        {\n            return m_node != rhs.m_node;\n        }\n\n    private:\n\n        xml_node<Ch> *m_node;\n\n    };\n\n    //! Iterator of child attributes of xml_node\n    template<class Ch>\n    class attribute_iterator\n    {\n\n    public:\n\n        typedef typename xml_attribute<Ch> value_type;\n        typedef typename xml_attribute<Ch> &reference;\n        typedef typename xml_attribute<Ch> *pointer;\n        typedef std::ptrdiff_t difference_type;\n        typedef std::bidirectional_iterator_tag iterator_category;\n\n        attribute_iterator()\n            : m_attribute(0)\n        {\n        }\n\n        attribute_iterator(xml_node<Ch> *node)\n            : m_attribute(node->first_attribute())\n        {\n        }\n\n        reference operator *() const\n        {\n            assert(m_attribute);\n            return *m_attribute;\n        }\n\n        pointer operator->() const\n        {\n            assert(m_attribute);\n            return m_attribute;\n        }\n\n        attribute_iterator& operator++()\n        {\n            assert(m_attribute);\n            m_attribute = m_attribute->next_attribute();\n            return *this;\n        }\n\n        attribute_iterator operator++(int)\n        {\n            attribute_iterator tmp = *this;\n            ++this;\n            return tmp;\n        }\n\n        attribute_iterator& operator--()\n        {\n            assert(m_attribute && m_attribute->previous_attribute());\n            m_attribute = m_attribute->previous_attribute();\n            return *this;\n        }\n\n        attribute_iterator operator--(int)\n        {\n            attribute_iterator tmp = *this;\n            ++this;\n            return tmp;\n        }\n\n        bool operator ==(const attribute_iterator<Ch> &rhs)\n        {\n            return m_attribute == rhs.m_attribute;\n        }\n\n        bool operator !=(const attribute_iterator<Ch> &rhs)\n        {\n            return m_attribute != rhs.m_attribute;\n        }\n\n    private:\n\n        xml_attribute<Ch> *m_attribute;\n\n    };\n\n}\n} // namespace cereal\n\n#endif\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidxml/rapidxml_print.hpp",
    "content": "#ifndef CEREAL_RAPIDXML_PRINT_HPP_INCLUDED\n#define CEREAL_RAPIDXML_PRINT_HPP_INCLUDED\n\n// Copyright (C) 2006, 2009 Marcin Kalicinski\n// Version 1.13\n// Revision $DateTime: 2009/05/13 01:46:17 $\n\n#include \"rapidxml.hpp\"\n\n// Only include streams if not disabled\n#ifndef CEREAL_RAPIDXML_NO_STREAMS\n    #include <ostream>\n    #include <iterator>\n#endif\n\nnamespace cereal {\nnamespace rapidxml\n{\n\n    ///////////////////////////////////////////////////////////////////////\n    // Printing flags\n\n    const int print_no_indenting = 0x1;   //!< Printer flag instructing the printer to suppress indenting of XML. See print() function.\n\n    ///////////////////////////////////////////////////////////////////////\n    // Internal\n\n    //! \\cond internal\n    namespace internal\n    {\n\n        ///////////////////////////////////////////////////////////////////////////\n        // Internal character operations\n\n        // Copy characters from given range to given output iterator\n        template<class OutIt, class Ch>\n        inline OutIt copy_chars(const Ch *begin, const Ch *end, OutIt out)\n        {\n            while (begin != end)\n                *out++ = *begin++;\n            return out;\n        }\n\n        // Copy characters from given range to given output iterator and expand\n        // characters into references (&lt; &gt; &apos; &quot; &amp;)\n        template<class OutIt, class Ch>\n        inline OutIt copy_and_expand_chars(const Ch *begin, const Ch *end, Ch noexpand, OutIt out)\n        {\n            while (begin != end)\n            {\n                if (*begin == noexpand)\n                {\n                    *out++ = *begin;    // No expansion, copy character\n                }\n                else\n                {\n                    switch (*begin)\n                    {\n                    case Ch('<'):\n                        *out++ = Ch('&'); *out++ = Ch('l'); *out++ = Ch('t'); *out++ = Ch(';');\n                        break;\n                    case Ch('>'):\n                        *out++ = Ch('&'); *out++ = Ch('g'); *out++ = Ch('t'); *out++ = Ch(';');\n                        break;\n                    case Ch('\\''):\n                        *out++ = Ch('&'); *out++ = Ch('a'); *out++ = Ch('p'); *out++ = Ch('o'); *out++ = Ch('s'); *out++ = Ch(';');\n                        break;\n                    case Ch('\"'):\n                        *out++ = Ch('&'); *out++ = Ch('q'); *out++ = Ch('u'); *out++ = Ch('o'); *out++ = Ch('t'); *out++ = Ch(';');\n                        break;\n                    case Ch('&'):\n                        *out++ = Ch('&'); *out++ = Ch('a'); *out++ = Ch('m'); *out++ = Ch('p'); *out++ = Ch(';');\n                        break;\n                    default:\n                        *out++ = *begin;    // No expansion, copy character\n                    }\n                }\n                ++begin;    // Step to next character\n            }\n            return out;\n        }\n\n        // Fill given output iterator with repetitions of the same character\n        template<class OutIt, class Ch>\n        inline OutIt fill_chars(OutIt out, int n, Ch ch)\n        {\n            for (int i = 0; i < n; ++i)\n                *out++ = ch;\n            return out;\n        }\n\n        // Find character\n        template<class Ch, Ch ch>\n        inline bool find_char(const Ch *begin, const Ch *end)\n        {\n            while (begin != end)\n                if (*begin++ == ch)\n                    return true;\n            return false;\n        }\n\n        ///////////////////////////////////////////////////////////////////////////\n        // Internal printing operations\n\n        // Print node\n        template<class OutIt, class Ch>\n        inline OutIt print_node(OutIt out, const xml_node<Ch> *node, int flags, int indent);\n\n        // Print children of the node\n        template<class OutIt, class Ch>\n        inline OutIt print_children(OutIt out, const xml_node<Ch> *node, int flags, int indent)\n        {\n            for (xml_node<Ch> *child = node->first_node(); child; child = child->next_sibling())\n                out = print_node(out, child, flags, indent);\n            return out;\n        }\n\n        // Print attributes of the node\n        template<class OutIt, class Ch>\n        inline OutIt print_attributes(OutIt out, const xml_node<Ch> *node, int /*flags*/)\n        {\n            for (xml_attribute<Ch> *attribute = node->first_attribute(); attribute; attribute = attribute->next_attribute())\n            {\n                if (attribute->name() && attribute->value())\n                {\n                    // Print attribute name\n                    *out = Ch(' '), ++out;\n                    out = copy_chars(attribute->name(), attribute->name() + attribute->name_size(), out);\n                    *out = Ch('='), ++out;\n                    // Print attribute value using appropriate quote type\n                    if (find_char<Ch, Ch('\"')>(attribute->value(), attribute->value() + attribute->value_size()))\n                    {\n                        *out = Ch('\\''), ++out;\n                        out = copy_and_expand_chars(attribute->value(), attribute->value() + attribute->value_size(), Ch('\"'), out);\n                        *out = Ch('\\''), ++out;\n                    }\n                    else\n                    {\n                        *out = Ch('\"'), ++out;\n                        out = copy_and_expand_chars(attribute->value(), attribute->value() + attribute->value_size(), Ch('\\''), out);\n                        *out = Ch('\"'), ++out;\n                    }\n                }\n            }\n            return out;\n        }\n\n        // Print data node\n        template<class OutIt, class Ch>\n        inline OutIt print_data_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)\n        {\n            assert(node->type() == node_data);\n            if (!(flags & print_no_indenting))\n                out = fill_chars(out, indent, Ch('\\t'));\n            out = copy_and_expand_chars(node->value(), node->value() + node->value_size(), Ch(0), out);\n            return out;\n        }\n\n        // Print data node\n        template<class OutIt, class Ch>\n        inline OutIt print_cdata_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)\n        {\n            assert(node->type() == node_cdata);\n            if (!(flags & print_no_indenting))\n                out = fill_chars(out, indent, Ch('\\t'));\n            *out = Ch('<'); ++out;\n            *out = Ch('!'); ++out;\n            *out = Ch('['); ++out;\n            *out = Ch('C'); ++out;\n            *out = Ch('D'); ++out;\n            *out = Ch('A'); ++out;\n            *out = Ch('T'); ++out;\n            *out = Ch('A'); ++out;\n            *out = Ch('['); ++out;\n            out = copy_chars(node->value(), node->value() + node->value_size(), out);\n            *out = Ch(']'); ++out;\n            *out = Ch(']'); ++out;\n            *out = Ch('>'); ++out;\n            return out;\n        }\n\n        // Print element node\n        template<class OutIt, class Ch>\n        inline OutIt print_element_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)\n        {\n            assert(node->type() == node_element);\n\n            // Print element name and attributes, if any\n            if (!(flags & print_no_indenting))\n                out = fill_chars(out, indent, Ch('\\t'));\n            *out = Ch('<'), ++out;\n            out = copy_chars(node->name(), node->name() + node->name_size(), out);\n            out = print_attributes(out, node, flags);\n\n            // If node is childless\n            if (node->value_size() == 0 && !node->first_node())\n            {\n                // Print childless node tag ending\n                *out = Ch('/'), ++out;\n                *out = Ch('>'), ++out;\n            }\n            else\n            {\n                // Print normal node tag ending\n                *out = Ch('>'), ++out;\n\n                // Test if node contains a single data node only (and no other nodes)\n                xml_node<Ch> *child = node->first_node();\n                if (!child)\n                {\n                    // If node has no children, only print its value without indenting\n                    out = copy_and_expand_chars(node->value(), node->value() + node->value_size(), Ch(0), out);\n                }\n                else if (child->next_sibling() == 0 && child->type() == node_data)\n                {\n                    // If node has a sole data child, only print its value without indenting\n                    out = copy_and_expand_chars(child->value(), child->value() + child->value_size(), Ch(0), out);\n                }\n                else\n                {\n                    // Print all children with full indenting\n                    if (!(flags & print_no_indenting))\n                        *out = Ch('\\n'), ++out;\n                    out = print_children(out, node, flags, indent + 1);\n                    if (!(flags & print_no_indenting))\n                        out = fill_chars(out, indent, Ch('\\t'));\n                }\n\n                // Print node end\n                *out = Ch('<'), ++out;\n                *out = Ch('/'), ++out;\n                out = copy_chars(node->name(), node->name() + node->name_size(), out);\n                *out = Ch('>'), ++out;\n            }\n            return out;\n        }\n\n        // Print declaration node\n        template<class OutIt, class Ch>\n        inline OutIt print_declaration_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)\n        {\n            // Print declaration start\n            if (!(flags & print_no_indenting))\n                out = fill_chars(out, indent, Ch('\\t'));\n            *out = Ch('<'), ++out;\n            *out = Ch('?'), ++out;\n            *out = Ch('x'), ++out;\n            *out = Ch('m'), ++out;\n            *out = Ch('l'), ++out;\n\n            // Print attributes\n            out = print_attributes(out, node, flags);\n\n            // Print declaration end\n            *out = Ch('?'), ++out;\n            *out = Ch('>'), ++out;\n\n            return out;\n        }\n\n        // Print comment node\n        template<class OutIt, class Ch>\n        inline OutIt print_comment_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)\n        {\n            assert(node->type() == node_comment);\n            if (!(flags & print_no_indenting))\n                out = fill_chars(out, indent, Ch('\\t'));\n            *out = Ch('<'), ++out;\n            *out = Ch('!'), ++out;\n            *out = Ch('-'), ++out;\n            *out = Ch('-'), ++out;\n            out = copy_chars(node->value(), node->value() + node->value_size(), out);\n            *out = Ch('-'), ++out;\n            *out = Ch('-'), ++out;\n            *out = Ch('>'), ++out;\n            return out;\n        }\n\n        // Print doctype node\n        template<class OutIt, class Ch>\n        inline OutIt print_doctype_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)\n        {\n            assert(node->type() == node_doctype);\n            if (!(flags & print_no_indenting))\n                out = fill_chars(out, indent, Ch('\\t'));\n            *out = Ch('<'), ++out;\n            *out = Ch('!'), ++out;\n            *out = Ch('D'), ++out;\n            *out = Ch('O'), ++out;\n            *out = Ch('C'), ++out;\n            *out = Ch('T'), ++out;\n            *out = Ch('Y'), ++out;\n            *out = Ch('P'), ++out;\n            *out = Ch('E'), ++out;\n            *out = Ch(' '), ++out;\n            out = copy_chars(node->value(), node->value() + node->value_size(), out);\n            *out = Ch('>'), ++out;\n            return out;\n        }\n\n        // Print pi node\n        template<class OutIt, class Ch>\n        inline OutIt print_pi_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)\n        {\n            assert(node->type() == node_pi);\n            if (!(flags & print_no_indenting))\n                out = fill_chars(out, indent, Ch('\\t'));\n            *out = Ch('<'), ++out;\n            *out = Ch('?'), ++out;\n            out = copy_chars(node->name(), node->name() + node->name_size(), out);\n            *out = Ch(' '), ++out;\n            out = copy_chars(node->value(), node->value() + node->value_size(), out);\n            *out = Ch('?'), ++out;\n            *out = Ch('>'), ++out;\n            return out;\n        }\n\n        // Print node\n        template<class OutIt, class Ch>\n        inline OutIt print_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)\n        {\n            // Print proper node type\n            switch (node->type())\n            {\n\n            // Document\n            case node_document:\n                out = print_children(out, node, flags, indent);\n                break;\n\n            // Element\n            case node_element:\n                out = print_element_node(out, node, flags, indent);\n                break;\n\n            // Data\n            case node_data:\n                out = print_data_node(out, node, flags, indent);\n                break;\n\n            // CDATA\n            case node_cdata:\n                out = print_cdata_node(out, node, flags, indent);\n                break;\n\n            // Declaration\n            case node_declaration:\n                out = print_declaration_node(out, node, flags, indent);\n                break;\n\n            // Comment\n            case node_comment:\n                out = print_comment_node(out, node, flags, indent);\n                break;\n\n            // Doctype\n            case node_doctype:\n                out = print_doctype_node(out, node, flags, indent);\n                break;\n\n            // Pi\n            case node_pi:\n                out = print_pi_node(out, node, flags, indent);\n                break;\n\n#ifndef __GNUC__\n                // Unknown\n            default:\n                assert(0);\n                break;\n#endif\n            }\n\n            // If indenting not disabled, add line break after node\n            if (!(flags & print_no_indenting))\n                *out = Ch('\\n'), ++out;\n\n            // Return modified iterator\n            return out;\n        }\n\n    }\n    //! \\endcond\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Printing\n\n    //! Prints XML to given output iterator.\n    //! \\param out Output iterator to print to.\n    //! \\param node Node to be printed. Pass xml_document to print entire document.\n    //! \\param flags Flags controlling how XML is printed.\n    //! \\return Output iterator pointing to position immediately after last character of printed text.\n    template<class OutIt, class Ch>\n    inline OutIt print(OutIt out, const xml_node<Ch> &node, int flags = 0)\n    {\n        return internal::print_node(out, &node, flags, 0);\n    }\n\n#ifndef CEREAL_RAPIDXML_NO_STREAMS\n\n    //! Prints XML to given output stream.\n    //! \\param out Output stream to print to.\n    //! \\param node Node to be printed. Pass xml_document to print entire document.\n    //! \\param flags Flags controlling how XML is printed.\n    //! \\return Output stream.\n    template<class Ch>\n    inline std::basic_ostream<Ch> &print(std::basic_ostream<Ch> &out, const xml_node<Ch> &node, int flags = 0)\n    {\n        print(std::ostream_iterator<Ch>(out), node, flags);\n        return out;\n    }\n\n    //! Prints formatted XML to given output stream. Uses default printing flags. Use print() function to customize printing process.\n    //! \\param out Output stream to print to.\n    //! \\param node Node to be printed.\n    //! \\return Output stream.\n    template<class Ch>\n    inline std::basic_ostream<Ch> &operator <<(std::basic_ostream<Ch> &out, const xml_node<Ch> &node)\n    {\n        return print(out, node);\n    }\n\n#endif\n\n}\n} // namespace cereal\n\n#endif\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/external/rapidxml/rapidxml_utils.hpp",
    "content": "#ifndef CEREAL_RAPIDXML_UTILS_HPP_INCLUDED\n#define CEREAL_RAPIDXML_UTILS_HPP_INCLUDED\n\n// Copyright (C) 2006, 2009 Marcin Kalicinski\n// Version 1.13\n// Revision $DateTime: 2009/05/13 01:46:17 $\n//! in certain simple scenarios. They should probably not be used if maximizing performance is the main objective.\n\n#include \"rapidxml.hpp\"\n#include <vector>\n#include <string>\n#include <fstream>\n#include <stdexcept>\n\nnamespace cereal {\nnamespace rapidxml\n{\n\n    //! Represents data loaded from a file\n    template<class Ch = char>\n    class file\n    {\n\n    public:\n\n        //! Loads file into the memory. Data will be automatically destroyed by the destructor.\n        //! \\param filename Filename to load.\n        file(const char *filename)\n        {\n            using namespace std;\n\n            // Open stream\n            basic_ifstream<Ch> stream(filename, ios::binary);\n            if (!stream)\n                throw runtime_error(string(\"cannot open file \") + filename);\n            stream.unsetf(ios::skipws);\n\n            // Determine stream size\n            stream.seekg(0, ios::end);\n            size_t size = stream.tellg();\n            stream.seekg(0);\n\n            // Load data and add terminating 0\n            m_data.resize(size + 1);\n            stream.read(&m_data.front(), static_cast<streamsize>(size));\n            m_data[size] = 0;\n        }\n\n        //! Loads file into the memory. Data will be automatically destroyed by the destructor\n        //! \\param stream Stream to load from\n        file(std::basic_istream<Ch> &stream)\n        {\n            using namespace std;\n\n            // Load data and add terminating 0\n            stream.unsetf(ios::skipws);\n            m_data.assign(istreambuf_iterator<Ch>(stream), istreambuf_iterator<Ch>());\n            if (stream.fail() || stream.bad())\n                throw runtime_error(\"error reading stream\");\n            m_data.push_back(0);\n        }\n\n        //! Gets file data.\n        //! \\return Pointer to data of file.\n        Ch *data()\n        {\n            return &m_data.front();\n        }\n\n        //! Gets file data.\n        //! \\return Pointer to data of file.\n        const Ch *data() const\n        {\n            return &m_data.front();\n        }\n\n        //! Gets file data size.\n        //! \\return Size of file data, in characters.\n        std::size_t size() const\n        {\n            return m_data.size();\n        }\n\n    private:\n\n        std::vector<Ch> m_data;   // File data\n\n    };\n\n    //! Counts children of node. Time complexity is O(n).\n    //! \\return Number of children of node\n    template<class Ch>\n    inline std::size_t count_children(xml_node<Ch> *node)\n    {\n        xml_node<Ch> *child = node->first_node();\n        std::size_t count = 0;\n        while (child)\n        {\n            ++count;\n            child = child->next_sibling();\n        }\n        return count;\n    }\n\n    //! Counts attributes of node. Time complexity is O(n).\n    //! \\return Number of attributes of node\n    template<class Ch>\n    inline std::size_t count_attributes(xml_node<Ch> *node)\n    {\n        xml_attribute<Ch> *attr = node->first_attribute();\n        std::size_t count = 0;\n        while (attr)\n        {\n            ++count;\n            attr = attr->next_attribute();\n        }\n        return count;\n    }\n\n}\n} // namespace cereal\n\n#endif\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/macros.hpp",
    "content": "/*! \\file macros.hpp\n    \\brief Preprocessor macros that can customise the cereal library\n\n    By default, cereal looks for serialization functions with very\n    specific names, that is: serialize, load, save, load_minimal,\n    or save_minimal.\n\n    This file allows an advanced user to change these names to conform\n    to some other style or preference.  This is implemented using\n    preprocessor macros.\n\n    As a result of this, in internal cereal code you will see macros\n    used for these function names.  In user code, you should name\n    the functions like you normally would and not use the macros\n    to improve readability.\n    \\ingroup utility */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef CEREAL_MACROS_HPP_\n#define CEREAL_MACROS_HPP_\n\n#ifndef CEREAL_THREAD_SAFE\n//! Whether cereal should be compiled for a threaded environment\n/*! This macro causes cereal to use mutexes to control access to\n    global internal state in a thread safe manner.\n\n    Note that even with this enabled you must still ensure that\n    archives are accessed by only one thread at a time; it is safe\n    to use multiple archives in paralel, but not to access one archive\n    from many places simultaneously. */\n#define CEREAL_THREAD_SAFE 0\n#endif // CEREAL_THREAD_SAFE\n\n#ifndef CEREAL_SIZE_TYPE\n//! Determines the data type used for size_type\n/*! cereal uses size_type to ensure that the serialized size of\n    dynamic containers is compatible across different architectures\n    (e.g. 32 vs 64 bit), which may use different underlying types for\n    std::size_t.\n\n    More information can be found in cereal/details/helpers.hpp.\n\n    If you choose to modify this type, ensure that you use a fixed\n    size type (e.g. uint32_t). */\n#define CEREAL_SIZE_TYPE uint64_t\n#endif // CEREAL_SIZE_TYPE\n\n// ######################################################################\n#ifndef CEREAL_SERIALIZE_FUNCTION_NAME\n//! The serialization/deserialization function name to search for.\n/*! You can define @c CEREAL_SERIALIZE_FUNCTION_NAME to be different assuming\n    you do so before this file is included. */\n#define CEREAL_SERIALIZE_FUNCTION_NAME serialize\n#endif // CEREAL_SERIALIZE_FUNCTION_NAME\n\n#ifndef CEREAL_LOAD_FUNCTION_NAME\n//! The deserialization (load) function name to search for.\n/*! You can define @c CEREAL_LOAD_FUNCTION_NAME to be different assuming you do so\n    before this file is included. */\n#define CEREAL_LOAD_FUNCTION_NAME load\n#endif // CEREAL_LOAD_FUNCTION_NAME\n\n#ifndef CEREAL_SAVE_FUNCTION_NAME\n//! The serialization (save) function name to search for.\n/*! You can define @c CEREAL_SAVE_FUNCTION_NAME to be different assuming you do so\n    before this file is included. */\n#define CEREAL_SAVE_FUNCTION_NAME save\n#endif // CEREAL_SAVE_FUNCTION_NAME\n\n#ifndef CEREAL_LOAD_MINIMAL_FUNCTION_NAME\n//! The deserialization (load_minimal) function name to search for.\n/*! You can define @c CEREAL_LOAD_MINIMAL_FUNCTION_NAME to be different assuming you do so\n    before this file is included. */\n#define CEREAL_LOAD_MINIMAL_FUNCTION_NAME load_minimal\n#endif // CEREAL_LOAD_MINIMAL_FUNCTION_NAME\n\n#ifndef CEREAL_SAVE_MINIMAL_FUNCTION_NAME\n//! The serialization (save_minimal) function name to search for.\n/*! You can define @c CEREAL_SAVE_MINIMAL_FUNCTION_NAME to be different assuming you do so\n    before this file is included. */\n#define CEREAL_SAVE_MINIMAL_FUNCTION_NAME save_minimal\n#endif // CEREAL_SAVE_MINIMAL_FUNCTION_NAME\n\n// ######################################################################\n//! Defines the CEREAL_NOEXCEPT macro to use instead of noexcept\n/*! If a compiler we support does not support noexcept, this macro\n    will detect this and define CEREAL_NOEXCEPT as a no-op\n    @internal */\n#if !defined(CEREAL_HAS_NOEXCEPT)\n  #if defined(__clang__)\n    #if __has_feature(cxx_noexcept)\n      #define CEREAL_HAS_NOEXCEPT\n    #endif\n  #else // NOT clang\n    #if defined(__GXX_EXPERIMENTAL_CXX0X__) && __GNUC__ * 10 + __GNUC_MINOR__ >= 46 || \\\n        defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023026\n      #define CEREAL_HAS_NOEXCEPT\n    #endif // end GCC/MSVC check\n  #endif // end NOT clang block\n\n  #ifndef CEREAL_NOEXCEPT\n    #ifdef CEREAL_HAS_NOEXCEPT\n      #define CEREAL_NOEXCEPT noexcept\n    #else\n      #define CEREAL_NOEXCEPT\n    #endif // end CEREAL_HAS_NOEXCEPT\n  #endif // end !defined(CEREAL_HAS_NOEXCEPT)\n#endif // ifndef CEREAL_NOEXCEPT\n\n// ######################################################################\n//! Checks if C++17 is available\n#if __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)\n#define CEREAL_HAS_CPP17\n#endif\n\n//! Checks if C++14 is available\n#if __cplusplus >= 201402L\n#define CEREAL_HAS_CPP14\n#endif\n\n// ######################################################################\n//! Defines the CEREAL_ALIGNOF macro to use instead of alignof\n#if defined(_MSC_VER) && _MSC_VER < 1900\n#define CEREAL_ALIGNOF __alignof\n#else // not MSVC 2013 or older\n#define CEREAL_ALIGNOF alignof\n#endif // end MSVC check\n\n#endif // CEREAL_MACROS_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/specialize.hpp",
    "content": "/*! \\file specialize.hpp\n    \\brief Serialization disambiguation */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef CEREAL_SPECIALIZE_HPP_\n#define CEREAL_SPECIALIZE_HPP_\n\nnamespace cereal\n{\n  // Forward declaration of access class that users can become friends with\n  class access;\n\n  // ######################################################################\n  //! A specifier used in conjunction with cereal::specialize to disambiguate\n  //! serialization in special cases\n  /*! @relates specialize\n      @ingroup Access */\n  enum class specialization\n  {\n    member_serialize,            //!< Force the use of a member serialize function\n    member_load_save,            //!< Force the use of a member load/save pair\n    member_load_save_minimal,    //!< Force the use of a member minimal load/save pair\n    non_member_serialize,        //!< Force the use of a non-member serialize function\n    non_member_load_save,        //!< Force the use of a non-member load/save pair\n    non_member_load_save_minimal //!< Force the use of a non-member minimal load/save pair\n  };\n\n  //! A class used to disambiguate cases where cereal cannot detect a unique way of serializing a class\n  /*! cereal attempts to figure out which method of serialization (member vs. non-member serialize\n      or load/save pair) at compile time.  If for some reason cereal cannot find a non-ambiguous way\n      of serializing a type, it will produce a static assertion complaining about this.\n\n      This can happen because you have both a serialize and load/save pair, or even because a base\n      class has a serialize (public or private with friend access) and a derived class does not\n      overwrite this due to choosing some other serialization type.\n\n      Specializing this class will tell cereal to explicitly use the serialization type you specify\n      and it will not complain about ambiguity in its compile time selection.  However, if cereal detects\n      an ambiguity in specializations, it will continue to issue a static assertion.\n\n      @code{.cpp}\n      class MyParent\n      {\n        friend class cereal::access;\n        template <class Archive>\n        void serialize( Archive & ar ) {}\n      };\n\n      // Although serialize is private in MyParent, to cereal::access it will look public,\n      // even through MyDerived\n      class MyDerived : public MyParent\n      {\n        public:\n          template <class Archive>\n          void load( Archive & ar ) {}\n\n          template <class Archive>\n          void save( Archive & ar ) {}\n      };\n\n      // The load/save pair in MyDerived is ambiguous because serialize in MyParent can\n      // be accessed from cereal::access.  This looks the same as making serialize public\n      // in MyParent, making it seem as though MyDerived has both a serialize and a load/save pair.\n      // cereal will complain about this at compile time unless we disambiguate:\n\n      namespace cereal\n      {\n        // This struct specialization will tell cereal which is the right way to serialize the ambiguity\n        template <class Archive> struct specialize<Archive, MyDerived, cereal::specialization::member_load_save> {};\n\n        // If we only had a disambiguation for a specific archive type, it would look something like this\n        template <> struct specialize<cereal::BinaryOutputArchive, MyDerived, cereal::specialization::member_load_save> {};\n      }\n      @endcode\n\n      You can also choose to use the macros CEREAL_SPECIALIZE_FOR_ALL_ARCHIVES or\n      CEREAL_SPECIALIZE_FOR_ARCHIVE if you want to type a little bit less.\n\n      @tparam T The type to specialize the serialization for\n      @tparam S The specialization type to use for T\n      @ingroup Access */\n  template <class Archive, class T, specialization S>\n  struct specialize : public std::false_type {};\n\n  //! Convenient macro for performing specialization for all archive types\n  /*! This performs specialization for the specific type for all types of archives.\n      This macro should be placed at the global namespace.\n\n      @code{cpp}\n      struct MyType {};\n      CEREAL_SPECIALIZE_FOR_ALL_ARCHIVES( MyType, cereal::specialization::member_load_save );\n      @endcode\n\n      @relates specialize\n      @ingroup Access */\n  #define CEREAL_SPECIALIZE_FOR_ALL_ARCHIVES( Type, Specialization )                                \\\n  namespace cereal { template <class Archive> struct specialize<Archive, Type, Specialization> {}; }\n\n  //! Convenient macro for performing specialization for a single archive type\n  /*! This performs specialization for the specific type for a single type of archive.\n      This macro should be placed at the global namespace.\n\n      @code{cpp}\n      struct MyType {};\n      CEREAL_SPECIALIZE_FOR_ARCHIVE( cereal::XMLInputArchive, MyType, cereal::specialization::member_load_save );\n      @endcode\n\n      @relates specialize\n      @ingroup Access */\n  #define CEREAL_SPECIALIZE_FOR_ARCHIVE( Archive, Type, Specialization )               \\\n  namespace cereal { template <> struct specialize<Archive, Type, Specialization> {}; }\n}\n\n#endif\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/array.hpp",
    "content": "/*! \\file array.hpp\n    \\brief Support for types found in \\<array\\>\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_ARRAY_HPP_\n#define CEREAL_TYPES_ARRAY_HPP_\n\n#include \"cereal/cereal.hpp\"\n#include <array>\n\nnamespace cereal\n{\n  //! Saving for std::array primitive types\n  //! using binary serialization, if supported\n  template <class Archive, class T, size_t N> inline\n  typename std::enable_if<traits::is_output_serializable<BinaryData<T>, Archive>::value\n                          && std::is_arithmetic<T>::value, void>::type\n  CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::array<T, N> const & array )\n  {\n    ar( binary_data( array.data(), sizeof(array) ) );\n  }\n\n  //! Loading for std::array primitive types\n  //! using binary serialization, if supported\n  template <class Archive, class T, size_t N> inline\n  typename std::enable_if<traits::is_input_serializable<BinaryData<T>, Archive>::value\n                          && std::is_arithmetic<T>::value, void>::type\n  CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::array<T, N> & array )\n  {\n    ar( binary_data( array.data(), sizeof(array) ) );\n  }\n\n  //! Saving for std::array all other types\n  template <class Archive, class T, size_t N> inline\n  typename std::enable_if<!traits::is_output_serializable<BinaryData<T>, Archive>::value\n                          || !std::is_arithmetic<T>::value, void>::type\n  CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::array<T, N> const & array )\n  {\n    for( auto const & i : array )\n      ar( i );\n  }\n\n  //! Loading for std::array all other types\n  template <class Archive, class T, size_t N> inline\n  typename std::enable_if<!traits::is_input_serializable<BinaryData<T>, Archive>::value\n                          || !std::is_arithmetic<T>::value, void>::type\n  CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::array<T, N> & array )\n  {\n    for( auto & i : array )\n      ar( i );\n  }\n} // namespace cereal\n\n#endif // CEREAL_TYPES_ARRAY_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/atomic.hpp",
    "content": "/*! \\file atomic.hpp\n    \\brief Support for types found in \\<atomic\\>\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_ATOMIC_HPP_\n#define CEREAL_TYPES_ATOMIC_HPP_\n\n#include <cereal/cereal.hpp>\n#include <atomic>\n\nnamespace cereal\n{\n  //! Serializing (save) for std::atomic\n  template <class Archive, class T> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::atomic<T> const & a )\n  {\n    ar( CEREAL_NVP_(\"atomic_data\", a.load()) );\n  }\n\n  //! Serializing (load) for std::atomic\n  template <class Archive, class T> inline\n  void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::atomic<T> & a )\n  {\n    T tmp;\n    ar( CEREAL_NVP_(\"atomic_data\", tmp) );\n    a.store( tmp );\n  }\n} // namespace cereal\n\n#endif // CEREAL_TYPES_ATOMIC_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/base_class.hpp",
    "content": "/*! \\file base_class.hpp\n    \\brief Support for base classes (virtual and non-virtual)\n    \\ingroup OtherTypes */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_BASE_CLASS_HPP_\n#define CEREAL_TYPES_BASE_CLASS_HPP_\n\n#include \"cereal/details/traits.hpp\"\n#include \"cereal/details/polymorphic_impl_fwd.hpp\"\n\nnamespace cereal\n{\n  namespace base_class_detail\n  {\n    //! Used to register polymorphic relations and avoid the need to include\n    //! polymorphic.hpp when no polymorphism is used\n    /*! @internal */\n    template <class Base, class Derived, bool IsPolymorphic = std::is_polymorphic<Base>::value>\n    struct RegisterPolymorphicBaseClass\n    {\n      static void bind()\n      { }\n    };\n\n    //! Polymorphic version\n    /*! @internal */\n    template <class Base, class Derived>\n    struct RegisterPolymorphicBaseClass<Base, Derived, true>\n    {\n      static void bind()\n      { detail::RegisterPolymorphicCaster<Base, Derived>::bind(); }\n    };\n  }\n\n  //! Casts a derived class to its non-virtual base class in a way that safely supports abstract classes\n  /*! This should be used in cases when a derived type needs to serialize its base type. This is better than directly\n      using static_cast, as it allows for serialization of pure virtual (abstract) base classes.\n\n      This also automatically registers polymorphic relation between the base and derived class, assuming they\n      are indeed polymorphic. Note this is not the same as polymorphic type registration. For more information\n      see the documentation on polymorphism. If using a polymorphic class, be sure to include support for\n      polymorphism (cereal/types/polymorphic.hpp).\n\n      \\sa virtual_base_class\n\n      @code{.cpp}\n      struct MyBase\n      {\n        int x;\n\n        virtual void foo() = 0;\n\n        template <class Archive>\n        void serialize( Archive & ar )\n        {\n          ar( x );\n        }\n      };\n\n      struct MyDerived : public MyBase //<-- Note non-virtual inheritance\n      {\n        int y;\n\n        virtual void foo() {};\n\n        template <class Archive>\n        void serialize( Archive & ar )\n        {\n          ar( cereal::base_class<MyBase>(this) );\n          ar( y );\n        }\n      };\n      @endcode */\n  template<class Base>\n    struct base_class : private traits::detail::BaseCastBase\n    {\n      template<class Derived>\n        base_class(Derived const * derived) :\n          base_ptr(const_cast<Base*>(static_cast<Base const *>(derived)))\n      {\n        static_assert( std::is_base_of<Base, Derived>::value, \"Can only use base_class on a valid base class\" );\n        base_class_detail::RegisterPolymorphicBaseClass<Base, Derived>::bind();\n      }\n\n        Base * base_ptr;\n    };\n\n  //! Casts a derived class to its virtual base class in a way that allows cereal to track inheritance\n  /*! This should be used in cases when a derived type features virtual inheritance from some\n      base type.  This allows cereal to track the inheritance and to avoid making duplicate copies\n      during serialization.\n\n      It is safe to use virtual_base_class in all circumstances for serializing base classes, even in cases\n      where virtual inheritance does not take place, though it may be slightly faster to utilize\n      cereal::base_class<> if you do not need to worry about virtual inheritance.\n\n      This also automatically registers polymorphic relation between the base and derived class, assuming they\n      are indeed polymorphic. Note this is not the same as polymorphic type registration. For more information\n      see the documentation on polymorphism. If using a polymorphic class, be sure to include support for\n      polymorphism (cereal/types/polymorphic.hpp).\n\n      \\sa base_class\n\n      @code{.cpp}\n      struct MyBase\n      {\n        int x;\n\n        template <class Archive>\n        void serialize( Archive & ar )\n        {\n          ar( x );\n        }\n      };\n\n      struct MyLeft : virtual MyBase //<-- Note the virtual inheritance\n      {\n        int y;\n\n        template <class Archive>\n        void serialize( Archive & ar )\n        {\n          ar( cereal::virtual_base_class<MyBase>( this ) );\n          ar( y );\n        }\n      };\n\n      struct MyRight : virtual MyBase\n      {\n        int z;\n\n        template <class Archive>\n        void serialize( Archive & ar )\n        {\n          ar( cereal::virtual_base_clas<MyBase>( this ) );\n          ar( z );\n        }\n      };\n\n      // diamond virtual inheritance; contains one copy of each base class\n      struct MyDerived : virtual MyLeft, virtual MyRight\n      {\n        int a;\n\n        template <class Archive>\n        void serialize( Archive & ar )\n        {\n          ar( cereal::virtual_base_class<MyLeft>( this ) );  // safely serialize data members in MyLeft\n          ar( cereal::virtual_base_class<MyRight>( this ) ); // safely serialize data members in MyRight\n          ar( a );\n\n          // Because we used virtual_base_class, cereal will ensure that only one instance of MyBase is\n          // serialized as we traverse the inheritance heirarchy. This means that there will be one copy\n          // each of the variables x, y, z, and a\n\n          // If we had chosen to use static_cast<> instead, cereal would perform no tracking and\n          // assume that every base class should be serialized (in this case leading to a duplicate\n          // serialization of MyBase due to diamond inheritance\n      };\n     }\n     @endcode */\n  template<class Base>\n    struct virtual_base_class : private traits::detail::BaseCastBase\n    {\n      template<class Derived>\n        virtual_base_class(Derived const * derived) :\n          base_ptr(const_cast<Base*>(static_cast<Base const *>(derived)))\n      {\n        static_assert( std::is_base_of<Base, Derived>::value, \"Can only use virtual_base_class on a valid base class\" );\n        base_class_detail::RegisterPolymorphicBaseClass<Base, Derived>::bind();\n      }\n\n        Base * base_ptr;\n    };\n\n} // namespace cereal\n\n#endif // CEREAL_TYPES_BASE_CLASS_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/bitset.hpp",
    "content": "/*! \\file bitset.hpp\n    \\brief Support for types found in \\<bitset\\>\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_BITSET_HPP_\n#define CEREAL_TYPES_BITSET_HPP_\n\n#include \"cereal/cereal.hpp\"\n#include \"cereal/types/string.hpp\"\n#include <bitset>\n\nnamespace cereal\n{\n  namespace bitset_detail\n  {\n    //! The type the bitset is encoded with\n    /*! @internal */\n    enum class type : uint8_t\n    {\n      ulong,\n      ullong,\n      string,\n      bits\n    };\n  }\n\n  //! Serializing (save) for std::bitset when BinaryData optimization supported\n  template <class Archive, size_t N,\n            traits::EnableIf<traits::is_output_serializable<BinaryData<std::uint32_t>, Archive>::value>\n            = traits::sfinae> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::bitset<N> const & bits )\n  {\n    ar( CEREAL_NVP_(\"type\", bitset_detail::type::bits) );\n\n    // Serialize 8 bit chunks\n    std::uint8_t chunk = 0;\n    std::uint8_t mask = 0x80;\n\n    // Set each chunk using a rotating mask for the current bit\n    for( std::size_t i = 0; i < N; ++i )\n    {\n      if( bits[i] )\n        chunk |= mask;\n\n      mask = static_cast<std::uint8_t>(mask >> 1);\n\n      // output current chunk when mask is empty (8 bits)\n      if( mask == 0 )\n      {\n        ar( chunk );\n        chunk = 0;\n        mask = 0x80;\n      }\n    }\n\n    // serialize remainder, if it exists\n    if( mask != 0x80 )\n      ar( chunk );\n  }\n\n  //! Serializing (save) for std::bitset when BinaryData is not supported\n  template <class Archive, size_t N,\n            traits::DisableIf<traits::is_output_serializable<BinaryData<std::uint32_t>, Archive>::value>\n            = traits::sfinae> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::bitset<N> const & bits )\n  {\n    try\n    {\n      auto const b = bits.to_ulong();\n      ar( CEREAL_NVP_(\"type\", bitset_detail::type::ulong) );\n      ar( CEREAL_NVP_(\"data\", b) );\n    }\n    catch( std::overflow_error const & )\n    {\n      try\n      {\n        auto const b = bits.to_ullong();\n        ar( CEREAL_NVP_(\"type\", bitset_detail::type::ullong) );\n        ar( CEREAL_NVP_(\"data\", b) );\n      }\n      catch( std::overflow_error const & )\n      {\n        ar( CEREAL_NVP_(\"type\", bitset_detail::type::string) );\n        ar( CEREAL_NVP_(\"data\", bits.to_string()) );\n      }\n    }\n  }\n\n  //! Serializing (load) for std::bitset\n  template <class Archive, size_t N> inline\n  void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::bitset<N> & bits )\n  {\n    bitset_detail::type t;\n    ar( CEREAL_NVP_(\"type\", t) );\n\n    switch( t )\n    {\n      case bitset_detail::type::ulong:\n      {\n        unsigned long b;\n        ar( CEREAL_NVP_(\"data\", b) );\n        bits = std::bitset<N>( b );\n        break;\n      }\n      case bitset_detail::type::ullong:\n      {\n        unsigned long long b;\n        ar( CEREAL_NVP_(\"data\", b) );\n        bits = std::bitset<N>( b );\n        break;\n      }\n      case bitset_detail::type::string:\n      {\n        std::string b;\n        ar( CEREAL_NVP_(\"data\", b) );\n        bits = std::bitset<N>( b );\n        break;\n      }\n      case bitset_detail::type::bits:\n      {\n        // Normally we would use BinaryData to route this at compile time,\n        // but doing this at runtime doesn't break any old serialization\n        std::uint8_t chunk = 0;\n        std::uint8_t mask  = 0;\n\n        bits.reset();\n\n        // Load one chunk at a time, rotating through the chunk\n        // to set bits in the bitset\n        for( std::size_t i = 0; i < N; ++i )\n        {\n          if( mask == 0 )\n          {\n            ar( chunk );\n            mask = 0x80;\n          }\n\n          if( chunk & mask )\n            bits[i] = 1;\n\n          mask = static_cast<std::uint8_t>(mask >> 1);\n        }\n        break;\n      }\n      default:\n        throw Exception(\"Invalid bitset data representation\");\n    }\n  }\n} // namespace cereal\n\n#endif // CEREAL_TYPES_BITSET_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/boost_variant.hpp",
    "content": "/*! \\file boost_variant.hpp\n    \\brief Support for boost::variant\n    \\ingroup OtherTypes */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_BOOST_VARIANT_HPP_\n#define CEREAL_TYPES_BOOST_VARIANT_HPP_\n\n//! @internal\n#if defined(_MSC_VER) && _MSC_VER < 1911\n#define CEREAL_CONSTEXPR_LAMBDA\n#else // MSVC 2017 or newer, all other compilers\n#define CEREAL_CONSTEXPR_LAMBDA constexpr\n#endif\n\n#include \"cereal/cereal.hpp\"\n#include <boost/variant/variant_fwd.hpp>\n#include <boost/variant/static_visitor.hpp>\n\nnamespace cereal\n{\n  namespace boost_variant_detail\n  {\n    //! @internal\n    template <class Archive>\n    struct variant_save_visitor : boost::static_visitor<>\n    {\n      variant_save_visitor(Archive & ar_) : ar(ar_) {}\n\n      template<class T>\n      void operator()(T const & value) const\n      {\n        ar( CEREAL_NVP_(\"data\", value) );\n      }\n\n      Archive & ar;\n    };\n\n    //! @internal\n    template <class Archive, class T>\n    struct LoadAndConstructLoadWrapper\n    {\n      using ST = typename std::aligned_storage<sizeof(T), CEREAL_ALIGNOF(T)>::type;\n\n      LoadAndConstructLoadWrapper() :\n        construct( reinterpret_cast<T *>( &st ) )\n      { }\n\n      ~LoadAndConstructLoadWrapper()\n      {\n        if (construct.itsValid)\n        {\n          construct->~T();\n        }\n      }\n\n      void CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar )\n      {\n        ::cereal::detail::Construct<T, Archive>::load_andor_construct( ar, construct );\n      }\n\n      ST st;\n      ::cereal::construct<T> construct;\n    };\n\n    //! @internal\n    template <class T> struct load_variant_wrapper;\n\n    //! Avoid serializing variant void_ type\n    /*! @internal */\n    template <>\n    struct load_variant_wrapper<boost::detail::variant::void_>\n    {\n      template <class Variant, class Archive>\n      static void load_variant( Archive &, Variant & )\n      { }\n    };\n\n    //! @internal\n    template <class T>\n    struct load_variant_wrapper\n    {\n      // default constructible\n      template <class Archive, class Variant>\n      static void load_variant_impl( Archive & ar, Variant & variant, std::true_type )\n      {\n        T value;\n        ar( CEREAL_NVP_(\"data\", value) );\n        variant = std::move(value);\n      }\n\n      // not default constructible\n      template<class Variant, class Archive>\n      static void load_variant_impl(Archive & ar, Variant & variant, std::false_type )\n      {\n        LoadAndConstructLoadWrapper<Archive, T> loadWrapper;\n\n        ar( CEREAL_NVP_(\"data\", loadWrapper) );\n        variant = std::move(*loadWrapper.construct.ptr());\n      }\n\n      //! @internal\n      template<class Variant, class Archive>\n      static void load_variant(Archive & ar, Variant & variant)\n      {\n        load_variant_impl( ar, variant, typename std::is_default_constructible<T>::type() );\n      }\n    };\n  } // namespace boost_variant_detail\n\n  //! Saving for boost::variant\n  template <class Archive, typename ... VariantTypes> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, boost::variant<VariantTypes...> const & variant )\n  {\n    int32_t which = variant.which();\n    ar( CEREAL_NVP_(\"which\", which) );\n    boost_variant_detail::variant_save_visitor<Archive> visitor(ar);\n    variant.apply_visitor(visitor);\n  }\n\n  //! Loading for boost::variant\n  template <class Archive, typename ... VariantTypes> inline\n  void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, boost::variant<VariantTypes...> & variant )\n  {\n    int32_t which;\n    ar( CEREAL_NVP_(\"which\", which) );\n\n    using LoadFuncType = void(*)(Archive &, boost::variant<VariantTypes...> &);\n    CEREAL_CONSTEXPR_LAMBDA LoadFuncType loadFuncArray[] = {&boost_variant_detail::load_variant_wrapper<VariantTypes>::load_variant...};\n\n    if(which >= int32_t(sizeof(loadFuncArray)/sizeof(loadFuncArray[0])))\n      throw Exception(\"Invalid 'which' selector when deserializing boost::variant\");\n\n    loadFuncArray[which](ar, variant);\n  }\n} // namespace cereal\n\n#undef CEREAL_CONSTEXPR_LAMBDA\n\n#endif // CEREAL_TYPES_BOOST_VARIANT_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/chrono.hpp",
    "content": "/*! \\file chrono.hpp\n    \\brief Support for types found in \\<chrono\\>\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_CHRONO_HPP_\n#define CEREAL_TYPES_CHRONO_HPP_\n\n#include <chrono>\n\nnamespace cereal\n{\n  //! Saving std::chrono::duration\n  template <class Archive, class R, class P> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::chrono::duration<R, P> const & dur )\n  {\n    ar( CEREAL_NVP_(\"count\", dur.count()) );\n  }\n\n  //! Loading std::chrono::duration\n  template <class Archive, class R, class P> inline\n  void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::chrono::duration<R, P> & dur )\n  {\n    R count;\n    ar( CEREAL_NVP_(\"count\", count) );\n\n    dur = std::chrono::duration<R, P>{count};\n  }\n\n  //! Saving std::chrono::time_point\n  template <class Archive, class C, class D> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::chrono::time_point<C, D> const & dur )\n  {\n    ar( CEREAL_NVP_(\"time_since_epoch\", dur.time_since_epoch()) );\n  }\n\n  //! Loading std::chrono::time_point\n  template <class Archive, class C, class D> inline\n  void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::chrono::time_point<C, D> & dur )\n  {\n    D elapsed;\n    ar( CEREAL_NVP_(\"time_since_epoch\", elapsed) );\n\n    dur = std::chrono::time_point<C, D>{elapsed};\n  }\n} // namespace cereal\n\n#endif // CEREAL_TYPES_CHRONO_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/common.hpp",
    "content": "/*! \\file common.hpp\n    \\brief Support common types - always included automatically\n    \\ingroup OtherTypes */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_COMMON_HPP_\n#define CEREAL_TYPES_COMMON_HPP_\n\n#include \"cereal/cereal.hpp\"\n\nnamespace cereal\n{\n  namespace common_detail\n  {\n    //! Serialization for arrays if BinaryData is supported and we are arithmetic\n    /*! @internal */\n    template <class Archive, class T> inline\n    void serializeArray( Archive & ar, T & array, std::true_type /* binary_supported */ )\n    {\n      ar( binary_data( array, sizeof(array) ) );\n    }\n\n    //! Serialization for arrays if BinaryData is not supported or we are not arithmetic\n    /*! @internal */\n    template <class Archive, class T> inline\n    void serializeArray( Archive & ar, T & array, std::false_type /* binary_supported */ )\n    {\n      for( auto & i : array )\n        ar( i );\n    }\n\n    namespace\n    {\n      //! Gets the underlying type of an enum\n      /*! @internal */\n      template <class T, bool IsEnum>\n      struct enum_underlying_type : std::false_type {};\n\n      //! Gets the underlying type of an enum\n      /*! Specialization for when we actually have an enum\n          @internal */\n      template <class T>\n      struct enum_underlying_type<T, true> { using type = typename std::underlying_type<T>::type; };\n    } // anon namespace\n\n    //! Checks if a type is an enum\n    /*! This is needed over simply calling std::is_enum because the type\n        traits checking at compile time will attempt to call something like\n        load_minimal with a special NoConvertRef struct that wraps up the true type.\n\n        This will strip away any of that and also expose the true underlying type.\n        @internal */\n    template <class T>\n    class is_enum\n    {\n      private:\n        using DecayedT  = typename std::decay<T>::type;\n        using StrippedT = typename ::cereal::traits::strip_minimal<DecayedT>::type;\n\n      public:\n        static const bool value = std::is_enum<StrippedT>::value;\n        using type = StrippedT;\n        using base_type = typename enum_underlying_type<StrippedT, value>::type;\n    };\n  }\n\n  //! Saving for enum types\n  template <class Archive, class T> inline\n  typename std::enable_if<common_detail::is_enum<T>::value,\n                          typename common_detail::is_enum<T>::base_type>::type\n  CEREAL_SAVE_MINIMAL_FUNCTION_NAME( Archive const &, T const & t )\n  {\n    return static_cast<typename common_detail::is_enum<T>::base_type>(t);\n  }\n\n  //! Loading for enum types\n  template <class Archive, class T> inline\n  typename std::enable_if<common_detail::is_enum<T>::value, void>::type\n  CEREAL_LOAD_MINIMAL_FUNCTION_NAME( Archive const &, T && t,\n                                     typename common_detail::is_enum<T>::base_type const & value )\n  {\n    t = reinterpret_cast<typename common_detail::is_enum<T>::type const &>( value );\n  }\n\n  //! Serialization for raw pointers\n  /*! This exists only to throw a static_assert to let users know we don't support raw pointers. */\n  template <class Archive, class T> inline\n  void CEREAL_SERIALIZE_FUNCTION_NAME( Archive &, T * & )\n  {\n    static_assert(cereal::traits::detail::delay_static_assert<T>::value,\n      \"Cereal does not support serializing raw pointers - please use a smart pointer\");\n  }\n\n  //! Serialization for C style arrays\n  template <class Archive, class T> inline\n  typename std::enable_if<std::is_array<T>::value, void>::type\n  CEREAL_SERIALIZE_FUNCTION_NAME(Archive & ar, T & array)\n  {\n    common_detail::serializeArray( ar, array,\n        std::integral_constant<bool, traits::is_output_serializable<BinaryData<T>, Archive>::value &&\n                                     std::is_arithmetic<typename std::remove_all_extents<T>::type>::value>() );\n  }\n} // namespace cereal\n\n#endif // CEREAL_TYPES_COMMON_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/complex.hpp",
    "content": "/*! \\file complex.hpp\n    \\brief Support for types found in \\<complex\\>\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_COMPLEX_HPP_\n#define CEREAL_TYPES_COMPLEX_HPP_\n\n#include <complex>\n\nnamespace cereal\n{\n  //! Serializing (save) for std::complex\n  template <class Archive, class T> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::complex<T> const & comp )\n  {\n    ar( CEREAL_NVP_(\"real\", comp.real()),\n        CEREAL_NVP_(\"imag\", comp.imag()) );\n  }\n\n  //! Serializing (load) for std::complex\n  template <class Archive, class T> inline\n  void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::complex<T> & bits )\n  {\n    T real, imag;\n    ar( CEREAL_NVP_(\"real\", real),\n        CEREAL_NVP_(\"imag\", imag) );\n    bits = {real, imag};\n  }\n} // namespace cereal\n\n#endif // CEREAL_TYPES_COMPLEX_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/concepts/pair_associative_container.hpp",
    "content": "/*! \\file pair_associative_container.hpp\n    \\brief Support for the PairAssociativeContainer refinement of the\n    AssociativeContainer concept.\n    \\ingroup TypeConcepts */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_CONCEPTS_PAIR_ASSOCIATIVE_CONTAINER_HPP_\n#define CEREAL_CONCEPTS_PAIR_ASSOCIATIVE_CONTAINER_HPP_\n\n#include \"cereal/cereal.hpp\"\n\nnamespace cereal\n{\n  //! Saving for std-like pair associative containers\n  template <class Archive, template <typename...> class Map, typename... Args, typename = typename Map<Args...>::mapped_type> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, Map<Args...> const & map )\n  {\n    ar( make_size_tag( static_cast<size_type>(map.size()) ) );\n\n    for( const auto & i : map )\n      ar( make_map_item(i.first, i.second) );\n  }\n\n  //! Loading for std-like pair associative containers\n  template <class Archive, template <typename...> class Map, typename... Args, typename = typename Map<Args...>::mapped_type> inline\n  void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, Map<Args...> & map )\n  {\n    size_type size;\n    ar( make_size_tag( size ) );\n\n    map.clear();\n\n    auto hint = map.begin();\n    for( size_t i = 0; i < size; ++i )\n    {\n      typename Map<Args...>::key_type key;\n      typename Map<Args...>::mapped_type value;\n\n      ar( make_map_item(key, value) );\n      #ifdef CEREAL_OLDER_GCC\n      hint = map.insert( hint, std::make_pair(std::move(key), std::move(value)) );\n      #else // NOT CEREAL_OLDER_GCC\n      hint = map.emplace_hint( hint, std::move( key ), std::move( value ) );\n      #endif // NOT CEREAL_OLDER_GCC\n    }\n  }\n} // namespace cereal\n\n#endif // CEREAL_CONCEPTS_PAIR_ASSOCIATIVE_CONTAINER_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/deque.hpp",
    "content": "/*! \\file deque.hpp\n    \\brief Support for types found in \\<deque\\>\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_DEQUE_HPP_\n#define CEREAL_TYPES_DEQUE_HPP_\n\n#include \"cereal/cereal.hpp\"\n#include <deque>\n\nnamespace cereal\n{\n  //! Saving for std::deque\n  template <class Archive, class T, class A> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::deque<T, A> const & deque )\n  {\n    ar( make_size_tag( static_cast<size_type>(deque.size()) ) );\n\n    for( auto const & i : deque )\n      ar( i );\n  }\n\n  //! Loading for std::deque\n  template <class Archive, class T, class A> inline\n  void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::deque<T, A> & deque )\n  {\n    size_type size;\n    ar( make_size_tag( size ) );\n\n    deque.resize( static_cast<size_t>( size ) );\n\n    for( auto & i : deque )\n      ar( i );\n  }\n} // namespace cereal\n\n#endif // CEREAL_TYPES_DEQUE_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/forward_list.hpp",
    "content": "/*! \\file forward_list.hpp\n    \\brief Support for types found in \\<forward_list\\>\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_FORWARD_LIST_HPP_\n#define CEREAL_TYPES_FORWARD_LIST_HPP_\n\n#include \"cereal/cereal.hpp\"\n#include <forward_list>\n\nnamespace cereal\n{\n  //! Saving for std::forward_list all other types\n  template <class Archive, class T, class A> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::forward_list<T, A> const & forward_list )\n  {\n    // write the size - note that this is slow because we need to traverse\n    // the entire list. there are ways we could avoid this but this was chosen\n    // since it works in the most general fashion with any archive type\n    size_type const size = std::distance( forward_list.begin(), forward_list.end() );\n\n    ar( make_size_tag( size ) );\n\n    // write the list\n    for( const auto & i : forward_list )\n      ar( i );\n  }\n\n  //! Loading for std::forward_list all other types from\n  template <class Archive, class T, class A>\n  void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::forward_list<T, A> & forward_list )\n  {\n    size_type size;\n    ar( make_size_tag( size ) );\n\n    forward_list.resize( static_cast<size_t>( size ) );\n\n    for( auto & i : forward_list )\n      ar( i );\n  }\n} // namespace cereal\n\n#endif // CEREAL_TYPES_FORWARD_LIST_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/functional.hpp",
    "content": "/*! \\file functional.hpp\n    \\brief Support for types found in \\<functional\\>\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2016, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_FUNCTIONAL_HPP_\n#define CEREAL_TYPES_FUNCTIONAL_HPP_\n\n#include <functional>\n\nnamespace cereal\n{\n  //! Saving for std::less\n  template <class Archive, class T> inline\n  void serialize( Archive &, std::less<T> & )\n  { }\n} // namespace cereal\n\n#endif // CEREAL_TYPES_FUNCTIONAL_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/list.hpp",
    "content": "/*! \\file list.hpp\n    \\brief Support for types found in \\<list\\>\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_LIST_HPP_\n#define CEREAL_TYPES_LIST_HPP_\n\n#include \"cereal/cereal.hpp\"\n#include <list>\n\nnamespace cereal\n{\n  //! Saving for std::list\n  template <class Archive, class T, class A> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::list<T, A> const & list )\n  {\n    ar( make_size_tag( static_cast<size_type>(list.size()) ) );\n\n    for( auto const & i : list )\n      ar( i );\n  }\n\n  //! Loading for std::list\n  template <class Archive, class T, class A> inline\n  void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::list<T, A> & list )\n  {\n    size_type size;\n    ar( make_size_tag( size ) );\n\n    list.resize( static_cast<size_t>( size ) );\n\n    for( auto & i : list )\n      ar( i );\n  }\n} // namespace cereal\n\n#endif // CEREAL_TYPES_LIST_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/map.hpp",
    "content": "/*! \\file map.hpp\n    \\brief Support for types found in \\<map\\>\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_MAP_HPP_\n#define CEREAL_TYPES_MAP_HPP_\n\n#include \"cereal/types/concepts/pair_associative_container.hpp\"\n#include <map>\n\n#endif // CEREAL_TYPES_MAP_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/memory.hpp",
    "content": "/*! \\file memory.hpp\n    \\brief Support for types found in \\<memory\\>\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_SHARED_PTR_HPP_\n#define CEREAL_TYPES_SHARED_PTR_HPP_\n\n#include \"cereal/cereal.hpp\"\n#include <memory>\n#include <cstring>\n\nnamespace cereal\n{\n  namespace memory_detail\n  {\n    //! A wrapper class to notify cereal that it is ok to serialize the contained pointer\n    /*! This mechanism allows us to intercept and properly handle polymorphic pointers\n        @internal */\n    template<class T>\n    struct PtrWrapper\n    {\n      PtrWrapper(T && p) : ptr(std::forward<T>(p)) {}\n      T & ptr;\n\n      PtrWrapper( PtrWrapper const & ) = default;\n      PtrWrapper & operator=( PtrWrapper const & ) = delete;\n    };\n\n    //! Make a PtrWrapper\n    /*! @internal */\n    template<class T> inline\n    PtrWrapper<T> make_ptr_wrapper(T && t)\n    {\n      return {std::forward<T>(t)};\n    }\n\n    //! A struct that acts as a wrapper around calling load_andor_construct\n    /*! The purpose of this is to allow a load_and_construct call to properly enter into the\n        'data' NVP of the ptr_wrapper\n        @internal */\n    template <class Archive, class T>\n    struct LoadAndConstructLoadWrapper\n    {\n      LoadAndConstructLoadWrapper( T * ptr ) :\n        construct( ptr )\n      { }\n\n      //! Constructor for embedding an early call for restoring shared_from_this\n      template <class F>\n      LoadAndConstructLoadWrapper( T * ptr, F && sharedFromThisFunc ) :\n        construct( ptr, sharedFromThisFunc )\n      { }\n\n      inline void CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar )\n      {\n        ::cereal::detail::Construct<T, Archive>::load_andor_construct( ar, construct );\n      }\n\n      ::cereal::construct<T> construct;\n    };\n\n    //! A helper struct for saving and restoring the state of types that derive from\n    //! std::enable_shared_from_this\n    /*! This special struct is necessary because when a user uses load_and_construct,\n        the weak_ptr (or whatever implementation defined variant) that allows\n        enable_shared_from_this to function correctly will not be initialized properly.\n\n        This internal weak_ptr can also be modified by the shared_ptr that is created\n        during the serialization of a polymorphic pointer, where cereal creates a\n        wrapper shared_ptr out of a void pointer to the real data.\n\n        In the case of load_and_construct, this happens because it is the allocation\n        of shared_ptr that perform this initialization, which we let happen on a buffer\n        of memory (aligned_storage).  This buffer is then used for placement new\n        later on, effectively overwriting any initialized weak_ptr with a default\n        initialized one, eventually leading to issues when the user calls shared_from_this.\n\n        To get around these issues, we will store the memory for the enable_shared_from_this\n        portion of the class and replace it after whatever happens to modify it (e.g. the\n        user performing construction or the wrapper shared_ptr in saving).\n\n        Note that this goes into undefined behavior territory, but as of the initial writing\n        of this, all standard library implementations of std::enable_shared_from_this are\n        compatible with this memory manipulation. It is entirely possible that this may someday\n        break or may not work with convoluted use cases.\n\n        Example usage:\n\n        @code{.cpp}\n        T * myActualPointer;\n        {\n          EnableSharedStateHelper<T> helper( myActualPointer ); // save the state\n          std::shared_ptr<T> myPtr( myActualPointer ); // modifies the internal weak_ptr\n          // helper restores state when it goes out of scope\n        }\n        @endcode\n\n        When possible, this is designed to be used in an RAII fashion - it will save state on\n        construction and restore it on destruction. The restore can be done at an earlier time\n        (e.g. after construct() is called in load_and_construct) in which case the destructor will\n        do nothing. Performing the restore immediately following construct() allows a user to call\n        shared_from_this within their load_and_construct function.\n\n        @tparam T Type pointed to by shared_ptr\n        @internal */\n    template <class T>\n    class EnableSharedStateHelper\n    {\n      // typedefs for parent type and storage type\n      using BaseType = typename ::cereal::traits::get_shared_from_this_base<T>::type;\n      using ParentType = std::enable_shared_from_this<BaseType>;\n      using StorageType = typename std::aligned_storage<sizeof(ParentType), CEREAL_ALIGNOF(ParentType)>::type;\n\n      public:\n        //! Saves the state of some type inheriting from enable_shared_from_this\n        /*! @param ptr The raw pointer held by the shared_ptr */\n        inline EnableSharedStateHelper( T * ptr ) :\n          itsPtr( static_cast<ParentType *>( ptr ) ),\n          itsState(),\n          itsRestored( false )\n        {\n          std::memcpy( &itsState, itsPtr, sizeof(ParentType) );\n        }\n\n        //! Restores the state of the held pointer (can only be done once)\n        inline void restore()\n        {\n          if( !itsRestored )\n          {\n            // void * cast needed when type has no trivial copy-assignment\n            std::memcpy( static_cast<void *>(itsPtr), &itsState, sizeof(ParentType) );\n            itsRestored = true;\n          }\n        }\n\n        //! Restores the state of the held pointer if not done previously\n        inline ~EnableSharedStateHelper()\n        {\n          restore();\n        }\n\n      private:\n        ParentType * itsPtr;\n        StorageType itsState;\n        bool itsRestored;\n    }; // end EnableSharedStateHelper\n\n    //! Performs loading and construction for a shared pointer that is derived from\n    //! std::enable_shared_from_this\n    /*! @param ar The archive\n        @param ptr Raw pointer held by the shared_ptr\n        @internal */\n    template <class Archive, class T> inline\n    void loadAndConstructSharedPtr( Archive & ar, T * ptr, std::true_type /* has_shared_from_this */ )\n    {\n      memory_detail::EnableSharedStateHelper<T> state( ptr );\n      memory_detail::LoadAndConstructLoadWrapper<Archive, T> loadWrapper( ptr, [&](){ state.restore(); } );\n\n      // let the user perform their initialization, shared state will be restored as soon as construct()\n      // is called\n      ar( CEREAL_NVP_(\"data\", loadWrapper) );\n    }\n\n    //! Performs loading and construction for a shared pointer that is NOT derived from\n    //! std::enable_shared_from_this\n    /*! This is the typical case, where we simply pass the load wrapper to the\n        archive.\n\n        @param ar The archive\n        @param ptr Raw pointer held by the shared_ptr\n        @internal */\n    template <class Archive, class T> inline\n    void loadAndConstructSharedPtr( Archive & ar, T * ptr, std::false_type /* has_shared_from_this */ )\n    {\n      memory_detail::LoadAndConstructLoadWrapper<Archive, T> loadWrapper( ptr );\n      ar( CEREAL_NVP_(\"data\", loadWrapper) );\n    }\n  } // end namespace memory_detail\n\n  //! Saving std::shared_ptr for non polymorphic types\n  template <class Archive, class T> inline\n  typename std::enable_if<!std::is_polymorphic<T>::value, void>::type\n  CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::shared_ptr<T> const & ptr )\n  {\n    ar( CEREAL_NVP_(\"ptr_wrapper\", memory_detail::make_ptr_wrapper( ptr )) );\n  }\n\n  //! Loading std::shared_ptr, case when no user load and construct for non polymorphic types\n  template <class Archive, class T> inline\n  typename std::enable_if<!std::is_polymorphic<T>::value, void>::type\n  CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::shared_ptr<T> & ptr )\n  {\n    ar( CEREAL_NVP_(\"ptr_wrapper\", memory_detail::make_ptr_wrapper( ptr )) );\n  }\n\n  //! Saving std::weak_ptr for non polymorphic types\n  template <class Archive, class T> inline\n  typename std::enable_if<!std::is_polymorphic<T>::value, void>::type\n  CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::weak_ptr<T> const & ptr )\n  {\n    auto const sptr = ptr.lock();\n    ar( CEREAL_NVP_(\"ptr_wrapper\", memory_detail::make_ptr_wrapper( sptr )) );\n  }\n\n  //! Loading std::weak_ptr for non polymorphic types\n  template <class Archive, class T> inline\n  typename std::enable_if<!std::is_polymorphic<T>::value, void>::type\n  CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::weak_ptr<T> & ptr )\n  {\n    std::shared_ptr<T> sptr;\n    ar( CEREAL_NVP_(\"ptr_wrapper\", memory_detail::make_ptr_wrapper( sptr )) );\n    ptr = sptr;\n  }\n\n  //! Saving std::unique_ptr for non polymorphic types\n  template <class Archive, class T, class D> inline\n  typename std::enable_if<!std::is_polymorphic<T>::value, void>::type\n  CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::unique_ptr<T, D> const & ptr )\n  {\n    ar( CEREAL_NVP_(\"ptr_wrapper\", memory_detail::make_ptr_wrapper( ptr )) );\n  }\n\n  //! Loading std::unique_ptr, case when user provides load_and_construct for non polymorphic types\n  template <class Archive, class T, class D> inline\n  typename std::enable_if<!std::is_polymorphic<T>::value, void>::type\n  CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::unique_ptr<T, D> & ptr )\n  {\n    ar( CEREAL_NVP_(\"ptr_wrapper\", memory_detail::make_ptr_wrapper( ptr )) );\n  }\n\n  // ######################################################################\n  // Pointer wrapper implementations follow below\n\n  //! Saving std::shared_ptr (wrapper implementation)\n  /*! @internal */\n  template <class Archive, class T> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, memory_detail::PtrWrapper<std::shared_ptr<T> const &> const & wrapper )\n  {\n    auto & ptr = wrapper.ptr;\n\n    uint32_t id = ar.registerSharedPointer( ptr.get() );\n    ar( CEREAL_NVP_(\"id\", id) );\n\n    if( id & detail::msb_32bit )\n    {\n      ar( CEREAL_NVP_(\"data\", *ptr) );\n    }\n  }\n\n  //! Loading std::shared_ptr, case when user load and construct (wrapper implementation)\n  /*! @internal */\n  template <class Archive, class T> inline\n  typename std::enable_if<traits::has_load_and_construct<T, Archive>::value, void>::type\n  CEREAL_LOAD_FUNCTION_NAME( Archive & ar, memory_detail::PtrWrapper<std::shared_ptr<T> &> & wrapper )\n  {\n    uint32_t id;\n\n    ar( CEREAL_NVP_(\"id\", id) );\n\n    if( id & detail::msb_32bit )\n    {\n      // Storage type for the pointer - since we can't default construct this type,\n      // we'll allocate it using std::aligned_storage and use a custom deleter\n      using ST = typename std::aligned_storage<sizeof(T), CEREAL_ALIGNOF(T)>::type;\n\n      // Valid flag - set to true once construction finishes\n      //  This prevents us from calling the destructor on\n      //  uninitialized data.\n      auto valid = std::make_shared<bool>( false );\n\n      // Allocate our storage, which we will treat as\n      //  uninitialized until initialized with placement new\n      using NonConstT = typename std::remove_const<T>::type;\n      std::shared_ptr<NonConstT> ptr(reinterpret_cast<NonConstT *>(new ST()),\n          [=]( NonConstT * t )\n          {\n            if( *valid )\n              t->~T();\n\n            delete reinterpret_cast<ST *>( t );\n          } );\n\n      // Register the pointer\n      ar.registerSharedPointer( id, ptr );\n\n      // Perform the actual loading and allocation\n      memory_detail::loadAndConstructSharedPtr( ar, ptr.get(), typename ::cereal::traits::has_shared_from_this<NonConstT>::type() );\n\n      // Mark pointer as valid (initialized)\n      *valid = true;\n      wrapper.ptr = std::move(ptr);\n    }\n    else\n      wrapper.ptr = std::static_pointer_cast<T>(ar.getSharedPointer(id));\n  }\n\n  //! Loading std::shared_ptr, case when no user load and construct (wrapper implementation)\n  /*! @internal */\n  template <class Archive, class T> inline\n  typename std::enable_if<!traits::has_load_and_construct<T, Archive>::value, void>::type\n  CEREAL_LOAD_FUNCTION_NAME( Archive & ar, memory_detail::PtrWrapper<std::shared_ptr<T> &> & wrapper )\n  {\n    uint32_t id;\n\n    ar( CEREAL_NVP_(\"id\", id) );\n\n    if( id & detail::msb_32bit )\n    {\n      using NonConstT = typename std::remove_const<T>::type;\n      std::shared_ptr<NonConstT> ptr( detail::Construct<NonConstT, Archive>::load_andor_construct() );\n      ar.registerSharedPointer( id, ptr );\n      ar( CEREAL_NVP_(\"data\", *ptr) );\n      wrapper.ptr = std::move(ptr);\n    }\n    else\n      wrapper.ptr = std::static_pointer_cast<T>(ar.getSharedPointer(id));\n  }\n\n  //! Saving std::unique_ptr (wrapper implementation)\n  /*! @internal */\n  template <class Archive, class T, class D> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, memory_detail::PtrWrapper<std::unique_ptr<T, D> const &> const & wrapper )\n  {\n    auto & ptr = wrapper.ptr;\n\n    // unique_ptr get one byte of metadata which signifies whether they were a nullptr\n    // 0 == nullptr\n    // 1 == not null\n\n    if( !ptr )\n      ar( CEREAL_NVP_(\"valid\", uint8_t(0)) );\n    else\n    {\n      ar( CEREAL_NVP_(\"valid\", uint8_t(1)) );\n      ar( CEREAL_NVP_(\"data\", *ptr) );\n    }\n  }\n\n  //! Loading std::unique_ptr, case when user provides load_and_construct (wrapper implementation)\n  /*! @internal */\n  template <class Archive, class T, class D> inline\n  typename std::enable_if<traits::has_load_and_construct<T, Archive>::value, void>::type\n  CEREAL_LOAD_FUNCTION_NAME( Archive & ar, memory_detail::PtrWrapper<std::unique_ptr<T, D> &> & wrapper )\n  {\n    uint8_t isValid;\n    ar( CEREAL_NVP_(\"valid\", isValid) );\n\n    auto & ptr = wrapper.ptr;\n\n    if( isValid )\n    {\n      using NonConstT = typename std::remove_const<T>::type;\n      // Storage type for the pointer - since we can't default construct this type,\n      // we'll allocate it using std::aligned_storage\n      using ST = typename std::aligned_storage<sizeof(NonConstT), CEREAL_ALIGNOF(NonConstT)>::type;\n\n      // Allocate storage - note the ST type so that deleter is correct if\n      //                    an exception is thrown before we are initialized\n      std::unique_ptr<ST> stPtr( new ST() );\n\n      // Use wrapper to enter into \"data\" nvp of ptr_wrapper\n      memory_detail::LoadAndConstructLoadWrapper<Archive, NonConstT> loadWrapper( reinterpret_cast<NonConstT *>( stPtr.get() ) );\n\n      // Initialize storage\n      ar( CEREAL_NVP_(\"data\", loadWrapper) );\n\n      // Transfer ownership to correct unique_ptr type\n      ptr.reset( reinterpret_cast<T *>( stPtr.release() ) );\n    }\n    else\n      ptr.reset( nullptr );\n  }\n\n  //! Loading std::unique_ptr, case when no load_and_construct (wrapper implementation)\n  /*! @internal */\n  template <class Archive, class T, class D> inline\n  typename std::enable_if<!traits::has_load_and_construct<T, Archive>::value, void>::type\n  CEREAL_LOAD_FUNCTION_NAME( Archive & ar, memory_detail::PtrWrapper<std::unique_ptr<T, D> &> & wrapper )\n  {\n    uint8_t isValid;\n    ar( CEREAL_NVP_(\"valid\", isValid) );\n\n    if( isValid )\n    {\n      using NonConstT = typename std::remove_const<T>::type;\n      std::unique_ptr<NonConstT, D> ptr( detail::Construct<NonConstT, Archive>::load_andor_construct() );\n      ar( CEREAL_NVP_( \"data\", *ptr ) );\n      wrapper.ptr = std::move(ptr);\n    }\n    else\n    {\n      wrapper.ptr.reset( nullptr );\n    }\n  }\n} // namespace cereal\n\n// automatically include polymorphic support\n#include \"cereal/types/polymorphic.hpp\"\n\n#endif // CEREAL_TYPES_SHARED_PTR_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/optional.hpp",
    "content": "/*! \\file optional.hpp\n    \\brief Support for std::optional\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2017, Juan Pedro Bolivar Puente\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_STD_OPTIONAL_\n#define CEREAL_TYPES_STD_OPTIONAL_\n\n#include \"cereal/cereal.hpp\"\n#include <optional>\n\nnamespace cereal {\n  //! Saving for std::optional\n  template <class Archive, typename T> inline\n  void CEREAL_SAVE_FUNCTION_NAME(Archive& ar, const std::optional<T>& optional)\n  {\n    if(!optional) {\n      ar(CEREAL_NVP_(\"nullopt\", true));\n    } else {\n      ar(CEREAL_NVP_(\"nullopt\", false),\n         CEREAL_NVP_(\"data\", *optional));\n    }\n  }\n\n  //! Loading for std::optional\n  template <class Archive, typename T> inline\n  void CEREAL_LOAD_FUNCTION_NAME(Archive& ar, std::optional<T>& optional)\n  {\n    bool nullopt;\n    ar(CEREAL_NVP_(\"nullopt\", nullopt));\n\n    if (nullopt) {\n      optional = std::nullopt;\n    } else {\n      T value;\n      ar(CEREAL_NVP_(\"data\", value));\n      optional = std::move(value);\n    }\n  }\n} // namespace cereal\n\n#endif // CEREAL_TYPES_STD_OPTIONAL_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/polymorphic.hpp",
    "content": "/*! \\file polymorphic.hpp\n    \\brief Support for pointers to polymorphic base classes\n    \\ingroup OtherTypes */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_POLYMORPHIC_HPP_\n#define CEREAL_TYPES_POLYMORPHIC_HPP_\n\n#include \"cereal/cereal.hpp\"\n#include \"cereal/types/memory.hpp\"\n\n#include \"cereal/details/util.hpp\"\n#include \"cereal/details/helpers.hpp\"\n#include \"cereal/details/traits.hpp\"\n#include \"cereal/details/polymorphic_impl.hpp\"\n\n#ifdef _MSC_VER\n#define CEREAL_STATIC_CONSTEXPR static\n#else\n#define CEREAL_STATIC_CONSTEXPR static constexpr\n#endif\n\n//! Registers a derived polymorphic type with cereal\n/*! Polymorphic types must be registered before smart\n    pointers to them can be serialized.  Note that base\n    classes do not need to be registered.\n\n    Registering a type lets cereal know how to properly\n    serialize it when a smart pointer to a base object is\n    used in conjunction with a derived class.\n\n    This assumes that all relevant archives have also\n    previously been registered.  Registration for archives\n    is usually done in the header file in which they are\n    defined.  This means that type registration needs to\n    happen after specific archives to be used are included.\n\n    It is recommended that type registration be done in\n    the header file in which the type is declared.\n\n    Registration can also be placed in a source file,\n    but this may require the use of the\n    CEREAL_REGISTER_DYNAMIC_INIT macro (see below).\n\n    Registration may be called repeatedly for the same\n    type in different translation units to add support\n    for additional archives if they are not initially\n    available (included and registered).\n\n    When building serialization support as a DLL on\n    Windows, registration must happen in the header file.\n    On Linux and Mac things should still work properly\n    if placed in a source file, but see the above comments\n    on registering in source files.\n\n    Polymorphic support in cereal requires RTTI to be\n    enabled */\n#define CEREAL_REGISTER_TYPE(...)                                        \\\n  namespace cereal {                                                     \\\n  namespace detail {                                                     \\\n  template <>                                                            \\\n  struct binding_name<__VA_ARGS__>                                       \\\n  {                                                                      \\\n    CEREAL_STATIC_CONSTEXPR char const * name() { return #__VA_ARGS__; } \\\n  };                                                                     \\\n  } } /* end namespaces */                                               \\\n  CEREAL_BIND_TO_ARCHIVES(__VA_ARGS__)\n\n//! Registers a polymorphic type with cereal, giving it a\n//! user defined name\n/*! In some cases the default name used with\n    CEREAL_REGISTER_TYPE (the name of the type) may not be\n    suitable.  This macro allows any name to be associated\n    with the type.  The name should be unique */\n#define CEREAL_REGISTER_TYPE_WITH_NAME(T, Name)                     \\\n  namespace cereal {                                                \\\n  namespace detail {                                                \\\n  template <>                                                       \\\n  struct binding_name<T>                                            \\\n  { CEREAL_STATIC_CONSTEXPR char const * name() { return Name; } }; \\\n  } } /* end namespaces */                                          \\\n  CEREAL_BIND_TO_ARCHIVES(T)\n\n//! Registers the base-derived relationship for a polymorphic type\n/*! When polymorphic serialization occurs, cereal needs to know how to\n    properly cast between derived and base types for the polymorphic\n    type. Normally this happens automatically whenever cereal::base_class\n    or cereal::virtual_base_class are used to serialize a base class. In\n    cases where neither of these is ever called but a base class still\n    exists, this explicit registration is required.\n\n    The Derived class should be the most derived type that will be serialized,\n    and the Base type any possible base that has not been covered under a base\n    class serialization that will be used to store a Derived pointer.\n\n    Placement of this is the same as for CEREAL_REGISTER_TYPE. */\n#define CEREAL_REGISTER_POLYMORPHIC_RELATION(Base, Derived)                     \\\n  namespace cereal {                                                            \\\n  namespace detail {                                                            \\\n  template <>                                                                   \\\n  struct PolymorphicRelation<Base, Derived>                                     \\\n  { static void bind() { RegisterPolymorphicCaster<Base, Derived>::bind(); } }; \\\n  } } /* end namespaces */\n\n//! Adds a way to force initialization of a translation unit containing\n//! calls to CEREAL_REGISTER_TYPE\n/*! In C++, dynamic initialization of non-local variables of a translation\n    unit may be deferred until \"the first odr-use of any function or variable\n    defined in the same translation unit as the variable to be initialized.\"\n\n    Informally, odr-use means that your program takes the address of or binds\n    a reference directly to an object, which must have a definition.\n\n    Since polymorphic type support in cereal relies on the dynamic\n    initialization of certain global objects happening before\n    serialization is performed, it is important to ensure that something\n    from files that call CEREAL_REGISTER_TYPE is odr-used before serialization\n    occurs, otherwise the registration will never take place.  This may often\n    be the case when serialization is built as a shared library external from\n    your main program.\n\n    This macro, with any name of your choosing, should be placed into the\n    source file that contains calls to CEREAL_REGISTER_TYPE.\n\n    Its counterpart, CEREAL_FORCE_DYNAMIC_INIT, should be placed in its\n    associated header file such that it is included in the translation units\n    (source files) in which you want the registration to appear.\n\n    @relates CEREAL_FORCE_DYNAMIC_INIT\n    */\n#define CEREAL_REGISTER_DYNAMIC_INIT(LibName)                \\\n  namespace cereal {                                         \\\n  namespace detail {                                         \\\n    void CEREAL_DLL_EXPORT dynamic_init_dummy_##LibName() {} \\\n  } } /* end namespaces */\n\n//! Forces dynamic initialization of polymorphic support in a\n//! previously registered source file\n/*! @sa CEREAL_REGISTER_DYNAMIC_INIT\n\n    See CEREAL_REGISTER_DYNAMIC_INIT for detailed explanation\n    of how this macro should be used.  The name used should\n    match that for CEREAL_REGISTER_DYNAMIC_INIT. */\n#define CEREAL_FORCE_DYNAMIC_INIT(LibName)                 \\\n  namespace cereal {                                       \\\n  namespace detail {                                       \\\n    void CEREAL_DLL_EXPORT dynamic_init_dummy_##LibName(); \\\n  } /* end detail */                                       \\\n  } /* end cereal */                                       \\\n  namespace {                                              \\\n    struct dynamic_init_##LibName {                        \\\n      dynamic_init_##LibName() {                           \\\n        ::cereal::detail::dynamic_init_dummy_##LibName();  \\\n      }                                                    \\\n    } dynamic_init_instance_##LibName;                     \\\n  } /* end anonymous namespace */\n\nnamespace cereal\n{\n  namespace polymorphic_detail\n  {\n    //! Error message used for unregistered polymorphic types\n    /*! @internal */\n    #define UNREGISTERED_POLYMORPHIC_EXCEPTION(LoadSave, Name)                                                                                      \\\n      throw cereal::Exception(\"Trying to \" #LoadSave \" an unregistered polymorphic type (\" + Name + \").\\n\"                                          \\\n                              \"Make sure your type is registered with CEREAL_REGISTER_TYPE and that the archive \"                                   \\\n                              \"you are using was included (and registered with CEREAL_REGISTER_ARCHIVE) prior to calling CEREAL_REGISTER_TYPE.\\n\"   \\\n                              \"If your type is already registered and you still see this error, you may need to use CEREAL_REGISTER_DYNAMIC_INIT.\");\n\n    //! Get an input binding from the given archive by deserializing the type meta data\n    /*! @internal */\n    template<class Archive> inline\n    typename ::cereal::detail::InputBindingMap<Archive>::Serializers getInputBinding(Archive & ar, std::uint32_t const nameid)\n    {\n      // If the nameid is zero, we serialized a null pointer\n      if(nameid == 0)\n      {\n        typename ::cereal::detail::InputBindingMap<Archive>::Serializers emptySerializers;\n        emptySerializers.shared_ptr = [](void*, std::shared_ptr<void> & ptr, std::type_info const &) { ptr.reset(); };\n        emptySerializers.unique_ptr = [](void*, std::unique_ptr<void, ::cereal::detail::EmptyDeleter<void>> & ptr, std::type_info const &) { ptr.reset( nullptr ); };\n        return emptySerializers;\n      }\n\n      std::string name;\n      if(nameid & detail::msb_32bit)\n      {\n        ar( CEREAL_NVP_(\"polymorphic_name\", name) );\n        ar.registerPolymorphicName(nameid, name);\n      }\n      else\n        name = ar.getPolymorphicName(nameid);\n\n      auto const & bindingMap = detail::StaticObject<detail::InputBindingMap<Archive>>::getInstance().map;\n\n      auto binding = bindingMap.find(name);\n      if(binding == bindingMap.end())\n        UNREGISTERED_POLYMORPHIC_EXCEPTION(load, name)\n      return binding->second;\n    }\n\n    //! Serialize a shared_ptr if the 2nd msb in the nameid is set, and if we can actually construct the pointee\n    /*! This check lets us try and skip doing polymorphic machinery if we can get away with\n        using the derived class serialize function\n\n        Note that on MSVC 2013 preview, is_default_constructible<T> returns true for abstract classes with\n        default constructors, but on clang/gcc this will return false.  So we also need to check for that here.\n        @internal */\n    template<class Archive, class T> inline\n    typename std::enable_if<(traits::is_default_constructible<T>::value\n                             || traits::has_load_and_construct<T, Archive>::value)\n                             && !std::is_abstract<T>::value, bool>::type\n    serialize_wrapper(Archive & ar, std::shared_ptr<T> & ptr, std::uint32_t const nameid)\n    {\n      if(nameid & detail::msb2_32bit)\n      {\n        ar( CEREAL_NVP_(\"ptr_wrapper\", memory_detail::make_ptr_wrapper(ptr)) );\n        return true;\n      }\n      return false;\n    }\n\n    //! Serialize a unique_ptr if the 2nd msb in the nameid is set, and if we can actually construct the pointee\n    /*! This check lets us try and skip doing polymorphic machinery if we can get away with\n        using the derived class serialize function\n        @internal */\n    template<class Archive, class T, class D> inline\n    typename std::enable_if<(traits::is_default_constructible<T>::value\n                             || traits::has_load_and_construct<T, Archive>::value)\n                             && !std::is_abstract<T>::value, bool>::type\n    serialize_wrapper(Archive & ar, std::unique_ptr<T, D> & ptr, std::uint32_t const nameid)\n    {\n      if(nameid & detail::msb2_32bit)\n      {\n        ar( CEREAL_NVP_(\"ptr_wrapper\", memory_detail::make_ptr_wrapper(ptr)) );\n        return true;\n      }\n      return false;\n    }\n\n    //! Serialize a shared_ptr if the 2nd msb in the nameid is set, and if we can actually construct the pointee\n    /*! This case is for when we can't actually construct the shared pointer.  Normally this would be caught\n        as the pointer itself is serialized, but since this is a polymorphic pointer, if we tried to serialize\n        the pointer we'd end up back here recursively.  So we have to catch the error here as well, if\n        this was a polymorphic type serialized by its proper pointer type\n        @internal */\n    template<class Archive, class T> inline\n    typename std::enable_if<(!traits::is_default_constructible<T>::value\n                             && !traits::has_load_and_construct<T, Archive>::value)\n                             || std::is_abstract<T>::value, bool>::type\n    serialize_wrapper(Archive &, std::shared_ptr<T> &, std::uint32_t const nameid)\n    {\n      if(nameid & detail::msb2_32bit)\n        throw cereal::Exception(\"Cannot load a polymorphic type that is not default constructable and does not have a load_and_construct function\");\n      return false;\n    }\n\n    //! Serialize a unique_ptr if the 2nd msb in the nameid is set, and if we can actually construct the pointee\n    /*! This case is for when we can't actually construct the unique pointer.  Normally this would be caught\n        as the pointer itself is serialized, but since this is a polymorphic pointer, if we tried to serialize\n        the pointer we'd end up back here recursively.  So we have to catch the error here as well, if\n        this was a polymorphic type serialized by its proper pointer type\n        @internal */\n    template<class Archive, class T, class D> inline\n     typename std::enable_if<(!traits::is_default_constructible<T>::value\n                               && !traits::has_load_and_construct<T, Archive>::value)\n                               || std::is_abstract<T>::value, bool>::type\n    serialize_wrapper(Archive &, std::unique_ptr<T, D> &, std::uint32_t const nameid)\n    {\n      if(nameid & detail::msb2_32bit)\n        throw cereal::Exception(\"Cannot load a polymorphic type that is not default constructable and does not have a load_and_construct function\");\n      return false;\n    }\n  } // polymorphic_detail\n\n  // ######################################################################\n  // Pointer serialization for polymorphic types\n\n  //! Saving std::shared_ptr for polymorphic types, abstract\n  template <class Archive, class T> inline\n  typename std::enable_if<std::is_polymorphic<T>::value && std::is_abstract<T>::value, void>::type\n  CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::shared_ptr<T> const & ptr )\n  {\n    if(!ptr)\n    {\n      // same behavior as nullptr in memory implementation\n      ar( CEREAL_NVP_(\"polymorphic_id\", std::uint32_t(0)) );\n      return;\n    }\n\n    std::type_info const & ptrinfo = typeid(*ptr.get());\n    static std::type_info const & tinfo = typeid(T);\n    // ptrinfo can never be equal to T info since we can't have an instance\n    // of an abstract object\n    //  this implies we need to do the lookup\n\n    auto const & bindingMap = detail::StaticObject<detail::OutputBindingMap<Archive>>::getInstance().map;\n\n    auto binding = bindingMap.find(std::type_index(ptrinfo));\n    if(binding == bindingMap.end())\n      UNREGISTERED_POLYMORPHIC_EXCEPTION(save, cereal::util::demangle(ptrinfo.name()))\n\n    binding->second.shared_ptr(&ar, ptr.get(), tinfo);\n  }\n\n  //! Saving std::shared_ptr for polymorphic types, not abstract\n  template <class Archive, class T> inline\n  typename std::enable_if<std::is_polymorphic<T>::value && !std::is_abstract<T>::value, void>::type\n  CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::shared_ptr<T> const & ptr )\n  {\n    if(!ptr)\n    {\n      // same behavior as nullptr in memory implementation\n      ar( CEREAL_NVP_(\"polymorphic_id\", std::uint32_t(0)) );\n      return;\n    }\n\n    std::type_info const & ptrinfo = typeid(*ptr.get());\n    static std::type_info const & tinfo = typeid(T);\n\n    if(ptrinfo == tinfo)\n    {\n      // The 2nd msb signals that the following pointer does not need to be\n      // cast with our polymorphic machinery\n      ar( CEREAL_NVP_(\"polymorphic_id\", detail::msb2_32bit) );\n\n      ar( CEREAL_NVP_(\"ptr_wrapper\", memory_detail::make_ptr_wrapper(ptr)) );\n\n      return;\n    }\n\n    auto const & bindingMap = detail::StaticObject<detail::OutputBindingMap<Archive>>::getInstance().map;\n\n    auto binding = bindingMap.find(std::type_index(ptrinfo));\n    if(binding == bindingMap.end())\n      UNREGISTERED_POLYMORPHIC_EXCEPTION(save, cereal::util::demangle(ptrinfo.name()))\n\n    binding->second.shared_ptr(&ar, ptr.get(), tinfo);\n  }\n\n  //! Loading std::shared_ptr for polymorphic types\n  template <class Archive, class T> inline\n  typename std::enable_if<std::is_polymorphic<T>::value, void>::type\n  CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::shared_ptr<T> & ptr )\n  {\n    std::uint32_t nameid;\n    ar( CEREAL_NVP_(\"polymorphic_id\", nameid) );\n\n    // Check to see if we can skip all of this polymorphism business\n    if(polymorphic_detail::serialize_wrapper(ar, ptr, nameid))\n      return;\n\n    auto binding = polymorphic_detail::getInputBinding(ar, nameid);\n    std::shared_ptr<void> result;\n    binding.shared_ptr(&ar, result, typeid(T));\n    ptr = std::static_pointer_cast<T>(result);\n  }\n\n  //! Saving std::weak_ptr for polymorphic types\n  template <class Archive, class T> inline\n  typename std::enable_if<std::is_polymorphic<T>::value, void>::type\n  CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::weak_ptr<T> const & ptr )\n  {\n    auto const sptr = ptr.lock();\n    ar( CEREAL_NVP_(\"locked_ptr\", sptr) );\n  }\n\n  //! Loading std::weak_ptr for polymorphic types\n  template <class Archive, class T> inline\n  typename std::enable_if<std::is_polymorphic<T>::value, void>::type\n  CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::weak_ptr<T> & ptr )\n  {\n    std::shared_ptr<T> sptr;\n    ar( CEREAL_NVP_(\"locked_ptr\", sptr) );\n    ptr = sptr;\n  }\n\n  //! Saving std::unique_ptr for polymorphic types that are abstract\n  template <class Archive, class T, class D> inline\n  typename std::enable_if<std::is_polymorphic<T>::value && std::is_abstract<T>::value, void>::type\n  CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::unique_ptr<T, D> const & ptr )\n  {\n    if(!ptr)\n    {\n      // same behavior as nullptr in memory implementation\n      ar( CEREAL_NVP_(\"polymorphic_id\", std::uint32_t(0)) );\n      return;\n    }\n\n    std::type_info const & ptrinfo = typeid(*ptr.get());\n    static std::type_info const & tinfo = typeid(T);\n    // ptrinfo can never be equal to T info since we can't have an instance\n    // of an abstract object\n    //  this implies we need to do the lookup\n\n    auto const & bindingMap = detail::StaticObject<detail::OutputBindingMap<Archive>>::getInstance().map;\n\n    auto binding = bindingMap.find(std::type_index(ptrinfo));\n    if(binding == bindingMap.end())\n      UNREGISTERED_POLYMORPHIC_EXCEPTION(save, cereal::util::demangle(ptrinfo.name()))\n\n    binding->second.unique_ptr(&ar, ptr.get(), tinfo);\n  }\n\n  //! Saving std::unique_ptr for polymorphic types, not abstract\n  template <class Archive, class T, class D> inline\n  typename std::enable_if<std::is_polymorphic<T>::value && !std::is_abstract<T>::value, void>::type\n  CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::unique_ptr<T, D> const & ptr )\n  {\n    if(!ptr)\n    {\n      // same behavior as nullptr in memory implementation\n      ar( CEREAL_NVP_(\"polymorphic_id\", std::uint32_t(0)) );\n      return;\n    }\n\n    std::type_info const & ptrinfo = typeid(*ptr.get());\n    static std::type_info const & tinfo = typeid(T);\n\n    if(ptrinfo == tinfo)\n    {\n      // The 2nd msb signals that the following pointer does not need to be\n      // cast with our polymorphic machinery\n      ar( CEREAL_NVP_(\"polymorphic_id\", detail::msb2_32bit) );\n\n      ar( CEREAL_NVP_(\"ptr_wrapper\", memory_detail::make_ptr_wrapper(ptr)) );\n\n      return;\n    }\n\n    auto const & bindingMap = detail::StaticObject<detail::OutputBindingMap<Archive>>::getInstance().map;\n\n    auto binding = bindingMap.find(std::type_index(ptrinfo));\n    if(binding == bindingMap.end())\n      UNREGISTERED_POLYMORPHIC_EXCEPTION(save, cereal::util::demangle(ptrinfo.name()))\n\n    binding->second.unique_ptr(&ar, ptr.get(), tinfo);\n  }\n\n  //! Loading std::unique_ptr, case when user provides load_and_construct for polymorphic types\n  template <class Archive, class T, class D> inline\n  typename std::enable_if<std::is_polymorphic<T>::value, void>::type\n  CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::unique_ptr<T, D> & ptr )\n  {\n    std::uint32_t nameid;\n    ar( CEREAL_NVP_(\"polymorphic_id\", nameid) );\n\n    // Check to see if we can skip all of this polymorphism business\n    if(polymorphic_detail::serialize_wrapper(ar, ptr, nameid))\n      return;\n\n    auto binding = polymorphic_detail::getInputBinding(ar, nameid);\n    std::unique_ptr<void, ::cereal::detail::EmptyDeleter<void>> result;\n    binding.unique_ptr(&ar, result, typeid(T));\n    ptr.reset(static_cast<T*>(result.release()));\n  }\n\n  #undef UNREGISTERED_POLYMORPHIC_EXCEPTION\n} // namespace cereal\n#endif // CEREAL_TYPES_POLYMORPHIC_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/queue.hpp",
    "content": "/*! \\file queue.hpp\n    \\brief Support for types found in \\<queue\\>\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_QUEUE_HPP_\n#define CEREAL_TYPES_QUEUE_HPP_\n\n#include \"cereal/details/helpers.hpp\"\n#include <queue>\n\n// The default container for queue is deque, so let's include that too\n#include \"cereal/types/deque.hpp\"\n// The default comparator for queue is less\n#include \"cereal/types/functional.hpp\"\n\nnamespace cereal\n{\n  namespace queue_detail\n  {\n    //! Allows access to the protected container in queue\n    /*! @internal */\n    template <class T, class C> inline\n    C const & container( std::queue<T, C> const & queue )\n    {\n      struct H : public std::queue<T, C>\n      {\n        static C const & get( std::queue<T, C> const & q )\n        {\n          return q.*(&H::c);\n        }\n      };\n\n      return H::get( queue );\n    }\n\n    //! Allows access to the protected container in priority queue\n    /*! @internal */\n    template <class T, class C, class Comp> inline\n    C const & container( std::priority_queue<T, C, Comp> const & priority_queue )\n    {\n      struct H : public std::priority_queue<T, C, Comp>\n      {\n        static C const & get( std::priority_queue<T, C, Comp> const & pq )\n        {\n          return pq.*(&H::c);\n        }\n      };\n\n      return H::get( priority_queue );\n    }\n\n    //! Allows access to the protected comparator in priority queue\n    /*! @internal */\n    template <class T, class C, class Comp> inline\n    Comp const & comparator( std::priority_queue<T, C, Comp> const & priority_queue )\n    {\n      struct H : public std::priority_queue<T, C, Comp>\n      {\n        static Comp const & get( std::priority_queue<T, C, Comp> const & pq )\n        {\n          return pq.*(&H::comp);\n        }\n      };\n\n      return H::get( priority_queue );\n    }\n  }\n\n  //! Saving for std::queue\n  template <class Archive, class T, class C> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::queue<T, C> const & queue )\n  {\n    ar( CEREAL_NVP_(\"container\", queue_detail::container( queue )) );\n  }\n\n  //! Loading for std::queue\n  template <class Archive, class T, class C> inline\n  void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::queue<T, C> & queue )\n  {\n    C container;\n    ar( CEREAL_NVP_(\"container\", container) );\n    queue = std::queue<T, C>( std::move( container ) );\n  }\n\n  //! Saving for std::priority_queue\n  template <class Archive, class T, class C, class Comp> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::priority_queue<T, C, Comp> const & priority_queue )\n  {\n    ar( CEREAL_NVP_(\"comparator\", queue_detail::comparator( priority_queue )) );\n    ar( CEREAL_NVP_(\"container\", queue_detail::container( priority_queue )) );\n  }\n\n  //! Loading for std::priority_queue\n  template <class Archive, class T, class C, class Comp> inline\n  void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::priority_queue<T, C, Comp> & priority_queue )\n  {\n    Comp comparator;\n    ar( CEREAL_NVP_(\"comparator\", comparator) );\n\n    C container;\n    ar( CEREAL_NVP_(\"container\", container) );\n\n    priority_queue = std::priority_queue<T, C, Comp>( comparator, std::move( container ) );\n  }\n} // namespace cereal\n\n#endif // CEREAL_TYPES_QUEUE_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/set.hpp",
    "content": "/*! \\file set.hpp\n    \\brief Support for types found in \\<set\\>\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_SET_HPP_\n#define CEREAL_TYPES_SET_HPP_\n\n#include \"cereal/cereal.hpp\"\n#include <set>\n\nnamespace cereal\n{\n  namespace set_detail\n  {\n    //! @internal\n    template <class Archive, class SetT> inline\n    void save( Archive & ar, SetT const & set )\n    {\n      ar( make_size_tag( static_cast<size_type>(set.size()) ) );\n\n      for( const auto & i : set )\n        ar( i );\n    }\n\n    //! @internal\n    template <class Archive, class SetT> inline\n    void load( Archive & ar, SetT & set )\n    {\n      size_type size;\n      ar( make_size_tag( size ) );\n\n      set.clear();\n\n      auto hint = set.begin();\n      for( size_type i = 0; i < size; ++i )\n      {\n        typename SetT::key_type key;\n\n        ar( key );\n        #ifdef CEREAL_OLDER_GCC\n        hint = set.insert( hint, std::move( key ) );\n        #else // NOT CEREAL_OLDER_GCC\n        hint = set.emplace_hint( hint, std::move( key ) );\n        #endif // NOT CEREAL_OLDER_GCC\n      }\n    }\n  }\n\n  //! Saving for std::set\n  template <class Archive, class K, class C, class A> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::set<K, C, A> const & set )\n  {\n    set_detail::save( ar, set );\n  }\n\n  //! Loading for std::set\n  template <class Archive, class K, class C, class A> inline\n  void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::set<K, C, A> & set )\n  {\n    set_detail::load( ar, set );\n  }\n\n  //! Saving for std::multiset\n  template <class Archive, class K, class C, class A> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::multiset<K, C, A> const & multiset )\n  {\n    set_detail::save( ar, multiset );\n  }\n\n  //! Loading for std::multiset\n  template <class Archive, class K, class C, class A> inline\n  void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::multiset<K, C, A> & multiset )\n  {\n    set_detail::load( ar, multiset );\n  }\n} // namespace cereal\n\n#endif // CEREAL_TYPES_SET_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/stack.hpp",
    "content": "/*! \\file stack.hpp\n    \\brief Support for types found in \\<stack\\>\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_STACK_HPP_\n#define CEREAL_TYPES_STACK_HPP_\n\n#include \"cereal/cereal.hpp\"\n#include <stack>\n\n// The default container for stack is deque, so let's include that too\n#include \"cereal/types/deque.hpp\"\n\nnamespace cereal\n{\n  namespace stack_detail\n  {\n    //! Allows access to the protected container in stack\n    template <class T, class C> inline\n    C const & container( std::stack<T, C> const & stack )\n    {\n      struct H : public std::stack<T, C>\n      {\n        static C const & get( std::stack<T, C> const & s )\n        {\n          return s.*(&H::c);\n        }\n      };\n\n      return H::get( stack );\n    }\n  }\n\n  //! Saving for std::stack\n  template <class Archive, class T, class C> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::stack<T, C> const & stack )\n  {\n    ar( CEREAL_NVP_(\"container\", stack_detail::container( stack )) );\n  }\n\n  //! Loading for std::stack\n  template <class Archive, class T, class C> inline\n  void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::stack<T, C> & stack )\n  {\n    C container;\n    ar( CEREAL_NVP_(\"container\", container) );\n    stack = std::stack<T, C>( std::move( container ) );\n  }\n} // namespace cereal\n\n#endif // CEREAL_TYPES_STACK_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/string.hpp",
    "content": "/*! \\file string.hpp\n    \\brief Support for types found in \\<string\\>\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_STRING_HPP_\n#define CEREAL_TYPES_STRING_HPP_\n\n#include \"cereal/cereal.hpp\"\n#include <string>\n\nnamespace cereal\n{\n  //! Serialization for basic_string types, if binary data is supported\n  template<class Archive, class CharT, class Traits, class Alloc> inline\n  typename std::enable_if<traits::is_output_serializable<BinaryData<CharT>, Archive>::value, void>::type\n  CEREAL_SAVE_FUNCTION_NAME(Archive & ar, std::basic_string<CharT, Traits, Alloc> const & str)\n  {\n    // Save number of chars + the data\n    ar( make_size_tag( static_cast<size_type>(str.size()) ) );\n    ar( binary_data( str.data(), str.size() * sizeof(CharT) ) );\n  }\n\n  //! Serialization for basic_string types, if binary data is supported\n  template<class Archive, class CharT, class Traits, class Alloc> inline\n  typename std::enable_if<traits::is_input_serializable<BinaryData<CharT>, Archive>::value, void>::type\n  CEREAL_LOAD_FUNCTION_NAME(Archive & ar, std::basic_string<CharT, Traits, Alloc> & str)\n  {\n    size_type size;\n    ar( make_size_tag( size ) );\n    str.resize(static_cast<std::size_t>(size));\n    ar( binary_data( const_cast<CharT *>( str.data() ), static_cast<std::size_t>(size) * sizeof(CharT) ) );\n  }\n} // namespace cereal\n\n#endif // CEREAL_TYPES_STRING_HPP_\n\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/tuple.hpp",
    "content": "/*! \\file tuple.hpp\n    \\brief Support for types found in \\<tuple\\>\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_TUPLE_HPP_\n#define CEREAL_TYPES_TUPLE_HPP_\n\n#include \"cereal/cereal.hpp\"\n#include <tuple>\n\nnamespace cereal\n{\n  namespace tuple_detail\n  {\n    //! Creates a c string from a sequence of characters\n    /*! The c string created will always be prefixed by \"tuple_element\"\n        Based on code from: http://stackoverflow/a/20973438/710791\n        @internal */\n    template<char...Cs>\n    struct char_seq_to_c_str\n    {\n      static const int size = 14;// Size of array for the word: tuple_element\n      typedef const char (&arr_type)[sizeof...(Cs) + size];\n      static const char str[sizeof...(Cs) + size];\n    };\n\n    // the word tuple_element plus a number\n    //! @internal\n    template<char...Cs>\n    const char char_seq_to_c_str<Cs...>::str[sizeof...(Cs) + size] =\n      {'t','u','p','l','e','_','e','l','e','m','e','n','t', Cs..., '\\0'};\n\n    //! Converts a number into a sequence of characters\n    /*! @tparam Q The quotient of dividing the original number by 10\n        @tparam R The remainder of dividing the original number by 10\n        @tparam C The sequence built so far\n        @internal */\n    template <size_t Q, size_t R, char ... C>\n    struct to_string_impl\n    {\n      using type = typename to_string_impl<Q/10, Q%10, static_cast<char>(R+std::size_t{'0'}), C...>::type;\n    };\n\n    //! Base case with no quotient\n    /*! @internal */\n    template <size_t R, char ... C>\n    struct to_string_impl<0, R, C...>\n    {\n      using type = char_seq_to_c_str<static_cast<char>(R+std::size_t{'0'}), C...>;\n    };\n\n    //! Generates a c string for a given index of a tuple\n    /*! Example use:\n        @code{cpp}\n        tuple_element_name<3>::c_str();// returns \"tuple_element3\"\n        @endcode\n        @internal */\n    template<size_t T>\n    struct tuple_element_name\n    {\n      using type = typename to_string_impl<T/10, T%10>::type;\n      static const typename type::arr_type c_str(){ return type::str; }\n    };\n\n    // unwinds a tuple to save it\n    //! @internal\n    template <size_t Height>\n    struct serialize\n    {\n      template <class Archive, class ... Types> inline\n      static void apply( Archive & ar, std::tuple<Types...> & tuple )\n      {\n        serialize<Height - 1>::template apply( ar, tuple );\n        ar( CEREAL_NVP_(tuple_element_name<Height - 1>::c_str(),\n            std::get<Height - 1>( tuple )) );\n      }\n    };\n\n    // Zero height specialization - nothing to do here\n    //! @internal\n    template <>\n    struct serialize<0>\n    {\n      template <class Archive, class ... Types> inline\n      static void apply( Archive &, std::tuple<Types...> & )\n      { }\n    };\n  }\n\n  //! Serializing for std::tuple\n  template <class Archive, class ... Types> inline\n  void CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar, std::tuple<Types...> & tuple )\n  {\n    tuple_detail::serialize<std::tuple_size<std::tuple<Types...>>::value>::template apply( ar, tuple );\n  }\n} // namespace cereal\n\n#endif // CEREAL_TYPES_TUPLE_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/unordered_map.hpp",
    "content": "/*! \\file unordered_map.hpp\n    \\brief Support for types found in \\<unordered_map\\>\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_UNORDERED_MAP_HPP_\n#define CEREAL_TYPES_UNORDERED_MAP_HPP_\n\n#include \"cereal/types/concepts/pair_associative_container.hpp\"\n#include <unordered_map>\n\n#endif // CEREAL_TYPES_UNORDERED_MAP_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/unordered_set.hpp",
    "content": "/*! \\file unordered_set.hpp\n    \\brief Support for types found in \\<unordered_set\\>\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_UNORDERED_SET_HPP_\n#define CEREAL_TYPES_UNORDERED_SET_HPP_\n\n#include \"cereal/cereal.hpp\"\n#include <unordered_set>\n\nnamespace cereal\n{\n  namespace unordered_set_detail\n  {\n    //! @internal\n    template <class Archive, class SetT> inline\n    void save( Archive & ar, SetT const & set )\n    {\n      ar( make_size_tag( static_cast<size_type>(set.size()) ) );\n\n      for( const auto & i : set )\n        ar( i );\n    }\n\n    //! @internal\n    template <class Archive, class SetT> inline\n    void load( Archive & ar, SetT & set )\n    {\n      size_type size;\n      ar( make_size_tag( size ) );\n\n      set.clear();\n      set.reserve( static_cast<std::size_t>( size ) );\n\n      for( size_type i = 0; i < size; ++i )\n      {\n        typename SetT::key_type key;\n\n        ar( key );\n        set.emplace( std::move( key ) );\n      }\n    }\n  }\n\n  //! Saving for std::unordered_set\n  template <class Archive, class K, class H, class KE, class A> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::unordered_set<K, H, KE, A> const & unordered_set )\n  {\n    unordered_set_detail::save( ar, unordered_set );\n  }\n\n  //! Loading for std::unordered_set\n  template <class Archive, class K, class H, class KE, class A> inline\n  void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::unordered_set<K, H, KE, A> & unordered_set )\n  {\n    unordered_set_detail::load( ar, unordered_set );\n  }\n\n  //! Saving for std::unordered_multiset\n  template <class Archive, class K, class H, class KE, class A> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::unordered_multiset<K, H, KE, A> const & unordered_multiset )\n  {\n    unordered_set_detail::save( ar, unordered_multiset );\n  }\n\n  //! Loading for std::unordered_multiset\n  template <class Archive, class K, class H, class KE, class A> inline\n  void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::unordered_multiset<K, H, KE, A> & unordered_multiset )\n  {\n    unordered_set_detail::load( ar, unordered_multiset );\n  }\n} // namespace cereal\n\n#endif // CEREAL_TYPES_UNORDERED_SET_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/utility.hpp",
    "content": "/*! \\file utility.hpp\n    \\brief Support for types found in \\<utility\\>\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_UTILITY_HPP_\n#define CEREAL_TYPES_UTILITY_HPP_\n\n#include \"cereal/cereal.hpp\"\n#include <utility>\n\nnamespace cereal\n{\n  //! Serializing for std::pair\n  template <class Archive, class T1, class T2> inline\n  void CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar, std::pair<T1, T2> & pair )\n  {\n    ar( CEREAL_NVP_(\"first\",  pair.first),\n        CEREAL_NVP_(\"second\", pair.second) );\n  }\n} // namespace cereal\n\n#endif // CEREAL_TYPES_UTILITY_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/valarray.hpp",
    "content": "/*! \\file valarray.hpp\n\\brief Support for types found in \\<valarray\\>\n\\ingroup STLSupport */\n\n/*\nCopyright (c) 2014, Randolph Voorhies, Shane Grant\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n* Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n* Neither the name of cereal nor the\nnames of its contributors may be used to endorse or promote products\nderived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef CEREAL_TYPES_VALARRAY_HPP_\n#define CEREAL_TYPES_VALARRAY_HPP_\n\n#include \"cereal/cereal.hpp\"\n#include <valarray>\n\nnamespace cereal\n{\n  //! Saving for std::valarray arithmetic types, using binary serialization, if supported\n  template <class Archive, class T> inline\n  typename std::enable_if<traits::is_output_serializable<BinaryData<T>, Archive>::value\n                          && std::is_arithmetic<T>::value, void>::type\n  CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::valarray<T> const & valarray )\n  {\n    ar( make_size_tag( static_cast<size_type>(valarray.size()) ) ); // number of elements\n    ar( binary_data( &valarray[0], valarray.size() * sizeof(T) ) ); // &valarray[0] ok since guaranteed contiguous\n  }\n\n  //! Loading for std::valarray arithmetic types, using binary serialization, if supported\n  template <class Archive, class T> inline\n  typename std::enable_if<traits::is_input_serializable<BinaryData<T>, Archive>::value\n                          && std::is_arithmetic<T>::value, void>::type\n  CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::valarray<T> & valarray )\n  {\n    size_type valarraySize;\n    ar( make_size_tag( valarraySize ) );\n\n    valarray.resize( static_cast<std::size_t>( valarraySize ) );\n    ar( binary_data( &valarray[0], static_cast<std::size_t>( valarraySize ) * sizeof(T) ) );\n  }\n\n  //! Saving for std::valarray all other types\n  template <class Archive, class T> inline\n  typename std::enable_if<!traits::is_output_serializable<BinaryData<T>, Archive>::value\n                          || !std::is_arithmetic<T>::value, void>::type\n  CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::valarray<T> const & valarray )\n  {\n    ar( make_size_tag( static_cast<size_type>(valarray.size()) ) ); // number of elements\n    for(auto && v : valarray)\n      ar(v);\n  }\n\n  //! Loading for std::valarray all other types\n  template <class Archive, class T> inline\n  typename std::enable_if<!traits::is_input_serializable<BinaryData<T>, Archive>::value\n                          || !std::is_arithmetic<T>::value, void>::type\n  CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::valarray<T> & valarray )\n  {\n    size_type valarraySize;\n    ar( make_size_tag( valarraySize ) );\n\n    valarray.resize( static_cast<size_t>( valarraySize ) );\n    for(auto && v : valarray)\n      ar(v);\n  }\n} // namespace cereal\n\n#endif // CEREAL_TYPES_VALARRAY_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/variant.hpp",
    "content": "/*! \\file variant.hpp\n    \\brief Support for std::variant\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2014, 2017, Randolph Voorhies, Shane Grant, Juan Pedro\n  Bolivar Puente. All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_STD_VARIANT_HPP_\n#define CEREAL_TYPES_STD_VARIANT_HPP_\n\n#include \"cereal/cereal.hpp\"\n#include <variant>\n#include <cstdint>\n\nnamespace cereal\n{\n  namespace variant_detail\n  {\n    //! @internal\n    template <class Archive>\n    struct variant_save_visitor\n    {\n      variant_save_visitor(Archive & ar_) : ar(ar_) {}\n\n      template<class T>\n        void operator()(T const & value) const\n        {\n          ar( CEREAL_NVP_(\"data\", value) );\n        }\n\n      Archive & ar;\n    };\n\n    //! @internal\n    template<int N, class Variant, class ... Args, class Archive>\n    typename std::enable_if<N == std::variant_size_v<Variant>, void>::type\n    load_variant(Archive & /*ar*/, int /*target*/, Variant & /*variant*/)\n    {\n      throw ::cereal::Exception(\"Error traversing variant during load\");\n    }\n    //! @internal\n    template<int N, class Variant, class H, class ... T, class Archive>\n    typename std::enable_if<N < std::variant_size_v<Variant>, void>::type\n    load_variant(Archive & ar, int target, Variant & variant)\n    {\n      if(N == target)\n      {\n        H value;\n        ar( CEREAL_NVP_(\"data\", value) );\n        variant = std::move(value);\n      }\n      else\n        load_variant<N+1, Variant, T...>(ar, target, variant);\n    }\n\n  } // namespace variant_detail\n\n  //! Saving for std::variant\n  template <class Archive, typename VariantType1, typename... VariantTypes> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::variant<VariantType1, VariantTypes...> const & variant )\n  {\n    std::int32_t index = static_cast<std::int32_t>(variant.index());\n    ar( CEREAL_NVP_(\"index\", index) );\n    variant_detail::variant_save_visitor<Archive> visitor(ar);\n    std::visit(visitor, variant);\n  }\n\n  //! Loading for std::variant\n  template <class Archive, typename... VariantTypes> inline\n  void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::variant<VariantTypes...> & variant )\n  {\n    using variant_t = typename std::variant<VariantTypes...>;\n\n    std::int32_t index;\n    ar( CEREAL_NVP_(\"index\", index) );\n    if(index >= static_cast<std::int32_t>(std::variant_size_v<variant_t>))\n      throw Exception(\"Invalid 'index' selector when deserializing std::variant\");\n\n    variant_detail::load_variant<0, variant_t, VariantTypes...>(ar, index, variant);\n  }\n\n  //! Serializing a std::monostate\n  template <class Archive>\n  void CEREAL_SERIALIZE_FUNCTION_NAME( Archive &, std::monostate const & ) {}\n} // namespace cereal\n\n#endif // CEREAL_TYPES_STD_VARIANT_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/types/vector.hpp",
    "content": "/*! \\file vector.hpp\n    \\brief Support for types found in \\<vector\\>\n    \\ingroup STLSupport */\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TYPES_VECTOR_HPP_\n#define CEREAL_TYPES_VECTOR_HPP_\n\n#include \"cereal/cereal.hpp\"\n#include <vector>\n\nnamespace cereal\n{\n  //! Serialization for std::vectors of arithmetic (but not bool) using binary serialization, if supported\n  template <class Archive, class T, class A> inline\n  typename std::enable_if<traits::is_output_serializable<BinaryData<T>, Archive>::value\n                          && std::is_arithmetic<T>::value && !std::is_same<T, bool>::value, void>::type\n  CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::vector<T, A> const & vector )\n  {\n    ar( make_size_tag( static_cast<size_type>(vector.size()) ) ); // number of elements\n    ar( binary_data( vector.data(), vector.size() * sizeof(T) ) );\n  }\n\n  //! Serialization for std::vectors of arithmetic (but not bool) using binary serialization, if supported\n  template <class Archive, class T, class A> inline\n  typename std::enable_if<traits::is_input_serializable<BinaryData<T>, Archive>::value\n                          && std::is_arithmetic<T>::value && !std::is_same<T, bool>::value, void>::type\n  CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::vector<T, A> & vector )\n  {\n    size_type vectorSize;\n    ar( make_size_tag( vectorSize ) );\n\n    vector.resize( static_cast<std::size_t>( vectorSize ) );\n    ar( binary_data( vector.data(), static_cast<std::size_t>( vectorSize ) * sizeof(T) ) );\n  }\n\n  //! Serialization for non-arithmetic vector types\n  template <class Archive, class T, class A> inline\n  typename std::enable_if<(!traits::is_output_serializable<BinaryData<T>, Archive>::value\n                          || !std::is_arithmetic<T>::value) && !std::is_same<T, bool>::value, void>::type\n  CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::vector<T, A> const & vector )\n  {\n    ar( make_size_tag( static_cast<size_type>(vector.size()) ) ); // number of elements\n    for(auto && v : vector)\n      ar( v );\n  }\n\n  //! Serialization for non-arithmetic vector types\n  template <class Archive, class T, class A> inline\n  typename std::enable_if<(!traits::is_input_serializable<BinaryData<T>, Archive>::value\n                          || !std::is_arithmetic<T>::value) && !std::is_same<T, bool>::value, void>::type\n  CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::vector<T, A> & vector )\n  {\n    size_type size;\n    ar( make_size_tag( size ) );\n\n    vector.resize( static_cast<std::size_t>( size ) );\n    for(auto && v : vector)\n      ar( v );\n  }\n\n  //! Serialization for bool vector types\n  template <class Archive, class A> inline\n  void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::vector<bool, A> const & vector )\n  {\n    ar( make_size_tag( static_cast<size_type>(vector.size()) ) ); // number of elements\n    for(const auto v : vector)\n      ar( static_cast<bool>(v) );\n  }\n\n  //! Serialization for bool vector types\n  template <class Archive, class A> inline\n  void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::vector<bool, A> & vector )\n  {\n    size_type size;\n    ar( make_size_tag( size ) );\n\n    vector.resize( static_cast<std::size_t>( size ) );\n    for(auto v : vector)\n    {\n      bool b;\n      ar( b );\n      v = b;\n    }\n  }\n} // namespace cereal\n\n#endif // CEREAL_TYPES_VECTOR_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/include/cereal/version.hpp",
    "content": "/*! \\file version.hpp\n    \\brief Macros to detect cereal version\n\n    These macros can assist in determining the version of cereal. Be\n    warned that cereal is not guaranteed to be compatible across\n    different versions. For more information on releases of cereal,\n    see https://github.com/USCiLab/cereal/releases.\n\n    \\ingroup utility */\n/*\n  Copyright (c) 2018, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef CEREAL_VERSION_HPP_\n#define CEREAL_VERSION_HPP_\n\n//! The major version\n#define CEREAL_VERSION_MAJOR 1\n//! The minor version\n#define CEREAL_VERSION_MINOR 3\n//! The patch version\n#define CEREAL_VERSION_PATCH 0\n\n//! The full version as a single number\n#define CEREAL_VERSION (CEREAL_VERSION_MAJOR * 10000 \\\n                        + CEREAL_VERSION_MINOR * 100 \\\n                        + CEREAL_VERSION_PATCH)\n\n#endif // CEREAL_VERSION_HPP_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/sandbox/CMakeLists.txt",
    "content": "add_subdirectory(sandbox_shared_lib)\n\nadd_executable(sandbox sandbox.cpp)\nadd_executable(sandbox_json sandbox_json.cpp)\nadd_executable(sandbox_rtti sandbox_rtti.cpp)\n\nadd_executable(sandbox_vs sandbox_vs.cpp)\ntarget_link_libraries(sandbox_vs sandbox_vs_dll)\ninclude_directories(sandbox_shared_lib)\n\nif((Boost_FOUND) AND NOT SKIP_PERFORMANCE_COMPARISON)\n  add_executable(performance performance.cpp)\n  if(MSVC)\n    set_target_properties(performance PROPERTIES COMPILE_DEFINITIONS \"BOOST_SERIALIZATION_DYN_LINK\")\n  endif()\n  target_link_libraries(performance ${Boost_LIBRARIES})\nendif()\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/sandbox/performance.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifdef _MSC_VER\n#  pragma warning(push)\n#  pragma warning(disable : 4244 4267)\n#endif\n\n// fix for old versions of boost + deprecated auto_ptr\n#define BOOST_NO_AUTO_PTR\n\n#include <sstream>\n#include <iostream>\n#include <chrono>\n#include <random>\n\n#include <boost/format.hpp>\n\n#include <boost/serialization/serialization.hpp>\n#include <boost/archive/binary_oarchive.hpp>\n#include <boost/archive/binary_iarchive.hpp>\n#include <boost/serialization/vector.hpp>\n#include <boost/serialization/map.hpp>\n#include <boost/serialization/string.hpp>\n#include <boost/serialization/base_object.hpp>\n\n#include <cereal/archives/binary.hpp>\n#include <cereal/types/vector.hpp>\n#include <cereal/types/string.hpp>\n#include <cereal/types/map.hpp>\n\n//! Runs serialization to save data to an ostringstream\n/*! Used to time how long it takes to save data to an ostringstream.\n    Everything that happens within the save function will be timed, including\n    any set-up necessary to perform the serialization.\n\n    @param data The data to save\n    @param saveFunction A function taking in an ostringstream and the data and returning void\n    @return The ostringstream and the time it took to save the data */\ntemplate <class T>\nstd::chrono::nanoseconds\nsaveData( T const & data, std::function<void(std::ostringstream &, T const&)> saveFunction, std::ostringstream & os )\n{\n  auto start = std::chrono::high_resolution_clock::now();\n  saveFunction( os, data );\n  return std::chrono::duration_cast<std::chrono::nanoseconds>( std::chrono::high_resolution_clock::now() - start );\n}\n\n//! Runs serialization to load data to from an istringstream\n/*! Used to time how long it takes to load data from an istringstream.\n    Everything that happens within the load function will be timed, including\n    any set-up necessary to perform the serialization.\n\n    @param dataStream The saved data stream\n    @param loadFunction A function taking in an istringstream and a data reference and returning void\n    @return The loaded data and the time it took to save the data */\ntemplate <class T>\nstd::pair<T, std::chrono::nanoseconds>\nloadData( std::ostringstream const & dataStream, std::function<void(std::istringstream &, T &)> loadFunction )\n{\n  T data;\n  std::istringstream os( dataStream.str() );\n\n  auto start = std::chrono::high_resolution_clock::now();\n  loadFunction( os, data );\n\n  return {data, std::chrono::duration_cast<std::chrono::nanoseconds>( std::chrono::high_resolution_clock::now() - start )};\n}\n\nstruct cerealBinary\n{\n  //! Saves data to a cereal binary archive\n  template <class T>\n  static void save( std::ostringstream & os, T const & data )\n  {\n    cereal::BinaryOutputArchive oar(os);\n    oar(data);\n  }\n\n  //! Loads data to a cereal binary archive\n  template <class T>\n  static void load( std::istringstream & is, T & data )\n  {\n    cereal::BinaryInputArchive iar(is);\n    iar(data);\n  }\n};\n\nstruct boostBinary\n{\n  //! Saves data to a boost binary archive\n  template <class T>\n  static void save( std::ostringstream & os, T const & data )\n  {\n    boost::archive::binary_oarchive oar(os);\n    oar & data;\n  }\n\n  //! Loads data to a boost binary archive\n  template <class T>\n  static void load( std::istringstream & is, T & data )\n  {\n    boost::archive::binary_iarchive iar(is);\n    iar & data;\n  }\n};\n\nstruct binary\n{\n  typedef boostBinary  boost;\n  typedef cerealBinary cereal;\n};\n\n//! Times how long it takes to serialize (load and store) some data\n/*! Times how long and the size of the serialization object used to serialize\n    some data.  Result is output to standard out.\n\n    @tparam SerializationT The serialization struct that has all save and load functions\n    @tparam DataTCereal The type of data to test for cereal\n    @tparam DataTBoost The type of data to test for boost\n    @param name The name for this test\n    @param data The data to serialize for cereal\n    @param data The data to serialize for boost\n    @param numAverages The number of times to average\n    @param validateData Whether data should be validated (input == output) */\ntemplate <class SerializationT, class DataTCereal, class DataTBoost>\nvoid test( std::string const & name,\n            DataTCereal const & dataC,\n            DataTBoost const & dataB,\n            size_t numAverages = 100,\n            bool validateData = false );\n\ntemplate <class SerializationT, class DataTCereal, class DataTBoost>\nvoid test( std::string const & name,\n            DataTCereal const & dataC,\n            DataTBoost const & dataB,\n            size_t numAverages,\n            bool /*validateData*/ )\n{\n  std::cout << \"-----------------------------------\" << std::endl;\n  std::cout << \"Running test: \" << name << std::endl;\n\n  std::chrono::nanoseconds totalBoostSave{0};\n  std::chrono::nanoseconds totalBoostLoad{0};\n\n  std::chrono::nanoseconds totalCerealSave{0};\n  std::chrono::nanoseconds totalCerealLoad{0};\n\n  size_t boostSize = 0;\n  size_t cerealSize = 0;\n\n  for(size_t i = 0; i < numAverages; ++i)\n  {\n    // Boost\n    {\n      std::ostringstream os;\n      auto saveResult = saveData<DataTBoost>( dataB, {SerializationT::boost::template save<DataTBoost>}, os );\n      totalBoostSave += saveResult;\n      if(!boostSize)\n        boostSize = os.tellp();\n\n      auto loadResult = loadData<DataTBoost>( os, {SerializationT::boost::template load<DataTBoost>} );\n      totalBoostLoad += loadResult.second;\n    }\n\n    // Cereal\n    {\n      std::ostringstream os;\n      auto saveResult = saveData<DataTCereal>( dataC, {SerializationT::cereal::template save<DataTCereal>}, os );\n      totalCerealSave += saveResult;\n      if(!cerealSize)\n        cerealSize = os.tellp();\n\n      auto loadResult = loadData<DataTCereal>( os, {SerializationT::cereal::template load<DataTCereal>} );\n      totalCerealLoad += loadResult.second;\n    }\n  }\n\n  // Averages\n  double averageBoostSave = std::chrono::duration_cast<std::chrono::milliseconds>(totalBoostSave).count() / static_cast<double>( numAverages );\n  double averageBoostLoad = std::chrono::duration_cast<std::chrono::milliseconds>(totalBoostLoad).count() / static_cast<double>( numAverages );\n\n  double averageCerealSave = std::chrono::duration_cast<std::chrono::milliseconds>(totalCerealSave).count() / static_cast<double>( numAverages );\n  double averageCerealLoad = std::chrono::duration_cast<std::chrono::milliseconds>(totalCerealLoad).count() / static_cast<double>( numAverages );\n\n  // Percentages relative to boost\n  double cerealSaveP = averageCerealSave / averageBoostSave;\n  double cerealLoadP = averageCerealLoad / averageBoostLoad;\n  double cerealSizeP = cerealSize / static_cast<double>( boostSize );\n\n  std::cout << \"  Boost results:\" << std::endl;\n  std::cout << boost::format(\"\\tsave | time: %06.4fms (%1.2f) size: %20.8fkb (%1.8f) total: %6.1fms\")\n    % averageBoostSave % 1.0 % (boostSize / 1024.0) % 1.0 % static_cast<double>( std::chrono::duration_cast<std::chrono::milliseconds>(totalBoostSave).count() );\n  std::cout << std::endl;\n  std::cout << boost::format(\"\\tload | time: %06.4fms (%1.2f) total: %6.1fms\")\n    % averageBoostLoad % 1.0 % static_cast<double>( std::chrono::duration_cast<std::chrono::milliseconds>(totalBoostLoad).count() );\n  std::cout << std::endl;\n\n  std::cout << \"  Cereal results:\" << std::endl;\n  std::cout << boost::format(\"\\tsave | time: %06.4fms (%1.2f) size: %20.8fkb (%1.8f) total: %6.1fms\")\n    % averageCerealSave % cerealSaveP % (cerealSize / 1024.0) % cerealSizeP % static_cast<double>( std::chrono::duration_cast<std::chrono::milliseconds>(totalCerealSave).count() );\n  std::cout << std::endl;\n  std::cout << boost::format(\"\\tload | time: %06.4fms (%1.2f) total: %6.1fms\")\n    % averageCerealLoad % cerealLoadP % static_cast<double>( std::chrono::duration_cast<std::chrono::milliseconds>(totalCerealLoad).count() );\n  std::cout << std::endl;\n}\n\ntemplate <class SerializationT, class DataT>\nvoid test( std::string const & name,\n            DataT const & data,\n            size_t numAverages = 100,\n            bool validateData = false )\n{\n  return test<SerializationT, DataT, DataT>( name, data, data, numAverages, validateData );\n}\n\ntemplate<class T>\ntypename std::enable_if<std::is_floating_point<T>::value, T>::type\nrandom_value(std::mt19937 & gen)\n{ return std::uniform_real_distribution<T>(-10000.0, 10000.0)(gen); }\n\ntemplate<class T>\ntypename std::enable_if<std::is_integral<T>::value && sizeof(T) != sizeof(char), T>::type\nrandom_value(std::mt19937 & gen)\n{ return std::uniform_int_distribution<T>(std::numeric_limits<T>::lowest(), std::numeric_limits<T>::max())(gen); }\n\ntemplate<class T>\ntypename std::enable_if<std::is_integral<T>::value && sizeof(T) == sizeof(char), T>::type\nrandom_value(std::mt19937 & gen)\n{ return static_cast<T>( std::uniform_int_distribution<int64_t>(std::numeric_limits<T>::lowest(), std::numeric_limits<T>::max())(gen) ); }\n\ntemplate<class T>\ntypename std::enable_if<std::is_same<T, std::string>::value, std::string>::type\nrandom_value(std::mt19937 & gen)\n{\n  std::string s(std::uniform_int_distribution<int>(3, 30)(gen), ' ');\n  for(char & c : s)\n    c = std::uniform_int_distribution<char>(' ', '~')(gen);\n  return s;\n}\n\ntemplate<class C>\nstd::basic_string<C> random_basic_string(std::mt19937 & gen, size_t maxSize = 30)\n{\n  std::basic_string<C> s(std::uniform_int_distribution<int>(3, maxSize)(gen), ' ');\n  for(C & c : s)\n    c = static_cast<C>( std::uniform_int_distribution<int>( '~', '~' )(gen) );\n  return s;\n  return s;\n}\n\ntemplate <size_t N>\nstd::string random_binary_string(std::mt19937 & gen)\n{\n  std::string s(N, ' ');\n  for(auto & c : s )\n    c = std::uniform_int_distribution<char>('0', '1')(gen);\n  return s;\n}\n\nstruct PoDStructCereal\n{\n  int32_t a;\n  int64_t b;\n  float c;\n  double d;\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar(a, b, c, d);\n  }\n};\n\nstruct PoDStructBoost\n{\n  int32_t a;\n  int64_t b;\n  float c;\n  double d;\n\n  template <class Archive>\n  void serialize( Archive & ar, const unsigned int /*version*/ )\n  {\n    ar & a & b & c & d;\n  }\n};\n\nstruct PoDChildCereal : virtual PoDStructCereal\n{\n  PoDChildCereal() : v(1024)\n  { }\n\n  std::vector<float> v;\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( cereal::virtual_base_class<PoDStructCereal>(this), v );\n  }\n};\n\nstruct PoDChildBoost : virtual PoDStructBoost\n{\n  PoDChildBoost() : v(1024)\n  { }\n\n  std::vector<float> v;\n\n  template <class Archive>\n  void serialize( Archive & ar, const unsigned int /*version*/ )\n  {\n    ar & boost::serialization::base_object<PoDStructBoost>(*this);\n    ar & v;\n  }\n};\n\nint main()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n  auto rngC = [&](){ return random_value<uint8_t>(gen); };\n  auto rngD = [&](){ return random_value<double>(gen); };\n  const bool randomize = false;\n\n  //########################################\n  auto vectorDoubleTest = [&](size_t s, bool randomize_)\n  {\n    std::ostringstream name;\n    name << \"Vector(double) size \" << s;\n\n    std::vector<double> data(s);\n    if(randomize_)\n      for( auto & d : data )\n        d = rngD();\n\n    test<binary>( name.str(), data );\n  };\n\n  vectorDoubleTest(1, randomize); // 8B\n  vectorDoubleTest(16, randomize); // 128B\n  vectorDoubleTest(1024, randomize); // 8KB\n  vectorDoubleTest(1024*1024, randomize); // 8MB\n\n  //########################################\n  auto vectorCharTest = [&](size_t s, bool randomize_)\n  {\n    std::ostringstream name;\n    name << \"Vector(uint8_t) size \" << s;\n\n    std::vector<uint8_t> data(s);\n    if(randomize_)\n      for( auto & d : data )\n        d = rngC();\n\n    test<binary>( name.str(), data );\n  };\n\n  vectorCharTest(1024*1024*64, randomize);\n\n  //########################################\n  auto vectorPoDStructTest = [&](size_t s)\n  {\n    std::ostringstream name;\n    name << \"Vector(PoDStruct) size \" << s;\n\n    std::vector<PoDStructCereal> dataC(s);\n    std::vector<PoDStructBoost> dataB(s);\n    test<binary>( name.str(), dataC, dataB );\n  };\n\n  vectorPoDStructTest(1);\n  vectorPoDStructTest(64);\n  vectorPoDStructTest(1024);\n  vectorPoDStructTest(1024*1024);\n  vectorPoDStructTest(1024*1024*2);\n\n  //########################################\n  auto vectorPoDChildTest = [&](size_t s)\n  {\n    std::ostringstream name;\n    name << \"Vector(PoDChild) size \" << s;\n\n    std::vector<PoDChildCereal> dataC(s);\n    std::vector<PoDChildBoost> dataB(s);\n    test<binary>( name.str(), dataC, dataB );\n  };\n\n  vectorPoDChildTest(1024);\n  vectorPoDChildTest(1024*32);\n\n  //########################################\n  auto stringTest = [&](size_t s)\n  {\n    std::ostringstream name;\n    name << \"String size \" << s;\n\n    std::string data = random_basic_string<char>(gen, s);\n    std::cout << \"data.size \" << data.size() << std::endl;\n    test<binary>( name.str(), data );\n  };\n\n  stringTest(200000);\n  stringTest(2000000);\n  stringTest(20000000);\n\n  //########################################\n  auto vectorStringTest = [&](size_t s)\n  {\n    std::ostringstream name;\n    name << \"Vector(String) size \" << s;\n\n    std::vector<std::string> data(s);\n    for(size_t i=0; i<data.size(); ++i)\n      data[i] = random_basic_string<char>(gen);\n\n    test<binary>( name.str(), data );\n  };\n\n  vectorStringTest(512);\n  vectorStringTest(1024);\n  vectorStringTest(1024*64);\n  vectorStringTest(1024*128);\n\n  //########################################\n  auto mapPoDStructTest = [&](size_t s)\n  {\n    std::ostringstream name;\n    name << \"Map(PoDStruct) size \" <<s;\n\n    std::map<std::string, PoDStructCereal> mC;\n    std::map<std::string, PoDStructBoost> mB;\n    for(size_t i=0; i<s; ++i)\n    {\n      mC[std::to_string( i )] = PoDStructCereal();\n      mB[std::to_string( i )] = PoDStructBoost();\n    }\n    test<binary>(name.str(), mC, mB);\n  };\n\n  mapPoDStructTest(1024);\n  mapPoDStructTest(1024*64);\n\n  return 0;\n}\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/sandbox/sandbox.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#include <cereal/cereal.hpp>\n#include <cereal/archives/binary.hpp>\n#include <cereal/archives/portable_binary.hpp>\n#include <cereal/archives/xml.hpp>\n\n#include <cereal/types/string.hpp>\n#include <cereal/types/utility.hpp>\n#include <cereal/types/memory.hpp>\n#include <cereal/types/complex.hpp>\n#include <cereal/types/base_class.hpp>\n#include <cereal/types/array.hpp>\n#include <cereal/types/vector.hpp>\n#include <cereal/types/map.hpp>\n#include <cereal/types/utility.hpp>\n#include <cereal/types/bitset.hpp>\n#include <cereal/types/polymorphic.hpp>\n\n//#include <cxxabi.h>\n#include <sstream>\n#include <fstream>\n#include <cassert>\n#include <complex>\n#include <iostream>\n#include <random>\n\nclass Base\n{\n  private:\n    friend class cereal::access;\n    template <class Archive>\n    void serialize( Archive & ar )\n    {\n      std::cout << \"Base serialize\" << std::endl;\n      ar( x );\n    }\n\n    virtual void foo() = 0;\n\n  public:\n    int x;\n\n    virtual ~Base() {}\n};\n\nclass Derived : public Base\n{\n  public:\n    using Base::x;\n    Derived() : Base(), y() {}\n    Derived( int d, int b )\n    {\n      y = d;\n      x = b;\n    }\n    virtual ~Derived() {}\n\n    template <class Archive>\n    void save( Archive & ar ) const\n    {\n      ar( cereal::virtual_base_class<Base>(this) );\n      std::cout << \"Derived save\" << std::endl;\n      ar( y );\n    }\n\n    template <class Archive>\n    void load( Archive & ar )\n    {\n      ar( cereal::virtual_base_class<Base>(this) );\n      std::cout << \"Derived load\" << std::endl;\n      ar( y );\n    }\n\n    void foo() {}\n\n    int y;\n};\n\nnamespace cereal\n{\n  template <class Archive> struct specialize<Archive, Derived, cereal::specialization::member_load_save> {};\n}\n\nCEREAL_REGISTER_TYPE(Derived)\n\n// ###################################\nstruct Test1\n{\n  int a;\n\n  private:\n    friend class cereal::access;\n    template<class Archive>\n    void serialize(Archive & ar)\n    {\n      ar(CEREAL_NVP(a));\n    }\n};\n\n// ###################################\nclass Test2\n{\n  public:\n    Test2() {}\n    Test2( int x ) : a( x ) {}\n    int a;\n\n  private:\n    friend class cereal::access;\n\n    template<class Archive>\n      void save(Archive & ar) const\n      {\n        ar(a);\n      }\n\n    template<class Archive>\n      void load(Archive & ar)\n      {\n        ar(a);\n      }\n};\n\n// ###################################\nstruct Test3\n{\n  int a;\n};\n\ntemplate<class Archive>\nvoid serialize(Archive & ar, Test3 & t)\n{\n  ar(CEREAL_NVP(t.a));\n}\n\nnamespace test4\n{\n  // ###################################\n  struct Test4\n  {\n    int a;\n  };\n\n  template<class Archive>\n  void save(Archive & ar, Test4 const & t)\n  {\n    ar(CEREAL_NVP(t.a));\n  }\n\n  template<class Archive>\n  void load(Archive & ar, Test4 & t)\n  {\n    ar(CEREAL_NVP(t.a));\n  }\n}\n\nclass Private\n{\n  public:\n    Private() : a('z') {}\n\n  private:\n    char a;\n\n    friend class cereal::access;\n\n    template<class Archive>\n      void serialize(Archive & ar)\n      {\n        ar(a);\n      }\n};\n\nstruct Everything\n{\n  int x;\n  int y;\n  Test1 t1;\n  Test2 t2;\n  Test3 t3;\n  test4::Test4 t4;\n  std::string s;\n\n  template<class Archive>\n  void serialize(Archive & ar)\n  {\n    ar(CEREAL_NVP(x));\n    ar(CEREAL_NVP(y));\n    ar(CEREAL_NVP(t1));\n    ar(CEREAL_NVP(t2));\n    ar(CEREAL_NVP(t3));\n    ar(CEREAL_NVP(t4));\n    ar(CEREAL_NVP(s));\n  }\n\n  bool operator==(Everything const & o)\n  {\n    return\n      x == o.x &&\n      y == o.y &&\n      t1.a == o.t1.a &&\n      t2.a == o.t2.a &&\n      t3.a == o.t3.a &&\n      t4.a == o.t4.a &&\n      s == o.s;\n  }\n};\n\nstruct EmptyStruct\n{\n  template<class Archive>\n  void serialize(Archive &)\n  {\n    std::cout << \"Side effects!\" << std::endl;\n  }\n};\n\nstruct NonEmptyStruct\n{\n  int x, y, z;\n};\n\nstruct NoDefaultCtor\n{\nprivate:\n  NoDefaultCtor() {};\n  int z;\n  NoDefaultCtor( int x, bool ) :y(x) {}\npublic:\n  NoDefaultCtor(int x) : y(x)\n  { }\n\n  friend class cereal::access;\n\n  int y;\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( y );\n  }\n\n  template <class Archive>\n  static void load_and_construct( Archive & ar, cereal::construct<NoDefaultCtor> & construct )\n  {\n    int yy;\n    ar( yy );\n    construct( yy, true );\n    construct->z = 33;\n    construct.ptr()->z = 33;\n  }\n};\n\n//namespace cereal\n//{\n//  template <>\n//  struct LoadAndConstruct<NoDefaultCtor>\n//  {\n//    template <class Archive>\n//    static void load_and_construct( Archive & ar, cereal::construct<NoDefaultCtor> & construct )\n//    {\n//      int y;\n//      ar( y );\n//      construct( y );\n//    }\n//  };\n//}\n\nstruct unordered_naming\n{\n  int x;\n  int y;\n  int z;\n\n  template <class Archive>\n  void save( Archive & ar ) const\n  {\n    ar( CEREAL_NVP(x),\n        CEREAL_NVP(z),\n        CEREAL_NVP(y) );\n  }\n\n  template <class Archive>\n  void load( Archive & ar )\n  {\n    ar( x,\n        CEREAL_NVP(y),\n        CEREAL_NVP(z) );\n  }\n\n  bool operator==( unordered_naming const & other ) const\n  {\n    return x == other.x && y == other.y && z == other.z;\n  }\n};\n\nstd::ostream& operator<<(std::ostream& os, unordered_naming const & s)\n{\n  os << \"[x: \" << s.x << \" y: \" << s.y << \" z: \" << s.z << \"]\";\n  return os;\n}\n\ntemplate <class IArchive, class OArchive>\nvoid test_unordered_loads()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  auto rngI = [](){ return 1; };\n  auto rngF = [](){ return 2.0f; };\n  auto rngD = [](){ return 3.2; };\n\n  for(int i=0; i<100; ++i)\n  {\n    auto const name1 = \"1\";\n    auto const name2 = \"2\";\n    auto const name3 = \"3\";\n    auto const name4 = \"4\";\n    auto const name5 = \"5\";\n    auto const name6 = \"6\";\n    auto const name7 = \"7\";\n\n    int o_int1 = rngI();\n    double o_double2 = rngD();\n    std::vector<bool> o_vecbool3 = { true, false, true, false, true };\n    int o_int4 = rngI();\n    int o_int5 = rngI();\n    int o_int6 = rngI();\n    std::pair<float, unordered_naming> o_un7;\n    o_un7.first = rngF();\n    o_un7.second.x = rngI();\n    o_un7.second.y = rngI();\n    o_un7.second.z = rngI();\n\n    {\n      std::ofstream os(\"test.xml\");\n      OArchive oar(os);\n\n      oar( cereal::make_nvp( name1, o_int1 ),\n           cereal::make_nvp( name2, o_double2 ),\n           cereal::make_nvp( name3, o_vecbool3 ),\n           cereal::make_nvp( name4, o_int4 ),\n           cereal::make_nvp( name5, o_int5 ),\n           cereal::make_nvp( name6, o_int6 ),\n           cereal::make_nvp( name7, o_un7 ) );\n    }\n\n    decltype(o_int1) i_int1;\n    decltype(o_double2) i_double2;\n    decltype(o_vecbool3) i_vecbool3;\n    decltype(o_int4) i_int4;\n    decltype(o_int5) i_int5;\n    decltype(o_int6) i_int6;\n    decltype(o_un7) i_un7;\n\n    std::ifstream is(\"test.xml\");\n    {\n      IArchive iar(is);\n\n      iar( cereal::make_nvp( name7, o_un7 ),\n           cereal::make_nvp( name2, i_double2 ),\n           cereal::make_nvp( name4, i_int4 ),\n           cereal::make_nvp( name3, i_vecbool3 ),\n           cereal::make_nvp( name1, i_int1 ),\n           cereal::make_nvp( name5, i_int5 ),\n           i_int6,\n           i_un7 );\n    }\n  }\n}\n\nclass BoostTransitionMS\n{\n  public:\n    BoostTransitionMS() {}\n    BoostTransitionMS( int xx ) : x(xx) {}\n\n    int getX(){ return x; }\n    void setX( int xx ){ x = xx; }\n\n  private:\n    friend class cereal::access;\n    int x;\n\n    template <class Archive>\n    void serialize( Archive & ar, const std::uint32_t /*version*/ )\n    { ar( x ); }\n};\n\nclass BoostTransitionSplit\n{\n  public:\n    BoostTransitionSplit() {}\n    BoostTransitionSplit( int xx ) : x(xx) {}\n\n    int getX(){ return x; }\n    void setX( int xx ){ x = xx; }\n\n  private:\n    friend class cereal::access;\n    int x;\n\n    template <class Archive>\n    void save( Archive & ar, const std::uint32_t /*version*/ ) const\n    { ar( x ); }\n\n    template <class Archive>\n    void load( Archive & ar, const std::uint32_t /*version*/ )\n    { ar( x ); }\n};\n\nclass BoostTransitionNMS\n{\n  public:\n    BoostTransitionNMS() {}\n    BoostTransitionNMS( int xx ) : x(xx) {}\n\n    int x;\n};\n\ntemplate <class Archive>\nvoid serialize( Archive & ar, BoostTransitionNMS & bnms, const std::uint32_t version )\n{ ar( bnms.x ); std::cout << \"NMS version: \" << version << std::endl; }\n\nstruct BoostTransitionNMSplit\n{\n  public:\n    BoostTransitionNMSplit() {}\n    BoostTransitionNMSplit( int xx ) : x(xx) {}\n\n    int x;\n};\n\ntemplate <class Archive>\nvoid save( Archive & ar, BoostTransitionNMSplit const & bnsplit, const std::uint32_t version )\n{ ar( bnsplit.x ); std::cout << \"NMsave version: \" << version << std::endl; }\n\ntemplate <class Archive>\nvoid load( Archive & ar, BoostTransitionNMSplit & bnsplit, const std::uint32_t version )\n{ ar( bnsplit.x ); std::cout << \"NMload version: \" << version << std::endl; }\n\n// ######################################################################\nint main()\n{\n  std::cout << std::boolalpha << std::endl;\n\n  Everything e_out;\n  e_out.x = 99;\n  e_out.y = 100;\n  e_out.t1 = {1};\n  e_out.t2 = {2};\n  e_out.t3 = {3};\n  e_out.t4 = {4};\n  e_out.s = \"Hello, World!\";\n  std::unique_ptr<NoDefaultCtor> nodefault( new NoDefaultCtor( 3 ) );\n\n  Test2 t2 = {22};\n\n  {\n    std::ofstream os(\"out.txt\", std::ios::binary);\n    cereal::BinaryOutputArchive archive(os);\n    archive(CEREAL_NVP(e_out));\n    archive(t2);\n    archive(nodefault);\n  }\n\n  Everything e_in;\n\n  std::unique_ptr<NoDefaultCtor> nodefaultin( new NoDefaultCtor( 1 ) );\n\n  {\n    std::ifstream is(\"out.txt\", std::ios::binary);\n    cereal::BinaryInputArchive archive(is);\n    archive(CEREAL_NVP(e_in));\n    archive(t2);\n    archive(nodefaultin);\n    std::remove(\"out.txt\");\n  }\n\n  assert(e_in == e_out);\n  assert(nodefault->y == nodefaultin->y);\n\n  {\n    cereal::BinaryOutputArchive archive(std::cout);\n    int xxx[] = {-1, 95, 3};\n    archive( xxx );\n\n    cereal::XMLOutputArchive archive2(std::cout, cereal::XMLOutputArchive::Options(std::numeric_limits<double>::max_digits10, true, true));\n    archive2( xxx );\n\n    std::vector<int> yyy = {1, 2, 3};\n    archive2( yyy );\n\n    archive2.saveBinaryValue( xxx, sizeof(int)*3 );\n  }\n\n  {\n    std::ofstream os(\"out.xml\");\n    cereal::XMLOutputArchive oar( os );\n    //cereal::XMLOutputArchive oar( std::cout );\n\n    oar( cereal::make_nvp(\"hello\", 5 ) );\n\n    std::string bla(\"bla\");\n    oar( bla );\n\n    auto intptr = std::make_shared<int>(99);\n    oar( CEREAL_NVP(intptr) );\n\n    std::map<std::string, int> map1 =\n    {\n      {\"one\",   1},\n      {\"two\",   2},\n      {\"three\", 3}\n    };\n\n    oar( CEREAL_NVP(map1) );\n\n    int x = 3;\n    oar( CEREAL_NVP(x) );\n    oar( 5 );\n    oar( 3.3 );\n    oar( 3.2f );\n    oar( true );\n\n    std::array<int,5> arr = {{1, 2, 3, 4, 5}};\n    oar( arr );\n\n    std::vector<std::string> vec = {\"hey\",\n                                    \"there\",\n                                    \"buddy\"};\n\n    std::vector<std::vector<std::string>> vec2 = {vec, vec, vec};\n\n    oar( cereal::make_nvp(\"EVERYTHING\", e_out) );\n    oar( vec );\n    oar( vec2 );\n\n    int xxx[] = {-1, 95, 3};\n    oar.saveBinaryValue( xxx, sizeof(int)*3, \"xxxbinary\" );\n    //oar.saveBinaryValue( xxx, sizeof(int)*3 );\n\n    std::unique_ptr<Derived> d1( new Derived(3, 4) );\n    std::unique_ptr<Base> d2( new Derived(4, 5) );\n    std::shared_ptr<Base> d3( new Derived(5, 6) );\n    oar( d1 );\n    oar( d2 );\n    oar( d3 );\n  }\n\n  {\n    std::ifstream is(\"out.xml\");\n    cereal::XMLInputArchive iar( is );\n\n    int hello;\n    iar( cereal::make_nvp(\"hello\", hello) );\n    assert( hello == 5 );\n\n    std::string bla;\n    iar( bla );\n    assert( bla == \"bla\" );\n\n    std::shared_ptr<int> intptr;\n    iar( CEREAL_NVP(intptr) );\n    assert( *intptr == 99 );\n\n    std::map<std::string, int> map1;\n\n    iar( CEREAL_NVP(map1) );\n    assert( map1[\"one\"]   == 1 );\n    assert( map1[\"two\"]   == 2 );\n    assert( map1[\"three\"] == 3 );\n\n\n    int x;\n    iar( CEREAL_NVP(x) );\n    assert( x == 3 );\n\n    int x5;\n    iar( x5 );\n    assert( x5 == 5 );\n\n    double x33;\n    iar( x33 );\n    assert( x33 == 3.3 );\n\n    float x32;\n    iar( x32 );\n    assert( x32 == 3.2f );\n\n    bool xtrue;\n    iar( xtrue );\n    assert( xtrue == true );\n\n    std::array<int,5> arr;\n    iar( arr );\n    for( int i = 0; i < 5; ++i )\n      assert( arr[i] == (i+1) );\n\n    Everything e;\n    iar( cereal::make_nvp(\"EVERYTHING\", e) );\n    assert( e == e_out );\n\n    std::vector<std::string> vec;\n    iar( vec );\n    assert( vec[0] == \"hey\" );\n    assert( vec[1] == \"there\" );\n    assert( vec[2] == \"buddy\" );\n\n    std::vector<std::vector<std::string>> vec2;\n    iar( vec2 );\n    for( auto & v : vec2 )\n    {\n      assert( v[0] == \"hey\" );\n      assert( v[1] == \"there\" );\n      assert( v[2] == \"buddy\" );\n    }\n\n    int xxx[3];\n    iar.loadBinaryValue( xxx, sizeof(int)*3 );\n    assert( xxx[0] == -1 );\n    assert( xxx[1] == 95 );\n    assert( xxx[2] == 3 );\n\n    std::unique_ptr<Derived> d1;\n    std::unique_ptr<Base> d2;\n    std::shared_ptr<Base> d3;\n\n    iar( d1 );\n    assert( d1->x == 4 && d1->y == 3 );\n    iar( d2 );\n    assert( dynamic_cast<Derived*>(d2.get())->x == 5 && dynamic_cast<Derived*>(d2.get())->y == 4 );\n    iar( d3 );\n    assert( dynamic_cast<Derived*>(d3.get())->x == 6 && dynamic_cast<Derived*>(d3.get())->y == 5 );\n  }\n\n  {\n    std::ofstream b(\"endian.out\", std::ios::binary);\n    cereal::PortableBinaryOutputArchive oar(b);\n\n    bool bb = true;\n    char a = 'a';\n    int x = 1234;\n    float y = 1.324f;\n    double z = 3.1452;\n    long double d = 1.123451234512345;\n    long long j = 2394873298472343;\n\n    oar( bb, a, x, y, z, d, j );\n    std::cout << bb << \" \" << a << \" \" << x << \" \" << y << \" \" << z << \" \" << d << \" \" << j << std::endl;\n    // valgrind will complain about uninitialized bytes here - seems to be the padding caused by the long double and\n    // long long allocations (this padding just exists on the stack and is never used anywhere)\n    // see https://bugs.kde.org/show_bug.cgi?id=197915\n  }\n  {\n    std::ifstream b(\"endian.out\", std::ios::binary);\n    cereal::PortableBinaryInputArchive iar(b);\n\n    bool bb;\n    char a;\n    int x;\n    float y;\n    double z;\n    long double d;\n    long long j;\n\n    iar( bb, a, x, y, z, d, j );\n\n    std::cout << bb << \" \" << a << \" \" << x << \" \" << y << \" \" << z << \" \" << d << \" \" << j << std::endl;\n\n    std::remove(\"endian.out\");\n  }\n\n  {\n    std::ofstream ss(\"xml_ordering.out\");\n    cereal::XMLOutputArchive ar(ss);\n\n    double one = 1;\n    double two = 2;\n    double three = 3;\n    std::vector<int> four = {1, 2, 3, 4};\n\n    // Output is ordered 3 2 1 4\n    ar( three, CEREAL_NVP(two), one, cereal::make_nvp(\"five\", four) );\n  }\n\n  {\n    std::ifstream ss(\"xml_ordering.out\");\n    cereal::XMLInputArchive ar(ss);\n\n    // Output prodered out of order, try to load in order 1 2 3 4\n    double one;\n    double two;\n    double three;\n    std::vector<int> four;\n\n    ar( one ); // cereal can only give warnings if you used an NVP!\n    ar( CEREAL_NVP( two ) );\n    ar( three );\n\n    try\n    {\n      ar( CEREAL_NVP( three ) );\n    }\n    catch( cereal::Exception const & e )\n    {\n      std::cout << e.what() << std::endl;\n      std::cout << \"Looked for three but we didn't use an NVP when saving\" << std::endl;\n    }\n    ar( cereal::make_nvp(\"five\", four) );\n    ar( cereal::make_nvp(\"five\", four) ); // do it a second time since it shouldn't matter as we provide the name\n\n    std::cout << one << std::endl;\n    std::cout << two << std::endl;\n    std::cout << three << std::endl;\n    for( auto i : four ) std::cout << i << \" \";\n    std::cout << std::endl;\n  }\n\n  {\n    // Boost transition layer stuff\n    std::ofstream ss(\"cereal_version.out\");\n    cereal::XMLOutputArchive ar(ss);\n\n    BoostTransitionMS b(3);\n    ar( b, b );\n\n    BoostTransitionSplit c(4);\n    ar( c, c );\n\n    BoostTransitionNMS d(5);\n    ar( d, d );\n\n    BoostTransitionNMSplit e(32);\n    ar( e, e );\n  }\n\n  {\n    // Boost transition layer stuff\n    std::ifstream ss(\"cereal_version.out\");\n    cereal::XMLInputArchive ar(ss);\n\n    BoostTransitionMS b;\n    ar( b );\n    assert( b.getX() == 3 );\n    b.setX( 0 );\n    ar( b );\n    assert( b.getX() == 3 );\n\n    BoostTransitionSplit c;\n    ar( c );\n    assert( c.getX() == 4 );\n    c.setX( 0 );\n    ar( c );\n    assert( c.getX() == 4 );\n\n    BoostTransitionNMS d;\n    ar( d );\n    assert( d.x == 5 );\n    d.x = 0;\n    ar( d );\n    assert( d.x == 5 );\n\n    BoostTransitionNMSplit e;\n    ar( e );\n    assert( e.x == 32 );\n    e.x = 0;\n    ar( e );\n    assert( e.x == 32 );\n  }\n\n#ifdef CEREAL_FUTURE_EXPERIMENTAL\n  {\n    // Any testing\n    int x = 32;\n    int * xx = &x;\n    std::string y(\"hello\");\n    cereal::detail::Any a(xx);\n    auto b = a;\n\n    std::cout << *((int *)a) << std::endl;\n    *((int*)a) = 44;\n    std::cout << *((int *)b) << std::endl;\n    std::cout << *((int *)a) << std::endl;\n\n    a = cereal::detail::Any(y);\n    std::string a_out = a;\n    std::cout << a_out << std::endl;\n  }\n#endif // CEREAL_FUTURE_EXPERIMENTAL\n\n  return 0;\n}\n\nCEREAL_CLASS_VERSION(BoostTransitionMS, 1)\nCEREAL_CLASS_VERSION(BoostTransitionSplit, 2)\nCEREAL_CLASS_VERSION(BoostTransitionNMS, 3)\n// keep the other at default version (0)\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/sandbox/sandbox_json.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#include <cereal/cereal.hpp>\n#include <cereal/archives/binary.hpp>\n#include <cereal/archives/json.hpp>\n\n#include <cereal/types/string.hpp>\n#include <cereal/types/utility.hpp>\n#include <cereal/types/memory.hpp>\n#include <cereal/types/complex.hpp>\n#include <cereal/types/base_class.hpp>\n#include <cereal/types/array.hpp>\n#include <cereal/types/vector.hpp>\n#include <cereal/types/map.hpp>\n\n#include <sstream>\n#include <fstream>\n#include <cassert>\n#include <complex>\n#include <iostream>\n#include <iomanip>\n#include <string>\n\n// ###################################\nstruct Test1\n{\n  int a;\n\n  private:\n    friend class cereal::access;\n    template<class Archive>\n    void serialize(Archive & ar)\n    {\n      ar(CEREAL_NVP(a));\n    }\n};\n\n// ###################################\nclass Test2\n{\n  public:\n    Test2() {}\n    Test2( int x ) : a( x ) {}\n    int a;\n\n  private:\n    friend class cereal::access;\n\n    template<class Archive>\n      void save(Archive & ar) const\n      {\n        ar(a);\n      }\n\n    template<class Archive>\n      void load(Archive & ar)\n      {\n        ar(a);\n      }\n};\n\n// ###################################\nstruct Test3\n{\n  int a;\n};\n\ntemplate<class Archive>\nvoid serialize(Archive & ar, Test3 & t)\n{\n  ar(CEREAL_NVP(t.a));\n}\n\nnamespace test4\n{\n  // ###################################\n  struct Test4\n  {\n    int a;\n  };\n\n  template<class Archive>\n  void save(Archive & ar, Test4 const & t)\n  {\n    ar(CEREAL_NVP(t.a));\n  }\n\n  template<class Archive>\n  void load(Archive & ar, Test4 & t)\n  {\n    ar(CEREAL_NVP(t.a));\n  }\n}\n\nclass Private\n{\n  public:\n    Private() : a('z') {}\n\n  private:\n    char a;\n\n    friend class cereal::access;\n\n    template<class Archive>\n      void serialize(Archive & ar)\n      {\n        ar(a);\n      }\n};\n\nstruct Everything\n{\n  int x;\n  int y;\n  Test1 t1;\n  Test2 t2;\n  Test3 t3;\n  test4::Test4 t4;\n  std::string s;\n\n  template<class Archive>\n  void serialize(Archive & ar)\n  {\n    ar(CEREAL_NVP(x));\n    ar(CEREAL_NVP(y));\n    ar(CEREAL_NVP(t1));\n    ar(CEREAL_NVP(t2));\n    ar(CEREAL_NVP(t3));\n    ar(CEREAL_NVP(t4));\n    ar(CEREAL_NVP(s));\n  }\n\n  bool operator==(Everything const & o)\n  {\n    return\n      x == o.x &&\n      y == o.y &&\n      t1.a == o.t1.a &&\n      t2.a == o.t2.a &&\n      t3.a == o.t3.a &&\n      t4.a == o.t4.a &&\n      s == o.s;\n  }\n};\n\n\nstruct SubFixture\n{\n  SubFixture() : a( 3 ),\n    b( 9999 ),\n    c( 100.1f ),\n    d( 2000.9 ),\n    s( \"hello, world!\" )\n  {}\n\n  int a;\n  uint64_t b;\n  float c;\n  double d;\n  std::string s;\n\n    template<class Archive>\n      void serialize(Archive & ar)\n      {\n        ar( CEREAL_NVP(a),\n            b,\n            c,\n            CEREAL_NVP(d),\n            CEREAL_NVP(s) );\n      }\n    void change()\n    {\n      a = 4;\n      b = 4;\n      c = 4;\n      d = 4;\n      s = \"4\";\n    }\n};\n\nstruct Fixture\n{\n  SubFixture f1, f2, f3;\n  int array[4];\n\n  Fixture()\n  {\n    array[0] = 1;\n    array[1] = 2;\n    array[2] = 3;\n    array[3] = 4;\n  }\n\n  template<class Archive>\n  void save(Archive & ar) const\n  {\n    ar( f1,\n        CEREAL_NVP(f2),\n        f3 );\n    ar.saveBinaryValue( array, sizeof(int)*4, \"cool array man\" );\n  }\n\n  template<class Archive>\n  void load(Archive & ar)\n  {\n    ar( f1,\n        CEREAL_NVP(f2),\n        f3 );\n    ar.loadBinaryValue( array, sizeof(int)*4 );\n  }\n\n    void change()\n    {\n      f1.change();\n      f2.change();\n      f3.change();\n    }\n};\n\nstruct AAA\n{\n  AAA() : one( 1 ), two( 2 ), three( { {1, 2, 3}, { 4, 5, 6 }, {} } ) {}\n  int one, two;\n\n  std::vector<std::vector<int>> three;\n\n  template<class Archive>\n    void serialize(Archive & ar)\n    {\n      ar( CEREAL_NVP(one), CEREAL_NVP(two) );\n      //ar( CEREAL_NVP(three) );\n    }\n};\n\nclass Stuff\n{\n  public:\n    Stuff() {}\n\n    void fillData()\n    {\n      std::vector<std::complex<float>> t1{ {0, -1.0f},\n                          { 0, -2.9932f },\n                          { 0, -3.5f } };\n      std::vector<std::complex<float>> t2{ {1.0f, 0},\n                     { 2.2f, 0 },\n                     { 3.3f, 0 } };\n      data[\"imaginary\"] = t1;\n      data[\"real\"] = t2;\n    }\n\n  private:\n    std::map<std::string, std::vector<std::complex<float>>> data;\n\n    friend class cereal::access;\n\n    template <class Archive>\n    void serialize( Archive & ar )\n    {\n      ar( CEREAL_NVP(data) );\n    }\n};\n\nstruct OOJson\n{\n  OOJson() = default;\n  OOJson( int aa, int bb, bool cc, double dd ) :\n    a( aa ), b( bb ), c{ cc, dd }\n  {\n    d[0] = 0; d[1] = 1; d[2] = 2;\n  }\n\n  int a;\n  int b;\n  std::pair<bool, double> c;\n  float d[3];\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( CEREAL_NVP(c) );\n    ar( CEREAL_NVP(a) );\n    ar( b );\n    ar( CEREAL_NVP(d) );\n  }\n};\n\n// ######################################################################\nint main()\n{\n  std::cout << std::boolalpha << std::endl;\n\n  {\n    std::ofstream os(\"file.json\");\n    cereal::JSONOutputArchive oar( os );\n\n    //auto f = std::make_shared<Fixture>();\n    //auto f2 = f;\n    //oar( f );\n    //oar( f2 );\n    Stuff s; s.fillData();\n    oar( cereal::make_nvp(\"best data ever\", s) );\n  }\n\n  {\n    std::ifstream is(\"file.json\");\n    std::string str((std::istreambuf_iterator<char>(is)), std::istreambuf_iterator<char>());\n    std::cout << \"---------------------\" << std::endl << str << std::endl << \"---------------------\" << std::endl;\n  }\n\n  // playground\n  {\n    cereal::JSONOutputArchive archive( std::cout );\n    bool arr[] = {true, false};\n    std::vector<int> vec = {1, 2, 3, 4, 5};\n    archive( CEREAL_NVP(vec),\n        arr );\n    auto f = std::make_shared<Fixture>();\n    auto f2 = f;\n    archive( f );\n    archive( f2 );\n  }\n\n  // test out of order\n  std::stringstream oos;\n  {\n    cereal::JSONOutputArchive ar(oos);\n    cereal::JSONOutputArchive ar2(std::cout,\n        cereal::JSONOutputArchive::Options(2, cereal::JSONOutputArchive::Options::IndentChar::space, 2) );\n\n    ar( cereal::make_nvp( \"1\", 1 ),\n        cereal::make_nvp( \"2\", 2 ),\n        3,\n        0, // unused\n        cereal::make_nvp( \"4\", 4 ),\n        cereal::make_nvp( \"5\", 5 ) );\n\n    int x = 33;\n    ar.saveBinaryValue( &x, sizeof(int), \"bla\" );\n\n    ar2( cereal::make_nvp( \"1\", 1 ),\n         cereal::make_nvp( \"2\", 2 ),\n         3,\n         0, // unused\n         cereal::make_nvp( \"4\", 4 ),\n         cereal::make_nvp( \"5\", 5 ) );\n    ar2.saveBinaryValue( &x, sizeof(int), \"bla\" );\n\n    OOJson oo( 1, 2, true, 4.2 );\n    ar( CEREAL_NVP(oo) );\n    ar2( CEREAL_NVP(oo) );\n\n    // boost stuff\n    ar & cereal::make_nvp(\"usingop&\", oo ) & 6;\n    ar << 5 << 4 << 3;\n\n    ar2 & cereal::make_nvp(\"usingop&\", oo ) & 6;\n    ar2 << 5 << 4 << 3;\n\n    long double ld = std::numeric_limits<long double>::max();\n    long long ll = std::numeric_limits<long long>::max();\n    unsigned long long ull = std::numeric_limits<unsigned long long>::max();\n\n    ar( CEREAL_NVP(ld),\n        CEREAL_NVP(ll),\n        CEREAL_NVP(ull) );\n\n    ar2( CEREAL_NVP(ld),\n         CEREAL_NVP(ll),\n         CEREAL_NVP(ull) );\n  }\n\n  {\n    cereal::JSONInputArchive ar(oos);\n    int i1, i2, i3, i4, i5, x;\n\n    ar( i1 );\n    ar( cereal::make_nvp( \"2\", i2 ), i3 );\n\n    ar( cereal::make_nvp( \"4\", i4 ),\n        i5 );\n\n    ar.loadBinaryValue( &x, sizeof(int) );\n\n    OOJson ii;\n    ar( cereal::make_nvp(\"oo\", ii) );\n    ar( cereal::make_nvp( \"2\", i2 ) );\n\n    std::cout << i1 << \" \" << i2 << \" \" << i3 << \" \" << i4 << \" \" << i5 << std::endl;\n    std::cout << x << std::endl;\n    std::cout << ii.a << \" \" << ii.b << \" \" << ii.c.first << \" \" << ii.c.second << \" \";\n    for( auto z : ii.d )\n      std::cout << z << \" \";\n    std::cout << std::endl;\n\n    OOJson oo;\n    ar >> cereal::make_nvp(\"usingop&\", oo );\n    std::cout << oo.a << \" \" << oo.b << \" \" << oo.c.first << \" \" << oo.c.second << \" \";\n    for( auto z : oo.d )\n      std::cout << z << \" \";\n\n    int aa, a, b, c;\n    ar & aa & a & b & c;\n    std::cout << aa << \" \" << a << \" \" << b << \" \" << c << std::endl;\n\n    long double ld;\n    long long ll;\n    unsigned long long ull;\n\n    ar( CEREAL_NVP(ld),\n        CEREAL_NVP(ll),\n        CEREAL_NVP(ull) );\n\n    std::cout << (ld  == std::numeric_limits<long double>::max()) << std::endl;\n    std::cout << (ll  == std::numeric_limits<long long>::max()) << std::endl;\n    std::cout << (ull == std::numeric_limits<unsigned long long>::max()) << std::endl;\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/sandbox/sandbox_rtti.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#include <type_traits>\n#include <cereal/archives/binary.hpp>\n#include <cereal/archives/xml.hpp>\n#include <cereal/types/polymorphic.hpp>\n#include <sstream>\n#include <fstream>\n#include <iostream>\n\nstruct Base\n{\n  int y;\n  virtual void foo() = 0;\n  virtual ~Base() {}\n\n  template<class Archive>\n    void save(Archive & ar) const\n    {\n      std::cout << \"Saving Base\" << std::endl;\n      ar( y );\n    }\n\n  template<class Archive>\n    void load(Archive & ar)\n    {\n      std::cout << \"Loading Base\" << std::endl;\n      ar( y );\n    }\n};\n\nstruct MyType : public Base\n{\n  virtual ~MyType() {}\n\n  int x;\n\n  void foo() {}\n\n  template<class Archive>\n    void save(Archive & ar) const\n    {\n      std::cout << \"Saving MyType\" << std::endl;\n      ar( cereal::virtual_base_class<Base>( this ) );\n    }\n\n  template<class Archive>\n    void load(Archive & ar)\n    {\n      std::cout << \"Loading MyType\" << std::endl;\n      ar( cereal::base_class<Base>( this ) );\n    }\n};\nCEREAL_REGISTER_TYPE(MyType)\n\nstruct YourType : public Base\n{\n  virtual ~YourType() {}\n\n  YourType(int xx) : x(xx) {}\n  YourType() : x(-1) {}\n  int x;\n\n  void foo() {}\n\n  template<class Archive>\n    void save(Archive & ar) const\n    {\n      std::cout << \"Saving YourType\" << std::endl;\n      ar( x );\n    }\n\n  template<class Archive>\n    void load(Archive & ar)\n    {\n      std::cout << \"Loading YourType\" << std::endl;\n      ar( x );\n    }\n};\n\nCEREAL_REGISTER_TYPE(YourType)\nCEREAL_REGISTER_POLYMORPHIC_RELATION(Base, YourType)\n\nstruct OurBase\n{\n  virtual void foo() {}\n\n  template<class Archive>\n    void serialize(Archive &)\n    { }\n};\n\nstruct OurType : public OurBase\n{\n  OurType() : OurBase(), x() {}\n  OurType(int x_) : x(x_) {}\n  virtual ~OurType() {}\n\n  void foo() {}\n\n  int x;\n\n  template<class Archive>\n    void serialize(Archive & ar)\n    {\n      ar( x );\n    }\n};\n\nstruct BaseVirtual\n{\n  int x;\n  template <class Archive>\n  void serialize( Archive & ar )\n  { ar( x ); }\n  virtual void foo() = 0;\n};\n\nstruct DerivedVirtual : public virtual BaseVirtual\n{\n  virtual ~DerivedVirtual() {}\n\n  int y;\n  virtual void foo() {}\n\n  template <class Archive>\n  void save( Archive & ar ) const\n  {\n    ar( cereal::virtual_base_class<BaseVirtual>( this ) );\n    ar( y );\n  }\n\n  template <class Archive>\n  void load( Archive & ar )\n  {\n    ar( cereal::virtual_base_class<BaseVirtual>( this ) );\n    ar( y );\n  }\n};\n\nstruct TestType\n{\n  int x;\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( x );\n  }\n};\n\nnamespace cereal\n{\n  template <class Archive> struct specialize<Archive, DerivedVirtual, cereal::specialization::member_load_save> {};\n  template <class Archive> struct specialize<Archive, TestType, cereal::specialization::member_serialize> {};\n}\n\nstruct AAA\n{\n  virtual void foo() = 0;\n};\n\nstruct BBB : AAA\n{\n  virtual ~BBB() {}\n  void foo() {}\n  template <class Archive>\n  void serialize( Archive & ) {}\n};\n\nCEREAL_REGISTER_TYPE(BBB)\n\ntemplate <class T> void nop(T&&) {}\n\nint main()\n{\n  {\n    std::ofstream ostream(\"rtti.txt\");\n    //cereal::BinaryOutputArchive oarchive(ostream);\n    cereal::XMLOutputArchive oarchive(ostream);\n\n    std::shared_ptr<Base> ptr1 = std::make_shared<MyType>();\n    std::shared_ptr<Base> ptr2 = std::make_shared<YourType>(33);\n    std::unique_ptr<Base> ptr3(new MyType());\n    std::weak_ptr<Base>   ptr4 = ptr2;\n\n    std::shared_ptr<OurType> ptr5 = std::make_shared<OurType>(99);\n\n    oarchive(ptr1);\n    oarchive(ptr2);\n    oarchive(ptr3);\n    oarchive(ptr4);\n    oarchive(ptr5);\n\n    //std::shared_ptr<AAA> a = std::make_shared<BBB>();\n    //oarchive(a);\n  }\n\n  {\n    std::ifstream istream(\"rtti.txt\");\n    //cereal::BinaryInputArchive iarchive(istream);\n    cereal::XMLInputArchive iarchive(istream);\n\n    std::shared_ptr<Base> ptr1;\n    std::shared_ptr<Base> ptr2;\n    std::unique_ptr<Base> ptr3;\n    std::weak_ptr<Base>   ptr4;\n\n    std::shared_ptr<OurType> ptr5;\n\n    iarchive(ptr1);\n    iarchive(ptr2);\n    iarchive(ptr3);\n    iarchive(ptr4);\n    iarchive(ptr5);\n  }\n}\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/sandbox/sandbox_shared_lib/CMakeLists.txt",
    "content": "add_library(sandbox_vs_dll SHARED base.cpp derived.cpp)\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/sandbox/sandbox_shared_lib/base.cpp",
    "content": "#ifndef CEREAL_DLL_USE\n#define CEREAL_DLL_MAKE\n#endif\n#include \"base.hpp\"\n\ntemplate void Base::serialize<cereal::XMLOutputArchive>\n    ( cereal::XMLOutputArchive & ar, std::uint32_t const version );\ntemplate void Base::serialize<cereal::XMLInputArchive>\n    ( cereal::XMLInputArchive & ar, std::uint32_t const version );\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/sandbox/sandbox_shared_lib/base.hpp",
    "content": "#pragma once\n\n#include <memory>\n#include <cereal/cereal.hpp>\n#include <cereal/archives/xml.hpp>\n#include <cereal/types/polymorphic.hpp>\n\n#if defined (_WINDLL)\n#define DECLSPECIFIER __declspec(dllexport)\n#elif defined(MSC_VER)\n#define DECLSPECIFIER __declspec(dllimport)\n#else\n#define DECLSPECIFIER\n#endif\n\nint doit();\n\nclass VersionTest\n{\n  public:\n    int x;\n    template <class Archive>\n    void serialize( Archive & ar, const std::uint32_t /* version */ )\n    { ar( x ); }\n};\n\nclass Base\n{\n  public:\n    friend class cereal::access;\n\n    template < class Archive >\n    void serialize(Archive &, std::uint32_t const) {}\n    virtual ~Base() {}\n};\n\nextern template DECLSPECIFIER void Base::serialize<cereal::XMLInputArchive>\n( cereal::XMLInputArchive & ar, std::uint32_t const version );\n\nextern template DECLSPECIFIER void Base::serialize<cereal::XMLOutputArchive>\n( cereal::XMLOutputArchive & ar, std::uint32_t const version );\n\nCEREAL_CLASS_VERSION(VersionTest, 1)\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/sandbox/sandbox_shared_lib/derived.cpp",
    "content": "#ifndef CEREAL_DLL_USE\n#define CEREAL_DLL_MAKE\n#endif\n#include \"derived.hpp\"\n\ntemplate void Derived::serialize<cereal::XMLOutputArchive>\n    ( cereal::XMLOutputArchive & ar, std::uint32_t const version );\n\ntemplate void Derived::serialize<cereal::XMLInputArchive>\n    ( cereal::XMLInputArchive & ar, std::uint32_t const version );\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/sandbox/sandbox_shared_lib/derived.hpp",
    "content": "#pragma once\n#include \"base.hpp\"\nclass Derived : public Base\n{\n  public:\n    virtual ~Derived() {}\n\n  private:\n    friend class cereal::access;\n    template <class Archive>\n    void serialize(Archive & ar, std::uint32_t const)\n    {\n      ar(cereal::base_class<Base>(this));\n    }\n};\n\nextern template DECLSPECIFIER void Derived::serialize<cereal::XMLOutputArchive>\n    ( cereal::XMLOutputArchive & ar, std::uint32_t const version );\nextern template DECLSPECIFIER void Derived::serialize<cereal::XMLInputArchive>\n    ( cereal::XMLInputArchive & ar, std::uint32_t const version );\n\nCEREAL_REGISTER_TYPE(Derived)\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/sandbox/sandbox_vs.cpp",
    "content": "#include <base.hpp>\n#include <derived.hpp>\n\n#include <cereal/access.hpp>\n#include <cereal/details/traits.hpp>\n#include <cereal/details/helpers.hpp>\n#include <cereal/types/base_class.hpp>\n#include <cereal/cereal.hpp>\n\n#include <cereal/types/array.hpp>\n#include <cereal/types/bitset.hpp>\n#include <cereal/types/chrono.hpp>\n#include <cereal/types/common.hpp>\n#include <cereal/types/complex.hpp>\n#include <cereal/types/deque.hpp>\n#include <cereal/types/forward_list.hpp>\n#include <cereal/types/list.hpp>\n#include <cereal/types/map.hpp>\n#include <cereal/types/memory.hpp>\n\n#include <cereal/details/util.hpp>\n\n#include <cereal/details/polymorphic_impl.hpp>\n#include <cereal/types/polymorphic.hpp>\n\n#include <cereal/types/queue.hpp>\n#include <cereal/types/set.hpp>\n#include <cereal/types/stack.hpp>\n#include <cereal/types/string.hpp>\n#include <cereal/types/tuple.hpp>\n#include <cereal/types/unordered_map.hpp>\n#include <cereal/types/unordered_set.hpp>\n#include <cereal/types/utility.hpp>\n#include <cereal/types/vector.hpp>\n\n#include <cereal/archives/binary.hpp>\n#include <cereal/archives/portable_binary.hpp>\n#include <cereal/archives/xml.hpp>\n#include <cereal/archives/json.hpp>\n\n#include <iostream>\n#include <type_traits>\n#include <functional>\n\n//CEREAL_FORCE_LINK_SHARED_LIBRARY(Sandbox)\n\nstruct Archive {};\nCEREAL_SETUP_ARCHIVE_TRAITS(Archive, Archive)\n\nstruct Test\n{\n  template <class Archive>\n  void serialzize( Archive & )\n  {\n    std::cout << \"hey there\" << std::endl;\n  }\n\n  template <class Archive>\n  void save( Archive & ) const\n  {\n    std::cout << \"saved by the bell\" << std::endl;\n  }\n\n  template <class Archive>\n  void load( Archive & )\n  {\n    std::cout << \"locked and loaded\" << std::endl;\n  }\n\n  template <class Archive>\n  static void load_and_construct( Archive &, cereal::construct<Test> & )\n  {\n  }\n\n  template <class Archive>\n  int save_minimal() const\n  {\n    return 0;\n  }\n\n  template <class Archive>\n  int save_minimal(const std::uint32_t) const\n  {\n    return 1;\n  }\n\n  template <class Archive>\n  void load_minimal( int & )\n  { }\n};\n\ntemplate <class Archive>\nvoid serialize( Archive &, Test & )\n{ }\n\ntemplate <class Archive>\nvoid load( Archive &, Test & )\n{ }\n\ntemplate <class Archive>\nvoid save( Archive &, Test const & )\n{ }\n\ntemplate <class Archive>\nint save_minimal( Test const & )\n{ return 0; }\n\ntemplate <class Archive>\nint save_minimal( Test const &, const std::uint32_t )\n{ return 0; }\n\nnamespace cereal\n{\n  template <>\n  struct LoadAndConstruct<Test>\n  {\n    template <class Archive>\n    static void load_and_construct( Archive &, cereal::construct<Test> & construct )\n    {\n      construct();\n    }\n  };\n}\n\nstruct A\n{\n  virtual void foo() = 0;\n  virtual ~A() {}\n};\n\nstruct B : A\n{\n  virtual ~B() {}\n  void foo() {}\n\n  template <class Archive>\n  void serialize( Archive & )\n  {\n    std::cout << \"i'm in your b\" << std::endl;\n  }\n};\n\nstruct C\n{\n  char a;\n};\n\nCEREAL_REGISTER_TYPE(B)\nCEREAL_REGISTER_POLYMORPHIC_RELATION(A, B)\n\nclass MemberMinimal\n{\n  public:\n    MemberMinimal() = default;\n    template <class Archive>\n    int save_minimal( Archive const & ) const\n    {\n      return x;\n    }\n\n    template <class Archive>\n    void load_minimal( Archive const &, int const & str )\n    {\n      x = str;\n    }\n\n  public:\n    int x;\n};\n\nint main()\n{\n  typedef Test T;\n  std::cout << std::boolalpha;\n\n  // Test Load and Construct internal/external\n  std::cout << \"\\tload_and_construct\" << std::endl;\n  std::cout << cereal::traits::has_member_load_and_construct<T, Archive>::value << std::endl;\n  std::cout << cereal::traits::has_non_member_load_and_construct<T, Archive>::value << std::endl;\n\n  // serialize\n  std::cout << \"\\tserialize\" << std::endl;\n  std::cout << cereal::traits::has_member_serialize<T, Archive>::value << std::endl;\n  std::cout << cereal::traits::has_non_member_serialize<T, Archive>::value << std::endl;\n\n  // load\n  std::cout << \"\\tload\" << std::endl;\n  std::cout << cereal::traits::has_member_load<T, Archive>::value << std::endl;\n  std::cout << cereal::traits::has_non_member_load<T, Archive>::value << std::endl;\n\n  // load minimal\n  std::cout << \"\\tload minimal\" << std::endl;\n  std::cout << cereal::traits::has_member_load<T, Archive>::value << std::endl;\n\n  // save\n  std::cout << \"\\tsave\" << std::endl;\n  std::cout << cereal::traits::has_member_save<T, Archive>::value << std::endl;\n  std::cout << cereal::traits::has_non_member_save<T, Archive>::value << std::endl;\n\n  // save_minimal\n  std::cout << \"\\tsave_minimal\" << std::endl;\n  std::cout << cereal::traits::has_member_save_minimal<T, Archive>::value << std::endl;\n  std::cout << cereal::traits::has_non_member_save_minimal<T, Archive>::value << std::endl;\n\n  // save_minimal_versioned\n  std::cout << \"\\tsave_minimal versioned\" << std::endl;\n  std::cout << cereal::traits::has_member_versioned_save_minimal<T, Archive>::value << std::endl;\n  std::cout << cereal::traits::has_non_member_versioned_save_minimal<T, Archive>::value << std::endl;\n\n  // splittable\n  std::cout << \"\\t splittable\" << std::endl;\n  std::cout << cereal::traits::has_member_split<T, Archive, Archive>::value << std::endl;\n  std::cout << cereal::traits::has_non_member_split<T, Archive, Archive>::value << std::endl;\n\n  // serialiable\n  std::cout << \"\\toutput serializable\" << std::endl;\n  std::cout << cereal::traits::is_output_serializable<T, Archive>::value << std::endl;\n\n#if !defined(__INTEL_COMPILER)\n  //! TODO: This causes icc to crash\n  std::cout << cereal::traits::is_input_serializable<T, Archive>::value << std::endl;\n#endif\n\n  // specialized\n  std::cout << \"\\tspecialized\" << std::endl;\n  std::cout << cereal::traits::detail::is_specialized_member_serialize<T, Archive>::value << std::endl;\n  std::cout << cereal::traits::detail::is_specialized_member_load_save<T, Archive>::value << std::endl;\n  std::cout << cereal::traits::detail::is_specialized_non_member_serialize<T, Archive>::value << std::endl;\n  std::cout << cereal::traits::detail::is_specialized_non_member_load_save<T, Archive>::value << std::endl;\n  std::cout << cereal::traits::detail::count_specializations<T, Archive>::value << std::endl;\n  std::cout << cereal::traits::is_specialized<T, Archive>::value << std::endl;\n\n  // array size\n  std::cout << typeid(A).name() << std::endl;\n  std::cout << typeid(cereal::traits::has_load_and_construct<int, bool>).name() << std::endl;\n\n  // extra testing\n  std::cout << \"\\textra\" << std::endl;\n  std::cout << cereal::traits::has_member_save_minimal<MemberMinimal, Archive>::value << std::endl;\n  std::cout << cereal::traits::has_member_load_minimal<MemberMinimal, Archive>::value << std::endl;\n\n  // DLL testing\n  std::cout << \"------DLL TESTING------\" << std::endl;\n  std::stringstream dllSS1;\n  std::stringstream dllSS2;\n  {\n    cereal::XMLOutputArchive out(dllSS1);\n    VersionTest x{1};\n    std::shared_ptr<Base> p = std::make_shared<Derived>();\n    out(x);\n    out( p );\n\n    std::shared_ptr<A> ay = std::make_shared<B>();\n    out(ay);\n  }\n\n  std::cout << dllSS1.str() << std::endl;\n\n  {\n    VersionTest x;\n    std::shared_ptr<Base> p;\n    std::shared_ptr<A> ay;\n    {\n      cereal::XMLInputArchive in(dllSS1);\n      in(x);\n      in( p );\n      in( ay );\n    }\n    {\n      cereal::XMLOutputArchive out(dllSS2);\n      out( x );\n      out( p );\n      out( ay );\n    }\n  }\n\n  std::cout << dllSS2.str() << std::endl;\n\n  return 0;\n}\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/scripts/add_rapidjson_prefix.sh",
    "content": "# Applies renaming within all of the rapidjson source files to add a cereal prefix\nfind ./../include/cereal/external/rapidjson/ -type f -name \\*.h -exec sed -i \"s/RAPIDJSON_/CEREAL_RAPIDJSON_/g\" {} \\;\necho \"Remember to backport any cereal specific changes not in this version of RapidJSON!\"\necho \"See https://github.com/USCiLab/cereal/commits/develop/include/cereal/external/rapidjson\"\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/scripts/appveyor.bat",
    "content": "@echo off\nsetlocal enabledelayedexpansion\n\nif not defined APPVEYOR (\n    @echo This script is meant to be used with AppVeyor CI. This can be used as reference.\n    @echo I sincerely recommend not using it for building/testing cereal locally.\n    exit /b 0\n)\n\nif not defined BOOST_ROOT (\n    set BOOST_ROOT=C:\\Libraries\\boost\n)\n\nif not defined VS_VERSION_MAJOR (\n    set VS_VERSION_MAJOR=14\n)\nif not defined VS_VERSION_YEAR (\n    if \"%VS_VERSION_MAJOR%\" == \"12\" (\n        set VS_VERSION_YEAR=2013\n    ) else if \"%VS_VERSION_MAJOR%\" == \"14\" (\n        set VS_VERSION_YEAR=2015\n    ) else if \"%VS_VERSION_MAJOR%\" == \"15\" (\n        set VS_VERSION_YEAR=2017\n    ) else if \"%VS_VERSION_MAJOR%\" == \"16\" (\n        set VS_VERSION_YEAR=2019\n    ) else (\n        @echo Cannot use Visual Studio version %VS_VERSION_MAJOR%\n        exit /b 1\n    )\n)\nif not defined CMAKE_GENERATOR_PREFIX (\n    set CMAKE_GENERATOR_PREFIX=Visual Studio %VS_VERSION_MAJOR% %VS_VERSION_YEAR%\n)\n\n@rem CONFIGURATION is (one of the entries) defined in appveyor.yml\nif not defined CONFIGURATION (\n    set CONFIGURATION=Release\n)\n@rem PLATFORM is (one of the entries) defined in appveyor.yml\nif \"%PLATFORM%\"==\"x64\" (\n    set BIT_COUNT=64\n    set CMAKE_GENERATOR_NAME=%CMAKE_GENERATOR_PREFIX% Win64\n) else (\n    set BIT_COUNT=32\n    set CMAKE_GENERATOR_NAME=%CMAKE_GENERATOR_PREFIX%\n)\n\nset BOOST_LIBRARYDIR=%BOOST_ROOT%\\lib%BIT_COUNT%-msvc-%VS_VERSION_MAJOR%.0\n\nset START_DIR=%CD%\n\nif not exist build\\NUL mkdir build\ncd build\n\nif \"%~1\" == \"test\" (\n    @rem overloading the batch script; Run tests if the first argument is `test` (without quotes).\n    @rem   Cereal uses Boost Unit test framework. Rather than modifying the code to load boost test\n    @rem dll from its location OR copying the boost dlls to the directory of every test being run,\n    @rem we use another option Windows leaves us - modify the PATH.\n    for %%i in (ctest.exe) do set CTEST_EXE=%%~$PATH:i\n    PATH %BOOST_LIBRARYDIR%\n    \"!CTEST_EXE!\" -C %CONFIGURATION%\n    if %errorlevel% neq 0 exit /b %errorlevel%\n    goto done\n)\n\nif \"%PLATFORM%\" == \"x64\" (\n    @rem please excuse the hack - CMake is unable to produce multiarch MSVC projects\n    cmake -G \"%CMAKE_GENERATOR_PREFIX%\" -DBOOST_ROOT=%BOOST_ROOT% -DBOOST_LIBRARYDIR=%BOOST_LIBRARYDIR% ..\n    cmake --build . --config %CONFIGURATION% --target portability_test32\n    del CMakeCache.txt\n    rmdir /s /q CMakeFiles\n)\n\ncmake -G \"%CMAKE_GENERATOR_NAME%\" -DBOOST_ROOT=%BOOST_ROOT% -DBOOST_LIBRARYDIR=%BOOST_LIBRARYDIR% ..\n@rem left the actual build for later - AppVeyor enables parallel jobs in a much cleaner way than msbuild\n\n:done\n@REM go back home\ncd %START_DIR%\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/scripts/renameincludes.sh",
    "content": "#!/usr/bin/env bash\n\ndestdir=\"include_renamed\"\n\necho -n \"New prefix: \"\nread newprefix\n\ncp -r include ${destdir}\n\nnewprefix=$(echo ${newprefix} | sed -e 's/\\//\\\\\\//')\n\nfind ${destdir} -name '*.hpp' -exec sed -i \"s/#include <cereal/#include <${newprefix}\\/cereal/\" {} \\;\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/scripts/updatecoverage.sh",
    "content": "#!/usr/bin/env bash\n\n# Updates the coverage documentation, and copies it into the appropriate place\n# in the gh-pages branch.\n#   $1 from CMAKE will contain the root directory of cereal\n\n# this requires lcov 1.10 or newer\n\nset -e\n\nCOVERAGE_TESTS=./coverage_*\n\n# run tests\nfor f in $COVERAGE_TESTS\n  do\n    echo $f\n    $f\n  done\n\n# build coverage output\ntempdir=`mktemp -d`\n\nlcov --capture --directory $1 --output-file coverage.info --no-external\nlcov --remove coverage.info '*/external/*' '*/cereal/details/util.hpp' 'sandbox/*' '*/unittests/*' -o coverage.info\ngenhtml --demangle-cpp coverage.info --output-directory ${tempdir}\n\n# copy over to gh pages\ngit checkout gh-pages\n\nrm -rf $1/assets/coverage\nmkdir $1/assets/coverage\ncp -r ${tempdir}/* $1/assets/coverage/\nrm -rf ${tempdir}\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/scripts/updatedoc.in",
    "content": "#!/usr/bin/env bash\n\n# Updates the doxygen documentation, and copies it into the appropriate place\n# in the gh-pages branch.\n\nset -e\n\ntempdir=`mktemp -d`\nbranch=`git rev-parse --abbrev-ref HEAD`\n\ncp -r @PROJECT_BINARY_DIR@/doc/html/ ${tempdir}\n\ngit stash\ngit checkout gh-pages\n\nrm -rf @PROJECT_SOURCE_DIR@/assets/doxygen\nmkdir @PROJECT_SOURCE_DIR@/assets/doxygen\ncp -r ${tempdir}/html/* @PROJECT_SOURCE_DIR@/assets/doxygen/\n\nrm -rf ${tempdir}\n\ngit commit @PROJECT_SOURCE_DIR@/assets/doxygen\n\ngit checkout ${branch}\ngit stash apply\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/CMakeLists.txt",
    "content": "file(GLOB TESTS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp)\n\n# A semi-colon separated list of test sources that should not be automatically built with doctest \nset(SPECIAL_TESTS \"portability_test.cpp\")\n\nif(CMAKE_VERSION VERSION_LESS 2.8)\n  # Portability test uses the `TARGET_FILE_DIR` generator expression which is available from CMake 2.8.\n  set(SKIP_PORTABILITY_TEST ON)\nendif()\n\nif(NOT SKIP_PORTABILITY_TEST)\n  # Build the portability test only if we are on a 64-bit machine (void* is 8 bytes)\n  if((${CMAKE_SIZEOF_VOID_P} EQUAL 8))\n    if(NOT MSVC)\n      add_executable(portability_test32 portability_test.cpp)\n      set_target_properties(portability_test32 PROPERTIES COMPILE_FLAGS \"-m32\")\n      set_target_properties(portability_test32 PROPERTIES LINK_FLAGS \"-m32\")\n    endif()\n\n    add_executable(portability_test64 portability_test.cpp)\n\n    add_test(NAME portability_test\n            COMMAND ${CMAKE_COMMAND}\n              -DPORTABILITY_TEST_DIR=$<TARGET_FILE_DIR:portability_test64>\n            -P \"${CMAKE_CURRENT_SOURCE_DIR}/run_portability_test.cmake\")\n\n  elseif(MSVC)\n    add_executable(portability_test32 portability_test.cpp)\n  endif()\nendif()\n\n# Build all of the non-special tests\nforeach(TEST_SOURCE ${TESTS})\n\n  string(REPLACE \".cpp\" \"\" TEST_TARGET \"${TEST_SOURCE}\")\n  set(TEST_TARGET \"test_${TEST_TARGET}\")\n\n  # Check to see if our target is listed in \"SPECIAL_TESTS\"\n  list(FIND SPECIAL_TESTS \"${TEST_SOURCE}\" IS_SPECIAL_TEST)\n\n  if(IS_SPECIAL_TEST EQUAL -1)\n\n    add_executable(${TEST_TARGET} ${TEST_SOURCE})\n    target_link_libraries(${TEST_TARGET} ${CEREAL_THREAD_LIBS})\n    add_test(\"${TEST_TARGET}\" \"${TEST_TARGET}\")\n\n    # If we are on a 64-bit machine, create an extra 32-bit version of the test if portability testing is enabled\n    if((NOT MSVC) AND (${CMAKE_SIZEOF_VOID_P} EQUAL 8) AND (NOT SKIP_PORTABILITY_TEST))\n      add_executable(${TEST_TARGET}_32 ${TEST_SOURCE})\n      set_target_properties(${TEST_TARGET}_32 PROPERTIES\n        COMPILE_FLAGS \"-m32\" LINK_FLAGS \"-m32\")\n      add_test(\"${TEST_TARGET}_32\" \"${TEST_TARGET}_32\")\n    endif()\n\n  endif()\n\nendforeach()\n\n# Add the valgrind target\nif(NOT MSVC)\n  add_custom_target(valgrind\n    COMMAND \"${CMAKE_CURRENT_SOURCE_DIR}/run_valgrind.sh\")\n\n  # Add the coverage target\n  add_custom_target(coverage)\n  add_custom_command(TARGET coverage\n    COMMAND \"${CMAKE_SOURCE_DIR}/scripts/updatecoverage.sh\" ${CMAKE_SOURCE_DIR}\n    WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}/coverage\")\n\n  # add tests to coverage\n  foreach(TEST_SOURCE ${TESTS})\n    string(REPLACE \".cpp\" \"\" COVERAGE_TARGET \"${TEST_SOURCE}\")\n    set(COVERAGE_TARGET \"coverage_${COVERAGE_TARGET}\")\n\n    # Check to see if our target is listed in \"SPECIAL_TESTS\"\n    list(FIND SPECIAL_TESTS \"${TEST_SOURCE}\" IS_SPECIAL_TEST)\n\n    if(IS_SPECIAL_TEST EQUAL -1)\n      add_dependencies(coverage ${COVERAGE_TARGET})\n\n      add_executable(${COVERAGE_TARGET} EXCLUDE_FROM_ALL ${TEST_SOURCE})\n      set_target_properties(${COVERAGE_TARGET} PROPERTIES COMPILE_FLAGS \"-coverage\")\n      set_target_properties(${COVERAGE_TARGET} PROPERTIES LINK_FLAGS \"-coverage\")\n      set_target_properties(${COVERAGE_TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/coverage\")\n      target_link_libraries(${COVERAGE_TARGET} ${CEREAL_THREAD_LIBS})\n    endif()\n  endforeach()\nendif(NOT MSVC)\n\nif(CMAKE_CXX_STANDARD GREATER 14)\n  add_subdirectory(cpp17)\nendif()\n\nif(Boost_FOUND)\n  add_subdirectory(boost)\nendif()\n\nif(NOT CMAKE_VERSION VERSION_LESS 3.0)\n  add_test(test_cmake_config_module ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake-config-module.cmake)\nendif()\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/array.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"array.hpp\"\n\nTEST_SUITE_BEGIN(\"array\");\n\nTEST_CASE(\"binary_array\")\n{\n  test_array<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_array\")\n{\n  test_array<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_array\")\n{\n  test_array<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_array\")\n{\n  test_array<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/array.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_ARRAY_H_\n#define CEREAL_TEST_ARRAY_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_array()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::array<int, 100> o_podarray;\n    for(auto & elem : o_podarray)\n      elem = random_value<int>(gen);\n\n    std::array<StructInternalSerialize, 100> o_iserarray;\n    for(auto & elem : o_iserarray)\n      elem = StructInternalSerialize( random_value<int>(gen), random_value<int>(gen) );\n\n    std::array<StructInternalSplit, 100> o_isplarray;\n    for(auto & elem : o_isplarray)\n      elem = StructInternalSplit( random_value<int>(gen), random_value<int>(gen) );\n\n    std::array<StructExternalSerialize, 100> o_eserarray;\n    for(auto & elem : o_eserarray)\n      elem = StructExternalSerialize( random_value<int>(gen), random_value<int>(gen) );\n\n    std::array<StructExternalSplit, 100> o_esplarray;\n    for(auto & elem : o_esplarray)\n      elem = StructExternalSplit( random_value<int>(gen), random_value<int>(gen) );\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_podarray);\n      oar(o_iserarray);\n      oar(o_isplarray);\n      oar(o_eserarray);\n      oar(o_esplarray);\n    }\n\n    std::array<int, 100> i_podarray;\n    std::array<StructInternalSerialize, 100> i_iserarray;\n    std::array<StructInternalSplit, 100>     i_isplarray;\n    std::array<StructExternalSerialize, 100> i_eserarray;\n    std::array<StructExternalSplit, 100>     i_esplarray;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_podarray);\n      iar(i_iserarray);\n      iar(i_isplarray);\n      iar(i_eserarray);\n      iar(i_esplarray);\n    }\n\n    check_collection( i_podarray, o_podarray );\n    check_collection( i_iserarray, o_iserarray );\n    check_collection( i_isplarray, o_isplarray );\n    check_collection( i_eserarray, o_eserarray );\n    check_collection( i_esplarray, o_esplarray );\n  }\n}\n\n#endif // CEREAL_TEST_ARRAY_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/atomic.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"atomic.hpp\"\n\nTEST_SUITE_BEGIN(\"atomic\");\n\nTEST_CASE(\"binary_atomic\")\n{\n  test_atomic<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_atomic\")\n{\n  test_atomic<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_atomic\")\n{\n  test_atomic<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_atomic\")\n{\n  test_atomic<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/atomic.hpp",
    "content": "\n/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#include \"common.hpp\"\n\n#define MAKE_TEST_HELPER_FUNCS(t)                             \\\nbool operator==(t const & l, t const & r)                     \\\n{ return l.x == r.x; }                                        \\\ninline std::ostream& operator<<(std::ostream&os, t const & s) \\\n{                                                             \\\n    os << \"[x: \" << s.x << \"]\";                               \\\n    return os;                                                \\\n}\n\nstruct TrivialISER\n{\n  int x;\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  { ar( x ); }\n};\n\nMAKE_TEST_HELPER_FUNCS(TrivialISER)\n\nstruct TrivialISPL\n{\n  int x;\n\n  template <class Archive>\n  void load( Archive & ar )\n  { ar( x ); }\n\n  template <class Archive>\n  void save( Archive & ar ) const\n  { ar( x ); }\n};\n\nMAKE_TEST_HELPER_FUNCS(TrivialISPL)\n\nstruct TrivialESER\n{\n  int x;\n};\n\ntemplate <class Archive>\nvoid serialize( Archive & ar, TrivialESER & t )\n{ ar( t.x ); }\n\nMAKE_TEST_HELPER_FUNCS(TrivialESER)\n\nstruct TrivialESPL\n{\n  int x;\n};\n\ntemplate <class Archive>\nvoid load( Archive & ar, TrivialESPL & t )\n{ ar( t.x ); }\n\ntemplate <class Archive>\nvoid save( Archive & ar, TrivialESPL const & t )\n{ ar( t.x ); }\n\nMAKE_TEST_HELPER_FUNCS(TrivialESPL)\n#undef MAKE_TEST_HELPER_FUNCS\n\ntemplate <class IArchive, class OArchive>\nvoid test_atomic()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::atomic<bool> o_ab(random_value<uint8_t>(gen) % 2 ? true : false);\n    std::atomic<signed char> o_asc(random_value<signed char>(gen));\n    std::atomic<unsigned short> o_aus(random_value<unsigned short>(gen));\n    std::atomic<int> o_asi(random_value<int>(gen));\n    std::atomic<long> o_asl(random_value<long>(gen));\n    std::atomic<unsigned long long> o_aull(random_value<unsigned long long>(gen));\n    std::atomic<double> o_ad(random_value<double>(gen));\n    std::atomic<TrivialISER> o_iser{{random_value<int>(gen)}};\n    std::atomic<TrivialISPL> o_ispl{{random_value<int>(gen)}};\n    std::atomic<TrivialESER> o_eser{{random_value<int>(gen)}};\n    std::atomic<TrivialESPL> o_espl{{random_value<int>(gen)}};\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_ab);\n      oar(o_asc);\n      oar(o_aus);\n      oar(o_asi);\n      oar(o_asl);\n      oar(o_aull);\n      oar(o_ad);\n      oar(o_iser);\n      oar(o_ispl);\n      oar(o_eser);\n      oar(o_espl);\n    }\n\n    decltype(o_ab) i_ab;\n    decltype(o_asc) i_asc;\n    decltype(o_aus) i_aus;\n    decltype(o_asi) i_asi;\n    decltype(o_asl) i_asl;\n    decltype(o_aull) i_aull;\n    decltype(o_ad) i_ad;\n    decltype(o_iser) i_iser;\n    decltype(o_ispl) i_ispl;\n    decltype(o_eser) i_eser;\n    decltype(o_espl) i_espl;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_ab);\n      iar(i_asc);\n      iar(i_aus);\n      iar(i_asi);\n      iar(i_asl);\n      iar(i_aull);\n      iar(i_ad);\n      iar(i_iser);\n      iar(i_ispl);\n      iar(i_eser);\n      iar(i_espl);\n    }\n\n    CHECK_EQ(o_ab.load(), i_ab.load());\n    CHECK_EQ(o_asc.load(), i_asc.load());\n    CHECK_EQ(o_aus.load(), i_aus.load());\n    CHECK_EQ(o_asi.load(), i_asi.load());\n    CHECK_EQ(o_asl.load(), i_asl.load());\n    CHECK_EQ(o_aull.load(), i_aull.load());\n    CHECK_EQ(o_ad.load(), doctest::Approx(i_ad.load()).epsilon(1e-5L));\n    CHECK_EQ(i_iser.load(), o_iser.load());\n    CHECK_EQ(i_ispl.load(), o_ispl.load());\n    CHECK_EQ(i_eser.load(), o_eser.load());\n    CHECK_EQ(i_espl.load(), o_espl.load());\n  }\n}\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/basic_string.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"basic_string.hpp\"\n\nTEST_SUITE_BEGIN(\"basic_string\");\n\nTEST_CASE(\"binary_string\")\n{\n  test_string_all<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_string\")\n{\n  test_string_all<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_string_basic\")\n{\n  test_string_basic<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_string_basic\")\n{\n  test_string_basic<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\ntemplate <class IArchive, class OArchive, class Out, class In = Out>\nvoid test_ws_in_out(Out const & o_value_with_ws)\n{\n  std::ostringstream os;\n  {\n    OArchive oar(os);\n    oar(o_value_with_ws);\n  }\n\n  In i_value_with_ws;\n\n  std::istringstream is(os.str());\n  {\n    IArchive iar(is);\n    iar(i_value_with_ws);\n  }\n\n  CHECK(i_value_with_ws == o_value_with_ws);\n}\n\nTEST_CASE(\"xml_string_issue109\")\n{\n  char strings[][20] = {\n    \"some text\",\n    \"some text \",\n    \" some text\",\n    \" some text \",\n    \"  \",\n    \"    text    \",\n    \" ]]> \",\n    \" &gt; > ]]> \",\n    \" < <]>] &lt; \",\n    \" &amp; &   \"\n  };\n\n  for( size_t i=0; i<( sizeof( strings ) / sizeof( strings[0] ) ); ++i )\n  {\n    std::basic_string<char> o_string = strings[i];\n\n    test_ws_in_out<cereal::XMLInputArchive, cereal::XMLOutputArchive>( o_string );\n  }\n}\n\nTEST_CASE(\"xml_char_issue109\")\n{\n  uint8_t chars[] = {\n    ' ',\n    '\\t',\n    '\\n',\n    '\\r',\n    '&',\n    '>',\n    '<',\n    '\\'',\n    '\"',\n    '!',\n    '|'\n  };\n\n  for( size_t i=0; i<( sizeof( chars ) / sizeof( chars[0] ) ); ++i )\n  {\n    test_ws_in_out<cereal::XMLInputArchive, cereal::XMLOutputArchive>( chars[i] );\n  }\n\n  for( size_t i=0; i<( sizeof( chars ) / sizeof( chars[0] ) ); ++i )\n  {\n    test_ws_in_out<cereal::XMLInputArchive, cereal::XMLOutputArchive>( int8_t( chars[i] ) );\n  }\n\n  for( size_t i=0; i<( sizeof( chars ) / sizeof( chars[0] ) ); ++i )\n  {\n    test_ws_in_out<cereal::XMLInputArchive, cereal::XMLOutputArchive>( char( chars[i] ) );\n  }\n}\n\ntemplate <class IArchive, class OArchive, class Out, size_t Nb, class In = Out>\nvoid test_ws_in_out_array(Out const (&o_a_value_with_ws)[Nb])\n{\n    std::ostringstream os;\n    {\n        OArchive oar(os);\n        for (const auto& o_value_with_ws : o_a_value_with_ws)\n        {\n            oar(o_value_with_ws);\n        }\n    }\n\n    In i_a_value_with_ws[Nb];\n\n    std::istringstream is(os.str());\n    {\n        IArchive iar(is);\n        for (In& i_value_with_ws : i_a_value_with_ws)\n        {\n            iar(i_value_with_ws);\n        }\n    }\n\n    for (size_t uiIndex = 0; uiIndex < Nb; ++uiIndex)\n    {\n        CHECK(i_a_value_with_ws[uiIndex] == o_a_value_with_ws[uiIndex]);\n    }\n}\n\nTEST_CASE(\"xml_string_issue_consecutive_calls\")\n{\n    std::string strings[] = {\n        \"some text\",\n        \" some text\",\n        \" some text \",\n        \"Long text without ws at the end\",\n        \"some text \",\n        \" some text\",\n        \" some text \",\n    };\n\n    test_ws_in_out_array<cereal::XMLInputArchive, cereal::XMLOutputArchive>(strings);\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/basic_string.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_BASIC_STRING_H_\n#define CEREAL_TEST_BASIC_STRING_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_string_basic()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(size_t i=0; i<100; ++i)\n  {\n    std::basic_string<char> o_string  = random_basic_string<char>(gen);\n    std::basic_string<char> o_string2 = \"\";\n    std::basic_string<char> o_string3;\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n      oar(o_string);\n      oar(o_string2);\n      oar(o_string3);\n    }\n\n    std::basic_string<char> i_string;\n    std::basic_string<char> i_string2;\n    std::basic_string<char> i_string3;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_string);\n      iar(i_string2);\n      iar(i_string3);\n    }\n\n    CHECK_EQ(i_string, o_string);\n    CHECK_EQ(i_string2, o_string2);\n    CHECK_EQ(i_string3, o_string3);\n  }\n}\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_string_all()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(size_t i=0; i<100; ++i)\n  {\n    std::basic_string<char> o_string        = random_basic_string<char>(gen);\n    std::basic_string<wchar_t> o_wstring    = random_basic_string<wchar_t>(gen);\n    std::basic_string<char16_t> o_u16string = random_basic_string<char16_t>(gen);\n    std::basic_string<char32_t> o_u32string = random_basic_string<char32_t>(gen);\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n      oar(o_string);\n      oar(o_wstring);\n      oar(o_u16string);\n      oar(o_u32string);\n    }\n\n    std::basic_string<char> i_string;\n    std::basic_string<wchar_t> i_wstring;\n    std::basic_string<char16_t> i_u16string;\n    std::basic_string<char32_t> i_u32string;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_string);\n      iar(i_wstring);\n      iar(i_u16string);\n      iar(i_u32string);\n    }\n\n    CHECK_EQ(i_string, o_string);\n    check_collection( i_wstring, o_wstring );\n    check_collection( i_u16string, o_u16string );\n    check_collection( i_u32string, o_u32string );\n  }\n}\n\n#endif // CEREAL_TEST_BASIC_STRING_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/bitset.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"bitset.hpp\"\n\nTEST_SUITE_BEGIN(\"bitset\");\n\nTEST_CASE(\"binary_bitset\")\n{\n  test_bitset<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_bitset\")\n{\n  test_bitset<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_bitset\")\n{\n  test_bitset<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_bitset\")\n{\n  test_bitset<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/bitset.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_BITSET_H_\n#define CEREAL_TEST_BITSET_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_bitset()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  auto rng32  = [&](){ return random_binary_string<32>( gen ); };\n  auto rng65  = [&](){ return random_binary_string<65>( gen ); };\n  auto rng256 = [&](){ return random_binary_string<256>( gen ); };\n  auto rng512 = [&](){ return random_binary_string<512>( gen ); };\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::bitset<32> o_bit32( rng32() );\n    std::bitset<65> o_bit65( rng65() );\n    std::bitset<256> o_bit256( rng256() );\n    std::bitset<512> o_bit512( rng512() );\n    std::bitset<32>  o_bit32_low( 0 );\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_bit32);\n      oar(o_bit65);\n      oar(o_bit256);\n      oar(o_bit512);\n      oar(o_bit32_low);\n    }\n\n    std::bitset<32>  i_bit32;\n    std::bitset<65>  i_bit65;\n    std::bitset<256> i_bit256;\n    std::bitset<512> i_bit512;\n    std::bitset<32>  i_bit32_low( 0xffffffff );\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_bit32);\n      iar(i_bit65);\n      iar(i_bit256);\n      iar(i_bit512);\n      iar(i_bit32_low);\n    }\n\n    CHECK_EQ( o_bit32, i_bit32 );\n    CHECK_EQ( o_bit65, i_bit65 );\n    CHECK_EQ( o_bit256, i_bit256 );\n    CHECK_EQ( o_bit512, i_bit512 );\n\n    CHECK_EQ( o_bit32_low, i_bit32_low );\n  }\n}\n\n#endif // CEREAL_TEST_BITSET_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/boost/CMakeLists.txt",
    "content": "file(GLOB TESTS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp)\n\n# Build all of the non-special tests\nforeach(TEST_SOURCE ${TESTS})\n  message(STATUS ${TEST_SOURCE})\n\n  string(REPLACE \".cpp\" \"\" TEST_TARGET \"${TEST_SOURCE}\")\n  set(TEST_TARGET \"test_${TEST_TARGET}\")\n\n  add_executable(${TEST_TARGET} ${TEST_SOURCE})\n  target_link_libraries(${TEST_TARGET} ${CEREAL_THREAD_LIBS})\n  add_test(\"${TEST_TARGET}\" \"${TEST_TARGET}\")\n\n  # If we are on a 64-bit machine, create an extra 32-bit version of the test if portability testing is enabled\n  if((NOT MSVC) AND (${CMAKE_SIZEOF_VOID_P} EQUAL 8) AND (NOT SKIP_PORTABILITY_TEST))\n    add_executable(${TEST_TARGET}_32 ${TEST_SOURCE})\n    set_target_properties(${TEST_TARGET}_32 PROPERTIES\n      COMPILE_FLAGS \"-m32\" LINK_FLAGS \"-m32\")\n    add_test(\"${TEST_TARGET}_32\" \"${TEST_TARGET}_32\")\n  endif()\n\nendforeach()\n\nif(NOT MSVC)\n  # add tests to coverage\n  foreach(TEST_SOURCE ${TESTS})\n    string(REPLACE \".cpp\" \"\" COVERAGE_TARGET \"${TEST_SOURCE}\")\n    set(COVERAGE_TARGET \"coverage_${COVERAGE_TARGET}\")\n    \n    add_dependencies(coverage ${COVERAGE_TARGET})\n\n    add_executable(${COVERAGE_TARGET} EXCLUDE_FROM_ALL ${TEST_SOURCE})\n    set_target_properties(${COVERAGE_TARGET} PROPERTIES COMPILE_FLAGS \"-coverage\")\n    set_target_properties(${COVERAGE_TARGET} PROPERTIES LINK_FLAGS \"-coverage\")\n    set_target_properties(${COVERAGE_TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/coverage\")\n    target_link_libraries(${COVERAGE_TARGET} ${CEREAL_THREAD_LIBS})\n  endforeach()\nendif(NOT MSVC)\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/boost/boost_variant.cpp",
    "content": "/*\n  Copyright (c) 2015, Kyle Fleming\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"boost_variant.hpp\"\n\nTEST_SUITE_BEGIN(\"boost_variant\");\n\nTEST_CASE(\"binary_boost_variant\")\n{\n  test_boost_variant<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_boost_variant\")\n{\n  test_boost_variant<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_boost_variant\")\n{\n  test_boost_variant<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_boost_variant\")\n{\n  test_boost_variant<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/boost/boost_variant.hpp",
    "content": "/*\n  Copyright (c) 2015, Kyle Fleming\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_BOOST_VARIANT_H_\n#define CEREAL_TEST_BOOST_VARIANT_H_\n\n#include \"../common.hpp\"\n#include <cereal/types/boost_variant.hpp>\n#include <boost/variant.hpp>\n\nstruct NonDefaultConstructible\n{\n    NonDefaultConstructible(int i) : index(i)\n    {}\n\n    template <class Archive>\n    void CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar )\n    {\n        ar( index );\n    }\n    int index;\n};\n\nnamespace cereal\n{\ntemplate <> struct LoadAndConstruct<NonDefaultConstructible>\n{\n    template <class Archive>\n    static void load_and_construct( Archive & ar, cereal::construct<NonDefaultConstructible> & construct )\n    {\n        int i;\n        ar( i );\n        construct( i );\n    }\n};\n} // end namespace cereal\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_boost_variant()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  using VariantType = boost::variant<int, double, std::string, NonDefaultConstructible>;\n\n  VariantType o_bv1 = random_value<int>(gen);\n  VariantType o_bv2 = random_value<double>(gen);\n  VariantType o_bv3 = random_basic_string<char>(gen);\n  VariantType o_bv4 = NonDefaultConstructible(random_value<int>(gen));\n\n  std::ostringstream os;\n  {\n    OArchive oar(os);\n\n    oar(o_bv1);\n    oar(o_bv2);\n    oar(o_bv3);\n    oar(o_bv4);\n  }\n\n  decltype(o_bv1) i_bv1;\n  decltype(o_bv2) i_bv2;\n  decltype(o_bv3) i_bv3;\n  decltype(o_bv4) i_bv4;\n\n  std::istringstream is(os.str());\n  {\n    IArchive iar(is);\n\n    iar(i_bv1);\n    iar(i_bv2);\n    iar(i_bv3);\n    iar(i_bv4);\n  }\n\n  CHECK_EQ( boost::get<int>(i_bv1), boost::get<int>(o_bv1) );\n  CHECK_EQ( boost::get<double>(i_bv2), doctest::Approx(boost::get<double>(o_bv2)).epsilon(1e-5) );\n  CHECK_EQ( boost::get<std::string>(i_bv3), boost::get<std::string>(o_bv3) );\n  CHECK_EQ( boost::get<NonDefaultConstructible>(i_bv4).index, boost::get<NonDefaultConstructible>(o_bv4).index );\n}\n\n#endif // CEREAL_TEST_BOOST_VARIANT_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/chrono.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"chrono.hpp\"\n\nTEST_SUITE_BEGIN(\"chrono\");\n\nTEST_CASE(\"binary_chrono\")\n{\n  test_chrono<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_chrono\")\n{\n  test_chrono<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_chrono\")\n{\n  test_chrono<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_chrono\")\n{\n  test_chrono<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/chrono.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_CHRONO_H_\n#define CEREAL_TEST_CHRONO_H_\n\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_chrono()\n{\n  for(int ii=0; ii<100; ++ii)\n  {\n    auto o_timePoint1 = std::chrono::system_clock::now();\n    #ifndef CEREAL_OLDER_GCC\n    auto o_timePoint2 = std::chrono::steady_clock::now();\n    #endif // CEREAL_OLDER_GCC\n    auto o_timePoint3 = std::chrono::high_resolution_clock::now();\n\n    auto o_duration1 = std::chrono::system_clock::now() - o_timePoint1;\n    #ifndef CEREAL_OLDER_GCC\n    auto o_duration2 = std::chrono::steady_clock::now() - o_timePoint2;\n    #endif // CEREAL_OLDER_GCC\n    auto o_duration3 = std::chrono::high_resolution_clock::now() - o_timePoint3;\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_timePoint1);\n      #ifndef CEREAL_OLDER_GCC\n      oar(o_timePoint2);\n      #endif // CEREAL_OLDER_GCC\n      oar(o_timePoint3);\n      oar(o_duration1);\n      #ifndef CEREAL_OLDER_GCC\n      oar(o_duration2);\n      #endif // CEREAL_OLDER_GCC\n      oar(o_duration3);\n    }\n\n    decltype(o_timePoint1) i_timePoint1;\n    #ifndef CEREAL_OLDER_GCC\n    decltype(o_timePoint2) i_timePoint2;\n    #endif // CEREAL_OLDER_GCC\n    decltype(o_timePoint3) i_timePoint3;\n    decltype(o_duration1) i_duration1;\n    #ifndef CEREAL_OLDER_GCC\n    decltype(o_duration2) i_duration2;\n    #endif // CEREAL_OLDER_GCC\n    decltype(o_duration3) i_duration3;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_timePoint1);\n      #ifndef CEREAL_OLDER_GCC\n      iar(i_timePoint2);\n      #endif // CEREAL_OLDER_GCC\n      iar(i_timePoint3);\n      iar(i_duration1);\n      #ifndef CEREAL_OLDER_GCC\n      iar(i_duration2);\n      #endif // CEREAL_OLDER_GCC\n      iar(i_duration3);\n    }\n\n    CHECK_EQ( o_timePoint1, i_timePoint1 );\n    #ifndef CEREAL_OLDER_GCC\n    CHECK_EQ( o_timePoint2, i_timePoint2 );\n    #endif // CEREAL_OLDER_GCC\n    CHECK_EQ( o_timePoint3, i_timePoint3 );\n    CHECK_EQ( o_duration1, i_duration1 );\n    #ifndef CEREAL_OLDER_GCC\n    CHECK_EQ( o_duration2, i_duration2 );\n    #endif // CEREAL_OLDER_GCC\n    CHECK_EQ( o_duration3, i_duration3 );\n  }\n}\n\n#endif // CEREAL_TEST_CHRONO_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/cmake-config-module.cmake",
    "content": "if(CMAKE_VERSION LESS 3.0)\n  message(FATAL_ERROR \"Cereal can't be installed with CMake < 3.0\")\nendif()\n\nget_filename_component(BINARY_DIR ${CMAKE_CURRENT_LIST_DIR}/../build ABSOLUTE)\nget_filename_component(INSTALL_DIR ${CMAKE_CURRENT_LIST_DIR}/../out ABSOLUTE)\n\n# cmake configure step for cereal\nfile(MAKE_DIRECTORY ${BINARY_DIR}/cereal)\nexecute_process(\n  COMMAND ${CMAKE_COMMAND}\n    -DJUST_INSTALL_CEREAL=1\n    -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}\n    ${CMAKE_CURRENT_LIST_DIR}/..\n  WORKING_DIRECTORY ${BINARY_DIR}/cereal\n  RESULT_VARIABLE result\n)\nif(result)\n  message(FATAL_ERROR \"Cereal cmake configure-step failed\")\nendif()\n\n# cmake install cereal\nexecute_process(\n  COMMAND ${CMAKE_COMMAND}\n    --build ${BINARY_DIR}/cereal\n    --target install\n  RESULT_VARIABLE result\n)\nif(result)\n  message(FATAL_ERROR \"Cereal cmake install-step failed\")\nendif()\n\n# create test project sources\nfile(WRITE ${BINARY_DIR}/test_source/CMakeLists.txt \"\n  cmake_minimum_required(VERSION ${CMAKE_VERSION})\n  project(cereal-test-config-module)\n  if(NOT MSVC)\n      if(CMAKE_VERSION VERSION_LESS 3.1)\n          set(CMAKE_CXX_FLAGS \\\"-std=c++11 \\${CMAKE_CXX_FLAGS}\\\")\n      else()\n          set(CMAKE_CXX_STANDARD 11)\n          set(CMAKE_CXX_STANDARD_REQUIRED ON)\n      endif()\n  endif()\n  find_package(cereal REQUIRED)\n  add_executable(cereal-test-config-module main.cpp)\n  target_link_libraries(cereal-test-config-module cereal)\n  enable_testing()\n  add_test(test-cereal-test-config-module cereal-test-config-module)\n\")\nfile(WRITE ${BINARY_DIR}/test_source/main.cpp \"\n  #include <cereal/archives/binary.hpp>\n  #include <sstream>\n  #include <cstdlib>\n  struct MyData\n  {\n    int x = 0, y = 0, z = 0;\n    void set() { x = 1; y = 2; z = 3; }\n    bool is_set() const { return x == 1 && y == 2 && z == 3; }\n\n    // This method lets cereal know which data members to serialize\n    template<class Archive>\n    void serialize(Archive & archive)\n    {\n      archive( x, y, z ); // serialize things by passing them to the archive\n    }\n  };\n  int main()\n  {\n    std::stringstream ss; // any stream can be used\n\n    {\n      cereal::BinaryOutputArchive oarchive(ss); // Create an output archive\n\n      MyData m1, m2, m3;\n      m1.set();\n      m2.set();\n      m3.set();\n      oarchive(m1, m2, m3); // Write the data to the archive\n    }\n\n    {\n      cereal::BinaryInputArchive iarchive(ss); // Create an input archive\n\n      MyData m1, m2, m3;\n      iarchive(m1, m2, m3); // Read the data from the archive\n\n      return (m1.is_set() && m2.is_set() && m3.is_set())\n      ? EXIT_SUCCESS : EXIT_FAILURE;\n    }\n  }\"\n)\nfile(MAKE_DIRECTORY ${BINARY_DIR}/test)\nexecute_process(\n  COMMAND ${CMAKE_COMMAND}\n    -DCMAKE_PREFIX_PATH=${INSTALL_DIR}\n    ${BINARY_DIR}/test_source\n  WORKING_DIRECTORY ${BINARY_DIR}/test\n  RESULT_VARIABLE result\n)\nif(result)\n  message(FATAL_ERROR \"Test cmake configure-step failed\")\nendif()\n\n# cmake install cereal\nexecute_process(\n  COMMAND ${CMAKE_COMMAND}\n    --build ${BINARY_DIR}/test\n  RESULT_VARIABLE result\n)\nif(result)\n  message(FATAL_ERROR \"Test cmake build-step failed\")\nendif()\n\nexecute_process(\n  COMMAND ${CMAKE_CTEST_COMMAND}\n  WORKING_DIRECTORY ${BINARY_DIR}/test\n  RESULT_VARIABLE result\n)\n\nif(result)\n  message(FATAL_ERROR \"Test run failed\")\nendif()\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/common.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_COMMON_H_\n#define CEREAL_TEST_COMMON_H_\n\n#include <cereal/types/memory.hpp>\n#include <cereal/types/array.hpp>\n#include <cereal/types/atomic.hpp>\n#include <cereal/types/valarray.hpp>\n#include <cereal/types/vector.hpp>\n#include <cereal/types/deque.hpp>\n#include <cereal/types/forward_list.hpp>\n#include <cereal/types/list.hpp>\n#include <cereal/types/string.hpp>\n#include <cereal/types/map.hpp>\n#include <cereal/types/queue.hpp>\n#include <cereal/types/set.hpp>\n#include <cereal/types/stack.hpp>\n#include <cereal/types/unordered_map.hpp>\n#include <cereal/types/unordered_set.hpp>\n#include <cereal/types/utility.hpp>\n#include <cereal/types/tuple.hpp>\n#include <cereal/types/bitset.hpp>\n#include <cereal/types/complex.hpp>\n#include <cereal/types/chrono.hpp>\n#include <cereal/types/polymorphic.hpp>\n\n#include <cereal/archives/binary.hpp>\n#include <cereal/archives/portable_binary.hpp>\n#include <cereal/archives/xml.hpp>\n#include <cereal/archives/json.hpp>\n#include <limits>\n#include <random>\n\n#include \"doctest.h\"\n\nnamespace std\n{\n  // Ostream overload for std::pair\n  template<class F, class S> inline\n  ::std::ostream & operator<<(::std::ostream & os, ::std::pair<F, S> const & p)\n  {\n    os << \"([\" << p.first << \"], [\" << p.second << \"])\";\n    return os;\n  }\n}\n\n// Checks that collections have equal size and all elements are the same\ntemplate <class T> inline\nvoid check_collection( T const & a, T const & b )\n{\n  auto aIter = std::begin(a);\n  auto aEnd  = std::end(a);\n  auto bIter = std::begin(b);\n  auto bEnd  = std::end(b);\n\n  CHECK_EQ( std::distance(aIter, aEnd), std::distance(bIter, bEnd) );\n\n  for( ; aIter != aEnd; ++aIter, ++bIter )\n    CHECK_EQ( *aIter, *bIter );\n}\n\ntemplate <class T> inline\nvoid check_ptr_collection( T const & a, T const & b )\n{\n  auto aIter = std::begin(a);\n  auto aEnd  = std::end(a);\n  auto bIter = std::begin(b);\n  auto bEnd  = std::end(b);\n\n  CHECK_EQ( std::distance(aIter, aEnd), std::distance(bIter, bEnd) );\n\n  for( ; aIter != aEnd; ++aIter, ++bIter )\n    CHECK_EQ( **aIter, **bIter );\n}\n\n// Random Number Generation ===============================================\ntemplate<class T> inline\ntypename std::enable_if<std::is_floating_point<T>::value, T>::type\nrandom_value(std::mt19937 & gen)\n{ return std::uniform_real_distribution<T>(-10000.0, 10000.0)(gen); }\n\ntemplate<class T> inline\ntypename std::enable_if<std::is_integral<T>::value && sizeof(T) != sizeof(char), T>::type\nrandom_value(std::mt19937 & gen)\n{ return std::uniform_int_distribution<T>(std::numeric_limits<T>::lowest(), std::numeric_limits<T>::max())(gen); }\n\ntemplate<class T> inline\ntypename std::enable_if<std::is_integral<T>::value && sizeof(T) == sizeof(char), T>::type\nrandom_value(std::mt19937 & gen)\n{ return static_cast<T>( std::uniform_int_distribution<int64_t>(std::numeric_limits<T>::lowest(), std::numeric_limits<T>::max())(gen) ); }\n\ntemplate<class T> inline\ntypename std::enable_if<std::is_same<T, std::string>::value, std::string>::type\nrandom_value(std::mt19937 & gen)\n{\n  std::string s(std::uniform_int_distribution<int>(3, 30)(gen), ' ');\n  for(char & c : s)\n    c = static_cast<char>( std::uniform_int_distribution<int>( 'A', 'Z' )(gen) );\n  return s;\n}\n\nsize_t random_index( size_t min, size_t max, std::mt19937 & gen )\n{\n  return std::uniform_int_distribution<size_t>( min, max )(gen);\n}\n\ntemplate<class C> inline\nstd::basic_string<C> random_basic_string(std::mt19937 & gen)\n{\n  std::basic_string<C> s(std::uniform_int_distribution<int>(3, 30)(gen), ' ');\n  for(C & c : s)\n    c = static_cast<C>( std::uniform_int_distribution<int>( 'A', 'Z' )(gen) );\n  return s;\n}\n\ntemplate <size_t N> inline\nstd::string random_binary_string(std::mt19937 & gen)\n{\n  std::string s(N, ' ');\n  for(auto & c : s )\n     c = static_cast<char>( std::uniform_int_distribution<int>( '0', '1' )(gen) );\n  return s;\n}\n\n// Generic struct useful for testing many serialization functions\nstruct StructBase\n{\n  StructBase() {}\n  StructBase( int xx, int yy ) : x( xx ), y( yy ) {}\n  int x, y;\n  bool operator==(StructBase const & other) const\n  { return x == other.x && y == other.y; }\n  bool operator!=(StructBase const & other) const\n  { return x != other.x || y != other.y; }\n  bool operator<(StructBase const & other) const\n  {\n    if (x < other.x) return true;\n    else if(other.x < x) return false;\n    else return (y < other.y);\n  }\n};\n\ninline std::ostream& operator<<(std::ostream& os, StructBase const & s)\n{\n    os << \"[x: \" << s.x << \" y: \" << s.y << \"]\";\n    return os;\n}\n\nstruct StructInternalSerialize : StructBase\n{\n  StructInternalSerialize() : StructBase{0,0} {}\n  StructInternalSerialize(int x_, int y_) : StructBase{x_,y_} {}\n  template<class Archive>\n    void serialize(Archive & ar)\n    {\n      ar(x, y);\n    }\n};\n\nstruct StructInternalSplit : StructBase\n{\n  StructInternalSplit() : StructBase{0,0} {}\n  StructInternalSplit(int x_, int y_) : StructBase{x_,y_} {}\n  template<class Archive>\n    void save(Archive & ar) const\n    {\n      ar(x, y);\n    }\n\n  template<class Archive>\n    void load(Archive & ar)\n    {\n      ar(x, y);\n    }\n};\n\nstruct StructExternalSerialize : StructBase\n{\n  StructExternalSerialize() : StructBase{0,0} {}\n  StructExternalSerialize(int x_, int y_) : StructBase{x_,y_} {}\n};\n\ntemplate<class Archive>\nvoid serialize(Archive & ar, StructExternalSerialize & s)\n{\n  ar(s.x, s.y);\n}\n\nstruct StructExternalSplit : StructBase\n{\n  StructExternalSplit() : StructBase{0,0} {}\n  StructExternalSplit(int x_, int y_) : StructBase{x_,y_} {}\n};\n\ntemplate<class Archive> inline\nvoid save(Archive & ar, StructExternalSplit const & s)\n{\n  ar(s.x, s.y);\n}\n\ntemplate<class Archive> inline\nvoid load(Archive & ar, StructExternalSplit & s)\n{\n  ar(s.x, s.y);\n}\n\ntemplate<class T>\nstruct StructHash {\n  public:\n    size_t operator()(const T & s) const\n    {\n      size_t h1 = std::hash<int>()(s.x);\n      size_t h2 = std::hash<int>()(s.y);\n      return h1 ^ ( h2 << 1 );\n    }\n};\n\n#endif // CEREAL_TEST_COMMON_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/complex.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"complex.hpp\"\n\nTEST_SUITE_BEGIN(\"complex\");\n\nTEST_CASE(\"binary_complex\")\n{\n  test_complex<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_complex\")\n{\n  test_complex<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_complex\")\n{\n  test_complex<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_complex\")\n{\n  test_complex<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/complex.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_COMPLEX_H_\n#define CEREAL_TEST_COMPLEX_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_complex()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  auto rngF = [&](){ return random_value<float>(gen); };\n  auto rngD = [&](){ return random_value<double>(gen); };\n  auto rngLD = [&](){ return random_value<long double>(gen); };\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::complex<float> o_float( rngF(), rngF() );\n    std::complex<double> o_double( rngD(), rngD() );\n    std::complex<long double> o_ldouble( rngLD(), rngLD() );\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_float);\n      oar(o_double);\n      oar(o_ldouble);\n    }\n\n    std::complex<float> i_float;\n    std::complex<double> i_double;\n    std::complex<long double> i_ldouble;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_float);\n      iar(i_double);\n      iar(i_ldouble);\n    }\n\n    CHECK_EQ( o_float, i_float );\n    CHECK_EQ( o_double.real(), doctest::Approx(i_double.real()).epsilon(1e-5) );\n    CHECK_EQ( o_double.imag(), doctest::Approx(i_double.imag()).epsilon(1e-5) );\n    CHECK_EQ( o_ldouble.real(), doctest::Approx(i_ldouble.real()).epsilon(1e-5L) );\n    CHECK_EQ( o_ldouble.imag(), doctest::Approx(i_ldouble.imag()).epsilon(1e-5L) );\n  }\n}\n\n#endif // CEREAL_TEST_COMPLEX_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/cpp17/CMakeLists.txt",
    "content": "file(GLOB TESTS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp)\n\n# Build all of the non-special tests\nforeach(TEST_SOURCE ${TESTS})\n  message(STATUS ${TEST_SOURCE})\n\n  string(REPLACE \".cpp\" \"\" TEST_TARGET \"${TEST_SOURCE}\")\n  set(TEST_TARGET \"test_cpp17_${TEST_TARGET}\")\n\n  add_executable(${TEST_TARGET} ${TEST_SOURCE})\n  target_link_libraries(${TEST_TARGET} ${CEREAL_THREAD_LIBS})\n  add_test(\"${TEST_TARGET}\" \"${TEST_TARGET}\")\n\n  # If we are on a 64-bit machine, create an extra 32-bit version of the test if portability testing is enabled\n  if((NOT MSVC) AND (${CMAKE_SIZEOF_VOID_P} EQUAL 8) AND (NOT SKIP_PORTABILITY_TEST))\n    add_executable(${TEST_TARGET}_32 ${TEST_SOURCE})\n    set_target_properties(${TEST_TARGET}_32 PROPERTIES\n      COMPILE_FLAGS \"-m32\" LINK_FLAGS \"-m32\")\n    add_test(\"${TEST_TARGET}_32\" \"${TEST_TARGET}_32\")\n  endif()\n\nendforeach()\n\nif(NOT MSVC)\n  # add tests to coverage\n  foreach(TEST_SOURCE ${TESTS})\n    string(REPLACE \".cpp\" \"\" COVERAGE_TARGET \"${TEST_SOURCE}\")\n    set(COVERAGE_TARGET \"coverage_cpp17_${COVERAGE_TARGET}\")\n    \n    add_dependencies(coverage ${COVERAGE_TARGET})\n\n    add_executable(${COVERAGE_TARGET} EXCLUDE_FROM_ALL ${TEST_SOURCE})\n    set_target_properties(${COVERAGE_TARGET} PROPERTIES COMPILE_FLAGS \"-coverage\")\n    set_target_properties(${COVERAGE_TARGET} PROPERTIES LINK_FLAGS \"-coverage\")\n    set_target_properties(${COVERAGE_TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/coverage\")\n    target_link_libraries(${COVERAGE_TARGET} ${CEREAL_THREAD_LIBS})\n  endforeach()\nendif(NOT MSVC)\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/cpp17/optional.cpp",
    "content": "/*\n  Copyright (c) 2017, Juan Pedro Bolivar Puente\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"optional.hpp\"\n\n#ifdef CEREAL_HAS_CPP17\n\nTEST_SUITE_BEGIN(\"std_optional\");\n\nTEST_CASE(\"binary_std_optional\")\n{\n  test_std_optional<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_std_optional\")\n{\n  test_std_optional<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_std_optional\")\n{\n  test_std_optional<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_std_optional\")\n{\n  test_std_optional<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n\n#endif // CEREAL_HAS_CPP17\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/cpp17/optional.hpp",
    "content": "/*\n  Copyright (c) 2017, Juan Pedro Bolivar Puente\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_CPP17_OPTIONAL_H_\n#define CEREAL_TEST_CPP17_OPTIONAL_H_\n#include \"../common.hpp\"\n\n#ifdef CEREAL_HAS_CPP17\n#include <cereal/types/optional.hpp>\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_std_optional()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  std::optional<int> o_o1 = random_value<int>(gen);\n  std::optional<double> o_o2 = random_value<double>(gen);\n  std::optional<std::string> o_o3 = random_basic_string<char>(gen);\n  std::optional<int> o_o4 = std::nullopt;\n  std::optional<double> o_o5 = std::nullopt;\n  std::optional<std::string> o_o6 = std::nullopt;\n  std::optional<std::optional<long>> o_o7 = std::make_optional<std::optional<long>>( std::make_optional<long>( random_value<long>(gen) ) );\n\n  std::ostringstream os;\n  {\n    OArchive oar(os);\n\n    oar(o_o1);\n    oar(o_o2);\n    oar(o_o3);\n    oar(o_o4);\n    oar(o_o5);\n    oar(o_o6);\n    oar(o_o7);\n  }\n\n  decltype(o_o1) i_o1;\n  decltype(o_o2) i_o2;\n  decltype(o_o3) i_o3;\n  decltype(o_o4) i_o4{1}; // initialize with non-nullopt\n  decltype(o_o5) i_o5{1.0};\n  decltype(o_o6) i_o6{\"1\"};\n  decltype(o_o7) i_o7;\n\n  std::istringstream is(os.str());\n  {\n    IArchive iar(is);\n\n    iar(i_o1);\n    iar(i_o2);\n    iar(i_o3);\n    iar(i_o4);\n    iar(i_o5);\n    iar(i_o6);\n    iar(i_o7);\n  }\n\n  CHECK_EQ( *i_o1, *o_o1 );\n  CHECK_EQ( *i_o2, doctest::Approx(*o_o2).epsilon(1e-5) );\n  CHECK_EQ( *i_o3, *o_o3 );\n  CHECK_EQ( i_o4.has_value(), o_o4.has_value() );\n  CHECK_EQ( i_o5.has_value(), o_o5.has_value() );\n  CHECK_EQ( i_o6.has_value(), o_o6.has_value() );\n  CHECK_EQ( **i_o7, **o_o7 );\n}\n\n#endif // CEREAL_HAS_CPP17\n#endif // CEREAL_TEST_CPP17_OPTIONAL_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/cpp17/variant.cpp",
    "content": "/*\n  Copyright (c) 2015, Kyle Fleming, Juan Pedro Bolivar Puente\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"variant.hpp\"\n\n#ifdef CEREAL_HAS_CPP17\n\nTEST_SUITE_BEGIN(\"std_variant\");\n\nTEST_CASE(\"binary_std_variant\")\n{\n  test_std_variant<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_std_variant\")\n{\n  test_std_variant<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_std_variant\")\n{\n  test_std_variant<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_std_variant\")\n{\n  test_std_variant<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n\n#endif // CEREAL_HAS_CPP17\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/cpp17/variant.hpp",
    "content": "/*\n  Copyright (c) 2015, Kyle Fleming, Juan Pedro Bolivar Puente\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef CEREAL_TEST_CPP17_VARIANT_H_\n#define CEREAL_TEST_CPP17_VARIANT_H_\n#include \"../common.hpp\"\n\n#ifdef CEREAL_HAS_CPP17\n\n#include <cereal/types/variant.hpp>\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_std_variant()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  std::variant<int, double, std::string> o_bv1 = random_value<int>(gen);\n  std::variant<int, double, std::string> o_bv2 = random_value<double>(gen);\n  std::variant<int, double, std::string> o_bv3 = random_basic_string<char>(gen);\n\n  std::ostringstream os;\n  {\n    OArchive oar(os);\n\n    oar(o_bv1);\n    oar(o_bv2);\n    oar(o_bv3);\n  }\n\n  decltype(o_bv1) i_bv1;\n  decltype(o_bv2) i_bv2;\n  decltype(o_bv3) i_bv3;\n\n  std::istringstream is(os.str());\n  {\n    IArchive iar(is);\n\n    iar(i_bv1);\n    iar(i_bv2);\n    iar(i_bv3);\n  }\n\n  CHECK_EQ( std::get<int>(i_bv1), std::get<int>(o_bv1) );\n  CHECK_EQ( std::get<double>(i_bv2), doctest::Approx(std::get<double>(o_bv2)).epsilon(1e-5) );\n  CHECK_EQ( std::get<std::string>(i_bv3), std::get<std::string>(o_bv3) );\n}\n\n#endif // CEREAL_HAS_CPP17\n#endif // CEREAL_TEST_CPP17_VARIANT_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/defer.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"defer.hpp\"\n\nTEST_SUITE_BEGIN(\"defer\");\n\nTEST_CASE(\"binary_defer\")\n{\n  test_defer<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_defer\")\n{\n  test_defer<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_defer\")\n{\n  test_defer<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_defer\")\n{\n  test_defer<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/defer.hpp",
    "content": "/*\n  Copyright (c) 2017, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_DEFER_H_\n#define CEREAL_TEST_DEFER_H_\n#include \"common.hpp\"\n\nstruct DeferNode;\n\nstruct DeferRelation\n{\n  std::shared_ptr<DeferNode> node;\n  int x;\n  std::string y;\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( node, x, y );\n  }\n\n  bool operator==( DeferRelation const & other ) const;\n};\n\nstruct DeferNode\n{\n  DeferNode() = default;\n  DeferNode( size_t id_, std::mt19937 & gen ) :\n      id(id_),\n      w(random_value<long>(gen)),\n      iser{random_value<int>(gen), random_value<int>(gen)},\n      ispl{random_value<int>(gen), random_value<int>(gen)},\n      eser{random_value<int>(gen), random_value<int>(gen)},\n      espl{random_value<int>(gen), random_value<int>(gen)},\n      relations(),\n      z(random_value<char>(gen))\n  { }\n\n  size_t id;\n  long w;\n\n  StructInternalSerialize iser;\n  StructInternalSplit     ispl;\n  StructExternalSerialize eser;\n  StructExternalSplit     espl;\n\n  std::vector<DeferRelation> relations;\n\n  char z;\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( id, w,\n        cereal::defer( iser ),\n        cereal::defer( ispl ),\n        cereal::defer( eser ),\n        cereal::defer( espl ),\n        cereal::defer( relations ),\n        z );\n  }\n\n  bool operator==( DeferNode const & other ) const\n  {\n    bool relationsEqual = true;\n\n    if( relations.size() == other.relations.size() )\n      for( size_t i = 0; i < relations.size(); ++i )\n        relationsEqual &= relations[i] == other.relations[i];\n    else\n      relationsEqual = false;\n\n    return id == other.id && w == other.w &&\n           iser == other.iser && ispl == other.ispl &&\n           eser == other.eser && espl == other.espl &&\n           relationsEqual;\n  }\n};\n\ninline std::ostream& operator<<(std::ostream& os, DeferRelation const & s)\n{\n  os << \"[node(id): \" << (s.node ? std::to_string(s.node->id) : \"null\") << \" x: \" << s.x << \" y: \" << s.y << \"]\";\n  return os;\n}\n\n\nbool DeferRelation::operator==( DeferRelation const & other ) const\n{\n  return x == other.x && y == other.y && node->id == other.node->id;\n}\n\n\ninline std::ostream& operator<<(std::ostream& os, DeferNode const & s)\n{\n  os << \"[id: \" << s.id << \" w \" << s.w << \" iser \" << s.iser;\n  os << \" ispl \" << s.ispl << \" eser \" << s.eser << \" espl \" << s.espl;\n  os << \" relations (size: \" << s.relations.size() << \"): \";\n  for( auto & r : s.relations )\n    os << r;\n  os << \" z \" << s.z << \"]\";\n  return os;\n}\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_defer()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    size_t id = 0;\n    std::vector<std::shared_ptr<DeferNode>> o_nodes0(1);\n    for( auto & node : o_nodes0 )\n      node = std::make_shared<DeferNode>(id++, gen);\n\n    std::vector<std::shared_ptr<DeferNode>> o_nodes1(1);\n    for( auto & node : o_nodes1 )\n      node = std::make_shared<DeferNode>(id++, gen);\n\n    std::shuffle( o_nodes1.begin(), o_nodes1.end(), gen );\n\n    for( auto & node : o_nodes0 )\n    {\n      node->relations.resize( random_index( 0, 100, gen ) );\n      for (auto & r : node->relations)\n      {\n        r = { o_nodes0[random_index( 0, o_nodes0.size() - 1, gen )],\n             random_value<int>( gen ), random_basic_string<char>( gen ) };\n      }\n    }\n\n    for( auto & node : o_nodes1 )\n    {\n      node->relations.resize( random_index( 0, 100, gen ) );\n      for (auto & r : node->relations)\n      {\n        r = { o_nodes0[random_index( 0, o_nodes0.size() - 1, gen )],\n             random_value<int>( gen ), random_basic_string<char>( gen ) };\n      }\n    }\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar( o_nodes0 );\n      oar( o_nodes1 );\n      oar.serializeDeferments();\n      // TODO: throw exception if deferments not done when destructor fires\n    }\n\n    decltype(o_nodes0) i_nodes0;\n    decltype(o_nodes1) i_nodes1;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar( i_nodes0 );\n      iar( i_nodes1 );\n      iar.serializeDeferments();\n    }\n\n    check_ptr_collection(o_nodes0, i_nodes0);\n    check_ptr_collection(o_nodes1, i_nodes1);\n  }\n}\n\n#endif // CEREAL_TEST_DEFER_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/deque.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"deque.hpp\"\n\nTEST_SUITE_BEGIN(\"deque\");\n\nTEST_CASE(\"binary_dequeue\")\n{\n  test_deque<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_dequeue\")\n{\n  test_deque<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_dequeue\")\n{\n  test_deque<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_dequeue\")\n{\n  test_deque<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/deque.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_DEQUE_H_\n#define CEREAL_TEST_DEQUE_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive>\nvoid test_deque()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::deque<int> o_poddeque(100);\n    for(auto & elem : o_poddeque)\n      elem = random_value<int>(gen);\n\n    std::deque<StructInternalSerialize> o_iserdeque(100);\n    for(auto & elem : o_iserdeque)\n      elem = StructInternalSerialize( random_value<int>(gen), random_value<int>(gen) );\n\n    std::deque<StructInternalSplit> o_ispldeque(100);\n    for(auto & elem : o_ispldeque)\n      elem = StructInternalSplit( random_value<int>(gen), random_value<int>(gen) );\n\n    std::deque<StructExternalSerialize> o_eserdeque(100);\n    for(auto & elem : o_eserdeque)\n      elem = StructExternalSerialize( random_value<int>(gen), random_value<int>(gen) );\n\n    std::deque<StructExternalSplit> o_espldeque(100);\n    for(auto & elem : o_espldeque)\n      elem = StructExternalSplit( random_value<int>(gen), random_value<int>(gen) );\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_poddeque);\n      oar(o_iserdeque);\n      oar(o_ispldeque);\n      oar(o_eserdeque);\n      oar(o_espldeque);\n    }\n\n    std::deque<int> i_poddeque;\n    std::deque<StructInternalSerialize> i_iserdeque;\n    std::deque<StructInternalSplit>     i_ispldeque;\n    std::deque<StructExternalSerialize> i_eserdeque;\n    std::deque<StructExternalSplit>     i_espldeque;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_poddeque);\n      iar(i_iserdeque);\n      iar(i_ispldeque);\n      iar(i_eserdeque);\n      iar(i_espldeque);\n    }\n\n    CHECK_EQ(i_poddeque.size(),  o_poddeque.size());\n    CHECK_EQ(i_iserdeque.size(), o_iserdeque.size());\n    CHECK_EQ(i_ispldeque.size(), o_ispldeque.size());\n    CHECK_EQ(i_eserdeque.size(), o_eserdeque.size());\n    CHECK_EQ(i_espldeque.size(), o_espldeque.size());\n\n    check_collection(i_poddeque,  o_poddeque );\n    check_collection(i_iserdeque, o_iserdeque);\n    check_collection(i_ispldeque, o_ispldeque);\n    check_collection(i_eserdeque, o_eserdeque);\n    check_collection(i_espldeque, o_espldeque);\n  }\n}\n\n#endif // CEREAL_TEST_DEQUE_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/doctest.h",
    "content": "// ====================================================================== lgtm [cpp/missing-header-guard]\n// == DO NOT MODIFY THIS FILE BY HAND - IT IS AUTO GENERATED BY CMAKE! ==\n// ======================================================================\n//\n// doctest.h - the lightest feature-rich C++ single-header testing framework for unit tests and TDD\n//\n// Copyright (c) 2016-2019 Viktor Kirilov\n//\n// Distributed under the MIT Software License\n// See accompanying file LICENSE.txt or copy at\n// https://opensource.org/licenses/MIT\n//\n// The documentation can be found at the library's page:\n// https://github.com/onqtam/doctest/blob/master/doc/markdown/readme.md\n//\n// =================================================================================================\n// =================================================================================================\n// =================================================================================================\n//\n// The library is heavily influenced by Catch - https://github.com/catchorg/Catch2\n// which uses the Boost Software License - Version 1.0\n// see here - https://github.com/catchorg/Catch2/blob/master/LICENSE.txt\n//\n// The concept of subcases (sections in Catch) and expression decomposition are from there.\n// Some parts of the code are taken directly:\n// - stringification - the detection of \"ostream& operator<<(ostream&, const T&)\" and StringMaker<>\n// - the Approx() helper class for floating point comparison\n// - colors in the console\n// - breaking into a debugger\n// - signal / SEH handling\n// - timer\n// - XmlWriter class - thanks to Phil Nash for allowing the direct reuse (AKA copy/paste)\n//\n// The expression decomposing templates are taken from lest - https://github.com/martinmoene/lest\n// which uses the Boost Software License - Version 1.0\n// see here - https://github.com/martinmoene/lest/blob/master/LICENSE.txt\n//\n// =================================================================================================\n// =================================================================================================\n// =================================================================================================\n\n#ifndef DOCTEST_LIBRARY_INCLUDED\n#define DOCTEST_LIBRARY_INCLUDED\n\n// =================================================================================================\n// == VERSION ======================================================================================\n// =================================================================================================\n\n#define DOCTEST_VERSION_MAJOR 2\n#define DOCTEST_VERSION_MINOR 3\n#define DOCTEST_VERSION_PATCH 5\n#define DOCTEST_VERSION_STR \"2.3.5\"\n\n#define DOCTEST_VERSION                                                                            \\\n    (DOCTEST_VERSION_MAJOR * 10000 + DOCTEST_VERSION_MINOR * 100 + DOCTEST_VERSION_PATCH)\n\n// =================================================================================================\n// == COMPILER VERSION =============================================================================\n// =================================================================================================\n\n// ideas for the version stuff are taken from here: https://github.com/cxxstuff/cxx_detect\n\n#define DOCTEST_COMPILER(MAJOR, MINOR, PATCH) ((MAJOR)*10000000 + (MINOR)*100000 + (PATCH))\n\n// GCC/Clang and GCC/MSVC are mutually exclusive, but Clang/MSVC are not because of clang-cl...\n#if defined(_MSC_VER) && defined(_MSC_FULL_VER)\n#if _MSC_VER == _MSC_FULL_VER / 10000\n#define DOCTEST_MSVC DOCTEST_COMPILER(_MSC_VER / 100, _MSC_VER % 100, _MSC_FULL_VER % 10000)\n#else // MSVC\n#define DOCTEST_MSVC                                                                               \\\n    DOCTEST_COMPILER(_MSC_VER / 100, (_MSC_FULL_VER / 100000) % 100, _MSC_FULL_VER % 100000)\n#endif // MSVC\n#endif // MSVC\n#if defined(__clang__) && defined(__clang_minor__)\n#define DOCTEST_CLANG DOCTEST_COMPILER(__clang_major__, __clang_minor__, __clang_patchlevel__)\n#elif defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) &&              \\\n        !defined(__INTEL_COMPILER)\n#define DOCTEST_GCC DOCTEST_COMPILER(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)\n#endif // GCC\n\n#ifndef DOCTEST_MSVC\n#define DOCTEST_MSVC 0\n#endif // DOCTEST_MSVC\n#ifndef DOCTEST_CLANG\n#define DOCTEST_CLANG 0\n#endif // DOCTEST_CLANG\n#ifndef DOCTEST_GCC\n#define DOCTEST_GCC 0\n#endif // DOCTEST_GCC\n\n// =================================================================================================\n// == COMPILER WARNINGS HELPERS ====================================================================\n// =================================================================================================\n\n#if DOCTEST_CLANG\n#define DOCTEST_PRAGMA_TO_STR(x) _Pragma(#x)\n#define DOCTEST_CLANG_SUPPRESS_WARNING_PUSH _Pragma(\"clang diagnostic push\")\n#define DOCTEST_CLANG_SUPPRESS_WARNING(w) DOCTEST_PRAGMA_TO_STR(clang diagnostic ignored w)\n#define DOCTEST_CLANG_SUPPRESS_WARNING_POP _Pragma(\"clang diagnostic pop\")\n#define DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(w)                                                \\\n    DOCTEST_CLANG_SUPPRESS_WARNING_PUSH DOCTEST_CLANG_SUPPRESS_WARNING(w)\n#else // DOCTEST_CLANG\n#define DOCTEST_CLANG_SUPPRESS_WARNING_PUSH\n#define DOCTEST_CLANG_SUPPRESS_WARNING(w)\n#define DOCTEST_CLANG_SUPPRESS_WARNING_POP\n#define DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(w)\n#endif // DOCTEST_CLANG\n\n#if DOCTEST_GCC\n#define DOCTEST_PRAGMA_TO_STR(x) _Pragma(#x)\n#define DOCTEST_GCC_SUPPRESS_WARNING_PUSH _Pragma(\"GCC diagnostic push\")\n#define DOCTEST_GCC_SUPPRESS_WARNING(w) DOCTEST_PRAGMA_TO_STR(GCC diagnostic ignored w)\n#define DOCTEST_GCC_SUPPRESS_WARNING_POP _Pragma(\"GCC diagnostic pop\")\n#define DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(w)                                                  \\\n    DOCTEST_GCC_SUPPRESS_WARNING_PUSH DOCTEST_GCC_SUPPRESS_WARNING(w)\n#else // DOCTEST_GCC\n#define DOCTEST_GCC_SUPPRESS_WARNING_PUSH\n#define DOCTEST_GCC_SUPPRESS_WARNING(w)\n#define DOCTEST_GCC_SUPPRESS_WARNING_POP\n#define DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(w)\n#endif // DOCTEST_GCC\n\n#if DOCTEST_MSVC\n#define DOCTEST_MSVC_SUPPRESS_WARNING_PUSH __pragma(warning(push))\n#define DOCTEST_MSVC_SUPPRESS_WARNING(w) __pragma(warning(disable : w))\n#define DOCTEST_MSVC_SUPPRESS_WARNING_POP __pragma(warning(pop))\n#define DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(w)                                                 \\\n    DOCTEST_MSVC_SUPPRESS_WARNING_PUSH DOCTEST_MSVC_SUPPRESS_WARNING(w)\n#else // DOCTEST_MSVC\n#define DOCTEST_MSVC_SUPPRESS_WARNING_PUSH\n#define DOCTEST_MSVC_SUPPRESS_WARNING(w)\n#define DOCTEST_MSVC_SUPPRESS_WARNING_POP\n#define DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(w)\n#endif // DOCTEST_MSVC\n\n// =================================================================================================\n// == COMPILER WARNINGS ============================================================================\n// =================================================================================================\n\nDOCTEST_CLANG_SUPPRESS_WARNING_PUSH\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wunknown-pragmas\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wnon-virtual-dtor\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wweak-vtables\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wpadded\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wdeprecated\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wmissing-prototypes\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wunused-local-typedef\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wc++98-compat\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wc++98-compat-pedantic\")\n\nDOCTEST_GCC_SUPPRESS_WARNING_PUSH\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wunknown-pragmas\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wpragmas\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Weffc++\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wstrict-overflow\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wstrict-aliasing\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wctor-dtor-privacy\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wmissing-declarations\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wnon-virtual-dtor\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wunused-local-typedefs\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wuseless-cast\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wnoexcept\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wsign-promo\")\n\nDOCTEST_MSVC_SUPPRESS_WARNING_PUSH\nDOCTEST_MSVC_SUPPRESS_WARNING(4616) // invalid compiler warning\nDOCTEST_MSVC_SUPPRESS_WARNING(4619) // invalid compiler warning\nDOCTEST_MSVC_SUPPRESS_WARNING(4996) // The compiler encountered a deprecated declaration\nDOCTEST_MSVC_SUPPRESS_WARNING(4706) // assignment within conditional expression\nDOCTEST_MSVC_SUPPRESS_WARNING(4512) // 'class' : assignment operator could not be generated\nDOCTEST_MSVC_SUPPRESS_WARNING(4127) // conditional expression is constant\nDOCTEST_MSVC_SUPPRESS_WARNING(4820) // padding\nDOCTEST_MSVC_SUPPRESS_WARNING(4625) // copy constructor was implicitly defined as deleted\nDOCTEST_MSVC_SUPPRESS_WARNING(4626) // assignment operator was implicitly defined as deleted\nDOCTEST_MSVC_SUPPRESS_WARNING(5027) // move assignment operator was implicitly defined as deleted\nDOCTEST_MSVC_SUPPRESS_WARNING(5026) // move constructor was implicitly defined as deleted\nDOCTEST_MSVC_SUPPRESS_WARNING(4623) // default constructor was implicitly defined as deleted\nDOCTEST_MSVC_SUPPRESS_WARNING(4640) // construction of local static object is not thread-safe\n// static analysis\nDOCTEST_MSVC_SUPPRESS_WARNING(26439) // This kind of function may not throw. Declare it 'noexcept'\nDOCTEST_MSVC_SUPPRESS_WARNING(26495) // Always initialize a member variable\nDOCTEST_MSVC_SUPPRESS_WARNING(26451) // Arithmetic overflow ...\nDOCTEST_MSVC_SUPPRESS_WARNING(26444) // Avoid unnamed objects with custom construction and dtr...\n\n// 4548 - expression before comma has no effect; expected expression with side - effect\n// 4265 - class has virtual functions, but destructor is not virtual\n// 4986 - exception specification does not match previous declaration\n// 4350 - behavior change: 'member1' called instead of 'member2'\n// 4668 - 'x' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'\n// 4365 - conversion from 'int' to 'unsigned long', signed/unsigned mismatch\n// 4774 - format string expected in argument 'x' is not a string literal\n// 4820 - padding in structs\n\n// only 4 should be disabled globally:\n// - 4514 # unreferenced inline function has been removed\n// - 4571 # SEH related\n// - 4710 # function not inlined\n// - 4711 # function 'x' selected for automatic inline expansion\n\n#define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN                                 \\\n    DOCTEST_MSVC_SUPPRESS_WARNING_PUSH                                                             \\\n    DOCTEST_MSVC_SUPPRESS_WARNING(4548)                                                            \\\n    DOCTEST_MSVC_SUPPRESS_WARNING(4265)                                                            \\\n    DOCTEST_MSVC_SUPPRESS_WARNING(4986)                                                            \\\n    DOCTEST_MSVC_SUPPRESS_WARNING(4350)                                                            \\\n    DOCTEST_MSVC_SUPPRESS_WARNING(4668)                                                            \\\n    DOCTEST_MSVC_SUPPRESS_WARNING(4365)                                                            \\\n    DOCTEST_MSVC_SUPPRESS_WARNING(4774)                                                            \\\n    DOCTEST_MSVC_SUPPRESS_WARNING(4820)                                                            \\\n    DOCTEST_MSVC_SUPPRESS_WARNING(4625)                                                            \\\n    DOCTEST_MSVC_SUPPRESS_WARNING(4626)                                                            \\\n    DOCTEST_MSVC_SUPPRESS_WARNING(5027)                                                            \\\n    DOCTEST_MSVC_SUPPRESS_WARNING(5026)                                                            \\\n    DOCTEST_MSVC_SUPPRESS_WARNING(4623)                                                            \\\n    DOCTEST_MSVC_SUPPRESS_WARNING(5039)                                                            \\\n    DOCTEST_MSVC_SUPPRESS_WARNING(5045)                                                            \\\n    DOCTEST_MSVC_SUPPRESS_WARNING(5105)\n\n#define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END DOCTEST_MSVC_SUPPRESS_WARNING_POP\n\n// =================================================================================================\n// == FEATURE DETECTION ============================================================================\n// =================================================================================================\n\n// general compiler feature support table: https://en.cppreference.com/w/cpp/compiler_support\n// MSVC C++11 feature support table: https://msdn.microsoft.com/en-us/library/hh567368.aspx\n// GCC C++11 feature support table: https://gcc.gnu.org/projects/cxx-status.html\n// MSVC version table:\n// https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B#Internal_version_numbering\n// MSVC++ 14.2 (16) _MSC_VER == 1920 (Visual Studio 2019)\n// MSVC++ 14.1 (15) _MSC_VER == 1910 (Visual Studio 2017)\n// MSVC++ 14.0      _MSC_VER == 1900 (Visual Studio 2015)\n// MSVC++ 12.0      _MSC_VER == 1800 (Visual Studio 2013)\n// MSVC++ 11.0      _MSC_VER == 1700 (Visual Studio 2012)\n// MSVC++ 10.0      _MSC_VER == 1600 (Visual Studio 2010)\n// MSVC++ 9.0       _MSC_VER == 1500 (Visual Studio 2008)\n// MSVC++ 8.0       _MSC_VER == 1400 (Visual Studio 2005)\n\n#if DOCTEST_MSVC && !defined(DOCTEST_CONFIG_WINDOWS_SEH)\n#define DOCTEST_CONFIG_WINDOWS_SEH\n#endif // MSVC\n#if defined(DOCTEST_CONFIG_NO_WINDOWS_SEH) && defined(DOCTEST_CONFIG_WINDOWS_SEH)\n#undef DOCTEST_CONFIG_WINDOWS_SEH\n#endif // DOCTEST_CONFIG_NO_WINDOWS_SEH\n\n#if !defined(_WIN32) && !defined(__QNX__) && !defined(DOCTEST_CONFIG_POSIX_SIGNALS) &&             \\\n        !defined(__EMSCRIPTEN__)\n#define DOCTEST_CONFIG_POSIX_SIGNALS\n#endif // _WIN32\n#if defined(DOCTEST_CONFIG_NO_POSIX_SIGNALS) && defined(DOCTEST_CONFIG_POSIX_SIGNALS)\n#undef DOCTEST_CONFIG_POSIX_SIGNALS\n#endif // DOCTEST_CONFIG_NO_POSIX_SIGNALS\n\n#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS\n#if !defined(__cpp_exceptions) && !defined(__EXCEPTIONS) && !defined(_CPPUNWIND)\n#define DOCTEST_CONFIG_NO_EXCEPTIONS\n#endif // no exceptions\n#endif // DOCTEST_CONFIG_NO_EXCEPTIONS\n\n#ifdef DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS\n#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS\n#define DOCTEST_CONFIG_NO_EXCEPTIONS\n#endif // DOCTEST_CONFIG_NO_EXCEPTIONS\n#endif // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS\n\n#if defined(DOCTEST_CONFIG_NO_EXCEPTIONS) && !defined(DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS)\n#define DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS\n#endif // DOCTEST_CONFIG_NO_EXCEPTIONS && !DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS\n\n#if defined(DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN) && !defined(DOCTEST_CONFIG_IMPLEMENT)\n#define DOCTEST_CONFIG_IMPLEMENT\n#endif // DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n\n#if defined(_WIN32) || defined(__CYGWIN__)\n#if DOCTEST_MSVC\n#define DOCTEST_SYMBOL_EXPORT __declspec(dllexport)\n#define DOCTEST_SYMBOL_IMPORT __declspec(dllimport)\n#else // MSVC\n#define DOCTEST_SYMBOL_EXPORT __attribute__((dllexport))\n#define DOCTEST_SYMBOL_IMPORT __attribute__((dllimport))\n#endif // MSVC\n#else  // _WIN32\n#define DOCTEST_SYMBOL_EXPORT __attribute__((visibility(\"default\")))\n#define DOCTEST_SYMBOL_IMPORT\n#endif // _WIN32\n\n#ifdef DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL\n#ifdef DOCTEST_CONFIG_IMPLEMENT\n#define DOCTEST_INTERFACE DOCTEST_SYMBOL_EXPORT\n#else // DOCTEST_CONFIG_IMPLEMENT\n#define DOCTEST_INTERFACE DOCTEST_SYMBOL_IMPORT\n#endif // DOCTEST_CONFIG_IMPLEMENT\n#else  // DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL\n#define DOCTEST_INTERFACE\n#endif // DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL\n\n#define DOCTEST_EMPTY\n\n#if DOCTEST_MSVC\n#define DOCTEST_NOINLINE __declspec(noinline)\n#define DOCTEST_UNUSED\n#define DOCTEST_ALIGNMENT(x)\n#define DOCTEST_NORETURN __declspec(noreturn)\n#if DOCTEST_MSVC < DOCTEST_COMPILER(19, 0, 0)\n#define DOCTEST_THREAD_LOCAL /* not supported */\n#define DOCTEST_NOEXCEPT /* not supported */\n#else\n#define DOCTEST_THREAD_LOCAL __declspec(thread)\n#define DOCTEST_NOEXCEPT noexcept\n#endif // MSVC version >= 19\n#else // MSVC\n#define DOCTEST_NOINLINE __attribute__((noinline))\n#define DOCTEST_UNUSED __attribute__((unused))\n#define DOCTEST_ALIGNMENT(x) __attribute__((aligned(x)))\n#define DOCTEST_NORETURN __attribute__((noreturn))\n#if DOCTEST_GCC < DOCTEST_COMPILER(4, 8, 0)\n#define DOCTEST_THREAD_LOCAL /* not supported */\n#else // GCC >= 4.8.0\n#define DOCTEST_THREAD_LOCAL thread_local\n#endif // GCC version\n#define DOCTEST_NOEXCEPT noexcept\n#endif // NOT MSVC\n\n\n// =================================================================================================\n// == FEATURE DETECTION END ========================================================================\n// =================================================================================================\n\n// internal macros for string concatenation and anonymous variable name generation\n#define DOCTEST_CAT_IMPL(s1, s2) s1##s2\n#define DOCTEST_CAT(s1, s2) DOCTEST_CAT_IMPL(s1, s2)\n#ifdef __COUNTER__ // not standard and may be missing for some compilers\n#define DOCTEST_ANONYMOUS(x) DOCTEST_CAT(x, __COUNTER__)\n#else // __COUNTER__\n#define DOCTEST_ANONYMOUS(x) DOCTEST_CAT(x, __LINE__)\n#endif // __COUNTER__\n\n#define DOCTEST_TOSTR(x) #x\n\n#ifndef DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE\n#define DOCTEST_REF_WRAP(x) x&\n#else // DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE\n#define DOCTEST_REF_WRAP(x) x\n#endif // DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE\n\n// not using __APPLE__ because... this is how Catch does it\n#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED\n#define DOCTEST_PLATFORM_MAC\n#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED)\n#define DOCTEST_PLATFORM_IPHONE\n#elif defined(_WIN32)\n#define DOCTEST_PLATFORM_WINDOWS\n#else // DOCTEST_PLATFORM\n#define DOCTEST_PLATFORM_LINUX\n#endif // DOCTEST_PLATFORM\n\n#define DOCTEST_GLOBAL_NO_WARNINGS(var)                                                            \\\n    DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(\"-Wglobal-constructors\")                              \\\n    DOCTEST_CLANG_SUPPRESS_WARNING(\"-Wunused-variable\")                                            \\\n    static int var DOCTEST_UNUSED // NOLINT(fuchsia-statically-constructed-objects,cert-err58-cpp)\n#define DOCTEST_GLOBAL_NO_WARNINGS_END() DOCTEST_CLANG_SUPPRESS_WARNING_POP\n\n#ifndef DOCTEST_BREAK_INTO_DEBUGGER\n// should probably take a look at https://github.com/scottt/debugbreak\n#ifdef DOCTEST_PLATFORM_MAC\n#define DOCTEST_BREAK_INTO_DEBUGGER() __asm__(\"int $3\\n\" : :)\n#elif DOCTEST_MSVC\n#define DOCTEST_BREAK_INTO_DEBUGGER() __debugbreak()\n#elif defined(__MINGW32__)\nDOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(\"-Wredundant-decls\")\nextern \"C\" __declspec(dllimport) void __stdcall DebugBreak();\nDOCTEST_GCC_SUPPRESS_WARNING_POP\n#define DOCTEST_BREAK_INTO_DEBUGGER() ::DebugBreak()\n#else // linux\n#define DOCTEST_BREAK_INTO_DEBUGGER() ((void)0)\n#endif // linux\n#endif // DOCTEST_BREAK_INTO_DEBUGGER\n\n// this is kept here for backwards compatibility since the config option was changed\n#ifdef DOCTEST_CONFIG_USE_IOSFWD\n#define DOCTEST_CONFIG_USE_STD_HEADERS\n#endif // DOCTEST_CONFIG_USE_IOSFWD\n\n#ifdef DOCTEST_CONFIG_USE_STD_HEADERS\n#include <iosfwd>\n#include <cstddef>\n#if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0)\n// see this issue on why this is needed: https://github.com/onqtam/doctest/issues/183\n#include <ostream>\n#endif // VS 2019\n#else // DOCTEST_CONFIG_USE_STD_HEADERS\n\n#if DOCTEST_CLANG\n// to detect if libc++ is being used with clang (the _LIBCPP_VERSION identifier)\n#include <ciso646>\n#endif // clang\n\n#ifdef _LIBCPP_VERSION\n#define DOCTEST_STD_NAMESPACE_BEGIN _LIBCPP_BEGIN_NAMESPACE_STD\n#define DOCTEST_STD_NAMESPACE_END _LIBCPP_END_NAMESPACE_STD\n#else // _LIBCPP_VERSION\n#define DOCTEST_STD_NAMESPACE_BEGIN namespace std {\n#define DOCTEST_STD_NAMESPACE_END }\n#endif // _LIBCPP_VERSION\n\n// Forward declaring 'X' in namespace std is not permitted by the C++ Standard.\nDOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4643)\n\nDOCTEST_STD_NAMESPACE_BEGIN // NOLINT (cert-dcl58-cpp)\ntypedef decltype(nullptr) nullptr_t;\ntemplate <class charT>\nstruct char_traits;\ntemplate <>\nstruct char_traits<char>;\ntemplate <class charT, class traits>\nclass basic_ostream;\ntypedef basic_ostream<char, char_traits<char>> ostream;\ntemplate <class... Types>\nclass tuple;\n#if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0)\n// see this issue on why this is needed: https://github.com/onqtam/doctest/issues/183\ntemplate <class _Ty>\nclass allocator;\ntemplate <class _Elem, class _Traits, class _Alloc>\nclass basic_string;\nusing string = basic_string<char, char_traits<char>, allocator<char>>;\n#endif // VS 2019\nDOCTEST_STD_NAMESPACE_END\n\nDOCTEST_MSVC_SUPPRESS_WARNING_POP\n\n#endif // DOCTEST_CONFIG_USE_STD_HEADERS\n\n#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS\n#include <type_traits>\n#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS\n\nnamespace doctest {\n\nDOCTEST_INTERFACE extern bool is_running_in_test;\n\n// A 24 byte string class (can be as small as 17 for x64 and 13 for x86) that can hold strings with length\n// of up to 23 chars on the stack before going on the heap - the last byte of the buffer is used for:\n// - \"is small\" bit - the highest bit - if \"0\" then it is small - otherwise its \"1\" (128)\n// - if small - capacity left before going on the heap - using the lowest 5 bits\n// - if small - 2 bits are left unused - the second and third highest ones\n// - if small - acts as a null terminator if strlen() is 23 (24 including the null terminator)\n//              and the \"is small\" bit remains \"0\" (\"as well as the capacity left\") so its OK\n// Idea taken from this lecture about the string implementation of facebook/folly - fbstring\n// https://www.youtube.com/watch?v=kPR8h4-qZdk\n// TODO:\n// - optimizations - like not deleting memory unnecessarily in operator= and etc.\n// - resize/reserve/clear\n// - substr\n// - replace\n// - back/front\n// - iterator stuff\n// - find & friends\n// - push_back/pop_back\n// - assign/insert/erase\n// - relational operators as free functions - taking const char* as one of the params\nclass DOCTEST_INTERFACE String\n{\n    static const unsigned len  = 24;      //!OCLINT avoid private static members\n    static const unsigned last = len - 1; //!OCLINT avoid private static members\n\n    struct view // len should be more than sizeof(view) - because of the final byte for flags\n    {\n        char*    ptr;\n        unsigned size;\n        unsigned capacity;\n    };\n\n    union\n    {\n        char buf[len];\n        view data;\n    };\n\n    bool isOnStack() const { return (buf[last] & 128) == 0; }\n    void setOnHeap();\n    void setLast(unsigned in = last);\n\n    void copy(const String& other);\n\npublic:\n    String();\n    ~String();\n\n    // cppcheck-suppress noExplicitConstructor\n    String(const char* in);\n    String(const char* in, unsigned in_size);\n\n    String(const String& other);\n    String& operator=(const String& other);\n\n    String& operator+=(const String& other);\n    String  operator+(const String& other) const;\n\n    String(String&& other);\n    String& operator=(String&& other);\n\n    char  operator[](unsigned i) const;\n    char& operator[](unsigned i);\n\n    // the only functions I'm willing to leave in the interface - available for inlining\n    const char* c_str() const { return const_cast<String*>(this)->c_str(); } // NOLINT\n    char*       c_str() {\n        if(isOnStack())\n            return reinterpret_cast<char*>(buf);\n        return data.ptr;\n    }\n\n    unsigned size() const;\n    unsigned capacity() const;\n\n    int compare(const char* other, bool no_case = false) const;\n    int compare(const String& other, bool no_case = false) const;\n};\n\nDOCTEST_INTERFACE bool operator==(const String& lhs, const String& rhs);\nDOCTEST_INTERFACE bool operator!=(const String& lhs, const String& rhs);\nDOCTEST_INTERFACE bool operator<(const String& lhs, const String& rhs);\nDOCTEST_INTERFACE bool operator>(const String& lhs, const String& rhs);\nDOCTEST_INTERFACE bool operator<=(const String& lhs, const String& rhs);\nDOCTEST_INTERFACE bool operator>=(const String& lhs, const String& rhs);\n\nDOCTEST_INTERFACE std::ostream& operator<<(std::ostream& s, const String& in);\n\nnamespace Color {\n    enum Enum\n    {\n        None = 0,\n        White,\n        Red,\n        Green,\n        Blue,\n        Cyan,\n        Yellow,\n        Grey,\n\n        Bright = 0x10,\n\n        BrightRed   = Bright | Red,\n        BrightGreen = Bright | Green,\n        LightGrey   = Bright | Grey,\n        BrightWhite = Bright | White\n    };\n\n    DOCTEST_INTERFACE std::ostream& operator<<(std::ostream& s, Color::Enum code);\n} // namespace Color\n\nnamespace assertType {\n    enum Enum\n    {\n        // macro traits\n\n        is_warn    = 1,\n        is_check   = 2 * is_warn,\n        is_require = 2 * is_check,\n\n        is_normal      = 2 * is_require,\n        is_throws      = 2 * is_normal,\n        is_throws_as   = 2 * is_throws,\n        is_throws_with = 2 * is_throws_as,\n        is_nothrow     = 2 * is_throws_with,\n\n        is_false = 2 * is_nothrow,\n        is_unary = 2 * is_false, // not checked anywhere - used just to distinguish the types\n\n        is_eq = 2 * is_unary,\n        is_ne = 2 * is_eq,\n\n        is_lt = 2 * is_ne,\n        is_gt = 2 * is_lt,\n\n        is_ge = 2 * is_gt,\n        is_le = 2 * is_ge,\n\n        // macro types\n\n        DT_WARN    = is_normal | is_warn,\n        DT_CHECK   = is_normal | is_check,\n        DT_REQUIRE = is_normal | is_require,\n\n        DT_WARN_FALSE    = is_normal | is_false | is_warn,\n        DT_CHECK_FALSE   = is_normal | is_false | is_check,\n        DT_REQUIRE_FALSE = is_normal | is_false | is_require,\n\n        DT_WARN_THROWS    = is_throws | is_warn,\n        DT_CHECK_THROWS   = is_throws | is_check,\n        DT_REQUIRE_THROWS = is_throws | is_require,\n\n        DT_WARN_THROWS_AS    = is_throws_as | is_warn,\n        DT_CHECK_THROWS_AS   = is_throws_as | is_check,\n        DT_REQUIRE_THROWS_AS = is_throws_as | is_require,\n\n        DT_WARN_THROWS_WITH    = is_throws_with | is_warn,\n        DT_CHECK_THROWS_WITH   = is_throws_with | is_check,\n        DT_REQUIRE_THROWS_WITH = is_throws_with | is_require,\n\n        DT_WARN_THROWS_WITH_AS    = is_throws_with | is_throws_as | is_warn,\n        DT_CHECK_THROWS_WITH_AS   = is_throws_with | is_throws_as | is_check,\n        DT_REQUIRE_THROWS_WITH_AS = is_throws_with | is_throws_as | is_require,\n\n        DT_WARN_NOTHROW    = is_nothrow | is_warn,\n        DT_CHECK_NOTHROW   = is_nothrow | is_check,\n        DT_REQUIRE_NOTHROW = is_nothrow | is_require,\n\n        DT_WARN_EQ    = is_normal | is_eq | is_warn,\n        DT_CHECK_EQ   = is_normal | is_eq | is_check,\n        DT_REQUIRE_EQ = is_normal | is_eq | is_require,\n\n        DT_WARN_NE    = is_normal | is_ne | is_warn,\n        DT_CHECK_NE   = is_normal | is_ne | is_check,\n        DT_REQUIRE_NE = is_normal | is_ne | is_require,\n\n        DT_WARN_GT    = is_normal | is_gt | is_warn,\n        DT_CHECK_GT   = is_normal | is_gt | is_check,\n        DT_REQUIRE_GT = is_normal | is_gt | is_require,\n\n        DT_WARN_LT    = is_normal | is_lt | is_warn,\n        DT_CHECK_LT   = is_normal | is_lt | is_check,\n        DT_REQUIRE_LT = is_normal | is_lt | is_require,\n\n        DT_WARN_GE    = is_normal | is_ge | is_warn,\n        DT_CHECK_GE   = is_normal | is_ge | is_check,\n        DT_REQUIRE_GE = is_normal | is_ge | is_require,\n\n        DT_WARN_LE    = is_normal | is_le | is_warn,\n        DT_CHECK_LE   = is_normal | is_le | is_check,\n        DT_REQUIRE_LE = is_normal | is_le | is_require,\n\n        DT_WARN_UNARY    = is_normal | is_unary | is_warn,\n        DT_CHECK_UNARY   = is_normal | is_unary | is_check,\n        DT_REQUIRE_UNARY = is_normal | is_unary | is_require,\n\n        DT_WARN_UNARY_FALSE    = is_normal | is_false | is_unary | is_warn,\n        DT_CHECK_UNARY_FALSE   = is_normal | is_false | is_unary | is_check,\n        DT_REQUIRE_UNARY_FALSE = is_normal | is_false | is_unary | is_require,\n    };\n} // namespace assertType\n\nDOCTEST_INTERFACE const char* assertString(assertType::Enum at);\nDOCTEST_INTERFACE const char* failureString(assertType::Enum at);\nDOCTEST_INTERFACE const char* skipPathFromFilename(const char* file);\n\nstruct DOCTEST_INTERFACE TestCaseData\n{\n    const char* m_file;       // the file in which the test was registered\n    unsigned    m_line;       // the line where the test was registered\n    const char* m_name;       // name of the test case\n    const char* m_test_suite; // the test suite in which the test was added\n    const char* m_description;\n    bool        m_skip;\n    bool        m_may_fail;\n    bool        m_should_fail;\n    int         m_expected_failures;\n    double      m_timeout;\n};\n\nstruct DOCTEST_INTERFACE AssertData\n{\n    // common - for all asserts\n    const TestCaseData* m_test_case;\n    assertType::Enum    m_at;\n    const char*         m_file;\n    int                 m_line;\n    const char*         m_expr;\n    bool                m_failed;\n\n    // exception-related - for all asserts\n    bool   m_threw;\n    String m_exception;\n\n    // for normal asserts\n    String m_decomp;\n\n    // for specific exception-related asserts\n    bool        m_threw_as;\n    const char* m_exception_type;\n    const char* m_exception_string;\n};\n\nstruct DOCTEST_INTERFACE MessageData\n{\n    String           m_string;\n    const char*      m_file;\n    int              m_line;\n    assertType::Enum m_severity;\n};\n\nstruct DOCTEST_INTERFACE SubcaseSignature\n{\n    const char* m_name;\n    const char* m_file;\n    int         m_line;\n\n    bool operator<(const SubcaseSignature& other) const;\n};\n\nstruct DOCTEST_INTERFACE IContextScope\n{\n    IContextScope();\n    virtual ~IContextScope();\n    virtual void stringify(std::ostream*) const = 0;\n};\n\nstruct ContextOptions //!OCLINT too many fields\n{\n    std::ostream* cout;        // stdout stream - std::cout by default\n    std::ostream* cerr;        // stderr stream - std::cerr by default\n    String        binary_name; // the test binary name\n\n    // == parameters from the command line\n    String   out;       // output filename\n    String   order_by;  // how tests should be ordered\n    unsigned rand_seed; // the seed for rand ordering\n\n    unsigned first; // the first (matching) test to be executed\n    unsigned last;  // the last (matching) test to be executed\n\n    int abort_after;           // stop tests after this many failed assertions\n    int subcase_filter_levels; // apply the subcase filters for the first N levels\n\n    bool success;              // include successful assertions in output\n    bool case_sensitive;       // if filtering should be case sensitive\n    bool exit;                 // if the program should be exited after the tests are ran/whatever\n    bool duration;             // print the time duration of each test case\n    bool no_throw;             // to skip exceptions-related assertion macros\n    bool no_exitcode;          // if the framework should return 0 as the exitcode\n    bool no_run;               // to not run the tests at all (can be done with an \"*\" exclude)\n    bool no_version;           // to not print the version of the framework\n    bool no_colors;            // if output to the console should be colorized\n    bool force_colors;         // forces the use of colors even when a tty cannot be detected\n    bool no_breaks;            // to not break into the debugger\n    bool no_skip;              // don't skip test cases which are marked to be skipped\n    bool gnu_file_line;        // if line numbers should be surrounded with :x: and not (x):\n    bool no_path_in_filenames; // if the path to files should be removed from the output\n    bool no_line_numbers;      // if source code line numbers should be omitted from the output\n    bool no_skipped_summary;   // don't print \"skipped\" in the summary !!! UNDOCUMENTED !!!\n\n    bool help;             // to print the help\n    bool version;          // to print the version\n    bool count;            // if only the count of matching tests is to be retrieved\n    bool list_test_cases;  // to list all tests matching the filters\n    bool list_test_suites; // to list all suites matching the filters\n    bool list_reporters;   // lists all registered reporters\n};\n\nnamespace detail {\n#if defined(DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING) || defined(DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS)\n    template <bool CONDITION, typename TYPE = void>\n    struct enable_if\n    {};\n\n    template <typename TYPE>\n    struct enable_if<true, TYPE>\n    { typedef TYPE type; };\n#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING) || DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS\n\n    // clang-format off\n    template<class T> struct remove_reference      { typedef T type; };\n    template<class T> struct remove_reference<T&>  { typedef T type; };\n    template<class T> struct remove_reference<T&&> { typedef T type; };\n\n    template<class T> struct remove_const          { typedef T type; };\n    template<class T> struct remove_const<const T> { typedef T type; };\n    // clang-format on\n\n    template <typename T>\n    struct deferred_false\n    // cppcheck-suppress unusedStructMember\n    { static const bool value = false; };\n\n    namespace has_insertion_operator_impl {\n        typedef char no;\n        typedef char yes[2];\n\n        struct any_t\n        {\n            template <typename T>\n            // cppcheck-suppress noExplicitConstructor\n            any_t(const DOCTEST_REF_WRAP(T));\n        };\n\n        yes& testStreamable(std::ostream&);\n        no   testStreamable(no);\n\n        no operator<<(const std::ostream&, const any_t&);\n\n        template <typename T>\n        struct has_insertion_operator\n        {\n            static std::ostream& s;\n            static const DOCTEST_REF_WRAP(T) t;\n            static const bool value = sizeof(decltype(testStreamable(s << t))) == sizeof(yes);\n        };\n    } // namespace has_insertion_operator_impl\n\n    template <typename T>\n    struct has_insertion_operator : has_insertion_operator_impl::has_insertion_operator<T>\n    {};\n\n    DOCTEST_INTERFACE void my_memcpy(void* dest, const void* src, unsigned num);\n\n    DOCTEST_INTERFACE std::ostream* getTlsOss(); // returns a thread-local ostringstream\n    DOCTEST_INTERFACE String getTlsOssResult();\n\n    template <bool C>\n    struct StringMakerBase\n    {\n        template <typename T>\n        static String convert(const DOCTEST_REF_WRAP(T)) {\n            return \"{?}\";\n        }\n    };\n\n    template <>\n    struct StringMakerBase<true>\n    {\n        template <typename T>\n        static String convert(const DOCTEST_REF_WRAP(T) in) {\n            *getTlsOss() << in;\n            return getTlsOssResult();\n        }\n    };\n\n    DOCTEST_INTERFACE String rawMemoryToString(const void* object, unsigned size);\n\n    template <typename T>\n    String rawMemoryToString(const DOCTEST_REF_WRAP(T) object) {\n        return rawMemoryToString(&object, sizeof(object));\n    }\n\n    template <typename T>\n    const char* type_to_string() {\n        return \"<>\";\n    }\n} // namespace detail\n\ntemplate <typename T>\nstruct StringMaker : public detail::StringMakerBase<detail::has_insertion_operator<T>::value>\n{};\n\ntemplate <typename T>\nstruct StringMaker<T*>\n{\n    template <typename U>\n    static String convert(U* p) {\n        if(p)\n            return detail::rawMemoryToString(p);\n        return \"NULL\";\n    }\n};\n\ntemplate <typename R, typename C>\nstruct StringMaker<R C::*>\n{\n    static String convert(R C::*p) {\n        if(p)\n            return detail::rawMemoryToString(p);\n        return \"NULL\";\n    }\n};\n\ntemplate <typename T>\nString toString(const DOCTEST_REF_WRAP(T) value) {\n    return StringMaker<T>::convert(value);\n}\n\n#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING\nDOCTEST_INTERFACE String toString(char* in);\nDOCTEST_INTERFACE String toString(const char* in);\n#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING\nDOCTEST_INTERFACE String toString(bool in);\nDOCTEST_INTERFACE String toString(float in);\nDOCTEST_INTERFACE String toString(double in);\nDOCTEST_INTERFACE String toString(double long in);\n\nDOCTEST_INTERFACE String toString(char in);\nDOCTEST_INTERFACE String toString(char signed in);\nDOCTEST_INTERFACE String toString(char unsigned in);\nDOCTEST_INTERFACE String toString(int short in);\nDOCTEST_INTERFACE String toString(int short unsigned in);\nDOCTEST_INTERFACE String toString(int in);\nDOCTEST_INTERFACE String toString(int unsigned in);\nDOCTEST_INTERFACE String toString(int long in);\nDOCTEST_INTERFACE String toString(int long unsigned in);\nDOCTEST_INTERFACE String toString(int long long in);\nDOCTEST_INTERFACE String toString(int long long unsigned in);\nDOCTEST_INTERFACE String toString(std::nullptr_t in);\n\n#if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0)\n// see this issue on why this is needed: https://github.com/onqtam/doctest/issues/183\nDOCTEST_INTERFACE String toString(const std::string& in);\n#endif // VS 2019\n\nclass DOCTEST_INTERFACE Approx\n{\npublic:\n    explicit Approx(double value);\n\n    Approx operator()(double value) const;\n\n#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS\n    template <typename T>\n    explicit Approx(const T& value,\n                    typename detail::enable_if<std::is_constructible<double, T>::value>::type* =\n                            static_cast<T*>(nullptr)) {\n        *this = Approx(static_cast<double>(value));\n    }\n#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS\n\n    Approx& epsilon(double newEpsilon);\n\n#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS\n    template <typename T>\n    typename detail::enable_if<std::is_constructible<double, T>::value, Approx&>::type epsilon(\n            const T& newEpsilon) {\n        m_epsilon = static_cast<double>(newEpsilon);\n        return *this;\n    }\n#endif //  DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS\n\n    Approx& scale(double newScale);\n\n#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS\n    template <typename T>\n    typename detail::enable_if<std::is_constructible<double, T>::value, Approx&>::type scale(\n            const T& newScale) {\n        m_scale = static_cast<double>(newScale);\n        return *this;\n    }\n#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS\n\n    // clang-format off\n    DOCTEST_INTERFACE friend bool operator==(double lhs, const Approx & rhs);\n    DOCTEST_INTERFACE friend bool operator==(const Approx & lhs, double rhs);\n    DOCTEST_INTERFACE friend bool operator!=(double lhs, const Approx & rhs);\n    DOCTEST_INTERFACE friend bool operator!=(const Approx & lhs, double rhs);\n    DOCTEST_INTERFACE friend bool operator<=(double lhs, const Approx & rhs);\n    DOCTEST_INTERFACE friend bool operator<=(const Approx & lhs, double rhs);\n    DOCTEST_INTERFACE friend bool operator>=(double lhs, const Approx & rhs);\n    DOCTEST_INTERFACE friend bool operator>=(const Approx & lhs, double rhs);\n    DOCTEST_INTERFACE friend bool operator< (double lhs, const Approx & rhs);\n    DOCTEST_INTERFACE friend bool operator< (const Approx & lhs, double rhs);\n    DOCTEST_INTERFACE friend bool operator> (double lhs, const Approx & rhs);\n    DOCTEST_INTERFACE friend bool operator> (const Approx & lhs, double rhs);\n\n    DOCTEST_INTERFACE friend String toString(const Approx& in);\n\n#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS\n#define DOCTEST_APPROX_PREFIX \\\n    template <typename T> friend typename detail::enable_if<std::is_constructible<double, T>::value, bool>::type\n\n    DOCTEST_APPROX_PREFIX operator==(const T& lhs, const Approx& rhs) { return operator==(double(lhs), rhs); }\n    DOCTEST_APPROX_PREFIX operator==(const Approx& lhs, const T& rhs) { return operator==(rhs, lhs); }\n    DOCTEST_APPROX_PREFIX operator!=(const T& lhs, const Approx& rhs) { return !operator==(lhs, rhs); }\n    DOCTEST_APPROX_PREFIX operator!=(const Approx& lhs, const T& rhs) { return !operator==(rhs, lhs); }\n    DOCTEST_APPROX_PREFIX operator<=(const T& lhs, const Approx& rhs) { return double(lhs) < rhs.m_value || lhs == rhs; }\n    DOCTEST_APPROX_PREFIX operator<=(const Approx& lhs, const T& rhs) { return lhs.m_value < double(rhs) || lhs == rhs; }\n    DOCTEST_APPROX_PREFIX operator>=(const T& lhs, const Approx& rhs) { return double(lhs) > rhs.m_value || lhs == rhs; }\n    DOCTEST_APPROX_PREFIX operator>=(const Approx& lhs, const T& rhs) { return lhs.m_value > double(rhs) || lhs == rhs; }\n    DOCTEST_APPROX_PREFIX operator< (const T& lhs, const Approx& rhs) { return double(lhs) < rhs.m_value && lhs != rhs; }\n    DOCTEST_APPROX_PREFIX operator< (const Approx& lhs, const T& rhs) { return lhs.m_value < double(rhs) && lhs != rhs; }\n    DOCTEST_APPROX_PREFIX operator> (const T& lhs, const Approx& rhs) { return double(lhs) > rhs.m_value && lhs != rhs; }\n    DOCTEST_APPROX_PREFIX operator> (const Approx& lhs, const T& rhs) { return lhs.m_value > double(rhs) && lhs != rhs; }\n#undef DOCTEST_APPROX_PREFIX\n#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS\n\n    // clang-format on\n\nprivate:\n    double m_epsilon;\n    double m_scale;\n    double m_value;\n};\n\nDOCTEST_INTERFACE String toString(const Approx& in);\n\nDOCTEST_INTERFACE const ContextOptions* getContextOptions();\n\n#if !defined(DOCTEST_CONFIG_DISABLE)\n\nnamespace detail {\n    // clang-format off\n#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING\n    template<class T>               struct decay_array       { typedef T type; };\n    template<class T, unsigned N>   struct decay_array<T[N]> { typedef T* type; };\n    template<class T>               struct decay_array<T[]>  { typedef T* type; };\n\n    template<class T>   struct not_char_pointer              { enum { value = 1 }; };\n    template<>          struct not_char_pointer<char*>       { enum { value = 0 }; };\n    template<>          struct not_char_pointer<const char*> { enum { value = 0 }; };\n\n    template<class T> struct can_use_op : public not_char_pointer<typename decay_array<T>::type> {};\n#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING\n    // clang-format on\n\n    struct DOCTEST_INTERFACE TestFailureException\n    {\n    };\n\n    DOCTEST_INTERFACE bool checkIfShouldThrow(assertType::Enum at);\n\n#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS\n    DOCTEST_NORETURN\n#endif // DOCTEST_CONFIG_NO_EXCEPTIONS\n    DOCTEST_INTERFACE void throwException();\n\n    struct DOCTEST_INTERFACE Subcase\n    {\n        SubcaseSignature m_signature;\n        bool             m_entered = false;\n\n        Subcase(const char* name, const char* file, int line);\n        ~Subcase();\n\n        operator bool() const;\n    };\n\n    template <typename L, typename R>\n    String stringifyBinaryExpr(const DOCTEST_REF_WRAP(L) lhs, const char* op,\n                               const DOCTEST_REF_WRAP(R) rhs) {\n        return toString(lhs) + op + toString(rhs);\n    }\n\n#define DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(op, op_str, op_macro)                              \\\n    template <typename R>                                                                          \\\n    DOCTEST_NOINLINE Result operator op(const DOCTEST_REF_WRAP(R) rhs) {                           \\\n        bool res = op_macro(lhs, rhs);                                                             \\\n        if(m_at & assertType::is_false)                                                            \\\n            res = !res;                                                                            \\\n        if(!res || doctest::getContextOptions()->success)                                          \\\n            return Result(res, stringifyBinaryExpr(lhs, op_str, rhs));                             \\\n        return Result(res);                                                                        \\\n    }\n\n    // more checks could be added - like in Catch:\n    // https://github.com/catchorg/Catch2/pull/1480/files\n    // https://github.com/catchorg/Catch2/pull/1481/files\n#define DOCTEST_FORBIT_EXPRESSION(rt, op)                                                          \\\n    template <typename R>                                                                          \\\n    rt& operator op(const R&) {                                                                    \\\n        static_assert(deferred_false<R>::value,                                                    \\\n                      \"Expression Too Complex Please Rewrite As Binary Comparison!\");              \\\n        return *this;                                                                              \\\n    }\n\n    struct DOCTEST_INTERFACE Result\n    {\n        bool   m_passed;\n        String m_decomp;\n\n        Result(bool passed, const String& decomposition = String());\n\n        // forbidding some expressions based on this table: http://en.cppreference.com/w/cpp/language/operator_precedence\n        DOCTEST_FORBIT_EXPRESSION(Result, &)\n        DOCTEST_FORBIT_EXPRESSION(Result, ^)\n        DOCTEST_FORBIT_EXPRESSION(Result, |)\n        DOCTEST_FORBIT_EXPRESSION(Result, &&)\n        DOCTEST_FORBIT_EXPRESSION(Result, ||)\n        DOCTEST_FORBIT_EXPRESSION(Result, ==)\n        DOCTEST_FORBIT_EXPRESSION(Result, !=)\n        DOCTEST_FORBIT_EXPRESSION(Result, <)\n        DOCTEST_FORBIT_EXPRESSION(Result, >)\n        DOCTEST_FORBIT_EXPRESSION(Result, <=)\n        DOCTEST_FORBIT_EXPRESSION(Result, >=)\n        DOCTEST_FORBIT_EXPRESSION(Result, =)\n        DOCTEST_FORBIT_EXPRESSION(Result, +=)\n        DOCTEST_FORBIT_EXPRESSION(Result, -=)\n        DOCTEST_FORBIT_EXPRESSION(Result, *=)\n        DOCTEST_FORBIT_EXPRESSION(Result, /=)\n        DOCTEST_FORBIT_EXPRESSION(Result, %=)\n        DOCTEST_FORBIT_EXPRESSION(Result, <<=)\n        DOCTEST_FORBIT_EXPRESSION(Result, >>=)\n        DOCTEST_FORBIT_EXPRESSION(Result, &=)\n        DOCTEST_FORBIT_EXPRESSION(Result, ^=)\n        DOCTEST_FORBIT_EXPRESSION(Result, |=)\n    };\n\n#ifndef DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION\n\n    DOCTEST_CLANG_SUPPRESS_WARNING_PUSH\n    DOCTEST_CLANG_SUPPRESS_WARNING(\"-Wsign-conversion\")\n    DOCTEST_CLANG_SUPPRESS_WARNING(\"-Wsign-compare\")\n    //DOCTEST_CLANG_SUPPRESS_WARNING(\"-Wdouble-promotion\")\n    //DOCTEST_CLANG_SUPPRESS_WARNING(\"-Wconversion\")\n    //DOCTEST_CLANG_SUPPRESS_WARNING(\"-Wfloat-equal\")\n\n    DOCTEST_GCC_SUPPRESS_WARNING_PUSH\n    DOCTEST_GCC_SUPPRESS_WARNING(\"-Wsign-conversion\")\n    DOCTEST_GCC_SUPPRESS_WARNING(\"-Wsign-compare\")\n    //DOCTEST_GCC_SUPPRESS_WARNING(\"-Wdouble-promotion\")\n    //DOCTEST_GCC_SUPPRESS_WARNING(\"-Wconversion\")\n    //DOCTEST_GCC_SUPPRESS_WARNING(\"-Wfloat-equal\")\n\n    DOCTEST_MSVC_SUPPRESS_WARNING_PUSH\n    // http://stackoverflow.com/questions/39479163 what's the difference between 4018 and 4389\n    DOCTEST_MSVC_SUPPRESS_WARNING(4388) // signed/unsigned mismatch\n    DOCTEST_MSVC_SUPPRESS_WARNING(4389) // 'operator' : signed/unsigned mismatch\n    DOCTEST_MSVC_SUPPRESS_WARNING(4018) // 'expression' : signed/unsigned mismatch\n    //DOCTEST_MSVC_SUPPRESS_WARNING(4805) // 'operation' : unsafe mix of type 'type' and type 'type' in operation\n\n#endif // DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION\n\n    // clang-format off\n#ifndef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING\n#define DOCTEST_COMPARISON_RETURN_TYPE bool\n#else // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING\n#define DOCTEST_COMPARISON_RETURN_TYPE typename enable_if<can_use_op<L>::value || can_use_op<R>::value, bool>::type\n    inline bool eq(const char* lhs, const char* rhs) { return String(lhs) == String(rhs); }\n    inline bool ne(const char* lhs, const char* rhs) { return String(lhs) != String(rhs); }\n    inline bool lt(const char* lhs, const char* rhs) { return String(lhs) <  String(rhs); }\n    inline bool gt(const char* lhs, const char* rhs) { return String(lhs) >  String(rhs); }\n    inline bool le(const char* lhs, const char* rhs) { return String(lhs) <= String(rhs); }\n    inline bool ge(const char* lhs, const char* rhs) { return String(lhs) >= String(rhs); }\n#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING\n    // clang-format on\n\n#define DOCTEST_RELATIONAL_OP(name, op)                                                            \\\n    template <typename L, typename R>                                                              \\\n    DOCTEST_COMPARISON_RETURN_TYPE name(const DOCTEST_REF_WRAP(L) lhs,                             \\\n                                        const DOCTEST_REF_WRAP(R) rhs) {                           \\\n        return lhs op rhs;                                                                         \\\n    }\n\n    DOCTEST_RELATIONAL_OP(eq, ==)\n    DOCTEST_RELATIONAL_OP(ne, !=)\n    DOCTEST_RELATIONAL_OP(lt, <)\n    DOCTEST_RELATIONAL_OP(gt, >)\n    DOCTEST_RELATIONAL_OP(le, <=)\n    DOCTEST_RELATIONAL_OP(ge, >=)\n\n#ifndef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING\n#define DOCTEST_CMP_EQ(l, r) l == r\n#define DOCTEST_CMP_NE(l, r) l != r\n#define DOCTEST_CMP_GT(l, r) l > r\n#define DOCTEST_CMP_LT(l, r) l < r\n#define DOCTEST_CMP_GE(l, r) l >= r\n#define DOCTEST_CMP_LE(l, r) l <= r\n#else // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING\n#define DOCTEST_CMP_EQ(l, r) eq(l, r)\n#define DOCTEST_CMP_NE(l, r) ne(l, r)\n#define DOCTEST_CMP_GT(l, r) gt(l, r)\n#define DOCTEST_CMP_LT(l, r) lt(l, r)\n#define DOCTEST_CMP_GE(l, r) ge(l, r)\n#define DOCTEST_CMP_LE(l, r) le(l, r)\n#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING\n\n    template <typename L>\n    // cppcheck-suppress copyCtorAndEqOperator\n    struct Expression_lhs\n    {\n        L                lhs;\n        assertType::Enum m_at;\n\n        explicit Expression_lhs(L in, assertType::Enum at)\n                : lhs(in)\n                , m_at(at) {}\n\n        DOCTEST_NOINLINE operator Result() {\n            bool res = !!lhs;\n            if(m_at & assertType::is_false) //!OCLINT bitwise operator in conditional\n                res = !res;\n\n            if(!res || getContextOptions()->success)\n                return Result(res, toString(lhs));\n            return Result(res);\n        }\n\n        // clang-format off\n        DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(==, \" == \", DOCTEST_CMP_EQ) //!OCLINT bitwise operator in conditional\n        DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(!=, \" != \", DOCTEST_CMP_NE) //!OCLINT bitwise operator in conditional\n        DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(>,  \" >  \", DOCTEST_CMP_GT) //!OCLINT bitwise operator in conditional\n        DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(<,  \" <  \", DOCTEST_CMP_LT) //!OCLINT bitwise operator in conditional\n        DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(>=, \" >= \", DOCTEST_CMP_GE) //!OCLINT bitwise operator in conditional\n        DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(<=, \" <= \", DOCTEST_CMP_LE) //!OCLINT bitwise operator in conditional\n        // clang-format on\n\n        // forbidding some expressions based on this table: http://en.cppreference.com/w/cpp/language/operator_precedence\n        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, &)\n        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, ^)\n        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, |)\n        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, &&)\n        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, ||)\n        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, =)\n        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, +=)\n        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, -=)\n        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, *=)\n        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, /=)\n        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, %=)\n        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, <<=)\n        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, >>=)\n        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, &=)\n        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, ^=)\n        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, |=)\n        // these 2 are unfortunate because they should be allowed - they have higher precedence over the comparisons, but the\n        // ExpressionDecomposer class uses the left shift operator to capture the left operand of the binary expression...\n        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, <<)\n        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, >>)\n    };\n\n#ifndef DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION\n\n    DOCTEST_CLANG_SUPPRESS_WARNING_POP\n    DOCTEST_MSVC_SUPPRESS_WARNING_POP\n    DOCTEST_GCC_SUPPRESS_WARNING_POP\n\n#endif // DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION\n\n    struct DOCTEST_INTERFACE ExpressionDecomposer\n    {\n        assertType::Enum m_at;\n\n        ExpressionDecomposer(assertType::Enum at);\n\n        // The right operator for capturing expressions is \"<=\" instead of \"<<\" (based on the operator precedence table)\n        // but then there will be warnings from GCC about \"-Wparentheses\" and since \"_Pragma()\" is problematic this will stay for now...\n        // https://github.com/catchorg/Catch2/issues/870\n        // https://github.com/catchorg/Catch2/issues/565\n        template <typename L>\n        Expression_lhs<const DOCTEST_REF_WRAP(L)> operator<<(const DOCTEST_REF_WRAP(L) operand) {\n            return Expression_lhs<const DOCTEST_REF_WRAP(L)>(operand, m_at);\n        }\n    };\n\n    struct DOCTEST_INTERFACE TestSuite\n    {\n        const char* m_test_suite;\n        const char* m_description;\n        bool        m_skip;\n        bool        m_may_fail;\n        bool        m_should_fail;\n        int         m_expected_failures;\n        double      m_timeout;\n\n        TestSuite& operator*(const char* in);\n\n        template <typename T>\n        TestSuite& operator*(const T& in) {\n            in.fill(*this);\n            return *this;\n        }\n    };\n\n    typedef void (*funcType)();\n\n    struct DOCTEST_INTERFACE TestCase : public TestCaseData\n    {\n        funcType m_test; // a function pointer to the test case\n\n        const char* m_type; // for templated test cases - gets appended to the real name\n        int m_template_id; // an ID used to distinguish between the different versions of a templated test case\n        String m_full_name; // contains the name (only for templated test cases!) + the template type\n\n        TestCase(funcType test, const char* file, unsigned line, const TestSuite& test_suite,\n                 const char* type = \"\", int template_id = -1);\n\n        TestCase(const TestCase& other);\n\n        DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(26434) // hides a non-virtual function\n        TestCase& operator=(const TestCase& other);\n        DOCTEST_MSVC_SUPPRESS_WARNING_POP\n\n        TestCase& operator*(const char* in);\n\n        template <typename T>\n        TestCase& operator*(const T& in) {\n            in.fill(*this);\n            return *this;\n        }\n\n        bool operator<(const TestCase& other) const;\n    };\n\n    // forward declarations of functions used by the macros\n    DOCTEST_INTERFACE int  regTest(const TestCase& tc);\n    DOCTEST_INTERFACE int  setTestSuite(const TestSuite& ts);\n    DOCTEST_INTERFACE bool isDebuggerActive();\n\n    template<typename T>\n    int instantiationHelper(const T&) { return 0; }\n\n    namespace binaryAssertComparison {\n        enum Enum\n        {\n            eq = 0,\n            ne,\n            gt,\n            lt,\n            ge,\n            le\n        };\n    } // namespace binaryAssertComparison\n\n    // clang-format off\n    template <int, class L, class R> struct RelationalComparator     { bool operator()(const DOCTEST_REF_WRAP(L),     const DOCTEST_REF_WRAP(R)    ) const { return false;        } };\n\n#define DOCTEST_BINARY_RELATIONAL_OP(n, op) \\\n    template <class L, class R> struct RelationalComparator<n, L, R> { bool operator()(const DOCTEST_REF_WRAP(L) lhs, const DOCTEST_REF_WRAP(R) rhs) const { return op(lhs, rhs); } };\n    // clang-format on\n\n    DOCTEST_BINARY_RELATIONAL_OP(0, eq)\n    DOCTEST_BINARY_RELATIONAL_OP(1, ne)\n    DOCTEST_BINARY_RELATIONAL_OP(2, gt)\n    DOCTEST_BINARY_RELATIONAL_OP(3, lt)\n    DOCTEST_BINARY_RELATIONAL_OP(4, ge)\n    DOCTEST_BINARY_RELATIONAL_OP(5, le)\n\n    struct DOCTEST_INTERFACE ResultBuilder : public AssertData\n    {\n        ResultBuilder(assertType::Enum at, const char* file, int line, const char* expr,\n                      const char* exception_type = \"\", const char* exception_string = \"\");\n\n        void setResult(const Result& res);\n\n        template <int comparison, typename L, typename R>\n        DOCTEST_NOINLINE void binary_assert(const DOCTEST_REF_WRAP(L) lhs,\n                                            const DOCTEST_REF_WRAP(R) rhs) {\n            m_failed = !RelationalComparator<comparison, L, R>()(lhs, rhs);\n            if(m_failed || getContextOptions()->success)\n                m_decomp = stringifyBinaryExpr(lhs, \", \", rhs);\n        }\n\n        template <typename L>\n        DOCTEST_NOINLINE void unary_assert(const DOCTEST_REF_WRAP(L) val) {\n            m_failed = !val;\n\n            if(m_at & assertType::is_false) //!OCLINT bitwise operator in conditional\n                m_failed = !m_failed;\n\n            if(m_failed || getContextOptions()->success)\n                m_decomp = toString(val);\n        }\n\n        void translateException();\n\n        bool log();\n        void react() const;\n    };\n\n    namespace assertAction {\n        enum Enum\n        {\n            nothing     = 0,\n            dbgbreak    = 1,\n            shouldthrow = 2\n        };\n    } // namespace assertAction\n\n    DOCTEST_INTERFACE void failed_out_of_a_testing_context(const AssertData& ad);\n\n    DOCTEST_INTERFACE void decomp_assert(assertType::Enum at, const char* file, int line,\n                                         const char* expr, Result result);\n\n#define DOCTEST_ASSERT_OUT_OF_TESTS(decomp)                                                        \\\n    do {                                                                                           \\\n        if(!is_running_in_test) {                                                                  \\\n            if(failed) {                                                                           \\\n                ResultBuilder rb(at, file, line, expr);                                            \\\n                rb.m_failed = failed;                                                              \\\n                rb.m_decomp = decomp;                                                              \\\n                failed_out_of_a_testing_context(rb);                                               \\\n                if(isDebuggerActive() && !getContextOptions()->no_breaks)                          \\\n                    DOCTEST_BREAK_INTO_DEBUGGER();                                                 \\\n                if(checkIfShouldThrow(at))                                                         \\\n                    throwException();                                                              \\\n            }                                                                                      \\\n            return;                                                                                \\\n        }                                                                                          \\\n    } while(false)\n\n#define DOCTEST_ASSERT_IN_TESTS(decomp)                                                            \\\n    ResultBuilder rb(at, file, line, expr);                                                        \\\n    rb.m_failed = failed;                                                                          \\\n    if(rb.m_failed || getContextOptions()->success)                                                \\\n        rb.m_decomp = decomp;                                                                      \\\n    if(rb.log())                                                                                   \\\n        DOCTEST_BREAK_INTO_DEBUGGER();                                                             \\\n    if(rb.m_failed && checkIfShouldThrow(at))                                                      \\\n    throwException()\n\n    template <int comparison, typename L, typename R>\n    DOCTEST_NOINLINE void binary_assert(assertType::Enum at, const char* file, int line,\n                                        const char* expr, const DOCTEST_REF_WRAP(L) lhs,\n                                        const DOCTEST_REF_WRAP(R) rhs) {\n        bool failed = !RelationalComparator<comparison, L, R>()(lhs, rhs);\n\n        // ###################################################################################\n        // IF THE DEBUGGER BREAKS HERE - GO 1 LEVEL UP IN THE CALLSTACK FOR THE FAILING ASSERT\n        // THIS IS THE EFFECT OF HAVING 'DOCTEST_CONFIG_SUPER_FAST_ASSERTS' DEFINED\n        // ###################################################################################\n        DOCTEST_ASSERT_OUT_OF_TESTS(stringifyBinaryExpr(lhs, \", \", rhs));\n        DOCTEST_ASSERT_IN_TESTS(stringifyBinaryExpr(lhs, \", \", rhs));\n    }\n\n    template <typename L>\n    DOCTEST_NOINLINE void unary_assert(assertType::Enum at, const char* file, int line,\n                                       const char* expr, const DOCTEST_REF_WRAP(L) val) {\n        bool failed = !val;\n\n        if(at & assertType::is_false) //!OCLINT bitwise operator in conditional\n            failed = !failed;\n\n        // ###################################################################################\n        // IF THE DEBUGGER BREAKS HERE - GO 1 LEVEL UP IN THE CALLSTACK FOR THE FAILING ASSERT\n        // THIS IS THE EFFECT OF HAVING 'DOCTEST_CONFIG_SUPER_FAST_ASSERTS' DEFINED\n        // ###################################################################################\n        DOCTEST_ASSERT_OUT_OF_TESTS(toString(val));\n        DOCTEST_ASSERT_IN_TESTS(toString(val));\n    }\n\n    struct DOCTEST_INTERFACE IExceptionTranslator\n    {\n        IExceptionTranslator();\n        virtual ~IExceptionTranslator();\n        virtual bool translate(String&) const = 0;\n    };\n\n    template <typename T>\n    class ExceptionTranslator : public IExceptionTranslator //!OCLINT destructor of virtual class\n    {\n    public:\n        explicit ExceptionTranslator(String (*translateFunction)(T))\n                : m_translateFunction(translateFunction) {}\n\n        bool translate(String& res) const override {\n#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS\n            try {\n                throw; // lgtm [cpp/rethrow-no-exception]\n                // cppcheck-suppress catchExceptionByValue\n            } catch(T ex) {                    // NOLINT\n                res = m_translateFunction(ex); //!OCLINT parameter reassignment\n                return true;\n            } catch(...) {} //!OCLINT -  empty catch statement\n#endif                      // DOCTEST_CONFIG_NO_EXCEPTIONS\n            ((void)res);    // to silence -Wunused-parameter\n            return false;\n        }\n\n    private:\n        String (*m_translateFunction)(T);\n    };\n\n    DOCTEST_INTERFACE void registerExceptionTranslatorImpl(const IExceptionTranslator* et);\n\n    template <bool C>\n    struct StringStreamBase\n    {\n        template <typename T>\n        static void convert(std::ostream* s, const T& in) {\n            *s << toString(in);\n        }\n\n        // always treat char* as a string in this context - no matter\n        // if DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING is defined\n        static void convert(std::ostream* s, const char* in) { *s << String(in); }\n    };\n\n    template <>\n    struct StringStreamBase<true>\n    {\n        template <typename T>\n        static void convert(std::ostream* s, const T& in) {\n            *s << in;\n        }\n    };\n\n    template <typename T>\n    struct StringStream : public StringStreamBase<has_insertion_operator<T>::value>\n    {};\n\n    template <typename T>\n    void toStream(std::ostream* s, const T& value) {\n        StringStream<T>::convert(s, value);\n    }\n\n#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING\n    DOCTEST_INTERFACE void toStream(std::ostream* s, char* in);\n    DOCTEST_INTERFACE void toStream(std::ostream* s, const char* in);\n#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING\n    DOCTEST_INTERFACE void toStream(std::ostream* s, bool in);\n    DOCTEST_INTERFACE void toStream(std::ostream* s, float in);\n    DOCTEST_INTERFACE void toStream(std::ostream* s, double in);\n    DOCTEST_INTERFACE void toStream(std::ostream* s, double long in);\n\n    DOCTEST_INTERFACE void toStream(std::ostream* s, char in);\n    DOCTEST_INTERFACE void toStream(std::ostream* s, char signed in);\n    DOCTEST_INTERFACE void toStream(std::ostream* s, char unsigned in);\n    DOCTEST_INTERFACE void toStream(std::ostream* s, int short in);\n    DOCTEST_INTERFACE void toStream(std::ostream* s, int short unsigned in);\n    DOCTEST_INTERFACE void toStream(std::ostream* s, int in);\n    DOCTEST_INTERFACE void toStream(std::ostream* s, int unsigned in);\n    DOCTEST_INTERFACE void toStream(std::ostream* s, int long in);\n    DOCTEST_INTERFACE void toStream(std::ostream* s, int long unsigned in);\n    DOCTEST_INTERFACE void toStream(std::ostream* s, int long long in);\n    DOCTEST_INTERFACE void toStream(std::ostream* s, int long long unsigned in);\n\n    // ContextScope base class used to allow implementing methods of ContextScope\n    // that don't depend on the template parameter in doctest.cpp.\n    class DOCTEST_INTERFACE ContextScopeBase : public IContextScope {\n    protected:\n        ContextScopeBase();\n\n        void destroy();\n    };\n\n    template <typename L> class DOCTEST_INTERFACE ContextScope : public ContextScopeBase\n    {\n        const L &lambda_;\n\n    public:\n        explicit ContextScope(const L &lambda) : lambda_(lambda) {}\n\n        ContextScope(ContextScope &&other) : lambda_(other.lambda_) {}\n\n        void stringify(std::ostream* s) const override { lambda_(s); }\n\n        ~ContextScope() override { destroy(); }\n    };\n\n    struct DOCTEST_INTERFACE MessageBuilder : public MessageData\n    {\n        std::ostream* m_stream;\n\n        MessageBuilder(const char* file, int line, assertType::Enum severity);\n        MessageBuilder() = delete;\n        ~MessageBuilder();\n\n        template <typename T>\n        MessageBuilder& operator<<(const T& in) {\n            toStream(m_stream, in);\n            return *this;\n        }\n\n        bool log();\n        void react();\n    };\n\n    template <typename L>\n    ContextScope<L> MakeContextScope(const L &lambda) {\n        return ContextScope<L>(lambda);\n    }\n} // namespace detail\n\n#define DOCTEST_DEFINE_DECORATOR(name, type, def)                                                  \\\n    struct name                                                                                    \\\n    {                                                                                              \\\n        type data;                                                                                 \\\n        name(type in = def)                                                                        \\\n                : data(in) {}                                                                      \\\n        void fill(detail::TestCase& state) const { state.DOCTEST_CAT(m_, name) = data; }           \\\n        void fill(detail::TestSuite& state) const { state.DOCTEST_CAT(m_, name) = data; }          \\\n    }\n\nDOCTEST_DEFINE_DECORATOR(test_suite, const char*, \"\");\nDOCTEST_DEFINE_DECORATOR(description, const char*, \"\");\nDOCTEST_DEFINE_DECORATOR(skip, bool, true);\nDOCTEST_DEFINE_DECORATOR(timeout, double, 0);\nDOCTEST_DEFINE_DECORATOR(may_fail, bool, true);\nDOCTEST_DEFINE_DECORATOR(should_fail, bool, true);\nDOCTEST_DEFINE_DECORATOR(expected_failures, int, 0);\n\ntemplate <typename T>\nint registerExceptionTranslator(String (*translateFunction)(T)) {\n    DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(\"-Wexit-time-destructors\")\n    static detail::ExceptionTranslator<T> exceptionTranslator(translateFunction);\n    DOCTEST_CLANG_SUPPRESS_WARNING_POP\n    detail::registerExceptionTranslatorImpl(&exceptionTranslator);\n    return 0;\n}\n\n} // namespace doctest\n\n// in a separate namespace outside of doctest because the DOCTEST_TEST_SUITE macro\n// introduces an anonymous namespace in which getCurrentTestSuite gets overridden\nnamespace doctest_detail_test_suite_ns {\nDOCTEST_INTERFACE doctest::detail::TestSuite& getCurrentTestSuite();\n} // namespace doctest_detail_test_suite_ns\n\nnamespace doctest {\n#else  // DOCTEST_CONFIG_DISABLE\ntemplate <typename T>\nint registerExceptionTranslator(String (*)(T)) {\n    return 0;\n}\n#endif // DOCTEST_CONFIG_DISABLE\n\nnamespace detail {\n    typedef void (*assert_handler)(const AssertData&);\n    struct ContextState;\n} // namespace detail\n\nclass DOCTEST_INTERFACE Context\n{\n    detail::ContextState* p;\n\n    void parseArgs(int argc, const char* const* argv, bool withDefaults = false);\n\npublic:\n    explicit Context(int argc = 0, const char* const* argv = nullptr);\n\n    ~Context();\n\n    void applyCommandLine(int argc, const char* const* argv);\n\n    void addFilter(const char* filter, const char* value);\n    void clearFilters();\n    void setOption(const char* option, int value);\n    void setOption(const char* option, const char* value);\n\n    bool shouldExit();\n\n    void setAsDefaultForAssertsOutOfTestCases();\n\n    void setAssertHandler(detail::assert_handler ah);\n\n    int run();\n};\n\nnamespace TestCaseFailureReason {\n    enum Enum\n    {\n        None                     = 0,\n        AssertFailure            = 1,   // an assertion has failed in the test case\n        Exception                = 2,   // test case threw an exception\n        Crash                    = 4,   // a crash...\n        TooManyFailedAsserts     = 8,   // the abort-after option\n        Timeout                  = 16,  // see the timeout decorator\n        ShouldHaveFailedButDidnt = 32,  // see the should_fail decorator\n        ShouldHaveFailedAndDid   = 64,  // see the should_fail decorator\n        DidntFailExactlyNumTimes = 128, // see the expected_failures decorator\n        FailedExactlyNumTimes    = 256, // see the expected_failures decorator\n        CouldHaveFailedAndDid    = 512  // see the may_fail decorator\n    };\n} // namespace TestCaseFailureReason\n\nstruct DOCTEST_INTERFACE CurrentTestCaseStats\n{\n    int    numAssertsCurrentTest;\n    int    numAssertsFailedCurrentTest;\n    double seconds;\n    int    failure_flags; // use TestCaseFailureReason::Enum\n};\n\nstruct DOCTEST_INTERFACE TestCaseException\n{\n    String error_string;\n    bool   is_crash;\n};\n\nstruct DOCTEST_INTERFACE TestRunStats\n{\n    unsigned numTestCases;\n    unsigned numTestCasesPassingFilters;\n    unsigned numTestSuitesPassingFilters;\n    unsigned numTestCasesFailed;\n    int      numAsserts;\n    int      numAssertsFailed;\n};\n\nstruct QueryData\n{\n    const TestRunStats* run_stats = nullptr;\n    String*             data      = nullptr;\n    unsigned            num_data  = 0;\n};\n\nstruct DOCTEST_INTERFACE IReporter\n{\n    // The constructor has to accept \"const ContextOptions&\" as a single argument\n    // which has most of the options for the run + a pointer to the stdout stream\n    // Reporter(const ContextOptions& in)\n\n    // called when a query should be reported (listing test cases, printing the version, etc.)\n    virtual void report_query(const QueryData&) = 0;\n\n    // called when the whole test run starts\n    virtual void test_run_start() = 0;\n    // called when the whole test run ends (caching a pointer to the input doesn't make sense here)\n    virtual void test_run_end(const TestRunStats&) = 0;\n\n    // called when a test case is started (safe to cache a pointer to the input)\n    virtual void test_case_start(const TestCaseData&) = 0;\n    // called when a test case is reentered because of unfinished subcases (safe to cache a pointer to the input)\n    virtual void test_case_reenter(const TestCaseData&) = 0;\n    // called when a test case has ended\n    virtual void test_case_end(const CurrentTestCaseStats&) = 0;\n\n    // called when an exception is thrown from the test case (or it crashes)\n    virtual void test_case_exception(const TestCaseException&) = 0;\n\n    // called whenever a subcase is entered (don't cache pointers to the input)\n    virtual void subcase_start(const SubcaseSignature&) = 0;\n    // called whenever a subcase is exited (don't cache pointers to the input)\n    virtual void subcase_end() = 0;\n\n    // called for each assert (don't cache pointers to the input)\n    virtual void log_assert(const AssertData&) = 0;\n    // called for each message (don't cache pointers to the input)\n    virtual void log_message(const MessageData&) = 0;\n\n    // called when a test case is skipped either because it doesn't pass the filters, has a skip decorator\n    // or isn't in the execution range (between first and last) (safe to cache a pointer to the input)\n    virtual void test_case_skipped(const TestCaseData&) = 0;\n\n    // doctest will not be managing the lifetimes of reporters given to it but this would still be nice to have\n    virtual ~IReporter();\n\n    // can obtain all currently active contexts and stringify them if one wishes to do so\n    static int                         get_num_active_contexts();\n    static const IContextScope* const* get_active_contexts();\n\n    // can iterate through contexts which have been stringified automatically in their destructors when an exception has been thrown\n    static int           get_num_stringified_contexts();\n    static const String* get_stringified_contexts();\n};\n\nnamespace detail {\n    typedef IReporter* (*reporterCreatorFunc)(const ContextOptions&);\n\n    DOCTEST_INTERFACE void registerReporterImpl(const char* name, int prio, reporterCreatorFunc c, bool isReporter);\n\n    template <typename Reporter>\n    IReporter* reporterCreator(const ContextOptions& o) {\n        return new Reporter(o);\n    }\n} // namespace detail\n\ntemplate <typename Reporter>\nint registerReporter(const char* name, int priority, bool isReporter) {\n    detail::registerReporterImpl(name, priority, detail::reporterCreator<Reporter>, isReporter);\n    return 0;\n}\n} // namespace doctest\n\n// if registering is not disabled\n#if !defined(DOCTEST_CONFIG_DISABLE)\n\n// common code in asserts - for convenience\n#define DOCTEST_ASSERT_LOG_AND_REACT(b)                                                            \\\n    if(b.log())                                                                                    \\\n        DOCTEST_BREAK_INTO_DEBUGGER();                                                             \\\n    b.react()\n\n#ifdef DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS\n#define DOCTEST_WRAP_IN_TRY(x) x;\n#else // DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS\n#define DOCTEST_WRAP_IN_TRY(x)                                                                     \\\n    try {                                                                                          \\\n        x;                                                                                         \\\n    } catch(...) { _DOCTEST_RB.translateException(); }\n#endif // DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS\n\n#ifdef DOCTEST_CONFIG_VOID_CAST_EXPRESSIONS\n#define DOCTEST_CAST_TO_VOID(x)                                                                    \\\n    DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(\"-Wuseless-cast\")                                       \\\n    static_cast<void>(x);                                                                          \\\n    DOCTEST_GCC_SUPPRESS_WARNING_POP\n#else // DOCTEST_CONFIG_VOID_CAST_EXPRESSIONS\n#define DOCTEST_CAST_TO_VOID(x) x;\n#endif // DOCTEST_CONFIG_VOID_CAST_EXPRESSIONS\n\n// registers the test by initializing a dummy var with a function\n#define DOCTEST_REGISTER_FUNCTION(global_prefix, f, decorators)                                    \\\n    global_prefix DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_VAR_)) =              \\\n            doctest::detail::regTest(                                                              \\\n                    doctest::detail::TestCase(                                                     \\\n                            f, __FILE__, __LINE__,                                                 \\\n                            doctest_detail_test_suite_ns::getCurrentTestSuite()) *                 \\\n                    decorators);                                                                   \\\n    DOCTEST_GLOBAL_NO_WARNINGS_END()\n\n#define DOCTEST_IMPLEMENT_FIXTURE(der, base, func, decorators)                                     \\\n    namespace {                                                                                    \\\n        struct der : public base                                                                   \\\n        {                                                                                          \\\n            void f();                                                                              \\\n        };                                                                                         \\\n        static void func() {                                                                       \\\n            der v;                                                                                 \\\n            v.f();                                                                                 \\\n        }                                                                                          \\\n        DOCTEST_REGISTER_FUNCTION(DOCTEST_EMPTY, func, decorators)                                 \\\n    }                                                                                              \\\n    inline DOCTEST_NOINLINE void der::f()\n\n#define DOCTEST_CREATE_AND_REGISTER_FUNCTION(f, decorators)                                        \\\n    static void f();                                                                               \\\n    DOCTEST_REGISTER_FUNCTION(DOCTEST_EMPTY, f, decorators)                                        \\\n    static void f()\n\n#define DOCTEST_CREATE_AND_REGISTER_FUNCTION_IN_CLASS(f, proxy, decorators)                        \\\n    static doctest::detail::funcType proxy() { return f; }                                         \\\n    DOCTEST_REGISTER_FUNCTION(inline const, proxy(), decorators)                                   \\\n    static void f()\n\n// for registering tests\n#define DOCTEST_TEST_CASE(decorators)                                                              \\\n    DOCTEST_CREATE_AND_REGISTER_FUNCTION(DOCTEST_ANONYMOUS(_DOCTEST_ANON_FUNC_), decorators)\n\n// for registering tests in classes - requires C++17 for inline variables!\n#if __cplusplus >= 201703L || (DOCTEST_MSVC >= DOCTEST_COMPILER(19, 12, 0) && _MSVC_LANG >= 201703L)\n#define DOCTEST_TEST_CASE_CLASS(decorators)                                                        \\\n    DOCTEST_CREATE_AND_REGISTER_FUNCTION_IN_CLASS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_FUNC_),          \\\n                                                  DOCTEST_ANONYMOUS(_DOCTEST_ANON_PROXY_),         \\\n                                                  decorators)\n#else // DOCTEST_TEST_CASE_CLASS\n#define DOCTEST_TEST_CASE_CLASS(...)                                                               \\\n    TEST_CASES_CAN_BE_REGISTERED_IN_CLASSES_ONLY_IN_CPP17_MODE_OR_WITH_VS_2017_OR_NEWER\n#endif // DOCTEST_TEST_CASE_CLASS\n\n// for registering tests with a fixture\n#define DOCTEST_TEST_CASE_FIXTURE(c, decorators)                                                   \\\n    DOCTEST_IMPLEMENT_FIXTURE(DOCTEST_ANONYMOUS(_DOCTEST_ANON_CLASS_), c,                          \\\n                              DOCTEST_ANONYMOUS(_DOCTEST_ANON_FUNC_), decorators)\n\n// for converting types to strings without the <typeinfo> header and demangling\n#define DOCTEST_TYPE_TO_STRING_IMPL(...)                                                           \\\n    template <>                                                                                    \\\n    inline const char* type_to_string<__VA_ARGS__>() {                                             \\\n        return \"<\" #__VA_ARGS__ \">\";                                                               \\\n    }\n#define DOCTEST_TYPE_TO_STRING(...)                                                                \\\n    namespace doctest { namespace detail {                                                         \\\n            DOCTEST_TYPE_TO_STRING_IMPL(__VA_ARGS__)                                               \\\n        }                                                                                          \\\n    }                                                                                              \\\n    typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)\n\n#define DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL(dec, T, iter, func)                                 \\\n    template <typename T>                                                                          \\\n    static void func();                                                                            \\\n    namespace {                                                                                    \\\n        template <typename Tuple>                                                                  \\\n        struct iter;                                                                               \\\n        template <typename Type, typename... Rest>                                                 \\\n        struct iter<std::tuple<Type, Rest...>>                                                     \\\n        {                                                                                          \\\n            iter(const char* file, unsigned line, int index) {                                     \\\n                doctest::detail::regTest(doctest::detail::TestCase(func<Type>, file, line,         \\\n                                            doctest_detail_test_suite_ns::getCurrentTestSuite(),   \\\n                                            doctest::detail::type_to_string<Type>(),               \\\n                                            int(line) * 1000 + index)                              \\\n                                         * dec);                                                   \\\n                iter<std::tuple<Rest...>>(file, line, index + 1);                                  \\\n            }                                                                                      \\\n        };                                                                                         \\\n        template <>                                                                                \\\n        struct iter<std::tuple<>>                                                                  \\\n        {                                                                                          \\\n            iter(const char*, unsigned, int) {}                                                    \\\n        };                                                                                         \\\n    }                                                                                              \\\n    template <typename T>                                                                          \\\n    static void func()\n\n#define DOCTEST_TEST_CASE_TEMPLATE_DEFINE(dec, T, id)                                              \\\n    DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL(dec, T, DOCTEST_CAT(id, ITERATOR),                      \\\n                                           DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_))\n\n#define DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(id, anon, ...)                                 \\\n    DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_CAT(anon, DUMMY)) =                                         \\\n        doctest::detail::instantiationHelper(DOCTEST_CAT(id, ITERATOR)<__VA_ARGS__>(__FILE__, __LINE__, 0));\\\n    DOCTEST_GLOBAL_NO_WARNINGS_END()\n\n#define DOCTEST_TEST_CASE_TEMPLATE_INVOKE(id, ...)                                                 \\\n    DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(id, DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_), std::tuple<__VA_ARGS__>) \\\n    typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)\n\n#define DOCTEST_TEST_CASE_TEMPLATE_APPLY(id, ...)                                                  \\\n    DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(id, DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_), __VA_ARGS__) \\\n    typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)\n\n#define DOCTEST_TEST_CASE_TEMPLATE_IMPL(dec, T, anon, ...)                                         \\\n    DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL(dec, T, DOCTEST_CAT(anon, ITERATOR), anon);             \\\n    DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(anon, anon, std::tuple<__VA_ARGS__>)               \\\n    template <typename T>                                                                          \\\n    static void anon()\n\n#define DOCTEST_TEST_CASE_TEMPLATE(dec, T, ...)                                                    \\\n    DOCTEST_TEST_CASE_TEMPLATE_IMPL(dec, T, DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_), __VA_ARGS__)\n\n// for subcases\n#define DOCTEST_SUBCASE(name)                                                                      \\\n    if(const doctest::detail::Subcase & DOCTEST_ANONYMOUS(_DOCTEST_ANON_SUBCASE_) DOCTEST_UNUSED = \\\n               doctest::detail::Subcase(name, __FILE__, __LINE__))\n\n// for grouping tests in test suites by using code blocks\n#define DOCTEST_TEST_SUITE_IMPL(decorators, ns_name)                                               \\\n    namespace ns_name { namespace doctest_detail_test_suite_ns {                                   \\\n            static DOCTEST_NOINLINE doctest::detail::TestSuite& getCurrentTestSuite() {            \\\n                DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4640)                                      \\\n                DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(\"-Wexit-time-destructors\")                \\\n                static doctest::detail::TestSuite data;                                            \\\n                static bool                       inited = false;                                  \\\n                DOCTEST_MSVC_SUPPRESS_WARNING_POP                                                  \\\n                DOCTEST_CLANG_SUPPRESS_WARNING_POP                                                 \\\n                if(!inited) {                                                                      \\\n                    data* decorators;                                                              \\\n                    inited = true;                                                                 \\\n                }                                                                                  \\\n                return data;                                                                       \\\n            }                                                                                      \\\n        }                                                                                          \\\n    }                                                                                              \\\n    namespace ns_name\n\n#define DOCTEST_TEST_SUITE(decorators)                                                             \\\n    DOCTEST_TEST_SUITE_IMPL(decorators, DOCTEST_ANONYMOUS(_DOCTEST_ANON_SUITE_))\n\n// for starting a testsuite block\n#define DOCTEST_TEST_SUITE_BEGIN(decorators)                                                       \\\n    DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_VAR_)) =                            \\\n            doctest::detail::setTestSuite(doctest::detail::TestSuite() * decorators);              \\\n    DOCTEST_GLOBAL_NO_WARNINGS_END()                                                               \\\n    typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)\n\n// for ending a testsuite block\n#define DOCTEST_TEST_SUITE_END                                                                     \\\n    DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_VAR_)) =                            \\\n            doctest::detail::setTestSuite(doctest::detail::TestSuite() * \"\");                      \\\n    DOCTEST_GLOBAL_NO_WARNINGS_END()                                                               \\\n    typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)\n\n// for registering exception translators\n#define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR_IMPL(translatorName, signature)                      \\\n    inline doctest::String translatorName(signature);                                              \\\n    DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_TRANSLATOR_)) =                     \\\n            doctest::registerExceptionTranslator(translatorName);                                  \\\n    DOCTEST_GLOBAL_NO_WARNINGS_END()                                                               \\\n    doctest::String translatorName(signature)\n\n#define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR(signature)                                           \\\n    DOCTEST_REGISTER_EXCEPTION_TRANSLATOR_IMPL(DOCTEST_ANONYMOUS(_DOCTEST_ANON_TRANSLATOR_),       \\\n                                               signature)\n\n// for registering reporters\n#define DOCTEST_REGISTER_REPORTER(name, priority, reporter)                                        \\\n    DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_REPORTER_)) =                       \\\n            doctest::registerReporter<reporter>(name, priority, true);                             \\\n    DOCTEST_GLOBAL_NO_WARNINGS_END() typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)\n\n// for registering listeners\n#define DOCTEST_REGISTER_LISTENER(name, priority, reporter)                                        \\\n    DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_REPORTER_)) =                       \\\n            doctest::registerReporter<reporter>(name, priority, false);                            \\\n    DOCTEST_GLOBAL_NO_WARNINGS_END() typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)\n\n// for logging\n#define DOCTEST_INFO(expression)                                                                   \\\n    DOCTEST_INFO_IMPL(DOCTEST_ANONYMOUS(_DOCTEST_CAPTURE_), DOCTEST_ANONYMOUS(_DOCTEST_CAPTURE_),  \\\n                      DOCTEST_ANONYMOUS(_DOCTEST_CAPTURE_), expression)\n\n#define DOCTEST_INFO_IMPL(lambda_name, mb_name, s_name, expression)                                \\\n    DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4626)                                                  \\\n    auto lambda_name = [&](std::ostream* s_name) {                                                 \\\n        doctest::detail::MessageBuilder mb_name(__FILE__, __LINE__, doctest::assertType::is_warn); \\\n        mb_name.m_stream = s_name;                                                                 \\\n        mb_name << expression;                                                                     \\\n    };                                                                                             \\\n    DOCTEST_MSVC_SUPPRESS_WARNING_POP                                                              \\\n    auto DOCTEST_ANONYMOUS(_DOCTEST_CAPTURE_) = doctest::detail::MakeContextScope(lambda_name)\n\n#define DOCTEST_CAPTURE(x) DOCTEST_INFO(#x \" := \" << x)\n\n#define DOCTEST_ADD_AT_IMPL(type, file, line, mb, x)                                               \\\n    do {                                                                                           \\\n        doctest::detail::MessageBuilder mb(file, line, doctest::assertType::type);                 \\\n        mb << x;                                                                                   \\\n        DOCTEST_ASSERT_LOG_AND_REACT(mb);                                                          \\\n    } while((void)0, 0)\n\n// clang-format off\n#define DOCTEST_ADD_MESSAGE_AT(file, line, x) DOCTEST_ADD_AT_IMPL(is_warn, file, line, DOCTEST_ANONYMOUS(_DOCTEST_MESSAGE_), x)\n#define DOCTEST_ADD_FAIL_CHECK_AT(file, line, x) DOCTEST_ADD_AT_IMPL(is_check, file, line, DOCTEST_ANONYMOUS(_DOCTEST_MESSAGE_), x)\n#define DOCTEST_ADD_FAIL_AT(file, line, x) DOCTEST_ADD_AT_IMPL(is_require, file, line, DOCTEST_ANONYMOUS(_DOCTEST_MESSAGE_), x)\n// clang-format on\n\n#define DOCTEST_MESSAGE(x) DOCTEST_ADD_MESSAGE_AT(__FILE__, __LINE__, x)\n#define DOCTEST_FAIL_CHECK(x) DOCTEST_ADD_FAIL_CHECK_AT(__FILE__, __LINE__, x)\n#define DOCTEST_FAIL(x) DOCTEST_ADD_FAIL_AT(__FILE__, __LINE__, x)\n\n#define DOCTEST_TO_LVALUE(...) __VA_ARGS__ // Not removed to keep backwards compatibility.\n\n#ifndef DOCTEST_CONFIG_SUPER_FAST_ASSERTS\n\n#define DOCTEST_ASSERT_IMPLEMENT_2(assert_type, ...)                                               \\\n    DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(\"-Woverloaded-shift-op-parentheses\")                  \\\n    doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__,         \\\n                                               __LINE__, #__VA_ARGS__);                            \\\n    DOCTEST_WRAP_IN_TRY(_DOCTEST_RB.setResult(                                                     \\\n            doctest::detail::ExpressionDecomposer(doctest::assertType::assert_type)                \\\n            << __VA_ARGS__))                                                                       \\\n    DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB)                                                      \\\n    DOCTEST_CLANG_SUPPRESS_WARNING_POP\n\n#define DOCTEST_ASSERT_IMPLEMENT_1(assert_type, ...)                                               \\\n    do {                                                                                           \\\n        DOCTEST_ASSERT_IMPLEMENT_2(assert_type, __VA_ARGS__);                                      \\\n    } while((void)0, 0)\n\n#else // DOCTEST_CONFIG_SUPER_FAST_ASSERTS\n\n// necessary for <ASSERT>_MESSAGE\n#define DOCTEST_ASSERT_IMPLEMENT_2 DOCTEST_ASSERT_IMPLEMENT_1\n\n#define DOCTEST_ASSERT_IMPLEMENT_1(assert_type, ...)                                               \\\n    DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(\"-Woverloaded-shift-op-parentheses\")                  \\\n    doctest::detail::decomp_assert(                                                                \\\n            doctest::assertType::assert_type, __FILE__, __LINE__, #__VA_ARGS__,                    \\\n            doctest::detail::ExpressionDecomposer(doctest::assertType::assert_type)                \\\n                    << __VA_ARGS__) DOCTEST_CLANG_SUPPRESS_WARNING_POP\n\n#endif // DOCTEST_CONFIG_SUPER_FAST_ASSERTS\n\n#define DOCTEST_WARN(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_WARN, __VA_ARGS__)\n#define DOCTEST_CHECK(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_CHECK, __VA_ARGS__)\n#define DOCTEST_REQUIRE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_REQUIRE, __VA_ARGS__)\n#define DOCTEST_WARN_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_WARN_FALSE, __VA_ARGS__)\n#define DOCTEST_CHECK_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_CHECK_FALSE, __VA_ARGS__)\n#define DOCTEST_REQUIRE_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_REQUIRE_FALSE, __VA_ARGS__)\n\n// clang-format off\n#define DOCTEST_WARN_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN, cond); } while((void)0, 0)\n#define DOCTEST_CHECK_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK, cond); } while((void)0, 0)\n#define DOCTEST_REQUIRE_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE, cond); } while((void)0, 0)\n#define DOCTEST_WARN_FALSE_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN_FALSE, cond); } while((void)0, 0)\n#define DOCTEST_CHECK_FALSE_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK_FALSE, cond); } while((void)0, 0)\n#define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE_FALSE, cond); } while((void)0, 0)\n// clang-format on\n\n#define DOCTEST_ASSERT_THROWS_AS(expr, assert_type, message, ...)                                  \\\n    do {                                                                                           \\\n        if(!doctest::getContextOptions()->no_throw) {                                              \\\n            doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \\\n                                                       __LINE__, #expr, #__VA_ARGS__, message);    \\\n            try {                                                                                  \\\n                DOCTEST_CAST_TO_VOID(expr)                                                         \\\n            } catch(const doctest::detail::remove_const<                                           \\\n                    doctest::detail::remove_reference<__VA_ARGS__>::type>::type&) {                \\\n                _DOCTEST_RB.translateException();                                                  \\\n                _DOCTEST_RB.m_threw_as = true;                                                     \\\n            } catch(...) { _DOCTEST_RB.translateException(); }                                     \\\n            DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB);                                             \\\n        }                                                                                          \\\n    } while((void)0, 0)\n\n#define DOCTEST_ASSERT_THROWS_WITH(expr, assert_type, ...)                                         \\\n    do {                                                                                           \\\n        if(!doctest::getContextOptions()->no_throw) {                                              \\\n            doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \\\n                                                       __LINE__, #expr, \"\", __VA_ARGS__);          \\\n            try {                                                                                  \\\n                DOCTEST_CAST_TO_VOID(expr)                                                         \\\n            } catch(...) { _DOCTEST_RB.translateException(); }                                     \\\n            DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB);                                             \\\n        }                                                                                          \\\n    } while((void)0, 0)\n\n#define DOCTEST_ASSERT_NOTHROW(expr, assert_type)                                                  \\\n    do {                                                                                           \\\n        doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__,     \\\n                                                   __LINE__, #expr);                               \\\n        try {                                                                                      \\\n            DOCTEST_CAST_TO_VOID(expr)                                                             \\\n        } catch(...) { _DOCTEST_RB.translateException(); }                                         \\\n        DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB);                                                 \\\n    } while((void)0, 0)\n\n// clang-format off\n#define DOCTEST_WARN_THROWS(expr) DOCTEST_ASSERT_THROWS_WITH(expr, DT_WARN_THROWS, \"\")\n#define DOCTEST_CHECK_THROWS(expr) DOCTEST_ASSERT_THROWS_WITH(expr, DT_CHECK_THROWS, \"\")\n#define DOCTEST_REQUIRE_THROWS(expr) DOCTEST_ASSERT_THROWS_WITH(expr, DT_REQUIRE_THROWS, \"\")\n\n#define DOCTEST_WARN_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_WARN_THROWS_AS, \"\", __VA_ARGS__)\n#define DOCTEST_CHECK_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_CHECK_THROWS_AS, \"\", __VA_ARGS__)\n#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_REQUIRE_THROWS_AS, \"\", __VA_ARGS__)\n\n#define DOCTEST_WARN_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, DT_WARN_THROWS_WITH, __VA_ARGS__)\n#define DOCTEST_CHECK_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, DT_CHECK_THROWS_WITH, __VA_ARGS__)\n#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, DT_REQUIRE_THROWS_WITH, __VA_ARGS__)\n\n#define DOCTEST_WARN_THROWS_WITH_AS(expr, message, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_WARN_THROWS_WITH_AS, message, __VA_ARGS__)\n#define DOCTEST_CHECK_THROWS_WITH_AS(expr, message, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_CHECK_THROWS_WITH_AS, message, __VA_ARGS__)\n#define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, message, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_REQUIRE_THROWS_WITH_AS, message, __VA_ARGS__)\n\n#define DOCTEST_WARN_NOTHROW(expr) DOCTEST_ASSERT_NOTHROW(expr, DT_WARN_NOTHROW)\n#define DOCTEST_CHECK_NOTHROW(expr) DOCTEST_ASSERT_NOTHROW(expr, DT_CHECK_NOTHROW)\n#define DOCTEST_REQUIRE_NOTHROW(expr) DOCTEST_ASSERT_NOTHROW(expr, DT_REQUIRE_NOTHROW)\n\n#define DOCTEST_WARN_THROWS_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_WARN_THROWS(expr); } while((void)0, 0)\n#define DOCTEST_CHECK_THROWS_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_CHECK_THROWS(expr); } while((void)0, 0)\n#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_REQUIRE_THROWS(expr); } while((void)0, 0)\n#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_WARN_THROWS_AS(expr, ex); } while((void)0, 0)\n#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_CHECK_THROWS_AS(expr, ex); } while((void)0, 0)\n#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_REQUIRE_THROWS_AS(expr, ex); } while((void)0, 0)\n#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, msg) do { DOCTEST_INFO(msg); DOCTEST_WARN_THROWS_WITH(expr, with); } while((void)0, 0)\n#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, msg) do { DOCTEST_INFO(msg); DOCTEST_CHECK_THROWS_WITH(expr, with); } while((void)0, 0)\n#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, msg) do { DOCTEST_INFO(msg); DOCTEST_REQUIRE_THROWS_WITH(expr, with); } while((void)0, 0)\n#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_WARN_THROWS_WITH_AS(expr, with, ex); } while((void)0, 0)\n#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ex); } while((void)0, 0)\n#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ex); } while((void)0, 0)\n#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_WARN_NOTHROW(expr); } while((void)0, 0)\n#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_CHECK_NOTHROW(expr); } while((void)0, 0)\n#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_REQUIRE_NOTHROW(expr); } while((void)0, 0)\n// clang-format on\n\n#ifndef DOCTEST_CONFIG_SUPER_FAST_ASSERTS\n\n#define DOCTEST_BINARY_ASSERT(assert_type, comp, ...)                                              \\\n    do {                                                                                           \\\n        doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__,     \\\n                                                   __LINE__, #__VA_ARGS__);                        \\\n        DOCTEST_WRAP_IN_TRY(                                                                       \\\n                _DOCTEST_RB.binary_assert<doctest::detail::binaryAssertComparison::comp>(          \\\n                        __VA_ARGS__))                                                              \\\n        DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB);                                                 \\\n    } while((void)0, 0)\n\n#define DOCTEST_UNARY_ASSERT(assert_type, ...)                                                     \\\n    do {                                                                                           \\\n        doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__,     \\\n                                                   __LINE__, #__VA_ARGS__);                        \\\n        DOCTEST_WRAP_IN_TRY(_DOCTEST_RB.unary_assert(__VA_ARGS__))                                 \\\n        DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB);                                                 \\\n    } while((void)0, 0)\n\n#else // DOCTEST_CONFIG_SUPER_FAST_ASSERTS\n\n#define DOCTEST_BINARY_ASSERT(assert_type, comparison, ...)                                        \\\n    doctest::detail::binary_assert<doctest::detail::binaryAssertComparison::comparison>(           \\\n            doctest::assertType::assert_type, __FILE__, __LINE__, #__VA_ARGS__, __VA_ARGS__)\n\n#define DOCTEST_UNARY_ASSERT(assert_type, ...)                                                     \\\n    doctest::detail::unary_assert(doctest::assertType::assert_type, __FILE__, __LINE__,            \\\n                                  #__VA_ARGS__, __VA_ARGS__)\n\n#endif // DOCTEST_CONFIG_SUPER_FAST_ASSERTS\n\n#define DOCTEST_WARN_EQ(...) DOCTEST_BINARY_ASSERT(DT_WARN_EQ, eq, __VA_ARGS__)\n#define DOCTEST_CHECK_EQ(...) DOCTEST_BINARY_ASSERT(DT_CHECK_EQ, eq, __VA_ARGS__)\n#define DOCTEST_REQUIRE_EQ(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_EQ, eq, __VA_ARGS__)\n#define DOCTEST_WARN_NE(...) DOCTEST_BINARY_ASSERT(DT_WARN_NE, ne, __VA_ARGS__)\n#define DOCTEST_CHECK_NE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_NE, ne, __VA_ARGS__)\n#define DOCTEST_REQUIRE_NE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_NE, ne, __VA_ARGS__)\n#define DOCTEST_WARN_GT(...) DOCTEST_BINARY_ASSERT(DT_WARN_GT, gt, __VA_ARGS__)\n#define DOCTEST_CHECK_GT(...) DOCTEST_BINARY_ASSERT(DT_CHECK_GT, gt, __VA_ARGS__)\n#define DOCTEST_REQUIRE_GT(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_GT, gt, __VA_ARGS__)\n#define DOCTEST_WARN_LT(...) DOCTEST_BINARY_ASSERT(DT_WARN_LT, lt, __VA_ARGS__)\n#define DOCTEST_CHECK_LT(...) DOCTEST_BINARY_ASSERT(DT_CHECK_LT, lt, __VA_ARGS__)\n#define DOCTEST_REQUIRE_LT(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_LT, lt, __VA_ARGS__)\n#define DOCTEST_WARN_GE(...) DOCTEST_BINARY_ASSERT(DT_WARN_GE, ge, __VA_ARGS__)\n#define DOCTEST_CHECK_GE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_GE, ge, __VA_ARGS__)\n#define DOCTEST_REQUIRE_GE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_GE, ge, __VA_ARGS__)\n#define DOCTEST_WARN_LE(...) DOCTEST_BINARY_ASSERT(DT_WARN_LE, le, __VA_ARGS__)\n#define DOCTEST_CHECK_LE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_LE, le, __VA_ARGS__)\n#define DOCTEST_REQUIRE_LE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_LE, le, __VA_ARGS__)\n\n#define DOCTEST_WARN_UNARY(...) DOCTEST_UNARY_ASSERT(DT_WARN_UNARY, __VA_ARGS__)\n#define DOCTEST_CHECK_UNARY(...) DOCTEST_UNARY_ASSERT(DT_CHECK_UNARY, __VA_ARGS__)\n#define DOCTEST_REQUIRE_UNARY(...) DOCTEST_UNARY_ASSERT(DT_REQUIRE_UNARY, __VA_ARGS__)\n#define DOCTEST_WARN_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_WARN_UNARY_FALSE, __VA_ARGS__)\n#define DOCTEST_CHECK_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_CHECK_UNARY_FALSE, __VA_ARGS__)\n#define DOCTEST_REQUIRE_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_REQUIRE_UNARY_FALSE, __VA_ARGS__)\n\n#ifdef DOCTEST_CONFIG_NO_EXCEPTIONS\n\n#undef DOCTEST_WARN_THROWS\n#undef DOCTEST_CHECK_THROWS\n#undef DOCTEST_REQUIRE_THROWS\n#undef DOCTEST_WARN_THROWS_AS\n#undef DOCTEST_CHECK_THROWS_AS\n#undef DOCTEST_REQUIRE_THROWS_AS\n#undef DOCTEST_WARN_THROWS_WITH\n#undef DOCTEST_CHECK_THROWS_WITH\n#undef DOCTEST_REQUIRE_THROWS_WITH\n#undef DOCTEST_WARN_THROWS_WITH_AS\n#undef DOCTEST_CHECK_THROWS_WITH_AS\n#undef DOCTEST_REQUIRE_THROWS_WITH_AS\n#undef DOCTEST_WARN_NOTHROW\n#undef DOCTEST_CHECK_NOTHROW\n#undef DOCTEST_REQUIRE_NOTHROW\n\n#undef DOCTEST_WARN_THROWS_MESSAGE\n#undef DOCTEST_CHECK_THROWS_MESSAGE\n#undef DOCTEST_REQUIRE_THROWS_MESSAGE\n#undef DOCTEST_WARN_THROWS_AS_MESSAGE\n#undef DOCTEST_CHECK_THROWS_AS_MESSAGE\n#undef DOCTEST_REQUIRE_THROWS_AS_MESSAGE\n#undef DOCTEST_WARN_THROWS_WITH_MESSAGE\n#undef DOCTEST_CHECK_THROWS_WITH_MESSAGE\n#undef DOCTEST_REQUIRE_THROWS_WITH_MESSAGE\n#undef DOCTEST_WARN_THROWS_WITH_AS_MESSAGE\n#undef DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE\n#undef DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE\n#undef DOCTEST_WARN_NOTHROW_MESSAGE\n#undef DOCTEST_CHECK_NOTHROW_MESSAGE\n#undef DOCTEST_REQUIRE_NOTHROW_MESSAGE\n\n#ifdef DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS\n\n#define DOCTEST_WARN_THROWS(expr) ((void)0)\n#define DOCTEST_CHECK_THROWS(expr) ((void)0)\n#define DOCTEST_REQUIRE_THROWS(expr) ((void)0)\n#define DOCTEST_WARN_THROWS_AS(expr, ...) ((void)0)\n#define DOCTEST_CHECK_THROWS_AS(expr, ...) ((void)0)\n#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) ((void)0)\n#define DOCTEST_WARN_THROWS_WITH(expr, ...) ((void)0)\n#define DOCTEST_CHECK_THROWS_WITH(expr, ...) ((void)0)\n#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) ((void)0)\n#define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ...) ((void)0)\n#define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ...) ((void)0)\n#define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ...) ((void)0)\n#define DOCTEST_WARN_NOTHROW(expr) ((void)0)\n#define DOCTEST_CHECK_NOTHROW(expr) ((void)0)\n#define DOCTEST_REQUIRE_NOTHROW(expr) ((void)0)\n\n#define DOCTEST_WARN_THROWS_MESSAGE(expr, msg) ((void)0)\n#define DOCTEST_CHECK_THROWS_MESSAGE(expr, msg) ((void)0)\n#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, msg) ((void)0)\n#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0)\n#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0)\n#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0)\n#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, msg) ((void)0)\n#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, msg) ((void)0)\n#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, msg) ((void)0)\n#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, msg) ((void)0)\n#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, msg) ((void)0)\n#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, msg) ((void)0)\n#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, msg) ((void)0)\n#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, msg) ((void)0)\n#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, msg) ((void)0)\n\n#else // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS\n\n#undef DOCTEST_REQUIRE\n#undef DOCTEST_REQUIRE_FALSE\n#undef DOCTEST_REQUIRE_MESSAGE\n#undef DOCTEST_REQUIRE_FALSE_MESSAGE\n#undef DOCTEST_REQUIRE_EQ\n#undef DOCTEST_REQUIRE_NE\n#undef DOCTEST_REQUIRE_GT\n#undef DOCTEST_REQUIRE_LT\n#undef DOCTEST_REQUIRE_GE\n#undef DOCTEST_REQUIRE_LE\n#undef DOCTEST_REQUIRE_UNARY\n#undef DOCTEST_REQUIRE_UNARY_FALSE\n\n#endif // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS\n\n#endif // DOCTEST_CONFIG_NO_EXCEPTIONS\n\n// =================================================================================================\n// == WHAT FOLLOWS IS VERSIONS OF THE MACROS THAT DO NOT DO ANY REGISTERING!                      ==\n// == THIS CAN BE ENABLED BY DEFINING DOCTEST_CONFIG_DISABLE GLOBALLY!                            ==\n// =================================================================================================\n#else // DOCTEST_CONFIG_DISABLE\n\n#define DOCTEST_IMPLEMENT_FIXTURE(der, base, func, name)                                           \\\n    namespace {                                                                                    \\\n        template <typename DOCTEST_UNUSED_TEMPLATE_TYPE>                                           \\\n        struct der : public base                                                                   \\\n        { void f(); };                                                                             \\\n    }                                                                                              \\\n    template <typename DOCTEST_UNUSED_TEMPLATE_TYPE>                                               \\\n    inline void der<DOCTEST_UNUSED_TEMPLATE_TYPE>::f()\n\n#define DOCTEST_CREATE_AND_REGISTER_FUNCTION(f, name)                                              \\\n    template <typename DOCTEST_UNUSED_TEMPLATE_TYPE>                                               \\\n    static inline void f()\n\n// for registering tests\n#define DOCTEST_TEST_CASE(name)                                                                    \\\n    DOCTEST_CREATE_AND_REGISTER_FUNCTION(DOCTEST_ANONYMOUS(_DOCTEST_ANON_FUNC_), name)\n\n// for registering tests in classes\n#define DOCTEST_TEST_CASE_CLASS(name)                                                              \\\n    DOCTEST_CREATE_AND_REGISTER_FUNCTION(DOCTEST_ANONYMOUS(_DOCTEST_ANON_FUNC_), name)\n\n// for registering tests with a fixture\n#define DOCTEST_TEST_CASE_FIXTURE(x, name)                                                         \\\n    DOCTEST_IMPLEMENT_FIXTURE(DOCTEST_ANONYMOUS(_DOCTEST_ANON_CLASS_), x,                          \\\n                              DOCTEST_ANONYMOUS(_DOCTEST_ANON_FUNC_), name)\n\n// for converting types to strings without the <typeinfo> header and demangling\n#define DOCTEST_TYPE_TO_STRING(...) typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)\n#define DOCTEST_TYPE_TO_STRING_IMPL(...)\n\n// for typed tests\n#define DOCTEST_TEST_CASE_TEMPLATE(name, type, ...)                                                \\\n    template <typename type>                                                                       \\\n    inline void DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_)()\n\n#define DOCTEST_TEST_CASE_TEMPLATE_DEFINE(name, type, id)                                          \\\n    template <typename type>                                                                       \\\n    inline void DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_)()\n\n#define DOCTEST_TEST_CASE_TEMPLATE_INVOKE(id, ...)                                                 \\\n    typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)\n\n#define DOCTEST_TEST_CASE_TEMPLATE_APPLY(id, ...)                                                  \\\n    typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)\n\n// for subcases\n#define DOCTEST_SUBCASE(name)\n\n// for a testsuite block\n#define DOCTEST_TEST_SUITE(name) namespace\n\n// for starting a testsuite block\n#define DOCTEST_TEST_SUITE_BEGIN(name) typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)\n\n// for ending a testsuite block\n#define DOCTEST_TEST_SUITE_END typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)\n\n#define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR(signature)                                           \\\n    template <typename DOCTEST_UNUSED_TEMPLATE_TYPE>                                               \\\n    static inline doctest::String DOCTEST_ANONYMOUS(_DOCTEST_ANON_TRANSLATOR_)(signature)\n\n#define DOCTEST_REGISTER_REPORTER(name, priority, reporter)\n#define DOCTEST_REGISTER_LISTENER(name, priority, reporter)\n\n#define DOCTEST_INFO(x) ((void)0)\n#define DOCTEST_CAPTURE(x) ((void)0)\n#define DOCTEST_ADD_MESSAGE_AT(file, line, x) ((void)0)\n#define DOCTEST_ADD_FAIL_CHECK_AT(file, line, x) ((void)0)\n#define DOCTEST_ADD_FAIL_AT(file, line, x) ((void)0)\n#define DOCTEST_MESSAGE(x) ((void)0)\n#define DOCTEST_FAIL_CHECK(x) ((void)0)\n#define DOCTEST_FAIL(x) ((void)0)\n\n#define DOCTEST_WARN(...) ((void)0)\n#define DOCTEST_CHECK(...) ((void)0)\n#define DOCTEST_REQUIRE(...) ((void)0)\n#define DOCTEST_WARN_FALSE(...) ((void)0)\n#define DOCTEST_CHECK_FALSE(...) ((void)0)\n#define DOCTEST_REQUIRE_FALSE(...) ((void)0)\n\n#define DOCTEST_WARN_MESSAGE(cond, msg) ((void)0)\n#define DOCTEST_CHECK_MESSAGE(cond, msg) ((void)0)\n#define DOCTEST_REQUIRE_MESSAGE(cond, msg) ((void)0)\n#define DOCTEST_WARN_FALSE_MESSAGE(cond, msg) ((void)0)\n#define DOCTEST_CHECK_FALSE_MESSAGE(cond, msg) ((void)0)\n#define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, msg) ((void)0)\n\n#define DOCTEST_WARN_THROWS(expr) ((void)0)\n#define DOCTEST_CHECK_THROWS(expr) ((void)0)\n#define DOCTEST_REQUIRE_THROWS(expr) ((void)0)\n#define DOCTEST_WARN_THROWS_AS(expr, ...) ((void)0)\n#define DOCTEST_CHECK_THROWS_AS(expr, ...) ((void)0)\n#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) ((void)0)\n#define DOCTEST_WARN_THROWS_WITH(expr, ...) ((void)0)\n#define DOCTEST_CHECK_THROWS_WITH(expr, ...) ((void)0)\n#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) ((void)0)\n#define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ...) ((void)0)\n#define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ...) ((void)0)\n#define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ...) ((void)0)\n#define DOCTEST_WARN_NOTHROW(expr) ((void)0)\n#define DOCTEST_CHECK_NOTHROW(expr) ((void)0)\n#define DOCTEST_REQUIRE_NOTHROW(expr) ((void)0)\n\n#define DOCTEST_WARN_THROWS_MESSAGE(expr, msg) ((void)0)\n#define DOCTEST_CHECK_THROWS_MESSAGE(expr, msg) ((void)0)\n#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, msg) ((void)0)\n#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0)\n#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0)\n#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0)\n#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, msg) ((void)0)\n#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, msg) ((void)0)\n#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, msg) ((void)0)\n#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, msg) ((void)0)\n#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, msg) ((void)0)\n#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, msg) ((void)0)\n#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, msg) ((void)0)\n#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, msg) ((void)0)\n#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, msg) ((void)0)\n\n#define DOCTEST_WARN_EQ(...) ((void)0)\n#define DOCTEST_CHECK_EQ(...) ((void)0)\n#define DOCTEST_REQUIRE_EQ(...) ((void)0)\n#define DOCTEST_WARN_NE(...) ((void)0)\n#define DOCTEST_CHECK_NE(...) ((void)0)\n#define DOCTEST_REQUIRE_NE(...) ((void)0)\n#define DOCTEST_WARN_GT(...) ((void)0)\n#define DOCTEST_CHECK_GT(...) ((void)0)\n#define DOCTEST_REQUIRE_GT(...) ((void)0)\n#define DOCTEST_WARN_LT(...) ((void)0)\n#define DOCTEST_CHECK_LT(...) ((void)0)\n#define DOCTEST_REQUIRE_LT(...) ((void)0)\n#define DOCTEST_WARN_GE(...) ((void)0)\n#define DOCTEST_CHECK_GE(...) ((void)0)\n#define DOCTEST_REQUIRE_GE(...) ((void)0)\n#define DOCTEST_WARN_LE(...) ((void)0)\n#define DOCTEST_CHECK_LE(...) ((void)0)\n#define DOCTEST_REQUIRE_LE(...) ((void)0)\n\n#define DOCTEST_WARN_UNARY(...) ((void)0)\n#define DOCTEST_CHECK_UNARY(...) ((void)0)\n#define DOCTEST_REQUIRE_UNARY(...) ((void)0)\n#define DOCTEST_WARN_UNARY_FALSE(...) ((void)0)\n#define DOCTEST_CHECK_UNARY_FALSE(...) ((void)0)\n#define DOCTEST_REQUIRE_UNARY_FALSE(...) ((void)0)\n\n#endif // DOCTEST_CONFIG_DISABLE\n\n// clang-format off\n// KEPT FOR BACKWARDS COMPATIBILITY - FORWARDING TO THE RIGHT MACROS\n#define DOCTEST_FAST_WARN_EQ             DOCTEST_WARN_EQ\n#define DOCTEST_FAST_CHECK_EQ            DOCTEST_CHECK_EQ\n#define DOCTEST_FAST_REQUIRE_EQ          DOCTEST_REQUIRE_EQ\n#define DOCTEST_FAST_WARN_NE             DOCTEST_WARN_NE\n#define DOCTEST_FAST_CHECK_NE            DOCTEST_CHECK_NE\n#define DOCTEST_FAST_REQUIRE_NE          DOCTEST_REQUIRE_NE\n#define DOCTEST_FAST_WARN_GT             DOCTEST_WARN_GT\n#define DOCTEST_FAST_CHECK_GT            DOCTEST_CHECK_GT\n#define DOCTEST_FAST_REQUIRE_GT          DOCTEST_REQUIRE_GT\n#define DOCTEST_FAST_WARN_LT             DOCTEST_WARN_LT\n#define DOCTEST_FAST_CHECK_LT            DOCTEST_CHECK_LT\n#define DOCTEST_FAST_REQUIRE_LT          DOCTEST_REQUIRE_LT\n#define DOCTEST_FAST_WARN_GE             DOCTEST_WARN_GE\n#define DOCTEST_FAST_CHECK_GE            DOCTEST_CHECK_GE\n#define DOCTEST_FAST_REQUIRE_GE          DOCTEST_REQUIRE_GE\n#define DOCTEST_FAST_WARN_LE             DOCTEST_WARN_LE\n#define DOCTEST_FAST_CHECK_LE            DOCTEST_CHECK_LE\n#define DOCTEST_FAST_REQUIRE_LE          DOCTEST_REQUIRE_LE\n\n#define DOCTEST_FAST_WARN_UNARY          DOCTEST_WARN_UNARY\n#define DOCTEST_FAST_CHECK_UNARY         DOCTEST_CHECK_UNARY\n#define DOCTEST_FAST_REQUIRE_UNARY       DOCTEST_REQUIRE_UNARY\n#define DOCTEST_FAST_WARN_UNARY_FALSE    DOCTEST_WARN_UNARY_FALSE\n#define DOCTEST_FAST_CHECK_UNARY_FALSE   DOCTEST_CHECK_UNARY_FALSE\n#define DOCTEST_FAST_REQUIRE_UNARY_FALSE DOCTEST_REQUIRE_UNARY_FALSE\n\n#define DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE DOCTEST_TEST_CASE_TEMPLATE_INVOKE\n// clang-format on\n\n// BDD style macros\n// clang-format off\n#define DOCTEST_SCENARIO(name) DOCTEST_TEST_CASE(\"  Scenario: \" name)\n#define DOCTEST_SCENARIO_CLASS(name) DOCTEST_TEST_CASE_CLASS(\"  Scenario: \" name)\n#define DOCTEST_SCENARIO_TEMPLATE(name, T, ...)  DOCTEST_TEST_CASE_TEMPLATE(\"  Scenario: \" name, T, __VA_ARGS__)\n#define DOCTEST_SCENARIO_TEMPLATE_DEFINE(name, T, id) DOCTEST_TEST_CASE_TEMPLATE_DEFINE(\"  Scenario: \" name, T, id)\n\n#define DOCTEST_GIVEN(name)     DOCTEST_SUBCASE(\"   Given: \" name)\n#define DOCTEST_WHEN(name)      DOCTEST_SUBCASE(\"    When: \" name)\n#define DOCTEST_AND_WHEN(name)  DOCTEST_SUBCASE(\"And when: \" name)\n#define DOCTEST_THEN(name)      DOCTEST_SUBCASE(\"    Then: \" name)\n#define DOCTEST_AND_THEN(name)  DOCTEST_SUBCASE(\"     And: \" name)\n// clang-format on\n\n// == SHORT VERSIONS OF THE MACROS\n#if !defined(DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES)\n\n#define TEST_CASE DOCTEST_TEST_CASE\n#define TEST_CASE_CLASS DOCTEST_TEST_CASE_CLASS\n#define TEST_CASE_FIXTURE DOCTEST_TEST_CASE_FIXTURE\n#define TYPE_TO_STRING DOCTEST_TYPE_TO_STRING\n#define TEST_CASE_TEMPLATE DOCTEST_TEST_CASE_TEMPLATE\n#define TEST_CASE_TEMPLATE_DEFINE DOCTEST_TEST_CASE_TEMPLATE_DEFINE\n#define TEST_CASE_TEMPLATE_INVOKE DOCTEST_TEST_CASE_TEMPLATE_INVOKE\n#define TEST_CASE_TEMPLATE_APPLY DOCTEST_TEST_CASE_TEMPLATE_APPLY\n#define SUBCASE DOCTEST_SUBCASE\n#define TEST_SUITE DOCTEST_TEST_SUITE\n#define TEST_SUITE_BEGIN DOCTEST_TEST_SUITE_BEGIN\n#define TEST_SUITE_END DOCTEST_TEST_SUITE_END\n#define REGISTER_EXCEPTION_TRANSLATOR DOCTEST_REGISTER_EXCEPTION_TRANSLATOR\n#define REGISTER_REPORTER DOCTEST_REGISTER_REPORTER\n#define REGISTER_LISTENER DOCTEST_REGISTER_LISTENER\n#define INFO DOCTEST_INFO\n#define CAPTURE DOCTEST_CAPTURE\n#define ADD_MESSAGE_AT DOCTEST_ADD_MESSAGE_AT\n#define ADD_FAIL_CHECK_AT DOCTEST_ADD_FAIL_CHECK_AT\n#define ADD_FAIL_AT DOCTEST_ADD_FAIL_AT\n#define MESSAGE DOCTEST_MESSAGE\n#define FAIL_CHECK DOCTEST_FAIL_CHECK\n#define FAIL DOCTEST_FAIL\n#define TO_LVALUE DOCTEST_TO_LVALUE\n\n#define WARN DOCTEST_WARN\n#define WARN_FALSE DOCTEST_WARN_FALSE\n#define WARN_THROWS DOCTEST_WARN_THROWS\n#define WARN_THROWS_AS DOCTEST_WARN_THROWS_AS\n#define WARN_THROWS_WITH DOCTEST_WARN_THROWS_WITH\n#define WARN_THROWS_WITH_AS DOCTEST_WARN_THROWS_WITH_AS\n#define WARN_NOTHROW DOCTEST_WARN_NOTHROW\n#define CHECK DOCTEST_CHECK\n#define CHECK_FALSE DOCTEST_CHECK_FALSE\n#define CHECK_THROWS DOCTEST_CHECK_THROWS\n#define CHECK_THROWS_AS DOCTEST_CHECK_THROWS_AS\n#define CHECK_THROWS_WITH DOCTEST_CHECK_THROWS_WITH\n#define CHECK_THROWS_WITH_AS DOCTEST_CHECK_THROWS_WITH_AS\n#define CHECK_NOTHROW DOCTEST_CHECK_NOTHROW\n#define REQUIRE DOCTEST_REQUIRE\n#define REQUIRE_FALSE DOCTEST_REQUIRE_FALSE\n#define REQUIRE_THROWS DOCTEST_REQUIRE_THROWS\n#define REQUIRE_THROWS_AS DOCTEST_REQUIRE_THROWS_AS\n#define REQUIRE_THROWS_WITH DOCTEST_REQUIRE_THROWS_WITH\n#define REQUIRE_THROWS_WITH_AS DOCTEST_REQUIRE_THROWS_WITH_AS\n#define REQUIRE_NOTHROW DOCTEST_REQUIRE_NOTHROW\n\n#define WARN_MESSAGE DOCTEST_WARN_MESSAGE\n#define WARN_FALSE_MESSAGE DOCTEST_WARN_FALSE_MESSAGE\n#define WARN_THROWS_MESSAGE DOCTEST_WARN_THROWS_MESSAGE\n#define WARN_THROWS_AS_MESSAGE DOCTEST_WARN_THROWS_AS_MESSAGE\n#define WARN_THROWS_WITH_MESSAGE DOCTEST_WARN_THROWS_WITH_MESSAGE\n#define WARN_THROWS_WITH_AS_MESSAGE DOCTEST_WARN_THROWS_WITH_AS_MESSAGE\n#define WARN_NOTHROW_MESSAGE DOCTEST_WARN_NOTHROW_MESSAGE\n#define CHECK_MESSAGE DOCTEST_CHECK_MESSAGE\n#define CHECK_FALSE_MESSAGE DOCTEST_CHECK_FALSE_MESSAGE\n#define CHECK_THROWS_MESSAGE DOCTEST_CHECK_THROWS_MESSAGE\n#define CHECK_THROWS_AS_MESSAGE DOCTEST_CHECK_THROWS_AS_MESSAGE\n#define CHECK_THROWS_WITH_MESSAGE DOCTEST_CHECK_THROWS_WITH_MESSAGE\n#define CHECK_THROWS_WITH_AS_MESSAGE DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE\n#define CHECK_NOTHROW_MESSAGE DOCTEST_CHECK_NOTHROW_MESSAGE\n#define REQUIRE_MESSAGE DOCTEST_REQUIRE_MESSAGE\n#define REQUIRE_FALSE_MESSAGE DOCTEST_REQUIRE_FALSE_MESSAGE\n#define REQUIRE_THROWS_MESSAGE DOCTEST_REQUIRE_THROWS_MESSAGE\n#define REQUIRE_THROWS_AS_MESSAGE DOCTEST_REQUIRE_THROWS_AS_MESSAGE\n#define REQUIRE_THROWS_WITH_MESSAGE DOCTEST_REQUIRE_THROWS_WITH_MESSAGE\n#define REQUIRE_THROWS_WITH_AS_MESSAGE DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE\n#define REQUIRE_NOTHROW_MESSAGE DOCTEST_REQUIRE_NOTHROW_MESSAGE\n\n#define SCENARIO DOCTEST_SCENARIO\n#define SCENARIO_CLASS DOCTEST_SCENARIO_CLASS\n#define SCENARIO_TEMPLATE DOCTEST_SCENARIO_TEMPLATE\n#define SCENARIO_TEMPLATE_DEFINE DOCTEST_SCENARIO_TEMPLATE_DEFINE\n#define GIVEN DOCTEST_GIVEN\n#define WHEN DOCTEST_WHEN\n#define AND_WHEN DOCTEST_AND_WHEN\n#define THEN DOCTEST_THEN\n#define AND_THEN DOCTEST_AND_THEN\n\n#define WARN_EQ DOCTEST_WARN_EQ\n#define CHECK_EQ DOCTEST_CHECK_EQ\n#define REQUIRE_EQ DOCTEST_REQUIRE_EQ\n#define WARN_NE DOCTEST_WARN_NE\n#define CHECK_NE DOCTEST_CHECK_NE\n#define REQUIRE_NE DOCTEST_REQUIRE_NE\n#define WARN_GT DOCTEST_WARN_GT\n#define CHECK_GT DOCTEST_CHECK_GT\n#define REQUIRE_GT DOCTEST_REQUIRE_GT\n#define WARN_LT DOCTEST_WARN_LT\n#define CHECK_LT DOCTEST_CHECK_LT\n#define REQUIRE_LT DOCTEST_REQUIRE_LT\n#define WARN_GE DOCTEST_WARN_GE\n#define CHECK_GE DOCTEST_CHECK_GE\n#define REQUIRE_GE DOCTEST_REQUIRE_GE\n#define WARN_LE DOCTEST_WARN_LE\n#define CHECK_LE DOCTEST_CHECK_LE\n#define REQUIRE_LE DOCTEST_REQUIRE_LE\n#define WARN_UNARY DOCTEST_WARN_UNARY\n#define CHECK_UNARY DOCTEST_CHECK_UNARY\n#define REQUIRE_UNARY DOCTEST_REQUIRE_UNARY\n#define WARN_UNARY_FALSE DOCTEST_WARN_UNARY_FALSE\n#define CHECK_UNARY_FALSE DOCTEST_CHECK_UNARY_FALSE\n#define REQUIRE_UNARY_FALSE DOCTEST_REQUIRE_UNARY_FALSE\n\n// KEPT FOR BACKWARDS COMPATIBILITY\n#define FAST_WARN_EQ DOCTEST_FAST_WARN_EQ\n#define FAST_CHECK_EQ DOCTEST_FAST_CHECK_EQ\n#define FAST_REQUIRE_EQ DOCTEST_FAST_REQUIRE_EQ\n#define FAST_WARN_NE DOCTEST_FAST_WARN_NE\n#define FAST_CHECK_NE DOCTEST_FAST_CHECK_NE\n#define FAST_REQUIRE_NE DOCTEST_FAST_REQUIRE_NE\n#define FAST_WARN_GT DOCTEST_FAST_WARN_GT\n#define FAST_CHECK_GT DOCTEST_FAST_CHECK_GT\n#define FAST_REQUIRE_GT DOCTEST_FAST_REQUIRE_GT\n#define FAST_WARN_LT DOCTEST_FAST_WARN_LT\n#define FAST_CHECK_LT DOCTEST_FAST_CHECK_LT\n#define FAST_REQUIRE_LT DOCTEST_FAST_REQUIRE_LT\n#define FAST_WARN_GE DOCTEST_FAST_WARN_GE\n#define FAST_CHECK_GE DOCTEST_FAST_CHECK_GE\n#define FAST_REQUIRE_GE DOCTEST_FAST_REQUIRE_GE\n#define FAST_WARN_LE DOCTEST_FAST_WARN_LE\n#define FAST_CHECK_LE DOCTEST_FAST_CHECK_LE\n#define FAST_REQUIRE_LE DOCTEST_FAST_REQUIRE_LE\n\n#define FAST_WARN_UNARY DOCTEST_FAST_WARN_UNARY\n#define FAST_CHECK_UNARY DOCTEST_FAST_CHECK_UNARY\n#define FAST_REQUIRE_UNARY DOCTEST_FAST_REQUIRE_UNARY\n#define FAST_WARN_UNARY_FALSE DOCTEST_FAST_WARN_UNARY_FALSE\n#define FAST_CHECK_UNARY_FALSE DOCTEST_FAST_CHECK_UNARY_FALSE\n#define FAST_REQUIRE_UNARY_FALSE DOCTEST_FAST_REQUIRE_UNARY_FALSE\n\n#define TEST_CASE_TEMPLATE_INSTANTIATE DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE\n\n#endif // DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES\n\n#if !defined(DOCTEST_CONFIG_DISABLE)\n\n// this is here to clear the 'current test suite' for the current translation unit - at the top\nDOCTEST_TEST_SUITE_END();\n\n// add stringification for primitive/fundamental types\nnamespace doctest { namespace detail {\n    DOCTEST_TYPE_TO_STRING_IMPL(bool)\n    DOCTEST_TYPE_TO_STRING_IMPL(float)\n    DOCTEST_TYPE_TO_STRING_IMPL(double)\n    DOCTEST_TYPE_TO_STRING_IMPL(long double)\n    DOCTEST_TYPE_TO_STRING_IMPL(char)\n    DOCTEST_TYPE_TO_STRING_IMPL(signed char)\n    DOCTEST_TYPE_TO_STRING_IMPL(unsigned char)\n#if !DOCTEST_MSVC || defined(_NATIVE_WCHAR_T_DEFINED)\n    DOCTEST_TYPE_TO_STRING_IMPL(wchar_t)\n#endif // not MSVC or wchar_t support enabled\n    DOCTEST_TYPE_TO_STRING_IMPL(short int)\n    DOCTEST_TYPE_TO_STRING_IMPL(unsigned short int)\n    DOCTEST_TYPE_TO_STRING_IMPL(int)\n    DOCTEST_TYPE_TO_STRING_IMPL(unsigned int)\n    DOCTEST_TYPE_TO_STRING_IMPL(long int)\n    DOCTEST_TYPE_TO_STRING_IMPL(unsigned long int)\n    DOCTEST_TYPE_TO_STRING_IMPL(long long int)\n    DOCTEST_TYPE_TO_STRING_IMPL(unsigned long long int)\n}} // namespace doctest::detail\n\n#endif // DOCTEST_CONFIG_DISABLE\n\nDOCTEST_CLANG_SUPPRESS_WARNING_POP\nDOCTEST_MSVC_SUPPRESS_WARNING_POP\nDOCTEST_GCC_SUPPRESS_WARNING_POP\n\n#endif // DOCTEST_LIBRARY_INCLUDED\n\n#ifndef DOCTEST_SINGLE_HEADER\n#define DOCTEST_SINGLE_HEADER\n#endif // DOCTEST_SINGLE_HEADER\n\n#if defined(DOCTEST_CONFIG_IMPLEMENT) || !defined(DOCTEST_SINGLE_HEADER)\n\n#ifndef DOCTEST_SINGLE_HEADER\n#include \"doctest_fwd.h\"\n#endif // DOCTEST_SINGLE_HEADER\n\nDOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(\"-Wunused-macros\")\n\n#ifndef DOCTEST_LIBRARY_IMPLEMENTATION\n#define DOCTEST_LIBRARY_IMPLEMENTATION\n\nDOCTEST_CLANG_SUPPRESS_WARNING_POP\n\nDOCTEST_CLANG_SUPPRESS_WARNING_PUSH\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wunknown-pragmas\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wpadded\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wweak-vtables\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wglobal-constructors\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wexit-time-destructors\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wmissing-prototypes\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wsign-conversion\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wshorten-64-to-32\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wmissing-variable-declarations\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wswitch\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wswitch-enum\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wcovered-switch-default\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wmissing-noreturn\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wunused-local-typedef\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wdisabled-macro-expansion\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wmissing-braces\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wmissing-field-initializers\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wc++98-compat\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wc++98-compat-pedantic\")\nDOCTEST_CLANG_SUPPRESS_WARNING(\"-Wunused-member-function\")\n\nDOCTEST_GCC_SUPPRESS_WARNING_PUSH\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wunknown-pragmas\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wpragmas\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wconversion\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Weffc++\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wsign-conversion\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wstrict-overflow\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wstrict-aliasing\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wmissing-field-initializers\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wmissing-braces\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wmissing-declarations\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wswitch\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wswitch-enum\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wswitch-default\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wunsafe-loop-optimizations\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wold-style-cast\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wunused-local-typedefs\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wuseless-cast\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wunused-function\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wmultiple-inheritance\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wnoexcept\")\nDOCTEST_GCC_SUPPRESS_WARNING(\"-Wsuggest-attribute\")\n\nDOCTEST_MSVC_SUPPRESS_WARNING_PUSH\nDOCTEST_MSVC_SUPPRESS_WARNING(4616) // invalid compiler warning\nDOCTEST_MSVC_SUPPRESS_WARNING(4619) // invalid compiler warning\nDOCTEST_MSVC_SUPPRESS_WARNING(4996) // The compiler encountered a deprecated declaration\nDOCTEST_MSVC_SUPPRESS_WARNING(4267) // 'var' : conversion from 'x' to 'y', possible loss of data\nDOCTEST_MSVC_SUPPRESS_WARNING(4706) // assignment within conditional expression\nDOCTEST_MSVC_SUPPRESS_WARNING(4512) // 'class' : assignment operator could not be generated\nDOCTEST_MSVC_SUPPRESS_WARNING(4127) // conditional expression is constant\nDOCTEST_MSVC_SUPPRESS_WARNING(4530) // C++ exception handler used, but unwind semantics not enabled\nDOCTEST_MSVC_SUPPRESS_WARNING(4577) // 'noexcept' used with no exception handling mode specified\nDOCTEST_MSVC_SUPPRESS_WARNING(4774) // format string expected in argument is not a string literal\nDOCTEST_MSVC_SUPPRESS_WARNING(4365) // conversion from 'int' to 'unsigned', signed/unsigned mismatch\nDOCTEST_MSVC_SUPPRESS_WARNING(4820) // padding in structs\nDOCTEST_MSVC_SUPPRESS_WARNING(4640) // construction of local static object is not thread-safe\nDOCTEST_MSVC_SUPPRESS_WARNING(5039) // pointer to potentially throwing function passed to extern C\nDOCTEST_MSVC_SUPPRESS_WARNING(5045) // Spectre mitigation stuff\nDOCTEST_MSVC_SUPPRESS_WARNING(4626) // assignment operator was implicitly defined as deleted\nDOCTEST_MSVC_SUPPRESS_WARNING(5027) // move assignment operator was implicitly defined as deleted\nDOCTEST_MSVC_SUPPRESS_WARNING(5026) // move constructor was implicitly defined as deleted\nDOCTEST_MSVC_SUPPRESS_WARNING(4625) // copy constructor was implicitly defined as deleted\nDOCTEST_MSVC_SUPPRESS_WARNING(4800) // forcing value to bool 'true' or 'false' (performance warning)\n// static analysis\nDOCTEST_MSVC_SUPPRESS_WARNING(26439) // This kind of function may not throw. Declare it 'noexcept'\nDOCTEST_MSVC_SUPPRESS_WARNING(26495) // Always initialize a member variable\nDOCTEST_MSVC_SUPPRESS_WARNING(26451) // Arithmetic overflow ...\nDOCTEST_MSVC_SUPPRESS_WARNING(26444) // Avoid unnamed objects with custom construction and dtor...\n\nDOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN\n\n// required includes - will go only in one translation unit!\n#include <ctime>\n#include <cmath>\n#include <climits>\n// borland (Embarcadero) compiler requires math.h and not cmath - https://github.com/onqtam/doctest/pull/37\n#ifdef __BORLANDC__\n#include <math.h>\n#endif // __BORLANDC__\n#include <new>\n#include <cstdio>\n#include <cstdlib>\n#include <cstring>\n#include <limits>\n#include <utility>\n#include <fstream>\n#include <sstream>\n#include <iostream>\n#include <algorithm>\n#include <iomanip>\n#include <vector>\n#include <atomic>\n#include <mutex>\n#include <set>\n#include <map>\n#include <exception>\n#include <stdexcept>\n#ifdef DOCTEST_CONFIG_POSIX_SIGNALS\n#include <csignal>\n#endif // DOCTEST_CONFIG_POSIX_SIGNALS\n#include <cfloat>\n#include <cctype>\n#include <cstdint>\n\n#ifdef DOCTEST_PLATFORM_MAC\n#include <sys/types.h>\n#include <unistd.h>\n#include <sys/sysctl.h>\n#endif // DOCTEST_PLATFORM_MAC\n\n#ifdef DOCTEST_PLATFORM_WINDOWS\n\n// defines for a leaner windows.h\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif // WIN32_LEAN_AND_MEAN\n#ifndef NOMINMAX\n#define NOMINMAX\n#endif // NOMINMAX\n\n// not sure what AfxWin.h is for - here I do what Catch does\n#ifdef __AFXDLL\n#include <AfxWin.h>\n#else\n#include <Windows.h>\n#endif\n#include <io.h>\n\n#else // DOCTEST_PLATFORM_WINDOWS\n\n#include <sys/time.h>\n#include <unistd.h>\n\n#endif // DOCTEST_PLATFORM_WINDOWS\n\nDOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END\n\n// counts the number of elements in a C array\n#define DOCTEST_COUNTOF(x) (sizeof(x) / sizeof(x[0]))\n\n#ifdef DOCTEST_CONFIG_DISABLE\n#define DOCTEST_BRANCH_ON_DISABLED(if_disabled, if_not_disabled) if_disabled\n#else // DOCTEST_CONFIG_DISABLE\n#define DOCTEST_BRANCH_ON_DISABLED(if_disabled, if_not_disabled) if_not_disabled\n#endif // DOCTEST_CONFIG_DISABLE\n\n#ifndef DOCTEST_CONFIG_OPTIONS_PREFIX\n#define DOCTEST_CONFIG_OPTIONS_PREFIX \"dt-\"\n#endif\n\n#ifdef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS\n#define DOCTEST_OPTIONS_PREFIX_DISPLAY DOCTEST_CONFIG_OPTIONS_PREFIX\n#else\n#define DOCTEST_OPTIONS_PREFIX_DISPLAY \"\"\n#endif\n\nnamespace doctest {\n\nbool is_running_in_test = false;\n\nnamespace {\n    using namespace detail;\n    // case insensitive strcmp\n    int stricmp(const char* a, const char* b) {\n        for(;; a++, b++) {\n            const int d = tolower(*a) - tolower(*b);\n            if(d != 0 || !*a)\n                return d;\n        }\n    }\n\n    template <typename T>\n    String fpToString(T value, int precision) {\n        std::ostringstream oss;\n        oss << std::setprecision(precision) << std::fixed << value;\n        std::string d = oss.str();\n        size_t      i = d.find_last_not_of('0');\n        if(i != std::string::npos && i != d.size() - 1) {\n            if(d[i] == '.')\n                i++;\n            d = d.substr(0, i + 1);\n        }\n        return d.c_str();\n    }\n\n    struct Endianness\n    {\n        enum Arch\n        {\n            Big,\n            Little\n        };\n\n        static Arch which() {\n            int x = 1;\n            // casting any data pointer to char* is allowed\n            auto ptr = reinterpret_cast<char*>(&x);\n            if(*ptr)\n                return Little;\n            return Big;\n        }\n    };\n} // namespace\n\nnamespace detail {\n    void my_memcpy(void* dest, const void* src, unsigned num) { memcpy(dest, src, num); }\n\n    String rawMemoryToString(const void* object, unsigned size) {\n        // Reverse order for little endian architectures\n        int i = 0, end = static_cast<int>(size), inc = 1;\n        if(Endianness::which() == Endianness::Little) {\n            i   = end - 1;\n            end = inc = -1;\n        }\n\n        unsigned const char* bytes = static_cast<unsigned const char*>(object);\n        std::ostringstream   oss;\n        oss << \"0x\" << std::setfill('0') << std::hex;\n        for(; i != end; i += inc)\n            oss << std::setw(2) << static_cast<unsigned>(bytes[i]);\n        return oss.str().c_str();\n    }\n\n    DOCTEST_THREAD_LOCAL std::ostringstream g_oss; // NOLINT(cert-err58-cpp)\n\n    std::ostream* getTlsOss() {\n        g_oss.clear(); // there shouldn't be anything worth clearing in the flags\n        g_oss.str(\"\"); // the slow way of resetting a string stream\n        //g_oss.seekp(0); // optimal reset - as seen here: https://stackoverflow.com/a/624291/3162383\n        return &g_oss;\n    }\n\n    String getTlsOssResult() {\n        //g_oss << std::ends; // needed - as shown here: https://stackoverflow.com/a/624291/3162383\n        return g_oss.str().c_str();\n    }\n\n#ifndef DOCTEST_CONFIG_DISABLE\n\n    typedef uint64_t UInt64;\n\n#ifdef DOCTEST_CONFIG_GETCURRENTTICKS\n    UInt64 getCurrentTicks() { return DOCTEST_CONFIG_GETCURRENTTICKS(); }\n#elif defined(DOCTEST_PLATFORM_WINDOWS)\n    UInt64 getCurrentTicks() {\n        static UInt64 hz = 0, hzo = 0;\n        if(!hz) {\n            QueryPerformanceFrequency(reinterpret_cast<LARGE_INTEGER*>(&hz));\n            QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER*>(&hzo));\n        }\n        UInt64 t;\n        QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER*>(&t));\n        return ((t - hzo) * 1000000) / hz;\n    }\n#else  // DOCTEST_PLATFORM_WINDOWS\n    UInt64 getCurrentTicks() {\n        timeval t;\n        gettimeofday(&t, nullptr);\n        return static_cast<UInt64>(t.tv_sec) * 1000000 + static_cast<UInt64>(t.tv_usec);\n    }\n#endif // DOCTEST_PLATFORM_WINDOWS\n\n    struct Timer\n    {\n        void         start() { m_ticks = getCurrentTicks(); }\n        unsigned int getElapsedMicroseconds() const {\n            return static_cast<unsigned int>(getCurrentTicks() - m_ticks);\n        }\n        //unsigned int getElapsedMilliseconds() const {\n        //    return static_cast<unsigned int>(getElapsedMicroseconds() / 1000);\n        //}\n        double getElapsedSeconds() const { return getElapsedMicroseconds() / 1000000.0; }\n\n    private:\n        UInt64 m_ticks = 0;\n    };\n\n    // this holds both parameters from the command line and runtime data for tests\n    struct ContextState : ContextOptions, TestRunStats, CurrentTestCaseStats\n    {\n        std::atomic<int> numAssertsCurrentTest_atomic;\n        std::atomic<int> numAssertsFailedCurrentTest_atomic;\n\n        std::vector<std::vector<String>> filters = decltype(filters)(9); // 9 different filters\n\n        std::vector<IReporter*> reporters_currently_used;\n\n        const TestCase* currentTest = nullptr;\n\n        assert_handler ah = nullptr;\n\n        Timer timer;\n\n        std::vector<String> stringifiedContexts; // logging from INFO() due to an exception\n\n        // stuff for subcases\n        std::vector<SubcaseSignature>     subcasesStack;\n        std::set<decltype(subcasesStack)> subcasesPassed;\n        int                               subcasesCurrentMaxLevel;\n        bool                              should_reenter;\n        std::atomic<bool>                 shouldLogCurrentException;\n\n        void resetRunData() {\n            numTestCases                = 0;\n            numTestCasesPassingFilters  = 0;\n            numTestSuitesPassingFilters = 0;\n            numTestCasesFailed          = 0;\n            numAsserts                  = 0;\n            numAssertsFailed            = 0;\n            numAssertsCurrentTest       = 0;\n            numAssertsFailedCurrentTest = 0;\n        }\n\n        void finalizeTestCaseData() {\n            seconds = timer.getElapsedSeconds();\n\n            // update the non-atomic counters\n            numAsserts += numAssertsCurrentTest_atomic;\n            numAssertsFailed += numAssertsFailedCurrentTest_atomic;\n            numAssertsCurrentTest       = numAssertsCurrentTest_atomic;\n            numAssertsFailedCurrentTest = numAssertsFailedCurrentTest_atomic;\n\n            if(numAssertsFailedCurrentTest)\n                failure_flags |= TestCaseFailureReason::AssertFailure;\n\n            if(Approx(currentTest->m_timeout).epsilon(DBL_EPSILON) != 0 &&\n               Approx(seconds).epsilon(DBL_EPSILON) > currentTest->m_timeout)\n                failure_flags |= TestCaseFailureReason::Timeout;\n\n            if(currentTest->m_should_fail) {\n                if(failure_flags) {\n                    failure_flags |= TestCaseFailureReason::ShouldHaveFailedAndDid;\n                } else {\n                    failure_flags |= TestCaseFailureReason::ShouldHaveFailedButDidnt;\n                }\n            } else if(failure_flags && currentTest->m_may_fail) {\n                failure_flags |= TestCaseFailureReason::CouldHaveFailedAndDid;\n            } else if(currentTest->m_expected_failures > 0) {\n                if(numAssertsFailedCurrentTest == currentTest->m_expected_failures) {\n                    failure_flags |= TestCaseFailureReason::FailedExactlyNumTimes;\n                } else {\n                    failure_flags |= TestCaseFailureReason::DidntFailExactlyNumTimes;\n                }\n            }\n\n            bool ok_to_fail = (TestCaseFailureReason::ShouldHaveFailedAndDid & failure_flags) ||\n                              (TestCaseFailureReason::CouldHaveFailedAndDid & failure_flags) ||\n                              (TestCaseFailureReason::FailedExactlyNumTimes & failure_flags);\n\n            // if any subcase has failed - the whole test case has failed\n            if(failure_flags && !ok_to_fail)\n                numTestCasesFailed++;\n        }\n    };\n\n    ContextState* g_cs = nullptr;\n\n    // used to avoid locks for the debug output\n    // TODO: figure out if this is indeed necessary/correct - seems like either there still\n    // could be a race or that there wouldn't be a race even if using the context directly\n    DOCTEST_THREAD_LOCAL bool g_no_colors;\n\n#endif // DOCTEST_CONFIG_DISABLE\n} // namespace detail\n\nvoid String::setOnHeap() { *reinterpret_cast<unsigned char*>(&buf[last]) = 128; }\nvoid String::setLast(unsigned in) { buf[last] = char(in); }\n\nvoid String::copy(const String& other) {\n    if(other.isOnStack()) {\n        memcpy(buf, other.buf, len);\n    } else {\n        setOnHeap();\n        data.size     = other.data.size;\n        data.capacity = data.size + 1;\n        data.ptr      = new char[data.capacity];\n        memcpy(data.ptr, other.data.ptr, data.size + 1);\n    }\n}\n\nString::String() {\n    buf[0] = '\\0';\n    setLast();\n}\n\nString::~String() {\n    if(!isOnStack())\n        delete[] data.ptr;\n}\n\nString::String(const char* in)\n        : String(in, strlen(in)) {}\n\nString::String(const char* in, unsigned in_size) {\n    if(in_size <= last) {\n        memcpy(buf, in, in_size + 1);\n        setLast(last - in_size);\n    } else {\n        setOnHeap();\n        data.size     = in_size;\n        data.capacity = data.size + 1;\n        data.ptr      = new char[data.capacity];\n        memcpy(data.ptr, in, in_size + 1);\n    }\n}\n\nString::String(const String& other) { copy(other); }\n\nString& String::operator=(const String& other) {\n    if(this != &other) {\n        if(!isOnStack())\n            delete[] data.ptr;\n\n        copy(other);\n    }\n\n    return *this;\n}\n\nString& String::operator+=(const String& other) {\n    const unsigned my_old_size = size();\n    const unsigned other_size  = other.size();\n    const unsigned total_size  = my_old_size + other_size;\n    if(isOnStack()) {\n        if(total_size < len) {\n            // append to the current stack space\n            memcpy(buf + my_old_size, other.c_str(), other_size + 1);\n            setLast(last - total_size);\n        } else {\n            // alloc new chunk\n            char* temp = new char[total_size + 1];\n            // copy current data to new location before writing in the union\n            memcpy(temp, buf, my_old_size); // skip the +1 ('\\0') for speed\n            // update data in union\n            setOnHeap();\n            data.size     = total_size;\n            data.capacity = data.size + 1;\n            data.ptr      = temp;\n            // transfer the rest of the data\n            memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);\n        }\n    } else {\n        if(data.capacity > total_size) {\n            // append to the current heap block\n            data.size = total_size;\n            memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);\n        } else {\n            // resize\n            data.capacity *= 2;\n            if(data.capacity <= total_size)\n                data.capacity = total_size + 1;\n            // alloc new chunk\n            char* temp = new char[data.capacity];\n            // copy current data to new location before releasing it\n            memcpy(temp, data.ptr, my_old_size); // skip the +1 ('\\0') for speed\n            // release old chunk\n            delete[] data.ptr;\n            // update the rest of the union members\n            data.size = total_size;\n            data.ptr  = temp;\n            // transfer the rest of the data\n            memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);\n        }\n    }\n\n    return *this;\n}\n\nString String::operator+(const String& other) const { return String(*this) += other; }\n\nString::String(String&& other) {\n    memcpy(buf, other.buf, len);\n    other.buf[0] = '\\0';\n    other.setLast();\n}\n\nString& String::operator=(String&& other) {\n    if(this != &other) {\n        if(!isOnStack())\n            delete[] data.ptr;\n        memcpy(buf, other.buf, len);\n        other.buf[0] = '\\0';\n        other.setLast();\n    }\n    return *this;\n}\n\nchar String::operator[](unsigned i) const {\n    return const_cast<String*>(this)->operator[](i); // NOLINT\n}\n\nchar& String::operator[](unsigned i) {\n    if(isOnStack())\n        return reinterpret_cast<char*>(buf)[i];\n    return data.ptr[i];\n}\n\nDOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(\"-Wmaybe-uninitialized\")\nunsigned String::size() const {\n    if(isOnStack())\n        return last - (unsigned(buf[last]) & 31); // using \"last\" would work only if \"len\" is 32\n    return data.size;\n}\nDOCTEST_GCC_SUPPRESS_WARNING_POP\n\nunsigned String::capacity() const {\n    if(isOnStack())\n        return len;\n    return data.capacity;\n}\n\nint String::compare(const char* other, bool no_case) const {\n    if(no_case)\n        return stricmp(c_str(), other);\n    return std::strcmp(c_str(), other);\n}\n\nint String::compare(const String& other, bool no_case) const {\n    return compare(other.c_str(), no_case);\n}\n\n// clang-format off\nbool operator==(const String& lhs, const String& rhs) { return lhs.compare(rhs) == 0; }\nbool operator!=(const String& lhs, const String& rhs) { return lhs.compare(rhs) != 0; }\nbool operator< (const String& lhs, const String& rhs) { return lhs.compare(rhs) < 0; }\nbool operator> (const String& lhs, const String& rhs) { return lhs.compare(rhs) > 0; }\nbool operator<=(const String& lhs, const String& rhs) { return (lhs != rhs) ? lhs.compare(rhs) < 0 : true; }\nbool operator>=(const String& lhs, const String& rhs) { return (lhs != rhs) ? lhs.compare(rhs) > 0 : true; }\n// clang-format on\n\nstd::ostream& operator<<(std::ostream& s, const String& in) { return s << in.c_str(); }\n\nnamespace {\n    void color_to_stream(std::ostream&, Color::Enum) DOCTEST_BRANCH_ON_DISABLED({}, ;)\n} // namespace\n\nnamespace Color {\n    std::ostream& operator<<(std::ostream& s, Color::Enum code) {\n        color_to_stream(s, code);\n        return s;\n    }\n} // namespace Color\n\n// clang-format off\nconst char* assertString(assertType::Enum at) {\n    DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4062) // enum 'x' in switch of enum 'y' is not handled\n    switch(at) {  //!OCLINT missing default in switch statements\n        case assertType::DT_WARN                    : return \"WARN\";\n        case assertType::DT_CHECK                   : return \"CHECK\";\n        case assertType::DT_REQUIRE                 : return \"REQUIRE\";\n\n        case assertType::DT_WARN_FALSE              : return \"WARN_FALSE\";\n        case assertType::DT_CHECK_FALSE             : return \"CHECK_FALSE\";\n        case assertType::DT_REQUIRE_FALSE           : return \"REQUIRE_FALSE\";\n\n        case assertType::DT_WARN_THROWS             : return \"WARN_THROWS\";\n        case assertType::DT_CHECK_THROWS            : return \"CHECK_THROWS\";\n        case assertType::DT_REQUIRE_THROWS          : return \"REQUIRE_THROWS\";\n\n        case assertType::DT_WARN_THROWS_AS          : return \"WARN_THROWS_AS\";\n        case assertType::DT_CHECK_THROWS_AS         : return \"CHECK_THROWS_AS\";\n        case assertType::DT_REQUIRE_THROWS_AS       : return \"REQUIRE_THROWS_AS\";\n\n        case assertType::DT_WARN_THROWS_WITH        : return \"WARN_THROWS_WITH\";\n        case assertType::DT_CHECK_THROWS_WITH       : return \"CHECK_THROWS_WITH\";\n        case assertType::DT_REQUIRE_THROWS_WITH     : return \"REQUIRE_THROWS_WITH\";\n\n        case assertType::DT_WARN_THROWS_WITH_AS     : return \"WARN_THROWS_WITH_AS\";\n        case assertType::DT_CHECK_THROWS_WITH_AS    : return \"CHECK_THROWS_WITH_AS\";\n        case assertType::DT_REQUIRE_THROWS_WITH_AS  : return \"REQUIRE_THROWS_WITH_AS\";\n\n        case assertType::DT_WARN_NOTHROW            : return \"WARN_NOTHROW\";\n        case assertType::DT_CHECK_NOTHROW           : return \"CHECK_NOTHROW\";\n        case assertType::DT_REQUIRE_NOTHROW         : return \"REQUIRE_NOTHROW\";\n\n        case assertType::DT_WARN_EQ                 : return \"WARN_EQ\";\n        case assertType::DT_CHECK_EQ                : return \"CHECK_EQ\";\n        case assertType::DT_REQUIRE_EQ              : return \"REQUIRE_EQ\";\n        case assertType::DT_WARN_NE                 : return \"WARN_NE\";\n        case assertType::DT_CHECK_NE                : return \"CHECK_NE\";\n        case assertType::DT_REQUIRE_NE              : return \"REQUIRE_NE\";\n        case assertType::DT_WARN_GT                 : return \"WARN_GT\";\n        case assertType::DT_CHECK_GT                : return \"CHECK_GT\";\n        case assertType::DT_REQUIRE_GT              : return \"REQUIRE_GT\";\n        case assertType::DT_WARN_LT                 : return \"WARN_LT\";\n        case assertType::DT_CHECK_LT                : return \"CHECK_LT\";\n        case assertType::DT_REQUIRE_LT              : return \"REQUIRE_LT\";\n        case assertType::DT_WARN_GE                 : return \"WARN_GE\";\n        case assertType::DT_CHECK_GE                : return \"CHECK_GE\";\n        case assertType::DT_REQUIRE_GE              : return \"REQUIRE_GE\";\n        case assertType::DT_WARN_LE                 : return \"WARN_LE\";\n        case assertType::DT_CHECK_LE                : return \"CHECK_LE\";\n        case assertType::DT_REQUIRE_LE              : return \"REQUIRE_LE\";\n\n        case assertType::DT_WARN_UNARY              : return \"WARN_UNARY\";\n        case assertType::DT_CHECK_UNARY             : return \"CHECK_UNARY\";\n        case assertType::DT_REQUIRE_UNARY           : return \"REQUIRE_UNARY\";\n        case assertType::DT_WARN_UNARY_FALSE        : return \"WARN_UNARY_FALSE\";\n        case assertType::DT_CHECK_UNARY_FALSE       : return \"CHECK_UNARY_FALSE\";\n        case assertType::DT_REQUIRE_UNARY_FALSE     : return \"REQUIRE_UNARY_FALSE\";\n    }\n    DOCTEST_MSVC_SUPPRESS_WARNING_POP\n    return \"\";\n}\n// clang-format on\n\nconst char* failureString(assertType::Enum at) {\n    if(at & assertType::is_warn) //!OCLINT bitwise operator in conditional\n        return \"WARNING\";\n    if(at & assertType::is_check) //!OCLINT bitwise operator in conditional\n        return \"ERROR\";\n    if(at & assertType::is_require) //!OCLINT bitwise operator in conditional\n        return \"FATAL ERROR\";\n    return \"\";\n}\n\nDOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(\"-Wnull-dereference\")\nDOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(\"-Wnull-dereference\")\n// depending on the current options this will remove the path of filenames\nconst char* skipPathFromFilename(const char* file) {\n    if(getContextOptions()->no_path_in_filenames) {\n        auto back    = std::strrchr(file, '\\\\');\n        auto forward = std::strrchr(file, '/');\n        if(back || forward) {\n            if(back > forward)\n                forward = back;\n            return forward + 1;\n        }\n    }\n    return file;\n}\nDOCTEST_CLANG_SUPPRESS_WARNING_POP\nDOCTEST_GCC_SUPPRESS_WARNING_POP\n\nbool SubcaseSignature::operator<(const SubcaseSignature& other) const {\n    if(m_line != other.m_line)\n        return m_line < other.m_line;\n    if(std::strcmp(m_file, other.m_file) != 0)\n        return std::strcmp(m_file, other.m_file) < 0;\n    return std::strcmp(m_name, other.m_name) < 0;\n}\n\nIContextScope::IContextScope()  = default;\nIContextScope::~IContextScope() = default;\n\n#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING\nString toString(char* in) { return toString(static_cast<const char*>(in)); }\nString toString(const char* in) { return String(\"\\\"\") + (in ? in : \"{null string}\") + \"\\\"\"; }\n#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING\nString toString(bool in) { return in ? \"true\" : \"false\"; }\nString toString(float in) { return fpToString(in, 5) + \"f\"; }\nString toString(double in) { return fpToString(in, 10); }\nString toString(double long in) { return fpToString(in, 15); }\n\n#define DOCTEST_TO_STRING_OVERLOAD(type, fmt)                                                      \\\n    String toString(type in) {                                                                     \\\n        char buf[64];                                                                              \\\n        std::sprintf(buf, fmt, in);                                                                \\\n        return buf;                                                                                \\\n    }\n\nDOCTEST_TO_STRING_OVERLOAD(char, \"%d\")\nDOCTEST_TO_STRING_OVERLOAD(char signed, \"%d\")\nDOCTEST_TO_STRING_OVERLOAD(char unsigned, \"%u\")\nDOCTEST_TO_STRING_OVERLOAD(int short, \"%d\")\nDOCTEST_TO_STRING_OVERLOAD(int short unsigned, \"%u\")\nDOCTEST_TO_STRING_OVERLOAD(int, \"%d\")\nDOCTEST_TO_STRING_OVERLOAD(unsigned, \"%u\")\nDOCTEST_TO_STRING_OVERLOAD(int long, \"%ld\")\nDOCTEST_TO_STRING_OVERLOAD(int long unsigned, \"%lu\")\nDOCTEST_TO_STRING_OVERLOAD(int long long, \"%lld\")\nDOCTEST_TO_STRING_OVERLOAD(int long long unsigned, \"%llu\")\n\nString toString(std::nullptr_t) { return \"NULL\"; }\n\n#if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0)\n// see this issue on why this is needed: https://github.com/onqtam/doctest/issues/183\nString toString(const std::string& in) { return in.c_str(); }\n#endif // VS 2019\n\nApprox::Approx(double value)\n        : m_epsilon(static_cast<double>(std::numeric_limits<float>::epsilon()) * 100)\n        , m_scale(1.0)\n        , m_value(value) {}\n\nApprox Approx::operator()(double value) const {\n    Approx approx(value);\n    approx.epsilon(m_epsilon);\n    approx.scale(m_scale);\n    return approx;\n}\n\nApprox& Approx::epsilon(double newEpsilon) {\n    m_epsilon = newEpsilon;\n    return *this;\n}\nApprox& Approx::scale(double newScale) {\n    m_scale = newScale;\n    return *this;\n}\n\nbool operator==(double lhs, const Approx& rhs) {\n    // Thanks to Richard Harris for his help refining this formula\n    return std::fabs(lhs - rhs.m_value) <\n           rhs.m_epsilon * (rhs.m_scale + std::max<double>(std::fabs(lhs), std::fabs(rhs.m_value)));\n}\nbool operator==(const Approx& lhs, double rhs) { return operator==(rhs, lhs); }\nbool operator!=(double lhs, const Approx& rhs) { return !operator==(lhs, rhs); }\nbool operator!=(const Approx& lhs, double rhs) { return !operator==(rhs, lhs); }\nbool operator<=(double lhs, const Approx& rhs) { return lhs < rhs.m_value || lhs == rhs; }\nbool operator<=(const Approx& lhs, double rhs) { return lhs.m_value < rhs || lhs == rhs; }\nbool operator>=(double lhs, const Approx& rhs) { return lhs > rhs.m_value || lhs == rhs; }\nbool operator>=(const Approx& lhs, double rhs) { return lhs.m_value > rhs || lhs == rhs; }\nbool operator<(double lhs, const Approx& rhs) { return lhs < rhs.m_value && lhs != rhs; }\nbool operator<(const Approx& lhs, double rhs) { return lhs.m_value < rhs && lhs != rhs; }\nbool operator>(double lhs, const Approx& rhs) { return lhs > rhs.m_value && lhs != rhs; }\nbool operator>(const Approx& lhs, double rhs) { return lhs.m_value > rhs && lhs != rhs; }\n\nString toString(const Approx& in) {\n    return String(\"Approx( \") + doctest::toString(in.m_value) + \" )\";\n}\nconst ContextOptions* getContextOptions() { return DOCTEST_BRANCH_ON_DISABLED(nullptr, g_cs); }\n\n} // namespace doctest\n\n#ifdef DOCTEST_CONFIG_DISABLE\nnamespace doctest {\nContext::Context(int, const char* const*) {}\nContext::~Context() = default;\nvoid Context::applyCommandLine(int, const char* const*) {}\nvoid Context::addFilter(const char*, const char*) {}\nvoid Context::clearFilters() {}\nvoid Context::setOption(const char*, int) {}\nvoid Context::setOption(const char*, const char*) {}\nbool Context::shouldExit() { return false; }\nvoid Context::setAsDefaultForAssertsOutOfTestCases() {}\nvoid Context::setAssertHandler(detail::assert_handler) {}\nint  Context::run() { return 0; }\n\nIReporter::~IReporter() = default;\n\nint                         IReporter::get_num_active_contexts() { return 0; }\nconst IContextScope* const* IReporter::get_active_contexts() { return nullptr; }\nint                         IReporter::get_num_stringified_contexts() { return 0; }\nconst String*               IReporter::get_stringified_contexts() { return nullptr; }\n\nint registerReporter(const char*, int, IReporter*) { return 0; }\n\n} // namespace doctest\n#else // DOCTEST_CONFIG_DISABLE\n\n#if !defined(DOCTEST_CONFIG_COLORS_NONE)\n#if !defined(DOCTEST_CONFIG_COLORS_WINDOWS) && !defined(DOCTEST_CONFIG_COLORS_ANSI)\n#ifdef DOCTEST_PLATFORM_WINDOWS\n#define DOCTEST_CONFIG_COLORS_WINDOWS\n#else // linux\n#define DOCTEST_CONFIG_COLORS_ANSI\n#endif // platform\n#endif // DOCTEST_CONFIG_COLORS_WINDOWS && DOCTEST_CONFIG_COLORS_ANSI\n#endif // DOCTEST_CONFIG_COLORS_NONE\n\nnamespace doctest_detail_test_suite_ns {\n// holds the current test suite\ndoctest::detail::TestSuite& getCurrentTestSuite() {\n    static doctest::detail::TestSuite data;\n    return data;\n}\n} // namespace doctest_detail_test_suite_ns\n\nnamespace doctest {\nnamespace {\n    // the int (priority) is part of the key for automatic sorting - sadly one can register a\n    // reporter with a duplicate name and a different priority but hopefully that won't happen often :|\n    typedef std::map<std::pair<int, String>, reporterCreatorFunc> reporterMap;\n\n    reporterMap& getReporters() {\n        static reporterMap data;\n        return data;\n    }\n    reporterMap& getListeners() {\n        static reporterMap data;\n        return data;\n    }\n} // namespace\nnamespace detail {\n#define DOCTEST_ITERATE_THROUGH_REPORTERS(function, ...)                                           \\\n    for(auto& curr_rep : g_cs->reporters_currently_used)                                           \\\n    curr_rep->function(__VA_ARGS__)\n\n    bool checkIfShouldThrow(assertType::Enum at) {\n        if(at & assertType::is_require) //!OCLINT bitwise operator in conditional\n            return true;\n\n        if((at & assertType::is_check) //!OCLINT bitwise operator in conditional\n           && getContextOptions()->abort_after > 0 &&\n           (g_cs->numAssertsFailed + g_cs->numAssertsFailedCurrentTest_atomic) >=\n                   getContextOptions()->abort_after)\n            return true;\n\n        return false;\n    }\n\n#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS\n    DOCTEST_NORETURN void throwException() {\n        g_cs->shouldLogCurrentException = false;\n        throw TestFailureException();\n    } // NOLINT(cert-err60-cpp)\n#else // DOCTEST_CONFIG_NO_EXCEPTIONS\n    void throwException() {}\n#endif // DOCTEST_CONFIG_NO_EXCEPTIONS\n} // namespace detail\n\nnamespace {\n    using namespace detail;\n    // matching of a string against a wildcard mask (case sensitivity configurable) taken from\n    // https://www.codeproject.com/Articles/1088/Wildcard-string-compare-globbing\n    int wildcmp(const char* str, const char* wild, bool caseSensitive) {\n        const char* cp = nullptr;\n        const char* mp = nullptr;\n\n        while((*str) && (*wild != '*')) {\n            if((caseSensitive ? (*wild != *str) : (tolower(*wild) != tolower(*str))) &&\n               (*wild != '?')) {\n                return 0;\n            }\n            wild++;\n            str++;\n        }\n\n        while(*str) {\n            if(*wild == '*') {\n                if(!*++wild) {\n                    return 1;\n                }\n                mp = wild;\n                cp = str + 1;\n            } else if((caseSensitive ? (*wild == *str) : (tolower(*wild) == tolower(*str))) ||\n                      (*wild == '?')) {\n                wild++;\n                str++;\n            } else {\n                wild = mp;   //!OCLINT parameter reassignment\n                str  = cp++; //!OCLINT parameter reassignment\n            }\n        }\n\n        while(*wild == '*') {\n            wild++;\n        }\n        return !*wild;\n    }\n\n    //// C string hash function (djb2) - taken from http://www.cse.yorku.ca/~oz/hash.html\n    //unsigned hashStr(unsigned const char* str) {\n    //    unsigned long hash = 5381;\n    //    char          c;\n    //    while((c = *str++))\n    //        hash = ((hash << 5) + hash) + c; // hash * 33 + c\n    //    return hash;\n    //}\n\n    // checks if the name matches any of the filters (and can be configured what to do when empty)\n    bool matchesAny(const char* name, const std::vector<String>& filters, bool matchEmpty,\n                    bool caseSensitive) {\n        if(filters.empty() && matchEmpty)\n            return true;\n        for(auto& curr : filters)\n            if(wildcmp(name, curr.c_str(), caseSensitive))\n                return true;\n        return false;\n    }\n} // namespace\nnamespace detail {\n\n    Subcase::Subcase(const char* name, const char* file, int line)\n            : m_signature({name, file, line}) {\n        ContextState* s = g_cs;\n\n        // check subcase filters\n        if(s->subcasesStack.size() < size_t(s->subcase_filter_levels)) {\n            if(!matchesAny(m_signature.m_name, s->filters[6], true, s->case_sensitive))\n                return;\n            if(matchesAny(m_signature.m_name, s->filters[7], false, s->case_sensitive))\n                return;\n        }\n\n        // if a Subcase on the same level has already been entered\n        if(s->subcasesStack.size() < size_t(s->subcasesCurrentMaxLevel)) {\n            s->should_reenter = true;\n            return;\n        }\n\n        // push the current signature to the stack so we can check if the\n        // current stack + the current new subcase have been traversed\n        s->subcasesStack.push_back(m_signature);\n        if(s->subcasesPassed.count(s->subcasesStack) != 0) {\n            // pop - revert to previous stack since we've already passed this\n            s->subcasesStack.pop_back();\n            return;\n        }\n\n        s->subcasesCurrentMaxLevel = s->subcasesStack.size();\n        m_entered = true;\n\n        DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_start, m_signature);\n    }\n\n    DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4996) // std::uncaught_exception is deprecated in C++17\n    DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(\"-Wdeprecated-declarations\")\n    DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(\"-Wdeprecated-declarations\")\n    Subcase::~Subcase() {\n        if(m_entered) {\n            // only mark the subcase stack as passed if no subcases have been skipped\n            if(g_cs->should_reenter == false)\n                g_cs->subcasesPassed.insert(g_cs->subcasesStack);\n            g_cs->subcasesStack.pop_back();\n\n            if(std::uncaught_exception() && g_cs->shouldLogCurrentException) {\n                DOCTEST_ITERATE_THROUGH_REPORTERS(\n                        test_case_exception, {\"exception thrown in subcase - will translate later \"\n                                              \"when the whole test case has been exited (cannot \"\n                                              \"translate while there is an active exception)\",\n                                              false});\n                g_cs->shouldLogCurrentException = false;\n            }\n            DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_end, DOCTEST_EMPTY);\n        }\n    }\n    DOCTEST_CLANG_SUPPRESS_WARNING_POP\n    DOCTEST_GCC_SUPPRESS_WARNING_POP\n    DOCTEST_MSVC_SUPPRESS_WARNING_POP\n\n    Subcase::operator bool() const { return m_entered; }\n\n    Result::Result(bool passed, const String& decomposition)\n            : m_passed(passed)\n            , m_decomp(decomposition) {}\n\n    ExpressionDecomposer::ExpressionDecomposer(assertType::Enum at)\n            : m_at(at) {}\n\n    TestSuite& TestSuite::operator*(const char* in) {\n        m_test_suite = in;\n        // clear state\n        m_description       = nullptr;\n        m_skip              = false;\n        m_may_fail          = false;\n        m_should_fail       = false;\n        m_expected_failures = 0;\n        m_timeout           = 0;\n        return *this;\n    }\n\n    TestCase::TestCase(funcType test, const char* file, unsigned line, const TestSuite& test_suite,\n                       const char* type, int template_id) {\n        m_file              = file;\n        m_line              = line;\n        m_name              = nullptr; // will be later overridden in operator*\n        m_test_suite        = test_suite.m_test_suite;\n        m_description       = test_suite.m_description;\n        m_skip              = test_suite.m_skip;\n        m_may_fail          = test_suite.m_may_fail;\n        m_should_fail       = test_suite.m_should_fail;\n        m_expected_failures = test_suite.m_expected_failures;\n        m_timeout           = test_suite.m_timeout;\n\n        m_test        = test;\n        m_type        = type;\n        m_template_id = template_id;\n    }\n\n    TestCase::TestCase(const TestCase& other)\n            : TestCaseData() {\n        *this = other;\n    }\n\n    DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(26434) // hides a non-virtual function\n    DOCTEST_MSVC_SUPPRESS_WARNING(26437)           // Do not slice\n    TestCase& TestCase::operator=(const TestCase& other) {\n        static_cast<TestCaseData&>(*this) = static_cast<const TestCaseData&>(other);\n\n        m_test        = other.m_test;\n        m_type        = other.m_type;\n        m_template_id = other.m_template_id;\n        m_full_name   = other.m_full_name;\n\n        if(m_template_id != -1)\n            m_name = m_full_name.c_str();\n        return *this;\n    }\n    DOCTEST_MSVC_SUPPRESS_WARNING_POP\n\n    TestCase& TestCase::operator*(const char* in) {\n        m_name = in;\n        // make a new name with an appended type for templated test case\n        if(m_template_id != -1) {\n            m_full_name = String(m_name) + m_type;\n            // redirect the name to point to the newly constructed full name\n            m_name = m_full_name.c_str();\n        }\n        return *this;\n    }\n\n    bool TestCase::operator<(const TestCase& other) const {\n        if(m_line != other.m_line)\n            return m_line < other.m_line;\n        const int file_cmp = std::strcmp(m_file, other.m_file);\n        if(file_cmp != 0)\n            return file_cmp < 0;\n        return m_template_id < other.m_template_id;\n    }\n} // namespace detail\nnamespace {\n    using namespace detail;\n    // for sorting tests by file/line\n    bool fileOrderComparator(const TestCase* lhs, const TestCase* rhs) {\n#if DOCTEST_MSVC\n        // this is needed because MSVC gives different case for drive letters\n        // for __FILE__ when evaluated in a header and a source file\n        const int res = stricmp(lhs->m_file, rhs->m_file);\n#else  // MSVC\n        const int res = std::strcmp(lhs->m_file, rhs->m_file);\n#endif // MSVC\n        if(res != 0)\n            return res < 0;\n        if(lhs->m_line != rhs->m_line)\n            return lhs->m_line < rhs->m_line;\n        return lhs->m_template_id < rhs->m_template_id;\n    }\n\n    // for sorting tests by suite/file/line\n    bool suiteOrderComparator(const TestCase* lhs, const TestCase* rhs) {\n        const int res = std::strcmp(lhs->m_test_suite, rhs->m_test_suite);\n        if(res != 0)\n            return res < 0;\n        return fileOrderComparator(lhs, rhs);\n    }\n\n    // for sorting tests by name/suite/file/line\n    bool nameOrderComparator(const TestCase* lhs, const TestCase* rhs) {\n        const int res = std::strcmp(lhs->m_name, rhs->m_name);\n        if(res != 0)\n            return res < 0;\n        return suiteOrderComparator(lhs, rhs);\n    }\n\n    // all the registered tests\n    std::set<TestCase>& getRegisteredTests() {\n        static std::set<TestCase> data;\n        return data;\n    }\n\n#ifdef DOCTEST_CONFIG_COLORS_WINDOWS\n    HANDLE g_stdoutHandle;\n    WORD   g_origFgAttrs;\n    WORD   g_origBgAttrs;\n    bool   g_attrsInitted = false;\n\n    int colors_init() {\n        if(!g_attrsInitted) {\n            g_stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE);\n            g_attrsInitted = true;\n            CONSOLE_SCREEN_BUFFER_INFO csbiInfo;\n            GetConsoleScreenBufferInfo(g_stdoutHandle, &csbiInfo);\n            g_origFgAttrs = csbiInfo.wAttributes & ~(BACKGROUND_GREEN | BACKGROUND_RED |\n                                                     BACKGROUND_BLUE | BACKGROUND_INTENSITY);\n            g_origBgAttrs = csbiInfo.wAttributes & ~(FOREGROUND_GREEN | FOREGROUND_RED |\n                                                     FOREGROUND_BLUE | FOREGROUND_INTENSITY);\n        }\n        return 0;\n    }\n\n    int dumy_init_console_colors = colors_init();\n#endif // DOCTEST_CONFIG_COLORS_WINDOWS\n\n    DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(\"-Wdeprecated-declarations\")\n    void color_to_stream(std::ostream& s, Color::Enum code) {\n        ((void)s);    // for DOCTEST_CONFIG_COLORS_NONE or DOCTEST_CONFIG_COLORS_WINDOWS\n        ((void)code); // for DOCTEST_CONFIG_COLORS_NONE\n#ifdef DOCTEST_CONFIG_COLORS_ANSI\n        if(g_no_colors ||\n           (isatty(STDOUT_FILENO) == false && getContextOptions()->force_colors == false))\n            return;\n\n        auto col = \"\";\n        // clang-format off\n            switch(code) { //!OCLINT missing break in switch statement / unnecessary default statement in covered switch statement\n                case Color::Red:         col = \"[0;31m\"; break;\n                case Color::Green:       col = \"[0;32m\"; break;\n                case Color::Blue:        col = \"[0;34m\"; break;\n                case Color::Cyan:        col = \"[0;36m\"; break;\n                case Color::Yellow:      col = \"[0;33m\"; break;\n                case Color::Grey:        col = \"[1;30m\"; break;\n                case Color::LightGrey:   col = \"[0;37m\"; break;\n                case Color::BrightRed:   col = \"[1;31m\"; break;\n                case Color::BrightGreen: col = \"[1;32m\"; break;\n                case Color::BrightWhite: col = \"[1;37m\"; break;\n                case Color::Bright: // invalid\n                case Color::None:\n                case Color::White:\n                default:                 col = \"[0m\";\n            }\n        // clang-format on\n        s << \"\\033\" << col;\n#endif // DOCTEST_CONFIG_COLORS_ANSI\n\n#ifdef DOCTEST_CONFIG_COLORS_WINDOWS\n        if(g_no_colors ||\n           (isatty(fileno(stdout)) == false && getContextOptions()->force_colors == false))\n            return;\n\n#define DOCTEST_SET_ATTR(x) SetConsoleTextAttribute(g_stdoutHandle, x | g_origBgAttrs)\n\n        // clang-format off\n        switch (code) {\n            case Color::White:       DOCTEST_SET_ATTR(FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE); break;\n            case Color::Red:         DOCTEST_SET_ATTR(FOREGROUND_RED);                                      break;\n            case Color::Green:       DOCTEST_SET_ATTR(FOREGROUND_GREEN);                                    break;\n            case Color::Blue:        DOCTEST_SET_ATTR(FOREGROUND_BLUE);                                     break;\n            case Color::Cyan:        DOCTEST_SET_ATTR(FOREGROUND_BLUE | FOREGROUND_GREEN);                  break;\n            case Color::Yellow:      DOCTEST_SET_ATTR(FOREGROUND_RED | FOREGROUND_GREEN);                   break;\n            case Color::Grey:        DOCTEST_SET_ATTR(0);                                                   break;\n            case Color::LightGrey:   DOCTEST_SET_ATTR(FOREGROUND_INTENSITY);                                break;\n            case Color::BrightRed:   DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_RED);               break;\n            case Color::BrightGreen: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_GREEN);             break;\n            case Color::BrightWhite: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE); break;\n            case Color::None:\n            case Color::Bright: // invalid\n            default:                 DOCTEST_SET_ATTR(g_origFgAttrs);\n        }\n            // clang-format on\n#endif // DOCTEST_CONFIG_COLORS_WINDOWS\n    }\n    DOCTEST_CLANG_SUPPRESS_WARNING_POP\n\n    std::vector<const IExceptionTranslator*>& getExceptionTranslators() {\n        static std::vector<const IExceptionTranslator*> data;\n        return data;\n    }\n\n    String translateActiveException() {\n#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS\n        String res;\n        auto&  translators = getExceptionTranslators();\n        for(auto& curr : translators)\n            if(curr->translate(res))\n                return res;\n        // clang-format off\n        DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(\"-Wcatch-value\")\n        try {\n            throw;\n        } catch(std::exception& ex) {\n            return ex.what();\n        } catch(std::string& msg) {\n            return msg.c_str();\n        } catch(const char* msg) {\n            return msg;\n        } catch(...) {\n            return \"unknown exception\";\n        }\n        DOCTEST_GCC_SUPPRESS_WARNING_POP\n// clang-format on\n#else  // DOCTEST_CONFIG_NO_EXCEPTIONS\n        return \"\";\n#endif // DOCTEST_CONFIG_NO_EXCEPTIONS\n    }\n} // namespace\n\nnamespace detail {\n    // used by the macros for registering tests\n    int regTest(const TestCase& tc) {\n        getRegisteredTests().insert(tc);\n        return 0;\n    }\n\n    // sets the current test suite\n    int setTestSuite(const TestSuite& ts) {\n        doctest_detail_test_suite_ns::getCurrentTestSuite() = ts;\n        return 0;\n    }\n\n#ifdef DOCTEST_IS_DEBUGGER_ACTIVE\n    bool isDebuggerActive() { return DOCTEST_IS_DEBUGGER_ACTIVE(); }\n#else // DOCTEST_IS_DEBUGGER_ACTIVE\n#ifdef DOCTEST_PLATFORM_MAC\n    // The following function is taken directly from the following technical note:\n    // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html\n    // Returns true if the current process is being debugged (either\n    // running under the debugger or has a debugger attached post facto).\n    bool isDebuggerActive() {\n        int        mib[4];\n        kinfo_proc info;\n        size_t     size;\n        // Initialize the flags so that, if sysctl fails for some bizarre\n        // reason, we get a predictable result.\n        info.kp_proc.p_flag = 0;\n        // Initialize mib, which tells sysctl the info we want, in this case\n        // we're looking for information about a specific process ID.\n        mib[0] = CTL_KERN;\n        mib[1] = KERN_PROC;\n        mib[2] = KERN_PROC_PID;\n        mib[3] = getpid();\n        // Call sysctl.\n        size = sizeof(info);\n        if(sysctl(mib, DOCTEST_COUNTOF(mib), &info, &size, 0, 0) != 0) {\n            std::cerr << \"\\nCall to sysctl failed - unable to determine if debugger is active **\\n\";\n            return false;\n        }\n        // We're being debugged if the P_TRACED flag is set.\n        return ((info.kp_proc.p_flag & P_TRACED) != 0);\n    }\n#elif DOCTEST_MSVC || defined(__MINGW32__)\n    bool isDebuggerActive() { return ::IsDebuggerPresent() != 0; }\n#else\n    bool isDebuggerActive() { return false; }\n#endif // Platform\n#endif // DOCTEST_IS_DEBUGGER_ACTIVE\n\n    void registerExceptionTranslatorImpl(const IExceptionTranslator* et) {\n        if(std::find(getExceptionTranslators().begin(), getExceptionTranslators().end(), et) ==\n           getExceptionTranslators().end())\n            getExceptionTranslators().push_back(et);\n    }\n\n#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING\n    void toStream(std::ostream* s, char* in) { *s << in; }\n    void toStream(std::ostream* s, const char* in) { *s << in; }\n#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING\n    void toStream(std::ostream* s, bool in) { *s << std::boolalpha << in << std::noboolalpha; }\n    void toStream(std::ostream* s, float in) { *s << in; }\n    void toStream(std::ostream* s, double in) { *s << in; }\n    void toStream(std::ostream* s, double long in) { *s << in; }\n\n    void toStream(std::ostream* s, char in) { *s << in; }\n    void toStream(std::ostream* s, char signed in) { *s << in; }\n    void toStream(std::ostream* s, char unsigned in) { *s << in; }\n    void toStream(std::ostream* s, int short in) { *s << in; }\n    void toStream(std::ostream* s, int short unsigned in) { *s << in; }\n    void toStream(std::ostream* s, int in) { *s << in; }\n    void toStream(std::ostream* s, int unsigned in) { *s << in; }\n    void toStream(std::ostream* s, int long in) { *s << in; }\n    void toStream(std::ostream* s, int long unsigned in) { *s << in; }\n    void toStream(std::ostream* s, int long long in) { *s << in; }\n    void toStream(std::ostream* s, int long long unsigned in) { *s << in; }\n\n    DOCTEST_THREAD_LOCAL std::vector<IContextScope*> g_infoContexts; // for logging with INFO()\n\n    ContextScopeBase::ContextScopeBase() {\n        g_infoContexts.push_back(this);\n    }\n\n    DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4996) // std::uncaught_exception is deprecated in C++17\n    DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(\"-Wdeprecated-declarations\")\n    DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(\"-Wdeprecated-declarations\")\n    // destroy cannot be inlined into the destructor because that would mean calling stringify after\n    // ContextScope has been destroyed (base class destructors run after derived class destructors).\n    // Instead, ContextScope calls this method directly from its destructor.\n    void ContextScopeBase::destroy() {\n        if(std::uncaught_exception()) {\n            std::ostringstream s;\n            this->stringify(&s);\n            g_cs->stringifiedContexts.push_back(s.str().c_str());\n        }\n        g_infoContexts.pop_back();\n    }\n    DOCTEST_CLANG_SUPPRESS_WARNING_POP\n    DOCTEST_GCC_SUPPRESS_WARNING_POP\n    DOCTEST_MSVC_SUPPRESS_WARNING_POP\n\n} // namespace detail\nnamespace {\n    using namespace detail;\n\n    std::ostream& file_line_to_stream(std::ostream& s, const char* file, int line,\n                                      const char* tail = \"\") {\n        const auto opt = getContextOptions();\n        s << Color::LightGrey << skipPathFromFilename(file) << (opt->gnu_file_line ? \":\" : \"(\")\n          << (opt->no_line_numbers ? 0 : line) // 0 or the real num depending on the option\n          << (opt->gnu_file_line ? \":\" : \"):\") << tail;\n        return s;\n    }\n\n#if !defined(DOCTEST_CONFIG_POSIX_SIGNALS) && !defined(DOCTEST_CONFIG_WINDOWS_SEH)\n    struct FatalConditionHandler\n    {\n        void reset() {}\n    };\n#else // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH\n\n    void reportFatal(const std::string&);\n\n#ifdef DOCTEST_PLATFORM_WINDOWS\n\n    struct SignalDefs\n    {\n        DWORD id;\n        const char* name;\n    };\n    // There is no 1-1 mapping between signals and windows exceptions.\n    // Windows can easily distinguish between SO and SigSegV,\n    // but SigInt, SigTerm, etc are handled differently.\n    SignalDefs signalDefs[] = {\n            {EXCEPTION_ILLEGAL_INSTRUCTION, \"SIGILL - Illegal instruction signal\"},\n            {EXCEPTION_STACK_OVERFLOW, \"SIGSEGV - Stack overflow\"},\n            {EXCEPTION_ACCESS_VIOLATION, \"SIGSEGV - Segmentation violation signal\"},\n            {EXCEPTION_INT_DIVIDE_BY_ZERO, \"Divide by zero error\"},\n    };\n\n    struct FatalConditionHandler\n    {\n        static LONG CALLBACK handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) {\n            for(size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {\n                if(ExceptionInfo->ExceptionRecord->ExceptionCode == signalDefs[i].id) {\n                    reportFatal(signalDefs[i].name);\n                }\n            }\n            // If its not an exception we care about, pass it along.\n            // This stops us from eating debugger breaks etc.\n            return EXCEPTION_CONTINUE_SEARCH;\n        }\n\n        FatalConditionHandler() {\n            isSet = true;\n            // 32k seems enough for doctest to handle stack overflow,\n            // but the value was found experimentally, so there is no strong guarantee\n            guaranteeSize = 32 * 1024;\n            exceptionHandlerHandle = nullptr;\n            // Register as first handler in current chain\n            exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException);\n            // Pass in guarantee size to be filled\n            SetThreadStackGuarantee(&guaranteeSize);\n        }\n\n        static void reset() {\n            if(isSet) {\n                // Unregister handler and restore the old guarantee\n                RemoveVectoredExceptionHandler(exceptionHandlerHandle);\n                SetThreadStackGuarantee(&guaranteeSize);\n                exceptionHandlerHandle = nullptr;\n                isSet = false;\n            }\n        }\n\n        ~FatalConditionHandler() { reset(); }\n\n    private:\n        static bool isSet;\n        static ULONG guaranteeSize;\n        static PVOID exceptionHandlerHandle;\n    };\n\n    bool FatalConditionHandler::isSet = false;\n    ULONG FatalConditionHandler::guaranteeSize = 0;\n    PVOID FatalConditionHandler::exceptionHandlerHandle = nullptr;\n\n#else // DOCTEST_PLATFORM_WINDOWS\n\n    struct SignalDefs\n    {\n        int         id;\n        const char* name;\n    };\n    SignalDefs signalDefs[] = {{SIGINT, \"SIGINT - Terminal interrupt signal\"},\n                               {SIGILL, \"SIGILL - Illegal instruction signal\"},\n                               {SIGFPE, \"SIGFPE - Floating point error signal\"},\n                               {SIGSEGV, \"SIGSEGV - Segmentation violation signal\"},\n                               {SIGTERM, \"SIGTERM - Termination request signal\"},\n                               {SIGABRT, \"SIGABRT - Abort (abnormal termination) signal\"}};\n\n    struct FatalConditionHandler\n    {\n        static bool             isSet;\n        static struct sigaction oldSigActions[DOCTEST_COUNTOF(signalDefs)];\n        static stack_t          oldSigStack;\n        static char             altStackMem[4 * SIGSTKSZ];\n\n        static void handleSignal(int sig) {\n            const char* name = \"<unknown signal>\";\n            for(std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {\n                SignalDefs& def = signalDefs[i];\n                if(sig == def.id) {\n                    name = def.name;\n                    break;\n                }\n            }\n            reset();\n            reportFatal(name);\n            raise(sig);\n        }\n\n        FatalConditionHandler() {\n            isSet = true;\n            stack_t sigStack;\n            sigStack.ss_sp    = altStackMem;\n            sigStack.ss_size  = sizeof(altStackMem);\n            sigStack.ss_flags = 0;\n            sigaltstack(&sigStack, &oldSigStack);\n            struct sigaction sa = {};\n            sa.sa_handler       = handleSignal; // NOLINT\n            sa.sa_flags         = SA_ONSTACK;\n            for(std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {\n                sigaction(signalDefs[i].id, &sa, &oldSigActions[i]);\n            }\n        }\n\n        ~FatalConditionHandler() { reset(); }\n        static void reset() {\n            if(isSet) {\n                // Set signals back to previous values -- hopefully nobody overwrote them in the meantime\n                for(std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {\n                    sigaction(signalDefs[i].id, &oldSigActions[i], nullptr);\n                }\n                // Return the old stack\n                sigaltstack(&oldSigStack, nullptr);\n                isSet = false;\n            }\n        }\n    };\n\n    bool             FatalConditionHandler::isSet                                      = false;\n    struct sigaction FatalConditionHandler::oldSigActions[DOCTEST_COUNTOF(signalDefs)] = {};\n    stack_t          FatalConditionHandler::oldSigStack                                = {};\n    char             FatalConditionHandler::altStackMem[]                              = {};\n\n#endif // DOCTEST_PLATFORM_WINDOWS\n#endif // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH\n\n} // namespace\n\nnamespace {\n    using namespace detail;\n\n#ifdef DOCTEST_PLATFORM_WINDOWS\n#define DOCTEST_OUTPUT_DEBUG_STRING(text) ::OutputDebugStringA(text)\n#else\n    // TODO: integration with XCode and other IDEs\n#define DOCTEST_OUTPUT_DEBUG_STRING(text) // NOLINT(clang-diagnostic-unused-macros)\n#endif // Platform\n\n    void addAssert(assertType::Enum at) {\n        if((at & assertType::is_warn) == 0) //!OCLINT bitwise operator in conditional\n            g_cs->numAssertsCurrentTest_atomic++;\n    }\n\n    void addFailedAssert(assertType::Enum at) {\n        if((at & assertType::is_warn) == 0) //!OCLINT bitwise operator in conditional\n            g_cs->numAssertsFailedCurrentTest_atomic++;\n    }\n\n#if defined(DOCTEST_CONFIG_POSIX_SIGNALS) || defined(DOCTEST_CONFIG_WINDOWS_SEH)\n    void reportFatal(const std::string& message) {\n        g_cs->failure_flags |= TestCaseFailureReason::Crash;\n\n        DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_exception, {message.c_str(), true});\n\n        while(g_cs->subcasesStack.size()) {\n            g_cs->subcasesStack.pop_back();\n            DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_end, DOCTEST_EMPTY);\n        }\n\n        g_cs->finalizeTestCaseData();\n\n        DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_end, *g_cs);\n\n        DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_end, *g_cs);\n    }\n#endif // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH\n} // namespace\nnamespace detail {\n\n    ResultBuilder::ResultBuilder(assertType::Enum at, const char* file, int line, const char* expr,\n                                 const char* exception_type, const char* exception_string) {\n        m_test_case        = g_cs->currentTest;\n        m_at               = at;\n        m_file             = file;\n        m_line             = line;\n        m_expr             = expr;\n        m_failed           = true;\n        m_threw            = false;\n        m_threw_as         = false;\n        m_exception_type   = exception_type;\n        m_exception_string = exception_string;\n#if DOCTEST_MSVC\n        if(m_expr[0] == ' ') // this happens when variadic macros are disabled under MSVC\n            ++m_expr;\n#endif // MSVC\n    }\n\n    void ResultBuilder::setResult(const Result& res) {\n        m_decomp = res.m_decomp;\n        m_failed = !res.m_passed;\n    }\n\n    void ResultBuilder::translateException() {\n        m_threw     = true;\n        m_exception = translateActiveException();\n    }\n\n    bool ResultBuilder::log() {\n        if(m_at & assertType::is_throws) { //!OCLINT bitwise operator in conditional\n            m_failed = !m_threw;\n        } else if((m_at & assertType::is_throws_as) && (m_at & assertType::is_throws_with)) { //!OCLINT\n            m_failed = !m_threw_as || (m_exception != m_exception_string);\n        } else if(m_at & assertType::is_throws_as) { //!OCLINT bitwise operator in conditional\n            m_failed = !m_threw_as;\n        } else if(m_at & assertType::is_throws_with) { //!OCLINT bitwise operator in conditional\n            m_failed = m_exception != m_exception_string;\n        } else if(m_at & assertType::is_nothrow) { //!OCLINT bitwise operator in conditional\n            m_failed = m_threw;\n        }\n\n        if(m_exception.size())\n            m_exception = String(\"\\\"\") + m_exception + \"\\\"\";\n\n        if(is_running_in_test) {\n            addAssert(m_at);\n            DOCTEST_ITERATE_THROUGH_REPORTERS(log_assert, *this);\n\n            if(m_failed)\n                addFailedAssert(m_at);\n        } else if(m_failed) {\n            failed_out_of_a_testing_context(*this);\n        }\n\n        return m_failed && isDebuggerActive() &&\n               !getContextOptions()->no_breaks; // break into debugger\n    }\n\n    void ResultBuilder::react() const {\n        if(m_failed && checkIfShouldThrow(m_at))\n            throwException();\n    }\n\n    void failed_out_of_a_testing_context(const AssertData& ad) {\n        if(g_cs->ah)\n            g_cs->ah(ad);\n        else\n            std::abort();\n    }\n\n    void decomp_assert(assertType::Enum at, const char* file, int line, const char* expr,\n                       Result result) {\n        bool failed = !result.m_passed;\n\n        // ###################################################################################\n        // IF THE DEBUGGER BREAKS HERE - GO 1 LEVEL UP IN THE CALLSTACK FOR THE FAILING ASSERT\n        // THIS IS THE EFFECT OF HAVING 'DOCTEST_CONFIG_SUPER_FAST_ASSERTS' DEFINED\n        // ###################################################################################\n        DOCTEST_ASSERT_OUT_OF_TESTS(result.m_decomp);\n        DOCTEST_ASSERT_IN_TESTS(result.m_decomp);\n    }\n\n    MessageBuilder::MessageBuilder(const char* file, int line, assertType::Enum severity) {\n        m_stream   = getTlsOss();\n        m_file     = file;\n        m_line     = line;\n        m_severity = severity;\n    }\n\n    IExceptionTranslator::IExceptionTranslator()  = default;\n    IExceptionTranslator::~IExceptionTranslator() = default;\n\n    bool MessageBuilder::log() {\n        m_string = getTlsOssResult();\n        DOCTEST_ITERATE_THROUGH_REPORTERS(log_message, *this);\n\n        const bool isWarn = m_severity & assertType::is_warn;\n\n        // warn is just a message in this context so we don't treat it as an assert\n        if(!isWarn) {\n            addAssert(m_severity);\n            addFailedAssert(m_severity);\n        }\n\n        return isDebuggerActive() && !getContextOptions()->no_breaks && !isWarn; // break\n    }\n\n    void MessageBuilder::react() {\n        if(m_severity & assertType::is_require) //!OCLINT bitwise operator in conditional\n            throwException();\n    }\n\n    MessageBuilder::~MessageBuilder() = default;\n} // namespace detail\nnamespace {\n    using namespace detail;\n\n    template <typename Ex>\n    DOCTEST_NORETURN void throw_exception(Ex const& e) {\n#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS\n        throw e;\n#else  // DOCTEST_CONFIG_NO_EXCEPTIONS\n        std::cerr << \"doctest will terminate because it needed to throw an exception.\\n\"\n                  << \"The message was: \" << e.what() << '\\n';\n        std::terminate();\n#endif // DOCTEST_CONFIG_NO_EXCEPTIONS\n    }\n\n#define DOCTEST_INTERNAL_ERROR(msg)                                                                \\\n    throw_exception(std::logic_error(                                                              \\\n            __FILE__ \":\" DOCTEST_TOSTR(__LINE__) \": Internal doctest error: \" msg))\n\n    // clang-format off\n\n// =================================================================================================\n// The following code has been taken verbatim from Catch2/include/internal/catch_xmlwriter.h/cpp\n// This is done so cherry-picking bug fixes is trivial - even the style/formatting is untouched.\n// =================================================================================================\n\n    class XmlEncode {\n    public:\n        enum ForWhat { ForTextNodes, ForAttributes };\n\n        XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes );\n\n        void encodeTo( std::ostream& os ) const;\n\n        friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode );\n\n    private:\n        std::string m_str;\n        ForWhat m_forWhat;\n    };\n\n    class XmlWriter {\n    public:\n\n        class ScopedElement {\n        public:\n            ScopedElement( XmlWriter* writer );\n\n            ScopedElement( ScopedElement&& other ) DOCTEST_NOEXCEPT;\n            ScopedElement& operator=( ScopedElement&& other ) DOCTEST_NOEXCEPT;\n\n            ~ScopedElement();\n\n            ScopedElement& writeText( std::string const& text, bool indent = true );\n\n            template<typename T>\n            ScopedElement& writeAttribute( std::string const& name, T const& attribute ) {\n                m_writer->writeAttribute( name, attribute );\n                return *this;\n            }\n\n        private:\n            mutable XmlWriter* m_writer = nullptr;\n        };\n\n        XmlWriter( std::ostream& os = std::cout );\n        ~XmlWriter();\n\n        XmlWriter( XmlWriter const& ) = delete;\n        XmlWriter& operator=( XmlWriter const& ) = delete;\n\n        XmlWriter& startElement( std::string const& name );\n\n        ScopedElement scopedElement( std::string const& name );\n\n        XmlWriter& endElement();\n\n        XmlWriter& writeAttribute( std::string const& name, std::string const& attribute );\n\n        XmlWriter& writeAttribute( std::string const& name, const char* attribute );\n\n        XmlWriter& writeAttribute( std::string const& name, bool attribute );\n\n        template<typename T>\n        XmlWriter& writeAttribute( std::string const& name, T const& attribute ) {\n        std::stringstream rss;\n            rss << attribute;\n            return writeAttribute( name, rss.str() );\n        }\n\n        XmlWriter& writeText( std::string const& text, bool indent = true );\n\n        //XmlWriter& writeComment( std::string const& text );\n\n        //void writeStylesheetRef( std::string const& url );\n\n        //XmlWriter& writeBlankLine();\n\n        void ensureTagClosed();\n\n    private:\n\n        void writeDeclaration();\n\n        void newlineIfNecessary();\n\n        bool m_tagIsOpen = false;\n        bool m_needsNewline = false;\n        std::vector<std::string> m_tags;\n        std::string m_indent;\n        std::ostream& m_os;\n    };\n\n// =================================================================================================\n// The following code has been taken verbatim from Catch2/include/internal/catch_xmlwriter.h/cpp\n// This is done so cherry-picking bug fixes is trivial - even the style/formatting is untouched.\n// =================================================================================================\n\nusing uchar = unsigned char;\n\nnamespace {\n\n    size_t trailingBytes(unsigned char c) {\n        if ((c & 0xE0) == 0xC0) {\n            return 2;\n        }\n        if ((c & 0xF0) == 0xE0) {\n            return 3;\n        }\n        if ((c & 0xF8) == 0xF0) {\n            return 4;\n        }\n        DOCTEST_INTERNAL_ERROR(\"Invalid multibyte utf-8 start byte encountered\");\n    }\n\n    uint32_t headerValue(unsigned char c) {\n        if ((c & 0xE0) == 0xC0) {\n            return c & 0x1F;\n        }\n        if ((c & 0xF0) == 0xE0) {\n            return c & 0x0F;\n        }\n        if ((c & 0xF8) == 0xF0) {\n            return c & 0x07;\n        }\n        DOCTEST_INTERNAL_ERROR(\"Invalid multibyte utf-8 start byte encountered\");\n    }\n\n    void hexEscapeChar(std::ostream& os, unsigned char c) {\n        std::ios_base::fmtflags f(os.flags());\n        os << \"\\\\x\"\n            << std::uppercase << std::hex << std::setfill('0') << std::setw(2)\n            << static_cast<int>(c);\n        os.flags(f);\n    }\n\n} // anonymous namespace\n\n    XmlEncode::XmlEncode( std::string const& str, ForWhat forWhat )\n    :   m_str( str ),\n        m_forWhat( forWhat )\n    {}\n\n    void XmlEncode::encodeTo( std::ostream& os ) const {\n        // Apostrophe escaping not necessary if we always use \" to write attributes\n        // (see: http://www.w3.org/TR/xml/#syntax)\n\n        for( std::size_t idx = 0; idx < m_str.size(); ++ idx ) {\n            uchar c = m_str[idx];\n            switch (c) {\n            case '<':   os << \"&lt;\"; break;\n            case '&':   os << \"&amp;\"; break;\n\n            case '>':\n                // See: http://www.w3.org/TR/xml/#syntax\n                if (idx > 2 && m_str[idx - 1] == ']' && m_str[idx - 2] == ']')\n                    os << \"&gt;\";\n                else\n                    os << c;\n                break;\n\n            case '\\\"':\n                if (m_forWhat == ForAttributes)\n                    os << \"&quot;\";\n                else\n                    os << c;\n                break;\n\n            default:\n                // Check for control characters and invalid utf-8\n\n                // Escape control characters in standard ascii\n                // see http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0\n                if (c < 0x09 || (c > 0x0D && c < 0x20) || c == 0x7F) {\n                    hexEscapeChar(os, c);\n                    break;\n                }\n\n                // Plain ASCII: Write it to stream\n                if (c < 0x7F) {\n                    os << c;\n                    break;\n                }\n\n                // UTF-8 territory\n                // Check if the encoding is valid and if it is not, hex escape bytes.\n                // Important: We do not check the exact decoded values for validity, only the encoding format\n                // First check that this bytes is a valid lead byte:\n                // This means that it is not encoded as 1111 1XXX\n                // Or as 10XX XXXX\n                if (c <  0xC0 ||\n                    c >= 0xF8) {\n                    hexEscapeChar(os, c);\n                    break;\n                }\n\n                auto encBytes = trailingBytes(c);\n                // Are there enough bytes left to avoid accessing out-of-bounds memory?\n                if (idx + encBytes - 1 >= m_str.size()) {\n                    hexEscapeChar(os, c);\n                    break;\n                }\n                // The header is valid, check data\n                // The next encBytes bytes must together be a valid utf-8\n                // This means: bitpattern 10XX XXXX and the extracted value is sane (ish)\n                bool valid = true;\n                uint32_t value = headerValue(c);\n                for (std::size_t n = 1; n < encBytes; ++n) {\n                    uchar nc = m_str[idx + n];\n                    valid &= ((nc & 0xC0) == 0x80);\n                    value = (value << 6) | (nc & 0x3F);\n                }\n\n                if (\n                    // Wrong bit pattern of following bytes\n                    (!valid) ||\n                    // Overlong encodings\n                    (value < 0x80) ||\n                    (                 value < 0x800   && encBytes > 2) || // removed \"0x80 <= value &&\" because redundant\n                    (0x800 < value && value < 0x10000 && encBytes > 3) ||\n                    // Encoded value out of range\n                    (value >= 0x110000)\n                    ) {\n                    hexEscapeChar(os, c);\n                    break;\n                }\n\n                // If we got here, this is in fact a valid(ish) utf-8 sequence\n                for (std::size_t n = 0; n < encBytes; ++n) {\n                    os << m_str[idx + n];\n                }\n                idx += encBytes - 1;\n                break;\n            }\n        }\n    }\n\n    std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ) {\n        xmlEncode.encodeTo( os );\n        return os;\n    }\n\n    XmlWriter::ScopedElement::ScopedElement( XmlWriter* writer )\n    :   m_writer( writer )\n    {}\n\n    XmlWriter::ScopedElement::ScopedElement( ScopedElement&& other ) DOCTEST_NOEXCEPT\n    :   m_writer( other.m_writer ){\n        other.m_writer = nullptr;\n    }\n    XmlWriter::ScopedElement& XmlWriter::ScopedElement::operator=( ScopedElement&& other ) DOCTEST_NOEXCEPT {\n        if ( m_writer ) {\n            m_writer->endElement();\n        }\n        m_writer = other.m_writer;\n        other.m_writer = nullptr;\n        return *this;\n    }\n\n\n    XmlWriter::ScopedElement::~ScopedElement() {\n        if( m_writer )\n            m_writer->endElement();\n    }\n\n    XmlWriter::ScopedElement& XmlWriter::ScopedElement::writeText( std::string const& text, bool indent ) {\n        m_writer->writeText( text, indent );\n        return *this;\n    }\n\n    XmlWriter::XmlWriter( std::ostream& os ) : m_os( os )\n    {\n        writeDeclaration();\n    }\n\n    XmlWriter::~XmlWriter() {\n        while( !m_tags.empty() )\n            endElement();\n    }\n\n    XmlWriter& XmlWriter::startElement( std::string const& name ) {\n        ensureTagClosed();\n        newlineIfNecessary();\n        m_os << m_indent << '<' << name;\n        m_tags.push_back( name );\n        m_indent += \"  \";\n        m_tagIsOpen = true;\n        return *this;\n    }\n\n    XmlWriter::ScopedElement XmlWriter::scopedElement( std::string const& name ) {\n        ScopedElement scoped( this );\n        startElement( name );\n        return scoped;\n    }\n\n    XmlWriter& XmlWriter::endElement() {\n        newlineIfNecessary();\n        m_indent = m_indent.substr( 0, m_indent.size()-2 );\n        if( m_tagIsOpen ) {\n            m_os << \"/>\";\n            m_tagIsOpen = false;\n        }\n        else {\n            m_os << m_indent << \"</\" << m_tags.back() << \">\";\n        }\n        m_os << std::endl;\n        m_tags.pop_back();\n        return *this;\n    }\n\n    XmlWriter& XmlWriter::writeAttribute( std::string const& name, std::string const& attribute ) {\n        if( !name.empty() && !attribute.empty() )\n            m_os << ' ' << name << \"=\\\"\" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '\"';\n        return *this;\n    }\n\n    XmlWriter& XmlWriter::writeAttribute( std::string const& name, const char* attribute ) {\n        if( !name.empty() && attribute && attribute[0] != '\\0' )\n            m_os << ' ' << name << \"=\\\"\" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '\"';\n        return *this;\n    }\n\n    XmlWriter& XmlWriter::writeAttribute( std::string const& name, bool attribute ) {\n        m_os << ' ' << name << \"=\\\"\" << ( attribute ? \"true\" : \"false\" ) << '\"';\n        return *this;\n    }\n\n    XmlWriter& XmlWriter::writeText( std::string const& text, bool indent ) {\n        if( !text.empty() ){\n            bool tagWasOpen = m_tagIsOpen;\n            ensureTagClosed();\n            if( tagWasOpen && indent )\n                m_os << m_indent;\n            m_os << XmlEncode( text );\n            m_needsNewline = true;\n        }\n        return *this;\n    }\n\n    //XmlWriter& XmlWriter::writeComment( std::string const& text ) {\n    //    ensureTagClosed();\n    //    m_os << m_indent << \"<!--\" << text << \"-->\";\n    //    m_needsNewline = true;\n    //    return *this;\n    //}\n\n    //void XmlWriter::writeStylesheetRef( std::string const& url ) {\n    //    m_os << \"<?xml-stylesheet type=\\\"text/xsl\\\" href=\\\"\" << url << \"\\\"?>\\n\";\n    //}\n\n    //XmlWriter& XmlWriter::writeBlankLine() {\n    //    ensureTagClosed();\n    //    m_os << '\\n';\n    //    return *this;\n    //}\n\n    void XmlWriter::ensureTagClosed() {\n        if( m_tagIsOpen ) {\n            m_os << \">\" << std::endl;\n            m_tagIsOpen = false;\n        }\n    }\n\n    void XmlWriter::writeDeclaration() {\n        m_os << \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n\";\n    }\n\n    void XmlWriter::newlineIfNecessary() {\n        if( m_needsNewline ) {\n            m_os << std::endl;\n            m_needsNewline = false;\n        }\n    }\n\n// =================================================================================================\n// End of copy-pasted code from Catch\n// =================================================================================================\n\n    // clang-format on\n\n    struct XmlReporter : public IReporter\n    {\n        XmlWriter  xml;\n        std::mutex mutex;\n\n        // caching pointers/references to objects of these types - safe to do\n        const ContextOptions& opt;\n        const TestCaseData*   tc = nullptr;\n\n        XmlReporter(const ContextOptions& co)\n                : xml(*co.cout)\n                , opt(co) {}\n\n        void log_contexts() {\n            int num_contexts = get_num_active_contexts();\n            if(num_contexts) {\n                auto              contexts = get_active_contexts();\n                std::stringstream ss;\n                for(int i = 0; i < num_contexts; ++i) {\n                    contexts[i]->stringify(&ss);\n                    xml.scopedElement(\"Info\").writeText(ss.str());\n                    ss.str(\"\");\n                }\n            }\n        }\n\n        unsigned line(unsigned l) const { return opt.no_line_numbers ? 0 : l; }\n\n        void test_case_start_impl(const TestCaseData& in) {\n            bool open_ts_tag = false;\n            if(tc != nullptr) { // we have already opened a test suite\n                if(strcmp(tc->m_test_suite, in.m_test_suite) != 0) {\n                    xml.endElement();\n                    open_ts_tag = true;\n                }\n            }\n            else {\n                open_ts_tag = true; // first test case ==> first test suite\n            }\n\n            if(open_ts_tag) {\n                xml.startElement(\"TestSuite\");\n                xml.writeAttribute(\"name\", in.m_test_suite);\n            }\n\n            tc = &in;\n            xml.startElement(\"TestCase\")\n                    .writeAttribute(\"name\", in.m_name)\n                    .writeAttribute(\"filename\", skipPathFromFilename(in.m_file))\n                    .writeAttribute(\"line\", line(in.m_line))\n                    .writeAttribute(\"description\", in.m_description);\n\n            if(Approx(in.m_timeout) != 0)\n                xml.writeAttribute(\"timeout\", in.m_timeout);\n            if(in.m_may_fail)\n                xml.writeAttribute(\"may_fail\", true);\n            if(in.m_should_fail)\n                xml.writeAttribute(\"should_fail\", true);\n        }\n\n        // =========================================================================================\n        // WHAT FOLLOWS ARE OVERRIDES OF THE VIRTUAL METHODS OF THE REPORTER INTERFACE\n        // =========================================================================================\n\n        void report_query(const QueryData& in) override {\n            test_run_start();\n            if(opt.list_reporters) {\n                for(auto& curr : getListeners())\n                    xml.scopedElement(\"Listener\")\n                            .writeAttribute(\"priority\", curr.first.first)\n                            .writeAttribute(\"name\", curr.first.second);\n                for(auto& curr : getReporters())\n                    xml.scopedElement(\"Reporter\")\n                            .writeAttribute(\"priority\", curr.first.first)\n                            .writeAttribute(\"name\", curr.first.second);\n            } else if(opt.count || opt.list_test_cases) {\n                for(unsigned i = 0; i < in.num_data; ++i)\n                    xml.scopedElement(\"TestCase\").writeAttribute(\"name\", in.data[i]);\n                xml.scopedElement(\"OverallResultsTestCases\")\n                        .writeAttribute(\"unskipped\", in.run_stats->numTestCasesPassingFilters);\n            } else if(opt.list_test_suites) {\n                for(unsigned i = 0; i < in.num_data; ++i)\n                    xml.scopedElement(\"TestSuite\").writeAttribute(\"name\", in.data[i]);\n                xml.scopedElement(\"OverallResultsTestCases\")\n                        .writeAttribute(\"unskipped\", in.run_stats->numTestCasesPassingFilters);\n                xml.scopedElement(\"OverallResultsTestSuites\")\n                        .writeAttribute(\"unskipped\", in.run_stats->numTestSuitesPassingFilters);\n            }\n            xml.endElement();\n        }\n\n        void test_run_start() override {\n            // remove .exe extension - mainly to have the same output on UNIX and Windows\n            std::string binary_name = skipPathFromFilename(opt.binary_name.c_str());\n#ifdef DOCTEST_PLATFORM_WINDOWS\n            if(binary_name.rfind(\".exe\") != std::string::npos)\n                binary_name = binary_name.substr(0, binary_name.length() - 4);\n#endif // DOCTEST_PLATFORM_WINDOWS\n\n            xml.startElement(\"doctest\").writeAttribute(\"binary\", binary_name);\n            if(opt.no_version == false)\n                xml.writeAttribute(\"version\", DOCTEST_VERSION_STR);\n\n            // only the consequential ones (TODO: filters)\n            xml.scopedElement(\"Options\")\n                    .writeAttribute(\"order_by\", opt.order_by.c_str())\n                    .writeAttribute(\"rand_seed\", opt.rand_seed)\n                    .writeAttribute(\"first\", opt.first)\n                    .writeAttribute(\"last\", opt.last)\n                    .writeAttribute(\"abort_after\", opt.abort_after)\n                    .writeAttribute(\"subcase_filter_levels\", opt.subcase_filter_levels)\n                    .writeAttribute(\"case_sensitive\", opt.case_sensitive)\n                    .writeAttribute(\"no_throw\", opt.no_throw)\n                    .writeAttribute(\"no_skip\", opt.no_skip);\n        }\n\n        void test_run_end(const TestRunStats& p) override {\n            if(tc) // the TestSuite tag - only if there has been at least 1 test case\n                xml.endElement();\n\n            xml.scopedElement(\"OverallResultsAsserts\")\n                    .writeAttribute(\"successes\", p.numAsserts - p.numAssertsFailed)\n                    .writeAttribute(\"failures\", p.numAssertsFailed);\n\n            xml.startElement(\"OverallResultsTestCases\")\n                    .writeAttribute(\"successes\",\n                                    p.numTestCasesPassingFilters - p.numTestCasesFailed)\n                    .writeAttribute(\"failures\", p.numTestCasesFailed);\n            if(opt.no_skipped_summary == false)\n                xml.writeAttribute(\"skipped\", p.numTestCases - p.numTestCasesPassingFilters);\n            xml.endElement();\n\n            xml.endElement();\n        }\n\n        void test_case_start(const TestCaseData& in) override {\n            test_case_start_impl(in);\n            xml.ensureTagClosed();\n        }\n\n        void test_case_reenter(const TestCaseData&) override {}\n\n        void test_case_end(const CurrentTestCaseStats& st) override {\n            xml.startElement(\"OverallResultsAsserts\")\n                    .writeAttribute(\"successes\",\n                                    st.numAssertsCurrentTest - st.numAssertsFailedCurrentTest)\n                    .writeAttribute(\"failures\", st.numAssertsFailedCurrentTest);\n            if(opt.duration)\n                xml.writeAttribute(\"duration\", st.seconds);\n            if(tc->m_expected_failures)\n                xml.writeAttribute(\"expected_failures\", tc->m_expected_failures);\n            xml.endElement();\n\n            xml.endElement();\n        }\n\n        void test_case_exception(const TestCaseException& e) override {\n            std::lock_guard<std::mutex> lock(mutex);\n\n            xml.scopedElement(\"Exception\")\n                    .writeAttribute(\"crash\", e.is_crash)\n                    .writeText(e.error_string.c_str());\n        }\n\n        void subcase_start(const SubcaseSignature& in) override {\n            std::lock_guard<std::mutex> lock(mutex);\n\n            xml.startElement(\"SubCase\")\n                    .writeAttribute(\"name\", in.m_name)\n                    .writeAttribute(\"filename\", skipPathFromFilename(in.m_file))\n                    .writeAttribute(\"line\", line(in.m_line));\n            xml.ensureTagClosed();\n        }\n\n        void subcase_end() override { xml.endElement(); }\n\n        void log_assert(const AssertData& rb) override {\n            if(!rb.m_failed && !opt.success)\n                return;\n\n            std::lock_guard<std::mutex> lock(mutex);\n\n            xml.startElement(\"Expression\")\n                    .writeAttribute(\"success\", !rb.m_failed)\n                    .writeAttribute(\"type\", assertString(rb.m_at))\n                    .writeAttribute(\"filename\", skipPathFromFilename(rb.m_file))\n                    .writeAttribute(\"line\", line(rb.m_line));\n\n            xml.scopedElement(\"Original\").writeText(rb.m_expr);\n\n            if(rb.m_threw)\n                xml.scopedElement(\"Exception\").writeText(rb.m_exception.c_str());\n\n            if(rb.m_at & assertType::is_throws_as)\n                xml.scopedElement(\"ExpectedException\").writeText(rb.m_exception_type);\n            if(rb.m_at & assertType::is_throws_with)\n                xml.scopedElement(\"ExpectedExceptionString\").writeText(rb.m_exception_string);\n            if((rb.m_at & assertType::is_normal) && !rb.m_threw)\n                xml.scopedElement(\"Expanded\").writeText(rb.m_decomp.c_str());\n\n            log_contexts();\n\n            xml.endElement();\n        }\n\n        void log_message(const MessageData& mb) override {\n            std::lock_guard<std::mutex> lock(mutex);\n\n            xml.startElement(\"Message\")\n                    .writeAttribute(\"type\", failureString(mb.m_severity))\n                    .writeAttribute(\"filename\", skipPathFromFilename(mb.m_file))\n                    .writeAttribute(\"line\", line(mb.m_line));\n\n            xml.scopedElement(\"Text\").writeText(mb.m_string.c_str());\n\n            log_contexts();\n\n            xml.endElement();\n        }\n\n        void test_case_skipped(const TestCaseData& in) override {\n            if(opt.no_skipped_summary == false) {\n                test_case_start_impl(in);\n                xml.writeAttribute(\"skipped\", \"true\");\n                xml.endElement();\n            }\n        }\n    };\n\n    DOCTEST_REGISTER_REPORTER(\"xml\", 0, XmlReporter);\n\n    struct Whitespace\n    {\n        int nrSpaces;\n        explicit Whitespace(int nr)\n                : nrSpaces(nr) {}\n    };\n\n    std::ostream& operator<<(std::ostream& out, const Whitespace& ws) {\n        if(ws.nrSpaces != 0)\n            out << std::setw(ws.nrSpaces) << ' ';\n        return out;\n    }\n\n    struct ConsoleReporter : public IReporter\n    {\n        std::ostream&                 s;\n        bool                          hasLoggedCurrentTestStart;\n        std::vector<SubcaseSignature> subcasesStack;\n        std::mutex                    mutex;\n\n        // caching pointers/references to objects of these types - safe to do\n        const ContextOptions& opt;\n        const TestCaseData*   tc;\n\n        ConsoleReporter(const ContextOptions& co)\n                : s(*co.cout)\n                , opt(co) {}\n\n        ConsoleReporter(const ContextOptions& co, std::ostream& ostr)\n                : s(ostr)\n                , opt(co) {}\n\n        // =========================================================================================\n        // WHAT FOLLOWS ARE HELPERS USED BY THE OVERRIDES OF THE VIRTUAL METHODS OF THE INTERFACE\n        // =========================================================================================\n\n        void separator_to_stream() {\n            s << Color::Yellow\n              << \"===============================================================================\"\n                 \"\\n\";\n        }\n\n        const char* getSuccessOrFailString(bool success, assertType::Enum at,\n                                           const char* success_str) {\n            if(success)\n                return success_str;\n            return failureString(at);\n        }\n\n        Color::Enum getSuccessOrFailColor(bool success, assertType::Enum at) {\n            return success ? Color::BrightGreen :\n                             (at & assertType::is_warn) ? Color::Yellow : Color::Red;\n        }\n\n        void successOrFailColoredStringToStream(bool success, assertType::Enum at,\n                                                const char* success_str = \"SUCCESS\") {\n            s << getSuccessOrFailColor(success, at)\n              << getSuccessOrFailString(success, at, success_str) << \": \";\n        }\n\n        void log_contexts() {\n            int num_contexts = get_num_active_contexts();\n            if(num_contexts) {\n                auto contexts = get_active_contexts();\n\n                s << Color::None << \"  logged: \";\n                for(int i = 0; i < num_contexts; ++i) {\n                    s << (i == 0 ? \"\" : \"          \");\n                    contexts[i]->stringify(&s);\n                    s << \"\\n\";\n                }\n            }\n\n            s << \"\\n\";\n        }\n\n        void logTestStart() {\n            if(hasLoggedCurrentTestStart)\n                return;\n\n            separator_to_stream();\n            file_line_to_stream(s, tc->m_file, tc->m_line, \"\\n\");\n            if(tc->m_description)\n                s << Color::Yellow << \"DESCRIPTION: \" << Color::None << tc->m_description << \"\\n\";\n            if(tc->m_test_suite && tc->m_test_suite[0] != '\\0')\n                s << Color::Yellow << \"TEST SUITE: \" << Color::None << tc->m_test_suite << \"\\n\";\n            if(strncmp(tc->m_name, \"  Scenario:\", 11) != 0)\n                s << Color::None << \"TEST CASE:  \";\n            s << Color::None << tc->m_name << \"\\n\";\n\n            for(auto& curr : subcasesStack)\n                if(curr.m_name[0] != '\\0')\n                    s << \"  \" << curr.m_name << \"\\n\";\n\n            s << \"\\n\";\n\n            hasLoggedCurrentTestStart = true;\n        }\n\n        void printVersion() {\n            if(opt.no_version == false)\n                s << Color::Cyan << \"[doctest] \" << Color::None << \"doctest version is \\\"\"\n                  << DOCTEST_VERSION_STR << \"\\\"\\n\";\n        }\n\n        void printIntro() {\n            printVersion();\n            s << Color::Cyan << \"[doctest] \" << Color::None\n              << \"run with \\\"--\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"help\\\" for options\\n\";\n        }\n\n        void printHelp() {\n            int sizePrefixDisplay = static_cast<int>(strlen(DOCTEST_OPTIONS_PREFIX_DISPLAY));\n            printVersion();\n            // clang-format off\n            s << Color::Cyan << \"[doctest]\\n\" << Color::None;\n            s << Color::Cyan << \"[doctest] \" << Color::None;\n            s << \"boolean values: \\\"1/on/yes/true\\\" or \\\"0/off/no/false\\\"\\n\";\n            s << Color::Cyan << \"[doctest] \" << Color::None;\n            s << \"filter  values: \\\"str1,str2,str3\\\" (comma separated strings)\\n\";\n            s << Color::Cyan << \"[doctest]\\n\" << Color::None;\n            s << Color::Cyan << \"[doctest] \" << Color::None;\n            s << \"filters use wildcards for matching strings\\n\";\n            s << Color::Cyan << \"[doctest] \" << Color::None;\n            s << \"something passes a filter if any of the strings in a filter matches\\n\";\n#ifndef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS\n            s << Color::Cyan << \"[doctest]\\n\" << Color::None;\n            s << Color::Cyan << \"[doctest] \" << Color::None;\n            s << \"ALL FLAGS, OPTIONS AND FILTERS ALSO AVAILABLE WITH A \\\"\" DOCTEST_CONFIG_OPTIONS_PREFIX \"\\\" PREFIX!!!\\n\";\n#endif\n            s << Color::Cyan << \"[doctest]\\n\" << Color::None;\n            s << Color::Cyan << \"[doctest] \" << Color::None;\n            s << \"Query flags - the program quits after them. Available:\\n\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"?,   --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"help, -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"h                      \"\n              << Whitespace(sizePrefixDisplay*0) <<  \"prints this message\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"v,   --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"version                       \"\n              << Whitespace(sizePrefixDisplay*1) << \"prints the version\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"c,   --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"count                         \"\n              << Whitespace(sizePrefixDisplay*1) << \"prints the number of matching tests\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"ltc, --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"list-test-cases               \"\n              << Whitespace(sizePrefixDisplay*1) << \"lists all matching tests by name\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"lts, --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"list-test-suites              \"\n              << Whitespace(sizePrefixDisplay*1) << \"lists all matching test suites\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"lr,  --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"list-reporters                \"\n              << Whitespace(sizePrefixDisplay*1) << \"lists all registered reporters\\n\\n\";\n            // ================================================================================== << 79\n            s << Color::Cyan << \"[doctest] \" << Color::None;\n            s << \"The available <int>/<string> options/filters are:\\n\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"tc,  --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"test-case=<filters>           \"\n              << Whitespace(sizePrefixDisplay*1) << \"filters     tests by their name\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"tce, --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"test-case-exclude=<filters>   \"\n              << Whitespace(sizePrefixDisplay*1) << \"filters OUT tests by their name\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"sf,  --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"source-file=<filters>         \"\n              << Whitespace(sizePrefixDisplay*1) << \"filters     tests by their file\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"sfe, --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"source-file-exclude=<filters> \"\n              << Whitespace(sizePrefixDisplay*1) << \"filters OUT tests by their file\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"ts,  --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"test-suite=<filters>          \"\n              << Whitespace(sizePrefixDisplay*1) << \"filters     tests by their test suite\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"tse, --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"test-suite-exclude=<filters>  \"\n              << Whitespace(sizePrefixDisplay*1) << \"filters OUT tests by their test suite\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"sc,  --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"subcase=<filters>             \"\n              << Whitespace(sizePrefixDisplay*1) << \"filters     subcases by their name\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"sce, --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"subcase-exclude=<filters>     \"\n              << Whitespace(sizePrefixDisplay*1) << \"filters OUT subcases by their name\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"r,   --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"reporters=<filters>           \"\n              << Whitespace(sizePrefixDisplay*1) << \"reporters to use (console is default)\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"o,   --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"out=<string>                  \"\n              << Whitespace(sizePrefixDisplay*1) << \"output filename\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"ob,  --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"order-by=<string>             \"\n              << Whitespace(sizePrefixDisplay*1) << \"how the tests should be ordered\\n\";\n            s << Whitespace(sizePrefixDisplay*3) << \"                                       <string> - by [file/suite/name/rand]\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"rs,  --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"rand-seed=<int>               \"\n              << Whitespace(sizePrefixDisplay*1) << \"seed for random ordering\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"f,   --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"first=<int>                   \"\n              << Whitespace(sizePrefixDisplay*1) << \"the first test passing the filters to\\n\";\n            s << Whitespace(sizePrefixDisplay*3) << \"                                       execute - for range-based execution\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"l,   --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"last=<int>                    \"\n              << Whitespace(sizePrefixDisplay*1) << \"the last test passing the filters to\\n\";\n            s << Whitespace(sizePrefixDisplay*3) << \"                                       execute - for range-based execution\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"aa,  --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"abort-after=<int>             \"\n              << Whitespace(sizePrefixDisplay*1) << \"stop after <int> failed assertions\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"scfl,--\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"subcase-filter-levels=<int>   \"\n              << Whitespace(sizePrefixDisplay*1) << \"apply filters for the first <int> levels\\n\";\n            s << Color::Cyan << \"\\n[doctest] \" << Color::None;\n            s << \"Bool options - can be used like flags and true is assumed. Available:\\n\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"s,   --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"success=<bool>                \"\n              << Whitespace(sizePrefixDisplay*1) << \"include successful assertions in output\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"cs,  --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"case-sensitive=<bool>         \"\n              << Whitespace(sizePrefixDisplay*1) << \"filters being treated as case sensitive\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"e,   --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"exit=<bool>                   \"\n              << Whitespace(sizePrefixDisplay*1) << \"exits after the tests finish\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"d,   --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"duration=<bool>               \"\n              << Whitespace(sizePrefixDisplay*1) << \"prints the time duration of each test\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"nt,  --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"no-throw=<bool>               \"\n              << Whitespace(sizePrefixDisplay*1) << \"skips exceptions-related assert checks\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"ne,  --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"no-exitcode=<bool>            \"\n              << Whitespace(sizePrefixDisplay*1) << \"returns (or exits) always with success\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"nr,  --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"no-run=<bool>                 \"\n              << Whitespace(sizePrefixDisplay*1) << \"skips all runtime doctest operations\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"nv,  --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"no-version=<bool>             \"\n              << Whitespace(sizePrefixDisplay*1) << \"omit the framework version in the output\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"nc,  --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"no-colors=<bool>              \"\n              << Whitespace(sizePrefixDisplay*1) << \"disables colors in output\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"fc,  --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"force-colors=<bool>           \"\n              << Whitespace(sizePrefixDisplay*1) << \"use colors even when not in a tty\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"nb,  --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"no-breaks=<bool>              \"\n              << Whitespace(sizePrefixDisplay*1) << \"disables breakpoints in debuggers\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"ns,  --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"no-skip=<bool>                \"\n              << Whitespace(sizePrefixDisplay*1) << \"don't skip test cases marked as skip\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"gfl, --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"gnu-file-line=<bool>          \"\n              << Whitespace(sizePrefixDisplay*1) << \":n: vs (n): for line numbers in output\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"npf, --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"no-path-filenames=<bool>      \"\n              << Whitespace(sizePrefixDisplay*1) << \"only filenames and no paths in output\\n\";\n            s << \" -\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"nln, --\" DOCTEST_OPTIONS_PREFIX_DISPLAY \"no-line-numbers=<bool>        \"\n              << Whitespace(sizePrefixDisplay*1) << \"0 instead of real line numbers in output\\n\";\n            // ================================================================================== << 79\n            // clang-format on\n\n            s << Color::Cyan << \"\\n[doctest] \" << Color::None;\n            s << \"for more information visit the project documentation\\n\\n\";\n        }\n\n        void printRegisteredReporters() {\n            printVersion();\n            auto printReporters = [this] (const reporterMap& reporters, const char* type) {\n                if(reporters.size()) {\n                    s << Color::Cyan << \"[doctest] \" << Color::None << \"listing all registered \" << type << \"\\n\";\n                    for(auto& curr : reporters)\n                        s << \"priority: \" << std::setw(5) << curr.first.first\n                          << \" name: \" << curr.first.second << \"\\n\";\n                }\n            };\n            printReporters(getListeners(), \"listeners\");\n            printReporters(getReporters(), \"reporters\");\n        }\n\n        void list_query_results() {\n            separator_to_stream();\n            if(opt.count || opt.list_test_cases) {\n                s << Color::Cyan << \"[doctest] \" << Color::None\n                  << \"unskipped test cases passing the current filters: \"\n                  << g_cs->numTestCasesPassingFilters << \"\\n\";\n            } else if(opt.list_test_suites) {\n                s << Color::Cyan << \"[doctest] \" << Color::None\n                  << \"unskipped test cases passing the current filters: \"\n                  << g_cs->numTestCasesPassingFilters << \"\\n\";\n                s << Color::Cyan << \"[doctest] \" << Color::None\n                  << \"test suites with unskipped test cases passing the current filters: \"\n                  << g_cs->numTestSuitesPassingFilters << \"\\n\";\n            }\n        }\n\n        // =========================================================================================\n        // WHAT FOLLOWS ARE OVERRIDES OF THE VIRTUAL METHODS OF THE REPORTER INTERFACE\n        // =========================================================================================\n\n        void report_query(const QueryData& in) override {\n            if(opt.version) {\n                printVersion();\n            } else if(opt.help) {\n                printHelp();\n            } else if(opt.list_reporters) {\n                printRegisteredReporters();\n            } else if(opt.count || opt.list_test_cases) {\n                if(opt.list_test_cases) {\n                    s << Color::Cyan << \"[doctest] \" << Color::None\n                      << \"listing all test case names\\n\";\n                    separator_to_stream();\n                }\n\n                for(unsigned i = 0; i < in.num_data; ++i)\n                    s << Color::None << in.data[i] << \"\\n\";\n\n                separator_to_stream();\n\n                s << Color::Cyan << \"[doctest] \" << Color::None\n                  << \"unskipped test cases passing the current filters: \"\n                  << g_cs->numTestCasesPassingFilters << \"\\n\";\n\n            } else if(opt.list_test_suites) {\n                s << Color::Cyan << \"[doctest] \" << Color::None << \"listing all test suites\\n\";\n                separator_to_stream();\n\n                for(unsigned i = 0; i < in.num_data; ++i)\n                    s << Color::None << in.data[i] << \"\\n\";\n\n                separator_to_stream();\n\n                s << Color::Cyan << \"[doctest] \" << Color::None\n                  << \"unskipped test cases passing the current filters: \"\n                  << g_cs->numTestCasesPassingFilters << \"\\n\";\n                s << Color::Cyan << \"[doctest] \" << Color::None\n                  << \"test suites with unskipped test cases passing the current filters: \"\n                  << g_cs->numTestSuitesPassingFilters << \"\\n\";\n            }\n        }\n\n        void test_run_start() override { printIntro(); }\n\n        void test_run_end(const TestRunStats& p) override {\n            separator_to_stream();\n\n            const bool anythingFailed = p.numTestCasesFailed > 0 || p.numAssertsFailed > 0;\n            s << Color::Cyan << \"[doctest] \" << Color::None << \"test cases: \" << std::setw(6)\n              << p.numTestCasesPassingFilters << \" | \"\n              << ((p.numTestCasesPassingFilters == 0 || anythingFailed) ? Color::None :\n                                                                          Color::Green)\n              << std::setw(6) << p.numTestCasesPassingFilters - p.numTestCasesFailed << \" passed\"\n              << Color::None << \" | \" << (p.numTestCasesFailed > 0 ? Color::Red : Color::None)\n              << std::setw(6) << p.numTestCasesFailed << \" failed\" << Color::None << \" | \";\n            if(opt.no_skipped_summary == false) {\n                const int numSkipped = p.numTestCases - p.numTestCasesPassingFilters;\n                s << (numSkipped == 0 ? Color::None : Color::Yellow) << std::setw(6) << numSkipped\n                  << \" skipped\" << Color::None;\n            }\n            s << \"\\n\";\n            s << Color::Cyan << \"[doctest] \" << Color::None << \"assertions: \" << std::setw(6)\n              << p.numAsserts << \" | \"\n              << ((p.numAsserts == 0 || anythingFailed) ? Color::None : Color::Green)\n              << std::setw(6) << (p.numAsserts - p.numAssertsFailed) << \" passed\" << Color::None\n              << \" | \" << (p.numAssertsFailed > 0 ? Color::Red : Color::None) << std::setw(6)\n              << p.numAssertsFailed << \" failed\" << Color::None << \" |\\n\";\n            s << Color::Cyan << \"[doctest] \" << Color::None\n              << \"Status: \" << (p.numTestCasesFailed > 0 ? Color::Red : Color::Green)\n              << ((p.numTestCasesFailed > 0) ? \"FAILURE!\" : \"SUCCESS!\") << Color::None << std::endl;\n        }\n\n        void test_case_start(const TestCaseData& in) override {\n            hasLoggedCurrentTestStart = false;\n            tc                        = &in;\n        }\n\n        void test_case_reenter(const TestCaseData&) override {}\n\n        void test_case_end(const CurrentTestCaseStats& st) override {\n            // log the preamble of the test case only if there is something\n            // else to print - something other than that an assert has failed\n            if(opt.duration ||\n               (st.failure_flags && st.failure_flags != TestCaseFailureReason::AssertFailure))\n                logTestStart();\n\n            if(opt.duration)\n                s << Color::None << std::setprecision(6) << std::fixed << st.seconds\n                  << \" s: \" << tc->m_name << \"\\n\";\n\n            if(st.failure_flags & TestCaseFailureReason::Timeout)\n                s << Color::Red << \"Test case exceeded time limit of \" << std::setprecision(6)\n                  << std::fixed << tc->m_timeout << \"!\\n\";\n\n            if(st.failure_flags & TestCaseFailureReason::ShouldHaveFailedButDidnt) {\n                s << Color::Red << \"Should have failed but didn't! Marking it as failed!\\n\";\n            } else if(st.failure_flags & TestCaseFailureReason::ShouldHaveFailedAndDid) {\n                s << Color::Yellow << \"Failed as expected so marking it as not failed\\n\";\n            } else if(st.failure_flags & TestCaseFailureReason::CouldHaveFailedAndDid) {\n                s << Color::Yellow << \"Allowed to fail so marking it as not failed\\n\";\n            } else if(st.failure_flags & TestCaseFailureReason::DidntFailExactlyNumTimes) {\n                s << Color::Red << \"Didn't fail exactly \" << tc->m_expected_failures\n                  << \" times so marking it as failed!\\n\";\n            } else if(st.failure_flags & TestCaseFailureReason::FailedExactlyNumTimes) {\n                s << Color::Yellow << \"Failed exactly \" << tc->m_expected_failures\n                  << \" times as expected so marking it as not failed!\\n\";\n            }\n            if(st.failure_flags & TestCaseFailureReason::TooManyFailedAsserts) {\n                s << Color::Red << \"Aborting - too many failed asserts!\\n\";\n            }\n            s << Color::None; // lgtm [cpp/useless-expression]\n        }\n\n        void test_case_exception(const TestCaseException& e) override {\n            logTestStart();\n\n            file_line_to_stream(s, tc->m_file, tc->m_line, \" \");\n            successOrFailColoredStringToStream(false, e.is_crash ? assertType::is_require :\n                                                                   assertType::is_check);\n            s << Color::Red << (e.is_crash ? \"test case CRASHED: \" : \"test case THREW exception: \")\n              << Color::Cyan << e.error_string << \"\\n\";\n\n            int num_stringified_contexts = get_num_stringified_contexts();\n            if(num_stringified_contexts) {\n                auto stringified_contexts = get_stringified_contexts();\n                s << Color::None << \"  logged: \";\n                for(int i = num_stringified_contexts; i > 0; --i) {\n                    s << (i == num_stringified_contexts ? \"\" : \"          \")\n                      << stringified_contexts[i - 1] << \"\\n\";\n                }\n            }\n            s << \"\\n\" << Color::None;\n        }\n\n        void subcase_start(const SubcaseSignature& subc) override {\n            std::lock_guard<std::mutex> lock(mutex);\n            subcasesStack.push_back(subc);\n            hasLoggedCurrentTestStart = false;\n        }\n\n        void subcase_end() override {\n            std::lock_guard<std::mutex> lock(mutex);\n            subcasesStack.pop_back();\n            hasLoggedCurrentTestStart = false;\n        }\n\n        void log_assert(const AssertData& rb) override {\n            if(!rb.m_failed && !opt.success)\n                return;\n\n            std::lock_guard<std::mutex> lock(mutex);\n\n            logTestStart();\n\n            file_line_to_stream(s, rb.m_file, rb.m_line, \" \");\n            successOrFailColoredStringToStream(!rb.m_failed, rb.m_at);\n            if((rb.m_at & (assertType::is_throws_as | assertType::is_throws_with)) ==\n               0) //!OCLINT bitwise operator in conditional\n                s << Color::Cyan << assertString(rb.m_at) << \"( \" << rb.m_expr << \" ) \"\n                  << Color::None;\n\n            if(rb.m_at & assertType::is_throws) { //!OCLINT bitwise operator in conditional\n                s << (rb.m_threw ? \"threw as expected!\" : \"did NOT throw at all!\") << \"\\n\";\n            } else if((rb.m_at & assertType::is_throws_as) &&\n                      (rb.m_at & assertType::is_throws_with)) { //!OCLINT\n                s << Color::Cyan << assertString(rb.m_at) << \"( \" << rb.m_expr << \", \\\"\"\n                  << rb.m_exception_string << \"\\\", \" << rb.m_exception_type << \" ) \" << Color::None;\n                if(rb.m_threw) {\n                    if(!rb.m_failed) {\n                        s << \"threw as expected!\\n\";\n                    } else {\n                        s << \"threw a DIFFERENT exception! (contents: \" << rb.m_exception << \")\\n\";\n                    }\n                } else {\n                    s << \"did NOT throw at all!\\n\";\n                }\n            } else if(rb.m_at &\n                      assertType::is_throws_as) { //!OCLINT bitwise operator in conditional\n                s << Color::Cyan << assertString(rb.m_at) << \"( \" << rb.m_expr << \", \"\n                  << rb.m_exception_type << \" ) \" << Color::None\n                  << (rb.m_threw ? (rb.m_threw_as ? \"threw as expected!\" :\n                                                    \"threw a DIFFERENT exception: \") :\n                                   \"did NOT throw at all!\")\n                  << Color::Cyan << rb.m_exception << \"\\n\";\n            } else if(rb.m_at &\n                      assertType::is_throws_with) { //!OCLINT bitwise operator in conditional\n                s << Color::Cyan << assertString(rb.m_at) << \"( \" << rb.m_expr << \", \\\"\"\n                  << rb.m_exception_string << \"\\\" ) \" << Color::None\n                  << (rb.m_threw ? (!rb.m_failed ? \"threw as expected!\" :\n                                                   \"threw a DIFFERENT exception: \") :\n                                   \"did NOT throw at all!\")\n                  << Color::Cyan << rb.m_exception << \"\\n\";\n            } else if(rb.m_at & assertType::is_nothrow) { //!OCLINT bitwise operator in conditional\n                s << (rb.m_threw ? \"THREW exception: \" : \"didn't throw!\") << Color::Cyan\n                  << rb.m_exception << \"\\n\";\n            } else {\n                s << (rb.m_threw ? \"THREW exception: \" :\n                                   (!rb.m_failed ? \"is correct!\\n\" : \"is NOT correct!\\n\"));\n                if(rb.m_threw)\n                    s << rb.m_exception << \"\\n\";\n                else\n                    s << \"  values: \" << assertString(rb.m_at) << \"( \" << rb.m_decomp << \" )\\n\";\n            }\n\n            log_contexts();\n        }\n\n        void log_message(const MessageData& mb) override {\n            std::lock_guard<std::mutex> lock(mutex);\n\n            logTestStart();\n\n            file_line_to_stream(s, mb.m_file, mb.m_line, \" \");\n            s << getSuccessOrFailColor(false, mb.m_severity)\n              << getSuccessOrFailString(mb.m_severity & assertType::is_warn, mb.m_severity,\n                                        \"MESSAGE\") << \": \";\n            s << Color::None << mb.m_string << \"\\n\";\n            log_contexts();\n        }\n\n        void test_case_skipped(const TestCaseData&) override {}\n    };\n\n    DOCTEST_REGISTER_REPORTER(\"console\", 0, ConsoleReporter);\n\n#ifdef DOCTEST_PLATFORM_WINDOWS\n    struct DebugOutputWindowReporter : public ConsoleReporter\n    {\n        DOCTEST_THREAD_LOCAL static std::ostringstream oss;\n\n        DebugOutputWindowReporter(const ContextOptions& co)\n                : ConsoleReporter(co, oss) {}\n\n#define DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(func, type, arg)                                    \\\n    void func(type arg) override {                                                                 \\\n        bool with_col = g_no_colors;                                                               \\\n        g_no_colors   = false;                                                                     \\\n        ConsoleReporter::func(arg);                                                                \\\n        DOCTEST_OUTPUT_DEBUG_STRING(oss.str().c_str());                                            \\\n        oss.str(\"\");                                                                               \\\n        g_no_colors = with_col;                                                                    \\\n    }\n\n        DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_run_start, DOCTEST_EMPTY, DOCTEST_EMPTY)\n        DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_run_end, const TestRunStats&, in)\n        DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_start, const TestCaseData&, in)\n        DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_reenter, const TestCaseData&, in)\n        DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_end, const CurrentTestCaseStats&, in)\n        DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_exception, const TestCaseException&, in)\n        DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(subcase_start, const SubcaseSignature&, in)\n        DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(subcase_end, DOCTEST_EMPTY, DOCTEST_EMPTY)\n        DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(log_assert, const AssertData&, in)\n        DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(log_message, const MessageData&, in)\n        DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_skipped, const TestCaseData&, in)\n    };\n\n    DOCTEST_THREAD_LOCAL std::ostringstream DebugOutputWindowReporter::oss;\n#endif // DOCTEST_PLATFORM_WINDOWS\n\n    // the implementation of parseOption()\n    bool parseOptionImpl(int argc, const char* const* argv, const char* pattern, String* value) {\n        // going from the end to the beginning and stopping on the first occurrence from the end\n        for(int i = argc; i > 0; --i) {\n            auto index = i - 1;\n            auto temp = std::strstr(argv[index], pattern);\n            if(temp && (value || strlen(temp) == strlen(pattern))) { //!OCLINT prefer early exits and continue\n                // eliminate matches in which the chars before the option are not '-'\n                bool noBadCharsFound = true;\n                auto curr            = argv[index];\n                while(curr != temp) {\n                    if(*curr++ != '-') {\n                        noBadCharsFound = false;\n                        break;\n                    }\n                }\n                if(noBadCharsFound && argv[index][0] == '-') {\n                    if(value) {\n                        // parsing the value of an option\n                        temp += strlen(pattern);\n                        const unsigned len = strlen(temp);\n                        if(len) {\n                            *value = temp;\n                            return true;\n                        }\n                    } else {\n                        // just a flag - no value\n                        return true;\n                    }\n                }\n            }\n        }\n        return false;\n    }\n\n    // parses an option and returns the string after the '=' character\n    bool parseOption(int argc, const char* const* argv, const char* pattern, String* value = nullptr,\n                     const String& defaultVal = String()) {\n        if(value)\n            *value = defaultVal;\n#ifndef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS\n        // offset (normally 3 for \"dt-\") to skip prefix\n        if(parseOptionImpl(argc, argv, pattern + strlen(DOCTEST_CONFIG_OPTIONS_PREFIX), value))\n            return true;\n#endif // DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS\n        return parseOptionImpl(argc, argv, pattern, value);\n    }\n\n    // locates a flag on the command line\n    bool parseFlag(int argc, const char* const* argv, const char* pattern) {\n        return parseOption(argc, argv, pattern);\n    }\n\n    // parses a comma separated list of words after a pattern in one of the arguments in argv\n    bool parseCommaSepArgs(int argc, const char* const* argv, const char* pattern,\n                           std::vector<String>& res) {\n        String filtersString;\n        if(parseOption(argc, argv, pattern, &filtersString)) {\n            // tokenize with \",\" as a separator\n            // cppcheck-suppress strtokCalled\n            DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(\"-Wdeprecated-declarations\")\n            auto pch = std::strtok(filtersString.c_str(), \",\"); // modifies the string\n            while(pch != nullptr) {\n                if(strlen(pch))\n                    res.push_back(pch);\n                // uses the strtok() internal state to go to the next token\n                // cppcheck-suppress strtokCalled\n                pch = std::strtok(nullptr, \",\");\n            }\n            DOCTEST_CLANG_SUPPRESS_WARNING_POP\n            return true;\n        }\n        return false;\n    }\n\n    enum optionType\n    {\n        option_bool,\n        option_int\n    };\n\n    // parses an int/bool option from the command line\n    bool parseIntOption(int argc, const char* const* argv, const char* pattern, optionType type,\n                        int& res) {\n        String parsedValue;\n        if(!parseOption(argc, argv, pattern, &parsedValue))\n            return false;\n\n        if(type == 0) {\n            // boolean\n            const char positive[][5] = {\"1\", \"true\", \"on\", \"yes\"};  // 5 - strlen(\"true\") + 1\n            const char negative[][6] = {\"0\", \"false\", \"off\", \"no\"}; // 6 - strlen(\"false\") + 1\n\n            // if the value matches any of the positive/negative possibilities\n            for(unsigned i = 0; i < 4; i++) {\n                if(parsedValue.compare(positive[i], true) == 0) {\n                    res = 1; //!OCLINT parameter reassignment\n                    return true;\n                }\n                if(parsedValue.compare(negative[i], true) == 0) {\n                    res = 0; //!OCLINT parameter reassignment\n                    return true;\n                }\n            }\n        } else {\n            // integer\n            // TODO: change this to use std::stoi or something else! currently it uses undefined behavior - assumes '0' on failed parse...\n            int theInt = std::atoi(parsedValue.c_str()); // NOLINT\n            if(theInt != 0) {\n                res = theInt; //!OCLINT parameter reassignment\n                return true;\n            }\n        }\n        return false;\n    }\n} // namespace\n\nContext::Context(int argc, const char* const* argv)\n        : p(new detail::ContextState) {\n    parseArgs(argc, argv, true);\n    if(argc)\n        p->binary_name = argv[0];\n}\n\nContext::~Context() {\n    if(g_cs == p)\n        g_cs = nullptr;\n    delete p;\n}\n\nvoid Context::applyCommandLine(int argc, const char* const* argv) {\n    parseArgs(argc, argv);\n    if(argc)\n        p->binary_name = argv[0];\n}\n\n// parses args\nvoid Context::parseArgs(int argc, const char* const* argv, bool withDefaults) {\n    using namespace detail;\n\n    // clang-format off\n    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"source-file=\",        p->filters[0]);\n    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"sf=\",                 p->filters[0]);\n    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"source-file-exclude=\",p->filters[1]);\n    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"sfe=\",                p->filters[1]);\n    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"test-suite=\",         p->filters[2]);\n    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"ts=\",                 p->filters[2]);\n    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"test-suite-exclude=\", p->filters[3]);\n    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"tse=\",                p->filters[3]);\n    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"test-case=\",          p->filters[4]);\n    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"tc=\",                 p->filters[4]);\n    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"test-case-exclude=\",  p->filters[5]);\n    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"tce=\",                p->filters[5]);\n    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"subcase=\",            p->filters[6]);\n    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"sc=\",                 p->filters[6]);\n    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"subcase-exclude=\",    p->filters[7]);\n    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"sce=\",                p->filters[7]);\n    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"reporters=\",          p->filters[8]);\n    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"r=\",                  p->filters[8]);\n    // clang-format on\n\n    int    intRes = 0;\n    String strRes;\n\n#define DOCTEST_PARSE_AS_BOOL_OR_FLAG(name, sname, var, default)                                   \\\n    if(parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name \"=\", option_bool, intRes) ||  \\\n       parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname \"=\", option_bool, intRes))   \\\n        p->var = !!intRes;                                                                         \\\n    else if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name) ||                           \\\n            parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname))                            \\\n        p->var = true;                                                                             \\\n    else if(withDefaults)                                                                          \\\n    p->var = default\n\n#define DOCTEST_PARSE_INT_OPTION(name, sname, var, default)                                        \\\n    if(parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name \"=\", option_int, intRes) ||   \\\n       parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname \"=\", option_int, intRes))    \\\n        p->var = intRes;                                                                           \\\n    else if(withDefaults)                                                                          \\\n    p->var = default\n\n#define DOCTEST_PARSE_STR_OPTION(name, sname, var, default)                                        \\\n    if(parseOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name \"=\", &strRes, default) ||        \\\n       parseOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname \"=\", &strRes, default) ||       \\\n       withDefaults)                                                                               \\\n    p->var = strRes\n\n    // clang-format off\n    DOCTEST_PARSE_STR_OPTION(\"out\", \"o\", out, \"\");\n    DOCTEST_PARSE_STR_OPTION(\"order-by\", \"ob\", order_by, \"file\");\n    DOCTEST_PARSE_INT_OPTION(\"rand-seed\", \"rs\", rand_seed, 0);\n\n    DOCTEST_PARSE_INT_OPTION(\"first\", \"f\", first, 0);\n    DOCTEST_PARSE_INT_OPTION(\"last\", \"l\", last, UINT_MAX);\n\n    DOCTEST_PARSE_INT_OPTION(\"abort-after\", \"aa\", abort_after, 0);\n    DOCTEST_PARSE_INT_OPTION(\"subcase-filter-levels\", \"scfl\", subcase_filter_levels, INT_MAX);\n\n    DOCTEST_PARSE_AS_BOOL_OR_FLAG(\"success\", \"s\", success, false);\n    DOCTEST_PARSE_AS_BOOL_OR_FLAG(\"case-sensitive\", \"cs\", case_sensitive, false);\n    DOCTEST_PARSE_AS_BOOL_OR_FLAG(\"exit\", \"e\", exit, false);\n    DOCTEST_PARSE_AS_BOOL_OR_FLAG(\"duration\", \"d\", duration, false);\n    DOCTEST_PARSE_AS_BOOL_OR_FLAG(\"no-throw\", \"nt\", no_throw, false);\n    DOCTEST_PARSE_AS_BOOL_OR_FLAG(\"no-exitcode\", \"ne\", no_exitcode, false);\n    DOCTEST_PARSE_AS_BOOL_OR_FLAG(\"no-run\", \"nr\", no_run, false);\n    DOCTEST_PARSE_AS_BOOL_OR_FLAG(\"no-version\", \"nv\", no_version, false);\n    DOCTEST_PARSE_AS_BOOL_OR_FLAG(\"no-colors\", \"nc\", no_colors, false);\n    DOCTEST_PARSE_AS_BOOL_OR_FLAG(\"force-colors\", \"fc\", force_colors, false);\n    DOCTEST_PARSE_AS_BOOL_OR_FLAG(\"no-breaks\", \"nb\", no_breaks, false);\n    DOCTEST_PARSE_AS_BOOL_OR_FLAG(\"no-skip\", \"ns\", no_skip, false);\n    DOCTEST_PARSE_AS_BOOL_OR_FLAG(\"gnu-file-line\", \"gfl\", gnu_file_line, !bool(DOCTEST_MSVC));\n    DOCTEST_PARSE_AS_BOOL_OR_FLAG(\"no-path-filenames\", \"npf\", no_path_in_filenames, false);\n    DOCTEST_PARSE_AS_BOOL_OR_FLAG(\"no-line-numbers\", \"nln\", no_line_numbers, false);\n    DOCTEST_PARSE_AS_BOOL_OR_FLAG(\"no-skipped-summary\", \"nss\", no_skipped_summary, false);\n    // clang-format on\n\n    if(withDefaults) {\n        p->help             = false;\n        p->version          = false;\n        p->count            = false;\n        p->list_test_cases  = false;\n        p->list_test_suites = false;\n        p->list_reporters   = false;\n    }\n    if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"help\") ||\n       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"h\") ||\n       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"?\")) {\n        p->help = true;\n        p->exit = true;\n    }\n    if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"version\") ||\n       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"v\")) {\n        p->version = true;\n        p->exit    = true;\n    }\n    if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"count\") ||\n       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"c\")) {\n        p->count = true;\n        p->exit  = true;\n    }\n    if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"list-test-cases\") ||\n       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"ltc\")) {\n        p->list_test_cases = true;\n        p->exit            = true;\n    }\n    if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"list-test-suites\") ||\n       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"lts\")) {\n        p->list_test_suites = true;\n        p->exit             = true;\n    }\n    if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"list-reporters\") ||\n       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX \"lr\")) {\n        p->list_reporters = true;\n        p->exit           = true;\n    }\n}\n\n// allows the user to add procedurally to the filters from the command line\nvoid Context::addFilter(const char* filter, const char* value) { setOption(filter, value); }\n\n// allows the user to clear all filters from the command line\nvoid Context::clearFilters() {\n    for(auto& curr : p->filters)\n        curr.clear();\n}\n\n// allows the user to override procedurally the int/bool options from the command line\nvoid Context::setOption(const char* option, int value) {\n    setOption(option, toString(value).c_str());\n}\n\n// allows the user to override procedurally the string options from the command line\nvoid Context::setOption(const char* option, const char* value) {\n    auto argv   = String(\"-\") + option + \"=\" + value;\n    auto lvalue = argv.c_str();\n    parseArgs(1, &lvalue);\n}\n\n// users should query this in their main() and exit the program if true\nbool Context::shouldExit() { return p->exit; }\n\nvoid Context::setAsDefaultForAssertsOutOfTestCases() { g_cs = p; }\n\nvoid Context::setAssertHandler(detail::assert_handler ah) { p->ah = ah; }\n\n// the main function that does all the filtering and test running\nint Context::run() {\n    using namespace detail;\n\n    // save the old context state in case such was setup - for using asserts out of a testing context\n    auto old_cs = g_cs;\n    // this is the current contest\n    g_cs               = p;\n    is_running_in_test = true;\n\n    g_no_colors = p->no_colors;\n    p->resetRunData();\n\n    // stdout by default\n    p->cout = &std::cout;\n    p->cerr = &std::cerr;\n\n    // or to a file if specified\n    std::fstream fstr;\n    if(p->out.size()) {\n        fstr.open(p->out.c_str(), std::fstream::out);\n        p->cout = &fstr;\n    }\n\n    auto cleanup_and_return = [&]() {\n        if(fstr.is_open())\n            fstr.close();\n\n        // restore context\n        g_cs               = old_cs;\n        is_running_in_test = false;\n\n        // we have to free the reporters which were allocated when the run started\n        for(auto& curr : p->reporters_currently_used)\n            delete curr;\n        p->reporters_currently_used.clear();\n\n        if(p->numTestCasesFailed && !p->no_exitcode)\n            return EXIT_FAILURE;\n        return EXIT_SUCCESS;\n    };\n\n    // setup default reporter if none is given through the command line\n    if(p->filters[8].empty())\n        p->filters[8].push_back(\"console\");\n\n    // check to see if any of the registered reporters has been selected\n    for(auto& curr : getReporters()) {\n        if(matchesAny(curr.first.second.c_str(), p->filters[8], false, p->case_sensitive))\n            p->reporters_currently_used.push_back(curr.second(*g_cs));\n    }\n\n    // TODO: check if there is nothing in reporters_currently_used\n\n    // prepend all listeners\n    for(auto& curr : getListeners())\n        p->reporters_currently_used.insert(p->reporters_currently_used.begin(), curr.second(*g_cs));\n\n#ifdef DOCTEST_PLATFORM_WINDOWS\n    if(isDebuggerActive())\n        p->reporters_currently_used.push_back(new DebugOutputWindowReporter(*g_cs));\n#endif // DOCTEST_PLATFORM_WINDOWS\n\n    // handle version, help and no_run\n    if(p->no_run || p->version || p->help || p->list_reporters) {\n        DOCTEST_ITERATE_THROUGH_REPORTERS(report_query, QueryData());\n\n        return cleanup_and_return();\n    }\n\n    std::vector<const TestCase*> testArray;\n    for(auto& curr : getRegisteredTests())\n        testArray.push_back(&curr);\n    p->numTestCases = testArray.size();\n\n    // sort the collected records\n    if(!testArray.empty()) {\n        if(p->order_by.compare(\"file\", true) == 0) {\n            std::sort(testArray.begin(), testArray.end(), fileOrderComparator);\n        } else if(p->order_by.compare(\"suite\", true) == 0) {\n            std::sort(testArray.begin(), testArray.end(), suiteOrderComparator);\n        } else if(p->order_by.compare(\"name\", true) == 0) {\n            std::sort(testArray.begin(), testArray.end(), nameOrderComparator);\n        } else if(p->order_by.compare(\"rand\", true) == 0) {\n            std::srand(p->rand_seed);\n\n            // random_shuffle implementation\n            const auto first = &testArray[0];\n            for(size_t i = testArray.size() - 1; i > 0; --i) {\n                int idxToSwap = std::rand() % (i + 1); // NOLINT\n\n                const auto temp = first[i];\n\n                first[i]         = first[idxToSwap];\n                first[idxToSwap] = temp;\n            }\n        }\n    }\n\n    std::set<String> testSuitesPassingFilt;\n\n    bool                query_mode = p->count || p->list_test_cases || p->list_test_suites;\n    std::vector<String> queryResults;\n\n    if(!query_mode)\n        DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_start, DOCTEST_EMPTY);\n\n    // invoke the registered functions if they match the filter criteria (or just count them)\n    for(auto& curr : testArray) {\n        const auto& tc = *curr;\n\n        bool skip_me = false;\n        if(tc.m_skip && !p->no_skip)\n            skip_me = true;\n\n        if(!matchesAny(tc.m_file, p->filters[0], true, p->case_sensitive))\n            skip_me = true;\n        if(matchesAny(tc.m_file, p->filters[1], false, p->case_sensitive))\n            skip_me = true;\n        if(!matchesAny(tc.m_test_suite, p->filters[2], true, p->case_sensitive))\n            skip_me = true;\n        if(matchesAny(tc.m_test_suite, p->filters[3], false, p->case_sensitive))\n            skip_me = true;\n        if(!matchesAny(tc.m_name, p->filters[4], true, p->case_sensitive))\n            skip_me = true;\n        if(matchesAny(tc.m_name, p->filters[5], false, p->case_sensitive))\n            skip_me = true;\n\n        if(!skip_me)\n            p->numTestCasesPassingFilters++;\n\n        // skip the test if it is not in the execution range\n        if((p->last < p->numTestCasesPassingFilters && p->first <= p->last) ||\n           (p->first > p->numTestCasesPassingFilters))\n            skip_me = true;\n\n        if(skip_me) {\n            if(!query_mode)\n                DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_skipped, tc);\n            continue;\n        }\n\n        // do not execute the test if we are to only count the number of filter passing tests\n        if(p->count)\n            continue;\n\n        // print the name of the test and don't execute it\n        if(p->list_test_cases) {\n            queryResults.push_back(tc.m_name);\n            continue;\n        }\n\n        // print the name of the test suite if not done already and don't execute it\n        if(p->list_test_suites) {\n            if((testSuitesPassingFilt.count(tc.m_test_suite) == 0) && tc.m_test_suite[0] != '\\0') {\n                queryResults.push_back(tc.m_test_suite);\n                testSuitesPassingFilt.insert(tc.m_test_suite);\n                p->numTestSuitesPassingFilters++;\n            }\n            continue;\n        }\n\n        // execute the test if it passes all the filtering\n        {\n            p->currentTest = &tc;\n\n            p->failure_flags = TestCaseFailureReason::None;\n            p->seconds       = 0;\n\n            // reset atomic counters\n            p->numAssertsFailedCurrentTest_atomic = 0;\n            p->numAssertsCurrentTest_atomic       = 0;\n\n            p->subcasesPassed.clear();\n\n            DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_start, tc);\n\n            p->timer.start();\n\n            bool run_test = true;\n\n            do {\n                // reset some of the fields for subcases (except for the set of fully passed ones)\n                p->should_reenter          = false;\n                p->subcasesCurrentMaxLevel = 0;\n                p->subcasesStack.clear();\n\n                p->shouldLogCurrentException = true;\n\n                // reset stuff for logging with INFO()\n                p->stringifiedContexts.clear();\n\n#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS\n                try {\n#endif // DOCTEST_CONFIG_NO_EXCEPTIONS\n                    FatalConditionHandler fatalConditionHandler; // Handle signals\n                    // execute the test\n                    tc.m_test();\n                    fatalConditionHandler.reset();\n#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS\n                } catch(const TestFailureException&) {\n                    p->failure_flags |= TestCaseFailureReason::AssertFailure;\n                } catch(...) {\n                    DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_exception,\n                                                      {translateActiveException(), false});\n                    p->failure_flags |= TestCaseFailureReason::Exception;\n                }\n#endif // DOCTEST_CONFIG_NO_EXCEPTIONS\n\n                // exit this loop if enough assertions have failed - even if there are more subcases\n                if(p->abort_after > 0 &&\n                   p->numAssertsFailed + p->numAssertsFailedCurrentTest_atomic >= p->abort_after) {\n                    run_test = false;\n                    p->failure_flags |= TestCaseFailureReason::TooManyFailedAsserts;\n                }\n\n                if(p->should_reenter && run_test)\n                    DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_reenter, tc);\n                if(!p->should_reenter)\n                    run_test = false;\n            } while(run_test);\n\n            p->finalizeTestCaseData();\n\n            DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_end, *g_cs);\n\n            p->currentTest = nullptr;\n\n            // stop executing tests if enough assertions have failed\n            if(p->abort_after > 0 && p->numAssertsFailed >= p->abort_after)\n                break;\n        }\n    }\n\n    if(!query_mode) {\n        DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_end, *g_cs);\n    } else {\n        QueryData qdata;\n        qdata.run_stats = g_cs;\n        qdata.data      = queryResults.data();\n        qdata.num_data  = unsigned(queryResults.size());\n        DOCTEST_ITERATE_THROUGH_REPORTERS(report_query, qdata);\n    }\n\n    // see these issues on the reasoning for this:\n    // - https://github.com/onqtam/doctest/issues/143#issuecomment-414418903\n    // - https://github.com/onqtam/doctest/issues/126\n    auto DOCTEST_FIX_FOR_MACOS_LIBCPP_IOSFWD_STRING_LINK_ERRORS = []() DOCTEST_NOINLINE\n        { std::cout << std::string(); };\n    DOCTEST_FIX_FOR_MACOS_LIBCPP_IOSFWD_STRING_LINK_ERRORS();\n\n    return cleanup_and_return();\n}\n\nIReporter::~IReporter() = default;\n\nint IReporter::get_num_active_contexts() { return detail::g_infoContexts.size(); }\nconst IContextScope* const* IReporter::get_active_contexts() {\n    return get_num_active_contexts() ? &detail::g_infoContexts[0] : nullptr;\n}\n\nint IReporter::get_num_stringified_contexts() { return detail::g_cs->stringifiedContexts.size(); }\nconst String* IReporter::get_stringified_contexts() {\n    return get_num_stringified_contexts() ? &detail::g_cs->stringifiedContexts[0] : nullptr;\n}\n\nnamespace detail {\n    void registerReporterImpl(const char* name, int priority, reporterCreatorFunc c, bool isReporter) {\n        if(isReporter)\n            getReporters().insert(reporterMap::value_type(reporterMap::key_type(priority, name), c));\n        else\n            getListeners().insert(reporterMap::value_type(reporterMap::key_type(priority, name), c));\n    }\n} // namespace detail\n\n} // namespace doctest\n\n#endif // DOCTEST_CONFIG_DISABLE\n\n#ifdef DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\nDOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4007) // 'function' : must be 'attribute' - see issue #182\nint main(int argc, char** argv) { return doctest::Context(argc, argv).run(); }\nDOCTEST_MSVC_SUPPRESS_WARNING_POP\n#endif // DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n\nDOCTEST_CLANG_SUPPRESS_WARNING_POP\nDOCTEST_MSVC_SUPPRESS_WARNING_POP\nDOCTEST_GCC_SUPPRESS_WARNING_POP\n\n#endif // DOCTEST_LIBRARY_IMPLEMENTATION\n#endif // DOCTEST_CONFIG_IMPLEMENT\n\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/forward_list.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"forward_list.hpp\"\n\nTEST_SUITE_BEGIN(\"forward_list\");\n\nTEST_CASE(\"binary_forward_list\")\n{\n  test_forward_list<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_forward_list\")\n{\n  test_forward_list<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_forward_list\")\n{\n  test_forward_list<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_forward_list\")\n{\n  test_forward_list<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/forward_list.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_FORWARD_LIST_H_\n#define CEREAL_TEST_FORWARD_LIST_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_forward_list()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::forward_list<int> o_podforward_list(100);\n    for(auto & elem : o_podforward_list)\n      elem = random_value<int>(gen);\n\n    std::forward_list<StructInternalSerialize> o_iserforward_list(100);\n    for(auto & elem : o_iserforward_list)\n      elem = StructInternalSerialize( random_value<int>(gen), random_value<int>(gen) );\n\n    std::forward_list<StructInternalSplit> o_isplforward_list(100);\n    for(auto & elem : o_isplforward_list)\n      elem = StructInternalSplit( random_value<int>(gen), random_value<int>(gen) );\n\n    std::forward_list<StructExternalSerialize> o_eserforward_list(100);\n    for(auto & elem : o_eserforward_list)\n      elem = StructExternalSerialize( random_value<int>(gen), random_value<int>(gen) );\n\n    std::forward_list<StructExternalSplit> o_esplforward_list(100);\n    for(auto & elem : o_esplforward_list)\n      elem = StructExternalSplit( random_value<int>(gen), random_value<int>(gen) );\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_podforward_list);\n      oar(o_iserforward_list);\n      oar(o_isplforward_list);\n      oar(o_eserforward_list);\n      oar(o_esplforward_list);\n    }\n\n    std::forward_list<int> i_podforward_list;\n    std::forward_list<StructInternalSerialize> i_iserforward_list;\n    std::forward_list<StructInternalSplit>     i_isplforward_list;\n    std::forward_list<StructExternalSerialize> i_eserforward_list;\n    std::forward_list<StructExternalSplit>     i_esplforward_list;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_podforward_list);\n      iar(i_iserforward_list);\n      iar(i_isplforward_list);\n      iar(i_eserforward_list);\n      iar(i_esplforward_list);\n    }\n\n    check_collection(i_podforward_list,  o_podforward_list );\n    check_collection(i_iserforward_list, o_iserforward_list);\n    check_collection(i_isplforward_list, o_isplforward_list);\n    check_collection(i_eserforward_list, o_eserforward_list);\n    check_collection(i_esplforward_list, o_esplforward_list);\n  }\n}\n\n#endif // CEREAL_TEST_FORWARD_LIST_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/list.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"list.hpp\"\n\nTEST_SUITE_BEGIN(\"list\");\n\nTEST_CASE(\"binary_list\")\n{\n  test_list<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_list\")\n{\n  test_list<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_list\")\n{\n  test_list<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_list\")\n{\n  test_list<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/list.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_LIST_H_\n#define CEREAL_TEST_LIST_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_list()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::list<int> o_podlist(100);\n    for(auto & elem : o_podlist)\n      elem = random_value<int>(gen);\n\n    std::list<StructInternalSerialize> o_iserlist(100);\n    for(auto & elem : o_iserlist)\n      elem = StructInternalSerialize( random_value<int>(gen), random_value<int>(gen) );\n\n    std::list<StructInternalSplit> o_ispllist(100);\n    for(auto & elem : o_ispllist)\n      elem = StructInternalSplit( random_value<int>(gen), random_value<int>(gen) );\n\n    std::list<StructExternalSerialize> o_eserlist(100);\n    for(auto & elem : o_eserlist)\n      elem = StructExternalSerialize( random_value<int>(gen), random_value<int>(gen) );\n\n    std::list<StructExternalSplit> o_espllist(100);\n    for(auto & elem : o_espllist)\n      elem = StructExternalSplit( random_value<int>(gen), random_value<int>(gen) );\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_podlist);\n      oar(o_iserlist);\n      oar(o_ispllist);\n      oar(o_eserlist);\n      oar(o_espllist);\n    }\n\n    std::list<int> i_podlist;\n    std::list<StructInternalSerialize> i_iserlist;\n    std::list<StructInternalSplit>     i_ispllist;\n    std::list<StructExternalSerialize> i_eserlist;\n    std::list<StructExternalSplit>     i_espllist;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_podlist);\n      iar(i_iserlist);\n      iar(i_ispllist);\n      iar(i_eserlist);\n      iar(i_espllist);\n    }\n\n    check_collection(i_podlist,  o_podlist);\n    check_collection(i_iserlist, o_iserlist);\n    check_collection(i_ispllist, o_ispllist);\n    check_collection(i_eserlist, o_eserlist);\n    check_collection(i_espllist, o_espllist);\n  }\n}\n\n#endif // CEREAL_TEST_LIST_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/load_construct.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"load_construct.hpp\"\n\nTEST_SUITE_BEGIN(\"load_construct\");\n\nTEST_CASE(\"binary_memory_load_construct\")\n{\n  test_memory_load_construct<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_memory_load_construct\")\n{\n  test_memory_load_construct<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_memory_load_construct\")\n{\n  test_memory_load_construct<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_memory_load_construct\")\n{\n  test_memory_load_construct<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/load_construct.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_LOAD_CONSTRUCT_H_\n#define CEREAL_TEST_LOAD_CONSTRUCT_H_\n#include \"common.hpp\"\n\nstruct OneLA\n{\n  OneLA( int xx ) : x( xx ) {}\n\n  int x;\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  { ar( x ); }\n\n  template <class Archive>\n  static void load_and_construct( Archive & ar, cereal::construct<OneLA> & construct )\n  {\n    int xx;\n    ar( xx );\n    construct( xx );\n  }\n\n  bool operator==( OneLA const & other ) const\n  { return x == other.x; }\n};\n\nstd::ostream& operator<<(std::ostream& os, OneLA const & s)\n{\n  os << \"[\" << s.x << \"]\";\n  return os;\n}\n\nstruct OneLAVersioned\n{\n  OneLAVersioned( int xx ) : x( xx ), v() {}\n  OneLAVersioned( int xx, int vv ) : x( xx ), v( vv ) {}\n\n  int x;\n  std::uint32_t v;\n\n  template <class Archive>\n  void serialize( Archive & ar, const std::uint32_t version )\n  { ar( x ); v = version; }\n\n  template <class Archive>\n  static void load_and_construct( Archive & ar, cereal::construct<OneLAVersioned> & construct, const std::uint32_t version )\n  {\n    int xx;\n    ar( xx );\n    construct( xx, version );\n  }\n\n  bool operator==( OneLAVersioned const & other ) const\n  { return x == other.x; }\n};\n\nstd::ostream& operator<<(std::ostream& os, OneLAVersioned const & s)\n{\n  os << \"[\" << s.x << \"]\";\n  return os;\n}\n\nCEREAL_CLASS_VERSION( OneLAVersioned, 13 )\n\nstruct TwoLA\n{\n  TwoLA( int xx ) : x( xx ) {}\n\n  int x;\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  { ar( x ); }\n\n  bool operator==( TwoLA const & other ) const\n  { return x == other.x; }\n};\n\nstd::ostream& operator<<(std::ostream& os, TwoLA const & s)\n{\n  os << \"[\" << s.x << \"]\";\n  return os;\n}\n\nnamespace cereal\n{\n  template <>\n  struct LoadAndConstruct<TwoLA>\n  {\n    template <class Archive>\n    static void load_and_construct( Archive & ar, cereal::construct<TwoLA> & construct )\n    {\n      int xx;\n      ar( xx );\n      construct( xx );\n    }\n  };\n}\n\nstruct TwoLAVersioned\n{\n  TwoLAVersioned( int xx ) : x( xx ), v() {}\n  TwoLAVersioned( int xx, int vv ) : x( xx ), v( vv ) {}\n\n  int x;\n  std::uint32_t v;\n\n  template <class Archive>\n  void serialize( Archive & ar, const std::uint32_t version )\n  { ar( x ); v = version; }\n\n  bool operator==( TwoLAVersioned const & other ) const\n  { return x == other.x; }\n};\n\nstd::ostream& operator<<(std::ostream& os, TwoLAVersioned const & s)\n{\n  os << \"[\" << s.x << \"]\";\n  return os;\n}\n\nnamespace cereal\n{\n  template <>\n  struct LoadAndConstruct<TwoLAVersioned>\n  {\n    template <class Archive>\n    static void load_and_construct( Archive & ar, cereal::construct<TwoLAVersioned> & construct, const std::uint32_t version )\n    {\n      int xx;\n      ar( xx );\n      construct( xx, version );\n    }\n  };\n}\n\nCEREAL_CLASS_VERSION( TwoLAVersioned, 1 )\n\nstruct ThreeLA : std::enable_shared_from_this<ThreeLA>\n{\n  ThreeLA( int xx ) : x( xx ) {}\n\n  int x;\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  { ar( x ); }\n\n  bool operator==( ThreeLA const & other ) const\n  { return x == other.x; }\n\n  template <class Archive>\n  static void load_and_construct( Archive & ar, cereal::construct<ThreeLA> & construct )\n  {\n    int xx;\n    ar( xx );\n    construct( xx );\n  }\n};\n\nstd::ostream& operator<<(std::ostream& os, ThreeLA const & s)\n{\n  os << \"[\" << s.x << \"]\";\n  return os;\n}\n\ntemplate <class IArchive, class OArchive>\nvoid test_memory_load_construct()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    auto o_shared1 = std::make_shared<OneLA>( random_value<int>(gen) );\n    auto o_shared2 = std::make_shared<TwoLA>( random_value<int>(gen) );\n    std::unique_ptr<OneLA> o_unique1( new OneLA( random_value<int>(gen) ) );\n    std::unique_ptr<TwoLA> o_unique2( new TwoLA( random_value<int>(gen) ) );\n    auto o_shared3 = std::make_shared<ThreeLA>( random_value<int>(gen) );\n    auto o_shared1v = std::make_shared<OneLAVersioned>( random_value<int>(gen) );\n    auto o_shared2v = std::make_shared<TwoLAVersioned>( random_value<int>(gen) );\n\n    auto o_constShared1 = std::make_shared<const OneLA>( random_value<int>(gen) ); // issue 417\n    auto o_constShared2 = std::make_shared<const TwoLA>( random_value<int>(gen) );\n    std::unique_ptr<const OneLA> o_constUnique1( new OneLA( random_value<int>(gen) ) );\n    std::unique_ptr<const TwoLA> o_constUnique2( new TwoLA( random_value<int>(gen) ) );\n    auto o_constShared3 = std::make_shared<const ThreeLA>( random_value<int>(gen) );\n    auto o_constShared1v = std::make_shared<const OneLAVersioned>( random_value<int>(gen) );\n    auto o_constShared2v = std::make_shared<const TwoLAVersioned>( random_value<int>(gen) );\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar( o_shared1 );\n      oar( o_shared2 );\n      oar( o_unique1 );\n      oar( o_unique2 );\n      oar( o_shared3 );\n      oar( o_shared1v );\n      oar( o_shared2v );\n      oar( o_constShared1 );\n      oar( o_constShared2 );\n      oar( o_constUnique1 );\n      oar( o_constUnique2 );\n      oar( o_constShared3 );\n      oar( o_constShared1v );\n      oar( o_constShared2v );\n    }\n\n    o_shared3->shared_from_this(); // tests github issue #68\n    o_constShared3->shared_from_this();\n\n    decltype(o_shared1) i_shared1;\n    decltype(o_shared2) i_shared2;\n    decltype(o_unique1) i_unique1;\n    decltype(o_unique2) i_unique2;\n    decltype(o_shared3) i_shared3;\n    decltype(o_shared1v) i_shared1v;\n    decltype(o_shared2v) i_shared2v;\n    decltype(o_constShared1) i_constShared1;\n    decltype(o_constShared2) i_constShared2;\n    decltype(o_constUnique1) i_constUnique1;\n    decltype(o_constUnique2) i_constUnique2;\n    decltype(o_constShared3) i_constShared3;\n    decltype(o_constShared1v) i_constShared1v;\n    decltype(o_constShared2v) i_constShared2v;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar( i_shared1 );\n      iar( i_shared2 );\n      iar( i_unique1 );\n      iar( i_unique2 );\n      iar( i_shared3 );\n      iar( i_shared1v );\n      iar( i_shared2v );\n      iar( i_constShared1 );\n      iar( i_constShared2 );\n      iar( i_constUnique1 );\n      iar( i_constUnique2 );\n      iar( i_constShared3 );\n      iar( i_constShared1v );\n      iar( i_constShared2v );\n    }\n\n    CHECK_EQ( *o_shared1, *i_shared1 );\n    CHECK_EQ( *o_shared2, *i_shared2 );\n    CHECK_EQ( *o_unique1, *i_unique1 );\n    CHECK_EQ( *o_unique2, *i_unique2 );\n    CHECK_EQ( *o_shared3, *i_shared3 );\n    CHECK_EQ( *o_shared1v, *i_shared1v );\n    CHECK_EQ(i_shared1v->v, 13u);\n    CHECK_EQ( *o_shared2v, *i_shared2v );\n    CHECK_EQ(i_shared2v->v, 1u);\n\n    auto i_shared3_2 = i_shared3->shared_from_this();\n    CHECK_EQ( *o_shared3, *i_shared3_2 );\n\n    CHECK_EQ( *o_constShared1, *i_constShared1 );\n    CHECK_EQ( *o_constShared2, *i_constShared2 );\n    CHECK_EQ( *o_constUnique1, *i_constUnique1 );\n    CHECK_EQ( *o_constUnique2, *i_constUnique2 );\n    CHECK_EQ( *o_constShared3, *i_constShared3 );\n    CHECK_EQ( *o_constShared1v, *i_constShared1v );\n    CHECK_EQ(i_constShared1v->v, 13u);\n    CHECK_EQ( *o_constShared2v, *i_constShared2v );\n    CHECK_EQ(i_constShared2v->v, 1u);\n\n    auto i_constShared3_2 = i_constShared3->shared_from_this();\n    CHECK_EQ( *o_constShared3, *i_constShared3_2 );\n  }\n}\n\n#endif // CEREAL_TEST_LOAD_CONSTRUCT_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/map.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"map.hpp\"\n\nTEST_SUITE_BEGIN(\"map\");\n\nTEST_CASE(\"binary_map\")\n{\n  test_map<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_map\")\n{\n  test_map<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_map\")\n{\n  test_map<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_map\")\n{\n  test_map<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_CASE(\"binary_map_memory\")\n{\n  test_map_memory<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_map_memory\")\n{\n  test_map_memory<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_map_memory\")\n{\n  test_map_memory<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_map_memory\")\n{\n  test_map_memory<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/map.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_MAP_H_\n#define CEREAL_TEST_MAP_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_map()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::map<size_t, std::vector<StructInternalSerialize>> o_vectormap;\n    for(int j=0; j<10; ++j)\n    {\n      size_t id = random_value<size_t>(gen);\n      for(int k=0; k<100; ++k)\n        o_vectormap[id].emplace_back(random_value<int>(gen), random_value<int>(gen));\n    }\n\n    std::map<std::string, int> o_podmap;\n    for(int j=0; j<100; ++j)\n      o_podmap.insert({random_value<std::string>(gen), random_value<int>(gen)});\n\n    std::map<int, StructInternalSerialize> o_isermap;\n    for(int j=0; j<100; ++j)\n      o_isermap.insert({random_value<int>(gen), { random_value<int>(gen), random_value<int>(gen) }});\n\n    std::map<int, StructInternalSplit> o_isplmap;\n    for(int j=0; j<100; ++j)\n      o_isplmap.insert({random_value<int>(gen), { random_value<int>(gen), random_value<int>(gen) }});\n\n    std::map<uint32_t, StructExternalSerialize> o_esermap;\n    for(int j=0; j<100; ++j)\n      o_esermap.insert({random_value<uint32_t>(gen), { random_value<int>(gen), random_value<int>(gen) }});\n\n    std::map<int8_t, StructExternalSplit> o_esplmap;\n    for(int j=0; j<100; ++j)\n      o_esplmap.insert({random_value<char>(gen),  { random_value<int>(gen), random_value<int>(gen) }});\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_vectormap);\n      oar(o_podmap);\n      oar(o_isermap);\n      oar(o_isplmap);\n      oar(o_esermap);\n      oar(o_esplmap);\n    }\n\n    std::map<size_t, std::vector<StructInternalSerialize>> i_vectormap;\n    std::map<std::string, int> i_podmap;\n    std::map<int, StructInternalSerialize>   i_isermap;\n    std::map<int, StructInternalSplit>        i_isplmap;\n    std::map<uint32_t, StructExternalSerialize> i_esermap;\n    std::map<int8_t, StructExternalSplit>       i_esplmap;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_vectormap);\n      iar(i_podmap);\n      iar(i_isermap);\n      iar(i_isplmap);\n      iar(i_esermap);\n      iar(i_esplmap);\n    }\n\n    CHECK_EQ(i_vectormap.size(), o_vectormap.size());\n    auto o_v_it = o_vectormap.begin();\n    auto i_v_it = i_vectormap.begin();\n    for(;o_v_it != o_vectormap.end(); ++o_v_it, ++i_v_it)\n    {\n      CHECK_EQ(i_v_it->second.size(), o_v_it->second.size());\n      check_collection(i_v_it->second, o_v_it->second);\n    }\n\n    check_collection(i_podmap,  o_podmap);\n    check_collection(i_isermap, o_isermap);\n    check_collection(i_isplmap, o_isplmap);\n    check_collection(i_esermap, o_esermap);\n    check_collection(i_esplmap, o_esplmap);\n  }\n}\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_map_memory()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::map<int, std::unique_ptr<int>> o_uniqueptrMap;\n    std::map<int, std::shared_ptr<int>> o_sharedptrMap;\n\n    for(int j=0; j<100; ++j)\n    {\n      #ifdef CEREAL_OLDER_GCC\n      o_uniqueptrMap.insert( std::make_pair(random_value<int>(gen), std::unique_ptr<int>( new int( random_value<int>(gen) ) )) );\n      o_sharedptrMap.insert( std::make_pair(random_value<int>(gen), std::make_shared<int>( random_value<int>(gen) )) );\n      #else // NOT CEREAL_OLDER_GCC\n      o_uniqueptrMap.emplace( random_value<int>(gen), std::unique_ptr<int>( new int( random_value<int>(gen) ) ) );\n      o_sharedptrMap.emplace( random_value<int>(gen), std::make_shared<int>( random_value<int>(gen) ) );\n      #endif // NOT CEREAL_OLDER_GCC\n    }\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar( o_uniqueptrMap );\n      oar( o_sharedptrMap );\n    }\n\n    decltype( o_uniqueptrMap ) i_uniqueptrMap;\n    decltype( o_sharedptrMap ) i_sharedptrMap;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar( i_uniqueptrMap );\n      iar( i_sharedptrMap );\n    }\n\n    CHECK_EQ(o_sharedptrMap.size(), i_sharedptrMap.size());\n    CHECK_EQ(o_uniqueptrMap.size(), i_uniqueptrMap.size());\n\n    auto o_v_it = o_uniqueptrMap.begin();\n    auto i_v_it = i_uniqueptrMap.begin();\n    for(;o_v_it != o_uniqueptrMap.end(); ++o_v_it, ++i_v_it)\n    {\n      CHECK_EQ(i_v_it->first, o_v_it->first);\n      CHECK_EQ(*i_v_it->second, *o_v_it->second);\n    }\n  }\n}\n\n#endif // CEREAL_TEST_MAP_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/memory.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"memory.hpp\"\n\nTEST_SUITE_BEGIN(\"memory\");\n\nTEST_CASE(\"binary_memory\")\n{\n  test_memory<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_memory\")\n{\n  test_memory<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_memory\")\n{\n  test_memory<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_memory\")\n{\n  test_memory<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_CASE(\"binary_default_construction\")\n{\n  test_default_construction<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_default_construction\")\n{\n  test_default_construction<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_default_construction\")\n{\n  test_default_construction<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_default_construction\")\n{\n  test_default_construction<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/memory.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_MEMORY_H_\n#define CEREAL_TEST_MEMORY_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_memory()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::shared_ptr<int> o_xptr1 = std::make_shared<int>(random_value<int>(gen));\n    std::shared_ptr<int> o_xptr2 = o_xptr1;\n    std::shared_ptr<const int> o_xptr3 = o_xptr1;\n    std::shared_ptr<int> o_yptr1 = std::make_shared<int>(random_value<int>(gen));\n    std::shared_ptr<int> o_yptr2 = o_yptr1;\n    std::shared_ptr<int> o_nullptr1;\n    std::shared_ptr<int> o_nullptr2;\n\n    std::unique_ptr<int> o_zptr1(new int(random_value<int>(gen)));\n    std::unique_ptr<const int> o_zptr2(new int(random_value<int>(gen)));\n    std::unique_ptr<int> o_nullptr3;\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar( o_xptr1, o_xptr2, o_xptr3 );\n      oar( o_yptr1, o_yptr2 );\n      oar( o_nullptr1, o_nullptr2 );\n\n      oar( o_zptr1, o_zptr2 );\n      oar( o_nullptr3 );\n    }\n\n    std::shared_ptr<int> i_xptr1;\n    std::shared_ptr<int> i_xptr2;\n    std::shared_ptr<const int> i_xptr3;\n    std::shared_ptr<int> i_yptr1;\n    std::shared_ptr<int> i_yptr2;\n    std::shared_ptr<int> i_nullptr1;\n    std::shared_ptr<int> i_nullptr2;\n\n    std::unique_ptr<int> i_zptr1;\n    std::unique_ptr<const int> i_zptr2;\n    std::unique_ptr<int> i_nullptr3;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar( i_xptr1, i_xptr2, i_xptr3 );\n      iar( i_yptr1, i_yptr2 );\n      iar( i_nullptr1, i_nullptr2 );\n\n      iar( i_zptr1, i_zptr2 );\n      iar( i_nullptr3 );\n    }\n\n    CHECK_EQ(o_xptr1.get(), o_xptr2.get());\n    CHECK_EQ(o_xptr1.get(), o_xptr3.get());\n    CHECK_EQ(i_xptr1.get(), i_xptr2.get());\n    CHECK_EQ(i_xptr1.get(), i_xptr3.get());\n    CHECK_EQ(*i_xptr1,      *i_xptr2);\n    CHECK_EQ(*i_xptr1,      *i_xptr3);\n\n    CHECK_EQ(o_yptr1.get(), o_yptr2.get());\n    CHECK_EQ(i_yptr1.get(), i_yptr2.get());\n    CHECK_EQ(*i_yptr1,      *i_yptr2);\n    CHECK_UNARY_FALSE(i_nullptr1);\n    CHECK_UNARY_FALSE(i_nullptr2);\n\n    CHECK_EQ(*i_xptr1, *o_xptr1);\n    CHECK_EQ(*i_xptr2, *o_xptr2);\n    CHECK_EQ(*i_xptr3, *o_xptr3);\n\n    CHECK_EQ(*i_zptr1, *o_zptr1);\n    CHECK_EQ(*i_zptr2, *o_zptr2);\n    CHECK_UNARY_FALSE(i_nullptr3);\n  }\n}\n\nclass TestClass\n{\n  public:\n    TestClass(int v) : x(v) { }\n    int x;\n\n  private:\n    friend class cereal::access;\n    TestClass() = default;\n\n    template<class Archive>\n      void serialize(Archive & ar) { ar(x); }\n};\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_default_construction()\n{\n  auto o_ptr = std::make_shared<TestClass>(1);\n  auto o_ptr2 = std::make_shared<const TestClass>(1);\n  std::shared_ptr<TestClass> i_ptr;\n  std::shared_ptr<const TestClass> i_ptr2;\n\n  std::ostringstream os;\n  {\n    OArchive oar(os);\n    oar(o_ptr);\n    oar(o_ptr2);\n  }\n  {\n    std::istringstream is(os.str());\n    IArchive iar(is);\n    iar(i_ptr);\n    iar(i_ptr2);\n  }\n  CHECK_EQ(o_ptr->x, i_ptr->x);\n  CHECK_EQ(o_ptr2->x, i_ptr2->x);\n}\n\n#endif // CEREAL_TEST_LOAD_CONSTRUCT_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/memory_cycles.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"memory_cycles.hpp\"\n\nTEST_SUITE_BEGIN(\"memory_cycles\");\n\nTEST_CASE(\"binary_memory_cycles\")\n{\n  test_memory_cycles<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_memory_cycles\")\n{\n  test_memory_cycles<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_memory_cycles\")\n{\n  test_memory_cycles<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_memory_cycles\")\n{\n  test_memory_cycles<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/memory_cycles.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_MEMORY_CYCLES_H_\n#define CEREAL_TEST_MEMORY_CYCLES_H_\n#include \"common.hpp\"\n\nstruct MemoryCycle\n{\n  MemoryCycle() = default;\n\n  MemoryCycle( int v ) :\n    value( v )\n  { }\n\n  int value;\n  std::weak_ptr<MemoryCycle> ptr;\n\n  bool operator==( MemoryCycle const & other ) const\n  {\n    return value == other.value && ptr.lock() == other.ptr.lock();\n  }\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( value, ptr );\n  }\n};\n\nstd::ostream& operator<<(std::ostream& os, MemoryCycle const & s)\n{\n  os << \"[value: \" << s.value << \" ptr: \" << s.ptr.lock() << \"]\";\n  return os;\n}\n\nclass MemoryCycleLoadAndConstruct\n{\n  public:\n    MemoryCycleLoadAndConstruct( int v ) :\n      value( v )\n    { }\n\n    MemoryCycleLoadAndConstruct( int v,\n        std::weak_ptr<MemoryCycleLoadAndConstruct> p ) :\n      value( v ),\n      ptr( p )\n    { }\n\n    bool operator==( MemoryCycleLoadAndConstruct const & other ) const\n    {\n      return value == other.value && ptr.lock() == other.ptr.lock();\n    }\n\n    template <class Archive>\n    void serialize( Archive & ar )\n    {\n      ar( value, ptr );\n    }\n\n    template <class Archive>\n    static void load_and_construct( Archive & ar, cereal::construct<MemoryCycleLoadAndConstruct> & construct )\n    {\n      int val;\n      std::weak_ptr<MemoryCycleLoadAndConstruct> p;\n\n      ar( val, p );\n      construct( val, p );\n    }\n\n    int value;\n    std::weak_ptr<MemoryCycleLoadAndConstruct> ptr;\n};\n\nstd::ostream& operator<<(std::ostream& os, MemoryCycleLoadAndConstruct const & s)\n{\n  os << \"[value: \" << s.value << \" ptr: \" << s.ptr.lock() << \"]\";\n  return os;\n}\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_memory_cycles()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    auto o_ptr1 = std::make_shared<MemoryCycle>( random_value<int>(gen) );\n    o_ptr1->ptr = o_ptr1;\n    auto o_ptr2 = std::make_shared<MemoryCycleLoadAndConstruct>( random_value<int>(gen) );\n    o_ptr2->ptr = o_ptr2;\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar( o_ptr1 );\n      oar( o_ptr2 );\n    }\n\n    decltype(o_ptr1) i_ptr1;\n    decltype(o_ptr2) i_ptr2;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar( i_ptr1 );\n      iar( i_ptr2 );\n    }\n\n    CHECK_EQ( o_ptr1->value, i_ptr1->value );\n    CHECK_EQ( i_ptr1.get(), i_ptr1->ptr.lock().get() );\n    CHECK_EQ( o_ptr2->value, i_ptr2->value );\n    CHECK_EQ( i_ptr2.get(), i_ptr2->ptr.lock().get() );\n  }\n}\n#endif // CEREAL_TEST_MEMORY_CYCLES_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/multimap.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"multimap.hpp\"\n\nTEST_SUITE_BEGIN(\"multimap\");\n\nTEST_CASE(\"binary_multimap\")\n{\n  test_multimap<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_multimap\")\n{\n  test_multimap<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_multimap\")\n{\n  test_multimap<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_multimap\")\n{\n  test_multimap<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/multimap.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_MULTIMAP_H_\n#define CEREAL_TEST_MULTIMAP_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_multimap()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::multimap<std::string, int> o_podmultimap;\n    for(int j=0; j<100; ++j)\n    {\n      auto key = random_value<std::string>(gen);\n      o_podmultimap.insert({key, random_value<int>(gen)});\n      o_podmultimap.insert({key, random_value<int>(gen)});\n    }\n\n    std::multimap<uint8_t, StructInternalSerialize> o_isermultimap;\n    for(int j=0; j<100; ++j)\n    {\n      auto key = random_value<uint8_t>(gen);\n      o_isermultimap.insert({key, { random_value<int>(gen), random_value<int>(gen) }});\n      o_isermultimap.insert({key, { random_value<int>(gen), random_value<int>(gen) }});\n    }\n\n    std::multimap<int16_t, StructInternalSplit> o_isplmultimap;\n    for(int j=0; j<100; ++j)\n    {\n      auto key = random_value<int16_t>(gen);\n      o_isplmultimap.insert({key, { random_value<int>(gen), random_value<int>(gen) }});\n      o_isplmultimap.insert({key, { random_value<int>(gen), random_value<int>(gen) }});\n    }\n\n    std::multimap<uint32_t, StructExternalSerialize> o_esermultimap;\n    for(int j=0; j<100; ++j)\n    {\n      auto key = random_value<uint32_t>(gen);\n      o_esermultimap.insert({key, { random_value<int>(gen), random_value<int>(gen) }});\n      o_esermultimap.insert({key, { random_value<int>(gen), random_value<int>(gen) }});\n    }\n\n    std::multimap<int8_t, StructExternalSplit> o_esplmultimap;\n    for(int j=0; j<100; ++j)\n    {\n      auto key = random_value<char>(gen);\n      o_esplmultimap.insert({key,  { random_value<int>(gen), random_value<int>(gen) }});\n      o_esplmultimap.insert({key,  { random_value<int>(gen), random_value<int>(gen) }});\n    }\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_podmultimap);\n      oar(o_isermultimap);\n      oar(o_isplmultimap);\n      oar(o_esermultimap);\n      oar(o_esplmultimap);\n    }\n\n    std::multimap<std::string, int> i_podmultimap;\n    std::multimap<uint8_t, StructInternalSerialize>   i_isermultimap;\n    std::multimap<int16_t, StructInternalSplit>        i_isplmultimap;\n    std::multimap<uint32_t, StructExternalSerialize> i_esermultimap;\n    std::multimap<int8_t, StructExternalSplit>       i_esplmultimap;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_podmultimap);\n      iar(i_isermultimap);\n      iar(i_isplmultimap);\n      iar(i_esermultimap);\n      iar(i_esplmultimap);\n    }\n\n#define MULTIMAP_CHECK(InMap, OutMap) \\\n    for( auto & pair : OutMap ) \\\n    { \\\n      auto const count = InMap.count( pair.first ); \\\n      CHECK_EQ( count, OutMap.count( pair.first ) ); \\\n      auto find = InMap.find( pair.first ); \\\n      bool found = false; \\\n      for( size_t i = 0; i < count; ++i, ++find ) \\\n        found |= find->second == pair.second; \\\n      CHECK_UNARY( found ); \\\n    }\n\n    MULTIMAP_CHECK( i_podmultimap, o_podmultimap );\n    MULTIMAP_CHECK( i_isermultimap, o_isermultimap );\n    MULTIMAP_CHECK( i_isplmultimap, o_isplmultimap );\n    MULTIMAP_CHECK( i_esermultimap, o_esermultimap );\n    MULTIMAP_CHECK( i_esplmultimap, o_esplmultimap );\n\n#undef MULTIMAP_CHECK\n  }\n}\n\n#endif // CEREAL_TEST_MULTIMAP_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/multiset.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"multiset.hpp\"\n\nTEST_SUITE_BEGIN(\"multiset\");\n\nTEST_CASE(\"binary_multiset\")\n{\n  test_multiset<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_multiset\")\n{\n  test_multiset<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_multiset\")\n{\n  test_multiset<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_multiset\")\n{\n  test_multiset<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/multiset.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_MULTISET_H_\n#define CEREAL_TEST_MULTISET_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_multiset()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::multiset<int> o_podmultiset;\n    for(int j=0; j<100; ++j)\n    {\n      int value = random_value<int>(gen);\n      o_podmultiset.insert(value);\n      o_podmultiset.insert(value);\n    }\n\n    std::multiset<StructInternalSerialize> o_isermultiset;\n    for(int j=0; j<100; ++j)\n    {\n      StructInternalSerialize value = { random_value<int>(gen), random_value<int>(gen) };\n      o_isermultiset.insert(value);\n      o_isermultiset.insert(value);\n    }\n\n    std::multiset<StructInternalSplit> o_isplmultiset;\n    for(int j=0; j<100; ++j)\n    {\n      StructInternalSplit value = { random_value<int>(gen), random_value<int>(gen) };\n      o_isplmultiset.insert(value);\n      o_isplmultiset.insert(value);\n    }\n\n    std::multiset<StructExternalSerialize> o_esermultiset;\n    for(int j=0; j<100; ++j)\n    {\n      StructExternalSerialize value = { random_value<int>(gen), random_value<int>(gen) };\n      o_esermultiset.insert(value);\n      o_esermultiset.insert(value);\n    }\n\n    std::multiset<StructExternalSplit> o_esplmultiset;\n    for(int j=0; j<100; ++j)\n    {\n      StructExternalSplit value = { random_value<int>(gen), random_value<int>(gen) };\n      o_esplmultiset.insert(value);\n      o_esplmultiset.insert(value);\n    }\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_podmultiset);\n      oar(o_isermultiset);\n      oar(o_isplmultiset);\n      oar(o_esermultiset);\n      oar(o_esplmultiset);\n    }\n\n    std::multiset<int> i_podmultiset;\n    std::multiset<StructInternalSerialize> i_isermultiset;\n    std::multiset<StructInternalSplit>     i_isplmultiset;\n    std::multiset<StructExternalSerialize> i_esermultiset;\n    std::multiset<StructExternalSplit>     i_esplmultiset;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_podmultiset);\n      iar(i_isermultiset);\n      iar(i_isplmultiset);\n      iar(i_esermultiset);\n      iar(i_esplmultiset);\n    }\n\n    for(auto const & p : i_podmultiset)\n    {\n      CHECK_EQ(o_podmultiset.count(p), i_podmultiset.count(p));\n    }\n\n    for(auto const & p : i_isermultiset)\n    {\n      CHECK_EQ(o_isermultiset.count(p), i_isermultiset.count(p));\n    }\n\n    for(auto const & p : i_isplmultiset)\n    {\n      CHECK_EQ(o_isplmultiset.count(p), i_isplmultiset.count(p));\n    }\n\n    for(auto const & p : i_esermultiset)\n    {\n      CHECK_EQ(o_esermultiset.count(p), i_esermultiset.count(p));\n    }\n\n    for(auto const & p : i_esplmultiset)\n    {\n      CHECK_EQ(o_esplmultiset.count(p), i_esplmultiset.count(p));\n    }\n  }\n}\n\n#endif // CEREAL_TEST_MULTISET_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/pair.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"pair.hpp\"\n\nTEST_SUITE_BEGIN(\"pair\");\n\nTEST_CASE(\"binary_pair\")\n{\n  test_pair<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_pair\")\n{\n  test_pair<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_pair\")\n{\n  test_pair<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\nTEST_CASE(\"json_pair\")\n{\n  test_pair<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/pair.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_PAIR_H_\n#define CEREAL_TEST_PAIR_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_pair()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  auto rng = [&](){ return random_value<int>(gen); };\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::pair<int, int> o_podpair = {rng(), rng()};\n    std::pair<StructInternalSerialize, StructInternalSerialize> o_iserpair = {{rng(), rng()}, {rng(), rng()}};\n    std::pair<StructInternalSplit, StructInternalSplit> o_isplpair = {{rng(), rng()}, {rng(), rng()}};\n    std::pair<StructExternalSerialize, StructExternalSerialize> o_eserpair = {{rng(), rng()}, {rng(), rng()}};\n    std::pair<StructExternalSplit, StructExternalSplit> o_esplpair = {{rng(), rng()}, {rng(), rng()}};\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_podpair);\n      oar(o_iserpair);\n      oar(o_isplpair);\n      oar(o_eserpair);\n      oar(o_esplpair);\n    }\n\n    std::pair<int, int> i_podpair;\n    std::pair<StructInternalSerialize, StructInternalSerialize> i_iserpair;\n    std::pair<StructInternalSplit, StructInternalSplit> i_isplpair;\n    std::pair<StructExternalSerialize, StructExternalSerialize> i_eserpair;\n    std::pair<StructExternalSplit, StructExternalSplit> i_esplpair;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_podpair);\n      iar(i_iserpair);\n      iar(i_isplpair);\n      iar(i_eserpair);\n      iar(i_esplpair);\n    }\n\n    CHECK_EQ( i_podpair.first, o_podpair.first );\n    CHECK_EQ( i_podpair.second, o_podpair.second );\n\n    CHECK_EQ( i_iserpair.first, o_iserpair.first );\n    CHECK_EQ( i_iserpair.second, o_iserpair.second );\n\n    CHECK_EQ( i_isplpair.first, o_isplpair.first );\n    CHECK_EQ( i_isplpair.second, o_isplpair.second );\n\n    CHECK_EQ( i_eserpair.first, o_eserpair.first );\n    CHECK_EQ( i_eserpair.second, o_eserpair.second );\n\n    CHECK_EQ( i_esplpair.first, o_esplpair.first );\n    CHECK_EQ( i_esplpair.second, o_esplpair.second );\n  }\n}\n\n#endif // CEREAL_TEST_PAIR_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/pod.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"pod.hpp\"\n\nTEST_SUITE_BEGIN(\"pod\");\n\nTEST_CASE(\"binary_pod\")\n{\n  test_pod<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_pod\")\n{\n  test_pod<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_pod\")\n{\n  test_pod<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_pod\")\n{\n  test_pod<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/pod.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_POD_H_\n#define CEREAL_TEST_POD_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_pod()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(size_t i=0; i<100; ++i)\n  {\n    bool          const o_bool   = random_value<uint8_t>(gen) % 2 ? true : false;\n    char          const o_char   = random_value<char>(gen);\n    unsigned char const o_uchar  = random_value<unsigned char>(gen);\n    uint8_t       const o_uint8  = random_value<uint8_t>(gen);\n    int8_t        const o_int8   = random_value<int8_t>(gen);\n    uint16_t      const o_uint16 = random_value<uint16_t>(gen);\n    int16_t       const o_int16  = random_value<int16_t>(gen);\n    uint32_t      const o_uint32 = random_value<uint32_t>(gen);\n    int32_t       const o_int32  = random_value<int32_t>(gen);\n    uint64_t      const o_uint64 = random_value<uint64_t>(gen);\n    int64_t       const o_int64  = random_value<int64_t>(gen);\n    float         const o_float  = random_value<float>(gen);\n    double        const o_double = random_value<double>(gen);\n\n    long double const o_long_double = random_value<long double>(gen);\n    long const o_long = random_value<long>(gen);\n    unsigned long const o_ulong = random_value<unsigned long>(gen);\n    long long const o_long_long = random_value<long long>(gen);\n    unsigned long long const o_ulong_long = random_value<unsigned long long>(gen);\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n      oar(o_bool);\n      oar(o_char);\n      oar(o_uchar);\n      oar(o_uint8);\n      oar(o_int8);\n      oar(o_uint16);\n      oar(o_int16);\n      oar(o_uint32);\n      oar(o_int32);\n      oar(o_uint64);\n      oar(o_int64);\n      oar(o_float);\n      oar(o_double);\n      oar(o_long_double);\n      oar(o_long);\n      oar(o_ulong);\n      oar(o_long_long);\n      oar(o_ulong_long);\n    }\n\n    bool          i_bool                       = false;\n    char          i_char                       = 0;\n    unsigned char i_uchar                      = 0;\n    uint8_t       i_uint8                      = 0;\n    int8_t        i_int8                       = 0;\n    uint16_t      i_uint16                     = 0;\n    int16_t       i_int16                      = 0;\n    uint32_t      i_uint32                     = 0;\n    int32_t       i_int32                      = 0;\n    uint64_t      i_uint64                     = 0;\n    int64_t       i_int64                      = 0;\n    float         i_float                      = 0;\n    double        i_double                     = 0;\n\n    long double i_long_double       = 0;\n    long i_long                     = 0;\n    unsigned long i_ulong           = 0;\n    long long i_long_long           = 0;\n    unsigned long long i_ulong_long = 0;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n      iar(i_bool);\n      iar(i_char);\n      iar(i_uchar);\n      iar(i_uint8);\n      iar(i_int8);\n      iar(i_uint16);\n      iar(i_int16);\n      iar(i_uint32);\n      iar(i_int32);\n      iar(i_uint64);\n      iar(i_int64);\n      iar(i_float);\n      iar(i_double);\n      iar(i_long_double);\n      iar(i_long);\n      iar(i_ulong);\n      iar(i_long_long);\n      iar(i_ulong_long);\n    }\n\n    CHECK_EQ(i_bool   , o_bool);\n    CHECK_EQ(i_char   , o_char);\n    CHECK_EQ(i_uchar  , o_uchar);\n    CHECK_EQ(i_uint8  , o_uint8);\n    CHECK_EQ(i_int8   , o_int8);\n    CHECK_EQ(i_uint16 , o_uint16);\n    CHECK_EQ(i_int16  , o_int16);\n    CHECK_EQ(i_uint32 , o_uint32);\n    CHECK_EQ(i_int32  , o_int32);\n    CHECK_EQ(i_uint64 , o_uint64);\n    CHECK_EQ(i_int64  , o_int64);\n    CHECK_EQ(i_float  , doctest::Approx(o_float).epsilon(1e-5F));\n    CHECK_EQ(i_double , doctest::Approx(o_double).epsilon(1e-5));\n\n    CHECK_EQ(i_long_double, doctest::Approx(o_long_double).epsilon(1e-5L));\n    CHECK_EQ(i_long,        o_long);\n    CHECK_EQ(i_ulong,       o_ulong);\n    CHECK_EQ(i_long_long,   o_long_long);\n    CHECK_EQ(i_ulong_long,  o_ulong_long);\n  }\n}\n\n#endif // CEREAL_TEST_POD_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/polymorphic.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"polymorphic.hpp\"\n\nTEST_SUITE_BEGIN(\"polymorphic\");\n\nTEST_CASE(\"binary_polymorphic\")\n{\n  test_polymorphic<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_polymorphic\")\n{\n  test_polymorphic<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_polymorphic\")\n{\n  test_polymorphic<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_polymorphic\")\n{\n  test_polymorphic<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\n#if CEREAL_THREAD_SAFE\nTEST_CASE(\"binary_polymorphic_threading\")\n{\n  test_polymorphic_threading<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_polymorphic_threading\")\n{\n  test_polymorphic_threading<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_polymorphic_threading\")\n{\n  test_polymorphic_threading<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_polymorphic_threading\")\n{\n  test_polymorphic_threading<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n#endif // CEREAL_THREAD_SAFE\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/polymorphic.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_POLYMORPHIC_H_\n#define CEREAL_TEST_POLYMORPHIC_H_\n#include \"common.hpp\"\n\n#if CEREAL_THREAD_SAFE\n#include <future>\n#endif\n\nstruct PolyBaseA\n{\n  virtual void foo() = 0;\n  virtual ~PolyBaseA() {}\n};\n\nstruct PolyBaseAA : PolyBaseA\n{\n  PolyBaseAA() {}\n  PolyBaseAA( long ww ) : w(ww) {}\n  virtual ~PolyBaseAA() {}\n  long w;\n\n  void foo() {}\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( w );\n  }\n\n  bool operator==( PolyBaseAA const & other ) const\n  {\n    return w == other.w;\n  }\n};\n\nCEREAL_REGISTER_POLYMORPHIC_RELATION(PolyBaseA, PolyBaseAA)\n\nstruct PolyBaseB : virtual PolyBaseAA\n{\n  PolyBaseB() {}\n  PolyBaseB( int xx, long ww ) : PolyBaseAA(ww), x(xx) {}\n  virtual ~PolyBaseB() {}\n  int x;\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( cereal::virtual_base_class<PolyBaseAA>( this ) );\n    ar( x );\n  }\n\n  bool operator==( PolyBaseB const & other ) const\n  {\n    return PolyBaseAA::operator==( other ) &&\n           x == other.x;\n  }\n};\n\nstruct PolyBaseC : virtual PolyBaseAA\n{\n  PolyBaseC() {}\n  PolyBaseC( double yy, long ww ) : PolyBaseAA(ww), y(yy) {}\n  virtual ~PolyBaseC() {}\n  double y;\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( cereal::virtual_base_class<PolyBaseAA>( this ) );\n    ar( y );\n  }\n\n  bool operator==( PolyBaseC const & other ) const\n  {\n    return PolyBaseAA::operator==( other ) &&\n           std::abs(y - other.y) < 1e-5;\n  }\n};\n\nstruct PolyDerivedD : PolyBaseB, PolyBaseC\n{\n  PolyDerivedD() {}\n  PolyDerivedD( std::string const & zz, double yy, int xx, long ww ) :\n    PolyBaseAA( ww ), PolyBaseB( xx, ww ), PolyBaseC( yy, ww ), z(zz) {}\n  virtual ~PolyDerivedD() {}\n  std::string z;\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( cereal::base_class<PolyBaseB>( this ) );\n    ar( cereal::base_class<PolyBaseC>( this ) );\n    ar( z );\n  }\n\n  bool operator==( PolyDerivedD const & other ) const\n  {\n    return PolyBaseB::operator==( other ) &&\n           PolyBaseC::operator==( other ) &&\n           z == other.z;\n  }\n};\n\nCEREAL_REGISTER_TYPE(PolyDerivedD)\n\nstruct PolyBase\n{\n  PolyBase() {}\n  PolyBase( int xx, float yy ) : x(xx), y(yy) {}\n  virtual ~PolyBase() {}\n  int x;\n  float y;\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( x, y );\n  }\n\n  virtual void foo() = 0;\n\n  bool operator==( PolyBase const & other ) const\n  {\n    return x == other.x && std::abs(y - other.y) < 1e-5;\n  }\n};\n\nstruct PolyDerived : PolyBase\n{\n  PolyDerived() {}\n  PolyDerived( int xx, float yy, bool aa, double bb ) :\n    PolyBase( xx, yy ), a(aa), b(bb) {}\n  virtual ~PolyDerived() {}\n\n  bool a;\n  double b;\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( cereal::base_class<PolyBase>( this ),\n        a, b );\n  }\n\n  bool operator==( PolyDerived const & other ) const\n  {\n    return PolyBase::operator==( other ) && a == other.a && std::abs(b - other.b) < 1e-5;\n  }\n\n  void foo() {}\n};\n\nCEREAL_REGISTER_TYPE(PolyDerived)\n\nstruct PolyLA : std::enable_shared_from_this<PolyLA>\n{\n  PolyLA() {}\n  virtual ~PolyLA() {}\n  virtual void foo() = 0;\n};\n\nstruct PolyDerivedLA : public PolyLA\n{\n  PolyDerivedLA( int xx ) : x( xx ) { }\n  virtual ~PolyDerivedLA() {}\n\n  int x;\n  std::vector<std::shared_ptr<PolyLA>> vec;\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( x );\n    ar( vec );\n  }\n\n  template <class Archive>\n  static void load_and_construct( Archive & ar, cereal::construct<PolyDerivedLA> & construct )\n  {\n    int xx;\n    ar( xx );\n    construct( xx );\n    ar( construct->vec );\n  }\n\n  void foo() {}\n\n  bool operator==( PolyDerivedLA const & other ) const\n  {\n    if( x != other.x )\n      return false;\n    if( vec.size() != other.vec.size() )\n      return false;\n    for( size_t i = 0; i < vec.size(); ++i )\n      if( !(*std::dynamic_pointer_cast<PolyDerivedLA>(vec[i]) == *std::dynamic_pointer_cast<PolyDerivedLA>(other.vec[i])) )\n        return false;\n\n    return true;\n  }\n};\n\nCEREAL_REGISTER_TYPE(PolyDerivedLA)\nCEREAL_REGISTER_POLYMORPHIC_RELATION(PolyLA, PolyDerivedLA)\n\nstd::ostream& operator<<(std::ostream& os, PolyDerivedLA const & s)\n{\n    os << \"[x: \" << s.x << \"] \";\n    for( auto const & v : s.vec )\n      os << \" child: \" << (*std::dynamic_pointer_cast<PolyDerivedLA>(v));\n    return os;\n}\n\nstd::ostream& operator<<(std::ostream& os, PolyDerived const & s)\n{\n    os << \"[x: \" << s.x << \" y: \" << s.y << \" a: \" << s.a << \" b: \" << s.b << \"]\";\n    return os;\n}\n\nstd::ostream& operator<<(std::ostream& os, PolyDerivedD const & s)\n{\n    os << \"[w: \" << s.w << \" x: \" << s.x << \" y: \" << s.y << \" z: \" << s.z << \"]\";\n    return os;\n}\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_polymorphic()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  #if CEREAL_THREAD_SAFE\n  static std::mutex testMutex;\n  #endif\n\n  auto rngB = [&](){ return random_value<int>( gen ) % 2 == 0; };\n  auto rngI = [&](){ return random_value<int>( gen ); };\n  auto rngL = [&](){ return random_value<long>( gen ); };\n  auto rngF = [&](){ return random_value<float>( gen ); };\n  auto rngD = [&](){ return random_value<double>( gen ); };\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::shared_ptr<PolyBase> o_shared = std::make_shared<PolyDerived>( rngI(), rngF(), rngB(), rngD() );\n    std::shared_ptr<const PolyBase> o_sharedC = std::make_shared<const PolyDerived>( rngI(), rngF(), rngB(), rngD() );\n\n    std::weak_ptr<PolyBase>   o_weak = o_shared;\n    std::weak_ptr<const PolyBase>   o_weakC = o_sharedC;\n\n    std::unique_ptr<PolyBase> o_unique( new PolyDerived( rngI(), rngF(), rngB(), rngD() ) );\n    std::unique_ptr<const PolyBase> o_uniqueC( new PolyDerived( rngI(), rngF(), rngB(), rngD() ) );\n\n    std::shared_ptr<PolyBaseA> o_sharedA = std::make_shared<PolyDerivedD>( random_basic_string<char>(gen),\n                                                                           rngD(), rngI(), rngL() );\n\n    std::weak_ptr<PolyBaseA>   o_weakA = o_sharedA;\n    std::unique_ptr<PolyBaseA> o_uniqueA( new PolyDerivedD( random_basic_string<char>(gen),\n                                                            rngD(), rngI(), rngL() ) );\n\n    auto pda = std::make_shared<PolyDerivedLA>( rngI() );\n    pda->vec.emplace_back( std::make_shared<PolyDerivedLA>( rngI() ) );\n    std::shared_ptr<PolyLA>   o_sharedLA = pda;\n\n    auto pdaC = std::make_shared<const PolyDerivedLA>( rngI() );\n    pda->vec.emplace_back( std::make_shared<PolyDerivedLA>( rngI() ) );\n    std::shared_ptr<const PolyLA>   o_sharedLAC = pdaC;\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar( o_shared, o_sharedC );\n      oar( o_weak, o_weakC );\n      oar( o_unique, o_uniqueC );\n\n      oar( o_sharedLA );\n      oar( o_sharedLAC );\n\n      oar( o_sharedA, o_weakA, o_uniqueA );\n    }\n\n    decltype(o_shared) i_shared;\n    decltype(o_sharedC) i_sharedC;\n\n    decltype(o_weak) i_weak;\n    decltype(o_weakC) i_weakC;\n\n    decltype(o_unique) i_unique;\n    decltype(o_uniqueC) i_uniqueC;\n\n    decltype(o_sharedLA) i_sharedLA;\n    decltype(o_sharedLAC) i_sharedLAC;\n\n    decltype(o_sharedA) i_sharedA;\n    decltype(o_weakA) i_weakA;\n    decltype(o_uniqueA) i_uniqueA;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar( i_shared, i_sharedC );\n      iar( i_weak, i_weakC );\n      iar( i_unique, i_uniqueC );\n\n      iar( i_sharedLA );\n      iar( i_sharedLAC );\n\n      iar( i_sharedA, i_weakA, i_uniqueA );\n    }\n\n    auto i_locked = i_weak.lock();\n    auto o_locked = o_weak.lock();\n\n    auto i_lockedC = i_weakC.lock();\n    auto o_lockedC = o_weakC.lock();\n\n    auto i_sharedLA2 = i_sharedLA->shared_from_this();\n    auto i_sharedLA2C = i_sharedLAC->shared_from_this();\n\n    auto i_lockedA = i_weakA.lock();\n    auto o_lockedA = o_weakA.lock();\n\n    #if CEREAL_THREAD_SAFE\n    std::lock_guard<std::mutex> lock( testMutex );\n    #endif\n\n    CHECK_EQ(i_shared.get(), i_locked.get());\n    CHECK_EQ(*dynamic_cast<PolyDerived*>(i_shared.get()), *dynamic_cast<PolyDerived*>(o_shared.get()));\n    CHECK_EQ(*dynamic_cast<PolyDerived*>(i_shared.get()), *dynamic_cast<PolyDerived*>(i_locked.get()));\n    CHECK_EQ(*dynamic_cast<PolyDerived*>(i_locked.get()), *dynamic_cast<PolyDerived*>(o_locked.get()));\n    CHECK_EQ(*dynamic_cast<PolyDerived*>(i_unique.get()), *dynamic_cast<PolyDerived*>(o_unique.get()));\n\n    CHECK_EQ(i_sharedC.get(), i_lockedC.get());\n    CHECK_EQ(*dynamic_cast<const PolyDerived*>(i_sharedC.get()), *dynamic_cast<const PolyDerived*>(o_sharedC.get()));\n    CHECK_EQ(*dynamic_cast<const PolyDerived*>(i_sharedC.get()), *dynamic_cast<const PolyDerived*>(i_lockedC.get()));\n    CHECK_EQ(*dynamic_cast<const PolyDerived*>(i_lockedC.get()), *dynamic_cast<const PolyDerived*>(o_lockedC.get()));\n    CHECK_EQ(*dynamic_cast<const PolyDerived*>(i_uniqueC.get()), *dynamic_cast<const PolyDerived*>(o_uniqueC.get()));\n\n    CHECK_EQ(*dynamic_cast<PolyDerivedLA*>(i_sharedLA.get()), *dynamic_cast<PolyDerivedLA*>(o_sharedLA.get()));\n    CHECK_EQ(*dynamic_cast<PolyDerivedLA*>(i_sharedLA2.get()), *dynamic_cast<PolyDerivedLA*>(o_sharedLA.get()));\n\n    CHECK_EQ(*dynamic_cast<const PolyDerivedLA*>(i_sharedLAC.get()), *dynamic_cast<const PolyDerivedLA*>(o_sharedLAC.get()));\n    CHECK_EQ(*dynamic_cast<const PolyDerivedLA*>(i_sharedLA2C.get()), *dynamic_cast<const PolyDerivedLA*>(o_sharedLAC.get()));\n\n    CHECK_EQ(i_sharedA.get(), i_lockedA.get());\n    CHECK_EQ(*dynamic_cast<PolyDerivedD*>(i_sharedA.get()), *dynamic_cast<PolyDerivedD*>(o_sharedA.get()));\n    CHECK_EQ(*dynamic_cast<PolyDerivedD*>(i_sharedA.get()), *dynamic_cast<PolyDerivedD*>(i_lockedA.get()));\n    CHECK_EQ(*dynamic_cast<PolyDerivedD*>(i_lockedA.get()), *dynamic_cast<PolyDerivedD*>(o_lockedA.get()));\n    CHECK_EQ(*dynamic_cast<PolyDerivedD*>(i_uniqueA.get()), *dynamic_cast<PolyDerivedD*>(o_uniqueA.get()));\n  }\n}\n\n#if CEREAL_THREAD_SAFE\ntemplate <class IArchive, class OArchive> inline\nvoid test_polymorphic_threading()\n{\n  std::vector<std::future<bool>> pool;\n  for( size_t i = 0; i < 100; ++i )\n    pool.emplace_back( std::async( std::launch::async,\n                                   [](){ test_polymorphic<IArchive, OArchive>(); return true; } ) );\n\n  for( auto & future : pool )\n    future.wait();\n\n  for( auto & future : pool )\n    CHECK_UNARY( future.get() );\n}\n#endif // CEREAL_THREAD_SAFE\n\nstruct Object\n{\n  Object() = default;\n  Object( int xx ) : x(xx) {}\n\n  virtual ~Object() {}\n  virtual void func() {}\n\n  int x;\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( x );\n  }\n};\n\n#define CEREAL_TEST_CREATE_DERIVED_CLASS(Base, Derived) \\\nstruct Derived : public Base                            \\\n{                                                       \\\n  Derived() = default;                                  \\\n  Derived( int yy ) : Base( yy ), Derived##y( yy ) {}   \\\n  virtual ~Derived() {}                                 \\\n                                                        \\\n  virtual void func() override {}                       \\\n                                                        \\\n  int Derived##y;                                       \\\n  template <class Archive>                              \\\n  void serialize( Archive & ar )                        \\\n  {                                                     \\\n    ar( cereal::base_class<Base>( this ), Derived##y ); \\\n  }                                                     \\\n};                                                      \\\nCEREAL_REGISTER_TYPE(Derived)\n\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived0)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived0,Derived1)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived1,Derived2)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived2,Derived3)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived3,Derived4)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived5)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived5,Derived6)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived6,Derived7)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived7,Derived8)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived8,Derived9)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived10)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived10,Derived11)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived11,Derived12)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived12,Derived13)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived13,Derived14)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived15)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived15,Derived16)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived16,Derived17)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived17,Derived18)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived18,Derived19)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived20)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived20,Derived21)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived21,Derived22)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived22,Derived23)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived23,Derived24)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived25)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived25,Derived26)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived26,Derived27)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived27,Derived28)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived28,Derived29)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived30)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived30,Derived31)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived31,Derived32)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived32,Derived33)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived33,Derived34)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived35)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived35,Derived36)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived36,Derived37)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived37,Derived38)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived38,Derived39)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived40)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived40,Derived41)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived41,Derived42)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived42,Derived43)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived43,Derived44)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived45)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived45,Derived46)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived46,Derived47)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived47,Derived48)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived48,Derived49)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived50)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived50,Derived51)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived51,Derived52)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived52,Derived53)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived53,Derived54)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived55)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived55,Derived56)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived56,Derived57)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived57,Derived58)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived58,Derived59)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived60)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived60,Derived61)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived61,Derived62)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived62,Derived63)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived63,Derived64)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived65)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived65,Derived66)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived66,Derived67)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived67,Derived68)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived68,Derived69)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived70)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived70,Derived71)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived71,Derived72)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived72,Derived73)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived73,Derived74)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived75)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived75,Derived76)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived76,Derived77)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived77,Derived78)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived78,Derived79)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived80)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived80,Derived81)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived81,Derived82)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived82,Derived83)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived83,Derived84)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived85)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived85,Derived86)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived86,Derived87)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived87,Derived88)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived88,Derived89)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived90)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived90,Derived91)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived91,Derived92)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived92,Derived93)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived93,Derived94)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived95)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived95,Derived96)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived96,Derived97)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived97,Derived98)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived98,Derived99)\n\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived0)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived0,Derived1)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived1,Derived2)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived2,Derived3)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived0,Derived4)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived4,Derived5)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived5,Derived6)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived0,Derived7)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived7,Derived8)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived8,Derived9)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived10)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived10,Derived11)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived11,Derived12)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived12,Derived13)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived10,Derived14)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived14,Derived15)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived15,Derived16)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived10,Derived17)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived17,Derived18)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived18,Derived19)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived20)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived20,Derived21)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived21,Derived22)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived22,Derived23)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived20,Derived24)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived24,Derived25)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived25,Derived26)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived20,Derived27)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived27,Derived28)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived28,Derived29)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived30)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived30,Derived31)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived31,Derived32)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived32,Derived33)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived30,Derived34)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived34,Derived35)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived35,Derived36)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived30,Derived37)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived37,Derived38)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived38,Derived39)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived40)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived40,Derived41)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived41,Derived42)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived42,Derived43)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived40,Derived44)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived44,Derived45)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived45,Derived46)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived40,Derived47)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived47,Derived48)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived48,Derived49)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived50)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived50,Derived51)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived51,Derived52)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived52,Derived53)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived50,Derived54)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived54,Derived55)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived55,Derived56)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived50,Derived57)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived57,Derived58)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived58,Derived59)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived60)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived60,Derived61)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived61,Derived62)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived62,Derived63)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived60,Derived64)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived64,Derived65)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived65,Derived66)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived60,Derived67)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived67,Derived68)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived68,Derived69)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived70)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived70,Derived71)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived71,Derived72)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived72,Derived73)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived70,Derived74)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived74,Derived75)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived75,Derived76)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived70,Derived77)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived77,Derived78)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived78,Derived79)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived80)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived80,Derived81)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived81,Derived82)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived82,Derived83)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived80,Derived84)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived84,Derived85)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived85,Derived86)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived80,Derived87)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived87,Derived88)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived88,Derived89)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Object,Derived90)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived90,Derived91)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived91,Derived92)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived92,Derived93)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived90,Derived94)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived94,Derived95)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived95,Derived96)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived90,Derived97)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived97,Derived98)\n//CEREAL_TEST_CREATE_DERIVED_CLASS(Derived98,Derived99)\n\n\n#endif // CEREAL_TEST_POLYMORPHIC_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/portability_test.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#include <cereal/archives/portable_binary.hpp>\n\n#include <cereal/types/memory.hpp>\n#include <cereal/types/map.hpp>\n#include <cereal/types/vector.hpp>\n\n#include <fstream>\n#include <iostream>\n\nstruct Data : std::enable_shared_from_this<Data>\n{\n  int32_t x;\n  int64_t y;\n\n  Data( int32_t xx, int64_t yy ) : x(xx), y(yy) {}\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( x, y );\n  }\n\n  template <class Archive>\n  static void load_and_construct( Archive & ar, cereal::construct<Data> & construct )\n  {\n    int32_t xx;\n    int64_t yy;\n    ar( xx, yy );\n    construct( xx, yy );\n  }\n\n  bool operator==( Data const & other ) const\n  {\n    if( x != other.x )\n    {\n      std::cerr << \"x=\" << x << \", other.x=\" << other.x << std::endl;\n      return false;\n    }\n    if( y != other.y )\n    {\n      std::cerr << \"y=\" << y << \", other.y=\" << other.y << std::endl;\n      return false;\n    }\n\n    return true;\n  }\n};\n\nstruct Data2\n{\n  int32_t x;\n  int64_t y;\n\n  Data2() = default;\n  Data2( int32_t xx, int64_t yy ) : x(xx), y(yy) {}\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( x, y );\n  }\n\n  bool operator==( Data2 const & other ) const\n  {\n    if( x != other.x )\n    {\n      std::cerr << \"x=\" << x << \", other.x=\" << other.x << std::endl;\n      return false;\n    }\n    if( y != other.y )\n    {\n      std::cerr << \"y=\" << y << \", other.y=\" << other.y << std::endl;\n      return false;\n    }\n\n    return true;\n  }\n};\n\nconst uint32_t AnotherCount = 32;\n\nstruct Another\n{\n  Another() = default;\n\n  Another( bool )\n  {\n    for( uint32_t i = 0; i < AnotherCount; ++i )\n      data[i] = Data2( i, i+1 );\n  }\n\n  std::map<std::uint32_t, Data2> data;\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( data );\n  }\n\n  bool operator==( Another const & other ) const\n  {\n    auto iter  = data.begin();\n    auto oiter = other.data.begin();\n    for( ; iter != data.end(); ++iter, ++oiter )\n    {\n      if( !(iter->second == oiter->second) )\n      {\n        std::cerr << \"Data mismatch at i=\" << iter->first << std::endl;\n        return false;\n      }\n    }\n\n    return true;\n  }\n};\n\nint main( int, char ** argv )\n{\n  std::vector<Another> vec_o;\n  for( int i = 0; i < 5; ++i )\n    vec_o.emplace_back( true );\n\n  auto data_o = std::make_shared<Data>( 33, 64 );\n  int32_t int_o = 7;\n\n  std::cerr << \"Portability test: \" << argv[2] << \"bit\" << std::endl;\n\n  if( std::string(argv[1]) == \"load\" )\n  {\n    std::ifstream is(\"portable.cereal\", std::ios::binary);\n    cereal::PortableBinaryInputArchive ar( is );\n\n    std::vector<Another> vec_i;\n    std::shared_ptr<Data> data_i;\n    int32_t int_i;\n\n    ar( int_i );\n\n    if( int_i != int_o )\n    {\n      std::cerr << \"in \" << int_i << \", out: \" << int_o << std::endl;\n      return -1;\n    }\n\n    ar( vec_i );\n    ar( data_i );\n\n    if( vec_i != vec_o )\n    {\n      std::cerr << \"Input vector did not equal output vector\" << std::endl;\n      return -1;\n    }\n\n    if( !(*data_i == *data_o) )\n    {\n      std::cerr << \"Data did not match\" << std::endl;\n      return -1;\n    }\n  }\n  else if( std::string(argv[1]) == \"save\" )\n  {\n    std::ofstream os(\"portable.cereal\", std::ios::binary);\n    cereal::PortableBinaryOutputArchive ar( os );\n\n    ar( int_o );\n    ar( vec_o );\n    ar( data_o );\n  }\n  else // clean\n  {\n    std::remove( \"portable.cereal\" );\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/portable_binary_archive.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"portable_binary_archive.hpp\"\n\nTEST_SUITE_BEGIN(\"portable_binary_archive\");\n\n#ifdef _MSC_VER\nTEST_CASE(\"util\")\n{\n  CHECK_EQ( cereal::util::demangledName<mynamespace::MyCustomClass>(), \"struct mynamespace::MyCustomClass\" );\n}\n#else\nTEST_CASE(\"util\")\n{\n  CHECK_EQ( cereal::util::demangledName<mynamespace::MyCustomClass>(), \"mynamespace::MyCustomClass\" );\n}\n#endif\n\nTEST_CASE(\"portable_binary_archive_endian_conversions\")\n{\n  // (last parameter is whether we load as little endian)\n  test_endian_serialization<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>(\n      cereal::PortableBinaryInputArchive::Options::BigEndian(), cereal::PortableBinaryOutputArchive::Options::BigEndian(), false );\n  test_endian_serialization<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>(\n      cereal::PortableBinaryInputArchive::Options::LittleEndian(), cereal::PortableBinaryOutputArchive::Options::BigEndian(), true );\n  test_endian_serialization<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>(\n      cereal::PortableBinaryInputArchive::Options::BigEndian(), cereal::PortableBinaryOutputArchive::Options::LittleEndian(), false );\n  test_endian_serialization<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>(\n      cereal::PortableBinaryInputArchive::Options::LittleEndian(), cereal::PortableBinaryOutputArchive::Options::LittleEndian(), true );\n}\n\n// Tests the default behavior to swap bytes to current machine's endianness\nTEST_CASE(\"portable_binary_archive_default_behavior\")\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(size_t i=0; i<100; ++i)\n  {\n    bool     o_bool   = random_value<uint8_t>(gen) % 2 ? true : false;\n    uint8_t  o_uint8  = random_value<uint8_t>(gen);\n    int8_t   o_int8   = random_value<int8_t>(gen);\n    uint16_t o_uint16 = random_value<uint16_t>(gen);\n    int16_t  o_int16  = random_value<int16_t>(gen);\n    uint32_t o_uint32 = random_value<uint32_t>(gen);\n    int32_t  o_int32  = random_value<int32_t>(gen);\n    uint64_t o_uint64 = random_value<uint64_t>(gen);\n    int64_t  o_int64  = random_value<int64_t>(gen);\n    float    o_float  = random_value<float>(gen);\n    double   o_double = random_value<double>(gen);\n\n    // swap the bytes on all of the data\n    CEREAL_TEST_SWAP_OUTPUT\n\n    std::ostringstream os;\n    {\n      cereal::BinaryOutputArchive oar(os);\n      // manually insert incorrect endian encoding\n      oar(!cereal::portable_binary_detail::is_little_endian());\n\n      oar(o_bool);\n      oar(o_uint8);\n      oar(o_int8);\n      oar(o_uint16);\n      oar(o_int16);\n      oar(o_uint32);\n      oar(o_int32);\n      oar(o_uint64);\n      oar(o_int64);\n      oar(o_float);\n      oar(o_double);\n    }\n\n    // swap back to original values\n    CEREAL_TEST_SWAP_OUTPUT\n\n    bool     i_bool   = false;\n    uint8_t  i_uint8  = 0;\n    int8_t   i_int8   = 0;\n    uint16_t i_uint16 = 0;\n    int16_t  i_int16  = 0;\n    uint32_t i_uint32 = 0;\n    int32_t  i_int32  = 0;\n    uint64_t i_uint64 = 0;\n    int64_t  i_int64  = 0;\n    float    i_float  = 0;\n    double   i_double = 0;\n\n    std::istringstream is(os.str());\n    {\n      cereal::PortableBinaryInputArchive iar(is);\n      iar(i_bool);\n      iar(i_uint8);\n      iar(i_int8);\n      iar(i_uint16);\n      iar(i_int16);\n      iar(i_uint32);\n      iar(i_int32);\n      iar(i_uint64);\n      iar(i_int64);\n      iar(i_float);\n      iar(i_double);\n    }\n\n    CEREAL_TEST_CHECK_EQUAL\n  }\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/portable_binary_archive.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_PORTABLE_BINARY_ARCHIVE_H_\n#define CEREAL_TEST_PORTABLE_BINARY_ARCHIVE_H_\n#include \"common.hpp\"\n\n#include <cmath>\n\nnamespace mynamespace { struct MyCustomClass {}; }\n\ntemplate <class T>\ninline void swapBytes( T & t )\n{\n  cereal::portable_binary_detail::swap_bytes<sizeof(T)>( reinterpret_cast<std::uint8_t*>(&t) );\n}\n\n// swaps all output data\n#define CEREAL_TEST_SWAP_OUTPUT \\\n    swapBytes(o_bool);          \\\n    swapBytes(o_uint8);         \\\n    swapBytes(o_int8);          \\\n    swapBytes(o_uint16);        \\\n    swapBytes(o_int16);         \\\n    swapBytes(o_uint32);        \\\n    swapBytes(o_int32);         \\\n    swapBytes(o_uint64);        \\\n    swapBytes(o_int64);         \\\n    swapBytes(o_float);         \\\n    swapBytes(o_double);\n\n#define CEREAL_TEST_CHECK_EQUAL                 \\\n    CHECK_EQ(i_bool   , o_bool);                \\\n    CHECK_EQ(i_uint8  , o_uint8);               \\\n    CHECK_EQ(i_int8   , o_int8);                \\\n    CHECK_EQ(i_uint16 , o_uint16);              \\\n    CHECK_EQ(i_int16  , o_int16);               \\\n    CHECK_EQ(i_uint32 , o_uint32);              \\\n    CHECK_EQ(i_int32  , o_int32);               \\\n    CHECK_EQ(i_uint64 , o_uint64);              \\\n    CHECK_EQ(i_int64  , o_int64);               \\\n    if( !std::isnan(i_float) && !std::isnan(o_float) ) CHECK_EQ(i_float , doctest::Approx(o_float).epsilon(1e-5F)); \\\n    if( !std::isnan(i_double) && !std::isnan(o_double) ) CHECK_EQ(i_double, doctest::Approx(o_double).epsilon(1e-5));\n\n// Last parameter exists to keep everything hidden in options\ntemplate <class IArchive, class OArchive> inline\nvoid test_endian_serialization( typename IArchive::Options const & iOptions, typename OArchive::Options const & oOptions, const std::uint8_t inputLittleEndian )\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(size_t i=0; i<100; ++i)\n  {\n    bool     o_bool   = random_value<uint8_t>(gen) % 2 ? true : false;\n    uint8_t  o_uint8  = random_value<uint8_t>(gen);\n    int8_t   o_int8   = random_value<int8_t>(gen);\n    uint16_t o_uint16 = random_value<uint16_t>(gen);\n    int16_t  o_int16  = random_value<int16_t>(gen);\n    uint32_t o_uint32 = random_value<uint32_t>(gen);\n    int32_t  o_int32  = random_value<int32_t>(gen);\n    uint64_t o_uint64 = random_value<uint64_t>(gen);\n    int64_t  o_int64  = random_value<int64_t>(gen);\n    float    o_float  = random_value<float>(gen);\n    double   o_double = random_value<double>(gen);\n\n    std::vector<int32_t> o_vector(100);\n    for(auto & elem : o_vector)\n      elem = random_value<uint32_t>(gen);\n\n    std::ostringstream os;\n    {\n      OArchive oar(os, oOptions);\n      oar(o_bool);\n      oar(o_uint8);\n      oar(o_int8);\n      oar(o_uint16);\n      oar(o_int16);\n      oar(o_uint32);\n      oar(o_int32);\n      oar(o_uint64);\n      oar(o_int64);\n      oar(o_float);\n      oar(o_double);\n      // We can't test vector directly here since we are artificially interfering with the endianness,\n      // which can result in the size being incorrect\n      oar(cereal::binary_data( o_vector.data(), static_cast<std::size_t>( o_vector.size() * sizeof(int32_t) ) ));\n    }\n\n    bool     i_bool   = false;\n    uint8_t  i_uint8  = 0;\n    int8_t   i_int8   = 0;\n    uint16_t i_uint16 = 0;\n    int16_t  i_int16  = 0;\n    uint32_t i_uint32 = 0;\n    int32_t  i_int32  = 0;\n    uint64_t i_uint64 = 0;\n    int64_t  i_int64  = 0;\n    float    i_float  = 0;\n    double   i_double = 0;\n    std::vector<int32_t> i_vector(100);\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is, iOptions);\n      iar(i_bool);\n      iar(i_uint8);\n      iar(i_int8);\n      iar(i_uint16);\n      iar(i_int16);\n      iar(i_uint32);\n      iar(i_int32);\n      iar(i_uint64);\n      iar(i_int64);\n      iar(i_float);\n      iar(i_double);\n      iar(cereal::binary_data( i_vector.data(), static_cast<std::size_t>( i_vector.size() * sizeof(int32_t) ) ));\n    }\n\n    // Convert to big endian if we expect to read big and didn't start big\n    if( cereal::portable_binary_detail::is_little_endian() ^ inputLittleEndian ) // Convert to little endian if\n    {\n      CEREAL_TEST_SWAP_OUTPUT\n      for( auto & val : o_vector )\n        swapBytes(val);\n    }\n\n    CEREAL_TEST_CHECK_EQUAL\n\n    check_collection(i_vector, o_vector);\n  }\n}\n\n#endif // CEREAL_TEST_PORTABLE_BINARY_ARCHIVE_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/priority_queue.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"priority_queue.hpp\"\n\nTEST_SUITE_BEGIN(\"priority_queue\");\n\nTEST_CASE(\"binary_priority_queue\")\n{\n  test_priority_queue<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_priority_queue\")\n{\n  test_priority_queue<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_priority_queue\")\n{\n  test_priority_queue<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_priority_queue\")\n{\n  test_priority_queue<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/priority_queue.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_PRIORITY_QUEUE_H_\n#define CEREAL_TEST_PRIORITY_QUEUE_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_priority_queue()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::priority_queue<int> o_podpriority_queue;\n    for(int j=0; j<100; ++j)\n      o_podpriority_queue.push(random_value<int>(gen));\n\n    std::priority_queue<StructInternalSerialize> o_iserpriority_queue;\n    for(int j=0; j<100; ++j)\n      o_iserpriority_queue.push({ random_value<int>(gen), random_value<int>(gen) });\n\n    std::priority_queue<StructInternalSplit> o_isplpriority_queue;\n    for(int j=0; j<100; ++j)\n      o_isplpriority_queue.push({ random_value<int>(gen), random_value<int>(gen) });\n\n    std::priority_queue<StructExternalSerialize> o_eserpriority_queue;\n    for(int j=0; j<100; ++j)\n      o_eserpriority_queue.push({ random_value<int>(gen), random_value<int>(gen) });\n\n    std::priority_queue<StructExternalSplit> o_esplpriority_queue;\n    for(int j=0; j<100; ++j)\n      o_esplpriority_queue.push({ random_value<int>(gen), random_value<int>(gen) });\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_podpriority_queue);\n      oar(o_iserpriority_queue);\n      oar(o_isplpriority_queue);\n      oar(o_eserpriority_queue);\n      oar(o_esplpriority_queue);\n    }\n\n    std::priority_queue<int> i_podpriority_queue;\n    std::priority_queue<StructInternalSerialize> i_iserpriority_queue;\n    std::priority_queue<StructInternalSplit>     i_isplpriority_queue;\n    std::priority_queue<StructExternalSerialize> i_eserpriority_queue;\n    std::priority_queue<StructExternalSplit>     i_esplpriority_queue;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_podpriority_queue);\n      iar(i_iserpriority_queue);\n      iar(i_isplpriority_queue);\n      iar(i_eserpriority_queue);\n      iar(i_esplpriority_queue);\n    }\n\n    auto & i_podpriority_queue_c  = cereal::queue_detail::container(i_podpriority_queue);\n    auto & i_iserpriority_queue_c = cereal::queue_detail::container(i_iserpriority_queue);\n    auto & i_isplpriority_queue_c = cereal::queue_detail::container(i_isplpriority_queue);\n    auto & i_eserpriority_queue_c = cereal::queue_detail::container(i_eserpriority_queue);\n    auto & i_esplpriority_queue_c = cereal::queue_detail::container(i_esplpriority_queue);\n\n    auto & o_podpriority_queue_c  = cereal::queue_detail::container(o_podpriority_queue);\n    auto & o_iserpriority_queue_c = cereal::queue_detail::container(o_iserpriority_queue);\n    auto & o_isplpriority_queue_c = cereal::queue_detail::container(o_isplpriority_queue);\n    auto & o_eserpriority_queue_c = cereal::queue_detail::container(o_eserpriority_queue);\n    auto & o_esplpriority_queue_c = cereal::queue_detail::container(o_esplpriority_queue);\n\n    check_collection(i_podpriority_queue_c,  o_podpriority_queue_c);\n    check_collection(i_iserpriority_queue_c, o_iserpriority_queue_c);\n    check_collection(i_isplpriority_queue_c, o_isplpriority_queue_c);\n    check_collection(i_eserpriority_queue_c, o_eserpriority_queue_c);\n    check_collection(i_esplpriority_queue_c, o_esplpriority_queue_c);\n  }\n}\n\n#endif // CEREAL_TEST_PRIORITY_QUEUE_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/queue.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"queue.hpp\"\n\nTEST_SUITE_BEGIN(\"queue\");\n\nTEST_CASE(\"binary_queue\")\n{\n  test_queue<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_queue\")\n{\n  test_queue<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_queue\")\n{\n  test_queue<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_queue\")\n{\n  test_queue<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/queue.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_QUEUE_H_\n#define CEREAL_TEST_QUEUE_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_queue()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::queue<int> o_podqueue;\n    for(int j=0; j<100; ++j)\n      o_podqueue.push(random_value<int>(gen));\n\n    std::queue<StructInternalSerialize> o_iserqueue;\n    for(int j=0; j<100; ++j)\n      o_iserqueue.push({ random_value<int>(gen), random_value<int>(gen) });\n\n    std::queue<StructInternalSplit> o_isplqueue;\n    for(int j=0; j<100; ++j)\n      o_isplqueue.push({ random_value<int>(gen), random_value<int>(gen) });\n\n    std::queue<StructExternalSerialize> o_eserqueue;\n    for(int j=0; j<100; ++j)\n      o_eserqueue.push({ random_value<int>(gen), random_value<int>(gen) });\n\n    std::queue<StructExternalSplit> o_esplqueue;\n    for(int j=0; j<100; ++j)\n      o_esplqueue.push({ random_value<int>(gen), random_value<int>(gen) });\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_podqueue);\n      oar(o_iserqueue);\n      oar(o_isplqueue);\n      oar(o_eserqueue);\n      oar(o_esplqueue);\n    }\n\n    std::queue<int> i_podqueue;\n    std::queue<StructInternalSerialize> i_iserqueue;\n    std::queue<StructInternalSplit>     i_isplqueue;\n    std::queue<StructExternalSerialize> i_eserqueue;\n    std::queue<StructExternalSplit>     i_esplqueue;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_podqueue);\n      iar(i_iserqueue);\n      iar(i_isplqueue);\n      iar(i_eserqueue);\n      iar(i_esplqueue);\n    }\n\n    auto & i_podqueue_c  = cereal::queue_detail::container(i_podqueue);\n    auto & i_iserqueue_c = cereal::queue_detail::container(i_iserqueue);\n    auto & i_isplqueue_c = cereal::queue_detail::container(i_isplqueue);\n    auto & i_eserqueue_c = cereal::queue_detail::container(i_eserqueue);\n    auto & i_esplqueue_c = cereal::queue_detail::container(i_esplqueue);\n\n    auto & o_podqueue_c  = cereal::queue_detail::container(o_podqueue);\n    auto & o_iserqueue_c = cereal::queue_detail::container(o_iserqueue);\n    auto & o_isplqueue_c = cereal::queue_detail::container(o_isplqueue);\n    auto & o_eserqueue_c = cereal::queue_detail::container(o_eserqueue);\n    auto & o_esplqueue_c = cereal::queue_detail::container(o_esplqueue);\n\n    check_collection(i_podqueue_c,  o_podqueue_c);\n    check_collection(i_iserqueue_c, o_iserqueue_c);\n    check_collection(i_isplqueue_c, o_isplqueue_c);\n    check_collection(i_eserqueue_c, o_eserqueue_c);\n    check_collection(i_esplqueue_c, o_esplqueue_c);\n  }\n}\n\n#endif // CEREAL_TEST_QUEUE_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/run_portability_test.cmake",
    "content": "macro(EXEC_CMD_CHECK)\n  message(\"running ${ARGN}\")\n  execute_process(COMMAND ${ARGN} RESULT_VARIABLE CMD_RESULT)\n  if(CMD_RESULT)\n    message(FATAL_ERROR \"Error running ${ARGN}\")\n  endif()\nendmacro()\n\nset(PORTABILITY_TEST_32 \"${PORTABILITY_TEST_DIR}/portability_test32\")\nset(PORTABILITY_TEST_64 \"${PORTABILITY_TEST_DIR}/portability_test64\")\n\nexec_cmd_check(${PORTABILITY_TEST_64} save 64)\nexec_cmd_check(${PORTABILITY_TEST_32} load 32)\nexec_cmd_check(${PORTABILITY_TEST_32} save 32)\nexec_cmd_check(${PORTABILITY_TEST_64} load 64)\nexec_cmd_check(${PORTABILITY_TEST_64} remove 64)\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/run_valgrind.sh",
    "content": "#!/usr/bin/env bash\n\nset -e\n\nTESTS=./test_*\n\nfor f in $TESTS\n  do\n    valgrind --tool=memcheck --leak-check=full $f\n  done\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/set.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"set.hpp\"\n\nTEST_SUITE_BEGIN(\"set\");\n\nTEST_CASE(\"binary_set\")\n{\n  test_set<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_set\")\n{\n  test_set<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_set\")\n{\n  test_set<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_set\")\n{\n  test_set<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/set.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_SET_H_\n#define CEREAL_TEST_SET_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_set()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::set<int> o_podset;\n    for(int j=0; j<100; ++j)\n      o_podset.insert(random_value<int>(gen));\n\n    std::set<StructInternalSerialize> o_iserset;\n    for(int j=0; j<100; ++j)\n      o_iserset.insert({ random_value<int>(gen), random_value<int>(gen) });\n\n    std::set<StructInternalSplit> o_isplset;\n    for(int j=0; j<100; ++j)\n      o_isplset.insert({ random_value<int>(gen), random_value<int>(gen) });\n\n    std::set<StructExternalSerialize> o_eserset;\n    for(int j=0; j<100; ++j)\n      o_eserset.insert({ random_value<int>(gen), random_value<int>(gen) });\n\n    std::set<StructExternalSplit> o_esplset;\n    for(int j=0; j<100; ++j)\n      o_esplset.insert({ random_value<int>(gen), random_value<int>(gen) });\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_podset);\n      oar(o_iserset);\n      oar(o_isplset);\n      oar(o_eserset);\n      oar(o_esplset);\n    }\n\n    std::set<int> i_podset;\n    std::set<StructInternalSerialize>   i_iserset;\n    std::set<StructInternalSplit>        i_isplset;\n    std::set<StructExternalSerialize> i_eserset;\n    std::set<StructExternalSplit>       i_esplset;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_podset);\n      iar(i_iserset);\n      iar(i_isplset);\n      iar(i_eserset);\n      iar(i_esplset);\n    }\n\n    check_collection(i_podset,  o_podset);\n    check_collection(i_iserset, o_iserset);\n    check_collection(i_isplset, o_isplset);\n    check_collection(i_eserset, o_eserset);\n    check_collection(i_esplset, o_esplset);\n  }\n}\n\n#endif // CEREAL_TEST_SET_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/stack.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"stack.hpp\"\n\nTEST_SUITE_BEGIN(\"stack\");\n\nTEST_CASE(\"binary_stack\")\n{\n  test_stack<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_stack\")\n{\n  test_stack<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_stack\")\n{\n  test_stack<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_stack\")\n{\n  test_stack<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/stack.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_STACK_H_\n#define CEREAL_TEST_STACK_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_stack()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::stack<int> o_podstack;\n    for(int j=0; j<100; ++j)\n      o_podstack.push(random_value<int>(gen));\n\n    std::stack<StructInternalSerialize> o_iserstack;\n    for(int j=0; j<100; ++j)\n      o_iserstack.push({ random_value<int>(gen), random_value<int>(gen) });\n\n    std::stack<StructInternalSplit> o_isplstack;\n    for(int j=0; j<100; ++j)\n      o_isplstack.push({ random_value<int>(gen), random_value<int>(gen) });\n\n    std::stack<StructExternalSerialize> o_eserstack;\n    for(int j=0; j<100; ++j)\n      o_eserstack.push({ random_value<int>(gen), random_value<int>(gen) });\n\n    std::stack<StructExternalSplit> o_esplstack;\n    for(int j=0; j<100; ++j)\n      o_esplstack.push({ random_value<int>(gen), random_value<int>(gen) });\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_podstack);\n      oar(o_iserstack);\n      oar(o_isplstack);\n      oar(o_eserstack);\n      oar(o_esplstack);\n    }\n\n    std::stack<int> i_podstack;\n    std::stack<StructInternalSerialize> i_iserstack;\n    std::stack<StructInternalSplit>     i_isplstack;\n    std::stack<StructExternalSerialize> i_eserstack;\n    std::stack<StructExternalSplit>     i_esplstack;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_podstack);\n      iar(i_iserstack);\n      iar(i_isplstack);\n      iar(i_eserstack);\n      iar(i_esplstack);\n    }\n\n    auto & i_podstack_c  = cereal::stack_detail::container(i_podstack);\n    auto & i_iserstack_c = cereal::stack_detail::container(i_iserstack);\n    auto & i_isplstack_c = cereal::stack_detail::container(i_isplstack);\n    auto & i_eserstack_c = cereal::stack_detail::container(i_eserstack);\n    auto & i_esplstack_c = cereal::stack_detail::container(i_esplstack);\n\n    auto & o_podstack_c  = cereal::stack_detail::container(o_podstack);\n    auto & o_iserstack_c = cereal::stack_detail::container(o_iserstack);\n    auto & o_isplstack_c = cereal::stack_detail::container(o_isplstack);\n    auto & o_eserstack_c = cereal::stack_detail::container(o_eserstack);\n    auto & o_esplstack_c = cereal::stack_detail::container(o_esplstack);\n\n    check_collection(i_podstack_c,  o_podstack_c );\n    check_collection(i_iserstack_c, o_iserstack_c);\n    check_collection(i_isplstack_c, o_isplstack_c);\n    check_collection(i_eserstack_c, o_eserstack_c);\n    check_collection(i_esplstack_c, o_esplstack_c);\n  }\n}\n\n#endif // CEREAL_TEST_STACK_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/structs.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"structs.hpp\"\n\nTEST_SUITE_BEGIN(\"structs\");\n\nTEST_CASE(\"binary_structs\")\n{\n  test_structs<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_structs\")\n{\n  test_structs<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_structs\")\n{\n  test_structs<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_structs\")\n{\n  test_structs<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/structs.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_STRUCTS_H_\n#define CEREAL_TEST_STRUCTS_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_structs()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    StructInternalSerialize o_iser = { random_value<int>(gen), random_value<int>(gen) };\n    StructInternalSplit     o_ispl = { random_value<int>(gen), random_value<int>(gen) };\n    StructExternalSerialize o_eser = { random_value<int>(gen), random_value<int>(gen) };\n    StructExternalSplit     o_espl = { random_value<int>(gen), random_value<int>(gen) };\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n      oar( o_iser, o_ispl, o_eser, o_espl);\n    }\n\n    StructInternalSerialize i_iser;\n    StructInternalSplit     i_ispl;\n    StructExternalSerialize i_eser;\n    StructExternalSplit     i_espl;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n      iar( i_iser, i_ispl, i_eser, i_espl);\n    }\n\n    CHECK_EQ(i_iser, o_iser);\n    CHECK_EQ(i_ispl, o_ispl);\n    CHECK_EQ(i_eser, o_eser);\n    CHECK_EQ(i_espl, o_espl);\n  }\n}\n\n#endif // CEREAL_TEST_STRUCTS_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/structs_minimal.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"structs_minimal.hpp\"\n\nTEST_SUITE_BEGIN(\"structs_minimal\");\n\nTEST_CASE(\"binary_structs_minimal\")\n{\n  test_structs_minimal<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_structs_minimal\")\n{\n  test_structs_minimal<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_structs_minimal\")\n{\n  test_structs_minimal<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_structs_minimal\")\n{\n  test_structs_minimal<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/structs_minimal.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_STRUCTS_MINIMAL_H_\n#define CEREAL_TEST_STRUCTS_MINIMAL_H_\n#include \"common.hpp\"\n\nclass MemberMinimal\n{\n  public:\n    MemberMinimal() = default;\n    MemberMinimal( std::string const & str ) : x( str ) {}\n\n  protected:\n    friend class cereal::access;\n\n    template <class Archive>\n    std::string save_minimal( Archive const & ) const\n    {\n      return x;\n    }\n\n    template <class Archive>\n    void load_minimal( Archive const &, std::string const & str )\n    {\n      x = str;\n    }\n\n  public:\n    std::string x;\n};\n\nclass MemberMinimalVersioned\n{\n  public:\n    MemberMinimalVersioned() = default;\n    MemberMinimalVersioned( double d ) : x( d ) {}\n\n  protected:\n    friend class cereal::access;\n\n    template <class Archive>\n    double save_minimal( Archive const &, const std::uint32_t ) const\n    {\n      return x;\n    }\n\n    template <class Archive>\n    void load_minimal( Archive const &, double const & d, const std::uint32_t )\n    {\n      x = d;\n    }\n\n  public:\n    double x;\n};\n\nstruct NonMemberMinimal\n{\n  NonMemberMinimal() = default;\n  NonMemberMinimal( std::uint32_t xx ) : x(xx) {}\n  std::uint32_t x;\n};\n\ntemplate <class Archive> inline\nstd::uint32_t save_minimal( Archive const &, NonMemberMinimal const & nmm )\n{\n  return nmm.x;\n}\n\ntemplate <class Archive> inline\nvoid load_minimal( Archive const &, NonMemberMinimal & nmm, std::uint32_t const & data )\n{\n  nmm.x = data;\n}\n\nstruct NonMemberMinimalVersioned\n{\n  NonMemberMinimalVersioned() = default;\n  NonMemberMinimalVersioned( bool xx ) : x(xx) {}\n  bool x;\n};\n\ntemplate <class Archive> inline\nbool save_minimal( Archive const &, NonMemberMinimalVersioned const & nmm, std::uint32_t const )\n{\n  return nmm.x;\n}\n\ntemplate <class Archive> inline\nvoid load_minimal( Archive const &, NonMemberMinimalVersioned & nmm, bool const & data, std::uint32_t const )\n{\n  nmm.x = data;\n}\n\nstruct TestStruct\n{\n  TestStruct() = default;\n  TestStruct( std::string const & s, double d, std::uint32_t u, bool b ) :\n    mm(s), mmv(d), nmm(u), nmmv(b) {}\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( mm, mmv );\n    ar( nmm, nmmv );\n  }\n\n  MemberMinimal mm;\n  MemberMinimalVersioned mmv;\n  NonMemberMinimal nmm;\n  NonMemberMinimalVersioned nmmv;\n};\n\nstruct Issue79Struct\n{\n  Issue79Struct() = default;\n  Issue79Struct( std::int32_t xx ) : x(xx) {}\n  std::int32_t x;\n};\n\ntemplate <class Archive, cereal::traits::DisableIf<std::is_same<Archive, cereal::BinaryOutputArchive>::value ||\n                                                   std::is_same<Archive, cereal::PortableBinaryOutputArchive>::value> = cereal::traits::sfinae>\ninline std::string save_minimal( Archive const &, Issue79Struct const & val )\n{\n  return std::to_string( val.x );\n}\n\ntemplate <class Archive, cereal::traits::DisableIf<std::is_same<Archive, cereal::BinaryInputArchive>::value ||\n                                                   std::is_same<Archive, cereal::PortableBinaryInputArchive>::value> = cereal::traits::sfinae>\ninline void load_minimal( Archive const &, Issue79Struct & val, std::string const & str )\n{\n  val.x = std::stoi( str );\n}\n\ntemplate <class Archive, cereal::traits::EnableIf<std::is_same<Archive, cereal::BinaryOutputArchive>::value ||\n                                                  std::is_same<Archive, cereal::PortableBinaryOutputArchive>::value> = cereal::traits::sfinae>\ninline std::int32_t save_minimal( Archive const &, Issue79Struct const & val )\n{\n  return val.x;\n}\n\ntemplate <class Archive, cereal::traits::EnableIf<std::is_same<Archive, cereal::BinaryInputArchive>::value ||\n                                                  std::is_same<Archive, cereal::PortableBinaryInputArchive>::value> = cereal::traits::sfinae>\ninline void load_minimal( Archive const &, Issue79Struct & val, std::int32_t const & xx )\n{\n  val.x = xx;\n}\n\nstruct Issue79StructInternal\n{\n  Issue79StructInternal() = default;\n  Issue79StructInternal( std::int32_t xx ) : x(xx) {}\n  std::int32_t x;\n\n  template <class Archive, cereal::traits::DisableIf<std::is_same<Archive, cereal::BinaryOutputArchive>::value ||\n                                                     std::is_same<Archive, cereal::PortableBinaryOutputArchive>::value> = cereal::traits::sfinae>\n  inline std::string save_minimal( Archive const & ) const\n  {\n    return std::to_string( x );\n  }\n\n  template <class Archive, cereal::traits::DisableIf<std::is_same<Archive, cereal::BinaryInputArchive>::value ||\n                                                     std::is_same<Archive, cereal::PortableBinaryInputArchive>::value> = cereal::traits::sfinae>\n  inline void load_minimal( Archive const &, std::string const & str )\n  {\n    x = std::stoi( str );\n  }\n\n  template <class Archive, cereal::traits::EnableIf<std::is_same<Archive, cereal::BinaryOutputArchive>::value ||\n                                                    std::is_same<Archive, cereal::PortableBinaryOutputArchive>::value> = cereal::traits::sfinae>\n  inline std::int32_t save_minimal( Archive const & ) const\n  {\n    return x;\n  }\n\n  template <class Archive, cereal::traits::EnableIf<std::is_same<Archive, cereal::BinaryInputArchive>::value ||\n                                                    std::is_same<Archive, cereal::PortableBinaryInputArchive>::value> = cereal::traits::sfinae>\n  inline void load_minimal( Archive const &, std::int32_t const & xx )\n  {\n    x = xx;\n  }\n};\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_structs_minimal()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    TestStruct o_struct = { random_basic_string<char>(gen), random_value<double>(gen),\n                            random_value<std::uint32_t>(gen), random_value<uint8_t>(gen) % 2 ? true : false };\n\n    Issue79Struct o_struct2 = { random_value<std::int32_t>(gen) };\n    Issue79StructInternal o_struct3 = { random_value<std::int32_t>(gen) };\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n      oar( o_struct );\n      oar( o_struct2 );\n      oar( o_struct3 );\n    }\n\n    decltype(o_struct) i_struct;\n    decltype(o_struct2) i_struct2;\n    decltype(o_struct3) i_struct3;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n      iar( i_struct );\n      iar( i_struct2 );\n      iar( i_struct3 );\n    }\n\n    CHECK_EQ(o_struct.mm.x, i_struct.mm.x);\n    CHECK_EQ(o_struct.mmv.x, doctest::Approx(i_struct.mmv.x).epsilon(1e-5));\n\n    CHECK_EQ(o_struct.nmm.x, i_struct.nmm.x);\n    CHECK_EQ(o_struct.nmmv.x, i_struct.nmmv.x);\n\n    CHECK_EQ(o_struct2.x, i_struct2.x);\n\n    CHECK_EQ(o_struct3.x, i_struct3.x);\n  }\n}\n\n#endif // CEREAL_TEST_STRUCTS_MINIMAL_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/structs_specialized.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"structs_specialized.hpp\"\n\nTEST_SUITE_BEGIN(\"structs_specialized\");\n\nTEST_CASE(\"binary_structs_specialized\")\n{\n  test_structs_specialized<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_structs_specialized\")\n{\n  test_structs_specialized<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_structs_specialized\")\n{\n  test_structs_specialized<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_structs_specialized\")\n{\n  test_structs_specialized<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/structs_specialized.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_STRUCTS_MINIMAL_H_\n#define CEREAL_TEST_STRUCTS_MINIMAL_H_\n#include \"common.hpp\"\n\nstruct BogusBase\n{\n  template <class Archive>\n  void serialize( Archive & ) {}\n\n  template <class Archive>\n  void save( Archive & ) const {}\n\n  template <class Archive>\n  void load( Archive & ) {}\n\n  template <class Archive>\n  int save_minimal( Archive const & ) const { return 0; }\n\n  template <class Archive>\n  void load_minimal( Archive const &, int const & ) {}\n};\n\nstruct BogusBaseVersioned\n{\n  template <class Archive>\n  void serialize( Archive &, const std::uint32_t ) {}\n\n  template <class Archive>\n  void save( Archive &, const std::uint32_t ) const {}\n\n  template <class Archive>\n  void load( Archive &, const std::uint32_t ) {}\n\n  template <class Archive>\n  int save_minimal( Archive const &, const std::uint32_t ) const { return 0; }\n\n  template <class Archive>\n  void load_minimal( Archive const &, int const &, const std::uint32_t ) {}\n};\n\nstruct BogusBasePolymorphic\n{\n  template <class Archive>\n  void serialize( Archive & ) {}\n\n  virtual void doesNothing() {}\n\n  virtual ~BogusBasePolymorphic() {}\n};\n\nclass SpecializedMSerialize : public BogusBase\n{\n  public:\n    SpecializedMSerialize() = default;\n    SpecializedMSerialize( int xx ) : x(xx) {}\n\n    int x;\n\n  private:\n    friend class cereal::access;\n    template <class Archive>\n    void serialize( Archive & ar )\n    {\n      ar( x );\n    }\n};\n\nclass SpecializedMSerializeVersioned : public BogusBaseVersioned\n{\n  public:\n    SpecializedMSerializeVersioned() = default;\n    SpecializedMSerializeVersioned( int xx ) : x(xx) {}\n\n    int x;\n\n  private:\n    friend class cereal::access;\n    template <class Archive>\n    void serialize( Archive & ar, const std::uint32_t )\n    {\n      ar( x );\n    }\n};\n\nclass SpecializedMSplit : public BogusBase\n{\n  public:\n    SpecializedMSplit() = default;\n    SpecializedMSplit( int xx ) : x(xx) {}\n\n    int x;\n\n  private:\n    friend class cereal::access;\n    template <class Archive>\n    void save( Archive & ar ) const\n    {\n      ar( x );\n    }\n\n    template <class Archive>\n    void load( Archive & ar )\n    {\n      ar( x );\n    }\n};\n\nclass SpecializedMSplitVersioned : public BogusBaseVersioned\n{\n  public:\n    SpecializedMSplitVersioned() = default;\n    SpecializedMSplitVersioned( int xx ) : x(xx) {}\n\n    int x;\n\n  private:\n    friend class cereal::access;\n    template <class Archive>\n    void save( Archive & ar, const std::uint32_t ) const\n    {\n      ar( x );\n    }\n\n    template <class Archive>\n    void load( Archive & ar, const std::uint32_t )\n    {\n      ar( x );\n    }\n};\n\nclass SpecializedMSplitPolymorphic : public BogusBasePolymorphic\n{\n  public:\n    SpecializedMSplitPolymorphic() = default;\n    SpecializedMSplitPolymorphic( int xx ) : x(xx) {}\n\n    virtual ~SpecializedMSplitPolymorphic() {}\n\n    int x;\n\n  private:\n    friend class cereal::access;\n    template <class Archive>\n    void save( Archive & ar ) const\n    {\n      ar( x );\n    }\n\n    template <class Archive>\n    void load( Archive & ar )\n    {\n      ar( x );\n    }\n};\n\nclass SpecializedMSplitMinimal : public BogusBase\n{\n  public:\n    SpecializedMSplitMinimal() = default;\n    SpecializedMSplitMinimal( int xx ) : x(xx) {}\n\n    int x;\n\n  private:\n    friend class cereal::access;\n    template <class Archive>\n    int save_minimal( Archive const & ) const\n    {\n      return x;\n    }\n\n    template <class Archive>\n    void load_minimal( Archive const &, int const & value )\n    {\n      x = value;\n    }\n};\n\nclass SpecializedMSplitVersionedMinimal : public BogusBaseVersioned\n{\n  public:\n    SpecializedMSplitVersionedMinimal() = default;\n    SpecializedMSplitVersionedMinimal( int xx ) : x(xx) {}\n\n    int x;\n\n  private:\n    friend class cereal::access;\n    template <class Archive>\n    int save_minimal( Archive const &, const std::uint32_t ) const\n    {\n      return x;\n    }\n\n    template <class Archive>\n    void load_minimal( Archive const &, int const & value, const std::uint32_t )\n    {\n      x = value;\n    }\n};\n\nclass SpecializedNMSerialize : public BogusBase\n{\n  public:\n    SpecializedNMSerialize() = default;\n    SpecializedNMSerialize( int xx ) : x(xx) {}\n\n    int x;\n};\n\ntemplate <class Archive>\nvoid serialize( Archive & ar, SpecializedNMSerialize & s )\n{\n  ar( s.x );\n}\n\nclass SpecializedNMSerializeVersioned : public BogusBaseVersioned\n{\n  public:\n    SpecializedNMSerializeVersioned() = default;\n    SpecializedNMSerializeVersioned( int xx ) : x(xx) {}\n\n    int x;\n};\n\ntemplate <class Archive>\nvoid serialize( Archive & ar, SpecializedNMSerializeVersioned & s )\n{\n  ar( s.x );\n}\n\nclass SpecializedNMSplit : public BogusBase\n{\n  public:\n    SpecializedNMSplit() = default;\n    SpecializedNMSplit( int xx ) : x(xx) {}\n\n    int x;\n};\n\ntemplate <class Archive>\nvoid load( Archive & ar, SpecializedNMSplit & s )\n{\n  ar( s.x );\n}\n\ntemplate <class Archive>\nvoid save( Archive & ar, SpecializedNMSplit const & s )\n{\n  ar( s.x );\n}\n\nclass SpecializedNMSplitVersioned : public BogusBaseVersioned\n{\n  public:\n    SpecializedNMSplitVersioned() = default;\n    SpecializedNMSplitVersioned( int xx ) : x(xx) {}\n\n    int x;\n};\n\ntemplate <class Archive>\nvoid load( Archive & ar, SpecializedNMSplitVersioned & s, const std::uint32_t )\n{\n  ar( s.x );\n}\n\ntemplate <class Archive>\nvoid save( Archive & ar, SpecializedNMSplitVersioned const & s, const std::uint32_t )\n{\n  ar( s.x );\n}\n\nclass SpecializedNMSplitMinimal : public BogusBase\n{\n  public:\n    SpecializedNMSplitMinimal() = default;\n    SpecializedNMSplitMinimal( int xx ) : x(xx) {}\n\n    int x;\n};\n\ntemplate <class Archive>\nvoid load_minimal( Archive const &, SpecializedNMSplitMinimal & s, int const & value )\n{\n  s.x = value;\n}\n\ntemplate <class Archive>\nint save_minimal( Archive const &, SpecializedNMSplitMinimal const & s )\n{\n  return s.x;\n}\n\nclass SpecializedNMSplitVersionedMinimal : public BogusBaseVersioned\n{\n  public:\n    SpecializedNMSplitVersionedMinimal() = default;\n    SpecializedNMSplitVersionedMinimal( int xx ) : x(xx) {}\n\n    int x;\n};\n\ntemplate <class Archive>\nvoid load_minimal( Archive const &, SpecializedNMSplitVersionedMinimal & s, int const & value, const std::uint32_t )\n{\n  s.x = value;\n}\n\ntemplate <class Archive>\nint save_minimal( Archive const &, SpecializedNMSplitVersionedMinimal const & s, const std::uint32_t )\n{\n  return s.x;\n}\n\nnamespace cereal\n{\n  template <class Archive> struct specialize<Archive, SpecializedMSerialize, cereal::specialization::member_serialize> {};\n  template <class Archive> struct specialize<Archive, SpecializedMSerializeVersioned, cereal::specialization::member_serialize> {};\n\n  template <class Archive> struct specialize<Archive, SpecializedMSplit, cereal::specialization::member_load_save> {};\n  template <class Archive> struct specialize<Archive, SpecializedMSplitVersioned, cereal::specialization::member_load_save> {};\n  template <class Archive> struct specialize<Archive, SpecializedMSplitPolymorphic, cereal::specialization::member_load_save> {};\n\n  template <class Archive> struct specialize<Archive, SpecializedMSplitMinimal, cereal::specialization::member_load_save_minimal> {};\n  template <class Archive> struct specialize<Archive, SpecializedMSplitVersionedMinimal, cereal::specialization::member_load_save_minimal> {};\n\n  template <class Archive> struct specialize<Archive, SpecializedNMSerialize, cereal::specialization::non_member_serialize> {};\n  template <class Archive> struct specialize<Archive, SpecializedNMSerializeVersioned, cereal::specialization::non_member_serialize> {};\n\n  template <class Archive> struct specialize<Archive, SpecializedNMSplit, cereal::specialization::non_member_load_save> {};\n  template <class Archive> struct specialize<Archive, SpecializedNMSplitVersioned, cereal::specialization::non_member_load_save> {};\n\n  template <class Archive> struct specialize<Archive, SpecializedNMSplitMinimal,\n           cereal::specialization::non_member_load_save_minimal> {};\n  template <class Archive> struct specialize<Archive, SpecializedNMSplitVersionedMinimal,\n           cereal::specialization::non_member_load_save_minimal> {};\n}\n\nCEREAL_REGISTER_TYPE(SpecializedMSplitPolymorphic)\nCEREAL_REGISTER_POLYMORPHIC_RELATION(BogusBasePolymorphic, SpecializedMSplitPolymorphic)\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_structs_specialized()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    SpecializedMSerialize               o_iser          = { random_value<int>(gen) };\n    SpecializedMSerializeVersioned      o_iserv         = { random_value<int>(gen) };\n\n    SpecializedMSplit                   o_ispl          = { random_value<int>(gen) };\n    SpecializedMSplitVersioned          o_isplv         = { random_value<int>(gen) };\n\n    // added re: issue #180\n    std::shared_ptr<BogusBasePolymorphic> o_shared_ispl = std::make_shared<SpecializedMSplitPolymorphic>( random_value<int>(gen) );\n\n    SpecializedMSplitMinimal            o_isplm         = { random_value<int>(gen) };\n    SpecializedMSplitVersionedMinimal   o_isplvm        = { random_value<int>(gen) };\n\n    SpecializedNMSerialize              o_eser          = { random_value<int>(gen) };\n    SpecializedNMSerializeVersioned     o_eserv         = { random_value<int>(gen) };\n\n    SpecializedNMSplit                  o_espl          = { random_value<int>(gen) };\n    SpecializedNMSplitVersioned         o_esplv         = { random_value<int>(gen) };\n\n    SpecializedNMSplitMinimal           o_esplm         = { random_value<int>(gen) };\n    SpecializedNMSplitVersionedMinimal  o_esplvm        = { random_value<int>(gen) };\n\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar( o_iser, o_iserv,\n           o_ispl, o_isplv, o_shared_ispl,\n           o_isplm, o_isplvm,\n           o_eser, o_eserv,\n           o_espl, o_esplv,\n           o_esplm, o_esplvm );\n    }\n\n    decltype(o_iser) i_iser;\n    decltype(o_iserv) i_iserv;\n\n    decltype(o_ispl) i_ispl;\n    decltype(o_isplv) i_isplv;\n\n    decltype(o_shared_ispl) i_shared_ispl;\n\n    decltype(o_isplm) i_isplm;\n    decltype(o_isplvm) i_isplvm;\n\n    decltype(o_eser) i_eser;\n    decltype(o_eserv) i_eserv;\n\n    decltype(o_espl) i_espl;\n    decltype(o_esplv) i_esplv;\n\n    decltype(o_esplm) i_esplm;\n    decltype(o_esplvm) i_esplvm;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar( i_iser, i_iserv,\n           i_ispl, i_isplv, i_shared_ispl,\n           i_isplm, i_isplvm,\n           i_eser, i_eserv,\n           i_espl, i_esplv,\n           i_esplm, i_esplvm );\n    }\n\n    CHECK_EQ(i_iser.x, o_iser.x);\n    CHECK_EQ(i_iserv.x, o_iserv.x);\n\n    CHECK_EQ(i_ispl.x, o_ispl.x);\n    CHECK_EQ(i_isplv.x, o_isplv.x);\n\n    CHECK_EQ(dynamic_cast<SpecializedMSplitPolymorphic*>(i_shared_ispl.get())->x, dynamic_cast<SpecializedMSplitPolymorphic*>(o_shared_ispl.get())->x);\n\n    CHECK_EQ(i_isplm.x, o_isplm.x);\n    CHECK_EQ(i_isplvm.x, o_isplvm.x);\n\n    CHECK_EQ(i_eser.x, o_eser.x);\n    CHECK_EQ(i_eserv.x, o_eserv.x);\n\n    CHECK_EQ(i_espl.x, o_espl.x);\n    CHECK_EQ(i_esplv.x, o_esplv.x);\n\n    CHECK_EQ(i_esplm.x, o_esplm.x);\n    CHECK_EQ(i_esplvm.x, o_esplvm.x);\n  }\n}\n\n#endif // CEREAL_TEST_STRUCTS_SPECIALIZED_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/tuple.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"tuple.hpp\"\n\nTEST_SUITE_BEGIN(\"tuple\");\n\nTEST_CASE(\"binary_tuple\")\n{\n  test_tuple<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_tuple\")\n{\n  test_tuple<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_tuple\")\n{\n  test_tuple<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_tuple\")\n{\n  test_tuple<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/tuple.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_TUPLE_H_\n#define CEREAL_TEST_TUPLE_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_tuple()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  auto rng = [&](){ return random_value<int>(gen); };\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    auto o_podtuple = std::make_tuple( rng(), rng(), rng(), rng() );\n    auto o_podtuple11 = std::make_tuple( rng(), rng(), rng(), rng(), rng(), rng(),\n                                         rng(), rng(), rng(), rng(), rng() );\n    auto o_isertuple = std::make_tuple( StructInternalSerialize( rng(), rng() ),\n        StructInternalSerialize( rng(), rng() ),\n        StructInternalSerialize( rng(), rng() ),\n        StructInternalSerialize( rng(), rng() ) );\n    auto o_ispltuple = std::make_tuple( StructInternalSplit( rng(), rng() ),\n        StructInternalSplit( rng(), rng() ),\n        StructInternalSplit( rng(), rng() ),\n        StructInternalSplit( rng(), rng() ) );\n    auto o_esertuple = std::make_tuple( StructExternalSerialize( rng(), rng() ),\n        StructExternalSerialize( rng(), rng() ),\n        StructExternalSerialize( rng(), rng() ),\n        StructExternalSerialize( rng(), rng() ) );\n    auto o_espltuple = std::make_tuple( StructExternalSerialize( rng(), rng() ),\n        StructExternalSerialize( rng(), rng() ),\n        StructExternalSerialize( rng(), rng() ),\n        StructExternalSerialize( rng(), rng() ) );\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_podtuple);\n      oar(o_podtuple11);\n      oar(o_isertuple);\n      oar(o_ispltuple);\n      oar(o_esertuple);\n      oar(o_espltuple);\n    }\n\n    decltype( o_podtuple   ) i_podtuple;\n    decltype( o_podtuple11 ) i_podtuple11;\n    decltype( o_isertuple  ) i_isertuple;\n    decltype( o_ispltuple  ) i_ispltuple;\n    decltype( o_esertuple  ) i_esertuple;\n    decltype( o_espltuple  ) i_espltuple;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_podtuple);\n      iar(i_podtuple11);\n      iar(i_isertuple);\n      iar(i_ispltuple);\n      iar(i_esertuple);\n      iar(i_espltuple);\n    }\n\n    CHECK_EQ( i_podtuple,   o_podtuple);\n    CHECK_EQ( i_podtuple11, o_podtuple11);\n    CHECK_EQ( i_isertuple,  o_isertuple);\n    CHECK_EQ( i_ispltuple,  o_ispltuple);\n    CHECK_EQ( i_esertuple,  o_esertuple);\n    CHECK_EQ( i_espltuple,  o_espltuple);\n  }\n}\n\n#endif // CEREAL_TEST_TUPLE_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/unordered_loads.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"unordered_loads.hpp\"\n\nTEST_SUITE_BEGIN(\"unordered_loads\");\n\nTEST_CASE(\"xml_unordered_loads\")\n{\n  test_unordered_loads<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_unordered_loads\")\n{\n  test_unordered_loads<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/unordered_loads.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_UNORDERED_LOADS_H_\n#define CEREAL_TEST_UNORDERED_LOADS_H_\n#include \"common.hpp\"\n\nstruct unordered_naming\n{\n  int x;\n  int xx;\n  int y;\n  int z;\n\n  template <class Archive>\n  void save( Archive & ar ) const\n  {\n    ar( CEREAL_NVP(x),\n        CEREAL_NVP(z),\n        CEREAL_NVP(y),\n        CEREAL_NVP(xx) );\n  }\n\n  template <class Archive>\n  void load( Archive & ar )\n  {\n    ar( x,\n        CEREAL_NVP(y),\n        CEREAL_NVP(z),\n        CEREAL_NVP(xx) );\n  }\n\n  bool operator==( unordered_naming const & other ) const\n  {\n    return x == other.x && xx == other.xx && y == other.y && z == other.z;\n  }\n};\n\nstd::ostream& operator<<(std::ostream& os, unordered_naming const & s)\n{\n  os << \"[x: \" << s.x << \" xx: \" << s.xx << \" y: \" << s.y << \" z: \" << s.z << \"]\";\n  return os;\n}\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_unordered_loads()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  auto rngB = [&](){ return random_value<int>( gen ) % 2 == 0; };\n  auto rngI = [&](){ return random_value<int>( gen ); };\n  auto rngF = [&](){ return random_value<float>( gen ); };\n  auto rngD = [&](){ return random_value<double>( gen ); };\n  auto rngS = [&](){ return random_basic_string<char>( gen ); };\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    auto const name1 = rngS();\n    auto const name2 = rngS();\n    auto const name3 = rngS();\n    auto const name4 = rngS();\n    auto const name5 = rngS();\n    auto const name6 = rngS();\n    auto const name7 = rngS();\n\n    int o_int1 = rngI();\n    double o_double2 = rngD();\n    std::vector<bool> o_vecbool3 = { rngB(), rngB(), rngB(), rngB(), rngB() };\n    int o_int4 = rngI();\n    int o_int5 = rngI();\n    int o_int6 = rngI();\n    std::pair<float, unordered_naming> o_un7;\n    o_un7.first = rngF();\n    o_un7.second.x = rngI();\n    o_un7.second.xx = rngI();\n    o_un7.second.y = rngI();\n    o_un7.second.z = rngI();\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar( cereal::make_nvp( name1, o_int1 ),\n           cereal::make_nvp( name2, o_double2 ),\n           cereal::make_nvp( name3, o_vecbool3 ),\n           cereal::make_nvp( name4, o_int4 ),\n           cereal::make_nvp( name5, o_int5 ),\n           cereal::make_nvp( name6, o_int6 ),\n           cereal::make_nvp( name7, o_un7 ) );\n    }\n\n    decltype(o_int1) i_int1;\n    decltype(o_double2) i_double2;\n    decltype(o_vecbool3) i_vecbool3;\n    decltype(o_int4) i_int4;\n    decltype(o_int5) i_int5;\n    decltype(o_int6) i_int6;\n    decltype(o_un7) i_un7;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar( cereal::make_nvp( name7, i_un7 ),\n           cereal::make_nvp( name2, i_double2 ),\n           cereal::make_nvp( name4, i_int4 ),\n           cereal::make_nvp( name3, i_vecbool3 ),\n           cereal::make_nvp( name1, i_int1 ),\n           cereal::make_nvp( name5, i_int5 ),\n           i_int6 );\n    }\n\n    CHECK_EQ(o_int1, i_int1);\n    CHECK_EQ(o_double2, doctest::Approx(o_double2).epsilon(1e-5));\n    CHECK_EQ(o_vecbool3.size(), i_vecbool3.size());\n    check_collection(i_vecbool3, o_vecbool3);\n    CHECK_EQ(o_int4, i_int4);\n    CHECK_EQ(o_int5, i_int5);\n    CHECK_EQ(o_int6, i_int6);\n    CHECK_EQ(o_un7.first, i_un7.first);\n    CHECK_EQ(o_un7.second, i_un7.second);\n  }\n}\n\n#endif // CEREAL_TEST_UNORDERED_LOADS_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/unordered_map.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"unordered_map.hpp\"\n\nTEST_SUITE_BEGIN(\"unordered_map\");\n\nTEST_CASE(\"binary_unordered_map\")\n{\n  test_unordered_map<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_unordered_map\")\n{\n  test_unordered_map<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_unordered_map\")\n{\n  test_unordered_map<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_unordered_map\")\n{\n  test_unordered_map<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/unordered_map.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_UNORDERED_MAP_H_\n#define CEREAL_TEST_UNORDERED_MAP_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_unordered_map()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::unordered_map<std::string, int> o_podunordered_map;\n    for(int j=0; j<100; ++j)\n      o_podunordered_map.insert({random_value<std::string>(gen), random_value<int>(gen)});\n\n    std::unordered_map<uint16_t, StructInternalSerialize> o_iserunordered_map;\n    for(int j=0; j<100; ++j)\n      o_iserunordered_map.insert({random_value<uint16_t>(gen), { random_value<int>(gen), random_value<int>(gen) }});\n\n    std::unordered_map<uint16_t, StructInternalSplit> o_isplunordered_map;\n    for(int j=0; j<100; ++j)\n      o_isplunordered_map.insert({random_value<uint16_t>(gen), { random_value<int>(gen), random_value<int>(gen) }});\n\n    std::unordered_map<uint32_t, StructExternalSerialize> o_eserunordered_map;\n    for(int j=0; j<100; ++j)\n      o_eserunordered_map.insert({random_value<uint32_t>(gen), { random_value<int>(gen), random_value<int>(gen) }});\n\n    std::unordered_map<int8_t, StructExternalSplit> o_esplunordered_map;\n    for(int j=0; j<100; ++j)\n      o_esplunordered_map.insert({random_value<char>(gen),  { random_value<int>(gen), random_value<int>(gen) }});\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_podunordered_map);\n      oar(o_iserunordered_map);\n      oar(o_isplunordered_map);\n      oar(o_eserunordered_map);\n      oar(o_esplunordered_map);\n    }\n\n    std::unordered_map<std::string, int> i_podunordered_map;\n    std::unordered_map<uint16_t, StructInternalSerialize>   i_iserunordered_map;\n    std::unordered_map<uint16_t, StructInternalSplit>        i_isplunordered_map;\n    std::unordered_map<uint32_t, StructExternalSerialize> i_eserunordered_map;\n    std::unordered_map<int8_t, StructExternalSplit>       i_esplunordered_map;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_podunordered_map);\n      iar(i_iserunordered_map);\n      iar(i_isplunordered_map);\n      iar(i_eserunordered_map);\n      iar(i_esplunordered_map);\n    }\n\n    for(auto const & p : i_podunordered_map)\n    {\n      auto v = o_podunordered_map.find(p.first);\n      CHECK_NE(v, o_podunordered_map.end());\n      CHECK_EQ(p.second, v->second);\n    }\n\n    for(auto const & p : i_iserunordered_map)\n    {\n      auto v = o_iserunordered_map.find(p.first);\n      CHECK_NE(v, o_iserunordered_map.end());\n      CHECK_EQ(p.second, v->second);\n    }\n\n    for(auto const & p : i_isplunordered_map)\n    {\n      auto v = o_isplunordered_map.find(p.first);\n      CHECK_NE(v, o_isplunordered_map.end());\n      CHECK_EQ(p.second, v->second);\n    }\n\n    for(auto const & p : i_eserunordered_map)\n    {\n      auto v = o_eserunordered_map.find(p.first);\n      CHECK_NE(v, o_eserunordered_map.end());\n      CHECK_EQ(p.second, v->second);\n    }\n\n    for(auto const & p : i_esplunordered_map)\n    {\n      auto v = o_esplunordered_map.find(p.first);\n      CHECK_NE(v, o_esplunordered_map.end());\n      CHECK_EQ(p.second, v->second);\n    }\n  }\n}\n\n#endif // CEREAL_TEST_UNORDERED_MAP_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/unordered_multimap.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"unordered_multimap.hpp\"\n\nTEST_SUITE_BEGIN(\"unordered_multimap\");\n\nTEST_CASE(\"binary_unordered_multimap\")\n{\n  test_unordered_multimap<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_unordered_multimap\")\n{\n  test_unordered_multimap<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_unordered_multimap\")\n{\n  test_unordered_multimap<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_unordered_multimap\")\n{\n  test_unordered_multimap<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/unordered_multimap.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_UNORDERED_MULTIMAP_H_\n#define CEREAL_TEST_UNORDERED_MULTIMAP_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_unordered_multimap()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::unordered_multimap<std::string, int> o_podunordered_multimap;\n    for(int j=0; j<100; ++j)\n    {\n      auto key = random_value<std::string>(gen);\n      o_podunordered_multimap.insert({key, random_value<int>(gen)});\n      o_podunordered_multimap.insert({key, random_value<int>(gen)});\n    }\n\n    std::unordered_multimap<int, StructInternalSerialize> o_iserunordered_multimap;\n    for(int j=0; j<100; ++j)\n    {\n      auto key = random_value<int>(gen);\n      o_iserunordered_multimap.insert({key, { random_value<int>(gen), random_value<int>(gen) }});\n      o_iserunordered_multimap.insert({key, { random_value<int>(gen), random_value<int>(gen) }});\n    }\n\n    std::unordered_multimap<int, StructInternalSplit> o_isplunordered_multimap;\n    for(int j=0; j<100; ++j)\n    {\n      auto key = random_value<int>(gen);\n      o_isplunordered_multimap.insert({key, { random_value<int>(gen), random_value<int>(gen) }});\n      o_isplunordered_multimap.insert({key, { random_value<int>(gen), random_value<int>(gen) }});\n    }\n\n    std::unordered_multimap<uint32_t, StructExternalSerialize> o_eserunordered_multimap;\n    for(int j=0; j<100; ++j)\n    {\n      auto key = random_value<uint32_t>(gen);\n      o_eserunordered_multimap.insert({key, { random_value<int>(gen), random_value<int>(gen) }});\n      o_eserunordered_multimap.insert({key, { random_value<int>(gen), random_value<int>(gen) }});\n    }\n\n    std::unordered_multimap<int8_t, StructExternalSplit> o_esplunordered_multimap;\n    for(int j=0; j<100; ++j)\n    {\n      auto key = random_value<char>(gen);\n      o_esplunordered_multimap.insert({key,  { random_value<int>(gen), random_value<int>(gen) }});\n      o_esplunordered_multimap.insert({key,  { random_value<int>(gen), random_value<int>(gen) }});\n    }\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_podunordered_multimap);\n      oar(o_iserunordered_multimap);\n      oar(o_isplunordered_multimap);\n      oar(o_eserunordered_multimap);\n      oar(o_esplunordered_multimap);\n    }\n\n    std::unordered_multimap<std::string, int> i_podunordered_multimap;\n    std::unordered_multimap<int, StructInternalSerialize>   i_iserunordered_multimap;\n    std::unordered_multimap<int, StructInternalSplit>        i_isplunordered_multimap;\n    std::unordered_multimap<uint32_t, StructExternalSerialize> i_eserunordered_multimap;\n    std::unordered_multimap<int8_t, StructExternalSplit>       i_esplunordered_multimap;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_podunordered_multimap);\n      iar(i_iserunordered_multimap);\n      iar(i_isplunordered_multimap);\n      iar(i_eserunordered_multimap);\n      iar(i_esplunordered_multimap);\n    }\n\n    CHECK_EQ(i_podunordered_multimap.size(),  o_podunordered_multimap.size());\n    CHECK_EQ(i_iserunordered_multimap.size(), o_iserunordered_multimap.size());\n    CHECK_EQ(i_isplunordered_multimap.size(), o_isplunordered_multimap.size());\n    CHECK_EQ(i_eserunordered_multimap.size(), o_eserunordered_multimap.size());\n    CHECK_EQ(i_esplunordered_multimap.size(), o_esplunordered_multimap.size());\n\n    for(auto const & p : i_podunordered_multimap)\n    {\n      size_t const bucket = o_podunordered_multimap.bucket(p.first);\n      auto bucket_begin   = o_podunordered_multimap.begin(bucket);\n      auto bucket_end     = o_podunordered_multimap.end(bucket);\n      CHECK_NE(std::find(bucket_begin, bucket_end, p), bucket_end);\n    }\n\n    for(auto const & p : i_iserunordered_multimap)\n    {\n      size_t const bucket = o_iserunordered_multimap.bucket(p.first);\n      auto bucket_begin   = o_iserunordered_multimap.begin(bucket);\n      auto bucket_end     = o_iserunordered_multimap.end(bucket);\n      CHECK_NE(std::find(bucket_begin, bucket_end, p), bucket_end);\n    }\n\n    for(auto const & p : i_isplunordered_multimap)\n    {\n      size_t const bucket = o_isplunordered_multimap.bucket(p.first);\n      auto bucket_begin   = o_isplunordered_multimap.begin(bucket);\n      auto bucket_end     = o_isplunordered_multimap.end(bucket);\n      CHECK_NE(std::find(bucket_begin, bucket_end, p), bucket_end);\n    }\n\n    for(auto const & p : i_eserunordered_multimap)\n    {\n      size_t const bucket = o_eserunordered_multimap.bucket(p.first);\n      auto bucket_begin   = o_eserunordered_multimap.begin(bucket);\n      auto bucket_end     = o_eserunordered_multimap.end(bucket);\n      CHECK_NE(std::find(bucket_begin, bucket_end, p), bucket_end);\n    }\n\n    for(auto const & p : i_esplunordered_multimap)\n    {\n      size_t const bucket = o_esplunordered_multimap.bucket(p.first);\n      auto bucket_begin   = o_esplunordered_multimap.begin(bucket);\n      auto bucket_end     = o_esplunordered_multimap.end(bucket);\n      CHECK_NE(std::find(bucket_begin, bucket_end, p), bucket_end);\n    }\n  }\n}\n\n#endif // CEREAL_TEST_UNORDERED_MULTIMAP_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/unordered_multiset.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"unordered_multiset.hpp\"\n\nTEST_SUITE_BEGIN(\"unordered_multiset\");\n\nTEST_CASE(\"binary_unordered_multiset\")\n{\n  test_unordered_multiset<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_unordered_multiset\")\n{\n  test_unordered_multiset<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_unordered_multiset\")\n{\n  test_unordered_multiset<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_unordered_multiset\")\n{\n  test_unordered_multiset<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/unordered_multiset.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_UNORDERED_MULTISET_H_\n#define CEREAL_TEST_UNORDERED_MULTISET_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_unordered_multiset()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::unordered_multiset<int> o_podunordered_multiset;\n    for(int j=0; j<100; ++j)\n    {\n      int value = random_value<int>(gen);\n      o_podunordered_multiset.insert(value);\n      o_podunordered_multiset.insert(value);\n    }\n\n    std::unordered_multiset<StructInternalSerialize, StructHash<StructInternalSerialize>> o_iserunordered_multiset;\n    for(int j=0; j<100; ++j)\n    {\n      StructInternalSerialize value = { random_value<int>(gen), random_value<int>(gen) };\n      o_iserunordered_multiset.insert(value);\n      o_iserunordered_multiset.insert(value);\n    }\n\n    std::unordered_multiset<StructInternalSplit, StructHash<StructInternalSplit>> o_isplunordered_multiset;\n    for(int j=0; j<100; ++j)\n    {\n      StructInternalSplit value = { random_value<int>(gen), random_value<int>(gen) };\n      o_isplunordered_multiset.insert(value);\n      o_isplunordered_multiset.insert(value);\n    }\n\n    std::unordered_multiset<StructExternalSerialize, StructHash<StructExternalSerialize>> o_eserunordered_multiset;\n    for(int j=0; j<100; ++j)\n    {\n      StructExternalSerialize value = { random_value<int>(gen), random_value<int>(gen) };\n      o_eserunordered_multiset.insert(value);\n      o_eserunordered_multiset.insert(value);\n    }\n\n    std::unordered_multiset<StructExternalSplit, StructHash<StructExternalSplit>> o_esplunordered_multiset;\n    for(int j=0; j<100; ++j)\n    {\n      StructExternalSplit value = { random_value<int>(gen), random_value<int>(gen) };\n      o_esplunordered_multiset.insert(value);\n      o_esplunordered_multiset.insert(value);\n    }\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_podunordered_multiset);\n      oar(o_iserunordered_multiset);\n      oar(o_isplunordered_multiset);\n      oar(o_eserunordered_multiset);\n      oar(o_esplunordered_multiset);\n    }\n\n    std::unordered_multiset<int> i_podunordered_multiset;\n    std::unordered_multiset<StructInternalSerialize, StructHash<StructInternalSerialize>> i_iserunordered_multiset;\n    std::unordered_multiset<StructInternalSplit, StructHash<StructInternalSplit>>         i_isplunordered_multiset;\n    std::unordered_multiset<StructExternalSerialize, StructHash<StructExternalSerialize>> i_eserunordered_multiset;\n    std::unordered_multiset<StructExternalSplit, StructHash<StructExternalSplit>>         i_esplunordered_multiset;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_podunordered_multiset);\n      iar(i_iserunordered_multiset);\n      iar(i_isplunordered_multiset);\n      iar(i_eserunordered_multiset);\n      iar(i_esplunordered_multiset);\n    }\n\n    for(auto const & p : i_podunordered_multiset)\n    {\n      CHECK_EQ(o_podunordered_multiset.count(p), i_podunordered_multiset.count(p));\n    }\n\n    for(auto const & p : i_iserunordered_multiset)\n    {\n      CHECK_EQ(o_iserunordered_multiset.count(p), i_iserunordered_multiset.count(p));\n    }\n\n    for(auto const & p : i_isplunordered_multiset)\n    {\n      CHECK_EQ(o_isplunordered_multiset.count(p), i_isplunordered_multiset.count(p));\n    }\n\n    for(auto const & p : i_eserunordered_multiset)\n    {\n      CHECK_EQ(o_eserunordered_multiset.count(p), i_eserunordered_multiset.count(p));\n    }\n\n    for(auto const & p : i_esplunordered_multiset)\n    {\n      CHECK_EQ(o_esplunordered_multiset.count(p), i_esplunordered_multiset.count(p));\n    }\n  }\n}\n\n#endif // CEREAL_TEST_UNORDERED_MULTISET_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/unordered_set.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"unordered_set.hpp\"\n\nTEST_SUITE_BEGIN(\"unordered_set\");\n\nTEST_CASE(\"binary_unordered_set\")\n{\n  test_unordered_set<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_unordered_set\")\n{\n  test_unordered_set<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_unordered_set\")\n{\n  test_unordered_set<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_unordered_set\")\n{\n  test_unordered_set<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/unordered_set.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_UNORDERED_SET_H_\n#define CEREAL_TEST_UNORDERED_SET_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_unordered_set()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::unordered_set<int> o_podunordered_set;\n    for(int j=0; j<100; ++j)\n      o_podunordered_set.insert(random_value<int>(gen));\n\n    std::unordered_set<StructInternalSerialize, StructHash<StructInternalSerialize>> o_iserunordered_set;\n    for(int j=0; j<100; ++j)\n      o_iserunordered_set.insert({ random_value<int>(gen), random_value<int>(gen) });\n\n    std::unordered_set<StructInternalSplit, StructHash<StructInternalSplit>> o_isplunordered_set;\n    for(int j=0; j<100; ++j)\n      o_isplunordered_set.insert({ random_value<int>(gen), random_value<int>(gen) });\n\n    std::unordered_set<StructExternalSerialize, StructHash<StructExternalSerialize>> o_eserunordered_set;\n    for(int j=0; j<100; ++j)\n      o_eserunordered_set.insert({ random_value<int>(gen), random_value<int>(gen) });\n\n    std::unordered_set<StructExternalSplit, StructHash<StructExternalSplit>> o_esplunordered_set;\n    for(int j=0; j<100; ++j)\n      o_esplunordered_set.insert({ random_value<int>(gen), random_value<int>(gen) });\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_podunordered_set);\n      oar(o_iserunordered_set);\n      oar(o_isplunordered_set);\n      oar(o_eserunordered_set);\n      oar(o_esplunordered_set);\n    }\n\n    std::unordered_set<int> i_podunordered_set;\n    std::unordered_set<StructInternalSerialize, StructHash<StructInternalSerialize>>   i_iserunordered_set;\n    std::unordered_set<StructInternalSplit, StructHash<StructInternalSplit>>           i_isplunordered_set;\n    std::unordered_set<StructExternalSerialize, StructHash<StructExternalSerialize>>   i_eserunordered_set;\n    std::unordered_set<StructExternalSplit, StructHash<StructExternalSplit>>           i_esplunordered_set;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_podunordered_set);\n      iar(i_iserunordered_set);\n      iar(i_isplunordered_set);\n      iar(i_eserunordered_set);\n      iar(i_esplunordered_set);\n    }\n\n    for(auto const & p : i_podunordered_set)\n    {\n      CHECK_EQ(o_podunordered_set.count(p), 1lu);\n    }\n\n    for(auto const & p : i_iserunordered_set)\n    {\n      CHECK_EQ(o_iserunordered_set.count(p), 1lu);\n    }\n\n    for(auto const & p : i_isplunordered_set)\n    {\n      CHECK_EQ(o_isplunordered_set.count(p), 1lu);\n    }\n\n    for(auto const & p : i_eserunordered_set)\n    {\n      CHECK_EQ(o_eserunordered_set.count(p), 1lu);\n    }\n\n    for(auto const & p : i_esplunordered_set)\n    {\n      CHECK_EQ(o_esplunordered_set.count(p), 1lu);\n    }\n  }\n}\n\n#endif // CEREAL_TEST_UNORDERED_SET_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/user_data_adapters.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"user_data_adapters.hpp\"\n\nTEST_SUITE_BEGIN(\"user_data_adapters\");\n\nTEST_CASE(\"binary_user_data_adapters\")\n{\n  test_user_data_adapters<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_user_data_adapters\")\n{\n  test_user_data_adapters<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_user_data_adapters\")\n{\n  test_user_data_adapters<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_user_data_adapters\")\n{\n  test_user_data_adapters<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/user_data_adapters.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_USER_DATA_ADAPTERS_H_\n#define CEREAL_TEST_USER_DATA_ADAPTERS_H_\n\n#include \"common.hpp\"\n#define CEREAL_FUTURE_EXPERIMENTAL\n#include <cereal/archives/adapters.hpp>\n\nstruct SomeStruct {};\n\nstruct UserData\n{\n  UserData( SomeStruct * pp, SomeStruct & r ) :\n    p(pp), ref(r) {}\n\n  SomeStruct * p;\n  std::reference_wrapper<SomeStruct> ref;\n};\n\nstruct UserStruct\n{\n  UserStruct( std::int32_t i,\n              SomeStruct * pointer,\n              SomeStruct & reference ) :\n    i32( i ),\n    p( pointer ),\n    ref( reference )\n  { }\n\n  UserStruct & operator=( UserStruct const & ) = delete;\n\n  std::int32_t i32;\n  SomeStruct const * p;\n  SomeStruct & ref;\n\n  template <class Archive>\n  void serialize( Archive & ar )\n  {\n    ar( i32 );\n  }\n\n  template <class Archive>\n  static void load_and_construct( Archive & ar, cereal::construct<UserStruct> & construct )\n  {\n    std::int32_t ii;\n    ar( ii );\n    auto & data = cereal::get_user_data<UserData>( ar );\n    construct( ii, data.p, data.ref.get() );\n  }\n};\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_user_data_adapters()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  auto rng = [&](){ return random_value<int>(gen); };\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    SomeStruct ss;\n    std::unique_ptr<UserStruct> o_ptr( new UserStruct( rng(), &ss, ss ) );\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_ptr);\n    }\n\n    decltype( o_ptr  ) i_ptr;\n\n    std::istringstream is(os.str());\n    {\n      UserData ud(&ss, ss);\n      cereal::UserDataAdapter<UserData, IArchive> iar(ud, is);\n\n      iar(i_ptr);\n    }\n\n    CHECK_EQ( i_ptr->p, o_ptr->p );\n    CHECK_EQ( std::addressof(i_ptr->ref), std::addressof(o_ptr->ref) );\n    CHECK_EQ( i_ptr->i32, o_ptr->i32 );\n\n    std::istringstream bad_is(os.str());\n    {\n      IArchive iar(bad_is);\n\n      CHECK_THROWS_AS( iar(i_ptr), ::cereal::Exception );\n    }\n  }\n}\n\n#endif // CEREAL_TEST_USER_DATA_ADAPTERS_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/valarray.cpp",
    "content": "/*\nCopyright (c) 2014, Randolph Voorhies, Shane Grant\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n* Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n* Neither the name of cereal nor the\nnames of its contributors may be used to endorse or promote products\nderived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"valarray.hpp\"\n\nTEST_SUITE_BEGIN(\"valarray\");\n\nTEST_CASE(\"binary_valarray\")\n{\n  test_valarray<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_valarray\")\n{\n  test_valarray<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_valarray\")\n{\n  test_valarray<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_valarray\")\n{\n  test_valarray<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/valarray.hpp",
    "content": "/*\nCopyright (c) 2014, Randolph Voorhies, Shane Grant\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n* Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n* Neither the name of cereal nor the\nnames of its contributors may be used to endorse or promote products\nderived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_VALARRAY_H_\n#define CEREAL_TEST_VALARRAY_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_valarray()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for (int ii = 0; ii<100; ++ii)\n  {\n    std::valarray<int> o_podvalarray(100);\n    for (auto & elem : o_podvalarray)\n      elem = random_value<int>(gen);\n\n    std::valarray<StructInternalSerialize> o_iservalarray(100);\n    for (auto & elem : o_iservalarray)\n      elem = StructInternalSerialize(random_value<int>(gen), random_value<int>(gen));\n\n    std::valarray<StructInternalSplit> o_isplvalarray(100);\n    for (auto & elem : o_isplvalarray)\n      elem = StructInternalSplit(random_value<int>(gen), random_value<int>(gen));\n\n    std::valarray<StructExternalSerialize> o_eservalarray(100);\n    for (auto & elem : o_eservalarray)\n      elem = StructExternalSerialize(random_value<int>(gen), random_value<int>(gen));\n\n    std::valarray<StructExternalSplit> o_esplvalarray(100);\n    for (auto & elem : o_esplvalarray)\n      elem = StructExternalSplit(random_value<int>(gen), random_value<int>(gen));\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_podvalarray);\n      oar(o_iservalarray);\n      oar(o_isplvalarray);\n      oar(o_eservalarray);\n      oar(o_esplvalarray);\n    }\n\n    std::valarray<int> i_podvalarray;\n    std::valarray<StructInternalSerialize> i_iservalarray;\n    std::valarray<StructInternalSplit>     i_isplvalarray;\n    std::valarray<StructExternalSerialize> i_eservalarray;\n    std::valarray<StructExternalSplit>     i_esplvalarray;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_podvalarray);\n      iar(i_iservalarray);\n      iar(i_isplvalarray);\n      iar(i_eservalarray);\n      iar(i_esplvalarray);\n    }\n\n    CHECK_EQ(i_podvalarray.size(), o_podvalarray.size());\n    CHECK_EQ(i_iservalarray.size(), o_iservalarray.size());\n    CHECK_EQ(i_isplvalarray.size(), o_isplvalarray.size());\n    CHECK_EQ(i_eservalarray.size(), o_eservalarray.size());\n    CHECK_EQ(i_esplvalarray.size(), o_esplvalarray.size());\n\n    check_collection(i_podvalarray , o_podvalarray );\n    check_collection(i_iservalarray, o_iservalarray);\n    check_collection(i_isplvalarray, o_isplvalarray);\n    check_collection(i_eservalarray, o_eservalarray);\n    check_collection(i_esplvalarray, o_esplvalarray);\n  }\n}\n\n#endif // CEREAL_TEST_VALARRAY_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/vector.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"vector.hpp\"\n\nTEST_SUITE_BEGIN(\"vector\");\n\nTEST_CASE(\"binary_vector\")\n{\n  test_vector<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_vector\")\n{\n  test_vector<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_vector\")\n{\n  test_vector<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_vector\")\n{\n  test_vector<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/vector.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_VECTOR_H_\n#define CEREAL_TEST_VECTOR_H_\n#include \"common.hpp\"\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_vector()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  for(int ii=0; ii<100; ++ii)\n  {\n    std::vector<int> o_podvector(100);\n    for(auto & elem : o_podvector)\n      elem = random_value<int>(gen);\n\n    std::vector<bool> o_boolvector; o_boolvector.resize(100);\n    for( size_t i = 0; i < 100; ++i )\n      o_boolvector[i] = (random_value<int>(gen) % 2) == 0;\n\n    std::vector<StructInternalSerialize> o_iservector(100);\n    for(auto & elem : o_iservector)\n      elem = StructInternalSerialize( random_value<int>(gen), random_value<int>(gen) );\n\n    std::vector<StructInternalSplit> o_isplvector(100);\n    for(auto & elem : o_isplvector)\n      elem = StructInternalSplit( random_value<int>(gen), random_value<int>(gen) );\n\n    std::vector<StructExternalSerialize> o_eservector(100);\n    for(auto & elem : o_eservector)\n      elem = StructExternalSerialize( random_value<int>(gen), random_value<int>(gen) );\n\n    std::vector<StructExternalSplit> o_esplvector(100);\n    for(auto & elem : o_esplvector)\n      elem = StructExternalSplit( random_value<int>(gen), random_value<int>(gen) );\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n\n      oar(o_podvector);\n      oar(o_boolvector);\n      oar(o_iservector);\n      oar(o_isplvector);\n      oar(o_eservector);\n      oar(o_esplvector);\n    }\n\n    std::vector<int> i_podvector;\n    std::vector<bool> i_boolvector;\n    std::vector<StructInternalSerialize> i_iservector;\n    std::vector<StructInternalSplit>     i_isplvector;\n    std::vector<StructExternalSerialize> i_eservector;\n    std::vector<StructExternalSplit>     i_esplvector;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n\n      iar(i_podvector);\n      iar(i_boolvector);\n      iar(i_iservector);\n      iar(i_isplvector);\n      iar(i_eservector);\n      iar(i_esplvector);\n    }\n\n    CHECK_EQ(i_podvector.size(),  o_podvector.size());\n    CHECK_EQ(i_boolvector.size(),  o_boolvector.size());\n    CHECK_EQ(i_iservector.size(), o_iservector.size());\n    CHECK_EQ(i_isplvector.size(), o_isplvector.size());\n    CHECK_EQ(i_eservector.size(), o_eservector.size());\n    CHECK_EQ(i_esplvector.size(), o_esplvector.size());\n\n    check_collection(i_podvector,  o_podvector );\n    check_collection(i_boolvector, o_boolvector);\n    check_collection(i_iservector, o_iservector);\n    check_collection(i_isplvector, o_isplvector);\n    check_collection(i_eservector, o_eservector);\n    check_collection(i_esplvector, o_esplvector);\n  }\n}\n\n#endif // CEREAL_TEST_VECTOR_H_\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/versioning.cpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include \"versioning.hpp\"\n\nTEST_SUITE_BEGIN(\"versioning\");\n\nTEST_CASE(\"binary_versioning\")\n{\n  test_versioning<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_versioning\")\n{\n  test_versioning<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_versioning\")\n{\n  test_versioning<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_versioning\")\n{\n  test_versioning<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n\n#if CEREAL_THREAD_SAFE\nTEST_CASE(\"binary_versioning_threading\")\n{\n  test_versioning_threading<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();\n}\n\nTEST_CASE(\"portable_binary_versioning_threading\")\n{\n  test_versioning_threading<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();\n}\n\nTEST_CASE(\"xml_versioning_threading\")\n{\n  test_versioning_threading<cereal::XMLInputArchive, cereal::XMLOutputArchive>();\n}\n\nTEST_CASE(\"json_versioning_threading\")\n{\n  test_versioning_threading<cereal::JSONInputArchive, cereal::JSONOutputArchive>();\n}\n#endif // CEREAL_THREAD_SAFE\n\nTEST_SUITE_END();\n"
  },
  {
    "path": "examples/libraries/cereal-1.3.0/unittests/versioning.hpp",
    "content": "/*\n  Copyright (c) 2014, Randolph Voorhies, Shane Grant\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n      * Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n      * Redistributions in binary form must reproduce the above copyright\n        notice, this list of conditions and the following disclaimer in the\n        documentation and/or other materials provided with the distribution.\n      * Neither the name of cereal nor the\n        names of its contributors may be used to endorse or promote products\n        derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES AND SHANE GRANT BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef CEREAL_TEST_VERSIONING_H_\n#define CEREAL_TEST_VERSIONING_H_\n#include \"common.hpp\"\n\n#if CEREAL_THREAD_SAFE\n#include <future>\n#endif\n\nnamespace Nested\n{\n  struct NestedClass\n  {\n    int x;\n\n    template <class Archive>\n    void serialize( Archive & ar )\n    { ar( x ); }\n  };\n}\n\nCEREAL_CLASS_VERSION( Nested::NestedClass, 1 )\n\nclass VersionStructMS\n{\n  public:\n    bool x;\n    std::uint32_t v;\n\n  private:\n    friend class cereal::access;\n    template <class Archive>\n    void serialize( Archive & ar, std::uint32_t const version )\n    {\n      ar( x );\n      v = version;\n    }\n};\n\nstruct VersionStructMSP\n{\n  uint8_t x;\n  std::uint32_t v;\n  template <class Archive>\n  void save( Archive & ar, std::uint32_t const /*version*/ ) const\n  {\n    ar( x );\n  }\n\n  template <class Archive>\n  void load( Archive & ar, std::uint32_t const version )\n  {\n    ar( x );\n    v = version;\n  }\n};\n\nstruct VersionStructNMS\n{\n  std::int32_t x;\n  std::uint32_t v;\n};\n\ntemplate <class Archive>\nvoid serialize( Archive & ar, VersionStructNMS & vnms, const std::uint32_t version )\n{\n  ar( vnms.x );\n  vnms.v = version;\n}\n\nstruct VersionStructNMSP\n{\n  double x;\n  std::uint32_t v;\n};\n\ntemplate <class Archive>\nvoid save( Archive & ar, VersionStructNMSP const & vnms, const std::uint32_t /*version*/ )\n{\n  ar( vnms.x );\n}\n\ntemplate <class Archive>\nvoid load( Archive & ar, VersionStructNMSP & vnms, const std::uint32_t version )\n{\n  ar( vnms.x );\n  vnms.v = version;\n}\n\nCEREAL_CLASS_VERSION( VersionStructMSP, 33 )\nCEREAL_CLASS_VERSION( VersionStructNMS, 66 )\nCEREAL_CLASS_VERSION( VersionStructNMSP, 99 )\n\ntemplate <class IArchive, class OArchive> inline\nvoid test_versioning()\n{\n  std::random_device rd;\n  std::mt19937 gen(rd());\n\n  #if CEREAL_THREAD_SAFE\n  #include <future>\n  static std::mutex testMutex;\n  #endif\n\n  for(size_t i=0; i<100; ++i)\n  {\n    VersionStructMS o_MS      = {random_value<uint8_t>(gen) % 2 ? true : false, 1};\n    VersionStructMSP o_MSP    = {random_value<uint8_t>(gen), 1};\n    VersionStructNMS o_NMS    = {random_value<int32_t>(gen), 1};\n    VersionStructNMSP o_NMSP  = {random_value<double>(gen), 1};\n    VersionStructMS o_MS2     = {random_value<uint8_t>(gen) % 2 ? true : false, 1};\n    VersionStructMSP o_MSP2   = {random_value<uint8_t>(gen), 1};\n    VersionStructNMS o_NMS2   = {random_value<int32_t>(gen), 1};\n    VersionStructNMSP o_NMSP2 = {random_value<double>(gen), 1};\n\n    std::ostringstream os;\n    {\n      OArchive oar(os);\n      oar( o_MS );\n      oar( o_MSP );\n      oar( o_NMS );\n      oar( o_NMSP );\n      oar( o_MS2 );\n      oar( o_MSP2 );\n      oar( o_NMS2 );\n      oar( o_NMSP2 );\n    }\n\n    decltype(o_MS) i_MS;\n    decltype(o_MSP) i_MSP;\n    decltype(o_NMS) i_NMS;\n    decltype(o_NMSP) i_NMSP;\n    decltype(o_MS2) i_MS2;\n    decltype(o_MSP2) i_MSP2;\n    decltype(o_NMS2) i_NMS2;\n    decltype(o_NMSP2) i_NMSP2;\n\n    std::istringstream is(os.str());\n    {\n      IArchive iar(is);\n      iar( i_MS );\n      iar( i_MSP );\n      iar( i_NMS );\n      iar( i_NMSP );\n      iar( i_MS2 );\n      iar( i_MSP2 );\n      iar( i_NMS2 );\n      iar( i_NMSP2 );\n    }\n\n    #if CEREAL_THREAD_SAFE\n    std::lock_guard<std::mutex> lock( testMutex );\n    #endif\n\n    CHECK_EQ(o_MS.x, i_MS.x);\n    CHECK_EQ(i_MS.v, 0u);\n    CHECK_EQ(o_MSP.x, i_MSP.x);\n    CHECK_EQ(i_MSP.v, 33u);\n    CHECK_EQ(o_NMS.x, i_NMS.x);\n    CHECK_EQ(i_NMS.v, 66u);\n    CHECK_EQ(o_NMSP.x, doctest::Approx(i_NMSP.x).epsilon(1e-5));\n    CHECK_EQ(i_NMSP.v, 99u);\n\n    CHECK_EQ(o_MS2.x, i_MS2.x);\n    CHECK_EQ(i_MS2.v, 0u);\n    CHECK_EQ(o_MSP2.x, i_MSP2.x);\n    CHECK_EQ(i_MSP2.v, 33u);\n    CHECK_EQ(o_NMS2.x, i_NMS2.x);\n    CHECK_EQ(i_NMS2.v, 66u);\n    CHECK_EQ(o_NMSP2.x, doctest::Approx(i_NMSP2.x).epsilon(1e-5));\n    CHECK_EQ(i_NMSP2.v, 99u);\n    }\n}\n\n#if CEREAL_THREAD_SAFE\ntemplate <class IArchive, class OArchive> inline\nvoid test_versioning_threading()\n{\n  std::vector<std::future<bool>> pool;\n  for( size_t i = 0; i < 100; ++i )\n    pool.emplace_back( std::async( std::launch::async,\n                                   [](){ test_versioning<IArchive, OArchive>(); return true; } ) );\n\n  for( auto & future : pool )\n    future.wait();\n\n  for( auto & future : pool )\n    CHECK_UNARY( future.get() );\n}\n#endif // CEREAL_THREAD_SAFE\n\n#endif // CEREAL_TEST_VERSIONING_H_\n"
  },
  {
    "path": "examples/libraries/fmt/.clang-format",
    "content": "# Run manually to reformat a file:\n# clang-format -i --style=file <file>\nLanguage: Cpp\nBasedOnStyle: Google\nIndentPPDirectives: AfterHash\nIndentCaseLabels: false\nAlwaysBreakTemplateDeclarations: false\nDerivePointerAlignment: false\n"
  },
  {
    "path": "examples/libraries/fmt/.github/pull_request_template.md",
    "content": "<!--\nPlease read the contribution guidelines before submitting a pull request:\nhttps://github.com/fmtlib/fmt/blob/master/CONTRIBUTING.md.\nBy submitting this pull request, you agree that your contributions are licensed\nunder the {fmt} license, and agree to future changes to the licensing.\n-->\n"
  },
  {
    "path": "examples/libraries/fmt/.github/workflows/doc.yml",
    "content": "name: doc\n\non: [push, pull_request]\n\njobs:\n  build:\n    # Use Ubuntu 20.04 because doxygen 1.8.13 from Ubuntu 18.04 is broken.\n    runs-on: ubuntu-20.04\n\n    steps:\n    - uses: actions/checkout@v2\n\n    - name: Create Build Environment\n      run: |\n        sudo apt update\n        sudo apt install doxygen python3-virtualenv\n        sudo npm install -g less clean-css\n        cmake -E make_directory ${{runner.workspace}}/build\n\n    - name: Build\n      working-directory: ${{runner.workspace}}/build\n      env:\n        KEY: ${{secrets.KEY}}\n      run: $GITHUB_WORKSPACE/support/build-docs.py\n"
  },
  {
    "path": "examples/libraries/fmt/.github/workflows/linux.yml",
    "content": "name: linux\n\non: [push, pull_request]\n\njobs:\n  build:\n    runs-on: ${{ matrix.os }}\n    strategy:\n      matrix:\n        cxx: [g++-4.8, g++-10, clang++-9]\n        build_type: [Debug, Release]\n        std: [11]\n        os: [ubuntu-18.04]\n        include:\n          - cxx: g++-4.8\n            install: sudo apt install g++-4.8\n            os: ubuntu-18.04\n          - cxx: g++-8\n            build_type: Debug\n            std: 14\n            install: sudo apt install g++-8\n            os: ubuntu-18.04\n          - cxx: g++-10\n            build_type: Debug\n            std: 17\n            os: ubuntu-18.04\n          - cxx: g++-10\n            build_type: Debug\n            std: 20\n            os: ubuntu-20.04\n          - cxx: clang++-9\n            build_type: Debug\n            fuzz: -DFMT_FUZZ=ON -DFMT_FUZZ_LINKMAIN=ON\n            std: 17\n            os: ubuntu-18.04\n          - cxx: clang++-11\n            build_type: Debug\n            std: 20\n            os: ubuntu-20.04\n          - cxx: clang++-11\n            build_type: Debug\n            std: 20\n            cxxflags: -stdlib=libc++\n            os: ubuntu-20.04\n            install: sudo apt install libc++-11-dev libc++abi-11-dev\n          - shared: -DBUILD_SHARED_LIBS=ON\n\n    steps:\n    - uses: actions/checkout@v2\n\n    - name: Create Build Environment\n      run: |\n        ${{matrix.install}}\n        sudo apt install locales-all\n        cmake -E make_directory ${{runner.workspace}}/build\n\n    - name: Configure\n      working-directory: ${{runner.workspace}}/build\n      env:\n        CXX: ${{matrix.cxx}}\n        CXXFLAGS: ${{matrix.cxxflags}}\n      run: |\n        cmake -DCMAKE_BUILD_TYPE=${{matrix.build_type}} ${{matrix.fuzz}} ${{matrix.shared}} \\\n              -DCMAKE_CXX_STANDARD=${{matrix.std}} -DFMT_DOC=OFF \\\n              -DCMAKE_CXX_VISIBILITY_PRESET=hidden -DCMAKE_VISIBILITY_INLINES_HIDDEN=ON \\\n              -DFMT_PEDANTIC=ON -DFMT_WERROR=ON $GITHUB_WORKSPACE\n\n    - name: Build\n      working-directory: ${{runner.workspace}}/build\n      run: |\n        threads=`nproc`\n        cmake --build . --config ${{matrix.build_type}} --parallel $threads\n\n    - name: Test\n      working-directory: ${{runner.workspace}}/build\n      run: ctest -C ${{matrix.build_type}}\n      env:\n        CTEST_OUTPUT_ON_FAILURE: True\n"
  },
  {
    "path": "examples/libraries/fmt/.github/workflows/macos.yml",
    "content": "name: macos\n\non: [push, pull_request]\n\njobs:\n  build:\n    runs-on: macos-10.15\n    strategy:\n      matrix:\n        build_type: [Debug, Release]\n        include:\n          - shared: -DBUILD_SHARED_LIBS=ON\n\n    steps:\n    - uses: actions/checkout@v2\n\n    - name: Create Build Environment\n      run: cmake -E make_directory ${{runner.workspace}}/build\n\n    - name: Configure\n      working-directory: ${{runner.workspace}}/build\n      run: |\n        cmake -DCMAKE_BUILD_TYPE=${{matrix.build_type}} ${{matrix.shared}} \\\n              -DCMAKE_CXX_VISIBILITY_PRESET=hidden -DCMAKE_VISIBILITY_INLINES_HIDDEN=ON \\\n              -DFMT_DOC=OFF -DFMT_PEDANTIC=ON -DFMT_WERROR=ON $GITHUB_WORKSPACE\n\n    - name: Build\n      working-directory: ${{runner.workspace}}/build\n      run: |\n        threads=`sysctl -n hw.logicalcpu`\n        cmake --build . --config ${{matrix.build_type}} --parallel $threads\n\n    - name: Test\n      working-directory: ${{runner.workspace}}/build\n      run: ctest -C ${{matrix.build_type}}\n      env:\n        CTEST_OUTPUT_ON_FAILURE: True\n"
  },
  {
    "path": "examples/libraries/fmt/.github/workflows/windows.yml",
    "content": "name: windows\n\non: [push, pull_request]\n\njobs:\n  build:\n    runs-on: ${{matrix.os}}\n    strategy:\n      matrix:\n        # windows-2016 and windows-2019 have MSVC 2017 and 2019 installed\n        # respectively: https://github.com/actions/virtual-environments.\n        os: [windows-2016, windows-2019]\n        platform: [Win32, x64]\n        build_type: [Debug, Release]\n        standard: [11, 17, 20]\n        include:\n          - os: windows-2016\n            platform: Win32\n            build_type: Debug\n            shared: -DBUILD_SHARED_LIBS=ON\n        exclude:\n          - os: windows-2016\n            platform: Win32\n          - os: windows-2016\n            standard: 17\n          - os: windows-2016\n            standard: 20\n          - os: windows-2019\n            standard: 11\n          - os: windows-2019\n            standard: 20\n            platform: Win32\n\n    steps:\n    - uses: actions/checkout@v2\n\n    - name: Create Build Environment\n      run: cmake -E make_directory ${{runner.workspace}}/build\n\n    - name: Configure\n      # Use a bash shell for $GITHUB_WORKSPACE.\n      shell: bash\n      working-directory: ${{runner.workspace}}/build\n      run: |\n        cmake -DCMAKE_BUILD_TYPE=${{matrix.build_type}} ${{matrix.shared}} \\\n              -A ${{matrix.platform}} \\\n              -DCMAKE_CXX_STANDARD=${{matrix.standard}} \\\n              $GITHUB_WORKSPACE\n\n    - name: Build\n      working-directory: ${{runner.workspace}}/build\n      run: |\n        $threads = (Get-CimInstance Win32_ComputerSystem).NumberOfLogicalProcessors\n        cmake --build . --config ${{matrix.build_type}} --parallel $threads\n\n    - name: Test\n      working-directory: ${{runner.workspace}}/build\n      run: ctest -C ${{matrix.build_type}} -V\n      env:\n        CTEST_OUTPUT_ON_FAILURE: True\n"
  },
  {
    "path": "examples/libraries/fmt/.gitignore",
    "content": ".vscode/\n.vs/\n\n*.iml\n.idea/\n.externalNativeBuild/\n.gradle/\ngradle/\ngradlew*\nlocal.properties\nbuild/\nsupport/.cxx\n\nbin/\n/_CPack_Packages\n/CMakeScripts\n/doc/doxyxml\n/doc/html\n/doc/node_modules\nvirtualenv\n/Testing\n/install_manifest.txt\n*~\n*.a\n*.so*\n*.xcodeproj\n*.zip\ncmake_install.cmake\nCPack*.cmake\nfmt-*.cmake\nCTestTestfile.cmake\nCMakeCache.txt\nCMakeFiles\nFMT.build\nMakefile\nrun-msbuild.bat\nfmt.pc\n"
  },
  {
    "path": "examples/libraries/fmt/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.1...3.18)\n\n# Fallback for using newer policies on CMake <3.12.\nif(${CMAKE_VERSION} VERSION_LESS 3.12)\n  cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})\nendif()\n\n# Determine if fmt is built as a subproject (using add_subdirectory)\n# or if it is the master project.\nif (NOT DEFINED FMT_MASTER_PROJECT)\n  set(FMT_MASTER_PROJECT OFF)\n  if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)\n    set(FMT_MASTER_PROJECT ON)\n    message(STATUS \"CMake version: ${CMAKE_VERSION}\")\n  endif ()\nendif ()\n\n# Joins arguments and places the results in ${result_var}.\nfunction(join result_var)\n  set(result \"\")\n  foreach (arg ${ARGN})\n    set(result \"${result}${arg}\")\n  endforeach ()\n  set(${result_var} \"${result}\" PARENT_SCOPE)\nendfunction()\n\nfunction(enable_module target)\n  if (MSVC)\n    set(BMI ${CMAKE_CURRENT_BINARY_DIR}/${target}.ifc)\n    target_compile_options(${target}\n      PRIVATE /interface /ifcOutput ${BMI}\n      INTERFACE /reference fmt=${BMI})\n  endif ()\n  set_target_properties(${target} PROPERTIES ADDITIONAL_CLEAN_FILES ${BMI})\n  set_source_files_properties(${BMI} PROPERTIES GENERATED ON)\nendfunction()\n\ninclude(CMakeParseArguments)\n\n# Sets a cache variable with a docstring joined from multiple arguments:\n#   set(<variable> <value>... CACHE <type> <docstring>...)\n# This allows splitting a long docstring for readability.\nfunction(set_verbose)\n  # cmake_parse_arguments is broken in CMake 3.4 (cannot parse CACHE) so use\n  # list instead.\n  list(GET ARGN 0 var)\n  list(REMOVE_AT ARGN 0)\n  list(GET ARGN 0 val)\n  list(REMOVE_AT ARGN 0)\n  list(REMOVE_AT ARGN 0)\n  list(GET ARGN 0 type)\n  list(REMOVE_AT ARGN 0)\n  join(doc ${ARGN})\n  set(${var} ${val} CACHE ${type} ${doc})\nendfunction()\n\n# Set the default CMAKE_BUILD_TYPE to Release.\n# This should be done before the project command since the latter can set\n# CMAKE_BUILD_TYPE itself (it does so for nmake).\nif (FMT_MASTER_PROJECT AND NOT CMAKE_BUILD_TYPE)\n  set_verbose(CMAKE_BUILD_TYPE Release CACHE STRING\n              \"Choose the type of build, options are: None(CMAKE_CXX_FLAGS or \"\n              \"CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.\")\nendif ()\n\nproject(FMT CXX)\ninclude(GNUInstallDirs)\nset_verbose(FMT_INC_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE STRING\n            \"Installation directory for include files, a relative path that \"\n            \"will be joined with ${CMAKE_INSTALL_PREFIX} or an absolute path.\")\n\noption(FMT_PEDANTIC \"Enable extra warnings and expensive tests.\" OFF)\noption(FMT_WERROR \"Halt the compilation with an error on compiler warnings.\"\n       OFF)\n\n# Options that control generation of various targets.\noption(FMT_DOC \"Generate the doc target.\" ${FMT_MASTER_PROJECT})\noption(FMT_INSTALL \"Generate the install target.\" ${FMT_MASTER_PROJECT})\noption(FMT_TEST \"Generate the test target.\" ${FMT_MASTER_PROJECT})\noption(FMT_FUZZ \"Generate the fuzz target.\" OFF)\noption(FMT_CUDA_TEST \"Generate the cuda-test target.\" OFF)\noption(FMT_OS \"Include core requiring OS (Windows/Posix) \" ON)\noption(FMT_MODULE \"Build a module instead of a traditional library.\" OFF)\n\nset(FMT_CAN_MODULE OFF)\nif (CMAKE_CXX_STANDARD GREATER 17 AND\n    # msvc 16.10-pre4\n    MSVC AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 19.29.30035)\n  set(FMT_CAN_MODULE ON)\nendif ()\nif (NOT FMT_CAN_MODULE)\n  set(FMT_MODULE OFF)\n  message(STATUS \"Module support is disabled.\")\nendif ()\nif (FMT_TEST AND FMT_MODULE)\n  # The tests require {fmt} to be compiled as traditional library\n  message(STATUS \"Testing is incompatible with build mode 'module'.\")\nendif ()\n\n# Get version from core.h\nfile(READ include/fmt/core.h core_h)\nif (NOT core_h MATCHES \"FMT_VERSION ([0-9]+)([0-9][0-9])([0-9][0-9])\")\n  message(FATAL_ERROR \"Cannot get FMT_VERSION from core.h.\")\nendif ()\n# Use math to skip leading zeros if any.\nmath(EXPR CPACK_PACKAGE_VERSION_MAJOR ${CMAKE_MATCH_1})\nmath(EXPR CPACK_PACKAGE_VERSION_MINOR ${CMAKE_MATCH_2})\nmath(EXPR CPACK_PACKAGE_VERSION_PATCH ${CMAKE_MATCH_3})\njoin(FMT_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.\n                 ${CPACK_PACKAGE_VERSION_PATCH})\nmessage(STATUS \"Version: ${FMT_VERSION}\")\n\nmessage(STATUS \"Build type: ${CMAKE_BUILD_TYPE}\")\n\nif (NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)\n  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)\nendif ()\n\nset(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}\n  \"${CMAKE_CURRENT_SOURCE_DIR}/support/cmake\")\n\ninclude(cxx14)\ninclude(CheckCXXCompilerFlag)\ninclude(JoinPaths)\n\nlist(FIND CMAKE_CXX_COMPILE_FEATURES \"cxx_variadic_templates\" index)\nif (${index} GREATER -1)\n  # Use cxx_variadic_templates instead of more appropriate cxx_std_11 for\n  # compatibility with older CMake versions.\n  set(FMT_REQUIRED_FEATURES cxx_variadic_templates)\nendif ()\nmessage(STATUS \"Required features: ${FMT_REQUIRED_FEATURES}\")\n\nif (FMT_MASTER_PROJECT AND NOT DEFINED CMAKE_CXX_VISIBILITY_PRESET)\n  set_verbose(CMAKE_CXX_VISIBILITY_PRESET hidden CACHE STRING\n              \"Preset for the export of private symbols\")\n  set_property(CACHE CMAKE_CXX_VISIBILITY_PRESET PROPERTY STRINGS\n               hidden default)\nendif ()\n\nif (FMT_MASTER_PROJECT AND NOT DEFINED CMAKE_VISIBILITY_INLINES_HIDDEN)\n  set_verbose(CMAKE_VISIBILITY_INLINES_HIDDEN ON CACHE BOOL\n              \"Whether to add a compile flag to hide symbols of inline functions\")\nendif ()\n\nif (CMAKE_CXX_COMPILER_ID MATCHES \"GNU\")\n  set(PEDANTIC_COMPILE_FLAGS -pedantic-errors -Wall -Wextra -pedantic\n      -Wold-style-cast -Wundef\n      -Wredundant-decls -Wwrite-strings -Wpointer-arith\n      -Wcast-qual -Wformat=2 -Wmissing-include-dirs\n      -Wcast-align\n      -Wctor-dtor-privacy -Wdisabled-optimization\n      -Winvalid-pch -Woverloaded-virtual\n      -Wconversion -Wswitch-enum -Wundef\n      -Wno-ctor-dtor-privacy -Wno-format-nonliteral)\n  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.6)\n      set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS}\n         -Wno-dangling-else -Wno-unused-local-typedefs)\n  endif ()\n  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)\n      set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS} -Wdouble-promotion\n          -Wtrampolines -Wzero-as-null-pointer-constant -Wuseless-cast\n          -Wvector-operation-performance -Wsized-deallocation -Wshadow)\n  endif ()\n  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.0)\n      set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS} -Wshift-overflow=2\n          -Wnull-dereference -Wduplicated-cond)\n  endif ()\n  set(WERROR_FLAG -Werror)\nendif ()\n\nif (CMAKE_CXX_COMPILER_ID MATCHES \"Clang\")\n  set(PEDANTIC_COMPILE_FLAGS -Wall -Wextra -pedantic -Wconversion -Wundef\n      -Wdeprecated -Wweak-vtables -Wshadow\n      -Wno-gnu-zero-variadic-macro-arguments)\n  check_cxx_compiler_flag(-Wzero-as-null-pointer-constant HAS_NULLPTR_WARNING)\n  if (HAS_NULLPTR_WARNING)\n    set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS}\n        -Wzero-as-null-pointer-constant)\n  endif ()\n  set(WERROR_FLAG -Werror)\nendif ()\n\nif (MSVC)\n  set(PEDANTIC_COMPILE_FLAGS /W3)\n  set(WERROR_FLAG /WX)\nendif ()\n\nif (FMT_MASTER_PROJECT AND CMAKE_GENERATOR MATCHES \"Visual Studio\")\n  # If Microsoft SDK is installed create script run-msbuild.bat that\n  # calls SetEnv.cmd to set up build environment and runs msbuild.\n  # It is useful when building Visual Studio projects with the SDK\n  # toolchain rather than Visual Studio.\n  include(FindSetEnv)\n  if (WINSDK_SETENV)\n    set(MSBUILD_SETUP \"call \\\"${WINSDK_SETENV}\\\"\")\n  endif ()\n  # Set FrameworkPathOverride to get rid of MSB3644 warnings.\n  join(netfxpath\n       \"C:\\\\Program Files\\\\Reference Assemblies\\\\Microsoft\\\\Framework\\\\\"\n       \".NETFramework\\\\v4.0\")\n  file(WRITE run-msbuild.bat \"\n    ${MSBUILD_SETUP}\n    ${CMAKE_MAKE_PROGRAM} -p:FrameworkPathOverride=\\\"${netfxpath}\\\" %*\")\nendif ()\n\nset(strtod_l_headers stdlib.h)\nif (APPLE)\n  set(strtod_l_headers ${strtod_l_headers} xlocale.h)\nendif ()\n\ninclude(CheckSymbolExists)\nif (WIN32)\n  check_symbol_exists(_strtod_l \"${strtod_l_headers}\" HAVE_STRTOD_L)\nelse ()\n  check_symbol_exists(strtod_l \"${strtod_l_headers}\" HAVE_STRTOD_L)\nendif ()\n\nfunction(add_headers VAR)\n  set(headers ${${VAR}})\n  foreach (header ${ARGN})\n    set(headers ${headers} include/fmt/${header})\n  endforeach()\n  set(${VAR} ${headers} PARENT_SCOPE)\nendfunction()\n\n# Define the fmt library, its includes and the needed defines.\nadd_headers(FMT_HEADERS args.h chrono.h color.h compile.h core.h format.h\n                        format-inl.h locale.h os.h ostream.h printf.h ranges.h\n                        xchar.h)\nif (FMT_MODULE)\n  set(FMT_SOURCES src/fmt.cc)\nelseif (FMT_OS)\n  set(FMT_SOURCES src/format.cc src/os.cc)\nelse()\n  set(FMT_SOURCES src/format.cc)\nendif ()\n\nadd_library(fmt ${FMT_SOURCES} ${FMT_HEADERS} README.rst ChangeLog.rst)\nadd_library(fmt::fmt ALIAS fmt)\n\nif (HAVE_STRTOD_L)\n  target_compile_definitions(fmt PUBLIC FMT_LOCALE)\nendif ()\n\nif (MINGW)\n  check_cxx_compiler_flag(\"Wa,-mbig-obj\" FMT_HAS_MBIG_OBJ)\n  if (${FMT_HAS_MBIG_OBJ})\n    target_compile_options(fmt PUBLIC \"-Wa,-mbig-obj\")\n  endif()\nendif ()\n\nif (FMT_WERROR)\n  target_compile_options(fmt PRIVATE ${WERROR_FLAG})\nendif ()\nif (FMT_PEDANTIC)\n  target_compile_options(fmt PRIVATE ${PEDANTIC_COMPILE_FLAGS})\nendif ()\nif (FMT_MODULE)\n  enable_module(fmt)\nendif ()\n\ntarget_compile_features(fmt INTERFACE ${FMT_REQUIRED_FEATURES})\n\ntarget_include_directories(fmt PUBLIC\n  $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>\n  $<INSTALL_INTERFACE:${FMT_INC_DIR}>)\n\nset(FMT_DEBUG_POSTFIX d CACHE STRING \"Debug library postfix.\")\n\nset_target_properties(fmt PROPERTIES\n  VERSION ${FMT_VERSION} SOVERSION ${CPACK_PACKAGE_VERSION_MAJOR}\n  DEBUG_POSTFIX \"${FMT_DEBUG_POSTFIX}\")\n\n# Set FMT_LIB_NAME for pkg-config fmt.pc. We cannot use the OUTPUT_NAME target\n# property because it's not set by default.\nset(FMT_LIB_NAME fmt)\nif (CMAKE_BUILD_TYPE STREQUAL \"Debug\")\n  set(FMT_LIB_NAME ${FMT_LIB_NAME}${FMT_DEBUG_POSTFIX})\nendif ()\n\nif (BUILD_SHARED_LIBS)\n  if (UNIX AND NOT APPLE AND NOT ${CMAKE_SYSTEM_NAME} MATCHES \"SunOS\" AND\n      NOT EMSCRIPTEN)\n    # Fix rpmlint warning:\n    # unused-direct-shlib-dependency /usr/lib/libformat.so.1.1.0 /lib/libm.so.6.\n    target_link_libraries(fmt -Wl,--as-needed)\n  endif ()\n  target_compile_definitions(fmt PRIVATE FMT_EXPORT INTERFACE FMT_SHARED)\nendif ()\nif (FMT_SAFE_DURATION_CAST)\n  target_compile_definitions(fmt PUBLIC FMT_SAFE_DURATION_CAST)\nendif()\n\nadd_library(fmt-header-only INTERFACE)\nadd_library(fmt::fmt-header-only ALIAS fmt-header-only)\n\ntarget_compile_definitions(fmt-header-only INTERFACE FMT_HEADER_ONLY=1)\ntarget_compile_features(fmt-header-only INTERFACE ${FMT_REQUIRED_FEATURES})\n\ntarget_include_directories(fmt-header-only INTERFACE\n  $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>\n  $<INSTALL_INTERFACE:${FMT_INC_DIR}>)\n\n# Install targets.\nif (FMT_INSTALL)\n  include(CMakePackageConfigHelpers)\n  set_verbose(FMT_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/fmt CACHE STRING\n              \"Installation directory for cmake files, a relative path that \"\n              \"will be joined with ${CMAKE_INSTALL_PREFIX} or an absolute \"\n              \"path.\")\n  set(version_config ${PROJECT_BINARY_DIR}/fmt-config-version.cmake)\n  set(project_config ${PROJECT_BINARY_DIR}/fmt-config.cmake)\n  set(pkgconfig ${PROJECT_BINARY_DIR}/fmt.pc)\n  set(targets_export_name fmt-targets)\n\n  set_verbose(FMT_LIB_DIR ${CMAKE_INSTALL_LIBDIR} CACHE STRING\n              \"Installation directory for libraries, a relative path that \"\n              \"will be joined to ${CMAKE_INSTALL_PREFIX} or an absolute path.\")\n\n  set_verbose(FMT_PKGCONFIG_DIR ${CMAKE_INSTALL_LIBDIR}/pkgconfig CACHE PATH\n              \"Installation directory for pkgconfig (.pc) files, a relative \"\n              \"path that will be joined with ${CMAKE_INSTALL_PREFIX} or an \"\n              \"absolute path.\")\n\n  # Generate the version, config and target files into the build directory.\n  write_basic_package_version_file(\n    ${version_config}\n    VERSION ${FMT_VERSION}\n    COMPATIBILITY AnyNewerVersion)\n\n  join_paths(libdir_for_pc_file \"\\${exec_prefix}\" \"${FMT_LIB_DIR}\")\n  join_paths(includedir_for_pc_file \"\\${prefix}\" \"${FMT_INC_DIR}\")\n\n  configure_file(\n    \"${PROJECT_SOURCE_DIR}/support/cmake/fmt.pc.in\"\n    \"${pkgconfig}\"\n    @ONLY)\n  configure_package_config_file(\n    ${PROJECT_SOURCE_DIR}/support/cmake/fmt-config.cmake.in\n    ${project_config}\n    INSTALL_DESTINATION ${FMT_CMAKE_DIR})\n\n  set(INSTALL_TARGETS fmt fmt-header-only)\n\n  # Install the library and headers.\n  install(TARGETS ${INSTALL_TARGETS} EXPORT ${targets_export_name}\n          LIBRARY DESTINATION ${FMT_LIB_DIR}\n          ARCHIVE DESTINATION ${FMT_LIB_DIR}\n          RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})\n\n  # Use a namespace because CMake provides better diagnostics for namespaced\n  # imported targets.\n  export(TARGETS ${INSTALL_TARGETS} NAMESPACE fmt::\n         FILE ${PROJECT_BINARY_DIR}/${targets_export_name}.cmake)\n\n  # Install version, config and target files.\n  install(\n    FILES ${project_config} ${version_config}\n    DESTINATION ${FMT_CMAKE_DIR})\n  install(EXPORT ${targets_export_name} DESTINATION ${FMT_CMAKE_DIR}\n          NAMESPACE fmt::)\n\n  install(FILES $<TARGET_PDB_FILE:${INSTALL_TARGETS}>\n          DESTINATION ${FMT_LIB_DIR} OPTIONAL)\n  install(FILES ${FMT_HEADERS} DESTINATION \"${FMT_INC_DIR}/fmt\")\n  install(FILES \"${pkgconfig}\" DESTINATION \"${FMT_PKGCONFIG_DIR}\")\nendif ()\n\nif (FMT_DOC)\n  add_subdirectory(doc)\nendif ()\n\nif (FMT_TEST)\n  enable_testing()\n  add_subdirectory(test)\nendif ()\n\n# Control fuzzing independent of the unit tests.\nif (FMT_FUZZ)\n  add_subdirectory(test/fuzzing)\n\n  # The FMT_FUZZ macro is used to prevent resource exhaustion in fuzzing\n  # mode and make fuzzing practically possible. It is similar to\n  # FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION but uses a different name to\n  # avoid interfering with fuzzing of projects that use {fmt}.\n  # See also https://llvm.org/docs/LibFuzzer.html#fuzzer-friendly-build-mode.\n  target_compile_definitions(fmt PUBLIC FMT_FUZZ)\nendif ()\n\nset(gitignore ${PROJECT_SOURCE_DIR}/.gitignore)\nif (FMT_MASTER_PROJECT AND EXISTS ${gitignore})\n  # Get the list of ignored files from .gitignore.\n  file (STRINGS ${gitignore} lines)\n  list(REMOVE_ITEM lines /doc/html)\n  foreach (line ${lines})\n    string(REPLACE \".\" \"[.]\" line \"${line}\")\n    string(REPLACE \"*\" \".*\" line \"${line}\")\n    set(ignored_files ${ignored_files} \"${line}$\" \"${line}/\")\n  endforeach ()\n  set(ignored_files ${ignored_files}\n    /.git /breathe /format-benchmark sphinx/ .buildinfo .doctrees)\n\n  set(CPACK_SOURCE_GENERATOR ZIP)\n  set(CPACK_SOURCE_IGNORE_FILES ${ignored_files})\n  set(CPACK_SOURCE_PACKAGE_FILE_NAME fmt-${FMT_VERSION})\n  set(CPACK_PACKAGE_NAME fmt)\n  set(CPACK_RESOURCE_FILE_README ${PROJECT_SOURCE_DIR}/README.rst)\n  include(CPack)\nendif ()\n"
  },
  {
    "path": "examples/libraries/fmt/CONTRIBUTING.md",
    "content": "Contributing to {fmt}\n=====================\n\nBy submitting a pull request or a patch, you represent that you have the right\nto license your contribution to the {fmt} project owners and the community,\nagree that your contributions are licensed under the {fmt} license, and agree\nto future changes to the licensing.\n\nAll C++ code must adhere to [Google C++ Style Guide](\nhttps://google.github.io/styleguide/cppguide.html) with the following\nexceptions:\n\n* Exceptions are permitted\n* snake_case should be used instead of UpperCamelCase for function and type\n  names\n\nAll documentation must adhere to the [Google Developer Documentation Style\nGuide](https://developers.google.com/style).\n\nThanks for contributing!\n"
  },
  {
    "path": "examples/libraries/fmt/ChangeLog.rst",
    "content": "8.0.1 - 2021-07-02\n------------------\n\n* Fixed the version number in the inline namespace\n  (`#2374 <https://github.com/fmtlib/fmt/issues/2374>`_).\n\n* Added a missing presentation type check for ``std::string``\n  (`#2402 <https://github.com/fmtlib/fmt/issues/2402>`_).\n\n* Fixed a linkage error when mixing code built with clang and gcc\n  (`#2377 <https://github.com/fmtlib/fmt/issues/2377>`_).\n\n* Fixed documentation issues\n  (`#2396 <https://github.com/fmtlib/fmt/pull/2396>`_,\n  `#2403 <https://github.com/fmtlib/fmt/issues/2403>`_,\n  `#2406 <https://github.com/fmtlib/fmt/issues/2406>`_).\n  Thanks `@mkurdej (Marek Kurdej) <https://github.com/mkurdej>`_.\n\n* Removed dead code in FP formatter (\n  `#2398 <https://github.com/fmtlib/fmt/pull/2398>`_).\n  Thanks `@javierhonduco (Javier Honduvilla Coto)\n  <https://github.com/javierhonduco>`_.\n\n* Fixed various warnings and compilation issues\n  (`#2351 <https://github.com/fmtlib/fmt/issues/2351>`_,\n  `#2359 <https://github.com/fmtlib/fmt/issues/2359>`_,\n  `#2365 <https://github.com/fmtlib/fmt/pull/2365>`_,\n  `#2368 <https://github.com/fmtlib/fmt/issues/2368>`_,\n  `#2370 <https://github.com/fmtlib/fmt/pull/2370>`_,\n  `#2376 <https://github.com/fmtlib/fmt/pull/2376>`_,\n  `#2381 <https://github.com/fmtlib/fmt/pull/2381>`_,\n  `#2382 <https://github.com/fmtlib/fmt/pull/2382>`_,\n  `#2386 <https://github.com/fmtlib/fmt/issues/2386>`_,\n  `#2389 <https://github.com/fmtlib/fmt/pull/2389>`_,\n  `#2395 <https://github.com/fmtlib/fmt/pull/2395>`_,\n  `#2397 <https://github.com/fmtlib/fmt/pull/2397>`_,\n  `#2400 <https://github.com/fmtlib/fmt/issues/2400>`_\n  `#2401 <https://github.com/fmtlib/fmt/issues/2401>`_,\n  `#2407 <https://github.com/fmtlib/fmt/pull/2407>`_).\n  Thanks `@zx2c4 (Jason A. Donenfeld) <https://github.com/zx2c4>`_,\n  `@AidanSun05 (Aidan Sun) <https://github.com/AidanSun05>`_,\n  `@mattiasljungstrom (Mattias Ljungström)\n  <https://github.com/mattiasljungstrom>`_,\n  `@joemmett (Jonathan Emmett) <https://github.com/joemmett>`_,\n  `@erengy (Eren Okka) <https://github.com/erengy>`_,\n  `@patlkli (Patrick Geltinger) <https://github.com/patlkli>`_,\n  `@gsjaardema (Greg Sjaardema) <https://github.com/gsjaardema>`_,\n  `@phprus (Vladislav Shchapov) <https://github.com/phprus>`_.\n\n8.0.0 - 2021-06-21\n------------------\n\n* Enabled compile-time format string check by default.\n  For example (`godbolt <https://godbolt.org/z/sMxcohGjz>`__):\n\n  .. code:: c++\n\n     #include <fmt/core.h>\n\n     int main() {\n       fmt::print(\"{:d}\", \"I am not a number\");\n     }\n\n  gives a compile-time error on compilers with C++20 ``consteval`` support\n  (gcc 10+, clang 11+) because ``d`` is not a valid format specifier for a\n  string.\n\n  To pass a runtime string wrap it in ``fmt::runtime``:\n\n  .. code:: c++\n\n     fmt::print(fmt::runtime(\"{:d}\"), \"I am not a number\");\n\n* Added compile-time formatting\n  (`#2019 <https://github.com/fmtlib/fmt/pull/2019>`_,\n  `#2044 <https://github.com/fmtlib/fmt/pull/2044>`_,\n  `#2056 <https://github.com/fmtlib/fmt/pull/2056>`_,\n  `#2072 <https://github.com/fmtlib/fmt/pull/2072>`_,\n  `#2075 <https://github.com/fmtlib/fmt/pull/2075>`_,\n  `#2078 <https://github.com/fmtlib/fmt/issues/2078>`_,\n  `#2129 <https://github.com/fmtlib/fmt/pull/2129>`_,\n  `#2326 <https://github.com/fmtlib/fmt/pull/2326>`_).\n  For example (`godbolt <https://godbolt.org/z/Mxx9d89jM>`__):\n\n  .. code:: c++\n\n     #include <fmt/compile.h>\n\n     consteval auto compile_time_itoa(int value) -> std::array<char, 10> {\n       auto result = std::array<char, 10>();\n       fmt::format_to(result.data(), FMT_COMPILE(\"{}\"), value);\n       return result;\n     }\n\n     constexpr auto answer = compile_time_itoa(42);\n\n  Most of the formatting functionality is available at compile time with a\n  notable exception of floating-point numbers and pointers.\n  Thanks `@alexezeder (Alexey Ochapov) <https://github.com/alexezeder>`_.\n\n* Optimized handling of format specifiers during format string compilation.\n  For example, hexadecimal formatting (``\"{:x}\"``) is now 3-7x faster than\n  before when using ``format_to`` with format string compilation and a\n  stack-allocated buffer (`#1944 <https://github.com/fmtlib/fmt/issues/1944>`_).\n\n  Before (7.1.3)::\n\n    ----------------------------------------------------------------------------\n    Benchmark                                  Time             CPU   Iterations\n    ----------------------------------------------------------------------------\n    FMTCompileOld/0                         15.5 ns         15.5 ns     43302898\n    FMTCompileOld/42                        16.6 ns         16.6 ns     43278267\n    FMTCompileOld/273123                    18.7 ns         18.6 ns     37035861\n    FMTCompileOld/9223372036854775807       19.4 ns         19.4 ns     35243000\n    ----------------------------------------------------------------------------\n\n  After (8.x)::\n\n    ----------------------------------------------------------------------------\n    Benchmark                                  Time             CPU   Iterations\n    ----------------------------------------------------------------------------\n    FMTCompileNew/0                         1.99 ns         1.99 ns    360523686\n    FMTCompileNew/42                        2.33 ns         2.33 ns    279865664\n    FMTCompileNew/273123                    3.72 ns         3.71 ns    190230315\n    FMTCompileNew/9223372036854775807       5.28 ns         5.26 ns    130711631\n    ----------------------------------------------------------------------------\n\n  It is even faster than ``std::to_chars`` from libc++ compiled with clang on\n  macOS::\n\n    ----------------------------------------------------------------------------\n    Benchmark                                  Time             CPU   Iterations\n    ----------------------------------------------------------------------------\n    ToChars/0                               4.42 ns         4.41 ns    160196630\n    ToChars/42                              5.00 ns         4.98 ns    140735201\n    ToChars/273123                          7.26 ns         7.24 ns     95784130\n    ToChars/9223372036854775807             8.77 ns         8.75 ns     75872534\n    ----------------------------------------------------------------------------\n\n  In other cases, especially involving ``std::string`` construction, the\n  speed up is usually lower because handling format specifiers takes a smaller\n  fraction of the total time.\n\n* Added the ``_cf`` user-defined literal to represent a compiled format string.\n  It can be used instead of the ``FMT_COMPILE`` macro\n  (`#2043 <https://github.com/fmtlib/fmt/pull/2043>`_,\n  `#2242 <https://github.com/fmtlib/fmt/pull/2242>`_):\n\n  .. code:: c++\n\n     #include <fmt/compile.h>\n\n     using namespace fmt::literals;\n     auto s = fmt::format(FMT_COMPILE(\"{}\"), 42); // 🙁 not modern\n     auto s = fmt::format(\"{}\"_cf, 42);           // 🙂 modern as hell\n\n  It requires compiler support for class types in non-type template parameters\n  (a C++20 feature) which is available in GCC 9.3+.\n  Thanks `@alexezeder (Alexey Ochapov) <https://github.com/alexezeder>`_.\n\n* Format string compilation now requires ``format`` functions of ``formatter``\n  specializations for user-defined types to be ``const``:\n\n  .. code:: c++\n\n     template <> struct fmt::formatter<my_type>: formatter<string_view> {\n       template <typename FormatContext>\n       auto format(my_type obj, FormatContext& ctx) const {  // Note const here.\n         // ...\n       }\n     };\n\n* Added UDL-based named argument support to format string compilation\n  (`#2243 <https://github.com/fmtlib/fmt/pull/2243>`_,\n  `#2281 <https://github.com/fmtlib/fmt/pull/2281>`_). For example:\n\n  .. code:: c++\n\n     #include <fmt/compile.h>\n\n     using namespace fmt::literals;\n     auto s = fmt::format(FMT_COMPILE(\"{answer}\"), \"answer\"_a = 42);\n\n  Here the argument named \"answer\" is resolved at compile time with no\n  runtime overhead.\n  Thanks `@alexezeder (Alexey Ochapov) <https://github.com/alexezeder>`_.\n\n* Added format string compilation support to ``fmt::print``\n  (`#2280 <https://github.com/fmtlib/fmt/issues/2280>`_,\n  `#2304 <https://github.com/fmtlib/fmt/pull/2304>`_).\n  Thanks `@alexezeder (Alexey Ochapov) <https://github.com/alexezeder>`_.\n\n* Added initial support for compiling {fmt} as a C++20 module\n  (`#2235 <https://github.com/fmtlib/fmt/pull/2235>`_,\n  `#2240 <https://github.com/fmtlib/fmt/pull/2240>`_,\n  `#2260 <https://github.com/fmtlib/fmt/pull/2260>`_,\n  `#2282 <https://github.com/fmtlib/fmt/pull/2282>`_,\n  `#2283 <https://github.com/fmtlib/fmt/pull/2283>`_,\n  `#2288 <https://github.com/fmtlib/fmt/pull/2288>`_,\n  `#2298 <https://github.com/fmtlib/fmt/pull/2298>`_,\n  `#2306 <https://github.com/fmtlib/fmt/pull/2306>`_,\n  `#2307 <https://github.com/fmtlib/fmt/pull/2307>`_,\n  `#2309 <https://github.com/fmtlib/fmt/pull/2309>`_,\n  `#2318 <https://github.com/fmtlib/fmt/pull/2318>`_,\n  `#2324 <https://github.com/fmtlib/fmt/pull/2324>`_,\n  `#2332 <https://github.com/fmtlib/fmt/pull/2332>`_,\n  `#2340 <https://github.com/fmtlib/fmt/pull/2340>`_).\n  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.\n\n* Made symbols private by default reducing shared library size\n  (`#2301 <https://github.com/fmtlib/fmt/pull/2301>`_). For example there was\n  a ~15% reported reduction on one platform.\n  Thanks `@sergiud (Sergiu Deitsch) <https://github.com/sergiud>`_.\n\n* Optimized includes making the result of preprocessing ``fmt/format.h``\n  ~20% smaller with libstdc++/C++20 and slightly improving build times\n  (`#1998 <https://github.com/fmtlib/fmt/issues/1998>`_).\n\n* Added support of ranges with non-const ``begin`` / ``end``\n  (`#1953 <https://github.com/fmtlib/fmt/pull/1953>`_).\n  Thanks `@kitegi (sarah) <https://github.com/kitegi>`_.\n\n* Added support of ``std::byte`` and other formattable types to ``fmt::join``\n  (`#1981 <https://github.com/fmtlib/fmt/issues/1981>`_,\n  `#2040 <https://github.com/fmtlib/fmt/issues/2040>`_,\n  `#2050 <https://github.com/fmtlib/fmt/pull/2050>`_,\n  `#2262 <https://github.com/fmtlib/fmt/issues/2262>`_). For example:\n\n  .. code:: c++\n\n     #include <fmt/format.h>\n     #include <cstddef>\n     #include <vector>\n\n     int main() {\n       auto bytes = std::vector{std::byte(4), std::byte(2)};\n       fmt::print(\"{}\", fmt::join(bytes, \"\"));\n     }\n\n  prints \"42\".\n\n  Thanks `@kamibo (Camille Bordignon) <https://github.com/kamibo>`_.\n\n* Implemented the default format for ``std::chrono::system_clock``\n  (`#2319 <https://github.com/fmtlib/fmt/issues/2319>`_,\n  `#2345 <https://github.com/fmtlib/fmt/pull/2345>`_). For example:\n\n  .. code:: c++\n\n     #include <fmt/chrono.h>\n\n     int main() {\n       fmt::print(\"{}\", std::chrono::system_clock::now());\n     }\n\n  prints \"2021-06-18 15:22:00\" (the output depends on the current date and\n  time). Thanks `@sunmy2019 <https://github.com/sunmy2019>`_.\n\n* Made more chrono specifiers locale independent by default. Use the ``'L'``\n  specifier to get localized formatting. For example:\n\n  .. code:: c++\n\n     #include <fmt/chrono.h>\n\n     int main() {\n       std::locale::global(std::locale(\"ru_RU.UTF-8\"));\n       auto monday = std::chrono::weekday(1);\n       fmt::print(\"{}\\n\", monday);   // prints \"Mon\"\n       fmt::print(\"{:L}\\n\", monday); // prints \"пн\"\n     }\n\n* Improved locale handling in chrono formatting\n  (`#2337 <https://github.com/fmtlib/fmt/issues/2337>`_,\n  `#2349 <https://github.com/fmtlib/fmt/pull/2349>`_,\n  `#2350 <https://github.com/fmtlib/fmt/pull/2350>`_).\n  Thanks `@phprus (Vladislav Shchapov) <https://github.com/phprus>`_.\n\n* Deprecated ``fmt/locale.h`` moving the formatting functions that take a\n  locale to ``fmt/format.h`` (``char``) and ``fmt/xchar`` (other overloads).\n  This doesn't introduce a dependency on ``<locale>`` so there is virtually no\n  compile time effect.\n\n* Made parameter order in ``vformat_to`` consistent with ``format_to``\n  (`#2327 <https://github.com/fmtlib/fmt/issues/2327>`_).\n\n* Added support for time points with arbitrary durations\n  (`#2208 <https://github.com/fmtlib/fmt/issues/2208>`_). For example:\n\n  .. code:: c++\n\n     #include <fmt/chrono.h>\n\n     int main() {\n       using tp = std::chrono::time_point<\n         std::chrono::system_clock, std::chrono::seconds>;\n       fmt::print(\"{:%S}\", tp(std::chrono::seconds(42)));\n     }\n\n  prints \"42\".\n\n* Formatting floating-point numbers no longer produces trailing zeros by default\n  for consistency with ``std::format``. For example:\n\n  .. code:: c++\n\n     #include <fmt/core.h>\n\n     int main() {\n       fmt::print(\"{0:.3}\", 1.1);\n     }\n\n  prints \"1.1\". Use the ``'#'`` specifier to keep trailing zeros.\n\n* Dropped a limit on the number of elements in a range and replaced ``{}`` with\n  ``[]`` as range delimiters for consistency with Python's ``str.format``.\n\n* The ``'L'`` specifier for locale-specific numeric formatting can now be\n  combined with presentation specifiers as in ``std::format``. For example:\n\n  .. code:: c++\n\n     #include <fmt/core.h>\n     #include <locale>\n\n     int main() {\n       std::locale::global(std::locale(\"fr_FR.UTF-8\"));\n       fmt::print(\"{0:.2Lf}\", 0.42);\n     }\n\n  prints \"0,42\". The deprecated ``'n'`` specifier has been removed.\n\n* Made the ``0`` specifier ignored for infinity and NaN\n  (`#2305 <https://github.com/fmtlib/fmt/issues/2305>`_,\n  `#2310 <https://github.com/fmtlib/fmt/pull/2310>`_).\n  Thanks `@Liedtke (Matthias Liedtke) <https://github.com/Liedtke>`_.\n\n* Made the hexfloat formatting use the right alignment by default\n  (`#2308 <https://github.com/fmtlib/fmt/issues/2308>`_,\n  `#2317 <https://github.com/fmtlib/fmt/pull/2317>`_).\n  Thanks `@Liedtke (Matthias Liedtke) <https://github.com/Liedtke>`_.\n\n* Removed the deprecated numeric alignment (``'='``). Use the ``'0'`` specifier\n  instead.\n\n* Removed the deprecated ``fmt/posix.h`` header that has been replaced with\n  ``fmt/os.h``.\n\n* Removed the deprecated ``format_to_n_context``, ``format_to_n_args`` and\n  ``make_format_to_n_args``. They have been replaced with ``format_context``,\n  ``format_args` and ``make_format_args`` respectively.\n\n* Moved ``wchar_t``-specific functions and types to ``fmt/xchar.h``.\n  You can define ``FMT_DEPRECATED_INCLUDE_XCHAR`` to automatically include\n  ``fmt/xchar.h`` from ``fmt/format.h`` but this will be disabled in the next\n  major release.\n\n* Fixed handling of the ``'+'`` specifier in localized formatting\n  (`#2133 <https://github.com/fmtlib/fmt/issues/2133>`_).\n\n* Added support for the ``'s'`` format specifier that gives textual\n  representation of ``bool``\n  (`#2094 <https://github.com/fmtlib/fmt/issues/2094>`_,\n  `#2109 <https://github.com/fmtlib/fmt/pull/2109>`_). For example:\n\n  .. code:: c++\n\n     #include <fmt/core.h>\n\n     int main() {\n       fmt::print(\"{:s}\", true);\n     }\n\n  prints \"true\".\n  Thanks `@powercoderlol (Ivan Polyakov) <https://github.com/powercoderlol>`_.\n\n* Made ``fmt::ptr`` work with function pointers\n  (`#2131 <https://github.com/fmtlib/fmt/pull/2131>`_). For example:\n\n  .. code:: c++\n\n     #include <fmt/format.h>\n\n     int main() {\n       fmt::print(\"My main: {}\\n\", fmt::ptr(main));\n     }\n\n  Thanks `@mikecrowe (Mike Crowe) <https://github.com/mikecrowe>`_.\n\n* Fixed ``fmt::formatted_size`` with format string compilation\n  (`#2141 <https://github.com/fmtlib/fmt/pull/2141>`_,\n  `#2161 <https://github.com/fmtlib/fmt/pull/2161>`_).\n  Thanks `@alexezeder (Alexey Ochapov) <https://github.com/alexezeder>`_.\n\n* Fixed handling of empty format strings during format string compilation\n  (`#2042 <https://github.com/fmtlib/fmt/issues/2042>`_):\n\n  .. code:: c++\n\n     auto s = fmt::format(FMT_COMPILE(\"\"));\n\n  Thanks `@alexezeder (Alexey Ochapov) <https://github.com/alexezeder>`_.\n\n* Fixed handling of enums in ``fmt::to_string``\n  (`#2036 <https://github.com/fmtlib/fmt/issues/2036>`_).\n\n* Improved width computation\n  (`#2033 <https://github.com/fmtlib/fmt/issues/2033>`_,\n  `#2091 <https://github.com/fmtlib/fmt/issues/2091>`_). For example:\n\n  .. code:: c++\n\n     #include <fmt/core.h>\n\n     int main() {\n       fmt::print(\"{:-<10}{}\\n\", \"你好\", \"世界\");\n       fmt::print(\"{:-<10}{}\\n\", \"hello\", \"world\");\n     }\n\n  prints\n\n  .. image:: https://user-images.githubusercontent.com/576385/\n             119840373-cea3ca80-beb9-11eb-91e0-54266c48e181.png\n\n  on a modern terminal.\n\n* The experimental fast output stream (``fmt::ostream``) is now truncated by\n  default for consistency with ``fopen``\n  (`#2018 <https://github.com/fmtlib/fmt/issues/2018>`_). For example:\n\n  .. code:: c++\n\n     #include <fmt/os.h>\n\n     int main() {\n       fmt::ostream out1 = fmt::output_file(\"guide\");\n       out1.print(\"Zaphod\");\n       out1.close();\n       fmt::ostream out2 = fmt::output_file(\"guide\");\n       out2.print(\"Ford\");\n     }\n\n  writes \"Ford\" to the file \"guide\". To preserve the old file content if any\n  pass ``fmt::file::WRONLY | fmt::file::CREATE`` flags to ``fmt::output_file``.\n\n* Fixed moving of ``fmt::ostream`` that holds buffered data\n  (`#2197 <https://github.com/fmtlib/fmt/issues/2197>`_,\n  `#2198 <https://github.com/fmtlib/fmt/pull/2198>`_).\n  Thanks `@vtta <https://github.com/vtta>`_.\n\n* Replaced the ``fmt::system_error`` exception with a function of the same\n  name that constructs ``std::system_error``\n  (`#2266 <https://github.com/fmtlib/fmt/issues/2266>`_).\n\n* Replaced the ``fmt::windows_error`` exception with a function of the same\n  name that constructs ``std::system_error`` with the category returned by\n  ``fmt::system_category()``\n  (`#2274 <https://github.com/fmtlib/fmt/issues/2274>`_,\n  `#2275 <https://github.com/fmtlib/fmt/pull/2275>`_).\n  The latter is similar to ``std::sytem_category`` but correctly handles UTF-8.\n  Thanks `@phprus (Vladislav Shchapov) <https://github.com/phprus>`_.\n\n* Replaced ``fmt::error_code`` with ``std::error_code`` and made it formattable\n  (`#2269 <https://github.com/fmtlib/fmt/issues/2269>`_,\n  `#2270 <https://github.com/fmtlib/fmt/pull/2270>`_,\n  `#2273 <https://github.com/fmtlib/fmt/pull/2273>`_).\n  Thanks `@phprus (Vladislav Shchapov) <https://github.com/phprus>`_.\n \n* Added speech synthesis support\n  (`#2206 <https://github.com/fmtlib/fmt/pull/2206>`_).\n\n* Made ``format_to`` work with a memory buffer that has a custom allocator\n  (`#2300 <https://github.com/fmtlib/fmt/pull/2300>`_).\n  Thanks `@voxmea <https://github.com/voxmea>`_.\n\n* Added ``Allocator::max_size`` support to ``basic_memory_buffer``.\n  (`#1960 <https://github.com/fmtlib/fmt/pull/1960>`_).\n  Thanks `@phprus (Vladislav Shchapov) <https://github.com/phprus>`_.\n\n* Added wide string support to ``fmt::join``\n  (`#2236 <https://github.com/fmtlib/fmt/pull/2236>`_).\n  Thanks `@crbrz <https://github.com/crbrz>`_.\n\n* Made iterators passed to ``formatter`` specializations via a format context\n  satisfy C++20 ``std::output_iterator`` requirements\n  (`#2156 <https://github.com/fmtlib/fmt/issues/2156>`_,\n  `#2158 <https://github.com/fmtlib/fmt/pull/2158>`_,\n  `#2195 <https://github.com/fmtlib/fmt/issues/2195>`_,\n  `#2204 <https://github.com/fmtlib/fmt/pull/2204>`_).\n  Thanks `@randomnetcat (Jason Cobb) <https://github.com/randomnetcat>`_.\n\n* Optimized the ``printf`` implementation\n  (`#1982 <https://github.com/fmtlib/fmt/pull/1982>`_,\n  `#1984 <https://github.com/fmtlib/fmt/pull/1984>`_,\n  `#2016 <https://github.com/fmtlib/fmt/pull/2016>`_,\n  `#2164 <https://github.com/fmtlib/fmt/pull/2164>`_).\n  Thanks `@rimathia <https://github.com/rimathia>`_ and\n  `@moiwi <https://github.com/moiwi>`_.\n\n* Improved detection of ``constexpr`` ``char_traits``\n  (`#2246 <https://github.com/fmtlib/fmt/pull/2246>`_,\n  `#2257 <https://github.com/fmtlib/fmt/pull/2257>`_).\n  Thanks `@phprus (Vladislav Shchapov) <https://github.com/phprus>`_.\n\n* Fixed writing to ``stdout`` when it is redirected to ``NUL`` on Windows\n  (`#2080 <https://github.com/fmtlib/fmt/issues/2080>`_).\n\n* Fixed exception propagation from iterators\n  (`#2097 <https://github.com/fmtlib/fmt/issues/2097>`_).\n  \n* Improved ``strftime`` error handling \n  (`#2238 <https://github.com/fmtlib/fmt/issues/2238>`_,\n  `#2244 <https://github.com/fmtlib/fmt/pull/2244>`_).\n  Thanks `@yumeyao <https://github.com/yumeyao>`_.\n\n* Stopped using deprecated GCC UDL template extension.\n\n* Added ``fmt/args.h`` to the install target\n  (`#2096 <https://github.com/fmtlib/fmt/issues/2096>`_).\n\n* Error messages are now passed to assert when exceptions are disabled\n  (`#2145 <https://github.com/fmtlib/fmt/pull/2145>`_).\n  Thanks `@NobodyXu (Jiahao XU) <https://github.com/NobodyXu>`_.\n\n* Added the ``FMT_MASTER_PROJECT`` CMake option to control build and install\n  targets when {fmt} is included via ``add_subdirectory``\n  (`#2098 <https://github.com/fmtlib/fmt/issues/2098>`_,\n  `#2100 <https://github.com/fmtlib/fmt/pull/2100>`_).\n  Thanks `@randomizedthinking <https://github.com/randomizedthinking>`_.\n\n* Improved build configuration\n  (`#2026 <https://github.com/fmtlib/fmt/pull/2026>`_,\n  `#2122 <https://github.com/fmtlib/fmt/pull/2122>`_).\n  Thanks `@luncliff (Park DongHa) <https://github.com/luncliff>`_ and\n  `@ibaned (Dan Ibanez) <https://github.com/ibaned>`_.\n\n* Fixed various warnings and compilation issues\n  (`#1947 <https://github.com/fmtlib/fmt/issues/1947>`_,\n  `#1959 <https://github.com/fmtlib/fmt/pull/1959>`_,\n  `#1963 <https://github.com/fmtlib/fmt/pull/1963>`_,\n  `#1965 <https://github.com/fmtlib/fmt/pull/1965>`_,\n  `#1966 <https://github.com/fmtlib/fmt/issues/1966>`_,\n  `#1974 <https://github.com/fmtlib/fmt/pull/1974>`_,\n  `#1975 <https://github.com/fmtlib/fmt/pull/1975>`_,\n  `#1990 <https://github.com/fmtlib/fmt/pull/1990>`_,\n  `#2000 <https://github.com/fmtlib/fmt/issues/2000>`_,\n  `#2001 <https://github.com/fmtlib/fmt/pull/2001>`_,\n  `#2002 <https://github.com/fmtlib/fmt/issues/2002>`_,\n  `#2004 <https://github.com/fmtlib/fmt/issues/2004>`_,\n  `#2006 <https://github.com/fmtlib/fmt/pull/2006>`_,\n  `#2009 <https://github.com/fmtlib/fmt/pull/2009>`_,\n  `#2010 <https://github.com/fmtlib/fmt/pull/2010>`_,\n  `#2038 <https://github.com/fmtlib/fmt/issues/2038>`_,\n  `#2039 <https://github.com/fmtlib/fmt/issues/2039>`_,\n  `#2047 <https://github.com/fmtlib/fmt/issues/2047>`_,\n  `#2053 <https://github.com/fmtlib/fmt/pull/2053>`_,\n  `#2059 <https://github.com/fmtlib/fmt/issues/2059>`_,\n  `#2065 <https://github.com/fmtlib/fmt/pull/2065>`_,\n  `#2067 <https://github.com/fmtlib/fmt/pull/2067>`_,\n  `#2068 <https://github.com/fmtlib/fmt/pull/2068>`_,\n  `#2073 <https://github.com/fmtlib/fmt/pull/2073>`_,\n  `#2103 <https://github.com/fmtlib/fmt/issues/2103>`_\n  `#2105 <https://github.com/fmtlib/fmt/issues/2105>`_\n  `#2106 <https://github.com/fmtlib/fmt/pull/2106>`_,\n  `#2107 <https://github.com/fmtlib/fmt/pull/2107>`_,\n  `#2116 <https://github.com/fmtlib/fmt/issues/2116>`_\n  `#2117 <https://github.com/fmtlib/fmt/pull/2117>`_,\n  `#2118 <https://github.com/fmtlib/fmt/issues/2118>`_\n  `#2119 <https://github.com/fmtlib/fmt/pull/2119>`_,\n  `#2127 <https://github.com/fmtlib/fmt/issues/2127>`_,\n  `#2128 <https://github.com/fmtlib/fmt/pull/2128>`_,\n  `#2140 <https://github.com/fmtlib/fmt/issues/2140>`_,\n  `#2142 <https://github.com/fmtlib/fmt/issues/2142>`_,\n  `#2143 <https://github.com/fmtlib/fmt/pull/2143>`_,\n  `#2144 <https://github.com/fmtlib/fmt/pull/2144>`_,\n  `#2147 <https://github.com/fmtlib/fmt/issues/2147>`_,\n  `#2148 <https://github.com/fmtlib/fmt/issues/2148>`_,\n  `#2149 <https://github.com/fmtlib/fmt/issues/2149>`_,\n  `#2152 <https://github.com/fmtlib/fmt/pull/2152>`_,\n  `#2160 <https://github.com/fmtlib/fmt/pull/2160>`_,\n  `#2170 <https://github.com/fmtlib/fmt/issues/2170>`_,\n  `#2175 <https://github.com/fmtlib/fmt/issues/2175>`_,\n  `#2176 <https://github.com/fmtlib/fmt/issues/2176>`_,\n  `#2177 <https://github.com/fmtlib/fmt/pull/2177>`_,\n  `#2178 <https://github.com/fmtlib/fmt/issues/2178>`_,\n  `#2179 <https://github.com/fmtlib/fmt/pull/2179>`_,\n  `#2180 <https://github.com/fmtlib/fmt/issues/2180>`_,\n  `#2181 <https://github.com/fmtlib/fmt/issues/2181>`_,\n  `#2183 <https://github.com/fmtlib/fmt/pull/2183>`_,\n  `#2184 <https://github.com/fmtlib/fmt/issues/2184>`_,\n  `#2185 <https://github.com/fmtlib/fmt/issues/2185>`_,\n  `#2186 <https://github.com/fmtlib/fmt/pull/2186>`_,\n  `#2187 <https://github.com/fmtlib/fmt/pull/2187>`_,\n  `#2190 <https://github.com/fmtlib/fmt/pull/2190>`_,\n  `#2192 <https://github.com/fmtlib/fmt/pull/2192>`_,\n  `#2194 <https://github.com/fmtlib/fmt/pull/2194>`_,\n  `#2205 <https://github.com/fmtlib/fmt/pull/2205>`_,\n  `#2210 <https://github.com/fmtlib/fmt/issues/2210>`_,\n  `#2211 <https://github.com/fmtlib/fmt/pull/2211>`_,\n  `#2215 <https://github.com/fmtlib/fmt/pull/2215>`_,\n  `#2216 <https://github.com/fmtlib/fmt/pull/2216>`_,\n  `#2218 <https://github.com/fmtlib/fmt/pull/2218>`_,\n  `#2220 <https://github.com/fmtlib/fmt/pull/2220>`_,\n  `#2228 <https://github.com/fmtlib/fmt/issues/2228>`_,\n  `#2229 <https://github.com/fmtlib/fmt/pull/2229>`_,\n  `#2230 <https://github.com/fmtlib/fmt/pull/2230>`_,\n  `#2233 <https://github.com/fmtlib/fmt/issues/2233>`_,\n  `#2239 <https://github.com/fmtlib/fmt/pull/2239>`_,\n  `#2248 <https://github.com/fmtlib/fmt/issues/2248>`_,\n  `#2252 <https://github.com/fmtlib/fmt/issues/2252>`_,\n  `#2253 <https://github.com/fmtlib/fmt/pull/2253>`_,\n  `#2255 <https://github.com/fmtlib/fmt/pull/2255>`_,\n  `#2261 <https://github.com/fmtlib/fmt/issues/2261>`_,\n  `#2278 <https://github.com/fmtlib/fmt/issues/2278>`_,\n  `#2284 <https://github.com/fmtlib/fmt/issues/2284>`_,\n  `#2287 <https://github.com/fmtlib/fmt/pull/2287>`_,\n  `#2289 <https://github.com/fmtlib/fmt/pull/2289>`_,\n  `#2290 <https://github.com/fmtlib/fmt/pull/2290>`_,\n  `#2293 <https://github.com/fmtlib/fmt/pull/2293>`_,\n  `#2295 <https://github.com/fmtlib/fmt/issues/2295>`_,\n  `#2296 <https://github.com/fmtlib/fmt/pull/2296>`_,\n  `#2297 <https://github.com/fmtlib/fmt/pull/2297>`_,\n  `#2311 <https://github.com/fmtlib/fmt/issues/2311>`_,\n  `#2313 <https://github.com/fmtlib/fmt/pull/2313>`_,\n  `#2315 <https://github.com/fmtlib/fmt/pull/2315>`_,\n  `#2320 <https://github.com/fmtlib/fmt/issues/2320>`_,\n  `#2321 <https://github.com/fmtlib/fmt/pull/2321>`_,\n  `#2323 <https://github.com/fmtlib/fmt/pull/2323>`_,\n  `#2328 <https://github.com/fmtlib/fmt/issues/2328>`_,\n  `#2329 <https://github.com/fmtlib/fmt/pull/2329>`_,\n  `#2333 <https://github.com/fmtlib/fmt/pull/2333>`_,\n  `#2338 <https://github.com/fmtlib/fmt/pull/2338>`_,\n  `#2341 <https://github.com/fmtlib/fmt/pull/2341>`_).\n  Thanks `@darklukee <https://github.com/darklukee>`_,\n  `@fagg (Ashton Fagg) <https://github.com/fagg>`_,\n  `@killerbot242 (Lieven de Cock) <https://github.com/killerbot242>`_,\n  `@jgopel (Jonathan Gopel) <https://github.com/jgopel>`_,\n  `@yeswalrus (Walter Gray) <https://github.com/yeswalrus>`_,\n  `@Finkman <https://github.com/Finkman>`_,\n  `@HazardyKnusperkeks (Björn Schäpers) <https://github.com/HazardyKnusperkeks>`_,\n  `@dkavolis (Daumantas Kavolis) <https://github.com/dkavolis>`_\n  `@concatime (Issam Maghni) <https://github.com/concatime>`_,\n  `@chronoxor (Ivan Shynkarenka) <https://github.com/chronoxor>`_,\n  `@summivox (Yin Zhong) <https://github.com/summivox>`_,\n  `@yNeo <https://github.com/yNeo>`_,\n  `@Apache-HB (Elliot) <https://github.com/Apache-HB>`_,\n  `@alexezeder (Alexey Ochapov) <https://github.com/alexezeder>`_,\n  `@toojays (John Steele Scott) <https://github.com/toojays>`_,\n  `@Brainy0207 <https://github.com/Brainy0207>`_,\n  `@vadz (VZ) <https://github.com/vadz>`_,\n  `@imsherlock (Ryan Sherlock) <https://github.com/imsherlock>`_,\n  `@phprus (Vladislav Shchapov) <https://github.com/phprus>`_,\n  `@white238 (Chris White) <https://github.com/white238>`_,\n  `@yafshar (Yaser Afshar) <https://github.com/yafshar>`_,\n  `@BillyDonahue (Billy Donahue) <https://github.com/BillyDonahue>`_,\n  `@jstaahl <https://github.com/jstaahl>`_,\n  `@denchat <https://github.com/denchat>`_,\n  `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_,\n  `@ilyakurdyukov (Ilya Kurdyukov) <https://github.com/ilyakurdyukov>`_,\n  `@ilmai <https://github.com/ilmai>`_,\n  `@JessyDL (Jessy De Lannoit) <https://github.com/JessyDL>`_,\n  `@sergiud (Sergiu Deitsch) <https://github.com/sergiud>`_,\n  `@mwinterb <https://github.com/mwinterb>`_,\n  `@sven-herrmann <https://github.com/sven-herrmann>`_,\n  `@jmelas (John Melas) <https://github.com/jmelas>`_,\n  `@twoixter (Jose Miguel Pérez) <https://github.com/twoixter>`_,\n  `@crbrz <https://github.com/crbrz>`_,\n  `@upsj (Tobias Ribizel) <https://github.com/upsj>`_.\n\n* Improved documentation\n  (`#1986 <https://github.com/fmtlib/fmt/issues/1986>`_,\n  `#2051 <https://github.com/fmtlib/fmt/pull/2051>`_,\n  `#2057 <https://github.com/fmtlib/fmt/issues/2057>`_,\n  `#2081 <https://github.com/fmtlib/fmt/pull/2081>`_,\n  `#2084 <https://github.com/fmtlib/fmt/issues/2084>`_,\n  `#2312 <https://github.com/fmtlib/fmt/pull/2312>`_).\n  Thanks `@imba-tjd (谭九鼎) <https://github.com/imba-tjd>`_,\n  `@0x416c69 (AlιAѕѕaѕѕιN) <https://github.com/0x416c69>`_,\n  `@mordante <https://github.com/mordante>`_.\n\n* Continuous integration and test improvements\n  (`#1969 <https://github.com/fmtlib/fmt/issues/1969>`_,\n  `#1991 <https://github.com/fmtlib/fmt/pull/1991>`_,\n  `#2020 <https://github.com/fmtlib/fmt/pull/2020>`_,\n  `#2110 <https://github.com/fmtlib/fmt/pull/2110>`_,\n  `#2114 <https://github.com/fmtlib/fmt/pull/2114>`_,\n  `#2196 <https://github.com/fmtlib/fmt/issues/2196>`_,\n  `#2217 <https://github.com/fmtlib/fmt/pull/2217>`_,\n  `#2247 <https://github.com/fmtlib/fmt/pull/2247>`_,\n  `#2256 <https://github.com/fmtlib/fmt/pull/2256>`_,\n  `#2336 <https://github.com/fmtlib/fmt/pull/2336>`_,\n  `#2346 <https://github.com/fmtlib/fmt/pull/2346>`_).\n  Thanks `@jgopel (Jonathan Gopel) <https://github.com/jgopel>`_,\n  `@alexezeder (Alexey Ochapov) <https://github.com/alexezeder>`_ and\n  `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.\n  \n7.1.3 - 2020-11-24\n------------------\n\n* Fixed handling of buffer boundaries in ``format_to_n``\n  (`#1996 <https://github.com/fmtlib/fmt/issues/1996>`_,\n  `#2029 <https://github.com/fmtlib/fmt/issues/2029>`_).\n\n* Fixed linkage errors when linking with a shared library\n  (`#2011 <https://github.com/fmtlib/fmt/issues/2011>`_).\n\n* Reintroduced ostream support to range formatters\n  (`#2014 <https://github.com/fmtlib/fmt/issues/2014>`_).\n\n* Worked around an issue with mixing std versions in gcc\n  (`#2017 <https://github.com/fmtlib/fmt/issues/2017>`_).\n\n7.1.2 - 2020-11-04\n------------------\n\n* Fixed floating point formatting with large precision\n  (`#1976 <https://github.com/fmtlib/fmt/issues/1976>`_).\n\n7.1.1 - 2020-11-01\n------------------\n\n* Fixed ABI compatibility with 7.0.x\n  (`#1961 <https://github.com/fmtlib/fmt/issues/1961>`_).\n\n* Added the ``FMT_ARM_ABI_COMPATIBILITY`` macro to work around ABI\n  incompatibility between GCC and Clang on ARM\n  (`#1919 <https://github.com/fmtlib/fmt/issues/1919>`_).\n\n* Worked around a SFINAE bug in GCC 8\n  (`#1957 <https://github.com/fmtlib/fmt/issues/1957>`_).\n\n* Fixed linkage errors when building with GCC's LTO\n  (`#1955 <https://github.com/fmtlib/fmt/issues/1955>`_).\n\n* Fixed a compilation error when building without ``__builtin_clz`` or equivalent\n  (`#1968 <https://github.com/fmtlib/fmt/pull/1968>`_).\n  Thanks `@tohammer (Tobias Hammer) <https://github.com/tohammer>`_.\n\n* Fixed a sign conversion warning\n  (`#1964 <https://github.com/fmtlib/fmt/pull/1964>`_).\n  Thanks `@OptoCloud <https://github.com/OptoCloud>`_.\n\n7.1.0 - 2020-10-25\n------------------\n\n* Switched from `Grisu3\n  <https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf>`_\n  to `Dragonbox <https://github.com/jk-jeon/dragonbox>`_ for the default\n  floating-point formatting which gives the shortest decimal representation\n  with round-trip guarantee and correct rounding\n  (`#1882 <https://github.com/fmtlib/fmt/pull/1882>`_,\n  `#1887 <https://github.com/fmtlib/fmt/pull/1887>`_,\n  `#1894 <https://github.com/fmtlib/fmt/pull/1894>`_). This makes {fmt} up to\n  20-30x faster than common implementations of ``std::ostringstream`` and\n  ``sprintf`` on `dtoa-benchmark <https://github.com/fmtlib/dtoa-benchmark>`_\n  and faster than double-conversion and Ryū:\n\n  .. image:: https://user-images.githubusercontent.com/576385/\n             95684665-11719600-0ba8-11eb-8e5b-972ff4e49428.png\n\n  It is possible to get even better performance at the cost of larger binary\n  size by compiling with the ``FMT_USE_FULL_CACHE_DRAGONBOX`` macro set to 1.\n\n  Thanks `@jk-jeon (Junekey Jeon) <https://github.com/jk-jeon>`_.\n\n* Added an experimental unsynchronized file output API which, together with\n  `format string compilation <https://fmt.dev/latest/api.html#compile-api>`_,\n  can give `5-9 times speed up compared to fprintf\n  <https://www.zverovich.net/2020/08/04/optimal-file-buffer-size.html>`_\n  on common platforms (`godbolt <https://godbolt.org/z/nsTcG8>`__):\n\n  .. code:: c++\n\n     #include <fmt/os.h>\n\n     int main() {\n       auto f = fmt::output_file(\"guide\");\n       f.print(\"The answer is {}.\", 42);\n     }\n\n* Added a formatter for ``std::chrono::time_point<system_clock>``\n  (`#1819 <https://github.com/fmtlib/fmt/issues/1819>`_,\n  `#1837 <https://github.com/fmtlib/fmt/pull/1837>`_). For example\n  (`godbolt <https://godbolt.org/z/c4M6fh>`__):\n\n  .. code:: c++\n\n     #include <fmt/chrono.h>\n\n     int main() {\n       auto now = std::chrono::system_clock::now();\n       fmt::print(\"The time is {:%H:%M:%S}.\\n\", now);\n     }\n\n  Thanks `@adamburgess (Adam Burgess) <https://github.com/adamburgess>`_.\n\n* Added support for ranges with non-const ``begin``/``end`` to ``fmt::join``\n  (`#1784 <https://github.com/fmtlib/fmt/issues/1784>`_,\n  `#1786 <https://github.com/fmtlib/fmt/pull/1786>`_). For example\n  (`godbolt <https://godbolt.org/z/jP63Tv>`__):\n\n  .. code:: c++\n\n     #include <fmt/ranges.h>\n     #include <range/v3/view/filter.hpp>\n\n     int main() {\n       using std::literals::string_literals::operator\"\"s;\n       auto strs = std::array{\"a\"s, \"bb\"s, \"ccc\"s};\n       auto range = strs | ranges::views::filter(\n         [] (const std::string &x) { return x.size() != 2; }\n       );\n       fmt::print(\"{}\\n\", fmt::join(range, \"\"));\n     }\n\n  prints \"accc\".\n\n  Thanks `@tonyelewis (Tony E Lewis) <https://github.com/tonyelewis>`_.\n\n* Added a ``memory_buffer::append`` overload that takes a range\n  (`#1806 <https://github.com/fmtlib/fmt/pull/1806>`_).\n  Thanks `@BRevzin (Barry Revzin) <https://github.com/BRevzin>`_.\n\n* Improved handling of single code units in ``FMT_COMPILE``. For example:\n\n  .. code:: c++\n\n     #include <fmt/compile.h>\n\n     char* f(char* buf) {\n       return fmt::format_to(buf, FMT_COMPILE(\"x{}\"), 42);\n     }\n\n  compiles to just (`godbolt <https://godbolt.org/z/5vncz3>`__):\n\n  .. code:: asm\n\n     _Z1fPc:\n       movb $120, (%rdi)\n       xorl %edx, %edx\n       cmpl $42, _ZN3fmt2v76detail10basic_dataIvE23zero_or_powers_of_10_32E+8(%rip)\n       movl $3, %eax\n       seta %dl\n       subl %edx, %eax\n       movzwl _ZN3fmt2v76detail10basic_dataIvE6digitsE+84(%rip), %edx\n       cltq\n       addq %rdi, %rax\n       movw %dx, -2(%rax)\n       ret\n\n  Here a single ``mov`` instruction writes ``'x'`` (``$120``) to the output\n  buffer.\n\n* Added dynamic width support to format string compilation\n  (`#1809 <https://github.com/fmtlib/fmt/issues/1809>`_).\n\n* Improved error reporting for unformattable types: now you'll get the type name\n  directly in the error message instead of the note:\n\n  .. code:: c++\n\n     #include <fmt/core.h>\n\n     struct how_about_no {};\n\n     int main() {\n       fmt::print(\"{}\", how_about_no());\n     }\n\n  Error (`godbolt <https://godbolt.org/z/GoxM4e>`__):\n\n  ``fmt/core.h:1438:3: error: static_assert failed due to requirement\n  'fmt::v7::formattable<how_about_no>()' \"Cannot format an argument.\n  To make type T formattable provide a formatter<T> specialization:\n  https://fmt.dev/latest/api.html#udt\"\n  ...``\n\n* Added the `make_args_checked <https://fmt.dev/7.1.0/api.html#argument-lists>`_\n  function template that allows you to write formatting functions with\n  compile-time format string checks and avoid binary code bloat\n  (`godbolt <https://godbolt.org/z/PEf9qr>`__):\n\n  .. code:: c++\n\n     void vlog(const char* file, int line, fmt::string_view format,\n               fmt::format_args args) {\n       fmt::print(\"{}: {}: \", file, line);\n       fmt::vprint(format, args);\n     }\n\n     template <typename S, typename... Args>\n     void log(const char* file, int line, const S& format, Args&&... args) {\n       vlog(file, line, format,\n           fmt::make_args_checked<Args...>(format, args...));\n     }\n\n     #define MY_LOG(format, ...) \\\n       log(__FILE__, __LINE__, FMT_STRING(format), __VA_ARGS__)\n\n     MY_LOG(\"invalid squishiness: {}\", 42);\n\n* Replaced ``snprintf`` fallback with a faster internal IEEE 754 ``float`` and\n  ``double`` formatter for arbitrary precision. For example\n  (`godbolt <https://godbolt.org/z/dPhWvj>`__):\n\n  .. code:: c++\n\n     #include <fmt/core.h>\n\n     int main() {\n       fmt::print(\"{:.500}\\n\", 4.9406564584124654E-324);\n     }\n\n  prints\n\n  ``4.9406564584124654417656879286822137236505980261432476442558568250067550727020875186529983636163599237979656469544571773092665671035593979639877479601078187812630071319031140452784581716784898210368871863605699873072305000638740915356498438731247339727316961514003171538539807412623856559117102665855668676818703956031062493194527159149245532930545654440112748012970999954193198940908041656332452475714786901472678015935523861155013480352649347201937902681071074917033322268447533357208324319360923829e-324``.\n\n* Made ``format_to_n`` and ``formatted_size`` part of the `core API\n  <https://fmt.dev/latest/api.html#core-api>`__\n  (`godbolt <https://godbolt.org/z/sPjY1K>`__):\n\n  .. code:: c++\n\n     #include <fmt/core.h>\n\n     int main() {\n       char buffer[10];\n       auto result = fmt::format_to_n(buffer, sizeof(buffer), \"{}\", 42);\n     }\n\n* Added ``fmt::format_to_n`` overload with format string compilation\n  (`#1764 <https://github.com/fmtlib/fmt/issues/1764>`_,\n  `#1767 <https://github.com/fmtlib/fmt/pull/1767>`_,\n  `#1869 <https://github.com/fmtlib/fmt/pull/1869>`_). For example\n  (`godbolt <https://godbolt.org/z/93h86q>`__):\n\n  .. code:: c++\n\n     #include <fmt/compile.h>\n\n     int main() {\n       char buffer[8];\n       fmt::format_to_n(buffer, sizeof(buffer), FMT_COMPILE(\"{}\"), 42);\n     }\n\n  Thanks `@Kurkin (Dmitry Kurkin) <https://github.com/Kurkin>`_,\n  `@alexezeder (Alexey Ochapov) <https://github.com/alexezeder>`_.\n\n* Added ``fmt::format_to`` overload that take ``text_style``\n  (`#1593 <https://github.com/fmtlib/fmt/issues/1593>`_,\n  `#1842 <https://github.com/fmtlib/fmt/issues/1842>`_,\n  `#1843 <https://github.com/fmtlib/fmt/pull/1843>`_). For example\n  (`godbolt <https://godbolt.org/z/91153r>`__):\n\n  .. code:: c++\n\n     #include <fmt/color.h>\n\n     int main() {\n       std::string out;\n       fmt::format_to(std::back_inserter(out),\n                      fmt::emphasis::bold | fg(fmt::color::red),\n                      \"The answer is {}.\", 42);\n     }\n\n  Thanks `@Naios (Denis Blank) <https://github.com/Naios>`_.\n\n* Made the ``'#'`` specifier emit trailing zeros in addition to the decimal\n  point (`#1797 <https://github.com/fmtlib/fmt/issues/1797>`_). For example\n  (`godbolt <https://godbolt.org/z/bhdcW9>`__):\n\n  .. code:: c++\n\n     #include <fmt/core.h>\n\n     int main() {\n       fmt::print(\"{:#.2g}\", 0.5);\n     }\n\n  prints ``0.50``.\n\n* Changed the default floating point format to not include ``.0`` for\n  consistency with ``std::format`` and ``std::to_chars``\n  (`#1893 <https://github.com/fmtlib/fmt/issues/1893>`_,\n  `#1943 <https://github.com/fmtlib/fmt/issues/1943>`_). It is possible to get\n  the decimal point and trailing zero with the ``#`` specifier.\n\n* Fixed an issue with floating-point formatting that could result in addition of\n  a non-significant trailing zero in rare cases e.g. ``1.00e-34`` instead of\n  ``1.0e-34`` (`#1873 <https://github.com/fmtlib/fmt/issues/1873>`_,\n  `#1917 <https://github.com/fmtlib/fmt/issues/1917>`_).\n\n* Made ``fmt::to_string`` fallback on ``ostream`` insertion operator if\n  the ``formatter`` specialization is not provided\n  (`#1815 <https://github.com/fmtlib/fmt/issues/1815>`_,\n  `#1829 <https://github.com/fmtlib/fmt/pull/1829>`_).\n  Thanks `@alexezeder (Alexey Ochapov) <https://github.com/alexezeder>`_.\n\n* Added support for the append mode to the experimental file API and\n  improved ``fcntl.h`` detection.\n  (`#1847 <https://github.com/fmtlib/fmt/pull/1847>`_,\n  `#1848 <https://github.com/fmtlib/fmt/pull/1848>`_).\n  Thanks `@t-wiser <https://github.com/t-wiser>`_.\n\n* Fixed handling of types that have both an implicit conversion operator and\n  an overloaded ``ostream`` insertion operator\n  (`#1766 <https://github.com/fmtlib/fmt/issues/1766>`_).\n\n* Fixed a slicing issue in an internal iterator type\n  (`#1822 <https://github.com/fmtlib/fmt/pull/1822>`_).\n  Thanks `@BRevzin (Barry Revzin) <https://github.com/BRevzin>`_.\n\n* Fixed an issue in locale-specific integer formatting\n  (`#1927 <https://github.com/fmtlib/fmt/issues/1927>`_).\n\n* Fixed handling of exotic code unit types\n  (`#1870 <https://github.com/fmtlib/fmt/issues/1870>`_,\n  `#1932 <https://github.com/fmtlib/fmt/issues/1932>`_).\n\n* Improved ``FMT_ALWAYS_INLINE``\n  (`#1878 <https://github.com/fmtlib/fmt/pull/1878>`_).\n  Thanks `@jk-jeon (Junekey Jeon) <https://github.com/jk-jeon>`_.\n\n* Removed dependency on ``windows.h``\n  (`#1900 <https://github.com/fmtlib/fmt/pull/1900>`_).\n  Thanks `@bernd5 (Bernd Baumanns) <https://github.com/bernd5>`_.\n\n* Optimized counting of decimal digits on MSVC\n  (`#1890 <https://github.com/fmtlib/fmt/pull/1890>`_).\n  Thanks `@mwinterb <https://github.com/mwinterb>`_.\n\n* Improved documentation\n  (`#1772 <https://github.com/fmtlib/fmt/issues/1772>`_,\n  `#1775 <https://github.com/fmtlib/fmt/pull/1775>`_,\n  `#1792 <https://github.com/fmtlib/fmt/pull/1792>`_,\n  `#1838 <https://github.com/fmtlib/fmt/pull/1838>`_,\n  `#1888 <https://github.com/fmtlib/fmt/pull/1888>`_,\n  `#1918 <https://github.com/fmtlib/fmt/pull/1918>`_,\n  `#1939 <https://github.com/fmtlib/fmt/pull/1939>`_).\n  Thanks `@leolchat (Léonard Gérard) <https://github.com/leolchat>`_,\n  `@pepsiman (Malcolm Parsons) <https://github.com/pepsiman>`_,\n  `@Klaim (Joël Lamotte) <https://github.com/Klaim>`_,\n  `@ravijanjam (Ravi J) <https://github.com/ravijanjam>`_,\n  `@francesco-st <https://github.com/francesco-st>`_,\n  `@udnaan (Adnan) <https://github.com/udnaan>`_.\n\n* Added the ``FMT_REDUCE_INT_INSTANTIATIONS`` CMake option that reduces the\n  binary code size at the cost of some integer formatting performance. This can\n  be useful for extremely memory-constrained embedded systems\n  (`#1778 <https://github.com/fmtlib/fmt/issues/1778>`_,\n  `#1781 <https://github.com/fmtlib/fmt/pull/1781>`_).\n  Thanks `@kammce (Khalil Estell) <https://github.com/kammce>`_.\n\n* Added the ``FMT_USE_INLINE_NAMESPACES`` macro to control usage of inline\n  namespaces (`#1945 <https://github.com/fmtlib/fmt/pull/1945>`_).\n  Thanks `@darklukee <https://github.com/darklukee>`_.\n\n* Improved build configuration\n  (`#1760 <https://github.com/fmtlib/fmt/pull/1760>`_,\n  `#1770 <https://github.com/fmtlib/fmt/pull/1770>`_,\n  `#1779 <https://github.com/fmtlib/fmt/issues/1779>`_,\n  `#1783 <https://github.com/fmtlib/fmt/pull/1783>`_,\n  `#1823 <https://github.com/fmtlib/fmt/pull/1823>`_).\n  Thanks `@dvetutnev (Dmitriy Vetutnev) <https://github.com/dvetutnev>`_,\n  `@xvitaly (Vitaly Zaitsev) <https://github.com/xvitaly>`_,\n  `@tambry (Raul Tambre) <https://github.com/tambry>`_,\n  `@medithe <https://github.com/medithe>`_,\n  `@martinwuehrer (Martin Wührer) <https://github.com/martinwuehrer>`_.\n\n* Fixed various warnings and compilation issues\n  (`#1790 <https://github.com/fmtlib/fmt/pull/1790>`_,\n  `#1802 <https://github.com/fmtlib/fmt/pull/1802>`_,\n  `#1808 <https://github.com/fmtlib/fmt/pull/1808>`_,\n  `#1810 <https://github.com/fmtlib/fmt/issues/1810>`_,\n  `#1811 <https://github.com/fmtlib/fmt/issues/1811>`_,\n  `#1812 <https://github.com/fmtlib/fmt/pull/1812>`_,\n  `#1814 <https://github.com/fmtlib/fmt/pull/1814>`_,\n  `#1816 <https://github.com/fmtlib/fmt/pull/1816>`_,\n  `#1817 <https://github.com/fmtlib/fmt/pull/1817>`_,\n  `#1818 <https://github.com/fmtlib/fmt/pull/1818>`_,\n  `#1825 <https://github.com/fmtlib/fmt/issues/1825>`_,\n  `#1836 <https://github.com/fmtlib/fmt/pull/1836>`_,\n  `#1855 <https://github.com/fmtlib/fmt/pull/1855>`_,\n  `#1856 <https://github.com/fmtlib/fmt/pull/1856>`_,\n  `#1860 <https://github.com/fmtlib/fmt/pull/1860>`_,\n  `#1877 <https://github.com/fmtlib/fmt/pull/1877>`_,\n  `#1879 <https://github.com/fmtlib/fmt/pull/1879>`_,\n  `#1880 <https://github.com/fmtlib/fmt/pull/1880>`_,\n  `#1896 <https://github.com/fmtlib/fmt/issues/1896>`_,\n  `#1897 <https://github.com/fmtlib/fmt/pull/1897>`_,\n  `#1898 <https://github.com/fmtlib/fmt/pull/1898>`_,\n  `#1904 <https://github.com/fmtlib/fmt/issues/1904>`_,\n  `#1908 <https://github.com/fmtlib/fmt/pull/1908>`_,\n  `#1911 <https://github.com/fmtlib/fmt/issues/1911>`_,\n  `#1912 <https://github.com/fmtlib/fmt/issues/1912>`_,\n  `#1928 <https://github.com/fmtlib/fmt/issues/1928>`_,\n  `#1929 <https://github.com/fmtlib/fmt/pull/1929>`_,\n  `#1935 <https://github.com/fmtlib/fmt/issues/1935>`_\n  `#1937 <https://github.com/fmtlib/fmt/pull/1937>`_,\n  `#1942 <https://github.com/fmtlib/fmt/pull/1942>`_,\n  `#1949 <https://github.com/fmtlib/fmt/issues/1949>`_).\n  Thanks `@TheQwertiest <https://github.com/TheQwertiest>`_,\n  `@medithe <https://github.com/medithe>`_,\n  `@martinwuehrer (Martin Wührer) <https://github.com/martinwuehrer>`_,\n  `@n16h7hunt3r <https://github.com/n16h7hunt3r>`_,\n  `@Othereum (Seokjin Lee) <https://github.com/Othereum>`_,\n  `@gsjaardema (Greg Sjaardema) <https://github.com/gsjaardema>`_,\n  `@AlexanderLanin (Alexander Lanin) <https://github.com/AlexanderLanin>`_,\n  `@gcerretani (Giovanni Cerretani) <https://github.com/gcerretani>`_,\n  `@chronoxor (Ivan Shynkarenka) <https://github.com/chronoxor>`_,\n  `@noizefloor (Jan Schwers) <https://github.com/noizefloor>`_,\n  `@akohlmey (Axel Kohlmeyer) <https://github.com/akohlmey>`_,\n  `@jk-jeon (Junekey Jeon) <https://github.com/jk-jeon>`_,\n  `@rimathia <https://github.com/rimathia>`_,\n  `@rglarix (Riccardo Ghetta (larix)) <https://github.com/rglarix>`_,\n  `@moiwi <https://github.com/moiwi>`_,\n  `@heckad (Kazantcev Andrey) <https://github.com/heckad>`_,\n  `@MarcDirven <https://github.com/MarcDirven>`_.\n  `@BartSiwek (Bart Siwek) <https://github.com/BartSiwek>`_,\n  `@darklukee <https://github.com/darklukee>`_.\n\n7.0.3 - 2020-08-06\n------------------\n\n* Worked around broken ``numeric_limits`` for 128-bit integers\n  (`#1787 <https://github.com/fmtlib/fmt/issues/1787>`_).\n\n* Added error reporting on missing named arguments\n  (`#1796 <https://github.com/fmtlib/fmt/issues/1796>`_).\n\n* Stopped using 128-bit integers with clang-cl\n  (`#1800 <https://github.com/fmtlib/fmt/pull/1800>`_).\n  Thanks `@Kingcom <https://github.com/Kingcom>`_.\n\n* Fixed issues in locale-specific integer formatting\n  (`#1782 <https://github.com/fmtlib/fmt/issues/1782>`_,\n  `#1801 <https://github.com/fmtlib/fmt/issues/1801>`_).\n\n7.0.2 - 2020-07-29\n------------------\n\n* Worked around broken ``numeric_limits`` for 128-bit integers\n  (`#1725 <https://github.com/fmtlib/fmt/issues/1725>`_).\n\n* Fixed compatibility with CMake 3.4\n  (`#1779 <https://github.com/fmtlib/fmt/issues/1779>`_).\n\n* Fixed handling of digit separators in locale-specific formatting\n  (`#1782 <https://github.com/fmtlib/fmt/issues/1782>`_).\n\n7.0.1 - 2020-07-07\n------------------\n\n* Updated the inline version namespace name.\n\n* Worked around a gcc bug in mangling of alias templates\n  (`#1753 <https://github.com/fmtlib/fmt/issues/1753>`_).\n\n* Fixed a linkage error on Windows\n  (`#1757 <https://github.com/fmtlib/fmt/issues/1757>`_).\n  Thanks `@Kurkin (Dmitry Kurkin) <https://github.com/Kurkin>`_.\n\n* Fixed minor issues with the documentation.\n\n7.0.0 - 2020-07-05\n------------------\n\n* Reduced the library size. For example, on macOS a stripped test binary\n  statically linked with {fmt} `shrank from ~368k to less than 100k\n  <http://www.zverovich.net/2020/05/21/reducing-library-size.html>`_.\n\n* Added a simpler and more efficient `format string compilation API\n  <https://fmt.dev/7.0.0/api.html#compile-api>`_:\n\n  .. code:: c++\n\n     #include <fmt/compile.h>\n\n     // Converts 42 into std::string using the most efficient method and no\n     // runtime format string processing.\n     std::string s = fmt::format(FMT_COMPILE(\"{}\"), 42);\n\n  The old ``fmt::compile`` API is now deprecated.\n\n* Optimized integer formatting: ``format_to`` with format string compilation\n  and a stack-allocated buffer is now `faster than to_chars on both\n  libc++ and libstdc++\n  <http://www.zverovich.net/2020/06/13/fast-int-to-string-revisited.html>`_.\n\n* Optimized handling of small format strings. For example,\n\n  .. code:: c++\n\n      fmt::format(\"Result: {}: ({},{},{},{})\", str1, str2, str3, str4, str5)\n\n  is now ~40% faster (`#1685 <https://github.com/fmtlib/fmt/issues/1685>`_).\n\n* Applied extern templates to improve compile times when using the core API\n  and ``fmt/format.h`` (`#1452 <https://github.com/fmtlib/fmt/issues/1452>`_).\n  For example, on macOS with clang the compile time of a test translation unit\n  dropped from 2.3s to 0.3s with ``-O2`` and from 0.6s to 0.3s with the default\n  settings (``-O0``).\n\n  Before (``-O2``)::\n\n    % time c++ -c test.cc -I include -std=c++17 -O2\n    c++ -c test.cc -I include -std=c++17 -O2  2.22s user 0.08s system 99% cpu 2.311 total\n\n  After (``-O2``)::\n\n    % time c++ -c test.cc -I include -std=c++17 -O2\n    c++ -c test.cc -I include -std=c++17 -O2  0.26s user 0.04s system 98% cpu 0.303 total\n\n  Before (default)::\n\n    % time c++ -c test.cc -I include -std=c++17\n    c++ -c test.cc -I include -std=c++17  0.53s user 0.06s system 98% cpu 0.601 total\n\n  After (default)::\n\n    % time c++ -c test.cc -I include -std=c++17\n    c++ -c test.cc -I include -std=c++17  0.24s user 0.06s system 98% cpu 0.301 total\n\n  It is still recommended to use ``fmt/core.h`` instead of ``fmt/format.h`` but\n  the compile time difference is now smaller. Thanks\n  `@alex3d <https://github.com/alex3d>`_ for the suggestion.\n\n* Named arguments are now stored on stack (no dynamic memory allocations) and\n  the compiled code is more compact and efficient. For example\n\n  .. code:: c++\n\n     #include <fmt/core.h>\n\n     int main() {\n       fmt::print(\"The answer is {answer}\\n\", fmt::arg(\"answer\", 42));\n     }\n\n  compiles to just (`godbolt <https://godbolt.org/z/NcfEp_>`__)\n\n  .. code:: asm\n\n      .LC0:\n              .string \"answer\"\n      .LC1:\n              .string \"The answer is {answer}\\n\"\n      main:\n              sub     rsp, 56\n              mov     edi, OFFSET FLAT:.LC1\n              mov     esi, 23\n              movabs  rdx, 4611686018427387905\n              lea     rax, [rsp+32]\n              lea     rcx, [rsp+16]\n              mov     QWORD PTR [rsp+8], 1\n              mov     QWORD PTR [rsp], rax\n              mov     DWORD PTR [rsp+16], 42\n              mov     QWORD PTR [rsp+32], OFFSET FLAT:.LC0\n              mov     DWORD PTR [rsp+40], 0\n              call    fmt::v6::vprint(fmt::v6::basic_string_view<char>,\n                                      fmt::v6::format_args)\n              xor     eax, eax\n              add     rsp, 56\n              ret\n\n          .L.str.1:\n                  .asciz  \"answer\"\n\n* Implemented compile-time checks for dynamic width and precision\n  (`#1614 <https://github.com/fmtlib/fmt/issues/1614>`_):\n\n  .. code:: c++\n\n     #include <fmt/format.h>\n\n     int main() {\n       fmt::print(FMT_STRING(\"{0:{1}}\"), 42);\n     }\n\n  now gives a compilation error because argument 1 doesn't exist::\n\n    In file included from test.cc:1:\n    include/fmt/format.h:2726:27: error: constexpr variable 'invalid_format' must be\n    initialized by a constant expression\n      FMT_CONSTEXPR_DECL bool invalid_format =\n                              ^\n    ...\n    include/fmt/core.h:569:26: note: in call to\n    '&checker(s, {}).context_->on_error(&\"argument not found\"[0])'\n        if (id >= num_args_) on_error(\"argument not found\");\n                            ^\n\n* Added sentinel support to ``fmt::join``\n  (`#1689 <https://github.com/fmtlib/fmt/pull/1689>`_)\n\n  .. code:: c++\n\n    struct zstring_sentinel {};\n    bool operator==(const char* p, zstring_sentinel) { return *p == '\\0'; }\n    bool operator!=(const char* p, zstring_sentinel) { return *p != '\\0'; }\n\n    struct zstring {\n      const char* p;\n      const char* begin() const { return p; }\n      zstring_sentinel end() const { return {}; }\n    };\n\n    auto s = fmt::format(\"{}\", fmt::join(zstring{\"hello\"}, \"_\"));\n    // s == \"h_e_l_l_o\"\n\n  Thanks `@BRevzin (Barry Revzin) <https://github.com/BRevzin>`_.\n\n* Added support for named arguments, ``clear`` and ``reserve`` to\n  ``dynamic_format_arg_store``\n  (`#1655 <https://github.com/fmtlib/fmt/issues/1655>`_,\n  `#1663 <https://github.com/fmtlib/fmt/pull/1663>`_,\n  `#1674 <https://github.com/fmtlib/fmt/pull/1674>`_,\n  `#1677 <https://github.com/fmtlib/fmt/pull/1677>`_).\n  Thanks `@vsolontsov-ll (Vladimir Solontsov)\n  <https://github.com/vsolontsov-ll>`_.\n\n* Added support for the ``'c'`` format specifier to integral types for\n  compatibility with ``std::format``\n  (`#1652 <https://github.com/fmtlib/fmt/issues/1652>`_).\n\n* Replaced the ``'n'`` format specifier with ``'L'`` for compatibility with\n  ``std::format`` (`#1624 <https://github.com/fmtlib/fmt/issues/1624>`_).\n  The ``'n'`` specifier can be enabled via the ``FMT_DEPRECATED_N_SPECIFIER``\n  macro.\n\n* The ``'='`` format specifier is now disabled by default for compatibility with\n  ``std::format``. It can be enabled via the ``FMT_DEPRECATED_NUMERIC_ALIGN``\n  macro.\n\n* Removed the following deprecated APIs:\n\n  * ``FMT_STRING_ALIAS`` and ``fmt`` macros - replaced by ``FMT_STRING``\n  * ``fmt::basic_string_view::char_type`` - replaced by\n    ``fmt::basic_string_view::value_type``\n  * ``convert_to_int``\n  * ``format_arg_store::types``\n  * ``*parse_context`` - replaced by ``*format_parse_context``\n  * ``FMT_DEPRECATED_INCLUDE_OS``\n  * ``FMT_DEPRECATED_PERCENT`` - incompatible with ``std::format``\n  * ``*writer`` - replaced by compiled format API\n\n* Renamed the ``internal`` namespace to ``detail``\n  (`#1538 <https://github.com/fmtlib/fmt/issues/1538>`_). The former is still\n  provided as an alias if the ``FMT_USE_INTERNAL`` macro is defined.\n\n* Improved compatibility between ``fmt::printf`` with the standard specs\n  (`#1595 <https://github.com/fmtlib/fmt/issues/1595>`_,\n  `#1682 <https://github.com/fmtlib/fmt/pull/1682>`_,\n  `#1683 <https://github.com/fmtlib/fmt/pull/1683>`_,\n  `#1687 <https://github.com/fmtlib/fmt/pull/1687>`_,\n  `#1699 <https://github.com/fmtlib/fmt/pull/1699>`_).\n  Thanks `@rimathia <https://github.com/rimathia>`_.\n\n* Fixed handling of ``operator<<`` overloads that use ``copyfmt``\n  (`#1666 <https://github.com/fmtlib/fmt/issues/1666>`_).\n\n* Added the ``FMT_OS`` CMake option to control inclusion of OS-specific APIs\n  in the fmt target. This can be useful for embedded platforms\n  (`#1654 <https://github.com/fmtlib/fmt/issues/1654>`_,\n  `#1656 <https://github.com/fmtlib/fmt/pull/1656>`_).\n  Thanks `@kwesolowski (Krzysztof Wesolowski)\n  <https://github.com/kwesolowski>`_.\n\n* Replaced ``FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION`` with the ``FMT_FUZZ``\n  macro to prevent interferring with fuzzing of projects using {fmt}\n  (`#1650 <https://github.com/fmtlib/fmt/pull/1650>`_).\n  Thanks `@asraa (Asra Ali) <https://github.com/asraa>`_.\n\n* Fixed compatibility with emscripten\n  (`#1636 <https://github.com/fmtlib/fmt/issues/1636>`_,\n  `#1637 <https://github.com/fmtlib/fmt/pull/1637>`_).\n  Thanks `@ArthurSonzogni (Arthur Sonzogni)\n  <https://github.com/ArthurSonzogni>`_.\n\n* Improved documentation\n  (`#704 <https://github.com/fmtlib/fmt/issues/704>`_,\n  `#1643 <https://github.com/fmtlib/fmt/pull/1643>`_,\n  `#1660 <https://github.com/fmtlib/fmt/pull/1660>`_,\n  `#1681 <https://github.com/fmtlib/fmt/pull/1681>`_,\n  `#1691 <https://github.com/fmtlib/fmt/pull/1691>`_,\n  `#1706 <https://github.com/fmtlib/fmt/pull/1706>`_,\n  `#1714 <https://github.com/fmtlib/fmt/pull/1714>`_,\n  `#1721 <https://github.com/fmtlib/fmt/pull/1721>`_,\n  `#1739 <https://github.com/fmtlib/fmt/pull/1739>`_,\n  `#1740 <https://github.com/fmtlib/fmt/pull/1740>`_,\n  `#1741 <https://github.com/fmtlib/fmt/pull/1741>`_,\n  `#1751 <https://github.com/fmtlib/fmt/pull/1751>`_).\n  Thanks `@senior7515 (Alexander Gallego) <https://github.com/senior7515>`_,\n  `@lsr0 (Lindsay Roberts) <https://github.com/lsr0>`_,\n  `@puetzk (Kevin Puetz) <https://github.com/puetzk>`_,\n  `@fpelliccioni (Fernando Pelliccioni) <https://github.com/fpelliccioni>`_,\n  Alexey Kuzmenko, `@jelly (jelle van der Waa) <https://github.com/jelly>`_,\n  `@claremacrae (Clare Macrae) <https://github.com/claremacrae>`_,\n  `@jiapengwen (文佳鹏) <https://github.com/jiapengwen>`_,\n  `@gsjaardema (Greg Sjaardema) <https://github.com/gsjaardema>`_,\n  `@alexey-milovidov <https://github.com/alexey-milovidov>`_.\n\n* Implemented various build configuration fixes and improvements\n  (`#1603 <https://github.com/fmtlib/fmt/pull/1603>`_,\n  `#1657 <https://github.com/fmtlib/fmt/pull/1657>`_,\n  `#1702 <https://github.com/fmtlib/fmt/pull/1702>`_,\n  `#1728 <https://github.com/fmtlib/fmt/pull/1728>`_).\n  Thanks `@scramsby (Scott Ramsby) <https://github.com/scramsby>`_,\n  `@jtojnar (Jan Tojnar) <https://github.com/jtojnar>`_,\n  `@orivej (Orivej Desh) <https://github.com/orivej>`_,\n  `@flagarde <https://github.com/flagarde>`_.\n\n* Fixed various warnings and compilation issues\n  (`#1616 <https://github.com/fmtlib/fmt/pull/1616>`_,\n  `#1620 <https://github.com/fmtlib/fmt/issues/1620>`_,\n  `#1622 <https://github.com/fmtlib/fmt/issues/1622>`_,\n  `#1625 <https://github.com/fmtlib/fmt/issues/1625>`_,\n  `#1627 <https://github.com/fmtlib/fmt/pull/1627>`_,\n  `#1628 <https://github.com/fmtlib/fmt/issues/1628>`_,\n  `#1629 <https://github.com/fmtlib/fmt/pull/1629>`_,\n  `#1631 <https://github.com/fmtlib/fmt/issues/1631>`_,\n  `#1633 <https://github.com/fmtlib/fmt/pull/1633>`_,\n  `#1649 <https://github.com/fmtlib/fmt/pull/1649>`_,\n  `#1658 <https://github.com/fmtlib/fmt/issues/1658>`_,\n  `#1661 <https://github.com/fmtlib/fmt/pull/1661>`_,\n  `#1667 <https://github.com/fmtlib/fmt/pull/1667>`_,\n  `#1668 <https://github.com/fmtlib/fmt/issues/1668>`_,\n  `#1669 <https://github.com/fmtlib/fmt/pull/1669>`_,\n  `#1692 <https://github.com/fmtlib/fmt/issues/1692>`_,\n  `#1696 <https://github.com/fmtlib/fmt/pull/1696>`_,\n  `#1697 <https://github.com/fmtlib/fmt/pull/1697>`_,\n  `#1707 <https://github.com/fmtlib/fmt/issues/1707>`_,\n  `#1712 <https://github.com/fmtlib/fmt/pull/1712>`_,\n  `#1716 <https://github.com/fmtlib/fmt/pull/1716>`_,\n  `#1722 <https://github.com/fmtlib/fmt/pull/1722>`_,\n  `#1724 <https://github.com/fmtlib/fmt/issues/1724>`_,\n  `#1729 <https://github.com/fmtlib/fmt/pull/1729>`_,\n  `#1738 <https://github.com/fmtlib/fmt/pull/1738>`_,\n  `#1742 <https://github.com/fmtlib/fmt/issues/1742>`_,\n  `#1743 <https://github.com/fmtlib/fmt/issues/1743>`_,\n  `#1744 <https://github.com/fmtlib/fmt/pull/1744>`_,\n  `#1747 <https://github.com/fmtlib/fmt/issues/1747>`_,\n  `#1750 <https://github.com/fmtlib/fmt/pull/1750>`_).\n  Thanks `@gsjaardema (Greg Sjaardema) <https://github.com/gsjaardema>`_,\n  `@gabime (Gabi Melman) <https://github.com/gabime>`_,\n  `@johnor (Johan) <https://github.com/johnor>`_,\n  `@Kurkin (Dmitry Kurkin) <https://github.com/Kurkin>`_,\n  `@invexed (James Beach) <https://github.com/invexed>`_,\n  `@peterbell10 <https://github.com/peterbell10>`_,\n  `@daixtrose (Markus Werle) <https://github.com/daixtrose>`_,\n  `@petrutlucian94 (Lucian Petrut) <https://github.com/petrutlucian94>`_,\n  `@Neargye (Daniil Goncharov) <https://github.com/Neargye>`_,\n  `@ambitslix (Attila M. Szilagyi) <https://github.com/ambitslix>`_,\n  `@gabime (Gabi Melman) <https://github.com/gabime>`_,\n  `@erthink (Leonid Yuriev) <https://github.com/erthink>`_,\n  `@tohammer (Tobias Hammer) <https://github.com/tohammer>`_,\n  `@0x8000-0000 (Florin Iucha) <https://github.com/0x8000-0000>`_.\n\n6.2.1 - 2020-05-09\n------------------\n\n* Fixed ostream support in ``sprintf``\n  (`#1631 <https://github.com/fmtlib/fmt/issues/1631>`_).\n\n* Fixed type detection when using implicit conversion to ``string_view`` and\n  ostream ``operator<<`` inconsistently\n  (`#1662 <https://github.com/fmtlib/fmt/issues/1662>`_).\n\n6.2.0 - 2020-04-05\n------------------\n\n* Improved error reporting when trying to format an object of a non-formattable\n  type:\n\n  .. code:: c++\n\n     fmt::format(\"{}\", S());\n\n  now gives::\n\n    include/fmt/core.h:1015:5: error: static_assert failed due to requirement\n    'formattable' \"Cannot format argument. To make type T formattable provide a\n    formatter<T> specialization:\n    https://fmt.dev/latest/api.html#formatting-user-defined-types\"\n        static_assert(\n        ^\n    ...\n    note: in instantiation of function template specialization\n    'fmt::v6::format<char [3], S, char>' requested here\n      fmt::format(\"{}\", S());\n           ^\n\n  if ``S`` is not formattable.\n\n* Reduced the library size by ~10%.\n\n* Always print decimal point if ``#`` is specified\n  (`#1476 <https://github.com/fmtlib/fmt/issues/1476>`_,\n  `#1498 <https://github.com/fmtlib/fmt/issues/1498>`_):\n\n  .. code:: c++\n\n     fmt::print(\"{:#.0f}\", 42.0);\n\n  now prints ``42.``\n\n* Implemented the ``'L'`` specifier for locale-specific numeric formatting to\n  improve compatibility with ``std::format``. The ``'n'`` specifier is now\n  deprecated and will be removed in the next major release.\n\n* Moved OS-specific APIs such as ``windows_error`` from ``fmt/format.h`` to\n  ``fmt/os.h``. You can define ``FMT_DEPRECATED_INCLUDE_OS`` to automatically\n  include ``fmt/os.h`` from ``fmt/format.h`` for compatibility but this will be\n  disabled in the next major release.\n\n* Added precision overflow detection in floating-point formatting.\n\n* Implemented detection of invalid use of ``fmt::arg``.\n\n* Used ``type_identity`` to block unnecessary template argument deduction.\n  Thanks Tim Song.\n\n* Improved UTF-8 handling\n  (`#1109 <https://github.com/fmtlib/fmt/issues/1109>`_):\n\n  .. code:: c++\n\n     fmt::print(\"┌{0:─^{2}}┐\\n\"\n                \"│{1: ^{2}}│\\n\"\n                \"└{0:─^{2}}┘\\n\", \"\", \"Привет, мир!\", 20);\n\n  now prints::\n\n     ┌────────────────────┐\n     │    Привет, мир!    │\n     └────────────────────┘\n\n  on systems that support Unicode.\n\n* Added experimental dynamic argument storage\n  (`#1170 <https://github.com/fmtlib/fmt/issues/1170>`_,\n  `#1584 <https://github.com/fmtlib/fmt/pull/1584>`_):\n\n  .. code:: c++\n\n     fmt::dynamic_format_arg_store<fmt::format_context> store;\n     store.push_back(\"answer\");\n     store.push_back(42);\n     fmt::vprint(\"The {} is {}.\\n\", store);\n  \n  prints::\n\n     The answer is 42.\n\n  Thanks `@vsolontsov-ll (Vladimir Solontsov)\n  <https://github.com/vsolontsov-ll>`_.\n\n* Made ``fmt::join`` accept ``initializer_list``\n  (`#1591 <https://github.com/fmtlib/fmt/pull/1591>`_).\n  Thanks `@Rapotkinnik (Nikolay Rapotkin) <https://github.com/Rapotkinnik>`_.\n\n* Fixed handling of empty tuples\n  (`#1588 <https://github.com/fmtlib/fmt/issues/1588>`_).\n\n* Fixed handling of output iterators in ``format_to_n``\n  (`#1506 <https://github.com/fmtlib/fmt/issues/1506>`_).\n\n* Fixed formatting of ``std::chrono::duration`` types to wide output\n  (`#1533 <https://github.com/fmtlib/fmt/pull/1533>`_).\n  Thanks `@zeffy (pilao) <https://github.com/zeffy>`_.\n\n* Added const ``begin`` and ``end`` overload to buffers\n  (`#1553 <https://github.com/fmtlib/fmt/pull/1553>`_).\n  Thanks `@dominicpoeschko <https://github.com/dominicpoeschko>`_.\n\n* Added the ability to disable floating-point formatting via ``FMT_USE_FLOAT``,\n  ``FMT_USE_DOUBLE`` and ``FMT_USE_LONG_DOUBLE`` macros for extremely\n  memory-constrained embedded system\n  (`#1590 <https://github.com/fmtlib/fmt/pull/1590>`_).\n  Thanks `@albaguirre (Alberto Aguirre) <https://github.com/albaguirre>`_.\n\n* Made ``FMT_STRING`` work with ``constexpr`` ``string_view``\n  (`#1589 <https://github.com/fmtlib/fmt/pull/1589>`_).\n  Thanks `@scramsby (Scott Ramsby) <https://github.com/scramsby>`_.\n\n* Implemented a minor optimization in the format string parser\n  (`#1560 <https://github.com/fmtlib/fmt/pull/1560>`_).\n  Thanks `@IkarusDeveloper <https://github.com/IkarusDeveloper>`_.\n\n* Improved attribute detection\n  (`#1469 <https://github.com/fmtlib/fmt/pull/1469>`_,\n  `#1475 <https://github.com/fmtlib/fmt/pull/1475>`_,\n  `#1576 <https://github.com/fmtlib/fmt/pull/1576>`_).\n  Thanks `@federico-busato (Federico) <https://github.com/federico-busato>`_,\n  `@chronoxor (Ivan Shynkarenka) <https://github.com/chronoxor>`_,\n  `@refnum <https://github.com/refnum>`_.\n\n* Improved documentation\n  (`#1481 <https://github.com/fmtlib/fmt/pull/1481>`_,\n  `#1523 <https://github.com/fmtlib/fmt/pull/1523>`_).\n  Thanks `@JackBoosY (Jack·Boos·Yu) <https://github.com/JackBoosY>`_,\n  `@imba-tjd (谭九鼎) <https://github.com/imba-tjd>`_.\n\n* Fixed symbol visibility on Linux when compiling with ``-fvisibility=hidden``\n  (`#1535 <https://github.com/fmtlib/fmt/pull/1535>`_).\n  Thanks `@milianw (Milian Wolff) <https://github.com/milianw>`_.\n\n* Implemented various build configuration fixes and improvements\n  (`#1264 <https://github.com/fmtlib/fmt/issues/1264>`_,\n  `#1460 <https://github.com/fmtlib/fmt/issues/1460>`_,\n  `#1534 <https://github.com/fmtlib/fmt/pull/1534>`_,\n  `#1536 <https://github.com/fmtlib/fmt/issues/1536>`_,\n  `#1545 <https://github.com/fmtlib/fmt/issues/1545>`_,\n  `#1546 <https://github.com/fmtlib/fmt/pull/1546>`_,\n  `#1566 <https://github.com/fmtlib/fmt/issues/1566>`_,\n  `#1582 <https://github.com/fmtlib/fmt/pull/1582>`_,\n  `#1597 <https://github.com/fmtlib/fmt/issues/1597>`_,\n  `#1598 <https://github.com/fmtlib/fmt/pull/1598>`_).\n  Thanks `@ambitslix (Attila M. Szilagyi) <https://github.com/ambitslix>`_,\n  `@jwillikers (Jordan Williams) <https://github.com/jwillikers>`_,\n  `@stac47 (Laurent Stacul) <https://github.com/stac47>`_.\n\n* Fixed various warnings and compilation issues\n  (`#1433 <https://github.com/fmtlib/fmt/pull/1433>`_,\n  `#1461 <https://github.com/fmtlib/fmt/issues/1461>`_,\n  `#1470 <https://github.com/fmtlib/fmt/pull/1470>`_,\n  `#1480 <https://github.com/fmtlib/fmt/pull/1480>`_,\n  `#1485 <https://github.com/fmtlib/fmt/pull/1485>`_,\n  `#1492 <https://github.com/fmtlib/fmt/pull/1492>`_,\n  `#1493 <https://github.com/fmtlib/fmt/issues/1493>`_,\n  `#1504 <https://github.com/fmtlib/fmt/issues/1504>`_,\n  `#1505 <https://github.com/fmtlib/fmt/pull/1505>`_,\n  `#1512 <https://github.com/fmtlib/fmt/pull/1512>`_,\n  `#1515 <https://github.com/fmtlib/fmt/issues/1515>`_,\n  `#1516 <https://github.com/fmtlib/fmt/pull/1516>`_,\n  `#1518 <https://github.com/fmtlib/fmt/pull/1518>`_,\n  `#1519 <https://github.com/fmtlib/fmt/pull/1519>`_,\n  `#1520 <https://github.com/fmtlib/fmt/pull/1520>`_,\n  `#1521 <https://github.com/fmtlib/fmt/pull/1521>`_,\n  `#1522 <https://github.com/fmtlib/fmt/pull/1522>`_,\n  `#1524 <https://github.com/fmtlib/fmt/issues/1524>`_,\n  `#1530 <https://github.com/fmtlib/fmt/pull/1530>`_,\n  `#1531 <https://github.com/fmtlib/fmt/issues/1531>`_,\n  `#1532 <https://github.com/fmtlib/fmt/pull/1532>`_,\n  `#1539 <https://github.com/fmtlib/fmt/issues/1539>`_,\n  `#1547 <https://github.com/fmtlib/fmt/issues/1547>`_,\n  `#1548 <https://github.com/fmtlib/fmt/issues/1548>`_,\n  `#1554 <https://github.com/fmtlib/fmt/pull/1554>`_,\n  `#1567 <https://github.com/fmtlib/fmt/issues/1567>`_,\n  `#1568 <https://github.com/fmtlib/fmt/pull/1568>`_,\n  `#1569 <https://github.com/fmtlib/fmt/pull/1569>`_,\n  `#1571 <https://github.com/fmtlib/fmt/pull/1571>`_,\n  `#1573 <https://github.com/fmtlib/fmt/pull/1573>`_,\n  `#1575 <https://github.com/fmtlib/fmt/pull/1575>`_,\n  `#1581 <https://github.com/fmtlib/fmt/pull/1581>`_,\n  `#1583 <https://github.com/fmtlib/fmt/issues/1583>`_,\n  `#1586 <https://github.com/fmtlib/fmt/issues/1586>`_,\n  `#1587 <https://github.com/fmtlib/fmt/issues/1587>`_,\n  `#1594 <https://github.com/fmtlib/fmt/issues/1594>`_,\n  `#1596 <https://github.com/fmtlib/fmt/pull/1596>`_,\n  `#1604 <https://github.com/fmtlib/fmt/issues/1604>`_,\n  `#1606 <https://github.com/fmtlib/fmt/pull/1606>`_,\n  `#1607 <https://github.com/fmtlib/fmt/issues/1607>`_,\n  `#1609 <https://github.com/fmtlib/fmt/issues/1609>`_).\n  Thanks `@marti4d (Chris Martin) <https://github.com/marti4d>`_,\n  `@iPherian <https://github.com/iPherian>`_,\n  `@parkertomatoes <https://github.com/parkertomatoes>`_,\n  `@gsjaardema (Greg Sjaardema) <https://github.com/gsjaardema>`_,\n  `@chronoxor (Ivan Shynkarenka) <https://github.com/chronoxor>`_,\n  `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_,\n  `@torsten48 <https://github.com/torsten48>`_,\n  `@tohammer (Tobias Hammer) <https://github.com/tohammer>`_,\n  `@lefticus (Jason Turner) <https://github.com/lefticus>`_,\n  `@ryusakki (Haise) <https://github.com/ryusakki>`_,\n  `@adnsv (Alex Denisov) <https://github.com/adnsv>`_,\n  `@fghzxm <https://github.com/fghzxm>`_,\n  `@refnum <https://github.com/refnum>`_,\n  `@pramodk (Pramod Kumbhar) <https://github.com/pramodk>`_,\n  `@Spirrwell <https://github.com/Spirrwell>`_,\n  `@scramsby (Scott Ramsby) <https://github.com/scramsby>`_.\n\n6.1.2 - 2019-12-11\n------------------\n\n* Fixed ABI compatibility with ``libfmt.so.6.0.0``\n  (`#1471 <https://github.com/fmtlib/fmt/issues/1471>`_).\n\n* Fixed handling types convertible to ``std::string_view``\n  (`#1451 <https://github.com/fmtlib/fmt/pull/1451>`_).\n  Thanks `@denizevrenci (Deniz Evrenci) <https://github.com/denizevrenci>`_.\n\n* Made CUDA test an opt-in enabled via the ``FMT_CUDA_TEST`` CMake option.\n\n* Fixed sign conversion warnings\n  (`#1440 <https://github.com/fmtlib/fmt/pull/1440>`_).\n  Thanks `@0x8000-0000 (Florin Iucha) <https://github.com/0x8000-0000>`_.\n\n6.1.1 - 2019-12-04\n------------------\n\n* Fixed shared library build on Windows\n  (`#1443 <https://github.com/fmtlib/fmt/pull/1443>`_,\n  `#1445 <https://github.com/fmtlib/fmt/issues/1445>`_,\n  `#1446 <https://github.com/fmtlib/fmt/pull/1446>`_,\n  `#1450 <https://github.com/fmtlib/fmt/issues/1450>`_).\n  Thanks `@egorpugin (Egor Pugin) <https://github.com/egorpugin>`_,\n  `@bbolli (Beat Bolli) <https://github.com/bbolli>`_.\n\n* Added a missing decimal point in exponent notation with trailing zeros.\n\n* Removed deprecated ``format_arg_store::TYPES``.\n\n6.1.0 - 2019-12-01\n------------------\n\n* {fmt} now formats IEEE 754 ``float`` and ``double`` using the shortest decimal\n  representation with correct rounding by default:\n\n  .. code:: c++\n\n     #include <cmath>\n     #include <fmt/core.h>\n\n     int main() {\n       fmt::print(\"{}\", M_PI);\n     }\n\n  prints ``3.141592653589793``.\n\n* Made the fast binary to decimal floating-point formatter the default,\n  simplified it and improved performance. {fmt} is now 15 times faster than\n  libc++'s ``std::ostringstream``, 11 times faster than ``printf`` and 10%\n  faster than double-conversion on `dtoa-benchmark\n  <https://github.com/fmtlib/dtoa-benchmark>`_:\n\n  ==================  =========  =======\n  Function            Time (ns)  Speedup\n  ==================  =========  =======\n  ostringstream        1,346.30    1.00x\n  ostrstream           1,195.74    1.13x\n  sprintf                995.08    1.35x\n  doubleconv              99.10   13.59x\n  fmt                     88.34   15.24x\n  ==================  =========  =======\n\n  .. image:: https://user-images.githubusercontent.com/576385/\n             69767160-cdaca400-112f-11ea-9fc5-347c9f83caad.png\n\n* {fmt} no longer converts ``float`` arguments to ``double``. In particular this\n  improves the default (shortest) representation of floats and makes\n  ``fmt::format`` consistent with ``std::format`` specs\n  (`#1336 <https://github.com/fmtlib/fmt/issues/1336>`_,\n  `#1353 <https://github.com/fmtlib/fmt/issues/1353>`_,\n  `#1360 <https://github.com/fmtlib/fmt/pull/1360>`_,\n  `#1361 <https://github.com/fmtlib/fmt/pull/1361>`_):\n\n  .. code:: c++\n\n     fmt::print(\"{}\", 0.1f);\n\n  prints ``0.1`` instead of ``0.10000000149011612``.\n\n  Thanks `@orivej (Orivej Desh) <https://github.com/orivej>`_.\n\n* Made floating-point formatting output consistent with ``printf``/iostreams\n  (`#1376 <https://github.com/fmtlib/fmt/issues/1376>`_,\n  `#1417 <https://github.com/fmtlib/fmt/issues/1417>`_).\n\n* Added support for 128-bit integers\n  (`#1287 <https://github.com/fmtlib/fmt/pull/1287>`_):\n\n  .. code:: c++\n\n     fmt::print(\"{}\", std::numeric_limits<__int128_t>::max());\n\n  prints ``170141183460469231731687303715884105727``.\n\n  Thanks `@denizevrenci (Deniz Evrenci) <https://github.com/denizevrenci>`_.\n\n* The overload of ``print`` that takes ``text_style`` is now atomic, i.e. the\n  output from different threads doesn't interleave\n  (`#1351 <https://github.com/fmtlib/fmt/pull/1351>`_).\n  Thanks `@tankiJong (Tanki Zhang) <https://github.com/tankiJong>`_.\n\n* Made compile time in the header-only mode ~20% faster by reducing the number\n  of template instantiations. ``wchar_t`` overload of ``vprint`` was moved from\n  ``fmt/core.h`` to ``fmt/format.h``.\n\n* Added an overload of ``fmt::join`` that works with tuples\n  (`#1322 <https://github.com/fmtlib/fmt/issues/1322>`_,\n  `#1330 <https://github.com/fmtlib/fmt/pull/1330>`_):\n\n  .. code:: c++\n\n     #include <tuple>\n     #include <fmt/ranges.h>\n\n     int main() {\n       std::tuple<char, int, float> t{'a', 1, 2.0f};\n       fmt::print(\"{}\", t);\n     }\n\n  prints ``('a', 1, 2.0)``.\n\n  Thanks `@jeremyong (Jeremy Ong) <https://github.com/jeremyong>`_.\n\n* Changed formatting of octal zero with prefix from \"00\" to \"0\":\n\n  .. code:: c++\n\n     fmt::print(\"{:#o}\", 0);\n\n  prints ``0``.\n\n* The locale is now passed to ostream insertion (``<<``) operators\n  (`#1406 <https://github.com/fmtlib/fmt/pull/1406>`_):\n\n  .. code:: c++\n\n     #include <fmt/locale.h>\n     #include <fmt/ostream.h>\n\n     struct S {\n       double value;\n     };\n\n     std::ostream& operator<<(std::ostream& os, S s) {\n       return os << s.value;\n     }\n\n     int main() {\n       auto s = fmt::format(std::locale(\"fr_FR.UTF-8\"), \"{}\", S{0.42});\n       // s == \"0,42\"\n     }\n\n  Thanks `@dlaugt (Daniel Laügt) <https://github.com/dlaugt>`_.\n\n* Locale-specific number formatting now uses grouping\n  (`#1393 <https://github.com/fmtlib/fmt/issues/1393>`_\n  `#1394 <https://github.com/fmtlib/fmt/pull/1394>`_).\n  Thanks `@skrdaniel <https://github.com/skrdaniel>`_.\n\n* Fixed handling of types with deleted implicit rvalue conversion to\n  ``const char**`` (`#1421 <https://github.com/fmtlib/fmt/issues/1421>`_):\n\n  .. code:: c++\n\n     struct mystring {\n       operator const char*() const&;\n       operator const char*() &;\n       operator const char*() const&& = delete;\n       operator const char*() && = delete;\n     };\n     mystring str;\n     fmt::print(\"{}\", str); // now compiles\n\n* Enums are now mapped to correct underlying types instead of ``int``\n  (`#1286 <https://github.com/fmtlib/fmt/pull/1286>`_).\n  Thanks `@agmt (Egor Seredin) <https://github.com/agmt>`_.\n\n* Enum classes are no longer implicitly converted to ``int``\n  (`#1424 <https://github.com/fmtlib/fmt/issues/1424>`_).\n\n* Added ``basic_format_parse_context`` for consistency with C++20\n  ``std::format`` and deprecated ``basic_parse_context``.\n\n* Fixed handling of UTF-8 in precision\n  (`#1389 <https://github.com/fmtlib/fmt/issues/1389>`_,\n  `#1390 <https://github.com/fmtlib/fmt/pull/1390>`_).\n  Thanks `@tajtiattila (Attila Tajti) <https://github.com/tajtiattila>`_.\n\n* {fmt} can now be installed on Linux, macOS and Windows with\n  `Conda <https://docs.conda.io/en/latest/>`__ using its\n  `conda-forge <https://conda-forge.org>`__\n  `package <https://github.com/conda-forge/fmt-feedstock>`__\n  (`#1410 <https://github.com/fmtlib/fmt/pull/1410>`_)::\n\n    conda install -c conda-forge fmt\n\n  Thanks `@tdegeus (Tom de Geus) <https://github.com/tdegeus>`_.\n\n* Added a CUDA test (`#1285 <https://github.com/fmtlib/fmt/pull/1285>`_,\n  `#1317 <https://github.com/fmtlib/fmt/pull/1317>`_).\n  Thanks `@luncliff (Park DongHa) <https://github.com/luncliff>`_ and\n  `@risa2000 <https://github.com/risa2000>`_.\n\n* Improved documentation (`#1276 <https://github.com/fmtlib/fmt/pull/1276>`_,\n  `#1291 <https://github.com/fmtlib/fmt/issues/1291>`_,\n  `#1296 <https://github.com/fmtlib/fmt/issues/1296>`_,\n  `#1315 <https://github.com/fmtlib/fmt/pull/1315>`_,\n  `#1332 <https://github.com/fmtlib/fmt/pull/1332>`_,\n  `#1337 <https://github.com/fmtlib/fmt/pull/1337>`_,\n  `#1395 <https://github.com/fmtlib/fmt/issues/1395>`_\n  `#1418 <https://github.com/fmtlib/fmt/pull/1418>`_).\n  Thanks\n  `@waywardmonkeys (Bruce Mitchener) <https://github.com/waywardmonkeys>`_,\n  `@pauldreik (Paul Dreik) <https://github.com/pauldreik>`_,\n  `@jackoalan (Jack Andersen) <https://github.com/jackoalan>`_.\n\n* Various code improvements\n  (`#1358 <https://github.com/fmtlib/fmt/pull/1358>`_,\n  `#1407 <https://github.com/fmtlib/fmt/pull/1407>`_).\n  Thanks `@orivej (Orivej Desh) <https://github.com/orivej>`_,\n  `@dpacbach (David P. Sicilia) <https://github.com/dpacbach>`_,\n\n* Fixed compile-time format string checks for user-defined types\n  (`#1292 <https://github.com/fmtlib/fmt/issues/1292>`_).\n\n* Worked around a false positive in ``unsigned-integer-overflow`` sanitizer\n  (`#1377 <https://github.com/fmtlib/fmt/issues/1377>`_).\n\n* Fixed various warnings and compilation issues\n  (`#1273 <https://github.com/fmtlib/fmt/issues/1273>`_,\n  `#1278 <https://github.com/fmtlib/fmt/pull/1278>`_,\n  `#1280 <https://github.com/fmtlib/fmt/pull/1280>`_,\n  `#1281 <https://github.com/fmtlib/fmt/issues/1281>`_,\n  `#1288 <https://github.com/fmtlib/fmt/issues/1288>`_,\n  `#1290 <https://github.com/fmtlib/fmt/pull/1290>`_,\n  `#1301 <https://github.com/fmtlib/fmt/pull/1301>`_,\n  `#1305 <https://github.com/fmtlib/fmt/issues/1305>`_,\n  `#1306 <https://github.com/fmtlib/fmt/issues/1306>`_,\n  `#1309 <https://github.com/fmtlib/fmt/issues/1309>`_,\n  `#1312 <https://github.com/fmtlib/fmt/pull/1312>`_,\n  `#1313 <https://github.com/fmtlib/fmt/issues/1313>`_,\n  `#1316 <https://github.com/fmtlib/fmt/issues/1316>`_,\n  `#1319 <https://github.com/fmtlib/fmt/issues/1319>`_,\n  `#1320 <https://github.com/fmtlib/fmt/pull/1320>`_,\n  `#1326 <https://github.com/fmtlib/fmt/pull/1326>`_,\n  `#1328 <https://github.com/fmtlib/fmt/pull/1328>`_,\n  `#1344 <https://github.com/fmtlib/fmt/issues/1344>`_,\n  `#1345 <https://github.com/fmtlib/fmt/pull/1345>`_,\n  `#1347 <https://github.com/fmtlib/fmt/pull/1347>`_,\n  `#1349 <https://github.com/fmtlib/fmt/pull/1349>`_,\n  `#1354 <https://github.com/fmtlib/fmt/issues/1354>`_,\n  `#1362 <https://github.com/fmtlib/fmt/issues/1362>`_,\n  `#1366 <https://github.com/fmtlib/fmt/issues/1366>`_,\n  `#1364 <https://github.com/fmtlib/fmt/pull/1364>`_,\n  `#1370 <https://github.com/fmtlib/fmt/pull/1370>`_,\n  `#1371 <https://github.com/fmtlib/fmt/pull/1371>`_,\n  `#1385 <https://github.com/fmtlib/fmt/issues/1385>`_,\n  `#1388 <https://github.com/fmtlib/fmt/issues/1388>`_,\n  `#1397 <https://github.com/fmtlib/fmt/pull/1397>`_,\n  `#1414 <https://github.com/fmtlib/fmt/pull/1414>`_,\n  `#1416 <https://github.com/fmtlib/fmt/pull/1416>`_,\n  `#1422 <https://github.com/fmtlib/fmt/issues/1422>`_\n  `#1427 <https://github.com/fmtlib/fmt/pull/1427>`_,\n  `#1431 <https://github.com/fmtlib/fmt/issues/1431>`_,\n  `#1433 <https://github.com/fmtlib/fmt/pull/1433>`_).\n  Thanks `@hhb <https://github.com/hhb>`_,\n  `@gsjaardema (Greg Sjaardema) <https://github.com/gsjaardema>`_,\n  `@gabime (Gabi Melman) <https://github.com/gabime>`_,\n  `@neheb (Rosen Penev) <https://github.com/neheb>`_,\n  `@vedranmiletic (Vedran Miletić) <https://github.com/vedranmiletic>`_,\n  `@dkavolis (Daumantas Kavolis) <https://github.com/dkavolis>`_,\n  `@mwinterb <https://github.com/mwinterb>`_,\n  `@orivej (Orivej Desh) <https://github.com/orivej>`_,\n  `@denizevrenci (Deniz Evrenci) <https://github.com/denizevrenci>`_\n  `@leonklingele <https://github.com/leonklingele>`_,\n  `@chronoxor (Ivan Shynkarenka) <https://github.com/chronoxor>`_,\n  `@kent-tri <https://github.com/kent-tri>`_,\n  `@0x8000-0000 (Florin Iucha) <https://github.com/0x8000-0000>`_,\n  `@marti4d (Chris Martin) <https://github.com/marti4d>`_.\n\n6.0.0 - 2019-08-26\n------------------\n\n* Switched to the `MIT license\n  <https://github.com/fmtlib/fmt/blob/5a4b24613ba16cc689977c3b5bd8274a3ba1dd1f/LICENSE.rst>`_\n  with an optional exception that allows distributing binary code without\n  attribution.\n\n* Floating-point formatting is now locale-independent by default:\n\n  .. code:: c++\n\n     #include <locale>\n     #include <fmt/core.h>\n\n     int main() {\n       std::locale::global(std::locale(\"ru_RU.UTF-8\"));\n       fmt::print(\"value = {}\", 4.2);\n     }\n\n  prints \"value = 4.2\" regardless of the locale.\n\n  For locale-specific formatting use the ``n`` specifier:\n\n  .. code:: c++\n\n     std::locale::global(std::locale(\"ru_RU.UTF-8\"));\n     fmt::print(\"value = {:n}\", 4.2);\n\n  prints \"value = 4,2\".\n\n* Added an experimental Grisu floating-point formatting algorithm\n  implementation (disabled by default). To enable it compile with the\n  ``FMT_USE_GRISU`` macro defined to 1:\n\n  .. code:: c++\n\n     #define FMT_USE_GRISU 1\n     #include <fmt/format.h>\n\n     auto s = fmt::format(\"{}\", 4.2); // formats 4.2 using Grisu\n\n  With Grisu enabled, {fmt} is 13x faster than ``std::ostringstream`` (libc++)\n  and 10x faster than ``sprintf`` on `dtoa-benchmark\n  <https://github.com/fmtlib/dtoa-benchmark>`_ (`full results\n  <https://fmt.dev/unknown_mac64_clang10.0.html>`_):\n\n  .. image:: https://user-images.githubusercontent.com/576385/\n             54883977-9fe8c000-4e28-11e9-8bde-272d122e7c52.jpg\n\n* Separated formatting and parsing contexts for consistency with\n  `C++20 std::format <http://eel.is/c++draft/format>`_, removing the\n  undocumented ``basic_format_context::parse_context()`` function.\n\n* Added `oss-fuzz <https://github.com/google/oss-fuzz>`_ support\n  (`#1199 <https://github.com/fmtlib/fmt/pull/1199>`_).\n  Thanks `@pauldreik (Paul Dreik) <https://github.com/pauldreik>`_.\n\n* ``formatter`` specializations now always take precedence over ``operator<<``\n  (`#952 <https://github.com/fmtlib/fmt/issues/952>`_):\n\n  .. code:: c++\n\n     #include <iostream>\n     #include <fmt/ostream.h>\n\n     struct S {};\n\n     std::ostream& operator<<(std::ostream& os, S) {\n       return os << 1;\n     }\n\n     template <>\n     struct fmt::formatter<S> : fmt::formatter<int> {\n       auto format(S, format_context& ctx) {\n         return formatter<int>::format(2, ctx);\n       }\n     };\n\n     int main() {\n       std::cout << S() << \"\\n\"; // prints 1 using operator<<\n       fmt::print(\"{}\\n\", S());  // prints 2 using formatter\n     }\n\n* Introduced the experimental ``fmt::compile`` function that does format string\n  compilation (`#618 <https://github.com/fmtlib/fmt/issues/618>`_,\n  `#1169 <https://github.com/fmtlib/fmt/issues/1169>`_,\n  `#1171 <https://github.com/fmtlib/fmt/pull/1171>`_):\n\n  .. code:: c++\n\n     #include <fmt/compile.h>\n\n     auto f = fmt::compile<int>(\"{}\");\n     std::string s = fmt::format(f, 42); // can be called multiple times to\n                                         // format different values\n     // s == \"42\"\n\n  It moves the cost of parsing a format string outside of the format function\n  which can be beneficial when identically formatting many objects of the same\n  types. Thanks `@stryku (Mateusz Janek) <https://github.com/stryku>`_.\n\n* Added experimental ``%`` format specifier that formats floating-point values\n  as percentages (`#1060 <https://github.com/fmtlib/fmt/pull/1060>`_,\n  `#1069 <https://github.com/fmtlib/fmt/pull/1069>`_,\n  `#1071 <https://github.com/fmtlib/fmt/pull/1071>`_):\n\n  .. code:: c++\n\n     auto s = fmt::format(\"{:.1%}\", 0.42); // s == \"42.0%\"\n\n  Thanks `@gawain-bolton (Gawain Bolton) <https://github.com/gawain-bolton>`_.\n\n* Implemented precision for floating-point durations\n  (`#1004 <https://github.com/fmtlib/fmt/issues/1004>`_,\n  `#1012 <https://github.com/fmtlib/fmt/pull/1012>`_):\n\n  .. code:: c++\n\n     auto s = fmt::format(\"{:.1}\", std::chrono::duration<double>(1.234));\n     // s == 1.2s\n\n  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.\n\n* Implemented ``chrono`` format specifiers ``%Q`` and ``%q`` that give the value\n  and the unit respectively (`#1019 <https://github.com/fmtlib/fmt/pull/1019>`_):\n\n  .. code:: c++\n\n     auto value = fmt::format(\"{:%Q}\", 42s); // value == \"42\"\n     auto unit  = fmt::format(\"{:%q}\", 42s); // unit == \"s\"\n\n  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.\n\n* Fixed handling of dynamic width in chrono formatter:\n\n  .. code:: c++\n\n     auto s = fmt::format(\"{0:{1}%H:%M:%S}\", std::chrono::seconds(12345), 12);\n     //                        ^ width argument index                     ^ width\n     // s == \"03:25:45    \"\n\n  Thanks Howard Hinnant.\n\n* Removed deprecated ``fmt/time.h``. Use ``fmt/chrono.h`` instead.\n\n* Added ``fmt::format`` and ``fmt::vformat`` overloads that take ``text_style``\n  (`#993 <https://github.com/fmtlib/fmt/issues/993>`_,\n  `#994 <https://github.com/fmtlib/fmt/pull/994>`_):\n\n  .. code:: c++\n\n     #include <fmt/color.h>\n\n     std::string message = fmt::format(fmt::emphasis::bold | fg(fmt::color::red),\n                                       \"The answer is {}.\", 42);\n\n  Thanks `@Naios (Denis Blank) <https://github.com/Naios>`_.\n\n* Removed the deprecated color API (``print_colored``). Use the new API, namely\n  ``print`` overloads that take ``text_style`` instead.\n\n* Made ``std::unique_ptr`` and ``std::shared_ptr`` formattable as pointers via\n  ``fmt::ptr`` (`#1121 <https://github.com/fmtlib/fmt/pull/1121>`_):\n\n  .. code:: c++\n\n     std::unique_ptr<int> p = ...;\n     fmt::print(\"{}\", fmt::ptr(p)); // prints p as a pointer\n\n  Thanks `@sighingnow (Tao He) <https://github.com/sighingnow>`_.\n\n* Made ``print`` and ``vprint`` report I/O errors\n  (`#1098 <https://github.com/fmtlib/fmt/issues/1098>`_,\n  `#1099 <https://github.com/fmtlib/fmt/pull/1099>`_).\n  Thanks `@BillyDonahue (Billy Donahue) <https://github.com/BillyDonahue>`_.\n\n* Marked deprecated APIs with the ``[[deprecated]]`` attribute and removed\n  internal uses of deprecated APIs\n  (`#1022 <https://github.com/fmtlib/fmt/pull/1022>`_).\n  Thanks `@eliaskosunen (Elias Kosunen) <https://github.com/eliaskosunen>`_.\n\n* Modernized the codebase using more C++11 features and removing workarounds.\n  Most importantly, ``buffer_context`` is now an alias template, so\n  use ``buffer_context<T>`` instead of ``buffer_context<T>::type``.\n  These features require GCC 4.8 or later.\n\n* ``formatter`` specializations now always take precedence over implicit\n  conversions to ``int`` and the undocumented ``convert_to_int`` trait\n  is now deprecated.\n\n* Moved the undocumented ``basic_writer``, ``writer``, and ``wwriter`` types\n  to the ``internal`` namespace.\n\n* Removed deprecated ``basic_format_context::begin()``. Use ``out()`` instead.\n\n* Disallowed passing the result of ``join`` as an lvalue to prevent misuse.\n\n* Refactored the undocumented structs that represent parsed format specifiers\n  to simplify the API and allow multibyte fill.\n\n* Moved SFINAE to template parameters to reduce symbol sizes.\n\n* Switched to ``fputws`` for writing wide strings so that it's no longer\n  required to call ``_setmode`` on Windows\n  (`#1229 <https://github.com/fmtlib/fmt/issues/1229>`_,\n  `#1243 <https://github.com/fmtlib/fmt/pull/1243>`_).\n  Thanks `@jackoalan (Jack Andersen) <https://github.com/jackoalan>`_.\n\n* Improved literal-based API\n  (`#1254 <https://github.com/fmtlib/fmt/pull/1254>`_).\n  Thanks `@sylveon (Charles Milette) <https://github.com/sylveon>`_.\n\n* Added support for exotic platforms without ``uintptr_t`` such as IBM i\n  (AS/400) which has 128-bit pointers and only 64-bit integers\n  (`#1059 <https://github.com/fmtlib/fmt/issues/1059>`_).\n\n* Added `Sublime Text syntax highlighting config\n  <https://github.com/fmtlib/fmt/blob/master/support/C%2B%2B.sublime-syntax>`_\n  (`#1037 <https://github.com/fmtlib/fmt/issues/1037>`_).\n  Thanks `@Kronuz (Germán Méndez Bravo) <https://github.com/Kronuz>`_.\n\n* Added the ``FMT_ENFORCE_COMPILE_STRING`` macro to enforce the use of\n  compile-time format strings\n  (`#1231 <https://github.com/fmtlib/fmt/pull/1231>`_).\n  Thanks `@jackoalan (Jack Andersen) <https://github.com/jackoalan>`_.\n\n* Stopped setting ``CMAKE_BUILD_TYPE`` if {fmt} is a subproject\n  (`#1081 <https://github.com/fmtlib/fmt/issues/1081>`_).\n\n* Various build improvements\n  (`#1039 <https://github.com/fmtlib/fmt/pull/1039>`_,\n  `#1078 <https://github.com/fmtlib/fmt/pull/1078>`_,\n  `#1091 <https://github.com/fmtlib/fmt/pull/1091>`_,\n  `#1103 <https://github.com/fmtlib/fmt/pull/1103>`_,\n  `#1177 <https://github.com/fmtlib/fmt/pull/1177>`_).\n  Thanks `@luncliff (Park DongHa) <https://github.com/luncliff>`_,\n  `@jasonszang (Jason Shuo Zang) <https://github.com/jasonszang>`_,\n  `@olafhering (Olaf Hering) <https://github.com/olafhering>`_,\n  `@Lecetem <https://github.com/Lectem>`_,\n  `@pauldreik (Paul Dreik) <https://github.com/pauldreik>`_.\n\n* Improved documentation\n  (`#1049 <https://github.com/fmtlib/fmt/issues/1049>`_,\n  `#1051 <https://github.com/fmtlib/fmt/pull/1051>`_,\n  `#1083 <https://github.com/fmtlib/fmt/pull/1083>`_,\n  `#1113 <https://github.com/fmtlib/fmt/pull/1113>`_,\n  `#1114 <https://github.com/fmtlib/fmt/pull/1114>`_,\n  `#1146 <https://github.com/fmtlib/fmt/issues/1146>`_,\n  `#1180 <https://github.com/fmtlib/fmt/issues/1180>`_,\n  `#1250 <https://github.com/fmtlib/fmt/pull/1250>`_,\n  `#1252 <https://github.com/fmtlib/fmt/pull/1252>`_,\n  `#1265 <https://github.com/fmtlib/fmt/pull/1265>`_).\n  Thanks `@mikelui (Michael Lui) <https://github.com/mikelui>`_,\n  `@foonathan (Jonathan Müller) <https://github.com/foonathan>`_,\n  `@BillyDonahue (Billy Donahue) <https://github.com/BillyDonahue>`_,\n  `@jwakely (Jonathan Wakely) <https://github.com/jwakely>`_,\n  `@kaisbe (Kais Ben Salah) <https://github.com/kaisbe>`_,\n  `@sdebionne (Samuel Debionne) <https://github.com/sdebionne>`_.\n\n* Fixed ambiguous formatter specialization in ``fmt/ranges.h``\n  (`#1123 <https://github.com/fmtlib/fmt/issues/1123>`_).\n\n* Fixed formatting of a non-empty ``std::filesystem::path`` which is an\n  infinitely deep range of its components\n  (`#1268 <https://github.com/fmtlib/fmt/issues/1268>`_).\n\n* Fixed handling of general output iterators when formatting characters\n  (`#1056 <https://github.com/fmtlib/fmt/issues/1056>`_,\n  `#1058 <https://github.com/fmtlib/fmt/pull/1058>`_).\n  Thanks `@abolz (Alexander Bolz) <https://github.com/abolz>`_.\n\n* Fixed handling of output iterators in ``formatter`` specialization for\n  ranges (`#1064 <https://github.com/fmtlib/fmt/issues/1064>`_).\n\n* Fixed handling of exotic character types\n  (`#1188 <https://github.com/fmtlib/fmt/issues/1188>`_).\n\n* Made chrono formatting work with exceptions disabled\n  (`#1062 <https://github.com/fmtlib/fmt/issues/1062>`_).\n\n* Fixed DLL visibility issues\n  (`#1134 <https://github.com/fmtlib/fmt/pull/1134>`_,\n  `#1147 <https://github.com/fmtlib/fmt/pull/1147>`_).\n  Thanks `@denchat <https://github.com/denchat>`_.\n\n* Disabled the use of UDL template extension on GCC 9\n  (`#1148 <https://github.com/fmtlib/fmt/issues/1148>`_).\n\n* Removed misplaced ``format`` compile-time checks from ``printf``\n  (`#1173 <https://github.com/fmtlib/fmt/issues/1173>`_).\n\n* Fixed issues in the experimental floating-point formatter\n  (`#1072 <https://github.com/fmtlib/fmt/issues/1072>`_,\n  `#1129 <https://github.com/fmtlib/fmt/issues/1129>`_,\n  `#1153 <https://github.com/fmtlib/fmt/issues/1153>`_,\n  `#1155 <https://github.com/fmtlib/fmt/pull/1155>`_,\n  `#1210 <https://github.com/fmtlib/fmt/issues/1210>`_,\n  `#1222 <https://github.com/fmtlib/fmt/issues/1222>`_).\n  Thanks `@alabuzhev (Alex Alabuzhev) <https://github.com/alabuzhev>`_.\n\n* Fixed bugs discovered by fuzzing or during fuzzing integration\n  (`#1124 <https://github.com/fmtlib/fmt/issues/1124>`_,\n  `#1127 <https://github.com/fmtlib/fmt/issues/1127>`_,\n  `#1132 <https://github.com/fmtlib/fmt/issues/1132>`_,\n  `#1135 <https://github.com/fmtlib/fmt/pull/1135>`_,\n  `#1136 <https://github.com/fmtlib/fmt/issues/1136>`_,\n  `#1141 <https://github.com/fmtlib/fmt/issues/1141>`_,\n  `#1142 <https://github.com/fmtlib/fmt/issues/1142>`_,\n  `#1178 <https://github.com/fmtlib/fmt/issues/1178>`_,\n  `#1179 <https://github.com/fmtlib/fmt/issues/1179>`_,\n  `#1194 <https://github.com/fmtlib/fmt/issues/1194>`_).\n  Thanks `@pauldreik (Paul Dreik) <https://github.com/pauldreik>`_.\n\n* Fixed building tests on FreeBSD and Hurd\n  (`#1043 <https://github.com/fmtlib/fmt/issues/1043>`_).\n  Thanks `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_.\n\n* Fixed various warnings and compilation issues\n  (`#998 <https://github.com/fmtlib/fmt/pull/998>`_,\n  `#1006 <https://github.com/fmtlib/fmt/pull/1006>`_,\n  `#1008 <https://github.com/fmtlib/fmt/issues/1008>`_,\n  `#1011 <https://github.com/fmtlib/fmt/issues/1011>`_,\n  `#1025 <https://github.com/fmtlib/fmt/issues/1025>`_,\n  `#1027 <https://github.com/fmtlib/fmt/pull/1027>`_,\n  `#1028 <https://github.com/fmtlib/fmt/pull/1028>`_,\n  `#1029 <https://github.com/fmtlib/fmt/pull/1029>`_,\n  `#1030 <https://github.com/fmtlib/fmt/pull/1030>`_,\n  `#1031 <https://github.com/fmtlib/fmt/pull/1031>`_,\n  `#1054 <https://github.com/fmtlib/fmt/pull/1054>`_,\n  `#1063 <https://github.com/fmtlib/fmt/issues/1063>`_,\n  `#1068 <https://github.com/fmtlib/fmt/pull/1068>`_,\n  `#1074 <https://github.com/fmtlib/fmt/pull/1074>`_,\n  `#1075 <https://github.com/fmtlib/fmt/pull/1075>`_,\n  `#1079 <https://github.com/fmtlib/fmt/pull/1079>`_,\n  `#1086 <https://github.com/fmtlib/fmt/pull/1086>`_,\n  `#1088 <https://github.com/fmtlib/fmt/issues/1088>`_,\n  `#1089 <https://github.com/fmtlib/fmt/pull/1089>`_,\n  `#1094 <https://github.com/fmtlib/fmt/pull/1094>`_,\n  `#1101 <https://github.com/fmtlib/fmt/issues/1101>`_,\n  `#1102 <https://github.com/fmtlib/fmt/pull/1102>`_,\n  `#1105 <https://github.com/fmtlib/fmt/issues/1105>`_,\n  `#1107 <https://github.com/fmtlib/fmt/pull/1107>`_,\n  `#1115 <https://github.com/fmtlib/fmt/issues/1115>`_,\n  `#1117 <https://github.com/fmtlib/fmt/issues/1117>`_,\n  `#1118 <https://github.com/fmtlib/fmt/issues/1118>`_,\n  `#1120 <https://github.com/fmtlib/fmt/issues/1120>`_,\n  `#1123 <https://github.com/fmtlib/fmt/issues/1123>`_,\n  `#1139 <https://github.com/fmtlib/fmt/pull/1139>`_,\n  `#1140 <https://github.com/fmtlib/fmt/issues/1140>`_,\n  `#1143 <https://github.com/fmtlib/fmt/issues/1143>`_,\n  `#1144 <https://github.com/fmtlib/fmt/pull/1144>`_,\n  `#1150 <https://github.com/fmtlib/fmt/pull/1150>`_,\n  `#1151 <https://github.com/fmtlib/fmt/pull/1151>`_,\n  `#1152 <https://github.com/fmtlib/fmt/issues/1152>`_,\n  `#1154 <https://github.com/fmtlib/fmt/issues/1154>`_,\n  `#1156 <https://github.com/fmtlib/fmt/issues/1156>`_,\n  `#1159 <https://github.com/fmtlib/fmt/pull/1159>`_,\n  `#1175 <https://github.com/fmtlib/fmt/issues/1175>`_,\n  `#1181 <https://github.com/fmtlib/fmt/issues/1181>`_,\n  `#1186 <https://github.com/fmtlib/fmt/issues/1186>`_,\n  `#1187 <https://github.com/fmtlib/fmt/pull/1187>`_,\n  `#1191 <https://github.com/fmtlib/fmt/pull/1191>`_,\n  `#1197 <https://github.com/fmtlib/fmt/issues/1197>`_,\n  `#1200 <https://github.com/fmtlib/fmt/issues/1200>`_,\n  `#1203 <https://github.com/fmtlib/fmt/issues/1203>`_,\n  `#1205 <https://github.com/fmtlib/fmt/issues/1205>`_,\n  `#1206 <https://github.com/fmtlib/fmt/pull/1206>`_,\n  `#1213 <https://github.com/fmtlib/fmt/issues/1213>`_,\n  `#1214 <https://github.com/fmtlib/fmt/issues/1214>`_,\n  `#1217 <https://github.com/fmtlib/fmt/pull/1217>`_,\n  `#1228 <https://github.com/fmtlib/fmt/issues/1228>`_,\n  `#1230 <https://github.com/fmtlib/fmt/pull/1230>`_,\n  `#1232 <https://github.com/fmtlib/fmt/issues/1232>`_,\n  `#1235 <https://github.com/fmtlib/fmt/pull/1235>`_,\n  `#1236 <https://github.com/fmtlib/fmt/pull/1236>`_,\n  `#1240 <https://github.com/fmtlib/fmt/issues/1240>`_).\n  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_,\n  `@mwinterb <https://github.com/mwinterb>`_,\n  `@eliaskosunen (Elias Kosunen) <https://github.com/eliaskosunen>`_,\n  `@morinmorin <https://github.com/morinmorin>`_,\n  `@ricco19 (Brian Ricciardelli) <https://github.com/ricco19>`_,\n  `@waywardmonkeys (Bruce Mitchener) <https://github.com/waywardmonkeys>`_,\n  `@chronoxor (Ivan Shynkarenka) <https://github.com/chronoxor>`_,\n  `@remyabel <https://github.com/remyabel>`_,\n  `@pauldreik (Paul Dreik) <https://github.com/pauldreik>`_,\n  `@gsjaardema (Greg Sjaardema) <https://github.com/gsjaardema>`_,\n  `@rcane (Ronny Krüger) <https://github.com/rcane>`_,\n  `@mocabe <https://github.com/mocabe>`_,\n  `@denchat <https://github.com/denchat>`_,\n  `@cjdb (Christopher Di Bella) <https://github.com/cjdb>`_,\n  `@HazardyKnusperkeks (Björn Schäpers) <https://github.com/HazardyKnusperkeks>`_,\n  `@vedranmiletic (Vedran Miletić) <https://github.com/vedranmiletic>`_,\n  `@jackoalan (Jack Andersen) <https://github.com/jackoalan>`_,\n  `@DaanDeMeyer (Daan De Meyer) <https://github.com/DaanDeMeyer>`_,\n  `@starkmapper (Mark Stapper) <https://github.com/starkmapper>`_.\n\n5.3.0 - 2018-12-28\n------------------\n\n* Introduced experimental chrono formatting support:\n\n  .. code:: c++\n\n     #include <fmt/chrono.h>\n\n     int main() {\n       using namespace std::literals::chrono_literals;\n       fmt::print(\"Default format: {} {}\\n\", 42s, 100ms);\n       fmt::print(\"strftime-like format: {:%H:%M:%S}\\n\", 3h + 15min + 30s);\n     }\n\n  prints::\n\n     Default format: 42s 100ms\n     strftime-like format: 03:15:30\n\n* Added experimental support for emphasis (bold, italic, underline,\n  strikethrough), colored output to a file stream, and improved colored\n  formatting API\n  (`#961 <https://github.com/fmtlib/fmt/pull/961>`_,\n  `#967 <https://github.com/fmtlib/fmt/pull/967>`_,\n  `#973 <https://github.com/fmtlib/fmt/pull/973>`_):\n\n  .. code:: c++\n\n     #include <fmt/color.h>\n\n     int main() {\n       print(fg(fmt::color::crimson) | fmt::emphasis::bold,\n             \"Hello, {}!\\n\", \"world\");\n       print(fg(fmt::color::floral_white) | bg(fmt::color::slate_gray) |\n             fmt::emphasis::underline, \"Hello, {}!\\n\", \"мир\");\n       print(fg(fmt::color::steel_blue) | fmt::emphasis::italic,\n             \"Hello, {}!\\n\", \"世界\");\n     }\n\n  prints the following on modern terminals with RGB color support:\n\n  .. image:: https://user-images.githubusercontent.com/576385/\n             50405788-b66e7500-076e-11e9-9592-7324d1f951d8.png\n\n  Thanks `@Rakete1111 (Nicolas) <https://github.com/Rakete1111>`_.\n\n* Added support for 4-bit terminal colors\n  (`#968 <https://github.com/fmtlib/fmt/issues/968>`_,\n  `#974 <https://github.com/fmtlib/fmt/pull/974>`_)\n\n  .. code:: c++\n\n     #include <fmt/color.h>\n\n     int main() {\n       print(fg(fmt::terminal_color::red), \"stop\\n\");\n     }\n\n  Note that these colors vary by terminal:\n\n  .. image:: https://user-images.githubusercontent.com/576385/\n             50405925-dbfc7e00-0770-11e9-9b85-333fab0af9ac.png\n\n  Thanks `@Rakete1111 (Nicolas) <https://github.com/Rakete1111>`_.\n\n* Parameterized formatting functions on the type of the format string\n  (`#880 <https://github.com/fmtlib/fmt/issues/880>`_,\n  `#881 <https://github.com/fmtlib/fmt/pull/881>`_,\n  `#883 <https://github.com/fmtlib/fmt/pull/883>`_,\n  `#885 <https://github.com/fmtlib/fmt/pull/885>`_,\n  `#897 <https://github.com/fmtlib/fmt/pull/897>`_,\n  `#920 <https://github.com/fmtlib/fmt/issues/920>`_).\n  Any object of type ``S`` that has an overloaded ``to_string_view(const S&)``\n  returning ``fmt::string_view`` can be used as a format string:\n\n  .. code:: c++\n\n     namespace my_ns {\n     inline string_view to_string_view(const my_string& s) {\n       return {s.data(), s.length()};\n     }\n     }\n\n     std::string message = fmt::format(my_string(\"The answer is {}.\"), 42);\n\n  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.\n\n* Made ``std::string_view`` work as a format string\n  (`#898 <https://github.com/fmtlib/fmt/pull/898>`_):\n\n  .. code:: c++\n\n     auto message = fmt::format(std::string_view(\"The answer is {}.\"), 42);\n\n  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.\n\n* Added wide string support to compile-time format string checks\n  (`#924 <https://github.com/fmtlib/fmt/pull/924>`_):\n\n  .. code:: c++\n\n     print(fmt(L\"{:f}\"), 42); // compile-time error: invalid type specifier\n\n  Thanks `@XZiar <https://github.com/XZiar>`_.\n\n* Made colored print functions work with wide strings\n  (`#867 <https://github.com/fmtlib/fmt/pull/867>`_):\n\n  .. code:: c++\n\n     #include <fmt/color.h>\n\n     int main() {\n       print(fg(fmt::color::red), L\"{}\\n\", 42);\n     }\n\n  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.\n\n* Introduced experimental Unicode support\n  (`#628 <https://github.com/fmtlib/fmt/issues/628>`_,\n  `#891 <https://github.com/fmtlib/fmt/pull/891>`_):\n\n  .. code:: c++\n\n     using namespace fmt::literals;\n     auto s = fmt::format(\"{:*^5}\"_u, \"🤡\"_u); // s == \"**🤡**\"_u\n\n* Improved locale support:\n\n  .. code:: c++\n\n     #include <fmt/locale.h>\n\n     struct numpunct : std::numpunct<char> {\n      protected:\n       char do_thousands_sep() const override { return '~'; }\n     };\n\n     std::locale loc;\n     auto s = fmt::format(std::locale(loc, new numpunct()), \"{:n}\", 1234567);\n     // s == \"1~234~567\"\n\n* Constrained formatting functions on proper iterator types\n  (`#921 <https://github.com/fmtlib/fmt/pull/921>`_).\n  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.\n\n* Added ``make_printf_args`` and ``make_wprintf_args`` functions\n  (`#934 <https://github.com/fmtlib/fmt/pull/934>`_).\n  Thanks `@tnovotny <https://github.com/tnovotny>`_.\n\n* Deprecated ``fmt::visit``, ``parse_context``, and ``wparse_context``.\n  Use ``fmt::visit_format_arg``, ``format_parse_context``, and\n  ``wformat_parse_context`` instead.\n\n* Removed undocumented ``basic_fixed_buffer`` which has been superseded by the\n  iterator-based API\n  (`#873 <https://github.com/fmtlib/fmt/issues/873>`_,\n  `#902 <https://github.com/fmtlib/fmt/pull/902>`_).\n  Thanks `@superfunc (hollywood programmer) <https://github.com/superfunc>`_.\n\n* Disallowed repeated leading zeros in an argument ID:\n\n  .. code:: c++\n\n     fmt::print(\"{000}\", 42); // error\n\n* Reintroduced support for gcc 4.4.\n\n* Fixed compilation on platforms with exotic ``double``\n  (`#878 <https://github.com/fmtlib/fmt/issues/878>`_).\n\n* Improved documentation\n  (`#164 <https://github.com/fmtlib/fmt/issues/164>`_,\n  `#877 <https://github.com/fmtlib/fmt/issues/877>`_,\n  `#901 <https://github.com/fmtlib/fmt/pull/901>`_,\n  `#906 <https://github.com/fmtlib/fmt/pull/906>`_,\n  `#979 <https://github.com/fmtlib/fmt/pull/979>`_).\n  Thanks `@kookjr (Mathew Cucuzella) <https://github.com/kookjr>`_,\n  `@DarkDimius (Dmitry Petrashko) <https://github.com/DarkDimius>`_,\n  `@HecticSerenity <https://github.com/HecticSerenity>`_.\n\n* Added pkgconfig support which makes it easier to consume the library from\n  meson and other build systems\n  (`#916 <https://github.com/fmtlib/fmt/pull/916>`_).\n  Thanks `@colemickens (Cole Mickens) <https://github.com/colemickens>`_.\n\n* Various build improvements\n  (`#909 <https://github.com/fmtlib/fmt/pull/909>`_,\n  `#926 <https://github.com/fmtlib/fmt/pull/926>`_,\n  `#937 <https://github.com/fmtlib/fmt/pull/937>`_,\n  `#953 <https://github.com/fmtlib/fmt/pull/953>`_,\n  `#959 <https://github.com/fmtlib/fmt/pull/959>`_).\n  Thanks `@tchaikov (Kefu Chai) <https://github.com/tchaikov>`_,\n  `@luncliff (Park DongHa) <https://github.com/luncliff>`_,\n  `@AndreasSchoenle (Andreas Schönle) <https://github.com/AndreasSchoenle>`_,\n  `@hotwatermorning <https://github.com/hotwatermorning>`_,\n  `@Zefz (JohanJansen) <https://github.com/Zefz>`_.\n\n* Improved ``string_view`` construction performance\n  (`#914 <https://github.com/fmtlib/fmt/pull/914>`_).\n  Thanks `@gabime (Gabi Melman) <https://github.com/gabime>`_.\n\n* Fixed non-matching char types\n  (`#895 <https://github.com/fmtlib/fmt/pull/895>`_).\n  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.\n\n* Fixed ``format_to_n`` with ``std::back_insert_iterator``\n  (`#913 <https://github.com/fmtlib/fmt/pull/913>`_).\n  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.\n\n* Fixed locale-dependent formatting\n  (`#905 <https://github.com/fmtlib/fmt/issues/905>`_).\n\n* Fixed various compiler warnings and errors\n  (`#882 <https://github.com/fmtlib/fmt/pull/882>`_,\n  `#886 <https://github.com/fmtlib/fmt/pull/886>`_,\n  `#933 <https://github.com/fmtlib/fmt/pull/933>`_,\n  `#941 <https://github.com/fmtlib/fmt/pull/941>`_,\n  `#931 <https://github.com/fmtlib/fmt/issues/931>`_,\n  `#943 <https://github.com/fmtlib/fmt/pull/943>`_,\n  `#954 <https://github.com/fmtlib/fmt/pull/954>`_,\n  `#956 <https://github.com/fmtlib/fmt/pull/956>`_,\n  `#962 <https://github.com/fmtlib/fmt/pull/962>`_,\n  `#965 <https://github.com/fmtlib/fmt/issues/965>`_,\n  `#977 <https://github.com/fmtlib/fmt/issues/977>`_,\n  `#983 <https://github.com/fmtlib/fmt/pull/983>`_,\n  `#989 <https://github.com/fmtlib/fmt/pull/989>`_).\n  Thanks `@Luthaf (Guillaume Fraux) <https://github.com/Luthaf>`_,\n  `@stevenhoving (Steven Hoving) <https://github.com/stevenhoving>`_,\n  `@christinaa (Kristina Brooks) <https://github.com/christinaa>`_,\n  `@lgritz (Larry Gritz) <https://github.com/lgritz>`_,\n  `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_,\n  `@0x8000-0000 (Sign Bit) <https://github.com/0x8000-0000>`_,\n  `@liuping1997 <https://github.com/liuping1997>`_.\n\n5.2.1 - 2018-09-21\n------------------\n\n* Fixed ``visit`` lookup issues on gcc 7 & 8\n  (`#870 <https://github.com/fmtlib/fmt/pull/870>`_).\n  Thanks `@medithe <https://github.com/medithe>`_.\n\n* Fixed linkage errors on older gcc.\n\n* Prevented ``fmt/range.h`` from specializing ``fmt::basic_string_view``\n  (`#865 <https://github.com/fmtlib/fmt/issues/865>`_,\n  `#868 <https://github.com/fmtlib/fmt/pull/868>`_).\n  Thanks `@hhggit (dual) <https://github.com/hhggit>`_.\n\n* Improved error message when formatting unknown types\n  (`#872 <https://github.com/fmtlib/fmt/pull/872>`_).\n  Thanks `@foonathan (Jonathan Müller) <https://github.com/foonathan>`_,\n\n* Disabled templated user-defined literals when compiled under nvcc\n  (`#875 <https://github.com/fmtlib/fmt/pull/875>`_).\n  Thanks `@CandyGumdrop (Candy Gumdrop) <https://github.com/CandyGumdrop>`_,\n\n* Fixed ``format_to`` formatting to ``wmemory_buffer``\n  (`#874 <https://github.com/fmtlib/fmt/issues/874>`_).\n\n5.2.0 - 2018-09-13\n------------------\n\n* Optimized format string parsing and argument processing which resulted in up\n  to 5x speed up on long format strings and significant performance boost on\n  various benchmarks. For example, version 5.2 is 2.22x faster than 5.1 on\n  decimal integer formatting with ``format_to`` (macOS, clang-902.0.39.2):\n\n  ==================  =======  =======\n  Method              Time, s  Speedup\n  ==================  =======  =======\n  fmt::format 5.1      0.58\n  fmt::format 5.2      0.35     1.66x\n  fmt::format_to 5.1   0.51\n  fmt::format_to 5.2   0.23     2.22x\n  sprintf              0.71\n  std::to_string       1.01\n  std::stringstream    1.73\n  ==================  =======  =======\n\n* Changed the ``fmt`` macro from opt-out to opt-in to prevent name collisions.\n  To enable it define the ``FMT_STRING_ALIAS`` macro to 1 before including\n  ``fmt/format.h``:\n\n  .. code:: c++\n\n     #define FMT_STRING_ALIAS 1\n     #include <fmt/format.h>\n     std::string answer = format(fmt(\"{}\"), 42);\n\n* Added compile-time format string checks to ``format_to`` overload that takes\n  ``fmt::memory_buffer`` (`#783 <https://github.com/fmtlib/fmt/issues/783>`_):\n\n  .. code:: c++\n\n     fmt::memory_buffer buf;\n     // Compile-time error: invalid type specifier.\n     fmt::format_to(buf, fmt(\"{:d}\"), \"foo\");\n\n* Moved experimental color support to ``fmt/color.h`` and enabled the\n  new API by default. The old API can be enabled by defining the\n  ``FMT_DEPRECATED_COLORS`` macro.\n\n* Added formatting support for types explicitly convertible to\n  ``fmt::string_view``:\n\n  .. code:: c++\n\n     struct foo {\n       explicit operator fmt::string_view() const { return \"foo\"; }\n     };\n     auto s = format(\"{}\", foo());\n\n  In particular, this makes formatting function work with\n  ``folly::StringPiece``.\n\n* Implemented preliminary support for ``char*_t`` by replacing the ``format``\n  function overloads with a single function template parameterized on the string\n  type.\n\n* Added support for dynamic argument lists\n  (`#814 <https://github.com/fmtlib/fmt/issues/814>`_,\n  `#819 <https://github.com/fmtlib/fmt/pull/819>`_).\n  Thanks `@MikePopoloski (Michael Popoloski)\n  <https://github.com/MikePopoloski>`_.\n\n* Reduced executable size overhead for embedded targets using newlib nano by\n  making locale dependency optional\n  (`#839 <https://github.com/fmtlib/fmt/pull/839>`_).\n  Thanks `@teajay-fr (Thomas Benard) <https://github.com/teajay-fr>`_.\n\n* Keep ``noexcept`` specifier when exceptions are disabled\n  (`#801 <https://github.com/fmtlib/fmt/issues/801>`_,\n  `#810 <https://github.com/fmtlib/fmt/pull/810>`_).\n  Thanks `@qis (Alexej Harm) <https://github.com/qis>`_.\n\n* Fixed formatting of user-defined types providing ``operator<<`` with\n  ``format_to_n``\n  (`#806 <https://github.com/fmtlib/fmt/pull/806>`_).\n  Thanks `@mkurdej (Marek Kurdej) <https://github.com/mkurdej>`_.\n\n* Fixed dynamic linkage of new symbols\n  (`#808 <https://github.com/fmtlib/fmt/issues/808>`_).\n\n* Fixed global initialization issue\n  (`#807 <https://github.com/fmtlib/fmt/issues/807>`_):\n\n  .. code:: c++\n\n     // This works on compilers with constexpr support.\n     static const std::string answer = fmt::format(\"{}\", 42);\n\n* Fixed various compiler warnings and errors\n  (`#804 <https://github.com/fmtlib/fmt/pull/804>`_,\n  `#809 <https://github.com/fmtlib/fmt/issues/809>`_,\n  `#811 <https://github.com/fmtlib/fmt/pull/811>`_,\n  `#822 <https://github.com/fmtlib/fmt/issues/822>`_,\n  `#827 <https://github.com/fmtlib/fmt/pull/827>`_,\n  `#830 <https://github.com/fmtlib/fmt/issues/830>`_,\n  `#838 <https://github.com/fmtlib/fmt/pull/838>`_,\n  `#843 <https://github.com/fmtlib/fmt/issues/843>`_,\n  `#844 <https://github.com/fmtlib/fmt/pull/844>`_,\n  `#851 <https://github.com/fmtlib/fmt/issues/851>`_,\n  `#852 <https://github.com/fmtlib/fmt/pull/852>`_,\n  `#854 <https://github.com/fmtlib/fmt/pull/854>`_).\n  Thanks `@henryiii (Henry Schreiner) <https://github.com/henryiii>`_,\n  `@medithe <https://github.com/medithe>`_, and\n  `@eliasdaler (Elias Daler) <https://github.com/eliasdaler>`_.\n\n5.1.0 - 2018-07-05\n------------------\n\n* Added experimental support for RGB color output enabled with\n  the ``FMT_EXTENDED_COLORS`` macro:\n\n  .. code:: c++\n\n     #define FMT_EXTENDED_COLORS\n     #define FMT_HEADER_ONLY // or compile fmt with FMT_EXTENDED_COLORS defined\n     #include <fmt/format.h>\n\n     fmt::print(fmt::color::steel_blue, \"Some beautiful text\");\n\n  The old API (the ``print_colored`` and ``vprint_colored`` functions and the\n  ``color`` enum) is now deprecated.\n  (`#762 <https://github.com/fmtlib/fmt/issues/762>`_\n  `#767 <https://github.com/fmtlib/fmt/pull/767>`_).\n  thanks `@Remotion (Remo) <https://github.com/Remotion>`_.\n\n* Added quotes to strings in ranges and tuples\n  (`#766 <https://github.com/fmtlib/fmt/pull/766>`_).\n  Thanks `@Remotion (Remo) <https://github.com/Remotion>`_.\n\n* Made ``format_to`` work with ``basic_memory_buffer``\n  (`#776 <https://github.com/fmtlib/fmt/issues/776>`_).\n\n* Added ``vformat_to_n`` and ``wchar_t`` overload of ``format_to_n``\n  (`#764 <https://github.com/fmtlib/fmt/issues/764>`_,\n  `#769 <https://github.com/fmtlib/fmt/issues/769>`_).\n\n* Made ``is_range`` and ``is_tuple_like`` part of public (experimental) API\n  to allow specialization for user-defined types\n  (`#751 <https://github.com/fmtlib/fmt/issues/751>`_,\n  `#759 <https://github.com/fmtlib/fmt/pull/759>`_).\n  Thanks `@drrlvn (Dror Levin) <https://github.com/drrlvn>`_.\n\n* Added more compilers to continuous integration and increased ``FMT_PEDANTIC``\n  warning levels\n  (`#736 <https://github.com/fmtlib/fmt/pull/736>`_).\n  Thanks `@eliaskosunen (Elias Kosunen) <https://github.com/eliaskosunen>`_.\n\n* Fixed compilation with MSVC 2013.\n\n* Fixed handling of user-defined types in ``format_to``\n  (`#793 <https://github.com/fmtlib/fmt/issues/793>`_).\n\n* Forced linking of inline ``vformat`` functions into the library\n  (`#795 <https://github.com/fmtlib/fmt/issues/795>`_).\n\n* Fixed incorrect call to on_align in ``'{:}='``\n  (`#750 <https://github.com/fmtlib/fmt/issues/750>`_).\n\n* Fixed floating-point formatting to a non-back_insert_iterator with sign &\n  numeric alignment specified\n  (`#756 <https://github.com/fmtlib/fmt/issues/756>`_).\n\n* Fixed formatting to an array with ``format_to_n``\n  (`#778 <https://github.com/fmtlib/fmt/issues/778>`_).\n\n* Fixed formatting of more than 15 named arguments\n  (`#754 <https://github.com/fmtlib/fmt/issues/754>`_).\n\n* Fixed handling of compile-time strings when including ``fmt/ostream.h``.\n  (`#768 <https://github.com/fmtlib/fmt/issues/768>`_).\n\n* Fixed various compiler warnings and errors\n  (`#742 <https://github.com/fmtlib/fmt/issues/742>`_,\n  `#748 <https://github.com/fmtlib/fmt/issues/748>`_,\n  `#752 <https://github.com/fmtlib/fmt/issues/752>`_,\n  `#770 <https://github.com/fmtlib/fmt/issues/770>`_,\n  `#775 <https://github.com/fmtlib/fmt/pull/775>`_,\n  `#779 <https://github.com/fmtlib/fmt/issues/779>`_,\n  `#780 <https://github.com/fmtlib/fmt/pull/780>`_,\n  `#790 <https://github.com/fmtlib/fmt/pull/790>`_,\n  `#792 <https://github.com/fmtlib/fmt/pull/792>`_,\n  `#800 <https://github.com/fmtlib/fmt/pull/800>`_).\n  Thanks `@Remotion (Remo) <https://github.com/Remotion>`_,\n  `@gabime (Gabi Melman) <https://github.com/gabime>`_,\n  `@foonathan (Jonathan Müller) <https://github.com/foonathan>`_,\n  `@Dark-Passenger (Dhruv Paranjape) <https://github.com/Dark-Passenger>`_, and\n  `@0x8000-0000 (Sign Bit) <https://github.com/0x8000-0000>`_.\n\n5.0.0 - 2018-05-21\n------------------\n\n* Added a requirement for partial C++11 support, most importantly variadic\n  templates and type traits, and dropped ``FMT_VARIADIC_*`` emulation macros.\n  Variadic templates are available since GCC 4.4, Clang 2.9 and MSVC 18.0 (2013).\n  For older compilers use {fmt} `version 4.x\n  <https://github.com/fmtlib/fmt/releases/tag/4.1.0>`_ which continues to be\n  maintained and works with C++98 compilers.\n\n* Renamed symbols to follow standard C++ naming conventions and proposed a subset\n  of the library for standardization in `P0645R2 Text Formatting\n  <https://wg21.link/P0645>`_.\n\n* Implemented ``constexpr`` parsing of format strings and `compile-time format\n  string checks\n  <https://fmt.dev/latest/api.html#compile-time-format-string-checks>`_. For\n  example\n\n  .. code:: c++\n\n     #include <fmt/format.h>\n\n     std::string s = format(fmt(\"{:d}\"), \"foo\");\n\n  gives a compile-time error because ``d`` is an invalid specifier for strings\n  (`godbolt <https://godbolt.org/g/rnCy9Q>`__)::\n\n     ...\n     <source>:4:19: note: in instantiation of function template specialization 'fmt::v5::format<S, char [4]>' requested here\n       std::string s = format(fmt(\"{:d}\"), \"foo\");\n                       ^\n     format.h:1337:13: note: non-constexpr function 'on_error' cannot be used in a constant expression\n         handler.on_error(\"invalid type specifier\");\n\n  Compile-time checks require relaxed ``constexpr`` (C++14 feature) support. If\n  the latter is not available, checks will be performed at runtime.\n\n* Separated format string parsing and formatting in the extension API to enable\n  compile-time format string processing. For example\n\n  .. code:: c++\n\n     struct Answer {};\n\n     namespace fmt {\n     template <>\n     struct formatter<Answer> {\n       constexpr auto parse(parse_context& ctx) {\n         auto it = ctx.begin();\n         spec = *it;\n         if (spec != 'd' && spec != 's')\n           throw format_error(\"invalid specifier\");\n         return ++it;\n       }\n\n       template <typename FormatContext>\n       auto format(Answer, FormatContext& ctx) {\n         return spec == 's' ?\n           format_to(ctx.begin(), \"{}\", \"fourty-two\") :\n           format_to(ctx.begin(), \"{}\", 42);\n       }\n\n       char spec = 0;\n     };\n     }\n\n     std::string s = format(fmt(\"{:x}\"), Answer());\n\n  gives a compile-time error due to invalid format specifier (`godbolt\n  <https://godbolt.org/g/2jQ1Dv>`__)::\n\n     ...\n     <source>:12:45: error: expression '<throw-expression>' is not a constant expression\n            throw format_error(\"invalid specifier\");\n\n* Added `iterator support\n  <https://fmt.dev/latest/api.html#output-iterator-support>`_:\n\n  .. code:: c++\n\n     #include <vector>\n     #include <fmt/format.h>\n\n     std::vector<char> out;\n     fmt::format_to(std::back_inserter(out), \"{}\", 42);\n\n* Added the `format_to_n\n  <https://fmt.dev/latest/api.html#_CPPv2N3fmt11format_to_nE8OutputItNSt6size_tE11string_viewDpRK4Args>`_\n  function that restricts the output to the specified number of characters\n  (`#298 <https://github.com/fmtlib/fmt/issues/298>`_):\n\n  .. code:: c++\n\n     char out[4];\n     fmt::format_to_n(out, sizeof(out), \"{}\", 12345);\n     // out == \"1234\" (without terminating '\\0')\n\n* Added the `formatted_size\n  <https://fmt.dev/latest/api.html#_CPPv2N3fmt14formatted_sizeE11string_viewDpRK4Args>`_\n  function for computing the output size:\n\n  .. code:: c++\n\n     #include <fmt/format.h>\n\n     auto size = fmt::formatted_size(\"{}\", 12345); // size == 5\n\n* Improved compile times by reducing dependencies on standard headers and\n  providing a lightweight `core API <https://fmt.dev/latest/api.html#core-api>`_:\n\n  .. code:: c++\n\n     #include <fmt/core.h>\n\n     fmt::print(\"The answer is {}.\", 42);\n\n  See `Compile time and code bloat\n  <https://github.com/fmtlib/fmt#compile-time-and-code-bloat>`_.\n\n* Added the `make_format_args\n  <https://fmt.dev/latest/api.html#_CPPv2N3fmt16make_format_argsEDpRK4Args>`_\n  function for capturing formatting arguments:\n\n  .. code:: c++\n  \n     // Prints formatted error message.\n     void vreport_error(const char *format, fmt::format_args args) {\n       fmt::print(\"Error: \");\n       fmt::vprint(format, args);\n     }\n     template <typename... Args>\n     void report_error(const char *format, const Args & ... args) {\n       vreport_error(format, fmt::make_format_args(args...));\n     }\n\n* Added the ``make_printf_args`` function for capturing ``printf`` arguments\n  (`#687 <https://github.com/fmtlib/fmt/issues/687>`_,\n  `#694 <https://github.com/fmtlib/fmt/pull/694>`_).\n  Thanks `@Kronuz (Germán Méndez Bravo) <https://github.com/Kronuz>`_.\n\n* Added prefix ``v`` to non-variadic functions taking ``format_args`` to\n  distinguish them from variadic ones:\n\n  .. code:: c++\n\n     std::string vformat(string_view format_str, format_args args);\n     \n     template <typename... Args>\n     std::string format(string_view format_str, const Args & ... args);\n\n* Added experimental support for formatting ranges, containers and tuple-like\n  types in ``fmt/ranges.h`` (`#735 <https://github.com/fmtlib/fmt/pull/735>`_):\n\n  .. code:: c++\n\n     #include <fmt/ranges.h>\n\n     std::vector<int> v = {1, 2, 3};\n     fmt::print(\"{}\", v); // prints {1, 2, 3}\n\n  Thanks `@Remotion (Remo) <https://github.com/Remotion>`_.\n\n* Implemented ``wchar_t`` date and time formatting\n  (`#712 <https://github.com/fmtlib/fmt/pull/712>`_):\n\n  .. code:: c++\n\n     #include <fmt/time.h>\n\n     std::time_t t = std::time(nullptr);\n     auto s = fmt::format(L\"The date is {:%Y-%m-%d}.\", *std::localtime(&t));\n\n  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.\n\n* Provided more wide string overloads\n  (`#724 <https://github.com/fmtlib/fmt/pull/724>`_).\n  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.\n\n* Switched from a custom null-terminated string view class to ``string_view``\n  in the format API and provided ``fmt::string_view`` which implements a subset\n  of ``std::string_view`` API for pre-C++17 systems.\n\n* Added support for ``std::experimental::string_view``\n  (`#607 <https://github.com/fmtlib/fmt/pull/607>`_):\n\n  .. code:: c++\n\n     #include <fmt/core.h>\n     #include <experimental/string_view>\n\n     fmt::print(\"{}\", std::experimental::string_view(\"foo\"));\n\n  Thanks `@virgiliofornazin (Virgilio Alexandre Fornazin)\n  <https://github.com/virgiliofornazin>`__.\n\n* Allowed mixing named and automatic arguments:\n\n  .. code:: c++\n\n     fmt::format(\"{} {two}\", 1, fmt::arg(\"two\", 2));\n\n* Removed the write API in favor of the `format API\n  <https://fmt.dev/latest/api.html#format-api>`_ with compile-time handling of\n  format strings.\n\n* Disallowed formatting of multibyte strings into a wide character target\n  (`#606 <https://github.com/fmtlib/fmt/pull/606>`_).\n\n* Improved documentation\n  (`#515 <https://github.com/fmtlib/fmt/pull/515>`_,\n  `#614 <https://github.com/fmtlib/fmt/issues/614>`_,\n  `#617 <https://github.com/fmtlib/fmt/pull/617>`_,\n  `#661 <https://github.com/fmtlib/fmt/pull/661>`_,\n  `#680 <https://github.com/fmtlib/fmt/pull/680>`_).\n  Thanks `@ibell (Ian Bell) <https://github.com/ibell>`_,\n  `@mihaitodor (Mihai Todor) <https://github.com/mihaitodor>`_, and\n  `@johnthagen <https://github.com/johnthagen>`_.\n\n* Implemented more efficient handling of large number of format arguments.\n\n* Introduced an inline namespace for symbol versioning.\n\n* Added debug postfix ``d`` to the ``fmt`` library name\n  (`#636 <https://github.com/fmtlib/fmt/issues/636>`_).\n\n* Removed unnecessary ``fmt/`` prefix in includes\n  (`#397 <https://github.com/fmtlib/fmt/pull/397>`_).\n  Thanks `@chronoxor (Ivan Shynkarenka) <https://github.com/chronoxor>`_.\n\n* Moved ``fmt/*.h`` to ``include/fmt/*.h`` to prevent irrelevant files and\n  directories appearing on the include search paths when fmt is used as a\n  subproject and moved source files to the ``src`` directory.\n\n* Added qmake project file ``support/fmt.pro``\n  (`#641 <https://github.com/fmtlib/fmt/pull/641>`_).\n  Thanks `@cowo78 (Giuseppe Corbelli) <https://github.com/cowo78>`_.\n\n* Added Gradle build file ``support/build.gradle``\n  (`#649 <https://github.com/fmtlib/fmt/pull/649>`_).\n  Thanks `@luncliff (Park DongHa) <https://github.com/luncliff>`_.\n\n* Removed ``FMT_CPPFORMAT`` CMake option.\n\n* Fixed a name conflict with the macro ``CHAR_WIDTH`` in glibc\n  (`#616 <https://github.com/fmtlib/fmt/pull/616>`_).\n  Thanks `@aroig (Abdó Roig-Maranges) <https://github.com/aroig>`_.\n\n* Fixed handling of nested braces in ``fmt::join``\n  (`#638 <https://github.com/fmtlib/fmt/issues/638>`_).\n\n* Added ``SOURCELINK_SUFFIX`` for compatibility with Sphinx 1.5\n  (`#497 <https://github.com/fmtlib/fmt/pull/497>`_).\n  Thanks `@ginggs (Graham Inggs) <https://github.com/ginggs>`_.\n\n* Added a missing ``inline`` in the header-only mode\n  (`#626 <https://github.com/fmtlib/fmt/pull/626>`_).\n  Thanks `@aroig (Abdó Roig-Maranges) <https://github.com/aroig>`_.\n\n* Fixed various compiler warnings\n  (`#640 <https://github.com/fmtlib/fmt/pull/640>`_,\n  `#656 <https://github.com/fmtlib/fmt/pull/656>`_,\n  `#679 <https://github.com/fmtlib/fmt/pull/679>`_,\n  `#681 <https://github.com/fmtlib/fmt/pull/681>`_,\n  `#705 <https://github.com/fmtlib/fmt/pull/705>`__,\n  `#715 <https://github.com/fmtlib/fmt/issues/715>`_,\n  `#717 <https://github.com/fmtlib/fmt/pull/717>`_,\n  `#720 <https://github.com/fmtlib/fmt/pull/720>`_,\n  `#723 <https://github.com/fmtlib/fmt/pull/723>`_,\n  `#726 <https://github.com/fmtlib/fmt/pull/726>`_,\n  `#730 <https://github.com/fmtlib/fmt/pull/730>`_,\n  `#739 <https://github.com/fmtlib/fmt/pull/739>`_).\n  Thanks `@peterbell10 <https://github.com/peterbell10>`_,\n  `@LarsGullik <https://github.com/LarsGullik>`_,\n  `@foonathan (Jonathan Müller) <https://github.com/foonathan>`_,\n  `@eliaskosunen (Elias Kosunen) <https://github.com/eliaskosunen>`_,\n  `@christianparpart (Christian Parpart) <https://github.com/christianparpart>`_,\n  `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_,\n  and `@mwinterb <https://github.com/mwinterb>`_.\n\n* Worked around an MSVC bug and fixed several warnings\n  (`#653 <https://github.com/fmtlib/fmt/pull/653>`_).\n  Thanks `@alabuzhev (Alex Alabuzhev) <https://github.com/alabuzhev>`_.\n\n* Worked around GCC bug 67371\n  (`#682 <https://github.com/fmtlib/fmt/issues/682>`_).\n\n* Fixed compilation with ``-fno-exceptions``\n  (`#655 <https://github.com/fmtlib/fmt/pull/655>`_).\n  Thanks `@chenxiaolong (Andrew Gunnerson) <https://github.com/chenxiaolong>`_.\n\n* Made ``constexpr remove_prefix`` gcc version check tighter\n  (`#648 <https://github.com/fmtlib/fmt/issues/648>`_).\n\n* Renamed internal type enum constants to prevent collision with poorly written\n  C libraries (`#644 <https://github.com/fmtlib/fmt/issues/644>`_).\n\n* Added detection of ``wostream operator<<``\n  (`#650 <https://github.com/fmtlib/fmt/issues/650>`_).\n\n* Fixed compilation on OpenBSD\n  (`#660 <https://github.com/fmtlib/fmt/pull/660>`_).\n  Thanks `@hubslave <https://github.com/hubslave>`_.\n\n* Fixed compilation on FreeBSD 12\n  (`#732 <https://github.com/fmtlib/fmt/pull/732>`_).\n  Thanks `@dankm <https://github.com/dankm>`_.\n\n* Fixed compilation when there is a mismatch between ``-std`` options between\n  the library and user code\n  (`#664 <https://github.com/fmtlib/fmt/issues/664>`_).\n\n* Fixed compilation with GCC 7 and ``-std=c++11``\n  (`#734 <https://github.com/fmtlib/fmt/issues/734>`_).\n\n* Improved generated binary code on GCC 7 and older\n  (`#668 <https://github.com/fmtlib/fmt/issues/668>`_).\n\n* Fixed handling of numeric alignment with no width \n  (`#675 <https://github.com/fmtlib/fmt/issues/675>`_).\n\n* Fixed handling of empty strings in UTF8/16 converters\n  (`#676 <https://github.com/fmtlib/fmt/pull/676>`_).\n  Thanks `@vgalka-sl (Vasili Galka) <https://github.com/vgalka-sl>`_.\n\n* Fixed formatting of an empty ``string_view``\n  (`#689 <https://github.com/fmtlib/fmt/issues/689>`_).\n\n* Fixed detection of ``string_view`` on libc++ \n  (`#686 <https://github.com/fmtlib/fmt/issues/686>`_).\n\n* Fixed DLL issues (`#696 <https://github.com/fmtlib/fmt/pull/696>`_).\n  Thanks `@sebkoenig <https://github.com/sebkoenig>`_.\n\n* Fixed compile checks for mixing narrow and wide strings\n  (`#690 <https://github.com/fmtlib/fmt/issues/690>`_).\n\n* Disabled unsafe implicit conversion to ``std::string``\n  (`#729 <https://github.com/fmtlib/fmt/issues/729>`_).\n\n* Fixed handling of reused format specs (as in ``fmt::join``) for pointers\n  (`#725 <https://github.com/fmtlib/fmt/pull/725>`_).\n  Thanks `@mwinterb <https://github.com/mwinterb>`_.\n\n* Fixed installation of ``fmt/ranges.h``\n  (`#738 <https://github.com/fmtlib/fmt/pull/738>`_).\n  Thanks `@sv1990 <https://github.com/sv1990>`_.\n\n4.1.0 - 2017-12-20\n------------------\n\n* Added ``fmt::to_wstring()`` in addition to ``fmt::to_string()``\n  (`#559 <https://github.com/fmtlib/fmt/pull/559>`_).\n  Thanks `@alabuzhev (Alex Alabuzhev) <https://github.com/alabuzhev>`_.\n\n* Added support for C++17 ``std::string_view``\n  (`#571 <https://github.com/fmtlib/fmt/pull/571>`_ and\n  `#578 <https://github.com/fmtlib/fmt/pull/578>`_).\n  Thanks `@thelostt (Mário Feroldi) <https://github.com/thelostt>`_ and\n  `@mwinterb <https://github.com/mwinterb>`_.\n\n* Enabled stream exceptions to catch errors\n  (`#581 <https://github.com/fmtlib/fmt/issues/581>`_).\n  Thanks `@crusader-mike <https://github.com/crusader-mike>`_.\n\n* Allowed formatting of class hierarchies with ``fmt::format_arg()``\n  (`#547 <https://github.com/fmtlib/fmt/pull/547>`_).\n  Thanks `@rollbear (Björn Fahller) <https://github.com/rollbear>`_.\n\n* Removed limitations on character types\n  (`#563 <https://github.com/fmtlib/fmt/pull/563>`_).\n  Thanks `@Yelnats321 (Elnar Dakeshov) <https://github.com/Yelnats321>`_.\n\n* Conditionally enabled use of ``std::allocator_traits``\n  (`#583 <https://github.com/fmtlib/fmt/pull/583>`_).\n  Thanks `@mwinterb <https://github.com/mwinterb>`_.\n\n* Added support for ``const`` variadic member function emulation with\n  ``FMT_VARIADIC_CONST`` (`#591 <https://github.com/fmtlib/fmt/pull/591>`_).\n  Thanks `@ludekvodicka (Ludek Vodicka) <https://github.com/ludekvodicka>`_.\n\n* Various bugfixes: bad overflow check, unsupported implicit type conversion\n  when determining formatting function, test segfaults\n  (`#551 <https://github.com/fmtlib/fmt/issues/551>`_), ill-formed macros\n  (`#542 <https://github.com/fmtlib/fmt/pull/542>`_) and ambiguous overloads\n  (`#580 <https://github.com/fmtlib/fmt/issues/580>`_).\n  Thanks `@xylosper (Byoung-young Lee) <https://github.com/xylosper>`_.\n\n* Prevented warnings on MSVC (`#605 <https://github.com/fmtlib/fmt/pull/605>`_,\n  `#602 <https://github.com/fmtlib/fmt/pull/602>`_, and\n  `#545 <https://github.com/fmtlib/fmt/pull/545>`_),\n  clang (`#582 <https://github.com/fmtlib/fmt/pull/582>`_),\n  GCC (`#573 <https://github.com/fmtlib/fmt/issues/573>`_),\n  various conversion warnings (`#609 <https://github.com/fmtlib/fmt/pull/609>`_,\n  `#567 <https://github.com/fmtlib/fmt/pull/567>`_,\n  `#553 <https://github.com/fmtlib/fmt/pull/553>`_ and\n  `#553 <https://github.com/fmtlib/fmt/pull/553>`_), and added ``override`` and\n  ``[[noreturn]]`` (`#549 <https://github.com/fmtlib/fmt/pull/549>`_ and\n  `#555 <https://github.com/fmtlib/fmt/issues/555>`_).\n  Thanks `@alabuzhev (Alex Alabuzhev) <https://github.com/alabuzhev>`_,\n  `@virgiliofornazin (Virgilio Alexandre Fornazin)\n  <https://gihtub.com/virgiliofornazin>`_,\n  `@alexanderbock (Alexander Bock) <https://github.com/alexanderbock>`_,\n  `@yumetodo <https://github.com/yumetodo>`_,\n  `@VaderY (Császár Mátyás) <https://github.com/VaderY>`_,\n  `@jpcima (JP Cimalando) <https://github.com/jpcima>`_,\n  `@thelostt (Mário Feroldi) <https://github.com/thelostt>`_, and\n  `@Manu343726 (Manu Sánchez) <https://github.com/Manu343726>`_.\n\n* Improved CMake: Used ``GNUInstallDirs`` to set installation location\n  (`#610 <https://github.com/fmtlib/fmt/pull/610>`_) and fixed warnings\n  (`#536 <https://github.com/fmtlib/fmt/pull/536>`_ and\n  `#556 <https://github.com/fmtlib/fmt/pull/556>`_).\n  Thanks `@mikecrowe (Mike Crowe) <https://github.com/mikecrowe>`_,\n  `@evgen231 <https://github.com/evgen231>`_ and\n  `@henryiii (Henry Schreiner) <https://github.com/henryiii>`_.\n\n4.0.0 - 2017-06-27\n------------------\n\n* Removed old compatibility headers ``cppformat/*.h`` and CMake options\n  (`#527 <https://github.com/fmtlib/fmt/pull/527>`_).\n  Thanks `@maddinat0r (Alex Martin) <https://github.com/maddinat0r>`_.\n\n* Added ``string.h`` containing ``fmt::to_string()`` as alternative to\n  ``std::to_string()`` as well as other string writer functionality\n  (`#326 <https://github.com/fmtlib/fmt/issues/326>`_ and\n  `#441 <https://github.com/fmtlib/fmt/pull/441>`_):\n\n  .. code:: c++\n\n    #include \"fmt/string.h\"\n  \n    std::string answer = fmt::to_string(42);\n\n  Thanks to `@glebov-andrey (Andrey Glebov)\n  <https://github.com/glebov-andrey>`_.\n\n* Moved ``fmt::printf()`` to new ``printf.h`` header and allowed ``%s`` as\n  generic specifier (`#453 <https://github.com/fmtlib/fmt/pull/453>`_),\n  made ``%.f`` more conformant to regular ``printf()``\n  (`#490 <https://github.com/fmtlib/fmt/pull/490>`_), added custom writer\n  support (`#476 <https://github.com/fmtlib/fmt/issues/476>`_) and implemented\n  missing custom argument formatting\n  (`#339 <https://github.com/fmtlib/fmt/pull/339>`_ and\n  `#340 <https://github.com/fmtlib/fmt/pull/340>`_):\n\n  .. code:: c++\n\n    #include \"fmt/printf.h\"\n \n    // %s format specifier can be used with any argument type.\n    fmt::printf(\"%s\", 42);\n\n  Thanks `@mojoBrendan <https://github.com/mojoBrendan>`_,\n  `@manylegged (Arthur Danskin) <https://github.com/manylegged>`_ and\n  `@spacemoose (Glen Stark) <https://github.com/spacemoose>`_.\n  See also `#360 <https://github.com/fmtlib/fmt/issues/360>`_,\n  `#335 <https://github.com/fmtlib/fmt/issues/335>`_ and\n  `#331 <https://github.com/fmtlib/fmt/issues/331>`_.\n\n* Added ``container.h`` containing a ``BasicContainerWriter``\n  to write to containers like ``std::vector``\n  (`#450 <https://github.com/fmtlib/fmt/pull/450>`_).\n  Thanks `@polyvertex (Jean-Charles Lefebvre) <https://github.com/polyvertex>`_.\n\n* Added ``fmt::join()`` function that takes a range and formats\n  its elements separated by a given string\n  (`#466 <https://github.com/fmtlib/fmt/pull/466>`_):\n\n  .. code:: c++\n\n    #include \"fmt/format.h\"\n \n    std::vector<double> v = {1.2, 3.4, 5.6};\n    // Prints \"(+01.20, +03.40, +05.60)\".\n    fmt::print(\"({:+06.2f})\", fmt::join(v.begin(), v.end(), \", \"));\n\n  Thanks `@olivier80 <https://github.com/olivier80>`_.\n\n* Added support for custom formatting specifications to simplify customization\n  of built-in formatting (`#444 <https://github.com/fmtlib/fmt/pull/444>`_).\n  Thanks `@polyvertex (Jean-Charles Lefebvre) <https://github.com/polyvertex>`_.\n  See also `#439 <https://github.com/fmtlib/fmt/issues/439>`_.\n\n* Added ``fmt::format_system_error()`` for error code formatting\n  (`#323 <https://github.com/fmtlib/fmt/issues/323>`_ and\n  `#526 <https://github.com/fmtlib/fmt/pull/526>`_).\n  Thanks `@maddinat0r (Alex Martin) <https://github.com/maddinat0r>`_.\n\n* Added thread-safe ``fmt::localtime()`` and ``fmt::gmtime()``\n  as replacement   for the standard version to ``time.h``\n  (`#396 <https://github.com/fmtlib/fmt/pull/396>`_).\n  Thanks `@codicodi <https://github.com/codicodi>`_.\n\n* Internal improvements to ``NamedArg`` and ``ArgLists``\n  (`#389 <https://github.com/fmtlib/fmt/pull/389>`_ and\n  `#390 <https://github.com/fmtlib/fmt/pull/390>`_).\n  Thanks `@chronoxor <https://github.com/chronoxor>`_.\n\n* Fixed crash due to bug in ``FormatBuf``\n  (`#493 <https://github.com/fmtlib/fmt/pull/493>`_).\n  Thanks `@effzeh <https://github.com/effzeh>`_. See also\n  `#480 <https://github.com/fmtlib/fmt/issues/480>`_ and\n  `#491 <https://github.com/fmtlib/fmt/issues/491>`_.\n\n* Fixed handling of wide strings in ``fmt::StringWriter``.\n\n* Improved compiler error messages\n  (`#357 <https://github.com/fmtlib/fmt/issues/357>`_).\n\n* Fixed various warnings and issues with various compilers\n  (`#494 <https://github.com/fmtlib/fmt/pull/494>`_,\n  `#499 <https://github.com/fmtlib/fmt/pull/499>`_,\n  `#483 <https://github.com/fmtlib/fmt/pull/483>`_,\n  `#485 <https://github.com/fmtlib/fmt/pull/485>`_,\n  `#482 <https://github.com/fmtlib/fmt/pull/482>`_,\n  `#475 <https://github.com/fmtlib/fmt/pull/475>`_,\n  `#473 <https://github.com/fmtlib/fmt/pull/473>`_ and\n  `#414 <https://github.com/fmtlib/fmt/pull/414>`_).\n  Thanks `@chronoxor <https://github.com/chronoxor>`_,\n  `@zhaohuaxishi <https://github.com/zhaohuaxishi>`_,\n  `@pkestene (Pierre Kestener) <https://github.com/pkestene>`_,\n  `@dschmidt (Dominik Schmidt) <https://github.com/dschmidt>`_ and\n  `@0x414c (Alexey Gorishny) <https://github.com/0x414c>`_ .\n\n* Improved CMake: targets are now namespaced\n  (`#511 <https://github.com/fmtlib/fmt/pull/511>`_ and\n  `#513 <https://github.com/fmtlib/fmt/pull/513>`_), supported header-only\n  ``printf.h`` (`#354 <https://github.com/fmtlib/fmt/pull/354>`_), fixed issue\n  with minimal supported library subset\n  (`#418 <https://github.com/fmtlib/fmt/issues/418>`_,\n  `#419 <https://github.com/fmtlib/fmt/pull/419>`_ and\n  `#420 <https://github.com/fmtlib/fmt/pull/420>`_).\n  Thanks `@bjoernthiel (Bjoern Thiel) <https://github.com/bjoernthiel>`_,\n  `@niosHD (Mario Werner) <https://github.com/niosHD>`_,\n  `@LogicalKnight (Sean LK) <https://github.com/LogicalKnight>`_ and\n  `@alabuzhev (Alex Alabuzhev) <https://github.com/alabuzhev>`_.\n\n* Improved documentation. Thanks to\n  `@pwm1234 (Phil) <https://github.com/pwm1234>`_ for\n  `#393 <https://github.com/fmtlib/fmt/pull/393>`_.\n\n3.0.2 - 2017-06-14\n------------------\n\n* Added ``FMT_VERSION`` macro\n  (`#411 <https://github.com/fmtlib/fmt/issues/411>`_).\n\n* Used ``FMT_NULL`` instead of literal ``0``\n  (`#409 <https://github.com/fmtlib/fmt/pull/409>`_).\n  Thanks `@alabuzhev (Alex Alabuzhev) <https://github.com/alabuzhev>`_.\n\n* Added extern templates for ``format_float``\n  (`#413 <https://github.com/fmtlib/fmt/issues/413>`_).\n\n* Fixed implicit conversion issue\n  (`#507 <https://github.com/fmtlib/fmt/issues/507>`_).\n\n* Fixed signbit detection (`#423 <https://github.com/fmtlib/fmt/issues/423>`_).\n\n* Fixed naming collision (`#425 <https://github.com/fmtlib/fmt/issues/425>`_).\n\n* Fixed missing intrinsic for C++/CLI\n  (`#457 <https://github.com/fmtlib/fmt/pull/457>`_).\n  Thanks `@calumr (Calum Robinson) <https://github.com/calumr>`_\n\n* Fixed Android detection (`#458 <https://github.com/fmtlib/fmt/pull/458>`_).\n  Thanks `@Gachapen (Magnus Bjerke Vik) <https://github.com/Gachapen>`_.\n\n* Use lean ``windows.h`` if not in header-only mode\n  (`#503 <https://github.com/fmtlib/fmt/pull/503>`_).\n  Thanks `@Quentin01 (Quentin Buathier) <https://github.com/Quentin01>`_.\n\n* Fixed issue with CMake exporting C++11 flag\n  (`#445 <https://github.com/fmtlib/fmt/pull/455>`_).\n  Thanks `@EricWF (Eric) <https://github.com/EricWF>`_.\n\n* Fixed issue with nvcc and MSVC compiler bug and MinGW\n  (`#505 <https://github.com/fmtlib/fmt/issues/505>`_).\n\n* Fixed DLL issues (`#469 <https://github.com/fmtlib/fmt/pull/469>`_ and\n  `#502 <https://github.com/fmtlib/fmt/pull/502>`_).\n  Thanks `@richardeakin (Richard Eakin) <https://github.com/richardeakin>`_ and\n  `@AndreasSchoenle (Andreas Schönle) <https://github.com/AndreasSchoenle>`_.\n\n* Fixed test compilation under FreeBSD\n  (`#433 <https://github.com/fmtlib/fmt/issues/433>`_).\n\n* Fixed various warnings (`#403 <https://github.com/fmtlib/fmt/pull/403>`_,\n  `#410 <https://github.com/fmtlib/fmt/pull/410>`_ and\n  `#510 <https://github.com/fmtlib/fmt/pull/510>`_).\n  Thanks `@Lecetem <https://github.com/Lectem>`_,\n  `@chenhayat (Chen Hayat) <https://github.com/chenhayat>`_ and\n  `@trozen <https://github.com/trozen>`_.\n\n* Worked around a broken ``__builtin_clz`` in clang with MS codegen\n  (`#519 <https://github.com/fmtlib/fmt/issues/519>`_).\n\n* Removed redundant include\n  (`#479 <https://github.com/fmtlib/fmt/issues/479>`_).\n\n* Fixed documentation issues.\n\n3.0.1 - 2016-11-01\n------------------\n* Fixed handling of thousands separator\n  (`#353 <https://github.com/fmtlib/fmt/issues/353>`_).\n\n* Fixed handling of ``unsigned char`` strings\n  (`#373 <https://github.com/fmtlib/fmt/issues/373>`_).\n\n* Corrected buffer growth when formatting time\n  (`#367 <https://github.com/fmtlib/fmt/issues/367>`_).\n\n* Removed warnings under MSVC and clang\n  (`#318 <https://github.com/fmtlib/fmt/issues/318>`_,\n  `#250 <https://github.com/fmtlib/fmt/issues/250>`_, also merged\n  `#385 <https://github.com/fmtlib/fmt/pull/385>`_ and\n  `#361 <https://github.com/fmtlib/fmt/pull/361>`_).\n  Thanks `@jcelerier (Jean-Michaël Celerier) <https://github.com/jcelerier>`_\n  and `@nmoehrle (Nils Moehrle) <https://github.com/nmoehrle>`_.\n\n* Fixed compilation issues under Android\n  (`#327 <https://github.com/fmtlib/fmt/pull/327>`_,\n  `#345 <https://github.com/fmtlib/fmt/issues/345>`_ and\n  `#381 <https://github.com/fmtlib/fmt/pull/381>`_),\n  FreeBSD (`#358 <https://github.com/fmtlib/fmt/pull/358>`_),\n  Cygwin (`#388 <https://github.com/fmtlib/fmt/issues/388>`_),\n  MinGW (`#355 <https://github.com/fmtlib/fmt/issues/355>`_) as well as other\n  issues (`#350 <https://github.com/fmtlib/fmt/issues/350>`_,\n  `#366 <https://github.com/fmtlib/fmt/issues/355>`_,\n  `#348 <https://github.com/fmtlib/fmt/pull/348>`_,\n  `#402 <https://github.com/fmtlib/fmt/pull/402>`_,\n  `#405 <https://github.com/fmtlib/fmt/pull/405>`_).\n  Thanks to `@dpantele (Dmitry) <https://github.com/dpantele>`_,\n  `@hghwng (Hugh Wang) <https://github.com/hghwng>`_,\n  `@arvedarved (Tilman Keskinöz) <https://github.com/arvedarved>`_,\n  `@LogicalKnight (Sean) <https://github.com/LogicalKnight>`_ and\n  `@JanHellwig (Jan Hellwig) <https://github.com/janhellwig>`_.\n\n* Fixed some documentation issues and extended specification\n  (`#320 <https://github.com/fmtlib/fmt/issues/320>`_,\n  `#333 <https://github.com/fmtlib/fmt/pull/333>`_,\n  `#347 <https://github.com/fmtlib/fmt/issues/347>`_,\n  `#362 <https://github.com/fmtlib/fmt/pull/362>`_).\n  Thanks to `@smellman (Taro Matsuzawa aka. btm)\n  <https://github.com/smellman>`_.\n\n3.0.0 - 2016-05-07\n------------------\n\n* The project has been renamed from C++ Format (cppformat) to fmt for\n  consistency with the used namespace and macro prefix\n  (`#307 <https://github.com/fmtlib/fmt/issues/307>`_).\n  Library headers are now located in the ``fmt`` directory:\n\n  .. code:: c++\n\n    #include \"fmt/format.h\"\n\n  Including ``format.h`` from the ``cppformat`` directory is deprecated\n  but works via a proxy header which will be removed in the next major version.\n  \n  The documentation is now available at https://fmt.dev.\n\n* Added support for `strftime <http://en.cppreference.com/w/cpp/chrono/c/strftime>`_-like\n  `date and time formatting <https://fmt.dev/3.0.0/api.html#date-and-time-formatting>`_\n  (`#283 <https://github.com/fmtlib/fmt/issues/283>`_):\n\n  .. code:: c++\n\n    #include \"fmt/time.h\"\n\n    std::time_t t = std::time(nullptr);\n    // Prints \"The date is 2016-04-29.\" (with the current date)\n    fmt::print(\"The date is {:%Y-%m-%d}.\", *std::localtime(&t));\n\n* ``std::ostream`` support including formatting of user-defined types that provide\n  overloaded ``operator<<`` has been moved to ``fmt/ostream.h``:\n\n  .. code:: c++\n\n    #include \"fmt/ostream.h\"\n\n    class Date {\n      int year_, month_, day_;\n    public:\n      Date(int year, int month, int day) : year_(year), month_(month), day_(day) {}\n\n      friend std::ostream &operator<<(std::ostream &os, const Date &d) {\n        return os << d.year_ << '-' << d.month_ << '-' << d.day_;\n      }\n    };\n\n    std::string s = fmt::format(\"The date is {}\", Date(2012, 12, 9));\n    // s == \"The date is 2012-12-9\"\n\n* Added support for `custom argument formatters\n  <https://fmt.dev/3.0.0/api.html#argument-formatters>`_\n  (`#235 <https://github.com/fmtlib/fmt/issues/235>`_).\n\n* Added support for locale-specific integer formatting with the ``n`` specifier\n  (`#305 <https://github.com/fmtlib/fmt/issues/305>`_):\n\n  .. code:: c++\n\n    std::setlocale(LC_ALL, \"en_US.utf8\");\n    fmt::print(\"cppformat: {:n}\\n\", 1234567); // prints 1,234,567\n\n* Sign is now preserved when formatting an integer with an incorrect ``printf``\n  format specifier (`#265 <https://github.com/fmtlib/fmt/issues/265>`_):\n\n  .. code:: c++\n\n    fmt::printf(\"%lld\", -42); // prints -42\n\n  Note that it would be an undefined behavior in ``std::printf``.\n\n* Length modifiers such as ``ll`` are now optional in printf formatting\n  functions and the correct type is determined automatically\n  (`#255 <https://github.com/fmtlib/fmt/issues/255>`_):\n\n  .. code:: c++\n\n    fmt::printf(\"%d\", std::numeric_limits<long long>::max());\n\n  Note that it would be an undefined behavior in ``std::printf``.\n\n* Added initial support for custom formatters\n  (`#231 <https://github.com/fmtlib/fmt/issues/231>`_).\n\n* Fixed detection of user-defined literal support on Intel C++ compiler\n  (`#311 <https://github.com/fmtlib/fmt/issues/311>`_,\n  `#312 <https://github.com/fmtlib/fmt/pull/312>`_).\n  Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_ and\n  `@speth (Ray Speth) <https://github.com/speth>`_.\n\n* Reduced compile time\n  (`#243 <https://github.com/fmtlib/fmt/pull/243>`_,\n  `#249 <https://github.com/fmtlib/fmt/pull/249>`_,\n  `#317 <https://github.com/fmtlib/fmt/issues/317>`_):\n\n  .. image:: https://cloud.githubusercontent.com/assets/4831417/11614060/\n             b9e826d2-9c36-11e5-8666-d4131bf503ef.png\n\n  .. image:: https://cloud.githubusercontent.com/assets/4831417/11614080/\n             6ac903cc-9c37-11e5-8165-26df6efae364.png\n\n  Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_.\n\n* Compile test fixes (`#313 <https://github.com/fmtlib/fmt/pull/313>`_).\n  Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_.\n\n* Documentation fixes (`#239 <https://github.com/fmtlib/fmt/pull/239>`_,\n  `#248 <https://github.com/fmtlib/fmt/issues/248>`_,\n  `#252 <https://github.com/fmtlib/fmt/issues/252>`_,\n  `#258 <https://github.com/fmtlib/fmt/pull/258>`_,\n  `#260 <https://github.com/fmtlib/fmt/issues/260>`_,\n  `#301 <https://github.com/fmtlib/fmt/issues/301>`_,\n  `#309 <https://github.com/fmtlib/fmt/pull/309>`_).\n  Thanks to `@ReadmeCritic <https://github.com/ReadmeCritic>`_\n  `@Gachapen (Magnus Bjerke Vik) <https://github.com/Gachapen>`_ and\n  `@jwilk (Jakub Wilk) <https://github.com/jwilk>`_.\n\n* Fixed compiler and sanitizer warnings\n  (`#244 <https://github.com/fmtlib/fmt/issues/244>`_,\n  `#256 <https://github.com/fmtlib/fmt/pull/256>`_,\n  `#259 <https://github.com/fmtlib/fmt/pull/259>`_,\n  `#263 <https://github.com/fmtlib/fmt/issues/263>`_,\n  `#274 <https://github.com/fmtlib/fmt/issues/274>`_,\n  `#277 <https://github.com/fmtlib/fmt/pull/277>`_,\n  `#286 <https://github.com/fmtlib/fmt/pull/286>`_,\n  `#291 <https://github.com/fmtlib/fmt/issues/291>`_,\n  `#296 <https://github.com/fmtlib/fmt/issues/296>`_,\n  `#308 <https://github.com/fmtlib/fmt/issues/308>`_)\n  Thanks to `@mwinterb <https://github.com/mwinterb>`_,\n  `@pweiskircher (Patrik Weiskircher) <https://github.com/pweiskircher>`_,\n  `@Naios <https://github.com/Naios>`_.\n\n* Improved compatibility with Windows Store apps\n  (`#280 <https://github.com/fmtlib/fmt/issues/280>`_,\n  `#285 <https://github.com/fmtlib/fmt/pull/285>`_)\n  Thanks to `@mwinterb <https://github.com/mwinterb>`_.\n\n* Added tests of compatibility with older C++ standards\n  (`#273 <https://github.com/fmtlib/fmt/pull/273>`_).\n  Thanks to `@niosHD <https://github.com/niosHD>`_.\n\n* Fixed Android build (`#271 <https://github.com/fmtlib/fmt/pull/271>`_).\n  Thanks to `@newnon <https://github.com/newnon>`_.\n\n* Changed ``ArgMap`` to be backed by a vector instead of a map.\n  (`#261 <https://github.com/fmtlib/fmt/issues/261>`_,\n  `#262 <https://github.com/fmtlib/fmt/pull/262>`_).\n  Thanks to `@mwinterb <https://github.com/mwinterb>`_.\n\n* Added ``fprintf`` overload that writes to a ``std::ostream``\n  (`#251 <https://github.com/fmtlib/fmt/pull/251>`_).\n  Thanks to `nickhutchinson (Nicholas Hutchinson) <https://github.com/nickhutchinson>`_.\n\n* Export symbols when building a Windows DLL\n  (`#245 <https://github.com/fmtlib/fmt/pull/245>`_).\n  Thanks to `macdems (Maciek Dems) <https://github.com/macdems>`_.\n\n* Fixed compilation on Cygwin (`#304 <https://github.com/fmtlib/fmt/issues/304>`_).\n\n* Implemented a workaround for a bug in Apple LLVM version 4.2 of clang\n  (`#276 <https://github.com/fmtlib/fmt/issues/276>`_).\n\n* Implemented a workaround for Google Test bug\n  `#705 <https://github.com/google/googletest/issues/705>`_ on gcc 6\n  (`#268 <https://github.com/fmtlib/fmt/issues/268>`_).\n  Thanks to `octoploid <https://github.com/octoploid>`_.\n\n* Removed Biicode support because the latter has been discontinued.\n\n2.1.1 - 2016-04-11\n------------------\n\n* The install location for generated CMake files is now configurable via\n  the ``FMT_CMAKE_DIR`` CMake variable\n  (`#299 <https://github.com/fmtlib/fmt/pull/299>`_).\n  Thanks to `@niosHD <https://github.com/niosHD>`_.\n\n* Documentation fixes (`#252 <https://github.com/fmtlib/fmt/issues/252>`_).\n\n2.1.0 - 2016-03-21\n------------------\n\n* Project layout and build system improvements\n  (`#267 <https://github.com/fmtlib/fmt/pull/267>`_):\n\n  * The code have been moved to the ``cppformat`` directory.\n    Including ``format.h`` from the top-level directory is deprecated\n    but works via a proxy header which will be removed in the next\n    major version.\n\n  * C++ Format CMake targets now have proper interface definitions.\n\n  * Installed version of the library now supports the header-only\n    configuration.\n\n  * Targets ``doc``, ``install``, and ``test`` are now disabled if C++ Format\n    is included as a CMake subproject. They can be enabled by setting\n    ``FMT_DOC``, ``FMT_INSTALL``, and ``FMT_TEST`` in the parent project.\n\n  Thanks to `@niosHD <https://github.com/niosHD>`_.\n\n2.0.1 - 2016-03-13\n------------------\n\n* Improved CMake find and package support\n  (`#264 <https://github.com/fmtlib/fmt/issues/264>`_).\n  Thanks to `@niosHD <https://github.com/niosHD>`_.\n\n* Fix compile error with Android NDK and mingw32\n  (`#241 <https://github.com/fmtlib/fmt/issues/241>`_).\n  Thanks to `@Gachapen (Magnus Bjerke Vik) <https://github.com/Gachapen>`_.\n\n* Documentation fixes\n  (`#248 <https://github.com/fmtlib/fmt/issues/248>`_,\n  `#260 <https://github.com/fmtlib/fmt/issues/260>`_).\n\n2.0.0 - 2015-12-01\n------------------\n\nGeneral\n~~~~~~~\n\n* [Breaking] Named arguments\n  (`#169 <https://github.com/fmtlib/fmt/pull/169>`_,\n  `#173 <https://github.com/fmtlib/fmt/pull/173>`_,\n  `#174 <https://github.com/fmtlib/fmt/pull/174>`_):\n\n  .. code:: c++\n\n    fmt::print(\"The answer is {answer}.\", fmt::arg(\"answer\", 42));\n\n  Thanks to `@jamboree <https://github.com/jamboree>`_.\n\n* [Experimental] User-defined literals for format and named arguments\n  (`#204 <https://github.com/fmtlib/fmt/pull/204>`_,\n  `#206 <https://github.com/fmtlib/fmt/pull/206>`_,\n  `#207 <https://github.com/fmtlib/fmt/pull/207>`_):\n\n  .. code:: c++\n\n    using namespace fmt::literals;\n    fmt::print(\"The answer is {answer}.\", \"answer\"_a=42);\n\n  Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_.\n\n* [Breaking] Formatting of more than 16 arguments is now supported when using\n  variadic templates\n  (`#141 <https://github.com/fmtlib/fmt/issues/141>`_).\n  Thanks to `@Shauren <https://github.com/Shauren>`_.\n\n* Runtime width specification\n  (`#168 <https://github.com/fmtlib/fmt/pull/168>`_):\n\n  .. code:: c++\n\n    fmt::format(\"{0:{1}}\", 42, 5); // gives \"   42\"\n\n  Thanks to `@jamboree <https://github.com/jamboree>`_.\n\n* [Breaking] Enums are now formatted with an overloaded ``std::ostream`` insertion\n  operator (``operator<<``) if available\n  (`#232 <https://github.com/fmtlib/fmt/issues/232>`_).\n\n* [Breaking] Changed default ``bool`` format to textual, \"true\" or \"false\"\n  (`#170 <https://github.com/fmtlib/fmt/issues/170>`_):\n\n  .. code:: c++\n  \n    fmt::print(\"{}\", true); // prints \"true\"\n\n  To print ``bool`` as a number use numeric format specifier such as ``d``:\n\n  .. code:: c++\n\n    fmt::print(\"{:d}\", true); // prints \"1\"\n\n* ``fmt::printf`` and ``fmt::sprintf`` now support formatting of ``bool`` with the\n  ``%s`` specifier giving textual output, \"true\" or \"false\"\n  (`#223 <https://github.com/fmtlib/fmt/pull/223>`_):\n\n  .. code:: c++\n\n    fmt::printf(\"%s\", true); // prints \"true\"\n\n  Thanks to `@LarsGullik <https://github.com/LarsGullik>`_.\n\n* [Breaking] ``signed char`` and ``unsigned char`` are now formatted as integers by default\n  (`#217 <https://github.com/fmtlib/fmt/pull/217>`_).\n\n* [Breaking] Pointers to C strings can now be formatted with the ``p`` specifier\n  (`#223 <https://github.com/fmtlib/fmt/pull/223>`_):\n\n  .. code:: c++\n\n    fmt::print(\"{:p}\", \"test\"); // prints pointer value\n\n  Thanks to `@LarsGullik <https://github.com/LarsGullik>`_.\n\n* [Breaking] ``fmt::printf`` and ``fmt::sprintf`` now print null pointers as ``(nil)``\n  and null strings as ``(null)`` for consistency with glibc\n  (`#226 <https://github.com/fmtlib/fmt/pull/226>`_).\n  Thanks to `@LarsGullik <https://github.com/LarsGullik>`_.\n\n* [Breaking] ``fmt::(s)printf`` now supports formatting of objects of user-defined types\n  that provide an overloaded ``std::ostream`` insertion operator (``operator<<``)\n  (`#201 <https://github.com/fmtlib/fmt/issues/201>`_):\n\n  .. code:: c++\n\n    fmt::printf(\"The date is %s\", Date(2012, 12, 9));\n\n* [Breaking] The ``Buffer`` template is now part of the public API and can be used\n  to implement custom memory buffers\n  (`#140 <https://github.com/fmtlib/fmt/issues/140>`_).\n  Thanks to `@polyvertex (Jean-Charles Lefebvre) <https://github.com/polyvertex>`_.\n\n* [Breaking] Improved compatibility between ``BasicStringRef`` and\n  `std::experimental::basic_string_view\n  <http://en.cppreference.com/w/cpp/experimental/basic_string_view>`_\n  (`#100 <https://github.com/fmtlib/fmt/issues/100>`_,\n  `#159 <https://github.com/fmtlib/fmt/issues/159>`_,\n  `#183 <https://github.com/fmtlib/fmt/issues/183>`_):\n\n  - Comparison operators now compare string content, not pointers\n  - ``BasicStringRef::c_str`` replaced by ``BasicStringRef::data``\n  - ``BasicStringRef`` is no longer assumed to be null-terminated\n\n  References to null-terminated strings are now represented by a new class,\n  ``BasicCStringRef``.\n\n* Dependency on pthreads introduced by Google Test is now optional\n  (`#185 <https://github.com/fmtlib/fmt/issues/185>`_).\n\n* New CMake options ``FMT_DOC``, ``FMT_INSTALL`` and ``FMT_TEST`` to control\n  generation of ``doc``, ``install`` and ``test`` targets respectively, on by default\n  (`#197 <https://github.com/fmtlib/fmt/issues/197>`_,\n  `#198 <https://github.com/fmtlib/fmt/issues/198>`_,\n  `#200 <https://github.com/fmtlib/fmt/issues/200>`_).\n  Thanks to `@maddinat0r (Alex Martin) <https://github.com/maddinat0r>`_.\n\n* ``noexcept`` is now used when compiling with MSVC2015\n  (`#215 <https://github.com/fmtlib/fmt/pull/215>`_).\n  Thanks to `@dmkrepo (Dmitriy) <https://github.com/dmkrepo>`_.\n\n* Added an option to disable use of ``windows.h`` when ``FMT_USE_WINDOWS_H``\n  is defined as 0 before including ``format.h``\n  (`#171 <https://github.com/fmtlib/fmt/issues/171>`_).\n  Thanks to `@alfps (Alf P. Steinbach) <https://github.com/alfps>`_.\n\n* [Breaking] ``windows.h`` is now included with ``NOMINMAX`` unless\n  ``FMT_WIN_MINMAX`` is defined. This is done to prevent breaking code using\n  ``std::min`` and ``std::max`` and only affects the header-only configuration\n  (`#152 <https://github.com/fmtlib/fmt/issues/152>`_,\n  `#153 <https://github.com/fmtlib/fmt/pull/153>`_,\n  `#154 <https://github.com/fmtlib/fmt/pull/154>`_).\n  Thanks to `@DevO2012 <https://github.com/DevO2012>`_.\n\n* Improved support for custom character types\n  (`#171 <https://github.com/fmtlib/fmt/issues/171>`_).\n  Thanks to `@alfps (Alf P. Steinbach) <https://github.com/alfps>`_.\n\n* Added an option to disable use of IOStreams when ``FMT_USE_IOSTREAMS``\n  is defined as 0 before including ``format.h``\n  (`#205 <https://github.com/fmtlib/fmt/issues/205>`_,\n  `#208 <https://github.com/fmtlib/fmt/pull/208>`_).\n  Thanks to `@JodiTheTigger <https://github.com/JodiTheTigger>`_.\n\n* Improved detection of ``isnan``, ``isinf`` and ``signbit``.\n\nOptimization\n~~~~~~~~~~~~\n\n* Made formatting of user-defined types more efficient with a custom stream buffer\n  (`#92 <https://github.com/fmtlib/fmt/issues/92>`_,\n  `#230 <https://github.com/fmtlib/fmt/pull/230>`_).\n  Thanks to `@NotImplemented <https://github.com/NotImplemented>`_.\n\n* Further improved performance of ``fmt::Writer`` on integer formatting\n  and fixed a minor regression. Now it is ~7% faster than ``karma::generate``\n  on Karma's benchmark\n  (`#186 <https://github.com/fmtlib/fmt/issues/186>`_).\n\n* [Breaking] Reduced `compiled code size\n  <https://github.com/fmtlib/fmt#compile-time-and-code-bloat>`_\n  (`#143 <https://github.com/fmtlib/fmt/issues/143>`_,\n  `#149 <https://github.com/fmtlib/fmt/pull/149>`_).\n\nDistribution\n~~~~~~~~~~~~\n\n* [Breaking] Headers are now installed in\n  ``${CMAKE_INSTALL_PREFIX}/include/cppformat``\n  (`#178 <https://github.com/fmtlib/fmt/issues/178>`_).\n  Thanks to `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_.\n\n* [Breaking] Changed the library name from ``format`` to ``cppformat``\n  for consistency with the project name and to avoid potential conflicts\n  (`#178 <https://github.com/fmtlib/fmt/issues/178>`_).\n  Thanks to `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_.\n\n* C++ Format is now available in `Debian <https://www.debian.org/>`_ GNU/Linux\n  (`stretch <https://packages.debian.org/source/stretch/cppformat>`_,\n  `sid <https://packages.debian.org/source/sid/cppformat>`_) and \n  derived distributions such as\n  `Ubuntu <https://launchpad.net/ubuntu/+source/cppformat>`_ 15.10 and later\n  (`#155 <https://github.com/fmtlib/fmt/issues/155>`_)::\n\n    $ sudo apt-get install libcppformat1-dev\n\n  Thanks to `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_.\n\n* `Packages for Fedora and RHEL <https://admin.fedoraproject.org/pkgdb/package/cppformat/>`_\n  are now available. Thanks to Dave Johansen.\n  \n* C++ Format can now be installed via `Homebrew <http://brew.sh/>`_ on OS X\n  (`#157 <https://github.com/fmtlib/fmt/issues/157>`_)::\n\n    $ brew install cppformat\n\n  Thanks to `@ortho <https://github.com/ortho>`_, Anatoliy Bulukin.\n\nDocumentation\n~~~~~~~~~~~~~\n\n* Migrated from ReadTheDocs to GitHub Pages for better responsiveness\n  and reliability\n  (`#128 <https://github.com/fmtlib/fmt/issues/128>`_).\n  New documentation address is http://cppformat.github.io/.\n\n\n* Added `Building the documentation\n  <https://fmt.dev/2.0.0/usage.html#building-the-documentation>`_\n  section to the documentation.\n\n* Documentation build script is now compatible with Python 3 and newer pip versions.\n  (`#189 <https://github.com/fmtlib/fmt/pull/189>`_,\n  `#209 <https://github.com/fmtlib/fmt/issues/209>`_).\n  Thanks to `@JodiTheTigger <https://github.com/JodiTheTigger>`_ and\n  `@xentec <https://github.com/xentec>`_.\n  \n* Documentation fixes and improvements\n  (`#36 <https://github.com/fmtlib/fmt/issues/36>`_,\n  `#75 <https://github.com/fmtlib/fmt/issues/75>`_,\n  `#125 <https://github.com/fmtlib/fmt/issues/125>`_,\n  `#160 <https://github.com/fmtlib/fmt/pull/160>`_,\n  `#161 <https://github.com/fmtlib/fmt/pull/161>`_,\n  `#162 <https://github.com/fmtlib/fmt/issues/162>`_,\n  `#165 <https://github.com/fmtlib/fmt/issues/165>`_,\n  `#210 <https://github.com/fmtlib/fmt/issues/210>`_).\n  Thanks to `@syohex (Syohei YOSHIDA) <https://github.com/syohex>`_ and\n  bug reporters.\n\n* Fixed out-of-tree documentation build\n  (`#177 <https://github.com/fmtlib/fmt/issues/177>`_).\n  Thanks to `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_.\n\nFixes\n~~~~~\n\n* Fixed ``initializer_list`` detection\n  (`#136 <https://github.com/fmtlib/fmt/issues/136>`_).\n  Thanks to `@Gachapen (Magnus Bjerke Vik) <https://github.com/Gachapen>`_.\n\n* [Breaking] Fixed formatting of enums with numeric format specifiers in\n  ``fmt::(s)printf`` \n  (`#131 <https://github.com/fmtlib/fmt/issues/131>`_,\n  `#139 <https://github.com/fmtlib/fmt/issues/139>`_):\n\n  .. code:: c++\n\n    enum { ANSWER = 42 };\n    fmt::printf(\"%d\", ANSWER);\n\n  Thanks to `@Naios <https://github.com/Naios>`_.\n\n* Improved compatibility with old versions of MinGW\n  (`#129 <https://github.com/fmtlib/fmt/issues/129>`_,\n  `#130 <https://github.com/fmtlib/fmt/pull/130>`_,\n  `#132 <https://github.com/fmtlib/fmt/issues/132>`_).\n  Thanks to `@cstamford (Christopher Stamford) <https://github.com/cstamford>`_.\n\n* Fixed a compile error on MSVC with disabled exceptions\n  (`#144 <https://github.com/fmtlib/fmt/issues/144>`_).\n\n* Added a workaround for broken implementation of variadic templates in MSVC2012\n  (`#148 <https://github.com/fmtlib/fmt/issues/148>`_).\n\n* Placed the anonymous namespace within ``fmt`` namespace for the header-only\n  configuration\n  (`#171 <https://github.com/fmtlib/fmt/issues/171>`_).\n  Thanks to `@alfps (Alf P. Steinbach) <https://github.com/alfps>`_.\n\n* Fixed issues reported by Coverity Scan\n  (`#187 <https://github.com/fmtlib/fmt/issues/187>`_,\n  `#192 <https://github.com/fmtlib/fmt/issues/192>`_).\n\n* Implemented a workaround for a name lookup bug in MSVC2010\n  (`#188 <https://github.com/fmtlib/fmt/issues/188>`_).\n\n* Fixed compiler warnings\n  (`#95 <https://github.com/fmtlib/fmt/issues/95>`_,\n  `#96 <https://github.com/fmtlib/fmt/issues/96>`_,\n  `#114 <https://github.com/fmtlib/fmt/pull/114>`_,\n  `#135 <https://github.com/fmtlib/fmt/issues/135>`_,\n  `#142 <https://github.com/fmtlib/fmt/issues/142>`_,\n  `#145 <https://github.com/fmtlib/fmt/issues/145>`_,\n  `#146 <https://github.com/fmtlib/fmt/issues/146>`_,\n  `#158 <https://github.com/fmtlib/fmt/issues/158>`_,\n  `#163 <https://github.com/fmtlib/fmt/issues/163>`_,\n  `#175 <https://github.com/fmtlib/fmt/issues/175>`_,\n  `#190 <https://github.com/fmtlib/fmt/issues/190>`_,\n  `#191 <https://github.com/fmtlib/fmt/pull/191>`_,\n  `#194 <https://github.com/fmtlib/fmt/issues/194>`_,\n  `#196 <https://github.com/fmtlib/fmt/pull/196>`_,\n  `#216 <https://github.com/fmtlib/fmt/issues/216>`_,\n  `#218 <https://github.com/fmtlib/fmt/pull/218>`_,\n  `#220 <https://github.com/fmtlib/fmt/pull/220>`_,\n  `#229 <https://github.com/fmtlib/fmt/pull/229>`_,\n  `#233 <https://github.com/fmtlib/fmt/issues/233>`_,\n  `#234 <https://github.com/fmtlib/fmt/issues/234>`_,\n  `#236 <https://github.com/fmtlib/fmt/pull/236>`_,\n  `#281 <https://github.com/fmtlib/fmt/issues/281>`_,\n  `#289 <https://github.com/fmtlib/fmt/issues/289>`_).\n  Thanks to `@seanmiddleditch (Sean Middleditch) <https://github.com/seanmiddleditch>`_,\n  `@dixlorenz (Dix Lorenz) <https://github.com/dixlorenz>`_,\n  `@CarterLi (李通洲) <https://github.com/CarterLi>`_,\n  `@Naios <https://github.com/Naios>`_,\n  `@fmatthew5876 (Matthew Fioravante) <https://github.com/fmatthew5876>`_,\n  `@LevskiWeng (Levski Weng) <https://github.com/LevskiWeng>`_,\n  `@rpopescu <https://github.com/rpopescu>`_,\n  `@gabime (Gabi Melman) <https://github.com/gabime>`_,\n  `@cubicool (Jeremy Moles) <https://github.com/cubicool>`_,\n  `@jkflying (Julian Kent) <https://github.com/jkflying>`_,\n  `@LogicalKnight (Sean L) <https://github.com/LogicalKnight>`_,\n  `@inguin (Ingo van Lil) <https://github.com/inguin>`_ and\n  `@Jopie64 (Johan) <https://github.com/Jopie64>`_.\n\n* Fixed portability issues (mostly causing test failures) on ARM, ppc64, ppc64le,\n  s390x and SunOS 5.11 i386\n  (`#138 <https://github.com/fmtlib/fmt/issues/138>`_,\n  `#179 <https://github.com/fmtlib/fmt/issues/179>`_,\n  `#180 <https://github.com/fmtlib/fmt/issues/180>`_,\n  `#202 <https://github.com/fmtlib/fmt/issues/202>`_,\n  `#225 <https://github.com/fmtlib/fmt/issues/225>`_,\n  `Red Hat Bugzilla Bug 1260297 <https://bugzilla.redhat.com/show_bug.cgi?id=1260297>`_).\n  Thanks to `@Naios <https://github.com/Naios>`_,\n  `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_ and Dave Johansen.\n\n* Fixed a name conflict with macro ``free`` defined in\n  ``crtdbg.h`` when ``_CRTDBG_MAP_ALLOC`` is set\n  (`#211 <https://github.com/fmtlib/fmt/issues/211>`_).\n\n* Fixed shared library build on OS X\n  (`#212 <https://github.com/fmtlib/fmt/pull/212>`_).\n  Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_.\n\n* Fixed an overload conflict on MSVC when ``/Zc:wchar_t-`` option is specified\n  (`#214 <https://github.com/fmtlib/fmt/pull/214>`_).\n  Thanks to `@slavanap (Vyacheslav Napadovsky) <https://github.com/slavanap>`_.\n\n* Improved compatibility with MSVC 2008\n  (`#236 <https://github.com/fmtlib/fmt/pull/236>`_).\n  Thanks to `@Jopie64 (Johan) <https://github.com/Jopie64>`_.\n\n* Improved compatibility with bcc32\n  (`#227 <https://github.com/fmtlib/fmt/issues/227>`_).\n\n* Fixed ``static_assert`` detection on Clang\n  (`#228 <https://github.com/fmtlib/fmt/pull/228>`_).\n  Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_.\n\n1.1.0 - 2015-03-06\n------------------\n\n* Added ``BasicArrayWriter``, a class template that provides operations for\n  formatting and writing data into a fixed-size array\n  (`#105 <https://github.com/fmtlib/fmt/issues/105>`_ and\n  `#122 <https://github.com/fmtlib/fmt/issues/122>`_):\n\n  .. code:: c++\n  \n    char buffer[100];\n    fmt::ArrayWriter w(buffer);\n    w.write(\"The answer is {}\", 42);\n\n* Added `0 A.D. <http://play0ad.com/>`_ and `PenUltima Online (POL)\n  <http://www.polserver.com/>`_ to the list of notable projects using C++ Format.\n\n* C++ Format now uses MSVC intrinsics for better formatting performance\n  (`#115 <https://github.com/fmtlib/fmt/pull/115>`_,\n  `#116 <https://github.com/fmtlib/fmt/pull/116>`_,\n  `#118 <https://github.com/fmtlib/fmt/pull/118>`_ and\n  `#121 <https://github.com/fmtlib/fmt/pull/121>`_).\n  Previously these optimizations where only used on GCC and Clang.\n  Thanks to `@CarterLi <https://github.com/CarterLi>`_ and\n  `@objectx <https://github.com/objectx>`_.\n\n* CMake install target (`#119 <https://github.com/fmtlib/fmt/pull/119>`_).\n  Thanks to `@TrentHouliston <https://github.com/TrentHouliston>`_.\n\n  You can now install C++ Format with ``make install`` command.\n\n* Improved `Biicode <http://www.biicode.com/>`_ support\n  (`#98 <https://github.com/fmtlib/fmt/pull/98>`_ and\n  `#104 <https://github.com/fmtlib/fmt/pull/104>`_). Thanks to\n  `@MariadeAnton <https://github.com/MariadeAnton>`_ and\n  `@franramirez688 <https://github.com/franramirez688>`_.\n\n* Improved support for building with `Android NDK\n  <https://developer.android.com/tools/sdk/ndk/index.html>`_\n  (`#107 <https://github.com/fmtlib/fmt/pull/107>`_).\n  Thanks to `@newnon <https://github.com/newnon>`_.\n  \n  The `android-ndk-example <https://github.com/fmtlib/android-ndk-example>`_\n  repository provides and example of using C++ Format with Android NDK:\n\n  .. image:: https://raw.githubusercontent.com/fmtlib/android-ndk-example/\n            master/screenshot.png\n\n* Improved documentation of ``SystemError`` and ``WindowsError``\n  (`#54 <https://github.com/fmtlib/fmt/issues/54>`_).\n\n* Various code improvements\n  (`#110 <https://github.com/fmtlib/fmt/pull/110>`_,\n  `#111 <https://github.com/fmtlib/fmt/pull/111>`_\n  `#112 <https://github.com/fmtlib/fmt/pull/112>`_).\n  Thanks to `@CarterLi <https://github.com/CarterLi>`_.\n\n* Improved compile-time errors when formatting wide into narrow strings\n  (`#117 <https://github.com/fmtlib/fmt/issues/117>`_).\n\n* Fixed ``BasicWriter::write`` without formatting arguments when C++11 support\n  is disabled (`#109 <https://github.com/fmtlib/fmt/issues/109>`_).\n\n* Fixed header-only build on OS X with GCC 4.9\n  (`#124 <https://github.com/fmtlib/fmt/issues/124>`_).\n\n* Fixed packaging issues (`#94 <https://github.com/fmtlib/fmt/issues/94>`_).\n\n* Added `changelog <https://github.com/fmtlib/fmt/blob/master/ChangeLog.rst>`_\n  (`#103 <https://github.com/fmtlib/fmt/issues/103>`_).\n\n1.0.0 - 2015-02-05\n------------------\n\n* Add support for a header-only configuration when ``FMT_HEADER_ONLY`` is\n  defined before including ``format.h``:\n\n  .. code:: c++\n\n    #define FMT_HEADER_ONLY\n    #include \"format.h\"\n\n* Compute string length in the constructor of ``BasicStringRef``\n  instead of the ``size`` method\n  (`#79 <https://github.com/fmtlib/fmt/issues/79>`_).\n  This eliminates size computation for string literals on reasonable optimizing\n  compilers.\n\n* Fix formatting of types with overloaded ``operator <<`` for ``std::wostream``\n  (`#86 <https://github.com/fmtlib/fmt/issues/86>`_):\n\n  .. code:: c++\n\n    fmt::format(L\"The date is {0}\", Date(2012, 12, 9));\n\n* Fix linkage of tests on Arch Linux\n  (`#89 <https://github.com/fmtlib/fmt/issues/89>`_).\n\n* Allow precision specifier for non-float arguments\n  (`#90 <https://github.com/fmtlib/fmt/issues/90>`_):\n\n  .. code:: c++\n\n    fmt::print(\"{:.3}\\n\", \"Carpet\"); // prints \"Car\"\n\n* Fix build on Android NDK\n  (`#93 <https://github.com/fmtlib/fmt/issues/93>`_)\n\n* Improvements to documentation build procedure.\n\n* Remove ``FMT_SHARED`` CMake variable in favor of standard `BUILD_SHARED_LIBS\n  <http://www.cmake.org/cmake/help/v3.0/variable/BUILD_SHARED_LIBS.html>`_.\n\n* Fix error handling in ``fmt::fprintf``.\n\n* Fix a number of warnings.\n\n0.12.0 - 2014-10-25\n-------------------\n\n* [Breaking] Improved separation between formatting and buffer management.\n  ``Writer`` is now a base class that cannot be instantiated directly.\n  The new ``MemoryWriter`` class implements the default buffer management\n  with small allocations done on stack. So ``fmt::Writer`` should be replaced\n  with ``fmt::MemoryWriter`` in variable declarations.\n\n  Old code:\n\n  .. code:: c++\n\n    fmt::Writer w;\n\n  New code: \n\n  .. code:: c++\n\n    fmt::MemoryWriter w;\n\n  If you pass ``fmt::Writer`` by reference, you can continue to do so:\n\n  .. code:: c++\n\n      void f(fmt::Writer &w);\n\n  This doesn't affect the formatting API.\n\n* Support for custom memory allocators\n  (`#69 <https://github.com/fmtlib/fmt/issues/69>`_)\n\n* Formatting functions now accept `signed char` and `unsigned char` strings as\n  arguments (`#73 <https://github.com/fmtlib/fmt/issues/73>`_):\n\n  .. code:: c++\n\n    auto s = format(\"GLSL version: {}\", glGetString(GL_VERSION));\n\n* Reduced code bloat. According to the new `benchmark results\n  <https://github.com/fmtlib/fmt#compile-time-and-code-bloat>`_,\n  cppformat is close to ``printf`` and by the order of magnitude better than\n  Boost Format in terms of compiled code size.\n\n* Improved appearance of the documentation on mobile by using the `Sphinx\n  Bootstrap theme <http://ryan-roemer.github.io/sphinx-bootstrap-theme/>`_:\n\n  .. |old| image:: https://cloud.githubusercontent.com/assets/576385/4792130/\n                   cd256436-5de3-11e4-9a62-c077d0c2b003.png\n\n  .. |new| image:: https://cloud.githubusercontent.com/assets/576385/4792131/\n                   cd29896c-5de3-11e4-8f59-cac952942bf0.png\n  \n  +-------+-------+\n  |  Old  |  New  |\n  +-------+-------+\n  | |old| | |new| |\n  +-------+-------+\n\n0.11.0 - 2014-08-21\n-------------------\n\n* Safe printf implementation with a POSIX extension for positional arguments:\n\n  .. code:: c++\n\n    fmt::printf(\"Elapsed time: %.2f seconds\", 1.23);\n    fmt::printf(\"%1$s, %3$d %2$s\", weekday, month, day);\n\n* Arguments of ``char`` type can now be formatted as integers\n  (Issue `#55 <https://github.com/fmtlib/fmt/issues/55>`_):\n\n  .. code:: c++\n\n    fmt::format(\"0x{0:02X}\", 'a');\n\n* Deprecated parts of the API removed.\n\n* The library is now built and tested on MinGW with Appveyor in addition to\n  existing test platforms Linux/GCC, OS X/Clang, Windows/MSVC.\n\n0.10.0 - 2014-07-01\n-------------------\n\n**Improved API**\n\n* All formatting methods are now implemented as variadic functions instead\n  of using ``operator<<`` for feeding arbitrary arguments into a temporary\n  formatter object. This works both with C++11 where variadic templates are\n  used and with older standards where variadic functions are emulated by\n  providing lightweight wrapper functions defined with the ``FMT_VARIADIC``\n  macro. You can use this macro for defining your own portable variadic\n  functions:\n\n  .. code:: c++\n\n    void report_error(const char *format, const fmt::ArgList &args) {\n      fmt::print(\"Error: {}\");\n      fmt::print(format, args);\n    }\n    FMT_VARIADIC(void, report_error, const char *)\n\n    report_error(\"file not found: {}\", path);\n\n  Apart from a more natural syntax, this also improves performance as there\n  is no need to construct temporary formatter objects and control arguments'\n  lifetimes. Because the wrapper functions are very lightweight, this doesn't\n  cause code bloat even in pre-C++11 mode.\n\n* Simplified common case of formatting an ``std::string``. Now it requires a\n  single function call:\n\n  .. code:: c++\n\n    std::string s = format(\"The answer is {}.\", 42);\n\n  Previously it required 2 function calls:\n\n  .. code:: c++\n\n    std::string s = str(Format(\"The answer is {}.\") << 42);\n\n  Instead of unsafe ``c_str`` function, ``fmt::Writer`` should be used directly\n  to bypass creation of ``std::string``:\n\n  .. code:: c++\n\n    fmt::Writer w;\n    w.write(\"The answer is {}.\", 42);\n    w.c_str();  // returns a C string\n\n  This doesn't do dynamic memory allocation for small strings and is less error\n  prone as the lifetime of the string is the same as for ``std::string::c_str``\n  which is well understood (hopefully).\n\n* Improved consistency in naming functions that are a part of the public API.\n  Now all public functions are lowercase following the standard library\n  conventions. Previously it was a combination of lowercase and\n  CapitalizedWords.\n  Issue `#50 <https://github.com/fmtlib/fmt/issues/50>`_.\n\n* Old functions are marked as deprecated and will be removed in the next\n  release.\n\n**Other Changes**\n\n* Experimental support for printf format specifications (work in progress):\n\n  .. code:: c++\n\n    fmt::printf(\"The answer is %d.\", 42);\n    std::string s = fmt::sprintf(\"Look, a %s!\", \"string\");\n\n* Support for hexadecimal floating point format specifiers ``a`` and ``A``:\n\n  .. code:: c++\n\n    print(\"{:a}\", -42.0); // Prints -0x1.5p+5\n    print(\"{:A}\", -42.0); // Prints -0X1.5P+5\n\n* CMake option ``FMT_SHARED`` that specifies whether to build format as a\n  shared library (off by default).\n\n0.9.0 - 2014-05-13\n------------------\n\n* More efficient implementation of variadic formatting functions.\n\n* ``Writer::Format`` now has a variadic overload:\n\n  .. code:: c++\n\n    Writer out;\n    out.Format(\"Look, I'm {}!\", \"variadic\");\n\n* For efficiency and consistency with other overloads, variadic overload of\n  the ``Format`` function now returns ``Writer`` instead of ``std::string``.\n  Use the ``str`` function to convert it to ``std::string``:\n\n  .. code:: c++\n\n    std::string s = str(Format(\"Look, I'm {}!\", \"variadic\"));\n\n* Replaced formatter actions with output sinks: ``NoAction`` -> ``NullSink``,\n  ``Write`` -> ``FileSink``, ``ColorWriter`` -> ``ANSITerminalSink``.\n  This improves naming consistency and shouldn't affect client code unless\n  these classes are used directly which should be rarely needed.\n\n* Added ``ThrowSystemError`` function that formats a message and throws\n  ``SystemError`` containing the formatted message and system-specific error\n  description. For example, the following code\n\n  .. code:: c++\n\n    FILE *f = fopen(filename, \"r\");\n    if (!f)\n      ThrowSystemError(errno, \"Failed to open file '{}'\") << filename;\n\n  will throw ``SystemError`` exception with description\n  \"Failed to open file '<filename>': No such file or directory\" if file\n  doesn't exist.\n\n* Support for AppVeyor continuous integration platform.\n\n* ``Format`` now throws ``SystemError`` in case of I/O errors.\n\n* Improve test infrastructure. Print functions are now tested by redirecting\n  the output to a pipe.\n\n0.8.0 - 2014-04-14\n------------------\n\n* Initial release\n"
  },
  {
    "path": "examples/libraries/fmt/LICENSE.rst",
    "content": "Copyright (c) 2012 - present, Victor Zverovich\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--- Optional exception to the license ---\n\nAs an exception, if, as a result of your compiling your source code, portions\nof this Software are embedded into a machine-executable object form of such\nsource code, you may redistribute such embedded portions in such object form\nwithout including the above copyright and permission notices.\n"
  },
  {
    "path": "examples/libraries/fmt/README.rst",
    "content": "{fmt}\n=====\n\n.. image:: https://github.com/fmtlib/fmt/workflows/linux/badge.svg\n   :target: https://github.com/fmtlib/fmt/actions?query=workflow%3Alinux\n\n.. image:: https://github.com/fmtlib/fmt/workflows/macos/badge.svg\n   :target: https://github.com/fmtlib/fmt/actions?query=workflow%3Amacos\n\n.. image:: https://github.com/fmtlib/fmt/workflows/windows/badge.svg\n   :target: https://github.com/fmtlib/fmt/actions?query=workflow%3Awindows\n\n.. image:: https://ci.appveyor.com/api/projects/status/ehjkiefde6gucy1v\n   :target: https://ci.appveyor.com/project/vitaut/fmt\n\n.. image:: https://oss-fuzz-build-logs.storage.googleapis.com/badges/fmt.svg\n   :alt: fmt is continuously fuzzed at oss-fuzz\n   :target: https://bugs.chromium.org/p/oss-fuzz/issues/list?\\\n            colspec=ID%20Type%20Component%20Status%20Proj%20Reported%20Owner%20\\\n            Summary&q=proj%3Dfmt&can=1\n\n.. image:: https://img.shields.io/badge/stackoverflow-fmt-blue.svg\n   :alt: Ask questions at StackOverflow with the tag fmt\n   :target: https://stackoverflow.com/questions/tagged/fmt\n\n**{fmt}** is an open-source formatting library providing a fast and safe\nalternative to C stdio and C++ iostreams.\n\nIf you like this project, please consider donating to the BYSOL\nFoundation that helps victims of political repressions in Belarus:\nhttps://bysol.org/en/bs/general/.\n\n`Documentation <https://fmt.dev>`__\n\nQ&A: ask questions on `StackOverflow with the tag fmt\n<https://stackoverflow.com/questions/tagged/fmt>`_.\n\nTry {fmt} in `Compiler Explorer <https://godbolt.org/z/Eq5763>`_.\n\nFeatures\n--------\n\n* Simple `format API <https://fmt.dev/latest/api.html>`_ with positional arguments\n  for localization\n* Implementation of `C++20 std::format\n  <https://en.cppreference.com/w/cpp/utility/format>`__\n* `Format string syntax <https://fmt.dev/latest/syntax.html>`_ similar to Python's\n  `format <https://docs.python.org/3/library/stdtypes.html#str.format>`_\n* Fast IEEE 754 floating-point formatter with correct rounding, shortness and\n  round-trip guarantees\n* Safe `printf implementation\n  <https://fmt.dev/latest/api.html#printf-formatting>`_ including the POSIX\n  extension for positional arguments\n* Extensibility: `support for user-defined types\n  <https://fmt.dev/latest/api.html#formatting-user-defined-types>`_\n* High performance: faster than common standard library implementations of\n  ``(s)printf``, iostreams, ``to_string`` and ``to_chars``, see `Speed tests`_\n  and `Converting a hundred million integers to strings per second\n  <http://www.zverovich.net/2020/06/13/fast-int-to-string-revisited.html>`_\n* Small code size both in terms of source code with the minimum configuration\n  consisting of just three files, ``core.h``, ``format.h`` and ``format-inl.h``,\n  and compiled code; see `Compile time and code bloat`_\n* Reliability: the library has an extensive set of `tests\n  <https://github.com/fmtlib/fmt/tree/master/test>`_ and is `continuously fuzzed\n  <https://bugs.chromium.org/p/oss-fuzz/issues/list?colspec=ID%20Type%20\n  Component%20Status%20Proj%20Reported%20Owner%20Summary&q=proj%3Dfmt&can=1>`_\n* Safety: the library is fully type safe, errors in format strings can be\n  reported at compile time, automatic memory management prevents buffer overflow\n  errors\n* Ease of use: small self-contained code base, no external dependencies,\n  permissive MIT `license\n  <https://github.com/fmtlib/fmt/blob/master/LICENSE.rst>`_\n* `Portability <https://fmt.dev/latest/index.html#portability>`_ with\n  consistent output across platforms and support for older compilers\n* Clean warning-free codebase even on high warning levels such as\n  ``-Wall -Wextra -pedantic``\n* Locale-independence by default\n* Optional header-only configuration enabled with the ``FMT_HEADER_ONLY`` macro\n\nSee the `documentation <https://fmt.dev>`_ for more details.\n\nExamples\n--------\n\n**Print to stdout** (`run <https://godbolt.org/z/Tevcjh>`_)\n\n.. code:: c++\n\n    #include <fmt/core.h>\n    \n    int main() {\n      fmt::print(\"Hello, world!\\n\");\n    }\n\n**Format a string** (`run <https://godbolt.org/z/oK8h33>`_)\n\n.. code:: c++\n\n    std::string s = fmt::format(\"The answer is {}.\", 42);\n    // s == \"The answer is 42.\"\n\n**Format a string using positional arguments** (`run <https://godbolt.org/z/Yn7Txe>`_)\n\n.. code:: c++\n\n    std::string s = fmt::format(\"I'd rather be {1} than {0}.\", \"right\", \"happy\");\n    // s == \"I'd rather be happy than right.\"\n\n**Print chrono durations** (`run <https://godbolt.org/z/K8s4Mc>`_)\n\n.. code:: c++\n\n    #include <fmt/chrono.h>\n\n    int main() {\n      using namespace std::literals::chrono_literals;\n      fmt::print(\"Default format: {} {}\\n\", 42s, 100ms);\n      fmt::print(\"strftime-like format: {:%H:%M:%S}\\n\", 3h + 15min + 30s);\n    }\n\nOutput::\n\n    Default format: 42s 100ms\n    strftime-like format: 03:15:30\n\n**Print a container** (`run <https://godbolt.org/z/MjsY7c>`_)\n\n.. code:: c++\n\n    #include <vector>\n    #include <fmt/ranges.h>\n\n    int main() {\n      std::vector<int> v = {1, 2, 3};\n      fmt::print(\"{}\\n\", v);\n    }\n\nOutput::\n\n    [1, 2, 3]\n\n**Check a format string at compile time**\n\n.. code:: c++\n\n    std::string s = fmt::format(\"{:d}\", \"I am not a number\");\n\nThis gives a compile-time error in C++20 because ``d`` is an invalid format\nspecifier for a string.\n\n**Write a file from a single thread**\n\n.. code:: c++\n\n    #include <fmt/os.h>\n\n    int main() {\n      auto out = fmt::output_file(\"guide.txt\");\n      out.print(\"Don't {}\", \"Panic\");\n    }\n\nThis can be `5 to 9 times faster than fprintf\n<http://www.zverovich.net/2020/08/04/optimal-file-buffer-size.html>`_.\n\n**Print with colors and text styles**\n\n.. code:: c++\n\n    #include <fmt/color.h>\n\n    int main() {\n      fmt::print(fg(fmt::color::crimson) | fmt::emphasis::bold,\n                 \"Hello, {}!\\n\", \"world\");\n      fmt::print(fg(fmt::color::floral_white) | bg(fmt::color::slate_gray) |\n                 fmt::emphasis::underline, \"Hello, {}!\\n\", \"мир\");\n      fmt::print(fg(fmt::color::steel_blue) | fmt::emphasis::italic,\n                 \"Hello, {}!\\n\", \"世界\");\n    }\n\nOutput on a modern terminal:\n\n.. image:: https://user-images.githubusercontent.com/\n           576385/88485597-d312f600-cf2b-11ea-9cbe-61f535a86e28.png\n\nBenchmarks\n----------\n\nSpeed tests\n~~~~~~~~~~~\n\n================= ============= ===========\nLibrary           Method        Run Time, s\n================= ============= ===========\nlibc              printf          1.04\nlibc++            std::ostream    3.05\n{fmt} 6.1.1       fmt::print      0.75\nBoost Format 1.67 boost::format   7.24\nFolly Format      folly::format   2.23\n================= ============= ===========\n\n{fmt} is the fastest of the benchmarked methods, ~35% faster than ``printf``.\n\nThe above results were generated by building ``tinyformat_test.cpp`` on macOS\n10.14.6 with ``clang++ -O3 -DNDEBUG -DSPEED_TEST -DHAVE_FORMAT``, and taking the\nbest of three runs. In the test, the format string ``\"%0.10f:%04d:%+g:%s:%p:%c:%%\\n\"``\nor equivalent is filled 2,000,000 times with output sent to ``/dev/null``; for\nfurther details refer to the `source\n<https://github.com/fmtlib/format-benchmark/blob/master/tinyformat_test.cpp>`_.\n\n{fmt} is up to 20-30x faster than ``std::ostringstream`` and ``sprintf`` on\nfloating-point formatting (`dtoa-benchmark <https://github.com/fmtlib/dtoa-benchmark>`_)\nand faster than `double-conversion <https://github.com/google/double-conversion>`_ and\n`ryu <https://github.com/ulfjack/ryu>`_:\n\n.. image:: https://user-images.githubusercontent.com/576385/\n           95684665-11719600-0ba8-11eb-8e5b-972ff4e49428.png\n   :target: https://fmt.dev/unknown_mac64_clang12.0.html\n\nCompile time and code bloat\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe script `bloat-test.py\n<https://github.com/fmtlib/format-benchmark/blob/master/bloat-test.py>`_\nfrom `format-benchmark <https://github.com/fmtlib/format-benchmark>`_\ntests compile time and code bloat for nontrivial projects.\nIt generates 100 translation units and uses ``printf()`` or its alternative\nfive times in each to simulate a medium sized project.  The resulting\nexecutable size and compile time (Apple LLVM version 8.1.0 (clang-802.0.42),\nmacOS Sierra, best of three) is shown in the following tables.\n\n**Optimized build (-O3)**\n\n============= =============== ==================== ==================\nMethod        Compile Time, s Executable size, KiB Stripped size, KiB\n============= =============== ==================== ==================\nprintf                    2.6                   29                 26\nprintf+string            16.4                   29                 26\niostreams                31.1                   59                 55\n{fmt}                    19.0                   37                 34\nBoost Format             91.9                  226                203\nFolly Format            115.7                  101                 88\n============= =============== ==================== ==================\n\nAs you can see, {fmt} has 60% less overhead in terms of resulting binary code\nsize compared to iostreams and comes pretty close to ``printf``. Boost Format\nand Folly Format have the largest overheads.\n\n``printf+string`` is the same as ``printf`` but with extra ``<string>``\ninclude to measure the overhead of the latter.\n\n**Non-optimized build**\n\n============= =============== ==================== ==================\nMethod        Compile Time, s Executable size, KiB Stripped size, KiB\n============= =============== ==================== ==================\nprintf                    2.2                   33                 30\nprintf+string            16.0                   33                 30\niostreams                28.3                   56                 52\n{fmt}                    18.2                   59                 50\nBoost Format             54.1                  365                303\nFolly Format             79.9                  445                430\n============= =============== ==================== ==================\n\n``libc``, ``lib(std)c++`` and ``libfmt`` are all linked as shared libraries to\ncompare formatting function overhead only. Boost Format is a\nheader-only library so it doesn't provide any linkage options.\n\nRunning the tests\n~~~~~~~~~~~~~~~~~\n\nPlease refer to `Building the library`__ for the instructions on how to build\nthe library and run the unit tests.\n\n__ https://fmt.dev/latest/usage.html#building-the-library\n\nBenchmarks reside in a separate repository,\n`format-benchmarks <https://github.com/fmtlib/format-benchmark>`_,\nso to run the benchmarks you first need to clone this repository and\ngenerate Makefiles with CMake::\n\n    $ git clone --recursive https://github.com/fmtlib/format-benchmark.git\n    $ cd format-benchmark\n    $ cmake .\n\nThen you can run the speed test::\n\n    $ make speed-test\n\nor the bloat test::\n\n    $ make bloat-test\n    \nMigrating code\n--------------\n\n`clang-tidy-fmt <https://github.com/mikecrowe/clang-tidy-fmt>`_ provides clang\ntidy checks for converting occurrences of ``printf`` and ``fprintf`` to\n``fmt::print``.\n\nProjects using this library\n---------------------------\n\n* `0 A.D. <https://play0ad.com/>`_: a free, open-source, cross-platform\n  real-time strategy game\n\n* `2GIS <https://2gis.ru/>`_: free business listings with a city map\n\n* `AMPL/MP <https://github.com/ampl/mp>`_:\n  an open-source library for mathematical programming\n\n* `Aseprite <https://github.com/aseprite/aseprite>`_:\n  animated sprite editor & pixel art tool \n\n* `AvioBook <https://www.aviobook.aero/en>`_: a comprehensive aircraft\n  operations suite\n  \n* `Blizzard Battle.net <https://battle.net/>`_: an online gaming platform\n  \n* `Celestia <https://celestia.space/>`_: real-time 3D visualization of space\n\n* `Ceph <https://ceph.com/>`_: a scalable distributed storage system\n\n* `ccache <https://ccache.dev/>`_: a compiler cache\n\n* `ClickHouse <https://github.com/ClickHouse/ClickHouse>`_: analytical database\n  management system\n\n* `CUAUV <https://cuauv.org/>`_: Cornell University's autonomous underwater\n  vehicle\n\n* `Drake <https://drake.mit.edu/>`_: a planning, control, and analysis toolbox\n  for nonlinear dynamical systems (MIT)\n\n* `Envoy <https://lyft.github.io/envoy/>`_: C++ L7 proxy and communication bus\n  (Lyft)\n\n* `FiveM <https://fivem.net/>`_: a modification framework for GTA V\n\n* `fmtlog <https://github.com/MengRao/fmtlog>`_: a performant fmtlib-style\n  logging library with latency in nanoseconds\n\n* `Folly <https://github.com/facebook/folly>`_: Facebook open-source library\n\n* `Grand Mountain Adventure\n  <https://store.steampowered.com/app/1247360/Grand_Mountain_Adventure/>`_:\n  A beautiful open-world ski & snowboarding game\n\n* `HarpyWar/pvpgn <https://github.com/pvpgn/pvpgn-server>`_:\n  Player vs Player Gaming Network with tweaks\n\n* `KBEngine <https://github.com/kbengine/kbengine>`_: an open-source MMOG server\n  engine\n\n* `Keypirinha <https://keypirinha.com/>`_: a semantic launcher for Windows\n\n* `Kodi <https://kodi.tv/>`_ (formerly xbmc): home theater software\n\n* `Knuth <https://kth.cash/>`_: high-performance Bitcoin full-node\n\n* `Microsoft Verona <https://github.com/microsoft/verona>`_:\n  research programming language for concurrent ownership\n\n* `MongoDB <https://mongodb.com/>`_: distributed document database\n\n* `MongoDB Smasher <https://github.com/duckie/mongo_smasher>`_: a small tool to\n  generate randomized datasets\n\n* `OpenSpace <https://openspaceproject.com/>`_: an open-source\n  astrovisualization framework\n\n* `PenUltima Online (POL) <https://www.polserver.com/>`_:\n  an MMO server, compatible with most Ultima Online clients\n\n* `PyTorch <https://github.com/pytorch/pytorch>`_: an open-source machine\n  learning library\n\n* `quasardb <https://www.quasardb.net/>`_: a distributed, high-performance,\n  associative database\n  \n* `Quill <https://github.com/odygrd/quill>`_: asynchronous low-latency logging library\n\n* `QKW <https://github.com/ravijanjam/qkw>`_: generalizing aliasing to simplify\n  navigation, and executing complex multi-line terminal command sequences\n\n* `redis-cerberus <https://github.com/HunanTV/redis-cerberus>`_: a Redis cluster\n  proxy\n\n* `redpanda <https://vectorized.io/redpanda>`_: a 10x faster Kafka® replacement\n  for mission critical systems written in C++\n\n* `rpclib <http://rpclib.net/>`_: a modern C++ msgpack-RPC server and client\n  library\n\n* `Salesforce Analytics Cloud\n  <https://www.salesforce.com/analytics-cloud/overview/>`_:\n  business intelligence software\n\n* `Scylla <https://www.scylladb.com/>`_: a Cassandra-compatible NoSQL data store\n  that can handle 1 million transactions per second on a single server\n\n* `Seastar <http://www.seastar-project.org/>`_: an advanced, open-source C++\n  framework for high-performance server applications on modern hardware\n\n* `spdlog <https://github.com/gabime/spdlog>`_: super fast C++ logging library\n\n* `Stellar <https://www.stellar.org/>`_: financial platform\n\n* `Touch Surgery <https://www.touchsurgery.com/>`_: surgery simulator\n\n* `TrinityCore <https://github.com/TrinityCore/TrinityCore>`_: open-source\n  MMORPG framework\n\n* `Windows Terminal <https://github.com/microsoft/terminal>`_: the new Windows\n  terminal\n\n`More... <https://github.com/search?q=fmtlib&type=Code>`_\n\nIf you are aware of other projects using this library, please let me know\nby `email <mailto:victor.zverovich@gmail.com>`_ or by submitting an\n`issue <https://github.com/fmtlib/fmt/issues>`_.\n\nMotivation\n----------\n\nSo why yet another formatting library?\n\nThere are plenty of methods for doing this task, from standard ones like\nthe printf family of function and iostreams to Boost Format and FastFormat\nlibraries. The reason for creating a new library is that every existing\nsolution that I found either had serious issues or didn't provide\nall the features I needed.\n\nprintf\n~~~~~~\n\nThe good thing about ``printf`` is that it is pretty fast and readily available\nbeing a part of the C standard library. The main drawback is that it\ndoesn't support user-defined types. ``printf`` also has safety issues although\nthey are somewhat mitigated with `__attribute__ ((format (printf, ...))\n<https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html>`_ in GCC.\nThere is a POSIX extension that adds positional arguments required for\n`i18n <https://en.wikipedia.org/wiki/Internationalization_and_localization>`_\nto ``printf`` but it is not a part of C99 and may not be available on some\nplatforms.\n\niostreams\n~~~~~~~~~\n\nThe main issue with iostreams is best illustrated with an example:\n\n.. code:: c++\n\n    std::cout << std::setprecision(2) << std::fixed << 1.23456 << \"\\n\";\n\nwhich is a lot of typing compared to printf:\n\n.. code:: c++\n\n    printf(\"%.2f\\n\", 1.23456);\n\nMatthew Wilson, the author of FastFormat, called this \"chevron hell\". iostreams\ndon't support positional arguments by design.\n\nThe good part is that iostreams support user-defined types and are safe although\nerror handling is awkward.\n\nBoost Format\n~~~~~~~~~~~~\n\nThis is a very powerful library which supports both ``printf``-like format\nstrings and positional arguments. Its main drawback is performance. According to\nvarious, benchmarks it is much slower than other methods considered here. Boost\nFormat also has excessive build times and severe code bloat issues (see\n`Benchmarks`_).\n\nFastFormat\n~~~~~~~~~~\n\nThis is an interesting library which is fast, safe and has positional arguments.\nHowever, it has significant limitations, citing its author:\n\n    Three features that have no hope of being accommodated within the\n    current design are:\n\n    * Leading zeros (or any other non-space padding)\n    * Octal/hexadecimal encoding\n    * Runtime width/alignment specification\n\nIt is also quite big and has a heavy dependency, STLSoft, which might be too\nrestrictive for using it in some projects.\n\nBoost Spirit.Karma\n~~~~~~~~~~~~~~~~~~\n\nThis is not really a formatting library but I decided to include it here for\ncompleteness. As iostreams, it suffers from the problem of mixing verbatim text\nwith arguments. The library is pretty fast, but slower on integer formatting\nthan ``fmt::format_to`` with format string compilation on Karma's own benchmark,\nsee `Converting a hundred million integers to strings per second\n<http://www.zverovich.net/2020/06/13/fast-int-to-string-revisited.html>`_.\n\nLicense\n-------\n\n{fmt} is distributed under the MIT `license\n<https://github.com/fmtlib/fmt/blob/master/LICENSE.rst>`_.\n\nDocumentation License\n---------------------\n\nThe `Format String Syntax <https://fmt.dev/latest/syntax.html>`_\nsection in the documentation is based on the one from Python `string module\ndocumentation <https://docs.python.org/3/library/string.html#module-string>`_.\nFor this reason the documentation is distributed under the Python Software\nFoundation license available in `doc/python-license.txt\n<https://raw.github.com/fmtlib/fmt/master/doc/python-license.txt>`_.\nIt only applies if you distribute the documentation of {fmt}.\n\nMaintainers\n-----------\n\nThe {fmt} library is maintained by Victor Zverovich (`vitaut\n<https://github.com/vitaut>`_) and Jonathan Müller (`foonathan\n<https://github.com/foonathan>`_) with contributions from many other people.\nSee `Contributors <https://github.com/fmtlib/fmt/graphs/contributors>`_ and\n`Releases <https://github.com/fmtlib/fmt/releases>`_ for some of the names.\nLet us know if your contribution is not listed or mentioned incorrectly and\nwe'll make it right.\n"
  },
  {
    "path": "examples/libraries/fmt/doc/CMakeLists.txt",
    "content": "find_program(DOXYGEN doxygen)\nif (NOT DOXYGEN)\n  message(STATUS \"Target 'doc' disabled (requires doxygen)\")\n  return ()\nendif ()\n\nfind_package(PythonInterp QUIET REQUIRED)\n\nadd_custom_target(doc\n  COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/build.py\n                               ${FMT_VERSION}\n  SOURCES api.rst syntax.rst usage.rst build.py conf.py _templates/layout.html)\n\ninclude(GNUInstallDirs)\ninstall(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/\n        DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/fmt OPTIONAL\n        PATTERN \".doctrees\" EXCLUDE)\n"
  },
  {
    "path": "examples/libraries/fmt/doc/_static/breathe.css",
    "content": "\n/* -- breathe specific styles ----------------------------------------------- */\n\n/* So enum value descriptions are displayed inline to the item */\n.breatheenumvalues li tt + p {\n  display: inline;\n}\n\n/* So parameter descriptions are displayed inline to the item */\n.breatheparameterlist li tt + p {\n  display: inline;\n}\n\n.container .breathe-sectiondef {\n  width: inherit;\n}\n\n.github-btn {\n  border: 0;\n  overflow: hidden;\n}\n\n.jumbotron {\n  background-size: 100% 4px;\n  background-repeat: repeat-y;\n  color: white;\n  text-align: center;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/_templates/layout.html",
    "content": "{% extends \"!layout.html\" %}\n\n{% block extrahead %}\n<meta name=\"description\" content=\"Small, safe and fast formatting library\">\n<meta name=\"keywords\" content=\"C++, formatting, printf, string, library\">\n<meta name=\"author\" content=\"Victor Zverovich\">\n<link rel=\"stylesheet\" href=\"_static/fmt.css\">\n{# Google Analytics #}\n<script async src=\"https://www.googletagmanager.com/gtag/js?id=UA-20116650-4\"></script>\n<script>\n  window.dataLayer = window.dataLayer || [];\n  function gtag(){dataLayer.push(arguments);}\n  gtag('js', new Date());\n\n  gtag('config', 'UA-20116650-4');\n</script>\n{% endblock %}\n\n{%- macro searchform(classes, button) %}\n<form class=\"{{classes}}\" role=\"search\" action=\"{{ pathto('search') }}\"\n      method=\"get\">\n  <div class=\"form-group\">\n    <input type=\"text\" name=\"q\" class=\"form-control\"\n           {{ 'placeholder=\"Search\"' if not button }} >\n  </div>\n  <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n  <input type=\"hidden\" name=\"area\" value=\"default\" />\n  {% if button %}\n    <input type=\"submit\" class=\"btn btn-default\" value=\"search\">\n  {% endif %}\n</form>\n{%- endmacro %}\n\n{% block header %}\n<nav class=\"navbar navbar-inverse\">\n  <div class=\"tb-container\">\n    <div class=\"row\">\n      <div class=\"navbar-content\">\n        {# Brand and toggle get grouped for better mobile display #}\n        <div class=\"navbar-header\">\n          <button type=\"button\" class=\"navbar-toggle collapsed\"\n                  data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n            <span class=\"sr-only\">Toggle navigation</span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n          <a class=\"navbar-brand\" href=\"index.html\">{fmt}</a>\n        </div>\n\n        {# Collect the nav links, forms, and other content for toggling #}\n        <div class=\"collapse navbar-collapse\">\n          <ul class=\"nav navbar-nav\">\n            <li class=\"dropdown\">\n              <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\"\n                 role=\"button\" aria-expanded=\"false\">{{ version }}\n                <span class=\"caret\"></span></a>\n              <ul class=\"dropdown-menu\" role=\"menu\">\n                {% for v in versions.split(',') %}\n                <li><a href=\"https://fmt.dev/{{v}}\">{{v}}</a></li>\n                {% endfor %}\n              </ul>\n            </li>\n            {% for name in ['Contents', 'Usage', 'API', 'Syntax'] %}\n              {% if pagename == name.lower() %}\n              <li class=\"active\"><a href=\"{{name.lower()}}.html\">{{name}}\n                <span class=\"sr-only\">(current)</span></a></li>\n              {%else%}\n              <li><a href=\"{{name.lower()}}.html\">{{name}}</a></li>\n              {%endif%}\n            {% endfor %}\n          </ul>\n          {% if pagename != 'search' %}\n            {{ searchform('navbar-form navbar-right', False) }}\n          {%endif%}\n        </div> {# /.navbar-collapse #}\n      </div> {# /.col-md-offset-2 #}\n    </div> {# /.row #}\n  </div> {# /.tb-container #}\n</nav>\n{% if pagename == \"index\" %}\n{% set download_url = 'https://github.com/fmtlib/fmt/releases/download' %}\n<div class=\"jumbotron\">\n  <div class=\"tb-container\">\n    <h1>{fmt}</h1>\n    <p class=\"lead\">A modern formatting library</p>\n    <div class=\"btn-group\" role=\"group\">\n      {% set name = 'fmt' if version.split('.')[0]|int >= 3 else 'cppformat' %}\n      <a class=\"btn btn-success\"\n         href=\"{{download_url}}/{{version}}/{{name}}-{{version}}.zip\">\n           <span class=\"glyphicon glyphicon-download\"></span> Download\n      </a>\n      <button type=\"button\" class=\"btn btn-success dropdown-toggle\"\n        data-toggle=\"dropdown\"><span class=\"caret\"></span></button>\n      <ul class=\"dropdown-menu\">\n      {% for v in versions.split(',') %}\n      {% set name = 'fmt' if v.split('.')[0]|int >= 3 else 'cppformat' %}\n        <li><a href=\"{{download_url}}/{{v}}/{{name}}-{{v}}.zip\">Version {{v}}\n          </a></li>\n      {% endfor %}\n      </ul>\n    </div>\n  </div>\n</div>\n{% endif %}\n{% endblock %}\n\n{# Disable relbars. #}\n{% block relbar1 %}\n{% endblock %}\n{% block relbar2 %}\n{% endblock %}\n\n{% block content %}\n<div class=\"tb-container\">\n  <div class=\"row\">\n    {# Sidebar is currently disabled.\n    <div class=\"bs-sidebar\">\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n          {%- block sidebarlogo %}\n          {%- if logo %}\n            <p class=\"logo\"><a href=\"{{ pathto(master_doc) }}\">\n              <img class=\"logo\" src=\"{{ pathto('_static/' + logo, 1) }}\"\n                   alt=\"Logo\"/>\n            </a></p>\n          {%- endif %}\n          {%- endblock %}\n          {%- for sidebartemplate in sidebars %}\n          {%- include sidebartemplate %}\n          {%- endfor %}\n        </div>\n      </div>\n    </div>\n    #}\n\n    <div class=\"content\">\n      {% block body %} {% endblock %}\n    </div>\n  </div>\n</div>\n{% endblock %}\n\n{% block footer %}\n{{ super() }}\n{# Placed at the end of the document so the pages load faster. #}\n<script src=\"_static/bootstrap.min.js\"></script>\n{% endblock %}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/_templates/search.html",
    "content": "{#\n    basic/search.html\n    ~~~~~~~~~~~~~~~~~\n\n    Template for the search page.\n\n    :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS.\n    :license: BSD, see LICENSE for details.\n#}\n{%- extends \"layout.html\" %}\n{% set title = _('Search') %}\n{% set script_files = script_files + ['_static/searchtools.js'] %}\n{% block extrahead %}\n  <script type=\"text/javascript\">\n    jQuery(function() { Search.loadIndex(\"{{ pathto('searchindex.js', 1) }}\"); });\n  </script>\n  {# this is used when loading the search index using $.ajax fails,\n     such as on Chrome for documents on localhost #}\n  <script type=\"text/javascript\" id=\"searchindexloader\"></script>\n  {{ super() }}\n{% endblock %}\n{% block body %}\n  <h1 id=\"search-documentation\">{{ _('Search') }}</h1>\n  <div id=\"fallback\" class=\"admonition warning\">\n  <script type=\"text/javascript\">$('#fallback').hide();</script>\n  <p>\n    {% trans %}Please activate JavaScript to enable the search\n    functionality.{% endtrans %}\n  </p>\n  </div>\n  <p>\n    {% trans %}From here you can search these documents. Enter your search\n    words into the box below and click \"search\". Note that the search\n    function will automatically search for all of the words. Pages\n    containing fewer words won't appear in the result list.{% endtrans %}\n  </p>\n  {{ searchform('form-inline', True) }}\n  {% if search_performed %}\n    <h2>{{ _('Search Results') }}</h2>\n    {% if not search_results %}\n      <p>{{ _('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\\'ve selected enough categories.') }}</p>\n    {% endif %}\n  {% endif %}\n  <div id=\"search-results\">\n  {% if search_results %}\n    <ul>\n    {% for href, caption, context in search_results %}\n      <li><a href=\"{{ pathto(item.href) }}\">{{ caption }}</a>\n        <div class=\"context\">{{ context|e }}</div>\n      </li>\n    {% endfor %}\n    </ul>\n  {% endif %}\n  </div>\n{% endblock %}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/api.rst",
    "content": ".. _string-formatting-api:\n\n*************\nAPI Reference\n*************\n\nThe {fmt} library API consists of the following parts:\n\n* :ref:`fmt/core.h <core-api>`: the core API providing main formatting functions\n  for ``char``/UTF-8 with compile-time checks and minimal dependencies\n* :ref:`fmt/format.h <format-api>`: the full format API providing additional\n  formatting functions and locale support\n* :ref:`fmt/ranges.h <ranges-api>`: formatting of ranges and tuples\n* :ref:`fmt/chrono.h <chrono-api>`: date and time formatting\n* :ref:`fmt/compile.h <compile-api>`: format string compilation\n* :ref:`fmt/color.h <color-api>`: terminal color and text style\n* :ref:`fmt/os.h <os-api>`: system APIs\n* :ref:`fmt/ostream.h <ostream-api>`: ``std::ostream`` support\n* :ref:`fmt/printf.h <printf-api>`: ``printf`` formatting\n* :ref:`fmt/xchar.h <xchar-api>`: optional ``wchar_t`` support \n\nAll functions and types provided by the library reside in namespace ``fmt`` and\nmacros have prefix ``FMT_``.\n\n.. _core-api:\n\nCore API\n========\n\n``fmt/core.h`` defines the core API which provides main formatting functions for\n``char``/UTF-8 with compile-time checks. It has minimal include dependencies for\nbetter compile times. This header is only beneficial when using {fmt} as a\nlibrary and not in the header-only mode.\n\nThe following functions use :ref:`format string syntax <syntax>`\nsimilar to that of Python's `str.format\n<https://docs.python.org/3/library/stdtypes.html#str.format>`_.\nThey take *fmt* and *args* as arguments.\n\n*fmt* is a format string that contains literal text and replacement\nfields surrounded by braces ``{}``. The fields are replaced with formatted\narguments in the resulting string. A function taking *fmt* doesn't\nparticipate in an overload resolution if the latter is not a string.\n\n*args* is an argument list representing objects to be formatted.\n\n.. _format:\n\n.. doxygenfunction:: format(format_string<T...> fmt, T&&... args) -> std::string\n.. doxygenfunction:: vformat(string_view fmt, format_args args) -> std::string\n\n.. doxygenfunction:: format_to(OutputIt out, format_string<T...> fmt, T&&... args) -> OutputIt\n.. doxygenfunction:: format_to_n(OutputIt out, size_t n, format_string<T...> fmt, const T&... args) -> format_to_n_result<OutputIt>\n.. doxygenfunction:: formatted_size(format_string<T...> fmt, T&&... args) -> size_t\n\n.. doxygenstruct:: fmt::format_to_n_result\n   :members:\n\n.. _print:\n\n.. doxygenfunction:: fmt::print(format_string<T...> fmt, T&&... args)\n.. doxygenfunction:: vprint(string_view fmt, format_args args)\n\n.. doxygenfunction:: print(std::FILE *f, format_string<T...> fmt, T&&... args)\n.. doxygenfunction:: vprint(std::FILE *f, string_view fmt, format_args args)\n\nCompile-time Format String Checks\n---------------------------------\n\nCompile-time checks are enabled when using ``FMT_STRING``. They support built-in\nand string types as well as user-defined types with ``constexpr`` ``parse``\nfunctions in their ``formatter`` specializations.\n\n.. doxygendefine:: FMT_STRING\n\nTo force the use of compile-time checks, define the preprocessor variable\n``FMT_ENFORCE_COMPILE_STRING``. When set, functions accepting ``FMT_STRING``\nwill fail to compile with regular strings. Runtime-checked\nformatting is still possible using ``fmt::vformat``, ``fmt::vprint``, etc.\n\nNamed Arguments\n---------------\n\n.. doxygenfunction:: fmt::arg(const S&, const T&)\n\nNamed arguments are not supported in compile-time checks at the moment.\n\nArgument Lists\n--------------\n\nYou can create your own formatting function with compile-time checks and small\nbinary footprint, for example (https://godbolt.org/z/oba4Mc):\n\n.. code:: c++\n\n    #include <fmt/format.h>\n\n    void vlog(const char* file, int line, fmt::string_view format,\n              fmt::format_args args) {\n      fmt::print(\"{}: {}: \", file, line);\n      fmt::vprint(format, args);\n    }\n\n    template <typename S, typename... Args>\n    void log(const char* file, int line, const S& format, Args&&... args) {\n      vlog(file, line, format,\n          fmt::make_args_checked<Args...>(format, args...));\n    }\n\n    #define MY_LOG(format, ...) \\\n      log(__FILE__, __LINE__, FMT_STRING(format), __VA_ARGS__)\n\n    MY_LOG(\"invalid squishiness: {}\", 42);\n\nNote that ``vlog`` is not parameterized on argument types which improves compile\ntimes and reduces binary code size compared to a fully parameterized version.\n\n.. doxygenfunction:: fmt::make_args_checked(const S&, const remove_reference_t<Args>&...)\n\n.. doxygenfunction:: fmt::make_format_args(const Args&...)\n\n.. doxygenclass:: fmt::format_arg_store\n   :members:\n\n.. doxygenclass:: fmt::dynamic_format_arg_store\n   :members:\n\n.. doxygenclass:: fmt::basic_format_args\n   :members:\n\n.. doxygentypedef:: fmt::format_args\n\n.. doxygenclass:: fmt::basic_format_arg\n   :members:\n\n.. doxygenclass:: fmt::basic_format_context\n   :members:\n\n.. doxygentypedef:: fmt::format_context\n\nCompatibility\n-------------\n\n.. doxygenclass:: fmt::basic_string_view\n   :members:\n\n.. doxygentypedef:: fmt::string_view\n\nLocale\n------\n\nAll formatting is locale-independent by default. Use the ``'L'`` format\nspecifier to insert the appropriate number separator characters from the\nlocale::\n\n  #include <fmt/core.h>\n  #include <locale>\n\n  std::locale::global(std::locale(\"en_US.UTF-8\"));\n  auto s = fmt::format(\"{:L}\", 1000000);  // s == \"1,000,000\"\n\n.. _format-api:\n\nFormat API\n==========\n\n``fmt/format.h`` defines the full format API providing additional formatting\nfunctions and locale support.\n\n.. _udt:\n\nFormatting User-defined Types\n-----------------------------\n\nTo make a user-defined type formattable, specialize the ``formatter<T>`` struct\ntemplate and implement ``parse`` and ``format`` methods::\n\n  #include <fmt/format.h>\n\n  struct point { double x, y; };\n\n  template <> struct fmt::formatter<point> {\n    // Presentation format: 'f' - fixed, 'e' - exponential.\n    char presentation = 'f';\n\n    // Parses format specifications of the form ['f' | 'e'].\n    constexpr auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {\n      // [ctx.begin(), ctx.end()) is a character range that contains a part of\n      // the format string starting from the format specifications to be parsed,\n      // e.g. in\n      //\n      //   fmt::format(\"{:f} - point of interest\", point{1, 2});\n      //\n      // the range will contain \"f} - point of interest\". The formatter should\n      // parse specifiers until '}' or the end of the range. In this example\n      // the formatter should parse the 'f' specifier and return an iterator\n      // pointing to '}'.\n\n      // Parse the presentation format and store it in the formatter:\n      auto it = ctx.begin(), end = ctx.end();\n      if (it != end && (*it == 'f' || *it == 'e')) presentation = *it++;\n\n      // Check if reached the end of the range:\n      if (it != end && *it != '}')\n        throw format_error(\"invalid format\");\n\n      // Return an iterator past the end of the parsed range:\n      return it;\n    }\n\n    // Formats the point p using the parsed format specification (presentation)\n    // stored in this formatter.\n    template <typename FormatContext>\n    auto format(const point& p, FormatContext& ctx) -> decltype(ctx.out()) {\n      // ctx.out() is an output iterator to write to.\n      return format_to(\n          ctx.out(),\n          presentation == 'f' ? \"({:.1f}, {:.1f})\" : \"({:.1e}, {:.1e})\",\n          p.x, p.y);\n    }\n  };\n\nThen you can pass objects of type ``point`` to any formatting function::\n\n  point p = {1, 2};\n  std::string s = fmt::format(\"{:f}\", p);\n  // s == \"(1.0, 2.0)\"\n\nYou can also reuse existing formatters via inheritance or composition, for\nexample::\n\n  enum class color {red, green, blue};\n\n  template <> struct fmt::formatter<color>: formatter<string_view> {\n    // parse is inherited from formatter<string_view>.\n    template <typename FormatContext>\n    auto format(color c, FormatContext& ctx) {\n      string_view name = \"unknown\";\n      switch (c) {\n      case color::red:   name = \"red\"; break;\n      case color::green: name = \"green\"; break;\n      case color::blue:  name = \"blue\"; break;\n      }\n      return formatter<string_view>::format(name, ctx);\n    }\n  };\n\nSince ``parse`` is inherited from ``formatter<string_view>`` it will recognize\nall string format specifications, for example\n\n.. code-block:: c++\n\n   fmt::format(\"{:>10}\", color::blue)\n\nwill return ``\"      blue\"``.\n\nYou can also write a formatter for a hierarchy of classes::\n\n  #include <type_traits>\n  #include <fmt/format.h>\n\n  struct A {\n    virtual ~A() {}\n    virtual std::string name() const { return \"A\"; }\n  };\n\n  struct B : A {\n    virtual std::string name() const { return \"B\"; }\n  };\n\n  template <typename T>\n  struct fmt::formatter<T, std::enable_if_t<std::is_base_of<A, T>::value, char>> :\n      fmt::formatter<std::string> {\n    template <typename FormatCtx>\n    auto format(const A& a, FormatCtx& ctx) {\n      return fmt::formatter<std::string>::format(a.name(), ctx);\n    }\n  };\n\n  int main() {\n    B b;\n    A& a = b;\n    fmt::print(\"{}\", a); // prints \"B\"\n  }\n\nIf a type provides both a ``formatter`` specialization and an implicit\nconversion to a formattable type, the specialization takes precedence over the\nconversion.\n\n.. doxygenclass:: fmt::basic_format_parse_context\n   :members:\n\nLiteral-based API\n-----------------\n\nThe following user-defined literals are defined in ``fmt/format.h``.\n\n.. doxygenfunction:: operator\"\"_format(const char *s, size_t n) -> detail::udl_formatter<char> \n\n.. doxygenfunction:: operator\"\"_a(const char *s, size_t) -> detail::udl_arg<char>\n\nUtilities\n---------\n\n.. doxygenfunction:: fmt::ptr(T p) -> const void*\n.. doxygenfunction:: fmt::ptr(const std::unique_ptr<T> &p) -> const void*\n.. doxygenfunction:: fmt::ptr(const std::shared_ptr<T> &p) -> const void*\n\n.. doxygenfunction:: fmt::to_string(const T &value) -> std::string\n\n.. doxygenfunction:: fmt::to_string_view(const Char *s) -> basic_string_view<Char>\n\n.. doxygenfunction:: fmt::join(Range &&range, string_view sep) -> join_view<detail::iterator_t<Range>, detail::sentinel_t<Range>>\n\n.. doxygenfunction:: fmt::join(It begin, Sentinel end, string_view sep) -> join_view<It, Sentinel>\n\n.. doxygenclass:: fmt::detail::buffer\n   :members:\n\n.. doxygenclass:: fmt::basic_memory_buffer\n   :protected-members:\n   :members:\n\nSystem Errors\n-------------\n\n{fmt} does not use ``errno`` to communicate errors to the user, but it may call\nsystem functions which set ``errno``. Users should not make any assumptions\nabout the value of ``errno`` being preserved by library functions.\n\n.. doxygenfunction:: fmt::system_error\n\n.. doxygenfunction:: fmt::format_system_error\n\nCustom Allocators\n-----------------\n\nThe {fmt} library supports custom dynamic memory allocators.\nA custom allocator class can be specified as a template argument to\n:class:`fmt::basic_memory_buffer`::\n\n    using custom_memory_buffer = \n      fmt::basic_memory_buffer<char, fmt::inline_buffer_size, custom_allocator>;\n\nIt is also possible to write a formatting function that uses a custom\nallocator::\n\n    using custom_string =\n      std::basic_string<char, std::char_traits<char>, custom_allocator>;\n\n    custom_string vformat(custom_allocator alloc, fmt::string_view format_str,\n                          fmt::format_args args) {\n      custom_memory_buffer buf(alloc);\n      fmt::vformat_to(buf, format_str, args);\n      return custom_string(buf.data(), buf.size(), alloc);\n    }\n\n    template <typename ...Args>\n    inline custom_string format(custom_allocator alloc,\n                                fmt::string_view format_str,\n                                const Args& ... args) {\n      return vformat(alloc, format_str, fmt::make_format_args(args...));\n    }\n\nThe allocator will be used for the output container only. Formatting functions\nnormally don't do any allocations for built-in and string types except for\nnon-default floating-point formatting that occasionally falls back on\n``sprintf``.\n\n.. _ranges-api:\n\nRanges and Tuple Formatting\n===========================\n\nThe library also supports convenient formatting of ranges and tuples::\n\n  #include <fmt/ranges.h>\n\n  std::tuple<char, int, float> t{'a', 1, 2.0f};\n  // Prints \"('a', 1, 2.0)\"\n  fmt::print(\"{}\", t);\n\n\nNOTE: currently, the overload of ``fmt::join`` for iterables exists in the main\n``format.h`` header, but expect this to change in the future.\n\nUsing ``fmt::join``, you can separate tuple elements with a custom separator::\n\n  #include <fmt/ranges.h>\n\n  std::tuple<int, char> t = {1, 'a'};\n  // Prints \"1, a\"\n  fmt::print(\"{}\", fmt::join(t, \", \"));\n\n.. _chrono-api:\n\nDate and Time Formatting\n========================\n\n``fmt/chrono.h`` provides formatters for\n\n* `std::chrono::duration <https://en.cppreference.com/w/cpp/chrono/duration>`_\n* `std::chrono::time_point\n  <https://en.cppreference.com/w/cpp/chrono/time_point>`_\n* `std::tm <https://en.cppreference.com/w/cpp/chrono/c/tm>`_\n\nThe format syntax is described in :ref:`chrono-specs`.\n\n**Example**::\n\n  #include <fmt/chrono.h>\n\n  int main() {\n    std::time_t t = std::time(nullptr);\n\n    // Prints \"The date is 2020-11-07.\" (with the current date):\n    fmt::print(\"The date is {:%Y-%m-%d}.\", fmt::localtime(t));\n\n    using namespace std::literals::chrono_literals;\n\n    // Prints \"Default format: 42s 100ms\":\n    fmt::print(\"Default format: {} {}\\n\", 42s, 100ms);\n\n    // Prints \"strftime-like format: 03:15:30\":\n    fmt::print(\"strftime-like format: {:%H:%M:%S}\\n\", 3h + 15min + 30s);\n  }\n\n.. doxygenfunction:: localtime(std::time_t time)\n\n.. doxygenfunction:: gmtime(std::time_t time)\n\n.. _compile-api:\n\nFormat string compilation\n=========================\n\n``fmt/compile.h`` provides format string compilation support when using\n``FMT_COMPILE``. Format strings are parsed, checked and converted into efficient\nformatting code at compile-time. This supports arguments of built-in and string\ntypes as well as user-defined types with ``constexpr`` ``parse`` functions in\ntheir ``formatter`` specializations. Format string compilation can generate more\nbinary code compared to the default API and is only recommended in places where\nformatting is a performance bottleneck.\n\n.. doxygendefine:: FMT_COMPILE\n\n.. _color-api:\n\nTerminal color and text style\n=============================\n\n``fmt/color.h`` provides support for terminal color and text style output.\n\n.. doxygenfunction:: print(const text_style &ts, const S &format_str, const Args&... args)\n\n.. doxygenfunction:: fg(detail::color_type)\n\n.. doxygenfunction:: bg(detail::color_type)\n\n.. _os-api:\n\nSystem APIs\n===========\n\n.. doxygenclass:: fmt::ostream\n   :members:\n\n.. doxygenfunction:: fmt::windows_error\n   :members:\n\n.. _ostream-api:\n\n``std::ostream`` Support\n========================\n\n``fmt/ostream.h`` provides ``std::ostream`` support including formatting of\nuser-defined types that have an overloaded insertion operator (``operator<<``)::\n\n  #include <fmt/ostream.h>\n\n  class date {\n    int year_, month_, day_;\n  public:\n    date(int year, int month, int day): year_(year), month_(month), day_(day) {}\n\n    friend std::ostream& operator<<(std::ostream& os, const date& d) {\n      return os << d.year_ << '-' << d.month_ << '-' << d.day_;\n    }\n  };\n\n  std::string s = fmt::format(\"The date is {}\", date(2012, 12, 9));\n  // s == \"The date is 2012-12-9\"\n\n{fmt} only supports insertion operators that are defined in the same namespaces\nas the types they format and can be found with the argument-dependent lookup.\n\n.. doxygenfunction:: print(std::basic_ostream<Char> &os, const S &format_str, Args&&... args)\n\n.. _printf-api:\n\n``printf`` Formatting\n=====================\n\nThe header ``fmt/printf.h`` provides ``printf``-like formatting functionality.\nThe following functions use `printf format string syntax\n<https://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html>`_ with\nthe POSIX extension for positional arguments. Unlike their standard\ncounterparts, the ``fmt`` functions are type-safe and throw an exception if an\nargument type doesn't match its format specification.\n\n.. doxygenfunction:: printf(const S &format_str, const T&... args)\n\n.. doxygenfunction:: fprintf(std::FILE *f, const S &fmt, const T&... args) -> int\n\n.. doxygenfunction:: sprintf(const S&, const T&...)\n\n.. _xchar-api:\n\n``wchar_t`` Support\n===================\n\nThe optional header ``fmt/wchar_t.h`` provides support for ``wchar_t`` and\nexotic character types.\n\n.. doxygenstruct:: fmt::is_char\n\n.. doxygentypedef:: fmt::wstring_view\n\n.. doxygentypedef:: fmt::wformat_context\n\n.. doxygenfunction:: fmt::to_wstring(const T &value)\n\nCompatibility with C++20 ``std::format``\n========================================\n\n{fmt} implements nearly all of the `C++20 formatting library\n<https://en.cppreference.com/w/cpp/utility/format>`_ with the following\ndifferences:\n\n* Names are defined in the ``fmt`` namespace instead of ``std`` to avoid\n  collisions with standard library implementations.\n* Width calculation doesn't use grapheme clusterization. The latter has been\n  implemented in a separate branch but hasn't been integrated yet.\n* Most C++20 chrono types are not supported yet.\n"
  },
  {
    "path": "examples/libraries/fmt/doc/basic-bootstrap/README",
    "content": "Sphinx basic theme with Bootstrap support. Modifications are kept to\na minimum to simplify integration in case of changes to Sphinx theming.\n"
  },
  {
    "path": "examples/libraries/fmt/doc/basic-bootstrap/layout.html",
    "content": "{#\n    basic/layout.html\n    ~~~~~~~~~~~~~~~~~\n\n    Master layout template for Sphinx themes.\n\n    :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS.\n    :license: BSD, see LICENSE for details.\n#}\n{%- block doctype -%}\n<!DOCTYPE html>\n{%- endblock %}\n{%- set reldelim1 = reldelim1 is not defined and ' &raquo;' or reldelim1 %}\n{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}\n{%- set render_sidebar = (not embedded) and (not theme_nosidebar|tobool) and\n                         (sidebars != []) %}\n{%- set url_root = pathto('', 1) %}\n{# XXX necessary? #}\n{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}\n{%- if not embedded and docstitle %}\n  {%- set titlesuffix = \" &mdash; \"|safe + docstitle|e %}\n{%- else %}\n  {%- set titlesuffix = \"\" %}\n{%- endif %}\n\n{%- macro relbar() %}\n    <div class=\"related\" role=\"navigation\" aria-label=\"related navigation\">\n      <h3>{{ _('Navigation') }}</h3>\n      <ul>\n        {%- for rellink in rellinks %}\n        <li class=\"right\" {% if loop.first %}style=\"margin-right: 10px\"{% endif %}>\n          <a href=\"{{ pathto(rellink[0]) }}\" title=\"{{ rellink[1]|striptags|e }}\"\n             {{ accesskey(rellink[2]) }}>{{ rellink[3] }}</a>\n          {%- if not loop.first %}{{ reldelim2 }}{% endif %}</li>\n        {%- endfor %}\n        {%- block rootrellink %}\n        <li class=\"nav-item nav-item-0\"><a href=\"{{ pathto(master_doc) }}\">{{ shorttitle|e }}</a>{{ reldelim1 }}</li>\n        {%- endblock %}\n        {%- for parent in parents %}\n          <li class=\"nav-item nav-item-{{ loop.index }}\"><a href=\"{{ parent.link|e }}\" {% if loop.last %}{{ accesskey(\"U\") }}{% endif %}>{{ parent.title }}</a>{{ reldelim1 }}</li>\n        {%- endfor %}\n        {%- block relbaritems %} {% endblock %}\n      </ul>\n    </div>\n{%- endmacro %}\n\n{%- macro sidebar() %}\n      {%- if render_sidebar %}\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n          {%- block sidebarlogo %}\n          {%- if logo %}\n            <p class=\"logo\"><a href=\"{{ pathto(master_doc) }}\">\n              <img class=\"logo\" src=\"{{ pathto('_static/' + logo, 1) }}\" alt=\"Logo\"/>\n            </a></p>\n          {%- endif %}\n          {%- endblock %}\n          {%- if sidebars != None %}\n            {#- new style sidebar: explicitly include/exclude templates #}\n            {%- for sidebartemplate in sidebars %}\n            {%- include sidebartemplate %}\n            {%- endfor %}\n          {%- else %}\n            {#- old style sidebars: using blocks -- should be deprecated #}\n            {%- block sidebartoc %}\n            {%- include \"localtoc.html\" %}\n            {%- endblock %}\n            {%- block sidebarrel %}\n            {%- include \"relations.html\" %}\n            {%- endblock %}\n            {%- block sidebarsourcelink %}\n            {%- include \"sourcelink.html\" %}\n            {%- endblock %}\n            {%- if customsidebar %}\n            {%- include customsidebar %}\n            {%- endif %}\n            {%- block sidebarsearch %}\n            {%- include \"searchbox.html\" %}\n            {%- endblock %}\n          {%- endif %}\n        </div>\n      </div>\n      {%- endif %}\n{%- endmacro %}\n\n{%- macro script() %}\n    <script type=\"text/javascript\">\n      var DOCUMENTATION_OPTIONS = {\n        URL_ROOT:    '{{ url_root }}',\n        VERSION:     '{{ release|e }}',\n        COLLAPSE_INDEX: false,\n        FILE_SUFFIX: '{{ '' if no_search_suffix else file_suffix }}',\n        HAS_SOURCE:  {{ has_source|lower }},\n        SOURCELINK_SUFFIX:  '{{ sourcelink_suffix }}'\n      };\n    </script>\n    {%- for scriptfile in script_files %}\n    <script type=\"text/javascript\" src=\"{{ pathto(scriptfile, 1) }}\"></script>\n    {%- endfor %}\n{%- endmacro %}\n\n{%- macro css() %}\n    <link rel=\"stylesheet\" href=\"{{ pathto('_static/' + style, 1) }}\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"{{ pathto('_static/pygments.css', 1) }}\" type=\"text/css\" />\n    {%- for cssfile in css_files %}\n    <link rel=\"stylesheet\" href=\"{{ pathto(cssfile, 1) }}\" type=\"text/css\" />\n    {%- endfor %}\n{%- endmacro %}\n\n<html lang=\"en\">\n  <head>\n    <meta charset=\"{{ encoding }}\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    {# The above 3 meta tags *must* come first in the head; any other head content\n       must come *after* these tags. #}\n    {{ metatags }}\n    {%- block htmltitle %}\n    <title>{{ title|striptags|e }}{{ titlesuffix }}</title>\n    {%- endblock %}\n    {{ css() }}\n    {%- if not embedded %}\n    {{ script() }}\n    {%- if use_opensearch %}\n    <link rel=\"search\" type=\"application/opensearchdescription+xml\"\n          title=\"{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}\"\n          href=\"{{ pathto('_static/opensearch.xml', 1) }}\"/>\n    {%- endif %}\n    {%- if favicon %}\n    <link rel=\"shortcut icon\" href=\"{{ pathto('_static/' + favicon, 1) }}\"/>\n    {%- endif %}\n    {%- endif %}\n{%- block linktags %}\n    {%- if hasdoc('about') %}\n    <link rel=\"author\" title=\"{{ _('About these documents') }}\" href=\"{{ pathto('about') }}\" />\n    {%- endif %}\n    {%- if hasdoc('genindex') %}\n    <link rel=\"index\" title=\"{{ _('Index') }}\" href=\"{{ pathto('genindex') }}\" />\n    {%- endif %}\n    {%- if hasdoc('search') %}\n    <link rel=\"search\" title=\"{{ _('Search') }}\" href=\"{{ pathto('search') }}\" />\n    {%- endif %}\n    {%- if hasdoc('copyright') %}\n    <link rel=\"copyright\" title=\"{{ _('Copyright') }}\" href=\"{{ pathto('copyright') }}\" />\n    {%- endif %}\n    {%- if parents %}\n    <link rel=\"up\" title=\"{{ parents[-1].title|striptags|e }}\" href=\"{{ parents[-1].link|e }}\" />\n    {%- endif %}\n    {%- if next %}\n    <link rel=\"next\" title=\"{{ next.title|striptags|e }}\" href=\"{{ next.link|e }}\" />\n    {%- endif %}\n    {%- if prev %}\n    <link rel=\"prev\" title=\"{{ prev.title|striptags|e }}\" href=\"{{ prev.link|e }}\" />\n    {%- endif %}\n{%- endblock %}\n{%- block extrahead %} {% endblock %}\n  </head>\n  <body role=\"document\">\n{%- block header %}{% endblock %}\n\n{%- block relbar1 %}{{ relbar() }}{% endblock %}\n\n{%- block content %}\n  {%- block sidebar1 %} {# possible location for sidebar #} {% endblock %}\n\n    <div class=\"document\">\n  {%- block document %}\n      <div class=\"documentwrapper\">\n      {%- if render_sidebar %}\n        <div class=\"bodywrapper\">\n      {%- endif %}\n          <div class=\"body\" role=\"main\">\n            {% block body %} {% endblock %}\n          </div>\n      {%- if render_sidebar %}\n        </div>\n      {%- endif %}\n      </div>\n  {%- endblock %}\n\n  {%- block sidebar2 %}{{ sidebar() }}{% endblock %}\n      <div class=\"clearer\"></div>\n    </div>\n{%- endblock %}\n\n{%- block relbar2 %}{{ relbar() }}{% endblock %}\n\n{%- block footer %}\n    <div class=\"footer\" role=\"contentinfo\">\n    {%- if show_copyright %}\n      {%- if hasdoc('copyright') %}\n        {% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href=\"{{ path }}\">Copyright</a> {{ copyright }}.{% endtrans %}\n      {%- else %}\n        {% trans copyright=copyright|e %}&copy; Copyright {{ copyright }}.{% endtrans %}\n      {%- endif %}\n    {%- endif %}\n    {%- if last_updated %}\n      {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}\n    {%- endif %}\n    {%- if show_sphinx %}\n      {% trans sphinx_version=sphinx_version|e %}Created using <a href=\"http://sphinx-doc.org/\">Sphinx</a> {{ sphinx_version }}.{% endtrans %}\n    {%- endif %}\n    </div>\n{%- endblock %}\n  </body>\n</html>\n"
  },
  {
    "path": "examples/libraries/fmt/doc/basic-bootstrap/theme.conf",
    "content": "[theme]\ninherit = basic\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/alerts.less",
    "content": "//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: @alert-padding;\n  margin-bottom: @line-height-computed;\n  border: 1px solid transparent;\n  border-radius: @alert-border-radius;\n\n  // Headings for larger alerts\n  h4 {\n    margin-top: 0;\n    // Specified for the h4 to prevent conflicts of changing @headings-color\n    color: inherit;\n  }\n\n  // Provide class for links that match alerts\n  .alert-link {\n    font-weight: @alert-link-font-weight;\n  }\n\n  // Improve alignment and spacing of inner content\n  > p,\n  > ul {\n    margin-bottom: 0;\n  }\n\n  > p + p {\n    margin-top: 5px;\n  }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n  padding-right: (@alert-padding + 20);\n\n  // Adjust close link position\n  .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n  }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n  .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n  .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n  .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n  .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/badges.less",
    "content": "//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: @font-size-small;\n  font-weight: @badge-font-weight;\n  color: @badge-color;\n  line-height: @badge-line-height;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: @badge-bg;\n  border-radius: @badge-border-radius;\n\n  // Empty badges collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for badges in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n\n  .btn-xs &,\n  .btn-group-xs > .btn & {\n    top: 0;\n    padding: 1px 5px;\n  }\n\n  // Hover state, but only for links\n  a& {\n    &:hover,\n    &:focus {\n      color: @badge-link-hover-color;\n      text-decoration: none;\n      cursor: pointer;\n    }\n  }\n\n  // Account for badges in navs\n  .list-group-item.active > &,\n  .nav-pills > .active > a > & {\n    color: @badge-active-color;\n    background-color: @badge-active-bg;\n  }\n\n  .list-group-item > & {\n    float: right;\n  }\n\n  .list-group-item > & + & {\n    margin-right: 5px;\n  }\n\n  .nav-pills > li > a > & {\n    margin-left: 3px;\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/bootstrap.less",
    "content": "// Core variables and mixins\n@import \"variables.less\";\n@import \"mixins.less\";\n\n// Reset and dependencies\n@import \"normalize.less\";\n@import \"print.less\";\n@import \"glyphicons.less\";\n\n// Core CSS\n@import \"scaffolding.less\";\n@import \"type.less\";\n@import \"code.less\";\n@import \"grid.less\";\n@import \"tables.less\";\n@import \"forms.less\";\n@import \"buttons.less\";\n\n// Components\n@import \"component-animations.less\";\n@import \"dropdowns.less\";\n@import \"button-groups.less\";\n@import \"input-groups.less\";\n@import \"navs.less\";\n@import \"navbar.less\";\n@import \"breadcrumbs.less\";\n@import \"pagination.less\";\n@import \"pager.less\";\n@import \"labels.less\";\n@import \"badges.less\";\n@import \"jumbotron.less\";\n@import \"thumbnails.less\";\n@import \"alerts.less\";\n@import \"progress-bars.less\";\n@import \"media.less\";\n@import \"list-group.less\";\n@import \"panels.less\";\n@import \"responsive-embed.less\";\n@import \"wells.less\";\n@import \"close.less\";\n\n// Components w/ JavaScript\n@import \"modals.less\";\n@import \"tooltip.less\";\n@import \"popovers.less\";\n@import \"carousel.less\";\n\n// Utility classes\n@import \"utilities.less\";\n@import \"responsive-utilities.less\";\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/breadcrumbs.less",
    "content": "//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n  margin-bottom: @line-height-computed;\n  list-style: none;\n  background-color: @breadcrumb-bg;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline-block;\n\n    + li:before {\n      content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n      padding: 0 5px;\n      color: @breadcrumb-color;\n    }\n  }\n\n  > .active {\n    color: @breadcrumb-active-color;\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/button-groups.less",
    "content": "//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n  > .btn {\n    position: relative;\n    float: left;\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      z-index: 2;\n    }\n  }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n  .btn + .btn,\n  .btn + .btn-group,\n  .btn-group + .btn,\n  .btn-group + .btn-group {\n    margin-left: -1px;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  margin-left: -5px; // Offset the first child's margin\n  &:extend(.clearfix all);\n\n  .btn-group,\n  .input-group {\n    float: left;\n  }\n  > .btn,\n  > .btn-group,\n  > .input-group {\n    margin-left: 5px;\n  }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  &:not(:last-child):not(.dropdown-toggle) {\n    .border-right-radius(0);\n  }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-right-radius(0);\n  }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n  .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n  // Show no shadow for `.btn-link` since it has no other button styles.\n  &.btn-link {\n    .box-shadow(none);\n  }\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n  border-width: @caret-width-large @caret-width-large 0;\n  border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n  border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  > .btn,\n  > .btn-group,\n  > .btn-group > .btn {\n    display: block;\n    float: none;\n    width: 100%;\n    max-width: 100%;\n  }\n\n  // Clear floats so dropdown menus can be properly placed\n  > .btn-group {\n    &:extend(.clearfix all);\n    > .btn {\n      float: none;\n    }\n  }\n\n  > .btn + .btn,\n  > .btn + .btn-group,\n  > .btn-group + .btn,\n  > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n  }\n}\n\n.btn-group-vertical > .btn {\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n  &:first-child:not(:last-child) {\n    border-top-right-radius: @border-radius-base;\n    .border-bottom-radius(0);\n  }\n  &:last-child:not(:first-child) {\n    border-bottom-left-radius: @border-radius-base;\n    .border-top-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-bottom-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n  > .btn,\n  > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%;\n  }\n  > .btn-group .btn {\n    width: 100%;\n  }\n\n  > .btn-group .dropdown-menu {\n    left: auto;\n  }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n  > .btn,\n  > .btn-group > .btn {\n    input[type=\"radio\"],\n    input[type=\"checkbox\"] {\n      position: absolute;\n      clip: rect(0,0,0,0);\n      pointer-events: none;\n    }\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/buttons.less",
    "content": "//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0; // For input.btn\n  font-weight: @btn-font-weight;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  white-space: nowrap;\n  .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);\n  .user-select(none);\n\n  &,\n  &:active,\n  &.active {\n    &:focus,\n    &.focus {\n      .tab-focus();\n    }\n  }\n\n  &:hover,\n  &:focus,\n  &.focus {\n    color: @btn-default-color;\n    text-decoration: none;\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n    pointer-events: none; // Future-proof disabling of clicks\n    .opacity(.65);\n    .box-shadow(none);\n  }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n  .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n  .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n  .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n  .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n  .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n  .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n  color: @link-color;\n  font-weight: normal;\n  border-radius: 0;\n\n  &,\n  &:active,\n  &.active,\n  &[disabled],\n  fieldset[disabled] & {\n    background-color: transparent;\n    .box-shadow(none);\n  }\n  &,\n  &:hover,\n  &:focus,\n  &:active {\n    border-color: transparent;\n  }\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: @link-hover-decoration;\n    background-color: transparent;\n  }\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus {\n      color: @btn-link-disabled-color;\n      text-decoration: none;\n    }\n  }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n  // line-height: ensure even-numbered height of button next to large input\n  .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n  // line-height: ensure proper height of button next to small input\n  .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n  .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/carousel.less",
    "content": "//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n\n  > .item {\n    display: none;\n    position: relative;\n    .transition(.6s ease-in-out left);\n\n    // Account for jankitude on images\n    > img,\n    > a > img {\n      &:extend(.img-responsive);\n      line-height: 1;\n    }\n\n    // WebKit CSS3 transforms for supported devices\n    @media all and (transform-3d), (-webkit-transform-3d) {\n      .transition-transform(~'0.6s ease-in-out');\n      .backface-visibility(~'hidden');\n      .perspective(1000);\n\n      &.next,\n      &.active.right {\n        .translate3d(100%, 0, 0);\n        left: 0;\n      }\n      &.prev,\n      &.active.left {\n        .translate3d(-100%, 0, 0);\n        left: 0;\n      }\n      &.next.left,\n      &.prev.right,\n      &.active {\n        .translate3d(0, 0, 0);\n        left: 0;\n      }\n    }\n  }\n\n  > .active,\n  > .next,\n  > .prev {\n    display: block;\n  }\n\n  > .active {\n    left: 0;\n  }\n\n  > .next,\n  > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%;\n  }\n\n  > .next {\n    left: 100%;\n  }\n  > .prev {\n    left: -100%;\n  }\n  > .next.left,\n  > .prev.right {\n    left: 0;\n  }\n\n  > .active.left {\n    left: -100%;\n  }\n  > .active.right {\n    left: 100%;\n  }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: @carousel-control-width;\n  .opacity(@carousel-control-opacity);\n  font-size: @carousel-control-font-size;\n  color: @carousel-control-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  // We can't have this transition here because WebKit cancels the carousel\n  // animation if you trip this while in the middle of another animation.\n\n  // Set gradients for backgrounds\n  &.left {\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n  }\n  &.right {\n    left: auto;\n    right: 0;\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n  }\n\n  // Hover/focus state\n  &:hover,\n  &:focus {\n    outline: 0;\n    color: @carousel-control-color;\n    text-decoration: none;\n    .opacity(.9);\n  }\n\n  // Toggles\n  .icon-prev,\n  .icon-next,\n  .glyphicon-chevron-left,\n  .glyphicon-chevron-right {\n    position: absolute;\n    top: 50%;\n    z-index: 5;\n    display: inline-block;\n  }\n  .icon-prev,\n  .glyphicon-chevron-left {\n    left: 50%;\n    margin-left: -10px;\n  }\n  .icon-next,\n  .glyphicon-chevron-right {\n    right: 50%;\n    margin-right: -10px;\n  }\n  .icon-prev,\n  .icon-next {\n    width:  20px;\n    height: 20px;\n    margin-top: -10px;\n    line-height: 1;\n    font-family: serif;\n  }\n\n\n  .icon-prev {\n    &:before {\n      content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n    }\n  }\n  .icon-next {\n    &:before {\n      content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n    }\n  }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n\n  li {\n    display: inline-block;\n    width:  10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    border: 1px solid @carousel-indicator-border-color;\n    border-radius: 10px;\n    cursor: pointer;\n\n    // IE8-9 hack for event handling\n    //\n    // Internet Explorer 8-9 does not support clicks on elements without a set\n    // `background-color`. We cannot use `filter` since that's not viewed as a\n    // background color by the browser. Thus, a hack is needed.\n    // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n    //\n    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n    // set alpha transparency for the best results possible.\n    background-color: #000 \\9; // IE8\n    background-color: rgba(0,0,0,0); // IE9\n  }\n  .active {\n    margin: 0;\n    width:  12px;\n    height: 12px;\n    background-color: @carousel-indicator-active-bg;\n  }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: @carousel-caption-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  & .btn {\n    text-shadow: none; // No shadow for button elements in carousel-caption\n  }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n  // Scale up the controls a smidge\n  .carousel-control {\n    .glyphicon-chevron-left,\n    .glyphicon-chevron-right,\n    .icon-prev,\n    .icon-next {\n      width: 30px;\n      height: 30px;\n      margin-top: -15px;\n      font-size: 30px;\n    }\n    .glyphicon-chevron-left,\n    .icon-prev {\n      margin-left: -15px;\n    }\n    .glyphicon-chevron-right,\n    .icon-next {\n      margin-right: -15px;\n    }\n  }\n\n  // Show and left align the captions\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n\n  // Move up the indicators\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/close.less",
    "content": "//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n  float: right;\n  font-size: (@font-size-base * 1.5);\n  font-weight: @close-font-weight;\n  line-height: 1;\n  color: @close-color;\n  text-shadow: @close-text-shadow;\n  .opacity(.2);\n\n  &:hover,\n  &:focus {\n    color: @close-color;\n    text-decoration: none;\n    cursor: pointer;\n    .opacity(.5);\n  }\n\n  // Additional properties for button version\n  // iOS requires the button element instead of an anchor tag.\n  // If you want the anchor version, it requires `href=\"#\"`.\n  // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n  button& {\n    padding: 0;\n    cursor: pointer;\n    background: transparent;\n    border: 0;\n    -webkit-appearance: none;\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/code.less",
    "content": "//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n  font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @code-color;\n  background-color: @code-bg;\n  border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @kbd-color;\n  background-color: @kbd-bg;\n  border-radius: @border-radius-small;\n  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n  kbd {\n    padding: 0;\n    font-size: 100%;\n    font-weight: bold;\n    box-shadow: none;\n  }\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: ((@line-height-computed - 1) / 2);\n  margin: 0 0 (@line-height-computed / 2);\n  font-size: (@font-size-base - 1); // 14px to 13px\n  line-height: @line-height-base;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: @pre-color;\n  background-color: @pre-bg;\n  border: 1px solid @pre-border-color;\n  border-radius: @border-radius-base;\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: @pre-scrollable-max-height;\n  overflow-y: scroll;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/component-animations.less",
    "content": "//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n  opacity: 0;\n  .transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  display: none;\n\n  &.in      { display: block; }\n  tr&.in    { display: table-row; }\n  tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  .transition-property(~\"height, visibility\");\n  .transition-duration(.35s);\n  .transition-timing-function(ease);\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/dropdowns.less",
    "content": "//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top:   @caret-width-base dashed;\n  border-right: @caret-width-base solid transparent;\n  border-left:  @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n  position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: @zindex-dropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  font-size: @font-size-base;\n  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n  background-color: @dropdown-bg;\n  border: 1px solid @dropdown-fallback-border; // IE8 fallback\n  border: 1px solid @dropdown-border;\n  border-radius: @border-radius-base;\n  .box-shadow(0 6px 12px rgba(0,0,0,.175));\n  background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  //\n  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    .nav-divider(@dropdown-divider-bg);\n  }\n\n  // Links within the dropdown menu\n  > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: @line-height-base;\n    color: @dropdown-link-color;\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\n  }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @dropdown-link-hover-color;\n    background-color: @dropdown-link-hover-bg;\n  }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-active-color;\n    text-decoration: none;\n    outline: 0;\n    background-color: @dropdown-link-active-bg;\n  }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-disabled-color;\n  }\n\n  // Nuke hover/focus effects\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    background-color: transparent;\n    background-image: none; // Remove CSS gradient\n    .reset-filter();\n    cursor: @cursor-disabled;\n  }\n}\n\n// Open state for the dropdown\n.open {\n  // Show the menu\n  > .dropdown-menu {\n    display: block;\n  }\n\n  // Remove the outline when :focus is triggered\n  > a {\n    outline: 0;\n  }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n  left: auto; // Reset the default from `.dropdown-menu`\n  right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: @font-size-small;\n  line-height: @line-height-base;\n  color: @dropdown-header-color;\n  white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    border-top: 0;\n    border-bottom: @caret-width-base solid;\n    content: \"\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 2px;\n  }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-right {\n    .dropdown-menu {\n      .dropdown-menu-right();\n    }\n    // Necessary for overrides of the default right aligned menu.\n    // Will remove come v4 in all likelihood.\n    .dropdown-menu-left {\n      .dropdown-menu-left();\n    }\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/forms.less",
    "content": "//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n  // so we reset that to ensure it behaves more like a standard block element.\n  // See https://github.com/twbs/bootstrap/issues/12359.\n  min-width: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: @line-height-computed;\n  font-size: (@font-size-base * 1.5);\n  line-height: inherit;\n  color: @legend-color;\n  border: 0;\n  border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; // IE8-9\n  line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  .tab-focus();\n}\n\n// Adjust output element\noutput {\n  display: block;\n  padding-top: (@padding-base-vertical + 1);\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n  background-color: @input-bg;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid @input-border;\n  border-radius: @input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  .form-control-focus();\n\n  // Placeholder\n  .placeholder();\n\n  // Disabled and read-only inputs\n  //\n  // HTML5 says that controls under a fieldset > legend:first-child won't be\n  // disabled if the fieldset is disabled. Due to implementation difficulty, we\n  // don't honor that edge case; we style them as disabled anyway.\n  &[disabled],\n  &[readonly],\n  fieldset[disabled] & {\n    background-color: @input-bg-disabled;\n    opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n  }\n\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n  }\n\n  // Reset height for `textarea`s\n  textarea& {\n    height: auto;\n  }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"],\n  input[type=\"time\"],\n  input[type=\"datetime-local\"],\n  input[type=\"month\"] {\n    line-height: @input-height-base;\n\n    &.input-sm,\n    .input-group-sm & {\n      line-height: @input-height-small;\n    }\n\n    &.input-lg,\n    .input-group-lg & {\n      line-height: @input-height-large;\n    }\n  }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n  margin-bottom: @form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n\n  label {\n    min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n    padding-left: 20px;\n    margin-bottom: 0;\n    font-weight: normal;\n    cursor: pointer;\n  }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n  position: relative;\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  &[disabled],\n  &.disabled,\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n  }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n  &.disabled,\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n  }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n  &.disabled,\n  fieldset[disabled] & {\n    label {\n      cursor: @cursor-disabled;\n    }\n  }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n  // Size it appropriately next to real form controls\n  padding-top: (@padding-base-vertical + 1);\n  padding-bottom: (@padding-base-vertical + 1);\n  // Remove default margin from `p`\n  margin-bottom: 0;\n  min-height: (@line-height-computed + @font-size-base);\n\n  &.input-lg,\n  &.input-sm {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n.input-sm {\n  .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n}\n.form-group-sm {\n  .form-control {\n    .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n  }\n  .form-control-static {\n    height: @input-height-small;\n    padding: @padding-small-vertical @padding-small-horizontal;\n    font-size: @font-size-small;\n    line-height: @line-height-small;\n    min-height: (@line-height-computed + @font-size-small);\n  }\n}\n\n.input-lg {\n  .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n}\n.form-group-lg {\n  .form-control {\n    .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n  }\n  .form-control-static {\n    height: @input-height-large;\n    padding: @padding-large-vertical @padding-large-horizontal;\n    font-size: @font-size-large;\n    line-height: @line-height-large;\n    min-height: (@line-height-computed + @font-size-large);\n  }\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n  // Enable absolute positioning\n  position: relative;\n\n  // Ensure icons don't overlap text\n  .form-control {\n    padding-right: (@input-height-base * 1.25);\n  }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2; // Ensure icon is above input groups\n  display: block;\n  width: @input-height-base;\n  height: @input-height-base;\n  line-height: @input-height-base;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n  width: @input-height-large;\n  height: @input-height-large;\n  line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback {\n  width: @input-height-small;\n  height: @input-height-small;\n  line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n  .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n  .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n  .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n  & ~ .form-control-feedback {\n     top: (@line-height-computed + 5); // Height of the `label` and its margin\n  }\n  &.sr-only ~ .form-control-feedback {\n     top: 0;\n  }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n  display: block; // account for any element using help-block\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n  // Kick in the inline\n  @media (min-width: @screen-sm-min) {\n    // Inline-block all the things for \"inline\"\n    .form-group {\n      display: inline-block;\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // In navbar-form, allow folks to *not* use `.form-group`\n    .form-control {\n      display: inline-block;\n      width: auto; // Prevent labels from stacking above inputs in `.form-group`\n      vertical-align: middle;\n    }\n\n    // Make static controls behave like regular ones\n    .form-control-static {\n      display: inline-block;\n    }\n\n    .input-group {\n      display: inline-table;\n      vertical-align: middle;\n\n      .input-group-addon,\n      .input-group-btn,\n      .form-control {\n        width: auto;\n      }\n    }\n\n    // Input groups need that 100% width though\n    .input-group > .form-control {\n      width: 100%;\n    }\n\n    .control-label {\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // Remove default margin on radios/checkboxes that were used for stacking, and\n    // then undo the floating of radios and checkboxes to match.\n    .radio,\n    .checkbox {\n      display: inline-block;\n      margin-top: 0;\n      margin-bottom: 0;\n      vertical-align: middle;\n\n      label {\n        padding-left: 0;\n      }\n    }\n    .radio input[type=\"radio\"],\n    .checkbox input[type=\"checkbox\"] {\n      position: relative;\n      margin-left: 0;\n    }\n\n    // Re-override the feedback icon.\n    .has-feedback .form-control-feedback {\n      top: 0;\n    }\n  }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n  // Consistent vertical alignment of radios and checkboxes\n  //\n  // Labels also get some reset styles, but that is scoped to a media query below.\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline {\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n  }\n  // Account for padding we're adding to ensure the alignment and of help text\n  // and other content below items\n  .radio,\n  .checkbox {\n    min-height: (@line-height-computed + (@padding-base-vertical + 1));\n  }\n\n  // Make form groups behave like rows\n  .form-group {\n    .make-row();\n  }\n\n  // Reset spacing and right align labels, but scope to media queries so that\n  // labels on narrow viewports stack the same as a default form example.\n  @media (min-width: @screen-sm-min) {\n    .control-label {\n      text-align: right;\n      margin-bottom: 0;\n      padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n    }\n  }\n\n  // Validation states\n  //\n  // Reposition the icon because it's now within a grid column and columns have\n  // `position: relative;` on them. Also accounts for the grid gutter padding.\n  .has-feedback .form-control-feedback {\n    right: (@grid-gutter-width / 2);\n  }\n\n  // Form group sizes\n  //\n  // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n  // inputs and labels within a `.form-group`.\n  .form-group-lg {\n    @media (min-width: @screen-sm-min) {\n      .control-label {\n        padding-top: ((@padding-large-vertical * @line-height-large) + 1);\n      }\n    }\n  }\n  .form-group-sm {\n    @media (min-width: @screen-sm-min) {\n      .control-label {\n        padding-top: (@padding-small-vertical + 1);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/glyphicons.less",
    "content": "//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('@{icon-font-path}@{icon-font-name}.eot');\n  src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n       url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n       url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n       url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n       url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk               { &:before { content: \"\\2a\"; } }\n.glyphicon-plus                   { &:before { content: \"\\2b\"; } }\n.glyphicon-euro,\n.glyphicon-eur                    { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus                  { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud                  { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope               { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil                 { &:before { content: \"\\270f\"; } }\n.glyphicon-glass                  { &:before { content: \"\\e001\"; } }\n.glyphicon-music                  { &:before { content: \"\\e002\"; } }\n.glyphicon-search                 { &:before { content: \"\\e003\"; } }\n.glyphicon-heart                  { &:before { content: \"\\e005\"; } }\n.glyphicon-star                   { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty             { &:before { content: \"\\e007\"; } }\n.glyphicon-user                   { &:before { content: \"\\e008\"; } }\n.glyphicon-film                   { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large               { &:before { content: \"\\e010\"; } }\n.glyphicon-th                     { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list                { &:before { content: \"\\e012\"; } }\n.glyphicon-ok                     { &:before { content: \"\\e013\"; } }\n.glyphicon-remove                 { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in                { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out               { &:before { content: \"\\e016\"; } }\n.glyphicon-off                    { &:before { content: \"\\e017\"; } }\n.glyphicon-signal                 { &:before { content: \"\\e018\"; } }\n.glyphicon-cog                    { &:before { content: \"\\e019\"; } }\n.glyphicon-trash                  { &:before { content: \"\\e020\"; } }\n.glyphicon-home                   { &:before { content: \"\\e021\"; } }\n.glyphicon-file                   { &:before { content: \"\\e022\"; } }\n.glyphicon-time                   { &:before { content: \"\\e023\"; } }\n.glyphicon-road                   { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt           { &:before { content: \"\\e025\"; } }\n.glyphicon-download               { &:before { content: \"\\e026\"; } }\n.glyphicon-upload                 { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox                  { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle            { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat                 { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh                { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt               { &:before { content: \"\\e032\"; } }\n.glyphicon-lock                   { &:before { content: \"\\e033\"; } }\n.glyphicon-flag                   { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones             { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off             { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down            { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up              { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode                 { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode                { &:before { content: \"\\e040\"; } }\n.glyphicon-tag                    { &:before { content: \"\\e041\"; } }\n.glyphicon-tags                   { &:before { content: \"\\e042\"; } }\n.glyphicon-book                   { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark               { &:before { content: \"\\e044\"; } }\n.glyphicon-print                  { &:before { content: \"\\e045\"; } }\n.glyphicon-camera                 { &:before { content: \"\\e046\"; } }\n.glyphicon-font                   { &:before { content: \"\\e047\"; } }\n.glyphicon-bold                   { &:before { content: \"\\e048\"; } }\n.glyphicon-italic                 { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height            { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width             { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left             { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center           { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right            { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify          { &:before { content: \"\\e055\"; } }\n.glyphicon-list                   { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left            { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right           { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video         { &:before { content: \"\\e059\"; } }\n.glyphicon-picture                { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker             { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust                 { &:before { content: \"\\e063\"; } }\n.glyphicon-tint                   { &:before { content: \"\\e064\"; } }\n.glyphicon-edit                   { &:before { content: \"\\e065\"; } }\n.glyphicon-share                  { &:before { content: \"\\e066\"; } }\n.glyphicon-check                  { &:before { content: \"\\e067\"; } }\n.glyphicon-move                   { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward          { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward          { &:before { content: \"\\e070\"; } }\n.glyphicon-backward               { &:before { content: \"\\e071\"; } }\n.glyphicon-play                   { &:before { content: \"\\e072\"; } }\n.glyphicon-pause                  { &:before { content: \"\\e073\"; } }\n.glyphicon-stop                   { &:before { content: \"\\e074\"; } }\n.glyphicon-forward                { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward           { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward           { &:before { content: \"\\e077\"; } }\n.glyphicon-eject                  { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left           { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right          { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign              { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign             { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign            { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign                { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign          { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign              { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot             { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle          { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle              { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle             { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left             { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right            { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up               { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down             { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt              { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full            { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small           { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign       { &:before { content: \"\\e101\"; } }\n.glyphicon-gift                   { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf                   { &:before { content: \"\\e103\"; } }\n.glyphicon-fire                   { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open               { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close              { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign           { &:before { content: \"\\e107\"; } }\n.glyphicon-plane                  { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar               { &:before { content: \"\\e109\"; } }\n.glyphicon-random                 { &:before { content: \"\\e110\"; } }\n.glyphicon-comment                { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet                 { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up             { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down           { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet                { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart          { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close           { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open            { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical        { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal      { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd                    { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn               { &:before { content: \"\\e122\"; } }\n.glyphicon-bell                   { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate            { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up              { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down            { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right             { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left              { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up                { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down              { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right     { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left      { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up        { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down      { &:before { content: \"\\e134\"; } }\n.glyphicon-globe                  { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench                 { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks                  { &:before { content: \"\\e137\"; } }\n.glyphicon-filter                 { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase              { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen             { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard              { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip              { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty            { &:before { content: \"\\e143\"; } }\n.glyphicon-link                   { &:before { content: \"\\e144\"; } }\n.glyphicon-phone                  { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin                { &:before { content: \"\\e146\"; } }\n.glyphicon-usd                    { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp                    { &:before { content: \"\\e149\"; } }\n.glyphicon-sort                   { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet       { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt   { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order          { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt      { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes     { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked              { &:before { content: \"\\e157\"; } }\n.glyphicon-expand                 { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down          { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up            { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in                 { &:before { content: \"\\e161\"; } }\n.glyphicon-flash                  { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out                { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window             { &:before { content: \"\\e164\"; } }\n.glyphicon-record                 { &:before { content: \"\\e165\"; } }\n.glyphicon-save                   { &:before { content: \"\\e166\"; } }\n.glyphicon-open                   { &:before { content: \"\\e167\"; } }\n.glyphicon-saved                  { &:before { content: \"\\e168\"; } }\n.glyphicon-import                 { &:before { content: \"\\e169\"; } }\n.glyphicon-export                 { &:before { content: \"\\e170\"; } }\n.glyphicon-send                   { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk            { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved           { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove          { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save            { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open            { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card            { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer               { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery                { &:before { content: \"\\e179\"; } }\n.glyphicon-header                 { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed             { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone               { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt              { &:before { content: \"\\e183\"; } }\n.glyphicon-tower                  { &:before { content: \"\\e184\"; } }\n.glyphicon-stats                  { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video               { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video               { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles              { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo           { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby            { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1              { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1              { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1              { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark         { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark      { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download         { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload           { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer           { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous         { &:before { content: \"\\e200\"; } }\n.glyphicon-cd                     { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file              { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file              { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up               { &:before { content: \"\\e204\"; } }\n.glyphicon-copy                   { &:before { content: \"\\e205\"; } }\n.glyphicon-paste                  { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door                   { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key                    { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert                  { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer              { &:before { content: \"\\e210\"; } }\n.glyphicon-king                   { &:before { content: \"\\e211\"; } }\n.glyphicon-queen                  { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn                   { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop                 { &:before { content: \"\\e214\"; } }\n.glyphicon-knight                 { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula           { &:before { content: \"\\e216\"; } }\n.glyphicon-tent                   { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard             { &:before { content: \"\\e218\"; } }\n.glyphicon-bed                    { &:before { content: \"\\e219\"; } }\n.glyphicon-apple                  { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase                  { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass              { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp                   { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate              { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank             { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors               { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin                { &:before { content: \"\\e227\"; } }\n.glyphicon-btc                    { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt                    { &:before { content: \"\\e227\"; } }\n.glyphicon-yen                    { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy                    { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble                  { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub                    { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale                  { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly              { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted       { &:before { content: \"\\e232\"; } }\n.glyphicon-education              { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal      { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical        { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger         { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window           { &:before { content: \"\\e237\"; } }\n.glyphicon-oil                    { &:before { content: \"\\e238\"; } }\n.glyphicon-grain                  { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses             { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size              { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color             { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background        { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top       { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom    { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left      { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical  { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right     { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right         { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left          { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom        { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top           { &:before { content: \"\\e253\"; } }\n.glyphicon-console                { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript            { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript              { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left              { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right             { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down              { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up                { &:before { content: \"\\e260\"; } }\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/grid.less",
    "content": "//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.tb-container {\n  .container-fixed();\n\n  @media (min-width: @screen-sm-min) {\n    width: @container-sm;\n  }\n  @media (min-width: @screen-md-min) {\n    width: @container-md;\n  }\n  @media (min-width: @screen-lg-min) {\n    width: @container-lg;\n  }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n  .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n  .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n  .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n  .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n  .make-grid(lg);\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/input-groups.less",
    "content": "//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n  position: relative; // For dropdowns\n  display: table;\n  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n  // Undo padding and float of grid classes\n  &[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n\n  .form-control {\n    // Ensure that the input is always above the *appended* addon button for\n    // proper border colors.\n    position: relative;\n    z-index: 2;\n\n    // IE9 fubars the placeholder attribute in text inputs and the arrows on\n    // select elements in input groups. To fix it, we float the input. Details:\n    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n    float: left;\n\n    width: 100%;\n    margin-bottom: 0;\n  }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: 1;\n  color: @input-color;\n  text-align: center;\n  background-color: @input-group-addon-bg;\n  border: 1px solid @input-group-addon-border-color;\n  border-radius: @border-radius-base;\n\n  // Sizing\n  &.input-sm {\n    padding: @padding-small-vertical @padding-small-horizontal;\n    font-size: @font-size-small;\n    border-radius: @border-radius-small;\n  }\n  &.input-lg {\n    padding: @padding-large-vertical @padding-large-horizontal;\n    font-size: @font-size-large;\n    border-radius: @border-radius-large;\n  }\n\n  // Nuke default margins from checkboxes and radios to vertically center within.\n  input[type=\"radio\"],\n  input[type=\"checkbox\"] {\n    margin-top: 0;\n  }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  .border-right-radius(0);\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  .border-left-radius(0);\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n  position: relative;\n  // Jankily prevent input button groups from wrapping with `white-space` and\n  // `font-size` in combination with `inline-block` on buttons.\n  font-size: 0;\n  white-space: nowrap;\n\n  // Negative margin for spacing, position for bringing hovered/focused/actived\n  // element above the siblings.\n  > .btn {\n    position: relative;\n    + .btn {\n      margin-left: -1px;\n    }\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active {\n      z-index: 2;\n    }\n  }\n\n  // Negative margin to only have a 1px border between the two\n  &:first-child {\n    > .btn,\n    > .btn-group {\n      margin-right: -1px;\n    }\n  }\n  &:last-child {\n    > .btn,\n    > .btn-group {\n      margin-left: -1px;\n    }\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/jumbotron.less",
    "content": "//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n  padding: @jumbotron-padding (@jumbotron-padding / 2);\n  margin-bottom: @jumbotron-padding;\n  color: @jumbotron-color;\n  background-color: @jumbotron-bg;\n\n  h1,\n  .h1 {\n    color: @jumbotron-heading-color;\n  }\n\n  p {\n    margin-bottom: (@jumbotron-padding / 2);\n    font-size: @jumbotron-font-size;\n    font-weight: 200;\n  }\n\n  > hr {\n    border-top-color: darken(@jumbotron-bg, 10%);\n  }\n\n  .tb-container &,\n  .container-fluid & {\n    border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n  }\n\n  .tb-container {\n    max-width: 100%;\n  }\n\n  @media screen and (min-width: @screen-sm-min) {\n    padding: (@jumbotron-padding * 1.6) 0;\n\n    .tb-container &,\n    .container-fluid & {\n      padding-left:  (@jumbotron-padding * 2);\n      padding-right: (@jumbotron-padding * 2);\n    }\n\n    h1,\n    .h1 {\n      font-size: (@font-size-base * 4.5);\n    }\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/labels.less",
    "content": "//\n// Labels\n// --------------------------------------------------\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: @label-color;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n\n  // Add hover effects, but only for links\n  a& {\n    &:hover,\n    &:focus {\n      color: @label-link-hover-color;\n      text-decoration: none;\n      cursor: pointer;\n    }\n  }\n\n  // Empty labels collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for labels in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n  .label-variant(@label-default-bg);\n}\n\n.label-primary {\n  .label-variant(@label-primary-bg);\n}\n\n.label-success {\n  .label-variant(@label-success-bg);\n}\n\n.label-info {\n  .label-variant(@label-info-bg);\n}\n\n.label-warning {\n  .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n  .label-variant(@label-danger-bg);\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/list-group.less",
    "content": "//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n  // No need to set list-style: none; since .list-group-item is block level\n  margin-bottom: 20px;\n  padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  // Place the border on the list items and negative margin up for better styling\n  margin-bottom: -1px;\n  background-color: @list-group-bg;\n  border: 1px solid @list-group-border;\n\n  // Round the first and last items\n  &:first-child {\n    .border-top-radius(@list-group-border-radius);\n  }\n  &:last-child {\n    margin-bottom: 0;\n    .border-bottom-radius(@list-group-border-radius);\n  }\n}\n\n\n// Linked list items\n//\n// Use anchor elements instead of `li`s or `div`s to create linked list items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item {\n  color: @list-group-link-color;\n\n  .list-group-item-heading {\n    color: @list-group-link-heading-color;\n  }\n\n  // Hover state\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @list-group-link-hover-color;\n    background-color: @list-group-hover-bg;\n  }\n}\n\n.list-group-item {\n  // Disabled state\n  &.disabled,\n  &.disabled:hover,\n  &.disabled:focus {\n    background-color: @list-group-disabled-bg;\n    color: @list-group-disabled-color;\n    cursor: @cursor-disabled;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: @list-group-disabled-text-color;\n    }\n  }\n\n  // Active class on item itself, not parent\n  &.active,\n  &.active:hover,\n  &.active:focus {\n    z-index: 2; // Place active items above their siblings for proper border styling\n    color: @list-group-active-color;\n    background-color: @list-group-active-bg;\n    border-color: @list-group-active-border;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading,\n    .list-group-item-heading > small,\n    .list-group-item-heading > .small {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: @list-group-active-text-color;\n    }\n  }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/media.less",
    "content": ".media {\n  // Proper spacing between instances of .media\n  margin-top: 15px;\n\n  &:first-child {\n    margin-top: 0;\n  }\n}\n\n.media,\n.media-body {\n  zoom: 1;\n  overflow: hidden;\n}\n\n.media-body {\n  width: 10000px;\n}\n\n.media-object {\n  display: block;\n}\n\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n\n.media-middle {\n  vertical-align: middle;\n}\n\n.media-bottom {\n  vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/alerts.less",
    "content": "// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n  background-color: @background;\n  border-color: @border;\n  color: @text-color;\n\n  hr {\n    border-top-color: darken(@border, 5%);\n  }\n  .alert-link {\n    color: darken(@text-color, 10%);\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/background-variant.less",
    "content": "// Contextual backgrounds\n\n.bg-variant(@color) {\n  background-color: @color;\n  a&:hover {\n    background-color: darken(@color, 10%);\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/border-radius.less",
    "content": "// Single side border-radius\n\n.border-top-radius(@radius) {\n  border-top-right-radius: @radius;\n   border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n  border-bottom-right-radius: @radius;\n     border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n  border-bottom-right-radius: @radius;\n   border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n  border-bottom-left-radius: @radius;\n     border-top-left-radius: @radius;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/buttons.less",
    "content": "// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n  color: @color;\n  background-color: @background;\n  border-color: @border;\n\n  &:hover,\n  &:focus,\n  &.focus,\n  &:active,\n  &.active,\n  .open > .dropdown-toggle& {\n    color: @color;\n    background-color: darken(@background, 10%);\n        border-color: darken(@border, 12%);\n  }\n  &:active,\n  &.active,\n  .open > .dropdown-toggle& {\n    background-image: none;\n  }\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    &,\n    &:hover,\n    &:focus,\n    &.focus,\n    &:active,\n    &.active {\n      background-color: @background;\n          border-color: @border;\n    }\n  }\n\n  .badge {\n    color: @background;\n    background-color: @color;\n  }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/center-block.less",
    "content": "// Center-align a block level element\n\n.center-block() {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/clearfix.less",
    "content": "// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n//    contenteditable attribute is included anywhere else in the document.\n//    Otherwise it causes space to appear at the top and bottom of elements\n//    that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n//    `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n  &:before,\n  &:after {\n    content: \" \"; // 1\n    display: table; // 2\n  }\n  &:after {\n    clear: both;\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/forms.less",
    "content": "// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n  // Color the label and help text\n  .help-block,\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline,\n  &.radio label,\n  &.checkbox label,\n  &.radio-inline label,\n  &.checkbox-inline label  {\n    color: @text-color;\n  }\n  // Set the border and box shadow on specific inputs to match\n  .form-control {\n    border-color: @border-color;\n    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n    &:focus {\n      border-color: darken(@border-color, 10%);\n      @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n      .box-shadow(@shadow);\n    }\n  }\n  // Set validation states also for addons\n  .input-group-addon {\n    color: @text-color;\n    border-color: @border-color;\n    background-color: @background-color;\n  }\n  // Optional feedback icon\n  .form-control-feedback {\n    color: @text-color;\n  }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n  @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n  &:focus {\n    border-color: @color;\n    outline: 0;\n    .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n  }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  height: @input-height;\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n\n  select& {\n    height: @input-height;\n    line-height: @input-height;\n  }\n\n  textarea&,\n  select[multiple]& {\n    height: auto;\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/gradients.less",
    "content": "// Gradients\n\n#gradient {\n\n  // Horizontal gradient, from left to right\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n    background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  // Vertical gradient, from top to bottom\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Opera 12\n    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n    background-repeat: repeat-x;\n    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  }\n  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .radial(@inner-color: #555; @outer-color: #333) {\n    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n    background-image: radial-gradient(circle, @inner-color, @outer-color);\n    background-repeat: no-repeat;\n  }\n  .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/grid-framework.less",
    "content": "// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n  // Common styles for all sizes of grid columns, widths 1-12\n  .col(@index) { // initial\n    @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n    .col((@index + 1), @item);\n  }\n  .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n    @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n    .col((@index + 1), ~\"@{list}, @{item}\");\n  }\n  .col(@index, @list) when (@index > @grid-columns) { // terminal\n    @{list} {\n      position: relative;\n      // Prevent columns from collapsing when empty\n      min-height: 1px;\n      // Inner gutter via padding\n      padding-left:  (@grid-gutter-width / 2);\n      padding-right: (@grid-gutter-width / 2);\n    }\n  }\n  .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n  .col(@index) { // initial\n    @item: ~\".col-@{class}-@{index}\";\n    .col((@index + 1), @item);\n  }\n  .col(@index, @list) when (@index =< @grid-columns) { // general\n    @item: ~\".col-@{class}-@{index}\";\n    .col((@index + 1), ~\"@{list}, @{item}\");\n  }\n  .col(@index, @list) when (@index > @grid-columns) { // terminal\n    @{list} {\n      float: left;\n    }\n  }\n  .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n  .col-@{class}-@{index} {\n    width: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n  .col-@{class}-push-@{index} {\n    left: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n  .col-@{class}-push-0 {\n    left: auto;\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n  .col-@{class}-pull-@{index} {\n    right: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n  .col-@{class}-pull-0 {\n    right: auto;\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n  .col-@{class}-offset-@{index} {\n    margin-left: percentage((@index / @grid-columns));\n  }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n  .calc-grid-column(@index, @class, @type);\n  // next iteration\n  .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n  .float-grid-columns(@class);\n  .loop-grid-columns(@grid-columns, @class, width);\n  .loop-grid-columns(@grid-columns, @class, pull);\n  .loop-grid-columns(@grid-columns, @class, push);\n  .loop-grid-columns(@grid-columns, @class, offset);\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/grid.less",
    "content": "// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n  &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n  margin-left:  (@gutter / -2);\n  margin-right: (@gutter / -2);\n  &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  float: left;\n  width: percentage((@columns / @grid-columns));\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n  margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n  left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n  right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-sm-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-offset(@columns) {\n  @media (min-width: @screen-sm-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-push(@columns) {\n  @media (min-width: @screen-sm-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-pull(@columns) {\n  @media (min-width: @screen-sm-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-md-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-offset(@columns) {\n  @media (min-width: @screen-md-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-push(@columns) {\n  @media (min-width: @screen-md-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-pull(@columns) {\n  @media (min-width: @screen-md-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-lg-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-offset(@columns) {\n  @media (min-width: @screen-lg-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-push(@columns) {\n  @media (min-width: @screen-lg-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-pull(@columns) {\n  @media (min-width: @screen-lg-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/hide-text.less",
    "content": "// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n  font: ~\"0/0\" a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n  .hide-text();\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/image.less",
    "content": "// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n  display: @display;\n  max-width: 100%; // Part 1: Set a maximum relative to the parent\n  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n  background-image: url(\"@{file-1x}\");\n\n  @media\n  only screen and (-webkit-min-device-pixel-ratio: 2),\n  only screen and (   min--moz-device-pixel-ratio: 2),\n  only screen and (     -o-min-device-pixel-ratio: 2/1),\n  only screen and (        min-device-pixel-ratio: 2),\n  only screen and (                min-resolution: 192dpi),\n  only screen and (                min-resolution: 2dppx) {\n    background-image: url(\"@{file-2x}\");\n    background-size: @width-1x @height-1x;\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/labels.less",
    "content": "// Labels\n\n.label-variant(@color) {\n  background-color: @color;\n\n  &[href] {\n    &:hover,\n    &:focus {\n      background-color: darken(@color, 10%);\n    }\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/list-group.less",
    "content": "// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n  .list-group-item-@{state} {\n    color: @color;\n    background-color: @background;\n\n    a& {\n      color: @color;\n\n      .list-group-item-heading {\n        color: inherit;\n      }\n\n      &:hover,\n      &:focus {\n        color: @color;\n        background-color: darken(@background, 5%);\n      }\n      &.active,\n      &.active:hover,\n      &.active:focus {\n        color: #fff;\n        background-color: @color;\n        border-color: @color;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/nav-divider.less",
    "content": "// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n  height: 1px;\n  margin: ((@line-height-computed / 2) - 1) 0;\n  overflow: hidden;\n  background-color: @color;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/nav-vertical-align.less",
    "content": "// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n  margin-top: ((@navbar-height - @element-height) / 2);\n  margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/opacity.less",
    "content": "// Opacity\n\n.opacity(@opacity) {\n  opacity: @opacity;\n  // IE8 filter\n  @opacity-ie: (@opacity * 100);\n  filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/pagination.less",
    "content": "// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n  > li {\n    > a,\n    > span {\n      padding: @padding-vertical @padding-horizontal;\n      font-size: @font-size;\n    }\n    &:first-child {\n      > a,\n      > span {\n        .border-left-radius(@border-radius);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/panels.less",
    "content": "// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n  border-color: @border;\n\n  & > .panel-heading {\n    color: @heading-text-color;\n    background-color: @heading-bg-color;\n    border-color: @heading-border;\n\n    + .panel-collapse > .panel-body {\n      border-top-color: @border;\n    }\n    .badge {\n      color: @heading-bg-color;\n      background-color: @heading-text-color;\n    }\n  }\n  & > .panel-footer {\n    + .panel-collapse > .panel-body {\n      border-bottom-color: @border;\n    }\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/progress-bar.less",
    "content": "// Progress bars\n\n.progress-bar-variant(@color) {\n  background-color: @color;\n\n  // Deprecated parent class requirement as of v3.2.0\n  .progress-striped & {\n    #gradient > .striped();\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/reset-filter.less",
    "content": "// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n  filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/resize.less",
    "content": "// Resize anything\n\n.resizable(@direction) {\n  resize: @direction; // Options: horizontal, vertical, both\n  overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/responsive-visibility.less",
    "content": "// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n  display: block !important;\n  table&  { display: table; }\n  tr&     { display: table-row !important; }\n  th&,\n  td&     { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n  display: none !important;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/size.less",
    "content": "// Sizing shortcuts\n\n.size(@width; @height) {\n  width: @width;\n  height: @height;\n}\n\n.square(@size) {\n  .size(@size; @size);\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/tab-focus.less",
    "content": "// WebKit-style focus\n\n.tab-focus() {\n  // Default\n  outline: thin dotted;\n  // WebKit\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/table-row.less",
    "content": "// Tables\n\n.table-row-variant(@state; @background) {\n  // Exact selectors below required to override `.table-striped` and prevent\n  // inheritance to nested tables.\n  .table > thead > tr,\n  .table > tbody > tr,\n  .table > tfoot > tr {\n    > td.@{state},\n    > th.@{state},\n    &.@{state} > td,\n    &.@{state} > th {\n      background-color: @background;\n    }\n  }\n\n  // Hover states for `.table-hover`\n  // Note: this is not available for cells or rows within `thead` or `tfoot`.\n  .table-hover > tbody > tr {\n    > td.@{state}:hover,\n    > th.@{state}:hover,\n    &.@{state}:hover > td,\n    &:hover > .@{state},\n    &.@{state}:hover > th {\n      background-color: darken(@background, 5%);\n    }\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/text-emphasis.less",
    "content": "// Typography\n\n.text-emphasis-variant(@color) {\n  color: @color;\n  a&:hover {\n    color: darken(@color, 10%);\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/text-overflow.less",
    "content": "// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins/vendor-prefixes.less",
    "content": "// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n  -webkit-animation: @animation;\n       -o-animation: @animation;\n          animation: @animation;\n}\n.animation-name(@name) {\n  -webkit-animation-name: @name;\n          animation-name: @name;\n}\n.animation-duration(@duration) {\n  -webkit-animation-duration: @duration;\n          animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n  -webkit-animation-timing-function: @timing-function;\n          animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n  -webkit-animation-delay: @delay;\n          animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n  -webkit-animation-iteration-count: @iteration-count;\n          animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n  -webkit-animation-direction: @direction;\n          animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n  -webkit-animation-fill-mode: @fill-mode;\n          animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n  -webkit-backface-visibility: @visibility;\n     -moz-backface-visibility: @visibility;\n          backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n          box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n  -webkit-box-sizing: @boxmodel;\n     -moz-box-sizing: @boxmodel;\n          box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n  -webkit-column-count: @column-count;\n     -moz-column-count: @column-count;\n          column-count: @column-count;\n  -webkit-column-gap: @column-gap;\n     -moz-column-gap: @column-gap;\n          column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: @mode;\n     -moz-hyphens: @mode;\n      -ms-hyphens: @mode; // IE10+\n       -o-hyphens: @mode;\n          hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n  // Firefox\n  &::-moz-placeholder {\n    color: @color;\n    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n  }\n  &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n  -webkit-transform: scale(@ratio);\n      -ms-transform: scale(@ratio); // IE9 only\n       -o-transform: scale(@ratio);\n          transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n  -webkit-transform: scale(@ratioX, @ratioY);\n      -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n       -o-transform: scale(@ratioX, @ratioY);\n          transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n  -webkit-transform: scaleX(@ratio);\n      -ms-transform: scaleX(@ratio); // IE9 only\n       -o-transform: scaleX(@ratio);\n          transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n  -webkit-transform: scaleY(@ratio);\n      -ms-transform: scaleY(@ratio); // IE9 only\n       -o-transform: scaleY(@ratio);\n          transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n  -webkit-transform: skewX(@x) skewY(@y);\n      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n       -o-transform: skewX(@x) skewY(@y);\n          transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n  -webkit-transform: translate(@x, @y);\n      -ms-transform: translate(@x, @y); // IE9 only\n       -o-transform: translate(@x, @y);\n          transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n  -webkit-transform: translate3d(@x, @y, @z);\n          transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees); // IE9 only\n       -o-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n  -webkit-transform: rotateX(@degrees);\n      -ms-transform: rotateX(@degrees); // IE9 only\n       -o-transform: rotateX(@degrees);\n          transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n  -webkit-transform: rotateY(@degrees);\n      -ms-transform: rotateY(@degrees); // IE9 only\n       -o-transform: rotateY(@degrees);\n          transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n  -webkit-perspective: @perspective;\n     -moz-perspective: @perspective;\n          perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n  -webkit-perspective-origin: @perspective;\n     -moz-perspective-origin: @perspective;\n          perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n  -webkit-transform-origin: @origin;\n     -moz-transform-origin: @origin;\n      -ms-transform-origin: @origin; // IE9 only\n          transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n  -webkit-transition: @transition;\n       -o-transition: @transition;\n          transition: @transition;\n}\n.transition-property(@transition-property) {\n  -webkit-transition-property: @transition-property;\n          transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n  -webkit-transition-delay: @transition-delay;\n          transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n  -webkit-transition-duration: @transition-duration;\n          transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n  -webkit-transition-timing-function: @timing-function;\n          transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n  -webkit-transition: -webkit-transform @transition;\n     -moz-transition: -moz-transform @transition;\n       -o-transition: -o-transform @transition;\n          transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n  -webkit-user-select: @select;\n     -moz-user-select: @select;\n      -ms-user-select: @select; // IE10+\n          user-select: @select;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/mixins.less",
    "content": "// Mixins\n// --------------------------------------------------\n\n// Utilities\n@import \"mixins/hide-text.less\";\n@import \"mixins/opacity.less\";\n@import \"mixins/image.less\";\n@import \"mixins/labels.less\";\n@import \"mixins/reset-filter.less\";\n@import \"mixins/resize.less\";\n@import \"mixins/responsive-visibility.less\";\n@import \"mixins/size.less\";\n@import \"mixins/tab-focus.less\";\n@import \"mixins/text-emphasis.less\";\n@import \"mixins/text-overflow.less\";\n@import \"mixins/vendor-prefixes.less\";\n\n// Components\n@import \"mixins/alerts.less\";\n@import \"mixins/buttons.less\";\n@import \"mixins/panels.less\";\n@import \"mixins/pagination.less\";\n@import \"mixins/list-group.less\";\n@import \"mixins/nav-divider.less\";\n@import \"mixins/forms.less\";\n@import \"mixins/progress-bar.less\";\n@import \"mixins/table-row.less\";\n\n// Skins\n@import \"mixins/background-variant.less\";\n@import \"mixins/border-radius.less\";\n@import \"mixins/gradients.less\";\n\n// Layout\n@import \"mixins/clearfix.less\";\n@import \"mixins/center-block.less\";\n@import \"mixins/nav-vertical-align.less\";\n@import \"mixins/grid-framework.less\";\n@import \"mixins/grid.less\";\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/modals.less",
    "content": "//\n// Modals\n// --------------------------------------------------\n\n// .modal-open      - body class for killing the scroll\n// .modal           - container to scroll within\n// .modal-dialog    - positioning shell for the actual modal\n// .modal-content   - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n  overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: @zindex-modal;\n  -webkit-overflow-scrolling: touch;\n\n  // Prevent Chrome on Windows from adding a focus outline. For details, see\n  // https://github.com/twbs/bootstrap/pull/10951.\n  outline: 0;\n\n  // When fading in the modal, animate it to slide down\n  &.fade .modal-dialog {\n    .translate(0, -25%);\n    .transition-transform(~\"0.3s ease-out\");\n  }\n  &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n  position: relative;\n  background-color: @modal-content-bg;\n  border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n  border: 1px solid @modal-content-border-color;\n  border-radius: @border-radius-large;\n  .box-shadow(0 3px 9px rgba(0,0,0,.5));\n  background-clip: padding-box;\n  // Remove focus outline from opened modal\n  outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: @zindex-modal-background;\n  background-color: @modal-backdrop-bg;\n  // Fade for backdrop\n  &.fade { .opacity(0); }\n  &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n  padding: @modal-title-padding;\n  border-bottom: 1px solid @modal-header-border-color;\n  min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n  margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n  margin: 0;\n  line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n  position: relative;\n  padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n  padding: @modal-inner-padding;\n  text-align: right; // right align buttons\n  border-top: 1px solid @modal-footer-border-color;\n  &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n  // Properly space out buttons\n  .btn + .btn {\n    margin-left: 5px;\n    margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n  }\n  // but override that for button groups\n  .btn-group .btn + .btn {\n    margin-left: -1px;\n  }\n  // and override it for block buttons as well\n  .btn-block + .btn-block {\n    margin-left: 0;\n  }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n  // Automatically set modal's width for larger viewports\n  .modal-dialog {\n    width: @modal-md;\n    margin: 30px auto;\n  }\n  .modal-content {\n    .box-shadow(0 5px 15px rgba(0,0,0,.5));\n  }\n\n  // Modal sizes\n  .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n  .modal-lg { width: @modal-lg; }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/navbar.less",
    "content": "//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n  margin-bottom: @navbar-margin-bottom;\n  border: 1px solid transparent;\n\n  // Prevent floats from breaking the navbar\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: @navbar-border-radius;\n  }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n  }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: @navbar-padding-horizontal;\n  padding-left:  @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n  &:extend(.clearfix all);\n  -webkit-overflow-scrolling: touch;\n\n  &.in {\n    overflow-y: auto;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n\n    &.collapse {\n      display: block !important;\n      height: auto !important;\n      padding-bottom: 0; // Override default setting\n      overflow: visible !important;\n    }\n\n    &.in {\n      overflow-y: visible;\n    }\n\n    // Undo the collapse side padding for navbars with containers to ensure\n    // alignment of right-aligned contents.\n    .navbar-fixed-top &,\n    .navbar-static-top &,\n    .navbar-fixed-bottom & {\n      padding-left: 0;\n      padding-right: 0;\n    }\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  .navbar-collapse {\n    max-height: @navbar-collapse-max-height;\n\n    @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n      max-height: 200px;\n    }\n  }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.tb-container,\n.container-fluid {\n  > .navbar-header,\n  > .navbar-collapse {\n    margin-right: -@navbar-padding-horizontal;\n    margin-left:  -@navbar-padding-horizontal;\n\n    @media (min-width: @grid-float-breakpoint) {\n      margin-right: 0;\n      margin-left:  0;\n    }\n  }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n  z-index: @zindex-navbar;\n  border-width: 0 0 1px;\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: @zindex-navbar-fixed;\n\n  // Undo the rounded corners\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0; // override .navbar defaults\n  border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n  float: left;\n  padding: @navbar-padding-vertical @navbar-padding-horizontal;\n  font-size: @font-size-large;\n  line-height: @line-height-computed;\n  height: @navbar-height;\n\n  &:hover,\n  &:focus {\n    text-decoration: none;\n  }\n\n  > img {\n    display: block;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    .navbar > .tb-container &,\n    .navbar > .container-fluid & {\n      margin-left: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: @navbar-padding-horizontal;\n  padding: 9px 10px;\n  .navbar-vertical-align(34px);\n  background-color: transparent;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  border-radius: @border-radius-base;\n\n  // We remove the `outline` here, but later compensate by attaching `:hover`\n  // styles to `:focus`.\n  &:focus {\n    outline: 0;\n  }\n\n  // Bars\n  .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n  }\n  .icon-bar + .icon-bar {\n    margin-top: 4px;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    display: none;\n  }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n  margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n  > li > a {\n    padding-top:    10px;\n    padding-bottom: 10px;\n    line-height: @line-height-computed;\n  }\n\n  @media (max-width: @grid-float-breakpoint-max) {\n    // Dropdowns get custom display when collapsed\n    .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none;\n      > li > a,\n      .dropdown-header {\n        padding: 5px 15px 5px 25px;\n      }\n      > li > a {\n        line-height: @line-height-computed;\n        &:hover,\n        &:focus {\n          background-image: none;\n        }\n      }\n    }\n  }\n\n  // Uncollapse the nav\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin: 0;\n\n    > li {\n      float: left;\n      > a {\n        padding-top:    @navbar-padding-vertical;\n        padding-bottom: @navbar-padding-vertical;\n      }\n    }\n  }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n  margin-left: -@navbar-padding-horizontal;\n  margin-right: -@navbar-padding-horizontal;\n  padding: 10px @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n\n  // Mixin behavior for optimum display\n  .form-inline();\n\n  .form-group {\n    @media (max-width: @grid-float-breakpoint-max) {\n      margin-bottom: 5px;\n\n      &:last-child {\n        margin-bottom: 0;\n      }\n    }\n  }\n\n  // Vertically center in expanded, horizontal navbar\n  .navbar-vertical-align(@input-height-base);\n\n  // Undo 100% width for pull classes\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    .box-shadow(none);\n  }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  .border-top-radius(@navbar-border-radius);\n  .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n  .navbar-vertical-align(@input-height-base);\n\n  &.btn-sm {\n    .navbar-vertical-align(@input-height-small);\n  }\n  &.btn-xs {\n    .navbar-vertical-align(22);\n  }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n  .navbar-vertical-align(@line-height-computed);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin-left: @navbar-padding-horizontal;\n    margin-right: @navbar-padding-horizontal;\n  }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-left  { .pull-left(); }\n  .navbar-right {\n    .pull-right();\n    margin-right: -@navbar-padding-horizontal;\n\n    ~ .navbar-right {\n      margin-right: 0;\n    }\n  }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  background-color: @navbar-default-bg;\n  border-color: @navbar-default-border;\n\n  .navbar-brand {\n    color: @navbar-default-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-brand-hover-color;\n      background-color: @navbar-default-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-default-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-default-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-hover-color;\n        background-color: @navbar-default-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-active-color;\n        background-color: @navbar-default-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n        background-color: @navbar-default-link-disabled-bg;\n      }\n    }\n  }\n\n  .navbar-toggle {\n    border-color: @navbar-default-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-default-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-default-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: @navbar-default-border;\n  }\n\n  // Dropdown menu items\n  .navbar-nav {\n    // Remove background color from open dropdown\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-default-link-active-bg;\n        color: @navbar-default-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display when collapsed\n      .open .dropdown-menu {\n        > li > a {\n          color: @navbar-default-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-hover-color;\n            background-color: @navbar-default-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-active-color;\n            background-color: @navbar-default-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-disabled-color;\n            background-color: @navbar-default-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n\n  // Links in navbars\n  //\n  // Add a class to ensure links outside the navbar nav are colored correctly.\n\n  .navbar-link {\n    color: @navbar-default-link-color;\n    &:hover {\n      color: @navbar-default-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: @navbar-default-link-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n      }\n    }\n  }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n  background-color: @navbar-inverse-bg;\n  border-color: @navbar-inverse-border;\n\n  .navbar-brand {\n    color: @navbar-inverse-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-inverse-brand-hover-color;\n      background-color: @navbar-inverse-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-inverse-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-inverse-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-hover-color;\n        background-color: @navbar-inverse-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-active-color;\n        background-color: @navbar-inverse-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-disabled-color;\n        background-color: @navbar-inverse-link-disabled-bg;\n      }\n    }\n  }\n\n  // Darken the responsive nav toggle\n  .navbar-toggle {\n    border-color: @navbar-inverse-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-inverse-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-inverse-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: darken(@navbar-inverse-bg, 7%);\n  }\n\n  // Dropdowns\n  .navbar-nav {\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-inverse-link-active-bg;\n        color: @navbar-inverse-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display\n      .open .dropdown-menu {\n        > .dropdown-header {\n          border-color: @navbar-inverse-border;\n        }\n        .divider {\n          background-color: @navbar-inverse-border;\n        }\n        > li > a {\n          color: @navbar-inverse-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-hover-color;\n            background-color: @navbar-inverse-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-active-color;\n            background-color: @navbar-inverse-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-disabled-color;\n            background-color: @navbar-inverse-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n  .navbar-link {\n    color: @navbar-inverse-link-color;\n    &:hover {\n      color: @navbar-inverse-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: @navbar-inverse-link-color;\n    &:hover,\n    &:focus {\n      color: @navbar-inverse-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-disabled-color;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/navs.less",
    "content": "//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0; // Override default ul/ol\n  list-style: none;\n  &:extend(.clearfix all);\n\n  > li {\n    position: relative;\n    display: block;\n\n    > a {\n      position: relative;\n      display: block;\n      padding: @nav-link-padding;\n      &:hover,\n      &:focus {\n        text-decoration: none;\n        background-color: @nav-link-hover-bg;\n      }\n    }\n\n    // Disabled state sets text to gray and nukes hover/tab effects\n    &.disabled > a {\n      color: @nav-disabled-link-color;\n\n      &:hover,\n      &:focus {\n        color: @nav-disabled-link-hover-color;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: @cursor-disabled;\n      }\n    }\n  }\n\n  // Open dropdowns\n  .open > a {\n    &,\n    &:hover,\n    &:focus {\n      background-color: @nav-link-hover-bg;\n      border-color: @link-color;\n    }\n  }\n\n  // Nav dividers (deprecated with v3.0.1)\n  //\n  // This should have been removed in v3 with the dropping of `.nav-list`, but\n  // we missed it. We don't currently support this anywhere, but in the interest\n  // of maintaining backward compatibility in case you use it, it's deprecated.\n  .nav-divider {\n    .nav-divider();\n  }\n\n  // Prevent IE8 from misplacing imgs\n  //\n  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n  > li > a > img {\n    max-width: none;\n  }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid @nav-tabs-border-color;\n  > li {\n    float: left;\n    // Make the list-items overlay the bottom border\n    margin-bottom: -1px;\n\n    // Actual tabs (as links)\n    > a {\n      margin-right: 2px;\n      line-height: @line-height-base;\n      border: 1px solid transparent;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n      &:hover {\n        border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n      }\n    }\n\n    // Active state, and its :hover to override normal :hover\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-tabs-active-link-hover-color;\n        background-color: @nav-tabs-active-link-hover-bg;\n        border: 1px solid @nav-tabs-active-link-hover-border-color;\n        border-bottom-color: transparent;\n        cursor: default;\n      }\n    }\n  }\n  // pulling this in mainly for less shorthand\n  &.nav-justified {\n    .nav-justified();\n    .nav-tabs-justified();\n  }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n  > li {\n    float: left;\n\n    // Links rendered as pills\n    > a {\n      border-radius: @nav-pills-border-radius;\n    }\n    + li {\n      margin-left: 2px;\n    }\n\n    // Active state\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-pills-active-link-hover-color;\n        background-color: @nav-pills-active-link-hover-bg;\n      }\n    }\n  }\n}\n\n\n// Stacked pills\n.nav-stacked {\n  > li {\n    float: none;\n    + li {\n      margin-top: 2px;\n      margin-left: 0; // no need for this gap between nav items\n    }\n  }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n  width: 100%;\n\n  > li {\n    float: none;\n    > a {\n      text-align: center;\n      margin-bottom: 5px;\n    }\n  }\n\n  > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li {\n      display: table-cell;\n      width: 1%;\n      > a {\n        margin-bottom: 0;\n      }\n    }\n  }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n  border-bottom: 0;\n\n  > li > a {\n    // Override margin from .nav-tabs\n    margin-right: 0;\n    border-radius: @border-radius-base;\n  }\n\n  > .active > a,\n  > .active > a:hover,\n  > .active > a:focus {\n    border: 1px solid @nav-tabs-justified-link-border-color;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li > a {\n      border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n    }\n    > .active > a,\n    > .active > a:hover,\n    > .active > a:focus {\n      border-bottom-color: @nav-tabs-justified-active-link-border-color;\n    }\n  }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n  > .tab-pane {\n    display: none;\n  }\n  > .active {\n    display: block;\n  }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n  // make dropdown border overlap tab border\n  margin-top: -1px;\n  // Remove the top rounded corners here since there is a hard edge above the menu\n  .border-top-radius(0);\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/normalize.less",
    "content": "/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n//    user zoom.\n//\n\nhtml {\n  font-family: sans-serif; // 1\n  -ms-text-size-adjust: 100%; // 2\n  -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n  margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block; // 1\n  vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n  display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n  background-color: transparent;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n  outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n  font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n  font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n  background: #ff0;\n  color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n  font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n  border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n  margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n  overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n//    Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit; // 1\n  font: inherit; // 2\n  margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n  overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n//    and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n//    `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button; // 2\n  cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n  line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box; // 1\n  padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n//    (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield; // 1\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box; // 2\n  box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n  border: 0; // 1\n  padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n  overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n  font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\ntd,\nth {\n  padding: 0;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/pager.less",
    "content": "//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  list-style: none;\n  text-align: center;\n  &:extend(.clearfix all);\n  li {\n    display: inline;\n    > a,\n    > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: @pager-bg;\n      border: 1px solid @pager-border;\n      border-radius: @pager-border-radius;\n    }\n\n    > a:hover,\n    > a:focus {\n      text-decoration: none;\n      background-color: @pager-hover-bg;\n    }\n  }\n\n  .next {\n    > a,\n    > span {\n      float: right;\n    }\n  }\n\n  .previous {\n    > a,\n    > span {\n      float: left;\n    }\n  }\n\n  .disabled {\n    > a,\n    > a:hover,\n    > a:focus,\n    > span {\n      color: @pager-disabled-color;\n      background-color: @pager-bg;\n      cursor: @cursor-disabled;\n    }\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/pagination.less",
    "content": "//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline; // Remove list-style and block-level defaults\n    > a,\n    > span {\n      position: relative;\n      float: left; // Collapse white-space\n      padding: @padding-base-vertical @padding-base-horizontal;\n      line-height: @line-height-base;\n      text-decoration: none;\n      color: @pagination-color;\n      background-color: @pagination-bg;\n      border: 1px solid @pagination-border;\n      margin-left: -1px;\n    }\n    &:first-child {\n      > a,\n      > span {\n        margin-left: 0;\n        .border-left-radius(@border-radius-base);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius-base);\n      }\n    }\n  }\n\n  > li > a,\n  > li > span {\n    &:hover,\n    &:focus {\n      color: @pagination-hover-color;\n      background-color: @pagination-hover-bg;\n      border-color: @pagination-hover-border;\n    }\n  }\n\n  > .active > a,\n  > .active > span {\n    &,\n    &:hover,\n    &:focus {\n      z-index: 2;\n      color: @pagination-active-color;\n      background-color: @pagination-active-bg;\n      border-color: @pagination-active-border;\n      cursor: default;\n    }\n  }\n\n  > .disabled {\n    > span,\n    > span:hover,\n    > span:focus,\n    > a,\n    > a:hover,\n    > a:focus {\n      color: @pagination-disabled-color;\n      background-color: @pagination-disabled-bg;\n      border-color: @pagination-disabled-border;\n      cursor: @cursor-disabled;\n    }\n  }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n  .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n  .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/panels.less",
    "content": "//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n  margin-bottom: @line-height-computed;\n  background-color: @panel-bg;\n  border: 1px solid transparent;\n  border-radius: @panel-border-radius;\n  .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n  padding: @panel-body-padding;\n  &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n  padding: @panel-heading-padding;\n  border-bottom: 1px solid transparent;\n  .border-top-radius((@panel-border-radius - 1));\n\n  > .dropdown .dropdown-toggle {\n    color: inherit;\n  }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: ceil((@font-size-base * 1.125));\n  color: inherit;\n\n  > a,\n  > small,\n  > .small,\n  > small > a,\n  > .small > a {\n    color: inherit;\n  }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n  padding: @panel-footer-padding;\n  background-color: @panel-footer-bg;\n  border-top: 1px solid @panel-inner-border;\n  .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n  > .list-group,\n  > .panel-collapse > .list-group {\n    margin-bottom: 0;\n\n    .list-group-item {\n      border-width: 1px 0;\n      border-radius: 0;\n    }\n\n    // Add border top radius for first one\n    &:first-child {\n      .list-group-item:first-child {\n        border-top: 0;\n        .border-top-radius((@panel-border-radius - 1));\n      }\n    }\n    // Add border bottom radius for last one\n    &:last-child {\n      .list-group-item:last-child {\n        border-bottom: 0;\n        .border-bottom-radius((@panel-border-radius - 1));\n      }\n    }\n  }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n  .list-group-item:first-child {\n    border-top-width: 0;\n  }\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n  > .table,\n  > .table-responsive > .table,\n  > .panel-collapse > .table {\n    margin-bottom: 0;\n\n    caption {\n      padding-left: @panel-body-padding;\n      padding-right: @panel-body-padding;\n    }\n  }\n  // Add border top radius for first one\n  > .table:first-child,\n  > .table-responsive:first-child > .table:first-child {\n    .border-top-radius((@panel-border-radius - 1));\n\n    > thead:first-child,\n    > tbody:first-child {\n      > tr:first-child {\n        border-top-left-radius: (@panel-border-radius - 1);\n        border-top-right-radius: (@panel-border-radius - 1);\n\n        td:first-child,\n        th:first-child {\n          border-top-left-radius: (@panel-border-radius - 1);\n        }\n        td:last-child,\n        th:last-child {\n          border-top-right-radius: (@panel-border-radius - 1);\n        }\n      }\n    }\n  }\n  // Add border bottom radius for last one\n  > .table:last-child,\n  > .table-responsive:last-child > .table:last-child {\n    .border-bottom-radius((@panel-border-radius - 1));\n\n    > tbody:last-child,\n    > tfoot:last-child {\n      > tr:last-child {\n        border-bottom-left-radius: (@panel-border-radius - 1);\n        border-bottom-right-radius: (@panel-border-radius - 1);\n\n        td:first-child,\n        th:first-child {\n          border-bottom-left-radius: (@panel-border-radius - 1);\n        }\n        td:last-child,\n        th:last-child {\n          border-bottom-right-radius: (@panel-border-radius - 1);\n        }\n      }\n    }\n  }\n  > .panel-body + .table,\n  > .panel-body + .table-responsive,\n  > .table + .panel-body,\n  > .table-responsive + .panel-body {\n    border-top: 1px solid @table-border-color;\n  }\n  > .table > tbody:first-child > tr:first-child th,\n  > .table > tbody:first-child > tr:first-child td {\n    border-top: 0;\n  }\n  > .table-bordered,\n  > .table-responsive > .table-bordered {\n    border: 0;\n    > thead,\n    > tbody,\n    > tfoot {\n      > tr {\n        > th:first-child,\n        > td:first-child {\n          border-left: 0;\n        }\n        > th:last-child,\n        > td:last-child {\n          border-right: 0;\n        }\n      }\n    }\n    > thead,\n    > tbody {\n      > tr:first-child {\n        > td,\n        > th {\n          border-bottom: 0;\n        }\n      }\n    }\n    > tbody,\n    > tfoot {\n      > tr:last-child {\n        > td,\n        > th {\n          border-bottom: 0;\n        }\n      }\n    }\n  }\n  > .table-responsive {\n    border: 0;\n    margin-bottom: 0;\n  }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n  margin-bottom: @line-height-computed;\n\n  // Tighten up margin so it's only between panels\n  .panel {\n    margin-bottom: 0;\n    border-radius: @panel-border-radius;\n\n    + .panel {\n      margin-top: 5px;\n    }\n  }\n\n  .panel-heading {\n    border-bottom: 0;\n\n    + .panel-collapse > .panel-body,\n    + .panel-collapse > .list-group {\n      border-top: 1px solid @panel-inner-border;\n    }\n  }\n\n  .panel-footer {\n    border-top: 0;\n    + .panel-collapse .panel-body {\n      border-bottom: 1px solid @panel-inner-border;\n    }\n  }\n}\n\n\n// Contextual variations\n.panel-default {\n  .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n  .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n  .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n  .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n  .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n  .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/popovers.less",
    "content": "//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: @zindex-popover;\n  display: none;\n  max-width: @popover-max-width;\n  padding: 1px;\n  // Reset font and text properties given new insertion method\n  font-family: @font-family-base;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: @line-height-base;\n  text-align: left;\n  background-color: @popover-bg;\n  background-clip: padding-box;\n  border: 1px solid @popover-fallback-border-color;\n  border: 1px solid @popover-border-color;\n  border-radius: @border-radius-large;\n  .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n  // Overrides for proper insertion\n  white-space: normal;\n\n  // Offset the popover to account for the popover arrow\n  &.top     { margin-top: -@popover-arrow-width; }\n  &.right   { margin-left: @popover-arrow-width; }\n  &.bottom  { margin-top: @popover-arrow-width; }\n  &.left    { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n  margin: 0; // reset heading margin\n  padding: 8px 14px;\n  font-size: @font-size-base;\n  background-color: @popover-title-bg;\n  border-bottom: 1px solid darken(@popover-title-bg, 5%);\n  border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n  &,\n  &:after {\n    position: absolute;\n    display: block;\n    width: 0;\n    height: 0;\n    border-color: transparent;\n    border-style: solid;\n  }\n}\n.popover > .arrow {\n  border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n  border-width: @popover-arrow-width;\n  content: \"\";\n}\n\n.popover {\n  &.top > .arrow {\n    left: 50%;\n    margin-left: -@popover-arrow-outer-width;\n    border-bottom-width: 0;\n    border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-top-color: @popover-arrow-outer-color;\n    bottom: -@popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      bottom: 1px;\n      margin-left: -@popover-arrow-width;\n      border-bottom-width: 0;\n      border-top-color: @popover-arrow-color;\n    }\n  }\n  &.right > .arrow {\n    top: 50%;\n    left: -@popover-arrow-outer-width;\n    margin-top: -@popover-arrow-outer-width;\n    border-left-width: 0;\n    border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-right-color: @popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      left: 1px;\n      bottom: -@popover-arrow-width;\n      border-left-width: 0;\n      border-right-color: @popover-arrow-color;\n    }\n  }\n  &.bottom > .arrow {\n    left: 50%;\n    margin-left: -@popover-arrow-outer-width;\n    border-top-width: 0;\n    border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-bottom-color: @popover-arrow-outer-color;\n    top: -@popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      top: 1px;\n      margin-left: -@popover-arrow-width;\n      border-top-width: 0;\n      border-bottom-color: @popover-arrow-color;\n    }\n  }\n\n  &.left > .arrow {\n    top: 50%;\n    right: -@popover-arrow-outer-width;\n    margin-top: -@popover-arrow-outer-width;\n    border-right-width: 0;\n    border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-left-color: @popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      right: 1px;\n      border-right-width: 0;\n      border-left-color: @popover-arrow-color;\n      bottom: -@popover-arrow-width;\n    }\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/print.less",
    "content": "/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n    *,\n    *:before,\n    *:after {\n        background: transparent !important;\n        color: #000 !important; // Black prints faster: h5bp.com/s\n        box-shadow: none !important;\n        text-shadow: none !important;\n    }\n\n    a,\n    a:visited {\n        text-decoration: underline;\n    }\n\n    a[href]:after {\n        content: \" (\" attr(href) \")\";\n    }\n\n    abbr[title]:after {\n        content: \" (\" attr(title) \")\";\n    }\n\n    // Don't show links that are fragment identifiers,\n    // or use the `javascript:` pseudo protocol\n    a[href^=\"#\"]:after,\n    a[href^=\"javascript:\"]:after {\n        content: \"\";\n    }\n\n    pre,\n    blockquote {\n        border: 1px solid #999;\n        page-break-inside: avoid;\n    }\n\n    thead {\n        display: table-header-group; // h5bp.com/t\n    }\n\n    tr,\n    img {\n        page-break-inside: avoid;\n    }\n\n    img {\n        max-width: 100% !important;\n    }\n\n    p,\n    h2,\n    h3 {\n        orphans: 3;\n        widows: 3;\n    }\n\n    h2,\n    h3 {\n        page-break-after: avoid;\n    }\n\n    // Bootstrap specific changes start\n    //\n    // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245\n    // Once fixed, we can just straight up remove this.\n    select {\n        background: #fff !important;\n    }\n\n    // Bootstrap components\n    .navbar {\n        display: none;\n    }\n    .btn,\n    .dropup > .btn {\n        > .caret {\n            border-top-color: #000 !important;\n        }\n    }\n    .label {\n        border: 1px solid #000;\n    }\n\n    .table {\n        border-collapse: collapse !important;\n\n        td,\n        th {\n            background-color: #fff !important;\n        }\n    }\n    .table-bordered {\n        th,\n        td {\n            border: 1px solid #ddd !important;\n        }\n    }\n\n    // Bootstrap specific changes end\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/progress-bars.less",
    "content": "//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: @line-height-computed;\n  margin-bottom: @line-height-computed;\n  background-color: @progress-bg;\n  border-radius: @progress-border-radius;\n  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: @font-size-small;\n  line-height: @line-height-computed;\n  color: @progress-bar-color;\n  text-align: center;\n  background-color: @progress-bar-bg;\n  .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  #gradient > .striped();\n  background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n  .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n  .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n  .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n  .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n  .progress-bar-variant(@progress-bar-danger-bg);\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/responsive-embed.less",
    "content": "// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n\n  .embed-responsive-item,\n  iframe,\n  embed,\n  object,\n  video {\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n    height: 100%;\n    width: 100%;\n    border: 0;\n  }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/responsive-utilities.less",
    "content": "//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n  width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n\n.visible-xs {\n  @media (max-width: @screen-xs-max) {\n    .responsive-visibility();\n  }\n}\n.visible-xs-block {\n  @media (max-width: @screen-xs-max) {\n    display: block !important;\n  }\n}\n.visible-xs-inline {\n  @media (max-width: @screen-xs-max) {\n    display: inline !important;\n  }\n}\n.visible-xs-inline-block {\n  @media (max-width: @screen-xs-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-sm {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    .responsive-visibility();\n  }\n}\n.visible-sm-block {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: block !important;\n  }\n}\n.visible-sm-inline {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: inline !important;\n  }\n}\n.visible-sm-inline-block {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-md {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    .responsive-visibility();\n  }\n}\n.visible-md-block {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: block !important;\n  }\n}\n.visible-md-inline {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: inline !important;\n  }\n}\n.visible-md-inline-block {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-lg {\n  @media (min-width: @screen-lg-min) {\n    .responsive-visibility();\n  }\n}\n.visible-lg-block {\n  @media (min-width: @screen-lg-min) {\n    display: block !important;\n  }\n}\n.visible-lg-inline {\n  @media (min-width: @screen-lg-min) {\n    display: inline !important;\n  }\n}\n.visible-lg-inline-block {\n  @media (min-width: @screen-lg-min) {\n    display: inline-block !important;\n  }\n}\n\n.hidden-xs {\n  @media (max-width: @screen-xs-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-sm {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-md {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-lg {\n  @media (min-width: @screen-lg-min) {\n    .responsive-invisibility();\n  }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n  .responsive-invisibility();\n\n  @media print {\n    .responsive-visibility();\n  }\n}\n.visible-print-block {\n  display: none !important;\n\n  @media print {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n\n  @media print {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n\n  @media print {\n    display: inline-block !important;\n  }\n}\n\n.hidden-print {\n  @media print {\n    .responsive-invisibility();\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/scaffolding.less",
    "content": "//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n  .box-sizing(border-box);\n}\n*:before,\n*:after {\n  .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n  font-family: @font-family-base;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @text-color;\n  background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\n\n// Links\n\na {\n  color: @link-color;\n  text-decoration: none;\n\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: @link-hover-decoration;\n  }\n\n  &:focus {\n    .tab-focus();\n  }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n  margin: 0;\n}\n\n\n// Images\n\nimg {\n  vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n  .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n  border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n  padding: @thumbnail-padding;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(all .2s ease-in-out);\n\n  // Keep them at most 100% wide\n  .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n  border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n  margin-top:    @line-height-computed;\n  margin-bottom: @line-height-computed;\n  border: 0;\n  border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0,0,0,0);\n  border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n  &:active,\n  &:focus {\n    position: static;\n    width: auto;\n    height: auto;\n    margin: 0;\n    overflow: visible;\n    clip: auto;\n  }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n// Upstream patch for normalize.css submitted: https://github.com/necolas/normalize.css/pull/379 - remove this fix once that is merged\n\n[role=\"button\"] {\n  cursor: pointer;\n}"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/tables.less",
    "content": "//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  background-color: @table-bg;\n}\ncaption {\n  padding-top: @table-cell-padding;\n  padding-bottom: @table-cell-padding;\n  color: @text-muted;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: @line-height-computed;\n  // Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-cell-padding;\n        line-height: @line-height-base;\n        vertical-align: top;\n        border-top: 1px solid @table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid @table-border-color;\n  }\n  // Remove top border from thead by default\n  > caption + thead,\n  > colgroup + thead,\n  > thead:first-child {\n    > tr:first-child {\n      > th,\n      > td {\n        border-top: 0;\n      }\n    }\n  }\n  // Account for multiple tbody instances\n  > tbody + tbody {\n    border-top: 2px solid @table-border-color;\n  }\n\n  // Nesting\n  .table {\n    background-color: @body-bg;\n  }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-condensed-cell-padding;\n      }\n    }\n  }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n  border: 1px solid @table-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid @table-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  > tbody > tr:nth-of-type(odd) {\n    background-color: @table-bg-accent;\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover {\n    background-color: @table-bg-hover;\n  }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n  position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n  float: none;\n  display: table-column;\n}\ntable {\n  td,\n  th {\n    &[class*=\"col-\"] {\n      position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n      float: none;\n      display: table-cell;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n  @media screen and (max-width: @screen-xs-max) {\n    width: 100%;\n    margin-bottom: (@line-height-computed * 0.75);\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid @table-border-color;\n\n    // Tighten up spacing\n    > .table {\n      margin-bottom: 0;\n\n      // Ensure the content doesn't wrap\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th,\n          > td {\n            white-space: nowrap;\n          }\n        }\n      }\n    }\n\n    // Special overrides for the bordered tables\n    > .table-bordered {\n      border: 0;\n\n      // Nuke the appropriate borders so that the parent can handle them\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th:first-child,\n          > td:first-child {\n            border-left: 0;\n          }\n          > th:last-child,\n          > td:last-child {\n            border-right: 0;\n          }\n        }\n      }\n\n      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n      // chances are there will be only one `tr` in a `thead` and that would\n      // remove the border altogether.\n      > tbody,\n      > tfoot {\n        > tr:last-child {\n          > th,\n          > td {\n            border-bottom: 0;\n          }\n        }\n      }\n\n    }\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/theme.less",
    "content": "\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n  .box-shadow(@shadow);\n\n  // Reset the shadow\n  &:active,\n  &.active {\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  .badge {\n    text-shadow: none;\n  }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n  #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n  .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n  background-repeat: repeat-x;\n  border-color: darken(@btn-color, 14%);\n\n  &:hover,\n  &:focus  {\n    background-color: darken(@btn-color, 12%);\n    background-position: 0 -15px;\n  }\n\n  &:active,\n  &.active {\n    background-color: darken(@btn-color, 12%);\n    border-color: darken(@btn-color, 14%);\n  }\n\n  &.disabled,\n  &:disabled,\n  &[disabled] {\n    background-color: darken(@btn-color, 12%);\n    background-image: none;\n  }\n}\n\n// Common styles\n.btn {\n  // Remove the gradient for the pressed/active state\n  &:active,\n  &.active {\n    background-image: none;\n  }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info    { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger  { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n  .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n  background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n  background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n  .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n  border-radius: @navbar-border-radius;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n  .box-shadow(@shadow);\n\n  .navbar-nav > .open > a,\n  .navbar-nav > .active > a {\n    #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n    .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n  }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n  #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n  .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n\n  .navbar-nav > .open > a,\n  .navbar-nav > .active > a {\n    #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n    .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n  }\n\n  .navbar-brand,\n  .navbar-nav > li > a {\n    text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n  }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n  .navbar .navbar-nav .open .dropdown-menu > .active > a {\n    &,\n    &:hover,\n    &:focus {\n      color: #fff;\n      #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n    }\n  }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n  text-shadow: 0 1px 0 rgba(255,255,255,.2);\n  @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n  .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n  border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success    { .alert-styles(@alert-success-bg); }\n.alert-info       { .alert-styles(@alert-info-bg); }\n.alert-warning    { .alert-styles(@alert-warning-bg); }\n.alert-danger     { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n  #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar            { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success    { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info       { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning    { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger     { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n  #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n  border-radius: @border-radius-base;\n  .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n  #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n  border-color: darken(@list-group-active-border, 7.5%);\n\n  .badge {\n    text-shadow: none;\n  }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n  .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading   { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading   { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading   { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading      { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading   { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading    { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n  #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n  border-color: darken(@well-bg, 10%);\n  @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/thumbnails.less",
    "content": "//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n  display: block;\n  padding: @thumbnail-padding;\n  margin-bottom: @line-height-computed;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(border .2s ease-in-out);\n\n  > img,\n  a > img {\n    &:extend(.img-responsive);\n    margin-left: auto;\n    margin-right: auto;\n  }\n\n  // Add a hover state for linked versions only\n  a&:hover,\n  a&:focus,\n  a&.active {\n    border-color: @link-color;\n  }\n\n  // Image captions\n  .caption {\n    padding: @thumbnail-caption-padding;\n    color: @thumbnail-caption-color;\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/tooltip.less",
    "content": "//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n  position: absolute;\n  z-index: @zindex-tooltip;\n  display: block;\n  // Reset font and text properties given new insertion method\n  font-family: @font-family-base;\n  font-size: @font-size-small;\n  font-weight: normal;\n  line-height: 1.4;\n  .opacity(0);\n\n  &.in     { .opacity(@tooltip-opacity); }\n  &.top    { margin-top:  -3px; padding: @tooltip-arrow-width 0; }\n  &.right  { margin-left:  3px; padding: 0 @tooltip-arrow-width; }\n  &.bottom { margin-top:   3px; padding: @tooltip-arrow-width 0; }\n  &.left   { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n  max-width: @tooltip-max-width;\n  padding: 3px 8px;\n  color: @tooltip-color;\n  text-align: center;\n  text-decoration: none;\n  background-color: @tooltip-bg;\n  border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n  &.top .tooltip-arrow {\n    bottom: 0;\n    left: 50%;\n    margin-left: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.top-left .tooltip-arrow {\n    bottom: 0;\n    right: @tooltip-arrow-width;\n    margin-bottom: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.top-right .tooltip-arrow {\n    bottom: 0;\n    left: @tooltip-arrow-width;\n    margin-bottom: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.right .tooltip-arrow {\n    top: 50%;\n    left: 0;\n    margin-top: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-right-color: @tooltip-arrow-color;\n  }\n  &.left .tooltip-arrow {\n    top: 50%;\n    right: 0;\n    margin-top: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-left-color: @tooltip-arrow-color;\n  }\n  &.bottom .tooltip-arrow {\n    top: 0;\n    left: 50%;\n    margin-left: -@tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n  &.bottom-left .tooltip-arrow {\n    top: 0;\n    right: @tooltip-arrow-width;\n    margin-top: -@tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n  &.bottom-right .tooltip-arrow {\n    top: 0;\n    left: @tooltip-arrow-width;\n    margin-top: -@tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/type.less",
    "content": "//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: @headings-font-family;\n  font-weight: @headings-font-weight;\n  line-height: @headings-line-height;\n  color: @headings-color;\n\n  small,\n  .small {\n    font-weight: normal;\n    line-height: 1;\n    color: @headings-small-color;\n  }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: @line-height-computed;\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 65%;\n  }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: (@line-height-computed / 2);\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 75%;\n  }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n  margin-bottom: @line-height-computed;\n  font-size: floor((@font-size-base * 1.15));\n  font-weight: 300;\n  line-height: 1.4;\n\n  @media (min-width: @screen-sm-min) {\n    font-size: (@font-size-base * 1.5);\n  }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n  font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n  background-color: @state-warning-bg;\n  padding: .2em;\n}\n\n// Alignment\n.text-left           { text-align: left; }\n.text-right          { text-align: right; }\n.text-center         { text-align: center; }\n.text-justify        { text-align: justify; }\n.text-nowrap         { white-space: nowrap; }\n\n// Transformation\n.text-lowercase      { text-transform: lowercase; }\n.text-uppercase      { text-transform: uppercase; }\n.text-capitalize     { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n  color: @text-muted;\n}\n.text-primary {\n  .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n  .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n  .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n  .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n  .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n  // Given the contrast here, this is the only class to have its color inverted\n  // automatically.\n  color: #fff;\n  .bg-variant(@brand-primary);\n}\n.bg-success {\n  .bg-variant(@state-success-bg);\n}\n.bg-info {\n  .bg-variant(@state-info-bg);\n}\n.bg-warning {\n  .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n  .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: ((@line-height-computed / 2) - 1);\n  margin: (@line-height-computed * 2) 0 @line-height-computed;\n  border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n  margin-top: 0;\n  margin-bottom: (@line-height-computed / 2);\n  ul,\n  ol {\n    margin-bottom: 0;\n  }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n  .list-unstyled();\n  margin-left: -5px;\n\n  > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px;\n  }\n}\n\n// Description Lists\ndl {\n  margin-top: 0; // Remove browser default\n  margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n  line-height: @line-height-base;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n  dd {\n    &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    dt {\n      float: left;\n      width: (@dl-horizontal-offset - 20);\n      clear: left;\n      text-align: right;\n      .text-overflow();\n    }\n    dd {\n      margin-left: @dl-horizontal-offset;\n    }\n  }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n  font-size: 90%;\n  .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n  padding: (@line-height-computed / 2) @line-height-computed;\n  margin: 0 0 @line-height-computed;\n  font-size: @blockquote-font-size;\n  border-left: 5px solid @blockquote-border-color;\n\n  p,\n  ul,\n  ol {\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  // Note: Deprecated small and .small as of v3.1.0\n  // Context: https://github.com/twbs/bootstrap/issues/11660\n  footer,\n  small,\n  .small {\n    display: block;\n    font-size: 80%; // back to default font-size\n    line-height: @line-height-base;\n    color: @blockquote-small-color;\n\n    &:before {\n      content: '\\2014 \\00A0'; // em dash, nbsp\n    }\n  }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid @blockquote-border-color;\n  border-left: 0;\n  text-align: right;\n\n  // Account for citation\n  footer,\n  small,\n  .small {\n    &:before { content: ''; }\n    &:after {\n      content: '\\00A0 \\2014'; // nbsp, em dash\n    }\n  }\n}\n\n// Addresses\naddress {\n  margin-bottom: @line-height-computed;\n  font-style: normal;\n  line-height: @line-height-base;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/utilities.less",
    "content": "//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n  .clearfix();\n}\n.center-block {\n  .center-block();\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n  display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n  position: fixed;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/variables.less",
    "content": "//\n// Variables\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n@gray-base:              #000;\n@gray-darker:            lighten(@gray-base, 13.5%); // #222\n@gray-dark:              lighten(@gray-base, 20%);   // #333\n@gray:                   lighten(@gray-base, 33.5%); // #555\n@gray-light:             lighten(@gray-base, 46.7%); // #777\n@gray-lighter:           lighten(@gray-base, 93.5%); // #eee\n\n@brand-primary:         darken(#428bca, 6.5%); // #337ab7\n@brand-success:         #5cb85c;\n@brand-info:            #5bc0de;\n@brand-warning:         #f0ad4e;\n@brand-danger:          #d9534f;\n\n\n//== Scaffolding\n//\n//## Settings for some of the most global styles.\n\n//** Background color for `<body>`.\n@body-bg:               #fff;\n//** Global text color on `<body>`.\n@text-color:            @gray-dark;\n\n//** Global textual link color.\n@link-color:            @brand-primary;\n//** Link hover color set via `darken()` function.\n@link-hover-color:      darken(@link-color, 15%);\n//** Link hover decoration.\n@link-hover-decoration: underline;\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n@font-family-sans-serif:  \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n@font-family-serif:       Georgia, \"Times New Roman\", Times, serif;\n//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.\n@font-family-monospace:   Menlo, Monaco, Consolas, \"Courier New\", monospace;\n@font-family-base:        @font-family-sans-serif;\n\n@font-size-base:          14px;\n@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px\n@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px\n\n@font-size-h1:            floor((@font-size-base * 2.6)); // ~36px\n@font-size-h2:            floor((@font-size-base * 2.15)); // ~30px\n@font-size-h3:            ceil((@font-size-base * 1.7)); // ~24px\n@font-size-h4:            ceil((@font-size-base * 1.25)); // ~18px\n@font-size-h5:            @font-size-base;\n@font-size-h6:            ceil((@font-size-base * 0.85)); // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n@line-height-base:        1.428571429; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px\n\n//** By default, this inherits from the `<body>`.\n@headings-font-family:    inherit;\n@headings-font-weight:    500;\n@headings-line-height:    1.1;\n@headings-color:          inherit;\n\n\n//== Iconography\n//\n//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n//** Load fonts from this directory.\n@icon-font-path:          \"../fonts/\";\n//** File name for all font files.\n@icon-font-name:          \"glyphicons-halflings-regular\";\n//** Element ID within SVG icon file.\n@icon-font-svg-id:        \"glyphicons_halflingsregular\";\n\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n@padding-base-vertical:     6px;\n@padding-base-horizontal:   12px;\n\n@padding-large-vertical:    10px;\n@padding-large-horizontal:  16px;\n\n@padding-small-vertical:    5px;\n@padding-small-horizontal:  10px;\n\n@padding-xs-vertical:       1px;\n@padding-xs-horizontal:     5px;\n\n@line-height-large:         1.3333333; // extra decimals for Win 8.1 Chrome\n@line-height-small:         1.5;\n\n@border-radius-base:        4px;\n@border-radius-large:       6px;\n@border-radius-small:       3px;\n\n//** Global color for active items (e.g., navs or dropdowns).\n@component-active-color:    #fff;\n//** Global background color for active items (e.g., navs or dropdowns).\n@component-active-bg:       @brand-primary;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n@caret-width-base:          4px;\n//** Carets increase slightly in size for larger components.\n@caret-width-large:         5px;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for `<th>`s and `<td>`s.\n@table-cell-padding:            8px;\n//** Padding for cells in `.table-condensed`.\n@table-condensed-cell-padding:  5px;\n\n//** Default background color used for all tables.\n@table-bg:                      transparent;\n//** Background color used for `.table-striped`.\n@table-bg-accent:               #f9f9f9;\n//** Background color used for `.table-hover`.\n@table-bg-hover:                #f5f5f5;\n@table-bg-active:               @table-bg-hover;\n\n//** Border color for table and cell borders.\n@table-border-color:            #ddd;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n@btn-font-weight:                normal;\n\n@btn-default-color:              #333;\n@btn-default-bg:                 #fff;\n@btn-default-border:             #ccc;\n\n@btn-primary-color:              #fff;\n@btn-primary-bg:                 @brand-primary;\n@btn-primary-border:             darken(@btn-primary-bg, 5%);\n\n@btn-success-color:              #fff;\n@btn-success-bg:                 @brand-success;\n@btn-success-border:             darken(@btn-success-bg, 5%);\n\n@btn-info-color:                 #fff;\n@btn-info-bg:                    @brand-info;\n@btn-info-border:                darken(@btn-info-bg, 5%);\n\n@btn-warning-color:              #fff;\n@btn-warning-bg:                 @brand-warning;\n@btn-warning-border:             darken(@btn-warning-bg, 5%);\n\n@btn-danger-color:               #fff;\n@btn-danger-bg:                  @brand-danger;\n@btn-danger-border:              darken(@btn-danger-bg, 5%);\n\n@btn-link-disabled-color:        @gray-light;\n\n\n//== Forms\n//\n//##\n\n//** `<input>` background color\n@input-bg:                       #fff;\n//** `<input disabled>` background color\n@input-bg-disabled:              @gray-lighter;\n\n//** Text color for `<input>`s\n@input-color:                    @gray;\n//** `<input>` border color\n@input-border:                   #ccc;\n\n// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4\n//** Default `.form-control` border radius\n// This has no effect on `<select>`s in some browsers, due to the limited stylability of `<select>`s in CSS.\n@input-border-radius:            @border-radius-base;\n//** Large `.form-control` border radius\n@input-border-radius-large:      @border-radius-large;\n//** Small `.form-control` border radius\n@input-border-radius-small:      @border-radius-small;\n\n//** Border color for inputs on focus\n@input-border-focus:             #66afe9;\n\n//** Placeholder text color\n@input-color-placeholder:        #999;\n\n//** Default `.form-control` height\n@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);\n//** Large `.form-control` height\n@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);\n//** Small `.form-control` height\n@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);\n\n//** `.form-group` margin\n@form-group-margin-bottom:       15px;\n\n@legend-color:                   @gray-dark;\n@legend-border-color:            #e5e5e5;\n\n//** Background color for textual input addons\n@input-group-addon-bg:           @gray-lighter;\n//** Border color for textual input addons\n@input-group-addon-border-color: @input-border;\n\n//** Disabled cursor for form controls and buttons.\n@cursor-disabled:                not-allowed;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n@dropdown-bg:                    #fff;\n//** Dropdown menu `border-color`.\n@dropdown-border:                rgba(0,0,0,.15);\n//** Dropdown menu `border-color` **for IE8**.\n@dropdown-fallback-border:       #ccc;\n//** Divider color for between dropdown items.\n@dropdown-divider-bg:            #e5e5e5;\n\n//** Dropdown link text color.\n@dropdown-link-color:            @gray-dark;\n//** Hover color for dropdown links.\n@dropdown-link-hover-color:      darken(@gray-dark, 5%);\n//** Hover background for dropdown links.\n@dropdown-link-hover-bg:         #f5f5f5;\n\n//** Active dropdown menu item text color.\n@dropdown-link-active-color:     @component-active-color;\n//** Active dropdown menu item background color.\n@dropdown-link-active-bg:        @component-active-bg;\n\n//** Disabled dropdown menu item background color.\n@dropdown-link-disabled-color:   @gray-light;\n\n//** Text color for headers within dropdown menus.\n@dropdown-header-color:          @gray-light;\n\n//** Deprecated `@dropdown-caret-color` as of v3.1.0\n@dropdown-caret-color:           #000;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n@zindex-navbar:            1000;\n@zindex-dropdown:          1000;\n@zindex-popover:           1060;\n@zindex-tooltip:           1070;\n@zindex-navbar-fixed:      1030;\n@zindex-modal-background:  1040;\n@zindex-modal:             1050;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n//** Deprecated `@screen-xs` as of v3.0.1\n@screen-xs:                  480px;\n//** Deprecated `@screen-xs-min` as of v3.2.0\n@screen-xs-min:              @screen-xs;\n//** Deprecated `@screen-phone` as of v3.0.1\n@screen-phone:               @screen-xs-min;\n\n// Small screen / tablet\n//** Deprecated `@screen-sm` as of v3.0.1\n@screen-sm:                  768px;\n@screen-sm-min:              @screen-sm;\n//** Deprecated `@screen-tablet` as of v3.0.1\n@screen-tablet:              @screen-sm-min;\n\n// Medium screen / desktop\n//** Deprecated `@screen-md` as of v3.0.1\n@screen-md:                  992px;\n@screen-md-min:              @screen-md;\n//** Deprecated `@screen-desktop` as of v3.0.1\n@screen-desktop:             @screen-md-min;\n\n// Large screen / wide desktop\n//** Deprecated `@screen-lg` as of v3.0.1\n@screen-lg:                  1200px;\n@screen-lg-min:              @screen-lg;\n//** Deprecated `@screen-lg-desktop` as of v3.0.1\n@screen-lg-desktop:          @screen-lg-min;\n\n// So media queries don't overlap when required, provide a maximum\n@screen-xs-max:              (@screen-sm-min - 1);\n@screen-sm-max:              (@screen-md-min - 1);\n@screen-md-max:              (@screen-lg-min - 1);\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n@grid-columns:              12;\n//** Padding between columns. Gets divided in half for the left and right.\n@grid-gutter-width:         30px;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n@grid-float-breakpoint:     @screen-sm-min;\n//** Point at which the navbar begins collapsing.\n@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n@container-tablet:             (720px + @grid-gutter-width);\n//** For `@screen-sm-min` and up.\n@container-sm:                 @container-tablet;\n\n// Medium screen / desktop\n@container-desktop:            (940px + @grid-gutter-width);\n//** For `@screen-md-min` and up.\n@container-md:                 @container-desktop;\n\n// Large screen / wide desktop\n@container-large-desktop:      (1140px + @grid-gutter-width);\n//** For `@screen-lg-min` and up.\n@container-lg:                 @container-large-desktop;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n@navbar-height:                    50px;\n@navbar-margin-bottom:             @line-height-computed;\n@navbar-border-radius:             @border-radius-base;\n@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));\n@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);\n@navbar-collapse-max-height:       340px;\n\n@navbar-default-color:             #777;\n@navbar-default-bg:                #f8f8f8;\n@navbar-default-border:            darken(@navbar-default-bg, 6.5%);\n\n// Navbar links\n@navbar-default-link-color:                #777;\n@navbar-default-link-hover-color:          #333;\n@navbar-default-link-hover-bg:             transparent;\n@navbar-default-link-active-color:         #555;\n@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);\n@navbar-default-link-disabled-color:       #ccc;\n@navbar-default-link-disabled-bg:          transparent;\n\n// Navbar brand label\n@navbar-default-brand-color:               @navbar-default-link-color;\n@navbar-default-brand-hover-color:         darken(@navbar-default-brand-color, 10%);\n@navbar-default-brand-hover-bg:            transparent;\n\n// Navbar toggle\n@navbar-default-toggle-hover-bg:           #ddd;\n@navbar-default-toggle-icon-bar-bg:        #888;\n@navbar-default-toggle-border-color:       #ddd;\n\n\n// Inverted navbar\n// Reset inverted navbar basics\n@navbar-inverse-color:                      lighten(@gray-light, 15%);\n@navbar-inverse-bg:                         #222;\n@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);\n\n// Inverted navbar links\n@navbar-inverse-link-color:                 lighten(@gray-light, 15%);\n@navbar-inverse-link-hover-color:           #fff;\n@navbar-inverse-link-hover-bg:              transparent;\n@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;\n@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);\n@navbar-inverse-link-disabled-color:        #444;\n@navbar-inverse-link-disabled-bg:           transparent;\n\n// Inverted navbar brand label\n@navbar-inverse-brand-color:                @navbar-inverse-link-color;\n@navbar-inverse-brand-hover-color:          #fff;\n@navbar-inverse-brand-hover-bg:             transparent;\n\n// Inverted navbar toggle\n@navbar-inverse-toggle-hover-bg:            #333;\n@navbar-inverse-toggle-icon-bar-bg:         #fff;\n@navbar-inverse-toggle-border-color:        #333;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n@nav-link-padding:                          10px 15px;\n@nav-link-hover-bg:                         @gray-lighter;\n\n@nav-disabled-link-color:                   @gray-light;\n@nav-disabled-link-hover-color:             @gray-light;\n\n//== Tabs\n@nav-tabs-border-color:                     #ddd;\n\n@nav-tabs-link-hover-border-color:          @gray-lighter;\n\n@nav-tabs-active-link-hover-bg:             @body-bg;\n@nav-tabs-active-link-hover-color:          @gray;\n@nav-tabs-active-link-hover-border-color:   #ddd;\n\n@nav-tabs-justified-link-border-color:            #ddd;\n@nav-tabs-justified-active-link-border-color:     @body-bg;\n\n//== Pills\n@nav-pills-border-radius:                   @border-radius-base;\n@nav-pills-active-link-hover-bg:            @component-active-bg;\n@nav-pills-active-link-hover-color:         @component-active-color;\n\n\n//== Pagination\n//\n//##\n\n@pagination-color:                     @link-color;\n@pagination-bg:                        #fff;\n@pagination-border:                    #ddd;\n\n@pagination-hover-color:               @link-hover-color;\n@pagination-hover-bg:                  @gray-lighter;\n@pagination-hover-border:              #ddd;\n\n@pagination-active-color:              #fff;\n@pagination-active-bg:                 @brand-primary;\n@pagination-active-border:             @brand-primary;\n\n@pagination-disabled-color:            @gray-light;\n@pagination-disabled-bg:               #fff;\n@pagination-disabled-border:           #ddd;\n\n\n//== Pager\n//\n//##\n\n@pager-bg:                             @pagination-bg;\n@pager-border:                         @pagination-border;\n@pager-border-radius:                  15px;\n\n@pager-hover-bg:                       @pagination-hover-bg;\n\n@pager-active-bg:                      @pagination-active-bg;\n@pager-active-color:                   @pagination-active-color;\n\n@pager-disabled-color:                 @pagination-disabled-color;\n\n\n//== Jumbotron\n//\n//##\n\n@jumbotron-padding:              30px;\n@jumbotron-color:                inherit;\n@jumbotron-bg:                   @gray-lighter;\n@jumbotron-heading-color:        inherit;\n@jumbotron-font-size:            ceil((@font-size-base * 1.5));\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n@state-success-text:             #3c763d;\n@state-success-bg:               #dff0d8;\n@state-success-border:           darken(spin(@state-success-bg, -10), 5%);\n\n@state-info-text:                #31708f;\n@state-info-bg:                  #d9edf7;\n@state-info-border:              darken(spin(@state-info-bg, -10), 7%);\n\n@state-warning-text:             #8a6d3b;\n@state-warning-bg:               #fcf8e3;\n@state-warning-border:           darken(spin(@state-warning-bg, -10), 5%);\n\n@state-danger-text:              #a94442;\n@state-danger-bg:                #f2dede;\n@state-danger-border:            darken(spin(@state-danger-bg, -10), 5%);\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n@tooltip-max-width:           200px;\n//** Tooltip text color\n@tooltip-color:               #fff;\n//** Tooltip background color\n@tooltip-bg:                  #000;\n@tooltip-opacity:             .9;\n\n//** Tooltip arrow width\n@tooltip-arrow-width:         5px;\n//** Tooltip arrow color\n@tooltip-arrow-color:         @tooltip-bg;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n@popover-bg:                          #fff;\n//** Popover maximum width\n@popover-max-width:                   276px;\n//** Popover border color\n@popover-border-color:                rgba(0,0,0,.2);\n//** Popover fallback border color\n@popover-fallback-border-color:       #ccc;\n\n//** Popover title background color\n@popover-title-bg:                    darken(@popover-bg, 3%);\n\n//** Popover arrow width\n@popover-arrow-width:                 10px;\n//** Popover arrow color\n@popover-arrow-color:                 @popover-bg;\n\n//** Popover outer arrow width\n@popover-arrow-outer-width:           (@popover-arrow-width + 1);\n//** Popover outer arrow color\n@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);\n//** Popover outer arrow fallback color\n@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n@label-default-bg:            @gray-light;\n//** Primary label background color\n@label-primary-bg:            @brand-primary;\n//** Success label background color\n@label-success-bg:            @brand-success;\n//** Info label background color\n@label-info-bg:               @brand-info;\n//** Warning label background color\n@label-warning-bg:            @brand-warning;\n//** Danger label background color\n@label-danger-bg:             @brand-danger;\n\n//** Default label text color\n@label-color:                 #fff;\n//** Default text color of a linked label\n@label-link-hover-color:      #fff;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n@modal-inner-padding:         15px;\n\n//** Padding applied to the modal title\n@modal-title-padding:         15px;\n//** Modal title line-height\n@modal-title-line-height:     @line-height-base;\n\n//** Background color of modal content area\n@modal-content-bg:                             #fff;\n//** Modal content border color\n@modal-content-border-color:                   rgba(0,0,0,.2);\n//** Modal content border color **for IE8**\n@modal-content-fallback-border-color:          #999;\n\n//** Modal backdrop background color\n@modal-backdrop-bg:           #000;\n//** Modal backdrop opacity\n@modal-backdrop-opacity:      .5;\n//** Modal header border color\n@modal-header-border-color:   #e5e5e5;\n//** Modal footer border color\n@modal-footer-border-color:   @modal-header-border-color;\n\n@modal-lg:                    900px;\n@modal-md:                    600px;\n@modal-sm:                    300px;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n@alert-padding:               15px;\n@alert-border-radius:         @border-radius-base;\n@alert-link-font-weight:      bold;\n\n@alert-success-bg:            @state-success-bg;\n@alert-success-text:          @state-success-text;\n@alert-success-border:        @state-success-border;\n\n@alert-info-bg:               @state-info-bg;\n@alert-info-text:             @state-info-text;\n@alert-info-border:           @state-info-border;\n\n@alert-warning-bg:            @state-warning-bg;\n@alert-warning-text:          @state-warning-text;\n@alert-warning-border:        @state-warning-border;\n\n@alert-danger-bg:             @state-danger-bg;\n@alert-danger-text:           @state-danger-text;\n@alert-danger-border:         @state-danger-border;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n@progress-bg:                 #f5f5f5;\n//** Progress bar text color\n@progress-bar-color:          #fff;\n//** Variable for setting rounded corners on progress bar.\n@progress-border-radius:      @border-radius-base;\n\n//** Default progress bar color\n@progress-bar-bg:             @brand-primary;\n//** Success progress bar color\n@progress-bar-success-bg:     @brand-success;\n//** Warning progress bar color\n@progress-bar-warning-bg:     @brand-warning;\n//** Danger progress bar color\n@progress-bar-danger-bg:      @brand-danger;\n//** Info progress bar color\n@progress-bar-info-bg:        @brand-info;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n@list-group-bg:                 #fff;\n//** `.list-group-item` border color\n@list-group-border:             #ddd;\n//** List group border radius\n@list-group-border-radius:      @border-radius-base;\n\n//** Background color of single list items on hover\n@list-group-hover-bg:           #f5f5f5;\n//** Text color of active list items\n@list-group-active-color:       @component-active-color;\n//** Background color of active list items\n@list-group-active-bg:          @component-active-bg;\n//** Border color of active list elements\n@list-group-active-border:      @list-group-active-bg;\n//** Text color for content within active list items\n@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);\n\n//** Text color of disabled list items\n@list-group-disabled-color:      @gray-light;\n//** Background color of disabled list items\n@list-group-disabled-bg:         @gray-lighter;\n//** Text color for content within disabled list items\n@list-group-disabled-text-color: @list-group-disabled-color;\n\n@list-group-link-color:         #555;\n@list-group-link-hover-color:   @list-group-link-color;\n@list-group-link-heading-color: #333;\n\n\n//== Panels\n//\n//##\n\n@panel-bg:                    #fff;\n@panel-body-padding:          15px;\n@panel-heading-padding:       10px 15px;\n@panel-footer-padding:        @panel-heading-padding;\n@panel-border-radius:         @border-radius-base;\n\n//** Border color for elements within panels\n@panel-inner-border:          #ddd;\n@panel-footer-bg:             #f5f5f5;\n\n@panel-default-text:          @gray-dark;\n@panel-default-border:        #ddd;\n@panel-default-heading-bg:    #f5f5f5;\n\n@panel-primary-text:          #fff;\n@panel-primary-border:        @brand-primary;\n@panel-primary-heading-bg:    @brand-primary;\n\n@panel-success-text:          @state-success-text;\n@panel-success-border:        @state-success-border;\n@panel-success-heading-bg:    @state-success-bg;\n\n@panel-info-text:             @state-info-text;\n@panel-info-border:           @state-info-border;\n@panel-info-heading-bg:       @state-info-bg;\n\n@panel-warning-text:          @state-warning-text;\n@panel-warning-border:        @state-warning-border;\n@panel-warning-heading-bg:    @state-warning-bg;\n\n@panel-danger-text:           @state-danger-text;\n@panel-danger-border:         @state-danger-border;\n@panel-danger-heading-bg:     @state-danger-bg;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n@thumbnail-padding:           4px;\n//** Thumbnail background color\n@thumbnail-bg:                @body-bg;\n//** Thumbnail border color\n@thumbnail-border:            #ddd;\n//** Thumbnail border radius\n@thumbnail-border-radius:     @border-radius-base;\n\n//** Custom text color for thumbnail captions\n@thumbnail-caption-color:     @text-color;\n//** Padding around the thumbnail caption\n@thumbnail-caption-padding:   9px;\n\n\n//== Wells\n//\n//##\n\n@well-bg:                     #f5f5f5;\n@well-border:                 darken(@well-bg, 7%);\n\n\n//== Badges\n//\n//##\n\n@badge-color:                 #fff;\n//** Linked badge text color on hover\n@badge-link-hover-color:      #fff;\n@badge-bg:                    @gray-light;\n\n//** Badge text color in active nav link\n@badge-active-color:          @link-color;\n//** Badge background color in active nav link\n@badge-active-bg:             #fff;\n\n@badge-font-weight:           bold;\n@badge-line-height:           1;\n@badge-border-radius:         10px;\n\n\n//== Breadcrumbs\n//\n//##\n\n@breadcrumb-padding-vertical:   8px;\n@breadcrumb-padding-horizontal: 15px;\n//** Breadcrumb background color\n@breadcrumb-bg:                 #f5f5f5;\n//** Breadcrumb text color\n@breadcrumb-color:              #ccc;\n//** Text color of current page in the breadcrumb\n@breadcrumb-active-color:       @gray-light;\n//** Textual separator for between breadcrumb elements\n@breadcrumb-separator:          \"/\";\n\n\n//== Carousel\n//\n//##\n\n@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);\n\n@carousel-control-color:                      #fff;\n@carousel-control-width:                      15%;\n@carousel-control-opacity:                    .5;\n@carousel-control-font-size:                  20px;\n\n@carousel-indicator-active-bg:                #fff;\n@carousel-indicator-border-color:             #fff;\n\n@carousel-caption-color:                      #fff;\n\n\n//== Close\n//\n//##\n\n@close-font-weight:           bold;\n@close-color:                 #000;\n@close-text-shadow:           0 1px 0 #fff;\n\n\n//== Code\n//\n//##\n\n@code-color:                  #c7254e;\n@code-bg:                     #f9f2f4;\n\n@kbd-color:                   #fff;\n@kbd-bg:                      #333;\n\n@pre-bg:                      #f5f5f5;\n@pre-color:                   @gray-dark;\n@pre-border-color:            #ccc;\n@pre-scrollable-max-height:   340px;\n\n\n//== Type\n//\n//##\n\n//** Horizontal offset for forms and lists.\n@component-offset-horizontal: 180px;\n//** Text muted color\n@text-muted:                  @gray-light;\n//** Abbreviations and acronyms border color\n@abbr-border-color:           @gray-light;\n//** Headings small color\n@headings-small-color:        @gray-light;\n//** Blockquote small color\n@blockquote-small-color:      @gray-light;\n//** Blockquote font size\n@blockquote-font-size:        (@font-size-base * 1.25);\n//** Blockquote border color\n@blockquote-border-color:     @gray-lighter;\n//** Page header border color\n@page-header-border-color:    @gray-lighter;\n//** Width of horizontal description list titles\n@dl-horizontal-offset:        @component-offset-horizontal;\n//** Horizontal line color.\n@hr-border:                   @gray-lighter;\n"
  },
  {
    "path": "examples/libraries/fmt/doc/bootstrap/wells.less",
    "content": "//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: @well-bg;\n  border: 1px solid @well-border;\n  border-radius: @border-radius-base;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n  blockquote {\n    border-color: #ddd;\n    border-color: rgba(0,0,0,.15);\n  }\n}\n\n// Sizes\n.well-lg {\n  padding: 24px;\n  border-radius: @border-radius-large;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: @border-radius-small;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/build.py",
    "content": "#!/usr/bin/env python3\n# Build the documentation.\n\nimport errno, os, re, sys\nfrom subprocess import check_call, CalledProcessError, Popen, PIPE, STDOUT\n\nversions = ['1.0.0', '1.1.0', '2.0.0', '3.0.2', '4.0.0', '4.1.0', '5.0.0', '5.1.0', '5.2.0', '5.2.1', '5.3.0', '6.0.0', '6.1.0', '6.1.1', '6.1.2', '6.2.0', '6.2.1', '7.0.0', '7.0.1', '7.0.2', '7.0.3', '7.1.0', '7.1.1', '7.1.2', '7.1.3', '8.0.0', '8.0.1']\n\nclass Pip:\n  def __init__(self, venv_dir):\n    self.path = os.path.join(venv_dir, 'bin', 'pip')\n\n  def install(self, package, commit=None):\n    \"Install package using pip.\"\n    if commit:\n      package = 'git+https://github.com/{0}.git@{1}'.format(package, commit)\n    print('Installing {0}'.format(package))\n    check_call([self.path, 'install', package])\n\ndef create_build_env(venv_dir='virtualenv'):\n  # Create virtualenv.\n  if not os.path.exists(venv_dir):\n    check_call(['python3', '-m', 'venv', venv_dir])\n  # Install Sphinx and Breathe. Require the exact version of Sphinx which is\n  # compatible with Breathe.\n  pip = Pip(venv_dir)\n  pip.install('wheel')\n  pip.install('six')\n  pip.install('sphinx-doc/sphinx', 'v3.3.0')\n  pip.install('michaeljones/breathe', 'v4.25.0')\n\ndef build_docs(version='dev', **kwargs):\n  doc_dir = kwargs.get('doc_dir', os.path.dirname(os.path.realpath(__file__)))\n  work_dir = kwargs.get('work_dir', '.')\n  include_dir = kwargs.get(\n      'include_dir', os.path.join(os.path.dirname(doc_dir), 'include', 'fmt'))\n  # Build docs.\n  cmd = ['doxygen', '-']\n  p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=STDOUT)\n  doxyxml_dir = os.path.join(work_dir, 'doxyxml')\n  out, _ = p.communicate(input=r'''\n      PROJECT_NAME      = fmt\n      GENERATE_LATEX    = NO\n      GENERATE_MAN      = NO\n      GENERATE_RTF      = NO\n      CASE_SENSE_NAMES  = NO\n      INPUT             = {0}/chrono.h {0}/color.h {0}/core.h {0}/compile.h \\\n                          {0}/format.h {0}/os.h {0}/ostream.h {0}/printf.h \\\n                          {0}/xchar.h\n      QUIET             = YES\n      JAVADOC_AUTOBRIEF = YES\n      AUTOLINK_SUPPORT  = NO\n      GENERATE_HTML     = NO\n      GENERATE_XML      = YES\n      XML_OUTPUT        = {1}\n      ALIASES           = \"rst=\\verbatim embed:rst\"\n      ALIASES          += \"endrst=\\endverbatim\"\n      MACRO_EXPANSION   = YES\n      PREDEFINED        = _WIN32=1 \\\n                          __linux__=1 \\\n                          FMT_USE_VARIADIC_TEMPLATES=1 \\\n                          FMT_USE_RVALUE_REFERENCES=1 \\\n                          FMT_USE_USER_DEFINED_LITERALS=1 \\\n                          FMT_USE_ALIAS_TEMPLATES=1 \\\n                          FMT_API= \\\n                          \"FMT_BEGIN_NAMESPACE=namespace fmt {{\" \\\n                          \"FMT_END_NAMESPACE=}}\" \\\n                          \"FMT_STRING_ALIAS=1\" \\\n                          \"FMT_VARIADIC(...)=\" \\\n                          \"FMT_VARIADIC_W(...)=\" \\\n                          \"FMT_DOC=1\"\n      EXCLUDE_SYMBOLS   = fmt::formatter fmt::printf_formatter fmt::arg_join \\\n                          fmt::basic_format_arg::handle\n    '''.format(include_dir, doxyxml_dir).encode('UTF-8'))\n  out = out.decode('utf-8')\n  internal_symbols = [\n    'fmt::detail::.*',\n    'basic_data<>',\n    'fmt::type_identity',\n    'fmt::dynamic_formatter'\n  ]\n  noisy_warnings = [\n    'warning: (Compound|Member .* of class) (' + '|'.join(internal_symbols) + \\\n      ') is not documented.',\n    'warning: Internal inconsistency: .* does not belong to any container!'\n  ]\n  for w in noisy_warnings:\n      out = re.sub('.*' + w + '\\n', '', out)\n  print(out)\n  if p.returncode != 0:\n    raise CalledProcessError(p.returncode, cmd)\n\n  html_dir = os.path.join(work_dir, 'html')\n  main_versions = reversed(versions[-3:])\n  check_call([os.path.join(work_dir, 'virtualenv', 'bin', 'sphinx-build'),\n              '-Dbreathe_projects.format=' + os.path.abspath(doxyxml_dir),\n              '-Dversion=' + version, '-Drelease=' + version,\n              '-Aversion=' + version, '-Aversions=' + ','.join(main_versions),\n              '-b', 'html', doc_dir, html_dir])\n  try:\n    check_call(['lessc', '--verbose', '--clean-css',\n                '--include-path=' + os.path.join(doc_dir, 'bootstrap'),\n                os.path.join(doc_dir, 'fmt.less'),\n                os.path.join(html_dir, '_static', 'fmt.css')])\n  except OSError as e:\n    if e.errno != errno.ENOENT:\n      raise\n    print('lessc not found; make sure that Less (http://lesscss.org/) ' +\n          'is installed')\n    sys.exit(1)\n  return html_dir\n\nif __name__ == '__main__':\n  create_build_env()\n  build_docs(sys.argv[1])\n"
  },
  {
    "path": "examples/libraries/fmt/doc/conf.py",
    "content": "# -*- coding: utf-8 -*-\n#\n# format documentation build configuration file, created by\n# sphinx-quickstart on Tue Dec 18 06:46:16 2012.\n#\n# This file is execfile()d with the current directory set to its containing dir.\n#\n# Note that not all possible configuration values are present in this\n# autogenerated file.\n#\n# All configuration values have a default; values that are commented out\n# serve to show the default.\n\nimport sys, os, re, subprocess\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\n#sys.path.insert(0, os.path.abspath('.'))\n\n# -- General configuration -----------------------------------------------------\n\n# If your documentation needs a minimal Sphinx version, state it here.\nneeds_sphinx = '1.2'\n\nif os.environ.get('READTHEDOCS', None) == 'True':\n  subprocess.call('doxygen')\n\n# Add any Sphinx extension module names here, as strings. They can be extensions\n# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.\nextensions = ['sphinx.ext.ifconfig', 'breathe']\n\nbreathe_default_project = \"format\"\nbreathe_domain_by_extension = {\"h\" : \"cpp\"}\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = ['_templates']\n\n# The suffix of source filenames.\nsource_suffix = '.rst'\n\n# The encoding of source files.\n#source_encoding = 'utf-8-sig'\n\n# The master toctree document.\n#master_doc = 'contents'\n\n# General information about the project.\nproject = u'fmt'\ncopyright = u'2012-present, Victor Zverovich'\n\n# The version info for the project you're documenting, acts as replacement for\n# |version| and |release|, also used in various other places throughout the\n# built documents.\n#\n# The short X.Y version.\n\n# Version and release are passed from CMake.\n#version = None\n\n# The full version, including alpha/beta/rc tags.\n#release = version\n\n# The language for content autogenerated by Sphinx. Refer to documentation\n# for a list of supported languages.\n#language = None\n\n# There are two options for replacing |today|: either, you set today to some\n# non-false value, then it is used:\n#today = ''\n# Else, today_fmt is used as the format for a strftime call.\n#today_fmt = '%B %d, %Y'\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\nexclude_patterns = ['virtualenv']\n\n# The reST default role (used for this markup: `text`) to use for all documents.\ndefault_role = 'cpp:any'\n\n# If true, '()' will be appended to :func: etc. cross-reference text.\n#add_function_parentheses = True\n\n# If true, the current module name will be prepended to all description\n# unit titles (such as .. function::).\n#add_module_names = True\n\n# If true, sectionauthor and moduleauthor directives will be shown in the\n# output. They are ignored by default.\n#show_authors = False\n\n# The name of the Pygments (syntax highlighting) style to use.\npygments_style = 'sphinx'\n\nhighlight_language = 'c++'\n\nprimary_domain = 'cpp'\n\n# A list of ignored prefixes for module index sorting.\n#modindex_common_prefix = []\n\n\n# -- Options for HTML output ---------------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\nhtml_theme = 'basic-bootstrap'\n\n# Theme options are theme-specific and customize the look and feel of a theme\n# further.  For a list of options available for each theme, see the\n# documentation.\n#html_theme_options = {}\n\n# Add any paths that contain custom themes here, relative to this directory.\nhtml_theme_path = ['.']\n\n# The name for this set of Sphinx documents.  If None, it defaults to\n# \"<project> v<release> documentation\".\n#html_title = None\n\n# A shorter title for the navigation bar.  Default is the same as html_title.\n#html_short_title = None\n\n# The name of an image file (relative to this directory) to place at the top\n# of the sidebar.\n#html_logo = None\n\n# The name of an image file (within the static path) to use as favicon of the\n# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32\n# pixels large.\n#html_favicon = None\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\nhtml_static_path = ['_static']\n\n# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,\n# using the given strftime format.\n#html_last_updated_fmt = '%b %d, %Y'\n\n# If true, SmartyPants will be used to convert quotes and dashes to\n# typographically correct entities.\n#html_use_smartypants = True\n\n# Custom sidebar templates, maps document names to template names.\nhtml_sidebars = {\n  '**': ['localtoc.html', 'relations.html', 'sourcelink.html', 'searchbox.html']\n}\n\n# Additional templates that should be rendered to pages, maps page names to\n# template names.\n#html_additional_pages = {}\n\n# If false, no module index is generated.\n#html_domain_indices = True\n\n# If false, no index is generated.\n#html_use_index = True\n\n# If true, the index is split into individual pages for each letter.\n#html_split_index = False\n\n# If true, links to the reST sources are added to the pages.\n#html_show_sourcelink = True\n\n# If true, \"Created using Sphinx\" is shown in the HTML footer. Default is True.\n#html_show_sphinx = True\n\n# If true, \"(C) Copyright ...\" is shown in the HTML footer. Default is True.\n#html_show_copyright = True\n\n# If true, an OpenSearch description file will be output, and all pages will\n# contain a <link> tag referring to it.  The value of this option must be the\n# base URL from which the finished HTML is served.\n#html_use_opensearch = ''\n\n# This is the file name suffix for HTML files (e.g. \".xhtml\").\n#html_file_suffix = None\n\n# Output file base name for HTML help builder.\nhtmlhelp_basename = 'formatdoc'\n\n\n# -- Options for LaTeX output --------------------------------------------------\n\nlatex_elements = {\n# The paper size ('letterpaper' or 'a4paper').\n#'papersize': 'letterpaper',\n\n# The font size ('10pt', '11pt' or '12pt').\n#'pointsize': '10pt',\n\n# Additional stuff for the LaTeX preamble.\n#'preamble': '',\n}\n\n# Grouping the document tree into LaTeX files. List of tuples\n# (source start file, target name, title, author, documentclass [howto/manual]).\nlatex_documents = [\n  ('index', 'format.tex', u'fmt documentation',\n   u'Victor Zverovich', 'manual'),\n]\n\n# The name of an image file (relative to this directory) to place at the top of\n# the title page.\n#latex_logo = None\n\n# For \"manual\" documents, if this is true, then toplevel headings are parts,\n# not chapters.\n#latex_use_parts = False\n\n# If true, show page references after internal links.\n#latex_show_pagerefs = False\n\n# If true, show URL addresses after external links.\n#latex_show_urls = False\n\n# Documents to append as an appendix to all manuals.\n#latex_appendices = []\n\n# If false, no module index is generated.\n#latex_domain_indices = True\n\n\n# -- Options for manual page output --------------------------------------------\n\n# One entry per manual page. List of tuples\n# (source start file, name, description, authors, manual section).\nman_pages = [\n    ('index', 'fmt', u'fmt documentation', [u'Victor Zverovich'], 1)\n]\n\n# If true, show URL addresses after external links.\n#man_show_urls = False\n\n\n# -- Options for Texinfo output ------------------------------------------------\n\n# Grouping the document tree into Texinfo files. List of tuples\n# (source start file, target name, title, author,\n#  dir menu entry, description, category)\ntexinfo_documents = [\n  ('index', 'fmt', u'fmt documentation',\n   u'Victor Zverovich', 'fmt', 'One line description of project.',\n   'Miscellaneous'),\n]\n\n# Documents to append as an appendix to all manuals.\n#texinfo_appendices = []\n\n# If false, no module index is generated.\n#texinfo_domain_indices = True\n\n# How to display URL addresses: 'footnote', 'no', or 'inline'.\n#texinfo_show_urls = 'footnote'\n"
  },
  {
    "path": "examples/libraries/fmt/doc/contents.rst",
    "content": "########\nContents\n########\n\n.. toctree::\n   :maxdepth: 2\n\n   usage\n   api\n   syntax\n"
  },
  {
    "path": "examples/libraries/fmt/doc/fmt.less",
    "content": "@import 'bootstrap.less';\n\n@header-bg: #094d75;\n@icon-font-path: \"fonts/\";\n\nhtml {\n  overflow-y: scroll;\n}\n\n.navbar {\n  border-radius: 0;\n  margin-bottom: 0;\n  background-color: darken(@header-bg, 10%);\n}\n\n.jumbotron {\n  #gradient > .vertical(@header-bg; darken(@header-bg, 2%); 50%; 50%);\n  background-size: 100% 4px;\n  background-color: @header-bg;\n  background-repeat: repeat-y;\n  color: white;\n  text-align: center;\n}\n\ndiv.sphinxsidebar {\n  margin-left: 0;\n}\n\n// Keep content not too wide for better readability.\n.navbar-content, .content {\n  .make-md-column-offset(1);\n  .make-md-column(10);\n  .make-lg-column-offset(2);\n  .make-lg-column(8);\n}\n\n.footer {\n  padding-top: 20px;\n  padding-bottom: 20px;\n  border-top: 1px solid @gray-lighter;\n  text-align: center;\n}\n\n// Indent descriptions of classes, functions and macros.\n.class dd, .function dd, .macro dd {\n  margin-left: 20px;\n}\n\n// Remove Bootstrap padding for Sphinx containers.\n.breathe-sectiondef.container {\n  padding: 0;\n}\n\n// Remove Bootstrap padding for Sphinx code elements in API signatures.\n.descclassname, .descname {\n  padding: 0;\n}\n\n// Override center alignment in tables.\ntd {\n  text-align: left;\n}\n\np.rubric {\n  margin-top: 10px;\n}\n\n.github-btn {\n  border: 0;\n  overflow: hidden;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/doc/index.rst",
    "content": "Overview\n========\n\n**{fmt}** is an open-source formatting library providing a fast and safe\nalternative to C stdio and C++ iostreams.\n\n.. raw:: html\n\n   <div class=\"panel panel-default\">\n     <div class=\"panel-heading\">What users say:</div>\n     <div class=\"panel-body\">\n       Thanks for creating this library. It’s been a hole in C++ for\n       a long time. I’ve used both <code>boost::format</code> and\n       <code>loki::SPrintf</code>, and neither felt like the right answer.\n       This does.\n     </div>\n   </div>\n\n.. _format-api-intro:\n\nFormat API\n----------\n\nThe format API is similar in spirit to the C ``printf`` family of function but\nis safer, simpler and several times `faster\n<https://www.zverovich.net/2020/06/13/fast-int-to-string-revisited.html>`_\nthan common standard library implementations.\nThe `format string syntax <syntax.html>`_ is similar to the one used by\n`str.format <https://docs.python.org/3/library/stdtypes.html#str.format>`_ in\nPython:\n\n.. code:: c++\n\n  std::string s = fmt::format(\"The answer is {}.\", 42);\n  \nThe ``fmt::format`` function returns a string \"The answer is 42.\". You can use\n``fmt::memory_buffer`` to avoid constructing ``std::string``:\n\n.. code:: c++\n\n  auto out = fmt::memory_buffer();\n  format_to(std::back_inserter(out),\n            \"For a moment, {} happened.\", \"nothing\");\n  auto data = out.data(); // pointer to the formatted data\n  auto size = out.size(); // size of the formatted data\n\nThe ``fmt::print`` function performs formatting and writes the result to a stream:\n\n.. code:: c++\n\n  fmt::print(stderr, \"System error code = {}\\n\", errno);\n\nIf you omit the file argument the function will print to ``stdout``:\n\n.. code:: c++\n\n  fmt::print(\"Don't {}\\n\", \"panic\");\n\nThe format API also supports positional arguments useful for localization:\n\n.. code:: c++\n\n  fmt::print(\"I'd rather be {1} than {0}.\", \"right\", \"happy\");\n\nYou can pass named arguments with ``fmt::arg``:\n\n.. code:: c++\n\n  fmt::print(\"Hello, {name}! The answer is {number}. Goodbye, {name}.\",\n             fmt::arg(\"name\", \"World\"), fmt::arg(\"number\", 42));\n\nIf your compiler supports C++11 user-defined literals, the suffix ``_a`` offers \nan alternative, slightly terser syntax for named arguments:\n\n.. code:: c++\n\n  using namespace fmt::literals;\n  fmt::print(\"Hello, {name}! The answer is {number}. Goodbye, {name}.\",\n             \"name\"_a=\"World\", \"number\"_a=42);\n\n.. _safety:\n\nSafety\n------\n\nThe library is fully type safe, automatic memory management prevents buffer\noverflow, errors in format strings are reported using exceptions or at compile\ntime. For example, the code\n\n.. code:: c++\n\n  fmt::format(\"The answer is {:d}\", \"forty-two\");\n\nthrows the ``format_error`` exception because the argument ``\"forty-two\"`` is a\nstring while the format code ``d`` only applies to integers.\n\nThe code\n\n.. code:: c++\n\n  format(FMT_STRING(\"The answer is {:d}\"), \"forty-two\");\n\nreports a compile-time error on compilers that support relaxed ``constexpr``.\nSee `here <api.html#c.fmt>`_ for details.\n\nThe following code\n\n.. code:: c++\n\n  fmt::format(\"Cyrillic letter {}\", L'\\x42e');\n  \nproduces a compile-time error because wide character ``L'\\x42e'`` cannot be\nformatted into a narrow string. For comparison, writing a wide character to\n``std::ostream`` results in its numeric value being written to the stream\n(i.e. 1070 instead of letter 'ю' which is represented by ``L'\\x42e'`` if we\nuse Unicode) which is rarely desirable.\n\nCompact Binary Code\n-------------------\n\nThe library produces compact per-call compiled code. For example\n(`godbolt <https://godbolt.org/g/TZU4KF>`_),\n\n.. code:: c++\n\n   #include <fmt/core.h>\n\n   int main() {\n     fmt::print(\"The answer is {}.\", 42);\n   }\n\ncompiles to just\n\n.. code:: asm\n\n   main: # @main\n     sub rsp, 24\n     mov qword ptr [rsp], 42\n     mov rcx, rsp\n     mov edi, offset .L.str\n     mov esi, 17\n     mov edx, 1\n     call fmt::v7::vprint(fmt::v7::basic_string_view<char>, fmt::v7::format_args)\n     xor eax, eax\n     add rsp, 24\n     ret\n   .L.str:\n     .asciz \"The answer is {}.\"\n\n.. _portability:\n\nPortability\n-----------\n\nThe library is highly portable and relies only on a small set of C++11 features:\n\n* variadic templates\n* type traits\n* rvalue references\n* decltype\n* trailing return types\n* deleted functions\n* alias templates\n\nThese are available in GCC 4.8, Clang 3.4, MSVC 19.0 (2015) and more recent\ncompiler version. For older compilers use {fmt} `version 4.x\n<https://github.com/fmtlib/fmt/releases/tag/4.1.0>`_ which is maintained and\nonly requires C++98.\n\nThe output of all formatting functions is consistent across platforms.\nFor example,\n\n.. code::\n\n  fmt::print(\"{}\", std::numeric_limits<double>::infinity());\n\nalways prints ``inf`` while the output of ``printf`` is platform-dependent.\n\n.. _ease-of-use:\n\nEase of Use\n-----------\n\n{fmt} has a small self-contained code base with the core library consisting of\njust three header files and no external dependencies.\nA permissive MIT `license <https://github.com/fmtlib/fmt#license>`_ allows\nusing the library both in open-source and commercial projects.\n\n`Learn more... <contents.html>`_\n\n.. raw:: html\n\n  <a class=\"btn btn-success\" href=\"https://github.com/fmtlib/fmt\">GitHub Repository</a>\n\n  <div class=\"section footer\">\n    <iframe src=\"https://ghbtns.com/github-btn.html?user=fmtlib&amp;repo=fmt&amp;type=watch&amp;count=true\"\n            class=\"github-btn\" width=\"100\" height=\"20\"></iframe>\n  </div>\n"
  },
  {
    "path": "examples/libraries/fmt/doc/python-license.txt",
    "content": "A. HISTORY OF THE SOFTWARE\n==========================\n\nPython was created in the early 1990s by Guido van Rossum at Stichting\nMathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands\nas a successor of a language called ABC.  Guido remains Python's\nprincipal author, although it includes many contributions from others.\n\nIn 1995, Guido continued his work on Python at the Corporation for\nNational Research Initiatives (CNRI, see http://www.cnri.reston.va.us)\nin Reston, Virginia where he released several versions of the\nsoftware.\n\nIn May 2000, Guido and the Python core development team moved to\nBeOpen.com to form the BeOpen PythonLabs team.  In October of the same\nyear, the PythonLabs team moved to Digital Creations (now Zope\nCorporation, see http://www.zope.com).  In 2001, the Python Software\nFoundation (PSF, see http://www.python.org/psf/) was formed, a\nnon-profit organization created specifically to own Python-related\nIntellectual Property.  Zope Corporation is a sponsoring member of\nthe PSF.\n\nAll Python releases are Open Source (see http://www.opensource.org for\nthe Open Source Definition).  Historically, most, but not all, Python\nreleases have also been GPL-compatible; the table below summarizes\nthe various releases.\n\n    Release         Derived     Year        Owner       GPL-\n                    from                                compatible? (1)\n\n    0.9.0 thru 1.2              1991-1995   CWI         yes\n    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes\n    1.6             1.5.2       2000        CNRI        no\n    2.0             1.6         2000        BeOpen.com  no\n    1.6.1           1.6         2001        CNRI        yes (2)\n    2.1             2.0+1.6.1   2001        PSF         no\n    2.0.1           2.0+1.6.1   2001        PSF         yes\n    2.1.1           2.1+2.0.1   2001        PSF         yes\n    2.2             2.1.1       2001        PSF         yes\n    2.1.2           2.1.1       2002        PSF         yes\n    2.1.3           2.1.2       2002        PSF         yes\n    2.2.1           2.2         2002        PSF         yes\n    2.2.2           2.2.1       2002        PSF         yes\n    2.2.3           2.2.2       2003        PSF         yes\n    2.3             2.2.2       2002-2003   PSF         yes\n    2.3.1           2.3         2002-2003   PSF         yes\n    2.3.2           2.3.1       2002-2003   PSF         yes\n    2.3.3           2.3.2       2002-2003   PSF         yes\n    2.3.4           2.3.3       2004        PSF         yes\n    2.3.5           2.3.4       2005        PSF         yes\n    2.4             2.3         2004        PSF         yes\n    2.4.1           2.4         2005        PSF         yes\n    2.4.2           2.4.1       2005        PSF         yes\n    2.4.3           2.4.2       2006        PSF         yes\n    2.4.4           2.4.3       2006        PSF         yes\n    2.5             2.4         2006        PSF         yes\n    2.5.1           2.5         2007        PSF         yes\n    2.5.2           2.5.1       2008        PSF         yes\n    2.5.3           2.5.2       2008        PSF         yes\n    2.6             2.5         2008        PSF         yes\n    2.6.1           2.6         2008        PSF         yes\n    2.6.2           2.6.1       2009        PSF         yes\n    2.6.3           2.6.2       2009        PSF         yes\n    2.6.4           2.6.3       2009        PSF         yes\n    2.6.5           2.6.4       2010        PSF         yes\n    3.0             2.6         2008        PSF         yes\n    3.0.1           3.0         2009        PSF         yes\n    3.1             3.0.1       2009        PSF         yes\n    3.1.1           3.1         2009        PSF         yes\n    3.1.2           3.1.1       2010        PSF         yes\n    3.1.3           3.1.2       2010        PSF         yes\n    3.1.4           3.1.3       2011        PSF         yes\n    3.2             3.1         2011        PSF         yes\n    3.2.1           3.2         2011        PSF         yes\n    3.2.2           3.2.1       2011        PSF         yes\n    3.2.3           3.2.2       2012        PSF         yes\n    3.3.0           3.2         2012        PSF         yes\n\nFootnotes:\n\n(1) GPL-compatible doesn't mean that we're distributing Python under\n    the GPL.  All Python licenses, unlike the GPL, let you distribute\n    a modified version without making your changes open source.  The\n    GPL-compatible licenses make it possible to combine Python with\n    other software that is released under the GPL; the others don't.\n\n(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,\n    because its license has a choice of law clause.  According to\n    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1\n    is \"not incompatible\" with the GPL.\n\nThanks to the many outside volunteers who have worked under Guido's\ndirection to make these releases possible.\n\n\nB. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON\n===============================================================\n\nPYTHON SOFTWARE FOUNDATION LICENSE VERSION 2\n--------------------------------------------\n\n1. This LICENSE AGREEMENT is between the Python Software Foundation\n(\"PSF\"), and the Individual or Organization (\"Licensee\") accessing and\notherwise using this software (\"Python\") in source or binary form and\nits associated documentation.\n\n2. Subject to the terms and conditions of this License Agreement, PSF hereby\ngrants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,\nanalyze, test, perform and/or display publicly, prepare derivative works,\ndistribute, and otherwise use Python alone or in any derivative version,\nprovided, however, that PSF's License Agreement and PSF's notice of copyright,\ni.e., \"Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,\n2011, 2012 Python Software Foundation; All Rights Reserved\" are retained in Python\nalone or in any derivative version prepared by Licensee.\n\n3. In the event Licensee prepares a derivative work that is based on\nor incorporates Python or any part thereof, and wants to make\nthe derivative work available to others as provided herein, then\nLicensee hereby agrees to include in any such work a brief summary of\nthe changes made to Python.\n\n4. PSF is making Python available to Licensee on an \"AS IS\"\nbasis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR\nIMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND\nDISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS\nFOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT\nINFRINGE ANY THIRD PARTY RIGHTS.\n\n5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON\nFOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS\nA RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,\nOR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.\n\n6. This License Agreement will automatically terminate upon a material\nbreach of its terms and conditions.\n\n7. Nothing in this License Agreement shall be deemed to create any\nrelationship of agency, partnership, or joint venture between PSF and\nLicensee.  This License Agreement does not grant permission to use PSF\ntrademarks or trade name in a trademark sense to endorse or promote\nproducts or services of Licensee, or any third party.\n\n8. By copying, installing or otherwise using Python, Licensee\nagrees to be bound by the terms and conditions of this License\nAgreement.\n\n\nBEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0\n-------------------------------------------\n\nBEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1\n\n1. This LICENSE AGREEMENT is between BeOpen.com (\"BeOpen\"), having an\noffice at 160 Saratoga Avenue, Santa Clara, CA 95051, and the\nIndividual or Organization (\"Licensee\") accessing and otherwise using\nthis software in source or binary form and its associated\ndocumentation (\"the Software\").\n\n2. Subject to the terms and conditions of this BeOpen Python License\nAgreement, BeOpen hereby grants Licensee a non-exclusive,\nroyalty-free, world-wide license to reproduce, analyze, test, perform\nand/or display publicly, prepare derivative works, distribute, and\notherwise use the Software alone or in any derivative version,\nprovided, however, that the BeOpen Python License is retained in the\nSoftware, alone or in any derivative version prepared by Licensee.\n\n3. BeOpen is making the Software available to Licensee on an \"AS IS\"\nbasis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR\nIMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND\nDISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS\nFOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT\nINFRINGE ANY THIRD PARTY RIGHTS.\n\n4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE\nSOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS\nAS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY\nDERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.\n\n5. This License Agreement will automatically terminate upon a material\nbreach of its terms and conditions.\n\n6. This License Agreement shall be governed by and interpreted in all\nrespects by the law of the State of California, excluding conflict of\nlaw provisions.  Nothing in this License Agreement shall be deemed to\ncreate any relationship of agency, partnership, or joint venture\nbetween BeOpen and Licensee.  This License Agreement does not grant\npermission to use BeOpen trademarks or trade names in a trademark\nsense to endorse or promote products or services of Licensee, or any\nthird party.  As an exception, the \"BeOpen Python\" logos available at\nhttp://www.pythonlabs.com/logos.html may be used according to the\npermissions granted on that web page.\n\n7. By copying, installing or otherwise using the software, Licensee\nagrees to be bound by the terms and conditions of this License\nAgreement.\n\n\nCNRI LICENSE AGREEMENT FOR PYTHON 1.6.1\n---------------------------------------\n\n1. This LICENSE AGREEMENT is between the Corporation for National\nResearch Initiatives, having an office at 1895 Preston White Drive,\nReston, VA 20191 (\"CNRI\"), and the Individual or Organization\n(\"Licensee\") accessing and otherwise using Python 1.6.1 software in\nsource or binary form and its associated documentation.\n\n2. Subject to the terms and conditions of this License Agreement, CNRI\nhereby grants Licensee a nonexclusive, royalty-free, world-wide\nlicense to reproduce, analyze, test, perform and/or display publicly,\nprepare derivative works, distribute, and otherwise use Python 1.6.1\nalone or in any derivative version, provided, however, that CNRI's\nLicense Agreement and CNRI's notice of copyright, i.e., \"Copyright (c)\n1995-2001 Corporation for National Research Initiatives; All Rights\nReserved\" are retained in Python 1.6.1 alone or in any derivative\nversion prepared by Licensee.  Alternately, in lieu of CNRI's License\nAgreement, Licensee may substitute the following text (omitting the\nquotes): \"Python 1.6.1 is made available subject to the terms and\nconditions in CNRI's License Agreement.  This Agreement together with\nPython 1.6.1 may be located on the Internet using the following\nunique, persistent identifier (known as a handle): 1895.22/1013.  This\nAgreement may also be obtained from a proxy server on the Internet\nusing the following URL: http://hdl.handle.net/1895.22/1013\".\n\n3. In the event Licensee prepares a derivative work that is based on\nor incorporates Python 1.6.1 or any part thereof, and wants to make\nthe derivative work available to others as provided herein, then\nLicensee hereby agrees to include in any such work a brief summary of\nthe changes made to Python 1.6.1.\n\n4. CNRI is making Python 1.6.1 available to Licensee on an \"AS IS\"\nbasis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR\nIMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND\nDISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS\nFOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT\nINFRINGE ANY THIRD PARTY RIGHTS.\n\n5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON\n1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS\nA RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,\nOR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.\n\n6. This License Agreement will automatically terminate upon a material\nbreach of its terms and conditions.\n\n7. This License Agreement shall be governed by the federal\nintellectual property law of the United States, including without\nlimitation the federal copyright law, and, to the extent such\nU.S. federal law does not apply, by the law of the Commonwealth of\nVirginia, excluding Virginia's conflict of law provisions.\nNotwithstanding the foregoing, with regard to derivative works based\non Python 1.6.1 that incorporate non-separable material that was\npreviously distributed under the GNU General Public License (GPL), the\nlaw of the Commonwealth of Virginia shall govern this License\nAgreement only as to issues arising under or with respect to\nParagraphs 4, 5, and 7 of this License Agreement.  Nothing in this\nLicense Agreement shall be deemed to create any relationship of\nagency, partnership, or joint venture between CNRI and Licensee.  This\nLicense Agreement does not grant permission to use CNRI trademarks or\ntrade name in a trademark sense to endorse or promote products or\nservices of Licensee, or any third party.\n\n8. By clicking on the \"ACCEPT\" button where indicated, or by copying,\ninstalling or otherwise using Python 1.6.1, Licensee agrees to be\nbound by the terms and conditions of this License Agreement.\n\n        ACCEPT\n\n\nCWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2\n--------------------------------------------------\n\nCopyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,\nThe Netherlands.  All rights reserved.\n\nPermission to use, copy, modify, and distribute this software and its\ndocumentation for any purpose and without fee is hereby granted,\nprovided that the above copyright notice appear in all copies and that\nboth that copyright notice and this permission notice appear in\nsupporting documentation, and that the name of Stichting Mathematisch\nCentrum or CWI not be used in advertising or publicity pertaining to\ndistribution of the software without specific, written prior\npermission.\n\nSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO\nTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE\nFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT\nOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n"
  },
  {
    "path": "examples/libraries/fmt/doc/syntax.rst",
    "content": ".. _syntax:\n\n********************\nFormat String Syntax\n********************\n\nFormatting functions such as :ref:`fmt::format() <format>` and\n:ref:`fmt::print() <print>` use the same format string syntax described in this\nsection.\n\nFormat strings contain \"replacement fields\" surrounded by curly braces ``{}``.\nAnything that is not contained in braces is considered literal text, which is\ncopied unchanged to the output.  If you need to include a brace character in the\nliteral text, it can be escaped by doubling: ``{{`` and ``}}``.\n\nThe grammar for a replacement field is as follows:\n\n.. productionlist:: sf\n   replacement_field: \"{\" [`arg_id`] [\":\" (`format_spec` | `chrono_format_spec`)] \"}\"\n   arg_id: `integer` | `identifier`\n   integer: `digit`+\n   digit: \"0\"...\"9\"\n   identifier: `id_start` `id_continue`*\n   id_start: \"a\"...\"z\" | \"A\"...\"Z\" | \"_\"\n   id_continue: `id_start` | `digit`\n\nIn less formal terms, the replacement field can start with an *arg_id*\nthat specifies the argument whose value is to be formatted and inserted into\nthe output instead of the replacement field.\nThe *arg_id* is optionally followed by a *format_spec*, which is preceded by a\ncolon ``':'``.  These specify a non-default format for the replacement value.\n\nSee also the :ref:`formatspec` section.\n\nIf the numerical arg_ids in a format string are 0, 1, 2, ... in sequence,\nthey can all be omitted (not just some) and the numbers 0, 1, 2, ... will be\nautomatically inserted in that order.\n\nNamed arguments can be referred to by their names or indices.\n\nSome simple format string examples::\n\n   \"First, thou shalt count to {0}\" // References the first argument\n   \"Bring me a {}\"                  // Implicitly references the first argument\n   \"From {} to {}\"                  // Same as \"From {0} to {1}\"\n\nThe *format_spec* field contains a specification of how the value should be\npresented, including such details as field width, alignment, padding, decimal\nprecision and so on.  Each value type can define its own \"formatting\nmini-language\" or interpretation of the *format_spec*.\n\nMost built-in types support a common formatting mini-language, which is\ndescribed in the next section.\n\nA *format_spec* field can also include nested replacement fields in certain\npositions within it. These nested replacement fields can contain only an\nargument id; format specifications are not allowed. This allows the formatting\nof a value to be dynamically specified.\n\nSee the :ref:`formatexamples` section for some examples.\n\n.. _formatspec:\n\nFormat Specification Mini-Language\n==================================\n\n\"Format specifications\" are used within replacement fields contained within a\nformat string to define how individual values are presented (see\n:ref:`syntax`).  Each formattable type may define how the format\nspecification is to be interpreted.\n\nMost built-in types implement the following options for format specifications,\nalthough some of the formatting options are only supported by the numeric types.\n\nThe general form of a *standard format specifier* is:\n\n.. productionlist:: sf\n   format_spec: [[`fill`]`align`][`sign`][\"#\"][\"0\"][`width`][\".\" `precision`][\"L\"][`type`]\n   fill: <a character other than '{' or '}'>\n   align: \"<\" | \">\" | \"^\"\n   sign: \"+\" | \"-\" | \" \"\n   width: `integer` | \"{\" [`arg_id`] \"}\"\n   precision: `integer` | \"{\" [`arg_id`] \"}\"\n   type: \"a\" | \"A\" | \"b\" | \"B\" | \"c\" | \"d\" | \"e\" | \"E\" | \"f\" | \"F\" | \"g\" | \"G\" |\n       : \"o\" | \"p\" | \"s\" | \"x\" | \"X\"\n\nThe *fill* character can be any Unicode code point other than ``'{'`` or\n``'}'``. The presence of a fill character is signaled by the character following\nit, which must be one of the alignment options. If the second character of\n*format_spec* is not a valid alignment option, then it is assumed that both the\nfill character and the alignment option are absent.\n\nThe meaning of the various alignment options is as follows:\n\n+---------+----------------------------------------------------------+\n| Option  | Meaning                                                  |\n+=========+==========================================================+\n| ``'<'`` | Forces the field to be left-aligned within the available |\n|         | space (this is the default for most objects).            |\n+---------+----------------------------------------------------------+\n| ``'>'`` | Forces the field to be right-aligned within the          |\n|         | available space (this is the default for numbers).       |\n+---------+----------------------------------------------------------+\n| ``'^'`` | Forces the field to be centered within the available     |\n|         | space.                                                   |\n+---------+----------------------------------------------------------+\n\nNote that unless a minimum field width is defined, the field width will always\nbe the same size as the data to fill it, so that the alignment option has no\nmeaning in this case.\n\nThe *sign* option is only valid for number types, and can be one of the\nfollowing:\n\n+---------+----------------------------------------------------------+\n| Option  | Meaning                                                  |\n+=========+==========================================================+\n| ``'+'`` | indicates that a sign should be used for both            |\n|         | positive as well as negative numbers.                    |\n+---------+----------------------------------------------------------+\n| ``'-'`` | indicates that a sign should be used only for negative   |\n|         | numbers (this is the default behavior).                  |\n+---------+----------------------------------------------------------+\n| space   | indicates that a leading space should be used on         |\n|         | positive numbers, and a minus sign on negative numbers.  |\n+---------+----------------------------------------------------------+\n\nThe ``'#'`` option causes the \"alternate form\" to be used for the\nconversion.  The alternate form is defined differently for different\ntypes.  This option is only valid for integer and floating-point types.\nFor integers, when binary, octal, or hexadecimal output is used, this\noption adds the prefix respective ``\"0b\"`` (``\"0B\"``), ``\"0\"``, or\n``\"0x\"`` (``\"0X\"``) to the output value.  Whether the prefix is\nlower-case or upper-case is determined by the case of the type\nspecifier, for example, the prefix ``\"0x\"`` is used for the type ``'x'``\nand ``\"0X\"`` is used for ``'X'``.  For floating-point numbers the\nalternate form causes the result of the conversion to always contain a\ndecimal-point character, even if no digits follow it. Normally, a\ndecimal-point character appears in the result of these conversions\nonly if a digit follows it. In addition, for ``'g'`` and ``'G'``\nconversions, trailing zeros are not removed from the result.\n\n.. ifconfig:: False\n\n   The ``','`` option signals the use of a comma for a thousands separator.\n   For a locale aware separator, use the ``'L'`` integer presentation type\n   instead.\n\n*width* is a decimal integer defining the minimum field width.  If not\nspecified, then the field width will be determined by the content.\n\nPreceding the *width* field by a zero (``'0'``) character enables sign-aware\nzero-padding for numeric types. It forces the padding to be placed after the\nsign or base (if any) but before the digits. This is used for printing fields in\nthe form '+000000120'. This option is only valid for numeric types and it has no\neffect on formatting of infinity and NaN.\n\nThe *precision* is a decimal number indicating how many digits should be\ndisplayed after the decimal point for a floating-point value formatted with\n``'f'`` and ``'F'``, or before and after the decimal point for a floating-point\nvalue formatted with ``'g'`` or ``'G'``.  For non-number types the field\nindicates the maximum field size - in other words, how many characters will be\nused from the field content. The *precision* is not allowed for integer,\ncharacter, Boolean, and pointer values.\n\nThe ``'L'`` option uses the current locale setting to insert the appropriate\nnumber separator characters. This option is only valid for numeric types.\n\nFinally, the *type* determines how the data should be presented.\n\nThe available string presentation types are:\n\n+---------+----------------------------------------------------------+\n| Type    | Meaning                                                  |\n+=========+==========================================================+\n| ``'s'`` | String format. This is the default type for strings and  |\n|         | may be omitted.                                          |\n+---------+----------------------------------------------------------+\n| none    | The same as ``'s'``.                                     |\n+---------+----------------------------------------------------------+\n\nThe available character presentation types are:\n\n+---------+----------------------------------------------------------+\n| Type    | Meaning                                                  |\n+=========+==========================================================+\n| ``'c'`` | Character format. This is the default type for           |\n|         | characters and may be omitted.                           |\n+---------+----------------------------------------------------------+\n| none    | The same as ``'c'``.                                     |\n+---------+----------------------------------------------------------+\n\nThe available integer presentation types are:\n\n+---------+----------------------------------------------------------+\n| Type    | Meaning                                                  |\n+=========+==========================================================+\n| ``'b'`` | Binary format. Outputs the number in base 2. Using the   |\n|         | ``'#'`` option with this type adds the prefix ``\"0b\"``   |\n|         | to the output value.                                     |\n+---------+----------------------------------------------------------+\n| ``'B'`` | Binary format. Outputs the number in base 2. Using the   |\n|         | ``'#'`` option with this type adds the prefix ``\"0B\"``   |\n|         | to the output value.                                     |\n+---------+----------------------------------------------------------+\n| ``'c'`` | Character format. Outputs the number as a character.     |\n+---------+----------------------------------------------------------+\n| ``'d'`` | Decimal integer. Outputs the number in base 10.          |\n+---------+----------------------------------------------------------+\n| ``'o'`` | Octal format. Outputs the number in base 8.              |\n+---------+----------------------------------------------------------+\n| ``'x'`` | Hex format. Outputs the number in base 16, using         |\n|         | lower-case letters for the digits above 9. Using the     |\n|         | ``'#'`` option with this type adds the prefix ``\"0x\"``   |\n|         | to the output value.                                     |\n+---------+----------------------------------------------------------+\n| ``'X'`` | Hex format. Outputs the number in base 16, using         |\n|         | upper-case letters for the digits above 9. Using the     |\n|         | ``'#'`` option with this type adds the prefix ``\"0X\"``   |\n|         | to the output value.                                     |\n+---------+----------------------------------------------------------+\n| none    | The same as ``'d'``.                                     |\n+---------+----------------------------------------------------------+\n\nInteger presentation types can also be used with character and Boolean values.\nBoolean values are formatted using textual representation, either ``true`` or\n``false``, if the presentation type is not specified.\n\nThe available presentation types for floating-point values are:\n\n+---------+----------------------------------------------------------+\n| Type    | Meaning                                                  |\n+=========+==========================================================+\n| ``'a'`` | Hexadecimal floating point format. Prints the number in  |\n|         | base 16 with prefix ``\"0x\"`` and lower-case letters for  |\n|         | digits above 9. Uses ``'p'`` to indicate the exponent.   |\n+---------+----------------------------------------------------------+\n| ``'A'`` | Same as ``'a'`` except it uses upper-case letters for    |\n|         | the prefix, digits above 9 and to indicate the exponent. |\n+---------+----------------------------------------------------------+\n| ``'e'`` | Exponent notation. Prints the number in scientific       |\n|         | notation using the letter 'e' to indicate the exponent.  |\n+---------+----------------------------------------------------------+\n| ``'E'`` | Exponent notation. Same as ``'e'`` except it uses an     |\n|         | upper-case ``'E'`` as the separator character.           |\n+---------+----------------------------------------------------------+\n| ``'f'`` | Fixed point. Displays the number as a fixed-point        |\n|         | number.                                                  |\n+---------+----------------------------------------------------------+\n| ``'F'`` | Fixed point. Same as ``'f'``, but converts ``nan`` to    |\n|         | ``NAN`` and ``inf`` to ``INF``.                          |\n+---------+----------------------------------------------------------+\n| ``'g'`` | General format.  For a given precision ``p >= 1``,       |\n|         | this rounds the number to ``p`` significant digits and   |\n|         | then formats the result in either fixed-point format     |\n|         | or in scientific notation, depending on its magnitude.   |\n|         |                                                          |\n|         | A precision of ``0`` is treated as equivalent to a       |\n|         | precision of ``1``.                                      |\n+---------+----------------------------------------------------------+\n| ``'G'`` | General format. Same as ``'g'`` except switches to       |\n|         | ``'E'`` if the number gets too large. The                |\n|         | representations of infinity and NaN are uppercased, too. |\n+---------+----------------------------------------------------------+\n| none    | Similar to ``'g'``, except that the default precision is |\n|         | as high as needed to represent the particular value.     |\n+---------+----------------------------------------------------------+\n\n.. ifconfig:: False\n\n   +---------+----------------------------------------------------------+\n   |         | The precise rules are as follows: suppose that the       |\n   |         | result formatted with presentation type ``'e'`` and      |\n   |         | precision ``p-1`` would have exponent ``exp``.  Then     |\n   |         | if ``-4 <= exp < p``, the number is formatted            |\n   |         | with presentation type ``'f'`` and precision             |\n   |         | ``p-1-exp``.  Otherwise, the number is formatted         |\n   |         | with presentation type ``'e'`` and precision ``p-1``.    |\n   |         | In both cases insignificant trailing zeros are removed   |\n   |         | from the significand, and the decimal point is also      |\n   |         | removed if there are no remaining digits following it.   |\n   |         |                                                          |\n   |         | Positive and negative infinity, positive and negative    |\n   |         | zero, and nans, are formatted as ``inf``, ``-inf``,      |\n   |         | ``0``, ``-0`` and ``nan`` respectively, regardless of    |\n   |         | the precision.                                           |\n   |         |                                                          |\n   +---------+----------------------------------------------------------+\n\nThe available presentation types for pointers are:\n\n+---------+----------------------------------------------------------+\n| Type    | Meaning                                                  |\n+=========+==========================================================+\n| ``'p'`` | Pointer format. This is the default type for             |\n|         | pointers and may be omitted.                             |\n+---------+----------------------------------------------------------+\n| none    | The same as ``'p'``.                                     |\n+---------+----------------------------------------------------------+\n\n.. _chrono-specs:\n\nChrono Format Specifications\n============================\n\nFormat specifications for chrono types have the following syntax:\n\n.. productionlist:: sf\n   chrono_format_spec: [[`fill`]`align`][`width`][\".\" `precision`][`chrono_specs`]\n   chrono_specs: [`chrono_specs`] `conversion_spec` | `chrono_specs` `literal_char`\n   conversion_spec: \"%\" [`modifier`] `chrono_type`\n   literal_char: <a character other than '{', '}' or '%'>\n   modifier: \"E\" | \"O\"\n   chrono_type: \"a\" | \"A\" | \"b\" | \"B\" | \"c\" | \"C\" | \"d\" | \"D\" | \"e\" | \"F\" |\n              : \"g\" | \"G\" | \"h\" | \"H\" | \"I\" | \"j\" | \"m\" | \"M\" | \"n\" | \"p\" |\n              : \"q\" | \"Q\" | \"r\" | \"R\" | \"S\" | \"t\" | \"T\" | \"u\" | \"U\" | \"V\" |\n              : \"w\" | \"W\" | \"x\" | \"X\" | \"y\" | \"Y\" | \"z\" | \"Z\" | \"%\"\n\nLiteral chars are copied unchanged to the output. Precision is valid only for\n``std::chrono::duration`` types with a floating-point representation type.\n\nThe available presentation types (*chrono_type*) for chrono durations and time\npoints are:\n\n+---------+--------------------------------------------------------------------+\n| Type    | Meaning                                                            |\n+=========+====================================================================+\n| ``'H'`` | The hour (24-hour clock) as a decimal number. If the result is a   |\n|         | single digit, it is prefixed with 0. The modified command ``%OH``  |\n|         | produces the locale's alternative representation.                  |\n+---------+--------------------------------------------------------------------+\n| ``'M'`` | The minute as a decimal number. If the result is a single digit,   |\n|         | it is prefixed with 0. The modified command ``%OM`` produces the   |\n|         | locale's alternative representation.                               |\n+---------+--------------------------------------------------------------------+\n| ``'S'`` | Seconds as a decimal number. If the number of seconds is less than |\n|         | 10, the result is prefixed with 0. If the precision of the input   |\n|         | cannot be exactly represented with seconds, then the format is a   |\n|         | decimal floating-point number with a fixed format and a precision  |\n|         | matching that of the precision of the input (or to a microseconds  |\n|         | precision if the conversion to floating-point decimal seconds      |\n|         | cannot be made within 18 fractional digits). The character for the |\n|         | decimal point is localized according to the locale. The modified   |\n|         | command ``%OS`` produces the locale's alternative representation.  |\n+---------+--------------------------------------------------------------------+\n\nSpecifiers that have a calendaric component such as `'d'` (the day of month)\nare valid only for ``std::tm`` and not durations or time points.\n\n``std::tm`` uses the system's `strftime\n<https://en.cppreference.com/w/cpp/chrono/c/strftime>`_ so refer to its\ndocumentation for details on supported conversion specifiers. \n\n.. _formatexamples:\n\nFormat Examples\n===============\n\nThis section contains examples of the format syntax and comparison with\nthe printf formatting.\n\nIn most of the cases the syntax is similar to the printf formatting, with the\naddition of the ``{}`` and with ``:`` used instead of ``%``.\nFor example, ``\"%03.2f\"`` can be translated to ``\"{:03.2f}\"``.\n\nThe new format syntax also supports new and different options, shown in the\nfollowing examples.\n\nAccessing arguments by position::\n\n   fmt::format(\"{0}, {1}, {2}\", 'a', 'b', 'c');\n   // Result: \"a, b, c\"\n   fmt::format(\"{}, {}, {}\", 'a', 'b', 'c');\n   // Result: \"a, b, c\"\n   fmt::format(\"{2}, {1}, {0}\", 'a', 'b', 'c');\n   // Result: \"c, b, a\"\n   fmt::format(\"{0}{1}{0}\", \"abra\", \"cad\");  // arguments' indices can be repeated\n   // Result: \"abracadabra\"\n\nAligning the text and specifying a width::\n\n   fmt::format(\"{:<30}\", \"left aligned\");\n   // Result: \"left aligned                  \"\n   fmt::format(\"{:>30}\", \"right aligned\");\n   // Result: \"                 right aligned\"\n   fmt::format(\"{:^30}\", \"centered\");\n   // Result: \"           centered           \"\n   fmt::format(\"{:*^30}\", \"centered\");  // use '*' as a fill char\n   // Result: \"***********centered***********\"\n\nDynamic width::\n\n   fmt::format(\"{:<{}}\", \"left aligned\", 30);\n   // Result: \"left aligned                  \"\n\nDynamic precision::\n\n   fmt::format(\"{:.{}f}\", 3.14, 1);\n   // Result: \"3.1\"\n\nReplacing ``%+f``, ``%-f``, and ``% f`` and specifying a sign::\n\n   fmt::format(\"{:+f}; {:+f}\", 3.14, -3.14);  // show it always\n   // Result: \"+3.140000; -3.140000\"\n   fmt::format(\"{: f}; {: f}\", 3.14, -3.14);  // show a space for positive numbers\n   // Result: \" 3.140000; -3.140000\"\n   fmt::format(\"{:-f}; {:-f}\", 3.14, -3.14);  // show only the minus -- same as '{:f}; {:f}'\n   // Result: \"3.140000; -3.140000\"\n\nReplacing ``%x`` and ``%o`` and converting the value to different bases::\n\n   fmt::format(\"int: {0:d};  hex: {0:x};  oct: {0:o}; bin: {0:b}\", 42);\n   // Result: \"int: 42;  hex: 2a;  oct: 52; bin: 101010\"\n   // with 0x or 0 or 0b as prefix:\n   fmt::format(\"int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}\", 42);\n   // Result: \"int: 42;  hex: 0x2a;  oct: 052;  bin: 0b101010\"\n\nPadded hex byte with prefix and always prints both hex characters::\n\n   fmt::format(\"{:#04x}\", 0);\n   // Result: \"0x00\"\n\nBox drawing using Unicode fill::\n\n   fmt::print(\n     \"┌{0:─^{2}}┐\\n\"\n     \"│{1: ^{2}}│\\n\"\n     \"└{0:─^{2}}┘\\n\", \"\", \"Hello, world!\", 20);\n\nprints::\n\n   ┌────────────────────┐\n   │   Hello, world!    │\n   └────────────────────┘\n\nUsing type-specific formatting::\n\n   #include <fmt/chrono.h>\n\n   auto t = tm();\n   t.tm_year = 2010 - 1900;\n   t.tm_mon = 7;\n   t.tm_mday = 4;\n   t.tm_hour = 12;\n   t.tm_min = 15;\n   t.tm_sec = 58;\n   fmt::print(\"{:%Y-%m-%d %H:%M:%S}\", t);\n   // Prints: 2010-08-04 12:15:58\n\nUsing the comma as a thousands separator::\n\n   #include <fmt/locale.h>\n\n   auto s = fmt::format(std::locale(\"en_US.UTF-8\"), \"{:L}\", 1234567890);\n   // s == \"1,234,567,890\"\n\n.. ifconfig:: False\n\n   Nesting arguments and more complex examples::\n\n      >>> for align, text in zip('<^>', ['left', 'center', 'right']):\n      ...     '{0:{fill}{align}16}\") << text, fill=align, align=align)\n      ...\n      'left<<<<<<<<<<<<'\n      '^^^^^center^^^^^'\n      '>>>>>>>>>>>right'\n      >>>\n      >>> octets = [192, 168, 0, 1]\n      Format(\"{:02X}{:02X}{:02X}{:02X}\") << *octets)\n      'C0A80001'\n      >>> int(_, 16)\n      3232235521\n      >>>\n      >>> width = 5\n      >>> for num in range(5,12):\n      ...     for base in 'dXob':\n      ...         print('{0:{width}{base}}\") << num, base=base, width=width), end=' ')\n      ...     print()\n      ...\n          5     5     5   101\n          6     6     6   110\n          7     7     7   111\n          8     8    10  1000\n          9     9    11  1001\n         10     A    12  1010\n         11     B    13  1011\n"
  },
  {
    "path": "examples/libraries/fmt/doc/usage.rst",
    "content": "*****\nUsage\n*****\n\nTo use the {fmt} library, add :file:`fmt/core.h`, :file:`fmt/format.h`,\n:file:`fmt/format-inl.h`, :file:`src/format.cc` and optionally other headers\nfrom a `release archive <https://github.com/fmtlib/fmt/releases/latest>`_ or\nthe `Git repository <https://github.com/fmtlib/fmt>`_ to your project.\nAlternatively, you can :ref:`build the library with CMake <building>`.\n\n.. _building:\n\nBuilding the Library\n====================\n\nThe included `CMake build script`__ can be used to build the fmt\nlibrary on a wide range of platforms. CMake is freely available for\ndownload from https://www.cmake.org/download/.\n\n__ https://github.com/fmtlib/fmt/blob/master/CMakeLists.txt\n\nCMake works by generating native makefiles or project files that can\nbe used in the compiler environment of your choice. The typical\nworkflow starts with::\n\n  mkdir build          # Create a directory to hold the build output.\n  cd build\n  cmake ..  # Generate native build scripts.\n\nwhere :file:`{<path/to/fmt>}` is a path to the ``fmt`` repository.\n\nIf you are on a \\*nix system, you should now see a Makefile in the\ncurrent directory. Now you can build the library by running :command:`make`.\n\nOnce the library has been built you can invoke :command:`make test` to run\nthe tests.\n\nYou can control generation of the make ``test`` target with the ``FMT_TEST``\nCMake option. This can be useful if you include fmt as a subdirectory in\nyour project but don't want to add fmt's tests to your ``test`` target.\n\nIf you use Windows and have Visual Studio installed, a :file:`FMT.sln`\nfile and several :file:`.vcproj` files will be created. You can then build them\nusing Visual Studio or msbuild.\n\nOn Mac OS X with Xcode installed, an :file:`.xcodeproj` file will be generated.\n\nTo build a `shared library`__ set the ``BUILD_SHARED_LIBS`` CMake variable to\n``TRUE``::\n\n  cmake -DBUILD_SHARED_LIBS=TRUE ...\n\n__ https://en.wikipedia.org/wiki/Library_%28computing%29#Shared_libraries\n\n\nTo build a `static library` with position independent code (required if the main\nconsumer of the fmt library is a shared library i.e. a Python extension) set the\n``CMAKE_POSITION_INDEPENDENT_CODE`` CMake variable to ``TRUE``::\n\n  cmake -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE ...\n\n\nInstalling the Library\n======================\n\nAfter building the library you can install it on a Unix-like system by running\n:command:`sudo make install`.\n\nUsage with CMake\n================\n\nYou can add the ``fmt`` library directory into your project and include it in\nyour ``CMakeLists.txt`` file::\n\n   add_subdirectory(fmt)\n\nor\n\n::\n\n   add_subdirectory(fmt EXCLUDE_FROM_ALL)\n\nto exclude it from ``make``, ``make all``, or ``cmake --build .``.\n\nYou can detect and use an installed version of {fmt} as follows::\n\n   find_package(fmt)\n   target_link_libraries(<your-target> fmt::fmt)\n\nSetting up your target to use a header-only version of ``fmt`` is equally easy::\n\n   target_link_libraries(<your-target> PRIVATE fmt::fmt-header-only)\n\nUsage with build2\n=================\n\nYou can use `build2 <https://build2.org>`_, a dependency manager and a\nbuild-system combined, to use ``fmt``.\n\nCurrently this package is available in these package repositories:\n\n- **https://cppget.org/fmt/** for released and published versions.\n- `The git repository with the sources of the build2 package of fmt <https://github.com/build2-packaging/fmt.git>`_\n  for unreleased or custom revisions of ``fmt``.\n\n**Usage:**\n\n- ``build2`` package name: ``fmt``\n- Library target name : ``lib{fmt}``\n\nFor example, to make your ``build2`` project depend on ``fmt``:\n\n- Add one of the repositories to your configurations, or in your\n  ``repositories.manifest``, if not already there::\n\n    :\n    role: prerequisite\n    location: https://pkg.cppget.org/1/stable\n\n- Add this package as a dependency to your ``./manifest`` file\n  (example for ``v7.0.x``)::\n\n    depends: fmt ~7.0.0\n\n- Import the target and use it as a prerequisite to your own target\n  using `fmt` in the appropriate ``buildfile``::\n\n    import fmt = fmt%lib{fmt}\n    lib{mylib} : cxx{**} ... $fmt\n\nThen build your project as usual with `b` or `bdep update`.\n\nFor ``build2`` newcomers or to get more details and use cases, you can read the\n``build2``\n`toolchain introduction <https://build2.org/build2-toolchain/doc/build2-toolchain-intro.xhtml>`_.\n\nBuilding the Documentation\n==========================\n\nTo build the documentation you need the following software installed on your\nsystem:\n\n* `Python <https://www.python.org/>`_ with pip and virtualenv\n* `Doxygen <http://www.stack.nl/~dimitri/doxygen/>`_\n* `Less <http://lesscss.org/>`_ with ``less-plugin-clean-css``.\n  Ubuntu doesn't package the ``clean-css`` plugin so you should use ``npm``\n  instead of ``apt`` to install both ``less`` and the plugin::\n\n    sudo npm install -g less less-plugin-clean-css.\n\nFirst generate makefiles or project files using CMake as described in\nthe previous section. Then compile the ``doc`` target/project, for example::\n\n  make doc\n\nThis will generate the HTML documentation in ``doc/html``.\n\nConda\n=====\n\nfmt can be installed on Linux, macOS and Windows with\n`Conda <https://docs.conda.io/en/latest/>`__, using its\n`conda-forge <https://conda-forge.org>`__\n`package <https://github.com/conda-forge/fmt-feedstock>`__, as follows::\n\n  conda install -c conda-forge fmt\n\nVcpkg\n=====\n\nYou can download and install fmt using the `vcpkg\n<https://github.com/Microsoft/vcpkg>`__ dependency manager::\n\n  git clone https://github.com/Microsoft/vcpkg.git\n  cd vcpkg\n  ./bootstrap-vcpkg.sh\n  ./vcpkg integrate install\n  ./vcpkg install fmt\n\nThe fmt port in vcpkg is kept up to date by Microsoft team members and community\ncontributors. If the version is out of date, please `create an issue or pull\nrequest <https://github.com/Microsoft/vcpkg>`__ on the vcpkg repository.\n\nLHelper\n=======\n\nYou can download and install fmt using\n`lhelper <https://github.com/franko/lhelper>`__ dependency manager::\n\n  lhelper activate <some-environment>\n  lhelper install fmt\n\nAll the recipes for lhelper are kept in the\n`lhelper's recipe <https://github.com/franko/lhelper-recipes>`__ repository.\n\nAndroid NDK\n===========\n\nfmt provides `Android.mk file`__ that can be used to build the library\nwith `Android NDK <https://developer.android.com/tools/sdk/ndk/index.html>`_.\nFor an example of using fmt with Android NDK, see the\n`android-ndk-example <https://github.com/fmtlib/android-ndk-example>`_\nrepository.\n\n__ https://github.com/fmtlib/fmt/blob/master/support/Android.mk\n\nHomebrew\n========\n\nfmt can be installed on OS X using `Homebrew <https://brew.sh/>`_::\n\n  brew install fmt\n"
  },
  {
    "path": "examples/libraries/fmt/include/fmt/args.h",
    "content": "// Formatting library for C++ - dynamic format arguments\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#ifndef FMT_ARGS_H_\n#define FMT_ARGS_H_\n\n#include <functional>  // std::reference_wrapper\n#include <memory>      // std::unique_ptr\n#include <vector>\n\n#include \"core.h\"\n\nFMT_BEGIN_NAMESPACE\n\nnamespace detail {\n\ntemplate <typename T> struct is_reference_wrapper : std::false_type {};\ntemplate <typename T>\nstruct is_reference_wrapper<std::reference_wrapper<T>> : std::true_type {};\n\ntemplate <typename T> const T& unwrap(const T& v) { return v; }\ntemplate <typename T> const T& unwrap(const std::reference_wrapper<T>& v) {\n  return static_cast<const T&>(v);\n}\n\nclass dynamic_arg_list {\n  // Workaround for clang's -Wweak-vtables. Unlike for regular classes, for\n  // templates it doesn't complain about inability to deduce single translation\n  // unit for placing vtable. So storage_node_base is made a fake template.\n  template <typename = void> struct node {\n    virtual ~node() = default;\n    std::unique_ptr<node<>> next;\n  };\n\n  template <typename T> struct typed_node : node<> {\n    T value;\n\n    template <typename Arg>\n    FMT_CONSTEXPR typed_node(const Arg& arg) : value(arg) {}\n\n    template <typename Char>\n    FMT_CONSTEXPR typed_node(const basic_string_view<Char>& arg)\n        : value(arg.data(), arg.size()) {}\n  };\n\n  std::unique_ptr<node<>> head_;\n\n public:\n  template <typename T, typename Arg> const T& push(const Arg& arg) {\n    auto new_node = std::unique_ptr<typed_node<T>>(new typed_node<T>(arg));\n    auto& value = new_node->value;\n    new_node->next = std::move(head_);\n    head_ = std::move(new_node);\n    return value;\n  }\n};\n}  // namespace detail\n\n/**\n  \\rst\n  A dynamic version of `fmt::format_arg_store`.\n  It's equipped with a storage to potentially temporary objects which lifetimes\n  could be shorter than the format arguments object.\n\n  It can be implicitly converted into `~fmt::basic_format_args` for passing\n  into type-erased formatting functions such as `~fmt::vformat`.\n  \\endrst\n */\ntemplate <typename Context>\nclass dynamic_format_arg_store\n#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409\n    // Workaround a GCC template argument substitution bug.\n    : public basic_format_args<Context>\n#endif\n{\n private:\n  using char_type = typename Context::char_type;\n\n  template <typename T> struct need_copy {\n    static constexpr detail::type mapped_type =\n        detail::mapped_type_constant<T, Context>::value;\n\n    enum {\n      value = !(detail::is_reference_wrapper<T>::value ||\n                std::is_same<T, basic_string_view<char_type>>::value ||\n                std::is_same<T, detail::std_string_view<char_type>>::value ||\n                (mapped_type != detail::type::cstring_type &&\n                 mapped_type != detail::type::string_type &&\n                 mapped_type != detail::type::custom_type))\n    };\n  };\n\n  template <typename T>\n  using stored_type = conditional_t<detail::is_string<T>::value &&\n                                        !has_formatter<T, Context>::value &&\n                                        !detail::is_reference_wrapper<T>::value,\n                                    std::basic_string<char_type>, T>;\n\n  // Storage of basic_format_arg must be contiguous.\n  std::vector<basic_format_arg<Context>> data_;\n  std::vector<detail::named_arg_info<char_type>> named_info_;\n\n  // Storage of arguments not fitting into basic_format_arg must grow\n  // without relocation because items in data_ refer to it.\n  detail::dynamic_arg_list dynamic_args_;\n\n  friend class basic_format_args<Context>;\n\n  unsigned long long get_types() const {\n    return detail::is_unpacked_bit | data_.size() |\n           (named_info_.empty()\n                ? 0ULL\n                : static_cast<unsigned long long>(detail::has_named_args_bit));\n  }\n\n  const basic_format_arg<Context>* data() const {\n    return named_info_.empty() ? data_.data() : data_.data() + 1;\n  }\n\n  template <typename T> void emplace_arg(const T& arg) {\n    data_.emplace_back(detail::make_arg<Context>(arg));\n  }\n\n  template <typename T>\n  void emplace_arg(const detail::named_arg<char_type, T>& arg) {\n    if (named_info_.empty()) {\n      constexpr const detail::named_arg_info<char_type>* zero_ptr{nullptr};\n      data_.insert(data_.begin(), {zero_ptr, 0});\n    }\n    data_.emplace_back(detail::make_arg<Context>(detail::unwrap(arg.value)));\n    auto pop_one = [](std::vector<basic_format_arg<Context>>* data) {\n      data->pop_back();\n    };\n    std::unique_ptr<std::vector<basic_format_arg<Context>>, decltype(pop_one)>\n        guard{&data_, pop_one};\n    named_info_.push_back({arg.name, static_cast<int>(data_.size() - 2u)});\n    data_[0].value_.named_args = {named_info_.data(), named_info_.size()};\n    guard.release();\n  }\n\n public:\n  /**\n    \\rst\n    Adds an argument into the dynamic store for later passing to a formatting\n    function.\n\n    Note that custom types and string types (but not string views) are copied\n    into the store dynamically allocating memory if necessary.\n\n    **Example**::\n\n      fmt::dynamic_format_arg_store<fmt::format_context> store;\n      store.push_back(42);\n      store.push_back(\"abc\");\n      store.push_back(1.5f);\n      std::string result = fmt::vformat(\"{} and {} and {}\", store);\n    \\endrst\n  */\n  template <typename T> void push_back(const T& arg) {\n    if (detail::const_check(need_copy<T>::value))\n      emplace_arg(dynamic_args_.push<stored_type<T>>(arg));\n    else\n      emplace_arg(detail::unwrap(arg));\n  }\n\n  /**\n    \\rst\n    Adds a reference to the argument into the dynamic store for later passing to\n    a formatting function.\n\n    **Example**::\n\n      fmt::dynamic_format_arg_store<fmt::format_context> store;\n      char band[] = \"Rolling Stones\";\n      store.push_back(std::cref(band));\n      band[9] = 'c'; // Changing str affects the output.\n      std::string result = fmt::vformat(\"{}\", store);\n      // result == \"Rolling Scones\"\n    \\endrst\n  */\n  template <typename T> void push_back(std::reference_wrapper<T> arg) {\n    static_assert(\n        need_copy<T>::value,\n        \"objects of built-in types and string views are always copied\");\n    emplace_arg(arg.get());\n  }\n\n  /**\n    Adds named argument into the dynamic store for later passing to a formatting\n    function. ``std::reference_wrapper`` is supported to avoid copying of the\n    argument. The name is always copied into the store.\n  */\n  template <typename T>\n  void push_back(const detail::named_arg<char_type, T>& arg) {\n    const char_type* arg_name =\n        dynamic_args_.push<std::basic_string<char_type>>(arg.name).c_str();\n    if (detail::const_check(need_copy<T>::value)) {\n      emplace_arg(\n          fmt::arg(arg_name, dynamic_args_.push<stored_type<T>>(arg.value)));\n    } else {\n      emplace_arg(fmt::arg(arg_name, arg.value));\n    }\n  }\n\n  /** Erase all elements from the store */\n  void clear() {\n    data_.clear();\n    named_info_.clear();\n    dynamic_args_ = detail::dynamic_arg_list();\n  }\n\n  /**\n    \\rst\n    Reserves space to store at least *new_cap* arguments including\n    *new_cap_named* named arguments.\n    \\endrst\n  */\n  void reserve(size_t new_cap, size_t new_cap_named) {\n    FMT_ASSERT(new_cap >= new_cap_named,\n               \"Set of arguments includes set of named arguments\");\n    data_.reserve(new_cap);\n    named_info_.reserve(new_cap_named);\n  }\n};\n\nFMT_END_NAMESPACE\n\n#endif  // FMT_ARGS_H_\n"
  },
  {
    "path": "examples/libraries/fmt/include/fmt/chrono.h",
    "content": "// Formatting library for C++ - chrono support\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#ifndef FMT_CHRONO_H_\n#define FMT_CHRONO_H_\n\n#include <algorithm>\n#include <chrono>\n#include <ctime>\n#include <locale>\n#include <sstream>\n\n#include \"format.h\"\n\nFMT_BEGIN_NAMESPACE\n\n// Enable safe chrono durations, unless explicitly disabled.\n#ifndef FMT_SAFE_DURATION_CAST\n#  define FMT_SAFE_DURATION_CAST 1\n#endif\n#if FMT_SAFE_DURATION_CAST\n\n// For conversion between std::chrono::durations without undefined\n// behaviour or erroneous results.\n// This is a stripped down version of duration_cast, for inclusion in fmt.\n// See https://github.com/pauldreik/safe_duration_cast\n//\n// Copyright Paul Dreik 2019\nnamespace safe_duration_cast {\n\ntemplate <typename To, typename From,\n          FMT_ENABLE_IF(!std::is_same<From, To>::value &&\n                        std::numeric_limits<From>::is_signed ==\n                            std::numeric_limits<To>::is_signed)>\nFMT_CONSTEXPR To lossless_integral_conversion(const From from, int& ec) {\n  ec = 0;\n  using F = std::numeric_limits<From>;\n  using T = std::numeric_limits<To>;\n  static_assert(F::is_integer, \"From must be integral\");\n  static_assert(T::is_integer, \"To must be integral\");\n\n  // A and B are both signed, or both unsigned.\n  if (F::digits <= T::digits) {\n    // From fits in To without any problem.\n  } else {\n    // From does not always fit in To, resort to a dynamic check.\n    if (from < (T::min)() || from > (T::max)()) {\n      // outside range.\n      ec = 1;\n      return {};\n    }\n  }\n  return static_cast<To>(from);\n}\n\n/**\n * converts From to To, without loss. If the dynamic value of from\n * can't be converted to To without loss, ec is set.\n */\ntemplate <typename To, typename From,\n          FMT_ENABLE_IF(!std::is_same<From, To>::value &&\n                        std::numeric_limits<From>::is_signed !=\n                            std::numeric_limits<To>::is_signed)>\nFMT_CONSTEXPR To lossless_integral_conversion(const From from, int& ec) {\n  ec = 0;\n  using F = std::numeric_limits<From>;\n  using T = std::numeric_limits<To>;\n  static_assert(F::is_integer, \"From must be integral\");\n  static_assert(T::is_integer, \"To must be integral\");\n\n  if (detail::const_check(F::is_signed && !T::is_signed)) {\n    // From may be negative, not allowed!\n    if (fmt::detail::is_negative(from)) {\n      ec = 1;\n      return {};\n    }\n    // From is positive. Can it always fit in To?\n    if (F::digits > T::digits &&\n        from > static_cast<From>(detail::max_value<To>())) {\n      ec = 1;\n      return {};\n    }\n  }\n\n  if (!F::is_signed && T::is_signed && F::digits >= T::digits &&\n      from > static_cast<From>(detail::max_value<To>())) {\n    ec = 1;\n    return {};\n  }\n  return static_cast<To>(from);  // Lossless conversion.\n}\n\ntemplate <typename To, typename From,\n          FMT_ENABLE_IF(std::is_same<From, To>::value)>\nFMT_CONSTEXPR To lossless_integral_conversion(const From from, int& ec) {\n  ec = 0;\n  return from;\n}  // function\n\n// clang-format off\n/**\n * converts From to To if possible, otherwise ec is set.\n *\n * input                            |    output\n * ---------------------------------|---------------\n * NaN                              | NaN\n * Inf                              | Inf\n * normal, fits in output           | converted (possibly lossy)\n * normal, does not fit in output   | ec is set\n * subnormal                        | best effort\n * -Inf                             | -Inf\n */\n// clang-format on\ntemplate <typename To, typename From,\n          FMT_ENABLE_IF(!std::is_same<From, To>::value)>\nFMT_CONSTEXPR To safe_float_conversion(const From from, int& ec) {\n  ec = 0;\n  using T = std::numeric_limits<To>;\n  static_assert(std::is_floating_point<From>::value, \"From must be floating\");\n  static_assert(std::is_floating_point<To>::value, \"To must be floating\");\n\n  // catch the only happy case\n  if (std::isfinite(from)) {\n    if (from >= T::lowest() && from <= (T::max)()) {\n      return static_cast<To>(from);\n    }\n    // not within range.\n    ec = 1;\n    return {};\n  }\n\n  // nan and inf will be preserved\n  return static_cast<To>(from);\n}  // function\n\ntemplate <typename To, typename From,\n          FMT_ENABLE_IF(std::is_same<From, To>::value)>\nFMT_CONSTEXPR To safe_float_conversion(const From from, int& ec) {\n  ec = 0;\n  static_assert(std::is_floating_point<From>::value, \"From must be floating\");\n  return from;\n}\n\n/**\n * safe duration cast between integral durations\n */\ntemplate <typename To, typename FromRep, typename FromPeriod,\n          FMT_ENABLE_IF(std::is_integral<FromRep>::value),\n          FMT_ENABLE_IF(std::is_integral<typename To::rep>::value)>\nTo safe_duration_cast(std::chrono::duration<FromRep, FromPeriod> from,\n                      int& ec) {\n  using From = std::chrono::duration<FromRep, FromPeriod>;\n  ec = 0;\n  // the basic idea is that we need to convert from count() in the from type\n  // to count() in the To type, by multiplying it with this:\n  struct Factor\n      : std::ratio_divide<typename From::period, typename To::period> {};\n\n  static_assert(Factor::num > 0, \"num must be positive\");\n  static_assert(Factor::den > 0, \"den must be positive\");\n\n  // the conversion is like this: multiply from.count() with Factor::num\n  // /Factor::den and convert it to To::rep, all this without\n  // overflow/underflow. let's start by finding a suitable type that can hold\n  // both To, From and Factor::num\n  using IntermediateRep =\n      typename std::common_type<typename From::rep, typename To::rep,\n                                decltype(Factor::num)>::type;\n\n  // safe conversion to IntermediateRep\n  IntermediateRep count =\n      lossless_integral_conversion<IntermediateRep>(from.count(), ec);\n  if (ec) return {};\n  // multiply with Factor::num without overflow or underflow\n  if (detail::const_check(Factor::num != 1)) {\n    const auto max1 = detail::max_value<IntermediateRep>() / Factor::num;\n    if (count > max1) {\n      ec = 1;\n      return {};\n    }\n    const auto min1 =\n        (std::numeric_limits<IntermediateRep>::min)() / Factor::num;\n    if (count < min1) {\n      ec = 1;\n      return {};\n    }\n    count *= Factor::num;\n  }\n\n  if (detail::const_check(Factor::den != 1)) count /= Factor::den;\n  auto tocount = lossless_integral_conversion<typename To::rep>(count, ec);\n  return ec ? To() : To(tocount);\n}\n\n/**\n * safe duration_cast between floating point durations\n */\ntemplate <typename To, typename FromRep, typename FromPeriod,\n          FMT_ENABLE_IF(std::is_floating_point<FromRep>::value),\n          FMT_ENABLE_IF(std::is_floating_point<typename To::rep>::value)>\nTo safe_duration_cast(std::chrono::duration<FromRep, FromPeriod> from,\n                      int& ec) {\n  using From = std::chrono::duration<FromRep, FromPeriod>;\n  ec = 0;\n  if (std::isnan(from.count())) {\n    // nan in, gives nan out. easy.\n    return To{std::numeric_limits<typename To::rep>::quiet_NaN()};\n  }\n  // maybe we should also check if from is denormal, and decide what to do about\n  // it.\n\n  // +-inf should be preserved.\n  if (std::isinf(from.count())) {\n    return To{from.count()};\n  }\n\n  // the basic idea is that we need to convert from count() in the from type\n  // to count() in the To type, by multiplying it with this:\n  struct Factor\n      : std::ratio_divide<typename From::period, typename To::period> {};\n\n  static_assert(Factor::num > 0, \"num must be positive\");\n  static_assert(Factor::den > 0, \"den must be positive\");\n\n  // the conversion is like this: multiply from.count() with Factor::num\n  // /Factor::den and convert it to To::rep, all this without\n  // overflow/underflow. let's start by finding a suitable type that can hold\n  // both To, From and Factor::num\n  using IntermediateRep =\n      typename std::common_type<typename From::rep, typename To::rep,\n                                decltype(Factor::num)>::type;\n\n  // force conversion of From::rep -> IntermediateRep to be safe,\n  // even if it will never happen be narrowing in this context.\n  IntermediateRep count =\n      safe_float_conversion<IntermediateRep>(from.count(), ec);\n  if (ec) {\n    return {};\n  }\n\n  // multiply with Factor::num without overflow or underflow\n  if (Factor::num != 1) {\n    constexpr auto max1 = detail::max_value<IntermediateRep>() /\n                          static_cast<IntermediateRep>(Factor::num);\n    if (count > max1) {\n      ec = 1;\n      return {};\n    }\n    constexpr auto min1 = std::numeric_limits<IntermediateRep>::lowest() /\n                          static_cast<IntermediateRep>(Factor::num);\n    if (count < min1) {\n      ec = 1;\n      return {};\n    }\n    count *= static_cast<IntermediateRep>(Factor::num);\n  }\n\n  // this can't go wrong, right? den>0 is checked earlier.\n  if (Factor::den != 1) {\n    using common_t = typename std::common_type<IntermediateRep, intmax_t>::type;\n    count /= static_cast<common_t>(Factor::den);\n  }\n\n  // convert to the to type, safely\n  using ToRep = typename To::rep;\n\n  const ToRep tocount = safe_float_conversion<ToRep>(count, ec);\n  if (ec) {\n    return {};\n  }\n  return To{tocount};\n}\n}  // namespace safe_duration_cast\n#endif\n\n// Prevents expansion of a preceding token as a function-style macro.\n// Usage: f FMT_NOMACRO()\n#define FMT_NOMACRO\n\nnamespace detail {\ntemplate <typename T = void> struct null {};\ninline null<> localtime_r FMT_NOMACRO(...) { return null<>(); }\ninline null<> localtime_s(...) { return null<>(); }\ninline null<> gmtime_r(...) { return null<>(); }\ninline null<> gmtime_s(...) { return null<>(); }\n\ninline auto do_write(const std::tm& time, const std::locale& loc, char format,\n                     char modifier) -> std::string {\n  auto&& os = std::ostringstream();\n  os.imbue(loc);\n  using iterator = std::ostreambuf_iterator<char>;\n  const auto& facet = std::use_facet<std::time_put<char, iterator>>(loc);\n  auto end = facet.put(os, os, ' ', &time, format, modifier);\n  if (end.failed()) FMT_THROW(format_error(\"failed to format time\"));\n  auto str = os.str();\n  if (!detail::is_utf8() || loc == std::locale::classic()) return str;\n    // char16_t and char32_t codecvts are broken in MSVC (linkage errors) and\n    // gcc-4.\n#if FMT_MSC_VER != 0 || \\\n    (defined(__GLIBCXX__) && !defined(_GLIBCXX_USE_DUAL_ABI))\n  // The _GLIBCXX_USE_DUAL_ABI macro is always defined in libstdc++ from gcc-5\n  // and newer.\n  using code_unit = wchar_t;\n#else\n  using code_unit = char32_t;\n#endif\n  auto& f = std::use_facet<std::codecvt<code_unit, char, std::mbstate_t>>(loc);\n  auto mb = std::mbstate_t();\n  const char* from_next = nullptr;\n  code_unit* to_next = nullptr;\n  constexpr size_t buf_size = 32;\n  code_unit buf[buf_size] = {};\n  auto result = f.in(mb, str.data(), str.data() + str.size(), from_next, buf,\n                     buf + buf_size, to_next);\n  if (result != std::codecvt_base::ok)\n    FMT_THROW(format_error(\"failed to format time\"));\n  str.clear();\n  for (code_unit* p = buf; p != to_next; ++p) {\n    uint32_t c = static_cast<uint32_t>(*p);\n    if (sizeof(code_unit) == 2 && c >= 0xd800 && c <= 0xdfff) {\n      // surrogate pair\n      ++p;\n      if (p == to_next || (c & 0xfc00) != 0xd800 || (*p & 0xfc00) != 0xdc00) {\n        FMT_THROW(format_error(\"failed to format time\"));\n      }\n      c = (c << 10) + static_cast<uint32_t>(*p) - 0x35fdc00;\n    }\n    if (c < 0x80) {\n      str.push_back(static_cast<char>(c));\n    } else if (c < 0x800) {\n      str.push_back(static_cast<char>(0xc0 | (c >> 6)));\n      str.push_back(static_cast<char>(0x80 | (c & 0x3f)));\n    } else if ((c >= 0x800 && c <= 0xd7ff) || (c >= 0xe000 && c <= 0xffff)) {\n      str.push_back(static_cast<char>(0xe0 | (c >> 12)));\n      str.push_back(static_cast<char>(0x80 | ((c & 0xfff) >> 6)));\n      str.push_back(static_cast<char>(0x80 | (c & 0x3f)));\n    } else if (c >= 0x10000 && c <= 0x10ffff) {\n      str.push_back(static_cast<char>(0xf0 | (c >> 18)));\n      str.push_back(static_cast<char>(0x80 | ((c & 0x3ffff) >> 12)));\n      str.push_back(static_cast<char>(0x80 | ((c & 0xfff) >> 6)));\n      str.push_back(static_cast<char>(0x80 | (c & 0x3f)));\n    } else {\n      FMT_THROW(format_error(\"failed to format time\"));\n    }\n  }\n  return str;\n}\n\ntemplate <typename OutputIt>\nauto write(OutputIt out, const std::tm& time, const std::locale& loc,\n           char format, char modifier = 0) -> OutputIt {\n  auto str = do_write(time, loc, format, modifier);\n  return std::copy(str.begin(), str.end(), out);\n}\n}  // namespace detail\n\nFMT_MODULE_EXPORT_BEGIN\n\n/**\n  Converts given time since epoch as ``std::time_t`` value into calendar time,\n  expressed in local time. Unlike ``std::localtime``, this function is\n  thread-safe on most platforms.\n */\ninline std::tm localtime(std::time_t time) {\n  struct dispatcher {\n    std::time_t time_;\n    std::tm tm_;\n\n    dispatcher(std::time_t t) : time_(t) {}\n\n    bool run() {\n      using namespace fmt::detail;\n      return handle(localtime_r(&time_, &tm_));\n    }\n\n    bool handle(std::tm* tm) { return tm != nullptr; }\n\n    bool handle(detail::null<>) {\n      using namespace fmt::detail;\n      return fallback(localtime_s(&tm_, &time_));\n    }\n\n    bool fallback(int res) { return res == 0; }\n\n#if !FMT_MSC_VER\n    bool fallback(detail::null<>) {\n      using namespace fmt::detail;\n      std::tm* tm = std::localtime(&time_);\n      if (tm) tm_ = *tm;\n      return tm != nullptr;\n    }\n#endif\n  };\n  dispatcher lt(time);\n  // Too big time values may be unsupported.\n  if (!lt.run()) FMT_THROW(format_error(\"time_t value out of range\"));\n  return lt.tm_;\n}\n\ninline std::tm localtime(\n    std::chrono::time_point<std::chrono::system_clock> time_point) {\n  return localtime(std::chrono::system_clock::to_time_t(time_point));\n}\n\n/**\n  Converts given time since epoch as ``std::time_t`` value into calendar time,\n  expressed in Coordinated Universal Time (UTC). Unlike ``std::gmtime``, this\n  function is thread-safe on most platforms.\n */\ninline std::tm gmtime(std::time_t time) {\n  struct dispatcher {\n    std::time_t time_;\n    std::tm tm_;\n\n    dispatcher(std::time_t t) : time_(t) {}\n\n    bool run() {\n      using namespace fmt::detail;\n      return handle(gmtime_r(&time_, &tm_));\n    }\n\n    bool handle(std::tm* tm) { return tm != nullptr; }\n\n    bool handle(detail::null<>) {\n      using namespace fmt::detail;\n      return fallback(gmtime_s(&tm_, &time_));\n    }\n\n    bool fallback(int res) { return res == 0; }\n\n#if !FMT_MSC_VER\n    bool fallback(detail::null<>) {\n      std::tm* tm = std::gmtime(&time_);\n      if (tm) tm_ = *tm;\n      return tm != nullptr;\n    }\n#endif\n  };\n  dispatcher gt(time);\n  // Too big time values may be unsupported.\n  if (!gt.run()) FMT_THROW(format_error(\"time_t value out of range\"));\n  return gt.tm_;\n}\n\ninline std::tm gmtime(\n    std::chrono::time_point<std::chrono::system_clock> time_point) {\n  return gmtime(std::chrono::system_clock::to_time_t(time_point));\n}\n\nFMT_BEGIN_DETAIL_NAMESPACE\n\ninline size_t strftime(char* str, size_t count, const char* format,\n                       const std::tm* time) {\n  // Assign to a pointer to suppress GCCs -Wformat-nonliteral\n  // First assign the nullptr to suppress -Wsuggest-attribute=format\n  std::size_t (*strftime)(char*, std::size_t, const char*, const std::tm*) =\n      nullptr;\n  strftime = std::strftime;\n  return strftime(str, count, format, time);\n}\n\ninline size_t strftime(wchar_t* str, size_t count, const wchar_t* format,\n                       const std::tm* time) {\n  // See above\n  std::size_t (*wcsftime)(wchar_t*, std::size_t, const wchar_t*,\n                          const std::tm*) = nullptr;\n  wcsftime = std::wcsftime;\n  return wcsftime(str, count, format, time);\n}\n\nFMT_END_DETAIL_NAMESPACE\n\ntemplate <typename Char, typename Duration>\nstruct formatter<std::chrono::time_point<std::chrono::system_clock, Duration>,\n                 Char> : formatter<std::tm, Char> {\n  FMT_CONSTEXPR formatter() {\n    this->specs = {default_specs, sizeof(default_specs) / sizeof(Char)};\n  }\n\n  template <typename ParseContext>\n  FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {\n    auto it = ctx.begin();\n    if (it != ctx.end() && *it == ':') ++it;\n    auto end = it;\n    while (end != ctx.end() && *end != '}') ++end;\n    if (end != it) this->specs = {it, detail::to_unsigned(end - it)};\n    return end;\n  }\n\n  template <typename FormatContext>\n  auto format(std::chrono::time_point<std::chrono::system_clock> val,\n              FormatContext& ctx) -> decltype(ctx.out()) {\n    std::tm time = localtime(val);\n    return formatter<std::tm, Char>::format(time, ctx);\n  }\n\n  static constexpr Char default_specs[] = {'%', 'Y', '-', '%', 'm', '-',\n                                           '%', 'd', ' ', '%', 'H', ':',\n                                           '%', 'M', ':', '%', 'S'};\n};\n\ntemplate <typename Char, typename Duration>\nconstexpr Char\n    formatter<std::chrono::time_point<std::chrono::system_clock, Duration>,\n              Char>::default_specs[];\n\ntemplate <typename Char> struct formatter<std::tm, Char> {\n  template <typename ParseContext>\n  FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {\n    auto it = ctx.begin();\n    if (it != ctx.end() && *it == ':') ++it;\n    auto end = it;\n    while (end != ctx.end() && *end != '}') ++end;\n    specs = {it, detail::to_unsigned(end - it)};\n    return end;\n  }\n\n  template <typename FormatContext>\n  auto format(const std::tm& tm, FormatContext& ctx) const\n      -> decltype(ctx.out()) {\n    basic_memory_buffer<Char> tm_format;\n    tm_format.append(specs.begin(), specs.end());\n    // By appending an extra space we can distinguish an empty result that\n    // indicates insufficient buffer size from a guaranteed non-empty result\n    // https://github.com/fmtlib/fmt/issues/2238\n    tm_format.push_back(' ');\n    tm_format.push_back('\\0');\n    basic_memory_buffer<Char> buf;\n    size_t start = buf.size();\n    for (;;) {\n      size_t size = buf.capacity() - start;\n      size_t count = detail::strftime(&buf[start], size, &tm_format[0], &tm);\n      if (count != 0) {\n        buf.resize(start + count);\n        break;\n      }\n      const size_t MIN_GROWTH = 10;\n      buf.reserve(buf.capacity() + (size > MIN_GROWTH ? size : MIN_GROWTH));\n    }\n    // Remove the extra space.\n    return std::copy(buf.begin(), buf.end() - 1, ctx.out());\n  }\n\n  basic_string_view<Char> specs;\n};\n\nFMT_BEGIN_DETAIL_NAMESPACE\n\ntemplate <typename Period> FMT_CONSTEXPR inline const char* get_units() {\n  if (std::is_same<Period, std::atto>::value) return \"as\";\n  if (std::is_same<Period, std::femto>::value) return \"fs\";\n  if (std::is_same<Period, std::pico>::value) return \"ps\";\n  if (std::is_same<Period, std::nano>::value) return \"ns\";\n  if (std::is_same<Period, std::micro>::value) return \"µs\";\n  if (std::is_same<Period, std::milli>::value) return \"ms\";\n  if (std::is_same<Period, std::centi>::value) return \"cs\";\n  if (std::is_same<Period, std::deci>::value) return \"ds\";\n  if (std::is_same<Period, std::ratio<1>>::value) return \"s\";\n  if (std::is_same<Period, std::deca>::value) return \"das\";\n  if (std::is_same<Period, std::hecto>::value) return \"hs\";\n  if (std::is_same<Period, std::kilo>::value) return \"ks\";\n  if (std::is_same<Period, std::mega>::value) return \"Ms\";\n  if (std::is_same<Period, std::giga>::value) return \"Gs\";\n  if (std::is_same<Period, std::tera>::value) return \"Ts\";\n  if (std::is_same<Period, std::peta>::value) return \"Ps\";\n  if (std::is_same<Period, std::exa>::value) return \"Es\";\n  if (std::is_same<Period, std::ratio<60>>::value) return \"m\";\n  if (std::is_same<Period, std::ratio<3600>>::value) return \"h\";\n  return nullptr;\n}\n\nenum class numeric_system {\n  standard,\n  // Alternative numeric system, e.g. 十二 instead of 12 in ja_JP locale.\n  alternative\n};\n\n// Parses a put_time-like format string and invokes handler actions.\ntemplate <typename Char, typename Handler>\nFMT_CONSTEXPR const Char* parse_chrono_format(const Char* begin,\n                                              const Char* end,\n                                              Handler&& handler) {\n  auto ptr = begin;\n  while (ptr != end) {\n    auto c = *ptr;\n    if (c == '}') break;\n    if (c != '%') {\n      ++ptr;\n      continue;\n    }\n    if (begin != ptr) handler.on_text(begin, ptr);\n    ++ptr;  // consume '%'\n    if (ptr == end) FMT_THROW(format_error(\"invalid format\"));\n    c = *ptr++;\n    switch (c) {\n    case '%':\n      handler.on_text(ptr - 1, ptr);\n      break;\n    case 'n': {\n      const Char newline[] = {'\\n'};\n      handler.on_text(newline, newline + 1);\n      break;\n    }\n    case 't': {\n      const Char tab[] = {'\\t'};\n      handler.on_text(tab, tab + 1);\n      break;\n    }\n    // Day of the week:\n    case 'a':\n      handler.on_abbr_weekday();\n      break;\n    case 'A':\n      handler.on_full_weekday();\n      break;\n    case 'w':\n      handler.on_dec0_weekday(numeric_system::standard);\n      break;\n    case 'u':\n      handler.on_dec1_weekday(numeric_system::standard);\n      break;\n    // Month:\n    case 'b':\n      handler.on_abbr_month();\n      break;\n    case 'B':\n      handler.on_full_month();\n      break;\n    // Hour, minute, second:\n    case 'H':\n      handler.on_24_hour(numeric_system::standard);\n      break;\n    case 'I':\n      handler.on_12_hour(numeric_system::standard);\n      break;\n    case 'M':\n      handler.on_minute(numeric_system::standard);\n      break;\n    case 'S':\n      handler.on_second(numeric_system::standard);\n      break;\n    // Other:\n    case 'c':\n      handler.on_datetime(numeric_system::standard);\n      break;\n    case 'x':\n      handler.on_loc_date(numeric_system::standard);\n      break;\n    case 'X':\n      handler.on_loc_time(numeric_system::standard);\n      break;\n    case 'D':\n      handler.on_us_date();\n      break;\n    case 'F':\n      handler.on_iso_date();\n      break;\n    case 'r':\n      handler.on_12_hour_time();\n      break;\n    case 'R':\n      handler.on_24_hour_time();\n      break;\n    case 'T':\n      handler.on_iso_time();\n      break;\n    case 'p':\n      handler.on_am_pm();\n      break;\n    case 'Q':\n      handler.on_duration_value();\n      break;\n    case 'q':\n      handler.on_duration_unit();\n      break;\n    case 'z':\n      handler.on_utc_offset();\n      break;\n    case 'Z':\n      handler.on_tz_name();\n      break;\n    // Alternative representation:\n    case 'E': {\n      if (ptr == end) FMT_THROW(format_error(\"invalid format\"));\n      c = *ptr++;\n      switch (c) {\n      case 'c':\n        handler.on_datetime(numeric_system::alternative);\n        break;\n      case 'x':\n        handler.on_loc_date(numeric_system::alternative);\n        break;\n      case 'X':\n        handler.on_loc_time(numeric_system::alternative);\n        break;\n      default:\n        FMT_THROW(format_error(\"invalid format\"));\n      }\n      break;\n    }\n    case 'O':\n      if (ptr == end) FMT_THROW(format_error(\"invalid format\"));\n      c = *ptr++;\n      switch (c) {\n      case 'w':\n        handler.on_dec0_weekday(numeric_system::alternative);\n        break;\n      case 'u':\n        handler.on_dec1_weekday(numeric_system::alternative);\n        break;\n      case 'H':\n        handler.on_24_hour(numeric_system::alternative);\n        break;\n      case 'I':\n        handler.on_12_hour(numeric_system::alternative);\n        break;\n      case 'M':\n        handler.on_minute(numeric_system::alternative);\n        break;\n      case 'S':\n        handler.on_second(numeric_system::alternative);\n        break;\n      default:\n        FMT_THROW(format_error(\"invalid format\"));\n      }\n      break;\n    default:\n      FMT_THROW(format_error(\"invalid format\"));\n    }\n    begin = ptr;\n  }\n  if (begin != ptr) handler.on_text(begin, ptr);\n  return ptr;\n}\n\ntemplate <typename Derived> struct null_chrono_spec_handler {\n  FMT_CONSTEXPR void unsupported() {\n    static_cast<Derived*>(this)->unsupported();\n  }\n  FMT_CONSTEXPR void on_abbr_weekday() { unsupported(); }\n  FMT_CONSTEXPR void on_full_weekday() { unsupported(); }\n  FMT_CONSTEXPR void on_dec0_weekday(numeric_system) { unsupported(); }\n  FMT_CONSTEXPR void on_dec1_weekday(numeric_system) { unsupported(); }\n  FMT_CONSTEXPR void on_abbr_month() { unsupported(); }\n  FMT_CONSTEXPR void on_full_month() { unsupported(); }\n  FMT_CONSTEXPR void on_24_hour(numeric_system) { unsupported(); }\n  FMT_CONSTEXPR void on_12_hour(numeric_system) { unsupported(); }\n  FMT_CONSTEXPR void on_minute(numeric_system) { unsupported(); }\n  FMT_CONSTEXPR void on_second(numeric_system) { unsupported(); }\n  FMT_CONSTEXPR void on_datetime(numeric_system) { unsupported(); }\n  FMT_CONSTEXPR void on_loc_date(numeric_system) { unsupported(); }\n  FMT_CONSTEXPR void on_loc_time(numeric_system) { unsupported(); }\n  FMT_CONSTEXPR void on_us_date() { unsupported(); }\n  FMT_CONSTEXPR void on_iso_date() { unsupported(); }\n  FMT_CONSTEXPR void on_12_hour_time() { unsupported(); }\n  FMT_CONSTEXPR void on_24_hour_time() { unsupported(); }\n  FMT_CONSTEXPR void on_iso_time() { unsupported(); }\n  FMT_CONSTEXPR void on_am_pm() { unsupported(); }\n  FMT_CONSTEXPR void on_duration_value() { unsupported(); }\n  FMT_CONSTEXPR void on_duration_unit() { unsupported(); }\n  FMT_CONSTEXPR void on_utc_offset() { unsupported(); }\n  FMT_CONSTEXPR void on_tz_name() { unsupported(); }\n};\n\nstruct chrono_format_checker : null_chrono_spec_handler<chrono_format_checker> {\n  FMT_NORETURN void unsupported() { FMT_THROW(format_error(\"no date\")); }\n\n  template <typename Char>\n  FMT_CONSTEXPR void on_text(const Char*, const Char*) {}\n  FMT_CONSTEXPR void on_24_hour(numeric_system) {}\n  FMT_CONSTEXPR void on_12_hour(numeric_system) {}\n  FMT_CONSTEXPR void on_minute(numeric_system) {}\n  FMT_CONSTEXPR void on_second(numeric_system) {}\n  FMT_CONSTEXPR void on_12_hour_time() {}\n  FMT_CONSTEXPR void on_24_hour_time() {}\n  FMT_CONSTEXPR void on_iso_time() {}\n  FMT_CONSTEXPR void on_am_pm() {}\n  FMT_CONSTEXPR void on_duration_value() {}\n  FMT_CONSTEXPR void on_duration_unit() {}\n};\n\ntemplate <typename T, FMT_ENABLE_IF(std::is_integral<T>::value)>\ninline bool isnan(T) {\n  return false;\n}\ntemplate <typename T, FMT_ENABLE_IF(std::is_floating_point<T>::value)>\ninline bool isnan(T value) {\n  return std::isnan(value);\n}\n\ntemplate <typename T, FMT_ENABLE_IF(std::is_integral<T>::value)>\ninline bool isfinite(T) {\n  return true;\n}\ntemplate <typename T, FMT_ENABLE_IF(std::is_floating_point<T>::value)>\ninline bool isfinite(T value) {\n  return std::isfinite(value);\n}\n\n// Converts value to int and checks that it's in the range [0, upper).\ntemplate <typename T, FMT_ENABLE_IF(std::is_integral<T>::value)>\ninline int to_nonnegative_int(T value, int upper) {\n  FMT_ASSERT(value >= 0 && to_unsigned(value) <= to_unsigned(upper),\n             \"invalid value\");\n  (void)upper;\n  return static_cast<int>(value);\n}\ntemplate <typename T, FMT_ENABLE_IF(!std::is_integral<T>::value)>\ninline int to_nonnegative_int(T value, int upper) {\n  FMT_ASSERT(\n      std::isnan(value) || (value >= 0 && value <= static_cast<T>(upper)),\n      \"invalid value\");\n  (void)upper;\n  return static_cast<int>(value);\n}\n\ntemplate <typename T, FMT_ENABLE_IF(std::is_integral<T>::value)>\ninline T mod(T x, int y) {\n  return x % static_cast<T>(y);\n}\ntemplate <typename T, FMT_ENABLE_IF(std::is_floating_point<T>::value)>\ninline T mod(T x, int y) {\n  return std::fmod(x, static_cast<T>(y));\n}\n\n// If T is an integral type, maps T to its unsigned counterpart, otherwise\n// leaves it unchanged (unlike std::make_unsigned).\ntemplate <typename T, bool INTEGRAL = std::is_integral<T>::value>\nstruct make_unsigned_or_unchanged {\n  using type = T;\n};\n\ntemplate <typename T> struct make_unsigned_or_unchanged<T, true> {\n  using type = typename std::make_unsigned<T>::type;\n};\n\n#if FMT_SAFE_DURATION_CAST\n// throwing version of safe_duration_cast\ntemplate <typename To, typename FromRep, typename FromPeriod>\nTo fmt_safe_duration_cast(std::chrono::duration<FromRep, FromPeriod> from) {\n  int ec;\n  To to = safe_duration_cast::safe_duration_cast<To>(from, ec);\n  if (ec) FMT_THROW(format_error(\"cannot format duration\"));\n  return to;\n}\n#endif\n\ntemplate <typename Rep, typename Period,\n          FMT_ENABLE_IF(std::is_integral<Rep>::value)>\ninline std::chrono::duration<Rep, std::milli> get_milliseconds(\n    std::chrono::duration<Rep, Period> d) {\n  // this may overflow and/or the result may not fit in the\n  // target type.\n#if FMT_SAFE_DURATION_CAST\n  using CommonSecondsType =\n      typename std::common_type<decltype(d), std::chrono::seconds>::type;\n  const auto d_as_common = fmt_safe_duration_cast<CommonSecondsType>(d);\n  const auto d_as_whole_seconds =\n      fmt_safe_duration_cast<std::chrono::seconds>(d_as_common);\n  // this conversion should be nonproblematic\n  const auto diff = d_as_common - d_as_whole_seconds;\n  const auto ms =\n      fmt_safe_duration_cast<std::chrono::duration<Rep, std::milli>>(diff);\n  return ms;\n#else\n  auto s = std::chrono::duration_cast<std::chrono::seconds>(d);\n  return std::chrono::duration_cast<std::chrono::milliseconds>(d - s);\n#endif\n}\n\ntemplate <typename Rep, typename Period,\n          FMT_ENABLE_IF(std::is_floating_point<Rep>::value)>\ninline std::chrono::duration<Rep, std::milli> get_milliseconds(\n    std::chrono::duration<Rep, Period> d) {\n  using common_type = typename std::common_type<Rep, std::intmax_t>::type;\n  auto ms = mod(d.count() * static_cast<common_type>(Period::num) /\n                    static_cast<common_type>(Period::den) * 1000,\n                1000);\n  return std::chrono::duration<Rep, std::milli>(static_cast<Rep>(ms));\n}\n\ntemplate <typename Char, typename Rep, typename OutputIt,\n          FMT_ENABLE_IF(std::is_integral<Rep>::value)>\nOutputIt format_duration_value(OutputIt out, Rep val, int) {\n  return write<Char>(out, val);\n}\n\ntemplate <typename Char, typename Rep, typename OutputIt,\n          FMT_ENABLE_IF(std::is_floating_point<Rep>::value)>\nOutputIt format_duration_value(OutputIt out, Rep val, int precision) {\n  auto specs = basic_format_specs<Char>();\n  specs.precision = precision;\n  specs.type = precision > 0 ? 'f' : 'g';\n  return write<Char>(out, val, specs);\n}\n\ntemplate <typename Char, typename OutputIt>\nOutputIt copy_unit(string_view unit, OutputIt out, Char) {\n  return std::copy(unit.begin(), unit.end(), out);\n}\n\ntemplate <typename OutputIt>\nOutputIt copy_unit(string_view unit, OutputIt out, wchar_t) {\n  // This works when wchar_t is UTF-32 because units only contain characters\n  // that have the same representation in UTF-16 and UTF-32.\n  utf8_to_utf16 u(unit);\n  return std::copy(u.c_str(), u.c_str() + u.size(), out);\n}\n\ntemplate <typename Char, typename Period, typename OutputIt>\nOutputIt format_duration_unit(OutputIt out) {\n  if (const char* unit = get_units<Period>())\n    return copy_unit(string_view(unit), out, Char());\n  *out++ = '[';\n  out = write<Char>(out, Period::num);\n  if (const_check(Period::den != 1)) {\n    *out++ = '/';\n    out = write<Char>(out, Period::den);\n  }\n  *out++ = ']';\n  *out++ = 's';\n  return out;\n}\n\ntemplate <typename FormatContext, typename OutputIt, typename Rep,\n          typename Period>\nstruct chrono_formatter {\n  FormatContext& context;\n  OutputIt out;\n  int precision;\n  bool localized = false;\n  // rep is unsigned to avoid overflow.\n  using rep =\n      conditional_t<std::is_integral<Rep>::value && sizeof(Rep) < sizeof(int),\n                    unsigned, typename make_unsigned_or_unchanged<Rep>::type>;\n  rep val;\n  using seconds = std::chrono::duration<rep>;\n  seconds s;\n  using milliseconds = std::chrono::duration<rep, std::milli>;\n  bool negative;\n\n  using char_type = typename FormatContext::char_type;\n\n  explicit chrono_formatter(FormatContext& ctx, OutputIt o,\n                            std::chrono::duration<Rep, Period> d)\n      : context(ctx),\n        out(o),\n        val(static_cast<rep>(d.count())),\n        negative(false) {\n    if (d.count() < 0) {\n      val = 0 - val;\n      negative = true;\n    }\n\n    // this may overflow and/or the result may not fit in the\n    // target type.\n#if FMT_SAFE_DURATION_CAST\n    // might need checked conversion (rep!=Rep)\n    auto tmpval = std::chrono::duration<rep, Period>(val);\n    s = fmt_safe_duration_cast<seconds>(tmpval);\n#else\n    s = std::chrono::duration_cast<seconds>(\n        std::chrono::duration<rep, Period>(val));\n#endif\n  }\n\n  // returns true if nan or inf, writes to out.\n  bool handle_nan_inf() {\n    if (isfinite(val)) {\n      return false;\n    }\n    if (isnan(val)) {\n      write_nan();\n      return true;\n    }\n    // must be +-inf\n    if (val > 0) {\n      write_pinf();\n    } else {\n      write_ninf();\n    }\n    return true;\n  }\n\n  Rep hour() const { return static_cast<Rep>(mod((s.count() / 3600), 24)); }\n\n  Rep hour12() const {\n    Rep hour = static_cast<Rep>(mod((s.count() / 3600), 12));\n    return hour <= 0 ? 12 : hour;\n  }\n\n  Rep minute() const { return static_cast<Rep>(mod((s.count() / 60), 60)); }\n  Rep second() const { return static_cast<Rep>(mod(s.count(), 60)); }\n\n  std::tm time() const {\n    auto time = std::tm();\n    time.tm_hour = to_nonnegative_int(hour(), 24);\n    time.tm_min = to_nonnegative_int(minute(), 60);\n    time.tm_sec = to_nonnegative_int(second(), 60);\n    return time;\n  }\n\n  void write_sign() {\n    if (negative) {\n      *out++ = '-';\n      negative = false;\n    }\n  }\n\n  void write(Rep value, int width) {\n    write_sign();\n    if (isnan(value)) return write_nan();\n    uint32_or_64_or_128_t<int> n =\n        to_unsigned(to_nonnegative_int(value, max_value<int>()));\n    int num_digits = detail::count_digits(n);\n    if (width > num_digits) out = std::fill_n(out, width - num_digits, '0');\n    out = format_decimal<char_type>(out, n, num_digits).end;\n  }\n\n  void write_nan() { std::copy_n(\"nan\", 3, out); }\n  void write_pinf() { std::copy_n(\"inf\", 3, out); }\n  void write_ninf() { std::copy_n(\"-inf\", 4, out); }\n\n  void format_localized(const tm& time, char format, char modifier = 0) {\n    if (isnan(val)) return write_nan();\n    const auto& loc = localized ? context.locale().template get<std::locale>()\n                                : std::locale::classic();\n    out = detail::write(out, time, loc, format, modifier);\n  }\n\n  void on_text(const char_type* begin, const char_type* end) {\n    std::copy(begin, end, out);\n  }\n\n  // These are not implemented because durations don't have date information.\n  void on_abbr_weekday() {}\n  void on_full_weekday() {}\n  void on_dec0_weekday(numeric_system) {}\n  void on_dec1_weekday(numeric_system) {}\n  void on_abbr_month() {}\n  void on_full_month() {}\n  void on_datetime(numeric_system) {}\n  void on_loc_date(numeric_system) {}\n  void on_loc_time(numeric_system) {}\n  void on_us_date() {}\n  void on_iso_date() {}\n  void on_utc_offset() {}\n  void on_tz_name() {}\n\n  void on_24_hour(numeric_system ns) {\n    if (handle_nan_inf()) return;\n\n    if (ns == numeric_system::standard) return write(hour(), 2);\n    auto time = tm();\n    time.tm_hour = to_nonnegative_int(hour(), 24);\n    format_localized(time, 'H', 'O');\n  }\n\n  void on_12_hour(numeric_system ns) {\n    if (handle_nan_inf()) return;\n\n    if (ns == numeric_system::standard) return write(hour12(), 2);\n    auto time = tm();\n    time.tm_hour = to_nonnegative_int(hour12(), 12);\n    format_localized(time, 'I', 'O');\n  }\n\n  void on_minute(numeric_system ns) {\n    if (handle_nan_inf()) return;\n\n    if (ns == numeric_system::standard) return write(minute(), 2);\n    auto time = tm();\n    time.tm_min = to_nonnegative_int(minute(), 60);\n    format_localized(time, 'M', 'O');\n  }\n\n  void on_second(numeric_system ns) {\n    if (handle_nan_inf()) return;\n\n    if (ns == numeric_system::standard) {\n      write(second(), 2);\n#if FMT_SAFE_DURATION_CAST\n      // convert rep->Rep\n      using duration_rep = std::chrono::duration<rep, Period>;\n      using duration_Rep = std::chrono::duration<Rep, Period>;\n      auto tmpval = fmt_safe_duration_cast<duration_Rep>(duration_rep{val});\n#else\n      auto tmpval = std::chrono::duration<Rep, Period>(val);\n#endif\n      auto ms = get_milliseconds(tmpval);\n      if (ms != std::chrono::milliseconds(0)) {\n        *out++ = '.';\n        write(ms.count(), 3);\n      }\n      return;\n    }\n    auto time = tm();\n    time.tm_sec = to_nonnegative_int(second(), 60);\n    format_localized(time, 'S', 'O');\n  }\n\n  void on_12_hour_time() {\n    if (handle_nan_inf()) return;\n    format_localized(time(), 'r');\n  }\n\n  void on_24_hour_time() {\n    if (handle_nan_inf()) {\n      *out++ = ':';\n      handle_nan_inf();\n      return;\n    }\n\n    write(hour(), 2);\n    *out++ = ':';\n    write(minute(), 2);\n  }\n\n  void on_iso_time() {\n    on_24_hour_time();\n    *out++ = ':';\n    if (handle_nan_inf()) return;\n    write(second(), 2);\n  }\n\n  void on_am_pm() {\n    if (handle_nan_inf()) return;\n    format_localized(time(), 'p');\n  }\n\n  void on_duration_value() {\n    if (handle_nan_inf()) return;\n    write_sign();\n    out = format_duration_value<char_type>(out, val, precision);\n  }\n\n  void on_duration_unit() {\n    out = format_duration_unit<char_type, Period>(out);\n  }\n};\n\nFMT_END_DETAIL_NAMESPACE\n\n#if defined(__cpp_lib_chrono) && __cpp_lib_chrono >= 201907\nusing weekday = std::chrono::weekday;\n#else\n// A fallback version of weekday.\nclass weekday {\n private:\n  unsigned char value;\n\n public:\n  weekday() = default;\n  explicit constexpr weekday(unsigned wd) noexcept\n      : value(static_cast<unsigned char>(wd != 7 ? wd : 0)) {}\n  constexpr unsigned c_encoding() const noexcept { return value; }\n};\n#endif\n\n// A rudimentary weekday formatter.\ntemplate <> struct formatter<weekday> {\n private:\n  bool localized = false;\n\n public:\n  FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {\n    auto begin = ctx.begin(), end = ctx.end();\n    if (begin != end && *begin == 'L') {\n      ++begin;\n      localized = true;\n    }\n    return begin;\n  }\n\n  auto format(weekday wd, format_context& ctx) -> decltype(ctx.out()) {\n    auto time = std::tm();\n    time.tm_wday = static_cast<int>(wd.c_encoding());\n    const auto& loc = localized ? ctx.locale().template get<std::locale>()\n                                : std::locale::classic();\n    return detail::write(ctx.out(), time, loc, 'a');\n  }\n};\n\ntemplate <typename Rep, typename Period, typename Char>\nstruct formatter<std::chrono::duration<Rep, Period>, Char> {\n private:\n  basic_format_specs<Char> specs;\n  int precision = -1;\n  using arg_ref_type = detail::arg_ref<Char>;\n  arg_ref_type width_ref;\n  arg_ref_type precision_ref;\n  bool localized = false;\n  basic_string_view<Char> format_str;\n  using duration = std::chrono::duration<Rep, Period>;\n\n  struct spec_handler {\n    formatter& f;\n    basic_format_parse_context<Char>& context;\n    basic_string_view<Char> format_str;\n\n    template <typename Id> FMT_CONSTEXPR arg_ref_type make_arg_ref(Id arg_id) {\n      context.check_arg_id(arg_id);\n      return arg_ref_type(arg_id);\n    }\n\n    FMT_CONSTEXPR arg_ref_type make_arg_ref(basic_string_view<Char> arg_id) {\n      context.check_arg_id(arg_id);\n      return arg_ref_type(arg_id);\n    }\n\n    FMT_CONSTEXPR arg_ref_type make_arg_ref(detail::auto_id) {\n      return arg_ref_type(context.next_arg_id());\n    }\n\n    void on_error(const char* msg) { FMT_THROW(format_error(msg)); }\n    FMT_CONSTEXPR void on_fill(basic_string_view<Char> fill) {\n      f.specs.fill = fill;\n    }\n    FMT_CONSTEXPR void on_align(align_t align) { f.specs.align = align; }\n    FMT_CONSTEXPR void on_width(int width) { f.specs.width = width; }\n    FMT_CONSTEXPR void on_precision(int _precision) {\n      f.precision = _precision;\n    }\n    FMT_CONSTEXPR void end_precision() {}\n\n    template <typename Id> FMT_CONSTEXPR void on_dynamic_width(Id arg_id) {\n      f.width_ref = make_arg_ref(arg_id);\n    }\n\n    template <typename Id> FMT_CONSTEXPR void on_dynamic_precision(Id arg_id) {\n      f.precision_ref = make_arg_ref(arg_id);\n    }\n  };\n\n  using iterator = typename basic_format_parse_context<Char>::iterator;\n  struct parse_range {\n    iterator begin;\n    iterator end;\n  };\n\n  FMT_CONSTEXPR parse_range do_parse(basic_format_parse_context<Char>& ctx) {\n    auto begin = ctx.begin(), end = ctx.end();\n    if (begin == end || *begin == '}') return {begin, begin};\n    spec_handler handler{*this, ctx, format_str};\n    begin = detail::parse_align(begin, end, handler);\n    if (begin == end) return {begin, begin};\n    begin = detail::parse_width(begin, end, handler);\n    if (begin == end) return {begin, begin};\n    if (*begin == '.') {\n      if (std::is_floating_point<Rep>::value)\n        begin = detail::parse_precision(begin, end, handler);\n      else\n        handler.on_error(\"precision not allowed for this argument type\");\n    }\n    if (begin != end && *begin == 'L') {\n      ++begin;\n      localized = true;\n    }\n    end = parse_chrono_format(begin, end, detail::chrono_format_checker());\n    return {begin, end};\n  }\n\n public:\n  FMT_CONSTEXPR auto parse(basic_format_parse_context<Char>& ctx)\n      -> decltype(ctx.begin()) {\n    auto range = do_parse(ctx);\n    format_str = basic_string_view<Char>(\n        &*range.begin, detail::to_unsigned(range.end - range.begin));\n    return range.end;\n  }\n\n  template <typename FormatContext>\n  auto format(const duration& d, FormatContext& ctx) const\n      -> decltype(ctx.out()) {\n    auto specs_copy = specs;\n    auto precision_copy = precision;\n    auto begin = format_str.begin(), end = format_str.end();\n    // As a possible future optimization, we could avoid extra copying if width\n    // is not specified.\n    basic_memory_buffer<Char> buf;\n    auto out = std::back_inserter(buf);\n    detail::handle_dynamic_spec<detail::width_checker>(specs_copy.width,\n                                                       width_ref, ctx);\n    detail::handle_dynamic_spec<detail::precision_checker>(precision_copy,\n                                                           precision_ref, ctx);\n    if (begin == end || *begin == '}') {\n      out = detail::format_duration_value<Char>(out, d.count(), precision_copy);\n      detail::format_duration_unit<Char, Period>(out);\n    } else {\n      detail::chrono_formatter<FormatContext, decltype(out), Rep, Period> f(\n          ctx, out, d);\n      f.precision = precision_copy;\n      f.localized = localized;\n      detail::parse_chrono_format(begin, end, f);\n    }\n    return detail::write(\n        ctx.out(), basic_string_view<Char>(buf.data(), buf.size()), specs_copy);\n  }\n};\n\nFMT_MODULE_EXPORT_END\nFMT_END_NAMESPACE\n\n#endif  // FMT_CHRONO_H_\n"
  },
  {
    "path": "examples/libraries/fmt/include/fmt/color.h",
    "content": "// Formatting library for C++ - color support\n//\n// Copyright (c) 2018 - present, Victor Zverovich and fmt contributors\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#ifndef FMT_COLOR_H_\n#define FMT_COLOR_H_\n\n#include \"format.h\"\n\n// __declspec(deprecated) is broken in some MSVC versions.\n#if FMT_MSC_VER\n#  define FMT_DEPRECATED_NONMSVC\n#else\n#  define FMT_DEPRECATED_NONMSVC FMT_DEPRECATED\n#endif\n\nFMT_BEGIN_NAMESPACE\nFMT_MODULE_EXPORT_BEGIN\n\nenum class color : uint32_t {\n  alice_blue = 0xF0F8FF,               // rgb(240,248,255)\n  antique_white = 0xFAEBD7,            // rgb(250,235,215)\n  aqua = 0x00FFFF,                     // rgb(0,255,255)\n  aquamarine = 0x7FFFD4,               // rgb(127,255,212)\n  azure = 0xF0FFFF,                    // rgb(240,255,255)\n  beige = 0xF5F5DC,                    // rgb(245,245,220)\n  bisque = 0xFFE4C4,                   // rgb(255,228,196)\n  black = 0x000000,                    // rgb(0,0,0)\n  blanched_almond = 0xFFEBCD,          // rgb(255,235,205)\n  blue = 0x0000FF,                     // rgb(0,0,255)\n  blue_violet = 0x8A2BE2,              // rgb(138,43,226)\n  brown = 0xA52A2A,                    // rgb(165,42,42)\n  burly_wood = 0xDEB887,               // rgb(222,184,135)\n  cadet_blue = 0x5F9EA0,               // rgb(95,158,160)\n  chartreuse = 0x7FFF00,               // rgb(127,255,0)\n  chocolate = 0xD2691E,                // rgb(210,105,30)\n  coral = 0xFF7F50,                    // rgb(255,127,80)\n  cornflower_blue = 0x6495ED,          // rgb(100,149,237)\n  cornsilk = 0xFFF8DC,                 // rgb(255,248,220)\n  crimson = 0xDC143C,                  // rgb(220,20,60)\n  cyan = 0x00FFFF,                     // rgb(0,255,255)\n  dark_blue = 0x00008B,                // rgb(0,0,139)\n  dark_cyan = 0x008B8B,                // rgb(0,139,139)\n  dark_golden_rod = 0xB8860B,          // rgb(184,134,11)\n  dark_gray = 0xA9A9A9,                // rgb(169,169,169)\n  dark_green = 0x006400,               // rgb(0,100,0)\n  dark_khaki = 0xBDB76B,               // rgb(189,183,107)\n  dark_magenta = 0x8B008B,             // rgb(139,0,139)\n  dark_olive_green = 0x556B2F,         // rgb(85,107,47)\n  dark_orange = 0xFF8C00,              // rgb(255,140,0)\n  dark_orchid = 0x9932CC,              // rgb(153,50,204)\n  dark_red = 0x8B0000,                 // rgb(139,0,0)\n  dark_salmon = 0xE9967A,              // rgb(233,150,122)\n  dark_sea_green = 0x8FBC8F,           // rgb(143,188,143)\n  dark_slate_blue = 0x483D8B,          // rgb(72,61,139)\n  dark_slate_gray = 0x2F4F4F,          // rgb(47,79,79)\n  dark_turquoise = 0x00CED1,           // rgb(0,206,209)\n  dark_violet = 0x9400D3,              // rgb(148,0,211)\n  deep_pink = 0xFF1493,                // rgb(255,20,147)\n  deep_sky_blue = 0x00BFFF,            // rgb(0,191,255)\n  dim_gray = 0x696969,                 // rgb(105,105,105)\n  dodger_blue = 0x1E90FF,              // rgb(30,144,255)\n  fire_brick = 0xB22222,               // rgb(178,34,34)\n  floral_white = 0xFFFAF0,             // rgb(255,250,240)\n  forest_green = 0x228B22,             // rgb(34,139,34)\n  fuchsia = 0xFF00FF,                  // rgb(255,0,255)\n  gainsboro = 0xDCDCDC,                // rgb(220,220,220)\n  ghost_white = 0xF8F8FF,              // rgb(248,248,255)\n  gold = 0xFFD700,                     // rgb(255,215,0)\n  golden_rod = 0xDAA520,               // rgb(218,165,32)\n  gray = 0x808080,                     // rgb(128,128,128)\n  green = 0x008000,                    // rgb(0,128,0)\n  green_yellow = 0xADFF2F,             // rgb(173,255,47)\n  honey_dew = 0xF0FFF0,                // rgb(240,255,240)\n  hot_pink = 0xFF69B4,                 // rgb(255,105,180)\n  indian_red = 0xCD5C5C,               // rgb(205,92,92)\n  indigo = 0x4B0082,                   // rgb(75,0,130)\n  ivory = 0xFFFFF0,                    // rgb(255,255,240)\n  khaki = 0xF0E68C,                    // rgb(240,230,140)\n  lavender = 0xE6E6FA,                 // rgb(230,230,250)\n  lavender_blush = 0xFFF0F5,           // rgb(255,240,245)\n  lawn_green = 0x7CFC00,               // rgb(124,252,0)\n  lemon_chiffon = 0xFFFACD,            // rgb(255,250,205)\n  light_blue = 0xADD8E6,               // rgb(173,216,230)\n  light_coral = 0xF08080,              // rgb(240,128,128)\n  light_cyan = 0xE0FFFF,               // rgb(224,255,255)\n  light_golden_rod_yellow = 0xFAFAD2,  // rgb(250,250,210)\n  light_gray = 0xD3D3D3,               // rgb(211,211,211)\n  light_green = 0x90EE90,              // rgb(144,238,144)\n  light_pink = 0xFFB6C1,               // rgb(255,182,193)\n  light_salmon = 0xFFA07A,             // rgb(255,160,122)\n  light_sea_green = 0x20B2AA,          // rgb(32,178,170)\n  light_sky_blue = 0x87CEFA,           // rgb(135,206,250)\n  light_slate_gray = 0x778899,         // rgb(119,136,153)\n  light_steel_blue = 0xB0C4DE,         // rgb(176,196,222)\n  light_yellow = 0xFFFFE0,             // rgb(255,255,224)\n  lime = 0x00FF00,                     // rgb(0,255,0)\n  lime_green = 0x32CD32,               // rgb(50,205,50)\n  linen = 0xFAF0E6,                    // rgb(250,240,230)\n  magenta = 0xFF00FF,                  // rgb(255,0,255)\n  maroon = 0x800000,                   // rgb(128,0,0)\n  medium_aquamarine = 0x66CDAA,        // rgb(102,205,170)\n  medium_blue = 0x0000CD,              // rgb(0,0,205)\n  medium_orchid = 0xBA55D3,            // rgb(186,85,211)\n  medium_purple = 0x9370DB,            // rgb(147,112,219)\n  medium_sea_green = 0x3CB371,         // rgb(60,179,113)\n  medium_slate_blue = 0x7B68EE,        // rgb(123,104,238)\n  medium_spring_green = 0x00FA9A,      // rgb(0,250,154)\n  medium_turquoise = 0x48D1CC,         // rgb(72,209,204)\n  medium_violet_red = 0xC71585,        // rgb(199,21,133)\n  midnight_blue = 0x191970,            // rgb(25,25,112)\n  mint_cream = 0xF5FFFA,               // rgb(245,255,250)\n  misty_rose = 0xFFE4E1,               // rgb(255,228,225)\n  moccasin = 0xFFE4B5,                 // rgb(255,228,181)\n  navajo_white = 0xFFDEAD,             // rgb(255,222,173)\n  navy = 0x000080,                     // rgb(0,0,128)\n  old_lace = 0xFDF5E6,                 // rgb(253,245,230)\n  olive = 0x808000,                    // rgb(128,128,0)\n  olive_drab = 0x6B8E23,               // rgb(107,142,35)\n  orange = 0xFFA500,                   // rgb(255,165,0)\n  orange_red = 0xFF4500,               // rgb(255,69,0)\n  orchid = 0xDA70D6,                   // rgb(218,112,214)\n  pale_golden_rod = 0xEEE8AA,          // rgb(238,232,170)\n  pale_green = 0x98FB98,               // rgb(152,251,152)\n  pale_turquoise = 0xAFEEEE,           // rgb(175,238,238)\n  pale_violet_red = 0xDB7093,          // rgb(219,112,147)\n  papaya_whip = 0xFFEFD5,              // rgb(255,239,213)\n  peach_puff = 0xFFDAB9,               // rgb(255,218,185)\n  peru = 0xCD853F,                     // rgb(205,133,63)\n  pink = 0xFFC0CB,                     // rgb(255,192,203)\n  plum = 0xDDA0DD,                     // rgb(221,160,221)\n  powder_blue = 0xB0E0E6,              // rgb(176,224,230)\n  purple = 0x800080,                   // rgb(128,0,128)\n  rebecca_purple = 0x663399,           // rgb(102,51,153)\n  red = 0xFF0000,                      // rgb(255,0,0)\n  rosy_brown = 0xBC8F8F,               // rgb(188,143,143)\n  royal_blue = 0x4169E1,               // rgb(65,105,225)\n  saddle_brown = 0x8B4513,             // rgb(139,69,19)\n  salmon = 0xFA8072,                   // rgb(250,128,114)\n  sandy_brown = 0xF4A460,              // rgb(244,164,96)\n  sea_green = 0x2E8B57,                // rgb(46,139,87)\n  sea_shell = 0xFFF5EE,                // rgb(255,245,238)\n  sienna = 0xA0522D,                   // rgb(160,82,45)\n  silver = 0xC0C0C0,                   // rgb(192,192,192)\n  sky_blue = 0x87CEEB,                 // rgb(135,206,235)\n  slate_blue = 0x6A5ACD,               // rgb(106,90,205)\n  slate_gray = 0x708090,               // rgb(112,128,144)\n  snow = 0xFFFAFA,                     // rgb(255,250,250)\n  spring_green = 0x00FF7F,             // rgb(0,255,127)\n  steel_blue = 0x4682B4,               // rgb(70,130,180)\n  tan = 0xD2B48C,                      // rgb(210,180,140)\n  teal = 0x008080,                     // rgb(0,128,128)\n  thistle = 0xD8BFD8,                  // rgb(216,191,216)\n  tomato = 0xFF6347,                   // rgb(255,99,71)\n  turquoise = 0x40E0D0,                // rgb(64,224,208)\n  violet = 0xEE82EE,                   // rgb(238,130,238)\n  wheat = 0xF5DEB3,                    // rgb(245,222,179)\n  white = 0xFFFFFF,                    // rgb(255,255,255)\n  white_smoke = 0xF5F5F5,              // rgb(245,245,245)\n  yellow = 0xFFFF00,                   // rgb(255,255,0)\n  yellow_green = 0x9ACD32              // rgb(154,205,50)\n};                                     // enum class color\n\nenum class terminal_color : uint8_t {\n  black = 30,\n  red,\n  green,\n  yellow,\n  blue,\n  magenta,\n  cyan,\n  white,\n  bright_black = 90,\n  bright_red,\n  bright_green,\n  bright_yellow,\n  bright_blue,\n  bright_magenta,\n  bright_cyan,\n  bright_white\n};\n\nenum class emphasis : uint8_t {\n  bold = 1,\n  faint = 1 << 1,\n  italic = 1 << 2,\n  underline = 1 << 3,\n  blink = 1 << 4,\n  reverse = 1 << 5,\n  conceal = 1 << 6,\n  strikethrough = 1 << 7,\n};\n\n// rgb is a struct for red, green and blue colors.\n// Using the name \"rgb\" makes some editors show the color in a tooltip.\nstruct rgb {\n  FMT_CONSTEXPR rgb() : r(0), g(0), b(0) {}\n  FMT_CONSTEXPR rgb(uint8_t r_, uint8_t g_, uint8_t b_) : r(r_), g(g_), b(b_) {}\n  FMT_CONSTEXPR rgb(uint32_t hex)\n      : r((hex >> 16) & 0xFF), g((hex >> 8) & 0xFF), b(hex & 0xFF) {}\n  FMT_CONSTEXPR rgb(color hex)\n      : r((uint32_t(hex) >> 16) & 0xFF),\n        g((uint32_t(hex) >> 8) & 0xFF),\n        b(uint32_t(hex) & 0xFF) {}\n  uint8_t r;\n  uint8_t g;\n  uint8_t b;\n};\n\nFMT_BEGIN_DETAIL_NAMESPACE\n\n// color is a struct of either a rgb color or a terminal color.\nstruct color_type {\n  FMT_CONSTEXPR color_type() FMT_NOEXCEPT : is_rgb(), value{} {}\n  FMT_CONSTEXPR color_type(color rgb_color) FMT_NOEXCEPT : is_rgb(true),\n                                                           value{} {\n    value.rgb_color = static_cast<uint32_t>(rgb_color);\n  }\n  FMT_CONSTEXPR color_type(rgb rgb_color) FMT_NOEXCEPT : is_rgb(true), value{} {\n    value.rgb_color = (static_cast<uint32_t>(rgb_color.r) << 16) |\n                      (static_cast<uint32_t>(rgb_color.g) << 8) | rgb_color.b;\n  }\n  FMT_CONSTEXPR color_type(terminal_color term_color) FMT_NOEXCEPT : is_rgb(),\n                                                                     value{} {\n    value.term_color = static_cast<uint8_t>(term_color);\n  }\n  bool is_rgb;\n  union color_union {\n    uint8_t term_color;\n    uint32_t rgb_color;\n  } value;\n};\n\nFMT_END_DETAIL_NAMESPACE\n\n/** A text style consisting of foreground and background colors and emphasis. */\nclass text_style {\n public:\n  FMT_CONSTEXPR text_style(emphasis em = emphasis()) FMT_NOEXCEPT\n      : set_foreground_color(),\n        set_background_color(),\n        ems(em) {}\n\n  FMT_CONSTEXPR text_style& operator|=(const text_style& rhs) {\n    if (!set_foreground_color) {\n      set_foreground_color = rhs.set_foreground_color;\n      foreground_color = rhs.foreground_color;\n    } else if (rhs.set_foreground_color) {\n      if (!foreground_color.is_rgb || !rhs.foreground_color.is_rgb)\n        FMT_THROW(format_error(\"can't OR a terminal color\"));\n      foreground_color.value.rgb_color |= rhs.foreground_color.value.rgb_color;\n    }\n\n    if (!set_background_color) {\n      set_background_color = rhs.set_background_color;\n      background_color = rhs.background_color;\n    } else if (rhs.set_background_color) {\n      if (!background_color.is_rgb || !rhs.background_color.is_rgb)\n        FMT_THROW(format_error(\"can't OR a terminal color\"));\n      background_color.value.rgb_color |= rhs.background_color.value.rgb_color;\n    }\n\n    ems = static_cast<emphasis>(static_cast<uint8_t>(ems) |\n                                static_cast<uint8_t>(rhs.ems));\n    return *this;\n  }\n\n  friend FMT_CONSTEXPR text_style operator|(text_style lhs,\n                                            const text_style& rhs) {\n    return lhs |= rhs;\n  }\n\n  FMT_DEPRECATED_NONMSVC FMT_CONSTEXPR text_style& operator&=(\n      const text_style& rhs) {\n    return and_assign(rhs);\n  }\n\n  FMT_DEPRECATED_NONMSVC friend FMT_CONSTEXPR text_style\n  operator&(text_style lhs, const text_style& rhs) {\n    return lhs.and_assign(rhs);\n  }\n\n  FMT_CONSTEXPR bool has_foreground() const FMT_NOEXCEPT {\n    return set_foreground_color;\n  }\n  FMT_CONSTEXPR bool has_background() const FMT_NOEXCEPT {\n    return set_background_color;\n  }\n  FMT_CONSTEXPR bool has_emphasis() const FMT_NOEXCEPT {\n    return static_cast<uint8_t>(ems) != 0;\n  }\n  FMT_CONSTEXPR detail::color_type get_foreground() const FMT_NOEXCEPT {\n    FMT_ASSERT(has_foreground(), \"no foreground specified for this style\");\n    return foreground_color;\n  }\n  FMT_CONSTEXPR detail::color_type get_background() const FMT_NOEXCEPT {\n    FMT_ASSERT(has_background(), \"no background specified for this style\");\n    return background_color;\n  }\n  FMT_CONSTEXPR emphasis get_emphasis() const FMT_NOEXCEPT {\n    FMT_ASSERT(has_emphasis(), \"no emphasis specified for this style\");\n    return ems;\n  }\n\n private:\n  FMT_CONSTEXPR text_style(bool is_foreground,\n                           detail::color_type text_color) FMT_NOEXCEPT\n      : set_foreground_color(),\n        set_background_color(),\n        ems() {\n    if (is_foreground) {\n      foreground_color = text_color;\n      set_foreground_color = true;\n    } else {\n      background_color = text_color;\n      set_background_color = true;\n    }\n  }\n\n  // DEPRECATED!\n  FMT_CONSTEXPR text_style& and_assign(const text_style& rhs) {\n    if (!set_foreground_color) {\n      set_foreground_color = rhs.set_foreground_color;\n      foreground_color = rhs.foreground_color;\n    } else if (rhs.set_foreground_color) {\n      if (!foreground_color.is_rgb || !rhs.foreground_color.is_rgb)\n        FMT_THROW(format_error(\"can't AND a terminal color\"));\n      foreground_color.value.rgb_color &= rhs.foreground_color.value.rgb_color;\n    }\n\n    if (!set_background_color) {\n      set_background_color = rhs.set_background_color;\n      background_color = rhs.background_color;\n    } else if (rhs.set_background_color) {\n      if (!background_color.is_rgb || !rhs.background_color.is_rgb)\n        FMT_THROW(format_error(\"can't AND a terminal color\"));\n      background_color.value.rgb_color &= rhs.background_color.value.rgb_color;\n    }\n\n    ems = static_cast<emphasis>(static_cast<uint8_t>(ems) &\n                                static_cast<uint8_t>(rhs.ems));\n    return *this;\n  }\n\n  friend FMT_CONSTEXPR_DECL text_style fg(detail::color_type foreground)\n      FMT_NOEXCEPT;\n\n  friend FMT_CONSTEXPR_DECL text_style bg(detail::color_type background)\n      FMT_NOEXCEPT;\n\n  detail::color_type foreground_color;\n  detail::color_type background_color;\n  bool set_foreground_color;\n  bool set_background_color;\n  emphasis ems;\n};\n\n/** Creates a text style from the foreground (text) color. */\nFMT_CONSTEXPR inline text_style fg(detail::color_type foreground) FMT_NOEXCEPT {\n  return text_style(true, foreground);\n}\n\n/** Creates a text style from the background color. */\nFMT_CONSTEXPR inline text_style bg(detail::color_type background) FMT_NOEXCEPT {\n  return text_style(false, background);\n}\n\nFMT_CONSTEXPR inline text_style operator|(emphasis lhs,\n                                          emphasis rhs) FMT_NOEXCEPT {\n  return text_style(lhs) | rhs;\n}\n\nFMT_BEGIN_DETAIL_NAMESPACE\n\ntemplate <typename Char> struct ansi_color_escape {\n  FMT_CONSTEXPR ansi_color_escape(detail::color_type text_color,\n                                  const char* esc) FMT_NOEXCEPT {\n    // If we have a terminal color, we need to output another escape code\n    // sequence.\n    if (!text_color.is_rgb) {\n      bool is_background = esc == string_view(\"\\x1b[48;2;\");\n      uint32_t value = text_color.value.term_color;\n      // Background ASCII codes are the same as the foreground ones but with\n      // 10 more.\n      if (is_background) value += 10u;\n\n      size_t index = 0;\n      buffer[index++] = static_cast<Char>('\\x1b');\n      buffer[index++] = static_cast<Char>('[');\n\n      if (value >= 100u) {\n        buffer[index++] = static_cast<Char>('1');\n        value %= 100u;\n      }\n      buffer[index++] = static_cast<Char>('0' + value / 10u);\n      buffer[index++] = static_cast<Char>('0' + value % 10u);\n\n      buffer[index++] = static_cast<Char>('m');\n      buffer[index++] = static_cast<Char>('\\0');\n      return;\n    }\n\n    for (int i = 0; i < 7; i++) {\n      buffer[i] = static_cast<Char>(esc[i]);\n    }\n    rgb color(text_color.value.rgb_color);\n    to_esc(color.r, buffer + 7, ';');\n    to_esc(color.g, buffer + 11, ';');\n    to_esc(color.b, buffer + 15, 'm');\n    buffer[19] = static_cast<Char>(0);\n  }\n  FMT_CONSTEXPR ansi_color_escape(emphasis em) FMT_NOEXCEPT {\n    uint8_t em_codes[num_emphases] = {};\n    if (has_emphasis(em, emphasis::bold)) em_codes[0] = 1;\n    if (has_emphasis(em, emphasis::faint)) em_codes[1] = 2;\n    if (has_emphasis(em, emphasis::italic)) em_codes[2] = 3;\n    if (has_emphasis(em, emphasis::underline)) em_codes[3] = 4;\n    if (has_emphasis(em, emphasis::blink)) em_codes[4] = 5;\n    if (has_emphasis(em, emphasis::reverse)) em_codes[5] = 7;\n    if (has_emphasis(em, emphasis::conceal)) em_codes[6] = 8;\n    if (has_emphasis(em, emphasis::strikethrough)) em_codes[7] = 9;\n\n    size_t index = 0;\n    for (size_t i = 0; i < num_emphases; ++i) {\n      if (!em_codes[i]) continue;\n      buffer[index++] = static_cast<Char>('\\x1b');\n      buffer[index++] = static_cast<Char>('[');\n      buffer[index++] = static_cast<Char>('0' + em_codes[i]);\n      buffer[index++] = static_cast<Char>('m');\n    }\n    buffer[index++] = static_cast<Char>(0);\n  }\n  FMT_CONSTEXPR operator const Char*() const FMT_NOEXCEPT { return buffer; }\n\n  FMT_CONSTEXPR const Char* begin() const FMT_NOEXCEPT { return buffer; }\n  FMT_CONSTEXPR_CHAR_TRAITS const Char* end() const FMT_NOEXCEPT {\n    return buffer + std::char_traits<Char>::length(buffer);\n  }\n\n private:\n  static constexpr size_t num_emphases = 8;\n  Char buffer[7u + 3u * num_emphases + 1u];\n\n  static FMT_CONSTEXPR void to_esc(uint8_t c, Char* out,\n                                   char delimiter) FMT_NOEXCEPT {\n    out[0] = static_cast<Char>('0' + c / 100);\n    out[1] = static_cast<Char>('0' + c / 10 % 10);\n    out[2] = static_cast<Char>('0' + c % 10);\n    out[3] = static_cast<Char>(delimiter);\n  }\n  static FMT_CONSTEXPR bool has_emphasis(emphasis em,\n                                         emphasis mask) FMT_NOEXCEPT {\n    return static_cast<uint8_t>(em) & static_cast<uint8_t>(mask);\n  }\n};\n\ntemplate <typename Char>\nFMT_CONSTEXPR ansi_color_escape<Char> make_foreground_color(\n    detail::color_type foreground) FMT_NOEXCEPT {\n  return ansi_color_escape<Char>(foreground, \"\\x1b[38;2;\");\n}\n\ntemplate <typename Char>\nFMT_CONSTEXPR ansi_color_escape<Char> make_background_color(\n    detail::color_type background) FMT_NOEXCEPT {\n  return ansi_color_escape<Char>(background, \"\\x1b[48;2;\");\n}\n\ntemplate <typename Char>\nFMT_CONSTEXPR ansi_color_escape<Char> make_emphasis(emphasis em) FMT_NOEXCEPT {\n  return ansi_color_escape<Char>(em);\n}\n\ntemplate <typename Char>\ninline void fputs(const Char* chars, FILE* stream) FMT_NOEXCEPT {\n  std::fputs(chars, stream);\n}\n\ntemplate <>\ninline void fputs<wchar_t>(const wchar_t* chars, FILE* stream) FMT_NOEXCEPT {\n  std::fputws(chars, stream);\n}\n\ntemplate <typename Char> inline void reset_color(FILE* stream) FMT_NOEXCEPT {\n  fputs(\"\\x1b[0m\", stream);\n}\n\ntemplate <> inline void reset_color<wchar_t>(FILE* stream) FMT_NOEXCEPT {\n  fputs(L\"\\x1b[0m\", stream);\n}\n\ntemplate <typename Char>\ninline void reset_color(buffer<Char>& buffer) FMT_NOEXCEPT {\n  auto reset_color = string_view(\"\\x1b[0m\");\n  buffer.append(reset_color.begin(), reset_color.end());\n}\n\ntemplate <typename Char>\nvoid vformat_to(buffer<Char>& buf, const text_style& ts,\n                basic_string_view<Char> format_str,\n                basic_format_args<buffer_context<type_identity_t<Char>>> args) {\n  bool has_style = false;\n  if (ts.has_emphasis()) {\n    has_style = true;\n    auto emphasis = detail::make_emphasis<Char>(ts.get_emphasis());\n    buf.append(emphasis.begin(), emphasis.end());\n  }\n  if (ts.has_foreground()) {\n    has_style = true;\n    auto foreground = detail::make_foreground_color<Char>(ts.get_foreground());\n    buf.append(foreground.begin(), foreground.end());\n  }\n  if (ts.has_background()) {\n    has_style = true;\n    auto background = detail::make_background_color<Char>(ts.get_background());\n    buf.append(background.begin(), background.end());\n  }\n  detail::vformat_to(buf, format_str, args, {});\n  if (has_style) detail::reset_color<Char>(buf);\n}\n\nFMT_END_DETAIL_NAMESPACE\n\ntemplate <typename S, typename Char = char_t<S>>\nvoid vprint(std::FILE* f, const text_style& ts, const S& format,\n            basic_format_args<buffer_context<type_identity_t<Char>>> args) {\n  basic_memory_buffer<Char> buf;\n  detail::vformat_to(buf, ts, to_string_view(format), args);\n  buf.push_back(Char(0));\n  detail::fputs(buf.data(), f);\n}\n\n/**\n  \\rst\n  Formats a string and prints it to the specified file stream using ANSI\n  escape sequences to specify text formatting.\n\n  **Example**::\n\n    fmt::print(fmt::emphasis::bold | fg(fmt::color::red),\n               \"Elapsed time: {0:.2f} seconds\", 1.23);\n  \\endrst\n */\ntemplate <typename S, typename... Args,\n          FMT_ENABLE_IF(detail::is_string<S>::value)>\nvoid print(std::FILE* f, const text_style& ts, const S& format_str,\n           const Args&... args) {\n  vprint(f, ts, format_str,\n         fmt::make_args_checked<Args...>(format_str, args...));\n}\n\n/**\n  \\rst\n  Formats a string and prints it to stdout using ANSI escape sequences to\n  specify text formatting.\n\n  **Example**::\n\n    fmt::print(fmt::emphasis::bold | fg(fmt::color::red),\n               \"Elapsed time: {0:.2f} seconds\", 1.23);\n  \\endrst\n */\ntemplate <typename S, typename... Args,\n          FMT_ENABLE_IF(detail::is_string<S>::value)>\nvoid print(const text_style& ts, const S& format_str, const Args&... args) {\n  return print(stdout, ts, format_str, args...);\n}\n\ntemplate <typename S, typename Char = char_t<S>>\ninline std::basic_string<Char> vformat(\n    const text_style& ts, const S& format_str,\n    basic_format_args<buffer_context<type_identity_t<Char>>> args) {\n  basic_memory_buffer<Char> buf;\n  detail::vformat_to(buf, ts, to_string_view(format_str), args);\n  return fmt::to_string(buf);\n}\n\n/**\n  \\rst\n  Formats arguments and returns the result as a string using ANSI\n  escape sequences to specify text formatting.\n\n  **Example**::\n\n    #include <fmt/color.h>\n    std::string message = fmt::format(fmt::emphasis::bold | fg(fmt::color::red),\n                                      \"The answer is {}\", 42);\n  \\endrst\n*/\ntemplate <typename S, typename... Args, typename Char = char_t<S>>\ninline std::basic_string<Char> format(const text_style& ts, const S& format_str,\n                                      const Args&... args) {\n  return fmt::vformat(ts, to_string_view(format_str),\n                      fmt::make_args_checked<Args...>(format_str, args...));\n}\n\n/**\n  Formats a string with the given text_style and writes the output to ``out``.\n */\ntemplate <typename OutputIt, typename Char,\n          FMT_ENABLE_IF(detail::is_output_iterator<OutputIt, Char>::value)>\nOutputIt vformat_to(\n    OutputIt out, const text_style& ts, basic_string_view<Char> format_str,\n    basic_format_args<buffer_context<type_identity_t<Char>>> args) {\n  auto&& buf = detail::get_buffer<Char>(out);\n  detail::vformat_to(buf, ts, format_str, args);\n  return detail::get_iterator(buf);\n}\n\n/**\n  \\rst\n  Formats arguments with the given text_style, writes the result to the output\n  iterator ``out`` and returns the iterator past the end of the output range.\n\n  **Example**::\n\n    std::vector<char> out;\n    fmt::format_to(std::back_inserter(out),\n                   fmt::emphasis::bold | fg(fmt::color::red), \"{}\", 42);\n  \\endrst\n*/\ntemplate <typename OutputIt, typename S, typename... Args,\n          bool enable = detail::is_output_iterator<OutputIt, char_t<S>>::value&&\n              detail::is_string<S>::value>\ninline auto format_to(OutputIt out, const text_style& ts, const S& format_str,\n                      Args&&... args) ->\n    typename std::enable_if<enable, OutputIt>::type {\n  return vformat_to(out, ts, to_string_view(format_str),\n                    fmt::make_args_checked<Args...>(format_str, args...));\n}\n\nFMT_MODULE_EXPORT_END\nFMT_END_NAMESPACE\n\n#endif  // FMT_COLOR_H_\n"
  },
  {
    "path": "examples/libraries/fmt/include/fmt/compile.h",
    "content": "// Formatting library for C++ - experimental format string compilation\n//\n// Copyright (c) 2012 - present, Victor Zverovich and fmt contributors\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#ifndef FMT_COMPILE_H_\n#define FMT_COMPILE_H_\n\n#include \"format.h\"\n\nFMT_BEGIN_NAMESPACE\nnamespace detail {\n\n// An output iterator that counts the number of objects written to it and\n// discards them.\nclass counting_iterator {\n private:\n  size_t count_;\n\n public:\n  using iterator_category = std::output_iterator_tag;\n  using difference_type = std::ptrdiff_t;\n  using pointer = void;\n  using reference = void;\n  using _Unchecked_type = counting_iterator;  // Mark iterator as checked.\n\n  struct value_type {\n    template <typename T> void operator=(const T&) {}\n  };\n\n  counting_iterator() : count_(0) {}\n\n  size_t count() const { return count_; }\n\n  counting_iterator& operator++() {\n    ++count_;\n    return *this;\n  }\n  counting_iterator operator++(int) {\n    auto it = *this;\n    ++*this;\n    return it;\n  }\n\n  friend counting_iterator operator+(counting_iterator it, difference_type n) {\n    it.count_ += static_cast<size_t>(n);\n    return it;\n  }\n\n  value_type operator*() const { return {}; }\n};\n\ntemplate <typename Char, typename InputIt>\ninline counting_iterator copy_str(InputIt begin, InputIt end,\n                                  counting_iterator it) {\n  return it + (end - begin);\n}\n\ntemplate <typename OutputIt> class truncating_iterator_base {\n protected:\n  OutputIt out_;\n  size_t limit_;\n  size_t count_ = 0;\n\n  truncating_iterator_base() : out_(), limit_(0) {}\n\n  truncating_iterator_base(OutputIt out, size_t limit)\n      : out_(out), limit_(limit) {}\n\n public:\n  using iterator_category = std::output_iterator_tag;\n  using value_type = typename std::iterator_traits<OutputIt>::value_type;\n  using difference_type = std::ptrdiff_t;\n  using pointer = void;\n  using reference = void;\n  using _Unchecked_type =\n      truncating_iterator_base;  // Mark iterator as checked.\n\n  OutputIt base() const { return out_; }\n  size_t count() const { return count_; }\n};\n\n// An output iterator that truncates the output and counts the number of objects\n// written to it.\ntemplate <typename OutputIt,\n          typename Enable = typename std::is_void<\n              typename std::iterator_traits<OutputIt>::value_type>::type>\nclass truncating_iterator;\n\ntemplate <typename OutputIt>\nclass truncating_iterator<OutputIt, std::false_type>\n    : public truncating_iterator_base<OutputIt> {\n  mutable typename truncating_iterator_base<OutputIt>::value_type blackhole_;\n\n public:\n  using value_type = typename truncating_iterator_base<OutputIt>::value_type;\n\n  truncating_iterator() = default;\n\n  truncating_iterator(OutputIt out, size_t limit)\n      : truncating_iterator_base<OutputIt>(out, limit) {}\n\n  truncating_iterator& operator++() {\n    if (this->count_++ < this->limit_) ++this->out_;\n    return *this;\n  }\n\n  truncating_iterator operator++(int) {\n    auto it = *this;\n    ++*this;\n    return it;\n  }\n\n  value_type& operator*() const {\n    return this->count_ < this->limit_ ? *this->out_ : blackhole_;\n  }\n};\n\ntemplate <typename OutputIt>\nclass truncating_iterator<OutputIt, std::true_type>\n    : public truncating_iterator_base<OutputIt> {\n public:\n  truncating_iterator() = default;\n\n  truncating_iterator(OutputIt out, size_t limit)\n      : truncating_iterator_base<OutputIt>(out, limit) {}\n\n  template <typename T> truncating_iterator& operator=(T val) {\n    if (this->count_++ < this->limit_) *this->out_++ = val;\n    return *this;\n  }\n\n  truncating_iterator& operator++() { return *this; }\n  truncating_iterator& operator++(int) { return *this; }\n  truncating_iterator& operator*() { return *this; }\n};\n\n// A compile-time string which is compiled into fast formatting code.\nclass compiled_string {};\n\ntemplate <typename S>\nstruct is_compiled_string : std::is_base_of<compiled_string, S> {};\n\n/**\n  \\rst\n  Converts a string literal *s* into a format string that will be parsed at\n  compile time and converted into efficient formatting code. Requires C++17\n  ``constexpr if`` compiler support.\n\n  **Example**::\n\n    // Converts 42 into std::string using the most efficient method and no\n    // runtime format string processing.\n    std::string s = fmt::format(FMT_COMPILE(\"{}\"), 42);\n  \\endrst\n */\n#ifdef __cpp_if_constexpr\n#  define FMT_COMPILE(s) \\\n    FMT_STRING_IMPL(s, fmt::detail::compiled_string, explicit)\n#else\n#  define FMT_COMPILE(s) FMT_STRING(s)\n#endif\n\n#if FMT_USE_NONTYPE_TEMPLATE_PARAMETERS\ntemplate <typename Char, size_t N,\n          fmt::detail_exported::fixed_string<Char, N> Str>\nstruct udl_compiled_string : compiled_string {\n  using char_type = Char;\n  constexpr operator basic_string_view<char_type>() const {\n    return {Str.data, N - 1};\n  }\n};\n#endif\n\ntemplate <typename T, typename... Tail>\nconst T& first(const T& value, const Tail&...) {\n  return value;\n}\n\n#ifdef __cpp_if_constexpr\ntemplate <typename... Args> struct type_list {};\n\n// Returns a reference to the argument at index N from [first, rest...].\ntemplate <int N, typename T, typename... Args>\nconstexpr const auto& get([[maybe_unused]] const T& first,\n                          [[maybe_unused]] const Args&... rest) {\n  static_assert(N < 1 + sizeof...(Args), \"index is out of bounds\");\n  if constexpr (N == 0)\n    return first;\n  else\n    return get<N - 1>(rest...);\n}\n\ntemplate <typename Char, typename... Args>\nconstexpr int get_arg_index_by_name(basic_string_view<Char> name,\n                                    type_list<Args...>) {\n  return get_arg_index_by_name<Args...>(name);\n}\n\ntemplate <int N, typename> struct get_type_impl;\n\ntemplate <int N, typename... Args> struct get_type_impl<N, type_list<Args...>> {\n  using type = remove_cvref_t<decltype(get<N>(std::declval<Args>()...))>;\n};\n\ntemplate <int N, typename T>\nusing get_type = typename get_type_impl<N, T>::type;\n\ntemplate <typename T> struct is_compiled_format : std::false_type {};\n\ntemplate <typename Char> struct text {\n  basic_string_view<Char> data;\n  using char_type = Char;\n\n  template <typename OutputIt, typename... Args>\n  constexpr OutputIt format(OutputIt out, const Args&...) const {\n    return write<Char>(out, data);\n  }\n};\n\ntemplate <typename Char>\nstruct is_compiled_format<text<Char>> : std::true_type {};\n\ntemplate <typename Char>\nconstexpr text<Char> make_text(basic_string_view<Char> s, size_t pos,\n                               size_t size) {\n  return {{&s[pos], size}};\n}\n\ntemplate <typename Char> struct code_unit {\n  Char value;\n  using char_type = Char;\n\n  template <typename OutputIt, typename... Args>\n  constexpr OutputIt format(OutputIt out, const Args&...) const {\n    return write<Char>(out, value);\n  }\n};\n\n// This ensures that the argument type is convertible to `const T&`.\ntemplate <typename T, int N, typename... Args>\nconstexpr const T& get_arg_checked(const Args&... args) {\n  const auto& arg = get<N>(args...);\n  if constexpr (detail::is_named_arg<remove_cvref_t<decltype(arg)>>()) {\n    return arg.value;\n  } else {\n    return arg;\n  }\n}\n\ntemplate <typename Char>\nstruct is_compiled_format<code_unit<Char>> : std::true_type {};\n\n// A replacement field that refers to argument N.\ntemplate <typename Char, typename T, int N> struct field {\n  using char_type = Char;\n\n  template <typename OutputIt, typename... Args>\n  constexpr OutputIt format(OutputIt out, const Args&... args) const {\n    return write<Char>(out, get_arg_checked<T, N>(args...));\n  }\n};\n\ntemplate <typename Char, typename T, int N>\nstruct is_compiled_format<field<Char, T, N>> : std::true_type {};\n\n// A replacement field that refers to argument with name.\ntemplate <typename Char> struct runtime_named_field {\n  using char_type = Char;\n  basic_string_view<Char> name;\n\n  template <typename OutputIt, typename T>\n  constexpr static bool try_format_argument(\n      OutputIt& out,\n      // [[maybe_unused]] due to unused-but-set-parameter warning in GCC 7,8,9\n      [[maybe_unused]] basic_string_view<Char> arg_name, const T& arg) {\n    if constexpr (is_named_arg<typename std::remove_cv<T>::type>::value) {\n      if (arg_name == arg.name) {\n        out = write<Char>(out, arg.value);\n        return true;\n      }\n    }\n    return false;\n  }\n\n  template <typename OutputIt, typename... Args>\n  constexpr OutputIt format(OutputIt out, const Args&... args) const {\n    bool found = (try_format_argument(out, name, args) || ...);\n    if (!found) {\n      throw format_error(\"argument with specified name is not found\");\n    }\n    return out;\n  }\n};\n\ntemplate <typename Char>\nstruct is_compiled_format<runtime_named_field<Char>> : std::true_type {};\n\n// A replacement field that refers to argument N and has format specifiers.\ntemplate <typename Char, typename T, int N> struct spec_field {\n  using char_type = Char;\n  formatter<T, Char> fmt;\n\n  template <typename OutputIt, typename... Args>\n  constexpr FMT_INLINE OutputIt format(OutputIt out,\n                                       const Args&... args) const {\n    const auto& vargs =\n        fmt::make_format_args<basic_format_context<OutputIt, Char>>(args...);\n    basic_format_context<OutputIt, Char> ctx(out, vargs);\n    return fmt.format(get_arg_checked<T, N>(args...), ctx);\n  }\n};\n\ntemplate <typename Char, typename T, int N>\nstruct is_compiled_format<spec_field<Char, T, N>> : std::true_type {};\n\ntemplate <typename L, typename R> struct concat {\n  L lhs;\n  R rhs;\n  using char_type = typename L::char_type;\n\n  template <typename OutputIt, typename... Args>\n  constexpr OutputIt format(OutputIt out, const Args&... args) const {\n    out = lhs.format(out, args...);\n    return rhs.format(out, args...);\n  }\n};\n\ntemplate <typename L, typename R>\nstruct is_compiled_format<concat<L, R>> : std::true_type {};\n\ntemplate <typename L, typename R>\nconstexpr concat<L, R> make_concat(L lhs, R rhs) {\n  return {lhs, rhs};\n}\n\nstruct unknown_format {};\n\ntemplate <typename Char>\nconstexpr size_t parse_text(basic_string_view<Char> str, size_t pos) {\n  for (size_t size = str.size(); pos != size; ++pos) {\n    if (str[pos] == '{' || str[pos] == '}') break;\n  }\n  return pos;\n}\n\ntemplate <typename Args, size_t POS, int ID, typename S>\nconstexpr auto compile_format_string(S format_str);\n\ntemplate <typename Args, size_t POS, int ID, typename T, typename S>\nconstexpr auto parse_tail(T head, S format_str) {\n  if constexpr (POS !=\n                basic_string_view<typename S::char_type>(format_str).size()) {\n    constexpr auto tail = compile_format_string<Args, POS, ID>(format_str);\n    if constexpr (std::is_same<remove_cvref_t<decltype(tail)>,\n                               unknown_format>())\n      return tail;\n    else\n      return make_concat(head, tail);\n  } else {\n    return head;\n  }\n}\n\ntemplate <typename T, typename Char> struct parse_specs_result {\n  formatter<T, Char> fmt;\n  size_t end;\n  int next_arg_id;\n};\n\nconstexpr int manual_indexing_id = -1;\n\ntemplate <typename T, typename Char>\nconstexpr parse_specs_result<T, Char> parse_specs(basic_string_view<Char> str,\n                                                  size_t pos, int next_arg_id) {\n  str.remove_prefix(pos);\n  auto ctx = basic_format_parse_context<Char>(str, {}, next_arg_id);\n  auto f = formatter<T, Char>();\n  auto end = f.parse(ctx);\n  return {f, pos + fmt::detail::to_unsigned(end - str.data()) + 1,\n          next_arg_id == 0 ? manual_indexing_id : ctx.next_arg_id()};\n}\n\ntemplate <typename Char> struct arg_id_handler {\n  arg_ref<Char> arg_id;\n\n  constexpr int operator()() {\n    FMT_ASSERT(false, \"handler cannot be used with automatic indexing\");\n    return 0;\n  }\n  constexpr int operator()(int id) {\n    arg_id = arg_ref<Char>(id);\n    return 0;\n  }\n  constexpr int operator()(basic_string_view<Char> id) {\n    arg_id = arg_ref<Char>(id);\n    return 0;\n  }\n\n  constexpr void on_error(const char* message) { throw format_error(message); }\n};\n\ntemplate <typename Char> struct parse_arg_id_result {\n  arg_ref<Char> arg_id;\n  const Char* arg_id_end;\n};\n\ntemplate <int ID, typename Char>\nconstexpr auto parse_arg_id(const Char* begin, const Char* end) {\n  auto handler = arg_id_handler<Char>{arg_ref<Char>{}};\n  auto arg_id_end = parse_arg_id(begin, end, handler);\n  return parse_arg_id_result<Char>{handler.arg_id, arg_id_end};\n}\n\ntemplate <typename T, typename Enable = void> struct field_type {\n  using type = remove_cvref_t<T>;\n};\n\ntemplate <typename T>\nstruct field_type<T, enable_if_t<detail::is_named_arg<T>::value>> {\n  using type = remove_cvref_t<decltype(T::value)>;\n};\n\ntemplate <typename T, typename Args, size_t END_POS, int ARG_INDEX, int NEXT_ID,\n          typename S>\nconstexpr auto parse_replacement_field_then_tail(S format_str) {\n  using char_type = typename S::char_type;\n  constexpr auto str = basic_string_view<char_type>(format_str);\n  constexpr char_type c = END_POS != str.size() ? str[END_POS] : char_type();\n  if constexpr (c == '}') {\n    return parse_tail<Args, END_POS + 1, NEXT_ID>(\n        field<char_type, typename field_type<T>::type, ARG_INDEX>(),\n        format_str);\n  } else if constexpr (c == ':') {\n    constexpr auto result = parse_specs<typename field_type<T>::type>(\n        str, END_POS + 1, NEXT_ID == manual_indexing_id ? 0 : NEXT_ID);\n    return parse_tail<Args, result.end, result.next_arg_id>(\n        spec_field<char_type, typename field_type<T>::type, ARG_INDEX>{\n            result.fmt},\n        format_str);\n  }\n}\n\n// Compiles a non-empty format string and returns the compiled representation\n// or unknown_format() on unrecognized input.\ntemplate <typename Args, size_t POS, int ID, typename S>\nconstexpr auto compile_format_string(S format_str) {\n  using char_type = typename S::char_type;\n  constexpr auto str = basic_string_view<char_type>(format_str);\n  if constexpr (str[POS] == '{') {\n    if constexpr (POS + 1 == str.size())\n      throw format_error(\"unmatched '{' in format string\");\n    if constexpr (str[POS + 1] == '{') {\n      return parse_tail<Args, POS + 2, ID>(make_text(str, POS, 1), format_str);\n    } else if constexpr (str[POS + 1] == '}' || str[POS + 1] == ':') {\n      static_assert(ID != manual_indexing_id,\n                    \"cannot switch from manual to automatic argument indexing\");\n      constexpr auto next_id =\n          ID != manual_indexing_id ? ID + 1 : manual_indexing_id;\n      return parse_replacement_field_then_tail<get_type<ID, Args>, Args,\n                                               POS + 1, ID, next_id>(\n          format_str);\n    } else {\n      constexpr auto arg_id_result =\n          parse_arg_id<ID>(str.data() + POS + 1, str.data() + str.size());\n      constexpr auto arg_id_end_pos = arg_id_result.arg_id_end - str.data();\n      constexpr char_type c =\n          arg_id_end_pos != str.size() ? str[arg_id_end_pos] : char_type();\n      static_assert(c == '}' || c == ':', \"missing '}' in format string\");\n      if constexpr (arg_id_result.arg_id.kind == arg_id_kind::index) {\n        static_assert(\n            ID == manual_indexing_id || ID == 0,\n            \"cannot switch from automatic to manual argument indexing\");\n        constexpr auto arg_index = arg_id_result.arg_id.val.index;\n        return parse_replacement_field_then_tail<get_type<arg_index, Args>,\n                                                 Args, arg_id_end_pos,\n                                                 arg_index, manual_indexing_id>(\n            format_str);\n      } else if constexpr (arg_id_result.arg_id.kind == arg_id_kind::name) {\n        constexpr auto arg_index =\n            get_arg_index_by_name(arg_id_result.arg_id.val.name, Args{});\n        if constexpr (arg_index != invalid_arg_index) {\n          constexpr auto next_id =\n              ID != manual_indexing_id ? ID + 1 : manual_indexing_id;\n          return parse_replacement_field_then_tail<\n              decltype(get_type<arg_index, Args>::value), Args, arg_id_end_pos,\n              arg_index, next_id>(format_str);\n        } else {\n          if constexpr (c == '}') {\n            return parse_tail<Args, arg_id_end_pos + 1, ID>(\n                runtime_named_field<char_type>{arg_id_result.arg_id.val.name},\n                format_str);\n          } else if constexpr (c == ':') {\n            return unknown_format();  // no type info for specs parsing\n          }\n        }\n      }\n    }\n  } else if constexpr (str[POS] == '}') {\n    if constexpr (POS + 1 == str.size())\n      throw format_error(\"unmatched '}' in format string\");\n    return parse_tail<Args, POS + 2, ID>(make_text(str, POS, 1), format_str);\n  } else {\n    constexpr auto end = parse_text(str, POS + 1);\n    if constexpr (end - POS > 1) {\n      return parse_tail<Args, end, ID>(make_text(str, POS, end - POS),\n                                       format_str);\n    } else {\n      return parse_tail<Args, end, ID>(code_unit<char_type>{str[POS]},\n                                       format_str);\n    }\n  }\n}\n\ntemplate <typename... Args, typename S,\n          FMT_ENABLE_IF(detail::is_compiled_string<S>::value)>\nconstexpr auto compile(S format_str) {\n  constexpr auto str = basic_string_view<typename S::char_type>(format_str);\n  if constexpr (str.size() == 0) {\n    return detail::make_text(str, 0, 0);\n  } else {\n    constexpr auto result =\n        detail::compile_format_string<detail::type_list<Args...>, 0, 0>(\n            format_str);\n    return result;\n  }\n}\n#endif  // __cpp_if_constexpr\n}  // namespace detail\n\nFMT_MODULE_EXPORT_BEGIN\n\n#ifdef __cpp_if_constexpr\n\ntemplate <typename CompiledFormat, typename... Args,\n          typename Char = typename CompiledFormat::char_type,\n          FMT_ENABLE_IF(detail::is_compiled_format<CompiledFormat>::value)>\nFMT_INLINE std::basic_string<Char> format(const CompiledFormat& cf,\n                                          const Args&... args) {\n  auto s = std::basic_string<Char>();\n  cf.format(std::back_inserter(s), args...);\n  return s;\n}\n\ntemplate <typename OutputIt, typename CompiledFormat, typename... Args,\n          FMT_ENABLE_IF(detail::is_compiled_format<CompiledFormat>::value)>\nconstexpr FMT_INLINE OutputIt format_to(OutputIt out, const CompiledFormat& cf,\n                                        const Args&... args) {\n  return cf.format(out, args...);\n}\n\ntemplate <typename S, typename... Args,\n          FMT_ENABLE_IF(detail::is_compiled_string<S>::value)>\nFMT_INLINE std::basic_string<typename S::char_type> format(const S&,\n                                                           Args&&... args) {\n  if constexpr (std::is_same<typename S::char_type, char>::value) {\n    constexpr auto str = basic_string_view<typename S::char_type>(S());\n    if constexpr (str.size() == 2 && str[0] == '{' && str[1] == '}') {\n      const auto& first = detail::first(args...);\n      if constexpr (detail::is_named_arg<\n                        remove_cvref_t<decltype(first)>>::value) {\n        return fmt::to_string(first.value);\n      } else {\n        return fmt::to_string(first);\n      }\n    }\n  }\n  constexpr auto compiled = detail::compile<Args...>(S());\n  if constexpr (std::is_same<remove_cvref_t<decltype(compiled)>,\n                             detail::unknown_format>()) {\n    return format(static_cast<basic_string_view<typename S::char_type>>(S()),\n                  std::forward<Args>(args)...);\n  } else {\n    return format(compiled, std::forward<Args>(args)...);\n  }\n}\n\ntemplate <typename OutputIt, typename S, typename... Args,\n          FMT_ENABLE_IF(detail::is_compiled_string<S>::value)>\nFMT_CONSTEXPR OutputIt format_to(OutputIt out, const S&, Args&&... args) {\n  constexpr auto compiled = detail::compile<Args...>(S());\n  if constexpr (std::is_same<remove_cvref_t<decltype(compiled)>,\n                             detail::unknown_format>()) {\n    return format_to(out,\n                     static_cast<basic_string_view<typename S::char_type>>(S()),\n                     std::forward<Args>(args)...);\n  } else {\n    return format_to(out, compiled, std::forward<Args>(args)...);\n  }\n}\n#endif\n\ntemplate <typename OutputIt, typename S, typename... Args,\n          FMT_ENABLE_IF(detail::is_compiled_string<S>::value)>\nformat_to_n_result<OutputIt> format_to_n(OutputIt out, size_t n,\n                                         const S& format_str, Args&&... args) {\n  auto it = format_to(detail::truncating_iterator<OutputIt>(out, n), format_str,\n                      std::forward<Args>(args)...);\n  return {it.base(), it.count()};\n}\n\ntemplate <typename S, typename... Args,\n          FMT_ENABLE_IF(detail::is_compiled_string<S>::value)>\nsize_t formatted_size(const S& format_str, const Args&... args) {\n  return format_to(detail::counting_iterator(), format_str, args...).count();\n}\n\ntemplate <typename S, typename... Args,\n          FMT_ENABLE_IF(detail::is_compiled_string<S>::value)>\nvoid print(std::FILE* f, const S& format_str, const Args&... args) {\n  memory_buffer buffer;\n  format_to(std::back_inserter(buffer), format_str, args...);\n  detail::print(f, {buffer.data(), buffer.size()});\n}\n\ntemplate <typename S, typename... Args,\n          FMT_ENABLE_IF(detail::is_compiled_string<S>::value)>\nvoid print(const S& format_str, const Args&... args) {\n  print(stdout, format_str, args...);\n}\n\n#if FMT_USE_NONTYPE_TEMPLATE_PARAMETERS\ninline namespace literals {\ntemplate <detail_exported::fixed_string Str>\nconstexpr detail::udl_compiled_string<\n    remove_cvref_t<decltype(Str.data[0])>,\n    sizeof(Str.data) / sizeof(decltype(Str.data[0])), Str>\noperator\"\"_cf() {\n  return {};\n}\n}  // namespace literals\n#endif\n\nFMT_MODULE_EXPORT_END\nFMT_END_NAMESPACE\n\n#endif  // FMT_COMPILE_H_\n"
  },
  {
    "path": "examples/libraries/fmt/include/fmt/core.h",
    "content": "// Formatting library for C++ - the core API for char/UTF-8\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#ifndef FMT_CORE_H_\n#define FMT_CORE_H_\n\n#include <cstdio>  // std::FILE\n#include <cstring>\n#include <iterator>\n#include <limits>\n#include <string>\n#include <type_traits>\n\n// The fmt library version in the form major * 10000 + minor * 100 + patch.\n#define FMT_VERSION 80001\n\n#ifdef __clang__\n#  define FMT_CLANG_VERSION (__clang_major__ * 100 + __clang_minor__)\n#else\n#  define FMT_CLANG_VERSION 0\n#endif\n\n#if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER)\n#  define FMT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)\n#  define FMT_GCC_PRAGMA(arg) _Pragma(arg)\n#else\n#  define FMT_GCC_VERSION 0\n#  define FMT_GCC_PRAGMA(arg)\n#endif\n\n#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)\n#  define FMT_HAS_GXX_CXX11 FMT_GCC_VERSION\n#else\n#  define FMT_HAS_GXX_CXX11 0\n#endif\n\n#if defined(__INTEL_COMPILER)\n#  define FMT_ICC_VERSION __INTEL_COMPILER\n#else\n#  define FMT_ICC_VERSION 0\n#endif\n\n#ifdef __NVCC__\n#  define FMT_NVCC __NVCC__\n#else\n#  define FMT_NVCC 0\n#endif\n\n#ifdef _MSC_VER\n#  define FMT_MSC_VER _MSC_VER\n#  define FMT_MSC_WARNING(...) __pragma(warning(__VA_ARGS__))\n#else\n#  define FMT_MSC_VER 0\n#  define FMT_MSC_WARNING(...)\n#endif\n\n#ifdef __has_feature\n#  define FMT_HAS_FEATURE(x) __has_feature(x)\n#else\n#  define FMT_HAS_FEATURE(x) 0\n#endif\n\n#if defined(__has_include) &&                             \\\n    (!defined(__INTELLISENSE__) || FMT_MSC_VER > 1900) && \\\n    (!FMT_ICC_VERSION || FMT_ICC_VERSION >= 1600)\n#  define FMT_HAS_INCLUDE(x) __has_include(x)\n#else\n#  define FMT_HAS_INCLUDE(x) 0\n#endif\n\n#ifdef __has_cpp_attribute\n#  define FMT_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)\n#else\n#  define FMT_HAS_CPP_ATTRIBUTE(x) 0\n#endif\n\n#define FMT_HAS_CPP14_ATTRIBUTE(attribute) \\\n  (__cplusplus >= 201402L && FMT_HAS_CPP_ATTRIBUTE(attribute))\n\n#define FMT_HAS_CPP17_ATTRIBUTE(attribute) \\\n  (__cplusplus >= 201703L && FMT_HAS_CPP_ATTRIBUTE(attribute))\n\n// Check if relaxed C++14 constexpr is supported.\n// GCC doesn't allow throw in constexpr until version 6 (bug 67371).\n#ifndef FMT_USE_CONSTEXPR\n#  define FMT_USE_CONSTEXPR                                           \\\n    (FMT_HAS_FEATURE(cxx_relaxed_constexpr) || FMT_MSC_VER >= 1910 || \\\n     (FMT_GCC_VERSION >= 600 && __cplusplus >= 201402L)) &&           \\\n        !FMT_NVCC && !FMT_ICC_VERSION\n#endif\n#if FMT_USE_CONSTEXPR\n#  define FMT_CONSTEXPR constexpr\n#  define FMT_CONSTEXPR_DECL constexpr\n#else\n#  define FMT_CONSTEXPR\n#  define FMT_CONSTEXPR_DECL\n#endif\n\n// Check if constexpr std::char_traits<>::compare,length is supported.\n#if defined(__GLIBCXX__)\n#  if __cplusplus >= 201703L && defined(_GLIBCXX_RELEASE) && \\\n      _GLIBCXX_RELEASE >= 7  // GCC 7+ libstdc++ has _GLIBCXX_RELEASE.\n#    define FMT_CONSTEXPR_CHAR_TRAITS constexpr\n#  endif\n#elif defined(_LIBCPP_VERSION) && __cplusplus >= 201703L && \\\n    _LIBCPP_VERSION >= 4000\n#  define FMT_CONSTEXPR_CHAR_TRAITS constexpr\n#elif FMT_MSC_VER >= 1914 && _MSVC_LANG >= 201703L\n#  define FMT_CONSTEXPR_CHAR_TRAITS constexpr\n#endif\n#ifndef FMT_CONSTEXPR_CHAR_TRAITS\n#  define FMT_CONSTEXPR_CHAR_TRAITS\n#endif\n\n#ifndef FMT_OVERRIDE\n#  if FMT_HAS_FEATURE(cxx_override_control) || \\\n      (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1900\n#    define FMT_OVERRIDE override\n#  else\n#    define FMT_OVERRIDE\n#  endif\n#endif\n\n// Check if exceptions are disabled.\n#ifndef FMT_EXCEPTIONS\n#  if (defined(__GNUC__) && !defined(__EXCEPTIONS)) || \\\n      FMT_MSC_VER && !_HAS_EXCEPTIONS\n#    define FMT_EXCEPTIONS 0\n#  else\n#    define FMT_EXCEPTIONS 1\n#  endif\n#endif\n\n// Define FMT_USE_NOEXCEPT to make fmt use noexcept (C++11 feature).\n#ifndef FMT_USE_NOEXCEPT\n#  define FMT_USE_NOEXCEPT 0\n#endif\n\n#if FMT_USE_NOEXCEPT || FMT_HAS_FEATURE(cxx_noexcept) || \\\n    (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1900\n#  define FMT_DETECTED_NOEXCEPT noexcept\n#  define FMT_HAS_CXX11_NOEXCEPT 1\n#else\n#  define FMT_DETECTED_NOEXCEPT throw()\n#  define FMT_HAS_CXX11_NOEXCEPT 0\n#endif\n\n#ifndef FMT_NOEXCEPT\n#  if FMT_EXCEPTIONS || FMT_HAS_CXX11_NOEXCEPT\n#    define FMT_NOEXCEPT FMT_DETECTED_NOEXCEPT\n#  else\n#    define FMT_NOEXCEPT\n#  endif\n#endif\n\n// [[noreturn]] is disabled on MSVC and NVCC because of bogus unreachable code\n// warnings.\n#if FMT_EXCEPTIONS && FMT_HAS_CPP_ATTRIBUTE(noreturn) && !FMT_MSC_VER && \\\n    !FMT_NVCC\n#  define FMT_NORETURN [[noreturn]]\n#else\n#  define FMT_NORETURN\n#endif\n\n#ifndef FMT_MAYBE_UNUSED\n#  if FMT_HAS_CPP17_ATTRIBUTE(maybe_unused)\n#    define FMT_MAYBE_UNUSED [[maybe_unused]]\n#  else\n#    define FMT_MAYBE_UNUSED\n#  endif\n#endif\n\n#if __cplusplus == 201103L || __cplusplus == 201402L\n#  if defined(__INTEL_COMPILER) || defined(__PGI)\n#    define FMT_FALLTHROUGH\n#  elif defined(__clang__)\n#    define FMT_FALLTHROUGH [[clang::fallthrough]]\n#  elif FMT_GCC_VERSION >= 700 && \\\n      (!defined(__EDG_VERSION__) || __EDG_VERSION__ >= 520)\n#    define FMT_FALLTHROUGH [[gnu::fallthrough]]\n#  else\n#    define FMT_FALLTHROUGH\n#  endif\n#elif FMT_HAS_CPP17_ATTRIBUTE(fallthrough) || \\\n    (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)\n#  define FMT_FALLTHROUGH [[fallthrough]]\n#else\n#  define FMT_FALLTHROUGH\n#endif\n\n#ifndef FMT_USE_FLOAT\n#  define FMT_USE_FLOAT 1\n#endif\n#ifndef FMT_USE_DOUBLE\n#  define FMT_USE_DOUBLE 1\n#endif\n#ifndef FMT_USE_LONG_DOUBLE\n#  define FMT_USE_LONG_DOUBLE 1\n#endif\n\n#ifndef FMT_INLINE\n#  if FMT_GCC_VERSION || FMT_CLANG_VERSION\n#    define FMT_INLINE inline __attribute__((always_inline))\n#  else\n#    define FMT_INLINE inline\n#  endif\n#endif\n\n#ifndef FMT_USE_INLINE_NAMESPACES\n#  if FMT_HAS_FEATURE(cxx_inline_namespaces) || FMT_GCC_VERSION >= 404 || \\\n      (FMT_MSC_VER >= 1900 && (!defined(_MANAGED) || !_MANAGED))\n#    define FMT_USE_INLINE_NAMESPACES 1\n#  else\n#    define FMT_USE_INLINE_NAMESPACES 0\n#  endif\n#endif\n\n#ifndef FMT_BEGIN_NAMESPACE\n#  if FMT_USE_INLINE_NAMESPACES\n#    define FMT_INLINE_NAMESPACE inline namespace\n#    define FMT_END_NAMESPACE \\\n      }                       \\\n      }\n#  else\n#    define FMT_INLINE_NAMESPACE namespace\n#    define FMT_END_NAMESPACE \\\n      }                       \\\n      using namespace v8;     \\\n      }\n#  endif\n#  define FMT_BEGIN_NAMESPACE \\\n    namespace fmt {           \\\n    FMT_INLINE_NAMESPACE v8 {\n#endif\n\n#ifndef FMT_MODULE_EXPORT\n#  define FMT_MODULE_EXPORT\n#  define FMT_MODULE_EXPORT_BEGIN\n#  define FMT_MODULE_EXPORT_END\n#  define FMT_BEGIN_DETAIL_NAMESPACE namespace detail {\n#  define FMT_END_DETAIL_NAMESPACE }\n#endif\n\n#if !defined(FMT_HEADER_ONLY) && defined(_WIN32)\n#  define FMT_CLASS_API FMT_MSC_WARNING(suppress : 4275)\n#  ifdef FMT_EXPORT\n#    define FMT_API __declspec(dllexport)\n#  elif defined(FMT_SHARED)\n#    define FMT_API __declspec(dllimport)\n#  endif\n#else\n#  define FMT_CLASS_API\n#  if defined(FMT_EXPORT) || defined(FMT_SHARED)\n#    if defined(__GNUC__) || defined(__clang__)\n#      define FMT_API __attribute__((visibility(\"default\")))\n#    endif\n#  endif\n#endif\n#ifndef FMT_API\n#  define FMT_API\n#endif\n\n#if FMT_GCC_VERSION\n#  define FMT_GCC_VISIBILITY_HIDDEN __attribute__((visibility(\"hidden\")))\n#else\n#  define FMT_GCC_VISIBILITY_HIDDEN\n#endif\n\n// libc++ supports string_view in pre-c++17.\n#if (FMT_HAS_INCLUDE(<string_view>) &&                       \\\n     (__cplusplus > 201402L || defined(_LIBCPP_VERSION))) || \\\n    (defined(_MSVC_LANG) && _MSVC_LANG > 201402L && _MSC_VER >= 1910)\n#  include <string_view>\n#  define FMT_USE_STRING_VIEW\n#elif FMT_HAS_INCLUDE(\"experimental/string_view\") && __cplusplus >= 201402L\n#  include <experimental/string_view>\n#  define FMT_USE_EXPERIMENTAL_STRING_VIEW\n#endif\n\n#ifndef FMT_UNICODE\n#  define FMT_UNICODE !FMT_MSC_VER\n#endif\n\n#ifndef FMT_CONSTEVAL\n#  if ((FMT_GCC_VERSION >= 1000 || FMT_CLANG_VERSION >= 1101) && \\\n       __cplusplus > 201703L) ||                                 \\\n      (defined(__cpp_consteval) &&                               \\\n       !FMT_MSC_VER)  // consteval is broken in MSVC.\n#    define FMT_CONSTEVAL consteval\n#    define FMT_HAS_CONSTEVAL\n#  else\n#    define FMT_CONSTEVAL\n#  endif\n#endif\n\n#ifndef FMT_USE_NONTYPE_TEMPLATE_PARAMETERS\n#  if defined(__cpp_nontype_template_args) &&                \\\n      ((FMT_GCC_VERSION >= 903 && __cplusplus >= 201709L) || \\\n       __cpp_nontype_template_args >= 201911L)\n#    define FMT_USE_NONTYPE_TEMPLATE_PARAMETERS 1\n#  else\n#    define FMT_USE_NONTYPE_TEMPLATE_PARAMETERS 0\n#  endif\n#endif\n\n// Enable minimal optimizations for more compact code in debug mode.\nFMT_GCC_PRAGMA(\"GCC push_options\")\n#ifndef __OPTIMIZE__\nFMT_GCC_PRAGMA(\"GCC optimize(\\\"Og\\\")\")\n#endif\n\nFMT_BEGIN_NAMESPACE\nFMT_MODULE_EXPORT_BEGIN\n\n// Implementations of enable_if_t and other metafunctions for older systems.\ntemplate <bool B, typename T = void>\nusing enable_if_t = typename std::enable_if<B, T>::type;\ntemplate <bool B, typename T, typename F>\nusing conditional_t = typename std::conditional<B, T, F>::type;\ntemplate <bool B> using bool_constant = std::integral_constant<bool, B>;\ntemplate <typename T>\nusing remove_reference_t = typename std::remove_reference<T>::type;\ntemplate <typename T>\nusing remove_cvref_t = typename std::remove_cv<remove_reference_t<T>>::type;\ntemplate <typename T> struct type_identity { using type = T; };\ntemplate <typename T> using type_identity_t = typename type_identity<T>::type;\n\nstruct monostate {\n  constexpr monostate() {}\n};\n\n// Suppress \"unused variable\" warnings with the method described in\n// https://herbsutter.com/2009/10/18/mailbag-shutting-up-compiler-warnings/.\n// (void)var does not work on many Intel compilers.\ntemplate <typename... T> FMT_CONSTEXPR void ignore_unused(const T&...) {}\n\n// An enable_if helper to be used in template parameters which results in much\n// shorter symbols: https://godbolt.org/z/sWw4vP. Extra parentheses are needed\n// to workaround a bug in MSVC 2019 (see #1140 and #1186).\n#ifdef FMT_DOC\n#  define FMT_ENABLE_IF(...)\n#else\n#  define FMT_ENABLE_IF(...) enable_if_t<(__VA_ARGS__), int> = 0\n#endif\n\nFMT_BEGIN_DETAIL_NAMESPACE\n\nconstexpr FMT_INLINE auto is_constant_evaluated() FMT_NOEXCEPT -> bool {\n#ifdef __cpp_lib_is_constant_evaluated\n  return std::is_constant_evaluated();\n#else\n  return false;\n#endif\n}\n\n// A function to suppress \"conditional expression is constant\" warnings.\ntemplate <typename T> constexpr auto const_check(T value) -> T { return value; }\n\nFMT_NORETURN FMT_API void assert_fail(const char* file, int line,\n                                      const char* message);\n\n#ifndef FMT_ASSERT\n#  ifdef NDEBUG\n// FMT_ASSERT is not empty to avoid -Werror=empty-body.\n#    define FMT_ASSERT(condition, message) \\\n      ::fmt::ignore_unused((condition), (message))\n#  else\n#    define FMT_ASSERT(condition, message)                                    \\\n      ((condition) /* void() fails with -Winvalid-constexpr on clang 4.0.1 */ \\\n           ? (void)0                                                          \\\n           : ::fmt::detail::assert_fail(__FILE__, __LINE__, (message)))\n#  endif\n#endif\n\n#if defined(FMT_USE_STRING_VIEW)\ntemplate <typename Char> using std_string_view = std::basic_string_view<Char>;\n#elif defined(FMT_USE_EXPERIMENTAL_STRING_VIEW)\ntemplate <typename Char>\nusing std_string_view = std::experimental::basic_string_view<Char>;\n#else\ntemplate <typename T> struct std_string_view {};\n#endif\n\n#ifdef FMT_USE_INT128\n// Do nothing.\n#elif defined(__SIZEOF_INT128__) && !FMT_NVCC && \\\n    !(FMT_CLANG_VERSION && FMT_MSC_VER)\n#  define FMT_USE_INT128 1\nusing int128_t = __int128_t;\nusing uint128_t = __uint128_t;\ntemplate <typename T> inline auto convert_for_visit(T value) -> T {\n  return value;\n}\n#else\n#  define FMT_USE_INT128 0\n#endif\n#if !FMT_USE_INT128\nenum class int128_t {};\nenum class uint128_t {};\n// Reduce template instantiations.\ntemplate <typename T> inline auto convert_for_visit(T) -> monostate {\n  return {};\n}\n#endif\n\n// Casts a nonnegative integer to unsigned.\ntemplate <typename Int>\nFMT_CONSTEXPR auto to_unsigned(Int value) ->\n    typename std::make_unsigned<Int>::type {\n  FMT_ASSERT(value >= 0, \"negative value\");\n  return static_cast<typename std::make_unsigned<Int>::type>(value);\n}\n\nFMT_MSC_WARNING(suppress : 4566) constexpr unsigned char micro[] = \"\\u00B5\";\n\nconstexpr auto is_utf8() -> bool {\n  // Avoid buggy sign extensions in MSVC's constant evaluation mode.\n  // https://developercommunity.visualstudio.com/t/C-difference-in-behavior-for-unsigned/1233612\n  using uchar = unsigned char;\n  return FMT_UNICODE || (sizeof(micro) == 3 && uchar(micro[0]) == 0xC2 &&\n                         uchar(micro[1]) == 0xB5);\n}\nFMT_END_DETAIL_NAMESPACE\n\n/**\n  An implementation of ``std::basic_string_view`` for pre-C++17. It provides a\n  subset of the API. ``fmt::basic_string_view`` is used for format strings even\n  if ``std::string_view`` is available to prevent issues when a library is\n  compiled with a different ``-std`` option than the client code (which is not\n  recommended).\n */\ntemplate <typename Char> class basic_string_view {\n private:\n  const Char* data_;\n  size_t size_;\n\n public:\n  using value_type = Char;\n  using iterator = const Char*;\n\n  constexpr basic_string_view() FMT_NOEXCEPT : data_(nullptr), size_(0) {}\n\n  /** Constructs a string reference object from a C string and a size. */\n  constexpr basic_string_view(const Char* s, size_t count) FMT_NOEXCEPT\n      : data_(s),\n        size_(count) {}\n\n  /**\n    \\rst\n    Constructs a string reference object from a C string computing\n    the size with ``std::char_traits<Char>::length``.\n    \\endrst\n   */\n  FMT_CONSTEXPR_CHAR_TRAITS\n  FMT_INLINE\n  basic_string_view(const Char* s) : data_(s) {\n    if (detail::const_check(std::is_same<Char, char>::value &&\n                            !detail::is_constant_evaluated()))\n      size_ = std::strlen(reinterpret_cast<const char*>(s));\n    else\n      size_ = std::char_traits<Char>::length(s);\n  }\n\n  /** Constructs a string reference from a ``std::basic_string`` object. */\n  template <typename Traits, typename Alloc>\n  FMT_CONSTEXPR basic_string_view(\n      const std::basic_string<Char, Traits, Alloc>& s) FMT_NOEXCEPT\n      : data_(s.data()),\n        size_(s.size()) {}\n\n  template <typename S, FMT_ENABLE_IF(std::is_same<\n                                      S, detail::std_string_view<Char>>::value)>\n  FMT_CONSTEXPR basic_string_view(S s) FMT_NOEXCEPT : data_(s.data()),\n                                                      size_(s.size()) {}\n\n  /** Returns a pointer to the string data. */\n  constexpr auto data() const -> const Char* { return data_; }\n\n  /** Returns the string size. */\n  constexpr auto size() const -> size_t { return size_; }\n\n  constexpr auto begin() const -> iterator { return data_; }\n  constexpr auto end() const -> iterator { return data_ + size_; }\n\n  constexpr auto operator[](size_t pos) const -> const Char& {\n    return data_[pos];\n  }\n\n  FMT_CONSTEXPR void remove_prefix(size_t n) {\n    data_ += n;\n    size_ -= n;\n  }\n\n  // Lexicographically compare this string reference to other.\n  FMT_CONSTEXPR_CHAR_TRAITS auto compare(basic_string_view other) const -> int {\n    size_t str_size = size_ < other.size_ ? size_ : other.size_;\n    int result = std::char_traits<Char>::compare(data_, other.data_, str_size);\n    if (result == 0)\n      result = size_ == other.size_ ? 0 : (size_ < other.size_ ? -1 : 1);\n    return result;\n  }\n\n  FMT_CONSTEXPR_CHAR_TRAITS friend auto operator==(basic_string_view lhs,\n                                                   basic_string_view rhs)\n      -> bool {\n    return lhs.compare(rhs) == 0;\n  }\n  friend auto operator!=(basic_string_view lhs, basic_string_view rhs) -> bool {\n    return lhs.compare(rhs) != 0;\n  }\n  friend auto operator<(basic_string_view lhs, basic_string_view rhs) -> bool {\n    return lhs.compare(rhs) < 0;\n  }\n  friend auto operator<=(basic_string_view lhs, basic_string_view rhs) -> bool {\n    return lhs.compare(rhs) <= 0;\n  }\n  friend auto operator>(basic_string_view lhs, basic_string_view rhs) -> bool {\n    return lhs.compare(rhs) > 0;\n  }\n  friend auto operator>=(basic_string_view lhs, basic_string_view rhs) -> bool {\n    return lhs.compare(rhs) >= 0;\n  }\n};\n\nusing string_view = basic_string_view<char>;\n\n/** Specifies if ``T`` is a character type. Can be specialized by users. */\ntemplate <typename T> struct is_char : std::false_type {};\ntemplate <> struct is_char<char> : std::true_type {};\n\n// Returns a string view of `s`.\ntemplate <typename Char, FMT_ENABLE_IF(is_char<Char>::value)>\nFMT_INLINE auto to_string_view(const Char* s) -> basic_string_view<Char> {\n  return s;\n}\ntemplate <typename Char, typename Traits, typename Alloc>\ninline auto to_string_view(const std::basic_string<Char, Traits, Alloc>& s)\n    -> basic_string_view<Char> {\n  return s;\n}\ntemplate <typename Char>\nconstexpr auto to_string_view(basic_string_view<Char> s)\n    -> basic_string_view<Char> {\n  return s;\n}\ntemplate <typename Char,\n          FMT_ENABLE_IF(!std::is_empty<detail::std_string_view<Char>>::value)>\ninline auto to_string_view(detail::std_string_view<Char> s)\n    -> basic_string_view<Char> {\n  return s;\n}\n\n// A base class for compile-time strings. It is defined in the fmt namespace to\n// make formatting functions visible via ADL, e.g. format(FMT_STRING(\"{}\"), 42).\nstruct compile_string {};\n\ntemplate <typename S>\nstruct is_compile_string : std::is_base_of<compile_string, S> {};\n\ntemplate <typename S, FMT_ENABLE_IF(is_compile_string<S>::value)>\nconstexpr auto to_string_view(const S& s)\n    -> basic_string_view<typename S::char_type> {\n  return basic_string_view<typename S::char_type>(s);\n}\n\nFMT_BEGIN_DETAIL_NAMESPACE\n\nvoid to_string_view(...);\nusing fmt::v8::to_string_view;\n\n// Specifies whether S is a string type convertible to fmt::basic_string_view.\n// It should be a constexpr function but MSVC 2017 fails to compile it in\n// enable_if and MSVC 2015 fails to compile it as an alias template.\ntemplate <typename S>\nstruct is_string : std::is_class<decltype(to_string_view(std::declval<S>()))> {\n};\n\ntemplate <typename S, typename = void> struct char_t_impl {};\ntemplate <typename S> struct char_t_impl<S, enable_if_t<is_string<S>::value>> {\n  using result = decltype(to_string_view(std::declval<S>()));\n  using type = typename result::value_type;\n};\n\n// Reports a compile-time error if S is not a valid format string.\ntemplate <typename..., typename S, FMT_ENABLE_IF(!is_compile_string<S>::value)>\nFMT_INLINE void check_format_string(const S&) {\n#ifdef FMT_ENFORCE_COMPILE_STRING\n  static_assert(is_compile_string<S>::value,\n                \"FMT_ENFORCE_COMPILE_STRING requires all format strings to use \"\n                \"FMT_STRING.\");\n#endif\n}\ntemplate <typename..., typename S, FMT_ENABLE_IF(is_compile_string<S>::value)>\nvoid check_format_string(S);\n\nstruct error_handler {\n  constexpr error_handler() = default;\n  constexpr error_handler(const error_handler&) = default;\n\n  // This function is intentionally not constexpr to give a compile-time error.\n  FMT_NORETURN FMT_API void on_error(const char* message);\n};\nFMT_END_DETAIL_NAMESPACE\n\n/** String's character type. */\ntemplate <typename S> using char_t = typename detail::char_t_impl<S>::type;\n\n/**\n  \\rst\n  Parsing context consisting of a format string range being parsed and an\n  argument counter for automatic indexing.\n  You can use the ``format_parse_context`` type alias for ``char`` instead.\n  \\endrst\n */\ntemplate <typename Char, typename ErrorHandler = detail::error_handler>\nclass basic_format_parse_context : private ErrorHandler {\n private:\n  basic_string_view<Char> format_str_;\n  int next_arg_id_;\n\n public:\n  using char_type = Char;\n  using iterator = typename basic_string_view<Char>::iterator;\n\n  explicit constexpr basic_format_parse_context(\n      basic_string_view<Char> format_str, ErrorHandler eh = {},\n      int next_arg_id = 0)\n      : ErrorHandler(eh), format_str_(format_str), next_arg_id_(next_arg_id) {}\n\n  /**\n    Returns an iterator to the beginning of the format string range being\n    parsed.\n   */\n  constexpr auto begin() const FMT_NOEXCEPT -> iterator {\n    return format_str_.begin();\n  }\n\n  /**\n    Returns an iterator past the end of the format string range being parsed.\n   */\n  constexpr auto end() const FMT_NOEXCEPT -> iterator {\n    return format_str_.end();\n  }\n\n  /** Advances the begin iterator to ``it``. */\n  FMT_CONSTEXPR void advance_to(iterator it) {\n    format_str_.remove_prefix(detail::to_unsigned(it - begin()));\n  }\n\n  /**\n    Reports an error if using the manual argument indexing; otherwise returns\n    the next argument index and switches to the automatic indexing.\n   */\n  FMT_CONSTEXPR auto next_arg_id() -> int {\n    // Don't check if the argument id is valid to avoid overhead and because it\n    // will be checked during formatting anyway.\n    if (next_arg_id_ >= 0) return next_arg_id_++;\n    on_error(\"cannot switch from manual to automatic argument indexing\");\n    return 0;\n  }\n\n  /**\n    Reports an error if using the automatic argument indexing; otherwise\n    switches to the manual indexing.\n   */\n  FMT_CONSTEXPR void check_arg_id(int) {\n    if (next_arg_id_ > 0)\n      on_error(\"cannot switch from automatic to manual argument indexing\");\n    else\n      next_arg_id_ = -1;\n  }\n\n  FMT_CONSTEXPR void check_arg_id(basic_string_view<Char>) {}\n\n  FMT_CONSTEXPR void on_error(const char* message) {\n    ErrorHandler::on_error(message);\n  }\n\n  constexpr auto error_handler() const -> ErrorHandler { return *this; }\n};\n\nusing format_parse_context = basic_format_parse_context<char>;\n\ntemplate <typename Context> class basic_format_arg;\ntemplate <typename Context> class basic_format_args;\ntemplate <typename Context> class dynamic_format_arg_store;\n\n// A formatter for objects of type T.\ntemplate <typename T, typename Char = char, typename Enable = void>\nstruct formatter {\n  // A deleted default constructor indicates a disabled formatter.\n  formatter() = delete;\n};\n\n// Specifies if T has an enabled formatter specialization. A type can be\n// formattable even if it doesn't have a formatter e.g. via a conversion.\ntemplate <typename T, typename Context>\nusing has_formatter =\n    std::is_constructible<typename Context::template formatter_type<T>>;\n\n// Checks whether T is a container with contiguous storage.\ntemplate <typename T> struct is_contiguous : std::false_type {};\ntemplate <typename Char>\nstruct is_contiguous<std::basic_string<Char>> : std::true_type {};\n\nclass appender;\n\nFMT_BEGIN_DETAIL_NAMESPACE\n\n// Extracts a reference to the container from back_insert_iterator.\ntemplate <typename Container>\ninline auto get_container(std::back_insert_iterator<Container> it)\n    -> Container& {\n  using bi_iterator = std::back_insert_iterator<Container>;\n  struct accessor : bi_iterator {\n    accessor(bi_iterator iter) : bi_iterator(iter) {}\n    using bi_iterator::container;\n  };\n  return *accessor(it).container;\n}\n\ntemplate <typename Char, typename InputIt, typename OutputIt>\nFMT_CONSTEXPR auto copy_str(InputIt begin, InputIt end, OutputIt out)\n    -> OutputIt {\n  while (begin != end) *out++ = static_cast<Char>(*begin++);\n  return out;\n}\n\ntemplate <typename Char, FMT_ENABLE_IF(std::is_same<Char, char>::value)>\nFMT_CONSTEXPR auto copy_str(const Char* begin, const Char* end, Char* out)\n    -> Char* {\n  if (is_constant_evaluated())\n    return copy_str<Char, const Char*, Char*>(begin, end, out);\n  auto size = to_unsigned(end - begin);\n  memcpy(out, begin, size);\n  return out + size;\n}\n\n/**\n  \\rst\n  A contiguous memory buffer with an optional growing ability. It is an internal\n  class and shouldn't be used directly, only via `~fmt::basic_memory_buffer`.\n  \\endrst\n */\ntemplate <typename T> class buffer {\n private:\n  T* ptr_;\n  size_t size_;\n  size_t capacity_;\n\n protected:\n  // Don't initialize ptr_ since it is not accessed to save a few cycles.\n  FMT_MSC_WARNING(suppress : 26495)\n  buffer(size_t sz) FMT_NOEXCEPT : size_(sz), capacity_(sz) {}\n\n  buffer(T* p = nullptr, size_t sz = 0, size_t cap = 0) FMT_NOEXCEPT\n      : ptr_(p),\n        size_(sz),\n        capacity_(cap) {}\n\n  ~buffer() = default;\n  buffer(buffer&&) = default;\n\n  /** Sets the buffer data and capacity. */\n  void set(T* buf_data, size_t buf_capacity) FMT_NOEXCEPT {\n    ptr_ = buf_data;\n    capacity_ = buf_capacity;\n  }\n\n  /** Increases the buffer capacity to hold at least *capacity* elements. */\n  virtual void grow(size_t capacity) = 0;\n\n public:\n  using value_type = T;\n  using const_reference = const T&;\n\n  buffer(const buffer&) = delete;\n  void operator=(const buffer&) = delete;\n\n  auto begin() FMT_NOEXCEPT -> T* { return ptr_; }\n  auto end() FMT_NOEXCEPT -> T* { return ptr_ + size_; }\n\n  auto begin() const FMT_NOEXCEPT -> const T* { return ptr_; }\n  auto end() const FMT_NOEXCEPT -> const T* { return ptr_ + size_; }\n\n  /** Returns the size of this buffer. */\n  auto size() const FMT_NOEXCEPT -> size_t { return size_; }\n\n  /** Returns the capacity of this buffer. */\n  auto capacity() const FMT_NOEXCEPT -> size_t { return capacity_; }\n\n  /** Returns a pointer to the buffer data. */\n  auto data() FMT_NOEXCEPT -> T* { return ptr_; }\n\n  /** Returns a pointer to the buffer data. */\n  auto data() const FMT_NOEXCEPT -> const T* { return ptr_; }\n\n  /** Clears this buffer. */\n  void clear() { size_ = 0; }\n\n  // Tries resizing the buffer to contain *count* elements. If T is a POD type\n  // the new elements may not be initialized.\n  void try_resize(size_t count) {\n    try_reserve(count);\n    size_ = count <= capacity_ ? count : capacity_;\n  }\n\n  // Tries increasing the buffer capacity to *new_capacity*. It can increase the\n  // capacity by a smaller amount than requested but guarantees there is space\n  // for at least one additional element either by increasing the capacity or by\n  // flushing the buffer if it is full.\n  void try_reserve(size_t new_capacity) {\n    if (new_capacity > capacity_) grow(new_capacity);\n  }\n\n  void push_back(const T& value) {\n    try_reserve(size_ + 1);\n    ptr_[size_++] = value;\n  }\n\n  /** Appends data to the end of the buffer. */\n  template <typename U> void append(const U* begin, const U* end);\n\n  template <typename I> auto operator[](I index) -> T& { return ptr_[index]; }\n  template <typename I> auto operator[](I index) const -> const T& {\n    return ptr_[index];\n  }\n};\n\nstruct buffer_traits {\n  explicit buffer_traits(size_t) {}\n  auto count() const -> size_t { return 0; }\n  auto limit(size_t size) -> size_t { return size; }\n};\n\nclass fixed_buffer_traits {\n private:\n  size_t count_ = 0;\n  size_t limit_;\n\n public:\n  explicit fixed_buffer_traits(size_t limit) : limit_(limit) {}\n  auto count() const -> size_t { return count_; }\n  auto limit(size_t size) -> size_t {\n    size_t n = limit_ > count_ ? limit_ - count_ : 0;\n    count_ += size;\n    return size < n ? size : n;\n  }\n};\n\n// A buffer that writes to an output iterator when flushed.\ntemplate <typename OutputIt, typename T, typename Traits = buffer_traits>\nclass iterator_buffer final : public Traits, public buffer<T> {\n private:\n  OutputIt out_;\n  enum { buffer_size = 256 };\n  T data_[buffer_size];\n\n protected:\n  void grow(size_t) final FMT_OVERRIDE {\n    if (this->size() == buffer_size) flush();\n  }\n\n  void flush() {\n    auto size = this->size();\n    this->clear();\n    out_ = copy_str<T>(data_, data_ + this->limit(size), out_);\n  }\n\n public:\n  explicit iterator_buffer(OutputIt out, size_t n = buffer_size)\n      : Traits(n), buffer<T>(data_, 0, buffer_size), out_(out) {}\n  iterator_buffer(iterator_buffer&& other)\n      : Traits(other), buffer<T>(data_, 0, buffer_size), out_(other.out_) {}\n  ~iterator_buffer() { flush(); }\n\n  auto out() -> OutputIt {\n    flush();\n    return out_;\n  }\n  auto count() const -> size_t { return Traits::count() + this->size(); }\n};\n\ntemplate <typename T> class iterator_buffer<T*, T> final : public buffer<T> {\n protected:\n  void grow(size_t) final FMT_OVERRIDE {}\n\n public:\n  explicit iterator_buffer(T* out, size_t = 0) : buffer<T>(out, 0, ~size_t()) {}\n\n  auto out() -> T* { return &*this->end(); }\n};\n\n// A buffer that writes to a container with the contiguous storage.\ntemplate <typename Container>\nclass iterator_buffer<std::back_insert_iterator<Container>,\n                      enable_if_t<is_contiguous<Container>::value,\n                                  typename Container::value_type>>\n    final : public buffer<typename Container::value_type> {\n private:\n  Container& container_;\n\n protected:\n  void grow(size_t capacity) final FMT_OVERRIDE {\n    container_.resize(capacity);\n    this->set(&container_[0], capacity);\n  }\n\n public:\n  explicit iterator_buffer(Container& c)\n      : buffer<typename Container::value_type>(c.size()), container_(c) {}\n  explicit iterator_buffer(std::back_insert_iterator<Container> out, size_t = 0)\n      : iterator_buffer(get_container(out)) {}\n  auto out() -> std::back_insert_iterator<Container> {\n    return std::back_inserter(container_);\n  }\n};\n\n// A buffer that counts the number of code units written discarding the output.\ntemplate <typename T = char> class counting_buffer final : public buffer<T> {\n private:\n  enum { buffer_size = 256 };\n  T data_[buffer_size];\n  size_t count_ = 0;\n\n protected:\n  void grow(size_t) final FMT_OVERRIDE {\n    if (this->size() != buffer_size) return;\n    count_ += this->size();\n    this->clear();\n  }\n\n public:\n  counting_buffer() : buffer<T>(data_, 0, buffer_size) {}\n\n  auto count() -> size_t { return count_ + this->size(); }\n};\n\ntemplate <typename T>\nusing buffer_appender = conditional_t<std::is_same<T, char>::value, appender,\n                                      std::back_insert_iterator<buffer<T>>>;\n\n// Maps an output iterator to a buffer.\ntemplate <typename T, typename OutputIt>\nauto get_buffer(OutputIt out) -> iterator_buffer<OutputIt, T> {\n  return iterator_buffer<OutputIt, T>(out);\n}\n\ntemplate <typename Buffer>\nauto get_iterator(Buffer& buf) -> decltype(buf.out()) {\n  return buf.out();\n}\ntemplate <typename T> auto get_iterator(buffer<T>& buf) -> buffer_appender<T> {\n  return buffer_appender<T>(buf);\n}\n\ntemplate <typename T, typename Char = char, typename Enable = void>\nstruct fallback_formatter {\n  fallback_formatter() = delete;\n};\n\n// Specifies if T has an enabled fallback_formatter specialization.\ntemplate <typename T, typename Char>\nusing has_fallback_formatter =\n    std::is_constructible<fallback_formatter<T, Char>>;\n\nstruct view {};\n\ntemplate <typename Char, typename T> struct named_arg : view {\n  const Char* name;\n  const T& value;\n  named_arg(const Char* n, const T& v) : name(n), value(v) {}\n};\n\ntemplate <typename Char> struct named_arg_info {\n  const Char* name;\n  int id;\n};\n\ntemplate <typename T, typename Char, size_t NUM_ARGS, size_t NUM_NAMED_ARGS>\nstruct arg_data {\n  // args_[0].named_args points to named_args_ to avoid bloating format_args.\n  // +1 to workaround a bug in gcc 7.5 that causes duplicated-branches warning.\n  T args_[1 + (NUM_ARGS != 0 ? NUM_ARGS : +1)];\n  named_arg_info<Char> named_args_[NUM_NAMED_ARGS];\n\n  template <typename... U>\n  arg_data(const U&... init) : args_{T(named_args_, NUM_NAMED_ARGS), init...} {}\n  arg_data(const arg_data& other) = delete;\n  auto args() const -> const T* { return args_ + 1; }\n  auto named_args() -> named_arg_info<Char>* { return named_args_; }\n};\n\ntemplate <typename T, typename Char, size_t NUM_ARGS>\nstruct arg_data<T, Char, NUM_ARGS, 0> {\n  // +1 to workaround a bug in gcc 7.5 that causes duplicated-branches warning.\n  T args_[NUM_ARGS != 0 ? NUM_ARGS : +1];\n\n  template <typename... U>\n  FMT_CONSTEXPR FMT_INLINE arg_data(const U&... init) : args_{init...} {}\n  FMT_CONSTEXPR FMT_INLINE auto args() const -> const T* { return args_; }\n  FMT_CONSTEXPR FMT_INLINE auto named_args() -> std::nullptr_t {\n    return nullptr;\n  }\n};\n\ntemplate <typename Char>\ninline void init_named_args(named_arg_info<Char>*, int, int) {}\n\ntemplate <typename T> struct is_named_arg : std::false_type {};\ntemplate <typename T> struct is_statically_named_arg : std::false_type {};\n\ntemplate <typename T, typename Char>\nstruct is_named_arg<named_arg<Char, T>> : std::true_type {};\n\ntemplate <typename Char, typename T, typename... Tail,\n          FMT_ENABLE_IF(!is_named_arg<T>::value)>\nvoid init_named_args(named_arg_info<Char>* named_args, int arg_count,\n                     int named_arg_count, const T&, const Tail&... args) {\n  init_named_args(named_args, arg_count + 1, named_arg_count, args...);\n}\n\ntemplate <typename Char, typename T, typename... Tail,\n          FMT_ENABLE_IF(is_named_arg<T>::value)>\nvoid init_named_args(named_arg_info<Char>* named_args, int arg_count,\n                     int named_arg_count, const T& arg, const Tail&... args) {\n  named_args[named_arg_count++] = {arg.name, arg_count};\n  init_named_args(named_args, arg_count + 1, named_arg_count, args...);\n}\n\ntemplate <typename... Args>\nFMT_CONSTEXPR FMT_INLINE void init_named_args(std::nullptr_t, int, int,\n                                              const Args&...) {}\n\ntemplate <bool B = false> constexpr auto count() -> size_t { return B ? 1 : 0; }\ntemplate <bool B1, bool B2, bool... Tail> constexpr auto count() -> size_t {\n  return (B1 ? 1 : 0) + count<B2, Tail...>();\n}\n\ntemplate <typename... Args> constexpr auto count_named_args() -> size_t {\n  return count<is_named_arg<Args>::value...>();\n}\n\nenum class type {\n  none_type,\n  // Integer types should go first,\n  int_type,\n  uint_type,\n  long_long_type,\n  ulong_long_type,\n  int128_type,\n  uint128_type,\n  bool_type,\n  char_type,\n  last_integer_type = char_type,\n  // followed by floating-point types.\n  float_type,\n  double_type,\n  long_double_type,\n  last_numeric_type = long_double_type,\n  cstring_type,\n  string_type,\n  pointer_type,\n  custom_type\n};\n\n// Maps core type T to the corresponding type enum constant.\ntemplate <typename T, typename Char>\nstruct type_constant : std::integral_constant<type, type::custom_type> {};\n\n#define FMT_TYPE_CONSTANT(Type, constant) \\\n  template <typename Char>                \\\n  struct type_constant<Type, Char>        \\\n      : std::integral_constant<type, type::constant> {}\n\nFMT_TYPE_CONSTANT(int, int_type);\nFMT_TYPE_CONSTANT(unsigned, uint_type);\nFMT_TYPE_CONSTANT(long long, long_long_type);\nFMT_TYPE_CONSTANT(unsigned long long, ulong_long_type);\nFMT_TYPE_CONSTANT(int128_t, int128_type);\nFMT_TYPE_CONSTANT(uint128_t, uint128_type);\nFMT_TYPE_CONSTANT(bool, bool_type);\nFMT_TYPE_CONSTANT(Char, char_type);\nFMT_TYPE_CONSTANT(float, float_type);\nFMT_TYPE_CONSTANT(double, double_type);\nFMT_TYPE_CONSTANT(long double, long_double_type);\nFMT_TYPE_CONSTANT(const Char*, cstring_type);\nFMT_TYPE_CONSTANT(basic_string_view<Char>, string_type);\nFMT_TYPE_CONSTANT(const void*, pointer_type);\n\nconstexpr bool is_integral_type(type t) {\n  return t > type::none_type && t <= type::last_integer_type;\n}\n\nconstexpr bool is_arithmetic_type(type t) {\n  return t > type::none_type && t <= type::last_numeric_type;\n}\n\ntemplate <typename Char> struct string_value {\n  const Char* data;\n  size_t size;\n};\n\ntemplate <typename Char> struct named_arg_value {\n  const named_arg_info<Char>* data;\n  size_t size;\n};\n\ntemplate <typename Context> struct custom_value {\n  using parse_context = typename Context::parse_context_type;\n  const void* value;\n  void (*format)(const void* arg, parse_context& parse_ctx, Context& ctx);\n};\n\n// A formatting argument value.\ntemplate <typename Context> class value {\n public:\n  using char_type = typename Context::char_type;\n\n  union {\n    monostate no_value;\n    int int_value;\n    unsigned uint_value;\n    long long long_long_value;\n    unsigned long long ulong_long_value;\n    int128_t int128_value;\n    uint128_t uint128_value;\n    bool bool_value;\n    char_type char_value;\n    float float_value;\n    double double_value;\n    long double long_double_value;\n    const void* pointer;\n    string_value<char_type> string;\n    custom_value<Context> custom;\n    named_arg_value<char_type> named_args;\n  };\n\n  constexpr FMT_INLINE value() : no_value() {}\n  constexpr FMT_INLINE value(int val) : int_value(val) {}\n  constexpr FMT_INLINE value(unsigned val) : uint_value(val) {}\n  constexpr FMT_INLINE value(long long val) : long_long_value(val) {}\n  constexpr FMT_INLINE value(unsigned long long val) : ulong_long_value(val) {}\n  FMT_INLINE value(int128_t val) : int128_value(val) {}\n  FMT_INLINE value(uint128_t val) : uint128_value(val) {}\n  FMT_INLINE value(float val) : float_value(val) {}\n  FMT_INLINE value(double val) : double_value(val) {}\n  FMT_INLINE value(long double val) : long_double_value(val) {}\n  constexpr FMT_INLINE value(bool val) : bool_value(val) {}\n  constexpr FMT_INLINE value(char_type val) : char_value(val) {}\n  FMT_CONSTEXPR FMT_INLINE value(const char_type* val) {\n    string.data = val;\n    if (is_constant_evaluated()) string.size = {};\n  }\n  FMT_CONSTEXPR FMT_INLINE value(basic_string_view<char_type> val) {\n    string.data = val.data();\n    string.size = val.size();\n  }\n  FMT_INLINE value(const void* val) : pointer(val) {}\n  FMT_INLINE value(const named_arg_info<char_type>* args, size_t size)\n      : named_args{args, size} {}\n\n  template <typename T> FMT_CONSTEXPR FMT_INLINE value(const T& val) {\n    custom.value = &val;\n    // Get the formatter type through the context to allow different contexts\n    // have different extension points, e.g. `formatter<T>` for `format` and\n    // `printf_formatter<T>` for `printf`.\n    custom.format = format_custom_arg<\n        T, conditional_t<has_formatter<T, Context>::value,\n                         typename Context::template formatter_type<T>,\n                         fallback_formatter<T, char_type>>>;\n  }\n\n private:\n  // Formats an argument of a custom type, such as a user-defined class.\n  template <typename T, typename Formatter>\n  static void format_custom_arg(const void* arg,\n                                typename Context::parse_context_type& parse_ctx,\n                                Context& ctx) {\n    Formatter f;\n    parse_ctx.advance_to(f.parse(parse_ctx));\n    ctx.advance_to(f.format(*static_cast<const T*>(arg), ctx));\n  }\n};\n\ntemplate <typename Context, typename T>\nFMT_CONSTEXPR auto make_arg(const T& value) -> basic_format_arg<Context>;\n\n// To minimize the number of types we need to deal with, long is translated\n// either to int or to long long depending on its size.\nenum { long_short = sizeof(long) == sizeof(int) };\nusing long_type = conditional_t<long_short, int, long long>;\nusing ulong_type = conditional_t<long_short, unsigned, unsigned long long>;\n\nstruct unformattable {};\n\n// Maps formatting arguments to core types.\ntemplate <typename Context> struct arg_mapper {\n  using char_type = typename Context::char_type;\n\n  FMT_CONSTEXPR FMT_INLINE auto map(signed char val) -> int { return val; }\n  FMT_CONSTEXPR FMT_INLINE auto map(unsigned char val) -> unsigned {\n    return val;\n  }\n  FMT_CONSTEXPR FMT_INLINE auto map(short val) -> int { return val; }\n  FMT_CONSTEXPR FMT_INLINE auto map(unsigned short val) -> unsigned {\n    return val;\n  }\n  FMT_CONSTEXPR FMT_INLINE auto map(int val) -> int { return val; }\n  FMT_CONSTEXPR FMT_INLINE auto map(unsigned val) -> unsigned { return val; }\n  FMT_CONSTEXPR FMT_INLINE auto map(long val) -> long_type { return val; }\n  FMT_CONSTEXPR FMT_INLINE auto map(unsigned long val) -> ulong_type {\n    return val;\n  }\n  FMT_CONSTEXPR FMT_INLINE auto map(long long val) -> long long { return val; }\n  FMT_CONSTEXPR FMT_INLINE auto map(unsigned long long val)\n      -> unsigned long long {\n    return val;\n  }\n  FMT_CONSTEXPR FMT_INLINE auto map(int128_t val) -> int128_t { return val; }\n  FMT_CONSTEXPR FMT_INLINE auto map(uint128_t val) -> uint128_t { return val; }\n  FMT_CONSTEXPR FMT_INLINE auto map(bool val) -> bool { return val; }\n\n  template <typename T, FMT_ENABLE_IF(is_char<T>::value)>\n  FMT_CONSTEXPR FMT_INLINE auto map(T val) -> char_type {\n    static_assert(\n        std::is_same<T, char>::value || std::is_same<T, char_type>::value,\n        \"mixing character types is disallowed\");\n    return val;\n  }\n\n  FMT_CONSTEXPR FMT_INLINE auto map(float val) -> float { return val; }\n  FMT_CONSTEXPR FMT_INLINE auto map(double val) -> double { return val; }\n  FMT_CONSTEXPR FMT_INLINE auto map(long double val) -> long double {\n    return val;\n  }\n\n  FMT_CONSTEXPR FMT_INLINE auto map(char_type* val) -> const char_type* {\n    return val;\n  }\n  FMT_CONSTEXPR FMT_INLINE auto map(const char_type* val) -> const char_type* {\n    return val;\n  }\n  template <typename T, FMT_ENABLE_IF(is_string<T>::value)>\n  FMT_CONSTEXPR FMT_INLINE auto map(const T& val)\n      -> basic_string_view<char_type> {\n    static_assert(std::is_same<char_type, char_t<T>>::value,\n                  \"mixing character types is disallowed\");\n    return to_string_view(val);\n  }\n  template <typename T,\n            FMT_ENABLE_IF(\n                std::is_constructible<basic_string_view<char_type>, T>::value &&\n                !is_string<T>::value && !has_formatter<T, Context>::value &&\n                !has_fallback_formatter<T, char_type>::value)>\n  FMT_CONSTEXPR FMT_INLINE auto map(const T& val)\n      -> basic_string_view<char_type> {\n    return basic_string_view<char_type>(val);\n  }\n  template <\n      typename T,\n      FMT_ENABLE_IF(\n          std::is_constructible<std_string_view<char_type>, T>::value &&\n          !std::is_constructible<basic_string_view<char_type>, T>::value &&\n          !is_string<T>::value && !has_formatter<T, Context>::value &&\n          !has_fallback_formatter<T, char_type>::value)>\n  FMT_CONSTEXPR FMT_INLINE auto map(const T& val)\n      -> basic_string_view<char_type> {\n    return std_string_view<char_type>(val);\n  }\n  FMT_CONSTEXPR FMT_INLINE auto map(const signed char* val) -> const char* {\n    static_assert(std::is_same<char_type, char>::value, \"invalid string type\");\n    return reinterpret_cast<const char*>(val);\n  }\n  FMT_CONSTEXPR FMT_INLINE auto map(const unsigned char* val) -> const char* {\n    static_assert(std::is_same<char_type, char>::value, \"invalid string type\");\n    return reinterpret_cast<const char*>(val);\n  }\n  FMT_CONSTEXPR FMT_INLINE auto map(signed char* val) -> const char* {\n    const auto* const_val = val;\n    return map(const_val);\n  }\n  FMT_CONSTEXPR FMT_INLINE auto map(unsigned char* val) -> const char* {\n    const auto* const_val = val;\n    return map(const_val);\n  }\n\n  FMT_CONSTEXPR FMT_INLINE auto map(void* val) -> const void* { return val; }\n  FMT_CONSTEXPR FMT_INLINE auto map(const void* val) -> const void* {\n    return val;\n  }\n  FMT_CONSTEXPR FMT_INLINE auto map(std::nullptr_t val) -> const void* {\n    return val;\n  }\n\n  // We use SFINAE instead of a const T* parameter to avoid conflicting with\n  // the C array overload.\n  template <typename T>\n  FMT_CONSTEXPR auto map(T) -> enable_if_t<std::is_pointer<T>::value, int> {\n    // Formatting of arbitrary pointers is disallowed. If you want to output\n    // a pointer cast it to \"void *\" or \"const void *\". In particular, this\n    // forbids formatting of \"[const] volatile char *\" which is printed as bool\n    // by iostreams.\n    static_assert(!sizeof(T), \"formatting of non-void pointers is disallowed\");\n    return 0;\n  }\n\n  template <typename T, std::size_t N>\n  FMT_CONSTEXPR FMT_INLINE auto map(const T (&values)[N]) -> const T (&)[N] {\n    return values;\n  }\n\n  template <typename T,\n            FMT_ENABLE_IF(std::is_enum<T>::value &&\n                          !has_formatter<T, Context>::value &&\n                          !has_fallback_formatter<T, char_type>::value)>\n  FMT_CONSTEXPR FMT_INLINE auto map(const T& val)\n      -> decltype(std::declval<arg_mapper>().map(\n          static_cast<typename std::underlying_type<T>::type>(val))) {\n    return map(static_cast<typename std::underlying_type<T>::type>(val));\n  }\n  template <typename T,\n            FMT_ENABLE_IF(!is_string<T>::value && !is_char<T>::value &&\n                          (has_formatter<T, Context>::value ||\n                           has_fallback_formatter<T, char_type>::value))>\n  FMT_CONSTEXPR FMT_INLINE auto map(const T& val) -> const T& {\n    return val;\n  }\n\n  template <typename T, FMT_ENABLE_IF(is_named_arg<T>::value)>\n  FMT_CONSTEXPR FMT_INLINE auto map(const T& named_arg)\n      -> decltype(std::declval<arg_mapper>().map(named_arg.value)) {\n    return map(named_arg.value);\n  }\n\n  auto map(...) -> unformattable { return {}; }\n};\n\n// A type constant after applying arg_mapper<Context>.\ntemplate <typename T, typename Context>\nusing mapped_type_constant =\n    type_constant<decltype(arg_mapper<Context>().map(std::declval<const T&>())),\n                  typename Context::char_type>;\n\nenum { packed_arg_bits = 4 };\n// Maximum number of arguments with packed types.\nenum { max_packed_args = 62 / packed_arg_bits };\nenum : unsigned long long { is_unpacked_bit = 1ULL << 63 };\nenum : unsigned long long { has_named_args_bit = 1ULL << 62 };\n\nFMT_END_DETAIL_NAMESPACE\n\n// An output iterator that appends to a buffer.\n// It is used to reduce symbol sizes for the common case.\nclass appender : public std::back_insert_iterator<detail::buffer<char>> {\n  using base = std::back_insert_iterator<detail::buffer<char>>;\n\n  template <typename T>\n  friend auto get_buffer(appender out) -> detail::buffer<char>& {\n    return detail::get_container(out);\n  }\n\n public:\n  using std::back_insert_iterator<detail::buffer<char>>::back_insert_iterator;\n  appender(base it) : base(it) {}\n  using _Unchecked_type = appender;  // Mark iterator as checked.\n\n  auto operator++() -> appender& {\n    base::operator++();\n    return *this;\n  }\n\n  auto operator++(int) -> appender {\n    auto tmp = *this;\n    ++*this;\n    return tmp;\n  }\n};\n\n// A formatting argument. It is a trivially copyable/constructible type to\n// allow storage in basic_memory_buffer.\ntemplate <typename Context> class basic_format_arg {\n private:\n  detail::value<Context> value_;\n  detail::type type_;\n\n  template <typename ContextType, typename T>\n  friend FMT_CONSTEXPR auto detail::make_arg(const T& value)\n      -> basic_format_arg<ContextType>;\n\n  template <typename Visitor, typename Ctx>\n  friend FMT_CONSTEXPR auto visit_format_arg(Visitor&& vis,\n                                             const basic_format_arg<Ctx>& arg)\n      -> decltype(vis(0));\n\n  friend class basic_format_args<Context>;\n  friend class dynamic_format_arg_store<Context>;\n\n  using char_type = typename Context::char_type;\n\n  template <typename T, typename Char, size_t NUM_ARGS, size_t NUM_NAMED_ARGS>\n  friend struct detail::arg_data;\n\n  basic_format_arg(const detail::named_arg_info<char_type>* args, size_t size)\n      : value_(args, size) {}\n\n public:\n  class handle {\n   public:\n    explicit handle(detail::custom_value<Context> custom) : custom_(custom) {}\n\n    void format(typename Context::parse_context_type& parse_ctx,\n                Context& ctx) const {\n      custom_.format(custom_.value, parse_ctx, ctx);\n    }\n\n   private:\n    detail::custom_value<Context> custom_;\n  };\n\n  constexpr basic_format_arg() : type_(detail::type::none_type) {}\n\n  constexpr explicit operator bool() const FMT_NOEXCEPT {\n    return type_ != detail::type::none_type;\n  }\n\n  auto type() const -> detail::type { return type_; }\n\n  auto is_integral() const -> bool { return detail::is_integral_type(type_); }\n  auto is_arithmetic() const -> bool {\n    return detail::is_arithmetic_type(type_);\n  }\n};\n\n/**\n  \\rst\n  Visits an argument dispatching to the appropriate visit method based on\n  the argument type. For example, if the argument type is ``double`` then\n  ``vis(value)`` will be called with the value of type ``double``.\n  \\endrst\n */\ntemplate <typename Visitor, typename Context>\nFMT_CONSTEXPR FMT_INLINE auto visit_format_arg(\n    Visitor&& vis, const basic_format_arg<Context>& arg) -> decltype(vis(0)) {\n  switch (arg.type_) {\n  case detail::type::none_type:\n    break;\n  case detail::type::int_type:\n    return vis(arg.value_.int_value);\n  case detail::type::uint_type:\n    return vis(arg.value_.uint_value);\n  case detail::type::long_long_type:\n    return vis(arg.value_.long_long_value);\n  case detail::type::ulong_long_type:\n    return vis(arg.value_.ulong_long_value);\n  case detail::type::int128_type:\n    return vis(detail::convert_for_visit(arg.value_.int128_value));\n  case detail::type::uint128_type:\n    return vis(detail::convert_for_visit(arg.value_.uint128_value));\n  case detail::type::bool_type:\n    return vis(arg.value_.bool_value);\n  case detail::type::char_type:\n    return vis(arg.value_.char_value);\n  case detail::type::float_type:\n    return vis(arg.value_.float_value);\n  case detail::type::double_type:\n    return vis(arg.value_.double_value);\n  case detail::type::long_double_type:\n    return vis(arg.value_.long_double_value);\n  case detail::type::cstring_type:\n    return vis(arg.value_.string.data);\n  case detail::type::string_type:\n    using sv = basic_string_view<typename Context::char_type>;\n    return vis(sv(arg.value_.string.data, arg.value_.string.size));\n  case detail::type::pointer_type:\n    return vis(arg.value_.pointer);\n  case detail::type::custom_type:\n    return vis(typename basic_format_arg<Context>::handle(arg.value_.custom));\n  }\n  return vis(monostate());\n}\n\nFMT_BEGIN_DETAIL_NAMESPACE\n\ntemplate <typename Char, typename InputIt>\nauto copy_str(InputIt begin, InputIt end, appender out) -> appender {\n  get_container(out).append(begin, end);\n  return out;\n}\n\n#if FMT_GCC_VERSION && FMT_GCC_VERSION < 500\n// A workaround for gcc 4.8 to make void_t work in a SFINAE context.\ntemplate <typename... Ts> struct void_t_impl { using type = void; };\ntemplate <typename... Ts>\nusing void_t = typename detail::void_t_impl<Ts...>::type;\n#else\ntemplate <typename...> using void_t = void;\n#endif\n\ntemplate <typename It, typename T, typename Enable = void>\nstruct is_output_iterator : std::false_type {};\n\ntemplate <typename It, typename T>\nstruct is_output_iterator<\n    It, T,\n    void_t<typename std::iterator_traits<It>::iterator_category,\n           decltype(*std::declval<It>() = std::declval<T>())>>\n    : std::true_type {};\n\ntemplate <typename OutputIt>\nstruct is_back_insert_iterator : std::false_type {};\ntemplate <typename Container>\nstruct is_back_insert_iterator<std::back_insert_iterator<Container>>\n    : std::true_type {};\n\ntemplate <typename OutputIt>\nstruct is_contiguous_back_insert_iterator : std::false_type {};\ntemplate <typename Container>\nstruct is_contiguous_back_insert_iterator<std::back_insert_iterator<Container>>\n    : is_contiguous<Container> {};\ntemplate <>\nstruct is_contiguous_back_insert_iterator<appender> : std::true_type {};\n\n// A type-erased reference to an std::locale to avoid heavy <locale> include.\nclass locale_ref {\n private:\n  const void* locale_;  // A type-erased pointer to std::locale.\n\n public:\n  constexpr locale_ref() : locale_(nullptr) {}\n  template <typename Locale> explicit locale_ref(const Locale& loc);\n\n  explicit operator bool() const FMT_NOEXCEPT { return locale_ != nullptr; }\n\n  template <typename Locale> auto get() const -> Locale;\n};\n\ntemplate <typename> constexpr auto encode_types() -> unsigned long long {\n  return 0;\n}\n\ntemplate <typename Context, typename Arg, typename... Args>\nconstexpr auto encode_types() -> unsigned long long {\n  return static_cast<unsigned>(mapped_type_constant<Arg, Context>::value) |\n         (encode_types<Context, Args...>() << packed_arg_bits);\n}\n\ntemplate <typename Context, typename T>\nFMT_CONSTEXPR auto make_arg(const T& value) -> basic_format_arg<Context> {\n  basic_format_arg<Context> arg;\n  arg.type_ = mapped_type_constant<T, Context>::value;\n  arg.value_ = arg_mapper<Context>().map(value);\n  return arg;\n}\n\n// The type template parameter is there to avoid an ODR violation when using\n// a fallback formatter in one translation unit and an implicit conversion in\n// another (not recommended).\ntemplate <bool IS_PACKED, typename Context, type, typename T,\n          FMT_ENABLE_IF(IS_PACKED)>\nFMT_CONSTEXPR FMT_INLINE auto make_arg(const T& val) -> value<Context> {\n  const auto& arg = arg_mapper<Context>().map(val);\n  static_assert(\n      !std::is_same<decltype(arg), const unformattable&>::value,\n      \"Cannot format an argument. To make type T formattable provide a \"\n      \"formatter<T> specialization: https://fmt.dev/latest/api.html#udt\");\n  return {arg};\n}\n\ntemplate <bool IS_PACKED, typename Context, type, typename T,\n          FMT_ENABLE_IF(!IS_PACKED)>\ninline auto make_arg(const T& value) -> basic_format_arg<Context> {\n  return make_arg<Context>(value);\n}\nFMT_END_DETAIL_NAMESPACE\n\n// Formatting context.\ntemplate <typename OutputIt, typename Char> class basic_format_context {\n public:\n  /** The character type for the output. */\n  using char_type = Char;\n\n private:\n  OutputIt out_;\n  basic_format_args<basic_format_context> args_;\n  detail::locale_ref loc_;\n\n public:\n  using iterator = OutputIt;\n  using format_arg = basic_format_arg<basic_format_context>;\n  using parse_context_type = basic_format_parse_context<Char>;\n  template <typename T> using formatter_type = formatter<T, char_type>;\n\n  basic_format_context(basic_format_context&&) = default;\n  basic_format_context(const basic_format_context&) = delete;\n  void operator=(const basic_format_context&) = delete;\n  /**\n   Constructs a ``basic_format_context`` object. References to the arguments are\n   stored in the object so make sure they have appropriate lifetimes.\n   */\n  constexpr basic_format_context(\n      OutputIt out, basic_format_args<basic_format_context> ctx_args,\n      detail::locale_ref loc = detail::locale_ref())\n      : out_(out), args_(ctx_args), loc_(loc) {}\n\n  constexpr auto arg(int id) const -> format_arg { return args_.get(id); }\n  FMT_CONSTEXPR auto arg(basic_string_view<char_type> name) -> format_arg {\n    return args_.get(name);\n  }\n  FMT_CONSTEXPR auto arg_id(basic_string_view<char_type> name) -> int {\n    return args_.get_id(name);\n  }\n  auto args() const -> const basic_format_args<basic_format_context>& {\n    return args_;\n  }\n\n  FMT_CONSTEXPR auto error_handler() -> detail::error_handler { return {}; }\n  void on_error(const char* message) { error_handler().on_error(message); }\n\n  // Returns an iterator to the beginning of the output range.\n  FMT_CONSTEXPR auto out() -> iterator { return out_; }\n\n  // Advances the begin iterator to ``it``.\n  void advance_to(iterator it) {\n    if (!detail::is_back_insert_iterator<iterator>()) out_ = it;\n  }\n\n  FMT_CONSTEXPR auto locale() -> detail::locale_ref { return loc_; }\n};\n\ntemplate <typename Char>\nusing buffer_context =\n    basic_format_context<detail::buffer_appender<Char>, Char>;\nusing format_context = buffer_context<char>;\n\n// Workaround an alias issue: https://stackoverflow.com/q/62767544/471164.\n#define FMT_BUFFER_CONTEXT(Char) \\\n  basic_format_context<detail::buffer_appender<Char>, Char>\n\ntemplate <typename T, typename Char = char>\nusing is_formattable = bool_constant<\n    !std::is_same<decltype(detail::arg_mapper<buffer_context<Char>>().map(\n                      std::declval<T>())),\n                  detail::unformattable>::value &&\n    !detail::has_fallback_formatter<T, Char>::value>;\n\n/**\n  \\rst\n  An array of references to arguments. It can be implicitly converted into\n  `~fmt::basic_format_args` for passing into type-erased formatting functions\n  such as `~fmt::vformat`.\n  \\endrst\n */\ntemplate <typename Context, typename... Args>\nclass format_arg_store\n#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409\n    // Workaround a GCC template argument substitution bug.\n    : public basic_format_args<Context>\n#endif\n{\n private:\n  static const size_t num_args = sizeof...(Args);\n  static const size_t num_named_args = detail::count_named_args<Args...>();\n  static const bool is_packed = num_args <= detail::max_packed_args;\n\n  using value_type = conditional_t<is_packed, detail::value<Context>,\n                                   basic_format_arg<Context>>;\n\n  detail::arg_data<value_type, typename Context::char_type, num_args,\n                   num_named_args>\n      data_;\n\n  friend class basic_format_args<Context>;\n\n  static constexpr unsigned long long desc =\n      (is_packed ? detail::encode_types<Context, Args...>()\n                 : detail::is_unpacked_bit | num_args) |\n      (num_named_args != 0\n           ? static_cast<unsigned long long>(detail::has_named_args_bit)\n           : 0);\n\n public:\n  FMT_CONSTEXPR FMT_INLINE format_arg_store(const Args&... args)\n      :\n#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409\n        basic_format_args<Context>(*this),\n#endif\n        data_{detail::make_arg<\n            is_packed, Context,\n            detail::mapped_type_constant<Args, Context>::value>(args)...} {\n    detail::init_named_args(data_.named_args(), 0, 0, args...);\n  }\n};\n\n/**\n  \\rst\n  Constructs a `~fmt::format_arg_store` object that contains references to\n  arguments and can be implicitly converted to `~fmt::format_args`. `Context`\n  can be omitted in which case it defaults to `~fmt::context`.\n  See `~fmt::arg` for lifetime considerations.\n  \\endrst\n */\ntemplate <typename Context = format_context, typename... Args>\nconstexpr auto make_format_args(const Args&... args)\n    -> format_arg_store<Context, Args...> {\n  return {args...};\n}\n\n/**\n  \\rst\n  Returns a named argument to be used in a formatting function.\n  It should only be used in a call to a formatting function or\n  `dynamic_format_arg_store::push_back`.\n\n  **Example**::\n\n    fmt::print(\"Elapsed time: {s:.2f} seconds\", fmt::arg(\"s\", 1.23));\n  \\endrst\n */\ntemplate <typename Char, typename T>\ninline auto arg(const Char* name, const T& arg) -> detail::named_arg<Char, T> {\n  static_assert(!detail::is_named_arg<T>(), \"nested named arguments\");\n  return {name, arg};\n}\n\n/**\n  \\rst\n  A view of a collection of formatting arguments. To avoid lifetime issues it\n  should only be used as a parameter type in type-erased functions such as\n  ``vformat``::\n\n    void vlog(string_view format_str, format_args args);  // OK\n    format_args args = make_format_args(42);  // Error: dangling reference\n  \\endrst\n */\ntemplate <typename Context> class basic_format_args {\n public:\n  using size_type = int;\n  using format_arg = basic_format_arg<Context>;\n\n private:\n  // A descriptor that contains information about formatting arguments.\n  // If the number of arguments is less or equal to max_packed_args then\n  // argument types are passed in the descriptor. This reduces binary code size\n  // per formatting function call.\n  unsigned long long desc_;\n  union {\n    // If is_packed() returns true then argument values are stored in values_;\n    // otherwise they are stored in args_. This is done to improve cache\n    // locality and reduce compiled code size since storing larger objects\n    // may require more code (at least on x86-64) even if the same amount of\n    // data is actually copied to stack. It saves ~10% on the bloat test.\n    const detail::value<Context>* values_;\n    const format_arg* args_;\n  };\n\n  constexpr auto is_packed() const -> bool {\n    return (desc_ & detail::is_unpacked_bit) == 0;\n  }\n  auto has_named_args() const -> bool {\n    return (desc_ & detail::has_named_args_bit) != 0;\n  }\n\n  FMT_CONSTEXPR auto type(int index) const -> detail::type {\n    int shift = index * detail::packed_arg_bits;\n    unsigned int mask = (1 << detail::packed_arg_bits) - 1;\n    return static_cast<detail::type>((desc_ >> shift) & mask);\n  }\n\n  constexpr FMT_INLINE basic_format_args(unsigned long long desc,\n                                         const detail::value<Context>* values)\n      : desc_(desc), values_(values) {}\n  constexpr basic_format_args(unsigned long long desc, const format_arg* args)\n      : desc_(desc), args_(args) {}\n\n public:\n  constexpr basic_format_args() : desc_(0), args_(nullptr) {}\n\n  /**\n   \\rst\n   Constructs a `basic_format_args` object from `~fmt::format_arg_store`.\n   \\endrst\n   */\n  template <typename... Args>\n  constexpr FMT_INLINE basic_format_args(\n      const format_arg_store<Context, Args...>& store)\n      : basic_format_args(format_arg_store<Context, Args...>::desc,\n                          store.data_.args()) {}\n\n  /**\n   \\rst\n   Constructs a `basic_format_args` object from\n   `~fmt::dynamic_format_arg_store`.\n   \\endrst\n   */\n  constexpr FMT_INLINE basic_format_args(\n      const dynamic_format_arg_store<Context>& store)\n      : basic_format_args(store.get_types(), store.data()) {}\n\n  /**\n   \\rst\n   Constructs a `basic_format_args` object from a dynamic set of arguments.\n   \\endrst\n   */\n  constexpr basic_format_args(const format_arg* args, int count)\n      : basic_format_args(detail::is_unpacked_bit | detail::to_unsigned(count),\n                          args) {}\n\n  /** Returns the argument with the specified id. */\n  FMT_CONSTEXPR auto get(int id) const -> format_arg {\n    format_arg arg;\n    if (!is_packed()) {\n      if (id < max_size()) arg = args_[id];\n      return arg;\n    }\n    if (id >= detail::max_packed_args) return arg;\n    arg.type_ = type(id);\n    if (arg.type_ == detail::type::none_type) return arg;\n    arg.value_ = values_[id];\n    return arg;\n  }\n\n  template <typename Char>\n  auto get(basic_string_view<Char> name) const -> format_arg {\n    int id = get_id(name);\n    return id >= 0 ? get(id) : format_arg();\n  }\n\n  template <typename Char>\n  auto get_id(basic_string_view<Char> name) const -> int {\n    if (!has_named_args()) return -1;\n    const auto& named_args =\n        (is_packed() ? values_[-1] : args_[-1].value_).named_args;\n    for (size_t i = 0; i < named_args.size; ++i) {\n      if (named_args.data[i].name == name) return named_args.data[i].id;\n    }\n    return -1;\n  }\n\n  auto max_size() const -> int {\n    unsigned long long max_packed = detail::max_packed_args;\n    return static_cast<int>(is_packed() ? max_packed\n                                        : desc_ & ~detail::is_unpacked_bit);\n  }\n};\n\n/** An alias to ``basic_format_args<format_context>``. */\n// A separate type would result in shorter symbols but break ABI compatibility\n// between clang and gcc on ARM (#1919).\nusing format_args = basic_format_args<format_context>;\n\n// We cannot use enum classes as bit fields because of a gcc bug\n// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61414.\nnamespace align {\nenum type { none, left, right, center, numeric };\n}\nusing align_t = align::type;\nnamespace sign {\nenum type { none, minus, plus, space };\n}\nusing sign_t = sign::type;\n\nFMT_BEGIN_DETAIL_NAMESPACE\n\nvoid throw_format_error(const char* message);\n\n// Workaround an array initialization issue in gcc 4.8.\ntemplate <typename Char> struct fill_t {\n private:\n  enum { max_size = 4 };\n  Char data_[max_size] = {Char(' '), Char(0), Char(0), Char(0)};\n  unsigned char size_ = 1;\n\n public:\n  FMT_CONSTEXPR void operator=(basic_string_view<Char> s) {\n    auto size = s.size();\n    if (size > max_size) return throw_format_error(\"invalid fill\");\n    for (size_t i = 0; i < size; ++i) data_[i] = s[i];\n    size_ = static_cast<unsigned char>(size);\n  }\n\n  constexpr auto size() const -> size_t { return size_; }\n  constexpr auto data() const -> const Char* { return data_; }\n\n  FMT_CONSTEXPR auto operator[](size_t index) -> Char& { return data_[index]; }\n  FMT_CONSTEXPR auto operator[](size_t index) const -> const Char& {\n    return data_[index];\n  }\n};\nFMT_END_DETAIL_NAMESPACE\n\n// Format specifiers for built-in and string types.\ntemplate <typename Char> struct basic_format_specs {\n  int width;\n  int precision;\n  char type;\n  align_t align : 4;\n  sign_t sign : 3;\n  bool alt : 1;  // Alternate form ('#').\n  bool localized : 1;\n  detail::fill_t<Char> fill;\n\n  constexpr basic_format_specs()\n      : width(0),\n        precision(-1),\n        type(0),\n        align(align::none),\n        sign(sign::none),\n        alt(false),\n        localized(false) {}\n};\n\nusing format_specs = basic_format_specs<char>;\n\nFMT_BEGIN_DETAIL_NAMESPACE\n\nenum class arg_id_kind { none, index, name };\n\n// An argument reference.\ntemplate <typename Char> struct arg_ref {\n  FMT_CONSTEXPR arg_ref() : kind(arg_id_kind::none), val() {}\n\n  FMT_CONSTEXPR explicit arg_ref(int index)\n      : kind(arg_id_kind::index), val(index) {}\n  FMT_CONSTEXPR explicit arg_ref(basic_string_view<Char> name)\n      : kind(arg_id_kind::name), val(name) {}\n\n  FMT_CONSTEXPR auto operator=(int idx) -> arg_ref& {\n    kind = arg_id_kind::index;\n    val.index = idx;\n    return *this;\n  }\n\n  arg_id_kind kind;\n  union value {\n    FMT_CONSTEXPR value(int id = 0) : index{id} {}\n    FMT_CONSTEXPR value(basic_string_view<Char> n) : name(n) {}\n\n    int index;\n    basic_string_view<Char> name;\n  } val;\n};\n\n// Format specifiers with width and precision resolved at formatting rather\n// than parsing time to allow re-using the same parsed specifiers with\n// different sets of arguments (precompilation of format strings).\ntemplate <typename Char>\nstruct dynamic_format_specs : basic_format_specs<Char> {\n  arg_ref<Char> width_ref;\n  arg_ref<Char> precision_ref;\n};\n\nstruct auto_id {};\n\n// A format specifier handler that sets fields in basic_format_specs.\ntemplate <typename Char> class specs_setter {\n protected:\n  basic_format_specs<Char>& specs_;\n\n public:\n  explicit FMT_CONSTEXPR specs_setter(basic_format_specs<Char>& specs)\n      : specs_(specs) {}\n\n  FMT_CONSTEXPR specs_setter(const specs_setter& other)\n      : specs_(other.specs_) {}\n\n  FMT_CONSTEXPR void on_align(align_t align) { specs_.align = align; }\n  FMT_CONSTEXPR void on_fill(basic_string_view<Char> fill) {\n    specs_.fill = fill;\n  }\n  FMT_CONSTEXPR void on_sign(sign_t s) { specs_.sign = s; }\n  FMT_CONSTEXPR void on_hash() { specs_.alt = true; }\n  FMT_CONSTEXPR void on_localized() { specs_.localized = true; }\n\n  FMT_CONSTEXPR void on_zero() {\n    if (specs_.align == align::none) specs_.align = align::numeric;\n    specs_.fill[0] = Char('0');\n  }\n\n  FMT_CONSTEXPR void on_width(int width) { specs_.width = width; }\n  FMT_CONSTEXPR void on_precision(int precision) {\n    specs_.precision = precision;\n  }\n  FMT_CONSTEXPR void end_precision() {}\n\n  FMT_CONSTEXPR void on_type(Char type) {\n    specs_.type = static_cast<char>(type);\n  }\n};\n\n// Format spec handler that saves references to arguments representing dynamic\n// width and precision to be resolved at formatting time.\ntemplate <typename ParseContext>\nclass dynamic_specs_handler\n    : public specs_setter<typename ParseContext::char_type> {\n public:\n  using char_type = typename ParseContext::char_type;\n\n  FMT_CONSTEXPR dynamic_specs_handler(dynamic_format_specs<char_type>& specs,\n                                      ParseContext& ctx)\n      : specs_setter<char_type>(specs), specs_(specs), context_(ctx) {}\n\n  FMT_CONSTEXPR dynamic_specs_handler(const dynamic_specs_handler& other)\n      : specs_setter<char_type>(other),\n        specs_(other.specs_),\n        context_(other.context_) {}\n\n  template <typename Id> FMT_CONSTEXPR void on_dynamic_width(Id arg_id) {\n    specs_.width_ref = make_arg_ref(arg_id);\n  }\n\n  template <typename Id> FMT_CONSTEXPR void on_dynamic_precision(Id arg_id) {\n    specs_.precision_ref = make_arg_ref(arg_id);\n  }\n\n  FMT_CONSTEXPR void on_error(const char* message) {\n    context_.on_error(message);\n  }\n\n private:\n  dynamic_format_specs<char_type>& specs_;\n  ParseContext& context_;\n\n  using arg_ref_type = arg_ref<char_type>;\n\n  FMT_CONSTEXPR auto make_arg_ref(int arg_id) -> arg_ref_type {\n    context_.check_arg_id(arg_id);\n    return arg_ref_type(arg_id);\n  }\n\n  FMT_CONSTEXPR auto make_arg_ref(auto_id) -> arg_ref_type {\n    return arg_ref_type(context_.next_arg_id());\n  }\n\n  FMT_CONSTEXPR auto make_arg_ref(basic_string_view<char_type> arg_id)\n      -> arg_ref_type {\n    context_.check_arg_id(arg_id);\n    basic_string_view<char_type> format_str(\n        context_.begin(), to_unsigned(context_.end() - context_.begin()));\n    return arg_ref_type(arg_id);\n  }\n};\n\ntemplate <typename Char> constexpr bool is_ascii_letter(Char c) {\n  return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');\n}\n\n// Converts a character to ASCII. Returns a number > 127 on conversion failure.\ntemplate <typename Char, FMT_ENABLE_IF(std::is_integral<Char>::value)>\nconstexpr auto to_ascii(Char value) -> Char {\n  return value;\n}\ntemplate <typename Char, FMT_ENABLE_IF(std::is_enum<Char>::value)>\nconstexpr auto to_ascii(Char value) ->\n    typename std::underlying_type<Char>::type {\n  return value;\n}\n\ntemplate <typename Char>\nFMT_CONSTEXPR auto code_point_length(const Char* begin) -> int {\n  if (const_check(sizeof(Char) != 1)) return 1;\n  constexpr char lengths[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n                              0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 3, 3, 4, 0};\n  int len = lengths[static_cast<unsigned char>(*begin) >> 3];\n\n  // Compute the pointer to the next character early so that the next\n  // iteration can start working on the next character. Neither Clang\n  // nor GCC figure out this reordering on their own.\n  return len + !len;\n}\n\n// Return the result via the out param to workaround gcc bug 77539.\ntemplate <bool IS_CONSTEXPR, typename T, typename Ptr = const T*>\nFMT_CONSTEXPR auto find(Ptr first, Ptr last, T value, Ptr& out) -> bool {\n  for (out = first; out != last; ++out) {\n    if (*out == value) return true;\n  }\n  return false;\n}\n\ntemplate <>\ninline auto find<false, char>(const char* first, const char* last, char value,\n                              const char*& out) -> bool {\n  out = static_cast<const char*>(\n      std::memchr(first, value, to_unsigned(last - first)));\n  return out != nullptr;\n}\n\n// Parses the range [begin, end) as an unsigned integer. This function assumes\n// that the range is non-empty and the first character is a digit.\ntemplate <typename Char>\nFMT_CONSTEXPR auto parse_nonnegative_int(const Char*& begin, const Char* end,\n                                         int error_value) noexcept -> int {\n  FMT_ASSERT(begin != end && '0' <= *begin && *begin <= '9', \"\");\n  unsigned value = 0, prev = 0;\n  auto p = begin;\n  do {\n    prev = value;\n    value = value * 10 + unsigned(*p - '0');\n    ++p;\n  } while (p != end && '0' <= *p && *p <= '9');\n  auto num_digits = p - begin;\n  begin = p;\n  if (num_digits <= std::numeric_limits<int>::digits10)\n    return static_cast<int>(value);\n  // Check for overflow.\n  const unsigned max = to_unsigned((std::numeric_limits<int>::max)());\n  return num_digits == std::numeric_limits<int>::digits10 + 1 &&\n                 prev * 10ull + unsigned(p[-1] - '0') <= max\n             ? static_cast<int>(value)\n             : error_value;\n}\n\n// Parses fill and alignment.\ntemplate <typename Char, typename Handler>\nFMT_CONSTEXPR auto parse_align(const Char* begin, const Char* end,\n                               Handler&& handler) -> const Char* {\n  FMT_ASSERT(begin != end, \"\");\n  auto align = align::none;\n  auto p = begin + code_point_length(begin);\n  if (p >= end) p = begin;\n  for (;;) {\n    switch (to_ascii(*p)) {\n    case '<':\n      align = align::left;\n      break;\n    case '>':\n      align = align::right;\n      break;\n    case '^':\n      align = align::center;\n      break;\n    default:\n      break;\n    }\n    if (align != align::none) {\n      if (p != begin) {\n        auto c = *begin;\n        if (c == '{')\n          return handler.on_error(\"invalid fill character '{'\"), begin;\n        handler.on_fill(basic_string_view<Char>(begin, to_unsigned(p - begin)));\n        begin = p + 1;\n      } else\n        ++begin;\n      handler.on_align(align);\n      break;\n    } else if (p == begin) {\n      break;\n    }\n    p = begin;\n  }\n  return begin;\n}\n\ntemplate <typename Char> FMT_CONSTEXPR bool is_name_start(Char c) {\n  return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || '_' == c;\n}\n\ntemplate <typename Char, typename IDHandler>\nFMT_CONSTEXPR auto do_parse_arg_id(const Char* begin, const Char* end,\n                                   IDHandler&& handler) -> const Char* {\n  FMT_ASSERT(begin != end, \"\");\n  Char c = *begin;\n  if (c >= '0' && c <= '9') {\n    int index = 0;\n    if (c != '0')\n      index =\n          parse_nonnegative_int(begin, end, (std::numeric_limits<int>::max)());\n    else\n      ++begin;\n    if (begin == end || (*begin != '}' && *begin != ':'))\n      handler.on_error(\"invalid format string\");\n    else\n      handler(index);\n    return begin;\n  }\n  if (!is_name_start(c)) {\n    handler.on_error(\"invalid format string\");\n    return begin;\n  }\n  auto it = begin;\n  do {\n    ++it;\n  } while (it != end && (is_name_start(c = *it) || ('0' <= c && c <= '9')));\n  handler(basic_string_view<Char>(begin, to_unsigned(it - begin)));\n  return it;\n}\n\ntemplate <typename Char, typename IDHandler>\nFMT_CONSTEXPR FMT_INLINE auto parse_arg_id(const Char* begin, const Char* end,\n                                           IDHandler&& handler) -> const Char* {\n  Char c = *begin;\n  if (c != '}' && c != ':') return do_parse_arg_id(begin, end, handler);\n  handler();\n  return begin;\n}\n\ntemplate <typename Char, typename Handler>\nFMT_CONSTEXPR auto parse_width(const Char* begin, const Char* end,\n                               Handler&& handler) -> const Char* {\n  using detail::auto_id;\n  struct width_adapter {\n    Handler& handler;\n\n    FMT_CONSTEXPR void operator()() { handler.on_dynamic_width(auto_id()); }\n    FMT_CONSTEXPR void operator()(int id) { handler.on_dynamic_width(id); }\n    FMT_CONSTEXPR void operator()(basic_string_view<Char> id) {\n      handler.on_dynamic_width(id);\n    }\n    FMT_CONSTEXPR void on_error(const char* message) {\n      if (message) handler.on_error(message);\n    }\n  };\n\n  FMT_ASSERT(begin != end, \"\");\n  if ('0' <= *begin && *begin <= '9') {\n    int width = parse_nonnegative_int(begin, end, -1);\n    if (width != -1)\n      handler.on_width(width);\n    else\n      handler.on_error(\"number is too big\");\n  } else if (*begin == '{') {\n    ++begin;\n    if (begin != end) begin = parse_arg_id(begin, end, width_adapter{handler});\n    if (begin == end || *begin != '}')\n      return handler.on_error(\"invalid format string\"), begin;\n    ++begin;\n  }\n  return begin;\n}\n\ntemplate <typename Char, typename Handler>\nFMT_CONSTEXPR auto parse_precision(const Char* begin, const Char* end,\n                                   Handler&& handler) -> const Char* {\n  using detail::auto_id;\n  struct precision_adapter {\n    Handler& handler;\n\n    FMT_CONSTEXPR void operator()() { handler.on_dynamic_precision(auto_id()); }\n    FMT_CONSTEXPR void operator()(int id) { handler.on_dynamic_precision(id); }\n    FMT_CONSTEXPR void operator()(basic_string_view<Char> id) {\n      handler.on_dynamic_precision(id);\n    }\n    FMT_CONSTEXPR void on_error(const char* message) {\n      if (message) handler.on_error(message);\n    }\n  };\n\n  ++begin;\n  auto c = begin != end ? *begin : Char();\n  if ('0' <= c && c <= '9') {\n    auto precision = parse_nonnegative_int(begin, end, -1);\n    if (precision != -1)\n      handler.on_precision(precision);\n    else\n      handler.on_error(\"number is too big\");\n  } else if (c == '{') {\n    ++begin;\n    if (begin != end)\n      begin = parse_arg_id(begin, end, precision_adapter{handler});\n    if (begin == end || *begin++ != '}')\n      return handler.on_error(\"invalid format string\"), begin;\n  } else {\n    return handler.on_error(\"missing precision specifier\"), begin;\n  }\n  handler.end_precision();\n  return begin;\n}\n\n// Parses standard format specifiers and sends notifications about parsed\n// components to handler.\ntemplate <typename Char, typename SpecHandler>\nFMT_CONSTEXPR FMT_INLINE auto parse_format_specs(const Char* begin,\n                                                 const Char* end,\n                                                 SpecHandler&& handler)\n    -> const Char* {\n  if (begin + 1 < end && begin[1] == '}' && is_ascii_letter(*begin) &&\n      *begin != 'L') {\n    handler.on_type(*begin++);\n    return begin;\n  }\n\n  if (begin == end) return begin;\n\n  begin = parse_align(begin, end, handler);\n  if (begin == end) return begin;\n\n  // Parse sign.\n  switch (to_ascii(*begin)) {\n  case '+':\n    handler.on_sign(sign::plus);\n    ++begin;\n    break;\n  case '-':\n    handler.on_sign(sign::minus);\n    ++begin;\n    break;\n  case ' ':\n    handler.on_sign(sign::space);\n    ++begin;\n    break;\n  default:\n    break;\n  }\n  if (begin == end) return begin;\n\n  if (*begin == '#') {\n    handler.on_hash();\n    if (++begin == end) return begin;\n  }\n\n  // Parse zero flag.\n  if (*begin == '0') {\n    handler.on_zero();\n    if (++begin == end) return begin;\n  }\n\n  begin = parse_width(begin, end, handler);\n  if (begin == end) return begin;\n\n  // Parse precision.\n  if (*begin == '.') {\n    begin = parse_precision(begin, end, handler);\n    if (begin == end) return begin;\n  }\n\n  if (*begin == 'L') {\n    handler.on_localized();\n    ++begin;\n  }\n\n  // Parse type.\n  if (begin != end && *begin != '}') handler.on_type(*begin++);\n  return begin;\n}\n\ntemplate <typename Char, typename Handler>\nFMT_CONSTEXPR auto parse_replacement_field(const Char* begin, const Char* end,\n                                           Handler&& handler) -> const Char* {\n  struct id_adapter {\n    Handler& handler;\n    int arg_id;\n\n    FMT_CONSTEXPR void operator()() { arg_id = handler.on_arg_id(); }\n    FMT_CONSTEXPR void operator()(int id) { arg_id = handler.on_arg_id(id); }\n    FMT_CONSTEXPR void operator()(basic_string_view<Char> id) {\n      arg_id = handler.on_arg_id(id);\n    }\n    FMT_CONSTEXPR void on_error(const char* message) {\n      if (message) handler.on_error(message);\n    }\n  };\n\n  ++begin;\n  if (begin == end) return handler.on_error(\"invalid format string\"), end;\n  if (*begin == '}') {\n    handler.on_replacement_field(handler.on_arg_id(), begin);\n  } else if (*begin == '{') {\n    handler.on_text(begin, begin + 1);\n  } else {\n    auto adapter = id_adapter{handler, 0};\n    begin = parse_arg_id(begin, end, adapter);\n    Char c = begin != end ? *begin : Char();\n    if (c == '}') {\n      handler.on_replacement_field(adapter.arg_id, begin);\n    } else if (c == ':') {\n      begin = handler.on_format_specs(adapter.arg_id, begin + 1, end);\n      if (begin == end || *begin != '}')\n        return handler.on_error(\"unknown format specifier\"), end;\n    } else {\n      return handler.on_error(\"missing '}' in format string\"), end;\n    }\n  }\n  return begin + 1;\n}\n\ntemplate <bool IS_CONSTEXPR, typename Char, typename Handler>\nFMT_CONSTEXPR FMT_INLINE void parse_format_string(\n    basic_string_view<Char> format_str, Handler&& handler) {\n  // this is most likely a name-lookup defect in msvc's modules implementation\n  using detail::find;\n\n  auto begin = format_str.data();\n  auto end = begin + format_str.size();\n  if (end - begin < 32) {\n    // Use a simple loop instead of memchr for small strings.\n    const Char* p = begin;\n    while (p != end) {\n      auto c = *p++;\n      if (c == '{') {\n        handler.on_text(begin, p - 1);\n        begin = p = parse_replacement_field(p - 1, end, handler);\n      } else if (c == '}') {\n        if (p == end || *p != '}')\n          return handler.on_error(\"unmatched '}' in format string\");\n        handler.on_text(begin, p);\n        begin = ++p;\n      }\n    }\n    handler.on_text(begin, end);\n    return;\n  }\n  struct writer {\n    FMT_CONSTEXPR void operator()(const Char* pbegin, const Char* pend) {\n      if (pbegin == pend) return;\n      for (;;) {\n        const Char* p = nullptr;\n        if (!find<IS_CONSTEXPR>(pbegin, pend, Char('}'), p))\n          return handler_.on_text(pbegin, pend);\n        ++p;\n        if (p == pend || *p != '}')\n          return handler_.on_error(\"unmatched '}' in format string\");\n        handler_.on_text(pbegin, p);\n        pbegin = p + 1;\n      }\n    }\n    Handler& handler_;\n  } write{handler};\n  while (begin != end) {\n    // Doing two passes with memchr (one for '{' and another for '}') is up to\n    // 2.5x faster than the naive one-pass implementation on big format strings.\n    const Char* p = begin;\n    if (*begin != '{' && !find<IS_CONSTEXPR>(begin + 1, end, Char('{'), p))\n      return write(begin, end);\n    write(begin, p);\n    begin = parse_replacement_field(p, end, handler);\n  }\n}\n\ntemplate <typename T, typename ParseContext>\nFMT_CONSTEXPR auto parse_format_specs(ParseContext& ctx)\n    -> decltype(ctx.begin()) {\n  using char_type = typename ParseContext::char_type;\n  using context = buffer_context<char_type>;\n  using mapped_type = conditional_t<\n      mapped_type_constant<T, context>::value != type::custom_type,\n      decltype(arg_mapper<context>().map(std::declval<const T&>())), T>;\n  auto f = conditional_t<has_formatter<mapped_type, context>::value,\n                         formatter<mapped_type, char_type>,\n                         fallback_formatter<T, char_type>>();\n  return f.parse(ctx);\n}\n\n// A parse context with extra argument id checks. It is only used at compile\n// time because adding checks at runtime would introduce substantial overhead\n// and would be redundant since argument ids are checked when arguments are\n// retrieved anyway.\ntemplate <typename Char, typename ErrorHandler = error_handler>\nclass compile_parse_context\n    : public basic_format_parse_context<Char, ErrorHandler> {\n private:\n  int num_args_;\n  using base = basic_format_parse_context<Char, ErrorHandler>;\n\n public:\n  explicit FMT_CONSTEXPR compile_parse_context(\n      basic_string_view<Char> format_str,\n      int num_args = (std::numeric_limits<int>::max)(), ErrorHandler eh = {})\n      : base(format_str, eh), num_args_(num_args) {}\n\n  FMT_CONSTEXPR auto next_arg_id() -> int {\n    int id = base::next_arg_id();\n    if (id >= num_args_) this->on_error(\"argument not found\");\n    return id;\n  }\n\n  FMT_CONSTEXPR void check_arg_id(int id) {\n    base::check_arg_id(id);\n    if (id >= num_args_) this->on_error(\"argument not found\");\n  }\n  using base::check_arg_id;\n};\n\ntemplate <typename ErrorHandler>\nFMT_CONSTEXPR void check_int_type_spec(char spec, ErrorHandler&& eh) {\n  switch (spec) {\n  case 0:\n  case 'd':\n  case 'x':\n  case 'X':\n  case 'b':\n  case 'B':\n  case 'o':\n  case 'c':\n    break;\n  default:\n    eh.on_error(\"invalid type specifier\");\n    break;\n  }\n}\n\n// Checks char specs and returns true if the type spec is char (and not int).\ntemplate <typename Char, typename ErrorHandler = error_handler>\nFMT_CONSTEXPR auto check_char_specs(const basic_format_specs<Char>& specs,\n                                    ErrorHandler&& eh = {}) -> bool {\n  if (specs.type && specs.type != 'c') {\n    check_int_type_spec(specs.type, eh);\n    return false;\n  }\n  if (specs.align == align::numeric || specs.sign != sign::none || specs.alt)\n    eh.on_error(\"invalid format specifier for char\");\n  return true;\n}\n\n// A floating-point presentation format.\nenum class float_format : unsigned char {\n  general,  // General: exponent notation or fixed point based on magnitude.\n  exp,      // Exponent notation with the default precision of 6, e.g. 1.2e-3.\n  fixed,    // Fixed point with the default precision of 6, e.g. 0.0012.\n  hex\n};\n\nstruct float_specs {\n  int precision;\n  float_format format : 8;\n  sign_t sign : 8;\n  bool upper : 1;\n  bool locale : 1;\n  bool binary32 : 1;\n  bool use_grisu : 1;\n  bool showpoint : 1;\n};\n\ntemplate <typename ErrorHandler = error_handler, typename Char>\nFMT_CONSTEXPR auto parse_float_type_spec(const basic_format_specs<Char>& specs,\n                                         ErrorHandler&& eh = {})\n    -> float_specs {\n  auto result = float_specs();\n  result.showpoint = specs.alt;\n  result.locale = specs.localized;\n  switch (specs.type) {\n  case 0:\n    result.format = float_format::general;\n    break;\n  case 'G':\n    result.upper = true;\n    FMT_FALLTHROUGH;\n  case 'g':\n    result.format = float_format::general;\n    break;\n  case 'E':\n    result.upper = true;\n    FMT_FALLTHROUGH;\n  case 'e':\n    result.format = float_format::exp;\n    result.showpoint |= specs.precision != 0;\n    break;\n  case 'F':\n    result.upper = true;\n    FMT_FALLTHROUGH;\n  case 'f':\n    result.format = float_format::fixed;\n    result.showpoint |= specs.precision != 0;\n    break;\n  case 'A':\n    result.upper = true;\n    FMT_FALLTHROUGH;\n  case 'a':\n    result.format = float_format::hex;\n    break;\n  default:\n    eh.on_error(\"invalid type specifier\");\n    break;\n  }\n  return result;\n}\n\ntemplate <typename Char, typename ErrorHandler = error_handler>\nFMT_CONSTEXPR auto check_cstring_type_spec(Char spec, ErrorHandler&& eh = {})\n    -> bool {\n  if (spec == 0 || spec == 's') return true;\n  if (spec != 'p') eh.on_error(\"invalid type specifier\");\n  return false;\n}\n\ntemplate <typename Char, typename ErrorHandler = error_handler>\nFMT_CONSTEXPR void check_string_type_spec(Char spec, ErrorHandler&& eh = {}) {\n  if (spec != 0 && spec != 's') eh.on_error(\"invalid type specifier\");\n}\n\ntemplate <typename Char, typename ErrorHandler>\nFMT_CONSTEXPR void check_pointer_type_spec(Char spec, ErrorHandler&& eh) {\n  if (spec != 0 && spec != 'p') eh.on_error(\"invalid type specifier\");\n}\n\n// A parse_format_specs handler that checks if specifiers are consistent with\n// the argument type.\ntemplate <typename Handler> class specs_checker : public Handler {\n private:\n  detail::type arg_type_;\n\n  FMT_CONSTEXPR void require_numeric_argument() {\n    if (!is_arithmetic_type(arg_type_))\n      this->on_error(\"format specifier requires numeric argument\");\n  }\n\n public:\n  FMT_CONSTEXPR specs_checker(const Handler& handler, detail::type arg_type)\n      : Handler(handler), arg_type_(arg_type) {}\n\n  FMT_CONSTEXPR void on_align(align_t align) {\n    if (align == align::numeric) require_numeric_argument();\n    Handler::on_align(align);\n  }\n\n  FMT_CONSTEXPR void on_sign(sign_t s) {\n    require_numeric_argument();\n    if (is_integral_type(arg_type_) && arg_type_ != type::int_type &&\n        arg_type_ != type::long_long_type && arg_type_ != type::char_type) {\n      this->on_error(\"format specifier requires signed argument\");\n    }\n    Handler::on_sign(s);\n  }\n\n  FMT_CONSTEXPR void on_hash() {\n    require_numeric_argument();\n    Handler::on_hash();\n  }\n\n  FMT_CONSTEXPR void on_localized() {\n    require_numeric_argument();\n    Handler::on_localized();\n  }\n\n  FMT_CONSTEXPR void on_zero() {\n    require_numeric_argument();\n    Handler::on_zero();\n  }\n\n  FMT_CONSTEXPR void end_precision() {\n    if (is_integral_type(arg_type_) || arg_type_ == type::pointer_type)\n      this->on_error(\"precision not allowed for this argument type\");\n  }\n};\n\nconstexpr int invalid_arg_index = -1;\n\n#if FMT_USE_NONTYPE_TEMPLATE_PARAMETERS\ntemplate <int N, typename T, typename... Args, typename Char>\nconstexpr auto get_arg_index_by_name(basic_string_view<Char> name) -> int {\n  if constexpr (detail::is_statically_named_arg<T>()) {\n    if (name == T::name) return N;\n  }\n  if constexpr (sizeof...(Args) > 0) {\n    return get_arg_index_by_name<N + 1, Args...>(name);\n  } else {\n    (void)name;  // Workaround an MSVC bug about \"unused\" parameter.\n    return invalid_arg_index;\n  }\n}\n#endif\n\ntemplate <typename... Args, typename Char>\nFMT_CONSTEXPR auto get_arg_index_by_name(basic_string_view<Char> name) -> int {\n#if FMT_USE_NONTYPE_TEMPLATE_PARAMETERS\n  if constexpr (sizeof...(Args) > 0) {\n    return get_arg_index_by_name<0, Args...>(name);\n  } else {\n    (void)name;\n    return invalid_arg_index;\n  }\n#else\n  (void)name;\n  return invalid_arg_index;\n#endif\n}\n\ntemplate <typename Char, typename ErrorHandler, typename... Args>\nclass format_string_checker {\n private:\n  using parse_context_type = compile_parse_context<Char, ErrorHandler>;\n  enum { num_args = sizeof...(Args) };\n\n  // Format specifier parsing function.\n  using parse_func = const Char* (*)(parse_context_type&);\n\n  parse_context_type context_;\n  parse_func parse_funcs_[num_args > 0 ? num_args : 1];\n\n public:\n  explicit FMT_CONSTEXPR format_string_checker(\n      basic_string_view<Char> format_str, ErrorHandler eh)\n      : context_(format_str, num_args, eh),\n        parse_funcs_{&parse_format_specs<Args, parse_context_type>...} {}\n\n  FMT_CONSTEXPR void on_text(const Char*, const Char*) {}\n\n  FMT_CONSTEXPR auto on_arg_id() -> int { return context_.next_arg_id(); }\n  FMT_CONSTEXPR auto on_arg_id(int id) -> int {\n    return context_.check_arg_id(id), id;\n  }\n  FMT_CONSTEXPR auto on_arg_id(basic_string_view<Char> id) -> int {\n#if FMT_USE_NONTYPE_TEMPLATE_PARAMETERS\n    auto index = get_arg_index_by_name<Args...>(id);\n    if (index == invalid_arg_index) on_error(\"named argument is not found\");\n    return context_.check_arg_id(index), index;\n#else\n    (void)id;\n    on_error(\"compile-time checks for named arguments require C++20 support\");\n    return 0;\n#endif\n  }\n\n  FMT_CONSTEXPR void on_replacement_field(int, const Char*) {}\n\n  FMT_CONSTEXPR auto on_format_specs(int id, const Char* begin, const Char*)\n      -> const Char* {\n    context_.advance_to(context_.begin() + (begin - &*context_.begin()));\n    // id >= 0 check is a workaround for gcc 10 bug (#2065).\n    return id >= 0 && id < num_args ? parse_funcs_[id](context_) : begin;\n  }\n\n  FMT_CONSTEXPR void on_error(const char* message) {\n    context_.on_error(message);\n  }\n};\n\ntemplate <typename... Args, typename S,\n          enable_if_t<(is_compile_string<S>::value), int>>\nvoid check_format_string(S format_str) {\n  FMT_CONSTEXPR auto s = to_string_view(format_str);\n  using checker = format_string_checker<typename S::char_type, error_handler,\n                                        remove_cvref_t<Args>...>;\n  FMT_CONSTEXPR bool invalid_format =\n      (parse_format_string<true>(s, checker(s, {})), true);\n  ignore_unused(invalid_format);\n}\n\ntemplate <typename Char>\nvoid vformat_to(\n    buffer<Char>& buf, basic_string_view<Char> fmt,\n    basic_format_args<FMT_BUFFER_CONTEXT(type_identity_t<Char>)> args,\n    locale_ref loc = {});\n\nFMT_API void vprint_mojibake(std::FILE*, string_view, format_args);\n#ifndef _WIN32\ninline void vprint_mojibake(std::FILE*, string_view, format_args) {}\n#endif\nFMT_END_DETAIL_NAMESPACE\n\n// A formatter specialization for the core types corresponding to detail::type\n// constants.\ntemplate <typename T, typename Char>\nstruct formatter<T, Char,\n                 enable_if_t<detail::type_constant<T, Char>::value !=\n                             detail::type::custom_type>> {\n private:\n  detail::dynamic_format_specs<Char> specs_;\n\n public:\n  // Parses format specifiers stopping either at the end of the range or at the\n  // terminating '}'.\n  template <typename ParseContext>\n  FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {\n    auto begin = ctx.begin(), end = ctx.end();\n    if (begin == end) return begin;\n    using handler_type = detail::dynamic_specs_handler<ParseContext>;\n    auto type = detail::type_constant<T, Char>::value;\n    auto checker =\n        detail::specs_checker<handler_type>(handler_type(specs_, ctx), type);\n    auto it = detail::parse_format_specs(begin, end, checker);\n    auto eh = ctx.error_handler();\n    switch (type) {\n    case detail::type::none_type:\n      FMT_ASSERT(false, \"invalid argument type\");\n      break;\n    case detail::type::bool_type:\n      if (!specs_.type || specs_.type == 's') break;\n      FMT_FALLTHROUGH;\n    case detail::type::int_type:\n    case detail::type::uint_type:\n    case detail::type::long_long_type:\n    case detail::type::ulong_long_type:\n    case detail::type::int128_type:\n    case detail::type::uint128_type:\n      detail::check_int_type_spec(specs_.type, eh);\n      break;\n    case detail::type::char_type:\n      detail::check_char_specs(specs_, eh);\n      break;\n    case detail::type::float_type:\n      if (detail::const_check(FMT_USE_FLOAT))\n        detail::parse_float_type_spec(specs_, eh);\n      else\n        FMT_ASSERT(false, \"float support disabled\");\n      break;\n    case detail::type::double_type:\n      if (detail::const_check(FMT_USE_DOUBLE))\n        detail::parse_float_type_spec(specs_, eh);\n      else\n        FMT_ASSERT(false, \"double support disabled\");\n      break;\n    case detail::type::long_double_type:\n      if (detail::const_check(FMT_USE_LONG_DOUBLE))\n        detail::parse_float_type_spec(specs_, eh);\n      else\n        FMT_ASSERT(false, \"long double support disabled\");\n      break;\n    case detail::type::cstring_type:\n      detail::check_cstring_type_spec(specs_.type, eh);\n      break;\n    case detail::type::string_type:\n      detail::check_string_type_spec(specs_.type, eh);\n      break;\n    case detail::type::pointer_type:\n      detail::check_pointer_type_spec(specs_.type, eh);\n      break;\n    case detail::type::custom_type:\n      // Custom format specifiers are checked in parse functions of\n      // formatter specializations.\n      break;\n    }\n    return it;\n  }\n\n  template <typename FormatContext>\n  FMT_CONSTEXPR auto format(const T& val, FormatContext& ctx) const\n      -> decltype(ctx.out());\n};\n\ntemplate <typename Char> struct basic_runtime { basic_string_view<Char> str; };\n\ntemplate <typename Char, typename... Args> class basic_format_string {\n private:\n  basic_string_view<Char> str_;\n\n public:\n  template <typename S,\n            FMT_ENABLE_IF(\n                std::is_convertible<const S&, basic_string_view<Char>>::value)>\n  FMT_CONSTEVAL basic_format_string(const S& s) : str_(s) {\n    static_assert(\n        detail::count<\n            (std::is_base_of<detail::view, remove_reference_t<Args>>::value &&\n             std::is_reference<Args>::value)...>() == 0,\n        \"passing views as lvalues is disallowed\");\n#ifdef FMT_HAS_CONSTEVAL\n    if constexpr (detail::count_named_args<Args...>() == 0) {\n      using checker = detail::format_string_checker<Char, detail::error_handler,\n                                                    remove_cvref_t<Args>...>;\n      detail::parse_format_string<true>(str_, checker(s, {}));\n    }\n#else\n    detail::check_format_string<Args...>(s);\n#endif\n  }\n  basic_format_string(basic_runtime<Char> r) : str_(r.str) {}\n\n  FMT_INLINE operator basic_string_view<Char>() const { return str_; }\n};\n\n#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409\n// Workaround broken conversion on older gcc.\ntemplate <typename... Args> using format_string = string_view;\ntemplate <typename S> auto runtime(const S& s) -> basic_string_view<char_t<S>> {\n  return s;\n}\n#else\ntemplate <typename... Args>\nusing format_string = basic_format_string<char, type_identity_t<Args>...>;\n// Creates a runtime format string.\ntemplate <typename S> auto runtime(const S& s) -> basic_runtime<char_t<S>> {\n  return {{s}};\n}\n#endif\n\nFMT_API auto vformat(string_view fmt, format_args args) -> std::string;\n\n/**\n  \\rst\n  Formats ``args`` according to specifications in ``fmt`` and returns the result\n  as a string.\n\n  **Example**::\n\n    #include <fmt/core.h>\n    std::string message = fmt::format(\"The answer is {}\", 42);\n  \\endrst\n*/\ntemplate <typename... T>\nFMT_INLINE auto format(format_string<T...> fmt, T&&... args) -> std::string {\n  return vformat(fmt, fmt::make_format_args(args...));\n}\n\n/** Formats a string and writes the output to ``out``. */\ntemplate <typename OutputIt,\n          FMT_ENABLE_IF(detail::is_output_iterator<OutputIt, char>::value)>\nauto vformat_to(OutputIt out, string_view fmt, format_args args) -> OutputIt {\n  using detail::get_buffer;\n  auto&& buf = get_buffer<char>(out);\n  detail::vformat_to(buf, string_view(fmt), args, {});\n  return detail::get_iterator(buf);\n}\n\n/**\n \\rst\n Formats ``args`` according to specifications in ``fmt``, writes the result to\n the output iterator ``out`` and returns the iterator past the end of the output\n range.\n\n **Example**::\n\n   auto out = std::vector<char>();\n   fmt::format_to(std::back_inserter(out), \"{}\", 42);\n \\endrst\n */\ntemplate <typename OutputIt, typename... T,\n          FMT_ENABLE_IF(detail::is_output_iterator<OutputIt, char>::value)>\nFMT_INLINE auto format_to(OutputIt out, format_string<T...> fmt, T&&... args)\n    -> OutputIt {\n  return vformat_to(out, fmt, fmt::make_format_args(args...));\n}\n\ntemplate <typename OutputIt> struct format_to_n_result {\n  /** Iterator past the end of the output range. */\n  OutputIt out;\n  /** Total (not truncated) output size. */\n  size_t size;\n};\n\ntemplate <typename OutputIt, typename... T,\n          FMT_ENABLE_IF(detail::is_output_iterator<OutputIt, char>::value)>\nauto vformat_to_n(OutputIt out, size_t n, string_view fmt, format_args args)\n    -> format_to_n_result<OutputIt> {\n  using buffer =\n      detail::iterator_buffer<OutputIt, char, detail::fixed_buffer_traits>;\n  auto buf = buffer(out, n);\n  detail::vformat_to(buf, fmt, args, {});\n  return {buf.out(), buf.count()};\n}\n\n/**\n  \\rst\n  Formats ``args`` according to specifications in ``fmt``, writes up to ``n``\n  characters of the result to the output iterator ``out`` and returns the total\n  (not truncated) output size and the iterator past the end of the output range.\n  \\endrst\n */\ntemplate <typename OutputIt, typename... T,\n          FMT_ENABLE_IF(detail::is_output_iterator<OutputIt, char>::value)>\nFMT_INLINE auto format_to_n(OutputIt out, size_t n, format_string<T...> fmt,\n                            const T&... args) -> format_to_n_result<OutputIt> {\n  return vformat_to_n(out, n, fmt, fmt::make_format_args(args...));\n}\n\n/** Returns the number of chars in the output of ``format(fmt, args...)``. */\ntemplate <typename... T>\nFMT_INLINE auto formatted_size(format_string<T...> fmt, T&&... args) -> size_t {\n  auto buf = detail::counting_buffer<>();\n  detail::vformat_to(buf, string_view(fmt), fmt::make_format_args(args...), {});\n  return buf.count();\n}\n\nFMT_API void vprint(string_view fmt, format_args args);\nFMT_API void vprint(std::FILE* f, string_view fmt, format_args args);\n\n/**\n  \\rst\n  Formats ``args`` according to specifications in ``fmt`` and writes the output\n  to ``stdout``.\n\n  **Example**::\n\n    fmt::print(\"Elapsed time: {0:.2f} seconds\", 1.23);\n  \\endrst\n */\ntemplate <typename... T>\nFMT_INLINE void print(format_string<T...> fmt, T&&... args) {\n  const auto& vargs = fmt::make_format_args(args...);\n  return detail::is_utf8() ? vprint(fmt, vargs)\n                           : detail::vprint_mojibake(stdout, fmt, vargs);\n}\n\n/**\n  \\rst\n  Formats ``args`` according to specifications in ``fmt`` and writes the\n  output to the file ``f``.\n\n  **Example**::\n\n    fmt::print(stderr, \"Don't {}!\", \"panic\");\n  \\endrst\n */\ntemplate <typename... T>\nFMT_INLINE void print(std::FILE* f, format_string<T...> fmt, T&&... args) {\n  const auto& vargs = fmt::make_format_args(args...);\n  return detail::is_utf8() ? vprint(f, fmt, vargs)\n                           : detail::vprint_mojibake(f, fmt, vargs);\n}\n\nFMT_MODULE_EXPORT_END\nFMT_GCC_PRAGMA(\"GCC pop_options\")\nFMT_END_NAMESPACE\n\n#ifdef FMT_HEADER_ONLY\n#  include \"format.h\"\n#endif\n#endif  // FMT_CORE_H_\n"
  },
  {
    "path": "examples/libraries/fmt/include/fmt/format-inl.h",
    "content": "// Formatting library for C++ - implementation\n//\n// Copyright (c) 2012 - 2016, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#ifndef FMT_FORMAT_INL_H_\n#define FMT_FORMAT_INL_H_\n\n#include <algorithm>\n#include <cctype>\n#include <cerrno>  // errno\n#include <climits>\n#include <cmath>\n#include <cstdarg>\n#include <cstring>  // std::memmove\n#include <cwchar>\n#include <exception>\n\n#ifndef FMT_STATIC_THOUSANDS_SEPARATOR\n#  include <locale>\n#endif\n\n#ifdef _WIN32\n#  include <io.h>  // _isatty\n#endif\n\n#include \"format.h\"\n\nFMT_BEGIN_NAMESPACE\nnamespace detail {\n\nFMT_FUNC void assert_fail(const char* file, int line, const char* message) {\n  // Use unchecked std::fprintf to avoid triggering another assertion when\n  // writing to stderr fails\n  std::fprintf(stderr, \"%s:%d: assertion failed: %s\", file, line, message);\n  // Chosen instead of std::abort to satisfy Clang in CUDA mode during device\n  // code pass.\n  std::terminate();\n}\n\n#ifndef _MSC_VER\n#  define FMT_SNPRINTF snprintf\n#else  // _MSC_VER\ninline int fmt_snprintf(char* buffer, size_t size, const char* format, ...) {\n  va_list args;\n  va_start(args, format);\n  int result = vsnprintf_s(buffer, size, _TRUNCATE, format, args);\n  va_end(args);\n  return result;\n}\n#  define FMT_SNPRINTF fmt_snprintf\n#endif  // _MSC_VER\n\nFMT_FUNC void format_error_code(detail::buffer<char>& out, int error_code,\n                                string_view message) FMT_NOEXCEPT {\n  // Report error code making sure that the output fits into\n  // inline_buffer_size to avoid dynamic memory allocation and potential\n  // bad_alloc.\n  out.try_resize(0);\n  static const char SEP[] = \": \";\n  static const char ERROR_STR[] = \"error \";\n  // Subtract 2 to account for terminating null characters in SEP and ERROR_STR.\n  size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2;\n  auto abs_value = static_cast<uint32_or_64_or_128_t<int>>(error_code);\n  if (detail::is_negative(error_code)) {\n    abs_value = 0 - abs_value;\n    ++error_code_size;\n  }\n  error_code_size += detail::to_unsigned(detail::count_digits(abs_value));\n  auto it = buffer_appender<char>(out);\n  if (message.size() <= inline_buffer_size - error_code_size)\n    format_to(it, FMT_STRING(\"{}{}\"), message, SEP);\n  format_to(it, FMT_STRING(\"{}{}\"), ERROR_STR, error_code);\n  FMT_ASSERT(out.size() <= inline_buffer_size, \"\");\n}\n\nFMT_FUNC void report_error(format_func func, int error_code,\n                           const char* message) FMT_NOEXCEPT {\n  memory_buffer full_message;\n  func(full_message, error_code, message);\n  // Don't use fwrite_fully because the latter may throw.\n  if (std::fwrite(full_message.data(), full_message.size(), 1, stderr) > 0)\n    std::fputc('\\n', stderr);\n}\n\n// A wrapper around fwrite that throws on error.\ninline void fwrite_fully(const void* ptr, size_t size, size_t count,\n                         FILE* stream) {\n  size_t written = std::fwrite(ptr, size, count, stream);\n  if (written < count) FMT_THROW(system_error(errno, \"cannot write to file\"));\n}\n\n#ifndef FMT_STATIC_THOUSANDS_SEPARATOR\ntemplate <typename Locale>\nlocale_ref::locale_ref(const Locale& loc) : locale_(&loc) {\n  static_assert(std::is_same<Locale, std::locale>::value, \"\");\n}\n\ntemplate <typename Locale> Locale locale_ref::get() const {\n  static_assert(std::is_same<Locale, std::locale>::value, \"\");\n  return locale_ ? *static_cast<const std::locale*>(locale_) : std::locale();\n}\n\ntemplate <typename Char>\nFMT_FUNC auto thousands_sep_impl(locale_ref loc) -> thousands_sep_result<Char> {\n  auto& facet = std::use_facet<std::numpunct<Char>>(loc.get<std::locale>());\n  auto grouping = facet.grouping();\n  auto thousands_sep = grouping.empty() ? Char() : facet.thousands_sep();\n  return {std::move(grouping), thousands_sep};\n}\ntemplate <typename Char> FMT_FUNC Char decimal_point_impl(locale_ref loc) {\n  return std::use_facet<std::numpunct<Char>>(loc.get<std::locale>())\n      .decimal_point();\n}\n#else\ntemplate <typename Char>\nFMT_FUNC auto thousands_sep_impl(locale_ref) -> thousands_sep_result<Char> {\n  return {\"\\03\", FMT_STATIC_THOUSANDS_SEPARATOR};\n}\ntemplate <typename Char> FMT_FUNC Char decimal_point_impl(locale_ref) {\n  return '.';\n}\n#endif\n}  // namespace detail\n\n#if !FMT_MSC_VER\nFMT_API FMT_FUNC format_error::~format_error() FMT_NOEXCEPT = default;\n#endif\n\nFMT_FUNC std::system_error vsystem_error(int error_code, string_view format_str,\n                                         format_args args) {\n  auto ec = std::error_code(error_code, std::generic_category());\n  return std::system_error(ec, vformat(format_str, args));\n}\n\nnamespace detail {\n\ntemplate <> FMT_FUNC int count_digits<4>(detail::fallback_uintptr n) {\n  // fallback_uintptr is always stored in little endian.\n  int i = static_cast<int>(sizeof(void*)) - 1;\n  while (i > 0 && n.value[i] == 0) --i;\n  auto char_digits = std::numeric_limits<unsigned char>::digits / 4;\n  return i >= 0 ? i * char_digits + count_digits<4, unsigned>(n.value[i]) : 1;\n}\n\n#if __cplusplus < 201703L\ntemplate <typename T> constexpr const char basic_data<T>::digits[][2];\ntemplate <typename T> constexpr const char basic_data<T>::hex_digits[];\ntemplate <typename T> constexpr const char basic_data<T>::signs[];\ntemplate <typename T> constexpr const unsigned basic_data<T>::prefixes[];\ntemplate <typename T> constexpr const char basic_data<T>::left_padding_shifts[];\ntemplate <typename T>\nconstexpr const char basic_data<T>::right_padding_shifts[];\n#endif\n\ntemplate <typename T> struct bits {\n  static FMT_CONSTEXPR_DECL const int value =\n      static_cast<int>(sizeof(T) * std::numeric_limits<unsigned char>::digits);\n};\n\nclass fp;\ntemplate <int SHIFT = 0> fp normalize(fp value);\n\n// Lower (upper) boundary is a value half way between a floating-point value\n// and its predecessor (successor). Boundaries have the same exponent as the\n// value so only significands are stored.\nstruct boundaries {\n  uint64_t lower;\n  uint64_t upper;\n};\n\n// A handmade floating-point number f * pow(2, e).\nclass fp {\n private:\n  using significand_type = uint64_t;\n\n  template <typename Float>\n  using is_supported_float = bool_constant<sizeof(Float) == sizeof(uint64_t) ||\n                                           sizeof(Float) == sizeof(uint32_t)>;\n\n public:\n  significand_type f;\n  int e;\n\n  // All sizes are in bits.\n  // Subtract 1 to account for an implicit most significant bit in the\n  // normalized form.\n  static FMT_CONSTEXPR_DECL const int double_significand_size =\n      std::numeric_limits<double>::digits - 1;\n  static FMT_CONSTEXPR_DECL const uint64_t implicit_bit =\n      1ULL << double_significand_size;\n  static FMT_CONSTEXPR_DECL const int significand_size =\n      bits<significand_type>::value;\n\n  fp() : f(0), e(0) {}\n  fp(uint64_t f_val, int e_val) : f(f_val), e(e_val) {}\n\n  // Constructs fp from an IEEE754 double. It is a template to prevent compile\n  // errors on platforms where double is not IEEE754.\n  template <typename Double> explicit fp(Double d) { assign(d); }\n\n  // Assigns d to this and return true iff predecessor is closer than successor.\n  template <typename Float, FMT_ENABLE_IF(is_supported_float<Float>::value)>\n  bool assign(Float d) {\n    // Assume float is in the format [sign][exponent][significand].\n    using limits = std::numeric_limits<Float>;\n    const int float_significand_size = limits::digits - 1;\n    const int exponent_size =\n        bits<Float>::value - float_significand_size - 1;  // -1 for sign\n    const uint64_t float_implicit_bit = 1ULL << float_significand_size;\n    const uint64_t significand_mask = float_implicit_bit - 1;\n    const uint64_t exponent_mask = (~0ULL >> 1) & ~significand_mask;\n    const int exponent_bias = (1 << exponent_size) - limits::max_exponent - 1;\n    constexpr bool is_double = sizeof(Float) == sizeof(uint64_t);\n    auto u = bit_cast<conditional_t<is_double, uint64_t, uint32_t>>(d);\n    f = u & significand_mask;\n    int biased_e =\n        static_cast<int>((u & exponent_mask) >> float_significand_size);\n    // Predecessor is closer if d is a normalized power of 2 (f == 0) other than\n    // the smallest normalized number (biased_e > 1).\n    bool is_predecessor_closer = f == 0 && biased_e > 1;\n    if (biased_e != 0)\n      f += float_implicit_bit;\n    else\n      biased_e = 1;  // Subnormals use biased exponent 1 (min exponent).\n    e = biased_e - exponent_bias - float_significand_size;\n    return is_predecessor_closer;\n  }\n\n  template <typename Float, FMT_ENABLE_IF(!is_supported_float<Float>::value)>\n  bool assign(Float) {\n    *this = fp();\n    return false;\n  }\n};\n\n// Normalizes the value converted from double and multiplied by (1 << SHIFT).\ntemplate <int SHIFT> fp normalize(fp value) {\n  // Handle subnormals.\n  const auto shifted_implicit_bit = fp::implicit_bit << SHIFT;\n  while ((value.f & shifted_implicit_bit) == 0) {\n    value.f <<= 1;\n    --value.e;\n  }\n  // Subtract 1 to account for hidden bit.\n  const auto offset =\n      fp::significand_size - fp::double_significand_size - SHIFT - 1;\n  value.f <<= offset;\n  value.e -= offset;\n  return value;\n}\n\ninline bool operator==(fp x, fp y) { return x.f == y.f && x.e == y.e; }\n\n// Computes lhs * rhs / pow(2, 64) rounded to nearest with half-up tie breaking.\ninline uint64_t multiply(uint64_t lhs, uint64_t rhs) {\n#if FMT_USE_INT128\n  auto product = static_cast<__uint128_t>(lhs) * rhs;\n  auto f = static_cast<uint64_t>(product >> 64);\n  return (static_cast<uint64_t>(product) & (1ULL << 63)) != 0 ? f + 1 : f;\n#else\n  // Multiply 32-bit parts of significands.\n  uint64_t mask = (1ULL << 32) - 1;\n  uint64_t a = lhs >> 32, b = lhs & mask;\n  uint64_t c = rhs >> 32, d = rhs & mask;\n  uint64_t ac = a * c, bc = b * c, ad = a * d, bd = b * d;\n  // Compute mid 64-bit of result and round.\n  uint64_t mid = (bd >> 32) + (ad & mask) + (bc & mask) + (1U << 31);\n  return ac + (ad >> 32) + (bc >> 32) + (mid >> 32);\n#endif\n}\n\ninline fp operator*(fp x, fp y) { return {multiply(x.f, y.f), x.e + y.e + 64}; }\n\n// Returns a cached power of 10 `c_k = c_k.f * pow(2, c_k.e)` such that its\n// (binary) exponent satisfies `min_exponent <= c_k.e <= min_exponent + 28`.\ninline fp get_cached_power(int min_exponent, int& pow10_exponent) {\n  // Normalized 64-bit significands of pow(10, k), for k = -348, -340, ..., 340.\n  // These are generated by support/compute-powers.py.\n  static constexpr const uint64_t pow10_significands[] = {\n      0xfa8fd5a0081c0288, 0xbaaee17fa23ebf76, 0x8b16fb203055ac76,\n      0xcf42894a5dce35ea, 0x9a6bb0aa55653b2d, 0xe61acf033d1a45df,\n      0xab70fe17c79ac6ca, 0xff77b1fcbebcdc4f, 0xbe5691ef416bd60c,\n      0x8dd01fad907ffc3c, 0xd3515c2831559a83, 0x9d71ac8fada6c9b5,\n      0xea9c227723ee8bcb, 0xaecc49914078536d, 0x823c12795db6ce57,\n      0xc21094364dfb5637, 0x9096ea6f3848984f, 0xd77485cb25823ac7,\n      0xa086cfcd97bf97f4, 0xef340a98172aace5, 0xb23867fb2a35b28e,\n      0x84c8d4dfd2c63f3b, 0xc5dd44271ad3cdba, 0x936b9fcebb25c996,\n      0xdbac6c247d62a584, 0xa3ab66580d5fdaf6, 0xf3e2f893dec3f126,\n      0xb5b5ada8aaff80b8, 0x87625f056c7c4a8b, 0xc9bcff6034c13053,\n      0x964e858c91ba2655, 0xdff9772470297ebd, 0xa6dfbd9fb8e5b88f,\n      0xf8a95fcf88747d94, 0xb94470938fa89bcf, 0x8a08f0f8bf0f156b,\n      0xcdb02555653131b6, 0x993fe2c6d07b7fac, 0xe45c10c42a2b3b06,\n      0xaa242499697392d3, 0xfd87b5f28300ca0e, 0xbce5086492111aeb,\n      0x8cbccc096f5088cc, 0xd1b71758e219652c, 0x9c40000000000000,\n      0xe8d4a51000000000, 0xad78ebc5ac620000, 0x813f3978f8940984,\n      0xc097ce7bc90715b3, 0x8f7e32ce7bea5c70, 0xd5d238a4abe98068,\n      0x9f4f2726179a2245, 0xed63a231d4c4fb27, 0xb0de65388cc8ada8,\n      0x83c7088e1aab65db, 0xc45d1df942711d9a, 0x924d692ca61be758,\n      0xda01ee641a708dea, 0xa26da3999aef774a, 0xf209787bb47d6b85,\n      0xb454e4a179dd1877, 0x865b86925b9bc5c2, 0xc83553c5c8965d3d,\n      0x952ab45cfa97a0b3, 0xde469fbd99a05fe3, 0xa59bc234db398c25,\n      0xf6c69a72a3989f5c, 0xb7dcbf5354e9bece, 0x88fcf317f22241e2,\n      0xcc20ce9bd35c78a5, 0x98165af37b2153df, 0xe2a0b5dc971f303a,\n      0xa8d9d1535ce3b396, 0xfb9b7cd9a4a7443c, 0xbb764c4ca7a44410,\n      0x8bab8eefb6409c1a, 0xd01fef10a657842c, 0x9b10a4e5e9913129,\n      0xe7109bfba19c0c9d, 0xac2820d9623bf429, 0x80444b5e7aa7cf85,\n      0xbf21e44003acdd2d, 0x8e679c2f5e44ff8f, 0xd433179d9c8cb841,\n      0x9e19db92b4e31ba9, 0xeb96bf6ebadf77d9, 0xaf87023b9bf0ee6b,\n  };\n\n  // Binary exponents of pow(10, k), for k = -348, -340, ..., 340, corresponding\n  // to significands above.\n  static constexpr const int16_t pow10_exponents[] = {\n      -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, -954,\n      -927,  -901,  -874,  -847,  -821,  -794,  -768,  -741,  -715,  -688, -661,\n      -635,  -608,  -582,  -555,  -529,  -502,  -475,  -449,  -422,  -396, -369,\n      -343,  -316,  -289,  -263,  -236,  -210,  -183,  -157,  -130,  -103, -77,\n      -50,   -24,   3,     30,    56,    83,    109,   136,   162,   189,  216,\n      242,   269,   295,   322,   348,   375,   402,   428,   455,   481,  508,\n      534,   561,   588,   614,   641,   667,   694,   720,   747,   774,  800,\n      827,   853,   880,   907,   933,   960,   986,   1013,  1039,  1066};\n\n  const int shift = 32;\n  const auto significand = static_cast<int64_t>(data::log10_2_significand);\n  int index = static_cast<int>(\n      ((min_exponent + fp::significand_size - 1) * (significand >> shift) +\n       ((int64_t(1) << shift) - 1))  // ceil\n      >> 32                          // arithmetic shift\n  );\n  // Decimal exponent of the first (smallest) cached power of 10.\n  const int first_dec_exp = -348;\n  // Difference between 2 consecutive decimal exponents in cached powers of 10.\n  const int dec_exp_step = 8;\n  index = (index - first_dec_exp - 1) / dec_exp_step + 1;\n  pow10_exponent = first_dec_exp + index * dec_exp_step;\n  return {pow10_significands[index], pow10_exponents[index]};\n}\n\n// A simple accumulator to hold the sums of terms in bigint::square if uint128_t\n// is not available.\nstruct accumulator {\n  uint64_t lower;\n  uint64_t upper;\n\n  accumulator() : lower(0), upper(0) {}\n  explicit operator uint32_t() const { return static_cast<uint32_t>(lower); }\n\n  void operator+=(uint64_t n) {\n    lower += n;\n    if (lower < n) ++upper;\n  }\n  void operator>>=(int shift) {\n    FMT_ASSERT(shift == 32, \"\");\n    (void)shift;\n    lower = (upper << 32) | (lower >> 32);\n    upper >>= 32;\n  }\n};\n\nclass bigint {\n private:\n  // A bigint is stored as an array of bigits (big digits), with bigit at index\n  // 0 being the least significant one.\n  using bigit = uint32_t;\n  using double_bigit = uint64_t;\n  enum { bigits_capacity = 32 };\n  basic_memory_buffer<bigit, bigits_capacity> bigits_;\n  int exp_;\n\n  bigit operator[](int index) const { return bigits_[to_unsigned(index)]; }\n  bigit& operator[](int index) { return bigits_[to_unsigned(index)]; }\n\n  static FMT_CONSTEXPR_DECL const int bigit_bits = bits<bigit>::value;\n\n  friend struct formatter<bigint>;\n\n  void subtract_bigits(int index, bigit other, bigit& borrow) {\n    auto result = static_cast<double_bigit>((*this)[index]) - other - borrow;\n    (*this)[index] = static_cast<bigit>(result);\n    borrow = static_cast<bigit>(result >> (bigit_bits * 2 - 1));\n  }\n\n  void remove_leading_zeros() {\n    int num_bigits = static_cast<int>(bigits_.size()) - 1;\n    while (num_bigits > 0 && (*this)[num_bigits] == 0) --num_bigits;\n    bigits_.resize(to_unsigned(num_bigits + 1));\n  }\n\n  // Computes *this -= other assuming aligned bigints and *this >= other.\n  void subtract_aligned(const bigint& other) {\n    FMT_ASSERT(other.exp_ >= exp_, \"unaligned bigints\");\n    FMT_ASSERT(compare(*this, other) >= 0, \"\");\n    bigit borrow = 0;\n    int i = other.exp_ - exp_;\n    for (size_t j = 0, n = other.bigits_.size(); j != n; ++i, ++j)\n      subtract_bigits(i, other.bigits_[j], borrow);\n    while (borrow > 0) subtract_bigits(i, 0, borrow);\n    remove_leading_zeros();\n  }\n\n  void multiply(uint32_t value) {\n    const double_bigit wide_value = value;\n    bigit carry = 0;\n    for (size_t i = 0, n = bigits_.size(); i < n; ++i) {\n      double_bigit result = bigits_[i] * wide_value + carry;\n      bigits_[i] = static_cast<bigit>(result);\n      carry = static_cast<bigit>(result >> bigit_bits);\n    }\n    if (carry != 0) bigits_.push_back(carry);\n  }\n\n  void multiply(uint64_t value) {\n    const bigit mask = ~bigit(0);\n    const double_bigit lower = value & mask;\n    const double_bigit upper = value >> bigit_bits;\n    double_bigit carry = 0;\n    for (size_t i = 0, n = bigits_.size(); i < n; ++i) {\n      double_bigit result = bigits_[i] * lower + (carry & mask);\n      carry =\n          bigits_[i] * upper + (result >> bigit_bits) + (carry >> bigit_bits);\n      bigits_[i] = static_cast<bigit>(result);\n    }\n    while (carry != 0) {\n      bigits_.push_back(carry & mask);\n      carry >>= bigit_bits;\n    }\n  }\n\n public:\n  bigint() : exp_(0) {}\n  explicit bigint(uint64_t n) { assign(n); }\n  ~bigint() { FMT_ASSERT(bigits_.capacity() <= bigits_capacity, \"\"); }\n\n  bigint(const bigint&) = delete;\n  void operator=(const bigint&) = delete;\n\n  void assign(const bigint& other) {\n    auto size = other.bigits_.size();\n    bigits_.resize(size);\n    auto data = other.bigits_.data();\n    std::copy(data, data + size, make_checked(bigits_.data(), size));\n    exp_ = other.exp_;\n  }\n\n  void assign(uint64_t n) {\n    size_t num_bigits = 0;\n    do {\n      bigits_[num_bigits++] = n & ~bigit(0);\n      n >>= bigit_bits;\n    } while (n != 0);\n    bigits_.resize(num_bigits);\n    exp_ = 0;\n  }\n\n  int num_bigits() const { return static_cast<int>(bigits_.size()) + exp_; }\n\n  FMT_NOINLINE bigint& operator<<=(int shift) {\n    FMT_ASSERT(shift >= 0, \"\");\n    exp_ += shift / bigit_bits;\n    shift %= bigit_bits;\n    if (shift == 0) return *this;\n    bigit carry = 0;\n    for (size_t i = 0, n = bigits_.size(); i < n; ++i) {\n      bigit c = bigits_[i] >> (bigit_bits - shift);\n      bigits_[i] = (bigits_[i] << shift) + carry;\n      carry = c;\n    }\n    if (carry != 0) bigits_.push_back(carry);\n    return *this;\n  }\n\n  template <typename Int> bigint& operator*=(Int value) {\n    FMT_ASSERT(value > 0, \"\");\n    multiply(uint32_or_64_or_128_t<Int>(value));\n    return *this;\n  }\n\n  friend int compare(const bigint& lhs, const bigint& rhs) {\n    int num_lhs_bigits = lhs.num_bigits(), num_rhs_bigits = rhs.num_bigits();\n    if (num_lhs_bigits != num_rhs_bigits)\n      return num_lhs_bigits > num_rhs_bigits ? 1 : -1;\n    int i = static_cast<int>(lhs.bigits_.size()) - 1;\n    int j = static_cast<int>(rhs.bigits_.size()) - 1;\n    int end = i - j;\n    if (end < 0) end = 0;\n    for (; i >= end; --i, --j) {\n      bigit lhs_bigit = lhs[i], rhs_bigit = rhs[j];\n      if (lhs_bigit != rhs_bigit) return lhs_bigit > rhs_bigit ? 1 : -1;\n    }\n    if (i != j) return i > j ? 1 : -1;\n    return 0;\n  }\n\n  // Returns compare(lhs1 + lhs2, rhs).\n  friend int add_compare(const bigint& lhs1, const bigint& lhs2,\n                         const bigint& rhs) {\n    int max_lhs_bigits = (std::max)(lhs1.num_bigits(), lhs2.num_bigits());\n    int num_rhs_bigits = rhs.num_bigits();\n    if (max_lhs_bigits + 1 < num_rhs_bigits) return -1;\n    if (max_lhs_bigits > num_rhs_bigits) return 1;\n    auto get_bigit = [](const bigint& n, int i) -> bigit {\n      return i >= n.exp_ && i < n.num_bigits() ? n[i - n.exp_] : 0;\n    };\n    double_bigit borrow = 0;\n    int min_exp = (std::min)((std::min)(lhs1.exp_, lhs2.exp_), rhs.exp_);\n    for (int i = num_rhs_bigits - 1; i >= min_exp; --i) {\n      double_bigit sum =\n          static_cast<double_bigit>(get_bigit(lhs1, i)) + get_bigit(lhs2, i);\n      bigit rhs_bigit = get_bigit(rhs, i);\n      if (sum > rhs_bigit + borrow) return 1;\n      borrow = rhs_bigit + borrow - sum;\n      if (borrow > 1) return -1;\n      borrow <<= bigit_bits;\n    }\n    return borrow != 0 ? -1 : 0;\n  }\n\n  // Assigns pow(10, exp) to this bigint.\n  void assign_pow10(int exp) {\n    FMT_ASSERT(exp >= 0, \"\");\n    if (exp == 0) return assign(1);\n    // Find the top bit.\n    int bitmask = 1;\n    while (exp >= bitmask) bitmask <<= 1;\n    bitmask >>= 1;\n    // pow(10, exp) = pow(5, exp) * pow(2, exp). First compute pow(5, exp) by\n    // repeated squaring and multiplication.\n    assign(5);\n    bitmask >>= 1;\n    while (bitmask != 0) {\n      square();\n      if ((exp & bitmask) != 0) *this *= 5;\n      bitmask >>= 1;\n    }\n    *this <<= exp;  // Multiply by pow(2, exp) by shifting.\n  }\n\n  void square() {\n    int num_bigits = static_cast<int>(bigits_.size());\n    int num_result_bigits = 2 * num_bigits;\n    basic_memory_buffer<bigit, bigits_capacity> n(std::move(bigits_));\n    bigits_.resize(to_unsigned(num_result_bigits));\n    using accumulator_t = conditional_t<FMT_USE_INT128, uint128_t, accumulator>;\n    auto sum = accumulator_t();\n    for (int bigit_index = 0; bigit_index < num_bigits; ++bigit_index) {\n      // Compute bigit at position bigit_index of the result by adding\n      // cross-product terms n[i] * n[j] such that i + j == bigit_index.\n      for (int i = 0, j = bigit_index; j >= 0; ++i, --j) {\n        // Most terms are multiplied twice which can be optimized in the future.\n        sum += static_cast<double_bigit>(n[i]) * n[j];\n      }\n      (*this)[bigit_index] = static_cast<bigit>(sum);\n      sum >>= bits<bigit>::value;  // Compute the carry.\n    }\n    // Do the same for the top half.\n    for (int bigit_index = num_bigits; bigit_index < num_result_bigits;\n         ++bigit_index) {\n      for (int j = num_bigits - 1, i = bigit_index - j; i < num_bigits;)\n        sum += static_cast<double_bigit>(n[i++]) * n[j--];\n      (*this)[bigit_index] = static_cast<bigit>(sum);\n      sum >>= bits<bigit>::value;\n    }\n    remove_leading_zeros();\n    exp_ *= 2;\n  }\n\n  // If this bigint has a bigger exponent than other, adds trailing zero to make\n  // exponents equal. This simplifies some operations such as subtraction.\n  void align(const bigint& other) {\n    int exp_difference = exp_ - other.exp_;\n    if (exp_difference <= 0) return;\n    int num_bigits = static_cast<int>(bigits_.size());\n    bigits_.resize(to_unsigned(num_bigits + exp_difference));\n    for (int i = num_bigits - 1, j = i + exp_difference; i >= 0; --i, --j)\n      bigits_[j] = bigits_[i];\n    std::uninitialized_fill_n(bigits_.data(), exp_difference, 0);\n    exp_ -= exp_difference;\n  }\n\n  // Divides this bignum by divisor, assigning the remainder to this and\n  // returning the quotient.\n  int divmod_assign(const bigint& divisor) {\n    FMT_ASSERT(this != &divisor, \"\");\n    if (compare(*this, divisor) < 0) return 0;\n    FMT_ASSERT(divisor.bigits_[divisor.bigits_.size() - 1u] != 0, \"\");\n    align(divisor);\n    int quotient = 0;\n    do {\n      subtract_aligned(divisor);\n      ++quotient;\n    } while (compare(*this, divisor) >= 0);\n    return quotient;\n  }\n};\n\nenum class round_direction { unknown, up, down };\n\n// Given the divisor (normally a power of 10), the remainder = v % divisor for\n// some number v and the error, returns whether v should be rounded up, down, or\n// whether the rounding direction can't be determined due to error.\n// error should be less than divisor / 2.\ninline round_direction get_round_direction(uint64_t divisor, uint64_t remainder,\n                                           uint64_t error) {\n  FMT_ASSERT(remainder < divisor, \"\");  // divisor - remainder won't overflow.\n  FMT_ASSERT(error < divisor, \"\");      // divisor - error won't overflow.\n  FMT_ASSERT(error < divisor - error, \"\");  // error * 2 won't overflow.\n  // Round down if (remainder + error) * 2 <= divisor.\n  if (remainder <= divisor - remainder && error * 2 <= divisor - remainder * 2)\n    return round_direction::down;\n  // Round up if (remainder - error) * 2 >= divisor.\n  if (remainder >= error &&\n      remainder - error >= divisor - (remainder - error)) {\n    return round_direction::up;\n  }\n  return round_direction::unknown;\n}\n\nnamespace digits {\nenum result {\n  more,  // Generate more digits.\n  done,  // Done generating digits.\n  error  // Digit generation cancelled due to an error.\n};\n}\n\ninline uint64_t power_of_10_64(int exp) {\n  static constexpr const uint64_t data[] = {1, FMT_POWERS_OF_10(1),\n                                            FMT_POWERS_OF_10(1000000000ULL),\n                                            10000000000000000000ULL};\n  return data[exp];\n}\n\n// Generates output using the Grisu digit-gen algorithm.\n// error: the size of the region (lower, upper) outside of which numbers\n// definitely do not round to value (Delta in Grisu3).\ntemplate <typename Handler>\nFMT_INLINE digits::result grisu_gen_digits(fp value, uint64_t error, int& exp,\n                                           Handler& handler) {\n  const fp one(1ULL << -value.e, value.e);\n  // The integral part of scaled value (p1 in Grisu) = value / one. It cannot be\n  // zero because it contains a product of two 64-bit numbers with MSB set (due\n  // to normalization) - 1, shifted right by at most 60 bits.\n  auto integral = static_cast<uint32_t>(value.f >> -one.e);\n  FMT_ASSERT(integral != 0, \"\");\n  FMT_ASSERT(integral == value.f >> -one.e, \"\");\n  // The fractional part of scaled value (p2 in Grisu) c = value % one.\n  uint64_t fractional = value.f & (one.f - 1);\n  exp = count_digits(integral);  // kappa in Grisu.\n  // Divide by 10 to prevent overflow.\n  auto result = handler.on_start(power_of_10_64(exp - 1) << -one.e,\n                                 value.f / 10, error * 10, exp);\n  if (result != digits::more) return result;\n  // Generate digits for the integral part. This can produce up to 10 digits.\n  do {\n    uint32_t digit = 0;\n    auto divmod_integral = [&](uint32_t divisor) {\n      digit = integral / divisor;\n      integral %= divisor;\n    };\n    // This optimization by Milo Yip reduces the number of integer divisions by\n    // one per iteration.\n    switch (exp) {\n    case 10:\n      divmod_integral(1000000000);\n      break;\n    case 9:\n      divmod_integral(100000000);\n      break;\n    case 8:\n      divmod_integral(10000000);\n      break;\n    case 7:\n      divmod_integral(1000000);\n      break;\n    case 6:\n      divmod_integral(100000);\n      break;\n    case 5:\n      divmod_integral(10000);\n      break;\n    case 4:\n      divmod_integral(1000);\n      break;\n    case 3:\n      divmod_integral(100);\n      break;\n    case 2:\n      divmod_integral(10);\n      break;\n    case 1:\n      digit = integral;\n      integral = 0;\n      break;\n    default:\n      FMT_ASSERT(false, \"invalid number of digits\");\n    }\n    --exp;\n    auto remainder = (static_cast<uint64_t>(integral) << -one.e) + fractional;\n    result = handler.on_digit(static_cast<char>('0' + digit),\n                              power_of_10_64(exp) << -one.e, remainder, error,\n                              exp, true);\n    if (result != digits::more) return result;\n  } while (exp > 0);\n  // Generate digits for the fractional part.\n  for (;;) {\n    fractional *= 10;\n    error *= 10;\n    char digit = static_cast<char>('0' + (fractional >> -one.e));\n    fractional &= one.f - 1;\n    --exp;\n    result = handler.on_digit(digit, one.f, fractional, error, exp, false);\n    if (result != digits::more) return result;\n  }\n}\n\n// The fixed precision digit handler.\nstruct fixed_handler {\n  char* buf;\n  int size;\n  int precision;\n  int exp10;\n  bool fixed;\n\n  digits::result on_start(uint64_t divisor, uint64_t remainder, uint64_t error,\n                          int& exp) {\n    // Non-fixed formats require at least one digit and no precision adjustment.\n    if (!fixed) return digits::more;\n    // Adjust fixed precision by exponent because it is relative to decimal\n    // point.\n    precision += exp + exp10;\n    // Check if precision is satisfied just by leading zeros, e.g.\n    // format(\"{:.2f}\", 0.001) gives \"0.00\" without generating any digits.\n    if (precision > 0) return digits::more;\n    if (precision < 0) return digits::done;\n    auto dir = get_round_direction(divisor, remainder, error);\n    if (dir == round_direction::unknown) return digits::error;\n    buf[size++] = dir == round_direction::up ? '1' : '0';\n    return digits::done;\n  }\n\n  digits::result on_digit(char digit, uint64_t divisor, uint64_t remainder,\n                          uint64_t error, int, bool integral) {\n    FMT_ASSERT(remainder < divisor, \"\");\n    buf[size++] = digit;\n    if (!integral && error >= remainder) return digits::error;\n    if (size < precision) return digits::more;\n    if (!integral) {\n      // Check if error * 2 < divisor with overflow prevention.\n      // The check is not needed for the integral part because error = 1\n      // and divisor > (1 << 32) there.\n      if (error >= divisor || error >= divisor - error) return digits::error;\n    } else {\n      FMT_ASSERT(error == 1 && divisor > 2, \"\");\n    }\n    auto dir = get_round_direction(divisor, remainder, error);\n    if (dir != round_direction::up)\n      return dir == round_direction::down ? digits::done : digits::error;\n    ++buf[size - 1];\n    for (int i = size - 1; i > 0 && buf[i] > '9'; --i) {\n      buf[i] = '0';\n      ++buf[i - 1];\n    }\n    if (buf[0] > '9') {\n      buf[0] = '1';\n      if (fixed)\n        buf[size++] = '0';\n      else\n        ++exp10;\n    }\n    return digits::done;\n  }\n};\n\n// A 128-bit integer type used internally,\nstruct uint128_wrapper {\n  uint128_wrapper() = default;\n\n#if FMT_USE_INT128\n  uint128_t internal_;\n\n  constexpr uint128_wrapper(uint64_t high, uint64_t low) FMT_NOEXCEPT\n      : internal_{static_cast<uint128_t>(low) |\n                  (static_cast<uint128_t>(high) << 64)} {}\n\n  constexpr uint128_wrapper(uint128_t u) : internal_{u} {}\n\n  constexpr uint64_t high() const FMT_NOEXCEPT {\n    return uint64_t(internal_ >> 64);\n  }\n  constexpr uint64_t low() const FMT_NOEXCEPT { return uint64_t(internal_); }\n\n  uint128_wrapper& operator+=(uint64_t n) FMT_NOEXCEPT {\n    internal_ += n;\n    return *this;\n  }\n#else\n  uint64_t high_;\n  uint64_t low_;\n\n  constexpr uint128_wrapper(uint64_t high, uint64_t low) FMT_NOEXCEPT\n      : high_{high},\n        low_{low} {}\n\n  constexpr uint64_t high() const FMT_NOEXCEPT { return high_; }\n  constexpr uint64_t low() const FMT_NOEXCEPT { return low_; }\n\n  uint128_wrapper& operator+=(uint64_t n) FMT_NOEXCEPT {\n#  if defined(_MSC_VER) && defined(_M_X64)\n    unsigned char carry = _addcarry_u64(0, low_, n, &low_);\n    _addcarry_u64(carry, high_, 0, &high_);\n    return *this;\n#  else\n    uint64_t sum = low_ + n;\n    high_ += (sum < low_ ? 1 : 0);\n    low_ = sum;\n    return *this;\n#  endif\n  }\n#endif\n};\n\n// Implementation of Dragonbox algorithm: https://github.com/jk-jeon/dragonbox.\nnamespace dragonbox {\n// Computes 128-bit result of multiplication of two 64-bit unsigned integers.\ninline uint128_wrapper umul128(uint64_t x, uint64_t y) FMT_NOEXCEPT {\n#if FMT_USE_INT128\n  return static_cast<uint128_t>(x) * static_cast<uint128_t>(y);\n#elif defined(_MSC_VER) && defined(_M_X64)\n  uint128_wrapper result;\n  result.low_ = _umul128(x, y, &result.high_);\n  return result;\n#else\n  const uint64_t mask = (uint64_t(1) << 32) - uint64_t(1);\n\n  uint64_t a = x >> 32;\n  uint64_t b = x & mask;\n  uint64_t c = y >> 32;\n  uint64_t d = y & mask;\n\n  uint64_t ac = a * c;\n  uint64_t bc = b * c;\n  uint64_t ad = a * d;\n  uint64_t bd = b * d;\n\n  uint64_t intermediate = (bd >> 32) + (ad & mask) + (bc & mask);\n\n  return {ac + (intermediate >> 32) + (ad >> 32) + (bc >> 32),\n          (intermediate << 32) + (bd & mask)};\n#endif\n}\n\n// Computes upper 64 bits of multiplication of two 64-bit unsigned integers.\ninline uint64_t umul128_upper64(uint64_t x, uint64_t y) FMT_NOEXCEPT {\n#if FMT_USE_INT128\n  auto p = static_cast<uint128_t>(x) * static_cast<uint128_t>(y);\n  return static_cast<uint64_t>(p >> 64);\n#elif defined(_MSC_VER) && defined(_M_X64)\n  return __umulh(x, y);\n#else\n  return umul128(x, y).high();\n#endif\n}\n\n// Computes upper 64 bits of multiplication of a 64-bit unsigned integer and a\n// 128-bit unsigned integer.\ninline uint64_t umul192_upper64(uint64_t x, uint128_wrapper y) FMT_NOEXCEPT {\n  uint128_wrapper g0 = umul128(x, y.high());\n  g0 += umul128_upper64(x, y.low());\n  return g0.high();\n}\n\n// Computes upper 32 bits of multiplication of a 32-bit unsigned integer and a\n// 64-bit unsigned integer.\ninline uint32_t umul96_upper32(uint32_t x, uint64_t y) FMT_NOEXCEPT {\n  return static_cast<uint32_t>(umul128_upper64(x, y));\n}\n\n// Computes middle 64 bits of multiplication of a 64-bit unsigned integer and a\n// 128-bit unsigned integer.\ninline uint64_t umul192_middle64(uint64_t x, uint128_wrapper y) FMT_NOEXCEPT {\n  uint64_t g01 = x * y.high();\n  uint64_t g10 = umul128_upper64(x, y.low());\n  return g01 + g10;\n}\n\n// Computes lower 64 bits of multiplication of a 32-bit unsigned integer and a\n// 64-bit unsigned integer.\ninline uint64_t umul96_lower64(uint32_t x, uint64_t y) FMT_NOEXCEPT {\n  return x * y;\n}\n\n// Computes floor(log10(pow(2, e))) for e in [-1700, 1700] using the method from\n// https://fmt.dev/papers/Grisu-Exact.pdf#page=5, section 3.4.\ninline int floor_log10_pow2(int e) FMT_NOEXCEPT {\n  FMT_ASSERT(e <= 1700 && e >= -1700, \"too large exponent\");\n  const int shift = 22;\n  return (e * static_cast<int>(data::log10_2_significand >> (64 - shift))) >>\n         shift;\n}\n\n// Various fast log computations.\ninline int floor_log2_pow10(int e) FMT_NOEXCEPT {\n  FMT_ASSERT(e <= 1233 && e >= -1233, \"too large exponent\");\n  const uint64_t log2_10_integer_part = 3;\n  const uint64_t log2_10_fractional_digits = 0x5269e12f346e2bf9;\n  const int shift_amount = 19;\n  return (e * static_cast<int>(\n                  (log2_10_integer_part << shift_amount) |\n                  (log2_10_fractional_digits >> (64 - shift_amount)))) >>\n         shift_amount;\n}\ninline int floor_log10_pow2_minus_log10_4_over_3(int e) FMT_NOEXCEPT {\n  FMT_ASSERT(e <= 1700 && e >= -1700, \"too large exponent\");\n  const uint64_t log10_4_over_3_fractional_digits = 0x1ffbfc2bbc780375;\n  const int shift_amount = 22;\n  return (e * static_cast<int>(data::log10_2_significand >>\n                               (64 - shift_amount)) -\n          static_cast<int>(log10_4_over_3_fractional_digits >>\n                           (64 - shift_amount))) >>\n         shift_amount;\n}\n\n// Returns true iff x is divisible by pow(2, exp).\ninline bool divisible_by_power_of_2(uint32_t x, int exp) FMT_NOEXCEPT {\n  FMT_ASSERT(exp >= 1, \"\");\n  FMT_ASSERT(x != 0, \"\");\n#ifdef FMT_BUILTIN_CTZ\n  return FMT_BUILTIN_CTZ(x) >= exp;\n#else\n  return exp < num_bits<uint32_t>() && x == ((x >> exp) << exp);\n#endif\n}\ninline bool divisible_by_power_of_2(uint64_t x, int exp) FMT_NOEXCEPT {\n  FMT_ASSERT(exp >= 1, \"\");\n  FMT_ASSERT(x != 0, \"\");\n#ifdef FMT_BUILTIN_CTZLL\n  return FMT_BUILTIN_CTZLL(x) >= exp;\n#else\n  return exp < num_bits<uint64_t>() && x == ((x >> exp) << exp);\n#endif\n}\n\n// Table entry type for divisibility test.\ntemplate <typename T> struct divtest_table_entry {\n  T mod_inv;\n  T max_quotient;\n};\n\n// Returns true iff x is divisible by pow(5, exp).\ninline bool divisible_by_power_of_5(uint32_t x, int exp) FMT_NOEXCEPT {\n  FMT_ASSERT(exp <= 10, \"too large exponent\");\n  static constexpr const divtest_table_entry<uint32_t> divtest_table[] = {\n      {0x00000001, 0xffffffff}, {0xcccccccd, 0x33333333},\n      {0xc28f5c29, 0x0a3d70a3}, {0x26e978d5, 0x020c49ba},\n      {0x3afb7e91, 0x0068db8b}, {0x0bcbe61d, 0x0014f8b5},\n      {0x68c26139, 0x000431bd}, {0xae8d46a5, 0x0000d6bf},\n      {0x22e90e21, 0x00002af3}, {0x3a2e9c6d, 0x00000897},\n      {0x3ed61f49, 0x000001b7}};\n  return x * divtest_table[exp].mod_inv <= divtest_table[exp].max_quotient;\n}\ninline bool divisible_by_power_of_5(uint64_t x, int exp) FMT_NOEXCEPT {\n  FMT_ASSERT(exp <= 23, \"too large exponent\");\n  static constexpr const divtest_table_entry<uint64_t> divtest_table[] = {\n      {0x0000000000000001, 0xffffffffffffffff},\n      {0xcccccccccccccccd, 0x3333333333333333},\n      {0x8f5c28f5c28f5c29, 0x0a3d70a3d70a3d70},\n      {0x1cac083126e978d5, 0x020c49ba5e353f7c},\n      {0xd288ce703afb7e91, 0x0068db8bac710cb2},\n      {0x5d4e8fb00bcbe61d, 0x0014f8b588e368f0},\n      {0x790fb65668c26139, 0x000431bde82d7b63},\n      {0xe5032477ae8d46a5, 0x0000d6bf94d5e57a},\n      {0xc767074b22e90e21, 0x00002af31dc46118},\n      {0x8e47ce423a2e9c6d, 0x0000089705f4136b},\n      {0x4fa7f60d3ed61f49, 0x000001b7cdfd9d7b},\n      {0x0fee64690c913975, 0x00000057f5ff85e5},\n      {0x3662e0e1cf503eb1, 0x000000119799812d},\n      {0xa47a2cf9f6433fbd, 0x0000000384b84d09},\n      {0x54186f653140a659, 0x00000000b424dc35},\n      {0x7738164770402145, 0x0000000024075f3d},\n      {0xe4a4d1417cd9a041, 0x000000000734aca5},\n      {0xc75429d9e5c5200d, 0x000000000170ef54},\n      {0xc1773b91fac10669, 0x000000000049c977},\n      {0x26b172506559ce15, 0x00000000000ec1e4},\n      {0xd489e3a9addec2d1, 0x000000000002f394},\n      {0x90e860bb892c8d5d, 0x000000000000971d},\n      {0x502e79bf1b6f4f79, 0x0000000000001e39},\n      {0xdcd618596be30fe5, 0x000000000000060b}};\n  return x * divtest_table[exp].mod_inv <= divtest_table[exp].max_quotient;\n}\n\n// Replaces n by floor(n / pow(5, N)) returning true if and only if n is\n// divisible by pow(5, N).\n// Precondition: n <= 2 * pow(5, N + 1).\ntemplate <int N>\nbool check_divisibility_and_divide_by_pow5(uint32_t& n) FMT_NOEXCEPT {\n  static constexpr struct {\n    uint32_t magic_number;\n    int bits_for_comparison;\n    uint32_t threshold;\n    int shift_amount;\n  } infos[] = {{0xcccd, 16, 0x3333, 18}, {0xa429, 8, 0x0a, 20}};\n  constexpr auto info = infos[N - 1];\n  n *= info.magic_number;\n  const uint32_t comparison_mask = (1u << info.bits_for_comparison) - 1;\n  bool result = (n & comparison_mask) <= info.threshold;\n  n >>= info.shift_amount;\n  return result;\n}\n\n// Computes floor(n / pow(10, N)) for small n and N.\n// Precondition: n <= pow(10, N + 1).\ntemplate <int N> uint32_t small_division_by_pow10(uint32_t n) FMT_NOEXCEPT {\n  static constexpr struct {\n    uint32_t magic_number;\n    int shift_amount;\n    uint32_t divisor_times_10;\n  } infos[] = {{0xcccd, 19, 100}, {0xa3d8, 22, 1000}};\n  constexpr auto info = infos[N - 1];\n  FMT_ASSERT(n <= info.divisor_times_10, \"n is too large\");\n  return n * info.magic_number >> info.shift_amount;\n}\n\n// Computes floor(n / 10^(kappa + 1)) (float)\ninline uint32_t divide_by_10_to_kappa_plus_1(uint32_t n) FMT_NOEXCEPT {\n  return n / float_info<float>::big_divisor;\n}\n// Computes floor(n / 10^(kappa + 1)) (double)\ninline uint64_t divide_by_10_to_kappa_plus_1(uint64_t n) FMT_NOEXCEPT {\n  return umul128_upper64(n, 0x83126e978d4fdf3c) >> 9;\n}\n\n// Various subroutines using pow10 cache\ntemplate <class T> struct cache_accessor;\n\ntemplate <> struct cache_accessor<float> {\n  using carrier_uint = float_info<float>::carrier_uint;\n  using cache_entry_type = uint64_t;\n\n  static uint64_t get_cached_power(int k) FMT_NOEXCEPT {\n    FMT_ASSERT(k >= float_info<float>::min_k && k <= float_info<float>::max_k,\n               \"k is out of range\");\n    constexpr const uint64_t pow10_significands[] = {\n        0x81ceb32c4b43fcf5, 0xa2425ff75e14fc32, 0xcad2f7f5359a3b3f,\n        0xfd87b5f28300ca0e, 0x9e74d1b791e07e49, 0xc612062576589ddb,\n        0xf79687aed3eec552, 0x9abe14cd44753b53, 0xc16d9a0095928a28,\n        0xf1c90080baf72cb2, 0x971da05074da7bef, 0xbce5086492111aeb,\n        0xec1e4a7db69561a6, 0x9392ee8e921d5d08, 0xb877aa3236a4b44a,\n        0xe69594bec44de15c, 0x901d7cf73ab0acda, 0xb424dc35095cd810,\n        0xe12e13424bb40e14, 0x8cbccc096f5088cc, 0xafebff0bcb24aaff,\n        0xdbe6fecebdedd5bf, 0x89705f4136b4a598, 0xabcc77118461cefd,\n        0xd6bf94d5e57a42bd, 0x8637bd05af6c69b6, 0xa7c5ac471b478424,\n        0xd1b71758e219652c, 0x83126e978d4fdf3c, 0xa3d70a3d70a3d70b,\n        0xcccccccccccccccd, 0x8000000000000000, 0xa000000000000000,\n        0xc800000000000000, 0xfa00000000000000, 0x9c40000000000000,\n        0xc350000000000000, 0xf424000000000000, 0x9896800000000000,\n        0xbebc200000000000, 0xee6b280000000000, 0x9502f90000000000,\n        0xba43b74000000000, 0xe8d4a51000000000, 0x9184e72a00000000,\n        0xb5e620f480000000, 0xe35fa931a0000000, 0x8e1bc9bf04000000,\n        0xb1a2bc2ec5000000, 0xde0b6b3a76400000, 0x8ac7230489e80000,\n        0xad78ebc5ac620000, 0xd8d726b7177a8000, 0x878678326eac9000,\n        0xa968163f0a57b400, 0xd3c21bcecceda100, 0x84595161401484a0,\n        0xa56fa5b99019a5c8, 0xcecb8f27f4200f3a, 0x813f3978f8940984,\n        0xa18f07d736b90be5, 0xc9f2c9cd04674ede, 0xfc6f7c4045812296,\n        0x9dc5ada82b70b59d, 0xc5371912364ce305, 0xf684df56c3e01bc6,\n        0x9a130b963a6c115c, 0xc097ce7bc90715b3, 0xf0bdc21abb48db20,\n        0x96769950b50d88f4, 0xbc143fa4e250eb31, 0xeb194f8e1ae525fd,\n        0x92efd1b8d0cf37be, 0xb7abc627050305ad, 0xe596b7b0c643c719,\n        0x8f7e32ce7bea5c6f, 0xb35dbf821ae4f38b, 0xe0352f62a19e306e};\n    return pow10_significands[k - float_info<float>::min_k];\n  }\n\n  static carrier_uint compute_mul(carrier_uint u,\n                                  const cache_entry_type& cache) FMT_NOEXCEPT {\n    return umul96_upper32(u, cache);\n  }\n\n  static uint32_t compute_delta(const cache_entry_type& cache,\n                                int beta_minus_1) FMT_NOEXCEPT {\n    return static_cast<uint32_t>(cache >> (64 - 1 - beta_minus_1));\n  }\n\n  static bool compute_mul_parity(carrier_uint two_f,\n                                 const cache_entry_type& cache,\n                                 int beta_minus_1) FMT_NOEXCEPT {\n    FMT_ASSERT(beta_minus_1 >= 1, \"\");\n    FMT_ASSERT(beta_minus_1 < 64, \"\");\n\n    return ((umul96_lower64(two_f, cache) >> (64 - beta_minus_1)) & 1) != 0;\n  }\n\n  static carrier_uint compute_left_endpoint_for_shorter_interval_case(\n      const cache_entry_type& cache, int beta_minus_1) FMT_NOEXCEPT {\n    return static_cast<carrier_uint>(\n        (cache - (cache >> (float_info<float>::significand_bits + 2))) >>\n        (64 - float_info<float>::significand_bits - 1 - beta_minus_1));\n  }\n\n  static carrier_uint compute_right_endpoint_for_shorter_interval_case(\n      const cache_entry_type& cache, int beta_minus_1) FMT_NOEXCEPT {\n    return static_cast<carrier_uint>(\n        (cache + (cache >> (float_info<float>::significand_bits + 1))) >>\n        (64 - float_info<float>::significand_bits - 1 - beta_minus_1));\n  }\n\n  static carrier_uint compute_round_up_for_shorter_interval_case(\n      const cache_entry_type& cache, int beta_minus_1) FMT_NOEXCEPT {\n    return (static_cast<carrier_uint>(\n                cache >>\n                (64 - float_info<float>::significand_bits - 2 - beta_minus_1)) +\n            1) /\n           2;\n  }\n};\n\ntemplate <> struct cache_accessor<double> {\n  using carrier_uint = float_info<double>::carrier_uint;\n  using cache_entry_type = uint128_wrapper;\n\n  static uint128_wrapper get_cached_power(int k) FMT_NOEXCEPT {\n    FMT_ASSERT(k >= float_info<double>::min_k && k <= float_info<double>::max_k,\n               \"k is out of range\");\n\n    static constexpr const uint128_wrapper pow10_significands[] = {\n#if FMT_USE_FULL_CACHE_DRAGONBOX\n      {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b},\n      {0x9faacf3df73609b1, 0x77b191618c54e9ad},\n      {0xc795830d75038c1d, 0xd59df5b9ef6a2418},\n      {0xf97ae3d0d2446f25, 0x4b0573286b44ad1e},\n      {0x9becce62836ac577, 0x4ee367f9430aec33},\n      {0xc2e801fb244576d5, 0x229c41f793cda740},\n      {0xf3a20279ed56d48a, 0x6b43527578c11110},\n      {0x9845418c345644d6, 0x830a13896b78aaaa},\n      {0xbe5691ef416bd60c, 0x23cc986bc656d554},\n      {0xedec366b11c6cb8f, 0x2cbfbe86b7ec8aa9},\n      {0x94b3a202eb1c3f39, 0x7bf7d71432f3d6aa},\n      {0xb9e08a83a5e34f07, 0xdaf5ccd93fb0cc54},\n      {0xe858ad248f5c22c9, 0xd1b3400f8f9cff69},\n      {0x91376c36d99995be, 0x23100809b9c21fa2},\n      {0xb58547448ffffb2d, 0xabd40a0c2832a78b},\n      {0xe2e69915b3fff9f9, 0x16c90c8f323f516d},\n      {0x8dd01fad907ffc3b, 0xae3da7d97f6792e4},\n      {0xb1442798f49ffb4a, 0x99cd11cfdf41779d},\n      {0xdd95317f31c7fa1d, 0x40405643d711d584},\n      {0x8a7d3eef7f1cfc52, 0x482835ea666b2573},\n      {0xad1c8eab5ee43b66, 0xda3243650005eed0},\n      {0xd863b256369d4a40, 0x90bed43e40076a83},\n      {0x873e4f75e2224e68, 0x5a7744a6e804a292},\n      {0xa90de3535aaae202, 0x711515d0a205cb37},\n      {0xd3515c2831559a83, 0x0d5a5b44ca873e04},\n      {0x8412d9991ed58091, 0xe858790afe9486c3},\n      {0xa5178fff668ae0b6, 0x626e974dbe39a873},\n      {0xce5d73ff402d98e3, 0xfb0a3d212dc81290},\n      {0x80fa687f881c7f8e, 0x7ce66634bc9d0b9a},\n      {0xa139029f6a239f72, 0x1c1fffc1ebc44e81},\n      {0xc987434744ac874e, 0xa327ffb266b56221},\n      {0xfbe9141915d7a922, 0x4bf1ff9f0062baa9},\n      {0x9d71ac8fada6c9b5, 0x6f773fc3603db4aa},\n      {0xc4ce17b399107c22, 0xcb550fb4384d21d4},\n      {0xf6019da07f549b2b, 0x7e2a53a146606a49},\n      {0x99c102844f94e0fb, 0x2eda7444cbfc426e},\n      {0xc0314325637a1939, 0xfa911155fefb5309},\n      {0xf03d93eebc589f88, 0x793555ab7eba27cb},\n      {0x96267c7535b763b5, 0x4bc1558b2f3458df},\n      {0xbbb01b9283253ca2, 0x9eb1aaedfb016f17},\n      {0xea9c227723ee8bcb, 0x465e15a979c1cadd},\n      {0x92a1958a7675175f, 0x0bfacd89ec191eca},\n      {0xb749faed14125d36, 0xcef980ec671f667c},\n      {0xe51c79a85916f484, 0x82b7e12780e7401b},\n      {0x8f31cc0937ae58d2, 0xd1b2ecb8b0908811},\n      {0xb2fe3f0b8599ef07, 0x861fa7e6dcb4aa16},\n      {0xdfbdcece67006ac9, 0x67a791e093e1d49b},\n      {0x8bd6a141006042bd, 0xe0c8bb2c5c6d24e1},\n      {0xaecc49914078536d, 0x58fae9f773886e19},\n      {0xda7f5bf590966848, 0xaf39a475506a899f},\n      {0x888f99797a5e012d, 0x6d8406c952429604},\n      {0xaab37fd7d8f58178, 0xc8e5087ba6d33b84},\n      {0xd5605fcdcf32e1d6, 0xfb1e4a9a90880a65},\n      {0x855c3be0a17fcd26, 0x5cf2eea09a550680},\n      {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f},\n      {0xd0601d8efc57b08b, 0xf13b94daf124da27},\n      {0x823c12795db6ce57, 0x76c53d08d6b70859},\n      {0xa2cb1717b52481ed, 0x54768c4b0c64ca6f},\n      {0xcb7ddcdda26da268, 0xa9942f5dcf7dfd0a},\n      {0xfe5d54150b090b02, 0xd3f93b35435d7c4d},\n      {0x9efa548d26e5a6e1, 0xc47bc5014a1a6db0},\n      {0xc6b8e9b0709f109a, 0x359ab6419ca1091c},\n      {0xf867241c8cc6d4c0, 0xc30163d203c94b63},\n      {0x9b407691d7fc44f8, 0x79e0de63425dcf1e},\n      {0xc21094364dfb5636, 0x985915fc12f542e5},\n      {0xf294b943e17a2bc4, 0x3e6f5b7b17b2939e},\n      {0x979cf3ca6cec5b5a, 0xa705992ceecf9c43},\n      {0xbd8430bd08277231, 0x50c6ff782a838354},\n      {0xece53cec4a314ebd, 0xa4f8bf5635246429},\n      {0x940f4613ae5ed136, 0x871b7795e136be9a},\n      {0xb913179899f68584, 0x28e2557b59846e40},\n      {0xe757dd7ec07426e5, 0x331aeada2fe589d0},\n      {0x9096ea6f3848984f, 0x3ff0d2c85def7622},\n      {0xb4bca50b065abe63, 0x0fed077a756b53aa},\n      {0xe1ebce4dc7f16dfb, 0xd3e8495912c62895},\n      {0x8d3360f09cf6e4bd, 0x64712dd7abbbd95d},\n      {0xb080392cc4349dec, 0xbd8d794d96aacfb4},\n      {0xdca04777f541c567, 0xecf0d7a0fc5583a1},\n      {0x89e42caaf9491b60, 0xf41686c49db57245},\n      {0xac5d37d5b79b6239, 0x311c2875c522ced6},\n      {0xd77485cb25823ac7, 0x7d633293366b828c},\n      {0x86a8d39ef77164bc, 0xae5dff9c02033198},\n      {0xa8530886b54dbdeb, 0xd9f57f830283fdfd},\n      {0xd267caa862a12d66, 0xd072df63c324fd7c},\n      {0x8380dea93da4bc60, 0x4247cb9e59f71e6e},\n      {0xa46116538d0deb78, 0x52d9be85f074e609},\n      {0xcd795be870516656, 0x67902e276c921f8c},\n      {0x806bd9714632dff6, 0x00ba1cd8a3db53b7},\n      {0xa086cfcd97bf97f3, 0x80e8a40eccd228a5},\n      {0xc8a883c0fdaf7df0, 0x6122cd128006b2ce},\n      {0xfad2a4b13d1b5d6c, 0x796b805720085f82},\n      {0x9cc3a6eec6311a63, 0xcbe3303674053bb1},\n      {0xc3f490aa77bd60fc, 0xbedbfc4411068a9d},\n      {0xf4f1b4d515acb93b, 0xee92fb5515482d45},\n      {0x991711052d8bf3c5, 0x751bdd152d4d1c4b},\n      {0xbf5cd54678eef0b6, 0xd262d45a78a0635e},\n      {0xef340a98172aace4, 0x86fb897116c87c35},\n      {0x9580869f0e7aac0e, 0xd45d35e6ae3d4da1},\n      {0xbae0a846d2195712, 0x8974836059cca10a},\n      {0xe998d258869facd7, 0x2bd1a438703fc94c},\n      {0x91ff83775423cc06, 0x7b6306a34627ddd0},\n      {0xb67f6455292cbf08, 0x1a3bc84c17b1d543},\n      {0xe41f3d6a7377eeca, 0x20caba5f1d9e4a94},\n      {0x8e938662882af53e, 0x547eb47b7282ee9d},\n      {0xb23867fb2a35b28d, 0xe99e619a4f23aa44},\n      {0xdec681f9f4c31f31, 0x6405fa00e2ec94d5},\n      {0x8b3c113c38f9f37e, 0xde83bc408dd3dd05},\n      {0xae0b158b4738705e, 0x9624ab50b148d446},\n      {0xd98ddaee19068c76, 0x3badd624dd9b0958},\n      {0x87f8a8d4cfa417c9, 0xe54ca5d70a80e5d7},\n      {0xa9f6d30a038d1dbc, 0x5e9fcf4ccd211f4d},\n      {0xd47487cc8470652b, 0x7647c32000696720},\n      {0x84c8d4dfd2c63f3b, 0x29ecd9f40041e074},\n      {0xa5fb0a17c777cf09, 0xf468107100525891},\n      {0xcf79cc9db955c2cc, 0x7182148d4066eeb5},\n      {0x81ac1fe293d599bf, 0xc6f14cd848405531},\n      {0xa21727db38cb002f, 0xb8ada00e5a506a7d},\n      {0xca9cf1d206fdc03b, 0xa6d90811f0e4851d},\n      {0xfd442e4688bd304a, 0x908f4a166d1da664},\n      {0x9e4a9cec15763e2e, 0x9a598e4e043287ff},\n      {0xc5dd44271ad3cdba, 0x40eff1e1853f29fe},\n      {0xf7549530e188c128, 0xd12bee59e68ef47d},\n      {0x9a94dd3e8cf578b9, 0x82bb74f8301958cf},\n      {0xc13a148e3032d6e7, 0xe36a52363c1faf02},\n      {0xf18899b1bc3f8ca1, 0xdc44e6c3cb279ac2},\n      {0x96f5600f15a7b7e5, 0x29ab103a5ef8c0ba},\n      {0xbcb2b812db11a5de, 0x7415d448f6b6f0e8},\n      {0xebdf661791d60f56, 0x111b495b3464ad22},\n      {0x936b9fcebb25c995, 0xcab10dd900beec35},\n      {0xb84687c269ef3bfb, 0x3d5d514f40eea743},\n      {0xe65829b3046b0afa, 0x0cb4a5a3112a5113},\n      {0x8ff71a0fe2c2e6dc, 0x47f0e785eaba72ac},\n      {0xb3f4e093db73a093, 0x59ed216765690f57},\n      {0xe0f218b8d25088b8, 0x306869c13ec3532d},\n      {0x8c974f7383725573, 0x1e414218c73a13fc},\n      {0xafbd2350644eeacf, 0xe5d1929ef90898fb},\n      {0xdbac6c247d62a583, 0xdf45f746b74abf3a},\n      {0x894bc396ce5da772, 0x6b8bba8c328eb784},\n      {0xab9eb47c81f5114f, 0x066ea92f3f326565},\n      {0xd686619ba27255a2, 0xc80a537b0efefebe},\n      {0x8613fd0145877585, 0xbd06742ce95f5f37},\n      {0xa798fc4196e952e7, 0x2c48113823b73705},\n      {0xd17f3b51fca3a7a0, 0xf75a15862ca504c6},\n      {0x82ef85133de648c4, 0x9a984d73dbe722fc},\n      {0xa3ab66580d5fdaf5, 0xc13e60d0d2e0ebbb},\n      {0xcc963fee10b7d1b3, 0x318df905079926a9},\n      {0xffbbcfe994e5c61f, 0xfdf17746497f7053},\n      {0x9fd561f1fd0f9bd3, 0xfeb6ea8bedefa634},\n      {0xc7caba6e7c5382c8, 0xfe64a52ee96b8fc1},\n      {0xf9bd690a1b68637b, 0x3dfdce7aa3c673b1},\n      {0x9c1661a651213e2d, 0x06bea10ca65c084f},\n      {0xc31bfa0fe5698db8, 0x486e494fcff30a63},\n      {0xf3e2f893dec3f126, 0x5a89dba3c3efccfb},\n      {0x986ddb5c6b3a76b7, 0xf89629465a75e01d},\n      {0xbe89523386091465, 0xf6bbb397f1135824},\n      {0xee2ba6c0678b597f, 0x746aa07ded582e2d},\n      {0x94db483840b717ef, 0xa8c2a44eb4571cdd},\n      {0xba121a4650e4ddeb, 0x92f34d62616ce414},\n      {0xe896a0d7e51e1566, 0x77b020baf9c81d18},\n      {0x915e2486ef32cd60, 0x0ace1474dc1d122f},\n      {0xb5b5ada8aaff80b8, 0x0d819992132456bb},\n      {0xe3231912d5bf60e6, 0x10e1fff697ed6c6a},\n      {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2},\n      {0xb1736b96b6fd83b3, 0xbd308ff8a6b17cb3},\n      {0xddd0467c64bce4a0, 0xac7cb3f6d05ddbdf},\n      {0x8aa22c0dbef60ee4, 0x6bcdf07a423aa96c},\n      {0xad4ab7112eb3929d, 0x86c16c98d2c953c7},\n      {0xd89d64d57a607744, 0xe871c7bf077ba8b8},\n      {0x87625f056c7c4a8b, 0x11471cd764ad4973},\n      {0xa93af6c6c79b5d2d, 0xd598e40d3dd89bd0},\n      {0xd389b47879823479, 0x4aff1d108d4ec2c4},\n      {0x843610cb4bf160cb, 0xcedf722a585139bb},\n      {0xa54394fe1eedb8fe, 0xc2974eb4ee658829},\n      {0xce947a3da6a9273e, 0x733d226229feea33},\n      {0x811ccc668829b887, 0x0806357d5a3f5260},\n      {0xa163ff802a3426a8, 0xca07c2dcb0cf26f8},\n      {0xc9bcff6034c13052, 0xfc89b393dd02f0b6},\n      {0xfc2c3f3841f17c67, 0xbbac2078d443ace3},\n      {0x9d9ba7832936edc0, 0xd54b944b84aa4c0e},\n      {0xc5029163f384a931, 0x0a9e795e65d4df12},\n      {0xf64335bcf065d37d, 0x4d4617b5ff4a16d6},\n      {0x99ea0196163fa42e, 0x504bced1bf8e4e46},\n      {0xc06481fb9bcf8d39, 0xe45ec2862f71e1d7},\n      {0xf07da27a82c37088, 0x5d767327bb4e5a4d},\n      {0x964e858c91ba2655, 0x3a6a07f8d510f870},\n      {0xbbe226efb628afea, 0x890489f70a55368c},\n      {0xeadab0aba3b2dbe5, 0x2b45ac74ccea842f},\n      {0x92c8ae6b464fc96f, 0x3b0b8bc90012929e},\n      {0xb77ada0617e3bbcb, 0x09ce6ebb40173745},\n      {0xe55990879ddcaabd, 0xcc420a6a101d0516},\n      {0x8f57fa54c2a9eab6, 0x9fa946824a12232e},\n      {0xb32df8e9f3546564, 0x47939822dc96abfa},\n      {0xdff9772470297ebd, 0x59787e2b93bc56f8},\n      {0x8bfbea76c619ef36, 0x57eb4edb3c55b65b},\n      {0xaefae51477a06b03, 0xede622920b6b23f2},\n      {0xdab99e59958885c4, 0xe95fab368e45ecee},\n      {0x88b402f7fd75539b, 0x11dbcb0218ebb415},\n      {0xaae103b5fcd2a881, 0xd652bdc29f26a11a},\n      {0xd59944a37c0752a2, 0x4be76d3346f04960},\n      {0x857fcae62d8493a5, 0x6f70a4400c562ddc},\n      {0xa6dfbd9fb8e5b88e, 0xcb4ccd500f6bb953},\n      {0xd097ad07a71f26b2, 0x7e2000a41346a7a8},\n      {0x825ecc24c873782f, 0x8ed400668c0c28c9},\n      {0xa2f67f2dfa90563b, 0x728900802f0f32fb},\n      {0xcbb41ef979346bca, 0x4f2b40a03ad2ffba},\n      {0xfea126b7d78186bc, 0xe2f610c84987bfa9},\n      {0x9f24b832e6b0f436, 0x0dd9ca7d2df4d7ca},\n      {0xc6ede63fa05d3143, 0x91503d1c79720dbc},\n      {0xf8a95fcf88747d94, 0x75a44c6397ce912b},\n      {0x9b69dbe1b548ce7c, 0xc986afbe3ee11abb},\n      {0xc24452da229b021b, 0xfbe85badce996169},\n      {0xf2d56790ab41c2a2, 0xfae27299423fb9c4},\n      {0x97c560ba6b0919a5, 0xdccd879fc967d41b},\n      {0xbdb6b8e905cb600f, 0x5400e987bbc1c921},\n      {0xed246723473e3813, 0x290123e9aab23b69},\n      {0x9436c0760c86e30b, 0xf9a0b6720aaf6522},\n      {0xb94470938fa89bce, 0xf808e40e8d5b3e6a},\n      {0xe7958cb87392c2c2, 0xb60b1d1230b20e05},\n      {0x90bd77f3483bb9b9, 0xb1c6f22b5e6f48c3},\n      {0xb4ecd5f01a4aa828, 0x1e38aeb6360b1af4},\n      {0xe2280b6c20dd5232, 0x25c6da63c38de1b1},\n      {0x8d590723948a535f, 0x579c487e5a38ad0f},\n      {0xb0af48ec79ace837, 0x2d835a9df0c6d852},\n      {0xdcdb1b2798182244, 0xf8e431456cf88e66},\n      {0x8a08f0f8bf0f156b, 0x1b8e9ecb641b5900},\n      {0xac8b2d36eed2dac5, 0xe272467e3d222f40},\n      {0xd7adf884aa879177, 0x5b0ed81dcc6abb10},\n      {0x86ccbb52ea94baea, 0x98e947129fc2b4ea},\n      {0xa87fea27a539e9a5, 0x3f2398d747b36225},\n      {0xd29fe4b18e88640e, 0x8eec7f0d19a03aae},\n      {0x83a3eeeef9153e89, 0x1953cf68300424ad},\n      {0xa48ceaaab75a8e2b, 0x5fa8c3423c052dd8},\n      {0xcdb02555653131b6, 0x3792f412cb06794e},\n      {0x808e17555f3ebf11, 0xe2bbd88bbee40bd1},\n      {0xa0b19d2ab70e6ed6, 0x5b6aceaeae9d0ec5},\n      {0xc8de047564d20a8b, 0xf245825a5a445276},\n      {0xfb158592be068d2e, 0xeed6e2f0f0d56713},\n      {0x9ced737bb6c4183d, 0x55464dd69685606c},\n      {0xc428d05aa4751e4c, 0xaa97e14c3c26b887},\n      {0xf53304714d9265df, 0xd53dd99f4b3066a9},\n      {0x993fe2c6d07b7fab, 0xe546a8038efe402a},\n      {0xbf8fdb78849a5f96, 0xde98520472bdd034},\n      {0xef73d256a5c0f77c, 0x963e66858f6d4441},\n      {0x95a8637627989aad, 0xdde7001379a44aa9},\n      {0xbb127c53b17ec159, 0x5560c018580d5d53},\n      {0xe9d71b689dde71af, 0xaab8f01e6e10b4a7},\n      {0x9226712162ab070d, 0xcab3961304ca70e9},\n      {0xb6b00d69bb55c8d1, 0x3d607b97c5fd0d23},\n      {0xe45c10c42a2b3b05, 0x8cb89a7db77c506b},\n      {0x8eb98a7a9a5b04e3, 0x77f3608e92adb243},\n      {0xb267ed1940f1c61c, 0x55f038b237591ed4},\n      {0xdf01e85f912e37a3, 0x6b6c46dec52f6689},\n      {0x8b61313bbabce2c6, 0x2323ac4b3b3da016},\n      {0xae397d8aa96c1b77, 0xabec975e0a0d081b},\n      {0xd9c7dced53c72255, 0x96e7bd358c904a22},\n      {0x881cea14545c7575, 0x7e50d64177da2e55},\n      {0xaa242499697392d2, 0xdde50bd1d5d0b9ea},\n      {0xd4ad2dbfc3d07787, 0x955e4ec64b44e865},\n      {0x84ec3c97da624ab4, 0xbd5af13bef0b113f},\n      {0xa6274bbdd0fadd61, 0xecb1ad8aeacdd58f},\n      {0xcfb11ead453994ba, 0x67de18eda5814af3},\n      {0x81ceb32c4b43fcf4, 0x80eacf948770ced8},\n      {0xa2425ff75e14fc31, 0xa1258379a94d028e},\n      {0xcad2f7f5359a3b3e, 0x096ee45813a04331},\n      {0xfd87b5f28300ca0d, 0x8bca9d6e188853fd},\n      {0x9e74d1b791e07e48, 0x775ea264cf55347e},\n      {0xc612062576589dda, 0x95364afe032a819e},\n      {0xf79687aed3eec551, 0x3a83ddbd83f52205},\n      {0x9abe14cd44753b52, 0xc4926a9672793543},\n      {0xc16d9a0095928a27, 0x75b7053c0f178294},\n      {0xf1c90080baf72cb1, 0x5324c68b12dd6339},\n      {0x971da05074da7bee, 0xd3f6fc16ebca5e04},\n      {0xbce5086492111aea, 0x88f4bb1ca6bcf585},\n      {0xec1e4a7db69561a5, 0x2b31e9e3d06c32e6},\n      {0x9392ee8e921d5d07, 0x3aff322e62439fd0},\n      {0xb877aa3236a4b449, 0x09befeb9fad487c3},\n      {0xe69594bec44de15b, 0x4c2ebe687989a9b4},\n      {0x901d7cf73ab0acd9, 0x0f9d37014bf60a11},\n      {0xb424dc35095cd80f, 0x538484c19ef38c95},\n      {0xe12e13424bb40e13, 0x2865a5f206b06fba},\n      {0x8cbccc096f5088cb, 0xf93f87b7442e45d4},\n      {0xafebff0bcb24aafe, 0xf78f69a51539d749},\n      {0xdbe6fecebdedd5be, 0xb573440e5a884d1c},\n      {0x89705f4136b4a597, 0x31680a88f8953031},\n      {0xabcc77118461cefc, 0xfdc20d2b36ba7c3e},\n      {0xd6bf94d5e57a42bc, 0x3d32907604691b4d},\n      {0x8637bd05af6c69b5, 0xa63f9a49c2c1b110},\n      {0xa7c5ac471b478423, 0x0fcf80dc33721d54},\n      {0xd1b71758e219652b, 0xd3c36113404ea4a9},\n      {0x83126e978d4fdf3b, 0x645a1cac083126ea},\n      {0xa3d70a3d70a3d70a, 0x3d70a3d70a3d70a4},\n      {0xcccccccccccccccc, 0xcccccccccccccccd},\n      {0x8000000000000000, 0x0000000000000000},\n      {0xa000000000000000, 0x0000000000000000},\n      {0xc800000000000000, 0x0000000000000000},\n      {0xfa00000000000000, 0x0000000000000000},\n      {0x9c40000000000000, 0x0000000000000000},\n      {0xc350000000000000, 0x0000000000000000},\n      {0xf424000000000000, 0x0000000000000000},\n      {0x9896800000000000, 0x0000000000000000},\n      {0xbebc200000000000, 0x0000000000000000},\n      {0xee6b280000000000, 0x0000000000000000},\n      {0x9502f90000000000, 0x0000000000000000},\n      {0xba43b74000000000, 0x0000000000000000},\n      {0xe8d4a51000000000, 0x0000000000000000},\n      {0x9184e72a00000000, 0x0000000000000000},\n      {0xb5e620f480000000, 0x0000000000000000},\n      {0xe35fa931a0000000, 0x0000000000000000},\n      {0x8e1bc9bf04000000, 0x0000000000000000},\n      {0xb1a2bc2ec5000000, 0x0000000000000000},\n      {0xde0b6b3a76400000, 0x0000000000000000},\n      {0x8ac7230489e80000, 0x0000000000000000},\n      {0xad78ebc5ac620000, 0x0000000000000000},\n      {0xd8d726b7177a8000, 0x0000000000000000},\n      {0x878678326eac9000, 0x0000000000000000},\n      {0xa968163f0a57b400, 0x0000000000000000},\n      {0xd3c21bcecceda100, 0x0000000000000000},\n      {0x84595161401484a0, 0x0000000000000000},\n      {0xa56fa5b99019a5c8, 0x0000000000000000},\n      {0xcecb8f27f4200f3a, 0x0000000000000000},\n      {0x813f3978f8940984, 0x4000000000000000},\n      {0xa18f07d736b90be5, 0x5000000000000000},\n      {0xc9f2c9cd04674ede, 0xa400000000000000},\n      {0xfc6f7c4045812296, 0x4d00000000000000},\n      {0x9dc5ada82b70b59d, 0xf020000000000000},\n      {0xc5371912364ce305, 0x6c28000000000000},\n      {0xf684df56c3e01bc6, 0xc732000000000000},\n      {0x9a130b963a6c115c, 0x3c7f400000000000},\n      {0xc097ce7bc90715b3, 0x4b9f100000000000},\n      {0xf0bdc21abb48db20, 0x1e86d40000000000},\n      {0x96769950b50d88f4, 0x1314448000000000},\n      {0xbc143fa4e250eb31, 0x17d955a000000000},\n      {0xeb194f8e1ae525fd, 0x5dcfab0800000000},\n      {0x92efd1b8d0cf37be, 0x5aa1cae500000000},\n      {0xb7abc627050305ad, 0xf14a3d9e40000000},\n      {0xe596b7b0c643c719, 0x6d9ccd05d0000000},\n      {0x8f7e32ce7bea5c6f, 0xe4820023a2000000},\n      {0xb35dbf821ae4f38b, 0xdda2802c8a800000},\n      {0xe0352f62a19e306e, 0xd50b2037ad200000},\n      {0x8c213d9da502de45, 0x4526f422cc340000},\n      {0xaf298d050e4395d6, 0x9670b12b7f410000},\n      {0xdaf3f04651d47b4c, 0x3c0cdd765f114000},\n      {0x88d8762bf324cd0f, 0xa5880a69fb6ac800},\n      {0xab0e93b6efee0053, 0x8eea0d047a457a00},\n      {0xd5d238a4abe98068, 0x72a4904598d6d880},\n      {0x85a36366eb71f041, 0x47a6da2b7f864750},\n      {0xa70c3c40a64e6c51, 0x999090b65f67d924},\n      {0xd0cf4b50cfe20765, 0xfff4b4e3f741cf6d},\n      {0x82818f1281ed449f, 0xbff8f10e7a8921a4},\n      {0xa321f2d7226895c7, 0xaff72d52192b6a0d},\n      {0xcbea6f8ceb02bb39, 0x9bf4f8a69f764490},\n      {0xfee50b7025c36a08, 0x02f236d04753d5b4},\n      {0x9f4f2726179a2245, 0x01d762422c946590},\n      {0xc722f0ef9d80aad6, 0x424d3ad2b7b97ef5},\n      {0xf8ebad2b84e0d58b, 0xd2e0898765a7deb2},\n      {0x9b934c3b330c8577, 0x63cc55f49f88eb2f},\n      {0xc2781f49ffcfa6d5, 0x3cbf6b71c76b25fb},\n      {0xf316271c7fc3908a, 0x8bef464e3945ef7a},\n      {0x97edd871cfda3a56, 0x97758bf0e3cbb5ac},\n      {0xbde94e8e43d0c8ec, 0x3d52eeed1cbea317},\n      {0xed63a231d4c4fb27, 0x4ca7aaa863ee4bdd},\n      {0x945e455f24fb1cf8, 0x8fe8caa93e74ef6a},\n      {0xb975d6b6ee39e436, 0xb3e2fd538e122b44},\n      {0xe7d34c64a9c85d44, 0x60dbbca87196b616},\n      {0x90e40fbeea1d3a4a, 0xbc8955e946fe31cd},\n      {0xb51d13aea4a488dd, 0x6babab6398bdbe41},\n      {0xe264589a4dcdab14, 0xc696963c7eed2dd1},\n      {0x8d7eb76070a08aec, 0xfc1e1de5cf543ca2},\n      {0xb0de65388cc8ada8, 0x3b25a55f43294bcb},\n      {0xdd15fe86affad912, 0x49ef0eb713f39ebe},\n      {0x8a2dbf142dfcc7ab, 0x6e3569326c784337},\n      {0xacb92ed9397bf996, 0x49c2c37f07965404},\n      {0xd7e77a8f87daf7fb, 0xdc33745ec97be906},\n      {0x86f0ac99b4e8dafd, 0x69a028bb3ded71a3},\n      {0xa8acd7c0222311bc, 0xc40832ea0d68ce0c},\n      {0xd2d80db02aabd62b, 0xf50a3fa490c30190},\n      {0x83c7088e1aab65db, 0x792667c6da79e0fa},\n      {0xa4b8cab1a1563f52, 0x577001b891185938},\n      {0xcde6fd5e09abcf26, 0xed4c0226b55e6f86},\n      {0x80b05e5ac60b6178, 0x544f8158315b05b4},\n      {0xa0dc75f1778e39d6, 0x696361ae3db1c721},\n      {0xc913936dd571c84c, 0x03bc3a19cd1e38e9},\n      {0xfb5878494ace3a5f, 0x04ab48a04065c723},\n      {0x9d174b2dcec0e47b, 0x62eb0d64283f9c76},\n      {0xc45d1df942711d9a, 0x3ba5d0bd324f8394},\n      {0xf5746577930d6500, 0xca8f44ec7ee36479},\n      {0x9968bf6abbe85f20, 0x7e998b13cf4e1ecb},\n      {0xbfc2ef456ae276e8, 0x9e3fedd8c321a67e},\n      {0xefb3ab16c59b14a2, 0xc5cfe94ef3ea101e},\n      {0x95d04aee3b80ece5, 0xbba1f1d158724a12},\n      {0xbb445da9ca61281f, 0x2a8a6e45ae8edc97},\n      {0xea1575143cf97226, 0xf52d09d71a3293bd},\n      {0x924d692ca61be758, 0x593c2626705f9c56},\n      {0xb6e0c377cfa2e12e, 0x6f8b2fb00c77836c},\n      {0xe498f455c38b997a, 0x0b6dfb9c0f956447},\n      {0x8edf98b59a373fec, 0x4724bd4189bd5eac},\n      {0xb2977ee300c50fe7, 0x58edec91ec2cb657},\n      {0xdf3d5e9bc0f653e1, 0x2f2967b66737e3ed},\n      {0x8b865b215899f46c, 0xbd79e0d20082ee74},\n      {0xae67f1e9aec07187, 0xecd8590680a3aa11},\n      {0xda01ee641a708de9, 0xe80e6f4820cc9495},\n      {0x884134fe908658b2, 0x3109058d147fdcdd},\n      {0xaa51823e34a7eede, 0xbd4b46f0599fd415},\n      {0xd4e5e2cdc1d1ea96, 0x6c9e18ac7007c91a},\n      {0x850fadc09923329e, 0x03e2cf6bc604ddb0},\n      {0xa6539930bf6bff45, 0x84db8346b786151c},\n      {0xcfe87f7cef46ff16, 0xe612641865679a63},\n      {0x81f14fae158c5f6e, 0x4fcb7e8f3f60c07e},\n      {0xa26da3999aef7749, 0xe3be5e330f38f09d},\n      {0xcb090c8001ab551c, 0x5cadf5bfd3072cc5},\n      {0xfdcb4fa002162a63, 0x73d9732fc7c8f7f6},\n      {0x9e9f11c4014dda7e, 0x2867e7fddcdd9afa},\n      {0xc646d63501a1511d, 0xb281e1fd541501b8},\n      {0xf7d88bc24209a565, 0x1f225a7ca91a4226},\n      {0x9ae757596946075f, 0x3375788de9b06958},\n      {0xc1a12d2fc3978937, 0x0052d6b1641c83ae},\n      {0xf209787bb47d6b84, 0xc0678c5dbd23a49a},\n      {0x9745eb4d50ce6332, 0xf840b7ba963646e0},\n      {0xbd176620a501fbff, 0xb650e5a93bc3d898},\n      {0xec5d3fa8ce427aff, 0xa3e51f138ab4cebe},\n      {0x93ba47c980e98cdf, 0xc66f336c36b10137},\n      {0xb8a8d9bbe123f017, 0xb80b0047445d4184},\n      {0xe6d3102ad96cec1d, 0xa60dc059157491e5},\n      {0x9043ea1ac7e41392, 0x87c89837ad68db2f},\n      {0xb454e4a179dd1877, 0x29babe4598c311fb},\n      {0xe16a1dc9d8545e94, 0xf4296dd6fef3d67a},\n      {0x8ce2529e2734bb1d, 0x1899e4a65f58660c},\n      {0xb01ae745b101e9e4, 0x5ec05dcff72e7f8f},\n      {0xdc21a1171d42645d, 0x76707543f4fa1f73},\n      {0x899504ae72497eba, 0x6a06494a791c53a8},\n      {0xabfa45da0edbde69, 0x0487db9d17636892},\n      {0xd6f8d7509292d603, 0x45a9d2845d3c42b6},\n      {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b2},\n      {0xa7f26836f282b732, 0x8e6cac7768d7141e},\n      {0xd1ef0244af2364ff, 0x3207d795430cd926},\n      {0x8335616aed761f1f, 0x7f44e6bd49e807b8},\n      {0xa402b9c5a8d3a6e7, 0x5f16206c9c6209a6},\n      {0xcd036837130890a1, 0x36dba887c37a8c0f},\n      {0x802221226be55a64, 0xc2494954da2c9789},\n      {0xa02aa96b06deb0fd, 0xf2db9baa10b7bd6c},\n      {0xc83553c5c8965d3d, 0x6f92829494e5acc7},\n      {0xfa42a8b73abbf48c, 0xcb772339ba1f17f9},\n      {0x9c69a97284b578d7, 0xff2a760414536efb},\n      {0xc38413cf25e2d70d, 0xfef5138519684aba},\n      {0xf46518c2ef5b8cd1, 0x7eb258665fc25d69},\n      {0x98bf2f79d5993802, 0xef2f773ffbd97a61},\n      {0xbeeefb584aff8603, 0xaafb550ffacfd8fa},\n      {0xeeaaba2e5dbf6784, 0x95ba2a53f983cf38},\n      {0x952ab45cfa97a0b2, 0xdd945a747bf26183},\n      {0xba756174393d88df, 0x94f971119aeef9e4},\n      {0xe912b9d1478ceb17, 0x7a37cd5601aab85d},\n      {0x91abb422ccb812ee, 0xac62e055c10ab33a},\n      {0xb616a12b7fe617aa, 0x577b986b314d6009},\n      {0xe39c49765fdf9d94, 0xed5a7e85fda0b80b},\n      {0x8e41ade9fbebc27d, 0x14588f13be847307},\n      {0xb1d219647ae6b31c, 0x596eb2d8ae258fc8},\n      {0xde469fbd99a05fe3, 0x6fca5f8ed9aef3bb},\n      {0x8aec23d680043bee, 0x25de7bb9480d5854},\n      {0xada72ccc20054ae9, 0xaf561aa79a10ae6a},\n      {0xd910f7ff28069da4, 0x1b2ba1518094da04},\n      {0x87aa9aff79042286, 0x90fb44d2f05d0842},\n      {0xa99541bf57452b28, 0x353a1607ac744a53},\n      {0xd3fa922f2d1675f2, 0x42889b8997915ce8},\n      {0x847c9b5d7c2e09b7, 0x69956135febada11},\n      {0xa59bc234db398c25, 0x43fab9837e699095},\n      {0xcf02b2c21207ef2e, 0x94f967e45e03f4bb},\n      {0x8161afb94b44f57d, 0x1d1be0eebac278f5},\n      {0xa1ba1ba79e1632dc, 0x6462d92a69731732},\n      {0xca28a291859bbf93, 0x7d7b8f7503cfdcfe},\n      {0xfcb2cb35e702af78, 0x5cda735244c3d43e},\n      {0x9defbf01b061adab, 0x3a0888136afa64a7},\n      {0xc56baec21c7a1916, 0x088aaa1845b8fdd0},\n      {0xf6c69a72a3989f5b, 0x8aad549e57273d45},\n      {0x9a3c2087a63f6399, 0x36ac54e2f678864b},\n      {0xc0cb28a98fcf3c7f, 0x84576a1bb416a7dd},\n      {0xf0fdf2d3f3c30b9f, 0x656d44a2a11c51d5},\n      {0x969eb7c47859e743, 0x9f644ae5a4b1b325},\n      {0xbc4665b596706114, 0x873d5d9f0dde1fee},\n      {0xeb57ff22fc0c7959, 0xa90cb506d155a7ea},\n      {0x9316ff75dd87cbd8, 0x09a7f12442d588f2},\n      {0xb7dcbf5354e9bece, 0x0c11ed6d538aeb2f},\n      {0xe5d3ef282a242e81, 0x8f1668c8a86da5fa},\n      {0x8fa475791a569d10, 0xf96e017d694487bc},\n      {0xb38d92d760ec4455, 0x37c981dcc395a9ac},\n      {0xe070f78d3927556a, 0x85bbe253f47b1417},\n      {0x8c469ab843b89562, 0x93956d7478ccec8e},\n      {0xaf58416654a6babb, 0x387ac8d1970027b2},\n      {0xdb2e51bfe9d0696a, 0x06997b05fcc0319e},\n      {0x88fcf317f22241e2, 0x441fece3bdf81f03},\n      {0xab3c2fddeeaad25a, 0xd527e81cad7626c3},\n      {0xd60b3bd56a5586f1, 0x8a71e223d8d3b074},\n      {0x85c7056562757456, 0xf6872d5667844e49},\n      {0xa738c6bebb12d16c, 0xb428f8ac016561db},\n      {0xd106f86e69d785c7, 0xe13336d701beba52},\n      {0x82a45b450226b39c, 0xecc0024661173473},\n      {0xa34d721642b06084, 0x27f002d7f95d0190},\n      {0xcc20ce9bd35c78a5, 0x31ec038df7b441f4},\n      {0xff290242c83396ce, 0x7e67047175a15271},\n      {0x9f79a169bd203e41, 0x0f0062c6e984d386},\n      {0xc75809c42c684dd1, 0x52c07b78a3e60868},\n      {0xf92e0c3537826145, 0xa7709a56ccdf8a82},\n      {0x9bbcc7a142b17ccb, 0x88a66076400bb691},\n      {0xc2abf989935ddbfe, 0x6acff893d00ea435},\n      {0xf356f7ebf83552fe, 0x0583f6b8c4124d43},\n      {0x98165af37b2153de, 0xc3727a337a8b704a},\n      {0xbe1bf1b059e9a8d6, 0x744f18c0592e4c5c},\n      {0xeda2ee1c7064130c, 0x1162def06f79df73},\n      {0x9485d4d1c63e8be7, 0x8addcb5645ac2ba8},\n      {0xb9a74a0637ce2ee1, 0x6d953e2bd7173692},\n      {0xe8111c87c5c1ba99, 0xc8fa8db6ccdd0437},\n      {0x910ab1d4db9914a0, 0x1d9c9892400a22a2},\n      {0xb54d5e4a127f59c8, 0x2503beb6d00cab4b},\n      {0xe2a0b5dc971f303a, 0x2e44ae64840fd61d},\n      {0x8da471a9de737e24, 0x5ceaecfed289e5d2},\n      {0xb10d8e1456105dad, 0x7425a83e872c5f47},\n      {0xdd50f1996b947518, 0xd12f124e28f77719},\n      {0x8a5296ffe33cc92f, 0x82bd6b70d99aaa6f},\n      {0xace73cbfdc0bfb7b, 0x636cc64d1001550b},\n      {0xd8210befd30efa5a, 0x3c47f7e05401aa4e},\n      {0x8714a775e3e95c78, 0x65acfaec34810a71},\n      {0xa8d9d1535ce3b396, 0x7f1839a741a14d0d},\n      {0xd31045a8341ca07c, 0x1ede48111209a050},\n      {0x83ea2b892091e44d, 0x934aed0aab460432},\n      {0xa4e4b66b68b65d60, 0xf81da84d5617853f},\n      {0xce1de40642e3f4b9, 0x36251260ab9d668e},\n      {0x80d2ae83e9ce78f3, 0xc1d72b7c6b426019},\n      {0xa1075a24e4421730, 0xb24cf65b8612f81f},\n      {0xc94930ae1d529cfc, 0xdee033f26797b627},\n      {0xfb9b7cd9a4a7443c, 0x169840ef017da3b1},\n      {0x9d412e0806e88aa5, 0x8e1f289560ee864e},\n      {0xc491798a08a2ad4e, 0xf1a6f2bab92a27e2},\n      {0xf5b5d7ec8acb58a2, 0xae10af696774b1db},\n      {0x9991a6f3d6bf1765, 0xacca6da1e0a8ef29},\n      {0xbff610b0cc6edd3f, 0x17fd090a58d32af3},\n      {0xeff394dcff8a948e, 0xddfc4b4cef07f5b0},\n      {0x95f83d0a1fb69cd9, 0x4abdaf101564f98e},\n      {0xbb764c4ca7a4440f, 0x9d6d1ad41abe37f1},\n      {0xea53df5fd18d5513, 0x84c86189216dc5ed},\n      {0x92746b9be2f8552c, 0x32fd3cf5b4e49bb4},\n      {0xb7118682dbb66a77, 0x3fbc8c33221dc2a1},\n      {0xe4d5e82392a40515, 0x0fabaf3feaa5334a},\n      {0x8f05b1163ba6832d, 0x29cb4d87f2a7400e},\n      {0xb2c71d5bca9023f8, 0x743e20e9ef511012},\n      {0xdf78e4b2bd342cf6, 0x914da9246b255416},\n      {0x8bab8eefb6409c1a, 0x1ad089b6c2f7548e},\n      {0xae9672aba3d0c320, 0xa184ac2473b529b1},\n      {0xda3c0f568cc4f3e8, 0xc9e5d72d90a2741e},\n      {0x8865899617fb1871, 0x7e2fa67c7a658892},\n      {0xaa7eebfb9df9de8d, 0xddbb901b98feeab7},\n      {0xd51ea6fa85785631, 0x552a74227f3ea565},\n      {0x8533285c936b35de, 0xd53a88958f87275f},\n      {0xa67ff273b8460356, 0x8a892abaf368f137},\n      {0xd01fef10a657842c, 0x2d2b7569b0432d85},\n      {0x8213f56a67f6b29b, 0x9c3b29620e29fc73},\n      {0xa298f2c501f45f42, 0x8349f3ba91b47b8f},\n      {0xcb3f2f7642717713, 0x241c70a936219a73},\n      {0xfe0efb53d30dd4d7, 0xed238cd383aa0110},\n      {0x9ec95d1463e8a506, 0xf4363804324a40aa},\n      {0xc67bb4597ce2ce48, 0xb143c6053edcd0d5},\n      {0xf81aa16fdc1b81da, 0xdd94b7868e94050a},\n      {0x9b10a4e5e9913128, 0xca7cf2b4191c8326},\n      {0xc1d4ce1f63f57d72, 0xfd1c2f611f63a3f0},\n      {0xf24a01a73cf2dccf, 0xbc633b39673c8cec},\n      {0x976e41088617ca01, 0xd5be0503e085d813},\n      {0xbd49d14aa79dbc82, 0x4b2d8644d8a74e18},\n      {0xec9c459d51852ba2, 0xddf8e7d60ed1219e},\n      {0x93e1ab8252f33b45, 0xcabb90e5c942b503},\n      {0xb8da1662e7b00a17, 0x3d6a751f3b936243},\n      {0xe7109bfba19c0c9d, 0x0cc512670a783ad4},\n      {0x906a617d450187e2, 0x27fb2b80668b24c5},\n      {0xb484f9dc9641e9da, 0xb1f9f660802dedf6},\n      {0xe1a63853bbd26451, 0x5e7873f8a0396973},\n      {0x8d07e33455637eb2, 0xdb0b487b6423e1e8},\n      {0xb049dc016abc5e5f, 0x91ce1a9a3d2cda62},\n      {0xdc5c5301c56b75f7, 0x7641a140cc7810fb},\n      {0x89b9b3e11b6329ba, 0xa9e904c87fcb0a9d},\n      {0xac2820d9623bf429, 0x546345fa9fbdcd44},\n      {0xd732290fbacaf133, 0xa97c177947ad4095},\n      {0x867f59a9d4bed6c0, 0x49ed8eabcccc485d},\n      {0xa81f301449ee8c70, 0x5c68f256bfff5a74},\n      {0xd226fc195c6a2f8c, 0x73832eec6fff3111},\n      {0x83585d8fd9c25db7, 0xc831fd53c5ff7eab},\n      {0xa42e74f3d032f525, 0xba3e7ca8b77f5e55},\n      {0xcd3a1230c43fb26f, 0x28ce1bd2e55f35eb},\n      {0x80444b5e7aa7cf85, 0x7980d163cf5b81b3},\n      {0xa0555e361951c366, 0xd7e105bcc332621f},\n      {0xc86ab5c39fa63440, 0x8dd9472bf3fefaa7},\n      {0xfa856334878fc150, 0xb14f98f6f0feb951},\n      {0x9c935e00d4b9d8d2, 0x6ed1bf9a569f33d3},\n      {0xc3b8358109e84f07, 0x0a862f80ec4700c8},\n      {0xf4a642e14c6262c8, 0xcd27bb612758c0fa},\n      {0x98e7e9cccfbd7dbd, 0x8038d51cb897789c},\n      {0xbf21e44003acdd2c, 0xe0470a63e6bd56c3},\n      {0xeeea5d5004981478, 0x1858ccfce06cac74},\n      {0x95527a5202df0ccb, 0x0f37801e0c43ebc8},\n      {0xbaa718e68396cffd, 0xd30560258f54e6ba},\n      {0xe950df20247c83fd, 0x47c6b82ef32a2069},\n      {0x91d28b7416cdd27e, 0x4cdc331d57fa5441},\n      {0xb6472e511c81471d, 0xe0133fe4adf8e952},\n      {0xe3d8f9e563a198e5, 0x58180fddd97723a6},\n      {0x8e679c2f5e44ff8f, 0x570f09eaa7ea7648},\n      {0xb201833b35d63f73, 0x2cd2cc6551e513da},\n      {0xde81e40a034bcf4f, 0xf8077f7ea65e58d1},\n      {0x8b112e86420f6191, 0xfb04afaf27faf782},\n      {0xadd57a27d29339f6, 0x79c5db9af1f9b563},\n      {0xd94ad8b1c7380874, 0x18375281ae7822bc},\n      {0x87cec76f1c830548, 0x8f2293910d0b15b5},\n      {0xa9c2794ae3a3c69a, 0xb2eb3875504ddb22},\n      {0xd433179d9c8cb841, 0x5fa60692a46151eb},\n      {0x849feec281d7f328, 0xdbc7c41ba6bcd333},\n      {0xa5c7ea73224deff3, 0x12b9b522906c0800},\n      {0xcf39e50feae16bef, 0xd768226b34870a00},\n      {0x81842f29f2cce375, 0xe6a1158300d46640},\n      {0xa1e53af46f801c53, 0x60495ae3c1097fd0},\n      {0xca5e89b18b602368, 0x385bb19cb14bdfc4},\n      {0xfcf62c1dee382c42, 0x46729e03dd9ed7b5},\n      {0x9e19db92b4e31ba9, 0x6c07a2c26a8346d1},\n      {0xc5a05277621be293, 0xc7098b7305241885},\n      { 0xf70867153aa2db38,\n        0xb8cbee4fc66d1ea7 }\n#else\n      {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b},\n      {0xce5d73ff402d98e3, 0xfb0a3d212dc81290},\n      {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f},\n      {0x86a8d39ef77164bc, 0xae5dff9c02033198},\n      {0xd98ddaee19068c76, 0x3badd624dd9b0958},\n      {0xafbd2350644eeacf, 0xe5d1929ef90898fb},\n      {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2},\n      {0xe55990879ddcaabd, 0xcc420a6a101d0516},\n      {0xb94470938fa89bce, 0xf808e40e8d5b3e6a},\n      {0x95a8637627989aad, 0xdde7001379a44aa9},\n      {0xf1c90080baf72cb1, 0x5324c68b12dd6339},\n      {0xc350000000000000, 0x0000000000000000},\n      {0x9dc5ada82b70b59d, 0xf020000000000000},\n      {0xfee50b7025c36a08, 0x02f236d04753d5b4},\n      {0xcde6fd5e09abcf26, 0xed4c0226b55e6f86},\n      {0xa6539930bf6bff45, 0x84db8346b786151c},\n      {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b2},\n      {0xd910f7ff28069da4, 0x1b2ba1518094da04},\n      {0xaf58416654a6babb, 0x387ac8d1970027b2},\n      {0x8da471a9de737e24, 0x5ceaecfed289e5d2},\n      {0xe4d5e82392a40515, 0x0fabaf3feaa5334a},\n      {0xb8da1662e7b00a17, 0x3d6a751f3b936243},\n      { 0x95527a5202df0ccb,\n        0x0f37801e0c43ebc8 }\n#endif\n    };\n\n#if FMT_USE_FULL_CACHE_DRAGONBOX\n    return pow10_significands[k - float_info<double>::min_k];\n#else\n    static constexpr const uint64_t powers_of_5_64[] = {\n        0x0000000000000001, 0x0000000000000005, 0x0000000000000019,\n        0x000000000000007d, 0x0000000000000271, 0x0000000000000c35,\n        0x0000000000003d09, 0x000000000001312d, 0x000000000005f5e1,\n        0x00000000001dcd65, 0x00000000009502f9, 0x0000000002e90edd,\n        0x000000000e8d4a51, 0x0000000048c27395, 0x000000016bcc41e9,\n        0x000000071afd498d, 0x0000002386f26fc1, 0x000000b1a2bc2ec5,\n        0x000003782dace9d9, 0x00001158e460913d, 0x000056bc75e2d631,\n        0x0001b1ae4d6e2ef5, 0x000878678326eac9, 0x002a5a058fc295ed,\n        0x00d3c21bcecceda1, 0x0422ca8b0a00a425, 0x14adf4b7320334b9};\n\n    static constexpr const uint32_t pow10_recovery_errors[] = {\n        0x50001400, 0x54044100, 0x54014555, 0x55954415, 0x54115555, 0x00000001,\n        0x50000000, 0x00104000, 0x54010004, 0x05004001, 0x55555544, 0x41545555,\n        0x54040551, 0x15445545, 0x51555514, 0x10000015, 0x00101100, 0x01100015,\n        0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04450514, 0x45414110,\n        0x55555145, 0x50544050, 0x15040155, 0x11054140, 0x50111514, 0x11451454,\n        0x00400541, 0x00000000, 0x55555450, 0x10056551, 0x10054011, 0x55551014,\n        0x69514555, 0x05151109, 0x00155555};\n\n    static const int compression_ratio = 27;\n\n    // Compute base index.\n    int cache_index = (k - float_info<double>::min_k) / compression_ratio;\n    int kb = cache_index * compression_ratio + float_info<double>::min_k;\n    int offset = k - kb;\n\n    // Get base cache.\n    uint128_wrapper base_cache = pow10_significands[cache_index];\n    if (offset == 0) return base_cache;\n\n    // Compute the required amount of bit-shift.\n    int alpha = floor_log2_pow10(kb + offset) - floor_log2_pow10(kb) - offset;\n    FMT_ASSERT(alpha > 0 && alpha < 64, \"shifting error detected\");\n\n    // Try to recover the real cache.\n    uint64_t pow5 = powers_of_5_64[offset];\n    uint128_wrapper recovered_cache = umul128(base_cache.high(), pow5);\n    uint128_wrapper middle_low =\n        umul128(base_cache.low() - (kb < 0 ? 1u : 0u), pow5);\n\n    recovered_cache += middle_low.high();\n\n    uint64_t high_to_middle = recovered_cache.high() << (64 - alpha);\n    uint64_t middle_to_low = recovered_cache.low() << (64 - alpha);\n\n    recovered_cache =\n        uint128_wrapper{(recovered_cache.low() >> alpha) | high_to_middle,\n                        ((middle_low.low() >> alpha) | middle_to_low)};\n\n    if (kb < 0) recovered_cache += 1;\n\n    // Get error.\n    int error_idx = (k - float_info<double>::min_k) / 16;\n    uint32_t error = (pow10_recovery_errors[error_idx] >>\n                      ((k - float_info<double>::min_k) % 16) * 2) &\n                     0x3;\n\n    // Add the error back.\n    FMT_ASSERT(recovered_cache.low() + error >= recovered_cache.low(), \"\");\n    return {recovered_cache.high(), recovered_cache.low() + error};\n#endif\n  }\n\n  static carrier_uint compute_mul(carrier_uint u,\n                                  const cache_entry_type& cache) FMT_NOEXCEPT {\n    return umul192_upper64(u, cache);\n  }\n\n  static uint32_t compute_delta(cache_entry_type const& cache,\n                                int beta_minus_1) FMT_NOEXCEPT {\n    return static_cast<uint32_t>(cache.high() >> (64 - 1 - beta_minus_1));\n  }\n\n  static bool compute_mul_parity(carrier_uint two_f,\n                                 const cache_entry_type& cache,\n                                 int beta_minus_1) FMT_NOEXCEPT {\n    FMT_ASSERT(beta_minus_1 >= 1, \"\");\n    FMT_ASSERT(beta_minus_1 < 64, \"\");\n\n    return ((umul192_middle64(two_f, cache) >> (64 - beta_minus_1)) & 1) != 0;\n  }\n\n  static carrier_uint compute_left_endpoint_for_shorter_interval_case(\n      const cache_entry_type& cache, int beta_minus_1) FMT_NOEXCEPT {\n    return (cache.high() -\n            (cache.high() >> (float_info<double>::significand_bits + 2))) >>\n           (64 - float_info<double>::significand_bits - 1 - beta_minus_1);\n  }\n\n  static carrier_uint compute_right_endpoint_for_shorter_interval_case(\n      const cache_entry_type& cache, int beta_minus_1) FMT_NOEXCEPT {\n    return (cache.high() +\n            (cache.high() >> (float_info<double>::significand_bits + 1))) >>\n           (64 - float_info<double>::significand_bits - 1 - beta_minus_1);\n  }\n\n  static carrier_uint compute_round_up_for_shorter_interval_case(\n      const cache_entry_type& cache, int beta_minus_1) FMT_NOEXCEPT {\n    return ((cache.high() >>\n             (64 - float_info<double>::significand_bits - 2 - beta_minus_1)) +\n            1) /\n           2;\n  }\n};\n\n// Various integer checks\ntemplate <class T>\nbool is_left_endpoint_integer_shorter_interval(int exponent) FMT_NOEXCEPT {\n  return exponent >=\n             float_info<\n                 T>::case_shorter_interval_left_endpoint_lower_threshold &&\n         exponent <=\n             float_info<T>::case_shorter_interval_left_endpoint_upper_threshold;\n}\ntemplate <class T>\nbool is_endpoint_integer(typename float_info<T>::carrier_uint two_f,\n                         int exponent, int minus_k) FMT_NOEXCEPT {\n  if (exponent < float_info<T>::case_fc_pm_half_lower_threshold) return false;\n  // For k >= 0.\n  if (exponent <= float_info<T>::case_fc_pm_half_upper_threshold) return true;\n  // For k < 0.\n  if (exponent > float_info<T>::divisibility_check_by_5_threshold) return false;\n  return divisible_by_power_of_5(two_f, minus_k);\n}\n\ntemplate <class T>\nbool is_center_integer(typename float_info<T>::carrier_uint two_f, int exponent,\n                       int minus_k) FMT_NOEXCEPT {\n  // Exponent for 5 is negative.\n  if (exponent > float_info<T>::divisibility_check_by_5_threshold) return false;\n  if (exponent > float_info<T>::case_fc_upper_threshold)\n    return divisible_by_power_of_5(two_f, minus_k);\n  // Both exponents are nonnegative.\n  if (exponent >= float_info<T>::case_fc_lower_threshold) return true;\n  // Exponent for 2 is negative.\n  return divisible_by_power_of_2(two_f, minus_k - exponent + 1);\n}\n\n// Remove trailing zeros from n and return the number of zeros removed (float)\nFMT_INLINE int remove_trailing_zeros(uint32_t& n) FMT_NOEXCEPT {\n#ifdef FMT_BUILTIN_CTZ\n  int t = FMT_BUILTIN_CTZ(n);\n#else\n  int t = ctz(n);\n#endif\n  if (t > float_info<float>::max_trailing_zeros)\n    t = float_info<float>::max_trailing_zeros;\n\n  const uint32_t mod_inv1 = 0xcccccccd;\n  const uint32_t max_quotient1 = 0x33333333;\n  const uint32_t mod_inv2 = 0xc28f5c29;\n  const uint32_t max_quotient2 = 0x0a3d70a3;\n\n  int s = 0;\n  for (; s < t - 1; s += 2) {\n    if (n * mod_inv2 > max_quotient2) break;\n    n *= mod_inv2;\n  }\n  if (s < t && n * mod_inv1 <= max_quotient1) {\n    n *= mod_inv1;\n    ++s;\n  }\n  n >>= s;\n  return s;\n}\n\n// Removes trailing zeros and returns the number of zeros removed (double)\nFMT_INLINE int remove_trailing_zeros(uint64_t& n) FMT_NOEXCEPT {\n#ifdef FMT_BUILTIN_CTZLL\n  int t = FMT_BUILTIN_CTZLL(n);\n#else\n  int t = ctzll(n);\n#endif\n  if (t > float_info<double>::max_trailing_zeros)\n    t = float_info<double>::max_trailing_zeros;\n  // Divide by 10^8 and reduce to 32-bits\n  // Since ret_value.significand <= (2^64 - 1) / 1000 < 10^17,\n  // both of the quotient and the r should fit in 32-bits\n\n  const uint32_t mod_inv1 = 0xcccccccd;\n  const uint32_t max_quotient1 = 0x33333333;\n  const uint64_t mod_inv8 = 0xc767074b22e90e21;\n  const uint64_t max_quotient8 = 0x00002af31dc46118;\n\n  // If the number is divisible by 1'0000'0000, work with the quotient\n  if (t >= 8) {\n    auto quotient_candidate = n * mod_inv8;\n\n    if (quotient_candidate <= max_quotient8) {\n      auto quotient = static_cast<uint32_t>(quotient_candidate >> 8);\n\n      int s = 8;\n      for (; s < t; ++s) {\n        if (quotient * mod_inv1 > max_quotient1) break;\n        quotient *= mod_inv1;\n      }\n      quotient >>= (s - 8);\n      n = quotient;\n      return s;\n    }\n  }\n\n  // Otherwise, work with the remainder\n  auto quotient = static_cast<uint32_t>(n / 100000000);\n  auto remainder = static_cast<uint32_t>(n - 100000000 * quotient);\n\n  if (t == 0 || remainder * mod_inv1 > max_quotient1) {\n    return 0;\n  }\n  remainder *= mod_inv1;\n\n  if (t == 1 || remainder * mod_inv1 > max_quotient1) {\n    n = (remainder >> 1) + quotient * 10000000ull;\n    return 1;\n  }\n  remainder *= mod_inv1;\n\n  if (t == 2 || remainder * mod_inv1 > max_quotient1) {\n    n = (remainder >> 2) + quotient * 1000000ull;\n    return 2;\n  }\n  remainder *= mod_inv1;\n\n  if (t == 3 || remainder * mod_inv1 > max_quotient1) {\n    n = (remainder >> 3) + quotient * 100000ull;\n    return 3;\n  }\n  remainder *= mod_inv1;\n\n  if (t == 4 || remainder * mod_inv1 > max_quotient1) {\n    n = (remainder >> 4) + quotient * 10000ull;\n    return 4;\n  }\n  remainder *= mod_inv1;\n\n  if (t == 5 || remainder * mod_inv1 > max_quotient1) {\n    n = (remainder >> 5) + quotient * 1000ull;\n    return 5;\n  }\n  remainder *= mod_inv1;\n\n  if (t == 6 || remainder * mod_inv1 > max_quotient1) {\n    n = (remainder >> 6) + quotient * 100ull;\n    return 6;\n  }\n  remainder *= mod_inv1;\n\n  n = (remainder >> 7) + quotient * 10ull;\n  return 7;\n}\n\n// The main algorithm for shorter interval case\ntemplate <class T>\nFMT_INLINE decimal_fp<T> shorter_interval_case(int exponent) FMT_NOEXCEPT {\n  decimal_fp<T> ret_value;\n  // Compute k and beta\n  const int minus_k = floor_log10_pow2_minus_log10_4_over_3(exponent);\n  const int beta_minus_1 = exponent + floor_log2_pow10(-minus_k);\n\n  // Compute xi and zi\n  using cache_entry_type = typename cache_accessor<T>::cache_entry_type;\n  const cache_entry_type cache = cache_accessor<T>::get_cached_power(-minus_k);\n\n  auto xi = cache_accessor<T>::compute_left_endpoint_for_shorter_interval_case(\n      cache, beta_minus_1);\n  auto zi = cache_accessor<T>::compute_right_endpoint_for_shorter_interval_case(\n      cache, beta_minus_1);\n\n  // If the left endpoint is not an integer, increase it\n  if (!is_left_endpoint_integer_shorter_interval<T>(exponent)) ++xi;\n\n  // Try bigger divisor\n  ret_value.significand = zi / 10;\n\n  // If succeed, remove trailing zeros if necessary and return\n  if (ret_value.significand * 10 >= xi) {\n    ret_value.exponent = minus_k + 1;\n    ret_value.exponent += remove_trailing_zeros(ret_value.significand);\n    return ret_value;\n  }\n\n  // Otherwise, compute the round-up of y\n  ret_value.significand =\n      cache_accessor<T>::compute_round_up_for_shorter_interval_case(\n          cache, beta_minus_1);\n  ret_value.exponent = minus_k;\n\n  // When tie occurs, choose one of them according to the rule\n  if (exponent >= float_info<T>::shorter_interval_tie_lower_threshold &&\n      exponent <= float_info<T>::shorter_interval_tie_upper_threshold) {\n    ret_value.significand = ret_value.significand % 2 == 0\n                                ? ret_value.significand\n                                : ret_value.significand - 1;\n  } else if (ret_value.significand < xi) {\n    ++ret_value.significand;\n  }\n  return ret_value;\n}\n\ntemplate <typename T> decimal_fp<T> to_decimal(T x) FMT_NOEXCEPT {\n  // Step 1: integer promotion & Schubfach multiplier calculation.\n\n  using carrier_uint = typename float_info<T>::carrier_uint;\n  using cache_entry_type = typename cache_accessor<T>::cache_entry_type;\n  auto br = bit_cast<carrier_uint>(x);\n\n  // Extract significand bits and exponent bits.\n  const carrier_uint significand_mask =\n      (static_cast<carrier_uint>(1) << float_info<T>::significand_bits) - 1;\n  carrier_uint significand = (br & significand_mask);\n  int exponent = static_cast<int>((br & exponent_mask<T>()) >>\n                                  float_info<T>::significand_bits);\n\n  if (exponent != 0) {  // Check if normal.\n    exponent += float_info<T>::exponent_bias - float_info<T>::significand_bits;\n\n    // Shorter interval case; proceed like Schubfach.\n    if (significand == 0) return shorter_interval_case<T>(exponent);\n\n    significand |=\n        (static_cast<carrier_uint>(1) << float_info<T>::significand_bits);\n  } else {\n    // Subnormal case; the interval is always regular.\n    if (significand == 0) return {0, 0};\n    exponent = float_info<T>::min_exponent - float_info<T>::significand_bits;\n  }\n\n  const bool include_left_endpoint = (significand % 2 == 0);\n  const bool include_right_endpoint = include_left_endpoint;\n\n  // Compute k and beta.\n  const int minus_k = floor_log10_pow2(exponent) - float_info<T>::kappa;\n  const cache_entry_type cache = cache_accessor<T>::get_cached_power(-minus_k);\n  const int beta_minus_1 = exponent + floor_log2_pow10(-minus_k);\n\n  // Compute zi and deltai\n  // 10^kappa <= deltai < 10^(kappa + 1)\n  const uint32_t deltai = cache_accessor<T>::compute_delta(cache, beta_minus_1);\n  const carrier_uint two_fc = significand << 1;\n  const carrier_uint two_fr = two_fc | 1;\n  const carrier_uint zi =\n      cache_accessor<T>::compute_mul(two_fr << beta_minus_1, cache);\n\n  // Step 2: Try larger divisor; remove trailing zeros if necessary\n\n  // Using an upper bound on zi, we might be able to optimize the division\n  // better than the compiler; we are computing zi / big_divisor here\n  decimal_fp<T> ret_value;\n  ret_value.significand = divide_by_10_to_kappa_plus_1(zi);\n  uint32_t r = static_cast<uint32_t>(zi - float_info<T>::big_divisor *\n                                              ret_value.significand);\n\n  if (r > deltai) {\n    goto small_divisor_case_label;\n  } else if (r < deltai) {\n    // Exclude the right endpoint if necessary\n    if (r == 0 && !include_right_endpoint &&\n        is_endpoint_integer<T>(two_fr, exponent, minus_k)) {\n      --ret_value.significand;\n      r = float_info<T>::big_divisor;\n      goto small_divisor_case_label;\n    }\n  } else {\n    // r == deltai; compare fractional parts\n    // Check conditions in the order different from the paper\n    // to take advantage of short-circuiting\n    const carrier_uint two_fl = two_fc - 1;\n    if ((!include_left_endpoint ||\n         !is_endpoint_integer<T>(two_fl, exponent, minus_k)) &&\n        !cache_accessor<T>::compute_mul_parity(two_fl, cache, beta_minus_1)) {\n      goto small_divisor_case_label;\n    }\n  }\n  ret_value.exponent = minus_k + float_info<T>::kappa + 1;\n\n  // We may need to remove trailing zeros\n  ret_value.exponent += remove_trailing_zeros(ret_value.significand);\n  return ret_value;\n\n  // Step 3: Find the significand with the smaller divisor\n\nsmall_divisor_case_label:\n  ret_value.significand *= 10;\n  ret_value.exponent = minus_k + float_info<T>::kappa;\n\n  const uint32_t mask = (1u << float_info<T>::kappa) - 1;\n  auto dist = r - (deltai / 2) + (float_info<T>::small_divisor / 2);\n\n  // Is dist divisible by 2^kappa?\n  if ((dist & mask) == 0) {\n    const bool approx_y_parity =\n        ((dist ^ (float_info<T>::small_divisor / 2)) & 1) != 0;\n    dist >>= float_info<T>::kappa;\n\n    // Is dist divisible by 5^kappa?\n    if (check_divisibility_and_divide_by_pow5<float_info<T>::kappa>(dist)) {\n      ret_value.significand += dist;\n\n      // Check z^(f) >= epsilon^(f)\n      // We have either yi == zi - epsiloni or yi == (zi - epsiloni) - 1,\n      // where yi == zi - epsiloni if and only if z^(f) >= epsilon^(f)\n      // Since there are only 2 possibilities, we only need to care about the\n      // parity. Also, zi and r should have the same parity since the divisor\n      // is an even number\n      if (cache_accessor<T>::compute_mul_parity(two_fc, cache, beta_minus_1) !=\n          approx_y_parity) {\n        --ret_value.significand;\n      } else {\n        // If z^(f) >= epsilon^(f), we might have a tie\n        // when z^(f) == epsilon^(f), or equivalently, when y is an integer\n        if (is_center_integer<T>(two_fc, exponent, minus_k)) {\n          ret_value.significand = ret_value.significand % 2 == 0\n                                      ? ret_value.significand\n                                      : ret_value.significand - 1;\n        }\n      }\n    }\n    // Is dist not divisible by 5^kappa?\n    else {\n      ret_value.significand += dist;\n    }\n  }\n  // Is dist not divisible by 2^kappa?\n  else {\n    // Since we know dist is small, we might be able to optimize the division\n    // better than the compiler; we are computing dist / small_divisor here\n    ret_value.significand +=\n        small_division_by_pow10<float_info<T>::kappa>(dist);\n  }\n  return ret_value;\n}\n}  // namespace dragonbox\n\n// Formats value using a variation of the Fixed-Precision Positive\n// Floating-Point Printout ((FPP)^2) algorithm by Steele & White:\n// https://fmt.dev/papers/p372-steele.pdf.\ntemplate <typename Double>\nvoid fallback_format(Double d, int num_digits, bool binary32, buffer<char>& buf,\n                     int& exp10) {\n  bigint numerator;    // 2 * R in (FPP)^2.\n  bigint denominator;  // 2 * S in (FPP)^2.\n  // lower and upper are differences between value and corresponding boundaries.\n  bigint lower;             // (M^- in (FPP)^2).\n  bigint upper_store;       // upper's value if different from lower.\n  bigint* upper = nullptr;  // (M^+ in (FPP)^2).\n  fp value;\n  // Shift numerator and denominator by an extra bit or two (if lower boundary\n  // is closer) to make lower and upper integers. This eliminates multiplication\n  // by 2 during later computations.\n  const bool is_predecessor_closer =\n      binary32 ? value.assign(static_cast<float>(d)) : value.assign(d);\n  int shift = is_predecessor_closer ? 2 : 1;\n  uint64_t significand = value.f << shift;\n  if (value.e >= 0) {\n    numerator.assign(significand);\n    numerator <<= value.e;\n    lower.assign(1);\n    lower <<= value.e;\n    if (shift != 1) {\n      upper_store.assign(1);\n      upper_store <<= value.e + 1;\n      upper = &upper_store;\n    }\n    denominator.assign_pow10(exp10);\n    denominator <<= shift;\n  } else if (exp10 < 0) {\n    numerator.assign_pow10(-exp10);\n    lower.assign(numerator);\n    if (shift != 1) {\n      upper_store.assign(numerator);\n      upper_store <<= 1;\n      upper = &upper_store;\n    }\n    numerator *= significand;\n    denominator.assign(1);\n    denominator <<= shift - value.e;\n  } else {\n    numerator.assign(significand);\n    denominator.assign_pow10(exp10);\n    denominator <<= shift - value.e;\n    lower.assign(1);\n    if (shift != 1) {\n      upper_store.assign(1ULL << 1);\n      upper = &upper_store;\n    }\n  }\n  // Invariant: value == (numerator / denominator) * pow(10, exp10).\n  if (num_digits < 0) {\n    // Generate the shortest representation.\n    if (!upper) upper = &lower;\n    bool even = (value.f & 1) == 0;\n    num_digits = 0;\n    char* data = buf.data();\n    for (;;) {\n      int digit = numerator.divmod_assign(denominator);\n      bool low = compare(numerator, lower) - even < 0;  // numerator <[=] lower.\n      // numerator + upper >[=] pow10:\n      bool high = add_compare(numerator, *upper, denominator) + even > 0;\n      data[num_digits++] = static_cast<char>('0' + digit);\n      if (low || high) {\n        if (!low) {\n          ++data[num_digits - 1];\n        } else if (high) {\n          int result = add_compare(numerator, numerator, denominator);\n          // Round half to even.\n          if (result > 0 || (result == 0 && (digit % 2) != 0))\n            ++data[num_digits - 1];\n        }\n        buf.try_resize(to_unsigned(num_digits));\n        exp10 -= num_digits - 1;\n        return;\n      }\n      numerator *= 10;\n      lower *= 10;\n      if (upper != &lower) *upper *= 10;\n    }\n  }\n  // Generate the given number of digits.\n  exp10 -= num_digits - 1;\n  if (num_digits == 0) {\n    buf.try_resize(1);\n    denominator *= 10;\n    buf[0] = add_compare(numerator, numerator, denominator) > 0 ? '1' : '0';\n    return;\n  }\n  buf.try_resize(to_unsigned(num_digits));\n  for (int i = 0; i < num_digits - 1; ++i) {\n    int digit = numerator.divmod_assign(denominator);\n    buf[i] = static_cast<char>('0' + digit);\n    numerator *= 10;\n  }\n  int digit = numerator.divmod_assign(denominator);\n  auto result = add_compare(numerator, numerator, denominator);\n  if (result > 0 || (result == 0 && (digit % 2) != 0)) {\n    if (digit == 9) {\n      const auto overflow = '0' + 10;\n      buf[num_digits - 1] = overflow;\n      // Propagate the carry.\n      for (int i = num_digits - 1; i > 0 && buf[i] == overflow; --i) {\n        buf[i] = '0';\n        ++buf[i - 1];\n      }\n      if (buf[0] == overflow) {\n        buf[0] = '1';\n        ++exp10;\n      }\n      return;\n    }\n    ++digit;\n  }\n  buf[num_digits - 1] = static_cast<char>('0' + digit);\n}\n\ntemplate <typename T>\nint format_float(T value, int precision, float_specs specs, buffer<char>& buf) {\n  static_assert(!std::is_same<T, float>::value, \"\");\n  FMT_ASSERT(value >= 0, \"value is negative\");\n\n  const bool fixed = specs.format == float_format::fixed;\n  if (value <= 0) {  // <= instead of == to silence a warning.\n    if (precision <= 0 || !fixed) {\n      buf.push_back('0');\n      return 0;\n    }\n    buf.try_resize(to_unsigned(precision));\n    std::uninitialized_fill_n(buf.data(), precision, '0');\n    return -precision;\n  }\n\n  if (!specs.use_grisu) return snprintf_float(value, precision, specs, buf);\n\n  if (precision < 0) {\n    // Use Dragonbox for the shortest format.\n    if (specs.binary32) {\n      auto dec = dragonbox::to_decimal(static_cast<float>(value));\n      write<char>(buffer_appender<char>(buf), dec.significand);\n      return dec.exponent;\n    }\n    auto dec = dragonbox::to_decimal(static_cast<double>(value));\n    write<char>(buffer_appender<char>(buf), dec.significand);\n    return dec.exponent;\n  }\n\n  // Use Grisu + Dragon4 for the given precision:\n  // https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf.\n  int exp = 0;\n  const int min_exp = -60;  // alpha in Grisu.\n  int cached_exp10 = 0;     // K in Grisu.\n  fp normalized = normalize(fp(value));\n  const auto cached_pow = get_cached_power(\n      min_exp - (normalized.e + fp::significand_size), cached_exp10);\n  normalized = normalized * cached_pow;\n  // Limit precision to the maximum possible number of significant digits in an\n  // IEEE754 double because we don't need to generate zeros.\n  const int max_double_digits = 767;\n  if (precision > max_double_digits) precision = max_double_digits;\n  fixed_handler handler{buf.data(), 0, precision, -cached_exp10, fixed};\n  if (grisu_gen_digits(normalized, 1, exp, handler) == digits::error) {\n    exp += handler.size - cached_exp10 - 1;\n    fallback_format(value, handler.precision, specs.binary32, buf, exp);\n  } else {\n    exp += handler.exp10;\n    buf.try_resize(to_unsigned(handler.size));\n  }\n  if (!fixed && !specs.showpoint) {\n    // Remove trailing zeros.\n    auto num_digits = buf.size();\n    while (num_digits > 0 && buf[num_digits - 1] == '0') {\n      --num_digits;\n      ++exp;\n    }\n    buf.try_resize(num_digits);\n  }\n  return exp;\n}  // namespace detail\n\ntemplate <typename T>\nint snprintf_float(T value, int precision, float_specs specs,\n                   buffer<char>& buf) {\n  // Buffer capacity must be non-zero, otherwise MSVC's vsnprintf_s will fail.\n  FMT_ASSERT(buf.capacity() > buf.size(), \"empty buffer\");\n  static_assert(!std::is_same<T, float>::value, \"\");\n\n  // Subtract 1 to account for the difference in precision since we use %e for\n  // both general and exponent format.\n  if (specs.format == float_format::general ||\n      specs.format == float_format::exp)\n    precision = (precision >= 0 ? precision : 6) - 1;\n\n  // Build the format string.\n  enum { max_format_size = 7 };  // The longest format is \"%#.*Le\".\n  char format[max_format_size];\n  char* format_ptr = format;\n  *format_ptr++ = '%';\n  if (specs.showpoint && specs.format == float_format::hex) *format_ptr++ = '#';\n  if (precision >= 0) {\n    *format_ptr++ = '.';\n    *format_ptr++ = '*';\n  }\n  if (std::is_same<T, long double>()) *format_ptr++ = 'L';\n  *format_ptr++ = specs.format != float_format::hex\n                      ? (specs.format == float_format::fixed ? 'f' : 'e')\n                      : (specs.upper ? 'A' : 'a');\n  *format_ptr = '\\0';\n\n  // Format using snprintf.\n  auto offset = buf.size();\n  for (;;) {\n    auto begin = buf.data() + offset;\n    auto capacity = buf.capacity() - offset;\n#ifdef FMT_FUZZ\n    if (precision > 100000)\n      throw std::runtime_error(\n          \"fuzz mode - avoid large allocation inside snprintf\");\n#endif\n    // Suppress the warning about a nonliteral format string.\n    // Cannot use auto because of a bug in MinGW (#1532).\n    int (*snprintf_ptr)(char*, size_t, const char*, ...) = FMT_SNPRINTF;\n    int result = precision >= 0\n                     ? snprintf_ptr(begin, capacity, format, precision, value)\n                     : snprintf_ptr(begin, capacity, format, value);\n    if (result < 0) {\n      // The buffer will grow exponentially.\n      buf.try_reserve(buf.capacity() + 1);\n      continue;\n    }\n    auto size = to_unsigned(result);\n    // Size equal to capacity means that the last character was truncated.\n    if (size >= capacity) {\n      buf.try_reserve(size + offset + 1);  // Add 1 for the terminating '\\0'.\n      continue;\n    }\n    auto is_digit = [](char c) { return c >= '0' && c <= '9'; };\n    if (specs.format == float_format::fixed) {\n      if (precision == 0) {\n        buf.try_resize(size);\n        return 0;\n      }\n      // Find and remove the decimal point.\n      auto end = begin + size, p = end;\n      do {\n        --p;\n      } while (is_digit(*p));\n      int fraction_size = static_cast<int>(end - p - 1);\n      std::memmove(p, p + 1, to_unsigned(fraction_size));\n      buf.try_resize(size - 1);\n      return -fraction_size;\n    }\n    if (specs.format == float_format::hex) {\n      buf.try_resize(size + offset);\n      return 0;\n    }\n    // Find and parse the exponent.\n    auto end = begin + size, exp_pos = end;\n    do {\n      --exp_pos;\n    } while (*exp_pos != 'e');\n    char sign = exp_pos[1];\n    FMT_ASSERT(sign == '+' || sign == '-', \"\");\n    int exp = 0;\n    auto p = exp_pos + 2;  // Skip 'e' and sign.\n    do {\n      FMT_ASSERT(is_digit(*p), \"\");\n      exp = exp * 10 + (*p++ - '0');\n    } while (p != end);\n    if (sign == '-') exp = -exp;\n    int fraction_size = 0;\n    if (exp_pos != begin + 1) {\n      // Remove trailing zeros.\n      auto fraction_end = exp_pos - 1;\n      while (*fraction_end == '0') --fraction_end;\n      // Move the fractional part left to get rid of the decimal point.\n      fraction_size = static_cast<int>(fraction_end - begin - 1);\n      std::memmove(begin + 1, begin + 2, to_unsigned(fraction_size));\n    }\n    buf.try_resize(to_unsigned(fraction_size) + offset + 1);\n    return exp - fraction_size;\n  }\n}\n}  // namespace detail\n\ntemplate <> struct formatter<detail::bigint> {\n  FMT_CONSTEXPR format_parse_context::iterator parse(\n      format_parse_context& ctx) {\n    return ctx.begin();\n  }\n\n  format_context::iterator format(const detail::bigint& n,\n                                  format_context& ctx) {\n    auto out = ctx.out();\n    bool first = true;\n    for (auto i = n.bigits_.size(); i > 0; --i) {\n      auto value = n.bigits_[i - 1u];\n      if (first) {\n        out = format_to(out, FMT_STRING(\"{:x}\"), value);\n        first = false;\n        continue;\n      }\n      out = format_to(out, FMT_STRING(\"{:08x}\"), value);\n    }\n    if (n.exp_ > 0)\n      out = format_to(out, FMT_STRING(\"p{}\"),\n                      n.exp_ * detail::bigint::bigit_bits);\n    return out;\n  }\n};\n\nFMT_FUNC detail::utf8_to_utf16::utf8_to_utf16(string_view s) {\n  for_each_codepoint(s, [this](uint32_t cp, int error) {\n    if (error != 0) FMT_THROW(std::runtime_error(\"invalid utf8\"));\n    if (cp <= 0xFFFF) {\n      buffer_.push_back(static_cast<wchar_t>(cp));\n    } else {\n      cp -= 0x10000;\n      buffer_.push_back(static_cast<wchar_t>(0xD800 + (cp >> 10)));\n      buffer_.push_back(static_cast<wchar_t>(0xDC00 + (cp & 0x3FF)));\n    }\n  });\n  buffer_.push_back(0);\n}\n\nFMT_FUNC void format_system_error(detail::buffer<char>& out, int error_code,\n                                  const char* message) FMT_NOEXCEPT {\n  FMT_TRY {\n    auto ec = std::error_code(error_code, std::generic_category());\n    write(std::back_inserter(out), std::system_error(ec, message).what());\n    return;\n  }\n  FMT_CATCH(...) {}\n  format_error_code(out, error_code, message);\n}\n\nFMT_FUNC void detail::error_handler::on_error(const char* message) {\n  FMT_THROW(format_error(message));\n}\n\nFMT_FUNC void report_system_error(int error_code,\n                                  const char* message) FMT_NOEXCEPT {\n  report_error(format_system_error, error_code, message);\n}\n\nFMT_FUNC std::string vformat(string_view fmt, format_args args) {\n  // Don't optimize the \"{}\" case to keep the binary size small and because it\n  // can be better optimized in fmt::format anyway.\n  auto buffer = memory_buffer();\n  detail::vformat_to(buffer, fmt, args);\n  return to_string(buffer);\n}\n\n#ifdef _WIN32\nnamespace detail {\nusing dword = conditional_t<sizeof(long) == 4, unsigned long, unsigned>;\nextern \"C\" __declspec(dllimport) int __stdcall WriteConsoleW(  //\n    void*, const void*, dword, dword*, void*);\n}  // namespace detail\n#endif\n\nnamespace detail {\nFMT_FUNC void print(std::FILE* f, string_view text) {\n#ifdef _WIN32\n  auto fd = _fileno(f);\n  if (_isatty(fd)) {\n    detail::utf8_to_utf16 u16(string_view(text.data(), text.size()));\n    auto written = detail::dword();\n    if (detail::WriteConsoleW(reinterpret_cast<void*>(_get_osfhandle(fd)),\n                              u16.c_str(), static_cast<uint32_t>(u16.size()),\n                              &written, nullptr)) {\n      return;\n    }\n    // Fallback to fwrite on failure. It can happen if the output has been\n    // redirected to NUL.\n  }\n#endif\n  detail::fwrite_fully(text.data(), 1, text.size(), f);\n}\n}  // namespace detail\n\nFMT_FUNC void vprint(std::FILE* f, string_view format_str, format_args args) {\n  memory_buffer buffer;\n  detail::vformat_to(buffer, format_str, args);\n  detail::print(f, {buffer.data(), buffer.size()});\n}\n\n#ifdef _WIN32\n// Print assuming legacy (non-Unicode) encoding.\nFMT_FUNC void detail::vprint_mojibake(std::FILE* f, string_view format_str,\n                                      format_args args) {\n  memory_buffer buffer;\n  detail::vformat_to(buffer, format_str,\n                     basic_format_args<buffer_context<char>>(args));\n  fwrite_fully(buffer.data(), 1, buffer.size(), f);\n}\n#endif\n\nFMT_FUNC void vprint(string_view format_str, format_args args) {\n  vprint(stdout, format_str, args);\n}\n\nFMT_END_NAMESPACE\n\n#endif  // FMT_FORMAT_INL_H_\n"
  },
  {
    "path": "examples/libraries/fmt/include/fmt/format.h",
    "content": "/*\n Formatting library for C++\n\n Copyright (c) 2012 - present, Victor Zverovich\n\n Permission is hereby granted, free of charge, to any person obtaining\n a copy of this software and associated documentation files (the\n \"Software\"), to deal in the Software without restriction, including\n without limitation the rights to use, copy, modify, merge, publish,\n distribute, sublicense, and/or sell copies of the Software, and to\n permit persons to whom the Software is furnished to do so, subject to\n the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n --- Optional exception to the license ---\n\n As an exception, if, as a result of your compiling your source code, portions\n of this Software are embedded into a machine-executable object form of such\n source code, you may redistribute such embedded portions in such object form\n without including the above copyright and permission notices.\n */\n\n#ifndef FMT_FORMAT_H_\n#define FMT_FORMAT_H_\n\n#include <cmath>         // std::signbit\n#include <cstdint>       // uint32_t\n#include <limits>        // std::numeric_limits\n#include <memory>        // std::uninitialized_copy\n#include <stdexcept>     // std::runtime_error\n#include <system_error>  // std::system_error\n#include <utility>       // std::swap\n\n#include \"core.h\"\n\n#ifdef __INTEL_COMPILER\n#  define FMT_ICC_VERSION __INTEL_COMPILER\n#elif defined(__ICL)\n#  define FMT_ICC_VERSION __ICL\n#else\n#  define FMT_ICC_VERSION 0\n#endif\n\n#ifdef __NVCC__\n#  define FMT_CUDA_VERSION (__CUDACC_VER_MAJOR__ * 100 + __CUDACC_VER_MINOR__)\n#else\n#  define FMT_CUDA_VERSION 0\n#endif\n\n#ifdef __has_builtin\n#  define FMT_HAS_BUILTIN(x) __has_builtin(x)\n#else\n#  define FMT_HAS_BUILTIN(x) 0\n#endif\n\n#if FMT_GCC_VERSION || FMT_CLANG_VERSION\n#  define FMT_NOINLINE __attribute__((noinline))\n#else\n#  define FMT_NOINLINE\n#endif\n\n#if FMT_MSC_VER\n#  define FMT_MSC_DEFAULT = default\n#else\n#  define FMT_MSC_DEFAULT\n#endif\n\n#ifndef FMT_THROW\n#  if FMT_EXCEPTIONS\n#    if FMT_MSC_VER || FMT_NVCC\nFMT_BEGIN_NAMESPACE\nnamespace detail {\ntemplate <typename Exception> inline void do_throw(const Exception& x) {\n  // Silence unreachable code warnings in MSVC and NVCC because these\n  // are nearly impossible to fix in a generic code.\n  volatile bool b = true;\n  if (b) throw x;\n}\n}  // namespace detail\nFMT_END_NAMESPACE\n#      define FMT_THROW(x) detail::do_throw(x)\n#    else\n#      define FMT_THROW(x) throw x\n#    endif\n#  else\n#    define FMT_THROW(x)               \\\n      do {                             \\\n        FMT_ASSERT(false, (x).what()); \\\n      } while (false)\n#  endif\n#endif\n\n#if FMT_EXCEPTIONS\n#  define FMT_TRY try\n#  define FMT_CATCH(x) catch (x)\n#else\n#  define FMT_TRY if (true)\n#  define FMT_CATCH(x) if (false)\n#endif\n\n#ifndef FMT_DEPRECATED\n#  if FMT_HAS_CPP14_ATTRIBUTE(deprecated) || FMT_MSC_VER >= 1900\n#    define FMT_DEPRECATED [[deprecated]]\n#  else\n#    if (defined(__GNUC__) && !defined(__LCC__)) || defined(__clang__)\n#      define FMT_DEPRECATED __attribute__((deprecated))\n#    elif FMT_MSC_VER\n#      define FMT_DEPRECATED __declspec(deprecated)\n#    else\n#      define FMT_DEPRECATED /* deprecated */\n#    endif\n#  endif\n#endif\n\n// Workaround broken [[deprecated]] in the Intel, PGI and NVCC compilers.\n#if FMT_ICC_VERSION || defined(__PGI) || FMT_NVCC\n#  define FMT_DEPRECATED_ALIAS\n#else\n#  define FMT_DEPRECATED_ALIAS FMT_DEPRECATED\n#endif\n\n#ifndef FMT_USE_USER_DEFINED_LITERALS\n// EDG based compilers (Intel, NVIDIA, Elbrus, etc), GCC and MSVC support UDLs.\n#  if (FMT_HAS_FEATURE(cxx_user_literals) || FMT_GCC_VERSION >= 407 || \\\n       FMT_MSC_VER >= 1900) &&                                         \\\n      (!defined(__EDG_VERSION__) || __EDG_VERSION__ >= /* UDL feature */ 480)\n#    define FMT_USE_USER_DEFINED_LITERALS 1\n#  else\n#    define FMT_USE_USER_DEFINED_LITERALS 0\n#  endif\n#endif\n\n// Defining FMT_REDUCE_INT_INSTANTIATIONS to 1, will reduce the number of\n// integer formatter template instantiations to just one by only using the\n// largest integer type. This results in a reduction in binary size but will\n// cause a decrease in integer formatting performance.\n#if !defined(FMT_REDUCE_INT_INSTANTIATIONS)\n#  define FMT_REDUCE_INT_INSTANTIATIONS 0\n#endif\n\n// __builtin_clz is broken in clang with Microsoft CodeGen:\n// https://github.com/fmtlib/fmt/issues/519\n#if (FMT_GCC_VERSION || FMT_HAS_BUILTIN(__builtin_clz)) && !FMT_MSC_VER\n#  define FMT_BUILTIN_CLZ(n) __builtin_clz(n)\n#endif\n#if (FMT_GCC_VERSION || FMT_HAS_BUILTIN(__builtin_clzll)) && !FMT_MSC_VER\n#  define FMT_BUILTIN_CLZLL(n) __builtin_clzll(n)\n#endif\n#if (FMT_GCC_VERSION || FMT_HAS_BUILTIN(__builtin_ctz))\n#  define FMT_BUILTIN_CTZ(n) __builtin_ctz(n)\n#endif\n#if (FMT_GCC_VERSION || FMT_HAS_BUILTIN(__builtin_ctzll))\n#  define FMT_BUILTIN_CTZLL(n) __builtin_ctzll(n)\n#endif\n\n#if FMT_MSC_VER\n#  include <intrin.h>  // _BitScanReverse[64], _BitScanForward[64], _umul128\n#endif\n\n// Some compilers masquerade as both MSVC and GCC-likes or otherwise support\n// __builtin_clz and __builtin_clzll, so only define FMT_BUILTIN_CLZ using the\n// MSVC intrinsics if the clz and clzll builtins are not available.\n#if FMT_MSC_VER && !defined(FMT_BUILTIN_CLZLL) && !defined(FMT_BUILTIN_CTZLL)\nFMT_BEGIN_NAMESPACE\nnamespace detail {\n// Avoid Clang with Microsoft CodeGen's -Wunknown-pragmas warning.\n#  if !defined(__clang__)\n#    pragma managed(push, off)\n#    pragma intrinsic(_BitScanForward)\n#    pragma intrinsic(_BitScanReverse)\n#    if defined(_WIN64)\n#      pragma intrinsic(_BitScanForward64)\n#      pragma intrinsic(_BitScanReverse64)\n#    endif\n#  endif\n\ninline auto clz(uint32_t x) -> int {\n  unsigned long r = 0;\n  _BitScanReverse(&r, x);\n  FMT_ASSERT(x != 0, \"\");\n  // Static analysis complains about using uninitialized data\n  // \"r\", but the only way that can happen is if \"x\" is 0,\n  // which the callers guarantee to not happen.\n  FMT_MSC_WARNING(suppress : 6102)\n  return 31 ^ static_cast<int>(r);\n}\n#  define FMT_BUILTIN_CLZ(n) detail::clz(n)\n\ninline auto clzll(uint64_t x) -> int {\n  unsigned long r = 0;\n#  ifdef _WIN64\n  _BitScanReverse64(&r, x);\n#  else\n  // Scan the high 32 bits.\n  if (_BitScanReverse(&r, static_cast<uint32_t>(x >> 32))) return 63 ^ (r + 32);\n  // Scan the low 32 bits.\n  _BitScanReverse(&r, static_cast<uint32_t>(x));\n#  endif\n  FMT_ASSERT(x != 0, \"\");\n  FMT_MSC_WARNING(suppress : 6102)  // Suppress a bogus static analysis warning.\n  return 63 ^ static_cast<int>(r);\n}\n#  define FMT_BUILTIN_CLZLL(n) detail::clzll(n)\n\ninline auto ctz(uint32_t x) -> int {\n  unsigned long r = 0;\n  _BitScanForward(&r, x);\n  FMT_ASSERT(x != 0, \"\");\n  FMT_MSC_WARNING(suppress : 6102)  // Suppress a bogus static analysis warning.\n  return static_cast<int>(r);\n}\n#  define FMT_BUILTIN_CTZ(n) detail::ctz(n)\n\ninline auto ctzll(uint64_t x) -> int {\n  unsigned long r = 0;\n  FMT_ASSERT(x != 0, \"\");\n  FMT_MSC_WARNING(suppress : 6102)  // Suppress a bogus static analysis warning.\n#  ifdef _WIN64\n  _BitScanForward64(&r, x);\n#  else\n  // Scan the low 32 bits.\n  if (_BitScanForward(&r, static_cast<uint32_t>(x))) return static_cast<int>(r);\n  // Scan the high 32 bits.\n  _BitScanForward(&r, static_cast<uint32_t>(x >> 32));\n  r += 32;\n#  endif\n  return static_cast<int>(r);\n}\n#  define FMT_BUILTIN_CTZLL(n) detail::ctzll(n)\n#  if !defined(__clang__)\n#    pragma managed(pop)\n#  endif\n}  // namespace detail\nFMT_END_NAMESPACE\n#endif\n\nFMT_BEGIN_NAMESPACE\nnamespace detail {\n\n#if __cplusplus >= 202002L || \\\n    (__cplusplus >= 201709L && FMT_GCC_VERSION >= 1002)\n#  define FMT_CONSTEXPR20 constexpr\n#else\n#  define FMT_CONSTEXPR20\n#endif\n\n// An equivalent of `*reinterpret_cast<Dest*>(&source)` that doesn't have\n// undefined behavior (e.g. due to type aliasing).\n// Example: uint64_t d = bit_cast<uint64_t>(2.718);\ntemplate <typename Dest, typename Source>\ninline auto bit_cast(const Source& source) -> Dest {\n  static_assert(sizeof(Dest) == sizeof(Source), \"size mismatch\");\n  Dest dest;\n  std::memcpy(&dest, &source, sizeof(dest));\n  return dest;\n}\n\ninline auto is_big_endian() -> bool {\n  const auto u = 1u;\n  struct bytes {\n    char data[sizeof(u)];\n  };\n  return bit_cast<bytes>(u).data[0] == 0;\n}\n\n// A fallback implementation of uintptr_t for systems that lack it.\nstruct fallback_uintptr {\n  unsigned char value[sizeof(void*)];\n\n  fallback_uintptr() = default;\n  explicit fallback_uintptr(const void* p) {\n    *this = bit_cast<fallback_uintptr>(p);\n    if (is_big_endian()) {\n      for (size_t i = 0, j = sizeof(void*) - 1; i < j; ++i, --j)\n        std::swap(value[i], value[j]);\n    }\n  }\n};\n#ifdef UINTPTR_MAX\nusing uintptr_t = ::uintptr_t;\ninline auto to_uintptr(const void* p) -> uintptr_t {\n  return bit_cast<uintptr_t>(p);\n}\n#else\nusing uintptr_t = fallback_uintptr;\ninline auto to_uintptr(const void* p) -> fallback_uintptr {\n  return fallback_uintptr(p);\n}\n#endif\n\n// Returns the largest possible value for type T. Same as\n// std::numeric_limits<T>::max() but shorter and not affected by the max macro.\ntemplate <typename T> constexpr auto max_value() -> T {\n  return (std::numeric_limits<T>::max)();\n}\ntemplate <typename T> constexpr auto num_bits() -> int {\n  return std::numeric_limits<T>::digits;\n}\n// std::numeric_limits<T>::digits may return 0 for 128-bit ints.\ntemplate <> constexpr auto num_bits<int128_t>() -> int { return 128; }\ntemplate <> constexpr auto num_bits<uint128_t>() -> int { return 128; }\ntemplate <> constexpr auto num_bits<fallback_uintptr>() -> int {\n  return static_cast<int>(sizeof(void*) *\n                          std::numeric_limits<unsigned char>::digits);\n}\n\nFMT_INLINE void assume(bool condition) {\n  (void)condition;\n#if FMT_HAS_BUILTIN(__builtin_assume)\n  __builtin_assume(condition);\n#endif\n}\n\n// An approximation of iterator_t for pre-C++20 systems.\ntemplate <typename T>\nusing iterator_t = decltype(std::begin(std::declval<T&>()));\ntemplate <typename T> using sentinel_t = decltype(std::end(std::declval<T&>()));\n\n// A workaround for std::string not having mutable data() until C++17.\ntemplate <typename Char>\ninline auto get_data(std::basic_string<Char>& s) -> Char* {\n  return &s[0];\n}\ntemplate <typename Container>\ninline auto get_data(Container& c) -> typename Container::value_type* {\n  return c.data();\n}\n\n#if defined(_SECURE_SCL) && _SECURE_SCL\n// Make a checked iterator to avoid MSVC warnings.\ntemplate <typename T> using checked_ptr = stdext::checked_array_iterator<T*>;\ntemplate <typename T> auto make_checked(T* p, size_t size) -> checked_ptr<T> {\n  return {p, size};\n}\n#else\ntemplate <typename T> using checked_ptr = T*;\ntemplate <typename T> inline auto make_checked(T* p, size_t) -> T* { return p; }\n#endif\n\n// Attempts to reserve space for n extra characters in the output range.\n// Returns a pointer to the reserved range or a reference to it.\ntemplate <typename Container, FMT_ENABLE_IF(is_contiguous<Container>::value)>\n#if FMT_CLANG_VERSION >= 307 && !FMT_ICC_VERSION\n__attribute__((no_sanitize(\"undefined\")))\n#endif\ninline auto\nreserve(std::back_insert_iterator<Container> it, size_t n)\n    -> checked_ptr<typename Container::value_type> {\n  Container& c = get_container(it);\n  size_t size = c.size();\n  c.resize(size + n);\n  return make_checked(get_data(c) + size, n);\n}\n\ntemplate <typename T>\ninline auto reserve(buffer_appender<T> it, size_t n) -> buffer_appender<T> {\n  buffer<T>& buf = get_container(it);\n  buf.try_reserve(buf.size() + n);\n  return it;\n}\n\ntemplate <typename Iterator>\nconstexpr auto reserve(Iterator& it, size_t) -> Iterator& {\n  return it;\n}\n\ntemplate <typename OutputIt>\nusing reserve_iterator =\n    remove_reference_t<decltype(reserve(std::declval<OutputIt&>(), 0))>;\n\ntemplate <typename T, typename OutputIt>\nconstexpr auto to_pointer(OutputIt, size_t) -> T* {\n  return nullptr;\n}\ntemplate <typename T> auto to_pointer(buffer_appender<T> it, size_t n) -> T* {\n  buffer<T>& buf = get_container(it);\n  auto size = buf.size();\n  if (buf.capacity() < size + n) return nullptr;\n  buf.try_resize(size + n);\n  return buf.data() + size;\n}\n\ntemplate <typename Container, FMT_ENABLE_IF(is_contiguous<Container>::value)>\ninline auto base_iterator(std::back_insert_iterator<Container>& it,\n                          checked_ptr<typename Container::value_type>)\n    -> std::back_insert_iterator<Container> {\n  return it;\n}\n\ntemplate <typename Iterator>\nconstexpr auto base_iterator(Iterator, Iterator it) -> Iterator {\n  return it;\n}\n\n// <algorithm> is spectacularly slow to compile in C++20 so use a simple fill_n\n// instead (#1998).\ntemplate <typename OutputIt, typename Size, typename T>\nFMT_CONSTEXPR auto fill_n(OutputIt out, Size count, const T& value)\n    -> OutputIt {\n  for (Size i = 0; i < count; ++i) *out++ = value;\n  return out;\n}\ntemplate <typename T, typename Size>\nFMT_CONSTEXPR20 auto fill_n(T* out, Size count, char value) -> T* {\n  if (is_constant_evaluated()) {\n    return fill_n<T*, Size, T>(out, count, value);\n  }\n  std::memset(out, value, to_unsigned(count));\n  return out + count;\n}\n\n#ifdef __cpp_char8_t\nusing char8_type = char8_t;\n#else\nenum char8_type : unsigned char {};\n#endif\n\ntemplate <typename OutChar, typename InputIt, typename OutputIt>\nFMT_CONSTEXPR FMT_NOINLINE auto copy_str_noinline(InputIt begin, InputIt end,\n                                                  OutputIt out) -> OutputIt {\n  return copy_str<OutChar>(begin, end, out);\n}\n\n// A public domain branchless UTF-8 decoder by Christopher Wellons:\n// https://github.com/skeeto/branchless-utf8\n/* Decode the next character, c, from s, reporting errors in e.\n *\n * Since this is a branchless decoder, four bytes will be read from the\n * buffer regardless of the actual length of the next character. This\n * means the buffer _must_ have at least three bytes of zero padding\n * following the end of the data stream.\n *\n * Errors are reported in e, which will be non-zero if the parsed\n * character was somehow invalid: invalid byte sequence, non-canonical\n * encoding, or a surrogate half.\n *\n * The function returns a pointer to the next character. When an error\n * occurs, this pointer will be a guess that depends on the particular\n * error, but it will always advance at least one byte.\n */\nFMT_CONSTEXPR inline auto utf8_decode(const char* s, uint32_t* c, int* e)\n    -> const char* {\n  constexpr const int masks[] = {0x00, 0x7f, 0x1f, 0x0f, 0x07};\n  constexpr const uint32_t mins[] = {4194304, 0, 128, 2048, 65536};\n  constexpr const int shiftc[] = {0, 18, 12, 6, 0};\n  constexpr const int shifte[] = {0, 6, 4, 2, 0};\n\n  int len = code_point_length(s);\n  const char* next = s + len;\n\n  // Assume a four-byte character and load four bytes. Unused bits are\n  // shifted out.\n  *c = uint32_t(s[0] & masks[len]) << 18;\n  *c |= uint32_t(s[1] & 0x3f) << 12;\n  *c |= uint32_t(s[2] & 0x3f) << 6;\n  *c |= uint32_t(s[3] & 0x3f) << 0;\n  *c >>= shiftc[len];\n\n  // Accumulate the various error conditions.\n  using uchar = unsigned char;\n  *e = (*c < mins[len]) << 6;       // non-canonical encoding\n  *e |= ((*c >> 11) == 0x1b) << 7;  // surrogate half?\n  *e |= (*c > 0x10FFFF) << 8;       // out of range?\n  *e |= (uchar(s[1]) & 0xc0) >> 2;\n  *e |= (uchar(s[2]) & 0xc0) >> 4;\n  *e |= uchar(s[3]) >> 6;\n  *e ^= 0x2a;  // top two bits of each tail byte correct?\n  *e >>= shifte[len];\n\n  return next;\n}\n\ntemplate <typename F>\nFMT_CONSTEXPR void for_each_codepoint(string_view s, F f) {\n  auto decode = [f](const char* p) {\n    auto cp = uint32_t();\n    auto error = 0;\n    p = utf8_decode(p, &cp, &error);\n    f(cp, error);\n    return p;\n  };\n  auto p = s.data();\n  const size_t block_size = 4;  // utf8_decode always reads blocks of 4 chars.\n  if (s.size() >= block_size) {\n    for (auto end = p + s.size() - block_size + 1; p < end;) p = decode(p);\n  }\n  if (auto num_chars_left = s.data() + s.size() - p) {\n    char buf[2 * block_size - 1] = {};\n    copy_str<char>(p, p + num_chars_left, buf);\n    p = buf;\n    do {\n      p = decode(p);\n    } while (p - buf < num_chars_left);\n  }\n}\n\ntemplate <typename Char>\ninline auto compute_width(basic_string_view<Char> s) -> size_t {\n  return s.size();\n}\n\n// Computes approximate display width of a UTF-8 string.\nFMT_CONSTEXPR inline size_t compute_width(string_view s) {\n  size_t num_code_points = 0;\n  // It is not a lambda for compatibility with C++14.\n  struct count_code_points {\n    size_t* count;\n    FMT_CONSTEXPR void operator()(uint32_t cp, int error) const {\n      *count += detail::to_unsigned(\n          1 +\n          (error == 0 && cp >= 0x1100 &&\n           (cp <= 0x115f ||  // Hangul Jamo init. consonants\n            cp == 0x2329 ||  // LEFT-POINTING ANGLE BRACKET\n            cp == 0x232a ||  // RIGHT-POINTING ANGLE BRACKET\n            // CJK ... Yi except IDEOGRAPHIC HALF FILL SPACE:\n            (cp >= 0x2e80 && cp <= 0xa4cf && cp != 0x303f) ||\n            (cp >= 0xac00 && cp <= 0xd7a3) ||    // Hangul Syllables\n            (cp >= 0xf900 && cp <= 0xfaff) ||    // CJK Compatibility Ideographs\n            (cp >= 0xfe10 && cp <= 0xfe19) ||    // Vertical Forms\n            (cp >= 0xfe30 && cp <= 0xfe6f) ||    // CJK Compatibility Forms\n            (cp >= 0xff00 && cp <= 0xff60) ||    // Fullwidth Forms\n            (cp >= 0xffe0 && cp <= 0xffe6) ||    // Fullwidth Forms\n            (cp >= 0x20000 && cp <= 0x2fffd) ||  // CJK\n            (cp >= 0x30000 && cp <= 0x3fffd) ||\n            // Miscellaneous Symbols and Pictographs + Emoticons:\n            (cp >= 0x1f300 && cp <= 0x1f64f) ||\n            // Supplemental Symbols and Pictographs:\n            (cp >= 0x1f900 && cp <= 0x1f9ff))));\n    }\n  };\n  for_each_codepoint(s, count_code_points{&num_code_points});\n  return num_code_points;\n}\n\ninline auto compute_width(basic_string_view<char8_type> s) -> size_t {\n  return compute_width(basic_string_view<char>(\n      reinterpret_cast<const char*>(s.data()), s.size()));\n}\n\ntemplate <typename Char>\ninline auto code_point_index(basic_string_view<Char> s, size_t n) -> size_t {\n  size_t size = s.size();\n  return n < size ? n : size;\n}\n\n// Calculates the index of the nth code point in a UTF-8 string.\ninline auto code_point_index(basic_string_view<char8_type> s, size_t n)\n    -> size_t {\n  const char8_type* data = s.data();\n  size_t num_code_points = 0;\n  for (size_t i = 0, size = s.size(); i != size; ++i) {\n    if ((data[i] & 0xc0) != 0x80 && ++num_code_points > n) return i;\n  }\n  return s.size();\n}\n\ntemplate <typename T>\nusing is_fast_float = bool_constant<std::numeric_limits<T>::is_iec559 &&\n                                    sizeof(T) <= sizeof(double)>;\n\n#ifndef FMT_USE_FULL_CACHE_DRAGONBOX\n#  define FMT_USE_FULL_CACHE_DRAGONBOX 0\n#endif\n\ntemplate <typename T>\ntemplate <typename U>\nvoid buffer<T>::append(const U* begin, const U* end) {\n  while (begin != end) {\n    auto count = to_unsigned(end - begin);\n    try_reserve(size_ + count);\n    auto free_cap = capacity_ - size_;\n    if (free_cap < count) count = free_cap;\n    std::uninitialized_copy_n(begin, count, make_checked(ptr_ + size_, count));\n    size_ += count;\n    begin += count;\n  }\n}\n\ntemplate <typename T, typename Enable = void>\nstruct is_locale : std::false_type {};\ntemplate <typename T>\nstruct is_locale<T, void_t<decltype(T::classic())>> : std::true_type {};\n}  // namespace detail\n\nFMT_MODULE_EXPORT_BEGIN\n\n// The number of characters to store in the basic_memory_buffer object itself\n// to avoid dynamic memory allocation.\nenum { inline_buffer_size = 500 };\n\n/**\n  \\rst\n  A dynamically growing memory buffer for trivially copyable/constructible types\n  with the first ``SIZE`` elements stored in the object itself.\n\n  You can use the ``memory_buffer`` type alias for ``char`` instead.\n\n  **Example**::\n\n     fmt::memory_buffer out;\n     format_to(out, \"The answer is {}.\", 42);\n\n  This will append the following output to the ``out`` object:\n\n  .. code-block:: none\n\n     The answer is 42.\n\n  The output can be converted to an ``std::string`` with ``to_string(out)``.\n  \\endrst\n */\ntemplate <typename T, size_t SIZE = inline_buffer_size,\n          typename Allocator = std::allocator<T>>\nclass basic_memory_buffer final : public detail::buffer<T> {\n private:\n  T store_[SIZE];\n\n  // Don't inherit from Allocator avoid generating type_info for it.\n  Allocator alloc_;\n\n  // Deallocate memory allocated by the buffer.\n  void deallocate() {\n    T* data = this->data();\n    if (data != store_) alloc_.deallocate(data, this->capacity());\n  }\n\n protected:\n  void grow(size_t size) final FMT_OVERRIDE;\n\n public:\n  using value_type = T;\n  using const_reference = const T&;\n\n  explicit basic_memory_buffer(const Allocator& alloc = Allocator())\n      : alloc_(alloc) {\n    this->set(store_, SIZE);\n  }\n  ~basic_memory_buffer() { deallocate(); }\n\n private:\n  // Move data from other to this buffer.\n  void move(basic_memory_buffer& other) {\n    alloc_ = std::move(other.alloc_);\n    T* data = other.data();\n    size_t size = other.size(), capacity = other.capacity();\n    if (data == other.store_) {\n      this->set(store_, capacity);\n      std::uninitialized_copy(other.store_, other.store_ + size,\n                              detail::make_checked(store_, capacity));\n    } else {\n      this->set(data, capacity);\n      // Set pointer to the inline array so that delete is not called\n      // when deallocating.\n      other.set(other.store_, 0);\n    }\n    this->resize(size);\n  }\n\n public:\n  /**\n    \\rst\n    Constructs a :class:`fmt::basic_memory_buffer` object moving the content\n    of the other object to it.\n    \\endrst\n   */\n  basic_memory_buffer(basic_memory_buffer&& other) FMT_NOEXCEPT { move(other); }\n\n  /**\n    \\rst\n    Moves the content of the other ``basic_memory_buffer`` object to this one.\n    \\endrst\n   */\n  auto operator=(basic_memory_buffer&& other) FMT_NOEXCEPT\n      -> basic_memory_buffer& {\n    FMT_ASSERT(this != &other, \"\");\n    deallocate();\n    move(other);\n    return *this;\n  }\n\n  // Returns a copy of the allocator associated with this buffer.\n  auto get_allocator() const -> Allocator { return alloc_; }\n\n  /**\n    Resizes the buffer to contain *count* elements. If T is a POD type new\n    elements may not be initialized.\n   */\n  void resize(size_t count) { this->try_resize(count); }\n\n  /** Increases the buffer capacity to *new_capacity*. */\n  void reserve(size_t new_capacity) { this->try_reserve(new_capacity); }\n\n  // Directly append data into the buffer\n  using detail::buffer<T>::append;\n  template <typename ContiguousRange>\n  void append(const ContiguousRange& range) {\n    append(range.data(), range.data() + range.size());\n  }\n};\n\ntemplate <typename T, size_t SIZE, typename Allocator>\nvoid basic_memory_buffer<T, SIZE, Allocator>::grow(size_t size) {\n#ifdef FMT_FUZZ\n  if (size > 5000) throw std::runtime_error(\"fuzz mode - won't grow that much\");\n#endif\n  const size_t max_size = std::allocator_traits<Allocator>::max_size(alloc_);\n  size_t old_capacity = this->capacity();\n  size_t new_capacity = old_capacity + old_capacity / 2;\n  if (size > new_capacity)\n    new_capacity = size;\n  else if (new_capacity > max_size)\n    new_capacity = size > max_size ? size : max_size;\n  T* old_data = this->data();\n  T* new_data =\n      std::allocator_traits<Allocator>::allocate(alloc_, new_capacity);\n  // The following code doesn't throw, so the raw pointer above doesn't leak.\n  std::uninitialized_copy(old_data, old_data + this->size(),\n                          detail::make_checked(new_data, new_capacity));\n  this->set(new_data, new_capacity);\n  // deallocate must not throw according to the standard, but even if it does,\n  // the buffer already uses the new storage and will deallocate it in\n  // destructor.\n  if (old_data != store_) alloc_.deallocate(old_data, old_capacity);\n}\n\nusing memory_buffer = basic_memory_buffer<char>;\n\ntemplate <typename T, size_t SIZE, typename Allocator>\nstruct is_contiguous<basic_memory_buffer<T, SIZE, Allocator>> : std::true_type {\n};\n\nnamespace detail {\nFMT_API void print(std::FILE*, string_view);\n}\n\n/** A formatting error such as invalid format string. */\nFMT_CLASS_API\nclass FMT_API format_error : public std::runtime_error {\n public:\n  explicit format_error(const char* message) : std::runtime_error(message) {}\n  explicit format_error(const std::string& message)\n      : std::runtime_error(message) {}\n  format_error(const format_error&) = default;\n  format_error& operator=(const format_error&) = default;\n  format_error(format_error&&) = default;\n  format_error& operator=(format_error&&) = default;\n  ~format_error() FMT_NOEXCEPT FMT_OVERRIDE FMT_MSC_DEFAULT;\n};\n\n/**\n  \\rst\n  Constructs a `~fmt::format_arg_store` object that contains references\n  to arguments and can be implicitly converted to `~fmt::format_args`.\n  If ``fmt`` is a compile-time string then `make_args_checked` checks\n  its validity at compile time.\n  \\endrst\n */\ntemplate <typename... Args, typename S, typename Char = char_t<S>>\nFMT_INLINE auto make_args_checked(const S& fmt,\n                                  const remove_reference_t<Args>&... args)\n    -> format_arg_store<buffer_context<Char>, remove_reference_t<Args>...> {\n  static_assert(\n      detail::count<(\n              std::is_base_of<detail::view, remove_reference_t<Args>>::value &&\n              std::is_reference<Args>::value)...>() == 0,\n      \"passing views as lvalues is disallowed\");\n  detail::check_format_string<Args...>(fmt);\n  return {args...};\n}\n\n// compile-time support\nnamespace detail_exported {\n#if FMT_USE_NONTYPE_TEMPLATE_PARAMETERS\ntemplate <typename Char, size_t N> struct fixed_string {\n  constexpr fixed_string(const Char (&str)[N]) {\n    detail::copy_str<Char, const Char*, Char*>(static_cast<const Char*>(str),\n                                               str + N, data);\n  }\n  Char data[N]{};\n};\n#endif\n\n// Converts a compile-time string to basic_string_view.\ntemplate <typename Char, size_t N>\nconstexpr auto compile_string_to_view(const Char (&s)[N])\n    -> basic_string_view<Char> {\n  // Remove trailing NUL character if needed. Won't be present if this is used\n  // with a raw character array (i.e. not defined as a string).\n  return {s, N - (std::char_traits<Char>::to_int_type(s[N - 1]) == 0 ? 1 : 0)};\n}\ntemplate <typename Char>\nconstexpr auto compile_string_to_view(detail::std_string_view<Char> s)\n    -> basic_string_view<Char> {\n  return {s.data(), s.size()};\n}\n}  // namespace detail_exported\n\nFMT_BEGIN_DETAIL_NAMESPACE\n\ninline void throw_format_error(const char* message) {\n  FMT_THROW(format_error(message));\n}\n\ntemplate <typename T> struct is_integral : std::is_integral<T> {};\ntemplate <> struct is_integral<int128_t> : std::true_type {};\ntemplate <> struct is_integral<uint128_t> : std::true_type {};\n\ntemplate <typename T>\nusing is_signed =\n    std::integral_constant<bool, std::numeric_limits<T>::is_signed ||\n                                     std::is_same<T, int128_t>::value>;\n\n// Returns true if value is negative, false otherwise.\n// Same as `value < 0` but doesn't produce warnings if T is an unsigned type.\ntemplate <typename T, FMT_ENABLE_IF(is_signed<T>::value)>\nFMT_CONSTEXPR auto is_negative(T value) -> bool {\n  return value < 0;\n}\ntemplate <typename T, FMT_ENABLE_IF(!is_signed<T>::value)>\nFMT_CONSTEXPR auto is_negative(T) -> bool {\n  return false;\n}\n\ntemplate <typename T, FMT_ENABLE_IF(std::is_floating_point<T>::value)>\nFMT_CONSTEXPR auto is_supported_floating_point(T) -> uint16_t {\n  return (std::is_same<T, float>::value && FMT_USE_FLOAT) ||\n         (std::is_same<T, double>::value && FMT_USE_DOUBLE) ||\n         (std::is_same<T, long double>::value && FMT_USE_LONG_DOUBLE);\n}\n\n// Smallest of uint32_t, uint64_t, uint128_t that is large enough to\n// represent all values of an integral type T.\ntemplate <typename T>\nusing uint32_or_64_or_128_t =\n    conditional_t<num_bits<T>() <= 32 && !FMT_REDUCE_INT_INSTANTIATIONS,\n                  uint32_t,\n                  conditional_t<num_bits<T>() <= 64, uint64_t, uint128_t>>;\ntemplate <typename T>\nusing uint64_or_128_t = conditional_t<num_bits<T>() <= 64, uint64_t, uint128_t>;\n\n#define FMT_POWERS_OF_10(factor)                                             \\\n  factor * 10, (factor)*100, (factor)*1000, (factor)*10000, (factor)*100000, \\\n      (factor)*1000000, (factor)*10000000, (factor)*100000000,               \\\n      (factor)*1000000000\n\n// Static data is placed in this class template for the header-only config.\ntemplate <typename T = void> struct basic_data {\n  // log10(2) = 0x0.4d104d427de7fbcc...\n  static const uint64_t log10_2_significand = 0x4d104d427de7fbcc;\n\n  // GCC generates slightly better code for pairs than chars.\n  FMT_API static constexpr const char digits[100][2] = {\n      {'0', '0'}, {'0', '1'}, {'0', '2'}, {'0', '3'}, {'0', '4'}, {'0', '5'},\n      {'0', '6'}, {'0', '7'}, {'0', '8'}, {'0', '9'}, {'1', '0'}, {'1', '1'},\n      {'1', '2'}, {'1', '3'}, {'1', '4'}, {'1', '5'}, {'1', '6'}, {'1', '7'},\n      {'1', '8'}, {'1', '9'}, {'2', '0'}, {'2', '1'}, {'2', '2'}, {'2', '3'},\n      {'2', '4'}, {'2', '5'}, {'2', '6'}, {'2', '7'}, {'2', '8'}, {'2', '9'},\n      {'3', '0'}, {'3', '1'}, {'3', '2'}, {'3', '3'}, {'3', '4'}, {'3', '5'},\n      {'3', '6'}, {'3', '7'}, {'3', '8'}, {'3', '9'}, {'4', '0'}, {'4', '1'},\n      {'4', '2'}, {'4', '3'}, {'4', '4'}, {'4', '5'}, {'4', '6'}, {'4', '7'},\n      {'4', '8'}, {'4', '9'}, {'5', '0'}, {'5', '1'}, {'5', '2'}, {'5', '3'},\n      {'5', '4'}, {'5', '5'}, {'5', '6'}, {'5', '7'}, {'5', '8'}, {'5', '9'},\n      {'6', '0'}, {'6', '1'}, {'6', '2'}, {'6', '3'}, {'6', '4'}, {'6', '5'},\n      {'6', '6'}, {'6', '7'}, {'6', '8'}, {'6', '9'}, {'7', '0'}, {'7', '1'},\n      {'7', '2'}, {'7', '3'}, {'7', '4'}, {'7', '5'}, {'7', '6'}, {'7', '7'},\n      {'7', '8'}, {'7', '9'}, {'8', '0'}, {'8', '1'}, {'8', '2'}, {'8', '3'},\n      {'8', '4'}, {'8', '5'}, {'8', '6'}, {'8', '7'}, {'8', '8'}, {'8', '9'},\n      {'9', '0'}, {'9', '1'}, {'9', '2'}, {'9', '3'}, {'9', '4'}, {'9', '5'},\n      {'9', '6'}, {'9', '7'}, {'9', '8'}, {'9', '9'}};\n\n  FMT_API static constexpr const char hex_digits[] = \"0123456789abcdef\";\n  FMT_API static constexpr const char signs[4] = {0, '-', '+', ' '};\n  FMT_API static constexpr const unsigned prefixes[4] = {0, 0, 0x1000000u | '+',\n                                                         0x1000000u | ' '};\n  FMT_API static constexpr const char left_padding_shifts[5] = {31, 31, 0, 1,\n                                                                0};\n  FMT_API static constexpr const char right_padding_shifts[5] = {0, 31, 0, 1,\n                                                                 0};\n};\n\n#ifdef FMT_SHARED\n// Required for -flto, -fivisibility=hidden and -shared to work\nextern template struct basic_data<void>;\n#endif\n\n// This is a struct rather than an alias to avoid shadowing warnings in gcc.\nstruct data : basic_data<> {};\n\ntemplate <typename T> FMT_CONSTEXPR auto count_digits_fallback(T n) -> int {\n  int count = 1;\n  for (;;) {\n    // Integer division is slow so do it for a group of four digits instead\n    // of for every digit. The idea comes from the talk by Alexandrescu\n    // \"Three Optimization Tips for C++\". See speed-test for a comparison.\n    if (n < 10) return count;\n    if (n < 100) return count + 1;\n    if (n < 1000) return count + 2;\n    if (n < 10000) return count + 3;\n    n /= 10000u;\n    count += 4;\n  }\n}\n#if FMT_USE_INT128\nFMT_CONSTEXPR inline auto count_digits(uint128_t n) -> int {\n  return count_digits_fallback(n);\n}\n#endif\n\n// Returns the number of decimal digits in n. Leading zeros are not counted\n// except for n == 0 in which case count_digits returns 1.\nFMT_CONSTEXPR20 inline auto count_digits(uint64_t n) -> int {\n#ifdef FMT_BUILTIN_CLZLL\n  if (!is_constant_evaluated()) {\n    // https://github.com/fmtlib/format-benchmark/blob/master/digits10\n    // Maps bsr(n) to ceil(log10(pow(2, bsr(n) + 1) - 1)).\n    constexpr uint16_t bsr2log10[] = {\n        1,  1,  1,  2,  2,  2,  3,  3,  3,  4,  4,  4,  4,  5,  5,  5,\n        6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  9,  9,  9,  10, 10, 10,\n        10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15,\n        15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20};\n    auto t = bsr2log10[FMT_BUILTIN_CLZLL(n | 1) ^ 63];\n    constexpr const uint64_t zero_or_powers_of_10[] = {\n        0, 0, FMT_POWERS_OF_10(1U), FMT_POWERS_OF_10(1000000000ULL),\n        10000000000000000000ULL};\n    return t - (n < zero_or_powers_of_10[t]);\n  }\n#endif\n  return count_digits_fallback(n);\n}\n\n// Counts the number of digits in n. BITS = log2(radix).\ntemplate <int BITS, typename UInt>\nFMT_CONSTEXPR auto count_digits(UInt n) -> int {\n#ifdef FMT_BUILTIN_CLZ\n  if (num_bits<UInt>() == 32)\n    return (FMT_BUILTIN_CLZ(static_cast<uint32_t>(n) | 1) ^ 31) / BITS + 1;\n#endif\n  int num_digits = 0;\n  do {\n    ++num_digits;\n  } while ((n >>= BITS) != 0);\n  return num_digits;\n}\n\ntemplate <> auto count_digits<4>(detail::fallback_uintptr n) -> int;\n\n// It is a separate function rather than a part of count_digits to workaround\n// the lack of static constexpr in constexpr functions.\nFMT_INLINE uint64_t count_digits_inc(int n) {\n  // An optimization by Kendall Willets from https://bit.ly/3uOIQrB.\n  // This increments the upper 32 bits (log10(T) - 1) when >= T is added.\n#define FMT_INC(T) (((sizeof(#T) - 1ull) << 32) - T)\n  static constexpr uint64_t table[] = {\n      FMT_INC(0),          FMT_INC(0),          FMT_INC(0),           // 8\n      FMT_INC(10),         FMT_INC(10),         FMT_INC(10),          // 64\n      FMT_INC(100),        FMT_INC(100),        FMT_INC(100),         // 512\n      FMT_INC(1000),       FMT_INC(1000),       FMT_INC(1000),        // 4096\n      FMT_INC(10000),      FMT_INC(10000),      FMT_INC(10000),       // 32k\n      FMT_INC(100000),     FMT_INC(100000),     FMT_INC(100000),      // 256k\n      FMT_INC(1000000),    FMT_INC(1000000),    FMT_INC(1000000),     // 2048k\n      FMT_INC(10000000),   FMT_INC(10000000),   FMT_INC(10000000),    // 16M\n      FMT_INC(100000000),  FMT_INC(100000000),  FMT_INC(100000000),   // 128M\n      FMT_INC(1000000000), FMT_INC(1000000000), FMT_INC(1000000000),  // 1024M\n      FMT_INC(1000000000), FMT_INC(1000000000)                        // 4B\n  };\n  return table[n];\n}\n\n// Optional version of count_digits for better performance on 32-bit platforms.\nFMT_CONSTEXPR20 inline auto count_digits(uint32_t n) -> int {\n#ifdef FMT_BUILTIN_CLZ\n  if (!is_constant_evaluated()) {\n    auto inc = count_digits_inc(FMT_BUILTIN_CLZ(n | 1) ^ 31);\n    return static_cast<int>((n + inc) >> 32);\n  }\n#endif\n  return count_digits_fallback(n);\n}\n\ntemplate <typename Int> constexpr auto digits10() FMT_NOEXCEPT -> int {\n  return std::numeric_limits<Int>::digits10;\n}\ntemplate <> constexpr auto digits10<int128_t>() FMT_NOEXCEPT -> int {\n  return 38;\n}\ntemplate <> constexpr auto digits10<uint128_t>() FMT_NOEXCEPT -> int {\n  return 38;\n}\n\ntemplate <typename Char> struct thousands_sep_result {\n  std::string grouping;\n  Char thousands_sep;\n};\n\ntemplate <typename Char>\nFMT_API auto thousands_sep_impl(locale_ref loc) -> thousands_sep_result<Char>;\ntemplate <typename Char>\ninline auto thousands_sep(locale_ref loc) -> thousands_sep_result<Char> {\n  auto result = thousands_sep_impl<char>(loc);\n  return {result.grouping, Char(result.thousands_sep)};\n}\ntemplate <>\ninline auto thousands_sep(locale_ref loc) -> thousands_sep_result<wchar_t> {\n  return thousands_sep_impl<wchar_t>(loc);\n}\n\ntemplate <typename Char>\nFMT_API auto decimal_point_impl(locale_ref loc) -> Char;\ntemplate <typename Char> inline auto decimal_point(locale_ref loc) -> Char {\n  return Char(decimal_point_impl<char>(loc));\n}\ntemplate <> inline auto decimal_point(locale_ref loc) -> wchar_t {\n  return decimal_point_impl<wchar_t>(loc);\n}\n\n// Compares two characters for equality.\ntemplate <typename Char> auto equal2(const Char* lhs, const char* rhs) -> bool {\n  return lhs[0] == Char(rhs[0]) && lhs[1] == Char(rhs[1]);\n}\ninline auto equal2(const char* lhs, const char* rhs) -> bool {\n  return memcmp(lhs, rhs, 2) == 0;\n}\n\n// Copies two characters from src to dst.\ntemplate <typename Char> void copy2(Char* dst, const char* src) {\n  *dst++ = static_cast<Char>(*src++);\n  *dst = static_cast<Char>(*src);\n}\nFMT_INLINE void copy2(char* dst, const char* src) { memcpy(dst, src, 2); }\n\ntemplate <typename Iterator> struct format_decimal_result {\n  Iterator begin;\n  Iterator end;\n};\n\n// Formats a decimal unsigned integer value writing into out pointing to a\n// buffer of specified size. The caller must ensure that the buffer is large\n// enough.\ntemplate <typename Char, typename UInt>\nFMT_CONSTEXPR20 auto format_decimal(Char* out, UInt value, int size)\n    -> format_decimal_result<Char*> {\n  FMT_ASSERT(size >= count_digits(value), \"invalid digit count\");\n  out += size;\n  Char* end = out;\n  if (is_constant_evaluated()) {\n    while (value >= 10) {\n      *--out = static_cast<Char>('0' + value % 10);\n      value /= 10;\n    }\n    *--out = static_cast<Char>('0' + value);\n    return {out, end};\n  }\n  while (value >= 100) {\n    // Integer division is slow so do it for a group of two digits instead\n    // of for every digit. The idea comes from the talk by Alexandrescu\n    // \"Three Optimization Tips for C++\". See speed-test for a comparison.\n    out -= 2;\n    copy2(out, data::digits[value % 100]);\n    value /= 100;\n  }\n  if (value < 10) {\n    *--out = static_cast<Char>('0' + value);\n    return {out, end};\n  }\n  out -= 2;\n  copy2(out, data::digits[value]);\n  return {out, end};\n}\n\ntemplate <typename Char, typename UInt, typename Iterator,\n          FMT_ENABLE_IF(!std::is_pointer<remove_cvref_t<Iterator>>::value)>\ninline auto format_decimal(Iterator out, UInt value, int size)\n    -> format_decimal_result<Iterator> {\n  // Buffer is large enough to hold all digits (digits10 + 1).\n  Char buffer[digits10<UInt>() + 1];\n  auto end = format_decimal(buffer, value, size).end;\n  return {out, detail::copy_str_noinline<Char>(buffer, end, out)};\n}\n\ntemplate <unsigned BASE_BITS, typename Char, typename UInt>\nFMT_CONSTEXPR auto format_uint(Char* buffer, UInt value, int num_digits,\n                               bool upper = false) -> Char* {\n  buffer += num_digits;\n  Char* end = buffer;\n  do {\n    const char* digits = upper ? \"0123456789ABCDEF\" : data::hex_digits;\n    unsigned digit = (value & ((1 << BASE_BITS) - 1));\n    *--buffer = static_cast<Char>(BASE_BITS < 4 ? static_cast<char>('0' + digit)\n                                                : digits[digit]);\n  } while ((value >>= BASE_BITS) != 0);\n  return end;\n}\n\ntemplate <unsigned BASE_BITS, typename Char>\nauto format_uint(Char* buffer, detail::fallback_uintptr n, int num_digits,\n                 bool = false) -> Char* {\n  auto char_digits = std::numeric_limits<unsigned char>::digits / 4;\n  int start = (num_digits + char_digits - 1) / char_digits - 1;\n  if (int start_digits = num_digits % char_digits) {\n    unsigned value = n.value[start--];\n    buffer = format_uint<BASE_BITS>(buffer, value, start_digits);\n  }\n  for (; start >= 0; --start) {\n    unsigned value = n.value[start];\n    buffer += char_digits;\n    auto p = buffer;\n    for (int i = 0; i < char_digits; ++i) {\n      unsigned digit = (value & ((1 << BASE_BITS) - 1));\n      *--p = static_cast<Char>(data::hex_digits[digit]);\n      value >>= BASE_BITS;\n    }\n  }\n  return buffer;\n}\n\ntemplate <unsigned BASE_BITS, typename Char, typename It, typename UInt>\ninline auto format_uint(It out, UInt value, int num_digits, bool upper = false)\n    -> It {\n  if (auto ptr = to_pointer<Char>(out, to_unsigned(num_digits))) {\n    format_uint<BASE_BITS>(ptr, value, num_digits, upper);\n    return out;\n  }\n  // Buffer should be large enough to hold all digits (digits / BASE_BITS + 1).\n  char buffer[num_bits<UInt>() / BASE_BITS + 1];\n  format_uint<BASE_BITS>(buffer, value, num_digits, upper);\n  return detail::copy_str_noinline<Char>(buffer, buffer + num_digits, out);\n}\n\n// A converter from UTF-8 to UTF-16.\nclass utf8_to_utf16 {\n private:\n  basic_memory_buffer<wchar_t> buffer_;\n\n public:\n  FMT_API explicit utf8_to_utf16(string_view s);\n  operator basic_string_view<wchar_t>() const { return {&buffer_[0], size()}; }\n  auto size() const -> size_t { return buffer_.size() - 1; }\n  auto c_str() const -> const wchar_t* { return &buffer_[0]; }\n  auto str() const -> std::wstring { return {&buffer_[0], size()}; }\n};\n\nnamespace dragonbox {\n\n// Type-specific information that Dragonbox uses.\ntemplate <class T> struct float_info;\n\ntemplate <> struct float_info<float> {\n  using carrier_uint = uint32_t;\n  static const int significand_bits = 23;\n  static const int exponent_bits = 8;\n  static const int min_exponent = -126;\n  static const int max_exponent = 127;\n  static const int exponent_bias = -127;\n  static const int decimal_digits = 9;\n  static const int kappa = 1;\n  static const int big_divisor = 100;\n  static const int small_divisor = 10;\n  static const int min_k = -31;\n  static const int max_k = 46;\n  static const int cache_bits = 64;\n  static const int divisibility_check_by_5_threshold = 39;\n  static const int case_fc_pm_half_lower_threshold = -1;\n  static const int case_fc_pm_half_upper_threshold = 6;\n  static const int case_fc_lower_threshold = -2;\n  static const int case_fc_upper_threshold = 6;\n  static const int case_shorter_interval_left_endpoint_lower_threshold = 2;\n  static const int case_shorter_interval_left_endpoint_upper_threshold = 3;\n  static const int shorter_interval_tie_lower_threshold = -35;\n  static const int shorter_interval_tie_upper_threshold = -35;\n  static const int max_trailing_zeros = 7;\n};\n\ntemplate <> struct float_info<double> {\n  using carrier_uint = uint64_t;\n  static const int significand_bits = 52;\n  static const int exponent_bits = 11;\n  static const int min_exponent = -1022;\n  static const int max_exponent = 1023;\n  static const int exponent_bias = -1023;\n  static const int decimal_digits = 17;\n  static const int kappa = 2;\n  static const int big_divisor = 1000;\n  static const int small_divisor = 100;\n  static const int min_k = -292;\n  static const int max_k = 326;\n  static const int cache_bits = 128;\n  static const int divisibility_check_by_5_threshold = 86;\n  static const int case_fc_pm_half_lower_threshold = -2;\n  static const int case_fc_pm_half_upper_threshold = 9;\n  static const int case_fc_lower_threshold = -4;\n  static const int case_fc_upper_threshold = 9;\n  static const int case_shorter_interval_left_endpoint_lower_threshold = 2;\n  static const int case_shorter_interval_left_endpoint_upper_threshold = 3;\n  static const int shorter_interval_tie_lower_threshold = -77;\n  static const int shorter_interval_tie_upper_threshold = -77;\n  static const int max_trailing_zeros = 16;\n};\n\ntemplate <typename T> struct decimal_fp {\n  using significand_type = typename float_info<T>::carrier_uint;\n  significand_type significand;\n  int exponent;\n};\n\ntemplate <typename T>\nFMT_API auto to_decimal(T x) FMT_NOEXCEPT -> decimal_fp<T>;\n}  // namespace dragonbox\n\ntemplate <typename T>\nconstexpr auto exponent_mask() ->\n    typename dragonbox::float_info<T>::carrier_uint {\n  using uint = typename dragonbox::float_info<T>::carrier_uint;\n  return ((uint(1) << dragonbox::float_info<T>::exponent_bits) - 1)\n         << dragonbox::float_info<T>::significand_bits;\n}\n\n// Writes the exponent exp in the form \"[+-]d{2,3}\" to buffer.\ntemplate <typename Char, typename It>\nauto write_exponent(int exp, It it) -> It {\n  FMT_ASSERT(-10000 < exp && exp < 10000, \"exponent out of range\");\n  if (exp < 0) {\n    *it++ = static_cast<Char>('-');\n    exp = -exp;\n  } else {\n    *it++ = static_cast<Char>('+');\n  }\n  if (exp >= 100) {\n    const char* top = data::digits[exp / 100];\n    if (exp >= 1000) *it++ = static_cast<Char>(top[0]);\n    *it++ = static_cast<Char>(top[1]);\n    exp %= 100;\n  }\n  const char* d = data::digits[exp];\n  *it++ = static_cast<Char>(d[0]);\n  *it++ = static_cast<Char>(d[1]);\n  return it;\n}\n\ntemplate <typename T>\nauto format_float(T value, int precision, float_specs specs, buffer<char>& buf)\n    -> int;\n\n// Formats a floating-point number with snprintf.\ntemplate <typename T>\nauto snprintf_float(T value, int precision, float_specs specs,\n                    buffer<char>& buf) -> int;\n\ntemplate <typename T> auto promote_float(T value) -> T { return value; }\ninline auto promote_float(float value) -> double {\n  return static_cast<double>(value);\n}\n\ntemplate <typename OutputIt, typename Char>\nFMT_NOINLINE FMT_CONSTEXPR auto fill(OutputIt it, size_t n,\n                                     const fill_t<Char>& fill) -> OutputIt {\n  auto fill_size = fill.size();\n  if (fill_size == 1) return detail::fill_n(it, n, fill[0]);\n  auto data = fill.data();\n  for (size_t i = 0; i < n; ++i)\n    it = copy_str<Char>(data, data + fill_size, it);\n  return it;\n}\n\n// Writes the output of f, padded according to format specifications in specs.\n// size: output size in code units.\n// width: output display width in (terminal) column positions.\ntemplate <align::type align = align::left, typename OutputIt, typename Char,\n          typename F>\nFMT_CONSTEXPR auto write_padded(OutputIt out,\n                                const basic_format_specs<Char>& specs,\n                                size_t size, size_t width, F&& f) -> OutputIt {\n  static_assert(align == align::left || align == align::right, \"\");\n  unsigned spec_width = to_unsigned(specs.width);\n  size_t padding = spec_width > width ? spec_width - width : 0;\n  auto* shifts = align == align::left ? data::left_padding_shifts\n                                      : data::right_padding_shifts;\n  size_t left_padding = padding >> shifts[specs.align];\n  size_t right_padding = padding - left_padding;\n  auto it = reserve(out, size + padding * specs.fill.size());\n  if (left_padding != 0) it = fill(it, left_padding, specs.fill);\n  it = f(it);\n  if (right_padding != 0) it = fill(it, right_padding, specs.fill);\n  return base_iterator(out, it);\n}\n\ntemplate <align::type align = align::left, typename OutputIt, typename Char,\n          typename F>\nconstexpr auto write_padded(OutputIt out, const basic_format_specs<Char>& specs,\n                            size_t size, F&& f) -> OutputIt {\n  return write_padded<align>(out, specs, size, size, f);\n}\n\ntemplate <align::type align = align::left, typename Char, typename OutputIt>\nFMT_CONSTEXPR auto write_bytes(OutputIt out, string_view bytes,\n                               const basic_format_specs<Char>& specs)\n    -> OutputIt {\n  return write_padded<align>(\n      out, specs, bytes.size(), [bytes](reserve_iterator<OutputIt> it) {\n        const char* data = bytes.data();\n        return copy_str<Char>(data, data + bytes.size(), it);\n      });\n}\n\ntemplate <typename Char, typename OutputIt, typename UIntPtr>\nauto write_ptr(OutputIt out, UIntPtr value,\n               const basic_format_specs<Char>* specs) -> OutputIt {\n  int num_digits = count_digits<4>(value);\n  auto size = to_unsigned(num_digits) + size_t(2);\n  auto write = [=](reserve_iterator<OutputIt> it) {\n    *it++ = static_cast<Char>('0');\n    *it++ = static_cast<Char>('x');\n    return format_uint<4, Char>(it, value, num_digits);\n  };\n  return specs ? write_padded<align::right>(out, *specs, size, write)\n               : base_iterator(out, write(reserve(out, size)));\n}\n\ntemplate <typename Char, typename OutputIt>\nFMT_CONSTEXPR auto write_char(OutputIt out, Char value,\n                              const basic_format_specs<Char>& specs)\n    -> OutputIt {\n  return write_padded(out, specs, 1, [=](reserve_iterator<OutputIt> it) {\n    *it++ = value;\n    return it;\n  });\n}\ntemplate <typename Char, typename OutputIt>\nFMT_CONSTEXPR auto write(OutputIt out, Char value,\n                         const basic_format_specs<Char>& specs,\n                         locale_ref loc = {}) -> OutputIt {\n  return check_char_specs(specs)\n             ? write_char(out, value, specs)\n             : write(out, static_cast<int>(value), specs, loc);\n}\n\n// Data for write_int that doesn't depend on output iterator type. It is used to\n// avoid template code bloat.\ntemplate <typename Char> struct write_int_data {\n  size_t size;\n  size_t padding;\n\n  FMT_CONSTEXPR write_int_data(int num_digits, unsigned prefix,\n                               const basic_format_specs<Char>& specs)\n      : size((prefix >> 24) + to_unsigned(num_digits)), padding(0) {\n    if (specs.align == align::numeric) {\n      auto width = to_unsigned(specs.width);\n      if (width > size) {\n        padding = width - size;\n        size = width;\n      }\n    } else if (specs.precision > num_digits) {\n      size = (prefix >> 24) + to_unsigned(specs.precision);\n      padding = to_unsigned(specs.precision - num_digits);\n    }\n  }\n};\n\n// Writes an integer in the format\n//   <left-padding><prefix><numeric-padding><digits><right-padding>\n// where <digits> are written by write_digits(it).\n// prefix contains chars in three lower bytes and the size in the fourth byte.\ntemplate <typename OutputIt, typename Char, typename W>\nFMT_CONSTEXPR FMT_INLINE auto write_int(OutputIt out, int num_digits,\n                                        unsigned prefix,\n                                        const basic_format_specs<Char>& specs,\n                                        W write_digits) -> OutputIt {\n  // Slightly faster check for specs.width == 0 && specs.precision == -1.\n  if ((specs.width | (specs.precision + 1)) == 0) {\n    auto it = reserve(out, to_unsigned(num_digits) + (prefix >> 24));\n    if (prefix != 0) {\n      for (unsigned p = prefix & 0xffffff; p != 0; p >>= 8)\n        *it++ = static_cast<Char>(p & 0xff);\n    }\n    return base_iterator(out, write_digits(it));\n  }\n  auto data = write_int_data<Char>(num_digits, prefix, specs);\n  return write_padded<align::right>(\n      out, specs, data.size, [=](reserve_iterator<OutputIt> it) {\n        for (unsigned p = prefix & 0xffffff; p != 0; p >>= 8)\n          *it++ = static_cast<Char>(p & 0xff);\n        it = detail::fill_n(it, data.padding, static_cast<Char>('0'));\n        return write_digits(it);\n      });\n}\n\ntemplate <typename Char> class digit_grouping {\n private:\n  thousands_sep_result<Char> sep_;\n  std::string::const_iterator group_;\n  int pos_;\n\n public:\n  explicit digit_grouping(locale_ref loc) {\n    if (loc) {\n      sep_ = thousands_sep<Char>(loc);\n      reset();\n    } else {\n      sep_.thousands_sep = Char();\n    }\n  }\n\n  void reset() {\n    group_ = sep_.grouping.begin();\n    pos_ = 0;\n  }\n\n  // Returns the next digit group separator position.\n  int next() {\n    if (!sep_.thousands_sep) return max_value<int>();\n    if (group_ == sep_.grouping.end()) return pos_ += sep_.grouping.back();\n    if (*group_ <= 0 || *group_ == max_value<char>()) return max_value<int>();\n    pos_ += *group_++;\n    return pos_;\n  }\n\n  int count_separators(int num_digits) {\n    int count = 0;\n    while (num_digits > next()) ++count;\n    reset();\n    return count;\n  }\n\n  Char separator() const { return sep_.thousands_sep; }\n};\n\ntemplate <typename OutputIt, typename UInt, typename Char>\nauto write_int_localized(OutputIt& out, UInt value, unsigned prefix,\n                         const basic_format_specs<Char>& specs, locale_ref loc)\n    -> bool {\n  static_assert(std::is_same<uint64_or_128_t<UInt>, UInt>::value, \"\");\n  int num_digits = count_digits(value);\n  char digits[40];\n  format_decimal(digits, value, num_digits);\n\n  auto grouping = digit_grouping<Char>(loc);\n  unsigned size = to_unsigned((prefix != 0 ? 1 : 0) + num_digits +\n                              grouping.count_separators(num_digits));\n  auto buffer = basic_memory_buffer<Char>();\n  buffer.resize(size);\n  int separator_pos = grouping.next();\n  auto p = buffer.data() + size;\n  for (int i = 0; i < num_digits; ++i) {\n    if (i == separator_pos) {\n      *--p = grouping.separator();\n      separator_pos = grouping.next();\n    }\n    *--p = static_cast<Char>(digits[num_digits - i - 1]);\n  }\n  if (prefix != 0) *--p = static_cast<Char>(prefix);\n  out = write_padded<align::right>(out, specs, size, size,\n                                   [=](reserve_iterator<OutputIt> it) {\n                                     return copy_str<Char>(p, p + size, it);\n                                   });\n  return true;\n}\n\nFMT_CONSTEXPR inline void prefix_append(unsigned& prefix, unsigned value) {\n  prefix |= prefix != 0 ? value << 8 : value;\n  prefix += (1u + (value > 0xff ? 1 : 0)) << 24;\n}\n\ntemplate <typename UInt> struct write_int_arg {\n  UInt abs_value;\n  unsigned prefix;\n};\n\ntemplate <typename T>\nFMT_CONSTEXPR auto make_write_int_arg(T value, sign_t sign)\n    -> write_int_arg<uint32_or_64_or_128_t<T>> {\n  auto prefix = 0u;\n  auto abs_value = static_cast<uint32_or_64_or_128_t<T>>(value);\n  if (is_negative(value)) {\n    prefix = 0x01000000 | '-';\n    abs_value = 0 - abs_value;\n  } else {\n    prefix = data::prefixes[sign];\n  }\n  return {abs_value, prefix};\n}\n\ntemplate <typename Char, typename OutputIt, typename T>\nFMT_CONSTEXPR FMT_INLINE auto write_int(OutputIt out, write_int_arg<T> arg,\n                                        const basic_format_specs<Char>& specs,\n                                        locale_ref loc) -> OutputIt {\n  static_assert(std::is_same<T, uint32_or_64_or_128_t<T>>::value, \"\");\n  auto abs_value = arg.abs_value;\n  auto prefix = arg.prefix;\n  auto utype = static_cast<unsigned>(specs.type);\n  switch (specs.type) {\n  case 0:\n  case 'd': {\n    if (specs.localized &&\n        write_int_localized(out, static_cast<uint64_or_128_t<T>>(abs_value),\n                            prefix, specs, loc)) {\n      return out;\n    }\n    auto num_digits = count_digits(abs_value);\n    return write_int(\n        out, num_digits, prefix, specs, [=](reserve_iterator<OutputIt> it) {\n          return format_decimal<Char>(it, abs_value, num_digits).end;\n        });\n  }\n  case 'x':\n  case 'X': {\n    if (specs.alt) prefix_append(prefix, (utype << 8) | '0');\n    bool upper = specs.type != 'x';\n    int num_digits = count_digits<4>(abs_value);\n    return write_int(\n        out, num_digits, prefix, specs, [=](reserve_iterator<OutputIt> it) {\n          return format_uint<4, Char>(it, abs_value, num_digits, upper);\n        });\n  }\n  case 'b':\n  case 'B': {\n    if (specs.alt) prefix_append(prefix, (utype << 8) | '0');\n    int num_digits = count_digits<1>(abs_value);\n    return write_int(out, num_digits, prefix, specs,\n                     [=](reserve_iterator<OutputIt> it) {\n                       return format_uint<1, Char>(it, abs_value, num_digits);\n                     });\n  }\n  case 'o': {\n    int num_digits = count_digits<3>(abs_value);\n    if (specs.alt && specs.precision <= num_digits && abs_value != 0) {\n      // Octal prefix '0' is counted as a digit, so only add it if precision\n      // is not greater than the number of digits.\n      prefix_append(prefix, '0');\n    }\n    return write_int(out, num_digits, prefix, specs,\n                     [=](reserve_iterator<OutputIt> it) {\n                       return format_uint<3, Char>(it, abs_value, num_digits);\n                     });\n  }\n  case 'c':\n    return write_char(out, static_cast<Char>(abs_value), specs);\n  default:\n    FMT_THROW(format_error(\"invalid type specifier\"));\n  }\n  return out;\n}\ntemplate <typename Char, typename OutputIt, typename T,\n          FMT_ENABLE_IF(is_integral<T>::value &&\n                        !std::is_same<T, bool>::value &&\n                        std::is_same<OutputIt, buffer_appender<Char>>::value)>\nFMT_CONSTEXPR auto write(OutputIt out, T value,\n                         const basic_format_specs<Char>& specs, locale_ref loc)\n    -> OutputIt {\n  return write_int(out, make_write_int_arg(value, specs.sign), specs, loc);\n}\n// An inlined version of write used in format string compilation.\ntemplate <typename Char, typename OutputIt, typename T,\n          FMT_ENABLE_IF(is_integral<T>::value &&\n                        !std::is_same<T, bool>::value &&\n                        !std::is_same<OutputIt, buffer_appender<Char>>::value)>\nFMT_CONSTEXPR FMT_INLINE auto write(OutputIt out, T value,\n                                    const basic_format_specs<Char>& specs,\n                                    locale_ref loc) -> OutputIt {\n  return write_int(out, make_write_int_arg(value, specs.sign), specs, loc);\n}\n\ntemplate <typename Char, typename OutputIt>\nFMT_CONSTEXPR auto write(OutputIt out, basic_string_view<Char> s,\n                         const basic_format_specs<Char>& specs) -> OutputIt {\n  auto data = s.data();\n  auto size = s.size();\n  if (specs.precision >= 0 && to_unsigned(specs.precision) < size)\n    size = code_point_index(s, to_unsigned(specs.precision));\n  auto width =\n      specs.width != 0 ? compute_width(basic_string_view<Char>(data, size)) : 0;\n  return write_padded(out, specs, size, width,\n                      [=](reserve_iterator<OutputIt> it) {\n                        return copy_str<Char>(data, data + size, it);\n                      });\n}\ntemplate <typename Char, typename OutputIt>\nFMT_CONSTEXPR auto write(OutputIt out,\n                         basic_string_view<type_identity_t<Char>> s,\n                         const basic_format_specs<Char>& specs, locale_ref)\n    -> OutputIt {\n  check_string_type_spec(specs.type);\n  return write(out, s, specs);\n}\ntemplate <typename Char, typename OutputIt>\nFMT_CONSTEXPR auto write(OutputIt out, const Char* s,\n                         const basic_format_specs<Char>& specs, locale_ref)\n    -> OutputIt {\n  return check_cstring_type_spec(specs.type)\n             ? write(out, basic_string_view<Char>(s), specs, {})\n             : write_ptr<Char>(out, to_uintptr(s), &specs);\n}\n\ntemplate <typename Char, typename OutputIt>\nauto write_nonfinite(OutputIt out, bool isinf, basic_format_specs<Char> specs,\n                     const float_specs& fspecs) -> OutputIt {\n  auto str =\n      isinf ? (fspecs.upper ? \"INF\" : \"inf\") : (fspecs.upper ? \"NAN\" : \"nan\");\n  constexpr size_t str_size = 3;\n  auto sign = fspecs.sign;\n  auto size = str_size + (sign ? 1 : 0);\n  // Replace '0'-padding with space for non-finite values.\n  const bool is_zero_fill =\n      specs.fill.size() == 1 && *specs.fill.data() == static_cast<Char>('0');\n  if (is_zero_fill) specs.fill[0] = static_cast<Char>(' ');\n  return write_padded(out, specs, size, [=](reserve_iterator<OutputIt> it) {\n    if (sign) *it++ = static_cast<Char>(data::signs[sign]);\n    return copy_str<Char>(str, str + str_size, it);\n  });\n}\n\n// A decimal floating-point number significand * pow(10, exp).\nstruct big_decimal_fp {\n  const char* significand;\n  int significand_size;\n  int exponent;\n};\n\ninline auto get_significand_size(const big_decimal_fp& fp) -> int {\n  return fp.significand_size;\n}\ntemplate <typename T>\ninline auto get_significand_size(const dragonbox::decimal_fp<T>& fp) -> int {\n  return count_digits(fp.significand);\n}\n\ntemplate <typename Char, typename OutputIt>\ninline auto write_significand(OutputIt out, const char* significand,\n                              int significand_size) -> OutputIt {\n  return copy_str<Char>(significand, significand + significand_size, out);\n}\ntemplate <typename Char, typename OutputIt, typename UInt>\ninline auto write_significand(OutputIt out, UInt significand,\n                              int significand_size) -> OutputIt {\n  return format_decimal<Char>(out, significand, significand_size).end;\n}\n\ntemplate <typename Char, typename UInt,\n          FMT_ENABLE_IF(std::is_integral<UInt>::value)>\ninline auto write_significand(Char* out, UInt significand, int significand_size,\n                              int integral_size, Char decimal_point) -> Char* {\n  if (!decimal_point)\n    return format_decimal(out, significand, significand_size).end;\n  auto end = format_decimal(out + 1, significand, significand_size).end;\n  if (integral_size == 1) {\n    out[0] = out[1];\n  } else {\n    std::uninitialized_copy_n(out + 1, integral_size,\n                              make_checked(out, to_unsigned(integral_size)));\n  }\n  out[integral_size] = decimal_point;\n  return end;\n}\n\ntemplate <typename OutputIt, typename UInt, typename Char,\n          FMT_ENABLE_IF(!std::is_pointer<remove_cvref_t<OutputIt>>::value)>\ninline auto write_significand(OutputIt out, UInt significand,\n                              int significand_size, int integral_size,\n                              Char decimal_point) -> OutputIt {\n  // Buffer is large enough to hold digits (digits10 + 1) and a decimal point.\n  Char buffer[digits10<UInt>() + 2];\n  auto end = write_significand(buffer, significand, significand_size,\n                               integral_size, decimal_point);\n  return detail::copy_str_noinline<Char>(buffer, end, out);\n}\n\ntemplate <typename OutputIt, typename Char>\ninline auto write_significand(OutputIt out, const char* significand,\n                              int significand_size, int integral_size,\n                              Char decimal_point) -> OutputIt {\n  out = detail::copy_str_noinline<Char>(significand,\n                                        significand + integral_size, out);\n  if (!decimal_point) return out;\n  *out++ = decimal_point;\n  return detail::copy_str_noinline<Char>(significand + integral_size,\n                                         significand + significand_size, out);\n}\n\ntemplate <typename OutputIt, typename DecimalFP, typename Char>\nauto write_float(OutputIt out, const DecimalFP& fp,\n                 const basic_format_specs<Char>& specs, float_specs fspecs,\n                 locale_ref loc) -> OutputIt {\n  auto significand = fp.significand;\n  int significand_size = get_significand_size(fp);\n  static const Char zero = static_cast<Char>('0');\n  auto sign = fspecs.sign;\n  size_t size = to_unsigned(significand_size) + (sign ? 1 : 0);\n  using iterator = reserve_iterator<OutputIt>;\n\n  Char decimal_point =\n      fspecs.locale ? detail::decimal_point<Char>(loc) : static_cast<Char>('.');\n\n  int output_exp = fp.exponent + significand_size - 1;\n  auto use_exp_format = [=]() {\n    if (fspecs.format == float_format::exp) return true;\n    if (fspecs.format != float_format::general) return false;\n    // Use the fixed notation if the exponent is in [exp_lower, exp_upper),\n    // e.g. 0.0001 instead of 1e-04. Otherwise use the exponent notation.\n    const int exp_lower = -4, exp_upper = 16;\n    return output_exp < exp_lower ||\n           output_exp >= (fspecs.precision > 0 ? fspecs.precision : exp_upper);\n  };\n  if (use_exp_format()) {\n    int num_zeros = 0;\n    if (fspecs.showpoint) {\n      num_zeros = fspecs.precision - significand_size;\n      if (num_zeros < 0) num_zeros = 0;\n      size += to_unsigned(num_zeros);\n    } else if (significand_size == 1) {\n      decimal_point = Char();\n    }\n    auto abs_output_exp = output_exp >= 0 ? output_exp : -output_exp;\n    int exp_digits = 2;\n    if (abs_output_exp >= 100) exp_digits = abs_output_exp >= 1000 ? 4 : 3;\n\n    size += to_unsigned((decimal_point ? 1 : 0) + 2 + exp_digits);\n    char exp_char = fspecs.upper ? 'E' : 'e';\n    auto write = [=](iterator it) {\n      if (sign) *it++ = static_cast<Char>(data::signs[sign]);\n      // Insert a decimal point after the first digit and add an exponent.\n      it = write_significand(it, significand, significand_size, 1,\n                             decimal_point);\n      if (num_zeros > 0) it = detail::fill_n(it, num_zeros, zero);\n      *it++ = static_cast<Char>(exp_char);\n      return write_exponent<Char>(output_exp, it);\n    };\n    return specs.width > 0 ? write_padded<align::right>(out, specs, size, write)\n                           : base_iterator(out, write(reserve(out, size)));\n  }\n\n  int exp = fp.exponent + significand_size;\n  if (fp.exponent >= 0) {\n    // 1234e5 -> 123400000[.0+]\n    size += to_unsigned(fp.exponent);\n    int num_zeros = fspecs.precision - exp;\n#ifdef FMT_FUZZ\n    if (num_zeros > 5000)\n      throw std::runtime_error(\"fuzz mode - avoiding excessive cpu use\");\n#endif\n    if (fspecs.showpoint) {\n      if (num_zeros <= 0 && fspecs.format != float_format::fixed) num_zeros = 1;\n      if (num_zeros > 0) size += to_unsigned(num_zeros) + 1;\n    }\n    return write_padded<align::right>(out, specs, size, [&](iterator it) {\n      if (sign) *it++ = static_cast<Char>(data::signs[sign]);\n      it = write_significand<Char>(it, significand, significand_size);\n      it = detail::fill_n(it, fp.exponent, zero);\n      if (!fspecs.showpoint) return it;\n      *it++ = decimal_point;\n      return num_zeros > 0 ? detail::fill_n(it, num_zeros, zero) : it;\n    });\n  } else if (exp > 0) {\n    // 1234e-2 -> 12.34[0+]\n    int num_zeros = fspecs.showpoint ? fspecs.precision - significand_size : 0;\n    size += 1 + to_unsigned(num_zeros > 0 ? num_zeros : 0);\n    return write_padded<align::right>(out, specs, size, [&](iterator it) {\n      if (sign) *it++ = static_cast<Char>(data::signs[sign]);\n      it = write_significand(it, significand, significand_size, exp,\n                             decimal_point);\n      return num_zeros > 0 ? detail::fill_n(it, num_zeros, zero) : it;\n    });\n  }\n  // 1234e-6 -> 0.001234\n  int num_zeros = -exp;\n  if (significand_size == 0 && fspecs.precision >= 0 &&\n      fspecs.precision < num_zeros) {\n    num_zeros = fspecs.precision;\n  }\n  bool pointy = num_zeros != 0 || significand_size != 0 || fspecs.showpoint;\n  size += 1 + (pointy ? 1 : 0) + to_unsigned(num_zeros);\n  return write_padded<align::right>(out, specs, size, [&](iterator it) {\n    if (sign) *it++ = static_cast<Char>(data::signs[sign]);\n    *it++ = zero;\n    if (!pointy) return it;\n    *it++ = decimal_point;\n    it = detail::fill_n(it, num_zeros, zero);\n    return write_significand<Char>(it, significand, significand_size);\n  });\n}\n\ntemplate <typename Char, typename OutputIt, typename T,\n          FMT_ENABLE_IF(std::is_floating_point<T>::value)>\nauto write(OutputIt out, T value, basic_format_specs<Char> specs,\n           locale_ref loc = {}) -> OutputIt {\n  if (const_check(!is_supported_floating_point(value))) return out;\n  float_specs fspecs = parse_float_type_spec(specs);\n  fspecs.sign = specs.sign;\n  if (std::signbit(value)) {  // value < 0 is false for NaN so use signbit.\n    fspecs.sign = sign::minus;\n    value = -value;\n  } else if (fspecs.sign == sign::minus) {\n    fspecs.sign = sign::none;\n  }\n\n  if (!std::isfinite(value))\n    return write_nonfinite(out, std::isinf(value), specs, fspecs);\n\n  if (specs.align == align::numeric && fspecs.sign) {\n    auto it = reserve(out, 1);\n    *it++ = static_cast<Char>(data::signs[fspecs.sign]);\n    out = base_iterator(out, it);\n    fspecs.sign = sign::none;\n    if (specs.width != 0) --specs.width;\n  }\n\n  memory_buffer buffer;\n  if (fspecs.format == float_format::hex) {\n    if (fspecs.sign) buffer.push_back(data::signs[fspecs.sign]);\n    snprintf_float(promote_float(value), specs.precision, fspecs, buffer);\n    return write_bytes<align::right>(out, {buffer.data(), buffer.size()},\n                                     specs);\n  }\n  int precision = specs.precision >= 0 || !specs.type ? specs.precision : 6;\n  if (fspecs.format == float_format::exp) {\n    if (precision == max_value<int>())\n      FMT_THROW(format_error(\"number is too big\"));\n    else\n      ++precision;\n  }\n  if (const_check(std::is_same<T, float>())) fspecs.binary32 = true;\n  fspecs.use_grisu = is_fast_float<T>();\n  int exp = format_float(promote_float(value), precision, fspecs, buffer);\n  fspecs.precision = precision;\n  auto fp = big_decimal_fp{buffer.data(), static_cast<int>(buffer.size()), exp};\n  return write_float(out, fp, specs, fspecs, loc);\n}\n\ntemplate <typename Char, typename OutputIt, typename T,\n          FMT_ENABLE_IF(is_fast_float<T>::value)>\nauto write(OutputIt out, T value) -> OutputIt {\n  if (const_check(!is_supported_floating_point(value))) return out;\n\n  using floaty = conditional_t<std::is_same<T, long double>::value, double, T>;\n  using uint = typename dragonbox::float_info<floaty>::carrier_uint;\n  auto bits = bit_cast<uint>(value);\n\n  auto fspecs = float_specs();\n  auto sign_bit = bits & (uint(1) << (num_bits<uint>() - 1));\n  if (sign_bit != 0) {\n    fspecs.sign = sign::minus;\n    value = -value;\n  }\n\n  static const auto specs = basic_format_specs<Char>();\n  uint mask = exponent_mask<floaty>();\n  if ((bits & mask) == mask)\n    return write_nonfinite(out, std::isinf(value), specs, fspecs);\n\n  auto dec = dragonbox::to_decimal(static_cast<floaty>(value));\n  return write_float(out, dec, specs, fspecs, {});\n}\n\ntemplate <typename Char, typename OutputIt, typename T,\n          FMT_ENABLE_IF(std::is_floating_point<T>::value &&\n                        !is_fast_float<T>::value)>\ninline auto write(OutputIt out, T value) -> OutputIt {\n  return write(out, value, basic_format_specs<Char>());\n}\n\ntemplate <typename Char, typename OutputIt>\nauto write(OutputIt out, monostate, basic_format_specs<Char> = {},\n           locale_ref = {}) -> OutputIt {\n  FMT_ASSERT(false, \"\");\n  return out;\n}\n\ntemplate <typename Char, typename OutputIt>\nFMT_CONSTEXPR auto write(OutputIt out, basic_string_view<Char> value)\n    -> OutputIt {\n  auto it = reserve(out, value.size());\n  it = copy_str_noinline<Char>(value.begin(), value.end(), it);\n  return base_iterator(out, it);\n}\n\ntemplate <typename Char, typename OutputIt, typename T,\n          FMT_ENABLE_IF(is_string<T>::value)>\nconstexpr auto write(OutputIt out, const T& value) -> OutputIt {\n  return write<Char>(out, to_string_view(value));\n}\n\ntemplate <typename Char, typename OutputIt, typename T,\n          FMT_ENABLE_IF(is_integral<T>::value &&\n                        !std::is_same<T, bool>::value &&\n                        !std::is_same<T, Char>::value)>\nFMT_CONSTEXPR auto write(OutputIt out, T value) -> OutputIt {\n  auto abs_value = static_cast<uint32_or_64_or_128_t<T>>(value);\n  bool negative = is_negative(value);\n  // Don't do -abs_value since it trips unsigned-integer-overflow sanitizer.\n  if (negative) abs_value = ~abs_value + 1;\n  int num_digits = count_digits(abs_value);\n  auto size = (negative ? 1 : 0) + static_cast<size_t>(num_digits);\n  auto it = reserve(out, size);\n  if (auto ptr = to_pointer<Char>(it, size)) {\n    if (negative) *ptr++ = static_cast<Char>('-');\n    format_decimal<Char>(ptr, abs_value, num_digits);\n    return out;\n  }\n  if (negative) *it++ = static_cast<Char>('-');\n  it = format_decimal<Char>(it, abs_value, num_digits).end;\n  return base_iterator(out, it);\n}\n\n// FMT_ENABLE_IF() condition separated to workaround MSVC bug\ntemplate <\n    typename Char, typename OutputIt, typename T,\n    bool check =\n        std::is_enum<T>::value && !std::is_same<T, Char>::value &&\n        mapped_type_constant<T, basic_format_context<OutputIt, Char>>::value !=\n            type::custom_type,\n    FMT_ENABLE_IF(check)>\nFMT_CONSTEXPR auto write(OutputIt out, T value) -> OutputIt {\n  return write<Char>(\n      out, static_cast<typename std::underlying_type<T>::type>(value));\n}\n\ntemplate <typename Char, typename OutputIt, typename T,\n          FMT_ENABLE_IF(std::is_same<T, bool>::value)>\nFMT_CONSTEXPR auto write(OutputIt out, T value,\n                         const basic_format_specs<Char>& specs = {},\n                         locale_ref = {}) -> OutputIt {\n  return specs.type && specs.type != 's'\n             ? write(out, value ? 1 : 0, specs, {})\n             : write_bytes(out, value ? \"true\" : \"false\", specs);\n}\n\ntemplate <typename Char, typename OutputIt>\nFMT_CONSTEXPR auto write(OutputIt out, Char value) -> OutputIt {\n  auto it = reserve(out, 1);\n  *it++ = value;\n  return base_iterator(out, it);\n}\n\ntemplate <typename Char, typename OutputIt>\nFMT_CONSTEXPR_CHAR_TRAITS auto write(OutputIt out, const Char* value)\n    -> OutputIt {\n  if (!value) {\n    FMT_THROW(format_error(\"string pointer is null\"));\n  } else {\n    auto length = std::char_traits<Char>::length(value);\n    out = write(out, basic_string_view<Char>(value, length));\n  }\n  return out;\n}\n\ntemplate <typename Char, typename OutputIt, typename T,\n          FMT_ENABLE_IF(std::is_same<T, void>::value)>\nauto write(OutputIt out, const T* value,\n           const basic_format_specs<Char>& specs = {}, locale_ref = {})\n    -> OutputIt {\n  check_pointer_type_spec(specs.type, error_handler());\n  return write_ptr<Char>(out, to_uintptr(value), &specs);\n}\n\ntemplate <typename Char, typename OutputIt, typename T>\nFMT_CONSTEXPR auto write(OutputIt out, const T& value) ->\n    typename std::enable_if<\n        mapped_type_constant<T, basic_format_context<OutputIt, Char>>::value ==\n            type::custom_type,\n        OutputIt>::type {\n  using context_type = basic_format_context<OutputIt, Char>;\n  using formatter_type =\n      conditional_t<has_formatter<T, context_type>::value,\n                    typename context_type::template formatter_type<T>,\n                    fallback_formatter<T, Char>>;\n  context_type ctx(out, {}, {});\n  return formatter_type().format(value, ctx);\n}\n\n// An argument visitor that formats the argument and writes it via the output\n// iterator. It's a class and not a generic lambda for compatibility with C++11.\ntemplate <typename Char> struct default_arg_formatter {\n  using iterator = buffer_appender<Char>;\n  using context = buffer_context<Char>;\n\n  iterator out;\n  basic_format_args<context> args;\n  locale_ref loc;\n\n  template <typename T> auto operator()(T value) -> iterator {\n    return write<Char>(out, value);\n  }\n  auto operator()(typename basic_format_arg<context>::handle h) -> iterator {\n    basic_format_parse_context<Char> parse_ctx({});\n    context format_ctx(out, args, loc);\n    h.format(parse_ctx, format_ctx);\n    return format_ctx.out();\n  }\n};\n\ntemplate <typename Char> struct arg_formatter {\n  using iterator = buffer_appender<Char>;\n  using context = buffer_context<Char>;\n\n  iterator out;\n  const basic_format_specs<Char>& specs;\n  locale_ref locale;\n\n  template <typename T>\n  FMT_CONSTEXPR FMT_INLINE auto operator()(T value) -> iterator {\n    return detail::write(out, value, specs, locale);\n  }\n  auto operator()(typename basic_format_arg<context>::handle) -> iterator {\n    // User-defined types are handled separately because they require access\n    // to the parse context.\n    return out;\n  }\n};\n\ntemplate <typename Char> struct custom_formatter {\n  basic_format_parse_context<Char>& parse_ctx;\n  buffer_context<Char>& ctx;\n\n  void operator()(\n      typename basic_format_arg<buffer_context<Char>>::handle h) const {\n    h.format(parse_ctx, ctx);\n  }\n  template <typename T> void operator()(T) const {}\n};\n\ntemplate <typename T>\nusing is_integer =\n    bool_constant<is_integral<T>::value && !std::is_same<T, bool>::value &&\n                  !std::is_same<T, char>::value &&\n                  !std::is_same<T, wchar_t>::value>;\n\ntemplate <typename ErrorHandler> class width_checker {\n public:\n  explicit FMT_CONSTEXPR width_checker(ErrorHandler& eh) : handler_(eh) {}\n\n  template <typename T, FMT_ENABLE_IF(is_integer<T>::value)>\n  FMT_CONSTEXPR auto operator()(T value) -> unsigned long long {\n    if (is_negative(value)) handler_.on_error(\"negative width\");\n    return static_cast<unsigned long long>(value);\n  }\n\n  template <typename T, FMT_ENABLE_IF(!is_integer<T>::value)>\n  FMT_CONSTEXPR auto operator()(T) -> unsigned long long {\n    handler_.on_error(\"width is not integer\");\n    return 0;\n  }\n\n private:\n  ErrorHandler& handler_;\n};\n\ntemplate <typename ErrorHandler> class precision_checker {\n public:\n  explicit FMT_CONSTEXPR precision_checker(ErrorHandler& eh) : handler_(eh) {}\n\n  template <typename T, FMT_ENABLE_IF(is_integer<T>::value)>\n  FMT_CONSTEXPR auto operator()(T value) -> unsigned long long {\n    if (is_negative(value)) handler_.on_error(\"negative precision\");\n    return static_cast<unsigned long long>(value);\n  }\n\n  template <typename T, FMT_ENABLE_IF(!is_integer<T>::value)>\n  FMT_CONSTEXPR auto operator()(T) -> unsigned long long {\n    handler_.on_error(\"precision is not integer\");\n    return 0;\n  }\n\n private:\n  ErrorHandler& handler_;\n};\n\ntemplate <template <typename> class Handler, typename FormatArg,\n          typename ErrorHandler>\nFMT_CONSTEXPR auto get_dynamic_spec(FormatArg arg, ErrorHandler eh) -> int {\n  unsigned long long value = visit_format_arg(Handler<ErrorHandler>(eh), arg);\n  if (value > to_unsigned(max_value<int>())) eh.on_error(\"number is too big\");\n  return static_cast<int>(value);\n}\n\ntemplate <typename Context, typename ID>\nFMT_CONSTEXPR auto get_arg(Context& ctx, ID id) ->\n    typename Context::format_arg {\n  auto arg = ctx.arg(id);\n  if (!arg) ctx.on_error(\"argument not found\");\n  return arg;\n}\n\n// The standard format specifier handler with checking.\ntemplate <typename Char> class specs_handler : public specs_setter<Char> {\n private:\n  basic_format_parse_context<Char>& parse_context_;\n  buffer_context<Char>& context_;\n\n  // This is only needed for compatibility with gcc 4.4.\n  using format_arg = basic_format_arg<buffer_context<Char>>;\n\n  FMT_CONSTEXPR auto get_arg(auto_id) -> format_arg {\n    return detail::get_arg(context_, parse_context_.next_arg_id());\n  }\n\n  FMT_CONSTEXPR auto get_arg(int arg_id) -> format_arg {\n    parse_context_.check_arg_id(arg_id);\n    return detail::get_arg(context_, arg_id);\n  }\n\n  FMT_CONSTEXPR auto get_arg(basic_string_view<Char> arg_id) -> format_arg {\n    parse_context_.check_arg_id(arg_id);\n    return detail::get_arg(context_, arg_id);\n  }\n\n public:\n  FMT_CONSTEXPR specs_handler(basic_format_specs<Char>& specs,\n                              basic_format_parse_context<Char>& parse_ctx,\n                              buffer_context<Char>& ctx)\n      : specs_setter<Char>(specs), parse_context_(parse_ctx), context_(ctx) {}\n\n  template <typename Id> FMT_CONSTEXPR void on_dynamic_width(Id arg_id) {\n    this->specs_.width = get_dynamic_spec<width_checker>(\n        get_arg(arg_id), context_.error_handler());\n  }\n\n  template <typename Id> FMT_CONSTEXPR void on_dynamic_precision(Id arg_id) {\n    this->specs_.precision = get_dynamic_spec<precision_checker>(\n        get_arg(arg_id), context_.error_handler());\n  }\n\n  void on_error(const char* message) { context_.on_error(message); }\n};\n\ntemplate <template <typename> class Handler, typename Context>\nFMT_CONSTEXPR void handle_dynamic_spec(int& value,\n                                       arg_ref<typename Context::char_type> ref,\n                                       Context& ctx) {\n  switch (ref.kind) {\n  case arg_id_kind::none:\n    break;\n  case arg_id_kind::index:\n    value = detail::get_dynamic_spec<Handler>(ctx.arg(ref.val.index),\n                                              ctx.error_handler());\n    break;\n  case arg_id_kind::name:\n    value = detail::get_dynamic_spec<Handler>(ctx.arg(ref.val.name),\n                                              ctx.error_handler());\n    break;\n  }\n}\n\n#define FMT_STRING_IMPL(s, base, explicit)                                 \\\n  [] {                                                                     \\\n    /* Use the hidden visibility as a workaround for a GCC bug (#1973). */ \\\n    /* Use a macro-like name to avoid shadowing warnings. */               \\\n    struct FMT_GCC_VISIBILITY_HIDDEN FMT_COMPILE_STRING : base {           \\\n      using char_type = fmt::remove_cvref_t<decltype(s[0])>;               \\\n      FMT_MAYBE_UNUSED FMT_CONSTEXPR explicit                              \\\n      operator fmt::basic_string_view<char_type>() const {                 \\\n        return fmt::detail_exported::compile_string_to_view<char_type>(s); \\\n      }                                                                    \\\n    };                                                                     \\\n    return FMT_COMPILE_STRING();                                           \\\n  }()\n\n/**\n  \\rst\n  Constructs a compile-time format string from a string literal *s*.\n\n  **Example**::\n\n    // A compile-time error because 'd' is an invalid specifier for strings.\n    std::string s = fmt::format(FMT_STRING(\"{:d}\"), \"foo\");\n  \\endrst\n */\n#define FMT_STRING(s) FMT_STRING_IMPL(s, fmt::compile_string, )\n\n#if FMT_USE_USER_DEFINED_LITERALS\ntemplate <typename Char> struct udl_formatter {\n  basic_string_view<Char> str;\n\n  template <typename... T>\n  auto operator()(T&&... args) const -> std::basic_string<Char> {\n    return vformat(str, fmt::make_args_checked<T...>(str, args...));\n  }\n};\n\n#  if FMT_USE_NONTYPE_TEMPLATE_PARAMETERS\ntemplate <typename T, typename Char, size_t N,\n          fmt::detail_exported::fixed_string<Char, N> Str>\nstruct statically_named_arg : view {\n  static constexpr auto name = Str.data;\n\n  const T& value;\n  statically_named_arg(const T& v) : value(v) {}\n};\n\ntemplate <typename T, typename Char, size_t N,\n          fmt::detail_exported::fixed_string<Char, N> Str>\nstruct is_named_arg<statically_named_arg<T, Char, N, Str>> : std::true_type {};\n\ntemplate <typename T, typename Char, size_t N,\n          fmt::detail_exported::fixed_string<Char, N> Str>\nstruct is_statically_named_arg<statically_named_arg<T, Char, N, Str>>\n    : std::true_type {};\n\ntemplate <typename Char, size_t N,\n          fmt::detail_exported::fixed_string<Char, N> Str>\nstruct udl_arg {\n  template <typename T> auto operator=(T&& value) const {\n    return statically_named_arg<T, Char, N, Str>(std::forward<T>(value));\n  }\n};\n#  else\ntemplate <typename Char> struct udl_arg {\n  const Char* str;\n\n  template <typename T> auto operator=(T&& value) const -> named_arg<Char, T> {\n    return {str, std::forward<T>(value)};\n  }\n};\n#  endif\n#endif  // FMT_USE_USER_DEFINED_LITERALS\n\ntemplate <typename Locale, typename Char>\nauto vformat(const Locale& loc, basic_string_view<Char> format_str,\n             basic_format_args<buffer_context<type_identity_t<Char>>> args)\n    -> std::basic_string<Char> {\n  basic_memory_buffer<Char> buffer;\n  detail::vformat_to(buffer, format_str, args, detail::locale_ref(loc));\n  return {buffer.data(), buffer.size()};\n}\n\nusing format_func = void (*)(detail::buffer<char>&, int, const char*);\n\nFMT_API void format_error_code(buffer<char>& out, int error_code,\n                               string_view message) FMT_NOEXCEPT;\n\nFMT_API void report_error(format_func func, int error_code,\n                          const char* message) FMT_NOEXCEPT;\nFMT_END_DETAIL_NAMESPACE\n\nFMT_API auto vsystem_error(int error_code, string_view format_str,\n                           format_args args) -> std::system_error;\n\n/**\n \\rst\n Constructs :class:`std::system_error` with a message formatted with\n ``fmt::format(fmt, args...)``.\n  *error_code* is a system error code as given by ``errno``.\n\n **Example**::\n\n   // This throws std::system_error with the description\n   //   cannot open file 'madeup': No such file or directory\n   // or similar (system message may vary).\n   const char* filename = \"madeup\";\n   std::FILE* file = std::fopen(filename, \"r\");\n   if (!file)\n     throw fmt::system_error(errno, \"cannot open file '{}'\", filename);\n \\endrst\n*/\ntemplate <typename... T>\nauto system_error(int error_code, format_string<T...> fmt, T&&... args)\n    -> std::system_error {\n  return vsystem_error(error_code, fmt, fmt::make_format_args(args...));\n}\n\n/**\n  \\rst\n  Formats an error message for an error returned by an operating system or a\n  language runtime, for example a file opening error, and writes it to *out*.\n  The format is the same as the one used by ``std::system_error(ec, message)``\n  where ``ec`` is ``std::error_code(error_code, std::generic_category()})``.\n  It is implementation-defined but normally looks like:\n\n  .. parsed-literal::\n     *<message>*: *<system-message>*\n\n  where *<message>* is the passed message and *<system-message>* is the system\n  message corresponding to the error code.\n  *error_code* is a system error code as given by ``errno``.\n  \\endrst\n */\nFMT_API void format_system_error(detail::buffer<char>& out, int error_code,\n                                 const char* message) FMT_NOEXCEPT;\n\n// Reports a system error without throwing an exception.\n// Can be used to report errors from destructors.\nFMT_API void report_system_error(int error_code,\n                                 const char* message) FMT_NOEXCEPT;\n\n/** Fast integer formatter. */\nclass format_int {\n private:\n  // Buffer should be large enough to hold all digits (digits10 + 1),\n  // a sign and a null character.\n  enum { buffer_size = std::numeric_limits<unsigned long long>::digits10 + 3 };\n  mutable char buffer_[buffer_size];\n  char* str_;\n\n  template <typename UInt> auto format_unsigned(UInt value) -> char* {\n    auto n = static_cast<detail::uint32_or_64_or_128_t<UInt>>(value);\n    return detail::format_decimal(buffer_, n, buffer_size - 1).begin;\n  }\n\n  template <typename Int> auto format_signed(Int value) -> char* {\n    auto abs_value = static_cast<detail::uint32_or_64_or_128_t<Int>>(value);\n    bool negative = value < 0;\n    if (negative) abs_value = 0 - abs_value;\n    auto begin = format_unsigned(abs_value);\n    if (negative) *--begin = '-';\n    return begin;\n  }\n\n public:\n  explicit format_int(int value) : str_(format_signed(value)) {}\n  explicit format_int(long value) : str_(format_signed(value)) {}\n  explicit format_int(long long value) : str_(format_signed(value)) {}\n  explicit format_int(unsigned value) : str_(format_unsigned(value)) {}\n  explicit format_int(unsigned long value) : str_(format_unsigned(value)) {}\n  explicit format_int(unsigned long long value)\n      : str_(format_unsigned(value)) {}\n\n  /** Returns the number of characters written to the output buffer. */\n  auto size() const -> size_t {\n    return detail::to_unsigned(buffer_ - str_ + buffer_size - 1);\n  }\n\n  /**\n    Returns a pointer to the output buffer content. No terminating null\n    character is appended.\n   */\n  auto data() const -> const char* { return str_; }\n\n  /**\n    Returns a pointer to the output buffer content with terminating null\n    character appended.\n   */\n  auto c_str() const -> const char* {\n    buffer_[buffer_size - 1] = '\\0';\n    return str_;\n  }\n\n  /**\n    \\rst\n    Returns the content of the output buffer as an ``std::string``.\n    \\endrst\n   */\n  auto str() const -> std::string { return std::string(str_, size()); }\n};\n\ntemplate <typename T, typename Char>\ntemplate <typename FormatContext>\nFMT_CONSTEXPR FMT_INLINE auto\nformatter<T, Char,\n          enable_if_t<detail::type_constant<T, Char>::value !=\n                      detail::type::custom_type>>::format(const T& val,\n                                                          FormatContext& ctx)\n    const -> decltype(ctx.out()) {\n  if (specs_.width_ref.kind != detail::arg_id_kind::none ||\n      specs_.precision_ref.kind != detail::arg_id_kind::none) {\n    auto specs = specs_;\n    detail::handle_dynamic_spec<detail::width_checker>(specs.width,\n                                                       specs.width_ref, ctx);\n    detail::handle_dynamic_spec<detail::precision_checker>(\n        specs.precision, specs.precision_ref, ctx);\n    return detail::write<Char>(ctx.out(), val, specs, ctx.locale());\n  }\n  return detail::write<Char>(ctx.out(), val, specs_, ctx.locale());\n}\n\n#define FMT_FORMAT_AS(Type, Base)                                        \\\n  template <typename Char>                                               \\\n  struct formatter<Type, Char> : formatter<Base, Char> {                 \\\n    template <typename FormatContext>                                    \\\n    auto format(Type const& val, FormatContext& ctx) const               \\\n        -> decltype(ctx.out()) {                                         \\\n      return formatter<Base, Char>::format(static_cast<Base>(val), ctx); \\\n    }                                                                    \\\n  }\n\nFMT_FORMAT_AS(signed char, int);\nFMT_FORMAT_AS(unsigned char, unsigned);\nFMT_FORMAT_AS(short, int);\nFMT_FORMAT_AS(unsigned short, unsigned);\nFMT_FORMAT_AS(long, long long);\nFMT_FORMAT_AS(unsigned long, unsigned long long);\nFMT_FORMAT_AS(Char*, const Char*);\nFMT_FORMAT_AS(std::basic_string<Char>, basic_string_view<Char>);\nFMT_FORMAT_AS(std::nullptr_t, const void*);\nFMT_FORMAT_AS(detail::std_string_view<Char>, basic_string_view<Char>);\n\ntemplate <typename Char>\nstruct formatter<void*, Char> : formatter<const void*, Char> {\n  template <typename FormatContext>\n  auto format(void* val, FormatContext& ctx) const -> decltype(ctx.out()) {\n    return formatter<const void*, Char>::format(val, ctx);\n  }\n};\n\ntemplate <typename Char, size_t N>\nstruct formatter<Char[N], Char> : formatter<basic_string_view<Char>, Char> {\n  template <typename FormatContext>\n  FMT_CONSTEXPR auto format(const Char* val, FormatContext& ctx) const\n      -> decltype(ctx.out()) {\n    return formatter<basic_string_view<Char>, Char>::format(val, ctx);\n  }\n};\n\n// A formatter for types known only at run time such as variant alternatives.\n//\n// Usage:\n//   using variant = std::variant<int, std::string>;\n//   template <>\n//   struct formatter<variant>: dynamic_formatter<> {\n//     auto format(const variant& v, format_context& ctx) {\n//       return visit([&](const auto& val) {\n//           return dynamic_formatter<>::format(val, ctx);\n//       }, v);\n//     }\n//   };\ntemplate <typename Char = char> class dynamic_formatter {\n private:\n  detail::dynamic_format_specs<Char> specs_;\n  const Char* format_str_;\n\n  struct null_handler : detail::error_handler {\n    void on_align(align_t) {}\n    void on_sign(sign_t) {}\n    void on_hash() {}\n  };\n\n  template <typename Context> void handle_specs(Context& ctx) {\n    detail::handle_dynamic_spec<detail::width_checker>(specs_.width,\n                                                       specs_.width_ref, ctx);\n    detail::handle_dynamic_spec<detail::precision_checker>(\n        specs_.precision, specs_.precision_ref, ctx);\n  }\n\n public:\n  template <typename ParseContext>\n  FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {\n    format_str_ = ctx.begin();\n    // Checks are deferred to formatting time when the argument type is known.\n    detail::dynamic_specs_handler<ParseContext> handler(specs_, ctx);\n    return detail::parse_format_specs(ctx.begin(), ctx.end(), handler);\n  }\n\n  template <typename T, typename FormatContext>\n  auto format(const T& val, FormatContext& ctx) -> decltype(ctx.out()) {\n    handle_specs(ctx);\n    detail::specs_checker<null_handler> checker(\n        null_handler(), detail::mapped_type_constant<T, FormatContext>::value);\n    checker.on_align(specs_.align);\n    if (specs_.sign != sign::none) checker.on_sign(specs_.sign);\n    if (specs_.alt) checker.on_hash();\n    if (specs_.precision >= 0) checker.end_precision();\n    return detail::write<Char>(ctx.out(), val, specs_, ctx.locale());\n  }\n};\n\n/**\n  \\rst\n  Converts ``p`` to ``const void*`` for pointer formatting.\n\n  **Example**::\n\n    auto s = fmt::format(\"{}\", fmt::ptr(p));\n  \\endrst\n */\ntemplate <typename T> auto ptr(T p) -> const void* {\n  static_assert(std::is_pointer<T>::value, \"\");\n  return detail::bit_cast<const void*>(p);\n}\ntemplate <typename T> auto ptr(const std::unique_ptr<T>& p) -> const void* {\n  return p.get();\n}\ntemplate <typename T> auto ptr(const std::shared_ptr<T>& p) -> const void* {\n  return p.get();\n}\n\nclass bytes {\n private:\n  string_view data_;\n  friend struct formatter<bytes>;\n\n public:\n  explicit bytes(string_view data) : data_(data) {}\n};\n\ntemplate <> struct formatter<bytes> {\n private:\n  detail::dynamic_format_specs<char> specs_;\n\n public:\n  template <typename ParseContext>\n  FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {\n    using handler_type = detail::dynamic_specs_handler<ParseContext>;\n    detail::specs_checker<handler_type> handler(handler_type(specs_, ctx),\n                                                detail::type::string_type);\n    auto it = parse_format_specs(ctx.begin(), ctx.end(), handler);\n    detail::check_string_type_spec(specs_.type, ctx.error_handler());\n    return it;\n  }\n\n  template <typename FormatContext>\n  auto format(bytes b, FormatContext& ctx) -> decltype(ctx.out()) {\n    detail::handle_dynamic_spec<detail::width_checker>(specs_.width,\n                                                       specs_.width_ref, ctx);\n    detail::handle_dynamic_spec<detail::precision_checker>(\n        specs_.precision, specs_.precision_ref, ctx);\n    return detail::write_bytes(ctx.out(), b.data_, specs_);\n  }\n};\n\ntemplate <typename It, typename Sentinel, typename Char = char>\nstruct join_view : detail::view {\n  It begin;\n  Sentinel end;\n  basic_string_view<Char> sep;\n\n  join_view(It b, Sentinel e, basic_string_view<Char> s)\n      : begin(b), end(e), sep(s) {}\n};\n\ntemplate <typename It, typename Sentinel, typename Char>\nusing arg_join FMT_DEPRECATED_ALIAS = join_view<It, Sentinel, Char>;\n\ntemplate <typename It, typename Sentinel, typename Char>\nstruct formatter<join_view<It, Sentinel, Char>, Char> {\n private:\n  using value_type = typename std::iterator_traits<It>::value_type;\n  using context = buffer_context<Char>;\n  using mapper = detail::arg_mapper<context>;\n\n  template <typename T, FMT_ENABLE_IF(has_formatter<T, context>::value)>\n  static auto map(const T& value) -> const T& {\n    return value;\n  }\n  template <typename T, FMT_ENABLE_IF(!has_formatter<T, context>::value)>\n  static auto map(const T& value) -> decltype(mapper().map(value)) {\n    return mapper().map(value);\n  }\n\n  using formatter_type =\n      conditional_t<is_formattable<value_type, Char>::value,\n                    formatter<remove_cvref_t<decltype(map(\n                                  std::declval<const value_type&>()))>,\n                              Char>,\n                    detail::fallback_formatter<value_type, Char>>;\n\n  formatter_type value_formatter_;\n\n public:\n  template <typename ParseContext>\n  FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {\n    return value_formatter_.parse(ctx);\n  }\n\n  template <typename FormatContext>\n  auto format(const join_view<It, Sentinel, Char>& value, FormatContext& ctx)\n      -> decltype(ctx.out()) {\n    auto it = value.begin;\n    auto out = ctx.out();\n    if (it != value.end) {\n      out = value_formatter_.format(map(*it++), ctx);\n      while (it != value.end) {\n        out = detail::copy_str<Char>(value.sep.begin(), value.sep.end(), out);\n        ctx.advance_to(out);\n        out = value_formatter_.format(map(*it++), ctx);\n      }\n    }\n    return out;\n  }\n};\n\n/**\n  Returns an object that formats the iterator range `[begin, end)` with\n  elements separated by `sep`.\n */\ntemplate <typename It, typename Sentinel>\nauto join(It begin, Sentinel end, string_view sep) -> join_view<It, Sentinel> {\n  return {begin, end, sep};\n}\n\n/**\n  \\rst\n  Returns an object that formats `range` with elements separated by `sep`.\n\n  **Example**::\n\n    std::vector<int> v = {1, 2, 3};\n    fmt::print(\"{}\", fmt::join(v, \", \"));\n    // Output: \"1, 2, 3\"\n\n  ``fmt::join`` applies passed format specifiers to the range elements::\n\n    fmt::print(\"{:02}\", fmt::join(v, \", \"));\n    // Output: \"01, 02, 03\"\n  \\endrst\n */\ntemplate <typename Range>\nauto join(Range&& range, string_view sep)\n    -> join_view<detail::iterator_t<Range>, detail::sentinel_t<Range>> {\n  return join(std::begin(range), std::end(range), sep);\n}\n\n/**\n  \\rst\n  Converts *value* to ``std::string`` using the default format for type *T*.\n\n  **Example**::\n\n    #include <fmt/format.h>\n\n    std::string answer = fmt::to_string(42);\n  \\endrst\n */\ntemplate <typename T, FMT_ENABLE_IF(!std::is_integral<T>::value)>\ninline auto to_string(const T& value) -> std::string {\n  auto result = std::string();\n  detail::write<char>(std::back_inserter(result), value);\n  return result;\n}\n\ntemplate <typename T, FMT_ENABLE_IF(std::is_integral<T>::value)>\ninline auto to_string(T value) -> std::string {\n  // The buffer should be large enough to store the number including the sign\n  // or \"false\" for bool.\n  constexpr int max_size = detail::digits10<T>() + 2;\n  char buffer[max_size > 5 ? static_cast<unsigned>(max_size) : 5];\n  char* begin = buffer;\n  return std::string(begin, detail::write<char>(begin, value));\n}\n\ntemplate <typename Char, size_t SIZE>\nauto to_string(const basic_memory_buffer<Char, SIZE>& buf)\n    -> std::basic_string<Char> {\n  auto size = buf.size();\n  detail::assume(size < std::basic_string<Char>().max_size());\n  return std::basic_string<Char>(buf.data(), size);\n}\n\nFMT_BEGIN_DETAIL_NAMESPACE\n\ntemplate <typename Char>\nvoid vformat_to(\n    buffer<Char>& buf, basic_string_view<Char> fmt,\n    basic_format_args<FMT_BUFFER_CONTEXT(type_identity_t<Char>)> args,\n    locale_ref loc) {\n  // workaround for msvc bug regarding name-lookup in module\n  // link names into function scope\n  using detail::arg_formatter;\n  using detail::buffer_appender;\n  using detail::custom_formatter;\n  using detail::default_arg_formatter;\n  using detail::get_arg;\n  using detail::locale_ref;\n  using detail::parse_format_specs;\n  using detail::specs_checker;\n  using detail::specs_handler;\n  using detail::to_unsigned;\n  using detail::type;\n  using detail::write;\n  auto out = buffer_appender<Char>(buf);\n  if (fmt.size() == 2 && equal2(fmt.data(), \"{}\")) {\n    auto arg = args.get(0);\n    if (!arg) error_handler().on_error(\"argument not found\");\n    visit_format_arg(default_arg_formatter<Char>{out, args, loc}, arg);\n    return;\n  }\n\n  struct format_handler : error_handler {\n    basic_format_parse_context<Char> parse_context;\n    buffer_context<Char> context;\n\n    format_handler(buffer_appender<Char> out, basic_string_view<Char> str,\n                   basic_format_args<buffer_context<Char>> args, locale_ref loc)\n        : parse_context(str), context(out, args, loc) {}\n\n    void on_text(const Char* begin, const Char* end) {\n      auto text = basic_string_view<Char>(begin, to_unsigned(end - begin));\n      context.advance_to(write<Char>(context.out(), text));\n    }\n\n    FMT_CONSTEXPR auto on_arg_id() -> int {\n      return parse_context.next_arg_id();\n    }\n    FMT_CONSTEXPR auto on_arg_id(int id) -> int {\n      return parse_context.check_arg_id(id), id;\n    }\n    FMT_CONSTEXPR auto on_arg_id(basic_string_view<Char> id) -> int {\n      int arg_id = context.arg_id(id);\n      if (arg_id < 0) on_error(\"argument not found\");\n      return arg_id;\n    }\n\n    FMT_INLINE void on_replacement_field(int id, const Char*) {\n      auto arg = get_arg(context, id);\n      context.advance_to(visit_format_arg(\n          default_arg_formatter<Char>{context.out(), context.args(),\n                                      context.locale()},\n          arg));\n    }\n\n    auto on_format_specs(int id, const Char* begin, const Char* end)\n        -> const Char* {\n      auto arg = get_arg(context, id);\n      if (arg.type() == type::custom_type) {\n        parse_context.advance_to(parse_context.begin() +\n                                 (begin - &*parse_context.begin()));\n        visit_format_arg(custom_formatter<Char>{parse_context, context}, arg);\n        return parse_context.begin();\n      }\n      auto specs = basic_format_specs<Char>();\n      specs_checker<specs_handler<Char>> handler(\n          specs_handler<Char>(specs, parse_context, context), arg.type());\n      begin = parse_format_specs(begin, end, handler);\n      if (begin == end || *begin != '}')\n        on_error(\"missing '}' in format string\");\n      auto f = arg_formatter<Char>{context.out(), specs, context.locale()};\n      context.advance_to(visit_format_arg(f, arg));\n      return begin;\n    }\n  };\n  detail::parse_format_string<false>(fmt, format_handler(out, fmt, args, loc));\n}\n\n#ifndef FMT_HEADER_ONLY\nextern template FMT_API auto thousands_sep_impl<char>(locale_ref)\n    -> thousands_sep_result<char>;\nextern template FMT_API auto thousands_sep_impl<wchar_t>(locale_ref)\n    -> thousands_sep_result<wchar_t>;\nextern template FMT_API auto decimal_point_impl(locale_ref) -> char;\nextern template FMT_API auto decimal_point_impl(locale_ref) -> wchar_t;\nextern template auto format_float<double>(double value, int precision,\n                                          float_specs specs, buffer<char>& buf)\n    -> int;\nextern template auto format_float<long double>(long double value, int precision,\n                                               float_specs specs,\n                                               buffer<char>& buf) -> int;\nvoid snprintf_float(float, int, float_specs, buffer<char>&) = delete;\nextern template auto snprintf_float<double>(double value, int precision,\n                                            float_specs specs,\n                                            buffer<char>& buf) -> int;\nextern template auto snprintf_float<long double>(long double value,\n                                                 int precision,\n                                                 float_specs specs,\n                                                 buffer<char>& buf) -> int;\n#endif  // FMT_HEADER_ONLY\n\nFMT_END_DETAIL_NAMESPACE\n\n#if FMT_USE_USER_DEFINED_LITERALS\ninline namespace literals {\n/**\n  \\rst\n  User-defined literal equivalent of :func:`fmt::arg`.\n\n  **Example**::\n\n    using namespace fmt::literals;\n    fmt::print(\"Elapsed time: {s:.2f} seconds\", \"s\"_a=1.23);\n  \\endrst\n */\n#  if FMT_USE_NONTYPE_TEMPLATE_PARAMETERS\ntemplate <detail_exported::fixed_string Str>\nconstexpr auto operator\"\"_a()\n    -> detail::udl_arg<remove_cvref_t<decltype(Str.data[0])>,\n                       sizeof(Str.data) / sizeof(decltype(Str.data[0])), Str> {\n  return {};\n}\n#  else\nconstexpr auto operator\"\" _a(const char* s, size_t) -> detail::udl_arg<char> {\n  return {s};\n}\n#  endif\n\n/**\n  \\rst\n  User-defined literal equivalent of :func:`fmt::format`.\n\n  **Example**::\n\n    using namespace fmt::literals;\n    std::string message = \"The answer is {}\"_format(42);\n  \\endrst\n */\nconstexpr auto operator\"\" _format(const char* s, size_t n)\n    -> detail::udl_formatter<char> {\n  return {{s, n}};\n}\n}  // namespace literals\n#endif  // FMT_USE_USER_DEFINED_LITERALS\n\ntemplate <typename Locale, FMT_ENABLE_IF(detail::is_locale<Locale>::value)>\ninline auto vformat(const Locale& loc, string_view fmt, format_args args)\n    -> std::string {\n  return detail::vformat(loc, fmt, args);\n}\n\ntemplate <typename Locale, typename... T,\n          FMT_ENABLE_IF(detail::is_locale<Locale>::value)>\ninline auto format(const Locale& loc, format_string<T...> fmt, T&&... args)\n    -> std::string {\n  return vformat(loc, string_view(fmt), fmt::make_format_args(args...));\n}\n\ntemplate <typename... T, size_t SIZE, typename Allocator>\nFMT_DEPRECATED auto format_to(basic_memory_buffer<char, SIZE, Allocator>& buf,\n                              format_string<T...> fmt, T&&... args)\n    -> appender {\n  detail::vformat_to(buf, string_view(fmt), fmt::make_format_args(args...));\n  return appender(buf);\n}\n\ntemplate <typename OutputIt, typename Locale,\n          FMT_ENABLE_IF(detail::is_output_iterator<OutputIt, char>::value&&\n                            detail::is_locale<Locale>::value)>\nauto vformat_to(OutputIt out, const Locale& loc, string_view fmt,\n                format_args args) -> OutputIt {\n  using detail::get_buffer;\n  auto&& buf = get_buffer<char>(out);\n  detail::vformat_to(buf, fmt, args, detail::locale_ref(loc));\n  return detail::get_iterator(buf);\n}\n\ntemplate <typename OutputIt, typename Locale, typename... T,\n          FMT_ENABLE_IF(detail::is_output_iterator<OutputIt, char>::value&&\n                            detail::is_locale<Locale>::value)>\nFMT_INLINE auto format_to(OutputIt out, const Locale& loc,\n                          format_string<T...> fmt, T&&... args) -> OutputIt {\n  return vformat_to(out, loc, fmt, fmt::make_format_args(args...));\n}\n\nFMT_MODULE_EXPORT_END\nFMT_END_NAMESPACE\n\n#ifdef FMT_DEPRECATED_INCLUDE_XCHAR\n#  include \"xchar.h\"\n#endif\n\n#ifdef FMT_HEADER_ONLY\n#  define FMT_FUNC inline\n#  include \"format-inl.h\"\n#else\n#  define FMT_FUNC\n#endif\n\n#endif  // FMT_FORMAT_H_\n"
  },
  {
    "path": "examples/libraries/fmt/include/fmt/locale.h",
    "content": "#include \"xchar.h\"\n#warning fmt/locale.h is deprecated, include fmt/format.h or fmt/xchar.h instead\n"
  },
  {
    "path": "examples/libraries/fmt/include/fmt/os.h",
    "content": "// Formatting library for C++ - optional OS-specific functionality\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#ifndef FMT_OS_H_\n#define FMT_OS_H_\n\n#include <cerrno>\n#include <clocale>  // locale_t\n#include <cstddef>\n#include <cstdio>\n#include <cstdlib>       // strtod_l\n#include <system_error>  // std::system_error\n\n#if defined __APPLE__ || defined(__FreeBSD__)\n#  include <xlocale.h>  // for LC_NUMERIC_MASK on OS X\n#endif\n\n#include \"format.h\"\n\n// UWP doesn't provide _pipe.\n#if FMT_HAS_INCLUDE(\"winapifamily.h\")\n#  include <winapifamily.h>\n#endif\n#if (FMT_HAS_INCLUDE(<fcntl.h>) || defined(__APPLE__) || \\\n     defined(__linux__)) &&                              \\\n    (!defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP))\n#  include <fcntl.h>  // for O_RDONLY\n#  define FMT_USE_FCNTL 1\n#else\n#  define FMT_USE_FCNTL 0\n#endif\n\n#ifndef FMT_POSIX\n#  if defined(_WIN32) && !defined(__MINGW32__)\n// Fix warnings about deprecated symbols.\n#    define FMT_POSIX(call) _##call\n#  else\n#    define FMT_POSIX(call) call\n#  endif\n#endif\n\n// Calls to system functions are wrapped in FMT_SYSTEM for testability.\n#ifdef FMT_SYSTEM\n#  define FMT_POSIX_CALL(call) FMT_SYSTEM(call)\n#else\n#  define FMT_SYSTEM(call) ::call\n#  ifdef _WIN32\n// Fix warnings about deprecated symbols.\n#    define FMT_POSIX_CALL(call) ::_##call\n#  else\n#    define FMT_POSIX_CALL(call) ::call\n#  endif\n#endif\n\n// Retries the expression while it evaluates to error_result and errno\n// equals to EINTR.\n#ifndef _WIN32\n#  define FMT_RETRY_VAL(result, expression, error_result) \\\n    do {                                                  \\\n      (result) = (expression);                            \\\n    } while ((result) == (error_result) && errno == EINTR)\n#else\n#  define FMT_RETRY_VAL(result, expression, error_result) result = (expression)\n#endif\n\n#define FMT_RETRY(result, expression) FMT_RETRY_VAL(result, expression, -1)\n\nFMT_BEGIN_NAMESPACE\nFMT_MODULE_EXPORT_BEGIN\n\n/**\n  \\rst\n  A reference to a null-terminated string. It can be constructed from a C\n  string or ``std::string``.\n\n  You can use one of the following type aliases for common character types:\n\n  +---------------+-----------------------------+\n  | Type          | Definition                  |\n  +===============+=============================+\n  | cstring_view  | basic_cstring_view<char>    |\n  +---------------+-----------------------------+\n  | wcstring_view | basic_cstring_view<wchar_t> |\n  +---------------+-----------------------------+\n\n  This class is most useful as a parameter type to allow passing\n  different types of strings to a function, for example::\n\n    template <typename... Args>\n    std::string format(cstring_view format_str, const Args & ... args);\n\n    format(\"{}\", 42);\n    format(std::string(\"{}\"), 42);\n  \\endrst\n */\ntemplate <typename Char> class basic_cstring_view {\n private:\n  const Char* data_;\n\n public:\n  /** Constructs a string reference object from a C string. */\n  basic_cstring_view(const Char* s) : data_(s) {}\n\n  /**\n    \\rst\n    Constructs a string reference from an ``std::string`` object.\n    \\endrst\n   */\n  basic_cstring_view(const std::basic_string<Char>& s) : data_(s.c_str()) {}\n\n  /** Returns the pointer to a C string. */\n  const Char* c_str() const { return data_; }\n};\n\nusing cstring_view = basic_cstring_view<char>;\nusing wcstring_view = basic_cstring_view<wchar_t>;\n\ntemplate <typename Char> struct formatter<std::error_code, Char> {\n  template <typename ParseContext>\n  FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {\n    return ctx.begin();\n  }\n\n  template <typename FormatContext>\n  FMT_CONSTEXPR auto format(const std::error_code& ec, FormatContext& ctx) const\n      -> decltype(ctx.out()) {\n    auto out = ctx.out();\n    out = detail::write_bytes(out, ec.category().name(),\n                              basic_format_specs<Char>());\n    out = detail::write<Char>(out, Char(':'));\n    out = detail::write<Char>(out, ec.value());\n    return out;\n  }\n};\n\n#ifdef _WIN32\nFMT_API const std::error_category& system_category() FMT_NOEXCEPT;\n\nFMT_BEGIN_DETAIL_NAMESPACE\n// A converter from UTF-16 to UTF-8.\n// It is only provided for Windows since other systems support UTF-8 natively.\nclass utf16_to_utf8 {\n private:\n  memory_buffer buffer_;\n\n public:\n  utf16_to_utf8() {}\n  FMT_API explicit utf16_to_utf8(basic_string_view<wchar_t> s);\n  operator string_view() const { return string_view(&buffer_[0], size()); }\n  size_t size() const { return buffer_.size() - 1; }\n  const char* c_str() const { return &buffer_[0]; }\n  std::string str() const { return std::string(&buffer_[0], size()); }\n\n  // Performs conversion returning a system error code instead of\n  // throwing exception on conversion error. This method may still throw\n  // in case of memory allocation error.\n  FMT_API int convert(basic_string_view<wchar_t> s);\n};\n\nFMT_API void format_windows_error(buffer<char>& out, int error_code,\n                                  const char* message) FMT_NOEXCEPT;\nFMT_END_DETAIL_NAMESPACE\n\nFMT_API std::system_error vwindows_error(int error_code, string_view format_str,\n                                         format_args args);\n\n/**\n \\rst\n Constructs a :class:`std::system_error` object with the description\n of the form\n\n .. parsed-literal::\n   *<message>*: *<system-message>*\n\n where *<message>* is the formatted message and *<system-message>* is the\n system message corresponding to the error code.\n *error_code* is a Windows error code as given by ``GetLastError``.\n If *error_code* is not a valid error code such as -1, the system message\n will look like \"error -1\".\n\n **Example**::\n\n   // This throws a system_error with the description\n   //   cannot open file 'madeup': The system cannot find the file specified.\n   // or similar (system message may vary).\n   const char *filename = \"madeup\";\n   LPOFSTRUCT of = LPOFSTRUCT();\n   HFILE file = OpenFile(filename, &of, OF_READ);\n   if (file == HFILE_ERROR) {\n     throw fmt::windows_error(GetLastError(),\n                              \"cannot open file '{}'\", filename);\n   }\n \\endrst\n*/\ntemplate <typename... Args>\nstd::system_error windows_error(int error_code, string_view message,\n                                const Args&... args) {\n  return vwindows_error(error_code, message, fmt::make_format_args(args...));\n}\n\n// Reports a Windows error without throwing an exception.\n// Can be used to report errors from destructors.\nFMT_API void report_windows_error(int error_code,\n                                  const char* message) FMT_NOEXCEPT;\n#else\ninline const std::error_category& system_category() FMT_NOEXCEPT {\n  return std::system_category();\n}\n#endif  // _WIN32\n\n// std::system is not available on some platforms such as iOS (#2248).\n#ifdef __OSX__\ntemplate <typename S, typename... Args, typename Char = char_t<S>>\nvoid say(const S& format_str, Args&&... args) {\n  std::system(format(\"say \\\"{}\\\"\", format(format_str, args...)).c_str());\n}\n#endif\n\n// A buffered file.\nclass buffered_file {\n private:\n  FILE* file_;\n\n  friend class file;\n\n  explicit buffered_file(FILE* f) : file_(f) {}\n\n public:\n  buffered_file(const buffered_file&) = delete;\n  void operator=(const buffered_file&) = delete;\n\n  // Constructs a buffered_file object which doesn't represent any file.\n  buffered_file() FMT_NOEXCEPT : file_(nullptr) {}\n\n  // Destroys the object closing the file it represents if any.\n  FMT_API ~buffered_file() FMT_NOEXCEPT;\n\n public:\n  buffered_file(buffered_file&& other) FMT_NOEXCEPT : file_(other.file_) {\n    other.file_ = nullptr;\n  }\n\n  buffered_file& operator=(buffered_file&& other) {\n    close();\n    file_ = other.file_;\n    other.file_ = nullptr;\n    return *this;\n  }\n\n  // Opens a file.\n  FMT_API buffered_file(cstring_view filename, cstring_view mode);\n\n  // Closes the file.\n  FMT_API void close();\n\n  // Returns the pointer to a FILE object representing this file.\n  FILE* get() const FMT_NOEXCEPT { return file_; }\n\n  // We place parentheses around fileno to workaround a bug in some versions\n  // of MinGW that define fileno as a macro.\n  FMT_API int(fileno)() const;\n\n  void vprint(string_view format_str, format_args args) {\n    fmt::vprint(file_, format_str, args);\n  }\n\n  template <typename... Args>\n  inline void print(string_view format_str, const Args&... args) {\n    vprint(format_str, fmt::make_format_args(args...));\n  }\n};\n\n#if FMT_USE_FCNTL\n// A file. Closed file is represented by a file object with descriptor -1.\n// Methods that are not declared with FMT_NOEXCEPT may throw\n// fmt::system_error in case of failure. Note that some errors such as\n// closing the file multiple times will cause a crash on Windows rather\n// than an exception. You can get standard behavior by overriding the\n// invalid parameter handler with _set_invalid_parameter_handler.\nclass file {\n private:\n  int fd_;  // File descriptor.\n\n  // Constructs a file object with a given descriptor.\n  explicit file(int fd) : fd_(fd) {}\n\n public:\n  // Possible values for the oflag argument to the constructor.\n  enum {\n    RDONLY = FMT_POSIX(O_RDONLY),  // Open for reading only.\n    WRONLY = FMT_POSIX(O_WRONLY),  // Open for writing only.\n    RDWR = FMT_POSIX(O_RDWR),      // Open for reading and writing.\n    CREATE = FMT_POSIX(O_CREAT),   // Create if the file doesn't exist.\n    APPEND = FMT_POSIX(O_APPEND),  // Open in append mode.\n    TRUNC = FMT_POSIX(O_TRUNC)     // Truncate the content of the file.\n  };\n\n  // Constructs a file object which doesn't represent any file.\n  file() FMT_NOEXCEPT : fd_(-1) {}\n\n  // Opens a file and constructs a file object representing this file.\n  FMT_API file(cstring_view path, int oflag);\n\n public:\n  file(const file&) = delete;\n  void operator=(const file&) = delete;\n\n  file(file&& other) FMT_NOEXCEPT : fd_(other.fd_) { other.fd_ = -1; }\n\n  // Move assignment is not noexcept because close may throw.\n  file& operator=(file&& other) {\n    close();\n    fd_ = other.fd_;\n    other.fd_ = -1;\n    return *this;\n  }\n\n  // Destroys the object closing the file it represents if any.\n  FMT_API ~file() FMT_NOEXCEPT;\n\n  // Returns the file descriptor.\n  int descriptor() const FMT_NOEXCEPT { return fd_; }\n\n  // Closes the file.\n  FMT_API void close();\n\n  // Returns the file size. The size has signed type for consistency with\n  // stat::st_size.\n  FMT_API long long size() const;\n\n  // Attempts to read count bytes from the file into the specified buffer.\n  FMT_API size_t read(void* buffer, size_t count);\n\n  // Attempts to write count bytes from the specified buffer to the file.\n  FMT_API size_t write(const void* buffer, size_t count);\n\n  // Duplicates a file descriptor with the dup function and returns\n  // the duplicate as a file object.\n  FMT_API static file dup(int fd);\n\n  // Makes fd be the copy of this file descriptor, closing fd first if\n  // necessary.\n  FMT_API void dup2(int fd);\n\n  // Makes fd be the copy of this file descriptor, closing fd first if\n  // necessary.\n  FMT_API void dup2(int fd, std::error_code& ec) FMT_NOEXCEPT;\n\n  // Creates a pipe setting up read_end and write_end file objects for reading\n  // and writing respectively.\n  FMT_API static void pipe(file& read_end, file& write_end);\n\n  // Creates a buffered_file object associated with this file and detaches\n  // this file object from the file.\n  FMT_API buffered_file fdopen(const char* mode);\n};\n\n// Returns the memory page size.\nlong getpagesize();\n\nFMT_BEGIN_DETAIL_NAMESPACE\n\nstruct buffer_size {\n  buffer_size() = default;\n  size_t value = 0;\n  buffer_size operator=(size_t val) const {\n    auto bs = buffer_size();\n    bs.value = val;\n    return bs;\n  }\n};\n\nstruct ostream_params {\n  int oflag = file::WRONLY | file::CREATE | file::TRUNC;\n  size_t buffer_size = BUFSIZ > 32768 ? BUFSIZ : 32768;\n\n  ostream_params() {}\n\n  template <typename... T>\n  ostream_params(T... params, int new_oflag) : ostream_params(params...) {\n    oflag = new_oflag;\n  }\n\n  template <typename... T>\n  ostream_params(T... params, detail::buffer_size bs)\n      : ostream_params(params...) {\n    this->buffer_size = bs.value;\n  }\n};\n\nFMT_END_DETAIL_NAMESPACE\n\nconstexpr detail::buffer_size buffer_size;\n\n/** A fast output stream which is not thread-safe. */\nclass FMT_API ostream final : private detail::buffer<char> {\n private:\n  file file_;\n\n  void flush() {\n    if (size() == 0) return;\n    file_.write(data(), size());\n    clear();\n  }\n\n  void grow(size_t) override;\n\n  ostream(cstring_view path, const detail::ostream_params& params)\n      : file_(path, params.oflag) {\n    set(new char[params.buffer_size], params.buffer_size);\n  }\n\n public:\n  ostream(ostream&& other)\n      : detail::buffer<char>(other.data(), other.size(), other.capacity()),\n        file_(std::move(other.file_)) {\n    other.clear();\n    other.set(nullptr, 0);\n  }\n  ~ostream() {\n    flush();\n    delete[] data();\n  }\n\n  template <typename... T>\n  friend ostream output_file(cstring_view path, T... params);\n\n  void close() {\n    flush();\n    file_.close();\n  }\n\n  /**\n    Formats ``args`` according to specifications in ``fmt`` and writes the\n    output to the file.\n   */\n  template <typename... T> void print(format_string<T...> fmt, T&&... args) {\n    vformat_to(detail::buffer_appender<char>(*this), fmt,\n               fmt::make_format_args(args...));\n  }\n};\n\n/**\n  \\rst\n  Opens a file for writing. Supported parameters passed in *params*:\n\n  * ``<integer>``: Flags passed to `open\n    <https://pubs.opengroup.org/onlinepubs/007904875/functions/open.html>`_\n    (``file::WRONLY | file::CREATE`` by default)\n  * ``buffer_size=<integer>``: Output buffer size\n\n  **Example**::\n\n    auto out = fmt::output_file(\"guide.txt\");\n    out.print(\"Don't {}\", \"Panic\");\n  \\endrst\n */\ntemplate <typename... T>\ninline ostream output_file(cstring_view path, T... params) {\n  return {path, detail::ostream_params(params...)};\n}\n#endif  // FMT_USE_FCNTL\n\n#ifdef FMT_LOCALE\n// A \"C\" numeric locale.\nclass locale {\n private:\n#  ifdef _WIN32\n  using locale_t = _locale_t;\n\n  static void freelocale(locale_t loc) { _free_locale(loc); }\n\n  static double strtod_l(const char* nptr, char** endptr, _locale_t loc) {\n    return _strtod_l(nptr, endptr, loc);\n  }\n#  endif\n\n  locale_t locale_;\n\n public:\n  using type = locale_t;\n  locale(const locale&) = delete;\n  void operator=(const locale&) = delete;\n\n  locale() {\n#  ifndef _WIN32\n    locale_ = FMT_SYSTEM(newlocale(LC_NUMERIC_MASK, \"C\", nullptr));\n#  else\n    locale_ = _create_locale(LC_NUMERIC, \"C\");\n#  endif\n    if (!locale_) FMT_THROW(system_error(errno, \"cannot create locale\"));\n  }\n  ~locale() { freelocale(locale_); }\n\n  type get() const { return locale_; }\n\n  // Converts string to floating-point number and advances str past the end\n  // of the parsed input.\n  double strtod(const char*& str) const {\n    char* end = nullptr;\n    double result = strtod_l(str, &end, locale_);\n    str = end;\n    return result;\n  }\n};\nusing Locale FMT_DEPRECATED_ALIAS = locale;\n#endif  // FMT_LOCALE\nFMT_MODULE_EXPORT_END\nFMT_END_NAMESPACE\n\n#endif  // FMT_OS_H_\n"
  },
  {
    "path": "examples/libraries/fmt/include/fmt/ostream.h",
    "content": "// Formatting library for C++ - std::ostream support\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#ifndef FMT_OSTREAM_H_\n#define FMT_OSTREAM_H_\n\n#include <ostream>\n\n#include \"format.h\"\n\nFMT_BEGIN_NAMESPACE\n\ntemplate <typename Char> class basic_printf_parse_context;\ntemplate <typename OutputIt, typename Char> class basic_printf_context;\n\nnamespace detail {\n\ntemplate <class Char> class formatbuf : public std::basic_streambuf<Char> {\n private:\n  using int_type = typename std::basic_streambuf<Char>::int_type;\n  using traits_type = typename std::basic_streambuf<Char>::traits_type;\n\n  buffer<Char>& buffer_;\n\n public:\n  formatbuf(buffer<Char>& buf) : buffer_(buf) {}\n\n protected:\n  // The put-area is actually always empty. This makes the implementation\n  // simpler and has the advantage that the streambuf and the buffer are always\n  // in sync and sputc never writes into uninitialized memory. The obvious\n  // disadvantage is that each call to sputc always results in a (virtual) call\n  // to overflow. There is no disadvantage here for sputn since this always\n  // results in a call to xsputn.\n\n  int_type overflow(int_type ch = traits_type::eof()) FMT_OVERRIDE {\n    if (!traits_type::eq_int_type(ch, traits_type::eof()))\n      buffer_.push_back(static_cast<Char>(ch));\n    return ch;\n  }\n\n  std::streamsize xsputn(const Char* s, std::streamsize count) FMT_OVERRIDE {\n    buffer_.append(s, s + count);\n    return count;\n  }\n};\n\nstruct converter {\n  template <typename T, FMT_ENABLE_IF(is_integral<T>::value)> converter(T);\n};\n\ntemplate <typename Char> struct test_stream : std::basic_ostream<Char> {\n private:\n  void_t<> operator<<(converter);\n};\n\n// Hide insertion operators for built-in types.\ntemplate <typename Char, typename Traits>\nvoid_t<> operator<<(std::basic_ostream<Char, Traits>&, Char);\ntemplate <typename Char, typename Traits>\nvoid_t<> operator<<(std::basic_ostream<Char, Traits>&, char);\ntemplate <typename Traits>\nvoid_t<> operator<<(std::basic_ostream<char, Traits>&, char);\ntemplate <typename Traits>\nvoid_t<> operator<<(std::basic_ostream<char, Traits>&, signed char);\ntemplate <typename Traits>\nvoid_t<> operator<<(std::basic_ostream<char, Traits>&, unsigned char);\n\n// Checks if T has a user-defined operator<< (e.g. not a member of\n// std::ostream).\ntemplate <typename T, typename Char> class is_streamable {\n private:\n  template <typename U>\n  static bool_constant<!std::is_same<decltype(std::declval<test_stream<Char>&>()\n                                              << std::declval<U>()),\n                                     void_t<>>::value>\n  test(int);\n\n  template <typename> static std::false_type test(...);\n\n  using result = decltype(test<T>(0));\n\n public:\n  is_streamable() = default;\n\n  static const bool value = result::value;\n};\n\n// Write the content of buf to os.\ntemplate <typename Char>\nvoid write_buffer(std::basic_ostream<Char>& os, buffer<Char>& buf) {\n  const Char* buf_data = buf.data();\n  using unsigned_streamsize = std::make_unsigned<std::streamsize>::type;\n  unsigned_streamsize size = buf.size();\n  unsigned_streamsize max_size = to_unsigned(max_value<std::streamsize>());\n  do {\n    unsigned_streamsize n = size <= max_size ? size : max_size;\n    os.write(buf_data, static_cast<std::streamsize>(n));\n    buf_data += n;\n    size -= n;\n  } while (size != 0);\n}\n\ntemplate <typename Char, typename T>\nvoid format_value(buffer<Char>& buf, const T& value,\n                  locale_ref loc = locale_ref()) {\n  formatbuf<Char> format_buf(buf);\n  std::basic_ostream<Char> output(&format_buf);\n#if !defined(FMT_STATIC_THOUSANDS_SEPARATOR)\n  if (loc) output.imbue(loc.get<std::locale>());\n#endif\n  output << value;\n  output.exceptions(std::ios_base::failbit | std::ios_base::badbit);\n  buf.try_resize(buf.size());\n}\n\n// Formats an object of type T that has an overloaded ostream operator<<.\ntemplate <typename T, typename Char>\nstruct fallback_formatter<T, Char, enable_if_t<is_streamable<T, Char>::value>>\n    : private formatter<basic_string_view<Char>, Char> {\n  FMT_CONSTEXPR auto parse(basic_format_parse_context<Char>& ctx)\n      -> decltype(ctx.begin()) {\n    return formatter<basic_string_view<Char>, Char>::parse(ctx);\n  }\n  template <typename ParseCtx,\n            FMT_ENABLE_IF(std::is_same<\n                          ParseCtx, basic_printf_parse_context<Char>>::value)>\n  auto parse(ParseCtx& ctx) -> decltype(ctx.begin()) {\n    return ctx.begin();\n  }\n\n  template <typename OutputIt>\n  auto format(const T& value, basic_format_context<OutputIt, Char>& ctx)\n      -> OutputIt {\n    basic_memory_buffer<Char> buffer;\n    format_value(buffer, value, ctx.locale());\n    basic_string_view<Char> str(buffer.data(), buffer.size());\n    return formatter<basic_string_view<Char>, Char>::format(str, ctx);\n  }\n  template <typename OutputIt>\n  auto format(const T& value, basic_printf_context<OutputIt, Char>& ctx)\n      -> OutputIt {\n    basic_memory_buffer<Char> buffer;\n    format_value(buffer, value, ctx.locale());\n    return std::copy(buffer.begin(), buffer.end(), ctx.out());\n  }\n};\n}  // namespace detail\n\nFMT_MODULE_EXPORT\ntemplate <typename Char>\nvoid vprint(std::basic_ostream<Char>& os, basic_string_view<Char> format_str,\n            basic_format_args<buffer_context<type_identity_t<Char>>> args) {\n  basic_memory_buffer<Char> buffer;\n  detail::vformat_to(buffer, format_str, args);\n  detail::write_buffer(os, buffer);\n}\n\n/**\n  \\rst\n  Prints formatted data to the stream *os*.\n\n  **Example**::\n\n    fmt::print(cerr, \"Don't {}!\", \"panic\");\n  \\endrst\n */\nFMT_MODULE_EXPORT\ntemplate <typename S, typename... Args,\n          typename Char = enable_if_t<detail::is_string<S>::value, char_t<S>>>\nvoid print(std::basic_ostream<Char>& os, const S& format_str, Args&&... args) {\n  vprint(os, to_string_view(format_str),\n         fmt::make_args_checked<Args...>(format_str, args...));\n}\nFMT_END_NAMESPACE\n\n#endif  // FMT_OSTREAM_H_\n"
  },
  {
    "path": "examples/libraries/fmt/include/fmt/printf.h",
    "content": "// Formatting library for C++ - legacy printf implementation\n//\n// Copyright (c) 2012 - 2016, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#ifndef FMT_PRINTF_H_\n#define FMT_PRINTF_H_\n\n#include <algorithm>  // std::max\n#include <limits>     // std::numeric_limits\n#include <ostream>\n\n#include \"format.h\"\n\nFMT_BEGIN_NAMESPACE\nFMT_MODULE_EXPORT_BEGIN\n\ntemplate <typename T> struct printf_formatter { printf_formatter() = delete; };\n\ntemplate <typename Char>\nclass basic_printf_parse_context : public basic_format_parse_context<Char> {\n  using basic_format_parse_context<Char>::basic_format_parse_context;\n};\n\ntemplate <typename OutputIt, typename Char> class basic_printf_context {\n private:\n  OutputIt out_;\n  basic_format_args<basic_printf_context> args_;\n\n public:\n  using char_type = Char;\n  using format_arg = basic_format_arg<basic_printf_context>;\n  using parse_context_type = basic_printf_parse_context<Char>;\n  template <typename T> using formatter_type = printf_formatter<T>;\n\n  /**\n    \\rst\n    Constructs a ``printf_context`` object. References to the arguments are\n    stored in the context object so make sure they have appropriate lifetimes.\n    \\endrst\n   */\n  basic_printf_context(OutputIt out,\n                       basic_format_args<basic_printf_context> args)\n      : out_(out), args_(args) {}\n\n  OutputIt out() { return out_; }\n  void advance_to(OutputIt it) { out_ = it; }\n\n  detail::locale_ref locale() { return {}; }\n\n  format_arg arg(int id) const { return args_.get(id); }\n\n  FMT_CONSTEXPR void on_error(const char* message) {\n    detail::error_handler().on_error(message);\n  }\n};\n\nFMT_BEGIN_DETAIL_NAMESPACE\n\n// Checks if a value fits in int - used to avoid warnings about comparing\n// signed and unsigned integers.\ntemplate <bool IsSigned> struct int_checker {\n  template <typename T> static bool fits_in_int(T value) {\n    unsigned max = max_value<int>();\n    return value <= max;\n  }\n  static bool fits_in_int(bool) { return true; }\n};\n\ntemplate <> struct int_checker<true> {\n  template <typename T> static bool fits_in_int(T value) {\n    return value >= (std::numeric_limits<int>::min)() &&\n           value <= max_value<int>();\n  }\n  static bool fits_in_int(int) { return true; }\n};\n\nclass printf_precision_handler {\n public:\n  template <typename T, FMT_ENABLE_IF(std::is_integral<T>::value)>\n  int operator()(T value) {\n    if (!int_checker<std::numeric_limits<T>::is_signed>::fits_in_int(value))\n      FMT_THROW(format_error(\"number is too big\"));\n    return (std::max)(static_cast<int>(value), 0);\n  }\n\n  template <typename T, FMT_ENABLE_IF(!std::is_integral<T>::value)>\n  int operator()(T) {\n    FMT_THROW(format_error(\"precision is not integer\"));\n    return 0;\n  }\n};\n\n// An argument visitor that returns true iff arg is a zero integer.\nclass is_zero_int {\n public:\n  template <typename T, FMT_ENABLE_IF(std::is_integral<T>::value)>\n  bool operator()(T value) {\n    return value == 0;\n  }\n\n  template <typename T, FMT_ENABLE_IF(!std::is_integral<T>::value)>\n  bool operator()(T) {\n    return false;\n  }\n};\n\ntemplate <typename T> struct make_unsigned_or_bool : std::make_unsigned<T> {};\n\ntemplate <> struct make_unsigned_or_bool<bool> { using type = bool; };\n\ntemplate <typename T, typename Context> class arg_converter {\n private:\n  using char_type = typename Context::char_type;\n\n  basic_format_arg<Context>& arg_;\n  char_type type_;\n\n public:\n  arg_converter(basic_format_arg<Context>& arg, char_type type)\n      : arg_(arg), type_(type) {}\n\n  void operator()(bool value) {\n    if (type_ != 's') operator()<bool>(value);\n  }\n\n  template <typename U, FMT_ENABLE_IF(std::is_integral<U>::value)>\n  void operator()(U value) {\n    bool is_signed = type_ == 'd' || type_ == 'i';\n    using target_type = conditional_t<std::is_same<T, void>::value, U, T>;\n    if (const_check(sizeof(target_type) <= sizeof(int))) {\n      // Extra casts are used to silence warnings.\n      if (is_signed) {\n        arg_ = detail::make_arg<Context>(\n            static_cast<int>(static_cast<target_type>(value)));\n      } else {\n        using unsigned_type = typename make_unsigned_or_bool<target_type>::type;\n        arg_ = detail::make_arg<Context>(\n            static_cast<unsigned>(static_cast<unsigned_type>(value)));\n      }\n    } else {\n      if (is_signed) {\n        // glibc's printf doesn't sign extend arguments of smaller types:\n        //   std::printf(\"%lld\", -42);  // prints \"4294967254\"\n        // but we don't have to do the same because it's a UB.\n        arg_ = detail::make_arg<Context>(static_cast<long long>(value));\n      } else {\n        arg_ = detail::make_arg<Context>(\n            static_cast<typename make_unsigned_or_bool<U>::type>(value));\n      }\n    }\n  }\n\n  template <typename U, FMT_ENABLE_IF(!std::is_integral<U>::value)>\n  void operator()(U) {}  // No conversion needed for non-integral types.\n};\n\n// Converts an integer argument to T for printf, if T is an integral type.\n// If T is void, the argument is converted to corresponding signed or unsigned\n// type depending on the type specifier: 'd' and 'i' - signed, other -\n// unsigned).\ntemplate <typename T, typename Context, typename Char>\nvoid convert_arg(basic_format_arg<Context>& arg, Char type) {\n  visit_format_arg(arg_converter<T, Context>(arg, type), arg);\n}\n\n// Converts an integer argument to char for printf.\ntemplate <typename Context> class char_converter {\n private:\n  basic_format_arg<Context>& arg_;\n\n public:\n  explicit char_converter(basic_format_arg<Context>& arg) : arg_(arg) {}\n\n  template <typename T, FMT_ENABLE_IF(std::is_integral<T>::value)>\n  void operator()(T value) {\n    arg_ = detail::make_arg<Context>(\n        static_cast<typename Context::char_type>(value));\n  }\n\n  template <typename T, FMT_ENABLE_IF(!std::is_integral<T>::value)>\n  void operator()(T) {}  // No conversion needed for non-integral types.\n};\n\n// An argument visitor that return a pointer to a C string if argument is a\n// string or null otherwise.\ntemplate <typename Char> struct get_cstring {\n  template <typename T> const Char* operator()(T) { return nullptr; }\n  const Char* operator()(const Char* s) { return s; }\n};\n\n// Checks if an argument is a valid printf width specifier and sets\n// left alignment if it is negative.\ntemplate <typename Char> class printf_width_handler {\n private:\n  using format_specs = basic_format_specs<Char>;\n\n  format_specs& specs_;\n\n public:\n  explicit printf_width_handler(format_specs& specs) : specs_(specs) {}\n\n  template <typename T, FMT_ENABLE_IF(std::is_integral<T>::value)>\n  unsigned operator()(T value) {\n    auto width = static_cast<uint32_or_64_or_128_t<T>>(value);\n    if (detail::is_negative(value)) {\n      specs_.align = align::left;\n      width = 0 - width;\n    }\n    unsigned int_max = max_value<int>();\n    if (width > int_max) FMT_THROW(format_error(\"number is too big\"));\n    return static_cast<unsigned>(width);\n  }\n\n  template <typename T, FMT_ENABLE_IF(!std::is_integral<T>::value)>\n  unsigned operator()(T) {\n    FMT_THROW(format_error(\"width is not integer\"));\n    return 0;\n  }\n};\n\n// The ``printf`` argument formatter.\ntemplate <typename OutputIt, typename Char>\nclass printf_arg_formatter : public arg_formatter<Char> {\n private:\n  using base = arg_formatter<Char>;\n  using context_type = basic_printf_context<OutputIt, Char>;\n  using format_specs = basic_format_specs<Char>;\n\n  context_type& context_;\n\n  OutputIt write_null_pointer(bool is_string = false) {\n    auto s = this->specs;\n    s.type = 0;\n    return write_bytes(this->out, is_string ? \"(null)\" : \"(nil)\", s);\n  }\n\n public:\n  printf_arg_formatter(OutputIt iter, format_specs& s, context_type& ctx)\n      : base{iter, s, locale_ref()}, context_(ctx) {}\n\n  OutputIt operator()(monostate value) { return base::operator()(value); }\n\n  template <typename T, FMT_ENABLE_IF(detail::is_integral<T>::value)>\n  OutputIt operator()(T value) {\n    // MSVC2013 fails to compile separate overloads for bool and Char so use\n    // std::is_same instead.\n    if (std::is_same<T, Char>::value) {\n      format_specs fmt_specs = this->specs;\n      if (fmt_specs.type && fmt_specs.type != 'c')\n        return (*this)(static_cast<int>(value));\n      fmt_specs.sign = sign::none;\n      fmt_specs.alt = false;\n      fmt_specs.fill[0] = ' ';  // Ignore '0' flag for char types.\n      // align::numeric needs to be overwritten here since the '0' flag is\n      // ignored for non-numeric types\n      if (fmt_specs.align == align::none || fmt_specs.align == align::numeric)\n        fmt_specs.align = align::right;\n      return write<Char>(this->out, static_cast<Char>(value), fmt_specs);\n    }\n    return base::operator()(value);\n  }\n\n  template <typename T, FMT_ENABLE_IF(std::is_floating_point<T>::value)>\n  OutputIt operator()(T value) {\n    return base::operator()(value);\n  }\n\n  /** Formats a null-terminated C string. */\n  OutputIt operator()(const char* value) {\n    if (value) return base::operator()(value);\n    return write_null_pointer(this->specs.type != 'p');\n  }\n\n  /** Formats a null-terminated wide C string. */\n  OutputIt operator()(const wchar_t* value) {\n    if (value) return base::operator()(value);\n    return write_null_pointer(this->specs.type != 'p');\n  }\n\n  OutputIt operator()(basic_string_view<Char> value) {\n    return base::operator()(value);\n  }\n\n  /** Formats a pointer. */\n  OutputIt operator()(const void* value) {\n    return value ? base::operator()(value) : write_null_pointer();\n  }\n\n  /** Formats an argument of a custom (user-defined) type. */\n  OutputIt operator()(typename basic_format_arg<context_type>::handle handle) {\n    auto parse_ctx =\n        basic_printf_parse_context<Char>(basic_string_view<Char>());\n    handle.format(parse_ctx, context_);\n    return this->out;\n  }\n};\n\ntemplate <typename Char>\nvoid parse_flags(basic_format_specs<Char>& specs, const Char*& it,\n                 const Char* end) {\n  for (; it != end; ++it) {\n    switch (*it) {\n    case '-':\n      specs.align = align::left;\n      break;\n    case '+':\n      specs.sign = sign::plus;\n      break;\n    case '0':\n      specs.fill[0] = '0';\n      break;\n    case ' ':\n      if (specs.sign != sign::plus) {\n        specs.sign = sign::space;\n      }\n      break;\n    case '#':\n      specs.alt = true;\n      break;\n    default:\n      return;\n    }\n  }\n}\n\ntemplate <typename Char, typename GetArg>\nint parse_header(const Char*& it, const Char* end,\n                 basic_format_specs<Char>& specs, GetArg get_arg) {\n  int arg_index = -1;\n  Char c = *it;\n  if (c >= '0' && c <= '9') {\n    // Parse an argument index (if followed by '$') or a width possibly\n    // preceded with '0' flag(s).\n    int value = parse_nonnegative_int(it, end, -1);\n    if (it != end && *it == '$') {  // value is an argument index\n      ++it;\n      arg_index = value != -1 ? value : max_value<int>();\n    } else {\n      if (c == '0') specs.fill[0] = '0';\n      if (value != 0) {\n        // Nonzero value means that we parsed width and don't need to\n        // parse it or flags again, so return now.\n        if (value == -1) FMT_THROW(format_error(\"number is too big\"));\n        specs.width = value;\n        return arg_index;\n      }\n    }\n  }\n  parse_flags(specs, it, end);\n  // Parse width.\n  if (it != end) {\n    if (*it >= '0' && *it <= '9') {\n      specs.width = parse_nonnegative_int(it, end, -1);\n      if (specs.width == -1) FMT_THROW(format_error(\"number is too big\"));\n    } else if (*it == '*') {\n      ++it;\n      specs.width = static_cast<int>(visit_format_arg(\n          detail::printf_width_handler<Char>(specs), get_arg(-1)));\n    }\n  }\n  return arg_index;\n}\n\ntemplate <typename Char, typename Context>\nvoid vprintf(buffer<Char>& buf, basic_string_view<Char> format,\n             basic_format_args<Context> args) {\n  using OutputIt = buffer_appender<Char>;\n  auto out = OutputIt(buf);\n  auto context = basic_printf_context<OutputIt, Char>(out, args);\n  auto parse_ctx = basic_printf_parse_context<Char>(format);\n\n  // Returns the argument with specified index or, if arg_index is -1, the next\n  // argument.\n  auto get_arg = [&](int arg_index) {\n    if (arg_index < 0)\n      arg_index = parse_ctx.next_arg_id();\n    else\n      parse_ctx.check_arg_id(--arg_index);\n    return detail::get_arg(context, arg_index);\n  };\n\n  const Char* start = parse_ctx.begin();\n  const Char* end = parse_ctx.end();\n  auto it = start;\n  while (it != end) {\n    if (!detail::find<false, Char>(it, end, '%', it)) {\n      it = end;  // detail::find leaves it == nullptr if it doesn't find '%'\n      break;\n    }\n    Char c = *it++;\n    if (it != end && *it == c) {\n      out = detail::write(\n          out, basic_string_view<Char>(start, detail::to_unsigned(it - start)));\n      start = ++it;\n      continue;\n    }\n    out = detail::write(out, basic_string_view<Char>(\n                                 start, detail::to_unsigned(it - 1 - start)));\n\n    basic_format_specs<Char> specs;\n    specs.align = align::right;\n\n    // Parse argument index, flags and width.\n    int arg_index = parse_header(it, end, specs, get_arg);\n    if (arg_index == 0) parse_ctx.on_error(\"argument not found\");\n\n    // Parse precision.\n    if (it != end && *it == '.') {\n      ++it;\n      c = it != end ? *it : 0;\n      if ('0' <= c && c <= '9') {\n        specs.precision = parse_nonnegative_int(it, end, 0);\n      } else if (c == '*') {\n        ++it;\n        specs.precision = static_cast<int>(\n            visit_format_arg(detail::printf_precision_handler(), get_arg(-1)));\n      } else {\n        specs.precision = 0;\n      }\n    }\n\n    auto arg = get_arg(arg_index);\n    // For d, i, o, u, x, and X conversion specifiers, if a precision is\n    // specified, the '0' flag is ignored\n    if (specs.precision >= 0 && arg.is_integral())\n      specs.fill[0] =\n          ' ';  // Ignore '0' flag for non-numeric types or if '-' present.\n    if (specs.precision >= 0 && arg.type() == detail::type::cstring_type) {\n      auto str = visit_format_arg(detail::get_cstring<Char>(), arg);\n      auto str_end = str + specs.precision;\n      auto nul = std::find(str, str_end, Char());\n      arg = detail::make_arg<basic_printf_context<OutputIt, Char>>(\n          basic_string_view<Char>(\n              str, detail::to_unsigned(nul != str_end ? nul - str\n                                                      : specs.precision)));\n    }\n    if (specs.alt && visit_format_arg(detail::is_zero_int(), arg))\n      specs.alt = false;\n    if (specs.fill[0] == '0') {\n      if (arg.is_arithmetic() && specs.align != align::left)\n        specs.align = align::numeric;\n      else\n        specs.fill[0] = ' ';  // Ignore '0' flag for non-numeric types or if '-'\n                              // flag is also present.\n    }\n\n    // Parse length and convert the argument to the required type.\n    c = it != end ? *it++ : 0;\n    Char t = it != end ? *it : 0;\n    using detail::convert_arg;\n    switch (c) {\n    case 'h':\n      if (t == 'h') {\n        ++it;\n        t = it != end ? *it : 0;\n        convert_arg<signed char>(arg, t);\n      } else {\n        convert_arg<short>(arg, t);\n      }\n      break;\n    case 'l':\n      if (t == 'l') {\n        ++it;\n        t = it != end ? *it : 0;\n        convert_arg<long long>(arg, t);\n      } else {\n        convert_arg<long>(arg, t);\n      }\n      break;\n    case 'j':\n      convert_arg<intmax_t>(arg, t);\n      break;\n    case 'z':\n      convert_arg<size_t>(arg, t);\n      break;\n    case 't':\n      convert_arg<std::ptrdiff_t>(arg, t);\n      break;\n    case 'L':\n      // printf produces garbage when 'L' is omitted for long double, no\n      // need to do the same.\n      break;\n    default:\n      --it;\n      convert_arg<void>(arg, c);\n    }\n\n    // Parse type.\n    if (it == end) FMT_THROW(format_error(\"invalid format string\"));\n    specs.type = static_cast<char>(*it++);\n    if (arg.is_integral()) {\n      // Normalize type.\n      switch (specs.type) {\n      case 'i':\n      case 'u':\n        specs.type = 'd';\n        break;\n      case 'c':\n        visit_format_arg(\n            detail::char_converter<basic_printf_context<OutputIt, Char>>(arg),\n            arg);\n        break;\n      }\n    }\n\n    start = it;\n\n    // Format argument.\n    out = visit_format_arg(\n        detail::printf_arg_formatter<OutputIt, Char>(out, specs, context), arg);\n  }\n  detail::write(out, basic_string_view<Char>(start, to_unsigned(it - start)));\n}\nFMT_END_DETAIL_NAMESPACE\n\ntemplate <typename Char>\nusing basic_printf_context_t =\n    basic_printf_context<detail::buffer_appender<Char>, Char>;\n\nusing printf_context = basic_printf_context_t<char>;\nusing wprintf_context = basic_printf_context_t<wchar_t>;\n\nusing printf_args = basic_format_args<printf_context>;\nusing wprintf_args = basic_format_args<wprintf_context>;\n\n/**\n  \\rst\n  Constructs an `~fmt::format_arg_store` object that contains references to\n  arguments and can be implicitly converted to `~fmt::printf_args`.\n  \\endrst\n */\ntemplate <typename... T>\ninline auto make_printf_args(const T&... args)\n    -> format_arg_store<printf_context, T...> {\n  return {args...};\n}\n\n/**\n  \\rst\n  Constructs an `~fmt::format_arg_store` object that contains references to\n  arguments and can be implicitly converted to `~fmt::wprintf_args`.\n  \\endrst\n */\ntemplate <typename... T>\ninline auto make_wprintf_args(const T&... args)\n    -> format_arg_store<wprintf_context, T...> {\n  return {args...};\n}\n\ntemplate <typename S, typename Char = char_t<S>>\ninline auto vsprintf(\n    const S& fmt,\n    basic_format_args<basic_printf_context_t<type_identity_t<Char>>> args)\n    -> std::basic_string<Char> {\n  basic_memory_buffer<Char> buffer;\n  vprintf(buffer, to_string_view(fmt), args);\n  return to_string(buffer);\n}\n\n/**\n  \\rst\n  Formats arguments and returns the result as a string.\n\n  **Example**::\n\n    std::string message = fmt::sprintf(\"The answer is %d\", 42);\n  \\endrst\n*/\ntemplate <typename S, typename... T,\n          typename Char = enable_if_t<detail::is_string<S>::value, char_t<S>>>\ninline auto sprintf(const S& fmt, const T&... args) -> std::basic_string<Char> {\n  using context = basic_printf_context_t<Char>;\n  return vsprintf(to_string_view(fmt), fmt::make_format_args<context>(args...));\n}\n\ntemplate <typename S, typename Char = char_t<S>>\ninline auto vfprintf(\n    std::FILE* f, const S& fmt,\n    basic_format_args<basic_printf_context_t<type_identity_t<Char>>> args)\n    -> int {\n  basic_memory_buffer<Char> buffer;\n  vprintf(buffer, to_string_view(fmt), args);\n  size_t size = buffer.size();\n  return std::fwrite(buffer.data(), sizeof(Char), size, f) < size\n             ? -1\n             : static_cast<int>(size);\n}\n\n/**\n  \\rst\n  Prints formatted data to the file *f*.\n\n  **Example**::\n\n    fmt::fprintf(stderr, \"Don't %s!\", \"panic\");\n  \\endrst\n */\ntemplate <typename S, typename... T, typename Char = char_t<S>>\ninline auto fprintf(std::FILE* f, const S& fmt, const T&... args) -> int {\n  using context = basic_printf_context_t<Char>;\n  return vfprintf(f, to_string_view(fmt),\n                  fmt::make_format_args<context>(args...));\n}\n\ntemplate <typename S, typename Char = char_t<S>>\ninline auto vprintf(\n    const S& fmt,\n    basic_format_args<basic_printf_context_t<type_identity_t<Char>>> args)\n    -> int {\n  return vfprintf(stdout, to_string_view(fmt), args);\n}\n\n/**\n  \\rst\n  Prints formatted data to ``stdout``.\n\n  **Example**::\n\n    fmt::printf(\"Elapsed time: %.2f seconds\", 1.23);\n  \\endrst\n */\ntemplate <typename S, typename... T, FMT_ENABLE_IF(detail::is_string<S>::value)>\ninline auto printf(const S& fmt, const T&... args) -> int {\n  return vprintf(\n      to_string_view(fmt),\n      fmt::make_format_args<basic_printf_context_t<char_t<S>>>(args...));\n}\n\ntemplate <typename S, typename Char = char_t<S>>\nFMT_DEPRECATED auto vfprintf(\n    std::basic_ostream<Char>& os, const S& fmt,\n    basic_format_args<basic_printf_context_t<type_identity_t<Char>>> args)\n    -> int {\n  basic_memory_buffer<Char> buffer;\n  vprintf(buffer, to_string_view(fmt), args);\n  os.write(buffer.data(), static_cast<std::streamsize>(buffer.size()));\n  return static_cast<int>(buffer.size());\n}\ntemplate <typename S, typename... T, typename Char = char_t<S>>\nFMT_DEPRECATED auto fprintf(std::basic_ostream<Char>& os, const S& fmt,\n                            const T&... args) -> int {\n  return vfprintf(os, to_string_view(fmt),\n                  fmt::make_format_args<basic_printf_context_t<Char>>(args...));\n}\n\nFMT_MODULE_EXPORT_END\nFMT_END_NAMESPACE\n\n#endif  // FMT_PRINTF_H_\n"
  },
  {
    "path": "examples/libraries/fmt/include/fmt/ranges.h",
    "content": "// Formatting library for C++ - experimental range support\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n//\n// Copyright (c) 2018 - present, Remotion (Igor Schulz)\n// All Rights Reserved\n// {fmt} support for ranges, containers and types tuple interface.\n\n#ifndef FMT_RANGES_H_\n#define FMT_RANGES_H_\n\n#include <initializer_list>\n#include <type_traits>\n\n#include \"format.h\"\n\nFMT_BEGIN_NAMESPACE\n\ntemplate <typename Char, typename Enable = void> struct formatting_range {\n#ifdef FMT_DEPRECATED_BRACED_RANGES\n  Char prefix = '{';\n  Char postfix = '}';\n#else\n  Char prefix = '[';\n  Char postfix = ']';\n#endif\n\n  template <typename ParseContext>\n  FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {\n    return ctx.begin();\n  }\n};\n\ntemplate <typename Char, typename Enable = void> struct formatting_tuple {\n  Char prefix = '(';\n  Char postfix = ')';\n\n  template <typename ParseContext>\n  FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {\n    return ctx.begin();\n  }\n};\n\nnamespace detail {\n\ntemplate <typename RangeT, typename OutputIterator>\nOutputIterator copy(const RangeT& range, OutputIterator out) {\n  for (auto it = range.begin(), end = range.end(); it != end; ++it)\n    *out++ = *it;\n  return out;\n}\n\ntemplate <typename OutputIterator>\nOutputIterator copy(const char* str, OutputIterator out) {\n  while (*str) *out++ = *str++;\n  return out;\n}\n\ntemplate <typename OutputIterator>\nOutputIterator copy(char ch, OutputIterator out) {\n  *out++ = ch;\n  return out;\n}\n\ntemplate <typename OutputIterator>\nOutputIterator copy(wchar_t ch, OutputIterator out) {\n  *out++ = ch;\n  return out;\n}\n\n/// Return true value if T has std::string interface, like std::string_view.\ntemplate <typename T> class is_std_string_like {\n  template <typename U>\n  static auto check(U* p)\n      -> decltype((void)p->find('a'), p->length(), (void)p->data(), int());\n  template <typename> static void check(...);\n\n public:\n  static FMT_CONSTEXPR_DECL const bool value =\n      is_string<T>::value || !std::is_void<decltype(check<T>(nullptr))>::value;\n};\n\ntemplate <typename Char>\nstruct is_std_string_like<fmt::basic_string_view<Char>> : std::true_type {};\n\ntemplate <typename... Ts> struct conditional_helper {};\n\ntemplate <typename T, typename _ = void> struct is_range_ : std::false_type {};\n\n#if !FMT_MSC_VER || FMT_MSC_VER > 1800\n\n#  define FMT_DECLTYPE_RETURN(val)  \\\n    ->decltype(val) { return val; } \\\n    static_assert(                  \\\n        true, \"\")  // This makes it so that a semicolon is required after the\n                   // macro, which helps clang-format handle the formatting.\n\n// C array overload\ntemplate <typename T, std::size_t N>\nauto range_begin(const T (&arr)[N]) -> const T* {\n  return arr;\n}\ntemplate <typename T, std::size_t N>\nauto range_end(const T (&arr)[N]) -> const T* {\n  return arr + N;\n}\n\ntemplate <typename T, typename Enable = void>\nstruct has_member_fn_begin_end_t : std::false_type {};\n\ntemplate <typename T>\nstruct has_member_fn_begin_end_t<T, void_t<decltype(std::declval<T>().begin()),\n                                           decltype(std::declval<T>().end())>>\n    : std::true_type {};\n\n// Member function overload\ntemplate <typename T>\nauto range_begin(T&& rng) FMT_DECLTYPE_RETURN(static_cast<T&&>(rng).begin());\ntemplate <typename T>\nauto range_end(T&& rng) FMT_DECLTYPE_RETURN(static_cast<T&&>(rng).end());\n\n// ADL overload. Only participates in overload resolution if member functions\n// are not found.\ntemplate <typename T>\nauto range_begin(T&& rng)\n    -> enable_if_t<!has_member_fn_begin_end_t<T&&>::value,\n                   decltype(begin(static_cast<T&&>(rng)))> {\n  return begin(static_cast<T&&>(rng));\n}\ntemplate <typename T>\nauto range_end(T&& rng) -> enable_if_t<!has_member_fn_begin_end_t<T&&>::value,\n                                       decltype(end(static_cast<T&&>(rng)))> {\n  return end(static_cast<T&&>(rng));\n}\n\ntemplate <typename T, typename Enable = void>\nstruct has_const_begin_end : std::false_type {};\ntemplate <typename T, typename Enable = void>\nstruct has_mutable_begin_end : std::false_type {};\n\ntemplate <typename T>\nstruct has_const_begin_end<\n    T, void_t<decltype(detail::range_begin(\n                  std::declval<const remove_cvref_t<T>&>())),\n              decltype(detail::range_begin(\n                  std::declval<const remove_cvref_t<T>&>()))>>\n    : std::true_type {};\n\ntemplate <typename T>\nstruct has_mutable_begin_end<\n    T, void_t<decltype(detail::range_begin(std::declval<T>())),\n              decltype(detail::range_begin(std::declval<T>())),\n              enable_if_t<std::is_copy_constructible<T>::value>>>\n    : std::true_type {};\n\ntemplate <typename T>\nstruct is_range_<T, void>\n    : std::integral_constant<bool, (has_const_begin_end<T>::value ||\n                                    has_mutable_begin_end<T>::value)> {};\n\ntemplate <typename T, typename Enable = void> struct range_to_view;\ntemplate <typename T>\nstruct range_to_view<T, enable_if_t<has_const_begin_end<T>::value>> {\n  struct view_t {\n    const T* m_range_ptr;\n\n    auto begin() const FMT_DECLTYPE_RETURN(detail::range_begin(*m_range_ptr));\n    auto end() const FMT_DECLTYPE_RETURN(detail::range_end(*m_range_ptr));\n  };\n  static auto view(const T& range) -> view_t { return {&range}; }\n};\n\ntemplate <typename T>\nstruct range_to_view<T, enable_if_t<!has_const_begin_end<T>::value &&\n                                    has_mutable_begin_end<T>::value>> {\n  struct view_t {\n    T m_range_copy;\n\n    auto begin() FMT_DECLTYPE_RETURN(detail::range_begin(m_range_copy));\n    auto end() FMT_DECLTYPE_RETURN(detail::range_end(m_range_copy));\n  };\n  static auto view(const T& range) -> view_t { return {range}; }\n};\n#  undef FMT_DECLTYPE_RETURN\n#endif\n\n/// tuple_size and tuple_element check.\ntemplate <typename T> class is_tuple_like_ {\n  template <typename U>\n  static auto check(U* p) -> decltype(std::tuple_size<U>::value, int());\n  template <typename> static void check(...);\n\n public:\n  static FMT_CONSTEXPR_DECL const bool value =\n      !std::is_void<decltype(check<T>(nullptr))>::value;\n};\n\n// Check for integer_sequence\n#if defined(__cpp_lib_integer_sequence) || FMT_MSC_VER >= 1900\ntemplate <typename T, T... N>\nusing integer_sequence = std::integer_sequence<T, N...>;\ntemplate <size_t... N> using index_sequence = std::index_sequence<N...>;\ntemplate <size_t N> using make_index_sequence = std::make_index_sequence<N>;\n#else\ntemplate <typename T, T... N> struct integer_sequence {\n  using value_type = T;\n\n  static FMT_CONSTEXPR size_t size() { return sizeof...(N); }\n};\n\ntemplate <size_t... N> using index_sequence = integer_sequence<size_t, N...>;\n\ntemplate <typename T, size_t N, T... Ns>\nstruct make_integer_sequence : make_integer_sequence<T, N - 1, N - 1, Ns...> {};\ntemplate <typename T, T... Ns>\nstruct make_integer_sequence<T, 0, Ns...> : integer_sequence<T, Ns...> {};\n\ntemplate <size_t N>\nusing make_index_sequence = make_integer_sequence<size_t, N>;\n#endif\n\ntemplate <class Tuple, class F, size_t... Is>\nvoid for_each(index_sequence<Is...>, Tuple&& tup, F&& f) FMT_NOEXCEPT {\n  using std::get;\n  // using free function get<I>(T) now.\n  const int _[] = {0, ((void)f(get<Is>(tup)), 0)...};\n  (void)_;  // blocks warnings\n}\n\ntemplate <class T>\nFMT_CONSTEXPR make_index_sequence<std::tuple_size<T>::value> get_indexes(\n    T const&) {\n  return {};\n}\n\ntemplate <class Tuple, class F> void for_each(Tuple&& tup, F&& f) {\n  const auto indexes = get_indexes(tup);\n  for_each(indexes, std::forward<Tuple>(tup), std::forward<F>(f));\n}\n\ntemplate <typename Range>\nusing value_type =\n    remove_cvref_t<decltype(*detail::range_begin(std::declval<Range>()))>;\n\ntemplate <typename OutputIt> OutputIt write_delimiter(OutputIt out) {\n  *out++ = ',';\n  *out++ = ' ';\n  return out;\n}\n\ntemplate <\n    typename Char, typename OutputIt, typename Arg,\n    FMT_ENABLE_IF(is_std_string_like<typename std::decay<Arg>::type>::value)>\nOutputIt write_range_entry(OutputIt out, const Arg& v) {\n  *out++ = '\"';\n  out = write<Char>(out, v);\n  *out++ = '\"';\n  return out;\n}\n\ntemplate <typename Char, typename OutputIt, typename Arg,\n          FMT_ENABLE_IF(std::is_same<Arg, Char>::value)>\nOutputIt write_range_entry(OutputIt out, const Arg v) {\n  *out++ = '\\'';\n  *out++ = v;\n  *out++ = '\\'';\n  return out;\n}\n\ntemplate <\n    typename Char, typename OutputIt, typename Arg,\n    FMT_ENABLE_IF(!is_std_string_like<typename std::decay<Arg>::type>::value &&\n                  !std::is_same<Arg, Char>::value)>\nOutputIt write_range_entry(OutputIt out, const Arg& v) {\n  return write<Char>(out, v);\n}\n\n}  // namespace detail\n\ntemplate <typename T> struct is_tuple_like {\n  static FMT_CONSTEXPR_DECL const bool value =\n      detail::is_tuple_like_<T>::value && !detail::is_range_<T>::value;\n};\n\ntemplate <typename TupleT, typename Char>\nstruct formatter<TupleT, Char, enable_if_t<fmt::is_tuple_like<TupleT>::value>> {\n private:\n  // C++11 generic lambda for format()\n  template <typename FormatContext> struct format_each {\n    template <typename T> void operator()(const T& v) {\n      if (i > 0) out = detail::write_delimiter(out);\n      out = detail::write_range_entry<Char>(out, v);\n      ++i;\n    }\n    formatting_tuple<Char>& formatting;\n    size_t& i;\n    typename std::add_lvalue_reference<\n        decltype(std::declval<FormatContext>().out())>::type out;\n  };\n\n public:\n  formatting_tuple<Char> formatting;\n\n  template <typename ParseContext>\n  FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {\n    return formatting.parse(ctx);\n  }\n\n  template <typename FormatContext = format_context>\n  auto format(const TupleT& values, FormatContext& ctx) -> decltype(ctx.out()) {\n    auto out = ctx.out();\n    size_t i = 0;\n\n    detail::copy(formatting.prefix, out);\n    detail::for_each(values, format_each<FormatContext>{formatting, i, out});\n    detail::copy(formatting.postfix, out);\n\n    return ctx.out();\n  }\n};\n\ntemplate <typename T, typename Char> struct is_range {\n  static FMT_CONSTEXPR_DECL const bool value =\n      detail::is_range_<T>::value && !detail::is_std_string_like<T>::value &&\n      !std::is_convertible<T, std::basic_string<Char>>::value &&\n      !std::is_constructible<detail::std_string_view<Char>, T>::value;\n};\n\ntemplate <typename T, typename Char>\nstruct formatter<\n    T, Char,\n    enable_if_t<\n        fmt::is_range<T, Char>::value\n// Workaround a bug in MSVC 2017 and earlier.\n#if !FMT_MSC_VER || FMT_MSC_VER >= 1927\n        && (has_formatter<detail::value_type<T>, format_context>::value ||\n            detail::has_fallback_formatter<detail::value_type<T>, Char>::value)\n#endif\n        >> {\n  formatting_range<Char> formatting;\n\n  template <typename ParseContext>\n  FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {\n    return formatting.parse(ctx);\n  }\n\n  template <typename FormatContext>\n  typename FormatContext::iterator format(const T& values, FormatContext& ctx) {\n    auto out = detail::copy(formatting.prefix, ctx.out());\n    size_t i = 0;\n    auto view = detail::range_to_view<T>::view(values);\n    auto it = view.begin();\n    auto end = view.end();\n    for (; it != end; ++it) {\n      if (i > 0) out = detail::write_delimiter(out);\n      out = detail::write_range_entry<Char>(out, *it);\n      ++i;\n    }\n    return detail::copy(formatting.postfix, out);\n  }\n};\n\ntemplate <typename Char, typename... T> struct tuple_join_view : detail::view {\n  const std::tuple<T...>& tuple;\n  basic_string_view<Char> sep;\n\n  tuple_join_view(const std::tuple<T...>& t, basic_string_view<Char> s)\n      : tuple(t), sep{s} {}\n};\n\ntemplate <typename Char, typename... T>\nusing tuple_arg_join = tuple_join_view<Char, T...>;\n\ntemplate <typename Char, typename... T>\nstruct formatter<tuple_join_view<Char, T...>, Char> {\n  template <typename ParseContext>\n  FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {\n    return ctx.begin();\n  }\n\n  template <typename FormatContext>\n  auto format(const tuple_join_view<Char, T...>& value, FormatContext& ctx) ->\n      typename FormatContext::iterator {\n    return format(value, ctx, detail::make_index_sequence<sizeof...(T)>{});\n  }\n\n private:\n  template <typename FormatContext, size_t... N>\n  auto format(const tuple_join_view<Char, T...>& value, FormatContext& ctx,\n              detail::index_sequence<N...>) ->\n      typename FormatContext::iterator {\n    using std::get;\n    return format_args(value, ctx, get<N>(value.tuple)...);\n  }\n\n  template <typename FormatContext>\n  auto format_args(const tuple_join_view<Char, T...>&, FormatContext& ctx) ->\n      typename FormatContext::iterator {\n    // NOTE: for compilers that support C++17, this empty function instantiation\n    // can be replaced with a constexpr branch in the variadic overload.\n    return ctx.out();\n  }\n\n  template <typename FormatContext, typename Arg, typename... Args>\n  auto format_args(const tuple_join_view<Char, T...>& value, FormatContext& ctx,\n                   const Arg& arg, const Args&... args) ->\n      typename FormatContext::iterator {\n    using base = formatter<typename std::decay<Arg>::type, Char>;\n    auto out = base().format(arg, ctx);\n    if (sizeof...(Args) > 0) {\n      out = std::copy(value.sep.begin(), value.sep.end(), out);\n      ctx.advance_to(out);\n      return format_args(value, ctx, args...);\n    }\n    return out;\n  }\n};\n\nFMT_MODULE_EXPORT_BEGIN\n\n/**\n  \\rst\n  Returns an object that formats `tuple` with elements separated by `sep`.\n\n  **Example**::\n\n    std::tuple<int, char> t = {1, 'a'};\n    fmt::print(\"{}\", fmt::join(t, \", \"));\n    // Output: \"1, a\"\n  \\endrst\n */\ntemplate <typename... T>\nFMT_CONSTEXPR auto join(const std::tuple<T...>& tuple, string_view sep)\n    -> tuple_join_view<char, T...> {\n  return {tuple, sep};\n}\n\ntemplate <typename... T>\nFMT_CONSTEXPR auto join(const std::tuple<T...>& tuple,\n                        basic_string_view<wchar_t> sep)\n    -> tuple_join_view<wchar_t, T...> {\n  return {tuple, sep};\n}\n\n/**\n  \\rst\n  Returns an object that formats `initializer_list` with elements separated by\n  `sep`.\n\n  **Example**::\n\n    fmt::print(\"{}\", fmt::join({1, 2, 3}, \", \"));\n    // Output: \"1, 2, 3\"\n  \\endrst\n */\ntemplate <typename T>\nauto join(std::initializer_list<T> list, string_view sep)\n    -> join_view<const T*, const T*> {\n  return join(std::begin(list), std::end(list), sep);\n}\n\nFMT_MODULE_EXPORT_END\nFMT_END_NAMESPACE\n\n#endif  // FMT_RANGES_H_\n"
  },
  {
    "path": "examples/libraries/fmt/include/fmt/xchar.h",
    "content": "// Formatting library for C++ - optional wchar_t and exotic character support\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#ifndef FMT_WCHAR_H_\n#define FMT_WCHAR_H_\n\n#include <cwchar>\n#include <tuple>\n\n#include \"format.h\"\n\nFMT_BEGIN_NAMESPACE\nnamespace detail {\ntemplate <typename T>\nusing is_exotic_char = bool_constant<!std::is_same<T, char>::value>;\n}\n\nFMT_MODULE_EXPORT_BEGIN\n\nusing wstring_view = basic_string_view<wchar_t>;\nusing wformat_parse_context = basic_format_parse_context<wchar_t>;\nusing wformat_context = buffer_context<wchar_t>;\nusing wformat_args = basic_format_args<wformat_context>;\nusing wmemory_buffer = basic_memory_buffer<wchar_t>;\n\n#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409\n// Workaround broken conversion on older gcc.\ntemplate <typename... Args> using wformat_string = wstring_view;\n#else\ntemplate <typename... Args>\nusing wformat_string = basic_format_string<wchar_t, type_identity_t<Args>...>;\n#endif\n\ntemplate <> struct is_char<wchar_t> : std::true_type {};\ntemplate <> struct is_char<detail::char8_type> : std::true_type {};\ntemplate <> struct is_char<char16_t> : std::true_type {};\ntemplate <> struct is_char<char32_t> : std::true_type {};\n\ntemplate <typename... Args>\nconstexpr format_arg_store<wformat_context, Args...> make_wformat_args(\n    const Args&... args) {\n  return {args...};\n}\n\ninline namespace literals {\nconstexpr auto operator\"\" _format(const wchar_t* s, size_t n)\n    -> detail::udl_formatter<wchar_t> {\n  return {{s, n}};\n}\n\n#if FMT_USE_USER_DEFINED_LITERALS && !FMT_USE_NONTYPE_TEMPLATE_PARAMETERS\nconstexpr detail::udl_arg<wchar_t> operator\"\" _a(const wchar_t* s, size_t) {\n  return {s};\n}\n#endif\n}  // namespace literals\n\ntemplate <typename It, typename Sentinel>\nauto join(It begin, Sentinel end, wstring_view sep)\n    -> join_view<It, Sentinel, wchar_t> {\n  return {begin, end, sep};\n}\n\ntemplate <typename Range>\nauto join(Range&& range, wstring_view sep)\n    -> join_view<detail::iterator_t<Range>, detail::sentinel_t<Range>,\n                 wchar_t> {\n  return join(std::begin(range), std::end(range), sep);\n}\n\ntemplate <typename T>\nauto join(std::initializer_list<T> list, wstring_view sep)\n    -> join_view<const T*, const T*, wchar_t> {\n  return join(std::begin(list), std::end(list), sep);\n}\n\ntemplate <typename Char, FMT_ENABLE_IF(!std::is_same<Char, char>::value)>\nauto vformat(basic_string_view<Char> format_str,\n             basic_format_args<buffer_context<type_identity_t<Char>>> args)\n    -> std::basic_string<Char> {\n  basic_memory_buffer<Char> buffer;\n  detail::vformat_to(buffer, format_str, args);\n  return to_string(buffer);\n}\n\n// Pass char_t as a default template parameter instead of using\n// std::basic_string<char_t<S>> to reduce the symbol size.\ntemplate <typename S, typename... Args, typename Char = char_t<S>,\n          FMT_ENABLE_IF(!std::is_same<Char, char>::value)>\nauto format(const S& format_str, Args&&... args) -> std::basic_string<Char> {\n  const auto& vargs = fmt::make_args_checked<Args...>(format_str, args...);\n  return vformat(to_string_view(format_str), vargs);\n}\n\ntemplate <typename Locale, typename S, typename Char = char_t<S>,\n          FMT_ENABLE_IF(detail::is_locale<Locale>::value&&\n                            detail::is_exotic_char<Char>::value)>\ninline auto vformat(\n    const Locale& loc, const S& format_str,\n    basic_format_args<buffer_context<type_identity_t<Char>>> args)\n    -> std::basic_string<Char> {\n  return detail::vformat(loc, to_string_view(format_str), args);\n}\n\ntemplate <typename Locale, typename S, typename... Args,\n          typename Char = char_t<S>,\n          FMT_ENABLE_IF(detail::is_locale<Locale>::value&&\n                            detail::is_exotic_char<Char>::value)>\ninline auto format(const Locale& loc, const S& format_str, Args&&... args)\n    -> std::basic_string<Char> {\n  return detail::vformat(loc, to_string_view(format_str),\n                         fmt::make_args_checked<Args...>(format_str, args...));\n}\n\ntemplate <typename OutputIt, typename S, typename Char = char_t<S>,\n          FMT_ENABLE_IF(detail::is_output_iterator<OutputIt, Char>::value&&\n                            detail::is_exotic_char<Char>::value)>\nauto vformat_to(OutputIt out, const S& format_str,\n                basic_format_args<buffer_context<type_identity_t<Char>>> args)\n    -> OutputIt {\n  auto&& buf = detail::get_buffer<Char>(out);\n  detail::vformat_to(buf, to_string_view(format_str), args);\n  return detail::get_iterator(buf);\n}\n\ntemplate <typename OutputIt, typename S, typename... Args,\n          typename Char = char_t<S>,\n          FMT_ENABLE_IF(detail::is_output_iterator<OutputIt, Char>::value&&\n                            detail::is_exotic_char<Char>::value)>\ninline auto format_to(OutputIt out, const S& fmt, Args&&... args) -> OutputIt {\n  const auto& vargs = fmt::make_args_checked<Args...>(fmt, args...);\n  return vformat_to(out, to_string_view(fmt), vargs);\n}\n\ntemplate <typename S, typename... Args, typename Char, size_t SIZE,\n          typename Allocator, FMT_ENABLE_IF(detail::is_string<S>::value)>\nFMT_DEPRECATED auto format_to(basic_memory_buffer<Char, SIZE, Allocator>& buf,\n                              const S& format_str, Args&&... args) ->\n    typename buffer_context<Char>::iterator {\n  const auto& vargs = fmt::make_args_checked<Args...>(format_str, args...);\n  detail::vformat_to(buf, to_string_view(format_str), vargs, {});\n  return detail::buffer_appender<Char>(buf);\n}\n\ntemplate <typename Locale, typename S, typename OutputIt, typename... Args,\n          typename Char = char_t<S>,\n          FMT_ENABLE_IF(detail::is_output_iterator<OutputIt, Char>::value&&\n                            detail::is_locale<Locale>::value&&\n                                detail::is_exotic_char<Char>::value)>\ninline auto vformat_to(\n    OutputIt out, const Locale& loc, const S& format_str,\n    basic_format_args<buffer_context<type_identity_t<Char>>> args) -> OutputIt {\n  auto&& buf = detail::get_buffer<Char>(out);\n  vformat_to(buf, to_string_view(format_str), args, detail::locale_ref(loc));\n  return detail::get_iterator(buf);\n}\n\ntemplate <\n    typename OutputIt, typename Locale, typename S, typename... Args,\n    typename Char = char_t<S>,\n    bool enable = detail::is_output_iterator<OutputIt, Char>::value&&\n        detail::is_locale<Locale>::value&& detail::is_exotic_char<Char>::value>\ninline auto format_to(OutputIt out, const Locale& loc, const S& format_str,\n                      Args&&... args) ->\n    typename std::enable_if<enable, OutputIt>::type {\n  const auto& vargs = fmt::make_args_checked<Args...>(format_str, args...);\n  return vformat_to(out, loc, to_string_view(format_str), vargs);\n}\n\ntemplate <typename OutputIt, typename Char, typename... Args,\n          FMT_ENABLE_IF(detail::is_output_iterator<OutputIt, Char>::value&&\n                            detail::is_exotic_char<Char>::value)>\ninline auto vformat_to_n(\n    OutputIt out, size_t n, basic_string_view<Char> format_str,\n    basic_format_args<buffer_context<type_identity_t<Char>>> args)\n    -> format_to_n_result<OutputIt> {\n  detail::iterator_buffer<OutputIt, Char, detail::fixed_buffer_traits> buf(out,\n                                                                           n);\n  detail::vformat_to(buf, format_str, args);\n  return {buf.out(), buf.count()};\n}\n\ntemplate <typename OutputIt, typename S, typename... Args,\n          typename Char = char_t<S>,\n          FMT_ENABLE_IF(detail::is_output_iterator<OutputIt, Char>::value&&\n                            detail::is_exotic_char<Char>::value)>\ninline auto format_to_n(OutputIt out, size_t n, const S& fmt,\n                        const Args&... args) -> format_to_n_result<OutputIt> {\n  const auto& vargs = fmt::make_args_checked<Args...>(fmt, args...);\n  return vformat_to_n(out, n, to_string_view(fmt), vargs);\n}\n\ntemplate <typename S, typename... Args, typename Char = char_t<S>,\n          FMT_ENABLE_IF(detail::is_exotic_char<Char>::value)>\ninline auto formatted_size(const S& fmt, Args&&... args) -> size_t {\n  detail::counting_buffer<Char> buf;\n  const auto& vargs = fmt::make_args_checked<Args...>(fmt, args...);\n  detail::vformat_to(buf, to_string_view(fmt), vargs);\n  return buf.count();\n}\n\ninline void vprint(std::FILE* f, wstring_view fmt, wformat_args args) {\n  wmemory_buffer buffer;\n  detail::vformat_to(buffer, fmt, args);\n  buffer.push_back(L'\\0');\n  if (std::fputws(buffer.data(), f) == -1)\n    FMT_THROW(system_error(errno, FMT_STRING(\"cannot write to file\")));\n}\n\ninline void vprint(wstring_view fmt, wformat_args args) {\n  vprint(stdout, fmt, args);\n}\n\ntemplate <typename... T>\nvoid print(std::FILE* f, wformat_string<T...> fmt, T&&... args) {\n  return vprint(f, wstring_view(fmt), make_wformat_args(args...));\n}\n\ntemplate <typename... T> void print(wformat_string<T...> fmt, T&&... args) {\n  return vprint(wstring_view(fmt), make_wformat_args(args...));\n}\n\n/**\n  Converts *value* to ``std::wstring`` using the default format for type *T*.\n */\ntemplate <typename T> inline auto to_wstring(const T& value) -> std::wstring {\n  return format(FMT_STRING(L\"{}\"), value);\n}\nFMT_MODULE_EXPORT_END\nFMT_END_NAMESPACE\n\n#endif  // FMT_WCHAR_H_\n"
  },
  {
    "path": "examples/libraries/fmt/src/fmt.cc",
    "content": "module;\n#ifndef __cpp_modules\n#  error Module not supported.\n#endif\n\n// put all implementation-provided headers into the global module fragment\n// to prevent attachment to this module\n#if !defined(_CRT_SECURE_NO_WARNINGS) && defined(_MSC_VER)\n#  define _CRT_SECURE_NO_WARNINGS\n#endif\n#if !defined(WIN32_LEAN_AND_MEAN) && defined(_WIN32)\n#  define WIN32_LEAN_AND_MEAN\n#endif\n\n#include <algorithm>\n#include <cctype>\n#include <cerrno>\n#include <chrono>\n#include <climits>\n#include <clocale>\n#include <cmath>\n#include <cstdarg>\n#include <cstddef>\n#include <cstdint>\n#include <cstdio>\n#include <cstdlib>\n#include <cstring>\n#include <ctime>\n#include <cwchar>\n#include <exception>\n#include <functional>\n#include <iterator>\n#include <limits>\n#include <locale>\n#include <memory>\n#include <ostream>\n#include <sstream>\n#include <stdexcept>\n#include <string>\n#include <string_view>\n#include <system_error>\n#include <type_traits>\n#include <utility>\n#include <vector>\n\n#if _MSC_VER\n#  include <intrin.h>\n#endif\n#if defined __APPLE__ || defined(__FreeBSD__)\n#  include <xlocale.h>\n#endif\n#if __has_include(<winapifamily.h>)\n#  include <winapifamily.h>\n#endif\n#if (__has_include(<fcntl.h>) || defined(__APPLE__) || \\\n     defined(__linux__)) &&                            \\\n    (!defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP))\n#  include <fcntl.h>\n#  include <sys/stat.h>\n#  include <sys/types.h>\n#  ifndef _WIN32\n#    include <unistd.h>\n#  else\n#    include <io.h>\n#  endif\n#endif\n#ifdef _WIN32\n#  include <windows.h>\n#endif\n\nexport module fmt;\n\n#define FMT_MODULE_EXPORT export\n#define FMT_MODULE_EXPORT_BEGIN export {\n#define FMT_MODULE_EXPORT_END }\n#define FMT_BEGIN_DETAIL_NAMESPACE \\\n  }                                \\\n  namespace detail {\n#define FMT_END_DETAIL_NAMESPACE \\\n  }                              \\\n  export {\n\n// all library-provided declarations and definitions\n// must be in the module purview to be exported\n#include \"fmt/args.h\"\n#include \"fmt/chrono.h\"\n#include \"fmt/color.h\"\n#include \"fmt/compile.h\"\n#include \"fmt/format.h\"\n#include \"fmt/os.h\"\n#include \"fmt/printf.h\"\n#include \"fmt/xchar.h\"\n\n// gcc doesn't yet implement private module fragments\n#if !FMT_GCC_VERSION\nmodule : private;\n#endif\n\n#include \"format.cc\"\n#include \"os.cc\"\n"
  },
  {
    "path": "examples/libraries/fmt/src/format.cc",
    "content": "// Formatting library for C++\n//\n// Copyright (c) 2012 - 2016, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include \"fmt/format-inl.h\"\n\nFMT_BEGIN_NAMESPACE\nnamespace detail {\n\ntemplate <typename T>\nint format_float(char* buf, std::size_t size, const char* format, int precision,\n                 T value) {\n#ifdef FMT_FUZZ\n  if (precision > 100000)\n    throw std::runtime_error(\n        \"fuzz mode - avoid large allocation inside snprintf\");\n#endif\n  // Suppress the warning about nonliteral format string.\n  int (*snprintf_ptr)(char*, size_t, const char*, ...) = FMT_SNPRINTF;\n  return precision < 0 ? snprintf_ptr(buf, size, format, value)\n                       : snprintf_ptr(buf, size, format, precision, value);\n}\n\ntemplate FMT_API dragonbox::decimal_fp<float> dragonbox::to_decimal(float x)\n    FMT_NOEXCEPT;\ntemplate FMT_API dragonbox::decimal_fp<double> dragonbox::to_decimal(double x)\n    FMT_NOEXCEPT;\n}  // namespace detail\n\n// Workaround a bug in MSVC2013 that prevents instantiation of format_float.\nint (*instantiate_format_float)(double, int, detail::float_specs,\n                                detail::buffer<char>&) = detail::format_float;\n\n#ifndef FMT_STATIC_THOUSANDS_SEPARATOR\ntemplate FMT_API detail::locale_ref::locale_ref(const std::locale& loc);\ntemplate FMT_API std::locale detail::locale_ref::get<std::locale>() const;\n#endif\n\n// Explicit instantiations for char.\n\ntemplate FMT_API auto detail::thousands_sep_impl(locale_ref)\n    -> thousands_sep_result<char>;\ntemplate FMT_API char detail::decimal_point_impl(locale_ref);\n\ntemplate FMT_API void detail::buffer<char>::append(const char*, const char*);\n\n// DEPRECATED!\n// There is no correspondent extern template in format.h because of\n// incompatibility between clang and gcc (#2377).\ntemplate FMT_API void detail::vformat_to(\n    detail::buffer<char>&, string_view,\n    basic_format_args<FMT_BUFFER_CONTEXT(char)>, detail::locale_ref);\n\ntemplate FMT_API int detail::snprintf_float(double, int, detail::float_specs,\n                                            detail::buffer<char>&);\ntemplate FMT_API int detail::snprintf_float(long double, int,\n                                            detail::float_specs,\n                                            detail::buffer<char>&);\ntemplate FMT_API int detail::format_float(double, int, detail::float_specs,\n                                          detail::buffer<char>&);\ntemplate FMT_API int detail::format_float(long double, int, detail::float_specs,\n                                          detail::buffer<char>&);\n\n// Explicit instantiations for wchar_t.\n\ntemplate FMT_API auto detail::thousands_sep_impl(locale_ref)\n    -> thousands_sep_result<wchar_t>;\ntemplate FMT_API wchar_t detail::decimal_point_impl(locale_ref);\n\ntemplate FMT_API void detail::buffer<wchar_t>::append(const wchar_t*,\n                                                      const wchar_t*);\n\ntemplate struct detail::basic_data<void>;\n\nFMT_END_NAMESPACE\n"
  },
  {
    "path": "examples/libraries/fmt/src/os.cc",
    "content": "// Formatting library for C++ - optional OS-specific functionality\n//\n// Copyright (c) 2012 - 2016, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n// Disable bogus MSVC warnings.\n#if !defined(_CRT_SECURE_NO_WARNINGS) && defined(_MSC_VER)\n#  define _CRT_SECURE_NO_WARNINGS\n#endif\n\n#include \"fmt/os.h\"\n\n#include <climits>\n\n#if FMT_USE_FCNTL\n#  include <sys/stat.h>\n#  include <sys/types.h>\n\n#  ifndef _WIN32\n#    include <unistd.h>\n#  else\n#    ifndef WIN32_LEAN_AND_MEAN\n#      define WIN32_LEAN_AND_MEAN\n#    endif\n#    include <io.h>\n\n#    define O_CREAT _O_CREAT\n#    define O_TRUNC _O_TRUNC\n\n#    ifndef S_IRUSR\n#      define S_IRUSR _S_IREAD\n#    endif\n\n#    ifndef S_IWUSR\n#      define S_IWUSR _S_IWRITE\n#    endif\n\n#    ifdef __MINGW32__\n#      define _SH_DENYNO 0x40\n#    endif\n#  endif  // _WIN32\n#endif    // FMT_USE_FCNTL\n\n#ifdef _WIN32\n#  include <windows.h>\n#endif\n\n#ifdef fileno\n#  undef fileno\n#endif\n\nnamespace {\n#ifdef _WIN32\n// Return type of read and write functions.\nusing rwresult = int;\n\n// On Windows the count argument to read and write is unsigned, so convert\n// it from size_t preventing integer overflow.\ninline unsigned convert_rwcount(std::size_t count) {\n  return count <= UINT_MAX ? static_cast<unsigned>(count) : UINT_MAX;\n}\n#elif FMT_USE_FCNTL\n// Return type of read and write functions.\nusing rwresult = ssize_t;\n\ninline std::size_t convert_rwcount(std::size_t count) { return count; }\n#endif\n}  // namespace\n\nFMT_BEGIN_NAMESPACE\n\n#ifdef _WIN32\ndetail::utf16_to_utf8::utf16_to_utf8(basic_string_view<wchar_t> s) {\n  if (int error_code = convert(s)) {\n    FMT_THROW(windows_error(error_code,\n                            \"cannot convert string from UTF-16 to UTF-8\"));\n  }\n}\n\nint detail::utf16_to_utf8::convert(basic_string_view<wchar_t> s) {\n  if (s.size() > INT_MAX) return ERROR_INVALID_PARAMETER;\n  int s_size = static_cast<int>(s.size());\n  if (s_size == 0) {\n    // WideCharToMultiByte does not support zero length, handle separately.\n    buffer_.resize(1);\n    buffer_[0] = 0;\n    return 0;\n  }\n\n  int length = WideCharToMultiByte(CP_UTF8, 0, s.data(), s_size, nullptr, 0,\n                                   nullptr, nullptr);\n  if (length == 0) return GetLastError();\n  buffer_.resize(length + 1);\n  length = WideCharToMultiByte(CP_UTF8, 0, s.data(), s_size, &buffer_[0],\n                               length, nullptr, nullptr);\n  if (length == 0) return GetLastError();\n  buffer_[length] = 0;\n  return 0;\n}\n\nnamespace detail {\n\nclass system_message {\n  system_message(const system_message&) = delete;\n  void operator=(const system_message&) = delete;\n\n  unsigned long result_;\n  wchar_t* message_;\n\n  static bool is_whitespace(wchar_t c) FMT_NOEXCEPT {\n    return c == L' ' || c == L'\\n' || c == L'\\r' || c == L'\\t' || c == L'\\0';\n  }\n\n public:\n  explicit system_message(unsigned long error_code)\n      : result_(0), message_(nullptr) {\n    result_ = FormatMessageW(\n        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |\n            FORMAT_MESSAGE_IGNORE_INSERTS,\n        nullptr, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),\n        reinterpret_cast<wchar_t*>(&message_), 0, nullptr);\n    if (result_ != 0) {\n      while (result_ != 0 && is_whitespace(message_[result_ - 1])) {\n        --result_;\n      }\n    }\n  }\n  ~system_message() { LocalFree(message_); }\n  explicit operator bool() const FMT_NOEXCEPT { return result_ != 0; }\n  operator basic_string_view<wchar_t>() const FMT_NOEXCEPT {\n    return basic_string_view<wchar_t>(message_, result_);\n  }\n};\n\nclass utf8_system_category final : public std::error_category {\n public:\n  const char* name() const FMT_NOEXCEPT override { return \"system\"; }\n  std::string message(int error_code) const override {\n    system_message msg(error_code);\n    if (msg) {\n      utf16_to_utf8 utf8_message;\n      if (utf8_message.convert(msg) == ERROR_SUCCESS) {\n        return utf8_message.str();\n      }\n    }\n    return \"unknown error\";\n  }\n};\n\n}  // namespace detail\n\nFMT_API const std::error_category& system_category() FMT_NOEXCEPT {\n  static const detail::utf8_system_category category;\n  return category;\n}\n\nstd::system_error vwindows_error(int err_code, string_view format_str,\n                                 format_args args) {\n  auto ec = std::error_code(err_code, system_category());\n  return std::system_error(ec, vformat(format_str, args));\n}\n\nvoid detail::format_windows_error(detail::buffer<char>& out, int error_code,\n                                  const char* message) FMT_NOEXCEPT {\n  FMT_TRY {\n    system_message msg(error_code);\n    if (msg) {\n      utf16_to_utf8 utf8_message;\n      if (utf8_message.convert(msg) == ERROR_SUCCESS) {\n        format_to(buffer_appender<char>(out), \"{}: {}\", message, utf8_message);\n        return;\n      }\n    }\n  }\n  FMT_CATCH(...) {}\n  format_error_code(out, error_code, message);\n}\n\nvoid report_windows_error(int error_code, const char* message) FMT_NOEXCEPT {\n  report_error(detail::format_windows_error, error_code, message);\n}\n#endif  // _WIN32\n\nbuffered_file::~buffered_file() FMT_NOEXCEPT {\n  if (file_ && FMT_SYSTEM(fclose(file_)) != 0)\n    report_system_error(errno, \"cannot close file\");\n}\n\nbuffered_file::buffered_file(cstring_view filename, cstring_view mode) {\n  FMT_RETRY_VAL(file_, FMT_SYSTEM(fopen(filename.c_str(), mode.c_str())),\n                nullptr);\n  if (!file_)\n    FMT_THROW(system_error(errno, \"cannot open file {}\", filename.c_str()));\n}\n\nvoid buffered_file::close() {\n  if (!file_) return;\n  int result = FMT_SYSTEM(fclose(file_));\n  file_ = nullptr;\n  if (result != 0) FMT_THROW(system_error(errno, \"cannot close file\"));\n}\n\n// A macro used to prevent expansion of fileno on broken versions of MinGW.\n#define FMT_ARGS\n\nint buffered_file::fileno() const {\n  int fd = FMT_POSIX_CALL(fileno FMT_ARGS(file_));\n  if (fd == -1) FMT_THROW(system_error(errno, \"cannot get file descriptor\"));\n  return fd;\n}\n\n#if FMT_USE_FCNTL\nfile::file(cstring_view path, int oflag) {\n  int mode = S_IRUSR | S_IWUSR;\n#  if defined(_WIN32) && !defined(__MINGW32__)\n  fd_ = -1;\n  FMT_POSIX_CALL(sopen_s(&fd_, path.c_str(), oflag, _SH_DENYNO, mode));\n#  else\n  FMT_RETRY(fd_, FMT_POSIX_CALL(open(path.c_str(), oflag, mode)));\n#  endif\n  if (fd_ == -1)\n    FMT_THROW(system_error(errno, \"cannot open file {}\", path.c_str()));\n}\n\nfile::~file() FMT_NOEXCEPT {\n  // Don't retry close in case of EINTR!\n  // See http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html\n  if (fd_ != -1 && FMT_POSIX_CALL(close(fd_)) != 0)\n    report_system_error(errno, \"cannot close file\");\n}\n\nvoid file::close() {\n  if (fd_ == -1) return;\n  // Don't retry close in case of EINTR!\n  // See http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html\n  int result = FMT_POSIX_CALL(close(fd_));\n  fd_ = -1;\n  if (result != 0) FMT_THROW(system_error(errno, \"cannot close file\"));\n}\n\nlong long file::size() const {\n#  ifdef _WIN32\n  // Use GetFileSize instead of GetFileSizeEx for the case when _WIN32_WINNT\n  // is less than 0x0500 as is the case with some default MinGW builds.\n  // Both functions support large file sizes.\n  DWORD size_upper = 0;\n  HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(fd_));\n  DWORD size_lower = FMT_SYSTEM(GetFileSize(handle, &size_upper));\n  if (size_lower == INVALID_FILE_SIZE) {\n    DWORD error = GetLastError();\n    if (error != NO_ERROR)\n      FMT_THROW(windows_error(GetLastError(), \"cannot get file size\"));\n  }\n  unsigned long long long_size = size_upper;\n  return (long_size << sizeof(DWORD) * CHAR_BIT) | size_lower;\n#  else\n  using Stat = struct stat;\n  Stat file_stat = Stat();\n  if (FMT_POSIX_CALL(fstat(fd_, &file_stat)) == -1)\n    FMT_THROW(system_error(errno, \"cannot get file attributes\"));\n  static_assert(sizeof(long long) >= sizeof(file_stat.st_size),\n                \"return type of file::size is not large enough\");\n  return file_stat.st_size;\n#  endif\n}\n\nstd::size_t file::read(void* buffer, std::size_t count) {\n  rwresult result = 0;\n  FMT_RETRY(result, FMT_POSIX_CALL(read(fd_, buffer, convert_rwcount(count))));\n  if (result < 0) FMT_THROW(system_error(errno, \"cannot read from file\"));\n  return detail::to_unsigned(result);\n}\n\nstd::size_t file::write(const void* buffer, std::size_t count) {\n  rwresult result = 0;\n  FMT_RETRY(result, FMT_POSIX_CALL(write(fd_, buffer, convert_rwcount(count))));\n  if (result < 0) FMT_THROW(system_error(errno, \"cannot write to file\"));\n  return detail::to_unsigned(result);\n}\n\nfile file::dup(int fd) {\n  // Don't retry as dup doesn't return EINTR.\n  // http://pubs.opengroup.org/onlinepubs/009695399/functions/dup.html\n  int new_fd = FMT_POSIX_CALL(dup(fd));\n  if (new_fd == -1)\n    FMT_THROW(system_error(errno, \"cannot duplicate file descriptor {}\", fd));\n  return file(new_fd);\n}\n\nvoid file::dup2(int fd) {\n  int result = 0;\n  FMT_RETRY(result, FMT_POSIX_CALL(dup2(fd_, fd)));\n  if (result == -1) {\n    FMT_THROW(system_error(errno, \"cannot duplicate file descriptor {} to {}\",\n                           fd_, fd));\n  }\n}\n\nvoid file::dup2(int fd, std::error_code& ec) FMT_NOEXCEPT {\n  int result = 0;\n  FMT_RETRY(result, FMT_POSIX_CALL(dup2(fd_, fd)));\n  if (result == -1) ec = std::error_code(errno, std::generic_category());\n}\n\nvoid file::pipe(file& read_end, file& write_end) {\n  // Close the descriptors first to make sure that assignments don't throw\n  // and there are no leaks.\n  read_end.close();\n  write_end.close();\n  int fds[2] = {};\n#  ifdef _WIN32\n  // Make the default pipe capacity same as on Linux 2.6.11+.\n  enum { DEFAULT_CAPACITY = 65536 };\n  int result = FMT_POSIX_CALL(pipe(fds, DEFAULT_CAPACITY, _O_BINARY));\n#  else\n  // Don't retry as the pipe function doesn't return EINTR.\n  // http://pubs.opengroup.org/onlinepubs/009696799/functions/pipe.html\n  int result = FMT_POSIX_CALL(pipe(fds));\n#  endif\n  if (result != 0) FMT_THROW(system_error(errno, \"cannot create pipe\"));\n  // The following assignments don't throw because read_fd and write_fd\n  // are closed.\n  read_end = file(fds[0]);\n  write_end = file(fds[1]);\n}\n\nbuffered_file file::fdopen(const char* mode) {\n// Don't retry as fdopen doesn't return EINTR.\n#  if defined(__MINGW32__) && defined(_POSIX_)\n  FILE* f = ::fdopen(fd_, mode);\n#  else\n  FILE* f = FMT_POSIX_CALL(fdopen(fd_, mode));\n#  endif\n  if (!f)\n    FMT_THROW(\n        system_error(errno, \"cannot associate stream with file descriptor\"));\n  buffered_file bf(f);\n  fd_ = -1;\n  return bf;\n}\n\nlong getpagesize() {\n#  ifdef _WIN32\n  SYSTEM_INFO si;\n  GetSystemInfo(&si);\n  return si.dwPageSize;\n#  else\n  long size = FMT_POSIX_CALL(sysconf(_SC_PAGESIZE));\n  if (size < 0) FMT_THROW(system_error(errno, \"cannot get memory page size\"));\n  return size;\n#  endif\n}\n\nFMT_API void ostream::grow(size_t) {\n  if (this->size() == this->capacity()) flush();\n}\n#endif  // FMT_USE_FCNTL\nFMT_END_NAMESPACE\n"
  },
  {
    "path": "examples/libraries/fmt/support/Android.mk",
    "content": "LOCAL_PATH := $(call my-dir)\ninclude $(CLEAR_VARS)\n\nLOCAL_MODULE := fmt_static\nLOCAL_MODULE_FILENAME := libfmt\n\nLOCAL_SRC_FILES := ../src/format.cc\n\nLOCAL_C_INCLUDES := $(LOCAL_PATH)\nLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)\n\nLOCAL_CFLAGS += -std=c++11 -fexceptions\n\ninclude $(BUILD_STATIC_LIBRARY)\n\n"
  },
  {
    "path": "examples/libraries/fmt/support/AndroidManifest.xml",
    "content": "<manifest package=\"net.fmtlib\" />\n"
  },
  {
    "path": "examples/libraries/fmt/support/C++.sublime-syntax",
    "content": "%YAML 1.2\n---\n# http://www.sublimetext.com/docs/3/syntax.html\nname: C++ (fmt)\ncomment: I don't think anyone uses .hp. .cp tends to be paired with .h. (I could be wrong. :) -- chris\nfile_extensions:\n  - cpp\n  - cc\n  - cp\n  - cxx\n  - c++\n  - C\n  - h\n  - hh\n  - hpp\n  - hxx\n  - h++\n  - inl\n  - ipp\nfirst_line_match: '-\\*- C\\+\\+ -\\*-'\nscope: source.c++\nvariables:\n  identifier: \\b[[:alpha:]_][[:alnum:]_]*\\b # upper and lowercase\n  macro_identifier: \\b[[:upper:]_][[:upper:][:digit:]_]{2,}\\b # only uppercase, at least 3 chars\n  path_lookahead: '(?:::\\s*)?(?:{{identifier}}\\s*::\\s*)*(?:template\\s+)?{{identifier}}'\n  operator_method_name: '\\boperator\\s*(?:[-+*/%^&|~!=<>]|[-+*/%^&|=!<>]=|<<=?|>>=?|&&|\\|\\||\\+\\+|--|,|->\\*?|\\(\\)|\\[\\]|\"\"\\s*{{identifier}})'\n  casts: 'const_cast|dynamic_cast|reinterpret_cast|static_cast'\n  operator_keywords: 'and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|xor|xor_eq|noexcept'\n  control_keywords: 'break|case|catch|continue|default|do|else|for|goto|if|_Pragma|return|switch|throw|try|while'\n  memory_operators: 'new|delete'\n  basic_types: 'asm|__asm__|auto|bool|_Bool|char|_Complex|double|float|_Imaginary|int|long|short|signed|unsigned|void'\n  before_tag: 'struct|union|enum\\s+class|enum\\s+struct|enum|class'\n  declspec: '__declspec\\(\\s*\\w+(?:\\([^)]+\\))?\\s*\\)'\n  storage_classes: 'static|export|extern|friend|explicit|virtual|register|thread_local'\n  type_qualifier: 'const|constexpr|mutable|typename|volatile'\n  compiler_directive: 'inline|restrict|__restrict__|__restrict'\n  visibility_modifiers: 'private|protected|public'\n  other_keywords: 'typedef|nullptr|{{visibility_modifiers}}|static_assert|sizeof|using|typeid|alignof|alignas|namespace|template'\n  modifiers: '{{storage_classes}}|{{type_qualifier}}|{{compiler_directive}}'\n  non_angle_brackets: '(?=<<|<=)'\n\n  regular: '[^(){}&;*^%=<>-]*'\n  paren_open: (?:\\(\n  paren_close: '\\))?'\n  generic_open: (?:<\n  generic_close: '>)?'\n  balance_parentheses: '{{regular}}{{paren_open}}{{regular}}{{paren_close}}{{regular}}'\n  generic_lookahead: <{{regular}}{{generic_open}}{{regular}}{{generic_open}}{{regular}}{{generic_close}}\\s*{{generic_close}}{{balance_parentheses}}>\n\n  data_structures_forward_decl_lookahead: '(\\s+{{macro_identifier}})*\\s*(:\\s*({{path_lookahead}}|{{visibility_modifiers}}|,|\\s|<[^;]*>)+)?;'\n  non_func_keywords: 'if|for|switch|while|decltype|sizeof|__declspec|__attribute__|typeid|alignof|alignas|static_assert'\n\n  format_spec: |-\n    (?x:\n      (?:.? [<>=^])?     # fill align\n      [ +-]?             # sign\n      \\#?                # alternate form\n      # technically, octal and hexadecimal integers are also supported as 'width', but rarely used\n      \\d*                # width\n      ,?                 # thousands separator\n      (?:\\.\\d+)?         # precision\n      [bcdeEfFgGnosxX%]? # type\n    )\n\ncontexts:\n  main:\n    - include: preprocessor-global\n    - include: global\n\n  #############################################################################\n  # Reusable contexts\n  #\n  # The follow contexts are currently constructed to be reused in the\n  # Objetive-C++ syntax. They are specifically constructed to not push into\n  # sub-contexts, which ensures that Objective-C++ code isn't accidentally\n  # lexed as plain C++.\n  #\n  # The \"unique-*\" contexts are additions that C++ makes over C, and thus can\n  # be directly reused in Objective-C++ along with contexts from Objective-C\n  # and C.\n  #############################################################################\n\n  unique-late-expressions:\n    # This is highlighted after all of the other control keywords\n    # to allow operator overloading to be lexed properly\n    - match: \\boperator\\b\n      scope: keyword.control.c++\n\n  unique-modifiers:\n    - match: \\b({{modifiers}})\\b\n      scope: storage.modifier.c++\n\n  unique-variables:\n    - match: \\bthis\\b\n      scope: variable.language.c++\n    # common C++ instance var naming idiom -- fMemberName\n    - match: '\\b(f|m)[[:upper:]]\\w*\\b'\n      scope: variable.other.readwrite.member.c++\n    # common C++ instance var naming idiom -- m_member_name\n    - match: '\\bm_[[:alnum:]_]+\\b'\n      scope: variable.other.readwrite.member.c++\n\n  unique-constants:\n    - match: \\bnullptr\\b\n      scope: constant.language.c++\n\n  unique-keywords:\n    - match: \\busing\\b\n      scope: keyword.control.c++\n    - match: \\bbreak\\b\n      scope: keyword.control.flow.break.c++\n    - match: \\bcontinue\\b\n      scope: keyword.control.flow.continue.c++\n    - match: \\bgoto\\b\n      scope: keyword.control.flow.goto.c++\n    - match: \\breturn\\b\n      scope: keyword.control.flow.return.c++\n    - match: \\bthrow\\b\n      scope: keyword.control.flow.throw.c++\n    - match: \\b({{control_keywords}})\\b\n      scope: keyword.control.c++\n    - match: '\\bdelete\\b(\\s*\\[\\])?|\\bnew\\b(?!])'\n      scope: keyword.control.c++\n    - match: \\b({{operator_keywords}})\\b\n      scope: keyword.operator.word.c++\n\n  unique-types:\n    - match: \\b(char16_t|char32_t|wchar_t|nullptr_t)\\b\n      scope: storage.type.c++\n    - match: \\bclass\\b\n      scope: storage.type.c++\n\n  unique-strings:\n    - match: '((?:L|u8|u|U)?R)(\"([^\\(\\)\\\\ ]{0,16})\\()'\n      captures:\n        1: storage.type.string.c++\n        2: punctuation.definition.string.begin.c++\n      push:\n        - meta_scope: string.quoted.double.c++\n        - match: '\\)\\3\"'\n          scope: punctuation.definition.string.end.c++\n          pop: true\n        - match: '\\{\\{|\\}\\}'\n          scope: constant.character.escape.c++\n        - include: formatting-syntax\n\n  unique-numbers:\n    - match: |-\n        (?x)\n        (?:\n        # floats\n          (?:\n          (?:\\b\\d(?:[\\d']*\\d)?\\.\\d(?:[\\d']*\\d)?|\\B\\.\\d(?:[\\d']*\\d)?)(?:[Ee][+-]?\\d(?:[\\d']*\\d)?)?(?:[fFlL]|(?:i[fl]?|h|min|[mun]?s|_\\w*))?\\b\n          |\n          (?:\\b\\d(?:[\\d']*\\d)?\\.)(?:\\B|(?:[fFlL]|(?:i[fl]?|h|min|[mun]?s|_\\w*))\\b|(?:[Ee][+-]?\\d(?:[\\d']*\\d)?)(?:[fFlL]|(?:i[fl]?|h|min|[mun]?s|_\\w*))?\\b)\n          |\n          \\b\\d(?:[\\d']*\\d)?(?:[Ee][+-]?\\d(?:[\\d']*\\d)?)(?:[fFlL]|(?:i[fl]?|h|min|[mun]?s|_\\w*))?\\b\n          )\n        |\n        # ints\n          \\b(?:\n          (?:\n          # dec\n          [1-9](?:[\\d']*\\d)?\n          |\n          # oct\n          0(?:[0-7']*[0-7])?\n          |\n          # hex\n          0[Xx][\\da-fA-F](?:[\\da-fA-F']*[\\da-fA-F])?\n          |\n          # bin\n          0[Bb][01](?:[01']*[01])?\n          )\n          # int suffixes\n          (?:(?:l{1,2}|L{1,2})[uU]?|[uU](?:l{0,2}|L{0,2})|(?:i[fl]?|h|min|[mun]?s|_\\w*))?)\\b\n        )\n        (?!\\.) # Number must not be followed by a decimal point\n      scope: constant.numeric.c++\n\n  identifiers:\n    - match: '{{identifier}}\\s*(::)\\s*'\n      captures:\n        1: punctuation.accessor.c++\n    - match: '(?:(::)\\s*)?{{identifier}}'\n      captures:\n        1: punctuation.accessor.c++\n\n  function-specifiers:\n    - match: \\b(const|final|noexcept|override)\\b\n      scope: storage.modifier.c++\n\n  #############################################################################\n  # The following are C++-specific contexts that should not be reused. This is\n  # because they push into subcontexts and use variables that are C++-specific.\n  #############################################################################\n\n  ## Common context layout\n\n  global:\n    - match: '(?=\\btemplate\\b)'\n      push:\n        - include: template\n        - match: (?=\\S)\n          set: global-modifier\n    - include: namespace\n    - include: keywords-angle-brackets\n    - match: '(?={{path_lookahead}}\\s*<)'\n      push: global-modifier\n    # Take care of comments just before a function definition.\n    - match: /\\*\n      scope: punctuation.definition.comment.c\n      push:\n        - - match: \\s*(?=\\w)\n            set: global-modifier\n          - match: \"\"\n            pop: true\n        - - meta_scope: comment.block.c\n          - match: \\*/\n            scope: punctuation.definition.comment.c\n            pop: true\n    - include: early-expressions\n    - match: ^\\s*\\b(extern)(?=\\s+\"C(\\+\\+)?\")\n      scope: storage.modifier.c++\n      push:\n        - include: comments\n        - include: strings\n        - match: '\\{'\n          scope: punctuation.section.block.begin.c++\n          set:\n            - meta_scope: meta.extern-c.c++\n            - match: '^\\s*(#\\s*ifdef)\\s*__cplusplus\\s*'\n              scope: meta.preprocessor.c++\n              captures:\n                1: keyword.control.import.c++\n              set:\n                - match: '\\}'\n                  scope: punctuation.section.block.end.c++\n                  pop: true\n                - include: preprocessor-global\n                - include: global\n            - match: '\\}'\n              scope: punctuation.section.block.end.c++\n              pop: true\n            - include: preprocessor-global\n            - include: global\n        - match: (?=\\S)\n          set: global-modifier\n    - match: ^\\s*(?=\\w)\n      push: global-modifier\n    - include: late-expressions\n\n  statements:\n    - include: preprocessor-statements\n    - include: scope:source.c#label\n    - include: expressions\n\n  expressions:\n    - include: early-expressions\n    - include: late-expressions\n\n  early-expressions:\n    - include: early-expressions-before-generic-type\n    - include: generic-type\n    - include: early-expressions-after-generic-type\n\n  early-expressions-before-generic-type:\n    - include: preprocessor-expressions\n    - include: comments\n    - include: case-default\n    - include: typedef\n    - include: keywords-angle-brackets\n    - include: keywords-parens\n    - include: keywords\n    - include: numbers\n    # Prevent a '<' from getting scoped as the start of another template\n    # parameter list, if in reality a less-than-or-equals sign is meant.\n    - match: <=\n      scope: keyword.operator.comparison.c\n\n  early-expressions-after-generic-type:\n    - include: members-arrow\n    - include: operators\n    - include: members-dot\n    - include: strings\n    - include: parens\n    - include: brackets\n    - include: block\n    - include: variables\n    - include: constants\n    - match: ','\n      scope: punctuation.separator.c++\n    - match: '\\)|\\}'\n      scope: invalid.illegal.stray-bracket-end.c++\n\n  expressions-minus-generic-type:\n    - include: early-expressions-before-generic-type\n    - include: angle-brackets\n    - include: early-expressions-after-generic-type\n    - include: late-expressions\n\n  expressions-minus-generic-type-function-call:\n    - include: early-expressions-before-generic-type\n    - include: angle-brackets\n    - include: early-expressions-after-generic-type\n    - include: late-expressions-before-function-call\n    - include: identifiers\n    - match: ';'\n      scope: punctuation.terminator.c++\n\n  late-expressions:\n    - include: late-expressions-before-function-call\n    - include: function-call\n    - include: identifiers\n    - match: ';'\n      scope: punctuation.terminator.c++\n\n  late-expressions-before-function-call:\n    - include: unique-late-expressions\n    - include: modifiers-parens\n    - include: modifiers\n    - include: types\n\n  expressions-minus-function-call:\n    - include: early-expressions\n    - include: late-expressions-before-function-call\n    - include: identifiers\n    - match: ';'\n      scope: punctuation.terminator.c++\n\n  comments:\n    - include: scope:source.c#comments\n\n  operators:\n    - include: scope:source.c#operators\n\n  modifiers:\n    - include: unique-modifiers\n    - include: scope:source.c#modifiers\n\n  variables:\n    - include: unique-variables\n    - include: scope:source.c#variables\n\n  constants:\n    - include: unique-constants\n    - include: scope:source.c#constants\n\n  keywords:\n    - include: unique-keywords\n    - include: scope:source.c#keywords\n\n  types:\n    - include: unique-types\n    - include: types-parens\n    - include: scope:source.c#types\n\n  strings:\n    - include: unique-strings\n    - match: '(L|u8|u|U)?(\")'\n      captures:\n        1: storage.type.string.c++\n        2: punctuation.definition.string.begin.c++\n      push:\n        - meta_scope: string.quoted.double.c++\n        - match: '\"'\n          scope: punctuation.definition.string.end.c++\n          pop: true\n        - include: scope:source.c#string_escaped_char\n        - match: |-\n            (?x)%\n              (\\d+\\$)?                                      # field (argument #)\n              [#0\\- +']*                                    # flags\n              [,;:_]?                                       # separator character (AltiVec)\n              ((-?\\d+)|\\*(-?\\d+\\$)?)?                       # minimum field width\n              (\\.((-?\\d+)|\\*(-?\\d+\\$)?)?)?                  # precision\n              (hh|h|ll|l|j|t|z|q|L|vh|vl|v|hv|hl)?          # length modifier\n              (\\[[^\\]]+\\]|[am]s|[diouxXDOUeEfFgGaACcSspn%]) # conversion type\n          scope: constant.other.placeholder.c++\n        - match: '\\{\\{|\\}\\}'\n          scope: constant.character.escape.c++\n        - include: formatting-syntax\n    - include: scope:source.c#strings\n\n  formatting-syntax:\n    # https://docs.python.org/3.6/library/string.html#formatstrings\n    - match: |- # simple form\n        (?x)\n        (\\{)\n          (?: [\\w.\\[\\]]+)?             # field_name\n          (   ! [ars])?                # conversion\n          (   : (?:{{format_spec}}|    # format_spec OR\n                   [^}%]*%.[^}]*)      # any format-like string\n          )?\n        (\\})\n      scope: constant.other.placeholder.c++\n      captures:\n        1: punctuation.definition.placeholder.begin.c++\n        2: storage.modifier.c++onversion.c++\n        3: constant.other.format-spec.c++\n        4: punctuation.definition.placeholder.end.c++\n    - match: \\{(?=[^\\}\"']+\\{[^\"']*\\}) # complex (nested) form\n      scope: punctuation.definition.placeholder.begin.c++\n      push:\n        - meta_scope: constant.other.placeholder.c++\n        - match: \\}\n          scope: punctuation.definition.placeholder.end.c++\n          pop: true\n        - match: '[\\w.\\[\\]]+'\n        - match: '![ars]'\n          scope: storage.modifier.conversion.c++\n        - match: ':'\n          push:\n            - meta_scope: meta.format-spec.c++ constant.other.format-spec.c++\n            - match: (?=\\})\n              pop: true\n            - include: formatting-syntax\n\n  numbers:\n    - include: unique-numbers\n    - include: scope:source.c#numbers\n\n  ## C++-specific contexts\n\n  case-default:\n    - match: '\\b(default|case)\\b'\n      scope: keyword.control.c++\n      push:\n        - match: (?=[);,])\n          pop: true\n        - match: ':'\n          scope: punctuation.separator.c++\n          pop: true\n        - include: expressions\n\n  modifiers-parens:\n    - match: '\\b(alignas)\\b\\s*(\\()'\n      captures:\n        1: storage.modifier.c++\n        2: meta.group.c++ punctuation.section.group.begin.c++\n      push:\n        - meta_content_scope: meta.group.c++\n        - match: '\\)'\n          scope: meta.group.c++ punctuation.section.group.end.c++\n          pop: true\n        - include: expressions\n    - match: \\b(__attribute__)\\s*(\\(\\()\n      captures:\n        1: storage.modifier.c++\n        2: meta.group.c++ punctuation.section.group.begin.c++\n      push :\n        - meta_scope: meta.attribute.c++\n        - meta_content_scope: meta.group.c++\n        - include: parens\n        - include: strings\n        - match: \\)\\)\n          scope: meta.group.c++ punctuation.section.group.end.c++\n          pop: true\n    - match: \\b(__declspec)(\\()\n      captures:\n        1: storage.modifier.c++\n        2: meta.group.c++ punctuation.section.group.begin.c++\n      push:\n        - meta_content_scope: meta.group.c++\n        - match: '\\)'\n          scope: meta.group.c++ punctuation.section.group.end.c++\n          pop: true\n        - match: '\\b(align|allocate|code_seg|deprecated|property|uuid)\\b\\s*(\\()'\n          captures:\n            1: storage.modifier.c++\n            2: meta.group.c++ punctuation.section.group.begin.c++\n          push:\n            - meta_content_scope: meta.group.c++\n            - match: '\\)'\n              scope: meta.group.c++ punctuation.section.group.end.c++\n              pop: true\n            - include: numbers\n            - include: strings\n            - match: \\b(get|put)\\b\n              scope: variable.parameter.c++\n            - match: ','\n              scope: punctuation.separator.c++\n            - match: '='\n              scope: keyword.operator.assignment.c++\n        - match: '\\b(appdomain|deprecated|dllimport|dllexport|jintrinsic|naked|noalias|noinline|noreturn|nothrow|novtable|process|restrict|safebuffers|selectany|thread)\\b'\n          scope: constant.other.c++\n\n  types-parens:\n    - match: '\\b(decltype)\\b\\s*(\\()'\n      captures:\n        1: storage.type.c++\n        2: meta.group.c++ punctuation.section.group.begin.c++\n      push:\n        - meta_content_scope: meta.group.c++\n        - match: '\\)'\n          scope: meta.group.c++ punctuation.section.group.end.c++\n          pop: true\n        - include: expressions\n\n  keywords-angle-brackets:\n    - match: \\b({{casts}})\\b\\s*\n      scope: keyword.operator.word.cast.c++\n      push:\n        - match: '>'\n          scope: punctuation.section.generic.end.c++\n          pop: true\n        - match: '<'\n          scope: punctuation.section.generic.begin.c++\n          push:\n            - match: '(?=>)'\n              pop: true\n            - include: expressions-minus-generic-type-function-call\n\n  keywords-parens:\n    - match: '\\b(alignof|typeid|static_assert|sizeof)\\b\\s*(\\()'\n      captures:\n        1: keyword.operator.word.c++\n        2: meta.group.c++ punctuation.section.group.begin.c++\n      push:\n        - meta_content_scope: meta.group.c++\n        - match: '\\)'\n          scope: meta.group.c++ punctuation.section.group.end.c++\n          pop: true\n        - include: expressions\n\n  namespace:\n    - match: '\\b(using)\\s+(namespace)\\s+(?={{path_lookahead}})'\n      captures:\n        1: keyword.control.c++\n        2: keyword.control.c++\n      push:\n        - include: identifiers\n        - match: ''\n          pop: true\n    - match: '\\b(namespace)\\s+(?=({{path_lookahead}})?(?!\\s*[;,]))'\n      scope: meta.namespace.c++\n      captures:\n        1: keyword.control.c++\n      push:\n        - meta_content_scope: meta.namespace.c++ entity.name.namespace.c++\n        - include: identifiers\n        - match: ''\n          set:\n            - meta_scope: meta.namespace.c++\n            - include: comments\n            - match: '='\n              scope: keyword.operator.alias.c++\n            - match: '(?=;)'\n              pop: true\n            - match: '\\}'\n              scope: meta.block.c++ punctuation.section.block.end.c++\n              pop: true\n            - match: '\\{'\n              scope: punctuation.section.block.begin.c++\n              push:\n                - meta_scope: meta.block.c++\n                - match: '(?=\\})'\n                  pop: true\n                - include: preprocessor-global\n                - include: global\n            - include: expressions\n\n  template-common:\n    # Exit the template scope if we hit some basic invalid characters. This\n    # helps when a user is in the middle of typing their template types and\n    # prevents re-highlighting the whole file until the next > is found.\n    - match: (?=[{};])\n      pop: true\n    - include: expressions\n\n  template:\n    - match: \\btemplate\\b\n      scope: storage.type.template.c++\n      push:\n        - meta_scope: meta.template.c++\n        # Explicitly include comments here at the top, in order to NOT match the\n        # \\S lookahead in the case of comments.\n        - include: comments\n        - match: <\n          scope: punctuation.section.generic.begin.c++\n          set:\n            - meta_content_scope: meta.template.c++\n            - match: '>'\n              scope: meta.template.c++ punctuation.section.generic.end.c++\n              pop: true\n            - match: \\.{3}\n              scope: keyword.operator.variadic.c++\n            - match: \\b(typename|{{before_tag}})\\b\n              scope: storage.type.c++\n            - include: template # include template here for nested templates\n            - include: template-common\n        - match: (?=\\S)\n          set:\n            - meta_content_scope: meta.template.c++\n            - match: \\b({{before_tag}})\\b\n              scope: storage.type.c++\n            - include: template-common\n\n  generic-type:\n    - match: '(?=(?!template){{path_lookahead}}\\s*{{generic_lookahead}}\\s*\\()'\n      push:\n        - meta_scope: meta.function-call.c++\n        - match: \\btemplate\\b\n          scope: storage.type.template.c++\n        - match: '(?:(::)\\s*)?{{identifier}}\\s*(::)\\s*'\n          captures:\n            1: punctuation.accessor.double-colon.c++\n            2: punctuation.accessor.double-colon.c++\n        - match: (?:(::)\\s*)?({{identifier}})\\s*(<)\n          captures:\n            1: punctuation.accessor.double-colon.c++\n            2: variable.function.c++\n            3: punctuation.section.generic.begin.c++\n          push:\n            - match: '>'\n              scope: punctuation.section.generic.end.c++\n              pop: true\n            - include: expressions-minus-generic-type-function-call\n        - match: (?:(::)\\s*)?({{identifier}})\\s*(\\()\n          captures:\n            1: punctuation.accessor.double-colon.c++\n            2: variable.function.c++\n            3: punctuation.section.group.begin.c++\n          set:\n            - meta_scope: meta.function-call.c++\n            - meta_content_scope: meta.group.c++\n            - match: '\\)'\n              scope: meta.group.c++ punctuation.section.group.end.c++\n              pop: true\n            - include: expressions\n        - include: angle-brackets\n        - match: '\\('\n          scope: meta.group.c++ punctuation.section.group.begin.c++\n          set:\n            - meta_scope: meta.function-call.c++\n            - meta_content_scope: meta.group.c++\n            - match: '\\)'\n              scope: meta.group.c++ punctuation.section.group.end.c++\n              pop: true\n            - include: expressions\n    - match: '(?=(?!template){{path_lookahead}}\\s*{{generic_lookahead}})'\n      push:\n        - include: identifiers\n        - match: '<'\n          scope: punctuation.section.generic.begin.c++\n          set:\n            - match: '>'\n              scope: punctuation.section.generic.end.c++\n              pop: true\n            - include: expressions-minus-generic-type-function-call\n\n  angle-brackets:\n    - match: '<(?!<)'\n      scope: punctuation.section.generic.begin.c++\n      push:\n        - match: '>'\n          scope: punctuation.section.generic.end.c++\n          pop: true\n        - include: expressions-minus-generic-type-function-call\n\n  block:\n    - match: '\\{'\n      scope: punctuation.section.block.begin.c++\n      push:\n        - meta_scope: meta.block.c++\n        - match: (?=^\\s*#\\s*(elif|else|endif)\\b)\n          pop: true\n        - match: '\\}'\n          scope: punctuation.section.block.end.c++\n          pop: true\n        - include: statements\n\n  function-call:\n    - match: (?={{path_lookahead}}\\s*\\()\n      push:\n        - meta_scope: meta.function-call.c++\n        - include: scope:source.c#c99\n        - match: '(?:(::)\\s*)?{{identifier}}\\s*(::)\\s*'\n          scope: variable.function.c++\n          captures:\n            1: punctuation.accessor.c++\n            2: punctuation.accessor.c++\n        - match: '(?:(::)\\s*)?{{identifier}}'\n          scope: variable.function.c++\n          captures:\n            1: punctuation.accessor.c++\n        - match: '\\('\n          scope: meta.group.c++ punctuation.section.group.begin.c++\n          set:\n            - meta_content_scope: meta.function-call.c++ meta.group.c++\n            - match: '\\)'\n              scope: meta.function-call.c++ meta.group.c++ punctuation.section.group.end.c++\n              pop: true\n            - include: expressions\n\n  members-inside-function-call:\n    - meta_content_scope: meta.method-call.c++ meta.group.c++\n    - match: \\)\n      scope: meta.method-call.c++ meta.group.c++ punctuation.section.group.end.c++\n      pop: true\n    - include: expressions\n\n  members-after-accessor-junction:\n    # After we've seen an accessor (dot or arrow), this context decides what\n    # kind of entity we're accessing.\n    - include: comments\n    - match: \\btemplate\\b\n      scope: meta.method-call.c++ storage.type.template.c++\n      # Guaranteed to be a template member function call after we match this\n      set:\n        - meta_content_scope: meta.method-call.c++\n        - include: comments\n        - match: '{{identifier}}'\n          scope: variable.function.member.c++\n          set:\n            - meta_content_scope: meta.method-call.c++\n            - match: \\(\n              scope: meta.group.c++ punctuation.section.group.begin.c++\n              set: members-inside-function-call\n            - include: comments\n            - include: angle-brackets\n            - match: (?=\\S) # safety pop\n              pop: true\n        - match: (?=\\S) # safety pop\n          pop: true\n    # Operator overloading\n    - match: '({{operator_method_name}})\\s*(\\()'\n      captures:\n        0: meta.method-call.c++\n        1: variable.function.member.c++\n        2: meta.group.c++ punctuation.section.group.begin.c++\n      set: members-inside-function-call\n    # Non-templated member function call\n    - match: (~?{{identifier}})\\s*(\\()\n      captures:\n        0: meta.method-call.c++\n        1: variable.function.member.c++\n        2: meta.group.c++ punctuation.section.group.begin.c++\n      set: members-inside-function-call\n    # Templated member function call\n    - match: (~?{{identifier}})\\s*(?={{generic_lookahead}})\n      captures:\n        1: variable.function.member.c++\n      set:\n        - meta_scope: meta.method-call.c++\n        - match: <\n          scope: punctuation.section.generic.begin.c++\n          set:\n            - meta_content_scope: meta.method-call.c++\n            - match: '>'\n              scope: punctuation.section.generic.end.c++\n              set:\n                - meta_content_scope: meta.method-call.c++\n                - include: comments\n                - match: \\(\n                  scope: punctuation.section.group.begin.c++\n                  set: members-inside-function-call\n                - match: (?=\\S) # safety pop\n                  pop: true\n            - include: expressions\n    # Explicit base-class access\n    - match: ({{identifier}})\\s*(::)\n      captures:\n        1: variable.other.base-class.c++\n        2: punctuation.accessor.double-colon.c++\n      set: members-after-accessor-junction # reset\n    # Just a regular member variable\n    - match: '{{identifier}}'\n      scope: variable.other.readwrite.member.c++\n      pop: true\n\n  members-dot:\n    - include: scope:source.c#access-illegal\n    # No lookahead required because members-dot goes after operators in the\n    # early-expressions-after-generic-type context. This means triple dots\n    # (i.e. \"...\" or \"variadic\") is attempted first.\n    - match: \\.\n      scope: punctuation.accessor.dot.c++\n      push: members-after-accessor-junction\n\n  members-arrow:\n    # This needs to be before operators in the\n    # early-expressions-after-generic-type context because otherwise the \"->\"\n    # from the C language will match.\n    - match: ->\n      scope: punctuation.accessor.arrow.c++\n      push: members-after-accessor-junction\n\n  typedef:\n    - match: \\btypedef\\b\n      scope: storage.type.c++\n      push:\n        - match: ({{identifier}})?\\s*(?=;)\n          captures:\n            1: entity.name.type.typedef.c++\n          pop: true\n        - match: \\b(struct)\\s+({{identifier}})\\b\n          captures:\n            1: storage.type.c++\n        - include: expressions-minus-generic-type\n\n  parens:\n    - match: \\(\n      scope: punctuation.section.group.begin.c++\n      push:\n        - meta_scope: meta.group.c++\n        - match: \\)\n          scope: punctuation.section.group.end.c++\n          pop: true\n        - include: expressions\n\n  brackets:\n    - match: \\[\n      scope: punctuation.section.brackets.begin.c++\n      push:\n        - meta_scope: meta.brackets.c++\n        - match: \\]\n          scope: punctuation.section.brackets.end.c++\n          pop: true\n        - include: expressions\n\n  function-trailing-return-type:\n    - match: '{{non_angle_brackets}}'\n      pop: true\n    - include: angle-brackets\n    - include: types\n    - include: modifiers-parens\n    - include: modifiers\n    - include: identifiers\n    - match: \\*|&\n      scope: keyword.operator.c++\n    - include: function-trailing-return-type-parens\n    - match: '(?=\\S)'\n      pop: true\n\n  function-trailing-return-type-parens:\n    - match: \\(\n      scope: punctuation.section.group.begin.c++\n      push:\n        - meta_scope: meta.group.c++\n        - match: \\)\n          scope: punctuation.section.group.end.c++\n          pop: true\n        - include: function-trailing-return-type\n\n  ## Detection of function and data structure definitions at the global level\n\n  global-modifier:\n    - include: comments\n    - include: modifiers-parens\n    - include: modifiers\n    # Constructors and destructors don't have a type\n    - match: '(?={{path_lookahead}}\\s*::\\s*{{identifier}}\\s*(\\(|$))'\n      set:\n        - meta_content_scope: meta.function.c++ entity.name.function.constructor.c++\n        - include: identifiers\n        - match: '(?=[^\\w\\s])'\n          set: function-definition-params\n    - match: '(?={{path_lookahead}}\\s*::\\s*~{{identifier}}\\s*(\\(|$))'\n      set:\n        - meta_content_scope: meta.function.c++ entity.name.function.destructor.c++\n        - include: identifiers\n        - match: '~{{identifier}}'\n        - match: '(?=[^\\w\\s])'\n          set: function-definition-params\n    # If we see a path ending in :: before a newline, we don't know if it is\n    # a constructor or destructor, or a long return type, so we are just going\n    # to treat it like a regular function. Most likely it is a constructor,\n    # since it doesn't seem most developers would create such a long typename.\n    - match: '(?={{path_lookahead}}\\s*::\\s*$)'\n      set:\n        - meta_content_scope: meta.function.c++ entity.name.function.c++\n        - include: identifiers\n        - match: '~{{identifier}}'\n        - match: '(?=[^\\w\\s])'\n          set: function-definition-params\n    - include: unique-strings\n    - match: '(?=\\S)'\n      set: global-type\n\n  global-type:\n    - include: comments\n    - match: \\*|&\n      scope: keyword.operator.c++\n    - match: '(?=\\b({{control_keywords}}|{{operator_keywords}}|{{casts}}|{{memory_operators}}|{{other_keywords}}|operator)\\b)'\n      pop: true\n    - match: '(?=\\s)'\n      set: global-maybe-function\n    # If a class/struct/enum followed by a name that is not a macro or declspec\n    # then this is likely a return type of a function. This is uncommon.\n    - match: |-\n        (?x:\n          ({{before_tag}})\n          \\s+\n          (?=\n            (?![[:upper:][:digit:]_]+\\b|__declspec|{{before_tag}})\n            {{path_lookahead}}\n            (\\s+{{identifier}}\\s*\\(|\\s*[*&])\n          )\n        )\n      captures:\n        1: storage.type.c++\n      set:\n        - include: identifiers\n        - match: ''\n          set: global-maybe-function\n    # The previous match handles return types of struct/enum/etc from a func,\n    # there this one exits the context to allow matching an actual struct/class\n    - match: '(?=\\b({{before_tag}})\\b)'\n      set: data-structures\n    - match: '(?=\\b({{casts}})\\b\\s*<)'\n      pop: true\n    - match: '{{non_angle_brackets}}'\n      pop: true\n    - include: angle-brackets\n    - include: types\n    # Allow a macro call\n    - match: '({{identifier}})\\s*(\\()(?=[^\\)]+\\))'\n      captures:\n        1: variable.function.c++\n        2: meta.group.c++ punctuation.section.group.begin.c++\n      push:\n        - meta_scope: meta.function-call.c++\n        - meta_content_scope: meta.group.c++\n        - match: '\\)'\n          scope: meta.group.c++ punctuation.section.group.end.c++\n          pop: true\n        - include: expressions\n    - match: '(?={{path_lookahead}}\\s*\\()'\n      set:\n        - include: function-call\n        - match: ''\n          pop: true\n    - include: variables\n    - include: constants\n    - include: identifiers\n    - match: (?=\\W)\n      pop: true\n\n  global-maybe-function:\n    - include: comments\n    # Consume pointer info, macros and any type info that was offset by macros\n    - match: \\*|&\n      scope: keyword.operator.c++\n    - match: '(?=\\b({{control_keywords}}|{{operator_keywords}}|{{casts}}|{{memory_operators}}|{{other_keywords}})\\b)'\n      pop: true\n    - match: '\\b({{type_qualifier}})\\b'\n      scope: storage.modifier.c++\n    - match: '{{non_angle_brackets}}'\n      pop: true\n    - include: angle-brackets\n    - include: types\n    - include: modifiers-parens\n    - include: modifiers\n    # All uppercase identifier just before a newline is most likely a macro\n    - match: '[[:upper:][:digit:]_]+\\s*$'\n    # Operator overloading\n    - match: '(?=({{path_lookahead}}\\s*(?:{{generic_lookahead}})?::\\s*)?{{operator_method_name}}\\s*(\\(|$))'\n      set:\n        - meta_content_scope: meta.function.c++ entity.name.function.c++\n        - include: identifiers\n        - match: '(?=\\s*(\\(|$))'\n          set: function-definition-params\n    # Identifier that is not the function name - likely a macro or type\n    - match: '(?={{path_lookahead}}([ \\t]+|[*&])(?!\\s*(<|::|\\(|$)))'\n      push:\n        - include: identifiers\n        - match: ''\n          pop: true\n    # Real function definition\n    - match: '(?={{path_lookahead}}({{generic_lookahead}}({{path_lookahead}})?)\\s*(\\(|$))'\n      set: [function-definition-params, global-function-identifier-generic]\n    - match: '(?={{path_lookahead}}\\s*(\\(|$))'\n      set: [function-definition-params, global-function-identifier]\n    - match: '(?={{path_lookahead}}\\s*::\\s*$)'\n      set: [function-definition-params, global-function-identifier]\n    - match: '(?=\\S)'\n      pop: true\n\n  global-function-identifier-generic:\n    - include: angle-brackets\n    - match: '::'\n      scope: punctuation.accessor.c++\n    - match: '(?={{identifier}}<.*>\\s*\\()'\n      push:\n        - meta_content_scope: entity.name.function.c++\n        - include: identifiers\n        - match: '(?=<)'\n          pop: true\n    - match: '(?={{identifier}}\\s*\\()'\n      push:\n        - meta_content_scope: entity.name.function.c++\n        - include: identifiers\n        - match: ''\n          pop: true\n    - match: '(?=\\()'\n      pop: true\n\n  global-function-identifier:\n    - meta_content_scope: entity.name.function.c++\n    - include: identifiers\n    - match: '(?=\\S)'\n      pop: true\n\n  function-definition-params:\n    - meta_content_scope: meta.function.c++\n    - include: comments\n    - match: '(?=\\()'\n      set:\n        - match: \\(\n          scope: meta.function.parameters.c++ meta.group.c++ punctuation.section.group.begin.c++\n          set:\n            - meta_content_scope: meta.function.parameters.c++ meta.group.c++\n            - match : \\)\n              scope: punctuation.section.group.end.c++\n              set: function-definition-continue\n            - match: '\\bvoid\\b'\n              scope: storage.type.c++\n            - match: '{{identifier}}(?=\\s*(\\[|,|\\)|=))'\n              scope: variable.parameter.c++\n            - match: '='\n              scope: keyword.operator.assignment.c++\n              push:\n                - match: '(?=,|\\))'\n                  pop: true\n                - include: expressions-minus-generic-type\n                - include: scope:source.c#preprocessor-line-continuation\n            - include: expressions-minus-generic-type\n            - include: scope:source.c#preprocessor-line-continuation\n    - match: (?=\\S)\n      pop: true\n\n  function-definition-continue:\n    - meta_content_scope: meta.function.c++\n    - include: comments\n    - match: '(?=;)'\n      pop: true\n    - match: '->'\n      scope: punctuation.separator.c++\n      set: function-definition-trailing-return\n    - include: function-specifiers\n    - match: '='\n      scope: keyword.operator.assignment.c++\n    - match: '&'\n      scope: keyword.operator.c++\n    - match: \\b0\\b\n      scope: constant.numeric.c++\n    - match: \\b(default|delete)\\b\n      scope: storage.modifier.c++\n    - match: '(?=\\{)'\n      set: function-definition-body\n    - match: '(?=\\S)'\n      pop: true\n\n  function-definition-trailing-return:\n    - include: comments\n    - match: '(?=;)'\n      pop: true\n    - match: '(?=\\{)'\n      set: function-definition-body\n    - include: function-specifiers\n    - include: function-trailing-return-type\n\n  function-definition-body:\n    - meta_content_scope: meta.function.c++ meta.block.c++\n    - match: '\\{'\n      scope: punctuation.section.block.begin.c++\n      set:\n        - meta_content_scope: meta.function.c++ meta.block.c++\n        - match: '\\}'\n          scope: meta.function.c++ meta.block.c++ punctuation.section.block.end.c++\n          pop: true\n        - match: (?=^\\s*#\\s*(elif|else|endif)\\b)\n          pop: true\n        - match: '(?=({{before_tag}})([^(;]+$|.*\\{))'\n          push: data-structures\n        - include: statements\n\n  ## Data structures including classes, structs, unions and enums\n\n  data-structures:\n    - match: '\\bclass\\b'\n      scope: storage.type.c++\n      set: data-structures-class-definition\n    # Detect variable type definitions using struct/enum/union followed by a tag\n    - match: '\\b({{before_tag}})(?=\\s+{{path_lookahead}}\\s+{{path_lookahead}}\\s*[=;\\[])'\n      scope: storage.type.c++\n    - match: '\\bstruct\\b'\n      scope: storage.type.c++\n      set: data-structures-struct-definition\n    - match: '\\benum(\\s+(class|struct))?\\b'\n      scope: storage.type.c++\n      set: data-structures-enum-definition\n    - match: '\\bunion\\b'\n      scope: storage.type.c++\n      set: data-structures-union-definition\n    - match: '(?=\\S)'\n      pop: true\n\n  preprocessor-workaround-eat-macro-before-identifier:\n    # Handle macros so they aren't matched as the class name\n    - match: ({{macro_identifier}})(?=\\s+~?{{identifier}})\n      captures:\n        1: meta.assumed-macro.c\n\n  data-structures-class-definition:\n    - meta_scope: meta.class.c++\n    - include: data-structures-definition-common-begin\n    - match: '{{identifier}}(?={{data_structures_forward_decl_lookahead}})'\n      scope: entity.name.class.forward-decl.c++\n      set: data-structures-class-definition-after-identifier\n    - match: '{{identifier}}'\n      scope: entity.name.class.c++\n      set: data-structures-class-definition-after-identifier\n    - match: '(?=[:{])'\n      set: data-structures-class-definition-after-identifier\n    - match: '(?=;)'\n      pop: true\n\n  data-structures-class-definition-after-identifier:\n    - meta_content_scope: meta.class.c++\n    - include: data-structures-definition-common-begin\n    # No matching of identifiers since they should all be macros at this point\n    - include: data-structures-definition-common-end\n    - match: '\\{'\n      scope: meta.block.c++ punctuation.section.block.begin.c++\n      set:\n        - meta_content_scope: meta.class.c++ meta.block.c++\n        - match: '\\}'\n          scope: meta.class.c++ meta.block.c++ punctuation.section.block.end.c++\n          pop: true\n        - include: data-structures-body\n\n  data-structures-struct-definition:\n    - meta_scope: meta.struct.c++\n    - include: data-structures-definition-common-begin\n    - match: '{{identifier}}(?={{data_structures_forward_decl_lookahead}})'\n      scope: entity.name.struct.forward-decl.c++\n      set: data-structures-struct-definition-after-identifier\n    - match: '{{identifier}}'\n      scope: entity.name.struct.c++\n      set: data-structures-struct-definition-after-identifier\n    - match: '(?=[:{])'\n      set: data-structures-struct-definition-after-identifier\n    - match: '(?=;)'\n      pop: true\n\n  data-structures-struct-definition-after-identifier:\n    - meta_content_scope: meta.struct.c++\n    - include: data-structures-definition-common-begin\n    # No matching of identifiers since they should all be macros at this point\n    - include: data-structures-definition-common-end\n    - match: '\\{'\n      scope: meta.block.c++ punctuation.section.block.begin.c++\n      set:\n        - meta_content_scope: meta.struct.c++ meta.block.c++\n        - match: '\\}'\n          scope: meta.struct.c++ meta.block.c++ punctuation.section.block.end.c++\n          pop: true\n        - include: data-structures-body\n\n  data-structures-enum-definition:\n    - meta_scope: meta.enum.c++\n    - include: data-structures-definition-common-begin\n    - match: '{{identifier}}(?={{data_structures_forward_decl_lookahead}})'\n      scope: entity.name.enum.forward-decl.c++\n      set: data-structures-enum-definition-after-identifier\n    - match: '{{identifier}}'\n      scope: entity.name.enum.c++\n      set: data-structures-enum-definition-after-identifier\n    - match: '(?=[:{])'\n      set: data-structures-enum-definition-after-identifier\n    - match: '(?=;)'\n      pop: true\n\n  data-structures-enum-definition-after-identifier:\n    - meta_content_scope: meta.enum.c++\n    - include: data-structures-definition-common-begin\n    # No matching of identifiers since they should all be macros at this point\n    - include: data-structures-definition-common-end\n    - match: '\\{'\n      scope: meta.block.c++ punctuation.section.block.begin.c++\n      set:\n        - meta_content_scope: meta.enum.c++ meta.block.c++\n        # Enums don't support methods so we have a simplified body\n        - match: '\\}'\n          scope: meta.enum.c++ meta.block.c++ punctuation.section.block.end.c++\n          pop: true\n        - include: statements\n\n  data-structures-union-definition:\n    - meta_scope: meta.union.c++\n    - include: data-structures-definition-common-begin\n    - match: '{{identifier}}(?={{data_structures_forward_decl_lookahead}})'\n      scope: entity.name.union.forward-decl.c++\n      set: data-structures-union-definition-after-identifier\n    - match: '{{identifier}}'\n      scope: entity.name.union.c++\n      set: data-structures-union-definition-after-identifier\n    - match: '(?=[{])'\n      set: data-structures-union-definition-after-identifier\n    - match: '(?=;)'\n      pop: true\n\n  data-structures-union-definition-after-identifier:\n    - meta_content_scope: meta.union.c++\n    - include: data-structures-definition-common-begin\n    # No matching of identifiers since they should all be macros at this point\n    # Unions don't support base classes\n    - include: angle-brackets\n    - match: '\\{'\n      scope: meta.block.c++ punctuation.section.block.begin.c++\n      set:\n        - meta_content_scope: meta.union.c++ meta.block.c++\n        - match: '\\}'\n          scope: meta.union.c++ meta.block.c++ punctuation.section.block.end.c++\n          pop: true\n        - include: data-structures-body\n    - match: '(?=;)'\n      pop: true\n\n  data-structures-definition-common-begin:\n    - include: comments\n    - match: '(?=\\b(?:{{before_tag}}|{{control_keywords}})\\b)'\n      pop: true\n    - include: preprocessor-other\n    - include: modifiers-parens\n    - include: modifiers\n    - include: preprocessor-workaround-eat-macro-before-identifier\n\n  data-structures-definition-common-end:\n    - include: angle-brackets\n    - match: \\bfinal\\b\n      scope: storage.modifier.c++\n    - match: ':'\n      scope: punctuation.separator.c++\n      push:\n        - include: comments\n        - include: preprocessor-other\n        - include: modifiers-parens\n        - include: modifiers\n        - match: '\\b(virtual|{{visibility_modifiers}})\\b'\n          scope: storage.modifier.c++\n        - match: (?={{path_lookahead}})\n          push:\n            - meta_scope: entity.other.inherited-class.c++\n            - include: identifiers\n            - match: ''\n              pop: true\n        - include: angle-brackets\n        - match: ','\n          scope: punctuation.separator.c++\n        - match: (?=\\{|;)\n          pop: true\n    - match: '(?=;)'\n      pop: true\n\n  data-structures-body:\n    - include: preprocessor-data-structures\n    - match: '(?=\\btemplate\\b)'\n      push:\n        - include: template\n        - match: (?=\\S)\n          set: data-structures-modifier\n    - include: typedef\n    - match: \\b({{visibility_modifiers}})\\s*(:)(?!:)\n      captures:\n        1: storage.modifier.c++\n        2: punctuation.section.class.c++\n    - match: '^\\s*(?=(?:~?\\w+|::))'\n      push: data-structures-modifier\n    - include: expressions-minus-generic-type\n\n  data-structures-modifier:\n    - match: '\\bfriend\\b'\n      scope: storage.modifier.c++\n      push:\n        - match: (?=;)\n          pop: true\n        - match: '\\{'\n          scope: punctuation.section.block.begin.c++\n          set:\n            - meta_scope: meta.block.c++\n            - match: '\\}'\n              scope: punctuation.section.block.end.c++\n              pop: true\n            - include: statements\n        - match: '\\b({{before_tag}})\\b'\n          scope: storage.type.c++\n        - include: expressions-minus-function-call\n    - include: comments\n    - include: modifiers-parens\n    - include: modifiers\n    - match: '\\bstatic_assert(?=\\s*\\()'\n      scope: meta.static-assert.c++ keyword.operator.word.c++\n      push:\n        - match: '\\('\n          scope: meta.group.c++ punctuation.section.group.begin.c++\n          set:\n            - meta_content_scope: meta.function-call.c++ meta.group.c++\n            - match: '\\)'\n              scope: meta.function-call.c++ meta.group.c++ punctuation.section.group.end.c++\n              pop: true\n            - include: expressions\n    # Destructor\n    - match: '(?:{{identifier}}\\s*(::)\\s*)?~{{identifier}}(?=\\s*(\\(|$))'\n      scope: meta.method.destructor.c++ entity.name.function.destructor.c++\n      captures:\n        1: punctuation.accessor.c++\n      set: method-definition-params\n    # It's a macro, not a constructor if there is no type in the first param\n    - match: '({{identifier}})\\s*(\\()(?=\\s*(?!void){{identifier}}\\s*[),])'\n      captures:\n        1: variable.function.c++\n        2: meta.group.c++ punctuation.section.group.begin.c++\n      push:\n        - meta_scope: meta.function-call.c++\n        - meta_content_scope: meta.group.c++\n        - match: '\\)'\n          scope: meta.group.c++ punctuation.section.group.end.c++\n          pop: true\n        - include: expressions\n    # Constructor\n    - include: preprocessor-workaround-eat-macro-before-identifier\n    - match: '((?!{{before_tag}}|template){{identifier}})(?=\\s*\\()'\n      scope: meta.method.constructor.c++ entity.name.function.constructor.c++\n      set: method-definition-params\n    # Long form constructor\n    - match: '({{identifier}}\\s*(::)\\s*{{identifier}})(?=\\s*\\()'\n      captures:\n        1: meta.method.constructor.c++ entity.name.function.constructor.c++\n        2: punctuation.accessor.c++\n      push: method-definition-params\n    - match: '(?=\\S)'\n      set: data-structures-type\n\n  data-structures-type:\n    - include: comments\n    - match: \\*|&\n      scope: keyword.operator.c++\n      # Cast methods\n    - match: '(operator)\\s+({{identifier}})(?=\\s*(\\(|$))'\n      captures:\n        1: keyword.control.c++\n        2: meta.method.c++ entity.name.function.c++\n      set: method-definition-params\n    - match: '(?=\\b({{control_keywords}}|{{operator_keywords}}|{{casts}}|{{memory_operators}}|{{other_keywords}}|operator)\\b)'\n      pop: true\n    - match: '(?=\\s)'\n      set: data-structures-maybe-method\n    # If a class/struct/enum followed by a name that is not a macro or declspec\n    # then this is likely a return type of a function. This is uncommon.\n    - match: |-\n        (?x:\n          ({{before_tag}})\n          \\s+\n          (?=\n            (?![[:upper:][:digit:]_]+\\b|__declspec|{{before_tag}})\n            {{path_lookahead}}\n            (\\s+{{identifier}}\\s*\\(|\\s*[*&])\n          )\n        )\n      captures:\n        1: storage.type.c++\n      set:\n        - include: identifiers\n        - match: ''\n          set: data-structures-maybe-method\n    # The previous match handles return types of struct/enum/etc from a func,\n    # there this one exits the context to allow matching an actual struct/class\n    - match: '(?=\\b({{before_tag}})\\b)'\n      set: data-structures\n    - match: '(?=\\b({{casts}})\\b\\s*<)'\n      pop: true\n    - match: '{{non_angle_brackets}}'\n      pop: true\n    - include: angle-brackets\n    - include: types\n    - include: variables\n    - include: constants\n    - include: identifiers\n    - match: (?=[&*])\n      set: data-structures-maybe-method\n    - match: (?=\\W)\n      pop: true\n\n  data-structures-maybe-method:\n    - include: comments\n    # Consume pointer info, macros and any type info that was offset by macros\n    - match: \\*|&\n      scope: keyword.operator.c++\n    - match: '(?=\\b({{control_keywords}}|{{operator_keywords}}|{{casts}}|{{memory_operators}}|{{other_keywords}})\\b)'\n      pop: true\n    - match: '\\b({{type_qualifier}})\\b'\n      scope: storage.modifier.c++\n    - match: '{{non_angle_brackets}}'\n      pop: true\n    - include: angle-brackets\n    - include: types\n    - include: modifiers-parens\n    - include: modifiers\n    # Operator overloading\n    - match: '{{operator_method_name}}(?=\\s*(\\(|$))'\n      scope: meta.method.c++ entity.name.function.c++\n      set: method-definition-params\n    # Identifier that is not the function name - likely a macro or type\n    - match: '(?={{path_lookahead}}([ \\t]+|[*&])(?!\\s*(<|::|\\()))'\n      push:\n        - include: identifiers\n        - match: ''\n          pop: true\n    # Real function definition\n    - match: '(?={{path_lookahead}}({{generic_lookahead}})\\s*(\\())'\n      set: [method-definition-params, data-structures-function-identifier-generic]\n    - match: '(?={{path_lookahead}}\\s*(\\())'\n      set: [method-definition-params, data-structures-function-identifier]\n    - match: '(?={{path_lookahead}}\\s*::\\s*$)'\n      set: [method-definition-params, data-structures-function-identifier]\n    - match: '(?=\\S)'\n      pop: true\n\n  data-structures-function-identifier-generic:\n    - include: angle-brackets\n    - match: '(?={{identifier}})'\n      push:\n        - meta_content_scope: entity.name.function.c++\n        - include: identifiers\n        - match: '(?=<)'\n          pop: true\n    - match: '(?=\\()'\n      pop: true\n\n  data-structures-function-identifier:\n    - meta_content_scope: entity.name.function.c++\n    - include: identifiers\n    - match: '(?=\\S)'\n      pop: true\n\n  method-definition-params:\n    - meta_content_scope: meta.method.c++\n    - include: comments\n    - match: '(?=\\()'\n      set:\n        - match: \\(\n          scope: meta.method.parameters.c++ meta.group.c++ punctuation.section.group.begin.c++\n          set:\n            - meta_content_scope: meta.method.parameters.c++ meta.group.c++\n            - match : \\)\n              scope: punctuation.section.group.end.c++\n              set: method-definition-continue\n            - match: '\\bvoid\\b'\n              scope: storage.type.c++\n            - match: '{{identifier}}(?=\\s*(\\[|,|\\)|=))'\n              scope: variable.parameter.c++\n            - match: '='\n              scope: keyword.operator.assignment.c++\n              push:\n                - match: '(?=,|\\))'\n                  pop: true\n                - include: expressions-minus-generic-type\n            - include: expressions-minus-generic-type\n    - match: '(?=\\S)'\n      pop: true\n\n  method-definition-continue:\n    - meta_content_scope: meta.method.c++\n    - include: comments\n    - match: '(?=;)'\n      pop: true\n    - match: '->'\n      scope: punctuation.separator.c++\n      set: method-definition-trailing-return\n    - include: function-specifiers\n    - match: '='\n      scope: keyword.operator.assignment.c++\n    - match: '&'\n      scope: keyword.operator.c++\n    - match: \\b0\\b\n      scope: constant.numeric.c++\n    - match: \\b(default|delete)\\b\n      scope: storage.modifier.c++\n    - match: '(?=:)'\n      set:\n        - match: ':'\n          scope: punctuation.separator.initializer-list.c++\n          set:\n            - meta_scope: meta.method.constructor.initializer-list.c++\n            - match: '{{identifier}}'\n              scope: variable.other.readwrite.member.c++\n              push:\n                - match: \\(\n                  scope: meta.group.c++ punctuation.section.group.begin.c++\n                  set:\n                    - meta_content_scope: meta.group.c++\n                    - match: \\)\n                      scope: meta.group.c++ punctuation.section.group.end.c++\n                      pop: true\n                    - include: expressions\n                - match: \\{\n                  scope: meta.group.c++ punctuation.section.group.begin.c++\n                  set:\n                    - meta_content_scope: meta.group.c++\n                    - match: \\}\n                      scope: meta.group.c++ punctuation.section.group.end.c++\n                      pop: true\n                    - include: expressions\n                - include: comments\n            - match: (?=\\{|;)\n              set: method-definition-continue\n            - include: expressions\n    - match: '(?=\\{)'\n      set: method-definition-body\n    - match: '(?=\\S)'\n      pop: true\n\n  method-definition-trailing-return:\n    - include: comments\n    - match: '(?=;)'\n      pop: true\n    - match: '(?=\\{)'\n      set: method-definition-body\n    - include: function-specifiers\n    - include: function-trailing-return-type\n\n  method-definition-body:\n    - meta_content_scope: meta.method.c++ meta.block.c++\n    - match: '\\{'\n      scope: punctuation.section.block.begin.c++\n      set:\n        - meta_content_scope: meta.method.c++ meta.block.c++\n        - match: '\\}'\n          scope: meta.method.c++ meta.block.c++ punctuation.section.block.end.c++\n          pop: true\n        - match: (?=^\\s*#\\s*(elif|else|endif)\\b)\n          pop: true\n        - match: '(?=({{before_tag}})([^(;]+$|.*\\{))'\n          push: data-structures\n        - include: statements\n\n  ## Preprocessor for data-structures\n\n  preprocessor-data-structures:\n    - include: preprocessor-rule-enabled-data-structures\n    - include: preprocessor-rule-disabled-data-structures\n    - include: preprocessor-practical-workarounds\n\n  preprocessor-rule-disabled-data-structures:\n    - match: ^\\s*((#if)\\s+(0))\\b\n      captures:\n        1: meta.preprocessor.c++\n        2: keyword.control.import.c++\n        3: constant.numeric.preprocessor.c++\n      push:\n        - match: ^\\s*(#\\s*endif)\\b\n          captures:\n            1: meta.preprocessor.c++ keyword.control.import.c++\n          pop: true\n        - match: ^\\s*(#\\s*else)\\b\n          captures:\n            1: meta.preprocessor.c++ keyword.control.import.else.c++\n          push:\n            - match: (?=^\\s*#\\s*endif\\b)\n              pop: true\n            - include: negated-block\n            - include: data-structures-body\n        - match: \"\"\n          push:\n            - meta_scope: comment.block.preprocessor.if-branch.c++\n            - match: (?=^\\s*#\\s*(else|endif)\\b)\n              pop: true\n            - include: scope:source.c#preprocessor-disabled\n\n  preprocessor-rule-enabled-data-structures:\n    - match: ^\\s*((#if)\\s+(0*1))\\b\n      captures:\n        1: meta.preprocessor.c++\n        2: keyword.control.import.c++\n        3: constant.numeric.preprocessor.c++\n      push:\n        - match: ^\\s*(#\\s*endif)\\b\n          captures:\n            1: meta.preprocessor.c++ keyword.control.import.c++\n          pop: true\n        - match: ^\\s*(#\\s*else)\\b\n          captures:\n            1: meta.preprocessor.c++ keyword.control.import.else.c++\n          push:\n            - meta_content_scope: comment.block.preprocessor.else-branch.c++\n            - match: (?=^\\s*#\\s*endif\\b)\n              pop: true\n            - include: scope:source.c#preprocessor-disabled\n        - match: \"\"\n          push:\n            - match: (?=^\\s*#\\s*(else|endif)\\b)\n              pop: true\n            - include: negated-block\n            - include: data-structures-body\n\n  ## Preprocessor for global\n\n  preprocessor-global:\n    - include: preprocessor-rule-enabled-global\n    - include: preprocessor-rule-disabled-global\n    - include: preprocessor-rule-other-global\n\n  preprocessor-statements:\n    - include: preprocessor-rule-enabled-statements\n    - include: preprocessor-rule-disabled-statements\n    - include: preprocessor-rule-other-statements\n\n  preprocessor-expressions:\n    - include: scope:source.c#incomplete-inc\n    - include: preprocessor-macro-define\n    - include: scope:source.c#pragma-mark\n    - include: preprocessor-other\n\n  preprocessor-rule-disabled-global:\n    - match: ^\\s*((#if)\\s+(0))\\b\n      captures:\n        1: meta.preprocessor.c++\n        2: keyword.control.import.c++\n        3: constant.numeric.preprocessor.c++\n      push:\n        - match: ^\\s*(#\\s*endif)\\b\n          captures:\n            1: meta.preprocessor.c++ keyword.control.import.c++\n          pop: true\n        - match: ^\\s*(#\\s*else)\\b\n          captures:\n            1: meta.preprocessor.c++ keyword.control.import.else.c++\n          push:\n            - match: (?=^\\s*#\\s*endif\\b)\n              pop: true\n            - include: preprocessor-global\n            - include: negated-block\n            - include: global\n        - match: \"\"\n          push:\n            - meta_scope: comment.block.preprocessor.if-branch.c++\n            - match: (?=^\\s*#\\s*(else|endif)\\b)\n              pop: true\n            - include: scope:source.c#preprocessor-disabled\n\n  preprocessor-rule-enabled-global:\n    - match: ^\\s*((#if)\\s+(0*1))\\b\n      captures:\n        1: meta.preprocessor.c++\n        2: keyword.control.import.c++\n        3: constant.numeric.preprocessor.c++\n      push:\n        - match: ^\\s*(#\\s*endif)\\b\n          captures:\n            1: meta.preprocessor.c++ keyword.control.import.c++\n          pop: true\n        - match: ^\\s*(#\\s*else)\\b\n          captures:\n            1: meta.preprocessor.c++ keyword.control.import.else.c++\n          push:\n            - meta_content_scope: comment.block.preprocessor.else-branch.c++\n            - match: (?=^\\s*#\\s*endif\\b)\n              pop: true\n            - include: scope:source.c#preprocessor-disabled\n        - match: \"\"\n          push:\n            - match: (?=^\\s*#\\s*(else|endif)\\b)\n              pop: true\n            - include: preprocessor-global\n            - include: negated-block\n            - include: global\n\n  preprocessor-rule-other-global:\n    - match: ^\\s*(#\\s*(?:if|ifdef|ifndef))\\b\n      captures:\n        1: keyword.control.import.c++\n      push:\n        - meta_scope: meta.preprocessor.c++\n        - include: scope:source.c#preprocessor-line-continuation\n        - include: scope:source.c#preprocessor-comments\n        - match: \\bdefined\\b\n          scope: keyword.control.c++\n        # Enter a new scope where all elif/else branches have their\n        # contexts popped by a subsequent elif/else/endif. This ensures that\n        # preprocessor branches don't push multiple meta.block scopes on\n        # the stack, thus messing up the \"global\" context's detection of\n        # functions.\n        - match: $\\n\n          set: preprocessor-if-branch-global\n\n  # These gymnastics here ensure that we are properly handling scope even\n  # when the preprocessor is used to create different scope beginnings, such\n  # as a different if/while condition\n  preprocessor-if-branch-global:\n    - match: ^\\s*(#\\s*endif)\\b\n      captures:\n        1: meta.preprocessor.c++ keyword.control.import.c++\n      pop: true\n    - match: (?=^\\s*#\\s*(elif|else)\\b)\n      push: preprocessor-elif-else-branch-global\n    - match: \\{\n      scope: punctuation.section.block.begin.c++\n      set: preprocessor-block-if-branch-global\n    - include: preprocessor-global\n    - include: negated-block\n    - include: global\n\n  preprocessor-block-if-branch-global:\n    - meta_scope: meta.block.c++\n    - match: ^\\s*(#\\s*endif)\\b\n      captures:\n        1: meta.preprocessor.c++ keyword.control.import.c++\n      set: preprocessor-block-finish-global\n    - match: (?=^\\s*#\\s*(elif|else)\\b)\n      push: preprocessor-elif-else-branch-global\n    - match: \\}\n      scope: punctuation.section.block.end.c++\n      set: preprocessor-if-branch-global\n    - include: statements\n\n  preprocessor-block-finish-global:\n    - meta_scope: meta.block.c++\n    - match: ^\\s*(#\\s*(?:if|ifdef|ifndef))\\b\n      captures:\n        1: meta.preprocessor.c++ keyword.control.import.c++\n      set: preprocessor-block-finish-if-branch-global\n    - match: \\}\n      scope: punctuation.section.block.end.c++\n      pop: true\n    - include: statements\n\n  preprocessor-block-finish-if-branch-global:\n    - match: ^\\s*(#\\s*endif)\\b\n      captures:\n        1: keyword.control.import.c++\n      pop: true\n    - match: \\}\n      scope: punctuation.section.block.end.c++\n      set: preprocessor-if-branch-global\n    - include: statements\n\n  preprocessor-elif-else-branch-global:\n    - match: (?=^\\s*#\\s*(endif)\\b)\n      pop: true\n    - include: preprocessor-global\n    - include: negated-block\n    - include: global\n\n  ## Preprocessor for statements\n\n  preprocessor-rule-disabled-statements:\n    - match: ^\\s*((#if)\\s+(0))\\b\n      captures:\n        1: meta.preprocessor.c++\n        2: keyword.control.import.c++\n        3: constant.numeric.preprocessor.c++\n      push:\n        - match: ^\\s*(#\\s*endif)\\b\n          captures:\n            1: meta.preprocessor.c++ keyword.control.import.c++\n          pop: true\n        - match: ^\\s*(#\\s*else)\\b\n          captures:\n            1: meta.preprocessor.c++ keyword.control.import.else.c++\n          push:\n            - match: (?=^\\s*#\\s*endif\\b)\n              pop: true\n            - include: negated-block\n            - include: statements\n        - match: \"\"\n          push:\n            - meta_scope: comment.block.preprocessor.if-branch.c++\n            - match: (?=^\\s*#\\s*(else|endif)\\b)\n              pop: true\n            - include: scope:source.c#preprocessor-disabled\n\n  preprocessor-rule-enabled-statements:\n    - match: ^\\s*((#if)\\s+(0*1))\\b\n      captures:\n        1: meta.preprocessor.c++\n        2: keyword.control.import.c++\n        3: constant.numeric.preprocessor.c++\n      push:\n        - match: ^\\s*(#\\s*endif)\\b\n          captures:\n            1: meta.preprocessor.c++ keyword.control.import.c++\n          pop: true\n        - match: ^\\s*(#\\s*else)\\b\n          captures:\n            1: meta.preprocessor.c++ keyword.control.import.else.c++\n          push:\n            - meta_content_scope: comment.block.preprocessor.else-branch.c++\n            - match: (?=^\\s*#\\s*endif\\b)\n              pop: true\n            - include: scope:source.c#preprocessor-disabled\n        - match: \"\"\n          push:\n            - match: (?=^\\s*#\\s*(else|endif)\\b)\n              pop: true\n            - include: negated-block\n            - include: statements\n\n  preprocessor-rule-other-statements:\n    - match: ^\\s*(#\\s*(?:if|ifdef|ifndef))\\b\n      captures:\n        1: keyword.control.import.c++\n      push:\n        - meta_scope: meta.preprocessor.c++\n        - include: scope:source.c#preprocessor-line-continuation\n        - include: scope:source.c#preprocessor-comments\n        - match: \\bdefined\\b\n          scope: keyword.control.c++\n        # Enter a new scope where all elif/else branches have their\n        # contexts popped by a subsequent elif/else/endif. This ensures that\n        # preprocessor branches don't push multiple meta.block scopes on\n        # the stack, thus messing up the \"global\" context's detection of\n        # functions.\n        - match: $\\n\n          set: preprocessor-if-branch-statements\n\n  # These gymnastics here ensure that we are properly handling scope even\n  # when the preprocessor is used to create different scope beginnings, such\n  # as a different if/while condition\n  preprocessor-if-branch-statements:\n    - match: ^\\s*(#\\s*endif)\\b\n      captures:\n        1: meta.preprocessor.c++ keyword.control.import.c++\n      pop: true\n    - match: (?=^\\s*#\\s*(elif|else)\\b)\n      push: preprocessor-elif-else-branch-statements\n    - match: \\{\n      scope: punctuation.section.block.begin.c++\n      set: preprocessor-block-if-branch-statements\n    - match: (?=(?!{{non_func_keywords}}){{path_lookahead}}\\s*\\()\n      set: preprocessor-if-branch-function-call\n    - include: negated-block\n    - include: statements\n\n  preprocessor-if-branch-function-call:\n    - meta_content_scope: meta.function-call.c++\n    - include: scope:source.c#c99\n    - match: '(?:(::)\\s*)?{{identifier}}\\s*(::)\\s*'\n      scope: variable.function.c++\n      captures:\n        1: punctuation.accessor.c++\n        2: punctuation.accessor.c++\n    - match: '(?:(::)\\s*)?{{identifier}}'\n      scope: variable.function.c++\n      captures:\n        1: punctuation.accessor.c++\n    - match: '\\('\n      scope: meta.group.c++ punctuation.section.group.begin.c++\n      set: preprocessor-if-branch-function-call-arguments\n\n  preprocessor-if-branch-function-call-arguments:\n    - meta_content_scope: meta.function-call.c++ meta.group.c++\n    - match : \\)\n      scope: meta.function-call.c++ meta.group.c++ punctuation.section.group.end.c++\n      set: preprocessor-if-branch-statements\n    - match: ^\\s*(#\\s*(?:elif|else))\\b\n      captures:\n        1: meta.preprocessor.c++ keyword.control.import.c++\n      set: preprocessor-if-branch-statements\n    - match: ^\\s*(#\\s*endif)\\b\n      captures:\n        1: meta.preprocessor.c++ keyword.control.import.c++\n      set: preprocessor-if-branch-function-call-arguments-finish\n    - include: expressions\n\n  preprocessor-if-branch-function-call-arguments-finish:\n    - meta_content_scope: meta.function-call.c++ meta.group.c++\n    - match: \\)\n      scope: meta.function-call.c++ meta.group.c++ punctuation.section.group.end.c++\n      pop: true\n    - include: expressions\n\n  preprocessor-block-if-branch-statements:\n    - meta_scope: meta.block.c++\n    - match: ^\\s*(#\\s*endif)\\b\n      captures:\n        1: meta.preprocessor.c++ keyword.control.import.c++\n      set: preprocessor-block-finish-statements\n    - match: (?=^\\s*#\\s*(elif|else)\\b)\n      push: preprocessor-elif-else-branch-statements\n    - match: \\}\n      scope: punctuation.section.block.end.c++\n      set: preprocessor-if-branch-statements\n    - include: statements\n\n  preprocessor-block-finish-statements:\n    - meta_scope: meta.block.c++\n    - match: ^\\s*(#\\s*(?:if|ifdef|ifndef))\\b\n      captures:\n        1: meta.preprocessor.c++ keyword.control.import.c++\n      set: preprocessor-block-finish-if-branch-statements\n    - match: \\}\n      scope: punctuation.section.block.end.c++\n      pop: true\n    - include: statements\n\n  preprocessor-block-finish-if-branch-statements:\n    - match: ^\\s*(#\\s*endif)\\b\n      captures:\n        1: keyword.control.import.c++\n      pop: true\n    - match: \\}\n      scope: meta.block.c++ punctuation.section.block.end.c++\n      set: preprocessor-if-branch-statements\n    - include: statements\n\n  preprocessor-elif-else-branch-statements:\n    - match: (?=^\\s*#\\s*endif\\b)\n      pop: true\n    - include: negated-block\n    - include: statements\n\n  ## Preprocessor other\n\n  negated-block:\n    - match: '\\}'\n      scope: punctuation.section.block.end.c++\n      push:\n        - match: '\\{'\n          scope: punctuation.section.block.begin.c++\n          pop: true\n        - match: (?=^\\s*#\\s*(elif|else|endif)\\b)\n          pop: true\n        - include: statements\n\n  preprocessor-macro-define:\n    - match: ^\\s*(\\#\\s*define)\\b\n      captures:\n        1: meta.preprocessor.macro.c++ keyword.control.import.define.c++\n      push:\n        - meta_content_scope: meta.preprocessor.macro.c++\n        - include: scope:source.c#preprocessor-line-continuation\n        - include: scope:source.c#preprocessor-line-ending\n        - include: scope:source.c#preprocessor-comments\n        - match: '({{identifier}})(?=\\()'\n          scope: entity.name.function.preprocessor.c++\n          set:\n            - match: '\\('\n              scope: punctuation.section.group.begin.c++\n              set: preprocessor-macro-params\n        - match: '{{identifier}}'\n          scope: entity.name.constant.preprocessor.c++\n          set: preprocessor-macro-definition\n\n  preprocessor-macro-params:\n    - meta_scope: meta.preprocessor.macro.parameters.c++ meta.group.c++\n    - match: '{{identifier}}'\n      scope: variable.parameter.c++\n    - match: \\)\n      scope: punctuation.section.group.end.c++\n      set: preprocessor-macro-definition\n    - match: ','\n      scope: punctuation.separator.c++\n      push:\n        - match: '{{identifier}}'\n          scope: variable.parameter.c++\n          pop: true\n        - include: scope:source.c#preprocessor-line-continuation\n        - include: scope:source.c#preprocessor-comments\n        - match: '\\.\\.\\.'\n          scope: keyword.operator.variadic.c++\n        - match: '(?=\\))'\n          pop: true\n        - match: (/\\*).*(\\*/)\n          scope: comment.block.c++\n          captures:\n            1: punctuation.definition.comment.c++\n            2: punctuation.definition.comment.c++\n        - match: '\\S+'\n          scope: invalid.illegal.unexpected-character.c++\n    - include: scope:source.c#preprocessor-line-continuation\n    - include: scope:source.c#preprocessor-comments\n    - match: '\\.\\.\\.'\n      scope: keyword.operator.variadic.c++\n    - match: (/\\*).*(\\*/)\n      scope: comment.block.c++\n      captures:\n        1: punctuation.definition.comment.c++\n        2: punctuation.definition.comment.c++\n    - match: $\\n\n      scope: invalid.illegal.unexpected-end-of-line.c++\n\n  preprocessor-macro-definition:\n    - meta_content_scope: meta.preprocessor.macro.c++\n    - include: scope:source.c#preprocessor-line-continuation\n    - include: scope:source.c#preprocessor-line-ending\n    - include: scope:source.c#preprocessor-comments\n    # Don't define blocks in define statements\n    - match: '\\{'\n      scope: punctuation.section.block.begin.c++\n    - match: '\\}'\n      scope: punctuation.section.block.end.c++\n    - include: expressions\n\n  preprocessor-practical-workarounds:\n    - include: preprocessor-convention-ignore-uppercase-ident-lines\n    - include: scope:source.c#preprocessor-convention-ignore-uppercase-calls-without-semicolon\n\n  preprocessor-convention-ignore-uppercase-ident-lines:\n    - match: ^(\\s*{{macro_identifier}})+\\s*$\n      scope: meta.assumed-macro.c++\n      push:\n        # It's possible that we are dealing with a function return type on its own line, and the\n        # name of the function is on the subsequent line.\n        - match: '(?={{path_lookahead}}({{generic_lookahead}}({{path_lookahead}})?)\\s*\\()'\n          set: [function-definition-params, global-function-identifier-generic]\n        - match: '(?={{path_lookahead}}\\s*\\()'\n          set: [function-definition-params, global-function-identifier]\n        - match: ^\n          pop: true\n\n  preprocessor-other:\n    - match: ^\\s*(#\\s*(?:if|ifdef|ifndef|elif|else|line|pragma|undef))\\b\n      captures:\n        1: keyword.control.import.c++\n      push:\n        - meta_scope: meta.preprocessor.c++\n        - include: scope:source.c#preprocessor-line-continuation\n        - include: scope:source.c#preprocessor-line-ending\n        - include: scope:source.c#preprocessor-comments\n        - match: \\bdefined\\b\n          scope: keyword.control.c++\n    - match: ^\\s*(#\\s*endif)\\b\n      captures:\n        1: meta.preprocessor.c++ keyword.control.import.c++\n    - match: ^\\s*(#\\s*(?:error|warning))\\b\n      captures:\n        1: keyword.control.import.error.c++\n      push:\n        - meta_scope: meta.preprocessor.diagnostic.c++\n        - include: scope:source.c#preprocessor-line-continuation\n        - include: scope:source.c#preprocessor-line-ending\n        - include: scope:source.c#preprocessor-comments\n        - include: strings\n        - match: '\\S+'\n          scope: string.unquoted.c++\n    - match: ^\\s*(#\\s*(?:include|include_next|import))\\b\n      captures:\n        1: keyword.control.import.include.c++\n      push:\n        - meta_scope: meta.preprocessor.include.c++\n        - include: scope:source.c#preprocessor-line-continuation\n        - include: scope:source.c#preprocessor-line-ending\n        - include: scope:source.c#preprocessor-comments\n        - match: '\"'\n          scope: punctuation.definition.string.begin.c++\n          push:\n            - meta_scope: string.quoted.double.include.c++\n            - match: '\"'\n              scope: punctuation.definition.string.end.c++\n              pop: true\n        - match: <\n          scope: punctuation.definition.string.begin.c++\n          push:\n            - meta_scope: string.quoted.other.lt-gt.include.c++\n            - match: '>'\n              scope: punctuation.definition.string.end.c++\n              pop: true\n    - include: preprocessor-practical-workarounds\n"
  },
  {
    "path": "examples/libraries/fmt/support/README",
    "content": "This directory contains build support files such as\n\n* CMake modules\n* Build scripts\n"
  },
  {
    "path": "examples/libraries/fmt/support/Vagrantfile",
    "content": "# -*- mode: ruby -*-\n# vi: set ft=ruby :\n\n# A vagrant config for testing against gcc-4.8.\nVagrant.configure(\"2\") do |config|\n  config.vm.box = \"ubuntu/xenial64\"\n  config.disksize.size = '15GB'\n\n  config.vm.provider \"virtualbox\" do |vb|\n    vb.memory = \"4096\"\n  end\n\n  config.vm.provision \"shell\", inline: <<-SHELL\n    apt-get update\n    apt-get install -y g++ make wget git\n    wget -q https://github.com/Kitware/CMake/releases/download/v3.14.4/cmake-3.14.4-Linux-x86_64.tar.gz\n    tar xzf cmake-3.14.4-Linux-x86_64.tar.gz\n    ln -s `pwd`/cmake-3.14.4-Linux-x86_64/bin/cmake /usr/local/bin\n  SHELL\nend\n"
  },
  {
    "path": "examples/libraries/fmt/support/appveyor-build.py",
    "content": "#!/usr/bin/env python\n# Build the project on AppVeyor.\n\nimport os\nfrom subprocess import check_call\n\nbuild = os.environ['BUILD']\nconfig = os.environ['CONFIGURATION']\nplatform = os.environ['PLATFORM']\npath = os.environ['PATH']\nimage = os.environ['APPVEYOR_BUILD_WORKER_IMAGE']\njobid = os.environ['APPVEYOR_JOB_ID']\ncmake_command = ['cmake', '-DFMT_PEDANTIC=ON', '-DCMAKE_BUILD_TYPE=' + config, '..']\nif build == 'mingw':\n    cmake_command.append('-GMinGW Makefiles')\n    build_command = ['mingw32-make', '-j4']\n    test_command = ['mingw32-make', 'test']\n    # Remove the path to Git bin directory from $PATH because it breaks\n    # MinGW config.\n    path = path.replace(r'C:\\Program Files (x86)\\Git\\bin', '')\n    os.environ['PATH'] = r'C:\\MinGW\\bin;' + path\nelse:\n    # Add MSBuild 14.0 to PATH as described in\n    # http://help.appveyor.com/discussions/problems/2229-v140-not-found-on-vs2105rc.\n    os.environ['PATH'] = r'C:\\Program Files (x86)\\MSBuild\\15.0\\Bin;' + path\n    if image == 'Visual Studio 2019':\n        generator = 'Visual Studio 16 2019'\n        if platform == 'x64':\n            cmake_command.extend(['-A', 'x64'])\n    else:\n        if image == 'Visual Studio 2015':\n            generator = 'Visual Studio 14 2015'\n        elif image == 'Visual Studio 2017':\n            generator = 'Visual Studio 15 2017'\n        if platform == 'x64':\n            generator += ' Win64'\n    cmake_command.append('-G' + generator)\n    build_command = ['cmake', '--build', '.', '--config', config, '--', '/m:4']\n    test_command = ['ctest', '-C', config]\n\ncheck_call(cmake_command)\ncheck_call(build_command)\ncheck_call(test_command)\n"
  },
  {
    "path": "examples/libraries/fmt/support/appveyor.yml",
    "content": "configuration:\n  - Debug\n  - Release\n\nclone_depth: 1\n\nimage:\n  - Visual Studio 2015\n\nplatform:\n  - x64\n\nenvironment:\n  CTEST_OUTPUT_ON_FAILURE: 1\n  MSVC_DEFAULT_OPTIONS: ON\n  BUILD: msvc\n\nbefore_build:\n - mkdir build\n - cd build\n\nbuild_script:\n  - python ../support/appveyor-build.py\n\non_failure:\n  - appveyor PushArtifact Testing/Temporary/LastTest.log\n  - appveyor AddTest test\n\n# Uncomment this to debug AppVeyor failures.\n#on_finish:\n#  - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))\n"
  },
  {
    "path": "examples/libraries/fmt/support/build-docs.py",
    "content": "#!/usr/bin/env python\n# Build the documentation in CI.\n\nfrom __future__ import print_function\nimport errno, os, shutil, subprocess, sys, urllib\nfrom subprocess import call, check_call, Popen, PIPE, STDOUT\n\ndef rmtree_if_exists(dir):\n    try:\n        shutil.rmtree(dir)\n    except OSError as e:\n        if e.errno == errno.ENOENT:\n            pass\n\n# Build the docs.\nfmt_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))\nsys.path.insert(0, os.path.join(fmt_dir, 'doc'))\nimport build\nbuild.create_build_env()\nhtml_dir = build.build_docs()\n\nrepo = 'fmtlib.github.io'\nbranch = os.environ['GITHUB_REF']\nis_ci = 'CI' in os.environ\nif is_ci and branch != 'refs/heads/master':\n    print('Branch: ' + branch)\n    exit(0) # Ignore non-master branches\nif is_ci and 'KEY' not in os.environ:\n    # Don't update the repo if building in CI from an account that doesn't have\n    # push access.\n    print('Skipping update of ' + repo)\n    exit(0)\n\n# Clone the fmtlib.github.io repo.\nrmtree_if_exists(repo)\ngit_url = 'https://github.com/' if is_ci else 'git@github.com:'\ncheck_call(['git', 'clone', git_url + 'fmtlib/{}.git'.format(repo)])\n\n# Copy docs to the repo.\ntarget_dir = os.path.join(repo, 'dev')\nrmtree_if_exists(target_dir)\nshutil.copytree(html_dir, target_dir, ignore=shutil.ignore_patterns('.*'))\nif is_ci:\n    check_call(['git', 'config', '--global', 'user.name', 'fmtbot'])\n    check_call(['git', 'config', '--global', 'user.email', 'viz@fmt.dev'])\n\n# Push docs to GitHub pages.\ncheck_call(['git', 'add', '--all'], cwd=repo)\nif call(['git', 'diff-index', '--quiet', 'HEAD'], cwd=repo):\n    check_call(['git', 'commit', '-m', 'Update documentation'], cwd=repo)\n    cmd = 'git push'\n    if is_ci:\n        cmd += ' https://$KEY@github.com/fmtlib/fmtlib.github.io.git master'\n    p = Popen(cmd, shell=True, stdout=PIPE, stderr=STDOUT, cwd=repo)\n    # Print the output without the key.\n    print(p.communicate()[0].decode('utf-8').replace(os.environ['KEY'], '$KEY'))\n    if p.returncode != 0:\n        raise subprocess.CalledProcessError(p.returncode, cmd)\n"
  },
  {
    "path": "examples/libraries/fmt/support/build.gradle",
    "content": "import java.nio.file.Paths\n\n// General gradle arguments for root project\nbuildscript {    \n    repositories {\n        google()\n        jcenter()\n    }\n    dependencies {\n        //\n        // https://developer.android.com/studio/releases/gradle-plugin#updating-gradle\n        //\n        // Notice that 4.0.0 here is the version of [Android Gradle Plugin]\n        // Accroding to URL above you will need Gradle 6.1 or higher\n        //\n        classpath \"com.android.tools.build:gradle:4.1.1\"\n    }\n}\nrepositories {\n    google()\n    jcenter()\n}\n\n// Project's root where CMakeLists.txt exists: rootDir/support/.cxx -> rootDir\ndef rootDir = Paths.get(project.buildDir.getParent()).getParent()\nprintln(\"rootDir: ${rootDir}\")\n\n// Output: Shared library (.so) for Android \napply plugin: \"com.android.library\"\nandroid {\n    compileSdkVersion 25    // Android 7.0\n\n    // Target ABI\n    //  - This option controls target platform of module\n    //  - The platform might be limited by compiler's support\n    //    some can work with Clang(default), but some can work only with GCC...\n    //    if bad, both toolchains might not support it\n    splits {\n        abi {\n            enable true\n            // Specify platforms for Application\n            reset()\n            include  \"arm64-v8a\", \"armeabi-v7a\", \"x86_64\"\n        }\n    }\n    ndkVersion \"21.3.6528147\" // ANDROID_NDK_HOME is deprecated. Be explicit\n\n    defaultConfig {\n        minSdkVersion 21    // Android 5.0+\n        targetSdkVersion 25 // Follow Compile SDK\n        versionCode 34      // Follow release count\n        versionName \"7.1.2\" // Follow Official version\n        \n        externalNativeBuild {\n            cmake {\n                arguments \"-DANDROID_STL=c++_shared\"    // Specify Android STL\n                arguments \"-DBUILD_SHARED_LIBS=true\"    // Build shared object\n                arguments \"-DFMT_TEST=false\"            // Skip test\n                arguments \"-DFMT_DOC=false\"             // Skip document\n                cppFlags  \"-std=c++17\"\n                targets   \"fmt\"\n            }\n        }\n        println(externalNativeBuild.cmake.cppFlags)\n        println(externalNativeBuild.cmake.arguments)\n    }\n\n    // External Native build\n    //  - Use existing CMakeList.txt\n    //  - Give path to CMake. This gradle file should be \n    //    neighbor of the top level cmake\n    externalNativeBuild {\n        cmake {\n            version \"3.10.0+\"\n            path \"${rootDir}/CMakeLists.txt\"\n            // buildStagingDirectory \"./build\"  // Custom path for cmake output\n        }\n    }\n    \n    sourceSets{\n        // Android Manifest for Gradle\n        main {\n            manifest.srcFile \"AndroidManifest.xml\"\n        }\n    }\n\n    // https://developer.android.com/studio/build/native-dependencies#build_system_configuration\n    buildFeatures {\n        prefab true\n        prefabPublishing true\n    }\n    prefab {\n        fmt {\n            headers \"${rootDir}/include\"\n        }\n    }\n}\n\nassemble.doLast\n{\n    // Instead of `ninja install`, Gradle will deploy the files.\n    // We are doing this since FMT is dependent to the ANDROID_STL after build\n    copy {\n        from \"build/intermediates/cmake\"\n        into \"${rootDir}/libs\"\n    }\n    // Copy debug binaries\n    copy {\n        from \"${rootDir}/libs/debug/obj\"\n        into \"${rootDir}/libs/debug\"\n    }\n    // Copy Release binaries\n    copy {\n        from \"${rootDir}/libs/release/obj\"\n        into \"${rootDir}/libs/release\"\n    }\n    // Remove empty directory\n    delete \"${rootDir}/libs/debug/obj\"\n    delete \"${rootDir}/libs/release/obj\"\n\n    // Copy AAR files. Notice that the aar is named after the folder of this script.\n    copy {\n        from \"build/outputs/aar/support-release.aar\"\n        into \"${rootDir}/libs\"\n        rename \"support-release.aar\", \"fmt-release.aar\"\n    }\n    copy {\n        from \"build/outputs/aar/support-debug.aar\"\n        into \"${rootDir}/libs\"\n        rename \"support-debug.aar\", \"fmt-debug.aar\"\n    }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/support/cmake/FindSetEnv.cmake",
    "content": "# A CMake script to find SetEnv.cmd.\n\nfind_program(WINSDK_SETENV NAMES SetEnv.cmd\n  PATHS \"[HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Microsoft SDKs\\\\Windows;CurrentInstallFolder]/bin\")\nif (WINSDK_SETENV AND PRINT_PATH)\n  execute_process(COMMAND ${CMAKE_COMMAND} -E echo \"${WINSDK_SETENV}\")\nendif ()\n"
  },
  {
    "path": "examples/libraries/fmt/support/cmake/JoinPaths.cmake",
    "content": "# This module provides function for joining paths\n# known from from most languages\n#\n# Original license:\n# SPDX-License-Identifier: (MIT OR CC0-1.0)\n# Explicit permission given to distribute this module under\n# the terms of the project as described in /LICENSE.rst.\n# Copyright 2020 Jan Tojnar\n# https://github.com/jtojnar/cmake-snips\n#\n# Modelled after Python’s os.path.join\n# https://docs.python.org/3.7/library/os.path.html#os.path.join\n# Windows not supported\nfunction(join_paths joined_path first_path_segment)\n    set(temp_path \"${first_path_segment}\")\n    foreach(current_segment IN LISTS ARGN)\n        if(NOT (\"${current_segment}\" STREQUAL \"\"))\n            if(IS_ABSOLUTE \"${current_segment}\")\n                set(temp_path \"${current_segment}\")\n            else()\n                set(temp_path \"${temp_path}/${current_segment}\")\n            endif()\n        endif()\n    endforeach()\n    set(${joined_path} \"${temp_path}\" PARENT_SCOPE)\nendfunction()\n"
  },
  {
    "path": "examples/libraries/fmt/support/cmake/cxx14.cmake",
    "content": "# C++14 feature support detection\n\ninclude(CheckCXXSourceCompiles)\ninclude(CheckCXXCompilerFlag)\n\nif (NOT CMAKE_CXX_STANDARD)\n  set(CMAKE_CXX_STANDARD 11)\nendif()\nmessage(STATUS \"CXX_STANDARD: ${CMAKE_CXX_STANDARD}\")\n\nif (CMAKE_CXX_STANDARD EQUAL 20)\n  check_cxx_compiler_flag(-std=c++20 has_std_20_flag)\n  check_cxx_compiler_flag(-std=c++2a has_std_2a_flag)\n\n  if (has_std_20_flag)\n    set(CXX_STANDARD_FLAG -std=c++20)\n  elseif (has_std_2a_flag)\n    set(CXX_STANDARD_FLAG -std=c++2a)\n  endif ()\nelseif (CMAKE_CXX_STANDARD EQUAL 17)\n  check_cxx_compiler_flag(-std=c++17 has_std_17_flag)\n  check_cxx_compiler_flag(-std=c++1z has_std_1z_flag)\n\n  if (has_std_17_flag)\n    set(CXX_STANDARD_FLAG -std=c++17)\n  elseif (has_std_1z_flag)\n    set(CXX_STANDARD_FLAG -std=c++1z)\n  endif ()\nelseif (CMAKE_CXX_STANDARD EQUAL 14)\n  check_cxx_compiler_flag(-std=c++14 has_std_14_flag)\n  check_cxx_compiler_flag(-std=c++1y has_std_1y_flag)\n\n  if (has_std_14_flag)\n    set(CXX_STANDARD_FLAG -std=c++14)\n  elseif (has_std_1y_flag)\n    set(CXX_STANDARD_FLAG -std=c++1y)\n  endif ()\nelseif (CMAKE_CXX_STANDARD EQUAL 11)\n  check_cxx_compiler_flag(-std=c++11 has_std_11_flag)\n  check_cxx_compiler_flag(-std=c++0x has_std_0x_flag)\n\n  if (has_std_11_flag)\n    set(CXX_STANDARD_FLAG -std=c++11)\n  elseif (has_std_0x_flag)\n    set(CXX_STANDARD_FLAG -std=c++0x)\n  endif ()\nendif ()\n\nset(CMAKE_REQUIRED_FLAGS ${CXX_STANDARD_FLAG})\n\n# Check if user-defined literals are available\ncheck_cxx_source_compiles(\"\n  void operator\\\"\\\" _udl(long double);\n  int main() {}\"\n  SUPPORTS_USER_DEFINED_LITERALS)\nif (NOT SUPPORTS_USER_DEFINED_LITERALS)\n  set (SUPPORTS_USER_DEFINED_LITERALS OFF)\nendif ()\n\n# Check if <variant> is available\nset(CMAKE_REQUIRED_FLAGS -std=c++1z)\ncheck_cxx_source_compiles(\"\n  #include <variant>\n  int main() {}\"\n  FMT_HAS_VARIANT)\nif (NOT FMT_HAS_VARIANT)\n  set (FMT_HAS_VARIANT OFF)\nendif ()\n\nset(CMAKE_REQUIRED_FLAGS )\n"
  },
  {
    "path": "examples/libraries/fmt/support/cmake/fmt-config.cmake.in",
    "content": "@PACKAGE_INIT@\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/@targets_export_name@.cmake)\ncheck_required_components(fmt)\n"
  },
  {
    "path": "examples/libraries/fmt/support/cmake/fmt.pc.in",
    "content": "prefix=@CMAKE_INSTALL_PREFIX@\nexec_prefix=@CMAKE_INSTALL_PREFIX@\nlibdir=@libdir_for_pc_file@\nincludedir=@includedir_for_pc_file@\n\nName: fmt\nDescription: A modern formatting library\nVersion: @FMT_VERSION@\nLibs: -L${libdir} -l@FMT_LIB_NAME@\nCflags: -I${includedir}\n\n"
  },
  {
    "path": "examples/libraries/fmt/support/compute-powers.py",
    "content": "#!/usr/bin/env python\n# Compute 10 ** exp with exp in the range [min_exponent, max_exponent] and print\n# normalized (with most-significant bit equal to 1) significands in hexadecimal.\n\nfrom __future__ import print_function\n\nmin_exponent = -348\nmax_exponent = 340\nstep = 8\nsignificand_size = 64\nexp_offset = 2000\n\nclass fp:\n    pass\n\npowers = []\nfor i, exp in enumerate(range(min_exponent, max_exponent + 1, step)):\n    result = fp()\n    n = 10 ** exp if exp >= 0 else 2 ** exp_offset / 10 ** -exp\n    k = significand_size + 1\n    # Convert to binary and round.\n    binary = '{:b}'.format(n)\n    result.f = (int('{:0<{}}'.format(binary[:k], k), 2) + 1) / 2\n    result.e = len(binary) - (exp_offset if exp < 0 else 0) - significand_size\n    powers.append(result)\n    # Sanity check.\n    exp_offset10 = 400\n    actual = result.f * 10 ** exp_offset10\n    if result.e > 0:\n        actual *= 2 ** result.e\n    else:\n        for j in range(-result.e):\n            actual /= 2\n    expected = 10 ** (exp_offset10 + exp)\n    precision = len('{}'.format(expected)) - len('{}'.format(actual - expected))\n    if precision < 19:\n        print('low precision:', precision)\n        exit(1)\n\nprint('Significands:', end='')\nfor i, fp in enumerate(powers):\n    if i % 3 == 0:\n        print(end='\\n ')\n    print(' {:0<#16x}'.format(fp.f, ), end=',')\n\nprint('\\n\\nExponents:', end='')\nfor i, fp in enumerate(powers):\n    if i % 11 == 0:\n        print(end='\\n ')\n    print(' {:5}'.format(fp.e), end=',')\n\nprint('\\n\\nMax exponent difference:',\n      max([x.e - powers[i - 1].e for i, x in enumerate(powers)][1:]))\n"
  },
  {
    "path": "examples/libraries/fmt/support/docopt.py",
    "content": "\"\"\"Pythonic command-line interface parser that will make you smile.\n\n * http://docopt.org\n * Repository and issue-tracker: https://github.com/docopt/docopt\n * Licensed under terms of MIT license (see LICENSE-MIT)\n * Copyright (c) 2013 Vladimir Keleshev, vladimir@keleshev.com\n\n\"\"\"\nimport sys\nimport re\n\n\n__all__ = ['docopt']\n__version__ = '0.6.1'\n\n\nclass DocoptLanguageError(Exception):\n\n    \"\"\"Error in construction of usage-message by developer.\"\"\"\n\n\nclass DocoptExit(SystemExit):\n\n    \"\"\"Exit in case user invoked program with incorrect arguments.\"\"\"\n\n    usage = ''\n\n    def __init__(self, message=''):\n        SystemExit.__init__(self, (message + '\\n' + self.usage).strip())\n\n\nclass Pattern(object):\n\n    def __eq__(self, other):\n        return repr(self) == repr(other)\n\n    def __hash__(self):\n        return hash(repr(self))\n\n    def fix(self):\n        self.fix_identities()\n        self.fix_repeating_arguments()\n        return self\n\n    def fix_identities(self, uniq=None):\n        \"\"\"Make pattern-tree tips point to same object if they are equal.\"\"\"\n        if not hasattr(self, 'children'):\n            return self\n        uniq = list(set(self.flat())) if uniq is None else uniq\n        for i, child in enumerate(self.children):\n            if not hasattr(child, 'children'):\n                assert child in uniq\n                self.children[i] = uniq[uniq.index(child)]\n            else:\n                child.fix_identities(uniq)\n\n    def fix_repeating_arguments(self):\n        \"\"\"Fix elements that should accumulate/increment values.\"\"\"\n        either = [list(child.children) for child in transform(self).children]\n        for case in either:\n            for e in [child for child in case if case.count(child) > 1]:\n                if type(e) is Argument or type(e) is Option and e.argcount:\n                    if e.value is None:\n                        e.value = []\n                    elif type(e.value) is not list:\n                        e.value = e.value.split()\n                if type(e) is Command or type(e) is Option and e.argcount == 0:\n                    e.value = 0\n        return self\n\n\ndef transform(pattern):\n    \"\"\"Expand pattern into an (almost) equivalent one, but with single Either.\n\n    Example: ((-a | -b) (-c | -d)) => (-a -c | -a -d | -b -c | -b -d)\n    Quirks: [-a] => (-a), (-a...) => (-a -a)\n\n    \"\"\"\n    result = []\n    groups = [[pattern]]\n    while groups:\n        children = groups.pop(0)\n        parents = [Required, Optional, OptionsShortcut, Either, OneOrMore]\n        if any(t in map(type, children) for t in parents):\n            child = [c for c in children if type(c) in parents][0]\n            children.remove(child)\n            if type(child) is Either:\n                for c in child.children:\n                    groups.append([c] + children)\n            elif type(child) is OneOrMore:\n                groups.append(child.children * 2 + children)\n            else:\n                groups.append(child.children + children)\n        else:\n            result.append(children)\n    return Either(*[Required(*e) for e in result])\n\n\nclass LeafPattern(Pattern):\n\n    \"\"\"Leaf/terminal node of a pattern tree.\"\"\"\n\n    def __init__(self, name, value=None):\n        self.name, self.value = name, value\n\n    def __repr__(self):\n        return '%s(%r, %r)' % (self.__class__.__name__, self.name, self.value)\n\n    def flat(self, *types):\n        return [self] if not types or type(self) in types else []\n\n    def match(self, left, collected=None):\n        collected = [] if collected is None else collected\n        pos, match = self.single_match(left)\n        if match is None:\n            return False, left, collected\n        left_ = left[:pos] + left[pos + 1:]\n        same_name = [a for a in collected if a.name == self.name]\n        if type(self.value) in (int, list):\n            if type(self.value) is int:\n                increment = 1\n            else:\n                increment = ([match.value] if type(match.value) is str\n                             else match.value)\n            if not same_name:\n                match.value = increment\n                return True, left_, collected + [match]\n            same_name[0].value += increment\n            return True, left_, collected\n        return True, left_, collected + [match]\n\n\nclass BranchPattern(Pattern):\n\n    \"\"\"Branch/inner node of a pattern tree.\"\"\"\n\n    def __init__(self, *children):\n        self.children = list(children)\n\n    def __repr__(self):\n        return '%s(%s)' % (self.__class__.__name__,\n                           ', '.join(repr(a) for a in self.children))\n\n    def flat(self, *types):\n        if type(self) in types:\n            return [self]\n        return sum([child.flat(*types) for child in self.children], [])\n\n\nclass Argument(LeafPattern):\n\n    def single_match(self, left):\n        for n, pattern in enumerate(left):\n            if type(pattern) is Argument:\n                return n, Argument(self.name, pattern.value)\n        return None, None\n\n    @classmethod\n    def parse(class_, source):\n        name = re.findall('(<\\S*?>)', source)[0]\n        value = re.findall('\\[default: (.*)\\]', source, flags=re.I)\n        return class_(name, value[0] if value else None)\n\n\nclass Command(Argument):\n\n    def __init__(self, name, value=False):\n        self.name, self.value = name, value\n\n    def single_match(self, left):\n        for n, pattern in enumerate(left):\n            if type(pattern) is Argument:\n                if pattern.value == self.name:\n                    return n, Command(self.name, True)\n                else:\n                    break\n        return None, None\n\n\nclass Option(LeafPattern):\n\n    def __init__(self, short=None, long=None, argcount=0, value=False):\n        assert argcount in (0, 1)\n        self.short, self.long, self.argcount = short, long, argcount\n        self.value = None if value is False and argcount else value\n\n    @classmethod\n    def parse(class_, option_description):\n        short, long, argcount, value = None, None, 0, False\n        options, _, description = option_description.strip().partition('  ')\n        options = options.replace(',', ' ').replace('=', ' ')\n        for s in options.split():\n            if s.startswith('--'):\n                long = s\n            elif s.startswith('-'):\n                short = s\n            else:\n                argcount = 1\n        if argcount:\n            matched = re.findall('\\[default: (.*)\\]', description, flags=re.I)\n            value = matched[0] if matched else None\n        return class_(short, long, argcount, value)\n\n    def single_match(self, left):\n        for n, pattern in enumerate(left):\n            if self.name == pattern.name:\n                return n, pattern\n        return None, None\n\n    @property\n    def name(self):\n        return self.long or self.short\n\n    def __repr__(self):\n        return 'Option(%r, %r, %r, %r)' % (self.short, self.long,\n                                           self.argcount, self.value)\n\n\nclass Required(BranchPattern):\n\n    def match(self, left, collected=None):\n        collected = [] if collected is None else collected\n        l = left\n        c = collected\n        for pattern in self.children:\n            matched, l, c = pattern.match(l, c)\n            if not matched:\n                return False, left, collected\n        return True, l, c\n\n\nclass Optional(BranchPattern):\n\n    def match(self, left, collected=None):\n        collected = [] if collected is None else collected\n        for pattern in self.children:\n            m, left, collected = pattern.match(left, collected)\n        return True, left, collected\n\n\nclass OptionsShortcut(Optional):\n\n    \"\"\"Marker/placeholder for [options] shortcut.\"\"\"\n\n\nclass OneOrMore(BranchPattern):\n\n    def match(self, left, collected=None):\n        assert len(self.children) == 1\n        collected = [] if collected is None else collected\n        l = left\n        c = collected\n        l_ = None\n        matched = True\n        times = 0\n        while matched:\n            # could it be that something didn't match but changed l or c?\n            matched, l, c = self.children[0].match(l, c)\n            times += 1 if matched else 0\n            if l_ == l:\n                break\n            l_ = l\n        if times >= 1:\n            return True, l, c\n        return False, left, collected\n\n\nclass Either(BranchPattern):\n\n    def match(self, left, collected=None):\n        collected = [] if collected is None else collected\n        outcomes = []\n        for pattern in self.children:\n            matched, _, _ = outcome = pattern.match(left, collected)\n            if matched:\n                outcomes.append(outcome)\n        if outcomes:\n            return min(outcomes, key=lambda outcome: len(outcome[1]))\n        return False, left, collected\n\n\nclass Tokens(list):\n\n    def __init__(self, source, error=DocoptExit):\n        self += source.split() if hasattr(source, 'split') else source\n        self.error = error\n\n    @staticmethod\n    def from_pattern(source):\n        source = re.sub(r'([\\[\\]\\(\\)\\|]|\\.\\.\\.)', r' \\1 ', source)\n        source = [s for s in re.split('\\s+|(\\S*<.*?>)', source) if s]\n        return Tokens(source, error=DocoptLanguageError)\n\n    def move(self):\n        return self.pop(0) if len(self) else None\n\n    def current(self):\n        return self[0] if len(self) else None\n\n\ndef parse_long(tokens, options):\n    \"\"\"long ::= '--' chars [ ( ' ' | '=' ) chars ] ;\"\"\"\n    long, eq, value = tokens.move().partition('=')\n    assert long.startswith('--')\n    value = None if eq == value == '' else value\n    similar = [o for o in options if o.long == long]\n    if tokens.error is DocoptExit and similar == []:  # if no exact match\n        similar = [o for o in options if o.long and o.long.startswith(long)]\n    if len(similar) > 1:  # might be simply specified ambiguously 2+ times?\n        raise tokens.error('%s is not a unique prefix: %s?' %\n                           (long, ', '.join(o.long for o in similar)))\n    elif len(similar) < 1:\n        argcount = 1 if eq == '=' else 0\n        o = Option(None, long, argcount)\n        options.append(o)\n        if tokens.error is DocoptExit:\n            o = Option(None, long, argcount, value if argcount else True)\n    else:\n        o = Option(similar[0].short, similar[0].long,\n                   similar[0].argcount, similar[0].value)\n        if o.argcount == 0:\n            if value is not None:\n                raise tokens.error('%s must not have an argument' % o.long)\n        else:\n            if value is None:\n                if tokens.current() in [None, '--']:\n                    raise tokens.error('%s requires argument' % o.long)\n                value = tokens.move()\n        if tokens.error is DocoptExit:\n            o.value = value if value is not None else True\n    return [o]\n\n\ndef parse_shorts(tokens, options):\n    \"\"\"shorts ::= '-' ( chars )* [ [ ' ' ] chars ] ;\"\"\"\n    token = tokens.move()\n    assert token.startswith('-') and not token.startswith('--')\n    left = token.lstrip('-')\n    parsed = []\n    while left != '':\n        short, left = '-' + left[0], left[1:]\n        similar = [o for o in options if o.short == short]\n        if len(similar) > 1:\n            raise tokens.error('%s is specified ambiguously %d times' %\n                               (short, len(similar)))\n        elif len(similar) < 1:\n            o = Option(short, None, 0)\n            options.append(o)\n            if tokens.error is DocoptExit:\n                o = Option(short, None, 0, True)\n        else:  # why copying is necessary here?\n            o = Option(short, similar[0].long,\n                       similar[0].argcount, similar[0].value)\n            value = None\n            if o.argcount != 0:\n                if left == '':\n                    if tokens.current() in [None, '--']:\n                        raise tokens.error('%s requires argument' % short)\n                    value = tokens.move()\n                else:\n                    value = left\n                    left = ''\n            if tokens.error is DocoptExit:\n                o.value = value if value is not None else True\n        parsed.append(o)\n    return parsed\n\n\ndef parse_pattern(source, options):\n    tokens = Tokens.from_pattern(source)\n    result = parse_expr(tokens, options)\n    if tokens.current() is not None:\n        raise tokens.error('unexpected ending: %r' % ' '.join(tokens))\n    return Required(*result)\n\n\ndef parse_expr(tokens, options):\n    \"\"\"expr ::= seq ( '|' seq )* ;\"\"\"\n    seq = parse_seq(tokens, options)\n    if tokens.current() != '|':\n        return seq\n    result = [Required(*seq)] if len(seq) > 1 else seq\n    while tokens.current() == '|':\n        tokens.move()\n        seq = parse_seq(tokens, options)\n        result += [Required(*seq)] if len(seq) > 1 else seq\n    return [Either(*result)] if len(result) > 1 else result\n\n\ndef parse_seq(tokens, options):\n    \"\"\"seq ::= ( atom [ '...' ] )* ;\"\"\"\n    result = []\n    while tokens.current() not in [None, ']', ')', '|']:\n        atom = parse_atom(tokens, options)\n        if tokens.current() == '...':\n            atom = [OneOrMore(*atom)]\n            tokens.move()\n        result += atom\n    return result\n\n\ndef parse_atom(tokens, options):\n    \"\"\"atom ::= '(' expr ')' | '[' expr ']' | 'options'\n             | long | shorts | argument | command ;\n    \"\"\"\n    token = tokens.current()\n    result = []\n    if token in '([':\n        tokens.move()\n        matching, pattern = {'(': [')', Required], '[': [']', Optional]}[token]\n        result = pattern(*parse_expr(tokens, options))\n        if tokens.move() != matching:\n            raise tokens.error(\"unmatched '%s'\" % token)\n        return [result]\n    elif token == 'options':\n        tokens.move()\n        return [OptionsShortcut()]\n    elif token.startswith('--') and token != '--':\n        return parse_long(tokens, options)\n    elif token.startswith('-') and token not in ('-', '--'):\n        return parse_shorts(tokens, options)\n    elif token.startswith('<') and token.endswith('>') or token.isupper():\n        return [Argument(tokens.move())]\n    else:\n        return [Command(tokens.move())]\n\n\ndef parse_argv(tokens, options, options_first=False):\n    \"\"\"Parse command-line argument vector.\n\n    If options_first:\n        argv ::= [ long | shorts ]* [ argument ]* [ '--' [ argument ]* ] ;\n    else:\n        argv ::= [ long | shorts | argument ]* [ '--' [ argument ]* ] ;\n\n    \"\"\"\n    parsed = []\n    while tokens.current() is not None:\n        if tokens.current() == '--':\n            return parsed + [Argument(None, v) for v in tokens]\n        elif tokens.current().startswith('--'):\n            parsed += parse_long(tokens, options)\n        elif tokens.current().startswith('-') and tokens.current() != '-':\n            parsed += parse_shorts(tokens, options)\n        elif options_first:\n            return parsed + [Argument(None, v) for v in tokens]\n        else:\n            parsed.append(Argument(None, tokens.move()))\n    return parsed\n\n\ndef parse_defaults(doc):\n    defaults = []\n    for s in parse_section('options:', doc):\n        # FIXME corner case \"bla: options: --foo\"\n        _, _, s = s.partition(':')  # get rid of \"options:\"\n        split = re.split('\\n[ \\t]*(-\\S+?)', '\\n' + s)[1:]\n        split = [s1 + s2 for s1, s2 in zip(split[::2], split[1::2])]\n        options = [Option.parse(s) for s in split if s.startswith('-')]\n        defaults += options\n    return defaults\n\n\ndef parse_section(name, source):\n    pattern = re.compile('^([^\\n]*' + name + '[^\\n]*\\n?(?:[ \\t].*?(?:\\n|$))*)',\n                         re.IGNORECASE | re.MULTILINE)\n    return [s.strip() for s in pattern.findall(source)]\n\n\ndef formal_usage(section):\n    _, _, section = section.partition(':')  # drop \"usage:\"\n    pu = section.split()\n    return '( ' + ' '.join(') | (' if s == pu[0] else s for s in pu[1:]) + ' )'\n\n\ndef extras(help, version, options, doc):\n    if help and any((o.name in ('-h', '--help')) and o.value for o in options):\n        print(doc.strip(\"\\n\"))\n        sys.exit()\n    if version and any(o.name == '--version' and o.value for o in options):\n        print(version)\n        sys.exit()\n\n\nclass Dict(dict):\n    def __repr__(self):\n        return '{%s}' % ',\\n '.join('%r: %r' % i for i in sorted(self.items()))\n\n\ndef docopt(doc, argv=None, help=True, version=None, options_first=False):\n    \"\"\"Parse `argv` based on command-line interface described in `doc`.\n\n    `docopt` creates your command-line interface based on its\n    description that you pass as `doc`. Such description can contain\n    --options, <positional-argument>, commands, which could be\n    [optional], (required), (mutually | exclusive) or repeated...\n\n    Parameters\n    ----------\n    doc : str\n        Description of your command-line interface.\n    argv : list of str, optional\n        Argument vector to be parsed. sys.argv[1:] is used if not\n        provided.\n    help : bool (default: True)\n        Set to False to disable automatic help on -h or --help\n        options.\n    version : any object\n        If passed, the object will be printed if --version is in\n        `argv`.\n    options_first : bool (default: False)\n        Set to True to require options precede positional arguments,\n        i.e. to forbid options and positional arguments intermix.\n\n    Returns\n    -------\n    args : dict\n        A dictionary, where keys are names of command-line elements\n        such as e.g. \"--verbose\" and \"<path>\", and values are the\n        parsed values of those elements.\n\n    Example\n    -------\n    >>> from docopt import docopt\n    >>> doc = '''\n    ... Usage:\n    ...     my_program tcp <host> <port> [--timeout=<seconds>]\n    ...     my_program serial <port> [--baud=<n>] [--timeout=<seconds>]\n    ...     my_program (-h | --help | --version)\n    ...\n    ... Options:\n    ...     -h, --help  Show this screen and exit.\n    ...     --baud=<n>  Baudrate [default: 9600]\n    ... '''\n    >>> argv = ['tcp', '127.0.0.1', '80', '--timeout', '30']\n    >>> docopt(doc, argv)\n    {'--baud': '9600',\n     '--help': False,\n     '--timeout': '30',\n     '--version': False,\n     '<host>': '127.0.0.1',\n     '<port>': '80',\n     'serial': False,\n     'tcp': True}\n\n    See also\n    --------\n    * For video introduction see http://docopt.org\n    * Full documentation is available in README.rst as well as online\n      at https://github.com/docopt/docopt#readme\n\n    \"\"\"\n    argv = sys.argv[1:] if argv is None else argv\n\n    usage_sections = parse_section('usage:', doc)\n    if len(usage_sections) == 0:\n        raise DocoptLanguageError('\"usage:\" (case-insensitive) not found.')\n    if len(usage_sections) > 1:\n        raise DocoptLanguageError('More than one \"usage:\" (case-insensitive).')\n    DocoptExit.usage = usage_sections[0]\n\n    options = parse_defaults(doc)\n    pattern = parse_pattern(formal_usage(DocoptExit.usage), options)\n    # [default] syntax for argument is disabled\n    #for a in pattern.flat(Argument):\n    #    same_name = [d for d in arguments if d.name == a.name]\n    #    if same_name:\n    #        a.value = same_name[0].value\n    argv = parse_argv(Tokens(argv), list(options), options_first)\n    pattern_options = set(pattern.flat(Option))\n    for options_shortcut in pattern.flat(OptionsShortcut):\n        doc_options = parse_defaults(doc)\n        options_shortcut.children = list(set(doc_options) - pattern_options)\n        #if any_options:\n        #    options_shortcut.children += [Option(o.short, o.long, o.argcount)\n        #                    for o in argv if type(o) is Option]\n    extras(help, version, argv, doc)\n    matched, left, collected = pattern.fix().match(argv)\n    if matched and left == []:  # better error message if left?\n        return Dict((a.name, a.value) for a in (pattern.flat() + collected))\n    raise DocoptExit()\n"
  },
  {
    "path": "examples/libraries/fmt/support/manage.py",
    "content": "#!/usr/bin/env python3\n\n\"\"\"Manage site and releases.\n\nUsage:\n  manage.py release [<branch>]\n  manage.py site\n\nFor the release command $FMT_TOKEN should contain a GitHub personal access token\nobtained from https://github.com/settings/tokens.\n\"\"\"\n\nfrom __future__ import print_function\nimport datetime, docopt, errno, fileinput, json, os\nimport re, requests, shutil, sys, tempfile\nfrom contextlib import contextmanager\nfrom distutils.version import LooseVersion\nfrom subprocess import check_call\n\n\nclass Git:\n    def __init__(self, dir):\n        self.dir = dir\n\n    def call(self, method, args, **kwargs):\n        return check_call(['git', method] + list(args), **kwargs)\n\n    def add(self, *args):\n        return self.call('add', args, cwd=self.dir)\n\n    def checkout(self, *args):\n        return self.call('checkout', args, cwd=self.dir)\n\n    def clean(self, *args):\n        return self.call('clean', args, cwd=self.dir)\n\n    def clone(self, *args):\n        return self.call('clone', list(args) + [self.dir])\n\n    def commit(self, *args):\n        return self.call('commit', args, cwd=self.dir)\n\n    def pull(self, *args):\n        return self.call('pull', args, cwd=self.dir)\n\n    def push(self, *args):\n        return self.call('push', args, cwd=self.dir)\n\n    def reset(self, *args):\n        return self.call('reset', args, cwd=self.dir)\n\n    def update(self, *args):\n        clone = not os.path.exists(self.dir)\n        if clone:\n            self.clone(*args)\n        return clone\n\n\ndef clean_checkout(repo, branch):\n    repo.clean('-f', '-d')\n    repo.reset('--hard')\n    repo.checkout(branch)\n\n\nclass Runner:\n    def __init__(self, cwd):\n        self.cwd = cwd\n\n    def __call__(self, *args, **kwargs):\n        kwargs['cwd'] = kwargs.get('cwd', self.cwd)\n        check_call(args, **kwargs)\n\n\ndef create_build_env():\n    \"\"\"Create a build environment.\"\"\"\n    class Env:\n        pass\n    env = Env()\n\n    # Import the documentation build module.\n    env.fmt_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\n    sys.path.insert(0, os.path.join(env.fmt_dir, 'doc'))\n    import build\n\n    env.build_dir = 'build'\n    env.versions = build.versions\n\n    # Virtualenv and repos are cached to speed up builds.\n    build.create_build_env(os.path.join(env.build_dir, 'virtualenv'))\n\n    env.fmt_repo = Git(os.path.join(env.build_dir, 'fmt'))\n    return env\n\n\n@contextmanager\ndef rewrite(filename):\n    class Buffer:\n        pass\n    buffer = Buffer()\n    if not os.path.exists(filename):\n        buffer.data = ''\n        yield buffer\n        return\n    with open(filename) as f:\n        buffer.data = f.read()\n    yield buffer\n    with open(filename, 'w') as f:\n        f.write(buffer.data)\n\n\nfmt_repo_url = 'git@github.com:fmtlib/fmt'\n\n\ndef update_site(env):\n    env.fmt_repo.update(fmt_repo_url)\n\n    doc_repo = Git(os.path.join(env.build_dir, 'fmtlib.github.io'))\n    doc_repo.update('git@github.com:fmtlib/fmtlib.github.io')\n\n    for version in env.versions:\n        clean_checkout(env.fmt_repo, version)\n        target_doc_dir = os.path.join(env.fmt_repo.dir, 'doc')\n        # Remove the old theme.\n        for entry in os.listdir(target_doc_dir):\n            path = os.path.join(target_doc_dir, entry)\n            if os.path.isdir(path):\n                shutil.rmtree(path)\n        # Copy the new theme.\n        for entry in ['_static', '_templates', 'basic-bootstrap', 'bootstrap',\n                      'conf.py', 'fmt.less']:\n            src = os.path.join(env.fmt_dir, 'doc', entry)\n            dst = os.path.join(target_doc_dir, entry)\n            copy = shutil.copytree if os.path.isdir(src) else shutil.copyfile\n            copy(src, dst)\n        # Rename index to contents.\n        contents = os.path.join(target_doc_dir, 'contents.rst')\n        if not os.path.exists(contents):\n            os.rename(os.path.join(target_doc_dir, 'index.rst'), contents)\n        # Fix issues in reference.rst/api.rst.\n        for filename in ['reference.rst', 'api.rst', 'index.rst']:\n            pattern = re.compile('doxygenfunction.. (bin|oct|hexu|hex)$', re.M)\n            with rewrite(os.path.join(target_doc_dir, filename)) as b:\n                b.data = b.data.replace('std::ostream &', 'std::ostream&')\n                b.data = re.sub(pattern, r'doxygenfunction:: \\1(int)', b.data)\n                b.data = b.data.replace('std::FILE*', 'std::FILE *')\n                b.data = b.data.replace('unsigned int', 'unsigned')\n                #b.data = b.data.replace('operator\"\"_', 'operator\"\" _')\n                b.data = b.data.replace(\n                    'format_to_n(OutputIt, size_t, string_view, Args&&',\n                    'format_to_n(OutputIt, size_t, const S&, const Args&')\n                b.data = b.data.replace(\n                    'format_to_n(OutputIt, std::size_t, string_view, Args&&',\n                    'format_to_n(OutputIt, std::size_t, const S&, const Args&')\n                if version == ('3.0.2'):\n                    b.data = b.data.replace(\n                        'fprintf(std::ostream&', 'fprintf(std::ostream &')\n                if version == ('5.3.0'):\n                    b.data = b.data.replace(\n                        'format_to(OutputIt, const S&, const Args&...)',\n                        'format_to(OutputIt, const S &, const Args &...)')\n                if version.startswith('5.') or version.startswith('6.'):\n                    b.data = b.data.replace(', size_t', ', std::size_t')\n                if version.startswith('7.'):\n                    b.data = b.data.replace(', std::size_t', ', size_t')\n                    b.data = b.data.replace('join(It, It', 'join(It, Sentinel')\n                if version.startswith('7.1.'):\n                    b.data = b.data.replace(', std::size_t', ', size_t')\n                    b.data = b.data.replace('join(It, It', 'join(It, Sentinel')\n                    b.data = b.data.replace(\n                        'fmt::format_to(OutputIt, const S&, Args&&...)',\n                        'fmt::format_to(OutputIt, const S&, Args&&...) -> ' +\n                        'typename std::enable_if<enable, OutputIt>::type')\n                b.data = b.data.replace('aa long', 'a long')\n                b.data = b.data.replace('serveral', 'several')\n                if version.startswith('6.2.'):\n                    b.data = b.data.replace(\n                        'vformat(const S&, basic_format_args<' +\n                        'buffer_context<Char>>)',\n                        'vformat(const S&, basic_format_args<' +\n                        'buffer_context<type_identity_t<Char>>>)')\n        # Fix a broken link in index.rst.\n        index = os.path.join(target_doc_dir, 'index.rst')\n        with rewrite(index) as b:\n            b.data = b.data.replace(\n                'doc/latest/index.html#format-string-syntax', 'syntax.html')\n        # Build the docs.\n        html_dir = os.path.join(env.build_dir, 'html')\n        if os.path.exists(html_dir):\n            shutil.rmtree(html_dir)\n        include_dir = env.fmt_repo.dir\n        if LooseVersion(version) >= LooseVersion('5.0.0'):\n            include_dir = os.path.join(include_dir, 'include', 'fmt')\n        elif LooseVersion(version) >= LooseVersion('3.0.0'):\n            include_dir = os.path.join(include_dir, 'fmt')\n        import build\n        build.build_docs(version, doc_dir=target_doc_dir,\n                         include_dir=include_dir, work_dir=env.build_dir)\n        shutil.rmtree(os.path.join(html_dir, '.doctrees'))\n        # Create symlinks for older versions.\n        for link, target in {'index': 'contents', 'api': 'reference'}.items():\n            link = os.path.join(html_dir, link) + '.html'\n            target += '.html'\n            if os.path.exists(os.path.join(html_dir, target)) and \\\n               not os.path.exists(link):\n                os.symlink(target, link)\n        # Copy docs to the website.\n        version_doc_dir = os.path.join(doc_repo.dir, version)\n        try:\n            shutil.rmtree(version_doc_dir)\n        except OSError as e:\n            if e.errno != errno.ENOENT:\n                raise\n        shutil.move(html_dir, version_doc_dir)\n\n\ndef release(args):\n    env = create_build_env()\n    fmt_repo = env.fmt_repo\n\n    branch = args.get('<branch>')\n    if branch is None:\n        branch = 'master'\n    if not fmt_repo.update('-b', branch, fmt_repo_url):\n        clean_checkout(fmt_repo, branch)\n\n    # Convert changelog from RST to GitHub-flavored Markdown and get the\n    # version.\n    changelog = 'ChangeLog.rst'\n    changelog_path = os.path.join(fmt_repo.dir, changelog)\n    import rst2md\n    changes, version = rst2md.convert(changelog_path)\n    cmakelists = 'CMakeLists.txt'\n    for line in fileinput.input(os.path.join(fmt_repo.dir, cmakelists),\n                                inplace=True):\n        prefix = 'set(FMT_VERSION '\n        if line.startswith(prefix):\n            line = prefix + version + ')\\n'\n        sys.stdout.write(line)\n\n    # Update the version in the changelog.\n    title_len = 0\n    for line in fileinput.input(changelog_path, inplace=True):\n        if line.decode('utf-8').startswith(version + ' - TBD'):\n            line = version + ' - ' + datetime.date.today().isoformat()\n            title_len = len(line)\n            line += '\\n'\n        elif title_len:\n            line = '-' * title_len + '\\n'\n            title_len = 0\n        sys.stdout.write(line)\n\n    # Add the version to the build script.\n    script = os.path.join('doc', 'build.py')\n    script_path = os.path.join(fmt_repo.dir, script)\n    for line in fileinput.input(script_path, inplace=True):\n      m = re.match(r'( *versions = )\\[(.+)\\]', line)\n      if m:\n        line = '{}[{}, \\'{}\\']\\n'.format(m.group(1), m.group(2), version)\n      sys.stdout.write(line)\n\n    fmt_repo.checkout('-B', 'release')\n    fmt_repo.add(changelog, cmakelists, script)\n    fmt_repo.commit('-m', 'Update version')\n\n    # Build the docs and package.\n    run = Runner(fmt_repo.dir)\n    run('cmake', '.')\n    run('make', 'doc', 'package_source')\n    update_site(env)\n\n    # Create a release on GitHub.\n    fmt_repo.push('origin', 'release')\n    params = {'access_token': os.getenv('FMT_TOKEN')}\n    r = requests.post('https://api.github.com/repos/fmtlib/fmt/releases',\n                      params=params,\n                      data=json.dumps({'tag_name': version,\n                                       'target_commitish': 'release',\n                                       'body': changes, 'draft': True}))\n    if r.status_code != 201:\n        raise Exception('Failed to create a release ' + str(r))\n    id = r.json()['id']\n    uploads_url = 'https://uploads.github.com/repos/fmtlib/fmt/releases'\n    package = 'fmt-{}.zip'.format(version)\n    r = requests.post(\n        '{}/{}/assets?name={}'.format(uploads_url, id, package),\n        headers={'Content-Type': 'application/zip'},\n        params=params, data=open('build/fmt/' + package, 'rb'))\n    if r.status_code != 201:\n        raise Exception('Failed to upload an asset ' + str(r))\n\n\nif __name__ == '__main__':\n    args = docopt.docopt(__doc__)\n    if args.get('release'):\n        release(args)\n    elif args.get('site'):\n        update_site(create_build_env())\n"
  },
  {
    "path": "examples/libraries/fmt/support/rst2md.py",
    "content": "#!/usr/bin/env python\n# reStructuredText (RST) to GitHub-flavored Markdown converter\n\nimport re, sys\nfrom docutils import core, nodes, writers\n\n\ndef is_github_ref(node):\n    return re.match('https://github.com/.*/(issues|pull)/.*', node['refuri'])\n\n\nclass Translator(nodes.NodeVisitor):\n    def __init__(self, document):\n        nodes.NodeVisitor.__init__(self, document)\n        self.output = ''\n        self.indent = 0\n        self.preserve_newlines = False\n\n    def write(self, text):\n        self.output += text.replace('\\n', '\\n' + ' ' * self.indent)\n\n    def visit_document(self, node):\n        pass\n\n    def depart_document(self, node):\n        pass\n\n    def visit_section(self, node):\n        pass\n\n    def depart_section(self, node):\n        # Skip all sections except the first one.\n        raise nodes.StopTraversal\n\n    def visit_title(self, node):\n        self.version = re.match(r'(\\d+\\.\\d+\\.\\d+).*', node.children[0]).group(1)\n        raise nodes.SkipChildren\n\n    def visit_title_reference(self, node):\n        raise Exception(node)\n\n    def depart_title(self, node):\n        pass\n\n    def visit_Text(self, node):\n        if not self.preserve_newlines:\n            node = node.replace('\\n', ' ')\n        self.write(node)\n\n    def depart_Text(self, node):\n        pass\n\n    def visit_bullet_list(self, node):\n        pass\n\n    def depart_bullet_list(self, node):\n        pass\n\n    def visit_list_item(self, node):\n        self.write('* ')\n        self.indent += 2\n\n    def depart_list_item(self, node):\n        self.indent -= 2\n        self.write('\\n\\n')\n\n    def visit_paragraph(self, node):\n        self.write('\\n\\n')\n\n    def depart_paragraph(self, node):\n        pass\n\n    def visit_reference(self, node):\n        if not is_github_ref(node):\n            self.write('[')\n\n    def depart_reference(self, node):\n        if not is_github_ref(node):\n            self.write('](' + node['refuri'] + ')')\n\n    def visit_target(self, node):\n        pass\n\n    def depart_target(self, node):\n        pass\n\n    def visit_literal(self, node):\n        self.write('`')\n\n    def depart_literal(self, node):\n        self.write('`')\n\n    def visit_literal_block(self, node):\n        self.write('\\n\\n```')\n        if 'c++' in node['classes']:\n            self.write('c++')\n        self.write('\\n')\n        self.preserve_newlines = True\n\n    def depart_literal_block(self, node):\n        self.write('\\n```\\n')\n        self.preserve_newlines = False\n\n    def visit_inline(self, node):\n        pass\n\n    def depart_inline(self, node):\n        pass\n\n    def visit_image(self, node):\n        self.write('![](' + node['uri'] + ')')\n\n    def depart_image(self, node):\n        pass\n\n    def write_row(self, row, widths):\n        for i, entry in enumerate(row):\n            text = entry[0][0] if len(entry) > 0 else ''\n            if i != 0:\n                self.write('|')\n            self.write('{:{}}'.format(text, widths[i]))\n        self.write('\\n')\n\n    def visit_table(self, node):\n        table = node.children[0]\n        colspecs = table[:-2]\n        thead = table[-2]\n        tbody = table[-1]\n        widths = [int(cs['colwidth']) for cs in colspecs]\n        sep = '|'.join(['-' * w for w in widths]) + '\\n'\n        self.write('\\n\\n')\n        self.write_row(thead[0], widths)\n        self.write(sep)\n        for row in tbody:\n            self.write_row(row, widths)\n        raise nodes.SkipChildren\n\n    def depart_table(self, node):\n        pass\n\nclass MDWriter(writers.Writer):\n    \"\"\"GitHub-flavored markdown writer\"\"\"\n\n    supported = ('md',)\n    \"\"\"Formats this writer supports.\"\"\"\n\n    def translate(self):\n        translator = Translator(self.document)\n        self.document.walkabout(translator)\n        self.output = (translator.output, translator.version)\n\n\ndef convert(rst_path):\n    \"\"\"Converts RST file to Markdown.\"\"\"\n    return core.publish_file(source_path=rst_path, writer=MDWriter())\n\n\nif __name__ == '__main__':\n    convert(sys.argv[1])\n"
  },
  {
    "path": "examples/libraries/fmt/support/rtd/conf.py",
    "content": "# Sphinx configuration for readthedocs.\n\nimport os, sys\n\nmaster_doc = 'index'\nhtml_theme = 'theme'\nhtml_theme_path = [\".\"]\n"
  },
  {
    "path": "examples/libraries/fmt/support/rtd/index.rst",
    "content": "If you are not redirected automatically, follow the\n`link to the fmt documentation <https://fmt.dev/latest/>`_.\n"
  },
  {
    "path": "examples/libraries/fmt/support/rtd/theme/layout.html",
    "content": "{% extends \"basic/layout.html\" %}\n\n{% block extrahead %}\n<meta charset=\"UTF-8\">\n<meta http-equiv=\"refresh\" content=\"1;url=https://fmt.dev/latest/\">\n<script type=\"text/javascript\">\n    window.location.href = \"https://fmt.dev/latest/\"\n</script>\n<title>Page Redirection</title>\n{% endblock %}\n\n{% block document %}\nIf you are not redirected automatically, follow the <a href='https://fmt.dev/latest/'>link to the fmt documentation</a>.\n{% endblock %}\n\n{% block footer %}\n{% endblock %}\n"
  },
  {
    "path": "examples/libraries/fmt/support/rtd/theme/theme.conf",
    "content": "[theme]\ninherit = basic\n"
  },
  {
    "path": "examples/libraries/fmt/test/CMakeLists.txt",
    "content": "add_subdirectory(gtest)\n\nset(TEST_MAIN_SRC test-main.cc gtest-extra.cc gtest-extra.h util.cc)\nadd_library(test-main STATIC ${TEST_MAIN_SRC})\ntarget_include_directories(test-main PUBLIC\n  $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>)\ntarget_link_libraries(test-main gtest)\n\ninclude(CheckCXXCompilerFlag)\n\n# Workaround GTest bug https://github.com/google/googletest/issues/705.\ncheck_cxx_compiler_flag(\n  -fno-delete-null-pointer-checks HAVE_FNO_DELETE_NULL_POINTER_CHECKS)\nif (HAVE_FNO_DELETE_NULL_POINTER_CHECKS)\n  target_compile_options(test-main PUBLIC -fno-delete-null-pointer-checks)\nendif ()\n\n# Use less strict pedantic flags for the tests because GMock doesn't compile\n# cleanly with -pedantic and -std=c++98.\nif (CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_CXX_COMPILER_ID MATCHES \"Clang\"))\n    #set(PEDANTIC_COMPILE_FLAGS -Wall -Wextra -Wno-long-long -Wno-variadic-macros)\nendif ()\n\nfunction(add_fmt_executable name)\n  add_executable(${name} ${ARGN})\n  if (MINGW)\n    target_link_libraries(${name} -static-libgcc -static-libstdc++)\n  endif ()\nendfunction()\n\n# Adds a test.\n# Usage: add_fmt_test(name srcs...)\nfunction(add_fmt_test name)\n  cmake_parse_arguments(ADD_FMT_TEST \"HEADER_ONLY;MODULE\" \"\" \"\" ${ARGN})\n\n  set(sources ${name}.cc ${ADD_FMT_TEST_UNPARSED_ARGUMENTS})\n  if (ADD_FMT_TEST_HEADER_ONLY)\n    set(sources ${sources} ${TEST_MAIN_SRC} ../src/os.cc)\n    set(libs gtest fmt-header-only)\n    if (CMAKE_CXX_COMPILER_ID MATCHES \"Clang\")\n      set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS} -Wno-weak-vtables)\n    endif ()\n  elseif (ADD_FMT_TEST_MODULE)\n    set(libs gtest test-module)\n    set_source_files_properties(${name}.cc PROPERTIES OBJECT_DEPENDS test-module)\n  else ()\n    set(libs test-main fmt)\n  endif ()\n  add_fmt_executable(${name} ${sources})\n  target_link_libraries(${name} ${libs})\n\n  # Define if certain C++ features can be used.\n  if (FMT_PEDANTIC)\n    target_compile_options(${name} PRIVATE ${PEDANTIC_COMPILE_FLAGS})\n  endif ()\n  if (FMT_WERROR)\n    target_compile_options(${name} PRIVATE ${WERROR_FLAG})\n  endif ()\n  add_test(NAME ${name} COMMAND ${name})\nendfunction()\n\nadd_fmt_test(args-test)\nadd_fmt_test(assert-test)\nadd_fmt_test(chrono-test)\nadd_fmt_test(color-test)\nadd_fmt_test(core-test)\nadd_fmt_test(gtest-extra-test)\nadd_fmt_test(format-test mock-allocator.h)\nif (MSVC)\n  target_compile_options(format-test PRIVATE /bigobj)\nendif ()\nif (NOT (MSVC AND BUILD_SHARED_LIBS))\n  add_fmt_test(format-impl-test HEADER_ONLY header-only-test.cc)\nendif ()\nadd_fmt_test(ostream-test)\nadd_fmt_test(compile-test)\nadd_fmt_test(printf-test)\nadd_fmt_test(ranges-test)\nadd_fmt_test(scan-test)\nadd_fmt_test(unicode-test HEADER_ONLY)\nif (MSVC)\n  target_compile_options(unicode-test PRIVATE /utf-8)\nendif ()\nadd_fmt_test(xchar-test)\nadd_fmt_test(enforce-checks-test)\ntarget_compile_definitions(enforce-checks-test PRIVATE\n                           -DFMT_ENFORCE_COMPILE_STRING)\n\nif (FMT_CAN_MODULE)\n  # The tests need {fmt} to be compiled as traditional library\n  # because of visibility of implementation details.\n  # If module support is present the module tests require a\n  # test-only module to be built from {fmt}\n  add_library(test-module OBJECT ${CMAKE_SOURCE_DIR}/src/fmt.cc)\n  target_compile_features(test-module PUBLIC ${FMT_REQUIRED_FEATURES})\n  target_include_directories(test-module PUBLIC\n    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>)\n  enable_module(test-module)\n\n  add_fmt_test(module-test MODULE test-main.cc)\n  if (MSVC)\n    target_compile_options(test-module PRIVATE /utf-8 /Zc:__cplusplus\n                           /Zc:externConstexpr /Zc:inline)\n    target_compile_options(module-test PRIVATE /utf-8 /Zc:__cplusplus\n                           /Zc:externConstexpr /Zc:inline)\n  endif ()\nendif ()\n\nif (NOT DEFINED MSVC_STATIC_RUNTIME AND MSVC)\n  foreach (flag_var\n\t\t\t CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE\n\t\t\t CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)\n\tif (${flag_var} MATCHES \"^(/|-)(MT|MTd)\")\n\t  set(MSVC_STATIC_RUNTIME ON)\n\t  break()\n\tendif()\n  endforeach()\nendif()\n\nif (NOT MSVC_STATIC_RUNTIME)\n  add_fmt_executable(posix-mock-test\n    posix-mock-test.cc ../src/format.cc ${TEST_MAIN_SRC})\n  target_include_directories(\n    posix-mock-test PRIVATE ${PROJECT_SOURCE_DIR}/include)\n  target_link_libraries(posix-mock-test gtest)\n  if (FMT_PEDANTIC)\n    target_compile_options(posix-mock-test PRIVATE ${PEDANTIC_COMPILE_FLAGS})\n  endif ()\n  if (HAVE_STRTOD_L)\n    target_compile_definitions(posix-mock-test PRIVATE FMT_LOCALE)\n  endif ()\n  add_test(NAME posix-mock-test COMMAND posix-mock-test)\n  add_fmt_test(os-test)\nendif ()\n\nmessage(STATUS \"FMT_PEDANTIC: ${FMT_PEDANTIC}\")\n\nif (FMT_PEDANTIC AND CXX_STANDARD LESS 20)\n  # MSVC fails to compile GMock when C++17 is enabled.\n  if (FMT_HAS_VARIANT AND NOT MSVC)\n    add_fmt_test(std-format-test)\n    set_property(TARGET std-format-test PROPERTY CXX_STANDARD 17)\n  endif ()\n\n  # Test that the library can be compiled with exceptions disabled.\n  # -fno-exception is broken in icc: https://github.com/fmtlib/fmt/issues/822.\n  if (NOT CMAKE_CXX_COMPILER_ID STREQUAL \"Intel\")\n    check_cxx_compiler_flag(-fno-exceptions HAVE_FNO_EXCEPTIONS_FLAG)\n  endif ()\n  if (HAVE_FNO_EXCEPTIONS_FLAG)\n    add_library(noexception-test ../src/format.cc)\n    target_include_directories(\n      noexception-test PRIVATE ${PROJECT_SOURCE_DIR}/include)\n    target_compile_options(noexception-test PRIVATE -fno-exceptions)\n    if (FMT_PEDANTIC)\n      target_compile_options(noexception-test PRIVATE ${PEDANTIC_COMPILE_FLAGS})\n    endif ()\n  endif ()\n\n  # Test that the library compiles without locale.\n  add_library(nolocale-test ../src/format.cc)\n  target_include_directories(\n    nolocale-test PRIVATE ${PROJECT_SOURCE_DIR}/include)\n  target_compile_definitions(\n    nolocale-test PRIVATE FMT_STATIC_THOUSANDS_SEPARATOR=1)\n\n  add_test(compile-error-test ${CMAKE_CTEST_COMMAND}\n    --build-and-test\n    \"${CMAKE_CURRENT_SOURCE_DIR}/compile-error-test\"\n    \"${CMAKE_CURRENT_BINARY_DIR}/compile-error-test\"\n    --build-generator ${CMAKE_GENERATOR}\n    --build-makeprogram ${CMAKE_MAKE_PROGRAM}\n    --build-options\n    \"-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}\"\n    \"-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}\"\n    \"-DCXX_STANDARD_FLAG=${CXX_STANDARD_FLAG}\"\n    \"-DPEDANTIC_COMPILE_FLAGS=${PEDANTIC_COMPILE_FLAGS}\"\n    \"-DSUPPORTS_USER_DEFINED_LITERALS=${SUPPORTS_USER_DEFINED_LITERALS}\")\nendif ()\n\n# These tests are disabled on Windows because they take too long.\nif (FMT_PEDANTIC AND NOT WIN32)\n  # Test if the targets are found from the build directory.\n  add_test(find-package-test ${CMAKE_CTEST_COMMAND}\n    -C ${CMAKE_BUILD_TYPE}\n    --build-and-test\n    \"${CMAKE_CURRENT_SOURCE_DIR}/find-package-test\"\n    \"${CMAKE_CURRENT_BINARY_DIR}/find-package-test\"\n    --build-generator ${CMAKE_GENERATOR}\n    --build-makeprogram ${CMAKE_MAKE_PROGRAM}\n    --build-options\n    \"-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}\"\n    \"-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}\"\n    \"-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}\"\n    \"-DFMT_DIR=${PROJECT_BINARY_DIR}\"\n    \"-DPEDANTIC_COMPILE_FLAGS=${PEDANTIC_COMPILE_FLAGS}\"\n    \"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}\")\n\n  # Test if the targets are found when add_subdirectory is used.\n  add_test(add-subdirectory-test ${CMAKE_CTEST_COMMAND}\n    -C ${CMAKE_BUILD_TYPE}\n    --build-and-test\n    \"${CMAKE_CURRENT_SOURCE_DIR}/add-subdirectory-test\"\n    \"${CMAKE_CURRENT_BINARY_DIR}/add-subdirectory-test\"\n    --build-generator ${CMAKE_GENERATOR}\n    --build-makeprogram ${CMAKE_MAKE_PROGRAM}\n    --build-options\n    \"-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}\"\n    \"-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}\"\n    \"-DPEDANTIC_COMPILE_FLAGS=${PEDANTIC_COMPILE_FLAGS}\"\n    \"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}\")\nendif ()\n\n# This test are disabled on Windows because it is only *NIX issue.\nif (FMT_PEDANTIC AND NOT WIN32)\n  add_test(static-export-test ${CMAKE_CTEST_COMMAND}\n    -C ${CMAKE_BUILD_TYPE}\n    --build-and-test\n    \"${CMAKE_CURRENT_SOURCE_DIR}/static-export-test\"\n    \"${CMAKE_CURRENT_BINARY_DIR}/static-export-test\"\n    --build-generator ${CMAKE_GENERATOR}\n    --build-makeprogram ${CMAKE_MAKE_PROGRAM}\n    --build-options\n    \"-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}\"\n    \"-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}\"\n    \"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}\")\nendif ()\n\n# Activate optional CUDA tests if CUDA is found. For version selection see\n# https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#cpp14-language-features\nif (FMT_CUDA_TEST)\n  if (${CMAKE_VERSION} VERSION_LESS 3.15)\n    find_package(CUDA 9.0)\n  else ()\n    include(CheckLanguage)\n    check_language(CUDA)\n    if (CMAKE_CUDA_COMPILER)\n      enable_language(CUDA OPTIONAL)\n      set(CUDA_FOUND TRUE)\n    endif ()\n  endif ()\n\n  if (CUDA_FOUND)\n    add_subdirectory(cuda-test)\n    add_test(NAME cuda-test COMMAND fmt-in-cuda-test)\n  endif ()\nendif ()\n"
  },
  {
    "path": "examples/libraries/fmt/test/add-subdirectory-test/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.1...3.18)\n\nproject(fmt-test CXX)\n\nadd_subdirectory(../.. fmt)\n\nadd_executable(library-test main.cc)\ntarget_include_directories(library-test PUBLIC SYSTEM .)\ntarget_compile_options(library-test PRIVATE ${PEDANTIC_COMPILE_FLAGS})\ntarget_link_libraries(library-test fmt::fmt)\n\nif (TARGET fmt::fmt-header-only)\n  add_executable(header-only-test main.cc)\n  target_include_directories(header-only-test PUBLIC SYSTEM .)\n  target_compile_options(header-only-test PRIVATE ${PEDANTIC_COMPILE_FLAGS})\n  target_link_libraries(header-only-test fmt::fmt-header-only)\nendif ()\n"
  },
  {
    "path": "examples/libraries/fmt/test/add-subdirectory-test/main.cc",
    "content": "#include \"fmt/core.h\"\n\nint main(int argc, char** argv) {\n  for (int i = 0; i < argc; ++i) fmt::print(\"{}: {}\\n\", i, argv[i]);\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/args-test.cc",
    "content": "// Formatting library for C++ - dynamic argument store tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include \"fmt/args.h\"\n\n#include \"gtest/gtest.h\"\n\nTEST(args_test, basic) {\n  auto store = fmt::dynamic_format_arg_store<fmt::format_context>();\n  store.push_back(42);\n  store.push_back(\"abc1\");\n  store.push_back(1.5f);\n  EXPECT_EQ(\"42 and abc1 and 1.5\", fmt::vformat(\"{} and {} and {}\", store));\n}\n\nTEST(args_test, strings_and_refs) {\n  // Unfortunately the tests are compiled with old ABI so strings use COW.\n  auto store = fmt::dynamic_format_arg_store<fmt::format_context>();\n  char str[] = \"1234567890\";\n  store.push_back(str);\n  store.push_back(std::cref(str));\n  store.push_back(fmt::string_view{str});\n  str[0] = 'X';\n\n  auto result = fmt::vformat(\"{} and {} and {}\", store);\n  EXPECT_EQ(\"1234567890 and X234567890 and X234567890\", result);\n}\n\nstruct custom_type {\n  int i = 0;\n};\n\nFMT_BEGIN_NAMESPACE\ntemplate <> struct formatter<custom_type> {\n  auto parse(format_parse_context& ctx) const -> decltype(ctx.begin()) {\n    return ctx.begin();\n  }\n\n  template <typename FormatContext>\n  auto format(const custom_type& p, FormatContext& ctx) -> decltype(ctx.out()) {\n    return format_to(ctx.out(), \"cust={}\", p.i);\n  }\n};\nFMT_END_NAMESPACE\n\nTEST(args_test, custom_format) {\n  auto store = fmt::dynamic_format_arg_store<fmt::format_context>();\n  auto c = custom_type();\n  store.push_back(c);\n  ++c.i;\n  store.push_back(c);\n  ++c.i;\n  store.push_back(std::cref(c));\n  ++c.i;\n  auto result = fmt::vformat(\"{} and {} and {}\", store);\n  EXPECT_EQ(\"cust=0 and cust=1 and cust=3\", result);\n}\n\nstruct to_stringable {\n  friend fmt::string_view to_string_view(to_stringable) { return {}; }\n};\n\nFMT_BEGIN_NAMESPACE\ntemplate <> struct formatter<to_stringable> {\n  auto parse(format_parse_context& ctx) const -> decltype(ctx.begin()) {\n    return ctx.begin();\n  }\n\n  auto format(to_stringable, format_context& ctx) -> decltype(ctx.out()) {\n    return ctx.out();\n  }\n};\nFMT_END_NAMESPACE\n\nTEST(args_test, to_string_and_formatter) {\n  auto store = fmt::dynamic_format_arg_store<fmt::format_context>();\n  auto s = to_stringable();\n  store.push_back(s);\n  store.push_back(std::cref(s));\n  fmt::vformat(\"\", store);\n}\n\nTEST(args_test, named_int) {\n  auto store = fmt::dynamic_format_arg_store<fmt::format_context>();\n  store.push_back(fmt::arg(\"a1\", 42));\n  EXPECT_EQ(\"42\", fmt::vformat(\"{a1}\", store));\n}\n\nTEST(args_test, named_strings) {\n  auto store = fmt::dynamic_format_arg_store<fmt::format_context>();\n  char str[] = \"1234567890\";\n  store.push_back(fmt::arg(\"a1\", str));\n  store.push_back(fmt::arg(\"a2\", std::cref(str)));\n  str[0] = 'X';\n  EXPECT_EQ(\"1234567890 and X234567890\", fmt::vformat(\"{a1} and {a2}\", store));\n}\n\nTEST(args_test, named_arg_by_ref) {\n  auto store = fmt::dynamic_format_arg_store<fmt::format_context>();\n  char band[] = \"Rolling Stones\";\n  store.push_back(fmt::arg(\"band\", std::cref(band)));\n  band[9] = 'c';  // Changing band affects the output.\n  EXPECT_EQ(fmt::vformat(\"{band}\", store), \"Rolling Scones\");\n}\n\nTEST(args_test, named_custom_format) {\n  auto store = fmt::dynamic_format_arg_store<fmt::format_context>();\n  auto c = custom_type();\n  store.push_back(fmt::arg(\"c1\", c));\n  ++c.i;\n  store.push_back(fmt::arg(\"c2\", c));\n  ++c.i;\n  store.push_back(fmt::arg(\"c_ref\", std::cref(c)));\n  ++c.i;\n  auto result = fmt::vformat(\"{c1} and {c2} and {c_ref}\", store);\n  EXPECT_EQ(\"cust=0 and cust=1 and cust=3\", result);\n}\n\nTEST(args_test, clear) {\n  auto store = fmt::dynamic_format_arg_store<fmt::format_context>();\n  store.push_back(42);\n\n  auto result = fmt::vformat(\"{}\", store);\n  EXPECT_EQ(\"42\", result);\n\n  store.push_back(43);\n  result = fmt::vformat(\"{} and {}\", store);\n  EXPECT_EQ(\"42 and 43\", result);\n\n  store.clear();\n  store.push_back(44);\n  result = fmt::vformat(\"{}\", store);\n  EXPECT_EQ(\"44\", result);\n}\n\nTEST(args_test, reserve) {\n  auto store = fmt::dynamic_format_arg_store<fmt::format_context>();\n  store.reserve(2, 1);\n  store.push_back(1.5f);\n  store.push_back(fmt::arg(\"a1\", 42));\n  auto result = fmt::vformat(\"{a1} and {}\", store);\n  EXPECT_EQ(\"42 and 1.5\", result);\n}\n\nstruct copy_throwable {\n  copy_throwable() {}\n  copy_throwable(const copy_throwable&) { throw \"deal with it\"; }\n};\n\nFMT_BEGIN_NAMESPACE\ntemplate <> struct formatter<copy_throwable> {\n  auto parse(format_parse_context& ctx) const -> decltype(ctx.begin()) {\n    return ctx.begin();\n  }\n  auto format(copy_throwable, format_context& ctx) -> decltype(ctx.out()) {\n    return ctx.out();\n  }\n};\nFMT_END_NAMESPACE\n\nTEST(args_test, throw_on_copy) {\n  auto store = fmt::dynamic_format_arg_store<fmt::format_context>();\n  store.push_back(std::string(\"foo\"));\n  try {\n    store.push_back(copy_throwable());\n  } catch (...) {\n  }\n  EXPECT_EQ(fmt::vformat(\"{}\", store), \"foo\");\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/assert-test.cc",
    "content": "// Formatting library for C++ - FMT_ASSERT test\n//\n// It is a separate test to minimize the number of EXPECT_DEBUG_DEATH checks\n// which are slow on some platforms. In other tests FMT_ASSERT is made to throw\n// an exception which is much faster and easier to check.\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include \"fmt/core.h\"\n#include \"gtest/gtest.h\"\n\nTEST(assert_test, fail) {\n#if GTEST_HAS_DEATH_TEST\n  EXPECT_DEBUG_DEATH(FMT_ASSERT(false, \"don't panic!\"), \"don't panic!\");\n#else\n  fmt::print(\"warning: death tests are not supported\\n\");\n#endif\n}\n\nTEST(assert_test, dangling_else) {\n  bool test_condition = false;\n  bool executed_else = false;\n  if (test_condition)\n    FMT_ASSERT(true, \"\");\n  else\n    executed_else = true;\n  EXPECT_TRUE(executed_else);\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/chrono-test.cc",
    "content": "// Formatting library for C++ - time formatting tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include \"fmt/chrono.h\"\n\n#include \"gtest-extra.h\"  // EXPECT_THROW_MSG\n#include \"util.h\"         // get_locale\n\nusing fmt::runtime;\n\nusing testing::Contains;\n\nauto make_tm() -> std::tm {\n  auto time = std::tm();\n  time.tm_mday = 1;\n  return time;\n}\n\nauto make_hour(int h) -> std::tm {\n  auto time = make_tm();\n  time.tm_hour = h;\n  return time;\n}\n\nauto make_minute(int m) -> std::tm {\n  auto time = make_tm();\n  time.tm_min = m;\n  return time;\n}\n\nauto make_second(int s) -> std::tm {\n  auto time = make_tm();\n  time.tm_sec = s;\n  return time;\n}\n\nTEST(chrono_test, format_tm) {\n  auto tm = std::tm();\n  tm.tm_year = 116;\n  tm.tm_mon = 3;\n  tm.tm_mday = 25;\n  tm.tm_hour = 11;\n  tm.tm_min = 22;\n  tm.tm_sec = 33;\n  EXPECT_EQ(fmt::format(\"The date is {:%Y-%m-%d %H:%M:%S}.\", tm),\n            \"The date is 2016-04-25 11:22:33.\");\n}\n\nTEST(chrono_test, grow_buffer) {\n  auto s = std::string(\"{:\");\n  for (int i = 0; i < 30; ++i) s += \"%c\";\n  s += \"}\\n\";\n  auto t = std::time(nullptr);\n  fmt::format(fmt::runtime(s), *std::localtime(&t));\n}\n\nTEST(chrono_test, format_to_empty_container) {\n  auto time = std::tm();\n  time.tm_sec = 42;\n  auto s = std::string();\n  fmt::format_to(std::back_inserter(s), \"{:%S}\", time);\n  EXPECT_EQ(s, \"42\");\n}\n\nTEST(chrono_test, empty_result) { EXPECT_EQ(fmt::format(\"{}\", std::tm()), \"\"); }\n\nauto equal(const std::tm& lhs, const std::tm& rhs) -> bool {\n  return lhs.tm_sec == rhs.tm_sec && lhs.tm_min == rhs.tm_min &&\n         lhs.tm_hour == rhs.tm_hour && lhs.tm_mday == rhs.tm_mday &&\n         lhs.tm_mon == rhs.tm_mon && lhs.tm_year == rhs.tm_year &&\n         lhs.tm_wday == rhs.tm_wday && lhs.tm_yday == rhs.tm_yday &&\n         lhs.tm_isdst == rhs.tm_isdst;\n}\n\nTEST(chrono_test, localtime) {\n  auto t = std::time(nullptr);\n  auto tm = *std::localtime(&t);\n  EXPECT_TRUE(equal(tm, fmt::localtime(t)));\n}\n\nTEST(chrono_test, gmtime) {\n  auto t = std::time(nullptr);\n  auto tm = *std::gmtime(&t);\n  EXPECT_TRUE(equal(tm, fmt::gmtime(t)));\n}\n\ntemplate <typename TimePoint> auto strftime(TimePoint tp) -> std::string {\n  auto t = std::chrono::system_clock::to_time_t(tp);\n  auto tm = *std::localtime(&t);\n  char output[256] = {};\n  std::strftime(output, sizeof(output), \"%Y-%m-%d %H:%M:%S\", &tm);\n  return output;\n}\n\nTEST(chrono_test, time_point) {\n  auto t1 = std::chrono::system_clock::now();\n  EXPECT_EQ(strftime(t1), fmt::format(\"{:%Y-%m-%d %H:%M:%S}\", t1));\n  EXPECT_EQ(strftime(t1), fmt::format(\"{}\", t1));\n  using time_point =\n      std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds>;\n  auto t2 = time_point(std::chrono::seconds(42));\n  EXPECT_EQ(strftime(t2), fmt::format(\"{:%Y-%m-%d %H:%M:%S}\", t2));\n}\n\n#ifndef FMT_STATIC_THOUSANDS_SEPARATOR\n\nTEST(chrono_test, format_default) {\n  EXPECT_EQ(\"42s\", fmt::format(\"{}\", std::chrono::seconds(42)));\n  EXPECT_EQ(\"42as\",\n            fmt::format(\"{}\", std::chrono::duration<int, std::atto>(42)));\n  EXPECT_EQ(\"42fs\",\n            fmt::format(\"{}\", std::chrono::duration<int, std::femto>(42)));\n  EXPECT_EQ(\"42ps\",\n            fmt::format(\"{}\", std::chrono::duration<int, std::pico>(42)));\n  EXPECT_EQ(\"42ns\", fmt::format(\"{}\", std::chrono::nanoseconds(42)));\n  EXPECT_EQ(\"42µs\", fmt::format(\"{}\", std::chrono::microseconds(42)));\n  EXPECT_EQ(\"42ms\", fmt::format(\"{}\", std::chrono::milliseconds(42)));\n  EXPECT_EQ(\"42cs\",\n            fmt::format(\"{}\", std::chrono::duration<int, std::centi>(42)));\n  EXPECT_EQ(\"42ds\",\n            fmt::format(\"{}\", std::chrono::duration<int, std::deci>(42)));\n  EXPECT_EQ(\"42s\", fmt::format(\"{}\", std::chrono::seconds(42)));\n  EXPECT_EQ(\"42das\",\n            fmt::format(\"{}\", std::chrono::duration<int, std::deca>(42)));\n  EXPECT_EQ(\"42hs\",\n            fmt::format(\"{}\", std::chrono::duration<int, std::hecto>(42)));\n  EXPECT_EQ(\"42ks\",\n            fmt::format(\"{}\", std::chrono::duration<int, std::kilo>(42)));\n  EXPECT_EQ(\"42Ms\",\n            fmt::format(\"{}\", std::chrono::duration<int, std::mega>(42)));\n  EXPECT_EQ(\"42Gs\",\n            fmt::format(\"{}\", std::chrono::duration<int, std::giga>(42)));\n  EXPECT_EQ(\"42Ts\",\n            fmt::format(\"{}\", std::chrono::duration<int, std::tera>(42)));\n  EXPECT_EQ(\"42Ps\",\n            fmt::format(\"{}\", std::chrono::duration<int, std::peta>(42)));\n  EXPECT_EQ(\"42Es\",\n            fmt::format(\"{}\", std::chrono::duration<int, std::exa>(42)));\n  EXPECT_EQ(\"42m\", fmt::format(\"{}\", std::chrono::minutes(42)));\n  EXPECT_EQ(\"42h\", fmt::format(\"{}\", std::chrono::hours(42)));\n  EXPECT_EQ(\n      \"42[15]s\",\n      fmt::format(\"{}\", std::chrono::duration<int, std::ratio<15, 1>>(42)));\n  EXPECT_EQ(\n      \"42[15/4]s\",\n      fmt::format(\"{}\", std::chrono::duration<int, std::ratio<15, 4>>(42)));\n}\n\nTEST(chrono_test, align) {\n  auto s = std::chrono::seconds(42);\n  EXPECT_EQ(\"42s  \", fmt::format(\"{:5}\", s));\n  EXPECT_EQ(\"42s  \", fmt::format(\"{:{}}\", s, 5));\n  EXPECT_EQ(\"  42s\", fmt::format(\"{:>5}\", s));\n  EXPECT_EQ(\"**42s**\", fmt::format(\"{:*^7}\", s));\n  EXPECT_EQ(\"03:25:45    \",\n            fmt::format(\"{:12%H:%M:%S}\", std::chrono::seconds(12345)));\n  EXPECT_EQ(\"    03:25:45\",\n            fmt::format(\"{:>12%H:%M:%S}\", std::chrono::seconds(12345)));\n  EXPECT_EQ(\"~~03:25:45~~\",\n            fmt::format(\"{:~^12%H:%M:%S}\", std::chrono::seconds(12345)));\n  EXPECT_EQ(\"03:25:45    \",\n            fmt::format(\"{:{}%H:%M:%S}\", std::chrono::seconds(12345), 12));\n}\n\nTEST(chrono_test, format_specs) {\n  EXPECT_EQ(\"%\", fmt::format(\"{:%%}\", std::chrono::seconds(0)));\n  EXPECT_EQ(\"\\n\", fmt::format(\"{:%n}\", std::chrono::seconds(0)));\n  EXPECT_EQ(\"\\t\", fmt::format(\"{:%t}\", std::chrono::seconds(0)));\n  EXPECT_EQ(\"00\", fmt::format(\"{:%S}\", std::chrono::seconds(0)));\n  EXPECT_EQ(\"00\", fmt::format(\"{:%S}\", std::chrono::seconds(60)));\n  EXPECT_EQ(\"42\", fmt::format(\"{:%S}\", std::chrono::seconds(42)));\n  EXPECT_EQ(\"01.234\", fmt::format(\"{:%S}\", std::chrono::milliseconds(1234)));\n  EXPECT_EQ(\"00\", fmt::format(\"{:%M}\", std::chrono::minutes(0)));\n  EXPECT_EQ(\"00\", fmt::format(\"{:%M}\", std::chrono::minutes(60)));\n  EXPECT_EQ(\"42\", fmt::format(\"{:%M}\", std::chrono::minutes(42)));\n  EXPECT_EQ(\"01\", fmt::format(\"{:%M}\", std::chrono::seconds(61)));\n  EXPECT_EQ(\"00\", fmt::format(\"{:%H}\", std::chrono::hours(0)));\n  EXPECT_EQ(\"00\", fmt::format(\"{:%H}\", std::chrono::hours(24)));\n  EXPECT_EQ(\"14\", fmt::format(\"{:%H}\", std::chrono::hours(14)));\n  EXPECT_EQ(\"01\", fmt::format(\"{:%H}\", std::chrono::minutes(61)));\n  EXPECT_EQ(\"12\", fmt::format(\"{:%I}\", std::chrono::hours(0)));\n  EXPECT_EQ(\"12\", fmt::format(\"{:%I}\", std::chrono::hours(12)));\n  EXPECT_EQ(\"12\", fmt::format(\"{:%I}\", std::chrono::hours(24)));\n  EXPECT_EQ(\"04\", fmt::format(\"{:%I}\", std::chrono::hours(4)));\n  EXPECT_EQ(\"02\", fmt::format(\"{:%I}\", std::chrono::hours(14)));\n  EXPECT_EQ(\"03:25:45\",\n            fmt::format(\"{:%H:%M:%S}\", std::chrono::seconds(12345)));\n  EXPECT_EQ(\"03:25\", fmt::format(\"{:%R}\", std::chrono::seconds(12345)));\n  EXPECT_EQ(\"03:25:45\", fmt::format(\"{:%T}\", std::chrono::seconds(12345)));\n  EXPECT_EQ(\"12345\", fmt::format(\"{:%Q}\", std::chrono::seconds(12345)));\n  EXPECT_EQ(\"s\", fmt::format(\"{:%q}\", std::chrono::seconds(12345)));\n}\n\nTEST(chrono_test, invalid_specs) {\n  auto sec = std::chrono::seconds(0);\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:%a}\"), sec), fmt::format_error,\n                   \"no date\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:%A}\"), sec), fmt::format_error,\n                   \"no date\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:%c}\"), sec), fmt::format_error,\n                   \"no date\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:%x}\"), sec), fmt::format_error,\n                   \"no date\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:%Ex}\"), sec), fmt::format_error,\n                   \"no date\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:%X}\"), sec), fmt::format_error,\n                   \"no date\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:%EX}\"), sec), fmt::format_error,\n                   \"no date\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:%D}\"), sec), fmt::format_error,\n                   \"no date\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:%F}\"), sec), fmt::format_error,\n                   \"no date\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:%Ec}\"), sec), fmt::format_error,\n                   \"no date\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:%w}\"), sec), fmt::format_error,\n                   \"no date\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:%u}\"), sec), fmt::format_error,\n                   \"no date\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:%b}\"), sec), fmt::format_error,\n                   \"no date\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:%B}\"), sec), fmt::format_error,\n                   \"no date\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:%z}\"), sec), fmt::format_error,\n                   \"no date\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:%Z}\"), sec), fmt::format_error,\n                   \"no date\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:%Eq}\"), sec), fmt::format_error,\n                   \"invalid format\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:%Oq}\"), sec), fmt::format_error,\n                   \"invalid format\");\n}\n\nauto format_tm(const std::tm& time, fmt::string_view spec,\n               const std::locale& loc) -> std::string {\n  auto& facet = std::use_facet<std::time_put<char>>(loc);\n  std::ostringstream os;\n  os.imbue(loc);\n  facet.put(os, os, ' ', &time, spec.begin(), spec.end());\n  return os.str();\n}\n\nTEST(chrono_test, locale) {\n  auto loc = get_locale(\"ja_JP.utf8\");\n  if (loc == std::locale::classic()) return;\n#  define EXPECT_TIME(spec, time, duration)                     \\\n    {                                                           \\\n      auto jp_loc = std::locale(\"ja_JP.utf8\");                  \\\n      EXPECT_EQ(format_tm(time, spec, jp_loc),                  \\\n                fmt::format(jp_loc, \"{:L\" spec \"}\", duration)); \\\n    }\n  EXPECT_TIME(\"%OH\", make_hour(14), std::chrono::hours(14));\n  EXPECT_TIME(\"%OI\", make_hour(14), std::chrono::hours(14));\n  EXPECT_TIME(\"%OM\", make_minute(42), std::chrono::minutes(42));\n  EXPECT_TIME(\"%OS\", make_second(42), std::chrono::seconds(42));\n  auto time = make_tm();\n  time.tm_hour = 3;\n  time.tm_min = 25;\n  time.tm_sec = 45;\n  auto sec = std::chrono::seconds(12345);\n  EXPECT_TIME(\"%r\", time, sec);\n  EXPECT_TIME(\"%p\", time, sec);\n}\n\nusing dms = std::chrono::duration<double, std::milli>;\n\nTEST(chrono_test, format_default_fp) {\n  typedef std::chrono::duration<float> fs;\n  EXPECT_EQ(\"1.234s\", fmt::format(\"{}\", fs(1.234)));\n  typedef std::chrono::duration<float, std::milli> fms;\n  EXPECT_EQ(\"1.234ms\", fmt::format(\"{}\", fms(1.234)));\n  typedef std::chrono::duration<double> ds;\n  EXPECT_EQ(\"1.234s\", fmt::format(\"{}\", ds(1.234)));\n  EXPECT_EQ(\"1.234ms\", fmt::format(\"{}\", dms(1.234)));\n}\n\nTEST(chrono_test, format_precision) {\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:.2}\"), std::chrono::seconds(42)),\n                   fmt::format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_EQ(\"1.2ms\", fmt::format(\"{:.1}\", dms(1.234)));\n  EXPECT_EQ(\"1.23ms\", fmt::format(\"{:.{}}\", dms(1.234), 2));\n}\n\nTEST(chrono_test, format_full_specs) {\n  EXPECT_EQ(\"1.2ms \", fmt::format(\"{:6.1}\", dms(1.234)));\n  EXPECT_EQ(\"  1.23ms\", fmt::format(\"{:>8.{}}\", dms(1.234), 2));\n  EXPECT_EQ(\" 1.2ms \", fmt::format(\"{:^{}.{}}\", dms(1.234), 7, 1));\n  EXPECT_EQ(\" 1.23ms \", fmt::format(\"{0:^{2}.{1}}\", dms(1.234), 2, 8));\n  EXPECT_EQ(\"=1.234ms=\", fmt::format(\"{:=^{}.{}}\", dms(1.234), 9, 3));\n  EXPECT_EQ(\"*1.2340ms*\", fmt::format(\"{:*^10.4}\", dms(1.234)));\n}\n\nTEST(chrono_test, format_simple_q) {\n  typedef std::chrono::duration<float> fs;\n  EXPECT_EQ(\"1.234 s\", fmt::format(\"{:%Q %q}\", fs(1.234)));\n  typedef std::chrono::duration<float, std::milli> fms;\n  EXPECT_EQ(\"1.234 ms\", fmt::format(\"{:%Q %q}\", fms(1.234)));\n  typedef std::chrono::duration<double> ds;\n  EXPECT_EQ(\"1.234 s\", fmt::format(\"{:%Q %q}\", ds(1.234)));\n  EXPECT_EQ(\"1.234 ms\", fmt::format(\"{:%Q %q}\", dms(1.234)));\n}\n\nTEST(chrono_test, format_precision_q) {\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:.2%Q %q}\"), std::chrono::seconds(42)),\n                   fmt::format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_EQ(\"1.2 ms\", fmt::format(\"{:.1%Q %q}\", dms(1.234)));\n  EXPECT_EQ(\"1.23 ms\", fmt::format(\"{:.{}%Q %q}\", dms(1.234), 2));\n}\n\nTEST(chrono_test, format_full_specs_q) {\n  EXPECT_EQ(\"1.2 ms \", fmt::format(\"{:7.1%Q %q}\", dms(1.234)));\n  EXPECT_EQ(\" 1.23 ms\", fmt::format(\"{:>8.{}%Q %q}\", dms(1.234), 2));\n  EXPECT_EQ(\" 1.2 ms \", fmt::format(\"{:^{}.{}%Q %q}\", dms(1.234), 8, 1));\n  EXPECT_EQ(\" 1.23 ms \", fmt::format(\"{0:^{2}.{1}%Q %q}\", dms(1.234), 2, 9));\n  EXPECT_EQ(\"=1.234 ms=\", fmt::format(\"{:=^{}.{}%Q %q}\", dms(1.234), 10, 3));\n  EXPECT_EQ(\"*1.2340 ms*\", fmt::format(\"{:*^11.4%Q %q}\", dms(1.234)));\n}\n\nTEST(chrono_test, invalid_width_id) {\n  EXPECT_THROW(fmt::format(runtime(\"{:{o}\"), std::chrono::seconds(0)),\n               fmt::format_error);\n}\n\nTEST(chrono_test, invalid_colons) {\n  EXPECT_THROW(fmt::format(runtime(\"{0}=:{0::\"), std::chrono::seconds(0)),\n               fmt::format_error);\n}\n\nTEST(chrono_test, negative_durations) {\n  EXPECT_EQ(\"-12345\", fmt::format(\"{:%Q}\", std::chrono::seconds(-12345)));\n  EXPECT_EQ(\"-03:25:45\",\n            fmt::format(\"{:%H:%M:%S}\", std::chrono::seconds(-12345)));\n  EXPECT_EQ(\"-00:01\",\n            fmt::format(\"{:%M:%S}\", std::chrono::duration<double>(-1)));\n  EXPECT_EQ(\"s\", fmt::format(\"{:%q}\", std::chrono::seconds(-12345)));\n  EXPECT_EQ(\"-00.127\",\n            fmt::format(\"{:%S}\",\n                        std::chrono::duration<signed char, std::milli>{-127}));\n  auto min = std::numeric_limits<int>::min();\n  EXPECT_EQ(fmt::format(\"{}\", min),\n            fmt::format(\"{:%Q}\", std::chrono::duration<int>(min)));\n}\n\nTEST(chrono_test, special_durations) {\n  EXPECT_EQ(\n      \"40.\",\n      fmt::format(\"{:%S}\", std::chrono::duration<double>(1e20)).substr(0, 3));\n  auto nan = std::numeric_limits<double>::quiet_NaN();\n  EXPECT_EQ(\n      \"nan nan nan nan nan:nan nan\",\n      fmt::format(\"{:%I %H %M %S %R %r}\", std::chrono::duration<double>(nan)));\n  fmt::format(\"{:%S}\",\n              std::chrono::duration<float, std::atto>(1.79400457e+31f));\n  EXPECT_EQ(fmt::format(\"{}\", std::chrono::duration<float, std::exa>(1)),\n            \"1Es\");\n  EXPECT_EQ(fmt::format(\"{}\", std::chrono::duration<float, std::atto>(1)),\n            \"1as\");\n  EXPECT_EQ(fmt::format(\"{:%R}\", std::chrono::duration<char, std::mega>{2}),\n            \"03:33\");\n  EXPECT_EQ(fmt::format(\"{:%T}\", std::chrono::duration<char, std::mega>{2}),\n            \"03:33:20\");\n}\n\nTEST(chrono_test, unsigned_duration) {\n  EXPECT_EQ(\"42s\", fmt::format(\"{}\", std::chrono::duration<unsigned>(42)));\n}\n\nTEST(chrono_test, weekday) {\n  auto loc = get_locale(\"ru_RU.UTF-8\");\n  std::locale::global(loc);\n  auto mon = fmt::weekday(1);\n  EXPECT_EQ(fmt::format(\"{}\", mon), \"Mon\");\n  if (loc != std::locale::classic()) {\n    EXPECT_THAT((std::vector<std::string>{\"пн\", \"Пн\", \"пнд\", \"Пнд\"}),\n                Contains(fmt::format(loc, \"{:L}\", mon)));\n  }\n}\n\n#endif  // FMT_STATIC_THOUSANDS_SEPARATOR\n"
  },
  {
    "path": "examples/libraries/fmt/test/color-test.cc",
    "content": "// Formatting library for C++ - color tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include \"fmt/color.h\"\n\n#include <iterator>  // std::back_inserter\n\n#include \"gtest-extra.h\"  // EXPECT_WRITE\n\nTEST(color_test, format) {\n  EXPECT_EQ(fmt::format(fg(fmt::rgb(255, 20, 30)), \"rgb(255,20,30)\"),\n            \"\\x1b[38;2;255;020;030mrgb(255,20,30)\\x1b[0m\");\n  EXPECT_EQ(fmt::format(fg(fmt::color::blue), \"blue\"),\n            \"\\x1b[38;2;000;000;255mblue\\x1b[0m\");\n  EXPECT_EQ(\n      fmt::format(fg(fmt::color::blue) | bg(fmt::color::red), \"two color\"),\n      \"\\x1b[38;2;000;000;255m\\x1b[48;2;255;000;000mtwo color\\x1b[0m\");\n  EXPECT_EQ(fmt::format(fmt::emphasis::bold, \"bold\"), \"\\x1b[1mbold\\x1b[0m\");\n  EXPECT_EQ(fmt::format(fmt::emphasis::faint, \"faint\"), \"\\x1b[2mfaint\\x1b[0m\");\n  EXPECT_EQ(fmt::format(fmt::emphasis::italic, \"italic\"),\n            \"\\x1b[3mitalic\\x1b[0m\");\n  EXPECT_EQ(fmt::format(fmt::emphasis::underline, \"underline\"),\n            \"\\x1b[4munderline\\x1b[0m\");\n  EXPECT_EQ(fmt::format(fmt::emphasis::blink, \"blink\"), \"\\x1b[5mblink\\x1b[0m\");\n  EXPECT_EQ(fmt::format(fmt::emphasis::reverse, \"reverse\"),\n            \"\\x1b[7mreverse\\x1b[0m\");\n  EXPECT_EQ(fmt::format(fmt::emphasis::conceal, \"conceal\"),\n            \"\\x1b[8mconceal\\x1b[0m\");\n  EXPECT_EQ(fmt::format(fmt::emphasis::strikethrough, \"strikethrough\"),\n            \"\\x1b[9mstrikethrough\\x1b[0m\");\n  EXPECT_EQ(\n      fmt::format(fg(fmt::color::blue) | fmt::emphasis::bold, \"blue/bold\"),\n      \"\\x1b[1m\\x1b[38;2;000;000;255mblue/bold\\x1b[0m\");\n  EXPECT_EQ(fmt::format(fmt::emphasis::bold, \"bold error\"),\n            \"\\x1b[1mbold error\\x1b[0m\");\n  EXPECT_EQ(fmt::format(fg(fmt::color::blue), \"blue log\"),\n            \"\\x1b[38;2;000;000;255mblue log\\x1b[0m\");\n  EXPECT_EQ(fmt::format(fmt::text_style(), \"hi\"), \"hi\");\n  EXPECT_EQ(fmt::format(fg(fmt::terminal_color::red), \"tred\"),\n            \"\\x1b[31mtred\\x1b[0m\");\n  EXPECT_EQ(fmt::format(bg(fmt::terminal_color::cyan), \"tcyan\"),\n            \"\\x1b[46mtcyan\\x1b[0m\");\n  EXPECT_EQ(fmt::format(fg(fmt::terminal_color::bright_green), \"tbgreen\"),\n            \"\\x1b[92mtbgreen\\x1b[0m\");\n  EXPECT_EQ(fmt::format(bg(fmt::terminal_color::bright_magenta), \"tbmagenta\"),\n            \"\\x1b[105mtbmagenta\\x1b[0m\");\n  EXPECT_EQ(fmt::format(fg(fmt::terminal_color::red), \"{}\", \"foo\"),\n            \"\\x1b[31mfoo\\x1b[0m\");\n}\n\nTEST(color_test, format_to) {\n  auto out = std::string();\n  fmt::format_to(std::back_inserter(out), fg(fmt::rgb(255, 20, 30)),\n                 \"rgb(255,20,30){}{}{}\", 1, 2, 3);\n  EXPECT_EQ(fmt::to_string(out),\n            \"\\x1b[38;2;255;020;030mrgb(255,20,30)123\\x1b[0m\");\n}\n\nTEST(color_test, print) {\n  EXPECT_WRITE(stdout, fmt::print(fg(fmt::rgb(255, 20, 30)), \"rgb(255,20,30)\"),\n               \"\\x1b[38;2;255;020;030mrgb(255,20,30)\\x1b[0m\");\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/compile-error-test/CMakeLists.txt",
    "content": "# Test if compile errors are produced where necessary.\n\ncmake_minimum_required(VERSION 3.1...3.18)\n\ninclude(CheckCXXSourceCompiles)\ninclude(CheckCXXCompilerFlag)\n\nset(CMAKE_REQUIRED_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR}/../../include)\nset(CMAKE_REQUIRED_FLAGS ${CXX_STANDARD_FLAG} ${PEDANTIC_COMPILE_FLAGS})\n\nfunction (generate_source result fragment)\n  set(${result} \"\n  #define FMT_HEADER_ONLY 1\n  #include \\\"fmt/format.h\\\"\n  int main() {\n    ${fragment}\n  }\n  \" PARENT_SCOPE)\nendfunction ()\n\nfunction (expect_compile code)\n  generate_source(source \"${code}\")\n  check_cxx_source_compiles(\"${source}\" compiles)\n  if (NOT compiles)\n    set(error_msg \"Compile error for: ${code}\")\n  endif ()\n  # Unset the CMake cache variable compiles. Otherwise the compile test will\n  # just use cached information next time it runs.\n  unset(compiles CACHE)\n  if (error_msg)\n    message(FATAL_ERROR ${error_msg})\n  endif ()\nendfunction ()\n\nfunction (expect_compile_error code)\n  generate_source(source \"${code}\")\n  check_cxx_source_compiles(\"${source}\" compiles)\n  if (compiles)\n    set(error_msg \"No compile error for: ${code}\")\n  endif ()\n  # Unset the CMake cache variable compiles. Otherwise the compile test will\n  # just use cached information next time it runs.\n  unset(compiles CACHE)\n  if (error_msg)\n    message(FATAL_ERROR ${error_msg})\n  endif ()\nendfunction ()\n\n# check if the source file skeleton compiles\nexpect_compile(\"\")\n\n# Formatting a wide character with a narrow format string is forbidden.\nexpect_compile_error(\"fmt::format(\\\"{}\\\", L'a');\")\n\n# Formatting a wide string with a narrow format string is forbidden.\nexpect_compile_error(\"fmt::format(\\\"{}\\\", L\\\"foo\\\");\")\n\n# Formatting a narrow string with a wide format string is forbidden because\n# mixing UTF-8 with UTF-16/32 can result in an invalid output.\nexpect_compile_error(\"fmt::format(L\\\"{}\\\", \\\"foo\\\");\")\n\n# Formatting a wide string with a narrow format string is forbidden.\nexpect_compile_error(\"\n  struct S {\n    operator std::string() const { return std::string(); }\n  };\n  fmt::format(\\\"{}\\\", S());\n\")\n\n# Make sure that compiler features detected in the header\n# match the features detected in CMake.\nif (SUPPORTS_USER_DEFINED_LITERALS)\n  set(supports_udl 1)\nelse ()\n  set(supports_udl 0)\nendif ()\nexpect_compile(\"#if FMT_USE_USER_DEFINED_LITERALS != ${supports_udl}\n                # error\n                #endif\")\n"
  },
  {
    "path": "examples/libraries/fmt/test/compile-test.cc",
    "content": "// Formatting library for C++ - formatting library tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include \"fmt/compile.h\"\n\n#include <type_traits>\n\n#include \"fmt/chrono.h\"\n#include \"gmock/gmock.h\"\n#include \"gtest-extra.h\"\n\nTEST(iterator_test, counting_iterator) {\n  auto it = fmt::detail::counting_iterator();\n  auto prev = it++;\n  EXPECT_EQ(prev.count(), 0);\n  EXPECT_EQ(it.count(), 1);\n  EXPECT_EQ((it + 41).count(), 42);\n}\n\nTEST(iterator_test, truncating_iterator) {\n  char* p = nullptr;\n  auto it = fmt::detail::truncating_iterator<char*>(p, 3);\n  auto prev = it++;\n  EXPECT_EQ(prev.base(), p);\n  EXPECT_EQ(it.base(), p + 1);\n}\n\nTEST(iterator_test, truncating_iterator_default_construct) {\n  auto it = fmt::detail::truncating_iterator<char*>();\n  EXPECT_EQ(nullptr, it.base());\n  EXPECT_EQ(std::size_t{0}, it.count());\n}\n\n#ifdef __cpp_lib_ranges\nTEST(iterator_test, truncating_iterator_is_output_iterator) {\n  static_assert(\n      std::output_iterator<fmt::detail::truncating_iterator<char*>, char>);\n}\n#endif\n\nTEST(iterator_test, truncating_back_inserter) {\n  auto buffer = std::string();\n  auto bi = std::back_inserter(buffer);\n  auto it = fmt::detail::truncating_iterator<decltype(bi)>(bi, 2);\n  *it++ = '4';\n  *it++ = '2';\n  *it++ = '1';\n  EXPECT_EQ(buffer.size(), 2);\n  EXPECT_EQ(buffer, \"42\");\n}\n\nTEST(compile_test, compile_fallback) {\n  // FMT_COMPILE should fallback on runtime formatting when `if constexpr` is\n  // not available.\n  EXPECT_EQ(\"42\", fmt::format(FMT_COMPILE(\"{}\"), 42));\n}\n\n#ifdef __cpp_if_constexpr\nstruct test_formattable {};\n\nFMT_BEGIN_NAMESPACE\ntemplate <> struct formatter<test_formattable> : formatter<const char*> {\n  char word_spec = 'f';\n  constexpr auto parse(format_parse_context& ctx) {\n    auto it = ctx.begin(), end = ctx.end();\n    if (it == end || *it == '}') return it;\n    if (it != end && (*it == 'f' || *it == 'b')) word_spec = *it++;\n    if (it != end && *it != '}') throw format_error(\"invalid format\");\n    return it;\n  }\n  template <typename FormatContext>\n  constexpr auto format(test_formattable, FormatContext& ctx) const\n      -> decltype(ctx.out()) {\n    return formatter<const char*>::format(word_spec == 'f' ? \"foo\" : \"bar\",\n                                          ctx);\n  }\n};\nFMT_END_NAMESPACE\n\nTEST(compile_test, format_default) {\n  EXPECT_EQ(\"42\", fmt::format(FMT_COMPILE(\"{}\"), 42));\n  EXPECT_EQ(\"42\", fmt::format(FMT_COMPILE(\"{}\"), 42u));\n  EXPECT_EQ(\"42\", fmt::format(FMT_COMPILE(\"{}\"), 42ll));\n  EXPECT_EQ(\"42\", fmt::format(FMT_COMPILE(\"{}\"), 42ull));\n  EXPECT_EQ(\"true\", fmt::format(FMT_COMPILE(\"{}\"), true));\n  EXPECT_EQ(\"x\", fmt::format(FMT_COMPILE(\"{}\"), 'x'));\n  EXPECT_EQ(\"4.2\", fmt::format(FMT_COMPILE(\"{}\"), 4.2));\n  EXPECT_EQ(\"foo\", fmt::format(FMT_COMPILE(\"{}\"), \"foo\"));\n  EXPECT_EQ(\"foo\", fmt::format(FMT_COMPILE(\"{}\"), std::string(\"foo\")));\n  EXPECT_EQ(\"foo\", fmt::format(FMT_COMPILE(\"{}\"), test_formattable()));\n  auto t = std::chrono::system_clock::now();\n  EXPECT_EQ(fmt::format(\"{}\", t), fmt::format(FMT_COMPILE(\"{}\"), t));\n#  ifdef __cpp_lib_byte\n  EXPECT_EQ(\"42\", fmt::format(FMT_COMPILE(\"{}\"), std::byte{42}));\n#  endif\n}\n\nTEST(compile_test, format_wide_string) {\n  EXPECT_EQ(L\"42\", fmt::format(FMT_COMPILE(L\"{}\"), 42));\n}\n\nTEST(compile_test, format_specs) {\n  EXPECT_EQ(\"42\", fmt::format(FMT_COMPILE(\"{:x}\"), 0x42));\n  EXPECT_EQ(\"1.2 ms \",\n            fmt::format(FMT_COMPILE(\"{:7.1%Q %q}\"),\n                        std::chrono::duration<double, std::milli>(1.234)));\n}\n\nTEST(compile_test, dynamic_format_specs) {\n  EXPECT_EQ(\"foo  \", fmt::format(FMT_COMPILE(\"{:{}}\"), \"foo\", 5));\n  EXPECT_EQ(\"  3.14\", fmt::format(FMT_COMPILE(\"{:{}.{}f}\"), 3.141592, 6, 2));\n  EXPECT_EQ(\n      \"=1.234ms=\",\n      fmt::format(FMT_COMPILE(\"{:=^{}.{}}\"),\n                  std::chrono::duration<double, std::milli>(1.234), 9, 3));\n}\n\nTEST(compile_test, manual_ordering) {\n  EXPECT_EQ(\"42\", fmt::format(FMT_COMPILE(\"{0}\"), 42));\n  EXPECT_EQ(\" -42\", fmt::format(FMT_COMPILE(\"{0:4}\"), -42));\n  EXPECT_EQ(\"41 43\", fmt::format(FMT_COMPILE(\"{0} {1}\"), 41, 43));\n  EXPECT_EQ(\"41 43\", fmt::format(FMT_COMPILE(\"{1} {0}\"), 43, 41));\n  EXPECT_EQ(\"41 43\", fmt::format(FMT_COMPILE(\"{0} {2}\"), 41, 42, 43));\n  EXPECT_EQ(\"  41   43\", fmt::format(FMT_COMPILE(\"{1:{2}} {0:4}\"), 43, 41, 4));\n  EXPECT_EQ(\"42 1.2 ms \",\n            fmt::format(FMT_COMPILE(\"{0} {1:7.1%Q %q}\"), 42,\n                        std::chrono::duration<double, std::milli>(1.234)));\n  EXPECT_EQ(\n      \"true 42 42 foo 0x1234 foo\",\n      fmt::format(FMT_COMPILE(\"{0} {1} {2} {3} {4} {5}\"), true, 42, 42.0f,\n                  \"foo\", reinterpret_cast<void*>(0x1234), test_formattable()));\n  EXPECT_EQ(L\"42\", fmt::format(FMT_COMPILE(L\"{0}\"), 42));\n}\n\nTEST(compile_test, named) {\n  auto runtime_named_field_compiled =\n      fmt::detail::compile<decltype(fmt::arg(\"arg\", 42))>(FMT_COMPILE(\"{arg}\"));\n  static_assert(std::is_same_v<decltype(runtime_named_field_compiled),\n                               fmt::detail::runtime_named_field<char>>);\n\n  EXPECT_EQ(\"42\", fmt::format(FMT_COMPILE(\"{}\"), fmt::arg(\"arg\", 42)));\n  EXPECT_EQ(\"41 43\", fmt::format(FMT_COMPILE(\"{} {}\"), fmt::arg(\"arg\", 41),\n                                 fmt::arg(\"arg\", 43)));\n\n  EXPECT_EQ(\"foobar\",\n            fmt::format(FMT_COMPILE(\"{a0}{a1}\"), fmt::arg(\"a0\", \"foo\"),\n                        fmt::arg(\"a1\", \"bar\")));\n  EXPECT_EQ(\"foobar\", fmt::format(FMT_COMPILE(\"{}{a1}\"), fmt::arg(\"a0\", \"foo\"),\n                                  fmt::arg(\"a1\", \"bar\")));\n  EXPECT_EQ(\"foofoo\", fmt::format(FMT_COMPILE(\"{a0}{}\"), fmt::arg(\"a0\", \"foo\"),\n                                  fmt::arg(\"a1\", \"bar\")));\n  EXPECT_EQ(\"foobar\", fmt::format(FMT_COMPILE(\"{0}{a1}\"), fmt::arg(\"a0\", \"foo\"),\n                                  fmt::arg(\"a1\", \"bar\")));\n  EXPECT_EQ(\"foobar\", fmt::format(FMT_COMPILE(\"{a0}{1}\"), fmt::arg(\"a0\", \"foo\"),\n                                  fmt::arg(\"a1\", \"bar\")));\n\n  EXPECT_EQ(\"foobar\",\n            fmt::format(FMT_COMPILE(\"{}{a1}\"), \"foo\", fmt::arg(\"a1\", \"bar\")));\n  EXPECT_EQ(\"foobar\",\n            fmt::format(FMT_COMPILE(\"{a0}{a1}\"), fmt::arg(\"a1\", \"bar\"),\n                        fmt::arg(\"a2\", \"baz\"), fmt::arg(\"a0\", \"foo\")));\n  EXPECT_EQ(\" bar foo \",\n            fmt::format(FMT_COMPILE(\" {foo} {bar} \"), fmt::arg(\"foo\", \"bar\"),\n                        fmt::arg(\"bar\", \"foo\")));\n\n  EXPECT_THROW(fmt::format(FMT_COMPILE(\"{invalid}\"), fmt::arg(\"valid\", 42)),\n               fmt::format_error);\n\n#  if FMT_USE_NONTYPE_TEMPLATE_PARAMETERS\n  using namespace fmt::literals;\n  auto statically_named_field_compiled =\n      fmt::detail::compile<decltype(\"arg\"_a = 42)>(FMT_COMPILE(\"{arg}\"));\n  static_assert(std::is_same_v<decltype(statically_named_field_compiled),\n                               fmt::detail::field<char, int, 0>>);\n\n  EXPECT_EQ(\"41 43\",\n            fmt::format(FMT_COMPILE(\"{a0} {a1}\"), \"a0\"_a = 41, \"a1\"_a = 43));\n  EXPECT_EQ(\"41 43\",\n            fmt::format(FMT_COMPILE(\"{a1} {a0}\"), \"a0\"_a = 43, \"a1\"_a = 41));\n#  endif\n}\n\nTEST(compile_test, format_to) {\n  char buf[8];\n  auto end = fmt::format_to(buf, FMT_COMPILE(\"{}\"), 42);\n  *end = '\\0';\n  EXPECT_STREQ(\"42\", buf);\n  end = fmt::format_to(buf, FMT_COMPILE(\"{:x}\"), 42);\n  *end = '\\0';\n  EXPECT_STREQ(\"2a\", buf);\n}\n\nTEST(compile_test, format_to_n) {\n  constexpr auto buffer_size = 8;\n  char buffer[buffer_size];\n  auto res = fmt::format_to_n(buffer, buffer_size, FMT_COMPILE(\"{}\"), 42);\n  *res.out = '\\0';\n  EXPECT_STREQ(\"42\", buffer);\n  res = fmt::format_to_n(buffer, buffer_size, FMT_COMPILE(\"{:x}\"), 42);\n  *res.out = '\\0';\n  EXPECT_STREQ(\"2a\", buffer);\n}\n\nTEST(compile_test, formatted_size) {\n  EXPECT_EQ(2, fmt::formatted_size(FMT_COMPILE(\"{0}\"), 42));\n  EXPECT_EQ(5, fmt::formatted_size(FMT_COMPILE(\"{0:<4.2f}\"), 42.0));\n}\n\nTEST(compile_test, text_and_arg) {\n  EXPECT_EQ(\">>>42<<<\", fmt::format(FMT_COMPILE(\">>>{}<<<\"), 42));\n  EXPECT_EQ(\"42!\", fmt::format(FMT_COMPILE(\"{}!\"), 42));\n}\n\nTEST(compile_test, unknown_format_fallback) {\n  EXPECT_EQ(\" 42 \",\n            fmt::format(FMT_COMPILE(\"{name:^4}\"), fmt::arg(\"name\", 42)));\n\n  std::vector<char> v;\n  fmt::format_to(std::back_inserter(v), FMT_COMPILE(\"{name:^4}\"),\n                 fmt::arg(\"name\", 42));\n  EXPECT_EQ(\" 42 \", fmt::string_view(v.data(), v.size()));\n\n  char buffer[4];\n  auto result = fmt::format_to_n(buffer, 4, FMT_COMPILE(\"{name:^5}\"),\n                                 fmt::arg(\"name\", 42));\n  EXPECT_EQ(5u, result.size);\n  EXPECT_EQ(buffer + 4, result.out);\n  EXPECT_EQ(\" 42 \", fmt::string_view(buffer, 4));\n}\n\nTEST(compile_test, empty) { EXPECT_EQ(\"\", fmt::format(FMT_COMPILE(\"\"))); }\n\nstruct to_stringable {\n  friend fmt::string_view to_string_view(to_stringable) { return {}; }\n};\n\nFMT_BEGIN_NAMESPACE\ntemplate <> struct formatter<to_stringable> {\n  auto parse(format_parse_context& ctx) const -> decltype(ctx.begin()) {\n    return ctx.begin();\n  }\n\n  template <typename FormatContext>\n  auto format(const to_stringable&, FormatContext& ctx) -> decltype(ctx.out()) {\n    return ctx.out();\n  }\n};\nFMT_END_NAMESPACE\n\nTEST(compile_test, to_string_and_formatter) {\n  fmt::format(FMT_COMPILE(\"{}\"), to_stringable());\n}\n\nTEST(compile_test, print) {\n  EXPECT_WRITE(stdout, fmt::print(FMT_COMPILE(\"Don't {}!\"), \"panic\"),\n               \"Don't panic!\");\n  EXPECT_WRITE(stderr, fmt::print(stderr, FMT_COMPILE(\"Don't {}!\"), \"panic\"),\n               \"Don't panic!\");\n}\n#endif\n\n#if FMT_USE_NONTYPE_TEMPLATE_PARAMETERS\nTEST(compile_test, compile_format_string_literal) {\n  using namespace fmt::literals;\n  EXPECT_EQ(\"\", fmt::format(\"\"_cf));\n  EXPECT_EQ(\"42\", fmt::format(\"{}\"_cf, 42));\n  EXPECT_EQ(L\"42\", fmt::format(L\"{}\"_cf, 42));\n}\n#endif\n\n#if __cplusplus >= 202002L || \\\n    (__cplusplus >= 201709L && FMT_GCC_VERSION >= 1002)\ntemplate <size_t max_string_length, typename Char = char> struct test_string {\n  template <typename T> constexpr bool operator==(const T& rhs) const noexcept {\n    return fmt::basic_string_view<Char>(rhs).compare(buffer) == 0;\n  }\n  Char buffer[max_string_length]{};\n};\n\ntemplate <size_t max_string_length, typename Char = char, typename... Args>\nconsteval auto test_format(auto format, const Args&... args) {\n  test_string<max_string_length, Char> string{};\n  fmt::format_to(string.buffer, format, args...);\n  return string;\n}\n\nTEST(compile_time_formatting_test, bool) {\n  EXPECT_EQ(\"true\", test_format<5>(FMT_COMPILE(\"{}\"), true));\n  EXPECT_EQ(\"false\", test_format<6>(FMT_COMPILE(\"{}\"), false));\n  EXPECT_EQ(\"true \", test_format<6>(FMT_COMPILE(\"{:5}\"), true));\n  EXPECT_EQ(\"1\", test_format<2>(FMT_COMPILE(\"{:d}\"), true));\n}\n\nTEST(compile_time_formatting_test, integer) {\n  EXPECT_EQ(\"42\", test_format<3>(FMT_COMPILE(\"{}\"), 42));\n  EXPECT_EQ(\"420\", test_format<4>(FMT_COMPILE(\"{}\"), 420));\n  EXPECT_EQ(\"42 42\", test_format<6>(FMT_COMPILE(\"{} {}\"), 42, 42));\n  EXPECT_EQ(\"42 42\",\n            test_format<6>(FMT_COMPILE(\"{} {}\"), uint32_t{42}, uint64_t{42}));\n\n  EXPECT_EQ(\"+42\", test_format<4>(FMT_COMPILE(\"{:+}\"), 42));\n  EXPECT_EQ(\"42\", test_format<3>(FMT_COMPILE(\"{:-}\"), 42));\n  EXPECT_EQ(\" 42\", test_format<4>(FMT_COMPILE(\"{: }\"), 42));\n\n  EXPECT_EQ(\"-0042\", test_format<6>(FMT_COMPILE(\"{:05}\"), -42));\n\n  EXPECT_EQ(\"101010\", test_format<7>(FMT_COMPILE(\"{:b}\"), 42));\n  EXPECT_EQ(\"0b101010\", test_format<9>(FMT_COMPILE(\"{:#b}\"), 42));\n  EXPECT_EQ(\"0B101010\", test_format<9>(FMT_COMPILE(\"{:#B}\"), 42));\n  EXPECT_EQ(\"042\", test_format<4>(FMT_COMPILE(\"{:#o}\"), 042));\n  EXPECT_EQ(\"0x4a\", test_format<5>(FMT_COMPILE(\"{:#x}\"), 0x4a));\n  EXPECT_EQ(\"0X4A\", test_format<5>(FMT_COMPILE(\"{:#X}\"), 0x4a));\n\n  EXPECT_EQ(\"   42\", test_format<6>(FMT_COMPILE(\"{:5}\"), 42));\n  EXPECT_EQ(\"   42\", test_format<6>(FMT_COMPILE(\"{:5}\"), 42ll));\n  EXPECT_EQ(\"   42\", test_format<6>(FMT_COMPILE(\"{:5}\"), 42ull));\n\n  EXPECT_EQ(\"42  \", test_format<5>(FMT_COMPILE(\"{:<4}\"), 42));\n  EXPECT_EQ(\"  42\", test_format<5>(FMT_COMPILE(\"{:>4}\"), 42));\n  EXPECT_EQ(\" 42 \", test_format<5>(FMT_COMPILE(\"{:^4}\"), 42));\n  EXPECT_EQ(\"**-42\", test_format<6>(FMT_COMPILE(\"{:*>5}\"), -42));\n}\n\nTEST(compile_time_formatting_test, char) {\n  EXPECT_EQ(\"c\", test_format<2>(FMT_COMPILE(\"{}\"), 'c'));\n\n  EXPECT_EQ(\"c  \", test_format<4>(FMT_COMPILE(\"{:3}\"), 'c'));\n  EXPECT_EQ(\"99\", test_format<3>(FMT_COMPILE(\"{:d}\"), 'c'));\n}\n\nTEST(compile_time_formatting_test, string) {\n  EXPECT_EQ(\"42\", test_format<3>(FMT_COMPILE(\"{}\"), \"42\"));\n  EXPECT_EQ(\"The answer is 42\",\n            test_format<17>(FMT_COMPILE(\"{} is {}\"), \"The answer\", \"42\"));\n\n  EXPECT_EQ(\"abc**\", test_format<6>(FMT_COMPILE(\"{:*<5}\"), \"abc\"));\n  EXPECT_EQ(\"**🤡**\", test_format<9>(FMT_COMPILE(\"{:*^6}\"), \"🤡\"));\n}\n\nTEST(compile_time_formatting_test, combination) {\n  EXPECT_EQ(\"420, true, answer\",\n            test_format<18>(FMT_COMPILE(\"{}, {}, {}\"), 420, true, \"answer\"));\n\n  EXPECT_EQ(\" -42\", test_format<5>(FMT_COMPILE(\"{:{}}\"), -42, 4));\n}\n\nTEST(compile_time_formatting_test, custom_type) {\n  EXPECT_EQ(\"foo\", test_format<4>(FMT_COMPILE(\"{}\"), test_formattable()));\n  EXPECT_EQ(\"bar\", test_format<4>(FMT_COMPILE(\"{:b}\"), test_formattable()));\n}\n\nTEST(compile_time_formatting_test, multibyte_fill) {\n  EXPECT_EQ(\"жж42\", test_format<8>(FMT_COMPILE(\"{:ж>4}\"), 42));\n}\n#endif\n"
  },
  {
    "path": "examples/libraries/fmt/test/core-test.cc",
    "content": "// Formatting library for C++ - core tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n// clang-format off\n#include \"test-assert.h\"\n// clang-format on\n\n#include \"fmt/core.h\"\n\n#include <algorithm>    // std::copy_n\n#include <climits>      // INT_MAX\n#include <cstring>      // std::strlen\n#include <functional>   // std::equal_to\n#include <iterator>     // std::back_insert_iterator\n#include <limits>       // std::numeric_limits\n#include <string>       // std::string\n#include <type_traits>  // std::is_same\n\n#include \"gmock/gmock.h\"\n\nusing fmt::string_view;\nusing fmt::detail::buffer;\n\nusing testing::_;\nusing testing::Invoke;\nusing testing::Return;\n\n#ifdef FMT_FORMAT_H_\n#  error core-test includes format.h\n#endif\n\nTEST(string_view_test, value_type) {\n  static_assert(std::is_same<string_view::value_type, char>::value, \"\");\n}\n\nTEST(string_view_test, ctor) {\n  EXPECT_STREQ(\"abc\", fmt::string_view(\"abc\").data());\n  EXPECT_EQ(3u, fmt::string_view(\"abc\").size());\n\n  EXPECT_STREQ(\"defg\", fmt::string_view(std::string(\"defg\")).data());\n  EXPECT_EQ(4u, fmt::string_view(std::string(\"defg\")).size());\n}\n\nTEST(string_view_test, length) {\n  // Test that string_view::size() returns string length, not buffer size.\n  char str[100] = \"some string\";\n  EXPECT_EQ(std::strlen(str), string_view(str).size());\n  EXPECT_LT(std::strlen(str), sizeof(str));\n}\n\n// Check string_view's comparison operator.\ntemplate <template <typename> class Op> void check_op() {\n  const char* inputs[] = {\"foo\", \"fop\", \"fo\"};\n  size_t num_inputs = sizeof(inputs) / sizeof(*inputs);\n  for (size_t i = 0; i < num_inputs; ++i) {\n    for (size_t j = 0; j < num_inputs; ++j) {\n      string_view lhs(inputs[i]), rhs(inputs[j]);\n      EXPECT_EQ(Op<int>()(lhs.compare(rhs), 0), Op<string_view>()(lhs, rhs));\n    }\n  }\n}\n\nTEST(string_view_test, compare) {\n  EXPECT_EQ(string_view(\"foo\").compare(string_view(\"foo\")), 0);\n  EXPECT_GT(string_view(\"fop\").compare(string_view(\"foo\")), 0);\n  EXPECT_LT(string_view(\"foo\").compare(string_view(\"fop\")), 0);\n  EXPECT_GT(string_view(\"foo\").compare(string_view(\"fo\")), 0);\n  EXPECT_LT(string_view(\"fo\").compare(string_view(\"foo\")), 0);\n  check_op<std::equal_to>();\n  check_op<std::not_equal_to>();\n  check_op<std::less>();\n  check_op<std::less_equal>();\n  check_op<std::greater>();\n  check_op<std::greater_equal>();\n}\n\nnamespace test_ns {\ntemplate <typename Char> class test_string {\n private:\n  std::basic_string<Char> s_;\n\n public:\n  test_string(const Char* s) : s_(s) {}\n  const Char* data() const { return s_.data(); }\n  size_t length() const { return s_.size(); }\n  operator const Char*() const { return s_.c_str(); }\n};\n\ntemplate <typename Char>\nfmt::basic_string_view<Char> to_string_view(const test_string<Char>& s) {\n  return {s.data(), s.length()};\n}\n}  // namespace test_ns\n\nTEST(core_test, is_output_iterator) {\n  EXPECT_TRUE((fmt::detail::is_output_iterator<char*, char>::value));\n  EXPECT_FALSE((fmt::detail::is_output_iterator<const char*, char>::value));\n  EXPECT_FALSE((fmt::detail::is_output_iterator<std::string, char>::value));\n  EXPECT_TRUE(\n      (fmt::detail::is_output_iterator<std::back_insert_iterator<std::string>,\n                                       char>::value));\n  EXPECT_TRUE(\n      (fmt::detail::is_output_iterator<std::string::iterator, char>::value));\n  EXPECT_FALSE((fmt::detail::is_output_iterator<std::string::const_iterator,\n                                                char>::value));\n}\n\nTEST(core_test, buffer_appender) {\n  // back_insert_iterator is not default-constructible before C++20, so\n  // buffer_appender can only be default-constructible when back_insert_iterator\n  // is.\n  static_assert(\n      std::is_default_constructible<\n          std::back_insert_iterator<fmt::detail::buffer<char>>>::value ==\n          std::is_default_constructible<\n              fmt::detail::buffer_appender<char>>::value,\n      \"\");\n\n#ifdef __cpp_lib_ranges\n  static_assert(std::output_iterator<fmt::detail::buffer_appender<char>, char>);\n#endif\n}\n\n#if !FMT_GCC_VERSION || FMT_GCC_VERSION >= 470\nTEST(buffer_test, noncopyable) {\n  EXPECT_FALSE(std::is_copy_constructible<buffer<char>>::value);\n#  if !FMT_MSC_VER\n  // std::is_copy_assignable is broken in MSVC2013.\n  EXPECT_FALSE(std::is_copy_assignable<buffer<char>>::value);\n#  endif\n}\n\nTEST(buffer_test, nonmoveable) {\n  EXPECT_FALSE(std::is_move_constructible<buffer<char>>::value);\n#  if !FMT_MSC_VER\n  // std::is_move_assignable is broken in MSVC2013.\n  EXPECT_FALSE(std::is_move_assignable<buffer<char>>::value);\n#  endif\n}\n#endif\n\nTEST(buffer_test, indestructible) {\n  static_assert(!std::is_destructible<fmt::detail::buffer<int>>(),\n                \"buffer's destructor is protected\");\n}\n\ntemplate <typename T> struct mock_buffer final : buffer<T> {\n  MOCK_METHOD1(do_grow, size_t(size_t capacity));\n\n  void grow(size_t capacity) { this->set(this->data(), do_grow(capacity)); }\n\n  mock_buffer(T* data = nullptr, size_t buf_capacity = 0) {\n    this->set(data, buf_capacity);\n    ON_CALL(*this, do_grow(_)).WillByDefault(Invoke([](size_t capacity) {\n      return capacity;\n    }));\n  }\n};\n\nTEST(buffer_test, ctor) {\n  {\n    mock_buffer<int> buffer;\n    EXPECT_EQ(nullptr, buffer.data());\n    EXPECT_EQ(static_cast<size_t>(0), buffer.size());\n    EXPECT_EQ(static_cast<size_t>(0), buffer.capacity());\n  }\n  {\n    int dummy;\n    mock_buffer<int> buffer(&dummy);\n    EXPECT_EQ(&dummy, &buffer[0]);\n    EXPECT_EQ(static_cast<size_t>(0), buffer.size());\n    EXPECT_EQ(static_cast<size_t>(0), buffer.capacity());\n  }\n  {\n    int dummy;\n    size_t capacity = std::numeric_limits<size_t>::max();\n    mock_buffer<int> buffer(&dummy, capacity);\n    EXPECT_EQ(&dummy, &buffer[0]);\n    EXPECT_EQ(static_cast<size_t>(0), buffer.size());\n    EXPECT_EQ(capacity, buffer.capacity());\n  }\n}\n\nTEST(buffer_test, access) {\n  char data[10];\n  mock_buffer<char> buffer(data, sizeof(data));\n  buffer[0] = 11;\n  EXPECT_EQ(11, buffer[0]);\n  buffer[3] = 42;\n  EXPECT_EQ(42, *(&buffer[0] + 3));\n  const fmt::detail::buffer<char>& const_buffer = buffer;\n  EXPECT_EQ(42, const_buffer[3]);\n}\n\nTEST(buffer_test, try_resize) {\n  char data[123];\n  mock_buffer<char> buffer(data, sizeof(data));\n  buffer[10] = 42;\n  EXPECT_EQ(42, buffer[10]);\n  buffer.try_resize(20);\n  EXPECT_EQ(20u, buffer.size());\n  EXPECT_EQ(123u, buffer.capacity());\n  EXPECT_EQ(42, buffer[10]);\n  buffer.try_resize(5);\n  EXPECT_EQ(5u, buffer.size());\n  EXPECT_EQ(123u, buffer.capacity());\n  EXPECT_EQ(42, buffer[10]);\n  // Check if try_resize calls grow.\n  EXPECT_CALL(buffer, do_grow(124));\n  buffer.try_resize(124);\n  EXPECT_CALL(buffer, do_grow(200));\n  buffer.try_resize(200);\n}\n\nTEST(buffer_test, try_resize_partial) {\n  char data[10];\n  mock_buffer<char> buffer(data, sizeof(data));\n  EXPECT_CALL(buffer, do_grow(20)).WillOnce(Return(15));\n  buffer.try_resize(20);\n  EXPECT_EQ(buffer.capacity(), 15);\n  EXPECT_EQ(buffer.size(), 15);\n}\n\nTEST(buffer_test, clear) {\n  mock_buffer<char> buffer;\n  EXPECT_CALL(buffer, do_grow(20));\n  buffer.try_resize(20);\n  buffer.try_resize(0);\n  EXPECT_EQ(static_cast<size_t>(0), buffer.size());\n  EXPECT_EQ(20u, buffer.capacity());\n}\n\nTEST(buffer_test, append) {\n  char data[15];\n  mock_buffer<char> buffer(data, 10);\n  auto test = \"test\";\n  buffer.append(test, test + 5);\n  EXPECT_STREQ(test, &buffer[0]);\n  EXPECT_EQ(5u, buffer.size());\n  buffer.try_resize(10);\n  EXPECT_CALL(buffer, do_grow(12));\n  buffer.append(test, test + 2);\n  EXPECT_EQ('t', buffer[10]);\n  EXPECT_EQ('e', buffer[11]);\n  EXPECT_EQ(12u, buffer.size());\n}\n\nTEST(buffer_test, append_partial) {\n  char data[10];\n  mock_buffer<char> buffer(data, sizeof(data));\n  testing::InSequence seq;\n  EXPECT_CALL(buffer, do_grow(15)).WillOnce(Return(10));\n  EXPECT_CALL(buffer, do_grow(15)).WillOnce(Invoke([&buffer](size_t) {\n    EXPECT_EQ(fmt::string_view(buffer.data(), buffer.size()), \"0123456789\");\n    buffer.clear();\n    return 10;\n  }));\n  auto test = \"0123456789abcde\";\n  buffer.append(test, test + 15);\n}\n\nTEST(buffer_test, append_allocates_enough_storage) {\n  char data[19];\n  mock_buffer<char> buffer(data, 10);\n  auto test = \"abcdefgh\";\n  buffer.try_resize(10);\n  EXPECT_CALL(buffer, do_grow(19));\n  buffer.append(test, test + 9);\n}\n\nstruct custom_context {\n  using char_type = char;\n  using parse_context_type = fmt::format_parse_context;\n\n  bool called = false;\n\n  template <typename T> struct formatter_type {\n    auto parse(fmt::format_parse_context& ctx) -> decltype(ctx.begin()) {\n      return ctx.begin();\n    }\n\n    const char* format(const T&, custom_context& ctx) {\n      ctx.called = true;\n      return nullptr;\n    }\n  };\n\n  void advance_to(const char*) {}\n};\n\nstruct test_struct {};\n\nFMT_BEGIN_NAMESPACE\ntemplate <typename Char> struct formatter<test_struct, Char> {\n  auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {\n    return ctx.begin();\n  }\n\n  auto format(test_struct, format_context& ctx) -> decltype(ctx.out()) {\n    auto test = string_view(\"test\");\n    return std::copy_n(test.data(), test.size(), ctx.out());\n  }\n};\nFMT_END_NAMESPACE\n\nTEST(arg_test, format_args) {\n  auto args = fmt::format_args();\n  EXPECT_FALSE(args.get(1));\n}\n\nTEST(arg_test, make_value_with_custom_context) {\n  auto t = test_struct();\n  fmt::detail::value<custom_context> arg(\n      fmt::detail::arg_mapper<custom_context>().map(t));\n  auto ctx = custom_context();\n  auto parse_ctx = fmt::format_parse_context(\"\");\n  arg.custom.format(&t, parse_ctx, ctx);\n  EXPECT_TRUE(ctx.called);\n}\n\n// Use a unique result type to make sure that there are no undesirable\n// conversions.\nstruct test_result {};\n\ntemplate <typename T> struct mock_visitor {\n  template <typename U> struct result { using type = test_result; };\n\n  mock_visitor() {\n    ON_CALL(*this, visit(_)).WillByDefault(Return(test_result()));\n  }\n\n  MOCK_METHOD1_T(visit, test_result(T value));\n  MOCK_METHOD0_T(unexpected, void());\n\n  test_result operator()(T value) { return visit(value); }\n\n  template <typename U> test_result operator()(U) {\n    unexpected();\n    return test_result();\n  }\n};\n\ntemplate <typename T> struct visit_type { using type = T; };\n\n#define VISIT_TYPE(type_, visit_type_) \\\n  template <> struct visit_type<type_> { using type = visit_type_; }\n\nVISIT_TYPE(signed char, int);\nVISIT_TYPE(unsigned char, unsigned);\nVISIT_TYPE(short, int);\nVISIT_TYPE(unsigned short, unsigned);\n\n#if LONG_MAX == INT_MAX\nVISIT_TYPE(long, int);\nVISIT_TYPE(unsigned long, unsigned);\n#else\nVISIT_TYPE(long, long long);\nVISIT_TYPE(unsigned long, unsigned long long);\n#endif\n\n#define CHECK_ARG(Char, expected, value)                                  \\\n  {                                                                       \\\n    testing::StrictMock<mock_visitor<decltype(expected)>> visitor;        \\\n    EXPECT_CALL(visitor, visit(expected));                                \\\n    using iterator = std::back_insert_iterator<buffer<Char>>;             \\\n    fmt::visit_format_arg(                                                \\\n        visitor,                                                          \\\n        fmt::detail::make_arg<fmt::basic_format_context<iterator, Char>>( \\\n            value));                                                      \\\n  }\n\n#define CHECK_ARG_SIMPLE(value)                             \\\n  {                                                         \\\n    using value_type = decltype(value);                     \\\n    typename visit_type<value_type>::type expected = value; \\\n    CHECK_ARG(char, expected, value)                        \\\n    CHECK_ARG(wchar_t, expected, value)                     \\\n  }\n\ntemplate <typename T> class numeric_arg_test : public testing::Test {};\n\nusing types =\n    testing::Types<bool, signed char, unsigned char, short, unsigned short, int,\n                   unsigned, long, unsigned long, long long, unsigned long long,\n                   float, double, long double>;\nTYPED_TEST_SUITE(numeric_arg_test, types);\n\ntemplate <typename T, fmt::enable_if_t<std::is_integral<T>::value, int> = 0>\nT test_value() {\n  return static_cast<T>(42);\n}\n\ntemplate <typename T,\n          fmt::enable_if_t<std::is_floating_point<T>::value, int> = 0>\nT test_value() {\n  return static_cast<T>(4.2);\n}\n\nTYPED_TEST(numeric_arg_test, make_and_visit) {\n  CHECK_ARG_SIMPLE(test_value<TypeParam>());\n  CHECK_ARG_SIMPLE(std::numeric_limits<TypeParam>::min());\n  CHECK_ARG_SIMPLE(std::numeric_limits<TypeParam>::max());\n}\n\nnamespace fmt {\ntemplate <> struct is_char<wchar_t> : std::true_type {};\n}  // namespace fmt\n\nTEST(arg_test, char_arg) {\n  CHECK_ARG(char, 'a', 'a');\n  CHECK_ARG(wchar_t, L'a', 'a');\n  CHECK_ARG(wchar_t, L'a', L'a');\n}\n\nTEST(arg_test, string_arg) {\n  char str_data[] = \"test\";\n  char* str = str_data;\n  const char* cstr = str;\n  CHECK_ARG(char, cstr, str);\n\n  auto sv = fmt::string_view(str);\n  CHECK_ARG(char, sv, std::string(str));\n}\n\nTEST(arg_test, wstring_arg) {\n  wchar_t str_data[] = L\"test\";\n  wchar_t* str = str_data;\n  const wchar_t* cstr = str;\n\n  auto sv = fmt::basic_string_view<wchar_t>(str);\n  CHECK_ARG(wchar_t, cstr, str);\n  CHECK_ARG(wchar_t, cstr, cstr);\n  CHECK_ARG(wchar_t, sv, std::wstring(str));\n  CHECK_ARG(wchar_t, sv, fmt::basic_string_view<wchar_t>(str));\n}\n\nTEST(arg_test, pointer_arg) {\n  void* p = nullptr;\n  const void* cp = nullptr;\n  CHECK_ARG(char, cp, p);\n  CHECK_ARG(wchar_t, cp, p);\n  CHECK_ARG_SIMPLE(cp);\n}\n\nstruct check_custom {\n  test_result operator()(\n      fmt::basic_format_arg<fmt::format_context>::handle h) const {\n    struct test_buffer final : fmt::detail::buffer<char> {\n      char data[10];\n      test_buffer() : fmt::detail::buffer<char>(data, 0, 10) {}\n      void grow(size_t) {}\n    } buffer;\n    auto parse_ctx = fmt::format_parse_context(\"\");\n    auto ctx = fmt::format_context(fmt::detail::buffer_appender<char>(buffer),\n                                   fmt::format_args());\n    h.format(parse_ctx, ctx);\n    EXPECT_EQ(\"test\", std::string(buffer.data, buffer.size()));\n    return test_result();\n  }\n};\n\nTEST(arg_test, custom_arg) {\n  auto test = test_struct();\n  using visitor =\n      mock_visitor<fmt::basic_format_arg<fmt::format_context>::handle>;\n  testing::StrictMock<visitor> v;\n  EXPECT_CALL(v, visit(_)).WillOnce(Invoke(check_custom()));\n  fmt::visit_format_arg(v, fmt::detail::make_arg<fmt::format_context>(test));\n}\n\nTEST(arg_test, visit_invalid_arg) {\n  testing::StrictMock<mock_visitor<fmt::monostate>> visitor;\n  EXPECT_CALL(visitor, visit(_));\n  auto arg = fmt::basic_format_arg<fmt::format_context>();\n  fmt::visit_format_arg(visitor, arg);\n}\n\n#if FMT_USE_CONSTEXPR\n\nenum class arg_id_result { none, empty, index, name, error };\nstruct test_arg_id_handler {\n  arg_id_result res = arg_id_result::none;\n  int index = 0;\n  string_view name;\n\n  constexpr void operator()() { res = arg_id_result::empty; }\n\n  constexpr void operator()(int i) {\n    res = arg_id_result::index;\n    index = i;\n  }\n\n  constexpr void operator()(string_view n) {\n    res = arg_id_result::name;\n    name = n;\n  }\n\n  constexpr void on_error(const char*) { res = arg_id_result::error; }\n};\n\ntemplate <size_t N>\nconstexpr test_arg_id_handler parse_arg_id(const char (&s)[N]) {\n  test_arg_id_handler h;\n  fmt::detail::parse_arg_id(s, s + N, h);\n  return h;\n}\n\nTEST(format_test, constexpr_parse_arg_id) {\n  static_assert(parse_arg_id(\":\").res == arg_id_result::empty, \"\");\n  static_assert(parse_arg_id(\"}\").res == arg_id_result::empty, \"\");\n  static_assert(parse_arg_id(\"42:\").res == arg_id_result::index, \"\");\n  static_assert(parse_arg_id(\"42:\").index == 42, \"\");\n  static_assert(parse_arg_id(\"foo:\").res == arg_id_result::name, \"\");\n  static_assert(parse_arg_id(\"foo:\").name.size() == 3, \"\");\n  static_assert(parse_arg_id(\"!\").res == arg_id_result::error, \"\");\n}\n\nstruct test_format_specs_handler {\n  enum result { none, hash, zero, loc, error };\n  result res = none;\n\n  fmt::align_t alignment = fmt::align::none;\n  fmt::sign_t sign = fmt::sign::none;\n  char fill = 0;\n  int width = 0;\n  fmt::detail::arg_ref<char> width_ref;\n  int precision = 0;\n  fmt::detail::arg_ref<char> precision_ref;\n  char type = 0;\n\n  // Workaround for MSVC2017 bug that results in \"expression did not evaluate\n  // to a constant\" with compiler-generated copy ctor.\n  constexpr test_format_specs_handler() {}\n  constexpr test_format_specs_handler(const test_format_specs_handler& other) =\n      default;\n\n  constexpr void on_align(fmt::align_t a) { alignment = a; }\n  constexpr void on_fill(fmt::string_view f) { fill = f[0]; }\n  constexpr void on_sign(fmt::sign_t s) { sign = s; }\n  constexpr void on_hash() { res = hash; }\n  constexpr void on_zero() { res = zero; }\n  constexpr void on_localized() { res = loc; }\n\n  constexpr void on_width(int w) { width = w; }\n  constexpr void on_dynamic_width(fmt::detail::auto_id) {}\n  constexpr void on_dynamic_width(int index) { width_ref = index; }\n  constexpr void on_dynamic_width(string_view) {}\n\n  constexpr void on_precision(int p) { precision = p; }\n  constexpr void on_dynamic_precision(fmt::detail::auto_id) {}\n  constexpr void on_dynamic_precision(int index) { precision_ref = index; }\n  constexpr void on_dynamic_precision(string_view) {}\n\n  constexpr void end_precision() {}\n  constexpr void on_type(char t) { type = t; }\n  constexpr void on_error(const char*) { res = error; }\n};\n\ntemplate <size_t N>\nconstexpr test_format_specs_handler parse_test_specs(const char (&s)[N]) {\n  auto h = test_format_specs_handler();\n  fmt::detail::parse_format_specs(s, s + N, h);\n  return h;\n}\n\nTEST(core_test, constexpr_parse_format_specs) {\n  using handler = test_format_specs_handler;\n  static_assert(parse_test_specs(\"<\").alignment == fmt::align::left, \"\");\n  static_assert(parse_test_specs(\"*^\").fill == '*', \"\");\n  static_assert(parse_test_specs(\"+\").sign == fmt::sign::plus, \"\");\n  static_assert(parse_test_specs(\"-\").sign == fmt::sign::minus, \"\");\n  static_assert(parse_test_specs(\" \").sign == fmt::sign::space, \"\");\n  static_assert(parse_test_specs(\"#\").res == handler::hash, \"\");\n  static_assert(parse_test_specs(\"0\").res == handler::zero, \"\");\n  static_assert(parse_test_specs(\"L\").res == handler::loc, \"\");\n  static_assert(parse_test_specs(\"42\").width == 42, \"\");\n  static_assert(parse_test_specs(\"{42}\").width_ref.val.index == 42, \"\");\n  static_assert(parse_test_specs(\".42\").precision == 42, \"\");\n  static_assert(parse_test_specs(\".{42}\").precision_ref.val.index == 42, \"\");\n  static_assert(parse_test_specs(\"d\").type == 'd', \"\");\n  static_assert(parse_test_specs(\"{<\").res == handler::error, \"\");\n}\n\nstruct test_parse_context {\n  using char_type = char;\n\n  constexpr int next_arg_id() { return 11; }\n  template <typename Id> FMT_CONSTEXPR void check_arg_id(Id) {}\n\n  constexpr const char* begin() { return nullptr; }\n  constexpr const char* end() { return nullptr; }\n\n  void on_error(const char*) {}\n};\n\ntemplate <size_t N>\nconstexpr fmt::detail::dynamic_format_specs<char> parse_dynamic_specs(\n    const char (&s)[N]) {\n  auto specs = fmt::detail::dynamic_format_specs<char>();\n  auto ctx = test_parse_context();\n  auto h = fmt::detail::dynamic_specs_handler<test_parse_context>(specs, ctx);\n  parse_format_specs(s, s + N, h);\n  return specs;\n}\n\nTEST(format_test, constexpr_dynamic_specs_handler) {\n  static_assert(parse_dynamic_specs(\"<\").align == fmt::align::left, \"\");\n  static_assert(parse_dynamic_specs(\"*^\").fill[0] == '*', \"\");\n  static_assert(parse_dynamic_specs(\"+\").sign == fmt::sign::plus, \"\");\n  static_assert(parse_dynamic_specs(\"-\").sign == fmt::sign::minus, \"\");\n  static_assert(parse_dynamic_specs(\" \").sign == fmt::sign::space, \"\");\n  static_assert(parse_dynamic_specs(\"#\").alt, \"\");\n  static_assert(parse_dynamic_specs(\"0\").align == fmt::align::numeric, \"\");\n  static_assert(parse_dynamic_specs(\"42\").width == 42, \"\");\n  static_assert(parse_dynamic_specs(\"{}\").width_ref.val.index == 11, \"\");\n  static_assert(parse_dynamic_specs(\"{42}\").width_ref.val.index == 42, \"\");\n  static_assert(parse_dynamic_specs(\".42\").precision == 42, \"\");\n  static_assert(parse_dynamic_specs(\".{}\").precision_ref.val.index == 11, \"\");\n  static_assert(parse_dynamic_specs(\".{42}\").precision_ref.val.index == 42, \"\");\n  static_assert(parse_dynamic_specs(\"d\").type == 'd', \"\");\n}\n\ntemplate <size_t N>\nconstexpr test_format_specs_handler check_specs(const char (&s)[N]) {\n  fmt::detail::specs_checker<test_format_specs_handler> checker(\n      test_format_specs_handler(), fmt::detail::type::double_type);\n  parse_format_specs(s, s + N, checker);\n  return checker;\n}\n\nTEST(format_test, constexpr_specs_checker) {\n  using handler = test_format_specs_handler;\n  static_assert(check_specs(\"<\").alignment == fmt::align::left, \"\");\n  static_assert(check_specs(\"*^\").fill == '*', \"\");\n  static_assert(check_specs(\"+\").sign == fmt::sign::plus, \"\");\n  static_assert(check_specs(\"-\").sign == fmt::sign::minus, \"\");\n  static_assert(check_specs(\" \").sign == fmt::sign::space, \"\");\n  static_assert(check_specs(\"#\").res == handler::hash, \"\");\n  static_assert(check_specs(\"0\").res == handler::zero, \"\");\n  static_assert(check_specs(\"42\").width == 42, \"\");\n  static_assert(check_specs(\"{42}\").width_ref.val.index == 42, \"\");\n  static_assert(check_specs(\".42\").precision == 42, \"\");\n  static_assert(check_specs(\".{42}\").precision_ref.val.index == 42, \"\");\n  static_assert(check_specs(\"d\").type == 'd', \"\");\n  static_assert(check_specs(\"{<\").res == handler::error, \"\");\n}\n\nstruct test_format_string_handler {\n  constexpr void on_text(const char*, const char*) {}\n\n  constexpr int on_arg_id() { return 0; }\n\n  template <typename T> constexpr int on_arg_id(T) { return 0; }\n\n  constexpr void on_replacement_field(int, const char*) {}\n\n  constexpr const char* on_format_specs(int, const char* begin, const char*) {\n    return begin;\n  }\n\n  constexpr void on_error(const char*) { error = true; }\n\n  bool error = false;\n};\n\ntemplate <size_t N> constexpr bool parse_string(const char (&s)[N]) {\n  auto h = test_format_string_handler();\n  fmt::detail::parse_format_string<true>(fmt::string_view(s, N - 1), h);\n  return !h.error;\n}\n\nTEST(format_test, constexpr_parse_format_string) {\n  static_assert(parse_string(\"foo\"), \"\");\n  static_assert(!parse_string(\"}\"), \"\");\n  static_assert(parse_string(\"{}\"), \"\");\n  static_assert(parse_string(\"{42}\"), \"\");\n  static_assert(parse_string(\"{foo}\"), \"\");\n  static_assert(parse_string(\"{:}\"), \"\");\n}\n#endif  // FMT_USE_CONSTEXPR\n\nstruct enabled_formatter {};\nstruct disabled_formatter {};\nstruct disabled_formatter_convertible {\n  operator int() const { return 42; }\n};\n\nFMT_BEGIN_NAMESPACE\ntemplate <> struct formatter<enabled_formatter> {\n  auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {\n    return ctx.begin();\n  }\n  auto format(enabled_formatter, format_context& ctx) -> decltype(ctx.out()) {\n    return ctx.out();\n  }\n};\nFMT_END_NAMESPACE\n\nTEST(core_test, has_formatter) {\n  using fmt::has_formatter;\n  using context = fmt::format_context;\n  static_assert(has_formatter<enabled_formatter, context>::value, \"\");\n  static_assert(!has_formatter<disabled_formatter, context>::value, \"\");\n  static_assert(!has_formatter<disabled_formatter_convertible, context>::value,\n                \"\");\n}\n\nTEST(core_test, is_formattable) {\n  static_assert(fmt::is_formattable<enabled_formatter>::value, \"\");\n  static_assert(!fmt::is_formattable<disabled_formatter>::value, \"\");\n  static_assert(fmt::is_formattable<disabled_formatter_convertible>::value, \"\");\n}\n\nTEST(core_test, format) { EXPECT_EQ(fmt::format(\"{}\", 42), \"42\"); }\n\nTEST(core_test, format_to) {\n  std::string s;\n  fmt::format_to(std::back_inserter(s), \"{}\", 42);\n  EXPECT_EQ(s, \"42\");\n}\n\nstruct convertible_to_int {\n  operator int() const { return 42; }\n};\n\nstruct convertible_to_c_string {\n  operator const char*() const { return \"foo\"; }\n};\n\nFMT_BEGIN_NAMESPACE\ntemplate <> struct formatter<convertible_to_int> {\n  auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {\n    return ctx.begin();\n  }\n  auto format(convertible_to_int, format_context& ctx) -> decltype(ctx.out()) {\n    return std::copy_n(\"foo\", 3, ctx.out());\n  }\n};\n\ntemplate <> struct formatter<convertible_to_c_string> {\n  FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {\n    return ctx.begin();\n  }\n  auto format(convertible_to_c_string, format_context& ctx)\n      -> decltype(ctx.out()) {\n    return std::copy_n(\"bar\", 3, ctx.out());\n  }\n};\nFMT_END_NAMESPACE\n\nTEST(core_test, formatter_overrides_implicit_conversion) {\n  EXPECT_EQ(fmt::format(\"{}\", convertible_to_int()), \"foo\");\n  EXPECT_EQ(fmt::format(\"{}\", convertible_to_c_string()), \"bar\");\n}\n\n// Test that check is not found by ADL.\ntemplate <typename T> void check(T);\nTEST(core_test, adl_check) {\n  EXPECT_EQ(fmt::format(\"{}\", test_struct()), \"test\");\n}\n\nTEST(core_test, to_string_view_foreign_strings) {\n  using namespace test_ns;\n  EXPECT_EQ(to_string_view(test_string<char>(\"42\")), \"42\");\n  fmt::detail::type type =\n      fmt::detail::mapped_type_constant<test_string<char>,\n                                        fmt::format_context>::value;\n  EXPECT_EQ(type, fmt::detail::type::string_type);\n}\n\nstruct implicitly_convertible_to_string {\n  operator std::string() const { return \"foo\"; }\n};\n\nstruct implicitly_convertible_to_string_view {\n  operator fmt::string_view() const { return \"foo\"; }\n};\n\nTEST(core_test, format_implicitly_convertible_to_string_view) {\n  EXPECT_EQ(\"foo\", fmt::format(\"{}\", implicitly_convertible_to_string_view()));\n}\n\n// std::is_constructible is broken in MSVC until version 2015.\n#if !FMT_MSC_VER || FMT_MSC_VER >= 1900\nstruct explicitly_convertible_to_string_view {\n  explicit operator fmt::string_view() const { return \"foo\"; }\n};\n\nTEST(core_test, format_explicitly_convertible_to_string_view) {\n  EXPECT_EQ(\"foo\", fmt::format(\"{}\", explicitly_convertible_to_string_view()));\n}\n\n#  ifdef FMT_USE_STRING_VIEW\nstruct explicitly_convertible_to_std_string_view {\n  explicit operator std::string_view() const { return \"foo\"; }\n};\n\nTEST(core_test, format_explicitly_convertible_to_std_string_view) {\n  EXPECT_EQ(\"foo\",\n            fmt::format(\"{}\", explicitly_convertible_to_std_string_view()));\n}\n#  endif\n#endif\n\nstruct convertible_to_long_long {\n  operator long long() const { return 1LL << 32; }\n};\n\nTEST(format_test, format_convertible_to_long_long) {\n  EXPECT_EQ(\"100000000\", fmt::format(\"{:x}\", convertible_to_long_long()));\n}\n\nstruct disabled_rvalue_conversion {\n  operator const char*() const& { return \"foo\"; }\n  operator const char*() & { return \"foo\"; }\n  operator const char*() const&& = delete;\n  operator const char*() && = delete;\n};\n\nTEST(core_test, disabled_rvalue_conversion) {\n  EXPECT_EQ(\"foo\", fmt::format(\"{}\", disabled_rvalue_conversion()));\n}\n\nnamespace adl_test {\ntemplate <typename... T> void make_format_args(const T&...) = delete;\n\nstruct string : std::string {};\n}  // namespace adl_test\n\n// Test that formatting functions compile when make_format_args is found by ADL.\nTEST(core_test, adl) {\n  // Only check compilation and don't run the code to avoid polluting the output\n  // and since the output is tested elsewhere.\n  if (fmt::detail::const_check(true)) return;\n  auto s = adl_test::string();\n  char buf[10];\n  fmt::format(\"{}\", s);\n  fmt::format_to(buf, \"{}\", s);\n  fmt::format_to_n(buf, 10, \"{}\", s);\n  fmt::formatted_size(\"{}\", s);\n  fmt::print(\"{}\", s);\n  fmt::print(stdout, \"{}\", s);\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/cuda-test/CMakeLists.txt",
    "content": "# We can find some usecases which follow the guide of CMake which uses\n# `enable_language(CUDA)` instead of `find_package(CUDA)` and let the CMake\n# built-in functions use NVCC.\n\n# See: https://cmake.org/cmake/help/latest/module/FindCUDA.html#replacement\n#\n# However, this requires CMake version 3.10 or higher and we can't be sure most\n# of the CUDA projects are using those.\n#\n# This test relies on `find_package(CUDA)` in the parent CMake config.\n\n# These can be updated when NVCC becomes ready for C++ 17 features\n# https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#cpp14-language-features\nset(CMAKE_CUDA_STANDARD 14)\nset(CMAKE_CUDA_STANDARD_REQUIRED 14)\n\n# In this test, we assume that the user is going to compile CUDA source code\n# with some libraries (fmt in this case).\n#\n# In addition to that, this test invokes both the C++ host compiler and NVCC\n# by providing another (non-CUDA) C++ source code.\nif (${CMAKE_VERSION} VERSION_LESS 3.15)\n  # https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html\n  list(APPEND CUDA_NVCC_FLAGS \"-std=c++14\")\n  if (MSVC)\n    # This is the solution of pytorch:\n    # https://github.com/pytorch/pytorch/pull/7118\n    list(APPEND CUDA_NVCC_FLAGS \"-Xcompiler\" \"/std:c++14\")\n    list(APPEND CUDA_NVCC_FLAGS \"-Xcompiler\" \"/Zc:__cplusplus\")\n    # for the reason of this -Xcompiler options, see below.\n  endif ()\n  cuda_add_executable(fmt-in-cuda-test cuda-cpp14.cu cpp14.cc)\n  target_compile_features(fmt-in-cuda-test PRIVATE cxx_std_14)\n  if (MSVC)\n    # This part is for (non-CUDA) C++ code. MSVC can define incorrect\n    # `__cplusplus` macro. Fix for the issue is to use additional compiler flag. \n    #\n    # See Also:\n    # https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/\n    # https://github.com/Microsoft/vscode-cpptools/issues/2595\n    target_compile_options(fmt-in-cuda-test PRIVATE /Zc:__cplusplus /permissive-)\n  endif ()\nelse()\n  # now using a \"new\" way of handling CUDA\n  add_executable(fmt-in-cuda-test cuda-cpp14.cu cpp14.cc)\n  set_target_properties(fmt-in-cuda-test PROPERTIES CUDA_SEPARABLE_COMPILATION ON)\n  target_compile_features(fmt-in-cuda-test PRIVATE cxx_std_14)\n  if (MSVC)\n    # with MSVC, 'cxx_std_14' will only propagate to the host code (MSVC), but will\n    # not set __cplusplus correctly anyway, while nvcc will ignore it.\n    # If specified for nvcc on the command line as '-std=c++14' nvcc will emit this\n    # message instead:\n    # nvcc warning : The -std=c++14 flag is not supported with the configured host\n    #                compiler. Flag will be ignored.\n    set_property(SOURCE cuda-cpp14.cu APPEND PROPERTY\n      COMPILE_OPTIONS -Xcompiler /std:c++14 -Xcompiler /Zc:__cplusplus)\n    set_property(SOURCE cpp14.cc APPEND PROPERTY\n      COMPILE_OPTIONS /std:c++14 /Zc:__cplusplus)\n  endif()\nendif()\n\nget_target_property(IN_USE_CUDA_STANDARD fmt-in-cuda-test CUDA_STANDARD)\nmessage(STATUS \"cuda_standard:          ${IN_USE_CUDA_STANDARD}\")\n\nget_target_property(IN_USE_CUDA_STANDARD_REQUIRED\n    fmt-in-cuda-test CUDA_STANDARD_REQUIRED)\nmessage(STATUS \"cuda_standard_required: ${IN_USE_CUDA_STANDARD_REQUIRED}\")\n\n# We don't use PUBLIC or other keyword for reasons explained in the\n# CUDA_LINK_LIBRARIES_KEYWORD section in\n# https://cmake.org/cmake/help/latest/module/FindCUDA.html\ntarget_link_libraries(fmt-in-cuda-test fmt::fmt)\n\n"
  },
  {
    "path": "examples/libraries/fmt/test/cuda-test/cpp14.cc",
    "content": "#include <fmt/core.h>\n\n// The purpose of this part is to ensure NVCC's host compiler also supports\n// the standard version. See 'cuda-cpp14.cu'.\n//\n// https://en.cppreference.com/w/cpp/preprocessor/replace#Predefined_macros\nstatic_assert(__cplusplus >= 201402L, \"expect C++ 2014 for host compiler\");\n\nauto make_message_cpp() -> std::string {\n  return fmt::format(\"host compiler \\t: __cplusplus == {}\", __cplusplus);\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/cuda-test/cuda-cpp14.cu",
    "content": "//  Direct NVCC command line example:\n//\n//  nvcc ./cuda-cpp14.cu -x cu -I\"../include\" -l\"fmtd\" -L\"../build/Debug\" \\\n//       -std=c++14 -Xcompiler /std:c++14 -Xcompiler /Zc:__cplusplus\n\n// Ensure that we are using the latest C++ standard for NVCC\n// The version is C++14\n//\n// https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#c-cplusplus-language-support\n// https://en.cppreference.com/w/cpp/preprocessor/replace#Predefined_macros\nstatic_assert(__cplusplus >= 201402L, \"expect C++ 2014 for nvcc\");\n\n#include <fmt/core.h>\n\n#include <cuda.h>\n#include <iostream>\n\nextern auto make_message_cpp() -> std::string;\nextern auto make_message_cuda() -> std::string;\n\nint main() {\n  std::cout << make_message_cuda() << std::endl;\n  std::cout << make_message_cpp() << std::endl;\n}\n\nauto make_message_cuda() -> std::string {\n  return fmt::format(\"nvcc compiler \\t: __cplusplus == {}\", __cplusplus);\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/enforce-checks-test.cc",
    "content": "// Formatting library for C++ - formatting library tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include <iterator>\n#include <vector>\n\n#include \"fmt/chrono.h\"\n#include \"fmt/color.h\"\n#include \"fmt/format.h\"\n#include \"fmt/ostream.h\"\n#include \"fmt/ranges.h\"\n#include \"fmt/xchar.h\"\n\n// Exercise the API to verify that everything we expect to can compile.\nvoid test_format_api() {\n  fmt::format(FMT_STRING(\"{}\"), 42);\n  fmt::format(FMT_STRING(L\"{}\"), 42);\n  fmt::format(FMT_STRING(\"noop\"));\n\n  fmt::to_string(42);\n  fmt::to_wstring(42);\n\n  std::vector<char> out;\n  fmt::format_to(std::back_inserter(out), FMT_STRING(\"{}\"), 42);\n\n  char buffer[4];\n  fmt::format_to_n(buffer, 3, FMT_STRING(\"{}\"), 12345);\n\n  wchar_t wbuffer[4];\n  fmt::format_to_n(wbuffer, 3, FMT_STRING(L\"{}\"), 12345);\n}\n\nvoid test_chrono() {\n  fmt::format(FMT_STRING(\"{}\"), std::chrono::seconds(42));\n  fmt::format(FMT_STRING(L\"{}\"), std::chrono::seconds(42));\n}\n\nvoid test_text_style() {\n  fmt::print(fg(fmt::rgb(255, 20, 30)), FMT_STRING(\"{}\"), \"rgb(255,20,30)\");\n  fmt::format(fg(fmt::rgb(255, 20, 30)), FMT_STRING(\"{}\"), \"rgb(255,20,30)\");\n\n  fmt::text_style ts = fg(fmt::rgb(255, 20, 30));\n  std::string out;\n  fmt::format_to(std::back_inserter(out), ts,\n                 FMT_STRING(\"rgb(255,20,30){}{}{}\"), 1, 2, 3);\n}\n\nvoid test_range() {\n  std::vector<char> hello = {'h', 'e', 'l', 'l', 'o'};\n  fmt::format(FMT_STRING(\"{}\"), hello);\n}\n\nint main() {\n  test_format_api();\n  test_chrono();\n  test_text_style();\n  test_range();\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/find-package-test/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.1...3.18)\n\nproject(fmt-test)\n\nfind_package(FMT REQUIRED)\n\nadd_executable(library-test main.cc)\ntarget_link_libraries(library-test fmt::fmt)\ntarget_compile_options(library-test PRIVATE ${PEDANTIC_COMPILE_FLAGS})\ntarget_include_directories(library-test PUBLIC SYSTEM .)\n\nif (TARGET fmt::fmt-header-only)\n  add_executable(header-only-test main.cc)\n  target_link_libraries(header-only-test fmt::fmt-header-only)\n  target_compile_options(header-only-test PRIVATE ${PEDANTIC_COMPILE_FLAGS})\n  target_include_directories(header-only-test PUBLIC SYSTEM .)\nendif ()\n"
  },
  {
    "path": "examples/libraries/fmt/test/find-package-test/main.cc",
    "content": "#include \"fmt/format.h\"\n\nint main(int argc, char** argv) {\n  for(int i = 0; i < argc; ++i)\n    fmt::print(\"{}: {}\\n\", i, argv[i]);\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/format",
    "content": "// Formatting library for C++ - the standard API implementation\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#ifndef FMT_FORMAT_\n#define FMT_FORMAT_\n\n#include <algorithm>\n#include <cassert>\n#include <variant>\n#include \"fmt/format.h\"\n\n// This implementation verifies the correctness of the standard API proposed in\n// P0645 Text Formatting and is optimized for copy-pasting from the paper, not\n// for efficiency or readability. An efficient implementation should not use\n// std::variant and should store packed argument type tags separately from\n// values in basic_format_args for small number of arguments.\n\nnamespace std {\ntemplate<class T>\nconstexpr bool Integral = is_integral_v<T>;\n\ntemplate <class O>\n  using iter_difference_t = ptrdiff_t;\n}\n\n// https://fmt.dev/Text%20Formatting.html#format.syn\nnamespace std {\n  // [format.error], class format_error\n  class format_error;\n\n  // [format.formatter], formatter\n  template<class charT> class basic_format_parse_context;\n  using format_parse_context = basic_format_parse_context<char>;\n  using wformat_parse_context = basic_format_parse_context<wchar_t>;\n  \n  template<class Out, class charT> class basic_format_context;\n  using format_context = basic_format_context<\n    /* unspecified */ fmt::detail::buffer_appender<char>, char>;\n  using wformat_context = basic_format_context<\n    /* unspecified */ fmt::detail::buffer_appender<wchar_t>, wchar_t>;\n\n  template<class T, class charT = char> struct formatter {\n    formatter() = delete;\n  };\n  \n  // [format.arguments], arguments\n  template<class Context> class basic_format_arg;\n\n  template<class Visitor, class Context>\n    /* see below */ auto visit_format_arg(Visitor&& vis, basic_format_arg<Context> arg);\n\n  template<class Context, class... Args> struct format_arg_store; // exposition only\n\n  template<class Context> class basic_format_args;\n  using format_args = basic_format_args<format_context>;\n  using wformat_args = basic_format_args<wformat_context>;\n\n  template<class Out, class charT>\n    using format_args_t = basic_format_args<basic_format_context<Out, charT>>;\n\n  template<class Context = format_context, class... Args>\n    format_arg_store<Context, Args...>\n      make_format_args(const Args&... args);\n  template<class... Args>\n    format_arg_store<wformat_context, Args...>\n      make_wformat_args(const Args&... args);\n\n  // [format.functions], formatting functions\n  template<class... Args>\n    string format(string_view fmt, const Args&... args);\n  template<class... Args>\n    wstring format(wstring_view fmt, const Args&... args);\n\n  string vformat(string_view fmt, format_args args);\n  wstring vformat(wstring_view fmt, wformat_args args);\n\n  template<class Out, class... Args>\n    Out format_to(Out out, string_view fmt, const Args&... args);\n  template<class Out, class... Args>\n    Out format_to(Out out, wstring_view fmt, const Args&... args);\n\n  template<class Out>\n    Out vformat_to(Out out, string_view fmt, format_args_t<fmt::type_identity_t<Out>, char> args);\n  template<class Out>\n    Out vformat_to(Out out, wstring_view fmt, format_args_t<fmt::type_identity_t<Out>, wchar_t> args);\n\n  template<class Out>\n    struct format_to_n_result {\n      Out out;\n      iter_difference_t<Out> size;\n    };\n  \n  template<class Out, class... Args>\n    format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n,\n                                        string_view fmt, const Args&... args);\n  template<class Out, class... Args>\n    format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n,\n                                        wstring_view fmt, const Args&... args);\n\n  template<class... Args>\n    size_t formatted_size(string_view fmt, const Args&... args);\n  template<class... Args>\n    size_t formatted_size(wstring_view fmt, const Args&... args);\n}\n\n// https://fmt.dev/Text%20Formatting.html#format.error\nnamespace std {\n  class format_error : public runtime_error {\n  public:\n    explicit format_error(const string& what_arg) : runtime_error(what_arg) {}\n    explicit format_error(const char* what_arg) : runtime_error(what_arg) {}\n  };\n}\n\nnamespace std {\nnamespace detail {\nstruct error_handler {\n  // This function is intentionally not constexpr to give a compile-time error.\n  void on_error(const char* message) {\n    throw std::format_error(message);\n  }\n};\n}\n}\n\n// https://fmt.dev/Text%20Formatting.html#format.parse_context\nnamespace std {\n  template<class charT>\n  class basic_format_parse_context {\n  public:\n    using char_type = charT;\n    using const_iterator = typename basic_string_view<charT>::const_iterator;\n    using iterator = const_iterator;\n\n  private:\n    iterator begin_;                              // exposition only\n    iterator end_;                                // exposition only\n    enum indexing { unknown, manual, automatic }; // exposition only\n    indexing indexing_;                           // exposition only\n    size_t next_arg_id_;                          // exposition only\n    size_t num_args_;                             // exposition only\n\n  public:\n    explicit constexpr basic_format_parse_context(basic_string_view<charT> fmt,\n                                                  size_t num_args = 0) noexcept;\n    basic_format_parse_context(const basic_format_parse_context&) = delete;\n    basic_format_parse_context& operator=(const basic_format_parse_context&) = delete;\n\n    constexpr const_iterator begin() const noexcept;\n    constexpr const_iterator end() const noexcept;\n    constexpr void advance_to(const_iterator it);\n\n    constexpr size_t next_arg_id();\n    constexpr void check_arg_id(size_t id);\n\n    // Implementation detail:\n    constexpr void check_arg_id(fmt::string_view) {}\n    detail::error_handler error_handler() const { return {}; }\n    void on_error(const char* msg) { error_handler().on_error(msg); }\n  };\n}\n\nnamespace std {\ntemplate<class charT>\n/* explicit */ constexpr basic_format_parse_context<charT>::\n                   basic_format_parse_context(basic_string_view<charT> fmt,\n                                              size_t num_args) noexcept\n: begin_(fmt.begin()), end_(fmt.end()), indexing_(unknown), next_arg_id_(0), num_args_(num_args) {}\n\ntemplate<class charT>\nconstexpr typename basic_format_parse_context<charT>::const_iterator basic_format_parse_context<charT>::begin() const noexcept { return begin_; }\n\ntemplate<class charT>\nconstexpr typename basic_format_parse_context<charT>::const_iterator basic_format_parse_context<charT>::end() const noexcept { return end_; }\n\ntemplate<class charT>\nconstexpr void basic_format_parse_context<charT>::advance_to(typename basic_format_parse_context<charT>::iterator it) { begin_ = it; }\n\ntemplate<class charT>\nconstexpr size_t basic_format_parse_context<charT>::next_arg_id() {\n  if (indexing_ == manual)\n    throw format_error(\"manual to automatic indexing\");\n  if (indexing_ == unknown)\n    indexing_ = automatic;\n  return next_arg_id_++;\n}\n\ntemplate<class charT>\nconstexpr void basic_format_parse_context<charT>::check_arg_id(size_t id) {\n  // clang doesn't support __builtin_is_constant_evaluated yet\n  //if (!(!__builtin_is_constant_evaluated() || id < num_args_))\n  //  throw format_error(invalid index is out of range\");\n  if (indexing_ == automatic)\n    throw format_error(\"automatic to manual indexing\");\n  if (indexing_ == unknown)\n    indexing_ = manual;\n}\n}\n\n// https://fmt.dev/Text%20Formatting.html#format.context\nnamespace std {\n  template<class Out, class charT>\n  class basic_format_context {\n    basic_format_args<basic_format_context> args_; // exposition only\n    Out out_;                                      // exposition only\n\n  public:\n    using iterator = Out;\n    using char_type = charT;\n    template<class T> using formatter_type = formatter<T, charT>;\n\n    basic_format_arg<basic_format_context> arg(size_t id) const;\n\n    iterator out();\n    void advance_to(iterator it);\n\n    // Implementation details:\n    using format_arg = basic_format_arg<basic_format_context>;\n    basic_format_context(Out out, basic_format_args<basic_format_context> args, fmt::detail::locale_ref)\n    : args_(args), out_(out) {}\n    detail::error_handler error_handler() const { return {}; }\n    basic_format_arg<basic_format_context> arg(fmt::basic_string_view<charT>) const {\n      return {}; // unused: named arguments are not supported yet\n    }\n    void on_error(const char* msg) { error_handler().on_error(msg); }\n  };\n}\n\nnamespace std {\ntemplate<class O, class charT>\nbasic_format_arg<basic_format_context<O, charT>> basic_format_context<O, charT>::arg(size_t id) const { return args_.get(id); }\n\ntemplate<class O, class charT>\ntypename basic_format_context<O, charT>::iterator basic_format_context<O, charT>::out() { return out_; }\n\ntemplate<class O, class charT>\nvoid basic_format_context<O, charT>::advance_to(typename basic_format_context<O, charT>::iterator it) { out_ = it; }\n}\n\nnamespace std {\nnamespace detail {\ntemplate <typename T>\nconstexpr bool is_standard_integer_v =\n    std::is_same_v<T, signed char> ||\n    std::is_same_v<T, short int> ||\n    std::is_same_v<T, int> ||\n    std::is_same_v<T, long int> ||\n    std::is_same_v<T, long long int>;\n\ntemplate <typename T>\nconstexpr bool is_standard_unsigned_integer_v =\n    std::is_same_v<T, unsigned char> ||\n    std::is_same_v<T, unsigned short int> ||\n    std::is_same_v<T, unsigned int> ||\n    std::is_same_v<T, unsigned long int> ||\n    std::is_same_v<T, unsigned long long int>;\n\ntemplate <typename T, typename Char> struct formatter;\n}\n}\n\n// https://fmt.dev/Text%20Formatting.html#format.arg\nnamespace std {\n  template<class Context>\n  class basic_format_arg {\n  public:\n    class handle;\n\n  private:\n    using char_type = typename Context::char_type;                       // exposition only\n\n    variant<monostate, bool, char_type,\n            int, unsigned int, long long int, unsigned long long int,\n            double, long double,\n            const char_type*, basic_string_view<char_type>,\n            const void*, handle> value;                                  // exposition only\n\n    template<typename T,\n      typename = enable_if_t<\n        std::is_same_v<T, bool> ||\n        std::is_same_v<T, char_type> ||\n        (std::is_same_v<T, char> && std::is_same_v<char_type, wchar_t>) ||\n        detail::is_standard_integer_v<T> ||\n        detail::is_standard_unsigned_integer_v<T> ||\n        sizeof(typename Context::template formatter_type<T>().format(declval<const T&>(), declval<Context&>())) != 0\n    >> explicit basic_format_arg(const T& v) noexcept; // exposition only\n    explicit basic_format_arg(float n) noexcept;                         // exposition only\n    explicit basic_format_arg(double n) noexcept;                        // exposition only\n    explicit basic_format_arg(long double n) noexcept;                   // exposition only\n    explicit basic_format_arg(const char_type* s);                       // exposition only\n\n    template<class traits>\n      explicit basic_format_arg(\n        basic_string_view<char_type, traits> s) noexcept;                // exposition only\n\n    template<class traits, class Allocator>\n      explicit basic_format_arg(\n        const basic_string<char_type, traits, Allocator>& s) noexcept;   // exposition only\n\n    explicit basic_format_arg(nullptr_t) noexcept;                       // exposition only\n\n    template<class T, typename = enable_if_t<is_void_v<T>>>\n      explicit basic_format_arg(const T* p) noexcept;                    // exposition only\n\n    // Fails due to a bug in clang\n    //template<class Visitor, class Ctx>\n    //  friend auto visit_format_arg(Visitor&& vis,\n    //                                    basic_format_arg<Ctx> arg);           // exposition only\n\n    friend auto get_value(basic_format_arg arg) {\n      return arg.value;\n    }\n\n    template <typename T, typename Char> friend struct detail::formatter;\n\n    template<class Ctx, class... Args>\n      friend format_arg_store<Ctx, Args...>\n        make_format_args(const Args&... args);                           // exposition only\n\n  public:\n    basic_format_arg() noexcept;\n\n    explicit operator bool() const noexcept;\n  };\n}\n\nnamespace std {\ntemplate<class Context>\nbasic_format_arg<Context>::basic_format_arg() noexcept {}\n\ntemplate<class Context>\ntemplate<class T, typename> /* explicit */ basic_format_arg<Context>::basic_format_arg(const T& v) noexcept {\n  if constexpr (std::is_same_v<T, bool> || std::is_same_v<T, char_type>)\n    value = v;\n  else if constexpr (std::is_same_v<T, char> && std::is_same_v<char_type, wchar_t>)\n    value = static_cast<wchar_t>(v);\n  else if constexpr (detail::is_standard_integer_v<T> && sizeof(T) <= sizeof(int))\n    value = static_cast<int>(v);\n  else if constexpr (detail::is_standard_unsigned_integer_v<T> && sizeof(T) <= sizeof(unsigned))\n    value = static_cast<unsigned>(v);\n  else if constexpr (detail::is_standard_integer_v<T>)\n    value = static_cast<long long int>(v);\n  else if constexpr (detail::is_standard_unsigned_integer_v<T>)\n    value = static_cast<unsigned long long int>(v);\n  else if constexpr (sizeof(typename Context::template formatter_type<T>().format(declval<const T&>(), declval<Context&>())) != 0)\n    value = handle(v);\n}\n\ntemplate<class Context>\n/* explicit */ basic_format_arg<Context>::basic_format_arg(float n) noexcept\n  : value(static_cast<double>(n)) {}\n\ntemplate<class Context>\n/* explicit */ basic_format_arg<Context>::basic_format_arg(double n) noexcept\n  : value(n) {}\n\ntemplate<class Context>\n/* explicit */ basic_format_arg<Context>::basic_format_arg(long double n) noexcept\n  : value(n) {}\n\ntemplate<class Context>\n/* explicit */ basic_format_arg<Context>::basic_format_arg(const typename basic_format_arg<Context>::char_type* s)\n  : value(s) {\n  assert(s != nullptr);\n}\n\ntemplate<class Context>\ntemplate<class traits>\n/* explicit */ basic_format_arg<Context>::basic_format_arg(basic_string_view<char_type, traits> s) noexcept\n  : value(s) {}\n\ntemplate<class Context>\ntemplate<class traits, class Allocator>\n/* explicit */ basic_format_arg<Context>::basic_format_arg(\n    const basic_string<char_type, traits, Allocator>& s) noexcept\n  : value(basic_string_view<char_type>(s.data(), s.size())) {}\n\n\ntemplate<class Context>\n/* explicit */ basic_format_arg<Context>::basic_format_arg(nullptr_t) noexcept\n  : value(static_cast<const void*>(nullptr)) {}\n\ntemplate<class Context>\ntemplate<class T, typename> /* explicit */ basic_format_arg<Context>::basic_format_arg(const T* p) noexcept\n  : value(p) {}\n\ntemplate<class Context>\n/* explicit */ basic_format_arg<Context>::operator bool() const noexcept {\n    return !holds_alternative<monostate>(value);\n}\n}\n\nnamespace std {\n  template<class Context>\n  class basic_format_arg<Context>::handle {\n    const void* ptr_;                                         // exposition only\n    void (*format_)(basic_format_parse_context<char_type>&,\n                    Context&, const void*);                   // exposition only\n\n    template<class T> explicit handle(const T& val) noexcept; // exposition only\n\n    friend class basic_format_arg<Context>;                   // exposition only\n\n  public:\n    void format(basic_format_parse_context<char_type>&, Context& ctx) const;\n  };\n}\n\nnamespace std {\ntemplate<class Context>\ntemplate<class T> /* explicit */ basic_format_arg<Context>::handle::handle(const T& val) noexcept\n  : ptr_(&val), format_([](basic_format_parse_context<char_type>& parse_ctx, Context& format_ctx, const void* ptr) {\n    typename Context::template formatter_type<T> f;\n    parse_ctx.advance_to(f.parse(parse_ctx));\n    format_ctx.advance_to(f.format(*static_cast<const T*>(ptr), format_ctx));\n  }) {}\n\ntemplate<class Context>\nvoid basic_format_arg<Context>::handle::format(basic_format_parse_context<char_type>& parse_ctx, Context& format_ctx) const {\n  format_(parse_ctx, format_ctx, ptr_);\n}\n\n// https://fmt.dev/Text%20Formatting.html#format.visit\ntemplate<class Visitor, class Context>\n  auto visit_format_arg(Visitor&& vis, basic_format_arg<Context> arg) {\n    return visit(vis, get_value(arg));\n  }\n}\n\n// https://fmt.dev/Text%20Formatting.html#format.store\nnamespace std {\n  template<class Context, class... Args>\n  struct format_arg_store { // exposition only\n    array<basic_format_arg<Context>, sizeof...(Args)> args;\n  };\n}\n\n// https://fmt.dev/Text%20Formatting.html#format.basic_args\nnamespace std {\n  template<class Context>\n  class basic_format_args {\n    size_t size_;                           // exposition only\n    const basic_format_arg<Context>* data_; // exposition only\n\n  public:\n    basic_format_args() noexcept;\n\n    template<class... Args>\n      basic_format_args(const format_arg_store<Context, Args...>& store) noexcept;\n\n    basic_format_arg<Context> get(size_t i) const noexcept;\n  };\n}\n\nnamespace std {\n\ntemplate<class Context>\nbasic_format_args<Context>::basic_format_args() noexcept : size_(0) {}\n\ntemplate<class Context>\ntemplate<class... Args>\n  basic_format_args<Context>::basic_format_args(const format_arg_store<Context, Args...>& store) noexcept\n  : size_(sizeof...(Args)), data_(store.args.data()) {}\n\ntemplate<class Context>\nbasic_format_arg<Context> basic_format_args<Context>::get(size_t i) const noexcept {\n  return i < size_ ? data_[i] : basic_format_arg<Context>();\n}\n}\n\nnamespace std {\n// https://fmt.dev/Text%20Formatting.html#format.make_args\ntemplate<class Context /*= format_context*/, class... Args>\n  format_arg_store<Context, Args...> make_format_args(const Args&... args) {\n    return {basic_format_arg<Context>(args)...};\n  }\n\n// https://fmt.dev/Text%20Formatting.html#format.make_wargs\ntemplate<class... Args>\n  format_arg_store<wformat_context, Args...> make_wformat_args(const Args&... args) {\n    return make_format_args<wformat_context>(args...);\n  }\n}\n\nnamespace std {\nnamespace detail {\n\ntemplate <typename OutputIt, typename Char>\nclass arg_formatter\n    : public fmt::detail::arg_formatter_base<OutputIt, Char, error_handler> {\n private:\n  using char_type = Char;\n  using base = fmt::detail::arg_formatter_base<OutputIt, Char, error_handler>;\n  using format_context = std::basic_format_context<OutputIt, Char>;\n  using parse_context = basic_format_parse_context<Char>;\n\n  parse_context* parse_ctx_;\n  format_context& ctx_;\n\n public:\n  using iterator = OutputIt;\n  using format_specs = typename base::format_specs;\n\n  /**\n    \\rst\n    Constructs an argument formatter object.\n    *ctx* is a reference to the formatting context,\n    *spec* contains format specifier information for standard argument types.\n    \\endrst\n   */\n  arg_formatter(format_context& ctx, parse_context* parse_ctx = nullptr, fmt::format_specs* spec = nullptr)\n      : base(ctx.out(), spec, {}), parse_ctx_(parse_ctx), ctx_(ctx) {}\n\n  using base::operator();\n\n  /** Formats an argument of a user-defined type. */\n  iterator operator()(typename std::basic_format_arg<format_context>::handle handle) {\n    handle.format(*parse_ctx_, ctx_);\n    return this->out();\n  }\n\n  iterator operator()(monostate) {\n    throw format_error(\"\");\n  }\n};\n\ntemplate <typename Context>\ninline fmt::detail::type get_type(basic_format_arg<Context> arg) {\n  return visit_format_arg([&] (auto val) {\n    using char_type = typename Context::char_type;\n    using T = decltype(val);\n    if (std::is_same_v<T, monostate>)\n      return fmt::detail::type::none_type;\n    if (std::is_same_v<T, bool>)\n      return fmt::detail::type::bool_type;\n    if (std::is_same_v<T, char_type>)\n      return fmt::detail::type::char_type;\n    if (std::is_same_v<T, int>)\n      return fmt::detail::type::int_type;\n    if (std::is_same_v<T, unsigned int>)\n      return fmt::detail::type::uint_type;\n    if (std::is_same_v<T, long long int>)\n      return fmt::detail::type::long_long_type;\n    if (std::is_same_v<T, unsigned long long int>)\n      return fmt::detail::type::ulong_long_type;\n    if (std::is_same_v<T, double>)\n      return fmt::detail::type::double_type;\n    if (std::is_same_v<T, long double>)\n      return fmt::detail::type::long_double_type;\n    if (std::is_same_v<T, const char_type*>)\n      return fmt::detail::type::cstring_type;\n    if (std::is_same_v<T, basic_string_view<char_type>>)\n      return fmt::detail::type::string_type;\n    if (std::is_same_v<T, const void*>)\n      return fmt::detail::type::pointer_type;\n    assert(get_value(arg).index() == 12);\n    return fmt::detail::type::custom_type;\n  }, arg);\n}\n\ntemplate <typename Context>\nclass custom_formatter {\n private:\n  using parse_context = basic_format_parse_context<typename Context::char_type>;\n  parse_context& parse_ctx_;\n  Context& format_ctx_;\n\n public:\n  custom_formatter(parse_context& parse_ctx, Context& ctx) : parse_ctx_(parse_ctx), format_ctx_(ctx) {}\n\n  bool operator()(typename basic_format_arg<Context>::handle h) const {\n    h.format(parse_ctx_, format_ctx_);\n    return true;\n  }\n\n  template <typename T> bool operator()(T) const { return false; }\n};\n\ntemplate <typename ArgFormatter, typename Char, typename Context>\nstruct format_handler : detail::error_handler {\n  using iterator = typename ArgFormatter::iterator;\n\n  format_handler(iterator out, basic_string_view<Char> str,\n                 basic_format_args<Context> format_args,\n                 fmt::detail::locale_ref loc)\n      : parse_ctx(str), context(out, format_args, loc) {}\n\n  void on_text(const Char* begin, const Char* end) {\n    auto size = fmt::detail::to_unsigned(end - begin);\n    auto out = context.out();\n    auto&& it = fmt::detail::reserve(out, size);\n    it = std::copy_n(begin, size, it);\n    context.advance_to(out);\n  }\n\n  int on_arg_id() { return parse_ctx.next_arg_id(); }\n  int on_arg_id(unsigned id) { return parse_ctx.check_arg_id(id), id; }\n  int on_arg_id(fmt::basic_string_view<Char>) { return 0; }\n\n  void on_replacement_field(int id, const Char* p) {\n    auto arg = context.arg(id);\n    parse_ctx.advance_to(parse_ctx.begin() + (p  - &*parse_ctx.begin()));\n    custom_formatter<Context> f(parse_ctx, context);\n    if (!visit_format_arg(f, arg))\n      context.advance_to(visit_format_arg(ArgFormatter(context, &parse_ctx), arg));\n  }\n\n  const Char* on_format_specs(int id, const Char* begin, const Char* end) {\n    auto arg = context.arg(id);\n    parse_ctx.advance_to(parse_ctx.begin() + (begin - &*parse_ctx.begin()));\n    custom_formatter<Context> f(parse_ctx, context);\n    if (visit_format_arg(f, arg)) return &*parse_ctx.begin();\n    fmt::basic_format_specs<Char> specs;\n    using fmt::detail::specs_handler;\n    using parse_context = basic_format_parse_context<Char>;\n    fmt::detail::specs_checker<specs_handler<parse_context, Context>> handler(\n        specs_handler<parse_context, Context>(specs, parse_ctx, context), get_type(arg));\n    begin = parse_format_specs(begin, end, handler);\n    if (begin == end || *begin != '}') on_error(\"missing '}' in format string\");\n    parse_ctx.advance_to(parse_ctx.begin() + (begin - &*parse_ctx.begin()));\n    context.advance_to(visit_format_arg(ArgFormatter(context, &parse_ctx, &specs), arg));\n    return begin;\n  }\n\n  basic_format_parse_context<Char> parse_ctx;\n  Context context;\n};\n\ntemplate <typename T, typename Char>\nstruct formatter {\n  // Parses format specifiers stopping either at the end of the range or at the\n  // terminating '}'.\n  template <typename ParseContext>\n  FMT_CONSTEXPR typename ParseContext::iterator parse(ParseContext& ctx) {\n    namespace detail = fmt::detail;\n    typedef detail::dynamic_specs_handler<ParseContext> handler_type;\n    auto type = detail::mapped_type_constant<T, fmt::buffer_context<Char>>::value;\n    detail::specs_checker<handler_type> handler(handler_type(specs_, ctx),\n                                                  type);\n    auto it = parse_format_specs(ctx.begin(), ctx.end(), handler);\n    auto type_spec = specs_.type;\n    auto eh = ctx.error_handler();\n    switch (type) {\n    case detail::type::none_type:\n      FMT_ASSERT(false, \"invalid argument type\");\n      break;\n    case detail::type::int_type:\n    case detail::type::uint_type:\n    case detail::type::long_long_type:\n    case detail::type::ulong_long_type:\n    case detail::type::bool_type:\n      handle_int_type_spec(type_spec,\n                           detail::int_type_checker<decltype(eh)>(eh));\n      break;\n    case detail::type::char_type:\n      handle_char_specs(\n          &specs_, detail::char_specs_checker<decltype(eh)>(type_spec, eh));\n      break;\n    case detail::type::double_type:\n    case detail::type::long_double_type:\n      detail::parse_float_type_spec(specs_, eh);\n      break;\n    case detail::type::cstring_type:\n      detail::handle_cstring_type_spec(\n          type_spec, detail::cstring_type_checker<decltype(eh)>(eh));\n      break;\n    case detail::type::string_type:\n      detail::check_string_type_spec(type_spec, eh);\n      break;\n    case detail::type::pointer_type:\n      detail::check_pointer_type_spec(type_spec, eh);\n      break;\n    case detail::type::custom_type:\n      // Custom format specifiers should be checked in parse functions of\n      // formatter specializations.\n      break;\n    }\n    return it;\n  }\n\n  template <typename FormatContext>\n  auto format(const T& val, FormatContext& ctx) -> decltype(ctx.out()) {\n    fmt::detail::handle_dynamic_spec<fmt::detail::width_checker>(\n        specs_.width, specs_.width_ref, ctx);\n    fmt::detail::handle_dynamic_spec<fmt::detail::precision_checker>(\n        specs_.precision, specs_.precision_ref, ctx);\n    using af = arg_formatter<typename FormatContext::iterator,\n                             typename FormatContext::char_type>;\n    return visit_format_arg(af(ctx, nullptr, &specs_),\n                            basic_format_arg<FormatContext>(val));\n  }\n\n private:\n  fmt::detail::dynamic_format_specs<Char> specs_;\n};\n}  // namespace detail\n\n// https://fmt.dev/Text%20Formatting.html#format.functions\ntemplate<class... Args>\n  string format(string_view fmt, const Args&... args) {\n    return vformat(fmt, make_format_args(args...));\n  }\n\ntemplate<class... Args>\n  wstring format(wstring_view fmt, const Args&... args) {\n    return vformat(fmt, make_wformat_args(args...));\n  }\n\nstring vformat(string_view fmt, format_args args) {\n  fmt::memory_buffer mbuf;\n  fmt::detail::buffer<char>& buf = mbuf;\n  using af = detail::arg_formatter<fmt::format_context::iterator, char>;\n  detail::format_handler<af, char, format_context>\n    h(fmt::detail::buffer_appender<char>(buf), fmt, args, {});\n  fmt::detail::parse_format_string<false>(fmt::to_string_view(fmt), h);\n  return to_string(mbuf);\n}\n\nwstring vformat(wstring_view fmt, wformat_args args);\n\ntemplate<class Out, class... Args>\n  Out format_to(Out out, string_view fmt, const Args&... args) {\n    using context = basic_format_context<Out, decltype(fmt)::value_type>;\n    return vformat_to(out, fmt, make_format_args<context>(args...));\n  }\n\ntemplate<class Out, class... Args>\n  Out format_to(Out out, wstring_view fmt, const Args&... args) {\n    using context = basic_format_context<Out, decltype(fmt)::value_type>;\n    return vformat_to(out, fmt, make_format_args<context>(args...));\n  }\n\ntemplate<class Out>\n  Out vformat_to(Out out, string_view fmt, format_args_t<fmt::type_identity_t<Out>, char> args) {\n    using af = detail::arg_formatter<Out, char>;\n    detail::format_handler<af, char, basic_format_context<Out, char>>\n      h(out, fmt, args, {});\n    fmt::detail::parse_format_string<false>(fmt::to_string_view(fmt), h);\n    return h.context.out();\n  }\n\ntemplate<class Out>\n  Out vformat_to(Out out, wstring_view fmt, format_args_t<fmt::type_identity_t<Out>, wchar_t> args);\n\ntemplate<class Out, class... Args>\n  format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n,\n                                      string_view fmt, const Args&... args);\ntemplate<class Out, class... Args>\n  format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n,\n                                      wstring_view fmt, const Args&... args);\n\ntemplate<class... Args>\n  size_t formatted_size(string_view fmt, const Args&... args);\ntemplate<class... Args>\n  size_t formatted_size(wstring_view fmt, const Args&... args);\n\n#define charT char\n\ntemplate<> struct formatter<charT, charT> : detail::formatter<charT, charT> {};\n\ntemplate<> struct formatter<char, wchar_t>;\n\ntemplate<> struct formatter<charT*, charT> : detail::formatter<const charT*, charT> {};\n\ntemplate<> struct formatter<const charT*, charT> : detail::formatter<const charT*, charT> {};\n\ntemplate<size_t N> struct formatter<const charT[N], charT>\n      : detail::formatter<std::basic_string_view<charT>, charT> {};\n\ntemplate<class traits, class Allocator>\n  struct formatter<basic_string<charT, traits, Allocator>, charT>\n      : detail::formatter<std::basic_string_view<charT>, charT> {};\n\ntemplate<class traits>\n  struct formatter<basic_string_view<charT, traits>, charT>\n      : detail::formatter<std::basic_string_view<charT>, charT> {};\n\ntemplate <> struct formatter<nullptr_t, charT> : detail::formatter<const void*, charT> {};\ntemplate <> struct formatter<void*, charT> : detail::formatter<const void*, charT> {};\ntemplate <> struct formatter<const void*, charT> : detail::formatter<const void*, charT> {};\ntemplate <> struct formatter<bool, charT> : detail::formatter<bool, charT> {};\n\ntemplate <> struct formatter<signed char, charT> : detail::formatter<int, charT> {};\ntemplate <> struct formatter<short, charT> : detail::formatter<int, charT> {};\ntemplate <> struct formatter<int, charT> : detail::formatter<int, charT> {};\ntemplate <> struct formatter<long, charT>\n      : detail::formatter<std::conditional_t<sizeof(long) == sizeof(int), int, long long>, charT> {};\ntemplate <> struct formatter<long long, charT> : detail::formatter<long long, charT> {};\ntemplate <> struct formatter<unsigned char, charT> : detail::formatter<unsigned int, charT> {};\ntemplate <> struct formatter<unsigned short, charT> : detail::formatter<unsigned int, charT> {};\ntemplate <> struct formatter<unsigned int, charT> : detail::formatter<unsigned int, charT> {};\ntemplate <> struct formatter<unsigned long, charT>\n      : detail::formatter<std::conditional_t<sizeof(long) == sizeof(int), unsigned, unsigned long long>, charT> {};\ntemplate <> struct formatter<unsigned long long, charT> : detail::formatter<unsigned long long, charT> {};\n\ntemplate <> struct formatter<float, charT> : detail::formatter<double, charT> {};\ntemplate <> struct formatter<double, charT> : detail::formatter<double, charT> {};\ntemplate <> struct formatter<long double, charT> : detail::formatter<long double, charT> {};\n\n#undef charT\n\n#define charT wchar_t\n\ntemplate<> struct formatter<charT, charT> : detail::formatter<charT, charT> {};\n\ntemplate<> struct formatter<char, wchar_t> : detail::formatter<charT, charT> {};\n\ntemplate<> struct formatter<charT*, charT> : detail::formatter<const charT*, charT> {};\n\ntemplate<> struct formatter<const charT*, charT> : detail::formatter<const charT*, charT> {};\n\ntemplate<size_t N> struct formatter<const charT[N], charT>\n      : detail::formatter<std::basic_string_view<charT>, charT> {};\n\ntemplate<class traits, class Allocator>\n  struct formatter<std::basic_string<charT, traits, Allocator>, charT>\n      : detail::formatter<std::basic_string_view<charT>, charT> {};\n\ntemplate<class traits>\n  struct formatter<std::basic_string_view<charT, traits>, charT>\n      : detail::formatter<std::basic_string_view<charT>, charT> {};\n\ntemplate <> struct formatter<nullptr_t, charT> : detail::formatter<const void*, charT> {};\ntemplate <> struct formatter<void*, charT> : detail::formatter<const void*, charT> {};\ntemplate <> struct formatter<const void*, charT> : detail::formatter<const void*, charT> {};\ntemplate <> struct formatter<bool, charT> : detail::formatter<bool, charT> {};\n\ntemplate <> struct formatter<signed char, charT> : detail::formatter<int, charT> {};\ntemplate <> struct formatter<short, charT> : detail::formatter<int, charT> {};\ntemplate <> struct formatter<int, charT> : detail::formatter<int, charT> {};\ntemplate <> struct formatter<long, charT>\n      : detail::formatter<std::conditional_t<sizeof(long) == sizeof(int), int, long long>, charT> {};\ntemplate <> struct formatter<long long, charT> : detail::formatter<long long, charT> {};\ntemplate <> struct formatter<unsigned char, charT> : detail::formatter<unsigned int, charT> {};\ntemplate <> struct formatter<unsigned short, charT> : detail::formatter<unsigned int, charT> {};\ntemplate <> struct formatter<unsigned int, charT> : detail::formatter<unsigned int, charT> {};\ntemplate <> struct formatter<unsigned long, charT>\n      : detail::formatter<std::conditional_t<sizeof(long) == sizeof(int), unsigned, unsigned long long>, charT> {};\ntemplate <> struct formatter<unsigned long long, charT> : detail::formatter<unsigned long long, charT> {};\n\ntemplate <> struct formatter<float, charT> : detail::formatter<double, charT> {};\ntemplate <> struct formatter<double, charT> : detail::formatter<double, charT> {};\ntemplate <> struct formatter<long double, charT> : detail::formatter<long double, charT> {};\n\n#undef charT\n\n  template<> struct formatter<const wchar_t, char> {\n    formatter() = delete;\n  };\n}\n\n#endif  // FMT_FORMAT_\n"
  },
  {
    "path": "examples/libraries/fmt/test/format-impl-test.cc",
    "content": "// Formatting library for C++ - formatting library implementation tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include <algorithm>\n#include <cstring>\n\n// clang-format off\n#include \"test-assert.h\"\n// clang-format on\n\n#include \"fmt/format.h\"\n#include \"gmock/gmock.h\"\n#include \"util.h\"\n\nusing fmt::detail::bigint;\nusing fmt::detail::fp;\nusing fmt::detail::max_value;\n\nstatic_assert(!std::is_copy_constructible<bigint>::value, \"\");\nstatic_assert(!std::is_copy_assignable<bigint>::value, \"\");\n\nTEST(bigint_test, construct) {\n  EXPECT_EQ(\"\", fmt::format(\"{}\", bigint()));\n  EXPECT_EQ(\"42\", fmt::format(\"{}\", bigint(0x42)));\n  EXPECT_EQ(\"123456789abcedf0\", fmt::format(\"{}\", bigint(0x123456789abcedf0)));\n}\n\nTEST(bigint_test, compare) {\n  bigint n1(42);\n  bigint n2(42);\n  EXPECT_EQ(compare(n1, n2), 0);\n  n2 <<= 32;\n  EXPECT_LT(compare(n1, n2), 0);\n  bigint n3(43);\n  EXPECT_LT(compare(n1, n3), 0);\n  EXPECT_GT(compare(n3, n1), 0);\n  bigint n4(42 * 0x100000001);\n  EXPECT_LT(compare(n2, n4), 0);\n  EXPECT_GT(compare(n4, n2), 0);\n}\n\nTEST(bigint_test, add_compare) {\n  EXPECT_LT(\n      add_compare(bigint(0xffffffff), bigint(0xffffffff), bigint(1) <<= 64), 0);\n  EXPECT_LT(add_compare(bigint(1) <<= 32, bigint(1), bigint(1) <<= 96), 0);\n  EXPECT_GT(add_compare(bigint(1) <<= 32, bigint(0), bigint(0xffffffff)), 0);\n  EXPECT_GT(add_compare(bigint(0), bigint(1) <<= 32, bigint(0xffffffff)), 0);\n  EXPECT_GT(add_compare(bigint(42), bigint(1), bigint(42)), 0);\n  EXPECT_GT(add_compare(bigint(0xffffffff), bigint(1), bigint(0xffffffff)), 0);\n  EXPECT_LT(add_compare(bigint(10), bigint(10), bigint(22)), 0);\n  EXPECT_LT(add_compare(bigint(0x100000010), bigint(0x100000010),\n                        bigint(0x300000010)),\n            0);\n  EXPECT_GT(add_compare(bigint(0x1ffffffff), bigint(0x100000002),\n                        bigint(0x300000000)),\n            0);\n  EXPECT_EQ(add_compare(bigint(0x1ffffffff), bigint(0x100000002),\n                        bigint(0x300000001)),\n            0);\n  EXPECT_LT(add_compare(bigint(0x1ffffffff), bigint(0x100000002),\n                        bigint(0x300000002)),\n            0);\n  EXPECT_LT(add_compare(bigint(0x1ffffffff), bigint(0x100000002),\n                        bigint(0x300000003)),\n            0);\n}\n\nTEST(bigint_test, shift_left) {\n  bigint n(0x42);\n  n <<= 0;\n  EXPECT_EQ(\"42\", fmt::format(\"{}\", n));\n  n <<= 1;\n  EXPECT_EQ(\"84\", fmt::format(\"{}\", n));\n  n <<= 25;\n  EXPECT_EQ(\"108000000\", fmt::format(\"{}\", n));\n}\n\nTEST(bigint_test, multiply) {\n  bigint n(0x42);\n  EXPECT_THROW(n *= 0, assertion_failure);\n  n *= 1;\n  EXPECT_EQ(\"42\", fmt::format(\"{}\", n));\n  n *= 2;\n  EXPECT_EQ(\"84\", fmt::format(\"{}\", n));\n  n *= 0x12345678;\n  EXPECT_EQ(\"962fc95e0\", fmt::format(\"{}\", n));\n  bigint bigmax(max_value<uint32_t>());\n  bigmax *= max_value<uint32_t>();\n  EXPECT_EQ(\"fffffffe00000001\", fmt::format(\"{}\", bigmax));\n  bigmax.assign(max_value<uint64_t>());\n  bigmax *= max_value<uint64_t>();\n  EXPECT_EQ(\"fffffffffffffffe0000000000000001\", fmt::format(\"{}\", bigmax));\n}\n\nTEST(bigint_test, accumulator) {\n  fmt::detail::accumulator acc;\n  EXPECT_EQ(acc.lower, 0);\n  EXPECT_EQ(acc.upper, 0);\n  acc.upper = 12;\n  acc.lower = 34;\n  EXPECT_EQ(static_cast<uint32_t>(acc), 34);\n  acc += 56;\n  EXPECT_EQ(acc.lower, 90);\n  acc += max_value<uint64_t>();\n  EXPECT_EQ(acc.upper, 13);\n  EXPECT_EQ(acc.lower, 89);\n  acc >>= 32;\n  EXPECT_EQ(acc.upper, 0);\n  EXPECT_EQ(acc.lower, 13 * 0x100000000);\n}\n\nTEST(bigint_test, square) {\n  bigint n0(0);\n  n0.square();\n  EXPECT_EQ(\"0\", fmt::format(\"{}\", n0));\n  bigint n1(0x100);\n  n1.square();\n  EXPECT_EQ(\"10000\", fmt::format(\"{}\", n1));\n  bigint n2(0xfffffffff);\n  n2.square();\n  EXPECT_EQ(\"ffffffffe000000001\", fmt::format(\"{}\", n2));\n  bigint n3(max_value<uint64_t>());\n  n3.square();\n  EXPECT_EQ(\"fffffffffffffffe0000000000000001\", fmt::format(\"{}\", n3));\n  bigint n4;\n  n4.assign_pow10(10);\n  EXPECT_EQ(\"2540be400\", fmt::format(\"{}\", n4));\n}\n\nTEST(bigint_test, divmod_assign_zero_divisor) {\n  bigint zero(0);\n  EXPECT_THROW(bigint(0).divmod_assign(zero), assertion_failure);\n  EXPECT_THROW(bigint(42).divmod_assign(zero), assertion_failure);\n}\n\nTEST(bigint_test, divmod_assign_self) {\n  bigint n(100);\n  EXPECT_THROW(n.divmod_assign(n), assertion_failure);\n}\n\nTEST(bigint_test, divmod_assign_unaligned) {\n  // (42 << 340) / pow(10, 100):\n  bigint n1(42);\n  n1 <<= 340;\n  bigint n2;\n  n2.assign_pow10(100);\n  int result = n1.divmod_assign(n2);\n  EXPECT_EQ(result, 9406);\n  EXPECT_EQ(\"10f8353019583bfc29ffc8f564e1b9f9d819dbb4cf783e4507eca1539220p96\",\n            fmt::format(\"{}\", n1));\n}\n\nTEST(bigint_test, divmod_assign) {\n  // 100 / 10:\n  bigint n1(100);\n  int result = n1.divmod_assign(bigint(10));\n  EXPECT_EQ(result, 10);\n  EXPECT_EQ(\"0\", fmt::format(\"{}\", n1));\n  // pow(10, 100) / (42 << 320):\n  n1.assign_pow10(100);\n  result = n1.divmod_assign(bigint(42) <<= 320);\n  EXPECT_EQ(result, 111);\n  EXPECT_EQ(\"13ad2594c37ceb0b2784c4ce0bf38ace408e211a7caab24308a82e8f10p96\",\n            fmt::format(\"{}\", n1));\n  // 42 / 100:\n  bigint n2(42);\n  n1.assign_pow10(2);\n  result = n2.divmod_assign(n1);\n  EXPECT_EQ(result, 0);\n  EXPECT_EQ(\"2a\", fmt::format(\"{}\", n2));\n}\n\ntemplate <bool is_iec559> void run_double_tests() {\n  fmt::print(\"warning: double is not IEC559, skipping FP tests\\n\");\n}\n\ntemplate <> void run_double_tests<true>() {\n  // Construct from double.\n  EXPECT_EQ(fp(1.23), fp(0x13ae147ae147aeu, -52));\n}\n\nTEST(fp_test, double_tests) {\n  run_double_tests<std::numeric_limits<double>::is_iec559>();\n}\n\nTEST(fp_test, normalize) {\n  const auto v = fp(0xbeef, 42);\n  auto normalized = normalize(v);\n  EXPECT_EQ(0xbeef000000000000, normalized.f);\n  EXPECT_EQ(-6, normalized.e);\n}\n\nTEST(fp_test, multiply) {\n  auto v = fp(123ULL << 32, 4) * fp(56ULL << 32, 7);\n  EXPECT_EQ(v.f, 123u * 56u);\n  EXPECT_EQ(v.e, 4 + 7 + 64);\n  v = fp(123ULL << 32, 4) * fp(567ULL << 31, 8);\n  EXPECT_EQ(v.f, (123 * 567 + 1u) / 2);\n  EXPECT_EQ(v.e, 4 + 8 + 64);\n}\n\nTEST(fp_test, get_cached_power) {\n  using limits = std::numeric_limits<double>;\n  for (auto exp = limits::min_exponent; exp <= limits::max_exponent; ++exp) {\n    int dec_exp = 0;\n    auto fp = fmt::detail::get_cached_power(exp, dec_exp);\n    bigint exact, cache(fp.f);\n    if (dec_exp >= 0) {\n      exact.assign_pow10(dec_exp);\n      if (fp.e <= 0)\n        exact <<= -fp.e;\n      else\n        cache <<= fp.e;\n      exact.align(cache);\n      cache.align(exact);\n      auto exact_str = fmt::format(\"{}\", exact);\n      auto cache_str = fmt::format(\"{}\", cache);\n      EXPECT_EQ(exact_str.size(), cache_str.size());\n      EXPECT_EQ(exact_str.substr(0, 15), cache_str.substr(0, 15));\n      int diff = cache_str[15] - exact_str[15];\n      if (diff == 1)\n        EXPECT_GT(exact_str[16], '8');\n      else\n        EXPECT_EQ(diff, 0);\n    } else {\n      cache.assign_pow10(-dec_exp);\n      cache *= fp.f + 1;  // Inexact check.\n      exact.assign(1);\n      exact <<= -fp.e;\n      exact.align(cache);\n      auto exact_str = fmt::format(\"{}\", exact);\n      auto cache_str = fmt::format(\"{}\", cache);\n      EXPECT_EQ(exact_str.size(), cache_str.size());\n      EXPECT_EQ(exact_str.substr(0, 16), cache_str.substr(0, 16));\n    }\n  }\n}\n\nTEST(fp_test, dragonbox_max_k) {\n  using fmt::detail::dragonbox::floor_log10_pow2;\n  using float_info = fmt::detail::dragonbox::float_info<float>;\n  EXPECT_EQ(fmt::detail::const_check(float_info::max_k),\n            float_info::kappa - floor_log10_pow2(float_info::min_exponent -\n                                                 float_info::significand_bits));\n  using double_info = fmt::detail::dragonbox::float_info<double>;\n  EXPECT_EQ(\n      fmt::detail::const_check(double_info::max_k),\n      double_info::kappa - floor_log10_pow2(double_info::min_exponent -\n                                            double_info::significand_bits));\n}\n\nTEST(fp_test, get_round_direction) {\n  using fmt::detail::get_round_direction;\n  using fmt::detail::round_direction;\n  EXPECT_EQ(round_direction::down, get_round_direction(100, 50, 0));\n  EXPECT_EQ(round_direction::up, get_round_direction(100, 51, 0));\n  EXPECT_EQ(round_direction::down, get_round_direction(100, 40, 10));\n  EXPECT_EQ(round_direction::up, get_round_direction(100, 60, 10));\n  for (size_t i = 41; i < 60; ++i)\n    EXPECT_EQ(round_direction::unknown, get_round_direction(100, i, 10));\n  uint64_t max = max_value<uint64_t>();\n  EXPECT_THROW(get_round_direction(100, 100, 0), assertion_failure);\n  EXPECT_THROW(get_round_direction(100, 0, 100), assertion_failure);\n  EXPECT_THROW(get_round_direction(100, 0, 50), assertion_failure);\n  // Check that remainder + error doesn't overflow.\n  EXPECT_EQ(round_direction::up, get_round_direction(max, max - 1, 2));\n  // Check that 2 * (remainder + error) doesn't overflow.\n  EXPECT_EQ(round_direction::unknown,\n            get_round_direction(max, max / 2 + 1, max / 2));\n  // Check that remainder - error doesn't overflow.\n  EXPECT_EQ(round_direction::unknown, get_round_direction(100, 40, 41));\n  // Check that 2 * (remainder - error) doesn't overflow.\n  EXPECT_EQ(round_direction::up, get_round_direction(max, max - 1, 1));\n}\n\nTEST(fp_test, fixed_handler) {\n  struct handler : fmt::detail::fixed_handler {\n    char buffer[10];\n    handler(int prec = 0) : fmt::detail::fixed_handler() {\n      buf = buffer;\n      precision = prec;\n    }\n  };\n  int exp = 0;\n  handler().on_digit('0', 100, 99, 0, exp, false);\n  EXPECT_THROW(handler().on_digit('0', 100, 100, 0, exp, false),\n               assertion_failure);\n  namespace digits = fmt::detail::digits;\n  EXPECT_EQ(handler(1).on_digit('0', 100, 10, 10, exp, false), digits::error);\n  // Check that divisor - error doesn't overflow.\n  EXPECT_EQ(handler(1).on_digit('0', 100, 10, 101, exp, false), digits::error);\n  // Check that 2 * error doesn't overflow.\n  uint64_t max = max_value<uint64_t>();\n  EXPECT_EQ(handler(1).on_digit('0', max, 10, max - 1, exp, false),\n            digits::error);\n}\n\nTEST(fp_test, grisu_format_compiles_with_on_ieee_double) {\n  fmt::memory_buffer buf;\n  format_float(0.42, -1, fmt::detail::float_specs(), buf);\n}\n\nTEST(format_impl_test, format_error_code) {\n  std::string msg = \"error 42\", sep = \": \";\n  {\n    fmt::memory_buffer buffer;\n    format_to(fmt::appender(buffer), \"garbage\");\n    fmt::detail::format_error_code(buffer, 42, \"test\");\n    EXPECT_EQ(\"test: \" + msg, to_string(buffer));\n  }\n  {\n    fmt::memory_buffer buffer;\n    auto prefix =\n        std::string(fmt::inline_buffer_size - msg.size() - sep.size() + 1, 'x');\n    fmt::detail::format_error_code(buffer, 42, prefix);\n    EXPECT_EQ(msg, to_string(buffer));\n  }\n  int codes[] = {42, -1};\n  for (size_t i = 0, n = sizeof(codes) / sizeof(*codes); i < n; ++i) {\n    // Test maximum buffer size.\n    msg = fmt::format(\"error {}\", codes[i]);\n    fmt::memory_buffer buffer;\n    auto prefix =\n        std::string(fmt::inline_buffer_size - msg.size() - sep.size(), 'x');\n    fmt::detail::format_error_code(buffer, codes[i], prefix);\n    EXPECT_EQ(prefix + sep + msg, to_string(buffer));\n    size_t size = fmt::inline_buffer_size;\n    EXPECT_EQ(size, buffer.size());\n    buffer.resize(0);\n    // Test with a message that doesn't fit into the buffer.\n    prefix += 'x';\n    fmt::detail::format_error_code(buffer, codes[i], prefix);\n    EXPECT_EQ(msg, to_string(buffer));\n  }\n}\n\nTEST(format_impl_test, compute_width) {\n  EXPECT_EQ(4,\n            fmt::detail::compute_width(\n                fmt::basic_string_view<fmt::detail::char8_type>(\n                    reinterpret_cast<const fmt::detail::char8_type*>(\"ёжик\"))));\n}\n\n// Tests fmt::detail::count_digits for integer type Int.\ntemplate <typename Int> void test_count_digits() {\n  for (Int i = 0; i < 10; ++i) EXPECT_EQ(1u, fmt::detail::count_digits(i));\n  for (Int i = 1, n = 1, end = max_value<Int>() / 10; n <= end; ++i) {\n    n *= 10;\n    EXPECT_EQ(i, fmt::detail::count_digits(n - 1));\n    EXPECT_EQ(i + 1, fmt::detail::count_digits(n));\n  }\n}\n\nTEST(format_impl_test, count_digits) {\n  test_count_digits<uint32_t>();\n  test_count_digits<uint64_t>();\n}\n\nTEST(format_impl_test, write_fallback_uintptr) {\n  std::string s;\n  fmt::detail::write_ptr<char>(\n      std::back_inserter(s),\n      fmt::detail::fallback_uintptr(reinterpret_cast<void*>(0xface)), nullptr);\n  EXPECT_EQ(s, \"0xface\");\n}\n\n#ifdef _WIN32\n#  include <windows.h>\n#endif\n\n#ifdef _WIN32\nTEST(format_impl_test, write_console_signature) {\n  decltype(WriteConsoleW)* p = fmt::detail::WriteConsoleW;\n  (void)p;\n}\n#endif\n"
  },
  {
    "path": "examples/libraries/fmt/test/format-test.cc",
    "content": "// Formatting library for C++ - formatting library tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n// Check if fmt/format.h compiles with windows.h included before it.\n#ifdef _WIN32\n#  include <windows.h>\n#endif\n// clang-format off\n#include \"fmt/format.h\"\n// clang-format on\n\n#include <stdint.h>  // uint32_t\n\n#include <climits>      // INT_MAX\n#include <cmath>        // std::signbit\n#include <cstring>      // std::strlen\n#include <iterator>     // std::back_inserter\n#include <list>         // std::list\n#include <memory>       // std::unique_ptr\n#include <type_traits>  // std::is_default_constructible\n\n#include \"gtest-extra.h\"\n#include \"mock-allocator.h\"\n#include \"util.h\"\n\nusing fmt::basic_memory_buffer;\nusing fmt::format_error;\nusing fmt::memory_buffer;\nusing fmt::runtime;\nusing fmt::string_view;\nusing fmt::detail::max_value;\n\nusing testing::Return;\nusing testing::StrictMock;\n\nenum { buffer_size = 256 };\n\nstruct uint32_pair {\n  uint32_t u[2];\n};\n\nTEST(util_test, bit_cast) {\n  auto s = fmt::detail::bit_cast<uint32_pair>(uint64_t{42});\n  EXPECT_EQ(fmt::detail::bit_cast<uint64_t>(s), 42ull);\n  s = fmt::detail::bit_cast<uint32_pair>(~uint64_t{0});\n  EXPECT_EQ(fmt::detail::bit_cast<uint64_t>(s), ~0ull);\n}\n\n// Increment a number in a string.\nvoid increment(char* s) {\n  for (int i = static_cast<int>(std::strlen(s)) - 1; i >= 0; --i) {\n    if (s[i] != '9') {\n      ++s[i];\n      break;\n    }\n    s[i] = '0';\n  }\n}\n\nTEST(util_test, increment) {\n  char s[10] = \"123\";\n  increment(s);\n  EXPECT_STREQ(\"124\", s);\n  s[2] = '8';\n  increment(s);\n  EXPECT_STREQ(\"129\", s);\n  increment(s);\n  EXPECT_STREQ(\"130\", s);\n  s[1] = s[2] = '9';\n  increment(s);\n  EXPECT_STREQ(\"200\", s);\n}\n\nTEST(util_test, parse_nonnegative_int) {\n  auto s = fmt::string_view(\"10000000000\");\n  auto begin = s.begin(), end = s.end();\n  EXPECT_EQ(fmt::detail::parse_nonnegative_int(begin, end, -1), -1);\n  s = \"2147483649\";\n  begin = s.begin();\n  end = s.end();\n  EXPECT_EQ(fmt::detail::parse_nonnegative_int(begin, end, -1), -1);\n}\n\nTEST(util_test, utf8_to_utf16) {\n  auto u = fmt::detail::utf8_to_utf16(\"лошадка\");\n  EXPECT_EQ(L\"\\x043B\\x043E\\x0448\\x0430\\x0434\\x043A\\x0430\", u.str());\n  EXPECT_EQ(7, u.size());\n  // U+10437 { DESERET SMALL LETTER YEE }\n  EXPECT_EQ(L\"\\xD801\\xDC37\", fmt::detail::utf8_to_utf16(\"𐐷\").str());\n  EXPECT_THROW_MSG(fmt::detail::utf8_to_utf16(\"\\xc3\\x28\"), std::runtime_error,\n                   \"invalid utf8\");\n  EXPECT_THROW_MSG(fmt::detail::utf8_to_utf16(fmt::string_view(\"л\", 1)),\n                   std::runtime_error, \"invalid utf8\");\n  EXPECT_EQ(L\"123456\", fmt::detail::utf8_to_utf16(\"123456\").str());\n}\n\nTEST(util_test, utf8_to_utf16_empty_string) {\n  auto s = std::string();\n  auto u = fmt::detail::utf8_to_utf16(s.c_str());\n  EXPECT_EQ(L\"\", u.str());\n  EXPECT_EQ(s.size(), u.size());\n}\n\nTEST(util_test, allocator_ref) {\n  using test_allocator_ref = allocator_ref<mock_allocator<int>>;\n  auto check_forwarding = [](mock_allocator<int>& alloc,\n                             test_allocator_ref& ref) {\n    int mem;\n    // Check if value_type is properly defined.\n    allocator_ref<mock_allocator<int>>::value_type* ptr = &mem;\n    // Check forwarding.\n    EXPECT_CALL(alloc, allocate(42)).WillOnce(Return(ptr));\n    ref.allocate(42);\n    EXPECT_CALL(alloc, deallocate(ptr, 42));\n    ref.deallocate(ptr, 42);\n  };\n\n  StrictMock<mock_allocator<int>> alloc;\n  auto ref = test_allocator_ref(&alloc);\n  // Check if allocator_ref forwards to the underlying allocator.\n  check_forwarding(alloc, ref);\n  test_allocator_ref ref2(ref);\n  check_forwarding(alloc, ref2);\n  test_allocator_ref ref3;\n  EXPECT_EQ(nullptr, ref3.get());\n  ref3 = ref;\n  check_forwarding(alloc, ref3);\n}\n\nTEST(util_test, format_system_error) {\n  fmt::memory_buffer message;\n  fmt::format_system_error(message, EDOM, \"test\");\n  auto ec = std::error_code(EDOM, std::generic_category());\n  EXPECT_EQ(to_string(message), std::system_error(ec, \"test\").what());\n  message = fmt::memory_buffer();\n\n  // Check if std::allocator throws on allocating max size_t / 2 chars.\n  size_t max_size = max_value<size_t>() / 2;\n  bool throws_on_alloc = false;\n  try {\n    auto alloc = std::allocator<char>();\n    alloc.deallocate(alloc.allocate(max_size), max_size);\n  } catch (const std::bad_alloc&) {\n    throws_on_alloc = true;\n  }\n  if (!throws_on_alloc) {\n    fmt::print(\"warning: std::allocator allocates {} chars\", max_size);\n    return;\n  }\n}\n\nTEST(util_test, system_error) {\n  auto test_error = fmt::system_error(EDOM, \"test\");\n  auto ec = std::error_code(EDOM, std::generic_category());\n  EXPECT_STREQ(test_error.what(), std::system_error(ec, \"test\").what());\n  EXPECT_EQ(test_error.code(), ec);\n\n  auto error = std::system_error(std::error_code());\n  try {\n    throw fmt::system_error(EDOM, \"test {}\", \"error\");\n  } catch (const std::system_error& e) {\n    error = e;\n  }\n  fmt::memory_buffer message;\n  fmt::format_system_error(message, EDOM, \"test error\");\n  EXPECT_EQ(error.what(), to_string(message));\n  EXPECT_EQ(error.code(), std::error_code(EDOM, std::generic_category()));\n}\n\nTEST(util_test, report_system_error) {\n  fmt::memory_buffer out;\n  fmt::format_system_error(out, EDOM, \"test error\");\n  out.push_back('\\n');\n  EXPECT_WRITE(stderr, fmt::report_system_error(EDOM, \"test error\"),\n               to_string(out));\n}\n\nTEST(memory_buffer_test, ctor) {\n  basic_memory_buffer<char, 123> buffer;\n  EXPECT_EQ(static_cast<size_t>(0), buffer.size());\n  EXPECT_EQ(123u, buffer.capacity());\n}\n\nusing std_allocator = allocator_ref<std::allocator<char>>;\n\nTEST(memory_buffer_test, move_ctor_inline_buffer) {\n  auto check_move_buffer =\n      [](const char* str, basic_memory_buffer<char, 5, std_allocator>& buffer) {\n        std::allocator<char>* alloc = buffer.get_allocator().get();\n        basic_memory_buffer<char, 5, std_allocator> buffer2(std::move(buffer));\n        // Move shouldn't destroy the inline content of the first buffer.\n        EXPECT_EQ(str, std::string(&buffer[0], buffer.size()));\n        EXPECT_EQ(str, std::string(&buffer2[0], buffer2.size()));\n        EXPECT_EQ(5u, buffer2.capacity());\n        // Move should transfer allocator.\n        EXPECT_EQ(nullptr, buffer.get_allocator().get());\n        EXPECT_EQ(alloc, buffer2.get_allocator().get());\n      };\n\n  auto alloc = std::allocator<char>();\n  basic_memory_buffer<char, 5, std_allocator> buffer((std_allocator(&alloc)));\n  const char test[] = \"test\";\n  buffer.append(string_view(test, 4));\n  check_move_buffer(\"test\", buffer);\n  // Adding one more character fills the inline buffer, but doesn't cause\n  // dynamic allocation.\n  buffer.push_back('a');\n  check_move_buffer(\"testa\", buffer);\n}\n\nTEST(memory_buffer_test, move_ctor_dynamic_buffer) {\n  auto alloc = std::allocator<char>();\n  basic_memory_buffer<char, 4, std_allocator> buffer((std_allocator(&alloc)));\n  const char test[] = \"test\";\n  buffer.append(test, test + 4);\n  const char* inline_buffer_ptr = &buffer[0];\n  // Adding one more character causes the content to move from the inline to\n  // a dynamically allocated buffer.\n  buffer.push_back('a');\n  basic_memory_buffer<char, 4, std_allocator> buffer2(std::move(buffer));\n  // Move should rip the guts of the first buffer.\n  EXPECT_EQ(inline_buffer_ptr, &buffer[0]);\n  EXPECT_EQ(\"testa\", std::string(&buffer2[0], buffer2.size()));\n  EXPECT_GT(buffer2.capacity(), 4u);\n}\n\nvoid check_move_assign_buffer(const char* str,\n                              basic_memory_buffer<char, 5>& buffer) {\n  basic_memory_buffer<char, 5> buffer2;\n  buffer2 = std::move(buffer);\n  // Move shouldn't destroy the inline content of the first buffer.\n  EXPECT_EQ(str, std::string(&buffer[0], buffer.size()));\n  EXPECT_EQ(str, std::string(&buffer2[0], buffer2.size()));\n  EXPECT_EQ(5u, buffer2.capacity());\n}\n\nTEST(memory_buffer_test, move_assignment) {\n  basic_memory_buffer<char, 5> buffer;\n  const char test[] = \"test\";\n  buffer.append(test, test + 4);\n  check_move_assign_buffer(\"test\", buffer);\n  // Adding one more character fills the inline buffer, but doesn't cause\n  // dynamic allocation.\n  buffer.push_back('a');\n  check_move_assign_buffer(\"testa\", buffer);\n  const char* inline_buffer_ptr = &buffer[0];\n  // Adding one more character causes the content to move from the inline to\n  // a dynamically allocated buffer.\n  buffer.push_back('b');\n  basic_memory_buffer<char, 5> buffer2;\n  buffer2 = std::move(buffer);\n  // Move should rip the guts of the first buffer.\n  EXPECT_EQ(inline_buffer_ptr, &buffer[0]);\n  EXPECT_EQ(\"testab\", std::string(&buffer2[0], buffer2.size()));\n  EXPECT_GT(buffer2.capacity(), 5u);\n}\n\nTEST(memory_buffer_test, grow) {\n  typedef allocator_ref<mock_allocator<int>> Allocator;\n  mock_allocator<int> alloc;\n  basic_memory_buffer<int, 10, Allocator> buffer((Allocator(&alloc)));\n  buffer.resize(7);\n  using fmt::detail::to_unsigned;\n  for (int i = 0; i < 7; ++i) buffer[to_unsigned(i)] = i * i;\n  EXPECT_EQ(10u, buffer.capacity());\n  int mem[20];\n  mem[7] = 0xdead;\n  EXPECT_CALL(alloc, allocate(20)).WillOnce(Return(mem));\n  buffer.try_reserve(20);\n  EXPECT_EQ(20u, buffer.capacity());\n  // Check if size elements have been copied\n  for (int i = 0; i < 7; ++i) EXPECT_EQ(i * i, buffer[to_unsigned(i)]);\n  // and no more than that.\n  EXPECT_EQ(0xdead, buffer[7]);\n  EXPECT_CALL(alloc, deallocate(mem, 20));\n}\n\nTEST(memory_buffer_test, allocator) {\n  using test_allocator = allocator_ref<mock_allocator<char>>;\n  basic_memory_buffer<char, 10, test_allocator> buffer;\n  EXPECT_EQ(nullptr, buffer.get_allocator().get());\n  StrictMock<mock_allocator<char>> alloc;\n  char mem;\n  {\n    basic_memory_buffer<char, 10, test_allocator> buffer2(\n        (test_allocator(&alloc)));\n    EXPECT_EQ(&alloc, buffer2.get_allocator().get());\n    size_t size = 2 * fmt::inline_buffer_size;\n    EXPECT_CALL(alloc, allocate(size)).WillOnce(Return(&mem));\n    buffer2.reserve(size);\n    EXPECT_CALL(alloc, deallocate(&mem, size));\n  }\n}\n\nTEST(memory_buffer_test, exception_in_deallocate) {\n  using test_allocator = allocator_ref<mock_allocator<char>>;\n  StrictMock<mock_allocator<char>> alloc;\n  basic_memory_buffer<char, 10, test_allocator> buffer(\n      (test_allocator(&alloc)));\n  size_t size = 2 * fmt::inline_buffer_size;\n  auto mem = std::vector<char>(size);\n  {\n    EXPECT_CALL(alloc, allocate(size)).WillOnce(Return(&mem[0]));\n    buffer.resize(size);\n    std::fill(&buffer[0], &buffer[0] + size, 'x');\n  }\n  auto mem2 = std::vector<char>(2 * size);\n  {\n    EXPECT_CALL(alloc, allocate(2 * size)).WillOnce(Return(&mem2[0]));\n    auto e = std::exception();\n    EXPECT_CALL(alloc, deallocate(&mem[0], size)).WillOnce(testing::Throw(e));\n    EXPECT_THROW(buffer.reserve(2 * size), std::exception);\n    EXPECT_EQ(&mem2[0], &buffer[0]);\n    // Check that the data has been copied.\n    for (size_t i = 0; i < size; ++i) EXPECT_EQ('x', buffer[i]);\n  }\n  EXPECT_CALL(alloc, deallocate(&mem2[0], 2 * size));\n}\n\ntemplate <typename Allocator, size_t MaxSize>\nclass max_size_allocator : public Allocator {\n public:\n  using typename Allocator::value_type;\n  size_t max_size() const FMT_NOEXCEPT { return MaxSize; }\n  value_type* allocate(size_t n) {\n    if (n > max_size()) {\n      throw std::length_error(\"size > max_size\");\n    }\n    return std::allocator_traits<Allocator>::allocate(\n        *static_cast<Allocator*>(this), n);\n  }\n  void deallocate(value_type* p, size_t n) {\n    std::allocator_traits<Allocator>::deallocate(*static_cast<Allocator*>(this),\n                                                 p, n);\n  }\n};\n\nTEST(memory_buffer_test, max_size_allocator) {\n  // 160 = 128 + 32\n  using test_allocator = max_size_allocator<std::allocator<char>, 160>;\n  basic_memory_buffer<char, 10, test_allocator> buffer;\n  buffer.resize(128);\n  // new_capacity = 128 + 128/2 = 192 > 160\n  buffer.resize(160);  // Shouldn't throw.\n}\n\nTEST(memory_buffer_test, max_size_allocator_overflow) {\n  using test_allocator = max_size_allocator<std::allocator<char>, 160>;\n  basic_memory_buffer<char, 10, test_allocator> buffer;\n  EXPECT_THROW(buffer.resize(161), std::exception);\n}\n\nTEST(format_test, escape) {\n  EXPECT_EQ(\"{\", fmt::format(\"{{\"));\n  EXPECT_EQ(\"before {\", fmt::format(\"before {{\"));\n  EXPECT_EQ(\"{ after\", fmt::format(\"{{ after\"));\n  EXPECT_EQ(\"before { after\", fmt::format(\"before {{ after\"));\n\n  EXPECT_EQ(\"}\", fmt::format(\"}}\"));\n  EXPECT_EQ(\"before }\", fmt::format(\"before }}\"));\n  EXPECT_EQ(\"} after\", fmt::format(\"}} after\"));\n  EXPECT_EQ(\"before } after\", fmt::format(\"before }} after\"));\n\n  EXPECT_EQ(\"{}\", fmt::format(\"{{}}\"));\n  EXPECT_EQ(\"{42}\", fmt::format(\"{{{0}}}\", 42));\n}\n\nTEST(format_test, unmatched_braces) {\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{\")), format_error,\n                   \"invalid format string\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"}\")), format_error,\n                   \"unmatched '}' in format string\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0{}\")), format_error,\n                   \"invalid format string\");\n}\n\nTEST(format_test, no_args) { EXPECT_EQ(\"test\", fmt::format(\"test\")); }\n\nTEST(format_test, args_in_different_positions) {\n  EXPECT_EQ(\"42\", fmt::format(\"{0}\", 42));\n  EXPECT_EQ(\"before 42\", fmt::format(\"before {0}\", 42));\n  EXPECT_EQ(\"42 after\", fmt::format(\"{0} after\", 42));\n  EXPECT_EQ(\"before 42 after\", fmt::format(\"before {0} after\", 42));\n  EXPECT_EQ(\"answer = 42\", fmt::format(\"{0} = {1}\", \"answer\", 42));\n  EXPECT_EQ(\"42 is the answer\", fmt::format(\"{1} is the {0}\", \"answer\", 42));\n  EXPECT_EQ(\"abracadabra\", fmt::format(\"{0}{1}{0}\", \"abra\", \"cad\"));\n}\n\nTEST(format_test, arg_errors) {\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{\")), format_error,\n                   \"invalid format string\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{?}\")), format_error,\n                   \"invalid format string\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0\")), format_error,\n                   \"invalid format string\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0}\")), format_error,\n                   \"argument not found\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{00}\"), 42), format_error,\n                   \"invalid format string\");\n\n  char format_str[buffer_size];\n  safe_sprintf(format_str, \"{%u\", INT_MAX);\n  EXPECT_THROW_MSG(fmt::format(runtime(format_str)), format_error,\n                   \"invalid format string\");\n  safe_sprintf(format_str, \"{%u}\", INT_MAX);\n  EXPECT_THROW_MSG(fmt::format(runtime(format_str)), format_error,\n                   \"argument not found\");\n\n  safe_sprintf(format_str, \"{%u\", INT_MAX + 1u);\n  EXPECT_THROW_MSG(fmt::format(runtime(format_str)), format_error,\n                   \"invalid format string\");\n  safe_sprintf(format_str, \"{%u}\", INT_MAX + 1u);\n  EXPECT_THROW_MSG(fmt::format(runtime(format_str)), format_error,\n                   \"argument not found\");\n}\n\ntemplate <int N> struct test_format {\n  template <typename... T>\n  static std::string format(fmt::string_view fmt, const T&... args) {\n    return test_format<N - 1>::format(fmt, N - 1, args...);\n  }\n};\n\ntemplate <> struct test_format<0> {\n  template <typename... T>\n  static std::string format(fmt::string_view fmt, const T&... args) {\n    return fmt::format(runtime(fmt), args...);\n  }\n};\n\nTEST(format_test, many_args) {\n  EXPECT_EQ(\"19\", test_format<20>::format(\"{19}\"));\n  EXPECT_THROW_MSG(test_format<20>::format(\"{20}\"), format_error,\n                   \"argument not found\");\n  EXPECT_THROW_MSG(test_format<21>::format(\"{21}\"), format_error,\n                   \"argument not found\");\n  using fmt::detail::max_packed_args;\n  std::string format_str = fmt::format(\"{{{}}}\", max_packed_args + 1);\n  EXPECT_THROW_MSG(test_format<max_packed_args>::format(format_str),\n                   format_error, \"argument not found\");\n}\n\nTEST(format_test, named_arg) {\n  EXPECT_EQ(\"1/a/A\", fmt::format(\"{_1}/{a_}/{A_}\", fmt::arg(\"a_\", 'a'),\n                                 fmt::arg(\"A_\", \"A\"), fmt::arg(\"_1\", 1)));\n  EXPECT_EQ(\" -42\", fmt::format(\"{0:{width}}\", -42, fmt::arg(\"width\", 4)));\n  EXPECT_EQ(\"st\",\n            fmt::format(\"{0:.{precision}}\", \"str\", fmt::arg(\"precision\", 2)));\n  EXPECT_EQ(\"1 2\", fmt::format(\"{} {two}\", 1, fmt::arg(\"two\", 2)));\n  EXPECT_EQ(\"42\",\n            fmt::format(\"{c}\", fmt::arg(\"a\", 0), fmt::arg(\"b\", 0),\n                        fmt::arg(\"c\", 42), fmt::arg(\"d\", 0), fmt::arg(\"e\", 0),\n                        fmt::arg(\"f\", 0), fmt::arg(\"g\", 0), fmt::arg(\"h\", 0),\n                        fmt::arg(\"i\", 0), fmt::arg(\"j\", 0), fmt::arg(\"k\", 0),\n                        fmt::arg(\"l\", 0), fmt::arg(\"m\", 0), fmt::arg(\"n\", 0),\n                        fmt::arg(\"o\", 0), fmt::arg(\"p\", 0)));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{a}\")), format_error,\n                   \"argument not found\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{a}\"), 42), format_error,\n                   \"argument not found\");\n}\n\nTEST(format_test, auto_arg_index) {\n  EXPECT_EQ(\"abc\", fmt::format(\"{}{}{}\", 'a', 'b', 'c'));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0}{}\"), 'a', 'b'), format_error,\n                   \"cannot switch from manual to automatic argument indexing\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{}{0}\"), 'a', 'b'), format_error,\n                   \"cannot switch from automatic to manual argument indexing\");\n  EXPECT_EQ(\"1.2\", fmt::format(\"{:.{}}\", 1.2345, 2));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0}:.{}\"), 1.2345, 2), format_error,\n                   \"cannot switch from manual to automatic argument indexing\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:.{0}}\"), 1.2345, 2), format_error,\n                   \"cannot switch from automatic to manual argument indexing\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{}\")), format_error,\n                   \"argument not found\");\n}\n\nTEST(format_test, empty_specs) { EXPECT_EQ(\"42\", fmt::format(\"{0:}\", 42)); }\n\nTEST(format_test, left_align) {\n  EXPECT_EQ(\"42  \", fmt::format(\"{0:<4}\", 42));\n  EXPECT_EQ(\"42  \", fmt::format(\"{0:<4o}\", 042));\n  EXPECT_EQ(\"42  \", fmt::format(\"{0:<4x}\", 0x42));\n  EXPECT_EQ(\"-42  \", fmt::format(\"{0:<5}\", -42));\n  EXPECT_EQ(\"42   \", fmt::format(\"{0:<5}\", 42u));\n  EXPECT_EQ(\"-42  \", fmt::format(\"{0:<5}\", -42l));\n  EXPECT_EQ(\"42   \", fmt::format(\"{0:<5}\", 42ul));\n  EXPECT_EQ(\"-42  \", fmt::format(\"{0:<5}\", -42ll));\n  EXPECT_EQ(\"42   \", fmt::format(\"{0:<5}\", 42ull));\n  EXPECT_EQ(\"-42  \", fmt::format(\"{0:<5}\", -42.0));\n  EXPECT_EQ(\"-42  \", fmt::format(\"{0:<5}\", -42.0l));\n  EXPECT_EQ(\"c    \", fmt::format(\"{0:<5}\", 'c'));\n  EXPECT_EQ(\"abc  \", fmt::format(\"{0:<5}\", \"abc\"));\n  EXPECT_EQ(\"0xface  \", fmt::format(\"{0:<8}\", reinterpret_cast<void*>(0xface)));\n}\n\nTEST(format_test, right_align) {\n  EXPECT_EQ(\"  42\", fmt::format(\"{0:>4}\", 42));\n  EXPECT_EQ(\"  42\", fmt::format(\"{0:>4o}\", 042));\n  EXPECT_EQ(\"  42\", fmt::format(\"{0:>4x}\", 0x42));\n  EXPECT_EQ(\"  -42\", fmt::format(\"{0:>5}\", -42));\n  EXPECT_EQ(\"   42\", fmt::format(\"{0:>5}\", 42u));\n  EXPECT_EQ(\"  -42\", fmt::format(\"{0:>5}\", -42l));\n  EXPECT_EQ(\"   42\", fmt::format(\"{0:>5}\", 42ul));\n  EXPECT_EQ(\"  -42\", fmt::format(\"{0:>5}\", -42ll));\n  EXPECT_EQ(\"   42\", fmt::format(\"{0:>5}\", 42ull));\n  EXPECT_EQ(\"  -42\", fmt::format(\"{0:>5}\", -42.0));\n  EXPECT_EQ(\"  -42\", fmt::format(\"{0:>5}\", -42.0l));\n  EXPECT_EQ(\"    c\", fmt::format(\"{0:>5}\", 'c'));\n  EXPECT_EQ(\"  abc\", fmt::format(\"{0:>5}\", \"abc\"));\n  EXPECT_EQ(\"  0xface\", fmt::format(\"{0:>8}\", reinterpret_cast<void*>(0xface)));\n}\n\nTEST(format_test, center_align) {\n  EXPECT_EQ(\" 42  \", fmt::format(\"{0:^5}\", 42));\n  EXPECT_EQ(\" 42  \", fmt::format(\"{0:^5o}\", 042));\n  EXPECT_EQ(\" 42  \", fmt::format(\"{0:^5x}\", 0x42));\n  EXPECT_EQ(\" -42 \", fmt::format(\"{0:^5}\", -42));\n  EXPECT_EQ(\" 42  \", fmt::format(\"{0:^5}\", 42u));\n  EXPECT_EQ(\" -42 \", fmt::format(\"{0:^5}\", -42l));\n  EXPECT_EQ(\" 42  \", fmt::format(\"{0:^5}\", 42ul));\n  EXPECT_EQ(\" -42 \", fmt::format(\"{0:^5}\", -42ll));\n  EXPECT_EQ(\" 42  \", fmt::format(\"{0:^5}\", 42ull));\n  EXPECT_EQ(\" -42 \", fmt::format(\"{0:^5}\", -42.0));\n  EXPECT_EQ(\" -42 \", fmt::format(\"{0:^5}\", -42.0l));\n  EXPECT_EQ(\"  c  \", fmt::format(\"{0:^5}\", 'c'));\n  EXPECT_EQ(\" abc  \", fmt::format(\"{0:^6}\", \"abc\"));\n  EXPECT_EQ(\" 0xface \", fmt::format(\"{0:^8}\", reinterpret_cast<void*>(0xface)));\n}\n\nTEST(format_test, fill) {\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:{<5}\"), 'c'), format_error,\n                   \"invalid fill character '{'\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:{<5}}\"), 'c'), format_error,\n                   \"invalid fill character '{'\");\n  EXPECT_EQ(\"**42\", fmt::format(\"{0:*>4}\", 42));\n  EXPECT_EQ(\"**-42\", fmt::format(\"{0:*>5}\", -42));\n  EXPECT_EQ(\"***42\", fmt::format(\"{0:*>5}\", 42u));\n  EXPECT_EQ(\"**-42\", fmt::format(\"{0:*>5}\", -42l));\n  EXPECT_EQ(\"***42\", fmt::format(\"{0:*>5}\", 42ul));\n  EXPECT_EQ(\"**-42\", fmt::format(\"{0:*>5}\", -42ll));\n  EXPECT_EQ(\"***42\", fmt::format(\"{0:*>5}\", 42ull));\n  EXPECT_EQ(\"**-42\", fmt::format(\"{0:*>5}\", -42.0));\n  EXPECT_EQ(\"**-42\", fmt::format(\"{0:*>5}\", -42.0l));\n  EXPECT_EQ(\"c****\", fmt::format(\"{0:*<5}\", 'c'));\n  EXPECT_EQ(\"abc**\", fmt::format(\"{0:*<5}\", \"abc\"));\n  EXPECT_EQ(\"**0xface\",\n            fmt::format(\"{0:*>8}\", reinterpret_cast<void*>(0xface)));\n  EXPECT_EQ(\"foo=\", fmt::format(\"{:}=\", \"foo\"));\n  EXPECT_EQ(std::string(\"\\0\\0\\0*\", 4),\n            fmt::format(string_view(\"{:\\0>4}\", 6), '*'));\n  EXPECT_EQ(\"жж42\", fmt::format(\"{0:ж>4}\", 42));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:\\x80\\x80\\x80\\x80\\x80>}\"), 0),\n                   format_error, \"missing '}' in format string\");\n}\n\nTEST(format_test, plus_sign) {\n  EXPECT_EQ(\"+42\", fmt::format(\"{0:+}\", 42));\n  EXPECT_EQ(\"-42\", fmt::format(\"{0:+}\", -42));\n  EXPECT_EQ(\"+42\", fmt::format(\"{0:+}\", 42));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:+}\"), 42u), format_error,\n                   \"format specifier requires signed argument\");\n  EXPECT_EQ(\"+42\", fmt::format(\"{0:+}\", 42l));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:+}\"), 42ul), format_error,\n                   \"format specifier requires signed argument\");\n  EXPECT_EQ(\"+42\", fmt::format(\"{0:+}\", 42ll));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:+}\"), 42ull), format_error,\n                   \"format specifier requires signed argument\");\n  EXPECT_EQ(\"+42\", fmt::format(\"{0:+}\", 42.0));\n  EXPECT_EQ(\"+42\", fmt::format(\"{0:+}\", 42.0l));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:+\"), 'c'), format_error,\n                   \"missing '}' in format string\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:+}\"), 'c'), format_error,\n                   \"invalid format specifier for char\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:+}\"), \"abc\"), format_error,\n                   \"format specifier requires numeric argument\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:+}\"), reinterpret_cast<void*>(0x42)),\n                   format_error, \"format specifier requires numeric argument\");\n}\n\nTEST(format_test, minus_sign) {\n  EXPECT_EQ(\"42\", fmt::format(\"{0:-}\", 42));\n  EXPECT_EQ(\"-42\", fmt::format(\"{0:-}\", -42));\n  EXPECT_EQ(\"42\", fmt::format(\"{0:-}\", 42));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:-}\"), 42u), format_error,\n                   \"format specifier requires signed argument\");\n  EXPECT_EQ(\"42\", fmt::format(\"{0:-}\", 42l));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:-}\"), 42ul), format_error,\n                   \"format specifier requires signed argument\");\n  EXPECT_EQ(\"42\", fmt::format(\"{0:-}\", 42ll));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:-}\"), 42ull), format_error,\n                   \"format specifier requires signed argument\");\n  EXPECT_EQ(\"42\", fmt::format(\"{0:-}\", 42.0));\n  EXPECT_EQ(\"42\", fmt::format(\"{0:-}\", 42.0l));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:-\"), 'c'), format_error,\n                   \"missing '}' in format string\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:-}\"), 'c'), format_error,\n                   \"invalid format specifier for char\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:-}\"), \"abc\"), format_error,\n                   \"format specifier requires numeric argument\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:-}\"), reinterpret_cast<void*>(0x42)),\n                   format_error, \"format specifier requires numeric argument\");\n}\n\nTEST(format_test, space_sign) {\n  EXPECT_EQ(\" 42\", fmt::format(\"{0: }\", 42));\n  EXPECT_EQ(\"-42\", fmt::format(\"{0: }\", -42));\n  EXPECT_EQ(\" 42\", fmt::format(\"{0: }\", 42));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0: }\"), 42u), format_error,\n                   \"format specifier requires signed argument\");\n  EXPECT_EQ(\" 42\", fmt::format(\"{0: }\", 42l));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0: }\"), 42ul), format_error,\n                   \"format specifier requires signed argument\");\n  EXPECT_EQ(\" 42\", fmt::format(\"{0: }\", 42ll));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0: }\"), 42ull), format_error,\n                   \"format specifier requires signed argument\");\n  EXPECT_EQ(\" 42\", fmt::format(\"{0: }\", 42.0));\n  EXPECT_EQ(\" 42\", fmt::format(\"{0: }\", 42.0l));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0: \"), 'c'), format_error,\n                   \"missing '}' in format string\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0: }\"), 'c'), format_error,\n                   \"invalid format specifier for char\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0: }\"), \"abc\"), format_error,\n                   \"format specifier requires numeric argument\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0: }\"), reinterpret_cast<void*>(0x42)),\n                   format_error, \"format specifier requires numeric argument\");\n}\n\nTEST(format_test, hash_flag) {\n  EXPECT_EQ(\"42\", fmt::format(\"{0:#}\", 42));\n  EXPECT_EQ(\"-42\", fmt::format(\"{0:#}\", -42));\n  EXPECT_EQ(\"0b101010\", fmt::format(\"{0:#b}\", 42));\n  EXPECT_EQ(\"0B101010\", fmt::format(\"{0:#B}\", 42));\n  EXPECT_EQ(\"-0b101010\", fmt::format(\"{0:#b}\", -42));\n  EXPECT_EQ(\"0x42\", fmt::format(\"{0:#x}\", 0x42));\n  EXPECT_EQ(\"0X42\", fmt::format(\"{0:#X}\", 0x42));\n  EXPECT_EQ(\"-0x42\", fmt::format(\"{0:#x}\", -0x42));\n  EXPECT_EQ(\"0\", fmt::format(\"{0:#o}\", 0));\n  EXPECT_EQ(\"042\", fmt::format(\"{0:#o}\", 042));\n  EXPECT_EQ(\"-042\", fmt::format(\"{0:#o}\", -042));\n  EXPECT_EQ(\"42\", fmt::format(\"{0:#}\", 42u));\n  EXPECT_EQ(\"0x42\", fmt::format(\"{0:#x}\", 0x42u));\n  EXPECT_EQ(\"042\", fmt::format(\"{0:#o}\", 042u));\n\n  EXPECT_EQ(\"-42\", fmt::format(\"{0:#}\", -42l));\n  EXPECT_EQ(\"0x42\", fmt::format(\"{0:#x}\", 0x42l));\n  EXPECT_EQ(\"-0x42\", fmt::format(\"{0:#x}\", -0x42l));\n  EXPECT_EQ(\"042\", fmt::format(\"{0:#o}\", 042l));\n  EXPECT_EQ(\"-042\", fmt::format(\"{0:#o}\", -042l));\n  EXPECT_EQ(\"42\", fmt::format(\"{0:#}\", 42ul));\n  EXPECT_EQ(\"0x42\", fmt::format(\"{0:#x}\", 0x42ul));\n  EXPECT_EQ(\"042\", fmt::format(\"{0:#o}\", 042ul));\n\n  EXPECT_EQ(\"-42\", fmt::format(\"{0:#}\", -42ll));\n  EXPECT_EQ(\"0x42\", fmt::format(\"{0:#x}\", 0x42ll));\n  EXPECT_EQ(\"-0x42\", fmt::format(\"{0:#x}\", -0x42ll));\n  EXPECT_EQ(\"042\", fmt::format(\"{0:#o}\", 042ll));\n  EXPECT_EQ(\"-042\", fmt::format(\"{0:#o}\", -042ll));\n  EXPECT_EQ(\"42\", fmt::format(\"{0:#}\", 42ull));\n  EXPECT_EQ(\"0x42\", fmt::format(\"{0:#x}\", 0x42ull));\n  EXPECT_EQ(\"042\", fmt::format(\"{0:#o}\", 042ull));\n\n  EXPECT_EQ(\"-42.0\", fmt::format(\"{0:#}\", -42.0));\n  EXPECT_EQ(\"-42.0\", fmt::format(\"{0:#}\", -42.0l));\n  EXPECT_EQ(\"4.e+01\", fmt::format(\"{:#.0e}\", 42.0));\n  EXPECT_EQ(\"0.\", fmt::format(\"{:#.0f}\", 0.01));\n  EXPECT_EQ(\"0.50\", fmt::format(\"{:#.2g}\", 0.5));\n  EXPECT_EQ(\"0.\", fmt::format(\"{:#.0f}\", 0.5));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:#\"), 'c'), format_error,\n                   \"missing '}' in format string\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:#}\"), 'c'), format_error,\n                   \"invalid format specifier for char\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:#}\"), \"abc\"), format_error,\n                   \"format specifier requires numeric argument\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:#}\"), reinterpret_cast<void*>(0x42)),\n                   format_error, \"format specifier requires numeric argument\");\n}\n\nTEST(format_test, zero_flag) {\n  EXPECT_EQ(\"42\", fmt::format(\"{0:0}\", 42));\n  EXPECT_EQ(\"-0042\", fmt::format(\"{0:05}\", -42));\n  EXPECT_EQ(\"00042\", fmt::format(\"{0:05}\", 42u));\n  EXPECT_EQ(\"-0042\", fmt::format(\"{0:05}\", -42l));\n  EXPECT_EQ(\"00042\", fmt::format(\"{0:05}\", 42ul));\n  EXPECT_EQ(\"-0042\", fmt::format(\"{0:05}\", -42ll));\n  EXPECT_EQ(\"00042\", fmt::format(\"{0:05}\", 42ull));\n  EXPECT_EQ(\"-000042\", fmt::format(\"{0:07}\", -42.0));\n  EXPECT_EQ(\"-000042\", fmt::format(\"{0:07}\", -42.0l));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:0\"), 'c'), format_error,\n                   \"missing '}' in format string\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:05}\"), 'c'), format_error,\n                   \"invalid format specifier for char\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:05}\"), \"abc\"), format_error,\n                   \"format specifier requires numeric argument\");\n  EXPECT_THROW_MSG(\n      fmt::format(runtime(\"{0:05}\"), reinterpret_cast<void*>(0x42)),\n      format_error, \"format specifier requires numeric argument\");\n}\n\nTEST(format_test, width) {\n  char format_str[buffer_size];\n  safe_sprintf(format_str, \"{0:%u\", UINT_MAX);\n  increment(format_str + 3);\n  EXPECT_THROW_MSG(fmt::format(runtime(format_str), 0), format_error,\n                   \"number is too big\");\n  size_t size = std::strlen(format_str);\n  format_str[size] = '}';\n  format_str[size + 1] = 0;\n  EXPECT_THROW_MSG(fmt::format(runtime(format_str), 0), format_error,\n                   \"number is too big\");\n\n  safe_sprintf(format_str, \"{0:%u\", INT_MAX + 1u);\n  EXPECT_THROW_MSG(fmt::format(runtime(format_str), 0), format_error,\n                   \"number is too big\");\n  safe_sprintf(format_str, \"{0:%u}\", INT_MAX + 1u);\n  EXPECT_THROW_MSG(fmt::format(runtime(format_str), 0), format_error,\n                   \"number is too big\");\n  EXPECT_EQ(\" -42\", fmt::format(\"{0:4}\", -42));\n  EXPECT_EQ(\"   42\", fmt::format(\"{0:5}\", 42u));\n  EXPECT_EQ(\"   -42\", fmt::format(\"{0:6}\", -42l));\n  EXPECT_EQ(\"     42\", fmt::format(\"{0:7}\", 42ul));\n  EXPECT_EQ(\"   -42\", fmt::format(\"{0:6}\", -42ll));\n  EXPECT_EQ(\"     42\", fmt::format(\"{0:7}\", 42ull));\n  EXPECT_EQ(\"   -1.23\", fmt::format(\"{0:8}\", -1.23));\n  EXPECT_EQ(\"    -1.23\", fmt::format(\"{0:9}\", -1.23l));\n  EXPECT_EQ(\"    0xcafe\",\n            fmt::format(\"{0:10}\", reinterpret_cast<void*>(0xcafe)));\n  EXPECT_EQ(\"x          \", fmt::format(\"{0:11}\", 'x'));\n  EXPECT_EQ(\"str         \", fmt::format(\"{0:12}\", \"str\"));\n  EXPECT_EQ(fmt::format(\"{:*^6}\", \"🤡\"), \"**🤡**\");\n  EXPECT_EQ(fmt::format(\"{:*^8}\", \"你好\"), \"**你好**\");\n  EXPECT_EQ(fmt::format(\"{:#6}\", 42.0), \"  42.0\");\n  EXPECT_EQ(fmt::format(\"{:6c}\", static_cast<int>('x')), \"x     \");\n  EXPECT_EQ(fmt::format(\"{:>06.0f}\", 0.00884311), \"000000\");\n}\n\nTEST(format_test, runtime_width) {\n  char format_str[buffer_size];\n  safe_sprintf(format_str, \"{0:{%u\", UINT_MAX);\n  increment(format_str + 4);\n  EXPECT_THROW_MSG(fmt::format(runtime(format_str), 0), format_error,\n                   \"invalid format string\");\n  size_t size = std::strlen(format_str);\n  format_str[size] = '}';\n  format_str[size + 1] = 0;\n  EXPECT_THROW_MSG(fmt::format(runtime(format_str), 0), format_error,\n                   \"argument not found\");\n  format_str[size + 1] = '}';\n  format_str[size + 2] = 0;\n  EXPECT_THROW_MSG(fmt::format(runtime(format_str), 0), format_error,\n                   \"argument not found\");\n\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:{\"), 0), format_error,\n                   \"invalid format string\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:{}\"), 0), format_error,\n                   \"cannot switch from manual to automatic argument indexing\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:{?}}\"), 0), format_error,\n                   \"invalid format string\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:{1}}\"), 0), format_error,\n                   \"argument not found\");\n\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:{0:}}\"), 0), format_error,\n                   \"invalid format string\");\n\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:{1}}\"), 0, -1), format_error,\n                   \"negative width\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:{1}}\"), 0, (INT_MAX + 1u)),\n                   format_error, \"number is too big\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:{1}}\"), 0, -1l), format_error,\n                   \"negative width\");\n  if (fmt::detail::const_check(sizeof(long) > sizeof(int))) {\n    long value = INT_MAX;\n    EXPECT_THROW_MSG(fmt::format(runtime(\"{0:{1}}\"), 0, (value + 1)),\n                     format_error, \"number is too big\");\n  }\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:{1}}\"), 0, (INT_MAX + 1ul)),\n                   format_error, \"number is too big\");\n\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:{1}}\"), 0, '0'), format_error,\n                   \"width is not integer\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:{1}}\"), 0, 0.0), format_error,\n                   \"width is not integer\");\n\n  EXPECT_EQ(\" -42\", fmt::format(\"{0:{1}}\", -42, 4));\n  EXPECT_EQ(\"   42\", fmt::format(\"{0:{1}}\", 42u, 5));\n  EXPECT_EQ(\"   -42\", fmt::format(\"{0:{1}}\", -42l, 6));\n  EXPECT_EQ(\"     42\", fmt::format(\"{0:{1}}\", 42ul, 7));\n  EXPECT_EQ(\"   -42\", fmt::format(\"{0:{1}}\", -42ll, 6));\n  EXPECT_EQ(\"     42\", fmt::format(\"{0:{1}}\", 42ull, 7));\n  EXPECT_EQ(\"   -1.23\", fmt::format(\"{0:{1}}\", -1.23, 8));\n  EXPECT_EQ(\"    -1.23\", fmt::format(\"{0:{1}}\", -1.23l, 9));\n  EXPECT_EQ(\"    0xcafe\",\n            fmt::format(\"{0:{1}}\", reinterpret_cast<void*>(0xcafe), 10));\n  EXPECT_EQ(\"x          \", fmt::format(\"{0:{1}}\", 'x', 11));\n  EXPECT_EQ(\"str         \", fmt::format(\"{0:{1}}\", \"str\", 12));\n}\n\nTEST(format_test, precision) {\n  char format_str[buffer_size];\n  safe_sprintf(format_str, \"{0:.%u\", UINT_MAX);\n  increment(format_str + 4);\n  EXPECT_THROW_MSG(fmt::format(runtime(format_str), 0), format_error,\n                   \"number is too big\");\n  size_t size = std::strlen(format_str);\n  format_str[size] = '}';\n  format_str[size + 1] = 0;\n  EXPECT_THROW_MSG(fmt::format(runtime(format_str), 0), format_error,\n                   \"number is too big\");\n\n  safe_sprintf(format_str, \"{0:.%u\", INT_MAX + 1u);\n  EXPECT_THROW_MSG(fmt::format(runtime(format_str), 0), format_error,\n                   \"number is too big\");\n  safe_sprintf(format_str, \"{0:.%u}\", INT_MAX + 1u);\n  EXPECT_THROW_MSG(fmt::format(runtime(format_str), 0), format_error,\n                   \"number is too big\");\n\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.\"), 0), format_error,\n                   \"missing precision specifier\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.}\"), 0), format_error,\n                   \"missing precision specifier\");\n\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.2\"), 0), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.2}\"), 42), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.2f}\"), 42), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.2}\"), 42u), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.2f}\"), 42u), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.2}\"), 42l), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.2f}\"), 42l), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.2}\"), 42ul), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.2f}\"), 42ul), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.2}\"), 42ll), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.2f}\"), 42ll), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.2}\"), 42ull), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.2f}\"), 42ull), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:3.0}\"), 'x'), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_EQ(\"1.2\", fmt::format(\"{0:.2}\", 1.2345));\n  EXPECT_EQ(\"1.2\", fmt::format(\"{0:.2}\", 1.2345l));\n  EXPECT_EQ(\"1.2e+56\", fmt::format(\"{:.2}\", 1.234e56));\n  EXPECT_EQ(\"1.1\", fmt::format(\"{0:.3}\", 1.1));\n  EXPECT_EQ(\"1e+00\", fmt::format(\"{:.0e}\", 1.0L));\n  EXPECT_EQ(\"  0.0e+00\", fmt::format(\"{:9.1e}\", 0.0));\n  EXPECT_EQ(\n      fmt::format(\"{:.494}\", 4.9406564584124654E-324),\n      \"4.9406564584124654417656879286822137236505980261432476442558568250067550\"\n      \"727020875186529983636163599237979656469544571773092665671035593979639877\"\n      \"479601078187812630071319031140452784581716784898210368871863605699873072\"\n      \"305000638740915356498438731247339727316961514003171538539807412623856559\"\n      \"117102665855668676818703956031062493194527159149245532930545654440112748\"\n      \"012970999954193198940908041656332452475714786901472678015935523861155013\"\n      \"480352649347201937902681071074917033322268447533357208324319361e-324\");\n\n  std::string outputs[] = {\n      \"-0X1.41FE3FFE71C9E000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000P+127\",\n      \"-0XA.0FF1FFF38E4F0000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n      \"000000000000000000000000000000000000000000000000000P+124\"};\n  EXPECT_THAT(outputs,\n              testing::Contains(fmt::format(\"{:.838A}\", -2.14001164E+38)));\n\n  EXPECT_EQ(\"123.\", fmt::format(\"{:#.0f}\", 123.0));\n  EXPECT_EQ(\"1.23\", fmt::format(\"{:.02f}\", 1.234));\n  EXPECT_EQ(\"0.001\", fmt::format(\"{:.1g}\", 0.001));\n  EXPECT_EQ(\"1019666400\", fmt::format(\"{}\", 1019666432.0f));\n  EXPECT_EQ(\"1e+01\", fmt::format(\"{:.0e}\", 9.5));\n  EXPECT_EQ(\"1.0e-34\", fmt::format(\"{:.1e}\", 1e-34));\n\n  EXPECT_THROW_MSG(\n      fmt::format(runtime(\"{0:.2}\"), reinterpret_cast<void*>(0xcafe)),\n      format_error, \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(\n      fmt::format(runtime(\"{0:.2f}\"), reinterpret_cast<void*>(0xcafe)),\n      format_error, \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(\n      fmt::format(runtime(\"{:.{}e}\"), 42.0, fmt::detail::max_value<int>()),\n      format_error, \"number is too big\");\n\n  EXPECT_EQ(\"st\", fmt::format(\"{0:.2}\", \"str\"));\n}\n\nTEST(format_test, runtime_precision) {\n  char format_str[buffer_size];\n  safe_sprintf(format_str, \"{0:.{%u\", UINT_MAX);\n  increment(format_str + 5);\n  EXPECT_THROW_MSG(fmt::format(runtime(format_str), 0), format_error,\n                   \"invalid format string\");\n  size_t size = std::strlen(format_str);\n  format_str[size] = '}';\n  format_str[size + 1] = 0;\n  EXPECT_THROW_MSG(fmt::format(runtime(format_str), 0), format_error,\n                   \"argument not found\");\n  format_str[size + 1] = '}';\n  format_str[size + 2] = 0;\n  EXPECT_THROW_MSG(fmt::format(runtime(format_str), 0), format_error,\n                   \"argument not found\");\n\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{\"), 0), format_error,\n                   \"invalid format string\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{}\"), 0), format_error,\n                   \"cannot switch from manual to automatic argument indexing\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{?}}\"), 0), format_error,\n                   \"invalid format string\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}\"), 0, 0), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}}\"), 0), format_error,\n                   \"argument not found\");\n\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{0:}}\"), 0), format_error,\n                   \"invalid format string\");\n\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}}\"), 0, -1), format_error,\n                   \"negative precision\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}}\"), 0, (INT_MAX + 1u)),\n                   format_error, \"number is too big\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}}\"), 0, -1l), format_error,\n                   \"negative precision\");\n  if (fmt::detail::const_check(sizeof(long) > sizeof(int))) {\n    long value = INT_MAX;\n    EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}}\"), 0, (value + 1)),\n                     format_error, \"number is too big\");\n  }\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}}\"), 0, (INT_MAX + 1ul)),\n                   format_error, \"number is too big\");\n\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}}\"), 0, '0'), format_error,\n                   \"precision is not integer\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}}\"), 0, 0.0), format_error,\n                   \"precision is not integer\");\n\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}}\"), 42, 2), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}f}\"), 42, 2), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}}\"), 42u, 2), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}f}\"), 42u, 2), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}}\"), 42l, 2), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}f}\"), 42l, 2), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}}\"), 42ul, 2), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}f}\"), 42ul, 2), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}}\"), 42ll, 2), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}f}\"), 42ll, 2), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}}\"), 42ull, 2), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:.{1}f}\"), 42ull, 2), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:3.{1}}\"), 'x', 0), format_error,\n                   \"precision not allowed for this argument type\");\n  EXPECT_EQ(\"1.2\", fmt::format(\"{0:.{1}}\", 1.2345, 2));\n  EXPECT_EQ(\"1.2\", fmt::format(\"{1:.{0}}\", 2, 1.2345l));\n\n  EXPECT_THROW_MSG(\n      fmt::format(runtime(\"{0:.{1}}\"), reinterpret_cast<void*>(0xcafe), 2),\n      format_error, \"precision not allowed for this argument type\");\n  EXPECT_THROW_MSG(\n      fmt::format(runtime(\"{0:.{1}f}\"), reinterpret_cast<void*>(0xcafe), 2),\n      format_error, \"precision not allowed for this argument type\");\n\n  EXPECT_EQ(\"st\", fmt::format(\"{0:.{1}}\", \"str\", 2));\n}\n\nTEST(format_test, format_bool) {\n  EXPECT_EQ(\"true\", fmt::format(\"{}\", true));\n  EXPECT_EQ(\"false\", fmt::format(\"{}\", false));\n  EXPECT_EQ(\"1\", fmt::format(\"{:d}\", true));\n  EXPECT_EQ(\"true \", fmt::format(\"{:5}\", true));\n  EXPECT_EQ(\"true\", fmt::format(\"{:s}\", true));\n  EXPECT_EQ(\"false\", fmt::format(\"{:s}\", false));\n  EXPECT_EQ(\"false \", fmt::format(\"{:6s}\", false));\n}\n\nTEST(format_test, format_short) {\n  short s = 42;\n  EXPECT_EQ(\"42\", fmt::format(\"{0:d}\", s));\n  unsigned short us = 42;\n  EXPECT_EQ(\"42\", fmt::format(\"{0:d}\", us));\n}\n\ntemplate <typename T>\nvoid check_unknown_types(const T& value, const char* types, const char*) {\n  char format_str[buffer_size];\n  const char* special = \".0123456789L}\";\n  for (int i = CHAR_MIN; i <= CHAR_MAX; ++i) {\n    char c = static_cast<char>(i);\n    if (std::strchr(types, c) || std::strchr(special, c) || !c) continue;\n    safe_sprintf(format_str, \"{0:10%c}\", c);\n    const char* message = \"invalid type specifier\";\n    EXPECT_THROW_MSG(fmt::format(runtime(format_str), value), format_error,\n                     message)\n        << format_str << \" \" << message;\n  }\n}\n\nTEST(format_test, format_int) {\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:v\"), 42), format_error,\n                   \"missing '}' in format string\");\n  check_unknown_types(42, \"bBdoxXnLc\", \"integer\");\n  EXPECT_EQ(\"x\", fmt::format(\"{:c}\", static_cast<int>('x')));\n}\n\nTEST(format_test, format_bin) {\n  EXPECT_EQ(\"0\", fmt::format(\"{0:b}\", 0));\n  EXPECT_EQ(\"101010\", fmt::format(\"{0:b}\", 42));\n  EXPECT_EQ(\"101010\", fmt::format(\"{0:b}\", 42u));\n  EXPECT_EQ(\"-101010\", fmt::format(\"{0:b}\", -42));\n  EXPECT_EQ(\"11000000111001\", fmt::format(\"{0:b}\", 12345));\n  EXPECT_EQ(\"10010001101000101011001111000\", fmt::format(\"{0:b}\", 0x12345678));\n  EXPECT_EQ(\"10010000101010111100110111101111\",\n            fmt::format(\"{0:b}\", 0x90ABCDEF));\n  EXPECT_EQ(\"11111111111111111111111111111111\",\n            fmt::format(\"{0:b}\", max_value<uint32_t>()));\n}\n\n#if FMT_USE_INT128\nconstexpr auto int128_max = static_cast<__int128_t>(\n    (static_cast<__uint128_t>(1) << ((__SIZEOF_INT128__ * CHAR_BIT) - 1)) - 1);\nconstexpr auto int128_min = -int128_max - 1;\n\nconstexpr auto uint128_max = ~static_cast<__uint128_t>(0);\n#endif\n\nTEST(format_test, format_dec) {\n  EXPECT_EQ(\"0\", fmt::format(\"{0}\", 0));\n  EXPECT_EQ(\"42\", fmt::format(\"{0}\", 42));\n  EXPECT_EQ(\"42\", fmt::format(\"{0:d}\", 42));\n  EXPECT_EQ(\"42\", fmt::format(\"{0}\", 42u));\n  EXPECT_EQ(\"-42\", fmt::format(\"{0}\", -42));\n  EXPECT_EQ(\"12345\", fmt::format(\"{0}\", 12345));\n  EXPECT_EQ(\"67890\", fmt::format(\"{0}\", 67890));\n#if FMT_USE_INT128\n  EXPECT_EQ(\"0\", fmt::format(\"{0}\", static_cast<__int128_t>(0)));\n  EXPECT_EQ(\"0\", fmt::format(\"{0}\", static_cast<__uint128_t>(0)));\n  EXPECT_EQ(\"9223372036854775808\",\n            fmt::format(\"{0}\", static_cast<__int128_t>(INT64_MAX) + 1));\n  EXPECT_EQ(\"-9223372036854775809\",\n            fmt::format(\"{0}\", static_cast<__int128_t>(INT64_MIN) - 1));\n  EXPECT_EQ(\"18446744073709551616\",\n            fmt::format(\"{0}\", static_cast<__int128_t>(UINT64_MAX) + 1));\n  EXPECT_EQ(\"170141183460469231731687303715884105727\",\n            fmt::format(\"{0}\", int128_max));\n  EXPECT_EQ(\"-170141183460469231731687303715884105728\",\n            fmt::format(\"{0}\", int128_min));\n  EXPECT_EQ(\"340282366920938463463374607431768211455\",\n            fmt::format(\"{0}\", uint128_max));\n#endif\n\n  char buffer[buffer_size];\n  safe_sprintf(buffer, \"%d\", INT_MIN);\n  EXPECT_EQ(buffer, fmt::format(\"{0}\", INT_MIN));\n  safe_sprintf(buffer, \"%d\", INT_MAX);\n  EXPECT_EQ(buffer, fmt::format(\"{0}\", INT_MAX));\n  safe_sprintf(buffer, \"%u\", UINT_MAX);\n  EXPECT_EQ(buffer, fmt::format(\"{0}\", UINT_MAX));\n  safe_sprintf(buffer, \"%ld\", 0 - static_cast<unsigned long>(LONG_MIN));\n  EXPECT_EQ(buffer, fmt::format(\"{0}\", LONG_MIN));\n  safe_sprintf(buffer, \"%ld\", LONG_MAX);\n  EXPECT_EQ(buffer, fmt::format(\"{0}\", LONG_MAX));\n  safe_sprintf(buffer, \"%lu\", ULONG_MAX);\n  EXPECT_EQ(buffer, fmt::format(\"{0}\", ULONG_MAX));\n}\n\nTEST(format_test, format_hex) {\n  EXPECT_EQ(\"0\", fmt::format(\"{0:x}\", 0));\n  EXPECT_EQ(\"42\", fmt::format(\"{0:x}\", 0x42));\n  EXPECT_EQ(\"42\", fmt::format(\"{0:x}\", 0x42u));\n  EXPECT_EQ(\"-42\", fmt::format(\"{0:x}\", -0x42));\n  EXPECT_EQ(\"12345678\", fmt::format(\"{0:x}\", 0x12345678));\n  EXPECT_EQ(\"90abcdef\", fmt::format(\"{0:x}\", 0x90abcdef));\n  EXPECT_EQ(\"12345678\", fmt::format(\"{0:X}\", 0x12345678));\n  EXPECT_EQ(\"90ABCDEF\", fmt::format(\"{0:X}\", 0x90ABCDEF));\n#if FMT_USE_INT128\n  EXPECT_EQ(\"0\", fmt::format(\"{0:x}\", static_cast<__int128_t>(0)));\n  EXPECT_EQ(\"0\", fmt::format(\"{0:x}\", static_cast<__uint128_t>(0)));\n  EXPECT_EQ(\"8000000000000000\",\n            fmt::format(\"{0:x}\", static_cast<__int128_t>(INT64_MAX) + 1));\n  EXPECT_EQ(\"-8000000000000001\",\n            fmt::format(\"{0:x}\", static_cast<__int128_t>(INT64_MIN) - 1));\n  EXPECT_EQ(\"10000000000000000\",\n            fmt::format(\"{0:x}\", static_cast<__int128_t>(UINT64_MAX) + 1));\n  EXPECT_EQ(\"7fffffffffffffffffffffffffffffff\",\n            fmt::format(\"{0:x}\", int128_max));\n  EXPECT_EQ(\"-80000000000000000000000000000000\",\n            fmt::format(\"{0:x}\", int128_min));\n  EXPECT_EQ(\"ffffffffffffffffffffffffffffffff\",\n            fmt::format(\"{0:x}\", uint128_max));\n#endif\n\n  char buffer[buffer_size];\n  safe_sprintf(buffer, \"-%x\", 0 - static_cast<unsigned>(INT_MIN));\n  EXPECT_EQ(buffer, fmt::format(\"{0:x}\", INT_MIN));\n  safe_sprintf(buffer, \"%x\", INT_MAX);\n  EXPECT_EQ(buffer, fmt::format(\"{0:x}\", INT_MAX));\n  safe_sprintf(buffer, \"%x\", UINT_MAX);\n  EXPECT_EQ(buffer, fmt::format(\"{0:x}\", UINT_MAX));\n  safe_sprintf(buffer, \"-%lx\", 0 - static_cast<unsigned long>(LONG_MIN));\n  EXPECT_EQ(buffer, fmt::format(\"{0:x}\", LONG_MIN));\n  safe_sprintf(buffer, \"%lx\", LONG_MAX);\n  EXPECT_EQ(buffer, fmt::format(\"{0:x}\", LONG_MAX));\n  safe_sprintf(buffer, \"%lx\", ULONG_MAX);\n  EXPECT_EQ(buffer, fmt::format(\"{0:x}\", ULONG_MAX));\n}\n\nTEST(format_test, format_oct) {\n  EXPECT_EQ(\"0\", fmt::format(\"{0:o}\", 0));\n  EXPECT_EQ(\"42\", fmt::format(\"{0:o}\", 042));\n  EXPECT_EQ(\"42\", fmt::format(\"{0:o}\", 042u));\n  EXPECT_EQ(\"-42\", fmt::format(\"{0:o}\", -042));\n  EXPECT_EQ(\"12345670\", fmt::format(\"{0:o}\", 012345670));\n#if FMT_USE_INT128\n  EXPECT_EQ(\"0\", fmt::format(\"{0:o}\", static_cast<__int128_t>(0)));\n  EXPECT_EQ(\"0\", fmt::format(\"{0:o}\", static_cast<__uint128_t>(0)));\n  EXPECT_EQ(\"1000000000000000000000\",\n            fmt::format(\"{0:o}\", static_cast<__int128_t>(INT64_MAX) + 1));\n  EXPECT_EQ(\"-1000000000000000000001\",\n            fmt::format(\"{0:o}\", static_cast<__int128_t>(INT64_MIN) - 1));\n  EXPECT_EQ(\"2000000000000000000000\",\n            fmt::format(\"{0:o}\", static_cast<__int128_t>(UINT64_MAX) + 1));\n  EXPECT_EQ(\"1777777777777777777777777777777777777777777\",\n            fmt::format(\"{0:o}\", int128_max));\n  EXPECT_EQ(\"-2000000000000000000000000000000000000000000\",\n            fmt::format(\"{0:o}\", int128_min));\n  EXPECT_EQ(\"3777777777777777777777777777777777777777777\",\n            fmt::format(\"{0:o}\", uint128_max));\n#endif\n\n  char buffer[buffer_size];\n  safe_sprintf(buffer, \"-%o\", 0 - static_cast<unsigned>(INT_MIN));\n  EXPECT_EQ(buffer, fmt::format(\"{0:o}\", INT_MIN));\n  safe_sprintf(buffer, \"%o\", INT_MAX);\n  EXPECT_EQ(buffer, fmt::format(\"{0:o}\", INT_MAX));\n  safe_sprintf(buffer, \"%o\", UINT_MAX);\n  EXPECT_EQ(buffer, fmt::format(\"{0:o}\", UINT_MAX));\n  safe_sprintf(buffer, \"-%lo\", 0 - static_cast<unsigned long>(LONG_MIN));\n  EXPECT_EQ(buffer, fmt::format(\"{0:o}\", LONG_MIN));\n  safe_sprintf(buffer, \"%lo\", LONG_MAX);\n  EXPECT_EQ(buffer, fmt::format(\"{0:o}\", LONG_MAX));\n  safe_sprintf(buffer, \"%lo\", ULONG_MAX);\n  EXPECT_EQ(buffer, fmt::format(\"{0:o}\", ULONG_MAX));\n}\n\nTEST(format_test, format_int_locale) {\n  EXPECT_EQ(\"1234\", fmt::format(\"{:L}\", 1234));\n}\n\nTEST(format_test, format_float) {\n  EXPECT_EQ(\"0\", fmt::format(\"{}\", 0.0f));\n  EXPECT_EQ(\"392.500000\", fmt::format(\"{0:f}\", 392.5f));\n}\n\nTEST(format_test, format_double) {\n  EXPECT_EQ(\"0\", fmt::format(\"{}\", 0.0));\n  check_unknown_types(1.2, \"eEfFgGaAnL%\", \"double\");\n  EXPECT_EQ(\"0\", fmt::format(\"{:}\", 0.0));\n  EXPECT_EQ(\"0.000000\", fmt::format(\"{:f}\", 0.0));\n  EXPECT_EQ(\"0\", fmt::format(\"{:g}\", 0.0));\n  EXPECT_EQ(\"392.65\", fmt::format(\"{:}\", 392.65));\n  EXPECT_EQ(\"392.65\", fmt::format(\"{:g}\", 392.65));\n  EXPECT_EQ(\"392.65\", fmt::format(\"{:G}\", 392.65));\n  EXPECT_EQ(\"4.9014e+06\", fmt::format(\"{:g}\", 4.9014e6));\n  EXPECT_EQ(\"392.650000\", fmt::format(\"{:f}\", 392.65));\n  EXPECT_EQ(\"392.650000\", fmt::format(\"{:F}\", 392.65));\n  EXPECT_EQ(\"42\", fmt::format(\"{:L}\", 42.0));\n  EXPECT_EQ(\"    0x1.0cccccccccccdp+2\", fmt::format(\"{:24a}\", 4.2));\n  EXPECT_EQ(\"0x1.0cccccccccccdp+2    \", fmt::format(\"{:<24a}\", 4.2));\n  char buffer[buffer_size];\n  safe_sprintf(buffer, \"%e\", 392.65);\n  EXPECT_EQ(buffer, fmt::format(\"{0:e}\", 392.65));\n  safe_sprintf(buffer, \"%E\", 392.65);\n  EXPECT_EQ(buffer, fmt::format(\"{0:E}\", 392.65));\n  EXPECT_EQ(\"+0000392.6\", fmt::format(\"{0:+010.4g}\", 392.65));\n  safe_sprintf(buffer, \"%a\", -42.0);\n  EXPECT_EQ(buffer, fmt::format(\"{:a}\", -42.0));\n  safe_sprintf(buffer, \"%A\", -42.0);\n  EXPECT_EQ(buffer, fmt::format(\"{:A}\", -42.0));\n  EXPECT_EQ(\"9223372036854775808.000000\",\n            fmt::format(\"{:f}\", 9223372036854775807.0));\n}\n\nTEST(format_test, precision_rounding) {\n  EXPECT_EQ(\"0\", fmt::format(\"{:.0f}\", 0.0));\n  EXPECT_EQ(\"0\", fmt::format(\"{:.0f}\", 0.01));\n  EXPECT_EQ(\"0\", fmt::format(\"{:.0f}\", 0.1));\n  EXPECT_EQ(\"0.000\", fmt::format(\"{:.3f}\", 0.00049));\n  EXPECT_EQ(\"0.001\", fmt::format(\"{:.3f}\", 0.0005));\n  EXPECT_EQ(\"0.001\", fmt::format(\"{:.3f}\", 0.00149));\n  EXPECT_EQ(\"0.002\", fmt::format(\"{:.3f}\", 0.0015));\n  EXPECT_EQ(\"1.000\", fmt::format(\"{:.3f}\", 0.9999));\n  EXPECT_EQ(\"0.00123\", fmt::format(\"{:.3}\", 0.00123));\n  EXPECT_EQ(\"0.1\", fmt::format(\"{:.16g}\", 0.1));\n  EXPECT_EQ(\"1\", fmt::format(\"{:.0}\", 1.0));\n  EXPECT_EQ(\"225.51575035152063720\",\n            fmt::format(\"{:.17f}\", 225.51575035152064));\n  EXPECT_EQ(\"-761519619559038.2\", fmt::format(\"{:.1f}\", -761519619559038.2));\n  EXPECT_EQ(\"1.9156918820264798e-56\",\n            fmt::format(\"{}\", 1.9156918820264798e-56));\n  EXPECT_EQ(\"0.0000\", fmt::format(\"{:.4f}\", 7.2809479766055470e-15));\n\n  // Trigger a rounding error in Grisu by a specially chosen number.\n  EXPECT_EQ(\"3788512123356.985352\", fmt::format(\"{:f}\", 3788512123356.985352));\n}\n\nTEST(format_test, prettify_float) {\n  EXPECT_EQ(\"0.0001\", fmt::format(\"{}\", 1e-4));\n  EXPECT_EQ(\"1e-05\", fmt::format(\"{}\", 1e-5));\n  EXPECT_EQ(\"1000000000000000\", fmt::format(\"{}\", 1e15));\n  EXPECT_EQ(\"1e+16\", fmt::format(\"{}\", 1e16));\n  EXPECT_EQ(\"9.999e-05\", fmt::format(\"{}\", 9.999e-5));\n  EXPECT_EQ(\"10000000000\", fmt::format(\"{}\", 1e10));\n  EXPECT_EQ(\"100000000000\", fmt::format(\"{}\", 1e11));\n  EXPECT_EQ(\"12340000000\", fmt::format(\"{}\", 1234e7));\n  EXPECT_EQ(\"12.34\", fmt::format(\"{}\", 1234e-2));\n  EXPECT_EQ(\"0.001234\", fmt::format(\"{}\", 1234e-6));\n  EXPECT_EQ(\"0.1\", fmt::format(\"{}\", 0.1f));\n  EXPECT_EQ(\"0.10000000149011612\", fmt::format(\"{}\", double(0.1f)));\n  EXPECT_EQ(\"1.3563156e-19\", fmt::format(\"{}\", 1.35631564e-19f));\n}\n\nTEST(format_test, format_nan) {\n  double nan = std::numeric_limits<double>::quiet_NaN();\n  EXPECT_EQ(\"nan\", fmt::format(\"{}\", nan));\n  EXPECT_EQ(\"+nan\", fmt::format(\"{:+}\", nan));\n  EXPECT_EQ(\"  +nan\", fmt::format(\"{:+06}\", nan));\n  EXPECT_EQ(\"+nan  \", fmt::format(\"{:<+06}\", nan));\n  EXPECT_EQ(\" +nan \", fmt::format(\"{:^+06}\", nan));\n  EXPECT_EQ(\"  +nan\", fmt::format(\"{:>+06}\", nan));\n  if (std::signbit(-nan)) {\n    EXPECT_EQ(\"-nan\", fmt::format(\"{}\", -nan));\n    EXPECT_EQ(\"  -nan\", fmt::format(\"{:+06}\", -nan));\n  } else {\n    fmt::print(\"Warning: compiler doesn't handle negative NaN correctly\");\n  }\n  EXPECT_EQ(\" nan\", fmt::format(\"{: }\", nan));\n  EXPECT_EQ(\"NAN\", fmt::format(\"{:F}\", nan));\n  EXPECT_EQ(\"nan    \", fmt::format(\"{:<7}\", nan));\n  EXPECT_EQ(\"  nan  \", fmt::format(\"{:^7}\", nan));\n  EXPECT_EQ(\"    nan\", fmt::format(\"{:>7}\", nan));\n}\n\nTEST(format_test, format_infinity) {\n  double inf = std::numeric_limits<double>::infinity();\n  EXPECT_EQ(\"inf\", fmt::format(\"{}\", inf));\n  EXPECT_EQ(\"+inf\", fmt::format(\"{:+}\", inf));\n  EXPECT_EQ(\"-inf\", fmt::format(\"{}\", -inf));\n  EXPECT_EQ(\"  +inf\", fmt::format(\"{:+06}\", inf));\n  EXPECT_EQ(\"  -inf\", fmt::format(\"{:+06}\", -inf));\n  EXPECT_EQ(\"+inf  \", fmt::format(\"{:<+06}\", inf));\n  EXPECT_EQ(\" +inf \", fmt::format(\"{:^+06}\", inf));\n  EXPECT_EQ(\"  +inf\", fmt::format(\"{:>+06}\", inf));\n  EXPECT_EQ(\" inf\", fmt::format(\"{: }\", inf));\n  EXPECT_EQ(\"INF\", fmt::format(\"{:F}\", inf));\n  EXPECT_EQ(\"inf    \", fmt::format(\"{:<7}\", inf));\n  EXPECT_EQ(\"  inf  \", fmt::format(\"{:^7}\", inf));\n  EXPECT_EQ(\"    inf\", fmt::format(\"{:>7}\", inf));\n}\n\nTEST(format_test, format_long_double) {\n  EXPECT_EQ(\"0\", fmt::format(\"{0:}\", 0.0l));\n  EXPECT_EQ(\"0.000000\", fmt::format(\"{0:f}\", 0.0l));\n  EXPECT_EQ(\"392.65\", fmt::format(\"{0:}\", 392.65l));\n  EXPECT_EQ(\"392.65\", fmt::format(\"{0:g}\", 392.65l));\n  EXPECT_EQ(\"392.65\", fmt::format(\"{0:G}\", 392.65l));\n  EXPECT_EQ(\"392.650000\", fmt::format(\"{0:f}\", 392.65l));\n  EXPECT_EQ(\"392.650000\", fmt::format(\"{0:F}\", 392.65l));\n  char buffer[buffer_size];\n  safe_sprintf(buffer, \"%Le\", 392.65l);\n  EXPECT_EQ(buffer, fmt::format(\"{0:e}\", 392.65l));\n  EXPECT_EQ(\"+0000392.6\", fmt::format(\"{0:+010.4g}\", 392.64l));\n  safe_sprintf(buffer, \"%La\", 3.31l);\n  EXPECT_EQ(buffer, fmt::format(\"{:a}\", 3.31l));\n}\n\nTEST(format_test, format_char) {\n  const char types[] = \"cbBdoxX\";\n  check_unknown_types('a', types, \"char\");\n  EXPECT_EQ(\"a\", fmt::format(\"{0}\", 'a'));\n  EXPECT_EQ(\"z\", fmt::format(\"{0:c}\", 'z'));\n  int n = 'x';\n  for (const char* type = types + 1; *type; ++type) {\n    std::string format_str = fmt::format(\"{{:{}}}\", *type);\n    EXPECT_EQ(fmt::format(runtime(format_str), n),\n              fmt::format(runtime(format_str), 'x'))\n        << format_str;\n  }\n  EXPECT_EQ(fmt::format(\"{:02X}\", n), fmt::format(\"{:02X}\", 'x'));\n}\n\nTEST(format_test, format_volatile_char) {\n  volatile char c = 'x';\n  EXPECT_EQ(\"x\", fmt::format(\"{}\", c));\n}\n\nTEST(format_test, format_unsigned_char) {\n  EXPECT_EQ(\"42\", fmt::format(\"{}\", static_cast<unsigned char>(42)));\n  EXPECT_EQ(\"42\", fmt::format(\"{}\", static_cast<uint8_t>(42)));\n}\n\nTEST(format_test, format_cstring) {\n  check_unknown_types(\"test\", \"sp\", \"string\");\n  EXPECT_EQ(\"test\", fmt::format(\"{0}\", \"test\"));\n  EXPECT_EQ(\"test\", fmt::format(\"{0:s}\", \"test\"));\n  char nonconst[] = \"nonconst\";\n  EXPECT_EQ(\"nonconst\", fmt::format(\"{0}\", nonconst));\n  EXPECT_THROW_MSG(\n      fmt::format(runtime(\"{0}\"), static_cast<const char*>(nullptr)),\n      format_error, \"string pointer is null\");\n}\n\nTEST(format_test, format_schar_string) {\n  signed char str[] = \"test\";\n  EXPECT_EQ(\"test\", fmt::format(\"{0:s}\", str));\n  const signed char* const_str = str;\n  EXPECT_EQ(\"test\", fmt::format(\"{0:s}\", const_str));\n}\n\nTEST(format_test, format_uchar_string) {\n  unsigned char str[] = \"test\";\n  EXPECT_EQ(\"test\", fmt::format(\"{0:s}\", str));\n  const unsigned char* const_str = str;\n  EXPECT_EQ(\"test\", fmt::format(\"{0:s}\", const_str));\n  unsigned char* ptr = str;\n  EXPECT_EQ(\"test\", fmt::format(\"{0:s}\", ptr));\n}\n\nvoid function_pointer_test(int, double, std::string) {}\n\nTEST(format_test, format_pointer) {\n  check_unknown_types(reinterpret_cast<void*>(0x1234), \"p\", \"pointer\");\n  EXPECT_EQ(\"0x0\", fmt::format(\"{0}\", static_cast<void*>(nullptr)));\n  EXPECT_EQ(\"0x1234\", fmt::format(\"{0}\", reinterpret_cast<void*>(0x1234)));\n  EXPECT_EQ(\"0x1234\", fmt::format(\"{0:p}\", reinterpret_cast<void*>(0x1234)));\n  EXPECT_EQ(\"0x\" + std::string(sizeof(void*) * CHAR_BIT / 4, 'f'),\n            fmt::format(\"{0}\", reinterpret_cast<void*>(~uintptr_t())));\n  EXPECT_EQ(\"0x1234\",\n            fmt::format(\"{}\", fmt::ptr(reinterpret_cast<int*>(0x1234))));\n  std::unique_ptr<int> up(new int(1));\n  EXPECT_EQ(fmt::format(\"{}\", fmt::ptr(up.get())),\n            fmt::format(\"{}\", fmt::ptr(up)));\n  std::shared_ptr<int> sp(new int(1));\n  EXPECT_EQ(fmt::format(\"{}\", fmt::ptr(sp.get())),\n            fmt::format(\"{}\", fmt::ptr(sp)));\n  EXPECT_EQ(fmt::format(\"{}\", fmt::detail::bit_cast<const void*>(\n                                  &function_pointer_test)),\n            fmt::format(\"{}\", fmt::ptr(function_pointer_test)));\n  EXPECT_EQ(\"0x0\", fmt::format(\"{}\", nullptr));\n}\n\nTEST(format_test, format_string) {\n  EXPECT_EQ(\"test\", fmt::format(\"{0}\", std::string(\"test\")));\n  EXPECT_THROW(fmt::format(fmt::runtime(\"{:x}\"), std::string(\"test\")),\n               fmt::format_error);\n}\n\nTEST(format_test, format_string_view) {\n  EXPECT_EQ(\"test\", fmt::format(\"{}\", string_view(\"test\")));\n  EXPECT_EQ(\"\", fmt::format(\"{}\", string_view()));\n}\n\n#ifdef FMT_USE_STRING_VIEW\nstruct string_viewable {};\n\nFMT_BEGIN_NAMESPACE\ntemplate <> struct formatter<string_viewable> : formatter<std::string_view> {\n  auto format(string_viewable, format_context& ctx) -> decltype(ctx.out()) {\n    return formatter<std::string_view>::format(\"foo\", ctx);\n  }\n};\nFMT_END_NAMESPACE\n\nTEST(format_test, format_std_string_view) {\n  EXPECT_EQ(\"test\", fmt::format(\"{}\", std::string_view(\"test\")));\n  EXPECT_EQ(\"foo\", fmt::format(\"{}\", string_viewable()));\n}\n\nstruct explicitly_convertible_to_std_string_view {\n  explicit operator std::string_view() const { return \"foo\"; }\n};\n\ntemplate <>\nstruct fmt::formatter<explicitly_convertible_to_std_string_view>\n    : formatter<std::string_view> {\n  auto format(explicitly_convertible_to_std_string_view v, format_context& ctx)\n      -> decltype(ctx.out()) {\n    return format_to(ctx.out(), \"'{}'\", std::string_view(v));\n  }\n};\n\nTEST(format_test, format_explicitly_convertible_to_std_string_view) {\n  EXPECT_EQ(\"'foo'\",\n            fmt::format(\"{}\", explicitly_convertible_to_std_string_view()));\n}\n#endif\n\nstruct converible_to_anything {\n  template <typename T> operator T() const { return T(); }\n};\n\nFMT_BEGIN_NAMESPACE\ntemplate <> struct formatter<converible_to_anything> {\n  FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {\n    return ctx.begin();\n  }\n\n  auto format(converible_to_anything, format_context& ctx)\n      -> decltype(ctx.out()) {\n    return format_to(ctx.out(), \"foo\");\n  }\n};\nFMT_END_NAMESPACE\n\nTEST(format_test, format_convertible_to_anything) {\n  EXPECT_EQ(\"foo\", fmt::format(\"{}\", converible_to_anything()));\n}\n\nclass Answer {};\n\nFMT_BEGIN_NAMESPACE\ntemplate <> struct formatter<date> {\n  template <typename ParseContext>\n  FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {\n    auto it = ctx.begin();\n    if (it != ctx.end() && *it == 'd') ++it;\n    return it;\n  }\n\n  auto format(const date& d, format_context& ctx) -> decltype(ctx.out()) {\n    format_to(ctx.out(), \"{}-{}-{}\", d.year(), d.month(), d.day());\n    return ctx.out();\n  }\n};\n\ntemplate <> struct formatter<Answer> : formatter<int> {\n  template <typename FormatContext>\n  auto format(Answer, FormatContext& ctx) -> decltype(ctx.out()) {\n    return formatter<int>::format(42, ctx);\n  }\n};\nFMT_END_NAMESPACE\n\nTEST(format_test, format_custom) {\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:s}\"), date(2012, 12, 9)),\n                   format_error, \"unknown format specifier\");\n  EXPECT_EQ(\"42\", fmt::format(\"{0}\", Answer()));\n  EXPECT_EQ(\"0042\", fmt::format(\"{:04}\", Answer()));\n}\n\nTEST(format_test, format_to_custom) {\n  char buf[10] = {};\n  auto end =\n      &*fmt::format_to(fmt::detail::make_checked(buf, 10), \"{}\", Answer());\n  EXPECT_EQ(end, buf + 2);\n  EXPECT_STREQ(buf, \"42\");\n}\n\nTEST(format_test, format_string_from_speed_test) {\n  EXPECT_EQ(\"1.2340000000:0042:+3.13:str:0x3e8:X:%\",\n            fmt::format(\"{0:0.10f}:{1:04}:{2:+g}:{3}:{4}:{5}:%\", 1.234, 42,\n                        3.13, \"str\", reinterpret_cast<void*>(1000), 'X'));\n}\n\nTEST(format_test, format_examples) {\n  std::string message = fmt::format(\"The answer is {}\", 42);\n  EXPECT_EQ(\"The answer is 42\", message);\n\n  EXPECT_EQ(\"42\", fmt::format(\"{}\", 42));\n\n  memory_buffer out;\n  format_to(std::back_inserter(out), \"The answer is {}.\", 42);\n  EXPECT_EQ(\"The answer is 42.\", to_string(out));\n\n  const char* filename = \"nonexistent\";\n  FILE* ftest = safe_fopen(filename, \"r\");\n  if (ftest) fclose(ftest);\n  int error_code = errno;\n  EXPECT_TRUE(ftest == nullptr);\n  EXPECT_SYSTEM_ERROR(\n      {\n        FILE* f = safe_fopen(filename, \"r\");\n        if (!f)\n          throw fmt::system_error(errno, \"Cannot open file '{}'\", filename);\n        fclose(f);\n      },\n      error_code, \"Cannot open file 'nonexistent'\");\n\n  EXPECT_EQ(\"First, thou shalt count to three\",\n            fmt::format(\"First, thou shalt count to {0}\", \"three\"));\n  EXPECT_EQ(\"Bring me a shrubbery\", fmt::format(\"Bring me a {}\", \"shrubbery\"));\n  EXPECT_EQ(\"From 1 to 3\", fmt::format(\"From {} to {}\", 1, 3));\n\n  char buffer[buffer_size];\n  safe_sprintf(buffer, \"%03.2f\", -1.2);\n  EXPECT_EQ(buffer, fmt::format(\"{:03.2f}\", -1.2));\n\n  EXPECT_EQ(\"a, b, c\", fmt::format(\"{0}, {1}, {2}\", 'a', 'b', 'c'));\n  EXPECT_EQ(\"a, b, c\", fmt::format(\"{}, {}, {}\", 'a', 'b', 'c'));\n  EXPECT_EQ(\"c, b, a\", fmt::format(\"{2}, {1}, {0}\", 'a', 'b', 'c'));\n  EXPECT_EQ(\"abracadabra\", fmt::format(\"{0}{1}{0}\", \"abra\", \"cad\"));\n\n  EXPECT_EQ(\"left aligned                  \",\n            fmt::format(\"{:<30}\", \"left aligned\"));\n  EXPECT_EQ(\"                 right aligned\",\n            fmt::format(\"{:>30}\", \"right aligned\"));\n  EXPECT_EQ(\"           centered           \",\n            fmt::format(\"{:^30}\", \"centered\"));\n  EXPECT_EQ(\"***********centered***********\",\n            fmt::format(\"{:*^30}\", \"centered\"));\n\n  EXPECT_EQ(\"+3.140000; -3.140000\", fmt::format(\"{:+f}; {:+f}\", 3.14, -3.14));\n  EXPECT_EQ(\" 3.140000; -3.140000\", fmt::format(\"{: f}; {: f}\", 3.14, -3.14));\n  EXPECT_EQ(\"3.140000; -3.140000\", fmt::format(\"{:-f}; {:-f}\", 3.14, -3.14));\n\n  EXPECT_EQ(\"int: 42;  hex: 2a;  oct: 52\",\n            fmt::format(\"int: {0:d};  hex: {0:x};  oct: {0:o}\", 42));\n  EXPECT_EQ(\"int: 42;  hex: 0x2a;  oct: 052\",\n            fmt::format(\"int: {0:d};  hex: {0:#x};  oct: {0:#o}\", 42));\n\n  EXPECT_EQ(\"The answer is 42\", fmt::format(\"The answer is {}\", 42));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"The answer is {:d}\"), \"forty-two\"),\n                   format_error, \"invalid type specifier\");\n\n  EXPECT_WRITE(\n      stdout, fmt::print(\"{}\", std::numeric_limits<double>::infinity()), \"inf\");\n}\n\nTEST(format_test, print) {\n  EXPECT_WRITE(stdout, fmt::print(\"Don't {}!\", \"panic\"), \"Don't panic!\");\n  EXPECT_WRITE(stderr, fmt::print(stderr, \"Don't {}!\", \"panic\"),\n               \"Don't panic!\");\n}\n\nTEST(format_test, variadic) {\n  EXPECT_EQ(\"abc1\", fmt::format(\"{}c{}\", \"ab\", 1));\n}\n\nTEST(format_test, dynamic) {\n  using ctx = fmt::format_context;\n  auto args = std::vector<fmt::basic_format_arg<ctx>>();\n  args.emplace_back(fmt::detail::make_arg<ctx>(42));\n  args.emplace_back(fmt::detail::make_arg<ctx>(\"abc1\"));\n  args.emplace_back(fmt::detail::make_arg<ctx>(1.5f));\n\n  std::string result = fmt::vformat(\n      \"{} and {} and {}\",\n      fmt::format_args(args.data(), static_cast<int>(args.size())));\n\n  EXPECT_EQ(\"42 and abc1 and 1.5\", result);\n}\n\nTEST(format_test, bytes) {\n  auto s = fmt::format(\"{:10}\", fmt::bytes(\"ёжик\"));\n  EXPECT_EQ(\"ёжик  \", s);\n  EXPECT_EQ(10, s.size());\n}\n\nenum test_enum { foo, bar };\n\nTEST(format_test, join) {\n  using fmt::join;\n  int v1[3] = {1, 2, 3};\n  auto v2 = std::vector<float>();\n  v2.push_back(1.2f);\n  v2.push_back(3.4f);\n  void* v3[2] = {&v1[0], &v1[1]};\n\n  EXPECT_EQ(\"(1, 2, 3)\", fmt::format(\"({})\", join(v1, v1 + 3, \", \")));\n  EXPECT_EQ(\"(1)\", fmt::format(\"({})\", join(v1, v1 + 1, \", \")));\n  EXPECT_EQ(\"()\", fmt::format(\"({})\", join(v1, v1, \", \")));\n  EXPECT_EQ(\"(001, 002, 003)\", fmt::format(\"({:03})\", join(v1, v1 + 3, \", \")));\n  EXPECT_EQ(\"(+01.20, +03.40)\",\n            fmt::format(\"({:+06.2f})\", join(v2.begin(), v2.end(), \", \")));\n\n  EXPECT_EQ(\"1, 2, 3\", fmt::format(\"{0:{1}}\", join(v1, v1 + 3, \", \"), 1));\n\n  EXPECT_EQ(fmt::format(\"{}, {}\", v3[0], v3[1]),\n            fmt::format(\"{}\", join(v3, v3 + 2, \", \")));\n\n  EXPECT_EQ(\"(1, 2, 3)\", fmt::format(\"({})\", join(v1, \", \")));\n  EXPECT_EQ(\"(+01.20, +03.40)\", fmt::format(\"({:+06.2f})\", join(v2, \", \")));\n\n  auto v4 = std::vector<test_enum>{foo, bar, foo};\n  EXPECT_EQ(\"0 1 0\", fmt::format(\"{}\", join(v4, \" \")));\n}\n\n#ifdef __cpp_lib_byte\nTEST(format_test, join_bytes) {\n  auto v = std::vector<std::byte>{std::byte(1), std::byte(2), std::byte(3)};\n  EXPECT_EQ(\"1, 2, 3\", fmt::format(\"{}\", fmt::join(v, \", \")));\n}\n#endif\n\nstd::string vformat_message(int id, const char* format, fmt::format_args args) {\n  auto buffer = fmt::memory_buffer();\n  format_to(fmt::appender(buffer), \"[{}] \", id);\n  vformat_to(fmt::appender(buffer), format, args);\n  return to_string(buffer);\n}\n\ntemplate <typename... Args>\nstd::string format_message(int id, const char* format, const Args&... args) {\n  auto va = fmt::make_format_args(args...);\n  return vformat_message(id, format, va);\n}\n\nTEST(format_test, format_message_example) {\n  EXPECT_EQ(\"[42] something happened\",\n            format_message(42, \"{} happened\", \"something\"));\n}\n\ntemplate <typename... Args>\nvoid print_error(const char* file, int line, const char* format,\n                 const Args&... args) {\n  fmt::print(\"{}: {}: \", file, line);\n  fmt::print(format, args...);\n}\n\nTEST(format_test, unpacked_args) {\n  EXPECT_EQ(\"0123456789abcdefg\",\n            fmt::format(\"{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}\", 0, 1, 2, 3, 4, 5,\n                        6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f', 'g'));\n}\n\nstruct string_like {};\nfmt::string_view to_string_view(string_like) { return \"foo\"; }\n\nconstexpr char with_null[3] = {'{', '}', '\\0'};\nconstexpr char no_null[2] = {'{', '}'};\nstatic FMT_CONSTEXPR_DECL const char static_with_null[3] = {'{', '}', '\\0'};\nstatic FMT_CONSTEXPR_DECL const char static_no_null[2] = {'{', '}'};\n\nTEST(format_test, compile_time_string) {\n  EXPECT_EQ(\"foo\", fmt::format(FMT_STRING(\"foo\")));\n  EXPECT_EQ(\"42\", fmt::format(FMT_STRING(\"{}\"), 42));\n  EXPECT_EQ(\"foo\", fmt::format(FMT_STRING(\"{}\"), string_like()));\n\n#if FMT_USE_NONTYPE_TEMPLATE_PARAMETERS\n  using namespace fmt::literals;\n  EXPECT_EQ(\"foobar\", fmt::format(FMT_STRING(\"{foo}{bar}\"), \"bar\"_a = \"bar\",\n                                  \"foo\"_a = \"foo\"));\n  EXPECT_EQ(\"\", fmt::format(FMT_STRING(\"\")));\n  EXPECT_EQ(\"\", fmt::format(FMT_STRING(\"\"), \"arg\"_a = 42));\n#endif\n\n  (void)static_with_null;\n  (void)static_no_null;\n#ifndef _MSC_VER\n  EXPECT_EQ(\"42\", fmt::format(FMT_STRING(static_with_null), 42));\n  EXPECT_EQ(\"42\", fmt::format(FMT_STRING(static_no_null), 42));\n#endif\n\n  (void)with_null;\n  (void)no_null;\n#if __cplusplus >= 201703L\n  EXPECT_EQ(\"42\", fmt::format(FMT_STRING(with_null), 42));\n  EXPECT_EQ(\"42\", fmt::format(FMT_STRING(no_null), 42));\n#endif\n#if defined(FMT_USE_STRING_VIEW) && __cplusplus >= 201703L\n  EXPECT_EQ(\"42\", fmt::format(FMT_STRING(std::string_view(\"{}\")), 42));\n#endif\n}\n\nTEST(format_test, custom_format_compile_time_string) {\n  EXPECT_EQ(\"42\", fmt::format(FMT_STRING(\"{}\"), Answer()));\n  auto answer = Answer();\n  EXPECT_EQ(\"42\", fmt::format(FMT_STRING(\"{}\"), answer));\n  char buf[10] = {};\n  fmt::format_to(buf, FMT_STRING(\"{}\"), answer);\n  const Answer const_answer = Answer();\n  EXPECT_EQ(\"42\", fmt::format(FMT_STRING(\"{}\"), const_answer));\n}\n\n#if FMT_USE_USER_DEFINED_LITERALS\n// Passing user-defined literals directly to EXPECT_EQ causes problems\n// with macro argument stringification (#) on some versions of GCC.\n// Workaround: Assing the UDL result to a variable before the macro.\n\nusing namespace fmt::literals;\n\nTEST(format_test, format_udl) {\n  EXPECT_EQ(\"{}c{}\"_format(\"ab\", 1), fmt::format(\"{}c{}\", \"ab\", 1));\n  EXPECT_EQ(\"foo\"_format(), \"foo\");\n  EXPECT_EQ(\"{0:10}\"_format(42), \"        42\");\n  EXPECT_EQ(\"{}\"_format(date(2015, 10, 21)), \"2015-10-21\");\n}\n\nTEST(format_test, named_arg_udl) {\n  auto udl_a = fmt::format(\"{first}{second}{first}{third}\", \"first\"_a = \"abra\",\n                           \"second\"_a = \"cad\", \"third\"_a = 99);\n  EXPECT_EQ(\n      fmt::format(\"{first}{second}{first}{third}\", fmt::arg(\"first\", \"abra\"),\n                  fmt::arg(\"second\", \"cad\"), fmt::arg(\"third\", 99)),\n      udl_a);\n}\n#endif  // FMT_USE_USER_DEFINED_LITERALS\n\nTEST(format_test, enum) { EXPECT_EQ(\"0\", fmt::format(\"{}\", foo)); }\n\nTEST(format_test, formatter_not_specialized) {\n  static_assert(!fmt::has_formatter<fmt::formatter<test_enum>,\n                                    fmt::format_context>::value,\n                \"\");\n}\n\n#if FMT_HAS_FEATURE(cxx_strong_enums)\nenum big_enum : unsigned long long { big_enum_value = 5000000000ULL };\n\nTEST(format_test, strong_enum) {\n  EXPECT_EQ(\"5000000000\", fmt::format(\"{}\", big_enum_value));\n}\n#endif\n\nTEST(format_test, non_null_terminated_format_string) {\n  EXPECT_EQ(\"42\", fmt::format(string_view(\"{}foo\", 2), 42));\n}\n\nstruct variant {\n  enum { int_type, string_type } type;\n  explicit variant(int) : type(int_type) {}\n  explicit variant(const char*) : type(string_type) {}\n};\n\nFMT_BEGIN_NAMESPACE\ntemplate <> struct formatter<variant> : dynamic_formatter<> {\n  auto format(variant value, format_context& ctx) -> decltype(ctx.out()) {\n    if (value.type == variant::int_type)\n      return dynamic_formatter<>::format(42, ctx);\n    return dynamic_formatter<>::format(\"foo\", ctx);\n  }\n};\nFMT_END_NAMESPACE\n\nTEST(format_test, dynamic_formatter) {\n  auto num = variant(42);\n  auto str = variant(\"foo\");\n  EXPECT_EQ(\"42\", fmt::format(\"{:d}\", num));\n  EXPECT_EQ(\"foo\", fmt::format(\"{:s}\", str));\n  EXPECT_EQ(\" 42 foo \", fmt::format(\"{:{}} {:{}}\", num, 3, str, 4));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:{}}\"), num), format_error,\n                   \"cannot switch from manual to automatic argument indexing\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:{0}}\"), num), format_error,\n                   \"cannot switch from automatic to manual argument indexing\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:+}\"), str), format_error,\n                   \"format specifier requires numeric argument\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:-}\"), str), format_error,\n                   \"format specifier requires numeric argument\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{: }\"), str), format_error,\n                   \"format specifier requires numeric argument\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:#}\"), str), format_error,\n                   \"format specifier requires numeric argument\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:0}\"), str), format_error,\n                   \"format specifier requires numeric argument\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{:.2}\"), num), format_error,\n                   \"precision not allowed for this argument type\");\n}\n\nnamespace adl_test {\nnamespace fmt {\nnamespace detail {\nstruct foo {};\ntemplate <typename, typename OutputIt> void write(OutputIt, foo) = delete;\n}  // namespace detail\n}  // namespace fmt\n}  // namespace adl_test\n\nFMT_BEGIN_NAMESPACE\ntemplate <>\nstruct formatter<adl_test::fmt::detail::foo> : formatter<std::string> {\n  template <typename FormatContext>\n  auto format(adl_test::fmt::detail::foo, FormatContext& ctx)\n      -> decltype(ctx.out()) {\n    return formatter<std::string>::format(\"foo\", ctx);\n  }\n};\nFMT_END_NAMESPACE\n\nTEST(format_test, to_string) {\n  EXPECT_EQ(\"42\", fmt::to_string(42));\n  EXPECT_EQ(\"0x1234\", fmt::to_string(reinterpret_cast<void*>(0x1234)));\n  EXPECT_EQ(\"foo\", fmt::to_string(adl_test::fmt::detail::foo()));\n\n  enum test_enum2 : unsigned char { test_value };\n  EXPECT_EQ(\"0\", fmt::to_string(test_value));\n}\n\nTEST(format_test, output_iterators) {\n  std::list<char> out;\n  fmt::format_to(std::back_inserter(out), \"{}\", 42);\n  EXPECT_EQ(\"42\", std::string(out.begin(), out.end()));\n  std::stringstream s;\n  fmt::format_to(std::ostream_iterator<char>(s), \"{}\", 42);\n  EXPECT_EQ(\"42\", s.str());\n}\n\nTEST(format_test, formatted_size) {\n  EXPECT_EQ(2u, fmt::formatted_size(\"{}\", 42));\n}\n\nTEST(format_test, format_to_no_args) {\n  std::string s;\n  fmt::format_to(std::back_inserter(s), \"test\");\n  EXPECT_EQ(\"test\", s);\n}\n\nTEST(format_test, format_to) {\n  std::string s;\n  fmt::format_to(std::back_inserter(s), \"part{0}\", 1);\n  EXPECT_EQ(\"part1\", s);\n  fmt::format_to(std::back_inserter(s), \"part{0}\", 2);\n  EXPECT_EQ(\"part1part2\", s);\n}\n\nTEST(format_test, format_to_memory_buffer) {\n  auto buf = fmt::basic_memory_buffer<char, 100>();\n  fmt::format_to(fmt::appender(buf), \"{}\", \"foo\");\n  EXPECT_EQ(\"foo\", to_string(buf));\n}\n\nTEST(format_test, format_to_vector) {\n  std::vector<char> v;\n  fmt::format_to(std::back_inserter(v), \"{}\", \"foo\");\n  EXPECT_EQ(string_view(v.data(), v.size()), \"foo\");\n}\n\nstruct nongrowing_container {\n  using value_type = char;\n  void push_back(char) { throw std::runtime_error(\"can't take it any more\"); }\n};\n\nTEST(format_test, format_to_propagates_exceptions) {\n  auto c = nongrowing_container();\n  EXPECT_THROW(fmt::format_to(std::back_inserter(c), \"{}\", 42),\n               std::runtime_error);\n}\n\nTEST(format_test, format_to_n) {\n  char buffer[4];\n  buffer[3] = 'x';\n  auto result = fmt::format_to_n(buffer, 3, \"{}\", 12345);\n  EXPECT_EQ(5u, result.size);\n  EXPECT_EQ(buffer + 3, result.out);\n  EXPECT_EQ(\"123x\", fmt::string_view(buffer, 4));\n\n  result = fmt::format_to_n(buffer, 3, \"{:s}\", \"foobar\");\n  EXPECT_EQ(6u, result.size);\n  EXPECT_EQ(buffer + 3, result.out);\n  EXPECT_EQ(\"foox\", fmt::string_view(buffer, 4));\n\n  buffer[0] = 'x';\n  buffer[1] = 'x';\n  buffer[2] = 'x';\n  result = fmt::format_to_n(buffer, 3, \"{}\", 'A');\n  EXPECT_EQ(1u, result.size);\n  EXPECT_EQ(buffer + 1, result.out);\n  EXPECT_EQ(\"Axxx\", fmt::string_view(buffer, 4));\n\n  result = fmt::format_to_n(buffer, 3, \"{}{} \", 'B', 'C');\n  EXPECT_EQ(3u, result.size);\n  EXPECT_EQ(buffer + 3, result.out);\n  EXPECT_EQ(\"BC x\", fmt::string_view(buffer, 4));\n\n  result = fmt::format_to_n(buffer, 4, \"{}\", \"ABCDE\");\n  EXPECT_EQ(5u, result.size);\n  EXPECT_EQ(\"ABCD\", fmt::string_view(buffer, 4));\n\n  buffer[3] = 'x';\n  result = fmt::format_to_n(buffer, 3, \"{}\", std::string(1000, '*'));\n  EXPECT_EQ(1000u, result.size);\n  EXPECT_EQ(\"***x\", fmt::string_view(buffer, 4));\n}\n\nstruct test_output_iterator {\n  char* data;\n\n  using iterator_category = std::output_iterator_tag;\n  using value_type = void;\n  using difference_type = void;\n  using pointer = void;\n  using reference = void;\n\n  test_output_iterator& operator++() {\n    ++data;\n    return *this;\n  }\n  test_output_iterator operator++(int) {\n    auto tmp = *this;\n    ++data;\n    return tmp;\n  }\n  char& operator*() { return *data; }\n};\n\nTEST(format_test, format_to_n_output_iterator) {\n  char buf[10] = {};\n  fmt::format_to_n(test_output_iterator{buf}, 10, \"{}\", 42);\n  EXPECT_STREQ(buf, \"42\");\n}\n\n#if FMT_USE_CONSTEXPR\nstruct test_error_handler {\n  const char*& error;\n\n  FMT_CONSTEXPR test_error_handler(const char*& err) : error(err) {}\n\n  FMT_CONSTEXPR test_error_handler(const test_error_handler& other)\n      : error(other.error) {}\n\n  FMT_CONSTEXPR void on_error(const char* message) {\n    if (!error) error = message;\n  }\n};\n\nFMT_CONSTEXPR size_t len(const char* s) {\n  size_t len = 0;\n  while (*s++) ++len;\n  return len;\n}\n\nFMT_CONSTEXPR bool equal(const char* s1, const char* s2) {\n  if (!s1 || !s2) return s1 == s2;\n  while (*s1 && *s1 == *s2) {\n    ++s1;\n    ++s2;\n  }\n  return *s1 == *s2;\n}\n\ntemplate <typename... Args>\nFMT_CONSTEXPR bool test_error(const char* fmt, const char* expected_error) {\n  const char* actual_error = nullptr;\n  auto s = string_view(fmt, len(fmt));\n  auto checker =\n      fmt::detail::format_string_checker<char, test_error_handler, Args...>(\n          s, test_error_handler(actual_error));\n  fmt::detail::parse_format_string<true>(s, checker);\n  return equal(actual_error, expected_error);\n}\n\n#  define EXPECT_ERROR_NOARGS(fmt, error) \\\n    static_assert(test_error(fmt, error), \"\")\n#  define EXPECT_ERROR(fmt, error, ...) \\\n    static_assert(test_error<__VA_ARGS__>(fmt, error), \"\")\n\nTEST(format_test, format_string_errors) {\n  EXPECT_ERROR_NOARGS(\"foo\", nullptr);\n  EXPECT_ERROR_NOARGS(\"}\", \"unmatched '}' in format string\");\n  EXPECT_ERROR(\"{0:s\", \"unknown format specifier\", date);\n#  if !FMT_MSC_VER || FMT_MSC_VER >= 1916\n  // This causes an detail compiler error in MSVC2017.\n  EXPECT_ERROR(\"{:{<}\", \"invalid fill character '{'\", int);\n  EXPECT_ERROR(\"{:10000000000}\", \"number is too big\", int);\n  EXPECT_ERROR(\"{:.10000000000}\", \"number is too big\", int);\n  EXPECT_ERROR_NOARGS(\"{:x}\", \"argument not found\");\n  EXPECT_ERROR(\"{:+}\", \"format specifier requires numeric argument\",\n               const char*);\n  EXPECT_ERROR(\"{:-}\", \"format specifier requires numeric argument\",\n               const char*);\n  EXPECT_ERROR(\"{:#}\", \"format specifier requires numeric argument\",\n               const char*);\n  EXPECT_ERROR(\"{: }\", \"format specifier requires numeric argument\",\n               const char*);\n  EXPECT_ERROR(\"{:0}\", \"format specifier requires numeric argument\",\n               const char*);\n  EXPECT_ERROR(\"{:+}\", \"format specifier requires signed argument\", unsigned);\n  EXPECT_ERROR(\"{:-}\", \"format specifier requires signed argument\", unsigned);\n  EXPECT_ERROR(\"{: }\", \"format specifier requires signed argument\", unsigned);\n  EXPECT_ERROR(\"{:{}}\", \"argument not found\", int);\n  EXPECT_ERROR(\"{:.{}}\", \"argument not found\", double);\n  EXPECT_ERROR(\"{:.2}\", \"precision not allowed for this argument type\", int);\n  EXPECT_ERROR(\"{:s}\", \"invalid type specifier\", int);\n  EXPECT_ERROR(\"{:s}\", \"invalid type specifier\", char);\n  EXPECT_ERROR(\"{:+}\", \"invalid format specifier for char\", char);\n  EXPECT_ERROR(\"{:s}\", \"invalid type specifier\", double);\n  EXPECT_ERROR(\"{:d}\", \"invalid type specifier\", const char*);\n  EXPECT_ERROR(\"{:d}\", \"invalid type specifier\", std::string);\n  EXPECT_ERROR(\"{:s}\", \"invalid type specifier\", void*);\n#  else\n  fmt::print(\"warning: constexpr is broken in this version of MSVC\\n\");\n#  endif\n#  if FMT_USE_NONTYPE_TEMPLATE_PARAMETERS\n  EXPECT_ERROR(\"{foo}\", \"named argument is not found\", decltype(\"bar\"_a = 42));\n  EXPECT_ERROR(\"{foo}\", \"named argument is not found\",\n               decltype(fmt::arg(\"foo\", 42)));\n#  else\n  EXPECT_ERROR(\"{foo}\",\n               \"compile-time checks for named arguments require C++20 support\",\n               int);\n#  endif\n  EXPECT_ERROR_NOARGS(\"{10000000000}\", \"argument not found\");\n  EXPECT_ERROR_NOARGS(\"{0x}\", \"invalid format string\");\n  EXPECT_ERROR_NOARGS(\"{-}\", \"invalid format string\");\n  EXPECT_ERROR(\"{:{0x}}\", \"invalid format string\", int);\n  EXPECT_ERROR(\"{:{-}}\", \"invalid format string\", int);\n  EXPECT_ERROR(\"{:.{0x}}\", \"invalid format string\", int);\n  EXPECT_ERROR(\"{:.{-}}\", \"invalid format string\", int);\n  EXPECT_ERROR(\"{:.x}\", \"missing precision specifier\", int);\n  EXPECT_ERROR_NOARGS(\"{}\", \"argument not found\");\n  EXPECT_ERROR(\"{1}\", \"argument not found\", int);\n  EXPECT_ERROR(\"{1}{}\",\n               \"cannot switch from manual to automatic argument indexing\", int,\n               int);\n  EXPECT_ERROR(\"{}{1}\",\n               \"cannot switch from automatic to manual argument indexing\", int,\n               int);\n}\n\nTEST(format_test, vformat_to) {\n  using context = fmt::format_context;\n  fmt::basic_format_arg<context> arg = fmt::detail::make_arg<context>(42);\n  auto args = fmt::basic_format_args<context>(&arg, 1);\n  auto s = std::string();\n  fmt::vformat_to(std::back_inserter(s), \"{}\", args);\n  EXPECT_EQ(\"42\", s);\n  s.clear();\n  fmt::vformat_to(std::back_inserter(s), FMT_STRING(\"{}\"), args);\n  EXPECT_EQ(\"42\", s);\n}\n\n#endif  // FMT_USE_CONSTEXPR\n\nTEST(format_test, char_traits_is_not_ambiguous) {\n  // Test that we don't inject detail names into the std namespace.\n  using namespace std;\n  auto c = char_traits<char>::char_type();\n  (void)c;\n#if __cplusplus >= 201103L\n  auto s = std::string();\n  auto lval = begin(s);\n  (void)lval;\n#endif\n}\n\nstruct check_back_appender {};\n\nFMT_BEGIN_NAMESPACE\ntemplate <> struct formatter<check_back_appender> {\n  auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {\n    return ctx.begin();\n  }\n\n  template <typename Context>\n  auto format(check_back_appender, Context& ctx) -> decltype(ctx.out()) {\n    auto out = ctx.out();\n    static_assert(std::is_same<decltype(++out), decltype(out)&>::value,\n                  \"needs to satisfy weakly_incrementable\");\n    *out = 'y';\n    return ++out;\n  }\n};\nFMT_END_NAMESPACE\n\nTEST(format_test, back_insert_slicing) {\n  EXPECT_EQ(fmt::format(\"{}\", check_back_appender{}), \"y\");\n}\n\ntemplate <typename Char, typename T> bool check_enabled_formatter() {\n  static_assert(std::is_default_constructible<fmt::formatter<T, Char>>::value,\n                \"\");\n  return true;\n}\n\ntemplate <typename Char, typename... T> void check_enabled_formatters() {\n  auto dummy = {check_enabled_formatter<Char, T>()...};\n  (void)dummy;\n}\n\nTEST(format_test, test_formatters_enabled) {\n  check_enabled_formatters<char, bool, char, signed char, unsigned char, short,\n                           unsigned short, int, unsigned, long, unsigned long,\n                           long long, unsigned long long, float, double,\n                           long double, void*, const void*, char*, const char*,\n                           std::string, std::nullptr_t>();\n  check_enabled_formatters<wchar_t, bool, wchar_t, signed char, unsigned char,\n                           short, unsigned short, int, unsigned, long,\n                           unsigned long, long long, unsigned long long, float,\n                           double, long double, void*, const void*, wchar_t*,\n                           const wchar_t*, std::wstring, std::nullptr_t>();\n}\n\nTEST(format_int_test, data) {\n  fmt::format_int format_int(42);\n  EXPECT_EQ(\"42\", std::string(format_int.data(), format_int.size()));\n}\n\nTEST(format_int_test, format_int) {\n  EXPECT_EQ(\"42\", fmt::format_int(42).str());\n  EXPECT_EQ(2u, fmt::format_int(42).size());\n  EXPECT_EQ(\"-42\", fmt::format_int(-42).str());\n  EXPECT_EQ(3u, fmt::format_int(-42).size());\n  EXPECT_EQ(\"42\", fmt::format_int(42ul).str());\n  EXPECT_EQ(\"-42\", fmt::format_int(-42l).str());\n  EXPECT_EQ(\"42\", fmt::format_int(42ull).str());\n  EXPECT_EQ(\"-42\", fmt::format_int(-42ll).str());\n  std::ostringstream os;\n  os << max_value<int64_t>();\n  EXPECT_EQ(os.str(), fmt::format_int(max_value<int64_t>()).str());\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/fuzzing/.gitignore",
    "content": "# ignore artifacts from the build.sh script\nbuild-*/\n\n"
  },
  {
    "path": "examples/libraries/fmt/test/fuzzing/CMakeLists.txt",
    "content": "# Copyright (c) 2019, Paul Dreik\n# License: see LICENSE.rst in the fmt root directory\n\n# Link in the main function. Useful for reproducing, kcov, gdb, afl, valgrind.\n# (Note that libFuzzer can also reproduce, just pass it the files.)\noption(FMT_FUZZ_LINKMAIN \"Enables the reproduce mode, instead of libFuzzer\" On)\n\n# For oss-fuzz - insert $LIB_FUZZING_ENGINE into the link flags, but only for\n# the fuzz targets, otherwise the CMake configuration step fails.\nset(FMT_FUZZ_LDFLAGS \"\" CACHE STRING \"LDFLAGS for the fuzz targets\")\n\n# Adds a binary for reproducing, i.e. no fuzzing, just enables replaying data\n# through the fuzzers.\nfunction(add_fuzzer source)\n  get_filename_component(basename ${source} NAME_WE)\n  set(name ${basename}-fuzzer)\n  add_executable(${name} ${source} fuzzer-common.h)\n  if (FMT_FUZZ_LINKMAIN)\n    target_sources(${name} PRIVATE main.cc)\n  endif ()\n  target_link_libraries(${name} PRIVATE fmt)\n  if (FMT_FUZZ_LDFLAGS)\n    target_link_libraries(${name} PRIVATE ${FMT_FUZZ_LDFLAGS})\n  endif ()\n  target_compile_features(${name} PRIVATE cxx_generic_lambdas)\nendfunction()\n\nforeach (source chrono-duration.cc float.cc named-arg.cc one-arg.cc two-args.cc)\n  add_fuzzer(${source})\nendforeach ()\n"
  },
  {
    "path": "examples/libraries/fmt/test/fuzzing/README.md",
    "content": "# Running the fuzzers locally\n\nThere is a [helper script](build.sh) to build the fuzzers, which has only been\ntested on Debian and Ubuntu linux so far. There should be no problems fuzzing on\nWindows (using clang>=8) or on Mac, but the script will probably not work out of\nthe box.\n\nSomething along\n```sh\nmkdir build\ncd build\nexport CXX=clang++\nexport CXXFLAGS=\"-fsanitize=fuzzer-no-link -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION= -g\"\ncmake .. -DFMT_SAFE_DURATION_CAST=On -DFMT_FUZZ=On -DFMT_FUZZ_LINKMAIN=Off -DFMT_FUZZ_LDFLAGS=\"-fsanitize=fuzzer\"\ncmake --build .\n```\nshould work to build the fuzzers for all platforms which clang supports.\n\nExecute a fuzzer with for instance\n```sh\ncd build\nexport UBSAN_OPTIONS=halt_on_error=1\nmkdir out_chrono\nbin/fuzzer_chrono_duration out_chrono\n```\n"
  },
  {
    "path": "examples/libraries/fmt/test/fuzzing/build.sh",
    "content": "#!/bin/sh\n#\n# Creates fuzzer builds of various kinds\n# - oss-fuzz emulated mode (makes sure a simulated invocation by oss-fuzz works)\n# - libFuzzer build (you will need clang)\n# - afl build (you will need afl)\n#\n#\n# Copyright (c) 2019 Paul Dreik\n#\n# For the license information refer to format.h.\n\nset -e\nme=$(basename $0)\nroot=$(readlink -f \"$(dirname \"$0\")/../..\")\n\n\necho $me: root=$root\n\nhere=$(pwd)\n\nCXXFLAGSALL=\"-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION= -g\"\nCMAKEFLAGSALL=\"$root -GNinja -DCMAKE_BUILD_TYPE=Debug -DFMT_DOC=Off -DFMT_TEST=Off -DFMT_FUZZ=On -DCMAKE_CXX_STANDARD=17\"\n\n# For performance analysis of the fuzzers.\nbuilddir=$here/build-fuzzers-perfanalysis\nmkdir -p $builddir\ncd $builddir\nCXX=\"ccache g++\" CXXFLAGS=\"$CXXFLAGSALL -g\" cmake \\\n$CMAKEFLAGSALL \\\n-DFMT_FUZZ_LINKMAIN=On \\\n-DCMAKE_BUILD_TYPE=Release\n\ncmake --build $builddir\n\n# Builds the fuzzers as oss-fuzz does.\nbuilddir=$here/build-fuzzers-ossfuzz\nmkdir -p $builddir\ncd $builddir\nCXX=\"clang++\" \\\nCXXFLAGS=\"$CXXFLAGSALL -fsanitize=fuzzer-no-link\" cmake \\\ncmake $CMAKEFLAGSALL \\\n-DFMT_FUZZ_LINKMAIN=Off \\\n-DFMT_FUZZ_LDFLAGS=\"-fsanitize=fuzzer\"\n\ncmake --build $builddir\n\n\n# Builds fuzzers for local fuzzing with libfuzzer with asan+usan.\nbuilddir=$here/build-fuzzers-libfuzzer\nmkdir -p $builddir\ncd $builddir\nCXX=\"clang++\" \\\nCXXFLAGS=\"$CXXFLAGSALL -fsanitize=fuzzer-no-link,address,undefined\" cmake \\\ncmake $CMAKEFLAGSALL \\\n-DFMT_FUZZ_LINKMAIN=Off \\\n-DFMT_FUZZ_LDFLAGS=\"-fsanitize=fuzzer\"\n\ncmake --build $builddir\n\n# Builds a fast fuzzer for making coverage fast.\nbuilddir=$here/build-fuzzers-fast\nmkdir -p $builddir\ncd $builddir\nCXX=\"clang++\" \\\nCXXFLAGS=\"$CXXFLAGSALL -fsanitize=fuzzer-no-link -O3\" cmake \\\ncmake $CMAKEFLAGSALL \\\n-DFMT_FUZZ_LINKMAIN=Off \\\n-DFMT_FUZZ_LDFLAGS=\"-fsanitize=fuzzer\" \\\n -DCMAKE_BUILD_TYPE=Release\n\ncmake --build $builddir\n\n\n# Builds fuzzers for local fuzzing with afl.\nbuilddir=$here/build-fuzzers-afl\nmkdir -p $builddir\ncd $builddir\nCXX=\"afl-g++\" \\\nCXXFLAGS=\"$CXXFLAGSALL -fsanitize=address,undefined\" \\\ncmake $CMAKEFLAGSALL \\\n-DFMT_FUZZ_LINKMAIN=On\n\ncmake --build $builddir\n\n\necho $me: all good\n\n"
  },
  {
    "path": "examples/libraries/fmt/test/fuzzing/chrono-duration.cc",
    "content": "// Copyright (c) 2019, Paul Dreik\n// For the license information refer to format.h.\n\n#include <cstdint>\n#include <fmt/chrono.h>\n\n#include \"fuzzer-common.h\"\n\ntemplate <typename Period, typename Rep>\nvoid invoke_inner(fmt::string_view format_str, Rep rep) {\n  auto value = std::chrono::duration<Rep, Period>(rep);\n  try {\n#if FMT_FUZZ_FORMAT_TO_STRING\n    std::string message = fmt::format(format_str, value);\n#else\n    fmt::memory_buffer buf;\n    fmt::format_to(buf, format_str, value);\n#endif\n  } catch (std::exception&) {\n  }\n}\n\n// Rep is a duration's representation type.\ntemplate <typename Rep>\nvoid invoke_outer(const uint8_t* data, size_t size, int period) {\n  // Always use a fixed location of the data.\n  static_assert(sizeof(Rep) <= fixed_size, \"fixed size is too small\");\n  if (size <= fixed_size + 1) return;\n\n  const Rep rep = assign_from_buf<Rep>(data);\n  data += fixed_size;\n  size -= fixed_size;\n\n  // data is already allocated separately in libFuzzer so reading past the end \n  // will most likely be detected anyway.\n  const auto format_str = fmt::string_view(as_chars(data), size);\n\n  // yocto, zepto, zetta and yotta are not handled.\n  switch (period) {\n  case 1:\n    invoke_inner<std::atto>(format_str, rep);\n    break;\n  case 2:\n    invoke_inner<std::femto>(format_str, rep);\n    break;\n  case 3:\n    invoke_inner<std::pico>(format_str, rep);\n    break;\n  case 4:\n    invoke_inner<std::nano>(format_str, rep);\n    break;\n  case 5:\n    invoke_inner<std::micro>(format_str, rep);\n    break;\n  case 6:\n    invoke_inner<std::milli>(format_str, rep);\n    break;\n  case 7:\n    invoke_inner<std::centi>(format_str, rep);\n    break;\n  case 8:\n    invoke_inner<std::deci>(format_str, rep);\n    break;\n  case 9:\n    invoke_inner<std::deca>(format_str, rep);\n    break;\n  case 10:\n    invoke_inner<std::kilo>(format_str, rep);\n    break;\n  case 11:\n    invoke_inner<std::mega>(format_str, rep);\n    break;\n  case 12:\n    invoke_inner<std::giga>(format_str, rep);\n    break;\n  case 13:\n    invoke_inner<std::tera>(format_str, rep);\n    break;\n  case 14:\n    invoke_inner<std::peta>(format_str, rep);\n    break;\n  case 15:\n    invoke_inner<std::exa>(format_str, rep);\n    break;\n  }\n}\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {\n  if (size <= 4)  return 0;\n\n  const auto representation = data[0];\n  const auto period = data[1];\n  data += 2;\n  size -= 2;\n\n  switch (representation) {\n  case 1:\n    invoke_outer<char>(data, size, period);\n    break;\n  case 2:\n    invoke_outer<signed char>(data, size, period);\n    break;\n  case 3:\n    invoke_outer<unsigned char>(data, size, period);\n    break;\n  case 4:\n    invoke_outer<short>(data, size, period);\n    break;\n  case 5:\n    invoke_outer<unsigned short>(data, size, period);\n    break;\n  case 6:\n    invoke_outer<int>(data, size, period);\n    break;\n  case 7:\n    invoke_outer<unsigned int>(data, size, period);\n    break;\n  case 8:\n    invoke_outer<long>(data, size, period);\n    break;\n  case 9:\n    invoke_outer<unsigned long>(data, size, period);\n    break;\n  case 10:\n    invoke_outer<float>(data, size, period);\n    break;\n  case 11:\n    invoke_outer<double>(data, size, period);\n    break;\n  case 12:\n    invoke_outer<long double>(data, size, period);\n    break;\n  }\n  return 0;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/fuzzing/float.cc",
    "content": "// A fuzzer for floating-point formatter.\n// For the license information refer to format.h.\n\n#include <cstdint>\n#include <cstdlib>\n#include <stdexcept>\n#include <limits>\n#include <fmt/format.h>\n\n#include \"fuzzer-common.h\"\n\nvoid check_round_trip(fmt::string_view format_str, double value) {\n  auto buffer = fmt::memory_buffer();\n  fmt::format_to(buffer, format_str, value);\n\n  if (std::isnan(value)) {\n    auto nan = std::signbit(value) ? \"-nan\" : \"nan\";\n    if (fmt::string_view(buffer.data(), buffer.size()) != nan)\n      throw std::runtime_error(\"round trip failure\");\n    return;\n  }\n\n  buffer.push_back('\\0');\n  char* ptr = nullptr;\n  if (std::strtod(buffer.data(), &ptr) != value)\n    throw std::runtime_error(\"round trip failure\");\n  if (ptr + 1 != buffer.end())\n    throw std::runtime_error(\"unparsed output\");\n}\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {\n  if (size <= sizeof(double) || !std::numeric_limits<double>::is_iec559)\n    return 0;\n  check_round_trip(\"{}\", assign_from_buf<double>(data));\n  // A larger than necessary precision is used to trigger the fallback\n  // formatter.\n  check_round_trip(\"{:.50g}\", assign_from_buf<double>(data));\n  return 0;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/fuzzing/fuzzer-common.h",
    "content": "// Copyright (c) 2019, Paul Dreik\n// For the license information refer to format.h.\n\n#ifndef FUZZER_COMMON_H\n#define FUZZER_COMMON_H\n\n#include <cstdint>      // std::uint8_t\n#include <cstring>      // memcpy\n#include <vector>\n\n#include <fmt/core.h>\n\n// One can format to either a string, or a buffer. The latter is faster, but\n// one may be interested in formatting to a string instead to verify it works\n// as intended. To avoid a combinatoric explosion, select this at compile time\n// instead of dynamically from the fuzz data.\n#define FMT_FUZZ_FORMAT_TO_STRING 0\n\n// If {fmt} is given a buffer that is separately allocated, chances that address\n// sanitizer detects out of bound reads is much higher. However, it slows down\n// the fuzzing.\n#define FMT_FUZZ_SEPARATE_ALLOCATION 1\n\n// The size of the largest possible type in use.\n// To let the the fuzzer mutation be efficient at cross pollinating between\n// different types, use a fixed size format. The same bit pattern, interpreted\n// as another type, is likely interesting.\nconstexpr auto fixed_size = 16;\n\n// Casts data to a char pointer.\ntemplate <typename T> inline const char* as_chars(const T* data) {\n  return reinterpret_cast<const char*>(data);\n}\n\n// Casts data to a byte pointer.\ntemplate <typename T> inline const std::uint8_t* as_bytes(const T* data) {\n  return reinterpret_cast<const std::uint8_t*>(data);\n}\n\n// Blits bytes from data to form an (assumed trivially constructible) object\n// of type Item.\ntemplate <class Item> inline Item assign_from_buf(const std::uint8_t* data) {\n  auto item = Item();\n  std::memcpy(&item, data, sizeof(Item));\n  return item;\n}\n\n// Reads a boolean value by looking at the first byte from data.\ntemplate <> inline bool assign_from_buf<bool>(const std::uint8_t* data) {\n  return *data != 0;\n}\n\nstruct data_to_string {\n#if FMT_FUZZ_SEPARATE_ALLOCATION\n  std::vector<char> buffer;\n\n  data_to_string(const uint8_t* data, size_t size, bool add_terminator = false)\n      : buffer(size + (add_terminator ? 1 : 0)) {\n    std::memcpy(buffer.data(), data, size);\n  }\n\n  fmt::string_view get() const { return {buffer.data(), buffer.size()}; }\n#else\n  fmt::string_view sv;\n\n  data_to_string(const uint8_t* data, size_t size, bool = false)\n      : str(as_chars(data), size) {}\n\n  fmt::string_view get() const { return sv; }\n#endif\n\n  const char* data() const { return get().data(); }\n};\n\n#endif  // FUZZER_COMMON_H\n"
  },
  {
    "path": "examples/libraries/fmt/test/fuzzing/main.cc",
    "content": "#include <cassert>\n#include <fstream>\n#include <vector>\n\n#include \"fuzzer-common.h\"\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);\n\nint main(int argc, char** argv) {\n  for (int i = 1; i < argc; ++i) {\n    std::ifstream in(argv[i]);\n    assert(in);\n    in.seekg(0, std::ios_base::end);\n    const auto size = in.tellg();\n    assert(size >= 0);\n    in.seekg(0, std::ios_base::beg);\n    std::vector<char> buf(static_cast<size_t>(size));\n    in.read(buf.data(), size);\n    assert(in.gcount() == size);\n    LLVMFuzzerTestOneInput(as_bytes(buf.data()), buf.size());\n  }\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/fuzzing/named-arg.cc",
    "content": "// Copyright (c) 2019, Paul Dreik\n// For the license information refer to format.h.\n\n#include <cstdint>\n#include <type_traits>\n#include <vector>\n#include <fmt/chrono.h>\n\n#include \"fuzzer-common.h\"\n\ntemplate <typename T>\nvoid invoke_fmt(const uint8_t* data, size_t size, unsigned arg_name_size) {\n  static_assert(sizeof(T) <= fixed_size, \"fixed_size too small\");\n  if (size <= fixed_size) return;\n  const T value = assign_from_buf<T>(data);\n  data += fixed_size;\n  size -= fixed_size;\n\n  if (arg_name_size <= 0 || arg_name_size >= size) return;\n  data_to_string arg_name(data, arg_name_size, true);\n  data += arg_name_size;\n  size -= arg_name_size;\n\n  data_to_string format_str(data, size);\n  try {\n#if FMT_FUZZ_FORMAT_TO_STRING\n    std::string message =\n      fmt::format(format_str.get(), fmt::arg(arg_name.data(), value));\n#else\n    fmt::memory_buffer out;\n    fmt::format_to(out, format_str.get(), fmt::arg(arg_name.data(), value));\n#endif\n  } catch (std::exception&) {\n  }\n}\n\n// For dynamic dispatching to an explicit instantiation.\ntemplate <typename Callback> void invoke(int type, Callback callback) {\n  switch (type) {\n  case 0:\n    callback(bool());\n    break;\n  case 1:\n    callback(char());\n    break;\n  case 2:\n    using sc = signed char;\n    callback(sc());\n    break;\n  case 3:\n    using uc = unsigned char;\n    callback(uc());\n    break;\n  case 4:\n    callback(short());\n    break;\n  case 5:\n    using us = unsigned short;\n    callback(us());\n    break;\n  case 6:\n    callback(int());\n    break;\n  case 7:\n    callback(unsigned());\n    break;\n  case 8:\n    callback(long());\n    break;\n  case 9:\n    using ul = unsigned long;\n    callback(ul());\n    break;\n  case 10:\n    callback(float());\n    break;\n  case 11:\n    callback(double());\n    break;\n  case 12:\n    using LD = long double;\n    callback(LD());\n    break;\n  }\n}\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {\n  if (size <= 3) return 0;\n\n  // Switch types depending on the first byte of the input.\n  const auto type = data[0] & 0x0F;\n  const unsigned arg_name_size = (data[0] & 0xF0) >> 4;\n  data++;\n  size--;\n\n  invoke(type, [=](auto arg) {\n    invoke_fmt<decltype(arg)>(data, size, arg_name_size);\n  });\n  return 0;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/fuzzing/one-arg.cc",
    "content": "// Copyright (c) 2019, Paul Dreik\n// For the license information refer to format.h.\n\n#include <cstdint>\n#include <exception>\n#include <fmt/chrono.h>\n\n#include \"fuzzer-common.h\"\n\ntemplate <typename T, typename Repr>\nconst T* from_repr(const Repr& r) { return &r; }\n\ntemplate <>\nconst std::tm* from_repr<std::tm>(const std::time_t& t) {\n  return std::localtime(&t);\n}\n\ntemplate <typename T, typename Repr = T>\nvoid invoke_fmt(const uint8_t* data, size_t size) {\n  static_assert(sizeof(Repr) <= fixed_size, \"Nfixed is too small\");\n  if (size <= fixed_size) return;\n  auto repr = assign_from_buf<Repr>(data);\n  const T* value = from_repr<T>(repr);\n  if (!value) return;\n  data += fixed_size;\n  size -= fixed_size;\n  data_to_string format_str(data, size);\n  try {\n#if FMT_FUZZ_FORMAT_TO_STRING\n    std::string message = fmt::format(format_str.get(), *value);\n#else\n    fmt::memory_buffer message;\n    fmt::format_to(message, format_str.get(), *value);\n#endif\n  } catch (std::exception&) {\n  }\n}\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {\n  if (size <= 3) return 0;\n\n  const auto first = data[0];\n  data++;\n  size--;\n\n  switch (first) {\n  case 0:\n    invoke_fmt<bool>(data, size);\n    break;\n  case 1:\n    invoke_fmt<char>(data, size);\n    break;\n  case 2:\n    invoke_fmt<unsigned char>(data, size);\n    break;\n  case 3:\n    invoke_fmt<signed char>(data, size);\n    break;\n  case 4:\n    invoke_fmt<short>(data, size);\n    break;\n  case 5:\n    invoke_fmt<unsigned short>(data, size);\n    break;\n  case 6:\n    invoke_fmt<int>(data, size);\n    break;\n  case 7:\n    invoke_fmt<unsigned int>(data, size);\n    break;\n  case 8:\n    invoke_fmt<long>(data, size);\n    break;\n  case 9:\n    invoke_fmt<unsigned long>(data, size);\n    break;\n  case 10:\n    invoke_fmt<float>(data, size);\n    break;\n  case 11:\n    invoke_fmt<double>(data, size);\n    break;\n  case 12:\n    invoke_fmt<long double>(data, size);\n    break;\n  case 13:\n    invoke_fmt<std::tm, std::time_t>(data, size);\n    break;\n  }\n  return 0;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/fuzzing/two-args.cc",
    "content": "// Copyright (c) 2019, Paul Dreik\n// For the license information refer to format.h.\n\n#include <cstdint>\n#include <exception>\n#include <string>\n#include <fmt/format.h>\n\n#include \"fuzzer-common.h\"\n\ntemplate <typename Item1, typename Item2>\nvoid invoke_fmt(const uint8_t* data, size_t size) {\n  static_assert(sizeof(Item1) <= fixed_size, \"size1 exceeded\");\n  static_assert(sizeof(Item2) <= fixed_size, \"size2 exceeded\");\n  if (size <= fixed_size + fixed_size) return;\n\n  const Item1 item1 = assign_from_buf<Item1>(data);\n  data += fixed_size;\n  size -= fixed_size;\n\n  const Item2 item2 = assign_from_buf<Item2>(data);\n  data += fixed_size;\n  size -= fixed_size;\n\n  auto format_str = fmt::string_view(as_chars(data), size);\n#if FMT_FUZZ_FORMAT_TO_STRING\n  std::string message = fmt::format(format_str, item1, item2);\n#else\n  fmt::memory_buffer message;\n  fmt::format_to(message, format_str, item1, item2);\n#endif\n}\n\n// For dynamic dispatching to an explicit instantiation.\ntemplate <typename Callback> void invoke(int index, Callback callback) {\n  switch (index) {\n  case 0:\n    callback(bool());\n    break;\n  case 1:\n    callback(char());\n    break;\n  case 2:\n    using sc = signed char;\n    callback(sc());\n    break;\n  case 3:\n    using uc = unsigned char;\n    callback(uc());\n    break;\n  case 4:\n    callback(short());\n    break;\n  case 5:\n    using us = unsigned short;\n    callback(us());\n    break;\n  case 6:\n    callback(int());\n    break;\n  case 7:\n    callback(unsigned());\n    break;\n  case 8:\n    callback(long());\n    break;\n  case 9:\n    using ul = unsigned long;\n    callback(ul());\n    break;\n  case 10:\n    callback(float());\n    break;\n  case 11:\n    callback(double());\n    break;\n  case 12:\n    using LD = long double;\n    callback(LD());\n    break;\n  case 13:\n    using ptr = void*;\n    callback(ptr());\n    break;\n  }\n}\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {\n  if (size <= 3) return 0;\n\n  // Switch types depending on the first byte of the input.\n  const auto type1 = data[0] & 0x0F;\n  const auto type2 = (data[0] & 0xF0) >> 4;\n  data++;\n  size--;\n  try {\n    invoke(type1, [=](auto param1) {\n      invoke(type2, [=](auto param2) {\n        invoke_fmt<decltype(param1), decltype(param2)>(data, size);\n      });\n    });\n  } catch (std::exception&) {\n  }\n  return 0;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/gtest/.clang-format",
    "content": "# Disable clang-format here\nDisableFormat: true\nSortIncludes: Never\n"
  },
  {
    "path": "examples/libraries/fmt/test/gtest/CMakeLists.txt",
    "content": "#------------------------------------------------------------------------------\n# Build the google test library\n\n# We compile Google Test ourselves instead of using pre-compiled libraries.\n# See the Google Test FAQ \"Why is it not recommended to install a\n# pre-compiled copy of Google Test (for example, into /usr/local)?\"\n# at http://code.google.com/p/googletest/wiki/FAQ for more details.\nadd_library(gtest STATIC\n  gmock-gtest-all.cc gmock/gmock.h gtest/gtest.h gtest/gtest-spi.h)\ntarget_compile_definitions(gtest PUBLIC GTEST_HAS_STD_WSTRING=1)\ntarget_include_directories(gtest SYSTEM PUBLIC .)\n\nfind_package(Threads)\nif (Threads_FOUND)\n  target_link_libraries(gtest ${CMAKE_THREAD_LIBS_INIT})\nelse ()\n  target_compile_definitions(gtest PUBLIC GTEST_HAS_PTHREAD=0)\nendif ()\n\nif (MSVC)\n  # Disable MSVC warnings of _CRT_INSECURE_DEPRECATE functions.\n  target_compile_definitions(gtest PRIVATE _CRT_SECURE_NO_WARNINGS)\n  if (CMAKE_CXX_COMPILER_ID MATCHES \"Clang\")\n    # Disable MSVC warnings of POSIX functions.\n    target_compile_options(gtest PUBLIC -Wno-deprecated-declarations)\n  endif ()\nendif ()\n\n# Silence MSVC tr1 deprecation warning in gmock.\ntarget_compile_definitions(gtest\n  PUBLIC _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING=1)\n"
  },
  {
    "path": "examples/libraries/fmt/test/gtest/gmock/gmock.h",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This is the main header file a user should include.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_H_\n#define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_H_\n\n// This file implements the following syntax:\n//\n//   ON_CALL(mock_object, Method(...))\n//     .With(...) ?\n//     .WillByDefault(...);\n//\n// where With() is optional and WillByDefault() must appear exactly\n// once.\n//\n//   EXPECT_CALL(mock_object, Method(...))\n//     .With(...) ?\n//     .Times(...) ?\n//     .InSequence(...) *\n//     .WillOnce(...) *\n//     .WillRepeatedly(...) ?\n//     .RetiresOnSaturation() ? ;\n//\n// where all clauses are optional and WillOnce() can be repeated.\n\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// The ACTION* family of macros can be used in a namespace scope to\n// define custom actions easily.  The syntax:\n//\n//   ACTION(name) { statements; }\n//\n// will define an action with the given name that executes the\n// statements.  The value returned by the statements will be used as\n// the return value of the action.  Inside the statements, you can\n// refer to the K-th (0-based) argument of the mock function by\n// 'argK', and refer to its type by 'argK_type'.  For example:\n//\n//   ACTION(IncrementArg1) {\n//     arg1_type temp = arg1;\n//     return ++(*temp);\n//   }\n//\n// allows you to write\n//\n//   ...WillOnce(IncrementArg1());\n//\n// You can also refer to the entire argument tuple and its type by\n// 'args' and 'args_type', and refer to the mock function type and its\n// return type by 'function_type' and 'return_type'.\n//\n// Note that you don't need to specify the types of the mock function\n// arguments.  However rest assured that your code is still type-safe:\n// you'll get a compiler error if *arg1 doesn't support the ++\n// operator, or if the type of ++(*arg1) isn't compatible with the\n// mock function's return type, for example.\n//\n// Sometimes you'll want to parameterize the action.   For that you can use\n// another macro:\n//\n//   ACTION_P(name, param_name) { statements; }\n//\n// For example:\n//\n//   ACTION_P(Add, n) { return arg0 + n; }\n//\n// will allow you to write:\n//\n//   ...WillOnce(Add(5));\n//\n// Note that you don't need to provide the type of the parameter\n// either.  If you need to reference the type of a parameter named\n// 'foo', you can write 'foo_type'.  For example, in the body of\n// ACTION_P(Add, n) above, you can write 'n_type' to refer to the type\n// of 'n'.\n//\n// We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P10 to support\n// multi-parameter actions.\n//\n// For the purpose of typing, you can view\n//\n//   ACTION_Pk(Foo, p1, ..., pk) { ... }\n//\n// as shorthand for\n//\n//   template <typename p1_type, ..., typename pk_type>\n//   FooActionPk<p1_type, ..., pk_type> Foo(p1_type p1, ..., pk_type pk) { ... }\n//\n// In particular, you can provide the template type arguments\n// explicitly when invoking Foo(), as in Foo<long, bool>(5, false);\n// although usually you can rely on the compiler to infer the types\n// for you automatically.  You can assign the result of expression\n// Foo(p1, ..., pk) to a variable of type FooActionPk<p1_type, ...,\n// pk_type>.  This can be useful when composing actions.\n//\n// You can also overload actions with different numbers of parameters:\n//\n//   ACTION_P(Plus, a) { ... }\n//   ACTION_P2(Plus, a, b) { ... }\n//\n// While it's tempting to always use the ACTION* macros when defining\n// a new action, you should also consider implementing ActionInterface\n// or using MakePolymorphicAction() instead, especially if you need to\n// use the action a lot.  While these approaches require more work,\n// they give you more control on the types of the mock function\n// arguments and the action parameters, which in general leads to\n// better compiler error messages that pay off in the long run.  They\n// also allow overloading actions based on parameter types (as opposed\n// to just based on the number of parameters).\n//\n// CAVEAT:\n//\n// ACTION*() can only be used in a namespace scope as templates cannot be\n// declared inside of a local class.\n// Users can, however, define any local functors (e.g. a lambda) that\n// can be used as actions.\n//\n// MORE INFORMATION:\n//\n// To learn more about using these macros, please search for 'ACTION' on\n// https://github.com/google/googletest/blob/master/docs/gmock_cook_book.md\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_\n#define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_\n\n#ifndef _WIN32_WCE\n# include <errno.h>\n#endif\n\n#include <algorithm>\n#include <functional>\n#include <memory>\n#include <string>\n#include <tuple>\n#include <type_traits>\n#include <utility>\n\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file defines some utilities useful for implementing Google\n// Mock.  They are subject to change without notice, so please DO NOT\n// USE THEM IN USER CODE.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_\n#define GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_\n\n#include <stdio.h>\n#include <ostream>  // NOLINT\n#include <string>\n#include <type_traits>\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Low-level types and utilities for porting Google Mock to various\n// platforms.  All macros ending with _ and symbols defined in an\n// internal namespace are subject to change without notice.  Code\n// outside Google Mock MUST NOT USE THEM DIRECTLY.  Macros that don't\n// end with _ are part of Google Mock's public API and can be used by\n// code outside Google Mock.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_\n#define GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_\n\n#include <assert.h>\n#include <stdlib.h>\n#include <cstdint>\n#include <iostream>\n\n// Most of the utilities needed for porting Google Mock are also\n// required for Google Test and are defined in gtest-port.h.\n//\n// Note to maintainers: to reduce code duplication, prefer adding\n// portability utilities to Google Test's gtest-port.h instead of\n// here, as Google Mock depends on Google Test.  Only add a utility\n// here if it's truly specific to Google Mock.\n\n#include \"gtest/gtest.h\"\n// Copyright 2015, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Injection point for custom user configurations. See README for details\n//\n// ** Custom implementation starts here **\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_PORT_H_\n#define GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_PORT_H_\n\n#endif  // GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_PORT_H_\n\n// For MS Visual C++, check the compiler version. At least VS 2015 is\n// required to compile Google Mock.\n#if defined(_MSC_VER) && _MSC_VER < 1900\n# error \"At least Visual C++ 2015 (14.0) is required to compile Google Mock.\"\n#endif\n\n// Macro for referencing flags.  This is public as we want the user to\n// use this syntax to reference Google Mock flags.\n#define GMOCK_FLAG(name) FLAGS_gmock_##name\n\n#if !defined(GMOCK_DECLARE_bool_)\n\n// Macros for declaring flags.\n# define GMOCK_DECLARE_bool_(name) extern GTEST_API_ bool GMOCK_FLAG(name)\n# define GMOCK_DECLARE_int32_(name) extern GTEST_API_ int32_t GMOCK_FLAG(name)\n# define GMOCK_DECLARE_string_(name) \\\n    extern GTEST_API_ ::std::string GMOCK_FLAG(name)\n\n// Macros for defining flags.\n# define GMOCK_DEFINE_bool_(name, default_val, doc) \\\n    GTEST_API_ bool GMOCK_FLAG(name) = (default_val)\n# define GMOCK_DEFINE_int32_(name, default_val, doc) \\\n    GTEST_API_ int32_t GMOCK_FLAG(name) = (default_val)\n# define GMOCK_DEFINE_string_(name, default_val, doc) \\\n    GTEST_API_ ::std::string GMOCK_FLAG(name) = (default_val)\n\n#endif  // !defined(GMOCK_DECLARE_bool_)\n\n#endif  // GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_\n\nnamespace testing {\n\ntemplate <typename>\nclass Matcher;\n\nnamespace internal {\n\n// Silence MSVC C4100 (unreferenced formal parameter) and\n// C4805('==': unsafe mix of type 'const int' and type 'const bool')\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable:4100)\n# pragma warning(disable:4805)\n#endif\n\n// Joins a vector of strings as if they are fields of a tuple; returns\n// the joined string.\nGTEST_API_ std::string JoinAsTuple(const Strings& fields);\n\n// Converts an identifier name to a space-separated list of lower-case\n// words.  Each maximum substring of the form [A-Za-z][a-z]*|\\d+ is\n// treated as one word.  For example, both \"FooBar123\" and\n// \"foo_bar_123\" are converted to \"foo bar 123\".\nGTEST_API_ std::string ConvertIdentifierNameToWords(const char* id_name);\n\n// GetRawPointer(p) returns the raw pointer underlying p when p is a\n// smart pointer, or returns p itself when p is already a raw pointer.\n// The following default implementation is for the smart pointer case.\ntemplate <typename Pointer>\ninline const typename Pointer::element_type* GetRawPointer(const Pointer& p) {\n  return p.get();\n}\n// This overloaded version is for the raw pointer case.\ntemplate <typename Element>\ninline Element* GetRawPointer(Element* p) { return p; }\n\n// MSVC treats wchar_t as a native type usually, but treats it as the\n// same as unsigned short when the compiler option /Zc:wchar_t- is\n// specified.  It defines _NATIVE_WCHAR_T_DEFINED symbol when wchar_t\n// is a native type.\n#if defined(_MSC_VER) && !defined(_NATIVE_WCHAR_T_DEFINED)\n// wchar_t is a typedef.\n#else\n# define GMOCK_WCHAR_T_IS_NATIVE_ 1\n#endif\n\n// In what follows, we use the term \"kind\" to indicate whether a type\n// is bool, an integer type (excluding bool), a floating-point type,\n// or none of them.  This categorization is useful for determining\n// when a matcher argument type can be safely converted to another\n// type in the implementation of SafeMatcherCast.\nenum TypeKind {\n  kBool, kInteger, kFloatingPoint, kOther\n};\n\n// KindOf<T>::value is the kind of type T.\ntemplate <typename T> struct KindOf {\n  enum { value = kOther };  // The default kind.\n};\n\n// This macro declares that the kind of 'type' is 'kind'.\n#define GMOCK_DECLARE_KIND_(type, kind) \\\n  template <> struct KindOf<type> { enum { value = kind }; }\n\nGMOCK_DECLARE_KIND_(bool, kBool);\n\n// All standard integer types.\nGMOCK_DECLARE_KIND_(char, kInteger);\nGMOCK_DECLARE_KIND_(signed char, kInteger);\nGMOCK_DECLARE_KIND_(unsigned char, kInteger);\nGMOCK_DECLARE_KIND_(short, kInteger);  // NOLINT\nGMOCK_DECLARE_KIND_(unsigned short, kInteger);  // NOLINT\nGMOCK_DECLARE_KIND_(int, kInteger);\nGMOCK_DECLARE_KIND_(unsigned int, kInteger);\nGMOCK_DECLARE_KIND_(long, kInteger);  // NOLINT\nGMOCK_DECLARE_KIND_(unsigned long, kInteger);  // NOLINT\nGMOCK_DECLARE_KIND_(long long, kInteger);  // NOLINT\nGMOCK_DECLARE_KIND_(unsigned long long, kInteger);  // NOLINT\n\n#if GMOCK_WCHAR_T_IS_NATIVE_\nGMOCK_DECLARE_KIND_(wchar_t, kInteger);\n#endif\n\n// All standard floating-point types.\nGMOCK_DECLARE_KIND_(float, kFloatingPoint);\nGMOCK_DECLARE_KIND_(double, kFloatingPoint);\nGMOCK_DECLARE_KIND_(long double, kFloatingPoint);\n\n#undef GMOCK_DECLARE_KIND_\n\n// Evaluates to the kind of 'type'.\n#define GMOCK_KIND_OF_(type) \\\n  static_cast< ::testing::internal::TypeKind>( \\\n      ::testing::internal::KindOf<type>::value)\n\n// LosslessArithmeticConvertibleImpl<kFromKind, From, kToKind, To>::value\n// is true if and only if arithmetic type From can be losslessly converted to\n// arithmetic type To.\n//\n// It's the user's responsibility to ensure that both From and To are\n// raw (i.e. has no CV modifier, is not a pointer, and is not a\n// reference) built-in arithmetic types, kFromKind is the kind of\n// From, and kToKind is the kind of To; the value is\n// implementation-defined when the above pre-condition is violated.\ntemplate <TypeKind kFromKind, typename From, TypeKind kToKind, typename To>\nusing LosslessArithmeticConvertibleImpl = std::integral_constant<\n    bool,\n    // clang-format off\n      // Converting from bool is always lossless\n      (kFromKind == kBool) ? true\n      // Converting between any other type kinds will be lossy if the type\n      // kinds are not the same.\n    : (kFromKind != kToKind) ? false\n    : (kFromKind == kInteger &&\n       // Converting between integers of different widths is allowed so long\n       // as the conversion does not go from signed to unsigned.\n      (((sizeof(From) < sizeof(To)) &&\n        !(std::is_signed<From>::value && !std::is_signed<To>::value)) ||\n       // Converting between integers of the same width only requires the\n       // two types to have the same signedness.\n       ((sizeof(From) == sizeof(To)) &&\n        (std::is_signed<From>::value == std::is_signed<To>::value)))\n       ) ? true\n      // Floating point conversions are lossless if and only if `To` is at least\n      // as wide as `From`.\n    : (kFromKind == kFloatingPoint && (sizeof(From) <= sizeof(To))) ? true\n    : false\n    // clang-format on\n    >;\n\n// LosslessArithmeticConvertible<From, To>::value is true if and only if\n// arithmetic type From can be losslessly converted to arithmetic type To.\n//\n// It's the user's responsibility to ensure that both From and To are\n// raw (i.e. has no CV modifier, is not a pointer, and is not a\n// reference) built-in arithmetic types; the value is\n// implementation-defined when the above pre-condition is violated.\ntemplate <typename From, typename To>\nusing LosslessArithmeticConvertible =\n    LosslessArithmeticConvertibleImpl<GMOCK_KIND_OF_(From), From,\n                                      GMOCK_KIND_OF_(To), To>;\n\n// This interface knows how to report a Google Mock failure (either\n// non-fatal or fatal).\nclass FailureReporterInterface {\n public:\n  // The type of a failure (either non-fatal or fatal).\n  enum FailureType {\n    kNonfatal, kFatal\n  };\n\n  virtual ~FailureReporterInterface() {}\n\n  // Reports a failure that occurred at the given source file location.\n  virtual void ReportFailure(FailureType type, const char* file, int line,\n                             const std::string& message) = 0;\n};\n\n// Returns the failure reporter used by Google Mock.\nGTEST_API_ FailureReporterInterface* GetFailureReporter();\n\n// Asserts that condition is true; aborts the process with the given\n// message if condition is false.  We cannot use LOG(FATAL) or CHECK()\n// as Google Mock might be used to mock the log sink itself.  We\n// inline this function to prevent it from showing up in the stack\n// trace.\ninline void Assert(bool condition, const char* file, int line,\n                   const std::string& msg) {\n  if (!condition) {\n    GetFailureReporter()->ReportFailure(FailureReporterInterface::kFatal,\n                                        file, line, msg);\n  }\n}\ninline void Assert(bool condition, const char* file, int line) {\n  Assert(condition, file, line, \"Assertion failed.\");\n}\n\n// Verifies that condition is true; generates a non-fatal failure if\n// condition is false.\ninline void Expect(bool condition, const char* file, int line,\n                   const std::string& msg) {\n  if (!condition) {\n    GetFailureReporter()->ReportFailure(FailureReporterInterface::kNonfatal,\n                                        file, line, msg);\n  }\n}\ninline void Expect(bool condition, const char* file, int line) {\n  Expect(condition, file, line, \"Expectation failed.\");\n}\n\n// Severity level of a log.\nenum LogSeverity {\n  kInfo = 0,\n  kWarning = 1\n};\n\n// Valid values for the --gmock_verbose flag.\n\n// All logs (informational and warnings) are printed.\nconst char kInfoVerbosity[] = \"info\";\n// Only warnings are printed.\nconst char kWarningVerbosity[] = \"warning\";\n// No logs are printed.\nconst char kErrorVerbosity[] = \"error\";\n\n// Returns true if and only if a log with the given severity is visible\n// according to the --gmock_verbose flag.\nGTEST_API_ bool LogIsVisible(LogSeverity severity);\n\n// Prints the given message to stdout if and only if 'severity' >= the level\n// specified by the --gmock_verbose flag.  If stack_frames_to_skip >=\n// 0, also prints the stack trace excluding the top\n// stack_frames_to_skip frames.  In opt mode, any positive\n// stack_frames_to_skip is treated as 0, since we don't know which\n// function calls will be inlined by the compiler and need to be\n// conservative.\nGTEST_API_ void Log(LogSeverity severity, const std::string& message,\n                    int stack_frames_to_skip);\n\n// A marker class that is used to resolve parameterless expectations to the\n// correct overload. This must not be instantiable, to prevent client code from\n// accidentally resolving to the overload; for example:\n//\n//    ON_CALL(mock, Method({}, nullptr))...\n//\nclass WithoutMatchers {\n private:\n  WithoutMatchers() {}\n  friend GTEST_API_ WithoutMatchers GetWithoutMatchers();\n};\n\n// Internal use only: access the singleton instance of WithoutMatchers.\nGTEST_API_ WithoutMatchers GetWithoutMatchers();\n\n// Disable MSVC warnings for infinite recursion, since in this case the\n// the recursion is unreachable.\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable:4717)\n#endif\n\n// Invalid<T>() is usable as an expression of type T, but will terminate\n// the program with an assertion failure if actually run.  This is useful\n// when a value of type T is needed for compilation, but the statement\n// will not really be executed (or we don't care if the statement\n// crashes).\ntemplate <typename T>\ninline T Invalid() {\n  Assert(false, \"\", -1, \"Internal error: attempt to return invalid value\");\n  // This statement is unreachable, and would never terminate even if it\n  // could be reached. It is provided only to placate compiler warnings\n  // about missing return statements.\n  return Invalid<T>();\n}\n\n#ifdef _MSC_VER\n# pragma warning(pop)\n#endif\n\n// Given a raw type (i.e. having no top-level reference or const\n// modifier) RawContainer that's either an STL-style container or a\n// native array, class StlContainerView<RawContainer> has the\n// following members:\n//\n//   - type is a type that provides an STL-style container view to\n//     (i.e. implements the STL container concept for) RawContainer;\n//   - const_reference is a type that provides a reference to a const\n//     RawContainer;\n//   - ConstReference(raw_container) returns a const reference to an STL-style\n//     container view to raw_container, which is a RawContainer.\n//   - Copy(raw_container) returns an STL-style container view of a\n//     copy of raw_container, which is a RawContainer.\n//\n// This generic version is used when RawContainer itself is already an\n// STL-style container.\ntemplate <class RawContainer>\nclass StlContainerView {\n public:\n  typedef RawContainer type;\n  typedef const type& const_reference;\n\n  static const_reference ConstReference(const RawContainer& container) {\n    static_assert(!std::is_const<RawContainer>::value,\n                  \"RawContainer type must not be const\");\n    return container;\n  }\n  static type Copy(const RawContainer& container) { return container; }\n};\n\n// This specialization is used when RawContainer is a native array type.\ntemplate <typename Element, size_t N>\nclass StlContainerView<Element[N]> {\n public:\n  typedef typename std::remove_const<Element>::type RawElement;\n  typedef internal::NativeArray<RawElement> type;\n  // NativeArray<T> can represent a native array either by value or by\n  // reference (selected by a constructor argument), so 'const type'\n  // can be used to reference a const native array.  We cannot\n  // 'typedef const type& const_reference' here, as that would mean\n  // ConstReference() has to return a reference to a local variable.\n  typedef const type const_reference;\n\n  static const_reference ConstReference(const Element (&array)[N]) {\n    static_assert(std::is_same<Element, RawElement>::value,\n                  \"Element type must not be const\");\n    return type(array, N, RelationToSourceReference());\n  }\n  static type Copy(const Element (&array)[N]) {\n    return type(array, N, RelationToSourceCopy());\n  }\n};\n\n// This specialization is used when RawContainer is a native array\n// represented as a (pointer, size) tuple.\ntemplate <typename ElementPointer, typename Size>\nclass StlContainerView< ::std::tuple<ElementPointer, Size> > {\n public:\n  typedef typename std::remove_const<\n      typename std::pointer_traits<ElementPointer>::element_type>::type\n      RawElement;\n  typedef internal::NativeArray<RawElement> type;\n  typedef const type const_reference;\n\n  static const_reference ConstReference(\n      const ::std::tuple<ElementPointer, Size>& array) {\n    return type(std::get<0>(array), std::get<1>(array),\n                RelationToSourceReference());\n  }\n  static type Copy(const ::std::tuple<ElementPointer, Size>& array) {\n    return type(std::get<0>(array), std::get<1>(array), RelationToSourceCopy());\n  }\n};\n\n// The following specialization prevents the user from instantiating\n// StlContainer with a reference type.\ntemplate <typename T> class StlContainerView<T&>;\n\n// A type transform to remove constness from the first part of a pair.\n// Pairs like that are used as the value_type of associative containers,\n// and this transform produces a similar but assignable pair.\ntemplate <typename T>\nstruct RemoveConstFromKey {\n  typedef T type;\n};\n\n// Partially specialized to remove constness from std::pair<const K, V>.\ntemplate <typename K, typename V>\nstruct RemoveConstFromKey<std::pair<const K, V> > {\n  typedef std::pair<K, V> type;\n};\n\n// Emit an assertion failure due to incorrect DoDefault() usage. Out-of-lined to\n// reduce code size.\nGTEST_API_ void IllegalDoDefault(const char* file, int line);\n\ntemplate <typename F, typename Tuple, size_t... Idx>\nauto ApplyImpl(F&& f, Tuple&& args, IndexSequence<Idx...>) -> decltype(\n    std::forward<F>(f)(std::get<Idx>(std::forward<Tuple>(args))...)) {\n  return std::forward<F>(f)(std::get<Idx>(std::forward<Tuple>(args))...);\n}\n\n// Apply the function to a tuple of arguments.\ntemplate <typename F, typename Tuple>\nauto Apply(F&& f, Tuple&& args) -> decltype(\n    ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args),\n              MakeIndexSequence<std::tuple_size<\n                  typename std::remove_reference<Tuple>::type>::value>())) {\n  return ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args),\n                   MakeIndexSequence<std::tuple_size<\n                       typename std::remove_reference<Tuple>::type>::value>());\n}\n\n// Template struct Function<F>, where F must be a function type, contains\n// the following typedefs:\n//\n//   Result:               the function's return type.\n//   Arg<N>:               the type of the N-th argument, where N starts with 0.\n//   ArgumentTuple:        the tuple type consisting of all parameters of F.\n//   ArgumentMatcherTuple: the tuple type consisting of Matchers for all\n//                         parameters of F.\n//   MakeResultVoid:       the function type obtained by substituting void\n//                         for the return type of F.\n//   MakeResultIgnoredValue:\n//                         the function type obtained by substituting Something\n//                         for the return type of F.\ntemplate <typename T>\nstruct Function;\n\ntemplate <typename R, typename... Args>\nstruct Function<R(Args...)> {\n  using Result = R;\n  static constexpr size_t ArgumentCount = sizeof...(Args);\n  template <size_t I>\n  using Arg = ElemFromList<I, Args...>;\n  using ArgumentTuple = std::tuple<Args...>;\n  using ArgumentMatcherTuple = std::tuple<Matcher<Args>...>;\n  using MakeResultVoid = void(Args...);\n  using MakeResultIgnoredValue = IgnoredValue(Args...);\n};\n\ntemplate <typename R, typename... Args>\nconstexpr size_t Function<R(Args...)>::ArgumentCount;\n\n#ifdef _MSC_VER\n# pragma warning(pop)\n#endif\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_\n#ifndef GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PP_H_\n#define GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PP_H_\n\n// Expands and concatenates the arguments. Constructed macros reevaluate.\n#define GMOCK_PP_CAT(_1, _2) GMOCK_PP_INTERNAL_CAT(_1, _2)\n\n// Expands and stringifies the only argument.\n#define GMOCK_PP_STRINGIZE(...) GMOCK_PP_INTERNAL_STRINGIZE(__VA_ARGS__)\n\n// Returns empty. Given a variadic number of arguments.\n#define GMOCK_PP_EMPTY(...)\n\n// Returns a comma. Given a variadic number of arguments.\n#define GMOCK_PP_COMMA(...) ,\n\n// Returns the only argument.\n#define GMOCK_PP_IDENTITY(_1) _1\n\n// Evaluates to the number of arguments after expansion.\n//\n//   #define PAIR x, y\n//\n//   GMOCK_PP_NARG() => 1\n//   GMOCK_PP_NARG(x) => 1\n//   GMOCK_PP_NARG(x, y) => 2\n//   GMOCK_PP_NARG(PAIR) => 2\n//\n// Requires: the number of arguments after expansion is at most 15.\n#define GMOCK_PP_NARG(...) \\\n  GMOCK_PP_INTERNAL_16TH(  \\\n      (__VA_ARGS__, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0))\n\n// Returns 1 if the expansion of arguments has an unprotected comma. Otherwise\n// returns 0. Requires no more than 15 unprotected commas.\n#define GMOCK_PP_HAS_COMMA(...) \\\n  GMOCK_PP_INTERNAL_16TH(       \\\n      (__VA_ARGS__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0))\n\n// Returns the first argument.\n#define GMOCK_PP_HEAD(...) GMOCK_PP_INTERNAL_HEAD((__VA_ARGS__, unusedArg))\n\n// Returns the tail. A variadic list of all arguments minus the first. Requires\n// at least one argument.\n#define GMOCK_PP_TAIL(...) GMOCK_PP_INTERNAL_TAIL((__VA_ARGS__))\n\n// Calls CAT(_Macro, NARG(__VA_ARGS__))(__VA_ARGS__)\n#define GMOCK_PP_VARIADIC_CALL(_Macro, ...) \\\n  GMOCK_PP_IDENTITY(                        \\\n      GMOCK_PP_CAT(_Macro, GMOCK_PP_NARG(__VA_ARGS__))(__VA_ARGS__))\n\n// If the arguments after expansion have no tokens, evaluates to `1`. Otherwise\n// evaluates to `0`.\n//\n// Requires: * the number of arguments after expansion is at most 15.\n//           * If the argument is a macro, it must be able to be called with one\n//             argument.\n//\n// Implementation details:\n//\n// There is one case when it generates a compile error: if the argument is macro\n// that cannot be called with one argument.\n//\n//   #define M(a, b)  // it doesn't matter what it expands to\n//\n//   // Expected: expands to `0`.\n//   // Actual: compile error.\n//   GMOCK_PP_IS_EMPTY(M)\n//\n// There are 4 cases tested:\n//\n// * __VA_ARGS__ possible expansion has no unparen'd commas. Expected 0.\n// * __VA_ARGS__ possible expansion is not enclosed in parenthesis. Expected 0.\n// * __VA_ARGS__ possible expansion is not a macro that ()-evaluates to a comma.\n//   Expected 0\n// * __VA_ARGS__ is empty, or has unparen'd commas, or is enclosed in\n//   parenthesis, or is a macro that ()-evaluates to comma. Expected 1.\n//\n// We trigger detection on '0001', i.e. on empty.\n#define GMOCK_PP_IS_EMPTY(...)                                               \\\n  GMOCK_PP_INTERNAL_IS_EMPTY(GMOCK_PP_HAS_COMMA(__VA_ARGS__),                \\\n                             GMOCK_PP_HAS_COMMA(GMOCK_PP_COMMA __VA_ARGS__), \\\n                             GMOCK_PP_HAS_COMMA(__VA_ARGS__()),              \\\n                             GMOCK_PP_HAS_COMMA(GMOCK_PP_COMMA __VA_ARGS__()))\n\n// Evaluates to _Then if _Cond is 1 and _Else if _Cond is 0.\n#define GMOCK_PP_IF(_Cond, _Then, _Else) \\\n  GMOCK_PP_CAT(GMOCK_PP_INTERNAL_IF_, _Cond)(_Then, _Else)\n\n// Similar to GMOCK_PP_IF but takes _Then and _Else in parentheses.\n//\n// GMOCK_PP_GENERIC_IF(1, (a, b, c), (d, e, f)) => a, b, c\n// GMOCK_PP_GENERIC_IF(0, (a, b, c), (d, e, f)) => d, e, f\n//\n#define GMOCK_PP_GENERIC_IF(_Cond, _Then, _Else) \\\n  GMOCK_PP_REMOVE_PARENS(GMOCK_PP_IF(_Cond, _Then, _Else))\n\n// Evaluates to the number of arguments after expansion. Identifies 'empty' as\n// 0.\n//\n//   #define PAIR x, y\n//\n//   GMOCK_PP_NARG0() => 0\n//   GMOCK_PP_NARG0(x) => 1\n//   GMOCK_PP_NARG0(x, y) => 2\n//   GMOCK_PP_NARG0(PAIR) => 2\n//\n// Requires: * the number of arguments after expansion is at most 15.\n//           * If the argument is a macro, it must be able to be called with one\n//             argument.\n#define GMOCK_PP_NARG0(...) \\\n  GMOCK_PP_IF(GMOCK_PP_IS_EMPTY(__VA_ARGS__), 0, GMOCK_PP_NARG(__VA_ARGS__))\n\n// Expands to 1 if the first argument starts with something in parentheses,\n// otherwise to 0.\n#define GMOCK_PP_IS_BEGIN_PARENS(...)                              \\\n  GMOCK_PP_HEAD(GMOCK_PP_CAT(GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_R_, \\\n                             GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_C __VA_ARGS__))\n\n// Expands to 1 is there is only one argument and it is enclosed in parentheses.\n#define GMOCK_PP_IS_ENCLOSED_PARENS(...)             \\\n  GMOCK_PP_IF(GMOCK_PP_IS_BEGIN_PARENS(__VA_ARGS__), \\\n              GMOCK_PP_IS_EMPTY(GMOCK_PP_EMPTY __VA_ARGS__), 0)\n\n// Remove the parens, requires GMOCK_PP_IS_ENCLOSED_PARENS(args) => 1.\n#define GMOCK_PP_REMOVE_PARENS(...) GMOCK_PP_INTERNAL_REMOVE_PARENS __VA_ARGS__\n\n// Expands to _Macro(0, _Data, e1) _Macro(1, _Data, e2) ... _Macro(K -1, _Data,\n// eK) as many of GMOCK_INTERNAL_NARG0 _Tuple.\n// Requires: * |_Macro| can be called with 3 arguments.\n//           * |_Tuple| expansion has no more than 15 elements.\n#define GMOCK_PP_FOR_EACH(_Macro, _Data, _Tuple)                        \\\n  GMOCK_PP_CAT(GMOCK_PP_INTERNAL_FOR_EACH_IMPL_, GMOCK_PP_NARG0 _Tuple) \\\n  (0, _Macro, _Data, _Tuple)\n\n// Expands to _Macro(0, _Data, ) _Macro(1, _Data, ) ... _Macro(K - 1, _Data, )\n// Empty if _K = 0.\n// Requires: * |_Macro| can be called with 3 arguments.\n//           * |_K| literal between 0 and 15\n#define GMOCK_PP_REPEAT(_Macro, _Data, _N)           \\\n  GMOCK_PP_CAT(GMOCK_PP_INTERNAL_FOR_EACH_IMPL_, _N) \\\n  (0, _Macro, _Data, GMOCK_PP_INTENRAL_EMPTY_TUPLE)\n\n// Increments the argument, requires the argument to be between 0 and 15.\n#define GMOCK_PP_INC(_i) GMOCK_PP_CAT(GMOCK_PP_INTERNAL_INC_, _i)\n\n// Returns comma if _i != 0. Requires _i to be between 0 and 15.\n#define GMOCK_PP_COMMA_IF(_i) GMOCK_PP_CAT(GMOCK_PP_INTERNAL_COMMA_IF_, _i)\n\n// Internal details follow. Do not use any of these symbols outside of this\n// file or we will break your code.\n#define GMOCK_PP_INTENRAL_EMPTY_TUPLE (, , , , , , , , , , , , , , , )\n#define GMOCK_PP_INTERNAL_CAT(_1, _2) _1##_2\n#define GMOCK_PP_INTERNAL_STRINGIZE(...) #__VA_ARGS__\n#define GMOCK_PP_INTERNAL_CAT_5(_1, _2, _3, _4, _5) _1##_2##_3##_4##_5\n#define GMOCK_PP_INTERNAL_IS_EMPTY(_1, _2, _3, _4)                             \\\n  GMOCK_PP_HAS_COMMA(GMOCK_PP_INTERNAL_CAT_5(GMOCK_PP_INTERNAL_IS_EMPTY_CASE_, \\\n                                             _1, _2, _3, _4))\n#define GMOCK_PP_INTERNAL_IS_EMPTY_CASE_0001 ,\n#define GMOCK_PP_INTERNAL_IF_1(_Then, _Else) _Then\n#define GMOCK_PP_INTERNAL_IF_0(_Then, _Else) _Else\n\n// Because of MSVC treating a token with a comma in it as a single token when\n// passed to another macro, we need to force it to evaluate it as multiple\n// tokens. We do that by using a \"IDENTITY(MACRO PARENTHESIZED_ARGS)\" macro. We\n// define one per possible macro that relies on this behavior. Note \"_Args\" must\n// be parenthesized.\n#define GMOCK_PP_INTERNAL_INTERNAL_16TH(_1, _2, _3, _4, _5, _6, _7, _8, _9, \\\n                                        _10, _11, _12, _13, _14, _15, _16,  \\\n                                        ...)                                \\\n  _16\n#define GMOCK_PP_INTERNAL_16TH(_Args) \\\n  GMOCK_PP_IDENTITY(GMOCK_PP_INTERNAL_INTERNAL_16TH _Args)\n#define GMOCK_PP_INTERNAL_INTERNAL_HEAD(_1, ...) _1\n#define GMOCK_PP_INTERNAL_HEAD(_Args) \\\n  GMOCK_PP_IDENTITY(GMOCK_PP_INTERNAL_INTERNAL_HEAD _Args)\n#define GMOCK_PP_INTERNAL_INTERNAL_TAIL(_1, ...) __VA_ARGS__\n#define GMOCK_PP_INTERNAL_TAIL(_Args) \\\n  GMOCK_PP_IDENTITY(GMOCK_PP_INTERNAL_INTERNAL_TAIL _Args)\n\n#define GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_C(...) 1 _\n#define GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_R_1 1,\n#define GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_R_GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_C \\\n  0,\n#define GMOCK_PP_INTERNAL_REMOVE_PARENS(...) __VA_ARGS__\n#define GMOCK_PP_INTERNAL_INC_0 1\n#define GMOCK_PP_INTERNAL_INC_1 2\n#define GMOCK_PP_INTERNAL_INC_2 3\n#define GMOCK_PP_INTERNAL_INC_3 4\n#define GMOCK_PP_INTERNAL_INC_4 5\n#define GMOCK_PP_INTERNAL_INC_5 6\n#define GMOCK_PP_INTERNAL_INC_6 7\n#define GMOCK_PP_INTERNAL_INC_7 8\n#define GMOCK_PP_INTERNAL_INC_8 9\n#define GMOCK_PP_INTERNAL_INC_9 10\n#define GMOCK_PP_INTERNAL_INC_10 11\n#define GMOCK_PP_INTERNAL_INC_11 12\n#define GMOCK_PP_INTERNAL_INC_12 13\n#define GMOCK_PP_INTERNAL_INC_13 14\n#define GMOCK_PP_INTERNAL_INC_14 15\n#define GMOCK_PP_INTERNAL_INC_15 16\n#define GMOCK_PP_INTERNAL_COMMA_IF_0\n#define GMOCK_PP_INTERNAL_COMMA_IF_1 ,\n#define GMOCK_PP_INTERNAL_COMMA_IF_2 ,\n#define GMOCK_PP_INTERNAL_COMMA_IF_3 ,\n#define GMOCK_PP_INTERNAL_COMMA_IF_4 ,\n#define GMOCK_PP_INTERNAL_COMMA_IF_5 ,\n#define GMOCK_PP_INTERNAL_COMMA_IF_6 ,\n#define GMOCK_PP_INTERNAL_COMMA_IF_7 ,\n#define GMOCK_PP_INTERNAL_COMMA_IF_8 ,\n#define GMOCK_PP_INTERNAL_COMMA_IF_9 ,\n#define GMOCK_PP_INTERNAL_COMMA_IF_10 ,\n#define GMOCK_PP_INTERNAL_COMMA_IF_11 ,\n#define GMOCK_PP_INTERNAL_COMMA_IF_12 ,\n#define GMOCK_PP_INTERNAL_COMMA_IF_13 ,\n#define GMOCK_PP_INTERNAL_COMMA_IF_14 ,\n#define GMOCK_PP_INTERNAL_COMMA_IF_15 ,\n#define GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, _element) \\\n  _Macro(_i, _Data, _element)\n#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_0(_i, _Macro, _Data, _Tuple)\n#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_1(_i, _Macro, _Data, _Tuple) \\\n  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple)\n#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_2(_i, _Macro, _Data, _Tuple)    \\\n  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \\\n  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_1(GMOCK_PP_INC(_i), _Macro, _Data,    \\\n                                    (GMOCK_PP_TAIL _Tuple))\n#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_3(_i, _Macro, _Data, _Tuple)    \\\n  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \\\n  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_2(GMOCK_PP_INC(_i), _Macro, _Data,    \\\n                                    (GMOCK_PP_TAIL _Tuple))\n#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_4(_i, _Macro, _Data, _Tuple)    \\\n  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \\\n  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_3(GMOCK_PP_INC(_i), _Macro, _Data,    \\\n                                    (GMOCK_PP_TAIL _Tuple))\n#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_5(_i, _Macro, _Data, _Tuple)    \\\n  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \\\n  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_4(GMOCK_PP_INC(_i), _Macro, _Data,    \\\n                                    (GMOCK_PP_TAIL _Tuple))\n#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_6(_i, _Macro, _Data, _Tuple)    \\\n  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \\\n  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_5(GMOCK_PP_INC(_i), _Macro, _Data,    \\\n                                    (GMOCK_PP_TAIL _Tuple))\n#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_7(_i, _Macro, _Data, _Tuple)    \\\n  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \\\n  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_6(GMOCK_PP_INC(_i), _Macro, _Data,    \\\n                                    (GMOCK_PP_TAIL _Tuple))\n#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_8(_i, _Macro, _Data, _Tuple)    \\\n  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \\\n  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_7(GMOCK_PP_INC(_i), _Macro, _Data,    \\\n                                    (GMOCK_PP_TAIL _Tuple))\n#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_9(_i, _Macro, _Data, _Tuple)    \\\n  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \\\n  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_8(GMOCK_PP_INC(_i), _Macro, _Data,    \\\n                                    (GMOCK_PP_TAIL _Tuple))\n#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_10(_i, _Macro, _Data, _Tuple)   \\\n  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \\\n  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_9(GMOCK_PP_INC(_i), _Macro, _Data,    \\\n                                    (GMOCK_PP_TAIL _Tuple))\n#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_11(_i, _Macro, _Data, _Tuple)   \\\n  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \\\n  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_10(GMOCK_PP_INC(_i), _Macro, _Data,   \\\n                                     (GMOCK_PP_TAIL _Tuple))\n#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_12(_i, _Macro, _Data, _Tuple)   \\\n  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \\\n  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_11(GMOCK_PP_INC(_i), _Macro, _Data,   \\\n                                     (GMOCK_PP_TAIL _Tuple))\n#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_13(_i, _Macro, _Data, _Tuple)   \\\n  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \\\n  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_12(GMOCK_PP_INC(_i), _Macro, _Data,   \\\n                                     (GMOCK_PP_TAIL _Tuple))\n#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_14(_i, _Macro, _Data, _Tuple)   \\\n  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \\\n  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_13(GMOCK_PP_INC(_i), _Macro, _Data,   \\\n                                     (GMOCK_PP_TAIL _Tuple))\n#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_15(_i, _Macro, _Data, _Tuple)   \\\n  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \\\n  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_14(GMOCK_PP_INC(_i), _Macro, _Data,   \\\n                                     (GMOCK_PP_TAIL _Tuple))\n\n#endif  // GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PP_H_\n\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable:4100)\n#endif\n\nnamespace testing {\n\n// To implement an action Foo, define:\n//   1. a class FooAction that implements the ActionInterface interface, and\n//   2. a factory function that creates an Action object from a\n//      const FooAction*.\n//\n// The two-level delegation design follows that of Matcher, providing\n// consistency for extension developers.  It also eases ownership\n// management as Action objects can now be copied like plain values.\n\nnamespace internal {\n\n// BuiltInDefaultValueGetter<T, true>::Get() returns a\n// default-constructed T value.  BuiltInDefaultValueGetter<T,\n// false>::Get() crashes with an error.\n//\n// This primary template is used when kDefaultConstructible is true.\ntemplate <typename T, bool kDefaultConstructible>\nstruct BuiltInDefaultValueGetter {\n  static T Get() { return T(); }\n};\ntemplate <typename T>\nstruct BuiltInDefaultValueGetter<T, false> {\n  static T Get() {\n    Assert(false, __FILE__, __LINE__,\n           \"Default action undefined for the function return type.\");\n    return internal::Invalid<T>();\n    // The above statement will never be reached, but is required in\n    // order for this function to compile.\n  }\n};\n\n// BuiltInDefaultValue<T>::Get() returns the \"built-in\" default value\n// for type T, which is NULL when T is a raw pointer type, 0 when T is\n// a numeric type, false when T is bool, or \"\" when T is string or\n// std::string.  In addition, in C++11 and above, it turns a\n// default-constructed T value if T is default constructible.  For any\n// other type T, the built-in default T value is undefined, and the\n// function will abort the process.\ntemplate <typename T>\nclass BuiltInDefaultValue {\n public:\n  // This function returns true if and only if type T has a built-in default\n  // value.\n  static bool Exists() {\n    return ::std::is_default_constructible<T>::value;\n  }\n\n  static T Get() {\n    return BuiltInDefaultValueGetter<\n        T, ::std::is_default_constructible<T>::value>::Get();\n  }\n};\n\n// This partial specialization says that we use the same built-in\n// default value for T and const T.\ntemplate <typename T>\nclass BuiltInDefaultValue<const T> {\n public:\n  static bool Exists() { return BuiltInDefaultValue<T>::Exists(); }\n  static T Get() { return BuiltInDefaultValue<T>::Get(); }\n};\n\n// This partial specialization defines the default values for pointer\n// types.\ntemplate <typename T>\nclass BuiltInDefaultValue<T*> {\n public:\n  static bool Exists() { return true; }\n  static T* Get() { return nullptr; }\n};\n\n// The following specializations define the default values for\n// specific types we care about.\n#define GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(type, value) \\\n  template <> \\\n  class BuiltInDefaultValue<type> { \\\n   public: \\\n    static bool Exists() { return true; } \\\n    static type Get() { return value; } \\\n  }\n\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(void, );  // NOLINT\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::std::string, \"\");\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(bool, false);\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned char, '\\0');\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed char, '\\0');\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(char, '\\0');\n\n// There's no need for a default action for signed wchar_t, as that\n// type is the same as wchar_t for gcc, and invalid for MSVC.\n//\n// There's also no need for a default action for unsigned wchar_t, as\n// that type is the same as unsigned int for gcc, and invalid for\n// MSVC.\n#if GMOCK_WCHAR_T_IS_NATIVE_\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(wchar_t, 0U);  // NOLINT\n#endif\n\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned short, 0U);  // NOLINT\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed short, 0);     // NOLINT\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned int, 0U);\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed int, 0);\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned long, 0UL);  // NOLINT\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed long, 0L);     // NOLINT\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned long long, 0);  // NOLINT\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed long long, 0);  // NOLINT\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(float, 0);\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(double, 0);\n\n#undef GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_\n\n// Simple two-arg form of std::disjunction.\ntemplate <typename P, typename Q>\nusing disjunction = typename ::std::conditional<P::value, P, Q>::type;\n\n}  // namespace internal\n\n// When an unexpected function call is encountered, Google Mock will\n// let it return a default value if the user has specified one for its\n// return type, or if the return type has a built-in default value;\n// otherwise Google Mock won't know what value to return and will have\n// to abort the process.\n//\n// The DefaultValue<T> class allows a user to specify the\n// default value for a type T that is both copyable and publicly\n// destructible (i.e. anything that can be used as a function return\n// type).  The usage is:\n//\n//   // Sets the default value for type T to be foo.\n//   DefaultValue<T>::Set(foo);\ntemplate <typename T>\nclass DefaultValue {\n public:\n  // Sets the default value for type T; requires T to be\n  // copy-constructable and have a public destructor.\n  static void Set(T x) {\n    delete producer_;\n    producer_ = new FixedValueProducer(x);\n  }\n\n  // Provides a factory function to be called to generate the default value.\n  // This method can be used even if T is only move-constructible, but it is not\n  // limited to that case.\n  typedef T (*FactoryFunction)();\n  static void SetFactory(FactoryFunction factory) {\n    delete producer_;\n    producer_ = new FactoryValueProducer(factory);\n  }\n\n  // Unsets the default value for type T.\n  static void Clear() {\n    delete producer_;\n    producer_ = nullptr;\n  }\n\n  // Returns true if and only if the user has set the default value for type T.\n  static bool IsSet() { return producer_ != nullptr; }\n\n  // Returns true if T has a default return value set by the user or there\n  // exists a built-in default value.\n  static bool Exists() {\n    return IsSet() || internal::BuiltInDefaultValue<T>::Exists();\n  }\n\n  // Returns the default value for type T if the user has set one;\n  // otherwise returns the built-in default value. Requires that Exists()\n  // is true, which ensures that the return value is well-defined.\n  static T Get() {\n    return producer_ == nullptr ? internal::BuiltInDefaultValue<T>::Get()\n                                : producer_->Produce();\n  }\n\n private:\n  class ValueProducer {\n   public:\n    virtual ~ValueProducer() {}\n    virtual T Produce() = 0;\n  };\n\n  class FixedValueProducer : public ValueProducer {\n   public:\n    explicit FixedValueProducer(T value) : value_(value) {}\n    T Produce() override { return value_; }\n\n   private:\n    const T value_;\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(FixedValueProducer);\n  };\n\n  class FactoryValueProducer : public ValueProducer {\n   public:\n    explicit FactoryValueProducer(FactoryFunction factory)\n        : factory_(factory) {}\n    T Produce() override { return factory_(); }\n\n   private:\n    const FactoryFunction factory_;\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(FactoryValueProducer);\n  };\n\n  static ValueProducer* producer_;\n};\n\n// This partial specialization allows a user to set default values for\n// reference types.\ntemplate <typename T>\nclass DefaultValue<T&> {\n public:\n  // Sets the default value for type T&.\n  static void Set(T& x) {  // NOLINT\n    address_ = &x;\n  }\n\n  // Unsets the default value for type T&.\n  static void Clear() { address_ = nullptr; }\n\n  // Returns true if and only if the user has set the default value for type T&.\n  static bool IsSet() { return address_ != nullptr; }\n\n  // Returns true if T has a default return value set by the user or there\n  // exists a built-in default value.\n  static bool Exists() {\n    return IsSet() || internal::BuiltInDefaultValue<T&>::Exists();\n  }\n\n  // Returns the default value for type T& if the user has set one;\n  // otherwise returns the built-in default value if there is one;\n  // otherwise aborts the process.\n  static T& Get() {\n    return address_ == nullptr ? internal::BuiltInDefaultValue<T&>::Get()\n                               : *address_;\n  }\n\n private:\n  static T* address_;\n};\n\n// This specialization allows DefaultValue<void>::Get() to\n// compile.\ntemplate <>\nclass DefaultValue<void> {\n public:\n  static bool Exists() { return true; }\n  static void Get() {}\n};\n\n// Points to the user-set default value for type T.\ntemplate <typename T>\ntypename DefaultValue<T>::ValueProducer* DefaultValue<T>::producer_ = nullptr;\n\n// Points to the user-set default value for type T&.\ntemplate <typename T>\nT* DefaultValue<T&>::address_ = nullptr;\n\n// Implement this interface to define an action for function type F.\ntemplate <typename F>\nclass ActionInterface {\n public:\n  typedef typename internal::Function<F>::Result Result;\n  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n\n  ActionInterface() {}\n  virtual ~ActionInterface() {}\n\n  // Performs the action.  This method is not const, as in general an\n  // action can have side effects and be stateful.  For example, a\n  // get-the-next-element-from-the-collection action will need to\n  // remember the current element.\n  virtual Result Perform(const ArgumentTuple& args) = 0;\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ActionInterface);\n};\n\n// An Action<F> is a copyable and IMMUTABLE (except by assignment)\n// object that represents an action to be taken when a mock function\n// of type F is called.  The implementation of Action<T> is just a\n// std::shared_ptr to const ActionInterface<T>. Don't inherit from Action!\n// You can view an object implementing ActionInterface<F> as a\n// concrete action (including its current state), and an Action<F>\n// object as a handle to it.\ntemplate <typename F>\nclass Action {\n  // Adapter class to allow constructing Action from a legacy ActionInterface.\n  // New code should create Actions from functors instead.\n  struct ActionAdapter {\n    // Adapter must be copyable to satisfy std::function requirements.\n    ::std::shared_ptr<ActionInterface<F>> impl_;\n\n    template <typename... Args>\n    typename internal::Function<F>::Result operator()(Args&&... args) {\n      return impl_->Perform(\n          ::std::forward_as_tuple(::std::forward<Args>(args)...));\n    }\n  };\n\n  template <typename G>\n  using IsCompatibleFunctor = std::is_constructible<std::function<F>, G>;\n\n public:\n  typedef typename internal::Function<F>::Result Result;\n  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n\n  // Constructs a null Action.  Needed for storing Action objects in\n  // STL containers.\n  Action() {}\n\n  // Construct an Action from a specified callable.\n  // This cannot take std::function directly, because then Action would not be\n  // directly constructible from lambda (it would require two conversions).\n  template <\n      typename G,\n      typename = typename std::enable_if<internal::disjunction<\n          IsCompatibleFunctor<G>, std::is_constructible<std::function<Result()>,\n                                                        G>>::value>::type>\n  Action(G&& fun) {  // NOLINT\n    Init(::std::forward<G>(fun), IsCompatibleFunctor<G>());\n  }\n\n  // Constructs an Action from its implementation.\n  explicit Action(ActionInterface<F>* impl)\n      : fun_(ActionAdapter{::std::shared_ptr<ActionInterface<F>>(impl)}) {}\n\n  // This constructor allows us to turn an Action<Func> object into an\n  // Action<F>, as long as F's arguments can be implicitly converted\n  // to Func's and Func's return type can be implicitly converted to F's.\n  template <typename Func>\n  explicit Action(const Action<Func>& action) : fun_(action.fun_) {}\n\n  // Returns true if and only if this is the DoDefault() action.\n  bool IsDoDefault() const { return fun_ == nullptr; }\n\n  // Performs the action.  Note that this method is const even though\n  // the corresponding method in ActionInterface is not.  The reason\n  // is that a const Action<F> means that it cannot be re-bound to\n  // another concrete action, not that the concrete action it binds to\n  // cannot change state.  (Think of the difference between a const\n  // pointer and a pointer to const.)\n  Result Perform(ArgumentTuple args) const {\n    if (IsDoDefault()) {\n      internal::IllegalDoDefault(__FILE__, __LINE__);\n    }\n    return internal::Apply(fun_, ::std::move(args));\n  }\n\n private:\n  template <typename G>\n  friend class Action;\n\n  template <typename G>\n  void Init(G&& g, ::std::true_type) {\n    fun_ = ::std::forward<G>(g);\n  }\n\n  template <typename G>\n  void Init(G&& g, ::std::false_type) {\n    fun_ = IgnoreArgs<typename ::std::decay<G>::type>{::std::forward<G>(g)};\n  }\n\n  template <typename FunctionImpl>\n  struct IgnoreArgs {\n    template <typename... Args>\n    Result operator()(const Args&...) const {\n      return function_impl();\n    }\n\n    FunctionImpl function_impl;\n  };\n\n  // fun_ is an empty function if and only if this is the DoDefault() action.\n  ::std::function<F> fun_;\n};\n\n// The PolymorphicAction class template makes it easy to implement a\n// polymorphic action (i.e. an action that can be used in mock\n// functions of than one type, e.g. Return()).\n//\n// To define a polymorphic action, a user first provides a COPYABLE\n// implementation class that has a Perform() method template:\n//\n//   class FooAction {\n//    public:\n//     template <typename Result, typename ArgumentTuple>\n//     Result Perform(const ArgumentTuple& args) const {\n//       // Processes the arguments and returns a result, using\n//       // std::get<N>(args) to get the N-th (0-based) argument in the tuple.\n//     }\n//     ...\n//   };\n//\n// Then the user creates the polymorphic action using\n// MakePolymorphicAction(object) where object has type FooAction.  See\n// the definition of Return(void) and SetArgumentPointee<N>(value) for\n// complete examples.\ntemplate <typename Impl>\nclass PolymorphicAction {\n public:\n  explicit PolymorphicAction(const Impl& impl) : impl_(impl) {}\n\n  template <typename F>\n  operator Action<F>() const {\n    return Action<F>(new MonomorphicImpl<F>(impl_));\n  }\n\n private:\n  template <typename F>\n  class MonomorphicImpl : public ActionInterface<F> {\n   public:\n    typedef typename internal::Function<F>::Result Result;\n    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n\n    explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {}\n\n    Result Perform(const ArgumentTuple& args) override {\n      return impl_.template Perform<Result>(args);\n    }\n\n   private:\n    Impl impl_;\n  };\n\n  Impl impl_;\n};\n\n// Creates an Action from its implementation and returns it.  The\n// created Action object owns the implementation.\ntemplate <typename F>\nAction<F> MakeAction(ActionInterface<F>* impl) {\n  return Action<F>(impl);\n}\n\n// Creates a polymorphic action from its implementation.  This is\n// easier to use than the PolymorphicAction<Impl> constructor as it\n// doesn't require you to explicitly write the template argument, e.g.\n//\n//   MakePolymorphicAction(foo);\n// vs\n//   PolymorphicAction<TypeOfFoo>(foo);\ntemplate <typename Impl>\ninline PolymorphicAction<Impl> MakePolymorphicAction(const Impl& impl) {\n  return PolymorphicAction<Impl>(impl);\n}\n\nnamespace internal {\n\n// Helper struct to specialize ReturnAction to execute a move instead of a copy\n// on return. Useful for move-only types, but could be used on any type.\ntemplate <typename T>\nstruct ByMoveWrapper {\n  explicit ByMoveWrapper(T value) : payload(std::move(value)) {}\n  T payload;\n};\n\n// Implements the polymorphic Return(x) action, which can be used in\n// any function that returns the type of x, regardless of the argument\n// types.\n//\n// Note: The value passed into Return must be converted into\n// Function<F>::Result when this action is cast to Action<F> rather than\n// when that action is performed. This is important in scenarios like\n//\n// MOCK_METHOD1(Method, T(U));\n// ...\n// {\n//   Foo foo;\n//   X x(&foo);\n//   EXPECT_CALL(mock, Method(_)).WillOnce(Return(x));\n// }\n//\n// In the example above the variable x holds reference to foo which leaves\n// scope and gets destroyed.  If copying X just copies a reference to foo,\n// that copy will be left with a hanging reference.  If conversion to T\n// makes a copy of foo, the above code is safe. To support that scenario, we\n// need to make sure that the type conversion happens inside the EXPECT_CALL\n// statement, and conversion of the result of Return to Action<T(U)> is a\n// good place for that.\n//\n// The real life example of the above scenario happens when an invocation\n// of gtl::Container() is passed into Return.\n//\ntemplate <typename R>\nclass ReturnAction {\n public:\n  // Constructs a ReturnAction object from the value to be returned.\n  // 'value' is passed by value instead of by const reference in order\n  // to allow Return(\"string literal\") to compile.\n  explicit ReturnAction(R value) : value_(new R(std::move(value))) {}\n\n  // This template type conversion operator allows Return(x) to be\n  // used in ANY function that returns x's type.\n  template <typename F>\n  operator Action<F>() const {  // NOLINT\n    // Assert statement belongs here because this is the best place to verify\n    // conditions on F. It produces the clearest error messages\n    // in most compilers.\n    // Impl really belongs in this scope as a local class but can't\n    // because MSVC produces duplicate symbols in different translation units\n    // in this case. Until MS fixes that bug we put Impl into the class scope\n    // and put the typedef both here (for use in assert statement) and\n    // in the Impl class. But both definitions must be the same.\n    typedef typename Function<F>::Result Result;\n    GTEST_COMPILE_ASSERT_(\n        !std::is_reference<Result>::value,\n        use_ReturnRef_instead_of_Return_to_return_a_reference);\n    static_assert(!std::is_void<Result>::value,\n                  \"Can't use Return() on an action expected to return `void`.\");\n    return Action<F>(new Impl<R, F>(value_));\n  }\n\n private:\n  // Implements the Return(x) action for a particular function type F.\n  template <typename R_, typename F>\n  class Impl : public ActionInterface<F> {\n   public:\n    typedef typename Function<F>::Result Result;\n    typedef typename Function<F>::ArgumentTuple ArgumentTuple;\n\n    // The implicit cast is necessary when Result has more than one\n    // single-argument constructor (e.g. Result is std::vector<int>) and R\n    // has a type conversion operator template.  In that case, value_(value)\n    // won't compile as the compiler doesn't known which constructor of\n    // Result to call.  ImplicitCast_ forces the compiler to convert R to\n    // Result without considering explicit constructors, thus resolving the\n    // ambiguity. value_ is then initialized using its copy constructor.\n    explicit Impl(const std::shared_ptr<R>& value)\n        : value_before_cast_(*value),\n          value_(ImplicitCast_<Result>(value_before_cast_)) {}\n\n    Result Perform(const ArgumentTuple&) override { return value_; }\n\n   private:\n    GTEST_COMPILE_ASSERT_(!std::is_reference<Result>::value,\n                          Result_cannot_be_a_reference_type);\n    // We save the value before casting just in case it is being cast to a\n    // wrapper type.\n    R value_before_cast_;\n    Result value_;\n\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(Impl);\n  };\n\n  // Partially specialize for ByMoveWrapper. This version of ReturnAction will\n  // move its contents instead.\n  template <typename R_, typename F>\n  class Impl<ByMoveWrapper<R_>, F> : public ActionInterface<F> {\n   public:\n    typedef typename Function<F>::Result Result;\n    typedef typename Function<F>::ArgumentTuple ArgumentTuple;\n\n    explicit Impl(const std::shared_ptr<R>& wrapper)\n        : performed_(false), wrapper_(wrapper) {}\n\n    Result Perform(const ArgumentTuple&) override {\n      GTEST_CHECK_(!performed_)\n          << \"A ByMove() action should only be performed once.\";\n      performed_ = true;\n      return std::move(wrapper_->payload);\n    }\n\n   private:\n    bool performed_;\n    const std::shared_ptr<R> wrapper_;\n  };\n\n  const std::shared_ptr<R> value_;\n};\n\n// Implements the ReturnNull() action.\nclass ReturnNullAction {\n public:\n  // Allows ReturnNull() to be used in any pointer-returning function. In C++11\n  // this is enforced by returning nullptr, and in non-C++11 by asserting a\n  // pointer type on compile time.\n  template <typename Result, typename ArgumentTuple>\n  static Result Perform(const ArgumentTuple&) {\n    return nullptr;\n  }\n};\n\n// Implements the Return() action.\nclass ReturnVoidAction {\n public:\n  // Allows Return() to be used in any void-returning function.\n  template <typename Result, typename ArgumentTuple>\n  static void Perform(const ArgumentTuple&) {\n    static_assert(std::is_void<Result>::value, \"Result should be void.\");\n  }\n};\n\n// Implements the polymorphic ReturnRef(x) action, which can be used\n// in any function that returns a reference to the type of x,\n// regardless of the argument types.\ntemplate <typename T>\nclass ReturnRefAction {\n public:\n  // Constructs a ReturnRefAction object from the reference to be returned.\n  explicit ReturnRefAction(T& ref) : ref_(ref) {}  // NOLINT\n\n  // This template type conversion operator allows ReturnRef(x) to be\n  // used in ANY function that returns a reference to x's type.\n  template <typename F>\n  operator Action<F>() const {\n    typedef typename Function<F>::Result Result;\n    // Asserts that the function return type is a reference.  This\n    // catches the user error of using ReturnRef(x) when Return(x)\n    // should be used, and generates some helpful error message.\n    GTEST_COMPILE_ASSERT_(std::is_reference<Result>::value,\n                          use_Return_instead_of_ReturnRef_to_return_a_value);\n    return Action<F>(new Impl<F>(ref_));\n  }\n\n private:\n  // Implements the ReturnRef(x) action for a particular function type F.\n  template <typename F>\n  class Impl : public ActionInterface<F> {\n   public:\n    typedef typename Function<F>::Result Result;\n    typedef typename Function<F>::ArgumentTuple ArgumentTuple;\n\n    explicit Impl(T& ref) : ref_(ref) {}  // NOLINT\n\n    Result Perform(const ArgumentTuple&) override { return ref_; }\n\n   private:\n    T& ref_;\n  };\n\n  T& ref_;\n};\n\n// Implements the polymorphic ReturnRefOfCopy(x) action, which can be\n// used in any function that returns a reference to the type of x,\n// regardless of the argument types.\ntemplate <typename T>\nclass ReturnRefOfCopyAction {\n public:\n  // Constructs a ReturnRefOfCopyAction object from the reference to\n  // be returned.\n  explicit ReturnRefOfCopyAction(const T& value) : value_(value) {}  // NOLINT\n\n  // This template type conversion operator allows ReturnRefOfCopy(x) to be\n  // used in ANY function that returns a reference to x's type.\n  template <typename F>\n  operator Action<F>() const {\n    typedef typename Function<F>::Result Result;\n    // Asserts that the function return type is a reference.  This\n    // catches the user error of using ReturnRefOfCopy(x) when Return(x)\n    // should be used, and generates some helpful error message.\n    GTEST_COMPILE_ASSERT_(\n        std::is_reference<Result>::value,\n        use_Return_instead_of_ReturnRefOfCopy_to_return_a_value);\n    return Action<F>(new Impl<F>(value_));\n  }\n\n private:\n  // Implements the ReturnRefOfCopy(x) action for a particular function type F.\n  template <typename F>\n  class Impl : public ActionInterface<F> {\n   public:\n    typedef typename Function<F>::Result Result;\n    typedef typename Function<F>::ArgumentTuple ArgumentTuple;\n\n    explicit Impl(const T& value) : value_(value) {}  // NOLINT\n\n    Result Perform(const ArgumentTuple&) override { return value_; }\n\n   private:\n    T value_;\n  };\n\n  const T value_;\n};\n\n// Implements the polymorphic ReturnRoundRobin(v) action, which can be\n// used in any function that returns the element_type of v.\ntemplate <typename T>\nclass ReturnRoundRobinAction {\n public:\n  explicit ReturnRoundRobinAction(std::vector<T> values) {\n    GTEST_CHECK_(!values.empty())\n        << \"ReturnRoundRobin requires at least one element.\";\n    state_->values = std::move(values);\n  }\n\n  template <typename... Args>\n  T operator()(Args&&...) const {\n     return state_->Next();\n  }\n\n private:\n  struct State {\n    T Next() {\n      T ret_val = values[i++];\n      if (i == values.size()) i = 0;\n      return ret_val;\n    }\n\n    std::vector<T> values;\n    size_t i = 0;\n  };\n  std::shared_ptr<State> state_ = std::make_shared<State>();\n};\n\n// Implements the polymorphic DoDefault() action.\nclass DoDefaultAction {\n public:\n  // This template type conversion operator allows DoDefault() to be\n  // used in any function.\n  template <typename F>\n  operator Action<F>() const { return Action<F>(); }  // NOLINT\n};\n\n// Implements the Assign action to set a given pointer referent to a\n// particular value.\ntemplate <typename T1, typename T2>\nclass AssignAction {\n public:\n  AssignAction(T1* ptr, T2 value) : ptr_(ptr), value_(value) {}\n\n  template <typename Result, typename ArgumentTuple>\n  void Perform(const ArgumentTuple& /* args */) const {\n    *ptr_ = value_;\n  }\n\n private:\n  T1* const ptr_;\n  const T2 value_;\n};\n\n#if !GTEST_OS_WINDOWS_MOBILE\n\n// Implements the SetErrnoAndReturn action to simulate return from\n// various system calls and libc functions.\ntemplate <typename T>\nclass SetErrnoAndReturnAction {\n public:\n  SetErrnoAndReturnAction(int errno_value, T result)\n      : errno_(errno_value),\n        result_(result) {}\n  template <typename Result, typename ArgumentTuple>\n  Result Perform(const ArgumentTuple& /* args */) const {\n    errno = errno_;\n    return result_;\n  }\n\n private:\n  const int errno_;\n  const T result_;\n};\n\n#endif  // !GTEST_OS_WINDOWS_MOBILE\n\n// Implements the SetArgumentPointee<N>(x) action for any function\n// whose N-th argument (0-based) is a pointer to x's type.\ntemplate <size_t N, typename A, typename = void>\nstruct SetArgumentPointeeAction {\n  A value;\n\n  template <typename... Args>\n  void operator()(const Args&... args) const {\n    *::std::get<N>(std::tie(args...)) = value;\n  }\n};\n\n// Implements the Invoke(object_ptr, &Class::Method) action.\ntemplate <class Class, typename MethodPtr>\nstruct InvokeMethodAction {\n  Class* const obj_ptr;\n  const MethodPtr method_ptr;\n\n  template <typename... Args>\n  auto operator()(Args&&... args) const\n      -> decltype((obj_ptr->*method_ptr)(std::forward<Args>(args)...)) {\n    return (obj_ptr->*method_ptr)(std::forward<Args>(args)...);\n  }\n};\n\n// Implements the InvokeWithoutArgs(f) action.  The template argument\n// FunctionImpl is the implementation type of f, which can be either a\n// function pointer or a functor.  InvokeWithoutArgs(f) can be used as an\n// Action<F> as long as f's type is compatible with F.\ntemplate <typename FunctionImpl>\nstruct InvokeWithoutArgsAction {\n  FunctionImpl function_impl;\n\n  // Allows InvokeWithoutArgs(f) to be used as any action whose type is\n  // compatible with f.\n  template <typename... Args>\n  auto operator()(const Args&...) -> decltype(function_impl()) {\n    return function_impl();\n  }\n};\n\n// Implements the InvokeWithoutArgs(object_ptr, &Class::Method) action.\ntemplate <class Class, typename MethodPtr>\nstruct InvokeMethodWithoutArgsAction {\n  Class* const obj_ptr;\n  const MethodPtr method_ptr;\n\n  using ReturnType =\n      decltype((std::declval<Class*>()->*std::declval<MethodPtr>())());\n\n  template <typename... Args>\n  ReturnType operator()(const Args&...) const {\n    return (obj_ptr->*method_ptr)();\n  }\n};\n\n// Implements the IgnoreResult(action) action.\ntemplate <typename A>\nclass IgnoreResultAction {\n public:\n  explicit IgnoreResultAction(const A& action) : action_(action) {}\n\n  template <typename F>\n  operator Action<F>() const {\n    // Assert statement belongs here because this is the best place to verify\n    // conditions on F. It produces the clearest error messages\n    // in most compilers.\n    // Impl really belongs in this scope as a local class but can't\n    // because MSVC produces duplicate symbols in different translation units\n    // in this case. Until MS fixes that bug we put Impl into the class scope\n    // and put the typedef both here (for use in assert statement) and\n    // in the Impl class. But both definitions must be the same.\n    typedef typename internal::Function<F>::Result Result;\n\n    // Asserts at compile time that F returns void.\n    static_assert(std::is_void<Result>::value, \"Result type should be void.\");\n\n    return Action<F>(new Impl<F>(action_));\n  }\n\n private:\n  template <typename F>\n  class Impl : public ActionInterface<F> {\n   public:\n    typedef typename internal::Function<F>::Result Result;\n    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n\n    explicit Impl(const A& action) : action_(action) {}\n\n    void Perform(const ArgumentTuple& args) override {\n      // Performs the action and ignores its result.\n      action_.Perform(args);\n    }\n\n   private:\n    // Type OriginalFunction is the same as F except that its return\n    // type is IgnoredValue.\n    typedef typename internal::Function<F>::MakeResultIgnoredValue\n        OriginalFunction;\n\n    const Action<OriginalFunction> action_;\n  };\n\n  const A action_;\n};\n\ntemplate <typename InnerAction, size_t... I>\nstruct WithArgsAction {\n  InnerAction action;\n\n  // The inner action could be anything convertible to Action<X>.\n  // We use the conversion operator to detect the signature of the inner Action.\n  template <typename R, typename... Args>\n  operator Action<R(Args...)>() const {  // NOLINT\n    using TupleType = std::tuple<Args...>;\n    Action<R(typename std::tuple_element<I, TupleType>::type...)>\n        converted(action);\n\n    return [converted](Args... args) -> R {\n      return converted.Perform(std::forward_as_tuple(\n        std::get<I>(std::forward_as_tuple(std::forward<Args>(args)...))...));\n    };\n  }\n};\n\ntemplate <typename... Actions>\nstruct DoAllAction {\n private:\n  template <typename T>\n  using NonFinalType =\n      typename std::conditional<std::is_scalar<T>::value, T, const T&>::type;\n\n  template <typename ActionT, size_t... I>\n  std::vector<ActionT> Convert(IndexSequence<I...>) const {\n    return {ActionT(std::get<I>(actions))...};\n  }\n\n public:\n  std::tuple<Actions...> actions;\n\n  template <typename R, typename... Args>\n  operator Action<R(Args...)>() const {  // NOLINT\n    struct Op {\n      std::vector<Action<void(NonFinalType<Args>...)>> converted;\n      Action<R(Args...)> last;\n      R operator()(Args... args) const {\n        auto tuple_args = std::forward_as_tuple(std::forward<Args>(args)...);\n        for (auto& a : converted) {\n          a.Perform(tuple_args);\n        }\n        return last.Perform(std::move(tuple_args));\n      }\n    };\n    return Op{Convert<Action<void(NonFinalType<Args>...)>>(\n                  MakeIndexSequence<sizeof...(Actions) - 1>()),\n              std::get<sizeof...(Actions) - 1>(actions)};\n  }\n};\n\ntemplate <typename T, typename... Params>\nstruct ReturnNewAction {\n  T* operator()() const {\n    return internal::Apply(\n        [](const Params&... unpacked_params) {\n          return new T(unpacked_params...);\n        },\n        params);\n  }\n  std::tuple<Params...> params;\n};\n\ntemplate <size_t k>\nstruct ReturnArgAction {\n  template <typename... Args>\n  auto operator()(const Args&... args) const ->\n      typename std::tuple_element<k, std::tuple<Args...>>::type {\n    return std::get<k>(std::tie(args...));\n  }\n};\n\ntemplate <size_t k, typename Ptr>\nstruct SaveArgAction {\n  Ptr pointer;\n\n  template <typename... Args>\n  void operator()(const Args&... args) const {\n    *pointer = std::get<k>(std::tie(args...));\n  }\n};\n\ntemplate <size_t k, typename Ptr>\nstruct SaveArgPointeeAction {\n  Ptr pointer;\n\n  template <typename... Args>\n  void operator()(const Args&... args) const {\n    *pointer = *std::get<k>(std::tie(args...));\n  }\n};\n\ntemplate <size_t k, typename T>\nstruct SetArgRefereeAction {\n  T value;\n\n  template <typename... Args>\n  void operator()(Args&&... args) const {\n    using argk_type =\n        typename ::std::tuple_element<k, std::tuple<Args...>>::type;\n    static_assert(std::is_lvalue_reference<argk_type>::value,\n                  \"Argument must be a reference type.\");\n    std::get<k>(std::tie(args...)) = value;\n  }\n};\n\ntemplate <size_t k, typename I1, typename I2>\nstruct SetArrayArgumentAction {\n  I1 first;\n  I2 last;\n\n  template <typename... Args>\n  void operator()(const Args&... args) const {\n    auto value = std::get<k>(std::tie(args...));\n    for (auto it = first; it != last; ++it, (void)++value) {\n      *value = *it;\n    }\n  }\n};\n\ntemplate <size_t k>\nstruct DeleteArgAction {\n  template <typename... Args>\n  void operator()(const Args&... args) const {\n    delete std::get<k>(std::tie(args...));\n  }\n};\n\ntemplate <typename Ptr>\nstruct ReturnPointeeAction {\n  Ptr pointer;\n  template <typename... Args>\n  auto operator()(const Args&...) const -> decltype(*pointer) {\n    return *pointer;\n  }\n};\n\n#if GTEST_HAS_EXCEPTIONS\ntemplate <typename T>\nstruct ThrowAction {\n  T exception;\n  // We use a conversion operator to adapt to any return type.\n  template <typename R, typename... Args>\n  operator Action<R(Args...)>() const {  // NOLINT\n    T copy = exception;\n    return [copy](Args...) -> R { throw copy; };\n  }\n};\n#endif  // GTEST_HAS_EXCEPTIONS\n\n}  // namespace internal\n\n// An Unused object can be implicitly constructed from ANY value.\n// This is handy when defining actions that ignore some or all of the\n// mock function arguments.  For example, given\n//\n//   MOCK_METHOD3(Foo, double(const string& label, double x, double y));\n//   MOCK_METHOD3(Bar, double(int index, double x, double y));\n//\n// instead of\n//\n//   double DistanceToOriginWithLabel(const string& label, double x, double y) {\n//     return sqrt(x*x + y*y);\n//   }\n//   double DistanceToOriginWithIndex(int index, double x, double y) {\n//     return sqrt(x*x + y*y);\n//   }\n//   ...\n//   EXPECT_CALL(mock, Foo(\"abc\", _, _))\n//       .WillOnce(Invoke(DistanceToOriginWithLabel));\n//   EXPECT_CALL(mock, Bar(5, _, _))\n//       .WillOnce(Invoke(DistanceToOriginWithIndex));\n//\n// you could write\n//\n//   // We can declare any uninteresting argument as Unused.\n//   double DistanceToOrigin(Unused, double x, double y) {\n//     return sqrt(x*x + y*y);\n//   }\n//   ...\n//   EXPECT_CALL(mock, Foo(\"abc\", _, _)).WillOnce(Invoke(DistanceToOrigin));\n//   EXPECT_CALL(mock, Bar(5, _, _)).WillOnce(Invoke(DistanceToOrigin));\ntypedef internal::IgnoredValue Unused;\n\n// Creates an action that does actions a1, a2, ..., sequentially in\n// each invocation. All but the last action will have a readonly view of the\n// arguments.\ntemplate <typename... Action>\ninternal::DoAllAction<typename std::decay<Action>::type...> DoAll(\n    Action&&... action) {\n  return {std::forward_as_tuple(std::forward<Action>(action)...)};\n}\n\n// WithArg<k>(an_action) creates an action that passes the k-th\n// (0-based) argument of the mock function to an_action and performs\n// it.  It adapts an action accepting one argument to one that accepts\n// multiple arguments.  For convenience, we also provide\n// WithArgs<k>(an_action) (defined below) as a synonym.\ntemplate <size_t k, typename InnerAction>\ninternal::WithArgsAction<typename std::decay<InnerAction>::type, k>\nWithArg(InnerAction&& action) {\n  return {std::forward<InnerAction>(action)};\n}\n\n// WithArgs<N1, N2, ..., Nk>(an_action) creates an action that passes\n// the selected arguments of the mock function to an_action and\n// performs it.  It serves as an adaptor between actions with\n// different argument lists.\ntemplate <size_t k, size_t... ks, typename InnerAction>\ninternal::WithArgsAction<typename std::decay<InnerAction>::type, k, ks...>\nWithArgs(InnerAction&& action) {\n  return {std::forward<InnerAction>(action)};\n}\n\n// WithoutArgs(inner_action) can be used in a mock function with a\n// non-empty argument list to perform inner_action, which takes no\n// argument.  In other words, it adapts an action accepting no\n// argument to one that accepts (and ignores) arguments.\ntemplate <typename InnerAction>\ninternal::WithArgsAction<typename std::decay<InnerAction>::type>\nWithoutArgs(InnerAction&& action) {\n  return {std::forward<InnerAction>(action)};\n}\n\n// Creates an action that returns 'value'.  'value' is passed by value\n// instead of const reference - otherwise Return(\"string literal\")\n// will trigger a compiler error about using array as initializer.\ntemplate <typename R>\ninternal::ReturnAction<R> Return(R value) {\n  return internal::ReturnAction<R>(std::move(value));\n}\n\n// Creates an action that returns NULL.\ninline PolymorphicAction<internal::ReturnNullAction> ReturnNull() {\n  return MakePolymorphicAction(internal::ReturnNullAction());\n}\n\n// Creates an action that returns from a void function.\ninline PolymorphicAction<internal::ReturnVoidAction> Return() {\n  return MakePolymorphicAction(internal::ReturnVoidAction());\n}\n\n// Creates an action that returns the reference to a variable.\ntemplate <typename R>\ninline internal::ReturnRefAction<R> ReturnRef(R& x) {  // NOLINT\n  return internal::ReturnRefAction<R>(x);\n}\n\n// Prevent using ReturnRef on reference to temporary.\ntemplate <typename R, R* = nullptr>\ninternal::ReturnRefAction<R> ReturnRef(R&&) = delete;\n\n// Creates an action that returns the reference to a copy of the\n// argument.  The copy is created when the action is constructed and\n// lives as long as the action.\ntemplate <typename R>\ninline internal::ReturnRefOfCopyAction<R> ReturnRefOfCopy(const R& x) {\n  return internal::ReturnRefOfCopyAction<R>(x);\n}\n\n// Modifies the parent action (a Return() action) to perform a move of the\n// argument instead of a copy.\n// Return(ByMove()) actions can only be executed once and will assert this\n// invariant.\ntemplate <typename R>\ninternal::ByMoveWrapper<R> ByMove(R x) {\n  return internal::ByMoveWrapper<R>(std::move(x));\n}\n\n// Creates an action that returns an element of `vals`. Calling this action will\n// repeatedly return the next value from `vals` until it reaches the end and\n// will restart from the beginning.\ntemplate <typename T>\ninternal::ReturnRoundRobinAction<T> ReturnRoundRobin(std::vector<T> vals) {\n  return internal::ReturnRoundRobinAction<T>(std::move(vals));\n}\n\n// Creates an action that returns an element of `vals`. Calling this action will\n// repeatedly return the next value from `vals` until it reaches the end and\n// will restart from the beginning.\ntemplate <typename T>\ninternal::ReturnRoundRobinAction<T> ReturnRoundRobin(\n    std::initializer_list<T> vals) {\n  return internal::ReturnRoundRobinAction<T>(std::vector<T>(vals));\n}\n\n// Creates an action that does the default action for the give mock function.\ninline internal::DoDefaultAction DoDefault() {\n  return internal::DoDefaultAction();\n}\n\n// Creates an action that sets the variable pointed by the N-th\n// (0-based) function argument to 'value'.\ntemplate <size_t N, typename T>\ninternal::SetArgumentPointeeAction<N, T> SetArgPointee(T value) {\n  return {std::move(value)};\n}\n\n// The following version is DEPRECATED.\ntemplate <size_t N, typename T>\ninternal::SetArgumentPointeeAction<N, T> SetArgumentPointee(T value) {\n  return {std::move(value)};\n}\n\n// Creates an action that sets a pointer referent to a given value.\ntemplate <typename T1, typename T2>\nPolymorphicAction<internal::AssignAction<T1, T2> > Assign(T1* ptr, T2 val) {\n  return MakePolymorphicAction(internal::AssignAction<T1, T2>(ptr, val));\n}\n\n#if !GTEST_OS_WINDOWS_MOBILE\n\n// Creates an action that sets errno and returns the appropriate error.\ntemplate <typename T>\nPolymorphicAction<internal::SetErrnoAndReturnAction<T> >\nSetErrnoAndReturn(int errval, T result) {\n  return MakePolymorphicAction(\n      internal::SetErrnoAndReturnAction<T>(errval, result));\n}\n\n#endif  // !GTEST_OS_WINDOWS_MOBILE\n\n// Various overloads for Invoke().\n\n// Legacy function.\n// Actions can now be implicitly constructed from callables. No need to create\n// wrapper objects.\n// This function exists for backwards compatibility.\ntemplate <typename FunctionImpl>\ntypename std::decay<FunctionImpl>::type Invoke(FunctionImpl&& function_impl) {\n  return std::forward<FunctionImpl>(function_impl);\n}\n\n// Creates an action that invokes the given method on the given object\n// with the mock function's arguments.\ntemplate <class Class, typename MethodPtr>\ninternal::InvokeMethodAction<Class, MethodPtr> Invoke(Class* obj_ptr,\n                                                      MethodPtr method_ptr) {\n  return {obj_ptr, method_ptr};\n}\n\n// Creates an action that invokes 'function_impl' with no argument.\ntemplate <typename FunctionImpl>\ninternal::InvokeWithoutArgsAction<typename std::decay<FunctionImpl>::type>\nInvokeWithoutArgs(FunctionImpl function_impl) {\n  return {std::move(function_impl)};\n}\n\n// Creates an action that invokes the given method on the given object\n// with no argument.\ntemplate <class Class, typename MethodPtr>\ninternal::InvokeMethodWithoutArgsAction<Class, MethodPtr> InvokeWithoutArgs(\n    Class* obj_ptr, MethodPtr method_ptr) {\n  return {obj_ptr, method_ptr};\n}\n\n// Creates an action that performs an_action and throws away its\n// result.  In other words, it changes the return type of an_action to\n// void.  an_action MUST NOT return void, or the code won't compile.\ntemplate <typename A>\ninline internal::IgnoreResultAction<A> IgnoreResult(const A& an_action) {\n  return internal::IgnoreResultAction<A>(an_action);\n}\n\n// Creates a reference wrapper for the given L-value.  If necessary,\n// you can explicitly specify the type of the reference.  For example,\n// suppose 'derived' is an object of type Derived, ByRef(derived)\n// would wrap a Derived&.  If you want to wrap a const Base& instead,\n// where Base is a base class of Derived, just write:\n//\n//   ByRef<const Base>(derived)\n//\n// N.B. ByRef is redundant with std::ref, std::cref and std::reference_wrapper.\n// However, it may still be used for consistency with ByMove().\ntemplate <typename T>\ninline ::std::reference_wrapper<T> ByRef(T& l_value) {  // NOLINT\n  return ::std::reference_wrapper<T>(l_value);\n}\n\n// The ReturnNew<T>(a1, a2, ..., a_k) action returns a pointer to a new\n// instance of type T, constructed on the heap with constructor arguments\n// a1, a2, ..., and a_k. The caller assumes ownership of the returned value.\ntemplate <typename T, typename... Params>\ninternal::ReturnNewAction<T, typename std::decay<Params>::type...> ReturnNew(\n    Params&&... params) {\n  return {std::forward_as_tuple(std::forward<Params>(params)...)};\n}\n\n// Action ReturnArg<k>() returns the k-th argument of the mock function.\ntemplate <size_t k>\ninternal::ReturnArgAction<k> ReturnArg() {\n  return {};\n}\n\n// Action SaveArg<k>(pointer) saves the k-th (0-based) argument of the\n// mock function to *pointer.\ntemplate <size_t k, typename Ptr>\ninternal::SaveArgAction<k, Ptr> SaveArg(Ptr pointer) {\n  return {pointer};\n}\n\n// Action SaveArgPointee<k>(pointer) saves the value pointed to\n// by the k-th (0-based) argument of the mock function to *pointer.\ntemplate <size_t k, typename Ptr>\ninternal::SaveArgPointeeAction<k, Ptr> SaveArgPointee(Ptr pointer) {\n  return {pointer};\n}\n\n// Action SetArgReferee<k>(value) assigns 'value' to the variable\n// referenced by the k-th (0-based) argument of the mock function.\ntemplate <size_t k, typename T>\ninternal::SetArgRefereeAction<k, typename std::decay<T>::type> SetArgReferee(\n    T&& value) {\n  return {std::forward<T>(value)};\n}\n\n// Action SetArrayArgument<k>(first, last) copies the elements in\n// source range [first, last) to the array pointed to by the k-th\n// (0-based) argument, which can be either a pointer or an\n// iterator. The action does not take ownership of the elements in the\n// source range.\ntemplate <size_t k, typename I1, typename I2>\ninternal::SetArrayArgumentAction<k, I1, I2> SetArrayArgument(I1 first,\n                                                             I2 last) {\n  return {first, last};\n}\n\n// Action DeleteArg<k>() deletes the k-th (0-based) argument of the mock\n// function.\ntemplate <size_t k>\ninternal::DeleteArgAction<k> DeleteArg() {\n  return {};\n}\n\n// This action returns the value pointed to by 'pointer'.\ntemplate <typename Ptr>\ninternal::ReturnPointeeAction<Ptr> ReturnPointee(Ptr pointer) {\n  return {pointer};\n}\n\n// Action Throw(exception) can be used in a mock function of any type\n// to throw the given exception.  Any copyable value can be thrown.\n#if GTEST_HAS_EXCEPTIONS\ntemplate <typename T>\ninternal::ThrowAction<typename std::decay<T>::type> Throw(T&& exception) {\n  return {std::forward<T>(exception)};\n}\n#endif  // GTEST_HAS_EXCEPTIONS\n\nnamespace internal {\n\n// A macro from the ACTION* family (defined later in gmock-generated-actions.h)\n// defines an action that can be used in a mock function.  Typically,\n// these actions only care about a subset of the arguments of the mock\n// function.  For example, if such an action only uses the second\n// argument, it can be used in any mock function that takes >= 2\n// arguments where the type of the second argument is compatible.\n//\n// Therefore, the action implementation must be prepared to take more\n// arguments than it needs.  The ExcessiveArg type is used to\n// represent those excessive arguments.  In order to keep the compiler\n// error messages tractable, we define it in the testing namespace\n// instead of testing::internal.  However, this is an INTERNAL TYPE\n// and subject to change without notice, so a user MUST NOT USE THIS\n// TYPE DIRECTLY.\nstruct ExcessiveArg {};\n\n// Builds an implementation of an Action<> for some particular signature, using\n// a class defined by an ACTION* macro.\ntemplate <typename F, typename Impl> struct ActionImpl;\n\ntemplate <typename Impl>\nstruct ImplBase {\n  struct Holder {\n    // Allows each copy of the Action<> to get to the Impl.\n    explicit operator const Impl&() const { return *ptr; }\n    std::shared_ptr<Impl> ptr;\n  };\n  using type = typename std::conditional<std::is_constructible<Impl>::value,\n                                         Impl, Holder>::type;\n};\n\ntemplate <typename R, typename... Args, typename Impl>\nstruct ActionImpl<R(Args...), Impl> : ImplBase<Impl>::type {\n  using Base = typename ImplBase<Impl>::type;\n  using function_type = R(Args...);\n  using args_type = std::tuple<Args...>;\n\n  ActionImpl() = default;  // Only defined if appropriate for Base.\n  explicit ActionImpl(std::shared_ptr<Impl> impl) : Base{std::move(impl)} { }\n\n  R operator()(Args&&... arg) const {\n    static constexpr size_t kMaxArgs =\n        sizeof...(Args) <= 10 ? sizeof...(Args) : 10;\n    return Apply(MakeIndexSequence<kMaxArgs>{},\n                 MakeIndexSequence<10 - kMaxArgs>{},\n                 args_type{std::forward<Args>(arg)...});\n  }\n\n  template <std::size_t... arg_id, std::size_t... excess_id>\n  R Apply(IndexSequence<arg_id...>, IndexSequence<excess_id...>,\n          const args_type& args) const {\n    // Impl need not be specific to the signature of action being implemented;\n    // only the implementing function body needs to have all of the specific\n    // types instantiated.  Up to 10 of the args that are provided by the\n    // args_type get passed, followed by a dummy of unspecified type for the\n    // remainder up to 10 explicit args.\n    static constexpr ExcessiveArg kExcessArg{};\n    return static_cast<const Impl&>(*this).template gmock_PerformImpl<\n        /*function_type=*/function_type, /*return_type=*/R,\n        /*args_type=*/args_type,\n        /*argN_type=*/typename std::tuple_element<arg_id, args_type>::type...>(\n        /*args=*/args, std::get<arg_id>(args)...,\n        ((void)excess_id, kExcessArg)...);\n  }\n};\n\n// Stores a default-constructed Impl as part of the Action<>'s\n// std::function<>. The Impl should be trivial to copy.\ntemplate <typename F, typename Impl>\n::testing::Action<F> MakeAction() {\n  return ::testing::Action<F>(ActionImpl<F, Impl>());\n}\n\n// Stores just the one given instance of Impl.\ntemplate <typename F, typename Impl>\n::testing::Action<F> MakeAction(std::shared_ptr<Impl> impl) {\n  return ::testing::Action<F>(ActionImpl<F, Impl>(std::move(impl)));\n}\n\n#define GMOCK_INTERNAL_ARG_UNUSED(i, data, el) \\\n  , const arg##i##_type& arg##i GTEST_ATTRIBUTE_UNUSED_\n#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_           \\\n  const args_type& args GTEST_ATTRIBUTE_UNUSED_ GMOCK_PP_REPEAT( \\\n      GMOCK_INTERNAL_ARG_UNUSED, , 10)\n\n#define GMOCK_INTERNAL_ARG(i, data, el) , const arg##i##_type& arg##i\n#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_ \\\n  const args_type& args GMOCK_PP_REPEAT(GMOCK_INTERNAL_ARG, , 10)\n\n#define GMOCK_INTERNAL_TEMPLATE_ARG(i, data, el) , typename arg##i##_type\n#define GMOCK_ACTION_TEMPLATE_ARGS_NAMES_ \\\n  GMOCK_PP_TAIL(GMOCK_PP_REPEAT(GMOCK_INTERNAL_TEMPLATE_ARG, , 10))\n\n#define GMOCK_INTERNAL_TYPENAME_PARAM(i, data, param) , typename param##_type\n#define GMOCK_ACTION_TYPENAME_PARAMS_(params) \\\n  GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_TYPENAME_PARAM, , params))\n\n#define GMOCK_INTERNAL_TYPE_PARAM(i, data, param) , param##_type\n#define GMOCK_ACTION_TYPE_PARAMS_(params) \\\n  GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_TYPE_PARAM, , params))\n\n#define GMOCK_INTERNAL_TYPE_GVALUE_PARAM(i, data, param) \\\n  , param##_type gmock_p##i\n#define GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params) \\\n  GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_TYPE_GVALUE_PARAM, , params))\n\n#define GMOCK_INTERNAL_GVALUE_PARAM(i, data, param) \\\n  , std::forward<param##_type>(gmock_p##i)\n#define GMOCK_ACTION_GVALUE_PARAMS_(params) \\\n  GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_GVALUE_PARAM, , params))\n\n#define GMOCK_INTERNAL_INIT_PARAM(i, data, param) \\\n  , param(::std::forward<param##_type>(gmock_p##i))\n#define GMOCK_ACTION_INIT_PARAMS_(params) \\\n  GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_INIT_PARAM, , params))\n\n#define GMOCK_INTERNAL_FIELD_PARAM(i, data, param) param##_type param;\n#define GMOCK_ACTION_FIELD_PARAMS_(params) \\\n  GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_FIELD_PARAM, , params)\n\n#define GMOCK_INTERNAL_ACTION(name, full_name, params)                        \\\n  template <GMOCK_ACTION_TYPENAME_PARAMS_(params)>                            \\\n  class full_name {                                                           \\\n   public:                                                                    \\\n    explicit full_name(GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params))              \\\n        : impl_(std::make_shared<gmock_Impl>(                                 \\\n                GMOCK_ACTION_GVALUE_PARAMS_(params))) { }                     \\\n    full_name(const full_name&) = default;                                    \\\n    full_name(full_name&&) noexcept = default;                                \\\n    template <typename F>                                                     \\\n    operator ::testing::Action<F>() const {                                   \\\n      return ::testing::internal::MakeAction<F>(impl_);                       \\\n    }                                                                         \\\n   private:                                                                   \\\n    class gmock_Impl {                                                        \\\n     public:                                                                  \\\n      explicit gmock_Impl(GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params))           \\\n          : GMOCK_ACTION_INIT_PARAMS_(params) {}                              \\\n      template <typename function_type, typename return_type,                 \\\n                typename args_type, GMOCK_ACTION_TEMPLATE_ARGS_NAMES_>        \\\n      return_type gmock_PerformImpl(GMOCK_ACTION_ARG_TYPES_AND_NAMES_) const; \\\n      GMOCK_ACTION_FIELD_PARAMS_(params)                                      \\\n    };                                                                        \\\n    std::shared_ptr<const gmock_Impl> impl_;                                  \\\n  };                                                                          \\\n  template <GMOCK_ACTION_TYPENAME_PARAMS_(params)>                            \\\n  inline full_name<GMOCK_ACTION_TYPE_PARAMS_(params)> name(                   \\\n      GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params)) {                             \\\n    return full_name<GMOCK_ACTION_TYPE_PARAMS_(params)>(                      \\\n        GMOCK_ACTION_GVALUE_PARAMS_(params));                                 \\\n  }                                                                           \\\n  template <GMOCK_ACTION_TYPENAME_PARAMS_(params)>                            \\\n  template <typename function_type, typename return_type, typename args_type, \\\n            GMOCK_ACTION_TEMPLATE_ARGS_NAMES_>                                \\\n  return_type full_name<GMOCK_ACTION_TYPE_PARAMS_(params)>::gmock_Impl::      \\\n  gmock_PerformImpl(GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const\n\n}  // namespace internal\n\n// Similar to GMOCK_INTERNAL_ACTION, but no bound parameters are stored.\n#define ACTION(name)                                                          \\\n  class name##Action {                                                        \\\n   public:                                                                    \\\n   explicit name##Action() noexcept {}                                        \\\n   name##Action(const name##Action&) noexcept {}                              \\\n    template <typename F>                                                     \\\n    operator ::testing::Action<F>() const {                                   \\\n      return ::testing::internal::MakeAction<F, gmock_Impl>();                \\\n    }                                                                         \\\n   private:                                                                   \\\n    class gmock_Impl {                                                        \\\n     public:                                                                  \\\n      template <typename function_type, typename return_type,                 \\\n                typename args_type, GMOCK_ACTION_TEMPLATE_ARGS_NAMES_>        \\\n      return_type gmock_PerformImpl(GMOCK_ACTION_ARG_TYPES_AND_NAMES_) const; \\\n    };                                                                        \\\n  };                                                                          \\\n  inline name##Action name() GTEST_MUST_USE_RESULT_;                          \\\n  inline name##Action name() { return name##Action(); }                       \\\n  template <typename function_type, typename return_type, typename args_type, \\\n            GMOCK_ACTION_TEMPLATE_ARGS_NAMES_>                                \\\n  return_type name##Action::gmock_Impl::gmock_PerformImpl(                    \\\n      GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const\n\n#define ACTION_P(name, ...) \\\n  GMOCK_INTERNAL_ACTION(name, name##ActionP, (__VA_ARGS__))\n\n#define ACTION_P2(name, ...) \\\n  GMOCK_INTERNAL_ACTION(name, name##ActionP2, (__VA_ARGS__))\n\n#define ACTION_P3(name, ...) \\\n  GMOCK_INTERNAL_ACTION(name, name##ActionP3, (__VA_ARGS__))\n\n#define ACTION_P4(name, ...) \\\n  GMOCK_INTERNAL_ACTION(name, name##ActionP4, (__VA_ARGS__))\n\n#define ACTION_P5(name, ...) \\\n  GMOCK_INTERNAL_ACTION(name, name##ActionP5, (__VA_ARGS__))\n\n#define ACTION_P6(name, ...) \\\n  GMOCK_INTERNAL_ACTION(name, name##ActionP6, (__VA_ARGS__))\n\n#define ACTION_P7(name, ...) \\\n  GMOCK_INTERNAL_ACTION(name, name##ActionP7, (__VA_ARGS__))\n\n#define ACTION_P8(name, ...) \\\n  GMOCK_INTERNAL_ACTION(name, name##ActionP8, (__VA_ARGS__))\n\n#define ACTION_P9(name, ...) \\\n  GMOCK_INTERNAL_ACTION(name, name##ActionP9, (__VA_ARGS__))\n\n#define ACTION_P10(name, ...) \\\n  GMOCK_INTERNAL_ACTION(name, name##ActionP10, (__VA_ARGS__))\n\n}  // namespace testing\n\n#ifdef _MSC_VER\n# pragma warning(pop)\n#endif\n\n#endif  // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements some commonly used cardinalities.  More\n// cardinalities can be defined by the user implementing the\n// CardinalityInterface interface if necessary.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_\n#define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_\n\n#include <limits.h>\n#include <memory>\n#include <ostream>  // NOLINT\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\nnamespace testing {\n\n// To implement a cardinality Foo, define:\n//   1. a class FooCardinality that implements the\n//      CardinalityInterface interface, and\n//   2. a factory function that creates a Cardinality object from a\n//      const FooCardinality*.\n//\n// The two-level delegation design follows that of Matcher, providing\n// consistency for extension developers.  It also eases ownership\n// management as Cardinality objects can now be copied like plain values.\n\n// The implementation of a cardinality.\nclass CardinalityInterface {\n public:\n  virtual ~CardinalityInterface() {}\n\n  // Conservative estimate on the lower/upper bound of the number of\n  // calls allowed.\n  virtual int ConservativeLowerBound() const { return 0; }\n  virtual int ConservativeUpperBound() const { return INT_MAX; }\n\n  // Returns true if and only if call_count calls will satisfy this\n  // cardinality.\n  virtual bool IsSatisfiedByCallCount(int call_count) const = 0;\n\n  // Returns true if and only if call_count calls will saturate this\n  // cardinality.\n  virtual bool IsSaturatedByCallCount(int call_count) const = 0;\n\n  // Describes self to an ostream.\n  virtual void DescribeTo(::std::ostream* os) const = 0;\n};\n\n// A Cardinality is a copyable and IMMUTABLE (except by assignment)\n// object that specifies how many times a mock function is expected to\n// be called.  The implementation of Cardinality is just a std::shared_ptr\n// to const CardinalityInterface. Don't inherit from Cardinality!\nclass GTEST_API_ Cardinality {\n public:\n  // Constructs a null cardinality.  Needed for storing Cardinality\n  // objects in STL containers.\n  Cardinality() {}\n\n  // Constructs a Cardinality from its implementation.\n  explicit Cardinality(const CardinalityInterface* impl) : impl_(impl) {}\n\n  // Conservative estimate on the lower/upper bound of the number of\n  // calls allowed.\n  int ConservativeLowerBound() const { return impl_->ConservativeLowerBound(); }\n  int ConservativeUpperBound() const { return impl_->ConservativeUpperBound(); }\n\n  // Returns true if and only if call_count calls will satisfy this\n  // cardinality.\n  bool IsSatisfiedByCallCount(int call_count) const {\n    return impl_->IsSatisfiedByCallCount(call_count);\n  }\n\n  // Returns true if and only if call_count calls will saturate this\n  // cardinality.\n  bool IsSaturatedByCallCount(int call_count) const {\n    return impl_->IsSaturatedByCallCount(call_count);\n  }\n\n  // Returns true if and only if call_count calls will over-saturate this\n  // cardinality, i.e. exceed the maximum number of allowed calls.\n  bool IsOverSaturatedByCallCount(int call_count) const {\n    return impl_->IsSaturatedByCallCount(call_count) &&\n        !impl_->IsSatisfiedByCallCount(call_count);\n  }\n\n  // Describes self to an ostream\n  void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); }\n\n  // Describes the given actual call count to an ostream.\n  static void DescribeActualCallCountTo(int actual_call_count,\n                                        ::std::ostream* os);\n\n private:\n  std::shared_ptr<const CardinalityInterface> impl_;\n};\n\n// Creates a cardinality that allows at least n calls.\nGTEST_API_ Cardinality AtLeast(int n);\n\n// Creates a cardinality that allows at most n calls.\nGTEST_API_ Cardinality AtMost(int n);\n\n// Creates a cardinality that allows any number of calls.\nGTEST_API_ Cardinality AnyNumber();\n\n// Creates a cardinality that allows between min and max calls.\nGTEST_API_ Cardinality Between(int min, int max);\n\n// Creates a cardinality that allows exactly n calls.\nGTEST_API_ Cardinality Exactly(int n);\n\n// Creates a cardinality from its implementation.\ninline Cardinality MakeCardinality(const CardinalityInterface* c) {\n  return Cardinality(c);\n}\n\n}  // namespace testing\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n#endif  // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements MOCK_METHOD.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_FUNCTION_MOCKER_H_  // NOLINT\n#define GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_FUNCTION_MOCKER_H_  // NOLINT\n\n#include <type_traits>  // IWYU pragma: keep\n#include <utility>      // IWYU pragma: keep\n\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements the ON_CALL() and EXPECT_CALL() macros.\n//\n// A user can use the ON_CALL() macro to specify the default action of\n// a mock method.  The syntax is:\n//\n//   ON_CALL(mock_object, Method(argument-matchers))\n//       .With(multi-argument-matcher)\n//       .WillByDefault(action);\n//\n//  where the .With() clause is optional.\n//\n// A user can use the EXPECT_CALL() macro to specify an expectation on\n// a mock method.  The syntax is:\n//\n//   EXPECT_CALL(mock_object, Method(argument-matchers))\n//       .With(multi-argument-matchers)\n//       .Times(cardinality)\n//       .InSequence(sequences)\n//       .After(expectations)\n//       .WillOnce(action)\n//       .WillRepeatedly(action)\n//       .RetiresOnSaturation();\n//\n// where all clauses are optional, and .InSequence()/.After()/\n// .WillOnce() can appear any number of times.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_\n#define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_\n\n#include <functional>\n#include <map>\n#include <memory>\n#include <set>\n#include <sstream>\n#include <string>\n#include <type_traits>\n#include <utility>\n#include <vector>\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// The MATCHER* family of macros can be used in a namespace scope to\n// define custom matchers easily.\n//\n// Basic Usage\n// ===========\n//\n// The syntax\n//\n//   MATCHER(name, description_string) { statements; }\n//\n// defines a matcher with the given name that executes the statements,\n// which must return a bool to indicate if the match succeeds.  Inside\n// the statements, you can refer to the value being matched by 'arg',\n// and refer to its type by 'arg_type'.\n//\n// The description string documents what the matcher does, and is used\n// to generate the failure message when the match fails.  Since a\n// MATCHER() is usually defined in a header file shared by multiple\n// C++ source files, we require the description to be a C-string\n// literal to avoid possible side effects.  It can be empty, in which\n// case we'll use the sequence of words in the matcher name as the\n// description.\n//\n// For example:\n//\n//   MATCHER(IsEven, \"\") { return (arg % 2) == 0; }\n//\n// allows you to write\n//\n//   // Expects mock_foo.Bar(n) to be called where n is even.\n//   EXPECT_CALL(mock_foo, Bar(IsEven()));\n//\n// or,\n//\n//   // Verifies that the value of some_expression is even.\n//   EXPECT_THAT(some_expression, IsEven());\n//\n// If the above assertion fails, it will print something like:\n//\n//   Value of: some_expression\n//   Expected: is even\n//     Actual: 7\n//\n// where the description \"is even\" is automatically calculated from the\n// matcher name IsEven.\n//\n// Argument Type\n// =============\n//\n// Note that the type of the value being matched (arg_type) is\n// determined by the context in which you use the matcher and is\n// supplied to you by the compiler, so you don't need to worry about\n// declaring it (nor can you).  This allows the matcher to be\n// polymorphic.  For example, IsEven() can be used to match any type\n// where the value of \"(arg % 2) == 0\" can be implicitly converted to\n// a bool.  In the \"Bar(IsEven())\" example above, if method Bar()\n// takes an int, 'arg_type' will be int; if it takes an unsigned long,\n// 'arg_type' will be unsigned long; and so on.\n//\n// Parameterizing Matchers\n// =======================\n//\n// Sometimes you'll want to parameterize the matcher.  For that you\n// can use another macro:\n//\n//   MATCHER_P(name, param_name, description_string) { statements; }\n//\n// For example:\n//\n//   MATCHER_P(HasAbsoluteValue, value, \"\") { return abs(arg) == value; }\n//\n// will allow you to write:\n//\n//   EXPECT_THAT(Blah(\"a\"), HasAbsoluteValue(n));\n//\n// which may lead to this message (assuming n is 10):\n//\n//   Value of: Blah(\"a\")\n//   Expected: has absolute value 10\n//     Actual: -9\n//\n// Note that both the matcher description and its parameter are\n// printed, making the message human-friendly.\n//\n// In the matcher definition body, you can write 'foo_type' to\n// reference the type of a parameter named 'foo'.  For example, in the\n// body of MATCHER_P(HasAbsoluteValue, value) above, you can write\n// 'value_type' to refer to the type of 'value'.\n//\n// We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P$n to\n// support multi-parameter matchers.\n//\n// Describing Parameterized Matchers\n// =================================\n//\n// The last argument to MATCHER*() is a string-typed expression.  The\n// expression can reference all of the matcher's parameters and a\n// special bool-typed variable named 'negation'.  When 'negation' is\n// false, the expression should evaluate to the matcher's description;\n// otherwise it should evaluate to the description of the negation of\n// the matcher.  For example,\n//\n//   using testing::PrintToString;\n//\n//   MATCHER_P2(InClosedRange, low, hi,\n//       std::string(negation ? \"is not\" : \"is\") + \" in range [\" +\n//       PrintToString(low) + \", \" + PrintToString(hi) + \"]\") {\n//     return low <= arg && arg <= hi;\n//   }\n//   ...\n//   EXPECT_THAT(3, InClosedRange(4, 6));\n//   EXPECT_THAT(3, Not(InClosedRange(2, 4)));\n//\n// would generate two failures that contain the text:\n//\n//   Expected: is in range [4, 6]\n//   ...\n//   Expected: is not in range [2, 4]\n//\n// If you specify \"\" as the description, the failure message will\n// contain the sequence of words in the matcher name followed by the\n// parameter values printed as a tuple.  For example,\n//\n//   MATCHER_P2(InClosedRange, low, hi, \"\") { ... }\n//   ...\n//   EXPECT_THAT(3, InClosedRange(4, 6));\n//   EXPECT_THAT(3, Not(InClosedRange(2, 4)));\n//\n// would generate two failures that contain the text:\n//\n//   Expected: in closed range (4, 6)\n//   ...\n//   Expected: not (in closed range (2, 4))\n//\n// Types of Matcher Parameters\n// ===========================\n//\n// For the purpose of typing, you can view\n//\n//   MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... }\n//\n// as shorthand for\n//\n//   template <typename p1_type, ..., typename pk_type>\n//   FooMatcherPk<p1_type, ..., pk_type>\n//   Foo(p1_type p1, ..., pk_type pk) { ... }\n//\n// When you write Foo(v1, ..., vk), the compiler infers the types of\n// the parameters v1, ..., and vk for you.  If you are not happy with\n// the result of the type inference, you can specify the types by\n// explicitly instantiating the template, as in Foo<long, bool>(5,\n// false).  As said earlier, you don't get to (or need to) specify\n// 'arg_type' as that's determined by the context in which the matcher\n// is used.  You can assign the result of expression Foo(p1, ..., pk)\n// to a variable of type FooMatcherPk<p1_type, ..., pk_type>.  This\n// can be useful when composing matchers.\n//\n// While you can instantiate a matcher template with reference types,\n// passing the parameters by pointer usually makes your code more\n// readable.  If, however, you still want to pass a parameter by\n// reference, be aware that in the failure message generated by the\n// matcher you will see the value of the referenced object but not its\n// address.\n//\n// Explaining Match Results\n// ========================\n//\n// Sometimes the matcher description alone isn't enough to explain why\n// the match has failed or succeeded.  For example, when expecting a\n// long string, it can be very helpful to also print the diff between\n// the expected string and the actual one.  To achieve that, you can\n// optionally stream additional information to a special variable\n// named result_listener, whose type is a pointer to class\n// MatchResultListener:\n//\n//   MATCHER_P(EqualsLongString, str, \"\") {\n//     if (arg == str) return true;\n//\n//     *result_listener << \"the difference: \"\n///                     << DiffStrings(str, arg);\n//     return false;\n//   }\n//\n// Overloading Matchers\n// ====================\n//\n// You can overload matchers with different numbers of parameters:\n//\n//   MATCHER_P(Blah, a, description_string1) { ... }\n//   MATCHER_P2(Blah, a, b, description_string2) { ... }\n//\n// Caveats\n// =======\n//\n// When defining a new matcher, you should also consider implementing\n// MatcherInterface or using MakePolymorphicMatcher().  These\n// approaches require more work than the MATCHER* macros, but also\n// give you more control on the types of the value being matched and\n// the matcher parameters, which may leads to better compiler error\n// messages when the matcher is used wrong.  They also allow\n// overloading matchers based on parameter types (as opposed to just\n// based on the number of parameters).\n//\n// MATCHER*() can only be used in a namespace scope as templates cannot be\n// declared inside of a local class.\n//\n// More Information\n// ================\n//\n// To learn more about using these macros, please search for 'MATCHER'\n// on\n// https://github.com/google/googletest/blob/master/docs/gmock_cook_book.md\n//\n// This file also implements some commonly used argument matchers.  More\n// matchers can be defined by the user implementing the\n// MatcherInterface<T> interface if necessary.\n//\n// See googletest/include/gtest/gtest-matchers.h for the definition of class\n// Matcher, class MatcherInterface, and others.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_\n#define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_\n\n#include <algorithm>\n#include <cmath>\n#include <initializer_list>\n#include <iterator>\n#include <limits>\n#include <memory>\n#include <ostream>  // NOLINT\n#include <sstream>\n#include <string>\n#include <type_traits>\n#include <utility>\n#include <vector>\n\n\n// MSVC warning C5046 is new as of VS2017 version 15.8.\n#if defined(_MSC_VER) && _MSC_VER >= 1915\n#define GMOCK_MAYBE_5046_ 5046\n#else\n#define GMOCK_MAYBE_5046_\n#endif\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(\n    4251 GMOCK_MAYBE_5046_ /* class A needs to have dll-interface to be used by\n                              clients of class B */\n    /* Symbol involving type with internal linkage not defined */)\n\nnamespace testing {\n\n// To implement a matcher Foo for type T, define:\n//   1. a class FooMatcherImpl that implements the\n//      MatcherInterface<T> interface, and\n//   2. a factory function that creates a Matcher<T> object from a\n//      FooMatcherImpl*.\n//\n// The two-level delegation design makes it possible to allow a user\n// to write \"v\" instead of \"Eq(v)\" where a Matcher is expected, which\n// is impossible if we pass matchers by pointers.  It also eases\n// ownership management as Matcher objects can now be copied like\n// plain values.\n\n// A match result listener that stores the explanation in a string.\nclass StringMatchResultListener : public MatchResultListener {\n public:\n  StringMatchResultListener() : MatchResultListener(&ss_) {}\n\n  // Returns the explanation accumulated so far.\n  std::string str() const { return ss_.str(); }\n\n  // Clears the explanation accumulated so far.\n  void Clear() { ss_.str(\"\"); }\n\n private:\n  ::std::stringstream ss_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(StringMatchResultListener);\n};\n\n// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION\n// and MUST NOT BE USED IN USER CODE!!!\nnamespace internal {\n\n// The MatcherCastImpl class template is a helper for implementing\n// MatcherCast().  We need this helper in order to partially\n// specialize the implementation of MatcherCast() (C++ allows\n// class/struct templates to be partially specialized, but not\n// function templates.).\n\n// This general version is used when MatcherCast()'s argument is a\n// polymorphic matcher (i.e. something that can be converted to a\n// Matcher but is not one yet; for example, Eq(value)) or a value (for\n// example, \"hello\").\ntemplate <typename T, typename M>\nclass MatcherCastImpl {\n public:\n  static Matcher<T> Cast(const M& polymorphic_matcher_or_value) {\n    // M can be a polymorphic matcher, in which case we want to use\n    // its conversion operator to create Matcher<T>.  Or it can be a value\n    // that should be passed to the Matcher<T>'s constructor.\n    //\n    // We can't call Matcher<T>(polymorphic_matcher_or_value) when M is a\n    // polymorphic matcher because it'll be ambiguous if T has an implicit\n    // constructor from M (this usually happens when T has an implicit\n    // constructor from any type).\n    //\n    // It won't work to unconditionally implicit_cast\n    // polymorphic_matcher_or_value to Matcher<T> because it won't trigger\n    // a user-defined conversion from M to T if one exists (assuming M is\n    // a value).\n    return CastImpl(polymorphic_matcher_or_value,\n                    std::is_convertible<M, Matcher<T>>{},\n                    std::is_convertible<M, T>{});\n  }\n\n private:\n  template <bool Ignore>\n  static Matcher<T> CastImpl(const M& polymorphic_matcher_or_value,\n                             std::true_type /* convertible_to_matcher */,\n                             std::integral_constant<bool, Ignore>) {\n    // M is implicitly convertible to Matcher<T>, which means that either\n    // M is a polymorphic matcher or Matcher<T> has an implicit constructor\n    // from M.  In both cases using the implicit conversion will produce a\n    // matcher.\n    //\n    // Even if T has an implicit constructor from M, it won't be called because\n    // creating Matcher<T> would require a chain of two user-defined conversions\n    // (first to create T from M and then to create Matcher<T> from T).\n    return polymorphic_matcher_or_value;\n  }\n\n  // M can't be implicitly converted to Matcher<T>, so M isn't a polymorphic\n  // matcher. It's a value of a type implicitly convertible to T. Use direct\n  // initialization to create a matcher.\n  static Matcher<T> CastImpl(const M& value,\n                             std::false_type /* convertible_to_matcher */,\n                             std::true_type /* convertible_to_T */) {\n    return Matcher<T>(ImplicitCast_<T>(value));\n  }\n\n  // M can't be implicitly converted to either Matcher<T> or T. Attempt to use\n  // polymorphic matcher Eq(value) in this case.\n  //\n  // Note that we first attempt to perform an implicit cast on the value and\n  // only fall back to the polymorphic Eq() matcher afterwards because the\n  // latter calls bool operator==(const Lhs& lhs, const Rhs& rhs) in the end\n  // which might be undefined even when Rhs is implicitly convertible to Lhs\n  // (e.g. std::pair<const int, int> vs. std::pair<int, int>).\n  //\n  // We don't define this method inline as we need the declaration of Eq().\n  static Matcher<T> CastImpl(const M& value,\n                             std::false_type /* convertible_to_matcher */,\n                             std::false_type /* convertible_to_T */);\n};\n\n// This more specialized version is used when MatcherCast()'s argument\n// is already a Matcher.  This only compiles when type T can be\n// statically converted to type U.\ntemplate <typename T, typename U>\nclass MatcherCastImpl<T, Matcher<U> > {\n public:\n  static Matcher<T> Cast(const Matcher<U>& source_matcher) {\n    return Matcher<T>(new Impl(source_matcher));\n  }\n\n private:\n  class Impl : public MatcherInterface<T> {\n   public:\n    explicit Impl(const Matcher<U>& source_matcher)\n        : source_matcher_(source_matcher) {}\n\n    // We delegate the matching logic to the source matcher.\n    bool MatchAndExplain(T x, MatchResultListener* listener) const override {\n      using FromType = typename std::remove_cv<typename std::remove_pointer<\n          typename std::remove_reference<T>::type>::type>::type;\n      using ToType = typename std::remove_cv<typename std::remove_pointer<\n          typename std::remove_reference<U>::type>::type>::type;\n      // Do not allow implicitly converting base*/& to derived*/&.\n      static_assert(\n          // Do not trigger if only one of them is a pointer. That implies a\n          // regular conversion and not a down_cast.\n          (std::is_pointer<typename std::remove_reference<T>::type>::value !=\n           std::is_pointer<typename std::remove_reference<U>::type>::value) ||\n              std::is_same<FromType, ToType>::value ||\n              !std::is_base_of<FromType, ToType>::value,\n          \"Can't implicitly convert from <base> to <derived>\");\n\n      // Do the cast to `U` explicitly if necessary.\n      // Otherwise, let implicit conversions do the trick.\n      using CastType =\n          typename std::conditional<std::is_convertible<T&, const U&>::value,\n                                    T&, U>::type;\n\n      return source_matcher_.MatchAndExplain(static_cast<CastType>(x),\n                                             listener);\n    }\n\n    void DescribeTo(::std::ostream* os) const override {\n      source_matcher_.DescribeTo(os);\n    }\n\n    void DescribeNegationTo(::std::ostream* os) const override {\n      source_matcher_.DescribeNegationTo(os);\n    }\n\n   private:\n    const Matcher<U> source_matcher_;\n  };\n};\n\n// This even more specialized version is used for efficiently casting\n// a matcher to its own type.\ntemplate <typename T>\nclass MatcherCastImpl<T, Matcher<T> > {\n public:\n  static Matcher<T> Cast(const Matcher<T>& matcher) { return matcher; }\n};\n\n// Template specialization for parameterless Matcher.\ntemplate <typename Derived>\nclass MatcherBaseImpl {\n public:\n  MatcherBaseImpl() = default;\n\n  template <typename T>\n  operator ::testing::Matcher<T>() const {  // NOLINT(runtime/explicit)\n    return ::testing::Matcher<T>(new\n                                 typename Derived::template gmock_Impl<T>());\n  }\n};\n\n// Template specialization for Matcher with parameters.\ntemplate <template <typename...> class Derived, typename... Ts>\nclass MatcherBaseImpl<Derived<Ts...>> {\n public:\n  // Mark the constructor explicit for single argument T to avoid implicit\n  // conversions.\n  template <typename E = std::enable_if<sizeof...(Ts) == 1>,\n            typename E::type* = nullptr>\n  explicit MatcherBaseImpl(Ts... params)\n      : params_(std::forward<Ts>(params)...) {}\n  template <typename E = std::enable_if<sizeof...(Ts) != 1>,\n            typename = typename E::type>\n  MatcherBaseImpl(Ts... params)  // NOLINT\n      : params_(std::forward<Ts>(params)...) {}\n\n  template <typename F>\n  operator ::testing::Matcher<F>() const {  // NOLINT(runtime/explicit)\n    return Apply<F>(MakeIndexSequence<sizeof...(Ts)>{});\n  }\n\n private:\n  template <typename F, std::size_t... tuple_ids>\n  ::testing::Matcher<F> Apply(IndexSequence<tuple_ids...>) const {\n    return ::testing::Matcher<F>(\n        new typename Derived<Ts...>::template gmock_Impl<F>(\n            std::get<tuple_ids>(params_)...));\n  }\n\n  const std::tuple<Ts...> params_;\n};\n\n}  // namespace internal\n\n// In order to be safe and clear, casting between different matcher\n// types is done explicitly via MatcherCast<T>(m), which takes a\n// matcher m and returns a Matcher<T>.  It compiles only when T can be\n// statically converted to the argument type of m.\ntemplate <typename T, typename M>\ninline Matcher<T> MatcherCast(const M& matcher) {\n  return internal::MatcherCastImpl<T, M>::Cast(matcher);\n}\n\n// This overload handles polymorphic matchers and values only since\n// monomorphic matchers are handled by the next one.\ntemplate <typename T, typename M>\ninline Matcher<T> SafeMatcherCast(const M& polymorphic_matcher_or_value) {\n  return MatcherCast<T>(polymorphic_matcher_or_value);\n}\n\n// This overload handles monomorphic matchers.\n//\n// In general, if type T can be implicitly converted to type U, we can\n// safely convert a Matcher<U> to a Matcher<T> (i.e. Matcher is\n// contravariant): just keep a copy of the original Matcher<U>, convert the\n// argument from type T to U, and then pass it to the underlying Matcher<U>.\n// The only exception is when U is a reference and T is not, as the\n// underlying Matcher<U> may be interested in the argument's address, which\n// is not preserved in the conversion from T to U.\ntemplate <typename T, typename U>\ninline Matcher<T> SafeMatcherCast(const Matcher<U>& matcher) {\n  // Enforce that T can be implicitly converted to U.\n  static_assert(std::is_convertible<const T&, const U&>::value,\n                \"T must be implicitly convertible to U\");\n  // Enforce that we are not converting a non-reference type T to a reference\n  // type U.\n  GTEST_COMPILE_ASSERT_(\n      std::is_reference<T>::value || !std::is_reference<U>::value,\n      cannot_convert_non_reference_arg_to_reference);\n  // In case both T and U are arithmetic types, enforce that the\n  // conversion is not lossy.\n  typedef GTEST_REMOVE_REFERENCE_AND_CONST_(T) RawT;\n  typedef GTEST_REMOVE_REFERENCE_AND_CONST_(U) RawU;\n  constexpr bool kTIsOther = GMOCK_KIND_OF_(RawT) == internal::kOther;\n  constexpr bool kUIsOther = GMOCK_KIND_OF_(RawU) == internal::kOther;\n  GTEST_COMPILE_ASSERT_(\n      kTIsOther || kUIsOther ||\n      (internal::LosslessArithmeticConvertible<RawT, RawU>::value),\n      conversion_of_arithmetic_types_must_be_lossless);\n  return MatcherCast<T>(matcher);\n}\n\n// A<T>() returns a matcher that matches any value of type T.\ntemplate <typename T>\nMatcher<T> A();\n\n// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION\n// and MUST NOT BE USED IN USER CODE!!!\nnamespace internal {\n\n// If the explanation is not empty, prints it to the ostream.\ninline void PrintIfNotEmpty(const std::string& explanation,\n                            ::std::ostream* os) {\n  if (explanation != \"\" && os != nullptr) {\n    *os << \", \" << explanation;\n  }\n}\n\n// Returns true if the given type name is easy to read by a human.\n// This is used to decide whether printing the type of a value might\n// be helpful.\ninline bool IsReadableTypeName(const std::string& type_name) {\n  // We consider a type name readable if it's short or doesn't contain\n  // a template or function type.\n  return (type_name.length() <= 20 ||\n          type_name.find_first_of(\"<(\") == std::string::npos);\n}\n\n// Matches the value against the given matcher, prints the value and explains\n// the match result to the listener. Returns the match result.\n// 'listener' must not be NULL.\n// Value cannot be passed by const reference, because some matchers take a\n// non-const argument.\ntemplate <typename Value, typename T>\nbool MatchPrintAndExplain(Value& value, const Matcher<T>& matcher,\n                          MatchResultListener* listener) {\n  if (!listener->IsInterested()) {\n    // If the listener is not interested, we do not need to construct the\n    // inner explanation.\n    return matcher.Matches(value);\n  }\n\n  StringMatchResultListener inner_listener;\n  const bool match = matcher.MatchAndExplain(value, &inner_listener);\n\n  UniversalPrint(value, listener->stream());\n#if GTEST_HAS_RTTI\n  const std::string& type_name = GetTypeName<Value>();\n  if (IsReadableTypeName(type_name))\n    *listener->stream() << \" (of type \" << type_name << \")\";\n#endif\n  PrintIfNotEmpty(inner_listener.str(), listener->stream());\n\n  return match;\n}\n\n// An internal helper class for doing compile-time loop on a tuple's\n// fields.\ntemplate <size_t N>\nclass TuplePrefix {\n public:\n  // TuplePrefix<N>::Matches(matcher_tuple, value_tuple) returns true\n  // if and only if the first N fields of matcher_tuple matches\n  // the first N fields of value_tuple, respectively.\n  template <typename MatcherTuple, typename ValueTuple>\n  static bool Matches(const MatcherTuple& matcher_tuple,\n                      const ValueTuple& value_tuple) {\n    return TuplePrefix<N - 1>::Matches(matcher_tuple, value_tuple) &&\n           std::get<N - 1>(matcher_tuple).Matches(std::get<N - 1>(value_tuple));\n  }\n\n  // TuplePrefix<N>::ExplainMatchFailuresTo(matchers, values, os)\n  // describes failures in matching the first N fields of matchers\n  // against the first N fields of values.  If there is no failure,\n  // nothing will be streamed to os.\n  template <typename MatcherTuple, typename ValueTuple>\n  static void ExplainMatchFailuresTo(const MatcherTuple& matchers,\n                                     const ValueTuple& values,\n                                     ::std::ostream* os) {\n    // First, describes failures in the first N - 1 fields.\n    TuplePrefix<N - 1>::ExplainMatchFailuresTo(matchers, values, os);\n\n    // Then describes the failure (if any) in the (N - 1)-th (0-based)\n    // field.\n    typename std::tuple_element<N - 1, MatcherTuple>::type matcher =\n        std::get<N - 1>(matchers);\n    typedef typename std::tuple_element<N - 1, ValueTuple>::type Value;\n    const Value& value = std::get<N - 1>(values);\n    StringMatchResultListener listener;\n    if (!matcher.MatchAndExplain(value, &listener)) {\n      *os << \"  Expected arg #\" << N - 1 << \": \";\n      std::get<N - 1>(matchers).DescribeTo(os);\n      *os << \"\\n           Actual: \";\n      // We remove the reference in type Value to prevent the\n      // universal printer from printing the address of value, which\n      // isn't interesting to the user most of the time.  The\n      // matcher's MatchAndExplain() method handles the case when\n      // the address is interesting.\n      internal::UniversalPrint(value, os);\n      PrintIfNotEmpty(listener.str(), os);\n      *os << \"\\n\";\n    }\n  }\n};\n\n// The base case.\ntemplate <>\nclass TuplePrefix<0> {\n public:\n  template <typename MatcherTuple, typename ValueTuple>\n  static bool Matches(const MatcherTuple& /* matcher_tuple */,\n                      const ValueTuple& /* value_tuple */) {\n    return true;\n  }\n\n  template <typename MatcherTuple, typename ValueTuple>\n  static void ExplainMatchFailuresTo(const MatcherTuple& /* matchers */,\n                                     const ValueTuple& /* values */,\n                                     ::std::ostream* /* os */) {}\n};\n\n// TupleMatches(matcher_tuple, value_tuple) returns true if and only if\n// all matchers in matcher_tuple match the corresponding fields in\n// value_tuple.  It is a compiler error if matcher_tuple and\n// value_tuple have different number of fields or incompatible field\n// types.\ntemplate <typename MatcherTuple, typename ValueTuple>\nbool TupleMatches(const MatcherTuple& matcher_tuple,\n                  const ValueTuple& value_tuple) {\n  // Makes sure that matcher_tuple and value_tuple have the same\n  // number of fields.\n  GTEST_COMPILE_ASSERT_(std::tuple_size<MatcherTuple>::value ==\n                            std::tuple_size<ValueTuple>::value,\n                        matcher_and_value_have_different_numbers_of_fields);\n  return TuplePrefix<std::tuple_size<ValueTuple>::value>::Matches(matcher_tuple,\n                                                                  value_tuple);\n}\n\n// Describes failures in matching matchers against values.  If there\n// is no failure, nothing will be streamed to os.\ntemplate <typename MatcherTuple, typename ValueTuple>\nvoid ExplainMatchFailureTupleTo(const MatcherTuple& matchers,\n                                const ValueTuple& values,\n                                ::std::ostream* os) {\n  TuplePrefix<std::tuple_size<MatcherTuple>::value>::ExplainMatchFailuresTo(\n      matchers, values, os);\n}\n\n// TransformTupleValues and its helper.\n//\n// TransformTupleValuesHelper hides the internal machinery that\n// TransformTupleValues uses to implement a tuple traversal.\ntemplate <typename Tuple, typename Func, typename OutIter>\nclass TransformTupleValuesHelper {\n private:\n  typedef ::std::tuple_size<Tuple> TupleSize;\n\n public:\n  // For each member of tuple 't', taken in order, evaluates '*out++ = f(t)'.\n  // Returns the final value of 'out' in case the caller needs it.\n  static OutIter Run(Func f, const Tuple& t, OutIter out) {\n    return IterateOverTuple<Tuple, TupleSize::value>()(f, t, out);\n  }\n\n private:\n  template <typename Tup, size_t kRemainingSize>\n  struct IterateOverTuple {\n    OutIter operator() (Func f, const Tup& t, OutIter out) const {\n      *out++ = f(::std::get<TupleSize::value - kRemainingSize>(t));\n      return IterateOverTuple<Tup, kRemainingSize - 1>()(f, t, out);\n    }\n  };\n  template <typename Tup>\n  struct IterateOverTuple<Tup, 0> {\n    OutIter operator() (Func /* f */, const Tup& /* t */, OutIter out) const {\n      return out;\n    }\n  };\n};\n\n// Successively invokes 'f(element)' on each element of the tuple 't',\n// appending each result to the 'out' iterator. Returns the final value\n// of 'out'.\ntemplate <typename Tuple, typename Func, typename OutIter>\nOutIter TransformTupleValues(Func f, const Tuple& t, OutIter out) {\n  return TransformTupleValuesHelper<Tuple, Func, OutIter>::Run(f, t, out);\n}\n\n// Implements _, a matcher that matches any value of any\n// type.  This is a polymorphic matcher, so we need a template type\n// conversion operator to make it appearing as a Matcher<T> for any\n// type T.\nclass AnythingMatcher {\n public:\n  using is_gtest_matcher = void;\n\n  template <typename T>\n  bool MatchAndExplain(const T& /* x */, std::ostream* /* listener */) const {\n    return true;\n  }\n  void DescribeTo(std::ostream* os) const { *os << \"is anything\"; }\n  void DescribeNegationTo(::std::ostream* os) const {\n    // This is mostly for completeness' sake, as it's not very useful\n    // to write Not(A<bool>()).  However we cannot completely rule out\n    // such a possibility, and it doesn't hurt to be prepared.\n    *os << \"never matches\";\n  }\n};\n\n// Implements the polymorphic IsNull() matcher, which matches any raw or smart\n// pointer that is NULL.\nclass IsNullMatcher {\n public:\n  template <typename Pointer>\n  bool MatchAndExplain(const Pointer& p,\n                       MatchResultListener* /* listener */) const {\n    return p == nullptr;\n  }\n\n  void DescribeTo(::std::ostream* os) const { *os << \"is NULL\"; }\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"isn't NULL\";\n  }\n};\n\n// Implements the polymorphic NotNull() matcher, which matches any raw or smart\n// pointer that is not NULL.\nclass NotNullMatcher {\n public:\n  template <typename Pointer>\n  bool MatchAndExplain(const Pointer& p,\n                       MatchResultListener* /* listener */) const {\n    return p != nullptr;\n  }\n\n  void DescribeTo(::std::ostream* os) const { *os << \"isn't NULL\"; }\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"is NULL\";\n  }\n};\n\n// Ref(variable) matches any argument that is a reference to\n// 'variable'.  This matcher is polymorphic as it can match any\n// super type of the type of 'variable'.\n//\n// The RefMatcher template class implements Ref(variable).  It can\n// only be instantiated with a reference type.  This prevents a user\n// from mistakenly using Ref(x) to match a non-reference function\n// argument.  For example, the following will righteously cause a\n// compiler error:\n//\n//   int n;\n//   Matcher<int> m1 = Ref(n);   // This won't compile.\n//   Matcher<int&> m2 = Ref(n);  // This will compile.\ntemplate <typename T>\nclass RefMatcher;\n\ntemplate <typename T>\nclass RefMatcher<T&> {\n  // Google Mock is a generic framework and thus needs to support\n  // mocking any function types, including those that take non-const\n  // reference arguments.  Therefore the template parameter T (and\n  // Super below) can be instantiated to either a const type or a\n  // non-const type.\n public:\n  // RefMatcher() takes a T& instead of const T&, as we want the\n  // compiler to catch using Ref(const_value) as a matcher for a\n  // non-const reference.\n  explicit RefMatcher(T& x) : object_(x) {}  // NOLINT\n\n  template <typename Super>\n  operator Matcher<Super&>() const {\n    // By passing object_ (type T&) to Impl(), which expects a Super&,\n    // we make sure that Super is a super type of T.  In particular,\n    // this catches using Ref(const_value) as a matcher for a\n    // non-const reference, as you cannot implicitly convert a const\n    // reference to a non-const reference.\n    return MakeMatcher(new Impl<Super>(object_));\n  }\n\n private:\n  template <typename Super>\n  class Impl : public MatcherInterface<Super&> {\n   public:\n    explicit Impl(Super& x) : object_(x) {}  // NOLINT\n\n    // MatchAndExplain() takes a Super& (as opposed to const Super&)\n    // in order to match the interface MatcherInterface<Super&>.\n    bool MatchAndExplain(Super& x,\n                         MatchResultListener* listener) const override {\n      *listener << \"which is located @\" << static_cast<const void*>(&x);\n      return &x == &object_;\n    }\n\n    void DescribeTo(::std::ostream* os) const override {\n      *os << \"references the variable \";\n      UniversalPrinter<Super&>::Print(object_, os);\n    }\n\n    void DescribeNegationTo(::std::ostream* os) const override {\n      *os << \"does not reference the variable \";\n      UniversalPrinter<Super&>::Print(object_, os);\n    }\n\n   private:\n    const Super& object_;\n  };\n\n  T& object_;\n};\n\n// Polymorphic helper functions for narrow and wide string matchers.\ninline bool CaseInsensitiveCStringEquals(const char* lhs, const char* rhs) {\n  return String::CaseInsensitiveCStringEquals(lhs, rhs);\n}\n\ninline bool CaseInsensitiveCStringEquals(const wchar_t* lhs,\n                                         const wchar_t* rhs) {\n  return String::CaseInsensitiveWideCStringEquals(lhs, rhs);\n}\n\n// String comparison for narrow or wide strings that can have embedded NUL\n// characters.\ntemplate <typename StringType>\nbool CaseInsensitiveStringEquals(const StringType& s1,\n                                 const StringType& s2) {\n  // Are the heads equal?\n  if (!CaseInsensitiveCStringEquals(s1.c_str(), s2.c_str())) {\n    return false;\n  }\n\n  // Skip the equal heads.\n  const typename StringType::value_type nul = 0;\n  const size_t i1 = s1.find(nul), i2 = s2.find(nul);\n\n  // Are we at the end of either s1 or s2?\n  if (i1 == StringType::npos || i2 == StringType::npos) {\n    return i1 == i2;\n  }\n\n  // Are the tails equal?\n  return CaseInsensitiveStringEquals(s1.substr(i1 + 1), s2.substr(i2 + 1));\n}\n\n// String matchers.\n\n// Implements equality-based string matchers like StrEq, StrCaseNe, and etc.\ntemplate <typename StringType>\nclass StrEqualityMatcher {\n public:\n  StrEqualityMatcher(StringType str, bool expect_eq, bool case_sensitive)\n      : string_(std::move(str)),\n        expect_eq_(expect_eq),\n        case_sensitive_(case_sensitive) {}\n\n#if GTEST_INTERNAL_HAS_STRING_VIEW\n  bool MatchAndExplain(const internal::StringView& s,\n                       MatchResultListener* listener) const {\n    // This should fail to compile if StringView is used with wide\n    // strings.\n    const StringType& str = std::string(s);\n    return MatchAndExplain(str, listener);\n  }\n#endif  // GTEST_INTERNAL_HAS_STRING_VIEW\n\n  // Accepts pointer types, particularly:\n  //   const char*\n  //   char*\n  //   const wchar_t*\n  //   wchar_t*\n  template <typename CharType>\n  bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {\n    if (s == nullptr) {\n      return !expect_eq_;\n    }\n    return MatchAndExplain(StringType(s), listener);\n  }\n\n  // Matches anything that can convert to StringType.\n  //\n  // This is a template, not just a plain function with const StringType&,\n  // because StringView has some interfering non-explicit constructors.\n  template <typename MatcheeStringType>\n  bool MatchAndExplain(const MatcheeStringType& s,\n                       MatchResultListener* /* listener */) const {\n    const StringType s2(s);\n    const bool eq = case_sensitive_ ? s2 == string_ :\n        CaseInsensitiveStringEquals(s2, string_);\n    return expect_eq_ == eq;\n  }\n\n  void DescribeTo(::std::ostream* os) const {\n    DescribeToHelper(expect_eq_, os);\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const {\n    DescribeToHelper(!expect_eq_, os);\n  }\n\n private:\n  void DescribeToHelper(bool expect_eq, ::std::ostream* os) const {\n    *os << (expect_eq ? \"is \" : \"isn't \");\n    *os << \"equal to \";\n    if (!case_sensitive_) {\n      *os << \"(ignoring case) \";\n    }\n    UniversalPrint(string_, os);\n  }\n\n  const StringType string_;\n  const bool expect_eq_;\n  const bool case_sensitive_;\n};\n\n// Implements the polymorphic HasSubstr(substring) matcher, which\n// can be used as a Matcher<T> as long as T can be converted to a\n// string.\ntemplate <typename StringType>\nclass HasSubstrMatcher {\n public:\n  explicit HasSubstrMatcher(const StringType& substring)\n      : substring_(substring) {}\n\n#if GTEST_INTERNAL_HAS_STRING_VIEW\n  bool MatchAndExplain(const internal::StringView& s,\n                       MatchResultListener* listener) const {\n    // This should fail to compile if StringView is used with wide\n    // strings.\n    const StringType& str = std::string(s);\n    return MatchAndExplain(str, listener);\n  }\n#endif  // GTEST_INTERNAL_HAS_STRING_VIEW\n\n  // Accepts pointer types, particularly:\n  //   const char*\n  //   char*\n  //   const wchar_t*\n  //   wchar_t*\n  template <typename CharType>\n  bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {\n    return s != nullptr && MatchAndExplain(StringType(s), listener);\n  }\n\n  // Matches anything that can convert to StringType.\n  //\n  // This is a template, not just a plain function with const StringType&,\n  // because StringView has some interfering non-explicit constructors.\n  template <typename MatcheeStringType>\n  bool MatchAndExplain(const MatcheeStringType& s,\n                       MatchResultListener* /* listener */) const {\n    return StringType(s).find(substring_) != StringType::npos;\n  }\n\n  // Describes what this matcher matches.\n  void DescribeTo(::std::ostream* os) const {\n    *os << \"has substring \";\n    UniversalPrint(substring_, os);\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"has no substring \";\n    UniversalPrint(substring_, os);\n  }\n\n private:\n  const StringType substring_;\n};\n\n// Implements the polymorphic StartsWith(substring) matcher, which\n// can be used as a Matcher<T> as long as T can be converted to a\n// string.\ntemplate <typename StringType>\nclass StartsWithMatcher {\n public:\n  explicit StartsWithMatcher(const StringType& prefix) : prefix_(prefix) {\n  }\n\n#if GTEST_INTERNAL_HAS_STRING_VIEW\n  bool MatchAndExplain(const internal::StringView& s,\n                       MatchResultListener* listener) const {\n    // This should fail to compile if StringView is used with wide\n    // strings.\n    const StringType& str = std::string(s);\n    return MatchAndExplain(str, listener);\n  }\n#endif  // GTEST_INTERNAL_HAS_STRING_VIEW\n\n  // Accepts pointer types, particularly:\n  //   const char*\n  //   char*\n  //   const wchar_t*\n  //   wchar_t*\n  template <typename CharType>\n  bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {\n    return s != nullptr && MatchAndExplain(StringType(s), listener);\n  }\n\n  // Matches anything that can convert to StringType.\n  //\n  // This is a template, not just a plain function with const StringType&,\n  // because StringView has some interfering non-explicit constructors.\n  template <typename MatcheeStringType>\n  bool MatchAndExplain(const MatcheeStringType& s,\n                       MatchResultListener* /* listener */) const {\n    const StringType& s2(s);\n    return s2.length() >= prefix_.length() &&\n        s2.substr(0, prefix_.length()) == prefix_;\n  }\n\n  void DescribeTo(::std::ostream* os) const {\n    *os << \"starts with \";\n    UniversalPrint(prefix_, os);\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"doesn't start with \";\n    UniversalPrint(prefix_, os);\n  }\n\n private:\n  const StringType prefix_;\n};\n\n// Implements the polymorphic EndsWith(substring) matcher, which\n// can be used as a Matcher<T> as long as T can be converted to a\n// string.\ntemplate <typename StringType>\nclass EndsWithMatcher {\n public:\n  explicit EndsWithMatcher(const StringType& suffix) : suffix_(suffix) {}\n\n#if GTEST_INTERNAL_HAS_STRING_VIEW\n  bool MatchAndExplain(const internal::StringView& s,\n                       MatchResultListener* listener) const {\n    // This should fail to compile if StringView is used with wide\n    // strings.\n    const StringType& str = std::string(s);\n    return MatchAndExplain(str, listener);\n  }\n#endif  // GTEST_INTERNAL_HAS_STRING_VIEW\n\n  // Accepts pointer types, particularly:\n  //   const char*\n  //   char*\n  //   const wchar_t*\n  //   wchar_t*\n  template <typename CharType>\n  bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {\n    return s != nullptr && MatchAndExplain(StringType(s), listener);\n  }\n\n  // Matches anything that can convert to StringType.\n  //\n  // This is a template, not just a plain function with const StringType&,\n  // because StringView has some interfering non-explicit constructors.\n  template <typename MatcheeStringType>\n  bool MatchAndExplain(const MatcheeStringType& s,\n                       MatchResultListener* /* listener */) const {\n    const StringType& s2(s);\n    return s2.length() >= suffix_.length() &&\n        s2.substr(s2.length() - suffix_.length()) == suffix_;\n  }\n\n  void DescribeTo(::std::ostream* os) const {\n    *os << \"ends with \";\n    UniversalPrint(suffix_, os);\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"doesn't end with \";\n    UniversalPrint(suffix_, os);\n  }\n\n private:\n  const StringType suffix_;\n};\n\n// Implements a matcher that compares the two fields of a 2-tuple\n// using one of the ==, <=, <, etc, operators.  The two fields being\n// compared don't have to have the same type.\n//\n// The matcher defined here is polymorphic (for example, Eq() can be\n// used to match a std::tuple<int, short>, a std::tuple<const long&, double>,\n// etc).  Therefore we use a template type conversion operator in the\n// implementation.\ntemplate <typename D, typename Op>\nclass PairMatchBase {\n public:\n  template <typename T1, typename T2>\n  operator Matcher<::std::tuple<T1, T2>>() const {\n    return Matcher<::std::tuple<T1, T2>>(new Impl<const ::std::tuple<T1, T2>&>);\n  }\n  template <typename T1, typename T2>\n  operator Matcher<const ::std::tuple<T1, T2>&>() const {\n    return MakeMatcher(new Impl<const ::std::tuple<T1, T2>&>);\n  }\n\n private:\n  static ::std::ostream& GetDesc(::std::ostream& os) {  // NOLINT\n    return os << D::Desc();\n  }\n\n  template <typename Tuple>\n  class Impl : public MatcherInterface<Tuple> {\n   public:\n    bool MatchAndExplain(Tuple args,\n                         MatchResultListener* /* listener */) const override {\n      return Op()(::std::get<0>(args), ::std::get<1>(args));\n    }\n    void DescribeTo(::std::ostream* os) const override {\n      *os << \"are \" << GetDesc;\n    }\n    void DescribeNegationTo(::std::ostream* os) const override {\n      *os << \"aren't \" << GetDesc;\n    }\n  };\n};\n\nclass Eq2Matcher : public PairMatchBase<Eq2Matcher, AnyEq> {\n public:\n  static const char* Desc() { return \"an equal pair\"; }\n};\nclass Ne2Matcher : public PairMatchBase<Ne2Matcher, AnyNe> {\n public:\n  static const char* Desc() { return \"an unequal pair\"; }\n};\nclass Lt2Matcher : public PairMatchBase<Lt2Matcher, AnyLt> {\n public:\n  static const char* Desc() { return \"a pair where the first < the second\"; }\n};\nclass Gt2Matcher : public PairMatchBase<Gt2Matcher, AnyGt> {\n public:\n  static const char* Desc() { return \"a pair where the first > the second\"; }\n};\nclass Le2Matcher : public PairMatchBase<Le2Matcher, AnyLe> {\n public:\n  static const char* Desc() { return \"a pair where the first <= the second\"; }\n};\nclass Ge2Matcher : public PairMatchBase<Ge2Matcher, AnyGe> {\n public:\n  static const char* Desc() { return \"a pair where the first >= the second\"; }\n};\n\n// Implements the Not(...) matcher for a particular argument type T.\n// We do not nest it inside the NotMatcher class template, as that\n// will prevent different instantiations of NotMatcher from sharing\n// the same NotMatcherImpl<T> class.\ntemplate <typename T>\nclass NotMatcherImpl : public MatcherInterface<const T&> {\n public:\n  explicit NotMatcherImpl(const Matcher<T>& matcher)\n      : matcher_(matcher) {}\n\n  bool MatchAndExplain(const T& x,\n                       MatchResultListener* listener) const override {\n    return !matcher_.MatchAndExplain(x, listener);\n  }\n\n  void DescribeTo(::std::ostream* os) const override {\n    matcher_.DescribeNegationTo(os);\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const override {\n    matcher_.DescribeTo(os);\n  }\n\n private:\n  const Matcher<T> matcher_;\n};\n\n// Implements the Not(m) matcher, which matches a value that doesn't\n// match matcher m.\ntemplate <typename InnerMatcher>\nclass NotMatcher {\n public:\n  explicit NotMatcher(InnerMatcher matcher) : matcher_(matcher) {}\n\n  // This template type conversion operator allows Not(m) to be used\n  // to match any type m can match.\n  template <typename T>\n  operator Matcher<T>() const {\n    return Matcher<T>(new NotMatcherImpl<T>(SafeMatcherCast<T>(matcher_)));\n  }\n\n private:\n  InnerMatcher matcher_;\n};\n\n// Implements the AllOf(m1, m2) matcher for a particular argument type\n// T. We do not nest it inside the BothOfMatcher class template, as\n// that will prevent different instantiations of BothOfMatcher from\n// sharing the same BothOfMatcherImpl<T> class.\ntemplate <typename T>\nclass AllOfMatcherImpl : public MatcherInterface<const T&> {\n public:\n  explicit AllOfMatcherImpl(std::vector<Matcher<T> > matchers)\n      : matchers_(std::move(matchers)) {}\n\n  void DescribeTo(::std::ostream* os) const override {\n    *os << \"(\";\n    for (size_t i = 0; i < matchers_.size(); ++i) {\n      if (i != 0) *os << \") and (\";\n      matchers_[i].DescribeTo(os);\n    }\n    *os << \")\";\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const override {\n    *os << \"(\";\n    for (size_t i = 0; i < matchers_.size(); ++i) {\n      if (i != 0) *os << \") or (\";\n      matchers_[i].DescribeNegationTo(os);\n    }\n    *os << \")\";\n  }\n\n  bool MatchAndExplain(const T& x,\n                       MatchResultListener* listener) const override {\n    // If either matcher1_ or matcher2_ doesn't match x, we only need\n    // to explain why one of them fails.\n    std::string all_match_result;\n\n    for (size_t i = 0; i < matchers_.size(); ++i) {\n      StringMatchResultListener slistener;\n      if (matchers_[i].MatchAndExplain(x, &slistener)) {\n        if (all_match_result.empty()) {\n          all_match_result = slistener.str();\n        } else {\n          std::string result = slistener.str();\n          if (!result.empty()) {\n            all_match_result += \", and \";\n            all_match_result += result;\n          }\n        }\n      } else {\n        *listener << slistener.str();\n        return false;\n      }\n    }\n\n    // Otherwise we need to explain why *both* of them match.\n    *listener << all_match_result;\n    return true;\n  }\n\n private:\n  const std::vector<Matcher<T> > matchers_;\n};\n\n// VariadicMatcher is used for the variadic implementation of\n// AllOf(m_1, m_2, ...) and AnyOf(m_1, m_2, ...).\n// CombiningMatcher<T> is used to recursively combine the provided matchers\n// (of type Args...).\ntemplate <template <typename T> class CombiningMatcher, typename... Args>\nclass VariadicMatcher {\n public:\n  VariadicMatcher(const Args&... matchers)  // NOLINT\n      : matchers_(matchers...) {\n    static_assert(sizeof...(Args) > 0, \"Must have at least one matcher.\");\n  }\n\n  VariadicMatcher(const VariadicMatcher&) = default;\n  VariadicMatcher& operator=(const VariadicMatcher&) = delete;\n\n  // This template type conversion operator allows an\n  // VariadicMatcher<Matcher1, Matcher2...> object to match any type that\n  // all of the provided matchers (Matcher1, Matcher2, ...) can match.\n  template <typename T>\n  operator Matcher<T>() const {\n    std::vector<Matcher<T> > values;\n    CreateVariadicMatcher<T>(&values, std::integral_constant<size_t, 0>());\n    return Matcher<T>(new CombiningMatcher<T>(std::move(values)));\n  }\n\n private:\n  template <typename T, size_t I>\n  void CreateVariadicMatcher(std::vector<Matcher<T> >* values,\n                             std::integral_constant<size_t, I>) const {\n    values->push_back(SafeMatcherCast<T>(std::get<I>(matchers_)));\n    CreateVariadicMatcher<T>(values, std::integral_constant<size_t, I + 1>());\n  }\n\n  template <typename T>\n  void CreateVariadicMatcher(\n      std::vector<Matcher<T> >*,\n      std::integral_constant<size_t, sizeof...(Args)>) const {}\n\n  std::tuple<Args...> matchers_;\n};\n\ntemplate <typename... Args>\nusing AllOfMatcher = VariadicMatcher<AllOfMatcherImpl, Args...>;\n\n// Implements the AnyOf(m1, m2) matcher for a particular argument type\n// T.  We do not nest it inside the AnyOfMatcher class template, as\n// that will prevent different instantiations of AnyOfMatcher from\n// sharing the same EitherOfMatcherImpl<T> class.\ntemplate <typename T>\nclass AnyOfMatcherImpl : public MatcherInterface<const T&> {\n public:\n  explicit AnyOfMatcherImpl(std::vector<Matcher<T> > matchers)\n      : matchers_(std::move(matchers)) {}\n\n  void DescribeTo(::std::ostream* os) const override {\n    *os << \"(\";\n    for (size_t i = 0; i < matchers_.size(); ++i) {\n      if (i != 0) *os << \") or (\";\n      matchers_[i].DescribeTo(os);\n    }\n    *os << \")\";\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const override {\n    *os << \"(\";\n    for (size_t i = 0; i < matchers_.size(); ++i) {\n      if (i != 0) *os << \") and (\";\n      matchers_[i].DescribeNegationTo(os);\n    }\n    *os << \")\";\n  }\n\n  bool MatchAndExplain(const T& x,\n                       MatchResultListener* listener) const override {\n    std::string no_match_result;\n\n    // If either matcher1_ or matcher2_ matches x, we just need to\n    // explain why *one* of them matches.\n    for (size_t i = 0; i < matchers_.size(); ++i) {\n      StringMatchResultListener slistener;\n      if (matchers_[i].MatchAndExplain(x, &slistener)) {\n        *listener << slistener.str();\n        return true;\n      } else {\n        if (no_match_result.empty()) {\n          no_match_result = slistener.str();\n        } else {\n          std::string result = slistener.str();\n          if (!result.empty()) {\n            no_match_result += \", and \";\n            no_match_result += result;\n          }\n        }\n      }\n    }\n\n    // Otherwise we need to explain why *both* of them fail.\n    *listener << no_match_result;\n    return false;\n  }\n\n private:\n  const std::vector<Matcher<T> > matchers_;\n};\n\n// AnyOfMatcher is used for the variadic implementation of AnyOf(m_1, m_2, ...).\ntemplate <typename... Args>\nusing AnyOfMatcher = VariadicMatcher<AnyOfMatcherImpl, Args...>;\n\n// Wrapper for implementation of Any/AllOfArray().\ntemplate <template <class> class MatcherImpl, typename T>\nclass SomeOfArrayMatcher {\n public:\n  // Constructs the matcher from a sequence of element values or\n  // element matchers.\n  template <typename Iter>\n  SomeOfArrayMatcher(Iter first, Iter last) : matchers_(first, last) {}\n\n  template <typename U>\n  operator Matcher<U>() const {  // NOLINT\n    using RawU = typename std::decay<U>::type;\n    std::vector<Matcher<RawU>> matchers;\n    for (const auto& matcher : matchers_) {\n      matchers.push_back(MatcherCast<RawU>(matcher));\n    }\n    return Matcher<U>(new MatcherImpl<RawU>(std::move(matchers)));\n  }\n\n private:\n  const ::std::vector<T> matchers_;\n};\n\ntemplate <typename T>\nusing AllOfArrayMatcher = SomeOfArrayMatcher<AllOfMatcherImpl, T>;\n\ntemplate <typename T>\nusing AnyOfArrayMatcher = SomeOfArrayMatcher<AnyOfMatcherImpl, T>;\n\n// Used for implementing Truly(pred), which turns a predicate into a\n// matcher.\ntemplate <typename Predicate>\nclass TrulyMatcher {\n public:\n  explicit TrulyMatcher(Predicate pred) : predicate_(pred) {}\n\n  // This method template allows Truly(pred) to be used as a matcher\n  // for type T where T is the argument type of predicate 'pred'.  The\n  // argument is passed by reference as the predicate may be\n  // interested in the address of the argument.\n  template <typename T>\n  bool MatchAndExplain(T& x,  // NOLINT\n                       MatchResultListener* listener) const {\n    // Without the if-statement, MSVC sometimes warns about converting\n    // a value to bool (warning 4800).\n    //\n    // We cannot write 'return !!predicate_(x);' as that doesn't work\n    // when predicate_(x) returns a class convertible to bool but\n    // having no operator!().\n    if (predicate_(x))\n      return true;\n    *listener << \"didn't satisfy the given predicate\";\n    return false;\n  }\n\n  void DescribeTo(::std::ostream* os) const {\n    *os << \"satisfies the given predicate\";\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"doesn't satisfy the given predicate\";\n  }\n\n private:\n  Predicate predicate_;\n};\n\n// Used for implementing Matches(matcher), which turns a matcher into\n// a predicate.\ntemplate <typename M>\nclass MatcherAsPredicate {\n public:\n  explicit MatcherAsPredicate(M matcher) : matcher_(matcher) {}\n\n  // This template operator() allows Matches(m) to be used as a\n  // predicate on type T where m is a matcher on type T.\n  //\n  // The argument x is passed by reference instead of by value, as\n  // some matcher may be interested in its address (e.g. as in\n  // Matches(Ref(n))(x)).\n  template <typename T>\n  bool operator()(const T& x) const {\n    // We let matcher_ commit to a particular type here instead of\n    // when the MatcherAsPredicate object was constructed.  This\n    // allows us to write Matches(m) where m is a polymorphic matcher\n    // (e.g. Eq(5)).\n    //\n    // If we write Matcher<T>(matcher_).Matches(x) here, it won't\n    // compile when matcher_ has type Matcher<const T&>; if we write\n    // Matcher<const T&>(matcher_).Matches(x) here, it won't compile\n    // when matcher_ has type Matcher<T>; if we just write\n    // matcher_.Matches(x), it won't compile when matcher_ is\n    // polymorphic, e.g. Eq(5).\n    //\n    // MatcherCast<const T&>() is necessary for making the code work\n    // in all of the above situations.\n    return MatcherCast<const T&>(matcher_).Matches(x);\n  }\n\n private:\n  M matcher_;\n};\n\n// For implementing ASSERT_THAT() and EXPECT_THAT().  The template\n// argument M must be a type that can be converted to a matcher.\ntemplate <typename M>\nclass PredicateFormatterFromMatcher {\n public:\n  explicit PredicateFormatterFromMatcher(M m) : matcher_(std::move(m)) {}\n\n  // This template () operator allows a PredicateFormatterFromMatcher\n  // object to act as a predicate-formatter suitable for using with\n  // Google Test's EXPECT_PRED_FORMAT1() macro.\n  template <typename T>\n  AssertionResult operator()(const char* value_text, const T& x) const {\n    // We convert matcher_ to a Matcher<const T&> *now* instead of\n    // when the PredicateFormatterFromMatcher object was constructed,\n    // as matcher_ may be polymorphic (e.g. NotNull()) and we won't\n    // know which type to instantiate it to until we actually see the\n    // type of x here.\n    //\n    // We write SafeMatcherCast<const T&>(matcher_) instead of\n    // Matcher<const T&>(matcher_), as the latter won't compile when\n    // matcher_ has type Matcher<T> (e.g. An<int>()).\n    // We don't write MatcherCast<const T&> either, as that allows\n    // potentially unsafe downcasting of the matcher argument.\n    const Matcher<const T&> matcher = SafeMatcherCast<const T&>(matcher_);\n\n    // The expected path here is that the matcher should match (i.e. that most\n    // tests pass) so optimize for this case.\n    if (matcher.Matches(x)) {\n      return AssertionSuccess();\n    }\n\n    ::std::stringstream ss;\n    ss << \"Value of: \" << value_text << \"\\n\"\n       << \"Expected: \";\n    matcher.DescribeTo(&ss);\n\n    // Rerun the matcher to \"PrintAndExplain\" the failure.\n    StringMatchResultListener listener;\n    if (MatchPrintAndExplain(x, matcher, &listener)) {\n      ss << \"\\n  The matcher failed on the initial attempt; but passed when \"\n            \"rerun to generate the explanation.\";\n    }\n    ss << \"\\n  Actual: \" << listener.str();\n    return AssertionFailure() << ss.str();\n  }\n\n private:\n  const M matcher_;\n};\n\n// A helper function for converting a matcher to a predicate-formatter\n// without the user needing to explicitly write the type.  This is\n// used for implementing ASSERT_THAT() and EXPECT_THAT().\n// Implementation detail: 'matcher' is received by-value to force decaying.\ntemplate <typename M>\ninline PredicateFormatterFromMatcher<M>\nMakePredicateFormatterFromMatcher(M matcher) {\n  return PredicateFormatterFromMatcher<M>(std::move(matcher));\n}\n\n// Implements the polymorphic IsNan() matcher, which matches any floating type\n// value that is Nan.\nclass IsNanMatcher {\n public:\n  template <typename FloatType>\n  bool MatchAndExplain(const FloatType& f,\n                       MatchResultListener* /* listener */) const {\n    return (::std::isnan)(f);\n  }\n\n  void DescribeTo(::std::ostream* os) const { *os << \"is NaN\"; }\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"isn't NaN\";\n  }\n};\n\n// Implements the polymorphic floating point equality matcher, which matches\n// two float values using ULP-based approximation or, optionally, a\n// user-specified epsilon.  The template is meant to be instantiated with\n// FloatType being either float or double.\ntemplate <typename FloatType>\nclass FloatingEqMatcher {\n public:\n  // Constructor for FloatingEqMatcher.\n  // The matcher's input will be compared with expected.  The matcher treats two\n  // NANs as equal if nan_eq_nan is true.  Otherwise, under IEEE standards,\n  // equality comparisons between NANs will always return false.  We specify a\n  // negative max_abs_error_ term to indicate that ULP-based approximation will\n  // be used for comparison.\n  FloatingEqMatcher(FloatType expected, bool nan_eq_nan) :\n    expected_(expected), nan_eq_nan_(nan_eq_nan), max_abs_error_(-1) {\n  }\n\n  // Constructor that supports a user-specified max_abs_error that will be used\n  // for comparison instead of ULP-based approximation.  The max absolute\n  // should be non-negative.\n  FloatingEqMatcher(FloatType expected, bool nan_eq_nan,\n                    FloatType max_abs_error)\n      : expected_(expected),\n        nan_eq_nan_(nan_eq_nan),\n        max_abs_error_(max_abs_error) {\n    GTEST_CHECK_(max_abs_error >= 0)\n        << \", where max_abs_error is\" << max_abs_error;\n  }\n\n  // Implements floating point equality matcher as a Matcher<T>.\n  template <typename T>\n  class Impl : public MatcherInterface<T> {\n   public:\n    Impl(FloatType expected, bool nan_eq_nan, FloatType max_abs_error)\n        : expected_(expected),\n          nan_eq_nan_(nan_eq_nan),\n          max_abs_error_(max_abs_error) {}\n\n    bool MatchAndExplain(T value,\n                         MatchResultListener* listener) const override {\n      const FloatingPoint<FloatType> actual(value), expected(expected_);\n\n      // Compares NaNs first, if nan_eq_nan_ is true.\n      if (actual.is_nan() || expected.is_nan()) {\n        if (actual.is_nan() && expected.is_nan()) {\n          return nan_eq_nan_;\n        }\n        // One is nan; the other is not nan.\n        return false;\n      }\n      if (HasMaxAbsError()) {\n        // We perform an equality check so that inf will match inf, regardless\n        // of error bounds.  If the result of value - expected_ would result in\n        // overflow or if either value is inf, the default result is infinity,\n        // which should only match if max_abs_error_ is also infinity.\n        if (value == expected_) {\n          return true;\n        }\n\n        const FloatType diff = value - expected_;\n        if (::std::fabs(diff) <= max_abs_error_) {\n          return true;\n        }\n\n        if (listener->IsInterested()) {\n          *listener << \"which is \" << diff << \" from \" << expected_;\n        }\n        return false;\n      } else {\n        return actual.AlmostEquals(expected);\n      }\n    }\n\n    void DescribeTo(::std::ostream* os) const override {\n      // os->precision() returns the previously set precision, which we\n      // store to restore the ostream to its original configuration\n      // after outputting.\n      const ::std::streamsize old_precision = os->precision(\n          ::std::numeric_limits<FloatType>::digits10 + 2);\n      if (FloatingPoint<FloatType>(expected_).is_nan()) {\n        if (nan_eq_nan_) {\n          *os << \"is NaN\";\n        } else {\n          *os << \"never matches\";\n        }\n      } else {\n        *os << \"is approximately \" << expected_;\n        if (HasMaxAbsError()) {\n          *os << \" (absolute error <= \" << max_abs_error_ << \")\";\n        }\n      }\n      os->precision(old_precision);\n    }\n\n    void DescribeNegationTo(::std::ostream* os) const override {\n      // As before, get original precision.\n      const ::std::streamsize old_precision = os->precision(\n          ::std::numeric_limits<FloatType>::digits10 + 2);\n      if (FloatingPoint<FloatType>(expected_).is_nan()) {\n        if (nan_eq_nan_) {\n          *os << \"isn't NaN\";\n        } else {\n          *os << \"is anything\";\n        }\n      } else {\n        *os << \"isn't approximately \" << expected_;\n        if (HasMaxAbsError()) {\n          *os << \" (absolute error > \" << max_abs_error_ << \")\";\n        }\n      }\n      // Restore original precision.\n      os->precision(old_precision);\n    }\n\n   private:\n    bool HasMaxAbsError() const {\n      return max_abs_error_ >= 0;\n    }\n\n    const FloatType expected_;\n    const bool nan_eq_nan_;\n    // max_abs_error will be used for value comparison when >= 0.\n    const FloatType max_abs_error_;\n  };\n\n  // The following 3 type conversion operators allow FloatEq(expected) and\n  // NanSensitiveFloatEq(expected) to be used as a Matcher<float>, a\n  // Matcher<const float&>, or a Matcher<float&>, but nothing else.\n  operator Matcher<FloatType>() const {\n    return MakeMatcher(\n        new Impl<FloatType>(expected_, nan_eq_nan_, max_abs_error_));\n  }\n\n  operator Matcher<const FloatType&>() const {\n    return MakeMatcher(\n        new Impl<const FloatType&>(expected_, nan_eq_nan_, max_abs_error_));\n  }\n\n  operator Matcher<FloatType&>() const {\n    return MakeMatcher(\n        new Impl<FloatType&>(expected_, nan_eq_nan_, max_abs_error_));\n  }\n\n private:\n  const FloatType expected_;\n  const bool nan_eq_nan_;\n  // max_abs_error will be used for value comparison when >= 0.\n  const FloatType max_abs_error_;\n};\n\n// A 2-tuple (\"binary\") wrapper around FloatingEqMatcher:\n// FloatingEq2Matcher() matches (x, y) by matching FloatingEqMatcher(x, false)\n// against y, and FloatingEq2Matcher(e) matches FloatingEqMatcher(x, false, e)\n// against y. The former implements \"Eq\", the latter \"Near\". At present, there\n// is no version that compares NaNs as equal.\ntemplate <typename FloatType>\nclass FloatingEq2Matcher {\n public:\n  FloatingEq2Matcher() { Init(-1, false); }\n\n  explicit FloatingEq2Matcher(bool nan_eq_nan) { Init(-1, nan_eq_nan); }\n\n  explicit FloatingEq2Matcher(FloatType max_abs_error) {\n    Init(max_abs_error, false);\n  }\n\n  FloatingEq2Matcher(FloatType max_abs_error, bool nan_eq_nan) {\n    Init(max_abs_error, nan_eq_nan);\n  }\n\n  template <typename T1, typename T2>\n  operator Matcher<::std::tuple<T1, T2>>() const {\n    return MakeMatcher(\n        new Impl<::std::tuple<T1, T2>>(max_abs_error_, nan_eq_nan_));\n  }\n  template <typename T1, typename T2>\n  operator Matcher<const ::std::tuple<T1, T2>&>() const {\n    return MakeMatcher(\n        new Impl<const ::std::tuple<T1, T2>&>(max_abs_error_, nan_eq_nan_));\n  }\n\n private:\n  static ::std::ostream& GetDesc(::std::ostream& os) {  // NOLINT\n    return os << \"an almost-equal pair\";\n  }\n\n  template <typename Tuple>\n  class Impl : public MatcherInterface<Tuple> {\n   public:\n    Impl(FloatType max_abs_error, bool nan_eq_nan) :\n        max_abs_error_(max_abs_error),\n        nan_eq_nan_(nan_eq_nan) {}\n\n    bool MatchAndExplain(Tuple args,\n                         MatchResultListener* listener) const override {\n      if (max_abs_error_ == -1) {\n        FloatingEqMatcher<FloatType> fm(::std::get<0>(args), nan_eq_nan_);\n        return static_cast<Matcher<FloatType>>(fm).MatchAndExplain(\n            ::std::get<1>(args), listener);\n      } else {\n        FloatingEqMatcher<FloatType> fm(::std::get<0>(args), nan_eq_nan_,\n                                        max_abs_error_);\n        return static_cast<Matcher<FloatType>>(fm).MatchAndExplain(\n            ::std::get<1>(args), listener);\n      }\n    }\n    void DescribeTo(::std::ostream* os) const override {\n      *os << \"are \" << GetDesc;\n    }\n    void DescribeNegationTo(::std::ostream* os) const override {\n      *os << \"aren't \" << GetDesc;\n    }\n\n   private:\n    FloatType max_abs_error_;\n    const bool nan_eq_nan_;\n  };\n\n  void Init(FloatType max_abs_error_val, bool nan_eq_nan_val) {\n    max_abs_error_ = max_abs_error_val;\n    nan_eq_nan_ = nan_eq_nan_val;\n  }\n  FloatType max_abs_error_;\n  bool nan_eq_nan_;\n};\n\n// Implements the Pointee(m) matcher for matching a pointer whose\n// pointee matches matcher m.  The pointer can be either raw or smart.\ntemplate <typename InnerMatcher>\nclass PointeeMatcher {\n public:\n  explicit PointeeMatcher(const InnerMatcher& matcher) : matcher_(matcher) {}\n\n  // This type conversion operator template allows Pointee(m) to be\n  // used as a matcher for any pointer type whose pointee type is\n  // compatible with the inner matcher, where type Pointer can be\n  // either a raw pointer or a smart pointer.\n  //\n  // The reason we do this instead of relying on\n  // MakePolymorphicMatcher() is that the latter is not flexible\n  // enough for implementing the DescribeTo() method of Pointee().\n  template <typename Pointer>\n  operator Matcher<Pointer>() const {\n    return Matcher<Pointer>(new Impl<const Pointer&>(matcher_));\n  }\n\n private:\n  // The monomorphic implementation that works for a particular pointer type.\n  template <typename Pointer>\n  class Impl : public MatcherInterface<Pointer> {\n   public:\n    using Pointee =\n        typename std::pointer_traits<GTEST_REMOVE_REFERENCE_AND_CONST_(\n            Pointer)>::element_type;\n\n    explicit Impl(const InnerMatcher& matcher)\n        : matcher_(MatcherCast<const Pointee&>(matcher)) {}\n\n    void DescribeTo(::std::ostream* os) const override {\n      *os << \"points to a value that \";\n      matcher_.DescribeTo(os);\n    }\n\n    void DescribeNegationTo(::std::ostream* os) const override {\n      *os << \"does not point to a value that \";\n      matcher_.DescribeTo(os);\n    }\n\n    bool MatchAndExplain(Pointer pointer,\n                         MatchResultListener* listener) const override {\n      if (GetRawPointer(pointer) == nullptr) return false;\n\n      *listener << \"which points to \";\n      return MatchPrintAndExplain(*pointer, matcher_, listener);\n    }\n\n   private:\n    const Matcher<const Pointee&> matcher_;\n  };\n\n  const InnerMatcher matcher_;\n};\n\n// Implements the Pointer(m) matcher\n// Implements the Pointer(m) matcher for matching a pointer that matches matcher\n// m.  The pointer can be either raw or smart, and will match `m` against the\n// raw pointer.\ntemplate <typename InnerMatcher>\nclass PointerMatcher {\n public:\n  explicit PointerMatcher(const InnerMatcher& matcher) : matcher_(matcher) {}\n\n  // This type conversion operator template allows Pointer(m) to be\n  // used as a matcher for any pointer type whose pointer type is\n  // compatible with the inner matcher, where type PointerType can be\n  // either a raw pointer or a smart pointer.\n  //\n  // The reason we do this instead of relying on\n  // MakePolymorphicMatcher() is that the latter is not flexible\n  // enough for implementing the DescribeTo() method of Pointer().\n  template <typename PointerType>\n  operator Matcher<PointerType>() const {  // NOLINT\n    return Matcher<PointerType>(new Impl<const PointerType&>(matcher_));\n  }\n\n private:\n  // The monomorphic implementation that works for a particular pointer type.\n  template <typename PointerType>\n  class Impl : public MatcherInterface<PointerType> {\n   public:\n    using Pointer =\n        const typename std::pointer_traits<GTEST_REMOVE_REFERENCE_AND_CONST_(\n            PointerType)>::element_type*;\n\n    explicit Impl(const InnerMatcher& matcher)\n        : matcher_(MatcherCast<Pointer>(matcher)) {}\n\n    void DescribeTo(::std::ostream* os) const override {\n      *os << \"is a pointer that \";\n      matcher_.DescribeTo(os);\n    }\n\n    void DescribeNegationTo(::std::ostream* os) const override {\n      *os << \"is not a pointer that \";\n      matcher_.DescribeTo(os);\n    }\n\n    bool MatchAndExplain(PointerType pointer,\n                         MatchResultListener* listener) const override {\n      *listener << \"which is a pointer that \";\n      Pointer p = GetRawPointer(pointer);\n      return MatchPrintAndExplain(p, matcher_, listener);\n    }\n\n   private:\n    Matcher<Pointer> matcher_;\n  };\n\n  const InnerMatcher matcher_;\n};\n\n#if GTEST_HAS_RTTI\n// Implements the WhenDynamicCastTo<T>(m) matcher that matches a pointer or\n// reference that matches inner_matcher when dynamic_cast<T> is applied.\n// The result of dynamic_cast<To> is forwarded to the inner matcher.\n// If To is a pointer and the cast fails, the inner matcher will receive NULL.\n// If To is a reference and the cast fails, this matcher returns false\n// immediately.\ntemplate <typename To>\nclass WhenDynamicCastToMatcherBase {\n public:\n  explicit WhenDynamicCastToMatcherBase(const Matcher<To>& matcher)\n      : matcher_(matcher) {}\n\n  void DescribeTo(::std::ostream* os) const {\n    GetCastTypeDescription(os);\n    matcher_.DescribeTo(os);\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const {\n    GetCastTypeDescription(os);\n    matcher_.DescribeNegationTo(os);\n  }\n\n protected:\n  const Matcher<To> matcher_;\n\n  static std::string GetToName() {\n    return GetTypeName<To>();\n  }\n\n private:\n  static void GetCastTypeDescription(::std::ostream* os) {\n    *os << \"when dynamic_cast to \" << GetToName() << \", \";\n  }\n};\n\n// Primary template.\n// To is a pointer. Cast and forward the result.\ntemplate <typename To>\nclass WhenDynamicCastToMatcher : public WhenDynamicCastToMatcherBase<To> {\n public:\n  explicit WhenDynamicCastToMatcher(const Matcher<To>& matcher)\n      : WhenDynamicCastToMatcherBase<To>(matcher) {}\n\n  template <typename From>\n  bool MatchAndExplain(From from, MatchResultListener* listener) const {\n    To to = dynamic_cast<To>(from);\n    return MatchPrintAndExplain(to, this->matcher_, listener);\n  }\n};\n\n// Specialize for references.\n// In this case we return false if the dynamic_cast fails.\ntemplate <typename To>\nclass WhenDynamicCastToMatcher<To&> : public WhenDynamicCastToMatcherBase<To&> {\n public:\n  explicit WhenDynamicCastToMatcher(const Matcher<To&>& matcher)\n      : WhenDynamicCastToMatcherBase<To&>(matcher) {}\n\n  template <typename From>\n  bool MatchAndExplain(From& from, MatchResultListener* listener) const {\n    // We don't want an std::bad_cast here, so do the cast with pointers.\n    To* to = dynamic_cast<To*>(&from);\n    if (to == nullptr) {\n      *listener << \"which cannot be dynamic_cast to \" << this->GetToName();\n      return false;\n    }\n    return MatchPrintAndExplain(*to, this->matcher_, listener);\n  }\n};\n#endif  // GTEST_HAS_RTTI\n\n// Implements the Field() matcher for matching a field (i.e. member\n// variable) of an object.\ntemplate <typename Class, typename FieldType>\nclass FieldMatcher {\n public:\n  FieldMatcher(FieldType Class::*field,\n               const Matcher<const FieldType&>& matcher)\n      : field_(field), matcher_(matcher), whose_field_(\"whose given field \") {}\n\n  FieldMatcher(const std::string& field_name, FieldType Class::*field,\n               const Matcher<const FieldType&>& matcher)\n      : field_(field),\n        matcher_(matcher),\n        whose_field_(\"whose field `\" + field_name + \"` \") {}\n\n  void DescribeTo(::std::ostream* os) const {\n    *os << \"is an object \" << whose_field_;\n    matcher_.DescribeTo(os);\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"is an object \" << whose_field_;\n    matcher_.DescribeNegationTo(os);\n  }\n\n  template <typename T>\n  bool MatchAndExplain(const T& value, MatchResultListener* listener) const {\n    // FIXME: The dispatch on std::is_pointer was introduced as a workaround for\n    // a compiler bug, and can now be removed.\n    return MatchAndExplainImpl(\n        typename std::is_pointer<typename std::remove_const<T>::type>::type(),\n        value, listener);\n  }\n\n private:\n  bool MatchAndExplainImpl(std::false_type /* is_not_pointer */,\n                           const Class& obj,\n                           MatchResultListener* listener) const {\n    *listener << whose_field_ << \"is \";\n    return MatchPrintAndExplain(obj.*field_, matcher_, listener);\n  }\n\n  bool MatchAndExplainImpl(std::true_type /* is_pointer */, const Class* p,\n                           MatchResultListener* listener) const {\n    if (p == nullptr) return false;\n\n    *listener << \"which points to an object \";\n    // Since *p has a field, it must be a class/struct/union type and\n    // thus cannot be a pointer.  Therefore we pass false_type() as\n    // the first argument.\n    return MatchAndExplainImpl(std::false_type(), *p, listener);\n  }\n\n  const FieldType Class::*field_;\n  const Matcher<const FieldType&> matcher_;\n\n  // Contains either \"whose given field \" if the name of the field is unknown\n  // or \"whose field `name_of_field` \" if the name is known.\n  const std::string whose_field_;\n};\n\n// Implements the Property() matcher for matching a property\n// (i.e. return value of a getter method) of an object.\n//\n// Property is a const-qualified member function of Class returning\n// PropertyType.\ntemplate <typename Class, typename PropertyType, typename Property>\nclass PropertyMatcher {\n public:\n  typedef const PropertyType& RefToConstProperty;\n\n  PropertyMatcher(Property property, const Matcher<RefToConstProperty>& matcher)\n      : property_(property),\n        matcher_(matcher),\n        whose_property_(\"whose given property \") {}\n\n  PropertyMatcher(const std::string& property_name, Property property,\n                  const Matcher<RefToConstProperty>& matcher)\n      : property_(property),\n        matcher_(matcher),\n        whose_property_(\"whose property `\" + property_name + \"` \") {}\n\n  void DescribeTo(::std::ostream* os) const {\n    *os << \"is an object \" << whose_property_;\n    matcher_.DescribeTo(os);\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"is an object \" << whose_property_;\n    matcher_.DescribeNegationTo(os);\n  }\n\n  template <typename T>\n  bool MatchAndExplain(const T&value, MatchResultListener* listener) const {\n    return MatchAndExplainImpl(\n        typename std::is_pointer<typename std::remove_const<T>::type>::type(),\n        value, listener);\n  }\n\n private:\n  bool MatchAndExplainImpl(std::false_type /* is_not_pointer */,\n                           const Class& obj,\n                           MatchResultListener* listener) const {\n    *listener << whose_property_ << \"is \";\n    // Cannot pass the return value (for example, int) to MatchPrintAndExplain,\n    // which takes a non-const reference as argument.\n    RefToConstProperty result = (obj.*property_)();\n    return MatchPrintAndExplain(result, matcher_, listener);\n  }\n\n  bool MatchAndExplainImpl(std::true_type /* is_pointer */, const Class* p,\n                           MatchResultListener* listener) const {\n    if (p == nullptr) return false;\n\n    *listener << \"which points to an object \";\n    // Since *p has a property method, it must be a class/struct/union\n    // type and thus cannot be a pointer.  Therefore we pass\n    // false_type() as the first argument.\n    return MatchAndExplainImpl(std::false_type(), *p, listener);\n  }\n\n  Property property_;\n  const Matcher<RefToConstProperty> matcher_;\n\n  // Contains either \"whose given property \" if the name of the property is\n  // unknown or \"whose property `name_of_property` \" if the name is known.\n  const std::string whose_property_;\n};\n\n// Type traits specifying various features of different functors for ResultOf.\n// The default template specifies features for functor objects.\ntemplate <typename Functor>\nstruct CallableTraits {\n  typedef Functor StorageType;\n\n  static void CheckIsValid(Functor /* functor */) {}\n\n  template <typename T>\n  static auto Invoke(Functor f, const T& arg) -> decltype(f(arg)) {\n    return f(arg);\n  }\n};\n\n// Specialization for function pointers.\ntemplate <typename ArgType, typename ResType>\nstruct CallableTraits<ResType(*)(ArgType)> {\n  typedef ResType ResultType;\n  typedef ResType(*StorageType)(ArgType);\n\n  static void CheckIsValid(ResType(*f)(ArgType)) {\n    GTEST_CHECK_(f != nullptr)\n        << \"NULL function pointer is passed into ResultOf().\";\n  }\n  template <typename T>\n  static ResType Invoke(ResType(*f)(ArgType), T arg) {\n    return (*f)(arg);\n  }\n};\n\n// Implements the ResultOf() matcher for matching a return value of a\n// unary function of an object.\ntemplate <typename Callable, typename InnerMatcher>\nclass ResultOfMatcher {\n public:\n  ResultOfMatcher(Callable callable, InnerMatcher matcher)\n      : callable_(std::move(callable)), matcher_(std::move(matcher)) {\n    CallableTraits<Callable>::CheckIsValid(callable_);\n  }\n\n  template <typename T>\n  operator Matcher<T>() const {\n    return Matcher<T>(new Impl<const T&>(callable_, matcher_));\n  }\n\n private:\n  typedef typename CallableTraits<Callable>::StorageType CallableStorageType;\n\n  template <typename T>\n  class Impl : public MatcherInterface<T> {\n    using ResultType = decltype(CallableTraits<Callable>::template Invoke<T>(\n        std::declval<CallableStorageType>(), std::declval<T>()));\n\n   public:\n    template <typename M>\n    Impl(const CallableStorageType& callable, const M& matcher)\n        : callable_(callable), matcher_(MatcherCast<ResultType>(matcher)) {}\n\n    void DescribeTo(::std::ostream* os) const override {\n      *os << \"is mapped by the given callable to a value that \";\n      matcher_.DescribeTo(os);\n    }\n\n    void DescribeNegationTo(::std::ostream* os) const override {\n      *os << \"is mapped by the given callable to a value that \";\n      matcher_.DescribeNegationTo(os);\n    }\n\n    bool MatchAndExplain(T obj, MatchResultListener* listener) const override {\n      *listener << \"which is mapped by the given callable to \";\n      // Cannot pass the return value directly to MatchPrintAndExplain, which\n      // takes a non-const reference as argument.\n      // Also, specifying template argument explicitly is needed because T could\n      // be a non-const reference (e.g. Matcher<Uncopyable&>).\n      ResultType result =\n          CallableTraits<Callable>::template Invoke<T>(callable_, obj);\n      return MatchPrintAndExplain(result, matcher_, listener);\n    }\n\n   private:\n    // Functors often define operator() as non-const method even though\n    // they are actually stateless. But we need to use them even when\n    // 'this' is a const pointer. It's the user's responsibility not to\n    // use stateful callables with ResultOf(), which doesn't guarantee\n    // how many times the callable will be invoked.\n    mutable CallableStorageType callable_;\n    const Matcher<ResultType> matcher_;\n  };  // class Impl\n\n  const CallableStorageType callable_;\n  const InnerMatcher matcher_;\n};\n\n// Implements a matcher that checks the size of an STL-style container.\ntemplate <typename SizeMatcher>\nclass SizeIsMatcher {\n public:\n  explicit SizeIsMatcher(const SizeMatcher& size_matcher)\n       : size_matcher_(size_matcher) {\n  }\n\n  template <typename Container>\n  operator Matcher<Container>() const {\n    return Matcher<Container>(new Impl<const Container&>(size_matcher_));\n  }\n\n  template <typename Container>\n  class Impl : public MatcherInterface<Container> {\n   public:\n    using SizeType = decltype(std::declval<Container>().size());\n    explicit Impl(const SizeMatcher& size_matcher)\n        : size_matcher_(MatcherCast<SizeType>(size_matcher)) {}\n\n    void DescribeTo(::std::ostream* os) const override {\n      *os << \"size \";\n      size_matcher_.DescribeTo(os);\n    }\n    void DescribeNegationTo(::std::ostream* os) const override {\n      *os << \"size \";\n      size_matcher_.DescribeNegationTo(os);\n    }\n\n    bool MatchAndExplain(Container container,\n                         MatchResultListener* listener) const override {\n      SizeType size = container.size();\n      StringMatchResultListener size_listener;\n      const bool result = size_matcher_.MatchAndExplain(size, &size_listener);\n      *listener\n          << \"whose size \" << size << (result ? \" matches\" : \" doesn't match\");\n      PrintIfNotEmpty(size_listener.str(), listener->stream());\n      return result;\n    }\n\n   private:\n    const Matcher<SizeType> size_matcher_;\n  };\n\n private:\n  const SizeMatcher size_matcher_;\n};\n\n// Implements a matcher that checks the begin()..end() distance of an STL-style\n// container.\ntemplate <typename DistanceMatcher>\nclass BeginEndDistanceIsMatcher {\n public:\n  explicit BeginEndDistanceIsMatcher(const DistanceMatcher& distance_matcher)\n      : distance_matcher_(distance_matcher) {}\n\n  template <typename Container>\n  operator Matcher<Container>() const {\n    return Matcher<Container>(new Impl<const Container&>(distance_matcher_));\n  }\n\n  template <typename Container>\n  class Impl : public MatcherInterface<Container> {\n   public:\n    typedef internal::StlContainerView<\n        GTEST_REMOVE_REFERENCE_AND_CONST_(Container)> ContainerView;\n    typedef typename std::iterator_traits<\n        typename ContainerView::type::const_iterator>::difference_type\n        DistanceType;\n    explicit Impl(const DistanceMatcher& distance_matcher)\n        : distance_matcher_(MatcherCast<DistanceType>(distance_matcher)) {}\n\n    void DescribeTo(::std::ostream* os) const override {\n      *os << \"distance between begin() and end() \";\n      distance_matcher_.DescribeTo(os);\n    }\n    void DescribeNegationTo(::std::ostream* os) const override {\n      *os << \"distance between begin() and end() \";\n      distance_matcher_.DescribeNegationTo(os);\n    }\n\n    bool MatchAndExplain(Container container,\n                         MatchResultListener* listener) const override {\n      using std::begin;\n      using std::end;\n      DistanceType distance = std::distance(begin(container), end(container));\n      StringMatchResultListener distance_listener;\n      const bool result =\n          distance_matcher_.MatchAndExplain(distance, &distance_listener);\n      *listener << \"whose distance between begin() and end() \" << distance\n                << (result ? \" matches\" : \" doesn't match\");\n      PrintIfNotEmpty(distance_listener.str(), listener->stream());\n      return result;\n    }\n\n   private:\n    const Matcher<DistanceType> distance_matcher_;\n  };\n\n private:\n  const DistanceMatcher distance_matcher_;\n};\n\n// Implements an equality matcher for any STL-style container whose elements\n// support ==. This matcher is like Eq(), but its failure explanations provide\n// more detailed information that is useful when the container is used as a set.\n// The failure message reports elements that are in one of the operands but not\n// the other. The failure messages do not report duplicate or out-of-order\n// elements in the containers (which don't properly matter to sets, but can\n// occur if the containers are vectors or lists, for example).\n//\n// Uses the container's const_iterator, value_type, operator ==,\n// begin(), and end().\ntemplate <typename Container>\nclass ContainerEqMatcher {\n public:\n  typedef internal::StlContainerView<Container> View;\n  typedef typename View::type StlContainer;\n  typedef typename View::const_reference StlContainerReference;\n\n  static_assert(!std::is_const<Container>::value,\n                \"Container type must not be const\");\n  static_assert(!std::is_reference<Container>::value,\n                \"Container type must not be a reference\");\n\n  // We make a copy of expected in case the elements in it are modified\n  // after this matcher is created.\n  explicit ContainerEqMatcher(const Container& expected)\n      : expected_(View::Copy(expected)) {}\n\n  void DescribeTo(::std::ostream* os) const {\n    *os << \"equals \";\n    UniversalPrint(expected_, os);\n  }\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"does not equal \";\n    UniversalPrint(expected_, os);\n  }\n\n  template <typename LhsContainer>\n  bool MatchAndExplain(const LhsContainer& lhs,\n                       MatchResultListener* listener) const {\n    typedef internal::StlContainerView<\n        typename std::remove_const<LhsContainer>::type>\n        LhsView;\n    typedef typename LhsView::type LhsStlContainer;\n    StlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);\n    if (lhs_stl_container == expected_)\n      return true;\n\n    ::std::ostream* const os = listener->stream();\n    if (os != nullptr) {\n      // Something is different. Check for extra values first.\n      bool printed_header = false;\n      for (typename LhsStlContainer::const_iterator it =\n               lhs_stl_container.begin();\n           it != lhs_stl_container.end(); ++it) {\n        if (internal::ArrayAwareFind(expected_.begin(), expected_.end(), *it) ==\n            expected_.end()) {\n          if (printed_header) {\n            *os << \", \";\n          } else {\n            *os << \"which has these unexpected elements: \";\n            printed_header = true;\n          }\n          UniversalPrint(*it, os);\n        }\n      }\n\n      // Now check for missing values.\n      bool printed_header2 = false;\n      for (typename StlContainer::const_iterator it = expected_.begin();\n           it != expected_.end(); ++it) {\n        if (internal::ArrayAwareFind(\n                lhs_stl_container.begin(), lhs_stl_container.end(), *it) ==\n            lhs_stl_container.end()) {\n          if (printed_header2) {\n            *os << \", \";\n          } else {\n            *os << (printed_header ? \",\\nand\" : \"which\")\n                << \" doesn't have these expected elements: \";\n            printed_header2 = true;\n          }\n          UniversalPrint(*it, os);\n        }\n      }\n    }\n\n    return false;\n  }\n\n private:\n  const StlContainer expected_;\n};\n\n// A comparator functor that uses the < operator to compare two values.\nstruct LessComparator {\n  template <typename T, typename U>\n  bool operator()(const T& lhs, const U& rhs) const { return lhs < rhs; }\n};\n\n// Implements WhenSortedBy(comparator, container_matcher).\ntemplate <typename Comparator, typename ContainerMatcher>\nclass WhenSortedByMatcher {\n public:\n  WhenSortedByMatcher(const Comparator& comparator,\n                      const ContainerMatcher& matcher)\n      : comparator_(comparator), matcher_(matcher) {}\n\n  template <typename LhsContainer>\n  operator Matcher<LhsContainer>() const {\n    return MakeMatcher(new Impl<LhsContainer>(comparator_, matcher_));\n  }\n\n  template <typename LhsContainer>\n  class Impl : public MatcherInterface<LhsContainer> {\n   public:\n    typedef internal::StlContainerView<\n         GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)> LhsView;\n    typedef typename LhsView::type LhsStlContainer;\n    typedef typename LhsView::const_reference LhsStlContainerReference;\n    // Transforms std::pair<const Key, Value> into std::pair<Key, Value>\n    // so that we can match associative containers.\n    typedef typename RemoveConstFromKey<\n        typename LhsStlContainer::value_type>::type LhsValue;\n\n    Impl(const Comparator& comparator, const ContainerMatcher& matcher)\n        : comparator_(comparator), matcher_(matcher) {}\n\n    void DescribeTo(::std::ostream* os) const override {\n      *os << \"(when sorted) \";\n      matcher_.DescribeTo(os);\n    }\n\n    void DescribeNegationTo(::std::ostream* os) const override {\n      *os << \"(when sorted) \";\n      matcher_.DescribeNegationTo(os);\n    }\n\n    bool MatchAndExplain(LhsContainer lhs,\n                         MatchResultListener* listener) const override {\n      LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);\n      ::std::vector<LhsValue> sorted_container(lhs_stl_container.begin(),\n                                               lhs_stl_container.end());\n      ::std::sort(\n           sorted_container.begin(), sorted_container.end(), comparator_);\n\n      if (!listener->IsInterested()) {\n        // If the listener is not interested, we do not need to\n        // construct the inner explanation.\n        return matcher_.Matches(sorted_container);\n      }\n\n      *listener << \"which is \";\n      UniversalPrint(sorted_container, listener->stream());\n      *listener << \" when sorted\";\n\n      StringMatchResultListener inner_listener;\n      const bool match = matcher_.MatchAndExplain(sorted_container,\n                                                  &inner_listener);\n      PrintIfNotEmpty(inner_listener.str(), listener->stream());\n      return match;\n    }\n\n   private:\n    const Comparator comparator_;\n    const Matcher<const ::std::vector<LhsValue>&> matcher_;\n\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(Impl);\n  };\n\n private:\n  const Comparator comparator_;\n  const ContainerMatcher matcher_;\n};\n\n// Implements Pointwise(tuple_matcher, rhs_container).  tuple_matcher\n// must be able to be safely cast to Matcher<std::tuple<const T1&, const\n// T2&> >, where T1 and T2 are the types of elements in the LHS\n// container and the RHS container respectively.\ntemplate <typename TupleMatcher, typename RhsContainer>\nclass PointwiseMatcher {\n  GTEST_COMPILE_ASSERT_(\n      !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(RhsContainer)>::value,\n      use_UnorderedPointwise_with_hash_tables);\n\n public:\n  typedef internal::StlContainerView<RhsContainer> RhsView;\n  typedef typename RhsView::type RhsStlContainer;\n  typedef typename RhsStlContainer::value_type RhsValue;\n\n  static_assert(!std::is_const<RhsContainer>::value,\n                \"RhsContainer type must not be const\");\n  static_assert(!std::is_reference<RhsContainer>::value,\n                \"RhsContainer type must not be a reference\");\n\n  // Like ContainerEq, we make a copy of rhs in case the elements in\n  // it are modified after this matcher is created.\n  PointwiseMatcher(const TupleMatcher& tuple_matcher, const RhsContainer& rhs)\n      : tuple_matcher_(tuple_matcher), rhs_(RhsView::Copy(rhs)) {}\n\n  template <typename LhsContainer>\n  operator Matcher<LhsContainer>() const {\n    GTEST_COMPILE_ASSERT_(\n        !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)>::value,\n        use_UnorderedPointwise_with_hash_tables);\n\n    return Matcher<LhsContainer>(\n        new Impl<const LhsContainer&>(tuple_matcher_, rhs_));\n  }\n\n  template <typename LhsContainer>\n  class Impl : public MatcherInterface<LhsContainer> {\n   public:\n    typedef internal::StlContainerView<\n         GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)> LhsView;\n    typedef typename LhsView::type LhsStlContainer;\n    typedef typename LhsView::const_reference LhsStlContainerReference;\n    typedef typename LhsStlContainer::value_type LhsValue;\n    // We pass the LHS value and the RHS value to the inner matcher by\n    // reference, as they may be expensive to copy.  We must use tuple\n    // instead of pair here, as a pair cannot hold references (C++ 98,\n    // 20.2.2 [lib.pairs]).\n    typedef ::std::tuple<const LhsValue&, const RhsValue&> InnerMatcherArg;\n\n    Impl(const TupleMatcher& tuple_matcher, const RhsStlContainer& rhs)\n        // mono_tuple_matcher_ holds a monomorphic version of the tuple matcher.\n        : mono_tuple_matcher_(SafeMatcherCast<InnerMatcherArg>(tuple_matcher)),\n          rhs_(rhs) {}\n\n    void DescribeTo(::std::ostream* os) const override {\n      *os << \"contains \" << rhs_.size()\n          << \" values, where each value and its corresponding value in \";\n      UniversalPrinter<RhsStlContainer>::Print(rhs_, os);\n      *os << \" \";\n      mono_tuple_matcher_.DescribeTo(os);\n    }\n    void DescribeNegationTo(::std::ostream* os) const override {\n      *os << \"doesn't contain exactly \" << rhs_.size()\n          << \" values, or contains a value x at some index i\"\n          << \" where x and the i-th value of \";\n      UniversalPrint(rhs_, os);\n      *os << \" \";\n      mono_tuple_matcher_.DescribeNegationTo(os);\n    }\n\n    bool MatchAndExplain(LhsContainer lhs,\n                         MatchResultListener* listener) const override {\n      LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);\n      const size_t actual_size = lhs_stl_container.size();\n      if (actual_size != rhs_.size()) {\n        *listener << \"which contains \" << actual_size << \" values\";\n        return false;\n      }\n\n      typename LhsStlContainer::const_iterator left = lhs_stl_container.begin();\n      typename RhsStlContainer::const_iterator right = rhs_.begin();\n      for (size_t i = 0; i != actual_size; ++i, ++left, ++right) {\n        if (listener->IsInterested()) {\n          StringMatchResultListener inner_listener;\n          // Create InnerMatcherArg as a temporarily object to avoid it outlives\n          // *left and *right. Dereference or the conversion to `const T&` may\n          // return temp objects, e.g for vector<bool>.\n          if (!mono_tuple_matcher_.MatchAndExplain(\n                  InnerMatcherArg(ImplicitCast_<const LhsValue&>(*left),\n                                  ImplicitCast_<const RhsValue&>(*right)),\n                  &inner_listener)) {\n            *listener << \"where the value pair (\";\n            UniversalPrint(*left, listener->stream());\n            *listener << \", \";\n            UniversalPrint(*right, listener->stream());\n            *listener << \") at index #\" << i << \" don't match\";\n            PrintIfNotEmpty(inner_listener.str(), listener->stream());\n            return false;\n          }\n        } else {\n          if (!mono_tuple_matcher_.Matches(\n                  InnerMatcherArg(ImplicitCast_<const LhsValue&>(*left),\n                                  ImplicitCast_<const RhsValue&>(*right))))\n            return false;\n        }\n      }\n\n      return true;\n    }\n\n   private:\n    const Matcher<InnerMatcherArg> mono_tuple_matcher_;\n    const RhsStlContainer rhs_;\n  };\n\n private:\n  const TupleMatcher tuple_matcher_;\n  const RhsStlContainer rhs_;\n};\n\n// Holds the logic common to ContainsMatcherImpl and EachMatcherImpl.\ntemplate <typename Container>\nclass QuantifierMatcherImpl : public MatcherInterface<Container> {\n public:\n  typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;\n  typedef StlContainerView<RawContainer> View;\n  typedef typename View::type StlContainer;\n  typedef typename View::const_reference StlContainerReference;\n  typedef typename StlContainer::value_type Element;\n\n  template <typename InnerMatcher>\n  explicit QuantifierMatcherImpl(InnerMatcher inner_matcher)\n      : inner_matcher_(\n           testing::SafeMatcherCast<const Element&>(inner_matcher)) {}\n\n  // Checks whether:\n  // * All elements in the container match, if all_elements_should_match.\n  // * Any element in the container matches, if !all_elements_should_match.\n  bool MatchAndExplainImpl(bool all_elements_should_match,\n                           Container container,\n                           MatchResultListener* listener) const {\n    StlContainerReference stl_container = View::ConstReference(container);\n    size_t i = 0;\n    for (typename StlContainer::const_iterator it = stl_container.begin();\n         it != stl_container.end(); ++it, ++i) {\n      StringMatchResultListener inner_listener;\n      const bool matches = inner_matcher_.MatchAndExplain(*it, &inner_listener);\n\n      if (matches != all_elements_should_match) {\n        *listener << \"whose element #\" << i\n                  << (matches ? \" matches\" : \" doesn't match\");\n        PrintIfNotEmpty(inner_listener.str(), listener->stream());\n        return !all_elements_should_match;\n      }\n    }\n    return all_elements_should_match;\n  }\n\n protected:\n  const Matcher<const Element&> inner_matcher_;\n};\n\n// Implements Contains(element_matcher) for the given argument type Container.\n// Symmetric to EachMatcherImpl.\ntemplate <typename Container>\nclass ContainsMatcherImpl : public QuantifierMatcherImpl<Container> {\n public:\n  template <typename InnerMatcher>\n  explicit ContainsMatcherImpl(InnerMatcher inner_matcher)\n      : QuantifierMatcherImpl<Container>(inner_matcher) {}\n\n  // Describes what this matcher does.\n  void DescribeTo(::std::ostream* os) const override {\n    *os << \"contains at least one element that \";\n    this->inner_matcher_.DescribeTo(os);\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const override {\n    *os << \"doesn't contain any element that \";\n    this->inner_matcher_.DescribeTo(os);\n  }\n\n  bool MatchAndExplain(Container container,\n                       MatchResultListener* listener) const override {\n    return this->MatchAndExplainImpl(false, container, listener);\n  }\n};\n\n// Implements Each(element_matcher) for the given argument type Container.\n// Symmetric to ContainsMatcherImpl.\ntemplate <typename Container>\nclass EachMatcherImpl : public QuantifierMatcherImpl<Container> {\n public:\n  template <typename InnerMatcher>\n  explicit EachMatcherImpl(InnerMatcher inner_matcher)\n      : QuantifierMatcherImpl<Container>(inner_matcher) {}\n\n  // Describes what this matcher does.\n  void DescribeTo(::std::ostream* os) const override {\n    *os << \"only contains elements that \";\n    this->inner_matcher_.DescribeTo(os);\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const override {\n    *os << \"contains some element that \";\n    this->inner_matcher_.DescribeNegationTo(os);\n  }\n\n  bool MatchAndExplain(Container container,\n                       MatchResultListener* listener) const override {\n    return this->MatchAndExplainImpl(true, container, listener);\n  }\n};\n\n// Implements polymorphic Contains(element_matcher).\ntemplate <typename M>\nclass ContainsMatcher {\n public:\n  explicit ContainsMatcher(M m) : inner_matcher_(m) {}\n\n  template <typename Container>\n  operator Matcher<Container>() const {\n    return Matcher<Container>(\n        new ContainsMatcherImpl<const Container&>(inner_matcher_));\n  }\n\n private:\n  const M inner_matcher_;\n};\n\n// Implements polymorphic Each(element_matcher).\ntemplate <typename M>\nclass EachMatcher {\n public:\n  explicit EachMatcher(M m) : inner_matcher_(m) {}\n\n  template <typename Container>\n  operator Matcher<Container>() const {\n    return Matcher<Container>(\n        new EachMatcherImpl<const Container&>(inner_matcher_));\n  }\n\n private:\n  const M inner_matcher_;\n};\n\nstruct Rank1 {};\nstruct Rank0 : Rank1 {};\n\nnamespace pair_getters {\nusing std::get;\ntemplate <typename T>\nauto First(T& x, Rank1) -> decltype(get<0>(x)) {  // NOLINT\n  return get<0>(x);\n}\ntemplate <typename T>\nauto First(T& x, Rank0) -> decltype((x.first)) {  // NOLINT\n  return x.first;\n}\n\ntemplate <typename T>\nauto Second(T& x, Rank1) -> decltype(get<1>(x)) {  // NOLINT\n  return get<1>(x);\n}\ntemplate <typename T>\nauto Second(T& x, Rank0) -> decltype((x.second)) {  // NOLINT\n  return x.second;\n}\n}  // namespace pair_getters\n\n// Implements Key(inner_matcher) for the given argument pair type.\n// Key(inner_matcher) matches an std::pair whose 'first' field matches\n// inner_matcher.  For example, Contains(Key(Ge(5))) can be used to match an\n// std::map that contains at least one element whose key is >= 5.\ntemplate <typename PairType>\nclass KeyMatcherImpl : public MatcherInterface<PairType> {\n public:\n  typedef GTEST_REMOVE_REFERENCE_AND_CONST_(PairType) RawPairType;\n  typedef typename RawPairType::first_type KeyType;\n\n  template <typename InnerMatcher>\n  explicit KeyMatcherImpl(InnerMatcher inner_matcher)\n      : inner_matcher_(\n          testing::SafeMatcherCast<const KeyType&>(inner_matcher)) {\n  }\n\n  // Returns true if and only if 'key_value.first' (the key) matches the inner\n  // matcher.\n  bool MatchAndExplain(PairType key_value,\n                       MatchResultListener* listener) const override {\n    StringMatchResultListener inner_listener;\n    const bool match = inner_matcher_.MatchAndExplain(\n        pair_getters::First(key_value, Rank0()), &inner_listener);\n    const std::string explanation = inner_listener.str();\n    if (explanation != \"\") {\n      *listener << \"whose first field is a value \" << explanation;\n    }\n    return match;\n  }\n\n  // Describes what this matcher does.\n  void DescribeTo(::std::ostream* os) const override {\n    *os << \"has a key that \";\n    inner_matcher_.DescribeTo(os);\n  }\n\n  // Describes what the negation of this matcher does.\n  void DescribeNegationTo(::std::ostream* os) const override {\n    *os << \"doesn't have a key that \";\n    inner_matcher_.DescribeTo(os);\n  }\n\n private:\n  const Matcher<const KeyType&> inner_matcher_;\n};\n\n// Implements polymorphic Key(matcher_for_key).\ntemplate <typename M>\nclass KeyMatcher {\n public:\n  explicit KeyMatcher(M m) : matcher_for_key_(m) {}\n\n  template <typename PairType>\n  operator Matcher<PairType>() const {\n    return Matcher<PairType>(\n        new KeyMatcherImpl<const PairType&>(matcher_for_key_));\n  }\n\n private:\n  const M matcher_for_key_;\n};\n\n// Implements polymorphic Address(matcher_for_address).\ntemplate <typename InnerMatcher>\nclass AddressMatcher {\n public:\n  explicit AddressMatcher(InnerMatcher m) : matcher_(m) {}\n\n  template <typename Type>\n  operator Matcher<Type>() const {  // NOLINT\n    return Matcher<Type>(new Impl<const Type&>(matcher_));\n  }\n\n private:\n  // The monomorphic implementation that works for a particular object type.\n  template <typename Type>\n  class Impl : public MatcherInterface<Type> {\n   public:\n    using Address = const GTEST_REMOVE_REFERENCE_AND_CONST_(Type) *;\n    explicit Impl(const InnerMatcher& matcher)\n        : matcher_(MatcherCast<Address>(matcher)) {}\n\n    void DescribeTo(::std::ostream* os) const override {\n      *os << \"has address that \";\n      matcher_.DescribeTo(os);\n    }\n\n    void DescribeNegationTo(::std::ostream* os) const override {\n      *os << \"does not have address that \";\n      matcher_.DescribeTo(os);\n    }\n\n    bool MatchAndExplain(Type object,\n                         MatchResultListener* listener) const override {\n      *listener << \"which has address \";\n      Address address = std::addressof(object);\n      return MatchPrintAndExplain(address, matcher_, listener);\n    }\n\n   private:\n    const Matcher<Address> matcher_;\n  };\n  const InnerMatcher matcher_;\n};\n\n// Implements Pair(first_matcher, second_matcher) for the given argument pair\n// type with its two matchers. See Pair() function below.\ntemplate <typename PairType>\nclass PairMatcherImpl : public MatcherInterface<PairType> {\n public:\n  typedef GTEST_REMOVE_REFERENCE_AND_CONST_(PairType) RawPairType;\n  typedef typename RawPairType::first_type FirstType;\n  typedef typename RawPairType::second_type SecondType;\n\n  template <typename FirstMatcher, typename SecondMatcher>\n  PairMatcherImpl(FirstMatcher first_matcher, SecondMatcher second_matcher)\n      : first_matcher_(\n            testing::SafeMatcherCast<const FirstType&>(first_matcher)),\n        second_matcher_(\n            testing::SafeMatcherCast<const SecondType&>(second_matcher)) {\n  }\n\n  // Describes what this matcher does.\n  void DescribeTo(::std::ostream* os) const override {\n    *os << \"has a first field that \";\n    first_matcher_.DescribeTo(os);\n    *os << \", and has a second field that \";\n    second_matcher_.DescribeTo(os);\n  }\n\n  // Describes what the negation of this matcher does.\n  void DescribeNegationTo(::std::ostream* os) const override {\n    *os << \"has a first field that \";\n    first_matcher_.DescribeNegationTo(os);\n    *os << \", or has a second field that \";\n    second_matcher_.DescribeNegationTo(os);\n  }\n\n  // Returns true if and only if 'a_pair.first' matches first_matcher and\n  // 'a_pair.second' matches second_matcher.\n  bool MatchAndExplain(PairType a_pair,\n                       MatchResultListener* listener) const override {\n    if (!listener->IsInterested()) {\n      // If the listener is not interested, we don't need to construct the\n      // explanation.\n      return first_matcher_.Matches(pair_getters::First(a_pair, Rank0())) &&\n             second_matcher_.Matches(pair_getters::Second(a_pair, Rank0()));\n    }\n    StringMatchResultListener first_inner_listener;\n    if (!first_matcher_.MatchAndExplain(pair_getters::First(a_pair, Rank0()),\n                                        &first_inner_listener)) {\n      *listener << \"whose first field does not match\";\n      PrintIfNotEmpty(first_inner_listener.str(), listener->stream());\n      return false;\n    }\n    StringMatchResultListener second_inner_listener;\n    if (!second_matcher_.MatchAndExplain(pair_getters::Second(a_pair, Rank0()),\n                                         &second_inner_listener)) {\n      *listener << \"whose second field does not match\";\n      PrintIfNotEmpty(second_inner_listener.str(), listener->stream());\n      return false;\n    }\n    ExplainSuccess(first_inner_listener.str(), second_inner_listener.str(),\n                   listener);\n    return true;\n  }\n\n private:\n  void ExplainSuccess(const std::string& first_explanation,\n                      const std::string& second_explanation,\n                      MatchResultListener* listener) const {\n    *listener << \"whose both fields match\";\n    if (first_explanation != \"\") {\n      *listener << \", where the first field is a value \" << first_explanation;\n    }\n    if (second_explanation != \"\") {\n      *listener << \", \";\n      if (first_explanation != \"\") {\n        *listener << \"and \";\n      } else {\n        *listener << \"where \";\n      }\n      *listener << \"the second field is a value \" << second_explanation;\n    }\n  }\n\n  const Matcher<const FirstType&> first_matcher_;\n  const Matcher<const SecondType&> second_matcher_;\n};\n\n// Implements polymorphic Pair(first_matcher, second_matcher).\ntemplate <typename FirstMatcher, typename SecondMatcher>\nclass PairMatcher {\n public:\n  PairMatcher(FirstMatcher first_matcher, SecondMatcher second_matcher)\n      : first_matcher_(first_matcher), second_matcher_(second_matcher) {}\n\n  template <typename PairType>\n  operator Matcher<PairType> () const {\n    return Matcher<PairType>(\n        new PairMatcherImpl<const PairType&>(first_matcher_, second_matcher_));\n  }\n\n private:\n  const FirstMatcher first_matcher_;\n  const SecondMatcher second_matcher_;\n};\n\ntemplate <typename T, size_t... I>\nauto UnpackStructImpl(const T& t, IndexSequence<I...>, int)\n    -> decltype(std::tie(get<I>(t)...)) {\n  static_assert(std::tuple_size<T>::value == sizeof...(I),\n                \"Number of arguments doesn't match the number of fields.\");\n  return std::tie(get<I>(t)...);\n}\n\n#if defined(__cpp_structured_bindings) && __cpp_structured_bindings >= 201606\ntemplate <typename T>\nauto UnpackStructImpl(const T& t, MakeIndexSequence<1>, char) {\n  const auto& [a] = t;\n  return std::tie(a);\n}\ntemplate <typename T>\nauto UnpackStructImpl(const T& t, MakeIndexSequence<2>, char) {\n  const auto& [a, b] = t;\n  return std::tie(a, b);\n}\ntemplate <typename T>\nauto UnpackStructImpl(const T& t, MakeIndexSequence<3>, char) {\n  const auto& [a, b, c] = t;\n  return std::tie(a, b, c);\n}\ntemplate <typename T>\nauto UnpackStructImpl(const T& t, MakeIndexSequence<4>, char) {\n  const auto& [a, b, c, d] = t;\n  return std::tie(a, b, c, d);\n}\ntemplate <typename T>\nauto UnpackStructImpl(const T& t, MakeIndexSequence<5>, char) {\n  const auto& [a, b, c, d, e] = t;\n  return std::tie(a, b, c, d, e);\n}\ntemplate <typename T>\nauto UnpackStructImpl(const T& t, MakeIndexSequence<6>, char) {\n  const auto& [a, b, c, d, e, f] = t;\n  return std::tie(a, b, c, d, e, f);\n}\ntemplate <typename T>\nauto UnpackStructImpl(const T& t, MakeIndexSequence<7>, char) {\n  const auto& [a, b, c, d, e, f, g] = t;\n  return std::tie(a, b, c, d, e, f, g);\n}\ntemplate <typename T>\nauto UnpackStructImpl(const T& t, MakeIndexSequence<8>, char) {\n  const auto& [a, b, c, d, e, f, g, h] = t;\n  return std::tie(a, b, c, d, e, f, g, h);\n}\ntemplate <typename T>\nauto UnpackStructImpl(const T& t, MakeIndexSequence<9>, char) {\n  const auto& [a, b, c, d, e, f, g, h, i] = t;\n  return std::tie(a, b, c, d, e, f, g, h, i);\n}\ntemplate <typename T>\nauto UnpackStructImpl(const T& t, MakeIndexSequence<10>, char) {\n  const auto& [a, b, c, d, e, f, g, h, i, j] = t;\n  return std::tie(a, b, c, d, e, f, g, h, i, j);\n}\ntemplate <typename T>\nauto UnpackStructImpl(const T& t, MakeIndexSequence<11>, char) {\n  const auto& [a, b, c, d, e, f, g, h, i, j, k] = t;\n  return std::tie(a, b, c, d, e, f, g, h, i, j, k);\n}\ntemplate <typename T>\nauto UnpackStructImpl(const T& t, MakeIndexSequence<12>, char) {\n  const auto& [a, b, c, d, e, f, g, h, i, j, k, l] = t;\n  return std::tie(a, b, c, d, e, f, g, h, i, j, k, l);\n}\ntemplate <typename T>\nauto UnpackStructImpl(const T& t, MakeIndexSequence<13>, char) {\n  const auto& [a, b, c, d, e, f, g, h, i, j, k, l, m] = t;\n  return std::tie(a, b, c, d, e, f, g, h, i, j, k, l, m);\n}\ntemplate <typename T>\nauto UnpackStructImpl(const T& t, MakeIndexSequence<14>, char) {\n  const auto& [a, b, c, d, e, f, g, h, i, j, k, l, m, n] = t;\n  return std::tie(a, b, c, d, e, f, g, h, i, j, k, l, m, n);\n}\ntemplate <typename T>\nauto UnpackStructImpl(const T& t, MakeIndexSequence<15>, char) {\n  const auto& [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o] = t;\n  return std::tie(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);\n}\ntemplate <typename T>\nauto UnpackStructImpl(const T& t, MakeIndexSequence<16>, char) {\n  const auto& [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p] = t;\n  return std::tie(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p);\n}\n#endif  // defined(__cpp_structured_bindings)\n\ntemplate <size_t I, typename T>\nauto UnpackStruct(const T& t)\n    -> decltype((UnpackStructImpl)(t, MakeIndexSequence<I>{}, 0)) {\n  return (UnpackStructImpl)(t, MakeIndexSequence<I>{}, 0);\n}\n\n// Helper function to do comma folding in C++11.\n// The array ensures left-to-right order of evaluation.\n// Usage: VariadicExpand({expr...});\ntemplate <typename T, size_t N>\nvoid VariadicExpand(const T (&)[N]) {}\n\ntemplate <typename Struct, typename StructSize>\nclass FieldsAreMatcherImpl;\n\ntemplate <typename Struct, size_t... I>\nclass FieldsAreMatcherImpl<Struct, IndexSequence<I...>>\n    : public MatcherInterface<Struct> {\n  using UnpackedType =\n      decltype(UnpackStruct<sizeof...(I)>(std::declval<const Struct&>()));\n  using MatchersType = std::tuple<\n      Matcher<const typename std::tuple_element<I, UnpackedType>::type&>...>;\n\n public:\n  template <typename Inner>\n  explicit FieldsAreMatcherImpl(const Inner& matchers)\n      : matchers_(testing::SafeMatcherCast<\n                  const typename std::tuple_element<I, UnpackedType>::type&>(\n            std::get<I>(matchers))...) {}\n\n  void DescribeTo(::std::ostream* os) const override {\n    const char* separator = \"\";\n    VariadicExpand(\n        {(*os << separator << \"has field #\" << I << \" that \",\n          std::get<I>(matchers_).DescribeTo(os), separator = \", and \")...});\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const override {\n    const char* separator = \"\";\n    VariadicExpand({(*os << separator << \"has field #\" << I << \" that \",\n                     std::get<I>(matchers_).DescribeNegationTo(os),\n                     separator = \", or \")...});\n  }\n\n  bool MatchAndExplain(Struct t, MatchResultListener* listener) const override {\n    return MatchInternal((UnpackStruct<sizeof...(I)>)(t), listener);\n  }\n\n private:\n  bool MatchInternal(UnpackedType tuple, MatchResultListener* listener) const {\n    if (!listener->IsInterested()) {\n      // If the listener is not interested, we don't need to construct the\n      // explanation.\n      bool good = true;\n      VariadicExpand({good = good && std::get<I>(matchers_).Matches(\n                                         std::get<I>(tuple))...});\n      return good;\n    }\n\n    size_t failed_pos = ~size_t{};\n\n    std::vector<StringMatchResultListener> inner_listener(sizeof...(I));\n\n    VariadicExpand(\n        {failed_pos == ~size_t{} && !std::get<I>(matchers_).MatchAndExplain(\n                                        std::get<I>(tuple), &inner_listener[I])\n             ? failed_pos = I\n             : 0 ...});\n    if (failed_pos != ~size_t{}) {\n      *listener << \"whose field #\" << failed_pos << \" does not match\";\n      PrintIfNotEmpty(inner_listener[failed_pos].str(), listener->stream());\n      return false;\n    }\n\n    *listener << \"whose all elements match\";\n    const char* separator = \", where\";\n    for (size_t index = 0; index < sizeof...(I); ++index) {\n      const std::string str = inner_listener[index].str();\n      if (!str.empty()) {\n        *listener << separator << \" field #\" << index << \" is a value \" << str;\n        separator = \", and\";\n      }\n    }\n\n    return true;\n  }\n\n  MatchersType matchers_;\n};\n\ntemplate <typename... Inner>\nclass FieldsAreMatcher {\n public:\n  explicit FieldsAreMatcher(Inner... inner) : matchers_(std::move(inner)...) {}\n\n  template <typename Struct>\n  operator Matcher<Struct>() const {  // NOLINT\n    return Matcher<Struct>(\n        new FieldsAreMatcherImpl<const Struct&, IndexSequenceFor<Inner...>>(\n            matchers_));\n  }\n\n private:\n  std::tuple<Inner...> matchers_;\n};\n\n// Implements ElementsAre() and ElementsAreArray().\ntemplate <typename Container>\nclass ElementsAreMatcherImpl : public MatcherInterface<Container> {\n public:\n  typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;\n  typedef internal::StlContainerView<RawContainer> View;\n  typedef typename View::type StlContainer;\n  typedef typename View::const_reference StlContainerReference;\n  typedef typename StlContainer::value_type Element;\n\n  // Constructs the matcher from a sequence of element values or\n  // element matchers.\n  template <typename InputIter>\n  ElementsAreMatcherImpl(InputIter first, InputIter last) {\n    while (first != last) {\n      matchers_.push_back(MatcherCast<const Element&>(*first++));\n    }\n  }\n\n  // Describes what this matcher does.\n  void DescribeTo(::std::ostream* os) const override {\n    if (count() == 0) {\n      *os << \"is empty\";\n    } else if (count() == 1) {\n      *os << \"has 1 element that \";\n      matchers_[0].DescribeTo(os);\n    } else {\n      *os << \"has \" << Elements(count()) << \" where\\n\";\n      for (size_t i = 0; i != count(); ++i) {\n        *os << \"element #\" << i << \" \";\n        matchers_[i].DescribeTo(os);\n        if (i + 1 < count()) {\n          *os << \",\\n\";\n        }\n      }\n    }\n  }\n\n  // Describes what the negation of this matcher does.\n  void DescribeNegationTo(::std::ostream* os) const override {\n    if (count() == 0) {\n      *os << \"isn't empty\";\n      return;\n    }\n\n    *os << \"doesn't have \" << Elements(count()) << \", or\\n\";\n    for (size_t i = 0; i != count(); ++i) {\n      *os << \"element #\" << i << \" \";\n      matchers_[i].DescribeNegationTo(os);\n      if (i + 1 < count()) {\n        *os << \", or\\n\";\n      }\n    }\n  }\n\n  bool MatchAndExplain(Container container,\n                       MatchResultListener* listener) const override {\n    // To work with stream-like \"containers\", we must only walk\n    // through the elements in one pass.\n\n    const bool listener_interested = listener->IsInterested();\n\n    // explanations[i] is the explanation of the element at index i.\n    ::std::vector<std::string> explanations(count());\n    StlContainerReference stl_container = View::ConstReference(container);\n    typename StlContainer::const_iterator it = stl_container.begin();\n    size_t exam_pos = 0;\n    bool mismatch_found = false;  // Have we found a mismatched element yet?\n\n    // Go through the elements and matchers in pairs, until we reach\n    // the end of either the elements or the matchers, or until we find a\n    // mismatch.\n    for (; it != stl_container.end() && exam_pos != count(); ++it, ++exam_pos) {\n      bool match;  // Does the current element match the current matcher?\n      if (listener_interested) {\n        StringMatchResultListener s;\n        match = matchers_[exam_pos].MatchAndExplain(*it, &s);\n        explanations[exam_pos] = s.str();\n      } else {\n        match = matchers_[exam_pos].Matches(*it);\n      }\n\n      if (!match) {\n        mismatch_found = true;\n        break;\n      }\n    }\n    // If mismatch_found is true, 'exam_pos' is the index of the mismatch.\n\n    // Find how many elements the actual container has.  We avoid\n    // calling size() s.t. this code works for stream-like \"containers\"\n    // that don't define size().\n    size_t actual_count = exam_pos;\n    for (; it != stl_container.end(); ++it) {\n      ++actual_count;\n    }\n\n    if (actual_count != count()) {\n      // The element count doesn't match.  If the container is empty,\n      // there's no need to explain anything as Google Mock already\n      // prints the empty container.  Otherwise we just need to show\n      // how many elements there actually are.\n      if (listener_interested && (actual_count != 0)) {\n        *listener << \"which has \" << Elements(actual_count);\n      }\n      return false;\n    }\n\n    if (mismatch_found) {\n      // The element count matches, but the exam_pos-th element doesn't match.\n      if (listener_interested) {\n        *listener << \"whose element #\" << exam_pos << \" doesn't match\";\n        PrintIfNotEmpty(explanations[exam_pos], listener->stream());\n      }\n      return false;\n    }\n\n    // Every element matches its expectation.  We need to explain why\n    // (the obvious ones can be skipped).\n    if (listener_interested) {\n      bool reason_printed = false;\n      for (size_t i = 0; i != count(); ++i) {\n        const std::string& s = explanations[i];\n        if (!s.empty()) {\n          if (reason_printed) {\n            *listener << \",\\nand \";\n          }\n          *listener << \"whose element #\" << i << \" matches, \" << s;\n          reason_printed = true;\n        }\n      }\n    }\n    return true;\n  }\n\n private:\n  static Message Elements(size_t count) {\n    return Message() << count << (count == 1 ? \" element\" : \" elements\");\n  }\n\n  size_t count() const { return matchers_.size(); }\n\n  ::std::vector<Matcher<const Element&> > matchers_;\n};\n\n// Connectivity matrix of (elements X matchers), in element-major order.\n// Initially, there are no edges.\n// Use NextGraph() to iterate over all possible edge configurations.\n// Use Randomize() to generate a random edge configuration.\nclass GTEST_API_ MatchMatrix {\n public:\n  MatchMatrix(size_t num_elements, size_t num_matchers)\n      : num_elements_(num_elements),\n        num_matchers_(num_matchers),\n        matched_(num_elements_* num_matchers_, 0) {\n  }\n\n  size_t LhsSize() const { return num_elements_; }\n  size_t RhsSize() const { return num_matchers_; }\n  bool HasEdge(size_t ilhs, size_t irhs) const {\n    return matched_[SpaceIndex(ilhs, irhs)] == 1;\n  }\n  void SetEdge(size_t ilhs, size_t irhs, bool b) {\n    matched_[SpaceIndex(ilhs, irhs)] = b ? 1 : 0;\n  }\n\n  // Treating the connectivity matrix as a (LhsSize()*RhsSize())-bit number,\n  // adds 1 to that number; returns false if incrementing the graph left it\n  // empty.\n  bool NextGraph();\n\n  void Randomize();\n\n  std::string DebugString() const;\n\n private:\n  size_t SpaceIndex(size_t ilhs, size_t irhs) const {\n    return ilhs * num_matchers_ + irhs;\n  }\n\n  size_t num_elements_;\n  size_t num_matchers_;\n\n  // Each element is a char interpreted as bool. They are stored as a\n  // flattened array in lhs-major order, use 'SpaceIndex()' to translate\n  // a (ilhs, irhs) matrix coordinate into an offset.\n  ::std::vector<char> matched_;\n};\n\ntypedef ::std::pair<size_t, size_t> ElementMatcherPair;\ntypedef ::std::vector<ElementMatcherPair> ElementMatcherPairs;\n\n// Returns a maximum bipartite matching for the specified graph 'g'.\n// The matching is represented as a vector of {element, matcher} pairs.\nGTEST_API_ ElementMatcherPairs\nFindMaxBipartiteMatching(const MatchMatrix& g);\n\nstruct UnorderedMatcherRequire {\n  enum Flags {\n    Superset = 1 << 0,\n    Subset = 1 << 1,\n    ExactMatch = Superset | Subset,\n  };\n};\n\n// Untyped base class for implementing UnorderedElementsAre.  By\n// putting logic that's not specific to the element type here, we\n// reduce binary bloat and increase compilation speed.\nclass GTEST_API_ UnorderedElementsAreMatcherImplBase {\n protected:\n  explicit UnorderedElementsAreMatcherImplBase(\n      UnorderedMatcherRequire::Flags matcher_flags)\n      : match_flags_(matcher_flags) {}\n\n  // A vector of matcher describers, one for each element matcher.\n  // Does not own the describers (and thus can be used only when the\n  // element matchers are alive).\n  typedef ::std::vector<const MatcherDescriberInterface*> MatcherDescriberVec;\n\n  // Describes this UnorderedElementsAre matcher.\n  void DescribeToImpl(::std::ostream* os) const;\n\n  // Describes the negation of this UnorderedElementsAre matcher.\n  void DescribeNegationToImpl(::std::ostream* os) const;\n\n  bool VerifyMatchMatrix(const ::std::vector<std::string>& element_printouts,\n                         const MatchMatrix& matrix,\n                         MatchResultListener* listener) const;\n\n  bool FindPairing(const MatchMatrix& matrix,\n                   MatchResultListener* listener) const;\n\n  MatcherDescriberVec& matcher_describers() {\n    return matcher_describers_;\n  }\n\n  static Message Elements(size_t n) {\n    return Message() << n << \" element\" << (n == 1 ? \"\" : \"s\");\n  }\n\n  UnorderedMatcherRequire::Flags match_flags() const { return match_flags_; }\n\n private:\n  UnorderedMatcherRequire::Flags match_flags_;\n  MatcherDescriberVec matcher_describers_;\n};\n\n// Implements UnorderedElementsAre, UnorderedElementsAreArray, IsSubsetOf, and\n// IsSupersetOf.\ntemplate <typename Container>\nclass UnorderedElementsAreMatcherImpl\n    : public MatcherInterface<Container>,\n      public UnorderedElementsAreMatcherImplBase {\n public:\n  typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;\n  typedef internal::StlContainerView<RawContainer> View;\n  typedef typename View::type StlContainer;\n  typedef typename View::const_reference StlContainerReference;\n  typedef typename StlContainer::const_iterator StlContainerConstIterator;\n  typedef typename StlContainer::value_type Element;\n\n  template <typename InputIter>\n  UnorderedElementsAreMatcherImpl(UnorderedMatcherRequire::Flags matcher_flags,\n                                  InputIter first, InputIter last)\n      : UnorderedElementsAreMatcherImplBase(matcher_flags) {\n    for (; first != last; ++first) {\n      matchers_.push_back(MatcherCast<const Element&>(*first));\n    }\n    for (const auto& m : matchers_) {\n      matcher_describers().push_back(m.GetDescriber());\n    }\n  }\n\n  // Describes what this matcher does.\n  void DescribeTo(::std::ostream* os) const override {\n    return UnorderedElementsAreMatcherImplBase::DescribeToImpl(os);\n  }\n\n  // Describes what the negation of this matcher does.\n  void DescribeNegationTo(::std::ostream* os) const override {\n    return UnorderedElementsAreMatcherImplBase::DescribeNegationToImpl(os);\n  }\n\n  bool MatchAndExplain(Container container,\n                       MatchResultListener* listener) const override {\n    StlContainerReference stl_container = View::ConstReference(container);\n    ::std::vector<std::string> element_printouts;\n    MatchMatrix matrix =\n        AnalyzeElements(stl_container.begin(), stl_container.end(),\n                        &element_printouts, listener);\n\n    if (matrix.LhsSize() == 0 && matrix.RhsSize() == 0) {\n      return true;\n    }\n\n    if (match_flags() == UnorderedMatcherRequire::ExactMatch) {\n      if (matrix.LhsSize() != matrix.RhsSize()) {\n        // The element count doesn't match.  If the container is empty,\n        // there's no need to explain anything as Google Mock already\n        // prints the empty container. Otherwise we just need to show\n        // how many elements there actually are.\n        if (matrix.LhsSize() != 0 && listener->IsInterested()) {\n          *listener << \"which has \" << Elements(matrix.LhsSize());\n        }\n        return false;\n      }\n    }\n\n    return VerifyMatchMatrix(element_printouts, matrix, listener) &&\n           FindPairing(matrix, listener);\n  }\n\n private:\n  template <typename ElementIter>\n  MatchMatrix AnalyzeElements(ElementIter elem_first, ElementIter elem_last,\n                              ::std::vector<std::string>* element_printouts,\n                              MatchResultListener* listener) const {\n    element_printouts->clear();\n    ::std::vector<char> did_match;\n    size_t num_elements = 0;\n    DummyMatchResultListener dummy;\n    for (; elem_first != elem_last; ++num_elements, ++elem_first) {\n      if (listener->IsInterested()) {\n        element_printouts->push_back(PrintToString(*elem_first));\n      }\n      for (size_t irhs = 0; irhs != matchers_.size(); ++irhs) {\n        did_match.push_back(\n            matchers_[irhs].MatchAndExplain(*elem_first, &dummy));\n      }\n    }\n\n    MatchMatrix matrix(num_elements, matchers_.size());\n    ::std::vector<char>::const_iterator did_match_iter = did_match.begin();\n    for (size_t ilhs = 0; ilhs != num_elements; ++ilhs) {\n      for (size_t irhs = 0; irhs != matchers_.size(); ++irhs) {\n        matrix.SetEdge(ilhs, irhs, *did_match_iter++ != 0);\n      }\n    }\n    return matrix;\n  }\n\n  ::std::vector<Matcher<const Element&> > matchers_;\n};\n\n// Functor for use in TransformTuple.\n// Performs MatcherCast<Target> on an input argument of any type.\ntemplate <typename Target>\nstruct CastAndAppendTransform {\n  template <typename Arg>\n  Matcher<Target> operator()(const Arg& a) const {\n    return MatcherCast<Target>(a);\n  }\n};\n\n// Implements UnorderedElementsAre.\ntemplate <typename MatcherTuple>\nclass UnorderedElementsAreMatcher {\n public:\n  explicit UnorderedElementsAreMatcher(const MatcherTuple& args)\n      : matchers_(args) {}\n\n  template <typename Container>\n  operator Matcher<Container>() const {\n    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;\n    typedef typename internal::StlContainerView<RawContainer>::type View;\n    typedef typename View::value_type Element;\n    typedef ::std::vector<Matcher<const Element&> > MatcherVec;\n    MatcherVec matchers;\n    matchers.reserve(::std::tuple_size<MatcherTuple>::value);\n    TransformTupleValues(CastAndAppendTransform<const Element&>(), matchers_,\n                         ::std::back_inserter(matchers));\n    return Matcher<Container>(\n        new UnorderedElementsAreMatcherImpl<const Container&>(\n            UnorderedMatcherRequire::ExactMatch, matchers.begin(),\n            matchers.end()));\n  }\n\n private:\n  const MatcherTuple matchers_;\n};\n\n// Implements ElementsAre.\ntemplate <typename MatcherTuple>\nclass ElementsAreMatcher {\n public:\n  explicit ElementsAreMatcher(const MatcherTuple& args) : matchers_(args) {}\n\n  template <typename Container>\n  operator Matcher<Container>() const {\n    GTEST_COMPILE_ASSERT_(\n        !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>::value ||\n            ::std::tuple_size<MatcherTuple>::value < 2,\n        use_UnorderedElementsAre_with_hash_tables);\n\n    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;\n    typedef typename internal::StlContainerView<RawContainer>::type View;\n    typedef typename View::value_type Element;\n    typedef ::std::vector<Matcher<const Element&> > MatcherVec;\n    MatcherVec matchers;\n    matchers.reserve(::std::tuple_size<MatcherTuple>::value);\n    TransformTupleValues(CastAndAppendTransform<const Element&>(), matchers_,\n                         ::std::back_inserter(matchers));\n    return Matcher<Container>(new ElementsAreMatcherImpl<const Container&>(\n        matchers.begin(), matchers.end()));\n  }\n\n private:\n  const MatcherTuple matchers_;\n};\n\n// Implements UnorderedElementsAreArray(), IsSubsetOf(), and IsSupersetOf().\ntemplate <typename T>\nclass UnorderedElementsAreArrayMatcher {\n public:\n  template <typename Iter>\n  UnorderedElementsAreArrayMatcher(UnorderedMatcherRequire::Flags match_flags,\n                                   Iter first, Iter last)\n      : match_flags_(match_flags), matchers_(first, last) {}\n\n  template <typename Container>\n  operator Matcher<Container>() const {\n    return Matcher<Container>(\n        new UnorderedElementsAreMatcherImpl<const Container&>(\n            match_flags_, matchers_.begin(), matchers_.end()));\n  }\n\n private:\n  UnorderedMatcherRequire::Flags match_flags_;\n  ::std::vector<T> matchers_;\n};\n\n// Implements ElementsAreArray().\ntemplate <typename T>\nclass ElementsAreArrayMatcher {\n public:\n  template <typename Iter>\n  ElementsAreArrayMatcher(Iter first, Iter last) : matchers_(first, last) {}\n\n  template <typename Container>\n  operator Matcher<Container>() const {\n    GTEST_COMPILE_ASSERT_(\n        !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>::value,\n        use_UnorderedElementsAreArray_with_hash_tables);\n\n    return Matcher<Container>(new ElementsAreMatcherImpl<const Container&>(\n        matchers_.begin(), matchers_.end()));\n  }\n\n private:\n  const ::std::vector<T> matchers_;\n};\n\n// Given a 2-tuple matcher tm of type Tuple2Matcher and a value second\n// of type Second, BoundSecondMatcher<Tuple2Matcher, Second>(tm,\n// second) is a polymorphic matcher that matches a value x if and only if\n// tm matches tuple (x, second).  Useful for implementing\n// UnorderedPointwise() in terms of UnorderedElementsAreArray().\n//\n// BoundSecondMatcher is copyable and assignable, as we need to put\n// instances of this class in a vector when implementing\n// UnorderedPointwise().\ntemplate <typename Tuple2Matcher, typename Second>\nclass BoundSecondMatcher {\n public:\n  BoundSecondMatcher(const Tuple2Matcher& tm, const Second& second)\n      : tuple2_matcher_(tm), second_value_(second) {}\n\n  BoundSecondMatcher(const BoundSecondMatcher& other) = default;\n\n  template <typename T>\n  operator Matcher<T>() const {\n    return MakeMatcher(new Impl<T>(tuple2_matcher_, second_value_));\n  }\n\n  // We have to define this for UnorderedPointwise() to compile in\n  // C++98 mode, as it puts BoundSecondMatcher instances in a vector,\n  // which requires the elements to be assignable in C++98.  The\n  // compiler cannot generate the operator= for us, as Tuple2Matcher\n  // and Second may not be assignable.\n  //\n  // However, this should never be called, so the implementation just\n  // need to assert.\n  void operator=(const BoundSecondMatcher& /*rhs*/) {\n    GTEST_LOG_(FATAL) << \"BoundSecondMatcher should never be assigned.\";\n  }\n\n private:\n  template <typename T>\n  class Impl : public MatcherInterface<T> {\n   public:\n    typedef ::std::tuple<T, Second> ArgTuple;\n\n    Impl(const Tuple2Matcher& tm, const Second& second)\n        : mono_tuple2_matcher_(SafeMatcherCast<const ArgTuple&>(tm)),\n          second_value_(second) {}\n\n    void DescribeTo(::std::ostream* os) const override {\n      *os << \"and \";\n      UniversalPrint(second_value_, os);\n      *os << \" \";\n      mono_tuple2_matcher_.DescribeTo(os);\n    }\n\n    bool MatchAndExplain(T x, MatchResultListener* listener) const override {\n      return mono_tuple2_matcher_.MatchAndExplain(ArgTuple(x, second_value_),\n                                                  listener);\n    }\n\n   private:\n    const Matcher<const ArgTuple&> mono_tuple2_matcher_;\n    const Second second_value_;\n  };\n\n  const Tuple2Matcher tuple2_matcher_;\n  const Second second_value_;\n};\n\n// Given a 2-tuple matcher tm and a value second,\n// MatcherBindSecond(tm, second) returns a matcher that matches a\n// value x if and only if tm matches tuple (x, second).  Useful for\n// implementing UnorderedPointwise() in terms of UnorderedElementsAreArray().\ntemplate <typename Tuple2Matcher, typename Second>\nBoundSecondMatcher<Tuple2Matcher, Second> MatcherBindSecond(\n    const Tuple2Matcher& tm, const Second& second) {\n  return BoundSecondMatcher<Tuple2Matcher, Second>(tm, second);\n}\n\n// Returns the description for a matcher defined using the MATCHER*()\n// macro where the user-supplied description string is \"\", if\n// 'negation' is false; otherwise returns the description of the\n// negation of the matcher.  'param_values' contains a list of strings\n// that are the print-out of the matcher's parameters.\nGTEST_API_ std::string FormatMatcherDescription(bool negation,\n                                                const char* matcher_name,\n                                                const Strings& param_values);\n\n// Implements a matcher that checks the value of a optional<> type variable.\ntemplate <typename ValueMatcher>\nclass OptionalMatcher {\n public:\n  explicit OptionalMatcher(const ValueMatcher& value_matcher)\n      : value_matcher_(value_matcher) {}\n\n  template <typename Optional>\n  operator Matcher<Optional>() const {\n    return Matcher<Optional>(new Impl<const Optional&>(value_matcher_));\n  }\n\n  template <typename Optional>\n  class Impl : public MatcherInterface<Optional> {\n   public:\n    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Optional) OptionalView;\n    typedef typename OptionalView::value_type ValueType;\n    explicit Impl(const ValueMatcher& value_matcher)\n        : value_matcher_(MatcherCast<ValueType>(value_matcher)) {}\n\n    void DescribeTo(::std::ostream* os) const override {\n      *os << \"value \";\n      value_matcher_.DescribeTo(os);\n    }\n\n    void DescribeNegationTo(::std::ostream* os) const override {\n      *os << \"value \";\n      value_matcher_.DescribeNegationTo(os);\n    }\n\n    bool MatchAndExplain(Optional optional,\n                         MatchResultListener* listener) const override {\n      if (!optional) {\n        *listener << \"which is not engaged\";\n        return false;\n      }\n      const ValueType& value = *optional;\n      StringMatchResultListener value_listener;\n      const bool match = value_matcher_.MatchAndExplain(value, &value_listener);\n      *listener << \"whose value \" << PrintToString(value)\n                << (match ? \" matches\" : \" doesn't match\");\n      PrintIfNotEmpty(value_listener.str(), listener->stream());\n      return match;\n    }\n\n   private:\n    const Matcher<ValueType> value_matcher_;\n  };\n\n private:\n  const ValueMatcher value_matcher_;\n};\n\nnamespace variant_matcher {\n// Overloads to allow VariantMatcher to do proper ADL lookup.\ntemplate <typename T>\nvoid holds_alternative() {}\ntemplate <typename T>\nvoid get() {}\n\n// Implements a matcher that checks the value of a variant<> type variable.\ntemplate <typename T>\nclass VariantMatcher {\n public:\n  explicit VariantMatcher(::testing::Matcher<const T&> matcher)\n      : matcher_(std::move(matcher)) {}\n\n  template <typename Variant>\n  bool MatchAndExplain(const Variant& value,\n                       ::testing::MatchResultListener* listener) const {\n    using std::get;\n    if (!listener->IsInterested()) {\n      return holds_alternative<T>(value) && matcher_.Matches(get<T>(value));\n    }\n\n    if (!holds_alternative<T>(value)) {\n      *listener << \"whose value is not of type '\" << GetTypeName() << \"'\";\n      return false;\n    }\n\n    const T& elem = get<T>(value);\n    StringMatchResultListener elem_listener;\n    const bool match = matcher_.MatchAndExplain(elem, &elem_listener);\n    *listener << \"whose value \" << PrintToString(elem)\n              << (match ? \" matches\" : \" doesn't match\");\n    PrintIfNotEmpty(elem_listener.str(), listener->stream());\n    return match;\n  }\n\n  void DescribeTo(std::ostream* os) const {\n    *os << \"is a variant<> with value of type '\" << GetTypeName()\n        << \"' and the value \";\n    matcher_.DescribeTo(os);\n  }\n\n  void DescribeNegationTo(std::ostream* os) const {\n    *os << \"is a variant<> with value of type other than '\" << GetTypeName()\n        << \"' or the value \";\n    matcher_.DescribeNegationTo(os);\n  }\n\n private:\n  static std::string GetTypeName() {\n#if GTEST_HAS_RTTI\n    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(\n        return internal::GetTypeName<T>());\n#endif\n    return \"the element type\";\n  }\n\n  const ::testing::Matcher<const T&> matcher_;\n};\n\n}  // namespace variant_matcher\n\nnamespace any_cast_matcher {\n\n// Overloads to allow AnyCastMatcher to do proper ADL lookup.\ntemplate <typename T>\nvoid any_cast() {}\n\n// Implements a matcher that any_casts the value.\ntemplate <typename T>\nclass AnyCastMatcher {\n public:\n  explicit AnyCastMatcher(const ::testing::Matcher<const T&>& matcher)\n      : matcher_(matcher) {}\n\n  template <typename AnyType>\n  bool MatchAndExplain(const AnyType& value,\n                       ::testing::MatchResultListener* listener) const {\n    if (!listener->IsInterested()) {\n      const T* ptr = any_cast<T>(&value);\n      return ptr != nullptr && matcher_.Matches(*ptr);\n    }\n\n    const T* elem = any_cast<T>(&value);\n    if (elem == nullptr) {\n      *listener << \"whose value is not of type '\" << GetTypeName() << \"'\";\n      return false;\n    }\n\n    StringMatchResultListener elem_listener;\n    const bool match = matcher_.MatchAndExplain(*elem, &elem_listener);\n    *listener << \"whose value \" << PrintToString(*elem)\n              << (match ? \" matches\" : \" doesn't match\");\n    PrintIfNotEmpty(elem_listener.str(), listener->stream());\n    return match;\n  }\n\n  void DescribeTo(std::ostream* os) const {\n    *os << \"is an 'any' type with value of type '\" << GetTypeName()\n        << \"' and the value \";\n    matcher_.DescribeTo(os);\n  }\n\n  void DescribeNegationTo(std::ostream* os) const {\n    *os << \"is an 'any' type with value of type other than '\" << GetTypeName()\n        << \"' or the value \";\n    matcher_.DescribeNegationTo(os);\n  }\n\n private:\n  static std::string GetTypeName() {\n#if GTEST_HAS_RTTI\n    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(\n        return internal::GetTypeName<T>());\n#endif\n    return \"the element type\";\n  }\n\n  const ::testing::Matcher<const T&> matcher_;\n};\n\n}  // namespace any_cast_matcher\n\n// Implements the Args() matcher.\ntemplate <class ArgsTuple, size_t... k>\nclass ArgsMatcherImpl : public MatcherInterface<ArgsTuple> {\n public:\n  using RawArgsTuple = typename std::decay<ArgsTuple>::type;\n  using SelectedArgs =\n      std::tuple<typename std::tuple_element<k, RawArgsTuple>::type...>;\n  using MonomorphicInnerMatcher = Matcher<const SelectedArgs&>;\n\n  template <typename InnerMatcher>\n  explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher)\n      : inner_matcher_(SafeMatcherCast<const SelectedArgs&>(inner_matcher)) {}\n\n  bool MatchAndExplain(ArgsTuple args,\n                       MatchResultListener* listener) const override {\n    // Workaround spurious C4100 on MSVC<=15.7 when k is empty.\n    (void)args;\n    const SelectedArgs& selected_args =\n        std::forward_as_tuple(std::get<k>(args)...);\n    if (!listener->IsInterested()) return inner_matcher_.Matches(selected_args);\n\n    PrintIndices(listener->stream());\n    *listener << \"are \" << PrintToString(selected_args);\n\n    StringMatchResultListener inner_listener;\n    const bool match =\n        inner_matcher_.MatchAndExplain(selected_args, &inner_listener);\n    PrintIfNotEmpty(inner_listener.str(), listener->stream());\n    return match;\n  }\n\n  void DescribeTo(::std::ostream* os) const override {\n    *os << \"are a tuple \";\n    PrintIndices(os);\n    inner_matcher_.DescribeTo(os);\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const override {\n    *os << \"are a tuple \";\n    PrintIndices(os);\n    inner_matcher_.DescribeNegationTo(os);\n  }\n\n private:\n  // Prints the indices of the selected fields.\n  static void PrintIndices(::std::ostream* os) {\n    *os << \"whose fields (\";\n    const char* sep = \"\";\n    // Workaround spurious C4189 on MSVC<=15.7 when k is empty.\n    (void)sep;\n    const char* dummy[] = {\"\", (*os << sep << \"#\" << k, sep = \", \")...};\n    (void)dummy;\n    *os << \") \";\n  }\n\n  MonomorphicInnerMatcher inner_matcher_;\n};\n\ntemplate <class InnerMatcher, size_t... k>\nclass ArgsMatcher {\n public:\n  explicit ArgsMatcher(InnerMatcher inner_matcher)\n      : inner_matcher_(std::move(inner_matcher)) {}\n\n  template <typename ArgsTuple>\n  operator Matcher<ArgsTuple>() const {  // NOLINT\n    return MakeMatcher(new ArgsMatcherImpl<ArgsTuple, k...>(inner_matcher_));\n  }\n\n private:\n  InnerMatcher inner_matcher_;\n};\n\n}  // namespace internal\n\n// ElementsAreArray(iterator_first, iterator_last)\n// ElementsAreArray(pointer, count)\n// ElementsAreArray(array)\n// ElementsAreArray(container)\n// ElementsAreArray({ e1, e2, ..., en })\n//\n// The ElementsAreArray() functions are like ElementsAre(...), except\n// that they are given a homogeneous sequence rather than taking each\n// element as a function argument. The sequence can be specified as an\n// array, a pointer and count, a vector, an initializer list, or an\n// STL iterator range. In each of these cases, the underlying sequence\n// can be either a sequence of values or a sequence of matchers.\n//\n// All forms of ElementsAreArray() make a copy of the input matcher sequence.\n\ntemplate <typename Iter>\ninline internal::ElementsAreArrayMatcher<\n    typename ::std::iterator_traits<Iter>::value_type>\nElementsAreArray(Iter first, Iter last) {\n  typedef typename ::std::iterator_traits<Iter>::value_type T;\n  return internal::ElementsAreArrayMatcher<T>(first, last);\n}\n\ntemplate <typename T>\ninline internal::ElementsAreArrayMatcher<T> ElementsAreArray(\n    const T* pointer, size_t count) {\n  return ElementsAreArray(pointer, pointer + count);\n}\n\ntemplate <typename T, size_t N>\ninline internal::ElementsAreArrayMatcher<T> ElementsAreArray(\n    const T (&array)[N]) {\n  return ElementsAreArray(array, N);\n}\n\ntemplate <typename Container>\ninline internal::ElementsAreArrayMatcher<typename Container::value_type>\nElementsAreArray(const Container& container) {\n  return ElementsAreArray(container.begin(), container.end());\n}\n\ntemplate <typename T>\ninline internal::ElementsAreArrayMatcher<T>\nElementsAreArray(::std::initializer_list<T> xs) {\n  return ElementsAreArray(xs.begin(), xs.end());\n}\n\n// UnorderedElementsAreArray(iterator_first, iterator_last)\n// UnorderedElementsAreArray(pointer, count)\n// UnorderedElementsAreArray(array)\n// UnorderedElementsAreArray(container)\n// UnorderedElementsAreArray({ e1, e2, ..., en })\n//\n// UnorderedElementsAreArray() verifies that a bijective mapping onto a\n// collection of matchers exists.\n//\n// The matchers can be specified as an array, a pointer and count, a container,\n// an initializer list, or an STL iterator range. In each of these cases, the\n// underlying matchers can be either values or matchers.\n\ntemplate <typename Iter>\ninline internal::UnorderedElementsAreArrayMatcher<\n    typename ::std::iterator_traits<Iter>::value_type>\nUnorderedElementsAreArray(Iter first, Iter last) {\n  typedef typename ::std::iterator_traits<Iter>::value_type T;\n  return internal::UnorderedElementsAreArrayMatcher<T>(\n      internal::UnorderedMatcherRequire::ExactMatch, first, last);\n}\n\ntemplate <typename T>\ninline internal::UnorderedElementsAreArrayMatcher<T>\nUnorderedElementsAreArray(const T* pointer, size_t count) {\n  return UnorderedElementsAreArray(pointer, pointer + count);\n}\n\ntemplate <typename T, size_t N>\ninline internal::UnorderedElementsAreArrayMatcher<T>\nUnorderedElementsAreArray(const T (&array)[N]) {\n  return UnorderedElementsAreArray(array, N);\n}\n\ntemplate <typename Container>\ninline internal::UnorderedElementsAreArrayMatcher<\n    typename Container::value_type>\nUnorderedElementsAreArray(const Container& container) {\n  return UnorderedElementsAreArray(container.begin(), container.end());\n}\n\ntemplate <typename T>\ninline internal::UnorderedElementsAreArrayMatcher<T>\nUnorderedElementsAreArray(::std::initializer_list<T> xs) {\n  return UnorderedElementsAreArray(xs.begin(), xs.end());\n}\n\n// _ is a matcher that matches anything of any type.\n//\n// This definition is fine as:\n//\n//   1. The C++ standard permits using the name _ in a namespace that\n//      is not the global namespace or ::std.\n//   2. The AnythingMatcher class has no data member or constructor,\n//      so it's OK to create global variables of this type.\n//   3. c-style has approved of using _ in this case.\nconst internal::AnythingMatcher _ = {};\n// Creates a matcher that matches any value of the given type T.\ntemplate <typename T>\ninline Matcher<T> A() {\n  return _;\n}\n\n// Creates a matcher that matches any value of the given type T.\ntemplate <typename T>\ninline Matcher<T> An() {\n  return _;\n}\n\ntemplate <typename T, typename M>\nMatcher<T> internal::MatcherCastImpl<T, M>::CastImpl(\n    const M& value, std::false_type /* convertible_to_matcher */,\n    std::false_type /* convertible_to_T */) {\n  return Eq(value);\n}\n\n// Creates a polymorphic matcher that matches any NULL pointer.\ninline PolymorphicMatcher<internal::IsNullMatcher > IsNull() {\n  return MakePolymorphicMatcher(internal::IsNullMatcher());\n}\n\n// Creates a polymorphic matcher that matches any non-NULL pointer.\n// This is convenient as Not(NULL) doesn't compile (the compiler\n// thinks that that expression is comparing a pointer with an integer).\ninline PolymorphicMatcher<internal::NotNullMatcher > NotNull() {\n  return MakePolymorphicMatcher(internal::NotNullMatcher());\n}\n\n// Creates a polymorphic matcher that matches any argument that\n// references variable x.\ntemplate <typename T>\ninline internal::RefMatcher<T&> Ref(T& x) {  // NOLINT\n  return internal::RefMatcher<T&>(x);\n}\n\n// Creates a polymorphic matcher that matches any NaN floating point.\ninline PolymorphicMatcher<internal::IsNanMatcher> IsNan() {\n  return MakePolymorphicMatcher(internal::IsNanMatcher());\n}\n\n// Creates a matcher that matches any double argument approximately\n// equal to rhs, where two NANs are considered unequal.\ninline internal::FloatingEqMatcher<double> DoubleEq(double rhs) {\n  return internal::FloatingEqMatcher<double>(rhs, false);\n}\n\n// Creates a matcher that matches any double argument approximately\n// equal to rhs, including NaN values when rhs is NaN.\ninline internal::FloatingEqMatcher<double> NanSensitiveDoubleEq(double rhs) {\n  return internal::FloatingEqMatcher<double>(rhs, true);\n}\n\n// Creates a matcher that matches any double argument approximately equal to\n// rhs, up to the specified max absolute error bound, where two NANs are\n// considered unequal.  The max absolute error bound must be non-negative.\ninline internal::FloatingEqMatcher<double> DoubleNear(\n    double rhs, double max_abs_error) {\n  return internal::FloatingEqMatcher<double>(rhs, false, max_abs_error);\n}\n\n// Creates a matcher that matches any double argument approximately equal to\n// rhs, up to the specified max absolute error bound, including NaN values when\n// rhs is NaN.  The max absolute error bound must be non-negative.\ninline internal::FloatingEqMatcher<double> NanSensitiveDoubleNear(\n    double rhs, double max_abs_error) {\n  return internal::FloatingEqMatcher<double>(rhs, true, max_abs_error);\n}\n\n// Creates a matcher that matches any float argument approximately\n// equal to rhs, where two NANs are considered unequal.\ninline internal::FloatingEqMatcher<float> FloatEq(float rhs) {\n  return internal::FloatingEqMatcher<float>(rhs, false);\n}\n\n// Creates a matcher that matches any float argument approximately\n// equal to rhs, including NaN values when rhs is NaN.\ninline internal::FloatingEqMatcher<float> NanSensitiveFloatEq(float rhs) {\n  return internal::FloatingEqMatcher<float>(rhs, true);\n}\n\n// Creates a matcher that matches any float argument approximately equal to\n// rhs, up to the specified max absolute error bound, where two NANs are\n// considered unequal.  The max absolute error bound must be non-negative.\ninline internal::FloatingEqMatcher<float> FloatNear(\n    float rhs, float max_abs_error) {\n  return internal::FloatingEqMatcher<float>(rhs, false, max_abs_error);\n}\n\n// Creates a matcher that matches any float argument approximately equal to\n// rhs, up to the specified max absolute error bound, including NaN values when\n// rhs is NaN.  The max absolute error bound must be non-negative.\ninline internal::FloatingEqMatcher<float> NanSensitiveFloatNear(\n    float rhs, float max_abs_error) {\n  return internal::FloatingEqMatcher<float>(rhs, true, max_abs_error);\n}\n\n// Creates a matcher that matches a pointer (raw or smart) that points\n// to a value that matches inner_matcher.\ntemplate <typename InnerMatcher>\ninline internal::PointeeMatcher<InnerMatcher> Pointee(\n    const InnerMatcher& inner_matcher) {\n  return internal::PointeeMatcher<InnerMatcher>(inner_matcher);\n}\n\n#if GTEST_HAS_RTTI\n// Creates a matcher that matches a pointer or reference that matches\n// inner_matcher when dynamic_cast<To> is applied.\n// The result of dynamic_cast<To> is forwarded to the inner matcher.\n// If To is a pointer and the cast fails, the inner matcher will receive NULL.\n// If To is a reference and the cast fails, this matcher returns false\n// immediately.\ntemplate <typename To>\ninline PolymorphicMatcher<internal::WhenDynamicCastToMatcher<To> >\nWhenDynamicCastTo(const Matcher<To>& inner_matcher) {\n  return MakePolymorphicMatcher(\n      internal::WhenDynamicCastToMatcher<To>(inner_matcher));\n}\n#endif  // GTEST_HAS_RTTI\n\n// Creates a matcher that matches an object whose given field matches\n// 'matcher'.  For example,\n//   Field(&Foo::number, Ge(5))\n// matches a Foo object x if and only if x.number >= 5.\ntemplate <typename Class, typename FieldType, typename FieldMatcher>\ninline PolymorphicMatcher<\n  internal::FieldMatcher<Class, FieldType> > Field(\n    FieldType Class::*field, const FieldMatcher& matcher) {\n  return MakePolymorphicMatcher(\n      internal::FieldMatcher<Class, FieldType>(\n          field, MatcherCast<const FieldType&>(matcher)));\n  // The call to MatcherCast() is required for supporting inner\n  // matchers of compatible types.  For example, it allows\n  //   Field(&Foo::bar, m)\n  // to compile where bar is an int32 and m is a matcher for int64.\n}\n\n// Same as Field() but also takes the name of the field to provide better error\n// messages.\ntemplate <typename Class, typename FieldType, typename FieldMatcher>\ninline PolymorphicMatcher<internal::FieldMatcher<Class, FieldType> > Field(\n    const std::string& field_name, FieldType Class::*field,\n    const FieldMatcher& matcher) {\n  return MakePolymorphicMatcher(internal::FieldMatcher<Class, FieldType>(\n      field_name, field, MatcherCast<const FieldType&>(matcher)));\n}\n\n// Creates a matcher that matches an object whose given property\n// matches 'matcher'.  For example,\n//   Property(&Foo::str, StartsWith(\"hi\"))\n// matches a Foo object x if and only if x.str() starts with \"hi\".\ntemplate <typename Class, typename PropertyType, typename PropertyMatcher>\ninline PolymorphicMatcher<internal::PropertyMatcher<\n    Class, PropertyType, PropertyType (Class::*)() const> >\nProperty(PropertyType (Class::*property)() const,\n         const PropertyMatcher& matcher) {\n  return MakePolymorphicMatcher(\n      internal::PropertyMatcher<Class, PropertyType,\n                                PropertyType (Class::*)() const>(\n          property, MatcherCast<const PropertyType&>(matcher)));\n  // The call to MatcherCast() is required for supporting inner\n  // matchers of compatible types.  For example, it allows\n  //   Property(&Foo::bar, m)\n  // to compile where bar() returns an int32 and m is a matcher for int64.\n}\n\n// Same as Property() above, but also takes the name of the property to provide\n// better error messages.\ntemplate <typename Class, typename PropertyType, typename PropertyMatcher>\ninline PolymorphicMatcher<internal::PropertyMatcher<\n    Class, PropertyType, PropertyType (Class::*)() const> >\nProperty(const std::string& property_name,\n         PropertyType (Class::*property)() const,\n         const PropertyMatcher& matcher) {\n  return MakePolymorphicMatcher(\n      internal::PropertyMatcher<Class, PropertyType,\n                                PropertyType (Class::*)() const>(\n          property_name, property, MatcherCast<const PropertyType&>(matcher)));\n}\n\n// The same as above but for reference-qualified member functions.\ntemplate <typename Class, typename PropertyType, typename PropertyMatcher>\ninline PolymorphicMatcher<internal::PropertyMatcher<\n    Class, PropertyType, PropertyType (Class::*)() const &> >\nProperty(PropertyType (Class::*property)() const &,\n         const PropertyMatcher& matcher) {\n  return MakePolymorphicMatcher(\n      internal::PropertyMatcher<Class, PropertyType,\n                                PropertyType (Class::*)() const&>(\n          property, MatcherCast<const PropertyType&>(matcher)));\n}\n\n// Three-argument form for reference-qualified member functions.\ntemplate <typename Class, typename PropertyType, typename PropertyMatcher>\ninline PolymorphicMatcher<internal::PropertyMatcher<\n    Class, PropertyType, PropertyType (Class::*)() const &> >\nProperty(const std::string& property_name,\n         PropertyType (Class::*property)() const &,\n         const PropertyMatcher& matcher) {\n  return MakePolymorphicMatcher(\n      internal::PropertyMatcher<Class, PropertyType,\n                                PropertyType (Class::*)() const&>(\n          property_name, property, MatcherCast<const PropertyType&>(matcher)));\n}\n\n// Creates a matcher that matches an object if and only if the result of\n// applying a callable to x matches 'matcher'. For example,\n//   ResultOf(f, StartsWith(\"hi\"))\n// matches a Foo object x if and only if f(x) starts with \"hi\".\n// `callable` parameter can be a function, function pointer, or a functor. It is\n// required to keep no state affecting the results of the calls on it and make\n// no assumptions about how many calls will be made. Any state it keeps must be\n// protected from the concurrent access.\ntemplate <typename Callable, typename InnerMatcher>\ninternal::ResultOfMatcher<Callable, InnerMatcher> ResultOf(\n    Callable callable, InnerMatcher matcher) {\n  return internal::ResultOfMatcher<Callable, InnerMatcher>(\n      std::move(callable), std::move(matcher));\n}\n\n// String matchers.\n\n// Matches a string equal to str.\ntemplate <typename T = std::string>\nPolymorphicMatcher<internal::StrEqualityMatcher<std::string> > StrEq(\n    const internal::StringLike<T>& str) {\n  return MakePolymorphicMatcher(\n      internal::StrEqualityMatcher<std::string>(std::string(str), true, true));\n}\n\n// Matches a string not equal to str.\ntemplate <typename T = std::string>\nPolymorphicMatcher<internal::StrEqualityMatcher<std::string> > StrNe(\n    const internal::StringLike<T>& str) {\n  return MakePolymorphicMatcher(\n      internal::StrEqualityMatcher<std::string>(std::string(str), false, true));\n}\n\n// Matches a string equal to str, ignoring case.\ntemplate <typename T = std::string>\nPolymorphicMatcher<internal::StrEqualityMatcher<std::string> > StrCaseEq(\n    const internal::StringLike<T>& str) {\n  return MakePolymorphicMatcher(\n      internal::StrEqualityMatcher<std::string>(std::string(str), true, false));\n}\n\n// Matches a string not equal to str, ignoring case.\ntemplate <typename T = std::string>\nPolymorphicMatcher<internal::StrEqualityMatcher<std::string> > StrCaseNe(\n    const internal::StringLike<T>& str) {\n  return MakePolymorphicMatcher(internal::StrEqualityMatcher<std::string>(\n      std::string(str), false, false));\n}\n\n// Creates a matcher that matches any string, std::string, or C string\n// that contains the given substring.\ntemplate <typename T = std::string>\nPolymorphicMatcher<internal::HasSubstrMatcher<std::string> > HasSubstr(\n    const internal::StringLike<T>& substring) {\n  return MakePolymorphicMatcher(\n      internal::HasSubstrMatcher<std::string>(std::string(substring)));\n}\n\n// Matches a string that starts with 'prefix' (case-sensitive).\ntemplate <typename T = std::string>\nPolymorphicMatcher<internal::StartsWithMatcher<std::string> > StartsWith(\n    const internal::StringLike<T>& prefix) {\n  return MakePolymorphicMatcher(\n      internal::StartsWithMatcher<std::string>(std::string(prefix)));\n}\n\n// Matches a string that ends with 'suffix' (case-sensitive).\ntemplate <typename T = std::string>\nPolymorphicMatcher<internal::EndsWithMatcher<std::string> > EndsWith(\n    const internal::StringLike<T>& suffix) {\n  return MakePolymorphicMatcher(\n      internal::EndsWithMatcher<std::string>(std::string(suffix)));\n}\n\n#if GTEST_HAS_STD_WSTRING\n// Wide string matchers.\n\n// Matches a string equal to str.\ninline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring> > StrEq(\n    const std::wstring& str) {\n  return MakePolymorphicMatcher(\n      internal::StrEqualityMatcher<std::wstring>(str, true, true));\n}\n\n// Matches a string not equal to str.\ninline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring> > StrNe(\n    const std::wstring& str) {\n  return MakePolymorphicMatcher(\n      internal::StrEqualityMatcher<std::wstring>(str, false, true));\n}\n\n// Matches a string equal to str, ignoring case.\ninline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring> >\nStrCaseEq(const std::wstring& str) {\n  return MakePolymorphicMatcher(\n      internal::StrEqualityMatcher<std::wstring>(str, true, false));\n}\n\n// Matches a string not equal to str, ignoring case.\ninline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring> >\nStrCaseNe(const std::wstring& str) {\n  return MakePolymorphicMatcher(\n      internal::StrEqualityMatcher<std::wstring>(str, false, false));\n}\n\n// Creates a matcher that matches any ::wstring, std::wstring, or C wide string\n// that contains the given substring.\ninline PolymorphicMatcher<internal::HasSubstrMatcher<std::wstring> > HasSubstr(\n    const std::wstring& substring) {\n  return MakePolymorphicMatcher(\n      internal::HasSubstrMatcher<std::wstring>(substring));\n}\n\n// Matches a string that starts with 'prefix' (case-sensitive).\ninline PolymorphicMatcher<internal::StartsWithMatcher<std::wstring> >\nStartsWith(const std::wstring& prefix) {\n  return MakePolymorphicMatcher(\n      internal::StartsWithMatcher<std::wstring>(prefix));\n}\n\n// Matches a string that ends with 'suffix' (case-sensitive).\ninline PolymorphicMatcher<internal::EndsWithMatcher<std::wstring> > EndsWith(\n    const std::wstring& suffix) {\n  return MakePolymorphicMatcher(\n      internal::EndsWithMatcher<std::wstring>(suffix));\n}\n\n#endif  // GTEST_HAS_STD_WSTRING\n\n// Creates a polymorphic matcher that matches a 2-tuple where the\n// first field == the second field.\ninline internal::Eq2Matcher Eq() { return internal::Eq2Matcher(); }\n\n// Creates a polymorphic matcher that matches a 2-tuple where the\n// first field >= the second field.\ninline internal::Ge2Matcher Ge() { return internal::Ge2Matcher(); }\n\n// Creates a polymorphic matcher that matches a 2-tuple where the\n// first field > the second field.\ninline internal::Gt2Matcher Gt() { return internal::Gt2Matcher(); }\n\n// Creates a polymorphic matcher that matches a 2-tuple where the\n// first field <= the second field.\ninline internal::Le2Matcher Le() { return internal::Le2Matcher(); }\n\n// Creates a polymorphic matcher that matches a 2-tuple where the\n// first field < the second field.\ninline internal::Lt2Matcher Lt() { return internal::Lt2Matcher(); }\n\n// Creates a polymorphic matcher that matches a 2-tuple where the\n// first field != the second field.\ninline internal::Ne2Matcher Ne() { return internal::Ne2Matcher(); }\n\n// Creates a polymorphic matcher that matches a 2-tuple where\n// FloatEq(first field) matches the second field.\ninline internal::FloatingEq2Matcher<float> FloatEq() {\n  return internal::FloatingEq2Matcher<float>();\n}\n\n// Creates a polymorphic matcher that matches a 2-tuple where\n// DoubleEq(first field) matches the second field.\ninline internal::FloatingEq2Matcher<double> DoubleEq() {\n  return internal::FloatingEq2Matcher<double>();\n}\n\n// Creates a polymorphic matcher that matches a 2-tuple where\n// FloatEq(first field) matches the second field with NaN equality.\ninline internal::FloatingEq2Matcher<float> NanSensitiveFloatEq() {\n  return internal::FloatingEq2Matcher<float>(true);\n}\n\n// Creates a polymorphic matcher that matches a 2-tuple where\n// DoubleEq(first field) matches the second field with NaN equality.\ninline internal::FloatingEq2Matcher<double> NanSensitiveDoubleEq() {\n  return internal::FloatingEq2Matcher<double>(true);\n}\n\n// Creates a polymorphic matcher that matches a 2-tuple where\n// FloatNear(first field, max_abs_error) matches the second field.\ninline internal::FloatingEq2Matcher<float> FloatNear(float max_abs_error) {\n  return internal::FloatingEq2Matcher<float>(max_abs_error);\n}\n\n// Creates a polymorphic matcher that matches a 2-tuple where\n// DoubleNear(first field, max_abs_error) matches the second field.\ninline internal::FloatingEq2Matcher<double> DoubleNear(double max_abs_error) {\n  return internal::FloatingEq2Matcher<double>(max_abs_error);\n}\n\n// Creates a polymorphic matcher that matches a 2-tuple where\n// FloatNear(first field, max_abs_error) matches the second field with NaN\n// equality.\ninline internal::FloatingEq2Matcher<float> NanSensitiveFloatNear(\n    float max_abs_error) {\n  return internal::FloatingEq2Matcher<float>(max_abs_error, true);\n}\n\n// Creates a polymorphic matcher that matches a 2-tuple where\n// DoubleNear(first field, max_abs_error) matches the second field with NaN\n// equality.\ninline internal::FloatingEq2Matcher<double> NanSensitiveDoubleNear(\n    double max_abs_error) {\n  return internal::FloatingEq2Matcher<double>(max_abs_error, true);\n}\n\n// Creates a matcher that matches any value of type T that m doesn't\n// match.\ntemplate <typename InnerMatcher>\ninline internal::NotMatcher<InnerMatcher> Not(InnerMatcher m) {\n  return internal::NotMatcher<InnerMatcher>(m);\n}\n\n// Returns a matcher that matches anything that satisfies the given\n// predicate.  The predicate can be any unary function or functor\n// whose return type can be implicitly converted to bool.\ntemplate <typename Predicate>\ninline PolymorphicMatcher<internal::TrulyMatcher<Predicate> >\nTruly(Predicate pred) {\n  return MakePolymorphicMatcher(internal::TrulyMatcher<Predicate>(pred));\n}\n\n// Returns a matcher that matches the container size. The container must\n// support both size() and size_type which all STL-like containers provide.\n// Note that the parameter 'size' can be a value of type size_type as well as\n// matcher. For instance:\n//   EXPECT_THAT(container, SizeIs(2));     // Checks container has 2 elements.\n//   EXPECT_THAT(container, SizeIs(Le(2));  // Checks container has at most 2.\ntemplate <typename SizeMatcher>\ninline internal::SizeIsMatcher<SizeMatcher>\nSizeIs(const SizeMatcher& size_matcher) {\n  return internal::SizeIsMatcher<SizeMatcher>(size_matcher);\n}\n\n// Returns a matcher that matches the distance between the container's begin()\n// iterator and its end() iterator, i.e. the size of the container. This matcher\n// can be used instead of SizeIs with containers such as std::forward_list which\n// do not implement size(). The container must provide const_iterator (with\n// valid iterator_traits), begin() and end().\ntemplate <typename DistanceMatcher>\ninline internal::BeginEndDistanceIsMatcher<DistanceMatcher>\nBeginEndDistanceIs(const DistanceMatcher& distance_matcher) {\n  return internal::BeginEndDistanceIsMatcher<DistanceMatcher>(distance_matcher);\n}\n\n// Returns a matcher that matches an equal container.\n// This matcher behaves like Eq(), but in the event of mismatch lists the\n// values that are included in one container but not the other. (Duplicate\n// values and order differences are not explained.)\ntemplate <typename Container>\ninline PolymorphicMatcher<internal::ContainerEqMatcher<\n    typename std::remove_const<Container>::type>>\nContainerEq(const Container& rhs) {\n  return MakePolymorphicMatcher(internal::ContainerEqMatcher<Container>(rhs));\n}\n\n// Returns a matcher that matches a container that, when sorted using\n// the given comparator, matches container_matcher.\ntemplate <typename Comparator, typename ContainerMatcher>\ninline internal::WhenSortedByMatcher<Comparator, ContainerMatcher>\nWhenSortedBy(const Comparator& comparator,\n             const ContainerMatcher& container_matcher) {\n  return internal::WhenSortedByMatcher<Comparator, ContainerMatcher>(\n      comparator, container_matcher);\n}\n\n// Returns a matcher that matches a container that, when sorted using\n// the < operator, matches container_matcher.\ntemplate <typename ContainerMatcher>\ninline internal::WhenSortedByMatcher<internal::LessComparator, ContainerMatcher>\nWhenSorted(const ContainerMatcher& container_matcher) {\n  return\n      internal::WhenSortedByMatcher<internal::LessComparator, ContainerMatcher>(\n          internal::LessComparator(), container_matcher);\n}\n\n// Matches an STL-style container or a native array that contains the\n// same number of elements as in rhs, where its i-th element and rhs's\n// i-th element (as a pair) satisfy the given pair matcher, for all i.\n// TupleMatcher must be able to be safely cast to Matcher<std::tuple<const\n// T1&, const T2&> >, where T1 and T2 are the types of elements in the\n// LHS container and the RHS container respectively.\ntemplate <typename TupleMatcher, typename Container>\ninline internal::PointwiseMatcher<TupleMatcher,\n                                  typename std::remove_const<Container>::type>\nPointwise(const TupleMatcher& tuple_matcher, const Container& rhs) {\n  return internal::PointwiseMatcher<TupleMatcher, Container>(tuple_matcher,\n                                                             rhs);\n}\n\n\n// Supports the Pointwise(m, {a, b, c}) syntax.\ntemplate <typename TupleMatcher, typename T>\ninline internal::PointwiseMatcher<TupleMatcher, std::vector<T> > Pointwise(\n    const TupleMatcher& tuple_matcher, std::initializer_list<T> rhs) {\n  return Pointwise(tuple_matcher, std::vector<T>(rhs));\n}\n\n\n// UnorderedPointwise(pair_matcher, rhs) matches an STL-style\n// container or a native array that contains the same number of\n// elements as in rhs, where in some permutation of the container, its\n// i-th element and rhs's i-th element (as a pair) satisfy the given\n// pair matcher, for all i.  Tuple2Matcher must be able to be safely\n// cast to Matcher<std::tuple<const T1&, const T2&> >, where T1 and T2 are\n// the types of elements in the LHS container and the RHS container\n// respectively.\n//\n// This is like Pointwise(pair_matcher, rhs), except that the element\n// order doesn't matter.\ntemplate <typename Tuple2Matcher, typename RhsContainer>\ninline internal::UnorderedElementsAreArrayMatcher<\n    typename internal::BoundSecondMatcher<\n        Tuple2Matcher,\n        typename internal::StlContainerView<\n            typename std::remove_const<RhsContainer>::type>::type::value_type>>\nUnorderedPointwise(const Tuple2Matcher& tuple2_matcher,\n                   const RhsContainer& rhs_container) {\n  // RhsView allows the same code to handle RhsContainer being a\n  // STL-style container and it being a native C-style array.\n  typedef typename internal::StlContainerView<RhsContainer> RhsView;\n  typedef typename RhsView::type RhsStlContainer;\n  typedef typename RhsStlContainer::value_type Second;\n  const RhsStlContainer& rhs_stl_container =\n      RhsView::ConstReference(rhs_container);\n\n  // Create a matcher for each element in rhs_container.\n  ::std::vector<internal::BoundSecondMatcher<Tuple2Matcher, Second> > matchers;\n  for (typename RhsStlContainer::const_iterator it = rhs_stl_container.begin();\n       it != rhs_stl_container.end(); ++it) {\n    matchers.push_back(\n        internal::MatcherBindSecond(tuple2_matcher, *it));\n  }\n\n  // Delegate the work to UnorderedElementsAreArray().\n  return UnorderedElementsAreArray(matchers);\n}\n\n\n// Supports the UnorderedPointwise(m, {a, b, c}) syntax.\ntemplate <typename Tuple2Matcher, typename T>\ninline internal::UnorderedElementsAreArrayMatcher<\n    typename internal::BoundSecondMatcher<Tuple2Matcher, T> >\nUnorderedPointwise(const Tuple2Matcher& tuple2_matcher,\n                   std::initializer_list<T> rhs) {\n  return UnorderedPointwise(tuple2_matcher, std::vector<T>(rhs));\n}\n\n\n// Matches an STL-style container or a native array that contains at\n// least one element matching the given value or matcher.\n//\n// Examples:\n//   ::std::set<int> page_ids;\n//   page_ids.insert(3);\n//   page_ids.insert(1);\n//   EXPECT_THAT(page_ids, Contains(1));\n//   EXPECT_THAT(page_ids, Contains(Gt(2)));\n//   EXPECT_THAT(page_ids, Not(Contains(4)));\n//\n//   ::std::map<int, size_t> page_lengths;\n//   page_lengths[1] = 100;\n//   EXPECT_THAT(page_lengths,\n//               Contains(::std::pair<const int, size_t>(1, 100)));\n//\n//   const char* user_ids[] = { \"joe\", \"mike\", \"tom\" };\n//   EXPECT_THAT(user_ids, Contains(Eq(::std::string(\"tom\"))));\ntemplate <typename M>\ninline internal::ContainsMatcher<M> Contains(M matcher) {\n  return internal::ContainsMatcher<M>(matcher);\n}\n\n// IsSupersetOf(iterator_first, iterator_last)\n// IsSupersetOf(pointer, count)\n// IsSupersetOf(array)\n// IsSupersetOf(container)\n// IsSupersetOf({e1, e2, ..., en})\n//\n// IsSupersetOf() verifies that a surjective partial mapping onto a collection\n// of matchers exists. In other words, a container matches\n// IsSupersetOf({e1, ..., en}) if and only if there is a permutation\n// {y1, ..., yn} of some of the container's elements where y1 matches e1,\n// ..., and yn matches en. Obviously, the size of the container must be >= n\n// in order to have a match. Examples:\n//\n// - {1, 2, 3} matches IsSupersetOf({Ge(3), Ne(0)}), as 3 matches Ge(3) and\n//   1 matches Ne(0).\n// - {1, 2} doesn't match IsSupersetOf({Eq(1), Lt(2)}), even though 1 matches\n//   both Eq(1) and Lt(2). The reason is that different matchers must be used\n//   for elements in different slots of the container.\n// - {1, 1, 2} matches IsSupersetOf({Eq(1), Lt(2)}), as (the first) 1 matches\n//   Eq(1) and (the second) 1 matches Lt(2).\n// - {1, 2, 3} matches IsSupersetOf(Gt(1), Gt(1)), as 2 matches (the first)\n//   Gt(1) and 3 matches (the second) Gt(1).\n//\n// The matchers can be specified as an array, a pointer and count, a container,\n// an initializer list, or an STL iterator range. In each of these cases, the\n// underlying matchers can be either values or matchers.\n\ntemplate <typename Iter>\ninline internal::UnorderedElementsAreArrayMatcher<\n    typename ::std::iterator_traits<Iter>::value_type>\nIsSupersetOf(Iter first, Iter last) {\n  typedef typename ::std::iterator_traits<Iter>::value_type T;\n  return internal::UnorderedElementsAreArrayMatcher<T>(\n      internal::UnorderedMatcherRequire::Superset, first, last);\n}\n\ntemplate <typename T>\ninline internal::UnorderedElementsAreArrayMatcher<T> IsSupersetOf(\n    const T* pointer, size_t count) {\n  return IsSupersetOf(pointer, pointer + count);\n}\n\ntemplate <typename T, size_t N>\ninline internal::UnorderedElementsAreArrayMatcher<T> IsSupersetOf(\n    const T (&array)[N]) {\n  return IsSupersetOf(array, N);\n}\n\ntemplate <typename Container>\ninline internal::UnorderedElementsAreArrayMatcher<\n    typename Container::value_type>\nIsSupersetOf(const Container& container) {\n  return IsSupersetOf(container.begin(), container.end());\n}\n\ntemplate <typename T>\ninline internal::UnorderedElementsAreArrayMatcher<T> IsSupersetOf(\n    ::std::initializer_list<T> xs) {\n  return IsSupersetOf(xs.begin(), xs.end());\n}\n\n// IsSubsetOf(iterator_first, iterator_last)\n// IsSubsetOf(pointer, count)\n// IsSubsetOf(array)\n// IsSubsetOf(container)\n// IsSubsetOf({e1, e2, ..., en})\n//\n// IsSubsetOf() verifies that an injective mapping onto a collection of matchers\n// exists.  In other words, a container matches IsSubsetOf({e1, ..., en}) if and\n// only if there is a subset of matchers {m1, ..., mk} which would match the\n// container using UnorderedElementsAre.  Obviously, the size of the container\n// must be <= n in order to have a match. Examples:\n//\n// - {1} matches IsSubsetOf({Gt(0), Lt(0)}), as 1 matches Gt(0).\n// - {1, -1} matches IsSubsetOf({Lt(0), Gt(0)}), as 1 matches Gt(0) and -1\n//   matches Lt(0).\n// - {1, 2} doesn't matches IsSubsetOf({Gt(0), Lt(0)}), even though 1 and 2 both\n//   match Gt(0). The reason is that different matchers must be used for\n//   elements in different slots of the container.\n//\n// The matchers can be specified as an array, a pointer and count, a container,\n// an initializer list, or an STL iterator range. In each of these cases, the\n// underlying matchers can be either values or matchers.\n\ntemplate <typename Iter>\ninline internal::UnorderedElementsAreArrayMatcher<\n    typename ::std::iterator_traits<Iter>::value_type>\nIsSubsetOf(Iter first, Iter last) {\n  typedef typename ::std::iterator_traits<Iter>::value_type T;\n  return internal::UnorderedElementsAreArrayMatcher<T>(\n      internal::UnorderedMatcherRequire::Subset, first, last);\n}\n\ntemplate <typename T>\ninline internal::UnorderedElementsAreArrayMatcher<T> IsSubsetOf(\n    const T* pointer, size_t count) {\n  return IsSubsetOf(pointer, pointer + count);\n}\n\ntemplate <typename T, size_t N>\ninline internal::UnorderedElementsAreArrayMatcher<T> IsSubsetOf(\n    const T (&array)[N]) {\n  return IsSubsetOf(array, N);\n}\n\ntemplate <typename Container>\ninline internal::UnorderedElementsAreArrayMatcher<\n    typename Container::value_type>\nIsSubsetOf(const Container& container) {\n  return IsSubsetOf(container.begin(), container.end());\n}\n\ntemplate <typename T>\ninline internal::UnorderedElementsAreArrayMatcher<T> IsSubsetOf(\n    ::std::initializer_list<T> xs) {\n  return IsSubsetOf(xs.begin(), xs.end());\n}\n\n// Matches an STL-style container or a native array that contains only\n// elements matching the given value or matcher.\n//\n// Each(m) is semantically equivalent to Not(Contains(Not(m))). Only\n// the messages are different.\n//\n// Examples:\n//   ::std::set<int> page_ids;\n//   // Each(m) matches an empty container, regardless of what m is.\n//   EXPECT_THAT(page_ids, Each(Eq(1)));\n//   EXPECT_THAT(page_ids, Each(Eq(77)));\n//\n//   page_ids.insert(3);\n//   EXPECT_THAT(page_ids, Each(Gt(0)));\n//   EXPECT_THAT(page_ids, Not(Each(Gt(4))));\n//   page_ids.insert(1);\n//   EXPECT_THAT(page_ids, Not(Each(Lt(2))));\n//\n//   ::std::map<int, size_t> page_lengths;\n//   page_lengths[1] = 100;\n//   page_lengths[2] = 200;\n//   page_lengths[3] = 300;\n//   EXPECT_THAT(page_lengths, Not(Each(Pair(1, 100))));\n//   EXPECT_THAT(page_lengths, Each(Key(Le(3))));\n//\n//   const char* user_ids[] = { \"joe\", \"mike\", \"tom\" };\n//   EXPECT_THAT(user_ids, Not(Each(Eq(::std::string(\"tom\")))));\ntemplate <typename M>\ninline internal::EachMatcher<M> Each(M matcher) {\n  return internal::EachMatcher<M>(matcher);\n}\n\n// Key(inner_matcher) matches an std::pair whose 'first' field matches\n// inner_matcher.  For example, Contains(Key(Ge(5))) can be used to match an\n// std::map that contains at least one element whose key is >= 5.\ntemplate <typename M>\ninline internal::KeyMatcher<M> Key(M inner_matcher) {\n  return internal::KeyMatcher<M>(inner_matcher);\n}\n\n// Pair(first_matcher, second_matcher) matches a std::pair whose 'first' field\n// matches first_matcher and whose 'second' field matches second_matcher.  For\n// example, EXPECT_THAT(map_type, ElementsAre(Pair(Ge(5), \"foo\"))) can be used\n// to match a std::map<int, string> that contains exactly one element whose key\n// is >= 5 and whose value equals \"foo\".\ntemplate <typename FirstMatcher, typename SecondMatcher>\ninline internal::PairMatcher<FirstMatcher, SecondMatcher>\nPair(FirstMatcher first_matcher, SecondMatcher second_matcher) {\n  return internal::PairMatcher<FirstMatcher, SecondMatcher>(\n      first_matcher, second_matcher);\n}\n\nnamespace no_adl {\n// FieldsAre(matchers...) matches piecewise the fields of compatible structs.\n// These include those that support `get<I>(obj)`, and when structured bindings\n// are enabled any class that supports them.\n// In particular, `std::tuple`, `std::pair`, `std::array` and aggregate types.\ntemplate <typename... M>\ninternal::FieldsAreMatcher<typename std::decay<M>::type...> FieldsAre(\n    M&&... matchers) {\n  return internal::FieldsAreMatcher<typename std::decay<M>::type...>(\n      std::forward<M>(matchers)...);\n}\n\n// Creates a matcher that matches a pointer (raw or smart) that matches\n// inner_matcher.\ntemplate <typename InnerMatcher>\ninline internal::PointerMatcher<InnerMatcher> Pointer(\n    const InnerMatcher& inner_matcher) {\n  return internal::PointerMatcher<InnerMatcher>(inner_matcher);\n}\n\n// Creates a matcher that matches an object that has an address that matches\n// inner_matcher.\ntemplate <typename InnerMatcher>\ninline internal::AddressMatcher<InnerMatcher> Address(\n    const InnerMatcher& inner_matcher) {\n  return internal::AddressMatcher<InnerMatcher>(inner_matcher);\n}\n}  // namespace no_adl\n\n// Returns a predicate that is satisfied by anything that matches the\n// given matcher.\ntemplate <typename M>\ninline internal::MatcherAsPredicate<M> Matches(M matcher) {\n  return internal::MatcherAsPredicate<M>(matcher);\n}\n\n// Returns true if and only if the value matches the matcher.\ntemplate <typename T, typename M>\ninline bool Value(const T& value, M matcher) {\n  return testing::Matches(matcher)(value);\n}\n\n// Matches the value against the given matcher and explains the match\n// result to listener.\ntemplate <typename T, typename M>\ninline bool ExplainMatchResult(\n    M matcher, const T& value, MatchResultListener* listener) {\n  return SafeMatcherCast<const T&>(matcher).MatchAndExplain(value, listener);\n}\n\n// Returns a string representation of the given matcher.  Useful for description\n// strings of matchers defined using MATCHER_P* macros that accept matchers as\n// their arguments.  For example:\n//\n// MATCHER_P(XAndYThat, matcher,\n//           \"X that \" + DescribeMatcher<int>(matcher, negation) +\n//               \" and Y that \" + DescribeMatcher<double>(matcher, negation)) {\n//   return ExplainMatchResult(matcher, arg.x(), result_listener) &&\n//          ExplainMatchResult(matcher, arg.y(), result_listener);\n// }\ntemplate <typename T, typename M>\nstd::string DescribeMatcher(const M& matcher, bool negation = false) {\n  ::std::stringstream ss;\n  Matcher<T> monomorphic_matcher = SafeMatcherCast<T>(matcher);\n  if (negation) {\n    monomorphic_matcher.DescribeNegationTo(&ss);\n  } else {\n    monomorphic_matcher.DescribeTo(&ss);\n  }\n  return ss.str();\n}\n\ntemplate <typename... Args>\ninternal::ElementsAreMatcher<\n    std::tuple<typename std::decay<const Args&>::type...>>\nElementsAre(const Args&... matchers) {\n  return internal::ElementsAreMatcher<\n      std::tuple<typename std::decay<const Args&>::type...>>(\n      std::make_tuple(matchers...));\n}\n\ntemplate <typename... Args>\ninternal::UnorderedElementsAreMatcher<\n    std::tuple<typename std::decay<const Args&>::type...>>\nUnorderedElementsAre(const Args&... matchers) {\n  return internal::UnorderedElementsAreMatcher<\n      std::tuple<typename std::decay<const Args&>::type...>>(\n      std::make_tuple(matchers...));\n}\n\n// Define variadic matcher versions.\ntemplate <typename... Args>\ninternal::AllOfMatcher<typename std::decay<const Args&>::type...> AllOf(\n    const Args&... matchers) {\n  return internal::AllOfMatcher<typename std::decay<const Args&>::type...>(\n      matchers...);\n}\n\ntemplate <typename... Args>\ninternal::AnyOfMatcher<typename std::decay<const Args&>::type...> AnyOf(\n    const Args&... matchers) {\n  return internal::AnyOfMatcher<typename std::decay<const Args&>::type...>(\n      matchers...);\n}\n\n// AnyOfArray(array)\n// AnyOfArray(pointer, count)\n// AnyOfArray(container)\n// AnyOfArray({ e1, e2, ..., en })\n// AnyOfArray(iterator_first, iterator_last)\n//\n// AnyOfArray() verifies whether a given value matches any member of a\n// collection of matchers.\n//\n// AllOfArray(array)\n// AllOfArray(pointer, count)\n// AllOfArray(container)\n// AllOfArray({ e1, e2, ..., en })\n// AllOfArray(iterator_first, iterator_last)\n//\n// AllOfArray() verifies whether a given value matches all members of a\n// collection of matchers.\n//\n// The matchers can be specified as an array, a pointer and count, a container,\n// an initializer list, or an STL iterator range. In each of these cases, the\n// underlying matchers can be either values or matchers.\n\ntemplate <typename Iter>\ninline internal::AnyOfArrayMatcher<\n    typename ::std::iterator_traits<Iter>::value_type>\nAnyOfArray(Iter first, Iter last) {\n  return internal::AnyOfArrayMatcher<\n      typename ::std::iterator_traits<Iter>::value_type>(first, last);\n}\n\ntemplate <typename Iter>\ninline internal::AllOfArrayMatcher<\n    typename ::std::iterator_traits<Iter>::value_type>\nAllOfArray(Iter first, Iter last) {\n  return internal::AllOfArrayMatcher<\n      typename ::std::iterator_traits<Iter>::value_type>(first, last);\n}\n\ntemplate <typename T>\ninline internal::AnyOfArrayMatcher<T> AnyOfArray(const T* ptr, size_t count) {\n  return AnyOfArray(ptr, ptr + count);\n}\n\ntemplate <typename T>\ninline internal::AllOfArrayMatcher<T> AllOfArray(const T* ptr, size_t count) {\n  return AllOfArray(ptr, ptr + count);\n}\n\ntemplate <typename T, size_t N>\ninline internal::AnyOfArrayMatcher<T> AnyOfArray(const T (&array)[N]) {\n  return AnyOfArray(array, N);\n}\n\ntemplate <typename T, size_t N>\ninline internal::AllOfArrayMatcher<T> AllOfArray(const T (&array)[N]) {\n  return AllOfArray(array, N);\n}\n\ntemplate <typename Container>\ninline internal::AnyOfArrayMatcher<typename Container::value_type> AnyOfArray(\n    const Container& container) {\n  return AnyOfArray(container.begin(), container.end());\n}\n\ntemplate <typename Container>\ninline internal::AllOfArrayMatcher<typename Container::value_type> AllOfArray(\n    const Container& container) {\n  return AllOfArray(container.begin(), container.end());\n}\n\ntemplate <typename T>\ninline internal::AnyOfArrayMatcher<T> AnyOfArray(\n    ::std::initializer_list<T> xs) {\n  return AnyOfArray(xs.begin(), xs.end());\n}\n\ntemplate <typename T>\ninline internal::AllOfArrayMatcher<T> AllOfArray(\n    ::std::initializer_list<T> xs) {\n  return AllOfArray(xs.begin(), xs.end());\n}\n\n// Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected\n// fields of it matches a_matcher.  C++ doesn't support default\n// arguments for function templates, so we have to overload it.\ntemplate <size_t... k, typename InnerMatcher>\ninternal::ArgsMatcher<typename std::decay<InnerMatcher>::type, k...> Args(\n    InnerMatcher&& matcher) {\n  return internal::ArgsMatcher<typename std::decay<InnerMatcher>::type, k...>(\n      std::forward<InnerMatcher>(matcher));\n}\n\n// AllArgs(m) is a synonym of m.  This is useful in\n//\n//   EXPECT_CALL(foo, Bar(_, _)).With(AllArgs(Eq()));\n//\n// which is easier to read than\n//\n//   EXPECT_CALL(foo, Bar(_, _)).With(Eq());\ntemplate <typename InnerMatcher>\ninline InnerMatcher AllArgs(const InnerMatcher& matcher) { return matcher; }\n\n// Returns a matcher that matches the value of an optional<> type variable.\n// The matcher implementation only uses '!arg' and requires that the optional<>\n// type has a 'value_type' member type and that '*arg' is of type 'value_type'\n// and is printable using 'PrintToString'. It is compatible with\n// std::optional/std::experimental::optional.\n// Note that to compare an optional type variable against nullopt you should\n// use Eq(nullopt) and not Eq(Optional(nullopt)). The latter implies that the\n// optional value contains an optional itself.\ntemplate <typename ValueMatcher>\ninline internal::OptionalMatcher<ValueMatcher> Optional(\n    const ValueMatcher& value_matcher) {\n  return internal::OptionalMatcher<ValueMatcher>(value_matcher);\n}\n\n// Returns a matcher that matches the value of a absl::any type variable.\ntemplate <typename T>\nPolymorphicMatcher<internal::any_cast_matcher::AnyCastMatcher<T> > AnyWith(\n    const Matcher<const T&>& matcher) {\n  return MakePolymorphicMatcher(\n      internal::any_cast_matcher::AnyCastMatcher<T>(matcher));\n}\n\n// Returns a matcher that matches the value of a variant<> type variable.\n// The matcher implementation uses ADL to find the holds_alternative and get\n// functions.\n// It is compatible with std::variant.\ntemplate <typename T>\nPolymorphicMatcher<internal::variant_matcher::VariantMatcher<T> > VariantWith(\n    const Matcher<const T&>& matcher) {\n  return MakePolymorphicMatcher(\n      internal::variant_matcher::VariantMatcher<T>(matcher));\n}\n\n#if GTEST_HAS_EXCEPTIONS\n\n// Anything inside the `internal` namespace is internal to the implementation\n// and must not be used in user code!\nnamespace internal {\n\nclass WithWhatMatcherImpl {\n public:\n  WithWhatMatcherImpl(Matcher<std::string> matcher)\n      : matcher_(std::move(matcher)) {}\n\n  void DescribeTo(std::ostream* os) const {\n    *os << \"contains .what() that \";\n    matcher_.DescribeTo(os);\n  }\n\n  void DescribeNegationTo(std::ostream* os) const {\n    *os << \"contains .what() that does not \";\n    matcher_.DescribeTo(os);\n  }\n\n  template <typename Err>\n  bool MatchAndExplain(const Err& err, MatchResultListener* listener) const {\n    *listener << \"which contains .what() that \";\n    return matcher_.MatchAndExplain(err.what(), listener);\n  }\n\n private:\n  const Matcher<std::string> matcher_;\n};\n\ninline PolymorphicMatcher<WithWhatMatcherImpl> WithWhat(\n    Matcher<std::string> m) {\n  return MakePolymorphicMatcher(WithWhatMatcherImpl(std::move(m)));\n}\n\ntemplate <typename Err>\nclass ExceptionMatcherImpl {\n  class NeverThrown {\n   public:\n    const char* what() const noexcept {\n      return \"this exception should never be thrown\";\n    }\n  };\n\n  // If the matchee raises an exception of a wrong type, we'd like to\n  // catch it and print its message and type. To do that, we add an additional\n  // catch clause:\n  //\n  //     try { ... }\n  //     catch (const Err&) { /* an expected exception */ }\n  //     catch (const std::exception&) { /* exception of a wrong type */ }\n  //\n  // However, if the `Err` itself is `std::exception`, we'd end up with two\n  // identical `catch` clauses:\n  //\n  //     try { ... }\n  //     catch (const std::exception&) { /* an expected exception */ }\n  //     catch (const std::exception&) { /* exception of a wrong type */ }\n  //\n  // This can cause a warning or an error in some compilers. To resolve\n  // the issue, we use a fake error type whenever `Err` is `std::exception`:\n  //\n  //     try { ... }\n  //     catch (const std::exception&) { /* an expected exception */ }\n  //     catch (const NeverThrown&) { /* exception of a wrong type */ }\n  using DefaultExceptionType = typename std::conditional<\n      std::is_same<typename std::remove_cv<\n                       typename std::remove_reference<Err>::type>::type,\n                   std::exception>::value,\n      const NeverThrown&, const std::exception&>::type;\n\n public:\n  ExceptionMatcherImpl(Matcher<const Err&> matcher)\n      : matcher_(std::move(matcher)) {}\n\n  void DescribeTo(std::ostream* os) const {\n    *os << \"throws an exception which is a \" << GetTypeName<Err>();\n    *os << \" which \";\n    matcher_.DescribeTo(os);\n  }\n\n  void DescribeNegationTo(std::ostream* os) const {\n    *os << \"throws an exception which is not a \" << GetTypeName<Err>();\n    *os << \" which \";\n    matcher_.DescribeNegationTo(os);\n  }\n\n  template <typename T>\n  bool MatchAndExplain(T&& x, MatchResultListener* listener) const {\n    try {\n      (void)(std::forward<T>(x)());\n    } catch (const Err& err) {\n      *listener << \"throws an exception which is a \" << GetTypeName<Err>();\n      *listener << \" \";\n      return matcher_.MatchAndExplain(err, listener);\n    } catch (DefaultExceptionType err) {\n#if GTEST_HAS_RTTI\n      *listener << \"throws an exception of type \" << GetTypeName(typeid(err));\n      *listener << \" \";\n#else\n      *listener << \"throws an std::exception-derived type \";\n#endif\n      *listener << \"with description \\\"\" << err.what() << \"\\\"\";\n      return false;\n    } catch (...) {\n      *listener << \"throws an exception of an unknown type\";\n      return false;\n    }\n\n    *listener << \"does not throw any exception\";\n    return false;\n  }\n\n private:\n  const Matcher<const Err&> matcher_;\n};\n\n}  // namespace internal\n\n// Throws()\n// Throws(exceptionMatcher)\n// ThrowsMessage(messageMatcher)\n//\n// This matcher accepts a callable and verifies that when invoked, it throws\n// an exception with the given type and properties.\n//\n// Examples:\n//\n//   EXPECT_THAT(\n//       []() { throw std::runtime_error(\"message\"); },\n//       Throws<std::runtime_error>());\n//\n//   EXPECT_THAT(\n//       []() { throw std::runtime_error(\"message\"); },\n//       ThrowsMessage<std::runtime_error>(HasSubstr(\"message\")));\n//\n//   EXPECT_THAT(\n//       []() { throw std::runtime_error(\"message\"); },\n//       Throws<std::runtime_error>(\n//           Property(&std::runtime_error::what, HasSubstr(\"message\"))));\n\ntemplate <typename Err>\nPolymorphicMatcher<internal::ExceptionMatcherImpl<Err>> Throws() {\n  return MakePolymorphicMatcher(\n      internal::ExceptionMatcherImpl<Err>(A<const Err&>()));\n}\n\ntemplate <typename Err, typename ExceptionMatcher>\nPolymorphicMatcher<internal::ExceptionMatcherImpl<Err>> Throws(\n    const ExceptionMatcher& exception_matcher) {\n  // Using matcher cast allows users to pass a matcher of a more broad type.\n  // For example user may want to pass Matcher<std::exception>\n  // to Throws<std::runtime_error>, or Matcher<int64> to Throws<int32>.\n  return MakePolymorphicMatcher(internal::ExceptionMatcherImpl<Err>(\n      SafeMatcherCast<const Err&>(exception_matcher)));\n}\n\ntemplate <typename Err, typename MessageMatcher>\nPolymorphicMatcher<internal::ExceptionMatcherImpl<Err>> ThrowsMessage(\n    MessageMatcher&& message_matcher) {\n  static_assert(std::is_base_of<std::exception, Err>::value,\n                \"expected an std::exception-derived type\");\n  return Throws<Err>(internal::WithWhat(\n      MatcherCast<std::string>(std::forward<MessageMatcher>(message_matcher))));\n}\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n// These macros allow using matchers to check values in Google Test\n// tests.  ASSERT_THAT(value, matcher) and EXPECT_THAT(value, matcher)\n// succeed if and only if the value matches the matcher.  If the assertion\n// fails, the value and the description of the matcher will be printed.\n#define ASSERT_THAT(value, matcher) ASSERT_PRED_FORMAT1(\\\n    ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value)\n#define EXPECT_THAT(value, matcher) EXPECT_PRED_FORMAT1(\\\n    ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value)\n\n// MATCHER* macroses itself are listed below.\n#define MATCHER(name, description)                                             \\\n  class name##Matcher                                                          \\\n      : public ::testing::internal::MatcherBaseImpl<name##Matcher> {           \\\n   public:                                                                     \\\n    template <typename arg_type>                                               \\\n    class gmock_Impl : public ::testing::MatcherInterface<const arg_type&> {   \\\n     public:                                                                   \\\n      gmock_Impl() {}                                                          \\\n      bool MatchAndExplain(                                                    \\\n          const arg_type& arg,                                                 \\\n          ::testing::MatchResultListener* result_listener) const override;     \\\n      void DescribeTo(::std::ostream* gmock_os) const override {               \\\n        *gmock_os << FormatDescription(false);                                 \\\n      }                                                                        \\\n      void DescribeNegationTo(::std::ostream* gmock_os) const override {       \\\n        *gmock_os << FormatDescription(true);                                  \\\n      }                                                                        \\\n                                                                               \\\n     private:                                                                  \\\n      ::std::string FormatDescription(bool negation) const {                   \\\n        ::std::string gmock_description = (description);                       \\\n        if (!gmock_description.empty()) {                                      \\\n          return gmock_description;                                            \\\n        }                                                                      \\\n        return ::testing::internal::FormatMatcherDescription(negation, #name,  \\\n                                                             {});              \\\n      }                                                                        \\\n    };                                                                         \\\n  };                                                                           \\\n  GTEST_ATTRIBUTE_UNUSED_ inline name##Matcher name() { return {}; }           \\\n  template <typename arg_type>                                                 \\\n  bool name##Matcher::gmock_Impl<arg_type>::MatchAndExplain(                   \\\n      const arg_type& arg,                                                     \\\n      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_) \\\n      const\n\n#define MATCHER_P(name, p0, description) \\\n  GMOCK_INTERNAL_MATCHER(name, name##MatcherP, description, (p0))\n#define MATCHER_P2(name, p0, p1, description) \\\n  GMOCK_INTERNAL_MATCHER(name, name##MatcherP2, description, (p0, p1))\n#define MATCHER_P3(name, p0, p1, p2, description) \\\n  GMOCK_INTERNAL_MATCHER(name, name##MatcherP3, description, (p0, p1, p2))\n#define MATCHER_P4(name, p0, p1, p2, p3, description) \\\n  GMOCK_INTERNAL_MATCHER(name, name##MatcherP4, description, (p0, p1, p2, p3))\n#define MATCHER_P5(name, p0, p1, p2, p3, p4, description)    \\\n  GMOCK_INTERNAL_MATCHER(name, name##MatcherP5, description, \\\n                         (p0, p1, p2, p3, p4))\n#define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description) \\\n  GMOCK_INTERNAL_MATCHER(name, name##MatcherP6, description,  \\\n                         (p0, p1, p2, p3, p4, p5))\n#define MATCHER_P7(name, p0, p1, p2, p3, p4, p5, p6, description) \\\n  GMOCK_INTERNAL_MATCHER(name, name##MatcherP7, description,      \\\n                         (p0, p1, p2, p3, p4, p5, p6))\n#define MATCHER_P8(name, p0, p1, p2, p3, p4, p5, p6, p7, description) \\\n  GMOCK_INTERNAL_MATCHER(name, name##MatcherP8, description,          \\\n                         (p0, p1, p2, p3, p4, p5, p6, p7))\n#define MATCHER_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, description) \\\n  GMOCK_INTERNAL_MATCHER(name, name##MatcherP9, description,              \\\n                         (p0, p1, p2, p3, p4, p5, p6, p7, p8))\n#define MATCHER_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, description) \\\n  GMOCK_INTERNAL_MATCHER(name, name##MatcherP10, description,                  \\\n                         (p0, p1, p2, p3, p4, p5, p6, p7, p8, p9))\n\n#define GMOCK_INTERNAL_MATCHER(name, full_name, description, args)             \\\n  template <GMOCK_INTERNAL_MATCHER_TEMPLATE_PARAMS(args)>                      \\\n  class full_name : public ::testing::internal::MatcherBaseImpl<               \\\n                        full_name<GMOCK_INTERNAL_MATCHER_TYPE_PARAMS(args)>> { \\\n   public:                                                                     \\\n    using full_name::MatcherBaseImpl::MatcherBaseImpl;                         \\\n    template <typename arg_type>                                               \\\n    class gmock_Impl : public ::testing::MatcherInterface<const arg_type&> {   \\\n     public:                                                                   \\\n      explicit gmock_Impl(GMOCK_INTERNAL_MATCHER_FUNCTION_ARGS(args))          \\\n          : GMOCK_INTERNAL_MATCHER_FORWARD_ARGS(args) {}                       \\\n      bool MatchAndExplain(                                                    \\\n          const arg_type& arg,                                                 \\\n          ::testing::MatchResultListener* result_listener) const override;     \\\n      void DescribeTo(::std::ostream* gmock_os) const override {               \\\n        *gmock_os << FormatDescription(false);                                 \\\n      }                                                                        \\\n      void DescribeNegationTo(::std::ostream* gmock_os) const override {       \\\n        *gmock_os << FormatDescription(true);                                  \\\n      }                                                                        \\\n      GMOCK_INTERNAL_MATCHER_MEMBERS(args)                                     \\\n                                                                               \\\n     private:                                                                  \\\n      ::std::string FormatDescription(bool negation) const {                   \\\n        ::std::string gmock_description = (description);                       \\\n        if (!gmock_description.empty()) {                                      \\\n          return gmock_description;                                            \\\n        }                                                                      \\\n        return ::testing::internal::FormatMatcherDescription(                  \\\n            negation, #name,                                                   \\\n            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(      \\\n                ::std::tuple<GMOCK_INTERNAL_MATCHER_TYPE_PARAMS(args)>(        \\\n                    GMOCK_INTERNAL_MATCHER_MEMBERS_USAGE(args))));             \\\n      }                                                                        \\\n    };                                                                         \\\n  };                                                                           \\\n  template <GMOCK_INTERNAL_MATCHER_TEMPLATE_PARAMS(args)>                      \\\n  inline full_name<GMOCK_INTERNAL_MATCHER_TYPE_PARAMS(args)> name(             \\\n      GMOCK_INTERNAL_MATCHER_FUNCTION_ARGS(args)) {                            \\\n    return full_name<GMOCK_INTERNAL_MATCHER_TYPE_PARAMS(args)>(                \\\n        GMOCK_INTERNAL_MATCHER_ARGS_USAGE(args));                              \\\n  }                                                                            \\\n  template <GMOCK_INTERNAL_MATCHER_TEMPLATE_PARAMS(args)>                      \\\n  template <typename arg_type>                                                 \\\n  bool full_name<GMOCK_INTERNAL_MATCHER_TYPE_PARAMS(args)>::gmock_Impl<        \\\n      arg_type>::MatchAndExplain(const arg_type& arg,                          \\\n                                 ::testing::MatchResultListener*               \\\n                                     result_listener GTEST_ATTRIBUTE_UNUSED_)  \\\n      const\n\n#define GMOCK_INTERNAL_MATCHER_TEMPLATE_PARAMS(args) \\\n  GMOCK_PP_TAIL(                                     \\\n      GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_MATCHER_TEMPLATE_PARAM, , args))\n#define GMOCK_INTERNAL_MATCHER_TEMPLATE_PARAM(i_unused, data_unused, arg) \\\n  , typename arg##_type\n\n#define GMOCK_INTERNAL_MATCHER_TYPE_PARAMS(args) \\\n  GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_MATCHER_TYPE_PARAM, , args))\n#define GMOCK_INTERNAL_MATCHER_TYPE_PARAM(i_unused, data_unused, arg) \\\n  , arg##_type\n\n#define GMOCK_INTERNAL_MATCHER_FUNCTION_ARGS(args) \\\n  GMOCK_PP_TAIL(dummy_first GMOCK_PP_FOR_EACH(     \\\n      GMOCK_INTERNAL_MATCHER_FUNCTION_ARG, , args))\n#define GMOCK_INTERNAL_MATCHER_FUNCTION_ARG(i, data_unused, arg) \\\n  , arg##_type gmock_p##i\n\n#define GMOCK_INTERNAL_MATCHER_FORWARD_ARGS(args) \\\n  GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_MATCHER_FORWARD_ARG, , args))\n#define GMOCK_INTERNAL_MATCHER_FORWARD_ARG(i, data_unused, arg) \\\n  , arg(::std::forward<arg##_type>(gmock_p##i))\n\n#define GMOCK_INTERNAL_MATCHER_MEMBERS(args) \\\n  GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_MATCHER_MEMBER, , args)\n#define GMOCK_INTERNAL_MATCHER_MEMBER(i_unused, data_unused, arg) \\\n  const arg##_type arg;\n\n#define GMOCK_INTERNAL_MATCHER_MEMBERS_USAGE(args) \\\n  GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_MATCHER_MEMBER_USAGE, , args))\n#define GMOCK_INTERNAL_MATCHER_MEMBER_USAGE(i_unused, data_unused, arg) , arg\n\n#define GMOCK_INTERNAL_MATCHER_ARGS_USAGE(args) \\\n  GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_MATCHER_ARG_USAGE, , args))\n#define GMOCK_INTERNAL_MATCHER_ARG_USAGE(i, data_unused, arg_unused) \\\n  , gmock_p##i\n\n// To prevent ADL on certain functions we put them on a separate namespace.\nusing namespace no_adl;  // NOLINT\n\n}  // namespace testing\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251 5046\n\n// Include any custom callback matchers added by the local installation.\n// We must include this header at the end to make sure it can use the\n// declarations from this file.\n// Copyright 2015, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Injection point for custom user configurations. See README for details\n//\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_MATCHERS_H_\n#define GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_MATCHERS_H_\n#endif  // GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_MATCHERS_H_\n\n#endif  // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_\n\n#if GTEST_HAS_EXCEPTIONS\n# include <stdexcept>  // NOLINT\n#endif\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\nnamespace testing {\n\n// An abstract handle of an expectation.\nclass Expectation;\n\n// A set of expectation handles.\nclass ExpectationSet;\n\n// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION\n// and MUST NOT BE USED IN USER CODE!!!\nnamespace internal {\n\n// Implements a mock function.\ntemplate <typename F> class FunctionMocker;\n\n// Base class for expectations.\nclass ExpectationBase;\n\n// Implements an expectation.\ntemplate <typename F> class TypedExpectation;\n\n// Helper class for testing the Expectation class template.\nclass ExpectationTester;\n\n// Helper classes for implementing NiceMock, StrictMock, and NaggyMock.\ntemplate <typename MockClass>\nclass NiceMockImpl;\ntemplate <typename MockClass>\nclass StrictMockImpl;\ntemplate <typename MockClass>\nclass NaggyMockImpl;\n\n// Protects the mock object registry (in class Mock), all function\n// mockers, and all expectations.\n//\n// The reason we don't use more fine-grained protection is: when a\n// mock function Foo() is called, it needs to consult its expectations\n// to see which one should be picked.  If another thread is allowed to\n// call a mock function (either Foo() or a different one) at the same\n// time, it could affect the \"retired\" attributes of Foo()'s\n// expectations when InSequence() is used, and thus affect which\n// expectation gets picked.  Therefore, we sequence all mock function\n// calls to ensure the integrity of the mock objects' states.\nGTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_gmock_mutex);\n\n// Untyped base class for ActionResultHolder<R>.\nclass UntypedActionResultHolderBase;\n\n// Abstract base class of FunctionMocker.  This is the\n// type-agnostic part of the function mocker interface.  Its pure\n// virtual methods are implemented by FunctionMocker.\nclass GTEST_API_ UntypedFunctionMockerBase {\n public:\n  UntypedFunctionMockerBase();\n  virtual ~UntypedFunctionMockerBase();\n\n  // Verifies that all expectations on this mock function have been\n  // satisfied.  Reports one or more Google Test non-fatal failures\n  // and returns false if not.\n  bool VerifyAndClearExpectationsLocked()\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);\n\n  // Clears the ON_CALL()s set on this mock function.\n  virtual void ClearDefaultActionsLocked()\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) = 0;\n\n  // In all of the following Untyped* functions, it's the caller's\n  // responsibility to guarantee the correctness of the arguments'\n  // types.\n\n  // Performs the default action with the given arguments and returns\n  // the action's result.  The call description string will be used in\n  // the error message to describe the call in the case the default\n  // action fails.\n  // L = *\n  virtual UntypedActionResultHolderBase* UntypedPerformDefaultAction(\n      void* untyped_args, const std::string& call_description) const = 0;\n\n  // Performs the given action with the given arguments and returns\n  // the action's result.\n  // L = *\n  virtual UntypedActionResultHolderBase* UntypedPerformAction(\n      const void* untyped_action, void* untyped_args) const = 0;\n\n  // Writes a message that the call is uninteresting (i.e. neither\n  // explicitly expected nor explicitly unexpected) to the given\n  // ostream.\n  virtual void UntypedDescribeUninterestingCall(\n      const void* untyped_args,\n      ::std::ostream* os) const\n          GTEST_LOCK_EXCLUDED_(g_gmock_mutex) = 0;\n\n  // Returns the expectation that matches the given function arguments\n  // (or NULL is there's no match); when a match is found,\n  // untyped_action is set to point to the action that should be\n  // performed (or NULL if the action is \"do default\"), and\n  // is_excessive is modified to indicate whether the call exceeds the\n  // expected number.\n  virtual const ExpectationBase* UntypedFindMatchingExpectation(\n      const void* untyped_args,\n      const void** untyped_action, bool* is_excessive,\n      ::std::ostream* what, ::std::ostream* why)\n          GTEST_LOCK_EXCLUDED_(g_gmock_mutex) = 0;\n\n  // Prints the given function arguments to the ostream.\n  virtual void UntypedPrintArgs(const void* untyped_args,\n                                ::std::ostream* os) const = 0;\n\n  // Sets the mock object this mock method belongs to, and registers\n  // this information in the global mock registry.  Will be called\n  // whenever an EXPECT_CALL() or ON_CALL() is executed on this mock\n  // method.\n  void RegisterOwner(const void* mock_obj)\n      GTEST_LOCK_EXCLUDED_(g_gmock_mutex);\n\n  // Sets the mock object this mock method belongs to, and sets the\n  // name of the mock function.  Will be called upon each invocation\n  // of this mock function.\n  void SetOwnerAndName(const void* mock_obj, const char* name)\n      GTEST_LOCK_EXCLUDED_(g_gmock_mutex);\n\n  // Returns the mock object this mock method belongs to.  Must be\n  // called after RegisterOwner() or SetOwnerAndName() has been\n  // called.\n  const void* MockObject() const\n      GTEST_LOCK_EXCLUDED_(g_gmock_mutex);\n\n  // Returns the name of this mock method.  Must be called after\n  // SetOwnerAndName() has been called.\n  const char* Name() const\n      GTEST_LOCK_EXCLUDED_(g_gmock_mutex);\n\n  // Returns the result of invoking this mock function with the given\n  // arguments.  This function can be safely called from multiple\n  // threads concurrently.  The caller is responsible for deleting the\n  // result.\n  UntypedActionResultHolderBase* UntypedInvokeWith(void* untyped_args)\n      GTEST_LOCK_EXCLUDED_(g_gmock_mutex);\n\n protected:\n  typedef std::vector<const void*> UntypedOnCallSpecs;\n\n  using UntypedExpectations = std::vector<std::shared_ptr<ExpectationBase>>;\n\n  // Returns an Expectation object that references and co-owns exp,\n  // which must be an expectation on this mock function.\n  Expectation GetHandleOf(ExpectationBase* exp);\n\n  // Address of the mock object this mock method belongs to.  Only\n  // valid after this mock method has been called or\n  // ON_CALL/EXPECT_CALL has been invoked on it.\n  const void* mock_obj_;  // Protected by g_gmock_mutex.\n\n  // Name of the function being mocked.  Only valid after this mock\n  // method has been called.\n  const char* name_;  // Protected by g_gmock_mutex.\n\n  // All default action specs for this function mocker.\n  UntypedOnCallSpecs untyped_on_call_specs_;\n\n  // All expectations for this function mocker.\n  //\n  // It's undefined behavior to interleave expectations (EXPECT_CALLs\n  // or ON_CALLs) and mock function calls.  Also, the order of\n  // expectations is important.  Therefore it's a logic race condition\n  // to read/write untyped_expectations_ concurrently.  In order for\n  // tools like tsan to catch concurrent read/write accesses to\n  // untyped_expectations, we deliberately leave accesses to it\n  // unprotected.\n  UntypedExpectations untyped_expectations_;\n};  // class UntypedFunctionMockerBase\n\n// Untyped base class for OnCallSpec<F>.\nclass UntypedOnCallSpecBase {\n public:\n  // The arguments are the location of the ON_CALL() statement.\n  UntypedOnCallSpecBase(const char* a_file, int a_line)\n      : file_(a_file), line_(a_line), last_clause_(kNone) {}\n\n  // Where in the source file was the default action spec defined?\n  const char* file() const { return file_; }\n  int line() const { return line_; }\n\n protected:\n  // Gives each clause in the ON_CALL() statement a name.\n  enum Clause {\n    // Do not change the order of the enum members!  The run-time\n    // syntax checking relies on it.\n    kNone,\n    kWith,\n    kWillByDefault\n  };\n\n  // Asserts that the ON_CALL() statement has a certain property.\n  void AssertSpecProperty(bool property,\n                          const std::string& failure_message) const {\n    Assert(property, file_, line_, failure_message);\n  }\n\n  // Expects that the ON_CALL() statement has a certain property.\n  void ExpectSpecProperty(bool property,\n                          const std::string& failure_message) const {\n    Expect(property, file_, line_, failure_message);\n  }\n\n  const char* file_;\n  int line_;\n\n  // The last clause in the ON_CALL() statement as seen so far.\n  // Initially kNone and changes as the statement is parsed.\n  Clause last_clause_;\n};  // class UntypedOnCallSpecBase\n\n// This template class implements an ON_CALL spec.\ntemplate <typename F>\nclass OnCallSpec : public UntypedOnCallSpecBase {\n public:\n  typedef typename Function<F>::ArgumentTuple ArgumentTuple;\n  typedef typename Function<F>::ArgumentMatcherTuple ArgumentMatcherTuple;\n\n  // Constructs an OnCallSpec object from the information inside\n  // the parenthesis of an ON_CALL() statement.\n  OnCallSpec(const char* a_file, int a_line,\n             const ArgumentMatcherTuple& matchers)\n      : UntypedOnCallSpecBase(a_file, a_line),\n        matchers_(matchers),\n        // By default, extra_matcher_ should match anything.  However,\n        // we cannot initialize it with _ as that causes ambiguity between\n        // Matcher's copy and move constructor for some argument types.\n        extra_matcher_(A<const ArgumentTuple&>()) {}\n\n  // Implements the .With() clause.\n  OnCallSpec& With(const Matcher<const ArgumentTuple&>& m) {\n    // Makes sure this is called at most once.\n    ExpectSpecProperty(last_clause_ < kWith,\n                       \".With() cannot appear \"\n                       \"more than once in an ON_CALL().\");\n    last_clause_ = kWith;\n\n    extra_matcher_ = m;\n    return *this;\n  }\n\n  // Implements the .WillByDefault() clause.\n  OnCallSpec& WillByDefault(const Action<F>& action) {\n    ExpectSpecProperty(last_clause_ < kWillByDefault,\n                       \".WillByDefault() must appear \"\n                       \"exactly once in an ON_CALL().\");\n    last_clause_ = kWillByDefault;\n\n    ExpectSpecProperty(!action.IsDoDefault(),\n                       \"DoDefault() cannot be used in ON_CALL().\");\n    action_ = action;\n    return *this;\n  }\n\n  // Returns true if and only if the given arguments match the matchers.\n  bool Matches(const ArgumentTuple& args) const {\n    return TupleMatches(matchers_, args) && extra_matcher_.Matches(args);\n  }\n\n  // Returns the action specified by the user.\n  const Action<F>& GetAction() const {\n    AssertSpecProperty(last_clause_ == kWillByDefault,\n                       \".WillByDefault() must appear exactly \"\n                       \"once in an ON_CALL().\");\n    return action_;\n  }\n\n private:\n  // The information in statement\n  //\n  //   ON_CALL(mock_object, Method(matchers))\n  //       .With(multi-argument-matcher)\n  //       .WillByDefault(action);\n  //\n  // is recorded in the data members like this:\n  //\n  //   source file that contains the statement => file_\n  //   line number of the statement            => line_\n  //   matchers                                => matchers_\n  //   multi-argument-matcher                  => extra_matcher_\n  //   action                                  => action_\n  ArgumentMatcherTuple matchers_;\n  Matcher<const ArgumentTuple&> extra_matcher_;\n  Action<F> action_;\n};  // class OnCallSpec\n\n// Possible reactions on uninteresting calls.\nenum CallReaction {\n  kAllow,\n  kWarn,\n  kFail,\n};\n\n}  // namespace internal\n\n// Utilities for manipulating mock objects.\nclass GTEST_API_ Mock {\n public:\n  // The following public methods can be called concurrently.\n\n  // Tells Google Mock to ignore mock_obj when checking for leaked\n  // mock objects.\n  static void AllowLeak(const void* mock_obj)\n      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n  // Verifies and clears all expectations on the given mock object.\n  // If the expectations aren't satisfied, generates one or more\n  // Google Test non-fatal failures and returns false.\n  static bool VerifyAndClearExpectations(void* mock_obj)\n      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n  // Verifies all expectations on the given mock object and clears its\n  // default actions and expectations.  Returns true if and only if the\n  // verification was successful.\n  static bool VerifyAndClear(void* mock_obj)\n      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n  // Returns whether the mock was created as a naggy mock (default)\n  static bool IsNaggy(void* mock_obj)\n      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n  // Returns whether the mock was created as a nice mock\n  static bool IsNice(void* mock_obj)\n      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n  // Returns whether the mock was created as a strict mock\n  static bool IsStrict(void* mock_obj)\n      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n private:\n  friend class internal::UntypedFunctionMockerBase;\n\n  // Needed for a function mocker to register itself (so that we know\n  // how to clear a mock object).\n  template <typename F>\n  friend class internal::FunctionMocker;\n\n  template <typename MockClass>\n  friend class internal::NiceMockImpl;\n  template <typename MockClass>\n  friend class internal::NaggyMockImpl;\n  template <typename MockClass>\n  friend class internal::StrictMockImpl;\n\n  // Tells Google Mock to allow uninteresting calls on the given mock\n  // object.\n  static void AllowUninterestingCalls(const void* mock_obj)\n      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n  // Tells Google Mock to warn the user about uninteresting calls on\n  // the given mock object.\n  static void WarnUninterestingCalls(const void* mock_obj)\n      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n  // Tells Google Mock to fail uninteresting calls on the given mock\n  // object.\n  static void FailUninterestingCalls(const void* mock_obj)\n      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n  // Tells Google Mock the given mock object is being destroyed and\n  // its entry in the call-reaction table should be removed.\n  static void UnregisterCallReaction(const void* mock_obj)\n      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n  // Returns the reaction Google Mock will have on uninteresting calls\n  // made on the given mock object.\n  static internal::CallReaction GetReactionOnUninterestingCalls(\n      const void* mock_obj)\n          GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n  // Verifies that all expectations on the given mock object have been\n  // satisfied.  Reports one or more Google Test non-fatal failures\n  // and returns false if not.\n  static bool VerifyAndClearExpectationsLocked(void* mock_obj)\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex);\n\n  // Clears all ON_CALL()s set on the given mock object.\n  static void ClearDefaultActionsLocked(void* mock_obj)\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex);\n\n  // Registers a mock object and a mock method it owns.\n  static void Register(\n      const void* mock_obj,\n      internal::UntypedFunctionMockerBase* mocker)\n          GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n  // Tells Google Mock where in the source code mock_obj is used in an\n  // ON_CALL or EXPECT_CALL.  In case mock_obj is leaked, this\n  // information helps the user identify which object it is.\n  static void RegisterUseByOnCallOrExpectCall(\n      const void* mock_obj, const char* file, int line)\n          GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n  // Unregisters a mock method; removes the owning mock object from\n  // the registry when the last mock method associated with it has\n  // been unregistered.  This is called only in the destructor of\n  // FunctionMocker.\n  static void UnregisterLocked(internal::UntypedFunctionMockerBase* mocker)\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex);\n};  // class Mock\n\n// An abstract handle of an expectation.  Useful in the .After()\n// clause of EXPECT_CALL() for setting the (partial) order of\n// expectations.  The syntax:\n//\n//   Expectation e1 = EXPECT_CALL(...)...;\n//   EXPECT_CALL(...).After(e1)...;\n//\n// sets two expectations where the latter can only be matched after\n// the former has been satisfied.\n//\n// Notes:\n//   - This class is copyable and has value semantics.\n//   - Constness is shallow: a const Expectation object itself cannot\n//     be modified, but the mutable methods of the ExpectationBase\n//     object it references can be called via expectation_base().\n\nclass GTEST_API_ Expectation {\n public:\n  // Constructs a null object that doesn't reference any expectation.\n  Expectation();\n  Expectation(Expectation&&) = default;\n  Expectation(const Expectation&) = default;\n  Expectation& operator=(Expectation&&) = default;\n  Expectation& operator=(const Expectation&) = default;\n  ~Expectation();\n\n  // This single-argument ctor must not be explicit, in order to support the\n  //   Expectation e = EXPECT_CALL(...);\n  // syntax.\n  //\n  // A TypedExpectation object stores its pre-requisites as\n  // Expectation objects, and needs to call the non-const Retire()\n  // method on the ExpectationBase objects they reference.  Therefore\n  // Expectation must receive a *non-const* reference to the\n  // ExpectationBase object.\n  Expectation(internal::ExpectationBase& exp);  // NOLINT\n\n  // The compiler-generated copy ctor and operator= work exactly as\n  // intended, so we don't need to define our own.\n\n  // Returns true if and only if rhs references the same expectation as this\n  // object does.\n  bool operator==(const Expectation& rhs) const {\n    return expectation_base_ == rhs.expectation_base_;\n  }\n\n  bool operator!=(const Expectation& rhs) const { return !(*this == rhs); }\n\n private:\n  friend class ExpectationSet;\n  friend class Sequence;\n  friend class ::testing::internal::ExpectationBase;\n  friend class ::testing::internal::UntypedFunctionMockerBase;\n\n  template <typename F>\n  friend class ::testing::internal::FunctionMocker;\n\n  template <typename F>\n  friend class ::testing::internal::TypedExpectation;\n\n  // This comparator is needed for putting Expectation objects into a set.\n  class Less {\n   public:\n    bool operator()(const Expectation& lhs, const Expectation& rhs) const {\n      return lhs.expectation_base_.get() < rhs.expectation_base_.get();\n    }\n  };\n\n  typedef ::std::set<Expectation, Less> Set;\n\n  Expectation(\n      const std::shared_ptr<internal::ExpectationBase>& expectation_base);\n\n  // Returns the expectation this object references.\n  const std::shared_ptr<internal::ExpectationBase>& expectation_base() const {\n    return expectation_base_;\n  }\n\n  // A shared_ptr that co-owns the expectation this handle references.\n  std::shared_ptr<internal::ExpectationBase> expectation_base_;\n};\n\n// A set of expectation handles.  Useful in the .After() clause of\n// EXPECT_CALL() for setting the (partial) order of expectations.  The\n// syntax:\n//\n//   ExpectationSet es;\n//   es += EXPECT_CALL(...)...;\n//   es += EXPECT_CALL(...)...;\n//   EXPECT_CALL(...).After(es)...;\n//\n// sets three expectations where the last one can only be matched\n// after the first two have both been satisfied.\n//\n// This class is copyable and has value semantics.\nclass ExpectationSet {\n public:\n  // A bidirectional iterator that can read a const element in the set.\n  typedef Expectation::Set::const_iterator const_iterator;\n\n  // An object stored in the set.  This is an alias of Expectation.\n  typedef Expectation::Set::value_type value_type;\n\n  // Constructs an empty set.\n  ExpectationSet() {}\n\n  // This single-argument ctor must not be explicit, in order to support the\n  //   ExpectationSet es = EXPECT_CALL(...);\n  // syntax.\n  ExpectationSet(internal::ExpectationBase& exp) {  // NOLINT\n    *this += Expectation(exp);\n  }\n\n  // This single-argument ctor implements implicit conversion from\n  // Expectation and thus must not be explicit.  This allows either an\n  // Expectation or an ExpectationSet to be used in .After().\n  ExpectationSet(const Expectation& e) {  // NOLINT\n    *this += e;\n  }\n\n  // The compiler-generator ctor and operator= works exactly as\n  // intended, so we don't need to define our own.\n\n  // Returns true if and only if rhs contains the same set of Expectation\n  // objects as this does.\n  bool operator==(const ExpectationSet& rhs) const {\n    return expectations_ == rhs.expectations_;\n  }\n\n  bool operator!=(const ExpectationSet& rhs) const { return !(*this == rhs); }\n\n  // Implements the syntax\n  //   expectation_set += EXPECT_CALL(...);\n  ExpectationSet& operator+=(const Expectation& e) {\n    expectations_.insert(e);\n    return *this;\n  }\n\n  int size() const { return static_cast<int>(expectations_.size()); }\n\n  const_iterator begin() const { return expectations_.begin(); }\n  const_iterator end() const { return expectations_.end(); }\n\n private:\n  Expectation::Set expectations_;\n};\n\n\n// Sequence objects are used by a user to specify the relative order\n// in which the expectations should match.  They are copyable (we rely\n// on the compiler-defined copy constructor and assignment operator).\nclass GTEST_API_ Sequence {\n public:\n  // Constructs an empty sequence.\n  Sequence() : last_expectation_(new Expectation) {}\n\n  // Adds an expectation to this sequence.  The caller must ensure\n  // that no other thread is accessing this Sequence object.\n  void AddExpectation(const Expectation& expectation) const;\n\n private:\n  // The last expectation in this sequence.\n  std::shared_ptr<Expectation> last_expectation_;\n};  // class Sequence\n\n// An object of this type causes all EXPECT_CALL() statements\n// encountered in its scope to be put in an anonymous sequence.  The\n// work is done in the constructor and destructor.  You should only\n// create an InSequence object on the stack.\n//\n// The sole purpose for this class is to support easy definition of\n// sequential expectations, e.g.\n//\n//   {\n//     InSequence dummy;  // The name of the object doesn't matter.\n//\n//     // The following expectations must match in the order they appear.\n//     EXPECT_CALL(a, Bar())...;\n//     EXPECT_CALL(a, Baz())...;\n//     ...\n//     EXPECT_CALL(b, Xyz())...;\n//   }\n//\n// You can create InSequence objects in multiple threads, as long as\n// they are used to affect different mock objects.  The idea is that\n// each thread can create and set up its own mocks as if it's the only\n// thread.  However, for clarity of your tests we recommend you to set\n// up mocks in the main thread unless you have a good reason not to do\n// so.\nclass GTEST_API_ InSequence {\n public:\n  InSequence();\n  ~InSequence();\n private:\n  bool sequence_created_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(InSequence);  // NOLINT\n} GTEST_ATTRIBUTE_UNUSED_;\n\nnamespace internal {\n\n// Points to the implicit sequence introduced by a living InSequence\n// object (if any) in the current thread or NULL.\nGTEST_API_ extern ThreadLocal<Sequence*> g_gmock_implicit_sequence;\n\n// Base class for implementing expectations.\n//\n// There are two reasons for having a type-agnostic base class for\n// Expectation:\n//\n//   1. We need to store collections of expectations of different\n//   types (e.g. all pre-requisites of a particular expectation, all\n//   expectations in a sequence).  Therefore these expectation objects\n//   must share a common base class.\n//\n//   2. We can avoid binary code bloat by moving methods not depending\n//   on the template argument of Expectation to the base class.\n//\n// This class is internal and mustn't be used by user code directly.\nclass GTEST_API_ ExpectationBase {\n public:\n  // source_text is the EXPECT_CALL(...) source that created this Expectation.\n  ExpectationBase(const char* file, int line, const std::string& source_text);\n\n  virtual ~ExpectationBase();\n\n  // Where in the source file was the expectation spec defined?\n  const char* file() const { return file_; }\n  int line() const { return line_; }\n  const char* source_text() const { return source_text_.c_str(); }\n  // Returns the cardinality specified in the expectation spec.\n  const Cardinality& cardinality() const { return cardinality_; }\n\n  // Describes the source file location of this expectation.\n  void DescribeLocationTo(::std::ostream* os) const {\n    *os << FormatFileLocation(file(), line()) << \" \";\n  }\n\n  // Describes how many times a function call matching this\n  // expectation has occurred.\n  void DescribeCallCountTo(::std::ostream* os) const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);\n\n  // If this mock method has an extra matcher (i.e. .With(matcher)),\n  // describes it to the ostream.\n  virtual void MaybeDescribeExtraMatcherTo(::std::ostream* os) = 0;\n\n protected:\n  friend class ::testing::Expectation;\n  friend class UntypedFunctionMockerBase;\n\n  enum Clause {\n    // Don't change the order of the enum members!\n    kNone,\n    kWith,\n    kTimes,\n    kInSequence,\n    kAfter,\n    kWillOnce,\n    kWillRepeatedly,\n    kRetiresOnSaturation\n  };\n\n  typedef std::vector<const void*> UntypedActions;\n\n  // Returns an Expectation object that references and co-owns this\n  // expectation.\n  virtual Expectation GetHandle() = 0;\n\n  // Asserts that the EXPECT_CALL() statement has the given property.\n  void AssertSpecProperty(bool property,\n                          const std::string& failure_message) const {\n    Assert(property, file_, line_, failure_message);\n  }\n\n  // Expects that the EXPECT_CALL() statement has the given property.\n  void ExpectSpecProperty(bool property,\n                          const std::string& failure_message) const {\n    Expect(property, file_, line_, failure_message);\n  }\n\n  // Explicitly specifies the cardinality of this expectation.  Used\n  // by the subclasses to implement the .Times() clause.\n  void SpecifyCardinality(const Cardinality& cardinality);\n\n  // Returns true if and only if the user specified the cardinality\n  // explicitly using a .Times().\n  bool cardinality_specified() const { return cardinality_specified_; }\n\n  // Sets the cardinality of this expectation spec.\n  void set_cardinality(const Cardinality& a_cardinality) {\n    cardinality_ = a_cardinality;\n  }\n\n  // The following group of methods should only be called after the\n  // EXPECT_CALL() statement, and only when g_gmock_mutex is held by\n  // the current thread.\n\n  // Retires all pre-requisites of this expectation.\n  void RetireAllPreRequisites()\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);\n\n  // Returns true if and only if this expectation is retired.\n  bool is_retired() const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    return retired_;\n  }\n\n  // Retires this expectation.\n  void Retire()\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    retired_ = true;\n  }\n\n  // Returns true if and only if this expectation is satisfied.\n  bool IsSatisfied() const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    return cardinality().IsSatisfiedByCallCount(call_count_);\n  }\n\n  // Returns true if and only if this expectation is saturated.\n  bool IsSaturated() const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    return cardinality().IsSaturatedByCallCount(call_count_);\n  }\n\n  // Returns true if and only if this expectation is over-saturated.\n  bool IsOverSaturated() const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    return cardinality().IsOverSaturatedByCallCount(call_count_);\n  }\n\n  // Returns true if and only if all pre-requisites of this expectation are\n  // satisfied.\n  bool AllPrerequisitesAreSatisfied() const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);\n\n  // Adds unsatisfied pre-requisites of this expectation to 'result'.\n  void FindUnsatisfiedPrerequisites(ExpectationSet* result) const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);\n\n  // Returns the number this expectation has been invoked.\n  int call_count() const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    return call_count_;\n  }\n\n  // Increments the number this expectation has been invoked.\n  void IncrementCallCount()\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    call_count_++;\n  }\n\n  // Checks the action count (i.e. the number of WillOnce() and\n  // WillRepeatedly() clauses) against the cardinality if this hasn't\n  // been done before.  Prints a warning if there are too many or too\n  // few actions.\n  void CheckActionCountIfNotDone() const\n      GTEST_LOCK_EXCLUDED_(mutex_);\n\n  friend class ::testing::Sequence;\n  friend class ::testing::internal::ExpectationTester;\n\n  template <typename Function>\n  friend class TypedExpectation;\n\n  // Implements the .Times() clause.\n  void UntypedTimes(const Cardinality& a_cardinality);\n\n  // This group of fields are part of the spec and won't change after\n  // an EXPECT_CALL() statement finishes.\n  const char* file_;          // The file that contains the expectation.\n  int line_;                  // The line number of the expectation.\n  const std::string source_text_;  // The EXPECT_CALL(...) source text.\n  // True if and only if the cardinality is specified explicitly.\n  bool cardinality_specified_;\n  Cardinality cardinality_;            // The cardinality of the expectation.\n  // The immediate pre-requisites (i.e. expectations that must be\n  // satisfied before this expectation can be matched) of this\n  // expectation.  We use std::shared_ptr in the set because we want an\n  // Expectation object to be co-owned by its FunctionMocker and its\n  // successors.  This allows multiple mock objects to be deleted at\n  // different times.\n  ExpectationSet immediate_prerequisites_;\n\n  // This group of fields are the current state of the expectation,\n  // and can change as the mock function is called.\n  int call_count_;  // How many times this expectation has been invoked.\n  bool retired_;    // True if and only if this expectation has retired.\n  UntypedActions untyped_actions_;\n  bool extra_matcher_specified_;\n  bool repeated_action_specified_;  // True if a WillRepeatedly() was specified.\n  bool retires_on_saturation_;\n  Clause last_clause_;\n  mutable bool action_count_checked_;  // Under mutex_.\n  mutable Mutex mutex_;  // Protects action_count_checked_.\n};  // class ExpectationBase\n\n// Impements an expectation for the given function type.\ntemplate <typename F>\nclass TypedExpectation : public ExpectationBase {\n public:\n  typedef typename Function<F>::ArgumentTuple ArgumentTuple;\n  typedef typename Function<F>::ArgumentMatcherTuple ArgumentMatcherTuple;\n  typedef typename Function<F>::Result Result;\n\n  TypedExpectation(FunctionMocker<F>* owner, const char* a_file, int a_line,\n                   const std::string& a_source_text,\n                   const ArgumentMatcherTuple& m)\n      : ExpectationBase(a_file, a_line, a_source_text),\n        owner_(owner),\n        matchers_(m),\n        // By default, extra_matcher_ should match anything.  However,\n        // we cannot initialize it with _ as that causes ambiguity between\n        // Matcher's copy and move constructor for some argument types.\n        extra_matcher_(A<const ArgumentTuple&>()),\n        repeated_action_(DoDefault()) {}\n\n  ~TypedExpectation() override {\n    // Check the validity of the action count if it hasn't been done\n    // yet (for example, if the expectation was never used).\n    CheckActionCountIfNotDone();\n    for (UntypedActions::const_iterator it = untyped_actions_.begin();\n         it != untyped_actions_.end(); ++it) {\n      delete static_cast<const Action<F>*>(*it);\n    }\n  }\n\n  // Implements the .With() clause.\n  TypedExpectation& With(const Matcher<const ArgumentTuple&>& m) {\n    if (last_clause_ == kWith) {\n      ExpectSpecProperty(false,\n                         \".With() cannot appear \"\n                         \"more than once in an EXPECT_CALL().\");\n    } else {\n      ExpectSpecProperty(last_clause_ < kWith,\n                         \".With() must be the first \"\n                         \"clause in an EXPECT_CALL().\");\n    }\n    last_clause_ = kWith;\n\n    extra_matcher_ = m;\n    extra_matcher_specified_ = true;\n    return *this;\n  }\n\n  // Implements the .Times() clause.\n  TypedExpectation& Times(const Cardinality& a_cardinality) {\n    ExpectationBase::UntypedTimes(a_cardinality);\n    return *this;\n  }\n\n  // Implements the .Times() clause.\n  TypedExpectation& Times(int n) {\n    return Times(Exactly(n));\n  }\n\n  // Implements the .InSequence() clause.\n  TypedExpectation& InSequence(const Sequence& s) {\n    ExpectSpecProperty(last_clause_ <= kInSequence,\n                       \".InSequence() cannot appear after .After(),\"\n                       \" .WillOnce(), .WillRepeatedly(), or \"\n                       \".RetiresOnSaturation().\");\n    last_clause_ = kInSequence;\n\n    s.AddExpectation(GetHandle());\n    return *this;\n  }\n  TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2) {\n    return InSequence(s1).InSequence(s2);\n  }\n  TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2,\n                               const Sequence& s3) {\n    return InSequence(s1, s2).InSequence(s3);\n  }\n  TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2,\n                               const Sequence& s3, const Sequence& s4) {\n    return InSequence(s1, s2, s3).InSequence(s4);\n  }\n  TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2,\n                               const Sequence& s3, const Sequence& s4,\n                               const Sequence& s5) {\n    return InSequence(s1, s2, s3, s4).InSequence(s5);\n  }\n\n  // Implements that .After() clause.\n  TypedExpectation& After(const ExpectationSet& s) {\n    ExpectSpecProperty(last_clause_ <= kAfter,\n                       \".After() cannot appear after .WillOnce(),\"\n                       \" .WillRepeatedly(), or \"\n                       \".RetiresOnSaturation().\");\n    last_clause_ = kAfter;\n\n    for (ExpectationSet::const_iterator it = s.begin(); it != s.end(); ++it) {\n      immediate_prerequisites_ += *it;\n    }\n    return *this;\n  }\n  TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2) {\n    return After(s1).After(s2);\n  }\n  TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2,\n                          const ExpectationSet& s3) {\n    return After(s1, s2).After(s3);\n  }\n  TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2,\n                          const ExpectationSet& s3, const ExpectationSet& s4) {\n    return After(s1, s2, s3).After(s4);\n  }\n  TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2,\n                          const ExpectationSet& s3, const ExpectationSet& s4,\n                          const ExpectationSet& s5) {\n    return After(s1, s2, s3, s4).After(s5);\n  }\n\n  // Implements the .WillOnce() clause.\n  TypedExpectation& WillOnce(const Action<F>& action) {\n    ExpectSpecProperty(last_clause_ <= kWillOnce,\n                       \".WillOnce() cannot appear after \"\n                       \".WillRepeatedly() or .RetiresOnSaturation().\");\n    last_clause_ = kWillOnce;\n\n    untyped_actions_.push_back(new Action<F>(action));\n    if (!cardinality_specified()) {\n      set_cardinality(Exactly(static_cast<int>(untyped_actions_.size())));\n    }\n    return *this;\n  }\n\n  // Implements the .WillRepeatedly() clause.\n  TypedExpectation& WillRepeatedly(const Action<F>& action) {\n    if (last_clause_ == kWillRepeatedly) {\n      ExpectSpecProperty(false,\n                         \".WillRepeatedly() cannot appear \"\n                         \"more than once in an EXPECT_CALL().\");\n    } else {\n      ExpectSpecProperty(last_clause_ < kWillRepeatedly,\n                         \".WillRepeatedly() cannot appear \"\n                         \"after .RetiresOnSaturation().\");\n    }\n    last_clause_ = kWillRepeatedly;\n    repeated_action_specified_ = true;\n\n    repeated_action_ = action;\n    if (!cardinality_specified()) {\n      set_cardinality(AtLeast(static_cast<int>(untyped_actions_.size())));\n    }\n\n    // Now that no more action clauses can be specified, we check\n    // whether their count makes sense.\n    CheckActionCountIfNotDone();\n    return *this;\n  }\n\n  // Implements the .RetiresOnSaturation() clause.\n  TypedExpectation& RetiresOnSaturation() {\n    ExpectSpecProperty(last_clause_ < kRetiresOnSaturation,\n                       \".RetiresOnSaturation() cannot appear \"\n                       \"more than once.\");\n    last_clause_ = kRetiresOnSaturation;\n    retires_on_saturation_ = true;\n\n    // Now that no more action clauses can be specified, we check\n    // whether their count makes sense.\n    CheckActionCountIfNotDone();\n    return *this;\n  }\n\n  // Returns the matchers for the arguments as specified inside the\n  // EXPECT_CALL() macro.\n  const ArgumentMatcherTuple& matchers() const {\n    return matchers_;\n  }\n\n  // Returns the matcher specified by the .With() clause.\n  const Matcher<const ArgumentTuple&>& extra_matcher() const {\n    return extra_matcher_;\n  }\n\n  // Returns the action specified by the .WillRepeatedly() clause.\n  const Action<F>& repeated_action() const { return repeated_action_; }\n\n  // If this mock method has an extra matcher (i.e. .With(matcher)),\n  // describes it to the ostream.\n  void MaybeDescribeExtraMatcherTo(::std::ostream* os) override {\n    if (extra_matcher_specified_) {\n      *os << \"    Expected args: \";\n      extra_matcher_.DescribeTo(os);\n      *os << \"\\n\";\n    }\n  }\n\n private:\n  template <typename Function>\n  friend class FunctionMocker;\n\n  // Returns an Expectation object that references and co-owns this\n  // expectation.\n  Expectation GetHandle() override { return owner_->GetHandleOf(this); }\n\n  // The following methods will be called only after the EXPECT_CALL()\n  // statement finishes and when the current thread holds\n  // g_gmock_mutex.\n\n  // Returns true if and only if this expectation matches the given arguments.\n  bool Matches(const ArgumentTuple& args) const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    return TupleMatches(matchers_, args) && extra_matcher_.Matches(args);\n  }\n\n  // Returns true if and only if this expectation should handle the given\n  // arguments.\n  bool ShouldHandleArguments(const ArgumentTuple& args) const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n\n    // In case the action count wasn't checked when the expectation\n    // was defined (e.g. if this expectation has no WillRepeatedly()\n    // or RetiresOnSaturation() clause), we check it when the\n    // expectation is used for the first time.\n    CheckActionCountIfNotDone();\n    return !is_retired() && AllPrerequisitesAreSatisfied() && Matches(args);\n  }\n\n  // Describes the result of matching the arguments against this\n  // expectation to the given ostream.\n  void ExplainMatchResultTo(\n      const ArgumentTuple& args,\n      ::std::ostream* os) const\n          GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n\n    if (is_retired()) {\n      *os << \"         Expected: the expectation is active\\n\"\n          << \"           Actual: it is retired\\n\";\n    } else if (!Matches(args)) {\n      if (!TupleMatches(matchers_, args)) {\n        ExplainMatchFailureTupleTo(matchers_, args, os);\n      }\n      StringMatchResultListener listener;\n      if (!extra_matcher_.MatchAndExplain(args, &listener)) {\n        *os << \"    Expected args: \";\n        extra_matcher_.DescribeTo(os);\n        *os << \"\\n           Actual: don't match\";\n\n        internal::PrintIfNotEmpty(listener.str(), os);\n        *os << \"\\n\";\n      }\n    } else if (!AllPrerequisitesAreSatisfied()) {\n      *os << \"         Expected: all pre-requisites are satisfied\\n\"\n          << \"           Actual: the following immediate pre-requisites \"\n          << \"are not satisfied:\\n\";\n      ExpectationSet unsatisfied_prereqs;\n      FindUnsatisfiedPrerequisites(&unsatisfied_prereqs);\n      int i = 0;\n      for (ExpectationSet::const_iterator it = unsatisfied_prereqs.begin();\n           it != unsatisfied_prereqs.end(); ++it) {\n        it->expectation_base()->DescribeLocationTo(os);\n        *os << \"pre-requisite #\" << i++ << \"\\n\";\n      }\n      *os << \"                   (end of pre-requisites)\\n\";\n    } else {\n      // This line is here just for completeness' sake.  It will never\n      // be executed as currently the ExplainMatchResultTo() function\n      // is called only when the mock function call does NOT match the\n      // expectation.\n      *os << \"The call matches the expectation.\\n\";\n    }\n  }\n\n  // Returns the action that should be taken for the current invocation.\n  const Action<F>& GetCurrentAction(const FunctionMocker<F>* mocker,\n                                    const ArgumentTuple& args) const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    const int count = call_count();\n    Assert(count >= 1, __FILE__, __LINE__,\n           \"call_count() is <= 0 when GetCurrentAction() is \"\n           \"called - this should never happen.\");\n\n    const int action_count = static_cast<int>(untyped_actions_.size());\n    if (action_count > 0 && !repeated_action_specified_ &&\n        count > action_count) {\n      // If there is at least one WillOnce() and no WillRepeatedly(),\n      // we warn the user when the WillOnce() clauses ran out.\n      ::std::stringstream ss;\n      DescribeLocationTo(&ss);\n      ss << \"Actions ran out in \" << source_text() << \"...\\n\"\n         << \"Called \" << count << \" times, but only \"\n         << action_count << \" WillOnce()\"\n         << (action_count == 1 ? \" is\" : \"s are\") << \" specified - \";\n      mocker->DescribeDefaultActionTo(args, &ss);\n      Log(kWarning, ss.str(), 1);\n    }\n\n    return count <= action_count\n               ? *static_cast<const Action<F>*>(\n                     untyped_actions_[static_cast<size_t>(count - 1)])\n               : repeated_action();\n  }\n\n  // Given the arguments of a mock function call, if the call will\n  // over-saturate this expectation, returns the default action;\n  // otherwise, returns the next action in this expectation.  Also\n  // describes *what* happened to 'what', and explains *why* Google\n  // Mock does it to 'why'.  This method is not const as it calls\n  // IncrementCallCount().  A return value of NULL means the default\n  // action.\n  const Action<F>* GetActionForArguments(const FunctionMocker<F>* mocker,\n                                         const ArgumentTuple& args,\n                                         ::std::ostream* what,\n                                         ::std::ostream* why)\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    if (IsSaturated()) {\n      // We have an excessive call.\n      IncrementCallCount();\n      *what << \"Mock function called more times than expected - \";\n      mocker->DescribeDefaultActionTo(args, what);\n      DescribeCallCountTo(why);\n\n      return nullptr;\n    }\n\n    IncrementCallCount();\n    RetireAllPreRequisites();\n\n    if (retires_on_saturation_ && IsSaturated()) {\n      Retire();\n    }\n\n    // Must be done after IncrementCount()!\n    *what << \"Mock function call matches \" << source_text() <<\"...\\n\";\n    return &(GetCurrentAction(mocker, args));\n  }\n\n  // All the fields below won't change once the EXPECT_CALL()\n  // statement finishes.\n  FunctionMocker<F>* const owner_;\n  ArgumentMatcherTuple matchers_;\n  Matcher<const ArgumentTuple&> extra_matcher_;\n  Action<F> repeated_action_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TypedExpectation);\n};  // class TypedExpectation\n\n// A MockSpec object is used by ON_CALL() or EXPECT_CALL() for\n// specifying the default behavior of, or expectation on, a mock\n// function.\n\n// Note: class MockSpec really belongs to the ::testing namespace.\n// However if we define it in ::testing, MSVC will complain when\n// classes in ::testing::internal declare it as a friend class\n// template.  To workaround this compiler bug, we define MockSpec in\n// ::testing::internal and import it into ::testing.\n\n// Logs a message including file and line number information.\nGTEST_API_ void LogWithLocation(testing::internal::LogSeverity severity,\n                                const char* file, int line,\n                                const std::string& message);\n\ntemplate <typename F>\nclass MockSpec {\n public:\n  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n  typedef typename internal::Function<F>::ArgumentMatcherTuple\n      ArgumentMatcherTuple;\n\n  // Constructs a MockSpec object, given the function mocker object\n  // that the spec is associated with.\n  MockSpec(internal::FunctionMocker<F>* function_mocker,\n           const ArgumentMatcherTuple& matchers)\n      : function_mocker_(function_mocker), matchers_(matchers) {}\n\n  // Adds a new default action spec to the function mocker and returns\n  // the newly created spec.\n  internal::OnCallSpec<F>& InternalDefaultActionSetAt(\n      const char* file, int line, const char* obj, const char* call) {\n    LogWithLocation(internal::kInfo, file, line,\n                    std::string(\"ON_CALL(\") + obj + \", \" + call + \") invoked\");\n    return function_mocker_->AddNewOnCallSpec(file, line, matchers_);\n  }\n\n  // Adds a new expectation spec to the function mocker and returns\n  // the newly created spec.\n  internal::TypedExpectation<F>& InternalExpectedAt(\n      const char* file, int line, const char* obj, const char* call) {\n    const std::string source_text(std::string(\"EXPECT_CALL(\") + obj + \", \" +\n                                  call + \")\");\n    LogWithLocation(internal::kInfo, file, line, source_text + \" invoked\");\n    return function_mocker_->AddNewExpectation(\n        file, line, source_text, matchers_);\n  }\n\n  // This operator overload is used to swallow the superfluous parameter list\n  // introduced by the ON/EXPECT_CALL macros. See the macro comments for more\n  // explanation.\n  MockSpec<F>& operator()(const internal::WithoutMatchers&, void* const) {\n    return *this;\n  }\n\n private:\n  template <typename Function>\n  friend class internal::FunctionMocker;\n\n  // The function mocker that owns this spec.\n  internal::FunctionMocker<F>* const function_mocker_;\n  // The argument matchers specified in the spec.\n  ArgumentMatcherTuple matchers_;\n};  // class MockSpec\n\n// Wrapper type for generically holding an ordinary value or lvalue reference.\n// If T is not a reference type, it must be copyable or movable.\n// ReferenceOrValueWrapper<T> is movable, and will also be copyable unless\n// T is a move-only value type (which means that it will always be copyable\n// if the current platform does not support move semantics).\n//\n// The primary template defines handling for values, but function header\n// comments describe the contract for the whole template (including\n// specializations).\ntemplate <typename T>\nclass ReferenceOrValueWrapper {\n public:\n  // Constructs a wrapper from the given value/reference.\n  explicit ReferenceOrValueWrapper(T value)\n      : value_(std::move(value)) {\n  }\n\n  // Unwraps and returns the underlying value/reference, exactly as\n  // originally passed. The behavior of calling this more than once on\n  // the same object is unspecified.\n  T Unwrap() { return std::move(value_); }\n\n  // Provides nondestructive access to the underlying value/reference.\n  // Always returns a const reference (more precisely,\n  // const std::add_lvalue_reference<T>::type). The behavior of calling this\n  // after calling Unwrap on the same object is unspecified.\n  const T& Peek() const {\n    return value_;\n  }\n\n private:\n  T value_;\n};\n\n// Specialization for lvalue reference types. See primary template\n// for documentation.\ntemplate <typename T>\nclass ReferenceOrValueWrapper<T&> {\n public:\n  // Workaround for debatable pass-by-reference lint warning (c-library-team\n  // policy precludes NOLINT in this context)\n  typedef T& reference;\n  explicit ReferenceOrValueWrapper(reference ref)\n      : value_ptr_(&ref) {}\n  T& Unwrap() { return *value_ptr_; }\n  const T& Peek() const { return *value_ptr_; }\n\n private:\n  T* value_ptr_;\n};\n\n// C++ treats the void type specially.  For example, you cannot define\n// a void-typed variable or pass a void value to a function.\n// ActionResultHolder<T> holds a value of type T, where T must be a\n// copyable type or void (T doesn't need to be default-constructable).\n// It hides the syntactic difference between void and other types, and\n// is used to unify the code for invoking both void-returning and\n// non-void-returning mock functions.\n\n// Untyped base class for ActionResultHolder<T>.\nclass UntypedActionResultHolderBase {\n public:\n  virtual ~UntypedActionResultHolderBase() {}\n\n  // Prints the held value as an action's result to os.\n  virtual void PrintAsActionResult(::std::ostream* os) const = 0;\n};\n\n// This generic definition is used when T is not void.\ntemplate <typename T>\nclass ActionResultHolder : public UntypedActionResultHolderBase {\n public:\n  // Returns the held value. Must not be called more than once.\n  T Unwrap() {\n    return result_.Unwrap();\n  }\n\n  // Prints the held value as an action's result to os.\n  void PrintAsActionResult(::std::ostream* os) const override {\n    *os << \"\\n          Returns: \";\n    // T may be a reference type, so we don't use UniversalPrint().\n    UniversalPrinter<T>::Print(result_.Peek(), os);\n  }\n\n  // Performs the given mock function's default action and returns the\n  // result in a new-ed ActionResultHolder.\n  template <typename F>\n  static ActionResultHolder* PerformDefaultAction(\n      const FunctionMocker<F>* func_mocker,\n      typename Function<F>::ArgumentTuple&& args,\n      const std::string& call_description) {\n    return new ActionResultHolder(Wrapper(func_mocker->PerformDefaultAction(\n        std::move(args), call_description)));\n  }\n\n  // Performs the given action and returns the result in a new-ed\n  // ActionResultHolder.\n  template <typename F>\n  static ActionResultHolder* PerformAction(\n      const Action<F>& action, typename Function<F>::ArgumentTuple&& args) {\n    return new ActionResultHolder(\n        Wrapper(action.Perform(std::move(args))));\n  }\n\n private:\n  typedef ReferenceOrValueWrapper<T> Wrapper;\n\n  explicit ActionResultHolder(Wrapper result)\n      : result_(std::move(result)) {\n  }\n\n  Wrapper result_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ActionResultHolder);\n};\n\n// Specialization for T = void.\ntemplate <>\nclass ActionResultHolder<void> : public UntypedActionResultHolderBase {\n public:\n  void Unwrap() { }\n\n  void PrintAsActionResult(::std::ostream* /* os */) const override {}\n\n  // Performs the given mock function's default action and returns ownership\n  // of an empty ActionResultHolder*.\n  template <typename F>\n  static ActionResultHolder* PerformDefaultAction(\n      const FunctionMocker<F>* func_mocker,\n      typename Function<F>::ArgumentTuple&& args,\n      const std::string& call_description) {\n    func_mocker->PerformDefaultAction(std::move(args), call_description);\n    return new ActionResultHolder;\n  }\n\n  // Performs the given action and returns ownership of an empty\n  // ActionResultHolder*.\n  template <typename F>\n  static ActionResultHolder* PerformAction(\n      const Action<F>& action, typename Function<F>::ArgumentTuple&& args) {\n    action.Perform(std::move(args));\n    return new ActionResultHolder;\n  }\n\n private:\n  ActionResultHolder() {}\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ActionResultHolder);\n};\n\ntemplate <typename F>\nclass FunctionMocker;\n\ntemplate <typename R, typename... Args>\nclass FunctionMocker<R(Args...)> final : public UntypedFunctionMockerBase {\n  using F = R(Args...);\n\n public:\n  using Result = R;\n  using ArgumentTuple = std::tuple<Args...>;\n  using ArgumentMatcherTuple = std::tuple<Matcher<Args>...>;\n\n  FunctionMocker() {}\n\n  // There is no generally useful and implementable semantics of\n  // copying a mock object, so copying a mock is usually a user error.\n  // Thus we disallow copying function mockers.  If the user really\n  // wants to copy a mock object, they should implement their own copy\n  // operation, for example:\n  //\n  //   class MockFoo : public Foo {\n  //    public:\n  //     // Defines a copy constructor explicitly.\n  //     MockFoo(const MockFoo& src) {}\n  //     ...\n  //   };\n  FunctionMocker(const FunctionMocker&) = delete;\n  FunctionMocker& operator=(const FunctionMocker&) = delete;\n\n  // The destructor verifies that all expectations on this mock\n  // function have been satisfied.  If not, it will report Google Test\n  // non-fatal failures for the violations.\n  ~FunctionMocker() override GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n    MutexLock l(&g_gmock_mutex);\n    VerifyAndClearExpectationsLocked();\n    Mock::UnregisterLocked(this);\n    ClearDefaultActionsLocked();\n  }\n\n  // Returns the ON_CALL spec that matches this mock function with the\n  // given arguments; returns NULL if no matching ON_CALL is found.\n  // L = *\n  const OnCallSpec<F>* FindOnCallSpec(\n      const ArgumentTuple& args) const {\n    for (UntypedOnCallSpecs::const_reverse_iterator it\n             = untyped_on_call_specs_.rbegin();\n         it != untyped_on_call_specs_.rend(); ++it) {\n      const OnCallSpec<F>* spec = static_cast<const OnCallSpec<F>*>(*it);\n      if (spec->Matches(args))\n        return spec;\n    }\n\n    return nullptr;\n  }\n\n  // Performs the default action of this mock function on the given\n  // arguments and returns the result. Asserts (or throws if\n  // exceptions are enabled) with a helpful call descrption if there\n  // is no valid return value. This method doesn't depend on the\n  // mutable state of this object, and thus can be called concurrently\n  // without locking.\n  // L = *\n  Result PerformDefaultAction(ArgumentTuple&& args,\n                              const std::string& call_description) const {\n    const OnCallSpec<F>* const spec =\n        this->FindOnCallSpec(args);\n    if (spec != nullptr) {\n      return spec->GetAction().Perform(std::move(args));\n    }\n    const std::string message =\n        call_description +\n        \"\\n    The mock function has no default action \"\n        \"set, and its return type has no default value set.\";\n#if GTEST_HAS_EXCEPTIONS\n    if (!DefaultValue<Result>::Exists()) {\n      throw std::runtime_error(message);\n    }\n#else\n    Assert(DefaultValue<Result>::Exists(), \"\", -1, message);\n#endif\n    return DefaultValue<Result>::Get();\n  }\n\n  // Performs the default action with the given arguments and returns\n  // the action's result.  The call description string will be used in\n  // the error message to describe the call in the case the default\n  // action fails.  The caller is responsible for deleting the result.\n  // L = *\n  UntypedActionResultHolderBase* UntypedPerformDefaultAction(\n      void* untyped_args,  // must point to an ArgumentTuple\n      const std::string& call_description) const override {\n    ArgumentTuple* args = static_cast<ArgumentTuple*>(untyped_args);\n    return ResultHolder::PerformDefaultAction(this, std::move(*args),\n                                              call_description);\n  }\n\n  // Performs the given action with the given arguments and returns\n  // the action's result.  The caller is responsible for deleting the\n  // result.\n  // L = *\n  UntypedActionResultHolderBase* UntypedPerformAction(\n      const void* untyped_action, void* untyped_args) const override {\n    // Make a copy of the action before performing it, in case the\n    // action deletes the mock object (and thus deletes itself).\n    const Action<F> action = *static_cast<const Action<F>*>(untyped_action);\n    ArgumentTuple* args = static_cast<ArgumentTuple*>(untyped_args);\n    return ResultHolder::PerformAction(action, std::move(*args));\n  }\n\n  // Implements UntypedFunctionMockerBase::ClearDefaultActionsLocked():\n  // clears the ON_CALL()s set on this mock function.\n  void ClearDefaultActionsLocked() override\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n\n    // Deleting our default actions may trigger other mock objects to be\n    // deleted, for example if an action contains a reference counted smart\n    // pointer to that mock object, and that is the last reference. So if we\n    // delete our actions within the context of the global mutex we may deadlock\n    // when this method is called again. Instead, make a copy of the set of\n    // actions to delete, clear our set within the mutex, and then delete the\n    // actions outside of the mutex.\n    UntypedOnCallSpecs specs_to_delete;\n    untyped_on_call_specs_.swap(specs_to_delete);\n\n    g_gmock_mutex.Unlock();\n    for (UntypedOnCallSpecs::const_iterator it =\n             specs_to_delete.begin();\n         it != specs_to_delete.end(); ++it) {\n      delete static_cast<const OnCallSpec<F>*>(*it);\n    }\n\n    // Lock the mutex again, since the caller expects it to be locked when we\n    // return.\n    g_gmock_mutex.Lock();\n  }\n\n  // Returns the result of invoking this mock function with the given\n  // arguments.  This function can be safely called from multiple\n  // threads concurrently.\n  Result Invoke(Args... args) GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n    ArgumentTuple tuple(std::forward<Args>(args)...);\n    std::unique_ptr<ResultHolder> holder(DownCast_<ResultHolder*>(\n        this->UntypedInvokeWith(static_cast<void*>(&tuple))));\n    return holder->Unwrap();\n  }\n\n  MockSpec<F> With(Matcher<Args>... m) {\n    return MockSpec<F>(this, ::std::make_tuple(std::move(m)...));\n  }\n\n protected:\n  template <typename Function>\n  friend class MockSpec;\n\n  typedef ActionResultHolder<Result> ResultHolder;\n\n  // Adds and returns a default action spec for this mock function.\n  OnCallSpec<F>& AddNewOnCallSpec(\n      const char* file, int line,\n      const ArgumentMatcherTuple& m)\n          GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n    Mock::RegisterUseByOnCallOrExpectCall(MockObject(), file, line);\n    OnCallSpec<F>* const on_call_spec = new OnCallSpec<F>(file, line, m);\n    untyped_on_call_specs_.push_back(on_call_spec);\n    return *on_call_spec;\n  }\n\n  // Adds and returns an expectation spec for this mock function.\n  TypedExpectation<F>& AddNewExpectation(const char* file, int line,\n                                         const std::string& source_text,\n                                         const ArgumentMatcherTuple& m)\n      GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n    Mock::RegisterUseByOnCallOrExpectCall(MockObject(), file, line);\n    TypedExpectation<F>* const expectation =\n        new TypedExpectation<F>(this, file, line, source_text, m);\n    const std::shared_ptr<ExpectationBase> untyped_expectation(expectation);\n    // See the definition of untyped_expectations_ for why access to\n    // it is unprotected here.\n    untyped_expectations_.push_back(untyped_expectation);\n\n    // Adds this expectation into the implicit sequence if there is one.\n    Sequence* const implicit_sequence = g_gmock_implicit_sequence.get();\n    if (implicit_sequence != nullptr) {\n      implicit_sequence->AddExpectation(Expectation(untyped_expectation));\n    }\n\n    return *expectation;\n  }\n\n private:\n  template <typename Func> friend class TypedExpectation;\n\n  // Some utilities needed for implementing UntypedInvokeWith().\n\n  // Describes what default action will be performed for the given\n  // arguments.\n  // L = *\n  void DescribeDefaultActionTo(const ArgumentTuple& args,\n                               ::std::ostream* os) const {\n    const OnCallSpec<F>* const spec = FindOnCallSpec(args);\n\n    if (spec == nullptr) {\n      *os << (std::is_void<Result>::value ? \"returning directly.\\n\"\n                                          : \"returning default value.\\n\");\n    } else {\n      *os << \"taking default action specified at:\\n\"\n          << FormatFileLocation(spec->file(), spec->line()) << \"\\n\";\n    }\n  }\n\n  // Writes a message that the call is uninteresting (i.e. neither\n  // explicitly expected nor explicitly unexpected) to the given\n  // ostream.\n  void UntypedDescribeUninterestingCall(const void* untyped_args,\n                                        ::std::ostream* os) const override\n      GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n    const ArgumentTuple& args =\n        *static_cast<const ArgumentTuple*>(untyped_args);\n    *os << \"Uninteresting mock function call - \";\n    DescribeDefaultActionTo(args, os);\n    *os << \"    Function call: \" << Name();\n    UniversalPrint(args, os);\n  }\n\n  // Returns the expectation that matches the given function arguments\n  // (or NULL is there's no match); when a match is found,\n  // untyped_action is set to point to the action that should be\n  // performed (or NULL if the action is \"do default\"), and\n  // is_excessive is modified to indicate whether the call exceeds the\n  // expected number.\n  //\n  // Critical section: We must find the matching expectation and the\n  // corresponding action that needs to be taken in an ATOMIC\n  // transaction.  Otherwise another thread may call this mock\n  // method in the middle and mess up the state.\n  //\n  // However, performing the action has to be left out of the critical\n  // section.  The reason is that we have no control on what the\n  // action does (it can invoke an arbitrary user function or even a\n  // mock function) and excessive locking could cause a dead lock.\n  const ExpectationBase* UntypedFindMatchingExpectation(\n      const void* untyped_args, const void** untyped_action, bool* is_excessive,\n      ::std::ostream* what, ::std::ostream* why) override\n      GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n    const ArgumentTuple& args =\n        *static_cast<const ArgumentTuple*>(untyped_args);\n    MutexLock l(&g_gmock_mutex);\n    TypedExpectation<F>* exp = this->FindMatchingExpectationLocked(args);\n    if (exp == nullptr) {  // A match wasn't found.\n      this->FormatUnexpectedCallMessageLocked(args, what, why);\n      return nullptr;\n    }\n\n    // This line must be done before calling GetActionForArguments(),\n    // which will increment the call count for *exp and thus affect\n    // its saturation status.\n    *is_excessive = exp->IsSaturated();\n    const Action<F>* action = exp->GetActionForArguments(this, args, what, why);\n    if (action != nullptr && action->IsDoDefault())\n      action = nullptr;  // Normalize \"do default\" to NULL.\n    *untyped_action = action;\n    return exp;\n  }\n\n  // Prints the given function arguments to the ostream.\n  void UntypedPrintArgs(const void* untyped_args,\n                        ::std::ostream* os) const override {\n    const ArgumentTuple& args =\n        *static_cast<const ArgumentTuple*>(untyped_args);\n    UniversalPrint(args, os);\n  }\n\n  // Returns the expectation that matches the arguments, or NULL if no\n  // expectation matches them.\n  TypedExpectation<F>* FindMatchingExpectationLocked(\n      const ArgumentTuple& args) const\n          GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    // See the definition of untyped_expectations_ for why access to\n    // it is unprotected here.\n    for (typename UntypedExpectations::const_reverse_iterator it =\n             untyped_expectations_.rbegin();\n         it != untyped_expectations_.rend(); ++it) {\n      TypedExpectation<F>* const exp =\n          static_cast<TypedExpectation<F>*>(it->get());\n      if (exp->ShouldHandleArguments(args)) {\n        return exp;\n      }\n    }\n    return nullptr;\n  }\n\n  // Returns a message that the arguments don't match any expectation.\n  void FormatUnexpectedCallMessageLocked(\n      const ArgumentTuple& args,\n      ::std::ostream* os,\n      ::std::ostream* why) const\n          GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    *os << \"\\nUnexpected mock function call - \";\n    DescribeDefaultActionTo(args, os);\n    PrintTriedExpectationsLocked(args, why);\n  }\n\n  // Prints a list of expectations that have been tried against the\n  // current mock function call.\n  void PrintTriedExpectationsLocked(\n      const ArgumentTuple& args,\n      ::std::ostream* why) const\n          GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    const size_t count = untyped_expectations_.size();\n    *why << \"Google Mock tried the following \" << count << \" \"\n         << (count == 1 ? \"expectation, but it didn't match\" :\n             \"expectations, but none matched\")\n         << \":\\n\";\n    for (size_t i = 0; i < count; i++) {\n      TypedExpectation<F>* const expectation =\n          static_cast<TypedExpectation<F>*>(untyped_expectations_[i].get());\n      *why << \"\\n\";\n      expectation->DescribeLocationTo(why);\n      if (count > 1) {\n        *why << \"tried expectation #\" << i << \": \";\n      }\n      *why << expectation->source_text() << \"...\\n\";\n      expectation->ExplainMatchResultTo(args, why);\n      expectation->DescribeCallCountTo(why);\n    }\n  }\n};  // class FunctionMocker\n\n// Reports an uninteresting call (whose description is in msg) in the\n// manner specified by 'reaction'.\nvoid ReportUninterestingCall(CallReaction reaction, const std::string& msg);\n\n}  // namespace internal\n\nnamespace internal {\n\ntemplate <typename F>\nclass MockFunction;\n\ntemplate <typename R, typename... Args>\nclass MockFunction<R(Args...)> {\n public:\n  MockFunction(const MockFunction&) = delete;\n  MockFunction& operator=(const MockFunction&) = delete;\n\n  std::function<R(Args...)> AsStdFunction() {\n    return [this](Args... args) -> R {\n      return this->Call(std::forward<Args>(args)...);\n    };\n  }\n\n  // Implementation detail: the expansion of the MOCK_METHOD macro.\n  R Call(Args... args) {\n    mock_.SetOwnerAndName(this, \"Call\");\n    return mock_.Invoke(std::forward<Args>(args)...);\n  }\n\n  MockSpec<R(Args...)> gmock_Call(Matcher<Args>... m) {\n    mock_.RegisterOwner(this);\n    return mock_.With(std::move(m)...);\n  }\n\n  MockSpec<R(Args...)> gmock_Call(const WithoutMatchers&, R (*)(Args...)) {\n    return this->gmock_Call(::testing::A<Args>()...);\n  }\n\n protected:\n  MockFunction() = default;\n  ~MockFunction() = default;\n\n private:\n  FunctionMocker<R(Args...)> mock_;\n};\n\n/*\nThe SignatureOf<F> struct is a meta-function returning function signature\ncorresponding to the provided F argument.\n\nIt makes use of MockFunction easier by allowing it to accept more F arguments\nthan just function signatures.\n\nSpecializations provided here cover only a signature type itself and\nstd::function. However, if need be it can be easily extended to cover also other\ntypes (like for example boost::function).\n*/\n\ntemplate <typename F>\nstruct SignatureOf;\n\ntemplate <typename R, typename... Args>\nstruct SignatureOf<R(Args...)> {\n  using type = R(Args...);\n};\n\ntemplate <typename F>\nstruct SignatureOf<std::function<F>> : SignatureOf<F> {};\n\ntemplate <typename F>\nusing SignatureOfT = typename SignatureOf<F>::type;\n\n}  // namespace internal\n\n// A MockFunction<F> type has one mock method whose type is\n// internal::SignatureOfT<F>.  It is useful when you just want your\n// test code to emit some messages and have Google Mock verify the\n// right messages are sent (and perhaps at the right times).  For\n// example, if you are exercising code:\n//\n//   Foo(1);\n//   Foo(2);\n//   Foo(3);\n//\n// and want to verify that Foo(1) and Foo(3) both invoke\n// mock.Bar(\"a\"), but Foo(2) doesn't invoke anything, you can write:\n//\n// TEST(FooTest, InvokesBarCorrectly) {\n//   MyMock mock;\n//   MockFunction<void(string check_point_name)> check;\n//   {\n//     InSequence s;\n//\n//     EXPECT_CALL(mock, Bar(\"a\"));\n//     EXPECT_CALL(check, Call(\"1\"));\n//     EXPECT_CALL(check, Call(\"2\"));\n//     EXPECT_CALL(mock, Bar(\"a\"));\n//   }\n//   Foo(1);\n//   check.Call(\"1\");\n//   Foo(2);\n//   check.Call(\"2\");\n//   Foo(3);\n// }\n//\n// The expectation spec says that the first Bar(\"a\") must happen\n// before check point \"1\", the second Bar(\"a\") must happen after check\n// point \"2\", and nothing should happen between the two check\n// points. The explicit check points make it easy to tell which\n// Bar(\"a\") is called by which call to Foo().\n//\n// MockFunction<F> can also be used to exercise code that accepts\n// std::function<internal::SignatureOfT<F>> callbacks. To do so, use\n// AsStdFunction() method to create std::function proxy forwarding to\n// original object's Call. Example:\n//\n// TEST(FooTest, RunsCallbackWithBarArgument) {\n//   MockFunction<int(string)> callback;\n//   EXPECT_CALL(callback, Call(\"bar\")).WillOnce(Return(1));\n//   Foo(callback.AsStdFunction());\n// }\n//\n// The internal::SignatureOfT<F> indirection allows to use other types\n// than just function signature type. This is typically useful when\n// providing a mock for a predefined std::function type. Example:\n//\n// using FilterPredicate = std::function<bool(string)>;\n// void MyFilterAlgorithm(FilterPredicate predicate);\n//\n// TEST(FooTest, FilterPredicateAlwaysAccepts) {\n//   MockFunction<FilterPredicate> predicateMock;\n//   EXPECT_CALL(predicateMock, Call(_)).WillRepeatedly(Return(true));\n//   MyFilterAlgorithm(predicateMock.AsStdFunction());\n// }\ntemplate <typename F>\nclass MockFunction : public internal::MockFunction<internal::SignatureOfT<F>> {\n  using Base = internal::MockFunction<internal::SignatureOfT<F>>;\n\n public:\n  using Base::Base;\n};\n\n// The style guide prohibits \"using\" statements in a namespace scope\n// inside a header file.  However, the MockSpec class template is\n// meant to be defined in the ::testing namespace.  The following line\n// is just a trick for working around a bug in MSVC 8.0, which cannot\n// handle it if we define MockSpec in ::testing.\nusing internal::MockSpec;\n\n// Const(x) is a convenient function for obtaining a const reference\n// to x.  This is useful for setting expectations on an overloaded\n// const mock method, e.g.\n//\n//   class MockFoo : public FooInterface {\n//    public:\n//     MOCK_METHOD0(Bar, int());\n//     MOCK_CONST_METHOD0(Bar, int&());\n//   };\n//\n//   MockFoo foo;\n//   // Expects a call to non-const MockFoo::Bar().\n//   EXPECT_CALL(foo, Bar());\n//   // Expects a call to const MockFoo::Bar().\n//   EXPECT_CALL(Const(foo), Bar());\ntemplate <typename T>\ninline const T& Const(const T& x) { return x; }\n\n// Constructs an Expectation object that references and co-owns exp.\ninline Expectation::Expectation(internal::ExpectationBase& exp)  // NOLINT\n    : expectation_base_(exp.GetHandle().expectation_base()) {}\n\n}  // namespace testing\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n// Implementation for ON_CALL and EXPECT_CALL macros. A separate macro is\n// required to avoid compile errors when the name of the method used in call is\n// a result of macro expansion. See CompilesWithMethodNameExpandedFromMacro\n// tests in internal/gmock-spec-builders_test.cc for more details.\n//\n// This macro supports statements both with and without parameter matchers. If\n// the parameter list is omitted, gMock will accept any parameters, which allows\n// tests to be written that don't need to encode the number of method\n// parameter. This technique may only be used for non-overloaded methods.\n//\n//   // These are the same:\n//   ON_CALL(mock, NoArgsMethod()).WillByDefault(...);\n//   ON_CALL(mock, NoArgsMethod).WillByDefault(...);\n//\n//   // As are these:\n//   ON_CALL(mock, TwoArgsMethod(_, _)).WillByDefault(...);\n//   ON_CALL(mock, TwoArgsMethod).WillByDefault(...);\n//\n//   // Can also specify args if you want, of course:\n//   ON_CALL(mock, TwoArgsMethod(_, 45)).WillByDefault(...);\n//\n//   // Overloads work as long as you specify parameters:\n//   ON_CALL(mock, OverloadedMethod(_)).WillByDefault(...);\n//   ON_CALL(mock, OverloadedMethod(_, _)).WillByDefault(...);\n//\n//   // Oops! Which overload did you want?\n//   ON_CALL(mock, OverloadedMethod).WillByDefault(...);\n//     => ERROR: call to member function 'gmock_OverloadedMethod' is ambiguous\n//\n// How this works: The mock class uses two overloads of the gmock_Method\n// expectation setter method plus an operator() overload on the MockSpec object.\n// In the matcher list form, the macro expands to:\n//\n//   // This statement:\n//   ON_CALL(mock, TwoArgsMethod(_, 45))...\n//\n//   // ...expands to:\n//   mock.gmock_TwoArgsMethod(_, 45)(WithoutMatchers(), nullptr)...\n//   |-------------v---------------||------------v-------------|\n//       invokes first overload        swallowed by operator()\n//\n//   // ...which is essentially:\n//   mock.gmock_TwoArgsMethod(_, 45)...\n//\n// Whereas the form without a matcher list:\n//\n//   // This statement:\n//   ON_CALL(mock, TwoArgsMethod)...\n//\n//   // ...expands to:\n//   mock.gmock_TwoArgsMethod(WithoutMatchers(), nullptr)...\n//   |-----------------------v--------------------------|\n//                 invokes second overload\n//\n//   // ...which is essentially:\n//   mock.gmock_TwoArgsMethod(_, _)...\n//\n// The WithoutMatchers() argument is used to disambiguate overloads and to\n// block the caller from accidentally invoking the second overload directly. The\n// second argument is an internal type derived from the method signature. The\n// failure to disambiguate two overloads of this method in the ON_CALL statement\n// is how we block callers from setting expectations on overloaded methods.\n#define GMOCK_ON_CALL_IMPL_(mock_expr, Setter, call)                    \\\n  ((mock_expr).gmock_##call)(::testing::internal::GetWithoutMatchers(), \\\n                             nullptr)                                   \\\n      .Setter(__FILE__, __LINE__, #mock_expr, #call)\n\n#define ON_CALL(obj, call) \\\n  GMOCK_ON_CALL_IMPL_(obj, InternalDefaultActionSetAt, call)\n\n#define EXPECT_CALL(obj, call) \\\n  GMOCK_ON_CALL_IMPL_(obj, InternalExpectedAt, call)\n\n#endif  // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_\n\nnamespace testing {\nnamespace internal {\ntemplate <typename T>\nusing identity_t = T;\n\ntemplate <typename Pattern>\nstruct ThisRefAdjuster {\n  template <typename T>\n  using AdjustT = typename std::conditional<\n      std::is_const<typename std::remove_reference<Pattern>::type>::value,\n      typename std::conditional<std::is_lvalue_reference<Pattern>::value,\n                                const T&, const T&&>::type,\n      typename std::conditional<std::is_lvalue_reference<Pattern>::value, T&,\n                                T&&>::type>::type;\n\n  template <typename MockType>\n  static AdjustT<MockType> Adjust(const MockType& mock) {\n    return static_cast<AdjustT<MockType>>(const_cast<MockType&>(mock));\n  }\n};\n\n}  // namespace internal\n\n// The style guide prohibits \"using\" statements in a namespace scope\n// inside a header file.  However, the FunctionMocker class template\n// is meant to be defined in the ::testing namespace.  The following\n// line is just a trick for working around a bug in MSVC 8.0, which\n// cannot handle it if we define FunctionMocker in ::testing.\nusing internal::FunctionMocker;\n}  // namespace testing\n\n#define MOCK_METHOD(...) \\\n  GMOCK_PP_VARIADIC_CALL(GMOCK_INTERNAL_MOCK_METHOD_ARG_, __VA_ARGS__)\n\n#define GMOCK_INTERNAL_MOCK_METHOD_ARG_1(...) \\\n  GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)\n\n#define GMOCK_INTERNAL_MOCK_METHOD_ARG_2(...) \\\n  GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)\n\n#define GMOCK_INTERNAL_MOCK_METHOD_ARG_3(_Ret, _MethodName, _Args) \\\n  GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, ())\n\n#define GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, _Spec)     \\\n  GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Args);                                   \\\n  GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Spec);                                   \\\n  GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE(                                      \\\n      GMOCK_PP_NARG0 _Args, GMOCK_INTERNAL_SIGNATURE(_Ret, _Args));           \\\n  GMOCK_INTERNAL_ASSERT_VALID_SPEC(_Spec)                                     \\\n  GMOCK_INTERNAL_MOCK_METHOD_IMPL(                                            \\\n      GMOCK_PP_NARG0 _Args, _MethodName, GMOCK_INTERNAL_HAS_CONST(_Spec),     \\\n      GMOCK_INTERNAL_HAS_OVERRIDE(_Spec), GMOCK_INTERNAL_HAS_FINAL(_Spec),    \\\n      GMOCK_INTERNAL_GET_NOEXCEPT_SPEC(_Spec),                                \\\n      GMOCK_INTERNAL_GET_CALLTYPE(_Spec), GMOCK_INTERNAL_GET_REF_SPEC(_Spec), \\\n      (GMOCK_INTERNAL_SIGNATURE(_Ret, _Args)))\n\n#define GMOCK_INTERNAL_MOCK_METHOD_ARG_5(...) \\\n  GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)\n\n#define GMOCK_INTERNAL_MOCK_METHOD_ARG_6(...) \\\n  GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)\n\n#define GMOCK_INTERNAL_MOCK_METHOD_ARG_7(...) \\\n  GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)\n\n#define GMOCK_INTERNAL_WRONG_ARITY(...)                                      \\\n  static_assert(                                                             \\\n      false,                                                                 \\\n      \"MOCK_METHOD must be called with 3 or 4 arguments. _Ret, \"             \\\n      \"_MethodName, _Args and optionally _Spec. _Args and _Spec must be \"    \\\n      \"enclosed in parentheses. If _Ret is a type with unprotected commas, \" \\\n      \"it must also be enclosed in parentheses.\")\n\n#define GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Tuple) \\\n  static_assert(                                  \\\n      GMOCK_PP_IS_ENCLOSED_PARENS(_Tuple),        \\\n      GMOCK_PP_STRINGIZE(_Tuple) \" should be enclosed in parentheses.\")\n\n#define GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE(_N, ...)                 \\\n  static_assert(                                                       \\\n      std::is_function<__VA_ARGS__>::value,                            \\\n      \"Signature must be a function type, maybe return type contains \" \\\n      \"unprotected comma.\");                                           \\\n  static_assert(                                                       \\\n      ::testing::tuple_size<typename ::testing::internal::Function<    \\\n              __VA_ARGS__>::ArgumentTuple>::value == _N,               \\\n      \"This method does not take \" GMOCK_PP_STRINGIZE(                 \\\n          _N) \" arguments. Parenthesize all types with unprotected commas.\")\n\n#define GMOCK_INTERNAL_ASSERT_VALID_SPEC(_Spec) \\\n  GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT, ~, _Spec)\n\n#define GMOCK_INTERNAL_MOCK_METHOD_IMPL(_N, _MethodName, _Constness,           \\\n                                        _Override, _Final, _NoexceptSpec,      \\\n                                        _CallType, _RefSpec, _Signature)       \\\n  typename ::testing::internal::Function<GMOCK_PP_REMOVE_PARENS(               \\\n      _Signature)>::Result                                                     \\\n  GMOCK_INTERNAL_EXPAND(_CallType)                                             \\\n      _MethodName(GMOCK_PP_REPEAT(GMOCK_INTERNAL_PARAMETER, _Signature, _N))   \\\n          GMOCK_PP_IF(_Constness, const, ) _RefSpec _NoexceptSpec              \\\n          GMOCK_PP_IF(_Override, override, ) GMOCK_PP_IF(_Final, final, ) {    \\\n    GMOCK_MOCKER_(_N, _Constness, _MethodName)                                 \\\n        .SetOwnerAndName(this, #_MethodName);                                  \\\n    return GMOCK_MOCKER_(_N, _Constness, _MethodName)                          \\\n        .Invoke(GMOCK_PP_REPEAT(GMOCK_INTERNAL_FORWARD_ARG, _Signature, _N));  \\\n  }                                                                            \\\n  ::testing::MockSpec<GMOCK_PP_REMOVE_PARENS(_Signature)> gmock_##_MethodName( \\\n      GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_PARAMETER, _Signature, _N))       \\\n      GMOCK_PP_IF(_Constness, const, ) _RefSpec {                              \\\n    GMOCK_MOCKER_(_N, _Constness, _MethodName).RegisterOwner(this);            \\\n    return GMOCK_MOCKER_(_N, _Constness, _MethodName)                          \\\n        .With(GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_ARGUMENT, , _N));         \\\n  }                                                                            \\\n  ::testing::MockSpec<GMOCK_PP_REMOVE_PARENS(_Signature)> gmock_##_MethodName( \\\n      const ::testing::internal::WithoutMatchers&,                             \\\n      GMOCK_PP_IF(_Constness, const, )::testing::internal::Function<           \\\n          GMOCK_PP_REMOVE_PARENS(_Signature)>*) const _RefSpec _NoexceptSpec { \\\n    return ::testing::internal::ThisRefAdjuster<GMOCK_PP_IF(                   \\\n        _Constness, const, ) int _RefSpec>::Adjust(*this)                      \\\n        .gmock_##_MethodName(GMOCK_PP_REPEAT(                                  \\\n            GMOCK_INTERNAL_A_MATCHER_ARGUMENT, _Signature, _N));               \\\n  }                                                                            \\\n  mutable ::testing::FunctionMocker<GMOCK_PP_REMOVE_PARENS(_Signature)>        \\\n      GMOCK_MOCKER_(_N, _Constness, _MethodName)\n\n#define GMOCK_INTERNAL_EXPAND(...) __VA_ARGS__\n\n// Five Valid modifiers.\n#define GMOCK_INTERNAL_HAS_CONST(_Tuple) \\\n  GMOCK_PP_HAS_COMMA(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_CONST, ~, _Tuple))\n\n#define GMOCK_INTERNAL_HAS_OVERRIDE(_Tuple) \\\n  GMOCK_PP_HAS_COMMA(                       \\\n      GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_OVERRIDE, ~, _Tuple))\n\n#define GMOCK_INTERNAL_HAS_FINAL(_Tuple) \\\n  GMOCK_PP_HAS_COMMA(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_FINAL, ~, _Tuple))\n\n#define GMOCK_INTERNAL_GET_NOEXCEPT_SPEC(_Tuple) \\\n  GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_NOEXCEPT_SPEC_IF_NOEXCEPT, ~, _Tuple)\n\n#define GMOCK_INTERNAL_NOEXCEPT_SPEC_IF_NOEXCEPT(_i, _, _elem)          \\\n  GMOCK_PP_IF(                                                          \\\n      GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem)), \\\n      _elem, )\n\n#define GMOCK_INTERNAL_GET_REF_SPEC(_Tuple) \\\n  GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_REF_SPEC_IF_REF, ~, _Tuple)\n\n#define GMOCK_INTERNAL_REF_SPEC_IF_REF(_i, _, _elem)                       \\\n  GMOCK_PP_IF(GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_REF(_i, _, _elem)), \\\n              GMOCK_PP_CAT(GMOCK_INTERNAL_UNPACK_, _elem), )\n\n#define GMOCK_INTERNAL_GET_CALLTYPE(_Tuple) \\\n  GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_GET_CALLTYPE_IMPL, ~, _Tuple)\n\n#define GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT(_i, _, _elem)            \\\n  static_assert(                                                          \\\n      (GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_CONST(_i, _, _elem)) +    \\\n       GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_OVERRIDE(_i, _, _elem)) + \\\n       GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_FINAL(_i, _, _elem)) +    \\\n       GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem)) + \\\n       GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_REF(_i, _, _elem)) +      \\\n       GMOCK_INTERNAL_IS_CALLTYPE(_elem)) == 1,                           \\\n      GMOCK_PP_STRINGIZE(                                                 \\\n          _elem) \" cannot be recognized as a valid specification modifier.\");\n\n// Modifiers implementation.\n#define GMOCK_INTERNAL_DETECT_CONST(_i, _, _elem) \\\n  GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_CONST_I_, _elem)\n\n#define GMOCK_INTERNAL_DETECT_CONST_I_const ,\n\n#define GMOCK_INTERNAL_DETECT_OVERRIDE(_i, _, _elem) \\\n  GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_OVERRIDE_I_, _elem)\n\n#define GMOCK_INTERNAL_DETECT_OVERRIDE_I_override ,\n\n#define GMOCK_INTERNAL_DETECT_FINAL(_i, _, _elem) \\\n  GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_FINAL_I_, _elem)\n\n#define GMOCK_INTERNAL_DETECT_FINAL_I_final ,\n\n#define GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem) \\\n  GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_NOEXCEPT_I_, _elem)\n\n#define GMOCK_INTERNAL_DETECT_NOEXCEPT_I_noexcept ,\n\n#define GMOCK_INTERNAL_DETECT_REF(_i, _, _elem) \\\n  GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_REF_I_, _elem)\n\n#define GMOCK_INTERNAL_DETECT_REF_I_ref ,\n\n#define GMOCK_INTERNAL_UNPACK_ref(x) x\n\n#define GMOCK_INTERNAL_GET_CALLTYPE_IMPL(_i, _, _elem)           \\\n  GMOCK_PP_IF(GMOCK_INTERNAL_IS_CALLTYPE(_elem),                 \\\n              GMOCK_INTERNAL_GET_VALUE_CALLTYPE, GMOCK_PP_EMPTY) \\\n  (_elem)\n\n// TODO(iserna): GMOCK_INTERNAL_IS_CALLTYPE and\n// GMOCK_INTERNAL_GET_VALUE_CALLTYPE needed more expansions to work on windows\n// maybe they can be simplified somehow.\n#define GMOCK_INTERNAL_IS_CALLTYPE(_arg) \\\n  GMOCK_INTERNAL_IS_CALLTYPE_I(          \\\n      GMOCK_PP_CAT(GMOCK_INTERNAL_IS_CALLTYPE_HELPER_, _arg))\n#define GMOCK_INTERNAL_IS_CALLTYPE_I(_arg) GMOCK_PP_IS_ENCLOSED_PARENS(_arg)\n\n#define GMOCK_INTERNAL_GET_VALUE_CALLTYPE(_arg) \\\n  GMOCK_INTERNAL_GET_VALUE_CALLTYPE_I(          \\\n      GMOCK_PP_CAT(GMOCK_INTERNAL_IS_CALLTYPE_HELPER_, _arg))\n#define GMOCK_INTERNAL_GET_VALUE_CALLTYPE_I(_arg) \\\n  GMOCK_PP_IDENTITY _arg\n\n#define GMOCK_INTERNAL_IS_CALLTYPE_HELPER_Calltype\n\n// Note: The use of `identity_t` here allows _Ret to represent return types that\n// would normally need to be specified in a different way. For example, a method\n// returning a function pointer must be written as\n//\n// fn_ptr_return_t (*method(method_args_t...))(fn_ptr_args_t...)\n//\n// But we only support placing the return type at the beginning. To handle this,\n// we wrap all calls in identity_t, so that a declaration will be expanded to\n//\n// identity_t<fn_ptr_return_t (*)(fn_ptr_args_t...)> method(method_args_t...)\n//\n// This allows us to work around the syntactic oddities of function/method\n// types.\n#define GMOCK_INTERNAL_SIGNATURE(_Ret, _Args)                                 \\\n  ::testing::internal::identity_t<GMOCK_PP_IF(GMOCK_PP_IS_BEGIN_PARENS(_Ret), \\\n                                              GMOCK_PP_REMOVE_PARENS,         \\\n                                              GMOCK_PP_IDENTITY)(_Ret)>(      \\\n      GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_GET_TYPE, _, _Args))\n\n#define GMOCK_INTERNAL_GET_TYPE(_i, _, _elem)                          \\\n  GMOCK_PP_COMMA_IF(_i)                                                \\\n  GMOCK_PP_IF(GMOCK_PP_IS_BEGIN_PARENS(_elem), GMOCK_PP_REMOVE_PARENS, \\\n              GMOCK_PP_IDENTITY)                                       \\\n  (_elem)\n\n#define GMOCK_INTERNAL_PARAMETER(_i, _Signature, _)            \\\n  GMOCK_PP_COMMA_IF(_i)                                        \\\n  GMOCK_INTERNAL_ARG_O(_i, GMOCK_PP_REMOVE_PARENS(_Signature)) \\\n  gmock_a##_i\n\n#define GMOCK_INTERNAL_FORWARD_ARG(_i, _Signature, _) \\\n  GMOCK_PP_COMMA_IF(_i)                               \\\n  ::std::forward<GMOCK_INTERNAL_ARG_O(                \\\n      _i, GMOCK_PP_REMOVE_PARENS(_Signature))>(gmock_a##_i)\n\n#define GMOCK_INTERNAL_MATCHER_PARAMETER(_i, _Signature, _)        \\\n  GMOCK_PP_COMMA_IF(_i)                                            \\\n  GMOCK_INTERNAL_MATCHER_O(_i, GMOCK_PP_REMOVE_PARENS(_Signature)) \\\n  gmock_a##_i\n\n#define GMOCK_INTERNAL_MATCHER_ARGUMENT(_i, _1, _2) \\\n  GMOCK_PP_COMMA_IF(_i)                             \\\n  gmock_a##_i\n\n#define GMOCK_INTERNAL_A_MATCHER_ARGUMENT(_i, _Signature, _) \\\n  GMOCK_PP_COMMA_IF(_i)                                      \\\n  ::testing::A<GMOCK_INTERNAL_ARG_O(_i, GMOCK_PP_REMOVE_PARENS(_Signature))>()\n\n#define GMOCK_INTERNAL_ARG_O(_i, ...) \\\n  typename ::testing::internal::Function<__VA_ARGS__>::template Arg<_i>::type\n\n#define GMOCK_INTERNAL_MATCHER_O(_i, ...)                          \\\n  const ::testing::Matcher<typename ::testing::internal::Function< \\\n      __VA_ARGS__>::template Arg<_i>::type>&\n\n#define MOCK_METHOD0(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 0, __VA_ARGS__)\n#define MOCK_METHOD1(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 1, __VA_ARGS__)\n#define MOCK_METHOD2(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 2, __VA_ARGS__)\n#define MOCK_METHOD3(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 3, __VA_ARGS__)\n#define MOCK_METHOD4(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 4, __VA_ARGS__)\n#define MOCK_METHOD5(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 5, __VA_ARGS__)\n#define MOCK_METHOD6(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 6, __VA_ARGS__)\n#define MOCK_METHOD7(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 7, __VA_ARGS__)\n#define MOCK_METHOD8(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 8, __VA_ARGS__)\n#define MOCK_METHOD9(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 9, __VA_ARGS__)\n#define MOCK_METHOD10(m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(, , m, 10, __VA_ARGS__)\n\n#define MOCK_CONST_METHOD0(m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, , m, 0, __VA_ARGS__)\n#define MOCK_CONST_METHOD1(m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, , m, 1, __VA_ARGS__)\n#define MOCK_CONST_METHOD2(m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, , m, 2, __VA_ARGS__)\n#define MOCK_CONST_METHOD3(m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, , m, 3, __VA_ARGS__)\n#define MOCK_CONST_METHOD4(m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, , m, 4, __VA_ARGS__)\n#define MOCK_CONST_METHOD5(m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, , m, 5, __VA_ARGS__)\n#define MOCK_CONST_METHOD6(m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, , m, 6, __VA_ARGS__)\n#define MOCK_CONST_METHOD7(m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, , m, 7, __VA_ARGS__)\n#define MOCK_CONST_METHOD8(m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, , m, 8, __VA_ARGS__)\n#define MOCK_CONST_METHOD9(m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, , m, 9, __VA_ARGS__)\n#define MOCK_CONST_METHOD10(m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, , m, 10, __VA_ARGS__)\n\n#define MOCK_METHOD0_T(m, ...) MOCK_METHOD0(m, __VA_ARGS__)\n#define MOCK_METHOD1_T(m, ...) MOCK_METHOD1(m, __VA_ARGS__)\n#define MOCK_METHOD2_T(m, ...) MOCK_METHOD2(m, __VA_ARGS__)\n#define MOCK_METHOD3_T(m, ...) MOCK_METHOD3(m, __VA_ARGS__)\n#define MOCK_METHOD4_T(m, ...) MOCK_METHOD4(m, __VA_ARGS__)\n#define MOCK_METHOD5_T(m, ...) MOCK_METHOD5(m, __VA_ARGS__)\n#define MOCK_METHOD6_T(m, ...) MOCK_METHOD6(m, __VA_ARGS__)\n#define MOCK_METHOD7_T(m, ...) MOCK_METHOD7(m, __VA_ARGS__)\n#define MOCK_METHOD8_T(m, ...) MOCK_METHOD8(m, __VA_ARGS__)\n#define MOCK_METHOD9_T(m, ...) MOCK_METHOD9(m, __VA_ARGS__)\n#define MOCK_METHOD10_T(m, ...) MOCK_METHOD10(m, __VA_ARGS__)\n\n#define MOCK_CONST_METHOD0_T(m, ...) MOCK_CONST_METHOD0(m, __VA_ARGS__)\n#define MOCK_CONST_METHOD1_T(m, ...) MOCK_CONST_METHOD1(m, __VA_ARGS__)\n#define MOCK_CONST_METHOD2_T(m, ...) MOCK_CONST_METHOD2(m, __VA_ARGS__)\n#define MOCK_CONST_METHOD3_T(m, ...) MOCK_CONST_METHOD3(m, __VA_ARGS__)\n#define MOCK_CONST_METHOD4_T(m, ...) MOCK_CONST_METHOD4(m, __VA_ARGS__)\n#define MOCK_CONST_METHOD5_T(m, ...) MOCK_CONST_METHOD5(m, __VA_ARGS__)\n#define MOCK_CONST_METHOD6_T(m, ...) MOCK_CONST_METHOD6(m, __VA_ARGS__)\n#define MOCK_CONST_METHOD7_T(m, ...) MOCK_CONST_METHOD7(m, __VA_ARGS__)\n#define MOCK_CONST_METHOD8_T(m, ...) MOCK_CONST_METHOD8(m, __VA_ARGS__)\n#define MOCK_CONST_METHOD9_T(m, ...) MOCK_CONST_METHOD9(m, __VA_ARGS__)\n#define MOCK_CONST_METHOD10_T(m, ...) MOCK_CONST_METHOD10(m, __VA_ARGS__)\n\n#define MOCK_METHOD0_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 0, __VA_ARGS__)\n#define MOCK_METHOD1_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 1, __VA_ARGS__)\n#define MOCK_METHOD2_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 2, __VA_ARGS__)\n#define MOCK_METHOD3_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 3, __VA_ARGS__)\n#define MOCK_METHOD4_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 4, __VA_ARGS__)\n#define MOCK_METHOD5_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 5, __VA_ARGS__)\n#define MOCK_METHOD6_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 6, __VA_ARGS__)\n#define MOCK_METHOD7_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 7, __VA_ARGS__)\n#define MOCK_METHOD8_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 8, __VA_ARGS__)\n#define MOCK_METHOD9_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 9, __VA_ARGS__)\n#define MOCK_METHOD10_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 10, __VA_ARGS__)\n\n#define MOCK_CONST_METHOD0_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 0, __VA_ARGS__)\n#define MOCK_CONST_METHOD1_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 1, __VA_ARGS__)\n#define MOCK_CONST_METHOD2_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 2, __VA_ARGS__)\n#define MOCK_CONST_METHOD3_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 3, __VA_ARGS__)\n#define MOCK_CONST_METHOD4_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 4, __VA_ARGS__)\n#define MOCK_CONST_METHOD5_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 5, __VA_ARGS__)\n#define MOCK_CONST_METHOD6_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 6, __VA_ARGS__)\n#define MOCK_CONST_METHOD7_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 7, __VA_ARGS__)\n#define MOCK_CONST_METHOD8_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 8, __VA_ARGS__)\n#define MOCK_CONST_METHOD9_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 9, __VA_ARGS__)\n#define MOCK_CONST_METHOD10_WITH_CALLTYPE(ct, m, ...) \\\n  GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 10, __VA_ARGS__)\n\n#define MOCK_METHOD0_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_METHOD0_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n#define MOCK_METHOD1_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_METHOD1_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n#define MOCK_METHOD2_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_METHOD2_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n#define MOCK_METHOD3_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_METHOD3_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n#define MOCK_METHOD4_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_METHOD4_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n#define MOCK_METHOD5_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_METHOD5_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n#define MOCK_METHOD6_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_METHOD6_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n#define MOCK_METHOD7_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_METHOD7_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n#define MOCK_METHOD8_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_METHOD8_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n#define MOCK_METHOD9_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_METHOD9_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n#define MOCK_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_METHOD10_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n\n#define MOCK_CONST_METHOD0_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_CONST_METHOD0_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD1_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_CONST_METHOD1_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD2_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_CONST_METHOD2_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD3_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_CONST_METHOD3_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD4_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_CONST_METHOD4_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD5_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_CONST_METHOD5_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD6_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_CONST_METHOD6_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD7_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_CONST_METHOD7_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD8_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_CONST_METHOD8_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD9_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_CONST_METHOD9_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \\\n  MOCK_CONST_METHOD10_WITH_CALLTYPE(ct, m, __VA_ARGS__)\n\n#define GMOCK_INTERNAL_MOCK_METHODN(constness, ct, Method, args_num, ...) \\\n  GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE(                                  \\\n      args_num, ::testing::internal::identity_t<__VA_ARGS__>);            \\\n  GMOCK_INTERNAL_MOCK_METHOD_IMPL(                                        \\\n      args_num, Method, GMOCK_PP_NARG0(constness), 0, 0, , ct, ,          \\\n      (::testing::internal::identity_t<__VA_ARGS__>))\n\n#define GMOCK_MOCKER_(arity, constness, Method) \\\n  GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__)\n\n#endif  // GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_FUNCTION_MOCKER_H_\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements some commonly used variadic actions.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_\n#define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_\n\n#include <memory>\n#include <utility>\n\n\n// Include any custom callback actions added by the local installation.\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_GENERATED_ACTIONS_H_\n#define GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_GENERATED_ACTIONS_H_\n\n#endif  // GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_GENERATED_ACTIONS_H_\n\n// Sometimes you want to give an action explicit template parameters\n// that cannot be inferred from its value parameters.  ACTION() and\n// ACTION_P*() don't support that.  ACTION_TEMPLATE() remedies that\n// and can be viewed as an extension to ACTION() and ACTION_P*().\n//\n// The syntax:\n//\n//   ACTION_TEMPLATE(ActionName,\n//                   HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m),\n//                   AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; }\n//\n// defines an action template that takes m explicit template\n// parameters and n value parameters.  name_i is the name of the i-th\n// template parameter, and kind_i specifies whether it's a typename,\n// an integral constant, or a template.  p_i is the name of the i-th\n// value parameter.\n//\n// Example:\n//\n//   // DuplicateArg<k, T>(output) converts the k-th argument of the mock\n//   // function to type T and copies it to *output.\n//   ACTION_TEMPLATE(DuplicateArg,\n//                   HAS_2_TEMPLATE_PARAMS(int, k, typename, T),\n//                   AND_1_VALUE_PARAMS(output)) {\n//     *output = T(::std::get<k>(args));\n//   }\n//   ...\n//     int n;\n//     EXPECT_CALL(mock, Foo(_, _))\n//         .WillOnce(DuplicateArg<1, unsigned char>(&n));\n//\n// To create an instance of an action template, write:\n//\n//   ActionName<t1, ..., t_m>(v1, ..., v_n)\n//\n// where the ts are the template arguments and the vs are the value\n// arguments.  The value argument types are inferred by the compiler.\n// If you want to explicitly specify the value argument types, you can\n// provide additional template arguments:\n//\n//   ActionName<t1, ..., t_m, u1, ..., u_k>(v1, ..., v_n)\n//\n// where u_i is the desired type of v_i.\n//\n// ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded on the\n// number of value parameters, but not on the number of template\n// parameters.  Without the restriction, the meaning of the following\n// is unclear:\n//\n//   OverloadedAction<int, bool>(x);\n//\n// Are we using a single-template-parameter action where 'bool' refers\n// to the type of x, or are we using a two-template-parameter action\n// where the compiler is asked to infer the type of x?\n//\n// Implementation notes:\n//\n// GMOCK_INTERNAL_*_HAS_m_TEMPLATE_PARAMS and\n// GMOCK_INTERNAL_*_AND_n_VALUE_PARAMS are internal macros for\n// implementing ACTION_TEMPLATE.  The main trick we use is to create\n// new macro invocations when expanding a macro.  For example, we have\n//\n//   #define ACTION_TEMPLATE(name, template_params, value_params)\n//       ... GMOCK_INTERNAL_DECL_##template_params ...\n//\n// which causes ACTION_TEMPLATE(..., HAS_1_TEMPLATE_PARAMS(typename, T), ...)\n// to expand to\n//\n//       ... GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(typename, T) ...\n//\n// Since GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS is a macro, the\n// preprocessor will continue to expand it to\n//\n//       ... typename T ...\n//\n// This technique conforms to the C++ standard and is portable.  It\n// allows us to implement action templates using O(N) code, where N is\n// the maximum number of template/value parameters supported.  Without\n// using it, we'd have to devote O(N^2) amount of code to implement all\n// combinations of m and n.\n\n// Declares the template parameters.\n#define GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(kind0, name0) kind0 name0\n#define GMOCK_INTERNAL_DECL_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \\\n    name1) kind0 name0, kind1 name1\n#define GMOCK_INTERNAL_DECL_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2) kind0 name0, kind1 name1, kind2 name2\n#define GMOCK_INTERNAL_DECL_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3) kind0 name0, kind1 name1, kind2 name2, \\\n    kind3 name3\n#define GMOCK_INTERNAL_DECL_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3, kind4, name4) kind0 name0, kind1 name1, \\\n    kind2 name2, kind3 name3, kind4 name4\n#define GMOCK_INTERNAL_DECL_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3, kind4, name4, kind5, name5) kind0 name0, \\\n    kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5\n#define GMOCK_INTERNAL_DECL_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \\\n    name6) kind0 name0, kind1 name1, kind2 name2, kind3 name3, kind4 name4, \\\n    kind5 name5, kind6 name6\n#define GMOCK_INTERNAL_DECL_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \\\n    kind7, name7) kind0 name0, kind1 name1, kind2 name2, kind3 name3, \\\n    kind4 name4, kind5 name5, kind6 name6, kind7 name7\n#define GMOCK_INTERNAL_DECL_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \\\n    kind7, name7, kind8, name8) kind0 name0, kind1 name1, kind2 name2, \\\n    kind3 name3, kind4 name4, kind5 name5, kind6 name6, kind7 name7, \\\n    kind8 name8\n#define GMOCK_INTERNAL_DECL_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \\\n    name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \\\n    name6, kind7, name7, kind8, name8, kind9, name9) kind0 name0, \\\n    kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5, \\\n    kind6 name6, kind7 name7, kind8 name8, kind9 name9\n\n// Lists the template parameters.\n#define GMOCK_INTERNAL_LIST_HAS_1_TEMPLATE_PARAMS(kind0, name0) name0\n#define GMOCK_INTERNAL_LIST_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \\\n    name1) name0, name1\n#define GMOCK_INTERNAL_LIST_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2) name0, name1, name2\n#define GMOCK_INTERNAL_LIST_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3) name0, name1, name2, name3\n#define GMOCK_INTERNAL_LIST_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3, kind4, name4) name0, name1, name2, name3, \\\n    name4\n#define GMOCK_INTERNAL_LIST_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3, kind4, name4, kind5, name5) name0, name1, \\\n    name2, name3, name4, name5\n#define GMOCK_INTERNAL_LIST_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \\\n    name6) name0, name1, name2, name3, name4, name5, name6\n#define GMOCK_INTERNAL_LIST_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \\\n    kind7, name7) name0, name1, name2, name3, name4, name5, name6, name7\n#define GMOCK_INTERNAL_LIST_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \\\n    kind7, name7, kind8, name8) name0, name1, name2, name3, name4, name5, \\\n    name6, name7, name8\n#define GMOCK_INTERNAL_LIST_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \\\n    name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \\\n    name6, kind7, name7, kind8, name8, kind9, name9) name0, name1, name2, \\\n    name3, name4, name5, name6, name7, name8, name9\n\n// Declares the types of value parameters.\n#define GMOCK_INTERNAL_DECL_TYPE_AND_0_VALUE_PARAMS()\n#define GMOCK_INTERNAL_DECL_TYPE_AND_1_VALUE_PARAMS(p0) , typename p0##_type\n#define GMOCK_INTERNAL_DECL_TYPE_AND_2_VALUE_PARAMS(p0, p1) , \\\n    typename p0##_type, typename p1##_type\n#define GMOCK_INTERNAL_DECL_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , \\\n    typename p0##_type, typename p1##_type, typename p2##_type\n#define GMOCK_INTERNAL_DECL_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \\\n    typename p0##_type, typename p1##_type, typename p2##_type, \\\n    typename p3##_type\n#define GMOCK_INTERNAL_DECL_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \\\n    typename p0##_type, typename p1##_type, typename p2##_type, \\\n    typename p3##_type, typename p4##_type\n#define GMOCK_INTERNAL_DECL_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \\\n    typename p0##_type, typename p1##_type, typename p2##_type, \\\n    typename p3##_type, typename p4##_type, typename p5##_type\n#define GMOCK_INTERNAL_DECL_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6) , typename p0##_type, typename p1##_type, typename p2##_type, \\\n    typename p3##_type, typename p4##_type, typename p5##_type, \\\n    typename p6##_type\n#define GMOCK_INTERNAL_DECL_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6, p7) , typename p0##_type, typename p1##_type, typename p2##_type, \\\n    typename p3##_type, typename p4##_type, typename p5##_type, \\\n    typename p6##_type, typename p7##_type\n#define GMOCK_INTERNAL_DECL_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6, p7, p8) , typename p0##_type, typename p1##_type, typename p2##_type, \\\n    typename p3##_type, typename p4##_type, typename p5##_type, \\\n    typename p6##_type, typename p7##_type, typename p8##_type\n#define GMOCK_INTERNAL_DECL_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6, p7, p8, p9) , typename p0##_type, typename p1##_type, \\\n    typename p2##_type, typename p3##_type, typename p4##_type, \\\n    typename p5##_type, typename p6##_type, typename p7##_type, \\\n    typename p8##_type, typename p9##_type\n\n// Initializes the value parameters.\n#define GMOCK_INTERNAL_INIT_AND_0_VALUE_PARAMS()\\\n    ()\n#define GMOCK_INTERNAL_INIT_AND_1_VALUE_PARAMS(p0)\\\n    (p0##_type gmock_p0) : p0(::std::move(gmock_p0))\n#define GMOCK_INTERNAL_INIT_AND_2_VALUE_PARAMS(p0, p1)\\\n    (p0##_type gmock_p0, p1##_type gmock_p1) : p0(::std::move(gmock_p0)), \\\n        p1(::std::move(gmock_p1))\n#define GMOCK_INTERNAL_INIT_AND_3_VALUE_PARAMS(p0, p1, p2)\\\n    (p0##_type gmock_p0, p1##_type gmock_p1, \\\n        p2##_type gmock_p2) : p0(::std::move(gmock_p0)), \\\n        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2))\n#define GMOCK_INTERNAL_INIT_AND_4_VALUE_PARAMS(p0, p1, p2, p3)\\\n    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n        p3##_type gmock_p3) : p0(::std::move(gmock_p0)), \\\n        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \\\n        p3(::std::move(gmock_p3))\n#define GMOCK_INTERNAL_INIT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)\\\n    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n        p3##_type gmock_p3, p4##_type gmock_p4) : p0(::std::move(gmock_p0)), \\\n        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \\\n        p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4))\n#define GMOCK_INTERNAL_INIT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)\\\n    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n        p3##_type gmock_p3, p4##_type gmock_p4, \\\n        p5##_type gmock_p5) : p0(::std::move(gmock_p0)), \\\n        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \\\n        p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \\\n        p5(::std::move(gmock_p5))\n#define GMOCK_INTERNAL_INIT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)\\\n    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n        p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \\\n        p6##_type gmock_p6) : p0(::std::move(gmock_p0)), \\\n        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \\\n        p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \\\n        p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6))\n#define GMOCK_INTERNAL_INIT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)\\\n    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n        p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \\\n        p6##_type gmock_p6, p7##_type gmock_p7) : p0(::std::move(gmock_p0)), \\\n        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \\\n        p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \\\n        p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \\\n        p7(::std::move(gmock_p7))\n#define GMOCK_INTERNAL_INIT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7, p8)\\\n    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n        p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \\\n        p6##_type gmock_p6, p7##_type gmock_p7, \\\n        p8##_type gmock_p8) : p0(::std::move(gmock_p0)), \\\n        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \\\n        p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \\\n        p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \\\n        p7(::std::move(gmock_p7)), p8(::std::move(gmock_p8))\n#define GMOCK_INTERNAL_INIT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7, p8, p9)\\\n    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n        p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \\\n        p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \\\n        p9##_type gmock_p9) : p0(::std::move(gmock_p0)), \\\n        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \\\n        p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \\\n        p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \\\n        p7(::std::move(gmock_p7)), p8(::std::move(gmock_p8)), \\\n        p9(::std::move(gmock_p9))\n\n// Defines the copy constructor\n#define GMOCK_INTERNAL_DEFN_COPY_AND_0_VALUE_PARAMS() \\\n    {}  // Avoid https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82134\n#define GMOCK_INTERNAL_DEFN_COPY_AND_1_VALUE_PARAMS(...) = default;\n#define GMOCK_INTERNAL_DEFN_COPY_AND_2_VALUE_PARAMS(...) = default;\n#define GMOCK_INTERNAL_DEFN_COPY_AND_3_VALUE_PARAMS(...) = default;\n#define GMOCK_INTERNAL_DEFN_COPY_AND_4_VALUE_PARAMS(...) = default;\n#define GMOCK_INTERNAL_DEFN_COPY_AND_5_VALUE_PARAMS(...) = default;\n#define GMOCK_INTERNAL_DEFN_COPY_AND_6_VALUE_PARAMS(...) = default;\n#define GMOCK_INTERNAL_DEFN_COPY_AND_7_VALUE_PARAMS(...) = default;\n#define GMOCK_INTERNAL_DEFN_COPY_AND_8_VALUE_PARAMS(...) = default;\n#define GMOCK_INTERNAL_DEFN_COPY_AND_9_VALUE_PARAMS(...) = default;\n#define GMOCK_INTERNAL_DEFN_COPY_AND_10_VALUE_PARAMS(...) = default;\n\n// Declares the fields for storing the value parameters.\n#define GMOCK_INTERNAL_DEFN_AND_0_VALUE_PARAMS()\n#define GMOCK_INTERNAL_DEFN_AND_1_VALUE_PARAMS(p0) p0##_type p0;\n#define GMOCK_INTERNAL_DEFN_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0; \\\n    p1##_type p1;\n#define GMOCK_INTERNAL_DEFN_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0; \\\n    p1##_type p1; p2##_type p2;\n#define GMOCK_INTERNAL_DEFN_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0; \\\n    p1##_type p1; p2##_type p2; p3##_type p3;\n#define GMOCK_INTERNAL_DEFN_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \\\n    p4) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4;\n#define GMOCK_INTERNAL_DEFN_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \\\n    p5) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \\\n    p5##_type p5;\n#define GMOCK_INTERNAL_DEFN_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \\\n    p5##_type p5; p6##_type p6;\n#define GMOCK_INTERNAL_DEFN_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \\\n    p5##_type p5; p6##_type p6; p7##_type p7;\n#define GMOCK_INTERNAL_DEFN_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7, p8) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \\\n    p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8;\n#define GMOCK_INTERNAL_DEFN_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7, p8, p9) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \\\n    p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8; \\\n    p9##_type p9;\n\n// Lists the value parameters.\n#define GMOCK_INTERNAL_LIST_AND_0_VALUE_PARAMS()\n#define GMOCK_INTERNAL_LIST_AND_1_VALUE_PARAMS(p0) p0\n#define GMOCK_INTERNAL_LIST_AND_2_VALUE_PARAMS(p0, p1) p0, p1\n#define GMOCK_INTERNAL_LIST_AND_3_VALUE_PARAMS(p0, p1, p2) p0, p1, p2\n#define GMOCK_INTERNAL_LIST_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0, p1, p2, p3\n#define GMOCK_INTERNAL_LIST_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) p0, p1, \\\n    p2, p3, p4\n#define GMOCK_INTERNAL_LIST_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) p0, \\\n    p1, p2, p3, p4, p5\n#define GMOCK_INTERNAL_LIST_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6) p0, p1, p2, p3, p4, p5, p6\n#define GMOCK_INTERNAL_LIST_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7) p0, p1, p2, p3, p4, p5, p6, p7\n#define GMOCK_INTERNAL_LIST_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7, p8) p0, p1, p2, p3, p4, p5, p6, p7, p8\n#define GMOCK_INTERNAL_LIST_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7, p8, p9) p0, p1, p2, p3, p4, p5, p6, p7, p8, p9\n\n// Lists the value parameter types.\n#define GMOCK_INTERNAL_LIST_TYPE_AND_0_VALUE_PARAMS()\n#define GMOCK_INTERNAL_LIST_TYPE_AND_1_VALUE_PARAMS(p0) , p0##_type\n#define GMOCK_INTERNAL_LIST_TYPE_AND_2_VALUE_PARAMS(p0, p1) , p0##_type, \\\n    p1##_type\n#define GMOCK_INTERNAL_LIST_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , p0##_type, \\\n    p1##_type, p2##_type\n#define GMOCK_INTERNAL_LIST_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \\\n    p0##_type, p1##_type, p2##_type, p3##_type\n#define GMOCK_INTERNAL_LIST_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \\\n    p0##_type, p1##_type, p2##_type, p3##_type, p4##_type\n#define GMOCK_INTERNAL_LIST_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \\\n    p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type\n#define GMOCK_INTERNAL_LIST_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, \\\n    p6##_type\n#define GMOCK_INTERNAL_LIST_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6, p7) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \\\n    p5##_type, p6##_type, p7##_type\n#define GMOCK_INTERNAL_LIST_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6, p7, p8) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \\\n    p5##_type, p6##_type, p7##_type, p8##_type\n#define GMOCK_INTERNAL_LIST_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6, p7, p8, p9) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \\\n    p5##_type, p6##_type, p7##_type, p8##_type, p9##_type\n\n// Declares the value parameters.\n#define GMOCK_INTERNAL_DECL_AND_0_VALUE_PARAMS()\n#define GMOCK_INTERNAL_DECL_AND_1_VALUE_PARAMS(p0) p0##_type p0\n#define GMOCK_INTERNAL_DECL_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0, \\\n    p1##_type p1\n#define GMOCK_INTERNAL_DECL_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0, \\\n    p1##_type p1, p2##_type p2\n#define GMOCK_INTERNAL_DECL_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0, \\\n    p1##_type p1, p2##_type p2, p3##_type p3\n#define GMOCK_INTERNAL_DECL_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \\\n    p4) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4\n#define GMOCK_INTERNAL_DECL_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \\\n    p5) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \\\n    p5##_type p5\n#define GMOCK_INTERNAL_DECL_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \\\n    p5##_type p5, p6##_type p6\n#define GMOCK_INTERNAL_DECL_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \\\n    p5##_type p5, p6##_type p6, p7##_type p7\n#define GMOCK_INTERNAL_DECL_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7, p8) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \\\n    p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8\n#define GMOCK_INTERNAL_DECL_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7, p8, p9) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \\\n    p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \\\n    p9##_type p9\n\n// The suffix of the class template implementing the action template.\n#define GMOCK_INTERNAL_COUNT_AND_0_VALUE_PARAMS()\n#define GMOCK_INTERNAL_COUNT_AND_1_VALUE_PARAMS(p0) P\n#define GMOCK_INTERNAL_COUNT_AND_2_VALUE_PARAMS(p0, p1) P2\n#define GMOCK_INTERNAL_COUNT_AND_3_VALUE_PARAMS(p0, p1, p2) P3\n#define GMOCK_INTERNAL_COUNT_AND_4_VALUE_PARAMS(p0, p1, p2, p3) P4\n#define GMOCK_INTERNAL_COUNT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) P5\n#define GMOCK_INTERNAL_COUNT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) P6\n#define GMOCK_INTERNAL_COUNT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6) P7\n#define GMOCK_INTERNAL_COUNT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7) P8\n#define GMOCK_INTERNAL_COUNT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7, p8) P9\n#define GMOCK_INTERNAL_COUNT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7, p8, p9) P10\n\n// The name of the class template implementing the action template.\n#define GMOCK_ACTION_CLASS_(name, value_params)\\\n    GTEST_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params)\n\n#define ACTION_TEMPLATE(name, template_params, value_params)                   \\\n  template <GMOCK_INTERNAL_DECL_##template_params                              \\\n            GMOCK_INTERNAL_DECL_TYPE_##value_params>                           \\\n  class GMOCK_ACTION_CLASS_(name, value_params) {                              \\\n   public:                                                                     \\\n    explicit GMOCK_ACTION_CLASS_(name, value_params)(                          \\\n        GMOCK_INTERNAL_DECL_##value_params)                                    \\\n        GMOCK_PP_IF(GMOCK_PP_IS_EMPTY(GMOCK_INTERNAL_COUNT_##value_params),    \\\n                    = default; ,                                               \\\n                    : impl_(std::make_shared<gmock_Impl>(                      \\\n                                GMOCK_INTERNAL_LIST_##value_params)) { })      \\\n    GMOCK_ACTION_CLASS_(name, value_params)(                                   \\\n        const GMOCK_ACTION_CLASS_(name, value_params)&) noexcept               \\\n        GMOCK_INTERNAL_DEFN_COPY_##value_params                                \\\n    GMOCK_ACTION_CLASS_(name, value_params)(                                   \\\n        GMOCK_ACTION_CLASS_(name, value_params)&&) noexcept                    \\\n        GMOCK_INTERNAL_DEFN_COPY_##value_params                                \\\n    template <typename F>                                                      \\\n    operator ::testing::Action<F>() const {                                    \\\n      return GMOCK_PP_IF(                                                      \\\n          GMOCK_PP_IS_EMPTY(GMOCK_INTERNAL_COUNT_##value_params),              \\\n                      (::testing::internal::MakeAction<F, gmock_Impl>()),      \\\n                      (::testing::internal::MakeAction<F>(impl_)));            \\\n    }                                                                          \\\n   private:                                                                    \\\n    class gmock_Impl {                                                         \\\n     public:                                                                   \\\n      explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}                \\\n      template <typename function_type, typename return_type,                  \\\n                typename args_type, GMOCK_ACTION_TEMPLATE_ARGS_NAMES_>         \\\n      return_type gmock_PerformImpl(GMOCK_ACTION_ARG_TYPES_AND_NAMES_) const;  \\\n      GMOCK_INTERNAL_DEFN_##value_params                                       \\\n    };                                                                         \\\n    GMOCK_PP_IF(GMOCK_PP_IS_EMPTY(GMOCK_INTERNAL_COUNT_##value_params),        \\\n                , std::shared_ptr<const gmock_Impl> impl_;)                    \\\n  };                                                                           \\\n  template <GMOCK_INTERNAL_DECL_##template_params                              \\\n            GMOCK_INTERNAL_DECL_TYPE_##value_params>                           \\\n  GMOCK_ACTION_CLASS_(name, value_params)<                                     \\\n      GMOCK_INTERNAL_LIST_##template_params                                    \\\n      GMOCK_INTERNAL_LIST_TYPE_##value_params> name(                           \\\n          GMOCK_INTERNAL_DECL_##value_params) GTEST_MUST_USE_RESULT_;          \\\n  template <GMOCK_INTERNAL_DECL_##template_params                              \\\n            GMOCK_INTERNAL_DECL_TYPE_##value_params>                           \\\n  inline GMOCK_ACTION_CLASS_(name, value_params)<                              \\\n      GMOCK_INTERNAL_LIST_##template_params                                    \\\n      GMOCK_INTERNAL_LIST_TYPE_##value_params> name(                           \\\n          GMOCK_INTERNAL_DECL_##value_params) {                                \\\n    return GMOCK_ACTION_CLASS_(name, value_params)<                            \\\n        GMOCK_INTERNAL_LIST_##template_params                                  \\\n        GMOCK_INTERNAL_LIST_TYPE_##value_params>(                              \\\n            GMOCK_INTERNAL_LIST_##value_params);                               \\\n  }                                                                            \\\n  template <GMOCK_INTERNAL_DECL_##template_params                              \\\n            GMOCK_INTERNAL_DECL_TYPE_##value_params>                           \\\n  template <typename function_type, typename return_type, typename args_type,  \\\n            GMOCK_ACTION_TEMPLATE_ARGS_NAMES_>                                 \\\n  return_type GMOCK_ACTION_CLASS_(name, value_params)<                         \\\n      GMOCK_INTERNAL_LIST_##template_params                                    \\\n      GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl::gmock_PerformImpl( \\\n          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const\n\nnamespace testing {\n\n// The ACTION*() macros trigger warning C4100 (unreferenced formal\n// parameter) in MSVC with -W4.  Unfortunately they cannot be fixed in\n// the macro definition, as the warnings are generated when the macro\n// is expanded and macro expansion cannot contain #pragma.  Therefore\n// we suppress them here.\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable:4100)\n#endif\n\nnamespace internal {\n\n// internal::InvokeArgument - a helper for InvokeArgument action.\n// The basic overloads are provided here for generic functors.\n// Overloads for other custom-callables are provided in the\n// internal/custom/gmock-generated-actions.h header.\ntemplate <typename F, typename... Args>\nauto InvokeArgument(F f, Args... args) -> decltype(f(args...)) {\n  return f(args...);\n}\n\ntemplate <std::size_t index, typename... Params>\nstruct InvokeArgumentAction {\n  template <typename... Args>\n  auto operator()(Args&&... args) const -> decltype(internal::InvokeArgument(\n      std::get<index>(std::forward_as_tuple(std::forward<Args>(args)...)),\n      std::declval<const Params&>()...)) {\n    internal::FlatTuple<Args&&...> args_tuple(FlatTupleConstructTag{},\n                                              std::forward<Args>(args)...);\n    return params.Apply([&](const Params&... unpacked_params) {\n      auto&& callable = args_tuple.template Get<index>();\n      return internal::InvokeArgument(\n          std::forward<decltype(callable)>(callable), unpacked_params...);\n    });\n  }\n\n  internal::FlatTuple<Params...> params;\n};\n\n}  // namespace internal\n\n// The InvokeArgument<N>(a1, a2, ..., a_k) action invokes the N-th\n// (0-based) argument, which must be a k-ary callable, of the mock\n// function, with arguments a1, a2, ..., a_k.\n//\n// Notes:\n//\n//   1. The arguments are passed by value by default.  If you need to\n//   pass an argument by reference, wrap it inside std::ref().  For\n//   example,\n//\n//     InvokeArgument<1>(5, string(\"Hello\"), std::ref(foo))\n//\n//   passes 5 and string(\"Hello\") by value, and passes foo by\n//   reference.\n//\n//   2. If the callable takes an argument by reference but std::ref() is\n//   not used, it will receive the reference to a copy of the value,\n//   instead of the original value.  For example, when the 0-th\n//   argument of the mock function takes a const string&, the action\n//\n//     InvokeArgument<0>(string(\"Hello\"))\n//\n//   makes a copy of the temporary string(\"Hello\") object and passes a\n//   reference of the copy, instead of the original temporary object,\n//   to the callable.  This makes it easy for a user to define an\n//   InvokeArgument action from temporary values and have it performed\n//   later.\ntemplate <std::size_t index, typename... Params>\ninternal::InvokeArgumentAction<index, typename std::decay<Params>::type...>\nInvokeArgument(Params&&... params) {\n  return {internal::FlatTuple<typename std::decay<Params>::type...>(\n      internal::FlatTupleConstructTag{}, std::forward<Params>(params)...)};\n}\n\n#ifdef _MSC_VER\n# pragma warning(pop)\n#endif\n\n}  // namespace testing\n\n#endif  // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_\n// Copyright 2013, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements some matchers that depend on gmock-matchers.h.\n//\n// Note that tests are implemented in gmock-matchers_test.cc rather than\n// gmock-more-matchers-test.cc.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MORE_MATCHERS_H_\n#define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MORE_MATCHERS_H_\n\n\nnamespace testing {\n\n// Silence C4100 (unreferenced formal\n// parameter) for MSVC\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable:4100)\n#if (_MSC_VER == 1900)\n// and silence C4800 (C4800: 'int *const ': forcing value\n// to bool 'true' or 'false') for MSVC 14\n# pragma warning(disable:4800)\n  #endif\n#endif\n\n// Defines a matcher that matches an empty container. The container must\n// support both size() and empty(), which all STL-like containers provide.\nMATCHER(IsEmpty, negation ? \"isn't empty\" : \"is empty\") {\n  if (arg.empty()) {\n    return true;\n  }\n  *result_listener << \"whose size is \" << arg.size();\n  return false;\n}\n\n// Define a matcher that matches a value that evaluates in boolean\n// context to true.  Useful for types that define \"explicit operator\n// bool\" operators and so can't be compared for equality with true\n// and false.\nMATCHER(IsTrue, negation ? \"is false\" : \"is true\") {\n  return static_cast<bool>(arg);\n}\n\n// Define a matcher that matches a value that evaluates in boolean\n// context to false.  Useful for types that define \"explicit operator\n// bool\" operators and so can't be compared for equality with true\n// and false.\nMATCHER(IsFalse, negation ? \"is true\" : \"is false\") {\n  return !static_cast<bool>(arg);\n}\n\n#ifdef _MSC_VER\n# pragma warning(pop)\n#endif\n\n\n}  // namespace testing\n\n#endif  // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MORE_MATCHERS_H_\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Implements class templates NiceMock, NaggyMock, and StrictMock.\n//\n// Given a mock class MockFoo that is created using Google Mock,\n// NiceMock<MockFoo> is a subclass of MockFoo that allows\n// uninteresting calls (i.e. calls to mock methods that have no\n// EXPECT_CALL specs), NaggyMock<MockFoo> is a subclass of MockFoo\n// that prints a warning when an uninteresting call occurs, and\n// StrictMock<MockFoo> is a subclass of MockFoo that treats all\n// uninteresting calls as errors.\n//\n// Currently a mock is naggy by default, so MockFoo and\n// NaggyMock<MockFoo> behave like the same.  However, we will soon\n// switch the default behavior of mocks to be nice, as that in general\n// leads to more maintainable tests.  When that happens, MockFoo will\n// stop behaving like NaggyMock<MockFoo> and start behaving like\n// NiceMock<MockFoo>.\n//\n// NiceMock, NaggyMock, and StrictMock \"inherit\" the constructors of\n// their respective base class.  Therefore you can write\n// NiceMock<MockFoo>(5, \"a\") to construct a nice mock where MockFoo\n// has a constructor that accepts (int, const char*), for example.\n//\n// A known limitation is that NiceMock<MockFoo>, NaggyMock<MockFoo>,\n// and StrictMock<MockFoo> only works for mock methods defined using\n// the MOCK_METHOD* family of macros DIRECTLY in the MockFoo class.\n// If a mock method is defined in a base class of MockFoo, the \"nice\"\n// or \"strict\" modifier may not affect it, depending on the compiler.\n// In particular, nesting NiceMock, NaggyMock, and StrictMock is NOT\n// supported.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_NICE_STRICT_H_\n#define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_NICE_STRICT_H_\n\n#include <type_traits>\n\n\nnamespace testing {\ntemplate <class MockClass>\nclass NiceMock;\ntemplate <class MockClass>\nclass NaggyMock;\ntemplate <class MockClass>\nclass StrictMock;\n\nnamespace internal {\ntemplate <typename T>\nstd::true_type StrictnessModifierProbe(const NiceMock<T>&);\ntemplate <typename T>\nstd::true_type StrictnessModifierProbe(const NaggyMock<T>&);\ntemplate <typename T>\nstd::true_type StrictnessModifierProbe(const StrictMock<T>&);\nstd::false_type StrictnessModifierProbe(...);\n\ntemplate <typename T>\nconstexpr bool HasStrictnessModifier() {\n  return decltype(StrictnessModifierProbe(std::declval<const T&>()))::value;\n}\n\n// Base classes that register and deregister with testing::Mock to alter the\n// default behavior around uninteresting calls. Inheriting from one of these\n// classes first and then MockClass ensures the MockClass constructor is run\n// after registration, and that the MockClass destructor runs before\n// deregistration. This guarantees that MockClass's constructor and destructor\n// run with the same level of strictness as its instance methods.\n\n#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW && \\\n    (defined(_MSC_VER) || defined(__clang__))\n// We need to mark these classes with this declspec to ensure that\n// the empty base class optimization is performed.\n#define GTEST_INTERNAL_EMPTY_BASE_CLASS __declspec(empty_bases)\n#else\n#define GTEST_INTERNAL_EMPTY_BASE_CLASS\n#endif\n\ntemplate <typename Base>\nclass NiceMockImpl {\n public:\n  NiceMockImpl() { ::testing::Mock::AllowUninterestingCalls(this); }\n\n  ~NiceMockImpl() { ::testing::Mock::UnregisterCallReaction(this); }\n};\n\ntemplate <typename Base>\nclass NaggyMockImpl {\n public:\n  NaggyMockImpl() { ::testing::Mock::WarnUninterestingCalls(this); }\n\n  ~NaggyMockImpl() { ::testing::Mock::UnregisterCallReaction(this); }\n};\n\ntemplate <typename Base>\nclass StrictMockImpl {\n public:\n  StrictMockImpl() { ::testing::Mock::FailUninterestingCalls(this); }\n\n  ~StrictMockImpl() { ::testing::Mock::UnregisterCallReaction(this); }\n};\n\n}  // namespace internal\n\ntemplate <class MockClass>\nclass GTEST_INTERNAL_EMPTY_BASE_CLASS NiceMock\n    : private internal::NiceMockImpl<MockClass>,\n      public MockClass {\n public:\n  static_assert(!internal::HasStrictnessModifier<MockClass>(),\n                \"Can't apply NiceMock to a class hierarchy that already has a \"\n                \"strictness modifier. See \"\n                \"https://google.github.io/googletest/\"\n                \"gmock_cook_book.html#NiceStrictNaggy\");\n  NiceMock() : MockClass() {\n    static_assert(sizeof(*this) == sizeof(MockClass),\n                  \"The impl subclass shouldn't introduce any padding\");\n  }\n\n  // Ideally, we would inherit base class's constructors through a using\n  // declaration, which would preserve their visibility. However, many existing\n  // tests rely on the fact that current implementation reexports protected\n  // constructors as public. These tests would need to be cleaned up first.\n\n  // Single argument constructor is special-cased so that it can be\n  // made explicit.\n  template <typename A>\n  explicit NiceMock(A&& arg) : MockClass(std::forward<A>(arg)) {\n    static_assert(sizeof(*this) == sizeof(MockClass),\n                  \"The impl subclass shouldn't introduce any padding\");\n  }\n\n  template <typename TArg1, typename TArg2, typename... An>\n  NiceMock(TArg1&& arg1, TArg2&& arg2, An&&... args)\n      : MockClass(std::forward<TArg1>(arg1), std::forward<TArg2>(arg2),\n                  std::forward<An>(args)...) {\n    static_assert(sizeof(*this) == sizeof(MockClass),\n                  \"The impl subclass shouldn't introduce any padding\");\n  }\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(NiceMock);\n};\n\ntemplate <class MockClass>\nclass GTEST_INTERNAL_EMPTY_BASE_CLASS NaggyMock\n    : private internal::NaggyMockImpl<MockClass>,\n      public MockClass {\n  static_assert(!internal::HasStrictnessModifier<MockClass>(),\n                \"Can't apply NaggyMock to a class hierarchy that already has a \"\n                \"strictness modifier. See \"\n                \"https://google.github.io/googletest/\"\n                \"gmock_cook_book.html#NiceStrictNaggy\");\n\n public:\n  NaggyMock() : MockClass() {\n    static_assert(sizeof(*this) == sizeof(MockClass),\n                  \"The impl subclass shouldn't introduce any padding\");\n  }\n\n  // Ideally, we would inherit base class's constructors through a using\n  // declaration, which would preserve their visibility. However, many existing\n  // tests rely on the fact that current implementation reexports protected\n  // constructors as public. These tests would need to be cleaned up first.\n\n  // Single argument constructor is special-cased so that it can be\n  // made explicit.\n  template <typename A>\n  explicit NaggyMock(A&& arg) : MockClass(std::forward<A>(arg)) {\n    static_assert(sizeof(*this) == sizeof(MockClass),\n                  \"The impl subclass shouldn't introduce any padding\");\n  }\n\n  template <typename TArg1, typename TArg2, typename... An>\n  NaggyMock(TArg1&& arg1, TArg2&& arg2, An&&... args)\n      : MockClass(std::forward<TArg1>(arg1), std::forward<TArg2>(arg2),\n                  std::forward<An>(args)...) {\n    static_assert(sizeof(*this) == sizeof(MockClass),\n                  \"The impl subclass shouldn't introduce any padding\");\n  }\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(NaggyMock);\n};\n\ntemplate <class MockClass>\nclass GTEST_INTERNAL_EMPTY_BASE_CLASS StrictMock\n    : private internal::StrictMockImpl<MockClass>,\n      public MockClass {\n public:\n  static_assert(\n      !internal::HasStrictnessModifier<MockClass>(),\n      \"Can't apply StrictMock to a class hierarchy that already has a \"\n      \"strictness modifier. See \"\n      \"https://google.github.io/googletest/\"\n      \"gmock_cook_book.html#NiceStrictNaggy\");\n  StrictMock() : MockClass() {\n    static_assert(sizeof(*this) == sizeof(MockClass),\n                  \"The impl subclass shouldn't introduce any padding\");\n  }\n\n  // Ideally, we would inherit base class's constructors through a using\n  // declaration, which would preserve their visibility. However, many existing\n  // tests rely on the fact that current implementation reexports protected\n  // constructors as public. These tests would need to be cleaned up first.\n\n  // Single argument constructor is special-cased so that it can be\n  // made explicit.\n  template <typename A>\n  explicit StrictMock(A&& arg) : MockClass(std::forward<A>(arg)) {\n    static_assert(sizeof(*this) == sizeof(MockClass),\n                  \"The impl subclass shouldn't introduce any padding\");\n  }\n\n  template <typename TArg1, typename TArg2, typename... An>\n  StrictMock(TArg1&& arg1, TArg2&& arg2, An&&... args)\n      : MockClass(std::forward<TArg1>(arg1), std::forward<TArg2>(arg2),\n                  std::forward<An>(args)...) {\n    static_assert(sizeof(*this) == sizeof(MockClass),\n                  \"The impl subclass shouldn't introduce any padding\");\n  }\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(StrictMock);\n};\n\n#undef GTEST_INTERNAL_EMPTY_BASE_CLASS\n\n}  // namespace testing\n\n#endif  // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_NICE_STRICT_H_\n\nnamespace testing {\n\n// Declares Google Mock flags that we want a user to use programmatically.\nGMOCK_DECLARE_bool_(catch_leaked_mocks);\nGMOCK_DECLARE_string_(verbose);\nGMOCK_DECLARE_int32_(default_mock_behavior);\n\n// Initializes Google Mock.  This must be called before running the\n// tests.  In particular, it parses the command line for the flags\n// that Google Mock recognizes.  Whenever a Google Mock flag is seen,\n// it is removed from argv, and *argc is decremented.\n//\n// No value is returned.  Instead, the Google Mock flag variables are\n// updated.\n//\n// Since Google Test is needed for Google Mock to work, this function\n// also initializes Google Test and parses its flags, if that hasn't\n// been done.\nGTEST_API_ void InitGoogleMock(int* argc, char** argv);\n\n// This overloaded version can be used in Windows programs compiled in\n// UNICODE mode.\nGTEST_API_ void InitGoogleMock(int* argc, wchar_t** argv);\n\n// This overloaded version can be used on Arduino/embedded platforms where\n// there is no argc/argv.\nGTEST_API_ void InitGoogleMock();\n\n}  // namespace testing\n\n#endif  // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_H_\n"
  },
  {
    "path": "examples/libraries/fmt/test/gtest/gmock-gtest-all.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Google C++ Testing and Mocking Framework (Google Test)\n//\n// Sometimes it's desirable to build Google Test by compiling a single file.\n// This file serves this purpose.\n\n// This line ensures that gtest.h can be compiled on its own, even\n// when it's fused.\n#include \"gtest/gtest.h\"\n\n// The following lines pull in the real gtest *.cc files.\n// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Utilities for testing Google Test itself and code that uses Google Test\n// (e.g. frameworks built on top of Google Test).\n\n// GOOGLETEST_CM0004 DO NOT DELETE\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_SPI_H_\n#define GOOGLETEST_INCLUDE_GTEST_GTEST_SPI_H_\n\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\nnamespace testing {\n\n// This helper class can be used to mock out Google Test failure reporting\n// so that we can test Google Test or code that builds on Google Test.\n//\n// An object of this class appends a TestPartResult object to the\n// TestPartResultArray object given in the constructor whenever a Google Test\n// failure is reported. It can either intercept only failures that are\n// generated in the same thread that created this object or it can intercept\n// all generated failures. The scope of this mock object can be controlled with\n// the second argument to the two arguments constructor.\nclass GTEST_API_ ScopedFakeTestPartResultReporter\n    : public TestPartResultReporterInterface {\n public:\n  // The two possible mocking modes of this object.\n  enum InterceptMode {\n    INTERCEPT_ONLY_CURRENT_THREAD,  // Intercepts only thread local failures.\n    INTERCEPT_ALL_THREADS           // Intercepts all failures.\n  };\n\n  // The c'tor sets this object as the test part result reporter used\n  // by Google Test.  The 'result' parameter specifies where to report the\n  // results. This reporter will only catch failures generated in the current\n  // thread. DEPRECATED\n  explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);\n\n  // Same as above, but you can choose the interception scope of this object.\n  ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,\n                                   TestPartResultArray* result);\n\n  // The d'tor restores the previous test part result reporter.\n  ~ScopedFakeTestPartResultReporter() override;\n\n  // Appends the TestPartResult object to the TestPartResultArray\n  // received in the constructor.\n  //\n  // This method is from the TestPartResultReporterInterface\n  // interface.\n  void ReportTestPartResult(const TestPartResult& result) override;\n\n private:\n  void Init();\n\n  const InterceptMode intercept_mode_;\n  TestPartResultReporterInterface* old_reporter_;\n  TestPartResultArray* const result_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);\n};\n\nnamespace internal {\n\n// A helper class for implementing EXPECT_FATAL_FAILURE() and\n// EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given\n// TestPartResultArray contains exactly one failure that has the given\n// type and contains the given substring.  If that's not the case, a\n// non-fatal failure will be generated.\nclass GTEST_API_ SingleFailureChecker {\n public:\n  // The constructor remembers the arguments.\n  SingleFailureChecker(const TestPartResultArray* results,\n                       TestPartResult::Type type, const std::string& substr);\n  ~SingleFailureChecker();\n private:\n  const TestPartResultArray* const results_;\n  const TestPartResult::Type type_;\n  const std::string substr_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);\n};\n\n}  // namespace internal\n\n}  // namespace testing\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n// A set of macros for testing Google Test assertions or code that's expected\n// to generate Google Test fatal failures.  It verifies that the given\n// statement will cause exactly one fatal Google Test failure with 'substr'\n// being part of the failure message.\n//\n// There are two different versions of this macro. EXPECT_FATAL_FAILURE only\n// affects and considers failures generated in the current thread and\n// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.\n//\n// The verification of the assertion is done correctly even when the statement\n// throws an exception or aborts the current function.\n//\n// Known restrictions:\n//   - 'statement' cannot reference local non-static variables or\n//     non-static members of the current object.\n//   - 'statement' cannot return a value.\n//   - You cannot stream a failure message to this macro.\n//\n// Note that even though the implementations of the following two\n// macros are much alike, we cannot refactor them to use a common\n// helper macro, due to some peculiarity in how the preprocessor\n// works.  The AcceptsMacroThatExpandsToUnprotectedComma test in\n// gtest_unittest.cc will fail to compile if we do that.\n#define EXPECT_FATAL_FAILURE(statement, substr) \\\n  do { \\\n    class GTestExpectFatalFailureHelper {\\\n     public:\\\n      static void Execute() { statement; }\\\n    };\\\n    ::testing::TestPartResultArray gtest_failures;\\\n    ::testing::internal::SingleFailureChecker gtest_checker(\\\n        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\\\n    {\\\n      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\\\n          ::testing::ScopedFakeTestPartResultReporter:: \\\n          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\\\n      GTestExpectFatalFailureHelper::Execute();\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \\\n  do { \\\n    class GTestExpectFatalFailureHelper {\\\n     public:\\\n      static void Execute() { statement; }\\\n    };\\\n    ::testing::TestPartResultArray gtest_failures;\\\n    ::testing::internal::SingleFailureChecker gtest_checker(\\\n        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\\\n    {\\\n      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\\\n          ::testing::ScopedFakeTestPartResultReporter:: \\\n          INTERCEPT_ALL_THREADS, &gtest_failures);\\\n      GTestExpectFatalFailureHelper::Execute();\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n// A macro for testing Google Test assertions or code that's expected to\n// generate Google Test non-fatal failures.  It asserts that the given\n// statement will cause exactly one non-fatal Google Test failure with 'substr'\n// being part of the failure message.\n//\n// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only\n// affects and considers failures generated in the current thread and\n// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.\n//\n// 'statement' is allowed to reference local variables and members of\n// the current object.\n//\n// The verification of the assertion is done correctly even when the statement\n// throws an exception or aborts the current function.\n//\n// Known restrictions:\n//   - You cannot stream a failure message to this macro.\n//\n// Note that even though the implementations of the following two\n// macros are much alike, we cannot refactor them to use a common\n// helper macro, due to some peculiarity in how the preprocessor\n// works.  If we do that, the code won't compile when the user gives\n// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that\n// expands to code containing an unprotected comma.  The\n// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc\n// catches that.\n//\n// For the same reason, we have to write\n//   if (::testing::internal::AlwaysTrue()) { statement; }\n// instead of\n//   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)\n// to avoid an MSVC warning on unreachable code.\n#define EXPECT_NONFATAL_FAILURE(statement, substr) \\\n  do {\\\n    ::testing::TestPartResultArray gtest_failures;\\\n    ::testing::internal::SingleFailureChecker gtest_checker(\\\n        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \\\n        (substr));\\\n    {\\\n      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\\\n          ::testing::ScopedFakeTestPartResultReporter:: \\\n          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\\\n      if (::testing::internal::AlwaysTrue()) { statement; }\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \\\n  do {\\\n    ::testing::TestPartResultArray gtest_failures;\\\n    ::testing::internal::SingleFailureChecker gtest_checker(\\\n        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \\\n        (substr));\\\n    {\\\n      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\\\n          ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \\\n          &gtest_failures);\\\n      if (::testing::internal::AlwaysTrue()) { statement; }\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_SPI_H_\n\n#include <ctype.h>\n#include <stdarg.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <time.h>\n#include <wchar.h>\n#include <wctype.h>\n\n#include <algorithm>\n#include <chrono>  // NOLINT\n#include <cmath>\n#include <cstdint>\n#include <iomanip>\n#include <limits>\n#include <list>\n#include <map>\n#include <ostream>  // NOLINT\n#include <sstream>\n#include <vector>\n\n#if GTEST_OS_LINUX\n\n# include <fcntl.h>  // NOLINT\n# include <limits.h>  // NOLINT\n# include <sched.h>  // NOLINT\n// Declares vsnprintf().  This header is not available on Windows.\n# include <strings.h>  // NOLINT\n# include <sys/mman.h>  // NOLINT\n# include <sys/time.h>  // NOLINT\n# include <unistd.h>  // NOLINT\n# include <string>\n\n#elif GTEST_OS_ZOS\n# include <sys/time.h>  // NOLINT\n\n// On z/OS we additionally need strings.h for strcasecmp.\n# include <strings.h>  // NOLINT\n\n#elif GTEST_OS_WINDOWS_MOBILE  // We are on Windows CE.\n\n# include <windows.h>  // NOLINT\n# undef min\n\n#elif GTEST_OS_WINDOWS  // We are on Windows proper.\n\n# include <windows.h>  // NOLINT\n# undef min\n\n#ifdef _MSC_VER\n# include <crtdbg.h>  // NOLINT\n#endif\n\n# include <io.h>  // NOLINT\n# include <sys/timeb.h>  // NOLINT\n# include <sys/types.h>  // NOLINT\n# include <sys/stat.h>  // NOLINT\n\n# if GTEST_OS_WINDOWS_MINGW\n#  include <sys/time.h>  // NOLINT\n# endif  // GTEST_OS_WINDOWS_MINGW\n\n#else\n\n// cpplint thinks that the header is already included, so we want to\n// silence it.\n# include <sys/time.h>  // NOLINT\n# include <unistd.h>  // NOLINT\n\n#endif  // GTEST_OS_LINUX\n\n#if GTEST_HAS_EXCEPTIONS\n# include <stdexcept>\n#endif\n\n#if GTEST_CAN_STREAM_RESULTS_\n# include <arpa/inet.h>  // NOLINT\n# include <netdb.h>  // NOLINT\n# include <sys/socket.h>  // NOLINT\n# include <sys/types.h>  // NOLINT\n#endif\n\n// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Utility functions and classes used by the Google C++ testing framework.//\n// This file contains purely Google Test's internal implementation.  Please\n// DO NOT #INCLUDE IT IN A USER PROGRAM.\n\n#ifndef GOOGLETEST_SRC_GTEST_INTERNAL_INL_H_\n#define GOOGLETEST_SRC_GTEST_INTERNAL_INL_H_\n\n#ifndef _WIN32_WCE\n# include <errno.h>\n#endif  // !_WIN32_WCE\n#include <stddef.h>\n#include <stdlib.h>  // For strtoll/_strtoul64/malloc/free.\n#include <string.h>  // For memmove.\n\n#include <algorithm>\n#include <cstdint>\n#include <memory>\n#include <string>\n#include <vector>\n\n\n#if GTEST_CAN_STREAM_RESULTS_\n# include <arpa/inet.h>  // NOLINT\n# include <netdb.h>  // NOLINT\n#endif\n\n#if GTEST_OS_WINDOWS\n# include <windows.h>  // NOLINT\n#endif  // GTEST_OS_WINDOWS\n\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\nnamespace testing {\n\n// Declares the flags.\n//\n// We don't want the users to modify this flag in the code, but want\n// Google Test's own unit tests to be able to access it. Therefore we\n// declare it here as opposed to in gtest.h.\nGTEST_DECLARE_bool_(death_test_use_fork);\n\nnamespace internal {\n\n// The value of GetTestTypeId() as seen from within the Google Test\n// library.  This is solely for testing GetTestTypeId().\nGTEST_API_ extern const TypeId kTestTypeIdInGoogleTest;\n\n// Names of the flags (needed for parsing Google Test flags).\nconst char kAlsoRunDisabledTestsFlag[] = \"also_run_disabled_tests\";\nconst char kBreakOnFailureFlag[] = \"break_on_failure\";\nconst char kCatchExceptionsFlag[] = \"catch_exceptions\";\nconst char kColorFlag[] = \"color\";\nconst char kFailFast[] = \"fail_fast\";\nconst char kFilterFlag[] = \"filter\";\nconst char kListTestsFlag[] = \"list_tests\";\nconst char kOutputFlag[] = \"output\";\nconst char kBriefFlag[] = \"brief\";\nconst char kPrintTimeFlag[] = \"print_time\";\nconst char kPrintUTF8Flag[] = \"print_utf8\";\nconst char kRandomSeedFlag[] = \"random_seed\";\nconst char kRepeatFlag[] = \"repeat\";\nconst char kShuffleFlag[] = \"shuffle\";\nconst char kStackTraceDepthFlag[] = \"stack_trace_depth\";\nconst char kStreamResultToFlag[] = \"stream_result_to\";\nconst char kThrowOnFailureFlag[] = \"throw_on_failure\";\nconst char kFlagfileFlag[] = \"flagfile\";\n\n// A valid random seed must be in [1, kMaxRandomSeed].\nconst int kMaxRandomSeed = 99999;\n\n// g_help_flag is true if and only if the --help flag or an equivalent form\n// is specified on the command line.\nGTEST_API_ extern bool g_help_flag;\n\n// Returns the current time in milliseconds.\nGTEST_API_ TimeInMillis GetTimeInMillis();\n\n// Returns true if and only if Google Test should use colors in the output.\nGTEST_API_ bool ShouldUseColor(bool stdout_is_tty);\n\n// Formats the given time in milliseconds as seconds.\nGTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);\n\n// Converts the given time in milliseconds to a date string in the ISO 8601\n// format, without the timezone information.  N.B.: due to the use the\n// non-reentrant localtime() function, this function is not thread safe.  Do\n// not use it in any code that can be called from multiple threads.\nGTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms);\n\n// Parses a string for an Int32 flag, in the form of \"--flag=value\".\n//\n// On success, stores the value of the flag in *value, and returns\n// true.  On failure, returns false without changing *value.\nGTEST_API_ bool ParseInt32Flag(\n    const char* str, const char* flag, int32_t* value);\n\n// Returns a random seed in range [1, kMaxRandomSeed] based on the\n// given --gtest_random_seed flag value.\ninline int GetRandomSeedFromFlag(int32_t random_seed_flag) {\n  const unsigned int raw_seed = (random_seed_flag == 0) ?\n      static_cast<unsigned int>(GetTimeInMillis()) :\n      static_cast<unsigned int>(random_seed_flag);\n\n  // Normalizes the actual seed to range [1, kMaxRandomSeed] such that\n  // it's easy to type.\n  const int normalized_seed =\n      static_cast<int>((raw_seed - 1U) %\n                       static_cast<unsigned int>(kMaxRandomSeed)) + 1;\n  return normalized_seed;\n}\n\n// Returns the first valid random seed after 'seed'.  The behavior is\n// undefined if 'seed' is invalid.  The seed after kMaxRandomSeed is\n// considered to be 1.\ninline int GetNextRandomSeed(int seed) {\n  GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)\n      << \"Invalid random seed \" << seed << \" - must be in [1, \"\n      << kMaxRandomSeed << \"].\";\n  const int next_seed = seed + 1;\n  return (next_seed > kMaxRandomSeed) ? 1 : next_seed;\n}\n\n// This class saves the values of all Google Test flags in its c'tor, and\n// restores them in its d'tor.\nclass GTestFlagSaver {\n public:\n  // The c'tor.\n  GTestFlagSaver() {\n    also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);\n    break_on_failure_ = GTEST_FLAG(break_on_failure);\n    catch_exceptions_ = GTEST_FLAG(catch_exceptions);\n    color_ = GTEST_FLAG(color);\n    death_test_style_ = GTEST_FLAG(death_test_style);\n    death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);\n    fail_fast_ = GTEST_FLAG(fail_fast);\n    filter_ = GTEST_FLAG(filter);\n    internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);\n    list_tests_ = GTEST_FLAG(list_tests);\n    output_ = GTEST_FLAG(output);\n    brief_ = GTEST_FLAG(brief);\n    print_time_ = GTEST_FLAG(print_time);\n    print_utf8_ = GTEST_FLAG(print_utf8);\n    random_seed_ = GTEST_FLAG(random_seed);\n    repeat_ = GTEST_FLAG(repeat);\n    shuffle_ = GTEST_FLAG(shuffle);\n    stack_trace_depth_ = GTEST_FLAG(stack_trace_depth);\n    stream_result_to_ = GTEST_FLAG(stream_result_to);\n    throw_on_failure_ = GTEST_FLAG(throw_on_failure);\n  }\n\n  // The d'tor is not virtual.  DO NOT INHERIT FROM THIS CLASS.\n  ~GTestFlagSaver() {\n    GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;\n    GTEST_FLAG(break_on_failure) = break_on_failure_;\n    GTEST_FLAG(catch_exceptions) = catch_exceptions_;\n    GTEST_FLAG(color) = color_;\n    GTEST_FLAG(death_test_style) = death_test_style_;\n    GTEST_FLAG(death_test_use_fork) = death_test_use_fork_;\n    GTEST_FLAG(filter) = filter_;\n    GTEST_FLAG(fail_fast) = fail_fast_;\n    GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;\n    GTEST_FLAG(list_tests) = list_tests_;\n    GTEST_FLAG(output) = output_;\n    GTEST_FLAG(brief) = brief_;\n    GTEST_FLAG(print_time) = print_time_;\n    GTEST_FLAG(print_utf8) = print_utf8_;\n    GTEST_FLAG(random_seed) = random_seed_;\n    GTEST_FLAG(repeat) = repeat_;\n    GTEST_FLAG(shuffle) = shuffle_;\n    GTEST_FLAG(stack_trace_depth) = stack_trace_depth_;\n    GTEST_FLAG(stream_result_to) = stream_result_to_;\n    GTEST_FLAG(throw_on_failure) = throw_on_failure_;\n  }\n\n private:\n  // Fields for saving the original values of flags.\n  bool also_run_disabled_tests_;\n  bool break_on_failure_;\n  bool catch_exceptions_;\n  std::string color_;\n  std::string death_test_style_;\n  bool death_test_use_fork_;\n  bool fail_fast_;\n  std::string filter_;\n  std::string internal_run_death_test_;\n  bool list_tests_;\n  std::string output_;\n  bool brief_;\n  bool print_time_;\n  bool print_utf8_;\n  int32_t random_seed_;\n  int32_t repeat_;\n  bool shuffle_;\n  int32_t stack_trace_depth_;\n  std::string stream_result_to_;\n  bool throw_on_failure_;\n} GTEST_ATTRIBUTE_UNUSED_;\n\n// Converts a Unicode code point to a narrow string in UTF-8 encoding.\n// code_point parameter is of type UInt32 because wchar_t may not be\n// wide enough to contain a code point.\n// If the code_point is not a valid Unicode code point\n// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted\n// to \"(Invalid Unicode 0xXXXXXXXX)\".\nGTEST_API_ std::string CodePointToUtf8(uint32_t code_point);\n\n// Converts a wide string to a narrow string in UTF-8 encoding.\n// The wide string is assumed to have the following encoding:\n//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin)\n//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)\n// Parameter str points to a null-terminated wide string.\n// Parameter num_chars may additionally limit the number\n// of wchar_t characters processed. -1 is used when the entire string\n// should be processed.\n// If the string contains code points that are not valid Unicode code points\n// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output\n// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding\n// and contains invalid UTF-16 surrogate pairs, values in those pairs\n// will be encoded as individual Unicode characters from Basic Normal Plane.\nGTEST_API_ std::string WideStringToUtf8(const wchar_t* str, int num_chars);\n\n// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file\n// if the variable is present. If a file already exists at this location, this\n// function will write over it. If the variable is present, but the file cannot\n// be created, prints an error and exits.\nvoid WriteToShardStatusFileIfNeeded();\n\n// Checks whether sharding is enabled by examining the relevant\n// environment variable values. If the variables are present,\n// but inconsistent (e.g., shard_index >= total_shards), prints\n// an error and exits. If in_subprocess_for_death_test, sharding is\n// disabled because it must only be applied to the original test\n// process. Otherwise, we could filter out death tests we intended to execute.\nGTEST_API_ bool ShouldShard(const char* total_shards_str,\n                            const char* shard_index_str,\n                            bool in_subprocess_for_death_test);\n\n// Parses the environment variable var as a 32-bit integer. If it is unset,\n// returns default_val. If it is not a 32-bit integer, prints an error and\n// and aborts.\nGTEST_API_ int32_t Int32FromEnvOrDie(const char* env_var, int32_t default_val);\n\n// Given the total number of shards, the shard index, and the test id,\n// returns true if and only if the test should be run on this shard. The test id\n// is some arbitrary but unique non-negative integer assigned to each test\n// method. Assumes that 0 <= shard_index < total_shards.\nGTEST_API_ bool ShouldRunTestOnShard(\n    int total_shards, int shard_index, int test_id);\n\n// STL container utilities.\n\n// Returns the number of elements in the given container that satisfy\n// the given predicate.\ntemplate <class Container, typename Predicate>\ninline int CountIf(const Container& c, Predicate predicate) {\n  // Implemented as an explicit loop since std::count_if() in libCstd on\n  // Solaris has a non-standard signature.\n  int count = 0;\n  for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) {\n    if (predicate(*it))\n      ++count;\n  }\n  return count;\n}\n\n// Applies a function/functor to each element in the container.\ntemplate <class Container, typename Functor>\nvoid ForEach(const Container& c, Functor functor) {\n  std::for_each(c.begin(), c.end(), functor);\n}\n\n// Returns the i-th element of the vector, or default_value if i is not\n// in range [0, v.size()).\ntemplate <typename E>\ninline E GetElementOr(const std::vector<E>& v, int i, E default_value) {\n  return (i < 0 || i >= static_cast<int>(v.size())) ? default_value\n                                                    : v[static_cast<size_t>(i)];\n}\n\n// Performs an in-place shuffle of a range of the vector's elements.\n// 'begin' and 'end' are element indices as an STL-style range;\n// i.e. [begin, end) are shuffled, where 'end' == size() means to\n// shuffle to the end of the vector.\ntemplate <typename E>\nvoid ShuffleRange(internal::Random* random, int begin, int end,\n                  std::vector<E>* v) {\n  const int size = static_cast<int>(v->size());\n  GTEST_CHECK_(0 <= begin && begin <= size)\n      << \"Invalid shuffle range start \" << begin << \": must be in range [0, \"\n      << size << \"].\";\n  GTEST_CHECK_(begin <= end && end <= size)\n      << \"Invalid shuffle range finish \" << end << \": must be in range [\"\n      << begin << \", \" << size << \"].\";\n\n  // Fisher-Yates shuffle, from\n  // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle\n  for (int range_width = end - begin; range_width >= 2; range_width--) {\n    const int last_in_range = begin + range_width - 1;\n    const int selected =\n        begin +\n        static_cast<int>(random->Generate(static_cast<uint32_t>(range_width)));\n    std::swap((*v)[static_cast<size_t>(selected)],\n              (*v)[static_cast<size_t>(last_in_range)]);\n  }\n}\n\n// Performs an in-place shuffle of the vector's elements.\ntemplate <typename E>\ninline void Shuffle(internal::Random* random, std::vector<E>* v) {\n  ShuffleRange(random, 0, static_cast<int>(v->size()), v);\n}\n\n// A function for deleting an object.  Handy for being used as a\n// functor.\ntemplate <typename T>\nstatic void Delete(T* x) {\n  delete x;\n}\n\n// A predicate that checks the key of a TestProperty against a known key.\n//\n// TestPropertyKeyIs is copyable.\nclass TestPropertyKeyIs {\n public:\n  // Constructor.\n  //\n  // TestPropertyKeyIs has NO default constructor.\n  explicit TestPropertyKeyIs(const std::string& key) : key_(key) {}\n\n  // Returns true if and only if the test name of test property matches on key_.\n  bool operator()(const TestProperty& test_property) const {\n    return test_property.key() == key_;\n  }\n\n private:\n  std::string key_;\n};\n\n// Class UnitTestOptions.\n//\n// This class contains functions for processing options the user\n// specifies when running the tests.  It has only static members.\n//\n// In most cases, the user can specify an option using either an\n// environment variable or a command line flag.  E.g. you can set the\n// test filter using either GTEST_FILTER or --gtest_filter.  If both\n// the variable and the flag are present, the latter overrides the\n// former.\nclass GTEST_API_ UnitTestOptions {\n public:\n  // Functions for processing the gtest_output flag.\n\n  // Returns the output format, or \"\" for normal printed output.\n  static std::string GetOutputFormat();\n\n  // Returns the absolute path of the requested output file, or the\n  // default (test_detail.xml in the original working directory) if\n  // none was explicitly specified.\n  static std::string GetAbsolutePathToOutputFile();\n\n  // Functions for processing the gtest_filter flag.\n\n  // Returns true if and only if the user-specified filter matches the test\n  // suite name and the test name.\n  static bool FilterMatchesTest(const std::string& test_suite_name,\n                                const std::string& test_name);\n\n#if GTEST_OS_WINDOWS\n  // Function for supporting the gtest_catch_exception flag.\n\n  // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the\n  // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.\n  // This function is useful as an __except condition.\n  static int GTestShouldProcessSEH(DWORD exception_code);\n#endif  // GTEST_OS_WINDOWS\n\n  // Returns true if \"name\" matches the ':' separated list of glob-style\n  // filters in \"filter\".\n  static bool MatchesFilter(const std::string& name, const char* filter);\n};\n\n// Returns the current application's name, removing directory path if that\n// is present.  Used by UnitTestOptions::GetOutputFile.\nGTEST_API_ FilePath GetCurrentExecutableName();\n\n// The role interface for getting the OS stack trace as a string.\nclass OsStackTraceGetterInterface {\n public:\n  OsStackTraceGetterInterface() {}\n  virtual ~OsStackTraceGetterInterface() {}\n\n  // Returns the current OS stack trace as an std::string.  Parameters:\n  //\n  //   max_depth  - the maximum number of stack frames to be included\n  //                in the trace.\n  //   skip_count - the number of top frames to be skipped; doesn't count\n  //                against max_depth.\n  virtual std::string CurrentStackTrace(int max_depth, int skip_count) = 0;\n\n  // UponLeavingGTest() should be called immediately before Google Test calls\n  // user code. It saves some information about the current stack that\n  // CurrentStackTrace() will use to find and hide Google Test stack frames.\n  virtual void UponLeavingGTest() = 0;\n\n  // This string is inserted in place of stack frames that are part of\n  // Google Test's implementation.\n  static const char* const kElidedFramesMarker;\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);\n};\n\n// A working implementation of the OsStackTraceGetterInterface interface.\nclass OsStackTraceGetter : public OsStackTraceGetterInterface {\n public:\n  OsStackTraceGetter() {}\n\n  std::string CurrentStackTrace(int max_depth, int skip_count) override;\n  void UponLeavingGTest() override;\n\n private:\n#if GTEST_HAS_ABSL\n  Mutex mutex_;  // Protects all internal state.\n\n  // We save the stack frame below the frame that calls user code.\n  // We do this because the address of the frame immediately below\n  // the user code changes between the call to UponLeavingGTest()\n  // and any calls to the stack trace code from within the user code.\n  void* caller_frame_ = nullptr;\n#endif  // GTEST_HAS_ABSL\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);\n};\n\n// Information about a Google Test trace point.\nstruct TraceInfo {\n  const char* file;\n  int line;\n  std::string message;\n};\n\n// This is the default global test part result reporter used in UnitTestImpl.\n// This class should only be used by UnitTestImpl.\nclass DefaultGlobalTestPartResultReporter\n  : public TestPartResultReporterInterface {\n public:\n  explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);\n  // Implements the TestPartResultReporterInterface. Reports the test part\n  // result in the current test.\n  void ReportTestPartResult(const TestPartResult& result) override;\n\n private:\n  UnitTestImpl* const unit_test_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);\n};\n\n// This is the default per thread test part result reporter used in\n// UnitTestImpl. This class should only be used by UnitTestImpl.\nclass DefaultPerThreadTestPartResultReporter\n    : public TestPartResultReporterInterface {\n public:\n  explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);\n  // Implements the TestPartResultReporterInterface. The implementation just\n  // delegates to the current global test part result reporter of *unit_test_.\n  void ReportTestPartResult(const TestPartResult& result) override;\n\n private:\n  UnitTestImpl* const unit_test_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);\n};\n\n// The private implementation of the UnitTest class.  We don't protect\n// the methods under a mutex, as this class is not accessible by a\n// user and the UnitTest class that delegates work to this class does\n// proper locking.\nclass GTEST_API_ UnitTestImpl {\n public:\n  explicit UnitTestImpl(UnitTest* parent);\n  virtual ~UnitTestImpl();\n\n  // There are two different ways to register your own TestPartResultReporter.\n  // You can register your own repoter to listen either only for test results\n  // from the current thread or for results from all threads.\n  // By default, each per-thread test result repoter just passes a new\n  // TestPartResult to the global test result reporter, which registers the\n  // test part result for the currently running test.\n\n  // Returns the global test part result reporter.\n  TestPartResultReporterInterface* GetGlobalTestPartResultReporter();\n\n  // Sets the global test part result reporter.\n  void SetGlobalTestPartResultReporter(\n      TestPartResultReporterInterface* reporter);\n\n  // Returns the test part result reporter for the current thread.\n  TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();\n\n  // Sets the test part result reporter for the current thread.\n  void SetTestPartResultReporterForCurrentThread(\n      TestPartResultReporterInterface* reporter);\n\n  // Gets the number of successful test suites.\n  int successful_test_suite_count() const;\n\n  // Gets the number of failed test suites.\n  int failed_test_suite_count() const;\n\n  // Gets the number of all test suites.\n  int total_test_suite_count() const;\n\n  // Gets the number of all test suites that contain at least one test\n  // that should run.\n  int test_suite_to_run_count() const;\n\n  // Gets the number of successful tests.\n  int successful_test_count() const;\n\n  // Gets the number of skipped tests.\n  int skipped_test_count() const;\n\n  // Gets the number of failed tests.\n  int failed_test_count() const;\n\n  // Gets the number of disabled tests that will be reported in the XML report.\n  int reportable_disabled_test_count() const;\n\n  // Gets the number of disabled tests.\n  int disabled_test_count() const;\n\n  // Gets the number of tests to be printed in the XML report.\n  int reportable_test_count() const;\n\n  // Gets the number of all tests.\n  int total_test_count() const;\n\n  // Gets the number of tests that should run.\n  int test_to_run_count() const;\n\n  // Gets the time of the test program start, in ms from the start of the\n  // UNIX epoch.\n  TimeInMillis start_timestamp() const { return start_timestamp_; }\n\n  // Gets the elapsed time, in milliseconds.\n  TimeInMillis elapsed_time() const { return elapsed_time_; }\n\n  // Returns true if and only if the unit test passed (i.e. all test suites\n  // passed).\n  bool Passed() const { return !Failed(); }\n\n  // Returns true if and only if the unit test failed (i.e. some test suite\n  // failed or something outside of all tests failed).\n  bool Failed() const {\n    return failed_test_suite_count() > 0 || ad_hoc_test_result()->Failed();\n  }\n\n  // Gets the i-th test suite among all the test suites. i can range from 0 to\n  // total_test_suite_count() - 1. If i is not in that range, returns NULL.\n  const TestSuite* GetTestSuite(int i) const {\n    const int index = GetElementOr(test_suite_indices_, i, -1);\n    return index < 0 ? nullptr : test_suites_[static_cast<size_t>(i)];\n  }\n\n  //  Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  const TestCase* GetTestCase(int i) const { return GetTestSuite(i); }\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n  // Gets the i-th test suite among all the test suites. i can range from 0 to\n  // total_test_suite_count() - 1. If i is not in that range, returns NULL.\n  TestSuite* GetMutableSuiteCase(int i) {\n    const int index = GetElementOr(test_suite_indices_, i, -1);\n    return index < 0 ? nullptr : test_suites_[static_cast<size_t>(index)];\n  }\n\n  // Provides access to the event listener list.\n  TestEventListeners* listeners() { return &listeners_; }\n\n  // Returns the TestResult for the test that's currently running, or\n  // the TestResult for the ad hoc test if no test is running.\n  TestResult* current_test_result();\n\n  // Returns the TestResult for the ad hoc test.\n  const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; }\n\n  // Sets the OS stack trace getter.\n  //\n  // Does nothing if the input and the current OS stack trace getter\n  // are the same; otherwise, deletes the old getter and makes the\n  // input the current getter.\n  void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);\n\n  // Returns the current OS stack trace getter if it is not NULL;\n  // otherwise, creates an OsStackTraceGetter, makes it the current\n  // getter, and returns it.\n  OsStackTraceGetterInterface* os_stack_trace_getter();\n\n  // Returns the current OS stack trace as an std::string.\n  //\n  // The maximum number of stack frames to be included is specified by\n  // the gtest_stack_trace_depth flag.  The skip_count parameter\n  // specifies the number of top frames to be skipped, which doesn't\n  // count against the number of frames to be included.\n  //\n  // For example, if Foo() calls Bar(), which in turn calls\n  // CurrentOsStackTraceExceptTop(1), Foo() will be included in the\n  // trace but Bar() and CurrentOsStackTraceExceptTop() won't.\n  std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_;\n\n  // Finds and returns a TestSuite with the given name.  If one doesn't\n  // exist, creates one and returns it.\n  //\n  // Arguments:\n  //\n  //   test_suite_name: name of the test suite\n  //   type_param:      the name of the test's type parameter, or NULL if\n  //                    this is not a typed or a type-parameterized test.\n  //   set_up_tc:       pointer to the function that sets up the test suite\n  //   tear_down_tc:    pointer to the function that tears down the test suite\n  TestSuite* GetTestSuite(const char* test_suite_name, const char* type_param,\n                          internal::SetUpTestSuiteFunc set_up_tc,\n                          internal::TearDownTestSuiteFunc tear_down_tc);\n\n//  Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  TestCase* GetTestCase(const char* test_case_name, const char* type_param,\n                        internal::SetUpTestSuiteFunc set_up_tc,\n                        internal::TearDownTestSuiteFunc tear_down_tc) {\n    return GetTestSuite(test_case_name, type_param, set_up_tc, tear_down_tc);\n  }\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n  // Adds a TestInfo to the unit test.\n  //\n  // Arguments:\n  //\n  //   set_up_tc:    pointer to the function that sets up the test suite\n  //   tear_down_tc: pointer to the function that tears down the test suite\n  //   test_info:    the TestInfo object\n  void AddTestInfo(internal::SetUpTestSuiteFunc set_up_tc,\n                   internal::TearDownTestSuiteFunc tear_down_tc,\n                   TestInfo* test_info) {\n#if GTEST_HAS_DEATH_TEST\n    // In order to support thread-safe death tests, we need to\n    // remember the original working directory when the test program\n    // was first invoked.  We cannot do this in RUN_ALL_TESTS(), as\n    // the user may have changed the current directory before calling\n    // RUN_ALL_TESTS().  Therefore we capture the current directory in\n    // AddTestInfo(), which is called to register a TEST or TEST_F\n    // before main() is reached.\n    if (original_working_dir_.IsEmpty()) {\n      original_working_dir_.Set(FilePath::GetCurrentDir());\n      GTEST_CHECK_(!original_working_dir_.IsEmpty())\n          << \"Failed to get the current working directory.\";\n    }\n#endif  // GTEST_HAS_DEATH_TEST\n\n    GetTestSuite(test_info->test_suite_name(), test_info->type_param(),\n                 set_up_tc, tear_down_tc)\n        ->AddTestInfo(test_info);\n  }\n\n  // Returns ParameterizedTestSuiteRegistry object used to keep track of\n  // value-parameterized tests and instantiate and register them.\n  internal::ParameterizedTestSuiteRegistry& parameterized_test_registry() {\n    return parameterized_test_registry_;\n  }\n\n  std::set<std::string>* ignored_parameterized_test_suites() {\n    return &ignored_parameterized_test_suites_;\n  }\n\n  // Returns TypeParameterizedTestSuiteRegistry object used to keep track of\n  // type-parameterized tests and instantiations of them.\n  internal::TypeParameterizedTestSuiteRegistry&\n  type_parameterized_test_registry() {\n    return type_parameterized_test_registry_;\n  }\n\n  // Sets the TestSuite object for the test that's currently running.\n  void set_current_test_suite(TestSuite* a_current_test_suite) {\n    current_test_suite_ = a_current_test_suite;\n  }\n\n  // Sets the TestInfo object for the test that's currently running.  If\n  // current_test_info is NULL, the assertion results will be stored in\n  // ad_hoc_test_result_.\n  void set_current_test_info(TestInfo* a_current_test_info) {\n    current_test_info_ = a_current_test_info;\n  }\n\n  // Registers all parameterized tests defined using TEST_P and\n  // INSTANTIATE_TEST_SUITE_P, creating regular tests for each test/parameter\n  // combination. This method can be called more then once; it has guards\n  // protecting from registering the tests more then once.  If\n  // value-parameterized tests are disabled, RegisterParameterizedTests is\n  // present but does nothing.\n  void RegisterParameterizedTests();\n\n  // Runs all tests in this UnitTest object, prints the result, and\n  // returns true if all tests are successful.  If any exception is\n  // thrown during a test, this test is considered to be failed, but\n  // the rest of the tests will still be run.\n  bool RunAllTests();\n\n  // Clears the results of all tests, except the ad hoc tests.\n  void ClearNonAdHocTestResult() {\n    ForEach(test_suites_, TestSuite::ClearTestSuiteResult);\n  }\n\n  // Clears the results of ad-hoc test assertions.\n  void ClearAdHocTestResult() {\n    ad_hoc_test_result_.Clear();\n  }\n\n  // Adds a TestProperty to the current TestResult object when invoked in a\n  // context of a test or a test suite, or to the global property set. If the\n  // result already contains a property with the same key, the value will be\n  // updated.\n  void RecordProperty(const TestProperty& test_property);\n\n  enum ReactionToSharding {\n    HONOR_SHARDING_PROTOCOL,\n    IGNORE_SHARDING_PROTOCOL\n  };\n\n  // Matches the full name of each test against the user-specified\n  // filter to decide whether the test should run, then records the\n  // result in each TestSuite and TestInfo object.\n  // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests\n  // based on sharding variables in the environment.\n  // Returns the number of tests that should run.\n  int FilterTests(ReactionToSharding shard_tests);\n\n  // Prints the names of the tests matching the user-specified filter flag.\n  void ListTestsMatchingFilter();\n\n  const TestSuite* current_test_suite() const { return current_test_suite_; }\n  TestInfo* current_test_info() { return current_test_info_; }\n  const TestInfo* current_test_info() const { return current_test_info_; }\n\n  // Returns the vector of environments that need to be set-up/torn-down\n  // before/after the tests are run.\n  std::vector<Environment*>& environments() { return environments_; }\n\n  // Getters for the per-thread Google Test trace stack.\n  std::vector<TraceInfo>& gtest_trace_stack() {\n    return *(gtest_trace_stack_.pointer());\n  }\n  const std::vector<TraceInfo>& gtest_trace_stack() const {\n    return gtest_trace_stack_.get();\n  }\n\n#if GTEST_HAS_DEATH_TEST\n  void InitDeathTestSubprocessControlInfo() {\n    internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());\n  }\n  // Returns a pointer to the parsed --gtest_internal_run_death_test\n  // flag, or NULL if that flag was not specified.\n  // This information is useful only in a death test child process.\n  // Must not be called before a call to InitGoogleTest.\n  const InternalRunDeathTestFlag* internal_run_death_test_flag() const {\n    return internal_run_death_test_flag_.get();\n  }\n\n  // Returns a pointer to the current death test factory.\n  internal::DeathTestFactory* death_test_factory() {\n    return death_test_factory_.get();\n  }\n\n  void SuppressTestEventsIfInSubprocess();\n\n  friend class ReplaceDeathTestFactory;\n#endif  // GTEST_HAS_DEATH_TEST\n\n  // Initializes the event listener performing XML output as specified by\n  // UnitTestOptions. Must not be called before InitGoogleTest.\n  void ConfigureXmlOutput();\n\n#if GTEST_CAN_STREAM_RESULTS_\n  // Initializes the event listener for streaming test results to a socket.\n  // Must not be called before InitGoogleTest.\n  void ConfigureStreamingOutput();\n#endif\n\n  // Performs initialization dependent upon flag values obtained in\n  // ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to\n  // ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest\n  // this function is also called from RunAllTests.  Since this function can be\n  // called more than once, it has to be idempotent.\n  void PostFlagParsingInit();\n\n  // Gets the random seed used at the start of the current test iteration.\n  int random_seed() const { return random_seed_; }\n\n  // Gets the random number generator.\n  internal::Random* random() { return &random_; }\n\n  // Shuffles all test suites, and the tests within each test suite,\n  // making sure that death tests are still run first.\n  void ShuffleTests();\n\n  // Restores the test suites and tests to their order before the first shuffle.\n  void UnshuffleTests();\n\n  // Returns the value of GTEST_FLAG(catch_exceptions) at the moment\n  // UnitTest::Run() starts.\n  bool catch_exceptions() const { return catch_exceptions_; }\n\n private:\n  friend class ::testing::UnitTest;\n\n  // Used by UnitTest::Run() to capture the state of\n  // GTEST_FLAG(catch_exceptions) at the moment it starts.\n  void set_catch_exceptions(bool value) { catch_exceptions_ = value; }\n\n  // The UnitTest object that owns this implementation object.\n  UnitTest* const parent_;\n\n  // The working directory when the first TEST() or TEST_F() was\n  // executed.\n  internal::FilePath original_working_dir_;\n\n  // The default test part result reporters.\n  DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;\n  DefaultPerThreadTestPartResultReporter\n      default_per_thread_test_part_result_reporter_;\n\n  // Points to (but doesn't own) the global test part result reporter.\n  TestPartResultReporterInterface* global_test_part_result_repoter_;\n\n  // Protects read and write access to global_test_part_result_reporter_.\n  internal::Mutex global_test_part_result_reporter_mutex_;\n\n  // Points to (but doesn't own) the per-thread test part result reporter.\n  internal::ThreadLocal<TestPartResultReporterInterface*>\n      per_thread_test_part_result_reporter_;\n\n  // The vector of environments that need to be set-up/torn-down\n  // before/after the tests are run.\n  std::vector<Environment*> environments_;\n\n  // The vector of TestSuites in their original order.  It owns the\n  // elements in the vector.\n  std::vector<TestSuite*> test_suites_;\n\n  // Provides a level of indirection for the test suite list to allow\n  // easy shuffling and restoring the test suite order.  The i-th\n  // element of this vector is the index of the i-th test suite in the\n  // shuffled order.\n  std::vector<int> test_suite_indices_;\n\n  // ParameterizedTestRegistry object used to register value-parameterized\n  // tests.\n  internal::ParameterizedTestSuiteRegistry parameterized_test_registry_;\n  internal::TypeParameterizedTestSuiteRegistry\n      type_parameterized_test_registry_;\n\n  // The set holding the name of parameterized\n  // test suites that may go uninstantiated.\n  std::set<std::string> ignored_parameterized_test_suites_;\n\n  // Indicates whether RegisterParameterizedTests() has been called already.\n  bool parameterized_tests_registered_;\n\n  // Index of the last death test suite registered.  Initially -1.\n  int last_death_test_suite_;\n\n  // This points to the TestSuite for the currently running test.  It\n  // changes as Google Test goes through one test suite after another.\n  // When no test is running, this is set to NULL and Google Test\n  // stores assertion results in ad_hoc_test_result_.  Initially NULL.\n  TestSuite* current_test_suite_;\n\n  // This points to the TestInfo for the currently running test.  It\n  // changes as Google Test goes through one test after another.  When\n  // no test is running, this is set to NULL and Google Test stores\n  // assertion results in ad_hoc_test_result_.  Initially NULL.\n  TestInfo* current_test_info_;\n\n  // Normally, a user only writes assertions inside a TEST or TEST_F,\n  // or inside a function called by a TEST or TEST_F.  Since Google\n  // Test keeps track of which test is current running, it can\n  // associate such an assertion with the test it belongs to.\n  //\n  // If an assertion is encountered when no TEST or TEST_F is running,\n  // Google Test attributes the assertion result to an imaginary \"ad hoc\"\n  // test, and records the result in ad_hoc_test_result_.\n  TestResult ad_hoc_test_result_;\n\n  // The list of event listeners that can be used to track events inside\n  // Google Test.\n  TestEventListeners listeners_;\n\n  // The OS stack trace getter.  Will be deleted when the UnitTest\n  // object is destructed.  By default, an OsStackTraceGetter is used,\n  // but the user can set this field to use a custom getter if that is\n  // desired.\n  OsStackTraceGetterInterface* os_stack_trace_getter_;\n\n  // True if and only if PostFlagParsingInit() has been called.\n  bool post_flag_parse_init_performed_;\n\n  // The random number seed used at the beginning of the test run.\n  int random_seed_;\n\n  // Our random number generator.\n  internal::Random random_;\n\n  // The time of the test program start, in ms from the start of the\n  // UNIX epoch.\n  TimeInMillis start_timestamp_;\n\n  // How long the test took to run, in milliseconds.\n  TimeInMillis elapsed_time_;\n\n#if GTEST_HAS_DEATH_TEST\n  // The decomposed components of the gtest_internal_run_death_test flag,\n  // parsed when RUN_ALL_TESTS is called.\n  std::unique_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;\n  std::unique_ptr<internal::DeathTestFactory> death_test_factory_;\n#endif  // GTEST_HAS_DEATH_TEST\n\n  // A per-thread stack of traces created by the SCOPED_TRACE() macro.\n  internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;\n\n  // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests()\n  // starts.\n  bool catch_exceptions_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl);\n};  // class UnitTestImpl\n\n// Convenience function for accessing the global UnitTest\n// implementation object.\ninline UnitTestImpl* GetUnitTestImpl() {\n  return UnitTest::GetInstance()->impl();\n}\n\n#if GTEST_USES_SIMPLE_RE\n\n// Internal helper functions for implementing the simple regular\n// expression matcher.\nGTEST_API_ bool IsInSet(char ch, const char* str);\nGTEST_API_ bool IsAsciiDigit(char ch);\nGTEST_API_ bool IsAsciiPunct(char ch);\nGTEST_API_ bool IsRepeat(char ch);\nGTEST_API_ bool IsAsciiWhiteSpace(char ch);\nGTEST_API_ bool IsAsciiWordChar(char ch);\nGTEST_API_ bool IsValidEscape(char ch);\nGTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch);\nGTEST_API_ bool ValidateRegex(const char* regex);\nGTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str);\nGTEST_API_ bool MatchRepetitionAndRegexAtHead(\n    bool escaped, char ch, char repeat, const char* regex, const char* str);\nGTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);\n\n#endif  // GTEST_USES_SIMPLE_RE\n\n// Parses the command line for Google Test flags, without initializing\n// other parts of Google Test.\nGTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);\nGTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);\n\n#if GTEST_HAS_DEATH_TEST\n\n// Returns the message describing the last system error, regardless of the\n// platform.\nGTEST_API_ std::string GetLastErrnoDescription();\n\n// Attempts to parse a string into a positive integer pointed to by the\n// number parameter.  Returns true if that is possible.\n// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use\n// it here.\ntemplate <typename Integer>\nbool ParseNaturalNumber(const ::std::string& str, Integer* number) {\n  // Fail fast if the given string does not begin with a digit;\n  // this bypasses strtoXXX's \"optional leading whitespace and plus\n  // or minus sign\" semantics, which are undesirable here.\n  if (str.empty() || !IsDigit(str[0])) {\n    return false;\n  }\n  errno = 0;\n\n  char* end;\n  // BiggestConvertible is the largest integer type that system-provided\n  // string-to-number conversion routines can return.\n  using BiggestConvertible = unsigned long long;  // NOLINT\n\n  const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);  // NOLINT\n  const bool parse_success = *end == '\\0' && errno == 0;\n\n  GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));\n\n  const Integer result = static_cast<Integer>(parsed);\n  if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {\n    *number = result;\n    return true;\n  }\n  return false;\n}\n#endif  // GTEST_HAS_DEATH_TEST\n\n// TestResult contains some private methods that should be hidden from\n// Google Test user but are required for testing. This class allow our tests\n// to access them.\n//\n// This class is supplied only for the purpose of testing Google Test's own\n// constructs. Do not use it in user tests, either directly or indirectly.\nclass TestResultAccessor {\n public:\n  static void RecordProperty(TestResult* test_result,\n                             const std::string& xml_element,\n                             const TestProperty& property) {\n    test_result->RecordProperty(xml_element, property);\n  }\n\n  static void ClearTestPartResults(TestResult* test_result) {\n    test_result->ClearTestPartResults();\n  }\n\n  static const std::vector<testing::TestPartResult>& test_part_results(\n      const TestResult& test_result) {\n    return test_result.test_part_results();\n  }\n};\n\n#if GTEST_CAN_STREAM_RESULTS_\n\n// Streams test results to the given port on the given host machine.\nclass StreamingListener : public EmptyTestEventListener {\n public:\n  // Abstract base class for writing strings to a socket.\n  class AbstractSocketWriter {\n   public:\n    virtual ~AbstractSocketWriter() {}\n\n    // Sends a string to the socket.\n    virtual void Send(const std::string& message) = 0;\n\n    // Closes the socket.\n    virtual void CloseConnection() {}\n\n    // Sends a string and a newline to the socket.\n    void SendLn(const std::string& message) { Send(message + \"\\n\"); }\n  };\n\n  // Concrete class for actually writing strings to a socket.\n  class SocketWriter : public AbstractSocketWriter {\n   public:\n    SocketWriter(const std::string& host, const std::string& port)\n        : sockfd_(-1), host_name_(host), port_num_(port) {\n      MakeConnection();\n    }\n\n    ~SocketWriter() override {\n      if (sockfd_ != -1)\n        CloseConnection();\n    }\n\n    // Sends a string to the socket.\n    void Send(const std::string& message) override {\n      GTEST_CHECK_(sockfd_ != -1)\n          << \"Send() can be called only when there is a connection.\";\n\n      const auto len = static_cast<size_t>(message.length());\n      if (write(sockfd_, message.c_str(), len) != static_cast<ssize_t>(len)) {\n        GTEST_LOG_(WARNING)\n            << \"stream_result_to: failed to stream to \"\n            << host_name_ << \":\" << port_num_;\n      }\n    }\n\n   private:\n    // Creates a client socket and connects to the server.\n    void MakeConnection();\n\n    // Closes the socket.\n    void CloseConnection() override {\n      GTEST_CHECK_(sockfd_ != -1)\n          << \"CloseConnection() can be called only when there is a connection.\";\n\n      close(sockfd_);\n      sockfd_ = -1;\n    }\n\n    int sockfd_;  // socket file descriptor\n    const std::string host_name_;\n    const std::string port_num_;\n\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(SocketWriter);\n  };  // class SocketWriter\n\n  // Escapes '=', '&', '%', and '\\n' characters in str as \"%xx\".\n  static std::string UrlEncode(const char* str);\n\n  StreamingListener(const std::string& host, const std::string& port)\n      : socket_writer_(new SocketWriter(host, port)) {\n    Start();\n  }\n\n  explicit StreamingListener(AbstractSocketWriter* socket_writer)\n      : socket_writer_(socket_writer) { Start(); }\n\n  void OnTestProgramStart(const UnitTest& /* unit_test */) override {\n    SendLn(\"event=TestProgramStart\");\n  }\n\n  void OnTestProgramEnd(const UnitTest& unit_test) override {\n    // Note that Google Test current only report elapsed time for each\n    // test iteration, not for the entire test program.\n    SendLn(\"event=TestProgramEnd&passed=\" + FormatBool(unit_test.Passed()));\n\n    // Notify the streaming server to stop.\n    socket_writer_->CloseConnection();\n  }\n\n  void OnTestIterationStart(const UnitTest& /* unit_test */,\n                            int iteration) override {\n    SendLn(\"event=TestIterationStart&iteration=\" +\n           StreamableToString(iteration));\n  }\n\n  void OnTestIterationEnd(const UnitTest& unit_test,\n                          int /* iteration */) override {\n    SendLn(\"event=TestIterationEnd&passed=\" +\n           FormatBool(unit_test.Passed()) + \"&elapsed_time=\" +\n           StreamableToString(unit_test.elapsed_time()) + \"ms\");\n  }\n\n  // Note that \"event=TestCaseStart\" is a wire format and has to remain\n  // \"case\" for compatibility\n  void OnTestCaseStart(const TestCase& test_case) override {\n    SendLn(std::string(\"event=TestCaseStart&name=\") + test_case.name());\n  }\n\n  // Note that \"event=TestCaseEnd\" is a wire format and has to remain\n  // \"case\" for compatibility\n  void OnTestCaseEnd(const TestCase& test_case) override {\n    SendLn(\"event=TestCaseEnd&passed=\" + FormatBool(test_case.Passed()) +\n           \"&elapsed_time=\" + StreamableToString(test_case.elapsed_time()) +\n           \"ms\");\n  }\n\n  void OnTestStart(const TestInfo& test_info) override {\n    SendLn(std::string(\"event=TestStart&name=\") + test_info.name());\n  }\n\n  void OnTestEnd(const TestInfo& test_info) override {\n    SendLn(\"event=TestEnd&passed=\" +\n           FormatBool((test_info.result())->Passed()) +\n           \"&elapsed_time=\" +\n           StreamableToString((test_info.result())->elapsed_time()) + \"ms\");\n  }\n\n  void OnTestPartResult(const TestPartResult& test_part_result) override {\n    const char* file_name = test_part_result.file_name();\n    if (file_name == nullptr) file_name = \"\";\n    SendLn(\"event=TestPartResult&file=\" + UrlEncode(file_name) +\n           \"&line=\" + StreamableToString(test_part_result.line_number()) +\n           \"&message=\" + UrlEncode(test_part_result.message()));\n  }\n\n private:\n  // Sends the given message and a newline to the socket.\n  void SendLn(const std::string& message) { socket_writer_->SendLn(message); }\n\n  // Called at the start of streaming to notify the receiver what\n  // protocol we are using.\n  void Start() { SendLn(\"gtest_streaming_protocol_version=1.0\"); }\n\n  std::string FormatBool(bool value) { return value ? \"1\" : \"0\"; }\n\n  const std::unique_ptr<AbstractSocketWriter> socket_writer_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);\n};  // class StreamingListener\n\n#endif  // GTEST_CAN_STREAM_RESULTS_\n\n}  // namespace internal\n}  // namespace testing\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n#endif  // GOOGLETEST_SRC_GTEST_INTERNAL_INL_H_\n\n#if GTEST_OS_WINDOWS\n# define vsnprintf _vsnprintf\n#endif  // GTEST_OS_WINDOWS\n\n#if GTEST_OS_MAC\n#ifndef GTEST_OS_IOS\n#include <crt_externs.h>\n#endif\n#endif\n\n#if GTEST_HAS_ABSL\n#include \"absl/debugging/failure_signal_handler.h\"\n#include \"absl/debugging/stacktrace.h\"\n#include \"absl/debugging/symbolize.h\"\n#include \"absl/strings/str_cat.h\"\n#endif  // GTEST_HAS_ABSL\n\nnamespace testing {\n\nusing internal::CountIf;\nusing internal::ForEach;\nusing internal::GetElementOr;\nusing internal::Shuffle;\n\n// Constants.\n\n// A test whose test suite name or test name matches this filter is\n// disabled and not run.\nstatic const char kDisableTestFilter[] = \"DISABLED_*:*/DISABLED_*\";\n\n// A test suite whose name matches this filter is considered a death\n// test suite and will be run before test suites whose name doesn't\n// match this filter.\nstatic const char kDeathTestSuiteFilter[] = \"*DeathTest:*DeathTest/*\";\n\n// A test filter that matches everything.\nstatic const char kUniversalFilter[] = \"*\";\n\n// The default output format.\nstatic const char kDefaultOutputFormat[] = \"xml\";\n// The default output file.\nstatic const char kDefaultOutputFile[] = \"test_detail\";\n\n// The environment variable name for the test shard index.\nstatic const char kTestShardIndex[] = \"GTEST_SHARD_INDEX\";\n// The environment variable name for the total number of test shards.\nstatic const char kTestTotalShards[] = \"GTEST_TOTAL_SHARDS\";\n// The environment variable name for the test shard status file.\nstatic const char kTestShardStatusFile[] = \"GTEST_SHARD_STATUS_FILE\";\n\nnamespace internal {\n\n// The text used in failure messages to indicate the start of the\n// stack trace.\nconst char kStackTraceMarker[] = \"\\nStack trace:\\n\";\n\n// g_help_flag is true if and only if the --help flag or an equivalent form\n// is specified on the command line.\nbool g_help_flag = false;\n\n// Utilty function to Open File for Writing\nstatic FILE* OpenFileForWriting(const std::string& output_file) {\n  FILE* fileout = nullptr;\n  FilePath output_file_path(output_file);\n  FilePath output_dir(output_file_path.RemoveFileName());\n\n  if (output_dir.CreateDirectoriesRecursively()) {\n    fileout = posix::FOpen(output_file.c_str(), \"w\");\n  }\n  if (fileout == nullptr) {\n    GTEST_LOG_(FATAL) << \"Unable to open file \\\"\" << output_file << \"\\\"\";\n  }\n  return fileout;\n}\n\n}  // namespace internal\n\n// Bazel passes in the argument to '--test_filter' via the TESTBRIDGE_TEST_ONLY\n// environment variable.\nstatic const char* GetDefaultFilter() {\n  const char* const testbridge_test_only =\n      internal::posix::GetEnv(\"TESTBRIDGE_TEST_ONLY\");\n  if (testbridge_test_only != nullptr) {\n    return testbridge_test_only;\n  }\n  return kUniversalFilter;\n}\n\n// Bazel passes in the argument to '--test_runner_fail_fast' via the\n// TESTBRIDGE_TEST_RUNNER_FAIL_FAST environment variable.\nstatic bool GetDefaultFailFast() {\n  const char* const testbridge_test_runner_fail_fast =\n      internal::posix::GetEnv(\"TESTBRIDGE_TEST_RUNNER_FAIL_FAST\");\n  if (testbridge_test_runner_fail_fast != nullptr) {\n    return strcmp(testbridge_test_runner_fail_fast, \"1\") == 0;\n  }\n  return false;\n}\n\nGTEST_DEFINE_bool_(\n    fail_fast, internal::BoolFromGTestEnv(\"fail_fast\", GetDefaultFailFast()),\n    \"True if and only if a test failure should stop further test execution.\");\n\nGTEST_DEFINE_bool_(\n    also_run_disabled_tests,\n    internal::BoolFromGTestEnv(\"also_run_disabled_tests\", false),\n    \"Run disabled tests too, in addition to the tests normally being run.\");\n\nGTEST_DEFINE_bool_(\n    break_on_failure, internal::BoolFromGTestEnv(\"break_on_failure\", false),\n    \"True if and only if a failed assertion should be a debugger \"\n    \"break-point.\");\n\nGTEST_DEFINE_bool_(catch_exceptions,\n                   internal::BoolFromGTestEnv(\"catch_exceptions\", true),\n                   \"True if and only if \" GTEST_NAME_\n                   \" should catch exceptions and treat them as test failures.\");\n\nGTEST_DEFINE_string_(\n    color,\n    internal::StringFromGTestEnv(\"color\", \"auto\"),\n    \"Whether to use colors in the output.  Valid values: yes, no, \"\n    \"and auto.  'auto' means to use colors if the output is \"\n    \"being sent to a terminal and the TERM environment variable \"\n    \"is set to a terminal type that supports colors.\");\n\nGTEST_DEFINE_string_(\n    filter,\n    internal::StringFromGTestEnv(\"filter\", GetDefaultFilter()),\n    \"A colon-separated list of glob (not regex) patterns \"\n    \"for filtering the tests to run, optionally followed by a \"\n    \"'-' and a : separated list of negative patterns (tests to \"\n    \"exclude).  A test is run if it matches one of the positive \"\n    \"patterns and does not match any of the negative patterns.\");\n\nGTEST_DEFINE_bool_(\n    install_failure_signal_handler,\n    internal::BoolFromGTestEnv(\"install_failure_signal_handler\", false),\n    \"If true and supported on the current platform, \" GTEST_NAME_ \" should \"\n    \"install a signal handler that dumps debugging information when fatal \"\n    \"signals are raised.\");\n\nGTEST_DEFINE_bool_(list_tests, false,\n                   \"List all tests without running them.\");\n\n// The net priority order after flag processing is thus:\n//   --gtest_output command line flag\n//   GTEST_OUTPUT environment variable\n//   XML_OUTPUT_FILE environment variable\n//   ''\nGTEST_DEFINE_string_(\n    output,\n    internal::StringFromGTestEnv(\"output\",\n      internal::OutputFlagAlsoCheckEnvVar().c_str()),\n    \"A format (defaults to \\\"xml\\\" but can be specified to be \\\"json\\\"), \"\n    \"optionally followed by a colon and an output file name or directory. \"\n    \"A directory is indicated by a trailing pathname separator. \"\n    \"Examples: \\\"xml:filename.xml\\\", \\\"xml::directoryname/\\\". \"\n    \"If a directory is specified, output files will be created \"\n    \"within that directory, with file-names based on the test \"\n    \"executable's name and, if necessary, made unique by adding \"\n    \"digits.\");\n\nGTEST_DEFINE_bool_(\n    brief, internal::BoolFromGTestEnv(\"brief\", false),\n    \"True if only test failures should be displayed in text output.\");\n\nGTEST_DEFINE_bool_(print_time, internal::BoolFromGTestEnv(\"print_time\", true),\n                   \"True if and only if \" GTEST_NAME_\n                   \" should display elapsed time in text output.\");\n\nGTEST_DEFINE_bool_(print_utf8, internal::BoolFromGTestEnv(\"print_utf8\", true),\n                   \"True if and only if \" GTEST_NAME_\n                   \" prints UTF8 characters as text.\");\n\nGTEST_DEFINE_int32_(\n    random_seed,\n    internal::Int32FromGTestEnv(\"random_seed\", 0),\n    \"Random number seed to use when shuffling test orders.  Must be in range \"\n    \"[1, 99999], or 0 to use a seed based on the current time.\");\n\nGTEST_DEFINE_int32_(\n    repeat,\n    internal::Int32FromGTestEnv(\"repeat\", 1),\n    \"How many times to repeat each test.  Specify a negative number \"\n    \"for repeating forever.  Useful for shaking out flaky tests.\");\n\nGTEST_DEFINE_bool_(show_internal_stack_frames, false,\n                   \"True if and only if \" GTEST_NAME_\n                   \" should include internal stack frames when \"\n                   \"printing test failure stack traces.\");\n\nGTEST_DEFINE_bool_(shuffle, internal::BoolFromGTestEnv(\"shuffle\", false),\n                   \"True if and only if \" GTEST_NAME_\n                   \" should randomize tests' order on every run.\");\n\nGTEST_DEFINE_int32_(\n    stack_trace_depth,\n    internal::Int32FromGTestEnv(\"stack_trace_depth\", kMaxStackTraceDepth),\n    \"The maximum number of stack frames to print when an \"\n    \"assertion fails.  The valid range is 0 through 100, inclusive.\");\n\nGTEST_DEFINE_string_(\n    stream_result_to,\n    internal::StringFromGTestEnv(\"stream_result_to\", \"\"),\n    \"This flag specifies the host name and the port number on which to stream \"\n    \"test results. Example: \\\"localhost:555\\\". The flag is effective only on \"\n    \"Linux.\");\n\nGTEST_DEFINE_bool_(\n    throw_on_failure,\n    internal::BoolFromGTestEnv(\"throw_on_failure\", false),\n    \"When this flag is specified, a failed assertion will throw an exception \"\n    \"if exceptions are enabled or exit the program with a non-zero code \"\n    \"otherwise. For use with an external test framework.\");\n\n#if GTEST_USE_OWN_FLAGFILE_FLAG_\nGTEST_DEFINE_string_(\n    flagfile,\n    internal::StringFromGTestEnv(\"flagfile\", \"\"),\n    \"This flag specifies the flagfile to read command-line flags from.\");\n#endif  // GTEST_USE_OWN_FLAGFILE_FLAG_\n\nnamespace internal {\n\n// Generates a random number from [0, range), using a Linear\n// Congruential Generator (LCG).  Crashes if 'range' is 0 or greater\n// than kMaxRange.\nuint32_t Random::Generate(uint32_t range) {\n  // These constants are the same as are used in glibc's rand(3).\n  // Use wider types than necessary to prevent unsigned overflow diagnostics.\n  state_ = static_cast<uint32_t>(1103515245ULL*state_ + 12345U) % kMaxRange;\n\n  GTEST_CHECK_(range > 0)\n      << \"Cannot generate a number in the range [0, 0).\";\n  GTEST_CHECK_(range <= kMaxRange)\n      << \"Generation of a number in [0, \" << range << \") was requested, \"\n      << \"but this can only generate numbers in [0, \" << kMaxRange << \").\";\n\n  // Converting via modulus introduces a bit of downward bias, but\n  // it's simple, and a linear congruential generator isn't too good\n  // to begin with.\n  return state_ % range;\n}\n\n// GTestIsInitialized() returns true if and only if the user has initialized\n// Google Test.  Useful for catching the user mistake of not initializing\n// Google Test before calling RUN_ALL_TESTS().\nstatic bool GTestIsInitialized() { return GetArgvs().size() > 0; }\n\n// Iterates over a vector of TestSuites, keeping a running sum of the\n// results of calling a given int-returning method on each.\n// Returns the sum.\nstatic int SumOverTestSuiteList(const std::vector<TestSuite*>& case_list,\n                                int (TestSuite::*method)() const) {\n  int sum = 0;\n  for (size_t i = 0; i < case_list.size(); i++) {\n    sum += (case_list[i]->*method)();\n  }\n  return sum;\n}\n\n// Returns true if and only if the test suite passed.\nstatic bool TestSuitePassed(const TestSuite* test_suite) {\n  return test_suite->should_run() && test_suite->Passed();\n}\n\n// Returns true if and only if the test suite failed.\nstatic bool TestSuiteFailed(const TestSuite* test_suite) {\n  return test_suite->should_run() && test_suite->Failed();\n}\n\n// Returns true if and only if test_suite contains at least one test that\n// should run.\nstatic bool ShouldRunTestSuite(const TestSuite* test_suite) {\n  return test_suite->should_run();\n}\n\n// AssertHelper constructor.\nAssertHelper::AssertHelper(TestPartResult::Type type,\n                           const char* file,\n                           int line,\n                           const char* message)\n    : data_(new AssertHelperData(type, file, line, message)) {\n}\n\nAssertHelper::~AssertHelper() {\n  delete data_;\n}\n\n// Message assignment, for assertion streaming support.\nvoid AssertHelper::operator=(const Message& message) const {\n  UnitTest::GetInstance()->\n    AddTestPartResult(data_->type, data_->file, data_->line,\n                      AppendUserMessage(data_->message, message),\n                      UnitTest::GetInstance()->impl()\n                      ->CurrentOsStackTraceExceptTop(1)\n                      // Skips the stack frame for this function itself.\n                      );  // NOLINT\n}\n\nnamespace {\n\n// When TEST_P is found without a matching INSTANTIATE_TEST_SUITE_P\n// to creates test cases for it, a syntetic test case is\n// inserted to report ether an error or a log message.\n//\n// This configuration bit will likely be removed at some point.\nconstexpr bool kErrorOnUninstantiatedParameterizedTest = true;\nconstexpr bool kErrorOnUninstantiatedTypeParameterizedTest = true;\n\n// A test that fails at a given file/line location with a given message.\nclass FailureTest : public Test {\n public:\n  explicit FailureTest(const CodeLocation& loc, std::string error_message,\n                       bool as_error)\n      : loc_(loc),\n        error_message_(std::move(error_message)),\n        as_error_(as_error) {}\n\n  void TestBody() override {\n    if (as_error_) {\n      AssertHelper(TestPartResult::kNonFatalFailure, loc_.file.c_str(),\n                   loc_.line, \"\") = Message() << error_message_;\n    } else {\n      std::cout << error_message_ << std::endl;\n    }\n  }\n\n private:\n  const CodeLocation loc_;\n  const std::string error_message_;\n  const bool as_error_;\n};\n\n\n}  // namespace\n\nstd::set<std::string>* GetIgnoredParameterizedTestSuites() {\n  return UnitTest::GetInstance()->impl()->ignored_parameterized_test_suites();\n}\n\n// Add a given test_suit to the list of them allow to go un-instantiated.\nMarkAsIgnored::MarkAsIgnored(const char* test_suite) {\n  GetIgnoredParameterizedTestSuites()->insert(test_suite);\n}\n\n// If this parameterized test suite has no instantiations (and that\n// has not been marked as okay), emit a test case reporting that.\nvoid InsertSyntheticTestCase(const std::string& name, CodeLocation location,\n                             bool has_test_p) {\n  const auto& ignored = *GetIgnoredParameterizedTestSuites();\n  if (ignored.find(name) != ignored.end()) return;\n\n  const char kMissingInstantiation[] =  //\n      \" is defined via TEST_P, but never instantiated. None of the test cases \"\n      \"will run. Either no INSTANTIATE_TEST_SUITE_P is provided or the only \"\n      \"ones provided expand to nothing.\"\n      \"\\n\\n\"\n      \"Ideally, TEST_P definitions should only ever be included as part of \"\n      \"binaries that intend to use them. (As opposed to, for example, being \"\n      \"placed in a library that may be linked in to get other utilities.)\";\n\n  const char kMissingTestCase[] =  //\n      \" is instantiated via INSTANTIATE_TEST_SUITE_P, but no tests are \"\n      \"defined via TEST_P . No test cases will run.\"\n      \"\\n\\n\"\n      \"Ideally, INSTANTIATE_TEST_SUITE_P should only ever be invoked from \"\n      \"code that always depend on code that provides TEST_P. Failing to do \"\n      \"so is often an indication of dead code, e.g. the last TEST_P was \"\n      \"removed but the rest got left behind.\";\n\n  std::string message =\n      \"Parameterized test suite \" + name +\n      (has_test_p ? kMissingInstantiation : kMissingTestCase) +\n      \"\\n\\n\"\n      \"To suppress this error for this test suite, insert the following line \"\n      \"(in a non-header) in the namespace it is defined in:\"\n      \"\\n\\n\"\n      \"GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(\" + name + \");\";\n\n  std::string full_name = \"UninstantiatedParameterizedTestSuite<\" + name + \">\";\n  RegisterTest(  //\n      \"GoogleTestVerification\", full_name.c_str(),\n      nullptr,  // No type parameter.\n      nullptr,  // No value parameter.\n      location.file.c_str(), location.line, [message, location] {\n        return new FailureTest(location, message,\n                               kErrorOnUninstantiatedParameterizedTest);\n      });\n}\n\nvoid RegisterTypeParameterizedTestSuite(const char* test_suite_name,\n                                        CodeLocation code_location) {\n  GetUnitTestImpl()->type_parameterized_test_registry().RegisterTestSuite(\n      test_suite_name, code_location);\n}\n\nvoid RegisterTypeParameterizedTestSuiteInstantiation(const char* case_name) {\n  GetUnitTestImpl()\n      ->type_parameterized_test_registry()\n      .RegisterInstantiation(case_name);\n}\n\nvoid TypeParameterizedTestSuiteRegistry::RegisterTestSuite(\n    const char* test_suite_name, CodeLocation code_location) {\n  suites_.emplace(std::string(test_suite_name),\n                 TypeParameterizedTestSuiteInfo(code_location));\n}\n\nvoid TypeParameterizedTestSuiteRegistry::RegisterInstantiation(\n        const char* test_suite_name) {\n  auto it = suites_.find(std::string(test_suite_name));\n  if (it != suites_.end()) {\n    it->second.instantiated = true;\n  } else {\n    GTEST_LOG_(ERROR) << \"Unknown type parameterized test suit '\"\n                      << test_suite_name << \"'\";\n  }\n}\n\nvoid TypeParameterizedTestSuiteRegistry::CheckForInstantiations() {\n  const auto& ignored = *GetIgnoredParameterizedTestSuites();\n  for (const auto& testcase : suites_) {\n    if (testcase.second.instantiated) continue;\n    if (ignored.find(testcase.first) != ignored.end()) continue;\n\n    std::string message =\n        \"Type parameterized test suite \" + testcase.first +\n        \" is defined via REGISTER_TYPED_TEST_SUITE_P, but never instantiated \"\n        \"via INSTANTIATE_TYPED_TEST_SUITE_P. None of the test cases will run.\"\n        \"\\n\\n\"\n        \"Ideally, TYPED_TEST_P definitions should only ever be included as \"\n        \"part of binaries that intend to use them. (As opposed to, for \"\n        \"example, being placed in a library that may be linked in to get other \"\n        \"utilities.)\"\n        \"\\n\\n\"\n        \"To suppress this error for this test suite, insert the following line \"\n        \"(in a non-header) in the namespace it is defined in:\"\n        \"\\n\\n\"\n        \"GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(\" +\n        testcase.first + \");\";\n\n    std::string full_name =\n        \"UninstantiatedTypeParameterizedTestSuite<\" + testcase.first + \">\";\n    RegisterTest(  //\n        \"GoogleTestVerification\", full_name.c_str(),\n        nullptr,  // No type parameter.\n        nullptr,  // No value parameter.\n        testcase.second.code_location.file.c_str(),\n        testcase.second.code_location.line, [message, testcase] {\n          return new FailureTest(testcase.second.code_location, message,\n                                 kErrorOnUninstantiatedTypeParameterizedTest);\n        });\n  }\n}\n\n// A copy of all command line arguments.  Set by InitGoogleTest().\nstatic ::std::vector<std::string> g_argvs;\n\n::std::vector<std::string> GetArgvs() {\n#if defined(GTEST_CUSTOM_GET_ARGVS_)\n  // GTEST_CUSTOM_GET_ARGVS_() may return a container of std::string or\n  // ::string. This code converts it to the appropriate type.\n  const auto& custom = GTEST_CUSTOM_GET_ARGVS_();\n  return ::std::vector<std::string>(custom.begin(), custom.end());\n#else   // defined(GTEST_CUSTOM_GET_ARGVS_)\n  return g_argvs;\n#endif  // defined(GTEST_CUSTOM_GET_ARGVS_)\n}\n\n// Returns the current application's name, removing directory path if that\n// is present.\nFilePath GetCurrentExecutableName() {\n  FilePath result;\n\n#if GTEST_OS_WINDOWS || GTEST_OS_OS2\n  result.Set(FilePath(GetArgvs()[0]).RemoveExtension(\"exe\"));\n#else\n  result.Set(FilePath(GetArgvs()[0]));\n#endif  // GTEST_OS_WINDOWS\n\n  return result.RemoveDirectoryName();\n}\n\n// Functions for processing the gtest_output flag.\n\n// Returns the output format, or \"\" for normal printed output.\nstd::string UnitTestOptions::GetOutputFormat() {\n  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();\n  const char* const colon = strchr(gtest_output_flag, ':');\n  return (colon == nullptr)\n             ? std::string(gtest_output_flag)\n             : std::string(gtest_output_flag,\n                           static_cast<size_t>(colon - gtest_output_flag));\n}\n\n// Returns the name of the requested output file, or the default if none\n// was explicitly specified.\nstd::string UnitTestOptions::GetAbsolutePathToOutputFile() {\n  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();\n\n  std::string format = GetOutputFormat();\n  if (format.empty())\n    format = std::string(kDefaultOutputFormat);\n\n  const char* const colon = strchr(gtest_output_flag, ':');\n  if (colon == nullptr)\n    return internal::FilePath::MakeFileName(\n        internal::FilePath(\n            UnitTest::GetInstance()->original_working_dir()),\n        internal::FilePath(kDefaultOutputFile), 0,\n        format.c_str()).string();\n\n  internal::FilePath output_name(colon + 1);\n  if (!output_name.IsAbsolutePath())\n    output_name = internal::FilePath::ConcatPaths(\n        internal::FilePath(UnitTest::GetInstance()->original_working_dir()),\n        internal::FilePath(colon + 1));\n\n  if (!output_name.IsDirectory())\n    return output_name.string();\n\n  internal::FilePath result(internal::FilePath::GenerateUniqueFileName(\n      output_name, internal::GetCurrentExecutableName(),\n      GetOutputFormat().c_str()));\n  return result.string();\n}\n\n// Returns true if and only if the wildcard pattern matches the string. Each\n// pattern consists of regular characters, single-character wildcards (?), and\n// multi-character wildcards (*).\n//\n// This function implements a linear-time string globbing algorithm based on\n// https://research.swtch.com/glob.\nstatic bool PatternMatchesString(const std::string& name_str,\n                                 const char* pattern, const char* pattern_end) {\n  const char* name = name_str.c_str();\n  const char* const name_begin = name;\n  const char* const name_end = name + name_str.size();\n\n  const char* pattern_next = pattern;\n  const char* name_next = name;\n\n  while (pattern < pattern_end || name < name_end) {\n    if (pattern < pattern_end) {\n      switch (*pattern) {\n        default:  // Match an ordinary character.\n          if (name < name_end && *name == *pattern) {\n            ++pattern;\n            ++name;\n            continue;\n          }\n          break;\n        case '?':  // Match any single character.\n          if (name < name_end) {\n            ++pattern;\n            ++name;\n            continue;\n          }\n          break;\n        case '*':\n          // Match zero or more characters. Start by skipping over the wildcard\n          // and matching zero characters from name. If that fails, restart and\n          // match one more character than the last attempt.\n          pattern_next = pattern;\n          name_next = name + 1;\n          ++pattern;\n          continue;\n      }\n    }\n    // Failed to match a character. Restart if possible.\n    if (name_begin < name_next && name_next <= name_end) {\n      pattern = pattern_next;\n      name = name_next;\n      continue;\n    }\n    return false;\n  }\n  return true;\n}\n\nbool UnitTestOptions::MatchesFilter(const std::string& name_str,\n                                    const char* filter) {\n  // The filter is a list of patterns separated by colons (:).\n  const char* pattern = filter;\n  while (true) {\n    // Find the bounds of this pattern.\n    const char* const next_sep = strchr(pattern, ':');\n    const char* const pattern_end =\n        next_sep != nullptr ? next_sep : pattern + strlen(pattern);\n\n    // Check if this pattern matches name_str.\n    if (PatternMatchesString(name_str, pattern, pattern_end)) {\n      return true;\n    }\n\n    // Give up on this pattern. However, if we found a pattern separator (:),\n    // advance to the next pattern (skipping over the separator) and restart.\n    if (next_sep == nullptr) {\n      return false;\n    }\n    pattern = next_sep + 1;\n  }\n  return true;\n}\n\n// Returns true if and only if the user-specified filter matches the test\n// suite name and the test name.\nbool UnitTestOptions::FilterMatchesTest(const std::string& test_suite_name,\n                                        const std::string& test_name) {\n  const std::string& full_name = test_suite_name + \".\" + test_name.c_str();\n\n  // Split --gtest_filter at '-', if there is one, to separate into\n  // positive filter and negative filter portions\n  const char* const p = GTEST_FLAG(filter).c_str();\n  const char* const dash = strchr(p, '-');\n  std::string positive;\n  std::string negative;\n  if (dash == nullptr) {\n    positive = GTEST_FLAG(filter).c_str();  // Whole string is a positive filter\n    negative = \"\";\n  } else {\n    positive = std::string(p, dash);   // Everything up to the dash\n    negative = std::string(dash + 1);  // Everything after the dash\n    if (positive.empty()) {\n      // Treat '-test1' as the same as '*-test1'\n      positive = kUniversalFilter;\n    }\n  }\n\n  // A filter is a colon-separated list of patterns.  It matches a\n  // test if any pattern in it matches the test.\n  return (MatchesFilter(full_name, positive.c_str()) &&\n          !MatchesFilter(full_name, negative.c_str()));\n}\n\n#if GTEST_HAS_SEH\n// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the\n// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.\n// This function is useful as an __except condition.\nint UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {\n  // Google Test should handle a SEH exception if:\n  //   1. the user wants it to, AND\n  //   2. this is not a breakpoint exception, AND\n  //   3. this is not a C++ exception (VC++ implements them via SEH,\n  //      apparently).\n  //\n  // SEH exception code for C++ exceptions.\n  // (see http://support.microsoft.com/kb/185294 for more information).\n  const DWORD kCxxExceptionCode = 0xe06d7363;\n\n  bool should_handle = true;\n\n  if (!GTEST_FLAG(catch_exceptions))\n    should_handle = false;\n  else if (exception_code == EXCEPTION_BREAKPOINT)\n    should_handle = false;\n  else if (exception_code == kCxxExceptionCode)\n    should_handle = false;\n\n  return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;\n}\n#endif  // GTEST_HAS_SEH\n\n}  // namespace internal\n\n// The c'tor sets this object as the test part result reporter used by\n// Google Test.  The 'result' parameter specifies where to report the\n// results. Intercepts only failures from the current thread.\nScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(\n    TestPartResultArray* result)\n    : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),\n      result_(result) {\n  Init();\n}\n\n// The c'tor sets this object as the test part result reporter used by\n// Google Test.  The 'result' parameter specifies where to report the\n// results.\nScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(\n    InterceptMode intercept_mode, TestPartResultArray* result)\n    : intercept_mode_(intercept_mode),\n      result_(result) {\n  Init();\n}\n\nvoid ScopedFakeTestPartResultReporter::Init() {\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {\n    old_reporter_ = impl->GetGlobalTestPartResultReporter();\n    impl->SetGlobalTestPartResultReporter(this);\n  } else {\n    old_reporter_ = impl->GetTestPartResultReporterForCurrentThread();\n    impl->SetTestPartResultReporterForCurrentThread(this);\n  }\n}\n\n// The d'tor restores the test part result reporter used by Google Test\n// before.\nScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {\n    impl->SetGlobalTestPartResultReporter(old_reporter_);\n  } else {\n    impl->SetTestPartResultReporterForCurrentThread(old_reporter_);\n  }\n}\n\n// Increments the test part result count and remembers the result.\n// This method is from the TestPartResultReporterInterface interface.\nvoid ScopedFakeTestPartResultReporter::ReportTestPartResult(\n    const TestPartResult& result) {\n  result_->Append(result);\n}\n\nnamespace internal {\n\n// Returns the type ID of ::testing::Test.  We should always call this\n// instead of GetTypeId< ::testing::Test>() to get the type ID of\n// testing::Test.  This is to work around a suspected linker bug when\n// using Google Test as a framework on Mac OS X.  The bug causes\n// GetTypeId< ::testing::Test>() to return different values depending\n// on whether the call is from the Google Test framework itself or\n// from user test code.  GetTestTypeId() is guaranteed to always\n// return the same value, as it always calls GetTypeId<>() from the\n// gtest.cc, which is within the Google Test framework.\nTypeId GetTestTypeId() {\n  return GetTypeId<Test>();\n}\n\n// The value of GetTestTypeId() as seen from within the Google Test\n// library.  This is solely for testing GetTestTypeId().\nextern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId();\n\n// This predicate-formatter checks that 'results' contains a test part\n// failure of the given type and that the failure message contains the\n// given substring.\nstatic AssertionResult HasOneFailure(const char* /* results_expr */,\n                                     const char* /* type_expr */,\n                                     const char* /* substr_expr */,\n                                     const TestPartResultArray& results,\n                                     TestPartResult::Type type,\n                                     const std::string& substr) {\n  const std::string expected(type == TestPartResult::kFatalFailure ?\n                        \"1 fatal failure\" :\n                        \"1 non-fatal failure\");\n  Message msg;\n  if (results.size() != 1) {\n    msg << \"Expected: \" << expected << \"\\n\"\n        << \"  Actual: \" << results.size() << \" failures\";\n    for (int i = 0; i < results.size(); i++) {\n      msg << \"\\n\" << results.GetTestPartResult(i);\n    }\n    return AssertionFailure() << msg;\n  }\n\n  const TestPartResult& r = results.GetTestPartResult(0);\n  if (r.type() != type) {\n    return AssertionFailure() << \"Expected: \" << expected << \"\\n\"\n                              << \"  Actual:\\n\"\n                              << r;\n  }\n\n  if (strstr(r.message(), substr.c_str()) == nullptr) {\n    return AssertionFailure() << \"Expected: \" << expected << \" containing \\\"\"\n                              << substr << \"\\\"\\n\"\n                              << \"  Actual:\\n\"\n                              << r;\n  }\n\n  return AssertionSuccess();\n}\n\n// The constructor of SingleFailureChecker remembers where to look up\n// test part results, what type of failure we expect, and what\n// substring the failure message should contain.\nSingleFailureChecker::SingleFailureChecker(const TestPartResultArray* results,\n                                           TestPartResult::Type type,\n                                           const std::string& substr)\n    : results_(results), type_(type), substr_(substr) {}\n\n// The destructor of SingleFailureChecker verifies that the given\n// TestPartResultArray contains exactly one failure that has the given\n// type and contains the given substring.  If that's not the case, a\n// non-fatal failure will be generated.\nSingleFailureChecker::~SingleFailureChecker() {\n  EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_);\n}\n\nDefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(\n    UnitTestImpl* unit_test) : unit_test_(unit_test) {}\n\nvoid DefaultGlobalTestPartResultReporter::ReportTestPartResult(\n    const TestPartResult& result) {\n  unit_test_->current_test_result()->AddTestPartResult(result);\n  unit_test_->listeners()->repeater()->OnTestPartResult(result);\n}\n\nDefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter(\n    UnitTestImpl* unit_test) : unit_test_(unit_test) {}\n\nvoid DefaultPerThreadTestPartResultReporter::ReportTestPartResult(\n    const TestPartResult& result) {\n  unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result);\n}\n\n// Returns the global test part result reporter.\nTestPartResultReporterInterface*\nUnitTestImpl::GetGlobalTestPartResultReporter() {\n  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);\n  return global_test_part_result_repoter_;\n}\n\n// Sets the global test part result reporter.\nvoid UnitTestImpl::SetGlobalTestPartResultReporter(\n    TestPartResultReporterInterface* reporter) {\n  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);\n  global_test_part_result_repoter_ = reporter;\n}\n\n// Returns the test part result reporter for the current thread.\nTestPartResultReporterInterface*\nUnitTestImpl::GetTestPartResultReporterForCurrentThread() {\n  return per_thread_test_part_result_reporter_.get();\n}\n\n// Sets the test part result reporter for the current thread.\nvoid UnitTestImpl::SetTestPartResultReporterForCurrentThread(\n    TestPartResultReporterInterface* reporter) {\n  per_thread_test_part_result_reporter_.set(reporter);\n}\n\n// Gets the number of successful test suites.\nint UnitTestImpl::successful_test_suite_count() const {\n  return CountIf(test_suites_, TestSuitePassed);\n}\n\n// Gets the number of failed test suites.\nint UnitTestImpl::failed_test_suite_count() const {\n  return CountIf(test_suites_, TestSuiteFailed);\n}\n\n// Gets the number of all test suites.\nint UnitTestImpl::total_test_suite_count() const {\n  return static_cast<int>(test_suites_.size());\n}\n\n// Gets the number of all test suites that contain at least one test\n// that should run.\nint UnitTestImpl::test_suite_to_run_count() const {\n  return CountIf(test_suites_, ShouldRunTestSuite);\n}\n\n// Gets the number of successful tests.\nint UnitTestImpl::successful_test_count() const {\n  return SumOverTestSuiteList(test_suites_, &TestSuite::successful_test_count);\n}\n\n// Gets the number of skipped tests.\nint UnitTestImpl::skipped_test_count() const {\n  return SumOverTestSuiteList(test_suites_, &TestSuite::skipped_test_count);\n}\n\n// Gets the number of failed tests.\nint UnitTestImpl::failed_test_count() const {\n  return SumOverTestSuiteList(test_suites_, &TestSuite::failed_test_count);\n}\n\n// Gets the number of disabled tests that will be reported in the XML report.\nint UnitTestImpl::reportable_disabled_test_count() const {\n  return SumOverTestSuiteList(test_suites_,\n                              &TestSuite::reportable_disabled_test_count);\n}\n\n// Gets the number of disabled tests.\nint UnitTestImpl::disabled_test_count() const {\n  return SumOverTestSuiteList(test_suites_, &TestSuite::disabled_test_count);\n}\n\n// Gets the number of tests to be printed in the XML report.\nint UnitTestImpl::reportable_test_count() const {\n  return SumOverTestSuiteList(test_suites_, &TestSuite::reportable_test_count);\n}\n\n// Gets the number of all tests.\nint UnitTestImpl::total_test_count() const {\n  return SumOverTestSuiteList(test_suites_, &TestSuite::total_test_count);\n}\n\n// Gets the number of tests that should run.\nint UnitTestImpl::test_to_run_count() const {\n  return SumOverTestSuiteList(test_suites_, &TestSuite::test_to_run_count);\n}\n\n// Returns the current OS stack trace as an std::string.\n//\n// The maximum number of stack frames to be included is specified by\n// the gtest_stack_trace_depth flag.  The skip_count parameter\n// specifies the number of top frames to be skipped, which doesn't\n// count against the number of frames to be included.\n//\n// For example, if Foo() calls Bar(), which in turn calls\n// CurrentOsStackTraceExceptTop(1), Foo() will be included in the\n// trace but Bar() and CurrentOsStackTraceExceptTop() won't.\nstd::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {\n  return os_stack_trace_getter()->CurrentStackTrace(\n      static_cast<int>(GTEST_FLAG(stack_trace_depth)),\n      skip_count + 1\n      // Skips the user-specified number of frames plus this function\n      // itself.\n      );  // NOLINT\n}\n\n// A helper class for measuring elapsed times.\nclass Timer {\n public:\n  Timer() : start_(std::chrono::steady_clock::now()) {}\n\n  // Return time elapsed in milliseconds since the timer was created.\n  TimeInMillis Elapsed() {\n    return std::chrono::duration_cast<std::chrono::milliseconds>(\n               std::chrono::steady_clock::now() - start_)\n        .count();\n  }\n\n private:\n  std::chrono::steady_clock::time_point start_;\n};\n\n// Returns a timestamp as milliseconds since the epoch. Note this time may jump\n// around subject to adjustments by the system, to measure elapsed time use\n// Timer instead.\nTimeInMillis GetTimeInMillis() {\n  return std::chrono::duration_cast<std::chrono::milliseconds>(\n             std::chrono::system_clock::now() -\n             std::chrono::system_clock::from_time_t(0))\n      .count();\n}\n\n// Utilities\n\n// class String.\n\n#if GTEST_OS_WINDOWS_MOBILE\n// Creates a UTF-16 wide string from the given ANSI string, allocating\n// memory using new. The caller is responsible for deleting the return\n// value using delete[]. Returns the wide string, or NULL if the\n// input is NULL.\nLPCWSTR String::AnsiToUtf16(const char* ansi) {\n  if (!ansi) return nullptr;\n  const int length = strlen(ansi);\n  const int unicode_length =\n      MultiByteToWideChar(CP_ACP, 0, ansi, length, nullptr, 0);\n  WCHAR* unicode = new WCHAR[unicode_length + 1];\n  MultiByteToWideChar(CP_ACP, 0, ansi, length,\n                      unicode, unicode_length);\n  unicode[unicode_length] = 0;\n  return unicode;\n}\n\n// Creates an ANSI string from the given wide string, allocating\n// memory using new. The caller is responsible for deleting the return\n// value using delete[]. Returns the ANSI string, or NULL if the\n// input is NULL.\nconst char* String::Utf16ToAnsi(LPCWSTR utf16_str)  {\n  if (!utf16_str) return nullptr;\n  const int ansi_length = WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, nullptr,\n                                              0, nullptr, nullptr);\n  char* ansi = new char[ansi_length + 1];\n  WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, ansi, ansi_length, nullptr,\n                      nullptr);\n  ansi[ansi_length] = 0;\n  return ansi;\n}\n\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n// Compares two C strings.  Returns true if and only if they have the same\n// content.\n//\n// Unlike strcmp(), this function can handle NULL argument(s).  A NULL\n// C string is considered different to any non-NULL C string,\n// including the empty string.\nbool String::CStringEquals(const char * lhs, const char * rhs) {\n  if (lhs == nullptr) return rhs == nullptr;\n\n  if (rhs == nullptr) return false;\n\n  return strcmp(lhs, rhs) == 0;\n}\n\n#if GTEST_HAS_STD_WSTRING\n\n// Converts an array of wide chars to a narrow string using the UTF-8\n// encoding, and streams the result to the given Message object.\nstatic void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,\n                                     Message* msg) {\n  for (size_t i = 0; i != length; ) {  // NOLINT\n    if (wstr[i] != L'\\0') {\n      *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));\n      while (i != length && wstr[i] != L'\\0')\n        i++;\n    } else {\n      *msg << '\\0';\n      i++;\n    }\n  }\n}\n\n#endif  // GTEST_HAS_STD_WSTRING\n\nvoid SplitString(const ::std::string& str, char delimiter,\n                 ::std::vector< ::std::string>* dest) {\n  ::std::vector< ::std::string> parsed;\n  ::std::string::size_type pos = 0;\n  while (::testing::internal::AlwaysTrue()) {\n    const ::std::string::size_type colon = str.find(delimiter, pos);\n    if (colon == ::std::string::npos) {\n      parsed.push_back(str.substr(pos));\n      break;\n    } else {\n      parsed.push_back(str.substr(pos, colon - pos));\n      pos = colon + 1;\n    }\n  }\n  dest->swap(parsed);\n}\n\n}  // namespace internal\n\n// Constructs an empty Message.\n// We allocate the stringstream separately because otherwise each use of\n// ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's\n// stack frame leading to huge stack frames in some cases; gcc does not reuse\n// the stack space.\nMessage::Message() : ss_(new ::std::stringstream) {\n  // By default, we want there to be enough precision when printing\n  // a double to a Message.\n  *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);\n}\n\n// These two overloads allow streaming a wide C string to a Message\n// using the UTF-8 encoding.\nMessage& Message::operator <<(const wchar_t* wide_c_str) {\n  return *this << internal::String::ShowWideCString(wide_c_str);\n}\nMessage& Message::operator <<(wchar_t* wide_c_str) {\n  return *this << internal::String::ShowWideCString(wide_c_str);\n}\n\n#if GTEST_HAS_STD_WSTRING\n// Converts the given wide string to a narrow string using the UTF-8\n// encoding, and streams the result to this Message object.\nMessage& Message::operator <<(const ::std::wstring& wstr) {\n  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);\n  return *this;\n}\n#endif  // GTEST_HAS_STD_WSTRING\n\n// Gets the text streamed to this object so far as an std::string.\n// Each '\\0' character in the buffer is replaced with \"\\\\0\".\nstd::string Message::GetString() const {\n  return internal::StringStreamToString(ss_.get());\n}\n\n// AssertionResult constructors.\n// Used in EXPECT_TRUE/FALSE(assertion_result).\nAssertionResult::AssertionResult(const AssertionResult& other)\n    : success_(other.success_),\n      message_(other.message_.get() != nullptr\n                   ? new ::std::string(*other.message_)\n                   : static_cast< ::std::string*>(nullptr)) {}\n\n// Swaps two AssertionResults.\nvoid AssertionResult::swap(AssertionResult& other) {\n  using std::swap;\n  swap(success_, other.success_);\n  swap(message_, other.message_);\n}\n\n// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.\nAssertionResult AssertionResult::operator!() const {\n  AssertionResult negation(!success_);\n  if (message_.get() != nullptr) negation << *message_;\n  return negation;\n}\n\n// Makes a successful assertion result.\nAssertionResult AssertionSuccess() {\n  return AssertionResult(true);\n}\n\n// Makes a failed assertion result.\nAssertionResult AssertionFailure() {\n  return AssertionResult(false);\n}\n\n// Makes a failed assertion result with the given failure message.\n// Deprecated; use AssertionFailure() << message.\nAssertionResult AssertionFailure(const Message& message) {\n  return AssertionFailure() << message;\n}\n\nnamespace internal {\n\nnamespace edit_distance {\nstd::vector<EditType> CalculateOptimalEdits(const std::vector<size_t>& left,\n                                            const std::vector<size_t>& right) {\n  std::vector<std::vector<double> > costs(\n      left.size() + 1, std::vector<double>(right.size() + 1));\n  std::vector<std::vector<EditType> > best_move(\n      left.size() + 1, std::vector<EditType>(right.size() + 1));\n\n  // Populate for empty right.\n  for (size_t l_i = 0; l_i < costs.size(); ++l_i) {\n    costs[l_i][0] = static_cast<double>(l_i);\n    best_move[l_i][0] = kRemove;\n  }\n  // Populate for empty left.\n  for (size_t r_i = 1; r_i < costs[0].size(); ++r_i) {\n    costs[0][r_i] = static_cast<double>(r_i);\n    best_move[0][r_i] = kAdd;\n  }\n\n  for (size_t l_i = 0; l_i < left.size(); ++l_i) {\n    for (size_t r_i = 0; r_i < right.size(); ++r_i) {\n      if (left[l_i] == right[r_i]) {\n        // Found a match. Consume it.\n        costs[l_i + 1][r_i + 1] = costs[l_i][r_i];\n        best_move[l_i + 1][r_i + 1] = kMatch;\n        continue;\n      }\n\n      const double add = costs[l_i + 1][r_i];\n      const double remove = costs[l_i][r_i + 1];\n      const double replace = costs[l_i][r_i];\n      if (add < remove && add < replace) {\n        costs[l_i + 1][r_i + 1] = add + 1;\n        best_move[l_i + 1][r_i + 1] = kAdd;\n      } else if (remove < add && remove < replace) {\n        costs[l_i + 1][r_i + 1] = remove + 1;\n        best_move[l_i + 1][r_i + 1] = kRemove;\n      } else {\n        // We make replace a little more expensive than add/remove to lower\n        // their priority.\n        costs[l_i + 1][r_i + 1] = replace + 1.00001;\n        best_move[l_i + 1][r_i + 1] = kReplace;\n      }\n    }\n  }\n\n  // Reconstruct the best path. We do it in reverse order.\n  std::vector<EditType> best_path;\n  for (size_t l_i = left.size(), r_i = right.size(); l_i > 0 || r_i > 0;) {\n    EditType move = best_move[l_i][r_i];\n    best_path.push_back(move);\n    l_i -= move != kAdd;\n    r_i -= move != kRemove;\n  }\n  std::reverse(best_path.begin(), best_path.end());\n  return best_path;\n}\n\nnamespace {\n\n// Helper class to convert string into ids with deduplication.\nclass InternalStrings {\n public:\n  size_t GetId(const std::string& str) {\n    IdMap::iterator it = ids_.find(str);\n    if (it != ids_.end()) return it->second;\n    size_t id = ids_.size();\n    return ids_[str] = id;\n  }\n\n private:\n  typedef std::map<std::string, size_t> IdMap;\n  IdMap ids_;\n};\n\n}  // namespace\n\nstd::vector<EditType> CalculateOptimalEdits(\n    const std::vector<std::string>& left,\n    const std::vector<std::string>& right) {\n  std::vector<size_t> left_ids, right_ids;\n  {\n    InternalStrings intern_table;\n    for (size_t i = 0; i < left.size(); ++i) {\n      left_ids.push_back(intern_table.GetId(left[i]));\n    }\n    for (size_t i = 0; i < right.size(); ++i) {\n      right_ids.push_back(intern_table.GetId(right[i]));\n    }\n  }\n  return CalculateOptimalEdits(left_ids, right_ids);\n}\n\nnamespace {\n\n// Helper class that holds the state for one hunk and prints it out to the\n// stream.\n// It reorders adds/removes when possible to group all removes before all\n// adds. It also adds the hunk header before printint into the stream.\nclass Hunk {\n public:\n  Hunk(size_t left_start, size_t right_start)\n      : left_start_(left_start),\n        right_start_(right_start),\n        adds_(),\n        removes_(),\n        common_() {}\n\n  void PushLine(char edit, const char* line) {\n    switch (edit) {\n      case ' ':\n        ++common_;\n        FlushEdits();\n        hunk_.push_back(std::make_pair(' ', line));\n        break;\n      case '-':\n        ++removes_;\n        hunk_removes_.push_back(std::make_pair('-', line));\n        break;\n      case '+':\n        ++adds_;\n        hunk_adds_.push_back(std::make_pair('+', line));\n        break;\n    }\n  }\n\n  void PrintTo(std::ostream* os) {\n    PrintHeader(os);\n    FlushEdits();\n    for (std::list<std::pair<char, const char*> >::const_iterator it =\n             hunk_.begin();\n         it != hunk_.end(); ++it) {\n      *os << it->first << it->second << \"\\n\";\n    }\n  }\n\n  bool has_edits() const { return adds_ || removes_; }\n\n private:\n  void FlushEdits() {\n    hunk_.splice(hunk_.end(), hunk_removes_);\n    hunk_.splice(hunk_.end(), hunk_adds_);\n  }\n\n  // Print a unified diff header for one hunk.\n  // The format is\n  //   \"@@ -<left_start>,<left_length> +<right_start>,<right_length> @@\"\n  // where the left/right parts are omitted if unnecessary.\n  void PrintHeader(std::ostream* ss) const {\n    *ss << \"@@ \";\n    if (removes_) {\n      *ss << \"-\" << left_start_ << \",\" << (removes_ + common_);\n    }\n    if (removes_ && adds_) {\n      *ss << \" \";\n    }\n    if (adds_) {\n      *ss << \"+\" << right_start_ << \",\" << (adds_ + common_);\n    }\n    *ss << \" @@\\n\";\n  }\n\n  size_t left_start_, right_start_;\n  size_t adds_, removes_, common_;\n  std::list<std::pair<char, const char*> > hunk_, hunk_adds_, hunk_removes_;\n};\n\n}  // namespace\n\n// Create a list of diff hunks in Unified diff format.\n// Each hunk has a header generated by PrintHeader above plus a body with\n// lines prefixed with ' ' for no change, '-' for deletion and '+' for\n// addition.\n// 'context' represents the desired unchanged prefix/suffix around the diff.\n// If two hunks are close enough that their contexts overlap, then they are\n// joined into one hunk.\nstd::string CreateUnifiedDiff(const std::vector<std::string>& left,\n                              const std::vector<std::string>& right,\n                              size_t context) {\n  const std::vector<EditType> edits = CalculateOptimalEdits(left, right);\n\n  size_t l_i = 0, r_i = 0, edit_i = 0;\n  std::stringstream ss;\n  while (edit_i < edits.size()) {\n    // Find first edit.\n    while (edit_i < edits.size() && edits[edit_i] == kMatch) {\n      ++l_i;\n      ++r_i;\n      ++edit_i;\n    }\n\n    // Find the first line to include in the hunk.\n    const size_t prefix_context = std::min(l_i, context);\n    Hunk hunk(l_i - prefix_context + 1, r_i - prefix_context + 1);\n    for (size_t i = prefix_context; i > 0; --i) {\n      hunk.PushLine(' ', left[l_i - i].c_str());\n    }\n\n    // Iterate the edits until we found enough suffix for the hunk or the input\n    // is over.\n    size_t n_suffix = 0;\n    for (; edit_i < edits.size(); ++edit_i) {\n      if (n_suffix >= context) {\n        // Continue only if the next hunk is very close.\n        auto it = edits.begin() + static_cast<int>(edit_i);\n        while (it != edits.end() && *it == kMatch) ++it;\n        if (it == edits.end() ||\n            static_cast<size_t>(it - edits.begin()) - edit_i >= context) {\n          // There is no next edit or it is too far away.\n          break;\n        }\n      }\n\n      EditType edit = edits[edit_i];\n      // Reset count when a non match is found.\n      n_suffix = edit == kMatch ? n_suffix + 1 : 0;\n\n      if (edit == kMatch || edit == kRemove || edit == kReplace) {\n        hunk.PushLine(edit == kMatch ? ' ' : '-', left[l_i].c_str());\n      }\n      if (edit == kAdd || edit == kReplace) {\n        hunk.PushLine('+', right[r_i].c_str());\n      }\n\n      // Advance indices, depending on edit type.\n      l_i += edit != kAdd;\n      r_i += edit != kRemove;\n    }\n\n    if (!hunk.has_edits()) {\n      // We are done. We don't want this hunk.\n      break;\n    }\n\n    hunk.PrintTo(&ss);\n  }\n  return ss.str();\n}\n\n}  // namespace edit_distance\n\nnamespace {\n\n// The string representation of the values received in EqFailure() are already\n// escaped. Split them on escaped '\\n' boundaries. Leave all other escaped\n// characters the same.\nstd::vector<std::string> SplitEscapedString(const std::string& str) {\n  std::vector<std::string> lines;\n  size_t start = 0, end = str.size();\n  if (end > 2 && str[0] == '\"' && str[end - 1] == '\"') {\n    ++start;\n    --end;\n  }\n  bool escaped = false;\n  for (size_t i = start; i + 1 < end; ++i) {\n    if (escaped) {\n      escaped = false;\n      if (str[i] == 'n') {\n        lines.push_back(str.substr(start, i - start - 1));\n        start = i + 1;\n      }\n    } else {\n      escaped = str[i] == '\\\\';\n    }\n  }\n  lines.push_back(str.substr(start, end - start));\n  return lines;\n}\n\n}  // namespace\n\n// Constructs and returns the message for an equality assertion\n// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.\n//\n// The first four parameters are the expressions used in the assertion\n// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)\n// where foo is 5 and bar is 6, we have:\n//\n//   lhs_expression: \"foo\"\n//   rhs_expression: \"bar\"\n//   lhs_value:      \"5\"\n//   rhs_value:      \"6\"\n//\n// The ignoring_case parameter is true if and only if the assertion is a\n// *_STRCASEEQ*.  When it's true, the string \"Ignoring case\" will\n// be inserted into the message.\nAssertionResult EqFailure(const char* lhs_expression,\n                          const char* rhs_expression,\n                          const std::string& lhs_value,\n                          const std::string& rhs_value,\n                          bool ignoring_case) {\n  Message msg;\n  msg << \"Expected equality of these values:\";\n  msg << \"\\n  \" << lhs_expression;\n  if (lhs_value != lhs_expression) {\n    msg << \"\\n    Which is: \" << lhs_value;\n  }\n  msg << \"\\n  \" << rhs_expression;\n  if (rhs_value != rhs_expression) {\n    msg << \"\\n    Which is: \" << rhs_value;\n  }\n\n  if (ignoring_case) {\n    msg << \"\\nIgnoring case\";\n  }\n\n  if (!lhs_value.empty() && !rhs_value.empty()) {\n    const std::vector<std::string> lhs_lines =\n        SplitEscapedString(lhs_value);\n    const std::vector<std::string> rhs_lines =\n        SplitEscapedString(rhs_value);\n    if (lhs_lines.size() > 1 || rhs_lines.size() > 1) {\n      msg << \"\\nWith diff:\\n\"\n          << edit_distance::CreateUnifiedDiff(lhs_lines, rhs_lines);\n    }\n  }\n\n  return AssertionFailure() << msg;\n}\n\n// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.\nstd::string GetBoolAssertionFailureMessage(\n    const AssertionResult& assertion_result,\n    const char* expression_text,\n    const char* actual_predicate_value,\n    const char* expected_predicate_value) {\n  const char* actual_message = assertion_result.message();\n  Message msg;\n  msg << \"Value of: \" << expression_text\n      << \"\\n  Actual: \" << actual_predicate_value;\n  if (actual_message[0] != '\\0')\n    msg << \" (\" << actual_message << \")\";\n  msg << \"\\nExpected: \" << expected_predicate_value;\n  return msg.GetString();\n}\n\n// Helper function for implementing ASSERT_NEAR.\nAssertionResult DoubleNearPredFormat(const char* expr1,\n                                     const char* expr2,\n                                     const char* abs_error_expr,\n                                     double val1,\n                                     double val2,\n                                     double abs_error) {\n  const double diff = fabs(val1 - val2);\n  if (diff <= abs_error) return AssertionSuccess();\n\n  // Find the value which is closest to zero.\n  const double min_abs = std::min(fabs(val1), fabs(val2));\n  // Find the distance to the next double from that value.\n  const double epsilon =\n      nextafter(min_abs, std::numeric_limits<double>::infinity()) - min_abs;\n  // Detect the case where abs_error is so small that EXPECT_NEAR is\n  // effectively the same as EXPECT_EQUAL, and give an informative error\n  // message so that the situation can be more easily understood without\n  // requiring exotic floating-point knowledge.\n  // Don't do an epsilon check if abs_error is zero because that implies\n  // that an equality check was actually intended.\n  if (!(std::isnan)(val1) && !(std::isnan)(val2) && abs_error > 0 &&\n      abs_error < epsilon) {\n    return AssertionFailure()\n           << \"The difference between \" << expr1 << \" and \" << expr2 << \" is \"\n           << diff << \", where\\n\"\n           << expr1 << \" evaluates to \" << val1 << \",\\n\"\n           << expr2 << \" evaluates to \" << val2 << \".\\nThe abs_error parameter \"\n           << abs_error_expr << \" evaluates to \" << abs_error\n           << \" which is smaller than the minimum distance between doubles for \"\n              \"numbers of this magnitude which is \"\n           << epsilon\n           << \", thus making this EXPECT_NEAR check equivalent to \"\n              \"EXPECT_EQUAL. Consider using EXPECT_DOUBLE_EQ instead.\";\n  }\n  return AssertionFailure()\n      << \"The difference between \" << expr1 << \" and \" << expr2\n      << \" is \" << diff << \", which exceeds \" << abs_error_expr << \", where\\n\"\n      << expr1 << \" evaluates to \" << val1 << \",\\n\"\n      << expr2 << \" evaluates to \" << val2 << \", and\\n\"\n      << abs_error_expr << \" evaluates to \" << abs_error << \".\";\n}\n\n\n// Helper template for implementing FloatLE() and DoubleLE().\ntemplate <typename RawType>\nAssertionResult FloatingPointLE(const char* expr1,\n                                const char* expr2,\n                                RawType val1,\n                                RawType val2) {\n  // Returns success if val1 is less than val2,\n  if (val1 < val2) {\n    return AssertionSuccess();\n  }\n\n  // or if val1 is almost equal to val2.\n  const FloatingPoint<RawType> lhs(val1), rhs(val2);\n  if (lhs.AlmostEquals(rhs)) {\n    return AssertionSuccess();\n  }\n\n  // Note that the above two checks will both fail if either val1 or\n  // val2 is NaN, as the IEEE floating-point standard requires that\n  // any predicate involving a NaN must return false.\n\n  ::std::stringstream val1_ss;\n  val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)\n          << val1;\n\n  ::std::stringstream val2_ss;\n  val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)\n          << val2;\n\n  return AssertionFailure()\n      << \"Expected: (\" << expr1 << \") <= (\" << expr2 << \")\\n\"\n      << \"  Actual: \" << StringStreamToString(&val1_ss) << \" vs \"\n      << StringStreamToString(&val2_ss);\n}\n\n}  // namespace internal\n\n// Asserts that val1 is less than, or almost equal to, val2.  Fails\n// otherwise.  In particular, it fails if either val1 or val2 is NaN.\nAssertionResult FloatLE(const char* expr1, const char* expr2,\n                        float val1, float val2) {\n  return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);\n}\n\n// Asserts that val1 is less than, or almost equal to, val2.  Fails\n// otherwise.  In particular, it fails if either val1 or val2 is NaN.\nAssertionResult DoubleLE(const char* expr1, const char* expr2,\n                         double val1, double val2) {\n  return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);\n}\n\nnamespace internal {\n\n// The helper function for {ASSERT|EXPECT}_STREQ.\nAssertionResult CmpHelperSTREQ(const char* lhs_expression,\n                               const char* rhs_expression,\n                               const char* lhs,\n                               const char* rhs) {\n  if (String::CStringEquals(lhs, rhs)) {\n    return AssertionSuccess();\n  }\n\n  return EqFailure(lhs_expression,\n                   rhs_expression,\n                   PrintToString(lhs),\n                   PrintToString(rhs),\n                   false);\n}\n\n// The helper function for {ASSERT|EXPECT}_STRCASEEQ.\nAssertionResult CmpHelperSTRCASEEQ(const char* lhs_expression,\n                                   const char* rhs_expression,\n                                   const char* lhs,\n                                   const char* rhs) {\n  if (String::CaseInsensitiveCStringEquals(lhs, rhs)) {\n    return AssertionSuccess();\n  }\n\n  return EqFailure(lhs_expression,\n                   rhs_expression,\n                   PrintToString(lhs),\n                   PrintToString(rhs),\n                   true);\n}\n\n// The helper function for {ASSERT|EXPECT}_STRNE.\nAssertionResult CmpHelperSTRNE(const char* s1_expression,\n                               const char* s2_expression,\n                               const char* s1,\n                               const char* s2) {\n  if (!String::CStringEquals(s1, s2)) {\n    return AssertionSuccess();\n  } else {\n    return AssertionFailure() << \"Expected: (\" << s1_expression << \") != (\"\n                              << s2_expression << \"), actual: \\\"\"\n                              << s1 << \"\\\" vs \\\"\" << s2 << \"\\\"\";\n  }\n}\n\n// The helper function for {ASSERT|EXPECT}_STRCASENE.\nAssertionResult CmpHelperSTRCASENE(const char* s1_expression,\n                                   const char* s2_expression,\n                                   const char* s1,\n                                   const char* s2) {\n  if (!String::CaseInsensitiveCStringEquals(s1, s2)) {\n    return AssertionSuccess();\n  } else {\n    return AssertionFailure()\n        << \"Expected: (\" << s1_expression << \") != (\"\n        << s2_expression << \") (ignoring case), actual: \\\"\"\n        << s1 << \"\\\" vs \\\"\" << s2 << \"\\\"\";\n  }\n}\n\n}  // namespace internal\n\nnamespace {\n\n// Helper functions for implementing IsSubString() and IsNotSubstring().\n\n// This group of overloaded functions return true if and only if needle\n// is a substring of haystack.  NULL is considered a substring of\n// itself only.\n\nbool IsSubstringPred(const char* needle, const char* haystack) {\n  if (needle == nullptr || haystack == nullptr) return needle == haystack;\n\n  return strstr(haystack, needle) != nullptr;\n}\n\nbool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {\n  if (needle == nullptr || haystack == nullptr) return needle == haystack;\n\n  return wcsstr(haystack, needle) != nullptr;\n}\n\n// StringType here can be either ::std::string or ::std::wstring.\ntemplate <typename StringType>\nbool IsSubstringPred(const StringType& needle,\n                     const StringType& haystack) {\n  return haystack.find(needle) != StringType::npos;\n}\n\n// This function implements either IsSubstring() or IsNotSubstring(),\n// depending on the value of the expected_to_be_substring parameter.\n// StringType here can be const char*, const wchar_t*, ::std::string,\n// or ::std::wstring.\ntemplate <typename StringType>\nAssertionResult IsSubstringImpl(\n    bool expected_to_be_substring,\n    const char* needle_expr, const char* haystack_expr,\n    const StringType& needle, const StringType& haystack) {\n  if (IsSubstringPred(needle, haystack) == expected_to_be_substring)\n    return AssertionSuccess();\n\n  const bool is_wide_string = sizeof(needle[0]) > 1;\n  const char* const begin_string_quote = is_wide_string ? \"L\\\"\" : \"\\\"\";\n  return AssertionFailure()\n      << \"Value of: \" << needle_expr << \"\\n\"\n      << \"  Actual: \" << begin_string_quote << needle << \"\\\"\\n\"\n      << \"Expected: \" << (expected_to_be_substring ? \"\" : \"not \")\n      << \"a substring of \" << haystack_expr << \"\\n\"\n      << \"Which is: \" << begin_string_quote << haystack << \"\\\"\";\n}\n\n}  // namespace\n\n// IsSubstring() and IsNotSubstring() check whether needle is a\n// substring of haystack (NULL is considered a substring of itself\n// only), and return an appropriate error message when they fail.\n\nAssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const char* needle, const char* haystack) {\n  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const wchar_t* needle, const wchar_t* haystack) {\n  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const char* needle, const char* haystack) {\n  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const wchar_t* needle, const wchar_t* haystack) {\n  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::string& needle, const ::std::string& haystack) {\n  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::string& needle, const ::std::string& haystack) {\n  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);\n}\n\n#if GTEST_HAS_STD_WSTRING\nAssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::wstring& needle, const ::std::wstring& haystack) {\n  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::wstring& needle, const ::std::wstring& haystack) {\n  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);\n}\n#endif  // GTEST_HAS_STD_WSTRING\n\nnamespace internal {\n\n#if GTEST_OS_WINDOWS\n\nnamespace {\n\n// Helper function for IsHRESULT{SuccessFailure} predicates\nAssertionResult HRESULTFailureHelper(const char* expr,\n                                     const char* expected,\n                                     long hr) {  // NOLINT\n# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_TV_TITLE\n\n  // Windows CE doesn't support FormatMessage.\n  const char error_text[] = \"\";\n\n# else\n\n  // Looks up the human-readable system message for the HRESULT code\n  // and since we're not passing any params to FormatMessage, we don't\n  // want inserts expanded.\n  const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |\n                       FORMAT_MESSAGE_IGNORE_INSERTS;\n  const DWORD kBufSize = 4096;\n  // Gets the system's human readable message string for this HRESULT.\n  char error_text[kBufSize] = { '\\0' };\n  DWORD message_length = ::FormatMessageA(kFlags,\n                                          0,   // no source, we're asking system\n                                          static_cast<DWORD>(hr),  // the error\n                                          0,   // no line width restrictions\n                                          error_text,  // output buffer\n                                          kBufSize,    // buf size\n                                          nullptr);  // no arguments for inserts\n  // Trims tailing white space (FormatMessage leaves a trailing CR-LF)\n  for (; message_length && IsSpace(error_text[message_length - 1]);\n          --message_length) {\n    error_text[message_length - 1] = '\\0';\n  }\n\n# endif  // GTEST_OS_WINDOWS_MOBILE\n\n  const std::string error_hex(\"0x\" + String::FormatHexInt(hr));\n  return ::testing::AssertionFailure()\n      << \"Expected: \" << expr << \" \" << expected << \".\\n\"\n      << \"  Actual: \" << error_hex << \" \" << error_text << \"\\n\";\n}\n\n}  // namespace\n\nAssertionResult IsHRESULTSuccess(const char* expr, long hr) {  // NOLINT\n  if (SUCCEEDED(hr)) {\n    return AssertionSuccess();\n  }\n  return HRESULTFailureHelper(expr, \"succeeds\", hr);\n}\n\nAssertionResult IsHRESULTFailure(const char* expr, long hr) {  // NOLINT\n  if (FAILED(hr)) {\n    return AssertionSuccess();\n  }\n  return HRESULTFailureHelper(expr, \"fails\", hr);\n}\n\n#endif  // GTEST_OS_WINDOWS\n\n// Utility functions for encoding Unicode text (wide strings) in\n// UTF-8.\n\n// A Unicode code-point can have up to 21 bits, and is encoded in UTF-8\n// like this:\n//\n// Code-point length   Encoding\n//   0 -  7 bits       0xxxxxxx\n//   8 - 11 bits       110xxxxx 10xxxxxx\n//  12 - 16 bits       1110xxxx 10xxxxxx 10xxxxxx\n//  17 - 21 bits       11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n\n// The maximum code-point a one-byte UTF-8 sequence can represent.\nconstexpr uint32_t kMaxCodePoint1 = (static_cast<uint32_t>(1) <<  7) - 1;\n\n// The maximum code-point a two-byte UTF-8 sequence can represent.\nconstexpr uint32_t kMaxCodePoint2 = (static_cast<uint32_t>(1) << (5 + 6)) - 1;\n\n// The maximum code-point a three-byte UTF-8 sequence can represent.\nconstexpr uint32_t kMaxCodePoint3 = (static_cast<uint32_t>(1) << (4 + 2*6)) - 1;\n\n// The maximum code-point a four-byte UTF-8 sequence can represent.\nconstexpr uint32_t kMaxCodePoint4 = (static_cast<uint32_t>(1) << (3 + 3*6)) - 1;\n\n// Chops off the n lowest bits from a bit pattern.  Returns the n\n// lowest bits.  As a side effect, the original bit pattern will be\n// shifted to the right by n bits.\ninline uint32_t ChopLowBits(uint32_t* bits, int n) {\n  const uint32_t low_bits = *bits & ((static_cast<uint32_t>(1) << n) - 1);\n  *bits >>= n;\n  return low_bits;\n}\n\n// Converts a Unicode code point to a narrow string in UTF-8 encoding.\n// code_point parameter is of type uint32_t because wchar_t may not be\n// wide enough to contain a code point.\n// If the code_point is not a valid Unicode code point\n// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted\n// to \"(Invalid Unicode 0xXXXXXXXX)\".\nstd::string CodePointToUtf8(uint32_t code_point) {\n  if (code_point > kMaxCodePoint4) {\n    return \"(Invalid Unicode 0x\" + String::FormatHexUInt32(code_point) + \")\";\n  }\n\n  char str[5];  // Big enough for the largest valid code point.\n  if (code_point <= kMaxCodePoint1) {\n    str[1] = '\\0';\n    str[0] = static_cast<char>(code_point);                          // 0xxxxxxx\n  } else if (code_point <= kMaxCodePoint2) {\n    str[2] = '\\0';\n    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[0] = static_cast<char>(0xC0 | code_point);                   // 110xxxxx\n  } else if (code_point <= kMaxCodePoint3) {\n    str[3] = '\\0';\n    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[0] = static_cast<char>(0xE0 | code_point);                   // 1110xxxx\n  } else {  // code_point <= kMaxCodePoint4\n    str[4] = '\\0';\n    str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[0] = static_cast<char>(0xF0 | code_point);                   // 11110xxx\n  }\n  return str;\n}\n\n// The following two functions only make sense if the system\n// uses UTF-16 for wide string encoding. All supported systems\n// with 16 bit wchar_t (Windows, Cygwin) do use UTF-16.\n\n// Determines if the arguments constitute UTF-16 surrogate pair\n// and thus should be combined into a single Unicode code point\n// using CreateCodePointFromUtf16SurrogatePair.\ninline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {\n  return sizeof(wchar_t) == 2 &&\n      (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;\n}\n\n// Creates a Unicode code point from UTF16 surrogate pair.\ninline uint32_t CreateCodePointFromUtf16SurrogatePair(wchar_t first,\n                                                      wchar_t second) {\n  const auto first_u = static_cast<uint32_t>(first);\n  const auto second_u = static_cast<uint32_t>(second);\n  const uint32_t mask = (1 << 10) - 1;\n  return (sizeof(wchar_t) == 2)\n             ? (((first_u & mask) << 10) | (second_u & mask)) + 0x10000\n             :\n             // This function should not be called when the condition is\n             // false, but we provide a sensible default in case it is.\n             first_u;\n}\n\n// Converts a wide string to a narrow string in UTF-8 encoding.\n// The wide string is assumed to have the following encoding:\n//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin)\n//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)\n// Parameter str points to a null-terminated wide string.\n// Parameter num_chars may additionally limit the number\n// of wchar_t characters processed. -1 is used when the entire string\n// should be processed.\n// If the string contains code points that are not valid Unicode code points\n// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output\n// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding\n// and contains invalid UTF-16 surrogate pairs, values in those pairs\n// will be encoded as individual Unicode characters from Basic Normal Plane.\nstd::string WideStringToUtf8(const wchar_t* str, int num_chars) {\n  if (num_chars == -1)\n    num_chars = static_cast<int>(wcslen(str));\n\n  ::std::stringstream stream;\n  for (int i = 0; i < num_chars; ++i) {\n    uint32_t unicode_code_point;\n\n    if (str[i] == L'\\0') {\n      break;\n    } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) {\n      unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i],\n                                                                 str[i + 1]);\n      i++;\n    } else {\n      unicode_code_point = static_cast<uint32_t>(str[i]);\n    }\n\n    stream << CodePointToUtf8(unicode_code_point);\n  }\n  return StringStreamToString(&stream);\n}\n\n// Converts a wide C string to an std::string using the UTF-8 encoding.\n// NULL will be converted to \"(null)\".\nstd::string String::ShowWideCString(const wchar_t * wide_c_str) {\n  if (wide_c_str == nullptr) return \"(null)\";\n\n  return internal::WideStringToUtf8(wide_c_str, -1);\n}\n\n// Compares two wide C strings.  Returns true if and only if they have the\n// same content.\n//\n// Unlike wcscmp(), this function can handle NULL argument(s).  A NULL\n// C string is considered different to any non-NULL C string,\n// including the empty string.\nbool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {\n  if (lhs == nullptr) return rhs == nullptr;\n\n  if (rhs == nullptr) return false;\n\n  return wcscmp(lhs, rhs) == 0;\n}\n\n// Helper function for *_STREQ on wide strings.\nAssertionResult CmpHelperSTREQ(const char* lhs_expression,\n                               const char* rhs_expression,\n                               const wchar_t* lhs,\n                               const wchar_t* rhs) {\n  if (String::WideCStringEquals(lhs, rhs)) {\n    return AssertionSuccess();\n  }\n\n  return EqFailure(lhs_expression,\n                   rhs_expression,\n                   PrintToString(lhs),\n                   PrintToString(rhs),\n                   false);\n}\n\n// Helper function for *_STRNE on wide strings.\nAssertionResult CmpHelperSTRNE(const char* s1_expression,\n                               const char* s2_expression,\n                               const wchar_t* s1,\n                               const wchar_t* s2) {\n  if (!String::WideCStringEquals(s1, s2)) {\n    return AssertionSuccess();\n  }\n\n  return AssertionFailure() << \"Expected: (\" << s1_expression << \") != (\"\n                            << s2_expression << \"), actual: \"\n                            << PrintToString(s1)\n                            << \" vs \" << PrintToString(s2);\n}\n\n// Compares two C strings, ignoring case.  Returns true if and only if they have\n// the same content.\n//\n// Unlike strcasecmp(), this function can handle NULL argument(s).  A\n// NULL C string is considered different to any non-NULL C string,\n// including the empty string.\nbool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {\n  if (lhs == nullptr) return rhs == nullptr;\n  if (rhs == nullptr) return false;\n  return posix::StrCaseCmp(lhs, rhs) == 0;\n}\n\n// Compares two wide C strings, ignoring case.  Returns true if and only if they\n// have the same content.\n//\n// Unlike wcscasecmp(), this function can handle NULL argument(s).\n// A NULL C string is considered different to any non-NULL wide C string,\n// including the empty string.\n// NB: The implementations on different platforms slightly differ.\n// On windows, this method uses _wcsicmp which compares according to LC_CTYPE\n// environment variable. On GNU platform this method uses wcscasecmp\n// which compares according to LC_CTYPE category of the current locale.\n// On MacOS X, it uses towlower, which also uses LC_CTYPE category of the\n// current locale.\nbool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,\n                                              const wchar_t* rhs) {\n  if (lhs == nullptr) return rhs == nullptr;\n\n  if (rhs == nullptr) return false;\n\n#if GTEST_OS_WINDOWS\n  return _wcsicmp(lhs, rhs) == 0;\n#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID\n  return wcscasecmp(lhs, rhs) == 0;\n#else\n  // Android, Mac OS X and Cygwin don't define wcscasecmp.\n  // Other unknown OSes may not define it either.\n  wint_t left, right;\n  do {\n    left = towlower(static_cast<wint_t>(*lhs++));\n    right = towlower(static_cast<wint_t>(*rhs++));\n  } while (left && left == right);\n  return left == right;\n#endif  // OS selector\n}\n\n// Returns true if and only if str ends with the given suffix, ignoring case.\n// Any string is considered to end with an empty suffix.\nbool String::EndsWithCaseInsensitive(\n    const std::string& str, const std::string& suffix) {\n  const size_t str_len = str.length();\n  const size_t suffix_len = suffix.length();\n  return (str_len >= suffix_len) &&\n         CaseInsensitiveCStringEquals(str.c_str() + str_len - suffix_len,\n                                      suffix.c_str());\n}\n\n// Formats an int value as \"%02d\".\nstd::string String::FormatIntWidth2(int value) {\n  return FormatIntWidthN(value, 2);\n}\n\n// Formats an int value to given width with leading zeros.\nstd::string String::FormatIntWidthN(int value, int width) {\n  std::stringstream ss;\n  ss << std::setfill('0') << std::setw(width) << value;\n  return ss.str();\n}\n\n// Formats an int value as \"%X\".\nstd::string String::FormatHexUInt32(uint32_t value) {\n  std::stringstream ss;\n  ss << std::hex << std::uppercase << value;\n  return ss.str();\n}\n\n// Formats an int value as \"%X\".\nstd::string String::FormatHexInt(int value) {\n  return FormatHexUInt32(static_cast<uint32_t>(value));\n}\n\n// Formats a byte as \"%02X\".\nstd::string String::FormatByte(unsigned char value) {\n  std::stringstream ss;\n  ss << std::setfill('0') << std::setw(2) << std::hex << std::uppercase\n     << static_cast<unsigned int>(value);\n  return ss.str();\n}\n\n// Converts the buffer in a stringstream to an std::string, converting NUL\n// bytes to \"\\\\0\" along the way.\nstd::string StringStreamToString(::std::stringstream* ss) {\n  const ::std::string& str = ss->str();\n  const char* const start = str.c_str();\n  const char* const end = start + str.length();\n\n  std::string result;\n  result.reserve(static_cast<size_t>(2 * (end - start)));\n  for (const char* ch = start; ch != end; ++ch) {\n    if (*ch == '\\0') {\n      result += \"\\\\0\";  // Replaces NUL with \"\\\\0\";\n    } else {\n      result += *ch;\n    }\n  }\n\n  return result;\n}\n\n// Appends the user-supplied message to the Google-Test-generated message.\nstd::string AppendUserMessage(const std::string& gtest_msg,\n                              const Message& user_msg) {\n  // Appends the user message if it's non-empty.\n  const std::string user_msg_string = user_msg.GetString();\n  if (user_msg_string.empty()) {\n    return gtest_msg;\n  }\n  if (gtest_msg.empty()) {\n    return user_msg_string;\n  }\n  return gtest_msg + \"\\n\" + user_msg_string;\n}\n\n}  // namespace internal\n\n// class TestResult\n\n// Creates an empty TestResult.\nTestResult::TestResult()\n    : death_test_count_(0), start_timestamp_(0), elapsed_time_(0) {}\n\n// D'tor.\nTestResult::~TestResult() {\n}\n\n// Returns the i-th test part result among all the results. i can\n// range from 0 to total_part_count() - 1. If i is not in that range,\n// aborts the program.\nconst TestPartResult& TestResult::GetTestPartResult(int i) const {\n  if (i < 0 || i >= total_part_count())\n    internal::posix::Abort();\n  return test_part_results_.at(static_cast<size_t>(i));\n}\n\n// Returns the i-th test property. i can range from 0 to\n// test_property_count() - 1. If i is not in that range, aborts the\n// program.\nconst TestProperty& TestResult::GetTestProperty(int i) const {\n  if (i < 0 || i >= test_property_count())\n    internal::posix::Abort();\n  return test_properties_.at(static_cast<size_t>(i));\n}\n\n// Clears the test part results.\nvoid TestResult::ClearTestPartResults() {\n  test_part_results_.clear();\n}\n\n// Adds a test part result to the list.\nvoid TestResult::AddTestPartResult(const TestPartResult& test_part_result) {\n  test_part_results_.push_back(test_part_result);\n}\n\n// Adds a test property to the list. If a property with the same key as the\n// supplied property is already represented, the value of this test_property\n// replaces the old value for that key.\nvoid TestResult::RecordProperty(const std::string& xml_element,\n                                const TestProperty& test_property) {\n  if (!ValidateTestProperty(xml_element, test_property)) {\n    return;\n  }\n  internal::MutexLock lock(&test_properties_mutex_);\n  const std::vector<TestProperty>::iterator property_with_matching_key =\n      std::find_if(test_properties_.begin(), test_properties_.end(),\n                   internal::TestPropertyKeyIs(test_property.key()));\n  if (property_with_matching_key == test_properties_.end()) {\n    test_properties_.push_back(test_property);\n    return;\n  }\n  property_with_matching_key->SetValue(test_property.value());\n}\n\n// The list of reserved attributes used in the <testsuites> element of XML\n// output.\nstatic const char* const kReservedTestSuitesAttributes[] = {\n  \"disabled\",\n  \"errors\",\n  \"failures\",\n  \"name\",\n  \"random_seed\",\n  \"tests\",\n  \"time\",\n  \"timestamp\"\n};\n\n// The list of reserved attributes used in the <testsuite> element of XML\n// output.\nstatic const char* const kReservedTestSuiteAttributes[] = {\n    \"disabled\", \"errors\", \"failures\",  \"name\",\n    \"tests\",    \"time\",   \"timestamp\", \"skipped\"};\n\n// The list of reserved attributes used in the <testcase> element of XML output.\nstatic const char* const kReservedTestCaseAttributes[] = {\n    \"classname\",   \"name\", \"status\", \"time\",  \"type_param\",\n    \"value_param\", \"file\", \"line\"};\n\n// Use a slightly different set for allowed output to ensure existing tests can\n// still RecordProperty(\"result\") or \"RecordProperty(timestamp\")\nstatic const char* const kReservedOutputTestCaseAttributes[] = {\n    \"classname\",   \"name\", \"status\", \"time\",   \"type_param\",\n    \"value_param\", \"file\", \"line\",   \"result\", \"timestamp\"};\n\ntemplate <size_t kSize>\nstd::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) {\n  return std::vector<std::string>(array, array + kSize);\n}\n\nstatic std::vector<std::string> GetReservedAttributesForElement(\n    const std::string& xml_element) {\n  if (xml_element == \"testsuites\") {\n    return ArrayAsVector(kReservedTestSuitesAttributes);\n  } else if (xml_element == \"testsuite\") {\n    return ArrayAsVector(kReservedTestSuiteAttributes);\n  } else if (xml_element == \"testcase\") {\n    return ArrayAsVector(kReservedTestCaseAttributes);\n  } else {\n    GTEST_CHECK_(false) << \"Unrecognized xml_element provided: \" << xml_element;\n  }\n  // This code is unreachable but some compilers may not realizes that.\n  return std::vector<std::string>();\n}\n\n// TODO(jdesprez): Merge the two getReserved attributes once skip is improved\nstatic std::vector<std::string> GetReservedOutputAttributesForElement(\n    const std::string& xml_element) {\n  if (xml_element == \"testsuites\") {\n    return ArrayAsVector(kReservedTestSuitesAttributes);\n  } else if (xml_element == \"testsuite\") {\n    return ArrayAsVector(kReservedTestSuiteAttributes);\n  } else if (xml_element == \"testcase\") {\n    return ArrayAsVector(kReservedOutputTestCaseAttributes);\n  } else {\n    GTEST_CHECK_(false) << \"Unrecognized xml_element provided: \" << xml_element;\n  }\n  // This code is unreachable but some compilers may not realizes that.\n  return std::vector<std::string>();\n}\n\nstatic std::string FormatWordList(const std::vector<std::string>& words) {\n  Message word_list;\n  for (size_t i = 0; i < words.size(); ++i) {\n    if (i > 0 && words.size() > 2) {\n      word_list << \", \";\n    }\n    if (i == words.size() - 1) {\n      word_list << \"and \";\n    }\n    word_list << \"'\" << words[i] << \"'\";\n  }\n  return word_list.GetString();\n}\n\nstatic bool ValidateTestPropertyName(\n    const std::string& property_name,\n    const std::vector<std::string>& reserved_names) {\n  if (std::find(reserved_names.begin(), reserved_names.end(), property_name) !=\n          reserved_names.end()) {\n    ADD_FAILURE() << \"Reserved key used in RecordProperty(): \" << property_name\n                  << \" (\" << FormatWordList(reserved_names)\n                  << \" are reserved by \" << GTEST_NAME_ << \")\";\n    return false;\n  }\n  return true;\n}\n\n// Adds a failure if the key is a reserved attribute of the element named\n// xml_element.  Returns true if the property is valid.\nbool TestResult::ValidateTestProperty(const std::string& xml_element,\n                                      const TestProperty& test_property) {\n  return ValidateTestPropertyName(test_property.key(),\n                                  GetReservedAttributesForElement(xml_element));\n}\n\n// Clears the object.\nvoid TestResult::Clear() {\n  test_part_results_.clear();\n  test_properties_.clear();\n  death_test_count_ = 0;\n  elapsed_time_ = 0;\n}\n\n// Returns true off the test part was skipped.\nstatic bool TestPartSkipped(const TestPartResult& result) {\n  return result.skipped();\n}\n\n// Returns true if and only if the test was skipped.\nbool TestResult::Skipped() const {\n  return !Failed() && CountIf(test_part_results_, TestPartSkipped) > 0;\n}\n\n// Returns true if and only if the test failed.\nbool TestResult::Failed() const {\n  for (int i = 0; i < total_part_count(); ++i) {\n    if (GetTestPartResult(i).failed())\n      return true;\n  }\n  return false;\n}\n\n// Returns true if and only if the test part fatally failed.\nstatic bool TestPartFatallyFailed(const TestPartResult& result) {\n  return result.fatally_failed();\n}\n\n// Returns true if and only if the test fatally failed.\nbool TestResult::HasFatalFailure() const {\n  return CountIf(test_part_results_, TestPartFatallyFailed) > 0;\n}\n\n// Returns true if and only if the test part non-fatally failed.\nstatic bool TestPartNonfatallyFailed(const TestPartResult& result) {\n  return result.nonfatally_failed();\n}\n\n// Returns true if and only if the test has a non-fatal failure.\nbool TestResult::HasNonfatalFailure() const {\n  return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;\n}\n\n// Gets the number of all test parts.  This is the sum of the number\n// of successful test parts and the number of failed test parts.\nint TestResult::total_part_count() const {\n  return static_cast<int>(test_part_results_.size());\n}\n\n// Returns the number of the test properties.\nint TestResult::test_property_count() const {\n  return static_cast<int>(test_properties_.size());\n}\n\n// class Test\n\n// Creates a Test object.\n\n// The c'tor saves the states of all flags.\nTest::Test()\n    : gtest_flag_saver_(new GTEST_FLAG_SAVER_) {\n}\n\n// The d'tor restores the states of all flags.  The actual work is\n// done by the d'tor of the gtest_flag_saver_ field, and thus not\n// visible here.\nTest::~Test() {\n}\n\n// Sets up the test fixture.\n//\n// A sub-class may override this.\nvoid Test::SetUp() {\n}\n\n// Tears down the test fixture.\n//\n// A sub-class may override this.\nvoid Test::TearDown() {\n}\n\n// Allows user supplied key value pairs to be recorded for later output.\nvoid Test::RecordProperty(const std::string& key, const std::string& value) {\n  UnitTest::GetInstance()->RecordProperty(key, value);\n}\n\n// Allows user supplied key value pairs to be recorded for later output.\nvoid Test::RecordProperty(const std::string& key, int value) {\n  Message value_message;\n  value_message << value;\n  RecordProperty(key, value_message.GetString().c_str());\n}\n\nnamespace internal {\n\nvoid ReportFailureInUnknownLocation(TestPartResult::Type result_type,\n                                    const std::string& message) {\n  // This function is a friend of UnitTest and as such has access to\n  // AddTestPartResult.\n  UnitTest::GetInstance()->AddTestPartResult(\n      result_type,\n      nullptr,  // No info about the source file where the exception occurred.\n      -1,       // We have no info on which line caused the exception.\n      message,\n      \"\");  // No stack trace, either.\n}\n\n}  // namespace internal\n\n// Google Test requires all tests in the same test suite to use the same test\n// fixture class.  This function checks if the current test has the\n// same fixture class as the first test in the current test suite.  If\n// yes, it returns true; otherwise it generates a Google Test failure and\n// returns false.\nbool Test::HasSameFixtureClass() {\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  const TestSuite* const test_suite = impl->current_test_suite();\n\n  // Info about the first test in the current test suite.\n  const TestInfo* const first_test_info = test_suite->test_info_list()[0];\n  const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_;\n  const char* const first_test_name = first_test_info->name();\n\n  // Info about the current test.\n  const TestInfo* const this_test_info = impl->current_test_info();\n  const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_;\n  const char* const this_test_name = this_test_info->name();\n\n  if (this_fixture_id != first_fixture_id) {\n    // Is the first test defined using TEST?\n    const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId();\n    // Is this test defined using TEST?\n    const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();\n\n    if (first_is_TEST || this_is_TEST) {\n      // Both TEST and TEST_F appear in same test suite, which is incorrect.\n      // Tell the user how to fix this.\n\n      // Gets the name of the TEST and the name of the TEST_F.  Note\n      // that first_is_TEST and this_is_TEST cannot both be true, as\n      // the fixture IDs are different for the two tests.\n      const char* const TEST_name =\n          first_is_TEST ? first_test_name : this_test_name;\n      const char* const TEST_F_name =\n          first_is_TEST ? this_test_name : first_test_name;\n\n      ADD_FAILURE()\n          << \"All tests in the same test suite must use the same test fixture\\n\"\n          << \"class, so mixing TEST_F and TEST in the same test suite is\\n\"\n          << \"illegal.  In test suite \" << this_test_info->test_suite_name()\n          << \",\\n\"\n          << \"test \" << TEST_F_name << \" is defined using TEST_F but\\n\"\n          << \"test \" << TEST_name << \" is defined using TEST.  You probably\\n\"\n          << \"want to change the TEST to TEST_F or move it to another test\\n\"\n          << \"case.\";\n    } else {\n      // Two fixture classes with the same name appear in two different\n      // namespaces, which is not allowed. Tell the user how to fix this.\n      ADD_FAILURE()\n          << \"All tests in the same test suite must use the same test fixture\\n\"\n          << \"class.  However, in test suite \"\n          << this_test_info->test_suite_name() << \",\\n\"\n          << \"you defined test \" << first_test_name << \" and test \"\n          << this_test_name << \"\\n\"\n          << \"using two different test fixture classes.  This can happen if\\n\"\n          << \"the two classes are from different namespaces or translation\\n\"\n          << \"units and have the same name.  You should probably rename one\\n\"\n          << \"of the classes to put the tests into different test suites.\";\n    }\n    return false;\n  }\n\n  return true;\n}\n\n#if GTEST_HAS_SEH\n\n// Adds an \"exception thrown\" fatal failure to the current test.  This\n// function returns its result via an output parameter pointer because VC++\n// prohibits creation of objects with destructors on stack in functions\n// using __try (see error C2712).\nstatic std::string* FormatSehExceptionMessage(DWORD exception_code,\n                                              const char* location) {\n  Message message;\n  message << \"SEH exception with code 0x\" << std::setbase(16) <<\n    exception_code << std::setbase(10) << \" thrown in \" << location << \".\";\n\n  return new std::string(message.GetString());\n}\n\n#endif  // GTEST_HAS_SEH\n\nnamespace internal {\n\n#if GTEST_HAS_EXCEPTIONS\n\n// Adds an \"exception thrown\" fatal failure to the current test.\nstatic std::string FormatCxxExceptionMessage(const char* description,\n                                             const char* location) {\n  Message message;\n  if (description != nullptr) {\n    message << \"C++ exception with description \\\"\" << description << \"\\\"\";\n  } else {\n    message << \"Unknown C++ exception\";\n  }\n  message << \" thrown in \" << location << \".\";\n\n  return message.GetString();\n}\n\nstatic std::string PrintTestPartResultToString(\n    const TestPartResult& test_part_result);\n\nGoogleTestFailureException::GoogleTestFailureException(\n    const TestPartResult& failure)\n    : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n// We put these helper functions in the internal namespace as IBM's xlC\n// compiler rejects the code if they were declared static.\n\n// Runs the given method and handles SEH exceptions it throws, when\n// SEH is supported; returns the 0-value for type Result in case of an\n// SEH exception.  (Microsoft compilers cannot handle SEH and C++\n// exceptions in the same function.  Therefore, we provide a separate\n// wrapper function for handling SEH exceptions.)\ntemplate <class T, typename Result>\nResult HandleSehExceptionsInMethodIfSupported(\n    T* object, Result (T::*method)(), const char* location) {\n#if GTEST_HAS_SEH\n  __try {\n    return (object->*method)();\n  } __except (internal::UnitTestOptions::GTestShouldProcessSEH(  // NOLINT\n      GetExceptionCode())) {\n    // We create the exception message on the heap because VC++ prohibits\n    // creation of objects with destructors on stack in functions using __try\n    // (see error C2712).\n    std::string* exception_message = FormatSehExceptionMessage(\n        GetExceptionCode(), location);\n    internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,\n                                             *exception_message);\n    delete exception_message;\n    return static_cast<Result>(0);\n  }\n#else\n  (void)location;\n  return (object->*method)();\n#endif  // GTEST_HAS_SEH\n}\n\n// Runs the given method and catches and reports C++ and/or SEH-style\n// exceptions, if they are supported; returns the 0-value for type\n// Result in case of an SEH exception.\ntemplate <class T, typename Result>\nResult HandleExceptionsInMethodIfSupported(\n    T* object, Result (T::*method)(), const char* location) {\n  // NOTE: The user code can affect the way in which Google Test handles\n  // exceptions by setting GTEST_FLAG(catch_exceptions), but only before\n  // RUN_ALL_TESTS() starts. It is technically possible to check the flag\n  // after the exception is caught and either report or re-throw the\n  // exception based on the flag's value:\n  //\n  // try {\n  //   // Perform the test method.\n  // } catch (...) {\n  //   if (GTEST_FLAG(catch_exceptions))\n  //     // Report the exception as failure.\n  //   else\n  //     throw;  // Re-throws the original exception.\n  // }\n  //\n  // However, the purpose of this flag is to allow the program to drop into\n  // the debugger when the exception is thrown. On most platforms, once the\n  // control enters the catch block, the exception origin information is\n  // lost and the debugger will stop the program at the point of the\n  // re-throw in this function -- instead of at the point of the original\n  // throw statement in the code under test.  For this reason, we perform\n  // the check early, sacrificing the ability to affect Google Test's\n  // exception handling in the method where the exception is thrown.\n  if (internal::GetUnitTestImpl()->catch_exceptions()) {\n#if GTEST_HAS_EXCEPTIONS\n    try {\n      return HandleSehExceptionsInMethodIfSupported(object, method, location);\n    } catch (const AssertionException&) {  // NOLINT\n      // This failure was reported already.\n    } catch (const internal::GoogleTestFailureException&) {  // NOLINT\n      // This exception type can only be thrown by a failed Google\n      // Test assertion with the intention of letting another testing\n      // framework catch it.  Therefore we just re-throw it.\n      throw;\n    } catch (const std::exception& e) {  // NOLINT\n      internal::ReportFailureInUnknownLocation(\n          TestPartResult::kFatalFailure,\n          FormatCxxExceptionMessage(e.what(), location));\n    } catch (...) {  // NOLINT\n      internal::ReportFailureInUnknownLocation(\n          TestPartResult::kFatalFailure,\n          FormatCxxExceptionMessage(nullptr, location));\n    }\n    return static_cast<Result>(0);\n#else\n    return HandleSehExceptionsInMethodIfSupported(object, method, location);\n#endif  // GTEST_HAS_EXCEPTIONS\n  } else {\n    return (object->*method)();\n  }\n}\n\n}  // namespace internal\n\n// Runs the test and updates the test result.\nvoid Test::Run() {\n  if (!HasSameFixtureClass()) return;\n\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n  internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, \"SetUp()\");\n  // We will run the test only if SetUp() was successful and didn't call\n  // GTEST_SKIP().\n  if (!HasFatalFailure() && !IsSkipped()) {\n    impl->os_stack_trace_getter()->UponLeavingGTest();\n    internal::HandleExceptionsInMethodIfSupported(\n        this, &Test::TestBody, \"the test body\");\n  }\n\n  // However, we want to clean up as much as possible.  Hence we will\n  // always call TearDown(), even if SetUp() or the test body has\n  // failed.\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n  internal::HandleExceptionsInMethodIfSupported(\n      this, &Test::TearDown, \"TearDown()\");\n}\n\n// Returns true if and only if the current test has a fatal failure.\nbool Test::HasFatalFailure() {\n  return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();\n}\n\n// Returns true if and only if the current test has a non-fatal failure.\nbool Test::HasNonfatalFailure() {\n  return internal::GetUnitTestImpl()->current_test_result()->\n      HasNonfatalFailure();\n}\n\n// Returns true if and only if the current test was skipped.\nbool Test::IsSkipped() {\n  return internal::GetUnitTestImpl()->current_test_result()->Skipped();\n}\n\n// class TestInfo\n\n// Constructs a TestInfo object. It assumes ownership of the test factory\n// object.\nTestInfo::TestInfo(const std::string& a_test_suite_name,\n                   const std::string& a_name, const char* a_type_param,\n                   const char* a_value_param,\n                   internal::CodeLocation a_code_location,\n                   internal::TypeId fixture_class_id,\n                   internal::TestFactoryBase* factory)\n    : test_suite_name_(a_test_suite_name),\n      name_(a_name),\n      type_param_(a_type_param ? new std::string(a_type_param) : nullptr),\n      value_param_(a_value_param ? new std::string(a_value_param) : nullptr),\n      location_(a_code_location),\n      fixture_class_id_(fixture_class_id),\n      should_run_(false),\n      is_disabled_(false),\n      matches_filter_(false),\n      is_in_another_shard_(false),\n      factory_(factory),\n      result_() {}\n\n// Destructs a TestInfo object.\nTestInfo::~TestInfo() { delete factory_; }\n\nnamespace internal {\n\n// Creates a new TestInfo object and registers it with Google Test;\n// returns the created object.\n//\n// Arguments:\n//\n//   test_suite_name:  name of the test suite\n//   name:             name of the test\n//   type_param:       the name of the test's type parameter, or NULL if\n//                     this is not a typed or a type-parameterized test.\n//   value_param:      text representation of the test's value parameter,\n//                     or NULL if this is not a value-parameterized test.\n//   code_location:    code location where the test is defined\n//   fixture_class_id: ID of the test fixture class\n//   set_up_tc:        pointer to the function that sets up the test suite\n//   tear_down_tc:     pointer to the function that tears down the test suite\n//   factory:          pointer to the factory that creates a test object.\n//                     The newly created TestInfo instance will assume\n//                     ownership of the factory object.\nTestInfo* MakeAndRegisterTestInfo(\n    const char* test_suite_name, const char* name, const char* type_param,\n    const char* value_param, CodeLocation code_location,\n    TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc,\n    TearDownTestSuiteFunc tear_down_tc, TestFactoryBase* factory) {\n  TestInfo* const test_info =\n      new TestInfo(test_suite_name, name, type_param, value_param,\n                   code_location, fixture_class_id, factory);\n  GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);\n  return test_info;\n}\n\nvoid ReportInvalidTestSuiteType(const char* test_suite_name,\n                                CodeLocation code_location) {\n  Message errors;\n  errors\n      << \"Attempted redefinition of test suite \" << test_suite_name << \".\\n\"\n      << \"All tests in the same test suite must use the same test fixture\\n\"\n      << \"class.  However, in test suite \" << test_suite_name << \", you tried\\n\"\n      << \"to define a test using a fixture class different from the one\\n\"\n      << \"used earlier. This can happen if the two fixture classes are\\n\"\n      << \"from different namespaces and have the same name. You should\\n\"\n      << \"probably rename one of the classes to put the tests into different\\n\"\n      << \"test suites.\";\n\n  GTEST_LOG_(ERROR) << FormatFileLocation(code_location.file.c_str(),\n                                          code_location.line)\n                    << \" \" << errors.GetString();\n}\n}  // namespace internal\n\nnamespace {\n\n// A predicate that checks the test name of a TestInfo against a known\n// value.\n//\n// This is used for implementation of the TestSuite class only.  We put\n// it in the anonymous namespace to prevent polluting the outer\n// namespace.\n//\n// TestNameIs is copyable.\nclass TestNameIs {\n public:\n  // Constructor.\n  //\n  // TestNameIs has NO default constructor.\n  explicit TestNameIs(const char* name)\n      : name_(name) {}\n\n  // Returns true if and only if the test name of test_info matches name_.\n  bool operator()(const TestInfo * test_info) const {\n    return test_info && test_info->name() == name_;\n  }\n\n private:\n  std::string name_;\n};\n\n}  // namespace\n\nnamespace internal {\n\n// This method expands all parameterized tests registered with macros TEST_P\n// and INSTANTIATE_TEST_SUITE_P into regular tests and registers those.\n// This will be done just once during the program runtime.\nvoid UnitTestImpl::RegisterParameterizedTests() {\n  if (!parameterized_tests_registered_) {\n    parameterized_test_registry_.RegisterTests();\n    type_parameterized_test_registry_.CheckForInstantiations();\n    parameterized_tests_registered_ = true;\n  }\n}\n\n}  // namespace internal\n\n// Creates the test object, runs it, records its result, and then\n// deletes it.\nvoid TestInfo::Run() {\n  if (!should_run_) return;\n\n  // Tells UnitTest where to store test result.\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  impl->set_current_test_info(this);\n\n  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();\n\n  // Notifies the unit test event listeners that a test is about to start.\n  repeater->OnTestStart(*this);\n\n  result_.set_start_timestamp(internal::GetTimeInMillis());\n  internal::Timer timer;\n\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n\n  // Creates the test object.\n  Test* const test = internal::HandleExceptionsInMethodIfSupported(\n      factory_, &internal::TestFactoryBase::CreateTest,\n      \"the test fixture's constructor\");\n\n  // Runs the test if the constructor didn't generate a fatal failure or invoke\n  // GTEST_SKIP().\n  // Note that the object will not be null\n  if (!Test::HasFatalFailure() && !Test::IsSkipped()) {\n    // This doesn't throw as all user code that can throw are wrapped into\n    // exception handling code.\n    test->Run();\n  }\n\n  if (test != nullptr) {\n    // Deletes the test object.\n    impl->os_stack_trace_getter()->UponLeavingGTest();\n    internal::HandleExceptionsInMethodIfSupported(\n        test, &Test::DeleteSelf_, \"the test fixture's destructor\");\n  }\n\n  result_.set_elapsed_time(timer.Elapsed());\n\n  // Notifies the unit test event listener that a test has just finished.\n  repeater->OnTestEnd(*this);\n\n  // Tells UnitTest to stop associating assertion results to this\n  // test.\n  impl->set_current_test_info(nullptr);\n}\n\n// Skip and records a skipped test result for this object.\nvoid TestInfo::Skip() {\n  if (!should_run_) return;\n\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  impl->set_current_test_info(this);\n\n  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();\n\n  // Notifies the unit test event listeners that a test is about to start.\n  repeater->OnTestStart(*this);\n\n  const TestPartResult test_part_result =\n      TestPartResult(TestPartResult::kSkip, this->file(), this->line(), \"\");\n  impl->GetTestPartResultReporterForCurrentThread()->ReportTestPartResult(\n      test_part_result);\n\n  // Notifies the unit test event listener that a test has just finished.\n  repeater->OnTestEnd(*this);\n  impl->set_current_test_info(nullptr);\n}\n\n// class TestSuite\n\n// Gets the number of successful tests in this test suite.\nint TestSuite::successful_test_count() const {\n  return CountIf(test_info_list_, TestPassed);\n}\n\n// Gets the number of successful tests in this test suite.\nint TestSuite::skipped_test_count() const {\n  return CountIf(test_info_list_, TestSkipped);\n}\n\n// Gets the number of failed tests in this test suite.\nint TestSuite::failed_test_count() const {\n  return CountIf(test_info_list_, TestFailed);\n}\n\n// Gets the number of disabled tests that will be reported in the XML report.\nint TestSuite::reportable_disabled_test_count() const {\n  return CountIf(test_info_list_, TestReportableDisabled);\n}\n\n// Gets the number of disabled tests in this test suite.\nint TestSuite::disabled_test_count() const {\n  return CountIf(test_info_list_, TestDisabled);\n}\n\n// Gets the number of tests to be printed in the XML report.\nint TestSuite::reportable_test_count() const {\n  return CountIf(test_info_list_, TestReportable);\n}\n\n// Get the number of tests in this test suite that should run.\nint TestSuite::test_to_run_count() const {\n  return CountIf(test_info_list_, ShouldRunTest);\n}\n\n// Gets the number of all tests.\nint TestSuite::total_test_count() const {\n  return static_cast<int>(test_info_list_.size());\n}\n\n// Creates a TestSuite with the given name.\n//\n// Arguments:\n//\n//   a_name:       name of the test suite\n//   a_type_param: the name of the test suite's type parameter, or NULL if\n//                 this is not a typed or a type-parameterized test suite.\n//   set_up_tc:    pointer to the function that sets up the test suite\n//   tear_down_tc: pointer to the function that tears down the test suite\nTestSuite::TestSuite(const char* a_name, const char* a_type_param,\n                     internal::SetUpTestSuiteFunc set_up_tc,\n                     internal::TearDownTestSuiteFunc tear_down_tc)\n    : name_(a_name),\n      type_param_(a_type_param ? new std::string(a_type_param) : nullptr),\n      set_up_tc_(set_up_tc),\n      tear_down_tc_(tear_down_tc),\n      should_run_(false),\n      start_timestamp_(0),\n      elapsed_time_(0) {}\n\n// Destructor of TestSuite.\nTestSuite::~TestSuite() {\n  // Deletes every Test in the collection.\n  ForEach(test_info_list_, internal::Delete<TestInfo>);\n}\n\n// Returns the i-th test among all the tests. i can range from 0 to\n// total_test_count() - 1. If i is not in that range, returns NULL.\nconst TestInfo* TestSuite::GetTestInfo(int i) const {\n  const int index = GetElementOr(test_indices_, i, -1);\n  return index < 0 ? nullptr : test_info_list_[static_cast<size_t>(index)];\n}\n\n// Returns the i-th test among all the tests. i can range from 0 to\n// total_test_count() - 1. If i is not in that range, returns NULL.\nTestInfo* TestSuite::GetMutableTestInfo(int i) {\n  const int index = GetElementOr(test_indices_, i, -1);\n  return index < 0 ? nullptr : test_info_list_[static_cast<size_t>(index)];\n}\n\n// Adds a test to this test suite.  Will delete the test upon\n// destruction of the TestSuite object.\nvoid TestSuite::AddTestInfo(TestInfo* test_info) {\n  test_info_list_.push_back(test_info);\n  test_indices_.push_back(static_cast<int>(test_indices_.size()));\n}\n\n// Runs every test in this TestSuite.\nvoid TestSuite::Run() {\n  if (!should_run_) return;\n\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  impl->set_current_test_suite(this);\n\n  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();\n\n  // Call both legacy and the new API\n  repeater->OnTestSuiteStart(*this);\n//  Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  repeater->OnTestCaseStart(*this);\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n  internal::HandleExceptionsInMethodIfSupported(\n      this, &TestSuite::RunSetUpTestSuite, \"SetUpTestSuite()\");\n\n  start_timestamp_ = internal::GetTimeInMillis();\n  internal::Timer timer;\n  for (int i = 0; i < total_test_count(); i++) {\n    GetMutableTestInfo(i)->Run();\n    if (GTEST_FLAG(fail_fast) && GetMutableTestInfo(i)->result()->Failed()) {\n      for (int j = i + 1; j < total_test_count(); j++) {\n        GetMutableTestInfo(j)->Skip();\n      }\n      break;\n    }\n  }\n  elapsed_time_ = timer.Elapsed();\n\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n  internal::HandleExceptionsInMethodIfSupported(\n      this, &TestSuite::RunTearDownTestSuite, \"TearDownTestSuite()\");\n\n  // Call both legacy and the new API\n  repeater->OnTestSuiteEnd(*this);\n//  Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  repeater->OnTestCaseEnd(*this);\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n  impl->set_current_test_suite(nullptr);\n}\n\n// Skips all tests under this TestSuite.\nvoid TestSuite::Skip() {\n  if (!should_run_) return;\n\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  impl->set_current_test_suite(this);\n\n  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();\n\n  // Call both legacy and the new API\n  repeater->OnTestSuiteStart(*this);\n//  Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  repeater->OnTestCaseStart(*this);\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n  for (int i = 0; i < total_test_count(); i++) {\n    GetMutableTestInfo(i)->Skip();\n  }\n\n  // Call both legacy and the new API\n  repeater->OnTestSuiteEnd(*this);\n  // Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  repeater->OnTestCaseEnd(*this);\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n  impl->set_current_test_suite(nullptr);\n}\n\n// Clears the results of all tests in this test suite.\nvoid TestSuite::ClearResult() {\n  ad_hoc_test_result_.Clear();\n  ForEach(test_info_list_, TestInfo::ClearTestResult);\n}\n\n// Shuffles the tests in this test suite.\nvoid TestSuite::ShuffleTests(internal::Random* random) {\n  Shuffle(random, &test_indices_);\n}\n\n// Restores the test order to before the first shuffle.\nvoid TestSuite::UnshuffleTests() {\n  for (size_t i = 0; i < test_indices_.size(); i++) {\n    test_indices_[i] = static_cast<int>(i);\n  }\n}\n\n// Formats a countable noun.  Depending on its quantity, either the\n// singular form or the plural form is used. e.g.\n//\n// FormatCountableNoun(1, \"formula\", \"formuli\") returns \"1 formula\".\n// FormatCountableNoun(5, \"book\", \"books\") returns \"5 books\".\nstatic std::string FormatCountableNoun(int count,\n                                       const char * singular_form,\n                                       const char * plural_form) {\n  return internal::StreamableToString(count) + \" \" +\n      (count == 1 ? singular_form : plural_form);\n}\n\n// Formats the count of tests.\nstatic std::string FormatTestCount(int test_count) {\n  return FormatCountableNoun(test_count, \"test\", \"tests\");\n}\n\n// Formats the count of test suites.\nstatic std::string FormatTestSuiteCount(int test_suite_count) {\n  return FormatCountableNoun(test_suite_count, \"test suite\", \"test suites\");\n}\n\n// Converts a TestPartResult::Type enum to human-friendly string\n// representation.  Both kNonFatalFailure and kFatalFailure are translated\n// to \"Failure\", as the user usually doesn't care about the difference\n// between the two when viewing the test result.\nstatic const char * TestPartResultTypeToString(TestPartResult::Type type) {\n  switch (type) {\n    case TestPartResult::kSkip:\n      return \"Skipped\\n\";\n    case TestPartResult::kSuccess:\n      return \"Success\";\n\n    case TestPartResult::kNonFatalFailure:\n    case TestPartResult::kFatalFailure:\n#ifdef _MSC_VER\n      return \"error: \";\n#else\n      return \"Failure\\n\";\n#endif\n    default:\n      return \"Unknown result type\";\n  }\n}\n\nnamespace internal {\nnamespace {\nenum class GTestColor { kDefault, kRed, kGreen, kYellow };\n}  // namespace\n\n// Prints a TestPartResult to an std::string.\nstatic std::string PrintTestPartResultToString(\n    const TestPartResult& test_part_result) {\n  return (Message()\n          << internal::FormatFileLocation(test_part_result.file_name(),\n                                          test_part_result.line_number())\n          << \" \" << TestPartResultTypeToString(test_part_result.type())\n          << test_part_result.message()).GetString();\n}\n\n// Prints a TestPartResult.\nstatic void PrintTestPartResult(const TestPartResult& test_part_result) {\n  const std::string& result =\n      PrintTestPartResultToString(test_part_result);\n  printf(\"%s\\n\", result.c_str());\n  fflush(stdout);\n  // If the test program runs in Visual Studio or a debugger, the\n  // following statements add the test part result message to the Output\n  // window such that the user can double-click on it to jump to the\n  // corresponding source code location; otherwise they do nothing.\n#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE\n  // We don't call OutputDebugString*() on Windows Mobile, as printing\n  // to stdout is done by OutputDebugString() there already - we don't\n  // want the same message printed twice.\n  ::OutputDebugStringA(result.c_str());\n  ::OutputDebugStringA(\"\\n\");\n#endif\n}\n\n// class PrettyUnitTestResultPrinter\n#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE && \\\n    !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT && !GTEST_OS_WINDOWS_MINGW\n\n// Returns the character attribute for the given color.\nstatic WORD GetColorAttribute(GTestColor color) {\n  switch (color) {\n    case GTestColor::kRed:\n      return FOREGROUND_RED;\n    case GTestColor::kGreen:\n      return FOREGROUND_GREEN;\n    case GTestColor::kYellow:\n      return FOREGROUND_RED | FOREGROUND_GREEN;\n    default:           return 0;\n  }\n}\n\nstatic int GetBitOffset(WORD color_mask) {\n  if (color_mask == 0) return 0;\n\n  int bitOffset = 0;\n  while ((color_mask & 1) == 0) {\n    color_mask >>= 1;\n    ++bitOffset;\n  }\n  return bitOffset;\n}\n\nstatic WORD GetNewColor(GTestColor color, WORD old_color_attrs) {\n  // Let's reuse the BG\n  static const WORD background_mask = BACKGROUND_BLUE | BACKGROUND_GREEN |\n                                      BACKGROUND_RED | BACKGROUND_INTENSITY;\n  static const WORD foreground_mask = FOREGROUND_BLUE | FOREGROUND_GREEN |\n                                      FOREGROUND_RED | FOREGROUND_INTENSITY;\n  const WORD existing_bg = old_color_attrs & background_mask;\n\n  WORD new_color =\n      GetColorAttribute(color) | existing_bg | FOREGROUND_INTENSITY;\n  static const int bg_bitOffset = GetBitOffset(background_mask);\n  static const int fg_bitOffset = GetBitOffset(foreground_mask);\n\n  if (((new_color & background_mask) >> bg_bitOffset) ==\n      ((new_color & foreground_mask) >> fg_bitOffset)) {\n    new_color ^= FOREGROUND_INTENSITY;  // invert intensity\n  }\n  return new_color;\n}\n\n#else\n\n// Returns the ANSI color code for the given color. GTestColor::kDefault is\n// an invalid input.\nstatic const char* GetAnsiColorCode(GTestColor color) {\n  switch (color) {\n    case GTestColor::kRed:\n      return \"1\";\n    case GTestColor::kGreen:\n      return \"2\";\n    case GTestColor::kYellow:\n      return \"3\";\n    default:\n      return nullptr;\n  }\n}\n\n#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE\n\n// Returns true if and only if Google Test should use colors in the output.\nbool ShouldUseColor(bool stdout_is_tty) {\n  const char* const gtest_color = GTEST_FLAG(color).c_str();\n\n  if (String::CaseInsensitiveCStringEquals(gtest_color, \"auto\")) {\n#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW\n    // On Windows the TERM variable is usually not set, but the\n    // console there does support colors.\n    return stdout_is_tty;\n#else\n    // On non-Windows platforms, we rely on the TERM variable.\n    const char* const term = posix::GetEnv(\"TERM\");\n    const bool term_supports_color =\n        String::CStringEquals(term, \"xterm\") ||\n        String::CStringEquals(term, \"xterm-color\") ||\n        String::CStringEquals(term, \"xterm-256color\") ||\n        String::CStringEquals(term, \"screen\") ||\n        String::CStringEquals(term, \"screen-256color\") ||\n        String::CStringEquals(term, \"tmux\") ||\n        String::CStringEquals(term, \"tmux-256color\") ||\n        String::CStringEquals(term, \"rxvt-unicode\") ||\n        String::CStringEquals(term, \"rxvt-unicode-256color\") ||\n        String::CStringEquals(term, \"linux\") ||\n        String::CStringEquals(term, \"cygwin\");\n    return stdout_is_tty && term_supports_color;\n#endif  // GTEST_OS_WINDOWS\n  }\n\n  return String::CaseInsensitiveCStringEquals(gtest_color, \"yes\") ||\n      String::CaseInsensitiveCStringEquals(gtest_color, \"true\") ||\n      String::CaseInsensitiveCStringEquals(gtest_color, \"t\") ||\n      String::CStringEquals(gtest_color, \"1\");\n  // We take \"yes\", \"true\", \"t\", and \"1\" as meaning \"yes\".  If the\n  // value is neither one of these nor \"auto\", we treat it as \"no\" to\n  // be conservative.\n}\n\n// Helpers for printing colored strings to stdout. Note that on Windows, we\n// cannot simply emit special characters and have the terminal change colors.\n// This routine must actually emit the characters rather than return a string\n// that would be colored when printed, as can be done on Linux.\n\nGTEST_ATTRIBUTE_PRINTF_(2, 3)\nstatic void ColoredPrintf(GTestColor color, const char *fmt, ...) {\n  va_list args;\n  va_start(args, fmt);\n\n#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_ZOS || GTEST_OS_IOS || \\\n    GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT || defined(ESP_PLATFORM)\n  const bool use_color = AlwaysFalse();\n#else\n  static const bool in_color_mode =\n      ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);\n  const bool use_color = in_color_mode && (color != GTestColor::kDefault);\n#endif  // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_ZOS\n\n  if (!use_color) {\n    vprintf(fmt, args);\n    va_end(args);\n    return;\n  }\n\n#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE && \\\n    !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT && !GTEST_OS_WINDOWS_MINGW\n  const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);\n\n  // Gets the current text color.\n  CONSOLE_SCREEN_BUFFER_INFO buffer_info;\n  GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);\n  const WORD old_color_attrs = buffer_info.wAttributes;\n  const WORD new_color = GetNewColor(color, old_color_attrs);\n\n  // We need to flush the stream buffers into the console before each\n  // SetConsoleTextAttribute call lest it affect the text that is already\n  // printed but has not yet reached the console.\n  fflush(stdout);\n  SetConsoleTextAttribute(stdout_handle, new_color);\n\n  vprintf(fmt, args);\n\n  fflush(stdout);\n  // Restores the text color.\n  SetConsoleTextAttribute(stdout_handle, old_color_attrs);\n#else\n  printf(\"\\033[0;3%sm\", GetAnsiColorCode(color));\n  vprintf(fmt, args);\n  printf(\"\\033[m\");  // Resets the terminal to default.\n#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE\n  va_end(args);\n}\n\n// Text printed in Google Test's text output and --gtest_list_tests\n// output to label the type parameter and value parameter for a test.\nstatic const char kTypeParamLabel[] = \"TypeParam\";\nstatic const char kValueParamLabel[] = \"GetParam()\";\n\nstatic void PrintFullTestCommentIfPresent(const TestInfo& test_info) {\n  const char* const type_param = test_info.type_param();\n  const char* const value_param = test_info.value_param();\n\n  if (type_param != nullptr || value_param != nullptr) {\n    printf(\", where \");\n    if (type_param != nullptr) {\n      printf(\"%s = %s\", kTypeParamLabel, type_param);\n      if (value_param != nullptr) printf(\" and \");\n    }\n    if (value_param != nullptr) {\n      printf(\"%s = %s\", kValueParamLabel, value_param);\n    }\n  }\n}\n\n// This class implements the TestEventListener interface.\n//\n// Class PrettyUnitTestResultPrinter is copyable.\nclass PrettyUnitTestResultPrinter : public TestEventListener {\n public:\n  PrettyUnitTestResultPrinter() {}\n  static void PrintTestName(const char* test_suite, const char* test) {\n    printf(\"%s.%s\", test_suite, test);\n  }\n\n  // The following methods override what's in the TestEventListener class.\n  void OnTestProgramStart(const UnitTest& /*unit_test*/) override {}\n  void OnTestIterationStart(const UnitTest& unit_test, int iteration) override;\n  void OnEnvironmentsSetUpStart(const UnitTest& unit_test) override;\n  void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {}\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  void OnTestCaseStart(const TestCase& test_case) override;\n#else\n  void OnTestSuiteStart(const TestSuite& test_suite) override;\n#endif  // OnTestCaseStart\n\n  void OnTestStart(const TestInfo& test_info) override;\n\n  void OnTestPartResult(const TestPartResult& result) override;\n  void OnTestEnd(const TestInfo& test_info) override;\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  void OnTestCaseEnd(const TestCase& test_case) override;\n#else\n  void OnTestSuiteEnd(const TestSuite& test_suite) override;\n#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n  void OnEnvironmentsTearDownStart(const UnitTest& unit_test) override;\n  void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {}\n  void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override;\n  void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {}\n\n private:\n  static void PrintFailedTests(const UnitTest& unit_test);\n  static void PrintFailedTestSuites(const UnitTest& unit_test);\n  static void PrintSkippedTests(const UnitTest& unit_test);\n};\n\n  // Fired before each iteration of tests starts.\nvoid PrettyUnitTestResultPrinter::OnTestIterationStart(\n    const UnitTest& unit_test, int iteration) {\n  if (GTEST_FLAG(repeat) != 1)\n    printf(\"\\nRepeating all tests (iteration %d) . . .\\n\\n\", iteration + 1);\n\n  const char* const filter = GTEST_FLAG(filter).c_str();\n\n  // Prints the filter if it's not *.  This reminds the user that some\n  // tests may be skipped.\n  if (!String::CStringEquals(filter, kUniversalFilter)) {\n    ColoredPrintf(GTestColor::kYellow, \"Note: %s filter = %s\\n\", GTEST_NAME_,\n                  filter);\n  }\n\n  if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {\n    const int32_t shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);\n    ColoredPrintf(GTestColor::kYellow, \"Note: This is test shard %d of %s.\\n\",\n                  static_cast<int>(shard_index) + 1,\n                  internal::posix::GetEnv(kTestTotalShards));\n  }\n\n  if (GTEST_FLAG(shuffle)) {\n    ColoredPrintf(GTestColor::kYellow,\n                  \"Note: Randomizing tests' orders with a seed of %d .\\n\",\n                  unit_test.random_seed());\n  }\n\n  ColoredPrintf(GTestColor::kGreen, \"[==========] \");\n  printf(\"Running %s from %s.\\n\",\n         FormatTestCount(unit_test.test_to_run_count()).c_str(),\n         FormatTestSuiteCount(unit_test.test_suite_to_run_count()).c_str());\n  fflush(stdout);\n}\n\nvoid PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(\n    const UnitTest& /*unit_test*/) {\n  ColoredPrintf(GTestColor::kGreen, \"[----------] \");\n  printf(\"Global test environment set-up.\\n\");\n  fflush(stdout);\n}\n\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\nvoid PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {\n  const std::string counts =\n      FormatCountableNoun(test_case.test_to_run_count(), \"test\", \"tests\");\n  ColoredPrintf(GTestColor::kGreen, \"[----------] \");\n  printf(\"%s from %s\", counts.c_str(), test_case.name());\n  if (test_case.type_param() == nullptr) {\n    printf(\"\\n\");\n  } else {\n    printf(\", where %s = %s\\n\", kTypeParamLabel, test_case.type_param());\n  }\n  fflush(stdout);\n}\n#else\nvoid PrettyUnitTestResultPrinter::OnTestSuiteStart(\n    const TestSuite& test_suite) {\n  const std::string counts =\n      FormatCountableNoun(test_suite.test_to_run_count(), \"test\", \"tests\");\n  ColoredPrintf(GTestColor::kGreen, \"[----------] \");\n  printf(\"%s from %s\", counts.c_str(), test_suite.name());\n  if (test_suite.type_param() == nullptr) {\n    printf(\"\\n\");\n  } else {\n    printf(\", where %s = %s\\n\", kTypeParamLabel, test_suite.type_param());\n  }\n  fflush(stdout);\n}\n#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\nvoid PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {\n  ColoredPrintf(GTestColor::kGreen, \"[ RUN      ] \");\n  PrintTestName(test_info.test_suite_name(), test_info.name());\n  printf(\"\\n\");\n  fflush(stdout);\n}\n\n// Called after an assertion failure.\nvoid PrettyUnitTestResultPrinter::OnTestPartResult(\n    const TestPartResult& result) {\n  switch (result.type()) {\n    // If the test part succeeded, we don't need to do anything.\n    case TestPartResult::kSuccess:\n      return;\n    default:\n      // Print failure message from the assertion\n      // (e.g. expected this and got that).\n      PrintTestPartResult(result);\n      fflush(stdout);\n  }\n}\n\nvoid PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {\n  if (test_info.result()->Passed()) {\n    ColoredPrintf(GTestColor::kGreen, \"[       OK ] \");\n  } else if (test_info.result()->Skipped()) {\n    ColoredPrintf(GTestColor::kGreen, \"[  SKIPPED ] \");\n  } else {\n    ColoredPrintf(GTestColor::kRed, \"[  FAILED  ] \");\n  }\n  PrintTestName(test_info.test_suite_name(), test_info.name());\n  if (test_info.result()->Failed())\n    PrintFullTestCommentIfPresent(test_info);\n\n  if (GTEST_FLAG(print_time)) {\n    printf(\" (%s ms)\\n\", internal::StreamableToString(\n           test_info.result()->elapsed_time()).c_str());\n  } else {\n    printf(\"\\n\");\n  }\n  fflush(stdout);\n}\n\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\nvoid PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {\n  if (!GTEST_FLAG(print_time)) return;\n\n  const std::string counts =\n      FormatCountableNoun(test_case.test_to_run_count(), \"test\", \"tests\");\n  ColoredPrintf(GTestColor::kGreen, \"[----------] \");\n  printf(\"%s from %s (%s ms total)\\n\\n\", counts.c_str(), test_case.name(),\n         internal::StreamableToString(test_case.elapsed_time()).c_str());\n  fflush(stdout);\n}\n#else\nvoid PrettyUnitTestResultPrinter::OnTestSuiteEnd(const TestSuite& test_suite) {\n  if (!GTEST_FLAG(print_time)) return;\n\n  const std::string counts =\n      FormatCountableNoun(test_suite.test_to_run_count(), \"test\", \"tests\");\n  ColoredPrintf(GTestColor::kGreen, \"[----------] \");\n  printf(\"%s from %s (%s ms total)\\n\\n\", counts.c_str(), test_suite.name(),\n         internal::StreamableToString(test_suite.elapsed_time()).c_str());\n  fflush(stdout);\n}\n#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\nvoid PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(\n    const UnitTest& /*unit_test*/) {\n  ColoredPrintf(GTestColor::kGreen, \"[----------] \");\n  printf(\"Global test environment tear-down\\n\");\n  fflush(stdout);\n}\n\n// Internal helper for printing the list of failed tests.\nvoid PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {\n  const int failed_test_count = unit_test.failed_test_count();\n  ColoredPrintf(GTestColor::kRed, \"[  FAILED  ] \");\n  printf(\"%s, listed below:\\n\", FormatTestCount(failed_test_count).c_str());\n\n  for (int i = 0; i < unit_test.total_test_suite_count(); ++i) {\n    const TestSuite& test_suite = *unit_test.GetTestSuite(i);\n    if (!test_suite.should_run() || (test_suite.failed_test_count() == 0)) {\n      continue;\n    }\n    for (int j = 0; j < test_suite.total_test_count(); ++j) {\n      const TestInfo& test_info = *test_suite.GetTestInfo(j);\n      if (!test_info.should_run() || !test_info.result()->Failed()) {\n        continue;\n      }\n      ColoredPrintf(GTestColor::kRed, \"[  FAILED  ] \");\n      printf(\"%s.%s\", test_suite.name(), test_info.name());\n      PrintFullTestCommentIfPresent(test_info);\n      printf(\"\\n\");\n    }\n  }\n  printf(\"\\n%2d FAILED %s\\n\", failed_test_count,\n         failed_test_count == 1 ? \"TEST\" : \"TESTS\");\n}\n\n// Internal helper for printing the list of test suite failures not covered by\n// PrintFailedTests.\nvoid PrettyUnitTestResultPrinter::PrintFailedTestSuites(\n    const UnitTest& unit_test) {\n  int suite_failure_count = 0;\n  for (int i = 0; i < unit_test.total_test_suite_count(); ++i) {\n    const TestSuite& test_suite = *unit_test.GetTestSuite(i);\n    if (!test_suite.should_run()) {\n      continue;\n    }\n    if (test_suite.ad_hoc_test_result().Failed()) {\n      ColoredPrintf(GTestColor::kRed, \"[  FAILED  ] \");\n      printf(\"%s: SetUpTestSuite or TearDownTestSuite\\n\", test_suite.name());\n      ++suite_failure_count;\n    }\n  }\n  if (suite_failure_count > 0) {\n    printf(\"\\n%2d FAILED TEST %s\\n\", suite_failure_count,\n           suite_failure_count == 1 ? \"SUITE\" : \"SUITES\");\n  }\n}\n\n// Internal helper for printing the list of skipped tests.\nvoid PrettyUnitTestResultPrinter::PrintSkippedTests(const UnitTest& unit_test) {\n  const int skipped_test_count = unit_test.skipped_test_count();\n  if (skipped_test_count == 0) {\n    return;\n  }\n\n  for (int i = 0; i < unit_test.total_test_suite_count(); ++i) {\n    const TestSuite& test_suite = *unit_test.GetTestSuite(i);\n    if (!test_suite.should_run() || (test_suite.skipped_test_count() == 0)) {\n      continue;\n    }\n    for (int j = 0; j < test_suite.total_test_count(); ++j) {\n      const TestInfo& test_info = *test_suite.GetTestInfo(j);\n      if (!test_info.should_run() || !test_info.result()->Skipped()) {\n        continue;\n      }\n      ColoredPrintf(GTestColor::kGreen, \"[  SKIPPED ] \");\n      printf(\"%s.%s\", test_suite.name(), test_info.name());\n      printf(\"\\n\");\n    }\n  }\n}\n\nvoid PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,\n                                                     int /*iteration*/) {\n  ColoredPrintf(GTestColor::kGreen, \"[==========] \");\n  printf(\"%s from %s ran.\",\n         FormatTestCount(unit_test.test_to_run_count()).c_str(),\n         FormatTestSuiteCount(unit_test.test_suite_to_run_count()).c_str());\n  if (GTEST_FLAG(print_time)) {\n    printf(\" (%s ms total)\",\n           internal::StreamableToString(unit_test.elapsed_time()).c_str());\n  }\n  printf(\"\\n\");\n  ColoredPrintf(GTestColor::kGreen, \"[  PASSED  ] \");\n  printf(\"%s.\\n\", FormatTestCount(unit_test.successful_test_count()).c_str());\n\n  const int skipped_test_count = unit_test.skipped_test_count();\n  if (skipped_test_count > 0) {\n    ColoredPrintf(GTestColor::kGreen, \"[  SKIPPED ] \");\n    printf(\"%s, listed below:\\n\", FormatTestCount(skipped_test_count).c_str());\n    PrintSkippedTests(unit_test);\n  }\n\n  if (!unit_test.Passed()) {\n    PrintFailedTests(unit_test);\n    PrintFailedTestSuites(unit_test);\n  }\n\n  int num_disabled = unit_test.reportable_disabled_test_count();\n  if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {\n    if (unit_test.Passed()) {\n      printf(\"\\n\");  // Add a spacer if no FAILURE banner is displayed.\n    }\n    ColoredPrintf(GTestColor::kYellow, \"  YOU HAVE %d DISABLED %s\\n\\n\",\n                  num_disabled, num_disabled == 1 ? \"TEST\" : \"TESTS\");\n  }\n  // Ensure that Google Test output is printed before, e.g., heapchecker output.\n  fflush(stdout);\n}\n\n// End PrettyUnitTestResultPrinter\n\n// This class implements the TestEventListener interface.\n//\n// Class BriefUnitTestResultPrinter is copyable.\nclass BriefUnitTestResultPrinter : public TestEventListener {\n public:\n  BriefUnitTestResultPrinter() {}\n  static void PrintTestName(const char* test_suite, const char* test) {\n    printf(\"%s.%s\", test_suite, test);\n  }\n\n  // The following methods override what's in the TestEventListener class.\n  void OnTestProgramStart(const UnitTest& /*unit_test*/) override {}\n  void OnTestIterationStart(const UnitTest& /*unit_test*/,\n                            int /*iteration*/) override {}\n  void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) override {}\n  void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {}\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  void OnTestCaseStart(const TestCase& /*test_case*/) override {}\n#else\n  void OnTestSuiteStart(const TestSuite& /*test_suite*/) override {}\n#endif  // OnTestCaseStart\n\n  void OnTestStart(const TestInfo& /*test_info*/) override {}\n\n  void OnTestPartResult(const TestPartResult& result) override;\n  void OnTestEnd(const TestInfo& test_info) override;\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  void OnTestCaseEnd(const TestCase& /*test_case*/) override {}\n#else\n  void OnTestSuiteEnd(const TestSuite& /*test_suite*/) override {}\n#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n  void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) override {}\n  void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {}\n  void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override;\n  void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {}\n};\n\n// Called after an assertion failure.\nvoid BriefUnitTestResultPrinter::OnTestPartResult(\n    const TestPartResult& result) {\n  switch (result.type()) {\n    // If the test part succeeded, we don't need to do anything.\n    case TestPartResult::kSuccess:\n      return;\n    default:\n      // Print failure message from the assertion\n      // (e.g. expected this and got that).\n      PrintTestPartResult(result);\n      fflush(stdout);\n  }\n}\n\nvoid BriefUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {\n  if (test_info.result()->Failed()) {\n    ColoredPrintf(GTestColor::kRed, \"[  FAILED  ] \");\n    PrintTestName(test_info.test_suite_name(), test_info.name());\n    PrintFullTestCommentIfPresent(test_info);\n\n    if (GTEST_FLAG(print_time)) {\n      printf(\" (%s ms)\\n\",\n             internal::StreamableToString(test_info.result()->elapsed_time())\n                 .c_str());\n    } else {\n      printf(\"\\n\");\n    }\n    fflush(stdout);\n  }\n}\n\nvoid BriefUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,\n                                                    int /*iteration*/) {\n  ColoredPrintf(GTestColor::kGreen, \"[==========] \");\n  printf(\"%s from %s ran.\",\n         FormatTestCount(unit_test.test_to_run_count()).c_str(),\n         FormatTestSuiteCount(unit_test.test_suite_to_run_count()).c_str());\n  if (GTEST_FLAG(print_time)) {\n    printf(\" (%s ms total)\",\n           internal::StreamableToString(unit_test.elapsed_time()).c_str());\n  }\n  printf(\"\\n\");\n  ColoredPrintf(GTestColor::kGreen, \"[  PASSED  ] \");\n  printf(\"%s.\\n\", FormatTestCount(unit_test.successful_test_count()).c_str());\n\n  const int skipped_test_count = unit_test.skipped_test_count();\n  if (skipped_test_count > 0) {\n    ColoredPrintf(GTestColor::kGreen, \"[  SKIPPED ] \");\n    printf(\"%s.\\n\", FormatTestCount(skipped_test_count).c_str());\n  }\n\n  int num_disabled = unit_test.reportable_disabled_test_count();\n  if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {\n    if (unit_test.Passed()) {\n      printf(\"\\n\");  // Add a spacer if no FAILURE banner is displayed.\n    }\n    ColoredPrintf(GTestColor::kYellow, \"  YOU HAVE %d DISABLED %s\\n\\n\",\n                  num_disabled, num_disabled == 1 ? \"TEST\" : \"TESTS\");\n  }\n  // Ensure that Google Test output is printed before, e.g., heapchecker output.\n  fflush(stdout);\n}\n\n// End BriefUnitTestResultPrinter\n\n// class TestEventRepeater\n//\n// This class forwards events to other event listeners.\nclass TestEventRepeater : public TestEventListener {\n public:\n  TestEventRepeater() : forwarding_enabled_(true) {}\n  ~TestEventRepeater() override;\n  void Append(TestEventListener *listener);\n  TestEventListener* Release(TestEventListener* listener);\n\n  // Controls whether events will be forwarded to listeners_. Set to false\n  // in death test child processes.\n  bool forwarding_enabled() const { return forwarding_enabled_; }\n  void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }\n\n  void OnTestProgramStart(const UnitTest& unit_test) override;\n  void OnTestIterationStart(const UnitTest& unit_test, int iteration) override;\n  void OnEnvironmentsSetUpStart(const UnitTest& unit_test) override;\n  void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) override;\n//  Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  void OnTestCaseStart(const TestSuite& parameter) override;\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  void OnTestSuiteStart(const TestSuite& parameter) override;\n  void OnTestStart(const TestInfo& test_info) override;\n  void OnTestPartResult(const TestPartResult& result) override;\n  void OnTestEnd(const TestInfo& test_info) override;\n//  Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  void OnTestCaseEnd(const TestCase& parameter) override;\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  void OnTestSuiteEnd(const TestSuite& parameter) override;\n  void OnEnvironmentsTearDownStart(const UnitTest& unit_test) override;\n  void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) override;\n  void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override;\n  void OnTestProgramEnd(const UnitTest& unit_test) override;\n\n private:\n  // Controls whether events will be forwarded to listeners_. Set to false\n  // in death test child processes.\n  bool forwarding_enabled_;\n  // The list of listeners that receive events.\n  std::vector<TestEventListener*> listeners_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater);\n};\n\nTestEventRepeater::~TestEventRepeater() {\n  ForEach(listeners_, Delete<TestEventListener>);\n}\n\nvoid TestEventRepeater::Append(TestEventListener *listener) {\n  listeners_.push_back(listener);\n}\n\nTestEventListener* TestEventRepeater::Release(TestEventListener *listener) {\n  for (size_t i = 0; i < listeners_.size(); ++i) {\n    if (listeners_[i] == listener) {\n      listeners_.erase(listeners_.begin() + static_cast<int>(i));\n      return listener;\n    }\n  }\n\n  return nullptr;\n}\n\n// Since most methods are very similar, use macros to reduce boilerplate.\n// This defines a member that forwards the call to all listeners.\n#define GTEST_REPEATER_METHOD_(Name, Type) \\\nvoid TestEventRepeater::Name(const Type& parameter) { \\\n  if (forwarding_enabled_) { \\\n    for (size_t i = 0; i < listeners_.size(); i++) { \\\n      listeners_[i]->Name(parameter); \\\n    } \\\n  } \\\n}\n// This defines a member that forwards the call to all listeners in reverse\n// order.\n#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type)      \\\n  void TestEventRepeater::Name(const Type& parameter) { \\\n    if (forwarding_enabled_) {                          \\\n      for (size_t i = listeners_.size(); i != 0; i--) { \\\n        listeners_[i - 1]->Name(parameter);             \\\n      }                                                 \\\n    }                                                   \\\n  }\n\nGTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)\nGTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)\n//  Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\nGTEST_REPEATER_METHOD_(OnTestCaseStart, TestSuite)\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\nGTEST_REPEATER_METHOD_(OnTestSuiteStart, TestSuite)\nGTEST_REPEATER_METHOD_(OnTestStart, TestInfo)\nGTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)\nGTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)\nGTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)\nGTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)\nGTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)\n//  Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\nGTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestSuite)\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\nGTEST_REVERSE_REPEATER_METHOD_(OnTestSuiteEnd, TestSuite)\nGTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)\n\n#undef GTEST_REPEATER_METHOD_\n#undef GTEST_REVERSE_REPEATER_METHOD_\n\nvoid TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,\n                                             int iteration) {\n  if (forwarding_enabled_) {\n    for (size_t i = 0; i < listeners_.size(); i++) {\n      listeners_[i]->OnTestIterationStart(unit_test, iteration);\n    }\n  }\n}\n\nvoid TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,\n                                           int iteration) {\n  if (forwarding_enabled_) {\n    for (size_t i = listeners_.size(); i > 0; i--) {\n      listeners_[i - 1]->OnTestIterationEnd(unit_test, iteration);\n    }\n  }\n}\n\n// End TestEventRepeater\n\n// This class generates an XML output file.\nclass XmlUnitTestResultPrinter : public EmptyTestEventListener {\n public:\n  explicit XmlUnitTestResultPrinter(const char* output_file);\n\n  void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override;\n  void ListTestsMatchingFilter(const std::vector<TestSuite*>& test_suites);\n\n  // Prints an XML summary of all unit tests.\n  static void PrintXmlTestsList(std::ostream* stream,\n                                const std::vector<TestSuite*>& test_suites);\n\n private:\n  // Is c a whitespace character that is normalized to a space character\n  // when it appears in an XML attribute value?\n  static bool IsNormalizableWhitespace(char c) {\n    return c == 0x9 || c == 0xA || c == 0xD;\n  }\n\n  // May c appear in a well-formed XML document?\n  static bool IsValidXmlCharacter(char c) {\n    return IsNormalizableWhitespace(c) || c >= 0x20;\n  }\n\n  // Returns an XML-escaped copy of the input string str.  If\n  // is_attribute is true, the text is meant to appear as an attribute\n  // value, and normalizable whitespace is preserved by replacing it\n  // with character references.\n  static std::string EscapeXml(const std::string& str, bool is_attribute);\n\n  // Returns the given string with all characters invalid in XML removed.\n  static std::string RemoveInvalidXmlCharacters(const std::string& str);\n\n  // Convenience wrapper around EscapeXml when str is an attribute value.\n  static std::string EscapeXmlAttribute(const std::string& str) {\n    return EscapeXml(str, true);\n  }\n\n  // Convenience wrapper around EscapeXml when str is not an attribute value.\n  static std::string EscapeXmlText(const char* str) {\n    return EscapeXml(str, false);\n  }\n\n  // Verifies that the given attribute belongs to the given element and\n  // streams the attribute as XML.\n  static void OutputXmlAttribute(std::ostream* stream,\n                                 const std::string& element_name,\n                                 const std::string& name,\n                                 const std::string& value);\n\n  // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.\n  static void OutputXmlCDataSection(::std::ostream* stream, const char* data);\n\n  // Streams a test suite XML stanza containing the given test result.\n  //\n  // Requires: result.Failed()\n  static void OutputXmlTestSuiteForTestResult(::std::ostream* stream,\n                                              const TestResult& result);\n\n  // Streams an XML representation of a TestResult object.\n  static void OutputXmlTestResult(::std::ostream* stream,\n                                  const TestResult& result);\n\n  // Streams an XML representation of a TestInfo object.\n  static void OutputXmlTestInfo(::std::ostream* stream,\n                                const char* test_suite_name,\n                                const TestInfo& test_info);\n\n  // Prints an XML representation of a TestSuite object\n  static void PrintXmlTestSuite(::std::ostream* stream,\n                                const TestSuite& test_suite);\n\n  // Prints an XML summary of unit_test to output stream out.\n  static void PrintXmlUnitTest(::std::ostream* stream,\n                               const UnitTest& unit_test);\n\n  // Produces a string representing the test properties in a result as space\n  // delimited XML attributes based on the property key=\"value\" pairs.\n  // When the std::string is not empty, it includes a space at the beginning,\n  // to delimit this attribute from prior attributes.\n  static std::string TestPropertiesAsXmlAttributes(const TestResult& result);\n\n  // Streams an XML representation of the test properties of a TestResult\n  // object.\n  static void OutputXmlTestProperties(std::ostream* stream,\n                                      const TestResult& result);\n\n  // The output file.\n  const std::string output_file_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);\n};\n\n// Creates a new XmlUnitTestResultPrinter.\nXmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)\n    : output_file_(output_file) {\n  if (output_file_.empty()) {\n    GTEST_LOG_(FATAL) << \"XML output file may not be null\";\n  }\n}\n\n// Called after the unit test ends.\nvoid XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,\n                                                  int /*iteration*/) {\n  FILE* xmlout = OpenFileForWriting(output_file_);\n  std::stringstream stream;\n  PrintXmlUnitTest(&stream, unit_test);\n  fprintf(xmlout, \"%s\", StringStreamToString(&stream).c_str());\n  fclose(xmlout);\n}\n\nvoid XmlUnitTestResultPrinter::ListTestsMatchingFilter(\n    const std::vector<TestSuite*>& test_suites) {\n  FILE* xmlout = OpenFileForWriting(output_file_);\n  std::stringstream stream;\n  PrintXmlTestsList(&stream, test_suites);\n  fprintf(xmlout, \"%s\", StringStreamToString(&stream).c_str());\n  fclose(xmlout);\n}\n\n// Returns an XML-escaped copy of the input string str.  If is_attribute\n// is true, the text is meant to appear as an attribute value, and\n// normalizable whitespace is preserved by replacing it with character\n// references.\n//\n// Invalid XML characters in str, if any, are stripped from the output.\n// It is expected that most, if not all, of the text processed by this\n// module will consist of ordinary English text.\n// If this module is ever modified to produce version 1.1 XML output,\n// most invalid characters can be retained using character references.\nstd::string XmlUnitTestResultPrinter::EscapeXml(\n    const std::string& str, bool is_attribute) {\n  Message m;\n\n  for (size_t i = 0; i < str.size(); ++i) {\n    const char ch = str[i];\n    switch (ch) {\n      case '<':\n        m << \"&lt;\";\n        break;\n      case '>':\n        m << \"&gt;\";\n        break;\n      case '&':\n        m << \"&amp;\";\n        break;\n      case '\\'':\n        if (is_attribute)\n          m << \"&apos;\";\n        else\n          m << '\\'';\n        break;\n      case '\"':\n        if (is_attribute)\n          m << \"&quot;\";\n        else\n          m << '\"';\n        break;\n      default:\n        if (IsValidXmlCharacter(ch)) {\n          if (is_attribute && IsNormalizableWhitespace(ch))\n            m << \"&#x\" << String::FormatByte(static_cast<unsigned char>(ch))\n              << \";\";\n          else\n            m << ch;\n        }\n        break;\n    }\n  }\n\n  return m.GetString();\n}\n\n// Returns the given string with all characters invalid in XML removed.\n// Currently invalid characters are dropped from the string. An\n// alternative is to replace them with certain characters such as . or ?.\nstd::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(\n    const std::string& str) {\n  std::string output;\n  output.reserve(str.size());\n  for (std::string::const_iterator it = str.begin(); it != str.end(); ++it)\n    if (IsValidXmlCharacter(*it))\n      output.push_back(*it);\n\n  return output;\n}\n\n// The following routines generate an XML representation of a UnitTest\n// object.\n// GOOGLETEST_CM0009 DO NOT DELETE\n//\n// This is how Google Test concepts map to the DTD:\n//\n// <testsuites name=\"AllTests\">        <-- corresponds to a UnitTest object\n//   <testsuite name=\"testcase-name\">  <-- corresponds to a TestSuite object\n//     <testcase name=\"test-name\">     <-- corresponds to a TestInfo object\n//       <failure message=\"...\">...</failure>\n//       <failure message=\"...\">...</failure>\n//       <failure message=\"...\">...</failure>\n//                                     <-- individual assertion failures\n//     </testcase>\n//   </testsuite>\n// </testsuites>\n\n// Formats the given time in milliseconds as seconds.\nstd::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {\n  ::std::stringstream ss;\n  ss << (static_cast<double>(ms) * 1e-3);\n  return ss.str();\n}\n\nstatic bool PortableLocaltime(time_t seconds, struct tm* out) {\n#if defined(_MSC_VER)\n  return localtime_s(out, &seconds) == 0;\n#elif defined(__MINGW32__) || defined(__MINGW64__)\n  // MINGW <time.h> provides neither localtime_r nor localtime_s, but uses\n  // Windows' localtime(), which has a thread-local tm buffer.\n  struct tm* tm_ptr = localtime(&seconds);  // NOLINT\n  if (tm_ptr == nullptr) return false;\n  *out = *tm_ptr;\n  return true;\n#elif defined(__STDC_LIB_EXT1__)\n  // Uses localtime_s when available as localtime_r is only available from\n  // C23 standard.\n  return localtime_s(&seconds, out) != nullptr;\n#else\n  return localtime_r(&seconds, out) != nullptr;\n#endif\n}\n\n// Converts the given epoch time in milliseconds to a date string in the ISO\n// 8601 format, without the timezone information.\nstd::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {\n  struct tm time_struct;\n  if (!PortableLocaltime(static_cast<time_t>(ms / 1000), &time_struct))\n    return \"\";\n  // YYYY-MM-DDThh:mm:ss.sss\n  return StreamableToString(time_struct.tm_year + 1900) + \"-\" +\n      String::FormatIntWidth2(time_struct.tm_mon + 1) + \"-\" +\n      String::FormatIntWidth2(time_struct.tm_mday) + \"T\" +\n      String::FormatIntWidth2(time_struct.tm_hour) + \":\" +\n      String::FormatIntWidth2(time_struct.tm_min) + \":\" +\n      String::FormatIntWidth2(time_struct.tm_sec) + \".\" +\n      String::FormatIntWidthN(static_cast<int>(ms % 1000), 3);\n}\n\n// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.\nvoid XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,\n                                                     const char* data) {\n  const char* segment = data;\n  *stream << \"<![CDATA[\";\n  for (;;) {\n    const char* const next_segment = strstr(segment, \"]]>\");\n    if (next_segment != nullptr) {\n      stream->write(\n          segment, static_cast<std::streamsize>(next_segment - segment));\n      *stream << \"]]>]]&gt;<![CDATA[\";\n      segment = next_segment + strlen(\"]]>\");\n    } else {\n      *stream << segment;\n      break;\n    }\n  }\n  *stream << \"]]>\";\n}\n\nvoid XmlUnitTestResultPrinter::OutputXmlAttribute(\n    std::ostream* stream,\n    const std::string& element_name,\n    const std::string& name,\n    const std::string& value) {\n  const std::vector<std::string>& allowed_names =\n      GetReservedOutputAttributesForElement(element_name);\n\n  GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=\n                   allowed_names.end())\n      << \"Attribute \" << name << \" is not allowed for element <\" << element_name\n      << \">.\";\n\n  *stream << \" \" << name << \"=\\\"\" << EscapeXmlAttribute(value) << \"\\\"\";\n}\n\n// Streams a test suite XML stanza containing the given test result.\nvoid XmlUnitTestResultPrinter::OutputXmlTestSuiteForTestResult(\n    ::std::ostream* stream, const TestResult& result) {\n  // Output the boilerplate for a minimal test suite with one test.\n  *stream << \"  <testsuite\";\n  OutputXmlAttribute(stream, \"testsuite\", \"name\", \"NonTestSuiteFailure\");\n  OutputXmlAttribute(stream, \"testsuite\", \"tests\", \"1\");\n  OutputXmlAttribute(stream, \"testsuite\", \"failures\", \"1\");\n  OutputXmlAttribute(stream, \"testsuite\", \"disabled\", \"0\");\n  OutputXmlAttribute(stream, \"testsuite\", \"skipped\", \"0\");\n  OutputXmlAttribute(stream, \"testsuite\", \"errors\", \"0\");\n  OutputXmlAttribute(stream, \"testsuite\", \"time\",\n                     FormatTimeInMillisAsSeconds(result.elapsed_time()));\n  OutputXmlAttribute(\n      stream, \"testsuite\", \"timestamp\",\n      FormatEpochTimeInMillisAsIso8601(result.start_timestamp()));\n  *stream << \">\";\n\n  // Output the boilerplate for a minimal test case with a single test.\n  *stream << \"    <testcase\";\n  OutputXmlAttribute(stream, \"testcase\", \"name\", \"\");\n  OutputXmlAttribute(stream, \"testcase\", \"status\", \"run\");\n  OutputXmlAttribute(stream, \"testcase\", \"result\", \"completed\");\n  OutputXmlAttribute(stream, \"testcase\", \"classname\", \"\");\n  OutputXmlAttribute(stream, \"testcase\", \"time\",\n                     FormatTimeInMillisAsSeconds(result.elapsed_time()));\n  OutputXmlAttribute(\n      stream, \"testcase\", \"timestamp\",\n      FormatEpochTimeInMillisAsIso8601(result.start_timestamp()));\n\n  // Output the actual test result.\n  OutputXmlTestResult(stream, result);\n\n  // Complete the test suite.\n  *stream << \"  </testsuite>\\n\";\n}\n\n// Prints an XML representation of a TestInfo object.\nvoid XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,\n                                                 const char* test_suite_name,\n                                                 const TestInfo& test_info) {\n  const TestResult& result = *test_info.result();\n  const std::string kTestsuite = \"testcase\";\n\n  if (test_info.is_in_another_shard()) {\n    return;\n  }\n\n  *stream << \"    <testcase\";\n  OutputXmlAttribute(stream, kTestsuite, \"name\", test_info.name());\n\n  if (test_info.value_param() != nullptr) {\n    OutputXmlAttribute(stream, kTestsuite, \"value_param\",\n                       test_info.value_param());\n  }\n  if (test_info.type_param() != nullptr) {\n    OutputXmlAttribute(stream, kTestsuite, \"type_param\",\n                       test_info.type_param());\n  }\n  if (GTEST_FLAG(list_tests)) {\n    OutputXmlAttribute(stream, kTestsuite, \"file\", test_info.file());\n    OutputXmlAttribute(stream, kTestsuite, \"line\",\n                       StreamableToString(test_info.line()));\n    *stream << \" />\\n\";\n    return;\n  }\n\n  OutputXmlAttribute(stream, kTestsuite, \"status\",\n                     test_info.should_run() ? \"run\" : \"notrun\");\n  OutputXmlAttribute(stream, kTestsuite, \"result\",\n                     test_info.should_run()\n                         ? (result.Skipped() ? \"skipped\" : \"completed\")\n                         : \"suppressed\");\n  OutputXmlAttribute(stream, kTestsuite, \"time\",\n                     FormatTimeInMillisAsSeconds(result.elapsed_time()));\n  OutputXmlAttribute(\n      stream, kTestsuite, \"timestamp\",\n      FormatEpochTimeInMillisAsIso8601(result.start_timestamp()));\n  OutputXmlAttribute(stream, kTestsuite, \"classname\", test_suite_name);\n\n  OutputXmlTestResult(stream, result);\n}\n\nvoid XmlUnitTestResultPrinter::OutputXmlTestResult(::std::ostream* stream,\n                                                   const TestResult& result) {\n  int failures = 0;\n  int skips = 0;\n  for (int i = 0; i < result.total_part_count(); ++i) {\n    const TestPartResult& part = result.GetTestPartResult(i);\n    if (part.failed()) {\n      if (++failures == 1 && skips == 0) {\n        *stream << \">\\n\";\n      }\n      const std::string location =\n          internal::FormatCompilerIndependentFileLocation(part.file_name(),\n                                                          part.line_number());\n      const std::string summary = location + \"\\n\" + part.summary();\n      *stream << \"      <failure message=\\\"\"\n              << EscapeXmlAttribute(summary)\n              << \"\\\" type=\\\"\\\">\";\n      const std::string detail = location + \"\\n\" + part.message();\n      OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str());\n      *stream << \"</failure>\\n\";\n    } else if (part.skipped()) {\n      if (++skips == 1 && failures == 0) {\n        *stream << \">\\n\";\n      }\n      const std::string location =\n          internal::FormatCompilerIndependentFileLocation(part.file_name(),\n                                                          part.line_number());\n      const std::string summary = location + \"\\n\" + part.summary();\n      *stream << \"      <skipped message=\\\"\"\n              << EscapeXmlAttribute(summary.c_str()) << \"\\\">\";\n      const std::string detail = location + \"\\n\" + part.message();\n      OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str());\n      *stream << \"</skipped>\\n\";\n    }\n  }\n\n  if (failures == 0 && skips == 0 && result.test_property_count() == 0) {\n    *stream << \" />\\n\";\n  } else {\n    if (failures == 0 && skips == 0) {\n      *stream << \">\\n\";\n    }\n    OutputXmlTestProperties(stream, result);\n    *stream << \"    </testcase>\\n\";\n  }\n}\n\n// Prints an XML representation of a TestSuite object\nvoid XmlUnitTestResultPrinter::PrintXmlTestSuite(std::ostream* stream,\n                                                 const TestSuite& test_suite) {\n  const std::string kTestsuite = \"testsuite\";\n  *stream << \"  <\" << kTestsuite;\n  OutputXmlAttribute(stream, kTestsuite, \"name\", test_suite.name());\n  OutputXmlAttribute(stream, kTestsuite, \"tests\",\n                     StreamableToString(test_suite.reportable_test_count()));\n  if (!GTEST_FLAG(list_tests)) {\n    OutputXmlAttribute(stream, kTestsuite, \"failures\",\n                       StreamableToString(test_suite.failed_test_count()));\n    OutputXmlAttribute(\n        stream, kTestsuite, \"disabled\",\n        StreamableToString(test_suite.reportable_disabled_test_count()));\n    OutputXmlAttribute(stream, kTestsuite, \"skipped\",\n                       StreamableToString(test_suite.skipped_test_count()));\n\n    OutputXmlAttribute(stream, kTestsuite, \"errors\", \"0\");\n\n    OutputXmlAttribute(stream, kTestsuite, \"time\",\n                       FormatTimeInMillisAsSeconds(test_suite.elapsed_time()));\n    OutputXmlAttribute(\n        stream, kTestsuite, \"timestamp\",\n        FormatEpochTimeInMillisAsIso8601(test_suite.start_timestamp()));\n    *stream << TestPropertiesAsXmlAttributes(test_suite.ad_hoc_test_result());\n  }\n  *stream << \">\\n\";\n  for (int i = 0; i < test_suite.total_test_count(); ++i) {\n    if (test_suite.GetTestInfo(i)->is_reportable())\n      OutputXmlTestInfo(stream, test_suite.name(), *test_suite.GetTestInfo(i));\n  }\n  *stream << \"  </\" << kTestsuite << \">\\n\";\n}\n\n// Prints an XML summary of unit_test to output stream out.\nvoid XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,\n                                                const UnitTest& unit_test) {\n  const std::string kTestsuites = \"testsuites\";\n\n  *stream << \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n\";\n  *stream << \"<\" << kTestsuites;\n\n  OutputXmlAttribute(stream, kTestsuites, \"tests\",\n                     StreamableToString(unit_test.reportable_test_count()));\n  OutputXmlAttribute(stream, kTestsuites, \"failures\",\n                     StreamableToString(unit_test.failed_test_count()));\n  OutputXmlAttribute(\n      stream, kTestsuites, \"disabled\",\n      StreamableToString(unit_test.reportable_disabled_test_count()));\n  OutputXmlAttribute(stream, kTestsuites, \"errors\", \"0\");\n  OutputXmlAttribute(stream, kTestsuites, \"time\",\n                     FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));\n  OutputXmlAttribute(\n      stream, kTestsuites, \"timestamp\",\n      FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp()));\n\n  if (GTEST_FLAG(shuffle)) {\n    OutputXmlAttribute(stream, kTestsuites, \"random_seed\",\n                       StreamableToString(unit_test.random_seed()));\n  }\n  *stream << TestPropertiesAsXmlAttributes(unit_test.ad_hoc_test_result());\n\n  OutputXmlAttribute(stream, kTestsuites, \"name\", \"AllTests\");\n  *stream << \">\\n\";\n\n  for (int i = 0; i < unit_test.total_test_suite_count(); ++i) {\n    if (unit_test.GetTestSuite(i)->reportable_test_count() > 0)\n      PrintXmlTestSuite(stream, *unit_test.GetTestSuite(i));\n  }\n\n  // If there was a test failure outside of one of the test suites (like in a\n  // test environment) include that in the output.\n  if (unit_test.ad_hoc_test_result().Failed()) {\n    OutputXmlTestSuiteForTestResult(stream, unit_test.ad_hoc_test_result());\n  }\n\n  *stream << \"</\" << kTestsuites << \">\\n\";\n}\n\nvoid XmlUnitTestResultPrinter::PrintXmlTestsList(\n    std::ostream* stream, const std::vector<TestSuite*>& test_suites) {\n  const std::string kTestsuites = \"testsuites\";\n\n  *stream << \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n\";\n  *stream << \"<\" << kTestsuites;\n\n  int total_tests = 0;\n  for (auto test_suite : test_suites) {\n    total_tests += test_suite->total_test_count();\n  }\n  OutputXmlAttribute(stream, kTestsuites, \"tests\",\n                     StreamableToString(total_tests));\n  OutputXmlAttribute(stream, kTestsuites, \"name\", \"AllTests\");\n  *stream << \">\\n\";\n\n  for (auto test_suite : test_suites) {\n    PrintXmlTestSuite(stream, *test_suite);\n  }\n  *stream << \"</\" << kTestsuites << \">\\n\";\n}\n\n// Produces a string representing the test properties in a result as space\n// delimited XML attributes based on the property key=\"value\" pairs.\nstd::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(\n    const TestResult& result) {\n  Message attributes;\n  for (int i = 0; i < result.test_property_count(); ++i) {\n    const TestProperty& property = result.GetTestProperty(i);\n    attributes << \" \" << property.key() << \"=\"\n        << \"\\\"\" << EscapeXmlAttribute(property.value()) << \"\\\"\";\n  }\n  return attributes.GetString();\n}\n\nvoid XmlUnitTestResultPrinter::OutputXmlTestProperties(\n    std::ostream* stream, const TestResult& result) {\n  const std::string kProperties = \"properties\";\n  const std::string kProperty = \"property\";\n\n  if (result.test_property_count() <= 0) {\n    return;\n  }\n\n  *stream << \"<\" << kProperties << \">\\n\";\n  for (int i = 0; i < result.test_property_count(); ++i) {\n    const TestProperty& property = result.GetTestProperty(i);\n    *stream << \"<\" << kProperty;\n    *stream << \" name=\\\"\" << EscapeXmlAttribute(property.key()) << \"\\\"\";\n    *stream << \" value=\\\"\" << EscapeXmlAttribute(property.value()) << \"\\\"\";\n    *stream << \"/>\\n\";\n  }\n  *stream << \"</\" << kProperties << \">\\n\";\n}\n\n// End XmlUnitTestResultPrinter\n\n// This class generates an JSON output file.\nclass JsonUnitTestResultPrinter : public EmptyTestEventListener {\n public:\n  explicit JsonUnitTestResultPrinter(const char* output_file);\n\n  void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override;\n\n  // Prints an JSON summary of all unit tests.\n  static void PrintJsonTestList(::std::ostream* stream,\n                                const std::vector<TestSuite*>& test_suites);\n\n private:\n  // Returns an JSON-escaped copy of the input string str.\n  static std::string EscapeJson(const std::string& str);\n\n  //// Verifies that the given attribute belongs to the given element and\n  //// streams the attribute as JSON.\n  static void OutputJsonKey(std::ostream* stream,\n                            const std::string& element_name,\n                            const std::string& name,\n                            const std::string& value,\n                            const std::string& indent,\n                            bool comma = true);\n  static void OutputJsonKey(std::ostream* stream,\n                            const std::string& element_name,\n                            const std::string& name,\n                            int value,\n                            const std::string& indent,\n                            bool comma = true);\n\n  // Streams a test suite JSON stanza containing the given test result.\n  //\n  // Requires: result.Failed()\n  static void OutputJsonTestSuiteForTestResult(::std::ostream* stream,\n                                               const TestResult& result);\n\n  // Streams a JSON representation of a TestResult object.\n  static void OutputJsonTestResult(::std::ostream* stream,\n                                   const TestResult& result);\n\n  // Streams a JSON representation of a TestInfo object.\n  static void OutputJsonTestInfo(::std::ostream* stream,\n                                 const char* test_suite_name,\n                                 const TestInfo& test_info);\n\n  // Prints a JSON representation of a TestSuite object\n  static void PrintJsonTestSuite(::std::ostream* stream,\n                                 const TestSuite& test_suite);\n\n  // Prints a JSON summary of unit_test to output stream out.\n  static void PrintJsonUnitTest(::std::ostream* stream,\n                                const UnitTest& unit_test);\n\n  // Produces a string representing the test properties in a result as\n  // a JSON dictionary.\n  static std::string TestPropertiesAsJson(const TestResult& result,\n                                          const std::string& indent);\n\n  // The output file.\n  const std::string output_file_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(JsonUnitTestResultPrinter);\n};\n\n// Creates a new JsonUnitTestResultPrinter.\nJsonUnitTestResultPrinter::JsonUnitTestResultPrinter(const char* output_file)\n    : output_file_(output_file) {\n  if (output_file_.empty()) {\n    GTEST_LOG_(FATAL) << \"JSON output file may not be null\";\n  }\n}\n\nvoid JsonUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,\n                                                  int /*iteration*/) {\n  FILE* jsonout = OpenFileForWriting(output_file_);\n  std::stringstream stream;\n  PrintJsonUnitTest(&stream, unit_test);\n  fprintf(jsonout, \"%s\", StringStreamToString(&stream).c_str());\n  fclose(jsonout);\n}\n\n// Returns an JSON-escaped copy of the input string str.\nstd::string JsonUnitTestResultPrinter::EscapeJson(const std::string& str) {\n  Message m;\n\n  for (size_t i = 0; i < str.size(); ++i) {\n    const char ch = str[i];\n    switch (ch) {\n      case '\\\\':\n      case '\"':\n      case '/':\n        m << '\\\\' << ch;\n        break;\n      case '\\b':\n        m << \"\\\\b\";\n        break;\n      case '\\t':\n        m << \"\\\\t\";\n        break;\n      case '\\n':\n        m << \"\\\\n\";\n        break;\n      case '\\f':\n        m << \"\\\\f\";\n        break;\n      case '\\r':\n        m << \"\\\\r\";\n        break;\n      default:\n        if (ch < ' ') {\n          m << \"\\\\u00\" << String::FormatByte(static_cast<unsigned char>(ch));\n        } else {\n          m << ch;\n        }\n        break;\n    }\n  }\n\n  return m.GetString();\n}\n\n// The following routines generate an JSON representation of a UnitTest\n// object.\n\n// Formats the given time in milliseconds as seconds.\nstatic std::string FormatTimeInMillisAsDuration(TimeInMillis ms) {\n  ::std::stringstream ss;\n  ss << (static_cast<double>(ms) * 1e-3) << \"s\";\n  return ss.str();\n}\n\n// Converts the given epoch time in milliseconds to a date string in the\n// RFC3339 format, without the timezone information.\nstatic std::string FormatEpochTimeInMillisAsRFC3339(TimeInMillis ms) {\n  struct tm time_struct;\n  if (!PortableLocaltime(static_cast<time_t>(ms / 1000), &time_struct))\n    return \"\";\n  // YYYY-MM-DDThh:mm:ss\n  return StreamableToString(time_struct.tm_year + 1900) + \"-\" +\n      String::FormatIntWidth2(time_struct.tm_mon + 1) + \"-\" +\n      String::FormatIntWidth2(time_struct.tm_mday) + \"T\" +\n      String::FormatIntWidth2(time_struct.tm_hour) + \":\" +\n      String::FormatIntWidth2(time_struct.tm_min) + \":\" +\n      String::FormatIntWidth2(time_struct.tm_sec) + \"Z\";\n}\n\nstatic inline std::string Indent(size_t width) {\n  return std::string(width, ' ');\n}\n\nvoid JsonUnitTestResultPrinter::OutputJsonKey(\n    std::ostream* stream,\n    const std::string& element_name,\n    const std::string& name,\n    const std::string& value,\n    const std::string& indent,\n    bool comma) {\n  const std::vector<std::string>& allowed_names =\n      GetReservedOutputAttributesForElement(element_name);\n\n  GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=\n                   allowed_names.end())\n      << \"Key \\\"\" << name << \"\\\" is not allowed for value \\\"\" << element_name\n      << \"\\\".\";\n\n  *stream << indent << \"\\\"\" << name << \"\\\": \\\"\" << EscapeJson(value) << \"\\\"\";\n  if (comma)\n    *stream << \",\\n\";\n}\n\nvoid JsonUnitTestResultPrinter::OutputJsonKey(\n    std::ostream* stream,\n    const std::string& element_name,\n    const std::string& name,\n    int value,\n    const std::string& indent,\n    bool comma) {\n  const std::vector<std::string>& allowed_names =\n      GetReservedOutputAttributesForElement(element_name);\n\n  GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=\n                   allowed_names.end())\n      << \"Key \\\"\" << name << \"\\\" is not allowed for value \\\"\" << element_name\n      << \"\\\".\";\n\n  *stream << indent << \"\\\"\" << name << \"\\\": \" << StreamableToString(value);\n  if (comma)\n    *stream << \",\\n\";\n}\n\n// Streams a test suite JSON stanza containing the given test result.\nvoid JsonUnitTestResultPrinter::OutputJsonTestSuiteForTestResult(\n    ::std::ostream* stream, const TestResult& result) {\n  // Output the boilerplate for a new test suite.\n  *stream << Indent(4) << \"{\\n\";\n  OutputJsonKey(stream, \"testsuite\", \"name\", \"NonTestSuiteFailure\", Indent(6));\n  OutputJsonKey(stream, \"testsuite\", \"tests\", 1, Indent(6));\n  if (!GTEST_FLAG(list_tests)) {\n    OutputJsonKey(stream, \"testsuite\", \"failures\", 1, Indent(6));\n    OutputJsonKey(stream, \"testsuite\", \"disabled\", 0, Indent(6));\n    OutputJsonKey(stream, \"testsuite\", \"skipped\", 0, Indent(6));\n    OutputJsonKey(stream, \"testsuite\", \"errors\", 0, Indent(6));\n    OutputJsonKey(stream, \"testsuite\", \"time\",\n                  FormatTimeInMillisAsDuration(result.elapsed_time()),\n                  Indent(6));\n    OutputJsonKey(stream, \"testsuite\", \"timestamp\",\n                  FormatEpochTimeInMillisAsRFC3339(result.start_timestamp()),\n                  Indent(6));\n  }\n  *stream << Indent(6) << \"\\\"testsuite\\\": [\\n\";\n\n  // Output the boilerplate for a new test case.\n  *stream << Indent(8) << \"{\\n\";\n  OutputJsonKey(stream, \"testcase\", \"name\", \"\", Indent(10));\n  OutputJsonKey(stream, \"testcase\", \"status\", \"RUN\", Indent(10));\n  OutputJsonKey(stream, \"testcase\", \"result\", \"COMPLETED\", Indent(10));\n  OutputJsonKey(stream, \"testcase\", \"timestamp\",\n                FormatEpochTimeInMillisAsRFC3339(result.start_timestamp()),\n                Indent(10));\n  OutputJsonKey(stream, \"testcase\", \"time\",\n                FormatTimeInMillisAsDuration(result.elapsed_time()),\n                Indent(10));\n  OutputJsonKey(stream, \"testcase\", \"classname\", \"\", Indent(10), false);\n  *stream << TestPropertiesAsJson(result, Indent(10));\n\n  // Output the actual test result.\n  OutputJsonTestResult(stream, result);\n\n  // Finish the test suite.\n  *stream << \"\\n\" << Indent(6) << \"]\\n\" << Indent(4) << \"}\";\n}\n\n// Prints a JSON representation of a TestInfo object.\nvoid JsonUnitTestResultPrinter::OutputJsonTestInfo(::std::ostream* stream,\n                                                   const char* test_suite_name,\n                                                   const TestInfo& test_info) {\n  const TestResult& result = *test_info.result();\n  const std::string kTestsuite = \"testcase\";\n  const std::string kIndent = Indent(10);\n\n  *stream << Indent(8) << \"{\\n\";\n  OutputJsonKey(stream, kTestsuite, \"name\", test_info.name(), kIndent);\n\n  if (test_info.value_param() != nullptr) {\n    OutputJsonKey(stream, kTestsuite, \"value_param\", test_info.value_param(),\n                  kIndent);\n  }\n  if (test_info.type_param() != nullptr) {\n    OutputJsonKey(stream, kTestsuite, \"type_param\", test_info.type_param(),\n                  kIndent);\n  }\n  if (GTEST_FLAG(list_tests)) {\n    OutputJsonKey(stream, kTestsuite, \"file\", test_info.file(), kIndent);\n    OutputJsonKey(stream, kTestsuite, \"line\", test_info.line(), kIndent, false);\n    *stream << \"\\n\" << Indent(8) << \"}\";\n    return;\n  }\n\n  OutputJsonKey(stream, kTestsuite, \"status\",\n                test_info.should_run() ? \"RUN\" : \"NOTRUN\", kIndent);\n  OutputJsonKey(stream, kTestsuite, \"result\",\n                test_info.should_run()\n                    ? (result.Skipped() ? \"SKIPPED\" : \"COMPLETED\")\n                    : \"SUPPRESSED\",\n                kIndent);\n  OutputJsonKey(stream, kTestsuite, \"timestamp\",\n                FormatEpochTimeInMillisAsRFC3339(result.start_timestamp()),\n                kIndent);\n  OutputJsonKey(stream, kTestsuite, \"time\",\n                FormatTimeInMillisAsDuration(result.elapsed_time()), kIndent);\n  OutputJsonKey(stream, kTestsuite, \"classname\", test_suite_name, kIndent,\n                false);\n  *stream << TestPropertiesAsJson(result, kIndent);\n\n  OutputJsonTestResult(stream, result);\n}\n\nvoid JsonUnitTestResultPrinter::OutputJsonTestResult(::std::ostream* stream,\n                                                     const TestResult& result) {\n  const std::string kIndent = Indent(10);\n\n  int failures = 0;\n  for (int i = 0; i < result.total_part_count(); ++i) {\n    const TestPartResult& part = result.GetTestPartResult(i);\n    if (part.failed()) {\n      *stream << \",\\n\";\n      if (++failures == 1) {\n        *stream << kIndent << \"\\\"\" << \"failures\" << \"\\\": [\\n\";\n      }\n      const std::string location =\n          internal::FormatCompilerIndependentFileLocation(part.file_name(),\n                                                          part.line_number());\n      const std::string message = EscapeJson(location + \"\\n\" + part.message());\n      *stream << kIndent << \"  {\\n\"\n              << kIndent << \"    \\\"failure\\\": \\\"\" << message << \"\\\",\\n\"\n              << kIndent << \"    \\\"type\\\": \\\"\\\"\\n\"\n              << kIndent << \"  }\";\n    }\n  }\n\n  if (failures > 0)\n    *stream << \"\\n\" << kIndent << \"]\";\n  *stream << \"\\n\" << Indent(8) << \"}\";\n}\n\n// Prints an JSON representation of a TestSuite object\nvoid JsonUnitTestResultPrinter::PrintJsonTestSuite(\n    std::ostream* stream, const TestSuite& test_suite) {\n  const std::string kTestsuite = \"testsuite\";\n  const std::string kIndent = Indent(6);\n\n  *stream << Indent(4) << \"{\\n\";\n  OutputJsonKey(stream, kTestsuite, \"name\", test_suite.name(), kIndent);\n  OutputJsonKey(stream, kTestsuite, \"tests\", test_suite.reportable_test_count(),\n                kIndent);\n  if (!GTEST_FLAG(list_tests)) {\n    OutputJsonKey(stream, kTestsuite, \"failures\",\n                  test_suite.failed_test_count(), kIndent);\n    OutputJsonKey(stream, kTestsuite, \"disabled\",\n                  test_suite.reportable_disabled_test_count(), kIndent);\n    OutputJsonKey(stream, kTestsuite, \"errors\", 0, kIndent);\n    OutputJsonKey(\n        stream, kTestsuite, \"timestamp\",\n        FormatEpochTimeInMillisAsRFC3339(test_suite.start_timestamp()),\n        kIndent);\n    OutputJsonKey(stream, kTestsuite, \"time\",\n                  FormatTimeInMillisAsDuration(test_suite.elapsed_time()),\n                  kIndent, false);\n    *stream << TestPropertiesAsJson(test_suite.ad_hoc_test_result(), kIndent)\n            << \",\\n\";\n  }\n\n  *stream << kIndent << \"\\\"\" << kTestsuite << \"\\\": [\\n\";\n\n  bool comma = false;\n  for (int i = 0; i < test_suite.total_test_count(); ++i) {\n    if (test_suite.GetTestInfo(i)->is_reportable()) {\n      if (comma) {\n        *stream << \",\\n\";\n      } else {\n        comma = true;\n      }\n      OutputJsonTestInfo(stream, test_suite.name(), *test_suite.GetTestInfo(i));\n    }\n  }\n  *stream << \"\\n\" << kIndent << \"]\\n\" << Indent(4) << \"}\";\n}\n\n// Prints a JSON summary of unit_test to output stream out.\nvoid JsonUnitTestResultPrinter::PrintJsonUnitTest(std::ostream* stream,\n                                                  const UnitTest& unit_test) {\n  const std::string kTestsuites = \"testsuites\";\n  const std::string kIndent = Indent(2);\n  *stream << \"{\\n\";\n\n  OutputJsonKey(stream, kTestsuites, \"tests\", unit_test.reportable_test_count(),\n                kIndent);\n  OutputJsonKey(stream, kTestsuites, \"failures\", unit_test.failed_test_count(),\n                kIndent);\n  OutputJsonKey(stream, kTestsuites, \"disabled\",\n                unit_test.reportable_disabled_test_count(), kIndent);\n  OutputJsonKey(stream, kTestsuites, \"errors\", 0, kIndent);\n  if (GTEST_FLAG(shuffle)) {\n    OutputJsonKey(stream, kTestsuites, \"random_seed\", unit_test.random_seed(),\n                  kIndent);\n  }\n  OutputJsonKey(stream, kTestsuites, \"timestamp\",\n                FormatEpochTimeInMillisAsRFC3339(unit_test.start_timestamp()),\n                kIndent);\n  OutputJsonKey(stream, kTestsuites, \"time\",\n                FormatTimeInMillisAsDuration(unit_test.elapsed_time()), kIndent,\n                false);\n\n  *stream << TestPropertiesAsJson(unit_test.ad_hoc_test_result(), kIndent)\n          << \",\\n\";\n\n  OutputJsonKey(stream, kTestsuites, \"name\", \"AllTests\", kIndent);\n  *stream << kIndent << \"\\\"\" << kTestsuites << \"\\\": [\\n\";\n\n  bool comma = false;\n  for (int i = 0; i < unit_test.total_test_suite_count(); ++i) {\n    if (unit_test.GetTestSuite(i)->reportable_test_count() > 0) {\n      if (comma) {\n        *stream << \",\\n\";\n      } else {\n        comma = true;\n      }\n      PrintJsonTestSuite(stream, *unit_test.GetTestSuite(i));\n    }\n  }\n\n  // If there was a test failure outside of one of the test suites (like in a\n  // test environment) include that in the output.\n  if (unit_test.ad_hoc_test_result().Failed()) {\n    OutputJsonTestSuiteForTestResult(stream, unit_test.ad_hoc_test_result());\n  }\n\n  *stream << \"\\n\" << kIndent << \"]\\n\" << \"}\\n\";\n}\n\nvoid JsonUnitTestResultPrinter::PrintJsonTestList(\n    std::ostream* stream, const std::vector<TestSuite*>& test_suites) {\n  const std::string kTestsuites = \"testsuites\";\n  const std::string kIndent = Indent(2);\n  *stream << \"{\\n\";\n  int total_tests = 0;\n  for (auto test_suite : test_suites) {\n    total_tests += test_suite->total_test_count();\n  }\n  OutputJsonKey(stream, kTestsuites, \"tests\", total_tests, kIndent);\n\n  OutputJsonKey(stream, kTestsuites, \"name\", \"AllTests\", kIndent);\n  *stream << kIndent << \"\\\"\" << kTestsuites << \"\\\": [\\n\";\n\n  for (size_t i = 0; i < test_suites.size(); ++i) {\n    if (i != 0) {\n      *stream << \",\\n\";\n    }\n    PrintJsonTestSuite(stream, *test_suites[i]);\n  }\n\n  *stream << \"\\n\"\n          << kIndent << \"]\\n\"\n          << \"}\\n\";\n}\n// Produces a string representing the test properties in a result as\n// a JSON dictionary.\nstd::string JsonUnitTestResultPrinter::TestPropertiesAsJson(\n    const TestResult& result, const std::string& indent) {\n  Message attributes;\n  for (int i = 0; i < result.test_property_count(); ++i) {\n    const TestProperty& property = result.GetTestProperty(i);\n    attributes << \",\\n\" << indent << \"\\\"\" << property.key() << \"\\\": \"\n               << \"\\\"\" << EscapeJson(property.value()) << \"\\\"\";\n  }\n  return attributes.GetString();\n}\n\n// End JsonUnitTestResultPrinter\n\n#if GTEST_CAN_STREAM_RESULTS_\n\n// Checks if str contains '=', '&', '%' or '\\n' characters. If yes,\n// replaces them by \"%xx\" where xx is their hexadecimal value. For\n// example, replaces \"=\" with \"%3D\".  This algorithm is O(strlen(str))\n// in both time and space -- important as the input str may contain an\n// arbitrarily long test failure message and stack trace.\nstd::string StreamingListener::UrlEncode(const char* str) {\n  std::string result;\n  result.reserve(strlen(str) + 1);\n  for (char ch = *str; ch != '\\0'; ch = *++str) {\n    switch (ch) {\n      case '%':\n      case '=':\n      case '&':\n      case '\\n':\n        result.append(\"%\" + String::FormatByte(static_cast<unsigned char>(ch)));\n        break;\n      default:\n        result.push_back(ch);\n        break;\n    }\n  }\n  return result;\n}\n\nvoid StreamingListener::SocketWriter::MakeConnection() {\n  GTEST_CHECK_(sockfd_ == -1)\n      << \"MakeConnection() can't be called when there is already a connection.\";\n\n  addrinfo hints;\n  memset(&hints, 0, sizeof(hints));\n  hints.ai_family = AF_UNSPEC;    // To allow both IPv4 and IPv6 addresses.\n  hints.ai_socktype = SOCK_STREAM;\n  addrinfo* servinfo = nullptr;\n\n  // Use the getaddrinfo() to get a linked list of IP addresses for\n  // the given host name.\n  const int error_num = getaddrinfo(\n      host_name_.c_str(), port_num_.c_str(), &hints, &servinfo);\n  if (error_num != 0) {\n    GTEST_LOG_(WARNING) << \"stream_result_to: getaddrinfo() failed: \"\n                        << gai_strerror(error_num);\n  }\n\n  // Loop through all the results and connect to the first we can.\n  for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != nullptr;\n       cur_addr = cur_addr->ai_next) {\n    sockfd_ = socket(\n        cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);\n    if (sockfd_ != -1) {\n      // Connect the client socket to the server socket.\n      if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) {\n        close(sockfd_);\n        sockfd_ = -1;\n      }\n    }\n  }\n\n  freeaddrinfo(servinfo);  // all done with this structure\n\n  if (sockfd_ == -1) {\n    GTEST_LOG_(WARNING) << \"stream_result_to: failed to connect to \"\n                        << host_name_ << \":\" << port_num_;\n  }\n}\n\n// End of class Streaming Listener\n#endif  // GTEST_CAN_STREAM_RESULTS__\n\n// class OsStackTraceGetter\n\nconst char* const OsStackTraceGetterInterface::kElidedFramesMarker =\n    \"... \" GTEST_NAME_ \" internal frames ...\";\n\nstd::string OsStackTraceGetter::CurrentStackTrace(int max_depth, int skip_count)\n    GTEST_LOCK_EXCLUDED_(mutex_) {\n#if GTEST_HAS_ABSL\n  std::string result;\n\n  if (max_depth <= 0) {\n    return result;\n  }\n\n  max_depth = std::min(max_depth, kMaxStackTraceDepth);\n\n  std::vector<void*> raw_stack(max_depth);\n  // Skips the frames requested by the caller, plus this function.\n  const int raw_stack_size =\n      absl::GetStackTrace(&raw_stack[0], max_depth, skip_count + 1);\n\n  void* caller_frame = nullptr;\n  {\n    MutexLock lock(&mutex_);\n    caller_frame = caller_frame_;\n  }\n\n  for (int i = 0; i < raw_stack_size; ++i) {\n    if (raw_stack[i] == caller_frame &&\n        !GTEST_FLAG(show_internal_stack_frames)) {\n      // Add a marker to the trace and stop adding frames.\n      absl::StrAppend(&result, kElidedFramesMarker, \"\\n\");\n      break;\n    }\n\n    char tmp[1024];\n    const char* symbol = \"(unknown)\";\n    if (absl::Symbolize(raw_stack[i], tmp, sizeof(tmp))) {\n      symbol = tmp;\n    }\n\n    char line[1024];\n    snprintf(line, sizeof(line), \"  %p: %s\\n\", raw_stack[i], symbol);\n    result += line;\n  }\n\n  return result;\n\n#else  // !GTEST_HAS_ABSL\n  static_cast<void>(max_depth);\n  static_cast<void>(skip_count);\n  return \"\";\n#endif  // GTEST_HAS_ABSL\n}\n\nvoid OsStackTraceGetter::UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_) {\n#if GTEST_HAS_ABSL\n  void* caller_frame = nullptr;\n  if (absl::GetStackTrace(&caller_frame, 1, 3) <= 0) {\n    caller_frame = nullptr;\n  }\n\n  MutexLock lock(&mutex_);\n  caller_frame_ = caller_frame;\n#endif  // GTEST_HAS_ABSL\n}\n\n// A helper class that creates the premature-exit file in its\n// constructor and deletes the file in its destructor.\nclass ScopedPrematureExitFile {\n public:\n  explicit ScopedPrematureExitFile(const char* premature_exit_filepath)\n      : premature_exit_filepath_(premature_exit_filepath ?\n                                 premature_exit_filepath : \"\") {\n    // If a path to the premature-exit file is specified...\n    if (!premature_exit_filepath_.empty()) {\n      // create the file with a single \"0\" character in it.  I/O\n      // errors are ignored as there's nothing better we can do and we\n      // don't want to fail the test because of this.\n      FILE* pfile = posix::FOpen(premature_exit_filepath, \"w\");\n      fwrite(\"0\", 1, 1, pfile);\n      fclose(pfile);\n    }\n  }\n\n  ~ScopedPrematureExitFile() {\n#if !defined GTEST_OS_ESP8266\n    if (!premature_exit_filepath_.empty()) {\n      int retval = remove(premature_exit_filepath_.c_str());\n      if (retval) {\n        GTEST_LOG_(ERROR) << \"Failed to remove premature exit filepath \\\"\"\n                          << premature_exit_filepath_ << \"\\\" with error \"\n                          << retval;\n      }\n    }\n#endif\n  }\n\n private:\n  const std::string premature_exit_filepath_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedPrematureExitFile);\n};\n\n}  // namespace internal\n\n// class TestEventListeners\n\nTestEventListeners::TestEventListeners()\n    : repeater_(new internal::TestEventRepeater()),\n      default_result_printer_(nullptr),\n      default_xml_generator_(nullptr) {}\n\nTestEventListeners::~TestEventListeners() { delete repeater_; }\n\n// Returns the standard listener responsible for the default console\n// output.  Can be removed from the listeners list to shut down default\n// console output.  Note that removing this object from the listener list\n// with Release transfers its ownership to the user.\nvoid TestEventListeners::Append(TestEventListener* listener) {\n  repeater_->Append(listener);\n}\n\n// Removes the given event listener from the list and returns it.  It then\n// becomes the caller's responsibility to delete the listener. Returns\n// NULL if the listener is not found in the list.\nTestEventListener* TestEventListeners::Release(TestEventListener* listener) {\n  if (listener == default_result_printer_)\n    default_result_printer_ = nullptr;\n  else if (listener == default_xml_generator_)\n    default_xml_generator_ = nullptr;\n  return repeater_->Release(listener);\n}\n\n// Returns repeater that broadcasts the TestEventListener events to all\n// subscribers.\nTestEventListener* TestEventListeners::repeater() { return repeater_; }\n\n// Sets the default_result_printer attribute to the provided listener.\n// The listener is also added to the listener list and previous\n// default_result_printer is removed from it and deleted. The listener can\n// also be NULL in which case it will not be added to the list. Does\n// nothing if the previous and the current listener objects are the same.\nvoid TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {\n  if (default_result_printer_ != listener) {\n    // It is an error to pass this method a listener that is already in the\n    // list.\n    delete Release(default_result_printer_);\n    default_result_printer_ = listener;\n    if (listener != nullptr) Append(listener);\n  }\n}\n\n// Sets the default_xml_generator attribute to the provided listener.  The\n// listener is also added to the listener list and previous\n// default_xml_generator is removed from it and deleted. The listener can\n// also be NULL in which case it will not be added to the list. Does\n// nothing if the previous and the current listener objects are the same.\nvoid TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {\n  if (default_xml_generator_ != listener) {\n    // It is an error to pass this method a listener that is already in the\n    // list.\n    delete Release(default_xml_generator_);\n    default_xml_generator_ = listener;\n    if (listener != nullptr) Append(listener);\n  }\n}\n\n// Controls whether events will be forwarded by the repeater to the\n// listeners in the list.\nbool TestEventListeners::EventForwardingEnabled() const {\n  return repeater_->forwarding_enabled();\n}\n\nvoid TestEventListeners::SuppressEventForwarding() {\n  repeater_->set_forwarding_enabled(false);\n}\n\n// class UnitTest\n\n// Gets the singleton UnitTest object.  The first time this method is\n// called, a UnitTest object is constructed and returned.  Consecutive\n// calls will return the same object.\n//\n// We don't protect this under mutex_ as a user is not supposed to\n// call this before main() starts, from which point on the return\n// value will never change.\nUnitTest* UnitTest::GetInstance() {\n  // CodeGear C++Builder insists on a public destructor for the\n  // default implementation.  Use this implementation to keep good OO\n  // design with private destructor.\n\n#if defined(__BORLANDC__)\n  static UnitTest* const instance = new UnitTest;\n  return instance;\n#else\n  static UnitTest instance;\n  return &instance;\n#endif  // defined(__BORLANDC__)\n}\n\n// Gets the number of successful test suites.\nint UnitTest::successful_test_suite_count() const {\n  return impl()->successful_test_suite_count();\n}\n\n// Gets the number of failed test suites.\nint UnitTest::failed_test_suite_count() const {\n  return impl()->failed_test_suite_count();\n}\n\n// Gets the number of all test suites.\nint UnitTest::total_test_suite_count() const {\n  return impl()->total_test_suite_count();\n}\n\n// Gets the number of all test suites that contain at least one test\n// that should run.\nint UnitTest::test_suite_to_run_count() const {\n  return impl()->test_suite_to_run_count();\n}\n\n//  Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\nint UnitTest::successful_test_case_count() const {\n  return impl()->successful_test_suite_count();\n}\nint UnitTest::failed_test_case_count() const {\n  return impl()->failed_test_suite_count();\n}\nint UnitTest::total_test_case_count() const {\n  return impl()->total_test_suite_count();\n}\nint UnitTest::test_case_to_run_count() const {\n  return impl()->test_suite_to_run_count();\n}\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n// Gets the number of successful tests.\nint UnitTest::successful_test_count() const {\n  return impl()->successful_test_count();\n}\n\n// Gets the number of skipped tests.\nint UnitTest::skipped_test_count() const {\n  return impl()->skipped_test_count();\n}\n\n// Gets the number of failed tests.\nint UnitTest::failed_test_count() const { return impl()->failed_test_count(); }\n\n// Gets the number of disabled tests that will be reported in the XML report.\nint UnitTest::reportable_disabled_test_count() const {\n  return impl()->reportable_disabled_test_count();\n}\n\n// Gets the number of disabled tests.\nint UnitTest::disabled_test_count() const {\n  return impl()->disabled_test_count();\n}\n\n// Gets the number of tests to be printed in the XML report.\nint UnitTest::reportable_test_count() const {\n  return impl()->reportable_test_count();\n}\n\n// Gets the number of all tests.\nint UnitTest::total_test_count() const { return impl()->total_test_count(); }\n\n// Gets the number of tests that should run.\nint UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }\n\n// Gets the time of the test program start, in ms from the start of the\n// UNIX epoch.\ninternal::TimeInMillis UnitTest::start_timestamp() const {\n    return impl()->start_timestamp();\n}\n\n// Gets the elapsed time, in milliseconds.\ninternal::TimeInMillis UnitTest::elapsed_time() const {\n  return impl()->elapsed_time();\n}\n\n// Returns true if and only if the unit test passed (i.e. all test suites\n// passed).\nbool UnitTest::Passed() const { return impl()->Passed(); }\n\n// Returns true if and only if the unit test failed (i.e. some test suite\n// failed or something outside of all tests failed).\nbool UnitTest::Failed() const { return impl()->Failed(); }\n\n// Gets the i-th test suite among all the test suites. i can range from 0 to\n// total_test_suite_count() - 1. If i is not in that range, returns NULL.\nconst TestSuite* UnitTest::GetTestSuite(int i) const {\n  return impl()->GetTestSuite(i);\n}\n\n//  Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\nconst TestCase* UnitTest::GetTestCase(int i) const {\n  return impl()->GetTestCase(i);\n}\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n// Returns the TestResult containing information on test failures and\n// properties logged outside of individual test suites.\nconst TestResult& UnitTest::ad_hoc_test_result() const {\n  return *impl()->ad_hoc_test_result();\n}\n\n// Gets the i-th test suite among all the test suites. i can range from 0 to\n// total_test_suite_count() - 1. If i is not in that range, returns NULL.\nTestSuite* UnitTest::GetMutableTestSuite(int i) {\n  return impl()->GetMutableSuiteCase(i);\n}\n\n// Returns the list of event listeners that can be used to track events\n// inside Google Test.\nTestEventListeners& UnitTest::listeners() {\n  return *impl()->listeners();\n}\n\n// Registers and returns a global test environment.  When a test\n// program is run, all global test environments will be set-up in the\n// order they were registered.  After all tests in the program have\n// finished, all global test environments will be torn-down in the\n// *reverse* order they were registered.\n//\n// The UnitTest object takes ownership of the given environment.\n//\n// We don't protect this under mutex_, as we only support calling it\n// from the main thread.\nEnvironment* UnitTest::AddEnvironment(Environment* env) {\n  if (env == nullptr) {\n    return nullptr;\n  }\n\n  impl_->environments().push_back(env);\n  return env;\n}\n\n// Adds a TestPartResult to the current TestResult object.  All Google Test\n// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call\n// this to report their results.  The user code should use the\n// assertion macros instead of calling this directly.\nvoid UnitTest::AddTestPartResult(\n    TestPartResult::Type result_type,\n    const char* file_name,\n    int line_number,\n    const std::string& message,\n    const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_) {\n  Message msg;\n  msg << message;\n\n  internal::MutexLock lock(&mutex_);\n  if (impl_->gtest_trace_stack().size() > 0) {\n    msg << \"\\n\" << GTEST_NAME_ << \" trace:\";\n\n    for (size_t i = impl_->gtest_trace_stack().size(); i > 0; --i) {\n      const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];\n      msg << \"\\n\" << internal::FormatFileLocation(trace.file, trace.line)\n          << \" \" << trace.message;\n    }\n  }\n\n  if (os_stack_trace.c_str() != nullptr && !os_stack_trace.empty()) {\n    msg << internal::kStackTraceMarker << os_stack_trace;\n  }\n\n  const TestPartResult result = TestPartResult(\n      result_type, file_name, line_number, msg.GetString().c_str());\n  impl_->GetTestPartResultReporterForCurrentThread()->\n      ReportTestPartResult(result);\n\n  if (result_type != TestPartResult::kSuccess &&\n      result_type != TestPartResult::kSkip) {\n    // gtest_break_on_failure takes precedence over\n    // gtest_throw_on_failure.  This allows a user to set the latter\n    // in the code (perhaps in order to use Google Test assertions\n    // with another testing framework) and specify the former on the\n    // command line for debugging.\n    if (GTEST_FLAG(break_on_failure)) {\n#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT\n      // Using DebugBreak on Windows allows gtest to still break into a debugger\n      // when a failure happens and both the --gtest_break_on_failure and\n      // the --gtest_catch_exceptions flags are specified.\n      DebugBreak();\n#elif (!defined(__native_client__)) &&            \\\n    ((defined(__clang__) || defined(__GNUC__)) && \\\n     (defined(__x86_64__) || defined(__i386__)))\n      // with clang/gcc we can achieve the same effect on x86 by invoking int3\n      asm(\"int3\");\n#else\n      // Dereference nullptr through a volatile pointer to prevent the compiler\n      // from removing. We use this rather than abort() or __builtin_trap() for\n      // portability: some debuggers don't correctly trap abort().\n      *static_cast<volatile int*>(nullptr) = 1;\n#endif  // GTEST_OS_WINDOWS\n    } else if (GTEST_FLAG(throw_on_failure)) {\n#if GTEST_HAS_EXCEPTIONS\n      throw internal::GoogleTestFailureException(result);\n#else\n      // We cannot call abort() as it generates a pop-up in debug mode\n      // that cannot be suppressed in VC 7.1 or below.\n      exit(1);\n#endif\n    }\n  }\n}\n\n// Adds a TestProperty to the current TestResult object when invoked from\n// inside a test, to current TestSuite's ad_hoc_test_result_ when invoked\n// from SetUpTestSuite or TearDownTestSuite, or to the global property set\n// when invoked elsewhere.  If the result already contains a property with\n// the same key, the value will be updated.\nvoid UnitTest::RecordProperty(const std::string& key,\n                              const std::string& value) {\n  impl_->RecordProperty(TestProperty(key, value));\n}\n\n// Runs all tests in this UnitTest object and prints the result.\n// Returns 0 if successful, or 1 otherwise.\n//\n// We don't protect this under mutex_, as we only support calling it\n// from the main thread.\nint UnitTest::Run() {\n  const bool in_death_test_child_process =\n      internal::GTEST_FLAG(internal_run_death_test).length() > 0;\n\n  // Google Test implements this protocol for catching that a test\n  // program exits before returning control to Google Test:\n  //\n  //   1. Upon start, Google Test creates a file whose absolute path\n  //      is specified by the environment variable\n  //      TEST_PREMATURE_EXIT_FILE.\n  //   2. When Google Test has finished its work, it deletes the file.\n  //\n  // This allows a test runner to set TEST_PREMATURE_EXIT_FILE before\n  // running a Google-Test-based test program and check the existence\n  // of the file at the end of the test execution to see if it has\n  // exited prematurely.\n\n  // If we are in the child process of a death test, don't\n  // create/delete the premature exit file, as doing so is unnecessary\n  // and will confuse the parent process.  Otherwise, create/delete\n  // the file upon entering/leaving this function.  If the program\n  // somehow exits before this function has a chance to return, the\n  // premature-exit file will be left undeleted, causing a test runner\n  // that understands the premature-exit-file protocol to report the\n  // test as having failed.\n  const internal::ScopedPrematureExitFile premature_exit_file(\n      in_death_test_child_process\n          ? nullptr\n          : internal::posix::GetEnv(\"TEST_PREMATURE_EXIT_FILE\"));\n\n  // Captures the value of GTEST_FLAG(catch_exceptions).  This value will be\n  // used for the duration of the program.\n  impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions));\n\n#if GTEST_OS_WINDOWS\n  // Either the user wants Google Test to catch exceptions thrown by the\n  // tests or this is executing in the context of death test child\n  // process. In either case the user does not want to see pop-up dialogs\n  // about crashes - they are expected.\n  if (impl()->catch_exceptions() || in_death_test_child_process) {\n# if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT\n    // SetErrorMode doesn't exist on CE.\n    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |\n                 SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);\n# endif  // !GTEST_OS_WINDOWS_MOBILE\n\n# if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE\n    // Death test children can be terminated with _abort().  On Windows,\n    // _abort() can show a dialog with a warning message.  This forces the\n    // abort message to go to stderr instead.\n    _set_error_mode(_OUT_TO_STDERR);\n# endif\n\n# if defined(_MSC_VER) && !GTEST_OS_WINDOWS_MOBILE\n    // In the debug version, Visual Studio pops up a separate dialog\n    // offering a choice to debug the aborted program. We need to suppress\n    // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement\n    // executed. Google Test will notify the user of any unexpected\n    // failure via stderr.\n    if (!GTEST_FLAG(break_on_failure))\n      _set_abort_behavior(\n          0x0,                                    // Clear the following flags:\n          _WRITE_ABORT_MSG | _CALL_REPORTFAULT);  // pop-up window, core dump.\n\n    // In debug mode, the Windows CRT can crash with an assertion over invalid\n    // input (e.g. passing an invalid file descriptor).  The default handling\n    // for these assertions is to pop up a dialog and wait for user input.\n    // Instead ask the CRT to dump such assertions to stderr non-interactively.\n    if (!IsDebuggerPresent()) {\n      (void)_CrtSetReportMode(_CRT_ASSERT,\n                              _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);\n      (void)_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);\n    }\n# endif\n  }\n#endif  // GTEST_OS_WINDOWS\n\n  return internal::HandleExceptionsInMethodIfSupported(\n      impl(),\n      &internal::UnitTestImpl::RunAllTests,\n      \"auxiliary test code (environments or event listeners)\") ? 0 : 1;\n}\n\n// Returns the working directory when the first TEST() or TEST_F() was\n// executed.\nconst char* UnitTest::original_working_dir() const {\n  return impl_->original_working_dir_.c_str();\n}\n\n// Returns the TestSuite object for the test that's currently running,\n// or NULL if no test is running.\nconst TestSuite* UnitTest::current_test_suite() const\n    GTEST_LOCK_EXCLUDED_(mutex_) {\n  internal::MutexLock lock(&mutex_);\n  return impl_->current_test_suite();\n}\n\n// Legacy API is still available but deprecated\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\nconst TestCase* UnitTest::current_test_case() const\n    GTEST_LOCK_EXCLUDED_(mutex_) {\n  internal::MutexLock lock(&mutex_);\n  return impl_->current_test_suite();\n}\n#endif\n\n// Returns the TestInfo object for the test that's currently running,\n// or NULL if no test is running.\nconst TestInfo* UnitTest::current_test_info() const\n    GTEST_LOCK_EXCLUDED_(mutex_) {\n  internal::MutexLock lock(&mutex_);\n  return impl_->current_test_info();\n}\n\n// Returns the random seed used at the start of the current test run.\nint UnitTest::random_seed() const { return impl_->random_seed(); }\n\n// Returns ParameterizedTestSuiteRegistry object used to keep track of\n// value-parameterized tests and instantiate and register them.\ninternal::ParameterizedTestSuiteRegistry&\nUnitTest::parameterized_test_registry() GTEST_LOCK_EXCLUDED_(mutex_) {\n  return impl_->parameterized_test_registry();\n}\n\n// Creates an empty UnitTest.\nUnitTest::UnitTest() {\n  impl_ = new internal::UnitTestImpl(this);\n}\n\n// Destructor of UnitTest.\nUnitTest::~UnitTest() {\n  delete impl_;\n}\n\n// Pushes a trace defined by SCOPED_TRACE() on to the per-thread\n// Google Test trace stack.\nvoid UnitTest::PushGTestTrace(const internal::TraceInfo& trace)\n    GTEST_LOCK_EXCLUDED_(mutex_) {\n  internal::MutexLock lock(&mutex_);\n  impl_->gtest_trace_stack().push_back(trace);\n}\n\n// Pops a trace from the per-thread Google Test trace stack.\nvoid UnitTest::PopGTestTrace()\n    GTEST_LOCK_EXCLUDED_(mutex_) {\n  internal::MutexLock lock(&mutex_);\n  impl_->gtest_trace_stack().pop_back();\n}\n\nnamespace internal {\n\nUnitTestImpl::UnitTestImpl(UnitTest* parent)\n    : parent_(parent),\n      GTEST_DISABLE_MSC_WARNINGS_PUSH_(4355 /* using this in initializer */)\n          default_global_test_part_result_reporter_(this),\n      default_per_thread_test_part_result_reporter_(this),\n      GTEST_DISABLE_MSC_WARNINGS_POP_() global_test_part_result_repoter_(\n          &default_global_test_part_result_reporter_),\n      per_thread_test_part_result_reporter_(\n          &default_per_thread_test_part_result_reporter_),\n      parameterized_test_registry_(),\n      parameterized_tests_registered_(false),\n      last_death_test_suite_(-1),\n      current_test_suite_(nullptr),\n      current_test_info_(nullptr),\n      ad_hoc_test_result_(),\n      os_stack_trace_getter_(nullptr),\n      post_flag_parse_init_performed_(false),\n      random_seed_(0),  // Will be overridden by the flag before first use.\n      random_(0),       // Will be reseeded before first use.\n      start_timestamp_(0),\n      elapsed_time_(0),\n#if GTEST_HAS_DEATH_TEST\n      death_test_factory_(new DefaultDeathTestFactory),\n#endif\n      // Will be overridden by the flag before first use.\n      catch_exceptions_(false) {\n  listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter);\n}\n\nUnitTestImpl::~UnitTestImpl() {\n  // Deletes every TestSuite.\n  ForEach(test_suites_, internal::Delete<TestSuite>);\n\n  // Deletes every Environment.\n  ForEach(environments_, internal::Delete<Environment>);\n\n  delete os_stack_trace_getter_;\n}\n\n// Adds a TestProperty to the current TestResult object when invoked in a\n// context of a test, to current test suite's ad_hoc_test_result when invoke\n// from SetUpTestSuite/TearDownTestSuite, or to the global property set\n// otherwise.  If the result already contains a property with the same key,\n// the value will be updated.\nvoid UnitTestImpl::RecordProperty(const TestProperty& test_property) {\n  std::string xml_element;\n  TestResult* test_result;  // TestResult appropriate for property recording.\n\n  if (current_test_info_ != nullptr) {\n    xml_element = \"testcase\";\n    test_result = &(current_test_info_->result_);\n  } else if (current_test_suite_ != nullptr) {\n    xml_element = \"testsuite\";\n    test_result = &(current_test_suite_->ad_hoc_test_result_);\n  } else {\n    xml_element = \"testsuites\";\n    test_result = &ad_hoc_test_result_;\n  }\n  test_result->RecordProperty(xml_element, test_property);\n}\n\n#if GTEST_HAS_DEATH_TEST\n// Disables event forwarding if the control is currently in a death test\n// subprocess. Must not be called before InitGoogleTest.\nvoid UnitTestImpl::SuppressTestEventsIfInSubprocess() {\n  if (internal_run_death_test_flag_.get() != nullptr)\n    listeners()->SuppressEventForwarding();\n}\n#endif  // GTEST_HAS_DEATH_TEST\n\n// Initializes event listeners performing XML output as specified by\n// UnitTestOptions. Must not be called before InitGoogleTest.\nvoid UnitTestImpl::ConfigureXmlOutput() {\n  const std::string& output_format = UnitTestOptions::GetOutputFormat();\n  if (output_format == \"xml\") {\n    listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(\n        UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));\n  } else if (output_format == \"json\") {\n    listeners()->SetDefaultXmlGenerator(new JsonUnitTestResultPrinter(\n        UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));\n  } else if (output_format != \"\") {\n    GTEST_LOG_(WARNING) << \"WARNING: unrecognized output format \\\"\"\n                        << output_format << \"\\\" ignored.\";\n  }\n}\n\n#if GTEST_CAN_STREAM_RESULTS_\n// Initializes event listeners for streaming test results in string form.\n// Must not be called before InitGoogleTest.\nvoid UnitTestImpl::ConfigureStreamingOutput() {\n  const std::string& target = GTEST_FLAG(stream_result_to);\n  if (!target.empty()) {\n    const size_t pos = target.find(':');\n    if (pos != std::string::npos) {\n      listeners()->Append(new StreamingListener(target.substr(0, pos),\n                                                target.substr(pos+1)));\n    } else {\n      GTEST_LOG_(WARNING) << \"unrecognized streaming target \\\"\" << target\n                          << \"\\\" ignored.\";\n    }\n  }\n}\n#endif  // GTEST_CAN_STREAM_RESULTS_\n\n// Performs initialization dependent upon flag values obtained in\n// ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to\n// ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest\n// this function is also called from RunAllTests.  Since this function can be\n// called more than once, it has to be idempotent.\nvoid UnitTestImpl::PostFlagParsingInit() {\n  // Ensures that this function does not execute more than once.\n  if (!post_flag_parse_init_performed_) {\n    post_flag_parse_init_performed_ = true;\n\n#if defined(GTEST_CUSTOM_TEST_EVENT_LISTENER_)\n    // Register to send notifications about key process state changes.\n    listeners()->Append(new GTEST_CUSTOM_TEST_EVENT_LISTENER_());\n#endif  // defined(GTEST_CUSTOM_TEST_EVENT_LISTENER_)\n\n#if GTEST_HAS_DEATH_TEST\n    InitDeathTestSubprocessControlInfo();\n    SuppressTestEventsIfInSubprocess();\n#endif  // GTEST_HAS_DEATH_TEST\n\n    // Registers parameterized tests. This makes parameterized tests\n    // available to the UnitTest reflection API without running\n    // RUN_ALL_TESTS.\n    RegisterParameterizedTests();\n\n    // Configures listeners for XML output. This makes it possible for users\n    // to shut down the default XML output before invoking RUN_ALL_TESTS.\n    ConfigureXmlOutput();\n\n    if (GTEST_FLAG(brief)) {\n      listeners()->SetDefaultResultPrinter(new BriefUnitTestResultPrinter);\n    }\n\n#if GTEST_CAN_STREAM_RESULTS_\n    // Configures listeners for streaming test results to the specified server.\n    ConfigureStreamingOutput();\n#endif  // GTEST_CAN_STREAM_RESULTS_\n\n#if GTEST_HAS_ABSL\n    if (GTEST_FLAG(install_failure_signal_handler)) {\n      absl::FailureSignalHandlerOptions options;\n      absl::InstallFailureSignalHandler(options);\n    }\n#endif  // GTEST_HAS_ABSL\n  }\n}\n\n// A predicate that checks the name of a TestSuite against a known\n// value.\n//\n// This is used for implementation of the UnitTest class only.  We put\n// it in the anonymous namespace to prevent polluting the outer\n// namespace.\n//\n// TestSuiteNameIs is copyable.\nclass TestSuiteNameIs {\n public:\n  // Constructor.\n  explicit TestSuiteNameIs(const std::string& name) : name_(name) {}\n\n  // Returns true if and only if the name of test_suite matches name_.\n  bool operator()(const TestSuite* test_suite) const {\n    return test_suite != nullptr &&\n           strcmp(test_suite->name(), name_.c_str()) == 0;\n  }\n\n private:\n  std::string name_;\n};\n\n// Finds and returns a TestSuite with the given name.  If one doesn't\n// exist, creates one and returns it.  It's the CALLER'S\n// RESPONSIBILITY to ensure that this function is only called WHEN THE\n// TESTS ARE NOT SHUFFLED.\n//\n// Arguments:\n//\n//   test_suite_name: name of the test suite\n//   type_param:      the name of the test suite's type parameter, or NULL if\n//                    this is not a typed or a type-parameterized test suite.\n//   set_up_tc:       pointer to the function that sets up the test suite\n//   tear_down_tc:    pointer to the function that tears down the test suite\nTestSuite* UnitTestImpl::GetTestSuite(\n    const char* test_suite_name, const char* type_param,\n    internal::SetUpTestSuiteFunc set_up_tc,\n    internal::TearDownTestSuiteFunc tear_down_tc) {\n  // Can we find a TestSuite with the given name?\n  const auto test_suite =\n      std::find_if(test_suites_.rbegin(), test_suites_.rend(),\n                   TestSuiteNameIs(test_suite_name));\n\n  if (test_suite != test_suites_.rend()) return *test_suite;\n\n  // No.  Let's create one.\n  auto* const new_test_suite =\n      new TestSuite(test_suite_name, type_param, set_up_tc, tear_down_tc);\n\n  // Is this a death test suite?\n  if (internal::UnitTestOptions::MatchesFilter(test_suite_name,\n                                               kDeathTestSuiteFilter)) {\n    // Yes.  Inserts the test suite after the last death test suite\n    // defined so far.  This only works when the test suites haven't\n    // been shuffled.  Otherwise we may end up running a death test\n    // after a non-death test.\n    ++last_death_test_suite_;\n    test_suites_.insert(test_suites_.begin() + last_death_test_suite_,\n                        new_test_suite);\n  } else {\n    // No.  Appends to the end of the list.\n    test_suites_.push_back(new_test_suite);\n  }\n\n  test_suite_indices_.push_back(static_cast<int>(test_suite_indices_.size()));\n  return new_test_suite;\n}\n\n// Helpers for setting up / tearing down the given environment.  They\n// are for use in the ForEach() function.\nstatic void SetUpEnvironment(Environment* env) { env->SetUp(); }\nstatic void TearDownEnvironment(Environment* env) { env->TearDown(); }\n\n// Runs all tests in this UnitTest object, prints the result, and\n// returns true if all tests are successful.  If any exception is\n// thrown during a test, the test is considered to be failed, but the\n// rest of the tests will still be run.\n//\n// When parameterized tests are enabled, it expands and registers\n// parameterized tests first in RegisterParameterizedTests().\n// All other functions called from RunAllTests() may safely assume that\n// parameterized tests are ready to be counted and run.\nbool UnitTestImpl::RunAllTests() {\n  // True if and only if Google Test is initialized before RUN_ALL_TESTS() is\n  // called.\n  const bool gtest_is_initialized_before_run_all_tests = GTestIsInitialized();\n\n  // Do not run any test if the --help flag was specified.\n  if (g_help_flag)\n    return true;\n\n  // Repeats the call to the post-flag parsing initialization in case the\n  // user didn't call InitGoogleTest.\n  PostFlagParsingInit();\n\n  // Even if sharding is not on, test runners may want to use the\n  // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding\n  // protocol.\n  internal::WriteToShardStatusFileIfNeeded();\n\n  // True if and only if we are in a subprocess for running a thread-safe-style\n  // death test.\n  bool in_subprocess_for_death_test = false;\n\n#if GTEST_HAS_DEATH_TEST\n  in_subprocess_for_death_test =\n      (internal_run_death_test_flag_.get() != nullptr);\n# if defined(GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_)\n  if (in_subprocess_for_death_test) {\n    GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_();\n  }\n# endif  // defined(GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_)\n#endif  // GTEST_HAS_DEATH_TEST\n\n  const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex,\n                                        in_subprocess_for_death_test);\n\n  // Compares the full test names with the filter to decide which\n  // tests to run.\n  const bool has_tests_to_run = FilterTests(should_shard\n                                              ? HONOR_SHARDING_PROTOCOL\n                                              : IGNORE_SHARDING_PROTOCOL) > 0;\n\n  // Lists the tests and exits if the --gtest_list_tests flag was specified.\n  if (GTEST_FLAG(list_tests)) {\n    // This must be called *after* FilterTests() has been called.\n    ListTestsMatchingFilter();\n    return true;\n  }\n\n  random_seed_ = GTEST_FLAG(shuffle) ?\n      GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;\n\n  // True if and only if at least one test has failed.\n  bool failed = false;\n\n  TestEventListener* repeater = listeners()->repeater();\n\n  start_timestamp_ = GetTimeInMillis();\n  repeater->OnTestProgramStart(*parent_);\n\n  // How many times to repeat the tests?  We don't want to repeat them\n  // when we are inside the subprocess of a death test.\n  const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);\n  // Repeats forever if the repeat count is negative.\n  const bool gtest_repeat_forever = repeat < 0;\n  for (int i = 0; gtest_repeat_forever || i != repeat; i++) {\n    // We want to preserve failures generated by ad-hoc test\n    // assertions executed before RUN_ALL_TESTS().\n    ClearNonAdHocTestResult();\n\n    Timer timer;\n\n    // Shuffles test suites and tests if requested.\n    if (has_tests_to_run && GTEST_FLAG(shuffle)) {\n      random()->Reseed(static_cast<uint32_t>(random_seed_));\n      // This should be done before calling OnTestIterationStart(),\n      // such that a test event listener can see the actual test order\n      // in the event.\n      ShuffleTests();\n    }\n\n    // Tells the unit test event listeners that the tests are about to start.\n    repeater->OnTestIterationStart(*parent_, i);\n\n    // Runs each test suite if there is at least one test to run.\n    if (has_tests_to_run) {\n      // Sets up all environments beforehand.\n      repeater->OnEnvironmentsSetUpStart(*parent_);\n      ForEach(environments_, SetUpEnvironment);\n      repeater->OnEnvironmentsSetUpEnd(*parent_);\n\n      // Runs the tests only if there was no fatal failure or skip triggered\n      // during global set-up.\n      if (Test::IsSkipped()) {\n        // Emit diagnostics when global set-up calls skip, as it will not be\n        // emitted by default.\n        TestResult& test_result =\n            *internal::GetUnitTestImpl()->current_test_result();\n        for (int j = 0; j < test_result.total_part_count(); ++j) {\n          const TestPartResult& test_part_result =\n              test_result.GetTestPartResult(j);\n          if (test_part_result.type() == TestPartResult::kSkip) {\n            const std::string& result = test_part_result.message();\n            printf(\"%s\\n\", result.c_str());\n          }\n        }\n        fflush(stdout);\n      } else if (!Test::HasFatalFailure()) {\n        for (int test_index = 0; test_index < total_test_suite_count();\n             test_index++) {\n          GetMutableSuiteCase(test_index)->Run();\n          if (GTEST_FLAG(fail_fast) &&\n              GetMutableSuiteCase(test_index)->Failed()) {\n            for (int j = test_index + 1; j < total_test_suite_count(); j++) {\n              GetMutableSuiteCase(j)->Skip();\n            }\n            break;\n          }\n        }\n      } else if (Test::HasFatalFailure()) {\n        // If there was a fatal failure during the global setup then we know we\n        // aren't going to run any tests. Explicitly mark all of the tests as\n        // skipped to make this obvious in the output.\n        for (int test_index = 0; test_index < total_test_suite_count();\n             test_index++) {\n          GetMutableSuiteCase(test_index)->Skip();\n        }\n      }\n\n      // Tears down all environments in reverse order afterwards.\n      repeater->OnEnvironmentsTearDownStart(*parent_);\n      std::for_each(environments_.rbegin(), environments_.rend(),\n                    TearDownEnvironment);\n      repeater->OnEnvironmentsTearDownEnd(*parent_);\n    }\n\n    elapsed_time_ = timer.Elapsed();\n\n    // Tells the unit test event listener that the tests have just finished.\n    repeater->OnTestIterationEnd(*parent_, i);\n\n    // Gets the result and clears it.\n    if (!Passed()) {\n      failed = true;\n    }\n\n    // Restores the original test order after the iteration.  This\n    // allows the user to quickly repro a failure that happens in the\n    // N-th iteration without repeating the first (N - 1) iterations.\n    // This is not enclosed in \"if (GTEST_FLAG(shuffle)) { ... }\", in\n    // case the user somehow changes the value of the flag somewhere\n    // (it's always safe to unshuffle the tests).\n    UnshuffleTests();\n\n    if (GTEST_FLAG(shuffle)) {\n      // Picks a new random seed for each iteration.\n      random_seed_ = GetNextRandomSeed(random_seed_);\n    }\n  }\n\n  repeater->OnTestProgramEnd(*parent_);\n\n  if (!gtest_is_initialized_before_run_all_tests) {\n    ColoredPrintf(\n        GTestColor::kRed,\n        \"\\nIMPORTANT NOTICE - DO NOT IGNORE:\\n\"\n        \"This test program did NOT call \" GTEST_INIT_GOOGLE_TEST_NAME_\n        \"() before calling RUN_ALL_TESTS(). This is INVALID. Soon \" GTEST_NAME_\n        \" will start to enforce the valid usage. \"\n        \"Please fix it ASAP, or IT WILL START TO FAIL.\\n\");  // NOLINT\n#if GTEST_FOR_GOOGLE_\n    ColoredPrintf(GTestColor::kRed,\n                  \"For more details, see http://wiki/Main/ValidGUnitMain.\\n\");\n#endif  // GTEST_FOR_GOOGLE_\n  }\n\n  return !failed;\n}\n\n// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file\n// if the variable is present. If a file already exists at this location, this\n// function will write over it. If the variable is present, but the file cannot\n// be created, prints an error and exits.\nvoid WriteToShardStatusFileIfNeeded() {\n  const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);\n  if (test_shard_file != nullptr) {\n    FILE* const file = posix::FOpen(test_shard_file, \"w\");\n    if (file == nullptr) {\n      ColoredPrintf(GTestColor::kRed,\n                    \"Could not write to the test shard status file \\\"%s\\\" \"\n                    \"specified by the %s environment variable.\\n\",\n                    test_shard_file, kTestShardStatusFile);\n      fflush(stdout);\n      exit(EXIT_FAILURE);\n    }\n    fclose(file);\n  }\n}\n\n// Checks whether sharding is enabled by examining the relevant\n// environment variable values. If the variables are present,\n// but inconsistent (i.e., shard_index >= total_shards), prints\n// an error and exits. If in_subprocess_for_death_test, sharding is\n// disabled because it must only be applied to the original test\n// process. Otherwise, we could filter out death tests we intended to execute.\nbool ShouldShard(const char* total_shards_env,\n                 const char* shard_index_env,\n                 bool in_subprocess_for_death_test) {\n  if (in_subprocess_for_death_test) {\n    return false;\n  }\n\n  const int32_t total_shards = Int32FromEnvOrDie(total_shards_env, -1);\n  const int32_t shard_index = Int32FromEnvOrDie(shard_index_env, -1);\n\n  if (total_shards == -1 && shard_index == -1) {\n    return false;\n  } else if (total_shards == -1 && shard_index != -1) {\n    const Message msg = Message()\n      << \"Invalid environment variables: you have \"\n      << kTestShardIndex << \" = \" << shard_index\n      << \", but have left \" << kTestTotalShards << \" unset.\\n\";\n    ColoredPrintf(GTestColor::kRed, \"%s\", msg.GetString().c_str());\n    fflush(stdout);\n    exit(EXIT_FAILURE);\n  } else if (total_shards != -1 && shard_index == -1) {\n    const Message msg = Message()\n      << \"Invalid environment variables: you have \"\n      << kTestTotalShards << \" = \" << total_shards\n      << \", but have left \" << kTestShardIndex << \" unset.\\n\";\n    ColoredPrintf(GTestColor::kRed, \"%s\", msg.GetString().c_str());\n    fflush(stdout);\n    exit(EXIT_FAILURE);\n  } else if (shard_index < 0 || shard_index >= total_shards) {\n    const Message msg = Message()\n      << \"Invalid environment variables: we require 0 <= \"\n      << kTestShardIndex << \" < \" << kTestTotalShards\n      << \", but you have \" << kTestShardIndex << \"=\" << shard_index\n      << \", \" << kTestTotalShards << \"=\" << total_shards << \".\\n\";\n    ColoredPrintf(GTestColor::kRed, \"%s\", msg.GetString().c_str());\n    fflush(stdout);\n    exit(EXIT_FAILURE);\n  }\n\n  return total_shards > 1;\n}\n\n// Parses the environment variable var as an Int32. If it is unset,\n// returns default_val. If it is not an Int32, prints an error\n// and aborts.\nint32_t Int32FromEnvOrDie(const char* var, int32_t default_val) {\n  const char* str_val = posix::GetEnv(var);\n  if (str_val == nullptr) {\n    return default_val;\n  }\n\n  int32_t result;\n  if (!ParseInt32(Message() << \"The value of environment variable \" << var,\n                  str_val, &result)) {\n    exit(EXIT_FAILURE);\n  }\n  return result;\n}\n\n// Given the total number of shards, the shard index, and the test id,\n// returns true if and only if the test should be run on this shard. The test id\n// is some arbitrary but unique non-negative integer assigned to each test\n// method. Assumes that 0 <= shard_index < total_shards.\nbool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {\n  return (test_id % total_shards) == shard_index;\n}\n\n// Compares the name of each test with the user-specified filter to\n// decide whether the test should be run, then records the result in\n// each TestSuite and TestInfo object.\n// If shard_tests == true, further filters tests based on sharding\n// variables in the environment - see\n// https://github.com/google/googletest/blob/master/googletest/docs/advanced.md\n// . Returns the number of tests that should run.\nint UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {\n  const int32_t total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?\n      Int32FromEnvOrDie(kTestTotalShards, -1) : -1;\n  const int32_t shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?\n      Int32FromEnvOrDie(kTestShardIndex, -1) : -1;\n\n  // num_runnable_tests are the number of tests that will\n  // run across all shards (i.e., match filter and are not disabled).\n  // num_selected_tests are the number of tests to be run on\n  // this shard.\n  int num_runnable_tests = 0;\n  int num_selected_tests = 0;\n  for (auto* test_suite : test_suites_) {\n    const std::string& test_suite_name = test_suite->name();\n    test_suite->set_should_run(false);\n\n    for (size_t j = 0; j < test_suite->test_info_list().size(); j++) {\n      TestInfo* const test_info = test_suite->test_info_list()[j];\n      const std::string test_name(test_info->name());\n      // A test is disabled if test suite name or test name matches\n      // kDisableTestFilter.\n      const bool is_disabled = internal::UnitTestOptions::MatchesFilter(\n                                   test_suite_name, kDisableTestFilter) ||\n                               internal::UnitTestOptions::MatchesFilter(\n                                   test_name, kDisableTestFilter);\n      test_info->is_disabled_ = is_disabled;\n\n      const bool matches_filter = internal::UnitTestOptions::FilterMatchesTest(\n          test_suite_name, test_name);\n      test_info->matches_filter_ = matches_filter;\n\n      const bool is_runnable =\n          (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&\n          matches_filter;\n\n      const bool is_in_another_shard =\n          shard_tests != IGNORE_SHARDING_PROTOCOL &&\n          !ShouldRunTestOnShard(total_shards, shard_index, num_runnable_tests);\n      test_info->is_in_another_shard_ = is_in_another_shard;\n      const bool is_selected = is_runnable && !is_in_another_shard;\n\n      num_runnable_tests += is_runnable;\n      num_selected_tests += is_selected;\n\n      test_info->should_run_ = is_selected;\n      test_suite->set_should_run(test_suite->should_run() || is_selected);\n    }\n  }\n  return num_selected_tests;\n}\n\n// Prints the given C-string on a single line by replacing all '\\n'\n// characters with string \"\\\\n\".  If the output takes more than\n// max_length characters, only prints the first max_length characters\n// and \"...\".\nstatic void PrintOnOneLine(const char* str, int max_length) {\n  if (str != nullptr) {\n    for (int i = 0; *str != '\\0'; ++str) {\n      if (i >= max_length) {\n        printf(\"...\");\n        break;\n      }\n      if (*str == '\\n') {\n        printf(\"\\\\n\");\n        i += 2;\n      } else {\n        printf(\"%c\", *str);\n        ++i;\n      }\n    }\n  }\n}\n\n// Prints the names of the tests matching the user-specified filter flag.\nvoid UnitTestImpl::ListTestsMatchingFilter() {\n  // Print at most this many characters for each type/value parameter.\n  const int kMaxParamLength = 250;\n\n  for (auto* test_suite : test_suites_) {\n    bool printed_test_suite_name = false;\n\n    for (size_t j = 0; j < test_suite->test_info_list().size(); j++) {\n      const TestInfo* const test_info = test_suite->test_info_list()[j];\n      if (test_info->matches_filter_) {\n        if (!printed_test_suite_name) {\n          printed_test_suite_name = true;\n          printf(\"%s.\", test_suite->name());\n          if (test_suite->type_param() != nullptr) {\n            printf(\"  # %s = \", kTypeParamLabel);\n            // We print the type parameter on a single line to make\n            // the output easy to parse by a program.\n            PrintOnOneLine(test_suite->type_param(), kMaxParamLength);\n          }\n          printf(\"\\n\");\n        }\n        printf(\"  %s\", test_info->name());\n        if (test_info->value_param() != nullptr) {\n          printf(\"  # %s = \", kValueParamLabel);\n          // We print the value parameter on a single line to make the\n          // output easy to parse by a program.\n          PrintOnOneLine(test_info->value_param(), kMaxParamLength);\n        }\n        printf(\"\\n\");\n      }\n    }\n  }\n  fflush(stdout);\n  const std::string& output_format = UnitTestOptions::GetOutputFormat();\n  if (output_format == \"xml\" || output_format == \"json\") {\n    FILE* fileout = OpenFileForWriting(\n        UnitTestOptions::GetAbsolutePathToOutputFile().c_str());\n    std::stringstream stream;\n    if (output_format == \"xml\") {\n      XmlUnitTestResultPrinter(\n          UnitTestOptions::GetAbsolutePathToOutputFile().c_str())\n          .PrintXmlTestsList(&stream, test_suites_);\n    } else if (output_format == \"json\") {\n      JsonUnitTestResultPrinter(\n          UnitTestOptions::GetAbsolutePathToOutputFile().c_str())\n          .PrintJsonTestList(&stream, test_suites_);\n    }\n    fprintf(fileout, \"%s\", StringStreamToString(&stream).c_str());\n    fclose(fileout);\n  }\n}\n\n// Sets the OS stack trace getter.\n//\n// Does nothing if the input and the current OS stack trace getter are\n// the same; otherwise, deletes the old getter and makes the input the\n// current getter.\nvoid UnitTestImpl::set_os_stack_trace_getter(\n    OsStackTraceGetterInterface* getter) {\n  if (os_stack_trace_getter_ != getter) {\n    delete os_stack_trace_getter_;\n    os_stack_trace_getter_ = getter;\n  }\n}\n\n// Returns the current OS stack trace getter if it is not NULL;\n// otherwise, creates an OsStackTraceGetter, makes it the current\n// getter, and returns it.\nOsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {\n  if (os_stack_trace_getter_ == nullptr) {\n#ifdef GTEST_OS_STACK_TRACE_GETTER_\n    os_stack_trace_getter_ = new GTEST_OS_STACK_TRACE_GETTER_;\n#else\n    os_stack_trace_getter_ = new OsStackTraceGetter;\n#endif  // GTEST_OS_STACK_TRACE_GETTER_\n  }\n\n  return os_stack_trace_getter_;\n}\n\n// Returns the most specific TestResult currently running.\nTestResult* UnitTestImpl::current_test_result() {\n  if (current_test_info_ != nullptr) {\n    return &current_test_info_->result_;\n  }\n  if (current_test_suite_ != nullptr) {\n    return &current_test_suite_->ad_hoc_test_result_;\n  }\n  return &ad_hoc_test_result_;\n}\n\n// Shuffles all test suites, and the tests within each test suite,\n// making sure that death tests are still run first.\nvoid UnitTestImpl::ShuffleTests() {\n  // Shuffles the death test suites.\n  ShuffleRange(random(), 0, last_death_test_suite_ + 1, &test_suite_indices_);\n\n  // Shuffles the non-death test suites.\n  ShuffleRange(random(), last_death_test_suite_ + 1,\n               static_cast<int>(test_suites_.size()), &test_suite_indices_);\n\n  // Shuffles the tests inside each test suite.\n  for (auto& test_suite : test_suites_) {\n    test_suite->ShuffleTests(random());\n  }\n}\n\n// Restores the test suites and tests to their order before the first shuffle.\nvoid UnitTestImpl::UnshuffleTests() {\n  for (size_t i = 0; i < test_suites_.size(); i++) {\n    // Unshuffles the tests in each test suite.\n    test_suites_[i]->UnshuffleTests();\n    // Resets the index of each test suite.\n    test_suite_indices_[i] = static_cast<int>(i);\n  }\n}\n\n// Returns the current OS stack trace as an std::string.\n//\n// The maximum number of stack frames to be included is specified by\n// the gtest_stack_trace_depth flag.  The skip_count parameter\n// specifies the number of top frames to be skipped, which doesn't\n// count against the number of frames to be included.\n//\n// For example, if Foo() calls Bar(), which in turn calls\n// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in\n// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.\nstd::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,\n                                            int skip_count) {\n  // We pass skip_count + 1 to skip this wrapper function in addition\n  // to what the user really wants to skip.\n  return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);\n}\n\n// Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to\n// suppress unreachable code warnings.\nnamespace {\nclass ClassUniqueToAlwaysTrue {};\n}\n\nbool IsTrue(bool condition) { return condition; }\n\nbool AlwaysTrue() {\n#if GTEST_HAS_EXCEPTIONS\n  // This condition is always false so AlwaysTrue() never actually throws,\n  // but it makes the compiler think that it may throw.\n  if (IsTrue(false))\n    throw ClassUniqueToAlwaysTrue();\n#endif  // GTEST_HAS_EXCEPTIONS\n  return true;\n}\n\n// If *pstr starts with the given prefix, modifies *pstr to be right\n// past the prefix and returns true; otherwise leaves *pstr unchanged\n// and returns false.  None of pstr, *pstr, and prefix can be NULL.\nbool SkipPrefix(const char* prefix, const char** pstr) {\n  const size_t prefix_len = strlen(prefix);\n  if (strncmp(*pstr, prefix, prefix_len) == 0) {\n    *pstr += prefix_len;\n    return true;\n  }\n  return false;\n}\n\n// Parses a string as a command line flag.  The string should have\n// the format \"--flag=value\".  When def_optional is true, the \"=value\"\n// part can be omitted.\n//\n// Returns the value of the flag, or NULL if the parsing failed.\nstatic const char* ParseFlagValue(const char* str, const char* flag,\n                                  bool def_optional) {\n  // str and flag must not be NULL.\n  if (str == nullptr || flag == nullptr) return nullptr;\n\n  // The flag must start with \"--\" followed by GTEST_FLAG_PREFIX_.\n  const std::string flag_str = std::string(\"--\") + GTEST_FLAG_PREFIX_ + flag;\n  const size_t flag_len = flag_str.length();\n  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return nullptr;\n\n  // Skips the flag name.\n  const char* flag_end = str + flag_len;\n\n  // When def_optional is true, it's OK to not have a \"=value\" part.\n  if (def_optional && (flag_end[0] == '\\0')) {\n    return flag_end;\n  }\n\n  // If def_optional is true and there are more characters after the\n  // flag name, or if def_optional is false, there must be a '=' after\n  // the flag name.\n  if (flag_end[0] != '=') return nullptr;\n\n  // Returns the string after \"=\".\n  return flag_end + 1;\n}\n\n// Parses a string for a bool flag, in the form of either\n// \"--flag=value\" or \"--flag\".\n//\n// In the former case, the value is taken as true as long as it does\n// not start with '0', 'f', or 'F'.\n//\n// In the latter case, the value is taken as true.\n//\n// On success, stores the value of the flag in *value, and returns\n// true.  On failure, returns false without changing *value.\nstatic bool ParseBoolFlag(const char* str, const char* flag, bool* value) {\n  // Gets the value of the flag as a string.\n  const char* const value_str = ParseFlagValue(str, flag, true);\n\n  // Aborts if the parsing failed.\n  if (value_str == nullptr) return false;\n\n  // Converts the string value to a bool.\n  *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');\n  return true;\n}\n\n// Parses a string for an int32_t flag, in the form of \"--flag=value\".\n//\n// On success, stores the value of the flag in *value, and returns\n// true.  On failure, returns false without changing *value.\nbool ParseInt32Flag(const char* str, const char* flag, int32_t* value) {\n  // Gets the value of the flag as a string.\n  const char* const value_str = ParseFlagValue(str, flag, false);\n\n  // Aborts if the parsing failed.\n  if (value_str == nullptr) return false;\n\n  // Sets *value to the value of the flag.\n  return ParseInt32(Message() << \"The value of flag --\" << flag,\n                    value_str, value);\n}\n\n// Parses a string for a string flag, in the form of \"--flag=value\".\n//\n// On success, stores the value of the flag in *value, and returns\n// true.  On failure, returns false without changing *value.\ntemplate <typename String>\nstatic bool ParseStringFlag(const char* str, const char* flag, String* value) {\n  // Gets the value of the flag as a string.\n  const char* const value_str = ParseFlagValue(str, flag, false);\n\n  // Aborts if the parsing failed.\n  if (value_str == nullptr) return false;\n\n  // Sets *value to the value of the flag.\n  *value = value_str;\n  return true;\n}\n\n// Determines whether a string has a prefix that Google Test uses for its\n// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_.\n// If Google Test detects that a command line flag has its prefix but is not\n// recognized, it will print its help message. Flags starting with\n// GTEST_INTERNAL_PREFIX_ followed by \"internal_\" are considered Google Test\n// internal flags and do not trigger the help message.\nstatic bool HasGoogleTestFlagPrefix(const char* str) {\n  return (SkipPrefix(\"--\", &str) ||\n          SkipPrefix(\"-\", &str) ||\n          SkipPrefix(\"/\", &str)) &&\n         !SkipPrefix(GTEST_FLAG_PREFIX_ \"internal_\", &str) &&\n         (SkipPrefix(GTEST_FLAG_PREFIX_, &str) ||\n          SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str));\n}\n\n// Prints a string containing code-encoded text.  The following escape\n// sequences can be used in the string to control the text color:\n//\n//   @@    prints a single '@' character.\n//   @R    changes the color to red.\n//   @G    changes the color to green.\n//   @Y    changes the color to yellow.\n//   @D    changes to the default terminal text color.\n//\nstatic void PrintColorEncoded(const char* str) {\n  GTestColor color = GTestColor::kDefault;  // The current color.\n\n  // Conceptually, we split the string into segments divided by escape\n  // sequences.  Then we print one segment at a time.  At the end of\n  // each iteration, the str pointer advances to the beginning of the\n  // next segment.\n  for (;;) {\n    const char* p = strchr(str, '@');\n    if (p == nullptr) {\n      ColoredPrintf(color, \"%s\", str);\n      return;\n    }\n\n    ColoredPrintf(color, \"%s\", std::string(str, p).c_str());\n\n    const char ch = p[1];\n    str = p + 2;\n    if (ch == '@') {\n      ColoredPrintf(color, \"@\");\n    } else if (ch == 'D') {\n      color = GTestColor::kDefault;\n    } else if (ch == 'R') {\n      color = GTestColor::kRed;\n    } else if (ch == 'G') {\n      color = GTestColor::kGreen;\n    } else if (ch == 'Y') {\n      color = GTestColor::kYellow;\n    } else {\n      --str;\n    }\n  }\n}\n\nstatic const char kColorEncodedHelpMessage[] =\n    \"This program contains tests written using \" GTEST_NAME_\n    \". You can use the\\n\"\n    \"following command line flags to control its behavior:\\n\"\n    \"\\n\"\n    \"Test Selection:\\n\"\n    \"  @G--\" GTEST_FLAG_PREFIX_\n    \"list_tests@D\\n\"\n    \"      List the names of all tests instead of running them. The name of\\n\"\n    \"      TEST(Foo, Bar) is \\\"Foo.Bar\\\".\\n\"\n    \"  @G--\" GTEST_FLAG_PREFIX_\n    \"filter=@YPOSITIVE_PATTERNS\"\n    \"[@G-@YNEGATIVE_PATTERNS]@D\\n\"\n    \"      Run only the tests whose name matches one of the positive patterns \"\n    \"but\\n\"\n    \"      none of the negative patterns. '?' matches any single character; \"\n    \"'*'\\n\"\n    \"      matches any substring; ':' separates two patterns.\\n\"\n    \"  @G--\" GTEST_FLAG_PREFIX_\n    \"also_run_disabled_tests@D\\n\"\n    \"      Run all disabled tests too.\\n\"\n    \"\\n\"\n    \"Test Execution:\\n\"\n    \"  @G--\" GTEST_FLAG_PREFIX_\n    \"repeat=@Y[COUNT]@D\\n\"\n    \"      Run the tests repeatedly; use a negative count to repeat forever.\\n\"\n    \"  @G--\" GTEST_FLAG_PREFIX_\n    \"shuffle@D\\n\"\n    \"      Randomize tests' orders on every iteration.\\n\"\n    \"  @G--\" GTEST_FLAG_PREFIX_\n    \"random_seed=@Y[NUMBER]@D\\n\"\n    \"      Random number seed to use for shuffling test orders (between 1 and\\n\"\n    \"      99999, or 0 to use a seed based on the current time).\\n\"\n    \"\\n\"\n    \"Test Output:\\n\"\n    \"  @G--\" GTEST_FLAG_PREFIX_\n    \"color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\\n\"\n    \"      Enable/disable colored output. The default is @Gauto@D.\\n\"\n    \"  @G--\" GTEST_FLAG_PREFIX_\n    \"brief=1@D\\n\"\n    \"      Only print test failures.\\n\"\n    \"  @G--\" GTEST_FLAG_PREFIX_\n    \"print_time=0@D\\n\"\n    \"      Don't print the elapsed time of each test.\\n\"\n    \"  @G--\" GTEST_FLAG_PREFIX_\n    \"output=@Y(@Gjson@Y|@Gxml@Y)[@G:@YDIRECTORY_PATH@G\" GTEST_PATH_SEP_\n    \"@Y|@G:@YFILE_PATH]@D\\n\"\n    \"      Generate a JSON or XML report in the given directory or with the \"\n    \"given\\n\"\n    \"      file name. @YFILE_PATH@D defaults to @Gtest_detail.xml@D.\\n\"\n# if GTEST_CAN_STREAM_RESULTS_\n    \"  @G--\" GTEST_FLAG_PREFIX_\n    \"stream_result_to=@YHOST@G:@YPORT@D\\n\"\n    \"      Stream test results to the given server.\\n\"\n# endif  // GTEST_CAN_STREAM_RESULTS_\n    \"\\n\"\n    \"Assertion Behavior:\\n\"\n# if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS\n    \"  @G--\" GTEST_FLAG_PREFIX_\n    \"death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\\n\"\n    \"      Set the default death test style.\\n\"\n# endif  // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS\n    \"  @G--\" GTEST_FLAG_PREFIX_\n    \"break_on_failure@D\\n\"\n    \"      Turn assertion failures into debugger break-points.\\n\"\n    \"  @G--\" GTEST_FLAG_PREFIX_\n    \"throw_on_failure@D\\n\"\n    \"      Turn assertion failures into C++ exceptions for use by an external\\n\"\n    \"      test framework.\\n\"\n    \"  @G--\" GTEST_FLAG_PREFIX_\n    \"catch_exceptions=0@D\\n\"\n    \"      Do not report exceptions as test failures. Instead, allow them\\n\"\n    \"      to crash the program or throw a pop-up (on Windows).\\n\"\n    \"\\n\"\n    \"Except for @G--\" GTEST_FLAG_PREFIX_\n    \"list_tests@D, you can alternatively set \"\n    \"the corresponding\\n\"\n    \"environment variable of a flag (all letters in upper-case). For example, \"\n    \"to\\n\"\n    \"disable colored text output, you can either specify \"\n    \"@G--\" GTEST_FLAG_PREFIX_\n    \"color=no@D or set\\n\"\n    \"the @G\" GTEST_FLAG_PREFIX_UPPER_\n    \"COLOR@D environment variable to @Gno@D.\\n\"\n    \"\\n\"\n    \"For more information, please read the \" GTEST_NAME_\n    \" documentation at\\n\"\n    \"@G\" GTEST_PROJECT_URL_ \"@D. If you find a bug in \" GTEST_NAME_\n    \"\\n\"\n    \"(not one in your own code or tests), please report it to\\n\"\n    \"@G<\" GTEST_DEV_EMAIL_ \">@D.\\n\";\n\nstatic bool ParseGoogleTestFlag(const char* const arg) {\n  return ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag,\n                       &GTEST_FLAG(also_run_disabled_tests)) ||\n         ParseBoolFlag(arg, kBreakOnFailureFlag,\n                       &GTEST_FLAG(break_on_failure)) ||\n         ParseBoolFlag(arg, kCatchExceptionsFlag,\n                       &GTEST_FLAG(catch_exceptions)) ||\n         ParseStringFlag(arg, kColorFlag, &GTEST_FLAG(color)) ||\n         ParseStringFlag(arg, kDeathTestStyleFlag,\n                         &GTEST_FLAG(death_test_style)) ||\n         ParseBoolFlag(arg, kDeathTestUseFork,\n                       &GTEST_FLAG(death_test_use_fork)) ||\n         ParseBoolFlag(arg, kFailFast, &GTEST_FLAG(fail_fast)) ||\n         ParseStringFlag(arg, kFilterFlag, &GTEST_FLAG(filter)) ||\n         ParseStringFlag(arg, kInternalRunDeathTestFlag,\n                         &GTEST_FLAG(internal_run_death_test)) ||\n         ParseBoolFlag(arg, kListTestsFlag, &GTEST_FLAG(list_tests)) ||\n         ParseStringFlag(arg, kOutputFlag, &GTEST_FLAG(output)) ||\n         ParseBoolFlag(arg, kBriefFlag, &GTEST_FLAG(brief)) ||\n         ParseBoolFlag(arg, kPrintTimeFlag, &GTEST_FLAG(print_time)) ||\n         ParseBoolFlag(arg, kPrintUTF8Flag, &GTEST_FLAG(print_utf8)) ||\n         ParseInt32Flag(arg, kRandomSeedFlag, &GTEST_FLAG(random_seed)) ||\n         ParseInt32Flag(arg, kRepeatFlag, &GTEST_FLAG(repeat)) ||\n         ParseBoolFlag(arg, kShuffleFlag, &GTEST_FLAG(shuffle)) ||\n         ParseInt32Flag(arg, kStackTraceDepthFlag,\n                        &GTEST_FLAG(stack_trace_depth)) ||\n         ParseStringFlag(arg, kStreamResultToFlag,\n                         &GTEST_FLAG(stream_result_to)) ||\n         ParseBoolFlag(arg, kThrowOnFailureFlag, &GTEST_FLAG(throw_on_failure));\n}\n\n#if GTEST_USE_OWN_FLAGFILE_FLAG_\nstatic void LoadFlagsFromFile(const std::string& path) {\n  FILE* flagfile = posix::FOpen(path.c_str(), \"r\");\n  if (!flagfile) {\n    GTEST_LOG_(FATAL) << \"Unable to open file \\\"\" << GTEST_FLAG(flagfile)\n                      << \"\\\"\";\n  }\n  std::string contents(ReadEntireFile(flagfile));\n  posix::FClose(flagfile);\n  std::vector<std::string> lines;\n  SplitString(contents, '\\n', &lines);\n  for (size_t i = 0; i < lines.size(); ++i) {\n    if (lines[i].empty())\n      continue;\n    if (!ParseGoogleTestFlag(lines[i].c_str()))\n      g_help_flag = true;\n  }\n}\n#endif  // GTEST_USE_OWN_FLAGFILE_FLAG_\n\n// Parses the command line for Google Test flags, without initializing\n// other parts of Google Test.  The type parameter CharType can be\n// instantiated to either char or wchar_t.\ntemplate <typename CharType>\nvoid ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {\n  for (int i = 1; i < *argc; i++) {\n    const std::string arg_string = StreamableToString(argv[i]);\n    const char* const arg = arg_string.c_str();\n\n    using internal::ParseBoolFlag;\n    using internal::ParseInt32Flag;\n    using internal::ParseStringFlag;\n\n    bool remove_flag = false;\n    if (ParseGoogleTestFlag(arg)) {\n      remove_flag = true;\n#if GTEST_USE_OWN_FLAGFILE_FLAG_\n    } else if (ParseStringFlag(arg, kFlagfileFlag, &GTEST_FLAG(flagfile))) {\n      LoadFlagsFromFile(GTEST_FLAG(flagfile));\n      remove_flag = true;\n#endif  // GTEST_USE_OWN_FLAGFILE_FLAG_\n    } else if (arg_string == \"--help\" || arg_string == \"-h\" ||\n               arg_string == \"-?\" || arg_string == \"/?\" ||\n               HasGoogleTestFlagPrefix(arg)) {\n      // Both help flag and unrecognized Google Test flags (excluding\n      // internal ones) trigger help display.\n      g_help_flag = true;\n    }\n\n    if (remove_flag) {\n      // Shift the remainder of the argv list left by one.  Note\n      // that argv has (*argc + 1) elements, the last one always being\n      // NULL.  The following loop moves the trailing NULL element as\n      // well.\n      for (int j = i; j != *argc; j++) {\n        argv[j] = argv[j + 1];\n      }\n\n      // Decrements the argument count.\n      (*argc)--;\n\n      // We also need to decrement the iterator as we just removed\n      // an element.\n      i--;\n    }\n  }\n\n  if (g_help_flag) {\n    // We print the help here instead of in RUN_ALL_TESTS(), as the\n    // latter may not be called at all if the user is using Google\n    // Test with another testing framework.\n    PrintColorEncoded(kColorEncodedHelpMessage);\n  }\n}\n\n// Parses the command line for Google Test flags, without initializing\n// other parts of Google Test.\nvoid ParseGoogleTestFlagsOnly(int* argc, char** argv) {\n  ParseGoogleTestFlagsOnlyImpl(argc, argv);\n\n  // Fix the value of *_NSGetArgc() on macOS, but if and only if\n  // *_NSGetArgv() == argv\n  // Only applicable to char** version of argv\n#if GTEST_OS_MAC\n#ifndef GTEST_OS_IOS\n  if (*_NSGetArgv() == argv) {\n    *_NSGetArgc() = *argc;\n  }\n#endif\n#endif\n}\nvoid ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {\n  ParseGoogleTestFlagsOnlyImpl(argc, argv);\n}\n\n// The internal implementation of InitGoogleTest().\n//\n// The type parameter CharType can be instantiated to either char or\n// wchar_t.\ntemplate <typename CharType>\nvoid InitGoogleTestImpl(int* argc, CharType** argv) {\n  // We don't want to run the initialization code twice.\n  if (GTestIsInitialized()) return;\n\n  if (*argc <= 0) return;\n\n  g_argvs.clear();\n  for (int i = 0; i != *argc; i++) {\n    g_argvs.push_back(StreamableToString(argv[i]));\n  }\n\n#if GTEST_HAS_ABSL\n  absl::InitializeSymbolizer(g_argvs[0].c_str());\n#endif  // GTEST_HAS_ABSL\n\n  ParseGoogleTestFlagsOnly(argc, argv);\n  GetUnitTestImpl()->PostFlagParsingInit();\n}\n\n}  // namespace internal\n\n// Initializes Google Test.  This must be called before calling\n// RUN_ALL_TESTS().  In particular, it parses a command line for the\n// flags that Google Test recognizes.  Whenever a Google Test flag is\n// seen, it is removed from argv, and *argc is decremented.\n//\n// No value is returned.  Instead, the Google Test flag variables are\n// updated.\n//\n// Calling the function for the second time has no user-visible effect.\nvoid InitGoogleTest(int* argc, char** argv) {\n#if defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)\n  GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_(argc, argv);\n#else  // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)\n  internal::InitGoogleTestImpl(argc, argv);\n#endif  // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)\n}\n\n// This overloaded version can be used in Windows programs compiled in\n// UNICODE mode.\nvoid InitGoogleTest(int* argc, wchar_t** argv) {\n#if defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)\n  GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_(argc, argv);\n#else  // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)\n  internal::InitGoogleTestImpl(argc, argv);\n#endif  // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)\n}\n\n// This overloaded version can be used on Arduino/embedded platforms where\n// there is no argc/argv.\nvoid InitGoogleTest() {\n  // Since Arduino doesn't have a command line, fake out the argc/argv arguments\n  int argc = 1;\n  const auto arg0 = \"dummy\";\n  char* argv0 = const_cast<char*>(arg0);\n  char** argv = &argv0;\n\n#if defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)\n  GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_(&argc, argv);\n#else  // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)\n  internal::InitGoogleTestImpl(&argc, argv);\n#endif  // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)\n}\n\nstd::string TempDir() {\n#if defined(GTEST_CUSTOM_TEMPDIR_FUNCTION_)\n  return GTEST_CUSTOM_TEMPDIR_FUNCTION_();\n#elif GTEST_OS_WINDOWS_MOBILE\n  return \"\\\\temp\\\\\";\n#elif GTEST_OS_WINDOWS\n  const char* temp_dir = internal::posix::GetEnv(\"TEMP\");\n  if (temp_dir == nullptr || temp_dir[0] == '\\0') {\n    return \"\\\\temp\\\\\";\n  } else if (temp_dir[strlen(temp_dir) - 1] == '\\\\') {\n    return temp_dir;\n  } else {\n    return std::string(temp_dir) + \"\\\\\";\n  }\n#elif GTEST_OS_LINUX_ANDROID\n  const char* temp_dir = internal::posix::GetEnv(\"TEST_TMPDIR\");\n  if (temp_dir == nullptr || temp_dir[0] == '\\0') {\n    return \"/data/local/tmp/\";\n  } else {\n    return temp_dir;\n  }\n#elif GTEST_OS_LINUX\n  const char* temp_dir = internal::posix::GetEnv(\"TEST_TMPDIR\");\n  if (temp_dir == nullptr || temp_dir[0] == '\\0') {\n    return \"/tmp/\";\n  } else {\n    return temp_dir;\n  }\n#else\n  return \"/tmp/\";\n#endif  // GTEST_OS_WINDOWS_MOBILE\n}\n\n// Class ScopedTrace\n\n// Pushes the given source file location and message onto a per-thread\n// trace stack maintained by Google Test.\nvoid ScopedTrace::PushTrace(const char* file, int line, std::string message) {\n  internal::TraceInfo trace;\n  trace.file = file;\n  trace.line = line;\n  trace.message.swap(message);\n\n  UnitTest::GetInstance()->PushGTestTrace(trace);\n}\n\n// Pops the info pushed by the c'tor.\nScopedTrace::~ScopedTrace()\n    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {\n  UnitTest::GetInstance()->PopGTestTrace();\n}\n\n}  // namespace testing\n// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// This file implements death tests.\n\n\n#include <functional>\n#include <utility>\n\n\n#if GTEST_HAS_DEATH_TEST\n\n# if GTEST_OS_MAC\n#  include <crt_externs.h>\n# endif  // GTEST_OS_MAC\n\n# include <errno.h>\n# include <fcntl.h>\n# include <limits.h>\n\n# if GTEST_OS_LINUX\n#  include <signal.h>\n# endif  // GTEST_OS_LINUX\n\n# include <stdarg.h>\n\n# if GTEST_OS_WINDOWS\n#  include <windows.h>\n# else\n#  include <sys/mman.h>\n#  include <sys/wait.h>\n# endif  // GTEST_OS_WINDOWS\n\n# if GTEST_OS_QNX\n#  include <spawn.h>\n# endif  // GTEST_OS_QNX\n\n# if GTEST_OS_FUCHSIA\n#  include <lib/fdio/fd.h>\n#  include <lib/fdio/io.h>\n#  include <lib/fdio/spawn.h>\n#  include <lib/zx/channel.h>\n#  include <lib/zx/port.h>\n#  include <lib/zx/process.h>\n#  include <lib/zx/socket.h>\n#  include <zircon/processargs.h>\n#  include <zircon/syscalls.h>\n#  include <zircon/syscalls/policy.h>\n#  include <zircon/syscalls/port.h>\n# endif  // GTEST_OS_FUCHSIA\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n\nnamespace testing {\n\n// Constants.\n\n// The default death test style.\n//\n// This is defined in internal/gtest-port.h as \"fast\", but can be overridden by\n// a definition in internal/custom/gtest-port.h. The recommended value, which is\n// used internally at Google, is \"threadsafe\".\nstatic const char kDefaultDeathTestStyle[] = GTEST_DEFAULT_DEATH_TEST_STYLE;\n\nGTEST_DEFINE_string_(\n    death_test_style,\n    internal::StringFromGTestEnv(\"death_test_style\", kDefaultDeathTestStyle),\n    \"Indicates how to run a death test in a forked child process: \"\n    \"\\\"threadsafe\\\" (child process re-executes the test binary \"\n    \"from the beginning, running only the specific death test) or \"\n    \"\\\"fast\\\" (child process runs the death test immediately \"\n    \"after forking).\");\n\nGTEST_DEFINE_bool_(\n    death_test_use_fork,\n    internal::BoolFromGTestEnv(\"death_test_use_fork\", false),\n    \"Instructs to use fork()/_exit() instead of clone() in death tests. \"\n    \"Ignored and always uses fork() on POSIX systems where clone() is not \"\n    \"implemented. Useful when running under valgrind or similar tools if \"\n    \"those do not support clone(). Valgrind 3.3.1 will just fail if \"\n    \"it sees an unsupported combination of clone() flags. \"\n    \"It is not recommended to use this flag w/o valgrind though it will \"\n    \"work in 99% of the cases. Once valgrind is fixed, this flag will \"\n    \"most likely be removed.\");\n\nnamespace internal {\nGTEST_DEFINE_string_(\n    internal_run_death_test, \"\",\n    \"Indicates the file, line number, temporal index of \"\n    \"the single death test to run, and a file descriptor to \"\n    \"which a success code may be sent, all separated by \"\n    \"the '|' characters.  This flag is specified if and only if the \"\n    \"current process is a sub-process launched for running a thread-safe \"\n    \"death test.  FOR INTERNAL USE ONLY.\");\n}  // namespace internal\n\n#if GTEST_HAS_DEATH_TEST\n\nnamespace internal {\n\n// Valid only for fast death tests. Indicates the code is running in the\n// child process of a fast style death test.\n# if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA\nstatic bool g_in_fast_death_test_child = false;\n# endif\n\n// Returns a Boolean value indicating whether the caller is currently\n// executing in the context of the death test child process.  Tools such as\n// Valgrind heap checkers may need this to modify their behavior in death\n// tests.  IMPORTANT: This is an internal utility.  Using it may break the\n// implementation of death tests.  User code MUST NOT use it.\nbool InDeathTestChild() {\n# if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA\n\n  // On Windows and Fuchsia, death tests are thread-safe regardless of the value\n  // of the death_test_style flag.\n  return !GTEST_FLAG(internal_run_death_test).empty();\n\n# else\n\n  if (GTEST_FLAG(death_test_style) == \"threadsafe\")\n    return !GTEST_FLAG(internal_run_death_test).empty();\n  else\n    return g_in_fast_death_test_child;\n#endif\n}\n\n}  // namespace internal\n\n// ExitedWithCode constructor.\nExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {\n}\n\n// ExitedWithCode function-call operator.\nbool ExitedWithCode::operator()(int exit_status) const {\n# if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA\n\n  return exit_status == exit_code_;\n\n# else\n\n  return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;\n\n# endif  // GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA\n}\n\n# if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA\n// KilledBySignal constructor.\nKilledBySignal::KilledBySignal(int signum) : signum_(signum) {\n}\n\n// KilledBySignal function-call operator.\nbool KilledBySignal::operator()(int exit_status) const {\n#  if defined(GTEST_KILLED_BY_SIGNAL_OVERRIDE_)\n  {\n    bool result;\n    if (GTEST_KILLED_BY_SIGNAL_OVERRIDE_(signum_, exit_status, &result)) {\n      return result;\n    }\n  }\n#  endif  // defined(GTEST_KILLED_BY_SIGNAL_OVERRIDE_)\n  return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;\n}\n# endif  // !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA\n\nnamespace internal {\n\n// Utilities needed for death tests.\n\n// Generates a textual description of a given exit code, in the format\n// specified by wait(2).\nstatic std::string ExitSummary(int exit_code) {\n  Message m;\n\n# if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA\n\n  m << \"Exited with exit status \" << exit_code;\n\n# else\n\n  if (WIFEXITED(exit_code)) {\n    m << \"Exited with exit status \" << WEXITSTATUS(exit_code);\n  } else if (WIFSIGNALED(exit_code)) {\n    m << \"Terminated by signal \" << WTERMSIG(exit_code);\n  }\n#  ifdef WCOREDUMP\n  if (WCOREDUMP(exit_code)) {\n    m << \" (core dumped)\";\n  }\n#  endif\n# endif  // GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA\n\n  return m.GetString();\n}\n\n// Returns true if exit_status describes a process that was terminated\n// by a signal, or exited normally with a nonzero exit code.\nbool ExitedUnsuccessfully(int exit_status) {\n  return !ExitedWithCode(0)(exit_status);\n}\n\n# if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA\n// Generates a textual failure message when a death test finds more than\n// one thread running, or cannot determine the number of threads, prior\n// to executing the given statement.  It is the responsibility of the\n// caller not to pass a thread_count of 1.\nstatic std::string DeathTestThreadWarning(size_t thread_count) {\n  Message msg;\n  msg << \"Death tests use fork(), which is unsafe particularly\"\n      << \" in a threaded context. For this test, \" << GTEST_NAME_ << \" \";\n  if (thread_count == 0) {\n    msg << \"couldn't detect the number of threads.\";\n  } else {\n    msg << \"detected \" << thread_count << \" threads.\";\n  }\n  msg << \" See \"\n         \"https://github.com/google/googletest/blob/master/docs/\"\n         \"advanced.md#death-tests-and-threads\"\n      << \" for more explanation and suggested solutions, especially if\"\n      << \" this is the last message you see before your test times out.\";\n  return msg.GetString();\n}\n# endif  // !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA\n\n// Flag characters for reporting a death test that did not die.\nstatic const char kDeathTestLived = 'L';\nstatic const char kDeathTestReturned = 'R';\nstatic const char kDeathTestThrew = 'T';\nstatic const char kDeathTestInternalError = 'I';\n\n#if GTEST_OS_FUCHSIA\n\n// File descriptor used for the pipe in the child process.\nstatic const int kFuchsiaReadPipeFd = 3;\n\n#endif\n\n// An enumeration describing all of the possible ways that a death test can\n// conclude.  DIED means that the process died while executing the test\n// code; LIVED means that process lived beyond the end of the test code;\n// RETURNED means that the test statement attempted to execute a return\n// statement, which is not allowed; THREW means that the test statement\n// returned control by throwing an exception.  IN_PROGRESS means the test\n// has not yet concluded.\nenum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };\n\n// Routine for aborting the program which is safe to call from an\n// exec-style death test child process, in which case the error\n// message is propagated back to the parent process.  Otherwise, the\n// message is simply printed to stderr.  In either case, the program\n// then exits with status 1.\nstatic void DeathTestAbort(const std::string& message) {\n  // On a POSIX system, this function may be called from a threadsafe-style\n  // death test child process, which operates on a very small stack.  Use\n  // the heap for any additional non-minuscule memory requirements.\n  const InternalRunDeathTestFlag* const flag =\n      GetUnitTestImpl()->internal_run_death_test_flag();\n  if (flag != nullptr) {\n    FILE* parent = posix::FDOpen(flag->write_fd(), \"w\");\n    fputc(kDeathTestInternalError, parent);\n    fprintf(parent, \"%s\", message.c_str());\n    fflush(parent);\n    _exit(1);\n  } else {\n    fprintf(stderr, \"%s\", message.c_str());\n    fflush(stderr);\n    posix::Abort();\n  }\n}\n\n// A replacement for CHECK that calls DeathTestAbort if the assertion\n// fails.\n# define GTEST_DEATH_TEST_CHECK_(expression) \\\n  do { \\\n    if (!::testing::internal::IsTrue(expression)) { \\\n      DeathTestAbort( \\\n          ::std::string(\"CHECK failed: File \") + __FILE__ +  \", line \" \\\n          + ::testing::internal::StreamableToString(__LINE__) + \": \" \\\n          + #expression); \\\n    } \\\n  } while (::testing::internal::AlwaysFalse())\n\n// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for\n// evaluating any system call that fulfills two conditions: it must return\n// -1 on failure, and set errno to EINTR when it is interrupted and\n// should be tried again.  The macro expands to a loop that repeatedly\n// evaluates the expression as long as it evaluates to -1 and sets\n// errno to EINTR.  If the expression evaluates to -1 but errno is\n// something other than EINTR, DeathTestAbort is called.\n# define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \\\n  do { \\\n    int gtest_retval; \\\n    do { \\\n      gtest_retval = (expression); \\\n    } while (gtest_retval == -1 && errno == EINTR); \\\n    if (gtest_retval == -1) { \\\n      DeathTestAbort( \\\n          ::std::string(\"CHECK failed: File \") + __FILE__ + \", line \" \\\n          + ::testing::internal::StreamableToString(__LINE__) + \": \" \\\n          + #expression + \" != -1\"); \\\n    } \\\n  } while (::testing::internal::AlwaysFalse())\n\n// Returns the message describing the last system error in errno.\nstd::string GetLastErrnoDescription() {\n    return errno == 0 ? \"\" : posix::StrError(errno);\n}\n\n// This is called from a death test parent process to read a failure\n// message from the death test child process and log it with the FATAL\n// severity. On Windows, the message is read from a pipe handle. On other\n// platforms, it is read from a file descriptor.\nstatic void FailFromInternalError(int fd) {\n  Message error;\n  char buffer[256];\n  int num_read;\n\n  do {\n    while ((num_read = posix::Read(fd, buffer, 255)) > 0) {\n      buffer[num_read] = '\\0';\n      error << buffer;\n    }\n  } while (num_read == -1 && errno == EINTR);\n\n  if (num_read == 0) {\n    GTEST_LOG_(FATAL) << error.GetString();\n  } else {\n    const int last_error = errno;\n    GTEST_LOG_(FATAL) << \"Error while reading death test internal: \"\n                      << GetLastErrnoDescription() << \" [\" << last_error << \"]\";\n  }\n}\n\n// Death test constructor.  Increments the running death test count\n// for the current test.\nDeathTest::DeathTest() {\n  TestInfo* const info = GetUnitTestImpl()->current_test_info();\n  if (info == nullptr) {\n    DeathTestAbort(\"Cannot run a death test outside of a TEST or \"\n                   \"TEST_F construct\");\n  }\n}\n\n// Creates and returns a death test by dispatching to the current\n// death test factory.\nbool DeathTest::Create(const char* statement,\n                       Matcher<const std::string&> matcher, const char* file,\n                       int line, DeathTest** test) {\n  return GetUnitTestImpl()->death_test_factory()->Create(\n      statement, std::move(matcher), file, line, test);\n}\n\nconst char* DeathTest::LastMessage() {\n  return last_death_test_message_.c_str();\n}\n\nvoid DeathTest::set_last_death_test_message(const std::string& message) {\n  last_death_test_message_ = message;\n}\n\nstd::string DeathTest::last_death_test_message_;\n\n// Provides cross platform implementation for some death functionality.\nclass DeathTestImpl : public DeathTest {\n protected:\n  DeathTestImpl(const char* a_statement, Matcher<const std::string&> matcher)\n      : statement_(a_statement),\n        matcher_(std::move(matcher)),\n        spawned_(false),\n        status_(-1),\n        outcome_(IN_PROGRESS),\n        read_fd_(-1),\n        write_fd_(-1) {}\n\n  // read_fd_ is expected to be closed and cleared by a derived class.\n  ~DeathTestImpl() override { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }\n\n  void Abort(AbortReason reason) override;\n  bool Passed(bool status_ok) override;\n\n  const char* statement() const { return statement_; }\n  bool spawned() const { return spawned_; }\n  void set_spawned(bool is_spawned) { spawned_ = is_spawned; }\n  int status() const { return status_; }\n  void set_status(int a_status) { status_ = a_status; }\n  DeathTestOutcome outcome() const { return outcome_; }\n  void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }\n  int read_fd() const { return read_fd_; }\n  void set_read_fd(int fd) { read_fd_ = fd; }\n  int write_fd() const { return write_fd_; }\n  void set_write_fd(int fd) { write_fd_ = fd; }\n\n  // Called in the parent process only. Reads the result code of the death\n  // test child process via a pipe, interprets it to set the outcome_\n  // member, and closes read_fd_.  Outputs diagnostics and terminates in\n  // case of unexpected codes.\n  void ReadAndInterpretStatusByte();\n\n  // Returns stderr output from the child process.\n  virtual std::string GetErrorLogs();\n\n private:\n  // The textual content of the code this object is testing.  This class\n  // doesn't own this string and should not attempt to delete it.\n  const char* const statement_;\n  // A matcher that's expected to match the stderr output by the child process.\n  Matcher<const std::string&> matcher_;\n  // True if the death test child process has been successfully spawned.\n  bool spawned_;\n  // The exit status of the child process.\n  int status_;\n  // How the death test concluded.\n  DeathTestOutcome outcome_;\n  // Descriptor to the read end of the pipe to the child process.  It is\n  // always -1 in the child process.  The child keeps its write end of the\n  // pipe in write_fd_.\n  int read_fd_;\n  // Descriptor to the child's write end of the pipe to the parent process.\n  // It is always -1 in the parent process.  The parent keeps its end of the\n  // pipe in read_fd_.\n  int write_fd_;\n};\n\n// Called in the parent process only. Reads the result code of the death\n// test child process via a pipe, interprets it to set the outcome_\n// member, and closes read_fd_.  Outputs diagnostics and terminates in\n// case of unexpected codes.\nvoid DeathTestImpl::ReadAndInterpretStatusByte() {\n  char flag;\n  int bytes_read;\n\n  // The read() here blocks until data is available (signifying the\n  // failure of the death test) or until the pipe is closed (signifying\n  // its success), so it's okay to call this in the parent before\n  // the child process has exited.\n  do {\n    bytes_read = posix::Read(read_fd(), &flag, 1);\n  } while (bytes_read == -1 && errno == EINTR);\n\n  if (bytes_read == 0) {\n    set_outcome(DIED);\n  } else if (bytes_read == 1) {\n    switch (flag) {\n      case kDeathTestReturned:\n        set_outcome(RETURNED);\n        break;\n      case kDeathTestThrew:\n        set_outcome(THREW);\n        break;\n      case kDeathTestLived:\n        set_outcome(LIVED);\n        break;\n      case kDeathTestInternalError:\n        FailFromInternalError(read_fd());  // Does not return.\n        break;\n      default:\n        GTEST_LOG_(FATAL) << \"Death test child process reported \"\n                          << \"unexpected status byte (\"\n                          << static_cast<unsigned int>(flag) << \")\";\n    }\n  } else {\n    GTEST_LOG_(FATAL) << \"Read from death test child process failed: \"\n                      << GetLastErrnoDescription();\n  }\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));\n  set_read_fd(-1);\n}\n\nstd::string DeathTestImpl::GetErrorLogs() {\n  return GetCapturedStderr();\n}\n\n// Signals that the death test code which should have exited, didn't.\n// Should be called only in a death test child process.\n// Writes a status byte to the child's status file descriptor, then\n// calls _exit(1).\nvoid DeathTestImpl::Abort(AbortReason reason) {\n  // The parent process considers the death test to be a failure if\n  // it finds any data in our pipe.  So, here we write a single flag byte\n  // to the pipe, then exit.\n  const char status_ch =\n      reason == TEST_DID_NOT_DIE ? kDeathTestLived :\n      reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned;\n\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));\n  // We are leaking the descriptor here because on some platforms (i.e.,\n  // when built as Windows DLL), destructors of global objects will still\n  // run after calling _exit(). On such systems, write_fd_ will be\n  // indirectly closed from the destructor of UnitTestImpl, causing double\n  // close if it is also closed here. On debug configurations, double close\n  // may assert. As there are no in-process buffers to flush here, we are\n  // relying on the OS to close the descriptor after the process terminates\n  // when the destructors are not run.\n  _exit(1);  // Exits w/o any normal exit hooks (we were supposed to crash)\n}\n\n// Returns an indented copy of stderr output for a death test.\n// This makes distinguishing death test output lines from regular log lines\n// much easier.\nstatic ::std::string FormatDeathTestOutput(const ::std::string& output) {\n  ::std::string ret;\n  for (size_t at = 0; ; ) {\n    const size_t line_end = output.find('\\n', at);\n    ret += \"[  DEATH   ] \";\n    if (line_end == ::std::string::npos) {\n      ret += output.substr(at);\n      break;\n    }\n    ret += output.substr(at, line_end + 1 - at);\n    at = line_end + 1;\n  }\n  return ret;\n}\n\n// Assesses the success or failure of a death test, using both private\n// members which have previously been set, and one argument:\n//\n// Private data members:\n//   outcome:  An enumeration describing how the death test\n//             concluded: DIED, LIVED, THREW, or RETURNED.  The death test\n//             fails in the latter three cases.\n//   status:   The exit status of the child process. On *nix, it is in the\n//             in the format specified by wait(2). On Windows, this is the\n//             value supplied to the ExitProcess() API or a numeric code\n//             of the exception that terminated the program.\n//   matcher_: A matcher that's expected to match the stderr output by the child\n//             process.\n//\n// Argument:\n//   status_ok: true if exit_status is acceptable in the context of\n//              this particular death test, which fails if it is false\n//\n// Returns true if and only if all of the above conditions are met.  Otherwise,\n// the first failing condition, in the order given above, is the one that is\n// reported. Also sets the last death test message string.\nbool DeathTestImpl::Passed(bool status_ok) {\n  if (!spawned())\n    return false;\n\n  const std::string error_message = GetErrorLogs();\n\n  bool success = false;\n  Message buffer;\n\n  buffer << \"Death test: \" << statement() << \"\\n\";\n  switch (outcome()) {\n    case LIVED:\n      buffer << \"    Result: failed to die.\\n\"\n             << \" Error msg:\\n\" << FormatDeathTestOutput(error_message);\n      break;\n    case THREW:\n      buffer << \"    Result: threw an exception.\\n\"\n             << \" Error msg:\\n\" << FormatDeathTestOutput(error_message);\n      break;\n    case RETURNED:\n      buffer << \"    Result: illegal return in test statement.\\n\"\n             << \" Error msg:\\n\" << FormatDeathTestOutput(error_message);\n      break;\n    case DIED:\n      if (status_ok) {\n        if (matcher_.Matches(error_message)) {\n          success = true;\n        } else {\n          std::ostringstream stream;\n          matcher_.DescribeTo(&stream);\n          buffer << \"    Result: died but not with expected error.\\n\"\n                 << \"  Expected: \" << stream.str() << \"\\n\"\n                 << \"Actual msg:\\n\"\n                 << FormatDeathTestOutput(error_message);\n        }\n      } else {\n        buffer << \"    Result: died but not with expected exit code:\\n\"\n               << \"            \" << ExitSummary(status()) << \"\\n\"\n               << \"Actual msg:\\n\" << FormatDeathTestOutput(error_message);\n      }\n      break;\n    case IN_PROGRESS:\n    default:\n      GTEST_LOG_(FATAL)\n          << \"DeathTest::Passed somehow called before conclusion of test\";\n  }\n\n  DeathTest::set_last_death_test_message(buffer.GetString());\n  return success;\n}\n\n# if GTEST_OS_WINDOWS\n// WindowsDeathTest implements death tests on Windows. Due to the\n// specifics of starting new processes on Windows, death tests there are\n// always threadsafe, and Google Test considers the\n// --gtest_death_test_style=fast setting to be equivalent to\n// --gtest_death_test_style=threadsafe there.\n//\n// A few implementation notes:  Like the Linux version, the Windows\n// implementation uses pipes for child-to-parent communication. But due to\n// the specifics of pipes on Windows, some extra steps are required:\n//\n// 1. The parent creates a communication pipe and stores handles to both\n//    ends of it.\n// 2. The parent starts the child and provides it with the information\n//    necessary to acquire the handle to the write end of the pipe.\n// 3. The child acquires the write end of the pipe and signals the parent\n//    using a Windows event.\n// 4. Now the parent can release the write end of the pipe on its side. If\n//    this is done before step 3, the object's reference count goes down to\n//    0 and it is destroyed, preventing the child from acquiring it. The\n//    parent now has to release it, or read operations on the read end of\n//    the pipe will not return when the child terminates.\n// 5. The parent reads child's output through the pipe (outcome code and\n//    any possible error messages) from the pipe, and its stderr and then\n//    determines whether to fail the test.\n//\n// Note: to distinguish Win32 API calls from the local method and function\n// calls, the former are explicitly resolved in the global namespace.\n//\nclass WindowsDeathTest : public DeathTestImpl {\n public:\n  WindowsDeathTest(const char* a_statement, Matcher<const std::string&> matcher,\n                   const char* file, int line)\n      : DeathTestImpl(a_statement, std::move(matcher)),\n        file_(file),\n        line_(line) {}\n\n  // All of these virtual functions are inherited from DeathTest.\n  virtual int Wait();\n  virtual TestRole AssumeRole();\n\n private:\n  // The name of the file in which the death test is located.\n  const char* const file_;\n  // The line number on which the death test is located.\n  const int line_;\n  // Handle to the write end of the pipe to the child process.\n  AutoHandle write_handle_;\n  // Child process handle.\n  AutoHandle child_handle_;\n  // Event the child process uses to signal the parent that it has\n  // acquired the handle to the write end of the pipe. After seeing this\n  // event the parent can release its own handles to make sure its\n  // ReadFile() calls return when the child terminates.\n  AutoHandle event_handle_;\n};\n\n// Waits for the child in a death test to exit, returning its exit\n// status, or 0 if no child process exists.  As a side effect, sets the\n// outcome data member.\nint WindowsDeathTest::Wait() {\n  if (!spawned())\n    return 0;\n\n  // Wait until the child either signals that it has acquired the write end\n  // of the pipe or it dies.\n  const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };\n  switch (::WaitForMultipleObjects(2,\n                                   wait_handles,\n                                   FALSE,  // Waits for any of the handles.\n                                   INFINITE)) {\n    case WAIT_OBJECT_0:\n    case WAIT_OBJECT_0 + 1:\n      break;\n    default:\n      GTEST_DEATH_TEST_CHECK_(false);  // Should not get here.\n  }\n\n  // The child has acquired the write end of the pipe or exited.\n  // We release the handle on our side and continue.\n  write_handle_.Reset();\n  event_handle_.Reset();\n\n  ReadAndInterpretStatusByte();\n\n  // Waits for the child process to exit if it haven't already. This\n  // returns immediately if the child has already exited, regardless of\n  // whether previous calls to WaitForMultipleObjects synchronized on this\n  // handle or not.\n  GTEST_DEATH_TEST_CHECK_(\n      WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),\n                                             INFINITE));\n  DWORD status_code;\n  GTEST_DEATH_TEST_CHECK_(\n      ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);\n  child_handle_.Reset();\n  set_status(static_cast<int>(status_code));\n  return status();\n}\n\n// The AssumeRole process for a Windows death test.  It creates a child\n// process with the same executable as the current process to run the\n// death test.  The child process is given the --gtest_filter and\n// --gtest_internal_run_death_test flags such that it knows to run the\n// current death test only.\nDeathTest::TestRole WindowsDeathTest::AssumeRole() {\n  const UnitTestImpl* const impl = GetUnitTestImpl();\n  const InternalRunDeathTestFlag* const flag =\n      impl->internal_run_death_test_flag();\n  const TestInfo* const info = impl->current_test_info();\n  const int death_test_index = info->result()->death_test_count();\n\n  if (flag != nullptr) {\n    // ParseInternalRunDeathTestFlag() has performed all the necessary\n    // processing.\n    set_write_fd(flag->write_fd());\n    return EXECUTE_TEST;\n  }\n\n  // WindowsDeathTest uses an anonymous pipe to communicate results of\n  // a death test.\n  SECURITY_ATTRIBUTES handles_are_inheritable = {sizeof(SECURITY_ATTRIBUTES),\n                                                 nullptr, TRUE};\n  HANDLE read_handle, write_handle;\n  GTEST_DEATH_TEST_CHECK_(\n      ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,\n                   0)  // Default buffer size.\n      != FALSE);\n  set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),\n                                O_RDONLY));\n  write_handle_.Reset(write_handle);\n  event_handle_.Reset(::CreateEvent(\n      &handles_are_inheritable,\n      TRUE,       // The event will automatically reset to non-signaled state.\n      FALSE,      // The initial state is non-signalled.\n      nullptr));  // The even is unnamed.\n  GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != nullptr);\n  const std::string filter_flag = std::string(\"--\") + GTEST_FLAG_PREFIX_ +\n                                  kFilterFlag + \"=\" + info->test_suite_name() +\n                                  \".\" + info->name();\n  const std::string internal_flag =\n      std::string(\"--\") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag +\n      \"=\" + file_ + \"|\" + StreamableToString(line_) + \"|\" +\n      StreamableToString(death_test_index) + \"|\" +\n      StreamableToString(static_cast<unsigned int>(::GetCurrentProcessId())) +\n      // size_t has the same width as pointers on both 32-bit and 64-bit\n      // Windows platforms.\n      // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.\n      \"|\" + StreamableToString(reinterpret_cast<size_t>(write_handle)) +\n      \"|\" + StreamableToString(reinterpret_cast<size_t>(event_handle_.Get()));\n\n  char executable_path[_MAX_PATH + 1];  // NOLINT\n  GTEST_DEATH_TEST_CHECK_(_MAX_PATH + 1 != ::GetModuleFileNameA(nullptr,\n                                                                executable_path,\n                                                                _MAX_PATH));\n\n  std::string command_line =\n      std::string(::GetCommandLineA()) + \" \" + filter_flag + \" \\\"\" +\n      internal_flag + \"\\\"\";\n\n  DeathTest::set_last_death_test_message(\"\");\n\n  CaptureStderr();\n  // Flush the log buffers since the log streams are shared with the child.\n  FlushInfoLog();\n\n  // The child process will share the standard handles with the parent.\n  STARTUPINFOA startup_info;\n  memset(&startup_info, 0, sizeof(STARTUPINFO));\n  startup_info.dwFlags = STARTF_USESTDHANDLES;\n  startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);\n  startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);\n  startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);\n\n  PROCESS_INFORMATION process_info;\n  GTEST_DEATH_TEST_CHECK_(\n      ::CreateProcessA(\n          executable_path, const_cast<char*>(command_line.c_str()),\n          nullptr,  // Retuned process handle is not inheritable.\n          nullptr,  // Retuned thread handle is not inheritable.\n          TRUE,  // Child inherits all inheritable handles (for write_handle_).\n          0x0,   // Default creation flags.\n          nullptr,  // Inherit the parent's environment.\n          UnitTest::GetInstance()->original_working_dir(), &startup_info,\n          &process_info) != FALSE);\n  child_handle_.Reset(process_info.hProcess);\n  ::CloseHandle(process_info.hThread);\n  set_spawned(true);\n  return OVERSEE_TEST;\n}\n\n# elif GTEST_OS_FUCHSIA\n\nclass FuchsiaDeathTest : public DeathTestImpl {\n public:\n  FuchsiaDeathTest(const char* a_statement, Matcher<const std::string&> matcher,\n                   const char* file, int line)\n      : DeathTestImpl(a_statement, std::move(matcher)),\n        file_(file),\n        line_(line) {}\n\n  // All of these virtual functions are inherited from DeathTest.\n  int Wait() override;\n  TestRole AssumeRole() override;\n  std::string GetErrorLogs() override;\n\n private:\n  // The name of the file in which the death test is located.\n  const char* const file_;\n  // The line number on which the death test is located.\n  const int line_;\n  // The stderr data captured by the child process.\n  std::string captured_stderr_;\n\n  zx::process child_process_;\n  zx::channel exception_channel_;\n  zx::socket stderr_socket_;\n};\n\n// Utility class for accumulating command-line arguments.\nclass Arguments {\n public:\n  Arguments() { args_.push_back(nullptr); }\n\n  ~Arguments() {\n    for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();\n         ++i) {\n      free(*i);\n    }\n  }\n  void AddArgument(const char* argument) {\n    args_.insert(args_.end() - 1, posix::StrDup(argument));\n  }\n\n  template <typename Str>\n  void AddArguments(const ::std::vector<Str>& arguments) {\n    for (typename ::std::vector<Str>::const_iterator i = arguments.begin();\n         i != arguments.end();\n         ++i) {\n      args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));\n    }\n  }\n  char* const* Argv() {\n    return &args_[0];\n  }\n\n  int size() {\n    return static_cast<int>(args_.size()) - 1;\n  }\n\n private:\n  std::vector<char*> args_;\n};\n\n// Waits for the child in a death test to exit, returning its exit\n// status, or 0 if no child process exists.  As a side effect, sets the\n// outcome data member.\nint FuchsiaDeathTest::Wait() {\n  const int kProcessKey = 0;\n  const int kSocketKey = 1;\n  const int kExceptionKey = 2;\n\n  if (!spawned())\n    return 0;\n\n  // Create a port to wait for socket/task/exception events.\n  zx_status_t status_zx;\n  zx::port port;\n  status_zx = zx::port::create(0, &port);\n  GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);\n\n  // Register to wait for the child process to terminate.\n  status_zx = child_process_.wait_async(\n      port, kProcessKey, ZX_PROCESS_TERMINATED, 0);\n  GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);\n\n  // Register to wait for the socket to be readable or closed.\n  status_zx = stderr_socket_.wait_async(\n      port, kSocketKey, ZX_SOCKET_READABLE | ZX_SOCKET_PEER_CLOSED, 0);\n  GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);\n\n  // Register to wait for an exception.\n  status_zx = exception_channel_.wait_async(\n      port, kExceptionKey, ZX_CHANNEL_READABLE, 0);\n  GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);\n\n  bool process_terminated = false;\n  bool socket_closed = false;\n  do {\n    zx_port_packet_t packet = {};\n    status_zx = port.wait(zx::time::infinite(), &packet);\n    GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);\n\n    if (packet.key == kExceptionKey) {\n      // Process encountered an exception. Kill it directly rather than\n      // letting other handlers process the event. We will get a kProcessKey\n      // event when the process actually terminates.\n      status_zx = child_process_.kill();\n      GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);\n    } else if (packet.key == kProcessKey) {\n      // Process terminated.\n      GTEST_DEATH_TEST_CHECK_(ZX_PKT_IS_SIGNAL_ONE(packet.type));\n      GTEST_DEATH_TEST_CHECK_(packet.signal.observed & ZX_PROCESS_TERMINATED);\n      process_terminated = true;\n    } else if (packet.key == kSocketKey) {\n      GTEST_DEATH_TEST_CHECK_(ZX_PKT_IS_SIGNAL_ONE(packet.type));\n      if (packet.signal.observed & ZX_SOCKET_READABLE) {\n        // Read data from the socket.\n        constexpr size_t kBufferSize = 1024;\n        do {\n          size_t old_length = captured_stderr_.length();\n          size_t bytes_read = 0;\n          captured_stderr_.resize(old_length + kBufferSize);\n          status_zx = stderr_socket_.read(\n              0, &captured_stderr_.front() + old_length, kBufferSize,\n              &bytes_read);\n          captured_stderr_.resize(old_length + bytes_read);\n        } while (status_zx == ZX_OK);\n        if (status_zx == ZX_ERR_PEER_CLOSED) {\n          socket_closed = true;\n        } else {\n          GTEST_DEATH_TEST_CHECK_(status_zx == ZX_ERR_SHOULD_WAIT);\n          status_zx = stderr_socket_.wait_async(\n              port, kSocketKey, ZX_SOCKET_READABLE | ZX_SOCKET_PEER_CLOSED, 0);\n          GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);\n        }\n      } else {\n        GTEST_DEATH_TEST_CHECK_(packet.signal.observed & ZX_SOCKET_PEER_CLOSED);\n        socket_closed = true;\n      }\n    }\n  } while (!process_terminated && !socket_closed);\n\n  ReadAndInterpretStatusByte();\n\n  zx_info_process_v2_t buffer;\n  status_zx = child_process_.get_info(\n      ZX_INFO_PROCESS_V2, &buffer, sizeof(buffer), nullptr, nullptr);\n  GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);\n\n  GTEST_DEATH_TEST_CHECK_(buffer.flags & ZX_INFO_PROCESS_FLAG_EXITED);\n  set_status(static_cast<int>(buffer.return_code));\n  return status();\n}\n\n// The AssumeRole process for a Fuchsia death test.  It creates a child\n// process with the same executable as the current process to run the\n// death test.  The child process is given the --gtest_filter and\n// --gtest_internal_run_death_test flags such that it knows to run the\n// current death test only.\nDeathTest::TestRole FuchsiaDeathTest::AssumeRole() {\n  const UnitTestImpl* const impl = GetUnitTestImpl();\n  const InternalRunDeathTestFlag* const flag =\n      impl->internal_run_death_test_flag();\n  const TestInfo* const info = impl->current_test_info();\n  const int death_test_index = info->result()->death_test_count();\n\n  if (flag != nullptr) {\n    // ParseInternalRunDeathTestFlag() has performed all the necessary\n    // processing.\n    set_write_fd(kFuchsiaReadPipeFd);\n    return EXECUTE_TEST;\n  }\n\n  // Flush the log buffers since the log streams are shared with the child.\n  FlushInfoLog();\n\n  // Build the child process command line.\n  const std::string filter_flag = std::string(\"--\") + GTEST_FLAG_PREFIX_ +\n                                  kFilterFlag + \"=\" + info->test_suite_name() +\n                                  \".\" + info->name();\n  const std::string internal_flag =\n      std::string(\"--\") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + \"=\"\n      + file_ + \"|\"\n      + StreamableToString(line_) + \"|\"\n      + StreamableToString(death_test_index);\n  Arguments args;\n  args.AddArguments(GetInjectableArgvs());\n  args.AddArgument(filter_flag.c_str());\n  args.AddArgument(internal_flag.c_str());\n\n  // Build the pipe for communication with the child.\n  zx_status_t status;\n  zx_handle_t child_pipe_handle;\n  int child_pipe_fd;\n  status = fdio_pipe_half(&child_pipe_fd, &child_pipe_handle);\n  GTEST_DEATH_TEST_CHECK_(status == ZX_OK);\n  set_read_fd(child_pipe_fd);\n\n  // Set the pipe handle for the child.\n  fdio_spawn_action_t spawn_actions[2] = {};\n  fdio_spawn_action_t* add_handle_action = &spawn_actions[0];\n  add_handle_action->action = FDIO_SPAWN_ACTION_ADD_HANDLE;\n  add_handle_action->h.id = PA_HND(PA_FD, kFuchsiaReadPipeFd);\n  add_handle_action->h.handle = child_pipe_handle;\n\n  // Create a socket pair will be used to receive the child process' stderr.\n  zx::socket stderr_producer_socket;\n  status =\n      zx::socket::create(0, &stderr_producer_socket, &stderr_socket_);\n  GTEST_DEATH_TEST_CHECK_(status >= 0);\n  int stderr_producer_fd = -1;\n  status =\n      fdio_fd_create(stderr_producer_socket.release(), &stderr_producer_fd);\n  GTEST_DEATH_TEST_CHECK_(status >= 0);\n\n  // Make the stderr socket nonblocking.\n  GTEST_DEATH_TEST_CHECK_(fcntl(stderr_producer_fd, F_SETFL, 0) == 0);\n\n  fdio_spawn_action_t* add_stderr_action = &spawn_actions[1];\n  add_stderr_action->action = FDIO_SPAWN_ACTION_CLONE_FD;\n  add_stderr_action->fd.local_fd = stderr_producer_fd;\n  add_stderr_action->fd.target_fd = STDERR_FILENO;\n\n  // Create a child job.\n  zx_handle_t child_job = ZX_HANDLE_INVALID;\n  status = zx_job_create(zx_job_default(), 0, & child_job);\n  GTEST_DEATH_TEST_CHECK_(status == ZX_OK);\n  zx_policy_basic_t policy;\n  policy.condition = ZX_POL_NEW_ANY;\n  policy.policy = ZX_POL_ACTION_ALLOW;\n  status = zx_job_set_policy(\n      child_job, ZX_JOB_POL_RELATIVE, ZX_JOB_POL_BASIC, &policy, 1);\n  GTEST_DEATH_TEST_CHECK_(status == ZX_OK);\n\n  // Create an exception channel attached to the |child_job|, to allow\n  // us to suppress the system default exception handler from firing.\n  status =\n      zx_task_create_exception_channel(\n          child_job, 0, exception_channel_.reset_and_get_address());\n  GTEST_DEATH_TEST_CHECK_(status == ZX_OK);\n\n  // Spawn the child process.\n  status = fdio_spawn_etc(\n      child_job, FDIO_SPAWN_CLONE_ALL, args.Argv()[0], args.Argv(), nullptr,\n      2, spawn_actions, child_process_.reset_and_get_address(), nullptr);\n  GTEST_DEATH_TEST_CHECK_(status == ZX_OK);\n\n  set_spawned(true);\n  return OVERSEE_TEST;\n}\n\nstd::string FuchsiaDeathTest::GetErrorLogs() {\n  return captured_stderr_;\n}\n\n#else  // We are neither on Windows, nor on Fuchsia.\n\n// ForkingDeathTest provides implementations for most of the abstract\n// methods of the DeathTest interface.  Only the AssumeRole method is\n// left undefined.\nclass ForkingDeathTest : public DeathTestImpl {\n public:\n  ForkingDeathTest(const char* statement, Matcher<const std::string&> matcher);\n\n  // All of these virtual functions are inherited from DeathTest.\n  int Wait() override;\n\n protected:\n  void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }\n\n private:\n  // PID of child process during death test; 0 in the child process itself.\n  pid_t child_pid_;\n};\n\n// Constructs a ForkingDeathTest.\nForkingDeathTest::ForkingDeathTest(const char* a_statement,\n                                   Matcher<const std::string&> matcher)\n    : DeathTestImpl(a_statement, std::move(matcher)), child_pid_(-1) {}\n\n// Waits for the child in a death test to exit, returning its exit\n// status, or 0 if no child process exists.  As a side effect, sets the\n// outcome data member.\nint ForkingDeathTest::Wait() {\n  if (!spawned())\n    return 0;\n\n  ReadAndInterpretStatusByte();\n\n  int status_value;\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));\n  set_status(status_value);\n  return status_value;\n}\n\n// A concrete death test class that forks, then immediately runs the test\n// in the child process.\nclass NoExecDeathTest : public ForkingDeathTest {\n public:\n  NoExecDeathTest(const char* a_statement, Matcher<const std::string&> matcher)\n      : ForkingDeathTest(a_statement, std::move(matcher)) {}\n  TestRole AssumeRole() override;\n};\n\n// The AssumeRole process for a fork-and-run death test.  It implements a\n// straightforward fork, with a simple pipe to transmit the status byte.\nDeathTest::TestRole NoExecDeathTest::AssumeRole() {\n  const size_t thread_count = GetThreadCount();\n  if (thread_count != 1) {\n    GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);\n  }\n\n  int pipe_fd[2];\n  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);\n\n  DeathTest::set_last_death_test_message(\"\");\n  CaptureStderr();\n  // When we fork the process below, the log file buffers are copied, but the\n  // file descriptors are shared.  We flush all log files here so that closing\n  // the file descriptors in the child process doesn't throw off the\n  // synchronization between descriptors and buffers in the parent process.\n  // This is as close to the fork as possible to avoid a race condition in case\n  // there are multiple threads running before the death test, and another\n  // thread writes to the log file.\n  FlushInfoLog();\n\n  const pid_t child_pid = fork();\n  GTEST_DEATH_TEST_CHECK_(child_pid != -1);\n  set_child_pid(child_pid);\n  if (child_pid == 0) {\n    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));\n    set_write_fd(pipe_fd[1]);\n    // Redirects all logging to stderr in the child process to prevent\n    // concurrent writes to the log files.  We capture stderr in the parent\n    // process and append the child process' output to a log.\n    LogToStderr();\n    // Event forwarding to the listeners of event listener API mush be shut\n    // down in death test subprocesses.\n    GetUnitTestImpl()->listeners()->SuppressEventForwarding();\n    g_in_fast_death_test_child = true;\n    return EXECUTE_TEST;\n  } else {\n    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));\n    set_read_fd(pipe_fd[0]);\n    set_spawned(true);\n    return OVERSEE_TEST;\n  }\n}\n\n// A concrete death test class that forks and re-executes the main\n// program from the beginning, with command-line flags set that cause\n// only this specific death test to be run.\nclass ExecDeathTest : public ForkingDeathTest {\n public:\n  ExecDeathTest(const char* a_statement, Matcher<const std::string&> matcher,\n                const char* file, int line)\n      : ForkingDeathTest(a_statement, std::move(matcher)),\n        file_(file),\n        line_(line) {}\n  TestRole AssumeRole() override;\n\n private:\n  static ::std::vector<std::string> GetArgvsForDeathTestChildProcess() {\n    ::std::vector<std::string> args = GetInjectableArgvs();\n#  if defined(GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_)\n    ::std::vector<std::string> extra_args =\n        GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_();\n    args.insert(args.end(), extra_args.begin(), extra_args.end());\n#  endif  // defined(GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_)\n    return args;\n  }\n  // The name of the file in which the death test is located.\n  const char* const file_;\n  // The line number on which the death test is located.\n  const int line_;\n};\n\n// Utility class for accumulating command-line arguments.\nclass Arguments {\n public:\n  Arguments() { args_.push_back(nullptr); }\n\n  ~Arguments() {\n    for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();\n         ++i) {\n      free(*i);\n    }\n  }\n  void AddArgument(const char* argument) {\n    args_.insert(args_.end() - 1, posix::StrDup(argument));\n  }\n\n  template <typename Str>\n  void AddArguments(const ::std::vector<Str>& arguments) {\n    for (typename ::std::vector<Str>::const_iterator i = arguments.begin();\n         i != arguments.end();\n         ++i) {\n      args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));\n    }\n  }\n  char* const* Argv() {\n    return &args_[0];\n  }\n\n private:\n  std::vector<char*> args_;\n};\n\n// A struct that encompasses the arguments to the child process of a\n// threadsafe-style death test process.\nstruct ExecDeathTestArgs {\n  char* const* argv;  // Command-line arguments for the child's call to exec\n  int close_fd;       // File descriptor to close; the read end of a pipe\n};\n\n#  if GTEST_OS_QNX\nextern \"C\" char** environ;\n#  else  // GTEST_OS_QNX\n// The main function for a threadsafe-style death test child process.\n// This function is called in a clone()-ed process and thus must avoid\n// any potentially unsafe operations like malloc or libc functions.\nstatic int ExecDeathTestChildMain(void* child_arg) {\n  ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));\n\n  // We need to execute the test program in the same environment where\n  // it was originally invoked.  Therefore we change to the original\n  // working directory first.\n  const char* const original_dir =\n      UnitTest::GetInstance()->original_working_dir();\n  // We can safely call chdir() as it's a direct system call.\n  if (chdir(original_dir) != 0) {\n    DeathTestAbort(std::string(\"chdir(\\\"\") + original_dir + \"\\\") failed: \" +\n                   GetLastErrnoDescription());\n    return EXIT_FAILURE;\n  }\n\n  // We can safely call execv() as it's almost a direct system call. We\n  // cannot use execvp() as it's a libc function and thus potentially\n  // unsafe.  Since execv() doesn't search the PATH, the user must\n  // invoke the test program via a valid path that contains at least\n  // one path separator.\n  execv(args->argv[0], args->argv);\n  DeathTestAbort(std::string(\"execv(\") + args->argv[0] + \", ...) in \" +\n                 original_dir + \" failed: \" +\n                 GetLastErrnoDescription());\n  return EXIT_FAILURE;\n}\n#  endif  // GTEST_OS_QNX\n\n#  if GTEST_HAS_CLONE\n// Two utility routines that together determine the direction the stack\n// grows.\n// This could be accomplished more elegantly by a single recursive\n// function, but we want to guard against the unlikely possibility of\n// a smart compiler optimizing the recursion away.\n//\n// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining\n// StackLowerThanAddress into StackGrowsDown, which then doesn't give\n// correct answer.\nstatic void StackLowerThanAddress(const void* ptr,\n                                  bool* result) GTEST_NO_INLINE_;\n// Make sure sanitizers do not tamper with the stack here.\n// Ideally, we want to use `__builtin_frame_address` instead of a local variable\n// address with sanitizer disabled, but it does not work when the\n// compiler optimizes the stack frame out, which happens on PowerPC targets.\n// HWAddressSanitizer add a random tag to the MSB of the local variable address,\n// making comparison result unpredictable.\nGTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_\nGTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_\nstatic void StackLowerThanAddress(const void* ptr, bool* result) {\n  int dummy = 0;\n  *result = std::less<const void*>()(&dummy, ptr);\n}\n\n// Make sure AddressSanitizer does not tamper with the stack here.\nGTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_\nGTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_\nstatic bool StackGrowsDown() {\n  int dummy = 0;\n  bool result;\n  StackLowerThanAddress(&dummy, &result);\n  return result;\n}\n#  endif  // GTEST_HAS_CLONE\n\n// Spawns a child process with the same executable as the current process in\n// a thread-safe manner and instructs it to run the death test.  The\n// implementation uses fork(2) + exec.  On systems where clone(2) is\n// available, it is used instead, being slightly more thread-safe.  On QNX,\n// fork supports only single-threaded environments, so this function uses\n// spawn(2) there instead.  The function dies with an error message if\n// anything goes wrong.\nstatic pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {\n  ExecDeathTestArgs args = { argv, close_fd };\n  pid_t child_pid = -1;\n\n#  if GTEST_OS_QNX\n  // Obtains the current directory and sets it to be closed in the child\n  // process.\n  const int cwd_fd = open(\".\", O_RDONLY);\n  GTEST_DEATH_TEST_CHECK_(cwd_fd != -1);\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC));\n  // We need to execute the test program in the same environment where\n  // it was originally invoked.  Therefore we change to the original\n  // working directory first.\n  const char* const original_dir =\n      UnitTest::GetInstance()->original_working_dir();\n  // We can safely call chdir() as it's a direct system call.\n  if (chdir(original_dir) != 0) {\n    DeathTestAbort(std::string(\"chdir(\\\"\") + original_dir + \"\\\") failed: \" +\n                   GetLastErrnoDescription());\n    return EXIT_FAILURE;\n  }\n\n  int fd_flags;\n  // Set close_fd to be closed after spawn.\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD));\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD,\n                                        fd_flags | FD_CLOEXEC));\n  struct inheritance inherit = {0};\n  // spawn is a system call.\n  child_pid = spawn(args.argv[0], 0, nullptr, &inherit, args.argv, environ);\n  // Restores the current working directory.\n  GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));\n\n#  else   // GTEST_OS_QNX\n#   if GTEST_OS_LINUX\n  // When a SIGPROF signal is received while fork() or clone() are executing,\n  // the process may hang. To avoid this, we ignore SIGPROF here and re-enable\n  // it after the call to fork()/clone() is complete.\n  struct sigaction saved_sigprof_action;\n  struct sigaction ignore_sigprof_action;\n  memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action));\n  sigemptyset(&ignore_sigprof_action.sa_mask);\n  ignore_sigprof_action.sa_handler = SIG_IGN;\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction(\n      SIGPROF, &ignore_sigprof_action, &saved_sigprof_action));\n#   endif  // GTEST_OS_LINUX\n\n#   if GTEST_HAS_CLONE\n  const bool use_fork = GTEST_FLAG(death_test_use_fork);\n\n  if (!use_fork) {\n    static const bool stack_grows_down = StackGrowsDown();\n    const auto stack_size = static_cast<size_t>(getpagesize() * 2);\n    // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.\n    void* const stack = mmap(nullptr, stack_size, PROT_READ | PROT_WRITE,\n                             MAP_ANON | MAP_PRIVATE, -1, 0);\n    GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);\n\n    // Maximum stack alignment in bytes:  For a downward-growing stack, this\n    // amount is subtracted from size of the stack space to get an address\n    // that is within the stack space and is aligned on all systems we care\n    // about.  As far as I know there is no ABI with stack alignment greater\n    // than 64.  We assume stack and stack_size already have alignment of\n    // kMaxStackAlignment.\n    const size_t kMaxStackAlignment = 64;\n    void* const stack_top =\n        static_cast<char*>(stack) +\n            (stack_grows_down ? stack_size - kMaxStackAlignment : 0);\n    GTEST_DEATH_TEST_CHECK_(\n        static_cast<size_t>(stack_size) > kMaxStackAlignment &&\n        reinterpret_cast<uintptr_t>(stack_top) % kMaxStackAlignment == 0);\n\n    child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);\n\n    GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);\n  }\n#   else\n  const bool use_fork = true;\n#   endif  // GTEST_HAS_CLONE\n\n  if (use_fork && (child_pid = fork()) == 0) {\n      ExecDeathTestChildMain(&args);\n      _exit(0);\n  }\n#  endif  // GTEST_OS_QNX\n#  if GTEST_OS_LINUX\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(\n      sigaction(SIGPROF, &saved_sigprof_action, nullptr));\n#  endif  // GTEST_OS_LINUX\n\n  GTEST_DEATH_TEST_CHECK_(child_pid != -1);\n  return child_pid;\n}\n\n// The AssumeRole process for a fork-and-exec death test.  It re-executes the\n// main program from the beginning, setting the --gtest_filter\n// and --gtest_internal_run_death_test flags to cause only the current\n// death test to be re-run.\nDeathTest::TestRole ExecDeathTest::AssumeRole() {\n  const UnitTestImpl* const impl = GetUnitTestImpl();\n  const InternalRunDeathTestFlag* const flag =\n      impl->internal_run_death_test_flag();\n  const TestInfo* const info = impl->current_test_info();\n  const int death_test_index = info->result()->death_test_count();\n\n  if (flag != nullptr) {\n    set_write_fd(flag->write_fd());\n    return EXECUTE_TEST;\n  }\n\n  int pipe_fd[2];\n  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);\n  // Clear the close-on-exec flag on the write end of the pipe, lest\n  // it be closed when the child process does an exec:\n  GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);\n\n  const std::string filter_flag = std::string(\"--\") + GTEST_FLAG_PREFIX_ +\n                                  kFilterFlag + \"=\" + info->test_suite_name() +\n                                  \".\" + info->name();\n  const std::string internal_flag =\n      std::string(\"--\") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + \"=\"\n      + file_ + \"|\" + StreamableToString(line_) + \"|\"\n      + StreamableToString(death_test_index) + \"|\"\n      + StreamableToString(pipe_fd[1]);\n  Arguments args;\n  args.AddArguments(GetArgvsForDeathTestChildProcess());\n  args.AddArgument(filter_flag.c_str());\n  args.AddArgument(internal_flag.c_str());\n\n  DeathTest::set_last_death_test_message(\"\");\n\n  CaptureStderr();\n  // See the comment in NoExecDeathTest::AssumeRole for why the next line\n  // is necessary.\n  FlushInfoLog();\n\n  const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]);\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));\n  set_child_pid(child_pid);\n  set_read_fd(pipe_fd[0]);\n  set_spawned(true);\n  return OVERSEE_TEST;\n}\n\n# endif  // !GTEST_OS_WINDOWS\n\n// Creates a concrete DeathTest-derived class that depends on the\n// --gtest_death_test_style flag, and sets the pointer pointed to\n// by the \"test\" argument to its address.  If the test should be\n// skipped, sets that pointer to NULL.  Returns true, unless the\n// flag is set to an invalid value.\nbool DefaultDeathTestFactory::Create(const char* statement,\n                                     Matcher<const std::string&> matcher,\n                                     const char* file, int line,\n                                     DeathTest** test) {\n  UnitTestImpl* const impl = GetUnitTestImpl();\n  const InternalRunDeathTestFlag* const flag =\n      impl->internal_run_death_test_flag();\n  const int death_test_index = impl->current_test_info()\n      ->increment_death_test_count();\n\n  if (flag != nullptr) {\n    if (death_test_index > flag->index()) {\n      DeathTest::set_last_death_test_message(\n          \"Death test count (\" + StreamableToString(death_test_index)\n          + \") somehow exceeded expected maximum (\"\n          + StreamableToString(flag->index()) + \")\");\n      return false;\n    }\n\n    if (!(flag->file() == file && flag->line() == line &&\n          flag->index() == death_test_index)) {\n      *test = nullptr;\n      return true;\n    }\n  }\n\n# if GTEST_OS_WINDOWS\n\n  if (GTEST_FLAG(death_test_style) == \"threadsafe\" ||\n      GTEST_FLAG(death_test_style) == \"fast\") {\n    *test = new WindowsDeathTest(statement, std::move(matcher), file, line);\n  }\n\n# elif GTEST_OS_FUCHSIA\n\n  if (GTEST_FLAG(death_test_style) == \"threadsafe\" ||\n      GTEST_FLAG(death_test_style) == \"fast\") {\n    *test = new FuchsiaDeathTest(statement, std::move(matcher), file, line);\n  }\n\n# else\n\n  if (GTEST_FLAG(death_test_style) == \"threadsafe\") {\n    *test = new ExecDeathTest(statement, std::move(matcher), file, line);\n  } else if (GTEST_FLAG(death_test_style) == \"fast\") {\n    *test = new NoExecDeathTest(statement, std::move(matcher));\n  }\n\n# endif  // GTEST_OS_WINDOWS\n\n  else {  // NOLINT - this is more readable than unbalanced brackets inside #if.\n    DeathTest::set_last_death_test_message(\n        \"Unknown death test style \\\"\" + GTEST_FLAG(death_test_style)\n        + \"\\\" encountered\");\n    return false;\n  }\n\n  return true;\n}\n\n# if GTEST_OS_WINDOWS\n// Recreates the pipe and event handles from the provided parameters,\n// signals the event, and returns a file descriptor wrapped around the pipe\n// handle. This function is called in the child process only.\nstatic int GetStatusFileDescriptor(unsigned int parent_process_id,\n                            size_t write_handle_as_size_t,\n                            size_t event_handle_as_size_t) {\n  AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,\n                                                   FALSE,  // Non-inheritable.\n                                                   parent_process_id));\n  if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {\n    DeathTestAbort(\"Unable to open parent process \" +\n                   StreamableToString(parent_process_id));\n  }\n\n  GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));\n\n  const HANDLE write_handle =\n      reinterpret_cast<HANDLE>(write_handle_as_size_t);\n  HANDLE dup_write_handle;\n\n  // The newly initialized handle is accessible only in the parent\n  // process. To obtain one accessible within the child, we need to use\n  // DuplicateHandle.\n  if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,\n                         ::GetCurrentProcess(), &dup_write_handle,\n                         0x0,    // Requested privileges ignored since\n                                 // DUPLICATE_SAME_ACCESS is used.\n                         FALSE,  // Request non-inheritable handler.\n                         DUPLICATE_SAME_ACCESS)) {\n    DeathTestAbort(\"Unable to duplicate the pipe handle \" +\n                   StreamableToString(write_handle_as_size_t) +\n                   \" from the parent process \" +\n                   StreamableToString(parent_process_id));\n  }\n\n  const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);\n  HANDLE dup_event_handle;\n\n  if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,\n                         ::GetCurrentProcess(), &dup_event_handle,\n                         0x0,\n                         FALSE,\n                         DUPLICATE_SAME_ACCESS)) {\n    DeathTestAbort(\"Unable to duplicate the event handle \" +\n                   StreamableToString(event_handle_as_size_t) +\n                   \" from the parent process \" +\n                   StreamableToString(parent_process_id));\n  }\n\n  const int write_fd =\n      ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);\n  if (write_fd == -1) {\n    DeathTestAbort(\"Unable to convert pipe handle \" +\n                   StreamableToString(write_handle_as_size_t) +\n                   \" to a file descriptor\");\n  }\n\n  // Signals the parent that the write end of the pipe has been acquired\n  // so the parent can release its own write end.\n  ::SetEvent(dup_event_handle);\n\n  return write_fd;\n}\n# endif  // GTEST_OS_WINDOWS\n\n// Returns a newly created InternalRunDeathTestFlag object with fields\n// initialized from the GTEST_FLAG(internal_run_death_test) flag if\n// the flag is specified; otherwise returns NULL.\nInternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {\n  if (GTEST_FLAG(internal_run_death_test) == \"\") return nullptr;\n\n  // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we\n  // can use it here.\n  int line = -1;\n  int index = -1;\n  ::std::vector< ::std::string> fields;\n  SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);\n  int write_fd = -1;\n\n# if GTEST_OS_WINDOWS\n\n  unsigned int parent_process_id = 0;\n  size_t write_handle_as_size_t = 0;\n  size_t event_handle_as_size_t = 0;\n\n  if (fields.size() != 6\n      || !ParseNaturalNumber(fields[1], &line)\n      || !ParseNaturalNumber(fields[2], &index)\n      || !ParseNaturalNumber(fields[3], &parent_process_id)\n      || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)\n      || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {\n    DeathTestAbort(\"Bad --gtest_internal_run_death_test flag: \" +\n                   GTEST_FLAG(internal_run_death_test));\n  }\n  write_fd = GetStatusFileDescriptor(parent_process_id,\n                                     write_handle_as_size_t,\n                                     event_handle_as_size_t);\n\n# elif GTEST_OS_FUCHSIA\n\n  if (fields.size() != 3\n      || !ParseNaturalNumber(fields[1], &line)\n      || !ParseNaturalNumber(fields[2], &index)) {\n    DeathTestAbort(\"Bad --gtest_internal_run_death_test flag: \"\n        + GTEST_FLAG(internal_run_death_test));\n  }\n\n# else\n\n  if (fields.size() != 4\n      || !ParseNaturalNumber(fields[1], &line)\n      || !ParseNaturalNumber(fields[2], &index)\n      || !ParseNaturalNumber(fields[3], &write_fd)) {\n    DeathTestAbort(\"Bad --gtest_internal_run_death_test flag: \"\n        + GTEST_FLAG(internal_run_death_test));\n  }\n\n# endif  // GTEST_OS_WINDOWS\n\n  return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);\n}\n\n}  // namespace internal\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n}  // namespace testing\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n#include <stdlib.h>\n\n#if GTEST_OS_WINDOWS_MOBILE\n# include <windows.h>\n#elif GTEST_OS_WINDOWS\n# include <direct.h>\n# include <io.h>\n#else\n# include <limits.h>\n# include <climits>  // Some Linux distributions define PATH_MAX here.\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n\n#if GTEST_OS_WINDOWS\n# define GTEST_PATH_MAX_ _MAX_PATH\n#elif defined(PATH_MAX)\n# define GTEST_PATH_MAX_ PATH_MAX\n#elif defined(_XOPEN_PATH_MAX)\n# define GTEST_PATH_MAX_ _XOPEN_PATH_MAX\n#else\n# define GTEST_PATH_MAX_ _POSIX_PATH_MAX\n#endif  // GTEST_OS_WINDOWS\n\nnamespace testing {\nnamespace internal {\n\n#if GTEST_OS_WINDOWS\n// On Windows, '\\\\' is the standard path separator, but many tools and the\n// Windows API also accept '/' as an alternate path separator. Unless otherwise\n// noted, a file path can contain either kind of path separators, or a mixture\n// of them.\nconst char kPathSeparator = '\\\\';\nconst char kAlternatePathSeparator = '/';\nconst char kAlternatePathSeparatorString[] = \"/\";\n# if GTEST_OS_WINDOWS_MOBILE\n// Windows CE doesn't have a current directory. You should not use\n// the current directory in tests on Windows CE, but this at least\n// provides a reasonable fallback.\nconst char kCurrentDirectoryString[] = \"\\\\\";\n// Windows CE doesn't define INVALID_FILE_ATTRIBUTES\nconst DWORD kInvalidFileAttributes = 0xffffffff;\n# else\nconst char kCurrentDirectoryString[] = \".\\\\\";\n# endif  // GTEST_OS_WINDOWS_MOBILE\n#else\nconst char kPathSeparator = '/';\nconst char kCurrentDirectoryString[] = \"./\";\n#endif  // GTEST_OS_WINDOWS\n\n// Returns whether the given character is a valid path separator.\nstatic bool IsPathSeparator(char c) {\n#if GTEST_HAS_ALT_PATH_SEP_\n  return (c == kPathSeparator) || (c == kAlternatePathSeparator);\n#else\n  return c == kPathSeparator;\n#endif\n}\n\n// Returns the current working directory, or \"\" if unsuccessful.\nFilePath FilePath::GetCurrentDir() {\n#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE ||         \\\n    GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_ESP32 || \\\n    GTEST_OS_XTENSA\n  // These platforms do not have a current directory, so we just return\n  // something reasonable.\n  return FilePath(kCurrentDirectoryString);\n#elif GTEST_OS_WINDOWS\n  char cwd[GTEST_PATH_MAX_ + 1] = { '\\0' };\n  return FilePath(_getcwd(cwd, sizeof(cwd)) == nullptr ? \"\" : cwd);\n#else\n  char cwd[GTEST_PATH_MAX_ + 1] = { '\\0' };\n  char* result = getcwd(cwd, sizeof(cwd));\n# if GTEST_OS_NACL\n  // getcwd will likely fail in NaCl due to the sandbox, so return something\n  // reasonable. The user may have provided a shim implementation for getcwd,\n  // however, so fallback only when failure is detected.\n  return FilePath(result == nullptr ? kCurrentDirectoryString : cwd);\n# endif  // GTEST_OS_NACL\n  return FilePath(result == nullptr ? \"\" : cwd);\n#endif  // GTEST_OS_WINDOWS_MOBILE\n}\n\n// Returns a copy of the FilePath with the case-insensitive extension removed.\n// Example: FilePath(\"dir/file.exe\").RemoveExtension(\"EXE\") returns\n// FilePath(\"dir/file\"). If a case-insensitive extension is not\n// found, returns a copy of the original FilePath.\nFilePath FilePath::RemoveExtension(const char* extension) const {\n  const std::string dot_extension = std::string(\".\") + extension;\n  if (String::EndsWithCaseInsensitive(pathname_, dot_extension)) {\n    return FilePath(pathname_.substr(\n        0, pathname_.length() - dot_extension.length()));\n  }\n  return *this;\n}\n\n// Returns a pointer to the last occurrence of a valid path separator in\n// the FilePath. On Windows, for example, both '/' and '\\' are valid path\n// separators. Returns NULL if no path separator was found.\nconst char* FilePath::FindLastPathSeparator() const {\n  const char* const last_sep = strrchr(c_str(), kPathSeparator);\n#if GTEST_HAS_ALT_PATH_SEP_\n  const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);\n  // Comparing two pointers of which only one is NULL is undefined.\n  if (last_alt_sep != nullptr &&\n      (last_sep == nullptr || last_alt_sep > last_sep)) {\n    return last_alt_sep;\n  }\n#endif\n  return last_sep;\n}\n\n// Returns a copy of the FilePath with the directory part removed.\n// Example: FilePath(\"path/to/file\").RemoveDirectoryName() returns\n// FilePath(\"file\"). If there is no directory part (\"just_a_file\"), it returns\n// the FilePath unmodified. If there is no file part (\"just_a_dir/\") it\n// returns an empty FilePath (\"\").\n// On Windows platform, '\\' is the path separator, otherwise it is '/'.\nFilePath FilePath::RemoveDirectoryName() const {\n  const char* const last_sep = FindLastPathSeparator();\n  return last_sep ? FilePath(last_sep + 1) : *this;\n}\n\n// RemoveFileName returns the directory path with the filename removed.\n// Example: FilePath(\"path/to/file\").RemoveFileName() returns \"path/to/\".\n// If the FilePath is \"a_file\" or \"/a_file\", RemoveFileName returns\n// FilePath(\"./\") or, on Windows, FilePath(\".\\\\\"). If the filepath does\n// not have a file, like \"just/a/dir/\", it returns the FilePath unmodified.\n// On Windows platform, '\\' is the path separator, otherwise it is '/'.\nFilePath FilePath::RemoveFileName() const {\n  const char* const last_sep = FindLastPathSeparator();\n  std::string dir;\n  if (last_sep) {\n    dir = std::string(c_str(), static_cast<size_t>(last_sep + 1 - c_str()));\n  } else {\n    dir = kCurrentDirectoryString;\n  }\n  return FilePath(dir);\n}\n\n// Helper functions for naming files in a directory for xml output.\n\n// Given directory = \"dir\", base_name = \"test\", number = 0,\n// extension = \"xml\", returns \"dir/test.xml\". If number is greater\n// than zero (e.g., 12), returns \"dir/test_12.xml\".\n// On Windows platform, uses \\ as the separator rather than /.\nFilePath FilePath::MakeFileName(const FilePath& directory,\n                                const FilePath& base_name,\n                                int number,\n                                const char* extension) {\n  std::string file;\n  if (number == 0) {\n    file = base_name.string() + \".\" + extension;\n  } else {\n    file = base_name.string() + \"_\" + StreamableToString(number)\n        + \".\" + extension;\n  }\n  return ConcatPaths(directory, FilePath(file));\n}\n\n// Given directory = \"dir\", relative_path = \"test.xml\", returns \"dir/test.xml\".\n// On Windows, uses \\ as the separator rather than /.\nFilePath FilePath::ConcatPaths(const FilePath& directory,\n                               const FilePath& relative_path) {\n  if (directory.IsEmpty())\n    return relative_path;\n  const FilePath dir(directory.RemoveTrailingPathSeparator());\n  return FilePath(dir.string() + kPathSeparator + relative_path.string());\n}\n\n// Returns true if pathname describes something findable in the file-system,\n// either a file, directory, or whatever.\nbool FilePath::FileOrDirectoryExists() const {\n#if GTEST_OS_WINDOWS_MOBILE\n  LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());\n  const DWORD attributes = GetFileAttributes(unicode);\n  delete [] unicode;\n  return attributes != kInvalidFileAttributes;\n#else\n  posix::StatStruct file_stat;\n  return posix::Stat(pathname_.c_str(), &file_stat) == 0;\n#endif  // GTEST_OS_WINDOWS_MOBILE\n}\n\n// Returns true if pathname describes a directory in the file-system\n// that exists.\nbool FilePath::DirectoryExists() const {\n  bool result = false;\n#if GTEST_OS_WINDOWS\n  // Don't strip off trailing separator if path is a root directory on\n  // Windows (like \"C:\\\\\").\n  const FilePath& path(IsRootDirectory() ? *this :\n                                           RemoveTrailingPathSeparator());\n#else\n  const FilePath& path(*this);\n#endif\n\n#if GTEST_OS_WINDOWS_MOBILE\n  LPCWSTR unicode = String::AnsiToUtf16(path.c_str());\n  const DWORD attributes = GetFileAttributes(unicode);\n  delete [] unicode;\n  if ((attributes != kInvalidFileAttributes) &&\n      (attributes & FILE_ATTRIBUTE_DIRECTORY)) {\n    result = true;\n  }\n#else\n  posix::StatStruct file_stat;\n  result = posix::Stat(path.c_str(), &file_stat) == 0 &&\n      posix::IsDir(file_stat);\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n  return result;\n}\n\n// Returns true if pathname describes a root directory. (Windows has one\n// root directory per disk drive.)\nbool FilePath::IsRootDirectory() const {\n#if GTEST_OS_WINDOWS\n  return pathname_.length() == 3 && IsAbsolutePath();\n#else\n  return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);\n#endif\n}\n\n// Returns true if pathname describes an absolute path.\nbool FilePath::IsAbsolutePath() const {\n  const char* const name = pathname_.c_str();\n#if GTEST_OS_WINDOWS\n  return pathname_.length() >= 3 &&\n     ((name[0] >= 'a' && name[0] <= 'z') ||\n      (name[0] >= 'A' && name[0] <= 'Z')) &&\n     name[1] == ':' &&\n     IsPathSeparator(name[2]);\n#else\n  return IsPathSeparator(name[0]);\n#endif\n}\n\n// Returns a pathname for a file that does not currently exist. The pathname\n// will be directory/base_name.extension or\n// directory/base_name_<number>.extension if directory/base_name.extension\n// already exists. The number will be incremented until a pathname is found\n// that does not already exist.\n// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.\n// There could be a race condition if two or more processes are calling this\n// function at the same time -- they could both pick the same filename.\nFilePath FilePath::GenerateUniqueFileName(const FilePath& directory,\n                                          const FilePath& base_name,\n                                          const char* extension) {\n  FilePath full_pathname;\n  int number = 0;\n  do {\n    full_pathname.Set(MakeFileName(directory, base_name, number++, extension));\n  } while (full_pathname.FileOrDirectoryExists());\n  return full_pathname;\n}\n\n// Returns true if FilePath ends with a path separator, which indicates that\n// it is intended to represent a directory. Returns false otherwise.\n// This does NOT check that a directory (or file) actually exists.\nbool FilePath::IsDirectory() const {\n  return !pathname_.empty() &&\n         IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]);\n}\n\n// Create directories so that path exists. Returns true if successful or if\n// the directories already exist; returns false if unable to create directories\n// for any reason.\nbool FilePath::CreateDirectoriesRecursively() const {\n  if (!this->IsDirectory()) {\n    return false;\n  }\n\n  if (pathname_.length() == 0 || this->DirectoryExists()) {\n    return true;\n  }\n\n  const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName());\n  return parent.CreateDirectoriesRecursively() && this->CreateFolder();\n}\n\n// Create the directory so that path exists. Returns true if successful or\n// if the directory already exists; returns false if unable to create the\n// directory for any reason, including if the parent directory does not\n// exist. Not named \"CreateDirectory\" because that's a macro on Windows.\nbool FilePath::CreateFolder() const {\n#if GTEST_OS_WINDOWS_MOBILE\n  FilePath removed_sep(this->RemoveTrailingPathSeparator());\n  LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());\n  int result = CreateDirectory(unicode, nullptr) ? 0 : -1;\n  delete [] unicode;\n#elif GTEST_OS_WINDOWS\n  int result = _mkdir(pathname_.c_str());\n#elif GTEST_OS_ESP8266 || GTEST_OS_XTENSA\n  // do nothing\n  int result = 0;\n#else\n  int result = mkdir(pathname_.c_str(), 0777);\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n  if (result == -1) {\n    return this->DirectoryExists();  // An error is OK if the directory exists.\n  }\n  return true;  // No error.\n}\n\n// If input name has a trailing separator character, remove it and return the\n// name, otherwise return the name string unmodified.\n// On Windows platform, uses \\ as the separator, other platforms use /.\nFilePath FilePath::RemoveTrailingPathSeparator() const {\n  return IsDirectory()\n      ? FilePath(pathname_.substr(0, pathname_.length() - 1))\n      : *this;\n}\n\n// Removes any redundant separators that might be in the pathname.\n// For example, \"bar///foo\" becomes \"bar/foo\". Does not eliminate other\n// redundancies that might be in a pathname involving \".\" or \"..\".\nvoid FilePath::Normalize() {\n  auto out = pathname_.begin();\n\n  for (const char character : pathname_) {\n    if (!IsPathSeparator(character)) {\n      *(out++) = character;\n    } else if (out == pathname_.begin() || *std::prev(out) != kPathSeparator) {\n      *(out++) = kPathSeparator;\n    } else {\n      continue;\n    }\n  }\n\n  pathname_.erase(out, pathname_.end());\n}\n\n}  // namespace internal\n}  // namespace testing\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// The Google C++ Testing and Mocking Framework (Google Test)\n//\n// This file implements just enough of the matcher interface to allow\n// EXPECT_DEATH and friends to accept a matcher argument.\n\n\n#include <string>\n\nnamespace testing {\n\n// Constructs a matcher that matches a const std::string& whose value is\n// equal to s.\nMatcher<const std::string&>::Matcher(const std::string& s) { *this = Eq(s); }\n\n// Constructs a matcher that matches a const std::string& whose value is\n// equal to s.\nMatcher<const std::string&>::Matcher(const char* s) {\n  *this = Eq(std::string(s));\n}\n\n// Constructs a matcher that matches a std::string whose value is equal to\n// s.\nMatcher<std::string>::Matcher(const std::string& s) { *this = Eq(s); }\n\n// Constructs a matcher that matches a std::string whose value is equal to\n// s.\nMatcher<std::string>::Matcher(const char* s) { *this = Eq(std::string(s)); }\n\n#if GTEST_INTERNAL_HAS_STRING_VIEW\n// Constructs a matcher that matches a const StringView& whose value is\n// equal to s.\nMatcher<const internal::StringView&>::Matcher(const std::string& s) {\n  *this = Eq(s);\n}\n\n// Constructs a matcher that matches a const StringView& whose value is\n// equal to s.\nMatcher<const internal::StringView&>::Matcher(const char* s) {\n  *this = Eq(std::string(s));\n}\n\n// Constructs a matcher that matches a const StringView& whose value is\n// equal to s.\nMatcher<const internal::StringView&>::Matcher(internal::StringView s) {\n  *this = Eq(std::string(s));\n}\n\n// Constructs a matcher that matches a StringView whose value is equal to\n// s.\nMatcher<internal::StringView>::Matcher(const std::string& s) { *this = Eq(s); }\n\n// Constructs a matcher that matches a StringView whose value is equal to\n// s.\nMatcher<internal::StringView>::Matcher(const char* s) {\n  *this = Eq(std::string(s));\n}\n\n// Constructs a matcher that matches a StringView whose value is equal to\n// s.\nMatcher<internal::StringView>::Matcher(internal::StringView s) {\n  *this = Eq(std::string(s));\n}\n#endif  // GTEST_INTERNAL_HAS_STRING_VIEW\n\n}  // namespace testing\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n\n#include <limits.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <cstdint>\n#include <fstream>\n#include <memory>\n\n#if GTEST_OS_WINDOWS\n# include <windows.h>\n# include <io.h>\n# include <sys/stat.h>\n# include <map>  // Used in ThreadLocal.\n# ifdef _MSC_VER\n#  include <crtdbg.h>\n# endif  // _MSC_VER\n#else\n# include <unistd.h>\n#endif  // GTEST_OS_WINDOWS\n\n#if GTEST_OS_MAC\n# include <mach/mach_init.h>\n# include <mach/task.h>\n# include <mach/vm_map.h>\n#endif  // GTEST_OS_MAC\n\n#if GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD || \\\n    GTEST_OS_NETBSD || GTEST_OS_OPENBSD\n# include <sys/sysctl.h>\n# if GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD\n#  include <sys/user.h>\n# endif\n#endif\n\n#if GTEST_OS_QNX\n# include <devctl.h>\n# include <fcntl.h>\n# include <sys/procfs.h>\n#endif  // GTEST_OS_QNX\n\n#if GTEST_OS_AIX\n# include <procinfo.h>\n# include <sys/types.h>\n#endif  // GTEST_OS_AIX\n\n#if GTEST_OS_FUCHSIA\n# include <zircon/process.h>\n# include <zircon/syscalls.h>\n#endif  // GTEST_OS_FUCHSIA\n\n\nnamespace testing {\nnamespace internal {\n\n#if defined(_MSC_VER) || defined(__BORLANDC__)\n// MSVC and C++Builder do not provide a definition of STDERR_FILENO.\nconst int kStdOutFileno = 1;\nconst int kStdErrFileno = 2;\n#else\nconst int kStdOutFileno = STDOUT_FILENO;\nconst int kStdErrFileno = STDERR_FILENO;\n#endif  // _MSC_VER\n\n#if GTEST_OS_LINUX\n\nnamespace {\ntemplate <typename T>\nT ReadProcFileField(const std::string& filename, int field) {\n  std::string dummy;\n  std::ifstream file(filename.c_str());\n  while (field-- > 0) {\n    file >> dummy;\n  }\n  T output = 0;\n  file >> output;\n  return output;\n}\n}  // namespace\n\n// Returns the number of active threads, or 0 when there is an error.\nsize_t GetThreadCount() {\n  const std::string filename =\n      (Message() << \"/proc/\" << getpid() << \"/stat\").GetString();\n  return ReadProcFileField<size_t>(filename, 19);\n}\n\n#elif GTEST_OS_MAC\n\nsize_t GetThreadCount() {\n  const task_t task = mach_task_self();\n  mach_msg_type_number_t thread_count;\n  thread_act_array_t thread_list;\n  const kern_return_t status = task_threads(task, &thread_list, &thread_count);\n  if (status == KERN_SUCCESS) {\n    // task_threads allocates resources in thread_list and we need to free them\n    // to avoid leaks.\n    vm_deallocate(task,\n                  reinterpret_cast<vm_address_t>(thread_list),\n                  sizeof(thread_t) * thread_count);\n    return static_cast<size_t>(thread_count);\n  } else {\n    return 0;\n  }\n}\n\n#elif GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD || \\\n      GTEST_OS_NETBSD\n\n#if GTEST_OS_NETBSD\n#undef KERN_PROC\n#define KERN_PROC KERN_PROC2\n#define kinfo_proc kinfo_proc2\n#endif\n\n#if GTEST_OS_DRAGONFLY\n#define KP_NLWP(kp) (kp.kp_nthreads)\n#elif GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD\n#define KP_NLWP(kp) (kp.ki_numthreads)\n#elif GTEST_OS_NETBSD\n#define KP_NLWP(kp) (kp.p_nlwps)\n#endif\n\n// Returns the number of threads running in the process, or 0 to indicate that\n// we cannot detect it.\nsize_t GetThreadCount() {\n  int mib[] = {\n    CTL_KERN,\n    KERN_PROC,\n    KERN_PROC_PID,\n    getpid(),\n#if GTEST_OS_NETBSD\n    sizeof(struct kinfo_proc),\n    1,\n#endif\n  };\n  u_int miblen = sizeof(mib) / sizeof(mib[0]);\n  struct kinfo_proc info;\n  size_t size = sizeof(info);\n  if (sysctl(mib, miblen, &info, &size, NULL, 0)) {\n    return 0;\n  }\n  return static_cast<size_t>(KP_NLWP(info));\n}\n#elif GTEST_OS_OPENBSD\n\n// Returns the number of threads running in the process, or 0 to indicate that\n// we cannot detect it.\nsize_t GetThreadCount() {\n  int mib[] = {\n    CTL_KERN,\n    KERN_PROC,\n    KERN_PROC_PID | KERN_PROC_SHOW_THREADS,\n    getpid(),\n    sizeof(struct kinfo_proc),\n    0,\n  };\n  u_int miblen = sizeof(mib) / sizeof(mib[0]);\n\n  // get number of structs\n  size_t size;\n  if (sysctl(mib, miblen, NULL, &size, NULL, 0)) {\n    return 0;\n  }\n\n  mib[5] = static_cast<int>(size / static_cast<size_t>(mib[4]));\n\n  // populate array of structs\n  struct kinfo_proc info[mib[5]];\n  if (sysctl(mib, miblen, &info, &size, NULL, 0)) {\n    return 0;\n  }\n\n  // exclude empty members\n  size_t nthreads = 0;\n  for (size_t i = 0; i < size / static_cast<size_t>(mib[4]); i++) {\n    if (info[i].p_tid != -1)\n      nthreads++;\n  }\n  return nthreads;\n}\n\n#elif GTEST_OS_QNX\n\n// Returns the number of threads running in the process, or 0 to indicate that\n// we cannot detect it.\nsize_t GetThreadCount() {\n  const int fd = open(\"/proc/self/as\", O_RDONLY);\n  if (fd < 0) {\n    return 0;\n  }\n  procfs_info process_info;\n  const int status =\n      devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), nullptr);\n  close(fd);\n  if (status == EOK) {\n    return static_cast<size_t>(process_info.num_threads);\n  } else {\n    return 0;\n  }\n}\n\n#elif GTEST_OS_AIX\n\nsize_t GetThreadCount() {\n  struct procentry64 entry;\n  pid_t pid = getpid();\n  int status = getprocs64(&entry, sizeof(entry), nullptr, 0, &pid, 1);\n  if (status == 1) {\n    return entry.pi_thcount;\n  } else {\n    return 0;\n  }\n}\n\n#elif GTEST_OS_FUCHSIA\n\nsize_t GetThreadCount() {\n  int dummy_buffer;\n  size_t avail;\n  zx_status_t status = zx_object_get_info(\n      zx_process_self(),\n      ZX_INFO_PROCESS_THREADS,\n      &dummy_buffer,\n      0,\n      nullptr,\n      &avail);\n  if (status == ZX_OK) {\n    return avail;\n  } else {\n    return 0;\n  }\n}\n\n#else\n\nsize_t GetThreadCount() {\n  // There's no portable way to detect the number of threads, so we just\n  // return 0 to indicate that we cannot detect it.\n  return 0;\n}\n\n#endif  // GTEST_OS_LINUX\n\n#if GTEST_IS_THREADSAFE && GTEST_OS_WINDOWS\n\nvoid SleepMilliseconds(int n) {\n  ::Sleep(static_cast<DWORD>(n));\n}\n\nAutoHandle::AutoHandle()\n    : handle_(INVALID_HANDLE_VALUE) {}\n\nAutoHandle::AutoHandle(Handle handle)\n    : handle_(handle) {}\n\nAutoHandle::~AutoHandle() {\n  Reset();\n}\n\nAutoHandle::Handle AutoHandle::Get() const {\n  return handle_;\n}\n\nvoid AutoHandle::Reset() {\n  Reset(INVALID_HANDLE_VALUE);\n}\n\nvoid AutoHandle::Reset(HANDLE handle) {\n  // Resetting with the same handle we already own is invalid.\n  if (handle_ != handle) {\n    if (IsCloseable()) {\n      ::CloseHandle(handle_);\n    }\n    handle_ = handle;\n  } else {\n    GTEST_CHECK_(!IsCloseable())\n        << \"Resetting a valid handle to itself is likely a programmer error \"\n            \"and thus not allowed.\";\n  }\n}\n\nbool AutoHandle::IsCloseable() const {\n  // Different Windows APIs may use either of these values to represent an\n  // invalid handle.\n  return handle_ != nullptr && handle_ != INVALID_HANDLE_VALUE;\n}\n\nNotification::Notification()\n    : event_(::CreateEvent(nullptr,     // Default security attributes.\n                           TRUE,        // Do not reset automatically.\n                           FALSE,       // Initially unset.\n                           nullptr)) {  // Anonymous event.\n  GTEST_CHECK_(event_.Get() != nullptr);\n}\n\nvoid Notification::Notify() {\n  GTEST_CHECK_(::SetEvent(event_.Get()) != FALSE);\n}\n\nvoid Notification::WaitForNotification() {\n  GTEST_CHECK_(\n      ::WaitForSingleObject(event_.Get(), INFINITE) == WAIT_OBJECT_0);\n}\n\nMutex::Mutex()\n    : owner_thread_id_(0),\n      type_(kDynamic),\n      critical_section_init_phase_(0),\n      critical_section_(new CRITICAL_SECTION) {\n  ::InitializeCriticalSection(critical_section_);\n}\n\nMutex::~Mutex() {\n  // Static mutexes are leaked intentionally. It is not thread-safe to try\n  // to clean them up.\n  if (type_ == kDynamic) {\n    ::DeleteCriticalSection(critical_section_);\n    delete critical_section_;\n    critical_section_ = nullptr;\n  }\n}\n\nvoid Mutex::Lock() {\n  ThreadSafeLazyInit();\n  ::EnterCriticalSection(critical_section_);\n  owner_thread_id_ = ::GetCurrentThreadId();\n}\n\nvoid Mutex::Unlock() {\n  ThreadSafeLazyInit();\n  // We don't protect writing to owner_thread_id_ here, as it's the\n  // caller's responsibility to ensure that the current thread holds the\n  // mutex when this is called.\n  owner_thread_id_ = 0;\n  ::LeaveCriticalSection(critical_section_);\n}\n\n// Does nothing if the current thread holds the mutex. Otherwise, crashes\n// with high probability.\nvoid Mutex::AssertHeld() {\n  ThreadSafeLazyInit();\n  GTEST_CHECK_(owner_thread_id_ == ::GetCurrentThreadId())\n      << \"The current thread is not holding the mutex @\" << this;\n}\n\nnamespace {\n\n#ifdef _MSC_VER\n// Use the RAII idiom to flag mem allocs that are intentionally never\n// deallocated. The motivation is to silence the false positive mem leaks\n// that are reported by the debug version of MS's CRT which can only detect\n// if an alloc is missing a matching deallocation.\n// Example:\n//    MemoryIsNotDeallocated memory_is_not_deallocated;\n//    critical_section_ = new CRITICAL_SECTION;\n//\nclass MemoryIsNotDeallocated\n{\n public:\n  MemoryIsNotDeallocated() : old_crtdbg_flag_(0) {\n    old_crtdbg_flag_ = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);\n    // Set heap allocation block type to _IGNORE_BLOCK so that MS debug CRT\n    // doesn't report mem leak if there's no matching deallocation.\n    _CrtSetDbgFlag(old_crtdbg_flag_ & ~_CRTDBG_ALLOC_MEM_DF);\n  }\n\n  ~MemoryIsNotDeallocated() {\n    // Restore the original _CRTDBG_ALLOC_MEM_DF flag\n    _CrtSetDbgFlag(old_crtdbg_flag_);\n  }\n\n private:\n  int old_crtdbg_flag_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MemoryIsNotDeallocated);\n};\n#endif  // _MSC_VER\n\n}  // namespace\n\n// Initializes owner_thread_id_ and critical_section_ in static mutexes.\nvoid Mutex::ThreadSafeLazyInit() {\n  // Dynamic mutexes are initialized in the constructor.\n  if (type_ == kStatic) {\n    switch (\n        ::InterlockedCompareExchange(&critical_section_init_phase_, 1L, 0L)) {\n      case 0:\n        // If critical_section_init_phase_ was 0 before the exchange, we\n        // are the first to test it and need to perform the initialization.\n        owner_thread_id_ = 0;\n        {\n          // Use RAII to flag that following mem alloc is never deallocated.\n#ifdef _MSC_VER\n          MemoryIsNotDeallocated memory_is_not_deallocated;\n#endif  // _MSC_VER\n          critical_section_ = new CRITICAL_SECTION;\n        }\n        ::InitializeCriticalSection(critical_section_);\n        // Updates the critical_section_init_phase_ to 2 to signal\n        // initialization complete.\n        GTEST_CHECK_(::InterlockedCompareExchange(\n                          &critical_section_init_phase_, 2L, 1L) ==\n                      1L);\n        break;\n      case 1:\n        // Somebody else is already initializing the mutex; spin until they\n        // are done.\n        while (::InterlockedCompareExchange(&critical_section_init_phase_,\n                                            2L,\n                                            2L) != 2L) {\n          // Possibly yields the rest of the thread's time slice to other\n          // threads.\n          ::Sleep(0);\n        }\n        break;\n\n      case 2:\n        break;  // The mutex is already initialized and ready for use.\n\n      default:\n        GTEST_CHECK_(false)\n            << \"Unexpected value of critical_section_init_phase_ \"\n            << \"while initializing a static mutex.\";\n    }\n  }\n}\n\nnamespace {\n\nclass ThreadWithParamSupport : public ThreadWithParamBase {\n public:\n  static HANDLE CreateThread(Runnable* runnable,\n                             Notification* thread_can_start) {\n    ThreadMainParam* param = new ThreadMainParam(runnable, thread_can_start);\n    DWORD thread_id;\n    HANDLE thread_handle = ::CreateThread(\n        nullptr,  // Default security.\n        0,        // Default stack size.\n        &ThreadWithParamSupport::ThreadMain,\n        param,        // Parameter to ThreadMainStatic\n        0x0,          // Default creation flags.\n        &thread_id);  // Need a valid pointer for the call to work under Win98.\n    GTEST_CHECK_(thread_handle != nullptr)\n        << \"CreateThread failed with error \" << ::GetLastError() << \".\";\n    if (thread_handle == nullptr) {\n      delete param;\n    }\n    return thread_handle;\n  }\n\n private:\n  struct ThreadMainParam {\n    ThreadMainParam(Runnable* runnable, Notification* thread_can_start)\n        : runnable_(runnable),\n          thread_can_start_(thread_can_start) {\n    }\n    std::unique_ptr<Runnable> runnable_;\n    // Does not own.\n    Notification* thread_can_start_;\n  };\n\n  static DWORD WINAPI ThreadMain(void* ptr) {\n    // Transfers ownership.\n    std::unique_ptr<ThreadMainParam> param(static_cast<ThreadMainParam*>(ptr));\n    if (param->thread_can_start_ != nullptr)\n      param->thread_can_start_->WaitForNotification();\n    param->runnable_->Run();\n    return 0;\n  }\n\n  // Prohibit instantiation.\n  ThreadWithParamSupport();\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParamSupport);\n};\n\n}  // namespace\n\nThreadWithParamBase::ThreadWithParamBase(Runnable *runnable,\n                                         Notification* thread_can_start)\n      : thread_(ThreadWithParamSupport::CreateThread(runnable,\n                                                     thread_can_start)) {\n}\n\nThreadWithParamBase::~ThreadWithParamBase() {\n  Join();\n}\n\nvoid ThreadWithParamBase::Join() {\n  GTEST_CHECK_(::WaitForSingleObject(thread_.Get(), INFINITE) == WAIT_OBJECT_0)\n      << \"Failed to join the thread with error \" << ::GetLastError() << \".\";\n}\n\n// Maps a thread to a set of ThreadIdToThreadLocals that have values\n// instantiated on that thread and notifies them when the thread exits.  A\n// ThreadLocal instance is expected to persist until all threads it has\n// values on have terminated.\nclass ThreadLocalRegistryImpl {\n public:\n  // Registers thread_local_instance as having value on the current thread.\n  // Returns a value that can be used to identify the thread from other threads.\n  static ThreadLocalValueHolderBase* GetValueOnCurrentThread(\n      const ThreadLocalBase* thread_local_instance) {\n#ifdef _MSC_VER\n    MemoryIsNotDeallocated memory_is_not_deallocated;\n#endif  // _MSC_VER\n    DWORD current_thread = ::GetCurrentThreadId();\n    MutexLock lock(&mutex_);\n    ThreadIdToThreadLocals* const thread_to_thread_locals =\n        GetThreadLocalsMapLocked();\n    ThreadIdToThreadLocals::iterator thread_local_pos =\n        thread_to_thread_locals->find(current_thread);\n    if (thread_local_pos == thread_to_thread_locals->end()) {\n      thread_local_pos = thread_to_thread_locals->insert(\n          std::make_pair(current_thread, ThreadLocalValues())).first;\n      StartWatcherThreadFor(current_thread);\n    }\n    ThreadLocalValues& thread_local_values = thread_local_pos->second;\n    ThreadLocalValues::iterator value_pos =\n        thread_local_values.find(thread_local_instance);\n    if (value_pos == thread_local_values.end()) {\n      value_pos =\n          thread_local_values\n              .insert(std::make_pair(\n                  thread_local_instance,\n                  std::shared_ptr<ThreadLocalValueHolderBase>(\n                      thread_local_instance->NewValueForCurrentThread())))\n              .first;\n    }\n    return value_pos->second.get();\n  }\n\n  static void OnThreadLocalDestroyed(\n      const ThreadLocalBase* thread_local_instance) {\n    std::vector<std::shared_ptr<ThreadLocalValueHolderBase> > value_holders;\n    // Clean up the ThreadLocalValues data structure while holding the lock, but\n    // defer the destruction of the ThreadLocalValueHolderBases.\n    {\n      MutexLock lock(&mutex_);\n      ThreadIdToThreadLocals* const thread_to_thread_locals =\n          GetThreadLocalsMapLocked();\n      for (ThreadIdToThreadLocals::iterator it =\n          thread_to_thread_locals->begin();\n          it != thread_to_thread_locals->end();\n          ++it) {\n        ThreadLocalValues& thread_local_values = it->second;\n        ThreadLocalValues::iterator value_pos =\n            thread_local_values.find(thread_local_instance);\n        if (value_pos != thread_local_values.end()) {\n          value_holders.push_back(value_pos->second);\n          thread_local_values.erase(value_pos);\n          // This 'if' can only be successful at most once, so theoretically we\n          // could break out of the loop here, but we don't bother doing so.\n        }\n      }\n    }\n    // Outside the lock, let the destructor for 'value_holders' deallocate the\n    // ThreadLocalValueHolderBases.\n  }\n\n  static void OnThreadExit(DWORD thread_id) {\n    GTEST_CHECK_(thread_id != 0) << ::GetLastError();\n    std::vector<std::shared_ptr<ThreadLocalValueHolderBase> > value_holders;\n    // Clean up the ThreadIdToThreadLocals data structure while holding the\n    // lock, but defer the destruction of the ThreadLocalValueHolderBases.\n    {\n      MutexLock lock(&mutex_);\n      ThreadIdToThreadLocals* const thread_to_thread_locals =\n          GetThreadLocalsMapLocked();\n      ThreadIdToThreadLocals::iterator thread_local_pos =\n          thread_to_thread_locals->find(thread_id);\n      if (thread_local_pos != thread_to_thread_locals->end()) {\n        ThreadLocalValues& thread_local_values = thread_local_pos->second;\n        for (ThreadLocalValues::iterator value_pos =\n            thread_local_values.begin();\n            value_pos != thread_local_values.end();\n            ++value_pos) {\n          value_holders.push_back(value_pos->second);\n        }\n        thread_to_thread_locals->erase(thread_local_pos);\n      }\n    }\n    // Outside the lock, let the destructor for 'value_holders' deallocate the\n    // ThreadLocalValueHolderBases.\n  }\n\n private:\n  // In a particular thread, maps a ThreadLocal object to its value.\n  typedef std::map<const ThreadLocalBase*,\n                   std::shared_ptr<ThreadLocalValueHolderBase> >\n      ThreadLocalValues;\n  // Stores all ThreadIdToThreadLocals having values in a thread, indexed by\n  // thread's ID.\n  typedef std::map<DWORD, ThreadLocalValues> ThreadIdToThreadLocals;\n\n  // Holds the thread id and thread handle that we pass from\n  // StartWatcherThreadFor to WatcherThreadFunc.\n  typedef std::pair<DWORD, HANDLE> ThreadIdAndHandle;\n\n  static void StartWatcherThreadFor(DWORD thread_id) {\n    // The returned handle will be kept in thread_map and closed by\n    // watcher_thread in WatcherThreadFunc.\n    HANDLE thread = ::OpenThread(SYNCHRONIZE | THREAD_QUERY_INFORMATION,\n                                 FALSE,\n                                 thread_id);\n    GTEST_CHECK_(thread != nullptr);\n    // We need to pass a valid thread ID pointer into CreateThread for it\n    // to work correctly under Win98.\n    DWORD watcher_thread_id;\n    HANDLE watcher_thread = ::CreateThread(\n        nullptr,  // Default security.\n        0,        // Default stack size\n        &ThreadLocalRegistryImpl::WatcherThreadFunc,\n        reinterpret_cast<LPVOID>(new ThreadIdAndHandle(thread_id, thread)),\n        CREATE_SUSPENDED, &watcher_thread_id);\n    GTEST_CHECK_(watcher_thread != nullptr);\n    // Give the watcher thread the same priority as ours to avoid being\n    // blocked by it.\n    ::SetThreadPriority(watcher_thread,\n                        ::GetThreadPriority(::GetCurrentThread()));\n    ::ResumeThread(watcher_thread);\n    ::CloseHandle(watcher_thread);\n  }\n\n  // Monitors exit from a given thread and notifies those\n  // ThreadIdToThreadLocals about thread termination.\n  static DWORD WINAPI WatcherThreadFunc(LPVOID param) {\n    const ThreadIdAndHandle* tah =\n        reinterpret_cast<const ThreadIdAndHandle*>(param);\n    GTEST_CHECK_(\n        ::WaitForSingleObject(tah->second, INFINITE) == WAIT_OBJECT_0);\n    OnThreadExit(tah->first);\n    ::CloseHandle(tah->second);\n    delete tah;\n    return 0;\n  }\n\n  // Returns map of thread local instances.\n  static ThreadIdToThreadLocals* GetThreadLocalsMapLocked() {\n    mutex_.AssertHeld();\n#ifdef _MSC_VER\n    MemoryIsNotDeallocated memory_is_not_deallocated;\n#endif  // _MSC_VER\n    static ThreadIdToThreadLocals* map = new ThreadIdToThreadLocals();\n    return map;\n  }\n\n  // Protects access to GetThreadLocalsMapLocked() and its return value.\n  static Mutex mutex_;\n  // Protects access to GetThreadMapLocked() and its return value.\n  static Mutex thread_map_mutex_;\n};\n\nMutex ThreadLocalRegistryImpl::mutex_(Mutex::kStaticMutex);\nMutex ThreadLocalRegistryImpl::thread_map_mutex_(Mutex::kStaticMutex);\n\nThreadLocalValueHolderBase* ThreadLocalRegistry::GetValueOnCurrentThread(\n      const ThreadLocalBase* thread_local_instance) {\n  return ThreadLocalRegistryImpl::GetValueOnCurrentThread(\n      thread_local_instance);\n}\n\nvoid ThreadLocalRegistry::OnThreadLocalDestroyed(\n      const ThreadLocalBase* thread_local_instance) {\n  ThreadLocalRegistryImpl::OnThreadLocalDestroyed(thread_local_instance);\n}\n\n#endif  // GTEST_IS_THREADSAFE && GTEST_OS_WINDOWS\n\n#if GTEST_USES_POSIX_RE\n\n// Implements RE.  Currently only needed for death tests.\n\nRE::~RE() {\n  if (is_valid_) {\n    // regfree'ing an invalid regex might crash because the content\n    // of the regex is undefined. Since the regex's are essentially\n    // the same, one cannot be valid (or invalid) without the other\n    // being so too.\n    regfree(&partial_regex_);\n    regfree(&full_regex_);\n  }\n  free(const_cast<char*>(pattern_));\n}\n\n// Returns true if and only if regular expression re matches the entire str.\nbool RE::FullMatch(const char* str, const RE& re) {\n  if (!re.is_valid_) return false;\n\n  regmatch_t match;\n  return regexec(&re.full_regex_, str, 1, &match, 0) == 0;\n}\n\n// Returns true if and only if regular expression re matches a substring of\n// str (including str itself).\nbool RE::PartialMatch(const char* str, const RE& re) {\n  if (!re.is_valid_) return false;\n\n  regmatch_t match;\n  return regexec(&re.partial_regex_, str, 1, &match, 0) == 0;\n}\n\n// Initializes an RE from its string representation.\nvoid RE::Init(const char* regex) {\n  pattern_ = posix::StrDup(regex);\n\n  // Reserves enough bytes to hold the regular expression used for a\n  // full match.\n  const size_t full_regex_len = strlen(regex) + 10;\n  char* const full_pattern = new char[full_regex_len];\n\n  snprintf(full_pattern, full_regex_len, \"^(%s)$\", regex);\n  is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0;\n  // We want to call regcomp(&partial_regex_, ...) even if the\n  // previous expression returns false.  Otherwise partial_regex_ may\n  // not be properly initialized can may cause trouble when it's\n  // freed.\n  //\n  // Some implementation of POSIX regex (e.g. on at least some\n  // versions of Cygwin) doesn't accept the empty string as a valid\n  // regex.  We change it to an equivalent form \"()\" to be safe.\n  if (is_valid_) {\n    const char* const partial_regex = (*regex == '\\0') ? \"()\" : regex;\n    is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0;\n  }\n  EXPECT_TRUE(is_valid_)\n      << \"Regular expression \\\"\" << regex\n      << \"\\\" is not a valid POSIX Extended regular expression.\";\n\n  delete[] full_pattern;\n}\n\n#elif GTEST_USES_SIMPLE_RE\n\n// Returns true if and only if ch appears anywhere in str (excluding the\n// terminating '\\0' character).\nbool IsInSet(char ch, const char* str) {\n  return ch != '\\0' && strchr(str, ch) != nullptr;\n}\n\n// Returns true if and only if ch belongs to the given classification.\n// Unlike similar functions in <ctype.h>, these aren't affected by the\n// current locale.\nbool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }\nbool IsAsciiPunct(char ch) {\n  return IsInSet(ch, \"^-!\\\"#$%&'()*+,./:;<=>?@[\\\\]_`{|}~\");\n}\nbool IsRepeat(char ch) { return IsInSet(ch, \"?*+\"); }\nbool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, \" \\f\\n\\r\\t\\v\"); }\nbool IsAsciiWordChar(char ch) {\n  return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ||\n      ('0' <= ch && ch <= '9') || ch == '_';\n}\n\n// Returns true if and only if \"\\\\c\" is a supported escape sequence.\nbool IsValidEscape(char c) {\n  return (IsAsciiPunct(c) || IsInSet(c, \"dDfnrsStvwW\"));\n}\n\n// Returns true if and only if the given atom (specified by escaped and\n// pattern) matches ch.  The result is undefined if the atom is invalid.\nbool AtomMatchesChar(bool escaped, char pattern_char, char ch) {\n  if (escaped) {  // \"\\\\p\" where p is pattern_char.\n    switch (pattern_char) {\n      case 'd': return IsAsciiDigit(ch);\n      case 'D': return !IsAsciiDigit(ch);\n      case 'f': return ch == '\\f';\n      case 'n': return ch == '\\n';\n      case 'r': return ch == '\\r';\n      case 's': return IsAsciiWhiteSpace(ch);\n      case 'S': return !IsAsciiWhiteSpace(ch);\n      case 't': return ch == '\\t';\n      case 'v': return ch == '\\v';\n      case 'w': return IsAsciiWordChar(ch);\n      case 'W': return !IsAsciiWordChar(ch);\n    }\n    return IsAsciiPunct(pattern_char) && pattern_char == ch;\n  }\n\n  return (pattern_char == '.' && ch != '\\n') || pattern_char == ch;\n}\n\n// Helper function used by ValidateRegex() to format error messages.\nstatic std::string FormatRegexSyntaxError(const char* regex, int index) {\n  return (Message() << \"Syntax error at index \" << index\n          << \" in simple regular expression \\\"\" << regex << \"\\\": \").GetString();\n}\n\n// Generates non-fatal failures and returns false if regex is invalid;\n// otherwise returns true.\nbool ValidateRegex(const char* regex) {\n  if (regex == nullptr) {\n    ADD_FAILURE() << \"NULL is not a valid simple regular expression.\";\n    return false;\n  }\n\n  bool is_valid = true;\n\n  // True if and only if ?, *, or + can follow the previous atom.\n  bool prev_repeatable = false;\n  for (int i = 0; regex[i]; i++) {\n    if (regex[i] == '\\\\') {  // An escape sequence\n      i++;\n      if (regex[i] == '\\0') {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)\n                      << \"'\\\\' cannot appear at the end.\";\n        return false;\n      }\n\n      if (!IsValidEscape(regex[i])) {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)\n                      << \"invalid escape sequence \\\"\\\\\" << regex[i] << \"\\\".\";\n        is_valid = false;\n      }\n      prev_repeatable = true;\n    } else {  // Not an escape sequence.\n      const char ch = regex[i];\n\n      if (ch == '^' && i > 0) {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)\n                      << \"'^' can only appear at the beginning.\";\n        is_valid = false;\n      } else if (ch == '$' && regex[i + 1] != '\\0') {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)\n                      << \"'$' can only appear at the end.\";\n        is_valid = false;\n      } else if (IsInSet(ch, \"()[]{}|\")) {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)\n                      << \"'\" << ch << \"' is unsupported.\";\n        is_valid = false;\n      } else if (IsRepeat(ch) && !prev_repeatable) {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)\n                      << \"'\" << ch << \"' can only follow a repeatable token.\";\n        is_valid = false;\n      }\n\n      prev_repeatable = !IsInSet(ch, \"^$?*+\");\n    }\n  }\n\n  return is_valid;\n}\n\n// Matches a repeated regex atom followed by a valid simple regular\n// expression.  The regex atom is defined as c if escaped is false,\n// or \\c otherwise.  repeat is the repetition meta character (?, *,\n// or +).  The behavior is undefined if str contains too many\n// characters to be indexable by size_t, in which case the test will\n// probably time out anyway.  We are fine with this limitation as\n// std::string has it too.\nbool MatchRepetitionAndRegexAtHead(\n    bool escaped, char c, char repeat, const char* regex,\n    const char* str) {\n  const size_t min_count = (repeat == '+') ? 1 : 0;\n  const size_t max_count = (repeat == '?') ? 1 :\n      static_cast<size_t>(-1) - 1;\n  // We cannot call numeric_limits::max() as it conflicts with the\n  // max() macro on Windows.\n\n  for (size_t i = 0; i <= max_count; ++i) {\n    // We know that the atom matches each of the first i characters in str.\n    if (i >= min_count && MatchRegexAtHead(regex, str + i)) {\n      // We have enough matches at the head, and the tail matches too.\n      // Since we only care about *whether* the pattern matches str\n      // (as opposed to *how* it matches), there is no need to find a\n      // greedy match.\n      return true;\n    }\n    if (str[i] == '\\0' || !AtomMatchesChar(escaped, c, str[i]))\n      return false;\n  }\n  return false;\n}\n\n// Returns true if and only if regex matches a prefix of str. regex must\n// be a valid simple regular expression and not start with \"^\", or the\n// result is undefined.\nbool MatchRegexAtHead(const char* regex, const char* str) {\n  if (*regex == '\\0')  // An empty regex matches a prefix of anything.\n    return true;\n\n  // \"$\" only matches the end of a string.  Note that regex being\n  // valid guarantees that there's nothing after \"$\" in it.\n  if (*regex == '$')\n    return *str == '\\0';\n\n  // Is the first thing in regex an escape sequence?\n  const bool escaped = *regex == '\\\\';\n  if (escaped)\n    ++regex;\n  if (IsRepeat(regex[1])) {\n    // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so\n    // here's an indirect recursion.  It terminates as the regex gets\n    // shorter in each recursion.\n    return MatchRepetitionAndRegexAtHead(\n        escaped, regex[0], regex[1], regex + 2, str);\n  } else {\n    // regex isn't empty, isn't \"$\", and doesn't start with a\n    // repetition.  We match the first atom of regex with the first\n    // character of str and recurse.\n    return (*str != '\\0') && AtomMatchesChar(escaped, *regex, *str) &&\n        MatchRegexAtHead(regex + 1, str + 1);\n  }\n}\n\n// Returns true if and only if regex matches any substring of str.  regex must\n// be a valid simple regular expression, or the result is undefined.\n//\n// The algorithm is recursive, but the recursion depth doesn't exceed\n// the regex length, so we won't need to worry about running out of\n// stack space normally.  In rare cases the time complexity can be\n// exponential with respect to the regex length + the string length,\n// but usually it's must faster (often close to linear).\nbool MatchRegexAnywhere(const char* regex, const char* str) {\n  if (regex == nullptr || str == nullptr) return false;\n\n  if (*regex == '^')\n    return MatchRegexAtHead(regex + 1, str);\n\n  // A successful match can be anywhere in str.\n  do {\n    if (MatchRegexAtHead(regex, str))\n      return true;\n  } while (*str++ != '\\0');\n  return false;\n}\n\n// Implements the RE class.\n\nRE::~RE() {\n  free(const_cast<char*>(pattern_));\n  free(const_cast<char*>(full_pattern_));\n}\n\n// Returns true if and only if regular expression re matches the entire str.\nbool RE::FullMatch(const char* str, const RE& re) {\n  return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);\n}\n\n// Returns true if and only if regular expression re matches a substring of\n// str (including str itself).\nbool RE::PartialMatch(const char* str, const RE& re) {\n  return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);\n}\n\n// Initializes an RE from its string representation.\nvoid RE::Init(const char* regex) {\n  pattern_ = full_pattern_ = nullptr;\n  if (regex != nullptr) {\n    pattern_ = posix::StrDup(regex);\n  }\n\n  is_valid_ = ValidateRegex(regex);\n  if (!is_valid_) {\n    // No need to calculate the full pattern when the regex is invalid.\n    return;\n  }\n\n  const size_t len = strlen(regex);\n  // Reserves enough bytes to hold the regular expression used for a\n  // full match: we need space to prepend a '^', append a '$', and\n  // terminate the string with '\\0'.\n  char* buffer = static_cast<char*>(malloc(len + 3));\n  full_pattern_ = buffer;\n\n  if (*regex != '^')\n    *buffer++ = '^';  // Makes sure full_pattern_ starts with '^'.\n\n  // We don't use snprintf or strncpy, as they trigger a warning when\n  // compiled with VC++ 8.0.\n  memcpy(buffer, regex, len);\n  buffer += len;\n\n  if (len == 0 || regex[len - 1] != '$')\n    *buffer++ = '$';  // Makes sure full_pattern_ ends with '$'.\n\n  *buffer = '\\0';\n}\n\n#endif  // GTEST_USES_POSIX_RE\n\nconst char kUnknownFile[] = \"unknown file\";\n\n// Formats a source file path and a line number as they would appear\n// in an error message from the compiler used to compile this code.\nGTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {\n  const std::string file_name(file == nullptr ? kUnknownFile : file);\n\n  if (line < 0) {\n    return file_name + \":\";\n  }\n#ifdef _MSC_VER\n  return file_name + \"(\" + StreamableToString(line) + \"):\";\n#else\n  return file_name + \":\" + StreamableToString(line) + \":\";\n#endif  // _MSC_VER\n}\n\n// Formats a file location for compiler-independent XML output.\n// Although this function is not platform dependent, we put it next to\n// FormatFileLocation in order to contrast the two functions.\n// Note that FormatCompilerIndependentFileLocation() does NOT append colon\n// to the file location it produces, unlike FormatFileLocation().\nGTEST_API_ ::std::string FormatCompilerIndependentFileLocation(\n    const char* file, int line) {\n  const std::string file_name(file == nullptr ? kUnknownFile : file);\n\n  if (line < 0)\n    return file_name;\n  else\n    return file_name + \":\" + StreamableToString(line);\n}\n\nGTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line)\n    : severity_(severity) {\n  const char* const marker =\n      severity == GTEST_INFO ?    \"[  INFO ]\" :\n      severity == GTEST_WARNING ? \"[WARNING]\" :\n      severity == GTEST_ERROR ?   \"[ ERROR ]\" : \"[ FATAL ]\";\n  GetStream() << ::std::endl << marker << \" \"\n              << FormatFileLocation(file, line).c_str() << \": \";\n}\n\n// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.\nGTestLog::~GTestLog() {\n  GetStream() << ::std::endl;\n  if (severity_ == GTEST_FATAL) {\n    fflush(stderr);\n    posix::Abort();\n  }\n}\n\n// Disable Microsoft deprecation warnings for POSIX functions called from\n// this class (creat, dup, dup2, and close)\nGTEST_DISABLE_MSC_DEPRECATED_PUSH_()\n\n#if GTEST_HAS_STREAM_REDIRECTION\n\n// Object that captures an output stream (stdout/stderr).\nclass CapturedStream {\n public:\n  // The ctor redirects the stream to a temporary file.\n  explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {\n# if GTEST_OS_WINDOWS\n    char temp_dir_path[MAX_PATH + 1] = { '\\0' };  // NOLINT\n    char temp_file_path[MAX_PATH + 1] = { '\\0' };  // NOLINT\n\n    ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path);\n    const UINT success = ::GetTempFileNameA(temp_dir_path,\n                                            \"gtest_redir\",\n                                            0,  // Generate unique file name.\n                                            temp_file_path);\n    GTEST_CHECK_(success != 0)\n        << \"Unable to create a temporary file in \" << temp_dir_path;\n    const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);\n    GTEST_CHECK_(captured_fd != -1) << \"Unable to open temporary file \"\n                                    << temp_file_path;\n    filename_ = temp_file_path;\n# else\n    // There's no guarantee that a test has write access to the current\n    // directory, so we create the temporary file in the /tmp directory\n    // instead. We use /tmp on most systems, and /sdcard on Android.\n    // That's because Android doesn't have /tmp.\n#  if GTEST_OS_LINUX_ANDROID\n    // Note: Android applications are expected to call the framework's\n    // Context.getExternalStorageDirectory() method through JNI to get\n    // the location of the world-writable SD Card directory. However,\n    // this requires a Context handle, which cannot be retrieved\n    // globally from native code. Doing so also precludes running the\n    // code as part of a regular standalone executable, which doesn't\n    // run in a Dalvik process (e.g. when running it through 'adb shell').\n    //\n    // The location /data/local/tmp is directly accessible from native code.\n    // '/sdcard' and other variants cannot be relied on, as they are not\n    // guaranteed to be mounted, or may have a delay in mounting.\n    char name_template[] = \"/data/local/tmp/gtest_captured_stream.XXXXXX\";\n#  else\n    char name_template[] = \"/tmp/captured_stream.XXXXXX\";\n#  endif  // GTEST_OS_LINUX_ANDROID\n    const int captured_fd = mkstemp(name_template);\n    if (captured_fd == -1) {\n      GTEST_LOG_(WARNING)\n          << \"Failed to create tmp file \" << name_template\n          << \" for test; does the test have access to the /tmp directory?\";\n    }\n    filename_ = name_template;\n# endif  // GTEST_OS_WINDOWS\n    fflush(nullptr);\n    dup2(captured_fd, fd_);\n    close(captured_fd);\n  }\n\n  ~CapturedStream() {\n    remove(filename_.c_str());\n  }\n\n  std::string GetCapturedString() {\n    if (uncaptured_fd_ != -1) {\n      // Restores the original stream.\n      fflush(nullptr);\n      dup2(uncaptured_fd_, fd_);\n      close(uncaptured_fd_);\n      uncaptured_fd_ = -1;\n    }\n\n    FILE* const file = posix::FOpen(filename_.c_str(), \"r\");\n    if (file == nullptr) {\n      GTEST_LOG_(FATAL) << \"Failed to open tmp file \" << filename_\n                        << \" for capturing stream.\";\n    }\n    const std::string content = ReadEntireFile(file);\n    posix::FClose(file);\n    return content;\n  }\n\n private:\n  const int fd_;  // A stream to capture.\n  int uncaptured_fd_;\n  // Name of the temporary file holding the stderr output.\n  ::std::string filename_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream);\n};\n\nGTEST_DISABLE_MSC_DEPRECATED_POP_()\n\nstatic CapturedStream* g_captured_stderr = nullptr;\nstatic CapturedStream* g_captured_stdout = nullptr;\n\n// Starts capturing an output stream (stdout/stderr).\nstatic void CaptureStream(int fd, const char* stream_name,\n                          CapturedStream** stream) {\n  if (*stream != nullptr) {\n    GTEST_LOG_(FATAL) << \"Only one \" << stream_name\n                      << \" capturer can exist at a time.\";\n  }\n  *stream = new CapturedStream(fd);\n}\n\n// Stops capturing the output stream and returns the captured string.\nstatic std::string GetCapturedStream(CapturedStream** captured_stream) {\n  const std::string content = (*captured_stream)->GetCapturedString();\n\n  delete *captured_stream;\n  *captured_stream = nullptr;\n\n  return content;\n}\n\n// Starts capturing stdout.\nvoid CaptureStdout() {\n  CaptureStream(kStdOutFileno, \"stdout\", &g_captured_stdout);\n}\n\n// Starts capturing stderr.\nvoid CaptureStderr() {\n  CaptureStream(kStdErrFileno, \"stderr\", &g_captured_stderr);\n}\n\n// Stops capturing stdout and returns the captured string.\nstd::string GetCapturedStdout() {\n  return GetCapturedStream(&g_captured_stdout);\n}\n\n// Stops capturing stderr and returns the captured string.\nstd::string GetCapturedStderr() {\n  return GetCapturedStream(&g_captured_stderr);\n}\n\n#endif  // GTEST_HAS_STREAM_REDIRECTION\n\n\n\n\n\nsize_t GetFileSize(FILE* file) {\n  fseek(file, 0, SEEK_END);\n  return static_cast<size_t>(ftell(file));\n}\n\nstd::string ReadEntireFile(FILE* file) {\n  const size_t file_size = GetFileSize(file);\n  char* const buffer = new char[file_size];\n\n  size_t bytes_last_read = 0;  // # of bytes read in the last fread()\n  size_t bytes_read = 0;       // # of bytes read so far\n\n  fseek(file, 0, SEEK_SET);\n\n  // Keeps reading the file until we cannot read further or the\n  // pre-determined file size is reached.\n  do {\n    bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);\n    bytes_read += bytes_last_read;\n  } while (bytes_last_read > 0 && bytes_read < file_size);\n\n  const std::string content(buffer, bytes_read);\n  delete[] buffer;\n\n  return content;\n}\n\n#if GTEST_HAS_DEATH_TEST\nstatic const std::vector<std::string>* g_injected_test_argvs =\n    nullptr;  // Owned.\n\nstd::vector<std::string> GetInjectableArgvs() {\n  if (g_injected_test_argvs != nullptr) {\n    return *g_injected_test_argvs;\n  }\n  return GetArgvs();\n}\n\nvoid SetInjectableArgvs(const std::vector<std::string>* new_argvs) {\n  if (g_injected_test_argvs != new_argvs) delete g_injected_test_argvs;\n  g_injected_test_argvs = new_argvs;\n}\n\nvoid SetInjectableArgvs(const std::vector<std::string>& new_argvs) {\n  SetInjectableArgvs(\n      new std::vector<std::string>(new_argvs.begin(), new_argvs.end()));\n}\n\nvoid ClearInjectableArgvs() {\n  delete g_injected_test_argvs;\n  g_injected_test_argvs = nullptr;\n}\n#endif  // GTEST_HAS_DEATH_TEST\n\n#if GTEST_OS_WINDOWS_MOBILE\nnamespace posix {\nvoid Abort() {\n  DebugBreak();\n  TerminateProcess(GetCurrentProcess(), 1);\n}\n}  // namespace posix\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n// Returns the name of the environment variable corresponding to the\n// given flag.  For example, FlagToEnvVar(\"foo\") will return\n// \"GTEST_FOO\" in the open-source version.\nstatic std::string FlagToEnvVar(const char* flag) {\n  const std::string full_flag =\n      (Message() << GTEST_FLAG_PREFIX_ << flag).GetString();\n\n  Message env_var;\n  for (size_t i = 0; i != full_flag.length(); i++) {\n    env_var << ToUpper(full_flag.c_str()[i]);\n  }\n\n  return env_var.GetString();\n}\n\n// Parses 'str' for a 32-bit signed integer.  If successful, writes\n// the result to *value and returns true; otherwise leaves *value\n// unchanged and returns false.\nbool ParseInt32(const Message& src_text, const char* str, int32_t* value) {\n  // Parses the environment variable as a decimal integer.\n  char* end = nullptr;\n  const long long_value = strtol(str, &end, 10);  // NOLINT\n\n  // Has strtol() consumed all characters in the string?\n  if (*end != '\\0') {\n    // No - an invalid character was encountered.\n    Message msg;\n    msg << \"WARNING: \" << src_text\n        << \" is expected to be a 32-bit integer, but actually\"\n        << \" has value \\\"\" << str << \"\\\".\\n\";\n    printf(\"%s\", msg.GetString().c_str());\n    fflush(stdout);\n    return false;\n  }\n\n  // Is the parsed value in the range of an int32_t?\n  const auto result = static_cast<int32_t>(long_value);\n  if (long_value == LONG_MAX || long_value == LONG_MIN ||\n      // The parsed value overflows as a long.  (strtol() returns\n      // LONG_MAX or LONG_MIN when the input overflows.)\n      result != long_value\n      // The parsed value overflows as an int32_t.\n      ) {\n    Message msg;\n    msg << \"WARNING: \" << src_text\n        << \" is expected to be a 32-bit integer, but actually\"\n        << \" has value \" << str << \", which overflows.\\n\";\n    printf(\"%s\", msg.GetString().c_str());\n    fflush(stdout);\n    return false;\n  }\n\n  *value = result;\n  return true;\n}\n\n// Reads and returns the Boolean environment variable corresponding to\n// the given flag; if it's not set, returns default_value.\n//\n// The value is considered true if and only if it's not \"0\".\nbool BoolFromGTestEnv(const char* flag, bool default_value) {\n#if defined(GTEST_GET_BOOL_FROM_ENV_)\n  return GTEST_GET_BOOL_FROM_ENV_(flag, default_value);\n#else\n  const std::string env_var = FlagToEnvVar(flag);\n  const char* const string_value = posix::GetEnv(env_var.c_str());\n  return string_value == nullptr ? default_value\n                                 : strcmp(string_value, \"0\") != 0;\n#endif  // defined(GTEST_GET_BOOL_FROM_ENV_)\n}\n\n// Reads and returns a 32-bit integer stored in the environment\n// variable corresponding to the given flag; if it isn't set or\n// doesn't represent a valid 32-bit integer, returns default_value.\nint32_t Int32FromGTestEnv(const char* flag, int32_t default_value) {\n#if defined(GTEST_GET_INT32_FROM_ENV_)\n  return GTEST_GET_INT32_FROM_ENV_(flag, default_value);\n#else\n  const std::string env_var = FlagToEnvVar(flag);\n  const char* const string_value = posix::GetEnv(env_var.c_str());\n  if (string_value == nullptr) {\n    // The environment variable is not set.\n    return default_value;\n  }\n\n  int32_t result = default_value;\n  if (!ParseInt32(Message() << \"Environment variable \" << env_var,\n                  string_value, &result)) {\n    printf(\"The default value %s is used.\\n\",\n           (Message() << default_value).GetString().c_str());\n    fflush(stdout);\n    return default_value;\n  }\n\n  return result;\n#endif  // defined(GTEST_GET_INT32_FROM_ENV_)\n}\n\n// As a special case for the 'output' flag, if GTEST_OUTPUT is not\n// set, we look for XML_OUTPUT_FILE, which is set by the Bazel build\n// system.  The value of XML_OUTPUT_FILE is a filename without the\n// \"xml:\" prefix of GTEST_OUTPUT.\n// Note that this is meant to be called at the call site so it does\n// not check that the flag is 'output'\n// In essence this checks an env variable called XML_OUTPUT_FILE\n// and if it is set we prepend \"xml:\" to its value, if it not set we return \"\"\nstd::string OutputFlagAlsoCheckEnvVar(){\n  std::string default_value_for_output_flag = \"\";\n  const char* xml_output_file_env = posix::GetEnv(\"XML_OUTPUT_FILE\");\n  if (nullptr != xml_output_file_env) {\n    default_value_for_output_flag = std::string(\"xml:\") + xml_output_file_env;\n  }\n  return default_value_for_output_flag;\n}\n\n// Reads and returns the string environment variable corresponding to\n// the given flag; if it's not set, returns default_value.\nconst char* StringFromGTestEnv(const char* flag, const char* default_value) {\n#if defined(GTEST_GET_STRING_FROM_ENV_)\n  return GTEST_GET_STRING_FROM_ENV_(flag, default_value);\n#else\n  const std::string env_var = FlagToEnvVar(flag);\n  const char* const value = posix::GetEnv(env_var.c_str());\n  return value == nullptr ? default_value : value;\n#endif  // defined(GTEST_GET_STRING_FROM_ENV_)\n}\n\n}  // namespace internal\n}  // namespace testing\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Test - The Google C++ Testing and Mocking Framework\n//\n// This file implements a universal value printer that can print a\n// value of any type T:\n//\n//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);\n//\n// It uses the << operator when possible, and prints the bytes in the\n// object otherwise.  A user can override its behavior for a class\n// type Foo by defining either operator<<(::std::ostream&, const Foo&)\n// or void PrintTo(const Foo&, ::std::ostream*) in the namespace that\n// defines Foo.\n\n\n#include <stdio.h>\n\n#include <cctype>\n#include <cstdint>\n#include <cwchar>\n#include <ostream>  // NOLINT\n#include <string>\n#include <type_traits>\n\n\nnamespace testing {\n\nnamespace {\n\nusing ::std::ostream;\n\n// Prints a segment of bytes in the given object.\nGTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_\nGTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_\nGTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_\nGTEST_ATTRIBUTE_NO_SANITIZE_THREAD_\nvoid PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,\n                                size_t count, ostream* os) {\n  char text[5] = \"\";\n  for (size_t i = 0; i != count; i++) {\n    const size_t j = start + i;\n    if (i != 0) {\n      // Organizes the bytes into groups of 2 for easy parsing by\n      // human.\n      if ((j % 2) == 0)\n        *os << ' ';\n      else\n        *os << '-';\n    }\n    GTEST_SNPRINTF_(text, sizeof(text), \"%02X\", obj_bytes[j]);\n    *os << text;\n  }\n}\n\n// Prints the bytes in the given value to the given ostream.\nvoid PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,\n                              ostream* os) {\n  // Tells the user how big the object is.\n  *os << count << \"-byte object <\";\n\n  const size_t kThreshold = 132;\n  const size_t kChunkSize = 64;\n  // If the object size is bigger than kThreshold, we'll have to omit\n  // some details by printing only the first and the last kChunkSize\n  // bytes.\n  if (count < kThreshold) {\n    PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);\n  } else {\n    PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os);\n    *os << \" ... \";\n    // Rounds up to 2-byte boundary.\n    const size_t resume_pos = (count - kChunkSize + 1)/2*2;\n    PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os);\n  }\n  *os << \">\";\n}\n\n// Helpers for widening a character to char32_t. Since the standard does not\n// specify if char / wchar_t is signed or unsigned, it is important to first\n// convert it to the unsigned type of the same width before widening it to\n// char32_t.\ntemplate <typename CharType>\nchar32_t ToChar32(CharType in) {\n  return static_cast<char32_t>(\n      static_cast<typename std::make_unsigned<CharType>::type>(in));\n}\n\n}  // namespace\n\nnamespace internal {\n\n// Delegates to PrintBytesInObjectToImpl() to print the bytes in the\n// given object.  The delegation simplifies the implementation, which\n// uses the << operator and thus is easier done outside of the\n// ::testing::internal namespace, which contains a << operator that\n// sometimes conflicts with the one in STL.\nvoid PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count,\n                          ostream* os) {\n  PrintBytesInObjectToImpl(obj_bytes, count, os);\n}\n\n// Depending on the value of a char (or wchar_t), we print it in one\n// of three formats:\n//   - as is if it's a printable ASCII (e.g. 'a', '2', ' '),\n//   - as a hexadecimal escape sequence (e.g. '\\x7F'), or\n//   - as a special escape sequence (e.g. '\\r', '\\n').\nenum CharFormat {\n  kAsIs,\n  kHexEscape,\n  kSpecialEscape\n};\n\n// Returns true if c is a printable ASCII character.  We test the\n// value of c directly instead of calling isprint(), which is buggy on\n// Windows Mobile.\ninline bool IsPrintableAscii(char32_t c) { return 0x20 <= c && c <= 0x7E; }\n\n// Prints c (of type char, char8_t, char16_t, char32_t, or wchar_t) as a\n// character literal without the quotes, escaping it when necessary; returns how\n// c was formatted.\ntemplate <typename Char>\nstatic CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {\n  const char32_t u_c = ToChar32(c);\n  switch (u_c) {\n    case L'\\0':\n      *os << \"\\\\0\";\n      break;\n    case L'\\'':\n      *os << \"\\\\'\";\n      break;\n    case L'\\\\':\n      *os << \"\\\\\\\\\";\n      break;\n    case L'\\a':\n      *os << \"\\\\a\";\n      break;\n    case L'\\b':\n      *os << \"\\\\b\";\n      break;\n    case L'\\f':\n      *os << \"\\\\f\";\n      break;\n    case L'\\n':\n      *os << \"\\\\n\";\n      break;\n    case L'\\r':\n      *os << \"\\\\r\";\n      break;\n    case L'\\t':\n      *os << \"\\\\t\";\n      break;\n    case L'\\v':\n      *os << \"\\\\v\";\n      break;\n    default:\n      if (IsPrintableAscii(u_c)) {\n        *os << static_cast<char>(c);\n        return kAsIs;\n      } else {\n        ostream::fmtflags flags = os->flags();\n        *os << \"\\\\x\" << std::hex << std::uppercase << static_cast<int>(u_c);\n        os->flags(flags);\n        return kHexEscape;\n      }\n  }\n  return kSpecialEscape;\n}\n\n// Prints a char32_t c as if it's part of a string literal, escaping it when\n// necessary; returns how c was formatted.\nstatic CharFormat PrintAsStringLiteralTo(char32_t c, ostream* os) {\n  switch (c) {\n    case L'\\'':\n      *os << \"'\";\n      return kAsIs;\n    case L'\"':\n      *os << \"\\\\\\\"\";\n      return kSpecialEscape;\n    default:\n      return PrintAsCharLiteralTo(c, os);\n  }\n}\n\nstatic const char* GetCharWidthPrefix(char) {\n  return \"\";\n}\n\nstatic const char* GetCharWidthPrefix(signed char) {\n  return \"\";\n}\n\nstatic const char* GetCharWidthPrefix(unsigned char) {\n  return \"\";\n}\n\n#ifdef __cpp_char8_t\nstatic const char* GetCharWidthPrefix(char8_t) {\n  return \"u8\";\n}\n#endif\n\nstatic const char* GetCharWidthPrefix(char16_t) {\n  return \"u\";\n}\n\nstatic const char* GetCharWidthPrefix(char32_t) {\n  return \"U\";\n}\n\nstatic const char* GetCharWidthPrefix(wchar_t) {\n  return \"L\";\n}\n\n// Prints a char c as if it's part of a string literal, escaping it when\n// necessary; returns how c was formatted.\nstatic CharFormat PrintAsStringLiteralTo(char c, ostream* os) {\n  return PrintAsStringLiteralTo(ToChar32(c), os);\n}\n\n#ifdef __cpp_char8_t\nstatic CharFormat PrintAsStringLiteralTo(char8_t c, ostream* os) {\n  return PrintAsStringLiteralTo(ToChar32(c), os);\n}\n#endif\n\nstatic CharFormat PrintAsStringLiteralTo(char16_t c, ostream* os) {\n  return PrintAsStringLiteralTo(ToChar32(c), os);\n}\n\nstatic CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) {\n  return PrintAsStringLiteralTo(ToChar32(c), os);\n}\n\n// Prints a character c (of type char, char8_t, char16_t, char32_t, or wchar_t)\n// and its code. '\\0' is printed as \"'\\\\0'\", other unprintable characters are\n// also properly escaped using the standard C++ escape sequence.\ntemplate <typename Char>\nvoid PrintCharAndCodeTo(Char c, ostream* os) {\n  // First, print c as a literal in the most readable form we can find.\n  *os << GetCharWidthPrefix(c) << \"'\";\n  const CharFormat format = PrintAsCharLiteralTo(c, os);\n  *os << \"'\";\n\n  // To aid user debugging, we also print c's code in decimal, unless\n  // it's 0 (in which case c was printed as '\\\\0', making the code\n  // obvious).\n  if (c == 0)\n    return;\n  *os << \" (\" << static_cast<int>(c);\n\n  // For more convenience, we print c's code again in hexadecimal,\n  // unless c was already printed in the form '\\x##' or the code is in\n  // [1, 9].\n  if (format == kHexEscape || (1 <= c && c <= 9)) {\n    // Do nothing.\n  } else {\n    *os << \", 0x\" << String::FormatHexInt(static_cast<int>(c));\n  }\n  *os << \")\";\n}\n\nvoid PrintTo(unsigned char c, ::std::ostream* os) { PrintCharAndCodeTo(c, os); }\nvoid PrintTo(signed char c, ::std::ostream* os) { PrintCharAndCodeTo(c, os); }\n\n// Prints a wchar_t as a symbol if it is printable or as its internal\n// code otherwise and also as its code.  L'\\0' is printed as \"L'\\\\0'\".\nvoid PrintTo(wchar_t wc, ostream* os) { PrintCharAndCodeTo(wc, os); }\n\n// TODO(dcheng): Consider making this delegate to PrintCharAndCodeTo() as well.\nvoid PrintTo(char32_t c, ::std::ostream* os) {\n  *os << std::hex << \"U+\" << std::uppercase << std::setfill('0') << std::setw(4)\n      << static_cast<uint32_t>(c);\n}\n\n// Prints the given array of characters to the ostream.  CharType must be either\n// char, char8_t, char16_t, char32_t, or wchar_t.\n// The array starts at begin, the length is len, it may include '\\0' characters\n// and may not be NUL-terminated.\ntemplate <typename CharType>\nGTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_\nGTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_\nGTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_\nGTEST_ATTRIBUTE_NO_SANITIZE_THREAD_\nstatic CharFormat PrintCharsAsStringTo(\n    const CharType* begin, size_t len, ostream* os) {\n  const char* const quote_prefix = GetCharWidthPrefix(*begin);\n  *os << quote_prefix << \"\\\"\";\n  bool is_previous_hex = false;\n  CharFormat print_format = kAsIs;\n  for (size_t index = 0; index < len; ++index) {\n    const CharType cur = begin[index];\n    if (is_previous_hex && IsXDigit(cur)) {\n      // Previous character is of '\\x..' form and this character can be\n      // interpreted as another hexadecimal digit in its number. Break string to\n      // disambiguate.\n      *os << \"\\\" \" << quote_prefix << \"\\\"\";\n    }\n    is_previous_hex = PrintAsStringLiteralTo(cur, os) == kHexEscape;\n    // Remember if any characters required hex escaping.\n    if (is_previous_hex) {\n      print_format = kHexEscape;\n    }\n  }\n  *os << \"\\\"\";\n  return print_format;\n}\n\n// Prints a (const) char/wchar_t array of 'len' elements, starting at address\n// 'begin'.  CharType must be either char or wchar_t.\ntemplate <typename CharType>\nGTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_\nGTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_\nGTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_\nGTEST_ATTRIBUTE_NO_SANITIZE_THREAD_\nstatic void UniversalPrintCharArray(\n    const CharType* begin, size_t len, ostream* os) {\n  // The code\n  //   const char kFoo[] = \"foo\";\n  // generates an array of 4, not 3, elements, with the last one being '\\0'.\n  //\n  // Therefore when printing a char array, we don't print the last element if\n  // it's '\\0', such that the output matches the string literal as it's\n  // written in the source code.\n  if (len > 0 && begin[len - 1] == '\\0') {\n    PrintCharsAsStringTo(begin, len - 1, os);\n    return;\n  }\n\n  // If, however, the last element in the array is not '\\0', e.g.\n  //    const char kFoo[] = { 'f', 'o', 'o' };\n  // we must print the entire array.  We also print a message to indicate\n  // that the array is not NUL-terminated.\n  PrintCharsAsStringTo(begin, len, os);\n  *os << \" (no terminating NUL)\";\n}\n\n// Prints a (const) char array of 'len' elements, starting at address 'begin'.\nvoid UniversalPrintArray(const char* begin, size_t len, ostream* os) {\n  UniversalPrintCharArray(begin, len, os);\n}\n\n#ifdef __cpp_char8_t\n// Prints a (const) char8_t array of 'len' elements, starting at address\n// 'begin'.\nvoid UniversalPrintArray(const char8_t* begin, size_t len, ostream* os) {\n  UniversalPrintCharArray(begin, len, os);\n}\n#endif\n\n// Prints a (const) char16_t array of 'len' elements, starting at address\n// 'begin'.\nvoid UniversalPrintArray(const char16_t* begin, size_t len, ostream* os) {\n  UniversalPrintCharArray(begin, len, os);\n}\n\n// Prints a (const) char32_t array of 'len' elements, starting at address\n// 'begin'.\nvoid UniversalPrintArray(const char32_t* begin, size_t len, ostream* os) {\n  UniversalPrintCharArray(begin, len, os);\n}\n\n// Prints a (const) wchar_t array of 'len' elements, starting at address\n// 'begin'.\nvoid UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) {\n  UniversalPrintCharArray(begin, len, os);\n}\n\nnamespace {\n\n// Prints a null-terminated C-style string to the ostream.\ntemplate <typename Char>\nvoid PrintCStringTo(const Char* s, ostream* os) {\n  if (s == nullptr) {\n    *os << \"NULL\";\n  } else {\n    *os << ImplicitCast_<const void*>(s) << \" pointing to \";\n    PrintCharsAsStringTo(s, std::char_traits<Char>::length(s), os);\n  }\n}\n\n}  // anonymous namespace\n\nvoid PrintTo(const char* s, ostream* os) { PrintCStringTo(s, os); }\n\n#ifdef __cpp_char8_t\nvoid PrintTo(const char8_t* s, ostream* os) { PrintCStringTo(s, os); }\n#endif\n\nvoid PrintTo(const char16_t* s, ostream* os) { PrintCStringTo(s, os); }\n\nvoid PrintTo(const char32_t* s, ostream* os) { PrintCStringTo(s, os); }\n\n// MSVC compiler can be configured to define whar_t as a typedef\n// of unsigned short. Defining an overload for const wchar_t* in that case\n// would cause pointers to unsigned shorts be printed as wide strings,\n// possibly accessing more memory than intended and causing invalid\n// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when\n// wchar_t is implemented as a native type.\n#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)\n// Prints the given wide C string to the ostream.\nvoid PrintTo(const wchar_t* s, ostream* os) { PrintCStringTo(s, os); }\n#endif  // wchar_t is native\n\nnamespace {\n\nbool ContainsUnprintableControlCodes(const char* str, size_t length) {\n  const unsigned char *s = reinterpret_cast<const unsigned char *>(str);\n\n  for (size_t i = 0; i < length; i++) {\n    unsigned char ch = *s++;\n    if (std::iscntrl(ch)) {\n        switch (ch) {\n        case '\\t':\n        case '\\n':\n        case '\\r':\n          break;\n        default:\n          return true;\n        }\n      }\n  }\n  return false;\n}\n\nbool IsUTF8TrailByte(unsigned char t) { return 0x80 <= t && t<= 0xbf; }\n\nbool IsValidUTF8(const char* str, size_t length) {\n  const unsigned char *s = reinterpret_cast<const unsigned char *>(str);\n\n  for (size_t i = 0; i < length;) {\n    unsigned char lead = s[i++];\n\n    if (lead <= 0x7f) {\n      continue;  // single-byte character (ASCII) 0..7F\n    }\n    if (lead < 0xc2) {\n      return false;  // trail byte or non-shortest form\n    } else if (lead <= 0xdf && (i + 1) <= length && IsUTF8TrailByte(s[i])) {\n      ++i;  // 2-byte character\n    } else if (0xe0 <= lead && lead <= 0xef && (i + 2) <= length &&\n               IsUTF8TrailByte(s[i]) &&\n               IsUTF8TrailByte(s[i + 1]) &&\n               // check for non-shortest form and surrogate\n               (lead != 0xe0 || s[i] >= 0xa0) &&\n               (lead != 0xed || s[i] < 0xa0)) {\n      i += 2;  // 3-byte character\n    } else if (0xf0 <= lead && lead <= 0xf4 && (i + 3) <= length &&\n               IsUTF8TrailByte(s[i]) &&\n               IsUTF8TrailByte(s[i + 1]) &&\n               IsUTF8TrailByte(s[i + 2]) &&\n               // check for non-shortest form\n               (lead != 0xf0 || s[i] >= 0x90) &&\n               (lead != 0xf4 || s[i] < 0x90)) {\n      i += 3;  // 4-byte character\n    } else {\n      return false;\n    }\n  }\n  return true;\n}\n\nvoid ConditionalPrintAsText(const char* str, size_t length, ostream* os) {\n  if (!ContainsUnprintableControlCodes(str, length) &&\n      IsValidUTF8(str, length)) {\n    *os << \"\\n    As Text: \\\"\" << str << \"\\\"\";\n  }\n}\n\n}  // anonymous namespace\n\nvoid PrintStringTo(const ::std::string& s, ostream* os) {\n  if (PrintCharsAsStringTo(s.data(), s.size(), os) == kHexEscape) {\n    if (GTEST_FLAG(print_utf8)) {\n      ConditionalPrintAsText(s.data(), s.size(), os);\n    }\n  }\n}\n\n#ifdef __cpp_char8_t\nvoid PrintU8StringTo(const ::std::u8string& s, ostream* os) {\n  PrintCharsAsStringTo(s.data(), s.size(), os);\n}\n#endif\n\nvoid PrintU16StringTo(const ::std::u16string& s, ostream* os) {\n  PrintCharsAsStringTo(s.data(), s.size(), os);\n}\n\nvoid PrintU32StringTo(const ::std::u32string& s, ostream* os) {\n  PrintCharsAsStringTo(s.data(), s.size(), os);\n}\n\n#if GTEST_HAS_STD_WSTRING\nvoid PrintWideStringTo(const ::std::wstring& s, ostream* os) {\n  PrintCharsAsStringTo(s.data(), s.size(), os);\n}\n#endif  // GTEST_HAS_STD_WSTRING\n\n}  // namespace internal\n\n}  // namespace testing\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n\n\n\nnamespace testing {\n\nusing internal::GetUnitTestImpl;\n\n// Gets the summary of the failure message by omitting the stack trace\n// in it.\nstd::string TestPartResult::ExtractSummary(const char* message) {\n  const char* const stack_trace = strstr(message, internal::kStackTraceMarker);\n  return stack_trace == nullptr ? message : std::string(message, stack_trace);\n}\n\n// Prints a TestPartResult object.\nstd::ostream& operator<<(std::ostream& os, const TestPartResult& result) {\n  return os << internal::FormatFileLocation(result.file_name(),\n                                            result.line_number())\n            << \" \"\n            << (result.type() == TestPartResult::kSuccess\n                    ? \"Success\"\n                    : result.type() == TestPartResult::kSkip\n                          ? \"Skipped\"\n                          : result.type() == TestPartResult::kFatalFailure\n                                ? \"Fatal failure\"\n                                : \"Non-fatal failure\")\n            << \":\\n\"\n            << result.message() << std::endl;\n}\n\n// Appends a TestPartResult to the array.\nvoid TestPartResultArray::Append(const TestPartResult& result) {\n  array_.push_back(result);\n}\n\n// Returns the TestPartResult at the given index (0-based).\nconst TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {\n  if (index < 0 || index >= size()) {\n    printf(\"\\nInvalid index (%d) into TestPartResultArray.\\n\", index);\n    internal::posix::Abort();\n  }\n\n  return array_[static_cast<size_t>(index)];\n}\n\n// Returns the number of TestPartResult objects in the array.\nint TestPartResultArray::size() const {\n  return static_cast<int>(array_.size());\n}\n\nnamespace internal {\n\nHasNewFatalFailureHelper::HasNewFatalFailureHelper()\n    : has_new_fatal_failure_(false),\n      original_reporter_(GetUnitTestImpl()->\n                         GetTestPartResultReporterForCurrentThread()) {\n  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this);\n}\n\nHasNewFatalFailureHelper::~HasNewFatalFailureHelper() {\n  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(\n      original_reporter_);\n}\n\nvoid HasNewFatalFailureHelper::ReportTestPartResult(\n    const TestPartResult& result) {\n  if (result.fatally_failed())\n    has_new_fatal_failure_ = true;\n  original_reporter_->ReportTestPartResult(result);\n}\n\n}  // namespace internal\n\n}  // namespace testing\n// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n\n\nnamespace testing {\nnamespace internal {\n\n// Skips to the first non-space char in str. Returns an empty string if str\n// contains only whitespace characters.\nstatic const char* SkipSpaces(const char* str) {\n  while (IsSpace(*str))\n    str++;\n  return str;\n}\n\nstatic std::vector<std::string> SplitIntoTestNames(const char* src) {\n  std::vector<std::string> name_vec;\n  src = SkipSpaces(src);\n  for (; src != nullptr; src = SkipComma(src)) {\n    name_vec.push_back(StripTrailingSpaces(GetPrefixUntilComma(src)));\n  }\n  return name_vec;\n}\n\n// Verifies that registered_tests match the test names in\n// registered_tests_; returns registered_tests if successful, or\n// aborts the program otherwise.\nconst char* TypedTestSuitePState::VerifyRegisteredTestNames(\n    const char* test_suite_name, const char* file, int line,\n    const char* registered_tests) {\n  RegisterTypeParameterizedTestSuite(test_suite_name, CodeLocation(file, line));\n\n  typedef RegisteredTestsMap::const_iterator RegisteredTestIter;\n  registered_ = true;\n\n  std::vector<std::string> name_vec = SplitIntoTestNames(registered_tests);\n\n  Message errors;\n\n  std::set<std::string> tests;\n  for (std::vector<std::string>::const_iterator name_it = name_vec.begin();\n       name_it != name_vec.end(); ++name_it) {\n    const std::string& name = *name_it;\n    if (tests.count(name) != 0) {\n      errors << \"Test \" << name << \" is listed more than once.\\n\";\n      continue;\n    }\n\n    if (registered_tests_.count(name) != 0) {\n      tests.insert(name);\n    } else {\n      errors << \"No test named \" << name\n             << \" can be found in this test suite.\\n\";\n    }\n  }\n\n  for (RegisteredTestIter it = registered_tests_.begin();\n       it != registered_tests_.end();\n       ++it) {\n    if (tests.count(it->first) == 0) {\n      errors << \"You forgot to list test \" << it->first << \".\\n\";\n    }\n  }\n\n  const std::string& errors_str = errors.GetString();\n  if (errors_str != \"\") {\n    fprintf(stderr, \"%s %s\", FormatFileLocation(file, line).c_str(),\n            errors_str.c_str());\n    fflush(stderr);\n    posix::Abort();\n  }\n\n  return registered_tests;\n}\n\n}  // namespace internal\n}  // namespace testing\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Google C++ Mocking Framework (Google Mock)\n//\n// This file #includes all Google Mock implementation .cc files.  The\n// purpose is to allow a user to build Google Mock by compiling this\n// file alone.\n\n// This line ensures that gmock.h can be compiled on its own, even\n// when it's fused.\n#include \"gmock/gmock.h\"\n\n// The following lines pull in the real gmock *.cc files.\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements cardinalities.\n\n\n#include <limits.h>\n#include <ostream>  // NOLINT\n#include <sstream>\n#include <string>\n\nnamespace testing {\n\nnamespace {\n\n// Implements the Between(m, n) cardinality.\nclass BetweenCardinalityImpl : public CardinalityInterface {\n public:\n  BetweenCardinalityImpl(int min, int max)\n      : min_(min >= 0 ? min : 0),\n        max_(max >= min_ ? max : min_) {\n    std::stringstream ss;\n    if (min < 0) {\n      ss << \"The invocation lower bound must be >= 0, \"\n         << \"but is actually \" << min << \".\";\n      internal::Expect(false, __FILE__, __LINE__, ss.str());\n    } else if (max < 0) {\n      ss << \"The invocation upper bound must be >= 0, \"\n         << \"but is actually \" << max << \".\";\n      internal::Expect(false, __FILE__, __LINE__, ss.str());\n    } else if (min > max) {\n      ss << \"The invocation upper bound (\" << max\n         << \") must be >= the invocation lower bound (\" << min\n         << \").\";\n      internal::Expect(false, __FILE__, __LINE__, ss.str());\n    }\n  }\n\n  // Conservative estimate on the lower/upper bound of the number of\n  // calls allowed.\n  int ConservativeLowerBound() const override { return min_; }\n  int ConservativeUpperBound() const override { return max_; }\n\n  bool IsSatisfiedByCallCount(int call_count) const override {\n    return min_ <= call_count && call_count <= max_;\n  }\n\n  bool IsSaturatedByCallCount(int call_count) const override {\n    return call_count >= max_;\n  }\n\n  void DescribeTo(::std::ostream* os) const override;\n\n private:\n  const int min_;\n  const int max_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(BetweenCardinalityImpl);\n};\n\n// Formats \"n times\" in a human-friendly way.\ninline std::string FormatTimes(int n) {\n  if (n == 1) {\n    return \"once\";\n  } else if (n == 2) {\n    return \"twice\";\n  } else {\n    std::stringstream ss;\n    ss << n << \" times\";\n    return ss.str();\n  }\n}\n\n// Describes the Between(m, n) cardinality in human-friendly text.\nvoid BetweenCardinalityImpl::DescribeTo(::std::ostream* os) const {\n  if (min_ == 0) {\n    if (max_ == 0) {\n      *os << \"never called\";\n    } else if (max_ == INT_MAX) {\n      *os << \"called any number of times\";\n    } else {\n      *os << \"called at most \" << FormatTimes(max_);\n    }\n  } else if (min_ == max_) {\n    *os << \"called \" << FormatTimes(min_);\n  } else if (max_ == INT_MAX) {\n    *os << \"called at least \" << FormatTimes(min_);\n  } else {\n    // 0 < min_ < max_ < INT_MAX\n    *os << \"called between \" << min_ << \" and \" << max_ << \" times\";\n  }\n}\n\n}  // Unnamed namespace\n\n// Describes the given call count to an ostream.\nvoid Cardinality::DescribeActualCallCountTo(int actual_call_count,\n                                            ::std::ostream* os) {\n  if (actual_call_count > 0) {\n    *os << \"called \" << FormatTimes(actual_call_count);\n  } else {\n    *os << \"never called\";\n  }\n}\n\n// Creates a cardinality that allows at least n calls.\nGTEST_API_ Cardinality AtLeast(int n) { return Between(n, INT_MAX); }\n\n// Creates a cardinality that allows at most n calls.\nGTEST_API_ Cardinality AtMost(int n) { return Between(0, n); }\n\n// Creates a cardinality that allows any number of calls.\nGTEST_API_ Cardinality AnyNumber() { return AtLeast(0); }\n\n// Creates a cardinality that allows between min and max calls.\nGTEST_API_ Cardinality Between(int min, int max) {\n  return Cardinality(new BetweenCardinalityImpl(min, max));\n}\n\n// Creates a cardinality that allows exactly n calls.\nGTEST_API_ Cardinality Exactly(int n) { return Between(n, n); }\n\n}  // namespace testing\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file defines some utilities useful for implementing Google\n// Mock.  They are subject to change without notice, so please DO NOT\n// USE THEM IN USER CODE.\n\n\n#include <ctype.h>\n#include <ostream>  // NOLINT\n#include <string>\n\nnamespace testing {\nnamespace internal {\n\n// Joins a vector of strings as if they are fields of a tuple; returns\n// the joined string.\nGTEST_API_ std::string JoinAsTuple(const Strings& fields) {\n  switch (fields.size()) {\n    case 0:\n      return \"\";\n    case 1:\n      return fields[0];\n    default:\n      std::string result = \"(\" + fields[0];\n      for (size_t i = 1; i < fields.size(); i++) {\n        result += \", \";\n        result += fields[i];\n      }\n      result += \")\";\n      return result;\n  }\n}\n\n// Converts an identifier name to a space-separated list of lower-case\n// words.  Each maximum substring of the form [A-Za-z][a-z]*|\\d+ is\n// treated as one word.  For example, both \"FooBar123\" and\n// \"foo_bar_123\" are converted to \"foo bar 123\".\nGTEST_API_ std::string ConvertIdentifierNameToWords(const char* id_name) {\n  std::string result;\n  char prev_char = '\\0';\n  for (const char* p = id_name; *p != '\\0'; prev_char = *(p++)) {\n    // We don't care about the current locale as the input is\n    // guaranteed to be a valid C++ identifier name.\n    const bool starts_new_word = IsUpper(*p) ||\n        (!IsAlpha(prev_char) && IsLower(*p)) ||\n        (!IsDigit(prev_char) && IsDigit(*p));\n\n    if (IsAlNum(*p)) {\n      if (starts_new_word && result != \"\")\n        result += ' ';\n      result += ToLower(*p);\n    }\n  }\n  return result;\n}\n\n// This class reports Google Mock failures as Google Test failures.  A\n// user can define another class in a similar fashion if they intend to\n// use Google Mock with a testing framework other than Google Test.\nclass GoogleTestFailureReporter : public FailureReporterInterface {\n public:\n  void ReportFailure(FailureType type, const char* file, int line,\n                     const std::string& message) override {\n    AssertHelper(type == kFatal ?\n                 TestPartResult::kFatalFailure :\n                 TestPartResult::kNonFatalFailure,\n                 file,\n                 line,\n                 message.c_str()) = Message();\n    if (type == kFatal) {\n      posix::Abort();\n    }\n  }\n};\n\n// Returns the global failure reporter.  Will create a\n// GoogleTestFailureReporter and return it the first time called.\nGTEST_API_ FailureReporterInterface* GetFailureReporter() {\n  // Points to the global failure reporter used by Google Mock.  gcc\n  // guarantees that the following use of failure_reporter is\n  // thread-safe.  We may need to add additional synchronization to\n  // protect failure_reporter if we port Google Mock to other\n  // compilers.\n  static FailureReporterInterface* const failure_reporter =\n      new GoogleTestFailureReporter();\n  return failure_reporter;\n}\n\n// Protects global resources (stdout in particular) used by Log().\nstatic GTEST_DEFINE_STATIC_MUTEX_(g_log_mutex);\n\n// Returns true if and only if a log with the given severity is visible\n// according to the --gmock_verbose flag.\nGTEST_API_ bool LogIsVisible(LogSeverity severity) {\n  if (GMOCK_FLAG(verbose) == kInfoVerbosity) {\n    // Always show the log if --gmock_verbose=info.\n    return true;\n  } else if (GMOCK_FLAG(verbose) == kErrorVerbosity) {\n    // Always hide it if --gmock_verbose=error.\n    return false;\n  } else {\n    // If --gmock_verbose is neither \"info\" nor \"error\", we treat it\n    // as \"warning\" (its default value).\n    return severity == kWarning;\n  }\n}\n\n// Prints the given message to stdout if and only if 'severity' >= the level\n// specified by the --gmock_verbose flag.  If stack_frames_to_skip >=\n// 0, also prints the stack trace excluding the top\n// stack_frames_to_skip frames.  In opt mode, any positive\n// stack_frames_to_skip is treated as 0, since we don't know which\n// function calls will be inlined by the compiler and need to be\n// conservative.\nGTEST_API_ void Log(LogSeverity severity, const std::string& message,\n                    int stack_frames_to_skip) {\n  if (!LogIsVisible(severity))\n    return;\n\n  // Ensures that logs from different threads don't interleave.\n  MutexLock l(&g_log_mutex);\n\n  if (severity == kWarning) {\n    // Prints a GMOCK WARNING marker to make the warnings easily searchable.\n    std::cout << \"\\nGMOCK WARNING:\";\n  }\n  // Pre-pends a new-line to message if it doesn't start with one.\n  if (message.empty() || message[0] != '\\n') {\n    std::cout << \"\\n\";\n  }\n  std::cout << message;\n  if (stack_frames_to_skip >= 0) {\n#ifdef NDEBUG\n    // In opt mode, we have to be conservative and skip no stack frame.\n    const int actual_to_skip = 0;\n#else\n    // In dbg mode, we can do what the caller tell us to do (plus one\n    // for skipping this function's stack frame).\n    const int actual_to_skip = stack_frames_to_skip + 1;\n#endif  // NDEBUG\n\n    // Appends a new-line to message if it doesn't end with one.\n    if (!message.empty() && *message.rbegin() != '\\n') {\n      std::cout << \"\\n\";\n    }\n    std::cout << \"Stack trace:\\n\"\n         << ::testing::internal::GetCurrentOsStackTraceExceptTop(\n             ::testing::UnitTest::GetInstance(), actual_to_skip);\n  }\n  std::cout << ::std::flush;\n}\n\nGTEST_API_ WithoutMatchers GetWithoutMatchers() { return WithoutMatchers(); }\n\nGTEST_API_ void IllegalDoDefault(const char* file, int line) {\n  internal::Assert(\n      false, file, line,\n      \"You are using DoDefault() inside a composite action like \"\n      \"DoAll() or WithArgs().  This is not supported for technical \"\n      \"reasons.  Please instead spell out the default action, or \"\n      \"assign the default action to an Action variable and use \"\n      \"the variable in various places.\");\n}\n\n}  // namespace internal\n}  // namespace testing\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements Matcher<const string&>, Matcher<string>, and\n// utilities for defining matchers.\n\n\n#include <string.h>\n#include <iostream>\n#include <sstream>\n#include <string>\n\nnamespace testing {\nnamespace internal {\n\n// Returns the description for a matcher defined using the MATCHER*()\n// macro where the user-supplied description string is \"\", if\n// 'negation' is false; otherwise returns the description of the\n// negation of the matcher.  'param_values' contains a list of strings\n// that are the print-out of the matcher's parameters.\nGTEST_API_ std::string FormatMatcherDescription(bool negation,\n                                                const char* matcher_name,\n                                                const Strings& param_values) {\n  std::string result = ConvertIdentifierNameToWords(matcher_name);\n  if (param_values.size() >= 1) result += \" \" + JoinAsTuple(param_values);\n  return negation ? \"not (\" + result + \")\" : result;\n}\n\n// FindMaxBipartiteMatching and its helper class.\n//\n// Uses the well-known Ford-Fulkerson max flow method to find a maximum\n// bipartite matching. Flow is considered to be from left to right.\n// There is an implicit source node that is connected to all of the left\n// nodes, and an implicit sink node that is connected to all of the\n// right nodes. All edges have unit capacity.\n//\n// Neither the flow graph nor the residual flow graph are represented\n// explicitly. Instead, they are implied by the information in 'graph' and\n// a vector<int> called 'left_' whose elements are initialized to the\n// value kUnused. This represents the initial state of the algorithm,\n// where the flow graph is empty, and the residual flow graph has the\n// following edges:\n//   - An edge from source to each left_ node\n//   - An edge from each right_ node to sink\n//   - An edge from each left_ node to each right_ node, if the\n//     corresponding edge exists in 'graph'.\n//\n// When the TryAugment() method adds a flow, it sets left_[l] = r for some\n// nodes l and r. This induces the following changes:\n//   - The edges (source, l), (l, r), and (r, sink) are added to the\n//     flow graph.\n//   - The same three edges are removed from the residual flow graph.\n//   - The reverse edges (l, source), (r, l), and (sink, r) are added\n//     to the residual flow graph, which is a directional graph\n//     representing unused flow capacity.\n//\n// When the method augments a flow (moving left_[l] from some r1 to some\n// other r2), this can be thought of as \"undoing\" the above steps with\n// respect to r1 and \"redoing\" them with respect to r2.\n//\n// It bears repeating that the flow graph and residual flow graph are\n// never represented explicitly, but can be derived by looking at the\n// information in 'graph' and in left_.\n//\n// As an optimization, there is a second vector<int> called right_ which\n// does not provide any new information. Instead, it enables more\n// efficient queries about edges entering or leaving the right-side nodes\n// of the flow or residual flow graphs. The following invariants are\n// maintained:\n//\n// left[l] == kUnused or right[left[l]] == l\n// right[r] == kUnused or left[right[r]] == r\n//\n// . [ source ]                                        .\n// .   |||                                             .\n// .   |||                                             .\n// .   ||\\--> left[0]=1  ---\\    right[0]=-1 ----\\     .\n// .   ||                   |                    |     .\n// .   |\\---> left[1]=-1    \\--> right[1]=0  ---\\|     .\n// .   |                                        ||     .\n// .   \\----> left[2]=2  ------> right[2]=2  --\\||     .\n// .                                           |||     .\n// .         elements           matchers       vvv     .\n// .                                         [ sink ]  .\n//\n// See Also:\n//   [1] Cormen, et al (2001). \"Section 26.2: The Ford-Fulkerson method\".\n//       \"Introduction to Algorithms (Second ed.)\", pp. 651-664.\n//   [2] \"Ford-Fulkerson algorithm\", Wikipedia,\n//       'http://en.wikipedia.org/wiki/Ford%E2%80%93Fulkerson_algorithm'\nclass MaxBipartiteMatchState {\n public:\n  explicit MaxBipartiteMatchState(const MatchMatrix& graph)\n      : graph_(&graph),\n        left_(graph_->LhsSize(), kUnused),\n        right_(graph_->RhsSize(), kUnused) {}\n\n  // Returns the edges of a maximal match, each in the form {left, right}.\n  ElementMatcherPairs Compute() {\n    // 'seen' is used for path finding { 0: unseen, 1: seen }.\n    ::std::vector<char> seen;\n    // Searches the residual flow graph for a path from each left node to\n    // the sink in the residual flow graph, and if one is found, add flow\n    // to the graph. It's okay to search through the left nodes once. The\n    // edge from the implicit source node to each previously-visited left\n    // node will have flow if that left node has any path to the sink\n    // whatsoever. Subsequent augmentations can only add flow to the\n    // network, and cannot take away that previous flow unit from the source.\n    // Since the source-to-left edge can only carry one flow unit (or,\n    // each element can be matched to only one matcher), there is no need\n    // to visit the left nodes more than once looking for augmented paths.\n    // The flow is known to be possible or impossible by looking at the\n    // node once.\n    for (size_t ilhs = 0; ilhs < graph_->LhsSize(); ++ilhs) {\n      // Reset the path-marking vector and try to find a path from\n      // source to sink starting at the left_[ilhs] node.\n      GTEST_CHECK_(left_[ilhs] == kUnused)\n          << \"ilhs: \" << ilhs << \", left_[ilhs]: \" << left_[ilhs];\n      // 'seen' initialized to 'graph_->RhsSize()' copies of 0.\n      seen.assign(graph_->RhsSize(), 0);\n      TryAugment(ilhs, &seen);\n    }\n    ElementMatcherPairs result;\n    for (size_t ilhs = 0; ilhs < left_.size(); ++ilhs) {\n      size_t irhs = left_[ilhs];\n      if (irhs == kUnused) continue;\n      result.push_back(ElementMatcherPair(ilhs, irhs));\n    }\n    return result;\n  }\n\n private:\n  static const size_t kUnused = static_cast<size_t>(-1);\n\n  // Perform a depth-first search from left node ilhs to the sink.  If a\n  // path is found, flow is added to the network by linking the left and\n  // right vector elements corresponding each segment of the path.\n  // Returns true if a path to sink was found, which means that a unit of\n  // flow was added to the network. The 'seen' vector elements correspond\n  // to right nodes and are marked to eliminate cycles from the search.\n  //\n  // Left nodes will only be explored at most once because they\n  // are accessible from at most one right node in the residual flow\n  // graph.\n  //\n  // Note that left_[ilhs] is the only element of left_ that TryAugment will\n  // potentially transition from kUnused to another value. Any other\n  // left_ element holding kUnused before TryAugment will be holding it\n  // when TryAugment returns.\n  //\n  bool TryAugment(size_t ilhs, ::std::vector<char>* seen) {\n    for (size_t irhs = 0; irhs < graph_->RhsSize(); ++irhs) {\n      if ((*seen)[irhs]) continue;\n      if (!graph_->HasEdge(ilhs, irhs)) continue;\n      // There's an available edge from ilhs to irhs.\n      (*seen)[irhs] = 1;\n      // Next a search is performed to determine whether\n      // this edge is a dead end or leads to the sink.\n      //\n      // right_[irhs] == kUnused means that there is residual flow from\n      // right node irhs to the sink, so we can use that to finish this\n      // flow path and return success.\n      //\n      // Otherwise there is residual flow to some ilhs. We push flow\n      // along that path and call ourselves recursively to see if this\n      // ultimately leads to sink.\n      if (right_[irhs] == kUnused || TryAugment(right_[irhs], seen)) {\n        // Add flow from left_[ilhs] to right_[irhs].\n        left_[ilhs] = irhs;\n        right_[irhs] = ilhs;\n        return true;\n      }\n    }\n    return false;\n  }\n\n  const MatchMatrix* graph_;  // not owned\n  // Each element of the left_ vector represents a left hand side node\n  // (i.e. an element) and each element of right_ is a right hand side\n  // node (i.e. a matcher). The values in the left_ vector indicate\n  // outflow from that node to a node on the right_ side. The values\n  // in the right_ indicate inflow, and specify which left_ node is\n  // feeding that right_ node, if any. For example, left_[3] == 1 means\n  // there's a flow from element #3 to matcher #1. Such a flow would also\n  // be redundantly represented in the right_ vector as right_[1] == 3.\n  // Elements of left_ and right_ are either kUnused or mutually\n  // referent. Mutually referent means that left_[right_[i]] = i and\n  // right_[left_[i]] = i.\n  ::std::vector<size_t> left_;\n  ::std::vector<size_t> right_;\n};\n\nconst size_t MaxBipartiteMatchState::kUnused;\n\nGTEST_API_ ElementMatcherPairs FindMaxBipartiteMatching(const MatchMatrix& g) {\n  return MaxBipartiteMatchState(g).Compute();\n}\n\nstatic void LogElementMatcherPairVec(const ElementMatcherPairs& pairs,\n                                     ::std::ostream* stream) {\n  typedef ElementMatcherPairs::const_iterator Iter;\n  ::std::ostream& os = *stream;\n  os << \"{\";\n  const char* sep = \"\";\n  for (Iter it = pairs.begin(); it != pairs.end(); ++it) {\n    os << sep << \"\\n  (\"\n       << \"element #\" << it->first << \", \"\n       << \"matcher #\" << it->second << \")\";\n    sep = \",\";\n  }\n  os << \"\\n}\";\n}\n\nbool MatchMatrix::NextGraph() {\n  for (size_t ilhs = 0; ilhs < LhsSize(); ++ilhs) {\n    for (size_t irhs = 0; irhs < RhsSize(); ++irhs) {\n      char& b = matched_[SpaceIndex(ilhs, irhs)];\n      if (!b) {\n        b = 1;\n        return true;\n      }\n      b = 0;\n    }\n  }\n  return false;\n}\n\nvoid MatchMatrix::Randomize() {\n  for (size_t ilhs = 0; ilhs < LhsSize(); ++ilhs) {\n    for (size_t irhs = 0; irhs < RhsSize(); ++irhs) {\n      char& b = matched_[SpaceIndex(ilhs, irhs)];\n      b = static_cast<char>(rand() & 1);  // NOLINT\n    }\n  }\n}\n\nstd::string MatchMatrix::DebugString() const {\n  ::std::stringstream ss;\n  const char* sep = \"\";\n  for (size_t i = 0; i < LhsSize(); ++i) {\n    ss << sep;\n    for (size_t j = 0; j < RhsSize(); ++j) {\n      ss << HasEdge(i, j);\n    }\n    sep = \";\";\n  }\n  return ss.str();\n}\n\nvoid UnorderedElementsAreMatcherImplBase::DescribeToImpl(\n    ::std::ostream* os) const {\n  switch (match_flags()) {\n    case UnorderedMatcherRequire::ExactMatch:\n      if (matcher_describers_.empty()) {\n        *os << \"is empty\";\n        return;\n      }\n      if (matcher_describers_.size() == 1) {\n        *os << \"has \" << Elements(1) << \" and that element \";\n        matcher_describers_[0]->DescribeTo(os);\n        return;\n      }\n      *os << \"has \" << Elements(matcher_describers_.size())\n          << \" and there exists some permutation of elements such that:\\n\";\n      break;\n    case UnorderedMatcherRequire::Superset:\n      *os << \"a surjection from elements to requirements exists such that:\\n\";\n      break;\n    case UnorderedMatcherRequire::Subset:\n      *os << \"an injection from elements to requirements exists such that:\\n\";\n      break;\n  }\n\n  const char* sep = \"\";\n  for (size_t i = 0; i != matcher_describers_.size(); ++i) {\n    *os << sep;\n    if (match_flags() == UnorderedMatcherRequire::ExactMatch) {\n      *os << \" - element #\" << i << \" \";\n    } else {\n      *os << \" - an element \";\n    }\n    matcher_describers_[i]->DescribeTo(os);\n    if (match_flags() == UnorderedMatcherRequire::ExactMatch) {\n      sep = \", and\\n\";\n    } else {\n      sep = \"\\n\";\n    }\n  }\n}\n\nvoid UnorderedElementsAreMatcherImplBase::DescribeNegationToImpl(\n    ::std::ostream* os) const {\n  switch (match_flags()) {\n    case UnorderedMatcherRequire::ExactMatch:\n      if (matcher_describers_.empty()) {\n        *os << \"isn't empty\";\n        return;\n      }\n      if (matcher_describers_.size() == 1) {\n        *os << \"doesn't have \" << Elements(1) << \", or has \" << Elements(1)\n            << \" that \";\n        matcher_describers_[0]->DescribeNegationTo(os);\n        return;\n      }\n      *os << \"doesn't have \" << Elements(matcher_describers_.size())\n          << \", or there exists no permutation of elements such that:\\n\";\n      break;\n    case UnorderedMatcherRequire::Superset:\n      *os << \"no surjection from elements to requirements exists such that:\\n\";\n      break;\n    case UnorderedMatcherRequire::Subset:\n      *os << \"no injection from elements to requirements exists such that:\\n\";\n      break;\n  }\n  const char* sep = \"\";\n  for (size_t i = 0; i != matcher_describers_.size(); ++i) {\n    *os << sep;\n    if (match_flags() == UnorderedMatcherRequire::ExactMatch) {\n      *os << \" - element #\" << i << \" \";\n    } else {\n      *os << \" - an element \";\n    }\n    matcher_describers_[i]->DescribeTo(os);\n    if (match_flags() == UnorderedMatcherRequire::ExactMatch) {\n      sep = \", and\\n\";\n    } else {\n      sep = \"\\n\";\n    }\n  }\n}\n\n// Checks that all matchers match at least one element, and that all\n// elements match at least one matcher. This enables faster matching\n// and better error reporting.\n// Returns false, writing an explanation to 'listener', if and only\n// if the success criteria are not met.\nbool UnorderedElementsAreMatcherImplBase::VerifyMatchMatrix(\n    const ::std::vector<std::string>& element_printouts,\n    const MatchMatrix& matrix, MatchResultListener* listener) const {\n  bool result = true;\n  ::std::vector<char> element_matched(matrix.LhsSize(), 0);\n  ::std::vector<char> matcher_matched(matrix.RhsSize(), 0);\n\n  for (size_t ilhs = 0; ilhs < matrix.LhsSize(); ilhs++) {\n    for (size_t irhs = 0; irhs < matrix.RhsSize(); irhs++) {\n      char matched = matrix.HasEdge(ilhs, irhs);\n      element_matched[ilhs] |= matched;\n      matcher_matched[irhs] |= matched;\n    }\n  }\n\n  if (match_flags() & UnorderedMatcherRequire::Superset) {\n    const char* sep =\n        \"where the following matchers don't match any elements:\\n\";\n    for (size_t mi = 0; mi < matcher_matched.size(); ++mi) {\n      if (matcher_matched[mi]) continue;\n      result = false;\n      if (listener->IsInterested()) {\n        *listener << sep << \"matcher #\" << mi << \": \";\n        matcher_describers_[mi]->DescribeTo(listener->stream());\n        sep = \",\\n\";\n      }\n    }\n  }\n\n  if (match_flags() & UnorderedMatcherRequire::Subset) {\n    const char* sep =\n        \"where the following elements don't match any matchers:\\n\";\n    const char* outer_sep = \"\";\n    if (!result) {\n      outer_sep = \"\\nand \";\n    }\n    for (size_t ei = 0; ei < element_matched.size(); ++ei) {\n      if (element_matched[ei]) continue;\n      result = false;\n      if (listener->IsInterested()) {\n        *listener << outer_sep << sep << \"element #\" << ei << \": \"\n                  << element_printouts[ei];\n        sep = \",\\n\";\n        outer_sep = \"\";\n      }\n    }\n  }\n  return result;\n}\n\nbool UnorderedElementsAreMatcherImplBase::FindPairing(\n    const MatchMatrix& matrix, MatchResultListener* listener) const {\n  ElementMatcherPairs matches = FindMaxBipartiteMatching(matrix);\n\n  size_t max_flow = matches.size();\n  if ((match_flags() & UnorderedMatcherRequire::Superset) &&\n      max_flow < matrix.RhsSize()) {\n    if (listener->IsInterested()) {\n      *listener << \"where no permutation of the elements can satisfy all \"\n                   \"matchers, and the closest match is \"\n                << max_flow << \" of \" << matrix.RhsSize()\n                << \" matchers with the pairings:\\n\";\n      LogElementMatcherPairVec(matches, listener->stream());\n    }\n    return false;\n  }\n  if ((match_flags() & UnorderedMatcherRequire::Subset) &&\n      max_flow < matrix.LhsSize()) {\n    if (listener->IsInterested()) {\n      *listener\n          << \"where not all elements can be matched, and the closest match is \"\n          << max_flow << \" of \" << matrix.RhsSize()\n          << \" matchers with the pairings:\\n\";\n      LogElementMatcherPairVec(matches, listener->stream());\n    }\n    return false;\n  }\n\n  if (matches.size() > 1) {\n    if (listener->IsInterested()) {\n      const char* sep = \"where:\\n\";\n      for (size_t mi = 0; mi < matches.size(); ++mi) {\n        *listener << sep << \" - element #\" << matches[mi].first\n                  << \" is matched by matcher #\" << matches[mi].second;\n        sep = \",\\n\";\n      }\n    }\n  }\n  return true;\n}\n\n}  // namespace internal\n}  // namespace testing\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements the spec builder syntax (ON_CALL and\n// EXPECT_CALL).\n\n\n#include <stdlib.h>\n\n#include <iostream>  // NOLINT\n#include <map>\n#include <memory>\n#include <set>\n#include <string>\n#include <vector>\n\n\n#if GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC\n# include <unistd.h>  // NOLINT\n#endif\n\n// Silence C4800 (C4800: 'int *const ': forcing value\n// to bool 'true' or 'false') for MSVC 15\n#ifdef _MSC_VER\n#if _MSC_VER == 1900\n#  pragma warning(push)\n#  pragma warning(disable:4800)\n#endif\n#endif\n\nnamespace testing {\nnamespace internal {\n\n// Protects the mock object registry (in class Mock), all function\n// mockers, and all expectations.\nGTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_gmock_mutex);\n\n// Logs a message including file and line number information.\nGTEST_API_ void LogWithLocation(testing::internal::LogSeverity severity,\n                                const char* file, int line,\n                                const std::string& message) {\n  ::std::ostringstream s;\n  s << internal::FormatFileLocation(file, line) << \" \" << message\n    << ::std::endl;\n  Log(severity, s.str(), 0);\n}\n\n// Constructs an ExpectationBase object.\nExpectationBase::ExpectationBase(const char* a_file, int a_line,\n                                 const std::string& a_source_text)\n    : file_(a_file),\n      line_(a_line),\n      source_text_(a_source_text),\n      cardinality_specified_(false),\n      cardinality_(Exactly(1)),\n      call_count_(0),\n      retired_(false),\n      extra_matcher_specified_(false),\n      repeated_action_specified_(false),\n      retires_on_saturation_(false),\n      last_clause_(kNone),\n      action_count_checked_(false) {}\n\n// Destructs an ExpectationBase object.\nExpectationBase::~ExpectationBase() {}\n\n// Explicitly specifies the cardinality of this expectation.  Used by\n// the subclasses to implement the .Times() clause.\nvoid ExpectationBase::SpecifyCardinality(const Cardinality& a_cardinality) {\n  cardinality_specified_ = true;\n  cardinality_ = a_cardinality;\n}\n\n// Retires all pre-requisites of this expectation.\nvoid ExpectationBase::RetireAllPreRequisites()\n    GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n  if (is_retired()) {\n    // We can take this short-cut as we never retire an expectation\n    // until we have retired all its pre-requisites.\n    return;\n  }\n\n  ::std::vector<ExpectationBase*> expectations(1, this);\n  while (!expectations.empty()) {\n    ExpectationBase* exp = expectations.back();\n    expectations.pop_back();\n\n    for (ExpectationSet::const_iterator it =\n             exp->immediate_prerequisites_.begin();\n         it != exp->immediate_prerequisites_.end(); ++it) {\n      ExpectationBase* next = it->expectation_base().get();\n      if (!next->is_retired()) {\n        next->Retire();\n        expectations.push_back(next);\n      }\n    }\n  }\n}\n\n// Returns true if and only if all pre-requisites of this expectation\n// have been satisfied.\nbool ExpectationBase::AllPrerequisitesAreSatisfied() const\n    GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n  g_gmock_mutex.AssertHeld();\n  ::std::vector<const ExpectationBase*> expectations(1, this);\n  while (!expectations.empty()) {\n    const ExpectationBase* exp = expectations.back();\n    expectations.pop_back();\n\n    for (ExpectationSet::const_iterator it =\n             exp->immediate_prerequisites_.begin();\n         it != exp->immediate_prerequisites_.end(); ++it) {\n      const ExpectationBase* next = it->expectation_base().get();\n      if (!next->IsSatisfied()) return false;\n      expectations.push_back(next);\n    }\n  }\n  return true;\n}\n\n// Adds unsatisfied pre-requisites of this expectation to 'result'.\nvoid ExpectationBase::FindUnsatisfiedPrerequisites(ExpectationSet* result) const\n    GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n  g_gmock_mutex.AssertHeld();\n  ::std::vector<const ExpectationBase*> expectations(1, this);\n  while (!expectations.empty()) {\n    const ExpectationBase* exp = expectations.back();\n    expectations.pop_back();\n\n    for (ExpectationSet::const_iterator it =\n             exp->immediate_prerequisites_.begin();\n         it != exp->immediate_prerequisites_.end(); ++it) {\n      const ExpectationBase* next = it->expectation_base().get();\n\n      if (next->IsSatisfied()) {\n        // If *it is satisfied and has a call count of 0, some of its\n        // pre-requisites may not be satisfied yet.\n        if (next->call_count_ == 0) {\n          expectations.push_back(next);\n        }\n      } else {\n        // Now that we know next is unsatisfied, we are not so interested\n        // in whether its pre-requisites are satisfied.  Therefore we\n        // don't iterate into it here.\n        *result += *it;\n      }\n    }\n  }\n}\n\n// Describes how many times a function call matching this\n// expectation has occurred.\nvoid ExpectationBase::DescribeCallCountTo(::std::ostream* os) const\n    GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n  g_gmock_mutex.AssertHeld();\n\n  // Describes how many times the function is expected to be called.\n  *os << \"         Expected: to be \";\n  cardinality().DescribeTo(os);\n  *os << \"\\n           Actual: \";\n  Cardinality::DescribeActualCallCountTo(call_count(), os);\n\n  // Describes the state of the expectation (e.g. is it satisfied?\n  // is it active?).\n  *os << \" - \" << (IsOverSaturated() ? \"over-saturated\" :\n                   IsSaturated() ? \"saturated\" :\n                   IsSatisfied() ? \"satisfied\" : \"unsatisfied\")\n      << \" and \"\n      << (is_retired() ? \"retired\" : \"active\");\n}\n\n// Checks the action count (i.e. the number of WillOnce() and\n// WillRepeatedly() clauses) against the cardinality if this hasn't\n// been done before.  Prints a warning if there are too many or too\n// few actions.\nvoid ExpectationBase::CheckActionCountIfNotDone() const\n    GTEST_LOCK_EXCLUDED_(mutex_) {\n  bool should_check = false;\n  {\n    MutexLock l(&mutex_);\n    if (!action_count_checked_) {\n      action_count_checked_ = true;\n      should_check = true;\n    }\n  }\n\n  if (should_check) {\n    if (!cardinality_specified_) {\n      // The cardinality was inferred - no need to check the action\n      // count against it.\n      return;\n    }\n\n    // The cardinality was explicitly specified.\n    const int action_count = static_cast<int>(untyped_actions_.size());\n    const int upper_bound = cardinality().ConservativeUpperBound();\n    const int lower_bound = cardinality().ConservativeLowerBound();\n    bool too_many;  // True if there are too many actions, or false\n    // if there are too few.\n    if (action_count > upper_bound ||\n        (action_count == upper_bound && repeated_action_specified_)) {\n      too_many = true;\n    } else if (0 < action_count && action_count < lower_bound &&\n               !repeated_action_specified_) {\n      too_many = false;\n    } else {\n      return;\n    }\n\n    ::std::stringstream ss;\n    DescribeLocationTo(&ss);\n    ss << \"Too \" << (too_many ? \"many\" : \"few\")\n       << \" actions specified in \" << source_text() << \"...\\n\"\n       << \"Expected to be \";\n    cardinality().DescribeTo(&ss);\n    ss << \", but has \" << (too_many ? \"\" : \"only \")\n       << action_count << \" WillOnce()\"\n       << (action_count == 1 ? \"\" : \"s\");\n    if (repeated_action_specified_) {\n      ss << \" and a WillRepeatedly()\";\n    }\n    ss << \".\";\n    Log(kWarning, ss.str(), -1);  // -1 means \"don't print stack trace\".\n  }\n}\n\n// Implements the .Times() clause.\nvoid ExpectationBase::UntypedTimes(const Cardinality& a_cardinality) {\n  if (last_clause_ == kTimes) {\n    ExpectSpecProperty(false,\n                       \".Times() cannot appear \"\n                       \"more than once in an EXPECT_CALL().\");\n  } else {\n    ExpectSpecProperty(last_clause_ < kTimes,\n                       \".Times() cannot appear after \"\n                       \".InSequence(), .WillOnce(), .WillRepeatedly(), \"\n                       \"or .RetiresOnSaturation().\");\n  }\n  last_clause_ = kTimes;\n\n  SpecifyCardinality(a_cardinality);\n}\n\n// Points to the implicit sequence introduced by a living InSequence\n// object (if any) in the current thread or NULL.\nGTEST_API_ ThreadLocal<Sequence*> g_gmock_implicit_sequence;\n\n// Reports an uninteresting call (whose description is in msg) in the\n// manner specified by 'reaction'.\nvoid ReportUninterestingCall(CallReaction reaction, const std::string& msg) {\n  // Include a stack trace only if --gmock_verbose=info is specified.\n  const int stack_frames_to_skip =\n      GMOCK_FLAG(verbose) == kInfoVerbosity ? 3 : -1;\n  switch (reaction) {\n    case kAllow:\n      Log(kInfo, msg, stack_frames_to_skip);\n      break;\n    case kWarn:\n      Log(kWarning,\n          msg +\n              \"\\nNOTE: You can safely ignore the above warning unless this \"\n              \"call should not happen.  Do not suppress it by blindly adding \"\n              \"an EXPECT_CALL() if you don't mean to enforce the call.  \"\n              \"See \"\n              \"https://github.com/google/googletest/blob/master/docs/\"\n              \"gmock_cook_book.md#\"\n              \"knowing-when-to-expect for details.\\n\",\n          stack_frames_to_skip);\n      break;\n    default:  // FAIL\n      Expect(false, nullptr, -1, msg);\n  }\n}\n\nUntypedFunctionMockerBase::UntypedFunctionMockerBase()\n    : mock_obj_(nullptr), name_(\"\") {}\n\nUntypedFunctionMockerBase::~UntypedFunctionMockerBase() {}\n\n// Sets the mock object this mock method belongs to, and registers\n// this information in the global mock registry.  Will be called\n// whenever an EXPECT_CALL() or ON_CALL() is executed on this mock\n// method.\nvoid UntypedFunctionMockerBase::RegisterOwner(const void* mock_obj)\n    GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n  {\n    MutexLock l(&g_gmock_mutex);\n    mock_obj_ = mock_obj;\n  }\n  Mock::Register(mock_obj, this);\n}\n\n// Sets the mock object this mock method belongs to, and sets the name\n// of the mock function.  Will be called upon each invocation of this\n// mock function.\nvoid UntypedFunctionMockerBase::SetOwnerAndName(const void* mock_obj,\n                                                const char* name)\n    GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n  // We protect name_ under g_gmock_mutex in case this mock function\n  // is called from two threads concurrently.\n  MutexLock l(&g_gmock_mutex);\n  mock_obj_ = mock_obj;\n  name_ = name;\n}\n\n// Returns the name of the function being mocked.  Must be called\n// after RegisterOwner() or SetOwnerAndName() has been called.\nconst void* UntypedFunctionMockerBase::MockObject() const\n    GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n  const void* mock_obj;\n  {\n    // We protect mock_obj_ under g_gmock_mutex in case this mock\n    // function is called from two threads concurrently.\n    MutexLock l(&g_gmock_mutex);\n    Assert(mock_obj_ != nullptr, __FILE__, __LINE__,\n           \"MockObject() must not be called before RegisterOwner() or \"\n           \"SetOwnerAndName() has been called.\");\n    mock_obj = mock_obj_;\n  }\n  return mock_obj;\n}\n\n// Returns the name of this mock method.  Must be called after\n// SetOwnerAndName() has been called.\nconst char* UntypedFunctionMockerBase::Name() const\n    GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n  const char* name;\n  {\n    // We protect name_ under g_gmock_mutex in case this mock\n    // function is called from two threads concurrently.\n    MutexLock l(&g_gmock_mutex);\n    Assert(name_ != nullptr, __FILE__, __LINE__,\n           \"Name() must not be called before SetOwnerAndName() has \"\n           \"been called.\");\n    name = name_;\n  }\n  return name;\n}\n\n// Calculates the result of invoking this mock function with the given\n// arguments, prints it, and returns it.  The caller is responsible\n// for deleting the result.\nUntypedActionResultHolderBase* UntypedFunctionMockerBase::UntypedInvokeWith(\n    void* const untyped_args) GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n  // See the definition of untyped_expectations_ for why access to it\n  // is unprotected here.\n  if (untyped_expectations_.size() == 0) {\n    // No expectation is set on this mock method - we have an\n    // uninteresting call.\n\n    // We must get Google Mock's reaction on uninteresting calls\n    // made on this mock object BEFORE performing the action,\n    // because the action may DELETE the mock object and make the\n    // following expression meaningless.\n    const CallReaction reaction =\n        Mock::GetReactionOnUninterestingCalls(MockObject());\n\n    // True if and only if we need to print this call's arguments and return\n    // value.  This definition must be kept in sync with\n    // the behavior of ReportUninterestingCall().\n    const bool need_to_report_uninteresting_call =\n        // If the user allows this uninteresting call, we print it\n        // only when they want informational messages.\n        reaction == kAllow ? LogIsVisible(kInfo) :\n                           // If the user wants this to be a warning, we print\n                           // it only when they want to see warnings.\n            reaction == kWarn\n                ? LogIsVisible(kWarning)\n                :\n                // Otherwise, the user wants this to be an error, and we\n                // should always print detailed information in the error.\n                true;\n\n    if (!need_to_report_uninteresting_call) {\n      // Perform the action without printing the call information.\n      return this->UntypedPerformDefaultAction(\n          untyped_args, \"Function call: \" + std::string(Name()));\n    }\n\n    // Warns about the uninteresting call.\n    ::std::stringstream ss;\n    this->UntypedDescribeUninterestingCall(untyped_args, &ss);\n\n    // Calculates the function result.\n    UntypedActionResultHolderBase* const result =\n        this->UntypedPerformDefaultAction(untyped_args, ss.str());\n\n    // Prints the function result.\n    if (result != nullptr) result->PrintAsActionResult(&ss);\n\n    ReportUninterestingCall(reaction, ss.str());\n    return result;\n  }\n\n  bool is_excessive = false;\n  ::std::stringstream ss;\n  ::std::stringstream why;\n  ::std::stringstream loc;\n  const void* untyped_action = nullptr;\n\n  // The UntypedFindMatchingExpectation() function acquires and\n  // releases g_gmock_mutex.\n\n  const ExpectationBase* const untyped_expectation =\n      this->UntypedFindMatchingExpectation(untyped_args, &untyped_action,\n                                           &is_excessive, &ss, &why);\n  const bool found = untyped_expectation != nullptr;\n\n  // True if and only if we need to print the call's arguments\n  // and return value.\n  // This definition must be kept in sync with the uses of Expect()\n  // and Log() in this function.\n  const bool need_to_report_call =\n      !found || is_excessive || LogIsVisible(kInfo);\n  if (!need_to_report_call) {\n    // Perform the action without printing the call information.\n    return untyped_action == nullptr\n               ? this->UntypedPerformDefaultAction(untyped_args, \"\")\n               : this->UntypedPerformAction(untyped_action, untyped_args);\n  }\n\n  ss << \"    Function call: \" << Name();\n  this->UntypedPrintArgs(untyped_args, &ss);\n\n  // In case the action deletes a piece of the expectation, we\n  // generate the message beforehand.\n  if (found && !is_excessive) {\n    untyped_expectation->DescribeLocationTo(&loc);\n  }\n\n  UntypedActionResultHolderBase* result = nullptr;\n\n  auto perform_action = [&] {\n    return untyped_action == nullptr\n               ? this->UntypedPerformDefaultAction(untyped_args, ss.str())\n               : this->UntypedPerformAction(untyped_action, untyped_args);\n  };\n  auto handle_failures = [&] {\n    ss << \"\\n\" << why.str();\n\n    if (!found) {\n      // No expectation matches this call - reports a failure.\n      Expect(false, nullptr, -1, ss.str());\n    } else if (is_excessive) {\n      // We had an upper-bound violation and the failure message is in ss.\n      Expect(false, untyped_expectation->file(), untyped_expectation->line(),\n             ss.str());\n    } else {\n      // We had an expected call and the matching expectation is\n      // described in ss.\n      Log(kInfo, loc.str() + ss.str(), 2);\n    }\n  };\n#if GTEST_HAS_EXCEPTIONS\n  try {\n    result = perform_action();\n  } catch (...) {\n    handle_failures();\n    throw;\n  }\n#else\n  result = perform_action();\n#endif\n\n  if (result != nullptr) result->PrintAsActionResult(&ss);\n  handle_failures();\n  return result;\n}\n\n// Returns an Expectation object that references and co-owns exp,\n// which must be an expectation on this mock function.\nExpectation UntypedFunctionMockerBase::GetHandleOf(ExpectationBase* exp) {\n  // See the definition of untyped_expectations_ for why access to it\n  // is unprotected here.\n  for (UntypedExpectations::const_iterator it =\n           untyped_expectations_.begin();\n       it != untyped_expectations_.end(); ++it) {\n    if (it->get() == exp) {\n      return Expectation(*it);\n    }\n  }\n\n  Assert(false, __FILE__, __LINE__, \"Cannot find expectation.\");\n  return Expectation();\n  // The above statement is just to make the code compile, and will\n  // never be executed.\n}\n\n// Verifies that all expectations on this mock function have been\n// satisfied.  Reports one or more Google Test non-fatal failures\n// and returns false if not.\nbool UntypedFunctionMockerBase::VerifyAndClearExpectationsLocked()\n    GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n  g_gmock_mutex.AssertHeld();\n  bool expectations_met = true;\n  for (UntypedExpectations::const_iterator it =\n           untyped_expectations_.begin();\n       it != untyped_expectations_.end(); ++it) {\n    ExpectationBase* const untyped_expectation = it->get();\n    if (untyped_expectation->IsOverSaturated()) {\n      // There was an upper-bound violation.  Since the error was\n      // already reported when it occurred, there is no need to do\n      // anything here.\n      expectations_met = false;\n    } else if (!untyped_expectation->IsSatisfied()) {\n      expectations_met = false;\n      ::std::stringstream ss;\n      ss  << \"Actual function call count doesn't match \"\n          << untyped_expectation->source_text() << \"...\\n\";\n      // No need to show the source file location of the expectation\n      // in the description, as the Expect() call that follows already\n      // takes care of it.\n      untyped_expectation->MaybeDescribeExtraMatcherTo(&ss);\n      untyped_expectation->DescribeCallCountTo(&ss);\n      Expect(false, untyped_expectation->file(),\n             untyped_expectation->line(), ss.str());\n    }\n  }\n\n  // Deleting our expectations may trigger other mock objects to be deleted, for\n  // example if an action contains a reference counted smart pointer to that\n  // mock object, and that is the last reference. So if we delete our\n  // expectations within the context of the global mutex we may deadlock when\n  // this method is called again. Instead, make a copy of the set of\n  // expectations to delete, clear our set within the mutex, and then clear the\n  // copied set outside of it.\n  UntypedExpectations expectations_to_delete;\n  untyped_expectations_.swap(expectations_to_delete);\n\n  g_gmock_mutex.Unlock();\n  expectations_to_delete.clear();\n  g_gmock_mutex.Lock();\n\n  return expectations_met;\n}\n\nCallReaction intToCallReaction(int mock_behavior) {\n  if (mock_behavior >= kAllow && mock_behavior <= kFail) {\n    return static_cast<internal::CallReaction>(mock_behavior);\n  }\n  return kWarn;\n}\n\n}  // namespace internal\n\n// Class Mock.\n\nnamespace {\n\ntypedef std::set<internal::UntypedFunctionMockerBase*> FunctionMockers;\n\n// The current state of a mock object.  Such information is needed for\n// detecting leaked mock objects and explicitly verifying a mock's\n// expectations.\nstruct MockObjectState {\n  MockObjectState()\n      : first_used_file(nullptr), first_used_line(-1), leakable(false) {}\n\n  // Where in the source file an ON_CALL or EXPECT_CALL is first\n  // invoked on this mock object.\n  const char* first_used_file;\n  int first_used_line;\n  ::std::string first_used_test_suite;\n  ::std::string first_used_test;\n  bool leakable;  // true if and only if it's OK to leak the object.\n  FunctionMockers function_mockers;  // All registered methods of the object.\n};\n\n// A global registry holding the state of all mock objects that are\n// alive.  A mock object is added to this registry the first time\n// Mock::AllowLeak(), ON_CALL(), or EXPECT_CALL() is called on it.  It\n// is removed from the registry in the mock object's destructor.\nclass MockObjectRegistry {\n public:\n  // Maps a mock object (identified by its address) to its state.\n  typedef std::map<const void*, MockObjectState> StateMap;\n\n  // This destructor will be called when a program exits, after all\n  // tests in it have been run.  By then, there should be no mock\n  // object alive.  Therefore we report any living object as test\n  // failure, unless the user explicitly asked us to ignore it.\n  ~MockObjectRegistry() {\n    if (!GMOCK_FLAG(catch_leaked_mocks))\n      return;\n\n    int leaked_count = 0;\n    for (StateMap::const_iterator it = states_.begin(); it != states_.end();\n         ++it) {\n      if (it->second.leakable)  // The user said it's fine to leak this object.\n        continue;\n\n      // FIXME: Print the type of the leaked object.\n      // This can help the user identify the leaked object.\n      std::cout << \"\\n\";\n      const MockObjectState& state = it->second;\n      std::cout << internal::FormatFileLocation(state.first_used_file,\n                                                state.first_used_line);\n      std::cout << \" ERROR: this mock object\";\n      if (state.first_used_test != \"\") {\n        std::cout << \" (used in test \" << state.first_used_test_suite << \".\"\n                  << state.first_used_test << \")\";\n      }\n      std::cout << \" should be deleted but never is. Its address is @\"\n           << it->first << \".\";\n      leaked_count++;\n    }\n    if (leaked_count > 0) {\n      std::cout << \"\\nERROR: \" << leaked_count << \" leaked mock \"\n                << (leaked_count == 1 ? \"object\" : \"objects\")\n                << \" found at program exit. Expectations on a mock object are \"\n                   \"verified when the object is destructed. Leaking a mock \"\n                   \"means that its expectations aren't verified, which is \"\n                   \"usually a test bug. If you really intend to leak a mock, \"\n                   \"you can suppress this error using \"\n                   \"testing::Mock::AllowLeak(mock_object), or you may use a \"\n                   \"fake or stub instead of a mock.\\n\";\n      std::cout.flush();\n      ::std::cerr.flush();\n      // RUN_ALL_TESTS() has already returned when this destructor is\n      // called.  Therefore we cannot use the normal Google Test\n      // failure reporting mechanism.\n      _exit(1);  // We cannot call exit() as it is not reentrant and\n                 // may already have been called.\n    }\n  }\n\n  StateMap& states() { return states_; }\n\n private:\n  StateMap states_;\n};\n\n// Protected by g_gmock_mutex.\nMockObjectRegistry g_mock_object_registry;\n\n// Maps a mock object to the reaction Google Mock should have when an\n// uninteresting method is called.  Protected by g_gmock_mutex.\nstd::map<const void*, internal::CallReaction> g_uninteresting_call_reaction;\n\n// Sets the reaction Google Mock should have when an uninteresting\n// method of the given mock object is called.\nvoid SetReactionOnUninterestingCalls(const void* mock_obj,\n                                     internal::CallReaction reaction)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  internal::MutexLock l(&internal::g_gmock_mutex);\n  g_uninteresting_call_reaction[mock_obj] = reaction;\n}\n\n}  // namespace\n\n// Tells Google Mock to allow uninteresting calls on the given mock\n// object.\nvoid Mock::AllowUninterestingCalls(const void* mock_obj)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  SetReactionOnUninterestingCalls(mock_obj, internal::kAllow);\n}\n\n// Tells Google Mock to warn the user about uninteresting calls on the\n// given mock object.\nvoid Mock::WarnUninterestingCalls(const void* mock_obj)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  SetReactionOnUninterestingCalls(mock_obj, internal::kWarn);\n}\n\n// Tells Google Mock to fail uninteresting calls on the given mock\n// object.\nvoid Mock::FailUninterestingCalls(const void* mock_obj)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  SetReactionOnUninterestingCalls(mock_obj, internal::kFail);\n}\n\n// Tells Google Mock the given mock object is being destroyed and its\n// entry in the call-reaction table should be removed.\nvoid Mock::UnregisterCallReaction(const void* mock_obj)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  internal::MutexLock l(&internal::g_gmock_mutex);\n  g_uninteresting_call_reaction.erase(mock_obj);\n}\n\n// Returns the reaction Google Mock will have on uninteresting calls\n// made on the given mock object.\ninternal::CallReaction Mock::GetReactionOnUninterestingCalls(\n    const void* mock_obj)\n        GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  internal::MutexLock l(&internal::g_gmock_mutex);\n  return (g_uninteresting_call_reaction.count(mock_obj) == 0) ?\n      internal::intToCallReaction(GMOCK_FLAG(default_mock_behavior)) :\n      g_uninteresting_call_reaction[mock_obj];\n}\n\n// Tells Google Mock to ignore mock_obj when checking for leaked mock\n// objects.\nvoid Mock::AllowLeak(const void* mock_obj)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  internal::MutexLock l(&internal::g_gmock_mutex);\n  g_mock_object_registry.states()[mock_obj].leakable = true;\n}\n\n// Verifies and clears all expectations on the given mock object.  If\n// the expectations aren't satisfied, generates one or more Google\n// Test non-fatal failures and returns false.\nbool Mock::VerifyAndClearExpectations(void* mock_obj)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  internal::MutexLock l(&internal::g_gmock_mutex);\n  return VerifyAndClearExpectationsLocked(mock_obj);\n}\n\n// Verifies all expectations on the given mock object and clears its\n// default actions and expectations.  Returns true if and only if the\n// verification was successful.\nbool Mock::VerifyAndClear(void* mock_obj)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  internal::MutexLock l(&internal::g_gmock_mutex);\n  ClearDefaultActionsLocked(mock_obj);\n  return VerifyAndClearExpectationsLocked(mock_obj);\n}\n\n// Verifies and clears all expectations on the given mock object.  If\n// the expectations aren't satisfied, generates one or more Google\n// Test non-fatal failures and returns false.\nbool Mock::VerifyAndClearExpectationsLocked(void* mock_obj)\n    GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex) {\n  internal::g_gmock_mutex.AssertHeld();\n  if (g_mock_object_registry.states().count(mock_obj) == 0) {\n    // No EXPECT_CALL() was set on the given mock object.\n    return true;\n  }\n\n  // Verifies and clears the expectations on each mock method in the\n  // given mock object.\n  bool expectations_met = true;\n  FunctionMockers& mockers =\n      g_mock_object_registry.states()[mock_obj].function_mockers;\n  for (FunctionMockers::const_iterator it = mockers.begin();\n       it != mockers.end(); ++it) {\n    if (!(*it)->VerifyAndClearExpectationsLocked()) {\n      expectations_met = false;\n    }\n  }\n\n  // We don't clear the content of mockers, as they may still be\n  // needed by ClearDefaultActionsLocked().\n  return expectations_met;\n}\n\nbool Mock::IsNaggy(void* mock_obj)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  return Mock::GetReactionOnUninterestingCalls(mock_obj) == internal::kWarn;\n}\nbool Mock::IsNice(void* mock_obj)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  return Mock::GetReactionOnUninterestingCalls(mock_obj) == internal::kAllow;\n}\nbool Mock::IsStrict(void* mock_obj)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  return Mock::GetReactionOnUninterestingCalls(mock_obj) == internal::kFail;\n}\n\n// Registers a mock object and a mock method it owns.\nvoid Mock::Register(const void* mock_obj,\n                    internal::UntypedFunctionMockerBase* mocker)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  internal::MutexLock l(&internal::g_gmock_mutex);\n  g_mock_object_registry.states()[mock_obj].function_mockers.insert(mocker);\n}\n\n// Tells Google Mock where in the source code mock_obj is used in an\n// ON_CALL or EXPECT_CALL.  In case mock_obj is leaked, this\n// information helps the user identify which object it is.\nvoid Mock::RegisterUseByOnCallOrExpectCall(const void* mock_obj,\n                                           const char* file, int line)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  internal::MutexLock l(&internal::g_gmock_mutex);\n  MockObjectState& state = g_mock_object_registry.states()[mock_obj];\n  if (state.first_used_file == nullptr) {\n    state.first_used_file = file;\n    state.first_used_line = line;\n    const TestInfo* const test_info =\n        UnitTest::GetInstance()->current_test_info();\n    if (test_info != nullptr) {\n      state.first_used_test_suite = test_info->test_suite_name();\n      state.first_used_test = test_info->name();\n    }\n  }\n}\n\n// Unregisters a mock method; removes the owning mock object from the\n// registry when the last mock method associated with it has been\n// unregistered.  This is called only in the destructor of\n// FunctionMockerBase.\nvoid Mock::UnregisterLocked(internal::UntypedFunctionMockerBase* mocker)\n    GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex) {\n  internal::g_gmock_mutex.AssertHeld();\n  for (MockObjectRegistry::StateMap::iterator it =\n           g_mock_object_registry.states().begin();\n       it != g_mock_object_registry.states().end(); ++it) {\n    FunctionMockers& mockers = it->second.function_mockers;\n    if (mockers.erase(mocker) > 0) {\n      // mocker was in mockers and has been just removed.\n      if (mockers.empty()) {\n        g_mock_object_registry.states().erase(it);\n      }\n      return;\n    }\n  }\n}\n\n// Clears all ON_CALL()s set on the given mock object.\nvoid Mock::ClearDefaultActionsLocked(void* mock_obj)\n    GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex) {\n  internal::g_gmock_mutex.AssertHeld();\n\n  if (g_mock_object_registry.states().count(mock_obj) == 0) {\n    // No ON_CALL() was set on the given mock object.\n    return;\n  }\n\n  // Clears the default actions for each mock method in the given mock\n  // object.\n  FunctionMockers& mockers =\n      g_mock_object_registry.states()[mock_obj].function_mockers;\n  for (FunctionMockers::const_iterator it = mockers.begin();\n       it != mockers.end(); ++it) {\n    (*it)->ClearDefaultActionsLocked();\n  }\n\n  // We don't clear the content of mockers, as they may still be\n  // needed by VerifyAndClearExpectationsLocked().\n}\n\nExpectation::Expectation() {}\n\nExpectation::Expectation(\n    const std::shared_ptr<internal::ExpectationBase>& an_expectation_base)\n    : expectation_base_(an_expectation_base) {}\n\nExpectation::~Expectation() {}\n\n// Adds an expectation to a sequence.\nvoid Sequence::AddExpectation(const Expectation& expectation) const {\n  if (*last_expectation_ != expectation) {\n    if (last_expectation_->expectation_base() != nullptr) {\n      expectation.expectation_base()->immediate_prerequisites_\n          += *last_expectation_;\n    }\n    *last_expectation_ = expectation;\n  }\n}\n\n// Creates the implicit sequence if there isn't one.\nInSequence::InSequence() {\n  if (internal::g_gmock_implicit_sequence.get() == nullptr) {\n    internal::g_gmock_implicit_sequence.set(new Sequence);\n    sequence_created_ = true;\n  } else {\n    sequence_created_ = false;\n  }\n}\n\n// Deletes the implicit sequence if it was created by the constructor\n// of this object.\nInSequence::~InSequence() {\n  if (sequence_created_) {\n    delete internal::g_gmock_implicit_sequence.get();\n    internal::g_gmock_implicit_sequence.set(nullptr);\n  }\n}\n\n}  // namespace testing\n\n#ifdef _MSC_VER\n#if _MSC_VER == 1900\n#  pragma warning(pop)\n#endif\n#endif\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n\nnamespace testing {\n\nGMOCK_DEFINE_bool_(catch_leaked_mocks, true,\n                   \"true if and only if Google Mock should report leaked \"\n                   \"mock objects as failures.\");\n\nGMOCK_DEFINE_string_(verbose, internal::kWarningVerbosity,\n                     \"Controls how verbose Google Mock's output is.\"\n                     \"  Valid values:\\n\"\n                     \"  info    - prints all messages.\\n\"\n                     \"  warning - prints warnings and errors.\\n\"\n                     \"  error   - prints errors only.\");\n\nGMOCK_DEFINE_int32_(default_mock_behavior, 1,\n                    \"Controls the default behavior of mocks.\"\n                    \"  Valid values:\\n\"\n                    \"  0 - by default, mocks act as NiceMocks.\\n\"\n                    \"  1 - by default, mocks act as NaggyMocks.\\n\"\n                    \"  2 - by default, mocks act as StrictMocks.\");\n\nnamespace internal {\n\n// Parses a string as a command line flag.  The string should have the\n// format \"--gmock_flag=value\".  When def_optional is true, the\n// \"=value\" part can be omitted.\n//\n// Returns the value of the flag, or NULL if the parsing failed.\nstatic const char* ParseGoogleMockFlagValue(const char* str,\n                                            const char* flag,\n                                            bool def_optional) {\n  // str and flag must not be NULL.\n  if (str == nullptr || flag == nullptr) return nullptr;\n\n  // The flag must start with \"--gmock_\".\n  const std::string flag_str = std::string(\"--gmock_\") + flag;\n  const size_t flag_len = flag_str.length();\n  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return nullptr;\n\n  // Skips the flag name.\n  const char* flag_end = str + flag_len;\n\n  // When def_optional is true, it's OK to not have a \"=value\" part.\n  if (def_optional && (flag_end[0] == '\\0')) {\n    return flag_end;\n  }\n\n  // If def_optional is true and there are more characters after the\n  // flag name, or if def_optional is false, there must be a '=' after\n  // the flag name.\n  if (flag_end[0] != '=') return nullptr;\n\n  // Returns the string after \"=\".\n  return flag_end + 1;\n}\n\n// Parses a string for a Google Mock bool flag, in the form of\n// \"--gmock_flag=value\".\n//\n// On success, stores the value of the flag in *value, and returns\n// true.  On failure, returns false without changing *value.\nstatic bool ParseGoogleMockBoolFlag(const char* str, const char* flag,\n                                    bool* value) {\n  // Gets the value of the flag as a string.\n  const char* const value_str = ParseGoogleMockFlagValue(str, flag, true);\n\n  // Aborts if the parsing failed.\n  if (value_str == nullptr) return false;\n\n  // Converts the string value to a bool.\n  *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');\n  return true;\n}\n\n// Parses a string for a Google Mock string flag, in the form of\n// \"--gmock_flag=value\".\n//\n// On success, stores the value of the flag in *value, and returns\n// true.  On failure, returns false without changing *value.\ntemplate <typename String>\nstatic bool ParseGoogleMockStringFlag(const char* str, const char* flag,\n                                      String* value) {\n  // Gets the value of the flag as a string.\n  const char* const value_str = ParseGoogleMockFlagValue(str, flag, false);\n\n  // Aborts if the parsing failed.\n  if (value_str == nullptr) return false;\n\n  // Sets *value to the value of the flag.\n  *value = value_str;\n  return true;\n}\n\nstatic bool ParseGoogleMockIntFlag(const char* str, const char* flag,\n                                   int32_t* value) {\n  // Gets the value of the flag as a string.\n  const char* const value_str = ParseGoogleMockFlagValue(str, flag, true);\n\n  // Aborts if the parsing failed.\n  if (value_str == nullptr) return false;\n\n  // Sets *value to the value of the flag.\n  return ParseInt32(Message() << \"The value of flag --\" << flag,\n                    value_str, value);\n}\n\n// The internal implementation of InitGoogleMock().\n//\n// The type parameter CharType can be instantiated to either char or\n// wchar_t.\ntemplate <typename CharType>\nvoid InitGoogleMockImpl(int* argc, CharType** argv) {\n  // Makes sure Google Test is initialized.  InitGoogleTest() is\n  // idempotent, so it's fine if the user has already called it.\n  InitGoogleTest(argc, argv);\n  if (*argc <= 0) return;\n\n  for (int i = 1; i != *argc; i++) {\n    const std::string arg_string = StreamableToString(argv[i]);\n    const char* const arg = arg_string.c_str();\n\n    // Do we see a Google Mock flag?\n    if (ParseGoogleMockBoolFlag(arg, \"catch_leaked_mocks\",\n                                &GMOCK_FLAG(catch_leaked_mocks)) ||\n        ParseGoogleMockStringFlag(arg, \"verbose\", &GMOCK_FLAG(verbose)) ||\n        ParseGoogleMockIntFlag(arg, \"default_mock_behavior\",\n                               &GMOCK_FLAG(default_mock_behavior))) {\n      // Yes.  Shift the remainder of the argv list left by one.  Note\n      // that argv has (*argc + 1) elements, the last one always being\n      // NULL.  The following loop moves the trailing NULL element as\n      // well.\n      for (int j = i; j != *argc; j++) {\n        argv[j] = argv[j + 1];\n      }\n\n      // Decrements the argument count.\n      (*argc)--;\n\n      // We also need to decrement the iterator as we just removed\n      // an element.\n      i--;\n    }\n  }\n}\n\n}  // namespace internal\n\n// Initializes Google Mock.  This must be called before running the\n// tests.  In particular, it parses a command line for the flags that\n// Google Mock recognizes.  Whenever a Google Mock flag is seen, it is\n// removed from argv, and *argc is decremented.\n//\n// No value is returned.  Instead, the Google Mock flag variables are\n// updated.\n//\n// Since Google Test is needed for Google Mock to work, this function\n// also initializes Google Test and parses its flags, if that hasn't\n// been done.\nGTEST_API_ void InitGoogleMock(int* argc, char** argv) {\n  internal::InitGoogleMockImpl(argc, argv);\n}\n\n// This overloaded version can be used in Windows programs compiled in\n// UNICODE mode.\nGTEST_API_ void InitGoogleMock(int* argc, wchar_t** argv) {\n  internal::InitGoogleMockImpl(argc, argv);\n}\n\n// This overloaded version can be used on Arduino/embedded platforms where\n// there is no argc/argv.\nGTEST_API_ void InitGoogleMock() {\n  // Since Arduino doesn't have a command line, fake out the argc/argv arguments\n  int argc = 1;\n  const auto arg0 = \"dummy\";\n  char* argv0 = const_cast<char*>(arg0);\n  char** argv = &argv0;\n\n  internal::InitGoogleMockImpl(&argc, argv);\n}\n\n}  // namespace testing\n"
  },
  {
    "path": "examples/libraries/fmt/test/gtest/gtest/gtest-spi.h",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Utilities for testing Google Test itself and code that uses Google Test\n// (e.g. frameworks built on top of Google Test).\n\n// GOOGLETEST_CM0004 DO NOT DELETE\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_SPI_H_\n#define GOOGLETEST_INCLUDE_GTEST_GTEST_SPI_H_\n\n#include \"gtest/gtest.h\"\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\nnamespace testing {\n\n// This helper class can be used to mock out Google Test failure reporting\n// so that we can test Google Test or code that builds on Google Test.\n//\n// An object of this class appends a TestPartResult object to the\n// TestPartResultArray object given in the constructor whenever a Google Test\n// failure is reported. It can either intercept only failures that are\n// generated in the same thread that created this object or it can intercept\n// all generated failures. The scope of this mock object can be controlled with\n// the second argument to the two arguments constructor.\nclass GTEST_API_ ScopedFakeTestPartResultReporter\n    : public TestPartResultReporterInterface {\n public:\n  // The two possible mocking modes of this object.\n  enum InterceptMode {\n    INTERCEPT_ONLY_CURRENT_THREAD,  // Intercepts only thread local failures.\n    INTERCEPT_ALL_THREADS           // Intercepts all failures.\n  };\n\n  // The c'tor sets this object as the test part result reporter used\n  // by Google Test.  The 'result' parameter specifies where to report the\n  // results. This reporter will only catch failures generated in the current\n  // thread. DEPRECATED\n  explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);\n\n  // Same as above, but you can choose the interception scope of this object.\n  ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,\n                                   TestPartResultArray* result);\n\n  // The d'tor restores the previous test part result reporter.\n  ~ScopedFakeTestPartResultReporter() override;\n\n  // Appends the TestPartResult object to the TestPartResultArray\n  // received in the constructor.\n  //\n  // This method is from the TestPartResultReporterInterface\n  // interface.\n  void ReportTestPartResult(const TestPartResult& result) override;\n\n private:\n  void Init();\n\n  const InterceptMode intercept_mode_;\n  TestPartResultReporterInterface* old_reporter_;\n  TestPartResultArray* const result_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);\n};\n\nnamespace internal {\n\n// A helper class for implementing EXPECT_FATAL_FAILURE() and\n// EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given\n// TestPartResultArray contains exactly one failure that has the given\n// type and contains the given substring.  If that's not the case, a\n// non-fatal failure will be generated.\nclass GTEST_API_ SingleFailureChecker {\n public:\n  // The constructor remembers the arguments.\n  SingleFailureChecker(const TestPartResultArray* results,\n                       TestPartResult::Type type, const std::string& substr);\n  ~SingleFailureChecker();\n private:\n  const TestPartResultArray* const results_;\n  const TestPartResult::Type type_;\n  const std::string substr_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);\n};\n\n}  // namespace internal\n\n}  // namespace testing\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n// A set of macros for testing Google Test assertions or code that's expected\n// to generate Google Test fatal failures.  It verifies that the given\n// statement will cause exactly one fatal Google Test failure with 'substr'\n// being part of the failure message.\n//\n// There are two different versions of this macro. EXPECT_FATAL_FAILURE only\n// affects and considers failures generated in the current thread and\n// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.\n//\n// The verification of the assertion is done correctly even when the statement\n// throws an exception or aborts the current function.\n//\n// Known restrictions:\n//   - 'statement' cannot reference local non-static variables or\n//     non-static members of the current object.\n//   - 'statement' cannot return a value.\n//   - You cannot stream a failure message to this macro.\n//\n// Note that even though the implementations of the following two\n// macros are much alike, we cannot refactor them to use a common\n// helper macro, due to some peculiarity in how the preprocessor\n// works.  The AcceptsMacroThatExpandsToUnprotectedComma test in\n// gtest_unittest.cc will fail to compile if we do that.\n#define EXPECT_FATAL_FAILURE(statement, substr) \\\n  do { \\\n    class GTestExpectFatalFailureHelper {\\\n     public:\\\n      static void Execute() { statement; }\\\n    };\\\n    ::testing::TestPartResultArray gtest_failures;\\\n    ::testing::internal::SingleFailureChecker gtest_checker(\\\n        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\\\n    {\\\n      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\\\n          ::testing::ScopedFakeTestPartResultReporter:: \\\n          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\\\n      GTestExpectFatalFailureHelper::Execute();\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \\\n  do { \\\n    class GTestExpectFatalFailureHelper {\\\n     public:\\\n      static void Execute() { statement; }\\\n    };\\\n    ::testing::TestPartResultArray gtest_failures;\\\n    ::testing::internal::SingleFailureChecker gtest_checker(\\\n        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\\\n    {\\\n      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\\\n          ::testing::ScopedFakeTestPartResultReporter:: \\\n          INTERCEPT_ALL_THREADS, &gtest_failures);\\\n      GTestExpectFatalFailureHelper::Execute();\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n// A macro for testing Google Test assertions or code that's expected to\n// generate Google Test non-fatal failures.  It asserts that the given\n// statement will cause exactly one non-fatal Google Test failure with 'substr'\n// being part of the failure message.\n//\n// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only\n// affects and considers failures generated in the current thread and\n// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.\n//\n// 'statement' is allowed to reference local variables and members of\n// the current object.\n//\n// The verification of the assertion is done correctly even when the statement\n// throws an exception or aborts the current function.\n//\n// Known restrictions:\n//   - You cannot stream a failure message to this macro.\n//\n// Note that even though the implementations of the following two\n// macros are much alike, we cannot refactor them to use a common\n// helper macro, due to some peculiarity in how the preprocessor\n// works.  If we do that, the code won't compile when the user gives\n// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that\n// expands to code containing an unprotected comma.  The\n// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc\n// catches that.\n//\n// For the same reason, we have to write\n//   if (::testing::internal::AlwaysTrue()) { statement; }\n// instead of\n//   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)\n// to avoid an MSVC warning on unreachable code.\n#define EXPECT_NONFATAL_FAILURE(statement, substr) \\\n  do {\\\n    ::testing::TestPartResultArray gtest_failures;\\\n    ::testing::internal::SingleFailureChecker gtest_checker(\\\n        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \\\n        (substr));\\\n    {\\\n      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\\\n          ::testing::ScopedFakeTestPartResultReporter:: \\\n          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\\\n      if (::testing::internal::AlwaysTrue()) { statement; }\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \\\n  do {\\\n    ::testing::TestPartResultArray gtest_failures;\\\n    ::testing::internal::SingleFailureChecker gtest_checker(\\\n        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \\\n        (substr));\\\n    {\\\n      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\\\n          ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \\\n          &gtest_failures);\\\n      if (::testing::internal::AlwaysTrue()) { statement; }\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_SPI_H_\n"
  },
  {
    "path": "examples/libraries/fmt/test/gtest/gtest/gtest.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n//\n// This header file defines the public API for Google Test.  It should be\n// included by any test program that uses Google Test.\n//\n// IMPORTANT NOTE: Due to limitation of the C++ language, we have to\n// leave some internal implementation details in this header file.\n// They are clearly marked by comments like this:\n//\n//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n//\n// Such code is NOT meant to be used by a user directly, and is subject\n// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user\n// program!\n//\n// Acknowledgment: Google Test borrowed the idea of automatic test\n// registration from Barthelemy Dagenais' (barthelemy@prologique.com)\n// easyUnit framework.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_H_\n#define GOOGLETEST_INCLUDE_GTEST_GTEST_H_\n\n#include <cstddef>\n#include <limits>\n#include <memory>\n#include <ostream>\n#include <type_traits>\n#include <vector>\n\n// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n//\n// This header file declares functions and macros used internally by\n// Google Test.  They are subject to change without notice.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_\n#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_\n\n// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Low-level types and utilities for porting Google Test to various\n// platforms.  All macros ending with _ and symbols defined in an\n// internal namespace are subject to change without notice.  Code\n// outside Google Test MUST NOT USE THEM DIRECTLY.  Macros that don't\n// end with _ are part of Google Test's public API and can be used by\n// code outside Google Test.\n//\n// This file is fundamental to Google Test.  All other Google Test source\n// files are expected to #include this.  Therefore, it cannot #include\n// any other Google Test header.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_\n#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_\n\n// Environment-describing macros\n// -----------------------------\n//\n// Google Test can be used in many different environments.  Macros in\n// this section tell Google Test what kind of environment it is being\n// used in, such that Google Test can provide environment-specific\n// features and implementations.\n//\n// Google Test tries to automatically detect the properties of its\n// environment, so users usually don't need to worry about these\n// macros.  However, the automatic detection is not perfect.\n// Sometimes it's necessary for a user to define some of the following\n// macros in the build script to override Google Test's decisions.\n//\n// If the user doesn't define a macro in the list, Google Test will\n// provide a default definition.  After this header is #included, all\n// macros in this list will be defined to either 1 or 0.\n//\n// Notes to maintainers:\n//   - Each macro here is a user-tweakable knob; do not grow the list\n//     lightly.\n//   - Use #if to key off these macros.  Don't use #ifdef or \"#if\n//     defined(...)\", which will not work as these macros are ALWAYS\n//     defined.\n//\n//   GTEST_HAS_CLONE          - Define it to 1/0 to indicate that clone(2)\n//                              is/isn't available.\n//   GTEST_HAS_EXCEPTIONS     - Define it to 1/0 to indicate that exceptions\n//                              are enabled.\n//   GTEST_HAS_POSIX_RE       - Define it to 1/0 to indicate that POSIX regular\n//                              expressions are/aren't available.\n//   GTEST_HAS_PTHREAD        - Define it to 1/0 to indicate that <pthread.h>\n//                              is/isn't available.\n//   GTEST_HAS_RTTI           - Define it to 1/0 to indicate that RTTI is/isn't\n//                              enabled.\n//   GTEST_HAS_STD_WSTRING    - Define it to 1/0 to indicate that\n//                              std::wstring does/doesn't work (Google Test can\n//                              be used where std::wstring is unavailable).\n//   GTEST_HAS_SEH            - Define it to 1/0 to indicate whether the\n//                              compiler supports Microsoft's \"Structured\n//                              Exception Handling\".\n//   GTEST_HAS_STREAM_REDIRECTION\n//                            - Define it to 1/0 to indicate whether the\n//                              platform supports I/O stream redirection using\n//                              dup() and dup2().\n//   GTEST_LINKED_AS_SHARED_LIBRARY\n//                            - Define to 1 when compiling tests that use\n//                              Google Test as a shared library (known as\n//                              DLL on Windows).\n//   GTEST_CREATE_SHARED_LIBRARY\n//                            - Define to 1 when compiling Google Test itself\n//                              as a shared library.\n//   GTEST_DEFAULT_DEATH_TEST_STYLE\n//                            - The default value of --gtest_death_test_style.\n//                              The legacy default has been \"fast\" in the open\n//                              source version since 2008. The recommended value\n//                              is \"threadsafe\", and can be set in\n//                              custom/gtest-port.h.\n\n// Platform-indicating macros\n// --------------------------\n//\n// Macros indicating the platform on which Google Test is being used\n// (a macro is defined to 1 if compiled on the given platform;\n// otherwise UNDEFINED -- it's never defined to 0.).  Google Test\n// defines these macros automatically.  Code outside Google Test MUST\n// NOT define them.\n//\n//   GTEST_OS_AIX      - IBM AIX\n//   GTEST_OS_CYGWIN   - Cygwin\n//   GTEST_OS_DRAGONFLY - DragonFlyBSD\n//   GTEST_OS_FREEBSD  - FreeBSD\n//   GTEST_OS_FUCHSIA  - Fuchsia\n//   GTEST_OS_GNU_KFREEBSD - GNU/kFreeBSD\n//   GTEST_OS_HAIKU    - Haiku\n//   GTEST_OS_HPUX     - HP-UX\n//   GTEST_OS_LINUX    - Linux\n//     GTEST_OS_LINUX_ANDROID - Google Android\n//   GTEST_OS_MAC      - Mac OS X\n//     GTEST_OS_IOS    - iOS\n//   GTEST_OS_NACL     - Google Native Client (NaCl)\n//   GTEST_OS_NETBSD   - NetBSD\n//   GTEST_OS_OPENBSD  - OpenBSD\n//   GTEST_OS_OS2      - OS/2\n//   GTEST_OS_QNX      - QNX\n//   GTEST_OS_SOLARIS  - Sun Solaris\n//   GTEST_OS_WINDOWS  - Windows (Desktop, MinGW, or Mobile)\n//     GTEST_OS_WINDOWS_DESKTOP  - Windows Desktop\n//     GTEST_OS_WINDOWS_MINGW    - MinGW\n//     GTEST_OS_WINDOWS_MOBILE   - Windows Mobile\n//     GTEST_OS_WINDOWS_PHONE    - Windows Phone\n//     GTEST_OS_WINDOWS_RT       - Windows Store App/WinRT\n//   GTEST_OS_ZOS      - z/OS\n//\n// Among the platforms, Cygwin, Linux, Mac OS X, and Windows have the\n// most stable support.  Since core members of the Google Test project\n// don't have access to other platforms, support for them may be less\n// stable.  If you notice any problems on your platform, please notify\n// googletestframework@googlegroups.com (patches for fixing them are\n// even more welcome!).\n//\n// It is possible that none of the GTEST_OS_* macros are defined.\n\n// Feature-indicating macros\n// -------------------------\n//\n// Macros indicating which Google Test features are available (a macro\n// is defined to 1 if the corresponding feature is supported;\n// otherwise UNDEFINED -- it's never defined to 0.).  Google Test\n// defines these macros automatically.  Code outside Google Test MUST\n// NOT define them.\n//\n// These macros are public so that portable tests can be written.\n// Such tests typically surround code using a feature with an #if\n// which controls that code.  For example:\n//\n// #if GTEST_HAS_DEATH_TEST\n//   EXPECT_DEATH(DoSomethingDeadly());\n// #endif\n//\n//   GTEST_HAS_DEATH_TEST   - death tests\n//   GTEST_HAS_TYPED_TEST   - typed tests\n//   GTEST_HAS_TYPED_TEST_P - type-parameterized tests\n//   GTEST_IS_THREADSAFE    - Google Test is thread-safe.\n//   GOOGLETEST_CM0007 DO NOT DELETE\n//   GTEST_USES_POSIX_RE    - enhanced POSIX regex is used. Do not confuse with\n//                            GTEST_HAS_POSIX_RE (see above) which users can\n//                            define themselves.\n//   GTEST_USES_SIMPLE_RE   - our own simple regex is used;\n//                            the above RE\\b(s) are mutually exclusive.\n\n// Misc public macros\n// ------------------\n//\n//   GTEST_FLAG(flag_name)  - references the variable corresponding to\n//                            the given Google Test flag.\n\n// Internal utilities\n// ------------------\n//\n// The following macros and utilities are for Google Test's INTERNAL\n// use only.  Code outside Google Test MUST NOT USE THEM DIRECTLY.\n//\n// Macros for basic C++ coding:\n//   GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.\n//   GTEST_ATTRIBUTE_UNUSED_  - declares that a class' instances or a\n//                              variable don't have to be used.\n//   GTEST_DISALLOW_ASSIGN_   - disables copy operator=.\n//   GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.\n//   GTEST_DISALLOW_MOVE_ASSIGN_   - disables move operator=.\n//   GTEST_DISALLOW_MOVE_AND_ASSIGN_ - disables move ctor and operator=.\n//   GTEST_MUST_USE_RESULT_   - declares that a function's result must be used.\n//   GTEST_INTENTIONAL_CONST_COND_PUSH_ - start code section where MSVC C4127 is\n//                                        suppressed (constant conditional).\n//   GTEST_INTENTIONAL_CONST_COND_POP_  - finish code section where MSVC C4127\n//                                        is suppressed.\n//   GTEST_INTERNAL_HAS_ANY - for enabling UniversalPrinter<std::any> or\n//                            UniversalPrinter<absl::any> specializations.\n//   GTEST_INTERNAL_HAS_OPTIONAL - for enabling UniversalPrinter<std::optional>\n//   or\n//                                 UniversalPrinter<absl::optional>\n//                                 specializations.\n//   GTEST_INTERNAL_HAS_STRING_VIEW - for enabling Matcher<std::string_view> or\n//                                    Matcher<absl::string_view>\n//                                    specializations.\n//   GTEST_INTERNAL_HAS_VARIANT - for enabling UniversalPrinter<std::variant> or\n//                                UniversalPrinter<absl::variant>\n//                                specializations.\n//\n// Synchronization:\n//   Mutex, MutexLock, ThreadLocal, GetThreadCount()\n//                            - synchronization primitives.\n//\n// Regular expressions:\n//   RE             - a simple regular expression class using the POSIX\n//                    Extended Regular Expression syntax on UNIX-like platforms\n//                    GOOGLETEST_CM0008 DO NOT DELETE\n//                    or a reduced regular exception syntax on other\n//                    platforms, including Windows.\n// Logging:\n//   GTEST_LOG_()   - logs messages at the specified severity level.\n//   LogToStderr()  - directs all log messages to stderr.\n//   FlushInfoLog() - flushes informational log messages.\n//\n// Stdout and stderr capturing:\n//   CaptureStdout()     - starts capturing stdout.\n//   GetCapturedStdout() - stops capturing stdout and returns the captured\n//                         string.\n//   CaptureStderr()     - starts capturing stderr.\n//   GetCapturedStderr() - stops capturing stderr and returns the captured\n//                         string.\n//\n// Integer types:\n//   TypeWithSize   - maps an integer to a int type.\n//   TimeInMillis   - integers of known sizes.\n//   BiggestInt     - the biggest signed integer type.\n//\n// Command-line utilities:\n//   GTEST_DECLARE_*()  - declares a flag.\n//   GTEST_DEFINE_*()   - defines a flag.\n//   GetInjectableArgvs() - returns the command line as a vector of strings.\n//\n// Environment variable utilities:\n//   GetEnv()             - gets the value of an environment variable.\n//   BoolFromGTestEnv()   - parses a bool environment variable.\n//   Int32FromGTestEnv()  - parses an int32_t environment variable.\n//   StringFromGTestEnv() - parses a string environment variable.\n//\n// Deprecation warnings:\n//   GTEST_INTERNAL_DEPRECATED(message) - attribute marking a function as\n//                                        deprecated; calling a marked function\n//                                        should generate a compiler warning\n\n#include <ctype.h>   // for isspace, etc\n#include <stddef.h>  // for ptrdiff_t\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include <cerrno>\n#include <cstdint>\n#include <limits>\n#include <type_traits>\n\n#ifndef _WIN32_WCE\n# include <sys/types.h>\n# include <sys/stat.h>\n#endif  // !_WIN32_WCE\n\n#if defined __APPLE__\n# include <AvailabilityMacros.h>\n# include <TargetConditionals.h>\n#endif\n\n#include <iostream>  // NOLINT\n#include <locale>\n#include <memory>\n#include <string>  // NOLINT\n#include <tuple>\n#include <vector>  // NOLINT\n\n// Copyright 2015, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Injection point for custom user configurations. See README for details\n//\n// ** Custom implementation starts here **\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_\n#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_\n// Copyright 2015, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n//\n// This header file defines the GTEST_OS_* macro.\n// It is separate from gtest-port.h so that custom/gtest-port.h can include it.\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_\n#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_\n\n// Determines the platform on which Google Test is compiled.\n#ifdef __CYGWIN__\n# define GTEST_OS_CYGWIN 1\n# elif defined(__MINGW__) || defined(__MINGW32__) || defined(__MINGW64__)\n#  define GTEST_OS_WINDOWS_MINGW 1\n#  define GTEST_OS_WINDOWS 1\n#elif defined _WIN32\n# define GTEST_OS_WINDOWS 1\n# ifdef _WIN32_WCE\n#  define GTEST_OS_WINDOWS_MOBILE 1\n# elif defined(WINAPI_FAMILY)\n#  include <winapifamily.h>\n#  if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)\n#   define GTEST_OS_WINDOWS_DESKTOP 1\n#  elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)\n#   define GTEST_OS_WINDOWS_PHONE 1\n#  elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)\n#   define GTEST_OS_WINDOWS_RT 1\n#  elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_TV_TITLE)\n#   define GTEST_OS_WINDOWS_PHONE 1\n#   define GTEST_OS_WINDOWS_TV_TITLE 1\n#  else\n    // WINAPI_FAMILY defined but no known partition matched.\n    // Default to desktop.\n#   define GTEST_OS_WINDOWS_DESKTOP 1\n#  endif\n# else\n#  define GTEST_OS_WINDOWS_DESKTOP 1\n# endif  // _WIN32_WCE\n#elif defined __OS2__\n# define GTEST_OS_OS2 1\n#elif defined __APPLE__\n# define GTEST_OS_MAC 1\n# include <TargetConditionals.h>\n# if TARGET_OS_IPHONE\n#  define GTEST_OS_IOS 1\n# endif\n#elif defined __DragonFly__\n# define GTEST_OS_DRAGONFLY 1\n#elif defined __FreeBSD__\n# define GTEST_OS_FREEBSD 1\n#elif defined __Fuchsia__\n# define GTEST_OS_FUCHSIA 1\n#elif defined(__GLIBC__) && defined(__FreeBSD_kernel__)\n# define GTEST_OS_GNU_KFREEBSD 1\n#elif defined __linux__\n# define GTEST_OS_LINUX 1\n# if defined __ANDROID__\n#  define GTEST_OS_LINUX_ANDROID 1\n# endif\n#elif defined __MVS__\n# define GTEST_OS_ZOS 1\n#elif defined(__sun) && defined(__SVR4)\n# define GTEST_OS_SOLARIS 1\n#elif defined(_AIX)\n# define GTEST_OS_AIX 1\n#elif defined(__hpux)\n# define GTEST_OS_HPUX 1\n#elif defined __native_client__\n# define GTEST_OS_NACL 1\n#elif defined __NetBSD__\n# define GTEST_OS_NETBSD 1\n#elif defined __OpenBSD__\n# define GTEST_OS_OPENBSD 1\n#elif defined __QNX__\n# define GTEST_OS_QNX 1\n#elif defined(__HAIKU__)\n#define GTEST_OS_HAIKU 1\n#elif defined ESP8266\n#define GTEST_OS_ESP8266 1\n#elif defined ESP32\n#define GTEST_OS_ESP32 1\n#elif defined(__XTENSA__)\n#define GTEST_OS_XTENSA 1\n#endif  // __CYGWIN__\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_\n\n#if !defined(GTEST_DEV_EMAIL_)\n# define GTEST_DEV_EMAIL_ \"googletestframework@@googlegroups.com\"\n# define GTEST_FLAG_PREFIX_ \"gtest_\"\n# define GTEST_FLAG_PREFIX_DASH_ \"gtest-\"\n# define GTEST_FLAG_PREFIX_UPPER_ \"GTEST_\"\n# define GTEST_NAME_ \"Google Test\"\n# define GTEST_PROJECT_URL_ \"https://github.com/google/googletest/\"\n#endif  // !defined(GTEST_DEV_EMAIL_)\n\n#if !defined(GTEST_INIT_GOOGLE_TEST_NAME_)\n# define GTEST_INIT_GOOGLE_TEST_NAME_ \"testing::InitGoogleTest\"\n#endif  // !defined(GTEST_INIT_GOOGLE_TEST_NAME_)\n\n// Determines the version of gcc that is used to compile this.\n#ifdef __GNUC__\n// 40302 means version 4.3.2.\n# define GTEST_GCC_VER_ \\\n    (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)\n#endif  // __GNUC__\n\n// Macros for disabling Microsoft Visual C++ warnings.\n//\n//   GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 4385)\n//   /* code that triggers warnings C4800 and C4385 */\n//   GTEST_DISABLE_MSC_WARNINGS_POP_()\n#if defined(_MSC_VER)\n# define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) \\\n    __pragma(warning(push))                        \\\n    __pragma(warning(disable: warnings))\n# define GTEST_DISABLE_MSC_WARNINGS_POP_()          \\\n    __pragma(warning(pop))\n#else\n// Not all compilers are MSVC\n# define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings)\n# define GTEST_DISABLE_MSC_WARNINGS_POP_()\n#endif\n\n// Clang on Windows does not understand MSVC's pragma warning.\n// We need clang-specific way to disable function deprecation warning.\n#ifdef __clang__\n# define GTEST_DISABLE_MSC_DEPRECATED_PUSH_()                         \\\n    _Pragma(\"clang diagnostic push\")                                  \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wdeprecated-declarations\\\"\") \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wdeprecated-implementations\\\"\")\n#define GTEST_DISABLE_MSC_DEPRECATED_POP_() \\\n    _Pragma(\"clang diagnostic pop\")\n#else\n# define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \\\n    GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996)\n# define GTEST_DISABLE_MSC_DEPRECATED_POP_() \\\n    GTEST_DISABLE_MSC_WARNINGS_POP_()\n#endif\n\n// Brings in definitions for functions used in the testing::internal::posix\n// namespace (read, write, close, chdir, isatty, stat). We do not currently\n// use them on Windows Mobile.\n#if GTEST_OS_WINDOWS\n# if !GTEST_OS_WINDOWS_MOBILE\n#  include <direct.h>\n#  include <io.h>\n# endif\n// In order to avoid having to include <windows.h>, use forward declaration\n#if GTEST_OS_WINDOWS_MINGW && !defined(__MINGW64_VERSION_MAJOR)\n// MinGW defined _CRITICAL_SECTION and _RTL_CRITICAL_SECTION as two\n// separate (equivalent) structs, instead of using typedef\ntypedef struct _CRITICAL_SECTION GTEST_CRITICAL_SECTION;\n#else\n// Assume CRITICAL_SECTION is a typedef of _RTL_CRITICAL_SECTION.\n// This assumption is verified by\n// WindowsTypesTest.CRITICAL_SECTIONIs_RTL_CRITICAL_SECTION.\ntypedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;\n#endif\n#elif GTEST_OS_XTENSA\n#include <unistd.h>\n// Xtensa toolchains define strcasecmp in the string.h header instead of\n// strings.h. string.h is already included.\n#else\n// This assumes that non-Windows OSes provide unistd.h. For OSes where this\n// is not the case, we need to include headers that provide the functions\n// mentioned above.\n# include <unistd.h>\n# include <strings.h>\n#endif  // GTEST_OS_WINDOWS\n\n#if GTEST_OS_LINUX_ANDROID\n// Used to define __ANDROID_API__ matching the target NDK API level.\n#  include <android/api-level.h>  // NOLINT\n#endif\n\n// Defines this to true if and only if Google Test can use POSIX regular\n// expressions.\n#ifndef GTEST_HAS_POSIX_RE\n# if GTEST_OS_LINUX_ANDROID\n// On Android, <regex.h> is only available starting with Gingerbread.\n#  define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)\n# else\n#define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS && !GTEST_OS_XTENSA)\n# endif\n#endif\n\n#if GTEST_USES_PCRE\n// The appropriate headers have already been included.\n\n#elif GTEST_HAS_POSIX_RE\n\n// On some platforms, <regex.h> needs someone to define size_t, and\n// won't compile otherwise.  We can #include it here as we already\n// included <stdlib.h>, which is guaranteed to define size_t through\n// <stddef.h>.\n# include <regex.h>  // NOLINT\n\n# define GTEST_USES_POSIX_RE 1\n\n#elif GTEST_OS_WINDOWS\n\n// <regex.h> is not available on Windows.  Use our own simple regex\n// implementation instead.\n# define GTEST_USES_SIMPLE_RE 1\n\n#else\n\n// <regex.h> may not be available on this platform.  Use our own\n// simple regex implementation instead.\n# define GTEST_USES_SIMPLE_RE 1\n\n#endif  // GTEST_USES_PCRE\n\n#ifndef GTEST_HAS_EXCEPTIONS\n// The user didn't tell us whether exceptions are enabled, so we need\n// to figure it out.\n# if defined(_MSC_VER) && defined(_CPPUNWIND)\n// MSVC defines _CPPUNWIND to 1 if and only if exceptions are enabled.\n#  define GTEST_HAS_EXCEPTIONS 1\n# elif defined(__BORLANDC__)\n// C++Builder's implementation of the STL uses the _HAS_EXCEPTIONS\n// macro to enable exceptions, so we'll do the same.\n// Assumes that exceptions are enabled by default.\n#  ifndef _HAS_EXCEPTIONS\n#   define _HAS_EXCEPTIONS 1\n#  endif  // _HAS_EXCEPTIONS\n#  define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS\n# elif defined(__clang__)\n// clang defines __EXCEPTIONS if and only if exceptions are enabled before clang\n// 220714, but if and only if cleanups are enabled after that. In Obj-C++ files,\n// there can be cleanups for ObjC exceptions which also need cleanups, even if\n// C++ exceptions are disabled. clang has __has_feature(cxx_exceptions) which\n// checks for C++ exceptions starting at clang r206352, but which checked for\n// cleanups prior to that. To reliably check for C++ exception availability with\n// clang, check for\n// __EXCEPTIONS && __has_feature(cxx_exceptions).\n#  define GTEST_HAS_EXCEPTIONS (__EXCEPTIONS && __has_feature(cxx_exceptions))\n# elif defined(__GNUC__) && __EXCEPTIONS\n// gcc defines __EXCEPTIONS to 1 if and only if exceptions are enabled.\n#  define GTEST_HAS_EXCEPTIONS 1\n# elif defined(__SUNPRO_CC)\n// Sun Pro CC supports exceptions.  However, there is no compile-time way of\n// detecting whether they are enabled or not.  Therefore, we assume that\n// they are enabled unless the user tells us otherwise.\n#  define GTEST_HAS_EXCEPTIONS 1\n# elif defined(__IBMCPP__) && __EXCEPTIONS\n// xlC defines __EXCEPTIONS to 1 if and only if exceptions are enabled.\n#  define GTEST_HAS_EXCEPTIONS 1\n# elif defined(__HP_aCC)\n// Exception handling is in effect by default in HP aCC compiler. It has to\n// be turned of by +noeh compiler option if desired.\n#  define GTEST_HAS_EXCEPTIONS 1\n# else\n// For other compilers, we assume exceptions are disabled to be\n// conservative.\n#  define GTEST_HAS_EXCEPTIONS 0\n# endif  // defined(_MSC_VER) || defined(__BORLANDC__)\n#endif  // GTEST_HAS_EXCEPTIONS\n\n#ifndef GTEST_HAS_STD_WSTRING\n// The user didn't tell us whether ::std::wstring is available, so we need\n// to figure it out.\n// Cygwin 1.7 and below doesn't support ::std::wstring.\n// Solaris' libc++ doesn't support it either.  Android has\n// no support for it at least as recent as Froyo (2.2).\n#define GTEST_HAS_STD_WSTRING                                         \\\n  (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \\\n     GTEST_OS_HAIKU || GTEST_OS_ESP32 || GTEST_OS_ESP8266 || GTEST_OS_XTENSA))\n\n#endif  // GTEST_HAS_STD_WSTRING\n\n// Determines whether RTTI is available.\n#ifndef GTEST_HAS_RTTI\n// The user didn't tell us whether RTTI is enabled, so we need to\n// figure it out.\n\n# ifdef _MSC_VER\n\n#ifdef _CPPRTTI  // MSVC defines this macro if and only if RTTI is enabled.\n#   define GTEST_HAS_RTTI 1\n#  else\n#   define GTEST_HAS_RTTI 0\n#  endif\n\n// Starting with version 4.3.2, gcc defines __GXX_RTTI if and only if RTTI is\n// enabled.\n# elif defined(__GNUC__)\n\n#  ifdef __GXX_RTTI\n// When building against STLport with the Android NDK and with\n// -frtti -fno-exceptions, the build fails at link time with undefined\n// references to __cxa_bad_typeid. Note sure if STL or toolchain bug,\n// so disable RTTI when detected.\n#   if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \\\n       !defined(__EXCEPTIONS)\n#    define GTEST_HAS_RTTI 0\n#   else\n#    define GTEST_HAS_RTTI 1\n#   endif  // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS\n#  else\n#   define GTEST_HAS_RTTI 0\n#  endif  // __GXX_RTTI\n\n// Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends\n// using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the\n// first version with C++ support.\n# elif defined(__clang__)\n\n#  define GTEST_HAS_RTTI __has_feature(cxx_rtti)\n\n// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if\n// both the typeid and dynamic_cast features are present.\n# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)\n\n#  ifdef __RTTI_ALL__\n#   define GTEST_HAS_RTTI 1\n#  else\n#   define GTEST_HAS_RTTI 0\n#  endif\n\n# else\n\n// For all other compilers, we assume RTTI is enabled.\n#  define GTEST_HAS_RTTI 1\n\n# endif  // _MSC_VER\n\n#endif  // GTEST_HAS_RTTI\n\n// It's this header's responsibility to #include <typeinfo> when RTTI\n// is enabled.\n#if GTEST_HAS_RTTI\n# include <typeinfo>\n#endif\n\n// Determines whether Google Test can use the pthreads library.\n#ifndef GTEST_HAS_PTHREAD\n// The user didn't tell us explicitly, so we make reasonable assumptions about\n// which platforms have pthreads support.\n//\n// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0\n// to your compiler flags.\n#define GTEST_HAS_PTHREAD                                                      \\\n  (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX || GTEST_OS_QNX ||          \\\n   GTEST_OS_FREEBSD || GTEST_OS_NACL || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA || \\\n   GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_OPENBSD ||          \\\n   GTEST_OS_HAIKU)\n#endif  // GTEST_HAS_PTHREAD\n\n#if GTEST_HAS_PTHREAD\n// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is\n// true.\n# include <pthread.h>  // NOLINT\n\n// For timespec and nanosleep, used below.\n# include <time.h>  // NOLINT\n#endif\n\n// Determines whether clone(2) is supported.\n// Usually it will only be available on Linux, excluding\n// Linux on the Itanium architecture.\n// Also see http://linux.die.net/man/2/clone.\n#ifndef GTEST_HAS_CLONE\n// The user didn't tell us, so we need to figure it out.\n\n# if GTEST_OS_LINUX && !defined(__ia64__)\n#  if GTEST_OS_LINUX_ANDROID\n// On Android, clone() became available at different API levels for each 32-bit\n// architecture.\n#    if defined(__LP64__) || \\\n        (defined(__arm__) && __ANDROID_API__ >= 9) || \\\n        (defined(__mips__) && __ANDROID_API__ >= 12) || \\\n        (defined(__i386__) && __ANDROID_API__ >= 17)\n#     define GTEST_HAS_CLONE 1\n#    else\n#     define GTEST_HAS_CLONE 0\n#    endif\n#  else\n#   define GTEST_HAS_CLONE 1\n#  endif\n# else\n#  define GTEST_HAS_CLONE 0\n# endif  // GTEST_OS_LINUX && !defined(__ia64__)\n\n#endif  // GTEST_HAS_CLONE\n\n// Determines whether to support stream redirection. This is used to test\n// output correctness and to implement death tests.\n#ifndef GTEST_HAS_STREAM_REDIRECTION\n// By default, we assume that stream redirection is supported on all\n// platforms except known mobile ones.\n#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \\\n    GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_XTENSA\n#  define GTEST_HAS_STREAM_REDIRECTION 0\n# else\n#  define GTEST_HAS_STREAM_REDIRECTION 1\n# endif  // !GTEST_OS_WINDOWS_MOBILE\n#endif  // GTEST_HAS_STREAM_REDIRECTION\n\n// Determines whether to support death tests.\n// pops up a dialog window that cannot be suppressed programmatically.\n#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS ||             \\\n     (GTEST_OS_MAC && !GTEST_OS_IOS) ||                                   \\\n     (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER) || GTEST_OS_WINDOWS_MINGW ||  \\\n     GTEST_OS_AIX || GTEST_OS_HPUX || GTEST_OS_OPENBSD || GTEST_OS_QNX || \\\n     GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA ||           \\\n     GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_HAIKU)\n# define GTEST_HAS_DEATH_TEST 1\n#endif\n\n// Determines whether to support type-driven tests.\n\n// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,\n// Sun Pro CC, IBM Visual Age, and HP aCC support.\n#if defined(__GNUC__) || defined(_MSC_VER) || defined(__SUNPRO_CC) || \\\n    defined(__IBMCPP__) || defined(__HP_aCC)\n# define GTEST_HAS_TYPED_TEST 1\n# define GTEST_HAS_TYPED_TEST_P 1\n#endif\n\n// Determines whether the system compiler uses UTF-16 for encoding wide strings.\n#define GTEST_WIDE_STRING_USES_UTF16_ \\\n  (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_AIX || GTEST_OS_OS2)\n\n// Determines whether test results can be streamed to a socket.\n#if GTEST_OS_LINUX || GTEST_OS_GNU_KFREEBSD || GTEST_OS_DRAGONFLY || \\\n    GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_OPENBSD\n# define GTEST_CAN_STREAM_RESULTS_ 1\n#endif\n\n// Defines some utility macros.\n\n// The GNU compiler emits a warning if nested \"if\" statements are followed by\n// an \"else\" statement and braces are not used to explicitly disambiguate the\n// \"else\" binding.  This leads to problems with code like:\n//\n//   if (gate)\n//     ASSERT_*(condition) << \"Some message\";\n//\n// The \"switch (0) case 0:\" idiom is used to suppress this.\n#ifdef __INTEL_COMPILER\n# define GTEST_AMBIGUOUS_ELSE_BLOCKER_\n#else\n# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default:  // NOLINT\n#endif\n\n// Use this annotation at the end of a struct/class definition to\n// prevent the compiler from optimizing away instances that are never\n// used.  This is useful when all interesting logic happens inside the\n// c'tor and / or d'tor.  Example:\n//\n//   struct Foo {\n//     Foo() { ... }\n//   } GTEST_ATTRIBUTE_UNUSED_;\n//\n// Also use it after a variable or parameter declaration to tell the\n// compiler the variable/parameter does not have to be used.\n#if defined(__GNUC__) && !defined(COMPILER_ICC)\n# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))\n#elif defined(__clang__)\n# if __has_attribute(unused)\n#  define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))\n# endif\n#endif\n#ifndef GTEST_ATTRIBUTE_UNUSED_\n# define GTEST_ATTRIBUTE_UNUSED_\n#endif\n\n// Use this annotation before a function that takes a printf format string.\n#if (defined(__GNUC__) || defined(__clang__)) && !defined(COMPILER_ICC)\n# if defined(__MINGW_PRINTF_FORMAT)\n// MinGW has two different printf implementations. Ensure the format macro\n// matches the selected implementation. See\n// https://sourceforge.net/p/mingw-w64/wiki2/gnu%20printf/.\n#  define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \\\n       __attribute__((__format__(__MINGW_PRINTF_FORMAT, string_index, \\\n                                 first_to_check)))\n# else\n#  define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \\\n       __attribute__((__format__(__printf__, string_index, first_to_check)))\n# endif\n#else\n# define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check)\n#endif\n\n\n// A macro to disallow copy operator=\n// This should be used in the private: declarations for a class.\n#define GTEST_DISALLOW_ASSIGN_(type) \\\n  type& operator=(type const &) = delete\n\n// A macro to disallow copy constructor and operator=\n// This should be used in the private: declarations for a class.\n#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \\\n  type(type const&) = delete;                 \\\n  type& operator=(type const&) = delete\n\n// A macro to disallow move operator=\n// This should be used in the private: declarations for a class.\n#define GTEST_DISALLOW_MOVE_ASSIGN_(type) \\\n  type& operator=(type &&) noexcept = delete\n\n// A macro to disallow move constructor and operator=\n// This should be used in the private: declarations for a class.\n#define GTEST_DISALLOW_MOVE_AND_ASSIGN_(type) \\\n  type(type&&) noexcept = delete;             \\\n  type& operator=(type&&) noexcept = delete\n\n// Tell the compiler to warn about unused return values for functions declared\n// with this macro.  The macro should be used on function declarations\n// following the argument list:\n//\n//   Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;\n#if defined(__GNUC__) && !defined(COMPILER_ICC)\n# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))\n#else\n# define GTEST_MUST_USE_RESULT_\n#endif  // __GNUC__ && !COMPILER_ICC\n\n// MS C++ compiler emits warning when a conditional expression is compile time\n// constant. In some contexts this warning is false positive and needs to be\n// suppressed. Use the following two macros in such cases:\n//\n// GTEST_INTENTIONAL_CONST_COND_PUSH_()\n// while (true) {\n// GTEST_INTENTIONAL_CONST_COND_POP_()\n// }\n# define GTEST_INTENTIONAL_CONST_COND_PUSH_() \\\n    GTEST_DISABLE_MSC_WARNINGS_PUSH_(4127)\n# define GTEST_INTENTIONAL_CONST_COND_POP_() \\\n    GTEST_DISABLE_MSC_WARNINGS_POP_()\n\n// Determine whether the compiler supports Microsoft's Structured Exception\n// Handling.  This is supported by several Windows compilers but generally\n// does not exist on any other system.\n#ifndef GTEST_HAS_SEH\n// The user didn't tell us, so we need to figure it out.\n\n# if defined(_MSC_VER) || defined(__BORLANDC__)\n// These two compilers are known to support SEH.\n#  define GTEST_HAS_SEH 1\n# else\n// Assume no SEH.\n#  define GTEST_HAS_SEH 0\n# endif\n\n#endif  // GTEST_HAS_SEH\n\n#ifndef GTEST_IS_THREADSAFE\n\n#define GTEST_IS_THREADSAFE                                                 \\\n  (GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ ||                                     \\\n   (GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) || \\\n   GTEST_HAS_PTHREAD)\n\n#endif  // GTEST_IS_THREADSAFE\n\n// GTEST_API_ qualifies all symbols that must be exported. The definitions below\n// are guarded by #ifndef to give embedders a chance to define GTEST_API_ in\n// gtest/internal/custom/gtest-port.h\n#ifndef GTEST_API_\n\n#ifdef _MSC_VER\n# if GTEST_LINKED_AS_SHARED_LIBRARY\n#  define GTEST_API_ __declspec(dllimport)\n# elif GTEST_CREATE_SHARED_LIBRARY\n#  define GTEST_API_ __declspec(dllexport)\n# endif\n#elif __GNUC__ >= 4 || defined(__clang__)\n# define GTEST_API_ __attribute__((visibility (\"default\")))\n#endif  // _MSC_VER\n\n#endif  // GTEST_API_\n\n#ifndef GTEST_API_\n# define GTEST_API_\n#endif  // GTEST_API_\n\n#ifndef GTEST_DEFAULT_DEATH_TEST_STYLE\n# define GTEST_DEFAULT_DEATH_TEST_STYLE  \"fast\"\n#endif  // GTEST_DEFAULT_DEATH_TEST_STYLE\n\n#ifdef __GNUC__\n// Ask the compiler to never inline a given function.\n# define GTEST_NO_INLINE_ __attribute__((noinline))\n#else\n# define GTEST_NO_INLINE_\n#endif\n\n// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project.\n#if !defined(GTEST_HAS_CXXABI_H_)\n# if defined(__GLIBCXX__) || (defined(_LIBCPP_VERSION) && !defined(_MSC_VER))\n#  define GTEST_HAS_CXXABI_H_ 1\n# else\n#  define GTEST_HAS_CXXABI_H_ 0\n# endif\n#endif\n\n// A function level attribute to disable checking for use of uninitialized\n// memory when built with MemorySanitizer.\n#if defined(__clang__)\n# if __has_feature(memory_sanitizer)\n#  define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ \\\n       __attribute__((no_sanitize_memory))\n# else\n#  define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_\n# endif  // __has_feature(memory_sanitizer)\n#else\n# define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_\n#endif  // __clang__\n\n// A function level attribute to disable AddressSanitizer instrumentation.\n#if defined(__clang__)\n# if __has_feature(address_sanitizer)\n#  define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ \\\n       __attribute__((no_sanitize_address))\n# else\n#  define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_\n# endif  // __has_feature(address_sanitizer)\n#else\n# define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_\n#endif  // __clang__\n\n// A function level attribute to disable HWAddressSanitizer instrumentation.\n#if defined(__clang__)\n# if __has_feature(hwaddress_sanitizer)\n#  define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ \\\n       __attribute__((no_sanitize(\"hwaddress\")))\n# else\n#  define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_\n# endif  // __has_feature(hwaddress_sanitizer)\n#else\n# define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_\n#endif  // __clang__\n\n// A function level attribute to disable ThreadSanitizer instrumentation.\n#if defined(__clang__)\n# if __has_feature(thread_sanitizer)\n#  define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ \\\n       __attribute__((no_sanitize_thread))\n# else\n#  define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_\n# endif  // __has_feature(thread_sanitizer)\n#else\n# define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_\n#endif  // __clang__\n\nnamespace testing {\n\nclass Message;\n\n// Legacy imports for backwards compatibility.\n// New code should use std:: names directly.\nusing std::get;\nusing std::make_tuple;\nusing std::tuple;\nusing std::tuple_element;\nusing std::tuple_size;\n\nnamespace internal {\n\n// A secret type that Google Test users don't know about.  It has no\n// definition on purpose.  Therefore it's impossible to create a\n// Secret object, which is what we want.\nclass Secret;\n\n// The GTEST_COMPILE_ASSERT_ is a legacy macro used to verify that a compile\n// time expression is true (in new code, use static_assert instead). For\n// example, you could use it to verify the size of a static array:\n//\n//   GTEST_COMPILE_ASSERT_(GTEST_ARRAY_SIZE_(names) == NUM_NAMES,\n//                         names_incorrect_size);\n//\n// The second argument to the macro must be a valid C++ identifier. If the\n// expression is false, compiler will issue an error containing this identifier.\n#define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg)\n\n// A helper for suppressing warnings on constant condition.  It just\n// returns 'condition'.\nGTEST_API_ bool IsTrue(bool condition);\n\n// Defines RE.\n\n#if GTEST_USES_PCRE\n// if used, PCRE is injected by custom/gtest-port.h\n#elif GTEST_USES_POSIX_RE || GTEST_USES_SIMPLE_RE\n\n// A simple C++ wrapper for <regex.h>.  It uses the POSIX Extended\n// Regular Expression syntax.\nclass GTEST_API_ RE {\n public:\n  // A copy constructor is required by the Standard to initialize object\n  // references from r-values.\n  RE(const RE& other) { Init(other.pattern()); }\n\n  // Constructs an RE from a string.\n  RE(const ::std::string& regex) { Init(regex.c_str()); }  // NOLINT\n\n  RE(const char* regex) { Init(regex); }  // NOLINT\n  ~RE();\n\n  // Returns the string representation of the regex.\n  const char* pattern() const { return pattern_; }\n\n  // FullMatch(str, re) returns true if and only if regular expression re\n  // matches the entire str.\n  // PartialMatch(str, re) returns true if and only if regular expression re\n  // matches a substring of str (including str itself).\n  static bool FullMatch(const ::std::string& str, const RE& re) {\n    return FullMatch(str.c_str(), re);\n  }\n  static bool PartialMatch(const ::std::string& str, const RE& re) {\n    return PartialMatch(str.c_str(), re);\n  }\n\n  static bool FullMatch(const char* str, const RE& re);\n  static bool PartialMatch(const char* str, const RE& re);\n\n private:\n  void Init(const char* regex);\n  const char* pattern_;\n  bool is_valid_;\n\n# if GTEST_USES_POSIX_RE\n\n  regex_t full_regex_;     // For FullMatch().\n  regex_t partial_regex_;  // For PartialMatch().\n\n# else  // GTEST_USES_SIMPLE_RE\n\n  const char* full_pattern_;  // For FullMatch();\n\n# endif\n};\n\n#endif  // GTEST_USES_PCRE\n\n// Formats a source file path and a line number as they would appear\n// in an error message from the compiler used to compile this code.\nGTEST_API_ ::std::string FormatFileLocation(const char* file, int line);\n\n// Formats a file location for compiler-independent XML output.\n// Although this function is not platform dependent, we put it next to\n// FormatFileLocation in order to contrast the two functions.\nGTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,\n                                                               int line);\n\n// Defines logging utilities:\n//   GTEST_LOG_(severity) - logs messages at the specified severity level. The\n//                          message itself is streamed into the macro.\n//   LogToStderr()  - directs all log messages to stderr.\n//   FlushInfoLog() - flushes informational log messages.\n\nenum GTestLogSeverity {\n  GTEST_INFO,\n  GTEST_WARNING,\n  GTEST_ERROR,\n  GTEST_FATAL\n};\n\n// Formats log entry severity, provides a stream object for streaming the\n// log message, and terminates the message with a newline when going out of\n// scope.\nclass GTEST_API_ GTestLog {\n public:\n  GTestLog(GTestLogSeverity severity, const char* file, int line);\n\n  // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.\n  ~GTestLog();\n\n  ::std::ostream& GetStream() { return ::std::cerr; }\n\n private:\n  const GTestLogSeverity severity_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);\n};\n\n#if !defined(GTEST_LOG_)\n\n# define GTEST_LOG_(severity) \\\n    ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \\\n                                  __FILE__, __LINE__).GetStream()\n\ninline void LogToStderr() {}\ninline void FlushInfoLog() { fflush(nullptr); }\n\n#endif  // !defined(GTEST_LOG_)\n\n#if !defined(GTEST_CHECK_)\n// INTERNAL IMPLEMENTATION - DO NOT USE.\n//\n// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition\n// is not satisfied.\n//  Synopsys:\n//    GTEST_CHECK_(boolean_condition);\n//     or\n//    GTEST_CHECK_(boolean_condition) << \"Additional message\";\n//\n//    This checks the condition and if the condition is not satisfied\n//    it prints message about the condition violation, including the\n//    condition itself, plus additional message streamed into it, if any,\n//    and then it aborts the program. It aborts the program irrespective of\n//    whether it is built in the debug mode or not.\n# define GTEST_CHECK_(condition) \\\n    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n    if (::testing::internal::IsTrue(condition)) \\\n      ; \\\n    else \\\n      GTEST_LOG_(FATAL) << \"Condition \" #condition \" failed. \"\n#endif  // !defined(GTEST_CHECK_)\n\n// An all-mode assert to verify that the given POSIX-style function\n// call returns 0 (indicating success).  Known limitation: this\n// doesn't expand to a balanced 'if' statement, so enclose the macro\n// in {} if you need to use it as the only statement in an 'if'\n// branch.\n#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \\\n  if (const int gtest_error = (posix_call)) \\\n    GTEST_LOG_(FATAL) << #posix_call << \"failed with error \" \\\n                      << gtest_error\n\n// Transforms \"T\" into \"const T&\" according to standard reference collapsing\n// rules (this is only needed as a backport for C++98 compilers that do not\n// support reference collapsing). Specifically, it transforms:\n//\n//   char         ==> const char&\n//   const char   ==> const char&\n//   char&        ==> char&\n//   const char&  ==> const char&\n//\n// Note that the non-const reference will not have \"const\" added. This is\n// standard, and necessary so that \"T\" can always bind to \"const T&\".\ntemplate <typename T>\nstruct ConstRef { typedef const T& type; };\ntemplate <typename T>\nstruct ConstRef<T&> { typedef T& type; };\n\n// The argument T must depend on some template parameters.\n#define GTEST_REFERENCE_TO_CONST_(T) \\\n  typename ::testing::internal::ConstRef<T>::type\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Use ImplicitCast_ as a safe version of static_cast for upcasting in\n// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a\n// const Foo*).  When you use ImplicitCast_, the compiler checks that\n// the cast is safe.  Such explicit ImplicitCast_s are necessary in\n// surprisingly many situations where C++ demands an exact type match\n// instead of an argument type convertable to a target type.\n//\n// The syntax for using ImplicitCast_ is the same as for static_cast:\n//\n//   ImplicitCast_<ToType>(expr)\n//\n// ImplicitCast_ would have been part of the C++ standard library,\n// but the proposal was submitted too late.  It will probably make\n// its way into the language in the future.\n//\n// This relatively ugly name is intentional. It prevents clashes with\n// similar functions users may have (e.g., implicit_cast). The internal\n// namespace alone is not enough because the function can be found by ADL.\ntemplate<typename To>\ninline To ImplicitCast_(To x) { return x; }\n\n// When you upcast (that is, cast a pointer from type Foo to type\n// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts\n// always succeed.  When you downcast (that is, cast a pointer from\n// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because\n// how do you know the pointer is really of type SubclassOfFoo?  It\n// could be a bare Foo, or of type DifferentSubclassOfFoo.  Thus,\n// when you downcast, you should use this macro.  In debug mode, we\n// use dynamic_cast<> to double-check the downcast is legal (we die\n// if it's not).  In normal mode, we do the efficient static_cast<>\n// instead.  Thus, it's important to test in debug mode to make sure\n// the cast is legal!\n//    This is the only place in the code we should use dynamic_cast<>.\n// In particular, you SHOULDN'T be using dynamic_cast<> in order to\n// do RTTI (eg code like this:\n//    if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);\n//    if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);\n// You should design the code some other way not to need this.\n//\n// This relatively ugly name is intentional. It prevents clashes with\n// similar functions users may have (e.g., down_cast). The internal\n// namespace alone is not enough because the function can be found by ADL.\ntemplate<typename To, typename From>  // use like this: DownCast_<T*>(foo);\ninline To DownCast_(From* f) {  // so we only accept pointers\n  // Ensures that To is a sub-type of From *.  This test is here only\n  // for compile-time type checking, and has no overhead in an\n  // optimized build at run-time, as it will be optimized away\n  // completely.\n  GTEST_INTENTIONAL_CONST_COND_PUSH_()\n  if (false) {\n  GTEST_INTENTIONAL_CONST_COND_POP_()\n  const To to = nullptr;\n  ::testing::internal::ImplicitCast_<From*>(to);\n  }\n\n#if GTEST_HAS_RTTI\n  // RTTI: debug mode only!\n  GTEST_CHECK_(f == nullptr || dynamic_cast<To>(f) != nullptr);\n#endif\n  return static_cast<To>(f);\n}\n\n// Downcasts the pointer of type Base to Derived.\n// Derived must be a subclass of Base. The parameter MUST\n// point to a class of type Derived, not any subclass of it.\n// When RTTI is available, the function performs a runtime\n// check to enforce this.\ntemplate <class Derived, class Base>\nDerived* CheckedDowncastToActualType(Base* base) {\n#if GTEST_HAS_RTTI\n  GTEST_CHECK_(typeid(*base) == typeid(Derived));\n#endif\n\n#if GTEST_HAS_DOWNCAST_\n  return ::down_cast<Derived*>(base);\n#elif GTEST_HAS_RTTI\n  return dynamic_cast<Derived*>(base);  // NOLINT\n#else\n  return static_cast<Derived*>(base);  // Poor man's downcast.\n#endif\n}\n\n#if GTEST_HAS_STREAM_REDIRECTION\n\n// Defines the stderr capturer:\n//   CaptureStdout     - starts capturing stdout.\n//   GetCapturedStdout - stops capturing stdout and returns the captured string.\n//   CaptureStderr     - starts capturing stderr.\n//   GetCapturedStderr - stops capturing stderr and returns the captured string.\n//\nGTEST_API_ void CaptureStdout();\nGTEST_API_ std::string GetCapturedStdout();\nGTEST_API_ void CaptureStderr();\nGTEST_API_ std::string GetCapturedStderr();\n\n#endif  // GTEST_HAS_STREAM_REDIRECTION\n// Returns the size (in bytes) of a file.\nGTEST_API_ size_t GetFileSize(FILE* file);\n\n// Reads the entire content of a file as a string.\nGTEST_API_ std::string ReadEntireFile(FILE* file);\n\n// All command line arguments.\nGTEST_API_ std::vector<std::string> GetArgvs();\n\n#if GTEST_HAS_DEATH_TEST\n\nstd::vector<std::string> GetInjectableArgvs();\n// Deprecated: pass the args vector by value instead.\nvoid SetInjectableArgvs(const std::vector<std::string>* new_argvs);\nvoid SetInjectableArgvs(const std::vector<std::string>& new_argvs);\nvoid ClearInjectableArgvs();\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n// Defines synchronization primitives.\n#if GTEST_IS_THREADSAFE\n# if GTEST_HAS_PTHREAD\n// Sleeps for (roughly) n milliseconds.  This function is only for testing\n// Google Test's own constructs.  Don't use it in user tests, either\n// directly or indirectly.\ninline void SleepMilliseconds(int n) {\n  const timespec time = {\n    0,                  // 0 seconds.\n    n * 1000L * 1000L,  // And n ms.\n  };\n  nanosleep(&time, nullptr);\n}\n# endif  // GTEST_HAS_PTHREAD\n\n# if GTEST_HAS_NOTIFICATION_\n// Notification has already been imported into the namespace.\n// Nothing to do here.\n\n# elif GTEST_HAS_PTHREAD\n// Allows a controller thread to pause execution of newly created\n// threads until notified.  Instances of this class must be created\n// and destroyed in the controller thread.\n//\n// This class is only for testing Google Test's own constructs. Do not\n// use it in user tests, either directly or indirectly.\nclass Notification {\n public:\n  Notification() : notified_(false) {\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, nullptr));\n  }\n  ~Notification() {\n    pthread_mutex_destroy(&mutex_);\n  }\n\n  // Notifies all threads created with this notification to start. Must\n  // be called from the controller thread.\n  void Notify() {\n    pthread_mutex_lock(&mutex_);\n    notified_ = true;\n    pthread_mutex_unlock(&mutex_);\n  }\n\n  // Blocks until the controller thread notifies. Must be called from a test\n  // thread.\n  void WaitForNotification() {\n    for (;;) {\n      pthread_mutex_lock(&mutex_);\n      const bool notified = notified_;\n      pthread_mutex_unlock(&mutex_);\n      if (notified)\n        break;\n      SleepMilliseconds(10);\n    }\n  }\n\n private:\n  pthread_mutex_t mutex_;\n  bool notified_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);\n};\n\n# elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT\n\nGTEST_API_ void SleepMilliseconds(int n);\n\n// Provides leak-safe Windows kernel handle ownership.\n// Used in death tests and in threading support.\nclass GTEST_API_ AutoHandle {\n public:\n  // Assume that Win32 HANDLE type is equivalent to void*. Doing so allows us to\n  // avoid including <windows.h> in this header file. Including <windows.h> is\n  // undesirable because it defines a lot of symbols and macros that tend to\n  // conflict with client code. This assumption is verified by\n  // WindowsTypesTest.HANDLEIsVoidStar.\n  typedef void* Handle;\n  AutoHandle();\n  explicit AutoHandle(Handle handle);\n\n  ~AutoHandle();\n\n  Handle Get() const;\n  void Reset();\n  void Reset(Handle handle);\n\n private:\n  // Returns true if and only if the handle is a valid handle object that can be\n  // closed.\n  bool IsCloseable() const;\n\n  Handle handle_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);\n};\n\n// Allows a controller thread to pause execution of newly created\n// threads until notified.  Instances of this class must be created\n// and destroyed in the controller thread.\n//\n// This class is only for testing Google Test's own constructs. Do not\n// use it in user tests, either directly or indirectly.\nclass GTEST_API_ Notification {\n public:\n  Notification();\n  void Notify();\n  void WaitForNotification();\n\n private:\n  AutoHandle event_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);\n};\n# endif  // GTEST_HAS_NOTIFICATION_\n\n// On MinGW, we can have both GTEST_OS_WINDOWS and GTEST_HAS_PTHREAD\n// defined, but we don't want to use MinGW's pthreads implementation, which\n// has conformance problems with some versions of the POSIX standard.\n# if GTEST_HAS_PTHREAD && !GTEST_OS_WINDOWS_MINGW\n\n// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.\n// Consequently, it cannot select a correct instantiation of ThreadWithParam\n// in order to call its Run(). Introducing ThreadWithParamBase as a\n// non-templated base class for ThreadWithParam allows us to bypass this\n// problem.\nclass ThreadWithParamBase {\n public:\n  virtual ~ThreadWithParamBase() {}\n  virtual void Run() = 0;\n};\n\n// pthread_create() accepts a pointer to a function type with the C linkage.\n// According to the Standard (7.5/1), function types with different linkages\n// are different even if they are otherwise identical.  Some compilers (for\n// example, SunStudio) treat them as different types.  Since class methods\n// cannot be defined with C-linkage we need to define a free C-function to\n// pass into pthread_create().\nextern \"C\" inline void* ThreadFuncWithCLinkage(void* thread) {\n  static_cast<ThreadWithParamBase*>(thread)->Run();\n  return nullptr;\n}\n\n// Helper class for testing Google Test's multi-threading constructs.\n// To use it, write:\n//\n//   void ThreadFunc(int param) { /* Do things with param */ }\n//   Notification thread_can_start;\n//   ...\n//   // The thread_can_start parameter is optional; you can supply NULL.\n//   ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);\n//   thread_can_start.Notify();\n//\n// These classes are only for testing Google Test's own constructs. Do\n// not use them in user tests, either directly or indirectly.\ntemplate <typename T>\nclass ThreadWithParam : public ThreadWithParamBase {\n public:\n  typedef void UserThreadFunc(T);\n\n  ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start)\n      : func_(func),\n        param_(param),\n        thread_can_start_(thread_can_start),\n        finished_(false) {\n    ThreadWithParamBase* const base = this;\n    // The thread can be created only after all fields except thread_\n    // have been initialized.\n    GTEST_CHECK_POSIX_SUCCESS_(\n        pthread_create(&thread_, nullptr, &ThreadFuncWithCLinkage, base));\n  }\n  ~ThreadWithParam() override { Join(); }\n\n  void Join() {\n    if (!finished_) {\n      GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, nullptr));\n      finished_ = true;\n    }\n  }\n\n  void Run() override {\n    if (thread_can_start_ != nullptr) thread_can_start_->WaitForNotification();\n    func_(param_);\n  }\n\n private:\n  UserThreadFunc* const func_;  // User-supplied thread function.\n  const T param_;  // User-supplied parameter to the thread function.\n  // When non-NULL, used to block execution until the controller thread\n  // notifies.\n  Notification* const thread_can_start_;\n  bool finished_;  // true if and only if we know that the thread function has\n                   // finished.\n  pthread_t thread_;  // The native thread object.\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);\n};\n# endif  // !GTEST_OS_WINDOWS && GTEST_HAS_PTHREAD ||\n         // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_\n\n# if GTEST_HAS_MUTEX_AND_THREAD_LOCAL_\n// Mutex and ThreadLocal have already been imported into the namespace.\n// Nothing to do here.\n\n# elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT\n\n// Mutex implements mutex on Windows platforms.  It is used in conjunction\n// with class MutexLock:\n//\n//   Mutex mutex;\n//   ...\n//   MutexLock lock(&mutex);  // Acquires the mutex and releases it at the\n//                            // end of the current scope.\n//\n// A static Mutex *must* be defined or declared using one of the following\n// macros:\n//   GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);\n//   GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);\n//\n// (A non-static Mutex is defined/declared in the usual way).\nclass GTEST_API_ Mutex {\n public:\n  enum MutexType { kStatic = 0, kDynamic = 1 };\n  // We rely on kStaticMutex being 0 as it is to what the linker initializes\n  // type_ in static mutexes.  critical_section_ will be initialized lazily\n  // in ThreadSafeLazyInit().\n  enum StaticConstructorSelector { kStaticMutex = 0 };\n\n  // This constructor intentionally does nothing.  It relies on type_ being\n  // statically initialized to 0 (effectively setting it to kStatic) and on\n  // ThreadSafeLazyInit() to lazily initialize the rest of the members.\n  explicit Mutex(StaticConstructorSelector /*dummy*/) {}\n\n  Mutex();\n  ~Mutex();\n\n  void Lock();\n\n  void Unlock();\n\n  // Does nothing if the current thread holds the mutex. Otherwise, crashes\n  // with high probability.\n  void AssertHeld();\n\n private:\n  // Initializes owner_thread_id_ and critical_section_ in static mutexes.\n  void ThreadSafeLazyInit();\n\n  // Per https://blogs.msdn.microsoft.com/oldnewthing/20040223-00/?p=40503,\n  // we assume that 0 is an invalid value for thread IDs.\n  unsigned int owner_thread_id_;\n\n  // For static mutexes, we rely on these members being initialized to zeros\n  // by the linker.\n  MutexType type_;\n  long critical_section_init_phase_;  // NOLINT\n  GTEST_CRITICAL_SECTION* critical_section_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);\n};\n\n# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \\\n    extern ::testing::internal::Mutex mutex\n\n# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \\\n    ::testing::internal::Mutex mutex(::testing::internal::Mutex::kStaticMutex)\n\n// We cannot name this class MutexLock because the ctor declaration would\n// conflict with a macro named MutexLock, which is defined on some\n// platforms. That macro is used as a defensive measure to prevent against\n// inadvertent misuses of MutexLock like \"MutexLock(&mu)\" rather than\n// \"MutexLock l(&mu)\".  Hence the typedef trick below.\nclass GTestMutexLock {\n public:\n  explicit GTestMutexLock(Mutex* mutex)\n      : mutex_(mutex) { mutex_->Lock(); }\n\n  ~GTestMutexLock() { mutex_->Unlock(); }\n\n private:\n  Mutex* const mutex_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);\n};\n\ntypedef GTestMutexLock MutexLock;\n\n// Base class for ValueHolder<T>.  Allows a caller to hold and delete a value\n// without knowing its type.\nclass ThreadLocalValueHolderBase {\n public:\n  virtual ~ThreadLocalValueHolderBase() {}\n};\n\n// Provides a way for a thread to send notifications to a ThreadLocal\n// regardless of its parameter type.\nclass ThreadLocalBase {\n public:\n  // Creates a new ValueHolder<T> object holding a default value passed to\n  // this ThreadLocal<T>'s constructor and returns it.  It is the caller's\n  // responsibility not to call this when the ThreadLocal<T> instance already\n  // has a value on the current thread.\n  virtual ThreadLocalValueHolderBase* NewValueForCurrentThread() const = 0;\n\n protected:\n  ThreadLocalBase() {}\n  virtual ~ThreadLocalBase() {}\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocalBase);\n};\n\n// Maps a thread to a set of ThreadLocals that have values instantiated on that\n// thread and notifies them when the thread exits.  A ThreadLocal instance is\n// expected to persist until all threads it has values on have terminated.\nclass GTEST_API_ ThreadLocalRegistry {\n public:\n  // Registers thread_local_instance as having value on the current thread.\n  // Returns a value that can be used to identify the thread from other threads.\n  static ThreadLocalValueHolderBase* GetValueOnCurrentThread(\n      const ThreadLocalBase* thread_local_instance);\n\n  // Invoked when a ThreadLocal instance is destroyed.\n  static void OnThreadLocalDestroyed(\n      const ThreadLocalBase* thread_local_instance);\n};\n\nclass GTEST_API_ ThreadWithParamBase {\n public:\n  void Join();\n\n protected:\n  class Runnable {\n   public:\n    virtual ~Runnable() {}\n    virtual void Run() = 0;\n  };\n\n  ThreadWithParamBase(Runnable *runnable, Notification* thread_can_start);\n  virtual ~ThreadWithParamBase();\n\n private:\n  AutoHandle thread_;\n};\n\n// Helper class for testing Google Test's multi-threading constructs.\ntemplate <typename T>\nclass ThreadWithParam : public ThreadWithParamBase {\n public:\n  typedef void UserThreadFunc(T);\n\n  ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start)\n      : ThreadWithParamBase(new RunnableImpl(func, param), thread_can_start) {\n  }\n  virtual ~ThreadWithParam() {}\n\n private:\n  class RunnableImpl : public Runnable {\n   public:\n    RunnableImpl(UserThreadFunc* func, T param)\n        : func_(func),\n          param_(param) {\n    }\n    virtual ~RunnableImpl() {}\n    virtual void Run() {\n      func_(param_);\n    }\n\n   private:\n    UserThreadFunc* const func_;\n    const T param_;\n\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(RunnableImpl);\n  };\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);\n};\n\n// Implements thread-local storage on Windows systems.\n//\n//   // Thread 1\n//   ThreadLocal<int> tl(100);  // 100 is the default value for each thread.\n//\n//   // Thread 2\n//   tl.set(150);  // Changes the value for thread 2 only.\n//   EXPECT_EQ(150, tl.get());\n//\n//   // Thread 1\n//   EXPECT_EQ(100, tl.get());  // In thread 1, tl has the original value.\n//   tl.set(200);\n//   EXPECT_EQ(200, tl.get());\n//\n// The template type argument T must have a public copy constructor.\n// In addition, the default ThreadLocal constructor requires T to have\n// a public default constructor.\n//\n// The users of a TheadLocal instance have to make sure that all but one\n// threads (including the main one) using that instance have exited before\n// destroying it. Otherwise, the per-thread objects managed for them by the\n// ThreadLocal instance are not guaranteed to be destroyed on all platforms.\n//\n// Google Test only uses global ThreadLocal objects.  That means they\n// will die after main() has returned.  Therefore, no per-thread\n// object managed by Google Test will be leaked as long as all threads\n// using Google Test have exited when main() returns.\ntemplate <typename T>\nclass ThreadLocal : public ThreadLocalBase {\n public:\n  ThreadLocal() : default_factory_(new DefaultValueHolderFactory()) {}\n  explicit ThreadLocal(const T& value)\n      : default_factory_(new InstanceValueHolderFactory(value)) {}\n\n  ~ThreadLocal() { ThreadLocalRegistry::OnThreadLocalDestroyed(this); }\n\n  T* pointer() { return GetOrCreateValue(); }\n  const T* pointer() const { return GetOrCreateValue(); }\n  const T& get() const { return *pointer(); }\n  void set(const T& value) { *pointer() = value; }\n\n private:\n  // Holds a value of T.  Can be deleted via its base class without the caller\n  // knowing the type of T.\n  class ValueHolder : public ThreadLocalValueHolderBase {\n   public:\n    ValueHolder() : value_() {}\n    explicit ValueHolder(const T& value) : value_(value) {}\n\n    T* pointer() { return &value_; }\n\n   private:\n    T value_;\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);\n  };\n\n\n  T* GetOrCreateValue() const {\n    return static_cast<ValueHolder*>(\n        ThreadLocalRegistry::GetValueOnCurrentThread(this))->pointer();\n  }\n\n  virtual ThreadLocalValueHolderBase* NewValueForCurrentThread() const {\n    return default_factory_->MakeNewHolder();\n  }\n\n  class ValueHolderFactory {\n   public:\n    ValueHolderFactory() {}\n    virtual ~ValueHolderFactory() {}\n    virtual ValueHolder* MakeNewHolder() const = 0;\n\n   private:\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory);\n  };\n\n  class DefaultValueHolderFactory : public ValueHolderFactory {\n   public:\n    DefaultValueHolderFactory() {}\n    ValueHolder* MakeNewHolder() const override { return new ValueHolder(); }\n\n   private:\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory);\n  };\n\n  class InstanceValueHolderFactory : public ValueHolderFactory {\n   public:\n    explicit InstanceValueHolderFactory(const T& value) : value_(value) {}\n    ValueHolder* MakeNewHolder() const override {\n      return new ValueHolder(value_);\n    }\n\n   private:\n    const T value_;  // The value for each thread.\n\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory);\n  };\n\n  std::unique_ptr<ValueHolderFactory> default_factory_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);\n};\n\n# elif GTEST_HAS_PTHREAD\n\n// MutexBase and Mutex implement mutex on pthreads-based platforms.\nclass MutexBase {\n public:\n  // Acquires this mutex.\n  void Lock() {\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));\n    owner_ = pthread_self();\n    has_owner_ = true;\n  }\n\n  // Releases this mutex.\n  void Unlock() {\n    // Since the lock is being released the owner_ field should no longer be\n    // considered valid. We don't protect writing to has_owner_ here, as it's\n    // the caller's responsibility to ensure that the current thread holds the\n    // mutex when this is called.\n    has_owner_ = false;\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));\n  }\n\n  // Does nothing if the current thread holds the mutex. Otherwise, crashes\n  // with high probability.\n  void AssertHeld() const {\n    GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))\n        << \"The current thread is not holding the mutex @\" << this;\n  }\n\n  // A static mutex may be used before main() is entered.  It may even\n  // be used before the dynamic initialization stage.  Therefore we\n  // must be able to initialize a static mutex object at link time.\n  // This means MutexBase has to be a POD and its member variables\n  // have to be public.\n public:\n  pthread_mutex_t mutex_;  // The underlying pthread mutex.\n  // has_owner_ indicates whether the owner_ field below contains a valid thread\n  // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All\n  // accesses to the owner_ field should be protected by a check of this field.\n  // An alternative might be to memset() owner_ to all zeros, but there's no\n  // guarantee that a zero'd pthread_t is necessarily invalid or even different\n  // from pthread_self().\n  bool has_owner_;\n  pthread_t owner_;  // The thread holding the mutex.\n};\n\n// Forward-declares a static mutex.\n#  define GTEST_DECLARE_STATIC_MUTEX_(mutex) \\\n     extern ::testing::internal::MutexBase mutex\n\n// Defines and statically (i.e. at link time) initializes a static mutex.\n// The initialization list here does not explicitly initialize each field,\n// instead relying on default initialization for the unspecified fields. In\n// particular, the owner_ field (a pthread_t) is not explicitly initialized.\n// This allows initialization to work whether pthread_t is a scalar or struct.\n// The flag -Wmissing-field-initializers must not be specified for this to work.\n#define GTEST_DEFINE_STATIC_MUTEX_(mutex) \\\n  ::testing::internal::MutexBase mutex = {PTHREAD_MUTEX_INITIALIZER, false, 0}\n\n// The Mutex class can only be used for mutexes created at runtime. It\n// shares its API with MutexBase otherwise.\nclass Mutex : public MutexBase {\n public:\n  Mutex() {\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, nullptr));\n    has_owner_ = false;\n  }\n  ~Mutex() {\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));\n  }\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);\n};\n\n// We cannot name this class MutexLock because the ctor declaration would\n// conflict with a macro named MutexLock, which is defined on some\n// platforms. That macro is used as a defensive measure to prevent against\n// inadvertent misuses of MutexLock like \"MutexLock(&mu)\" rather than\n// \"MutexLock l(&mu)\".  Hence the typedef trick below.\nclass GTestMutexLock {\n public:\n  explicit GTestMutexLock(MutexBase* mutex)\n      : mutex_(mutex) { mutex_->Lock(); }\n\n  ~GTestMutexLock() { mutex_->Unlock(); }\n\n private:\n  MutexBase* const mutex_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);\n};\n\ntypedef GTestMutexLock MutexLock;\n\n// Helpers for ThreadLocal.\n\n// pthread_key_create() requires DeleteThreadLocalValue() to have\n// C-linkage.  Therefore it cannot be templatized to access\n// ThreadLocal<T>.  Hence the need for class\n// ThreadLocalValueHolderBase.\nclass ThreadLocalValueHolderBase {\n public:\n  virtual ~ThreadLocalValueHolderBase() {}\n};\n\n// Called by pthread to delete thread-local data stored by\n// pthread_setspecific().\nextern \"C\" inline void DeleteThreadLocalValue(void* value_holder) {\n  delete static_cast<ThreadLocalValueHolderBase*>(value_holder);\n}\n\n// Implements thread-local storage on pthreads-based systems.\ntemplate <typename T>\nclass GTEST_API_ ThreadLocal {\n public:\n  ThreadLocal()\n      : key_(CreateKey()), default_factory_(new DefaultValueHolderFactory()) {}\n  explicit ThreadLocal(const T& value)\n      : key_(CreateKey()),\n        default_factory_(new InstanceValueHolderFactory(value)) {}\n\n  ~ThreadLocal() {\n    // Destroys the managed object for the current thread, if any.\n    DeleteThreadLocalValue(pthread_getspecific(key_));\n\n    // Releases resources associated with the key.  This will *not*\n    // delete managed objects for other threads.\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));\n  }\n\n  T* pointer() { return GetOrCreateValue(); }\n  const T* pointer() const { return GetOrCreateValue(); }\n  const T& get() const { return *pointer(); }\n  void set(const T& value) { *pointer() = value; }\n\n private:\n  // Holds a value of type T.\n  class ValueHolder : public ThreadLocalValueHolderBase {\n   public:\n    ValueHolder() : value_() {}\n    explicit ValueHolder(const T& value) : value_(value) {}\n\n    T* pointer() { return &value_; }\n\n   private:\n    T value_;\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);\n  };\n\n  static pthread_key_t CreateKey() {\n    pthread_key_t key;\n    // When a thread exits, DeleteThreadLocalValue() will be called on\n    // the object managed for that thread.\n    GTEST_CHECK_POSIX_SUCCESS_(\n        pthread_key_create(&key, &DeleteThreadLocalValue));\n    return key;\n  }\n\n  T* GetOrCreateValue() const {\n    ThreadLocalValueHolderBase* const holder =\n        static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));\n    if (holder != nullptr) {\n      return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();\n    }\n\n    ValueHolder* const new_holder = default_factory_->MakeNewHolder();\n    ThreadLocalValueHolderBase* const holder_base = new_holder;\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));\n    return new_holder->pointer();\n  }\n\n  class ValueHolderFactory {\n   public:\n    ValueHolderFactory() {}\n    virtual ~ValueHolderFactory() {}\n    virtual ValueHolder* MakeNewHolder() const = 0;\n\n   private:\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory);\n  };\n\n  class DefaultValueHolderFactory : public ValueHolderFactory {\n   public:\n    DefaultValueHolderFactory() {}\n    ValueHolder* MakeNewHolder() const override { return new ValueHolder(); }\n\n   private:\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory);\n  };\n\n  class InstanceValueHolderFactory : public ValueHolderFactory {\n   public:\n    explicit InstanceValueHolderFactory(const T& value) : value_(value) {}\n    ValueHolder* MakeNewHolder() const override {\n      return new ValueHolder(value_);\n    }\n\n   private:\n    const T value_;  // The value for each thread.\n\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory);\n  };\n\n  // A key pthreads uses for looking up per-thread values.\n  const pthread_key_t key_;\n  std::unique_ptr<ValueHolderFactory> default_factory_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);\n};\n\n# endif  // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_\n\n#else  // GTEST_IS_THREADSAFE\n\n// A dummy implementation of synchronization primitives (mutex, lock,\n// and thread-local variable).  Necessary for compiling Google Test where\n// mutex is not supported - using Google Test in multiple threads is not\n// supported on such platforms.\n\nclass Mutex {\n public:\n  Mutex() {}\n  void Lock() {}\n  void Unlock() {}\n  void AssertHeld() const {}\n};\n\n# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \\\n  extern ::testing::internal::Mutex mutex\n\n# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex\n\n// We cannot name this class MutexLock because the ctor declaration would\n// conflict with a macro named MutexLock, which is defined on some\n// platforms. That macro is used as a defensive measure to prevent against\n// inadvertent misuses of MutexLock like \"MutexLock(&mu)\" rather than\n// \"MutexLock l(&mu)\".  Hence the typedef trick below.\nclass GTestMutexLock {\n public:\n  explicit GTestMutexLock(Mutex*) {}  // NOLINT\n};\n\ntypedef GTestMutexLock MutexLock;\n\ntemplate <typename T>\nclass GTEST_API_ ThreadLocal {\n public:\n  ThreadLocal() : value_() {}\n  explicit ThreadLocal(const T& value) : value_(value) {}\n  T* pointer() { return &value_; }\n  const T* pointer() const { return &value_; }\n  const T& get() const { return value_; }\n  void set(const T& value) { value_ = value; }\n private:\n  T value_;\n};\n\n#endif  // GTEST_IS_THREADSAFE\n\n// Returns the number of threads running in the process, or 0 to indicate that\n// we cannot detect it.\nGTEST_API_ size_t GetThreadCount();\n\n#if GTEST_OS_WINDOWS\n# define GTEST_PATH_SEP_ \"\\\\\"\n# define GTEST_HAS_ALT_PATH_SEP_ 1\n#else\n# define GTEST_PATH_SEP_ \"/\"\n# define GTEST_HAS_ALT_PATH_SEP_ 0\n#endif  // GTEST_OS_WINDOWS\n\n// Utilities for char.\n\n// isspace(int ch) and friends accept an unsigned char or EOF.  char\n// may be signed, depending on the compiler (or compiler flags).\n// Therefore we need to cast a char to unsigned char before calling\n// isspace(), etc.\n\ninline bool IsAlpha(char ch) {\n  return isalpha(static_cast<unsigned char>(ch)) != 0;\n}\ninline bool IsAlNum(char ch) {\n  return isalnum(static_cast<unsigned char>(ch)) != 0;\n}\ninline bool IsDigit(char ch) {\n  return isdigit(static_cast<unsigned char>(ch)) != 0;\n}\ninline bool IsLower(char ch) {\n  return islower(static_cast<unsigned char>(ch)) != 0;\n}\ninline bool IsSpace(char ch) {\n  return isspace(static_cast<unsigned char>(ch)) != 0;\n}\ninline bool IsUpper(char ch) {\n  return isupper(static_cast<unsigned char>(ch)) != 0;\n}\ninline bool IsXDigit(char ch) {\n  return isxdigit(static_cast<unsigned char>(ch)) != 0;\n}\n#ifdef __cpp_char8_t\ninline bool IsXDigit(char8_t ch) {\n  return isxdigit(static_cast<unsigned char>(ch)) != 0;\n}\n#endif\ninline bool IsXDigit(char16_t ch) {\n  const unsigned char low_byte = static_cast<unsigned char>(ch);\n  return ch == low_byte && isxdigit(low_byte) != 0;\n}\ninline bool IsXDigit(char32_t ch) {\n  const unsigned char low_byte = static_cast<unsigned char>(ch);\n  return ch == low_byte && isxdigit(low_byte) != 0;\n}\ninline bool IsXDigit(wchar_t ch) {\n  const unsigned char low_byte = static_cast<unsigned char>(ch);\n  return ch == low_byte && isxdigit(low_byte) != 0;\n}\n\ninline char ToLower(char ch) {\n  return static_cast<char>(tolower(static_cast<unsigned char>(ch)));\n}\ninline char ToUpper(char ch) {\n  return static_cast<char>(toupper(static_cast<unsigned char>(ch)));\n}\n\ninline std::string StripTrailingSpaces(std::string str) {\n  std::string::iterator it = str.end();\n  while (it != str.begin() && IsSpace(*--it))\n    it = str.erase(it);\n  return str;\n}\n\n// The testing::internal::posix namespace holds wrappers for common\n// POSIX functions.  These wrappers hide the differences between\n// Windows/MSVC and POSIX systems.  Since some compilers define these\n// standard functions as macros, the wrapper cannot have the same name\n// as the wrapped function.\n\nnamespace posix {\n\n// Functions with a different name on Windows.\n\n#if GTEST_OS_WINDOWS\n\ntypedef struct _stat StatStruct;\n\n# ifdef __BORLANDC__\ninline int DoIsATTY(int fd) { return isatty(fd); }\ninline int StrCaseCmp(const char* s1, const char* s2) {\n  return stricmp(s1, s2);\n}\ninline char* StrDup(const char* src) { return strdup(src); }\n# else  // !__BORLANDC__\n#  if GTEST_OS_WINDOWS_MOBILE\ninline int DoIsATTY(int /* fd */) { return 0; }\n#  else\ninline int DoIsATTY(int fd) { return _isatty(fd); }\n#  endif  // GTEST_OS_WINDOWS_MOBILE\ninline int StrCaseCmp(const char* s1, const char* s2) {\n  return _stricmp(s1, s2);\n}\ninline char* StrDup(const char* src) { return _strdup(src); }\n# endif  // __BORLANDC__\n\n# if GTEST_OS_WINDOWS_MOBILE\ninline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }\n// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this\n// time and thus not defined there.\n# else\ninline int FileNo(FILE* file) { return _fileno(file); }\ninline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }\ninline int RmDir(const char* dir) { return _rmdir(dir); }\ninline bool IsDir(const StatStruct& st) {\n  return (_S_IFDIR & st.st_mode) != 0;\n}\n# endif  // GTEST_OS_WINDOWS_MOBILE\n\n#elif GTEST_OS_ESP8266\ntypedef struct stat StatStruct;\n\ninline int FileNo(FILE* file) { return fileno(file); }\ninline int DoIsATTY(int fd) { return isatty(fd); }\ninline int Stat(const char* path, StatStruct* buf) {\n  // stat function not implemented on ESP8266\n  return 0;\n}\ninline int StrCaseCmp(const char* s1, const char* s2) {\n  return strcasecmp(s1, s2);\n}\ninline char* StrDup(const char* src) { return strdup(src); }\ninline int RmDir(const char* dir) { return rmdir(dir); }\ninline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }\n\n#else\n\ntypedef struct stat StatStruct;\n\ninline int FileNo(FILE* file) { return fileno(file); }\ninline int DoIsATTY(int fd) { return isatty(fd); }\ninline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }\ninline int StrCaseCmp(const char* s1, const char* s2) {\n  return strcasecmp(s1, s2);\n}\ninline char* StrDup(const char* src) { return strdup(src); }\ninline int RmDir(const char* dir) { return rmdir(dir); }\ninline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }\n\n#endif  // GTEST_OS_WINDOWS\n\ninline int IsATTY(int fd) {\n  // DoIsATTY might change errno (for example ENOTTY in case you redirect stdout\n  // to a file on Linux), which is unexpected, so save the previous value, and\n  // restore it after the call.\n  int savedErrno = errno;\n  int isAttyValue = DoIsATTY(fd);\n  errno = savedErrno;\n\n  return isAttyValue;\n}\n\n// Functions deprecated by MSVC 8.0.\n\nGTEST_DISABLE_MSC_DEPRECATED_PUSH_()\n\n// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and\n// StrError() aren't needed on Windows CE at this time and thus not\n// defined there.\n\n#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && \\\n    !GTEST_OS_WINDOWS_RT && !GTEST_OS_ESP8266 && !GTEST_OS_XTENSA\ninline int ChDir(const char* dir) { return chdir(dir); }\n#endif\ninline FILE* FOpen(const char* path, const char* mode) {\n#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW\n  struct wchar_codecvt : public std::codecvt<wchar_t, char, std::mbstate_t> {};\n  std::wstring_convert<wchar_codecvt> converter;\n  std::wstring wide_path = converter.from_bytes(path);\n  std::wstring wide_mode = converter.from_bytes(mode);\n  return _wfopen(wide_path.c_str(), wide_mode.c_str());\n#else  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW\n  return fopen(path, mode);\n#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW\n}\n#if !GTEST_OS_WINDOWS_MOBILE\ninline FILE *FReopen(const char* path, const char* mode, FILE* stream) {\n  return freopen(path, mode, stream);\n}\ninline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }\n#endif\ninline int FClose(FILE* fp) { return fclose(fp); }\n#if !GTEST_OS_WINDOWS_MOBILE\ninline int Read(int fd, void* buf, unsigned int count) {\n  return static_cast<int>(read(fd, buf, count));\n}\ninline int Write(int fd, const void* buf, unsigned int count) {\n  return static_cast<int>(write(fd, buf, count));\n}\ninline int Close(int fd) { return close(fd); }\ninline const char* StrError(int errnum) { return strerror(errnum); }\n#endif\ninline const char* GetEnv(const char* name) {\n#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \\\n    GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_XTENSA\n  // We are on an embedded platform, which has no environment variables.\n  static_cast<void>(name);  // To prevent 'unused argument' warning.\n  return nullptr;\n#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)\n  // Environment variables which we programmatically clear will be set to the\n  // empty string rather than unset (NULL).  Handle that case.\n  const char* const env = getenv(name);\n  return (env != nullptr && env[0] != '\\0') ? env : nullptr;\n#else\n  return getenv(name);\n#endif\n}\n\nGTEST_DISABLE_MSC_DEPRECATED_POP_()\n\n#if GTEST_OS_WINDOWS_MOBILE\n// Windows CE has no C library. The abort() function is used in\n// several places in Google Test. This implementation provides a reasonable\n// imitation of standard behaviour.\n[[noreturn]] void Abort();\n#else\n[[noreturn]] inline void Abort() { abort(); }\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n}  // namespace posix\n\n// MSVC \"deprecates\" snprintf and issues warnings wherever it is used.  In\n// order to avoid these warnings, we need to use _snprintf or _snprintf_s on\n// MSVC-based platforms.  We map the GTEST_SNPRINTF_ macro to the appropriate\n// function in order to achieve that.  We use macro definition here because\n// snprintf is a variadic function.\n#if _MSC_VER && !GTEST_OS_WINDOWS_MOBILE\n// MSVC 2005 and above support variadic macros.\n# define GTEST_SNPRINTF_(buffer, size, format, ...) \\\n     _snprintf_s(buffer, size, size, format, __VA_ARGS__)\n#elif defined(_MSC_VER)\n// Windows CE does not define _snprintf_s\n# define GTEST_SNPRINTF_ _snprintf\n#else\n# define GTEST_SNPRINTF_ snprintf\n#endif\n\n// The biggest signed integer type the compiler supports.\n//\n// long long is guaranteed to be at least 64-bits in C++11.\nusing BiggestInt = long long;  // NOLINT\n\n// The maximum number a BiggestInt can represent.\nconstexpr BiggestInt kMaxBiggestInt = (std::numeric_limits<BiggestInt>::max)();\n\n// This template class serves as a compile-time function from size to\n// type.  It maps a size in bytes to a primitive type with that\n// size. e.g.\n//\n//   TypeWithSize<4>::UInt\n//\n// is typedef-ed to be unsigned int (unsigned integer made up of 4\n// bytes).\n//\n// Such functionality should belong to STL, but I cannot find it\n// there.\n//\n// Google Test uses this class in the implementation of floating-point\n// comparison.\n//\n// For now it only handles UInt (unsigned int) as that's all Google Test\n// needs.  Other types can be easily added in the future if need\n// arises.\ntemplate <size_t size>\nclass TypeWithSize {\n public:\n  // This prevents the user from using TypeWithSize<N> with incorrect\n  // values of N.\n  using UInt = void;\n};\n\n// The specialization for size 4.\ntemplate <>\nclass TypeWithSize<4> {\n public:\n  using Int = std::int32_t;\n  using UInt = std::uint32_t;\n};\n\n// The specialization for size 8.\ntemplate <>\nclass TypeWithSize<8> {\n public:\n  using Int = std::int64_t;\n  using UInt = std::uint64_t;\n};\n\n// Integer types of known sizes.\nusing TimeInMillis = int64_t;  // Represents time in milliseconds.\n\n// Utilities for command line flags and environment variables.\n\n// Macro for referencing flags.\n#if !defined(GTEST_FLAG)\n# define GTEST_FLAG(name) FLAGS_gtest_##name\n#endif  // !defined(GTEST_FLAG)\n\n#if !defined(GTEST_USE_OWN_FLAGFILE_FLAG_)\n# define GTEST_USE_OWN_FLAGFILE_FLAG_ 1\n#endif  // !defined(GTEST_USE_OWN_FLAGFILE_FLAG_)\n\n#if !defined(GTEST_DECLARE_bool_)\n# define GTEST_FLAG_SAVER_ ::testing::internal::GTestFlagSaver\n\n// Macros for declaring flags.\n# define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)\n# define GTEST_DECLARE_int32_(name) \\\n    GTEST_API_ extern std::int32_t GTEST_FLAG(name)\n# define GTEST_DECLARE_string_(name) \\\n    GTEST_API_ extern ::std::string GTEST_FLAG(name)\n\n// Macros for defining flags.\n# define GTEST_DEFINE_bool_(name, default_val, doc) \\\n    GTEST_API_ bool GTEST_FLAG(name) = (default_val)\n# define GTEST_DEFINE_int32_(name, default_val, doc) \\\n    GTEST_API_ std::int32_t GTEST_FLAG(name) = (default_val)\n# define GTEST_DEFINE_string_(name, default_val, doc) \\\n    GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)\n\n#endif  // !defined(GTEST_DECLARE_bool_)\n\n// Thread annotations\n#if !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_)\n# define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)\n# define GTEST_LOCK_EXCLUDED_(locks)\n#endif  // !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_)\n\n// Parses 'str' for a 32-bit signed integer.  If successful, writes the result\n// to *value and returns true; otherwise leaves *value unchanged and returns\n// false.\nGTEST_API_ bool ParseInt32(const Message& src_text, const char* str,\n                           int32_t* value);\n\n// Parses a bool/int32_t/string from the environment variable\n// corresponding to the given Google Test flag.\nbool BoolFromGTestEnv(const char* flag, bool default_val);\nGTEST_API_ int32_t Int32FromGTestEnv(const char* flag, int32_t default_val);\nstd::string OutputFlagAlsoCheckEnvVar();\nconst char* StringFromGTestEnv(const char* flag, const char* default_val);\n\n}  // namespace internal\n}  // namespace testing\n\n#if !defined(GTEST_INTERNAL_DEPRECATED)\n\n// Internal Macro to mark an API deprecated, for googletest usage only\n// Usage: class GTEST_INTERNAL_DEPRECATED(message) MyClass or\n// GTEST_INTERNAL_DEPRECATED(message) <return_type> myFunction(); Every usage of\n// a deprecated entity will trigger a warning when compiled with\n// `-Wdeprecated-declarations` option (clang, gcc, any __GNUC__ compiler).\n// For msvc /W3 option will need to be used\n// Note that for 'other' compilers this macro evaluates to nothing to prevent\n// compilations errors.\n#if defined(_MSC_VER)\n#define GTEST_INTERNAL_DEPRECATED(message) __declspec(deprecated(message))\n#elif defined(__GNUC__)\n#define GTEST_INTERNAL_DEPRECATED(message) __attribute__((deprecated(message)))\n#else\n#define GTEST_INTERNAL_DEPRECATED(message)\n#endif\n\n#endif  // !defined(GTEST_INTERNAL_DEPRECATED)\n\n#if GTEST_HAS_ABSL\n// Always use absl::any for UniversalPrinter<> specializations if googletest\n// is built with absl support.\n#define GTEST_INTERNAL_HAS_ANY 1\n#include \"absl/types/any.h\"\nnamespace testing {\nnamespace internal {\nusing Any = ::absl::any;\n}  // namespace internal\n}  // namespace testing\n#else\n#ifdef __has_include\n#if __has_include(<any>) && __cplusplus >= 201703L\n// Otherwise for C++17 and higher use std::any for UniversalPrinter<>\n// specializations.\n#define GTEST_INTERNAL_HAS_ANY 1\n#include <any>\nnamespace testing {\nnamespace internal {\nusing Any = ::std::any;\n}  // namespace internal\n}  // namespace testing\n// The case where absl is configured NOT to alias std::any is not\n// supported.\n#endif  // __has_include(<any>) && __cplusplus >= 201703L\n#endif  // __has_include\n#endif  // GTEST_HAS_ABSL\n\n#if GTEST_HAS_ABSL\n// Always use absl::optional for UniversalPrinter<> specializations if\n// googletest is built with absl support.\n#define GTEST_INTERNAL_HAS_OPTIONAL 1\n#include \"absl/types/optional.h\"\nnamespace testing {\nnamespace internal {\ntemplate <typename T>\nusing Optional = ::absl::optional<T>;\n}  // namespace internal\n}  // namespace testing\n#else\n#ifdef __has_include\n#if __has_include(<optional>) && __cplusplus >= 201703L\n// Otherwise for C++17 and higher use std::optional for UniversalPrinter<>\n// specializations.\n#define GTEST_INTERNAL_HAS_OPTIONAL 1\n#include <optional>\nnamespace testing {\nnamespace internal {\ntemplate <typename T>\nusing Optional = ::std::optional<T>;\n}  // namespace internal\n}  // namespace testing\n// The case where absl is configured NOT to alias std::optional is not\n// supported.\n#endif  // __has_include(<optional>) && __cplusplus >= 201703L\n#endif  // __has_include\n#endif  // GTEST_HAS_ABSL\n\n#if GTEST_HAS_ABSL\n// Always use absl::string_view for Matcher<> specializations if googletest\n// is built with absl support.\n# define GTEST_INTERNAL_HAS_STRING_VIEW 1\n#include \"absl/strings/string_view.h\"\nnamespace testing {\nnamespace internal {\nusing StringView = ::absl::string_view;\n}  // namespace internal\n}  // namespace testing\n#else\n# ifdef __has_include\n#   if __has_include(<string_view>) && __cplusplus >= 201703L\n// Otherwise for C++17 and higher use std::string_view for Matcher<>\n// specializations.\n#   define GTEST_INTERNAL_HAS_STRING_VIEW 1\n#include <string_view>\nnamespace testing {\nnamespace internal {\nusing StringView = ::std::string_view;\n}  // namespace internal\n}  // namespace testing\n// The case where absl is configured NOT to alias std::string_view is not\n// supported.\n#  endif  // __has_include(<string_view>) && __cplusplus >= 201703L\n# endif  // __has_include\n#endif  // GTEST_HAS_ABSL\n\n#if GTEST_HAS_ABSL\n// Always use absl::variant for UniversalPrinter<> specializations if googletest\n// is built with absl support.\n#define GTEST_INTERNAL_HAS_VARIANT 1\n#include \"absl/types/variant.h\"\nnamespace testing {\nnamespace internal {\ntemplate <typename... T>\nusing Variant = ::absl::variant<T...>;\n}  // namespace internal\n}  // namespace testing\n#else\n#ifdef __has_include\n#if __has_include(<variant>) && __cplusplus >= 201703L\n// Otherwise for C++17 and higher use std::variant for UniversalPrinter<>\n// specializations.\n#define GTEST_INTERNAL_HAS_VARIANT 1\n#include <variant>\nnamespace testing {\nnamespace internal {\ntemplate <typename... T>\nusing Variant = ::std::variant<T...>;\n}  // namespace internal\n}  // namespace testing\n// The case where absl is configured NOT to alias std::variant is not supported.\n#endif  // __has_include(<variant>) && __cplusplus >= 201703L\n#endif  // __has_include\n#endif  // GTEST_HAS_ABSL\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_\n\n#if GTEST_OS_LINUX\n# include <stdlib.h>\n# include <sys/types.h>\n# include <sys/wait.h>\n# include <unistd.h>\n#endif  // GTEST_OS_LINUX\n\n#if GTEST_HAS_EXCEPTIONS\n# include <stdexcept>\n#endif\n\n#include <ctype.h>\n#include <float.h>\n#include <string.h>\n#include <cstdint>\n#include <iomanip>\n#include <limits>\n#include <map>\n#include <set>\n#include <string>\n#include <type_traits>\n#include <vector>\n\n// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n//\n// This header file defines the Message class.\n//\n// IMPORTANT NOTE: Due to limitation of the C++ language, we have to\n// leave some internal implementation details in this header file.\n// They are clearly marked by comments like this:\n//\n//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n//\n// Such code is NOT meant to be used by a user directly, and is subject\n// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user\n// program!\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_MESSAGE_H_\n#define GOOGLETEST_INCLUDE_GTEST_GTEST_MESSAGE_H_\n\n#include <limits>\n#include <memory>\n#include <sstream>\n\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\n// Ensures that there is at least one operator<< in the global namespace.\n// See Message& operator<<(...) below for why.\nvoid operator<<(const testing::internal::Secret&, int);\n\nnamespace testing {\n\n// The Message class works like an ostream repeater.\n//\n// Typical usage:\n//\n//   1. You stream a bunch of values to a Message object.\n//      It will remember the text in a stringstream.\n//   2. Then you stream the Message object to an ostream.\n//      This causes the text in the Message to be streamed\n//      to the ostream.\n//\n// For example;\n//\n//   testing::Message foo;\n//   foo << 1 << \" != \" << 2;\n//   std::cout << foo;\n//\n// will print \"1 != 2\".\n//\n// Message is not intended to be inherited from.  In particular, its\n// destructor is not virtual.\n//\n// Note that stringstream behaves differently in gcc and in MSVC.  You\n// can stream a NULL char pointer to it in the former, but not in the\n// latter (it causes an access violation if you do).  The Message\n// class hides this difference by treating a NULL char pointer as\n// \"(null)\".\nclass GTEST_API_ Message {\n private:\n  // The type of basic IO manipulators (endl, ends, and flush) for\n  // narrow streams.\n  typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);\n\n public:\n  // Constructs an empty Message.\n  Message();\n\n  // Copy constructor.\n  Message(const Message& msg) : ss_(new ::std::stringstream) {  // NOLINT\n    *ss_ << msg.GetString();\n  }\n\n  // Constructs a Message from a C-string.\n  explicit Message(const char* str) : ss_(new ::std::stringstream) {\n    *ss_ << str;\n  }\n\n  // Streams a non-pointer value to this object.\n  template <typename T>\n  inline Message& operator <<(const T& val) {\n    // Some libraries overload << for STL containers.  These\n    // overloads are defined in the global namespace instead of ::std.\n    //\n    // C++'s symbol lookup rule (i.e. Koenig lookup) says that these\n    // overloads are visible in either the std namespace or the global\n    // namespace, but not other namespaces, including the testing\n    // namespace which Google Test's Message class is in.\n    //\n    // To allow STL containers (and other types that has a << operator\n    // defined in the global namespace) to be used in Google Test\n    // assertions, testing::Message must access the custom << operator\n    // from the global namespace.  With this using declaration,\n    // overloads of << defined in the global namespace and those\n    // visible via Koenig lookup are both exposed in this function.\n    using ::operator <<;\n    *ss_ << val;\n    return *this;\n  }\n\n  // Streams a pointer value to this object.\n  //\n  // This function is an overload of the previous one.  When you\n  // stream a pointer to a Message, this definition will be used as it\n  // is more specialized.  (The C++ Standard, section\n  // [temp.func.order].)  If you stream a non-pointer, then the\n  // previous definition will be used.\n  //\n  // The reason for this overload is that streaming a NULL pointer to\n  // ostream is undefined behavior.  Depending on the compiler, you\n  // may get \"0\", \"(nil)\", \"(null)\", or an access violation.  To\n  // ensure consistent result across compilers, we always treat NULL\n  // as \"(null)\".\n  template <typename T>\n  inline Message& operator <<(T* const& pointer) {  // NOLINT\n    if (pointer == nullptr) {\n      *ss_ << \"(null)\";\n    } else {\n      *ss_ << pointer;\n    }\n    return *this;\n  }\n\n  // Since the basic IO manipulators are overloaded for both narrow\n  // and wide streams, we have to provide this specialized definition\n  // of operator <<, even though its body is the same as the\n  // templatized version above.  Without this definition, streaming\n  // endl or other basic IO manipulators to Message will confuse the\n  // compiler.\n  Message& operator <<(BasicNarrowIoManip val) {\n    *ss_ << val;\n    return *this;\n  }\n\n  // Instead of 1/0, we want to see true/false for bool values.\n  Message& operator <<(bool b) {\n    return *this << (b ? \"true\" : \"false\");\n  }\n\n  // These two overloads allow streaming a wide C string to a Message\n  // using the UTF-8 encoding.\n  Message& operator <<(const wchar_t* wide_c_str);\n  Message& operator <<(wchar_t* wide_c_str);\n\n#if GTEST_HAS_STD_WSTRING\n  // Converts the given wide string to a narrow string using the UTF-8\n  // encoding, and streams the result to this Message object.\n  Message& operator <<(const ::std::wstring& wstr);\n#endif  // GTEST_HAS_STD_WSTRING\n\n  // Gets the text streamed to this object so far as an std::string.\n  // Each '\\0' character in the buffer is replaced with \"\\\\0\".\n  //\n  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n  std::string GetString() const;\n\n private:\n  // We'll hold the text streamed to this object here.\n  const std::unique_ptr< ::std::stringstream> ss_;\n\n  // We declare (but don't implement) this to prevent the compiler\n  // from implementing the assignment operator.\n  void operator=(const Message&);\n};\n\n// Streams a Message to an ostream.\ninline std::ostream& operator <<(std::ostream& os, const Message& sb) {\n  return os << sb.GetString();\n}\n\nnamespace internal {\n\n// Converts a streamable value to an std::string.  A NULL pointer is\n// converted to \"(null)\".  When the input value is a ::string,\n// ::std::string, ::wstring, or ::std::wstring object, each NUL\n// character in it is replaced with \"\\\\0\".\ntemplate <typename T>\nstd::string StreamableToString(const T& streamable) {\n  return (Message() << streamable).GetString();\n}\n\n}  // namespace internal\n}  // namespace testing\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_MESSAGE_H_\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Google Test filepath utilities\n//\n// This header file declares classes and functions used internally by\n// Google Test.  They are subject to change without notice.\n//\n// This file is #included in gtest/internal/gtest-internal.h.\n// Do not include this header file separately!\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_\n#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_\n\n// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n//\n// This header file declares the String class and functions used internally by\n// Google Test.  They are subject to change without notice. They should not used\n// by code external to Google Test.\n//\n// This header file is #included by gtest-internal.h.\n// It should not be #included by other files.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_\n#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_\n\n#ifdef __BORLANDC__\n// string.h is not guaranteed to provide strcpy on C++ Builder.\n# include <mem.h>\n#endif\n\n#include <string.h>\n#include <cstdint>\n#include <string>\n\n\nnamespace testing {\nnamespace internal {\n\n// String - an abstract class holding static string utilities.\nclass GTEST_API_ String {\n public:\n  // Static utility methods\n\n  // Clones a 0-terminated C string, allocating memory using new.  The\n  // caller is responsible for deleting the return value using\n  // delete[].  Returns the cloned string, or NULL if the input is\n  // NULL.\n  //\n  // This is different from strdup() in string.h, which allocates\n  // memory using malloc().\n  static const char* CloneCString(const char* c_str);\n\n#if GTEST_OS_WINDOWS_MOBILE\n  // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be\n  // able to pass strings to Win32 APIs on CE we need to convert them\n  // to 'Unicode', UTF-16.\n\n  // Creates a UTF-16 wide string from the given ANSI string, allocating\n  // memory using new. The caller is responsible for deleting the return\n  // value using delete[]. Returns the wide string, or NULL if the\n  // input is NULL.\n  //\n  // The wide string is created using the ANSI codepage (CP_ACP) to\n  // match the behaviour of the ANSI versions of Win32 calls and the\n  // C runtime.\n  static LPCWSTR AnsiToUtf16(const char* c_str);\n\n  // Creates an ANSI string from the given wide string, allocating\n  // memory using new. The caller is responsible for deleting the return\n  // value using delete[]. Returns the ANSI string, or NULL if the\n  // input is NULL.\n  //\n  // The returned string is created using the ANSI codepage (CP_ACP) to\n  // match the behaviour of the ANSI versions of Win32 calls and the\n  // C runtime.\n  static const char* Utf16ToAnsi(LPCWSTR utf16_str);\n#endif\n\n  // Compares two C strings.  Returns true if and only if they have the same\n  // content.\n  //\n  // Unlike strcmp(), this function can handle NULL argument(s).  A\n  // NULL C string is considered different to any non-NULL C string,\n  // including the empty string.\n  static bool CStringEquals(const char* lhs, const char* rhs);\n\n  // Converts a wide C string to a String using the UTF-8 encoding.\n  // NULL will be converted to \"(null)\".  If an error occurred during\n  // the conversion, \"(failed to convert from wide string)\" is\n  // returned.\n  static std::string ShowWideCString(const wchar_t* wide_c_str);\n\n  // Compares two wide C strings.  Returns true if and only if they have the\n  // same content.\n  //\n  // Unlike wcscmp(), this function can handle NULL argument(s).  A\n  // NULL C string is considered different to any non-NULL C string,\n  // including the empty string.\n  static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);\n\n  // Compares two C strings, ignoring case.  Returns true if and only if\n  // they have the same content.\n  //\n  // Unlike strcasecmp(), this function can handle NULL argument(s).\n  // A NULL C string is considered different to any non-NULL C string,\n  // including the empty string.\n  static bool CaseInsensitiveCStringEquals(const char* lhs,\n                                           const char* rhs);\n\n  // Compares two wide C strings, ignoring case.  Returns true if and only if\n  // they have the same content.\n  //\n  // Unlike wcscasecmp(), this function can handle NULL argument(s).\n  // A NULL C string is considered different to any non-NULL wide C string,\n  // including the empty string.\n  // NB: The implementations on different platforms slightly differ.\n  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE\n  // environment variable. On GNU platform this method uses wcscasecmp\n  // which compares according to LC_CTYPE category of the current locale.\n  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the\n  // current locale.\n  static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,\n                                               const wchar_t* rhs);\n\n  // Returns true if and only if the given string ends with the given suffix,\n  // ignoring case. Any string is considered to end with an empty suffix.\n  static bool EndsWithCaseInsensitive(\n      const std::string& str, const std::string& suffix);\n\n  // Formats an int value as \"%02d\".\n  static std::string FormatIntWidth2(int value);  // \"%02d\" for width == 2\n\n  // Formats an int value to given width with leading zeros.\n  static std::string FormatIntWidthN(int value, int width);\n\n  // Formats an int value as \"%X\".\n  static std::string FormatHexInt(int value);\n\n  // Formats an int value as \"%X\".\n  static std::string FormatHexUInt32(uint32_t value);\n\n  // Formats a byte as \"%02X\".\n  static std::string FormatByte(unsigned char value);\n\n private:\n  String();  // Not meant to be instantiated.\n};  // class String\n\n// Gets the content of the stringstream's buffer as an std::string.  Each '\\0'\n// character in the buffer is replaced with \"\\\\0\".\nGTEST_API_ std::string StringStreamToString(::std::stringstream* stream);\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\nnamespace testing {\nnamespace internal {\n\n// FilePath - a class for file and directory pathname manipulation which\n// handles platform-specific conventions (like the pathname separator).\n// Used for helper functions for naming files in a directory for xml output.\n// Except for Set methods, all methods are const or static, which provides an\n// \"immutable value object\" -- useful for peace of mind.\n// A FilePath with a value ending in a path separator (\"like/this/\") represents\n// a directory, otherwise it is assumed to represent a file. In either case,\n// it may or may not represent an actual file or directory in the file system.\n// Names are NOT checked for syntax correctness -- no checking for illegal\n// characters, malformed paths, etc.\n\nclass GTEST_API_ FilePath {\n public:\n  FilePath() : pathname_(\"\") { }\n  FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }\n\n  explicit FilePath(const std::string& pathname) : pathname_(pathname) {\n    Normalize();\n  }\n\n  FilePath& operator=(const FilePath& rhs) {\n    Set(rhs);\n    return *this;\n  }\n\n  void Set(const FilePath& rhs) {\n    pathname_ = rhs.pathname_;\n  }\n\n  const std::string& string() const { return pathname_; }\n  const char* c_str() const { return pathname_.c_str(); }\n\n  // Returns the current working directory, or \"\" if unsuccessful.\n  static FilePath GetCurrentDir();\n\n  // Given directory = \"dir\", base_name = \"test\", number = 0,\n  // extension = \"xml\", returns \"dir/test.xml\". If number is greater\n  // than zero (e.g., 12), returns \"dir/test_12.xml\".\n  // On Windows platform, uses \\ as the separator rather than /.\n  static FilePath MakeFileName(const FilePath& directory,\n                               const FilePath& base_name,\n                               int number,\n                               const char* extension);\n\n  // Given directory = \"dir\", relative_path = \"test.xml\",\n  // returns \"dir/test.xml\".\n  // On Windows, uses \\ as the separator rather than /.\n  static FilePath ConcatPaths(const FilePath& directory,\n                              const FilePath& relative_path);\n\n  // Returns a pathname for a file that does not currently exist. The pathname\n  // will be directory/base_name.extension or\n  // directory/base_name_<number>.extension if directory/base_name.extension\n  // already exists. The number will be incremented until a pathname is found\n  // that does not already exist.\n  // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.\n  // There could be a race condition if two or more processes are calling this\n  // function at the same time -- they could both pick the same filename.\n  static FilePath GenerateUniqueFileName(const FilePath& directory,\n                                         const FilePath& base_name,\n                                         const char* extension);\n\n  // Returns true if and only if the path is \"\".\n  bool IsEmpty() const { return pathname_.empty(); }\n\n  // If input name has a trailing separator character, removes it and returns\n  // the name, otherwise return the name string unmodified.\n  // On Windows platform, uses \\ as the separator, other platforms use /.\n  FilePath RemoveTrailingPathSeparator() const;\n\n  // Returns a copy of the FilePath with the directory part removed.\n  // Example: FilePath(\"path/to/file\").RemoveDirectoryName() returns\n  // FilePath(\"file\"). If there is no directory part (\"just_a_file\"), it returns\n  // the FilePath unmodified. If there is no file part (\"just_a_dir/\") it\n  // returns an empty FilePath (\"\").\n  // On Windows platform, '\\' is the path separator, otherwise it is '/'.\n  FilePath RemoveDirectoryName() const;\n\n  // RemoveFileName returns the directory path with the filename removed.\n  // Example: FilePath(\"path/to/file\").RemoveFileName() returns \"path/to/\".\n  // If the FilePath is \"a_file\" or \"/a_file\", RemoveFileName returns\n  // FilePath(\"./\") or, on Windows, FilePath(\".\\\\\"). If the filepath does\n  // not have a file, like \"just/a/dir/\", it returns the FilePath unmodified.\n  // On Windows platform, '\\' is the path separator, otherwise it is '/'.\n  FilePath RemoveFileName() const;\n\n  // Returns a copy of the FilePath with the case-insensitive extension removed.\n  // Example: FilePath(\"dir/file.exe\").RemoveExtension(\"EXE\") returns\n  // FilePath(\"dir/file\"). If a case-insensitive extension is not\n  // found, returns a copy of the original FilePath.\n  FilePath RemoveExtension(const char* extension) const;\n\n  // Creates directories so that path exists. Returns true if successful or if\n  // the directories already exist; returns false if unable to create\n  // directories for any reason. Will also return false if the FilePath does\n  // not represent a directory (that is, it doesn't end with a path separator).\n  bool CreateDirectoriesRecursively() const;\n\n  // Create the directory so that path exists. Returns true if successful or\n  // if the directory already exists; returns false if unable to create the\n  // directory for any reason, including if the parent directory does not\n  // exist. Not named \"CreateDirectory\" because that's a macro on Windows.\n  bool CreateFolder() const;\n\n  // Returns true if FilePath describes something in the file-system,\n  // either a file, directory, or whatever, and that something exists.\n  bool FileOrDirectoryExists() const;\n\n  // Returns true if pathname describes a directory in the file-system\n  // that exists.\n  bool DirectoryExists() const;\n\n  // Returns true if FilePath ends with a path separator, which indicates that\n  // it is intended to represent a directory. Returns false otherwise.\n  // This does NOT check that a directory (or file) actually exists.\n  bool IsDirectory() const;\n\n  // Returns true if pathname describes a root directory. (Windows has one\n  // root directory per disk drive.)\n  bool IsRootDirectory() const;\n\n  // Returns true if pathname describes an absolute path.\n  bool IsAbsolutePath() const;\n\n private:\n  // Replaces multiple consecutive separators with a single separator.\n  // For example, \"bar///foo\" becomes \"bar/foo\". Does not eliminate other\n  // redundancies that might be in a pathname involving \".\" or \"..\".\n  //\n  // A pathname with multiple consecutive separators may occur either through\n  // user error or as a result of some scripts or APIs that generate a pathname\n  // with a trailing separator. On other platforms the same API or script\n  // may NOT generate a pathname with a trailing \"/\". Then elsewhere that\n  // pathname may have another \"/\" and pathname components added to it,\n  // without checking for the separator already being there.\n  // The script language and operating system may allow paths like \"foo//bar\"\n  // but some of the functions in FilePath will not handle that correctly. In\n  // particular, RemoveTrailingPathSeparator() only removes one separator, and\n  // it is called in CreateDirectoriesRecursively() assuming that it will change\n  // a pathname from directory syntax (trailing separator) to filename syntax.\n  //\n  // On Windows this method also replaces the alternate path separator '/' with\n  // the primary path separator '\\\\', so that for example \"bar\\\\/\\\\foo\" becomes\n  // \"bar\\\\foo\".\n\n  void Normalize();\n\n  // Returns a pointer to the last occurrence of a valid path separator in\n  // the FilePath. On Windows, for example, both '/' and '\\' are valid path\n  // separators. Returns NULL if no path separator was found.\n  const char* FindLastPathSeparator() const;\n\n  std::string pathname_;\n};  // class FilePath\n\n}  // namespace internal\n}  // namespace testing\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_\n// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Type utilities needed for implementing typed and type-parameterized\n// tests.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_\n#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_\n\n\n// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using\n// libstdc++ (which is where cxxabi.h comes from).\n# if GTEST_HAS_CXXABI_H_\n#  include <cxxabi.h>\n# elif defined(__HP_aCC)\n#  include <acxx_demangle.h>\n# endif  // GTEST_HASH_CXXABI_H_\n\nnamespace testing {\nnamespace internal {\n\n// Canonicalizes a given name with respect to the Standard C++ Library.\n// This handles removing the inline namespace within `std` that is\n// used by various standard libraries (e.g., `std::__1`).  Names outside\n// of namespace std are returned unmodified.\ninline std::string CanonicalizeForStdLibVersioning(std::string s) {\n  static const char prefix[] = \"std::__\";\n  if (s.compare(0, strlen(prefix), prefix) == 0) {\n    std::string::size_type end = s.find(\"::\", strlen(prefix));\n    if (end != s.npos) {\n      // Erase everything between the initial `std` and the second `::`.\n      s.erase(strlen(\"std\"), end - strlen(\"std\"));\n    }\n  }\n  return s;\n}\n\n#if GTEST_HAS_RTTI\n// GetTypeName(const std::type_info&) returns a human-readable name of type T.\ninline std::string GetTypeName(const std::type_info& type) {\n  const char* const name = type.name();\n#if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)\n  int status = 0;\n  // gcc's implementation of typeid(T).name() mangles the type name,\n  // so we have to demangle it.\n#if GTEST_HAS_CXXABI_H_\n  using abi::__cxa_demangle;\n#endif  // GTEST_HAS_CXXABI_H_\n  char* const readable_name = __cxa_demangle(name, nullptr, nullptr, &status);\n  const std::string name_str(status == 0 ? readable_name : name);\n  free(readable_name);\n  return CanonicalizeForStdLibVersioning(name_str);\n#else\n  return name;\n#endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC\n}\n#endif  // GTEST_HAS_RTTI\n\n// GetTypeName<T>() returns a human-readable name of type T if and only if\n// RTTI is enabled, otherwise it returns a dummy type name.\n// NB: This function is also used in Google Mock, so don't move it inside of\n// the typed-test-only section below.\ntemplate <typename T>\nstd::string GetTypeName() {\n#if GTEST_HAS_RTTI\n  return GetTypeName(typeid(T));\n#else\n  return \"<type>\";\n#endif  // GTEST_HAS_RTTI\n}\n\n// A unique type indicating an empty node\nstruct None {};\n\n# define GTEST_TEMPLATE_ template <typename T> class\n\n// The template \"selector\" struct TemplateSel<Tmpl> is used to\n// represent Tmpl, which must be a class template with one type\n// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined\n// as the type Tmpl<T>.  This allows us to actually instantiate the\n// template \"selected\" by TemplateSel<Tmpl>.\n//\n// This trick is necessary for simulating typedef for class templates,\n// which C++ doesn't support directly.\ntemplate <GTEST_TEMPLATE_ Tmpl>\nstruct TemplateSel {\n  template <typename T>\n  struct Bind {\n    typedef Tmpl<T> type;\n  };\n};\n\n# define GTEST_BIND_(TmplSel, T) \\\n  TmplSel::template Bind<T>::type\n\ntemplate <GTEST_TEMPLATE_ Head_, GTEST_TEMPLATE_... Tail_>\nstruct Templates {\n  using Head = TemplateSel<Head_>;\n  using Tail = Templates<Tail_...>;\n};\n\ntemplate <GTEST_TEMPLATE_ Head_>\nstruct Templates<Head_> {\n  using Head = TemplateSel<Head_>;\n  using Tail = None;\n};\n\n// Tuple-like type lists\ntemplate <typename Head_, typename... Tail_>\nstruct Types {\n  using Head = Head_;\n  using Tail = Types<Tail_...>;\n};\n\ntemplate <typename Head_>\nstruct Types<Head_> {\n  using Head = Head_;\n  using Tail = None;\n};\n\n// Helper metafunctions to tell apart a single type from types\n// generated by ::testing::Types\ntemplate <typename... Ts>\nstruct ProxyTypeList {\n  using type = Types<Ts...>;\n};\n\ntemplate <typename>\nstruct is_proxy_type_list : std::false_type {};\n\ntemplate <typename... Ts>\nstruct is_proxy_type_list<ProxyTypeList<Ts...>> : std::true_type {};\n\n// Generator which conditionally creates type lists.\n// It recognizes if a requested type list should be created\n// and prevents creating a new type list nested within another one.\ntemplate <typename T>\nstruct GenerateTypeList {\n private:\n  using proxy = typename std::conditional<is_proxy_type_list<T>::value, T,\n                                          ProxyTypeList<T>>::type;\n\n public:\n  using type = typename proxy::type;\n};\n\n}  // namespace internal\n\ntemplate <typename... Ts>\nusing Types = internal::ProxyTypeList<Ts...>;\n\n}  // namespace testing\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_\n\n// Due to C++ preprocessor weirdness, we need double indirection to\n// concatenate two tokens when one of them is __LINE__.  Writing\n//\n//   foo ## __LINE__\n//\n// will result in the token foo__LINE__, instead of foo followed by\n// the current line number.  For more details, see\n// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6\n#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)\n#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar\n\n// Stringifies its argument.\n// Work around a bug in visual studio which doesn't accept code like this:\n//\n//   #define GTEST_STRINGIFY_(name) #name\n//   #define MACRO(a, b, c) ... GTEST_STRINGIFY_(a) ...\n//   MACRO(, x, y)\n//\n// Complaining about the argument to GTEST_STRINGIFY_ being empty.\n// This is allowed by the spec.\n#define GTEST_STRINGIFY_HELPER_(name, ...) #name\n#define GTEST_STRINGIFY_(...) GTEST_STRINGIFY_HELPER_(__VA_ARGS__, )\n\nnamespace proto2 {\nclass MessageLite;\n}\n\nnamespace testing {\n\n// Forward declarations.\n\nclass AssertionResult;                 // Result of an assertion.\nclass Message;                         // Represents a failure message.\nclass Test;                            // Represents a test.\nclass TestInfo;                        // Information about a test.\nclass TestPartResult;                  // Result of a test part.\nclass UnitTest;                        // A collection of test suites.\n\ntemplate <typename T>\n::std::string PrintToString(const T& value);\n\nnamespace internal {\n\nstruct TraceInfo;                      // Information about a trace point.\nclass TestInfoImpl;                    // Opaque implementation of TestInfo\nclass UnitTestImpl;                    // Opaque implementation of UnitTest\n\n// The text used in failure messages to indicate the start of the\n// stack trace.\nGTEST_API_ extern const char kStackTraceMarker[];\n\n// An IgnoredValue object can be implicitly constructed from ANY value.\nclass IgnoredValue {\n  struct Sink {};\n public:\n  // This constructor template allows any value to be implicitly\n  // converted to IgnoredValue.  The object has no data member and\n  // doesn't try to remember anything about the argument.  We\n  // deliberately omit the 'explicit' keyword in order to allow the\n  // conversion to be implicit.\n  // Disable the conversion if T already has a magical conversion operator.\n  // Otherwise we get ambiguity.\n  template <typename T,\n            typename std::enable_if<!std::is_convertible<T, Sink>::value,\n                                    int>::type = 0>\n  IgnoredValue(const T& /* ignored */) {}  // NOLINT(runtime/explicit)\n};\n\n// Appends the user-supplied message to the Google-Test-generated message.\nGTEST_API_ std::string AppendUserMessage(\n    const std::string& gtest_msg, const Message& user_msg);\n\n#if GTEST_HAS_EXCEPTIONS\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4275 \\\n/* an exported class was derived from a class that was not exported */)\n\n// This exception is thrown by (and only by) a failed Google Test\n// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions\n// are enabled).  We derive it from std::runtime_error, which is for\n// errors presumably detectable only at run time.  Since\n// std::runtime_error inherits from std::exception, many testing\n// frameworks know how to extract and print the message inside it.\nclass GTEST_API_ GoogleTestFailureException : public ::std::runtime_error {\n public:\n  explicit GoogleTestFailureException(const TestPartResult& failure);\n};\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4275\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\nnamespace edit_distance {\n// Returns the optimal edits to go from 'left' to 'right'.\n// All edits cost the same, with replace having lower priority than\n// add/remove.\n// Simple implementation of the Wagner-Fischer algorithm.\n// See http://en.wikipedia.org/wiki/Wagner-Fischer_algorithm\nenum EditType { kMatch, kAdd, kRemove, kReplace };\nGTEST_API_ std::vector<EditType> CalculateOptimalEdits(\n    const std::vector<size_t>& left, const std::vector<size_t>& right);\n\n// Same as above, but the input is represented as strings.\nGTEST_API_ std::vector<EditType> CalculateOptimalEdits(\n    const std::vector<std::string>& left,\n    const std::vector<std::string>& right);\n\n// Create a diff of the input strings in Unified diff format.\nGTEST_API_ std::string CreateUnifiedDiff(const std::vector<std::string>& left,\n                                         const std::vector<std::string>& right,\n                                         size_t context = 2);\n\n}  // namespace edit_distance\n\n// Calculate the diff between 'left' and 'right' and return it in unified diff\n// format.\n// If not null, stores in 'total_line_count' the total number of lines found\n// in left + right.\nGTEST_API_ std::string DiffStrings(const std::string& left,\n                                   const std::string& right,\n                                   size_t* total_line_count);\n\n// Constructs and returns the message for an equality assertion\n// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.\n//\n// The first four parameters are the expressions used in the assertion\n// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)\n// where foo is 5 and bar is 6, we have:\n//\n//   expected_expression: \"foo\"\n//   actual_expression:   \"bar\"\n//   expected_value:      \"5\"\n//   actual_value:        \"6\"\n//\n// The ignoring_case parameter is true if and only if the assertion is a\n// *_STRCASEEQ*.  When it's true, the string \" (ignoring case)\" will\n// be inserted into the message.\nGTEST_API_ AssertionResult EqFailure(const char* expected_expression,\n                                     const char* actual_expression,\n                                     const std::string& expected_value,\n                                     const std::string& actual_value,\n                                     bool ignoring_case);\n\n// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.\nGTEST_API_ std::string GetBoolAssertionFailureMessage(\n    const AssertionResult& assertion_result,\n    const char* expression_text,\n    const char* actual_predicate_value,\n    const char* expected_predicate_value);\n\n// This template class represents an IEEE floating-point number\n// (either single-precision or double-precision, depending on the\n// template parameters).\n//\n// The purpose of this class is to do more sophisticated number\n// comparison.  (Due to round-off error, etc, it's very unlikely that\n// two floating-points will be equal exactly.  Hence a naive\n// comparison by the == operation often doesn't work.)\n//\n// Format of IEEE floating-point:\n//\n//   The most-significant bit being the leftmost, an IEEE\n//   floating-point looks like\n//\n//     sign_bit exponent_bits fraction_bits\n//\n//   Here, sign_bit is a single bit that designates the sign of the\n//   number.\n//\n//   For float, there are 8 exponent bits and 23 fraction bits.\n//\n//   For double, there are 11 exponent bits and 52 fraction bits.\n//\n//   More details can be found at\n//   http://en.wikipedia.org/wiki/IEEE_floating-point_standard.\n//\n// Template parameter:\n//\n//   RawType: the raw floating-point type (either float or double)\ntemplate <typename RawType>\nclass FloatingPoint {\n public:\n  // Defines the unsigned integer type that has the same size as the\n  // floating point number.\n  typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;\n\n  // Constants.\n\n  // # of bits in a number.\n  static const size_t kBitCount = 8*sizeof(RawType);\n\n  // # of fraction bits in a number.\n  static const size_t kFractionBitCount =\n    std::numeric_limits<RawType>::digits - 1;\n\n  // # of exponent bits in a number.\n  static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;\n\n  // The mask for the sign bit.\n  static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);\n\n  // The mask for the fraction bits.\n  static const Bits kFractionBitMask =\n    ~static_cast<Bits>(0) >> (kExponentBitCount + 1);\n\n  // The mask for the exponent bits.\n  static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);\n\n  // How many ULP's (Units in the Last Place) we want to tolerate when\n  // comparing two numbers.  The larger the value, the more error we\n  // allow.  A 0 value means that two numbers must be exactly the same\n  // to be considered equal.\n  //\n  // The maximum error of a single floating-point operation is 0.5\n  // units in the last place.  On Intel CPU's, all floating-point\n  // calculations are done with 80-bit precision, while double has 64\n  // bits.  Therefore, 4 should be enough for ordinary use.\n  //\n  // See the following article for more details on ULP:\n  // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/\n  static const uint32_t kMaxUlps = 4;\n\n  // Constructs a FloatingPoint from a raw floating-point number.\n  //\n  // On an Intel CPU, passing a non-normalized NAN (Not a Number)\n  // around may change its bits, although the new value is guaranteed\n  // to be also a NAN.  Therefore, don't expect this constructor to\n  // preserve the bits in x when x is a NAN.\n  explicit FloatingPoint(const RawType& x) { u_.value_ = x; }\n\n  // Static methods\n\n  // Reinterprets a bit pattern as a floating-point number.\n  //\n  // This function is needed to test the AlmostEquals() method.\n  static RawType ReinterpretBits(const Bits bits) {\n    FloatingPoint fp(0);\n    fp.u_.bits_ = bits;\n    return fp.u_.value_;\n  }\n\n  // Returns the floating-point number that represent positive infinity.\n  static RawType Infinity() {\n    return ReinterpretBits(kExponentBitMask);\n  }\n\n  // Returns the maximum representable finite floating-point number.\n  static RawType Max();\n\n  // Non-static methods\n\n  // Returns the bits that represents this number.\n  const Bits &bits() const { return u_.bits_; }\n\n  // Returns the exponent bits of this number.\n  Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }\n\n  // Returns the fraction bits of this number.\n  Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }\n\n  // Returns the sign bit of this number.\n  Bits sign_bit() const { return kSignBitMask & u_.bits_; }\n\n  // Returns true if and only if this is NAN (not a number).\n  bool is_nan() const {\n    // It's a NAN if the exponent bits are all ones and the fraction\n    // bits are not entirely zeros.\n    return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);\n  }\n\n  // Returns true if and only if this number is at most kMaxUlps ULP's away\n  // from rhs.  In particular, this function:\n  //\n  //   - returns false if either number is (or both are) NAN.\n  //   - treats really large numbers as almost equal to infinity.\n  //   - thinks +0.0 and -0.0 are 0 DLP's apart.\n  bool AlmostEquals(const FloatingPoint& rhs) const {\n    // The IEEE standard says that any comparison operation involving\n    // a NAN must return false.\n    if (is_nan() || rhs.is_nan()) return false;\n\n    return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)\n        <= kMaxUlps;\n  }\n\n private:\n  // The data type used to store the actual floating-point number.\n  union FloatingPointUnion {\n    RawType value_;  // The raw floating-point number.\n    Bits bits_;      // The bits that represent the number.\n  };\n\n  // Converts an integer from the sign-and-magnitude representation to\n  // the biased representation.  More precisely, let N be 2 to the\n  // power of (kBitCount - 1), an integer x is represented by the\n  // unsigned number x + N.\n  //\n  // For instance,\n  //\n  //   -N + 1 (the most negative number representable using\n  //          sign-and-magnitude) is represented by 1;\n  //   0      is represented by N; and\n  //   N - 1  (the biggest number representable using\n  //          sign-and-magnitude) is represented by 2N - 1.\n  //\n  // Read http://en.wikipedia.org/wiki/Signed_number_representations\n  // for more details on signed number representations.\n  static Bits SignAndMagnitudeToBiased(const Bits &sam) {\n    if (kSignBitMask & sam) {\n      // sam represents a negative number.\n      return ~sam + 1;\n    } else {\n      // sam represents a positive number.\n      return kSignBitMask | sam;\n    }\n  }\n\n  // Given two numbers in the sign-and-magnitude representation,\n  // returns the distance between them as an unsigned number.\n  static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,\n                                                     const Bits &sam2) {\n    const Bits biased1 = SignAndMagnitudeToBiased(sam1);\n    const Bits biased2 = SignAndMagnitudeToBiased(sam2);\n    return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);\n  }\n\n  FloatingPointUnion u_;\n};\n\n// We cannot use std::numeric_limits<T>::max() as it clashes with the max()\n// macro defined by <windows.h>.\ntemplate <>\ninline float FloatingPoint<float>::Max() { return FLT_MAX; }\ntemplate <>\ninline double FloatingPoint<double>::Max() { return DBL_MAX; }\n\n// Typedefs the instances of the FloatingPoint template class that we\n// care to use.\ntypedef FloatingPoint<float> Float;\ntypedef FloatingPoint<double> Double;\n\n// In order to catch the mistake of putting tests that use different\n// test fixture classes in the same test suite, we need to assign\n// unique IDs to fixture classes and compare them.  The TypeId type is\n// used to hold such IDs.  The user should treat TypeId as an opaque\n// type: the only operation allowed on TypeId values is to compare\n// them for equality using the == operator.\ntypedef const void* TypeId;\n\ntemplate <typename T>\nclass TypeIdHelper {\n public:\n  // dummy_ must not have a const type.  Otherwise an overly eager\n  // compiler (e.g. MSVC 7.1 & 8.0) may try to merge\n  // TypeIdHelper<T>::dummy_ for different Ts as an \"optimization\".\n  static bool dummy_;\n};\n\ntemplate <typename T>\nbool TypeIdHelper<T>::dummy_ = false;\n\n// GetTypeId<T>() returns the ID of type T.  Different values will be\n// returned for different types.  Calling the function twice with the\n// same type argument is guaranteed to return the same ID.\ntemplate <typename T>\nTypeId GetTypeId() {\n  // The compiler is required to allocate a different\n  // TypeIdHelper<T>::dummy_ variable for each T used to instantiate\n  // the template.  Therefore, the address of dummy_ is guaranteed to\n  // be unique.\n  return &(TypeIdHelper<T>::dummy_);\n}\n\n// Returns the type ID of ::testing::Test.  Always call this instead\n// of GetTypeId< ::testing::Test>() to get the type ID of\n// ::testing::Test, as the latter may give the wrong result due to a\n// suspected linker bug when compiling Google Test as a Mac OS X\n// framework.\nGTEST_API_ TypeId GetTestTypeId();\n\n// Defines the abstract factory interface that creates instances\n// of a Test object.\nclass TestFactoryBase {\n public:\n  virtual ~TestFactoryBase() {}\n\n  // Creates a test instance to run. The instance is both created and destroyed\n  // within TestInfoImpl::Run()\n  virtual Test* CreateTest() = 0;\n\n protected:\n  TestFactoryBase() {}\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);\n};\n\n// This class provides implementation of TeastFactoryBase interface.\n// It is used in TEST and TEST_F macros.\ntemplate <class TestClass>\nclass TestFactoryImpl : public TestFactoryBase {\n public:\n  Test* CreateTest() override { return new TestClass; }\n};\n\n#if GTEST_OS_WINDOWS\n\n// Predicate-formatters for implementing the HRESULT checking macros\n// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}\n// We pass a long instead of HRESULT to avoid causing an\n// include dependency for the HRESULT type.\nGTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,\n                                            long hr);  // NOLINT\nGTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,\n                                            long hr);  // NOLINT\n\n#endif  // GTEST_OS_WINDOWS\n\n// Types of SetUpTestSuite() and TearDownTestSuite() functions.\nusing SetUpTestSuiteFunc = void (*)();\nusing TearDownTestSuiteFunc = void (*)();\n\nstruct CodeLocation {\n  CodeLocation(const std::string& a_file, int a_line)\n      : file(a_file), line(a_line) {}\n\n  std::string file;\n  int line;\n};\n\n//  Helper to identify which setup function for TestCase / TestSuite to call.\n//  Only one function is allowed, either TestCase or TestSute but not both.\n\n// Utility functions to help SuiteApiResolver\nusing SetUpTearDownSuiteFuncType = void (*)();\n\ninline SetUpTearDownSuiteFuncType GetNotDefaultOrNull(\n    SetUpTearDownSuiteFuncType a, SetUpTearDownSuiteFuncType def) {\n  return a == def ? nullptr : a;\n}\n\ntemplate <typename T>\n//  Note that SuiteApiResolver inherits from T because\n//  SetUpTestSuite()/TearDownTestSuite() could be protected. Ths way\n//  SuiteApiResolver can access them.\nstruct SuiteApiResolver : T {\n  // testing::Test is only forward declared at this point. So we make it a\n  // dependend class for the compiler to be OK with it.\n  using Test =\n      typename std::conditional<sizeof(T) != 0, ::testing::Test, void>::type;\n\n  static SetUpTearDownSuiteFuncType GetSetUpCaseOrSuite(const char* filename,\n                                                        int line_num) {\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n    SetUpTearDownSuiteFuncType test_case_fp =\n        GetNotDefaultOrNull(&T::SetUpTestCase, &Test::SetUpTestCase);\n    SetUpTearDownSuiteFuncType test_suite_fp =\n        GetNotDefaultOrNull(&T::SetUpTestSuite, &Test::SetUpTestSuite);\n\n    GTEST_CHECK_(!test_case_fp || !test_suite_fp)\n        << \"Test can not provide both SetUpTestSuite and SetUpTestCase, please \"\n           \"make sure there is only one present at \"\n        << filename << \":\" << line_num;\n\n    return test_case_fp != nullptr ? test_case_fp : test_suite_fp;\n#else\n    (void)(filename);\n    (void)(line_num);\n    return &T::SetUpTestSuite;\n#endif\n  }\n\n  static SetUpTearDownSuiteFuncType GetTearDownCaseOrSuite(const char* filename,\n                                                           int line_num) {\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n    SetUpTearDownSuiteFuncType test_case_fp =\n        GetNotDefaultOrNull(&T::TearDownTestCase, &Test::TearDownTestCase);\n    SetUpTearDownSuiteFuncType test_suite_fp =\n        GetNotDefaultOrNull(&T::TearDownTestSuite, &Test::TearDownTestSuite);\n\n    GTEST_CHECK_(!test_case_fp || !test_suite_fp)\n        << \"Test can not provide both TearDownTestSuite and TearDownTestCase,\"\n           \" please make sure there is only one present at\"\n        << filename << \":\" << line_num;\n\n    return test_case_fp != nullptr ? test_case_fp : test_suite_fp;\n#else\n    (void)(filename);\n    (void)(line_num);\n    return &T::TearDownTestSuite;\n#endif\n  }\n};\n\n// Creates a new TestInfo object and registers it with Google Test;\n// returns the created object.\n//\n// Arguments:\n//\n//   test_suite_name:  name of the test suite\n//   name:             name of the test\n//   type_param:       the name of the test's type parameter, or NULL if\n//                     this is not a typed or a type-parameterized test.\n//   value_param:      text representation of the test's value parameter,\n//                     or NULL if this is not a type-parameterized test.\n//   code_location:    code location where the test is defined\n//   fixture_class_id: ID of the test fixture class\n//   set_up_tc:        pointer to the function that sets up the test suite\n//   tear_down_tc:     pointer to the function that tears down the test suite\n//   factory:          pointer to the factory that creates a test object.\n//                     The newly created TestInfo instance will assume\n//                     ownership of the factory object.\nGTEST_API_ TestInfo* MakeAndRegisterTestInfo(\n    const char* test_suite_name, const char* name, const char* type_param,\n    const char* value_param, CodeLocation code_location,\n    TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc,\n    TearDownTestSuiteFunc tear_down_tc, TestFactoryBase* factory);\n\n// If *pstr starts with the given prefix, modifies *pstr to be right\n// past the prefix and returns true; otherwise leaves *pstr unchanged\n// and returns false.  None of pstr, *pstr, and prefix can be NULL.\nGTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\n// State of the definition of a type-parameterized test suite.\nclass GTEST_API_ TypedTestSuitePState {\n public:\n  TypedTestSuitePState() : registered_(false) {}\n\n  // Adds the given test name to defined_test_names_ and return true\n  // if the test suite hasn't been registered; otherwise aborts the\n  // program.\n  bool AddTestName(const char* file, int line, const char* case_name,\n                   const char* test_name) {\n    if (registered_) {\n      fprintf(stderr,\n              \"%s Test %s must be defined before \"\n              \"REGISTER_TYPED_TEST_SUITE_P(%s, ...).\\n\",\n              FormatFileLocation(file, line).c_str(), test_name, case_name);\n      fflush(stderr);\n      posix::Abort();\n    }\n    registered_tests_.insert(\n        ::std::make_pair(test_name, CodeLocation(file, line)));\n    return true;\n  }\n\n  bool TestExists(const std::string& test_name) const {\n    return registered_tests_.count(test_name) > 0;\n  }\n\n  const CodeLocation& GetCodeLocation(const std::string& test_name) const {\n    RegisteredTestsMap::const_iterator it = registered_tests_.find(test_name);\n    GTEST_CHECK_(it != registered_tests_.end());\n    return it->second;\n  }\n\n  // Verifies that registered_tests match the test names in\n  // defined_test_names_; returns registered_tests if successful, or\n  // aborts the program otherwise.\n  const char* VerifyRegisteredTestNames(const char* test_suite_name,\n                                        const char* file, int line,\n                                        const char* registered_tests);\n\n private:\n  typedef ::std::map<std::string, CodeLocation> RegisteredTestsMap;\n\n  bool registered_;\n  RegisteredTestsMap registered_tests_;\n};\n\n//  Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\nusing TypedTestCasePState = TypedTestSuitePState;\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n// Skips to the first non-space char after the first comma in 'str';\n// returns NULL if no comma is found in 'str'.\ninline const char* SkipComma(const char* str) {\n  const char* comma = strchr(str, ',');\n  if (comma == nullptr) {\n    return nullptr;\n  }\n  while (IsSpace(*(++comma))) {}\n  return comma;\n}\n\n// Returns the prefix of 'str' before the first comma in it; returns\n// the entire string if it contains no comma.\ninline std::string GetPrefixUntilComma(const char* str) {\n  const char* comma = strchr(str, ',');\n  return comma == nullptr ? str : std::string(str, comma);\n}\n\n// Splits a given string on a given delimiter, populating a given\n// vector with the fields.\nvoid SplitString(const ::std::string& str, char delimiter,\n                 ::std::vector< ::std::string>* dest);\n\n// The default argument to the template below for the case when the user does\n// not provide a name generator.\nstruct DefaultNameGenerator {\n  template <typename T>\n  static std::string GetName(int i) {\n    return StreamableToString(i);\n  }\n};\n\ntemplate <typename Provided = DefaultNameGenerator>\nstruct NameGeneratorSelector {\n  typedef Provided type;\n};\n\ntemplate <typename NameGenerator>\nvoid GenerateNamesRecursively(internal::None, std::vector<std::string>*, int) {}\n\ntemplate <typename NameGenerator, typename Types>\nvoid GenerateNamesRecursively(Types, std::vector<std::string>* result, int i) {\n  result->push_back(NameGenerator::template GetName<typename Types::Head>(i));\n  GenerateNamesRecursively<NameGenerator>(typename Types::Tail(), result,\n                                          i + 1);\n}\n\ntemplate <typename NameGenerator, typename Types>\nstd::vector<std::string> GenerateNames() {\n  std::vector<std::string> result;\n  GenerateNamesRecursively<NameGenerator>(Types(), &result, 0);\n  return result;\n}\n\n// TypeParameterizedTest<Fixture, TestSel, Types>::Register()\n// registers a list of type-parameterized tests with Google Test.  The\n// return value is insignificant - we just need to return something\n// such that we can call this function in a namespace scope.\n//\n// Implementation note: The GTEST_TEMPLATE_ macro declares a template\n// template parameter.  It's defined in gtest-type-util.h.\ntemplate <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>\nclass TypeParameterizedTest {\n public:\n  // 'index' is the index of the test in the type list 'Types'\n  // specified in INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, TestSuite,\n  // Types).  Valid values for 'index' are [0, N - 1] where N is the\n  // length of Types.\n  static bool Register(const char* prefix, const CodeLocation& code_location,\n                       const char* case_name, const char* test_names, int index,\n                       const std::vector<std::string>& type_names =\n                           GenerateNames<DefaultNameGenerator, Types>()) {\n    typedef typename Types::Head Type;\n    typedef Fixture<Type> FixtureClass;\n    typedef typename GTEST_BIND_(TestSel, Type) TestClass;\n\n    // First, registers the first type-parameterized test in the type\n    // list.\n    MakeAndRegisterTestInfo(\n        (std::string(prefix) + (prefix[0] == '\\0' ? \"\" : \"/\") + case_name +\n         \"/\" + type_names[static_cast<size_t>(index)])\n            .c_str(),\n        StripTrailingSpaces(GetPrefixUntilComma(test_names)).c_str(),\n        GetTypeName<Type>().c_str(),\n        nullptr,  // No value parameter.\n        code_location, GetTypeId<FixtureClass>(),\n        SuiteApiResolver<TestClass>::GetSetUpCaseOrSuite(\n            code_location.file.c_str(), code_location.line),\n        SuiteApiResolver<TestClass>::GetTearDownCaseOrSuite(\n            code_location.file.c_str(), code_location.line),\n        new TestFactoryImpl<TestClass>);\n\n    // Next, recurses (at compile time) with the tail of the type list.\n    return TypeParameterizedTest<Fixture, TestSel,\n                                 typename Types::Tail>::Register(prefix,\n                                                                 code_location,\n                                                                 case_name,\n                                                                 test_names,\n                                                                 index + 1,\n                                                                 type_names);\n  }\n};\n\n// The base case for the compile time recursion.\ntemplate <GTEST_TEMPLATE_ Fixture, class TestSel>\nclass TypeParameterizedTest<Fixture, TestSel, internal::None> {\n public:\n  static bool Register(const char* /*prefix*/, const CodeLocation&,\n                       const char* /*case_name*/, const char* /*test_names*/,\n                       int /*index*/,\n                       const std::vector<std::string>& =\n                           std::vector<std::string>() /*type_names*/) {\n    return true;\n  }\n};\n\nGTEST_API_ void RegisterTypeParameterizedTestSuite(const char* test_suite_name,\n                                                   CodeLocation code_location);\nGTEST_API_ void RegisterTypeParameterizedTestSuiteInstantiation(\n    const char* case_name);\n\n// TypeParameterizedTestSuite<Fixture, Tests, Types>::Register()\n// registers *all combinations* of 'Tests' and 'Types' with Google\n// Test.  The return value is insignificant - we just need to return\n// something such that we can call this function in a namespace scope.\ntemplate <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>\nclass TypeParameterizedTestSuite {\n public:\n  static bool Register(const char* prefix, CodeLocation code_location,\n                       const TypedTestSuitePState* state, const char* case_name,\n                       const char* test_names,\n                       const std::vector<std::string>& type_names =\n                           GenerateNames<DefaultNameGenerator, Types>()) {\n    RegisterTypeParameterizedTestSuiteInstantiation(case_name);\n    std::string test_name = StripTrailingSpaces(\n        GetPrefixUntilComma(test_names));\n    if (!state->TestExists(test_name)) {\n      fprintf(stderr, \"Failed to get code location for test %s.%s at %s.\",\n              case_name, test_name.c_str(),\n              FormatFileLocation(code_location.file.c_str(),\n                                 code_location.line).c_str());\n      fflush(stderr);\n      posix::Abort();\n    }\n    const CodeLocation& test_location = state->GetCodeLocation(test_name);\n\n    typedef typename Tests::Head Head;\n\n    // First, register the first test in 'Test' for each type in 'Types'.\n    TypeParameterizedTest<Fixture, Head, Types>::Register(\n        prefix, test_location, case_name, test_names, 0, type_names);\n\n    // Next, recurses (at compile time) with the tail of the test list.\n    return TypeParameterizedTestSuite<Fixture, typename Tests::Tail,\n                                      Types>::Register(prefix, code_location,\n                                                       state, case_name,\n                                                       SkipComma(test_names),\n                                                       type_names);\n  }\n};\n\n// The base case for the compile time recursion.\ntemplate <GTEST_TEMPLATE_ Fixture, typename Types>\nclass TypeParameterizedTestSuite<Fixture, internal::None, Types> {\n public:\n  static bool Register(const char* /*prefix*/, const CodeLocation&,\n                       const TypedTestSuitePState* /*state*/,\n                       const char* /*case_name*/, const char* /*test_names*/,\n                       const std::vector<std::string>& =\n                           std::vector<std::string>() /*type_names*/) {\n    return true;\n  }\n};\n\n// Returns the current OS stack trace as an std::string.\n//\n// The maximum number of stack frames to be included is specified by\n// the gtest_stack_trace_depth flag.  The skip_count parameter\n// specifies the number of top frames to be skipped, which doesn't\n// count against the number of frames to be included.\n//\n// For example, if Foo() calls Bar(), which in turn calls\n// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in\n// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.\nGTEST_API_ std::string GetCurrentOsStackTraceExceptTop(\n    UnitTest* unit_test, int skip_count);\n\n// Helpers for suppressing warnings on unreachable code or constant\n// condition.\n\n// Always returns true.\nGTEST_API_ bool AlwaysTrue();\n\n// Always returns false.\ninline bool AlwaysFalse() { return !AlwaysTrue(); }\n\n// Helper for suppressing false warning from Clang on a const char*\n// variable declared in a conditional expression always being NULL in\n// the else branch.\nstruct GTEST_API_ ConstCharPtr {\n  ConstCharPtr(const char* str) : value(str) {}\n  operator bool() const { return true; }\n  const char* value;\n};\n\n// Helper for declaring std::string within 'if' statement\n// in pre C++17 build environment.\nstruct TrueWithString {\n  TrueWithString() = default;\n  explicit TrueWithString(const char* str) : value(str) {}\n  explicit TrueWithString(const std::string& str) : value(str) {}\n  explicit operator bool() const { return true; }\n  std::string value;\n};\n\n// A simple Linear Congruential Generator for generating random\n// numbers with a uniform distribution.  Unlike rand() and srand(), it\n// doesn't use global state (and therefore can't interfere with user\n// code).  Unlike rand_r(), it's portable.  An LCG isn't very random,\n// but it's good enough for our purposes.\nclass GTEST_API_ Random {\n public:\n  static const uint32_t kMaxRange = 1u << 31;\n\n  explicit Random(uint32_t seed) : state_(seed) {}\n\n  void Reseed(uint32_t seed) { state_ = seed; }\n\n  // Generates a random number from [0, range).  Crashes if 'range' is\n  // 0 or greater than kMaxRange.\n  uint32_t Generate(uint32_t range);\n\n private:\n  uint32_t state_;\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);\n};\n\n// Turns const U&, U&, const U, and U all into U.\n#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \\\n  typename std::remove_const<typename std::remove_reference<T>::type>::type\n\n// HasDebugStringAndShortDebugString<T>::value is a compile-time bool constant\n// that's true if and only if T has methods DebugString() and ShortDebugString()\n// that return std::string.\ntemplate <typename T>\nclass HasDebugStringAndShortDebugString {\n private:\n  template <typename C>\n  static auto CheckDebugString(C*) -> typename std::is_same<\n      std::string, decltype(std::declval<const C>().DebugString())>::type;\n  template <typename>\n  static std::false_type CheckDebugString(...);\n\n  template <typename C>\n  static auto CheckShortDebugString(C*) -> typename std::is_same<\n      std::string, decltype(std::declval<const C>().ShortDebugString())>::type;\n  template <typename>\n  static std::false_type CheckShortDebugString(...);\n\n  using HasDebugStringType = decltype(CheckDebugString<T>(nullptr));\n  using HasShortDebugStringType = decltype(CheckShortDebugString<T>(nullptr));\n\n public:\n  static constexpr bool value =\n      HasDebugStringType::value && HasShortDebugStringType::value;\n};\n\ntemplate <typename T>\nconstexpr bool HasDebugStringAndShortDebugString<T>::value;\n\n// When the compiler sees expression IsContainerTest<C>(0), if C is an\n// STL-style container class, the first overload of IsContainerTest\n// will be viable (since both C::iterator* and C::const_iterator* are\n// valid types and NULL can be implicitly converted to them).  It will\n// be picked over the second overload as 'int' is a perfect match for\n// the type of argument 0.  If C::iterator or C::const_iterator is not\n// a valid type, the first overload is not viable, and the second\n// overload will be picked.  Therefore, we can determine whether C is\n// a container class by checking the type of IsContainerTest<C>(0).\n// The value of the expression is insignificant.\n//\n// In C++11 mode we check the existence of a const_iterator and that an\n// iterator is properly implemented for the container.\n//\n// For pre-C++11 that we look for both C::iterator and C::const_iterator.\n// The reason is that C++ injects the name of a class as a member of the\n// class itself (e.g. you can refer to class iterator as either\n// 'iterator' or 'iterator::iterator').  If we look for C::iterator\n// only, for example, we would mistakenly think that a class named\n// iterator is an STL container.\n//\n// Also note that the simpler approach of overloading\n// IsContainerTest(typename C::const_iterator*) and\n// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.\ntypedef int IsContainer;\ntemplate <class C,\n          class Iterator = decltype(::std::declval<const C&>().begin()),\n          class = decltype(::std::declval<const C&>().end()),\n          class = decltype(++::std::declval<Iterator&>()),\n          class = decltype(*::std::declval<Iterator>()),\n          class = typename C::const_iterator>\nIsContainer IsContainerTest(int /* dummy */) {\n  return 0;\n}\n\ntypedef char IsNotContainer;\ntemplate <class C>\nIsNotContainer IsContainerTest(long /* dummy */) { return '\\0'; }\n\n// Trait to detect whether a type T is a hash table.\n// The heuristic used is that the type contains an inner type `hasher` and does\n// not contain an inner type `reverse_iterator`.\n// If the container is iterable in reverse, then order might actually matter.\ntemplate <typename T>\nstruct IsHashTable {\n private:\n  template <typename U>\n  static char test(typename U::hasher*, typename U::reverse_iterator*);\n  template <typename U>\n  static int test(typename U::hasher*, ...);\n  template <typename U>\n  static char test(...);\n\n public:\n  static const bool value = sizeof(test<T>(nullptr, nullptr)) == sizeof(int);\n};\n\ntemplate <typename T>\nconst bool IsHashTable<T>::value;\n\ntemplate <typename C,\n          bool = sizeof(IsContainerTest<C>(0)) == sizeof(IsContainer)>\nstruct IsRecursiveContainerImpl;\n\ntemplate <typename C>\nstruct IsRecursiveContainerImpl<C, false> : public std::false_type {};\n\n// Since the IsRecursiveContainerImpl depends on the IsContainerTest we need to\n// obey the same inconsistencies as the IsContainerTest, namely check if\n// something is a container is relying on only const_iterator in C++11 and\n// is relying on both const_iterator and iterator otherwise\ntemplate <typename C>\nstruct IsRecursiveContainerImpl<C, true> {\n  using value_type = decltype(*std::declval<typename C::const_iterator>());\n  using type =\n      std::is_same<typename std::remove_const<\n                       typename std::remove_reference<value_type>::type>::type,\n                   C>;\n};\n\n// IsRecursiveContainer<Type> is a unary compile-time predicate that\n// evaluates whether C is a recursive container type. A recursive container\n// type is a container type whose value_type is equal to the container type\n// itself. An example for a recursive container type is\n// boost::filesystem::path, whose iterator has a value_type that is equal to\n// boost::filesystem::path.\ntemplate <typename C>\nstruct IsRecursiveContainer : public IsRecursiveContainerImpl<C>::type {};\n\n// Utilities for native arrays.\n\n// ArrayEq() compares two k-dimensional native arrays using the\n// elements' operator==, where k can be any integer >= 0.  When k is\n// 0, ArrayEq() degenerates into comparing a single pair of values.\n\ntemplate <typename T, typename U>\nbool ArrayEq(const T* lhs, size_t size, const U* rhs);\n\n// This generic version is used when k is 0.\ntemplate <typename T, typename U>\ninline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }\n\n// This overload is used when k >= 1.\ntemplate <typename T, typename U, size_t N>\ninline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {\n  return internal::ArrayEq(lhs, N, rhs);\n}\n\n// This helper reduces code bloat.  If we instead put its logic inside\n// the previous ArrayEq() function, arrays with different sizes would\n// lead to different copies of the template code.\ntemplate <typename T, typename U>\nbool ArrayEq(const T* lhs, size_t size, const U* rhs) {\n  for (size_t i = 0; i != size; i++) {\n    if (!internal::ArrayEq(lhs[i], rhs[i]))\n      return false;\n  }\n  return true;\n}\n\n// Finds the first element in the iterator range [begin, end) that\n// equals elem.  Element may be a native array type itself.\ntemplate <typename Iter, typename Element>\nIter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {\n  for (Iter it = begin; it != end; ++it) {\n    if (internal::ArrayEq(*it, elem))\n      return it;\n  }\n  return end;\n}\n\n// CopyArray() copies a k-dimensional native array using the elements'\n// operator=, where k can be any integer >= 0.  When k is 0,\n// CopyArray() degenerates into copying a single value.\n\ntemplate <typename T, typename U>\nvoid CopyArray(const T* from, size_t size, U* to);\n\n// This generic version is used when k is 0.\ntemplate <typename T, typename U>\ninline void CopyArray(const T& from, U* to) { *to = from; }\n\n// This overload is used when k >= 1.\ntemplate <typename T, typename U, size_t N>\ninline void CopyArray(const T(&from)[N], U(*to)[N]) {\n  internal::CopyArray(from, N, *to);\n}\n\n// This helper reduces code bloat.  If we instead put its logic inside\n// the previous CopyArray() function, arrays with different sizes\n// would lead to different copies of the template code.\ntemplate <typename T, typename U>\nvoid CopyArray(const T* from, size_t size, U* to) {\n  for (size_t i = 0; i != size; i++) {\n    internal::CopyArray(from[i], to + i);\n  }\n}\n\n// The relation between an NativeArray object (see below) and the\n// native array it represents.\n// We use 2 different structs to allow non-copyable types to be used, as long\n// as RelationToSourceReference() is passed.\nstruct RelationToSourceReference {};\nstruct RelationToSourceCopy {};\n\n// Adapts a native array to a read-only STL-style container.  Instead\n// of the complete STL container concept, this adaptor only implements\n// members useful for Google Mock's container matchers.  New members\n// should be added as needed.  To simplify the implementation, we only\n// support Element being a raw type (i.e. having no top-level const or\n// reference modifier).  It's the client's responsibility to satisfy\n// this requirement.  Element can be an array type itself (hence\n// multi-dimensional arrays are supported).\ntemplate <typename Element>\nclass NativeArray {\n public:\n  // STL-style container typedefs.\n  typedef Element value_type;\n  typedef Element* iterator;\n  typedef const Element* const_iterator;\n\n  // Constructs from a native array. References the source.\n  NativeArray(const Element* array, size_t count, RelationToSourceReference) {\n    InitRef(array, count);\n  }\n\n  // Constructs from a native array. Copies the source.\n  NativeArray(const Element* array, size_t count, RelationToSourceCopy) {\n    InitCopy(array, count);\n  }\n\n  // Copy constructor.\n  NativeArray(const NativeArray& rhs) {\n    (this->*rhs.clone_)(rhs.array_, rhs.size_);\n  }\n\n  ~NativeArray() {\n    if (clone_ != &NativeArray::InitRef)\n      delete[] array_;\n  }\n\n  // STL-style container methods.\n  size_t size() const { return size_; }\n  const_iterator begin() const { return array_; }\n  const_iterator end() const { return array_ + size_; }\n  bool operator==(const NativeArray& rhs) const {\n    return size() == rhs.size() &&\n        ArrayEq(begin(), size(), rhs.begin());\n  }\n\n private:\n  static_assert(!std::is_const<Element>::value, \"Type must not be const\");\n  static_assert(!std::is_reference<Element>::value,\n                \"Type must not be a reference\");\n\n  // Initializes this object with a copy of the input.\n  void InitCopy(const Element* array, size_t a_size) {\n    Element* const copy = new Element[a_size];\n    CopyArray(array, a_size, copy);\n    array_ = copy;\n    size_ = a_size;\n    clone_ = &NativeArray::InitCopy;\n  }\n\n  // Initializes this object with a reference of the input.\n  void InitRef(const Element* array, size_t a_size) {\n    array_ = array;\n    size_ = a_size;\n    clone_ = &NativeArray::InitRef;\n  }\n\n  const Element* array_;\n  size_t size_;\n  void (NativeArray::*clone_)(const Element*, size_t);\n};\n\n// Backport of std::index_sequence.\ntemplate <size_t... Is>\nstruct IndexSequence {\n  using type = IndexSequence;\n};\n\n// Double the IndexSequence, and one if plus_one is true.\ntemplate <bool plus_one, typename T, size_t sizeofT>\nstruct DoubleSequence;\ntemplate <size_t... I, size_t sizeofT>\nstruct DoubleSequence<true, IndexSequence<I...>, sizeofT> {\n  using type = IndexSequence<I..., (sizeofT + I)..., 2 * sizeofT>;\n};\ntemplate <size_t... I, size_t sizeofT>\nstruct DoubleSequence<false, IndexSequence<I...>, sizeofT> {\n  using type = IndexSequence<I..., (sizeofT + I)...>;\n};\n\n// Backport of std::make_index_sequence.\n// It uses O(ln(N)) instantiation depth.\ntemplate <size_t N>\nstruct MakeIndexSequenceImpl\n    : DoubleSequence<N % 2 == 1, typename MakeIndexSequenceImpl<N / 2>::type,\n                     N / 2>::type {};\n\ntemplate <>\nstruct MakeIndexSequenceImpl<0> : IndexSequence<> {};\n\ntemplate <size_t N>\nusing MakeIndexSequence = typename MakeIndexSequenceImpl<N>::type;\n\ntemplate <typename... T>\nusing IndexSequenceFor = typename MakeIndexSequence<sizeof...(T)>::type;\n\ntemplate <size_t>\nstruct Ignore {\n  Ignore(...);  // NOLINT\n};\n\ntemplate <typename>\nstruct ElemFromListImpl;\ntemplate <size_t... I>\nstruct ElemFromListImpl<IndexSequence<I...>> {\n  // We make Ignore a template to solve a problem with MSVC.\n  // A non-template Ignore would work fine with `decltype(Ignore(I))...`, but\n  // MSVC doesn't understand how to deal with that pack expansion.\n  // Use `0 * I` to have a single instantiation of Ignore.\n  template <typename R>\n  static R Apply(Ignore<0 * I>..., R (*)(), ...);\n};\n\ntemplate <size_t N, typename... T>\nstruct ElemFromList {\n  using type =\n      decltype(ElemFromListImpl<typename MakeIndexSequence<N>::type>::Apply(\n          static_cast<T (*)()>(nullptr)...));\n};\n\nstruct FlatTupleConstructTag {};\n\ntemplate <typename... T>\nclass FlatTuple;\n\ntemplate <typename Derived, size_t I>\nstruct FlatTupleElemBase;\n\ntemplate <typename... T, size_t I>\nstruct FlatTupleElemBase<FlatTuple<T...>, I> {\n  using value_type = typename ElemFromList<I, T...>::type;\n  FlatTupleElemBase() = default;\n  template <typename Arg>\n  explicit FlatTupleElemBase(FlatTupleConstructTag, Arg&& t)\n      : value(std::forward<Arg>(t)) {}\n  value_type value;\n};\n\ntemplate <typename Derived, typename Idx>\nstruct FlatTupleBase;\n\ntemplate <size_t... Idx, typename... T>\nstruct FlatTupleBase<FlatTuple<T...>, IndexSequence<Idx...>>\n    : FlatTupleElemBase<FlatTuple<T...>, Idx>... {\n  using Indices = IndexSequence<Idx...>;\n  FlatTupleBase() = default;\n  template <typename... Args>\n  explicit FlatTupleBase(FlatTupleConstructTag, Args&&... args)\n      : FlatTupleElemBase<FlatTuple<T...>, Idx>(FlatTupleConstructTag{},\n                                                std::forward<Args>(args))... {}\n\n  template <size_t I>\n  const typename ElemFromList<I, T...>::type& Get() const {\n    return FlatTupleElemBase<FlatTuple<T...>, I>::value;\n  }\n\n  template <size_t I>\n  typename ElemFromList<I, T...>::type& Get() {\n    return FlatTupleElemBase<FlatTuple<T...>, I>::value;\n  }\n\n  template <typename F>\n  auto Apply(F&& f) -> decltype(std::forward<F>(f)(this->Get<Idx>()...)) {\n    return std::forward<F>(f)(Get<Idx>()...);\n  }\n\n  template <typename F>\n  auto Apply(F&& f) const -> decltype(std::forward<F>(f)(this->Get<Idx>()...)) {\n    return std::forward<F>(f)(Get<Idx>()...);\n  }\n};\n\n// Analog to std::tuple but with different tradeoffs.\n// This class minimizes the template instantiation depth, thus allowing more\n// elements than std::tuple would. std::tuple has been seen to require an\n// instantiation depth of more than 10x the number of elements in some\n// implementations.\n// FlatTuple and ElemFromList are not recursive and have a fixed depth\n// regardless of T...\n// MakeIndexSequence, on the other hand, it is recursive but with an\n// instantiation depth of O(ln(N)).\ntemplate <typename... T>\nclass FlatTuple\n    : private FlatTupleBase<FlatTuple<T...>,\n                            typename MakeIndexSequence<sizeof...(T)>::type> {\n  using Indices = typename FlatTupleBase<\n      FlatTuple<T...>, typename MakeIndexSequence<sizeof...(T)>::type>::Indices;\n\n public:\n  FlatTuple() = default;\n  template <typename... Args>\n  explicit FlatTuple(FlatTupleConstructTag tag, Args&&... args)\n      : FlatTuple::FlatTupleBase(tag, std::forward<Args>(args)...) {}\n\n  using FlatTuple::FlatTupleBase::Apply;\n  using FlatTuple::FlatTupleBase::Get;\n};\n\n// Utility functions to be called with static_assert to induce deprecation\n// warnings.\nGTEST_INTERNAL_DEPRECATED(\n    \"INSTANTIATE_TEST_CASE_P is deprecated, please use \"\n    \"INSTANTIATE_TEST_SUITE_P\")\nconstexpr bool InstantiateTestCase_P_IsDeprecated() { return true; }\n\nGTEST_INTERNAL_DEPRECATED(\n    \"TYPED_TEST_CASE_P is deprecated, please use \"\n    \"TYPED_TEST_SUITE_P\")\nconstexpr bool TypedTestCase_P_IsDeprecated() { return true; }\n\nGTEST_INTERNAL_DEPRECATED(\n    \"TYPED_TEST_CASE is deprecated, please use \"\n    \"TYPED_TEST_SUITE\")\nconstexpr bool TypedTestCaseIsDeprecated() { return true; }\n\nGTEST_INTERNAL_DEPRECATED(\n    \"REGISTER_TYPED_TEST_CASE_P is deprecated, please use \"\n    \"REGISTER_TYPED_TEST_SUITE_P\")\nconstexpr bool RegisterTypedTestCase_P_IsDeprecated() { return true; }\n\nGTEST_INTERNAL_DEPRECATED(\n    \"INSTANTIATE_TYPED_TEST_CASE_P is deprecated, please use \"\n    \"INSTANTIATE_TYPED_TEST_SUITE_P\")\nconstexpr bool InstantiateTypedTestCase_P_IsDeprecated() { return true; }\n\n}  // namespace internal\n}  // namespace testing\n\nnamespace std {\n// Some standard library implementations use `struct tuple_size` and some use\n// `class tuple_size`. Clang warns about the mismatch.\n// https://reviews.llvm.org/D55466\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wmismatched-tags\"\n#endif\ntemplate <typename... Ts>\nstruct tuple_size<testing::internal::FlatTuple<Ts...>>\n    : std::integral_constant<size_t, sizeof...(Ts)> {};\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n}  // namespace std\n\n#define GTEST_MESSAGE_AT_(file, line, message, result_type) \\\n  ::testing::internal::AssertHelper(result_type, file, line, message) \\\n    = ::testing::Message()\n\n#define GTEST_MESSAGE_(message, result_type) \\\n  GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)\n\n#define GTEST_FATAL_FAILURE_(message) \\\n  return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)\n\n#define GTEST_NONFATAL_FAILURE_(message) \\\n  GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)\n\n#define GTEST_SUCCESS_(message) \\\n  GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)\n\n#define GTEST_SKIP_(message) \\\n  return GTEST_MESSAGE_(message, ::testing::TestPartResult::kSkip)\n\n// Suppress MSVC warning 4072 (unreachable code) for the code following\n// statement if it returns or throws (or doesn't return or throw in some\n// situations).\n// NOTE: The \"else\" is important to keep this expansion to prevent a top-level\n// \"else\" from attaching to our \"if\".\n#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \\\n  if (::testing::internal::AlwaysTrue()) {                        \\\n    statement;                                                    \\\n  } else                     /* NOLINT */                         \\\n    static_assert(true, \"\")  // User must have a semicolon after expansion.\n\n#if GTEST_HAS_EXCEPTIONS\n\nnamespace testing {\nnamespace internal {\n\nclass NeverThrown {\n public:\n  const char* what() const noexcept {\n    return \"this exception should never be thrown\";\n  }\n};\n\n}  // namespace internal\n}  // namespace testing\n\n#if GTEST_HAS_RTTI\n\n#define GTEST_EXCEPTION_TYPE_(e) ::testing::internal::GetTypeName(typeid(e))\n\n#else  // GTEST_HAS_RTTI\n\n#define GTEST_EXCEPTION_TYPE_(e) \\\n  std::string { \"an std::exception-derived error\" }\n\n#endif  // GTEST_HAS_RTTI\n\n#define GTEST_TEST_THROW_CATCH_STD_EXCEPTION_(statement, expected_exception)   \\\n  catch (typename std::conditional<                                            \\\n         std::is_same<typename std::remove_cv<typename std::remove_reference<  \\\n                          expected_exception>::type>::type,                    \\\n                      std::exception>::value,                                  \\\n         const ::testing::internal::NeverThrown&, const std::exception&>::type \\\n             e) {                                                              \\\n    gtest_msg.value = \"Expected: \" #statement                                  \\\n                      \" throws an exception of type \" #expected_exception      \\\n                      \".\\n  Actual: it throws \";                               \\\n    gtest_msg.value += GTEST_EXCEPTION_TYPE_(e);                               \\\n    gtest_msg.value += \" with description \\\"\";                                 \\\n    gtest_msg.value += e.what();                                               \\\n    gtest_msg.value += \"\\\".\";                                                  \\\n    goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__);                \\\n  }\n\n#else  // GTEST_HAS_EXCEPTIONS\n\n#define GTEST_TEST_THROW_CATCH_STD_EXCEPTION_(statement, expected_exception)\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n#define GTEST_TEST_THROW_(statement, expected_exception, fail)              \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_                                             \\\n  if (::testing::internal::TrueWithString gtest_msg{}) {                    \\\n    bool gtest_caught_expected = false;                                     \\\n    try {                                                                   \\\n      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement);            \\\n    } catch (expected_exception const&) {                                   \\\n      gtest_caught_expected = true;                                         \\\n    }                                                                       \\\n    GTEST_TEST_THROW_CATCH_STD_EXCEPTION_(statement, expected_exception)    \\\n    catch (...) {                                                           \\\n      gtest_msg.value = \"Expected: \" #statement                             \\\n                        \" throws an exception of type \" #expected_exception \\\n                        \".\\n  Actual: it throws a different type.\";         \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__);           \\\n    }                                                                       \\\n    if (!gtest_caught_expected) {                                           \\\n      gtest_msg.value = \"Expected: \" #statement                             \\\n                        \" throws an exception of type \" #expected_exception \\\n                        \".\\n  Actual: it throws nothing.\";                  \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__);           \\\n    }                                                                       \\\n  } else /*NOLINT*/                                                         \\\n    GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__)                   \\\n        : fail(gtest_msg.value.c_str())\n\n#if GTEST_HAS_EXCEPTIONS\n\n#define GTEST_TEST_NO_THROW_CATCH_STD_EXCEPTION_()                \\\n  catch (std::exception const& e) {                               \\\n    gtest_msg.value = \"it throws \";                               \\\n    gtest_msg.value += GTEST_EXCEPTION_TYPE_(e);                  \\\n    gtest_msg.value += \" with description \\\"\";                    \\\n    gtest_msg.value += e.what();                                  \\\n    gtest_msg.value += \"\\\".\";                                     \\\n    goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \\\n  }\n\n#else  // GTEST_HAS_EXCEPTIONS\n\n#define GTEST_TEST_NO_THROW_CATCH_STD_EXCEPTION_()\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n#define GTEST_TEST_NO_THROW_(statement, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (::testing::internal::TrueWithString gtest_msg{}) { \\\n    try { \\\n      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n    } \\\n    GTEST_TEST_NO_THROW_CATCH_STD_EXCEPTION_() \\\n    catch (...) { \\\n      gtest_msg.value = \"it throws.\"; \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \\\n    } \\\n  } else \\\n    GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \\\n      fail((\"Expected: \" #statement \" doesn't throw an exception.\\n\" \\\n            \"  Actual: \" + gtest_msg.value).c_str())\n\n#define GTEST_TEST_ANY_THROW_(statement, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (::testing::internal::AlwaysTrue()) { \\\n    bool gtest_caught_any = false; \\\n    try { \\\n      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n    } \\\n    catch (...) { \\\n      gtest_caught_any = true; \\\n    } \\\n    if (!gtest_caught_any) { \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \\\n    } \\\n  } else \\\n    GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \\\n      fail(\"Expected: \" #statement \" throws an exception.\\n\" \\\n           \"  Actual: it doesn't.\")\n\n\n// Implements Boolean test assertions such as EXPECT_TRUE. expression can be\n// either a boolean expression or an AssertionResult. text is a textual\n// representation of expression as it was passed into the EXPECT_TRUE.\n#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (const ::testing::AssertionResult gtest_ar_ = \\\n      ::testing::AssertionResult(expression)) \\\n    ; \\\n  else \\\n    fail(::testing::internal::GetBoolAssertionFailureMessage(\\\n        gtest_ar_, text, #actual, #expected).c_str())\n\n#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (::testing::internal::AlwaysTrue()) { \\\n    ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \\\n    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n    if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \\\n    } \\\n  } else \\\n    GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \\\n      fail(\"Expected: \" #statement \" doesn't generate new fatal \" \\\n           \"failures in the current thread.\\n\" \\\n           \"  Actual: it does.\")\n\n// Expands to the name of the class that implements the given test.\n#define GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \\\n  test_suite_name##_##test_name##_Test\n\n// Helper macro for defining tests.\n#define GTEST_TEST_(test_suite_name, test_name, parent_class, parent_id)      \\\n  static_assert(sizeof(GTEST_STRINGIFY_(test_suite_name)) > 1,                \\\n                \"test_suite_name must not be empty\");                         \\\n  static_assert(sizeof(GTEST_STRINGIFY_(test_name)) > 1,                      \\\n                \"test_name must not be empty\");                               \\\n  class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)                    \\\n      : public parent_class {                                                 \\\n   public:                                                                    \\\n    GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() = default;           \\\n    ~GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() override = default; \\\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name,   \\\n                                                           test_name));       \\\n    GTEST_DISALLOW_MOVE_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name,   \\\n                                                           test_name));       \\\n                                                                              \\\n   private:                                                                   \\\n    void TestBody() override;                                                 \\\n    static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;     \\\n  };                                                                          \\\n                                                                              \\\n  ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_suite_name,          \\\n                                                    test_name)::test_info_ =  \\\n      ::testing::internal::MakeAndRegisterTestInfo(                           \\\n          #test_suite_name, #test_name, nullptr, nullptr,                     \\\n          ::testing::internal::CodeLocation(__FILE__, __LINE__), (parent_id), \\\n          ::testing::internal::SuiteApiResolver<                              \\\n              parent_class>::GetSetUpCaseOrSuite(__FILE__, __LINE__),         \\\n          ::testing::internal::SuiteApiResolver<                              \\\n              parent_class>::GetTearDownCaseOrSuite(__FILE__, __LINE__),      \\\n          new ::testing::internal::TestFactoryImpl<GTEST_TEST_CLASS_NAME_(    \\\n              test_suite_name, test_name)>);                                  \\\n  void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody()\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_\n// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n//\n// This header file defines the public API for death tests.  It is\n// #included by gtest.h so a user doesn't need to include this\n// directly.\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_\n#define GOOGLETEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_\n\n// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n//\n// This header file defines internal utilities needed for implementing\n// death tests.  They are subject to change without notice.\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_\n#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_\n\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// The Google C++ Testing and Mocking Framework (Google Test)\n//\n// This file implements just enough of the matcher interface to allow\n// EXPECT_DEATH and friends to accept a matcher argument.\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_MATCHERS_H_\n#define GOOGLETEST_INCLUDE_GTEST_GTEST_MATCHERS_H_\n\n#include <atomic>\n#include <memory>\n#include <ostream>\n#include <string>\n#include <type_traits>\n\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Test - The Google C++ Testing and Mocking Framework\n//\n// This file implements a universal value printer that can print a\n// value of any type T:\n//\n//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);\n//\n// A user can teach this function how to print a class type T by\n// defining either operator<<() or PrintTo() in the namespace that\n// defines T.  More specifically, the FIRST defined function in the\n// following list will be used (assuming T is defined in namespace\n// foo):\n//\n//   1. foo::PrintTo(const T&, ostream*)\n//   2. operator<<(ostream&, const T&) defined in either foo or the\n//      global namespace.\n//\n// However if T is an STL-style container then it is printed element-wise\n// unless foo::PrintTo(const T&, ostream*) is defined. Note that\n// operator<<() is ignored for container types.\n//\n// If none of the above is defined, it will print the debug string of\n// the value if it is a protocol buffer, or print the raw bytes in the\n// value otherwise.\n//\n// To aid debugging: when T is a reference type, the address of the\n// value is also printed; when T is a (const) char pointer, both the\n// pointer value and the NUL-terminated string it points to are\n// printed.\n//\n// We also provide some convenient wrappers:\n//\n//   // Prints a value to a string.  For a (const or not) char\n//   // pointer, the NUL-terminated string (but not the pointer) is\n//   // printed.\n//   std::string ::testing::PrintToString(const T& value);\n//\n//   // Prints a value tersely: for a reference type, the referenced\n//   // value (but not the address) is printed; for a (const or not) char\n//   // pointer, the NUL-terminated string (but not the pointer) is\n//   // printed.\n//   void ::testing::internal::UniversalTersePrint(const T& value, ostream*);\n//\n//   // Prints value using the type inferred by the compiler.  The difference\n//   // from UniversalTersePrint() is that this function prints both the\n//   // pointer and the NUL-terminated string for a (const or not) char pointer.\n//   void ::testing::internal::UniversalPrint(const T& value, ostream*);\n//\n//   // Prints the fields of a tuple tersely to a string vector, one\n//   // element for each field. Tuple support must be enabled in\n//   // gtest-port.h.\n//   std::vector<string> UniversalTersePrintTupleFieldsToStrings(\n//       const Tuple& value);\n//\n// Known limitation:\n//\n// The print primitives print the elements of an STL-style container\n// using the compiler-inferred type of *iter where iter is a\n// const_iterator of the container.  When const_iterator is an input\n// iterator but not a forward iterator, this inferred type may not\n// match value_type, and the print output may be incorrect.  In\n// practice, this is rarely a problem as for most containers\n// const_iterator is a forward iterator.  We'll fix this if there's an\n// actual need for it.  Note that this fix cannot rely on value_type\n// being defined as many user-defined container types don't have\n// value_type.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_PRINTERS_H_\n#define GOOGLETEST_INCLUDE_GTEST_GTEST_PRINTERS_H_\n\n#include <functional>\n#include <memory>\n#include <ostream>  // NOLINT\n#include <sstream>\n#include <string>\n#include <tuple>\n#include <type_traits>\n#include <utility>\n#include <vector>\n\n\n#if GTEST_HAS_RTTI\n#include <typeindex>\n#include <typeinfo>\n#endif  // GTEST_HAS_RTTI\n\nnamespace testing {\n\n// Definitions in the internal* namespaces are subject to change without notice.\n// DO NOT USE THEM IN USER CODE!\nnamespace internal {\n\ntemplate <typename T>\nvoid UniversalPrint(const T& value, ::std::ostream* os);\n\n// Used to print an STL-style container when the user doesn't define\n// a PrintTo() for it.\nstruct ContainerPrinter {\n  template <typename T,\n            typename = typename std::enable_if<\n                (sizeof(IsContainerTest<T>(0)) == sizeof(IsContainer)) &&\n                !IsRecursiveContainer<T>::value>::type>\n  static void PrintValue(const T& container, std::ostream* os) {\n    const size_t kMaxCount = 32;  // The maximum number of elements to print.\n    *os << '{';\n    size_t count = 0;\n    for (auto&& elem : container) {\n      if (count > 0) {\n        *os << ',';\n        if (count == kMaxCount) {  // Enough has been printed.\n          *os << \" ...\";\n          break;\n        }\n      }\n      *os << ' ';\n      // We cannot call PrintTo(elem, os) here as PrintTo() doesn't\n      // handle `elem` being a native array.\n      internal::UniversalPrint(elem, os);\n      ++count;\n    }\n\n    if (count > 0) {\n      *os << ' ';\n    }\n    *os << '}';\n  }\n};\n\n// Used to print a pointer that is neither a char pointer nor a member\n// pointer, when the user doesn't define PrintTo() for it.  (A member\n// variable pointer or member function pointer doesn't really point to\n// a location in the address space.  Their representation is\n// implementation-defined.  Therefore they will be printed as raw\n// bytes.)\nstruct FunctionPointerPrinter {\n  template <typename T, typename = typename std::enable_if<\n                            std::is_function<T>::value>::type>\n  static void PrintValue(T* p, ::std::ostream* os) {\n    if (p == nullptr) {\n      *os << \"NULL\";\n    } else {\n      // T is a function type, so '*os << p' doesn't do what we want\n      // (it just prints p as bool).  We want to print p as a const\n      // void*.\n      *os << reinterpret_cast<const void*>(p);\n    }\n  }\n};\n\nstruct PointerPrinter {\n  template <typename T>\n  static void PrintValue(T* p, ::std::ostream* os) {\n    if (p == nullptr) {\n      *os << \"NULL\";\n    } else {\n      // T is not a function type.  We just call << to print p,\n      // relying on ADL to pick up user-defined << for their pointer\n      // types, if any.\n      *os << p;\n    }\n  }\n};\n\nnamespace internal_stream_operator_without_lexical_name_lookup {\n\n// The presence of an operator<< here will terminate lexical scope lookup\n// straight away (even though it cannot be a match because of its argument\n// types). Thus, the two operator<< calls in StreamPrinter will find only ADL\n// candidates.\nstruct LookupBlocker {};\nvoid operator<<(LookupBlocker, LookupBlocker);\n\nstruct StreamPrinter {\n  template <typename T,\n            // Don't accept member pointers here. We'd print them via implicit\n            // conversion to bool, which isn't useful.\n            typename = typename std::enable_if<\n                !std::is_member_pointer<T>::value>::type,\n            // Only accept types for which we can find a streaming operator via\n            // ADL (possibly involving implicit conversions).\n            typename = decltype(std::declval<std::ostream&>()\n                                << std::declval<const T&>())>\n  static void PrintValue(const T& value, ::std::ostream* os) {\n    // Call streaming operator found by ADL, possibly with implicit conversions\n    // of the arguments.\n    *os << value;\n  }\n};\n\n}  // namespace internal_stream_operator_without_lexical_name_lookup\n\nstruct ProtobufPrinter {\n  // We print a protobuf using its ShortDebugString() when the string\n  // doesn't exceed this many characters; otherwise we print it using\n  // DebugString() for better readability.\n  static const size_t kProtobufOneLinerMaxLength = 50;\n\n  template <typename T,\n            typename = typename std::enable_if<\n                internal::HasDebugStringAndShortDebugString<T>::value>::type>\n  static void PrintValue(const T& value, ::std::ostream* os) {\n    std::string pretty_str = value.ShortDebugString();\n    if (pretty_str.length() > kProtobufOneLinerMaxLength) {\n      pretty_str = \"\\n\" + value.DebugString();\n    }\n    *os << (\"<\" + pretty_str + \">\");\n  }\n};\n\nstruct ConvertibleToIntegerPrinter {\n  // Since T has no << operator or PrintTo() but can be implicitly\n  // converted to BiggestInt, we print it as a BiggestInt.\n  //\n  // Most likely T is an enum type (either named or unnamed), in which\n  // case printing it as an integer is the desired behavior.  In case\n  // T is not an enum, printing it as an integer is the best we can do\n  // given that it has no user-defined printer.\n  static void PrintValue(internal::BiggestInt value, ::std::ostream* os) {\n    *os << value;\n  }\n};\n\nstruct ConvertibleToStringViewPrinter {\n#if GTEST_INTERNAL_HAS_STRING_VIEW\n  static void PrintValue(internal::StringView value, ::std::ostream* os) {\n    internal::UniversalPrint(value, os);\n  }\n#endif\n};\n\n\n// Prints the given number of bytes in the given object to the given\n// ostream.\nGTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,\n                                     size_t count,\n                                     ::std::ostream* os);\nstruct RawBytesPrinter {\n  // SFINAE on `sizeof` to make sure we have a complete type.\n  template <typename T, size_t = sizeof(T)>\n  static void PrintValue(const T& value, ::std::ostream* os) {\n    PrintBytesInObjectTo(\n        static_cast<const unsigned char*>(\n            // Load bearing cast to void* to support iOS\n            reinterpret_cast<const void*>(std::addressof(value))),\n        sizeof(value), os);\n  }\n};\n\nstruct FallbackPrinter {\n  template <typename T>\n  static void PrintValue(const T&, ::std::ostream* os) {\n    *os << \"(incomplete type)\";\n  }\n};\n\n// Try every printer in order and return the first one that works.\ntemplate <typename T, typename E, typename Printer, typename... Printers>\nstruct FindFirstPrinter : FindFirstPrinter<T, E, Printers...> {};\n\ntemplate <typename T, typename Printer, typename... Printers>\nstruct FindFirstPrinter<\n    T, decltype(Printer::PrintValue(std::declval<const T&>(), nullptr)),\n    Printer, Printers...> {\n  using type = Printer;\n};\n\n// Select the best printer in the following order:\n//  - Print containers (they have begin/end/etc).\n//  - Print function pointers.\n//  - Print object pointers.\n//  - Use the stream operator, if available.\n//  - Print protocol buffers.\n//  - Print types convertible to BiggestInt.\n//  - Print types convertible to StringView, if available.\n//  - Fallback to printing the raw bytes of the object.\ntemplate <typename T>\nvoid PrintWithFallback(const T& value, ::std::ostream* os) {\n  using Printer = typename FindFirstPrinter<\n      T, void, ContainerPrinter, FunctionPointerPrinter, PointerPrinter,\n      internal_stream_operator_without_lexical_name_lookup::StreamPrinter,\n      ProtobufPrinter, ConvertibleToIntegerPrinter,\n      ConvertibleToStringViewPrinter, RawBytesPrinter, FallbackPrinter>::type;\n  Printer::PrintValue(value, os);\n}\n\n// FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a\n// value of type ToPrint that is an operand of a comparison assertion\n// (e.g. ASSERT_EQ).  OtherOperand is the type of the other operand in\n// the comparison, and is used to help determine the best way to\n// format the value.  In particular, when the value is a C string\n// (char pointer) and the other operand is an STL string object, we\n// want to format the C string as a string, since we know it is\n// compared by value with the string object.  If the value is a char\n// pointer but the other operand is not an STL string object, we don't\n// know whether the pointer is supposed to point to a NUL-terminated\n// string, and thus want to print it as a pointer to be safe.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n\n// The default case.\ntemplate <typename ToPrint, typename OtherOperand>\nclass FormatForComparison {\n public:\n  static ::std::string Format(const ToPrint& value) {\n    return ::testing::PrintToString(value);\n  }\n};\n\n// Array.\ntemplate <typename ToPrint, size_t N, typename OtherOperand>\nclass FormatForComparison<ToPrint[N], OtherOperand> {\n public:\n  static ::std::string Format(const ToPrint* value) {\n    return FormatForComparison<const ToPrint*, OtherOperand>::Format(value);\n  }\n};\n\n// By default, print C string as pointers to be safe, as we don't know\n// whether they actually point to a NUL-terminated string.\n\n#define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType)                \\\n  template <typename OtherOperand>                                      \\\n  class FormatForComparison<CharType*, OtherOperand> {                  \\\n   public:                                                              \\\n    static ::std::string Format(CharType* value) {                      \\\n      return ::testing::PrintToString(static_cast<const void*>(value)); \\\n    }                                                                   \\\n  }\n\nGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char);\nGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char);\nGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t);\nGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);\n#ifdef __cpp_char8_t\nGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char8_t);\nGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char8_t);\n#endif\nGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char16_t);\nGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char16_t);\nGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char32_t);\nGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char32_t);\n\n#undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_\n\n// If a C string is compared with an STL string object, we know it's meant\n// to point to a NUL-terminated string, and thus can print it as a string.\n\n#define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \\\n  template <>                                                           \\\n  class FormatForComparison<CharType*, OtherStringType> {               \\\n   public:                                                              \\\n    static ::std::string Format(CharType* value) {                      \\\n      return ::testing::PrintToString(value);                           \\\n    }                                                                   \\\n  }\n\nGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string);\nGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string);\n#ifdef __cpp_char8_t\nGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char8_t, ::std::u8string);\nGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char8_t, ::std::u8string);\n#endif\nGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char16_t, ::std::u16string);\nGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char16_t, ::std::u16string);\nGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char32_t, ::std::u32string);\nGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char32_t, ::std::u32string);\n\n#if GTEST_HAS_STD_WSTRING\nGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring);\nGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring);\n#endif\n\n#undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_\n\n// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)\n// operand to be used in a failure message.  The type (but not value)\n// of the other operand may affect the format.  This allows us to\n// print a char* as a raw pointer when it is compared against another\n// char* or void*, and print it as a C string when it is compared\n// against an std::string object, for example.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\ntemplate <typename T1, typename T2>\nstd::string FormatForComparisonFailureMessage(\n    const T1& value, const T2& /* other_operand */) {\n  return FormatForComparison<T1, T2>::Format(value);\n}\n\n// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given\n// value to the given ostream.  The caller must ensure that\n// 'ostream_ptr' is not NULL, or the behavior is undefined.\n//\n// We define UniversalPrinter as a class template (as opposed to a\n// function template), as we need to partially specialize it for\n// reference types, which cannot be done with function templates.\ntemplate <typename T>\nclass UniversalPrinter;\n\n// Prints the given value using the << operator if it has one;\n// otherwise prints the bytes in it.  This is what\n// UniversalPrinter<T>::Print() does when PrintTo() is not specialized\n// or overloaded for type T.\n//\n// A user can override this behavior for a class type Foo by defining\n// an overload of PrintTo() in the namespace where Foo is defined.  We\n// give the user this option as sometimes defining a << operator for\n// Foo is not desirable (e.g. the coding style may prevent doing it,\n// or there is already a << operator but it doesn't do what the user\n// wants).\ntemplate <typename T>\nvoid PrintTo(const T& value, ::std::ostream* os) {\n  internal::PrintWithFallback(value, os);\n}\n\n// The following list of PrintTo() overloads tells\n// UniversalPrinter<T>::Print() how to print standard types (built-in\n// types, strings, plain arrays, and pointers).\n\n// Overloads for various char types.\nGTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);\nGTEST_API_ void PrintTo(signed char c, ::std::ostream* os);\ninline void PrintTo(char c, ::std::ostream* os) {\n  // When printing a plain char, we always treat it as unsigned.  This\n  // way, the output won't be affected by whether the compiler thinks\n  // char is signed or not.\n  PrintTo(static_cast<unsigned char>(c), os);\n}\n\n// Overloads for other simple built-in types.\ninline void PrintTo(bool x, ::std::ostream* os) {\n  *os << (x ? \"true\" : \"false\");\n}\n\n// Overload for wchar_t type.\n// Prints a wchar_t as a symbol if it is printable or as its internal\n// code otherwise and also as its decimal code (except for L'\\0').\n// The L'\\0' char is printed as \"L'\\\\0'\". The decimal code is printed\n// as signed integer when wchar_t is implemented by the compiler\n// as a signed type and is printed as an unsigned integer when wchar_t\n// is implemented as an unsigned type.\nGTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);\n\nGTEST_API_ void PrintTo(char32_t c, ::std::ostream* os);\ninline void PrintTo(char16_t c, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<char32_t>(c), os);\n}\n#ifdef __cpp_char8_t\ninline void PrintTo(char8_t c, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<char32_t>(c), os);\n}\n#endif\n\n// Overloads for C strings.\nGTEST_API_ void PrintTo(const char* s, ::std::ostream* os);\ninline void PrintTo(char* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const char*>(s), os);\n}\n\n// signed/unsigned char is often used for representing binary data, so\n// we print pointers to it as void* to be safe.\ninline void PrintTo(const signed char* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const void*>(s), os);\n}\ninline void PrintTo(signed char* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const void*>(s), os);\n}\ninline void PrintTo(const unsigned char* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const void*>(s), os);\n}\ninline void PrintTo(unsigned char* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const void*>(s), os);\n}\n#ifdef __cpp_char8_t\n// Overloads for u8 strings.\nvoid PrintTo(const char8_t* s, ::std::ostream* os);\ninline void PrintTo(char8_t* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const char8_t*>(s), os);\n}\n#endif\n// Overloads for u16 strings.\nvoid PrintTo(const char16_t* s, ::std::ostream* os);\ninline void PrintTo(char16_t* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const char16_t*>(s), os);\n}\n// Overloads for u32 strings.\nvoid PrintTo(const char32_t* s, ::std::ostream* os);\ninline void PrintTo(char32_t* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const char32_t*>(s), os);\n}\n\n// MSVC can be configured to define wchar_t as a typedef of unsigned\n// short.  It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native\n// type.  When wchar_t is a typedef, defining an overload for const\n// wchar_t* would cause unsigned short* be printed as a wide string,\n// possibly causing invalid memory accesses.\n#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)\n// Overloads for wide C strings\nGTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);\ninline void PrintTo(wchar_t* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const wchar_t*>(s), os);\n}\n#endif\n\n// Overload for C arrays.  Multi-dimensional arrays are printed\n// properly.\n\n// Prints the given number of elements in an array, without printing\n// the curly braces.\ntemplate <typename T>\nvoid PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {\n  UniversalPrint(a[0], os);\n  for (size_t i = 1; i != count; i++) {\n    *os << \", \";\n    UniversalPrint(a[i], os);\n  }\n}\n\n// Overloads for ::std::string.\nGTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);\ninline void PrintTo(const ::std::string& s, ::std::ostream* os) {\n  PrintStringTo(s, os);\n}\n\n// Overloads for ::std::u8string\n#ifdef __cpp_char8_t\nGTEST_API_ void PrintU8StringTo(const ::std::u8string& s, ::std::ostream* os);\ninline void PrintTo(const ::std::u8string& s, ::std::ostream* os) {\n  PrintU8StringTo(s, os);\n}\n#endif\n\n// Overloads for ::std::u16string\nGTEST_API_ void PrintU16StringTo(const ::std::u16string& s, ::std::ostream* os);\ninline void PrintTo(const ::std::u16string& s, ::std::ostream* os) {\n  PrintU16StringTo(s, os);\n}\n\n// Overloads for ::std::u32string\nGTEST_API_ void PrintU32StringTo(const ::std::u32string& s, ::std::ostream* os);\ninline void PrintTo(const ::std::u32string& s, ::std::ostream* os) {\n  PrintU32StringTo(s, os);\n}\n\n// Overloads for ::std::wstring.\n#if GTEST_HAS_STD_WSTRING\nGTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);\ninline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {\n  PrintWideStringTo(s, os);\n}\n#endif  // GTEST_HAS_STD_WSTRING\n\n#if GTEST_INTERNAL_HAS_STRING_VIEW\n// Overload for internal::StringView.\ninline void PrintTo(internal::StringView sp, ::std::ostream* os) {\n  PrintTo(::std::string(sp), os);\n}\n#endif  // GTEST_INTERNAL_HAS_STRING_VIEW\n\ninline void PrintTo(std::nullptr_t, ::std::ostream* os) { *os << \"(nullptr)\"; }\n\ntemplate <typename T>\nvoid PrintTo(std::reference_wrapper<T> ref, ::std::ostream* os) {\n  UniversalPrinter<T&>::Print(ref.get(), os);\n}\n\ninline const void* VoidifyPointer(const void* p) { return p; }\ninline const void* VoidifyPointer(volatile const void* p) {\n  return const_cast<const void*>(p);\n}\n\ntemplate <typename T, typename Ptr>\nvoid PrintSmartPointer(const Ptr& ptr, std::ostream* os, char) {\n  if (ptr == nullptr) {\n    *os << \"(nullptr)\";\n  } else {\n    // We can't print the value. Just print the pointer..\n    *os << \"(\" << (VoidifyPointer)(ptr.get()) << \")\";\n  }\n}\ntemplate <typename T, typename Ptr,\n          typename = typename std::enable_if<!std::is_void<T>::value &&\n                                             !std::is_array<T>::value>::type>\nvoid PrintSmartPointer(const Ptr& ptr, std::ostream* os, int) {\n  if (ptr == nullptr) {\n    *os << \"(nullptr)\";\n  } else {\n    *os << \"(ptr = \" << (VoidifyPointer)(ptr.get()) << \", value = \";\n    UniversalPrinter<T>::Print(*ptr, os);\n    *os << \")\";\n  }\n}\n\ntemplate <typename T, typename D>\nvoid PrintTo(const std::unique_ptr<T, D>& ptr, std::ostream* os) {\n  (PrintSmartPointer<T>)(ptr, os, 0);\n}\n\ntemplate <typename T>\nvoid PrintTo(const std::shared_ptr<T>& ptr, std::ostream* os) {\n  (PrintSmartPointer<T>)(ptr, os, 0);\n}\n\n// Helper function for printing a tuple.  T must be instantiated with\n// a tuple type.\ntemplate <typename T>\nvoid PrintTupleTo(const T&, std::integral_constant<size_t, 0>,\n                  ::std::ostream*) {}\n\ntemplate <typename T, size_t I>\nvoid PrintTupleTo(const T& t, std::integral_constant<size_t, I>,\n                  ::std::ostream* os) {\n  PrintTupleTo(t, std::integral_constant<size_t, I - 1>(), os);\n  GTEST_INTENTIONAL_CONST_COND_PUSH_()\n  if (I > 1) {\n    GTEST_INTENTIONAL_CONST_COND_POP_()\n    *os << \", \";\n  }\n  UniversalPrinter<typename std::tuple_element<I - 1, T>::type>::Print(\n      std::get<I - 1>(t), os);\n}\n\ntemplate <typename... Types>\nvoid PrintTo(const ::std::tuple<Types...>& t, ::std::ostream* os) {\n  *os << \"(\";\n  PrintTupleTo(t, std::integral_constant<size_t, sizeof...(Types)>(), os);\n  *os << \")\";\n}\n\n// Overload for std::pair.\ntemplate <typename T1, typename T2>\nvoid PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {\n  *os << '(';\n  // We cannot use UniversalPrint(value.first, os) here, as T1 may be\n  // a reference type.  The same for printing value.second.\n  UniversalPrinter<T1>::Print(value.first, os);\n  *os << \", \";\n  UniversalPrinter<T2>::Print(value.second, os);\n  *os << ')';\n}\n\n#if GTEST_HAS_RTTI\ninline void PrintTo(const ::std::type_info& value, ::std::ostream* os) {\n  internal::PrintTo<::std::type_info>(value, os);\n  *os << \" (\\\"\" << value.name() << \"\\\")\";\n}\n\ninline void PrintTo(const ::std::type_index& value, ::std::ostream* os) {\n  internal::PrintTo<::std::type_index>(value, os);\n  *os << \" (\\\"\" << value.name() << \"\\\")\";\n}\n#endif  // GTEST_HAS_RTTI\n\n// Implements printing a non-reference type T by letting the compiler\n// pick the right overload of PrintTo() for T.\ntemplate <typename T>\nclass UniversalPrinter {\n public:\n  // MSVC warns about adding const to a function type, so we want to\n  // disable the warning.\n  GTEST_DISABLE_MSC_WARNINGS_PUSH_(4180)\n\n  // Note: we deliberately don't call this PrintTo(), as that name\n  // conflicts with ::testing::internal::PrintTo in the body of the\n  // function.\n  static void Print(const T& value, ::std::ostream* os) {\n    // By default, ::testing::internal::PrintTo() is used for printing\n    // the value.\n    //\n    // Thanks to Koenig look-up, if T is a class and has its own\n    // PrintTo() function defined in its namespace, that function will\n    // be visible here.  Since it is more specific than the generic ones\n    // in ::testing::internal, it will be picked by the compiler in the\n    // following statement - exactly what we want.\n    PrintTo(value, os);\n  }\n\n  GTEST_DISABLE_MSC_WARNINGS_POP_()\n};\n\n// Remove any const-qualifiers before passing a type to UniversalPrinter.\ntemplate <typename T>\nclass UniversalPrinter<const T> : public UniversalPrinter<T> {};\n\n#if GTEST_INTERNAL_HAS_ANY\n\n// Printer for std::any / absl::any\n\ntemplate <>\nclass UniversalPrinter<Any> {\n public:\n  static void Print(const Any& value, ::std::ostream* os) {\n    if (value.has_value()) {\n      *os << \"value of type \" << GetTypeName(value);\n    } else {\n      *os << \"no value\";\n    }\n  }\n\n private:\n  static std::string GetTypeName(const Any& value) {\n#if GTEST_HAS_RTTI\n    return internal::GetTypeName(value.type());\n#else\n    static_cast<void>(value);  // possibly unused\n    return \"<unknown_type>\";\n#endif  // GTEST_HAS_RTTI\n  }\n};\n\n#endif  // GTEST_INTERNAL_HAS_ANY\n\n#if GTEST_INTERNAL_HAS_OPTIONAL\n\n// Printer for std::optional / absl::optional\n\ntemplate <typename T>\nclass UniversalPrinter<Optional<T>> {\n public:\n  static void Print(const Optional<T>& value, ::std::ostream* os) {\n    *os << '(';\n    if (!value) {\n      *os << \"nullopt\";\n    } else {\n      UniversalPrint(*value, os);\n    }\n    *os << ')';\n  }\n};\n\n#endif  // GTEST_INTERNAL_HAS_OPTIONAL\n\n#if GTEST_INTERNAL_HAS_VARIANT\n\n// Printer for std::variant / absl::variant\n\ntemplate <typename... T>\nclass UniversalPrinter<Variant<T...>> {\n public:\n  static void Print(const Variant<T...>& value, ::std::ostream* os) {\n    *os << '(';\n#if GTEST_HAS_ABSL\n    absl::visit(Visitor{os, value.index()}, value);\n#else\n    std::visit(Visitor{os, value.index()}, value);\n#endif  // GTEST_HAS_ABSL\n    *os << ')';\n  }\n\n private:\n  struct Visitor {\n    template <typename U>\n    void operator()(const U& u) const {\n      *os << \"'\" << GetTypeName<U>() << \"(index = \" << index\n          << \")' with value \";\n      UniversalPrint(u, os);\n    }\n    ::std::ostream* os;\n    std::size_t index;\n  };\n};\n\n#endif  // GTEST_INTERNAL_HAS_VARIANT\n\n// UniversalPrintArray(begin, len, os) prints an array of 'len'\n// elements, starting at address 'begin'.\ntemplate <typename T>\nvoid UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {\n  if (len == 0) {\n    *os << \"{}\";\n  } else {\n    *os << \"{ \";\n    const size_t kThreshold = 18;\n    const size_t kChunkSize = 8;\n    // If the array has more than kThreshold elements, we'll have to\n    // omit some details by printing only the first and the last\n    // kChunkSize elements.\n    if (len <= kThreshold) {\n      PrintRawArrayTo(begin, len, os);\n    } else {\n      PrintRawArrayTo(begin, kChunkSize, os);\n      *os << \", ..., \";\n      PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);\n    }\n    *os << \" }\";\n  }\n}\n// This overload prints a (const) char array compactly.\nGTEST_API_ void UniversalPrintArray(\n    const char* begin, size_t len, ::std::ostream* os);\n\n#ifdef __cpp_char8_t\n// This overload prints a (const) char8_t array compactly.\nGTEST_API_ void UniversalPrintArray(const char8_t* begin, size_t len,\n                                    ::std::ostream* os);\n#endif\n\n// This overload prints a (const) char16_t array compactly.\nGTEST_API_ void UniversalPrintArray(const char16_t* begin, size_t len,\n                                    ::std::ostream* os);\n\n// This overload prints a (const) char32_t array compactly.\nGTEST_API_ void UniversalPrintArray(const char32_t* begin, size_t len,\n                                    ::std::ostream* os);\n\n// This overload prints a (const) wchar_t array compactly.\nGTEST_API_ void UniversalPrintArray(\n    const wchar_t* begin, size_t len, ::std::ostream* os);\n\n// Implements printing an array type T[N].\ntemplate <typename T, size_t N>\nclass UniversalPrinter<T[N]> {\n public:\n  // Prints the given array, omitting some elements when there are too\n  // many.\n  static void Print(const T (&a)[N], ::std::ostream* os) {\n    UniversalPrintArray(a, N, os);\n  }\n};\n\n// Implements printing a reference type T&.\ntemplate <typename T>\nclass UniversalPrinter<T&> {\n public:\n  // MSVC warns about adding const to a function type, so we want to\n  // disable the warning.\n  GTEST_DISABLE_MSC_WARNINGS_PUSH_(4180)\n\n  static void Print(const T& value, ::std::ostream* os) {\n    // Prints the address of the value.  We use reinterpret_cast here\n    // as static_cast doesn't compile when T is a function type.\n    *os << \"@\" << reinterpret_cast<const void*>(&value) << \" \";\n\n    // Then prints the value itself.\n    UniversalPrint(value, os);\n  }\n\n  GTEST_DISABLE_MSC_WARNINGS_POP_()\n};\n\n// Prints a value tersely: for a reference type, the referenced value\n// (but not the address) is printed; for a (const) char pointer, the\n// NUL-terminated string (but not the pointer) is printed.\n\ntemplate <typename T>\nclass UniversalTersePrinter {\n public:\n  static void Print(const T& value, ::std::ostream* os) {\n    UniversalPrint(value, os);\n  }\n};\ntemplate <typename T>\nclass UniversalTersePrinter<T&> {\n public:\n  static void Print(const T& value, ::std::ostream* os) {\n    UniversalPrint(value, os);\n  }\n};\ntemplate <typename T, size_t N>\nclass UniversalTersePrinter<T[N]> {\n public:\n  static void Print(const T (&value)[N], ::std::ostream* os) {\n    UniversalPrinter<T[N]>::Print(value, os);\n  }\n};\ntemplate <>\nclass UniversalTersePrinter<const char*> {\n public:\n  static void Print(const char* str, ::std::ostream* os) {\n    if (str == nullptr) {\n      *os << \"NULL\";\n    } else {\n      UniversalPrint(std::string(str), os);\n    }\n  }\n};\ntemplate <>\nclass UniversalTersePrinter<char*> : public UniversalTersePrinter<const char*> {\n};\n\n#ifdef __cpp_char8_t\ntemplate <>\nclass UniversalTersePrinter<const char8_t*> {\n public:\n  static void Print(const char8_t* str, ::std::ostream* os) {\n    if (str == nullptr) {\n      *os << \"NULL\";\n    } else {\n      UniversalPrint(::std::u8string(str), os);\n    }\n  }\n};\ntemplate <>\nclass UniversalTersePrinter<char8_t*>\n    : public UniversalTersePrinter<const char8_t*> {};\n#endif\n\ntemplate <>\nclass UniversalTersePrinter<const char16_t*> {\n public:\n  static void Print(const char16_t* str, ::std::ostream* os) {\n    if (str == nullptr) {\n      *os << \"NULL\";\n    } else {\n      UniversalPrint(::std::u16string(str), os);\n    }\n  }\n};\ntemplate <>\nclass UniversalTersePrinter<char16_t*>\n    : public UniversalTersePrinter<const char16_t*> {};\n\ntemplate <>\nclass UniversalTersePrinter<const char32_t*> {\n public:\n  static void Print(const char32_t* str, ::std::ostream* os) {\n    if (str == nullptr) {\n      *os << \"NULL\";\n    } else {\n      UniversalPrint(::std::u32string(str), os);\n    }\n  }\n};\ntemplate <>\nclass UniversalTersePrinter<char32_t*>\n    : public UniversalTersePrinter<const char32_t*> {};\n\n#if GTEST_HAS_STD_WSTRING\ntemplate <>\nclass UniversalTersePrinter<const wchar_t*> {\n public:\n  static void Print(const wchar_t* str, ::std::ostream* os) {\n    if (str == nullptr) {\n      *os << \"NULL\";\n    } else {\n      UniversalPrint(::std::wstring(str), os);\n    }\n  }\n};\n#endif\n\ntemplate <>\nclass UniversalTersePrinter<wchar_t*> {\n public:\n  static void Print(wchar_t* str, ::std::ostream* os) {\n    UniversalTersePrinter<const wchar_t*>::Print(str, os);\n  }\n};\n\ntemplate <typename T>\nvoid UniversalTersePrint(const T& value, ::std::ostream* os) {\n  UniversalTersePrinter<T>::Print(value, os);\n}\n\n// Prints a value using the type inferred by the compiler.  The\n// difference between this and UniversalTersePrint() is that for a\n// (const) char pointer, this prints both the pointer and the\n// NUL-terminated string.\ntemplate <typename T>\nvoid UniversalPrint(const T& value, ::std::ostream* os) {\n  // A workarond for the bug in VC++ 7.1 that prevents us from instantiating\n  // UniversalPrinter with T directly.\n  typedef T T1;\n  UniversalPrinter<T1>::Print(value, os);\n}\n\ntypedef ::std::vector< ::std::string> Strings;\n\n  // Tersely prints the first N fields of a tuple to a string vector,\n  // one element for each field.\ntemplate <typename Tuple>\nvoid TersePrintPrefixToStrings(const Tuple&, std::integral_constant<size_t, 0>,\n                               Strings*) {}\ntemplate <typename Tuple, size_t I>\nvoid TersePrintPrefixToStrings(const Tuple& t,\n                               std::integral_constant<size_t, I>,\n                               Strings* strings) {\n  TersePrintPrefixToStrings(t, std::integral_constant<size_t, I - 1>(),\n                            strings);\n  ::std::stringstream ss;\n  UniversalTersePrint(std::get<I - 1>(t), &ss);\n  strings->push_back(ss.str());\n}\n\n// Prints the fields of a tuple tersely to a string vector, one\n// element for each field.  See the comment before\n// UniversalTersePrint() for how we define \"tersely\".\ntemplate <typename Tuple>\nStrings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {\n  Strings result;\n  TersePrintPrefixToStrings(\n      value, std::integral_constant<size_t, std::tuple_size<Tuple>::value>(),\n      &result);\n  return result;\n}\n\n}  // namespace internal\n\ntemplate <typename T>\n::std::string PrintToString(const T& value) {\n  ::std::stringstream ss;\n  internal::UniversalTersePrinter<T>::Print(value, &ss);\n  return ss.str();\n}\n\n}  // namespace testing\n\n// Include any custom printer added by the local installation.\n// We must include this header at the end to make sure it can use the\n// declarations from this file.\n// Copyright 2015, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// This file provides an injection point for custom printers in a local\n// installation of gTest.\n// It will be included from gtest-printers.h and the overrides in this file\n// will be visible to everyone.\n//\n// Injection point for custom user configurations. See README for details\n//\n// ** Custom implementation starts here **\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_\n#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_PRINTERS_H_\n\n// MSVC warning C5046 is new as of VS2017 version 15.8.\n#if defined(_MSC_VER) && _MSC_VER >= 1915\n#define GTEST_MAYBE_5046_ 5046\n#else\n#define GTEST_MAYBE_5046_\n#endif\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(\n    4251 GTEST_MAYBE_5046_ /* class A needs to have dll-interface to be used by\n                              clients of class B */\n    /* Symbol involving type with internal linkage not defined */)\n\nnamespace testing {\n\n// To implement a matcher Foo for type T, define:\n//   1. a class FooMatcherMatcher that implements the matcher interface:\n//     using is_gtest_matcher = void;\n//     bool MatchAndExplain(const T&, std::ostream*);\n//       (MatchResultListener* can also be used instead of std::ostream*)\n//     void DescribeTo(std::ostream*);\n//     void DescribeNegationTo(std::ostream*);\n//\n//   2. a factory function that creates a Matcher<T> object from a\n//      FooMatcherMatcher.\n\nclass MatchResultListener {\n public:\n  // Creates a listener object with the given underlying ostream.  The\n  // listener does not own the ostream, and does not dereference it\n  // in the constructor or destructor.\n  explicit MatchResultListener(::std::ostream* os) : stream_(os) {}\n  virtual ~MatchResultListener() = 0;  // Makes this class abstract.\n\n  // Streams x to the underlying ostream; does nothing if the ostream\n  // is NULL.\n  template <typename T>\n  MatchResultListener& operator<<(const T& x) {\n    if (stream_ != nullptr) *stream_ << x;\n    return *this;\n  }\n\n  // Returns the underlying ostream.\n  ::std::ostream* stream() { return stream_; }\n\n  // Returns true if and only if the listener is interested in an explanation\n  // of the match result.  A matcher's MatchAndExplain() method can use\n  // this information to avoid generating the explanation when no one\n  // intends to hear it.\n  bool IsInterested() const { return stream_ != nullptr; }\n\n private:\n  ::std::ostream* const stream_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener);\n};\n\ninline MatchResultListener::~MatchResultListener() {\n}\n\n// An instance of a subclass of this knows how to describe itself as a\n// matcher.\nclass MatcherDescriberInterface {\n public:\n  virtual ~MatcherDescriberInterface() {}\n\n  // Describes this matcher to an ostream.  The function should print\n  // a verb phrase that describes the property a value matching this\n  // matcher should have.  The subject of the verb phrase is the value\n  // being matched.  For example, the DescribeTo() method of the Gt(7)\n  // matcher prints \"is greater than 7\".\n  virtual void DescribeTo(::std::ostream* os) const = 0;\n\n  // Describes the negation of this matcher to an ostream.  For\n  // example, if the description of this matcher is \"is greater than\n  // 7\", the negated description could be \"is not greater than 7\".\n  // You are not required to override this when implementing\n  // MatcherInterface, but it is highly advised so that your matcher\n  // can produce good error messages.\n  virtual void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"not (\";\n    DescribeTo(os);\n    *os << \")\";\n  }\n};\n\n// The implementation of a matcher.\ntemplate <typename T>\nclass MatcherInterface : public MatcherDescriberInterface {\n public:\n  // Returns true if and only if the matcher matches x; also explains the\n  // match result to 'listener' if necessary (see the next paragraph), in\n  // the form of a non-restrictive relative clause (\"which ...\",\n  // \"whose ...\", etc) that describes x.  For example, the\n  // MatchAndExplain() method of the Pointee(...) matcher should\n  // generate an explanation like \"which points to ...\".\n  //\n  // Implementations of MatchAndExplain() should add an explanation of\n  // the match result *if and only if* they can provide additional\n  // information that's not already present (or not obvious) in the\n  // print-out of x and the matcher's description.  Whether the match\n  // succeeds is not a factor in deciding whether an explanation is\n  // needed, as sometimes the caller needs to print a failure message\n  // when the match succeeds (e.g. when the matcher is used inside\n  // Not()).\n  //\n  // For example, a \"has at least 10 elements\" matcher should explain\n  // what the actual element count is, regardless of the match result,\n  // as it is useful information to the reader; on the other hand, an\n  // \"is empty\" matcher probably only needs to explain what the actual\n  // size is when the match fails, as it's redundant to say that the\n  // size is 0 when the value is already known to be empty.\n  //\n  // You should override this method when defining a new matcher.\n  //\n  // It's the responsibility of the caller (Google Test) to guarantee\n  // that 'listener' is not NULL.  This helps to simplify a matcher's\n  // implementation when it doesn't care about the performance, as it\n  // can talk to 'listener' without checking its validity first.\n  // However, in order to implement dummy listeners efficiently,\n  // listener->stream() may be NULL.\n  virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0;\n\n  // Inherits these methods from MatcherDescriberInterface:\n  //   virtual void DescribeTo(::std::ostream* os) const = 0;\n  //   virtual void DescribeNegationTo(::std::ostream* os) const;\n};\n\nnamespace internal {\n\nstruct AnyEq {\n  template <typename A, typename B>\n  bool operator()(const A& a, const B& b) const { return a == b; }\n};\nstruct AnyNe {\n  template <typename A, typename B>\n  bool operator()(const A& a, const B& b) const { return a != b; }\n};\nstruct AnyLt {\n  template <typename A, typename B>\n  bool operator()(const A& a, const B& b) const { return a < b; }\n};\nstruct AnyGt {\n  template <typename A, typename B>\n  bool operator()(const A& a, const B& b) const { return a > b; }\n};\nstruct AnyLe {\n  template <typename A, typename B>\n  bool operator()(const A& a, const B& b) const { return a <= b; }\n};\nstruct AnyGe {\n  template <typename A, typename B>\n  bool operator()(const A& a, const B& b) const { return a >= b; }\n};\n\n// A match result listener that ignores the explanation.\nclass DummyMatchResultListener : public MatchResultListener {\n public:\n  DummyMatchResultListener() : MatchResultListener(nullptr) {}\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener);\n};\n\n// A match result listener that forwards the explanation to a given\n// ostream.  The difference between this and MatchResultListener is\n// that the former is concrete.\nclass StreamMatchResultListener : public MatchResultListener {\n public:\n  explicit StreamMatchResultListener(::std::ostream* os)\n      : MatchResultListener(os) {}\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener);\n};\n\nstruct SharedPayloadBase {\n  std::atomic<int> ref{1};\n  void Ref() { ref.fetch_add(1, std::memory_order_relaxed); }\n  bool Unref() { return ref.fetch_sub(1, std::memory_order_acq_rel) == 1; }\n};\n\ntemplate <typename T>\nstruct SharedPayload : SharedPayloadBase {\n  explicit SharedPayload(const T& v) : value(v) {}\n  explicit SharedPayload(T&& v) : value(std::move(v)) {}\n\n  static void Destroy(SharedPayloadBase* shared) {\n    delete static_cast<SharedPayload*>(shared);\n  }\n\n  T value;\n};\n\ntemplate <typename T>\nusing is_trivially_copy_constructible =\n#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 5\n    std::has_trivial_copy_constructor<T>;\n#else\n    std::is_trivially_copy_constructible<T>;\n#endif\n\n// An internal class for implementing Matcher<T>, which will derive\n// from it.  We put functionalities common to all Matcher<T>\n// specializations here to avoid code duplication.\ntemplate <typename T>\nclass MatcherBase : private MatcherDescriberInterface {\n public:\n  // Returns true if and only if the matcher matches x; also explains the\n  // match result to 'listener'.\n  bool MatchAndExplain(const T& x, MatchResultListener* listener) const {\n    GTEST_CHECK_(vtable_ != nullptr);\n    return vtable_->match_and_explain(*this, x, listener);\n  }\n\n  // Returns true if and only if this matcher matches x.\n  bool Matches(const T& x) const {\n    DummyMatchResultListener dummy;\n    return MatchAndExplain(x, &dummy);\n  }\n\n  // Describes this matcher to an ostream.\n  void DescribeTo(::std::ostream* os) const final {\n    GTEST_CHECK_(vtable_ != nullptr);\n    vtable_->describe(*this, os, false);\n  }\n\n  // Describes the negation of this matcher to an ostream.\n  void DescribeNegationTo(::std::ostream* os) const final {\n    GTEST_CHECK_(vtable_ != nullptr);\n    vtable_->describe(*this, os, true);\n  }\n\n  // Explains why x matches, or doesn't match, the matcher.\n  void ExplainMatchResultTo(const T& x, ::std::ostream* os) const {\n    StreamMatchResultListener listener(os);\n    MatchAndExplain(x, &listener);\n  }\n\n  // Returns the describer for this matcher object; retains ownership\n  // of the describer, which is only guaranteed to be alive when\n  // this matcher object is alive.\n  const MatcherDescriberInterface* GetDescriber() const {\n    if (vtable_ == nullptr) return nullptr;\n    return vtable_->get_describer(*this);\n  }\n\n protected:\n  MatcherBase() : vtable_(nullptr) {}\n\n  // Constructs a matcher from its implementation.\n  template <typename U>\n  explicit MatcherBase(const MatcherInterface<U>* impl) {\n    Init(impl);\n  }\n\n  template <typename M, typename = typename std::remove_reference<\n                            M>::type::is_gtest_matcher>\n  MatcherBase(M&& m) {  // NOLINT\n    Init(std::forward<M>(m));\n  }\n\n  MatcherBase(const MatcherBase& other)\n      : vtable_(other.vtable_), buffer_(other.buffer_) {\n    if (IsShared()) buffer_.shared->Ref();\n  }\n\n  MatcherBase& operator=(const MatcherBase& other) {\n    if (this == &other) return *this;\n    Destroy();\n    vtable_ = other.vtable_;\n    buffer_ = other.buffer_;\n    if (IsShared()) buffer_.shared->Ref();\n    return *this;\n  }\n\n  MatcherBase(MatcherBase&& other)\n      : vtable_(other.vtable_), buffer_(other.buffer_) {\n    other.vtable_ = nullptr;\n  }\n\n  MatcherBase& operator=(MatcherBase&& other) {\n    if (this == &other) return *this;\n    Destroy();\n    vtable_ = other.vtable_;\n    buffer_ = other.buffer_;\n    other.vtable_ = nullptr;\n    return *this;\n  }\n\n  ~MatcherBase() override { Destroy(); }\n\n private:\n  struct VTable {\n    bool (*match_and_explain)(const MatcherBase&, const T&,\n                              MatchResultListener*);\n    void (*describe)(const MatcherBase&, std::ostream*, bool negation);\n    // Returns the captured object if it implements the interface, otherwise\n    // returns the MatcherBase itself.\n    const MatcherDescriberInterface* (*get_describer)(const MatcherBase&);\n    // Called on shared instances when the reference count reaches 0.\n    void (*shared_destroy)(SharedPayloadBase*);\n  };\n\n  bool IsShared() const {\n    return vtable_ != nullptr && vtable_->shared_destroy != nullptr;\n  }\n\n  // If the implementation uses a listener, call that.\n  template <typename P>\n  static auto MatchAndExplainImpl(const MatcherBase& m, const T& value,\n                                  MatchResultListener* listener)\n      -> decltype(P::Get(m).MatchAndExplain(value, listener->stream())) {\n    return P::Get(m).MatchAndExplain(value, listener->stream());\n  }\n\n  template <typename P>\n  static auto MatchAndExplainImpl(const MatcherBase& m, const T& value,\n                                  MatchResultListener* listener)\n      -> decltype(P::Get(m).MatchAndExplain(value, listener)) {\n    return P::Get(m).MatchAndExplain(value, listener);\n  }\n\n  template <typename P>\n  static void DescribeImpl(const MatcherBase& m, std::ostream* os,\n                           bool negation) {\n    if (negation) {\n      P::Get(m).DescribeNegationTo(os);\n    } else {\n      P::Get(m).DescribeTo(os);\n    }\n  }\n\n  template <typename P>\n  static const MatcherDescriberInterface* GetDescriberImpl(\n      const MatcherBase& m) {\n    // If the impl is a MatcherDescriberInterface, then return it.\n    // Otherwise use MatcherBase itself.\n    // This allows us to implement the GetDescriber() function without support\n    // from the impl, but some users really want to get their impl back when\n    // they call GetDescriber().\n    // We use std::get on a tuple as a workaround of not having `if constexpr`.\n    return std::get<(\n        std::is_convertible<decltype(&P::Get(m)),\n                            const MatcherDescriberInterface*>::value\n            ? 1\n            : 0)>(std::make_tuple(&m, &P::Get(m)));\n  }\n\n  template <typename P>\n  const VTable* GetVTable() {\n    static constexpr VTable kVTable = {&MatchAndExplainImpl<P>,\n                                       &DescribeImpl<P>, &GetDescriberImpl<P>,\n                                       P::shared_destroy};\n    return &kVTable;\n  }\n\n  union Buffer {\n    // Add some types to give Buffer some common alignment/size use cases.\n    void* ptr;\n    double d;\n    int64_t i;\n    // And add one for the out-of-line cases.\n    SharedPayloadBase* shared;\n  };\n\n  void Destroy() {\n    if (IsShared() && buffer_.shared->Unref()) {\n      vtable_->shared_destroy(buffer_.shared);\n    }\n  }\n\n  template <typename M>\n  static constexpr bool IsInlined() {\n    return sizeof(M) <= sizeof(Buffer) && alignof(M) <= alignof(Buffer) &&\n           is_trivially_copy_constructible<M>::value &&\n           std::is_trivially_destructible<M>::value;\n  }\n\n  template <typename M, bool = MatcherBase::IsInlined<M>()>\n  struct ValuePolicy {\n    static const M& Get(const MatcherBase& m) {\n      // When inlined along with Init, need to be explicit to avoid violating\n      // strict aliasing rules.\n      const M *ptr = static_cast<const M*>(\n          static_cast<const void*>(&m.buffer_));\n      return *ptr;\n    }\n    static void Init(MatcherBase& m, M impl) {\n      ::new (static_cast<void*>(&m.buffer_)) M(impl);\n    }\n    static constexpr auto shared_destroy = nullptr;\n  };\n\n  template <typename M>\n  struct ValuePolicy<M, false> {\n    using Shared = SharedPayload<M>;\n    static const M& Get(const MatcherBase& m) {\n      return static_cast<Shared*>(m.buffer_.shared)->value;\n    }\n    template <typename Arg>\n    static void Init(MatcherBase& m, Arg&& arg) {\n      m.buffer_.shared = new Shared(std::forward<Arg>(arg));\n    }\n    static constexpr auto shared_destroy = &Shared::Destroy;\n  };\n\n  template <typename U, bool B>\n  struct ValuePolicy<const MatcherInterface<U>*, B> {\n    using M = const MatcherInterface<U>;\n    using Shared = SharedPayload<std::unique_ptr<M>>;\n    static const M& Get(const MatcherBase& m) {\n      return *static_cast<Shared*>(m.buffer_.shared)->value;\n    }\n    static void Init(MatcherBase& m, M* impl) {\n      m.buffer_.shared = new Shared(std::unique_ptr<M>(impl));\n    }\n\n    static constexpr auto shared_destroy = &Shared::Destroy;\n  };\n\n  template <typename M>\n  void Init(M&& m) {\n    using MM = typename std::decay<M>::type;\n    using Policy = ValuePolicy<MM>;\n    vtable_ = GetVTable<Policy>();\n    Policy::Init(*this, std::forward<M>(m));\n  }\n\n  const VTable* vtable_;\n  Buffer buffer_;\n};\n\n}  // namespace internal\n\n// A Matcher<T> is a copyable and IMMUTABLE (except by assignment)\n// object that can check whether a value of type T matches.  The\n// implementation of Matcher<T> is just a std::shared_ptr to const\n// MatcherInterface<T>.  Don't inherit from Matcher!\ntemplate <typename T>\nclass Matcher : public internal::MatcherBase<T> {\n public:\n  // Constructs a null matcher.  Needed for storing Matcher objects in STL\n  // containers.  A default-constructed matcher is not yet initialized.  You\n  // cannot use it until a valid value has been assigned to it.\n  explicit Matcher() {}  // NOLINT\n\n  // Constructs a matcher from its implementation.\n  explicit Matcher(const MatcherInterface<const T&>* impl)\n      : internal::MatcherBase<T>(impl) {}\n\n  template <typename U>\n  explicit Matcher(\n      const MatcherInterface<U>* impl,\n      typename std::enable_if<!std::is_same<U, const U&>::value>::type* =\n          nullptr)\n      : internal::MatcherBase<T>(impl) {}\n\n  template <typename M, typename = typename std::remove_reference<\n                            M>::type::is_gtest_matcher>\n  Matcher(M&& m) : internal::MatcherBase<T>(std::forward<M>(m)) {}  // NOLINT\n\n  // Implicit constructor here allows people to write\n  // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes\n  Matcher(T value);  // NOLINT\n};\n\n// The following two specializations allow the user to write str\n// instead of Eq(str) and \"foo\" instead of Eq(\"foo\") when a std::string\n// matcher is expected.\ntemplate <>\nclass GTEST_API_ Matcher<const std::string&>\n    : public internal::MatcherBase<const std::string&> {\n public:\n  Matcher() {}\n\n  explicit Matcher(const MatcherInterface<const std::string&>* impl)\n      : internal::MatcherBase<const std::string&>(impl) {}\n\n  template <typename M, typename = typename std::remove_reference<\n                            M>::type::is_gtest_matcher>\n  Matcher(M&& m)  // NOLINT\n      : internal::MatcherBase<const std::string&>(std::forward<M>(m)) {}\n\n  // Allows the user to write str instead of Eq(str) sometimes, where\n  // str is a std::string object.\n  Matcher(const std::string& s);  // NOLINT\n\n  // Allows the user to write \"foo\" instead of Eq(\"foo\") sometimes.\n  Matcher(const char* s);  // NOLINT\n};\n\ntemplate <>\nclass GTEST_API_ Matcher<std::string>\n    : public internal::MatcherBase<std::string> {\n public:\n  Matcher() {}\n\n  explicit Matcher(const MatcherInterface<const std::string&>* impl)\n      : internal::MatcherBase<std::string>(impl) {}\n  explicit Matcher(const MatcherInterface<std::string>* impl)\n      : internal::MatcherBase<std::string>(impl) {}\n\n  template <typename M, typename = typename std::remove_reference<\n                            M>::type::is_gtest_matcher>\n  Matcher(M&& m)  // NOLINT\n      : internal::MatcherBase<std::string>(std::forward<M>(m)) {}\n\n  // Allows the user to write str instead of Eq(str) sometimes, where\n  // str is a string object.\n  Matcher(const std::string& s);  // NOLINT\n\n  // Allows the user to write \"foo\" instead of Eq(\"foo\") sometimes.\n  Matcher(const char* s);  // NOLINT\n};\n\n#if GTEST_INTERNAL_HAS_STRING_VIEW\n// The following two specializations allow the user to write str\n// instead of Eq(str) and \"foo\" instead of Eq(\"foo\") when a absl::string_view\n// matcher is expected.\ntemplate <>\nclass GTEST_API_ Matcher<const internal::StringView&>\n    : public internal::MatcherBase<const internal::StringView&> {\n public:\n  Matcher() {}\n\n  explicit Matcher(const MatcherInterface<const internal::StringView&>* impl)\n      : internal::MatcherBase<const internal::StringView&>(impl) {}\n\n  template <typename M, typename = typename std::remove_reference<\n                            M>::type::is_gtest_matcher>\n  Matcher(M&& m)  // NOLINT\n      : internal::MatcherBase<const internal::StringView&>(std::forward<M>(m)) {\n  }\n\n  // Allows the user to write str instead of Eq(str) sometimes, where\n  // str is a std::string object.\n  Matcher(const std::string& s);  // NOLINT\n\n  // Allows the user to write \"foo\" instead of Eq(\"foo\") sometimes.\n  Matcher(const char* s);  // NOLINT\n\n  // Allows the user to pass absl::string_views or std::string_views directly.\n  Matcher(internal::StringView s);  // NOLINT\n};\n\ntemplate <>\nclass GTEST_API_ Matcher<internal::StringView>\n    : public internal::MatcherBase<internal::StringView> {\n public:\n  Matcher() {}\n\n  explicit Matcher(const MatcherInterface<const internal::StringView&>* impl)\n      : internal::MatcherBase<internal::StringView>(impl) {}\n  explicit Matcher(const MatcherInterface<internal::StringView>* impl)\n      : internal::MatcherBase<internal::StringView>(impl) {}\n\n  template <typename M, typename = typename std::remove_reference<\n                            M>::type::is_gtest_matcher>\n  Matcher(M&& m)  // NOLINT\n      : internal::MatcherBase<internal::StringView>(std::forward<M>(m)) {}\n\n  // Allows the user to write str instead of Eq(str) sometimes, where\n  // str is a std::string object.\n  Matcher(const std::string& s);  // NOLINT\n\n  // Allows the user to write \"foo\" instead of Eq(\"foo\") sometimes.\n  Matcher(const char* s);  // NOLINT\n\n  // Allows the user to pass absl::string_views or std::string_views directly.\n  Matcher(internal::StringView s);  // NOLINT\n};\n#endif  // GTEST_INTERNAL_HAS_STRING_VIEW\n\n// Prints a matcher in a human-readable format.\ntemplate <typename T>\nstd::ostream& operator<<(std::ostream& os, const Matcher<T>& matcher) {\n  matcher.DescribeTo(&os);\n  return os;\n}\n\n// The PolymorphicMatcher class template makes it easy to implement a\n// polymorphic matcher (i.e. a matcher that can match values of more\n// than one type, e.g. Eq(n) and NotNull()).\n//\n// To define a polymorphic matcher, a user should provide an Impl\n// class that has a DescribeTo() method and a DescribeNegationTo()\n// method, and define a member function (or member function template)\n//\n//   bool MatchAndExplain(const Value& value,\n//                        MatchResultListener* listener) const;\n//\n// See the definition of NotNull() for a complete example.\ntemplate <class Impl>\nclass PolymorphicMatcher {\n public:\n  explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {}\n\n  // Returns a mutable reference to the underlying matcher\n  // implementation object.\n  Impl& mutable_impl() { return impl_; }\n\n  // Returns an immutable reference to the underlying matcher\n  // implementation object.\n  const Impl& impl() const { return impl_; }\n\n  template <typename T>\n  operator Matcher<T>() const {\n    return Matcher<T>(new MonomorphicImpl<const T&>(impl_));\n  }\n\n private:\n  template <typename T>\n  class MonomorphicImpl : public MatcherInterface<T> {\n   public:\n    explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {}\n\n    void DescribeTo(::std::ostream* os) const override { impl_.DescribeTo(os); }\n\n    void DescribeNegationTo(::std::ostream* os) const override {\n      impl_.DescribeNegationTo(os);\n    }\n\n    bool MatchAndExplain(T x, MatchResultListener* listener) const override {\n      return impl_.MatchAndExplain(x, listener);\n    }\n\n   private:\n    const Impl impl_;\n  };\n\n  Impl impl_;\n};\n\n// Creates a matcher from its implementation.\n// DEPRECATED: Especially in the generic code, prefer:\n//   Matcher<T>(new MyMatcherImpl<const T&>(...));\n//\n// MakeMatcher may create a Matcher that accepts its argument by value, which\n// leads to unnecessary copies & lack of support for non-copyable types.\ntemplate <typename T>\ninline Matcher<T> MakeMatcher(const MatcherInterface<T>* impl) {\n  return Matcher<T>(impl);\n}\n\n// Creates a polymorphic matcher from its implementation.  This is\n// easier to use than the PolymorphicMatcher<Impl> constructor as it\n// doesn't require you to explicitly write the template argument, e.g.\n//\n//   MakePolymorphicMatcher(foo);\n// vs\n//   PolymorphicMatcher<TypeOfFoo>(foo);\ntemplate <class Impl>\ninline PolymorphicMatcher<Impl> MakePolymorphicMatcher(const Impl& impl) {\n  return PolymorphicMatcher<Impl>(impl);\n}\n\nnamespace internal {\n// Implements a matcher that compares a given value with a\n// pre-supplied value using one of the ==, <=, <, etc, operators.  The\n// two values being compared don't have to have the same type.\n//\n// The matcher defined here is polymorphic (for example, Eq(5) can be\n// used to match an int, a short, a double, etc).  Therefore we use\n// a template type conversion operator in the implementation.\n//\n// The following template definition assumes that the Rhs parameter is\n// a \"bare\" type (i.e. neither 'const T' nor 'T&').\ntemplate <typename D, typename Rhs, typename Op>\nclass ComparisonBase {\n public:\n  explicit ComparisonBase(const Rhs& rhs) : rhs_(rhs) {}\n\n  using is_gtest_matcher = void;\n\n  template <typename Lhs>\n  bool MatchAndExplain(const Lhs& lhs, std::ostream*) const {\n    return Op()(lhs, Unwrap(rhs_));\n  }\n  void DescribeTo(std::ostream* os) const {\n    *os << D::Desc() << \" \";\n    UniversalPrint(Unwrap(rhs_), os);\n  }\n  void DescribeNegationTo(std::ostream* os) const {\n    *os << D::NegatedDesc() << \" \";\n    UniversalPrint(Unwrap(rhs_), os);\n  }\n\n private:\n  template <typename T>\n  static const T& Unwrap(const T& v) {\n    return v;\n  }\n  template <typename T>\n  static const T& Unwrap(std::reference_wrapper<T> v) {\n    return v;\n  }\n\n  Rhs rhs_;\n};\n\ntemplate <typename Rhs>\nclass EqMatcher : public ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq> {\n public:\n  explicit EqMatcher(const Rhs& rhs)\n      : ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq>(rhs) { }\n  static const char* Desc() { return \"is equal to\"; }\n  static const char* NegatedDesc() { return \"isn't equal to\"; }\n};\ntemplate <typename Rhs>\nclass NeMatcher : public ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe> {\n public:\n  explicit NeMatcher(const Rhs& rhs)\n      : ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe>(rhs) { }\n  static const char* Desc() { return \"isn't equal to\"; }\n  static const char* NegatedDesc() { return \"is equal to\"; }\n};\ntemplate <typename Rhs>\nclass LtMatcher : public ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt> {\n public:\n  explicit LtMatcher(const Rhs& rhs)\n      : ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt>(rhs) { }\n  static const char* Desc() { return \"is <\"; }\n  static const char* NegatedDesc() { return \"isn't <\"; }\n};\ntemplate <typename Rhs>\nclass GtMatcher : public ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt> {\n public:\n  explicit GtMatcher(const Rhs& rhs)\n      : ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt>(rhs) { }\n  static const char* Desc() { return \"is >\"; }\n  static const char* NegatedDesc() { return \"isn't >\"; }\n};\ntemplate <typename Rhs>\nclass LeMatcher : public ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe> {\n public:\n  explicit LeMatcher(const Rhs& rhs)\n      : ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe>(rhs) { }\n  static const char* Desc() { return \"is <=\"; }\n  static const char* NegatedDesc() { return \"isn't <=\"; }\n};\ntemplate <typename Rhs>\nclass GeMatcher : public ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe> {\n public:\n  explicit GeMatcher(const Rhs& rhs)\n      : ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe>(rhs) { }\n  static const char* Desc() { return \"is >=\"; }\n  static const char* NegatedDesc() { return \"isn't >=\"; }\n};\n\ntemplate <typename T, typename = typename std::enable_if<\n                          std::is_constructible<std::string, T>::value>::type>\nusing StringLike = T;\n\n// Implements polymorphic matchers MatchesRegex(regex) and\n// ContainsRegex(regex), which can be used as a Matcher<T> as long as\n// T can be converted to a string.\nclass MatchesRegexMatcher {\n public:\n  MatchesRegexMatcher(const RE* regex, bool full_match)\n      : regex_(regex), full_match_(full_match) {}\n\n#if GTEST_INTERNAL_HAS_STRING_VIEW\n  bool MatchAndExplain(const internal::StringView& s,\n                       MatchResultListener* listener) const {\n    return MatchAndExplain(std::string(s), listener);\n  }\n#endif  // GTEST_INTERNAL_HAS_STRING_VIEW\n\n  // Accepts pointer types, particularly:\n  //   const char*\n  //   char*\n  //   const wchar_t*\n  //   wchar_t*\n  template <typename CharType>\n  bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {\n    return s != nullptr && MatchAndExplain(std::string(s), listener);\n  }\n\n  // Matches anything that can convert to std::string.\n  //\n  // This is a template, not just a plain function with const std::string&,\n  // because absl::string_view has some interfering non-explicit constructors.\n  template <class MatcheeStringType>\n  bool MatchAndExplain(const MatcheeStringType& s,\n                       MatchResultListener* /* listener */) const {\n    const std::string& s2(s);\n    return full_match_ ? RE::FullMatch(s2, *regex_)\n                       : RE::PartialMatch(s2, *regex_);\n  }\n\n  void DescribeTo(::std::ostream* os) const {\n    *os << (full_match_ ? \"matches\" : \"contains\") << \" regular expression \";\n    UniversalPrinter<std::string>::Print(regex_->pattern(), os);\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"doesn't \" << (full_match_ ? \"match\" : \"contain\")\n        << \" regular expression \";\n    UniversalPrinter<std::string>::Print(regex_->pattern(), os);\n  }\n\n private:\n  const std::shared_ptr<const RE> regex_;\n  const bool full_match_;\n};\n}  // namespace internal\n\n// Matches a string that fully matches regular expression 'regex'.\n// The matcher takes ownership of 'regex'.\ninline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(\n    const internal::RE* regex) {\n  return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true));\n}\ntemplate <typename T = std::string>\nPolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(\n    const internal::StringLike<T>& regex) {\n  return MatchesRegex(new internal::RE(std::string(regex)));\n}\n\n// Matches a string that contains regular expression 'regex'.\n// The matcher takes ownership of 'regex'.\ninline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(\n    const internal::RE* regex) {\n  return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false));\n}\ntemplate <typename T = std::string>\nPolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(\n    const internal::StringLike<T>& regex) {\n  return ContainsRegex(new internal::RE(std::string(regex)));\n}\n\n// Creates a polymorphic matcher that matches anything equal to x.\n// Note: if the parameter of Eq() were declared as const T&, Eq(\"foo\")\n// wouldn't compile.\ntemplate <typename T>\ninline internal::EqMatcher<T> Eq(T x) { return internal::EqMatcher<T>(x); }\n\n// Constructs a Matcher<T> from a 'value' of type T.  The constructed\n// matcher matches any value that's equal to 'value'.\ntemplate <typename T>\nMatcher<T>::Matcher(T value) { *this = Eq(value); }\n\n// Creates a monomorphic matcher that matches anything with type Lhs\n// and equal to rhs.  A user may need to use this instead of Eq(...)\n// in order to resolve an overloading ambiguity.\n//\n// TypedEq<T>(x) is just a convenient short-hand for Matcher<T>(Eq(x))\n// or Matcher<T>(x), but more readable than the latter.\n//\n// We could define similar monomorphic matchers for other comparison\n// operations (e.g. TypedLt, TypedGe, and etc), but decided not to do\n// it yet as those are used much less than Eq() in practice.  A user\n// can always write Matcher<T>(Lt(5)) to be explicit about the type,\n// for example.\ntemplate <typename Lhs, typename Rhs>\ninline Matcher<Lhs> TypedEq(const Rhs& rhs) { return Eq(rhs); }\n\n// Creates a polymorphic matcher that matches anything >= x.\ntemplate <typename Rhs>\ninline internal::GeMatcher<Rhs> Ge(Rhs x) {\n  return internal::GeMatcher<Rhs>(x);\n}\n\n// Creates a polymorphic matcher that matches anything > x.\ntemplate <typename Rhs>\ninline internal::GtMatcher<Rhs> Gt(Rhs x) {\n  return internal::GtMatcher<Rhs>(x);\n}\n\n// Creates a polymorphic matcher that matches anything <= x.\ntemplate <typename Rhs>\ninline internal::LeMatcher<Rhs> Le(Rhs x) {\n  return internal::LeMatcher<Rhs>(x);\n}\n\n// Creates a polymorphic matcher that matches anything < x.\ntemplate <typename Rhs>\ninline internal::LtMatcher<Rhs> Lt(Rhs x) {\n  return internal::LtMatcher<Rhs>(x);\n}\n\n// Creates a polymorphic matcher that matches anything != x.\ntemplate <typename Rhs>\ninline internal::NeMatcher<Rhs> Ne(Rhs x) {\n  return internal::NeMatcher<Rhs>(x);\n}\n}  // namespace testing\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251 5046\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_MATCHERS_H_\n\n#include <stdio.h>\n#include <memory>\n\nnamespace testing {\nnamespace internal {\n\nGTEST_DECLARE_string_(internal_run_death_test);\n\n// Names of the flags (needed for parsing Google Test flags).\nconst char kDeathTestStyleFlag[] = \"death_test_style\";\nconst char kDeathTestUseFork[] = \"death_test_use_fork\";\nconst char kInternalRunDeathTestFlag[] = \"internal_run_death_test\";\n\n#if GTEST_HAS_DEATH_TEST\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\n// DeathTest is a class that hides much of the complexity of the\n// GTEST_DEATH_TEST_ macro.  It is abstract; its static Create method\n// returns a concrete class that depends on the prevailing death test\n// style, as defined by the --gtest_death_test_style and/or\n// --gtest_internal_run_death_test flags.\n\n// In describing the results of death tests, these terms are used with\n// the corresponding definitions:\n//\n// exit status:  The integer exit information in the format specified\n//               by wait(2)\n// exit code:    The integer code passed to exit(3), _exit(2), or\n//               returned from main()\nclass GTEST_API_ DeathTest {\n public:\n  // Create returns false if there was an error determining the\n  // appropriate action to take for the current death test; for example,\n  // if the gtest_death_test_style flag is set to an invalid value.\n  // The LastMessage method will return a more detailed message in that\n  // case.  Otherwise, the DeathTest pointer pointed to by the \"test\"\n  // argument is set.  If the death test should be skipped, the pointer\n  // is set to NULL; otherwise, it is set to the address of a new concrete\n  // DeathTest object that controls the execution of the current test.\n  static bool Create(const char* statement, Matcher<const std::string&> matcher,\n                     const char* file, int line, DeathTest** test);\n  DeathTest();\n  virtual ~DeathTest() { }\n\n  // A helper class that aborts a death test when it's deleted.\n  class ReturnSentinel {\n   public:\n    explicit ReturnSentinel(DeathTest* test) : test_(test) { }\n    ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }\n   private:\n    DeathTest* const test_;\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);\n  } GTEST_ATTRIBUTE_UNUSED_;\n\n  // An enumeration of possible roles that may be taken when a death\n  // test is encountered.  EXECUTE means that the death test logic should\n  // be executed immediately.  OVERSEE means that the program should prepare\n  // the appropriate environment for a child process to execute the death\n  // test, then wait for it to complete.\n  enum TestRole { OVERSEE_TEST, EXECUTE_TEST };\n\n  // An enumeration of the three reasons that a test might be aborted.\n  enum AbortReason {\n    TEST_ENCOUNTERED_RETURN_STATEMENT,\n    TEST_THREW_EXCEPTION,\n    TEST_DID_NOT_DIE\n  };\n\n  // Assumes one of the above roles.\n  virtual TestRole AssumeRole() = 0;\n\n  // Waits for the death test to finish and returns its status.\n  virtual int Wait() = 0;\n\n  // Returns true if the death test passed; that is, the test process\n  // exited during the test, its exit status matches a user-supplied\n  // predicate, and its stderr output matches a user-supplied regular\n  // expression.\n  // The user-supplied predicate may be a macro expression rather\n  // than a function pointer or functor, or else Wait and Passed could\n  // be combined.\n  virtual bool Passed(bool exit_status_ok) = 0;\n\n  // Signals that the death test did not die as expected.\n  virtual void Abort(AbortReason reason) = 0;\n\n  // Returns a human-readable outcome message regarding the outcome of\n  // the last death test.\n  static const char* LastMessage();\n\n  static void set_last_death_test_message(const std::string& message);\n\n private:\n  // A string containing a description of the outcome of the last death test.\n  static std::string last_death_test_message_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);\n};\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n// Factory interface for death tests.  May be mocked out for testing.\nclass DeathTestFactory {\n public:\n  virtual ~DeathTestFactory() { }\n  virtual bool Create(const char* statement,\n                      Matcher<const std::string&> matcher, const char* file,\n                      int line, DeathTest** test) = 0;\n};\n\n// A concrete DeathTestFactory implementation for normal use.\nclass DefaultDeathTestFactory : public DeathTestFactory {\n public:\n  bool Create(const char* statement, Matcher<const std::string&> matcher,\n              const char* file, int line, DeathTest** test) override;\n};\n\n// Returns true if exit_status describes a process that was terminated\n// by a signal, or exited normally with a nonzero exit code.\nGTEST_API_ bool ExitedUnsuccessfully(int exit_status);\n\n// A string passed to EXPECT_DEATH (etc.) is caught by one of these overloads\n// and interpreted as a regex (rather than an Eq matcher) for legacy\n// compatibility.\ninline Matcher<const ::std::string&> MakeDeathTestMatcher(\n    ::testing::internal::RE regex) {\n  return ContainsRegex(regex.pattern());\n}\ninline Matcher<const ::std::string&> MakeDeathTestMatcher(const char* regex) {\n  return ContainsRegex(regex);\n}\ninline Matcher<const ::std::string&> MakeDeathTestMatcher(\n    const ::std::string& regex) {\n  return ContainsRegex(regex);\n}\n\n// If a Matcher<const ::std::string&> is passed to EXPECT_DEATH (etc.), it's\n// used directly.\ninline Matcher<const ::std::string&> MakeDeathTestMatcher(\n    Matcher<const ::std::string&> matcher) {\n  return matcher;\n}\n\n// Traps C++ exceptions escaping statement and reports them as test\n// failures. Note that trapping SEH exceptions is not implemented here.\n# if GTEST_HAS_EXCEPTIONS\n#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \\\n  try { \\\n    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n  } catch (const ::std::exception& gtest_exception) { \\\n    fprintf(\\\n        stderr, \\\n        \"\\n%s: Caught std::exception-derived exception escaping the \" \\\n        \"death test statement. Exception message: %s\\n\", \\\n        ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \\\n        gtest_exception.what()); \\\n    fflush(stderr); \\\n    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \\\n  } catch (...) { \\\n    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \\\n  }\n\n# else\n#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \\\n  GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)\n\n# endif\n\n// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,\n// ASSERT_EXIT*, and EXPECT_EXIT*.\n#define GTEST_DEATH_TEST_(statement, predicate, regex_or_matcher, fail)        \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_                                                \\\n  if (::testing::internal::AlwaysTrue()) {                                     \\\n    ::testing::internal::DeathTest* gtest_dt;                                  \\\n    if (!::testing::internal::DeathTest::Create(                               \\\n            #statement,                                                        \\\n            ::testing::internal::MakeDeathTestMatcher(regex_or_matcher),       \\\n            __FILE__, __LINE__, &gtest_dt)) {                                  \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__);                        \\\n    }                                                                          \\\n    if (gtest_dt != nullptr) {                                                 \\\n      std::unique_ptr< ::testing::internal::DeathTest> gtest_dt_ptr(gtest_dt); \\\n      switch (gtest_dt->AssumeRole()) {                                        \\\n        case ::testing::internal::DeathTest::OVERSEE_TEST:                     \\\n          if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) {                \\\n            goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__);                  \\\n          }                                                                    \\\n          break;                                                               \\\n        case ::testing::internal::DeathTest::EXECUTE_TEST: {                   \\\n          ::testing::internal::DeathTest::ReturnSentinel gtest_sentinel(       \\\n              gtest_dt);                                                       \\\n          GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt);            \\\n          gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE);   \\\n          break;                                                               \\\n        }                                                                      \\\n        default:                                                               \\\n          break;                                                               \\\n      }                                                                        \\\n    }                                                                          \\\n  } else                                                                       \\\n    GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__)                                \\\n        : fail(::testing::internal::DeathTest::LastMessage())\n// The symbol \"fail\" here expands to something into which a message\n// can be streamed.\n\n// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in\n// NDEBUG mode. In this case we need the statements to be executed and the macro\n// must accept a streamed message even though the message is never printed.\n// The regex object is not evaluated, but it is used to prevent \"unused\"\n// warnings and to avoid an expression that doesn't compile in debug mode.\n#define GTEST_EXECUTE_STATEMENT_(statement, regex_or_matcher)    \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_                                  \\\n  if (::testing::internal::AlwaysTrue()) {                       \\\n    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement);   \\\n  } else if (!::testing::internal::AlwaysTrue()) {               \\\n    ::testing::internal::MakeDeathTestMatcher(regex_or_matcher); \\\n  } else                                                         \\\n    ::testing::Message()\n\n// A class representing the parsed contents of the\n// --gtest_internal_run_death_test flag, as it existed when\n// RUN_ALL_TESTS was called.\nclass InternalRunDeathTestFlag {\n public:\n  InternalRunDeathTestFlag(const std::string& a_file,\n                           int a_line,\n                           int an_index,\n                           int a_write_fd)\n      : file_(a_file), line_(a_line), index_(an_index),\n        write_fd_(a_write_fd) {}\n\n  ~InternalRunDeathTestFlag() {\n    if (write_fd_ >= 0)\n      posix::Close(write_fd_);\n  }\n\n  const std::string& file() const { return file_; }\n  int line() const { return line_; }\n  int index() const { return index_; }\n  int write_fd() const { return write_fd_; }\n\n private:\n  std::string file_;\n  int line_;\n  int index_;\n  int write_fd_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);\n};\n\n// Returns a newly created InternalRunDeathTestFlag object with fields\n// initialized from the GTEST_FLAG(internal_run_death_test) flag if\n// the flag is specified; otherwise returns NULL.\nInternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_\n\nnamespace testing {\n\n// This flag controls the style of death tests.  Valid values are \"threadsafe\",\n// meaning that the death test child process will re-execute the test binary\n// from the start, running only a single death test, or \"fast\",\n// meaning that the child process will execute the test logic immediately\n// after forking.\nGTEST_DECLARE_string_(death_test_style);\n\n#if GTEST_HAS_DEATH_TEST\n\nnamespace internal {\n\n// Returns a Boolean value indicating whether the caller is currently\n// executing in the context of the death test child process.  Tools such as\n// Valgrind heap checkers may need this to modify their behavior in death\n// tests.  IMPORTANT: This is an internal utility.  Using it may break the\n// implementation of death tests.  User code MUST NOT use it.\nGTEST_API_ bool InDeathTestChild();\n\n}  // namespace internal\n\n// The following macros are useful for writing death tests.\n\n// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is\n// executed:\n//\n//   1. It generates a warning if there is more than one active\n//   thread.  This is because it's safe to fork() or clone() only\n//   when there is a single thread.\n//\n//   2. The parent process clone()s a sub-process and runs the death\n//   test in it; the sub-process exits with code 0 at the end of the\n//   death test, if it hasn't exited already.\n//\n//   3. The parent process waits for the sub-process to terminate.\n//\n//   4. The parent process checks the exit code and error message of\n//   the sub-process.\n//\n// Examples:\n//\n//   ASSERT_DEATH(server.SendMessage(56, \"Hello\"), \"Invalid port number\");\n//   for (int i = 0; i < 5; i++) {\n//     EXPECT_DEATH(server.ProcessRequest(i),\n//                  \"Invalid request .* in ProcessRequest()\")\n//                  << \"Failed to die on request \" << i;\n//   }\n//\n//   ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), \"Exiting\");\n//\n//   bool KilledBySIGHUP(int exit_code) {\n//     return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;\n//   }\n//\n//   ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, \"Hanging up!\");\n//\n// On the regular expressions used in death tests:\n//\n//   GOOGLETEST_CM0005 DO NOT DELETE\n//   On POSIX-compliant systems (*nix), we use the <regex.h> library,\n//   which uses the POSIX extended regex syntax.\n//\n//   On other platforms (e.g. Windows or Mac), we only support a simple regex\n//   syntax implemented as part of Google Test.  This limited\n//   implementation should be enough most of the time when writing\n//   death tests; though it lacks many features you can find in PCRE\n//   or POSIX extended regex syntax.  For example, we don't support\n//   union (\"x|y\"), grouping (\"(xy)\"), brackets (\"[xy]\"), and\n//   repetition count (\"x{5,7}\"), among others.\n//\n//   Below is the syntax that we do support.  We chose it to be a\n//   subset of both PCRE and POSIX extended regex, so it's easy to\n//   learn wherever you come from.  In the following: 'A' denotes a\n//   literal character, period (.), or a single \\\\ escape sequence;\n//   'x' and 'y' denote regular expressions; 'm' and 'n' are for\n//   natural numbers.\n//\n//     c     matches any literal character c\n//     \\\\d   matches any decimal digit\n//     \\\\D   matches any character that's not a decimal digit\n//     \\\\f   matches \\f\n//     \\\\n   matches \\n\n//     \\\\r   matches \\r\n//     \\\\s   matches any ASCII whitespace, including \\n\n//     \\\\S   matches any character that's not a whitespace\n//     \\\\t   matches \\t\n//     \\\\v   matches \\v\n//     \\\\w   matches any letter, _, or decimal digit\n//     \\\\W   matches any character that \\\\w doesn't match\n//     \\\\c   matches any literal character c, which must be a punctuation\n//     .     matches any single character except \\n\n//     A?    matches 0 or 1 occurrences of A\n//     A*    matches 0 or many occurrences of A\n//     A+    matches 1 or many occurrences of A\n//     ^     matches the beginning of a string (not that of each line)\n//     $     matches the end of a string (not that of each line)\n//     xy    matches x followed by y\n//\n//   If you accidentally use PCRE or POSIX extended regex features\n//   not implemented by us, you will get a run-time failure.  In that\n//   case, please try to rewrite your regular expression within the\n//   above syntax.\n//\n//   This implementation is *not* meant to be as highly tuned or robust\n//   as a compiled regex library, but should perform well enough for a\n//   death test, which already incurs significant overhead by launching\n//   a child process.\n//\n// Known caveats:\n//\n//   A \"threadsafe\" style death test obtains the path to the test\n//   program from argv[0] and re-executes it in the sub-process.  For\n//   simplicity, the current implementation doesn't search the PATH\n//   when launching the sub-process.  This means that the user must\n//   invoke the test program via a path that contains at least one\n//   path separator (e.g. path/to/foo_test and\n//   /absolute/path/to/bar_test are fine, but foo_test is not).  This\n//   is rarely a problem as people usually don't put the test binary\n//   directory in PATH.\n//\n\n// Asserts that a given statement causes the program to exit, with an\n// integer exit status that satisfies predicate, and emitting error output\n// that matches regex.\n# define ASSERT_EXIT(statement, predicate, regex) \\\n    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)\n\n// Like ASSERT_EXIT, but continues on to successive tests in the\n// test suite, if any:\n# define EXPECT_EXIT(statement, predicate, regex) \\\n    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)\n\n// Asserts that a given statement causes the program to exit, either by\n// explicitly exiting with a nonzero exit code or being killed by a\n// signal, and emitting error output that matches regex.\n# define ASSERT_DEATH(statement, regex) \\\n    ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)\n\n// Like ASSERT_DEATH, but continues on to successive tests in the\n// test suite, if any:\n# define EXPECT_DEATH(statement, regex) \\\n    EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)\n\n// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:\n\n// Tests that an exit code describes a normal exit with a given exit code.\nclass GTEST_API_ ExitedWithCode {\n public:\n  explicit ExitedWithCode(int exit_code);\n  ExitedWithCode(const ExitedWithCode&) = default;\n  void operator=(const ExitedWithCode& other) = delete;\n  bool operator()(int exit_status) const;\n private:\n  const int exit_code_;\n};\n\n# if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA\n// Tests that an exit code describes an exit due to termination by a\n// given signal.\n// GOOGLETEST_CM0006 DO NOT DELETE\nclass GTEST_API_ KilledBySignal {\n public:\n  explicit KilledBySignal(int signum);\n  bool operator()(int exit_status) const;\n private:\n  const int signum_;\n};\n# endif  // !GTEST_OS_WINDOWS\n\n// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.\n// The death testing framework causes this to have interesting semantics,\n// since the sideeffects of the call are only visible in opt mode, and not\n// in debug mode.\n//\n// In practice, this can be used to test functions that utilize the\n// LOG(DFATAL) macro using the following style:\n//\n// int DieInDebugOr12(int* sideeffect) {\n//   if (sideeffect) {\n//     *sideeffect = 12;\n//   }\n//   LOG(DFATAL) << \"death\";\n//   return 12;\n// }\n//\n// TEST(TestSuite, TestDieOr12WorksInDgbAndOpt) {\n//   int sideeffect = 0;\n//   // Only asserts in dbg.\n//   EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), \"death\");\n//\n// #ifdef NDEBUG\n//   // opt-mode has sideeffect visible.\n//   EXPECT_EQ(12, sideeffect);\n// #else\n//   // dbg-mode no visible sideeffect.\n//   EXPECT_EQ(0, sideeffect);\n// #endif\n// }\n//\n// This will assert that DieInDebugReturn12InOpt() crashes in debug\n// mode, usually due to a DCHECK or LOG(DFATAL), but returns the\n// appropriate fallback value (12 in this case) in opt mode. If you\n// need to test that a function has appropriate side-effects in opt\n// mode, include assertions against the side-effects.  A general\n// pattern for this is:\n//\n// EXPECT_DEBUG_DEATH({\n//   // Side-effects here will have an effect after this statement in\n//   // opt mode, but none in debug mode.\n//   EXPECT_EQ(12, DieInDebugOr12(&sideeffect));\n// }, \"death\");\n//\n# ifdef NDEBUG\n\n#  define EXPECT_DEBUG_DEATH(statement, regex) \\\n  GTEST_EXECUTE_STATEMENT_(statement, regex)\n\n#  define ASSERT_DEBUG_DEATH(statement, regex) \\\n  GTEST_EXECUTE_STATEMENT_(statement, regex)\n\n# else\n\n#  define EXPECT_DEBUG_DEATH(statement, regex) \\\n  EXPECT_DEATH(statement, regex)\n\n#  define ASSERT_DEBUG_DEATH(statement, regex) \\\n  ASSERT_DEATH(statement, regex)\n\n# endif  // NDEBUG for EXPECT_DEBUG_DEATH\n#endif  // GTEST_HAS_DEATH_TEST\n\n// This macro is used for implementing macros such as\n// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where\n// death tests are not supported. Those macros must compile on such systems\n// if and only if EXPECT_DEATH and ASSERT_DEATH compile with the same parameters\n// on systems that support death tests. This allows one to write such a macro on\n// a system that does not support death tests and be sure that it will compile\n// on a death-test supporting system. It is exposed publicly so that systems\n// that have death-tests with stricter requirements than GTEST_HAS_DEATH_TEST\n// can write their own equivalent of EXPECT_DEATH_IF_SUPPORTED and\n// ASSERT_DEATH_IF_SUPPORTED.\n//\n// Parameters:\n//   statement -  A statement that a macro such as EXPECT_DEATH would test\n//                for program termination. This macro has to make sure this\n//                statement is compiled but not executed, to ensure that\n//                EXPECT_DEATH_IF_SUPPORTED compiles with a certain\n//                parameter if and only if EXPECT_DEATH compiles with it.\n//   regex     -  A regex that a macro such as EXPECT_DEATH would use to test\n//                the output of statement.  This parameter has to be\n//                compiled but not evaluated by this macro, to ensure that\n//                this macro only accepts expressions that a macro such as\n//                EXPECT_DEATH would accept.\n//   terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED\n//                and a return statement for ASSERT_DEATH_IF_SUPPORTED.\n//                This ensures that ASSERT_DEATH_IF_SUPPORTED will not\n//                compile inside functions where ASSERT_DEATH doesn't\n//                compile.\n//\n//  The branch that has an always false condition is used to ensure that\n//  statement and regex are compiled (and thus syntactically correct) but\n//  never executed. The unreachable code macro protects the terminator\n//  statement from generating an 'unreachable code' warning in case\n//  statement unconditionally returns or throws. The Message constructor at\n//  the end allows the syntax of streaming additional messages into the\n//  macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.\n# define GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, terminator) \\\n    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n    if (::testing::internal::AlwaysTrue()) { \\\n      GTEST_LOG_(WARNING) \\\n          << \"Death tests are not supported on this platform.\\n\" \\\n          << \"Statement '\" #statement \"' cannot be verified.\"; \\\n    } else if (::testing::internal::AlwaysFalse()) { \\\n      ::testing::internal::RE::PartialMatch(\".*\", (regex)); \\\n      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n      terminator; \\\n    } else \\\n      ::testing::Message()\n\n// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and\n// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if\n// death tests are supported; otherwise they just issue a warning.  This is\n// useful when you are combining death test assertions with normal test\n// assertions in one test.\n#if GTEST_HAS_DEATH_TEST\n# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \\\n    EXPECT_DEATH(statement, regex)\n# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \\\n    ASSERT_DEATH(statement, regex)\n#else\n# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \\\n    GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, )\n# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \\\n    GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, return)\n#endif\n\n}  // namespace testing\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Macros and functions for implementing parameterized tests\n// in Google C++ Testing and Mocking Framework (Google Test)\n//\n// GOOGLETEST_CM0001 DO NOT DELETE\n#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_\n#define GOOGLETEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_\n\n// Value-parameterized tests allow you to test your code with different\n// parameters without writing multiple copies of the same test.\n//\n// Here is how you use value-parameterized tests:\n\n#if 0\n\n// To write value-parameterized tests, first you should define a fixture\n// class. It is usually derived from testing::TestWithParam<T> (see below for\n// another inheritance scheme that's sometimes useful in more complicated\n// class hierarchies), where the type of your parameter values.\n// TestWithParam<T> is itself derived from testing::Test. T can be any\n// copyable type. If it's a raw pointer, you are responsible for managing the\n// lifespan of the pointed values.\n\nclass FooTest : public ::testing::TestWithParam<const char*> {\n  // You can implement all the usual class fixture members here.\n};\n\n// Then, use the TEST_P macro to define as many parameterized tests\n// for this fixture as you want. The _P suffix is for \"parameterized\"\n// or \"pattern\", whichever you prefer to think.\n\nTEST_P(FooTest, DoesBlah) {\n  // Inside a test, access the test parameter with the GetParam() method\n  // of the TestWithParam<T> class:\n  EXPECT_TRUE(foo.Blah(GetParam()));\n  ...\n}\n\nTEST_P(FooTest, HasBlahBlah) {\n  ...\n}\n\n// Finally, you can use INSTANTIATE_TEST_SUITE_P to instantiate the test\n// case with any set of parameters you want. Google Test defines a number\n// of functions for generating test parameters. They return what we call\n// (surprise!) parameter generators. Here is a summary of them, which\n// are all in the testing namespace:\n//\n//\n//  Range(begin, end [, step]) - Yields values {begin, begin+step,\n//                               begin+step+step, ...}. The values do not\n//                               include end. step defaults to 1.\n//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.\n//  ValuesIn(container)        - Yields values from a C-style array, an STL\n//  ValuesIn(begin,end)          container, or an iterator range [begin, end).\n//  Bool()                     - Yields sequence {false, true}.\n//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product\n//                               for the math savvy) of the values generated\n//                               by the N generators.\n//\n// For more details, see comments at the definitions of these functions below\n// in this file.\n//\n// The following statement will instantiate tests from the FooTest test suite\n// each with parameter values \"meeny\", \"miny\", and \"moe\".\n\nINSTANTIATE_TEST_SUITE_P(InstantiationName,\n                         FooTest,\n                         Values(\"meeny\", \"miny\", \"moe\"));\n\n// To distinguish different instances of the pattern, (yes, you\n// can instantiate it more than once) the first argument to the\n// INSTANTIATE_TEST_SUITE_P macro is a prefix that will be added to the\n// actual test suite name. Remember to pick unique prefixes for different\n// instantiations. The tests from the instantiation above will have\n// these names:\n//\n//    * InstantiationName/FooTest.DoesBlah/0 for \"meeny\"\n//    * InstantiationName/FooTest.DoesBlah/1 for \"miny\"\n//    * InstantiationName/FooTest.DoesBlah/2 for \"moe\"\n//    * InstantiationName/FooTest.HasBlahBlah/0 for \"meeny\"\n//    * InstantiationName/FooTest.HasBlahBlah/1 for \"miny\"\n//    * InstantiationName/FooTest.HasBlahBlah/2 for \"moe\"\n//\n// You can use these names in --gtest_filter.\n//\n// This statement will instantiate all tests from FooTest again, each\n// with parameter values \"cat\" and \"dog\":\n\nconst char* pets[] = {\"cat\", \"dog\"};\nINSTANTIATE_TEST_SUITE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));\n\n// The tests from the instantiation above will have these names:\n//\n//    * AnotherInstantiationName/FooTest.DoesBlah/0 for \"cat\"\n//    * AnotherInstantiationName/FooTest.DoesBlah/1 for \"dog\"\n//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for \"cat\"\n//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for \"dog\"\n//\n// Please note that INSTANTIATE_TEST_SUITE_P will instantiate all tests\n// in the given test suite, whether their definitions come before or\n// AFTER the INSTANTIATE_TEST_SUITE_P statement.\n//\n// Please also note that generator expressions (including parameters to the\n// generators) are evaluated in InitGoogleTest(), after main() has started.\n// This allows the user on one hand, to adjust generator parameters in order\n// to dynamically determine a set of tests to run and on the other hand,\n// give the user a chance to inspect the generated tests with Google Test\n// reflection API before RUN_ALL_TESTS() is executed.\n//\n// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc\n// for more examples.\n//\n// In the future, we plan to publish the API for defining new parameter\n// generators. But for now this interface remains part of the internal\n// implementation and is subject to change.\n//\n//\n// A parameterized test fixture must be derived from testing::Test and from\n// testing::WithParamInterface<T>, where T is the type of the parameter\n// values. Inheriting from TestWithParam<T> satisfies that requirement because\n// TestWithParam<T> inherits from both Test and WithParamInterface. In more\n// complicated hierarchies, however, it is occasionally useful to inherit\n// separately from Test and WithParamInterface. For example:\n\nclass BaseTest : public ::testing::Test {\n  // You can inherit all the usual members for a non-parameterized test\n  // fixture here.\n};\n\nclass DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {\n  // The usual test fixture members go here too.\n};\n\nTEST_F(BaseTest, HasFoo) {\n  // This is an ordinary non-parameterized test.\n}\n\nTEST_P(DerivedTest, DoesBlah) {\n  // GetParam works just the same here as if you inherit from TestWithParam.\n  EXPECT_TRUE(foo.Blah(GetParam()));\n}\n\n#endif  // 0\n\n#include <iterator>\n#include <utility>\n\n// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Type and function utilities for implementing parameterized tests.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_\n#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_\n\n#include <ctype.h>\n\n#include <cassert>\n#include <iterator>\n#include <memory>\n#include <set>\n#include <tuple>\n#include <type_traits>\n#include <utility>\n#include <vector>\n\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_TEST_PART_H_\n#define GOOGLETEST_INCLUDE_GTEST_GTEST_TEST_PART_H_\n\n#include <iosfwd>\n#include <vector>\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\nnamespace testing {\n\n// A copyable object representing the result of a test part (i.e. an\n// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).\n//\n// Don't inherit from TestPartResult as its destructor is not virtual.\nclass GTEST_API_ TestPartResult {\n public:\n  // The possible outcomes of a test part (i.e. an assertion or an\n  // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).\n  enum Type {\n    kSuccess,          // Succeeded.\n    kNonFatalFailure,  // Failed but the test can continue.\n    kFatalFailure,     // Failed and the test should be terminated.\n    kSkip              // Skipped.\n  };\n\n  // C'tor.  TestPartResult does NOT have a default constructor.\n  // Always use this constructor (with parameters) to create a\n  // TestPartResult object.\n  TestPartResult(Type a_type, const char* a_file_name, int a_line_number,\n                 const char* a_message)\n      : type_(a_type),\n        file_name_(a_file_name == nullptr ? \"\" : a_file_name),\n        line_number_(a_line_number),\n        summary_(ExtractSummary(a_message)),\n        message_(a_message) {}\n\n  // Gets the outcome of the test part.\n  Type type() const { return type_; }\n\n  // Gets the name of the source file where the test part took place, or\n  // NULL if it's unknown.\n  const char* file_name() const {\n    return file_name_.empty() ? nullptr : file_name_.c_str();\n  }\n\n  // Gets the line in the source file where the test part took place,\n  // or -1 if it's unknown.\n  int line_number() const { return line_number_; }\n\n  // Gets the summary of the failure message.\n  const char* summary() const { return summary_.c_str(); }\n\n  // Gets the message associated with the test part.\n  const char* message() const { return message_.c_str(); }\n\n  // Returns true if and only if the test part was skipped.\n  bool skipped() const { return type_ == kSkip; }\n\n  // Returns true if and only if the test part passed.\n  bool passed() const { return type_ == kSuccess; }\n\n  // Returns true if and only if the test part non-fatally failed.\n  bool nonfatally_failed() const { return type_ == kNonFatalFailure; }\n\n  // Returns true if and only if the test part fatally failed.\n  bool fatally_failed() const { return type_ == kFatalFailure; }\n\n  // Returns true if and only if the test part failed.\n  bool failed() const { return fatally_failed() || nonfatally_failed(); }\n\n private:\n  Type type_;\n\n  // Gets the summary of the failure message by omitting the stack\n  // trace in it.\n  static std::string ExtractSummary(const char* message);\n\n  // The name of the source file where the test part took place, or\n  // \"\" if the source file is unknown.\n  std::string file_name_;\n  // The line in the source file where the test part took place, or -1\n  // if the line number is unknown.\n  int line_number_;\n  std::string summary_;  // The test failure summary.\n  std::string message_;  // The test failure message.\n};\n\n// Prints a TestPartResult object.\nstd::ostream& operator<<(std::ostream& os, const TestPartResult& result);\n\n// An array of TestPartResult objects.\n//\n// Don't inherit from TestPartResultArray as its destructor is not\n// virtual.\nclass GTEST_API_ TestPartResultArray {\n public:\n  TestPartResultArray() {}\n\n  // Appends the given TestPartResult to the array.\n  void Append(const TestPartResult& result);\n\n  // Returns the TestPartResult at the given index (0-based).\n  const TestPartResult& GetTestPartResult(int index) const;\n\n  // Returns the number of TestPartResult objects in the array.\n  int size() const;\n\n private:\n  std::vector<TestPartResult> array_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);\n};\n\n// This interface knows how to report a test part result.\nclass GTEST_API_ TestPartResultReporterInterface {\n public:\n  virtual ~TestPartResultReporterInterface() {}\n\n  virtual void ReportTestPartResult(const TestPartResult& result) = 0;\n};\n\nnamespace internal {\n\n// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a\n// statement generates new fatal failures. To do so it registers itself as the\n// current test part result reporter. Besides checking if fatal failures were\n// reported, it only delegates the reporting to the former result reporter.\n// The original result reporter is restored in the destructor.\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nclass GTEST_API_ HasNewFatalFailureHelper\n    : public TestPartResultReporterInterface {\n public:\n  HasNewFatalFailureHelper();\n  ~HasNewFatalFailureHelper() override;\n  void ReportTestPartResult(const TestPartResult& result) override;\n  bool has_new_fatal_failure() const { return has_new_fatal_failure_; }\n private:\n  bool has_new_fatal_failure_;\n  TestPartResultReporterInterface* original_reporter_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);\n};\n\n}  // namespace internal\n\n}  // namespace testing\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_TEST_PART_H_\n\nnamespace testing {\n// Input to a parameterized test name generator, describing a test parameter.\n// Consists of the parameter value and the integer parameter index.\ntemplate <class ParamType>\nstruct TestParamInfo {\n  TestParamInfo(const ParamType& a_param, size_t an_index) :\n    param(a_param),\n    index(an_index) {}\n  ParamType param;\n  size_t index;\n};\n\n// A builtin parameterized test name generator which returns the result of\n// testing::PrintToString.\nstruct PrintToStringParamName {\n  template <class ParamType>\n  std::string operator()(const TestParamInfo<ParamType>& info) const {\n    return PrintToString(info.param);\n  }\n};\n\nnamespace internal {\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n// Utility Functions\n\n// Outputs a message explaining invalid registration of different\n// fixture class for the same test suite. This may happen when\n// TEST_P macro is used to define two tests with the same name\n// but in different namespaces.\nGTEST_API_ void ReportInvalidTestSuiteType(const char* test_suite_name,\n                                           CodeLocation code_location);\n\ntemplate <typename> class ParamGeneratorInterface;\ntemplate <typename> class ParamGenerator;\n\n// Interface for iterating over elements provided by an implementation\n// of ParamGeneratorInterface<T>.\ntemplate <typename T>\nclass ParamIteratorInterface {\n public:\n  virtual ~ParamIteratorInterface() {}\n  // A pointer to the base generator instance.\n  // Used only for the purposes of iterator comparison\n  // to make sure that two iterators belong to the same generator.\n  virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;\n  // Advances iterator to point to the next element\n  // provided by the generator. The caller is responsible\n  // for not calling Advance() on an iterator equal to\n  // BaseGenerator()->End().\n  virtual void Advance() = 0;\n  // Clones the iterator object. Used for implementing copy semantics\n  // of ParamIterator<T>.\n  virtual ParamIteratorInterface* Clone() const = 0;\n  // Dereferences the current iterator and provides (read-only) access\n  // to the pointed value. It is the caller's responsibility not to call\n  // Current() on an iterator equal to BaseGenerator()->End().\n  // Used for implementing ParamGenerator<T>::operator*().\n  virtual const T* Current() const = 0;\n  // Determines whether the given iterator and other point to the same\n  // element in the sequence generated by the generator.\n  // Used for implementing ParamGenerator<T>::operator==().\n  virtual bool Equals(const ParamIteratorInterface& other) const = 0;\n};\n\n// Class iterating over elements provided by an implementation of\n// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>\n// and implements the const forward iterator concept.\ntemplate <typename T>\nclass ParamIterator {\n public:\n  typedef T value_type;\n  typedef const T& reference;\n  typedef ptrdiff_t difference_type;\n\n  // ParamIterator assumes ownership of the impl_ pointer.\n  ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}\n  ParamIterator& operator=(const ParamIterator& other) {\n    if (this != &other)\n      impl_.reset(other.impl_->Clone());\n    return *this;\n  }\n\n  const T& operator*() const { return *impl_->Current(); }\n  const T* operator->() const { return impl_->Current(); }\n  // Prefix version of operator++.\n  ParamIterator& operator++() {\n    impl_->Advance();\n    return *this;\n  }\n  // Postfix version of operator++.\n  ParamIterator operator++(int /*unused*/) {\n    ParamIteratorInterface<T>* clone = impl_->Clone();\n    impl_->Advance();\n    return ParamIterator(clone);\n  }\n  bool operator==(const ParamIterator& other) const {\n    return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);\n  }\n  bool operator!=(const ParamIterator& other) const {\n    return !(*this == other);\n  }\n\n private:\n  friend class ParamGenerator<T>;\n  explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}\n  std::unique_ptr<ParamIteratorInterface<T> > impl_;\n};\n\n// ParamGeneratorInterface<T> is the binary interface to access generators\n// defined in other translation units.\ntemplate <typename T>\nclass ParamGeneratorInterface {\n public:\n  typedef T ParamType;\n\n  virtual ~ParamGeneratorInterface() {}\n\n  // Generator interface definition\n  virtual ParamIteratorInterface<T>* Begin() const = 0;\n  virtual ParamIteratorInterface<T>* End() const = 0;\n};\n\n// Wraps ParamGeneratorInterface<T> and provides general generator syntax\n// compatible with the STL Container concept.\n// This class implements copy initialization semantics and the contained\n// ParamGeneratorInterface<T> instance is shared among all copies\n// of the original object. This is possible because that instance is immutable.\ntemplate<typename T>\nclass ParamGenerator {\n public:\n  typedef ParamIterator<T> iterator;\n\n  explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}\n  ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}\n\n  ParamGenerator& operator=(const ParamGenerator& other) {\n    impl_ = other.impl_;\n    return *this;\n  }\n\n  iterator begin() const { return iterator(impl_->Begin()); }\n  iterator end() const { return iterator(impl_->End()); }\n\n private:\n  std::shared_ptr<const ParamGeneratorInterface<T> > impl_;\n};\n\n// Generates values from a range of two comparable values. Can be used to\n// generate sequences of user-defined types that implement operator+() and\n// operator<().\n// This class is used in the Range() function.\ntemplate <typename T, typename IncrementT>\nclass RangeGenerator : public ParamGeneratorInterface<T> {\n public:\n  RangeGenerator(T begin, T end, IncrementT step)\n      : begin_(begin), end_(end),\n        step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}\n  ~RangeGenerator() override {}\n\n  ParamIteratorInterface<T>* Begin() const override {\n    return new Iterator(this, begin_, 0, step_);\n  }\n  ParamIteratorInterface<T>* End() const override {\n    return new Iterator(this, end_, end_index_, step_);\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<T> {\n   public:\n    Iterator(const ParamGeneratorInterface<T>* base, T value, int index,\n             IncrementT step)\n        : base_(base), value_(value), index_(index), step_(step) {}\n    ~Iterator() override {}\n\n    const ParamGeneratorInterface<T>* BaseGenerator() const override {\n      return base_;\n    }\n    void Advance() override {\n      value_ = static_cast<T>(value_ + step_);\n      index_++;\n    }\n    ParamIteratorInterface<T>* Clone() const override {\n      return new Iterator(*this);\n    }\n    const T* Current() const override { return &value_; }\n    bool Equals(const ParamIteratorInterface<T>& other) const override {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const int other_index =\n          CheckedDowncastToActualType<const Iterator>(&other)->index_;\n      return index_ == other_index;\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : ParamIteratorInterface<T>(),\n          base_(other.base_), value_(other.value_), index_(other.index_),\n          step_(other.step_) {}\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<T>* const base_;\n    T value_;\n    int index_;\n    const IncrementT step_;\n  };  // class RangeGenerator::Iterator\n\n  static int CalculateEndIndex(const T& begin,\n                               const T& end,\n                               const IncrementT& step) {\n    int end_index = 0;\n    for (T i = begin; i < end; i = static_cast<T>(i + step))\n      end_index++;\n    return end_index;\n  }\n\n  // No implementation - assignment is unsupported.\n  void operator=(const RangeGenerator& other);\n\n  const T begin_;\n  const T end_;\n  const IncrementT step_;\n  // The index for the end() iterator. All the elements in the generated\n  // sequence are indexed (0-based) to aid iterator comparison.\n  const int end_index_;\n};  // class RangeGenerator\n\n\n// Generates values from a pair of STL-style iterators. Used in the\n// ValuesIn() function. The elements are copied from the source range\n// since the source can be located on the stack, and the generator\n// is likely to persist beyond that stack frame.\ntemplate <typename T>\nclass ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {\n public:\n  template <typename ForwardIterator>\n  ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)\n      : container_(begin, end) {}\n  ~ValuesInIteratorRangeGenerator() override {}\n\n  ParamIteratorInterface<T>* Begin() const override {\n    return new Iterator(this, container_.begin());\n  }\n  ParamIteratorInterface<T>* End() const override {\n    return new Iterator(this, container_.end());\n  }\n\n private:\n  typedef typename ::std::vector<T> ContainerType;\n\n  class Iterator : public ParamIteratorInterface<T> {\n   public:\n    Iterator(const ParamGeneratorInterface<T>* base,\n             typename ContainerType::const_iterator iterator)\n        : base_(base), iterator_(iterator) {}\n    ~Iterator() override {}\n\n    const ParamGeneratorInterface<T>* BaseGenerator() const override {\n      return base_;\n    }\n    void Advance() override {\n      ++iterator_;\n      value_.reset();\n    }\n    ParamIteratorInterface<T>* Clone() const override {\n      return new Iterator(*this);\n    }\n    // We need to use cached value referenced by iterator_ because *iterator_\n    // can return a temporary object (and of type other then T), so just\n    // having \"return &*iterator_;\" doesn't work.\n    // value_ is updated here and not in Advance() because Advance()\n    // can advance iterator_ beyond the end of the range, and we cannot\n    // detect that fact. The client code, on the other hand, is\n    // responsible for not calling Current() on an out-of-range iterator.\n    const T* Current() const override {\n      if (value_.get() == nullptr) value_.reset(new T(*iterator_));\n      return value_.get();\n    }\n    bool Equals(const ParamIteratorInterface<T>& other) const override {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      return iterator_ ==\n          CheckedDowncastToActualType<const Iterator>(&other)->iterator_;\n    }\n\n   private:\n    Iterator(const Iterator& other)\n          // The explicit constructor call suppresses a false warning\n          // emitted by gcc when supplied with the -Wextra option.\n        : ParamIteratorInterface<T>(),\n          base_(other.base_),\n          iterator_(other.iterator_) {}\n\n    const ParamGeneratorInterface<T>* const base_;\n    typename ContainerType::const_iterator iterator_;\n    // A cached value of *iterator_. We keep it here to allow access by\n    // pointer in the wrapping iterator's operator->().\n    // value_ needs to be mutable to be accessed in Current().\n    // Use of std::unique_ptr helps manage cached value's lifetime,\n    // which is bound by the lifespan of the iterator itself.\n    mutable std::unique_ptr<const T> value_;\n  };  // class ValuesInIteratorRangeGenerator::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const ValuesInIteratorRangeGenerator& other);\n\n  const ContainerType container_;\n};  // class ValuesInIteratorRangeGenerator\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Default parameterized test name generator, returns a string containing the\n// integer test parameter index.\ntemplate <class ParamType>\nstd::string DefaultParamName(const TestParamInfo<ParamType>& info) {\n  Message name_stream;\n  name_stream << info.index;\n  return name_stream.GetString();\n}\n\ntemplate <typename T = int>\nvoid TestNotEmpty() {\n  static_assert(sizeof(T) == 0, \"Empty arguments are not allowed.\");\n}\ntemplate <typename T = int>\nvoid TestNotEmpty(const T&) {}\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Stores a parameter value and later creates tests parameterized with that\n// value.\ntemplate <class TestClass>\nclass ParameterizedTestFactory : public TestFactoryBase {\n public:\n  typedef typename TestClass::ParamType ParamType;\n  explicit ParameterizedTestFactory(ParamType parameter) :\n      parameter_(parameter) {}\n  Test* CreateTest() override {\n    TestClass::SetParam(&parameter_);\n    return new TestClass();\n  }\n\n private:\n  const ParamType parameter_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);\n};\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// TestMetaFactoryBase is a base class for meta-factories that create\n// test factories for passing into MakeAndRegisterTestInfo function.\ntemplate <class ParamType>\nclass TestMetaFactoryBase {\n public:\n  virtual ~TestMetaFactoryBase() {}\n\n  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;\n};\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// TestMetaFactory creates test factories for passing into\n// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives\n// ownership of test factory pointer, same factory object cannot be passed\n// into that method twice. But ParameterizedTestSuiteInfo is going to call\n// it for each Test/Parameter value combination. Thus it needs meta factory\n// creator class.\ntemplate <class TestSuite>\nclass TestMetaFactory\n    : public TestMetaFactoryBase<typename TestSuite::ParamType> {\n public:\n  using ParamType = typename TestSuite::ParamType;\n\n  TestMetaFactory() {}\n\n  TestFactoryBase* CreateTestFactory(ParamType parameter) override {\n    return new ParameterizedTestFactory<TestSuite>(parameter);\n  }\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);\n};\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// ParameterizedTestSuiteInfoBase is a generic interface\n// to ParameterizedTestSuiteInfo classes. ParameterizedTestSuiteInfoBase\n// accumulates test information provided by TEST_P macro invocations\n// and generators provided by INSTANTIATE_TEST_SUITE_P macro invocations\n// and uses that information to register all resulting test instances\n// in RegisterTests method. The ParameterizeTestSuiteRegistry class holds\n// a collection of pointers to the ParameterizedTestSuiteInfo objects\n// and calls RegisterTests() on each of them when asked.\nclass ParameterizedTestSuiteInfoBase {\n public:\n  virtual ~ParameterizedTestSuiteInfoBase() {}\n\n  // Base part of test suite name for display purposes.\n  virtual const std::string& GetTestSuiteName() const = 0;\n  // Test suite id to verify identity.\n  virtual TypeId GetTestSuiteTypeId() const = 0;\n  // UnitTest class invokes this method to register tests in this\n  // test suite right before running them in RUN_ALL_TESTS macro.\n  // This method should not be called more than once on any single\n  // instance of a ParameterizedTestSuiteInfoBase derived class.\n  virtual void RegisterTests() = 0;\n\n protected:\n  ParameterizedTestSuiteInfoBase() {}\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfoBase);\n};\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Report a the name of a test_suit as safe to ignore\n// as the side effect of construction of this type.\nstruct MarkAsIgnored {\n  explicit MarkAsIgnored(const char* test_suite);\n};\n\nGTEST_API_ void InsertSyntheticTestCase(const std::string& name,\n                                        CodeLocation location, bool has_test_p);\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// ParameterizedTestSuiteInfo accumulates tests obtained from TEST_P\n// macro invocations for a particular test suite and generators\n// obtained from INSTANTIATE_TEST_SUITE_P macro invocations for that\n// test suite. It registers tests with all values generated by all\n// generators when asked.\ntemplate <class TestSuite>\nclass ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase {\n public:\n  // ParamType and GeneratorCreationFunc are private types but are required\n  // for declarations of public methods AddTestPattern() and\n  // AddTestSuiteInstantiation().\n  using ParamType = typename TestSuite::ParamType;\n  // A function that returns an instance of appropriate generator type.\n  typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();\n  using ParamNameGeneratorFunc = std::string(const TestParamInfo<ParamType>&);\n\n  explicit ParameterizedTestSuiteInfo(const char* name,\n                                      CodeLocation code_location)\n      : test_suite_name_(name), code_location_(code_location) {}\n\n  // Test suite base name for display purposes.\n  const std::string& GetTestSuiteName() const override {\n    return test_suite_name_;\n  }\n  // Test suite id to verify identity.\n  TypeId GetTestSuiteTypeId() const override { return GetTypeId<TestSuite>(); }\n  // TEST_P macro uses AddTestPattern() to record information\n  // about a single test in a LocalTestInfo structure.\n  // test_suite_name is the base name of the test suite (without invocation\n  // prefix). test_base_name is the name of an individual test without\n  // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is\n  // test suite base name and DoBar is test base name.\n  void AddTestPattern(const char* test_suite_name, const char* test_base_name,\n                      TestMetaFactoryBase<ParamType>* meta_factory,\n                      CodeLocation code_location) {\n    tests_.push_back(std::shared_ptr<TestInfo>(new TestInfo(\n        test_suite_name, test_base_name, meta_factory, code_location)));\n  }\n  // INSTANTIATE_TEST_SUITE_P macro uses AddGenerator() to record information\n  // about a generator.\n  int AddTestSuiteInstantiation(const std::string& instantiation_name,\n                                GeneratorCreationFunc* func,\n                                ParamNameGeneratorFunc* name_func,\n                                const char* file, int line) {\n    instantiations_.push_back(\n        InstantiationInfo(instantiation_name, func, name_func, file, line));\n    return 0;  // Return value used only to run this method in namespace scope.\n  }\n  // UnitTest class invokes this method to register tests in this test suite\n  // right before running tests in RUN_ALL_TESTS macro.\n  // This method should not be called more than once on any single\n  // instance of a ParameterizedTestSuiteInfoBase derived class.\n  // UnitTest has a guard to prevent from calling this method more than once.\n  void RegisterTests() override {\n    bool generated_instantiations = false;\n\n    for (typename TestInfoContainer::iterator test_it = tests_.begin();\n         test_it != tests_.end(); ++test_it) {\n      std::shared_ptr<TestInfo> test_info = *test_it;\n      for (typename InstantiationContainer::iterator gen_it =\n               instantiations_.begin(); gen_it != instantiations_.end();\n               ++gen_it) {\n        const std::string& instantiation_name = gen_it->name;\n        ParamGenerator<ParamType> generator((*gen_it->generator)());\n        ParamNameGeneratorFunc* name_func = gen_it->name_func;\n        const char* file = gen_it->file;\n        int line = gen_it->line;\n\n        std::string test_suite_name;\n        if ( !instantiation_name.empty() )\n          test_suite_name = instantiation_name + \"/\";\n        test_suite_name += test_info->test_suite_base_name;\n\n        size_t i = 0;\n        std::set<std::string> test_param_names;\n        for (typename ParamGenerator<ParamType>::iterator param_it =\n                 generator.begin();\n             param_it != generator.end(); ++param_it, ++i) {\n          generated_instantiations = true;\n\n          Message test_name_stream;\n\n          std::string param_name = name_func(\n              TestParamInfo<ParamType>(*param_it, i));\n\n          GTEST_CHECK_(IsValidParamName(param_name))\n              << \"Parameterized test name '\" << param_name\n              << \"' is invalid, in \" << file\n              << \" line \" << line << std::endl;\n\n          GTEST_CHECK_(test_param_names.count(param_name) == 0)\n              << \"Duplicate parameterized test name '\" << param_name\n              << \"', in \" << file << \" line \" << line << std::endl;\n\n          test_param_names.insert(param_name);\n\n          if (!test_info->test_base_name.empty()) {\n            test_name_stream << test_info->test_base_name << \"/\";\n          }\n          test_name_stream << param_name;\n          MakeAndRegisterTestInfo(\n              test_suite_name.c_str(), test_name_stream.GetString().c_str(),\n              nullptr,  // No type parameter.\n              PrintToString(*param_it).c_str(), test_info->code_location,\n              GetTestSuiteTypeId(),\n              SuiteApiResolver<TestSuite>::GetSetUpCaseOrSuite(file, line),\n              SuiteApiResolver<TestSuite>::GetTearDownCaseOrSuite(file, line),\n              test_info->test_meta_factory->CreateTestFactory(*param_it));\n        }  // for param_it\n      }  // for gen_it\n    }  // for test_it\n\n    if (!generated_instantiations) {\n      // There are no generaotrs, or they all generate nothing ...\n      InsertSyntheticTestCase(GetTestSuiteName(), code_location_,\n                              !tests_.empty());\n    }\n  }    // RegisterTests\n\n private:\n  // LocalTestInfo structure keeps information about a single test registered\n  // with TEST_P macro.\n  struct TestInfo {\n    TestInfo(const char* a_test_suite_base_name, const char* a_test_base_name,\n             TestMetaFactoryBase<ParamType>* a_test_meta_factory,\n             CodeLocation a_code_location)\n        : test_suite_base_name(a_test_suite_base_name),\n          test_base_name(a_test_base_name),\n          test_meta_factory(a_test_meta_factory),\n          code_location(a_code_location) {}\n\n    const std::string test_suite_base_name;\n    const std::string test_base_name;\n    const std::unique_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;\n    const CodeLocation code_location;\n  };\n  using TestInfoContainer = ::std::vector<std::shared_ptr<TestInfo> >;\n  // Records data received from INSTANTIATE_TEST_SUITE_P macros:\n  //  <Instantiation name, Sequence generator creation function,\n  //     Name generator function, Source file, Source line>\n  struct InstantiationInfo {\n      InstantiationInfo(const std::string &name_in,\n                        GeneratorCreationFunc* generator_in,\n                        ParamNameGeneratorFunc* name_func_in,\n                        const char* file_in,\n                        int line_in)\n          : name(name_in),\n            generator(generator_in),\n            name_func(name_func_in),\n            file(file_in),\n            line(line_in) {}\n\n      std::string name;\n      GeneratorCreationFunc* generator;\n      ParamNameGeneratorFunc* name_func;\n      const char* file;\n      int line;\n  };\n  typedef ::std::vector<InstantiationInfo> InstantiationContainer;\n\n  static bool IsValidParamName(const std::string& name) {\n    // Check for empty string\n    if (name.empty())\n      return false;\n\n    // Check for invalid characters\n    for (std::string::size_type index = 0; index < name.size(); ++index) {\n      if (!isalnum(name[index]) && name[index] != '_')\n        return false;\n    }\n\n    return true;\n  }\n\n  const std::string test_suite_name_;\n  CodeLocation code_location_;\n  TestInfoContainer tests_;\n  InstantiationContainer instantiations_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfo);\n};  // class ParameterizedTestSuiteInfo\n\n//  Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\ntemplate <class TestCase>\nusing ParameterizedTestCaseInfo = ParameterizedTestSuiteInfo<TestCase>;\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// ParameterizedTestSuiteRegistry contains a map of\n// ParameterizedTestSuiteInfoBase classes accessed by test suite names. TEST_P\n// and INSTANTIATE_TEST_SUITE_P macros use it to locate their corresponding\n// ParameterizedTestSuiteInfo descriptors.\nclass ParameterizedTestSuiteRegistry {\n public:\n  ParameterizedTestSuiteRegistry() {}\n  ~ParameterizedTestSuiteRegistry() {\n    for (auto& test_suite_info : test_suite_infos_) {\n      delete test_suite_info;\n    }\n  }\n\n  // Looks up or creates and returns a structure containing information about\n  // tests and instantiations of a particular test suite.\n  template <class TestSuite>\n  ParameterizedTestSuiteInfo<TestSuite>* GetTestSuitePatternHolder(\n      const char* test_suite_name, CodeLocation code_location) {\n    ParameterizedTestSuiteInfo<TestSuite>* typed_test_info = nullptr;\n    for (auto& test_suite_info : test_suite_infos_) {\n      if (test_suite_info->GetTestSuiteName() == test_suite_name) {\n        if (test_suite_info->GetTestSuiteTypeId() != GetTypeId<TestSuite>()) {\n          // Complain about incorrect usage of Google Test facilities\n          // and terminate the program since we cannot guaranty correct\n          // test suite setup and tear-down in this case.\n          ReportInvalidTestSuiteType(test_suite_name, code_location);\n          posix::Abort();\n        } else {\n          // At this point we are sure that the object we found is of the same\n          // type we are looking for, so we downcast it to that type\n          // without further checks.\n          typed_test_info = CheckedDowncastToActualType<\n              ParameterizedTestSuiteInfo<TestSuite> >(test_suite_info);\n        }\n        break;\n      }\n    }\n    if (typed_test_info == nullptr) {\n      typed_test_info = new ParameterizedTestSuiteInfo<TestSuite>(\n          test_suite_name, code_location);\n      test_suite_infos_.push_back(typed_test_info);\n    }\n    return typed_test_info;\n  }\n  void RegisterTests() {\n    for (auto& test_suite_info : test_suite_infos_) {\n      test_suite_info->RegisterTests();\n    }\n  }\n//  Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  template <class TestCase>\n  ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(\n      const char* test_case_name, CodeLocation code_location) {\n    return GetTestSuitePatternHolder<TestCase>(test_case_name, code_location);\n  }\n\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n private:\n  using TestSuiteInfoContainer = ::std::vector<ParameterizedTestSuiteInfoBase*>;\n\n  TestSuiteInfoContainer test_suite_infos_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteRegistry);\n};\n\n// Keep track of what type-parameterized test suite are defined and\n// where as well as which are intatiated. This allows susequently\n// identifying suits that are defined but never used.\nclass TypeParameterizedTestSuiteRegistry {\n public:\n  // Add a suite definition\n  void RegisterTestSuite(const char* test_suite_name,\n                         CodeLocation code_location);\n\n  // Add an instantiation of a suit.\n  void RegisterInstantiation(const char* test_suite_name);\n\n  // For each suit repored as defined but not reported as instantiation,\n  // emit a test that reports that fact (configurably, as an error).\n  void CheckForInstantiations();\n\n private:\n  struct TypeParameterizedTestSuiteInfo {\n    explicit TypeParameterizedTestSuiteInfo(CodeLocation c)\n        : code_location(c), instantiated(false) {}\n\n    CodeLocation code_location;\n    bool instantiated;\n  };\n\n  std::map<std::string, TypeParameterizedTestSuiteInfo> suites_;\n};\n\n}  // namespace internal\n\n// Forward declarations of ValuesIn(), which is implemented in\n// include/gtest/gtest-param-test.h.\ntemplate <class Container>\ninternal::ParamGenerator<typename Container::value_type> ValuesIn(\n    const Container& container);\n\nnamespace internal {\n// Used in the Values() function to provide polymorphic capabilities.\n\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable : 4100)\n#endif\n\ntemplate <typename... Ts>\nclass ValueArray {\n public:\n  explicit ValueArray(Ts... v) : v_(FlatTupleConstructTag{}, std::move(v)...) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {  // NOLINT\n    return ValuesIn(MakeVector<T>(MakeIndexSequence<sizeof...(Ts)>()));\n  }\n\n private:\n  template <typename T, size_t... I>\n  std::vector<T> MakeVector(IndexSequence<I...>) const {\n    return std::vector<T>{static_cast<T>(v_.template Get<I>())...};\n  }\n\n  FlatTuple<Ts...> v_;\n};\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n\ntemplate <typename... T>\nclass CartesianProductGenerator\n    : public ParamGeneratorInterface<::std::tuple<T...>> {\n public:\n  typedef ::std::tuple<T...> ParamType;\n\n  CartesianProductGenerator(const std::tuple<ParamGenerator<T>...>& g)\n      : generators_(g) {}\n  ~CartesianProductGenerator() override {}\n\n  ParamIteratorInterface<ParamType>* Begin() const override {\n    return new Iterator(this, generators_, false);\n  }\n  ParamIteratorInterface<ParamType>* End() const override {\n    return new Iterator(this, generators_, true);\n  }\n\n private:\n  template <class I>\n  class IteratorImpl;\n  template <size_t... I>\n  class IteratorImpl<IndexSequence<I...>>\n      : public ParamIteratorInterface<ParamType> {\n   public:\n    IteratorImpl(const ParamGeneratorInterface<ParamType>* base,\n             const std::tuple<ParamGenerator<T>...>& generators, bool is_end)\n        : base_(base),\n          begin_(std::get<I>(generators).begin()...),\n          end_(std::get<I>(generators).end()...),\n          current_(is_end ? end_ : begin_) {\n      ComputeCurrentValue();\n    }\n    ~IteratorImpl() override {}\n\n    const ParamGeneratorInterface<ParamType>* BaseGenerator() const override {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    void Advance() override {\n      assert(!AtEnd());\n      // Advance the last iterator.\n      ++std::get<sizeof...(T) - 1>(current_);\n      // if that reaches end, propagate that up.\n      AdvanceIfEnd<sizeof...(T) - 1>();\n      ComputeCurrentValue();\n    }\n    ParamIteratorInterface<ParamType>* Clone() const override {\n      return new IteratorImpl(*this);\n    }\n\n    const ParamType* Current() const override { return current_value_.get(); }\n\n    bool Equals(const ParamIteratorInterface<ParamType>& other) const override {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const IteratorImpl* typed_other =\n          CheckedDowncastToActualType<const IteratorImpl>(&other);\n\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      if (AtEnd() && typed_other->AtEnd()) return true;\n\n      bool same = true;\n      bool dummy[] = {\n          (same = same && std::get<I>(current_) ==\n                              std::get<I>(typed_other->current_))...};\n      (void)dummy;\n      return same;\n    }\n\n   private:\n    template <size_t ThisI>\n    void AdvanceIfEnd() {\n      if (std::get<ThisI>(current_) != std::get<ThisI>(end_)) return;\n\n      bool last = ThisI == 0;\n      if (last) {\n        // We are done. Nothing else to propagate.\n        return;\n      }\n\n      constexpr size_t NextI = ThisI - (ThisI != 0);\n      std::get<ThisI>(current_) = std::get<ThisI>(begin_);\n      ++std::get<NextI>(current_);\n      AdvanceIfEnd<NextI>();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_ = std::make_shared<ParamType>(*std::get<I>(current_)...);\n    }\n    bool AtEnd() const {\n      bool at_end = false;\n      bool dummy[] = {\n          (at_end = at_end || std::get<I>(current_) == std::get<I>(end_))...};\n      (void)dummy;\n      return at_end;\n    }\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    std::tuple<typename ParamGenerator<T>::iterator...> begin_;\n    std::tuple<typename ParamGenerator<T>::iterator...> end_;\n    std::tuple<typename ParamGenerator<T>::iterator...> current_;\n    std::shared_ptr<ParamType> current_value_;\n  };\n\n  using Iterator = IteratorImpl<typename MakeIndexSequence<sizeof...(T)>::type>;\n\n  std::tuple<ParamGenerator<T>...> generators_;\n};\n\ntemplate <class... Gen>\nclass CartesianProductHolder {\n public:\n  CartesianProductHolder(const Gen&... g) : generators_(g...) {}\n  template <typename... T>\n  operator ParamGenerator<::std::tuple<T...>>() const {\n    return ParamGenerator<::std::tuple<T...>>(\n        new CartesianProductGenerator<T...>(generators_));\n  }\n\n private:\n  std::tuple<Gen...> generators_;\n};\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_\n\nnamespace testing {\n\n// Functions producing parameter generators.\n//\n// Google Test uses these generators to produce parameters for value-\n// parameterized tests. When a parameterized test suite is instantiated\n// with a particular generator, Google Test creates and runs tests\n// for each element in the sequence produced by the generator.\n//\n// In the following sample, tests from test suite FooTest are instantiated\n// each three times with parameter values 3, 5, and 8:\n//\n// class FooTest : public TestWithParam<int> { ... };\n//\n// TEST_P(FooTest, TestThis) {\n// }\n// TEST_P(FooTest, TestThat) {\n// }\n// INSTANTIATE_TEST_SUITE_P(TestSequence, FooTest, Values(3, 5, 8));\n//\n\n// Range() returns generators providing sequences of values in a range.\n//\n// Synopsis:\n// Range(start, end)\n//   - returns a generator producing a sequence of values {start, start+1,\n//     start+2, ..., }.\n// Range(start, end, step)\n//   - returns a generator producing a sequence of values {start, start+step,\n//     start+step+step, ..., }.\n// Notes:\n//   * The generated sequences never include end. For example, Range(1, 5)\n//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)\n//     returns a generator producing {1, 3, 5, 7}.\n//   * start and end must have the same type. That type may be any integral or\n//     floating-point type or a user defined type satisfying these conditions:\n//     * It must be assignable (have operator=() defined).\n//     * It must have operator+() (operator+(int-compatible type) for\n//       two-operand version).\n//     * It must have operator<() defined.\n//     Elements in the resulting sequences will also have that type.\n//   * Condition start < end must be satisfied in order for resulting sequences\n//     to contain any elements.\n//\ntemplate <typename T, typename IncrementT>\ninternal::ParamGenerator<T> Range(T start, T end, IncrementT step) {\n  return internal::ParamGenerator<T>(\n      new internal::RangeGenerator<T, IncrementT>(start, end, step));\n}\n\ntemplate <typename T>\ninternal::ParamGenerator<T> Range(T start, T end) {\n  return Range(start, end, 1);\n}\n\n// ValuesIn() function allows generation of tests with parameters coming from\n// a container.\n//\n// Synopsis:\n// ValuesIn(const T (&array)[N])\n//   - returns a generator producing sequences with elements from\n//     a C-style array.\n// ValuesIn(const Container& container)\n//   - returns a generator producing sequences with elements from\n//     an STL-style container.\n// ValuesIn(Iterator begin, Iterator end)\n//   - returns a generator producing sequences with elements from\n//     a range [begin, end) defined by a pair of STL-style iterators. These\n//     iterators can also be plain C pointers.\n//\n// Please note that ValuesIn copies the values from the containers\n// passed in and keeps them to generate tests in RUN_ALL_TESTS().\n//\n// Examples:\n//\n// This instantiates tests from test suite StringTest\n// each with C-string values of \"foo\", \"bar\", and \"baz\":\n//\n// const char* strings[] = {\"foo\", \"bar\", \"baz\"};\n// INSTANTIATE_TEST_SUITE_P(StringSequence, StringTest, ValuesIn(strings));\n//\n// This instantiates tests from test suite StlStringTest\n// each with STL strings with values \"a\" and \"b\":\n//\n// ::std::vector< ::std::string> GetParameterStrings() {\n//   ::std::vector< ::std::string> v;\n//   v.push_back(\"a\");\n//   v.push_back(\"b\");\n//   return v;\n// }\n//\n// INSTANTIATE_TEST_SUITE_P(CharSequence,\n//                          StlStringTest,\n//                          ValuesIn(GetParameterStrings()));\n//\n//\n// This will also instantiate tests from CharTest\n// each with parameter values 'a' and 'b':\n//\n// ::std::list<char> GetParameterChars() {\n//   ::std::list<char> list;\n//   list.push_back('a');\n//   list.push_back('b');\n//   return list;\n// }\n// ::std::list<char> l = GetParameterChars();\n// INSTANTIATE_TEST_SUITE_P(CharSequence2,\n//                          CharTest,\n//                          ValuesIn(l.begin(), l.end()));\n//\ntemplate <typename ForwardIterator>\ninternal::ParamGenerator<\n    typename std::iterator_traits<ForwardIterator>::value_type>\nValuesIn(ForwardIterator begin, ForwardIterator end) {\n  typedef typename std::iterator_traits<ForwardIterator>::value_type ParamType;\n  return internal::ParamGenerator<ParamType>(\n      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));\n}\n\ntemplate <typename T, size_t N>\ninternal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {\n  return ValuesIn(array, array + N);\n}\n\ntemplate <class Container>\ninternal::ParamGenerator<typename Container::value_type> ValuesIn(\n    const Container& container) {\n  return ValuesIn(container.begin(), container.end());\n}\n\n// Values() allows generating tests from explicitly specified list of\n// parameters.\n//\n// Synopsis:\n// Values(T v1, T v2, ..., T vN)\n//   - returns a generator producing sequences with elements v1, v2, ..., vN.\n//\n// For example, this instantiates tests from test suite BarTest each\n// with values \"one\", \"two\", and \"three\":\n//\n// INSTANTIATE_TEST_SUITE_P(NumSequence,\n//                          BarTest,\n//                          Values(\"one\", \"two\", \"three\"));\n//\n// This instantiates tests from test suite BazTest each with values 1, 2, 3.5.\n// The exact type of values will depend on the type of parameter in BazTest.\n//\n// INSTANTIATE_TEST_SUITE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));\n//\n//\ntemplate <typename... T>\ninternal::ValueArray<T...> Values(T... v) {\n  return internal::ValueArray<T...>(std::move(v)...);\n}\n\n// Bool() allows generating tests with parameters in a set of (false, true).\n//\n// Synopsis:\n// Bool()\n//   - returns a generator producing sequences with elements {false, true}.\n//\n// It is useful when testing code that depends on Boolean flags. Combinations\n// of multiple flags can be tested when several Bool()'s are combined using\n// Combine() function.\n//\n// In the following example all tests in the test suite FlagDependentTest\n// will be instantiated twice with parameters false and true.\n//\n// class FlagDependentTest : public testing::TestWithParam<bool> {\n//   virtual void SetUp() {\n//     external_flag = GetParam();\n//   }\n// }\n// INSTANTIATE_TEST_SUITE_P(BoolSequence, FlagDependentTest, Bool());\n//\ninline internal::ParamGenerator<bool> Bool() {\n  return Values(false, true);\n}\n\n// Combine() allows the user to combine two or more sequences to produce\n// values of a Cartesian product of those sequences' elements.\n//\n// Synopsis:\n// Combine(gen1, gen2, ..., genN)\n//   - returns a generator producing sequences with elements coming from\n//     the Cartesian product of elements from the sequences generated by\n//     gen1, gen2, ..., genN. The sequence elements will have a type of\n//     std::tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types\n//     of elements from sequences produces by gen1, gen2, ..., genN.\n//\n// Example:\n//\n// This will instantiate tests in test suite AnimalTest each one with\n// the parameter values tuple(\"cat\", BLACK), tuple(\"cat\", WHITE),\n// tuple(\"dog\", BLACK), and tuple(\"dog\", WHITE):\n//\n// enum Color { BLACK, GRAY, WHITE };\n// class AnimalTest\n//     : public testing::TestWithParam<std::tuple<const char*, Color> > {...};\n//\n// TEST_P(AnimalTest, AnimalLooksNice) {...}\n//\n// INSTANTIATE_TEST_SUITE_P(AnimalVariations, AnimalTest,\n//                          Combine(Values(\"cat\", \"dog\"),\n//                                  Values(BLACK, WHITE)));\n//\n// This will instantiate tests in FlagDependentTest with all variations of two\n// Boolean flags:\n//\n// class FlagDependentTest\n//     : public testing::TestWithParam<std::tuple<bool, bool> > {\n//   virtual void SetUp() {\n//     // Assigns external_flag_1 and external_flag_2 values from the tuple.\n//     std::tie(external_flag_1, external_flag_2) = GetParam();\n//   }\n// };\n//\n// TEST_P(FlagDependentTest, TestFeature1) {\n//   // Test your code using external_flag_1 and external_flag_2 here.\n// }\n// INSTANTIATE_TEST_SUITE_P(TwoBoolSequence, FlagDependentTest,\n//                          Combine(Bool(), Bool()));\n//\ntemplate <typename... Generator>\ninternal::CartesianProductHolder<Generator...> Combine(const Generator&... g) {\n  return internal::CartesianProductHolder<Generator...>(g...);\n}\n\n#define TEST_P(test_suite_name, test_name)                                     \\\n  class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)                     \\\n      : public test_suite_name {                                               \\\n   public:                                                                     \\\n    GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {}                    \\\n    void TestBody() override;                                                  \\\n                                                                               \\\n   private:                                                                    \\\n    static int AddToRegistry() {                                               \\\n      ::testing::UnitTest::GetInstance()                                       \\\n          ->parameterized_test_registry()                                      \\\n          .GetTestSuitePatternHolder<test_suite_name>(                         \\\n              GTEST_STRINGIFY_(test_suite_name),                               \\\n              ::testing::internal::CodeLocation(__FILE__, __LINE__))           \\\n          ->AddTestPattern(                                                    \\\n              GTEST_STRINGIFY_(test_suite_name), GTEST_STRINGIFY_(test_name),  \\\n              new ::testing::internal::TestMetaFactory<GTEST_TEST_CLASS_NAME_( \\\n                  test_suite_name, test_name)>(),                              \\\n              ::testing::internal::CodeLocation(__FILE__, __LINE__));          \\\n      return 0;                                                                \\\n    }                                                                          \\\n    static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_;               \\\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name,    \\\n                                                           test_name));        \\\n  };                                                                           \\\n  int GTEST_TEST_CLASS_NAME_(test_suite_name,                                  \\\n                             test_name)::gtest_registering_dummy_ =            \\\n      GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::AddToRegistry();     \\\n  void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody()\n\n// The last argument to INSTANTIATE_TEST_SUITE_P allows the user to specify\n// generator and an optional function or functor that generates custom test name\n// suffixes based on the test parameters. Such a function or functor should\n// accept one argument of type testing::TestParamInfo<class ParamType>, and\n// return std::string.\n//\n// testing::PrintToStringParamName is a builtin test suffix generator that\n// returns the value of testing::PrintToString(GetParam()).\n//\n// Note: test names must be non-empty, unique, and may only contain ASCII\n// alphanumeric characters or underscore. Because PrintToString adds quotes\n// to std::string and C strings, it won't work for these types.\n\n#define GTEST_EXPAND_(arg) arg\n#define GTEST_GET_FIRST_(first, ...) first\n#define GTEST_GET_SECOND_(first, second, ...) second\n\n#define INSTANTIATE_TEST_SUITE_P(prefix, test_suite_name, ...)                \\\n  static ::testing::internal::ParamGenerator<test_suite_name::ParamType>      \\\n      gtest_##prefix##test_suite_name##_EvalGenerator_() {                    \\\n    return GTEST_EXPAND_(GTEST_GET_FIRST_(__VA_ARGS__, DUMMY_PARAM_));        \\\n  }                                                                           \\\n  static ::std::string gtest_##prefix##test_suite_name##_EvalGenerateName_(   \\\n      const ::testing::TestParamInfo<test_suite_name::ParamType>& info) {     \\\n    if (::testing::internal::AlwaysFalse()) {                                 \\\n      ::testing::internal::TestNotEmpty(GTEST_EXPAND_(GTEST_GET_SECOND_(      \\\n          __VA_ARGS__,                                                        \\\n          ::testing::internal::DefaultParamName<test_suite_name::ParamType>,  \\\n          DUMMY_PARAM_)));                                                    \\\n      auto t = std::make_tuple(__VA_ARGS__);                                  \\\n      static_assert(std::tuple_size<decltype(t)>::value <= 2,                 \\\n                    \"Too Many Args!\");                                        \\\n    }                                                                         \\\n    return ((GTEST_EXPAND_(GTEST_GET_SECOND_(                                 \\\n        __VA_ARGS__,                                                          \\\n        ::testing::internal::DefaultParamName<test_suite_name::ParamType>,    \\\n        DUMMY_PARAM_))))(info);                                               \\\n  }                                                                           \\\n  static int gtest_##prefix##test_suite_name##_dummy_                         \\\n      GTEST_ATTRIBUTE_UNUSED_ =                                               \\\n          ::testing::UnitTest::GetInstance()                                  \\\n              ->parameterized_test_registry()                                 \\\n              .GetTestSuitePatternHolder<test_suite_name>(                    \\\n                  GTEST_STRINGIFY_(test_suite_name),                          \\\n                  ::testing::internal::CodeLocation(__FILE__, __LINE__))      \\\n              ->AddTestSuiteInstantiation(                                    \\\n                  GTEST_STRINGIFY_(prefix),                                   \\\n                  &gtest_##prefix##test_suite_name##_EvalGenerator_,          \\\n                  &gtest_##prefix##test_suite_name##_EvalGenerateName_,       \\\n                  __FILE__, __LINE__)\n\n\n// Allow Marking a Parameterized test class as not needing to be instantiated.\n#define GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(T)                   \\\n  namespace gtest_do_not_use_outside_namespace_scope {}                   \\\n  static const ::testing::internal::MarkAsIgnored gtest_allow_ignore_##T( \\\n      GTEST_STRINGIFY_(T))\n\n// Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n#define INSTANTIATE_TEST_CASE_P                                            \\\n  static_assert(::testing::internal::InstantiateTestCase_P_IsDeprecated(), \\\n                \"\");                                                       \\\n  INSTANTIATE_TEST_SUITE_P\n#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n}  // namespace testing\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_\n// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Google C++ Testing and Mocking Framework definitions useful in production code.\n// GOOGLETEST_CM0003 DO NOT DELETE\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_PROD_H_\n#define GOOGLETEST_INCLUDE_GTEST_GTEST_PROD_H_\n\n// When you need to test the private or protected members of a class,\n// use the FRIEND_TEST macro to declare your tests as friends of the\n// class.  For example:\n//\n// class MyClass {\n//  private:\n//   void PrivateMethod();\n//   FRIEND_TEST(MyClassTest, PrivateMethodWorks);\n// };\n//\n// class MyClassTest : public testing::Test {\n//   // ...\n// };\n//\n// TEST_F(MyClassTest, PrivateMethodWorks) {\n//   // Can call MyClass::PrivateMethod() here.\n// }\n//\n// Note: The test class must be in the same namespace as the class being tested.\n// For example, putting MyClassTest in an anonymous namespace will not work.\n\n#define FRIEND_TEST(test_case_name, test_name)\\\nfriend class test_case_name##_##test_name##_Test\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_PROD_H_\n// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_\n#define GOOGLETEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_\n\n// This header implements typed tests and type-parameterized tests.\n\n// Typed (aka type-driven) tests repeat the same test for types in a\n// list.  You must know which types you want to test with when writing\n// typed tests. Here's how you do it:\n\n#if 0\n\n// First, define a fixture class template.  It should be parameterized\n// by a type.  Remember to derive it from testing::Test.\ntemplate <typename T>\nclass FooTest : public testing::Test {\n public:\n  ...\n  typedef std::list<T> List;\n  static T shared_;\n  T value_;\n};\n\n// Next, associate a list of types with the test suite, which will be\n// repeated for each type in the list.  The typedef is necessary for\n// the macro to parse correctly.\ntypedef testing::Types<char, int, unsigned int> MyTypes;\nTYPED_TEST_SUITE(FooTest, MyTypes);\n\n// If the type list contains only one type, you can write that type\n// directly without Types<...>:\n//   TYPED_TEST_SUITE(FooTest, int);\n\n// Then, use TYPED_TEST() instead of TEST_F() to define as many typed\n// tests for this test suite as you want.\nTYPED_TEST(FooTest, DoesBlah) {\n  // Inside a test, refer to the special name TypeParam to get the type\n  // parameter.  Since we are inside a derived class template, C++ requires\n  // us to visit the members of FooTest via 'this'.\n  TypeParam n = this->value_;\n\n  // To visit static members of the fixture, add the TestFixture::\n  // prefix.\n  n += TestFixture::shared_;\n\n  // To refer to typedefs in the fixture, add the \"typename\n  // TestFixture::\" prefix.\n  typename TestFixture::List values;\n  values.push_back(n);\n  ...\n}\n\nTYPED_TEST(FooTest, HasPropertyA) { ... }\n\n// TYPED_TEST_SUITE takes an optional third argument which allows to specify a\n// class that generates custom test name suffixes based on the type. This should\n// be a class which has a static template function GetName(int index) returning\n// a string for each type. The provided integer index equals the index of the\n// type in the provided type list. In many cases the index can be ignored.\n//\n// For example:\n//   class MyTypeNames {\n//    public:\n//     template <typename T>\n//     static std::string GetName(int) {\n//       if (std::is_same<T, char>()) return \"char\";\n//       if (std::is_same<T, int>()) return \"int\";\n//       if (std::is_same<T, unsigned int>()) return \"unsignedInt\";\n//     }\n//   };\n//   TYPED_TEST_SUITE(FooTest, MyTypes, MyTypeNames);\n\n#endif  // 0\n\n// Type-parameterized tests are abstract test patterns parameterized\n// by a type.  Compared with typed tests, type-parameterized tests\n// allow you to define the test pattern without knowing what the type\n// parameters are.  The defined pattern can be instantiated with\n// different types any number of times, in any number of translation\n// units.\n//\n// If you are designing an interface or concept, you can define a\n// suite of type-parameterized tests to verify properties that any\n// valid implementation of the interface/concept should have.  Then,\n// each implementation can easily instantiate the test suite to verify\n// that it conforms to the requirements, without having to write\n// similar tests repeatedly.  Here's an example:\n\n#if 0\n\n// First, define a fixture class template.  It should be parameterized\n// by a type.  Remember to derive it from testing::Test.\ntemplate <typename T>\nclass FooTest : public testing::Test {\n  ...\n};\n\n// Next, declare that you will define a type-parameterized test suite\n// (the _P suffix is for \"parameterized\" or \"pattern\", whichever you\n// prefer):\nTYPED_TEST_SUITE_P(FooTest);\n\n// Then, use TYPED_TEST_P() to define as many type-parameterized tests\n// for this type-parameterized test suite as you want.\nTYPED_TEST_P(FooTest, DoesBlah) {\n  // Inside a test, refer to TypeParam to get the type parameter.\n  TypeParam n = 0;\n  ...\n}\n\nTYPED_TEST_P(FooTest, HasPropertyA) { ... }\n\n// Now the tricky part: you need to register all test patterns before\n// you can instantiate them.  The first argument of the macro is the\n// test suite name; the rest are the names of the tests in this test\n// case.\nREGISTER_TYPED_TEST_SUITE_P(FooTest,\n                            DoesBlah, HasPropertyA);\n\n// Finally, you are free to instantiate the pattern with the types you\n// want.  If you put the above code in a header file, you can #include\n// it in multiple C++ source files and instantiate it multiple times.\n//\n// To distinguish different instances of the pattern, the first\n// argument to the INSTANTIATE_* macro is a prefix that will be added\n// to the actual test suite name.  Remember to pick unique prefixes for\n// different instances.\ntypedef testing::Types<char, int, unsigned int> MyTypes;\nINSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);\n\n// If the type list contains only one type, you can write that type\n// directly without Types<...>:\n//   INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, int);\n//\n// Similar to the optional argument of TYPED_TEST_SUITE above,\n// INSTANTIATE_TEST_SUITE_P takes an optional fourth argument which allows to\n// generate custom names.\n//   INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes, MyTypeNames);\n\n#endif  // 0\n\n\n// Implements typed tests.\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Expands to the name of the typedef for the type parameters of the\n// given test suite.\n#define GTEST_TYPE_PARAMS_(TestSuiteName) gtest_type_params_##TestSuiteName##_\n\n// Expands to the name of the typedef for the NameGenerator, responsible for\n// creating the suffixes of the name.\n#define GTEST_NAME_GENERATOR_(TestSuiteName) \\\n  gtest_type_params_##TestSuiteName##_NameGenerator\n\n#define TYPED_TEST_SUITE(CaseName, Types, ...)                          \\\n  typedef ::testing::internal::GenerateTypeList<Types>::type            \\\n      GTEST_TYPE_PARAMS_(CaseName);                                     \\\n  typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type \\\n      GTEST_NAME_GENERATOR_(CaseName)\n\n#define TYPED_TEST(CaseName, TestName)                                        \\\n  static_assert(sizeof(GTEST_STRINGIFY_(TestName)) > 1,                       \\\n                \"test-name must not be empty\");                               \\\n  template <typename gtest_TypeParam_>                                        \\\n  class GTEST_TEST_CLASS_NAME_(CaseName, TestName)                            \\\n      : public CaseName<gtest_TypeParam_> {                                   \\\n   private:                                                                   \\\n    typedef CaseName<gtest_TypeParam_> TestFixture;                           \\\n    typedef gtest_TypeParam_ TypeParam;                                       \\\n    void TestBody() override;                                                 \\\n  };                                                                          \\\n  static bool gtest_##CaseName##_##TestName##_registered_                     \\\n      GTEST_ATTRIBUTE_UNUSED_ = ::testing::internal::TypeParameterizedTest<   \\\n          CaseName,                                                           \\\n          ::testing::internal::TemplateSel<GTEST_TEST_CLASS_NAME_(CaseName,   \\\n                                                                  TestName)>, \\\n          GTEST_TYPE_PARAMS_(                                                 \\\n              CaseName)>::Register(\"\",                                        \\\n                                   ::testing::internal::CodeLocation(         \\\n                                       __FILE__, __LINE__),                   \\\n                                   GTEST_STRINGIFY_(CaseName),                \\\n                                   GTEST_STRINGIFY_(TestName), 0,             \\\n                                   ::testing::internal::GenerateNames<        \\\n                                       GTEST_NAME_GENERATOR_(CaseName),       \\\n                                       GTEST_TYPE_PARAMS_(CaseName)>());      \\\n  template <typename gtest_TypeParam_>                                        \\\n  void GTEST_TEST_CLASS_NAME_(CaseName,                                       \\\n                              TestName)<gtest_TypeParam_>::TestBody()\n\n// Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n#define TYPED_TEST_CASE                                                \\\n  static_assert(::testing::internal::TypedTestCaseIsDeprecated(), \"\"); \\\n  TYPED_TEST_SUITE\n#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n// Implements type-parameterized tests.\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Expands to the namespace name that the type-parameterized tests for\n// the given type-parameterized test suite are defined in.  The exact\n// name of the namespace is subject to change without notice.\n#define GTEST_SUITE_NAMESPACE_(TestSuiteName) gtest_suite_##TestSuiteName##_\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Expands to the name of the variable used to remember the names of\n// the defined tests in the given test suite.\n#define GTEST_TYPED_TEST_SUITE_P_STATE_(TestSuiteName) \\\n  gtest_typed_test_suite_p_state_##TestSuiteName##_\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.\n//\n// Expands to the name of the variable used to remember the names of\n// the registered tests in the given test suite.\n#define GTEST_REGISTERED_TEST_NAMES_(TestSuiteName) \\\n  gtest_registered_test_names_##TestSuiteName##_\n\n// The variables defined in the type-parameterized test macros are\n// static as typically these macros are used in a .h file that can be\n// #included in multiple translation units linked together.\n#define TYPED_TEST_SUITE_P(SuiteName)              \\\n  static ::testing::internal::TypedTestSuitePState \\\n      GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName)\n\n// Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n#define TYPED_TEST_CASE_P                                                 \\\n  static_assert(::testing::internal::TypedTestCase_P_IsDeprecated(), \"\"); \\\n  TYPED_TEST_SUITE_P\n#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n#define TYPED_TEST_P(SuiteName, TestName)                             \\\n  namespace GTEST_SUITE_NAMESPACE_(SuiteName) {                       \\\n    template <typename gtest_TypeParam_>                              \\\n    class TestName : public SuiteName<gtest_TypeParam_> {             \\\n     private:                                                         \\\n      typedef SuiteName<gtest_TypeParam_> TestFixture;                \\\n      typedef gtest_TypeParam_ TypeParam;                             \\\n      void TestBody() override;                                       \\\n    };                                                                \\\n    static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \\\n        GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).AddTestName(       \\\n            __FILE__, __LINE__, GTEST_STRINGIFY_(SuiteName),          \\\n            GTEST_STRINGIFY_(TestName));                              \\\n  }                                                                   \\\n  template <typename gtest_TypeParam_>                                \\\n  void GTEST_SUITE_NAMESPACE_(                                        \\\n      SuiteName)::TestName<gtest_TypeParam_>::TestBody()\n\n// Note: this won't work correctly if the trailing arguments are macros.\n#define REGISTER_TYPED_TEST_SUITE_P(SuiteName, ...)                         \\\n  namespace GTEST_SUITE_NAMESPACE_(SuiteName) {                             \\\n    typedef ::testing::internal::Templates<__VA_ARGS__> gtest_AllTests_;    \\\n  }                                                                         \\\n  static const char* const GTEST_REGISTERED_TEST_NAMES_(                    \\\n      SuiteName) GTEST_ATTRIBUTE_UNUSED_ =                                  \\\n      GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).VerifyRegisteredTestNames( \\\n          GTEST_STRINGIFY_(SuiteName), __FILE__, __LINE__, #__VA_ARGS__)\n\n// Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n#define REGISTER_TYPED_TEST_CASE_P                                           \\\n  static_assert(::testing::internal::RegisterTypedTestCase_P_IsDeprecated(), \\\n                \"\");                                                         \\\n  REGISTER_TYPED_TEST_SUITE_P\n#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n#define INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, SuiteName, Types, ...)       \\\n  static_assert(sizeof(GTEST_STRINGIFY_(Prefix)) > 1,                       \\\n                \"test-suit-prefix must not be empty\");                      \\\n  static bool gtest_##Prefix##_##SuiteName GTEST_ATTRIBUTE_UNUSED_ =        \\\n      ::testing::internal::TypeParameterizedTestSuite<                      \\\n          SuiteName, GTEST_SUITE_NAMESPACE_(SuiteName)::gtest_AllTests_,    \\\n          ::testing::internal::GenerateTypeList<Types>::type>::             \\\n          Register(GTEST_STRINGIFY_(Prefix),                                \\\n                   ::testing::internal::CodeLocation(__FILE__, __LINE__),   \\\n                   &GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName),             \\\n                   GTEST_STRINGIFY_(SuiteName),                             \\\n                   GTEST_REGISTERED_TEST_NAMES_(SuiteName),                 \\\n                   ::testing::internal::GenerateNames<                      \\\n                       ::testing::internal::NameGeneratorSelector<          \\\n                           __VA_ARGS__>::type,                              \\\n                       ::testing::internal::GenerateTypeList<Types>::type>())\n\n// Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n#define INSTANTIATE_TYPED_TEST_CASE_P                                      \\\n  static_assert(                                                           \\\n      ::testing::internal::InstantiateTypedTestCase_P_IsDeprecated(), \"\"); \\\n  INSTANTIATE_TYPED_TEST_SUITE_P\n#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\nnamespace testing {\n\n// Silence C4100 (unreferenced formal parameter) and 4805\n// unsafe mix of type 'const int' and type 'const bool'\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable:4805)\n# pragma warning(disable:4100)\n#endif\n\n\n// Declares the flags.\n\n// This flag temporary enables the disabled tests.\nGTEST_DECLARE_bool_(also_run_disabled_tests);\n\n// This flag brings the debugger on an assertion failure.\nGTEST_DECLARE_bool_(break_on_failure);\n\n// This flag controls whether Google Test catches all test-thrown exceptions\n// and logs them as failures.\nGTEST_DECLARE_bool_(catch_exceptions);\n\n// This flag enables using colors in terminal output. Available values are\n// \"yes\" to enable colors, \"no\" (disable colors), or \"auto\" (the default)\n// to let Google Test decide.\nGTEST_DECLARE_string_(color);\n\n// This flag controls whether the test runner should continue execution past\n// first failure.\nGTEST_DECLARE_bool_(fail_fast);\n\n// This flag sets up the filter to select by name using a glob pattern\n// the tests to run. If the filter is not given all tests are executed.\nGTEST_DECLARE_string_(filter);\n\n// This flag controls whether Google Test installs a signal handler that dumps\n// debugging information when fatal signals are raised.\nGTEST_DECLARE_bool_(install_failure_signal_handler);\n\n// This flag causes the Google Test to list tests. None of the tests listed\n// are actually run if the flag is provided.\nGTEST_DECLARE_bool_(list_tests);\n\n// This flag controls whether Google Test emits a detailed XML report to a file\n// in addition to its normal textual output.\nGTEST_DECLARE_string_(output);\n\n// This flags control whether Google Test prints only test failures.\nGTEST_DECLARE_bool_(brief);\n\n// This flags control whether Google Test prints the elapsed time for each\n// test.\nGTEST_DECLARE_bool_(print_time);\n\n// This flags control whether Google Test prints UTF8 characters as text.\nGTEST_DECLARE_bool_(print_utf8);\n\n// This flag specifies the random number seed.\nGTEST_DECLARE_int32_(random_seed);\n\n// This flag sets how many times the tests are repeated. The default value\n// is 1. If the value is -1 the tests are repeating forever.\nGTEST_DECLARE_int32_(repeat);\n\n// This flag controls whether Google Test includes Google Test internal\n// stack frames in failure stack traces.\nGTEST_DECLARE_bool_(show_internal_stack_frames);\n\n// When this flag is specified, tests' order is randomized on every iteration.\nGTEST_DECLARE_bool_(shuffle);\n\n// This flag specifies the maximum number of stack frames to be\n// printed in a failure message.\nGTEST_DECLARE_int32_(stack_trace_depth);\n\n// When this flag is specified, a failed assertion will throw an\n// exception if exceptions are enabled, or exit the program with a\n// non-zero code otherwise. For use with an external test framework.\nGTEST_DECLARE_bool_(throw_on_failure);\n\n// When this flag is set with a \"host:port\" string, on supported\n// platforms test results are streamed to the specified port on\n// the specified host machine.\nGTEST_DECLARE_string_(stream_result_to);\n\n#if GTEST_USE_OWN_FLAGFILE_FLAG_\nGTEST_DECLARE_string_(flagfile);\n#endif  // GTEST_USE_OWN_FLAGFILE_FLAG_\n\n// The upper limit for valid stack trace depths.\nconst int kMaxStackTraceDepth = 100;\n\nnamespace internal {\n\nclass AssertHelper;\nclass DefaultGlobalTestPartResultReporter;\nclass ExecDeathTest;\nclass NoExecDeathTest;\nclass FinalSuccessChecker;\nclass GTestFlagSaver;\nclass StreamingListenerTest;\nclass TestResultAccessor;\nclass TestEventListenersAccessor;\nclass TestEventRepeater;\nclass UnitTestRecordPropertyTestHelper;\nclass WindowsDeathTest;\nclass FuchsiaDeathTest;\nclass UnitTestImpl* GetUnitTestImpl();\nvoid ReportFailureInUnknownLocation(TestPartResult::Type result_type,\n                                    const std::string& message);\nstd::set<std::string>* GetIgnoredParameterizedTestSuites();\n\n}  // namespace internal\n\n// The friend relationship of some of these classes is cyclic.\n// If we don't forward declare them the compiler might confuse the classes\n// in friendship clauses with same named classes on the scope.\nclass Test;\nclass TestSuite;\n\n// Old API is still available but deprecated\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\nusing TestCase = TestSuite;\n#endif\nclass TestInfo;\nclass UnitTest;\n\n// A class for indicating whether an assertion was successful.  When\n// the assertion wasn't successful, the AssertionResult object\n// remembers a non-empty message that describes how it failed.\n//\n// To create an instance of this class, use one of the factory functions\n// (AssertionSuccess() and AssertionFailure()).\n//\n// This class is useful for two purposes:\n//   1. Defining predicate functions to be used with Boolean test assertions\n//      EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts\n//   2. Defining predicate-format functions to be\n//      used with predicate assertions (ASSERT_PRED_FORMAT*, etc).\n//\n// For example, if you define IsEven predicate:\n//\n//   testing::AssertionResult IsEven(int n) {\n//     if ((n % 2) == 0)\n//       return testing::AssertionSuccess();\n//     else\n//       return testing::AssertionFailure() << n << \" is odd\";\n//   }\n//\n// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))\n// will print the message\n//\n//   Value of: IsEven(Fib(5))\n//     Actual: false (5 is odd)\n//   Expected: true\n//\n// instead of a more opaque\n//\n//   Value of: IsEven(Fib(5))\n//     Actual: false\n//   Expected: true\n//\n// in case IsEven is a simple Boolean predicate.\n//\n// If you expect your predicate to be reused and want to support informative\n// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up\n// about half as often as positive ones in our tests), supply messages for\n// both success and failure cases:\n//\n//   testing::AssertionResult IsEven(int n) {\n//     if ((n % 2) == 0)\n//       return testing::AssertionSuccess() << n << \" is even\";\n//     else\n//       return testing::AssertionFailure() << n << \" is odd\";\n//   }\n//\n// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print\n//\n//   Value of: IsEven(Fib(6))\n//     Actual: true (8 is even)\n//   Expected: false\n//\n// NB: Predicates that support negative Boolean assertions have reduced\n// performance in positive ones so be careful not to use them in tests\n// that have lots (tens of thousands) of positive Boolean assertions.\n//\n// To use this class with EXPECT_PRED_FORMAT assertions such as:\n//\n//   // Verifies that Foo() returns an even number.\n//   EXPECT_PRED_FORMAT1(IsEven, Foo());\n//\n// you need to define:\n//\n//   testing::AssertionResult IsEven(const char* expr, int n) {\n//     if ((n % 2) == 0)\n//       return testing::AssertionSuccess();\n//     else\n//       return testing::AssertionFailure()\n//         << \"Expected: \" << expr << \" is even\\n  Actual: it's \" << n;\n//   }\n//\n// If Foo() returns 5, you will see the following message:\n//\n//   Expected: Foo() is even\n//     Actual: it's 5\n//\nclass GTEST_API_ AssertionResult {\n public:\n  // Copy constructor.\n  // Used in EXPECT_TRUE/FALSE(assertion_result).\n  AssertionResult(const AssertionResult& other);\n\n// C4800 is a level 3 warning in Visual Studio 2015 and earlier.\n// This warning is not emitted in Visual Studio 2017.\n// This warning is off by default starting in Visual Studio 2019 but can be\n// enabled with command-line options.\n#if defined(_MSC_VER) && (_MSC_VER < 1910 || _MSC_VER >= 1920)\n  GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 /* forcing value to bool */)\n#endif\n\n  // Used in the EXPECT_TRUE/FALSE(bool_expression).\n  //\n  // T must be contextually convertible to bool.\n  //\n  // The second parameter prevents this overload from being considered if\n  // the argument is implicitly convertible to AssertionResult. In that case\n  // we want AssertionResult's copy constructor to be used.\n  template <typename T>\n  explicit AssertionResult(\n      const T& success,\n      typename std::enable_if<\n          !std::is_convertible<T, AssertionResult>::value>::type*\n      /*enabler*/\n      = nullptr)\n      : success_(success) {}\n\n#if defined(_MSC_VER) && (_MSC_VER < 1910 || _MSC_VER >= 1920)\n  GTEST_DISABLE_MSC_WARNINGS_POP_()\n#endif\n\n  // Assignment operator.\n  AssertionResult& operator=(AssertionResult other) {\n    swap(other);\n    return *this;\n  }\n\n  // Returns true if and only if the assertion succeeded.\n  operator bool() const { return success_; }  // NOLINT\n\n  // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.\n  AssertionResult operator!() const;\n\n  // Returns the text streamed into this AssertionResult. Test assertions\n  // use it when they fail (i.e., the predicate's outcome doesn't match the\n  // assertion's expectation). When nothing has been streamed into the\n  // object, returns an empty string.\n  const char* message() const {\n    return message_.get() != nullptr ? message_->c_str() : \"\";\n  }\n  // Deprecated; please use message() instead.\n  const char* failure_message() const { return message(); }\n\n  // Streams a custom failure message into this object.\n  template <typename T> AssertionResult& operator<<(const T& value) {\n    AppendMessage(Message() << value);\n    return *this;\n  }\n\n  // Allows streaming basic output manipulators such as endl or flush into\n  // this object.\n  AssertionResult& operator<<(\n      ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {\n    AppendMessage(Message() << basic_manipulator);\n    return *this;\n  }\n\n private:\n  // Appends the contents of message to message_.\n  void AppendMessage(const Message& a_message) {\n    if (message_.get() == nullptr) message_.reset(new ::std::string);\n    message_->append(a_message.GetString().c_str());\n  }\n\n  // Swap the contents of this AssertionResult with other.\n  void swap(AssertionResult& other);\n\n  // Stores result of the assertion predicate.\n  bool success_;\n  // Stores the message describing the condition in case the expectation\n  // construct is not satisfied with the predicate's outcome.\n  // Referenced via a pointer to avoid taking too much stack frame space\n  // with test assertions.\n  std::unique_ptr< ::std::string> message_;\n};\n\n// Makes a successful assertion result.\nGTEST_API_ AssertionResult AssertionSuccess();\n\n// Makes a failed assertion result.\nGTEST_API_ AssertionResult AssertionFailure();\n\n// Makes a failed assertion result with the given failure message.\n// Deprecated; use AssertionFailure() << msg.\nGTEST_API_ AssertionResult AssertionFailure(const Message& msg);\n\n}  // namespace testing\n\n// Includes the auto-generated header that implements a family of generic\n// predicate assertion macros. This include comes late because it relies on\n// APIs declared above.\n// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// This file is AUTOMATICALLY GENERATED on 01/02/2019 by command\n// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!\n//\n// Implements a family of generic predicate assertion macros.\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_\n#define GOOGLETEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_\n\n\nnamespace testing {\n\n// This header implements a family of generic predicate assertion\n// macros:\n//\n//   ASSERT_PRED_FORMAT1(pred_format, v1)\n//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)\n//   ...\n//\n// where pred_format is a function or functor that takes n (in the\n// case of ASSERT_PRED_FORMATn) values and their source expression\n// text, and returns a testing::AssertionResult.  See the definition\n// of ASSERT_EQ in gtest.h for an example.\n//\n// If you don't care about formatting, you can use the more\n// restrictive version:\n//\n//   ASSERT_PRED1(pred, v1)\n//   ASSERT_PRED2(pred, v1, v2)\n//   ...\n//\n// where pred is an n-ary function or functor that returns bool,\n// and the values v1, v2, ..., must support the << operator for\n// streaming to std::ostream.\n//\n// We also define the EXPECT_* variations.\n//\n// For now we only support predicates whose arity is at most 5.\n// Please email googletestframework@googlegroups.com if you need\n// support for higher arities.\n\n// GTEST_ASSERT_ is the basic statement to which all of the assertions\n// in this file reduce.  Don't use this in your code.\n\n#define GTEST_ASSERT_(expression, on_failure) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (const ::testing::AssertionResult gtest_ar = (expression)) \\\n    ; \\\n  else \\\n    on_failure(gtest_ar.failure_message())\n\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use\n// this in your code.\ntemplate <typename Pred,\n          typename T1>\nAssertionResult AssertPred1Helper(const char* pred_text,\n                                  const char* e1,\n                                  Pred pred,\n                                  const T1& v1) {\n  if (pred(v1)) return AssertionSuccess();\n\n  return AssertionFailure()\n         << pred_text << \"(\" << e1 << \") evaluates to false, where\"\n         << \"\\n\"\n         << e1 << \" evaluates to \" << ::testing::PrintToString(v1);\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\\\n  GTEST_ASSERT_(pred_format(#v1, v1), \\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use\n// this in your code.\n#define GTEST_PRED1_(pred, v1, on_failure)\\\n  GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \\\n                                             #v1, \\\n                                             pred, \\\n                                             v1), on_failure)\n\n// Unary predicate assertion macros.\n#define EXPECT_PRED_FORMAT1(pred_format, v1) \\\n  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED1(pred, v1) \\\n  GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT1(pred_format, v1) \\\n  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED1(pred, v1) \\\n  GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)\n\n\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use\n// this in your code.\ntemplate <typename Pred,\n          typename T1,\n          typename T2>\nAssertionResult AssertPred2Helper(const char* pred_text,\n                                  const char* e1,\n                                  const char* e2,\n                                  Pred pred,\n                                  const T1& v1,\n                                  const T2& v2) {\n  if (pred(v1, v2)) return AssertionSuccess();\n\n  return AssertionFailure()\n         << pred_text << \"(\" << e1 << \", \" << e2\n         << \") evaluates to false, where\"\n         << \"\\n\"\n         << e1 << \" evaluates to \" << ::testing::PrintToString(v1) << \"\\n\"\n         << e2 << \" evaluates to \" << ::testing::PrintToString(v2);\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\\\n  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use\n// this in your code.\n#define GTEST_PRED2_(pred, v1, v2, on_failure)\\\n  GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \\\n                                             #v1, \\\n                                             #v2, \\\n                                             pred, \\\n                                             v1, \\\n                                             v2), on_failure)\n\n// Binary predicate assertion macros.\n#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \\\n  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED2(pred, v1, v2) \\\n  GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \\\n  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED2(pred, v1, v2) \\\n  GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)\n\n\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use\n// this in your code.\ntemplate <typename Pred,\n          typename T1,\n          typename T2,\n          typename T3>\nAssertionResult AssertPred3Helper(const char* pred_text,\n                                  const char* e1,\n                                  const char* e2,\n                                  const char* e3,\n                                  Pred pred,\n                                  const T1& v1,\n                                  const T2& v2,\n                                  const T3& v3) {\n  if (pred(v1, v2, v3)) return AssertionSuccess();\n\n  return AssertionFailure()\n         << pred_text << \"(\" << e1 << \", \" << e2 << \", \" << e3\n         << \") evaluates to false, where\"\n         << \"\\n\"\n         << e1 << \" evaluates to \" << ::testing::PrintToString(v1) << \"\\n\"\n         << e2 << \" evaluates to \" << ::testing::PrintToString(v2) << \"\\n\"\n         << e3 << \" evaluates to \" << ::testing::PrintToString(v3);\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\\\n  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use\n// this in your code.\n#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\\\n  GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \\\n                                             #v1, \\\n                                             #v2, \\\n                                             #v3, \\\n                                             pred, \\\n                                             v1, \\\n                                             v2, \\\n                                             v3), on_failure)\n\n// Ternary predicate assertion macros.\n#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \\\n  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED3(pred, v1, v2, v3) \\\n  GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \\\n  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED3(pred, v1, v2, v3) \\\n  GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)\n\n\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use\n// this in your code.\ntemplate <typename Pred,\n          typename T1,\n          typename T2,\n          typename T3,\n          typename T4>\nAssertionResult AssertPred4Helper(const char* pred_text,\n                                  const char* e1,\n                                  const char* e2,\n                                  const char* e3,\n                                  const char* e4,\n                                  Pred pred,\n                                  const T1& v1,\n                                  const T2& v2,\n                                  const T3& v3,\n                                  const T4& v4) {\n  if (pred(v1, v2, v3, v4)) return AssertionSuccess();\n\n  return AssertionFailure()\n         << pred_text << \"(\" << e1 << \", \" << e2 << \", \" << e3 << \", \" << e4\n         << \") evaluates to false, where\"\n         << \"\\n\"\n         << e1 << \" evaluates to \" << ::testing::PrintToString(v1) << \"\\n\"\n         << e2 << \" evaluates to \" << ::testing::PrintToString(v2) << \"\\n\"\n         << e3 << \" evaluates to \" << ::testing::PrintToString(v3) << \"\\n\"\n         << e4 << \" evaluates to \" << ::testing::PrintToString(v4);\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\\\n  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use\n// this in your code.\n#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\\\n  GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \\\n                                             #v1, \\\n                                             #v2, \\\n                                             #v3, \\\n                                             #v4, \\\n                                             pred, \\\n                                             v1, \\\n                                             v2, \\\n                                             v3, \\\n                                             v4), on_failure)\n\n// 4-ary predicate assertion macros.\n#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \\\n  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED4(pred, v1, v2, v3, v4) \\\n  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \\\n  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED4(pred, v1, v2, v3, v4) \\\n  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)\n\n\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use\n// this in your code.\ntemplate <typename Pred,\n          typename T1,\n          typename T2,\n          typename T3,\n          typename T4,\n          typename T5>\nAssertionResult AssertPred5Helper(const char* pred_text,\n                                  const char* e1,\n                                  const char* e2,\n                                  const char* e3,\n                                  const char* e4,\n                                  const char* e5,\n                                  Pred pred,\n                                  const T1& v1,\n                                  const T2& v2,\n                                  const T3& v3,\n                                  const T4& v4,\n                                  const T5& v5) {\n  if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();\n\n  return AssertionFailure()\n         << pred_text << \"(\" << e1 << \", \" << e2 << \", \" << e3 << \", \" << e4\n         << \", \" << e5 << \") evaluates to false, where\"\n         << \"\\n\"\n         << e1 << \" evaluates to \" << ::testing::PrintToString(v1) << \"\\n\"\n         << e2 << \" evaluates to \" << ::testing::PrintToString(v2) << \"\\n\"\n         << e3 << \" evaluates to \" << ::testing::PrintToString(v3) << \"\\n\"\n         << e4 << \" evaluates to \" << ::testing::PrintToString(v4) << \"\\n\"\n         << e5 << \" evaluates to \" << ::testing::PrintToString(v5);\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\\\n  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use\n// this in your code.\n#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\\\n  GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \\\n                                             #v1, \\\n                                             #v2, \\\n                                             #v3, \\\n                                             #v4, \\\n                                             #v5, \\\n                                             pred, \\\n                                             v1, \\\n                                             v2, \\\n                                             v3, \\\n                                             v4, \\\n                                             v5), on_failure)\n\n// 5-ary predicate assertion macros.\n#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \\\n  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \\\n  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \\\n  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \\\n  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)\n\n\n\n}  // namespace testing\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_\n\nnamespace testing {\n\n// The abstract class that all tests inherit from.\n//\n// In Google Test, a unit test program contains one or many TestSuites, and\n// each TestSuite contains one or many Tests.\n//\n// When you define a test using the TEST macro, you don't need to\n// explicitly derive from Test - the TEST macro automatically does\n// this for you.\n//\n// The only time you derive from Test is when defining a test fixture\n// to be used in a TEST_F.  For example:\n//\n//   class FooTest : public testing::Test {\n//    protected:\n//     void SetUp() override { ... }\n//     void TearDown() override { ... }\n//     ...\n//   };\n//\n//   TEST_F(FooTest, Bar) { ... }\n//   TEST_F(FooTest, Baz) { ... }\n//\n// Test is not copyable.\nclass GTEST_API_ Test {\n public:\n  friend class TestInfo;\n\n  // The d'tor is virtual as we intend to inherit from Test.\n  virtual ~Test();\n\n  // Sets up the stuff shared by all tests in this test suite.\n  //\n  // Google Test will call Foo::SetUpTestSuite() before running the first\n  // test in test suite Foo.  Hence a sub-class can define its own\n  // SetUpTestSuite() method to shadow the one defined in the super\n  // class.\n  static void SetUpTestSuite() {}\n\n  // Tears down the stuff shared by all tests in this test suite.\n  //\n  // Google Test will call Foo::TearDownTestSuite() after running the last\n  // test in test suite Foo.  Hence a sub-class can define its own\n  // TearDownTestSuite() method to shadow the one defined in the super\n  // class.\n  static void TearDownTestSuite() {}\n\n  // Legacy API is deprecated but still available. Use SetUpTestSuite and\n  // TearDownTestSuite instead.\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  static void TearDownTestCase() {}\n  static void SetUpTestCase() {}\n#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n  // Returns true if and only if the current test has a fatal failure.\n  static bool HasFatalFailure();\n\n  // Returns true if and only if the current test has a non-fatal failure.\n  static bool HasNonfatalFailure();\n\n  // Returns true if and only if the current test was skipped.\n  static bool IsSkipped();\n\n  // Returns true if and only if the current test has a (either fatal or\n  // non-fatal) failure.\n  static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }\n\n  // Logs a property for the current test, test suite, or for the entire\n  // invocation of the test program when used outside of the context of a\n  // test suite.  Only the last value for a given key is remembered.  These\n  // are public static so they can be called from utility functions that are\n  // not members of the test fixture.  Calls to RecordProperty made during\n  // lifespan of the test (from the moment its constructor starts to the\n  // moment its destructor finishes) will be output in XML as attributes of\n  // the <testcase> element.  Properties recorded from fixture's\n  // SetUpTestSuite or TearDownTestSuite are logged as attributes of the\n  // corresponding <testsuite> element.  Calls to RecordProperty made in the\n  // global context (before or after invocation of RUN_ALL_TESTS and from\n  // SetUp/TearDown method of Environment objects registered with Google\n  // Test) will be output as attributes of the <testsuites> element.\n  static void RecordProperty(const std::string& key, const std::string& value);\n  static void RecordProperty(const std::string& key, int value);\n\n protected:\n  // Creates a Test object.\n  Test();\n\n  // Sets up the test fixture.\n  virtual void SetUp();\n\n  // Tears down the test fixture.\n  virtual void TearDown();\n\n private:\n  // Returns true if and only if the current test has the same fixture class\n  // as the first test in the current test suite.\n  static bool HasSameFixtureClass();\n\n  // Runs the test after the test fixture has been set up.\n  //\n  // A sub-class must implement this to define the test logic.\n  //\n  // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.\n  // Instead, use the TEST or TEST_F macro.\n  virtual void TestBody() = 0;\n\n  // Sets up, executes, and tears down the test.\n  void Run();\n\n  // Deletes self.  We deliberately pick an unusual name for this\n  // internal method to avoid clashing with names used in user TESTs.\n  void DeleteSelf_() { delete this; }\n\n  const std::unique_ptr<GTEST_FLAG_SAVER_> gtest_flag_saver_;\n\n  // Often a user misspells SetUp() as Setup() and spends a long time\n  // wondering why it is never called by Google Test.  The declaration of\n  // the following method is solely for catching such an error at\n  // compile time:\n  //\n  //   - The return type is deliberately chosen to be not void, so it\n  //   will be a conflict if void Setup() is declared in the user's\n  //   test fixture.\n  //\n  //   - This method is private, so it will be another compiler error\n  //   if the method is called from the user's test fixture.\n  //\n  // DO NOT OVERRIDE THIS FUNCTION.\n  //\n  // If you see an error about overriding the following function or\n  // about it being private, you have mis-spelled SetUp() as Setup().\n  struct Setup_should_be_spelled_SetUp {};\n  virtual Setup_should_be_spelled_SetUp* Setup() { return nullptr; }\n\n  // We disallow copying Tests.\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);\n};\n\ntypedef internal::TimeInMillis TimeInMillis;\n\n// A copyable object representing a user specified test property which can be\n// output as a key/value string pair.\n//\n// Don't inherit from TestProperty as its destructor is not virtual.\nclass TestProperty {\n public:\n  // C'tor.  TestProperty does NOT have a default constructor.\n  // Always use this constructor (with parameters) to create a\n  // TestProperty object.\n  TestProperty(const std::string& a_key, const std::string& a_value) :\n    key_(a_key), value_(a_value) {\n  }\n\n  // Gets the user supplied key.\n  const char* key() const {\n    return key_.c_str();\n  }\n\n  // Gets the user supplied value.\n  const char* value() const {\n    return value_.c_str();\n  }\n\n  // Sets a new value, overriding the one supplied in the constructor.\n  void SetValue(const std::string& new_value) {\n    value_ = new_value;\n  }\n\n private:\n  // The key supplied by the user.\n  std::string key_;\n  // The value supplied by the user.\n  std::string value_;\n};\n\n// The result of a single Test.  This includes a list of\n// TestPartResults, a list of TestProperties, a count of how many\n// death tests there are in the Test, and how much time it took to run\n// the Test.\n//\n// TestResult is not copyable.\nclass GTEST_API_ TestResult {\n public:\n  // Creates an empty TestResult.\n  TestResult();\n\n  // D'tor.  Do not inherit from TestResult.\n  ~TestResult();\n\n  // Gets the number of all test parts.  This is the sum of the number\n  // of successful test parts and the number of failed test parts.\n  int total_part_count() const;\n\n  // Returns the number of the test properties.\n  int test_property_count() const;\n\n  // Returns true if and only if the test passed (i.e. no test part failed).\n  bool Passed() const { return !Skipped() && !Failed(); }\n\n  // Returns true if and only if the test was skipped.\n  bool Skipped() const;\n\n  // Returns true if and only if the test failed.\n  bool Failed() const;\n\n  // Returns true if and only if the test fatally failed.\n  bool HasFatalFailure() const;\n\n  // Returns true if and only if the test has a non-fatal failure.\n  bool HasNonfatalFailure() const;\n\n  // Returns the elapsed time, in milliseconds.\n  TimeInMillis elapsed_time() const { return elapsed_time_; }\n\n  // Gets the time of the test case start, in ms from the start of the\n  // UNIX epoch.\n  TimeInMillis start_timestamp() const { return start_timestamp_; }\n\n  // Returns the i-th test part result among all the results. i can range from 0\n  // to total_part_count() - 1. If i is not in that range, aborts the program.\n  const TestPartResult& GetTestPartResult(int i) const;\n\n  // Returns the i-th test property. i can range from 0 to\n  // test_property_count() - 1. If i is not in that range, aborts the\n  // program.\n  const TestProperty& GetTestProperty(int i) const;\n\n private:\n  friend class TestInfo;\n  friend class TestSuite;\n  friend class UnitTest;\n  friend class internal::DefaultGlobalTestPartResultReporter;\n  friend class internal::ExecDeathTest;\n  friend class internal::TestResultAccessor;\n  friend class internal::UnitTestImpl;\n  friend class internal::WindowsDeathTest;\n  friend class internal::FuchsiaDeathTest;\n\n  // Gets the vector of TestPartResults.\n  const std::vector<TestPartResult>& test_part_results() const {\n    return test_part_results_;\n  }\n\n  // Gets the vector of TestProperties.\n  const std::vector<TestProperty>& test_properties() const {\n    return test_properties_;\n  }\n\n  // Sets the start time.\n  void set_start_timestamp(TimeInMillis start) { start_timestamp_ = start; }\n\n  // Sets the elapsed time.\n  void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }\n\n  // Adds a test property to the list. The property is validated and may add\n  // a non-fatal failure if invalid (e.g., if it conflicts with reserved\n  // key names). If a property is already recorded for the same key, the\n  // value will be updated, rather than storing multiple values for the same\n  // key.  xml_element specifies the element for which the property is being\n  // recorded and is used for validation.\n  void RecordProperty(const std::string& xml_element,\n                      const TestProperty& test_property);\n\n  // Adds a failure if the key is a reserved attribute of Google Test\n  // testsuite tags.  Returns true if the property is valid.\n  // FIXME: Validate attribute names are legal and human readable.\n  static bool ValidateTestProperty(const std::string& xml_element,\n                                   const TestProperty& test_property);\n\n  // Adds a test part result to the list.\n  void AddTestPartResult(const TestPartResult& test_part_result);\n\n  // Returns the death test count.\n  int death_test_count() const { return death_test_count_; }\n\n  // Increments the death test count, returning the new count.\n  int increment_death_test_count() { return ++death_test_count_; }\n\n  // Clears the test part results.\n  void ClearTestPartResults();\n\n  // Clears the object.\n  void Clear();\n\n  // Protects mutable state of the property vector and of owned\n  // properties, whose values may be updated.\n  internal::Mutex test_properties_mutex_;\n\n  // The vector of TestPartResults\n  std::vector<TestPartResult> test_part_results_;\n  // The vector of TestProperties\n  std::vector<TestProperty> test_properties_;\n  // Running count of death tests.\n  int death_test_count_;\n  // The start time, in milliseconds since UNIX Epoch.\n  TimeInMillis start_timestamp_;\n  // The elapsed time, in milliseconds.\n  TimeInMillis elapsed_time_;\n\n  // We disallow copying TestResult.\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);\n};  // class TestResult\n\n// A TestInfo object stores the following information about a test:\n//\n//   Test suite name\n//   Test name\n//   Whether the test should be run\n//   A function pointer that creates the test object when invoked\n//   Test result\n//\n// The constructor of TestInfo registers itself with the UnitTest\n// singleton such that the RUN_ALL_TESTS() macro knows which tests to\n// run.\nclass GTEST_API_ TestInfo {\n public:\n  // Destructs a TestInfo object.  This function is not virtual, so\n  // don't inherit from TestInfo.\n  ~TestInfo();\n\n  // Returns the test suite name.\n  const char* test_suite_name() const { return test_suite_name_.c_str(); }\n\n// Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  const char* test_case_name() const { return test_suite_name(); }\n#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n  // Returns the test name.\n  const char* name() const { return name_.c_str(); }\n\n  // Returns the name of the parameter type, or NULL if this is not a typed\n  // or a type-parameterized test.\n  const char* type_param() const {\n    if (type_param_.get() != nullptr) return type_param_->c_str();\n    return nullptr;\n  }\n\n  // Returns the text representation of the value parameter, or NULL if this\n  // is not a value-parameterized test.\n  const char* value_param() const {\n    if (value_param_.get() != nullptr) return value_param_->c_str();\n    return nullptr;\n  }\n\n  // Returns the file name where this test is defined.\n  const char* file() const { return location_.file.c_str(); }\n\n  // Returns the line where this test is defined.\n  int line() const { return location_.line; }\n\n  // Return true if this test should not be run because it's in another shard.\n  bool is_in_another_shard() const { return is_in_another_shard_; }\n\n  // Returns true if this test should run, that is if the test is not\n  // disabled (or it is disabled but the also_run_disabled_tests flag has\n  // been specified) and its full name matches the user-specified filter.\n  //\n  // Google Test allows the user to filter the tests by their full names.\n  // The full name of a test Bar in test suite Foo is defined as\n  // \"Foo.Bar\".  Only the tests that match the filter will run.\n  //\n  // A filter is a colon-separated list of glob (not regex) patterns,\n  // optionally followed by a '-' and a colon-separated list of\n  // negative patterns (tests to exclude).  A test is run if it\n  // matches one of the positive patterns and does not match any of\n  // the negative patterns.\n  //\n  // For example, *A*:Foo.* is a filter that matches any string that\n  // contains the character 'A' or starts with \"Foo.\".\n  bool should_run() const { return should_run_; }\n\n  // Returns true if and only if this test will appear in the XML report.\n  bool is_reportable() const {\n    // The XML report includes tests matching the filter, excluding those\n    // run in other shards.\n    return matches_filter_ && !is_in_another_shard_;\n  }\n\n  // Returns the result of the test.\n  const TestResult* result() const { return &result_; }\n\n private:\n#if GTEST_HAS_DEATH_TEST\n  friend class internal::DefaultDeathTestFactory;\n#endif  // GTEST_HAS_DEATH_TEST\n  friend class Test;\n  friend class TestSuite;\n  friend class internal::UnitTestImpl;\n  friend class internal::StreamingListenerTest;\n  friend TestInfo* internal::MakeAndRegisterTestInfo(\n      const char* test_suite_name, const char* name, const char* type_param,\n      const char* value_param, internal::CodeLocation code_location,\n      internal::TypeId fixture_class_id, internal::SetUpTestSuiteFunc set_up_tc,\n      internal::TearDownTestSuiteFunc tear_down_tc,\n      internal::TestFactoryBase* factory);\n\n  // Constructs a TestInfo object. The newly constructed instance assumes\n  // ownership of the factory object.\n  TestInfo(const std::string& test_suite_name, const std::string& name,\n           const char* a_type_param,   // NULL if not a type-parameterized test\n           const char* a_value_param,  // NULL if not a value-parameterized test\n           internal::CodeLocation a_code_location,\n           internal::TypeId fixture_class_id,\n           internal::TestFactoryBase* factory);\n\n  // Increments the number of death tests encountered in this test so\n  // far.\n  int increment_death_test_count() {\n    return result_.increment_death_test_count();\n  }\n\n  // Creates the test object, runs it, records its result, and then\n  // deletes it.\n  void Run();\n\n  // Skip and records the test result for this object.\n  void Skip();\n\n  static void ClearTestResult(TestInfo* test_info) {\n    test_info->result_.Clear();\n  }\n\n  // These fields are immutable properties of the test.\n  const std::string test_suite_name_;    // test suite name\n  const std::string name_;               // Test name\n  // Name of the parameter type, or NULL if this is not a typed or a\n  // type-parameterized test.\n  const std::unique_ptr<const ::std::string> type_param_;\n  // Text representation of the value parameter, or NULL if this is not a\n  // value-parameterized test.\n  const std::unique_ptr<const ::std::string> value_param_;\n  internal::CodeLocation location_;\n  const internal::TypeId fixture_class_id_;  // ID of the test fixture class\n  bool should_run_;           // True if and only if this test should run\n  bool is_disabled_;          // True if and only if this test is disabled\n  bool matches_filter_;       // True if this test matches the\n                              // user-specified filter.\n  bool is_in_another_shard_;  // Will be run in another shard.\n  internal::TestFactoryBase* const factory_;  // The factory that creates\n                                              // the test object\n\n  // This field is mutable and needs to be reset before running the\n  // test for the second time.\n  TestResult result_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);\n};\n\n// A test suite, which consists of a vector of TestInfos.\n//\n// TestSuite is not copyable.\nclass GTEST_API_ TestSuite {\n public:\n  // Creates a TestSuite with the given name.\n  //\n  // TestSuite does NOT have a default constructor.  Always use this\n  // constructor to create a TestSuite object.\n  //\n  // Arguments:\n  //\n  //   name:         name of the test suite\n  //   a_type_param: the name of the test's type parameter, or NULL if\n  //                 this is not a type-parameterized test.\n  //   set_up_tc:    pointer to the function that sets up the test suite\n  //   tear_down_tc: pointer to the function that tears down the test suite\n  TestSuite(const char* name, const char* a_type_param,\n            internal::SetUpTestSuiteFunc set_up_tc,\n            internal::TearDownTestSuiteFunc tear_down_tc);\n\n  // Destructor of TestSuite.\n  virtual ~TestSuite();\n\n  // Gets the name of the TestSuite.\n  const char* name() const { return name_.c_str(); }\n\n  // Returns the name of the parameter type, or NULL if this is not a\n  // type-parameterized test suite.\n  const char* type_param() const {\n    if (type_param_.get() != nullptr) return type_param_->c_str();\n    return nullptr;\n  }\n\n  // Returns true if any test in this test suite should run.\n  bool should_run() const { return should_run_; }\n\n  // Gets the number of successful tests in this test suite.\n  int successful_test_count() const;\n\n  // Gets the number of skipped tests in this test suite.\n  int skipped_test_count() const;\n\n  // Gets the number of failed tests in this test suite.\n  int failed_test_count() const;\n\n  // Gets the number of disabled tests that will be reported in the XML report.\n  int reportable_disabled_test_count() const;\n\n  // Gets the number of disabled tests in this test suite.\n  int disabled_test_count() const;\n\n  // Gets the number of tests to be printed in the XML report.\n  int reportable_test_count() const;\n\n  // Get the number of tests in this test suite that should run.\n  int test_to_run_count() const;\n\n  // Gets the number of all tests in this test suite.\n  int total_test_count() const;\n\n  // Returns true if and only if the test suite passed.\n  bool Passed() const { return !Failed(); }\n\n  // Returns true if and only if the test suite failed.\n  bool Failed() const {\n    return failed_test_count() > 0 || ad_hoc_test_result().Failed();\n  }\n\n  // Returns the elapsed time, in milliseconds.\n  TimeInMillis elapsed_time() const { return elapsed_time_; }\n\n  // Gets the time of the test suite start, in ms from the start of the\n  // UNIX epoch.\n  TimeInMillis start_timestamp() const { return start_timestamp_; }\n\n  // Returns the i-th test among all the tests. i can range from 0 to\n  // total_test_count() - 1. If i is not in that range, returns NULL.\n  const TestInfo* GetTestInfo(int i) const;\n\n  // Returns the TestResult that holds test properties recorded during\n  // execution of SetUpTestSuite and TearDownTestSuite.\n  const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; }\n\n private:\n  friend class Test;\n  friend class internal::UnitTestImpl;\n\n  // Gets the (mutable) vector of TestInfos in this TestSuite.\n  std::vector<TestInfo*>& test_info_list() { return test_info_list_; }\n\n  // Gets the (immutable) vector of TestInfos in this TestSuite.\n  const std::vector<TestInfo*>& test_info_list() const {\n    return test_info_list_;\n  }\n\n  // Returns the i-th test among all the tests. i can range from 0 to\n  // total_test_count() - 1. If i is not in that range, returns NULL.\n  TestInfo* GetMutableTestInfo(int i);\n\n  // Sets the should_run member.\n  void set_should_run(bool should) { should_run_ = should; }\n\n  // Adds a TestInfo to this test suite.  Will delete the TestInfo upon\n  // destruction of the TestSuite object.\n  void AddTestInfo(TestInfo * test_info);\n\n  // Clears the results of all tests in this test suite.\n  void ClearResult();\n\n  // Clears the results of all tests in the given test suite.\n  static void ClearTestSuiteResult(TestSuite* test_suite) {\n    test_suite->ClearResult();\n  }\n\n  // Runs every test in this TestSuite.\n  void Run();\n\n  // Skips the execution of tests under this TestSuite\n  void Skip();\n\n  // Runs SetUpTestSuite() for this TestSuite.  This wrapper is needed\n  // for catching exceptions thrown from SetUpTestSuite().\n  void RunSetUpTestSuite() {\n    if (set_up_tc_ != nullptr) {\n      (*set_up_tc_)();\n    }\n  }\n\n  // Runs TearDownTestSuite() for this TestSuite.  This wrapper is\n  // needed for catching exceptions thrown from TearDownTestSuite().\n  void RunTearDownTestSuite() {\n    if (tear_down_tc_ != nullptr) {\n      (*tear_down_tc_)();\n    }\n  }\n\n  // Returns true if and only if test passed.\n  static bool TestPassed(const TestInfo* test_info) {\n    return test_info->should_run() && test_info->result()->Passed();\n  }\n\n  // Returns true if and only if test skipped.\n  static bool TestSkipped(const TestInfo* test_info) {\n    return test_info->should_run() && test_info->result()->Skipped();\n  }\n\n  // Returns true if and only if test failed.\n  static bool TestFailed(const TestInfo* test_info) {\n    return test_info->should_run() && test_info->result()->Failed();\n  }\n\n  // Returns true if and only if the test is disabled and will be reported in\n  // the XML report.\n  static bool TestReportableDisabled(const TestInfo* test_info) {\n    return test_info->is_reportable() && test_info->is_disabled_;\n  }\n\n  // Returns true if and only if test is disabled.\n  static bool TestDisabled(const TestInfo* test_info) {\n    return test_info->is_disabled_;\n  }\n\n  // Returns true if and only if this test will appear in the XML report.\n  static bool TestReportable(const TestInfo* test_info) {\n    return test_info->is_reportable();\n  }\n\n  // Returns true if the given test should run.\n  static bool ShouldRunTest(const TestInfo* test_info) {\n    return test_info->should_run();\n  }\n\n  // Shuffles the tests in this test suite.\n  void ShuffleTests(internal::Random* random);\n\n  // Restores the test order to before the first shuffle.\n  void UnshuffleTests();\n\n  // Name of the test suite.\n  std::string name_;\n  // Name of the parameter type, or NULL if this is not a typed or a\n  // type-parameterized test.\n  const std::unique_ptr<const ::std::string> type_param_;\n  // The vector of TestInfos in their original order.  It owns the\n  // elements in the vector.\n  std::vector<TestInfo*> test_info_list_;\n  // Provides a level of indirection for the test list to allow easy\n  // shuffling and restoring the test order.  The i-th element in this\n  // vector is the index of the i-th test in the shuffled test list.\n  std::vector<int> test_indices_;\n  // Pointer to the function that sets up the test suite.\n  internal::SetUpTestSuiteFunc set_up_tc_;\n  // Pointer to the function that tears down the test suite.\n  internal::TearDownTestSuiteFunc tear_down_tc_;\n  // True if and only if any test in this test suite should run.\n  bool should_run_;\n  // The start time, in milliseconds since UNIX Epoch.\n  TimeInMillis start_timestamp_;\n  // Elapsed time, in milliseconds.\n  TimeInMillis elapsed_time_;\n  // Holds test properties recorded during execution of SetUpTestSuite and\n  // TearDownTestSuite.\n  TestResult ad_hoc_test_result_;\n\n  // We disallow copying TestSuites.\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestSuite);\n};\n\n// An Environment object is capable of setting up and tearing down an\n// environment.  You should subclass this to define your own\n// environment(s).\n//\n// An Environment object does the set-up and tear-down in virtual\n// methods SetUp() and TearDown() instead of the constructor and the\n// destructor, as:\n//\n//   1. You cannot safely throw from a destructor.  This is a problem\n//      as in some cases Google Test is used where exceptions are enabled, and\n//      we may want to implement ASSERT_* using exceptions where they are\n//      available.\n//   2. You cannot use ASSERT_* directly in a constructor or\n//      destructor.\nclass Environment {\n public:\n  // The d'tor is virtual as we need to subclass Environment.\n  virtual ~Environment() {}\n\n  // Override this to define how to set up the environment.\n  virtual void SetUp() {}\n\n  // Override this to define how to tear down the environment.\n  virtual void TearDown() {}\n private:\n  // If you see an error about overriding the following function or\n  // about it being private, you have mis-spelled SetUp() as Setup().\n  struct Setup_should_be_spelled_SetUp {};\n  virtual Setup_should_be_spelled_SetUp* Setup() { return nullptr; }\n};\n\n#if GTEST_HAS_EXCEPTIONS\n\n// Exception which can be thrown from TestEventListener::OnTestPartResult.\nclass GTEST_API_ AssertionException\n    : public internal::GoogleTestFailureException {\n public:\n  explicit AssertionException(const TestPartResult& result)\n      : GoogleTestFailureException(result) {}\n};\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n// The interface for tracing execution of tests. The methods are organized in\n// the order the corresponding events are fired.\nclass TestEventListener {\n public:\n  virtual ~TestEventListener() {}\n\n  // Fired before any test activity starts.\n  virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;\n\n  // Fired before each iteration of tests starts.  There may be more than\n  // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration\n  // index, starting from 0.\n  virtual void OnTestIterationStart(const UnitTest& unit_test,\n                                    int iteration) = 0;\n\n  // Fired before environment set-up for each iteration of tests starts.\n  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;\n\n  // Fired after environment set-up for each iteration of tests ends.\n  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;\n\n  // Fired before the test suite starts.\n  virtual void OnTestSuiteStart(const TestSuite& /*test_suite*/) {}\n\n  //  Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n  // Fired before the test starts.\n  virtual void OnTestStart(const TestInfo& test_info) = 0;\n\n  // Fired after a failed assertion or a SUCCEED() invocation.\n  // If you want to throw an exception from this function to skip to the next\n  // TEST, it must be AssertionException defined above, or inherited from it.\n  virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;\n\n  // Fired after the test ends.\n  virtual void OnTestEnd(const TestInfo& test_info) = 0;\n\n  // Fired after the test suite ends.\n  virtual void OnTestSuiteEnd(const TestSuite& /*test_suite*/) {}\n\n//  Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n  // Fired before environment tear-down for each iteration of tests starts.\n  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;\n\n  // Fired after environment tear-down for each iteration of tests ends.\n  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;\n\n  // Fired after each iteration of tests finishes.\n  virtual void OnTestIterationEnd(const UnitTest& unit_test,\n                                  int iteration) = 0;\n\n  // Fired after all test activities have ended.\n  virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;\n};\n\n// The convenience class for users who need to override just one or two\n// methods and are not concerned that a possible change to a signature of\n// the methods they override will not be caught during the build.  For\n// comments about each method please see the definition of TestEventListener\n// above.\nclass EmptyTestEventListener : public TestEventListener {\n public:\n  void OnTestProgramStart(const UnitTest& /*unit_test*/) override {}\n  void OnTestIterationStart(const UnitTest& /*unit_test*/,\n                            int /*iteration*/) override {}\n  void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) override {}\n  void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {}\n  void OnTestSuiteStart(const TestSuite& /*test_suite*/) override {}\n//  Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  void OnTestCaseStart(const TestCase& /*test_case*/) override {}\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n  void OnTestStart(const TestInfo& /*test_info*/) override {}\n  void OnTestPartResult(const TestPartResult& /*test_part_result*/) override {}\n  void OnTestEnd(const TestInfo& /*test_info*/) override {}\n  void OnTestSuiteEnd(const TestSuite& /*test_suite*/) override {}\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  void OnTestCaseEnd(const TestCase& /*test_case*/) override {}\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n  void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) override {}\n  void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {}\n  void OnTestIterationEnd(const UnitTest& /*unit_test*/,\n                          int /*iteration*/) override {}\n  void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {}\n};\n\n// TestEventListeners lets users add listeners to track events in Google Test.\nclass GTEST_API_ TestEventListeners {\n public:\n  TestEventListeners();\n  ~TestEventListeners();\n\n  // Appends an event listener to the end of the list. Google Test assumes\n  // the ownership of the listener (i.e. it will delete the listener when\n  // the test program finishes).\n  void Append(TestEventListener* listener);\n\n  // Removes the given event listener from the list and returns it.  It then\n  // becomes the caller's responsibility to delete the listener. Returns\n  // NULL if the listener is not found in the list.\n  TestEventListener* Release(TestEventListener* listener);\n\n  // Returns the standard listener responsible for the default console\n  // output.  Can be removed from the listeners list to shut down default\n  // console output.  Note that removing this object from the listener list\n  // with Release transfers its ownership to the caller and makes this\n  // function return NULL the next time.\n  TestEventListener* default_result_printer() const {\n    return default_result_printer_;\n  }\n\n  // Returns the standard listener responsible for the default XML output\n  // controlled by the --gtest_output=xml flag.  Can be removed from the\n  // listeners list by users who want to shut down the default XML output\n  // controlled by this flag and substitute it with custom one.  Note that\n  // removing this object from the listener list with Release transfers its\n  // ownership to the caller and makes this function return NULL the next\n  // time.\n  TestEventListener* default_xml_generator() const {\n    return default_xml_generator_;\n  }\n\n private:\n  friend class TestSuite;\n  friend class TestInfo;\n  friend class internal::DefaultGlobalTestPartResultReporter;\n  friend class internal::NoExecDeathTest;\n  friend class internal::TestEventListenersAccessor;\n  friend class internal::UnitTestImpl;\n\n  // Returns repeater that broadcasts the TestEventListener events to all\n  // subscribers.\n  TestEventListener* repeater();\n\n  // Sets the default_result_printer attribute to the provided listener.\n  // The listener is also added to the listener list and previous\n  // default_result_printer is removed from it and deleted. The listener can\n  // also be NULL in which case it will not be added to the list. Does\n  // nothing if the previous and the current listener objects are the same.\n  void SetDefaultResultPrinter(TestEventListener* listener);\n\n  // Sets the default_xml_generator attribute to the provided listener.  The\n  // listener is also added to the listener list and previous\n  // default_xml_generator is removed from it and deleted. The listener can\n  // also be NULL in which case it will not be added to the list. Does\n  // nothing if the previous and the current listener objects are the same.\n  void SetDefaultXmlGenerator(TestEventListener* listener);\n\n  // Controls whether events will be forwarded by the repeater to the\n  // listeners in the list.\n  bool EventForwardingEnabled() const;\n  void SuppressEventForwarding();\n\n  // The actual list of listeners.\n  internal::TestEventRepeater* repeater_;\n  // Listener responsible for the standard result output.\n  TestEventListener* default_result_printer_;\n  // Listener responsible for the creation of the XML output file.\n  TestEventListener* default_xml_generator_;\n\n  // We disallow copying TestEventListeners.\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);\n};\n\n// A UnitTest consists of a vector of TestSuites.\n//\n// This is a singleton class.  The only instance of UnitTest is\n// created when UnitTest::GetInstance() is first called.  This\n// instance is never deleted.\n//\n// UnitTest is not copyable.\n//\n// This class is thread-safe as long as the methods are called\n// according to their specification.\nclass GTEST_API_ UnitTest {\n public:\n  // Gets the singleton UnitTest object.  The first time this method\n  // is called, a UnitTest object is constructed and returned.\n  // Consecutive calls will return the same object.\n  static UnitTest* GetInstance();\n\n  // Runs all tests in this UnitTest object and prints the result.\n  // Returns 0 if successful, or 1 otherwise.\n  //\n  // This method can only be called from the main thread.\n  //\n  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n  int Run() GTEST_MUST_USE_RESULT_;\n\n  // Returns the working directory when the first TEST() or TEST_F()\n  // was executed.  The UnitTest object owns the string.\n  const char* original_working_dir() const;\n\n  // Returns the TestSuite object for the test that's currently running,\n  // or NULL if no test is running.\n  const TestSuite* current_test_suite() const GTEST_LOCK_EXCLUDED_(mutex_);\n\n// Legacy API is still available but deprecated\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  const TestCase* current_test_case() const GTEST_LOCK_EXCLUDED_(mutex_);\n#endif\n\n  // Returns the TestInfo object for the test that's currently running,\n  // or NULL if no test is running.\n  const TestInfo* current_test_info() const\n      GTEST_LOCK_EXCLUDED_(mutex_);\n\n  // Returns the random seed used at the start of the current test run.\n  int random_seed() const;\n\n  // Returns the ParameterizedTestSuiteRegistry object used to keep track of\n  // value-parameterized tests and instantiate and register them.\n  //\n  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n  internal::ParameterizedTestSuiteRegistry& parameterized_test_registry()\n      GTEST_LOCK_EXCLUDED_(mutex_);\n\n  // Gets the number of successful test suites.\n  int successful_test_suite_count() const;\n\n  // Gets the number of failed test suites.\n  int failed_test_suite_count() const;\n\n  // Gets the number of all test suites.\n  int total_test_suite_count() const;\n\n  // Gets the number of all test suites that contain at least one test\n  // that should run.\n  int test_suite_to_run_count() const;\n\n  //  Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  int successful_test_case_count() const;\n  int failed_test_case_count() const;\n  int total_test_case_count() const;\n  int test_case_to_run_count() const;\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n  // Gets the number of successful tests.\n  int successful_test_count() const;\n\n  // Gets the number of skipped tests.\n  int skipped_test_count() const;\n\n  // Gets the number of failed tests.\n  int failed_test_count() const;\n\n  // Gets the number of disabled tests that will be reported in the XML report.\n  int reportable_disabled_test_count() const;\n\n  // Gets the number of disabled tests.\n  int disabled_test_count() const;\n\n  // Gets the number of tests to be printed in the XML report.\n  int reportable_test_count() const;\n\n  // Gets the number of all tests.\n  int total_test_count() const;\n\n  // Gets the number of tests that should run.\n  int test_to_run_count() const;\n\n  // Gets the time of the test program start, in ms from the start of the\n  // UNIX epoch.\n  TimeInMillis start_timestamp() const;\n\n  // Gets the elapsed time, in milliseconds.\n  TimeInMillis elapsed_time() const;\n\n  // Returns true if and only if the unit test passed (i.e. all test suites\n  // passed).\n  bool Passed() const;\n\n  // Returns true if and only if the unit test failed (i.e. some test suite\n  // failed or something outside of all tests failed).\n  bool Failed() const;\n\n  // Gets the i-th test suite among all the test suites. i can range from 0 to\n  // total_test_suite_count() - 1. If i is not in that range, returns NULL.\n  const TestSuite* GetTestSuite(int i) const;\n\n//  Legacy API is deprecated but still available\n#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n  const TestCase* GetTestCase(int i) const;\n#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_\n\n  // Returns the TestResult containing information on test failures and\n  // properties logged outside of individual test suites.\n  const TestResult& ad_hoc_test_result() const;\n\n  // Returns the list of event listeners that can be used to track events\n  // inside Google Test.\n  TestEventListeners& listeners();\n\n private:\n  // Registers and returns a global test environment.  When a test\n  // program is run, all global test environments will be set-up in\n  // the order they were registered.  After all tests in the program\n  // have finished, all global test environments will be torn-down in\n  // the *reverse* order they were registered.\n  //\n  // The UnitTest object takes ownership of the given environment.\n  //\n  // This method can only be called from the main thread.\n  Environment* AddEnvironment(Environment* env);\n\n  // Adds a TestPartResult to the current TestResult object.  All\n  // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)\n  // eventually call this to report their results.  The user code\n  // should use the assertion macros instead of calling this directly.\n  void AddTestPartResult(TestPartResult::Type result_type,\n                         const char* file_name,\n                         int line_number,\n                         const std::string& message,\n                         const std::string& os_stack_trace)\n      GTEST_LOCK_EXCLUDED_(mutex_);\n\n  // Adds a TestProperty to the current TestResult object when invoked from\n  // inside a test, to current TestSuite's ad_hoc_test_result_ when invoked\n  // from SetUpTestSuite or TearDownTestSuite, or to the global property set\n  // when invoked elsewhere.  If the result already contains a property with\n  // the same key, the value will be updated.\n  void RecordProperty(const std::string& key, const std::string& value);\n\n  // Gets the i-th test suite among all the test suites. i can range from 0 to\n  // total_test_suite_count() - 1. If i is not in that range, returns NULL.\n  TestSuite* GetMutableTestSuite(int i);\n\n  // Accessors for the implementation object.\n  internal::UnitTestImpl* impl() { return impl_; }\n  const internal::UnitTestImpl* impl() const { return impl_; }\n\n  // These classes and functions are friends as they need to access private\n  // members of UnitTest.\n  friend class ScopedTrace;\n  friend class Test;\n  friend class internal::AssertHelper;\n  friend class internal::StreamingListenerTest;\n  friend class internal::UnitTestRecordPropertyTestHelper;\n  friend Environment* AddGlobalTestEnvironment(Environment* env);\n  friend std::set<std::string>* internal::GetIgnoredParameterizedTestSuites();\n  friend internal::UnitTestImpl* internal::GetUnitTestImpl();\n  friend void internal::ReportFailureInUnknownLocation(\n      TestPartResult::Type result_type,\n      const std::string& message);\n\n  // Creates an empty UnitTest.\n  UnitTest();\n\n  // D'tor\n  virtual ~UnitTest();\n\n  // Pushes a trace defined by SCOPED_TRACE() on to the per-thread\n  // Google Test trace stack.\n  void PushGTestTrace(const internal::TraceInfo& trace)\n      GTEST_LOCK_EXCLUDED_(mutex_);\n\n  // Pops a trace from the per-thread Google Test trace stack.\n  void PopGTestTrace()\n      GTEST_LOCK_EXCLUDED_(mutex_);\n\n  // Protects mutable state in *impl_.  This is mutable as some const\n  // methods need to lock it too.\n  mutable internal::Mutex mutex_;\n\n  // Opaque implementation object.  This field is never changed once\n  // the object is constructed.  We don't mark it as const here, as\n  // doing so will cause a warning in the constructor of UnitTest.\n  // Mutable state in *impl_ is protected by mutex_.\n  internal::UnitTestImpl* impl_;\n\n  // We disallow copying UnitTest.\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);\n};\n\n// A convenient wrapper for adding an environment for the test\n// program.\n//\n// You should call this before RUN_ALL_TESTS() is called, probably in\n// main().  If you use gtest_main, you need to call this before main()\n// starts for it to take effect.  For example, you can define a global\n// variable like this:\n//\n//   testing::Environment* const foo_env =\n//       testing::AddGlobalTestEnvironment(new FooEnvironment);\n//\n// However, we strongly recommend you to write your own main() and\n// call AddGlobalTestEnvironment() there, as relying on initialization\n// of global variables makes the code harder to read and may cause\n// problems when you register multiple environments from different\n// translation units and the environments have dependencies among them\n// (remember that the compiler doesn't guarantee the order in which\n// global variables from different translation units are initialized).\ninline Environment* AddGlobalTestEnvironment(Environment* env) {\n  return UnitTest::GetInstance()->AddEnvironment(env);\n}\n\n// Initializes Google Test.  This must be called before calling\n// RUN_ALL_TESTS().  In particular, it parses a command line for the\n// flags that Google Test recognizes.  Whenever a Google Test flag is\n// seen, it is removed from argv, and *argc is decremented.\n//\n// No value is returned.  Instead, the Google Test flag variables are\n// updated.\n//\n// Calling the function for the second time has no user-visible effect.\nGTEST_API_ void InitGoogleTest(int* argc, char** argv);\n\n// This overloaded version can be used in Windows programs compiled in\n// UNICODE mode.\nGTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);\n\n// This overloaded version can be used on Arduino/embedded platforms where\n// there is no argc/argv.\nGTEST_API_ void InitGoogleTest();\n\nnamespace internal {\n\n// Separate the error generating code from the code path to reduce the stack\n// frame size of CmpHelperEQ. This helps reduce the overhead of some sanitizers\n// when calling EXPECT_* in a tight loop.\ntemplate <typename T1, typename T2>\nAssertionResult CmpHelperEQFailure(const char* lhs_expression,\n                                   const char* rhs_expression,\n                                   const T1& lhs, const T2& rhs) {\n  return EqFailure(lhs_expression,\n                   rhs_expression,\n                   FormatForComparisonFailureMessage(lhs, rhs),\n                   FormatForComparisonFailureMessage(rhs, lhs),\n                   false);\n}\n\n// This block of code defines operator==/!=\n// to block lexical scope lookup.\n// It prevents using invalid operator==/!= defined at namespace scope.\nstruct faketype {};\ninline bool operator==(faketype, faketype) { return true; }\ninline bool operator!=(faketype, faketype) { return false; }\n\n// The helper function for {ASSERT|EXPECT}_EQ.\ntemplate <typename T1, typename T2>\nAssertionResult CmpHelperEQ(const char* lhs_expression,\n                            const char* rhs_expression,\n                            const T1& lhs,\n                            const T2& rhs) {\n  if (lhs == rhs) {\n    return AssertionSuccess();\n  }\n\n  return CmpHelperEQFailure(lhs_expression, rhs_expression, lhs, rhs);\n}\n\nclass EqHelper {\n public:\n  // This templatized version is for the general case.\n  template <\n      typename T1, typename T2,\n      // Disable this overload for cases where one argument is a pointer\n      // and the other is the null pointer constant.\n      typename std::enable_if<!std::is_integral<T1>::value ||\n                              !std::is_pointer<T2>::value>::type* = nullptr>\n  static AssertionResult Compare(const char* lhs_expression,\n                                 const char* rhs_expression, const T1& lhs,\n                                 const T2& rhs) {\n    return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);\n  }\n\n  // With this overloaded version, we allow anonymous enums to be used\n  // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous\n  // enums can be implicitly cast to BiggestInt.\n  //\n  // Even though its body looks the same as the above version, we\n  // cannot merge the two, as it will make anonymous enums unhappy.\n  static AssertionResult Compare(const char* lhs_expression,\n                                 const char* rhs_expression,\n                                 BiggestInt lhs,\n                                 BiggestInt rhs) {\n    return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);\n  }\n\n  template <typename T>\n  static AssertionResult Compare(\n      const char* lhs_expression, const char* rhs_expression,\n      // Handle cases where '0' is used as a null pointer literal.\n      std::nullptr_t /* lhs */, T* rhs) {\n    // We already know that 'lhs' is a null pointer.\n    return CmpHelperEQ(lhs_expression, rhs_expression, static_cast<T*>(nullptr),\n                       rhs);\n  }\n};\n\n// Separate the error generating code from the code path to reduce the stack\n// frame size of CmpHelperOP. This helps reduce the overhead of some sanitizers\n// when calling EXPECT_OP in a tight loop.\ntemplate <typename T1, typename T2>\nAssertionResult CmpHelperOpFailure(const char* expr1, const char* expr2,\n                                   const T1& val1, const T2& val2,\n                                   const char* op) {\n  return AssertionFailure()\n         << \"Expected: (\" << expr1 << \") \" << op << \" (\" << expr2\n         << \"), actual: \" << FormatForComparisonFailureMessage(val1, val2)\n         << \" vs \" << FormatForComparisonFailureMessage(val2, val1);\n}\n\n// A macro for implementing the helper functions needed to implement\n// ASSERT_?? and EXPECT_??.  It is here just to avoid copy-and-paste\n// of similar code.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n\n#define GTEST_IMPL_CMP_HELPER_(op_name, op)\\\ntemplate <typename T1, typename T2>\\\nAssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \\\n                                   const T1& val1, const T2& val2) {\\\n  if (val1 op val2) {\\\n    return AssertionSuccess();\\\n  } else {\\\n    return CmpHelperOpFailure(expr1, expr2, val1, val2, #op);\\\n  }\\\n}\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n\n// Implements the helper function for {ASSERT|EXPECT}_NE\nGTEST_IMPL_CMP_HELPER_(NE, !=)\n// Implements the helper function for {ASSERT|EXPECT}_LE\nGTEST_IMPL_CMP_HELPER_(LE, <=)\n// Implements the helper function for {ASSERT|EXPECT}_LT\nGTEST_IMPL_CMP_HELPER_(LT, <)\n// Implements the helper function for {ASSERT|EXPECT}_GE\nGTEST_IMPL_CMP_HELPER_(GE, >=)\n// Implements the helper function for {ASSERT|EXPECT}_GT\nGTEST_IMPL_CMP_HELPER_(GT, >)\n\n#undef GTEST_IMPL_CMP_HELPER_\n\n// The helper function for {ASSERT|EXPECT}_STREQ.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTREQ(const char* s1_expression,\n                                          const char* s2_expression,\n                                          const char* s1,\n                                          const char* s2);\n\n// The helper function for {ASSERT|EXPECT}_STRCASEEQ.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* s1_expression,\n                                              const char* s2_expression,\n                                              const char* s1,\n                                              const char* s2);\n\n// The helper function for {ASSERT|EXPECT}_STRNE.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,\n                                          const char* s2_expression,\n                                          const char* s1,\n                                          const char* s2);\n\n// The helper function for {ASSERT|EXPECT}_STRCASENE.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,\n                                              const char* s2_expression,\n                                              const char* s1,\n                                              const char* s2);\n\n\n// Helper function for *_STREQ on wide strings.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTREQ(const char* s1_expression,\n                                          const char* s2_expression,\n                                          const wchar_t* s1,\n                                          const wchar_t* s2);\n\n// Helper function for *_STRNE on wide strings.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,\n                                          const char* s2_expression,\n                                          const wchar_t* s1,\n                                          const wchar_t* s2);\n\n}  // namespace internal\n\n// IsSubstring() and IsNotSubstring() are intended to be used as the\n// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by\n// themselves.  They check whether needle is a substring of haystack\n// (NULL is considered a substring of itself only), and return an\n// appropriate error message when they fail.\n//\n// The {needle,haystack}_expr arguments are the stringified\n// expressions that generated the two real arguments.\nGTEST_API_ AssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const char* needle, const char* haystack);\nGTEST_API_ AssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const wchar_t* needle, const wchar_t* haystack);\nGTEST_API_ AssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const char* needle, const char* haystack);\nGTEST_API_ AssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const wchar_t* needle, const wchar_t* haystack);\nGTEST_API_ AssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::string& needle, const ::std::string& haystack);\nGTEST_API_ AssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::string& needle, const ::std::string& haystack);\n\n#if GTEST_HAS_STD_WSTRING\nGTEST_API_ AssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::wstring& needle, const ::std::wstring& haystack);\nGTEST_API_ AssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::wstring& needle, const ::std::wstring& haystack);\n#endif  // GTEST_HAS_STD_WSTRING\n\nnamespace internal {\n\n// Helper template function for comparing floating-points.\n//\n// Template parameter:\n//\n//   RawType: the raw floating-point type (either float or double)\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\ntemplate <typename RawType>\nAssertionResult CmpHelperFloatingPointEQ(const char* lhs_expression,\n                                         const char* rhs_expression,\n                                         RawType lhs_value,\n                                         RawType rhs_value) {\n  const FloatingPoint<RawType> lhs(lhs_value), rhs(rhs_value);\n\n  if (lhs.AlmostEquals(rhs)) {\n    return AssertionSuccess();\n  }\n\n  ::std::stringstream lhs_ss;\n  lhs_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)\n         << lhs_value;\n\n  ::std::stringstream rhs_ss;\n  rhs_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)\n         << rhs_value;\n\n  return EqFailure(lhs_expression,\n                   rhs_expression,\n                   StringStreamToString(&lhs_ss),\n                   StringStreamToString(&rhs_ss),\n                   false);\n}\n\n// Helper function for implementing ASSERT_NEAR.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,\n                                                const char* expr2,\n                                                const char* abs_error_expr,\n                                                double val1,\n                                                double val2,\n                                                double abs_error);\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n// A class that enables one to stream messages to assertion macros\nclass GTEST_API_ AssertHelper {\n public:\n  // Constructor.\n  AssertHelper(TestPartResult::Type type,\n               const char* file,\n               int line,\n               const char* message);\n  ~AssertHelper();\n\n  // Message assignment is a semantic trick to enable assertion\n  // streaming; see the GTEST_MESSAGE_ macro below.\n  void operator=(const Message& message) const;\n\n private:\n  // We put our data in a struct so that the size of the AssertHelper class can\n  // be as small as possible.  This is important because gcc is incapable of\n  // re-using stack space even for temporary variables, so every EXPECT_EQ\n  // reserves stack space for another AssertHelper.\n  struct AssertHelperData {\n    AssertHelperData(TestPartResult::Type t,\n                     const char* srcfile,\n                     int line_num,\n                     const char* msg)\n        : type(t), file(srcfile), line(line_num), message(msg) { }\n\n    TestPartResult::Type const type;\n    const char* const file;\n    int const line;\n    std::string const message;\n\n   private:\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);\n  };\n\n  AssertHelperData* const data_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);\n};\n\n}  // namespace internal\n\n// The pure interface class that all value-parameterized tests inherit from.\n// A value-parameterized class must inherit from both ::testing::Test and\n// ::testing::WithParamInterface. In most cases that just means inheriting\n// from ::testing::TestWithParam, but more complicated test hierarchies\n// may need to inherit from Test and WithParamInterface at different levels.\n//\n// This interface has support for accessing the test parameter value via\n// the GetParam() method.\n//\n// Use it with one of the parameter generator defining functions, like Range(),\n// Values(), ValuesIn(), Bool(), and Combine().\n//\n// class FooTest : public ::testing::TestWithParam<int> {\n//  protected:\n//   FooTest() {\n//     // Can use GetParam() here.\n//   }\n//   ~FooTest() override {\n//     // Can use GetParam() here.\n//   }\n//   void SetUp() override {\n//     // Can use GetParam() here.\n//   }\n//   void TearDown override {\n//     // Can use GetParam() here.\n//   }\n// };\n// TEST_P(FooTest, DoesBar) {\n//   // Can use GetParam() method here.\n//   Foo foo;\n//   ASSERT_TRUE(foo.DoesBar(GetParam()));\n// }\n// INSTANTIATE_TEST_SUITE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));\n\ntemplate <typename T>\nclass WithParamInterface {\n public:\n  typedef T ParamType;\n  virtual ~WithParamInterface() {}\n\n  // The current parameter value. Is also available in the test fixture's\n  // constructor.\n  static const ParamType& GetParam() {\n    GTEST_CHECK_(parameter_ != nullptr)\n        << \"GetParam() can only be called inside a value-parameterized test \"\n        << \"-- did you intend to write TEST_P instead of TEST_F?\";\n    return *parameter_;\n  }\n\n private:\n  // Sets parameter value. The caller is responsible for making sure the value\n  // remains alive and unchanged throughout the current test.\n  static void SetParam(const ParamType* parameter) {\n    parameter_ = parameter;\n  }\n\n  // Static value used for accessing parameter during a test lifetime.\n  static const ParamType* parameter_;\n\n  // TestClass must be a subclass of WithParamInterface<T> and Test.\n  template <class TestClass> friend class internal::ParameterizedTestFactory;\n};\n\ntemplate <typename T>\nconst T* WithParamInterface<T>::parameter_ = nullptr;\n\n// Most value-parameterized classes can ignore the existence of\n// WithParamInterface, and can just inherit from ::testing::TestWithParam.\n\ntemplate <typename T>\nclass TestWithParam : public Test, public WithParamInterface<T> {\n};\n\n// Macros for indicating success/failure in test code.\n\n// Skips test in runtime.\n// Skipping test aborts current function.\n// Skipped tests are neither successful nor failed.\n#define GTEST_SKIP() GTEST_SKIP_(\"\")\n\n// ADD_FAILURE unconditionally adds a failure to the current test.\n// SUCCEED generates a success - it doesn't automatically make the\n// current test successful, as a test is only successful when it has\n// no failure.\n//\n// EXPECT_* verifies that a certain condition is satisfied.  If not,\n// it behaves like ADD_FAILURE.  In particular:\n//\n//   EXPECT_TRUE  verifies that a Boolean condition is true.\n//   EXPECT_FALSE verifies that a Boolean condition is false.\n//\n// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except\n// that they will also abort the current function on failure.  People\n// usually want the fail-fast behavior of FAIL and ASSERT_*, but those\n// writing data-driven tests often find themselves using ADD_FAILURE\n// and EXPECT_* more.\n\n// Generates a nonfatal failure with a generic message.\n#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_(\"Failed\")\n\n// Generates a nonfatal failure at the given source file location with\n// a generic message.\n#define ADD_FAILURE_AT(file, line) \\\n  GTEST_MESSAGE_AT_(file, line, \"Failed\", \\\n                    ::testing::TestPartResult::kNonFatalFailure)\n\n// Generates a fatal failure with a generic message.\n#define GTEST_FAIL() GTEST_FATAL_FAILURE_(\"Failed\")\n\n// Like GTEST_FAIL(), but at the given source file location.\n#define GTEST_FAIL_AT(file, line)         \\\n  GTEST_MESSAGE_AT_(file, line, \"Failed\", \\\n                    ::testing::TestPartResult::kFatalFailure)\n\n// Define this macro to 1 to omit the definition of FAIL(), which is a\n// generic name and clashes with some other libraries.\n#if !GTEST_DONT_DEFINE_FAIL\n# define FAIL() GTEST_FAIL()\n#endif\n\n// Generates a success with a generic message.\n#define GTEST_SUCCEED() GTEST_SUCCESS_(\"Succeeded\")\n\n// Define this macro to 1 to omit the definition of SUCCEED(), which\n// is a generic name and clashes with some other libraries.\n#if !GTEST_DONT_DEFINE_SUCCEED\n# define SUCCEED() GTEST_SUCCEED()\n#endif\n\n// Macros for testing exceptions.\n//\n//    * {ASSERT|EXPECT}_THROW(statement, expected_exception):\n//         Tests that the statement throws the expected exception.\n//    * {ASSERT|EXPECT}_NO_THROW(statement):\n//         Tests that the statement doesn't throw any exception.\n//    * {ASSERT|EXPECT}_ANY_THROW(statement):\n//         Tests that the statement throws an exception.\n\n#define EXPECT_THROW(statement, expected_exception) \\\n  GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_NO_THROW(statement) \\\n  GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_ANY_THROW(statement) \\\n  GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_THROW(statement, expected_exception) \\\n  GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)\n#define ASSERT_NO_THROW(statement) \\\n  GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)\n#define ASSERT_ANY_THROW(statement) \\\n  GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)\n\n// Boolean assertions. Condition can be either a Boolean expression or an\n// AssertionResult. For more information on how to use AssertionResult with\n// these macros see comments on that class.\n#define GTEST_EXPECT_TRUE(condition) \\\n  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \\\n                      GTEST_NONFATAL_FAILURE_)\n#define GTEST_EXPECT_FALSE(condition) \\\n  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \\\n                      GTEST_NONFATAL_FAILURE_)\n#define GTEST_ASSERT_TRUE(condition) \\\n  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \\\n                      GTEST_FATAL_FAILURE_)\n#define GTEST_ASSERT_FALSE(condition) \\\n  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \\\n                      GTEST_FATAL_FAILURE_)\n\n// Define these macros to 1 to omit the definition of the corresponding\n// EXPECT or ASSERT, which clashes with some users' own code.\n\n#if !GTEST_DONT_DEFINE_EXPECT_TRUE\n#define EXPECT_TRUE(condition) GTEST_EXPECT_TRUE(condition)\n#endif\n\n#if !GTEST_DONT_DEFINE_EXPECT_FALSE\n#define EXPECT_FALSE(condition) GTEST_EXPECT_FALSE(condition)\n#endif\n\n#if !GTEST_DONT_DEFINE_ASSERT_TRUE\n#define ASSERT_TRUE(condition) GTEST_ASSERT_TRUE(condition)\n#endif\n\n#if !GTEST_DONT_DEFINE_ASSERT_FALSE\n#define ASSERT_FALSE(condition) GTEST_ASSERT_FALSE(condition)\n#endif\n\n// Macros for testing equalities and inequalities.\n//\n//    * {ASSERT|EXPECT}_EQ(v1, v2): Tests that v1 == v2\n//    * {ASSERT|EXPECT}_NE(v1, v2): Tests that v1 != v2\n//    * {ASSERT|EXPECT}_LT(v1, v2): Tests that v1 < v2\n//    * {ASSERT|EXPECT}_LE(v1, v2): Tests that v1 <= v2\n//    * {ASSERT|EXPECT}_GT(v1, v2): Tests that v1 > v2\n//    * {ASSERT|EXPECT}_GE(v1, v2): Tests that v1 >= v2\n//\n// When they are not, Google Test prints both the tested expressions and\n// their actual values.  The values must be compatible built-in types,\n// or you will get a compiler error.  By \"compatible\" we mean that the\n// values can be compared by the respective operator.\n//\n// Note:\n//\n//   1. It is possible to make a user-defined type work with\n//   {ASSERT|EXPECT}_??(), but that requires overloading the\n//   comparison operators and is thus discouraged by the Google C++\n//   Usage Guide.  Therefore, you are advised to use the\n//   {ASSERT|EXPECT}_TRUE() macro to assert that two objects are\n//   equal.\n//\n//   2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on\n//   pointers (in particular, C strings).  Therefore, if you use it\n//   with two C strings, you are testing how their locations in memory\n//   are related, not how their content is related.  To compare two C\n//   strings by content, use {ASSERT|EXPECT}_STR*().\n//\n//   3. {ASSERT|EXPECT}_EQ(v1, v2) is preferred to\n//   {ASSERT|EXPECT}_TRUE(v1 == v2), as the former tells you\n//   what the actual value is when it fails, and similarly for the\n//   other comparisons.\n//\n//   4. Do not depend on the order in which {ASSERT|EXPECT}_??()\n//   evaluate their arguments, which is undefined.\n//\n//   5. These macros evaluate their arguments exactly once.\n//\n// Examples:\n//\n//   EXPECT_NE(Foo(), 5);\n//   EXPECT_EQ(a_pointer, NULL);\n//   ASSERT_LT(i, array_size);\n//   ASSERT_GT(records.size(), 0) << \"There is no record left.\";\n\n#define EXPECT_EQ(val1, val2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::EqHelper::Compare, val1, val2)\n#define EXPECT_NE(val1, val2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)\n#define EXPECT_LE(val1, val2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)\n#define EXPECT_LT(val1, val2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)\n#define EXPECT_GE(val1, val2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)\n#define EXPECT_GT(val1, val2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)\n\n#define GTEST_ASSERT_EQ(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::EqHelper::Compare, val1, val2)\n#define GTEST_ASSERT_NE(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)\n#define GTEST_ASSERT_LE(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)\n#define GTEST_ASSERT_LT(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)\n#define GTEST_ASSERT_GE(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)\n#define GTEST_ASSERT_GT(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)\n\n// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of\n// ASSERT_XY(), which clashes with some users' own code.\n\n#if !GTEST_DONT_DEFINE_ASSERT_EQ\n# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)\n#endif\n\n#if !GTEST_DONT_DEFINE_ASSERT_NE\n# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)\n#endif\n\n#if !GTEST_DONT_DEFINE_ASSERT_LE\n# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)\n#endif\n\n#if !GTEST_DONT_DEFINE_ASSERT_LT\n# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)\n#endif\n\n#if !GTEST_DONT_DEFINE_ASSERT_GE\n# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)\n#endif\n\n#if !GTEST_DONT_DEFINE_ASSERT_GT\n# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)\n#endif\n\n// C-string Comparisons.  All tests treat NULL and any non-NULL string\n// as different.  Two NULLs are equal.\n//\n//    * {ASSERT|EXPECT}_STREQ(s1, s2):     Tests that s1 == s2\n//    * {ASSERT|EXPECT}_STRNE(s1, s2):     Tests that s1 != s2\n//    * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case\n//    * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case\n//\n// For wide or narrow string objects, you can use the\n// {ASSERT|EXPECT}_??() macros.\n//\n// Don't depend on the order in which the arguments are evaluated,\n// which is undefined.\n//\n// These macros evaluate their arguments exactly once.\n\n#define EXPECT_STREQ(s1, s2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2)\n#define EXPECT_STRNE(s1, s2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)\n#define EXPECT_STRCASEEQ(s1, s2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2)\n#define EXPECT_STRCASENE(s1, s2)\\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)\n\n#define ASSERT_STREQ(s1, s2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2)\n#define ASSERT_STRNE(s1, s2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)\n#define ASSERT_STRCASEEQ(s1, s2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2)\n#define ASSERT_STRCASENE(s1, s2)\\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)\n\n// Macros for comparing floating-point numbers.\n//\n//    * {ASSERT|EXPECT}_FLOAT_EQ(val1, val2):\n//         Tests that two float values are almost equal.\n//    * {ASSERT|EXPECT}_DOUBLE_EQ(val1, val2):\n//         Tests that two double values are almost equal.\n//    * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):\n//         Tests that v1 and v2 are within the given distance to each other.\n//\n// Google Test uses ULP-based comparison to automatically pick a default\n// error bound that is appropriate for the operands.  See the\n// FloatingPoint template class in gtest-internal.h if you are\n// interested in the implementation details.\n\n#define EXPECT_FLOAT_EQ(val1, val2)\\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \\\n                      val1, val2)\n\n#define EXPECT_DOUBLE_EQ(val1, val2)\\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \\\n                      val1, val2)\n\n#define ASSERT_FLOAT_EQ(val1, val2)\\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \\\n                      val1, val2)\n\n#define ASSERT_DOUBLE_EQ(val1, val2)\\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \\\n                      val1, val2)\n\n#define EXPECT_NEAR(val1, val2, abs_error)\\\n  EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \\\n                      val1, val2, abs_error)\n\n#define ASSERT_NEAR(val1, val2, abs_error)\\\n  ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \\\n                      val1, val2, abs_error)\n\n// These predicate format functions work on floating-point values, and\n// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.\n//\n//   EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);\n\n// Asserts that val1 is less than, or almost equal to, val2.  Fails\n// otherwise.  In particular, it fails if either val1 or val2 is NaN.\nGTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,\n                                   float val1, float val2);\nGTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,\n                                    double val1, double val2);\n\n\n#if GTEST_OS_WINDOWS\n\n// Macros that test for HRESULT failure and success, these are only useful\n// on Windows, and rely on Windows SDK macros and APIs to compile.\n//\n//    * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)\n//\n// When expr unexpectedly fails or succeeds, Google Test prints the\n// expected result and the actual result with both a human-readable\n// string representation of the error, if available, as well as the\n// hex result code.\n# define EXPECT_HRESULT_SUCCEEDED(expr) \\\n    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))\n\n# define ASSERT_HRESULT_SUCCEEDED(expr) \\\n    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))\n\n# define EXPECT_HRESULT_FAILED(expr) \\\n    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))\n\n# define ASSERT_HRESULT_FAILED(expr) \\\n    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))\n\n#endif  // GTEST_OS_WINDOWS\n\n// Macros that execute statement and check that it doesn't generate new fatal\n// failures in the current thread.\n//\n//   * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);\n//\n// Examples:\n//\n//   EXPECT_NO_FATAL_FAILURE(Process());\n//   ASSERT_NO_FATAL_FAILURE(Process()) << \"Process() failed\";\n//\n#define ASSERT_NO_FATAL_FAILURE(statement) \\\n    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)\n#define EXPECT_NO_FATAL_FAILURE(statement) \\\n    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)\n\n// Causes a trace (including the given source file path and line number,\n// and the given message) to be included in every test failure message generated\n// by code in the scope of the lifetime of an instance of this class. The effect\n// is undone with the destruction of the instance.\n//\n// The message argument can be anything streamable to std::ostream.\n//\n// Example:\n//   testing::ScopedTrace trace(\"file.cc\", 123, \"message\");\n//\nclass GTEST_API_ ScopedTrace {\n public:\n  // The c'tor pushes the given source file location and message onto\n  // a trace stack maintained by Google Test.\n\n  // Template version. Uses Message() to convert the values into strings.\n  // Slow, but flexible.\n  template <typename T>\n  ScopedTrace(const char* file, int line, const T& message) {\n    PushTrace(file, line, (Message() << message).GetString());\n  }\n\n  // Optimize for some known types.\n  ScopedTrace(const char* file, int line, const char* message) {\n    PushTrace(file, line, message ? message : \"(null)\");\n  }\n\n  ScopedTrace(const char* file, int line, const std::string& message) {\n    PushTrace(file, line, message);\n  }\n\n  // The d'tor pops the info pushed by the c'tor.\n  //\n  // Note that the d'tor is not virtual in order to be efficient.\n  // Don't inherit from ScopedTrace!\n  ~ScopedTrace();\n\n private:\n  void PushTrace(const char* file, int line, std::string message);\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);\n} GTEST_ATTRIBUTE_UNUSED_;  // A ScopedTrace object does its job in its\n                            // c'tor and d'tor.  Therefore it doesn't\n                            // need to be used otherwise.\n\n// Causes a trace (including the source file path, the current line\n// number, and the given message) to be included in every test failure\n// message generated by code in the current scope.  The effect is\n// undone when the control leaves the current scope.\n//\n// The message argument can be anything streamable to std::ostream.\n//\n// In the implementation, we include the current line number as part\n// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s\n// to appear in the same block - as long as they are on different\n// lines.\n//\n// Assuming that each thread maintains its own stack of traces.\n// Therefore, a SCOPED_TRACE() would (correctly) only affect the\n// assertions in its own thread.\n#define SCOPED_TRACE(message) \\\n  ::testing::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\\\n    __FILE__, __LINE__, (message))\n\n// Compile-time assertion for type equality.\n// StaticAssertTypeEq<type1, type2>() compiles if and only if type1 and type2\n// are the same type.  The value it returns is not interesting.\n//\n// Instead of making StaticAssertTypeEq a class template, we make it a\n// function template that invokes a helper class template.  This\n// prevents a user from misusing StaticAssertTypeEq<T1, T2> by\n// defining objects of that type.\n//\n// CAVEAT:\n//\n// When used inside a method of a class template,\n// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is\n// instantiated.  For example, given:\n//\n//   template <typename T> class Foo {\n//    public:\n//     void Bar() { testing::StaticAssertTypeEq<int, T>(); }\n//   };\n//\n// the code:\n//\n//   void Test1() { Foo<bool> foo; }\n//\n// will NOT generate a compiler error, as Foo<bool>::Bar() is never\n// actually instantiated.  Instead, you need:\n//\n//   void Test2() { Foo<bool> foo; foo.Bar(); }\n//\n// to cause a compiler error.\ntemplate <typename T1, typename T2>\nconstexpr bool StaticAssertTypeEq() noexcept {\n  static_assert(std::is_same<T1, T2>::value, \"T1 and T2 are not the same type\");\n  return true;\n}\n\n// Defines a test.\n//\n// The first parameter is the name of the test suite, and the second\n// parameter is the name of the test within the test suite.\n//\n// The convention is to end the test suite name with \"Test\".  For\n// example, a test suite for the Foo class can be named FooTest.\n//\n// Test code should appear between braces after an invocation of\n// this macro.  Example:\n//\n//   TEST(FooTest, InitializesCorrectly) {\n//     Foo foo;\n//     EXPECT_TRUE(foo.StatusIsOK());\n//   }\n\n// Note that we call GetTestTypeId() instead of GetTypeId<\n// ::testing::Test>() here to get the type ID of testing::Test.  This\n// is to work around a suspected linker bug when using Google Test as\n// a framework on Mac OS X.  The bug causes GetTypeId<\n// ::testing::Test>() to return different values depending on whether\n// the call is from the Google Test framework itself or from user test\n// code.  GetTestTypeId() is guaranteed to always return the same\n// value, as it always calls GetTypeId<>() from the Google Test\n// framework.\n#define GTEST_TEST(test_suite_name, test_name)             \\\n  GTEST_TEST_(test_suite_name, test_name, ::testing::Test, \\\n              ::testing::internal::GetTestTypeId())\n\n// Define this macro to 1 to omit the definition of TEST(), which\n// is a generic name and clashes with some other libraries.\n#if !GTEST_DONT_DEFINE_TEST\n#define TEST(test_suite_name, test_name) GTEST_TEST(test_suite_name, test_name)\n#endif\n\n// Defines a test that uses a test fixture.\n//\n// The first parameter is the name of the test fixture class, which\n// also doubles as the test suite name.  The second parameter is the\n// name of the test within the test suite.\n//\n// A test fixture class must be declared earlier.  The user should put\n// the test code between braces after using this macro.  Example:\n//\n//   class FooTest : public testing::Test {\n//    protected:\n//     void SetUp() override { b_.AddElement(3); }\n//\n//     Foo a_;\n//     Foo b_;\n//   };\n//\n//   TEST_F(FooTest, InitializesCorrectly) {\n//     EXPECT_TRUE(a_.StatusIsOK());\n//   }\n//\n//   TEST_F(FooTest, ReturnsElementCountCorrectly) {\n//     EXPECT_EQ(a_.size(), 0);\n//     EXPECT_EQ(b_.size(), 1);\n//   }\n//\n// GOOGLETEST_CM0011 DO NOT DELETE\n#if !GTEST_DONT_DEFINE_TEST\n#define TEST_F(test_fixture, test_name)\\\n  GTEST_TEST_(test_fixture, test_name, test_fixture, \\\n              ::testing::internal::GetTypeId<test_fixture>())\n#endif  // !GTEST_DONT_DEFINE_TEST\n\n// Returns a path to temporary directory.\n// Tries to determine an appropriate directory for the platform.\nGTEST_API_ std::string TempDir();\n\n#ifdef _MSC_VER\n#  pragma warning(pop)\n#endif\n\n// Dynamically registers a test with the framework.\n//\n// This is an advanced API only to be used when the `TEST` macros are\n// insufficient. The macros should be preferred when possible, as they avoid\n// most of the complexity of calling this function.\n//\n// The `factory` argument is a factory callable (move-constructible) object or\n// function pointer that creates a new instance of the Test object. It\n// handles ownership to the caller. The signature of the callable is\n// `Fixture*()`, where `Fixture` is the test fixture class for the test. All\n// tests registered with the same `test_suite_name` must return the same\n// fixture type. This is checked at runtime.\n//\n// The framework will infer the fixture class from the factory and will call\n// the `SetUpTestSuite` and `TearDownTestSuite` for it.\n//\n// Must be called before `RUN_ALL_TESTS()` is invoked, otherwise behavior is\n// undefined.\n//\n// Use case example:\n//\n// class MyFixture : public ::testing::Test {\n//  public:\n//   // All of these optional, just like in regular macro usage.\n//   static void SetUpTestSuite() { ... }\n//   static void TearDownTestSuite() { ... }\n//   void SetUp() override { ... }\n//   void TearDown() override { ... }\n// };\n//\n// class MyTest : public MyFixture {\n//  public:\n//   explicit MyTest(int data) : data_(data) {}\n//   void TestBody() override { ... }\n//\n//  private:\n//   int data_;\n// };\n//\n// void RegisterMyTests(const std::vector<int>& values) {\n//   for (int v : values) {\n//     ::testing::RegisterTest(\n//         \"MyFixture\", (\"Test\" + std::to_string(v)).c_str(), nullptr,\n//         std::to_string(v).c_str(),\n//         __FILE__, __LINE__,\n//         // Important to use the fixture type as the return type here.\n//         [=]() -> MyFixture* { return new MyTest(v); });\n//   }\n// }\n// ...\n// int main(int argc, char** argv) {\n//   std::vector<int> values_to_test = LoadValuesFromConfig();\n//   RegisterMyTests(values_to_test);\n//   ...\n//   return RUN_ALL_TESTS();\n// }\n//\ntemplate <int&... ExplicitParameterBarrier, typename Factory>\nTestInfo* RegisterTest(const char* test_suite_name, const char* test_name,\n                       const char* type_param, const char* value_param,\n                       const char* file, int line, Factory factory) {\n  using TestT = typename std::remove_pointer<decltype(factory())>::type;\n\n  class FactoryImpl : public internal::TestFactoryBase {\n   public:\n    explicit FactoryImpl(Factory f) : factory_(std::move(f)) {}\n    Test* CreateTest() override { return factory_(); }\n\n   private:\n    Factory factory_;\n  };\n\n  return internal::MakeAndRegisterTestInfo(\n      test_suite_name, test_name, type_param, value_param,\n      internal::CodeLocation(file, line), internal::GetTypeId<TestT>(),\n      internal::SuiteApiResolver<TestT>::GetSetUpCaseOrSuite(file, line),\n      internal::SuiteApiResolver<TestT>::GetTearDownCaseOrSuite(file, line),\n      new FactoryImpl{std::move(factory)});\n}\n\n}  // namespace testing\n\n// Use this function in main() to run all tests.  It returns 0 if all\n// tests are successful, or 1 otherwise.\n//\n// RUN_ALL_TESTS() should be invoked after the command line has been\n// parsed by InitGoogleTest().\n//\n// This function was formerly a macro; thus, it is in the global\n// namespace and has an all-caps name.\nint RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_;\n\ninline int RUN_ALL_TESTS() {\n  return ::testing::UnitTest::GetInstance()->Run();\n}\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n#endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_H_\n"
  },
  {
    "path": "examples/libraries/fmt/test/gtest-extra-test.cc",
    "content": "// Formatting library for C++ - tests of custom Google Test assertions\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include \"gtest-extra.h\"\n\n#include <gtest/gtest-spi.h>\n\n#include <cstring>\n#include <memory>\n#include <stdexcept>\n\n#include \"fmt/os.h\"\n#include \"util.h\"\n\n// Tests that assertion macros evaluate their arguments exactly once.\nnamespace {\nclass single_evaluation_test : public ::testing::Test {\n protected:\n  single_evaluation_test() {\n    p_ = s_;\n    a_ = 0;\n    b_ = 0;\n  }\n\n  static const char* const s_;\n  static const char* p_;\n\n  static int a_;\n  static int b_;\n};\n}  // namespace\n\nconst char* const single_evaluation_test::s_ = \"01234\";\nconst char* single_evaluation_test::p_;\nint single_evaluation_test::a_;\nint single_evaluation_test::b_;\n\nvoid do_nothing() {}\n\nFMT_NORETURN void throw_exception() { throw std::runtime_error(\"test\"); }\n\nFMT_NORETURN void throw_system_error() {\n  throw fmt::system_error(EDOM, \"test\");\n}\n\n// Tests that when EXPECT_THROW_MSG fails, it evaluates its message argument\n// exactly once.\nTEST_F(single_evaluation_test, failed_expect_throw_msg) {\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_THROW_MSG(throw_exception(), std::exception, p_++), \"01234\");\n  EXPECT_EQ(s_ + 1, p_);\n}\n\n// Tests that when EXPECT_SYSTEM_ERROR fails, it evaluates its message argument\n// exactly once.\nTEST_F(single_evaluation_test, failed_expect_system_error) {\n  EXPECT_NONFATAL_FAILURE(EXPECT_SYSTEM_ERROR(throw_system_error(), EDOM, p_++),\n                          \"01234\");\n  EXPECT_EQ(s_ + 1, p_);\n}\n\n// Tests that assertion arguments are evaluated exactly once.\nTEST_F(single_evaluation_test, exception_tests) {\n  // successful EXPECT_THROW_MSG\n  EXPECT_THROW_MSG(\n      {  // NOLINT\n        a_++;\n        throw_exception();\n      },\n      std::exception, (b_++, \"test\"));\n  EXPECT_EQ(1, a_);\n  EXPECT_EQ(1, b_);\n\n  // failed EXPECT_THROW_MSG, throws different type\n  EXPECT_NONFATAL_FAILURE(EXPECT_THROW_MSG(\n                              {  // NOLINT\n                                a_++;\n                                throw_exception();\n                              },\n                              std::logic_error, (b_++, \"test\")),\n                          \"throws a different type\");\n  EXPECT_EQ(2, a_);\n  EXPECT_EQ(2, b_);\n\n  // failed EXPECT_THROW_MSG, throws an exception with different message\n  EXPECT_NONFATAL_FAILURE(EXPECT_THROW_MSG(\n                              {  // NOLINT\n                                a_++;\n                                throw_exception();\n                              },\n                              std::exception, (b_++, \"other\")),\n                          \"throws an exception with a different message\");\n  EXPECT_EQ(3, a_);\n  EXPECT_EQ(3, b_);\n\n  // failed EXPECT_THROW_MSG, throws nothing\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_THROW_MSG(a_++, std::exception, (b_++, \"test\")), \"throws nothing\");\n  EXPECT_EQ(4, a_);\n  EXPECT_EQ(4, b_);\n}\n\nTEST_F(single_evaluation_test, system_error_tests) {\n  // successful EXPECT_SYSTEM_ERROR\n  EXPECT_SYSTEM_ERROR(\n      {  // NOLINT\n        a_++;\n        throw_system_error();\n      },\n      EDOM, (b_++, \"test\"));\n  EXPECT_EQ(1, a_);\n  EXPECT_EQ(1, b_);\n\n  // failed EXPECT_SYSTEM_ERROR, throws different type\n  EXPECT_NONFATAL_FAILURE(EXPECT_SYSTEM_ERROR(\n                              {  // NOLINT\n                                a_++;\n                                throw_exception();\n                              },\n                              EDOM, (b_++, \"test\")),\n                          \"throws a different type\");\n  EXPECT_EQ(2, a_);\n  EXPECT_EQ(2, b_);\n\n  // failed EXPECT_SYSTEM_ERROR, throws an exception with different message\n  EXPECT_NONFATAL_FAILURE(EXPECT_SYSTEM_ERROR(\n                              {  // NOLINT\n                                a_++;\n                                throw_system_error();\n                              },\n                              EDOM, (b_++, \"other\")),\n                          \"throws an exception with a different message\");\n  EXPECT_EQ(3, a_);\n  EXPECT_EQ(3, b_);\n\n  // failed EXPECT_SYSTEM_ERROR, throws nothing\n  EXPECT_NONFATAL_FAILURE(EXPECT_SYSTEM_ERROR(a_++, EDOM, (b_++, \"test\")),\n                          \"throws nothing\");\n  EXPECT_EQ(4, a_);\n  EXPECT_EQ(4, b_);\n}\n\n#if FMT_USE_FCNTL\n// Tests that when EXPECT_WRITE fails, it evaluates its message argument\n// exactly once.\nTEST_F(single_evaluation_test, failed_expect_write) {\n  EXPECT_NONFATAL_FAILURE(EXPECT_WRITE(stdout, std::printf(\"test\"), p_++),\n                          \"01234\");\n  EXPECT_EQ(s_ + 1, p_);\n}\n\n// Tests that assertion arguments are evaluated exactly once.\nTEST_F(single_evaluation_test, write_tests) {\n  // successful EXPECT_WRITE\n  EXPECT_WRITE(\n      stdout,\n      {  // NOLINT\n        a_++;\n        std::printf(\"test\");\n      },\n      (b_++, \"test\"));\n  EXPECT_EQ(1, a_);\n  EXPECT_EQ(1, b_);\n\n  // failed EXPECT_WRITE\n  EXPECT_NONFATAL_FAILURE(EXPECT_WRITE(\n                              stdout,\n                              {  // NOLINT\n                                a_++;\n                                std::printf(\"test\");\n                              },\n                              (b_++, \"other\")),\n                          \"Actual: test\");\n  EXPECT_EQ(2, a_);\n  EXPECT_EQ(2, b_);\n}\n\n// Tests EXPECT_WRITE.\nTEST(gtest_extra_test, expect_write) {\n  EXPECT_WRITE(stdout, do_nothing(), \"\");\n  EXPECT_WRITE(stdout, std::printf(\"test\"), \"test\");\n  EXPECT_WRITE(stderr, std::fprintf(stderr, \"test\"), \"test\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_WRITE(stdout, std::printf(\"that\"), \"this\"),\n                          \"Expected: this\\n\"\n                          \"  Actual: that\");\n}\n\nTEST(gtest_extra_test, expect_write_streaming) {\n  EXPECT_WRITE(stdout, std::printf(\"test\"), \"test\") << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_WRITE(stdout, std::printf(\"test\"), \"other\")\n                              << \"expected failure\",\n                          \"expected failure\");\n}\n#endif  // FMT_USE_FCNTL\n\n// Tests that the compiler will not complain about unreachable code in the\n// EXPECT_THROW_MSG macro.\nTEST(gtest_extra_test, expect_throw_no_unreachable_code_warning) {\n  int n = 0;\n  using std::runtime_error;\n  EXPECT_THROW_MSG(throw runtime_error(\"\"), runtime_error, \"\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_THROW_MSG(n++, runtime_error, \"\"), \"\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_THROW_MSG(throw 1, runtime_error, \"\"), \"\");\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_THROW_MSG(throw runtime_error(\"a\"), runtime_error, \"b\"), \"\");\n}\n\n// Tests that the compiler will not complain about unreachable code in the\n// EXPECT_SYSTEM_ERROR macro.\nTEST(gtest_extra_test, expect_system_error_no_unreachable_code_warning) {\n  int n = 0;\n  EXPECT_SYSTEM_ERROR(throw fmt::system_error(EDOM, \"test\"), EDOM, \"test\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_SYSTEM_ERROR(n++, EDOM, \"\"), \"\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_SYSTEM_ERROR(throw 1, EDOM, \"\"), \"\");\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_SYSTEM_ERROR(throw fmt::system_error(EDOM, \"aaa\"), EDOM, \"bbb\"),\n      \"\");\n}\n\nTEST(gtest_extra_test, expect_throw_behaves_like_single_statement) {\n  if (::testing::internal::AlwaysFalse())\n    EXPECT_THROW_MSG(do_nothing(), std::exception, \"\");\n\n  if (::testing::internal::AlwaysTrue())\n    EXPECT_THROW_MSG(throw_exception(), std::exception, \"test\");\n  else\n    do_nothing();\n}\n\nTEST(gtest_extra_test, expect_system_error_behaves_like_single_statement) {\n  if (::testing::internal::AlwaysFalse())\n    EXPECT_SYSTEM_ERROR(do_nothing(), EDOM, \"\");\n\n  if (::testing::internal::AlwaysTrue())\n    EXPECT_SYSTEM_ERROR(throw_system_error(), EDOM, \"test\");\n  else\n    do_nothing();\n}\n\nTEST(gtest_extra_test, expect_write_behaves_like_single_statement) {\n  if (::testing::internal::AlwaysFalse())\n    EXPECT_WRITE(stdout, std::printf(\"x\"), \"x\");\n\n  if (::testing::internal::AlwaysTrue())\n    EXPECT_WRITE(stdout, std::printf(\"x\"), \"x\");\n  else\n    do_nothing();\n}\n\n// Tests EXPECT_THROW_MSG.\nTEST(gtest_extra_test, expect_throw_msg) {\n  EXPECT_THROW_MSG(throw_exception(), std::exception, \"test\");\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_THROW_MSG(throw_exception(), std::logic_error, \"test\"),\n      \"Expected: throw_exception() throws an exception of \"\n      \"type std::logic_error.\\n  Actual: it throws a different type.\");\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_THROW_MSG(do_nothing(), std::exception, \"test\"),\n      \"Expected: do_nothing() throws an exception of type std::exception.\\n\"\n      \"  Actual: it throws nothing.\");\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_THROW_MSG(throw_exception(), std::exception, \"other\"),\n      \"throw_exception() throws an exception with a different message.\\n\"\n      \"Expected: other\\n\"\n      \"  Actual: test\");\n}\n\n// Tests EXPECT_SYSTEM_ERROR.\nTEST(gtest_extra_test, expect_system_error) {\n  EXPECT_SYSTEM_ERROR(throw_system_error(), EDOM, \"test\");\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_SYSTEM_ERROR(throw_exception(), EDOM, \"test\"),\n      \"Expected: throw_exception() throws an exception of \"\n      \"type std::system_error.\\n  Actual: it throws a different type.\");\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_SYSTEM_ERROR(do_nothing(), EDOM, \"test\"),\n      \"Expected: do_nothing() throws an exception of type std::system_error.\\n\"\n      \"  Actual: it throws nothing.\");\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_SYSTEM_ERROR(throw_system_error(), EDOM, \"other\"),\n      fmt::format(\n          \"throw_system_error() throws an exception with a different message.\\n\"\n          \"Expected: {}\\n\"\n          \"  Actual: {}\",\n          system_error_message(EDOM, \"other\"),\n          system_error_message(EDOM, \"test\")));\n}\n\nTEST(gtest_extra_test, expect_throw_msg_streaming) {\n  EXPECT_THROW_MSG(throw_exception(), std::exception, \"test\")\n      << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_THROW_MSG(throw_exception(), std::exception, \"other\")\n          << \"expected failure\",\n      \"expected failure\");\n}\n\nTEST(gtest_extra_test, expect_system_error_streaming) {\n  EXPECT_SYSTEM_ERROR(throw_system_error(), EDOM, \"test\")\n      << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_SYSTEM_ERROR(throw_system_error(), EDOM, \"other\")\n          << \"expected failure\",\n      \"expected failure\");\n}\n\n#if FMT_USE_FCNTL\n\nusing fmt::buffered_file;\nusing fmt::file;\n\nTEST(output_redirect_test, scoped_redirect) {\n  file read_end, write_end;\n  file::pipe(read_end, write_end);\n  {\n    buffered_file file(write_end.fdopen(\"w\"));\n    std::fprintf(file.get(), \"[[[\");\n    {\n      output_redirect redir(file.get());\n      std::fprintf(file.get(), \"censored\");\n    }\n    std::fprintf(file.get(), \"]]]\");\n  }\n  EXPECT_READ(read_end, \"[[[]]]\");\n}\n\n// Test that output_redirect handles errors in flush correctly.\nTEST(output_redirect_test, flush_error_in_ctor) {\n  file read_end, write_end;\n  file::pipe(read_end, write_end);\n  int write_fd = write_end.descriptor();\n  file write_copy = write_end.dup(write_fd);\n  buffered_file f = write_end.fdopen(\"w\");\n  // Put a character in a file buffer.\n  EXPECT_EQ('x', fputc('x', f.get()));\n  FMT_POSIX(close(write_fd));\n  std::unique_ptr<output_redirect> redir{nullptr};\n  EXPECT_SYSTEM_ERROR_NOASSERT(redir.reset(new output_redirect(f.get())), EBADF,\n                               \"cannot flush stream\");\n  redir.reset(nullptr);\n  write_copy.dup2(write_fd);  // \"undo\" close or dtor will fail\n}\n\nTEST(output_redirect_test, dup_error_in_ctor) {\n  buffered_file f = open_buffered_file();\n  int fd = (f.fileno)();\n  file copy = file::dup(fd);\n  FMT_POSIX(close(fd));\n  std::unique_ptr<output_redirect> redir{nullptr};\n  EXPECT_SYSTEM_ERROR_NOASSERT(\n      redir.reset(new output_redirect(f.get())), EBADF,\n      fmt::format(\"cannot duplicate file descriptor {}\", fd));\n  copy.dup2(fd);  // \"undo\" close or dtor will fail\n}\n\nTEST(output_redirect_test, restore_and_read) {\n  file read_end, write_end;\n  file::pipe(read_end, write_end);\n  buffered_file file(write_end.fdopen(\"w\"));\n  std::fprintf(file.get(), \"[[[\");\n  output_redirect redir(file.get());\n  std::fprintf(file.get(), \"censored\");\n  EXPECT_EQ(\"censored\", redir.restore_and_read());\n  EXPECT_EQ(\"\", redir.restore_and_read());\n  std::fprintf(file.get(), \"]]]\");\n  file = buffered_file();\n  EXPECT_READ(read_end, \"[[[]]]\");\n}\n\n// Test that OutputRedirect handles errors in flush correctly.\nTEST(output_redirect_test, flush_error_in_restore_and_read) {\n  file read_end, write_end;\n  file::pipe(read_end, write_end);\n  int write_fd = write_end.descriptor();\n  file write_copy = write_end.dup(write_fd);\n  buffered_file f = write_end.fdopen(\"w\");\n  output_redirect redir(f.get());\n  // Put a character in a file buffer.\n  EXPECT_EQ('x', fputc('x', f.get()));\n  FMT_POSIX(close(write_fd));\n  EXPECT_SYSTEM_ERROR_NOASSERT(redir.restore_and_read(), EBADF,\n                               \"cannot flush stream\");\n  write_copy.dup2(write_fd);  // \"undo\" close or dtor will fail\n}\n\nTEST(output_redirect_test, error_in_dtor) {\n  file read_end, write_end;\n  file::pipe(read_end, write_end);\n  int write_fd = write_end.descriptor();\n  file write_copy = write_end.dup(write_fd);\n  buffered_file f = write_end.fdopen(\"w\");\n  std::unique_ptr<output_redirect> redir(new output_redirect(f.get()));\n  // Put a character in a file buffer.\n  EXPECT_EQ('x', fputc('x', f.get()));\n  EXPECT_WRITE(\n      stderr,\n      {\n        // The close function must be called inside EXPECT_WRITE,\n        // otherwise the system may recycle closed file descriptor when\n        // redirecting the output in EXPECT_STDERR and the second close\n        // will break output redirection.\n        FMT_POSIX(close(write_fd));\n        SUPPRESS_ASSERT(redir.reset(nullptr));\n      },\n      system_error_message(EBADF, \"cannot flush stream\"));\n  write_copy.dup2(write_fd);  // \"undo\" close or dtor of buffered_file will fail\n}\n\n#endif  // FMT_USE_FCNTL\n"
  },
  {
    "path": "examples/libraries/fmt/test/gtest-extra.cc",
    "content": "// Formatting library for C++ - custom Google Test assertions\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include \"gtest-extra.h\"\n\n#if FMT_USE_FCNTL\n\nusing fmt::file;\n\noutput_redirect::output_redirect(FILE* f) : file_(f) {\n  flush();\n  int fd = FMT_POSIX(fileno(f));\n  // Create a file object referring to the original file.\n  original_ = file::dup(fd);\n  // Create a pipe.\n  file write_end;\n  file::pipe(read_end_, write_end);\n  // Connect the passed FILE object to the write end of the pipe.\n  write_end.dup2(fd);\n}\n\noutput_redirect::~output_redirect() FMT_NOEXCEPT {\n  try {\n    restore();\n  } catch (const std::exception& e) {\n    std::fputs(e.what(), stderr);\n  }\n}\n\nvoid output_redirect::flush() {\n  int result = 0;\n  do {\n    result = fflush(file_);\n  } while (result == EOF && errno == EINTR);\n  if (result != 0) throw fmt::system_error(errno, \"cannot flush stream\");\n}\n\nvoid output_redirect::restore() {\n  if (original_.descriptor() == -1) return;  // Already restored.\n  flush();\n  // Restore the original file.\n  original_.dup2(FMT_POSIX(fileno(file_)));\n  original_.close();\n}\n\nstd::string output_redirect::restore_and_read() {\n  // Restore output.\n  restore();\n\n  // Read everything from the pipe.\n  std::string content;\n  if (read_end_.descriptor() == -1) return content;  // Already read.\n  enum { BUFFER_SIZE = 4096 };\n  char buffer[BUFFER_SIZE];\n  size_t count = 0;\n  do {\n    count = read_end_.read(buffer, BUFFER_SIZE);\n    content.append(buffer, count);\n  } while (count != 0);\n  read_end_.close();\n  return content;\n}\n\nstd::string read(file& f, size_t count) {\n  std::string buffer(count, '\\0');\n  size_t n = 0, offset = 0;\n  do {\n    n = f.read(&buffer[offset], count - offset);\n    // We can't read more than size_t bytes since count has type size_t.\n    offset += n;\n  } while (offset < count && n != 0);\n  buffer.resize(offset);\n  return buffer;\n}\n\n#endif  // FMT_USE_FCNTL\n"
  },
  {
    "path": "examples/libraries/fmt/test/gtest-extra.h",
    "content": "// Formatting library for C++ - custom Google Test assertions\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#ifndef FMT_GTEST_EXTRA_H_\n#define FMT_GTEST_EXTRA_H_\n\n#include <stdlib.h>  // _invalid_parameter_handler\n\n#include <string>\n\n#include \"fmt/os.h\"\n#include \"gmock/gmock.h\"\n\n#define FMT_TEST_THROW_(statement, expected_exception, expected_message, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_                                                \\\n  if (::testing::AssertionResult gtest_ar = ::testing::AssertionSuccess()) {   \\\n    std::string gtest_expected_message = expected_message;                     \\\n    bool gtest_caught_expected = false;                                        \\\n    try {                                                                      \\\n      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement);               \\\n    } catch (expected_exception const& e) {                                    \\\n      if (gtest_expected_message != e.what()) {                                \\\n        gtest_ar << #statement                                                 \\\n            \" throws an exception with a different message.\\n\"                 \\\n                 << \"Expected: \" << gtest_expected_message << \"\\n\"             \\\n                 << \"  Actual: \" << e.what();                                  \\\n        goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__);            \\\n      }                                                                        \\\n      gtest_caught_expected = true;                                            \\\n    } catch (...) {                                                            \\\n      gtest_ar << \"Expected: \" #statement                                      \\\n                  \" throws an exception of type \" #expected_exception          \\\n                  \".\\n  Actual: it throws a different type.\";                  \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__);              \\\n    }                                                                          \\\n    if (!gtest_caught_expected) {                                              \\\n      gtest_ar << \"Expected: \" #statement                                      \\\n                  \" throws an exception of type \" #expected_exception          \\\n                  \".\\n  Actual: it throws nothing.\";                           \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__);              \\\n    }                                                                          \\\n  } else                                                                       \\\n    GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__)                      \\\n        : fail(gtest_ar.failure_message())\n\n// Tests that the statement throws the expected exception and the exception's\n// what() method returns expected message.\n#define EXPECT_THROW_MSG(statement, expected_exception, expected_message) \\\n  FMT_TEST_THROW_(statement, expected_exception, expected_message,        \\\n                  GTEST_NONFATAL_FAILURE_)\n\ninline std::string system_error_message(int error_code,\n                                        const std::string& message) {\n  auto ec = std::error_code(error_code, std::generic_category());\n  return std::system_error(ec, message).what();\n}\n\n#define EXPECT_SYSTEM_ERROR(statement, error_code, message) \\\n  EXPECT_THROW_MSG(statement, std::system_error,            \\\n                   system_error_message(error_code, message))\n\n#if FMT_USE_FCNTL\n\n// Captures file output by redirecting it to a pipe.\n// The output it can handle is limited by the pipe capacity.\nclass output_redirect {\n private:\n  FILE* file_;\n  fmt::file original_;  // Original file passed to redirector.\n  fmt::file read_end_;  // Read end of the pipe where the output is redirected.\n\n  void flush();\n  void restore();\n\n public:\n  explicit output_redirect(FILE* file);\n  ~output_redirect() FMT_NOEXCEPT;\n\n  output_redirect(const output_redirect&) = delete;\n  void operator=(const output_redirect&) = delete;\n\n  // Restores the original file, reads output from the pipe into a string\n  // and returns it.\n  std::string restore_and_read();\n};\n\n#  define FMT_TEST_WRITE_(statement, expected_output, file, fail)              \\\n    GTEST_AMBIGUOUS_ELSE_BLOCKER_                                              \\\n    if (::testing::AssertionResult gtest_ar = ::testing::AssertionSuccess()) { \\\n      std::string gtest_expected_output = expected_output;                     \\\n      output_redirect gtest_redir(file);                                       \\\n      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement);               \\\n      std::string gtest_output = gtest_redir.restore_and_read();               \\\n      if (gtest_output != gtest_expected_output) {                             \\\n        gtest_ar << #statement \" produces different output.\\n\"                 \\\n                 << \"Expected: \" << gtest_expected_output << \"\\n\"              \\\n                 << \"  Actual: \" << gtest_output;                              \\\n        goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__);            \\\n      }                                                                        \\\n    } else                                                                     \\\n      GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__)                    \\\n          : fail(gtest_ar.failure_message())\n\n// Tests that the statement writes the expected output to file.\n#  define EXPECT_WRITE(file, statement, expected_output) \\\n    FMT_TEST_WRITE_(statement, expected_output, file, GTEST_NONFATAL_FAILURE_)\n\n#  ifdef _MSC_VER\n\n// Suppresses Windows assertions on invalid file descriptors, making\n// POSIX functions return proper error codes instead of crashing on Windows.\nclass suppress_assert {\n private:\n  _invalid_parameter_handler original_handler_;\n  int original_report_mode_;\n\n  static void handle_invalid_parameter(const wchar_t*, const wchar_t*,\n                                       const wchar_t*, unsigned, uintptr_t) {}\n\n public:\n  suppress_assert()\n      : original_handler_(\n            _set_invalid_parameter_handler(handle_invalid_parameter)),\n        original_report_mode_(_CrtSetReportMode(_CRT_ASSERT, 0)) {}\n  ~suppress_assert() {\n    _set_invalid_parameter_handler(original_handler_);\n    _CrtSetReportMode(_CRT_ASSERT, original_report_mode_);\n  }\n};\n\n#    define SUPPRESS_ASSERT(statement) \\\n      {                                \\\n        suppress_assert sa;            \\\n        statement;                     \\\n      }\n#  else\n#    define SUPPRESS_ASSERT(statement) statement\n#  endif  // _MSC_VER\n\n#  define EXPECT_SYSTEM_ERROR_NOASSERT(statement, error_code, message) \\\n    EXPECT_SYSTEM_ERROR(SUPPRESS_ASSERT(statement), error_code, message)\n\n// Attempts to read count characters from a file.\nstd::string read(fmt::file& f, size_t count);\n\n#  define EXPECT_READ(file, expected_content) \\\n    EXPECT_EQ(expected_content,               \\\n              read(file, fmt::string_view(expected_content).size()))\n\n#else\n#  define EXPECT_WRITE(file, statement, expected_output) \\\n    do {                                                 \\\n      (void)(file);                                      \\\n      (void)(statement);                                 \\\n      (void)(expected_output);                           \\\n      SUCCEED();                                         \\\n    } while (false)\n#endif  // FMT_USE_FCNTL\n\n#endif  // FMT_GTEST_EXTRA_H_\n"
  },
  {
    "path": "examples/libraries/fmt/test/header-only-test.cc",
    "content": "// Header-only configuration test\n\n#include \"fmt/core.h\"\n\n#ifndef FMT_HEADER_ONLY\n#  error \"Not in the header-only mode.\"\n#endif\n"
  },
  {
    "path": "examples/libraries/fmt/test/mock-allocator.h",
    "content": "// Formatting library for C++ - mock allocator\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#ifndef FMT_MOCK_ALLOCATOR_H_\n#define FMT_MOCK_ALLOCATOR_H_\n\n#include <assert.h>  // assert\n#include <stddef.h>  // size_t\n\n#include <memory>  // std::allocator_traits\n\n#include \"gmock/gmock.h\"\n\ntemplate <typename T> class mock_allocator {\n public:\n  mock_allocator() {}\n  mock_allocator(const mock_allocator&) {}\n  using value_type = T;\n  MOCK_METHOD1_T(allocate, T*(size_t n));\n  MOCK_METHOD2_T(deallocate, void(T* p, size_t n));\n};\n\ntemplate <typename Allocator> class allocator_ref {\n private:\n  Allocator* alloc_;\n\n  void move(allocator_ref& other) {\n    alloc_ = other.alloc_;\n    other.alloc_ = nullptr;\n  }\n\n public:\n  using value_type = typename Allocator::value_type;\n\n  explicit allocator_ref(Allocator* alloc = nullptr) : alloc_(alloc) {}\n\n  allocator_ref(const allocator_ref& other) : alloc_(other.alloc_) {}\n  allocator_ref(allocator_ref&& other) { move(other); }\n\n  allocator_ref& operator=(allocator_ref&& other) {\n    assert(this != &other);\n    move(other);\n    return *this;\n  }\n\n  allocator_ref& operator=(const allocator_ref& other) {\n    alloc_ = other.alloc_;\n    return *this;\n  }\n\n public:\n  Allocator* get() const { return alloc_; }\n\n  value_type* allocate(size_t n) {\n    return std::allocator_traits<Allocator>::allocate(*alloc_, n);\n  }\n  void deallocate(value_type* p, size_t n) { alloc_->deallocate(p, n); }\n};\n\n#endif  // FMT_MOCK_ALLOCATOR_H_\n"
  },
  {
    "path": "examples/libraries/fmt/test/module-test.cc",
    "content": "// Formatting library for C++ - module tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n//\n// Copyright (c) 2021 - present, Daniela Engert\n// All Rights Reserved\n// {fmt} module.\n\n#ifdef _MSC_FULL_VER\n// hide some implementation bugs in msvc\n// that are not essential to users of the module.\n#  define FMT_HIDE_MODULE_BUGS\n#endif\n\n#include <bit>\n#include <chrono>\n#include <exception>\n#include <iterator>\n#include <locale>\n#include <memory>\n#include <ostream>\n#include <string>\n#include <string_view>\n#include <system_error>\n\n#if (__has_include(<fcntl.h>) || defined(__APPLE__) || \\\n     defined(__linux__)) &&                              \\\n    (!defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP))\n#  include <fcntl.h>\n#  define FMT_USE_FCNTL 1\n#else\n#  define FMT_USE_FCNTL 0\n#endif\n#define FMT_NOEXCEPT noexcept\n#if defined(_WIN32) && !defined(__MINGW32__)\n#  define FMT_POSIX(call) _##call\n#else\n#  define FMT_POSIX(call) call\n#endif\n#define FMT_OS_H_  // don't pull in os.h directly or indirectly\n\nimport fmt;\n\n// check for macros leaking from BMI\nstatic bool macro_leaked =\n#if defined(FMT_CORE_H_) || defined(FMT_FORMAT_H_)\n    true;\n#else\n    false;\n#endif\n\n// Include sources to pick up functions and classes from the module rather than\n// from the non-modular library which is baked into the 'test-main' library.\n// This averts linker problems:\n// - strong ownership model: missing linker symbols\n// - weak ownership model: duplicate linker symbols\n#include \"gtest-extra.cc\"\n#include \"util.cc\"\n\n// an implicitly exported namespace must be visible [module.interface]/2.2\nTEST(module_test, namespace) {\n  using namespace fmt;\n  using namespace fmt::literals;\n  ASSERT_TRUE(true);\n}\n\nnamespace detail {\nbool oops_detail_namespace_is_visible;\n}\n\nnamespace fmt {\nbool namespace_detail_invisible() {\n#if defined(FMT_HIDE_MODULE_BUGS) && defined(_MSC_FULL_VER) && \\\n    _MSC_FULL_VER <= 192930129\n  // bug in msvc up to 16.11-pre1:\n  // the namespace is visible even when it is neither\n  // implicitly nor explicitly exported\n  return true;\n#else\n  using namespace detail;\n  // this fails to compile if fmt::detail is visible\n  return !oops_detail_namespace_is_visible;\n#endif\n}\n}  // namespace fmt\n\n// the non-exported namespace 'detail' must be invisible [module.interface]/2\nTEST(module_test, detail_namespace) {\n  EXPECT_TRUE(fmt::namespace_detail_invisible());\n}\n\n// macros must not be imported from a *named* module  [cpp.import]/5.1\nTEST(module_test, macros) {\n#if defined(FMT_HIDE_MODULE_BUGS) && defined(_MSC_FULL_VER) && \\\n    _MSC_FULL_VER <= 192930129\n  // bug in msvc up to 16.11-pre1:\n  // include-guard macros leak from BMI\n  // and even worse: they cannot be #undef-ined\n  macro_leaked = false;\n#endif\n  EXPECT_FALSE(macro_leaked);\n}\n\n// The following is less about functional testing (that's done elsewhere)\n// but rather visibility of all client-facing overloads, reachability of\n// non-exported entities, name lookup and overload resolution within\n// template instantitions.\n// Excercise all exported entities of the API at least once.\n// Instantiate as many code paths as possible.\n\nTEST(module_test, to_string) {\n  EXPECT_EQ(\"42\", fmt::to_string(42));\n  EXPECT_EQ(\"42\", fmt::to_string(42.0));\n\n  EXPECT_EQ(L\"42\", fmt::to_wstring(42));\n  EXPECT_EQ(L\"42\", fmt::to_wstring(42.0));\n}\n\nTEST(module_test, format) {\n  EXPECT_EQ(\"42\", fmt::format(\"{:}\", 42));\n  EXPECT_EQ(\"-42\", fmt::format(\"{0}\", -42.0));\n\n  EXPECT_EQ(L\"42\", fmt::format(L\"{:}\", 42));\n  EXPECT_EQ(L\"-42\", fmt::format(L\"{0}\", -42.0));\n}\n\nTEST(module_test, format_to) {\n  std::string s;\n  fmt::format_to(std::back_inserter(s), \"{}\", 42);\n  EXPECT_EQ(\"42\", s);\n\n  char buffer[4] = {0};\n  fmt::format_to(buffer, \"{}\", 42);\n  EXPECT_EQ(\"42\", std::string_view(buffer));\n\n  fmt::memory_buffer mb;\n  fmt::format_to(mb, \"{}\", 42);\n  EXPECT_EQ(\"42\", std::string_view(buffer));\n\n  std::wstring w;\n  fmt::format_to(std::back_inserter(w), L\"{}\", 42);\n  EXPECT_EQ(L\"42\", w);\n\n  wchar_t wbuffer[4] = {0};\n  fmt::format_to(wbuffer, L\"{}\", 42);\n  EXPECT_EQ(L\"42\", std::wstring_view(wbuffer));\n\n  fmt::wmemory_buffer wb;\n  fmt::format_to(wb, L\"{}\", 42);\n  EXPECT_EQ(L\"42\", std::wstring_view(wbuffer));\n}\n\nTEST(module_test, formatted_size) {\n  EXPECT_EQ(2u, fmt::formatted_size(\"{}\", 42));\n  EXPECT_EQ(2u, fmt::formatted_size(L\"{}\", 42));\n}\n\nTEST(module_test, format_to_n) {\n  std::string s;\n  auto result = fmt::format_to_n(std::back_inserter(s), 1, \"{}\", 42);\n  EXPECT_EQ(2u, result.size);\n  char buffer[4] = {0};\n  fmt::format_to_n(buffer, 3, \"{}\", 12345);\n\n  std::wstring w;\n  auto wresult = fmt::format_to_n(std::back_inserter(w), 1, L\"{}\", 42);\n  EXPECT_EQ(2u, wresult.size);\n  wchar_t wbuffer[4] = {0};\n  fmt::format_to_n(wbuffer, 3, L\"{}\", 12345);\n}\n\nTEST(module_test, format_args) {\n  auto no_args = fmt::format_args();\n  EXPECT_FALSE(no_args.get(1));\n\n  fmt::basic_format_args args = fmt::make_format_args(42);\n  EXPECT_TRUE(args.max_size() > 0);\n  auto arg0 = args.get(0);\n  EXPECT_TRUE(arg0);\n  decltype(arg0) arg_none;\n  EXPECT_FALSE(arg_none);\n  EXPECT_TRUE(arg0.type() != arg_none.type());\n}\n\nTEST(module_test, wformat_args) {\n  auto no_args = fmt::wformat_args();\n  EXPECT_FALSE(no_args.get(1));\n  fmt::basic_format_args args = fmt::make_wformat_args(42);\n  EXPECT_TRUE(args.get(0));\n}\n\nTEST(module_test, checked_format_args) {\n  fmt::basic_format_args args = fmt::make_args_checked<int>(\"{}\", 42);\n  EXPECT_TRUE(args.get(0));\n  fmt::basic_format_args wargs = fmt::make_args_checked<int>(L\"{}\", 42);\n  EXPECT_TRUE(wargs.get(0));\n}\n\nTEST(module_test, dynamic_format_args) {\n  fmt::dynamic_format_arg_store<fmt::format_context> dyn_store;\n  dyn_store.push_back(fmt::arg(\"a42\", 42));\n  fmt::basic_format_args args = dyn_store;\n  EXPECT_FALSE(args.get(3));\n  EXPECT_TRUE(args.get(fmt::string_view(\"a42\")));\n\n  fmt::dynamic_format_arg_store<fmt::wformat_context> wdyn_store;\n  wdyn_store.push_back(fmt::arg(L\"a42\", 42));\n  fmt::basic_format_args wargs = wdyn_store;\n  EXPECT_FALSE(wargs.get(3));\n  EXPECT_TRUE(wargs.get(fmt::wstring_view(L\"a42\")));\n}\n\nTEST(module_test, vformat) {\n  EXPECT_EQ(\"42\", fmt::vformat(\"{}\", fmt::make_format_args(42)));\n  EXPECT_EQ(L\"42\", fmt::vformat(fmt::to_string_view(L\"{}\"),\n                                fmt::make_wformat_args(42)));\n}\n\nTEST(module_test, vformat_to) {\n  auto store = fmt::make_format_args(42);\n  std::string s;\n  fmt::vformat_to(std::back_inserter(s), \"{}\", store);\n  EXPECT_EQ(\"42\", s);\n\n  char buffer[4] = {0};\n  fmt::vformat_to(buffer, \"{:}\", store);\n  EXPECT_EQ(\"42\", std::string_view(buffer));\n\n  auto wstore = fmt::make_wformat_args(42);\n  std::wstring w;\n  fmt::vformat_to(std::back_inserter(w), L\"{}\", wstore);\n  EXPECT_EQ(L\"42\", w);\n\n  wchar_t wbuffer[4] = {0};\n  fmt::vformat_to(wbuffer, L\"{:}\", wstore);\n  EXPECT_EQ(L\"42\", std::wstring_view(wbuffer));\n}\n\nTEST(module_test, vformat_to_n) {\n  auto store = fmt::make_format_args(12345);\n  std::string s;\n  auto result = fmt::vformat_to_n(std::back_inserter(s), 1, \"{}\", store);\n  char buffer[4] = {0};\n  fmt::vformat_to_n(buffer, 3, \"{:}\", store);\n\n  auto wstore = fmt::make_wformat_args(12345);\n  std::wstring w;\n  auto wresult = fmt::vformat_to_n(std::back_inserter(w), 1,\n                                   fmt::to_string_view(L\"{}\"), wstore);\n  wchar_t wbuffer[4] = {0};\n  fmt::vformat_to_n(wbuffer, 3, fmt::to_string_view(L\"{:}\"), wstore);\n}\n\nstd::string as_string(std::wstring_view text) {\n  return {reinterpret_cast<const char*>(text.data()),\n          text.size() * sizeof(text[0])};\n}\n\nTEST(module_test, print) {\n  EXPECT_WRITE(stdout, fmt::print(\"{}µ\", 42), \"42µ\");\n  EXPECT_WRITE(stderr, fmt::print(stderr, \"{}µ\", 4.2), \"4.2µ\");\n  if (false) {\n    EXPECT_WRITE(stdout, fmt::print(L\"{}µ\", 42), as_string(L\"42µ\"));\n    EXPECT_WRITE(stderr, fmt::print(stderr, L\"{}µ\", 4.2), as_string(L\"4.2µ\"));\n  }\n}\n\nTEST(module_test, vprint) {\n  EXPECT_WRITE(stdout, fmt::vprint(\"{:}µ\", fmt::make_format_args(42)), \"42µ\");\n  EXPECT_WRITE(stderr, fmt::vprint(stderr, \"{}\", fmt::make_format_args(4.2)),\n               \"4.2\");\n  if (false) {\n    EXPECT_WRITE(stdout, fmt::vprint(L\"{:}µ\", fmt::make_wformat_args(42)),\n                 as_string(L\"42µ\"));\n    EXPECT_WRITE(stderr, fmt::vprint(stderr, L\"{}\", fmt::make_wformat_args(42)),\n                 as_string(L\"42\"));\n  }\n}\n\nTEST(module_test, named_args) {\n  EXPECT_EQ(\"42\", fmt::format(\"{answer}\", fmt::arg(\"answer\", 42)));\n  EXPECT_EQ(L\"42\", fmt::format(L\"{answer}\", fmt::arg(L\"answer\", 42)));\n}\n\nTEST(module_test, literals) {\n  using namespace fmt::literals;\n  EXPECT_EQ(\"42\", fmt::format(\"{answer}\", \"answer\"_a = 42));\n  EXPECT_EQ(\"42\", \"{}\"_format(42));\n  EXPECT_EQ(L\"42\", fmt::format(L\"{answer}\", L\"answer\"_a = 42));\n  EXPECT_EQ(L\"42\", L\"{}\"_format(42));\n}\n\nTEST(module_test, locale) {\n  auto store = fmt::make_format_args(4.2);\n  const auto classic = std::locale::classic();\n  EXPECT_EQ(\"4.2\", fmt::format(classic, \"{:L}\", 4.2));\n  EXPECT_EQ(\"4.2\", fmt::vformat(classic, \"{:L}\", store));\n  std::string s;\n  fmt::vformat_to(std::back_inserter(s), classic, \"{:L}\", store);\n  EXPECT_EQ(\"4.2\", s);\n  EXPECT_EQ(\"4.2\", fmt::format(\"{:L}\", 4.2));\n\n  auto wstore = fmt::make_wformat_args(4.2);\n  EXPECT_EQ(L\"4.2\", fmt::format(classic, L\"{:L}\", 4.2));\n  EXPECT_EQ(L\"4.2\", fmt::vformat(classic, L\"{:L}\", wstore));\n  std::wstring w;\n  fmt::vformat_to(std::back_inserter(w), classic, L\"{:L}\", wstore);\n  EXPECT_EQ(L\"4.2\", w);\n  EXPECT_EQ(L\"4.2\", fmt::format(L\"{:L}\", 4.2));\n}\n\nTEST(module_test, string_view) {\n  fmt::string_view nsv(\"fmt\");\n  EXPECT_EQ(\"fmt\", nsv);\n  EXPECT_TRUE(fmt::string_view(\"fmt\") == nsv);\n\n  fmt::wstring_view wsv(L\"fmt\");\n  EXPECT_EQ(L\"fmt\", wsv);\n  EXPECT_TRUE(fmt::wstring_view(L\"fmt\") == wsv);\n}\n\nTEST(module_test, memory_buffer) {\n  fmt::basic_memory_buffer<char, fmt::inline_buffer_size> buffer;\n  fmt::format_to(buffer, \"{}\", \"42\");\n  EXPECT_EQ(\"42\", to_string(buffer));\n  fmt::memory_buffer nbuffer(std::move(buffer));\n  EXPECT_EQ(\"42\", to_string(nbuffer));\n  buffer = std::move(nbuffer);\n  EXPECT_EQ(\"42\", to_string(buffer));\n  nbuffer.clear();\n  EXPECT_EQ(0u, to_string(nbuffer).size());\n\n  fmt::wmemory_buffer wbuffer;\n  EXPECT_EQ(0u, to_string(wbuffer).size());\n}\n\nTEST(module_test, is_char) {\n  EXPECT_TRUE(fmt::is_char<char>());\n  EXPECT_TRUE(fmt::is_char<wchar_t>());\n  EXPECT_TRUE(fmt::is_char<char8_t>());\n  EXPECT_TRUE(fmt::is_char<char16_t>());\n  EXPECT_TRUE(fmt::is_char<char32_t>());\n  EXPECT_FALSE(fmt::is_char<signed char>());\n}\n\nTEST(module_test, ptr) {\n  uintptr_t answer = 42;\n  auto p = std::bit_cast<int*>(answer);\n  EXPECT_EQ(\"0x2a\", fmt::to_string(fmt::ptr(p)));\n  std::unique_ptr<int> up(p);\n  EXPECT_EQ(\"0x2a\", fmt::to_string(fmt::ptr(up)));\n  up.release();\n  auto sp = std::make_shared<int>(0);\n  p = sp.get();\n  EXPECT_EQ(fmt::to_string(fmt::ptr(p)), fmt::to_string(fmt::ptr(sp)));\n}\n\nTEST(module_test, errors) {\n  auto store = fmt::make_format_args(42);\n  EXPECT_THROW(throw fmt::format_error(\"oops\"), std::exception);\n  EXPECT_THROW(throw fmt::vsystem_error(0, \"{}\", store), std::system_error);\n  EXPECT_THROW(throw fmt::system_error(0, \"{}\", 42), std::system_error);\n\n  fmt::memory_buffer buffer;\n  fmt::format_system_error(buffer, 0, \"oops\");\n  auto oops = to_string(buffer);\n  EXPECT_TRUE(oops.size() > 0);\n  EXPECT_WRITE(stderr, fmt::report_system_error(0, \"oops\"), oops + '\\n');\n\n#ifdef _WIN32\n  EXPECT_THROW(throw fmt::vwindows_error(0, \"{}\", store), std::system_error);\n  EXPECT_THROW(throw fmt::windows_error(0, \"{}\", 42), std::system_error);\n  output_redirect redirect(stderr);\n  fmt::report_windows_error(0, \"oops\");\n  EXPECT_TRUE(redirect.restore_and_read().size() > 0);\n#endif\n}\n\nTEST(module_test, error_code) {\n  EXPECT_EQ(\"generic:42\",\n            fmt::format(\"{0}\", std::error_code(42, std::generic_category())));\n  EXPECT_EQ(\"system:42\",\n            fmt::format(\"{0}\", std::error_code(42, fmt::system_category())));\n  EXPECT_EQ(L\"generic:42\",\n            fmt::format(L\"{0}\", std::error_code(42, std::generic_category())));\n}\n\nTEST(module_test, format_int) {\n  fmt::format_int sanswer(42);\n  EXPECT_EQ(\"42\", fmt::string_view(sanswer.data(), sanswer.size()));\n  fmt::format_int uanswer(42u);\n  EXPECT_EQ(\"42\", fmt::string_view(uanswer.data(), uanswer.size()));\n}\n\nstruct test_formatter : fmt::formatter<char> {\n  bool check() { return true; }\n};\n\nstruct test_dynamic_formatter : fmt::dynamic_formatter<> {\n  bool check() { return true; }\n};\n\nTEST(module_test, formatter) {\n  EXPECT_TRUE(test_formatter{}.check());\n  EXPECT_TRUE(test_dynamic_formatter{}.check());\n}\n\nTEST(module_test, join) {\n  int arr[3] = {1, 2, 3};\n  std::vector<double> vec{1.0, 2.0, 3.0};\n  std::initializer_list<int> il{1, 2, 3};\n  auto sep = fmt::to_string_view(\", \");\n  EXPECT_EQ(\"1, 2, 3\", to_string(fmt::join(arr + 0, arr + 3, sep)));\n  EXPECT_EQ(\"1, 2, 3\", to_string(fmt::join(arr, sep)));\n  EXPECT_EQ(\"1, 2, 3\", to_string(fmt::join(vec.begin(), vec.end(), sep)));\n  EXPECT_EQ(\"1, 2, 3\", to_string(fmt::join(vec, sep)));\n  EXPECT_EQ(\"1, 2, 3\", to_string(fmt::join(il, sep)));\n\n  auto wsep = fmt::to_string_view(L\", \");\n  EXPECT_EQ(L\"1, 2, 3\", fmt::format(L\"{}\", fmt::join(arr + 0, arr + 3, wsep)));\n  EXPECT_EQ(L\"1, 2, 3\", fmt::format(L\"{}\", fmt::join(arr, wsep)));\n  EXPECT_EQ(L\"1, 2, 3\", fmt::format(L\"{}\", fmt::join(il, wsep)));\n}\n\nTEST(module_test, time) {\n  auto time_now = std::time(nullptr);\n  EXPECT_TRUE(fmt::localtime(time_now).tm_year > 120);\n  EXPECT_TRUE(fmt::gmtime(time_now).tm_year > 120);\n  auto chrono_now = std::chrono::system_clock::now();\n  EXPECT_TRUE(fmt::localtime(chrono_now).tm_year > 120);\n  EXPECT_TRUE(fmt::gmtime(chrono_now).tm_year > 120);\n}\n\nTEST(module_test, time_point) {\n  auto now = std::chrono::system_clock::now();\n  std::string_view past(\"2021-05-20 10:30:15\");\n  EXPECT_TRUE(past < fmt::format(\"{:%Y-%m-%d %H:%M:%S}\", now));\n  std::wstring_view wpast(L\"2021-05-20 10:30:15\");\n  EXPECT_TRUE(wpast < fmt::format(L\"{:%Y-%m-%d %H:%M:%S}\", now));\n}\n\nTEST(module_test, time_duration) {\n  using us = std::chrono::duration<double, std::micro>;\n  EXPECT_EQ(\"42s\", fmt::format(\"{}\", std::chrono::seconds{42}));\n  EXPECT_EQ(\"4.2µs\", fmt::format(\"{:3.1}\", us{4.234}));\n  EXPECT_EQ(\"4.2µs\", fmt::format(std::locale::classic(), \"{:L}\", us{4.2}));\n\n  EXPECT_EQ(L\"42s\", fmt::format(L\"{}\", std::chrono::seconds{42}));\n  EXPECT_EQ(L\"4.2µs\", fmt::format(L\"{:3.1}\", us{4.234}));\n  EXPECT_EQ(L\"4.2µs\", fmt::format(std::locale::classic(), L\"{:L}\", us{4.2}));\n}\n\nTEST(module_test, weekday) {\n  EXPECT_EQ(\"Monday\",\n            std::format(std::locale::classic(), \"{:%A}\", fmt::weekday(1)));\n}\n\nTEST(module_test, to_string_view) {\n  using fmt::to_string_view;\n  fmt::string_view nsv{to_string_view(\"42\")};\n  EXPECT_EQ(\"42\", nsv);\n  fmt::wstring_view wsv{to_string_view(L\"42\")};\n  EXPECT_EQ(L\"42\", wsv);\n}\n\nTEST(module_test, printf) {\n  EXPECT_WRITE(stdout, fmt::printf(\"%f\", 42.123456), \"42.123456\");\n  EXPECT_WRITE(stdout, fmt::printf(\"%d\", 42), \"42\");\n  if (false) {\n    EXPECT_WRITE(stdout, fmt::printf(L\"%f\", 42.123456),\n                 as_string(L\"42.123456\"));\n    EXPECT_WRITE(stdout, fmt::printf(L\"%d\", 42), as_string(L\"42\"));\n  }\n}\n\nTEST(module_test, fprintf) {\n  EXPECT_WRITE(stderr, fmt::fprintf(stderr, \"%d\", 42), \"42\");\n  std::ostringstream os;\n  fmt::fprintf(os, \"%s\", \"bla\");\n  EXPECT_EQ(\"bla\", os.str());\n\n  EXPECT_WRITE(stderr, fmt::fprintf(stderr, L\"%d\", 42), as_string(L\"42\"));\n  std::wostringstream ws;\n  fmt::fprintf(ws, L\"%s\", L\"bla\");\n  EXPECT_EQ(L\"bla\", ws.str());\n}\n\nTEST(module_test, sprintf) {\n  EXPECT_EQ(\"42\", fmt::sprintf(\"%d\", 42));\n  EXPECT_EQ(L\"42\", fmt::sprintf(L\"%d\", 42));\n}\n\nTEST(module_test, vprintf) {\n  EXPECT_WRITE(stdout, fmt::vprintf(\"%d\", fmt::make_printf_args(42)), \"42\");\n  if (false) {\n    EXPECT_WRITE(stdout, fmt::vprintf(L\"%d\", fmt::make_wprintf_args(42)),\n                 as_string(L\"42\"));\n  }\n}\n\nTEST(module_test, vfprintf) {\n  auto args = fmt::make_printf_args(42);\n  EXPECT_WRITE(stderr, fmt::vfprintf(stderr, \"%d\", args), \"42\");\n  std::ostringstream os;\n  fmt::vfprintf(os, \"%d\", args);\n  EXPECT_EQ(\"42\", os.str());\n  auto wargs = fmt::make_wprintf_args(42);\n  if (false) {\n    EXPECT_WRITE(stderr, fmt::vfprintf(stderr, L\"%d\", wargs), as_string(L\"42\"));\n  }\n  std::wostringstream ws;\n  fmt::vfprintf(ws, L\"%d\", wargs);\n  EXPECT_EQ(L\"42\", ws.str());\n}\n\nTEST(module_test, vsprintf) {\n  EXPECT_EQ(\"42\", fmt::vsprintf(\"%d\", fmt::make_printf_args(42)));\n  EXPECT_EQ(L\"42\", fmt::vsprintf(L\"%d\", fmt::make_wprintf_args(42)));\n}\n\nTEST(module_test, color) {\n  auto fg_check = fg(fmt::rgb(255, 200, 30));\n  auto bg_check = bg(fmt::color::dark_slate_gray) | fmt::emphasis::italic;\n  auto emphasis_check = fmt::emphasis::underline | fmt::emphasis::bold;\n  EXPECT_EQ(\"\\x1B[30m42\\x1B[0m\",\n            fmt::format(fg(fmt::terminal_color::black), \"{}\", 42));\n  EXPECT_EQ(L\"\\x1B[30m42\\x1B[0m\",\n            fmt::format(fg(fmt::terminal_color::black), L\"{}\", 42));\n}\n\nTEST(module_test, cstring_view) {\n  auto s = \"fmt\";\n  EXPECT_EQ(s, fmt::cstring_view(s).c_str());\n  auto w = L\"fmt\";\n  EXPECT_EQ(w, fmt::wcstring_view(w).c_str());\n}\n\nTEST(module_test, buffered_file) {\n  EXPECT_TRUE(fmt::buffered_file{}.get() == nullptr);\n}\n\nTEST(module_test, output_file) {\n  fmt::ostream out = fmt::output_file(\"module-test\", fmt::buffer_size = 1);\n  out.close();\n}\n\nstruct custom_context {\n  using char_type = char;\n  using parse_context_type = fmt::format_parse_context;\n};\n\nTEST(module_test, custom_context) {\n  fmt::basic_format_arg<custom_context> custom_arg;\n  EXPECT_TRUE(!custom_arg);\n}\n\nstruct disabled_formatter {};\n\nTEST(module_test, has_formatter) {\n  EXPECT_FALSE(\n      (fmt::has_formatter<disabled_formatter, fmt::format_context>::value));\n}\n\nTEST(module_test, is_formattable) {\n  EXPECT_FALSE(fmt::is_formattable<disabled_formatter>::value);\n}\n\nTEST(module_test, compile_format_string) {\n  using namespace fmt::literals;\n  EXPECT_EQ(\"42\", fmt::format(\"{0:x}\"_cf, 0x42));\n  EXPECT_EQ(L\"42\", fmt::format(L\"{:}\"_cf, 42));\n  EXPECT_EQ(\"4.2\", fmt::format(\"{arg:3.1f}\"_cf, \"arg\"_a = 4.2));\n  EXPECT_EQ(L\" 42\", fmt::format(L\"{arg:>3}\"_cf, L\"arg\"_a = L\"42\"));\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/os-test.cc",
    "content": "// Formatting library for C++ - tests of the OS-specific functionality\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include \"fmt/os.h\"\n\n#include <cstdlib>  // std::exit\n#include <cstring>\n#include <memory>\n\n#include \"gtest-extra.h\"\n#include \"util.h\"\n\n#ifdef fileno\n#  undef fileno\n#endif\n\nusing fmt::buffered_file;\nusing testing::HasSubstr;\nusing wstring_view = fmt::basic_string_view<wchar_t>;\n\n#ifdef _WIN32\n\n#  include <windows.h>\n\nTEST(util_test, utf16_to_utf8) {\n  auto s = std::string(\"ёжик\");\n  fmt::detail::utf16_to_utf8 u(L\"\\x0451\\x0436\\x0438\\x043A\");\n  EXPECT_EQ(s, u.str());\n  EXPECT_EQ(s.size(), u.size());\n}\n\nTEST(util_test, utf16_to_utf8_empty_string) {\n  std::string s = \"\";\n  fmt::detail::utf16_to_utf8 u(L\"\");\n  EXPECT_EQ(s, u.str());\n  EXPECT_EQ(s.size(), u.size());\n}\n\ntemplate <typename Converter, typename Char>\nvoid check_utf_conversion_error(\n    const char* message,\n    fmt::basic_string_view<Char> str = fmt::basic_string_view<Char>(0, 1)) {\n  fmt::memory_buffer out;\n  fmt::detail::format_windows_error(out, ERROR_INVALID_PARAMETER, message);\n  auto error = std::system_error(std::error_code());\n  try {\n    (Converter)(str);\n  } catch (const std::system_error& e) {\n    error = e;\n  }\n  EXPECT_EQ(ERROR_INVALID_PARAMETER, error.code().value());\n  EXPECT_THAT(error.what(), HasSubstr(fmt::to_string(out)));\n}\n\nTEST(util_test, utf16_to_utf8_error) {\n  check_utf_conversion_error<fmt::detail::utf16_to_utf8, wchar_t>(\n      \"cannot convert string from UTF-16 to UTF-8\");\n}\n\nTEST(util_test, utf16_to_utf8_convert) {\n  fmt::detail::utf16_to_utf8 u;\n  EXPECT_EQ(ERROR_INVALID_PARAMETER, u.convert(wstring_view(0, 1)));\n  EXPECT_EQ(ERROR_INVALID_PARAMETER,\n            u.convert(wstring_view(L\"foo\", INT_MAX + 1u)));\n}\n\nTEST(os_test, format_std_error_code) {\n  EXPECT_EQ(\"generic:42\",\n            fmt::format(FMT_STRING(\"{0}\"),\n                        std::error_code(42, std::generic_category())));\n  EXPECT_EQ(\"system:42\",\n            fmt::format(FMT_STRING(\"{0}\"),\n                        std::error_code(42, fmt::system_category())));\n  EXPECT_EQ(\"system:-42\",\n            fmt::format(FMT_STRING(\"{0}\"),\n                        std::error_code(-42, fmt::system_category())));\n}\n\nTEST(os_test, format_windows_error) {\n  LPWSTR message = 0;\n  auto result = FormatMessageW(\n      FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |\n          FORMAT_MESSAGE_IGNORE_INSERTS,\n      0, ERROR_FILE_EXISTS, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),\n      reinterpret_cast<LPWSTR>(&message), 0, 0);\n  fmt::detail::utf16_to_utf8 utf8_message(wstring_view(message, result - 2));\n  LocalFree(message);\n  fmt::memory_buffer actual_message;\n  fmt::detail::format_windows_error(actual_message, ERROR_FILE_EXISTS, \"test\");\n  EXPECT_EQ(fmt::format(\"test: {}\", utf8_message.str()),\n            fmt::to_string(actual_message));\n  actual_message.resize(0);\n}\n\nTEST(os_test, format_long_windows_error) {\n  LPWSTR message = 0;\n  // this error code is not available on all Windows platforms and\n  // Windows SDKs, so do not fail the test if the error string cannot\n  // be retrieved.\n  int provisioning_not_allowed = 0x80284013L;  // TBS_E_PROVISIONING_NOT_ALLOWED\n  auto result = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |\n                                   FORMAT_MESSAGE_FROM_SYSTEM |\n                                   FORMAT_MESSAGE_IGNORE_INSERTS,\n                               0, static_cast<DWORD>(provisioning_not_allowed),\n                               MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),\n                               reinterpret_cast<LPWSTR>(&message), 0, 0);\n  if (result == 0) {\n    LocalFree(message);\n    return;\n  }\n  fmt::detail::utf16_to_utf8 utf8_message(wstring_view(message, result - 2));\n  LocalFree(message);\n  fmt::memory_buffer actual_message;\n  fmt::detail::format_windows_error(actual_message, provisioning_not_allowed,\n                                    \"test\");\n  EXPECT_EQ(fmt::format(\"test: {}\", utf8_message.str()),\n            fmt::to_string(actual_message));\n}\n\nTEST(os_test, windows_error) {\n  auto error = std::system_error(std::error_code());\n  try {\n    throw fmt::windows_error(ERROR_FILE_EXISTS, \"test {}\", \"error\");\n  } catch (const std::system_error& e) {\n    error = e;\n  }\n  fmt::memory_buffer message;\n  fmt::detail::format_windows_error(message, ERROR_FILE_EXISTS, \"test error\");\n  EXPECT_THAT(error.what(), HasSubstr(to_string(message)));\n  EXPECT_EQ(ERROR_FILE_EXISTS, error.code().value());\n}\n\nTEST(os_test, report_windows_error) {\n  fmt::memory_buffer out;\n  fmt::detail::format_windows_error(out, ERROR_FILE_EXISTS, \"test error\");\n  out.push_back('\\n');\n  EXPECT_WRITE(stderr,\n               fmt::report_windows_error(ERROR_FILE_EXISTS, \"test error\"),\n               fmt::to_string(out));\n}\n\n#endif  // _WIN32\n\n#if FMT_USE_FCNTL\n\nusing fmt::file;\n\nbool isclosed(int fd) {\n  char buffer;\n  auto result = std::streamsize();\n  SUPPRESS_ASSERT(result = FMT_POSIX(read(fd, &buffer, 1)));\n  return result == -1 && errno == EBADF;\n}\n\n// Opens a file for reading.\nfile open_file() {\n  file read_end, write_end;\n  file::pipe(read_end, write_end);\n  write_end.write(file_content, std::strlen(file_content));\n  write_end.close();\n  return read_end;\n}\n\n// Attempts to write a string to a file.\nvoid write(file& f, fmt::string_view s) {\n  size_t num_chars_left = s.size();\n  const char* ptr = s.data();\n  do {\n    size_t count = f.write(ptr, num_chars_left);\n    ptr += count;\n    // We can't write more than size_t bytes since num_chars_left\n    // has type size_t.\n    num_chars_left -= count;\n  } while (num_chars_left != 0);\n}\n\nTEST(buffered_file_test, default_ctor) {\n  auto f = buffered_file();\n  EXPECT_TRUE(f.get() == nullptr);\n}\n\nTEST(buffered_file_test, move_ctor) {\n  buffered_file bf = open_buffered_file();\n  FILE* fp = bf.get();\n  EXPECT_TRUE(fp != nullptr);\n  buffered_file bf2(std::move(bf));\n  EXPECT_EQ(fp, bf2.get());\n  EXPECT_TRUE(bf.get() == nullptr);\n}\n\nTEST(buffered_file_test, move_assignment) {\n  buffered_file bf = open_buffered_file();\n  FILE* fp = bf.get();\n  EXPECT_TRUE(fp != nullptr);\n  buffered_file bf2;\n  bf2 = std::move(bf);\n  EXPECT_EQ(fp, bf2.get());\n  EXPECT_TRUE(bf.get() == nullptr);\n}\n\nTEST(buffered_file_test, move_assignment_closes_file) {\n  buffered_file bf = open_buffered_file();\n  buffered_file bf2 = open_buffered_file();\n  int old_fd = bf2.fileno();\n  bf2 = std::move(bf);\n  EXPECT_TRUE(isclosed(old_fd));\n}\n\nTEST(buffered_file_test, move_from_temporary_in_ctor) {\n  FILE* fp = nullptr;\n  buffered_file f = open_buffered_file(&fp);\n  EXPECT_EQ(fp, f.get());\n}\n\nTEST(buffered_file_test, move_from_temporary_in_assignment) {\n  FILE* fp = nullptr;\n  auto f = buffered_file();\n  f = open_buffered_file(&fp);\n  EXPECT_EQ(fp, f.get());\n}\n\nTEST(buffered_file_test, move_from_temporary_in_assignment_closes_file) {\n  buffered_file f = open_buffered_file();\n  int old_fd = f.fileno();\n  f = open_buffered_file();\n  EXPECT_TRUE(isclosed(old_fd));\n}\n\nTEST(buffered_file_test, close_file_in_dtor) {\n  int fd = 0;\n  {\n    buffered_file f = open_buffered_file();\n    fd = f.fileno();\n  }\n  EXPECT_TRUE(isclosed(fd));\n}\n\nTEST(buffered_file_test, close_error_in_dtor) {\n  auto f =\n      std::unique_ptr<buffered_file>(new buffered_file(open_buffered_file()));\n  EXPECT_WRITE(\n      stderr,\n      {\n        // The close function must be called inside EXPECT_WRITE,\n        // otherwise the system may recycle closed file descriptor when\n        // redirecting the output in EXPECT_STDERR and the second close\n        // will break output redirection.\n        FMT_POSIX(close(f->fileno()));\n        SUPPRESS_ASSERT(f.reset(nullptr));\n      },\n      system_error_message(EBADF, \"cannot close file\") + \"\\n\");\n}\n\nTEST(buffered_file_test, close) {\n  buffered_file f = open_buffered_file();\n  int fd = f.fileno();\n  f.close();\n  EXPECT_TRUE(f.get() == nullptr);\n  EXPECT_TRUE(isclosed(fd));\n}\n\nTEST(buffered_file_test, close_error) {\n  buffered_file f = open_buffered_file();\n  FMT_POSIX(close(f.fileno()));\n  EXPECT_SYSTEM_ERROR_NOASSERT(f.close(), EBADF, \"cannot close file\");\n  EXPECT_TRUE(f.get() == nullptr);\n}\n\nTEST(buffered_file_test, fileno) {\n  auto f = open_buffered_file();\n  EXPECT_TRUE(f.fileno() != -1);\n  file copy = file::dup(f.fileno());\n  EXPECT_READ(copy, file_content);\n}\n\nTEST(ostream_test, move) {\n  fmt::ostream out = fmt::output_file(\"test-file\");\n  fmt::ostream moved(std::move(out));\n  moved.print(\"hello\");\n}\n\nTEST(ostream_test, move_while_holding_data) {\n  {\n    fmt::ostream out = fmt::output_file(\"test-file\");\n    out.print(\"Hello, \");\n    fmt::ostream moved(std::move(out));\n    moved.print(\"world!\\n\");\n  }\n  {\n    file in(\"test-file\", file::RDONLY);\n    EXPECT_READ(in, \"Hello, world!\\n\");\n  }\n}\n\nTEST(ostream_test, print) {\n  fmt::ostream out = fmt::output_file(\"test-file\");\n  out.print(\"The answer is {}.\\n\",\n            fmt::join(std::initializer_list<int>{42}, \", \"));\n  out.close();\n  file in(\"test-file\", file::RDONLY);\n  EXPECT_READ(in, \"The answer is 42.\\n\");\n}\n\nTEST(ostream_test, buffer_boundary) {\n  auto str = std::string(4096, 'x');\n  fmt::ostream out = fmt::output_file(\"test-file\");\n  out.print(\"{}\", str);\n  out.print(\"{}\", str);\n  out.close();\n  file in(\"test-file\", file::RDONLY);\n  EXPECT_READ(in, str + str);\n}\n\nTEST(ostream_test, buffer_size) {\n  fmt::ostream out = fmt::output_file(\"test-file\", fmt::buffer_size = 1);\n  out.print(\"{}\", \"foo\");\n  out.close();\n  file in(\"test-file\", file::RDONLY);\n  EXPECT_READ(in, \"foo\");\n}\n\nTEST(ostream_test, truncate) {\n  {\n    fmt::ostream out = fmt::output_file(\"test-file\");\n    out.print(\"0123456789\");\n  }\n  {\n    fmt::ostream out = fmt::output_file(\"test-file\");\n    out.print(\"foo\");\n  }\n  file in(\"test-file\", file::RDONLY);\n  EXPECT_EQ(\"foo\", read(in, 4));\n}\n\nTEST(file_test, default_ctor) {\n  file f;\n  EXPECT_EQ(-1, f.descriptor());\n}\n\nTEST(file_test, open_buffered_file_in_ctor) {\n  FILE* fp = safe_fopen(\"test-file\", \"w\");\n  std::fputs(file_content, fp);\n  std::fclose(fp);\n  file f(\"test-file\", file::RDONLY);\n  // Check if the file is open by reading one character from it.\n  char buffer;\n  bool isopen = FMT_POSIX(read(f.descriptor(), &buffer, 1)) == 1;\n  ASSERT_TRUE(isopen);\n}\n\nTEST(file_test, open_buffered_file_error) {\n  EXPECT_SYSTEM_ERROR(file(\"nonexistent\", file::RDONLY), ENOENT,\n                      \"cannot open file nonexistent\");\n}\n\nTEST(file_test, move_ctor) {\n  file f = open_file();\n  int fd = f.descriptor();\n  EXPECT_NE(-1, fd);\n  file f2(std::move(f));\n  EXPECT_EQ(fd, f2.descriptor());\n  EXPECT_EQ(-1, f.descriptor());\n}\n\nTEST(file_test, move_assignment) {\n  file f = open_file();\n  int fd = f.descriptor();\n  EXPECT_NE(-1, fd);\n  file f2;\n  f2 = std::move(f);\n  EXPECT_EQ(fd, f2.descriptor());\n  EXPECT_EQ(-1, f.descriptor());\n}\n\nTEST(file_test, move_assignment_closes_file) {\n  file f = open_file();\n  file f2 = open_file();\n  int old_fd = f2.descriptor();\n  f2 = std::move(f);\n  EXPECT_TRUE(isclosed(old_fd));\n}\n\nfile open_buffered_file(int& fd) {\n  file f = open_file();\n  fd = f.descriptor();\n  return f;\n}\n\nTEST(file_test, move_from_temporary_in_ctor) {\n  int fd = 0xdead;\n  file f(open_buffered_file(fd));\n  EXPECT_EQ(fd, f.descriptor());\n}\n\nTEST(file_test, move_from_temporary_in_assignment) {\n  int fd = 0xdead;\n  file f;\n  f = open_buffered_file(fd);\n  EXPECT_EQ(fd, f.descriptor());\n}\n\nTEST(file_test, move_from_temporary_in_assignment_closes_file) {\n  int fd = 0xdead;\n  file f = open_file();\n  int old_fd = f.descriptor();\n  f = open_buffered_file(fd);\n  EXPECT_TRUE(isclosed(old_fd));\n}\n\nTEST(file_test, close_file_in_dtor) {\n  int fd = 0;\n  {\n    file f = open_file();\n    fd = f.descriptor();\n  }\n  EXPECT_TRUE(isclosed(fd));\n}\n\nTEST(file_test, close_error_in_dtor) {\n  std::unique_ptr<file> f(new file(open_file()));\n  EXPECT_WRITE(\n      stderr,\n      {\n        // The close function must be called inside EXPECT_WRITE,\n        // otherwise the system may recycle closed file descriptor when\n        // redirecting the output in EXPECT_STDERR and the second close\n        // will break output redirection.\n        FMT_POSIX(close(f->descriptor()));\n        SUPPRESS_ASSERT(f.reset(nullptr));\n      },\n      system_error_message(EBADF, \"cannot close file\") + \"\\n\");\n}\n\nTEST(file_test, close) {\n  file f = open_file();\n  int fd = f.descriptor();\n  f.close();\n  EXPECT_EQ(-1, f.descriptor());\n  EXPECT_TRUE(isclosed(fd));\n}\n\nTEST(file_test, close_error) {\n  file f = open_file();\n  FMT_POSIX(close(f.descriptor()));\n  EXPECT_SYSTEM_ERROR_NOASSERT(f.close(), EBADF, \"cannot close file\");\n  EXPECT_EQ(-1, f.descriptor());\n}\n\nTEST(file_test, read) {\n  file f = open_file();\n  EXPECT_READ(f, file_content);\n}\n\nTEST(file_test, read_error) {\n  file f(\"test-file\", file::WRONLY);\n  char buf;\n  // We intentionally read from a file opened in the write-only mode to\n  // cause error.\n  EXPECT_SYSTEM_ERROR(f.read(&buf, 1), EBADF, \"cannot read from file\");\n}\n\nTEST(file_test, write) {\n  file read_end, write_end;\n  file::pipe(read_end, write_end);\n  write(write_end, \"test\");\n  write_end.close();\n  EXPECT_READ(read_end, \"test\");\n}\n\nTEST(file_test, write_error) {\n  file f(\"test-file\", file::RDONLY);\n  // We intentionally write to a file opened in the read-only mode to\n  // cause error.\n  EXPECT_SYSTEM_ERROR(f.write(\" \", 1), EBADF, \"cannot write to file\");\n}\n\nTEST(file_test, dup) {\n  file f = open_file();\n  file copy = file::dup(f.descriptor());\n  EXPECT_NE(f.descriptor(), copy.descriptor());\n  EXPECT_EQ(file_content, read(copy, std::strlen(file_content)));\n}\n\n#  ifndef __COVERITY__\nTEST(file_test, dup_error) {\n  int value = -1;\n  EXPECT_SYSTEM_ERROR_NOASSERT(file::dup(value), EBADF,\n                               \"cannot duplicate file descriptor -1\");\n}\n#  endif\n\nTEST(file_test, dup2) {\n  file f = open_file();\n  file copy = open_file();\n  f.dup2(copy.descriptor());\n  EXPECT_NE(f.descriptor(), copy.descriptor());\n  EXPECT_READ(copy, file_content);\n}\n\nTEST(file_test, dup2_error) {\n  file f = open_file();\n  EXPECT_SYSTEM_ERROR_NOASSERT(\n      f.dup2(-1), EBADF,\n      fmt::format(\"cannot duplicate file descriptor {} to -1\", f.descriptor()));\n}\n\nTEST(file_test, dup2_noexcept) {\n  file f = open_file();\n  file copy = open_file();\n  std::error_code ec;\n  f.dup2(copy.descriptor(), ec);\n  EXPECT_EQ(ec.value(), 0);\n  EXPECT_NE(f.descriptor(), copy.descriptor());\n  EXPECT_READ(copy, file_content);\n}\n\nTEST(file_test, dup2_noexcept_error) {\n  file f = open_file();\n  std::error_code ec;\n  SUPPRESS_ASSERT(f.dup2(-1, ec));\n  EXPECT_EQ(EBADF, ec.value());\n}\n\nTEST(file_test, pipe) {\n  file read_end, write_end;\n  file::pipe(read_end, write_end);\n  EXPECT_NE(-1, read_end.descriptor());\n  EXPECT_NE(-1, write_end.descriptor());\n  write(write_end, \"test\");\n  EXPECT_READ(read_end, \"test\");\n}\n\nTEST(file_test, fdopen) {\n  file read_end, write_end;\n  file::pipe(read_end, write_end);\n  int read_fd = read_end.descriptor();\n  EXPECT_EQ(read_fd, FMT_POSIX(fileno(read_end.fdopen(\"r\").get())));\n}\n\n#  ifdef FMT_LOCALE\nTEST(locale_test, strtod) {\n  fmt::locale loc;\n  const char *start = \"4.2\", *ptr = start;\n  EXPECT_EQ(4.2, loc.strtod(ptr));\n  EXPECT_EQ(start + 3, ptr);\n}\n#  endif\n#endif  // FMT_USE_FCNTL\n"
  },
  {
    "path": "examples/libraries/fmt/test/ostream-test.cc",
    "content": "// Formatting library for C++ - std::ostream support tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include \"fmt/format.h\"\n\nusing fmt::runtime;\n\nstruct test {};\n\n// Test that there is no issues with specializations when fmt/ostream.h is\n// included after fmt/format.h.\nnamespace fmt {\ntemplate <> struct formatter<test> : formatter<int> {\n  auto format(const test&, format_context& ctx) -> decltype(ctx.out()) {\n    return formatter<int>::format(42, ctx);\n  }\n};\n}  // namespace fmt\n\n#include <sstream>\n\n#include \"fmt/ostream.h\"\n#include \"fmt/ranges.h\"\n#include \"gmock/gmock.h\"\n#include \"gtest-extra.h\"\n#include \"util.h\"\n\nstd::ostream& operator<<(std::ostream& os, const date& d) {\n  os << d.year() << '-' << d.month() << '-' << d.day();\n  return os;\n}\n\nstd::wostream& operator<<(std::wostream& os, const date& d) {\n  os << d.year() << L'-' << d.month() << L'-' << d.day();\n  return os;\n}\n\n// Make sure that overloaded comma operators do no harm to is_streamable.\nstruct type_with_comma_op {};\ntemplate <typename T> void operator,(type_with_comma_op, const T&);\ntemplate <typename T> type_with_comma_op operator<<(T&, const date&);\n\nenum streamable_enum {};\n\nstd::ostream& operator<<(std::ostream& os, streamable_enum) {\n  return os << \"streamable_enum\";\n}\n\nenum unstreamable_enum {};\n\nTEST(ostream_test, enum) {\n  EXPECT_EQ(\"streamable_enum\", fmt::format(\"{}\", streamable_enum()));\n  EXPECT_EQ(\"0\", fmt::format(\"{}\", unstreamable_enum()));\n}\n\nTEST(ostream_test, format) {\n  EXPECT_EQ(\"a string\", fmt::format(\"{0}\", test_string(\"a string\")));\n  EXPECT_EQ(\"The date is 2012-12-9\",\n            fmt::format(\"The date is {0}\", date(2012, 12, 9)));\n}\n\nTEST(ostream_test, format_specs) {\n  using fmt::format_error;\n  EXPECT_EQ(\"def  \", fmt::format(\"{0:<5}\", test_string(\"def\")));\n  EXPECT_EQ(\"  def\", fmt::format(\"{0:>5}\", test_string(\"def\")));\n  EXPECT_EQ(\" def \", fmt::format(\"{0:^5}\", test_string(\"def\")));\n  EXPECT_EQ(\"def**\", fmt::format(\"{0:*<5}\", test_string(\"def\")));\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:+}\"), test_string()), format_error,\n                   \"format specifier requires numeric argument\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:-}\"), test_string()), format_error,\n                   \"format specifier requires numeric argument\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0: }\"), test_string()), format_error,\n                   \"format specifier requires numeric argument\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:#}\"), test_string()), format_error,\n                   \"format specifier requires numeric argument\");\n  EXPECT_THROW_MSG(fmt::format(runtime(\"{0:05}\"), test_string()), format_error,\n                   \"format specifier requires numeric argument\");\n  EXPECT_EQ(\"test         \", fmt::format(\"{0:13}\", test_string(\"test\")));\n  EXPECT_EQ(\"test         \", fmt::format(\"{0:{1}}\", test_string(\"test\"), 13));\n  EXPECT_EQ(\"te\", fmt::format(\"{0:.2}\", test_string(\"test\")));\n  EXPECT_EQ(\"te\", fmt::format(\"{0:.{1}}\", test_string(\"test\"), 2));\n}\n\nstruct empty_test {};\nstd::ostream& operator<<(std::ostream& os, empty_test) { return os << \"\"; }\n\nTEST(ostream_test, empty_custom_output) {\n  EXPECT_EQ(\"\", fmt::format(\"{}\", empty_test()));\n}\n\nTEST(ostream_test, print) {\n  std::ostringstream os;\n  fmt::print(os, \"Don't {}!\", \"panic\");\n  EXPECT_EQ(\"Don't panic!\", os.str());\n}\n\nTEST(ostream_test, write_to_ostream) {\n  std::ostringstream os;\n  fmt::memory_buffer buffer;\n  const char* foo = \"foo\";\n  buffer.append(foo, foo + std::strlen(foo));\n  fmt::detail::write_buffer(os, buffer);\n  EXPECT_EQ(\"foo\", os.str());\n}\n\nTEST(ostream_test, write_to_ostream_max_size) {\n  auto max_size = fmt::detail::max_value<size_t>();\n  auto max_streamsize = fmt::detail::max_value<std::streamsize>();\n  if (max_size <= fmt::detail::to_unsigned(max_streamsize)) return;\n\n  struct test_buffer final : fmt::detail::buffer<char> {\n    explicit test_buffer(size_t size)\n        : fmt::detail::buffer<char>(nullptr, size, size) {}\n    void grow(size_t) {}\n  } buffer(max_size);\n\n  struct mock_streambuf : std::streambuf {\n    MOCK_METHOD2(xsputn, std::streamsize(const void* s, std::streamsize n));\n    std::streamsize xsputn(const char* s, std::streamsize n) {\n      const void* v = s;\n      return xsputn(v, n);\n    }\n  } streambuf;\n\n  struct test_ostream : std::ostream {\n    explicit test_ostream(mock_streambuf& output_buffer)\n        : std::ostream(&output_buffer) {}\n  } os(streambuf);\n\n  testing::InSequence sequence;\n  const char* data = nullptr;\n  using ustreamsize = std::make_unsigned<std::streamsize>::type;\n  ustreamsize size = max_size;\n  do {\n    auto n = std::min(size, fmt::detail::to_unsigned(max_streamsize));\n    EXPECT_CALL(streambuf, xsputn(data, static_cast<std::streamsize>(n)))\n        .WillOnce(testing::Return(max_streamsize));\n    data += n;\n    size -= n;\n  } while (size != 0);\n  fmt::detail::write_buffer(os, buffer);\n}\n\nTEST(ostream_test, join) {\n  int v[3] = {1, 2, 3};\n  EXPECT_EQ(\"1, 2, 3\", fmt::format(\"{}\", fmt::join(v, v + 3, \", \")));\n}\n\nTEST(ostream_test, join_fallback_formatter) {\n  auto strs = std::vector<test_string>{test_string(\"foo\"), test_string(\"bar\")};\n  EXPECT_EQ(\"foo, bar\", fmt::format(\"{}\", fmt::join(strs, \", \")));\n}\n\n#if FMT_USE_CONSTEXPR\nTEST(ostream_test, constexpr_string) {\n  EXPECT_EQ(\"42\", format(FMT_STRING(\"{}\"), std::string(\"42\")));\n  EXPECT_EQ(\"a string\", format(FMT_STRING(\"{0}\"), test_string(\"a string\")));\n}\n#endif\n\nnamespace fmt_test {\nstruct abc {};\n\ntemplate <typename Output> Output& operator<<(Output& out, abc) {\n  return out << \"abc\";\n}\n}  // namespace fmt_test\n\ntemplate <typename T> struct test_template {};\n\ntemplate <typename T>\nstd::ostream& operator<<(std::ostream& os, test_template<T>) {\n  return os << 1;\n}\n\nnamespace fmt {\ntemplate <typename T> struct formatter<test_template<T>> : formatter<int> {\n  auto format(test_template<T>, format_context& ctx) -> decltype(ctx.out()) {\n    return formatter<int>::format(2, ctx);\n  }\n};\n}  // namespace fmt\n\nTEST(ostream_test, template) {\n  EXPECT_EQ(\"2\", fmt::format(\"{}\", test_template<int>()));\n}\n\nTEST(ostream_test, format_to_n) {\n  char buffer[4];\n  buffer[3] = 'x';\n  auto result = fmt::format_to_n(buffer, 3, \"{}\", fmt_test::abc());\n  EXPECT_EQ(3u, result.size);\n  EXPECT_EQ(buffer + 3, result.out);\n  EXPECT_EQ(\"abcx\", fmt::string_view(buffer, 4));\n  result = fmt::format_to_n(buffer, 3, \"x{}y\", fmt_test::abc());\n  EXPECT_EQ(5u, result.size);\n  EXPECT_EQ(buffer + 3, result.out);\n  EXPECT_EQ(\"xabx\", fmt::string_view(buffer, 4));\n}\n\ntemplate <typename T> struct convertible {\n  T value;\n  explicit convertible(const T& val) : value(val) {}\n  operator T() const { return value; }\n};\n\nTEST(ostream_test, disable_builtin_ostream_operators) {\n  EXPECT_EQ(\"42\", fmt::format(\"{:d}\", convertible<unsigned short>(42)));\n  EXPECT_EQ(\"foo\", fmt::format(\"{}\", convertible<const char*>(\"foo\")));\n}\n\nstruct explicitly_convertible_to_string_like {\n  template <typename String,\n            typename = typename std::enable_if<std::is_constructible<\n                String, const char*, size_t>::value>::type>\n  explicit operator String() const {\n    return String(\"foo\", 3u);\n  }\n};\n\nstd::ostream& operator<<(std::ostream& os,\n                         explicitly_convertible_to_string_like) {\n  return os << \"bar\";\n}\n\nTEST(ostream_test, format_explicitly_convertible_to_string_like) {\n  EXPECT_EQ(\"bar\", fmt::format(\"{}\", explicitly_convertible_to_string_like()));\n}\n\n#ifdef FMT_USE_STRING_VIEW\nstruct explicitly_convertible_to_std_string_view {\n  explicit operator fmt::detail::std_string_view<char>() const {\n    return {\"foo\", 3u};\n  }\n};\n\nstd::ostream& operator<<(std::ostream& os,\n                         explicitly_convertible_to_std_string_view) {\n  return os << \"bar\";\n}\n\nTEST(ostream_test, format_explicitly_convertible_to_std_string_view) {\n  EXPECT_EQ(\"bar\", fmt::format(\"{}\", explicitly_convertible_to_string_like()));\n}\n#endif  // FMT_USE_STRING_VIEW\n\nstruct streamable_and_convertible_to_bool {\n  operator bool() const { return true; }\n};\n\nstd::ostream& operator<<(std::ostream& os, streamable_and_convertible_to_bool) {\n  return os << \"foo\";\n}\n\nTEST(ostream_test, format_convertible_to_bool) {\n  EXPECT_EQ(\"foo\", fmt::format(\"{}\", streamable_and_convertible_to_bool()));\n}\n\nstruct copyfmt_test {};\n\nstd::ostream& operator<<(std::ostream& os, copyfmt_test) {\n  std::ios ios(nullptr);\n  ios.copyfmt(os);\n  return os << \"foo\";\n}\n\nTEST(ostream_test, copyfmt) {\n  EXPECT_EQ(\"foo\", fmt::format(\"{}\", copyfmt_test()));\n}\n\nTEST(ostream_test, to_string) {\n  EXPECT_EQ(\"abc\", fmt::to_string(fmt_test::abc()));\n}\n\nTEST(ostream_test, range) {\n  auto strs = std::vector<test_string>{test_string(\"foo\"), test_string(\"bar\")};\n  EXPECT_EQ(\"[foo, bar]\", fmt::format(\"{}\", strs));\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/posix-mock-test.cc",
    "content": "// Tests of the C++ interface to POSIX functions that require mocks\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n// Disable bogus MSVC warnings.\n#ifndef _CRT_SECURE_NO_WARNINGS\n#  define _CRT_SECURE_NO_WARNINGS\n#endif\n\n#include \"posix-mock.h\"\n\n#include <errno.h>\n#include <fcntl.h>\n\n#include <climits>\n#include <memory>\n\n#include \"../src/os.cc\"\n\n#ifdef _WIN32\n#  include <io.h>\n#  undef max\n#endif\n\n#include \"gmock/gmock.h\"\n#include \"gtest-extra.h\"\n#include \"util.h\"\n\nusing fmt::buffered_file;\n\nusing testing::_;\nusing testing::Return;\nusing testing::StrEq;\n\ntemplate <typename Mock> struct scoped_mock : testing::StrictMock<Mock> {\n  scoped_mock() { Mock::instance = this; }\n  ~scoped_mock() { Mock::instance = nullptr; }\n};\n\nnamespace {\nint open_count;\nint close_count;\nint dup_count;\nint dup2_count;\nint fdopen_count;\nint read_count;\nint write_count;\nint pipe_count;\nint fopen_count;\nint fclose_count;\nint fileno_count;\nsize_t read_nbyte;\nsize_t write_nbyte;\nbool sysconf_error;\n\nenum { none, max_size, error } fstat_sim;\n}  // namespace\n\n#define EMULATE_EINTR(func, error_result) \\\n  if (func##_count != 0) {                \\\n    if (func##_count++ != 3) {            \\\n      errno = EINTR;                      \\\n      return error_result;                \\\n    }                                     \\\n  }\n\n#ifndef _MSC_VER\nint test::open(const char* path, int oflag, int mode) {\n  EMULATE_EINTR(open, -1);\n  return ::open(path, oflag, mode);\n}\n#else\nerrno_t test::sopen_s(int* pfh, const char* filename, int oflag, int shflag,\n                      int pmode) {\n  EMULATE_EINTR(open, EINTR);\n  return _sopen_s(pfh, filename, oflag, shflag, pmode);\n}\n#endif\n\n#ifndef _WIN32\n\nlong test::sysconf(int name) {\n  long result = ::sysconf(name);\n  if (!sysconf_error) return result;\n  // Simulate an error.\n  errno = EINVAL;\n  return -1;\n}\n\nstatic off_t max_file_size() { return std::numeric_limits<off_t>::max(); }\n\nint test::fstat(int fd, struct stat* buf) {\n  int result = ::fstat(fd, buf);\n  if (fstat_sim == max_size) buf->st_size = max_file_size();\n  return result;\n}\n\n#else\n\nstatic LONGLONG max_file_size() { return std::numeric_limits<LONGLONG>::max(); }\n\nDWORD test::GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh) {\n  if (fstat_sim == error) {\n    SetLastError(ERROR_ACCESS_DENIED);\n    return INVALID_FILE_SIZE;\n  }\n  if (fstat_sim == max_size) {\n    DWORD max = std::numeric_limits<DWORD>::max();\n    *lpFileSizeHigh = max >> 1;\n    return max;\n  }\n  return ::GetFileSize(hFile, lpFileSizeHigh);\n}\n\n#endif\n\nint test::close(int fildes) {\n  // Close the file first because close shouldn't be retried.\n  int result = ::FMT_POSIX(close(fildes));\n  EMULATE_EINTR(close, -1);\n  return result;\n}\n\nint test::dup(int fildes) {\n  EMULATE_EINTR(dup, -1);\n  return ::FMT_POSIX(dup(fildes));\n}\n\nint test::dup2(int fildes, int fildes2) {\n  EMULATE_EINTR(dup2, -1);\n  return ::FMT_POSIX(dup2(fildes, fildes2));\n}\n\nFILE* test::fdopen(int fildes, const char* mode) {\n  EMULATE_EINTR(fdopen, nullptr);\n  return ::FMT_POSIX(fdopen(fildes, mode));\n}\n\ntest::ssize_t test::read(int fildes, void* buf, test::size_t nbyte) {\n  read_nbyte = nbyte;\n  EMULATE_EINTR(read, -1);\n  return ::FMT_POSIX(read(fildes, buf, nbyte));\n}\n\ntest::ssize_t test::write(int fildes, const void* buf, test::size_t nbyte) {\n  write_nbyte = nbyte;\n  EMULATE_EINTR(write, -1);\n  return ::FMT_POSIX(write(fildes, buf, nbyte));\n}\n\n#ifndef _WIN32\nint test::pipe(int fildes[2]) {\n  EMULATE_EINTR(pipe, -1);\n  return ::pipe(fildes);\n}\n#else\nint test::pipe(int* pfds, unsigned psize, int textmode) {\n  EMULATE_EINTR(pipe, -1);\n  return _pipe(pfds, psize, textmode);\n}\n#endif\n\nFILE* test::fopen(const char* filename, const char* mode) {\n  EMULATE_EINTR(fopen, nullptr);\n  return ::fopen(filename, mode);\n}\n\nint test::fclose(FILE* stream) {\n  EMULATE_EINTR(fclose, EOF);\n  return ::fclose(stream);\n}\n\nint(test::fileno)(FILE* stream) {\n  EMULATE_EINTR(fileno, -1);\n#ifdef fileno\n  return FMT_POSIX(fileno(stream));\n#else\n  return ::FMT_POSIX(fileno(stream));\n#endif\n}\n\n#ifndef _WIN32\n#  define EXPECT_RETRY(statement, func, message) \\\n    func##_count = 1;                            \\\n    statement;                                   \\\n    EXPECT_EQ(4, func##_count);                  \\\n    func##_count = 0;\n#  define EXPECT_EQ_POSIX(expected, actual) EXPECT_EQ(expected, actual)\n#else\n#  define EXPECT_RETRY(statement, func, message)    \\\n    func##_count = 1;                               \\\n    EXPECT_SYSTEM_ERROR(statement, EINTR, message); \\\n    func##_count = 0;\n#  define EXPECT_EQ_POSIX(expected, actual)\n#endif\n\n#if FMT_USE_FCNTL\nvoid write_file(fmt::cstring_view filename, fmt::string_view content) {\n  fmt::buffered_file f(filename, \"w\");\n  f.print(\"{}\", content);\n}\n\nusing fmt::file;\n\nTEST(os_test, getpagesize) {\n#  ifdef _WIN32\n  SYSTEM_INFO si = {};\n  GetSystemInfo(&si);\n  EXPECT_EQ(si.dwPageSize, fmt::getpagesize());\n#  else\n  EXPECT_EQ(sysconf(_SC_PAGESIZE), fmt::getpagesize());\n  sysconf_error = true;\n  EXPECT_SYSTEM_ERROR(fmt::getpagesize(), EINVAL,\n                      \"cannot get memory page size\");\n  sysconf_error = false;\n#  endif\n}\n\nTEST(file_test, open_retry) {\n  write_file(\"temp\", \"there must be something here\");\n  std::unique_ptr<file> f{nullptr};\n  EXPECT_RETRY(f.reset(new file(\"temp\", file::RDONLY)), open,\n               \"cannot open file temp\");\n#  ifndef _WIN32\n  char c = 0;\n  f->read(&c, 1);\n#  endif\n}\n\nTEST(file_test, close_no_retry_in_dtor) {\n  file read_end, write_end;\n  file::pipe(read_end, write_end);\n  std::unique_ptr<file> f(new file(std::move(read_end)));\n  int saved_close_count = 0;\n  EXPECT_WRITE(\n      stderr,\n      {\n        close_count = 1;\n        f.reset(nullptr);\n        saved_close_count = close_count;\n        close_count = 0;\n      },\n      system_error_message(EINTR, \"cannot close file\") + \"\\n\");\n  EXPECT_EQ(2, saved_close_count);\n}\n\nTEST(file_test, close_no_retry) {\n  file read_end, write_end;\n  file::pipe(read_end, write_end);\n  close_count = 1;\n  EXPECT_SYSTEM_ERROR(read_end.close(), EINTR, \"cannot close file\");\n  EXPECT_EQ(2, close_count);\n  close_count = 0;\n}\n\nTEST(file_test, size) {\n  std::string content = \"top secret, destroy before reading\";\n  write_file(\"temp\", content);\n  file f(\"temp\", file::RDONLY);\n  EXPECT_GE(f.size(), 0);\n  EXPECT_EQ(content.size(), static_cast<unsigned long long>(f.size()));\n#  ifdef _WIN32\n  auto error_code = std::error_code();\n  fstat_sim = error;\n  try {\n    f.size();\n  } catch (const std::system_error& e) {\n    error_code = e.code();\n  }\n  fstat_sim = none;\n  EXPECT_EQ(error_code,\n            std::error_code(ERROR_ACCESS_DENIED, fmt::system_category()));\n#  else\n  f.close();\n  EXPECT_SYSTEM_ERROR(f.size(), EBADF, \"cannot get file attributes\");\n#  endif\n}\n\nTEST(file_test, max_size) {\n  write_file(\"temp\", \"\");\n  file f(\"temp\", file::RDONLY);\n  fstat_sim = max_size;\n  EXPECT_GE(f.size(), 0);\n  EXPECT_EQ(max_file_size(), f.size());\n  fstat_sim = none;\n}\n\nTEST(file_test, read_retry) {\n  file read_end, write_end;\n  file::pipe(read_end, write_end);\n  enum { SIZE = 4 };\n  write_end.write(\"test\", SIZE);\n  write_end.close();\n  char buffer[SIZE];\n  size_t count = 0;\n  EXPECT_RETRY(count = read_end.read(buffer, SIZE), read,\n               \"cannot read from file\");\n  EXPECT_EQ_POSIX(static_cast<std::streamsize>(SIZE), count);\n}\n\nTEST(file_test, write_retry) {\n  file read_end, write_end;\n  file::pipe(read_end, write_end);\n  enum { SIZE = 4 };\n  size_t count = 0;\n  EXPECT_RETRY(count = write_end.write(\"test\", SIZE), write,\n               \"cannot write to file\");\n  write_end.close();\n#  ifndef _WIN32\n  EXPECT_EQ(static_cast<std::streamsize>(SIZE), count);\n  char buffer[SIZE + 1];\n  read_end.read(buffer, SIZE);\n  buffer[SIZE] = '\\0';\n  EXPECT_STREQ(\"test\", buffer);\n#  endif\n}\n\n#  ifdef _WIN32\nTEST(file_test, convert_read_count) {\n  file read_end, write_end;\n  file::pipe(read_end, write_end);\n  char c;\n  size_t size = UINT_MAX;\n  if (sizeof(unsigned) != sizeof(size_t)) ++size;\n  read_count = 1;\n  read_nbyte = 0;\n  EXPECT_THROW(read_end.read(&c, size), std::system_error);\n  read_count = 0;\n  EXPECT_EQ(UINT_MAX, read_nbyte);\n}\n\nTEST(file_test, convert_write_count) {\n  file read_end, write_end;\n  file::pipe(read_end, write_end);\n  char c;\n  size_t size = UINT_MAX;\n  if (sizeof(unsigned) != sizeof(size_t)) ++size;\n  write_count = 1;\n  write_nbyte = 0;\n  EXPECT_THROW(write_end.write(&c, size), std::system_error);\n  write_count = 0;\n  EXPECT_EQ(UINT_MAX, write_nbyte);\n}\n#  endif\n\nTEST(file_test, dup_no_retry) {\n  int stdout_fd = FMT_POSIX(fileno(stdout));\n  dup_count = 1;\n  EXPECT_SYSTEM_ERROR(\n      file::dup(stdout_fd), EINTR,\n      fmt::format(\"cannot duplicate file descriptor {}\", stdout_fd));\n  dup_count = 0;\n}\n\nTEST(file_test, dup2_retry) {\n  int stdout_fd = FMT_POSIX(fileno(stdout));\n  file f1 = file::dup(stdout_fd), f2 = file::dup(stdout_fd);\n  EXPECT_RETRY(f1.dup2(f2.descriptor()), dup2,\n               fmt::format(\"cannot duplicate file descriptor {} to {}\",\n                           f1.descriptor(), f2.descriptor()));\n}\n\nTEST(file_test, dup2_no_except_retry) {\n  int stdout_fd = FMT_POSIX(fileno(stdout));\n  file f1 = file::dup(stdout_fd), f2 = file::dup(stdout_fd);\n  std::error_code ec;\n  dup2_count = 1;\n  f1.dup2(f2.descriptor(), ec);\n#  ifndef _WIN32\n  EXPECT_EQ(4, dup2_count);\n#  else\n  EXPECT_EQ(EINTR, ec.value());\n#  endif\n  dup2_count = 0;\n}\n\nTEST(file_test, pipe_no_retry) {\n  file read_end, write_end;\n  pipe_count = 1;\n  EXPECT_SYSTEM_ERROR(file::pipe(read_end, write_end), EINTR,\n                      \"cannot create pipe\");\n  pipe_count = 0;\n}\n\nTEST(file_test, fdopen_no_retry) {\n  file read_end, write_end;\n  file::pipe(read_end, write_end);\n  fdopen_count = 1;\n  EXPECT_SYSTEM_ERROR(read_end.fdopen(\"r\"), EINTR,\n                      \"cannot associate stream with file descriptor\");\n  fdopen_count = 0;\n}\n\nTEST(buffered_file_test, open_retry) {\n  write_file(\"temp\", \"there must be something here\");\n  std::unique_ptr<buffered_file> f{nullptr};\n  EXPECT_RETRY(f.reset(new buffered_file(\"temp\", \"r\")), fopen,\n               \"cannot open file temp\");\n#  ifndef _WIN32\n  char c = 0;\n  if (fread(&c, 1, 1, f->get()) < 1)\n    throw fmt::system_error(errno, \"fread failed\");\n#  endif\n}\n\nTEST(buffered_file_test, close_no_retry_in_dtor) {\n  file read_end, write_end;\n  file::pipe(read_end, write_end);\n  std::unique_ptr<buffered_file> f(new buffered_file(read_end.fdopen(\"r\")));\n  int saved_fclose_count = 0;\n  EXPECT_WRITE(\n      stderr,\n      {\n        fclose_count = 1;\n        f.reset(nullptr);\n        saved_fclose_count = fclose_count;\n        fclose_count = 0;\n      },\n      system_error_message(EINTR, \"cannot close file\") + \"\\n\");\n  EXPECT_EQ(2, saved_fclose_count);\n}\n\nTEST(buffered_file_test, close_no_retry) {\n  file read_end, write_end;\n  file::pipe(read_end, write_end);\n  buffered_file f = read_end.fdopen(\"r\");\n  fclose_count = 1;\n  EXPECT_SYSTEM_ERROR(f.close(), EINTR, \"cannot close file\");\n  EXPECT_EQ(2, fclose_count);\n  fclose_count = 0;\n}\n\nTEST(buffered_file_test, fileno_no_retry) {\n  file read_end, write_end;\n  file::pipe(read_end, write_end);\n  buffered_file f = read_end.fdopen(\"r\");\n  fileno_count = 1;\n  EXPECT_SYSTEM_ERROR((f.fileno)(), EINTR, \"cannot get file descriptor\");\n  EXPECT_EQ(2, fileno_count);\n  fileno_count = 0;\n}\n#endif  // FMT_USE_FCNTL\n\nstruct test_mock {\n  static test_mock* instance;\n} * test_mock::instance;\n\nTEST(scoped_mock, scope) {\n  {\n    scoped_mock<test_mock> mock;\n    EXPECT_EQ(&mock, test_mock::instance);\n    test_mock& copy = mock;\n    static_cast<void>(copy);\n  }\n  EXPECT_EQ(nullptr, test_mock::instance);\n}\n\n#ifdef FMT_LOCALE\n\nusing locale_type = fmt::locale::type;\n\nstruct locale_mock {\n  static locale_mock* instance;\n  MOCK_METHOD3(newlocale, locale_type(int category_mask, const char* locale,\n                                      locale_type base));\n  MOCK_METHOD1(freelocale, void(locale_type locale));\n\n  MOCK_METHOD3(strtod_l,\n               double(const char* nptr, char** endptr, locale_type locale));\n} * locale_mock::instance;\n\n#  ifdef _MSC_VER\n#    pragma warning(push)\n#    pragma warning(disable : 4273)\n#    ifdef __clang__\n#      pragma clang diagnostic push\n#      pragma clang diagnostic ignored \"-Winconsistent-dllimport\"\n#    endif\n\n_locale_t _create_locale(int category, const char* locale) {\n  return locale_mock::instance->newlocale(category, locale, 0);\n}\n\nvoid _free_locale(_locale_t locale) {\n  locale_mock::instance->freelocale(locale);\n}\n\ndouble _strtod_l(const char* nptr, char** endptr, _locale_t locale) {\n  return locale_mock::instance->strtod_l(nptr, endptr, locale);\n}\n#    ifdef __clang__\n#      pragma clang diagnostic pop\n#    endif\n#    pragma warning(pop)\n#  endif\n\n#  if defined(__THROW) && \\\n      ((FMT_GCC_VERSION > 0 && FMT_GCC_VERSION <= 408) || defined(__e2k__))\n#    define FMT_LOCALE_THROW __THROW\n#  else\n#    define FMT_LOCALE_THROW\n#  endif\n\n#  if defined(__APPLE__) || \\\n      (defined(__FreeBSD__) && __FreeBSD_version < 1200002)\ntypedef int FreeLocaleResult;\n#  else\ntypedef void FreeLocaleResult;\n#  endif\n\nFreeLocaleResult freelocale(locale_type locale) FMT_LOCALE_THROW {\n  locale_mock::instance->freelocale(locale);\n  return FreeLocaleResult();\n}\n\ndouble strtod_l(const char* nptr, char** endptr,\n                locale_type locale) FMT_LOCALE_THROW {\n  return locale_mock::instance->strtod_l(nptr, endptr, locale);\n}\n\n#  undef FMT_LOCALE_THROW\n\n#  ifndef _WIN32\nlocale_t test::newlocale(int category_mask, const char* locale, locale_t base) {\n  return locale_mock::instance->newlocale(category_mask, locale, base);\n}\n\nTEST(locale_test, locale_mock) {\n  scoped_mock<locale_mock> mock;\n  auto locale = reinterpret_cast<locale_type>(11);\n  EXPECT_CALL(mock, newlocale(222, StrEq(\"foo\"), locale));\n  FMT_SYSTEM(newlocale(222, \"foo\", locale));\n}\n#  endif\n\nTEST(locale_test, locale) {\n#  ifndef LC_NUMERIC_MASK\n  enum { LC_NUMERIC_MASK = LC_NUMERIC };\n#  endif\n  scoped_mock<locale_mock> mock;\n  auto impl = reinterpret_cast<locale_type>(42);\n  EXPECT_CALL(mock, newlocale(LC_NUMERIC_MASK, StrEq(\"C\"), nullptr))\n      .WillOnce(Return(impl));\n  EXPECT_CALL(mock, freelocale(impl));\n  fmt::locale loc;\n  EXPECT_EQ(impl, loc.get());\n}\n\nTEST(locale_test, strtod) {\n  scoped_mock<locale_mock> mock;\n  EXPECT_CALL(mock, newlocale(_, _, _))\n      .WillOnce(Return(reinterpret_cast<locale_type>(42)));\n  EXPECT_CALL(mock, freelocale(_));\n  fmt::locale loc;\n  const char* str = \"4.2\";\n  char end = 'x';\n  EXPECT_CALL(mock, strtod_l(str, _, loc.get()))\n      .WillOnce(testing::DoAll(testing::SetArgPointee<1>(&end), Return(777)));\n  EXPECT_EQ(777, loc.strtod(str));\n  EXPECT_EQ(&end, str);\n}\n\n#endif  // FMT_LOCALE\n"
  },
  {
    "path": "examples/libraries/fmt/test/posix-mock.h",
    "content": "// Formatting library for C++ - mocks of POSIX functions\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#ifndef FMT_POSIX_TEST_H\n#define FMT_POSIX_TEST_H\n\n#include <errno.h>\n#include <locale.h>\n#include <stdio.h>\n#ifdef __APPLE__\n#  include <xlocale.h>\n#endif\n\n#ifdef _WIN32\n#  include <windows.h>\n#else\n#  include <sys/param.h>  // for FreeBSD version\n#  include <sys/types.h>  // for ssize_t\n#endif\n\n#ifndef _MSC_VER\nstruct stat;\n#endif\n\nnamespace test {\n\n#ifndef _MSC_VER\n// Size type for read and write.\ntypedef size_t size_t;\ntypedef ssize_t ssize_t;\nint open(const char* path, int oflag, int mode);\nint fstat(int fd, struct stat* buf);\n#else\ntypedef unsigned size_t;\ntypedef int ssize_t;\nerrno_t sopen_s(int* pfh, const char* filename, int oflag, int shflag,\n                int pmode);\n#endif\n\n#ifndef _WIN32\nlong sysconf(int name);\n#else\nDWORD GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh);\n#endif\n\nint close(int fildes);\n\nint dup(int fildes);\nint dup2(int fildes, int fildes2);\n\nFILE* fdopen(int fildes, const char* mode);\n\nssize_t read(int fildes, void* buf, size_t nbyte);\nssize_t write(int fildes, const void* buf, size_t nbyte);\n\n#ifndef _WIN32\nint pipe(int fildes[2]);\n#else\nint pipe(int* pfds, unsigned psize, int textmode);\n#endif\n\nFILE* fopen(const char* filename, const char* mode);\nint fclose(FILE* stream);\nint(fileno)(FILE* stream);\n\n#if defined(FMT_LOCALE) && !defined(_WIN32)\nlocale_t newlocale(int category_mask, const char* locale, locale_t base);\n#endif\n}  // namespace test\n\n#define FMT_SYSTEM(call) test::call\n\n#endif  // FMT_POSIX_TEST_H\n"
  },
  {
    "path": "examples/libraries/fmt/test/printf-test.cc",
    "content": "// Formatting library for C++ - printf tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include \"fmt/printf.h\"\n\n#include <cctype>\n#include <climits>\n#include <cstring>\n\n#include \"fmt/ostream.h\"\n#include \"fmt/xchar.h\"\n#include \"gtest-extra.h\"\n#include \"util.h\"\n\nusing fmt::format;\nusing fmt::format_error;\nusing fmt::detail::max_value;\n\nconst unsigned big_num = INT_MAX + 1u;\n\n// Makes format string argument positional.\nstatic std::string make_positional(fmt::string_view format) {\n  std::string s(format.data(), format.size());\n  s.replace(s.find('%'), 1, \"%1$\");\n  return s;\n}\n\nstatic std::wstring make_positional(fmt::basic_string_view<wchar_t> format) {\n  std::wstring s(format.data(), format.size());\n  s.replace(s.find(L'%'), 1, L\"%1$\");\n  return s;\n}\n\n// A wrapper around fmt::sprintf to workaround bogus warnings about invalid\n// format strings in MSVC.\ntemplate <typename... Args>\nstd::string test_sprintf(fmt::string_view format, const Args&... args) {\n  return fmt::sprintf(format, args...);\n}\ntemplate <typename... Args>\nstd::wstring test_sprintf(fmt::basic_string_view<wchar_t> format,\n                          const Args&... args) {\n  return fmt::sprintf(format, args...);\n}\n\n#define EXPECT_PRINTF(expected_output, format, arg)     \\\n  EXPECT_EQ(expected_output, test_sprintf(format, arg)) \\\n      << \"format: \" << format;                          \\\n  EXPECT_EQ(expected_output, fmt::sprintf(make_positional(format), arg))\n\nTEST(printf_test, no_args) {\n  EXPECT_EQ(\"test\", test_sprintf(\"test\"));\n  EXPECT_EQ(L\"test\", fmt::sprintf(L\"test\"));\n}\n\nTEST(printf_test, escape) {\n  EXPECT_EQ(\"%\", test_sprintf(\"%%\"));\n  EXPECT_EQ(\"before %\", test_sprintf(\"before %%\"));\n  EXPECT_EQ(\"% after\", test_sprintf(\"%% after\"));\n  EXPECT_EQ(\"before % after\", test_sprintf(\"before %% after\"));\n  EXPECT_EQ(\"%s\", test_sprintf(\"%%s\"));\n  EXPECT_EQ(L\"%\", fmt::sprintf(L\"%%\"));\n  EXPECT_EQ(L\"before %\", fmt::sprintf(L\"before %%\"));\n  EXPECT_EQ(L\"% after\", fmt::sprintf(L\"%% after\"));\n  EXPECT_EQ(L\"before % after\", fmt::sprintf(L\"before %% after\"));\n  EXPECT_EQ(L\"%s\", fmt::sprintf(L\"%%s\"));\n}\n\nTEST(printf_test, positional_args) {\n  EXPECT_EQ(\"42\", test_sprintf(\"%1$d\", 42));\n  EXPECT_EQ(\"before 42\", test_sprintf(\"before %1$d\", 42));\n  EXPECT_EQ(\"42 after\", test_sprintf(\"%1$d after\", 42));\n  EXPECT_EQ(\"before 42 after\", test_sprintf(\"before %1$d after\", 42));\n  EXPECT_EQ(\"answer = 42\", test_sprintf(\"%1$s = %2$d\", \"answer\", 42));\n  EXPECT_EQ(\"42 is the answer\", test_sprintf(\"%2$d is the %1$s\", \"answer\", 42));\n  EXPECT_EQ(\"abracadabra\", test_sprintf(\"%1$s%2$s%1$s\", \"abra\", \"cad\"));\n}\n\nTEST(printf_test, automatic_arg_indexing) {\n  EXPECT_EQ(\"abc\", test_sprintf(\"%c%c%c\", 'a', 'b', 'c'));\n}\n\nTEST(printf_test, number_is_too_big_in_arg_index) {\n  EXPECT_THROW_MSG(test_sprintf(format(\"%{}$\", big_num)), format_error,\n                   \"argument not found\");\n  EXPECT_THROW_MSG(test_sprintf(format(\"%{}$d\", big_num)), format_error,\n                   \"argument not found\");\n}\n\nTEST(printf_test, switch_arg_indexing) {\n  EXPECT_THROW_MSG(test_sprintf(\"%1$d%\", 1, 2), format_error,\n                   \"cannot switch from manual to automatic argument indexing\");\n  EXPECT_THROW_MSG(test_sprintf(format(\"%1$d%{}d\", big_num), 1, 2),\n                   format_error, \"number is too big\");\n  EXPECT_THROW_MSG(test_sprintf(\"%1$d%d\", 1, 2), format_error,\n                   \"cannot switch from manual to automatic argument indexing\");\n\n  EXPECT_THROW_MSG(test_sprintf(\"%d%1$\", 1, 2), format_error,\n                   \"cannot switch from automatic to manual argument indexing\");\n  EXPECT_THROW_MSG(test_sprintf(format(\"%d%{}$d\", big_num), 1, 2), format_error,\n                   \"cannot switch from automatic to manual argument indexing\");\n  EXPECT_THROW_MSG(test_sprintf(\"%d%1$d\", 1, 2), format_error,\n                   \"cannot switch from automatic to manual argument indexing\");\n\n  // Indexing errors override width errors.\n  EXPECT_THROW_MSG(test_sprintf(format(\"%d%1${}d\", big_num), 1, 2),\n                   format_error, \"number is too big\");\n  EXPECT_THROW_MSG(test_sprintf(format(\"%1$d%{}d\", big_num), 1, 2),\n                   format_error, \"number is too big\");\n}\n\nTEST(printf_test, invalid_arg_index) {\n  EXPECT_THROW_MSG(test_sprintf(\"%0$d\", 42), format_error,\n                   \"argument not found\");\n  EXPECT_THROW_MSG(test_sprintf(\"%2$d\", 42), format_error,\n                   \"argument not found\");\n  EXPECT_THROW_MSG(test_sprintf(format(\"%{}$d\", INT_MAX), 42), format_error,\n                   \"argument not found\");\n\n  EXPECT_THROW_MSG(test_sprintf(\"%2$\", 42), format_error, \"argument not found\");\n  EXPECT_THROW_MSG(test_sprintf(format(\"%{}$d\", big_num), 42), format_error,\n                   \"argument not found\");\n}\n\nTEST(printf_test, default_align_right) {\n  EXPECT_PRINTF(\"   42\", \"%5d\", 42);\n  EXPECT_PRINTF(\"  abc\", \"%5s\", \"abc\");\n}\n\nTEST(printf_test, zero_flag) {\n  EXPECT_PRINTF(\"00042\", \"%05d\", 42);\n  EXPECT_PRINTF(\"-0042\", \"%05d\", -42);\n\n  EXPECT_PRINTF(\"00042\", \"%05d\", 42);\n  EXPECT_PRINTF(\"-0042\", \"%05d\", -42);\n  EXPECT_PRINTF(\"-004.2\", \"%06g\", -4.2);\n\n  EXPECT_PRINTF(\"+00042\", \"%00+6d\", 42);\n\n  EXPECT_PRINTF(\"   42\", \"%05.d\", 42);\n  EXPECT_PRINTF(\" 0042\", \"%05.4d\", 42);\n\n  // '0' flag is ignored for non-numeric types.\n  EXPECT_PRINTF(\"    x\", \"%05c\", 'x');\n}\n\nTEST(printf_test, plus_flag) {\n  EXPECT_PRINTF(\"+42\", \"%+d\", 42);\n  EXPECT_PRINTF(\"-42\", \"%+d\", -42);\n  EXPECT_PRINTF(\"+0042\", \"%+05d\", 42);\n  EXPECT_PRINTF(\"+0042\", \"%0++5d\", 42);\n\n  // '+' flag is ignored for non-numeric types.\n  EXPECT_PRINTF(\"x\", \"%+c\", 'x');\n\n  // '+' flag wins over space flag\n  EXPECT_PRINTF(\"+42\", \"%+ d\", 42);\n  EXPECT_PRINTF(\"-42\", \"%+ d\", -42);\n  EXPECT_PRINTF(\"+42\", \"% +d\", 42);\n  EXPECT_PRINTF(\"-42\", \"% +d\", -42);\n  EXPECT_PRINTF(\"+0042\", \"% +05d\", 42);\n  EXPECT_PRINTF(\"+0042\", \"%0+ 5d\", 42);\n\n  // '+' flag and space flag are both ignored for non-numeric types.\n  EXPECT_PRINTF(\"x\", \"%+ c\", 'x');\n  EXPECT_PRINTF(\"x\", \"% +c\", 'x');\n}\n\nTEST(printf_test, minus_flag) {\n  EXPECT_PRINTF(\"abc  \", \"%-5s\", \"abc\");\n  EXPECT_PRINTF(\"abc  \", \"%0--5s\", \"abc\");\n\n  EXPECT_PRINTF(\"7    \", \"%-5d\", 7);\n  EXPECT_PRINTF(\"97   \", \"%-5hhi\", 'a');\n  EXPECT_PRINTF(\"a    \", \"%-5c\", 'a');\n\n  // '0' flag is ignored if '-' flag is given\n  EXPECT_PRINTF(\"7    \", \"%-05d\", 7);\n  EXPECT_PRINTF(\"7    \", \"%0-5d\", 7);\n  EXPECT_PRINTF(\"a    \", \"%-05c\", 'a');\n  EXPECT_PRINTF(\"a    \", \"%0-5c\", 'a');\n  EXPECT_PRINTF(\"97   \", \"%-05hhi\", 'a');\n  EXPECT_PRINTF(\"97   \", \"%0-5hhi\", 'a');\n\n  // '-' and space flag don't interfere\n  EXPECT_PRINTF(\" 42\", \"%- d\", 42);\n}\n\nTEST(printf_test, space_flag) {\n  EXPECT_PRINTF(\" 42\", \"% d\", 42);\n  EXPECT_PRINTF(\"-42\", \"% d\", -42);\n  EXPECT_PRINTF(\" 0042\", \"% 05d\", 42);\n  EXPECT_PRINTF(\" 0042\", \"%0  5d\", 42);\n\n  // ' ' flag is ignored for non-numeric types.\n  EXPECT_PRINTF(\"x\", \"% c\", 'x');\n}\n\nTEST(printf_test, hash_flag) {\n  EXPECT_PRINTF(\"042\", \"%#o\", 042);\n  EXPECT_PRINTF(fmt::format(\"0{:o}\", static_cast<unsigned>(-042)), \"%#o\", -042);\n  EXPECT_PRINTF(\"0\", \"%#o\", 0);\n\n  EXPECT_PRINTF(\"0x42\", \"%#x\", 0x42);\n  EXPECT_PRINTF(\"0X42\", \"%#X\", 0x42);\n  EXPECT_PRINTF(fmt::format(\"0x{:x}\", static_cast<unsigned>(-0x42)), \"%#x\",\n                -0x42);\n  EXPECT_PRINTF(\"0\", \"%#x\", 0);\n\n  EXPECT_PRINTF(\"0x0042\", \"%#06x\", 0x42);\n  EXPECT_PRINTF(\"0x0042\", \"%0##6x\", 0x42);\n\n  EXPECT_PRINTF(\"-42.000000\", \"%#f\", -42.0);\n  EXPECT_PRINTF(\"-42.000000\", \"%#F\", -42.0);\n\n  char buffer[256];\n  safe_sprintf(buffer, \"%#e\", -42.0);\n  EXPECT_PRINTF(buffer, \"%#e\", -42.0);\n  safe_sprintf(buffer, \"%#E\", -42.0);\n  EXPECT_PRINTF(buffer, \"%#E\", -42.0);\n\n  EXPECT_PRINTF(\"-42.0000\", \"%#g\", -42.0);\n  EXPECT_PRINTF(\"-42.0000\", \"%#G\", -42.0);\n\n  safe_sprintf(buffer, \"%#a\", 16.0);\n  EXPECT_PRINTF(buffer, \"%#a\", 16.0);\n  safe_sprintf(buffer, \"%#A\", 16.0);\n  EXPECT_PRINTF(buffer, \"%#A\", 16.0);\n\n  // '#' flag is ignored for non-numeric types.\n  EXPECT_PRINTF(\"x\", \"%#c\", 'x');\n}\n\nTEST(printf_test, width) {\n  EXPECT_PRINTF(\"  abc\", \"%5s\", \"abc\");\n\n  // Width cannot be specified twice.\n  EXPECT_THROW_MSG(test_sprintf(\"%5-5d\", 42), format_error,\n                   \"invalid type specifier\");\n\n  EXPECT_THROW_MSG(test_sprintf(format(\"%{}d\", big_num), 42), format_error,\n                   \"number is too big\");\n  EXPECT_THROW_MSG(test_sprintf(format(\"%1${}d\", big_num), 42), format_error,\n                   \"number is too big\");\n}\n\nTEST(printf_test, dynamic_width) {\n  EXPECT_EQ(\"   42\", test_sprintf(\"%*d\", 5, 42));\n  EXPECT_EQ(\"42   \", test_sprintf(\"%*d\", -5, 42));\n  EXPECT_THROW_MSG(test_sprintf(\"%*d\", 5.0, 42), format_error,\n                   \"width is not integer\");\n  EXPECT_THROW_MSG(test_sprintf(\"%*d\"), format_error, \"argument not found\");\n  EXPECT_THROW_MSG(test_sprintf(\"%*d\", big_num, 42), format_error,\n                   \"number is too big\");\n}\n\nTEST(printf_test, int_precision) {\n  EXPECT_PRINTF(\"00042\", \"%.5d\", 42);\n  EXPECT_PRINTF(\"-00042\", \"%.5d\", -42);\n  EXPECT_PRINTF(\"00042\", \"%.5x\", 0x42);\n  EXPECT_PRINTF(\"0x00042\", \"%#.5x\", 0x42);\n  EXPECT_PRINTF(\"00042\", \"%.5o\", 042);\n  EXPECT_PRINTF(\"00042\", \"%#.5o\", 042);\n\n  EXPECT_PRINTF(\"  00042\", \"%7.5d\", 42);\n  EXPECT_PRINTF(\"  00042\", \"%7.5x\", 0x42);\n  EXPECT_PRINTF(\"   0x00042\", \"%#10.5x\", 0x42);\n  EXPECT_PRINTF(\"  00042\", \"%7.5o\", 042);\n  EXPECT_PRINTF(\"     00042\", \"%#10.5o\", 042);\n\n  EXPECT_PRINTF(\"00042  \", \"%-7.5d\", 42);\n  EXPECT_PRINTF(\"00042  \", \"%-7.5x\", 0x42);\n  EXPECT_PRINTF(\"0x00042   \", \"%-#10.5x\", 0x42);\n  EXPECT_PRINTF(\"00042  \", \"%-7.5o\", 042);\n  EXPECT_PRINTF(\"00042     \", \"%-#10.5o\", 042);\n}\n\nTEST(printf_test, float_precision) {\n  char buffer[256];\n  safe_sprintf(buffer, \"%.3e\", 1234.5678);\n  EXPECT_PRINTF(buffer, \"%.3e\", 1234.5678);\n  EXPECT_PRINTF(\"1234.568\", \"%.3f\", 1234.5678);\n  EXPECT_PRINTF(\"1.23e+03\", \"%.3g\", 1234.5678);\n  safe_sprintf(buffer, \"%.3a\", 1234.5678);\n  EXPECT_PRINTF(buffer, \"%.3a\", 1234.5678);\n}\n\nTEST(printf_test, string_precision) {\n  char test[] = {'H', 'e', 'l', 'l', 'o'};\n  EXPECT_EQ(fmt::sprintf(\"%.4s\", test), \"Hell\");\n}\n\nTEST(printf_test, ignore_precision_for_non_numeric_arg) {\n  EXPECT_PRINTF(\"abc\", \"%.5s\", \"abc\");\n}\n\nTEST(printf_test, dynamic_precision) {\n  EXPECT_EQ(\"00042\", test_sprintf(\"%.*d\", 5, 42));\n  EXPECT_EQ(\"42\", test_sprintf(\"%.*d\", -5, 42));\n  EXPECT_THROW_MSG(test_sprintf(\"%.*d\", 5.0, 42), format_error,\n                   \"precision is not integer\");\n  EXPECT_THROW_MSG(test_sprintf(\"%.*d\"), format_error, \"argument not found\");\n  EXPECT_THROW_MSG(test_sprintf(\"%.*d\", big_num, 42), format_error,\n                   \"number is too big\");\n  if (sizeof(long long) != sizeof(int)) {\n    long long prec = static_cast<long long>(INT_MIN) - 1;\n    EXPECT_THROW_MSG(test_sprintf(\"%.*d\", prec, 42), format_error,\n                     \"number is too big\");\n  }\n}\n\ntemplate <typename T> struct make_signed { typedef T type; };\n\n#define SPECIALIZE_MAKE_SIGNED(T, S) \\\n  template <> struct make_signed<T> { typedef S type; }\n\nSPECIALIZE_MAKE_SIGNED(char, signed char);\nSPECIALIZE_MAKE_SIGNED(unsigned char, signed char);\nSPECIALIZE_MAKE_SIGNED(unsigned short, short);\nSPECIALIZE_MAKE_SIGNED(unsigned, int);\nSPECIALIZE_MAKE_SIGNED(unsigned long, long);\nSPECIALIZE_MAKE_SIGNED(unsigned long long, long long);\n\n// Test length format specifier ``length_spec``.\ntemplate <typename T, typename U>\nvoid test_length(const char* length_spec, U value) {\n  long long signed_value = 0;\n  unsigned long long unsigned_value = 0;\n  // Apply integer promotion to the argument.\n  unsigned long long max = max_value<U>();\n  using fmt::detail::const_check;\n  if (const_check(max <= static_cast<unsigned>(max_value<int>()))) {\n    signed_value = static_cast<int>(value);\n    unsigned_value = static_cast<unsigned long long>(value);\n  } else if (const_check(max <= max_value<unsigned>())) {\n    signed_value = static_cast<unsigned>(value);\n    unsigned_value = static_cast<unsigned long long>(value);\n  }\n  if (sizeof(U) <= sizeof(int) && sizeof(int) < sizeof(T)) {\n    signed_value = static_cast<long long>(value);\n    unsigned_value = static_cast<unsigned long long>(\n        static_cast<typename std::make_unsigned<unsigned>::type>(value));\n  } else {\n    signed_value = static_cast<typename make_signed<T>::type>(value);\n    unsigned_value = static_cast<typename std::make_unsigned<T>::type>(value);\n  }\n  std::ostringstream os;\n  os << signed_value;\n  EXPECT_PRINTF(os.str(), fmt::format(\"%{}d\", length_spec), value);\n  EXPECT_PRINTF(os.str(), fmt::format(\"%{}i\", length_spec), value);\n  os.str(\"\");\n  os << unsigned_value;\n  EXPECT_PRINTF(os.str(), fmt::format(\"%{}u\", length_spec), value);\n  os.str(\"\");\n  os << std::oct << unsigned_value;\n  EXPECT_PRINTF(os.str(), fmt::format(\"%{}o\", length_spec), value);\n  os.str(\"\");\n  os << std::hex << unsigned_value;\n  EXPECT_PRINTF(os.str(), fmt::format(\"%{}x\", length_spec), value);\n  os.str(\"\");\n  os << std::hex << std::uppercase << unsigned_value;\n  EXPECT_PRINTF(os.str(), fmt::format(\"%{}X\", length_spec), value);\n}\n\ntemplate <typename T> void test_length(const char* length_spec) {\n  T min = std::numeric_limits<T>::min(), max = max_value<T>();\n  test_length<T>(length_spec, 42);\n  test_length<T>(length_spec, -42);\n  test_length<T>(length_spec, min);\n  test_length<T>(length_spec, max);\n  long long long_long_min = std::numeric_limits<long long>::min();\n  if (static_cast<long long>(min) > long_long_min)\n    test_length<T>(length_spec, static_cast<long long>(min) - 1);\n  unsigned long long long_long_max = max_value<long long>();\n  if (static_cast<unsigned long long>(max) < long_long_max)\n    test_length<T>(length_spec, static_cast<long long>(max) + 1);\n  test_length<T>(length_spec, std::numeric_limits<short>::min());\n  test_length<T>(length_spec, max_value<unsigned short>());\n  test_length<T>(length_spec, std::numeric_limits<int>::min());\n  test_length<T>(length_spec, max_value<int>());\n  test_length<T>(length_spec, std::numeric_limits<unsigned>::min());\n  test_length<T>(length_spec, max_value<unsigned>());\n  test_length<T>(length_spec, std::numeric_limits<long long>::min());\n  test_length<T>(length_spec, max_value<long long>());\n  test_length<T>(length_spec, std::numeric_limits<unsigned long long>::min());\n  test_length<T>(length_spec, max_value<unsigned long long>());\n}\n\nTEST(printf_test, length) {\n  test_length<char>(\"hh\");\n  test_length<signed char>(\"hh\");\n  test_length<unsigned char>(\"hh\");\n  test_length<short>(\"h\");\n  test_length<unsigned short>(\"h\");\n  test_length<long>(\"l\");\n  test_length<unsigned long>(\"l\");\n  test_length<long long>(\"ll\");\n  test_length<unsigned long long>(\"ll\");\n  test_length<intmax_t>(\"j\");\n  test_length<size_t>(\"z\");\n  test_length<std::ptrdiff_t>(\"t\");\n  long double max = max_value<long double>();\n  EXPECT_PRINTF(fmt::format(\"{:.6}\", max), \"%g\", max);\n  EXPECT_PRINTF(fmt::format(\"{:.6}\", max), \"%Lg\", max);\n}\n\nTEST(printf_test, bool) {\n  EXPECT_PRINTF(\"1\", \"%d\", true);\n  EXPECT_PRINTF(\"true\", \"%s\", true);\n}\n\nTEST(printf_test, int) {\n  EXPECT_PRINTF(\"-42\", \"%d\", -42);\n  EXPECT_PRINTF(\"-42\", \"%i\", -42);\n  unsigned u = 0 - 42u;\n  EXPECT_PRINTF(fmt::format(\"{}\", u), \"%u\", -42);\n  EXPECT_PRINTF(fmt::format(\"{:o}\", u), \"%o\", -42);\n  EXPECT_PRINTF(fmt::format(\"{:x}\", u), \"%x\", -42);\n  EXPECT_PRINTF(fmt::format(\"{:X}\", u), \"%X\", -42);\n}\n\nTEST(printf_test, long_long) {\n  // fmt::printf allows passing long long arguments to %d without length\n  // specifiers.\n  long long max = max_value<long long>();\n  EXPECT_PRINTF(fmt::format(\"{}\", max), \"%d\", max);\n}\n\nTEST(printf_test, float) {\n  EXPECT_PRINTF(\"392.650000\", \"%f\", 392.65);\n  EXPECT_PRINTF(\"392.65\", \"%.2f\", 392.65);\n  EXPECT_PRINTF(\"392.6\", \"%.1f\", 392.65);\n  EXPECT_PRINTF(\"393\", \"%.f\", 392.65);\n  EXPECT_PRINTF(\"392.650000\", \"%F\", 392.65);\n  char buffer[256];\n  safe_sprintf(buffer, \"%e\", 392.65);\n  EXPECT_PRINTF(buffer, \"%e\", 392.65);\n  safe_sprintf(buffer, \"%E\", 392.65);\n  EXPECT_PRINTF(buffer, \"%E\", 392.65);\n  EXPECT_PRINTF(\"392.65\", \"%g\", 392.65);\n  EXPECT_PRINTF(\"392.65\", \"%G\", 392.65);\n  EXPECT_PRINTF(\"392\", \"%g\", 392.0);\n  EXPECT_PRINTF(\"392\", \"%G\", 392.0);\n  EXPECT_PRINTF(\"4.56e-07\", \"%g\", 0.000000456);\n  safe_sprintf(buffer, \"%a\", -392.65);\n  EXPECT_EQ(buffer, format(\"{:a}\", -392.65));\n  safe_sprintf(buffer, \"%A\", -392.65);\n  EXPECT_EQ(buffer, format(\"{:A}\", -392.65));\n}\n\nTEST(printf_test, inf) {\n  double inf = std::numeric_limits<double>::infinity();\n  for (const char* type = \"fega\"; *type; ++type) {\n    EXPECT_PRINTF(\"inf\", fmt::format(\"%{}\", *type), inf);\n    char upper = static_cast<char>(std::toupper(*type));\n    EXPECT_PRINTF(\"INF\", fmt::format(\"%{}\", upper), inf);\n  }\n}\n\nTEST(printf_test, char) {\n  EXPECT_PRINTF(\"x\", \"%c\", 'x');\n  int max = max_value<int>();\n  EXPECT_PRINTF(fmt::format(\"{}\", static_cast<char>(max)), \"%c\", max);\n  // EXPECT_PRINTF(\"x\", \"%lc\", L'x');\n  EXPECT_PRINTF(L\"x\", L\"%c\", L'x');\n  EXPECT_PRINTF(fmt::format(L\"{}\", static_cast<wchar_t>(max)), L\"%c\", max);\n}\n\nTEST(printf_test, string) {\n  EXPECT_PRINTF(\"abc\", \"%s\", \"abc\");\n  const char* null_str = nullptr;\n  EXPECT_PRINTF(\"(null)\", \"%s\", null_str);\n  EXPECT_PRINTF(\"    (null)\", \"%10s\", null_str);\n  EXPECT_PRINTF(L\"abc\", L\"%s\", L\"abc\");\n  const wchar_t* null_wstr = nullptr;\n  EXPECT_PRINTF(L\"(null)\", L\"%s\", null_wstr);\n  EXPECT_PRINTF(L\"    (null)\", L\"%10s\", null_wstr);\n}\n\nTEST(printf_test, uchar_string) {\n  unsigned char str[] = \"test\";\n  unsigned char* pstr = str;\n  EXPECT_EQ(\"test\", fmt::sprintf(\"%s\", pstr));\n}\n\nTEST(printf_test, pointer) {\n  int n;\n  void* p = &n;\n  EXPECT_PRINTF(fmt::format(\"{}\", p), \"%p\", p);\n  p = nullptr;\n  EXPECT_PRINTF(\"(nil)\", \"%p\", p);\n  EXPECT_PRINTF(\"     (nil)\", \"%10p\", p);\n  const char* s = \"test\";\n  EXPECT_PRINTF(fmt::format(\"{:p}\", s), \"%p\", s);\n  const char* null_str = nullptr;\n  EXPECT_PRINTF(\"(nil)\", \"%p\", null_str);\n\n  p = &n;\n  EXPECT_PRINTF(fmt::format(L\"{}\", p), L\"%p\", p);\n  p = nullptr;\n  EXPECT_PRINTF(L\"(nil)\", L\"%p\", p);\n  EXPECT_PRINTF(L\"     (nil)\", L\"%10p\", p);\n  const wchar_t* w = L\"test\";\n  EXPECT_PRINTF(fmt::format(L\"{:p}\", w), L\"%p\", w);\n  const wchar_t* null_wstr = nullptr;\n  EXPECT_PRINTF(L\"(nil)\", L\"%p\", null_wstr);\n}\n\nenum test_enum { answer = 42 };\n\nTEST(printf_test, enum) {\n  EXPECT_PRINTF(\"42\", \"%d\", answer);\n  volatile test_enum volatile_enum = answer;\n  EXPECT_PRINTF(\"42\", \"%d\", volatile_enum);\n}\n\n#if FMT_USE_FCNTL\nTEST(printf_test, examples) {\n  const char* weekday = \"Thursday\";\n  const char* month = \"August\";\n  int day = 21;\n  EXPECT_WRITE(stdout, fmt::printf(\"%1$s, %3$d %2$s\", weekday, month, day),\n               \"Thursday, 21 August\");\n}\n\nTEST(printf_test, printf_error) {\n  fmt::file read_end, write_end;\n  fmt::file::pipe(read_end, write_end);\n  int result = fmt::fprintf(read_end.fdopen(\"r\").get(), \"test\");\n  EXPECT_LT(result, 0);\n}\n#endif\n\nTEST(printf_test, wide_string) {\n  EXPECT_EQ(L\"abc\", fmt::sprintf(L\"%s\", L\"abc\"));\n}\n\nTEST(printf_test, printf_custom) {\n  EXPECT_EQ(\"abc\", test_sprintf(\"%s\", test_string(\"abc\")));\n}\n\nTEST(printf_test, vprintf) {\n  fmt::format_arg_store<fmt::printf_context, int> as{42};\n  fmt::basic_format_args<fmt::printf_context> args(as);\n  EXPECT_EQ(fmt::vsprintf(\"%d\", args), \"42\");\n  EXPECT_WRITE(stdout, fmt::vprintf(\"%d\", args), \"42\");\n  EXPECT_WRITE(stdout, fmt::vfprintf(stdout, \"%d\", args), \"42\");\n}\n\ntemplate <typename... Args>\nvoid check_format_string_regression(fmt::string_view s, const Args&... args) {\n  fmt::sprintf(s, args...);\n}\n\nTEST(printf_test, check_format_string_regression) {\n  check_format_string_regression(\"%c%s\", 'x', \"\");\n}\n\nTEST(printf_test, fixed_large_exponent) {\n  EXPECT_EQ(\"1000000000000000000000\", fmt::sprintf(\"%.*f\", -13, 1e21));\n}\n\nTEST(printf_test, vsprintf_make_args_example) {\n  fmt::format_arg_store<fmt::printf_context, int, const char*> as{42,\n                                                                  \"something\"};\n  fmt::basic_format_args<fmt::printf_context> args(as);\n  EXPECT_EQ(\"[42] something happened\", fmt::vsprintf(\"[%d] %s happened\", args));\n  auto as2 = fmt::make_printf_args(42, \"something\");\n  fmt::basic_format_args<fmt::printf_context> args2(as2);\n  EXPECT_EQ(\"[42] something happened\",\n            fmt::vsprintf(\"[%d] %s happened\", args2));\n  EXPECT_EQ(\"[42] something happened\",\n            fmt::vsprintf(\"[%d] %s happened\",\n                          {fmt::make_printf_args(42, \"something\")}));\n}\n\nTEST(printf_test, vsprintf_make_wargs_example) {\n  fmt::format_arg_store<fmt::wprintf_context, int, const wchar_t*> as{\n      42, L\"something\"};\n  fmt::basic_format_args<fmt::wprintf_context> args(as);\n  EXPECT_EQ(L\"[42] something happened\",\n            fmt::vsprintf(L\"[%d] %s happened\", args));\n  auto as2 = fmt::make_wprintf_args(42, L\"something\");\n  fmt::basic_format_args<fmt::wprintf_context> args2(as2);\n  EXPECT_EQ(L\"[42] something happened\",\n            fmt::vsprintf(L\"[%d] %s happened\", args2));\n  EXPECT_EQ(L\"[42] something happened\",\n            fmt::vsprintf(L\"[%d] %s happened\",\n                          {fmt::make_wprintf_args(42, L\"something\")}));\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/ranges-test.cc",
    "content": "// Formatting library for C++ - the core API\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n//\n// Copyright (c) 2018 - present, Remotion (Igor Schulz)\n// All Rights Reserved\n// {fmt} support for ranges, containers and types tuple interface.\n\n#include \"fmt/ranges.h\"\n\n#include <map>\n#include <string>\n#include <vector>\n\n#include \"gtest/gtest.h\"\n\n#if !FMT_GCC_VERSION || FMT_GCC_VERSION >= 601\n#  define FMT_RANGES_TEST_ENABLE_C_STYLE_ARRAY\n#endif\n\n#if !FMT_MSC_VER || FMT_MSC_VER > 1910\n#  define FMT_RANGES_TEST_ENABLE_JOIN\n#  define FMT_RANGES_TEST_ENABLE_FORMAT_STRUCT\n#endif\n\n#ifdef FMT_RANGES_TEST_ENABLE_C_STYLE_ARRAY\nTEST(ranges_test, format_array) {\n  int arr[] = {1, 2, 3, 5, 7, 11};\n  EXPECT_EQ(fmt::format(\"{}\", arr), \"[1, 2, 3, 5, 7, 11]\");\n}\n\nTEST(ranges_test, format_2d_array) {\n  int arr[][2] = {{1, 2}, {3, 5}, {7, 11}};\n  EXPECT_EQ(fmt::format(\"{}\", arr), \"[[1, 2], [3, 5], [7, 11]]\");\n}\n\nTEST(ranges_test, format_array_of_literals) {\n  const char* arr[] = {\"1234\", \"abcd\"};\n  EXPECT_EQ(fmt::format(\"{}\", arr), \"[\\\"1234\\\", \\\"abcd\\\"]\");\n}\n#endif  // FMT_RANGES_TEST_ENABLE_C_STYLE_ARRAY\n\nTEST(ranges_test, format_vector) {\n  auto v = std::vector<int>{1, 2, 3, 5, 7, 11};\n  EXPECT_EQ(fmt::format(\"{}\", v), \"[1, 2, 3, 5, 7, 11]\");\n}\n\nTEST(ranges_test, format_vector2) {\n  auto v = std::vector<std::vector<int>>{{1, 2}, {3, 5}, {7, 11}};\n  EXPECT_EQ(fmt::format(\"{}\", v), \"[[1, 2], [3, 5], [7, 11]]\");\n}\n\nTEST(ranges_test, format_map) {\n  auto m = std::map<std::string, int>{{\"one\", 1}, {\"two\", 2}};\n  EXPECT_EQ(fmt::format(\"{}\", m), \"[(\\\"one\\\", 1), (\\\"two\\\", 2)]\");\n}\n\nTEST(ranges_test, format_pair) {\n  auto p = std::pair<int, float>(42, 1.5f);\n  EXPECT_EQ(fmt::format(\"{}\", p), \"(42, 1.5)\");\n}\n\nTEST(ranges_test, format_tuple) {\n  auto t =\n      std::tuple<int, float, std::string, char>(42, 1.5f, \"this is tuple\", 'i');\n  EXPECT_EQ(fmt::format(\"{}\", t), \"(42, 1.5, \\\"this is tuple\\\", 'i')\");\n  EXPECT_EQ(fmt::format(\"{}\", std::tuple<>()), \"()\");\n}\n\n#ifdef FMT_RANGES_TEST_ENABLE_FORMAT_STRUCT\nstruct tuple_like {\n  int i;\n  std::string str;\n\n  template <size_t N> fmt::enable_if_t<N == 0, int> get() const noexcept {\n    return i;\n  }\n  template <size_t N>\n  fmt::enable_if_t<N == 1, fmt::string_view> get() const noexcept {\n    return str;\n  }\n};\n\ntemplate <size_t N>\nauto get(const tuple_like& t) noexcept -> decltype(t.get<N>()) {\n  return t.get<N>();\n}\n\nnamespace std {\ntemplate <>\nstruct tuple_size<tuple_like> : std::integral_constant<size_t, 2> {};\n\ntemplate <size_t N> struct tuple_element<N, tuple_like> {\n  using type = decltype(std::declval<tuple_like>().get<N>());\n};\n}  // namespace std\n\nTEST(ranges_test, format_struct) {\n  auto t = tuple_like{42, \"foo\"};\n  EXPECT_EQ(fmt::format(\"{}\", t), \"(42, \\\"foo\\\")\");\n}\n#endif  // FMT_RANGES_TEST_ENABLE_FORMAT_STRUCT\n\nTEST(ranges_test, format_to) {\n  char buf[10];\n  auto end = fmt::format_to(buf, \"{}\", std::vector<int>{1, 2, 3});\n  *end = '\\0';\n  EXPECT_STREQ(buf, \"[1, 2, 3]\");\n}\n\nstruct path_like {\n  const path_like* begin() const;\n  const path_like* end() const;\n\n  operator std::string() const;\n};\n\nTEST(ranges_test, path_like) {\n  EXPECT_FALSE((fmt::is_range<path_like, char>::value));\n}\n\n#ifdef FMT_USE_STRING_VIEW\nstruct string_like {\n  const char* begin();\n  const char* end();\n  explicit operator fmt::string_view() const { return \"foo\"; }\n  explicit operator std::string_view() const { return \"foo\"; }\n};\n\nTEST(ranges_test, format_string_like) {\n  EXPECT_EQ(fmt::format(\"{}\", string_like()), \"foo\");\n}\n#endif  // FMT_USE_STRING_VIEW\n\n// A range that provides non-const only begin()/end() to test fmt::join handles\n// that.\n//\n// Some ranges (e.g. those produced by range-v3's views::filter()) can cache\n// information during iteration so they only provide non-const begin()/end().\ntemplate <typename T> class non_const_only_range {\n private:\n  std::vector<T> vec;\n\n public:\n  using const_iterator = typename ::std::vector<T>::const_iterator;\n\n  template <typename... Args>\n  explicit non_const_only_range(Args&&... args)\n      : vec(std::forward<Args>(args)...) {}\n\n  const_iterator begin() { return vec.begin(); }\n  const_iterator end() { return vec.end(); }\n};\n\ntemplate <typename T> class noncopyable_range {\n private:\n  std::vector<T> vec;\n\n public:\n  using const_iterator = typename ::std::vector<T>::const_iterator;\n\n  template <typename... Args>\n  explicit noncopyable_range(Args&&... args)\n      : vec(std::forward<Args>(args)...) {}\n\n  noncopyable_range(noncopyable_range const&) = delete;\n  noncopyable_range(noncopyable_range&) = delete;\n\n  const_iterator begin() const { return vec.begin(); }\n  const_iterator end() const { return vec.end(); }\n};\n\nTEST(ranges_test, range) {\n  noncopyable_range<int> w(3u, 0);\n  EXPECT_EQ(fmt::format(\"{}\", w), \"[0, 0, 0]\");\n  EXPECT_EQ(fmt::format(\"{}\", noncopyable_range<int>(3u, 0)), \"[0, 0, 0]\");\n\n  non_const_only_range<int> x(3u, 0);\n  EXPECT_EQ(fmt::format(\"{}\", x), \"[0, 0, 0]\");\n  EXPECT_EQ(fmt::format(\"{}\", non_const_only_range<int>(3u, 0)), \"[0, 0, 0]\");\n\n  auto y = std::vector<int>(3u, 0);\n  EXPECT_EQ(fmt::format(\"{}\", y), \"[0, 0, 0]\");\n  EXPECT_EQ(fmt::format(\"{}\", std::vector<int>(3u, 0)), \"[0, 0, 0]\");\n\n  const auto z = std::vector<int>(3u, 0);\n  EXPECT_EQ(fmt::format(\"{}\", z), \"[0, 0, 0]\");\n}\n\n#if !FMT_MSC_VER || FMT_MSC_VER >= 1927\nstruct unformattable {};\n\nTEST(ranges_test, unformattable_range) {\n  EXPECT_FALSE((fmt::has_formatter<std::vector<unformattable>,\n                                   fmt::format_context>::value));\n}\n#endif\n\n#ifdef FMT_RANGES_TEST_ENABLE_JOIN\nTEST(ranges_test, join_tuple) {\n  // Value tuple args.\n  auto t1 = std::tuple<char, int, float>('a', 1, 2.0f);\n  EXPECT_EQ(fmt::format(\"({})\", fmt::join(t1, \", \")), \"(a, 1, 2)\");\n\n  // Testing lvalue tuple args.\n  int x = 4;\n  auto t2 = std::tuple<char, int&>('b', x);\n  EXPECT_EQ(fmt::format(\"{}\", fmt::join(t2, \" + \")), \"b + 4\");\n\n  // Empty tuple.\n  auto t3 = std::tuple<>();\n  EXPECT_EQ(fmt::format(\"{}\", fmt::join(t3, \"|\")), \"\");\n\n  // Single element tuple.\n  auto t4 = std::tuple<float>(4.0f);\n  EXPECT_EQ(fmt::format(\"{}\", fmt::join(t4, \"/\")), \"4\");\n}\n\nTEST(ranges_test, join_initializer_list) {\n  EXPECT_EQ(fmt::format(\"{}\", fmt::join({1, 2, 3}, \", \")), \"1, 2, 3\");\n  EXPECT_EQ(fmt::format(\"{}\", fmt::join({\"fmt\", \"rocks\", \"!\"}, \" \")),\n            \"fmt rocks !\");\n}\n\nstruct zstring_sentinel {};\n\nbool operator==(const char* p, zstring_sentinel) { return *p == '\\0'; }\nbool operator!=(const char* p, zstring_sentinel) { return *p != '\\0'; }\n\nstruct zstring {\n  const char* p;\n  const char* begin() const { return p; }\n  zstring_sentinel end() const { return {}; }\n};\n\nTEST(ranges_test, join_sentinel) {\n  auto hello = zstring{\"hello\"};\n  EXPECT_EQ(fmt::format(\"{}\", hello), \"['h', 'e', 'l', 'l', 'o']\");\n  EXPECT_EQ(fmt::format(\"{}\", fmt::join(hello, \"_\")), \"h_e_l_l_o\");\n}\n\nTEST(ranges_test, join_range) {\n  noncopyable_range<int> w(3u, 0);\n  EXPECT_EQ(fmt::format(\"{}\", fmt::join(w, \",\")), \"0,0,0\");\n  EXPECT_EQ(fmt::format(\"{}\", fmt::join(noncopyable_range<int>(3u, 0), \",\")),\n            \"0,0,0\");\n\n  non_const_only_range<int> x(3u, 0);\n  EXPECT_EQ(fmt::format(\"{}\", fmt::join(x, \",\")), \"0,0,0\");\n  EXPECT_EQ(fmt::format(\"{}\", fmt::join(non_const_only_range<int>(3u, 0), \",\")),\n            \"0,0,0\");\n\n  auto y = std::vector<int>(3u, 0);\n  EXPECT_EQ(fmt::format(\"{}\", fmt::join(y, \",\")), \"0,0,0\");\n  EXPECT_EQ(fmt::format(\"{}\", fmt::join(std::vector<int>(3u, 0), \",\")),\n            \"0,0,0\");\n\n  const auto z = std::vector<int>(3u, 0);\n  EXPECT_EQ(fmt::format(\"{}\", fmt::join(z, \",\")), \"0,0,0\");\n}\n#endif  // FMT_RANGES_TEST_ENABLE_JOIN\n"
  },
  {
    "path": "examples/libraries/fmt/test/scan-test.cc",
    "content": "// Formatting library for C++ - scanning API test\n//\n// Copyright (c) 2019 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include \"scan.h\"\n\n#include <time.h>\n\n#include <climits>\n\n#include \"gmock/gmock.h\"\n#include \"gtest-extra.h\"\n\nTEST(scan_test, read_text) {\n  auto s = fmt::string_view(\"foo\");\n  auto end = fmt::scan(s, \"foo\");\n  EXPECT_EQ(end, s.end());\n  EXPECT_THROW_MSG(fmt::scan(\"fob\", \"foo\"), fmt::format_error, \"invalid input\");\n}\n\nTEST(scan_test, read_int) {\n  auto n = int();\n  fmt::scan(\"42\", \"{}\", n);\n  EXPECT_EQ(n, 42);\n  fmt::scan(\"-42\", \"{}\", n);\n  EXPECT_EQ(n, -42);\n}\n\nTEST(scan_test, read_longlong) {\n  long long n = 0;\n  fmt::scan(\"42\", \"{}\", n);\n  EXPECT_EQ(n, 42);\n  fmt::scan(\"-42\", \"{}\", n);\n  EXPECT_EQ(n, -42);\n}\n\nTEST(scan_test, read_uint) {\n  auto n = unsigned();\n  fmt::scan(\"42\", \"{}\", n);\n  EXPECT_EQ(n, 42);\n  EXPECT_THROW_MSG(fmt::scan(\"-42\", \"{}\", n), fmt::format_error,\n                   \"invalid input\");\n}\n\nTEST(scan_test, read_ulonglong) {\n  unsigned long long n = 0;\n  fmt::scan(\"42\", \"{}\", n);\n  EXPECT_EQ(n, 42);\n  EXPECT_THROW_MSG(fmt::scan(\"-42\", \"{}\", n), fmt::format_error,\n                   \"invalid input\");\n}\n\nTEST(scan_test, read_string) {\n  auto s = std::string();\n  fmt::scan(\"foo\", \"{}\", s);\n  EXPECT_EQ(s, \"foo\");\n}\n\nTEST(scan_test, read_string_view) {\n  auto s = fmt::string_view();\n  fmt::scan(\"foo\", \"{}\", s);\n  EXPECT_EQ(s, \"foo\");\n}\n\n#ifndef _WIN32\nnamespace fmt {\ntemplate <> struct scanner<tm> {\n  std::string format;\n\n  scan_parse_context::iterator parse(scan_parse_context& ctx) {\n    auto it = ctx.begin();\n    if (it != ctx.end() && *it == ':') ++it;\n    auto end = it;\n    while (end != ctx.end() && *end != '}') ++end;\n    format.reserve(detail::to_unsigned(end - it + 1));\n    format.append(it, end);\n    format.push_back('\\0');\n    return end;\n  }\n\n  template <class ScanContext>\n  typename ScanContext::iterator scan(tm& t, ScanContext& ctx) {\n    auto result = strptime(ctx.begin(), format.c_str(), &t);\n    if (!result) throw format_error(\"failed to parse time\");\n    return result;\n  }\n};\n}  // namespace fmt\n\nTEST(scan_test, read_custom) {\n  auto input = \"Date: 1985-10-25\";\n  auto t = tm();\n  fmt::scan(input, \"Date: {0:%Y-%m-%d}\", t);\n  EXPECT_EQ(t.tm_year, 85);\n  EXPECT_EQ(t.tm_mon, 9);\n  EXPECT_EQ(t.tm_mday, 25);\n}\n#endif\n\nTEST(scan_test, invalid_format) {\n  EXPECT_THROW_MSG(fmt::scan(\"\", \"{}\"), fmt::format_error,\n                   \"argument index out of range\");\n  EXPECT_THROW_MSG(fmt::scan(\"\", \"{\"), fmt::format_error,\n                   \"invalid format string\");\n}\n\nTEST(scan_test, example) {\n  auto key = std::string();\n  auto value = int();\n  fmt::scan(\"answer = 42\", \"{} = {}\", key, value);\n  EXPECT_EQ(key, \"answer\");\n  EXPECT_EQ(value, 42);\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/scan.h",
    "content": "// Formatting library for C++ - scanning API proof of concept\n//\n// Copyright (c) 2019 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include <array>\n#include <cassert>\n#include <climits>\n\n#include \"fmt/format.h\"\n\nFMT_BEGIN_NAMESPACE\ntemplate <typename T, typename Char = char> struct scanner {\n  // A deleted default constructor indicates a disabled scanner.\n  scanner() = delete;\n};\n\nclass scan_parse_context {\n private:\n  string_view format_;\n\n public:\n  using iterator = string_view::iterator;\n\n  explicit FMT_CONSTEXPR scan_parse_context(string_view format)\n      : format_(format) {}\n\n  FMT_CONSTEXPR iterator begin() const { return format_.begin(); }\n  FMT_CONSTEXPR iterator end() const { return format_.end(); }\n\n  void advance_to(iterator it) {\n    format_.remove_prefix(detail::to_unsigned(it - begin()));\n  }\n};\n\nstruct scan_context {\n private:\n  string_view input_;\n\n public:\n  using iterator = const char*;\n\n  explicit scan_context(string_view input) : input_(input) {}\n\n  iterator begin() const { return input_.data(); }\n  iterator end() const { return begin() + input_.size(); }\n\n  void advance_to(iterator it) {\n    input_.remove_prefix(detail::to_unsigned(it - begin()));\n  }\n};\n\nnamespace detail {\nenum class scan_type {\n  none_type,\n  int_type,\n  uint_type,\n  long_long_type,\n  ulong_long_type,\n  string_type,\n  string_view_type,\n  custom_type\n};\n\nstruct custom_scan_arg {\n  void* value;\n  void (*scan)(void* arg, scan_parse_context& parse_ctx, scan_context& ctx);\n};\n\nclass scan_arg {\n public:\n  scan_type type;\n  union {\n    int* int_value;\n    unsigned* uint_value;\n    long long* long_long_value;\n    unsigned long long* ulong_long_value;\n    std::string* string;\n    fmt::string_view* string_view;\n    custom_scan_arg custom;\n    // TODO: more types\n  };\n\n  scan_arg() : type(scan_type::none_type) {}\n  scan_arg(int& value) : type(scan_type::int_type), int_value(&value) {}\n  scan_arg(unsigned& value) : type(scan_type::uint_type), uint_value(&value) {}\n  scan_arg(long long& value)\n      : type(scan_type::long_long_type), long_long_value(&value) {}\n  scan_arg(unsigned long long& value)\n      : type(scan_type::ulong_long_type), ulong_long_value(&value) {}\n  scan_arg(std::string& value) : type(scan_type::string_type), string(&value) {}\n  scan_arg(fmt::string_view& value)\n      : type(scan_type::string_view_type), string_view(&value) {}\n  template <typename T> scan_arg(T& value) : type(scan_type::custom_type) {\n    custom.value = &value;\n    custom.scan = scan_custom_arg<T>;\n  }\n\n private:\n  template <typename T>\n  static void scan_custom_arg(void* arg, scan_parse_context& parse_ctx,\n                              scan_context& ctx) {\n    scanner<T> s;\n    parse_ctx.advance_to(s.parse(parse_ctx));\n    ctx.advance_to(s.scan(*static_cast<T*>(arg), ctx));\n  }\n};\n}  // namespace detail\n\nstruct scan_args {\n  int size;\n  const detail::scan_arg* data;\n\n  template <size_t N>\n  scan_args(const std::array<detail::scan_arg, N>& store)\n      : size(N), data(store.data()) {\n    static_assert(N < INT_MAX, \"too many arguments\");\n  }\n};\n\nnamespace detail {\n\nstruct scan_handler : error_handler {\n private:\n  scan_parse_context parse_ctx_;\n  scan_context scan_ctx_;\n  scan_args args_;\n  int next_arg_id_;\n  scan_arg arg_;\n\n  template <typename T = unsigned> T read_uint() {\n    T value = 0;\n    auto it = scan_ctx_.begin(), end = scan_ctx_.end();\n    while (it != end) {\n      char c = *it++;\n      if (c < '0' || c > '9') on_error(\"invalid input\");\n      // TODO: check overflow\n      value = value * 10 + static_cast<unsigned>(c - '0');\n    }\n    scan_ctx_.advance_to(it);\n    return value;\n  }\n\n  template <typename T = int> T read_int() {\n    auto it = scan_ctx_.begin(), end = scan_ctx_.end();\n    bool negative = it != end && *it == '-';\n    if (negative) ++it;\n    scan_ctx_.advance_to(it);\n    const auto value = read_uint<typename std::make_unsigned<T>::type>();\n    if (negative) return -static_cast<T>(value);\n    return static_cast<T>(value);\n  }\n\n public:\n  scan_handler(string_view format, string_view input, scan_args args)\n      : parse_ctx_(format), scan_ctx_(input), args_(args), next_arg_id_(0) {}\n\n  const char* pos() const { return scan_ctx_.begin(); }\n\n  void on_text(const char* begin, const char* end) {\n    auto size = to_unsigned(end - begin);\n    auto it = scan_ctx_.begin();\n    if (it + size > scan_ctx_.end() ||\n        !std::equal(begin, end, make_checked(it, size))) {\n      on_error(\"invalid input\");\n    }\n    scan_ctx_.advance_to(it + size);\n  }\n\n  FMT_CONSTEXPR int on_arg_id() { return on_arg_id(next_arg_id_++); }\n  FMT_CONSTEXPR int on_arg_id(int id) {\n    if (id >= args_.size) on_error(\"argument index out of range\");\n    arg_ = args_.data[id];\n    return id;\n  }\n  FMT_CONSTEXPR int on_arg_id(string_view id) {\n    if (id.data()) on_error(\"invalid format\");\n    return 0;\n  }\n\n  void on_replacement_field(int, const char*) {\n    auto it = scan_ctx_.begin(), end = scan_ctx_.end();\n    switch (arg_.type) {\n    case scan_type::int_type:\n      *arg_.int_value = read_int();\n      break;\n    case scan_type::uint_type:\n      *arg_.uint_value = read_uint();\n      break;\n    case scan_type::long_long_type:\n      *arg_.long_long_value = read_int<long long>();\n      break;\n    case scan_type::ulong_long_type:\n      *arg_.ulong_long_value = read_uint<unsigned long long>();\n      break;\n    case scan_type::string_type:\n      while (it != end && *it != ' ') arg_.string->push_back(*it++);\n      scan_ctx_.advance_to(it);\n      break;\n    case scan_type::string_view_type: {\n      auto s = it;\n      while (it != end && *it != ' ') ++it;\n      *arg_.string_view = fmt::string_view(s, to_unsigned(it - s));\n      scan_ctx_.advance_to(it);\n      break;\n    }\n    case scan_type::none_type:\n    case scan_type::custom_type:\n      assert(false);\n    }\n  }\n\n  const char* on_format_specs(int, const char* begin, const char*) {\n    if (arg_.type != scan_type::custom_type) return begin;\n    parse_ctx_.advance_to(begin);\n    arg_.custom.scan(arg_.custom.value, parse_ctx_, scan_ctx_);\n    return parse_ctx_.begin();\n  }\n};\n}  // namespace detail\n\ntemplate <typename... Args>\nstd::array<detail::scan_arg, sizeof...(Args)> make_scan_args(Args&... args) {\n  return {{args...}};\n}\n\nstring_view::iterator vscan(string_view input, string_view format_str,\n                            scan_args args) {\n  detail::scan_handler h(format_str, input, args);\n  detail::parse_format_string<false>(format_str, h);\n  return input.begin() + (h.pos() - &*input.begin());\n}\n\ntemplate <typename... Args>\nstring_view::iterator scan(string_view input, string_view format_str,\n                           Args&... args) {\n  return vscan(input, format_str, make_scan_args(args...));\n}\nFMT_END_NAMESPACE\n"
  },
  {
    "path": "examples/libraries/fmt/test/static-export-test/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.1...3.18)\n\nproject(fmt-link CXX)\n\nset(BUILD_SHARED_LIBS OFF)\nset(CMAKE_VISIBILITY_INLINES_HIDDEN TRUE)\nset(CMAKE_CXX_VISIBILITY_PRESET \"hidden\")\n\n# Broken LTO on GCC 4\nif (CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5)\n  set(BROKEN_LTO ON)\nendif ()\n\nif (NOT BROKEN_LTO AND CMAKE_VERSION VERSION_GREATER \"3.8\")\n  # CMake 3.9+\n  include(CheckIPOSupported)\n  check_ipo_supported(RESULT HAVE_IPO)\n  if (HAVE_IPO)\n    set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)\n  endif ()\nendif ()\n\nadd_subdirectory(../.. fmt)\nset_property(TARGET fmt PROPERTY POSITION_INDEPENDENT_CODE ON)\n\nadd_library(library-test SHARED library.cc)\ntarget_link_libraries(library-test PRIVATE fmt::fmt)\n\nadd_executable(exe-test main.cc)\ntarget_link_libraries(exe-test PRIVATE library-test)\n"
  },
  {
    "path": "examples/libraries/fmt/test/static-export-test/library.cc",
    "content": "#include <fmt/compile.h>\n\n__attribute__((visibility(\"default\"))) std::string foo() {\n  return fmt::format(FMT_COMPILE(\"foo bar {}\"), 4242);\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/static-export-test/main.cc",
    "content": "#include <iostream>\n#include <string>\n\nextern std::string foo();\n\nint main() { std::cout << foo() << std::endl; }\n"
  },
  {
    "path": "examples/libraries/fmt/test/std-format-test.cc",
    "content": "#include <format>\n\n#include \"gtest/gtest.h\"\n\nTEST(std_format_test, escaping) {\n  using namespace std;\n  string s = format(\"{0}-{{\", 8);  // s == \"8-{\"\n  EXPECT_EQ(s, \"8-{\");\n}\n\nTEST(std_format_test, indexing) {\n  using namespace std;\n  string s0 = format(\"{} to {}\", \"a\", \"b\");    // OK: automatic indexing\n  string s1 = format(\"{1} to {0}\", \"a\", \"b\");  // OK: manual indexing\n  EXPECT_EQ(s0, \"a to b\");\n  EXPECT_EQ(s1, \"b to a\");\n  // Error: mixing automatic and manual indexing\n  EXPECT_THROW(string s2 = format(\"{0} to {}\", \"a\", \"b\"), std::format_error);\n  // Error: mixing automatic and manual indexing\n  EXPECT_THROW(string s3 = format(\"{} to {1}\", \"a\", \"b\"), std::format_error);\n}\n\nTEST(std_format_test, alignment) {\n  using namespace std;\n  char c = 120;\n  string s0 = format(\"{:6}\", 42);     // s0 == \"    42\"\n  string s1 = format(\"{:6}\", 'x');    // s1 == \"x     \"\n  string s2 = format(\"{:*<6}\", 'x');  // s2 == \"x*****\"\n  string s3 = format(\"{:*>6}\", 'x');  // s3 == \"*****x\"\n  string s4 = format(\"{:*^6}\", 'x');  // s4 == \"**x***\"\n  // Error: '=' with charT and no integer presentation type\n  EXPECT_THROW(string s5 = format(\"{:=6}\", 'x'), std::format_error);\n  string s6 = format(\"{:6d}\", c);    // s6 == \"   120\"\n  string s7 = format(\"{:6}\", true);  // s9 == \"true  \"\n  EXPECT_EQ(s0, \"    42\");\n  EXPECT_EQ(s1, \"x     \");\n  EXPECT_EQ(s2, \"x*****\");\n  EXPECT_EQ(s3, \"*****x\");\n  EXPECT_EQ(s4, \"**x***\");\n  EXPECT_EQ(s6, \"   120\");\n  EXPECT_EQ(s7, \"true  \");\n}\n\nTEST(std_format_test, float) {\n  using namespace std;\n  double inf = numeric_limits<double>::infinity();\n  double nan = numeric_limits<double>::quiet_NaN();\n  string s0 = format(\"{0:} {0:+} {0:-} {0: }\", 1);   // s0 == \"1 +1 1  1\"\n  string s1 = format(\"{0:} {0:+} {0:-} {0: }\", -1);  // s1 == \"-1 -1 -1 -1\"\n  string s2 =\n      format(\"{0:} {0:+} {0:-} {0: }\", inf);  // s2 == \"inf +inf inf  inf\"\n  string s3 =\n      format(\"{0:} {0:+} {0:-} {0: }\", nan);  // s3 == \"nan +nan nan  nan\"\n  EXPECT_EQ(s0, \"1 +1 1  1\");\n  EXPECT_EQ(s1, \"-1 -1 -1 -1\");\n  EXPECT_EQ(s2, \"inf +inf inf  inf\");\n  EXPECT_EQ(s3, \"nan +nan nan  nan\");\n}\n\nTEST(std_format_test, int) {\n  using namespace std;\n  string s0 = format(\"{}\", 42);                       // s0 == \"42\"\n  string s1 = format(\"{0:b} {0:d} {0:o} {0:x}\", 42);  // s1 == \"101010 42 52 2a\"\n  string s2 = format(\"{0:#x} {0:#X}\", 42);            // s2 == \"0x2a 0X2A\"\n  string s3 = format(\"{:L}\", 1234);  // s3 == \"1234\" (depends on the locale)\n  EXPECT_EQ(s0, \"42\");\n  EXPECT_EQ(s1, \"101010 42 52 2a\");\n  EXPECT_EQ(s2, \"0x2a 0X2A\");\n  EXPECT_EQ(s3, \"1234\");\n}\n\n#include <format>\n\nenum color { red, green, blue };\n\nconst char* color_names[] = {\"red\", \"green\", \"blue\"};\n\ntemplate <> struct std::formatter<color> : std::formatter<const char*> {\n  auto format(color c, format_context& ctx) {\n    return formatter<const char*>::format(color_names[c], ctx);\n  }\n};\n\nstruct err {};\n\nTEST(std_format_test, formatter) {\n  std::string s0 = std::format(\"{}\", 42);  // OK: library-provided formatter\n  // std::string s1 = std::format(\"{}\", L\"foo\"); // Ill-formed: disabled\n  // formatter\n  std::string s2 = std::format(\"{}\", red);  // OK: user-provided formatter\n  // std::string s3 = std::format(\"{}\", err{});  // Ill-formed: disabled\n  // formatter\n  EXPECT_EQ(s0, \"42\");\n  EXPECT_EQ(s2, \"red\");\n}\n\nstruct S {\n  int value;\n};\n\ntemplate <> struct std::formatter<S> {\n  size_t width_arg_id = 0;\n\n  // Parses a width argument id in the format { <digit> }.\n  constexpr auto parse(format_parse_context& ctx) {\n    constexpr auto is_ascii_digit = [](const char c) {\n      return c >= '0' && c <= '9';\n    };\n\n    auto iter = ctx.begin();\n    // auto get_char = [&]() { return iter != ctx.end() ? *iter : 0; };\n    auto get_char = [&]() { return iter != ctx.end() ? *iter : '\\0'; };\n    if (get_char() != '{') return iter;\n    ++iter;\n    char c = get_char();\n    if (!is_ascii_digit(c) || (++iter, get_char()) != '}')\n      throw format_error(\"invalid format\");\n    width_arg_id = fmt::detail::to_unsigned(c - '0');\n    ctx.check_arg_id(width_arg_id);\n    return ++iter;\n  }\n\n  // Formats S with width given by the argument width_arg_id.\n  auto format(S s, format_context& ctx) {\n    int width = visit_format_arg(\n        [](auto value) -> int {\n          using type = decltype(value);\n          if constexpr (!is_integral_v<type> || is_same_v<type, bool>)\n            throw format_error(\"width is not integral\");\n          // else if (value < 0 || value > numeric_limits<int>::max())\n          else if (fmt::detail::is_negative(value) ||\n                   value > numeric_limits<int>::max())\n            throw format_error(\"invalid width\");\n          else\n            return static_cast<int>(value);\n        },\n        ctx.arg(width_arg_id));\n    return format_to(ctx.out(), \"{0:{1}}\", s.value, width);\n  }\n};\n\nTEST(std_format_test, parsing) {\n  std::string s = std::format(\"{0:{1}}\", S{42}, 10);  // s == \"        42\"\n  EXPECT_EQ(s, \"        42\");\n}\n\n#if FMT_USE_INT128\ntemplate <> struct std::formatter<__int128_t> : std::formatter<long long> {\n  auto format(__int128_t n, format_context& ctx) {\n    // Format as a long long since we only want to check if it is possible to\n    // specialize formatter for __int128_t.\n    return formatter<long long>::format(static_cast<long long>(n), ctx);\n  }\n};\n\nTEST(std_format_test, int128) {\n  __int128_t n = 42;\n  auto s = std::format(\"{}\", n);\n  EXPECT_EQ(s, \"42\");\n}\n#endif  // FMT_USE_INT128\n"
  },
  {
    "path": "examples/libraries/fmt/test/test-assert.h",
    "content": "// Formatting library for C++ - test version of FMT_ASSERT\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#ifndef FMT_TEST_ASSERT_H_\n#define FMT_TEST_ASSERT_H_\n\n#include <stdexcept>\n\nvoid throw_assertion_failure(const char* message);\n#define FMT_ASSERT(condition, message) \\\n  if (!(condition)) throw_assertion_failure(message);\n\n#include \"gtest/gtest.h\"\n\nclass assertion_failure : public std::logic_error {\n public:\n  explicit assertion_failure(const char* message) : std::logic_error(message) {}\n\n private:\n  virtual void avoid_weak_vtable();\n};\n\nvoid assertion_failure::avoid_weak_vtable() {}\n\n// We use a separate function (rather than throw directly from FMT_ASSERT) to\n// avoid GCC's -Wterminate warning when FMT_ASSERT is used in a destructor.\ninline void throw_assertion_failure(const char* message) {\n  throw assertion_failure(message);\n}\n\n// Expects an assertion failure.\n#define EXPECT_ASSERT(stmt, message) \\\n  FMT_TEST_THROW_(stmt, assertion_failure, message, GTEST_NONFATAL_FAILURE_)\n\n#endif  // FMT_TEST_ASSERT_H_\n"
  },
  {
    "path": "examples/libraries/fmt/test/test-main.cc",
    "content": "// Formatting library for C++ - test main function.\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include <cstdlib>\n\n#include \"gtest/gtest.h\"\n\n#ifdef _WIN32\n#  include <windows.h>\n#endif\n\n#ifdef _MSC_VER\n#  include <crtdbg.h>\n#else\n#  define _CrtSetReportFile(a, b)\n#  define _CrtSetReportMode(a, b)\n#endif\n\nint main(int argc, char** argv) {\n#ifdef _WIN32\n  // Don't display any error dialogs. This also suppresses message boxes\n  // on assertion failures in MinGW where _set_error_mode/CrtSetReportMode\n  // doesn't help.\n  SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX |\n               SEM_NOOPENFILEERRORBOX);\n#endif\n  // Disable message boxes on assertion failures.\n  _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);\n  _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);\n  _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);\n  _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);\n  try {\n    testing::InitGoogleTest(&argc, argv);\n    return RUN_ALL_TESTS();\n  } catch (...) {\n    // Catch all exceptions to make Coverity happy.\n  }\n  return EXIT_FAILURE;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/unicode-test.cc",
    "content": "// Formatting library for C++ - Unicode tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include <iomanip>\n#include <locale>\n#include <vector>\n\n#include \"fmt/chrono.h\"\n#include \"gmock/gmock.h\"\n#include \"util.h\"  // get_locale\n\nusing testing::Contains;\n\nTEST(unicode_test, is_utf8) { EXPECT_TRUE(fmt::detail::is_utf8()); }\n\nTEST(unicode_test, legacy_locale) {\n  auto loc = get_locale(\"ru_RU.CP1251\", \"Russian.1251\");\n  if (loc == std::locale::classic()) return;\n\n  auto s = std::string();\n  try {\n    s = fmt::format(loc, \"День недели: {:L}\", fmt::weekday(1));\n  } catch (const fmt::format_error& e) {\n    // Formatting can fail due to an unsupported encoding.\n    fmt::print(\"Format error: {}\\n\", e.what());\n    return;\n  }\n\n#if !FMT_GCC_VERSION || FMT_GCC_VERSION >= 500\n  auto&& os = std::ostringstream();\n  os.imbue(loc);\n  auto tm = std::tm();\n  tm.tm_wday = 1;\n  os << std::put_time(&tm, \"%a\");\n  auto wd = os.str();\n  if (wd == \"??\") {\n    EXPECT_EQ(s, \"День недели: ??\");\n    fmt::print(\"std::locale gives ?? as a weekday.\\n\");\n    return;\n  }\n#endif\n  EXPECT_THAT((std::vector<std::string>{\"День недели: пн\", \"День недели: Пн\"}),\n              Contains(s));\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/util.cc",
    "content": "// Formatting library for C++ - test utilities\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include \"util.h\"\n\n#include <cstring>\n\nconst char* const file_content = \"Don't panic!\";\n\nfmt::buffered_file open_buffered_file(FILE** fp) {\n#if FMT_USE_FCNTL\n  fmt::file read_end, write_end;\n  fmt::file::pipe(read_end, write_end);\n  write_end.write(file_content, std::strlen(file_content));\n  write_end.close();\n  fmt::buffered_file f = read_end.fdopen(\"r\");\n  if (fp) *fp = f.get();\n#else\n  fmt::buffered_file f(\"test-file\", \"w\");\n  fputs(file_content, f.get());\n  if (fp) *fp = f.get();\n#endif\n  return f;\n}\n\nstd::locale do_get_locale(const char* name) {\n  try {\n    return std::locale(name);\n  } catch (const std::runtime_error&) {\n  }\n  return std::locale::classic();\n}\n\nstd::locale get_locale(const char* name, const char* alt_name) {\n  auto loc = do_get_locale(name);\n  if (loc == std::locale::classic() && alt_name) {\n    loc = do_get_locale(alt_name);\n  }\n  if (loc == std::locale::classic())\n    fmt::print(stderr, \"{} locale is missing.\\n\", name);\n  return loc;\n}\n"
  },
  {
    "path": "examples/libraries/fmt/test/util.h",
    "content": "// Formatting library for C++ - test utilities\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include <cstdarg>\n#include <cstdio>\n#include <locale>\n#include <string>\n\n#include \"fmt/os.h\"\n\n#ifdef _MSC_VER\n#  define FMT_VSNPRINTF vsprintf_s\n#else\n#  define FMT_VSNPRINTF vsnprintf\n#endif\n\ntemplate <size_t SIZE>\nvoid safe_sprintf(char (&buffer)[SIZE], const char* format, ...) {\n  std::va_list args;\n  va_start(args, format);\n  FMT_VSNPRINTF(buffer, SIZE, format, args);\n  va_end(args);\n}\n\nextern const char* const file_content;\n\n// Opens a buffered file for reading.\nfmt::buffered_file open_buffered_file(FILE** fp = nullptr);\n\ninline FILE* safe_fopen(const char* filename, const char* mode) {\n#if defined(_WIN32) && !defined(__MINGW32__)\n  // Fix MSVC warning about \"unsafe\" fopen.\n  FILE* f = 0;\n  errno = fopen_s(&f, filename, mode);\n  return f;\n#else\n  return std::fopen(filename, mode);\n#endif\n}\n\ntemplate <typename Char> class basic_test_string {\n private:\n  std::basic_string<Char> value_;\n\n  static const Char empty[];\n\n public:\n  explicit basic_test_string(const Char* value = empty) : value_(value) {}\n\n  const std::basic_string<Char>& value() const { return value_; }\n};\n\ntemplate <typename Char> const Char basic_test_string<Char>::empty[] = {0};\n\ntypedef basic_test_string<char> test_string;\ntypedef basic_test_string<wchar_t> test_wstring;\n\ntemplate <typename Char>\nstd::basic_ostream<Char>& operator<<(std::basic_ostream<Char>& os,\n                                     const basic_test_string<Char>& s) {\n  os << s.value();\n  return os;\n}\n\nclass date {\n  int year_, month_, day_;\n\n public:\n  date(int year, int month, int day) : year_(year), month_(month), day_(day) {}\n\n  int year() const { return year_; }\n  int month() const { return month_; }\n  int day() const { return day_; }\n};\n\n// Returns a locale with the given name if available or classic locale othewise.\nstd::locale get_locale(const char* name, const char* alt_name = nullptr);\n"
  },
  {
    "path": "examples/libraries/fmt/test/xchar-test.cc",
    "content": "// Formatting library for C++ - formatting library tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n//\n// For the license information refer to format.h.\n\n#include \"fmt/xchar.h\"\n\n#include <complex>\n\n#include \"fmt/chrono.h\"\n#include \"fmt/color.h\"\n#include \"fmt/ostream.h\"\n#include \"fmt/ranges.h\"\n#include \"gtest/gtest.h\"\n\nusing fmt::detail::max_value;\n\nnamespace test_ns {\ntemplate <typename Char> class test_string {\n private:\n  std::basic_string<Char> s_;\n\n public:\n  test_string(const Char* s) : s_(s) {}\n  const Char* data() const { return s_.data(); }\n  size_t length() const { return s_.size(); }\n  operator const Char*() const { return s_.c_str(); }\n};\n\ntemplate <typename Char>\nfmt::basic_string_view<Char> to_string_view(const test_string<Char>& s) {\n  return {s.data(), s.length()};\n}\n\nstruct non_string {};\n}  // namespace test_ns\n\ntemplate <typename T> class is_string_test : public testing::Test {};\n\nusing string_char_types = testing::Types<char, wchar_t, char16_t, char32_t>;\nTYPED_TEST_SUITE(is_string_test, string_char_types);\n\ntemplate <typename Char>\nstruct derived_from_string_view : fmt::basic_string_view<Char> {};\n\nTYPED_TEST(is_string_test, is_string) {\n  EXPECT_TRUE(fmt::detail::is_string<TypeParam*>::value);\n  EXPECT_TRUE(fmt::detail::is_string<const TypeParam*>::value);\n  EXPECT_TRUE(fmt::detail::is_string<TypeParam[2]>::value);\n  EXPECT_TRUE(fmt::detail::is_string<const TypeParam[2]>::value);\n  EXPECT_TRUE(fmt::detail::is_string<std::basic_string<TypeParam>>::value);\n  EXPECT_TRUE(fmt::detail::is_string<fmt::basic_string_view<TypeParam>>::value);\n  EXPECT_TRUE(\n      fmt::detail::is_string<derived_from_string_view<TypeParam>>::value);\n  using fmt_string_view = fmt::detail::std_string_view<TypeParam>;\n  EXPECT_TRUE(std::is_empty<fmt_string_view>::value !=\n              fmt::detail::is_string<fmt_string_view>::value);\n  EXPECT_TRUE(fmt::detail::is_string<test_ns::test_string<TypeParam>>::value);\n  EXPECT_FALSE(fmt::detail::is_string<test_ns::non_string>::value);\n}\n\n// std::is_constructible is broken in MSVC until version 2015.\n#if !FMT_MSC_VER || FMT_MSC_VER >= 1900\nstruct explicitly_convertible_to_wstring_view {\n  explicit operator fmt::wstring_view() const { return L\"foo\"; }\n};\n\nTEST(xchar_test, format_explicitly_convertible_to_wstring_view) {\n  EXPECT_EQ(L\"foo\",\n            fmt::format(L\"{}\", explicitly_convertible_to_wstring_view()));\n}\n#endif\n\nTEST(xchar_test, format) {\n  EXPECT_EQ(L\"42\", fmt::format(L\"{}\", 42));\n  EXPECT_EQ(L\"4.2\", fmt::format(L\"{}\", 4.2));\n  EXPECT_EQ(L\"abc\", fmt::format(L\"{}\", L\"abc\"));\n  EXPECT_EQ(L\"z\", fmt::format(L\"{}\", L'z'));\n  EXPECT_THROW(fmt::format(L\"{:*\\x343E}\", 42), fmt::format_error);\n  EXPECT_EQ(L\"true\", fmt::format(L\"{}\", true));\n  EXPECT_EQ(L\"a\", fmt::format(L\"{0}\", 'a'));\n  EXPECT_EQ(L\"a\", fmt::format(L\"{0}\", L'a'));\n  EXPECT_EQ(L\"Cyrillic letter \\x42e\",\n            fmt::format(L\"Cyrillic letter {}\", L'\\x42e'));\n  EXPECT_EQ(L\"abc1\", fmt::format(L\"{}c{}\", L\"ab\", 1));\n}\n\nTEST(xchar_test, compile_time_string) {\n#if defined(FMT_USE_STRING_VIEW) && __cplusplus >= 201703L\n  EXPECT_EQ(L\"42\", fmt::format(FMT_STRING(std::wstring_view(L\"{}\")), 42));\n#endif\n}\n\n#if __cplusplus > 201103L\nstruct custom_char {\n  int value;\n  custom_char() = default;\n\n  template <typename T>\n  constexpr custom_char(T val) : value(static_cast<int>(val)) {}\n\n  operator int() const { return value; }\n};\n\nint to_ascii(custom_char c) { return c; }\n\nFMT_BEGIN_NAMESPACE\ntemplate <> struct is_char<custom_char> : std::true_type {};\nFMT_END_NAMESPACE\n\nTEST(xchar_test, format_custom_char) {\n  const custom_char format[] = {'{', '}', 0};\n  auto result = fmt::format(format, custom_char('x'));\n  EXPECT_EQ(result.size(), 1);\n  EXPECT_EQ(result[0], custom_char('x'));\n}\n#endif\n\n// Convert a char8_t string to std::string. Otherwise GTest will insist on\n// inserting `char8_t` NTBS into a `char` stream which is disabled by P1423.\ntemplate <typename S> std::string from_u8str(const S& str) {\n  return std::string(str.begin(), str.end());\n}\n\nTEST(xchar_test, format_utf8_precision) {\n  using str_type = std::basic_string<fmt::detail::char8_type>;\n  auto format =\n      str_type(reinterpret_cast<const fmt::detail::char8_type*>(u8\"{:.4}\"));\n  auto str = str_type(reinterpret_cast<const fmt::detail::char8_type*>(\n      u8\"caf\\u00e9s\"));  // cafés\n  auto result = fmt::format(format, str);\n  EXPECT_EQ(fmt::detail::compute_width(result), 4);\n  EXPECT_EQ(result.size(), 5);\n  EXPECT_EQ(from_u8str(result), from_u8str(str.substr(0, 5)));\n}\n\nTEST(xchar_test, format_to) {\n  auto buf = std::vector<wchar_t>();\n  fmt::format_to(std::back_inserter(buf), L\"{}{}\", 42, L'\\0');\n  EXPECT_STREQ(buf.data(), L\"42\");\n}\n\nTEST(xchar_test, vformat_to) {\n  using wcontext = fmt::wformat_context;\n  fmt::basic_format_arg<wcontext> warg = fmt::detail::make_arg<wcontext>(42);\n  auto wargs = fmt::basic_format_args<wcontext>(&warg, 1);\n  auto w = std::wstring();\n  fmt::vformat_to(std::back_inserter(w), L\"{}\", wargs);\n  EXPECT_EQ(L\"42\", w);\n  w.clear();\n  fmt::vformat_to(std::back_inserter(w), FMT_STRING(L\"{}\"), wargs);\n  EXPECT_EQ(L\"42\", w);\n}\n\nTEST(format_test, wide_format_to_n) {\n  wchar_t buffer[4];\n  buffer[3] = L'x';\n  auto result = fmt::format_to_n(buffer, 3, L\"{}\", 12345);\n  EXPECT_EQ(5u, result.size);\n  EXPECT_EQ(buffer + 3, result.out);\n  EXPECT_EQ(L\"123x\", fmt::wstring_view(buffer, 4));\n  buffer[0] = L'x';\n  buffer[1] = L'x';\n  buffer[2] = L'x';\n  result = fmt::format_to_n(buffer, 3, L\"{}\", L'A');\n  EXPECT_EQ(1u, result.size);\n  EXPECT_EQ(buffer + 1, result.out);\n  EXPECT_EQ(L\"Axxx\", fmt::wstring_view(buffer, 4));\n  result = fmt::format_to_n(buffer, 3, L\"{}{} \", L'B', L'C');\n  EXPECT_EQ(3u, result.size);\n  EXPECT_EQ(buffer + 3, result.out);\n  EXPECT_EQ(L\"BC x\", fmt::wstring_view(buffer, 4));\n}\n\n#if FMT_USE_USER_DEFINED_LITERALS\nTEST(xchar_test, format_udl) {\n  using namespace fmt::literals;\n  EXPECT_EQ(L\"{}c{}\"_format(L\"ab\", 1), fmt::format(L\"{}c{}\", L\"ab\", 1));\n}\n\nTEST(xchar_test, named_arg_udl) {\n  using namespace fmt::literals;\n  auto udl_a =\n      fmt::format(L\"{first}{second}{first}{third}\", L\"first\"_a = L\"abra\",\n                  L\"second\"_a = L\"cad\", L\"third\"_a = 99);\n  EXPECT_EQ(\n      fmt::format(L\"{first}{second}{first}{third}\", fmt::arg(L\"first\", L\"abra\"),\n                  fmt::arg(L\"second\", L\"cad\"), fmt::arg(L\"third\", 99)),\n      udl_a);\n}\n#endif  // FMT_USE_USER_DEFINED_LITERALS\n\nTEST(xchar_test, print) {\n  // Check that the wide print overload compiles.\n  if (fmt::detail::const_check(false)) fmt::print(L\"test\");\n}\n\nTEST(xchar_test, join) {\n  int v[3] = {1, 2, 3};\n  EXPECT_EQ(fmt::format(L\"({})\", fmt::join(v, v + 3, L\", \")), L\"(1, 2, 3)\");\n  auto t = std::tuple<wchar_t, int, float>('a', 1, 2.0f);\n  EXPECT_EQ(fmt::format(L\"({})\", fmt::join(t, L\", \")), L\"(a, 1, 2)\");\n}\n\nenum streamable_enum {};\n\nstd::wostream& operator<<(std::wostream& os, streamable_enum) {\n  return os << L\"streamable_enum\";\n}\n\nenum unstreamable_enum {};\n\nTEST(xchar_test, enum) {\n  EXPECT_EQ(L\"streamable_enum\", fmt::format(L\"{}\", streamable_enum()));\n  EXPECT_EQ(L\"0\", fmt::format(L\"{}\", unstreamable_enum()));\n}\n\nTEST(xchar_test, sign_not_truncated) {\n  wchar_t format_str[] = {\n      L'{', L':',\n      '+' | static_cast<wchar_t>(1 << fmt::detail::num_bits<char>()), L'}', 0};\n  EXPECT_THROW(fmt::format(format_str, 42), fmt::format_error);\n}\n\nnamespace fake_qt {\nclass QString {\n public:\n  QString(const wchar_t* s) : s_(s) {}\n  const wchar_t* utf16() const FMT_NOEXCEPT { return s_.data(); }\n  int size() const FMT_NOEXCEPT { return static_cast<int>(s_.size()); }\n\n private:\n  std::wstring s_;\n};\n\nfmt::basic_string_view<wchar_t> to_string_view(const QString& s) FMT_NOEXCEPT {\n  return {s.utf16(), static_cast<size_t>(s.size())};\n}\n}  // namespace fake_qt\n\nTEST(format_test, format_foreign_strings) {\n  using fake_qt::QString;\n  EXPECT_EQ(fmt::format(QString(L\"{}\"), 42), L\"42\");\n  EXPECT_EQ(fmt::format(QString(L\"{}\"), QString(L\"42\")), L\"42\");\n}\n\nTEST(xchar_test, chrono) {\n  auto tm = std::tm();\n  tm.tm_year = 116;\n  tm.tm_mon = 3;\n  tm.tm_mday = 25;\n  tm.tm_hour = 11;\n  tm.tm_min = 22;\n  tm.tm_sec = 33;\n  EXPECT_EQ(fmt::format(\"The date is {:%Y-%m-%d %H:%M:%S}.\", tm),\n            \"The date is 2016-04-25 11:22:33.\");\n  EXPECT_EQ(L\"42s\", fmt::format(L\"{}\", std::chrono::seconds(42)));\n}\n\nTEST(xchar_test, color) {\n  EXPECT_EQ(fmt::format(fg(fmt::rgb(255, 20, 30)), L\"rgb(255,20,30) wide\"),\n            L\"\\x1b[38;2;255;020;030mrgb(255,20,30) wide\\x1b[0m\");\n}\n\nTEST(xchar_test, ostream) {\n  std::wostringstream wos;\n  fmt::print(wos, L\"Don't {}!\", L\"panic\");\n  EXPECT_EQ(L\"Don't panic!\", wos.str());\n}\n\nTEST(xchar_test, to_wstring) { EXPECT_EQ(L\"42\", fmt::to_wstring(42)); }\n\n#ifndef FMT_STATIC_THOUSANDS_SEPARATOR\ntemplate <typename Char> struct numpunct : std::numpunct<Char> {\n protected:\n  Char do_decimal_point() const override { return '?'; }\n  std::string do_grouping() const override { return \"\\03\"; }\n  Char do_thousands_sep() const override { return '~'; }\n};\n\ntemplate <typename Char> struct no_grouping : std::numpunct<Char> {\n protected:\n  Char do_decimal_point() const override { return '.'; }\n  std::string do_grouping() const override { return \"\"; }\n  Char do_thousands_sep() const override { return ','; }\n};\n\ntemplate <typename Char> struct special_grouping : std::numpunct<Char> {\n protected:\n  Char do_decimal_point() const override { return '.'; }\n  std::string do_grouping() const override { return \"\\03\\02\"; }\n  Char do_thousands_sep() const override { return ','; }\n};\n\ntemplate <typename Char> struct small_grouping : std::numpunct<Char> {\n protected:\n  Char do_decimal_point() const override { return '.'; }\n  std::string do_grouping() const override { return \"\\01\"; }\n  Char do_thousands_sep() const override { return ','; }\n};\n\nTEST(locale_test, double_decimal_point) {\n  auto loc = std::locale(std::locale(), new numpunct<char>());\n  EXPECT_EQ(\"1?23\", fmt::format(loc, \"{:L}\", 1.23));\n  EXPECT_EQ(\"1?230000\", fmt::format(loc, \"{:Lf}\", 1.23));\n}\n\nTEST(locale_test, format) {\n  auto loc = std::locale(std::locale(), new numpunct<char>());\n  EXPECT_EQ(\"1234567\", fmt::format(std::locale(), \"{:L}\", 1234567));\n  EXPECT_EQ(\"1~234~567\", fmt::format(loc, \"{:L}\", 1234567));\n  EXPECT_EQ(\"-1~234~567\", fmt::format(loc, \"{:L}\", -1234567));\n  EXPECT_EQ(\"-256\", fmt::format(loc, \"{:L}\", -256));\n  fmt::format_arg_store<fmt::format_context, int> as{1234567};\n  EXPECT_EQ(\"1~234~567\", fmt::vformat(loc, \"{:L}\", fmt::format_args(as)));\n  auto s = std::string();\n  fmt::format_to(std::back_inserter(s), loc, \"{:L}\", 1234567);\n  EXPECT_EQ(\"1~234~567\", s);\n\n  auto no_grouping_loc = std::locale(std::locale(), new no_grouping<char>());\n  EXPECT_EQ(\"1234567\", fmt::format(no_grouping_loc, \"{:L}\", 1234567));\n\n  auto special_grouping_loc =\n      std::locale(std::locale(), new special_grouping<char>());\n  EXPECT_EQ(\"1,23,45,678\", fmt::format(special_grouping_loc, \"{:L}\", 12345678));\n  EXPECT_EQ(\"12,345\", fmt::format(special_grouping_loc, \"{:L}\", 12345));\n\n  auto small_grouping_loc =\n      std::locale(std::locale(), new small_grouping<char>());\n  EXPECT_EQ(\"4,2,9,4,9,6,7,2,9,5\",\n            fmt::format(small_grouping_loc, \"{:L}\", max_value<uint32_t>()));\n}\n\nTEST(locale_test, format_detault_align) {\n  auto loc = std::locale({}, new special_grouping<char>());\n  EXPECT_EQ(\"  12,345\", fmt::format(loc, \"{:8L}\", 12345));\n}\n\nTEST(locale_test, format_plus) {\n  auto loc = std::locale({}, new special_grouping<char>());\n  EXPECT_EQ(\"+100\", fmt::format(loc, \"{:+L}\", 100));\n}\n\nTEST(locale_test, wformat) {\n  auto loc = std::locale(std::locale(), new numpunct<wchar_t>());\n  EXPECT_EQ(L\"1234567\", fmt::format(std::locale(), L\"{:L}\", 1234567));\n  EXPECT_EQ(L\"1~234~567\", fmt::format(loc, L\"{:L}\", 1234567));\n  using wcontext = fmt::buffer_context<wchar_t>;\n  fmt::format_arg_store<wcontext, int> as{1234567};\n  EXPECT_EQ(L\"1~234~567\",\n            fmt::vformat(loc, L\"{:L}\", fmt::basic_format_args<wcontext>(as)));\n  EXPECT_EQ(L\"1234567\", fmt::format(std::locale(\"C\"), L\"{:L}\", 1234567));\n\n  auto no_grouping_loc = std::locale(std::locale(), new no_grouping<wchar_t>());\n  EXPECT_EQ(L\"1234567\", fmt::format(no_grouping_loc, L\"{:L}\", 1234567));\n\n  auto special_grouping_loc =\n      std::locale(std::locale(), new special_grouping<wchar_t>());\n  EXPECT_EQ(L\"1,23,45,678\",\n            fmt::format(special_grouping_loc, L\"{:L}\", 12345678));\n\n  auto small_grouping_loc =\n      std::locale(std::locale(), new small_grouping<wchar_t>());\n  EXPECT_EQ(L\"4,2,9,4,9,6,7,2,9,5\",\n            fmt::format(small_grouping_loc, L\"{:L}\", max_value<uint32_t>()));\n}\n\nTEST(locale_test, double_formatter) {\n  auto loc = std::locale(std::locale(), new special_grouping<char>());\n  auto f = fmt::formatter<int>();\n  auto parse_ctx = fmt::format_parse_context(\"L\");\n  f.parse(parse_ctx);\n  char buf[10] = {};\n  fmt::basic_format_context<char*, char> format_ctx(\n      buf, {}, fmt::detail::locale_ref(loc));\n  *f.format(12345, format_ctx) = 0;\n  EXPECT_STREQ(\"12,345\", buf);\n}\n\nFMT_BEGIN_NAMESPACE\ntemplate <class charT> struct formatter<std::complex<double>, charT> {\n private:\n  detail::dynamic_format_specs<char> specs_;\n\n public:\n  FMT_CONSTEXPR typename basic_format_parse_context<charT>::iterator parse(\n      basic_format_parse_context<charT>& ctx) {\n    using handler_type =\n        detail::dynamic_specs_handler<basic_format_parse_context<charT>>;\n    detail::specs_checker<handler_type> handler(handler_type(specs_, ctx),\n                                                detail::type::string_type);\n    auto it = parse_format_specs(ctx.begin(), ctx.end(), handler);\n    detail::parse_float_type_spec(specs_, ctx.error_handler());\n    return it;\n  }\n\n  template <class FormatContext>\n  typename FormatContext::iterator format(const std::complex<double>& c,\n                                          FormatContext& ctx) {\n    detail::handle_dynamic_spec<detail::precision_checker>(\n        specs_.precision, specs_.precision_ref, ctx);\n    auto specs = std::string();\n    if (specs_.precision > 0) specs = fmt::format(\".{}\", specs_.precision);\n    if (specs_.type) specs += specs_.type;\n    auto real = fmt::format(ctx.locale().template get<std::locale>(),\n                            fmt::runtime(\"{:\" + specs + \"}\"), c.real());\n    auto imag = fmt::format(ctx.locale().template get<std::locale>(),\n                            fmt::runtime(\"{:\" + specs + \"}\"), c.imag());\n    auto fill_align_width = std::string();\n    if (specs_.width > 0) fill_align_width = fmt::format(\">{}\", specs_.width);\n    return format_to(ctx.out(), runtime(\"{:\" + fill_align_width + \"}\"),\n                     c.real() != 0 ? fmt::format(\"({}+{}i)\", real, imag)\n                                   : fmt::format(\"{}i\", imag));\n  }\n};\nFMT_END_NAMESPACE\n\nTEST(locale_test, complex) {\n  std::string s = fmt::format(\"{}\", std::complex<double>(1, 2));\n  EXPECT_EQ(s, \"(1+2i)\");\n  EXPECT_EQ(fmt::format(\"{:.2f}\", std::complex<double>(1, 2)), \"(1.00+2.00i)\");\n  EXPECT_EQ(fmt::format(\"{:8}\", std::complex<double>(1, 2)), \"  (1+2i)\");\n}\n\n#endif  // FMT_STATIC_THOUSANDS_SEPARATOR\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/.circleci/config.yml",
    "content": "version: 2\n\njobs:\n  inspect:\n    environment:\n      - BOOST_LIBRARY=multiprecision\n      - CXX_STANDARD=gnu++11\n    docker:\n      - image: gcc:7\n    steps:\n      - checkout\n      - run:\n          name: Setting up Environment\n          command: |\n            echo 'export BOOST=\"$HOME/boost-local\"' >> $BASH_ENV\n            if [ $CIRCLE_BRANCH = \"master\" ]; then\n                echo 'export BOOST_BRANCH=\"master\"' >> $BASH_ENV;\n            else\n                echo 'export BOOST_BRANCH=\"develop\"' >> $BASH_ENV;\n            fi\n            echo 'export BOOST_REMOVE=\"$BOOST/boost/libs/$BOOST_LIBRARY\"' >> $BASH_ENV\n            HOME_SED_=$(echo $HOME | sed -e 's/\\//\\\\\\//g')\n            echo 'export HOME_SED=$HOME_SED_' >> $BASH_ENV\n      - run:\n          name: install pre dependencies\n          command: |\n            apt-get update -yqq\n            apt-get install git xsltproc docbook-xsl docbook-xml -y\n      - run:\n          name: Initializing git repo for boost\n          command: |\n            echo BOOST=$BOOST BOOST_REMOVE=$BOOST_REMOVE BOOST_LIBRARY=$BOOST_LIBRARY BOOST_BRANCH=$BOOST_BRANCH PWD=$PWD\n            mkdir $BOOST\n            cd $BOOST\n            git clone --single-branch --branch $BOOST_BRANCH https://github.com/boostorg/boost.git\n            cd boost\n            git submodule update --init --merge\n            rm -rf $BOOST_REMOVE\n            mv $HOME/project $BOOST_REMOVE\n      - run:\n          name: Bootstrapping boost-build\n          command: |\n            cd $BOOST/boost && ./bootstrap.sh && ./b2 headers\n            echo \"using xsltproc ;\" | tee $HOME/user-config.jam\n            echo \"using boostbook : /usr/share/xml/docbook/stylesheet/docbook-xsl : /usr/share/sgml/docbook/dtd/xml/4.2 ;\" | tee -a $HOME/user-config.jam\n      - run:\n          name: Building inspect\n          command: |\n            cd $BOOST/boost/tools/inspect/build && ../../../b2 -j2 address-model=64 architecture=x86 toolset=gcc cxxflags=\"-std=gnu++14\" release dist-bin\n      - run:\n          name: Building docs\n          command: |\n            cd $BOOST_REMOVE/doc && rm -rf html/boost_multiprecision && ../../../b2 -j2 address-model=64 architecture=x86 toolset=gcc cxxflags=\"-std=gnu++14\" release\n      - run:\n          name: Running Inspect\n          command: |\n            cd $BOOST_REMOVE && ../../dist/bin/inspect -text\n  specfun_mpfr:\n    environment:\n      - BOOST_LIBRARY=multiprecision\n      - CXX_STANDARD=gnu++17\n    docker:\n      - image: gcc:9\n    steps:\n      - checkout\n      - run:\n          name: Setting up Environment\n          command: |\n            echo 'export BOOST=\"$HOME/boost-local\"' >> $BASH_ENV\n            if [ $CIRCLE_BRANCH = \"master\" ]; then\n                echo 'export BOOST_BRANCH=\"master\"' >> $BASH_ENV;\n            else\n                echo 'export BOOST_BRANCH=\"develop\"' >> $BASH_ENV;\n            fi\n            echo 'export BOOST_REMOVE=\"$BOOST/boost/libs/$BOOST_LIBRARY\"' >> $BASH_ENV\n            HOME_SED_=$(echo $HOME | sed -e 's/\\//\\\\\\//g')\n            echo 'export HOME_SED=$HOME_SED_' >> $BASH_ENV\n      - run:\n          name: install pre dependencies\n          command: |\n            apt-get update -yqq\n            apt-get install git libmpfr-dev libgmp-dev -y\n      - run:\n          name: Initializing git repo for boost\n          command: |\n            echo BOOST=$BOOST BOOST_REMOVE=$BOOST_REMOVE BOOST_LIBRARY=$BOOST_LIBRARY BOOST_BRANCH=$BOOST_BRANCH PWD=$PWD\n            mkdir $BOOST\n            cd $BOOST\n            git clone --single-branch --branch $BOOST_BRANCH https://github.com/boostorg/boost.git\n            cd boost\n            git submodule update --init --merge\n            rm -rf $BOOST_REMOVE\n            mv $HOME/project $BOOST_REMOVE\n      - run:\n          name: Bootstrapping boost-build\n          command: |\n            cd $BOOST/boost && ./bootstrap.sh && ./b2 headers\n      - run:\n          name: Building specfun MPFR Tests\n          command: |\n            cd $BOOST/boost/libs/multiprecision/test && ../../../b2 -j2 address-model=64 architecture=x86 toolset=gcc cxxstd=17 cxxstd-dialect=gnu specfun_mpfr\n  specfun_gmp:\n    environment:\n      - BOOST_LIBRARY=multiprecision\n      - CXX_STANDARD=gnu++17\n    docker:\n      - image: gcc:9\n    steps:\n      - checkout\n      - run:\n          name: Setting up Environment\n          command: |\n            echo 'export BOOST=\"$HOME/boost-local\"' >> $BASH_ENV\n            if [ $CIRCLE_BRANCH = \"master\" ]; then\n                echo 'export BOOST_BRANCH=\"master\"' >> $BASH_ENV;\n            else\n                echo 'export BOOST_BRANCH=\"develop\"' >> $BASH_ENV;\n            fi\n            echo 'export BOOST_REMOVE=\"$BOOST/boost/libs/$BOOST_LIBRARY\"' >> $BASH_ENV\n            HOME_SED_=$(echo $HOME | sed -e 's/\\//\\\\\\//g')\n            echo 'export HOME_SED=$HOME_SED_' >> $BASH_ENV\n      - run:\n          name: install pre dependencies\n          command: |\n            apt-get update -yqq\n            apt-get install git libgmp-dev -y\n      - run:\n          name: Initializing git repo for boost\n          command: |\n            echo BOOST=$BOOST BOOST_REMOVE=$BOOST_REMOVE BOOST_LIBRARY=$BOOST_LIBRARY BOOST_BRANCH=$BOOST_BRANCH PWD=$PWD\n            mkdir $BOOST\n            cd $BOOST\n            git clone --single-branch --branch $BOOST_BRANCH https://github.com/boostorg/boost.git\n            cd boost\n            git submodule update --init --merge\n            rm -rf $BOOST_REMOVE\n            mv $HOME/project $BOOST_REMOVE\n      - run:\n          name: Bootstrapping boost-build\n          command: |\n            cd $BOOST/boost && ./bootstrap.sh && ./b2 headers\n      - run:\n          name: Building specfun GMP Tests\n          command: |\n            cd $BOOST/boost/libs/multiprecision/test && ../../../b2 -j2 address-model=64 architecture=x86 toolset=gcc cxxstd=17 cxxstd-dialect=gnu specfun_gmp\n  specfun_cpp_dec_float:\n    environment:\n      - BOOST_LIBRARY=multiprecision\n      - CXX_STANDARD=gnu++17\n    docker:\n      - image: gcc:9\n    steps:\n      - checkout\n      - run:\n          name: Setting up Environment\n          command: |\n            echo 'export BOOST=\"$HOME/boost-local\"' >> $BASH_ENV\n            if [ $CIRCLE_BRANCH = \"master\" ]; then\n                echo 'export BOOST_BRANCH=\"master\"' >> $BASH_ENV;\n            else\n                echo 'export BOOST_BRANCH=\"develop\"' >> $BASH_ENV;\n            fi\n            echo 'export BOOST_REMOVE=\"$BOOST/boost/libs/$BOOST_LIBRARY\"' >> $BASH_ENV\n            HOME_SED_=$(echo $HOME | sed -e 's/\\//\\\\\\//g')\n            echo 'export HOME_SED=$HOME_SED_' >> $BASH_ENV\n      - run:\n          name: install pre dependencies\n          command: |\n            apt-get update -yqq\n            apt-get install git -y\n      - run:\n          name: Initializing git repo for boost\n          command: |\n            echo BOOST=$BOOST BOOST_REMOVE=$BOOST_REMOVE BOOST_LIBRARY=$BOOST_LIBRARY BOOST_BRANCH=$BOOST_BRANCH PWD=$PWD\n            mkdir $BOOST\n            cd $BOOST\n            git clone --single-branch --branch $BOOST_BRANCH https://github.com/boostorg/boost.git\n            cd boost\n            git submodule update --init --merge\n            rm -rf $BOOST_REMOVE\n            mv $HOME/project $BOOST_REMOVE\n      - run:\n          name: Bootstrapping boost-build\n          command: |\n            cd $BOOST/boost && ./bootstrap.sh && ./b2 headers\n      - run:\n          name: Building specfun cpp_dec_float Tests\n          command: |\n            cd $BOOST/boost/libs/multiprecision/test && ../../../b2 -j2 address-model=64 architecture=x86 toolset=gcc cxxstd=17 cxxstd-dialect=gnu specfun_cpp_dec_float\n  specfun_cpp_bin_float:\n    environment:\n      - BOOST_LIBRARY=multiprecision\n      - CXX_STANDARD=gnu++17\n    docker:\n      - image: gcc:9\n    steps:\n      - checkout\n      - run:\n          name: Setting up Environment\n          command: |\n            echo 'export BOOST=\"$HOME/boost-local\"' >> $BASH_ENV\n            if [ $CIRCLE_BRANCH = \"master\" ]; then\n                echo 'export BOOST_BRANCH=\"master\"' >> $BASH_ENV;\n            else\n                echo 'export BOOST_BRANCH=\"develop\"' >> $BASH_ENV;\n            fi\n            echo 'export BOOST_REMOVE=\"$BOOST/boost/libs/$BOOST_LIBRARY\"' >> $BASH_ENV\n            HOME_SED_=$(echo $HOME | sed -e 's/\\//\\\\\\//g')\n            echo 'export HOME_SED=$HOME_SED_' >> $BASH_ENV\n      - run:\n          name: install pre dependencies\n          command: |\n            apt-get update -yqq\n            apt-get install git -y\n      - run:\n          name: Initializing git repo for boost\n          command: |\n            echo BOOST=$BOOST BOOST_REMOVE=$BOOST_REMOVE BOOST_LIBRARY=$BOOST_LIBRARY BOOST_BRANCH=$BOOST_BRANCH PWD=$PWD\n            mkdir $BOOST\n            cd $BOOST\n            git clone --single-branch --branch $BOOST_BRANCH https://github.com/boostorg/boost.git\n            cd boost\n            git submodule update --init --merge\n            rm -rf $BOOST_REMOVE\n            mv $HOME/project $BOOST_REMOVE\n      - run:\n          name: Bootstrapping boost-build\n          command: |\n            cd $BOOST/boost && ./bootstrap.sh && ./b2 headers\n      - run:\n          name: Building specfun cpp_bin_float Tests\n          command: |\n            cd $BOOST/boost/libs/multiprecision/test && ../../../b2 -j2 address-model=64 architecture=x86 toolset=gcc cxxstd=17 cxxstd-dialect=gnu specfun_cpp_bin_float\n  specfun_float128:\n    environment:\n      - BOOST_LIBRARY=multiprecision\n      - CXX_STANDARD=gnu++17\n    docker:\n      - image: gcc:9\n    steps:\n      - checkout\n      - run:\n          name: Setting up Environment\n          command: |\n            echo 'export BOOST=\"$HOME/boost-local\"' >> $BASH_ENV\n            if [ $CIRCLE_BRANCH = \"master\" ]; then\n                echo 'export BOOST_BRANCH=\"master\"' >> $BASH_ENV;\n            else\n                echo 'export BOOST_BRANCH=\"develop\"' >> $BASH_ENV;\n            fi\n            echo 'export BOOST_REMOVE=\"$BOOST/boost/libs/$BOOST_LIBRARY\"' >> $BASH_ENV\n            HOME_SED_=$(echo $HOME | sed -e 's/\\//\\\\\\//g')\n            echo 'export HOME_SED=$HOME_SED_' >> $BASH_ENV\n      - run:\n          name: install pre dependencies\n          command: |\n            apt-get update -yqq\n            apt-get install git -y\n      - run:\n          name: Initializing git repo for boost\n          command: |\n            echo BOOST=$BOOST BOOST_REMOVE=$BOOST_REMOVE BOOST_LIBRARY=$BOOST_LIBRARY BOOST_BRANCH=$BOOST_BRANCH PWD=$PWD\n            mkdir $BOOST\n            cd $BOOST\n            git clone --single-branch --branch $BOOST_BRANCH https://github.com/boostorg/boost.git\n            cd boost\n            git submodule update --init --merge\n            rm -rf $BOOST_REMOVE\n            mv $HOME/project $BOOST_REMOVE\n      - run:\n          name: Bootstrapping boost-build\n          command: |\n            cd $BOOST/boost && ./bootstrap.sh && ./b2 headers\n      - run:\n          name: Building specfun float128 Tests\n          command: |\n            cd $BOOST/boost/libs/multiprecision/test && ../../../b2 -j2 address-model=64 architecture=x86 toolset=gcc cxxstd=17 cxxstd-dialect=gnu specfun_float128\nworkflows:\n  version: 2\n  build_and_test:\n    jobs:\n      - inspect\n      - specfun_mpfr\n      - specfun_gmp\n      - specfun_cpp_dec_float\n      - specfun_float128\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/.clang-format",
    "content": "\nLanguage: Cpp\n\nUseTab: Never\nIndentWidth: 3\nBreakBeforeBraces: Allman\nIndentCaseLabels: false\nColumnLimit: 0\nAlignConsecutiveAssignments: true\nAlignConsecutiveDeclarations: true\nAlignEscapedNewlines: Left\nAlignOperands: true\nAlignTrailingComments: true\nFixNamespaceComments: true\nNamespaceIndentation: None\nStandard: Cpp03\nCompactNamespaces: true\nBreakBeforeBraces: Custom\nBraceWrapping:\n  AfterEnum: true\n  AfterStruct: true\n  SplitEmptyFunction: false\n  AfterClass: true\n  AfterControlStatement: true\n  AfterFunction: true\n  AfterNamespace: false\n  AfterUnion: true\n  BeforeCatch: true\n  BeforeElse: true\n  SplitEmptyFunction: false\n  SplitEmptyRecord: false\nPointerAlignment: Left\nSortIncludes: false\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/.drone/after-success.sh",
    "content": "#!/bin/bash\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/.drone/before-install.sh",
    "content": "#!/bin/bash\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/.drone/before-script.sh",
    "content": "#!/bin/bash\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/.drone/boost.sh",
    "content": "#!/bin/bash\n\nset -ex\nexport TRAVIS_BUILD_DIR=$(pwd)\nexport DRONE_BUILD_DIR=$(pwd)\nexport TRAVIS_BRANCH=$DRONE_BRANCH\nexport VCS_COMMIT_ID=$DRONE_COMMIT\nexport GIT_COMMIT=$DRONE_COMMIT\nexport PATH=~/.local/bin:/usr/local/bin:$PATH\n\necho '==================================> BEFORE_INSTALL'\n\n. .drone/before-install.sh\n\necho '==================================> INSTALL'\n\ncd ..\ngit clone -b $TRAVIS_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root\ncd boost-root\ngit submodule update --init tools/build\ngit submodule update --init libs/config\ngit submodule update --init libs/polygon\ngit submodule update --init tools/boost_install\ngit submodule update --init libs/headers\ngit submodule update --init tools/boostdep\ncp -r $TRAVIS_BUILD_DIR/* libs/multiprecision\npython tools/boostdep/depinst/depinst.py multiprecision\n./bootstrap.sh\n./b2 headers\n\necho '==================================> BEFORE_SCRIPT'\n\n. $DRONE_BUILD_DIR/.drone/before-script.sh\n\necho '==================================> SCRIPT'\n\necho \"using $TOOLSET : : $COMPILER : <cxxflags>-std=$CXXSTD ;\" > ~/user-config.jam\n(cd libs/config/test && ../../../b2 config_info_travis_install toolset=$TOOLSET && ./config_info_travis)\n(cd libs/multiprecision/test && ../../../b2 -j3 toolset=$TOOLSET $TEST_SUITE define=CI_SUPPRESS_KNOWN_ISSUES define=SLOW_COMPILER)\n\necho '==================================> AFTER_SUCCESS'\n\n. $DRONE_BUILD_DIR/.drone/after-success.sh\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/.drone.star",
    "content": "# Use, modification, and distribution are\n# subject to the Boost Software License, Version 1.0. (See accompanying\n# file LICENSE.txt)\n#\n# Copyright Rene Rivera 2020.\n\n# For Drone CI we use the Starlark scripting language to reduce duplication.\n# As the yaml syntax for Drone CI is rather limited.\n#\n#\nglobalenv={}\nlinuxglobalimage=\"cppalliance/droneubuntu1604:1\"\nwindowsglobalimage=\"cppalliance/dronevs2019\"\n\ndef main(ctx):\n  return [\n  linux_cxx(\"Ubunti g++-6 std=gnu++11 arithmetic_tests\", \"g++-6\", packages=\"g++-6 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-6', 'CXXSTD': 'gnu++11', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-6 std=gnu++11 cpp_int_tests\", \"g++-6\", packages=\"g++-6 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-6', 'CXXSTD': 'gnu++11', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-6 std=gnu++11 functions_and_limits\", \"g++-6\", packages=\"g++-6 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-6', 'CXXSTD': 'gnu++11', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-6 std=gnu++11 conversions performance\", \"g++-6\", packages=\"g++-6 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'gcc', 'COMPILER': 'g++-6', 'CXXSTD': 'gnu++11', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-6 std=gnu++11 misc\", \"g++-6\", packages=\"g++-6 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-6', 'CXXSTD': 'gnu++11', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-6 std=gnu++11 compile_fail examples\", \"g++-6\", packages=\"g++-6 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'gcc', 'COMPILER': 'g++-6', 'CXXSTD': 'gnu++11', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-6 std=gnu++11 concepts\", \"g++-6\", packages=\"g++-6 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-6', 'CXXSTD': 'gnu++11', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  linux_cxx(\"Ubunti g++-6 std=gnu++14 arithmetic_tests\", \"g++-6\", packages=\"g++-6 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-6', 'CXXSTD': 'gnu++14', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-6 std=gnu++14 cpp_int_tests\", \"g++-6\", packages=\"g++-6 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-6', 'CXXSTD': 'gnu++14', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-6 std=gnu++14 functions_and_limits\", \"g++-6\", packages=\"g++-6 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-6', 'CXXSTD': 'gnu++14', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-6 std=gnu++14 conversions performance\", \"g++-6\", packages=\"g++-6 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'gcc', 'COMPILER': 'g++-6', 'CXXSTD': 'gnu++14', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-6 std=gnu++14 misc\", \"g++-6\", packages=\"g++-6 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-6', 'CXXSTD': 'gnu++14', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-6 std=gnu++14 compile_fail examples\", \"g++-6\", packages=\"g++-6 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'gcc', 'COMPILER': 'g++-6', 'CXXSTD': 'gnu++14', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-6 std=gnu++14 concepts\", \"g++-6\", packages=\"g++-6 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-6', 'CXXSTD': 'gnu++14', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  linux_cxx(\"Ubunti g++-8 std=gnu++11 arithmetic_tests\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++11', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-8 std=gnu++11 cpp_int_tests\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++11', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-8 std=gnu++11 functions_and_limits\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++11', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-8 std=gnu++11 conversions performance\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++11', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-8 std=gnu++11 misc\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++11', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-8 std=gnu++11 compile_fail examples\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++11', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-8 std=gnu++11 concepts\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++11', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  linux_cxx(\"Ubunti g++-8 std=gnu++14 arithmetic_tests\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++14', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-8 std=gnu++14 cpp_int_tests\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++14', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-8 std=gnu++14 functions_and_limits\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++14', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-8 std=gnu++14 conversions performance\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++14', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-8 std=gnu++14 misc\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++14', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-8 std=gnu++14 compile_fail examples\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++14', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-8 std=gnu++14 concepts\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++14', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  linux_cxx(\"Ubunti g++-8 std=gnu++17 arithmetic_tests\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++17', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-8 std=gnu++17 cpp_int_tests\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++17', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-8 std=gnu++17 functions_and_limits\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++17', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-8 std=gnu++17 conversions performance\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++17', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-8 std=gnu++17 misc\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++17', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-8 std=gnu++17 compile_fail examples\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++17', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-8 std=gnu++17 concepts\", \"g++-8\", packages=\"g++-8 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': 'gnu++17', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  linux_cxx(\"Ubunti g++-9 std=gnu++11 arithmetic_tests\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++11', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-9 std=gnu++11 cpp_int_tests\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++11', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-9 std=gnu++11 functions_and_limits\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++11', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-9 std=gnu++11 conversions performance\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++11', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-9 std=gnu++11 misc\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++11', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-9 std=gnu++11 compile_fail examples\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++11', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-9 std=gnu++11 concepts\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++11', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  linux_cxx(\"Ubunti g++-9 std=gnu++14 arithmetic_tests\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++14', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-9 std=gnu++14 cpp_int_tests\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++14', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-9 std=gnu++14 functions_and_limits\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++14', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-9 std=gnu++14 conversions performance\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++14', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-9 std=gnu++14 misc\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++14', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-9 std=gnu++14 compile_fail examples\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++14', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-9 std=gnu++14 concepts\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++14', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  linux_cxx(\"Ubunti g++-9 std=gnu++17 arithmetic_tests\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++17', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-9 std=gnu++17 cpp_int_tests\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++17', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-9 std=gnu++17 functions_and_limits\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++17', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-9 std=gnu++17 conversions performance\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++17', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-9 std=gnu++17 misc\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++17', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-9 std=gnu++17 compile_fail examples\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++17', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-9 std=gnu++17 concepts\", \"g++-9\", packages=\"g++-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': 'gnu++17', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  linux_cxx(\"Ubunti g++-10 std=gnu++11 arithmetic_tests\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++11', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++11 cpp_int_tests\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++11', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++11 functions_and_limits\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++11', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++11 conversions performance\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++11', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++11 misc\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++11', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++11 compile_fail examples\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++11', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++11 concepts\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++11', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  linux_cxx(\"Ubunti g++-10 std=gnu++14 arithmetic_tests\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++14', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++14 cpp_int_tests\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++14', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++14 functions_and_limits\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++14', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++14 conversions performance\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++14', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++14 misc\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++14', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++14 compile_fail examples\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++14', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++14 concepts\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++14', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  linux_cxx(\"Ubunti g++-10 std=gnu++17 arithmetic_tests\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++17', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++17 cpp_int_tests\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++17', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++17 functions_and_limits\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++17', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  # No test of performance here, the object files get too large :(\n  linux_cxx(\"Ubunti g++-10 std=gnu++17 conversions\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TEST_SUITE': 'conversions', 'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++17', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++17 misc\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++17', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++17 compile_fail examples\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++17', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++17 concepts\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++17', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  linux_cxx(\"Ubunti g++-10 std=gnu++20 arithmetic_tests\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++20', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++20 cpp_int_tests\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++20', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++20 functions_and_limits\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++20', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  # No test of performance here, the object files get too large :(\n  linux_cxx(\"Ubunti g++-10 std=gnu++20 conversions\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TEST_SUITE': 'conversions', 'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++20', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++20 misc\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++20', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++20 compile_fail examples\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++20', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++20 concepts\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++20', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  linux_cxx(\"Ubunti clang++-9 std=c++11 arithmetic_tests\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++11', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-9 std=c++11 cpp_int_test\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++11', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-9 std=c++11 functions_and_limits\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++11', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-9 std=c++11 conversions performance\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++11', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-9 std=c++11 misc\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++11', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-9 std=c++11 compile_fail examples\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++11', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-9 std=c++11 concepts\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++11', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  linux_cxx(\"Ubunti clang++-9 std=c++14 arithmetic_tests\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++14', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-9 std=c++14 cpp_int_test\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++14', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-9 std=c++14 functions_and_limits\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++14', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-9 std=c++14 conversions performance\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++14', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-9 std=c++14 misc\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++14', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-9 std=c++14 compile_fail examples\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++14', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-9 std=c++14 concepts\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++14', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  linux_cxx(\"Ubunti clang++-9 std=c++17 arithmetic_tests\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++17', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-9 std=c++17 cpp_int_test\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++17', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-9 std=c++17 functions_and_limits\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++17', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-9 std=c++17 conversions performance\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++17', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-9 std=c++17 misc\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++17', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-9 std=c++17 compile_fail examples\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++17', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-9 std=c++17 concepts\", \"clang++-9\", packages=\"clang-9 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"9\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': 'c++17', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  linux_cxx(\"Ubunti clang++-10 std=c++11 arithmetic_tests\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++11', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++11 cpp_int_test\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++11', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++11 functions_and_limits\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++11', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++11 conversions performance\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++11', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++11 misc\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++11', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++11 compile_fail examples\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++11', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++11 concepts\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++11', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  linux_cxx(\"Ubunti clang++-10 std=c++14 arithmetic_tests\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++14', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++14 cpp_int_test\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++14', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++14 functions_and_limits\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++14', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++14 conversions performance\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++14', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++14 misc\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++14', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++14 compile_fail examples\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++14', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++14 concepts\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++14', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  linux_cxx(\"Ubunti clang++-10 std=c++17 arithmetic_tests\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++17', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++17 cpp_int_test\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++17', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++17 functions_and_limits\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++17', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++17 conversions performance\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++17', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++17 misc\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++17', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++17 compile_fail examples\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++17', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++17 concepts\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++17', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  linux_cxx(\"Ubunti clang++-10 std=c++20 arithmetic_tests\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++20', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++20 cpp_int_test\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++20', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++20 functions_and_limits\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++20', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++20 conversions performance\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++20', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++20 misc\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++20', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++20 compile_fail examples\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++20', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti clang++-10 std=c++20 concepts\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=\"cppalliance/droneubuntu1804:1\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++20', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  # Sanitizers:\n  #linux_cxx(\"Ubunti clang++-10 std=c++20 ASAN arithmetic_tests\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=linuxglobalimage, environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++20', 'TEST_SUITE': 'cxxflags=-fsanitize=address linkflags=-fsanitize=address arithmetic_tests', }, globalenv=globalenv),\n  #linux_cxx(\"Ubunti clang++-10 std=c++20 ASAN cpp_int_test\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=linuxglobalimage, environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++20', 'TEST_SUITE': 'cxxflags=-fsanitize=address linkflags=-fsanitize=address cpp_int_tests', }, globalenv=globalenv),\n  #linux_cxx(\"Ubunti clang++-10 std=c++20 ASAN functions_and_limits\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=linuxglobalimage, environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++20', 'TEST_SUITE': 'cxxflags=-fsanitize=address linkflags=-fsanitize=address functions_and_limits', }, globalenv=globalenv),\n  #linux_cxx(\"Ubunti clang++-10 std=c++20 ASAN conversions\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=linuxglobalimage, environment={'TEST_SUITE': 'cxxflags=-fsanitize=address linkflags=-fsanitize=address conversions', 'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++20', }, globalenv=globalenv),\n  #linux_cxx(\"Ubunti clang++-10 std=c++20 ASAN misc\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=linuxglobalimage, environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++20', 'TEST_SUITE': 'cxxflags=-fsanitize=address linkflags=-fsanitize=address misc', }, globalenv=globalenv),\n  #linux_cxx(\"Ubunti clang++-10 std=c++20 ASAN examples\", \"clang++-10\", packages=\"clang-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", llvm_os=\"xenial\", llvm_ver=\"10\", buildtype=\"boost\", image=linuxglobalimage, environment={'TEST_SUITE': 'cxxflags=-fsanitize=address linkflags=-fsanitize=address examples', 'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': 'c++20', }, globalenv=globalenv),\n\n  linux_cxx(\"Ubunti g++-10 std=gnu++20 USAN arithmetic_tests\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++20', 'TEST_SUITE': 'cxxflags=-fsanitize=undefined linkflags=-fsanitize=undefined arithmetic_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++20 USAN cpp_int_tests\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++20', 'TEST_SUITE': 'cxxflags=-fsanitize=undefined linkflags=-fsanitize=undefined cpp_int_tests', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++20 USAN functions_and_limits\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++20', 'TEST_SUITE': 'cxxflags=-fsanitize=undefined linkflags=-fsanitize=undefined functions_and_limits', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++20 USAN conversions\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TEST_SUITE': 'cxxflags=-fsanitize=undefined linkflags=-fsanitize=undefined define=BOOST_CI_USAN_BUID conversions', 'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++20', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++20 USAN misc\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++20', 'TEST_SUITE': 'cxxflags=-fsanitize=undefined linkflags=-fsanitize=undefined misc', }, globalenv=globalenv),\n  linux_cxx(\"Ubunti g++-10 std=gnu++20 USAN examples\", \"g++-10\", packages=\"g++-10 libgmp-dev libmpfr-dev libmpc-dev libmpfi-dev libtommath-dev\", buildtype=\"boost\", image=\"cppalliance/droneubuntu2004:1\", environment={'TEST_SUITE': 'cxxflags=-fsanitize=undefined linkflags=-fsanitize=undefined examples', 'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': 'gnu++20', }, globalenv=globalenv),\n\n  # OS X:\n  osx_cxx(\"XCode 11.7, c++14 arithmetic_tests\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  osx_cxx(\"XCode 11.7, c++14 cpp_int_tests\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  osx_cxx(\"XCode 11.7, c++14 functions_and_limits\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  osx_cxx(\"XCode 11.7, c++14 conversions performance\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', }, globalenv=globalenv),\n  osx_cxx(\"XCode 11.7, c++14 misc\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  osx_cxx(\"XCode 11.7, c++14 compile_fail examples\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', }, globalenv=globalenv),\n  osx_cxx(\"XCode 11.7, c++14 concepts\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  osx_cxx(\"XCode 11.7, c++17 arithmetic_tests\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++17', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  osx_cxx(\"XCode 11.7, c++17 cpp_int_tests\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++17', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  osx_cxx(\"XCode 11.7, c++17 functions_and_limits\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++17', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  osx_cxx(\"XCode 11.7, c++17 conversions performance\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++17', }, globalenv=globalenv),\n  osx_cxx(\"XCode 11.7, c++17 misc\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++17', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  osx_cxx(\"XCode 11.7, c++17 compile_fail examples\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++17', }, globalenv=globalenv),\n  osx_cxx(\"XCode 11.7, c++17 concepts\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++17', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  osx_cxx(\"XCode 11.7, c++2a arithmetic_tests\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++2a', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  osx_cxx(\"XCode 11.7, c++2a cpp_int_tests\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++2a', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  osx_cxx(\"XCode 11.7, c++2a functions_and_limits\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++2a', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  osx_cxx(\"XCode 11.7, c++2a conversions performance\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++2a', }, globalenv=globalenv),\n  osx_cxx(\"XCode 11.7, c++2a misc\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++2a', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  osx_cxx(\"XCode 11.7, c++2a compile_fail examples\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++2a', }, globalenv=globalenv),\n  osx_cxx(\"XCode 11.7, c++2a concepts\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"11.7\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++2a', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  osx_cxx(\"XCode 10.2, c++17 arithmetic_tests\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"10.2\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++17', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  osx_cxx(\"XCode 10.2, c++17 cpp_int_tests\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"10.2\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++17', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  osx_cxx(\"XCode 10.2, c++17 functions_and_limits\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"10.2\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++17', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  osx_cxx(\"XCode 10.2, c++17 conversions performance\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"10.2\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++17', }, globalenv=globalenv),\n  osx_cxx(\"XCode 10.2, c++17 misc\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"10.2\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++17', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  osx_cxx(\"XCode 10.2, c++17 compile_fail examples\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"10.2\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++17', }, globalenv=globalenv),\n  osx_cxx(\"XCode 10.2, c++17 concepts\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"10.2\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++17', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  osx_cxx(\"XCode 9.3, c++14 arithmetic_tests\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"9.3\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  osx_cxx(\"XCode 9.3, c++14 cpp_int_tests\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"9.3\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  osx_cxx(\"XCode 9.3, c++14 functions_and_limits\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"9.3\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  osx_cxx(\"XCode 9.3, c++14 conversions performance\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"9.3\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', }, globalenv=globalenv),\n  osx_cxx(\"XCode 9.3, c++14 misc\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"9.3\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  osx_cxx(\"XCode 9.3, c++14 compile_fail examples\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"9.3\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', }, globalenv=globalenv),\n  osx_cxx(\"XCode 9.3, c++14 concepts\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"9.3\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n\n  osx_cxx(\"XCode 8.3, c++14 arithmetic_tests\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"8.3\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', 'TEST_SUITE': 'arithmetic_tests', }, globalenv=globalenv),\n  osx_cxx(\"XCode 8.3, c++14 cpp_int_tests\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"8.3\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', 'TEST_SUITE': 'cpp_int_tests', }, globalenv=globalenv),\n  osx_cxx(\"XCode 8.3, c++14 functions_and_limits\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"8.3\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', 'TEST_SUITE': 'functions_and_limits', }, globalenv=globalenv),\n  osx_cxx(\"XCode 8.3, c++14 conversions performance\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"8.3\", environment={'TEST_SUITE': 'conversions performance', 'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', }, globalenv=globalenv),\n  osx_cxx(\"XCode 8.3, c++14 misc\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"8.3\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', 'TEST_SUITE': 'misc', }, globalenv=globalenv),\n  osx_cxx(\"XCode 8.3, c++14 compile_fail examples\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"8.3\", environment={'TEST_SUITE': 'compile_fail examples', 'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', }, globalenv=globalenv),\n  osx_cxx(\"XCode 8.3, c++14 concepts\", \"clang++\", packages=\"\", buildtype=\"boost\", xcode_version=\"8.3\", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': 'c++14', 'TEST_SUITE': 'concepts', }, globalenv=globalenv),\n  ]\n\n# from https://github.com/boostorg/boost-ci\nload(\"@boost_ci//ci/drone/:functions.star\", \"linux_cxx\",\"windows_cxx\",\"osx_cxx\",\"freebsd_cxx\")\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/.gitattributes",
    "content": "* text=auto !eol svneol=native#text/plain\n*.gitattributes text svneol=native#text/plain\n\n# Scriptish formats\n*.bat        text svneol=native#text/plain\n*.bsh        text svneol=native#text/x-beanshell\n*.cgi        text svneol=native#text/plain\n*.cmd        text svneol=native#text/plain\n*.js         text svneol=native#text/javascript\n*.php        text svneol=native#text/x-php\n*.pl         text svneol=native#text/x-perl\n*.pm         text svneol=native#text/x-perl\n*.py         text svneol=native#text/x-python\n*.sh         eol=lf svneol=LF#text/x-sh\nconfigure    eol=lf svneol=LF#text/x-sh\n\n# Image formats\n*.bmp        binary svneol=unset#image/bmp\n*.gif        binary svneol=unset#image/gif\n*.ico        binary svneol=unset#image/ico\n*.jpeg       binary svneol=unset#image/jpeg\n*.jpg        binary svneol=unset#image/jpeg\n*.png        binary svneol=unset#image/png\n*.tif        binary svneol=unset#image/tiff\n*.tiff       binary svneol=unset#image/tiff\n*.svg        text svneol=native#image/svg%2Bxml\n\n# Data formats\n*.pdf        binary svneol=unset#application/pdf\n*.avi        binary svneol=unset#video/avi\n*.doc        binary svneol=unset#application/msword\n*.dsp        text svneol=crlf#text/plain\n*.dsw        text svneol=crlf#text/plain\n*.eps        binary svneol=unset#application/postscript\n*.gz         binary svneol=unset#application/gzip\n*.mov        binary svneol=unset#video/quicktime\n*.mp3        binary svneol=unset#audio/mpeg\n*.ppt        binary svneol=unset#application/vnd.ms-powerpoint\n*.ps         binary svneol=unset#application/postscript\n*.psd        binary svneol=unset#application/photoshop\n*.rdf        binary svneol=unset#text/rdf\n*.rss        text svneol=unset#text/xml\n*.rtf        binary svneol=unset#text/rtf\n*.sln        text svneol=native#text/plain\n*.swf        binary svneol=unset#application/x-shockwave-flash\n*.tgz        binary svneol=unset#application/gzip\n*.vcproj     text svneol=native#text/xml\n*.vcxproj    text svneol=native#text/xml\n*.vsprops    text svneol=native#text/xml\n*.wav        binary svneol=unset#audio/wav\n*.xls        binary svneol=unset#application/vnd.ms-excel\n*.zip        binary svneol=unset#application/zip\n\n# Text formats\n.htaccess    text svneol=native#text/plain\n*.bbk        text svneol=native#text/xml\n*.cmake      text svneol=native#text/plain\n*.css        text svneol=native#text/css\n*.dtd        text svneol=native#text/xml\n*.htm        text svneol=native#text/html\n*.html       text svneol=native#text/html\n*.ini        text svneol=native#text/plain\n*.log        text svneol=native#text/plain\n*.mak        text svneol=native#text/plain\n*.qbk        text svneol=native#text/plain\n*.rst        text svneol=native#text/plain\n*.sql        text svneol=native#text/x-sql\n*.txt        text svneol=native#text/plain\n*.xhtml      text svneol=native#text/xhtml%2Bxml\n*.xml        text svneol=native#text/xml\n*.xsd        text svneol=native#text/xml\n*.xsl        text svneol=native#text/xml\n*.xslt       text svneol=native#text/xml\n*.xul        text svneol=native#text/xul\n*.yml        text svneol=native#text/plain\nboost-no-inspect text svneol=native#text/plain\nCHANGES      text svneol=native#text/plain\nCOPYING      text svneol=native#text/plain\nINSTALL      text svneol=native#text/plain\nJamfile      text svneol=native#text/plain\nJamroot      text svneol=native#text/plain\nJamfile.v2   text svneol=native#text/plain\nJamrules     text svneol=native#text/plain\nMakefile*    text svneol=native#text/plain\nREADME       text svneol=native#text/plain\nTODO         text svneol=native#text/plain\n\n# Code formats\n*.c          text svneol=native#text/plain\n*.cpp        text svneol=native#text/plain\n*.h          text svneol=native#text/plain\n*.hpp        text svneol=native#text/plain\n*.ipp        text svneol=native#text/plain\n*.tpp        text svneol=native#text/plain\n*.jam        text svneol=native#text/plain\n*.java       text svneol=native#text/plain\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/.github/workflows/multiprecision.yml",
    "content": "# Copyright 2020 Evan Miller\n# Copyright 2020 Matt Borland\n# Copyright 2021 John Maddock\n# Copyright 2021 Christopher Kormanyos\n# Distributed under the Boost Software License, Version 1.0.\n# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)\n\nname: multiprecision\non:\n  push:\n    branches:\n      - master\n      - develop\n  pull_request:\n  release:\n    types: [published, created, edited]\njobs:\n  ubuntu-jammy:\n    runs-on: ubuntu-22.04\n    defaults:\n      run:\n        shell: bash\n    strategy:\n      fail-fast: false\n      matrix:\n        compiler: [ g++-12, clang++-14 ]\n        standard: [ c++11, c++14, c++17, c++20, c++2b ]\n        suite: [ arithmetic_tests, functions_and_limits, conversions, cpp_int_tests, misc, compile_fail, concepts, examples ]\n    steps:\n      - uses: actions/checkout@v3\n        with:\n          fetch-depth: '0'\n      - name: Set TOOLSET\n        run: echo ${{ matrix.compiler }} | awk '/^g/ { print \"TOOLSET=gcc\" } /^clang/ { print \"TOOLSET=clang\" }' >> $GITHUB_ENV\n      - name: Add repository\n        continue-on-error: true\n        id: addrepo\n        run: sudo apt-add-repository -y \"ppa:ubuntu-toolchain-r/test\"\n      - name: Retry Add Repo\n        continue-on-error: true\n        id: retry1\n        if: steps.addrepo.outcome=='failure'\n        run: sudo apt-add-repository -y \"ppa:ubuntu-toolchain-r/test\"\n      - name: Retry Add Repo 2\n        continue-on-error: true\n        id: retry2\n        if: steps.retry1.outcome=='failure'\n        run: sudo apt-add-repository -y \"ppa:ubuntu-toolchain-r/test\"\n      - name: Install packages\n        run: sudo apt install g++-12 clang-14 libgmp-dev libmpfr-dev libtommath-dev libeigen3-dev libmpfi-dev libmpc-dev\n      - name: Checkout main boost\n        run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root\n      - name: Update tools/boostdep\n        run: git submodule update --init tools/boostdep\n        working-directory: ../boost-root\n      - name: Copy files\n        run: cp -r $GITHUB_WORKSPACE/* libs/multiprecision\n        working-directory: ../boost-root\n      - name: Install deps\n        run: python tools/boostdep/depinst/depinst.py multiprecision\n        working-directory: ../boost-root\n      - name: Bootstrap\n        run: ./bootstrap.sh\n        working-directory: ../boost-root\n      - name: Generate headers\n        run: ./b2 headers\n        working-directory: ../boost-root\n      - name: Generate user config\n        run: 'echo \"using $TOOLSET : : ${{ matrix.compiler }} : <cxxflags>-std=${{ matrix.standard }} ;\" > ~/user-config.jam'\n        working-directory: ../boost-root\n      - name: Config info install\n        run: ../../../b2 config_info_travis_install toolset=$TOOLSET\n        working-directory: ../boost-root/libs/config/test\n      - name: Config info\n        run: ./config_info_travis\n        working-directory: ../boost-root/libs/config/test\n      - name: Test\n        run: ../../../b2 -j2 toolset=$TOOLSET ${{ matrix.suite }} define=CI_SUPPRESS_KNOWN_ISSUES include=/usr/include/eigen3\n        working-directory: ../boost-root/libs/multiprecision/test\n  ubuntu-focal:\n    runs-on: ubuntu-20.04\n    defaults:\n      run:\n        shell: bash\n    strategy:\n      fail-fast: false\n      matrix:\n        compiler: [ g++-10, g++-11, clang++-10, clang++-11 ]\n        standard: [ c++11, c++14, c++17, c++2a ]\n        suite: [ arithmetic_tests, functions_and_limits, conversions, cpp_int_tests, misc, compile_fail, concepts, examples ]\n    steps:\n      - uses: actions/checkout@v3\n        with:\n          fetch-depth: '0'\n      - name: Set TOOLSET\n        run: echo ${{ matrix.compiler }} | awk '/^g/ { print \"TOOLSET=gcc\" } /^clang/ { print \"TOOLSET=clang\" }' >> $GITHUB_ENV\n      - name: Add repository\n        continue-on-error: true\n        id: addrepo\n        run: sudo apt-add-repository -y \"ppa:ubuntu-toolchain-r/test\"\n      - name: Retry Add Repo\n        continue-on-error: true\n        id: retry1\n        if: steps.addrepo.outcome=='failure'\n        run: sudo apt-add-repository -y \"ppa:ubuntu-toolchain-r/test\"\n      - name: Retry Add Repo 2\n        continue-on-error: true\n        id: retry2\n        if: steps.retry1.outcome=='failure'\n        run: sudo apt-add-repository -y \"ppa:ubuntu-toolchain-r/test\"\n      - name: Install packages\n        run: sudo apt install g++-9 g++-10 g++-11 clang-10 clang-11 libgmp-dev libmpfr-dev libtommath-dev libeigen3-dev libmpfi-dev libmpc-dev\n      - name: Checkout main boost\n        run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root\n      - name: Update tools/boostdep\n        run: git submodule update --init tools/boostdep\n        working-directory: ../boost-root\n      - name: Copy files\n        run: cp -r $GITHUB_WORKSPACE/* libs/multiprecision\n        working-directory: ../boost-root\n      - name: Install deps\n        run: python tools/boostdep/depinst/depinst.py multiprecision\n        working-directory: ../boost-root\n      - name: Bootstrap\n        run: ./bootstrap.sh\n        working-directory: ../boost-root\n      - name: Generate headers\n        run: ./b2 headers\n        working-directory: ../boost-root\n      - name: Generate user config\n        run: 'echo \"using $TOOLSET : : ${{ matrix.compiler }} : <cxxflags>-std=${{ matrix.standard }} ;\" > ~/user-config.jam'\n        working-directory: ../boost-root\n      - name: Config info install\n        run: ../../../b2 config_info_travis_install toolset=$TOOLSET\n        working-directory: ../boost-root/libs/config/test\n      - name: Config info\n        run: ./config_info_travis\n        working-directory: ../boost-root/libs/config/test\n      - name: Test\n        run: ../../../b2 -j2 toolset=$TOOLSET ${{ matrix.suite }} define=CI_SUPPRESS_KNOWN_ISSUES include=/usr/include/eigen3\n        working-directory: ../boost-root/libs/multiprecision/test\n  ubuntu-focal-slow-tests:\n    runs-on: ubuntu-20.04\n    defaults:\n      run:\n        shell: bash\n    strategy:\n      fail-fast: false\n      matrix:\n        compiler: [ g++-10 ]\n        standard: [ c++11, c++17, c++2a ]\n        suite: [ specfun_mpfr, specfun_gmp, specfun_cpp_dec_float, specfun_cpp_bin_float, specfun_float128 ]\n    steps:\n      - uses: actions/checkout@v3\n        with:\n          fetch-depth: '0'\n      - name: Set TOOLSET\n        run: echo ${{ matrix.compiler }} | awk '/^g/ { print \"TOOLSET=gcc\" } /^clang/ { print \"TOOLSET=clang\" }' >> $GITHUB_ENV\n      - name: Add repository\n        continue-on-error: true\n        id: addrepo\n        run: sudo apt-add-repository -y \"ppa:ubuntu-toolchain-r/test\"\n      - name: Retry Add Repo\n        continue-on-error: true\n        id: retry1\n        if: steps.addrepo.outcome=='failure'\n        run: sudo apt-add-repository -y \"ppa:ubuntu-toolchain-r/test\"\n      - name: Retry Add Repo 2\n        continue-on-error: true\n        id: retry2\n        if: steps.retry1.outcome=='failure'\n        run: sudo apt-add-repository -y \"ppa:ubuntu-toolchain-r/test\"\n      - name: Install packages\n        run: sudo apt install g++-9 g++-10 clang-10 libgmp-dev libmpfr-dev libtommath-dev libeigen3-dev libmpfi-dev libmpc-dev\n      - name: Checkout main boost\n        run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root\n      - name: Update tools/boostdep\n        run: git submodule update --init tools/boostdep\n        working-directory: ../boost-root\n      - name: Copy files\n        run: cp -r $GITHUB_WORKSPACE/* libs/multiprecision\n        working-directory: ../boost-root\n      - name: Install deps\n        run: python tools/boostdep/depinst/depinst.py multiprecision\n        working-directory: ../boost-root\n      - name: Bootstrap\n        run: ./bootstrap.sh\n        working-directory: ../boost-root\n      - name: Generate headers\n        run: ./b2 headers\n        working-directory: ../boost-root\n      - name: Generate user config\n        run: 'echo \"using $TOOLSET : : ${{ matrix.compiler }} : <cxxflags>-std=${{ matrix.standard }} ;\" > ~/user-config.jam'\n        working-directory: ../boost-root\n      - name: Config info install\n        run: ../../../b2 config_info_travis_install toolset=$TOOLSET\n        working-directory: ../boost-root/libs/config/test\n      - name: Config info\n        run: ./config_info_travis\n        working-directory: ../boost-root/libs/config/test\n      - name: Test\n        run: ../../../b2 -j2 toolset=$TOOLSET ${{ matrix.suite }} define=CI_SUPPRESS_KNOWN_ISSUES include=/usr/include/eigen3\n        working-directory: ../boost-root/libs/multiprecision/test\n  ubuntu-focal-standalone-tests:\n    runs-on: ubuntu-20.04\n    defaults:\n      run:\n        shell: bash\n    strategy:\n      fail-fast: false\n      matrix:\n        compiler: [ g++-11 ]\n        standard: [ c++11, c++14, c++17, c++20 ]\n        suite: [ standalone ]\n    steps:\n      - uses: actions/checkout@v3\n        with:\n          fetch-depth: '0'\n      - name: Set TOOLSET\n        run: echo ${{ matrix.compiler }} | awk '/^g/ { print \"TOOLSET=gcc\" } /^clang/ { print \"TOOLSET=clang\" }' >> $GITHUB_ENV\n      - name: Add repository\n        continue-on-error: true\n        id: addrepo\n        run: sudo apt-add-repository -y \"ppa:ubuntu-toolchain-r/test\"\n      - name: Retry Add Repo\n        continue-on-error: true\n        id: retry1\n        if: steps.addrepo.outcome=='failure'\n        run: sudo apt-add-repository -y \"ppa:ubuntu-toolchain-r/test\"\n      - name: Retry Add Repo 2\n        continue-on-error: true\n        id: retry2\n        if: steps.retry1.outcome=='failure'\n        run: sudo apt-add-repository -y \"ppa:ubuntu-toolchain-r/test\"\n      - name: Install packages\n        run: sudo apt install g++-11 libgmp-dev libmpfr-dev libtommath-dev\n      - name: Checkout main boost\n        run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root\n      - name: Update tools/boostdep\n        run: git submodule update --init tools/boostdep\n        working-directory: ../boost-root\n      - name: Copy files\n        run: cp -r $GITHUB_WORKSPACE/* libs/multiprecision\n        working-directory: ../boost-root\n      - name: Install deps\n        run: python tools/boostdep/depinst/depinst.py multiprecision\n        working-directory: ../boost-root\n      - name: Bootstrap\n        run: ./bootstrap.sh\n        working-directory: ../boost-root\n      - name: Generate headers\n        run: ./b2 headers\n        working-directory: ../boost-root\n      - name: Generate user config\n        run: 'echo \"using $TOOLSET : : ${{ matrix.compiler }} : <cxxflags>-std=${{ matrix.standard }} ;\" > ~/user-config.jam'\n        working-directory: ../boost-root\n      - name: Config info install\n        run: ../../../b2 config_info_travis_install toolset=$TOOLSET\n        working-directory: ../boost-root/libs/config/test\n      - name: Config info\n        run: ./config_info_travis\n        working-directory: ../boost-root/libs/config/test\n      - name: Test\n        run: ../../../b2 -j2 toolset=$TOOLSET ${{ matrix.suite }} define=CI_SUPPRESS_KNOWN_ISSUES\n        working-directory: ../boost-root/libs/multiprecision/test\n  ubuntu-focal-ASAN:\n    runs-on: ubuntu-20.04\n    defaults:\n      run:\n        shell: bash\n    strategy:\n      fail-fast: false\n      matrix:\n        compiler: [ g++-10 ]\n        standard: [ c++17 ]\n        suite: [ arithmetic_tests, functions_and_limits, conversions, cpp_int_tests, misc ]\n    steps:\n      - uses: actions/checkout@v3\n        with:\n          fetch-depth: '0'\n      - name: Set TOOLSET\n        run: echo ${{ matrix.compiler }} | awk '/^g/ { print \"TOOLSET=gcc\" } /^clang/ { print \"TOOLSET=clang\" }' >> $GITHUB_ENV\n      - name: Add repository\n        continue-on-error: true\n        id: addrepo\n        run: sudo apt-add-repository -y \"ppa:ubuntu-toolchain-r/test\"\n      - name: Retry Add Repo\n        continue-on-error: true\n        id: retry1\n        if: steps.addrepo.outcome=='failure'\n        run: sudo apt-add-repository -y \"ppa:ubuntu-toolchain-r/test\"\n      - name: Retry Add Repo 2\n        continue-on-error: true\n        id: retry2\n        if: steps.retry1.outcome=='failure'\n        run: sudo apt-add-repository -y \"ppa:ubuntu-toolchain-r/test\"\n      - name: Install packages\n        run: sudo apt install g++-10 libgmp-dev libmpfr-dev libtommath-dev libeigen3-dev\n      - name: Checkout main boost\n        run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root\n      - name: Update tools/boostdep\n        run: git submodule update --init tools/boostdep\n        working-directory: ../boost-root\n      - name: Copy files\n        run: cp -r $GITHUB_WORKSPACE/* libs/multiprecision\n        working-directory: ../boost-root\n      - name: Install deps\n        run: python tools/boostdep/depinst/depinst.py multiprecision\n        working-directory: ../boost-root\n      - name: Bootstrap\n        run: ./bootstrap.sh\n        working-directory: ../boost-root\n      - name: Generate headers\n        run: ./b2 headers\n        working-directory: ../boost-root\n      - name: Generate user config\n        run: 'echo \"using $TOOLSET : : ${{ matrix.compiler }} : <cxxflags>-std=${{ matrix.standard }} ;\" > ~/user-config.jam'\n        working-directory: ../boost-root\n      - name: Config info install\n        run: ../../../b2 config_info_travis_install toolset=$TOOLSET\n        working-directory: ../boost-root/libs/config/test\n      - name: Config info\n        run: ./config_info_travis\n        working-directory: ../boost-root/libs/config/test\n      - name: Test\n        run: ../../../b2 define=BOOST_CI_ASAN_BUILD define=BOOST_CI_SANITIZER_BUILD cxxflags=-fsanitize=address linkflags=-fsanitize=address toolset=$TOOLSET ${{ matrix.suite }} define=CI_SUPPRESS_KNOWN_ISSUES\n        working-directory: ../boost-root/libs/multiprecision/test\n  ubuntu-focal-UBSAN:\n    runs-on: ubuntu-20.04\n    defaults:\n      run:\n        shell: bash\n    strategy:\n      fail-fast: false\n      matrix:\n        compiler: [ g++-10 ]\n        standard: [ c++17 ]\n        suite: [ arithmetic_tests, functions_and_limits, misc ]\n    steps:\n      - uses: actions/checkout@v3\n        with:\n          fetch-depth: '0'\n      - name: Set TOOLSET\n        run: echo ${{ matrix.compiler }} | awk '/^g/ { print \"TOOLSET=gcc\" } /^clang/ { print \"TOOLSET=clang\" }' >> $GITHUB_ENV\n      - name: Add repository\n        continue-on-error: true\n        id: addrepo\n        run: sudo apt-add-repository -y \"ppa:ubuntu-toolchain-r/test\"\n      - name: Retry Add Repo\n        continue-on-error: true\n        id: retry1\n        if: steps.addrepo.outcome=='failure'\n        run: sudo apt-add-repository -y \"ppa:ubuntu-toolchain-r/test\"\n      - name: Retry Add Repo 2\n        continue-on-error: true\n        id: retry2\n        if: steps.retry1.outcome=='failure'\n        run: sudo apt-add-repository -y \"ppa:ubuntu-toolchain-r/test\"\n      - name: Install packages\n        run: sudo apt install g++-10 libgmp-dev libeigen3-dev\n      - name: Checkout main boost\n        run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root\n      - name: Update tools/boostdep\n        run: git submodule update --init tools/boostdep\n        working-directory: ../boost-root\n      - name: Copy files\n        run: cp -r $GITHUB_WORKSPACE/* libs/multiprecision\n        working-directory: ../boost-root\n      - name: Install deps\n        run: python tools/boostdep/depinst/depinst.py multiprecision\n        working-directory: ../boost-root\n      - name: Bootstrap\n        run: ./bootstrap.sh\n        working-directory: ../boost-root\n      - name: Generate headers\n        run: ./b2 headers\n        working-directory: ../boost-root\n      - name: Generate user config\n        run: 'echo \"using $TOOLSET : : ${{ matrix.compiler }} : <cxxflags>-std=${{ matrix.standard }} ;\" > ~/user-config.jam'\n        working-directory: ../boost-root\n      - name: Config info install\n        run: ../../../b2 config_info_travis_install toolset=$TOOLSET\n        working-directory: ../boost-root/libs/config/test\n      - name: Config info\n        run: ./config_info_travis\n        working-directory: ../boost-root/libs/config/test\n      - name: Test\n        run: ../../../b2 define=BOOST_CI_UBSAN_BUILD define=BOOST_CI_SANITIZER_BUILD cxxflags=-fsanitize=undefined linkflags=-fsanitize=undefined toolset=$TOOLSET ${{ matrix.suite }} define=CI_SUPPRESS_KNOWN_ISSUES\n        working-directory: ../boost-root/libs/multiprecision/test\n  windows_gcc:\n    runs-on: windows-2019\n    defaults:\n      run:\n        shell: cmd\n    env:\n      ARGS: toolset=${{ matrix.toolset }} address-model=64 cxxstd=${{ matrix.standard }}\n    strategy:\n      fail-fast: false\n      matrix:\n        toolset: [ gcc ]\n        standard: [ 11, 14, 17 ]\n        suite: [ arithmetic_tests, functions_and_limits, conversions, cpp_int_tests, misc, compile_fail, concepts, examples ]\n    steps:\n      - uses: actions/checkout@v3\n        with:\n          fetch-depth: '0'\n      - name: Checkout main boost\n        run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root\n      - name: Update tools/boostdep\n        run: git submodule update --init tools/boostdep\n        working-directory: ../boost-root\n      - name: Copy files\n        run: xcopy /s /e /q %GITHUB_WORKSPACE% libs\\multiprecision\n        working-directory: ../boost-root\n      - name: Install deps\n        run: python tools/boostdep/depinst/depinst.py multiprecision\n        working-directory: ../boost-root\n      - name: Bootstrap\n        run: bootstrap\n        working-directory: ../boost-root\n      - name: Generate headers\n        run: b2 headers\n        working-directory: ../boost-root\n      - name: Config info install\n        run: ..\\..\\..\\b2 config_info_travis_install %ARGS%\n        working-directory: ../boost-root/libs/config/test\n      - name: Config info\n        run: config_info_travis\n        working-directory: ../boost-root/libs/config/test\n      - name: Test\n        run: ..\\..\\..\\b2 -j2 --hash %ARGS% define=CI_SUPPRESS_KNOWN_ISSUES ${{ matrix.suite }}\n        working-directory: ../boost-root/libs/multiprecision/test\n  windows_msvc_14_0:\n    runs-on: windows-2019\n    defaults:\n      run:\n        shell: cmd\n    env:\n      ARGS: toolset=${{ matrix.toolset }} address-model=64 cxxstd=${{ matrix.standard }}\n    strategy:\n      fail-fast: false\n      matrix:\n        toolset: [ msvc-14.0 ]\n        standard: [ 14, 17 ]\n        suite: [ arithmetic_tests, functions_and_limits, conversions, cpp_int_tests, misc, compile_fail, concepts, examples ]\n    steps:\n      - uses: actions/checkout@v3\n        with:\n          fetch-depth: '0'\n      - name: Checkout main boost\n        run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root\n      - name: Update tools/boostdep\n        run: git submodule update --init tools/boostdep\n        working-directory: ../boost-root\n      - name: Copy files\n        run: xcopy /s /e /q %GITHUB_WORKSPACE% libs\\multiprecision\n        working-directory: ../boost-root\n      - name: Install deps\n        run: python tools/boostdep/depinst/depinst.py multiprecision\n        working-directory: ../boost-root\n      - name: Bootstrap\n        run: bootstrap\n        working-directory: ../boost-root\n      - name: Generate headers\n        run: b2 headers\n        working-directory: ../boost-root\n      - name: Config info install\n        run: ..\\..\\..\\b2 config_info_travis_install %ARGS%\n        working-directory: ../boost-root/libs/config/test\n      - name: Config info\n        run: config_info_travis\n        working-directory: ../boost-root/libs/config/test\n      - name: Test\n        run: ..\\..\\..\\b2 -j2 --hash %ARGS% define=CI_SUPPRESS_KNOWN_ISSUES ${{ matrix.suite }}\n        working-directory: ../boost-root/libs/multiprecision/test\n  windows_msvc_14_2:\n    runs-on: windows-2019\n    defaults:\n      run:\n        shell: cmd\n    env:\n      ARGS: toolset=${{ matrix.toolset }} address-model=64 cxxstd=${{ matrix.standard }}\n    strategy:\n      fail-fast: false\n      matrix:\n        toolset: [ msvc-14.2 ]\n        standard: [ 14, 17, 20 ]\n        suite: [ arithmetic_tests, functions_and_limits, conversions, cpp_int_tests, misc, compile_fail, concepts, examples ]\n    steps:\n      - uses: actions/checkout@v3\n        with:\n          fetch-depth: '0'\n      - name: Checkout main boost\n        run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root\n      - name: Update tools/boostdep\n        run: git submodule update --init tools/boostdep\n        working-directory: ../boost-root\n      - name: Copy files\n        run: xcopy /s /e /q %GITHUB_WORKSPACE% libs\\multiprecision\n        working-directory: ../boost-root\n      - name: Install deps\n        run: python tools/boostdep/depinst/depinst.py multiprecision\n        working-directory: ../boost-root\n      - name: Bootstrap\n        run: bootstrap\n        working-directory: ../boost-root\n      - name: Generate headers\n        run: b2 headers\n        working-directory: ../boost-root\n      - name: Config info install\n        run: ..\\..\\..\\b2 config_info_travis_install %ARGS%\n        working-directory: ../boost-root/libs/config/test\n      - name: Config info\n        run: config_info_travis\n        working-directory: ../boost-root/libs/config/test\n      - name: Test\n        run: ..\\..\\..\\b2 -j2 --hash %ARGS% define=CI_SUPPRESS_KNOWN_ISSUES ${{ matrix.suite }}\n        working-directory: ../boost-root/libs/multiprecision/test\n  macos:\n    runs-on: macos-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        toolset: [ clang ]\n        standard: [ 11, 14, 17, 2a ]\n        suite: [ arithmetic_tests, functions_and_limits, conversions, cpp_int_tests, misc, compile_fail, concepts, examples ]\n    steps:\n      - uses: actions/checkout@v3\n        with:\n          fetch-depth: '0'\n      - name: Checkout main boost\n        run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root\n      - name: Update tools/boostdep\n        run: git submodule update --init tools/boostdep\n        working-directory: ../boost-root\n      - name: Copy files\n        run: cp -r $GITHUB_WORKSPACE/* libs/multiprecision\n        working-directory: ../boost-root\n      - name: Install deps\n        run: python tools/boostdep/depinst/depinst.py multiprecision\n        working-directory: ../boost-root\n      - name: Bootstrap\n        run: ./bootstrap.sh\n        working-directory: ../boost-root\n      - name: Generate headers\n        run: ./b2 headers\n        working-directory: ../boost-root\n      - name: Config info install\n        run: ../../../b2 config_info_travis_install toolset=${{ matrix.toolset }} cxxstd=${{ matrix.standard }}\n        working-directory: ../boost-root/libs/config/test\n      - name: Config info\n        run: ./config_info_travis\n        working-directory: ../boost-root/libs/config/test\n      - name: Test\n        run: ../../../b2 -j2 toolset=${{ matrix.toolset }} cxxstd=${{ matrix.standard }} ${{ matrix.suite }} define=CI_SUPPRESS_KNOWN_ISSUES\n        working-directory: ../boost-root/libs/multiprecision/test\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/.gitignore",
    "content": "# /boost/libs/multiprecision/.gitignore\n# Use of manifest is unclear, so add to .gitignore.\n/doc/html/standalone_HTML.manifest\n*.DS_Store\n/**/*.dSYM/\n**/.temps/*\nbuild/*\n.vscode/*\n.idea/*\n\n# CMake Related Options\n*.a\n*.o\ncmake_install.cmake\nCMakeCache.txt\nMakefile\n**/CMakeFiles/**\n**CTestTestfile.cmake\nDartConfiguration.tcl\ncmake-build-debug/*\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/CMakeLists.txt",
    "content": "# Generated by `boostdep --cmake multiprecision`\n# Copyright 2020 Peter Dimov\n# Copyright 2021 Matt Borland\n# Distributed under the Boost Software License, Version 1.0.\n# https://www.boost.org/LICENSE_1_0.txt\n\ncmake_minimum_required(VERSION 3.5...3.16)\n\nproject(boost_multiprecision VERSION \"${BOOST_SUPERPROJECT_VERSION}\" LANGUAGES CXX)\n\nadd_library(boost_multiprecision INTERFACE)\nadd_library(Boost::multiprecision ALIAS boost_multiprecision)\n\ntarget_include_directories(boost_multiprecision INTERFACE include)\n\ninclude(CMakeDependentOption)\n\ncmake_dependent_option(BOOST_MP_STANDALONE \"Use Boost.Multiprecision in standalone mode\" ON \"NOT BOOST_SUPERPROJECT_VERSION\" OFF)\n\nmessage(STATUS \"Boost.Multiprecision: standalone mode ${BOOST_MP_STANDALONE}\")\n\nif(BOOST_MP_STANDALONE)\n\n  target_compile_definitions(boost_multiprecision INTERFACE BOOST_MP_STANDALONE=1)\n\nelse()\n\n  target_link_libraries(boost_multiprecision\n    INTERFACE\n      Boost::assert\n      Boost::config\n      Boost::core\n      Boost::integer\n      Boost::lexical_cast\n      Boost::math\n      Boost::random\n  )\n\nendif()\n\nif(BUILD_TESTING AND EXISTS \"${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt\")\n\n  add_subdirectory(test)\n\nendif()\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/LICENSE",
    "content": "Boost Software License - Version 1.0 - August 17th, 2003\n\nPermission is hereby granted, free of charge, to any person or organization\nobtaining a copy of the software and accompanying documentation covered by\nthis license (the \"Software\") to use, reproduce, display, distribute,\nexecute, and transmit the Software, and to prepare derivative works of the\nSoftware, and to permit third-parties to whom the Software is furnished to\ndo so, all subject to the following:\n\nThe copyright notices in the Software and this entire statement, including\nthe above license grant, this restriction and the following disclaimer,\nmust be included in all copies of the Software, in whole or in part, and\nall derivative works of the Software, unless such copies or derivative\nworks are solely in the form of machine-executable object code generated by\na source language processor.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\nSHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\nFOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/README.md",
    "content": "Boost Multiprecision Library\n============================\n\n>ANNOUNCEMENT: Support for C++11 will be deprecated in this library starting in July 2023 (Boost 1.82).  \n>New features will require *at least* C++14, as will existing features starting with the deprecation release.\n\n|                  |  Master  |   Develop   |\n|------------------|----------|-------------|\n| Drone            |  [![Build Status](https://drone.cpp.al/api/badges/boostorg/multiprecision/status.svg?ref=refs/heads/master)](https://drone.cpp.al/boostorg/multiprecision) | [![Build Status](https://drone.cpp.al/api/badges/boostorg/multiprecision/status.svg)](https://drone.cpp.al/boostorg/multiprecision) |\n| Github Actions | [![Build Status](https://github.com/boostorg/multiprecision/workflows/multiprecision/badge.svg?branch=master)](https://github.com/boostorg/multiprecision/actions) | [![Build Status](https://github.com/boostorg/multiprecision/workflows/multiprecision/badge.svg?branch=develop)](https://github.com/boostorg/multiprecision/actions) |\n\n The Multiprecision Library provides integer, rational, floating-point, complex and interval number types in C++ that have more range and \n precision than C++'s ordinary built-in types. The big number types in Multiprecision can be used with a wide selection of basic \n mathematical operations, elementary transcendental functions as well as the functions in Boost.Math. The Multiprecision types can \n also interoperate with the built-in types in C++ using clearly defined conversion rules. This allows Boost.Multiprecision to be \n used for all kinds of mathematical calculations involving integer, rational and floating-point types requiring extended range and precision.\n\nMultiprecision consists of a generic interface to the mathematics of large numbers as well as a selection of big number back ends, with \nsupport for integer, rational and floating-point types. Boost.Multiprecision provides a selection of back ends provided off-the-rack in \nincluding interfaces to GMP, MPFR, MPIR, TomMath as well as its own collection of Boost-licensed, header-only back ends for integers, \nrationals, floats and complex. In addition, user-defined back ends can be created and used with the interface of Multiprecision, provided the class implementation adheres to the necessary concepts.\n\nDepending upon the number type, precision may be arbitrarily large (limited only by available memory), fixed at compile time \n(for example 50 or 100 decimal digits), or a variable controlled at run-time by member functions. The types are expression-template-enabled \nfor better performance than naive user-defined types. \n\nThe full documentation is available on [boost.org](http://www.boost.org/doc/libs/release/libs/multiprecision/index.html).\n\n## Standalone ##\n\nDefining BOOST_MP_STANDALONE allows Boost.Multiprecision to be used with the only dependency being [Boost.Config](https://github.com/boostorg/config). Our [package on this page](https://github.com/boostorg/multiprecision/releases)\nalready includes a copy of Boost.Config so no other donwloads are required. Some functionality is reduced in this mode. A static_assert message will alert you if a particular feature has been disabled by standalone mode.\n[Boost.Math](https://github.com/boostorg/math) standalone mode is compatiable, and recommended if special functions are required for the floating point types.\n\n## Support, bugs and feature requests ##\n\nBugs and feature requests can be reported through the [Gitub issue tracker](https://github.com/boostorg/multiprecision/issues)\n(see [open issues](https://github.com/boostorg/multiprecision/issues) and\n[closed issues](https://github.com/boostorg/multiprecision/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aclosed)).\n\nYou can submit your changes through a [pull request](https://github.com/boostorg/multiprecision/pulls).\n\nThere is no mailing-list specific to Boost Multiprecision, although you can use the general-purpose Boost [mailing-list](http://lists.boost.org/mailman/listinfo.cgi/boost-users) using the tag [multiprecision].\n\n\n## Development ##\n\nClone the whole boost project, which includes the individual Boost projects as submodules ([see boost+git doc](https://github.com/boostorg/boost/wiki/Getting-Started)): \n\n    git clone https://github.com/boostorg/boost\n    cd boost\n    git submodule update --init\n\nThe Boost Multiprecision Library is located in `libs/multiprecision/`. \n\n### Running tests ###\nFirst, build the B2 engine by running `bootstrap.sh` in the root of the boost directory. This will generate B2 configuration in `project-config.jam`.\n     \n    ./bootstrap.sh\n\nNow make sure you are in `libs/multiprecision/test`. You can either run all the tests listed in `Jamfile.v2` or run a single test:\n\n    ../../../b2                        <- run all tests\n    ../../../b2 test_complex           <- single test\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/config/Jamfile.v2",
    "content": "# copyright John Maddock 2008\n# Distributed under the Boost Software License, Version 1.0. \n# (See accompanying file LICENSE_1_0.txt or copy at \n# http://www.boost.org/LICENSE_1_0.txt.\n\nimport modules ;\nimport path ;\nimport ../../config/checks/config : requires ;\n\nlocal gmp_path = [ modules.peek : GMP_PATH ] ;\nlocal mpfr_path = [ modules.peek : MPFR_PATH ] ;\nlocal mpfi_path = [ modules.peek : MPFI_PATH ] ;\nlocal tommath_path = [ modules.peek : TOMMATH_PATH ] ;\n\nproject : requirements \n   <include>$(gmp_path) \n   <include>$(gmp_path)/mpfr \n   <include>$(gmp_path)/gmpfrxx \n   <include>$(mpfr_path)\n   <include>$(mpfi_path)\n   <include>$(mpfi_path)/src\n   <include>$(tommath_path)\n   <include>../../.. \n   <search>$(gmp_path) \n   <search>$(mpfr_path) \n   <search>$(mpfr_path)/build.vc10/lib/Win32/Debug\n   <search>$(tommath_path) \n   <search>$(mpfi_path) \n   <search>$(mpfi_path)/src \n   # We set these to make it easier to set up and test GMP and MPFR under Win32:\n   <toolset>msvc:<runtime-link>static\n   <toolset>msvc:<link>static\n   <toolset>intel-win:<runtime-link>static\n   <toolset>intel-win:<link>static\n   <toolset>msvc:<warnings>all\n   <toolset>gcc:<cxxflags>-Wall\n   <toolset>gcc:<cxxflags>-Wextra\n   ;\n\nlib gmp ;\nlib mpfr ;\nlib mpfi ;\nlib mpc ;\nlib quadmath ;\nlib tommath ;\nlib f2c ;\n\nactions mp_simple_run_action\n{\n      $(>) > $(<)\n}\n\nrule mp-run-simple ( sources + : args * : input-files * : requirements * : target-name )\n{\n   exe $(target-name)_exe : $(sources) : $(requirements) ;\n   explicit $(target-name)_exe ;\n   make $(target-name).output : $(target-name)_exe : @mp_simple_run_action ;\n   explicit $(target-name).output ;\n   alias $(target-name) : $(target-name).output ;\n}\n\nmp-run-simple has_gmp.cpp gmp : : :\n      <include>$(gmp_path) <include>$(gmp_path)/mpfr <include>$(gmp_path)/gmpfrxx : has_gmp ;\nmp-run-simple has_mpfr.cpp mpfr gmp : : :\n      <include>$(mpfr_path) <include>$(gmp_path)/mpfr <include>$(gmp_path)/gmpfrxx <include>$(gmp_path) : has_mpfr ;\nmp-run-simple has_mpfi.cpp mpfi mpfr gmp : : :\n      <include>$(mpfr_path) <include>$(gmp_path)/mpfr <include>$(gmp_path)/gmpfrxx <include>$(gmp_path) : has_mpfi ;\nmp-run-simple has_mpc.cpp mpc mpfr gmp : : :\n      <include>$(mpfr_path) <include>$(gmp_path)/mpfr <include>$(gmp_path)/gmpfrxx <include>$(gmp_path) : has_mpc ;\nmp-run-simple has_tommath.cpp tommath : : :\n      <include>$(tommath_path) : has_tommath ;\nmp-run-simple has_float128.cpp quadmath : : : : has_float128 ;\nexe has_intel_quad : has_intel_quad.cpp : <cxxflags>-Qoption,cpp,--extended_float_type ;\nexe has_eigen : has_eigen.cpp ;\nexe has_f2c : has_f2c.cpp f2c ;\nobj has_is_constant_evaluated : has_is_constant_evaluated.cpp ;\nobj has_constexpr_limits : has_constexpr_limits_cmd.cpp : <cxxflags>-fconstexpr-ops-limit=268435456 ;\nobj has_big_obj : has_big_obj.cpp : <cxxflags>-Wa,-mbig-obj ;\nobj is_ci_sanitizer_run : is_ci_sanitizer_run.cpp ;\n\nexplicit has_gmp ;\nexplicit has_mpfr ;\nexplicit has_mpfi ;\nexplicit has_tommath ;\nexplicit has_float128 ;\nexplicit has_intel_quad ;\nexplicit has_mpc ;\nexplicit has_eigen ;\nexplicit has_is_constant_evaluated ;\nexplicit has_constexpr_limits ;\nexplicit has_big_obj ;\nexplicit has_f2c ;\nexplicit is_ci_sanitizer_run ;\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/config/has_big_obj.cpp",
    "content": "//  Copyright John Maddock 2020.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef __GNUC__\n#error \"compiler is not GCC\"\n#endif\n\nint main()\n{\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/config/has_constexpr_limits_cmd.cpp",
    "content": "//  Copyright John Maddock 2019.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef __GNUC__\n#error \"Compiler is not GCC\"\n#endif\n#if __GNUC__ < 9\n#error \"Older GCC versions don't support -fconstexpr-ops-limit\"\n#endif\n\nint main()\n{\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/config/has_eigen.cpp",
    "content": "//  Copyright John Maddock 2011.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <Eigen/Dense>\n\nint main()\n{\n#if EIGEN_VERSION_AT_LEAST(3, 3, 0)\n#else\n#error \"Obsolete Eigen\"\n#endif\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/config/has_f2c.cpp",
    "content": "//  Copyright John Maddock 2019.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <f2c.h>\n\nint main()\n{\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/config/has_float128.cpp",
    "content": "//  Copyright John Maddock 2013.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/config.hpp>\n\n#ifndef BOOST_HAS_FLOAT128\n#error \"This doesn't work unless Boost.Config enables __float128 support\"\n#endif\n\nextern \"C\" {\n#include <quadmath.h>\n}\n\nint main()\n{\n   __float128 f = -2.0Q;\n   f            = fabsq(f);\n   f            = expq(f);\n\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/config/has_gmp.cpp",
    "content": "//  Copyright John Maddock 2008.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <cstddef> // See https://gcc.gnu.org/gcc-4.9/porting_to.html\n#include <gmp.h>\n#include <boost/config.hpp>\n\n#ifdef __GNUC__\n#pragma message \"__GNU_MP_VERSION=\" BOOST_STRINGIZE(__GNU_MP_VERSION)\n#pragma message \"__GNU_MP_VERSION_MINOR=\" BOOST_STRINGIZE(__GNU_MP_VERSION_MINOR)\n#endif\n\n#if (__GNU_MP_VERSION < 4) || ((__GNU_MP_VERSION == 4) && (__GNU_MP_VERSION_MINOR < 2))\n#error \"Incompatible GMP version\"\n#endif\n\nint main()\n{\n   void* (*alloc_func_ptr)(size_t);\n   void* (*realloc_func_ptr)(void*, size_t, size_t);\n   void (*free_func_ptr)(void*, size_t);\n\n   mp_get_memory_functions(&alloc_func_ptr, &realloc_func_ptr, &free_func_ptr);\n\n   mpz_t integ;\n   mpz_init(integ);\n   if (integ[0]._mp_d)\n      mpz_clear(integ);\n\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/config/has_intel_quad.cpp",
    "content": "//  Copyright John Maddock 2013.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\nextern \"C\" _Quad __fabs(_Quad);\n\nint main()\n{\n   _Quad f = -2.0Q;\n   f       = __fabsq(f);\n\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/config/has_is_constant_evaluated.cpp",
    "content": "//  Copyright John Maddock 2013.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n// This program determines if std::is_constant_evaluated  is available to switch within a function to use compile-time constexp calculations.\n// See https://en.cppreference.com/w/cpp/types/is_constant_evaluated\n// and https://en.cppreference.com/w/cpp/compiler_support\n// Currently only GCC 9 and Clang 9 and <cxxflags>-std=c++2a or  b2 cxxstd=2a\n\n// https://clang.llvm.org/docs/LanguageExtensions.html#builtin-macros\n\n// From Clang 10 onwards, __has_builtin(__X) can be used.  but also works for Clang 9\n\n// boost\\libs\\multiprecision\\config>b2 has_is_constant_evaluated toolset=clang-win-9.0.0 cxxstd=2a address-model=64 release  >  mp_is_const_eval_30Sep2019.log\n\n#include <boost/config.hpp>\n#include <boost/config/pragma_message.hpp>\n\n#include <boost/multiprecision/number.hpp>\n\n#ifdef __has_builtin\nBOOST_PRAGMA_MESSAGE (\" __has_builtin is defined.\")\n\n#  if __has_builtin(__builtin_is_constant_evaluated)\nBOOST_PRAGMA_MESSAGE (\" __has_builtin(__builtin_is_constant_evaluated), so BOOST_MP_NO_CONSTEXPR_DETECTION should NOT be defined.\")\n#  endif // __has_builtin(__builtin_is_constant_evaluated)\n\n#endif // __has_builtin\n\n#ifdef BOOST_MP_HAS_IS_CONSTANT_EVALUATED\nBOOST_PRAGMA_MESSAGE (\"BOOST_MP_HAS_IS_CONSTANT_EVALUATED defined.\")\n#else\nBOOST_PRAGMA_MESSAGE (\"BOOST_MP_HAS_IS_CONSTANT_EVALUATED is NOT defined, so no std::is_constant_evaluated() from std library.\")\n#endif\n\n#ifdef BOOST_NO_CXX14_CONSTEXPR\nBOOST_PRAGMA_MESSAGE (\"BOOST_NO_CXX14_CONSTEXPR is defined.\")\n#endif\n\n#ifdef BOOST_MP_NO_CONSTEXPR_DETECTION\n#  error 1  \"std::is_constant_evaluated is NOT available to determine if a calculation can use constexpr.\"\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/config/has_mpc.cpp",
    "content": "//  Copyright John Maddock 2018.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <cstddef> // See https://gcc.gnu.org/gcc-4.9/porting_to.html\n#include <mpc.h>\n#include <boost/config.hpp>\n\n#ifdef __GNUC__\n#pragma message \"MPFR_VERSION_STRING=\" MPFR_VERSION_STRING\n#endif\n\n#if (__GNU_MP_VERSION < 4) || ((__GNU_MP_VERSION == 4) && (__GNU_MP_VERSION_MINOR < 2))\n#error \"Incompatible GMP version\"\n#endif\n\n#if (MPFR_VERSION < 3)\n#error \"Incompatible MPFR version\"\n#endif\n\n#ifdef __GNUC__\n#pragma message \"__GNU_MP_VERSION=\" BOOST_STRINGIZE(__GNU_MP_VERSION)\n#pragma message \"__GNU_MP_VERSION_MINOR=\" BOOST_STRINGIZE(__GNU_MP_VERSION_MINOR)\n#endif\n\n#if (__GNU_MP_VERSION < 4) || ((__GNU_MP_VERSION == 4) && (__GNU_MP_VERSION_MINOR < 2))\n#error \"Incompatible GMP version\"\n#endif\n\n/*\n#ifdef __GNUC__\n#pragma message \"MPFI_VERSION_MAJOR=\" BOOST_STRINGIZE(MPFI_VERSION_MAJOR)\n#pragma message \"MPFI_VERSION_MAJOR=\" BOOST_STRINGIZE(MPFI_VERSION_MAJOR)\n#endif \n\n#if MPFI_VERSION_MAJOR < 1\n#error \"Incompatible MPFI version\"\n#endif\n#if (MPFI_VERSION_MAJOR == 1) && (MPFI_VERSION_MINOR < 5)\n#error \"Incompatible MPFI version\"\n#endif\n*/\nint main()\n{\n   void* (*alloc_func_ptr)(size_t);\n   void* (*realloc_func_ptr)(void*, size_t, size_t);\n   void (*free_func_ptr)(void*, size_t);\n\n   mp_get_memory_functions(&alloc_func_ptr, &realloc_func_ptr, &free_func_ptr);\n\n   mpfr_buildopt_tls_p();\n\n   mpc_t t;\n   mpc_init2(t, 128);\n   mpc_clear(t);\n\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/config/has_mpfi.cpp",
    "content": "//  Copyright John Maddock 2012.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <cstddef> // See https://gcc.gnu.org/gcc-4.9/porting_to.html\n#include <mpfi.h>\n#include <boost/config.hpp>\n\n#ifdef __GNUC__\n#pragma message \"MPFR_VERSION_STRING=\" MPFR_VERSION_STRING\n#endif\n\n#if (__GNU_MP_VERSION < 4) || ((__GNU_MP_VERSION == 4) && (__GNU_MP_VERSION_MINOR < 2))\n#error \"Incompatible GMP version\"\n#endif\n\n#if (MPFR_VERSION < 3)\n#error \"Incompatible MPFR version\"\n#endif\n\n#ifdef __GNUC__\n#pragma message \"__GNU_MP_VERSION=\" BOOST_STRINGIZE(__GNU_MP_VERSION)\n#pragma message \"__GNU_MP_VERSION_MINOR=\" BOOST_STRINGIZE(__GNU_MP_VERSION_MINOR)\n#endif\n\n#if (__GNU_MP_VERSION < 4) || ((__GNU_MP_VERSION == 4) && (__GNU_MP_VERSION_MINOR < 2))\n#error \"Incompatible GMP version\"\n#endif\n\n/*\n#ifdef __GNUC__\n#pragma message \"MPFI_VERSION_MAJOR=\" BOOST_STRINGIZE(MPFI_VERSION_MAJOR)\n#pragma message \"MPFI_VERSION_MAJOR=\" BOOST_STRINGIZE(MPFI_VERSION_MAJOR)\n#endif \n\n#if MPFI_VERSION_MAJOR < 1\n#error \"Incompatible MPFI version\"\n#endif\n#if (MPFI_VERSION_MAJOR == 1) && (MPFI_VERSION_MINOR < 5)\n#error \"Incompatible MPFI version\"\n#endif\n*/\nint main()\n{\n   void* (*alloc_func_ptr)(size_t);\n   void* (*realloc_func_ptr)(void*, size_t, size_t);\n   void (*free_func_ptr)(void*, size_t);\n\n   mp_get_memory_functions(&alloc_func_ptr, &realloc_func_ptr, &free_func_ptr);\n\n   mpfr_buildopt_tls_p();\n\n   mpfi_t t;\n   mpfi_init2(t, 128);\n   if (t[0].left._mpfr_d)\n      mpfi_clear(t);\n\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/config/has_mpfr.cpp",
    "content": "//  Copyright John Maddock 2012.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <cstddef> // See https://gcc.gnu.org/gcc-4.9/porting_to.html\n#include <mpfr.h>\n#include <boost/config.hpp>\n\n#ifdef __GNUC__\n#pragma message \"MPFR_VERSION_STRING=\" MPFR_VERSION_STRING\n#endif\n\n#if (__GNU_MP_VERSION < 4) || ((__GNU_MP_VERSION == 4) && (__GNU_MP_VERSION_MINOR < 2))\n#error \"Incompatible GMP version\"\n#endif\n\n#if (MPFR_VERSION < 3)\n#error \"Incompatible MPFR version\"\n#endif\n\n#ifdef __GNUC__\n#pragma message \"__GNU_MP_VERSION=\" BOOST_STRINGIZE(__GNU_MP_VERSION)\n#pragma message \"__GNU_MP_VERSION_MINOR=\" BOOST_STRINGIZE(__GNU_MP_VERSION_MINOR)\n#endif\n\n#if (__GNU_MP_VERSION < 4) || ((__GNU_MP_VERSION == 4) && (__GNU_MP_VERSION_MINOR < 2))\n#error \"Incompatible GMP version\"\n#endif\n\nint main()\n{\n   void* (*alloc_func_ptr)(size_t);\n   void* (*realloc_func_ptr)(void*, size_t, size_t);\n   void (*free_func_ptr)(void*, size_t);\n\n   mp_get_memory_functions(&alloc_func_ptr, &realloc_func_ptr, &free_func_ptr);\n\n   mpfr_buildopt_tls_p();\n\n   mpfr_t t;\n   mpfr_init2(t, 128);\n   if (t[0]._mpfr_d)\n      mpfr_clear(t);\n\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/config/has_tommath.cpp",
    "content": "//  Copyright John Maddock 2011.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <tommath.h>\n\nint main()\n{\n   mp_int v;\n   mp_init(&v);\n   if (v.dp)\n      mp_clear(&v);\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/config/is_ci_sanitizer_run.cpp",
    "content": "//  Copyright John Maddock 2021.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#if !defined(BOOST_CI_SANITIZER_BUILD)\n#  error \"Sanitizer is NOT in effect\".\n#endif\n\nint main()\n{\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/Jamfile.v2",
    "content": "\n# Copyright John Maddock 2011. Use, modification, and distribution are\n# subject to the Boost Software License, Version 1.0. (See accompanying\n# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\nusing quickbook ;\nusing auto-index ;\n\npath-constant images_location : html ;\npath-constant here : . ;\n\nxml multiprecision : multiprecision.qbk ;\n\nboostbook standalone\n    :\n        multiprecision\n    :\n        # Path for links to Boost:\n        <xsl:param>boost.root=../../../..\n        \n        # Some general style settings:\n        <xsl:param>table.footnote.number.format=1\n        <xsl:param>footnote.number.format=1\n        #<xsl:param>html.stylesheet=../../../../doc/src/boostbook.css\n\n        # HTML options first:\n        # Use graphics not text for navigation:\n        <xsl:param>navig.graphics=1\n        # How far down we chunk nested sections, basically all of them:\n        <xsl:param>chunk.section.depth=10\n        # Don't put the first section on the same page as the TOC:\n        <xsl:param>chunk.first.sections=10\n        # How far down sections get TOC's\n        <xsl:param>toc.section.depth=10\n        # Max depth in each TOC:\n        <xsl:param>toc.max.depth=4\n        # How far down we go with TOC's\n        #<xsl:param>generate.section.toc.level=10\n        # Index on type:\n        <xsl:param>index.on.type=1\n        <xsl:param>html.stylesheet=multiprecision.css # Local variant for multiprecision,\n        # extending 'standard' BOOST_ROOT/doc/src/boostbook.css with\n        # @import url('../../../../doc/src/boostbook.css');\n        # in location multiprecision/doc/html/multiprecision.css\n    \n       \n        # PDF Options:\n        # TOC Generation: this is needed for FOP-0.9 and later:\n        <xsl:param>fop1.extensions=0\n        <format>pdf:<xsl:param>xep.extensions=1\n        # TOC generation: this is needed for FOP 0.2, but must not be set to zero for FOP-0.9!\n        <format>pdf:<xsl:param>fop.extensions=0\n        <format>pdf:<xsl:param>fop1.extensions=0\n        # No indent on body text:\n        <format>pdf:<xsl:param>body.start.indent=0pt\n        # Margin size:\n        <format>pdf:<xsl:param>page.margin.inner=0.5in\n        # Margin size:\n        <format>pdf:<xsl:param>page.margin.outer=0.5in\n        # Paper type = A4\n        <format>pdf:<xsl:param>paper.type=A4\n        # Yes, we want graphics for admonishments:\n        <xsl:param>admon.graphics=1\n        # Set these for PDF generation *only*:\n        # default PNG graphics are awful in PDF form,\n        # better use SVGs instead:\n        <format>pdf:<xsl:param>admon.graphics.extension=\".svg\"\n        <format>pdf:<xsl:param>use.role.for.mediaobject=1 \n        <format>pdf:<xsl:param>preferred.mediaobject.role=print\n        <format>pdf:<xsl:param>img.src.path=$(images_location)/\n        <format>pdf:<xsl:param>draft.mode=\"no\"\n        # This is copied from math but doesn't look right for here?\n        <format>pdf:<xsl:param>boost.url.prefix=http\\://www.boost.org/doc/libs/release/libs/math/doc/sf_and_dist/html\n\n# Experimental - use SVG for html to improve image quality.\n#  .SVG files are roughly twice the .png size and so a bit gross.\n# This also changes the admonitions icons.\n#       <format>html:<xsl:param>admon.graphics.extension=\".svg\"\n        <format>html:<xsl:param>use.role.for.mediaobject=1 \n        <format>html:<xsl:param>preferred.mediaobject.role=print\n     #   <format>html:<xsl:param>img.src.path=$(images_location)/ isn't right for html.\n        <format>html:<xsl:param>draft.mode=\"no\"\n        <format>html:<xsl:param>boost.url.prefix=http\\://www.boost.org/doc/libs/release/libs/multiprecision/doc/html\n        \n        # Index generation:\n        <auto-index>on\n        <auto-index-script>$(here)/index.idx\n        <auto-index-prefix>$(here)/../../.. \n        <auto-index-verbose>on\n        <format>html:<auto-index-internal>on\n        <quickbook-define>enable_index \n        <format>pdf:<xsl:param>index.on.type=1\n    ;\n\ninstall pdfinstall : standalone : <location>. <install-type>PDF <name>multiprecision.pdf ;\n\n###############################################################################\nalias boostdoc ;\nexplicit boostdoc ;\nalias boostrelease : standalone ;\nexplicit boostrelease ;\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/floating_point_eg1.mml",
    "content": "<?xml version='1.0'?>\n<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN'\n  'http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd'\n  [<!ENTITY mathml 'http://www.w3.org/1998/Math/MathML'>]>\n<html xmlns='http://www.w3.org/1999/xhtml'>\n<head><title>floating_point_eg1</title>\n<!-- MathML created with MathCast Equation Editor version 0.89 -->\n</head>\n<body>\n<math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\">\n  <mrow>\n    <mfenced>\n      <mrow>\n        <mn>1</mn>\n      </mrow>\n    </mfenced>\n    <mspace width=\"1em\"/>\n    <mspace width=\"1em\"/>\n    <mtable>\n      <mtr>\n        <mtd>\n          <mi>f</mi>\n          <mo>&#x2032;</mo>\n          <mfenced>\n            <mrow>\n              <mi>x</mi>\n            </mrow>\n          </mfenced>\n        </mtd>\n        <mtd>\n          <mo>&#x2248;</mo>\n        </mtd>\n        <mtd>\n          <msub>\n            <mi>m</mi>\n            <mn>1</mn>\n          </msub>\n          <mo>+</mo>\n          <mi>O</mi>\n          <mfenced>\n            <mrow>\n              <mi>d</mi>\n              <msup>\n                <mi>x</mi>\n                <mn>2</mn>\n              </msup>\n            </mrow>\n          </mfenced>\n        </mtd>\n      </mtr>\n      <mtr>\n        <mtd>\n          <mi>f</mi>\n          <mo>&#x2032;</mo>\n          <mfenced>\n            <mrow>\n              <mi>x</mi>\n            </mrow>\n          </mfenced>\n        </mtd>\n        <mtd>\n          <mo>&#x2248;</mo>\n        </mtd>\n        <mtd>\n          <mfrac>\n            <mn>4</mn>\n            <mn>3</mn>\n          </mfrac>\n          <msub>\n            <mi>m</mi>\n            <mn>1</mn>\n          </msub>\n          <mo>&#x2212;</mo>\n          <mfrac>\n            <mn>1</mn>\n            <mn>3</mn>\n          </mfrac>\n          <msub>\n            <mi>m</mi>\n            <mn>2</mn>\n          </msub>\n          <mo>+</mo>\n          <mi>O</mi>\n          <mfenced>\n            <mrow>\n              <mi>d</mi>\n              <msup>\n                <mi>x</mi>\n                <mn>4</mn>\n              </msup>\n            </mrow>\n          </mfenced>\n        </mtd>\n      </mtr>\n      <mtr>\n        <mtd>\n          <mi>f</mi>\n          <mo>&#x2032;</mo>\n          <mfenced>\n            <mrow>\n              <mi>x</mi>\n            </mrow>\n          </mfenced>\n        </mtd>\n        <mtd>\n          <mo>&#x2248;</mo>\n        </mtd>\n        <mtd>\n          <mfrac>\n            <mn>3</mn>\n            <mn>2</mn>\n          </mfrac>\n          <msub>\n            <mi>m</mi>\n            <mn>1</mn>\n          </msub>\n          <mo>&#x2212;</mo>\n          <mfrac>\n            <mn>3</mn>\n            <mn>5</mn>\n          </mfrac>\n          <msub>\n            <mi>m</mi>\n            <mn>2</mn>\n          </msub>\n          <mo>+</mo>\n          <mfrac>\n            <mn>1</mn>\n            <mn>10</mn>\n          </mfrac>\n          <msub>\n            <mi>m</mi>\n            <mn>3</mn>\n          </msub>\n          <mo>+</mo>\n          <mi>O</mi>\n          <mfenced>\n            <mrow>\n              <mi>d</mi>\n              <msup>\n                <mi>x</mi>\n                <mn>6</mn>\n              </msup>\n            </mrow>\n          </mfenced>\n        </mtd>\n      </mtr>\n    </mtable>\n  </mrow>\n</math>\n</body>\n</html>\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/floating_point_eg2.mml",
    "content": "<?xml version='1.0'?>\n<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN'\n  'http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd'\n  [<!ENTITY mathml 'http://www.w3.org/1998/Math/MathML'>]>\n<html xmlns='http://www.w3.org/1999/xhtml'>\n<head><title>floating_point_eg2</title>\n<!-- MathML created with MathCast Equation Editor version 0.89 -->\n</head>\n<body>\n<math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\">\n  <mrow>\n    <mfenced>\n      <mrow>\n        <mn>2</mn>\n      </mrow>\n    </mfenced>\n    <mspace width=\"1em\"/>\n    <mspace width=\"1em\"/>\n    <mtable>\n      <mtr>\n        <mtd>\n          <msub>\n            <mi>m</mi>\n            <mn>1</mn>\n          </msub>\n        </mtd>\n        <mtd>\n          <mo>=</mo>\n        </mtd>\n        <mtd>\n          <mfrac>\n            <mrow>\n              <mi>f</mi>\n              <mfenced>\n                <mrow>\n                  <mi>x</mi>\n                  <mo>+</mo>\n                  <mi>d</mi>\n                  <mi>x</mi>\n                </mrow>\n              </mfenced>\n              <mo>&#x2212;</mo>\n              <mi>f</mi>\n              <mfenced>\n                <mrow>\n                  <mi>x</mi>\n                  <mo>&#x2212;</mo>\n                  <mi>d</mi>\n                  <mi>x</mi>\n                </mrow>\n              </mfenced>\n            </mrow>\n            <mrow>\n              <mn>2</mn>\n              <mi>d</mi>\n              <mi>x</mi>\n            </mrow>\n          </mfrac>\n        </mtd>\n      </mtr>\n      <mtr>\n        <mtd>\n          <msub>\n            <mi>m</mi>\n            <mn>2</mn>\n          </msub>\n        </mtd>\n        <mtd>\n          <mo>=</mo>\n        </mtd>\n        <mtd>\n          <mfrac>\n            <mrow>\n              <mi>f</mi>\n              <mfenced>\n                <mrow>\n                  <mi>x</mi>\n                  <mo>+</mo>\n                  <mn>2</mn>\n                  <mi>d</mi>\n                  <mi>x</mi>\n                </mrow>\n              </mfenced>\n              <mo>&#x2212;</mo>\n              <mi>f</mi>\n              <mfenced>\n                <mrow>\n                  <mi>x</mi>\n                  <mo>&#x2212;</mo>\n                  <mn>2</mn>\n                  <mi>d</mi>\n                  <mi>x</mi>\n                </mrow>\n              </mfenced>\n            </mrow>\n            <mrow>\n              <mn>4</mn>\n              <mi>d</mi>\n              <mi>x</mi>\n            </mrow>\n          </mfrac>\n        </mtd>\n      </mtr>\n      <mtr>\n        <mtd>\n          <msub>\n            <mi>m</mi>\n            <mn>3</mn>\n          </msub>\n        </mtd>\n        <mtd>\n          <mo>=</mo>\n        </mtd>\n        <mtd>\n          <mfrac>\n            <mrow>\n              <mi>f</mi>\n              <mfenced>\n                <mrow>\n                  <mi>x</mi>\n                  <mo>+</mo>\n                  <mn>3</mn>\n                  <mi>d</mi>\n                  <mi>x</mi>\n                </mrow>\n              </mfenced>\n              <mo>&#x2212;</mo>\n              <mi>f</mi>\n              <mfenced>\n                <mrow>\n                  <mi>x</mi>\n                  <mo>&#x2212;</mo>\n                  <mn>3</mn>\n                  <mi>d</mi>\n                  <mi>x</mi>\n                </mrow>\n              </mfenced>\n            </mrow>\n            <mrow>\n              <mn>6</mn>\n              <mi>d</mi>\n              <mi>x</mi>\n            </mrow>\n          </mfrac>\n        </mtd>\n      </mtr>\n    </mtable>\n  </mrow>\n</math>\n</body>\n</html>\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/floating_point_eg3.mml",
    "content": "<?xml version='1.0'?>\n<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN'\n  'http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd'\n  [<!ENTITY mathml 'http://www.w3.org/1998/Math/MathML'>]>\n<html xmlns='http://www.w3.org/1999/xhtml'>\n<head><title>floating_point_eg3</title>\n<!-- MathML created with MathCast Equation Editor version 0.89 -->\n</head>\n<body>\n<math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\">\n  <mrow>\n    <mfenced>\n      <mrow>\n        <mn>3</mn>\n      </mrow>\n    </mfenced>\n    <mspace width=\"1em\"/>\n    <mspace width=\"1em\"/>\n    <mfrac>\n      <mi>d</mi>\n      <mrow>\n        <mi>d</mi>\n        <mi>x</mi>\n      </mrow>\n    </mfrac>\n    <mi>sin</mi>\n    <mi>x</mi>\n    <msub>\n      <mo>|</mo>\n      <mrow>\n        <mi>x</mi>\n        <mo>=</mo>\n        <mfrac>\n          <mi>&#x03C0;</mi>\n          <mn>3</mn>\n        </mfrac>\n      </mrow>\n    </msub>\n    <mo>=</mo>\n    <mi>cos</mi>\n    <mfrac>\n      <mi>&#x03C0;</mi>\n      <mn>3</mn>\n    </mfrac>\n    <mo>=</mo>\n    <mfrac>\n      <mn>1</mn>\n      <mn>2</mn>\n    </mfrac>\n  </mrow>\n</math>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/generate.sh",
    "content": "#  Copyright John Maddock 2008.\n#  Use, modification and distribution are subject to the\n#  Boost Software License, Version 1.0. (See accompanying file\n#  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#\n# Generates SVG and PNG files from the MML masters.\n#\n# Paths to tools come first, change these to match your system:\n#\nmath2svg='m:\\download\\open\\SVGMath-0.3.1\\math2svg.py'\npython=/cygdrive/c/Python26/python.exe\ninkscape=/cygdrive/c/progra~1/Inkscape/inkscape\n# Image DPI:\ndpi=120\n\nfor mmlfile in $*; do\n\tsvgfile=$(basename $mmlfile .mml).svg\n\tpngfile=$(basename $svgfile .svg).png\n\ttempfile=temp.mml\n\t# strip html wrappers put in by MathCast:\n\tcat $mmlfile | tr -d \"\\r\\n\" | sed -e 's/.*\\(<math[^>]*>.*<\\/math>\\).*/\\1/' > $tempfile\n\t\n\techo Generating $svgfile\n\t$python $math2svg $tempfile > $svgfile\n\techo Generating $pngfile\n\t$inkscape -d $dpi -e $(cygpath -a -w $pngfile) $(cygpath -a -w $svgfile)\n\trm $tempfile\ndone\n\n\n\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/history.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:map Roadmap]\n\n[section:hist History]\n\n[h4 Multiprecision-4.1.2 (Boost-1.81)]\n\n* Correct thread-safe static initialization of constants for __cpp_bin_float, see [@https://github.com/boostorg/multiprecision/issues/497 497].\n* Correct __cpp_int `import_bits` when just importing the leading few bits of the value, see [@https://github.com/boostorg/multiprecision/issues/488 488].\n* Remove some C++03 idioms, including use of `0` rather than `nullptr`.\n* Minor fixes for gcc-12 on Mingw.\n\n[h4 Multiprecision-4.1.1 (Boost-1.80)]\n\n* [*Mark C++11 support as deprecated]: from 2023 we will move to requiring C++14 as a minimum standard level.  That will drop support for\nGCC versions prior to 5 and MSVC prior to 14.1.\n* Fix conflict between `boost/cstdfloat.hpp` and this library.\n* Clean up lots of gcc and clang warnings.\n* Fix input streaming of composite types (complex, interval rational) where there is a trailing delimeter in the stream and no whitespace.\n* Fix `constexpr` integer square root where the input is 1, 2 or 3.\n* Add missing `#include` of `<memory>` to float128.hpp.\n* Correct 2-arg constructor for class `number` to prevent ambiguity in some cases.\n* Correct and make more consistent behaviour of divide-by-zero in gmp.hpp.\n\n\n[h4 Multiprecision-4.1.0 (Boost-1.79)]\n\n* Big update to support use of this library \"standalone\": ie without the rest of Boost.  A copy\nof Boost.Config is still required, and use of Boost.Math to provide the C99 special functions is optional.\n* Fix IO of floating point numbers when `std::ios_base::fixed` is in effect and the precision is zero.\n* Fix various spurious GCC warnings in cpp_int bitwise operators.\n* Use `float128_type` typedef throughout to suppress GCC/clang warnings about using a non-standard extension.\n* Correct conversion of Intel's _Quad type to string, see [@https://github.com/boostorg/multiprecision/issues/427 #427].\n* Correct usage of Intel intrinsics on GCC to avoid simply checking for the header, see [@https://github.com/boostorg/multiprecision/issues/419 #419].\n* Update `signbit` to match `std::signbit` and to return the correct sign when the result is zero, [@https://github.com/boostorg/multiprecision/issues/426 #426].\n* Fix over-large reductions in default sin/cos code.\n* Fix some mpq rational arithmetic errors: Multiplication by zero should not proceed via gcd, and multiplication by scalar should be restricted to integer types (not floats).\n* Support conversion to and from `__int128` and `__float128` everywhere, not just on an add-hock basis, [@https://github.com/boostorg/multiprecision/issues/237 #237].\n* Avoid unnecessary copying in cpp_int's add_unsigned, [@https://github.com/boostorg/multiprecision/issues/357 #357].\n* Change all bit counts to use `std::size_t` or `std::ptrdiff_t`, [@https://github.com/boostorg/multiprecision/issues/362 #362].\n* Bring Eigen traits classes up to date and add tests.\n* Fix `is_byte_container` to correctly handle Eigen types, [@https://github.com/boostorg/multiprecision/issues/398 #398].\n* Improve cpp_int to float conversion to be insensitive to floating point control flags, [@https://github.com/boostorg/multiprecision/issues/360 #360].\n* Correct interop between signed-zeros and complex number types, [@https://github.com/boostorg/multiprecision/issues/396 #396].\n\n\n[h4 Multiprecision-4.0.2 (Boost-1.78)]\n\n* Rework rational_adaptor to remove dependency on Boost.Rational and improve performance.\n* Fix issue with type_traits and clang, see [@https://github.com/boostorg/multiprecision/issues/383 #383].\n* Fixed buggy Lehmer's GCD routine, see [@https://github.com/boostorg/multiprecision/issues/370 #370].\n* Fix mpc_complex constructors so that lossy conversions are explicit, see [@https://github.com/boostorg/multiprecision/issues/363 #363].\n* Correct miscellaneous configuration issues (Intel intrinsic usage and Apple clang).\n* Correct some iostream operators for unsigned char types.\n* Correct mpq_rational conversions to integer types, see [@https://github.com/boostorg/multiprecision/issues/342 #342].\n\n[h4 Multiprecision-4.0.1 (Boost-1.77)]\n\n* Much improved Karatsuba sqrt for cpp_int/cpp_bin_float.\n* Added C++11 compatible `to_string` free function.\n* Fixed bug in Lehmer GCD code, see [@https://github.com/boostorg/multiprecision/issues/322 #322]. \n* Fixed debug_adaptor/logged_adaptor to work better with complex, rational and interval types, see [@https://github.com/boostorg/multiprecision/issues/329 #329].\n* Big update to mixed-variable precision arithmetic code with better options and thread safety, see [link boost_multiprecision.tut.variable docs].\n* Fixed up hashing of bools and enums when creating hash values.\n* Improved conversions to and from enum types.\n* Restricted use of Intel intrinsics to when we really are building for Intel even though the header may be available, see [@https://github.com/boostorg/multiprecision/issues/321 #321].\n* Tidied up Lanczos approximation usage, in conjunction with Boost.Math this improves the reliability and accuracy of many special functions.\n* Fix use of libtommath deprecated features.\n* Fixed missing sqrt overload, see [@https://github.com/boostorg/multiprecision/issues/319 #319].\n* Added Karatsuba multiplication to cpp_dec_float to bring it into line with the other types in this library.\n* Added some minor optimizations to mpfr comparison operators.\n\n\n[h4 Multiprecision-4.0.0 (Boost-1.76)]\n\n* [*BREAKING CHANGE]: Massive refactoring and code simpification makes C++11 an absolute requirement.\n* Use BOOST_TRY/CATCH in headers so code can be use din s=exception-free environments.\n* Correct corner case in pow, fixes [@https://github.com/boostorg/multiprecision/issues/277 #277]. \n* Correct exception type thrown to match docs in lsb/msb: fixes [@https://github.com/boostorg/multiprecision/issues/257 #257].\n* Allow moves and operators between related but different types (ie types with the same allocator), fixes [@https://github.com/boostorg/multiprecision/issues/278 #278].\n\n[h4 Multiprecision-3.2.5 (Boost-1.75)]\n\n* Much improved gcd and modulus operations for __cpp_int.\n* Improved addition/subtraction routines for __cpp_int via Intel's intrinsics.\n* __gmp_int: add better conversion routines for `long long` and `__int128`.\n* __mpfr_float_backend: Fix `log1p` corner case.\n* Improve accuracy of complex tan/tanh.\n* Improve accuracy of trig functions for __cpp_bin_float.\n\n[h4 Multiprecision-3.2.4 (Boost-1.73)]\n\n* IMPORTANT: Mark C++03 support as deprecated and due for removal in 2021.\n* Big update to __cpp_int adds faster Karatsuba and Coomba multiplication routines.\n* Fix conversion of __gmp_rational to `long double` and `__float128`, fixes [@https://github.com/boostorg/multiprecision/issues/178 #178].\n* Fix up libtommath support to function with the latest libtom releases.\n* Fix up some incompatibilities with the latest Intel C++ compiler.\n* Fix up `constexpr` arithmetic support for forthcoming MSVC release.\n\n[h4 Multiprecision-3.2.3 (Boost-1.72)]\n\n* Big `constexpr` update allows __cpp_int and __float128__ arithmetic to be fully `constexpr` with gcc and clang 9 or later,\nor any compiler supporting `std::is_constant_evaluated()`.\n\n[h4 Multiprecision-3.1.3 (Boost-1.71)]\n\n* Support hexfloat io-formatting for float128.\n* Fix various bugs in variable precision interconversions.\n* Respect uppercase for '0x' prefix outputs.\n* Incorporate some unit tests from the Etherium project.\n* Fix some gcc warnings.\n\n[h4 Multiprecision-3.1.2 (Boost-1.70)]\n\n* Fix various conversion issues in the traits classes, check for compatibility with Boost.Optional.\n* Prevent instantiation of `std::numeric_limits` on any old type when checking for convertibility.  See [@https://github.com/boostorg/multiprecision/issues/98 #98].\n* Update variable precision code to accound for arbitrary precision integers.  See [@https://github.com/boostorg/multiprecision/issues/103 #103].\n* Add support for XML serialization archives.\n* Fix bug in fixed precision iostream formatting in `mpf_float` and `mpfr_float`.  See [@https://github.com/boostorg/multiprecision/issues/113 #113].\n* Add more overloads for special functions which are better handled natively by MPFR.\n* Fixed bug in generic `exp` implementation which could cause invariant failure.\n* Fixed generic conversion from float to integer to avoid undefined behaviour.  See [@https://github.com/boostorg/multiprecision/issues/110 #110].\n\n[h4 Multiprecision-3.1.1 (Boost-1.69)]\n\n* Big update to better support variable precision types so that the precision of the result\nis always the largest of all the arguments.\n* Add support for allocators that are `final` in __cpp_int.\n* Removed use of deprecated Boost.Endian in favour of Predef.\n* Add support for `std::string_view`.\n* Fixed minor bug in constant initialization.  See [@https://github.com/boostorg/multiprecision/issues/67 #67].\n* Make assignment of non-finite value to `cpp_int` a runtime errors.  See [@https://github.com/boostorg/multiprecision/issues/58 #58].\n* Added typedefs for `cpp_bin_float_oct` and `cpp_complex_oct`.\n\n[h4 Multiprecision-3.1.0 (Boost-1.68)]\n\n* Support added for complex multiprecision numbers.\n* Changed conversion to unsigned integer types to be truncating to match standard defined behaviour.\n* Correct bug in MPFR string formatting.\n* Fix undefined behaviour in cpp_dec_float conversion from long long.\n* Add support for Eigen interoperability.\n* float128.hpp: Fix Intel on Windows build.\n* Fix type used in temporaries when expanding expression templates containing mixed expressions.\n* Fix infinite loop in gmp_float to fixed-point string conversion.\n* Update the expression templates to issue static_asserts with better error messages when you try and do something unsupported.\n* Fix bug in cpp_int where incrementing to zero doesn't set the sign correctly.\n* Remove erroneous use of std::move, and rely on NVRO instead.\n* Fix up support for changes to MPIR-3.0.\n* Fix various conversion errors in cpp_bin_float when the exponent type is a `long long`, or else we're converting to\nan integer that is wider than we are.\n* Fix compatibility issue with GCC-8 caused by the introduction of `std::byte`.\n\n[h4 Multiprecision-3.0.0 (Boost-1.67)]\n\n* [*Breaking Change:] When converting a multiprecision integer to a narrower type, if the value is too large (or negative) to\nfit in the smaller type, then the result is either the maximum (or minimum) value of the target type.  This was always the intended\nbehaviour, but was somewhat haphazardly enforced before.  If you really do want just the low order N bits of a value, then you will\nneed to mask these out prior to the case, for example: `static_cast<unsigned>(~static_cast<unsigned>(0) & my_value)`.  Note that\ntechnically (to avoid undefined behaviour) you should do the same thing with __fundamental integer types too.\nSee [@https://svn.boost.org/trac/boost/ticket/13109 #13109].\n* Fix bug in conversion of decimal to rational types (zero needs special handling), see [@https://svn.boost.org/trac/boost/ticket/13148 #13148].\n* Fix conversion from cpp_bin_float to a wider __fundamental integer type, see [@https://svn.boost.org/trac/boost/ticket/13301 #13301].\n* Improve performance heurists used in cpp_bin_float exp function.\n* Fix bug in floor/ceil and cpp_bin_float when the exponent type is wider than an int, see [@https://svn.boost.org/trac/boost/ticket/13264 #13264].\n* Disable explicit conversion operator when the target type is already constructible from this type, see  [@https://github.com/boostorg/multiprecision/issues/30 #30].\n* Fix support for changes new to MPIR-3.0, see [@https://svn.boost.org/trac/boost/ticket/13124 #13124].\n\n[h4 Multiprecision-2.3.2 (Boost-1.65)]\n\n* Updated expression templates to store arithmetic literals directly in the expression template to prevent dangling references, see [@https://github.com/boostorg/multiprecision/issues/19 #19].\n* Fix various issues with huge values and overflow in the trig, pow and exp functions, see [@https://github.com/boostorg/multiprecision/issues/24 #24].\n* Fix error handling of checked cpp_int multiply that could cause some overflows to be missed.\n\n[h4 Multiprecision-2.3.1 (Boost-1.64)]\n\n* In `cpp_bin_float` prevent double rounding when converting to a denormalized float.  See [@https://svn.boost.org/trac/boost/ticket/12527 #12527].\n* Fix bug in integer sqrt for very small integers.  See [@https://svn.boost.org/trac/boost/ticket/12559 #12559].\n* Fix conversion to signed-zero in `cpp_bin_float`.\n* Change `cpp_bin_float` rounding code to round at arbitrary location so we can use it for conversions, see [@https://svn.boost.org/trac/boost/ticket/12527 #12527].\n* Improve performance of 128-bit bit-scan operations.\n* Fix subtraction of very small quantities in `cpp_bin_float`.  See: [@https://svn.boost.org/trac/boost/ticket/12580 #12580].\n* Bring error handling into line with C99 Annex F.  See [@https://svn.boost.org/trac/boost/ticket/12581 #12581].\n* Fix bitwise export of trivial `cpp_int`'s, see [@https://svn.boost.org/trac/boost/ticket/12627 #12627].\n* Fix `ilogb` (and code that uses it) to consistently return the smallest value of the exponent type when the argument is zero, see [@https://svn.boost.org/trac/boost/ticket/12625 #12625].\n* Allow conversion from `__float128__` to `cpp_bin_float`.\n* Fix bug in left shift of `cpp_int` which would result in bit-loss, see [@https://svn.boost.org/trac/boost/ticket/12790 #12790].\n* Fixed bugs in bounded but variable precision `cpp_int`'s caused by over-aggressive constexpr optimization, see [@https://svn.boost.org/trac/boost/ticket/12798 #12798].\n\n\n[h4 Multiprecision-2.3.0 (Boost-1.63)]\n\n* Added support for all the C99 math functions.\n* Extended generic-interconversions to handle narrowing cases as well, changed convert_to member function and hence explicit\nconversion operators to use the same conversion code as the explicit constructors.\n* Fix IO stream parsing error, see [@https://svn.boost.org/trac/boost/ticket/12488 #12488].\n* Make default constructed floating point types all zero for consistency, see [@https://svn.boost.org/trac/boost/ticket/12500 #12500].\n* Fix conversion of cpp_bin_float to float/double/long double when the exponent value would overflow an int, see [@https://svn.boost.org/trac/boost/ticket/12512 #12512].\n* Fix cpp_bin_float subtractions that yield signed-zeros, see [@https://svn.boost.org/trac/boost/ticket/12524 #12524].\n* Fix ceil/trunc/round applied to cpp_bin_float and yielding a signed zero, see [@https://svn.boost.org/trac/boost/ticket/12525 #12525].\n\n[h4 Multiprecision-2.2.8 (Boost-1.62)]\n\n* Added support for hashing via `Boost.Hash` or `std::hash`.\n* Fixed some arithmetic operations in cpp_bin_float and cpp_dec_float that should generate a NaN, see [@https://svn.boost.org/trac/boost/ticket/12157 #12157].\n* Prevent inadvertant instantiation of variable-precision `mpfr_float_backend` with fixed allocation.\n* Fixed division over/underflow in cpp_bin_float, see [@https://svn.boost.org/trac/boost/ticket/12167 #12167].\n* Added support for signed-zeros throughout the library, including support for `signbit` and `copysign`, mpfr, float128, and cpp_bin_float types\nshould now respect signed-zeros correctly.\n* Fixed bug in conversion of cpp_bin_float infinities to double etc, see [@https://svn.boost.org/trac/boost/ticket/12196 #12196].\n* Fix add and subtract of cpp_bin_float when the exponents would overflow., see [@https://svn.boost.org/trac/boost/ticket/12198 #12198].\n* Improve variable-precision support in mpfr and mpf backends, allow these types to be used with Boost.Math.\n* Fixed bug in subtraction of signed infinities in cpp_bin_float, see [@https://svn.boost.org/trac/boost/ticket/12209 #12209].\n* Fix result of sqrt(infinity) in cpp_bin_float (result should be infinity), see [@https://svn.boost.org/trac/boost/ticket/12227 #12227].\n* Added workaround in gmp.hpp for recent MPIR releases which are not quite source-compatible with GMP on Windows x64.\n* Allow `cpp_int` code to be used with /RTCc with MSVC.\n* Fix conversion of `cpp_int` to signed integer when the result is INT_MIN, see [@https://svn.boost.org/trac/boost/ticket/12343 #12343].\n* Update uBlas support to match latest uBlas code.\n* Fix some errors present when building on big-endian machines (not all `cpp_int` constructors are available on non-little-endian machines).\n* Fix fencepost error in rational to float conversion routines, see [@https://svn.boost.org/trac/boost/ticket/12327 #12327].\n* Fix some Oracle C++ compiler compatibility issues.\n* Add modf support to complete C90 compatibility.\n* Fix self assignment bug in expression template code for expressions such as `a = a * a * a`, see [@https://svn.boost.org/trac/boost/ticket/12408 #12408].\n* Fixed some compiler errors that occur when converting from `cpp_int` to `cpp_bin_float`.\n\n[h4 Multiprecision-2.2.7 (Boost-1.61)]\n\n* Fixed bug in stream input for integer types, see [@https://svn.boost.org/trac/boost/ticket/11857 #11857].\n* Fixed some ambiguous conversions involving expression templates see [@https://svn.boost.org/trac/boost/ticket/11922 #11922].\n* Add expression template aware min/max overloads see [@https://svn.boost.org/trac/boost/ticket/11149 #11149].\n* Fix bug in right shifting negative small integers in cpp_int see [@https://svn.boost.org/trac/boost/ticket/11999 #11999].\n* Use memmove for bitshifts in cpp_int when possible see [@https://svn.boost.org/trac/boost/ticket/9233 #9233].\n* Use memcpy for data import into cpp_int where possible, see [@https://svn.boost.org/trac/boost/ticket/9235 #9235].\n* Changed `cpp_bin_float.convert_to<double>()` to a function template rather than proceding via `long double` to avoid\ndouble-rounding bug, see [@https://svn.boost.org/trac/boost/ticket/12039 #12039].\n* Fixed conversions from NaNs and Infinities, see [@https://svn.boost.org/trac/boost/ticket/12112 #12112].\n* Enabled better support for Clang on Windows.\n* Fixed handling of NaNs and Infinities in basic arithmetic for cpp_dec_float and cpp_bin_float, see [@https://svn.boost.org/trac/boost/ticket/12090 #12090].\n* Fixed fencepost error in cpp_bin_float subtraction.\n* Fixed double-rounding in conversion to float routines for cpp_bin_float, see [@https://svn.boost.org/trac/boost/ticket/12039 #12039].\n* Make float128 denorm aware, see [@https://svn.boost.org/trac/boost/ticket/12075 #12075].\n* Allow the library and tests to be used without exception handling support, see [@https://svn.boost.org/trac/boost/ticket/12070 #12070].\n* Fixed buggy comparison operator overloads for boost::rational.\n* Added some workarounds for Oracle C++.\n* Fixed some missing typecasts for cases where cpp_int's limb_type is wider than unsigned.\n\n\n[h4 Multiprecision-2.2.6 (Boost-1.60)]\n\n* Fixed result of Miller Rabin primality test for value 2, see [@https://svn.boost.org/trac/boost/ticket/11495 #11495].\n* Improved initialization of cpp_int from very large strings of hex or octal digits, see [@https://svn.boost.org/trac/boost/ticket/11590 #11590].\n* Fixed fmod behaviour for negative divisors, see [@https://svn.boost.org/trac/boost/ticket/11641 #11641].\n* Fixed infinite division loop in cpp_int special case, see [@https://svn.boost.org/trac/boost/ticket/11648 #11648].\n* Patched missing return statement in [@https://svn.boost.org/trac/boost/ticket/11762 #11762].\n* Fixed mixed mode arithmetic compiler error in [@https://svn.boost.org/trac/boost/ticket/11764 #11764].\n* Fixed over-aggressive use of noexcept in [@https://svn.boost.org/trac/boost/ticket/11826 #11826].\n\n\n[h4 Multiprecision-2.2.5 (Boost-1.59)]\n\n* Depricated boost/multiprecision/random.hpp as it's no longer needed, updated random examples to match.\n* Fixed a bug in `cpp_int` right shift operator when shifting negative values - semantics now gives the\nsame values as shifting 2's compliment integers, though not the same bit pattern.\n* Fixed support for GCC-4.6.4 in C++0x mode by disabling conditional noexcept suppoprt for that compiler\nsee [@https://svn.boost.org/trac/boost/ticket/11402 #11402].\n* Suppressed numerous compiler warnings.\n\n[h4 Multiprecision-2.2.4 (Boost-1.58)]\n\n* Changed `frexp` to always be non-expression template generating, see: [@https://svn.boost.org/trac/boost/ticket/10993 10993].\n* Improved support of cpp_dec_float on Cygwin and other platforms with missing long double support, see [@https://svn.boost.org/trac/boost/ticket/10924 10924].\n* Improved noexcept support and added some more tests, see [@https://svn.boost.org/trac/boost/ticket/10990 10990].\n* Various workarounds applied for Intel-15.0 and Solaris-12.4 compilers.\n\n[h4 Multiprecision-2.2.3 (Boost-1.57)]\n\n* Changed rational to float conversions to exactly round to nearest, see [@https://svn.boost.org/trac/boost/ticket/10085 10085].\n* Added improved generic float to rational conversions.\n* Fixed rare bug in exponent function for __cpp_bin_float.\n* Fixed various minor documentation issues.\n\n[h4 Multiprecision-2.2.2 (Boost-1.56)]\n\n* Change floating-point to rational conversions to be implicit, see [@https://svn.boost.org/trac/boost/ticket/10082 10082].\n* Fix definition of checked_cpp_rational typedef.\n\n[h4 Multiprecision-2.2.1]\n\n* Fix bug in assignment from string in cpp_int, see [@https://svn.boost.org/trac/boost/ticket/9936 9936].\n\n[h4 Multiprecision-2.2.0]\n\n* Moved to Boost.Multiprecision specific version number - we have one breaking change in Boost-1.54\nwhich makes this major version 2, plus two releases with new features since then.\n* Added new __cpp_bin_float backend for binary floating-point.\n* Added MSVC-specific #include for compiler intrinsics, see [@https://svn.boost.org/trac/boost/ticket/9336 9336].\n* Fixed various typos in docs, see [@https://svn.boost.org/trac/boost/ticket/9432 9432].\n* Fixed __gmp_rational to allow move-copy from an already copied-from object, see [@https://svn.boost.org/trac/boost/ticket/9497 9497].\n* Added list of values for numeric_limits.\n\n[h4 Boost-1.55]\n\n* Added support for Boost.Serialization.\n* Suppressed some GCC warnings.  See [@https://svn.boost.org/trac/boost/ticket/8872 8872].\n* Fixed bug in pow for large integer arguments.  See [@https://svn.boost.org/trac/boost/ticket/8809 8809].\n* Fixed bug in pow for calculation of 0[super N].  See [@https://svn.boost.org/trac/boost/ticket/8798 8798].\n* Fixed bug in fixed precision cpp_int IO code that causes conversion to string to fail when the\nbit count is very small (less than CHAR_BIT).  See [@https://svn.boost.org/trac/boost/ticket/8745 8745].\n* Fixed bug in cpp_int that causes left shift to fail when a fixed precision type would overflow.\nSee [@https://svn.boost.org/trac/boost/ticket/8741 8741].\n* Fixed some cosmetic warnings from cpp_int.  See [@https://svn.boost.org/trac/boost/ticket/8748 8748].\n* Fixed calls to functions which are required to be macros in C99.  See [@https://svn.boost.org/trac/boost/ticket/8732 8732].\n* Fixed bug that causes construction from INT_MIN, LONG_MIN etc to fail in cpp_int.  See [@https://svn.boost.org/trac/boost/ticket/8711 8711].\n\n[h4 1.54]\n\n* [*Breaking change] renamed `rational_adapter` to `rational_adaptor`.\n* Add support for [mpfi].\n* Add logged_adaptor.\n* Add support for 128-bit floats via GCC's `__float128` or Intel's `_Quad` data types.\n* Add support for user-defined literals in cpp_int, improve `constexpr` support.\n* Fixed bug in integer division of `cpp_int` that results in incorrect sign of `cpp_int` when both arguments are small enough\nto fit in a `double_limb_type`.  See [@https://svn.boost.org/trac/boost/ticket/8126 8126].\n* Fixed bug in subtraction of a single limb in `cpp_int` that results in incorrect value when the result should have a 0\nin the last limb: [@https://svn.boost.org/trac/boost/ticket/8133 8133].\n* Fixed bug in `cpp_int` where division of 0 by something doesn't get zero in the result: [@https://svn.boost.org/trac/boost/ticket/8160 8160].\n* Fixed bug in some transcendental functions that caused incorrect return values when variables are reused, for example with\n`a = pow(a, b)`.  See [@https://svn.boost.org/trac/boost/ticket/8326 8326].\n* Fixed some assignment operations in the mpfr and gmp backends to be safe if the target has been moved from: [@https://svn.boost.org/trac/boost/ticket/8326 8667].\n* Fixed bug in `cpp_int` that gives incorrect answer for 0%N for large N: [@https://svn.boost.org/trac/boost/ticket/8670 8670].\n* Fixed set_precision in mpfr backend so it doesn't trample over an existing value: [@https://svn.boost.org/trac/boost/ticket/8692 8692].\n\n[h4 1.53]\n\n* First Release.\n* Fix bug in [@https://svn.boost.org/trac/boost/ticket/7878 cpp_int division].\n* Fix issue [@https://svn.boost.org/trac/boost/ticket/7806 #7806].\n\n[h4 Post review changes]\n\n* Non-expression template operators further optimised with rvalue reference support.\n* Many functions made `constexp`.\n* Differentiate between explicit and implicit conversions in the number constructor.\n* Removed \"mp_\" prefix from types.\n* Allowed mixed precision arithmetic.\n* Changed ExpressionTemplates parameter to class `number` to use enumerated values rather than true/false.\n* Changed ExpressionTemplate parameter default value to use a traits class so that the default value depends on the backend used.\n* Added support for fused-multiply-add/subtract with GMP support.\n* Tweaked expression template unpacking to use fewer temporaries when the LHS also appears in the RHS.\n* Refactored `cpp_int_backend` based on review comments with new template parameter structure.\n* Added additional template parameter to `mpfr_float_backend` to allow stack-based allocation.\n* Added section on mixed precision arithmetic, and added support for operations yielding a higher precision result\nthan either of the arguments.\n* Added overloads of integer-specific functions for __fundamental integer types.\n\n[h4 Pre-review history]\n\n*2011-2012, John Maddock adds an expression template enabled front-end to Christopher's code,\nand adds support for other backends.\n* 2011, Christopher Kormanyos publishes the decimal floating-point code under the Boost\nSoftware Licence.  The code is published as: [@http://doi.acm.org/10.1145/1916461.1916469\n\"Algorithm 910: A Portable C++ Multiple-Precision\nSystem for Special-Function Calculations\"], in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM,\n2011.\n* 2002-2011, Christopher Kormanyos develops the all C++ decimal arithmetic floating-point code.\n\n[endsect] [/section:hist History]\n\n\n[section:todo TODO]\n\nMore a list of what ['could] be done, rather than what ['should] be done (which may be a much smaller list!).\n\n* Add back-end support for libdecNumber.\n* Add an adaptor back-end for complex number types.\n* Add better multiplication routines (Karatsuba, FFT etc) to cpp_int_backend.\n* Add assembly level routines to cpp_int_backend.\n* Can ring types (exact floating-point types) be supported?  The answer should be yes, but someone needs to write it,\nthe hard part is IO and binary-decimal conversion.\n* Should there be a choice of rounding mode (probably MPFR specific)?\n* We can reuse temporaries in multiple subtrees (temporary caching).\n* cpp_dec_float should round to nearest.\n* A 2's complement fixed precision int that uses exactly N bits and no more.\n\nThings requested in review:\n\n* The performances of mp_number<a_trivial_adaptor<float>, false>respect to\nfloat and mp_number<a_trivial_adaptor<int>, false> and int should be\ngiven to show the cost of using the generic interface (Mostly done, just need to update docs to the latest results).\n* Should we provide min/max overloads for expression templates?  (Not done - we can't overload functions declared in the std namespace :-( ).\n* The rounding applied when converting must be documented (Done).\n* Document why we don't abstract out addition/multiplication algorithms etc. (done - FAQ)\n* Document why we don't use proto (compile times)  (Done).\n* We can reuse temporaries in multiple subtrees (temporary caching)  Moved to TODO list.\n* Emphasise in the docs that ET's may reorder operations (done 2012/10/31).\n* Document what happens to small fixed precision cpp_int's (done 2012/10/31).\n* The use of bool in template parameters could be improved by the use of\nan enum class which will be more explicit. E.g `enum class expression_template {disabled, enabled};\nenum class sign {unsigned, signed};`  (Partly done 2012/09/15, done 2012/10/31).\n* Each back-end should document the requirements it satisfies (not currently scheduled for inclusion: it's\ndeliberately an implementation detail, and \"optional\" requirements are optimisations which can't be detected\nby the user).  Not done: this is an implementation detail, the exact list of requirements satisfied is purely\nan optimization, not something the user can detect.\n* A backend for an overflow aware integers (done 2012/10/31).\n* IIUC convert_to is used to emulate in c++98 compilers C++11 explicit\nconversions. Could the explicit conversion operator be added on\ncompilers supporting it?  (Done 2012/09/15).\n* The front-end should make the differences between implicit and explicit\nconstruction (Done 2012/09/15).\n* The tutorial should add more examples concerning implicit or explicit\nconversions. (Done 2012/09/15).\n* The documentation must explain how move semantics helps in this domain\nand what the backend needs to do to profit from this optimization. (Done 2012/09/15).\n* The documentation should contain Throws specification on the mp_number\nand backend requirements operations. (Done 2012/09/15).\n* The library interface should use the noexcept (noexcept, ...)\nfacilities (Done 2012/09/15).\n* It is unfortunate that the generic mp_number front end can not make use\nconstexpr as not all the backends can ensure this (done - we can go quite a way).\n* literals: The library doesn't provide some kind of literals. I think that the\nmp_number class should provide a way to create literals if the backend\nis able to.  (Done 2012/09/15).\n* The ExpresionTemplate parameter could be defaulted to a traits class for more sensible defaults (done 2012/09/20).\n* In a = exp1 op exp2 where a occurs inside one of exp1 or exp2 then we can optimise and eliminate one more temporary (done 2012/09/20).\n\n\n[h4 Pre-Review Comments]\n\n* Make fixed precision orthogonal to Allocator type in cpp_int.  Possible solution - add an additional MaxBits\ntemplate argument that defaults to 0 (meaning keep going till no more space/memory).  Done.\n* Can ring types (exact floating-point types) be supported?  The answer should be yes, but someone needs to write it (Moved to TODO list).\n* Should there be a choice of rounding mode (probably MPFR specific)?  Moved to TODO list.\n* Make the exponent type for cpp_dec_float a template parameter, maybe include support for big-integer exponents.\nOpen question - what should be the default - int32_t or int64_t?  (done 2012/09/06)\n* Document the size requirements of fixed precision ints (done 2012/09/15).\n* Document std lib function accuracy (done 2012/09/15).\n* Be a bit clearer on the effects of sign-magnitude representation of cpp_int - min == -max etc - done.\n* Document cpp_dec_float precision, rounding, and exponent size (done 2012/09/06).\n* Can we be clearer in the docs that mixed arithmetic doesn't work (no longer applicable as of 2012/09/06)?\n* Document round functions behaviour better (they behave as in C++11) (added note 2012/09/06).\n* Document limits on size of cpp_dec_float (done 2012/09/06).\n* Add support for fused multiply add (and subtract).  GMP mpz_t could use this (done 2012/09/20).\n\n[endsect] [/section:todo TODO]\n\n[section:faq FAQ]\n\n[variablelist\n[[Why do I get compiler errors when passing a `number` to a template function?]\n   [Most likely you are actually passing an expression template type to the function and\n   template-argument-deduction deduces the \"wrong\" type.  Try casting the arguments\n   involving expressions to the actual number type, or as a last resort turning off\n   expression template support in the number type you are using.]]\n[[When is expression template support a performance gain?]\n   [As a general rule, expression template support adds a small runtime overhead\n   creating and unpacking the expression templates, but greatly reduces the number of\n   temporaries created.  So it's most effective in improving performance when the cost\n   of creating a temporary is high: for example when creating a temporary involves a memory\n   allocation.  It is least effective (and may even be a dis-optimisation) when temporaries\n   are cheap: for example if the number type is basically a thin wrapper around a native\n   arithmetic type.  In addition, since the library makes extensive use of thin inline wrapper\n   functions, turning on compiler optimization is essential to achieving high performance.]]\n[[Do expression templates reorder operations?]\n   [Yes they do, sometimes quite radically so, if this is a concern then they should be turned\n   off for the number type you are using.]]\n[[I can't construct my number type from ['some other type], but the docs indicate that the conversion should be allowed, what's up?]\n   [Some conversions are ['explicit], that includes construction from a string, or constructing from any type\n   that may result in loss of precision (for example constructing an integer type from a float).]]\n[[Why do I get an exception thrown (or the program crash due to an uncaught exception) when using the bitwise operators on a checked `cpp_int`?]\n   [Bitwise operations on negative values (or indeed any signed integer type) are unspecified by the standard.  As a result\n   any attempt to carry out a bitwise operation on a negative checked-integer will result in a `std::range_error` being thrown.]]\n[[Why do I get compiler errors when trying to use the complement operator?]\n   [Use of the complement operator on signed types is problematic as the result is unspecified by the standard, and is further\n   complicated by the fact that most extended precision integer types use a sign-magnitude representation rather than the 2's\n   complement one favored by most native integer types.  As a result the complement operator is deliberately disabled for\n   checked `cpp_int`'s.  Unchecked `cpp_int`'s give the same valued result as a 2's complement type would, but not the same bit-pattern.]]\n[[Why can't I negate an unsigned type?]\n   [The unary negation operator is deliberately disabled for unsigned integer types as its use would almost always be a programming error.]]\n[[Why doesn't the library use proto?]\n   [A very early version of the library did use proto, but compile times became too slow\n   for the library to be usable.  Since the library only required a tiny fraction of what\n   proto has to offer anyway, a lightweight expression template mechanism was used instead.\n   Compile times are still too slow...]]\n[[Why not abstract out addition/multiplication algorithms?]\n   [This was deemed not to be practical: these algorithms are intimately\n   tied to the actual data representation used.]]\n [[How do I choose between Boost.Multiprecision `cpp_bin_50` and `cpp_dec_50`?]\n   [Unless you have a specific reason to choose `cpp_dec_`, then the default choice should be `cpp_bin_`, \n   for example using the convenience `typedefs` like `boost::multiprecision::cpp_bin_50` or `boost::multiprecision::cpp_bin_100`.\n\n  In general, both work well and give the same results and at roughly the same speed with `cpp_dec_50` sometimes faster.\n\n  `cpp_dec_` was developed first paving the way for `cpp_bin_`. \n  `cpp_dec_` has several guard digits and is not rounded at all, using 'brute force' to get the promised number of decimal digits correct,\n  but making it difficult to reason about precision and computational uncertainty, for example see [*https://svn.boost.org/trac10/ticket/12133].\n  It also has a fast but imprecise division operator giving surprising results sometimes, see [*https://svn.boost.org/trac10/ticket/11178].\n\n  `cpp_bin_` is correctly/exactly rounded making it possible to reason about both the precision and rounding of the results.]]\n] [/variablelist]\n\n[endsect] [/section:faq FAQ]\n\n[section:ack Acknowledgements]\n\nThis library would not have happened without:\n\n* Christopher Kormanyos' C++ decimal number code.\n* Paul Bristow for patiently testing, and commenting on the library.\n* All the folks at GMP, MPFR and libtommath, for providing the \"guts\" that makes this library work.\n* [@http://www-cs-faculty.stanford.edu/~uno/taocp.html \"The Art Of Computer Programming\"],\nDonald E. Knuth, Volume 2: Seminumerical Algorithms, Third Edition\n(Reading, Massachusetts: Addison-Wesley, 1997), xiv+762pp. ISBN 0-201-89684-2\n\n[endsect] [/section:ack Acknowledgements]\n\n\n[endsect] [/section: Roadmap]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/indexes/s01.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Function Index</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../indexes.html\" title=\"Indexes\">\n<link rel=\"prev\" href=\"../indexes.html\" title=\"Indexes\">\n<link rel=\"next\" href=\"s02.html\" title=\"Class Index\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../indexes.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../indexes.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"s02.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"id1236991\"></a>Function Index</h3></div></div></div>\n<p><a class=\"link\" href=\"s01.html#idx_id_0\">A</a> <a class=\"link\" href=\"s01.html#idx_id_1\">B</a> <a class=\"link\" href=\"s01.html#idx_id_2\">C</a> <a class=\"link\" href=\"s01.html#idx_id_3\">D</a> <a class=\"link\" href=\"s01.html#idx_id_4\">E</a> <a class=\"link\" href=\"s01.html#idx_id_5\">F</a> <a class=\"link\" href=\"s01.html#idx_id_6\">G</a> <a class=\"link\" href=\"s01.html#idx_id_7\">H</a> <a class=\"link\" href=\"s01.html#idx_id_8\">I</a> <a class=\"link\" href=\"s01.html#idx_id_9\">L</a> <a class=\"link\" href=\"s01.html#idx_id_10\">M</a> <a class=\"link\" href=\"s01.html#idx_id_11\">N</a> <a class=\"link\" href=\"s01.html#idx_id_12\">O</a> <a class=\"link\" href=\"s01.html#idx_id_13\">P</a> <a class=\"link\" href=\"s01.html#idx_id_14\">R</a> <a class=\"link\" href=\"s01.html#idx_id_15\">S</a> <a class=\"link\" href=\"s01.html#idx_id_16\">T</a> <a class=\"link\" href=\"s01.html#idx_id_17\">V</a> <a class=\"link\" href=\"s01.html#idx_id_18\">X</a> <a class=\"link\" href=\"s01.html#idx_id_19\">Z</a></p>\n<div class=\"variablelist\"><dl class=\"variablelist\">\n<dt>\n<a name=\"idx_id_0\"></a><span class=\"term\">A</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">a</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../intro.html\" title=\"Introduction\"><span class=\"index-entry-level-1\">Introduction</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">Mixed Precision Arithmetic</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/variable.html\" title=\"Variable Precision Arithmetic\"><span class=\"index-entry-level-1\">Variable Precision Arithmetic</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/variable_precision.html\" title=\"Variable-Precision Newton Evaluation\"><span class=\"index-entry-level-1\">Variable-Precision Newton Evaluation</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">abs</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">acosh</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">add</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">Mixed Precision Arithmetic</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/todo.html\" title=\"TODO\"><span class=\"index-entry-level-1\">TODO</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">arg</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">asinh</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">assign</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">assign_components</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">atanh</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_1\"></a><span class=\"term\">B</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">bits</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/input_output.html\" title=\"Input Output\"><span class=\"index-entry-level-1\">Input Output</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rounding.html\" title=\"Rounding Rules for Conversions\"><span class=\"index-entry-level-1\">Rounding Rules for Conversions</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/constants.html\" title=\"std::numeric_limits&lt;&gt; constants\"><span class=\"index-entry-level-1\">std::numeric_limits&lt;&gt; constants</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">bit_flip</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">bit_set</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/import_export.html\" title=\"Importing and Exporting Data to and from cpp_int and cpp_bin_float\"><span class=\"index-entry-level-1\">Importing and Exporting Data to and from cpp_int and cpp_bin_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">bit_test</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">bit_unset</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_2\"></a><span class=\"term\">C</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">cbrt</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">ceil</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">changesign</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">compare</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">conj</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">convert_to</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">copysign</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">cos</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/gi.html\" title=\"Calculating an Integral\"><span class=\"index-entry-level-1\">Calculating an Integral</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">cpp_bin_float</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/hist.html\" title=\"History\"><span class=\"index-entry-level-1\">History</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">cpp_dec_float</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/todo.html\" title=\"TODO\"><span class=\"index-entry-level-1\">TODO</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_3\"></a><span class=\"term\">D</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">data</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/float128.html\" title=\"float128\"><span class=\"index-entry-level-1\">float128</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/gmp_float.html\" title=\"gmp_float\"><span class=\"index-entry-level-1\">gmp_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/gmp_int.html\" title=\"gmp_int\"><span class=\"index-entry-level-1\">gmp_int</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/gmp_rational.html\" title=\"gmp_rational\"><span class=\"index-entry-level-1\">gmp_rational</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/lits.html\" title=\"Literal Types and constexpr Support\"><span class=\"index-entry-level-1\">Literal Types and constexpr Support</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/complex/mpc_complex.html\" title=\"mpc_complex\"><span class=\"index-entry-level-1\">mpc_complex</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/mpfr_float.html\" title=\"mpfr_float\"><span class=\"index-entry-level-1\">mpfr_float</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">default_precision</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">denominator</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/cpp_rational.html\" title=\"cpp_rational\"><span class=\"index-entry-level-1\">cpp_rational</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/gmp_rational.html\" title=\"gmp_rational\"><span class=\"index-entry-level-1\">gmp_rational</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/tommath_rational.html\" title=\"tommath_rational\"><span class=\"index-entry-level-1\">tommath_rational</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">digits10</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/constants.html\" title=\"std::numeric_limits&lt;&gt; constants\"><span class=\"index-entry-level-1\">std::numeric_limits&lt;&gt; constants</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">divide_qr</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_4\"></a><span class=\"term\">E</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">e</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">Mixed Precision Arithmetic</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">empty</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">erf</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">erfc</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_acos</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_add</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_asin</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_atan</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_atan2</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_bitwise_and</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_bitwise_or</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_bitwise_xor</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_bit_flip</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_bit_set</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_bit_test</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_bit_unset</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_ceil</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_complement</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_conj</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_convert_to</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_cos</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_cosh</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_decrement</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_divide</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_eq</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_exp</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_exp2</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_fabs</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_floor</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_fmod</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_frexp</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_gcd</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_get_sign</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_gt</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_imag</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_increment</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_integer_sqrt</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_is_zero</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_lcm</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_ldexp</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_left_shift</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_log</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_log10</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_lt</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_modf</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_modulus</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_msb</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_multiply</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_multiply_add</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_multiply_subtract</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_nearbyint</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_pow</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_powm</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_proj</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_qr</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_real</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_right_shift</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_round</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_scalbn</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_set_imag</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_set_real</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_sin</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_sinh</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_sqrt</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_subtract</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_tan</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_tanh</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_trunc</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">exp</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/variable_precision.html\" title=\"Variable-Precision Newton Evaluation\"><span class=\"index-entry-level-1\">Variable-Precision Newton Evaluation</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">expm1</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">export_bits</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/import_export.html\" title=\"Importing and Exporting Data to and from cpp_int and cpp_bin_float\"><span class=\"index-entry-level-1\">Importing and Exporting Data to and from cpp_int and cpp_bin_float</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">expression</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../intro.html\" title=\"Introduction\"><span class=\"index-entry-level-1\">Introduction</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_5\"></a><span class=\"term\">F</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">f</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/import_export.html\" title=\"Importing and Exporting Data to and from cpp_int and cpp_bin_float\"><span class=\"index-entry-level-1\">Importing and Exporting Data to and from cpp_int and cpp_bin_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/variable_precision.html\" title=\"Variable-Precision Newton Evaluation\"><span class=\"index-entry-level-1\">Variable-Precision Newton Evaluation</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">floor</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">fma</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">fpclassify</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">frexp</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_6\"></a><span class=\"term\">G</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">gcd</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li></ul></div></dd>\n<dt>\n<a name=\"idx_id_7\"></a><span class=\"term\">H</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">half</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/variable_precision.html\" title=\"Variable-Precision Newton Evaluation\"><span class=\"index-entry-level-1\">Variable-Precision Newton Evaluation</span></a></p></li></ul></div>\n</li></ul></div></dd>\n<dt>\n<a name=\"idx_id_8\"></a><span class=\"term\">I</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">i</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/conversions.html\" title=\"Constructing and Interconverting Between Number Types\"><span class=\"index-entry-level-1\">Constructing and Interconverting Between Number Types</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">Mixed Precision Arithmetic</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/variable.html\" title=\"Variable Precision Arithmetic\"><span class=\"index-entry-level-1\">Variable Precision Arithmetic</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">if</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/primetest.html\" title=\"Primality Testing\"><span class=\"index-entry-level-1\">Primality Testing</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">ilogb</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/hist.html\" title=\"History\"><span class=\"index-entry-level-1\">History</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">imag</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">in</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">infinity</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/functions.html\" title=\"std::numeric_limits&lt;&gt; functions\"><span class=\"index-entry-level-1\">std :: numeric_limits &lt;&gt; functions</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/constants.html\" title=\"std::numeric_limits&lt;&gt; constants\"><span class=\"index-entry-level-1\">std::numeric_limits&lt;&gt; constants</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">integer_modulus</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">iround</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">isfinite</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">isgreater</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">isgreaterequal</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">isinf</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">isless</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">islessequal</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">islessgreater</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">isnan</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">isnormal</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">isunordered</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">itrunc</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_9\"></a><span class=\"term\">L</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">ldexp</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">lgamma</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">llrint</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">llround</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">lltrunc</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">log1p</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">log_postfix_event</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/misc/logged_adaptor.html\" title=\"logged_adaptor\"><span class=\"index-entry-level-1\">logged_adaptor</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">log_prefix_event</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/misc/logged_adaptor.html\" title=\"logged_adaptor\"><span class=\"index-entry-level-1\">logged_adaptor</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">lrint</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">lround</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">lsb</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">ltrunc</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_10\"></a><span class=\"term\">M</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">miller_rabin_test</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/primetest.html\" title=\"Primality Testing\"><span class=\"index-entry-level-1\">Primality Testing</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">modf</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">msb</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">multiply</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">Mixed Precision Arithmetic</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_11\"></a><span class=\"term\">N</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">nextafter</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">nexttoward</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">norm</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">numerator</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/cpp_rational.html\" title=\"cpp_rational\"><span class=\"index-entry-level-1\">cpp_rational</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/gmp_rational.html\" title=\"gmp_rational\"><span class=\"index-entry-level-1\">gmp_rational</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/tommath_rational.html\" title=\"tommath_rational\"><span class=\"index-entry-level-1\">tommath_rational</span></a></p></li>\n</ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_12\"></a><span class=\"term\">O</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">of</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/float128.html\" title=\"float128\"><span class=\"index-entry-level-1\">float128</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/variable.html\" title=\"Variable Precision Arithmetic\"><span class=\"index-entry-level-1\">Variable Precision Arithmetic</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">overlap</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_13\"></a><span class=\"term\">P</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">polar</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">pow</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">powm</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">precision</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/faq.html\" title=\"FAQ\"><span class=\"index-entry-level-1\">FAQ</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../intro.html\" title=\"Introduction\"><span class=\"index-entry-level-1\">Introduction</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">proj</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">proper_subset</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_14\"></a><span class=\"term\">R</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">r</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/egs/bitops.html\" title=\"Bit Operations\"><span class=\"index-entry-level-1\">Bit Operations</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">real</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">remainder</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">remquo</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">result</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/import_export.html\" title=\"Importing and Exporting Data to and from cpp_int and cpp_bin_float\"><span class=\"index-entry-level-1\">Importing and Exporting Data to and from cpp_int and cpp_bin_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../intro.html\" title=\"Introduction\"><span class=\"index-entry-level-1\">Introduction</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">round</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_15\"></a><span class=\"term\">S</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">scalar</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">scoped</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/variable.html\" title=\"Variable Precision Arithmetic\"><span class=\"index-entry-level-1\">Variable Precision Arithmetic</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">scoped_opts</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/variable.html\" title=\"Variable Precision Arithmetic\"><span class=\"index-entry-level-1\">Variable Precision Arithmetic</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">sign</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">signbit</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">singleton</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">sp</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/variable_precision.html\" title=\"Variable-Precision Newton Evaluation\"><span class=\"index-entry-level-1\">Variable-Precision Newton Evaluation</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">sqrt</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/hist.html\" title=\"History\"><span class=\"index-entry-level-1\">History</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/functions.html\" title=\"std::numeric_limits&lt;&gt; functions\"><span class=\"index-entry-level-1\">std :: numeric_limits &lt;&gt; functions</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">str</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">subset</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">subtract</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">Mixed Precision Arithmetic</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">swap</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_16\"></a><span class=\"term\">T</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">temporary</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/todo.html\" title=\"TODO\"><span class=\"index-entry-level-1\">TODO</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">tgamma</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">the</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/misc/logged_adaptor.html\" title=\"logged_adaptor\"><span class=\"index-entry-level-1\">logged_adaptor</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">to_string</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">trunc</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">type</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/jel.html\" title=\"Defining a Special Function.\"><span class=\"index-entry-level-1\">Defining a Special Function.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/float128.html\" title=\"float128\"><span class=\"index-entry-level-1\">float128</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">Mixed Precision Arithmetic</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/constants.html\" title=\"std::numeric_limits&lt;&gt; constants\"><span class=\"index-entry-level-1\">std::numeric_limits&lt;&gt; constants</span></a></p></li>\n</ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_17\"></a><span class=\"term\">V</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">v</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/jel.html\" title=\"Defining a Special Function.\"><span class=\"index-entry-level-1\">Defining a Special Function.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/variable.html\" title=\"Variable Precision Arithmetic\"><span class=\"index-entry-level-1\">Variable Precision Arithmetic</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">value</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/cpp_bin_float_ref.html\" title=\"cpp_bin_float\"><span class=\"index-entry-level-1\">cpp_bin_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/functions.html\" title=\"std::numeric_limits&lt;&gt; functions\"><span class=\"index-entry-level-1\">std :: numeric_limits &lt;&gt; functions</span></a></p></li>\n</ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_18\"></a><span class=\"term\">X</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">x</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/variable_precision.html\" title=\"Variable-Precision Newton Evaluation\"><span class=\"index-entry-level-1\">Variable-Precision Newton Evaluation</span></a></p></li></ul></div>\n</li></ul></div></dd>\n<dt>\n<a name=\"idx_id_19\"></a><span class=\"term\">Z</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">zero</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/gmp_float.html\" title=\"gmp_float\"><span class=\"index-entry-level-1\">gmp_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/gmp_int.html\" title=\"gmp_int\"><span class=\"index-entry-level-1\">gmp_int</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/gmp_rational.html\" title=\"gmp_rational\"><span class=\"index-entry-level-1\">gmp_rational</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/complex/mpc_complex.html\" title=\"mpc_complex\"><span class=\"index-entry-level-1\">mpc_complex</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/mpfr_float.html\" title=\"mpfr_float\"><span class=\"index-entry-level-1\">mpfr_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/constants.html\" title=\"std::numeric_limits&lt;&gt; constants\"><span class=\"index-entry-level-1\">std::numeric_limits&lt;&gt; constants</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/tommath_rational.html\" title=\"tommath_rational\"><span class=\"index-entry-level-1\">tommath_rational</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/tom_int.html\" title=\"tom_int\"><span class=\"index-entry-level-1\">tom_int</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">zero_in</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n</dl></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../indexes.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../indexes.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"s02.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/indexes/s02.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Class Index</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../indexes.html\" title=\"Indexes\">\n<link rel=\"prev\" href=\"s01.html\" title=\"Function Index\">\n<link rel=\"next\" href=\"s03.html\" title=\"Typedef Index\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"s01.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../indexes.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"s03.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"id1243944\"></a>Class Index</h3></div></div></div>\n<p><a class=\"link\" href=\"s02.html#idx_id_22\">C</a> <a class=\"link\" href=\"s02.html#idx_id_23\">D</a> <a class=\"link\" href=\"s02.html#idx_id_24\">E</a> <a class=\"link\" href=\"s02.html#idx_id_25\">F</a> <a class=\"link\" href=\"s02.html#idx_id_26\">G</a> <a class=\"link\" href=\"s02.html#idx_id_28\">I</a> <a class=\"link\" href=\"s02.html#idx_id_29\">L</a> <a class=\"link\" href=\"s02.html#idx_id_30\">M</a> <a class=\"link\" href=\"s02.html#idx_id_31\">N</a> <a class=\"link\" href=\"s02.html#idx_id_36\">T</a></p>\n<div class=\"variablelist\"><dl class=\"variablelist\">\n<dt>\n<a name=\"idx_id_22\"></a><span class=\"term\">C</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/complex/complex_adaptor.html\" title=\"complex_adaptor\"><span class=\"index-entry-level-0\">complex_adaptor</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">component_type</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/cpp_bin_float.html\" title=\"cpp_bin_float\"><span class=\"index-entry-level-0\">cpp_bin_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/cpp_dec_float.html\" title=\"cpp_dec_float\"><span class=\"index-entry-level-0\">cpp_dec_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">cpp_int_backend</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/cpp_int.html\" title=\"cpp_int\"><span class=\"index-entry-level-1\">cpp_int</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_23\"></a><span class=\"term\">D</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/misc/debug_adaptor.html\" title=\"debug_adaptor\"><span class=\"index-entry-level-0\">debug_adaptor</span></a></p></li></ul></div></dd>\n<dt>\n<a name=\"idx_id_24\"></a><span class=\"term\">E</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">expression_template_default</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li></ul></div></dd>\n<dt>\n<a name=\"idx_id_25\"></a><span class=\"term\">F</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">float128_backend</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/float128.html\" title=\"float128\"><span class=\"index-entry-level-1\">float128</span></a></p></li></ul></div>\n</li></ul></div></dd>\n<dt>\n<a name=\"idx_id_26\"></a><span class=\"term\">G</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/gmp_float.html\" title=\"gmp_float\"><span class=\"index-entry-level-0\">gmp_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/gmp_int.html\" title=\"gmp_int\"><span class=\"index-entry-level-0\">gmp_int</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/gmp_rational.html\" title=\"gmp_rational\"><span class=\"index-entry-level-0\">gmp_rational</span></a></p></li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_28\"></a><span class=\"term\">I</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">is_equivalent_number_type</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">Mixed Precision Arithmetic</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">is_explicitly_convertible</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/internals.html\" title=\"Internal Support Code\"><span class=\"index-entry-level-1\">Internal Support Code</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">is_lossy_conversion</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/internals.html\" title=\"Internal Support Code\"><span class=\"index-entry-level-1\">Internal Support Code</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">is_number</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">is_number_expression</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">is_restricted_conversion</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/internals.html\" title=\"Internal Support Code\"><span class=\"index-entry-level-1\">Internal Support Code</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">is_signed_number</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/internals.html\" title=\"Internal Support Code\"><span class=\"index-entry-level-1\">Internal Support Code</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">is_unsigned_number</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/internals.html\" title=\"Internal Support Code\"><span class=\"index-entry-level-1\">Internal Support Code</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_29\"></a><span class=\"term\">L</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/misc/logged_adaptor.html\" title=\"logged_adaptor\"><span class=\"index-entry-level-0\">logged_adaptor</span></a></p></li></ul></div></dd>\n<dt>\n<a name=\"idx_id_30\"></a><span class=\"term\">M</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">mpc_complex_backend</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/complex/mpc_complex.html\" title=\"mpc_complex\"><span class=\"index-entry-level-1\">mpc_complex</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">mpfi_float_backend</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">mpfr_float_backend</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/mpfr_float.html\" title=\"mpfr_float\"><span class=\"index-entry-level-1\">mpfr_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><span class=\"bold\"><strong><a class=\"link\" href=\"../ref/mpfr_ref.html\" title=\"mpfr_float_backend\"><span class=\"index-entry-level-1\">mpfr_float_backend</span></a></strong></span></p></li>\n</ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_31\"></a><span class=\"term\">N</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-0\">number</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">number_category</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_36\"></a><span class=\"term\">T</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">tommath_int</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/tom_int.html\" title=\"tom_int\"><span class=\"index-entry-level-1\">tom_int</span></a></p></li></ul></div>\n</li></ul></div></dd>\n</dl></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"s01.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../indexes.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"s03.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/indexes/s03.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Typedef Index</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../indexes.html\" title=\"Indexes\">\n<link rel=\"prev\" href=\"s02.html\" title=\"Class Index\">\n<link rel=\"next\" href=\"s04.html\" title=\"Index\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"s02.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../indexes.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"s04.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"id1244577\"></a>Typedef Index</h3></div></div></div>\n<p></p>\n<div class=\"variablelist\"><dl class=\"variablelist\"></dl></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"s02.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../indexes.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"s04.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/indexes/s04.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Index</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../indexes.html\" title=\"Indexes\">\n<link rel=\"prev\" href=\"s03.html\" title=\"Typedef Index\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"s03.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../indexes.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"id1244563\"></a>Index</h3></div></div></div>\n<p><a class=\"link\" href=\"s04.html#idx_id_60\">A</a> <a class=\"link\" href=\"s04.html#idx_id_61\">B</a> <a class=\"link\" href=\"s04.html#idx_id_62\">C</a> <a class=\"link\" href=\"s04.html#idx_id_63\">D</a> <a class=\"link\" href=\"s04.html#idx_id_64\">E</a> <a class=\"link\" href=\"s04.html#idx_id_65\">F</a> <a class=\"link\" href=\"s04.html#idx_id_66\">G</a> <a class=\"link\" href=\"s04.html#idx_id_67\">H</a> <a class=\"link\" href=\"s04.html#idx_id_68\">I</a> <a class=\"link\" href=\"s04.html#idx_id_69\">L</a> <a class=\"link\" href=\"s04.html#idx_id_70\">M</a> <a class=\"link\" href=\"s04.html#idx_id_71\">N</a> <a class=\"link\" href=\"s04.html#idx_id_72\">O</a> <a class=\"link\" href=\"s04.html#idx_id_73\">P</a> <a class=\"link\" href=\"s04.html#idx_id_74\">R</a> <a class=\"link\" href=\"s04.html#idx_id_75\">S</a> <a class=\"link\" href=\"s04.html#idx_id_76\">T</a> <a class=\"link\" href=\"s04.html#idx_id_77\">V</a> <a class=\"link\" href=\"s04.html#idx_id_78\">X</a> <a class=\"link\" href=\"s04.html#idx_id_79\">Z</a></p>\n<div class=\"variablelist\"><dl class=\"variablelist\">\n<dt>\n<a name=\"idx_id_60\"></a><span class=\"term\">A</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">a</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../intro.html\" title=\"Introduction\"><span class=\"index-entry-level-1\">Introduction</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">Mixed Precision Arithmetic</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/variable.html\" title=\"Variable Precision Arithmetic\"><span class=\"index-entry-level-1\">Variable Precision Arithmetic</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/variable_precision.html\" title=\"Variable-Precision Newton Evaluation\"><span class=\"index-entry-level-1\">Variable-Precision Newton Evaluation</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">abs</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">acosh</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">add</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">Mixed Precision Arithmetic</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/todo.html\" title=\"TODO\"><span class=\"index-entry-level-1\">TODO</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">arg</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">asinh</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">assign</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">assign_components</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">atanh</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_61\"></a><span class=\"term\">B</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">Backend Requirements</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">acosh</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">asinh</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">atanh</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">cbrt</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">changesign</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">copysign</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">erf</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">erfc</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">expm1</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">lgamma</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">llrint</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">log1p</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">lrint</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">nextafter</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">nexttoward</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">sign</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">signbit</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">tgamma</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">Bit Operations</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/egs/bitops.html\" title=\"Bit Operations\"><span class=\"index-entry-level-1\">BOOST_MP_ASSERT</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/egs/bitops.html\" title=\"Bit Operations\"><span class=\"index-entry-level-1\">r</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">bits</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/input_output.html\" title=\"Input Output\"><span class=\"index-entry-level-1\">Input Output</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rounding.html\" title=\"Rounding Rules for Conversions\"><span class=\"index-entry-level-1\">Rounding Rules for Conversions</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/constants.html\" title=\"std::numeric_limits&lt;&gt; constants\"><span class=\"index-entry-level-1\">std::numeric_limits&lt;&gt; constants</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">bit_flip</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">bit_set</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/import_export.html\" title=\"Importing and Exporting Data to and from cpp_int and cpp_bin_float\"><span class=\"index-entry-level-1\">Importing and Exporting Data to and from cpp_int and cpp_bin_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">bit_test</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">bit_unset</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">BOOST_MP_ASSERT</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/egs/bitops.html\" title=\"Bit Operations\"><span class=\"index-entry-level-1\">Bit Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/import_export.html\" title=\"Importing and Exporting Data to and from cpp_int and cpp_bin_float\"><span class=\"index-entry-level-1\">Importing and Exporting Data to and from cpp_int and cpp_bin_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/functions.html\" title=\"std::numeric_limits&lt;&gt; functions\"><span class=\"index-entry-level-1\">std :: numeric_limits &lt;&gt; functions</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">BOOST_MP_DEFINE_SIZED_CPP_INT_LITERAL</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/lits.html\" title=\"Literal Types and constexpr Support\"><span class=\"index-entry-level-1\">Literal Types and constexpr Support</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">BOOST_MP_MIN_EXPONENT_DIGITS</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/input_output.html\" title=\"Input Output\"><span class=\"index-entry-level-1\">Input Output</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">BOOST_MP_USE_FLOAT128</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/complex/complex128.html\" title=\"complex128\"><span class=\"index-entry-level-1\">complex128</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/float128.html\" title=\"float128\"><span class=\"index-entry-level-1\">float128</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">BOOST_MP_USE_QUAD</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/complex/complex128.html\" title=\"complex128\"><span class=\"index-entry-level-1\">complex128</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/float128.html\" title=\"float128\"><span class=\"index-entry-level-1\">float128</span></a></p></li>\n</ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_62\"></a><span class=\"term\">C</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">Calculating an Integral</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/gi.html\" title=\"Calculating an Integral\"><span class=\"index-entry-level-1\">cos</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">cbrt</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">ceil</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">changesign</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">compare</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">complex128</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/complex/complex128.html\" title=\"complex128\"><span class=\"index-entry-level-1\">BOOST_MP_USE_FLOAT128</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/complex/complex128.html\" title=\"complex128\"><span class=\"index-entry-level-1\">BOOST_MP_USE_QUAD</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/complex/complex_adaptor.html\" title=\"complex_adaptor\"><span class=\"index-entry-level-0\">complex_adaptor</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">component_type</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">Compulsory Requirements on the Backend type.</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_add</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_bitwise_or</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_bitwise_xor</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_ceil</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_complement</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_conj</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_convert_to</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_divide</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_floor</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_frexp</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_imag</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_ldexp</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_left_shift</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_modulus</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_multiply</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_proj</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_real</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_right_shift</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_set_imag</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_set_real</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_sqrt</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">eval_subtract</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">conj</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">Constructing and Interconverting Between Number Types</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/conversions.html\" title=\"Constructing and Interconverting Between Number Types\"><span class=\"index-entry-level-1\">i</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">convert_to</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">copysign</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">cos</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/gi.html\" title=\"Calculating an Integral\"><span class=\"index-entry-level-1\">Calculating an Integral</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">cpp_bin_float</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><span class=\"bold\"><strong><a class=\"link\" href=\"../tut/floats/cpp_bin_float.html\" title=\"cpp_bin_float\"><span class=\"index-entry-level-1\">cpp_bin_float</span></a></strong></span></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/hist.html\" title=\"History\"><span class=\"index-entry-level-1\">History</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/cpp_bin_float_ref.html\" title=\"cpp_bin_float\"><span class=\"index-entry-level-1\">value</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">cpp_dec_float</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><span class=\"bold\"><strong><a class=\"link\" href=\"../tut/floats/cpp_dec_float.html\" title=\"cpp_dec_float\"><span class=\"index-entry-level-1\">cpp_dec_float</span></a></strong></span></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/todo.html\" title=\"TODO\"><span class=\"index-entry-level-1\">TODO</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">cpp_int</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/cpp_int.html\" title=\"cpp_int\"><span class=\"index-entry-level-1\">cpp_int_backend</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">cpp_int_backend</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/cpp_int.html\" title=\"cpp_int\"><span class=\"index-entry-level-1\">cpp_int</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">cpp_rational</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/cpp_rational.html\" title=\"cpp_rational\"><span class=\"index-entry-level-1\">denominator</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/cpp_rational.html\" title=\"cpp_rational\"><span class=\"index-entry-level-1\">numerator</span></a></p></li>\n</ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_63\"></a><span class=\"term\">D</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">data</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/float128.html\" title=\"float128\"><span class=\"index-entry-level-1\">float128</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/gmp_float.html\" title=\"gmp_float\"><span class=\"index-entry-level-1\">gmp_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/gmp_int.html\" title=\"gmp_int\"><span class=\"index-entry-level-1\">gmp_int</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/gmp_rational.html\" title=\"gmp_rational\"><span class=\"index-entry-level-1\">gmp_rational</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/lits.html\" title=\"Literal Types and constexpr Support\"><span class=\"index-entry-level-1\">Literal Types and constexpr Support</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/complex/mpc_complex.html\" title=\"mpc_complex\"><span class=\"index-entry-level-1\">mpc_complex</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/mpfr_float.html\" title=\"mpfr_float\"><span class=\"index-entry-level-1\">mpfr_float</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/misc/debug_adaptor.html\" title=\"debug_adaptor\"><span class=\"index-entry-level-0\">debug_adaptor</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">default_precision</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">Defining a Special Function.</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/jel.html\" title=\"Defining a Special Function.\"><span class=\"index-entry-level-1\">type</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/jel.html\" title=\"Defining a Special Function.\"><span class=\"index-entry-level-1\">v</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">denominator</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/cpp_rational.html\" title=\"cpp_rational\"><span class=\"index-entry-level-1\">cpp_rational</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/gmp_rational.html\" title=\"gmp_rational\"><span class=\"index-entry-level-1\">gmp_rational</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/tommath_rational.html\" title=\"tommath_rational\"><span class=\"index-entry-level-1\">tommath_rational</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">digits10</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/constants.html\" title=\"std::numeric_limits&lt;&gt; constants\"><span class=\"index-entry-level-1\">std::numeric_limits&lt;&gt; constants</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">divide_qr</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_64\"></a><span class=\"term\">E</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">e</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">Mixed Precision Arithmetic</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">empty</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">erf</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">erfc</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_acos</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_add</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_asin</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_atan</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_atan2</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_bitwise_and</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_bitwise_or</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_bitwise_xor</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_bit_flip</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_bit_set</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_bit_test</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_bit_unset</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_ceil</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_complement</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_conj</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_convert_to</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_cos</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_cosh</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_decrement</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_divide</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_eq</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_exp</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_exp2</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_fabs</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_floor</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_fmod</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_frexp</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_gcd</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_get_sign</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_gt</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_imag</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_increment</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_integer_sqrt</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_is_zero</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_lcm</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_ldexp</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_left_shift</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_log</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_log10</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_lt</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_modf</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_modulus</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_msb</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_multiply</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_multiply_add</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_multiply_subtract</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_nearbyint</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_pow</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_powm</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_proj</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_qr</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_real</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_right_shift</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_round</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_scalbn</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_set_imag</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_set_real</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_sin</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_sinh</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_sqrt</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_subtract</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\" title=\"Table 1.8. Compulsory Requirements on the Backend type.\"><span class=\"index-entry-level-1\">Compulsory Requirements on the Backend type.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_tan</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_tanh</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">eval_trunc</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">exp</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/variable_precision.html\" title=\"Variable-Precision Newton Evaluation\"><span class=\"index-entry-level-1\">Variable-Precision Newton Evaluation</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">expm1</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">export_bits</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/import_export.html\" title=\"Importing and Exporting Data to and from cpp_int and cpp_bin_float\"><span class=\"index-entry-level-1\">Importing and Exporting Data to and from cpp_int and cpp_bin_float</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">expression</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../intro.html\" title=\"Introduction\"><span class=\"index-entry-level-1\">Introduction</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">expression_template_default</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_65\"></a><span class=\"term\">F</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">f</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/import_export.html\" title=\"Importing and Exporting Data to and from cpp_int and cpp_bin_float\"><span class=\"index-entry-level-1\">Importing and Exporting Data to and from cpp_int and cpp_bin_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/variable_precision.html\" title=\"Variable-Precision Newton Evaluation\"><span class=\"index-entry-level-1\">Variable-Precision Newton Evaluation</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">FAQ</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/faq.html\" title=\"FAQ\"><span class=\"index-entry-level-1\">precision</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">float128</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/float128.html\" title=\"float128\"><span class=\"index-entry-level-1\">BOOST_MP_USE_FLOAT128</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/float128.html\" title=\"float128\"><span class=\"index-entry-level-1\">BOOST_MP_USE_QUAD</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/float128.html\" title=\"float128\"><span class=\"index-entry-level-1\">data</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/float128.html\" title=\"float128\"><span class=\"index-entry-level-1\">float128_backend</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/float128.html\" title=\"float128\"><span class=\"index-entry-level-1\">of</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/float128.html\" title=\"float128\"><span class=\"index-entry-level-1\">type</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">float128_backend</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/float128.html\" title=\"float128\"><span class=\"index-entry-level-1\">float128</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">floor</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">fma</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">fpclassify</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">frexp</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_66\"></a><span class=\"term\">G</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">gcd</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">Generic Integer Operations</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">add</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">bit_flip</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">bit_set</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">bit_test</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">bit_unset</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">divide_qr</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">integer_modulus</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">lsb</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">miller_rabin_test</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">msb</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">multiply</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">powm</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">precision</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">sqrt</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">subtract</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">the</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">gmp_float</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/gmp_float.html\" title=\"gmp_float\"><span class=\"index-entry-level-1\">data</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><span class=\"bold\"><strong><a class=\"link\" href=\"../tut/floats/gmp_float.html\" title=\"gmp_float\"><span class=\"index-entry-level-1\">gmp_float</span></a></strong></span></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/gmp_float.html\" title=\"gmp_float\"><span class=\"index-entry-level-1\">zero</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">gmp_int</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/gmp_int.html\" title=\"gmp_int\"><span class=\"index-entry-level-1\">data</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><span class=\"bold\"><strong><a class=\"link\" href=\"../tut/ints/gmp_int.html\" title=\"gmp_int\"><span class=\"index-entry-level-1\">gmp_int</span></a></strong></span></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/gmp_int.html\" title=\"gmp_int\"><span class=\"index-entry-level-1\">zero</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">gmp_rational</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/gmp_rational.html\" title=\"gmp_rational\"><span class=\"index-entry-level-1\">data</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/gmp_rational.html\" title=\"gmp_rational\"><span class=\"index-entry-level-1\">denominator</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><span class=\"bold\"><strong><a class=\"link\" href=\"../tut/rational/gmp_rational.html\" title=\"gmp_rational\"><span class=\"index-entry-level-1\">gmp_rational</span></a></strong></span></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/gmp_rational.html\" title=\"gmp_rational\"><span class=\"index-entry-level-1\">numerator</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/gmp_rational.html\" title=\"gmp_rational\"><span class=\"index-entry-level-1\">zero</span></a></p></li>\n</ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_67\"></a><span class=\"term\">H</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">half</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/variable_precision.html\" title=\"Variable-Precision Newton Evaluation\"><span class=\"index-entry-level-1\">Variable-Precision Newton Evaluation</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">History</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/hist.html\" title=\"History\"><span class=\"index-entry-level-1\">cpp_bin_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/hist.html\" title=\"History\"><span class=\"index-entry-level-1\">ilogb</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/hist.html\" title=\"History\"><span class=\"index-entry-level-1\">sqrt</span></a></p></li>\n</ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_68\"></a><span class=\"term\">I</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">i</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/conversions.html\" title=\"Constructing and Interconverting Between Number Types\"><span class=\"index-entry-level-1\">Constructing and Interconverting Between Number Types</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">Mixed Precision Arithmetic</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/variable.html\" title=\"Variable Precision Arithmetic\"><span class=\"index-entry-level-1\">Variable Precision Arithmetic</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">if</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/primetest.html\" title=\"Primality Testing\"><span class=\"index-entry-level-1\">Primality Testing</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">ilogb</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/hist.html\" title=\"History\"><span class=\"index-entry-level-1\">History</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">imag</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">Importing and Exporting Data to and from cpp_int and cpp_bin_float</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/import_export.html\" title=\"Importing and Exporting Data to and from cpp_int and cpp_bin_float\"><span class=\"index-entry-level-1\">bit_set</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/import_export.html\" title=\"Importing and Exporting Data to and from cpp_int and cpp_bin_float\"><span class=\"index-entry-level-1\">BOOST_MP_ASSERT</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/import_export.html\" title=\"Importing and Exporting Data to and from cpp_int and cpp_bin_float\"><span class=\"index-entry-level-1\">export_bits</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/import_export.html\" title=\"Importing and Exporting Data to and from cpp_int and cpp_bin_float\"><span class=\"index-entry-level-1\">f</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/import_export.html\" title=\"Importing and Exporting Data to and from cpp_int and cpp_bin_float\"><span class=\"index-entry-level-1\">result</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">in</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">infinity</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/functions.html\" title=\"std::numeric_limits&lt;&gt; functions\"><span class=\"index-entry-level-1\">std :: numeric_limits &lt;&gt; functions</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/constants.html\" title=\"std::numeric_limits&lt;&gt; constants\"><span class=\"index-entry-level-1\">std::numeric_limits&lt;&gt; constants</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">Input Output</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/input_output.html\" title=\"Input Output\"><span class=\"index-entry-level-1\">bits</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/input_output.html\" title=\"Input Output\"><span class=\"index-entry-level-1\">BOOST_MP_MIN_EXPONENT_DIGITS</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">integer_modulus</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">Internal Support Code</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/internals.html\" title=\"Internal Support Code\"><span class=\"index-entry-level-1\">is_explicitly_convertible</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/internals.html\" title=\"Internal Support Code\"><span class=\"index-entry-level-1\">is_lossy_conversion</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/internals.html\" title=\"Internal Support Code\"><span class=\"index-entry-level-1\">is_restricted_conversion</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/internals.html\" title=\"Internal Support Code\"><span class=\"index-entry-level-1\">is_signed_number</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/internals.html\" title=\"Internal Support Code\"><span class=\"index-entry-level-1\">is_unsigned_number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">Introduction</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../intro.html\" title=\"Introduction\"><span class=\"index-entry-level-1\">a</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../intro.html\" title=\"Introduction\"><span class=\"index-entry-level-1\">expression</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../intro.html\" title=\"Introduction\"><span class=\"index-entry-level-1\">precision</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../intro.html\" title=\"Introduction\"><span class=\"index-entry-level-1\">result</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">iround</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">isfinite</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">isgreater</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">isgreaterequal</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">isinf</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">isless</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">islessequal</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">islessgreater</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">isnan</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">isnormal</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">isunordered</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">is_equivalent_number_type</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">Mixed Precision Arithmetic</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">is_explicitly_convertible</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/internals.html\" title=\"Internal Support Code\"><span class=\"index-entry-level-1\">Internal Support Code</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">is_lossy_conversion</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/internals.html\" title=\"Internal Support Code\"><span class=\"index-entry-level-1\">Internal Support Code</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">is_number</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">is_number_expression</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">is_restricted_conversion</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/internals.html\" title=\"Internal Support Code\"><span class=\"index-entry-level-1\">Internal Support Code</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">is_signed_number</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/internals.html\" title=\"Internal Support Code\"><span class=\"index-entry-level-1\">Internal Support Code</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">is_unsigned_number</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/internals.html\" title=\"Internal Support Code\"><span class=\"index-entry-level-1\">Internal Support Code</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">itrunc</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_69\"></a><span class=\"term\">L</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">ldexp</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">lgamma</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">Literal Types and constexpr Support</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/lits.html\" title=\"Literal Types and constexpr Support\"><span class=\"index-entry-level-1\">BOOST_MP_DEFINE_SIZED_CPP_INT_LITERAL</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/lits.html\" title=\"Literal Types and constexpr Support\"><span class=\"index-entry-level-1\">data</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">llrint</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">llround</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">lltrunc</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">log1p</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">logged_adaptor</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><span class=\"bold\"><strong><a class=\"link\" href=\"../tut/misc/logged_adaptor.html\" title=\"logged_adaptor\"><span class=\"index-entry-level-1\">logged_adaptor</span></a></strong></span></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/misc/logged_adaptor.html\" title=\"logged_adaptor\"><span class=\"index-entry-level-1\">log_postfix_event</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/misc/logged_adaptor.html\" title=\"logged_adaptor\"><span class=\"index-entry-level-1\">log_prefix_event</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/misc/logged_adaptor.html\" title=\"logged_adaptor\"><span class=\"index-entry-level-1\">the</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">log_postfix_event</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/misc/logged_adaptor.html\" title=\"logged_adaptor\"><span class=\"index-entry-level-1\">logged_adaptor</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">log_prefix_event</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/misc/logged_adaptor.html\" title=\"logged_adaptor\"><span class=\"index-entry-level-1\">logged_adaptor</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">lrint</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">lround</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">lsb</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">ltrunc</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_70\"></a><span class=\"term\">M</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">miller_rabin_test</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/primetest.html\" title=\"Primality Testing\"><span class=\"index-entry-level-1\">Primality Testing</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">Mixed Precision Arithmetic</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">a</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">add</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">e</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">i</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">is_equivalent_number_type</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">multiply</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">subtract</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">type</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">modf</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">mpc_complex</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/complex/mpc_complex.html\" title=\"mpc_complex\"><span class=\"index-entry-level-1\">data</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/complex/mpc_complex.html\" title=\"mpc_complex\"><span class=\"index-entry-level-1\">mpc_complex_backend</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/complex/mpc_complex.html\" title=\"mpc_complex\"><span class=\"index-entry-level-1\">zero</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">mpc_complex_backend</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/complex/mpc_complex.html\" title=\"mpc_complex\"><span class=\"index-entry-level-1\">mpc_complex</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">mpfi_float</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">data</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">empty</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">in</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float_backend</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">overlap</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">proper_subset</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">singleton</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">subset</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">zero</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">zero_in</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">mpfi_float_backend</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">mpfr_float</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/mpfr_float.html\" title=\"mpfr_float\"><span class=\"index-entry-level-1\">data</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/mpfr_float.html\" title=\"mpfr_float\"><span class=\"index-entry-level-1\">mpfr_float_backend</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/mpfr_float.html\" title=\"mpfr_float\"><span class=\"index-entry-level-1\">zero</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">mpfr_float_backend</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/mpfr_float.html\" title=\"mpfr_float\"><span class=\"index-entry-level-1\">mpfr_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><span class=\"bold\"><strong><a class=\"link\" href=\"../ref/mpfr_ref.html\" title=\"mpfr_float_backend\"><span class=\"index-entry-level-1\">mpfr_float_backend</span></a></strong></span></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">msb</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">multiply</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">Mixed Precision Arithmetic</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_71\"></a><span class=\"term\">N</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">nextafter</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">nexttoward</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">norm</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">number</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">abs</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">acosh</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">add</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">arg</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">asinh</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">assign</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">atanh</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">bit_flip</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">bit_set</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">bit_test</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">bit_unset</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">cbrt</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">ceil</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">changesign</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">compare</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">component_type</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">conj</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">convert_to</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">copysign</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">cos</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">default_precision</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">denominator</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">divide_qr</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">erf</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">erfc</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">exp</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">expm1</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">expression_template_default</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">floor</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">fma</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">fpclassify</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">frexp</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">gcd</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">ilogb</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">imag</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">integer_modulus</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">iround</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">isfinite</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">isgreater</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">isgreaterequal</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">isinf</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">isless</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">islessequal</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">islessgreater</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">isnan</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">isnormal</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">isunordered</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">is_number</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">is_number_expression</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">itrunc</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">ldexp</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">lgamma</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">llrint</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">llround</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">lltrunc</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">log1p</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">lrint</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">lround</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">lsb</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">ltrunc</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">miller_rabin_test</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">modf</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">msb</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">multiply</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">nextafter</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">nexttoward</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">norm</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><span class=\"bold\"><strong><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></strong></span></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number_category</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">numerator</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">polar</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">pow</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">powm</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">precision</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">proj</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">real</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">remainder</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">remquo</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">round</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">scalar</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">sign</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">signbit</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">sqrt</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">str</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">subtract</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">swap</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">tgamma</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">the</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">to_string</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">trunc</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">type</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">value</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">number_category</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">numerator</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/cpp_rational.html\" title=\"cpp_rational\"><span class=\"index-entry-level-1\">cpp_rational</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/gmp_rational.html\" title=\"gmp_rational\"><span class=\"index-entry-level-1\">gmp_rational</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/tommath_rational.html\" title=\"tommath_rational\"><span class=\"index-entry-level-1\">tommath_rational</span></a></p></li>\n</ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_72\"></a><span class=\"term\">O</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">of</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/float128.html\" title=\"float128\"><span class=\"index-entry-level-1\">float128</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">Optional Requirements on the Backend Type</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/variable.html\" title=\"Variable Precision Arithmetic\"><span class=\"index-entry-level-1\">Variable Precision Arithmetic</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">Optional Requirements on the Backend Type</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">assign_components</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_acos</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_add</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_asin</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_atan</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_atan2</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_bitwise_and</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_bitwise_or</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_bitwise_xor</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_bit_flip</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_bit_set</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_bit_test</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_bit_unset</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_cos</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_cosh</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_decrement</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_divide</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_eq</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_exp</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_exp2</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_fabs</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_fmod</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_gcd</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_get_sign</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_gt</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_increment</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_integer_sqrt</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_is_zero</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_lcm</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_left_shift</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_log</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_log10</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_lt</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_modf</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_modulus</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_msb</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_multiply</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_multiply_add</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_multiply_subtract</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_nearbyint</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_pow</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_powm</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_qr</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_right_shift</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_round</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_scalbn</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_sin</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_sinh</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_subtract</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_tan</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_tanh</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">eval_trunc</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html#boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\" title=\"Table 1.9. Optional Requirements on the Backend Type\"><span class=\"index-entry-level-1\">of</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">overlap</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_73\"></a><span class=\"term\">P</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">polar</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">pow</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">powm</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">precision</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/faq.html\" title=\"FAQ\"><span class=\"index-entry-level-1\">FAQ</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../intro.html\" title=\"Introduction\"><span class=\"index-entry-level-1\">Introduction</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">Primality Testing</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/primetest.html\" title=\"Primality Testing\"><span class=\"index-entry-level-1\">if</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/primetest.html\" title=\"Primality Testing\"><span class=\"index-entry-level-1\">miller_rabin_test</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">proj</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">proper_subset</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_74\"></a><span class=\"term\">R</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">r</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/egs/bitops.html\" title=\"Bit Operations\"><span class=\"index-entry-level-1\">Bit Operations</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">real</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">remainder</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">remquo</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">result</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/import_export.html\" title=\"Importing and Exporting Data to and from cpp_int and cpp_bin_float\"><span class=\"index-entry-level-1\">Importing and Exporting Data to and from cpp_int and cpp_bin_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../intro.html\" title=\"Introduction\"><span class=\"index-entry-level-1\">Introduction</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">round</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">Rounding Rules for Conversions</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rounding.html\" title=\"Rounding Rules for Conversions\"><span class=\"index-entry-level-1\">bits</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_75\"></a><span class=\"term\">S</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">scalar</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">scoped</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/variable.html\" title=\"Variable Precision Arithmetic\"><span class=\"index-entry-level-1\">Variable Precision Arithmetic</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">scoped_opts</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/variable.html\" title=\"Variable Precision Arithmetic\"><span class=\"index-entry-level-1\">Variable Precision Arithmetic</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">sign</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">signbit</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">singleton</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">sp</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/variable_precision.html\" title=\"Variable-Precision Newton Evaluation\"><span class=\"index-entry-level-1\">Variable-Precision Newton Evaluation</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">sqrt</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/hist.html\" title=\"History\"><span class=\"index-entry-level-1\">History</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/functions.html\" title=\"std::numeric_limits&lt;&gt; functions\"><span class=\"index-entry-level-1\">std :: numeric_limits &lt;&gt; functions</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">std :: numeric_limits &lt;&gt; functions</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/functions.html\" title=\"std::numeric_limits&lt;&gt; functions\"><span class=\"index-entry-level-1\">BOOST_MP_ASSERT</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/functions.html\" title=\"std::numeric_limits&lt;&gt; functions\"><span class=\"index-entry-level-1\">infinity</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/functions.html\" title=\"std::numeric_limits&lt;&gt; functions\"><span class=\"index-entry-level-1\">sqrt</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/functions.html\" title=\"std::numeric_limits&lt;&gt; functions\"><span class=\"index-entry-level-1\">value</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">std::numeric_limits&lt;&gt; constants</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/constants.html\" title=\"std::numeric_limits&lt;&gt; constants\"><span class=\"index-entry-level-1\">bits</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/constants.html\" title=\"std::numeric_limits&lt;&gt; constants\"><span class=\"index-entry-level-1\">digits10</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/constants.html\" title=\"std::numeric_limits&lt;&gt; constants\"><span class=\"index-entry-level-1\">infinity</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/constants.html\" title=\"std::numeric_limits&lt;&gt; constants\"><span class=\"index-entry-level-1\">type</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/constants.html\" title=\"std::numeric_limits&lt;&gt; constants\"><span class=\"index-entry-level-1\">zero</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">str</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">subset</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">subtract</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">Mixed Precision Arithmetic</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">swap</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_76\"></a><span class=\"term\">T</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">temporary</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/todo.html\" title=\"TODO\"><span class=\"index-entry-level-1\">TODO</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">tgamma</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/backendconc.html\" title=\"Backend Requirements\"><span class=\"index-entry-level-1\">Backend Requirements</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">the</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/gen_int.html\" title=\"Generic Integer Operations\"><span class=\"index-entry-level-1\">Generic Integer Operations</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/misc/logged_adaptor.html\" title=\"logged_adaptor\"><span class=\"index-entry-level-1\">logged_adaptor</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">TODO</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/todo.html\" title=\"TODO\"><span class=\"index-entry-level-1\">add</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/todo.html\" title=\"TODO\"><span class=\"index-entry-level-1\">cpp_dec_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../map/todo.html\" title=\"TODO\"><span class=\"index-entry-level-1\">temporary</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">tommath_int</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/tom_int.html\" title=\"tom_int\"><span class=\"index-entry-level-1\">tom_int</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">tommath_rational</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/tommath_rational.html\" title=\"tommath_rational\"><span class=\"index-entry-level-1\">denominator</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/tommath_rational.html\" title=\"tommath_rational\"><span class=\"index-entry-level-1\">numerator</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/tommath_rational.html\" title=\"tommath_rational\"><span class=\"index-entry-level-1\">zero</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">tom_int</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/tom_int.html\" title=\"tom_int\"><span class=\"index-entry-level-1\">tommath_int</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/tom_int.html\" title=\"tom_int\"><span class=\"index-entry-level-1\">zero</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">to_string</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">trunc</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li></ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">type</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/jel.html\" title=\"Defining a Special Function.\"><span class=\"index-entry-level-1\">Defining a Special Function.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/float128.html\" title=\"float128\"><span class=\"index-entry-level-1\">float128</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/mixed.html\" title=\"Mixed Precision Arithmetic\"><span class=\"index-entry-level-1\">Mixed Precision Arithmetic</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/constants.html\" title=\"std::numeric_limits&lt;&gt; constants\"><span class=\"index-entry-level-1\">std::numeric_limits&lt;&gt; constants</span></a></p></li>\n</ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_77\"></a><span class=\"term\">V</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">v</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/jel.html\" title=\"Defining a Special Function.\"><span class=\"index-entry-level-1\">Defining a Special Function.</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/variable.html\" title=\"Variable Precision Arithmetic\"><span class=\"index-entry-level-1\">Variable Precision Arithmetic</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">value</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/cpp_bin_float_ref.html\" title=\"cpp_bin_float\"><span class=\"index-entry-level-1\">cpp_bin_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../ref/number.html\" title=\"number\"><span class=\"index-entry-level-1\">number</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/functions.html\" title=\"std::numeric_limits&lt;&gt; functions\"><span class=\"index-entry-level-1\">std :: numeric_limits &lt;&gt; functions</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">Variable Precision Arithmetic</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/variable.html\" title=\"Variable Precision Arithmetic\"><span class=\"index-entry-level-1\">a</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/variable.html\" title=\"Variable Precision Arithmetic\"><span class=\"index-entry-level-1\">i</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/variable.html\" title=\"Variable Precision Arithmetic\"><span class=\"index-entry-level-1\">of</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/variable.html\" title=\"Variable Precision Arithmetic\"><span class=\"index-entry-level-1\">scoped</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/variable.html\" title=\"Variable Precision Arithmetic\"><span class=\"index-entry-level-1\">scoped_opts</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/variable.html\" title=\"Variable Precision Arithmetic\"><span class=\"index-entry-level-1\">v</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">Variable-Precision Newton Evaluation</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/variable_precision.html\" title=\"Variable-Precision Newton Evaluation\"><span class=\"index-entry-level-1\">a</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/variable_precision.html\" title=\"Variable-Precision Newton Evaluation\"><span class=\"index-entry-level-1\">exp</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/variable_precision.html\" title=\"Variable-Precision Newton Evaluation\"><span class=\"index-entry-level-1\">f</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/variable_precision.html\" title=\"Variable-Precision Newton Evaluation\"><span class=\"index-entry-level-1\">half</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/variable_precision.html\" title=\"Variable-Precision Newton Evaluation\"><span class=\"index-entry-level-1\">sp</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/variable_precision.html\" title=\"Variable-Precision Newton Evaluation\"><span class=\"index-entry-level-1\">x</span></a></p></li>\n</ul></div>\n</li>\n</ul></div></dd>\n<dt>\n<a name=\"idx_id_78\"></a><span class=\"term\">X</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">x</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/fp_eg/variable_precision.html\" title=\"Variable-Precision Newton Evaluation\"><span class=\"index-entry-level-1\">Variable-Precision Newton Evaluation</span></a></p></li></ul></div>\n</li></ul></div></dd>\n<dt>\n<a name=\"idx_id_79\"></a><span class=\"term\">Z</span>\n</dt>\n<dd><div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">zero</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \">\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/gmp_float.html\" title=\"gmp_float\"><span class=\"index-entry-level-1\">gmp_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/gmp_int.html\" title=\"gmp_int\"><span class=\"index-entry-level-1\">gmp_int</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/gmp_rational.html\" title=\"gmp_rational\"><span class=\"index-entry-level-1\">gmp_rational</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/complex/mpc_complex.html\" title=\"mpc_complex\"><span class=\"index-entry-level-1\">mpc_complex</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/floats/mpfr_float.html\" title=\"mpfr_float\"><span class=\"index-entry-level-1\">mpfr_float</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/limits/constants.html\" title=\"std::numeric_limits&lt;&gt; constants\"><span class=\"index-entry-level-1\">std::numeric_limits&lt;&gt; constants</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/rational/tommath_rational.html\" title=\"tommath_rational\"><span class=\"index-entry-level-1\">tommath_rational</span></a></p></li>\n<li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/ints/tom_int.html\" title=\"tom_int\"><span class=\"index-entry-level-1\">tom_int</span></a></p></li>\n</ul></div>\n</li>\n<li class=\"listitem\" style=\"list-style-type: none\">\n<p><span class=\"index-entry-level-0\">zero_in</span></p>\n<div class=\"index\"><ul class=\"index\" style=\"list-style-type: none; \"><li class=\"listitem\" style=\"list-style-type: none\"><p><a class=\"link\" href=\"../tut/interval/mpfi.html\" title=\"mpfi_float\"><span class=\"index-entry-level-1\">mpfi_float</span></a></p></li></ul></div>\n</li>\n</ul></div></dd>\n</dl></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"s03.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../indexes.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/indexes.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Indexes</title>\n<link rel=\"stylesheet\" href=\"../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"prev\" href=\"map/ack.html\" title=\"Acknowledgements\">\n<link rel=\"next\" href=\"indexes/s01.html\" title=\"Function Index\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"map/ack.html\"><img src=\"../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"indexes/s01.html\"><img src=\"../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h2 class=\"title\" style=\"clear: both\">\n<a name=\"boost_multiprecision.indexes\"></a><a class=\"link\" href=\"indexes.html\" title=\"Indexes\">Indexes</a>\n</h2></div></div></div>\n<div class=\"toc\"><dl class=\"toc\">\n<dt><span class=\"section\"><a href=\"indexes/s01.html\">Function Index</a></span></dt>\n<dt><span class=\"section\"><a href=\"indexes/s02.html\">Class Index</a></span></dt>\n<dt><span class=\"section\"><a href=\"indexes/s03.html\">Typedef Index</a></span></dt>\n<dt><span class=\"section\"><a href=\"indexes/s04.html\">Index</a></span></dt>\n</dl></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"map/ack.html\"><img src=\"../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"indexes/s01.html\"><img src=\"../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/intro.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Introduction</title>\n<link rel=\"stylesheet\" href=\"../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"prev\" href=\"../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"next\" href=\"tut.html\" title=\"Tutorial\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"tut.html\"><img src=\"../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h2 class=\"title\" style=\"clear: both\">\n<a name=\"boost_multiprecision.intro\"></a><a class=\"link\" href=\"intro.html\" title=\"Introduction\">Introduction</a>\n</h2></div></div></div>\n<p>\n      The Multiprecision Library provides <a class=\"link\" href=\"tut/ints.html\" title=\"Integer Types\">integer</a>,\n      <a class=\"link\" href=\"tut/rational.html\" title=\"Rational Number Types\">rational</a>, <a class=\"link\" href=\"tut/floats.html\" title=\"Floating-point Types\">floating-point</a>,\n      and <a class=\"link\" href=\"tut/complex.html\" title=\"Complex Number Types\">complex</a> types in\n      C++ that have more range and precision than C++'s ordinary <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n      (built-in)</a> types. The big number types in Multiprecision can be used\n      with a wide selection of basic mathematical operations, elementary transcendental\n      functions as well as the functions in Boost.Math. The Multiprecision types\n      can also interoperate with any <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n      (built-in) type</a> in C++ using clearly defined conversion rules. This\n      allows Boost.Multiprecision to be used for all kinds of mathematical calculations\n      involving integer, rational and floating-point types requiring extended range\n      and precision.\n    </p>\n<p>\n      Multiprecision consists of a generic interface to the mathematics of large\n      numbers as well as a selection of big number back-ends, with support for integer,\n      rational, floating-point, and complex types. Boost.Multiprecision provides\n      a selection of back-ends provided off-the-rack in including interfaces to GMP,\n      MPFR, MPIR, MPC, TomMath as well as its own collection of Boost-licensed, header-only\n      back-ends for integers, rationals and floats. In addition, user-defined back-ends\n      can be created and used with the interface of Multiprecision, provided the\n      class implementation adheres to the necessary <a class=\"link\" href=\"ref/backendconc.html\" title=\"Backend Requirements\">concepts</a>.\n    </p>\n<p>\n      Depending upon the number type, precision may be arbitrarily large (limited\n      only by available memory), fixed at compile time (for example, 50 or 100 decimal\n      digits), or a variable controlled at run-time by member functions. The types\n      are <a href=\"https://en.wikipedia.org/wiki/Expression_templates\" target=\"_top\">expression\n      templates</a> - enabled for better performance than naive user-defined\n      types.\n    </p>\n<p>\n      The Multiprecision library comes in two distinct parts:\n    </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n          An expression-template-enabled front-end <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n          that handles all the operator overloading, expression evaluation optimization,\n          and code reduction.\n        </li>\n<li class=\"listitem\">\n          A selection of back-ends that implement the actual arithmetic operations,\n          and need conform only to the reduced interface requirements of the front-end.\n        </li>\n</ul></div>\n<p>\n      Separation of front-end and back-end allows use of highly refined, but restricted\n      license libraries where possible, but provides Boost license alternatives for\n      users who must have a portable unconstrained license. Which is to say some\n      back-ends rely on 3rd party libraries, but a header-only Boost license version\n      is always available (if somewhat slower).\n    </p>\n<h6>\n<a name=\"boost_multiprecision.intro.h0\"></a>\n      <span class=\"phrase\"><a name=\"boost_multiprecision.intro.getting_started\"></a></span><a class=\"link\" href=\"intro.html#boost_multiprecision.intro.getting_started\">Getting\n      started with Boost.Multiprecision</a>\n    </h6>\n<p>\n      Should you just wish to 'cut to the chase' just to get bigger integers and/or\n      bigger and more precise reals as simply and portably as possible, close to\n      'drop-in' replacements for the <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n      (built-in) type</a> analogs, then use a fully Boost-licensed number type,\n      and skip to one of more of :\n    </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n          <a class=\"link\" href=\"tut/ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a> for\n          multiprecision integers,\n        </li>\n<li class=\"listitem\">\n          <a class=\"link\" href=\"tut/rational/cpp_rational.html\" title=\"cpp_rational\">cpp_rational</a>\n          for rational types,\n        </li>\n<li class=\"listitem\">\n          <a class=\"link\" href=\"tut/floats/cpp_bin_float.html\" title=\"cpp_bin_float\">cpp_bin_float</a>\n          and <a class=\"link\" href=\"tut/floats/cpp_dec_float.html\" title=\"cpp_dec_float\">cpp_dec_float</a>\n          for multiprecision floating-point types,\n        </li>\n<li class=\"listitem\">\n          <a class=\"link\" href=\"tut/complex/cpp_complex.html\" title=\"cpp_complex\">cpp_complex</a>\n          for complex types.\n        </li>\n</ul></div>\n<p>\n      The library is very often used via one of the predefined convenience <code class=\"computeroutput\"><span class=\"keyword\">typedef</span></code>s like <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">int128_t</span></code>\n      or <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_bin_float_quad</span></code>.\n    </p>\n<p>\n      For example, if you want a signed, 128-bit fixed size integer:\n    </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_int</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>  <span class=\"comment\">//  Integer types.</span>\n\n<span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">int128_t</span> <span class=\"identifier\">my_128_bit_int</span><span class=\"special\">;</span>\n</pre>\n<p>\n      Alternatively, and more adventurously, if you wanted an <a href=\"http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic\" target=\"_top\">arbitrary\n      precision</a> integer type using <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>\n      as the underlying implementation then you could use:\n    </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">gmp</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>  <span class=\"comment\">// Defines the wrappers around the GMP library's types</span>\n\n<span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">mpz_int</span> <span class=\"identifier\">myint</span><span class=\"special\">;</span>    <span class=\"comment\">// Arbitrary precision integer type.</span>\n</pre>\n<p>\n      Or for a simple, portable 128-bit floating-point close to a drop-in for a\n      <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental (built-in)\n      type</a> like <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>, usually\n      64-bit\n    </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n\n<span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_bin_float_quad</span> <span class=\"identifier\">my_quad_real</span><span class=\"special\">;</span>\n</pre>\n<p>\n      Alternatively, you can compose your own 'custom' multiprecision type, by combining\n      <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> with one of the predefined\n      back-end types. For example, suppose you wanted a 300 decimal digit floating-point\n      type based on the <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a> library. In\n      this case, there's no predefined <code class=\"computeroutput\"><span class=\"keyword\">typedef</span></code>\n      with that level of precision, so instead we compose our own:\n    </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">mpfr</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>  <span class=\"comment\">// Defines the Backend type that wraps MPFR.</span>\n\n<span class=\"keyword\">namespace</span> <span class=\"identifier\">mp</span> <span class=\"special\">=</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>     <span class=\"comment\">// Reduce the typing a bit later...</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">mp</span><span class=\"special\">::</span><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mp</span><span class=\"special\">::</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">300</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>  <span class=\"identifier\">my_float</span><span class=\"special\">;</span>\n\n<span class=\"identifier\">my_float</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">c</span><span class=\"special\">;</span> <span class=\"comment\">// These variables have 300 decimal digits precision.</span>\n</pre>\n<p>\n      We can repeat the above example, but with the expression templates disabled\n      (for faster compile times, but slower runtimes) by passing a second template\n      argument to <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>:\n    </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">mpfr</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>  <span class=\"comment\">// Defines the Backend type that wraps MPFR.</span>\n\n<span class=\"keyword\">namespace</span> <span class=\"identifier\">mp</span> <span class=\"special\">=</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>     <span class=\"comment\">// Reduce the typing a bit later...</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">mp</span><span class=\"special\">::</span><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mp</span><span class=\"special\">::</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">300</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span>  <span class=\"identifier\">my_float</span><span class=\"special\">;</span>\n\n<span class=\"identifier\">my_float</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">c</span><span class=\"special\">;</span> <span class=\"comment\">// These variables have 300 decimal digits precision</span>\n</pre>\n<p>\n      We can also mix arithmetic operations between different types, provided there\n      is an unambiguous implicit conversion from one type to the other:\n    </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_int</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">namespace</span> <span class=\"identifier\">mp</span> <span class=\"special\">=</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>     <span class=\"comment\">// Reduce the typing a bit later...</span>\n\n<span class=\"identifier\">mp</span><span class=\"special\">::</span><span class=\"identifier\">int128_t</span> <span class=\"identifier\">a</span><span class=\"special\">(</span><span class=\"number\">3</span><span class=\"special\">),</span> <span class=\"identifier\">b</span><span class=\"special\">(</span><span class=\"number\">4</span><span class=\"special\">);</span>\n<span class=\"identifier\">mp</span><span class=\"special\">::</span><span class=\"identifier\">int512_t</span> <span class=\"identifier\">c</span><span class=\"special\">(</span><span class=\"number\">50</span><span class=\"special\">),</span> <span class=\"identifier\">d</span><span class=\"special\">;</span>\n\n<span class=\"identifier\">d</span> <span class=\"special\">=</span> <span class=\"identifier\">c</span> <span class=\"special\">*</span> <span class=\"identifier\">a</span><span class=\"special\">;</span>   <span class=\"comment\">// OK, result of mixed arithmetic is an int512_t</span>\n</pre>\n<p>\n      Conversions are also allowed:\n    </p>\n<pre class=\"programlisting\"><span class=\"identifier\">d</span> <span class=\"special\">=</span> <span class=\"identifier\">a</span><span class=\"special\">;</span> <span class=\"comment\">// OK, widening conversion.</span>\n<span class=\"identifier\">d</span> <span class=\"special\">=</span> <span class=\"identifier\">a</span> <span class=\"special\">*</span> <span class=\"identifier\">b</span><span class=\"special\">;</span>  <span class=\"comment\">// OK, can convert from an expression template too.</span>\n</pre>\n<p>\n      However conversions that are inherently lossy are either declared explicit\n      or else forbidden altogether:\n    </p>\n<pre class=\"programlisting\"><span class=\"identifier\">d</span> <span class=\"special\">=</span> <span class=\"number\">3.14</span><span class=\"special\">;</span>  <span class=\"comment\">// Error implicit conversion from double not allowed.</span>\n<span class=\"identifier\">d</span> <span class=\"special\">=</span> <span class=\"keyword\">static_cast</span><span class=\"special\">&lt;</span><span class=\"identifier\">mp</span><span class=\"special\">::</span><span class=\"identifier\">int512_t</span><span class=\"special\">&gt;(</span><span class=\"number\">3.14</span><span class=\"special\">);</span>  <span class=\"comment\">// OK explicit construction is allowed</span>\n</pre>\n<p>\n      Mixed arithmetic will fail if the conversion is either ambiguous or explicit:\n    </p>\n<pre class=\"programlisting\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;&gt;,</span> <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span> <span class=\"identifier\">a</span><span class=\"special\">(</span><span class=\"number\">2</span><span class=\"special\">);</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;&gt;,</span> <span class=\"identifier\">et_on</span><span class=\"special\">&gt;</span>  <span class=\"identifier\">b</span><span class=\"special\">(</span><span class=\"number\">3</span><span class=\"special\">);</span>\n\n<span class=\"identifier\">b</span> <span class=\"special\">=</span> <span class=\"identifier\">a</span> <span class=\"special\">*</span> <span class=\"identifier\">b</span><span class=\"special\">;</span> <span class=\"comment\">// Error, implicit conversion could go either way.</span>\n<span class=\"identifier\">b</span> <span class=\"special\">=</span> <span class=\"identifier\">a</span> <span class=\"special\">*</span> <span class=\"number\">3.14</span><span class=\"special\">;</span> <span class=\"comment\">// Error, no operator overload if the conversion would be explicit.</span>\n</pre>\n<h5>\n<a name=\"boost_multiprecision.intro.h1\"></a>\n      <span class=\"phrase\"><a name=\"boost_multiprecision.intro.move_semantics\"></a></span><a class=\"link\" href=\"intro.html#boost_multiprecision.intro.move_semantics\">Move\n      Semantics</a>\n    </h5>\n<p>\n      On compilers that support rvalue-references, class <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n      is move-enabled if the underlying backend is.\n    </p>\n<p>\n      In addition the non-expression template operator overloads (see below) are\n      move aware and have overloads that look something like:\n    </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">B</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">B</span><span class=\"special\">,</span> <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span> <span class=\"keyword\">operator</span> <span class=\"special\">+</span> <span class=\"special\">(</span><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">B</span><span class=\"special\">,</span> <span class=\"identifier\">et_off</span><span class=\"special\">&gt;&amp;&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">B</span><span class=\"special\">,</span> <span class=\"identifier\">et_off</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n    <span class=\"keyword\">return</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">move</span><span class=\"special\">(</span><span class=\"identifier\">a</span> <span class=\"special\">+=</span> <span class=\"identifier\">b</span><span class=\"special\">);</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n      These operator overloads ensure that many expressions can be evaluated without\n      actually generating any temporaries. However, there are still many simple expressions\n      such as\n    </p>\n<pre class=\"programlisting\"><span class=\"identifier\">a</span> <span class=\"special\">=</span> <span class=\"identifier\">b</span> <span class=\"special\">*</span> <span class=\"identifier\">c</span><span class=\"special\">;</span>\n</pre>\n<p>\n      which don't noticeably benefit from move support. Therefore, optimal performance\n      comes from having both move-support, and expression templates enabled.\n    </p>\n<p>\n      Note that while \"moved-from\" objects are left in a sane state, they\n      have an unspecified value, and the only permitted operations on them are destruction\n      or the assignment of a new value. Any other operation should be considered\n      a programming error and all of our backends will trigger an assertion if any\n      other operation is attempted. This behavior allows for optimal performance\n      on move-construction (i.e. no allocation required, we just take ownership of\n      the existing object's internal state), while maintaining usability in the standard\n      library containers.\n    </p>\n<h5>\n<a name=\"boost_multiprecision.intro.h2\"></a>\n      <span class=\"phrase\"><a name=\"boost_multiprecision.intro.expression_templates\"></a></span><a class=\"link\" href=\"intro.html#boost_multiprecision.intro.expression_templates\">Expression\n      Templates</a>\n    </h5>\n<p>\n      Class <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> is expression-template-enabled:\n      that means that rather than having a multiplication operator that looks like\n      this:\n    </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">&gt;</span> <span class=\"keyword\">operator</span> <span class=\"special\">*</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">&gt;</span> <span class=\"identifier\">result</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">);</span>\n   <span class=\"identifier\">result</span> <span class=\"special\">*=</span> <span class=\"identifier\">b</span><span class=\"special\">;</span>\n   <span class=\"keyword\">return</span> <span class=\"identifier\">result</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n      Instead the operator looks more like this:\n    </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">&gt;</span>\n<span class=\"emphasis\"><em>unmentionable-type</em></span> <span class=\"keyword\">operator</span> <span class=\"special\">*</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">);</span>\n</pre>\n<p>\n      Where the '<span class=\"emphasis\"><em>unmentionable</em></span>' return type is an implementation\n      detail that, rather than containing the result of the multiplication, contains\n      instructions on how to compute the result. In effect it's just a pair of references\n      to the arguments of the function, plus some compile-time information that stores\n      what the operation is.\n    </p>\n<p>\n      The great advantage of this method is the <span class=\"emphasis\"><em>elimination of temporaries</em></span>:\n      for example, the \"naive\" implementation of <code class=\"computeroutput\"><span class=\"keyword\">operator</span><span class=\"special\">*</span></code> above, requires one temporary for computing\n      the result, and at least another one to return it. It's true that sometimes\n      this overhead can be reduced by using move-semantics, but it can't be eliminated\n      completely. For example, lets suppose we're evaluating a polynomial via Horner's\n      method, something like this:\n    </p>\n<pre class=\"programlisting\"><span class=\"identifier\">T</span> <span class=\"identifier\">a</span><span class=\"special\">[</span><span class=\"number\">7</span><span class=\"special\">]</span> <span class=\"special\">=</span> <span class=\"special\">{</span> <span class=\"comment\">/* some values */</span> <span class=\"special\">};</span>\n<span class=\"comment\">//....</span>\n<span class=\"identifier\">y</span> <span class=\"special\">=</span> <span class=\"special\">(((((</span><span class=\"identifier\">a</span><span class=\"special\">[</span><span class=\"number\">6</span><span class=\"special\">]</span> <span class=\"special\">*</span> <span class=\"identifier\">x</span> <span class=\"special\">+</span> <span class=\"identifier\">a</span><span class=\"special\">[</span><span class=\"number\">5</span><span class=\"special\">])</span> <span class=\"special\">*</span> <span class=\"identifier\">x</span> <span class=\"special\">+</span> <span class=\"identifier\">a</span><span class=\"special\">[</span><span class=\"number\">4</span><span class=\"special\">])</span> <span class=\"special\">*</span> <span class=\"identifier\">x</span> <span class=\"special\">+</span> <span class=\"identifier\">a</span><span class=\"special\">[</span><span class=\"number\">3</span><span class=\"special\">])</span> <span class=\"special\">*</span> <span class=\"identifier\">x</span> <span class=\"special\">+</span> <span class=\"identifier\">a</span><span class=\"special\">[</span><span class=\"number\">2</span><span class=\"special\">])</span> <span class=\"special\">*</span> <span class=\"identifier\">x</span> <span class=\"special\">+</span> <span class=\"identifier\">a</span><span class=\"special\">[</span><span class=\"number\">1</span><span class=\"special\">])</span> <span class=\"special\">*</span> <span class=\"identifier\">x</span> <span class=\"special\">+</span> <span class=\"identifier\">a</span><span class=\"special\">[</span><span class=\"number\">0</span><span class=\"special\">];</span>\n</pre>\n<p>\n      If type <code class=\"computeroutput\"><span class=\"identifier\">T</span></code> is a <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>, then this expression is evaluated\n      <span class=\"emphasis\"><em>without creating a single temporary value</em></span>. In contrast,\n      if we were using the <a href=\"http://math.berkeley.edu/~wilken/code/gmpfrxx/\" target=\"_top\">mpfr_class</a>\n      C++ wrapper for <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a> - then this expression\n      would result in no less than 11 temporaries (this is true even though <a href=\"http://math.berkeley.edu/~wilken/code/gmpfrxx/\" target=\"_top\">mpfr_class</a> does\n      use expression templates to reduce the number of temporaries somewhat). Had\n      we used an even simpler wrapper around <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a>\n      like <a href=\"http://www.holoborodko.com/pavel/mpfr/\" target=\"_top\">mpreal</a> things\n      would have been even worse and no less that 24 temporaries are created for\n      this simple expression (note - we actually measure the number of memory allocations\n      performed rather than the number of temporaries directly, note also that the\n      <a href=\"http://gmplib.org/manual/C_002b_002b-Interface-Floats.html#C_002b_002b-Interface-Floats\" target=\"_top\">mpf_class</a>\n      wrapper that will be supplied with GMP-5.1 reduces the number of temporaries\n      to pretty much zero). Note that if we compile with expression templates disabled\n      and rvalue-reference support on, then actually still have no wasted memory\n      allocations as even though temporaries are created, their contents are moved\n      rather than copied. <a href=\"#ftn.boost_multiprecision.intro.f0\" class=\"footnote\" name=\"boost_multiprecision.intro.f0\"><sup class=\"footnote\">[1]</sup></a>\n    </p>\n<div class=\"important\"><table border=\"0\" summary=\"Important\">\n<tr>\n<td rowspan=\"2\" align=\"center\" valign=\"top\" width=\"25\"><img alt=\"[Important]\" src=\"../../../../../doc/src/images/important.png\"></td>\n<th align=\"left\">Important</th>\n</tr>\n<tr><td align=\"left\" valign=\"top\">\n<p>\n        Expression templates can radically reorder the operations in an expression,\n        for example:\n      </p>\n<p>\n        a = (b * c) * a;\n      </p>\n<p>\n        Will get transformed into:\n      </p>\n<p>\n        a *= c; a *= b;\n      </p>\n<p>\n        If this is likely to be an issue for a particular application, then they\n        should be disabled.\n      </p>\n</td></tr>\n</table></div>\n<p>\n      This library also extends expression template support to standard library functions\n      like <code class=\"computeroutput\"><span class=\"identifier\">abs</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">sin</span></code>\n      with <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> arguments. This\n      means that an expression such as:\n    </p>\n<pre class=\"programlisting\"><span class=\"identifier\">y</span> <span class=\"special\">=</span> <span class=\"identifier\">abs</span><span class=\"special\">(</span><span class=\"identifier\">x</span><span class=\"special\">);</span>\n</pre>\n<p>\n      can be evaluated without a single temporary being calculated. Even expressions\n      like:\n    </p>\n<pre class=\"programlisting\"><span class=\"identifier\">y</span> <span class=\"special\">=</span> <span class=\"identifier\">sin</span><span class=\"special\">(</span><span class=\"identifier\">x</span><span class=\"special\">);</span>\n</pre>\n<p>\n      get this treatment, so that variable 'y' is used as \"working storage\"\n      within the implementation of <code class=\"computeroutput\"><span class=\"identifier\">sin</span></code>,\n      thus reducing the number of temporaries used by one. Of course, should you\n      write:\n    </p>\n<pre class=\"programlisting\"><span class=\"identifier\">x</span> <span class=\"special\">=</span> <span class=\"identifier\">sin</span><span class=\"special\">(</span><span class=\"identifier\">x</span><span class=\"special\">);</span>\n</pre>\n<p>\n      Then we clearly can't use <code class=\"computeroutput\"><span class=\"identifier\">x</span></code>\n      as working storage during the calculation, so then a temporary variable is\n      created in this case.\n    </p>\n<p>\n      Given the comments above, you might be forgiven for thinking that expression-templates\n      are some kind of universal-panacea: sadly though, all tricks like this have\n      their downsides. For one thing, expression template libraries like this one,\n      tend to be slower to compile than their simpler cousins, they're also harder\n      to debug (should you actually want to step through our code!), and rely on\n      compiler optimizations being turned on to give really good performance. Also,\n      since the return type from expressions involving <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>s\n      is an \"unmentionable implementation detail\", you have to be careful\n      to cast the result of an expression to the actual number type when passing\n      an expression to a template function. For example, given:\n    </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">void</span> <span class=\"identifier\">my_proc</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">T</span><span class=\"special\">&amp;);</span>\n</pre>\n<p>\n      Then calling:\n    </p>\n<pre class=\"programlisting\"><span class=\"identifier\">my_proc</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">+</span><span class=\"identifier\">b</span><span class=\"special\">);</span>\n</pre>\n<p>\n      Will very likely result in obscure error messages inside the body of <code class=\"computeroutput\"><span class=\"identifier\">my_proc</span></code> - since we've passed it an expression\n      template type, and not a number type. Instead we probably need:\n    </p>\n<pre class=\"programlisting\"><span class=\"identifier\">my_proc</span><span class=\"special\">(</span><span class=\"identifier\">my_number_type</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">+</span><span class=\"identifier\">b</span><span class=\"special\">));</span>\n</pre>\n<p>\n      Having said that, these situations don't occur that often - or indeed not at\n      all for non-template functions. In addition, all the functions in the Boost.Math\n      library will automatically convert expression-template arguments to the underlying\n      number type without you having to do anything, so:\n    </p>\n<pre class=\"programlisting\"><span class=\"identifier\">mpfr_float_100</span> <span class=\"identifier\">a</span><span class=\"special\">(</span><span class=\"number\">20</span><span class=\"special\">),</span> <span class=\"identifier\">delta</span><span class=\"special\">(</span><span class=\"number\">0.125</span><span class=\"special\">);</span>\n<span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">gamma_p</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">a</span> <span class=\"special\">+</span> <span class=\"identifier\">delta</span><span class=\"special\">);</span>\n</pre>\n<p>\n      Will work just fine, with the <code class=\"computeroutput\"><span class=\"identifier\">a</span> <span class=\"special\">+</span> <span class=\"identifier\">delta</span></code> expression\n      template argument getting converted to an <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float_100</span></code>\n      internally by the Boost.Math library.\n    </p>\n<div class=\"caution\"><table border=\"0\" summary=\"Caution\">\n<tr>\n<td rowspan=\"2\" align=\"center\" valign=\"top\" width=\"25\"><img alt=\"[Caution]\" src=\"../../../../../doc/src/images/caution.png\"></td>\n<th align=\"left\">Caution</th>\n</tr>\n<tr><td align=\"left\" valign=\"top\">\n<p>\n        In C++11 you should never store an expression template using:\n      </p>\n<p>\n        <code class=\"computeroutput\"><span class=\"keyword\">auto</span> <span class=\"identifier\">my_expression</span>\n        <span class=\"special\">=</span> <span class=\"identifier\">a</span> <span class=\"special\">+</span> <span class=\"identifier\">b</span> <span class=\"special\">-</span>\n        <span class=\"identifier\">c</span><span class=\"special\">;</span></code>\n      </p>\n<p>\n        unless you're absolutely sure that the lifetimes of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">c</span></code>\n        will outlive that of <code class=\"computeroutput\"><span class=\"identifier\">my_expression</span></code>.\n      </p>\n<p>\n        In fact, it is particularly easy to create dangling references by mixing\n        expression templates with the <code class=\"computeroutput\"><span class=\"keyword\">auto</span></code>\n        keyword, for example:\n      </p>\n<p>\n        <code class=\"computeroutput\"><span class=\"keyword\">auto</span> <span class=\"identifier\">val</span>\n        <span class=\"special\">=</span> <span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">(</span><span class=\"string\">\"23.1\"</span><span class=\"special\">)</span> <span class=\"special\">*</span> <span class=\"number\">100</span><span class=\"special\">;</span></code>\n      </p>\n<p>\n        In this situation, the integer literal is stored directly in the expression\n        template - so its use is OK here - but the <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float_50</span></code>\n        temporary is stored by reference and then destructed when the statement completes,\n        leaving a dangling reference.\n      </p>\n<p>\n        <span class=\"bold\"><strong><span class=\"emphasis\"><em>If in doubt, do not ever mix expression templates\n        with the <code class=\"computeroutput\"><span class=\"keyword\">auto</span></code> keyword.</em></span></strong></span>\n      </p>\n</td></tr>\n</table></div>\n<p>\n      And finally... the performance improvements from an expression template library\n      like this are often not as dramatic as the reduction in number of temporaries\n      would suggest. For example, if we compare this library with <a href=\"http://math.berkeley.edu/~wilken/code/gmpfrxx/\" target=\"_top\">mpfr_class</a>\n      and <a href=\"http://www.holoborodko.com/pavel/mpfr/\" target=\"_top\">mpreal</a>, with\n      all three using the underlying <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a>\n      library at 50 decimal digits precision then we see the following typical results\n      for polynomial execution:\n    </p>\n<div class=\"table\">\n<a name=\"boost_multiprecision.intro.evaluation_of_order_6_polynomial\"></a><p class=\"title\"><b>Table 1.1. Evaluation of Order 6 Polynomial.</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Evaluation of Order 6 Polynomial.\">\n<colgroup>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n              <p>\n                Library\n              </p>\n            </th>\n<th>\n              <p>\n                Relative Time\n              </p>\n            </th>\n<th>\n              <p>\n                Relative number of memory allocations\n              </p>\n            </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n              <p>\n                number\n              </p>\n            </td>\n<td>\n              <p>\n                1.0 (0.00957s)\n              </p>\n            </td>\n<td>\n              <p>\n                1.0 (2996 total)\n              </p>\n            </td>\n</tr>\n<tr>\n<td>\n              <p>\n                <a href=\"http://math.berkeley.edu/~wilken/code/gmpfrxx/\" target=\"_top\">mpfr_class</a>\n              </p>\n            </td>\n<td>\n              <p>\n                1.1 (0.0102s)\n              </p>\n            </td>\n<td>\n              <p>\n                4.3 (12976 total)\n              </p>\n            </td>\n</tr>\n<tr>\n<td>\n              <p>\n                <a href=\"http://www.holoborodko.com/pavel/mpfr/\" target=\"_top\">mpreal</a>\n              </p>\n            </td>\n<td>\n              <p>\n                1.6 (0.0151s)\n              </p>\n            </td>\n<td>\n              <p>\n                9.3 (27947 total)\n              </p>\n            </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><p>\n      As you can see, the execution time increases a lot more slowly than the number\n      of memory allocations. There are a number of reasons for this:\n    </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n          The cost of extended-precision multiplication and division is so great,\n          that the times taken for these tend to swamp everything else.\n        </li>\n<li class=\"listitem\">\n          The cost of an in-place multiplication (using <code class=\"computeroutput\"><span class=\"keyword\">operator</span><span class=\"special\">*=</span></code>) tends to be more than an out-of-place\n          <code class=\"computeroutput\"><span class=\"keyword\">operator</span><span class=\"special\">*</span></code>\n          (typically <code class=\"computeroutput\"><span class=\"keyword\">operator</span> <span class=\"special\">*=</span></code>\n          has to create a temporary workspace to carry out the multiplication, where\n          as <code class=\"computeroutput\"><span class=\"keyword\">operator</span><span class=\"special\">*</span></code>\n          can use the target variable as workspace). Since the expression templates\n          carry out their magic by converting out-of-place operators to in-place\n          ones, we necessarily take this hit. Even so the transformation is more\n          efficient than creating the extra temporary variable, just not by as much\n          as one would hope.\n        </li>\n</ul></div>\n<p>\n      Finally, note that <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> takes\n      a second template argument, which, when set to <code class=\"computeroutput\"><span class=\"identifier\">et_off</span></code>\n      disables all the expression template machinery. The result is much faster to\n      compile, but slower at runtime.\n    </p>\n<p>\n      We'll conclude this section by providing some more performance comparisons\n      between these three libraries, again, all are using <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a>\n      to carry out the underlying arithmetic, and all are operating at the same precision\n      (50 decimal digits):\n    </p>\n<div class=\"table\">\n<a name=\"boost_multiprecision.intro.evaluation_of_boost_math_s_besse\"></a><p class=\"title\"><b>Table 1.2. Evaluation of Boost.Math's Bessel function test data</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Evaluation of Boost.Math's Bessel function test data\">\n<colgroup>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n              <p>\n                Library\n              </p>\n            </th>\n<th>\n              <p>\n                Relative Time\n              </p>\n            </th>\n<th>\n              <p>\n                Relative Number of Memory Allocations\n              </p>\n            </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n              <p>\n                mpfr_float_50\n              </p>\n            </td>\n<td>\n              <p>\n                1.0 (5.78s)\n              </p>\n            </td>\n<td>\n              <p>\n                1.0 (1611963)\n              </p>\n            </td>\n</tr>\n<tr>\n<td>\n              <p>\n                number&lt;mpfr_float_backend&lt;50&gt;, et_off&gt;<br> (but with\n                rvalue reference support)\n              </p>\n            </td>\n<td>\n              <p>\n                1.1 (6.29s)\n              </p>\n            </td>\n<td>\n              <p>\n                2.64 (4260868)\n              </p>\n            </td>\n</tr>\n<tr>\n<td>\n              <p>\n                <a href=\"http://math.berkeley.edu/~wilken/code/gmpfrxx/\" target=\"_top\">mpfr_class</a>\n              </p>\n            </td>\n<td>\n              <p>\n                1.1 (6.28s)\n              </p>\n            </td>\n<td>\n              <p>\n                2.45 (3948316)\n              </p>\n            </td>\n</tr>\n<tr>\n<td>\n              <p>\n                <a href=\"http://www.holoborodko.com/pavel/mpfr/\" target=\"_top\">mpreal</a>\n              </p>\n            </td>\n<td>\n              <p>\n                1.65 (9.54s)\n              </p>\n            </td>\n<td>\n              <p>\n                8.21 (13226029)\n              </p>\n            </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.intro.evaluation_of_boost_math_s_non_c\"></a><p class=\"title\"><b>Table 1.3. Evaluation of Boost.Math's Non-Central T distribution test data</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Evaluation of Boost.Math's Non-Central T distribution test data\">\n<colgroup>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n              <p>\n                Library\n              </p>\n            </th>\n<th>\n              <p>\n                Relative Time\n              </p>\n            </th>\n<th>\n              <p>\n                Relative Number of Memory Allocations\n              </p>\n            </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n              <p>\n                number\n              </p>\n            </td>\n<td>\n              <p>\n                1.0 (263s)\n              </p>\n            </td>\n<td>\n              <p>\n                1.0 (127710873)\n              </p>\n            </td>\n</tr>\n<tr>\n<td>\n              <p>\n                number&lt;mpfr_float_backend&lt;50&gt;, et_off&gt;<br> (but with\n                rvalue reference support)\n              </p>\n            </td>\n<td>\n              <p>\n                1.0 (260s)\n              </p>\n            </td>\n<td>\n              <p>\n                1.2 (156797871)\n              </p>\n            </td>\n</tr>\n<tr>\n<td>\n              <p>\n                <a href=\"http://math.berkeley.edu/~wilken/code/gmpfrxx/\" target=\"_top\">mpfr_class</a>\n              </p>\n            </td>\n<td>\n              <p>\n                1.1 (287s)\n              </p>\n            </td>\n<td>\n              <p>\n                2.1 (268336640)\n              </p>\n            </td>\n</tr>\n<tr>\n<td>\n              <p>\n                <a href=\"http://www.holoborodko.com/pavel/mpfr/\" target=\"_top\">mpreal</a>\n              </p>\n            </td>\n<td>\n              <p>\n                1.5 (389s)\n              </p>\n            </td>\n<td>\n              <p>\n                3.6 (466960653)\n              </p>\n            </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><p>\n      The above results were generated on Win32 compiling with Visual C++ 2010, all\n      optimizations on (/Ox), with MPFR 3.0 and MPIR 2.3.0.\n    </p>\n<div class=\"footnotes\">\n<br><hr style=\"width:100; text-align:left;margin-left: 0\">\n<div id=\"ftn.boost_multiprecision.intro.f0\" class=\"footnote\"><p><a href=\"#boost_multiprecision.intro.f0\" class=\"para\"><sup class=\"para\">[1] </sup></a>\n        The actual number generated will depend on the compiler, how well it optimizes\n        the code, and whether it supports rvalue references. The number of 11 temporaries\n        was generated with Visual C++ 2010.\n      </p></div>\n</div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"tut.html\"><img src=\"../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/map/ack.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Acknowledgements</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../map.html\" title=\"Roadmap\">\n<link rel=\"prev\" href=\"faq.html\" title=\"FAQ\">\n<link rel=\"next\" href=\"../indexes.html\" title=\"Indexes\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"faq.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../map.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../indexes.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.map.ack\"></a><a class=\"link\" href=\"ack.html\" title=\"Acknowledgements\">Acknowledgements</a>\n</h3></div></div></div>\n<p>\n        This library would not have happened without:\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Christopher Kormanyos' C++ decimal number code.\n          </li>\n<li class=\"listitem\">\n            Paul Bristow for patiently testing, and commenting on the library.\n          </li>\n<li class=\"listitem\">\n            All the folks at GMP, MPFR and libtommath, for providing the \"guts\"\n            that makes this library work.\n          </li>\n<li class=\"listitem\">\n            <a href=\"http://www-cs-faculty.stanford.edu/~uno/taocp.html\" target=\"_top\">\"The\n            Art Of Computer Programming\"</a>, Donald E. Knuth, Volume 2:\n            Seminumerical Algorithms, Third Edition (Reading, Massachusetts: Addison-Wesley,\n            1997), xiv+762pp. ISBN 0-201-89684-2\n          </li>\n</ul></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"faq.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../map.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../indexes.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/map/faq.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>FAQ</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../map.html\" title=\"Roadmap\">\n<link rel=\"prev\" href=\"todo.html\" title=\"TODO\">\n<link rel=\"next\" href=\"ack.html\" title=\"Acknowledgements\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"todo.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../map.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"ack.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.map.faq\"></a><a class=\"link\" href=\"faq.html\" title=\"FAQ\">FAQ</a>\n</h3></div></div></div>\n<div class=\"variablelist\">\n<p class=\"title\"><b></b></p>\n<dl class=\"variablelist\">\n<dt><span class=\"term\">Why do I get compiler errors when passing a <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n          to a template function?</span></dt>\n<dd><p>\n              Most likely you are actually passing an expression template type to\n              the function and template-argument-deduction deduces the \"wrong\"\n              type. Try casting the arguments involving expressions to the actual\n              number type, or as a last resort turning off expression template support\n              in the number type you are using.\n            </p></dd>\n<dt><span class=\"term\">When is expression template support a performance gain?</span></dt>\n<dd><p>\n              As a general rule, expression template support adds a small runtime\n              overhead creating and unpacking the expression templates, but greatly\n              reduces the number of temporaries created. So it's most effective in\n              improving performance when the cost of creating a temporary is high:\n              for example when creating a temporary involves a memory allocation.\n              It is least effective (and may even be a dis-optimisation) when temporaries\n              are cheap: for example if the number type is basically a thin wrapper\n              around a native arithmetic type. In addition, since the library makes\n              extensive use of thin inline wrapper functions, turning on compiler\n              optimization is essential to achieving high performance.\n            </p></dd>\n<dt><span class=\"term\">Do expression templates reorder operations?</span></dt>\n<dd><p>\n              Yes they do, sometimes quite radically so, if this is a concern then\n              they should be turned off for the number type you are using.\n            </p></dd>\n<dt><span class=\"term\">I can't construct my number type from <span class=\"emphasis\"><em>some other type</em></span>,\n          but the docs indicate that the conversion should be allowed, what's up?</span></dt>\n<dd><p>\n              Some conversions are <span class=\"emphasis\"><em>explicit</em></span>, that includes construction\n              from a string, or constructing from any type that may result in loss\n              of precision (for example constructing an integer type from a float).\n            </p></dd>\n<dt><span class=\"term\">Why do I get an exception thrown (or the program crash due to an\n          uncaught exception) when using the bitwise operators on a checked <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>?</span></dt>\n<dd><p>\n              Bitwise operations on negative values (or indeed any signed integer\n              type) are unspecified by the standard. As a result any attempt to carry\n              out a bitwise operation on a negative checked-integer will result in\n              a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">range_error</span></code> being thrown.\n            </p></dd>\n<dt><span class=\"term\">Why do I get compiler errors when trying to use the complement operator?</span></dt>\n<dd><p>\n              Use of the complement operator on signed types is problematic as the\n              result is unspecified by the standard, and is further complicated by\n              the fact that most extended precision integer types use a sign-magnitude\n              representation rather than the 2's complement one favored by most native\n              integer types. As a result the complement operator is deliberately\n              disabled for checked <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>'s.\n              Unchecked <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>'s\n              give the same valued result as a 2's complement type would, but not\n              the same bit-pattern.\n            </p></dd>\n<dt><span class=\"term\">Why can't I negate an unsigned type?</span></dt>\n<dd><p>\n              The unary negation operator is deliberately disabled for unsigned integer\n              types as its use would almost always be a programming error.\n            </p></dd>\n<dt><span class=\"term\">Why doesn't the library use proto?</span></dt>\n<dd><p>\n              A very early version of the library did use proto, but compile times\n              became too slow for the library to be usable. Since the library only\n              required a tiny fraction of what proto has to offer anyway, a lightweight\n              expression template mechanism was used instead. Compile times are still\n              too slow...\n            </p></dd>\n<dt><span class=\"term\">Why not abstract out addition/multiplication algorithms?</span></dt>\n<dd><p>\n              This was deemed not to be practical: these algorithms are intimately\n              tied to the actual data representation used.\n            </p></dd>\n<dt><span class=\"term\">How do I choose between Boost.Multiprecision <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_50</span></code>\n          and <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_50</span></code>?</span></dt>\n<dd>\n<p>\n              Unless you have a specific reason to choose <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_</span></code>,\n              then the default choice should be <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_</span></code>,\n              for example using the convenience <code class=\"computeroutput\"><span class=\"identifier\">typedefs</span></code>\n              like <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_bin_50</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_bin_100</span></code>.\n            </p>\n<p>\n              In general, both work well and give the same results and at roughly\n              the same speed with <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_50</span></code>\n              sometimes faster.\n            </p>\n<p>\n              <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_</span></code> was developed\n              first paving the way for <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_</span></code>.\n              <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_</span></code> has several\n              guard digits and is not rounded at all, using 'brute force' to get\n              the promised number of decimal digits correct, but making it difficult\n              to reason about precision and computational uncertainty, for example\n              see <span class=\"bold\"><strong>https://svn.boost.org/trac10/ticket/12133</strong></span>.\n              It also has a fast but imprecise division operator giving surprising\n              results sometimes, see <span class=\"bold\"><strong>https://svn.boost.org/trac10/ticket/11178</strong></span>.\n            </p>\n<p>\n              <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_</span></code> is correctly/exactly\n              rounded making it possible to reason about both the precision and rounding\n              of the results.\n            </p>\n</dd>\n</dl>\n</div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"todo.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../map.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"ack.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/map/hist.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>History</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../map.html\" title=\"Roadmap\">\n<link rel=\"prev\" href=\"../map.html\" title=\"Roadmap\">\n<link rel=\"next\" href=\"todo.html\" title=\"TODO\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../map.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../map.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"todo.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.map.hist\"></a><a class=\"link\" href=\"hist.html\" title=\"History\">History</a>\n</h3></div></div></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h0\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_4_1_2_boost_1_81\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_4_1_2_boost_1_81\">Multiprecision-4.1.2\n        (Boost-1.81)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Correct thread-safe static initialization of constants for <a class=\"link\" href=\"../tut/floats/cpp_bin_float.html\" title=\"cpp_bin_float\">cpp_bin_float</a>,\n            see <a href=\"https://github.com/boostorg/multiprecision/issues/497\" target=\"_top\">497</a>.\n          </li>\n<li class=\"listitem\">\n            Correct <a class=\"link\" href=\"../tut/ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>\n            <code class=\"computeroutput\"><span class=\"identifier\">import_bits</span></code> when just\n            importing the leading few bits of the value, see <a href=\"https://github.com/boostorg/multiprecision/issues/488\" target=\"_top\">488</a>.\n          </li>\n<li class=\"listitem\">\n            Remove some C++03 idioms, including use of <code class=\"computeroutput\"><span class=\"number\">0</span></code>\n            rather than <code class=\"computeroutput\"><span class=\"keyword\">nullptr</span></code>.\n          </li>\n<li class=\"listitem\">\n            Minor fixes for gcc-12 on Mingw.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h1\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_4_1_1_boost_1_80\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_4_1_1_boost_1_80\">Multiprecision-4.1.1\n        (Boost-1.80)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            <span class=\"bold\"><strong>Mark C++11 support as deprecated</strong></span>: from\n            2023 we will move to requiring C++14 as a minimum standard level. That\n            will drop support for GCC versions prior to 5 and MSVC prior to 14.1.\n          </li>\n<li class=\"listitem\">\n            Fix conflict between <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">cstdfloat</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span></code>\n            and this library.\n          </li>\n<li class=\"listitem\">\n            Clean up lots of gcc and clang warnings.\n          </li>\n<li class=\"listitem\">\n            Fix input streaming of composite types (complex, interval rational) where\n            there is a trailing delimeter in the stream and no whitespace.\n          </li>\n<li class=\"listitem\">\n            Fix <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code> integer square\n            root where the input is 1, 2 or 3.\n          </li>\n<li class=\"listitem\">\n            Add missing <code class=\"computeroutput\"><span class=\"preprocessor\">#include</span></code>\n            of <code class=\"computeroutput\"><span class=\"special\">&lt;</span><span class=\"identifier\">memory</span><span class=\"special\">&gt;</span></code> to float128.hpp.\n          </li>\n<li class=\"listitem\">\n            Correct 2-arg constructor for class <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n            to prevent ambiguity in some cases.\n          </li>\n<li class=\"listitem\">\n            Correct and make more consistent behaviour of divide-by-zero in gmp.hpp.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h2\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_4_1_0_boost_1_79\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_4_1_0_boost_1_79\">Multiprecision-4.1.0\n        (Boost-1.79)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Big update to support use of this library \"standalone\": ie\n            without the rest of Boost. A copy of Boost.Config is still required,\n            and use of Boost.Math to provide the C99 special functions is optional.\n          </li>\n<li class=\"listitem\">\n            Fix IO of floating point numbers when <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">ios_base</span><span class=\"special\">::</span><span class=\"identifier\">fixed</span></code>\n            is in effect and the precision is zero.\n          </li>\n<li class=\"listitem\">\n            Fix various spurious GCC warnings in cpp_int bitwise operators.\n          </li>\n<li class=\"listitem\">\n            Use <code class=\"computeroutput\"><span class=\"identifier\">float128_type</span></code> typedef\n            throughout to suppress GCC/clang warnings about using a non-standard\n            extension.\n          </li>\n<li class=\"listitem\">\n            Correct conversion of Intel's _Quad type to string, see <a href=\"https://github.com/boostorg/multiprecision/issues/427\" target=\"_top\">#427</a>.\n          </li>\n<li class=\"listitem\">\n            Correct usage of Intel intrinsics on GCC to avoid simply checking for\n            the header, see <a href=\"https://github.com/boostorg/multiprecision/issues/419\" target=\"_top\">#419</a>.\n          </li>\n<li class=\"listitem\">\n            Update <code class=\"computeroutput\"><span class=\"identifier\">signbit</span></code> to match\n            <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">signbit</span></code> and to return the correct sign\n            when the result is zero, <a href=\"https://github.com/boostorg/multiprecision/issues/426\" target=\"_top\">#426</a>.\n          </li>\n<li class=\"listitem\">\n            Fix over-large reductions in default sin/cos code.\n          </li>\n<li class=\"listitem\">\n            Fix some mpq rational arithmetic errors: Multiplication by zero should\n            not proceed via gcd, and multiplication by scalar should be restricted\n            to integer types (not floats).\n          </li>\n<li class=\"listitem\">\n            Support conversion to and from <code class=\"computeroutput\"><span class=\"identifier\">__int128</span></code>\n            and <code class=\"computeroutput\"><span class=\"identifier\">__float128</span></code> everywhere,\n            not just on an add-hock basis, <a href=\"https://github.com/boostorg/multiprecision/issues/237\" target=\"_top\">#237</a>.\n          </li>\n<li class=\"listitem\">\n            Avoid unnecessary copying in cpp_int's add_unsigned, <a href=\"https://github.com/boostorg/multiprecision/issues/357\" target=\"_top\">#357</a>.\n          </li>\n<li class=\"listitem\">\n            Change all bit counts to use <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span></code>\n            or <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">ptrdiff_t</span></code>, <a href=\"https://github.com/boostorg/multiprecision/issues/362\" target=\"_top\">#362</a>.\n          </li>\n<li class=\"listitem\">\n            Bring Eigen traits classes up to date and add tests.\n          </li>\n<li class=\"listitem\">\n            Fix <code class=\"computeroutput\"><span class=\"identifier\">is_byte_container</span></code>\n            to correctly handle Eigen types, <a href=\"https://github.com/boostorg/multiprecision/issues/398\" target=\"_top\">#398</a>.\n          </li>\n<li class=\"listitem\">\n            Improve cpp_int to float conversion to be insensitive to floating point\n            control flags, <a href=\"https://github.com/boostorg/multiprecision/issues/360\" target=\"_top\">#360</a>.\n          </li>\n<li class=\"listitem\">\n            Correct interop between signed-zeros and complex number types, <a href=\"https://github.com/boostorg/multiprecision/issues/396\" target=\"_top\">#396</a>.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h3\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_4_0_2_boost_1_78\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_4_0_2_boost_1_78\">Multiprecision-4.0.2\n        (Boost-1.78)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Rework rational_adaptor to remove dependency on Boost.Rational and improve\n            performance.\n          </li>\n<li class=\"listitem\">\n            Fix issue with type_traits and clang, see <a href=\"https://github.com/boostorg/multiprecision/issues/383\" target=\"_top\">#383</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed buggy Lehmer's GCD routine, see <a href=\"https://github.com/boostorg/multiprecision/issues/370\" target=\"_top\">#370</a>.\n          </li>\n<li class=\"listitem\">\n            Fix mpc_complex constructors so that lossy conversions are explicit,\n            see <a href=\"https://github.com/boostorg/multiprecision/issues/363\" target=\"_top\">#363</a>.\n          </li>\n<li class=\"listitem\">\n            Correct miscellaneous configuration issues (Intel intrinsic usage and\n            Apple clang).\n          </li>\n<li class=\"listitem\">\n            Correct some iostream operators for unsigned char types.\n          </li>\n<li class=\"listitem\">\n            Correct mpq_rational conversions to integer types, see <a href=\"https://github.com/boostorg/multiprecision/issues/342\" target=\"_top\">#342</a>.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h4\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_4_0_1_boost_1_77\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_4_0_1_boost_1_77\">Multiprecision-4.0.1\n        (Boost-1.77)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Much improved Karatsuba sqrt for cpp_int/cpp_bin_float.\n          </li>\n<li class=\"listitem\">\n            Added C++11 compatible <code class=\"computeroutput\"><span class=\"identifier\">to_string</span></code>\n            free function.\n          </li>\n<li class=\"listitem\">\n            Fixed bug in Lehmer GCD code, see <a href=\"https://github.com/boostorg/multiprecision/issues/322\" target=\"_top\">#322</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed debug_adaptor/logged_adaptor to work better with complex, rational\n            and interval types, see <a href=\"https://github.com/boostorg/multiprecision/issues/329\" target=\"_top\">#329</a>.\n          </li>\n<li class=\"listitem\">\n            Big update to mixed-variable precision arithmetic code with better options\n            and thread safety, see <a class=\"link\" href=\"../tut/variable.html\" title=\"Variable Precision Arithmetic\">docs</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed up hashing of bools and enums when creating hash values.\n          </li>\n<li class=\"listitem\">\n            Improved conversions to and from enum types.\n          </li>\n<li class=\"listitem\">\n            Restricted use of Intel intrinsics to when we really are building for\n            Intel even though the header may be available, see <a href=\"https://github.com/boostorg/multiprecision/issues/321\" target=\"_top\">#321</a>.\n          </li>\n<li class=\"listitem\">\n            Tidied up Lanczos approximation usage, in conjunction with Boost.Math\n            this improves the reliability and accuracy of many special functions.\n          </li>\n<li class=\"listitem\">\n            Fix use of libtommath deprecated features.\n          </li>\n<li class=\"listitem\">\n            Fixed missing sqrt overload, see <a href=\"https://github.com/boostorg/multiprecision/issues/319\" target=\"_top\">#319</a>.\n          </li>\n<li class=\"listitem\">\n            Added Karatsuba multiplication to cpp_dec_float to bring it into line\n            with the other types in this library.\n          </li>\n<li class=\"listitem\">\n            Added some minor optimizations to mpfr comparison operators.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h5\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_4_0_0_boost_1_76\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_4_0_0_boost_1_76\">Multiprecision-4.0.0\n        (Boost-1.76)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            <span class=\"bold\"><strong>BREAKING CHANGE</strong></span>: Massive refactoring\n            and code simpification makes C++11 an absolute requirement.\n          </li>\n<li class=\"listitem\">\n            Use BOOST_TRY/CATCH in headers so code can be use din s=exception-free\n            environments.\n          </li>\n<li class=\"listitem\">\n            Correct corner case in pow, fixes <a href=\"https://github.com/boostorg/multiprecision/issues/277\" target=\"_top\">#277</a>.\n          </li>\n<li class=\"listitem\">\n            Correct exception type thrown to match docs in lsb/msb: fixes <a href=\"https://github.com/boostorg/multiprecision/issues/257\" target=\"_top\">#257</a>.\n          </li>\n<li class=\"listitem\">\n            Allow moves and operators between related but different types (ie types\n            with the same allocator), fixes <a href=\"https://github.com/boostorg/multiprecision/issues/278\" target=\"_top\">#278</a>.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h6\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_3_2_5_boost_1_75\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_3_2_5_boost_1_75\">Multiprecision-3.2.5\n        (Boost-1.75)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Much improved gcd and modulus operations for <a class=\"link\" href=\"../tut/ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>.\n          </li>\n<li class=\"listitem\">\n            Improved addition/subtraction routines for <a class=\"link\" href=\"../tut/ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>\n            via Intel's intrinsics.\n          </li>\n<li class=\"listitem\">\n            <a class=\"link\" href=\"../tut/ints/gmp_int.html\" title=\"gmp_int\">gmp_int</a>:\n            add better conversion routines for <code class=\"computeroutput\"><span class=\"keyword\">long</span>\n            <span class=\"keyword\">long</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">__int128</span></code>.\n          </li>\n<li class=\"listitem\">\n            <a class=\"link\" href=\"../tut/floats/mpfr_float.html\" title=\"mpfr_float\">mpfr_float</a>:\n            Fix <code class=\"computeroutput\"><span class=\"identifier\">log1p</span></code> corner case.\n          </li>\n<li class=\"listitem\">\n            Improve accuracy of complex tan/tanh.\n          </li>\n<li class=\"listitem\">\n            Improve accuracy of trig functions for <a class=\"link\" href=\"../tut/floats/cpp_bin_float.html\" title=\"cpp_bin_float\">cpp_bin_float</a>.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h7\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_3_2_4_boost_1_73\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_3_2_4_boost_1_73\">Multiprecision-3.2.4\n        (Boost-1.73)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            IMPORTANT: Mark C++03 support as deprecated and due for removal in 2021.\n          </li>\n<li class=\"listitem\">\n            Big update to <a class=\"link\" href=\"../tut/ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>\n            adds faster Karatsuba and Coomba multiplication routines.\n          </li>\n<li class=\"listitem\">\n            Fix conversion of <a class=\"link\" href=\"../tut/rational/gmp_rational.html\" title=\"gmp_rational\">gmp_rational</a>\n            to <code class=\"computeroutput\"><span class=\"keyword\">long</span> <span class=\"keyword\">double</span></code>\n            and <code class=\"computeroutput\"><span class=\"identifier\">__float128</span></code>, fixes\n            <a href=\"https://github.com/boostorg/multiprecision/issues/178\" target=\"_top\">#178</a>.\n          </li>\n<li class=\"listitem\">\n            Fix up libtommath support to function with the latest libtom releases.\n          </li>\n<li class=\"listitem\">\n            Fix up some incompatibilities with the latest Intel C++ compiler.\n          </li>\n<li class=\"listitem\">\n            Fix up <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code> arithmetic\n            support for forthcoming MSVC release.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h8\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_3_2_3_boost_1_72\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_3_2_3_boost_1_72\">Multiprecision-3.2.3\n        (Boost-1.72)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \"><li class=\"listitem\">\n            Big <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code> update allows\n            <a class=\"link\" href=\"../tut/ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>\n            and <a class=\"link\" href=\"../tut/floats/float128.html\" title=\"float128\">float128</a>\n            arithmetic to be fully <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code>\n            with gcc and clang 9 or later, or any compiler supporting <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">is_constant_evaluated</span><span class=\"special\">()</span></code>.\n          </li></ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h9\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_3_1_3_boost_1_71\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_3_1_3_boost_1_71\">Multiprecision-3.1.3\n        (Boost-1.71)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Support hexfloat io-formatting for float128.\n          </li>\n<li class=\"listitem\">\n            Fix various bugs in variable precision interconversions.\n          </li>\n<li class=\"listitem\">\n            Respect uppercase for '0x' prefix outputs.\n          </li>\n<li class=\"listitem\">\n            Incorporate some unit tests from the Etherium project.\n          </li>\n<li class=\"listitem\">\n            Fix some gcc warnings.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h10\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_3_1_2_boost_1_70\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_3_1_2_boost_1_70\">Multiprecision-3.1.2\n        (Boost-1.70)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Fix various conversion issues in the traits classes, check for compatibility\n            with Boost.Optional.\n          </li>\n<li class=\"listitem\">\n            Prevent instantiation of <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code>\n            on any old type when checking for convertibility. See <a href=\"https://github.com/boostorg/multiprecision/issues/98\" target=\"_top\">#98</a>.\n          </li>\n<li class=\"listitem\">\n            Update variable precision code to accound for arbitrary precision integers.\n            See <a href=\"https://github.com/boostorg/multiprecision/issues/103\" target=\"_top\">#103</a>.\n          </li>\n<li class=\"listitem\">\n            Add support for XML serialization archives.\n          </li>\n<li class=\"listitem\">\n            Fix bug in fixed precision iostream formatting in <code class=\"computeroutput\"><span class=\"identifier\">mpf_float</span></code>\n            and <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float</span></code>. See\n            <a href=\"https://github.com/boostorg/multiprecision/issues/113\" target=\"_top\">#113</a>.\n          </li>\n<li class=\"listitem\">\n            Add more overloads for special functions which are better handled natively\n            by MPFR.\n          </li>\n<li class=\"listitem\">\n            Fixed bug in generic <code class=\"computeroutput\"><span class=\"identifier\">exp</span></code>\n            implementation which could cause invariant failure.\n          </li>\n<li class=\"listitem\">\n            Fixed generic conversion from float to integer to avoid undefined behaviour.\n            See <a href=\"https://github.com/boostorg/multiprecision/issues/110\" target=\"_top\">#110</a>.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h11\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_3_1_1_boost_1_69\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_3_1_1_boost_1_69\">Multiprecision-3.1.1\n        (Boost-1.69)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Big update to better support variable precision types so that the precision\n            of the result is always the largest of all the arguments.\n          </li>\n<li class=\"listitem\">\n            Add support for allocators that are <code class=\"computeroutput\"><span class=\"identifier\">final</span></code>\n            in <a class=\"link\" href=\"../tut/ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>.\n          </li>\n<li class=\"listitem\">\n            Removed use of deprecated Boost.Endian in favour of Predef.\n          </li>\n<li class=\"listitem\">\n            Add support for <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">string_view</span></code>.\n          </li>\n<li class=\"listitem\">\n            Fixed minor bug in constant initialization. See <a href=\"https://github.com/boostorg/multiprecision/issues/67\" target=\"_top\">#67</a>.\n          </li>\n<li class=\"listitem\">\n            Make assignment of non-finite value to <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>\n            a runtime errors. See <a href=\"https://github.com/boostorg/multiprecision/issues/58\" target=\"_top\">#58</a>.\n          </li>\n<li class=\"listitem\">\n            Added typedefs for <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float_oct</span></code>\n            and <code class=\"computeroutput\"><span class=\"identifier\">cpp_complex_oct</span></code>.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h12\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_3_1_0_boost_1_68\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_3_1_0_boost_1_68\">Multiprecision-3.1.0\n        (Boost-1.68)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Support added for complex multiprecision numbers.\n          </li>\n<li class=\"listitem\">\n            Changed conversion to unsigned integer types to be truncating to match\n            standard defined behaviour.\n          </li>\n<li class=\"listitem\">\n            Correct bug in MPFR string formatting.\n          </li>\n<li class=\"listitem\">\n            Fix undefined behaviour in cpp_dec_float conversion from long long.\n          </li>\n<li class=\"listitem\">\n            Add support for Eigen interoperability.\n          </li>\n<li class=\"listitem\">\n            float128.hpp: Fix Intel on Windows build.\n          </li>\n<li class=\"listitem\">\n            Fix type used in temporaries when expanding expression templates containing\n            mixed expressions.\n          </li>\n<li class=\"listitem\">\n            Fix infinite loop in gmp_float to fixed-point string conversion.\n          </li>\n<li class=\"listitem\">\n            Update the expression templates to issue static_asserts with better error\n            messages when you try and do something unsupported.\n          </li>\n<li class=\"listitem\">\n            Fix bug in cpp_int where incrementing to zero doesn't set the sign correctly.\n          </li>\n<li class=\"listitem\">\n            Remove erroneous use of std::move, and rely on NVRO instead.\n          </li>\n<li class=\"listitem\">\n            Fix up support for changes to MPIR-3.0.\n          </li>\n<li class=\"listitem\">\n            Fix various conversion errors in cpp_bin_float when the exponent type\n            is a <code class=\"computeroutput\"><span class=\"keyword\">long</span> <span class=\"keyword\">long</span></code>,\n            or else we're converting to an integer that is wider than we are.\n          </li>\n<li class=\"listitem\">\n            Fix compatibility issue with GCC-8 caused by the introduction of <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">byte</span></code>.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h13\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_3_0_0_boost_1_67\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_3_0_0_boost_1_67\">Multiprecision-3.0.0\n        (Boost-1.67)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            <span class=\"bold\"><strong>Breaking Change:</strong></span> When converting a multiprecision\n            integer to a narrower type, if the value is too large (or negative) to\n            fit in the smaller type, then the result is either the maximum (or minimum)\n            value of the target type. This was always the intended behaviour, but\n            was somewhat haphazardly enforced before. If you really do want just\n            the low order N bits of a value, then you will need to mask these out\n            prior to the case, for example: <code class=\"computeroutput\"><span class=\"keyword\">static_cast</span><span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span><span class=\"special\">&gt;(~</span><span class=\"keyword\">static_cast</span><span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span><span class=\"special\">&gt;(</span><span class=\"number\">0</span><span class=\"special\">)</span> <span class=\"special\">&amp;</span> <span class=\"identifier\">my_value</span><span class=\"special\">)</span></code>.\n            Note that technically (to avoid undefined behaviour) you should do the\n            same thing with <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n            (built-in)</a> integer types too. See <a href=\"https://svn.boost.org/trac/boost/ticket/13109\" target=\"_top\">#13109</a>.\n          </li>\n<li class=\"listitem\">\n            Fix bug in conversion of decimal to rational types (zero needs special\n            handling), see <a href=\"https://svn.boost.org/trac/boost/ticket/13148\" target=\"_top\">#13148</a>.\n          </li>\n<li class=\"listitem\">\n            Fix conversion from cpp_bin_float to a wider <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n            (built-in)</a> integer type, see <a href=\"https://svn.boost.org/trac/boost/ticket/13301\" target=\"_top\">#13301</a>.\n          </li>\n<li class=\"listitem\">\n            Improve performance heurists used in cpp_bin_float exp function.\n          </li>\n<li class=\"listitem\">\n            Fix bug in floor/ceil and cpp_bin_float when the exponent type is wider\n            than an int, see <a href=\"https://svn.boost.org/trac/boost/ticket/13264\" target=\"_top\">#13264</a>.\n          </li>\n<li class=\"listitem\">\n            Disable explicit conversion operator when the target type is already\n            constructible from this type, see <a href=\"https://github.com/boostorg/multiprecision/issues/30\" target=\"_top\">#30</a>.\n          </li>\n<li class=\"listitem\">\n            Fix support for changes new to MPIR-3.0, see <a href=\"https://svn.boost.org/trac/boost/ticket/13124\" target=\"_top\">#13124</a>.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h14\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_2_3_2_boost_1_65\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_2_3_2_boost_1_65\">Multiprecision-2.3.2\n        (Boost-1.65)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Updated expression templates to store arithmetic literals directly in\n            the expression template to prevent dangling references, see <a href=\"https://github.com/boostorg/multiprecision/issues/19\" target=\"_top\">#19</a>.\n          </li>\n<li class=\"listitem\">\n            Fix various issues with huge values and overflow in the trig, pow and\n            exp functions, see <a href=\"https://github.com/boostorg/multiprecision/issues/24\" target=\"_top\">#24</a>.\n          </li>\n<li class=\"listitem\">\n            Fix error handling of checked cpp_int multiply that could cause some\n            overflows to be missed.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h15\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_2_3_1_boost_1_64\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_2_3_1_boost_1_64\">Multiprecision-2.3.1\n        (Boost-1.64)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            In <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span></code> prevent\n            double rounding when converting to a denormalized float. See <a href=\"https://svn.boost.org/trac/boost/ticket/12527\" target=\"_top\">#12527</a>.\n          </li>\n<li class=\"listitem\">\n            Fix bug in integer sqrt for very small integers. See <a href=\"https://svn.boost.org/trac/boost/ticket/12559\" target=\"_top\">#12559</a>.\n          </li>\n<li class=\"listitem\">\n            Fix conversion to signed-zero in <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span></code>.\n          </li>\n<li class=\"listitem\">\n            Change <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span></code>\n            rounding code to round at arbitrary location so we can use it for conversions,\n            see <a href=\"https://svn.boost.org/trac/boost/ticket/12527\" target=\"_top\">#12527</a>.\n          </li>\n<li class=\"listitem\">\n            Improve performance of 128-bit bit-scan operations.\n          </li>\n<li class=\"listitem\">\n            Fix subtraction of very small quantities in <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span></code>.\n            See: <a href=\"https://svn.boost.org/trac/boost/ticket/12580\" target=\"_top\">#12580</a>.\n          </li>\n<li class=\"listitem\">\n            Bring error handling into line with C99 Annex F. See <a href=\"https://svn.boost.org/trac/boost/ticket/12581\" target=\"_top\">#12581</a>.\n          </li>\n<li class=\"listitem\">\n            Fix bitwise export of trivial <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>'s,\n            see <a href=\"https://svn.boost.org/trac/boost/ticket/12627\" target=\"_top\">#12627</a>.\n          </li>\n<li class=\"listitem\">\n            Fix <code class=\"computeroutput\"><span class=\"identifier\">ilogb</span></code> (and code that\n            uses it) to consistently return the smallest value of the exponent type\n            when the argument is zero, see <a href=\"https://svn.boost.org/trac/boost/ticket/12625\" target=\"_top\">#12625</a>.\n          </li>\n<li class=\"listitem\">\n            Allow conversion from <code class=\"computeroutput\"><a class=\"link\" href=\"../tut/floats/float128.html\" title=\"float128\">float128</a></code>\n            to <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span></code>.\n          </li>\n<li class=\"listitem\">\n            Fix bug in left shift of <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>\n            which would result in bit-loss, see <a href=\"https://svn.boost.org/trac/boost/ticket/12790\" target=\"_top\">#12790</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed bugs in bounded but variable precision <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>'s\n            caused by over-aggressive constexpr optimization, see <a href=\"https://svn.boost.org/trac/boost/ticket/12798\" target=\"_top\">#12798</a>.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h16\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_2_3_0_boost_1_63\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_2_3_0_boost_1_63\">Multiprecision-2.3.0\n        (Boost-1.63)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Added support for all the C99 math functions.\n          </li>\n<li class=\"listitem\">\n            Extended generic-interconversions to handle narrowing cases as well,\n            changed convert_to member function and hence explicit conversion operators\n            to use the same conversion code as the explicit constructors.\n          </li>\n<li class=\"listitem\">\n            Fix IO stream parsing error, see <a href=\"https://svn.boost.org/trac/boost/ticket/12488\" target=\"_top\">#12488</a>.\n          </li>\n<li class=\"listitem\">\n            Make default constructed floating point types all zero for consistency,\n            see <a href=\"https://svn.boost.org/trac/boost/ticket/12500\" target=\"_top\">#12500</a>.\n          </li>\n<li class=\"listitem\">\n            Fix conversion of cpp_bin_float to float/double/long double when the\n            exponent value would overflow an int, see <a href=\"https://svn.boost.org/trac/boost/ticket/12512\" target=\"_top\">#12512</a>.\n          </li>\n<li class=\"listitem\">\n            Fix cpp_bin_float subtractions that yield signed-zeros, see <a href=\"https://svn.boost.org/trac/boost/ticket/12524\" target=\"_top\">#12524</a>.\n          </li>\n<li class=\"listitem\">\n            Fix ceil/trunc/round applied to cpp_bin_float and yielding a signed zero,\n            see <a href=\"https://svn.boost.org/trac/boost/ticket/12525\" target=\"_top\">#12525</a>.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h17\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_2_2_8_boost_1_62\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_2_2_8_boost_1_62\">Multiprecision-2.2.8\n        (Boost-1.62)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Added support for hashing via <code class=\"computeroutput\"><span class=\"identifier\">Boost</span><span class=\"special\">.</span><span class=\"identifier\">Hash</span></code>\n            or <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">hash</span></code>.\n          </li>\n<li class=\"listitem\">\n            Fixed some arithmetic operations in cpp_bin_float and cpp_dec_float that\n            should generate a NaN, see <a href=\"https://svn.boost.org/trac/boost/ticket/12157\" target=\"_top\">#12157</a>.\n          </li>\n<li class=\"listitem\">\n            Prevent inadvertant instantiation of variable-precision <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float_backend</span></code> with fixed allocation.\n          </li>\n<li class=\"listitem\">\n            Fixed division over/underflow in cpp_bin_float, see <a href=\"https://svn.boost.org/trac/boost/ticket/12167\" target=\"_top\">#12167</a>.\n          </li>\n<li class=\"listitem\">\n            Added support for signed-zeros throughout the library, including support\n            for <code class=\"computeroutput\"><span class=\"identifier\">signbit</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">copysign</span></code>, mpfr, float128, and cpp_bin_float\n            types should now respect signed-zeros correctly.\n          </li>\n<li class=\"listitem\">\n            Fixed bug in conversion of cpp_bin_float infinities to double etc, see\n            <a href=\"https://svn.boost.org/trac/boost/ticket/12196\" target=\"_top\">#12196</a>.\n          </li>\n<li class=\"listitem\">\n            Fix add and subtract of cpp_bin_float when the exponents would overflow.,\n            see <a href=\"https://svn.boost.org/trac/boost/ticket/12198\" target=\"_top\">#12198</a>.\n          </li>\n<li class=\"listitem\">\n            Improve variable-precision support in mpfr and mpf backends, allow these\n            types to be used with Boost.Math.\n          </li>\n<li class=\"listitem\">\n            Fixed bug in subtraction of signed infinities in cpp_bin_float, see\n            <a href=\"https://svn.boost.org/trac/boost/ticket/12209\" target=\"_top\">#12209</a>.\n          </li>\n<li class=\"listitem\">\n            Fix result of sqrt(infinity) in cpp_bin_float (result should be infinity),\n            see <a href=\"https://svn.boost.org/trac/boost/ticket/12227\" target=\"_top\">#12227</a>.\n          </li>\n<li class=\"listitem\">\n            Added workaround in gmp.hpp for recent MPIR releases which are not quite\n            source-compatible with GMP on Windows x64.\n          </li>\n<li class=\"listitem\">\n            Allow <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code> code to\n            be used with /RTCc with MSVC.\n          </li>\n<li class=\"listitem\">\n            Fix conversion of <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>\n            to signed integer when the result is INT_MIN, see <a href=\"https://svn.boost.org/trac/boost/ticket/12343\" target=\"_top\">#12343</a>.\n          </li>\n<li class=\"listitem\">\n            Update uBlas support to match latest uBlas code.\n          </li>\n<li class=\"listitem\">\n            Fix some errors present when building on big-endian machines (not all\n            <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code> constructors\n            are available on non-little-endian machines).\n          </li>\n<li class=\"listitem\">\n            Fix fencepost error in rational to float conversion routines, see <a href=\"https://svn.boost.org/trac/boost/ticket/12327\" target=\"_top\">#12327</a>.\n          </li>\n<li class=\"listitem\">\n            Fix some Oracle C++ compiler compatibility issues.\n          </li>\n<li class=\"listitem\">\n            Add modf support to complete C90 compatibility.\n          </li>\n<li class=\"listitem\">\n            Fix self assignment bug in expression template code for expressions such\n            as <code class=\"computeroutput\"><span class=\"identifier\">a</span> <span class=\"special\">=</span>\n            <span class=\"identifier\">a</span> <span class=\"special\">*</span>\n            <span class=\"identifier\">a</span> <span class=\"special\">*</span>\n            <span class=\"identifier\">a</span></code>, see <a href=\"https://svn.boost.org/trac/boost/ticket/12408\" target=\"_top\">#12408</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed some compiler errors that occur when converting from <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code> to <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span></code>.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h18\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_2_2_7_boost_1_61\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_2_2_7_boost_1_61\">Multiprecision-2.2.7\n        (Boost-1.61)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Fixed bug in stream input for integer types, see <a href=\"https://svn.boost.org/trac/boost/ticket/11857\" target=\"_top\">#11857</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed some ambiguous conversions involving expression templates see\n            <a href=\"https://svn.boost.org/trac/boost/ticket/11922\" target=\"_top\">#11922</a>.\n          </li>\n<li class=\"listitem\">\n            Add expression template aware min/max overloads see <a href=\"https://svn.boost.org/trac/boost/ticket/11149\" target=\"_top\">#11149</a>.\n          </li>\n<li class=\"listitem\">\n            Fix bug in right shifting negative small integers in cpp_int see <a href=\"https://svn.boost.org/trac/boost/ticket/11999\" target=\"_top\">#11999</a>.\n          </li>\n<li class=\"listitem\">\n            Use memmove for bitshifts in cpp_int when possible see <a href=\"https://svn.boost.org/trac/boost/ticket/9233\" target=\"_top\">#9233</a>.\n          </li>\n<li class=\"listitem\">\n            Use memcpy for data import into cpp_int where possible, see <a href=\"https://svn.boost.org/trac/boost/ticket/9235\" target=\"_top\">#9235</a>.\n          </li>\n<li class=\"listitem\">\n            Changed <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">.</span><span class=\"identifier\">convert_to</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;()</span></code> to a function template rather than\n            proceding via <code class=\"computeroutput\"><span class=\"keyword\">long</span> <span class=\"keyword\">double</span></code>\n            to avoid double-rounding bug, see <a href=\"https://svn.boost.org/trac/boost/ticket/12039\" target=\"_top\">#12039</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed conversions from NaNs and Infinities, see <a href=\"https://svn.boost.org/trac/boost/ticket/12112\" target=\"_top\">#12112</a>.\n          </li>\n<li class=\"listitem\">\n            Enabled better support for Clang on Windows.\n          </li>\n<li class=\"listitem\">\n            Fixed handling of NaNs and Infinities in basic arithmetic for cpp_dec_float\n            and cpp_bin_float, see <a href=\"https://svn.boost.org/trac/boost/ticket/12090\" target=\"_top\">#12090</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed fencepost error in cpp_bin_float subtraction.\n          </li>\n<li class=\"listitem\">\n            Fixed double-rounding in conversion to float routines for cpp_bin_float,\n            see <a href=\"https://svn.boost.org/trac/boost/ticket/12039\" target=\"_top\">#12039</a>.\n          </li>\n<li class=\"listitem\">\n            Make float128 denorm aware, see <a href=\"https://svn.boost.org/trac/boost/ticket/12075\" target=\"_top\">#12075</a>.\n          </li>\n<li class=\"listitem\">\n            Allow the library and tests to be used without exception handling support,\n            see <a href=\"https://svn.boost.org/trac/boost/ticket/12070\" target=\"_top\">#12070</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed buggy comparison operator overloads for boost::rational.\n          </li>\n<li class=\"listitem\">\n            Added some workarounds for Oracle C++.\n          </li>\n<li class=\"listitem\">\n            Fixed some missing typecasts for cases where cpp_int's limb_type is wider\n            than unsigned.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h19\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_2_2_6_boost_1_60\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_2_2_6_boost_1_60\">Multiprecision-2.2.6\n        (Boost-1.60)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Fixed result of Miller Rabin primality test for value 2, see <a href=\"https://svn.boost.org/trac/boost/ticket/11495\" target=\"_top\">#11495</a>.\n          </li>\n<li class=\"listitem\">\n            Improved initialization of cpp_int from very large strings of hex or\n            octal digits, see <a href=\"https://svn.boost.org/trac/boost/ticket/11590\" target=\"_top\">#11590</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed fmod behaviour for negative divisors, see <a href=\"https://svn.boost.org/trac/boost/ticket/11641\" target=\"_top\">#11641</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed infinite division loop in cpp_int special case, see <a href=\"https://svn.boost.org/trac/boost/ticket/11648\" target=\"_top\">#11648</a>.\n          </li>\n<li class=\"listitem\">\n            Patched missing return statement in <a href=\"https://svn.boost.org/trac/boost/ticket/11762\" target=\"_top\">#11762</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed mixed mode arithmetic compiler error in <a href=\"https://svn.boost.org/trac/boost/ticket/11764\" target=\"_top\">#11764</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed over-aggressive use of noexcept in <a href=\"https://svn.boost.org/trac/boost/ticket/11826\" target=\"_top\">#11826</a>.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h20\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_2_2_5_boost_1_59\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_2_2_5_boost_1_59\">Multiprecision-2.2.5\n        (Boost-1.59)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Depricated boost/multiprecision/random.hpp as it's no longer needed,\n            updated random examples to match.\n          </li>\n<li class=\"listitem\">\n            Fixed a bug in <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>\n            right shift operator when shifting negative values - semantics now gives\n            the same values as shifting 2's compliment integers, though not the same\n            bit pattern.\n          </li>\n<li class=\"listitem\">\n            Fixed support for GCC-4.6.4 in C++0x mode by disabling conditional noexcept\n            suppoprt for that compiler see <a href=\"https://svn.boost.org/trac/boost/ticket/11402\" target=\"_top\">#11402</a>.\n          </li>\n<li class=\"listitem\">\n            Suppressed numerous compiler warnings.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h21\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_2_2_4_boost_1_58\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_2_2_4_boost_1_58\">Multiprecision-2.2.4\n        (Boost-1.58)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Changed <code class=\"computeroutput\"><span class=\"identifier\">frexp</span></code> to always\n            be non-expression template generating, see: <a href=\"https://svn.boost.org/trac/boost/ticket/10993\" target=\"_top\">10993</a>.\n          </li>\n<li class=\"listitem\">\n            Improved support of cpp_dec_float on Cygwin and other platforms with\n            missing long double support, see <a href=\"https://svn.boost.org/trac/boost/ticket/10924\" target=\"_top\">10924</a>.\n          </li>\n<li class=\"listitem\">\n            Improved noexcept support and added some more tests, see <a href=\"https://svn.boost.org/trac/boost/ticket/10990\" target=\"_top\">10990</a>.\n          </li>\n<li class=\"listitem\">\n            Various workarounds applied for Intel-15.0 and Solaris-12.4 compilers.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h22\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_2_2_3_boost_1_57\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_2_2_3_boost_1_57\">Multiprecision-2.2.3\n        (Boost-1.57)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Changed rational to float conversions to exactly round to nearest, see\n            <a href=\"https://svn.boost.org/trac/boost/ticket/10085\" target=\"_top\">10085</a>.\n          </li>\n<li class=\"listitem\">\n            Added improved generic float to rational conversions.\n          </li>\n<li class=\"listitem\">\n            Fixed rare bug in exponent function for <a class=\"link\" href=\"../tut/floats/cpp_bin_float.html\" title=\"cpp_bin_float\">cpp_bin_float</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed various minor documentation issues.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h23\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_2_2_2_boost_1_56\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_2_2_2_boost_1_56\">Multiprecision-2.2.2\n        (Boost-1.56)</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Change floating-point to rational conversions to be implicit, see <a href=\"https://svn.boost.org/trac/boost/ticket/10082\" target=\"_top\">10082</a>.\n          </li>\n<li class=\"listitem\">\n            Fix definition of checked_cpp_rational typedef.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h24\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_2_2_1\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_2_2_1\">Multiprecision-2.2.1</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \"><li class=\"listitem\">\n            Fix bug in assignment from string in cpp_int, see <a href=\"https://svn.boost.org/trac/boost/ticket/9936\" target=\"_top\">9936</a>.\n          </li></ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h25\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.multiprecision_2_2_0\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.multiprecision_2_2_0\">Multiprecision-2.2.0</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Moved to Boost.Multiprecision specific version number - we have one breaking\n            change in Boost-1.54 which makes this major version 2, plus two releases\n            with new features since then.\n          </li>\n<li class=\"listitem\">\n            Added new <a class=\"link\" href=\"../tut/floats/cpp_bin_float.html\" title=\"cpp_bin_float\">cpp_bin_float</a>\n            backend for binary floating-point.\n          </li>\n<li class=\"listitem\">\n            Added MSVC-specific #include for compiler intrinsics, see <a href=\"https://svn.boost.org/trac/boost/ticket/9336\" target=\"_top\">9336</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed various typos in docs, see <a href=\"https://svn.boost.org/trac/boost/ticket/9432\" target=\"_top\">9432</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed <a class=\"link\" href=\"../tut/rational/gmp_rational.html\" title=\"gmp_rational\">gmp_rational</a>\n            to allow move-copy from an already copied-from object, see <a href=\"https://svn.boost.org/trac/boost/ticket/9497\" target=\"_top\">9497</a>.\n          </li>\n<li class=\"listitem\">\n            Added list of values for numeric_limits.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h26\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.boost_1_55\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.boost_1_55\">Boost-1.55</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Added support for Boost.Serialization.\n          </li>\n<li class=\"listitem\">\n            Suppressed some GCC warnings. See <a href=\"https://svn.boost.org/trac/boost/ticket/8872\" target=\"_top\">8872</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed bug in pow for large integer arguments. See <a href=\"https://svn.boost.org/trac/boost/ticket/8809\" target=\"_top\">8809</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed bug in pow for calculation of 0<sup>N</sup>. See <a href=\"https://svn.boost.org/trac/boost/ticket/8798\" target=\"_top\">8798</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed bug in fixed precision cpp_int IO code that causes conversion to\n            string to fail when the bit count is very small (less than CHAR_BIT).\n            See <a href=\"https://svn.boost.org/trac/boost/ticket/8745\" target=\"_top\">8745</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed bug in cpp_int that causes left shift to fail when a fixed precision\n            type would overflow. See <a href=\"https://svn.boost.org/trac/boost/ticket/8741\" target=\"_top\">8741</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed some cosmetic warnings from cpp_int. See <a href=\"https://svn.boost.org/trac/boost/ticket/8748\" target=\"_top\">8748</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed calls to functions which are required to be macros in C99. See\n            <a href=\"https://svn.boost.org/trac/boost/ticket/8732\" target=\"_top\">8732</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed bug that causes construction from INT_MIN, LONG_MIN etc to fail\n            in cpp_int. See <a href=\"https://svn.boost.org/trac/boost/ticket/8711\" target=\"_top\">8711</a>.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h27\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.1_54\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.1_54\">1.54</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            <span class=\"bold\"><strong>Breaking change</strong></span> renamed <code class=\"computeroutput\"><span class=\"identifier\">rational_adapter</span></code> to <code class=\"computeroutput\"><span class=\"identifier\">rational_adaptor</span></code>.\n          </li>\n<li class=\"listitem\">\n            Add support for <a href=\"http://perso.ens-lyon.fr/nathalie.revol/software.html\" target=\"_top\">MPFI</a>.\n          </li>\n<li class=\"listitem\">\n            Add logged_adaptor.\n          </li>\n<li class=\"listitem\">\n            Add support for 128-bit floats via GCC's <code class=\"computeroutput\"><span class=\"identifier\">__float128</span></code>\n            or Intel's <code class=\"computeroutput\"><span class=\"identifier\">_Quad</span></code> data\n            types.\n          </li>\n<li class=\"listitem\">\n            Add support for user-defined literals in cpp_int, improve <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code> support.\n          </li>\n<li class=\"listitem\">\n            Fixed bug in integer division of <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>\n            that results in incorrect sign of <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>\n            when both arguments are small enough to fit in a <code class=\"computeroutput\"><span class=\"identifier\">double_limb_type</span></code>.\n            See <a href=\"https://svn.boost.org/trac/boost/ticket/8126\" target=\"_top\">8126</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed bug in subtraction of a single limb in <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>\n            that results in incorrect value when the result should have a 0 in the\n            last limb: <a href=\"https://svn.boost.org/trac/boost/ticket/8133\" target=\"_top\">8133</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed bug in <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>\n            where division of 0 by something doesn't get zero in the result: <a href=\"https://svn.boost.org/trac/boost/ticket/8160\" target=\"_top\">8160</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed bug in some transcendental functions that caused incorrect return\n            values when variables are reused, for example with <code class=\"computeroutput\"><span class=\"identifier\">a</span>\n            <span class=\"special\">=</span> <span class=\"identifier\">pow</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">b</span><span class=\"special\">)</span></code>. See <a href=\"https://svn.boost.org/trac/boost/ticket/8326\" target=\"_top\">8326</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed some assignment operations in the mpfr and gmp backends to be safe\n            if the target has been moved from: <a href=\"https://svn.boost.org/trac/boost/ticket/8326\" target=\"_top\">8667</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed bug in <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>\n            that gives incorrect answer for 0%N for large N: <a href=\"https://svn.boost.org/trac/boost/ticket/8670\" target=\"_top\">8670</a>.\n          </li>\n<li class=\"listitem\">\n            Fixed set_precision in mpfr backend so it doesn't trample over an existing\n            value: <a href=\"https://svn.boost.org/trac/boost/ticket/8692\" target=\"_top\">8692</a>.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h28\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.1_53\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.1_53\">1.53</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            First Release.\n          </li>\n<li class=\"listitem\">\n            Fix bug in <a href=\"https://svn.boost.org/trac/boost/ticket/7878\" target=\"_top\">cpp_int\n            division</a>.\n          </li>\n<li class=\"listitem\">\n            Fix issue <a href=\"https://svn.boost.org/trac/boost/ticket/7806\" target=\"_top\">#7806</a>.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h29\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.post_review_changes\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.post_review_changes\">Post\n        review changes</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Non-expression template operators further optimised with rvalue reference\n            support.\n          </li>\n<li class=\"listitem\">\n            Many functions made <code class=\"computeroutput\"><span class=\"identifier\">constexp</span></code>.\n          </li>\n<li class=\"listitem\">\n            Differentiate between explicit and implicit conversions in the number\n            constructor.\n          </li>\n<li class=\"listitem\">\n            Removed \"mp_\" prefix from types.\n          </li>\n<li class=\"listitem\">\n            Allowed mixed precision arithmetic.\n          </li>\n<li class=\"listitem\">\n            Changed ExpressionTemplates parameter to class <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n            to use enumerated values rather than true/false.\n          </li>\n<li class=\"listitem\">\n            Changed ExpressionTemplate parameter default value to use a traits class\n            so that the default value depends on the backend used.\n          </li>\n<li class=\"listitem\">\n            Added support for fused-multiply-add/subtract with GMP support.\n          </li>\n<li class=\"listitem\">\n            Tweaked expression template unpacking to use fewer temporaries when the\n            LHS also appears in the RHS.\n          </li>\n<li class=\"listitem\">\n            Refactored <code class=\"computeroutput\"><span class=\"identifier\">cpp_int_backend</span></code>\n            based on review comments with new template parameter structure.\n          </li>\n<li class=\"listitem\">\n            Added additional template parameter to <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float_backend</span></code>\n            to allow stack-based allocation.\n          </li>\n<li class=\"listitem\">\n            Added section on mixed precision arithmetic, and added support for operations\n            yielding a higher precision result than either of the arguments.\n          </li>\n<li class=\"listitem\">\n            Added overloads of integer-specific functions for <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n            (built-in)</a> integer types.\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.hist.h30\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.hist.pre_review_history\"></a></span><a class=\"link\" href=\"hist.html#boost_multiprecision.map.hist.pre_review_history\">Pre-review\n        history</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            2011-2012, John Maddock adds an expression template enabled front-end\n            to Christopher's code, and adds support for other backends.\n          </li>\n<li class=\"listitem\">\n            2011, Christopher Kormanyos publishes the decimal floating-point code\n            under the Boost Software Licence. The code is published as: <a href=\"http://doi.acm.org/10.1145/1916461.1916469\" target=\"_top\">\"Algorithm\n            910: A Portable C++ Multiple-Precision System for Special-Function Calculations\"</a>,\n            in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011.\n          </li>\n<li class=\"listitem\">\n            2002-2011, Christopher Kormanyos develops the all C++ decimal arithmetic\n            floating-point code.\n          </li>\n</ul></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../map.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../map.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"todo.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/map/todo.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>TODO</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../map.html\" title=\"Roadmap\">\n<link rel=\"prev\" href=\"hist.html\" title=\"History\">\n<link rel=\"next\" href=\"faq.html\" title=\"FAQ\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"hist.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../map.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"faq.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.map.todo\"></a><a class=\"link\" href=\"todo.html\" title=\"TODO\">TODO</a>\n</h3></div></div></div>\n<p>\n        More a list of what <span class=\"emphasis\"><em>could</em></span> be done, rather than what\n        <span class=\"emphasis\"><em>should</em></span> be done (which may be a much smaller list!).\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Add back-end support for libdecNumber.\n          </li>\n<li class=\"listitem\">\n            Add an adaptor back-end for complex number types.\n          </li>\n<li class=\"listitem\">\n            Add better multiplication routines (Karatsuba, FFT etc) to cpp_int_backend.\n          </li>\n<li class=\"listitem\">\n            Add assembly level routines to cpp_int_backend.\n          </li>\n<li class=\"listitem\">\n            Can ring types (exact floating-point types) be supported? The answer\n            should be yes, but someone needs to write it, the hard part is IO and\n            binary-decimal conversion.\n          </li>\n<li class=\"listitem\">\n            Should there be a choice of rounding mode (probably MPFR specific)?\n          </li>\n<li class=\"listitem\">\n            We can reuse temporaries in multiple subtrees (temporary caching).\n          </li>\n<li class=\"listitem\">\n            cpp_dec_float should round to nearest.\n          </li>\n<li class=\"listitem\">\n            A 2's complement fixed precision int that uses exactly N bits and no\n            more.\n          </li>\n</ul></div>\n<p>\n        Things requested in review:\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            The performances of mp_number&lt;a_trivial_adaptor&lt;float&gt;, false&gt;respect\n            to float and mp_number&lt;a_trivial_adaptor&lt;int&gt;, false&gt; and\n            int should be given to show the cost of using the generic interface (Mostly\n            done, just need to update docs to the latest results).\n          </li>\n<li class=\"listitem\">\n            Should we provide min/max overloads for expression templates? (Not done\n            - we can't overload functions declared in the std namespace :-( ).\n          </li>\n<li class=\"listitem\">\n            The rounding applied when converting must be documented (Done).\n          </li>\n<li class=\"listitem\">\n            Document why we don't abstract out addition/multiplication algorithms\n            etc. (done - FAQ)\n          </li>\n<li class=\"listitem\">\n            Document why we don't use proto (compile times) (Done).\n          </li>\n<li class=\"listitem\">\n            We can reuse temporaries in multiple subtrees (temporary caching) Moved\n            to TODO list.\n          </li>\n<li class=\"listitem\">\n            Emphasise in the docs that ET's may reorder operations (done 2012/10/31).\n          </li>\n<li class=\"listitem\">\n            Document what happens to small fixed precision cpp_int's (done 2012/10/31).\n          </li>\n<li class=\"listitem\">\n            The use of bool in template parameters could be improved by the use of\n            an enum class which will be more explicit. E.g <code class=\"computeroutput\"><span class=\"keyword\">enum</span>\n            <span class=\"keyword\">class</span> <span class=\"identifier\">expression_template</span>\n            <span class=\"special\">{</span><span class=\"identifier\">disabled</span><span class=\"special\">,</span> <span class=\"identifier\">enabled</span><span class=\"special\">};</span> <span class=\"keyword\">enum</span> <span class=\"keyword\">class</span> <span class=\"identifier\">sign</span>\n            <span class=\"special\">{</span><span class=\"keyword\">unsigned</span><span class=\"special\">,</span> <span class=\"keyword\">signed</span><span class=\"special\">};</span></code> (Partly done 2012/09/15, done 2012/10/31).\n          </li>\n<li class=\"listitem\">\n            Each back-end should document the requirements it satisfies (not currently\n            scheduled for inclusion: it's deliberately an implementation detail,\n            and \"optional\" requirements are optimisations which can't be\n            detected by the user). Not done: this is an implementation detail, the\n            exact list of requirements satisfied is purely an optimization, not something\n            the user can detect.\n          </li>\n<li class=\"listitem\">\n            A backend for an overflow aware integers (done 2012/10/31).\n          </li>\n<li class=\"listitem\">\n            IIUC convert_to is used to emulate in c++98 compilers C++11 explicit\n            conversions. Could the explicit conversion operator be added on compilers\n            supporting it? (Done 2012/09/15).\n          </li>\n<li class=\"listitem\">\n            The front-end should make the differences between implicit and explicit\n            construction (Done 2012/09/15).\n          </li>\n<li class=\"listitem\">\n            The tutorial should add more examples concerning implicit or explicit\n            conversions. (Done 2012/09/15).\n          </li>\n<li class=\"listitem\">\n            The documentation must explain how move semantics helps in this domain\n            and what the backend needs to do to profit from this optimization. (Done\n            2012/09/15).\n          </li>\n<li class=\"listitem\">\n            The documentation should contain Throws specification on the mp_number\n            and backend requirements operations. (Done 2012/09/15).\n          </li>\n<li class=\"listitem\">\n            The library interface should use the noexcept (noexcept, ...) facilities\n            (Done 2012/09/15).\n          </li>\n<li class=\"listitem\">\n            It is unfortunate that the generic mp_number front end can not make use\n            constexpr as not all the backends can ensure this (done - we can go quite\n            a way).\n          </li>\n<li class=\"listitem\">\n            literals: The library doesn't provide some kind of literals. I think\n            that the mp_number class should provide a way to create literals if the\n            backend is able to. (Done 2012/09/15).\n          </li>\n<li class=\"listitem\">\n            The ExpresionTemplate parameter could be defaulted to a traits class\n            for more sensible defaults (done 2012/09/20).\n          </li>\n<li class=\"listitem\">\n            In a = exp1 op exp2 where a occurs inside one of exp1 or exp2 then we\n            can optimise and eliminate one more temporary (done 2012/09/20).\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.map.todo.h0\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.map.todo.pre_review_comments\"></a></span><a class=\"link\" href=\"todo.html#boost_multiprecision.map.todo.pre_review_comments\">Pre-Review\n        Comments</a>\n      </h5>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Make fixed precision orthogonal to Allocator type in cpp_int. Possible\n            solution - add an additional MaxBits template argument that defaults\n            to 0 (meaning keep going till no more space/memory). Done.\n          </li>\n<li class=\"listitem\">\n            Can ring types (exact floating-point types) be supported? The answer\n            should be yes, but someone needs to write it (Moved to TODO list).\n          </li>\n<li class=\"listitem\">\n            Should there be a choice of rounding mode (probably MPFR specific)? Moved\n            to TODO list.\n          </li>\n<li class=\"listitem\">\n            Make the exponent type for cpp_dec_float a template parameter, maybe\n            include support for big-integer exponents. Open question - what should\n            be the default - int32_t or int64_t? (done 2012/09/06)\n          </li>\n<li class=\"listitem\">\n            Document the size requirements of fixed precision ints (done 2012/09/15).\n          </li>\n<li class=\"listitem\">\n            Document std lib function accuracy (done 2012/09/15).\n          </li>\n<li class=\"listitem\">\n            Be a bit clearer on the effects of sign-magnitude representation of cpp_int\n            - min == -max etc - done.\n          </li>\n<li class=\"listitem\">\n            Document cpp_dec_float precision, rounding, and exponent size (done 2012/09/06).\n          </li>\n<li class=\"listitem\">\n            Can we be clearer in the docs that mixed arithmetic doesn't work (no\n            longer applicable as of 2012/09/06)?\n          </li>\n<li class=\"listitem\">\n            Document round functions behaviour better (they behave as in C++11) (added\n            note 2012/09/06).\n          </li>\n<li class=\"listitem\">\n            Document limits on size of cpp_dec_float (done 2012/09/06).\n          </li>\n<li class=\"listitem\">\n            Add support for fused multiply add (and subtract). GMP mpz_t could use\n            this (done 2012/09/20).\n          </li>\n</ul></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"hist.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../map.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"faq.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/map.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Roadmap</title>\n<link rel=\"stylesheet\" href=\"../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"prev\" href=\"perf/rational_performance.html\" title=\"Rational Type Performance\">\n<link rel=\"next\" href=\"map/hist.html\" title=\"History\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"perf/rational_performance.html\"><img src=\"../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"map/hist.html\"><img src=\"../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h2 class=\"title\" style=\"clear: both\">\n<a name=\"boost_multiprecision.map\"></a><a class=\"link\" href=\"map.html\" title=\"Roadmap\">Roadmap</a>\n</h2></div></div></div>\n<div class=\"toc\"><dl class=\"toc\">\n<dt><span class=\"section\"><a href=\"map/hist.html\">History</a></span></dt>\n<dt><span class=\"section\"><a href=\"map/todo.html\">TODO</a></span></dt>\n<dt><span class=\"section\"><a href=\"map/faq.html\">FAQ</a></span></dt>\n<dt><span class=\"section\"><a href=\"map/ack.html\">Acknowledgements</a></span></dt>\n</dl></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"perf/rational_performance.html\"><img src=\"../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"map/hist.html\"><img src=\"../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/perf/float_performance.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Float Algorithm Performance</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../perf.html\" title=\"Performance Comparison\">\n<link rel=\"prev\" href=\"rational_real_world.html\" title=\"Rational Real World Tests\">\n<link rel=\"next\" href=\"integer_performance.html\" title=\"Integer Algorithm Performance\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"rational_real_world.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../perf.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"integer_performance.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.perf.float_performance\"></a><a class=\"link\" href=\"float_performance.html\" title=\"Float Algorithm Performance\">Float Algorithm\n      Performance</a>\n</h3></div></div></div>\n<p>\n        Note that these tests are carefully designed to test performance of the underlying\n        algorithms and not memory allocation or variable copying. As usual, performance\n        results should be taken with a healthy dose of scepticism, and real-world\n        performance may vary widely depending upon the specifics of the program.\n        In each table relative times are given first, with the best performer given\n        a score of 1. Total actual times are given in brackets, measured in seconds\n        for 500000 operations.\n      </p>\n<div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.operator\"></a><p class=\"title\"><b>Table 1.22. Operator *</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator *\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  50 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  100 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  500 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float\n                </p>\n              </td>\n<td>\n                <p>\n                  4.45465 (0.0720574s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.33995 (0.111688s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.90491 (0.850904s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float\n                </p>\n              </td>\n<td>\n                <p>\n                  3.82572 (0.061884s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.06288 (0.130292s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.77019 (1.6902s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_float\n                </p>\n              </td>\n<td>\n                <p>\n                  1.28958 (0.02086s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0257348s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.292919s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0161758s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.57159 (0.0661794s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.09888 (0.321884s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.operator_int\"></a><p class=\"title\"><b>Table 1.23. Operator *(int)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator *(int)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  50 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  100 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  500 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float\n                </p>\n              </td>\n<td>\n                <p>\n                  7.78457 (0.0399504s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.32801 (0.0464923s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.78369 (0.12206s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float\n                </p>\n              </td>\n<td>\n                <p>\n                  12.2836 (0.0630393s)\n                </p>\n              </td>\n<td>\n                <p>\n                  22.4215 (0.125171s)\n                </p>\n              </td>\n<td>\n                <p>\n                  115.745 (2.44271s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_float\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00513201s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00558264s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0211042s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float\n                </p>\n              </td>\n<td>\n                <p>\n                  6.55686 (0.0336498s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.08531 (0.0339721s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.75579 (0.0792629s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.operator_unsigned_long_long\"></a><p class=\"title\"><b>Table 1.24. Operator *(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator *(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  50 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  100 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  500 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float\n                </p>\n              </td>\n<td>\n                <p>\n                  3.96061 (0.0508387s)\n                </p>\n              </td>\n<td>\n                <p>\n                  9.0225 (0.0540758s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.84877 (0.0843974s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float\n                </p>\n              </td>\n<td>\n                <p>\n                  5.80905 (0.0745654s)\n                </p>\n              </td>\n<td>\n                <p>\n                  24.6321 (0.147631s)\n                </p>\n              </td>\n<td>\n                <p>\n                  122.419 (2.68446s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_float\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0128361s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00599344s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0219284s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float\n                </p>\n              </td>\n<td>\n                <p>\n                  2.15124 (0.0276134s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.61073 (0.0276341s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.31056 (0.0506668s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.operator_unsigned_long_long0\"></a><p class=\"title\"><b>Table 1.25. Operator *=(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator *=(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  50 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  100 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  500 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float\n                </p>\n              </td>\n<td>\n                <p>\n                  6.54027 (0.0500366s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.58857 (0.0547429s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.33593 (0.0987612s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float\n                </p>\n              </td>\n<td>\n                <p>\n                  9.23894 (0.0706828s)\n                </p>\n              </td>\n<td>\n                <p>\n                  17.6238 (0.172634s)\n                </p>\n              </td>\n<td>\n                <p>\n                  81.1437 (2.40228s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_float\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00765054s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00979552s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0296053s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float\n                </p>\n              </td>\n<td>\n                <p>\n                  2.99517 (0.0229147s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.55395 (0.0348128s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.42098 (0.0716736s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.operator0\"></a><p class=\"title\"><b>Table 1.26. Operator +</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator +\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  50 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  100 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  500 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float\n                </p>\n              </td>\n<td>\n                <p>\n                  2.61482 (0.0479759s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.91285 (0.0901201s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.04302 (0.219881s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float\n                </p>\n              </td>\n<td>\n                <p>\n                  1.08384 (0.0198859s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.6631 (0.0216812s)\n                </p>\n              </td>\n<td>\n                <p>\n                  7.59843 (0.207727s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_float\n                </p>\n              </td>\n<td>\n                <p>\n                  1.00042 (0.0183555s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0130366s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0273382s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0183477s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.4588 (0.0190178s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.22935 (0.0609463s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.operator_int0\"></a><p class=\"title\"><b>Table 1.27. Operator +(int)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator +(int)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  50 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  100 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  500 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float\n                </p>\n              </td>\n<td>\n                <p>\n                  11.8195 (0.0524679s)\n                </p>\n              </td>\n<td>\n                <p>\n                  13.9144 (0.0871804s)\n                </p>\n              </td>\n<td>\n                <p>\n                  13.6745 (0.165014s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float\n                </p>\n              </td>\n<td>\n                <p>\n                  3.22445 (0.0143136s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.703 (0.0169356s)\n                </p>\n              </td>\n<td>\n                <p>\n                  12.5227 (0.151114s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_float\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00443909s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00626549s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0120673s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float\n                </p>\n              </td>\n<td>\n                <p>\n                  5.78563 (0.0256829s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.78942 (0.0300081s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.21353 (0.062913s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.operator_unsigned_long_long1\"></a><p class=\"title\"><b>Table 1.28. Operator +(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator +(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  50 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  100 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  500 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float\n                </p>\n              </td>\n<td>\n                <p>\n                  21.4259 (0.109321s)\n                </p>\n              </td>\n<td>\n                <p>\n                  16.4546 (0.128103s)\n                </p>\n              </td>\n<td>\n                <p>\n                  14.7256 (0.16427s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float\n                </p>\n              </td>\n<td>\n                <p>\n                  4.53931 (0.0231609s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.75913 (0.0292658s)\n                </p>\n              </td>\n<td>\n                <p>\n                  13.3516 (0.148942s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_float\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0051023s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00778526s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0111554s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float\n                </p>\n              </td>\n<td>\n                <p>\n                  5.11905 (0.0261189s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.73777 (0.0290995s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.52758 (0.0616622s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.operator_unsigned_long_long2\"></a><p class=\"title\"><b>Table 1.29. Operator +=(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator +=(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  50 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  100 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  500 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float\n                </p>\n              </td>\n<td>\n                <p>\n                  6.6778 (0.109847s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.84045 (0.0942496s)\n                </p>\n              </td>\n<td>\n                <p>\n                  9.09759 (0.157162s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float\n                </p>\n              </td>\n<td>\n                <p>\n                  1.06799 (0.017568s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.71962 (0.0236933s)\n                </p>\n              </td>\n<td>\n                <p>\n                  10.7777 (0.186187s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_float\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0164496s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0137783s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0172751s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float\n                </p>\n              </td>\n<td>\n                <p>\n                  3.47654 (0.0571878s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.64857 (0.0502709s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.56004 (0.0787754s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.operator1\"></a><p class=\"title\"><b>Table 1.30. Operator -</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator -\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  50 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  100 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  500 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float\n                </p>\n              </td>\n<td>\n                <p>\n                  5.04597 (0.0688937s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.65775 (0.0896788s)\n                </p>\n              </td>\n<td>\n                <p>\n                  7.55005 (0.196627s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float\n                </p>\n              </td>\n<td>\n                <p>\n                  1.42357 (0.0194363s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.62766 (0.0313385s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.16298 (0.21259s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_float\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0136532s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0192537s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0260432s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float\n                </p>\n              </td>\n<td>\n                <p>\n                  1.76726 (0.0241287s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.05663 (0.0395976s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.48295 (0.0646638s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.operator_int1\"></a><p class=\"title\"><b>Table 1.31. Operator -(int)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator -(int)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  50 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  100 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  500 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float\n                </p>\n              </td>\n<td>\n                <p>\n                  6.31633 (0.0848243s)\n                </p>\n              </td>\n<td>\n                <p>\n                  7.07646 (0.084402s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.65523 (0.181209s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float\n                </p>\n              </td>\n<td>\n                <p>\n                  1.6139 (0.0216737s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.20945 (0.0263524s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.27802 (0.14371s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_float\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0134294s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0119272s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0272281s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float\n                </p>\n              </td>\n<td>\n                <p>\n                  5.1551 (0.0692297s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.48391 (0.0654074s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.6116 (0.0711089s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.operator_unsigned_long_long3\"></a><p class=\"title\"><b>Table 1.32. Operator -(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator -(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  50 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  100 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  500 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float\n                </p>\n              </td>\n<td>\n                <p>\n                  9.08373 (0.102878s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.54284 (0.0883961s)\n                </p>\n              </td>\n<td>\n                <p>\n                  7.01771 (0.185162s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float\n                </p>\n              </td>\n<td>\n                <p>\n                  2.19345 (0.0248419s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.47898 (0.0287785s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.71248 (0.150724s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_float\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0113255s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0194584s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.026385s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float\n                </p>\n              </td>\n<td>\n                <p>\n                  5.35926 (0.0606961s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.92255 (0.056868s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.43277 (0.0905736s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.operator_unsigned_long_long4\"></a><p class=\"title\"><b>Table 1.33. Operator -=(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator -=(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  50 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  100 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  500 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float\n                </p>\n              </td>\n<td>\n                <p>\n                  8.73347 (0.129938s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.58762 (0.101449s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.43827 (0.163157s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float\n                </p>\n              </td>\n<td>\n                <p>\n                  1.67927 (0.0249846s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.79526 (0.0396995s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.63379 (0.199025s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_float\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0148782s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0221136s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0300017s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float\n                </p>\n              </td>\n<td>\n                <p>\n                  3.96488 (0.0589902s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.30899 (0.0731736s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.51566 (0.105476s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.operator2\"></a><p class=\"title\"><b>Table 1.34. Operator /</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator /\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  50 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  100 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  500 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float\n                </p>\n              </td>\n<td>\n                <p>\n                  5.40221 (0.549759s)\n                </p>\n              </td>\n<td>\n                <p>\n                  10.0182 (1.39191s)\n                </p>\n              </td>\n<td>\n                <p>\n                  12.3684 (5.32129s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float\n                </p>\n              </td>\n<td>\n                <p>\n                  8.16505 (0.83092s)\n                </p>\n              </td>\n<td>\n                <p>\n                  12.483 (1.73437s)\n                </p>\n              </td>\n<td>\n                <p>\n                  52.8644 (22.744s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_float\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.101766s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.138938s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.430233s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float\n                </p>\n              </td>\n<td>\n                <p>\n                  1.6699 (0.169939s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.16251 (0.300455s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.82683 (1.2162s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.operator_int2\"></a><p class=\"title\"><b>Table 1.35. Operator /(int)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator /(int)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  50 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  100 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  500 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float\n                </p>\n              </td>\n<td>\n                <p>\n                  5.81464 (0.141651s)\n                </p>\n              </td>\n<td>\n                <p>\n                  12.2991 (0.271491s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.20246 (0.643802s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float\n                </p>\n              </td>\n<td>\n                <p>\n                  16.4865 (0.40163s)\n                </p>\n              </td>\n<td>\n                <p>\n                  39.0331 (0.861622s)\n                </p>\n              </td>\n<td>\n                <p>\n                  164 (12.8722s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_float\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0243611s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0220741s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0784889s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float\n                </p>\n              </td>\n<td>\n                <p>\n                  2.25501 (0.0549347s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.6832 (0.0592293s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.60852 (0.126251s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.operator_unsigned_long_long5\"></a><p class=\"title\"><b>Table 1.36. Operator /(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator /(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  50 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  100 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  500 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float\n                </p>\n              </td>\n<td>\n                <p>\n                  10.879 (0.19558s)\n                </p>\n              </td>\n<td>\n                <p>\n                  10.4845 (0.244599s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.82445 (0.621615s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float\n                </p>\n              </td>\n<td>\n                <p>\n                  22.028 (0.396014s)\n                </p>\n              </td>\n<td>\n                <p>\n                  42.4784 (0.991001s)\n                </p>\n              </td>\n<td>\n                <p>\n                  201.351 (14.1836s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_float\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0179778s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0233296s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0704423s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float\n                </p>\n              </td>\n<td>\n                <p>\n                  2.89723 (0.0520857s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.6935 (0.0628383s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.67233 (0.117803s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.operator_unsigned_long_long6\"></a><p class=\"title\"><b>Table 1.37. Operator /=(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator /=(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  50 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  100 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  500 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float\n                </p>\n              </td>\n<td>\n                <p>\n                  11.0264 (0.215322s)\n                </p>\n              </td>\n<td>\n                <p>\n                  7.78235 (0.256093s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.31638 (0.638041s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float\n                </p>\n              </td>\n<td>\n                <p>\n                  20.9412 (0.408938s)\n                </p>\n              </td>\n<td>\n                <p>\n                  38.8146 (1.27727s)\n                </p>\n              </td>\n<td>\n                <p>\n                  142.377 (10.9233s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_float\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0195279s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.032907s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.076721s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float\n                </p>\n              </td>\n<td>\n                <p>\n                  2.67894 (0.0523141s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.16678 (0.071302s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.5964 (0.122477s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.operator_construct\"></a><p class=\"title\"><b>Table 1.38. Operator construct</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator construct\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  50 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  100 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  500 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0030982s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.37355 (0.00608929s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0152335s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float\n                </p>\n              </td>\n<td>\n                <p>\n                  1.23911 (0.00383901s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00443324s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.6806 (0.0256013s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_float\n                </p>\n              </td>\n<td>\n                <p>\n                  7.50258 (0.0232445s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.47554 (0.0242744s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.81062 (0.0885159s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float\n                </p>\n              </td>\n<td>\n                <p>\n                  24.9598 (0.0773304s)\n                </p>\n              </td>\n<td>\n                <p>\n                  19.5526 (0.0866815s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.00378 (0.0762248s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.operator_construct_unsigned_long\"></a><p class=\"title\"><b>Table 1.39. Operator construct(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator construct(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  50 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  100 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  500 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float\n                </p>\n              </td>\n<td>\n                <p>\n                  2.08541 (0.0175206s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.12821 (0.0267453s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.32687 (0.0570308s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00840151s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00854971s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0429815s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_float\n                </p>\n              </td>\n<td>\n                <p>\n                  3.08163 (0.0258903s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.44895 (0.0209379s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.12806 (0.0914671s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float\n                </p>\n              </td>\n<td>\n                <p>\n                  10.6814 (0.08974s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.42482 (0.0720298s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.8282 (0.0785786s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.operator_construct_unsigned\"></a><p class=\"title\"><b>Table 1.40. Operator construct(unsigned)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator construct(unsigned)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  50 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  100 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  500 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float\n                </p>\n              </td>\n<td>\n                <p>\n                  1.04974 (0.00808983s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.38823 (0.0120486s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.16321 (0.0530205s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00770653s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00867913s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0455813s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_float\n                </p>\n              </td>\n<td>\n                <p>\n                  3.88496 (0.0299395s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.90503 (0.0252132s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.82072 (0.0829907s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float\n                </p>\n              </td>\n<td>\n                <p>\n                  13.3088 (0.102564s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.41333 (0.0730204s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.78408 (0.0813206s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.operator_str\"></a><p class=\"title\"><b>Table 1.41. Operator str</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator str\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  50 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  100 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  500 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float\n                </p>\n              </td>\n<td>\n                <p>\n                  6.09659 (0.00301165s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.71882 (0.0051705s)\n                </p>\n              </td>\n<td>\n                <p>\n                  12.4899 (0.043165s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float\n                </p>\n              </td>\n<td>\n                <p>\n                  2.94087 (0.00145276s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.64843 (0.00180621s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.16004 (0.0109211s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_float\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.000493989s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00109572s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00345598s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float\n                </p>\n              </td>\n<td>\n                <p>\n                  4.60349 (0.00227407s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.21213 (0.00132816s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.41569 (0.0048926s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.float_performance.platform\"></a><p class=\"title\"><b>Table 1.42. Platform Details</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Platform Details\">\n<colgroup>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n              </th>\n<th>\n                <p>\n                  Version\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  Compiler\n                </p>\n              </td>\n<td>\n                <p>\n                  GNU C++ version 10.3.0\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  GMP\n                </p>\n              </td>\n<td>\n                <p>\n                  6.2.0\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  MPFR\n                </p>\n              </td>\n<td>\n                <p>\n                  262146\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  Boost\n                </p>\n              </td>\n<td>\n                <p>\n                  107800\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  Run date\n                </p>\n              </td>\n<td>\n                <p>\n                  Sep 30 2021\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\">\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"rational_real_world.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../perf.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"integer_performance.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/perf/int_real_world.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Integer Real World Tests</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../perf.html\" title=\"Performance Comparison\">\n<link rel=\"prev\" href=\"realworld.html\" title=\"Floating-Point Real World Tests\">\n<link rel=\"next\" href=\"rational_real_world.html\" title=\"Rational Real World Tests\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"realworld.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../perf.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"rational_real_world.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.perf.int_real_world\"></a><a class=\"link\" href=\"int_real_world.html\" title=\"Integer Real World Tests\">Integer Real\n      World Tests</a>\n</h3></div></div></div>\n<p>\n        The first set of <a href=\"http://www.boost.org/doc/libs/release/libs/multiprecision/doc/html/../../performance/voronoi_performance.cpp\" target=\"_top\">tests</a>\n        measure the times taken to execute the multiprecision part of the Voronoi-diagram\n        builder from Boost.Polygon. The tests mainly create a large number of temporaries\n        \"just in case\" multiprecision arithmetic is required, for comparison,\n        also included in the tests is Boost.Polygon's own partial-multiprecision\n        integer type which was custom written for this specific task:\n      </p>\n<div class=\"informaltable\"><table class=\"table\">\n<colgroup>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Integer Type\n                </p>\n              </th>\n<th>\n                <p>\n                  Relative Performance (Actual time in parenthesis)\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  checked_int1024_t\n                </p>\n              </td>\n<td>\n                <p>\n                  1.53714(0.0415328s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  checked_int256_t\n                </p>\n              </td>\n<td>\n                <p>\n                  1.20715(0.0326167s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  checked_int512_t\n                </p>\n              </td>\n<td>\n                <p>\n                  1.2587(0.0340095s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  1.80575(0.0487904s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  extended_int\n                </p>\n              </td>\n<td>\n                <p>\n                  1.35652(0.0366527s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  int1024_t\n                </p>\n              </td>\n<td>\n                <p>\n                  1.36237(0.0368107s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  int256_t\n                </p>\n              </td>\n<td>\n                <p>\n                  1(0.0270196s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  int512_t\n                </p>\n              </td>\n<td>\n                <p>\n                  1.0779(0.0291243s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpz_int\n                </p>\n              </td>\n<td>\n                <p>\n                  3.83495(0.103619s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tom_int\n                </p>\n              </td>\n<td>\n                <p>\n                  41.6378(1.12504s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n<p>\n        Note how for this use case, any dynamic allocation is a performance killer.\n      </p>\n<p>\n        The next <a href=\"http://www.boost.org/doc/libs/release/libs/multiprecision/doc/html/../../performance/miller_rabin_performance.cpp\" target=\"_top\">tests</a>\n        measure the time taken to generate 1000 128-bit random numbers and test for\n        primality using the Miller Rabin test. This is primarily a test of modular-exponentiation\n        since that is the rate limiting step:\n      </p>\n<div class=\"informaltable\"><table class=\"table\">\n<colgroup>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Integer Type\n                </p>\n              </th>\n<th>\n                <p>\n                  Relative Performance (Actual time in parenthesis)\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  checked_uint1024_t\n                </p>\n              </td>\n<td>\n                <p>\n                  9.52301(0.0422246s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  11.2194(0.0497465s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int (1024-bit cache)\n                </p>\n              </td>\n<td>\n                <p>\n                  10.7941(0.0478607s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int (128-bit cache)\n                </p>\n              </td>\n<td>\n                <p>\n                  11.0637(0.0490558s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int (256-bit cache)\n                </p>\n              </td>\n<td>\n                <p>\n                  11.5069(0.0510209s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int (512-bit cache)\n                </p>\n              </td>\n<td>\n                <p>\n                  10.3303(0.0458041s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int (no Expression templates)\n                </p>\n              </td>\n<td>\n                <p>\n                  16.1792(0.0717379s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpz_int\n                </p>\n              </td>\n<td>\n                <p>\n                  1.05106(0.00466034s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpz_int (no Expression templates)\n                </p>\n              </td>\n<td>\n                <p>\n                  1(0.00443395s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tom_int\n                </p>\n              </td>\n<td>\n                <p>\n                  5.10595(0.0226395s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tom_int (no Expression templates)\n                </p>\n              </td>\n<td>\n                <p>\n                  61.9684(0.274765s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  uint1024_t\n                </p>\n              </td>\n<td>\n                <p>\n                  9.32113(0.0413295s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n<p>\n        It's interesting to note that expression templates have little effect here\n        - perhaps because the actual expressions involved are relatively trivial\n        in this case - so the time taken for multiplication and division tends to\n        dominate. The much quicker times from GMP and tommath are down to their much\n        better modular-exponentiation algorithms (GMP's is about 5x faster). That's\n        an issue which needs to be addressed in a future release for <a class=\"link\" href=\"../tut/ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>.\n      </p>\n<div class=\"table\">\n<a name=\"boost_multiprecision.perf.int_real_world.platform\"></a><p class=\"title\"><b>Table 1.17. Platform Details</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Platform Details\">\n<colgroup>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n              </th>\n<th>\n                <p>\n                  Version\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  Compiler\n                </p>\n              </td>\n<td>\n                <p>\n                  GNU C++ version 10.3.0\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  GMP\n                </p>\n              </td>\n<td>\n                <p>\n                  6.2.0\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  MPFR\n                </p>\n              </td>\n<td>\n                <p>\n                  262146\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  Boost\n                </p>\n              </td>\n<td>\n                <p>\n                  107800\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  Run date\n                </p>\n              </td>\n<td>\n                <p>\n                  Sep 30 2021\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\">\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"realworld.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../perf.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"rational_real_world.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/perf/integer_performance.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Integer Algorithm Performance</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../perf.html\" title=\"Performance Comparison\">\n<link rel=\"prev\" href=\"float_performance.html\" title=\"Float Algorithm Performance\">\n<link rel=\"next\" href=\"rational_performance.html\" title=\"Rational Type Performance\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"float_performance.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../perf.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"rational_performance.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.perf.integer_performance\"></a><a class=\"link\" href=\"integer_performance.html\" title=\"Integer Algorithm Performance\">Integer\n      Algorithm Performance</a>\n</h3></div></div></div>\n<p>\n        Note that these tests are carefully designed to test performance of the underlying\n        algorithms and not memory allocation or variable copying. As usual, performance\n        results should be taken with a healthy dose of scepticism, and real-world\n        performance may vary widely depending upon the specifics of the program.\n        In each table relative times are given first, with the best performer given\n        a score of 1. Total actual times are given in brackets, measured in seconds\n        for 500000 operations.\n      </p>\n<div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator\"></a><p class=\"title\"><b>Table 1.43. Operator %</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator %\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  1.51155 (0.0481508s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.60666 (0.0825917s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.75956 (0.127209s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.87154 (0.171986s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.58143 (0.368469s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.512768s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.42429 (1.03083s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (1.96988s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0318553s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.2913 (0.0663805s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.33672 (0.0966394s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.97924 (0.181883s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  1.4659 (0.0466966s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0514059s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0722958s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0918952s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.142738s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.24073s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.17701 (0.603534s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.723753s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  27.46 (0.874748s)\n                </p>\n              </td>\n<td>\n                <p>\n                  20.1749 (1.03711s)\n                </p>\n              </td>\n<td>\n                <p>\n                  17.9774 (1.29969s)\n                </p>\n              </td>\n<td>\n                <p>\n                  19.0867 (1.75398s)\n                </p>\n              </td>\n<td>\n                <p>\n                  23.3789 (3.33706s)\n                </p>\n              </td>\n<td>\n                <p>\n                  26.6546 (6.41658s)\n                </p>\n              </td>\n<td>\n                <p>\n                  33.4553 (17.1548s)\n                </p>\n              </td>\n<td>\n                <p>\n                  70.788 (51.233s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_int\"></a><p class=\"title\"><b>Table 1.44. Operator %(int)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator %(int)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00790481s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.45288 (0.0215141s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.71488 (0.065874s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.05695 (0.1044s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.59285 (0.288068s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.58045 (0.429244s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.18417 (0.851447s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (1.57951s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.18748 (0.0172916s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.67119 (0.0247468s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.83861 (0.0688759s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.3186 (0.111133s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  1.50165 (0.0118703s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0148079s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.024264s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0257336s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0436939s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0571251s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.119886s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.137682s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  68.9623 (0.545134s)\n                </p>\n              </td>\n<td>\n                <p>\n                  54.52 (0.807325s)\n                </p>\n              </td>\n<td>\n                <p>\n                  38.3573 (0.930702s)\n                </p>\n              </td>\n<td>\n                <p>\n                  53.0833 (1.36603s)\n                </p>\n              </td>\n<td>\n                <p>\n                  59.6958 (2.60834s)\n                </p>\n              </td>\n<td>\n                <p>\n                  103.597 (5.91797s)\n                </p>\n              </td>\n<td>\n                <p>\n                  133.648 (16.0225s)\n                </p>\n              </td>\n<td>\n                <p>\n                  392.812 (54.083s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator0\"></a><p class=\"title\"><b>Table 1.45. Operator &amp;</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator &amp;\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  2.82137 (0.0101034s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.08842 (0.0128886s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.46566 (0.018172s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.55025 (0.0204051s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.97241 (0.0461406s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0440714s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0811524s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.146531s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00358104s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.5374 (0.00641591s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.70378 (0.0089337s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.40825 (0.019269s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  1.10071 (0.00394167s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00417321s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00524347s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00800121s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.015523s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.04806 (0.0384586s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.0133 (0.0887291s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.38531 (0.112421s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  2.18066 (0.00780901s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.22528 (0.00928657s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.15567 (0.0113032s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.05906 (0.0244762s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.34741 (0.0364387s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.50551 (0.0552444s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.29355 (0.10108s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.0313 (0.245997s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_int0\"></a><p class=\"title\"><b>Table 1.46. Operator &amp;(int)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator &amp;(int)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  3.24695 (0.0124861s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.81002 (0.0114113s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.11984 (0.0179186s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.56949 (0.0262296s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.62157 (0.063826s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.95427 (0.0593859s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.84754 (0.102968s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.168385s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0038455s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00630453s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00845281s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.20848 (0.0225444s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  3.87448 (0.0148993s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.50343 (0.00947844s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.59793 (0.013507s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0102081s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0176239s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0121449s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0150182s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0212413s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  25.1094 (0.0965583s)\n                </p>\n              </td>\n<td>\n                <p>\n                  15.7147 (0.0990734s)\n                </p>\n              </td>\n<td>\n                <p>\n                  9.65097 (0.0815778s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.5208 (0.0869813s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.74798 (0.101302s)\n                </p>\n              </td>\n<td>\n                <p>\n                  10.598 (0.128712s)\n                </p>\n              </td>\n<td>\n                <p>\n                  12.0534 (0.18102s)\n                </p>\n              </td>\n<td>\n                <p>\n                  13.0183 (0.276527s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator1\"></a><p class=\"title\"><b>Table 1.47. Operator *</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator *\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  12.4201 (0.0145016s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.838 (0.0246772s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.10406 (0.0631704s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.22846 (0.224062s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.53789 (0.918685s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (2.65154s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (7.83314s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (26.1836s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00116759s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.76789 (0.0237359s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.58515 (0.047591s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.52628 (0.153461s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  4.80091 (0.00560549s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0134261s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0300231s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.100546s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.361988s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (1.11701s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.08347 (5.52441s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.44767 (11.3398s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  16.9604 (0.0198027s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.43157 (0.0326465s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.82213 (0.0847288s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.67653 (0.168568s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.27293 (0.460786s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.41678 (1.58255s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.69181 (7.13744s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.30421 (25.8824s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_int1\"></a><p class=\"title\"><b>Table 1.48. Operator *(int)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator *(int)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  10.9781 (0.0072726s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.52901 (0.00991594s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.35266 (0.0194072s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.30215 (0.0214459s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.95214 (0.047049s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0576663s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0955853s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.167493s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.000662467s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00648519s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.52643 (0.0088359s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.26708 (0.0211192s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  7.14641 (0.00473426s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.74133 (0.0112929s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00578859s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00931559s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0241013s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.12075 (0.0477494s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.96831 (0.113505s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.44107 (0.137745s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  156.154 (0.103447s)\n                </p>\n              </td>\n<td>\n                <p>\n                  14.5292 (0.0942242s)\n                </p>\n              </td>\n<td>\n                <p>\n                  16.82 (0.0973642s)\n                </p>\n              </td>\n<td>\n                <p>\n                  11.9029 (0.110883s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.61803 (0.135402s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.61241 (0.196512s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.30415 (0.30587s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.73424 (0.548109s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_unsigned_long_long\"></a><p class=\"title\"><b>Table 1.49. Operator *(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator *(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  8.98335 (0.00669928s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.79861 (0.00820918s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.86924 (0.0119122s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.71773 (0.0175683s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.57826 (0.0539343s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0432066s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0813634s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.159452s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.000745744s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.07211 (0.00489332s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.19888 (0.00764018s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.53618 (0.0157115s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  4.97741 (0.00371188s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00456418s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00637276s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0102277s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0209189s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0321931s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.05197 (0.0886586s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.59261 (0.12958s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  143.938 (0.107341s)\n                </p>\n              </td>\n<td>\n                <p>\n                  24.0751 (0.109883s)\n                </p>\n              </td>\n<td>\n                <p>\n                  16.9325 (0.107907s)\n                </p>\n              </td>\n<td>\n                <p>\n                  11.5473 (0.118102s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.08283 (0.169084s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.84808 (0.220461s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.37134 (0.361697s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.20104 (0.667264s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_unsigned_long_long0\"></a><p class=\"title\"><b>Table 1.50. Operator *=(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator *=(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  15.7803 (0.0131299s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.67116 (0.00790233s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.66661 (0.0119079s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.51408 (0.0203561s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.23815 (0.0373067s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0424701s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0946934s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.177219s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.000832044s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00472864s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00714494s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0134446s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  6.73473 (0.00560359s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.81651 (0.00858963s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.36813 (0.00977523s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.00404 (0.0134989s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0301309s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0457849s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.56449 (0.108914s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.20384 (0.208689s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  115.266 (0.0959064s)\n                </p>\n              </td>\n<td>\n                <p>\n                  24.7701 (0.117129s)\n                </p>\n              </td>\n<td>\n                <p>\n                  15.9941 (0.114277s)\n                </p>\n              </td>\n<td>\n                <p>\n                  11.3798 (0.152996s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.69861 (0.171704s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.47882 (0.250847s)\n                </p>\n              </td>\n<td>\n                <p>\n                  10.6875 (0.453899s)\n                </p>\n              </td>\n<td>\n                <p>\n                  7.29439 (0.690731s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator2\"></a><p class=\"title\"><b>Table 1.51. Operator +</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator +\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  9.80738 (0.0086037s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.34204 (0.0160922s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.00627 (0.0131305s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.67865 (0.0163002s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.88916 (0.033949s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0412289s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.083134s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.190174s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.000877268s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00687102s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.82016 (0.0237507s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.90391 (0.0184876s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  5.87168 (0.00515104s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.45191 (0.00997612s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0130487s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00971031s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0179704s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0300729s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.96754 (0.0811195s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.62045 (0.134715s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  13.6707 (0.0119929s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.03266 (0.00709542s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.02249 (0.0133422s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.4749 (0.0143218s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.17551 (0.0211244s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.08462 (0.0326177s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.47125 (0.060658s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.75813 (0.229295s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_int2\"></a><p class=\"title\"><b>Table 1.52. Operator +(int)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator +(int)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  7.65014 (0.00534018s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.8992 (0.0063589s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.56778 (0.00666443s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.29719 (0.00836612s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.73231 (0.0204874s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0198385s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0338486s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0760202s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.000698051s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.72665 (0.00578118s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.57164 (0.00668085s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.90796 (0.0123052s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  4.97679 (0.00347405s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0033482s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00425087s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0064494s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0118266s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0195694s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.53343 (0.0700979s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.28146 (0.0772241s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  127.407 (0.0889366s)\n                </p>\n              </td>\n<td>\n                <p>\n                  24.8716 (0.0832749s)\n                </p>\n              </td>\n<td>\n                <p>\n                  20.4864 (0.0870848s)\n                </p>\n              </td>\n<td>\n                <p>\n                  12.5462 (0.0809152s)\n                </p>\n              </td>\n<td>\n                <p>\n                  7.07209 (0.083639s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.79434 (0.0938225s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.93694 (0.11778s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.20775 (0.176275s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_unsigned_long_long1\"></a><p class=\"title\"><b>Table 1.53. Operator +(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator +(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  9.92952 (0.00893714s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.68575 (0.0136811s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.73024 (0.0102989s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.43961 (0.0115471s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.46556 (0.0237404s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0253811s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0350422s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0761856s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.000900057s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.27396 (0.00648945s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.38787 (0.008261s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.56798 (0.0125768s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  5.22669 (0.00470432s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00509394s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00595229s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00802101s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0161988s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0174726s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.83602 (0.0466003s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.90731 (0.0668364s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  100.859 (0.0907784s)\n                </p>\n              </td>\n<td>\n                <p>\n                  19.2654 (0.0981367s)\n                </p>\n              </td>\n<td>\n                <p>\n                  14.4537 (0.0860324s)\n                </p>\n              </td>\n<td>\n                <p>\n                  10.0594 (0.0806864s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.71755 (0.0926177s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.23483 (0.108939s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.63528 (0.117648s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.01743 (0.175822s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_unsigned_long_long2\"></a><p class=\"title\"><b>Table 1.54. Operator +=(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator +=(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  12.2366 (0.0106404s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.48157 (0.00996803s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.58862 (0.0108279s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.06658 (0.0131949s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.1631 (0.0186902s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0218483s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0394761s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0783171s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.000869555s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.34779 (0.00906799s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00681593s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00638493s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  11.3522 (0.00987134s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00672804s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.27495 (0.00868995s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.42237 (0.0154667s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0160693s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.09672 (0.0221405s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.61199 (0.0570676s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.13093 (0.0841208s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  88.4252 (0.0768906s)\n                </p>\n              </td>\n<td>\n                <p>\n                  14.139 (0.0951277s)\n                </p>\n              </td>\n<td>\n                <p>\n                  11.6282 (0.0792569s)\n                </p>\n              </td>\n<td>\n                <p>\n                  14.5551 (0.0929332s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.86867 (0.110375s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.67471 (0.11456s)\n                </p>\n              </td>\n<td>\n                <p>\n                  7.29502 (0.159384s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.733 (0.226317s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator3\"></a><p class=\"title\"><b>Table 1.55. Operator -</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator -\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  4.45457 (0.00859678s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.28478 (0.013219s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.27873 (0.0117779s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.43649 (0.0151597s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.82516 (0.0507822s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0463464s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0813138s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.191562s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00192988s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.010289s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00921062s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.5372 (0.0162226s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  3.4436 (0.00664573s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.25045 (0.0128659s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.10953 (0.0102195s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0105533s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.017975s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0321962s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.54862 (0.11812s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.83623 (0.14931s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  9.3224 (0.0179911s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.08796 (0.011194s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.93265 (0.017801s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.82306 (0.0192393s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.55663 (0.0279804s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.6544 (0.0532653s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.90928 (0.0884881s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.41259 (0.358805s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_int3\"></a><p class=\"title\"><b>Table 1.56. Operator -(int)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator -(int)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  3.07164 (0.00347144s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.38957 (0.00531251s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.29053 (0.00548206s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.35239 (0.00759591s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.50007 (0.0176467s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0209158s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0402632s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0674681s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00113016s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.26281 (0.00482789s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.25074 (0.00531307s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.3923 (0.0190533s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  3.22069 (0.00363988s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00382312s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00424793s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00561665s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0117639s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0225873s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.75829 (0.0576919s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.03214 (0.0818204s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  81.1433 (0.0917047s)\n                </p>\n              </td>\n<td>\n                <p>\n                  21.4543 (0.0820224s)\n                </p>\n              </td>\n<td>\n                <p>\n                  19.3098 (0.0820267s)\n                </p>\n              </td>\n<td>\n                <p>\n                  16.2994 (0.0915478s)\n                </p>\n              </td>\n<td>\n                <p>\n                  7.23608 (0.0851246s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.48441 (0.101291s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.51882 (0.115431s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.44737 (0.179066s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_unsigned_long_long3\"></a><p class=\"title\"><b>Table 1.57. Operator -(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator -(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  7.02787 (0.00807189s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.85949 (0.00922027s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.40179 (0.00830959s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.22546 (0.00988039s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.27526 (0.0235442s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0242017s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0317445s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0783054s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00114855s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.03947 (0.00515424s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.22566 (0.00726552s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.56568 (0.0126235s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  7.54669 (0.00866778s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0049585s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00592785s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00806262s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0184622s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0220616s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.79985 (0.0435595s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.08427 (0.0661641s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  72.1332 (0.0828488s)\n                </p>\n              </td>\n<td>\n                <p>\n                  18.985 (0.0941371s)\n                </p>\n              </td>\n<td>\n                <p>\n                  13.9301 (0.0825755s)\n                </p>\n              </td>\n<td>\n                <p>\n                  9.93889 (0.0801335s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.42256 (0.100113s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.58437 (0.101139s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.91664 (0.118991s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.5407 (0.175887s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_unsigned_long_long4\"></a><p class=\"title\"><b>Table 1.58. Operator -=(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator -=(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  10.8565 (0.0103583s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.00541 (0.0102937s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.73348 (0.0103591s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.53718 (0.0189898s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.21308 (0.0265754s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0249248s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0377524s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.070851s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.000954108s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00513296s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00597589s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00748462s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  6.6602 (0.00635455s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.61345 (0.00828179s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.41745 (0.00847054s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.41728 (0.0106078s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0219074s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0250737s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.12439 (0.05295s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.51074 (0.0947863s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  88.858 (0.0847801s)\n                </p>\n              </td>\n<td>\n                <p>\n                  18.6448 (0.0957029s)\n                </p>\n              </td>\n<td>\n                <p>\n                  13.7283 (0.0820388s)\n                </p>\n              </td>\n<td>\n                <p>\n                  13.4423 (0.100611s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.83335 (0.105886s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.6829 (0.117418s)\n                </p>\n              </td>\n<td>\n                <p>\n                  7.59449 (0.189292s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.86189 (0.2213s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator4\"></a><p class=\"title\"><b>Table 1.59. Operator /</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator /\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  3.20876 (0.0878919s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.17469 (0.181536s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.14517 (0.250544s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.14655 (0.365546s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.70812 (0.702366s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.28619 (1.18106s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.54663 (2.26453s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (4.52755s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0273912s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.72404 (0.098585s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.12584 (0.169344s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.71442 (0.327451s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  1.70383 (0.04667s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0571824s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0796599s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0881567s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.149182s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.208719s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.516606s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.638503s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  40.8044 (1.11768s)\n                </p>\n              </td>\n<td>\n                <p>\n                  17.2975 (0.989116s)\n                </p>\n              </td>\n<td>\n                <p>\n                  17.4097 (1.38686s)\n                </p>\n              </td>\n<td>\n                <p>\n                  20.9668 (1.84837s)\n                </p>\n              </td>\n<td>\n                <p>\n                  20.6415 (3.07934s)\n                </p>\n              </td>\n<td>\n                <p>\n                  31.5839 (6.59216s)\n                </p>\n              </td>\n<td>\n                <p>\n                  33.0087 (17.0525s)\n                </p>\n              </td>\n<td>\n                <p>\n                  81.0894 (51.7759s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_int4\"></a><p class=\"title\"><b>Table 1.60. Operator /(int)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator /(int)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  4.50037 (0.0520677s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.30243 (0.108097s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.34437 (0.193637s)\n                </p>\n              </td>\n<td>\n                <p>\n                  7.02879 (0.296939s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.47793 (0.630264s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.64044 (1.08346s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.92627 (2.33772s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (4.22641s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.27227 (0.0147198s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.34067 (0.0744498s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.08699 (0.141253s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.56549 (0.277366s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0115696s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0171517s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0232057s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0422461s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0972941s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.156597s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.410334s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.595404s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  60.4712 (0.69963s)\n                </p>\n              </td>\n<td>\n                <p>\n                  44.8464 (0.769191s)\n                </p>\n              </td>\n<td>\n                <p>\n                  40.4334 (0.938285s)\n                </p>\n              </td>\n<td>\n                <p>\n                  35.0752 (1.48179s)\n                </p>\n              </td>\n<td>\n                <p>\n                  26.8178 (2.60921s)\n                </p>\n              </td>\n<td>\n                <p>\n                  37.2616 (5.83504s)\n                </p>\n              </td>\n<td>\n                <p>\n                  37.7146 (15.4756s)\n                </p>\n              </td>\n<td>\n                <p>\n                  84.1326 (50.0929s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_unsigned_long_long5\"></a><p class=\"title\"><b>Table 1.61. Operator /(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator /(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  6.09203 (0.0582351s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.42997 (0.0982056s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.2137 (0.151642s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.62408 (0.281298s)\n                </p>\n              </td>\n<td>\n                <p>\n                  9.30105 (0.706562s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.66307 (1.0584s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.10257 (2.14867s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (4.2547s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.76794 (0.0169001s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.59379 (0.0548884s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.55499 (0.135566s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.36274 (0.2702s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00955921s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0152731s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0244044s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.042466s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0759658s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.125208s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.288938s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.523737s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  63.2738 (0.604848s)\n                </p>\n              </td>\n<td>\n                <p>\n                  57.3767 (0.876321s)\n                </p>\n              </td>\n<td>\n                <p>\n                  43.9301 (1.07209s)\n                </p>\n              </td>\n<td>\n                <p>\n                  40.0122 (1.69916s)\n                </p>\n              </td>\n<td>\n                <p>\n                  41.1147 (3.12331s)\n                </p>\n              </td>\n<td>\n                <p>\n                  57.9739 (7.25882s)\n                </p>\n              </td>\n<td>\n                <p>\n                  68.6676 (19.8407s)\n                </p>\n              </td>\n<td>\n                <p>\n                  109.312 (57.2509s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_unsigned_long_long6\"></a><p class=\"title\"><b>Table 1.62. Operator /=(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator /=(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  5.21402 (0.0701172s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.76442 (0.105309s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.1245 (0.171387s)\n                </p>\n              </td>\n<td>\n                <p>\n                  7.39587 (0.299993s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.88568 (0.632889s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.2993 (1.05399s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.52936 (2.14442s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (4.37618s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.68246 (0.0226255s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.12633 (0.0691018s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.98733 (0.133354s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.62903 (0.268888s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0134478s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0221032s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0334445s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0405622s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0919138s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.14699s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.319457s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.607595s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  46.0731 (0.619583s)\n                </p>\n              </td>\n<td>\n                <p>\n                  43.6571 (0.964961s)\n                </p>\n              </td>\n<td>\n                <p>\n                  30.1861 (1.00956s)\n                </p>\n              </td>\n<td>\n                <p>\n                  41.4936 (1.68307s)\n                </p>\n              </td>\n<td>\n                <p>\n                  32.6785 (3.0036s)\n                </p>\n              </td>\n<td>\n                <p>\n                  48.2935 (7.09868s)\n                </p>\n              </td>\n<td>\n                <p>\n                  64.9093 (20.7357s)\n                </p>\n              </td>\n<td>\n                <p>\n                  111.801 (67.9296s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator5\"></a><p class=\"title\"><b>Table 1.63. Operator &lt;&lt;</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator &lt;&lt;\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  9.93178 (0.0116142s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.74005 (0.0147029s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.68859 (0.0238748s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.04419 (0.0394659s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.15112 (0.0859331s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0889652s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.190562s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.32803s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00116939s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00844969s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.94851 (0.0173029s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.55242 (0.0299716s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  4.60815 (0.00538874s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.02939 (0.00869801s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00888006s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0193064s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.039948s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0597248s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.65224 (0.146992s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.08567 (0.206887s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  10.7935 (0.0126218s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.38166 (0.0201243s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.42444 (0.0215291s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.87488 (0.0361972s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.73489 (0.0693055s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.93177 (0.115375s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.49667 (0.222116s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.82346 (0.538044s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator6\"></a><p class=\"title\"><b>Table 1.64. Operator &gt;&gt;</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator &gt;&gt;\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  12.5304 (0.011709s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.85524 (0.0153366s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.77866 (0.0209131s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.21549 (0.0146098s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.04361 (0.0183489s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.04276 (0.0219967s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.19636 (0.0537598s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0745484s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.000934446s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.55349 (0.0146615s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.51353 (0.0155169s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.90631 (0.0222922s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  2.59712 (0.00242687s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0022372s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00238226s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00454358s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00453774s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00313265s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00722919s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00655899s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  102.662 (0.0959319s)\n                </p>\n              </td>\n<td>\n                <p>\n                  42.5337 (0.0951565s)\n                </p>\n              </td>\n<td>\n                <p>\n                  39.1437 (0.0932504s)\n                </p>\n              </td>\n<td>\n                <p>\n                  21.0397 (0.0955953s)\n                </p>\n              </td>\n<td>\n                <p>\n                  29.6104 (0.134364s)\n                </p>\n              </td>\n<td>\n                <p>\n                  62.7092 (0.196446s)\n                </p>\n              </td>\n<td>\n                <p>\n                  49.6167 (0.358689s)\n                </p>\n              </td>\n<td>\n                <p>\n                  137.105 (0.899272s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator7\"></a><p class=\"title\"><b>Table 1.65. Operator ^</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator ^\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  2.8103 (0.0101384s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.11932 (0.0282768s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.25923 (0.0139063s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.94172 (0.0187085s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.66067 (0.0405646s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0369865s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0918676s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.150955s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00360758s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00686442s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.50683 (0.00927498s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.79076 (0.0172541s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  1.35398 (0.0048846s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.00969 (0.00693092s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00615531s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00963503s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0244266s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0429561s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.17737 (0.0805332s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.3521 (0.124214s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  2.28701 (0.00825059s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.65996 (0.0113947s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.06089 (0.0126854s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.03244 (0.0195826s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.4173 (0.0346198s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.32237 (0.0568037s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.69468 (0.0996668s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.55626 (0.234837s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_int5\"></a><p class=\"title\"><b>Table 1.66. Operator ^(int)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator ^(int)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  2.67312 (0.00991885s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.57246 (0.0115174s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.50193 (0.0198209s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0153479s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0264078s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0235546s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0392727s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0657809s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00371059s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0073244s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00792226s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.04763 (0.0160789s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  2.86377 (0.0106263s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.18619 (0.0160125s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.18777 (0.0173321s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.01844 (0.0156309s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.13176 (0.0298873s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.9665 (0.0406408s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.34613 (0.0788165s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.54952 (0.139399s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  26.101 (0.0968501s)\n                </p>\n              </td>\n<td>\n                <p>\n                  14.6444 (0.107261s)\n                </p>\n              </td>\n<td>\n                <p>\n                  10.0538 (0.079649s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.64392 (0.0866224s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.8806 (0.102478s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.36386 (0.131519s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.07216 (0.190136s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.01428 (0.314742s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_construct\"></a><p class=\"title\"><b>Table 1.67. Operator construct</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator construct\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  3.24638 (0.00190752s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.06172 (0.00258002s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00248269s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00191598s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00273948s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0017072s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00191549s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0016635s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.000587582s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00243004s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.51116 (0.00375174s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.66482 (0.00893771s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  5.61558 (0.00329962s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.52898 (0.0037155s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.51713 (0.00624925s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.755 (0.00336255s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.40183 (0.00384029s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.60131 (0.00385483s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.7818 (0.0081635s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.07779 (0.00397999s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  251.1 (0.147542s)\n                </p>\n              </td>\n<td>\n                <p>\n                  63.6186 (0.154596s)\n                </p>\n              </td>\n<td>\n                <p>\n                  54.6947 (0.13579s)\n                </p>\n              </td>\n<td>\n                <p>\n                  66.8839 (0.128148s)\n                </p>\n              </td>\n<td>\n                <p>\n                  47.8098 (0.130974s)\n                </p>\n              </td>\n<td>\n                <p>\n                  54.8252 (0.13198s)\n                </p>\n              </td>\n<td>\n                <p>\n                  74.1436 (0.126578s)\n                </p>\n              </td>\n<td>\n                <p>\n                  83.945 (0.160796s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_construct_unsigned_long\"></a><p class=\"title\"><b>Table 1.68. Operator construct(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator construct(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  2.12644 (0.00192028s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00200418s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00223886s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00189442s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00190833s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00199036s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00200998s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00168004s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.000903049s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.26395 (0.00253319s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.78621 (0.00399907s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.10701 (0.0096748s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  27.1389 (0.0245077s)\n                </p>\n              </td>\n<td>\n                <p>\n                  10.3593 (0.020762s)\n                </p>\n              </td>\n<td>\n                <p>\n                  9.02272 (0.0202006s)\n                </p>\n              </td>\n<td>\n                <p>\n                  9.96334 (0.0188747s)\n                </p>\n              </td>\n<td>\n                <p>\n                  15.2262 (0.0290565s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.50239 (0.0244927s)\n                </p>\n              </td>\n<td>\n                <p>\n                  35.6564 (0.0709692s)\n                </p>\n              </td>\n<td>\n                <p>\n                  10.9129 (0.0219346s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  183.484 (0.165695s)\n                </p>\n              </td>\n<td>\n                <p>\n                  83.0709 (0.166489s)\n                </p>\n              </td>\n<td>\n                <p>\n                  69.5984 (0.155821s)\n                </p>\n              </td>\n<td>\n                <p>\n                  75.8903 (0.143768s)\n                </p>\n              </td>\n<td>\n                <p>\n                  85.5979 (0.163349s)\n                </p>\n              </td>\n<td>\n                <p>\n                  50.8174 (0.146389s)\n                </p>\n              </td>\n<td>\n                <p>\n                  70.0602 (0.139445s)\n                </p>\n              </td>\n<td>\n                <p>\n                  95.4952 (0.191943s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_construct_unsigned\"></a><p class=\"title\"><b>Table 1.69. Operator construct(unsigned)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator construct(unsigned)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  2.00349 (0.00174712s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00225895s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00241092s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00177047s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00304865s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0018378s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0017583s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00197229s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.000872038s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.1805 (0.0026667s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.66167 (0.00400614s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.54475 (0.00981681s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  27.6419 (0.0241048s)\n                </p>\n              </td>\n<td>\n                <p>\n                  10.0723 (0.0227529s)\n                </p>\n              </td>\n<td>\n                <p>\n                  7.60577 (0.0183369s)\n                </p>\n              </td>\n<td>\n                <p>\n                  10.2725 (0.0181871s)\n                </p>\n              </td>\n<td>\n                <p>\n                  9.38419 (0.0286091s)\n                </p>\n              </td>\n<td>\n                <p>\n                  9.10394 (0.0220052s)\n                </p>\n              </td>\n<td>\n                <p>\n                  34.6032 (0.0635939s)\n                </p>\n              </td>\n<td>\n                <p>\n                  15.7134 (0.0276289s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  207.462 (0.180915s)\n                </p>\n              </td>\n<td>\n                <p>\n                  84.5379 (0.190967s)\n                </p>\n              </td>\n<td>\n                <p>\n                  65.2109 (0.157218s)\n                </p>\n              </td>\n<td>\n                <p>\n                  84.8572 (0.150237s)\n                </p>\n              </td>\n<td>\n                <p>\n                  47.0682 (0.143494s)\n                </p>\n              </td>\n<td>\n                <p>\n                  59.4466 (0.143689s)\n                </p>\n              </td>\n<td>\n                <p>\n                  78.5549 (0.144368s)\n                </p>\n              </td>\n<td>\n                <p>\n                  103.519 (0.182018s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_gcd\"></a><p class=\"title\"><b>Table 1.70. Operator gcd</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator gcd\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  2.10743 (0.358587s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.8778 (1.42989s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.03859 (3.30534s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.01435 (7.01715s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.16957 (17.7583s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (32.2572s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (76.6459s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (201.791s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.65486 (0.621889s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.78424 (1.35865s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.02664 (3.28597s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.95328 (6.8044s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.170154s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.761472s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (1.62139s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (3.48358s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (8.18516s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (18.7879s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.82325 (58.8129s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.59356 (122.14s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  8.01966 (1.36458s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.44226 (3.38266s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.55056 (7.37824s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.42983 (15.4317s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.23788 (42.8729s)\n                </p>\n              </td>\n<td>\n                <p>\n                  7.25799 (136.362s)\n                </p>\n              </td>\n<td>\n                <p>\n                  14.6265 (471.81s)\n                </p>\n              </td>\n<td>\n                <p>\n                  23.1025 (1770.72s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_powm\"></a><p class=\"title\"><b>Table 1.71. Operator powm</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator powm\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  14.8198 (0.565871s)\n                </p>\n              </td>\n<td>\n                <p>\n                  13.2096 (2.0199s)\n                </p>\n              </td>\n<td>\n                <p>\n                  11.8233 (9.06469s)\n                </p>\n              </td>\n<td>\n                <p>\n                  9.12533 (46.9932s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  9.40069 (0.35895s)\n                </p>\n              </td>\n<td>\n                <p>\n                  10.0395 (1.53516s)\n                </p>\n              </td>\n<td>\n                <p>\n                  10.5353 (8.07714s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.49678 (43.7564s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0381833s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.152912s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.766677s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (5.14976s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  11.0485 (0.421869s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.44037 (1.29063s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.18756 (3.21051s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.45216 (12.628s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_str\"></a><p class=\"title\"><b>Table 1.72. Operator str</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator str\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  1.47697 (0.000264092s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.87174 (0.000644609s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.28911 (0.00141073s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.92453 (0.00383604s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.61647 (0.0137593s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.87264 (0.0491109s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.29909 (0.171316s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.595522s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.73326 (0.00084634s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.78742 (0.000401216s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.68455 (0.00103815s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.30889 (0.00335647s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.000178807s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.000224466s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00061628s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.000778966s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00244981s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00486654s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0262254s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0398493s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  16.7304 (0.00299152s)\n                </p>\n              </td>\n<td>\n                <p>\n                  26.6015 (0.00597113s)\n                </p>\n              </td>\n<td>\n                <p>\n                  30.9815 (0.0190933s)\n                </p>\n              </td>\n<td>\n                <p>\n                  74.7467 (0.0582251s)\n                </p>\n              </td>\n<td>\n                <p>\n                  82.4773 (0.202054s)\n                </p>\n              </td>\n<td>\n                <p>\n                  154.996 (0.754295s)\n                </p>\n              </td>\n<td>\n                <p>\n                  107.534 (2.82013s)\n                </p>\n              </td>\n<td>\n                <p>\n                  279.178 (11.1251s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator8\"></a><p class=\"title\"><b>Table 1.73. Operator |</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator |\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  2.26845 (0.00991773s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.955 (0.00939722s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.01122 (0.012635s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.76421 (0.0152013s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.92162 (0.0293243s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0377549s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0916779s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.152323s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.00452 (0.0043918s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.37689 (0.00661838s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.3138 (0.00825362s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.71906 (0.0148123s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00437203s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00480677s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00628228s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00861647s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0152602s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.09283 (0.0365187s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.43832 (0.0920584s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.21204 (0.111118s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  1.69103 (0.00739324s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.85402 (0.00891185s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.78526 (0.0112155s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.86487 (0.0160686s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.75184 (0.0267336s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.44011 (0.0481236s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.33195 (0.0880424s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.33204 (0.213797s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.operator_int6\"></a><p class=\"title\"><b>Table 1.74. Operator |(int)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator |(int)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  2048 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  4096 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  8192 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  16384 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  2.11741 (0.00805945s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.16753 (0.0119795s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.5717 (0.012189s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.10016 (0.0134288s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.11289 (0.0309032s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0232284s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.042441s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0711061s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int(fixed)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00380628s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00552682s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00775532s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0122062s)\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp_int\n                </p>\n              </td>\n<td>\n                <p>\n                  2.62934 (0.010008s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.86878 (0.0103284s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.19589 (0.0247852s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.1073 (0.0135159s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0277685s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.67609 (0.0360071s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.76493 (0.0874534s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.72382 (0.115602s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath_int\n                </p>\n              </td>\n<td>\n                <p>\n                  22.0502 (0.0839291s)\n                </p>\n              </td>\n<td>\n                <p>\n                  18.6272 (0.102949s)\n                </p>\n              </td>\n<td>\n                <p>\n                  9.99323 (0.0775007s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.28905 (0.0767652s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.28821 (0.0913086s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.0968 (0.109494s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.47865 (0.150489s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.8474 (0.205729s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.integer_performance.platform\"></a><p class=\"title\"><b>Table 1.75. Platform Details</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Platform Details\">\n<colgroup>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n              </th>\n<th>\n                <p>\n                  Version\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  Compiler\n                </p>\n              </td>\n<td>\n                <p>\n                  GNU C++ version 10.3.0\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  GMP\n                </p>\n              </td>\n<td>\n                <p>\n                  6.2.0\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  MPFR\n                </p>\n              </td>\n<td>\n                <p>\n                  262146\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  Boost\n                </p>\n              </td>\n<td>\n                <p>\n                  107800\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  Run date\n                </p>\n              </td>\n<td>\n                <p>\n                  Sep 30 2021\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\">\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"float_performance.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../perf.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"rational_performance.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/perf/overhead.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>The Overhead in the Number Class Wrapper</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../perf.html\" title=\"Performance Comparison\">\n<link rel=\"prev\" href=\"../perf.html\" title=\"Performance Comparison\">\n<link rel=\"next\" href=\"realworld.html\" title=\"Floating-Point Real World Tests\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../perf.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../perf.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"realworld.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.perf.overhead\"></a><a class=\"link\" href=\"overhead.html\" title=\"The Overhead in the Number Class Wrapper\">The Overhead in the\n      Number Class Wrapper</a>\n</h3></div></div></div>\n<p>\n        Using a simple <a href=\"http://www.boost.org/doc/libs/release/libs/multiprecision/doc/html/../../performance/arithmetic_backend.hpp\" target=\"_top\">backend\n        class</a> that wraps any <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n        (built-in)</a> arithmetic type we can measure the overhead involved in\n        wrapping a type inside the <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n        frontend, and the effect that turning on expression templates has. The following\n        table compares the performance between <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>\n        and a <code class=\"computeroutput\"><span class=\"keyword\">double</span></code> wrapped inside\n        class <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>:\n      </p>\n<div class=\"table\">\n<a name=\"boost_multiprecision.perf.overhead.bessel_functions_16_digit_precis\"></a><p class=\"title\"><b>Table 1.12. Bessel Functions (16 digit precision)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Bessel Functions (16 digit precision)\">\n<colgroup>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Type\n                </p>\n              </th>\n<th>\n                <p>\n                  Time\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  arithmetic_backend&lt;double&gt;\n                </p>\n              </td>\n<td>\n                <p>\n                  2.09301 (0.00133409s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  arithmetic_backend&lt;double&gt; - no expression templates\n                </p>\n              </td>\n<td>\n                <p>\n                  1 (0.000637403s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  double\n                </p>\n              </td>\n<td>\n                <p>\n                  1.07956 (0.000688113s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><p>\n        As you can see whether or not there is an overhead, and how large it is depends\n        on the actual situation, but the overhead is in any cases small. Expression\n        templates generally add a greater overhead the more complex the expression\n        becomes due to the logic of figuring out how to best unpack and evaluate\n        the expression, but of course this is also the situation where you save more\n        temporaries. For a \"trivial\" backend like this, saving temporaries\n        has no benefit, but for larger types it becomes a bigger win.\n      </p>\n<p>\n        The following table compares arithmetic using either <code class=\"computeroutput\"><span class=\"keyword\">long</span>\n        <span class=\"keyword\">long</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">arithmetic_backend</span><span class=\"special\">&lt;</span><span class=\"keyword\">long</span> <span class=\"keyword\">long</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code> for the <a href=\"http://www.boost.org/doc/libs/release/libs/multiprecision/doc/html/../../performance/voronoi_performance.cpp\" target=\"_top\">voronoi-diagram\n        builder test</a>:\n      </p>\n<div class=\"informaltable\"><table class=\"table\">\n<colgroup>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Type\n                </p>\n              </th>\n<th>\n                <p>\n                  Relative time\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">int64_t</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1.0</strong></span>(0.0128646s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">arithmetic_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">int64_t</span><span class=\"special\">&gt;,</span>\n                  <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  1.005 (0.0129255s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n<p>\n        This test involves mainly creating a lot of temporaries and performing a\n        small amount of arithmetic on them, with very little difference in performance\n        between the native and \"wrapped\" types.\n      </p>\n<div class=\"table\">\n<a name=\"boost_multiprecision.perf.overhead.platform\"></a><p class=\"title\"><b>Table 1.13. Platform Details</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Platform Details\">\n<colgroup>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n              </th>\n<th>\n                <p>\n                  Version\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  Compiler\n                </p>\n              </td>\n<td>\n                <p>\n                  GNU C++ version 10.3.0\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  GMP\n                </p>\n              </td>\n<td>\n                <p>\n                  6.2.0\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  MPFR\n                </p>\n              </td>\n<td>\n                <p>\n                  262146\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  Boost\n                </p>\n              </td>\n<td>\n                <p>\n                  107800\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  Run date\n                </p>\n              </td>\n<td>\n                <p>\n                  Sep 30 2021\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\">\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../perf.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../perf.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"realworld.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/perf/rational_performance.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Rational Type Performance</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../perf.html\" title=\"Performance Comparison\">\n<link rel=\"prev\" href=\"integer_performance.html\" title=\"Integer Algorithm Performance\">\n<link rel=\"next\" href=\"../map.html\" title=\"Roadmap\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"integer_performance.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../perf.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../map.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.perf.rational_performance\"></a><a class=\"link\" href=\"rational_performance.html\" title=\"Rational Type Performance\">Rational\n      Type Performance</a>\n</h3></div></div></div>\n<p>\n        Note that these tests are carefully designed to test performance of the underlying\n        algorithms and not memory allocation or variable copying. As usual, performance\n        results should be taken with a healthy dose of scepticism, and real-world\n        performance may vary widely depending upon the specifics of the program.\n        In each table relative times are given first, with the best performer given\n        a score of 1. Total actual times are given in brackets, measured in seconds\n        for 500000 operations.\n      </p>\n<div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator\"></a><p class=\"title\"><b>Table 1.76. Operator *</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator *\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  2.00025 (0.797425s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.97726 (2.96998s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.86844 (6.73224s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.96608 (14.4259s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.398662s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (1.50207s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (3.60314s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (7.3374s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_int\"></a><p class=\"title\"><b>Table 1.77. Operator *(int)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator *(int)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  1.88073 (0.0637195s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.93184 (0.0917847s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.15609 (0.118274s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.4236 (0.218283s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0338803s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0475114s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0548556s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0900656s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_unsigned_long_long\"></a><p class=\"title\"><b>Table 1.78. Operator *(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator *(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  1.60877 (0.161844s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.33429 (0.240069s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.8835 (0.298935s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.70338 (0.448194s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.100601s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.102844s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.158713s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.16579s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_value_type\"></a><p class=\"title\"><b>Table 1.79. Operator *(value_type)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator *(value_type)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  1.97503 (0.408791s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.42069 (0.600225s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.65138 (0.803009s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.65673 (1.54645s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.20698s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.247956s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.302865s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.332089s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_unsigned_long_long0\"></a><p class=\"title\"><b>Table 1.80. Operator *=(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator *=(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  1.97207 (0.211848s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.18482 (0.226179s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.43682 (0.319695s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.69933 (0.485819s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.107424s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.103523s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.131194s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.179978s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_value_type0\"></a><p class=\"title\"><b>Table 1.81. Operator *=(value_type)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator *=(value_type)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  1.95211 (0.40255s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.60942 (0.629302s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.83854 (0.8029s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.34054 (1.37083s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.206213s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.241165s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.282857s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.31582s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator0\"></a><p class=\"title\"><b>Table 1.82. Operator +</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator +\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  2.20364 (0.415006s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.97574 (1.53458s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.75945 (3.41194s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.11634 (8.04044s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.188327s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.776716s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (1.93921s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (3.79923s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_int0\"></a><p class=\"title\"><b>Table 1.83. Operator +(int)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator +(int)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  2.06836 (0.0177811s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.80334 (0.0183744s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.38442 (0.020452s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.81894 (0.0449351s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00859669s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0101891s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.014773s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.024704s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_unsigned_long_long1\"></a><p class=\"title\"><b>Table 1.84. Operator +(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator +(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  2.07187 (0.0177151s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.3005 (0.0241089s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.81397 (0.0297836s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.72202 (0.046594s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0085503s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0104799s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.016419s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0270577s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_value_type1\"></a><p class=\"title\"><b>Table 1.85. Operator +(value_type)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator +(value_type)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  1.2805 (0.0265647s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.59353 (0.0391054s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.26613 (0.044067s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.95307 (0.105801s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0207456s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0245401s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0348044s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0541719s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_unsigned_long_long2\"></a><p class=\"title\"><b>Table 1.86. Operator +=(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator +=(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  7.29749 (0.0565983s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.77253 (0.0371419s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.72128 (0.0556987s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.01495 (0.0662456s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00775585s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00984535s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0204678s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.032877s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_value_type2\"></a><p class=\"title\"><b>Table 1.87. Operator +=(value_type)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator +=(value_type)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  1.92025 (0.0335896s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.08321 (0.0422867s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.587 (0.0564267s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.85357 (0.0840696s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0174923s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0202988s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0355556s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0453556s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator1\"></a><p class=\"title\"><b>Table 1.88. Operator -</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator -\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  2.38126 (0.471759s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.92631 (1.52484s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.76181 (3.49648s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.03462 (7.71926s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.198113s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.791584s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (1.98459s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (3.79396s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_int1\"></a><p class=\"title\"><b>Table 1.89. Operator -(int)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator -(int)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  2.44447 (0.0292894s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.54602 (0.0346718s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.4869 (0.035503s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.95344 (0.0577029s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0119819s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.013618s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0238773s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0295391s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_unsigned_long_long3\"></a><p class=\"title\"><b>Table 1.90. Operator -(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator -(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  2.93654 (0.0296698s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4.23087 (0.0496956s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.68041 (0.0461985s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.4455 (0.0581714s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0101037s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0117459s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0274924s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.040243s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_value_type3\"></a><p class=\"title\"><b>Table 1.91. Operator -(value_type)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator -(value_type)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  1.69242 (0.0408789s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.5205 (0.0467416s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.31525 (0.0548939s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.16115 (0.103471s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0241541s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.030741s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0417365s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0478777s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_unsigned_long_long4\"></a><p class=\"title\"><b>Table 1.92. Operator -=(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator -=(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  3.69509 (0.0366534s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.7306 (0.0439181s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.8352 (0.0491612s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.86662 (0.071761s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00991947s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0117724s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0267879s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0384444s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_value_type4\"></a><p class=\"title\"><b>Table 1.93. Operator -=(value_type)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator -=(value_type)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  1.76299 (0.0421283s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.03803 (0.0490152s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.84864 (0.053198s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.10533 (0.0881228s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.023896s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0240502s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0287769s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.041857s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator2\"></a><p class=\"title\"><b>Table 1.94. Operator /</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator /\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  2.03433 (2.28881s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.24309 (6.34454s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.1203 (13.2036s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.36142 (29.3236s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (1.12509s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (2.82848s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (6.22726s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (12.4178s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_int2\"></a><p class=\"title\"><b>Table 1.95. Operator /(int)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator /(int)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.035134s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.08556 (0.0774619s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.08797 (0.104628s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.29134 (0.207067s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  1.85049 (0.0650149s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0713565s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0961679s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.16035s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_unsigned_long_long5\"></a><p class=\"title\"><b>Table 1.96. Operator /(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator /(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  1.31397 (0.170727s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.63747 (0.216019s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.68581 (0.292536s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.76695 (0.435259s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.129932s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.131923s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.173528s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.246334s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_value_type5\"></a><p class=\"title\"><b>Table 1.97. Operator /(value_type)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator /(value_type)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  1.82473 (0.431612s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.20261 (0.596248s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.45848 (0.809662s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.88675 (1.38001s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.236534s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.270701s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.329335s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.355055s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_unsigned_long_long6\"></a><p class=\"title\"><b>Table 1.98. Operator /=(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator /=(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  1.58868 (0.216252s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.71288 (0.235781s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.78218 (0.314161s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.98715 (0.460033s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.136121s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.137652s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.176279s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.231505s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_value_type6\"></a><p class=\"title\"><b>Table 1.99. Operator /=(value_type)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator /=(value_type)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  1.72896 (0.40369s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.55949 (0.689514s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.4929 (0.832288s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.51238 (1.37478s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.233487s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.269395s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.333863s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.391409s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_construct\"></a><p class=\"title\"><b>Table 1.100. Operator construct</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator construct\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0135822s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00935293s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0083784s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00962697s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  1.44264 (0.0195942s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.18249 (0.0204126s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.64725 (0.0221797s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.87767 (0.0277033s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_construct_unsigned_long\"></a><p class=\"title\"><b>Table 1.101. Operator construct(unsigned long long)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator construct(unsigned long long)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00806026s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00960336s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00769898s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0176689s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  4.87225 (0.0392716s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.91987 (0.0568506s)\n                </p>\n              </td>\n<td>\n                <p>\n                  9.03811 (0.0695842s)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.68339 (0.0650815s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_construct_unsigned\"></a><p class=\"title\"><b>Table 1.102. Operator construct(unsigned)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator construct(unsigned)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00672081s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.0064826s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00618635s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00923644s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  6.47138 (0.0434929s)\n                </p>\n              </td>\n<td>\n                <p>\n                  7.48645 (0.0485316s)\n                </p>\n              </td>\n<td>\n                <p>\n                  8.2942 (0.0513108s)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.77363 (0.0533278s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.operator_str\"></a><p class=\"title\"><b>Table 1.103. Operator str</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Operator str\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  128 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  256 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  512 Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  1024 Bits\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  6.17439 (0.00168424s)\n                </p>\n              </td>\n<td>\n                <p>\n                  7.6748 (0.0033367s)\n                </p>\n              </td>\n<td>\n                <p>\n                  6.38435 (0.00662873s)\n                </p>\n              </td>\n<td>\n                <p>\n                  9.07696 (0.0174979s)\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpq_rational\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.000272779s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.000434761s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00103828s)\n                </p>\n              </td>\n<td>\n                <p>\n                  <span class=\"bold\"><strong>1</strong></span> (0.00192772s)\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_performance.platform\"></a><p class=\"title\"><b>Table 1.104. Platform Details</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Platform Details\">\n<colgroup>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n              </th>\n<th>\n                <p>\n                  Version\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  Compiler\n                </p>\n              </td>\n<td>\n                <p>\n                  GNU C++ version 10.3.0\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  GMP\n                </p>\n              </td>\n<td>\n                <p>\n                  6.2.0\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  MPFR\n                </p>\n              </td>\n<td>\n                <p>\n                  262146\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  Boost\n                </p>\n              </td>\n<td>\n                <p>\n                  107800\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  Run date\n                </p>\n              </td>\n<td>\n                <p>\n                  Sep 30 2021\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\">\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"integer_performance.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../perf.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../map.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/perf/rational_real_world.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Rational Real World Tests</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../perf.html\" title=\"Performance Comparison\">\n<link rel=\"prev\" href=\"int_real_world.html\" title=\"Integer Real World Tests\">\n<link rel=\"next\" href=\"float_performance.html\" title=\"Float Algorithm Performance\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"int_real_world.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../perf.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"float_performance.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.perf.rational_real_world\"></a><a class=\"link\" href=\"rational_real_world.html\" title=\"Rational Real World Tests\">Rational\n      Real World Tests</a>\n</h3></div></div></div>\n<p>\n        The first set of <a href=\"http://www.boost.org/doc/libs/release/libs/multiprecision/doc/html/../../performance/rational_bernoulli_bench.cpp\" target=\"_top\">tests</a>\n        measure the times taken to calculate the n'th Bernoulli number via mixed\n        rational/integer arithmetic to give an exact rational result.\n      </p>\n<div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_real_world.relative_times_taken_to_calculat\"></a><p class=\"title\"><b>Table 1.18. Relative times taken to calculate Bm</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Relative times taken to calculate Bm\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  m\n                </p>\n              </th>\n<th>\n                <p>\n                  cpp_rational (time in seconds)\n                </p>\n              </th>\n<th>\n                <p>\n                  mpq_rational (time relative to cpp_rational)\n                </p>\n              </th>\n<th>\n                <p>\n                  mpq_class (time relative to cpp_rational)\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  50\n                </p>\n              </td>\n<td>\n                <p>\n                  1.888453\n                </p>\n              </td>\n<td>\n                <p>\n                  1.7317576874\n                </p>\n              </td>\n<td>\n                <p>\n                  1.893438174\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  54\n                </p>\n              </td>\n<td>\n                <p>\n                  2.250503\n                </p>\n              </td>\n<td>\n                <p>\n                  2.1519411438\n                </p>\n              </td>\n<td>\n                <p>\n                  2.4936252029\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  58\n                </p>\n              </td>\n<td>\n                <p>\n                  2.734527\n                </p>\n              </td>\n<td>\n                <p>\n                  2.2056805437\n                </p>\n              </td>\n<td>\n                <p>\n                  1.9866752093\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  62\n                </p>\n              </td>\n<td>\n                <p>\n                  3.318122\n                </p>\n              </td>\n<td>\n                <p>\n                  2.5182796172\n                </p>\n              </td>\n<td>\n                <p>\n                  2.2662876772\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  66\n                </p>\n              </td>\n<td>\n                <p>\n                  3.887281\n                </p>\n              </td>\n<td>\n                <p>\n                  2.4263077457\n                </p>\n              </td>\n<td>\n                <p>\n                  2.588347485\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  70\n                </p>\n              </td>\n<td>\n                <p>\n                  4.628535\n                </p>\n              </td>\n<td>\n                <p>\n                  1.9756346231\n                </p>\n              </td>\n<td>\n                <p>\n                  2.5367158291\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  74\n                </p>\n              </td>\n<td>\n                <p>\n                  5.3541\n                </p>\n              </td>\n<td>\n                <p>\n                  1.7052929531\n                </p>\n              </td>\n<td>\n                <p>\n                  2.3345854579\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  78\n                </p>\n              </td>\n<td>\n                <p>\n                  6.321172\n                </p>\n              </td>\n<td>\n                <p>\n                  1.6669601776\n                </p>\n              </td>\n<td>\n                <p>\n                  2.0390342171\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  82\n                </p>\n              </td>\n<td>\n                <p>\n                  7.13052\n                </p>\n              </td>\n<td>\n                <p>\n                  1.7689101216\n                </p>\n              </td>\n<td>\n                <p>\n                  1.9837833706\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  86\n                </p>\n              </td>\n<td>\n                <p>\n                  8.390095\n                </p>\n              </td>\n<td>\n                <p>\n                  1.6245518078\n                </p>\n              </td>\n<td>\n                <p>\n                  1.5785492298\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  90\n                </p>\n              </td>\n<td>\n                <p>\n                  10.62176\n                </p>\n              </td>\n<td>\n                <p>\n                  1.6294440846\n                </p>\n              </td>\n<td>\n                <p>\n                  1.5779053566\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  94\n                </p>\n              </td>\n<td>\n                <p>\n                  11.364409\n                </p>\n              </td>\n<td>\n                <p>\n                  1.5786845581\n                </p>\n              </td>\n<td>\n                <p>\n                  1.5614997665\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  98\n                </p>\n              </td>\n<td>\n                <p>\n                  14.030636\n                </p>\n              </td>\n<td>\n                <p>\n                  1.2616490799\n                </p>\n              </td>\n<td>\n                <p>\n                  1.4799734666\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  102\n                </p>\n              </td>\n<td>\n                <p>\n                  15.268211\n                </p>\n              </td>\n<td>\n                <p>\n                  1.6145657798\n                </p>\n              </td>\n<td>\n                <p>\n                  1.6128342738\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  106\n                </p>\n              </td>\n<td>\n                <p>\n                  15.253028\n                </p>\n              </td>\n<td>\n                <p>\n                  1.8985381788\n                </p>\n              </td>\n<td>\n                <p>\n                  1.8206293859\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  110\n                </p>\n              </td>\n<td>\n                <p>\n                  17.637756\n                </p>\n              </td>\n<td>\n                <p>\n                  1.8283953469\n                </p>\n              </td>\n<td>\n                <p>\n                  1.6559522084\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  114\n                </p>\n              </td>\n<td>\n                <p>\n                  18.335007\n                </p>\n              </td>\n<td>\n                <p>\n                  1.8018346543\n                </p>\n              </td>\n<td>\n                <p>\n                  1.8343225612\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  118\n                </p>\n              </td>\n<td>\n                <p>\n                  21.044146\n                </p>\n              </td>\n<td>\n                <p>\n                  2.0462015897\n                </p>\n              </td>\n<td>\n                <p>\n                  1.8106934346\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  122\n                </p>\n              </td>\n<td>\n                <p>\n                  23.71295\n                </p>\n              </td>\n<td>\n                <p>\n                  2.0041556196\n                </p>\n              </td>\n<td>\n                <p>\n                  1.7127701108\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  126\n                </p>\n              </td>\n<td>\n                <p>\n                  25.993901\n                </p>\n              </td>\n<td>\n                <p>\n                  1.9901613075\n                </p>\n              </td>\n<td>\n                <p>\n                  1.6974264848\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  130\n                </p>\n              </td>\n<td>\n                <p>\n                  30.17278\n                </p>\n              </td>\n<td>\n                <p>\n                  1.8897211328\n                </p>\n              </td>\n<td>\n                <p>\n                  1.6405006433\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  134\n                </p>\n              </td>\n<td>\n                <p>\n                  43.992333\n                </p>\n              </td>\n<td>\n                <p>\n                  1.2223514038\n                </p>\n              </td>\n<td>\n                <p>\n                  1.2232961594\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  138\n                </p>\n              </td>\n<td>\n                <p>\n                  40.702777\n                </p>\n              </td>\n<td>\n                <p>\n                  1.3551305848\n                </p>\n              </td>\n<td>\n                <p>\n                  1.492072224\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  142\n                </p>\n              </td>\n<td>\n                <p>\n                  47.01495\n                </p>\n              </td>\n<td>\n                <p>\n                  1.4361410785\n                </p>\n              </td>\n<td>\n                <p>\n                  1.4005683724\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  146\n                </p>\n              </td>\n<td>\n                <p>\n                  51.468592\n                </p>\n              </td>\n<td>\n                <p>\n                  1.4279172043\n                </p>\n              </td>\n<td>\n                <p>\n                  1.4072223891\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  150\n                </p>\n              </td>\n<td>\n                <p>\n                  70.736106\n                </p>\n              </td>\n<td>\n                <p>\n                  1.3628087048\n                </p>\n              </td>\n<td>\n                <p>\n                  1.2309294917\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  154\n                </p>\n              </td>\n<td>\n                <p>\n                  74.638691\n                </p>\n              </td>\n<td>\n                <p>\n                  1.2509392749\n                </p>\n              </td>\n<td>\n                <p>\n                  1.2846060497\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  158\n                </p>\n              </td>\n<td>\n                <p>\n                  76.642396\n                </p>\n              </td>\n<td>\n                <p>\n                  1.3383691449\n                </p>\n              </td>\n<td>\n                <p>\n                  1.2555573941\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  162\n                </p>\n              </td>\n<td>\n                <p>\n                  104.906795\n                </p>\n              </td>\n<td>\n                <p>\n                  1.1722665057\n                </p>\n              </td>\n<td>\n                <p>\n                  1.0121124375\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  166\n                </p>\n              </td>\n<td>\n                <p>\n                  108.175914\n                </p>\n              </td>\n<td>\n                <p>\n                  0.9272805682\n                </p>\n              </td>\n<td>\n                <p>\n                  1.2472813403\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  170\n                </p>\n              </td>\n<td>\n                <p>\n                  125.363885\n                </p>\n              </td>\n<td>\n                <p>\n                  0.8114005082\n                </p>\n              </td>\n<td>\n                <p>\n                  1.1349673712\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  174\n                </p>\n              </td>\n<td>\n                <p>\n                  119.813754\n                </p>\n              </td>\n<td>\n                <p>\n                  0.9747547014\n                </p>\n              </td>\n<td>\n                <p>\n                  1.5677900135\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  178\n                </p>\n              </td>\n<td>\n                <p>\n                  130.672631\n                </p>\n              </td>\n<td>\n                <p>\n                  0.904429444\n                </p>\n              </td>\n<td>\n                <p>\n                  1.6089208382\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  182\n                </p>\n              </td>\n<td>\n                <p>\n                  136.002124\n                </p>\n              </td>\n<td>\n                <p>\n                  0.8359445107\n                </p>\n              </td>\n<td>\n                <p>\n                  1.3173987636\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  186\n                </p>\n              </td>\n<td>\n                <p>\n                  152.169271\n                </p>\n              </td>\n<td>\n                <p>\n                  0.7919228515\n                </p>\n              </td>\n<td>\n                <p>\n                  1.3523570012\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  190\n                </p>\n              </td>\n<td>\n                <p>\n                  149.444035\n                </p>\n              </td>\n<td>\n                <p>\n                  0.8353259734\n                </p>\n              </td>\n<td>\n                <p>\n                  1.4571606823\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  194\n                </p>\n              </td>\n<td>\n                <p>\n                  149.609183\n                </p>\n              </td>\n<td>\n                <p>\n                  0.8898088896\n                </p>\n              </td>\n<td>\n                <p>\n                  1.6132629038\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  198\n                </p>\n              </td>\n<td>\n                <p>\n                  167.594528\n                </p>\n              </td>\n<td>\n                <p>\n                  0.8947434429\n                </p>\n              </td>\n<td>\n                <p>\n                  1.326461858\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><p>\n        In this use case, most the of the rational numbers are fairly small and so\n        the times taken are dominated by the number of allocations performed. The\n        following table illustrates how well each type performs on suppressing allocations:\n      </p>\n<div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_real_world.total_allocation_counts_for_bern\"></a><p class=\"title\"><b>Table 1.19. Total Allocation Counts for Bernoulli Number Calculation</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Total Allocation Counts for Bernoulli Number Calculation\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  m\n                </p>\n              </th>\n<th>\n                <p>\n                  cpp_rational\n                </p>\n              </th>\n<th>\n                <p>\n                  mpq_rational\n                </p>\n              </th>\n<th>\n                <p>\n                  mpq_class\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  2\n                </p>\n              </td>\n<td>\n                <p>\n                  0\n                </p>\n              </td>\n<td>\n                <p>\n                  77\n                </p>\n              </td>\n<td>\n                <p>\n                  101\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  4\n                </p>\n              </td>\n<td>\n                <p>\n                  0\n                </p>\n              </td>\n<td>\n                <p>\n                  187\n                </p>\n              </td>\n<td>\n                <p>\n                  252\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  6\n                </p>\n              </td>\n<td>\n                <p>\n                  0\n                </p>\n              </td>\n<td>\n                <p>\n                  345\n                </p>\n              </td>\n<td>\n                <p>\n                  471\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  8\n                </p>\n              </td>\n<td>\n                <p>\n                  0\n                </p>\n              </td>\n<td>\n                <p>\n                  551\n                </p>\n              </td>\n<td>\n                <p>\n                  758\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  10\n                </p>\n              </td>\n<td>\n                <p>\n                  0\n                </p>\n              </td>\n<td>\n                <p>\n                  805\n                </p>\n              </td>\n<td>\n                <p>\n                  1113\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  12\n                </p>\n              </td>\n<td>\n                <p>\n                  0\n                </p>\n              </td>\n<td>\n                <p>\n                  1107\n                </p>\n              </td>\n<td>\n                <p>\n                  1536\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  14\n                </p>\n              </td>\n<td>\n                <p>\n                  0\n                </p>\n              </td>\n<td>\n                <p>\n                  1457\n                </p>\n              </td>\n<td>\n                <p>\n                  2027\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  16\n                </p>\n              </td>\n<td>\n                <p>\n                  0\n                </p>\n              </td>\n<td>\n                <p>\n                  1857\n                </p>\n              </td>\n<td>\n                <p>\n                  2587\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  18\n                </p>\n              </td>\n<td>\n                <p>\n                  0\n                </p>\n              </td>\n<td>\n                <p>\n                  2336\n                </p>\n              </td>\n<td>\n                <p>\n                  3216\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  20\n                </p>\n              </td>\n<td>\n                <p>\n                  0\n                </p>\n              </td>\n<td>\n                <p>\n                  2885\n                </p>\n              </td>\n<td>\n                <p>\n                  3913\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  22\n                </p>\n              </td>\n<td>\n                <p>\n                  6\n                </p>\n              </td>\n<td>\n                <p>\n                  3511\n                </p>\n              </td>\n<td>\n                <p>\n                  4706\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  24\n                </p>\n              </td>\n<td>\n                <p>\n                  22\n                </p>\n              </td>\n<td>\n                <p>\n                  4203\n                </p>\n              </td>\n<td>\n                <p>\n                  5600\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  26\n                </p>\n              </td>\n<td>\n                <p>\n                  83\n                </p>\n              </td>\n<td>\n                <p>\n                  4963\n                </p>\n              </td>\n<td>\n                <p>\n                  6575\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  28\n                </p>\n              </td>\n<td>\n                <p>\n                  377\n                </p>\n              </td>\n<td>\n                <p>\n                  5806\n                </p>\n              </td>\n<td>\n                <p>\n                  7632\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  30\n                </p>\n              </td>\n<td>\n                <p>\n                  780\n                </p>\n              </td>\n<td>\n                <p>\n                  6738\n                </p>\n              </td>\n<td>\n                <p>\n                  8769\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  32\n                </p>\n              </td>\n<td>\n                <p>\n                  1454\n                </p>\n              </td>\n<td>\n                <p>\n                  7771\n                </p>\n              </td>\n<td>\n                <p>\n                  9988\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  34\n                </p>\n              </td>\n<td>\n                <p>\n                  2001\n                </p>\n              </td>\n<td>\n                <p>\n                  9357\n                </p>\n              </td>\n<td>\n                <p>\n                  11289\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  36\n                </p>\n              </td>\n<td>\n                <p>\n                  2789\n                </p>\n              </td>\n<td>\n                <p>\n                  10598\n                </p>\n              </td>\n<td>\n                <p>\n                  12704\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  38\n                </p>\n              </td>\n<td>\n                <p>\n                  3669\n                </p>\n              </td>\n<td>\n                <p>\n                  11948\n                </p>\n              </td>\n<td>\n                <p>\n                  14252\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  40\n                </p>\n              </td>\n<td>\n                <p>\n                  4653\n                </p>\n              </td>\n<td>\n                <p>\n                  13403\n                </p>\n              </td>\n<td>\n                <p>\n                  15891\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  42\n                </p>\n              </td>\n<td>\n                <p>\n                  5923\n                </p>\n              </td>\n<td>\n                <p>\n                  14976\n                </p>\n              </td>\n<td>\n                <p>\n                  17620\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  44\n                </p>\n              </td>\n<td>\n                <p>\n                  7379\n                </p>\n              </td>\n<td>\n                <p>\n                  16622\n                </p>\n              </td>\n<td>\n                <p>\n                  19449\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  46\n                </p>\n              </td>\n<td>\n                <p>\n                  8839\n                </p>\n              </td>\n<td>\n                <p>\n                  18367\n                </p>\n              </td>\n<td>\n                <p>\n                  21367\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  48\n                </p>\n              </td>\n<td>\n                <p>\n                  10296\n                </p>\n              </td>\n<td>\n                <p>\n                  20227\n                </p>\n              </td>\n<td>\n                <p>\n                  23431\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  50\n                </p>\n              </td>\n<td>\n                <p>\n                  12045\n                </p>\n              </td>\n<td>\n                <p>\n                  22857\n                </p>\n              </td>\n<td>\n                <p>\n                  25646\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  52\n                </p>\n              </td>\n<td>\n                <p>\n                  13603\n                </p>\n              </td>\n<td>\n                <p>\n                  25044\n                </p>\n              </td>\n<td>\n                <p>\n                  27962\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  54\n                </p>\n              </td>\n<td>\n                <p>\n                  15276\n                </p>\n              </td>\n<td>\n                <p>\n                  27331\n                </p>\n              </td>\n<td>\n                <p>\n                  30389\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  56\n                </p>\n              </td>\n<td>\n                <p>\n                  17239\n                </p>\n              </td>\n<td>\n                <p>\n                  29749\n                </p>\n              </td>\n<td>\n                <p>\n                  32919\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  58\n                </p>\n              </td>\n<td>\n                <p>\n                  19337\n                </p>\n              </td>\n<td>\n                <p>\n                  32257\n                </p>\n              </td>\n<td>\n                <p>\n                  35552\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  60\n                </p>\n              </td>\n<td>\n                <p>\n                  21409\n                </p>\n              </td>\n<td>\n                <p>\n                  34958\n                </p>\n              </td>\n<td>\n                <p>\n                  38417\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  62\n                </p>\n              </td>\n<td>\n                <p>\n                  23694\n                </p>\n              </td>\n<td>\n                <p>\n                  37800\n                </p>\n              </td>\n<td>\n                <p>\n                  41396\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  64\n                </p>\n              </td>\n<td>\n                <p>\n                  27923\n                </p>\n              </td>\n<td>\n                <p>\n                  39556\n                </p>\n              </td>\n<td>\n                <p>\n                  44498\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  66\n                </p>\n              </td>\n<td>\n                <p>\n                  30240\n                </p>\n              </td>\n<td>\n                <p>\n                  44706\n                </p>\n              </td>\n<td>\n                <p>\n                  47711\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  68\n                </p>\n              </td>\n<td>\n                <p>\n                  32566\n                </p>\n              </td>\n<td>\n                <p>\n                  47934\n                </p>\n              </td>\n<td>\n                <p>\n                  51042\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  70\n                </p>\n              </td>\n<td>\n                <p>\n                  35019\n                </p>\n              </td>\n<td>\n                <p>\n                  51417\n                </p>\n              </td>\n<td>\n                <p>\n                  54637\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  72\n                </p>\n              </td>\n<td>\n                <p>\n                  37460\n                </p>\n              </td>\n<td>\n                <p>\n                  55047\n                </p>\n              </td>\n<td>\n                <p>\n                  58363\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  74\n                </p>\n              </td>\n<td>\n                <p>\n                  40282\n                </p>\n              </td>\n<td>\n                <p>\n                  58777\n                </p>\n              </td>\n<td>\n                <p>\n                  62211\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  76\n                </p>\n              </td>\n<td>\n                <p>\n                  42914\n                </p>\n              </td>\n<td>\n                <p>\n                  62691\n                </p>\n              </td>\n<td>\n                <p>\n                  66183\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  78\n                </p>\n              </td>\n<td>\n                <p>\n                  45752\n                </p>\n              </td>\n<td>\n                <p>\n                  66694\n                </p>\n              </td>\n<td>\n                <p>\n                  70296\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  80\n                </p>\n              </td>\n<td>\n                <p>\n                  48681\n                </p>\n              </td>\n<td>\n                <p>\n                  70905\n                </p>\n              </td>\n<td>\n                <p>\n                  74620\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  82\n                </p>\n              </td>\n<td>\n                <p>\n                  51986\n                </p>\n              </td>\n<td>\n                <p>\n                  77633\n                </p>\n              </td>\n<td>\n                <p>\n                  79160\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  84\n                </p>\n              </td>\n<td>\n                <p>\n                  54855\n                </p>\n              </td>\n<td>\n                <p>\n                  82364\n                </p>\n              </td>\n<td>\n                <p>\n                  83842\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  86\n                </p>\n              </td>\n<td>\n                <p>\n                  59032\n                </p>\n              </td>\n<td>\n                <p>\n                  87239\n                </p>\n              </td>\n<td>\n                <p>\n                  88659\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  88\n                </p>\n              </td>\n<td>\n                <p>\n                  63595\n                </p>\n              </td>\n<td>\n                <p>\n                  92256\n                </p>\n              </td>\n<td>\n                <p>\n                  93618\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  90\n                </p>\n              </td>\n<td>\n                <p>\n                  68352\n                </p>\n              </td>\n<td>\n                <p>\n                  97486\n                </p>\n              </td>\n<td>\n                <p>\n                  98820\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  92\n                </p>\n              </td>\n<td>\n                <p>\n                  72446\n                </p>\n              </td>\n<td>\n                <p>\n                  102974\n                </p>\n              </td>\n<td>\n                <p>\n                  104256\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  94\n                </p>\n              </td>\n<td>\n                <p>\n                  76468\n                </p>\n              </td>\n<td>\n                <p>\n                  108620\n                </p>\n              </td>\n<td>\n                <p>\n                  109844\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  96\n                </p>\n              </td>\n<td>\n                <p>\n                  80361\n                </p>\n              </td>\n<td>\n                <p>\n                  111109\n                </p>\n              </td>\n<td>\n                <p>\n                  115594\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  98\n                </p>\n              </td>\n<td>\n                <p>\n                  84783\n                </p>\n              </td>\n<td>\n                <p>\n                  121460\n                </p>\n              </td>\n<td>\n                <p>\n                  121486\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  100\n                </p>\n              </td>\n<td>\n                <p>\n                  89044\n                </p>\n              </td>\n<td>\n                <p>\n                  127730\n                </p>\n              </td>\n<td>\n                <p>\n                  127633\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  102\n                </p>\n              </td>\n<td>\n                <p>\n                  93561\n                </p>\n              </td>\n<td>\n                <p>\n                  134241\n                </p>\n              </td>\n<td>\n                <p>\n                  134050\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  104\n                </p>\n              </td>\n<td>\n                <p>\n                  98452\n                </p>\n              </td>\n<td>\n                <p>\n                  140919\n                </p>\n              </td>\n<td>\n                <p>\n                  140616\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  106\n                </p>\n              </td>\n<td>\n                <p>\n                  103530\n                </p>\n              </td>\n<td>\n                <p>\n                  147763\n                </p>\n              </td>\n<td>\n                <p>\n                  147364\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  108\n                </p>\n              </td>\n<td>\n                <p>\n                  108326\n                </p>\n              </td>\n<td>\n                <p>\n                  154804\n                </p>\n              </td>\n<td>\n                <p>\n                  154276\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  110\n                </p>\n              </td>\n<td>\n                <p>\n                  113891\n                </p>\n              </td>\n<td>\n                <p>\n                  162184\n                </p>\n              </td>\n<td>\n                <p>\n                  161562\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  112\n                </p>\n              </td>\n<td>\n                <p>\n                  119213\n                </p>\n              </td>\n<td>\n                <p>\n                  169736\n                </p>\n              </td>\n<td>\n                <p>\n                  169038\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  114\n                </p>\n              </td>\n<td>\n                <p>\n                  124770\n                </p>\n              </td>\n<td>\n                <p>\n                  182417\n                </p>\n              </td>\n<td>\n                <p>\n                  176693\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  116\n                </p>\n              </td>\n<td>\n                <p>\n                  130624\n                </p>\n              </td>\n<td>\n                <p>\n                  190589\n                </p>\n              </td>\n<td>\n                <p>\n                  184519\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  118\n                </p>\n              </td>\n<td>\n                <p>\n                  137941\n                </p>\n              </td>\n<td>\n                <p>\n                  198975\n                </p>\n              </td>\n<td>\n                <p>\n                  192525\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  120\n                </p>\n              </td>\n<td>\n                <p>\n                  144829\n                </p>\n              </td>\n<td>\n                <p>\n                  207759\n                </p>\n              </td>\n<td>\n                <p>\n                  200952\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  122\n                </p>\n              </td>\n<td>\n                <p>\n                  152045\n                </p>\n              </td>\n<td>\n                <p>\n                  216736\n                </p>\n              </td>\n<td>\n                <p>\n                  209561\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  124\n                </p>\n              </td>\n<td>\n                <p>\n                  158610\n                </p>\n              </td>\n<td>\n                <p>\n                  225905\n                </p>\n              </td>\n<td>\n                <p>\n                  218371\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  126\n                </p>\n              </td>\n<td>\n                <p>\n                  165383\n                </p>\n              </td>\n<td>\n                <p>\n                  235283\n                </p>\n              </td>\n<td>\n                <p>\n                  227360\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  128\n                </p>\n              </td>\n<td>\n                <p>\n                  173971\n                </p>\n              </td>\n<td>\n                <p>\n                  230678\n                </p>\n              </td>\n<td>\n                <p>\n                  236670\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  130\n                </p>\n              </td>\n<td>\n                <p>\n                  181696\n                </p>\n              </td>\n<td>\n                <p>\n                  248593\n                </p>\n              </td>\n<td>\n                <p>\n                  246308\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  132\n                </p>\n              </td>\n<td>\n                <p>\n                  189310\n                </p>\n              </td>\n<td>\n                <p>\n                  258615\n                </p>\n              </td>\n<td>\n                <p>\n                  256148\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  134\n                </p>\n              </td>\n<td>\n                <p>\n                  197708\n                </p>\n              </td>\n<td>\n                <p>\n                  268800\n                </p>\n              </td>\n<td>\n                <p>\n                  266192\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  136\n                </p>\n              </td>\n<td>\n                <p>\n                  205800\n                </p>\n              </td>\n<td>\n                <p>\n                  279215\n                </p>\n              </td>\n<td>\n                <p>\n                  276436\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  138\n                </p>\n              </td>\n<td>\n                <p>\n                  212940\n                </p>\n              </td>\n<td>\n                <p>\n                  290112\n                </p>\n              </td>\n<td>\n                <p>\n                  287167\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  140\n                </p>\n              </td>\n<td>\n                <p>\n                  217502\n                </p>\n              </td>\n<td>\n                <p>\n                  301235\n                </p>\n              </td>\n<td>\n                <p>\n                  298101\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  142\n                </p>\n              </td>\n<td>\n                <p>\n                  223486\n                </p>\n              </td>\n<td>\n                <p>\n                  312564\n                </p>\n              </td>\n<td>\n                <p>\n                  309243\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  144\n                </p>\n              </td>\n<td>\n                <p>\n                  229579\n                </p>\n              </td>\n<td>\n                <p>\n                  324133\n                </p>\n              </td>\n<td>\n                <p>\n                  320605\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  146\n                </p>\n              </td>\n<td>\n                <p>\n                  237213\n                </p>\n              </td>\n<td>\n                <p>\n                  344671\n                </p>\n              </td>\n<td>\n                <p>\n                  332333\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  148\n                </p>\n              </td>\n<td>\n                <p>\n                  248799\n                </p>\n              </td>\n<td>\n                <p>\n                  357200\n                </p>\n              </td>\n<td>\n                <p>\n                  344420\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  150\n                </p>\n              </td>\n<td>\n                <p>\n                  261345\n                </p>\n              </td>\n<td>\n                <p>\n                  369947\n                </p>\n              </td>\n<td>\n                <p>\n                  356745\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  152\n                </p>\n              </td>\n<td>\n                <p>\n                  272741\n                </p>\n              </td>\n<td>\n                <p>\n                  382909\n                </p>\n              </td>\n<td>\n                <p>\n                  369279\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  154\n                </p>\n              </td>\n<td>\n                <p>\n                  283982\n                </p>\n              </td>\n<td>\n                <p>\n                  396162\n                </p>\n              </td>\n<td>\n                <p>\n                  382048\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  156\n                </p>\n              </td>\n<td>\n                <p>\n                  293626\n                </p>\n              </td>\n<td>\n                <p>\n                  409993\n                </p>\n              </td>\n<td>\n                <p>\n                  395353\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  158\n                </p>\n              </td>\n<td>\n                <p>\n                  304036\n                </p>\n              </td>\n<td>\n                <p>\n                  424022\n                </p>\n              </td>\n<td>\n                <p>\n                  408907\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  160\n                </p>\n              </td>\n<td>\n                <p>\n                  313869\n                </p>\n              </td>\n<td>\n                <p>\n                  427747\n                </p>\n              </td>\n<td>\n                <p>\n                  422690\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  162\n                </p>\n              </td>\n<td>\n                <p>\n                  323626\n                </p>\n              </td>\n<td>\n                <p>\n                  454723\n                </p>\n              </td>\n<td>\n                <p>\n                  436715\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  164\n                </p>\n              </td>\n<td>\n                <p>\n                  333294\n                </p>\n              </td>\n<td>\n                <p>\n                  469863\n                </p>\n              </td>\n<td>\n                <p>\n                  451304\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  166\n                </p>\n              </td>\n<td>\n                <p>\n                  343072\n                </p>\n              </td>\n<td>\n                <p>\n                  485238\n                </p>\n              </td>\n<td>\n                <p>\n                  466149\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  168\n                </p>\n              </td>\n<td>\n                <p>\n                  352236\n                </p>\n              </td>\n<td>\n                <p>\n                  500922\n                </p>\n              </td>\n<td>\n                <p>\n                  481221\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  170\n                </p>\n              </td>\n<td>\n                <p>\n                  362793\n                </p>\n              </td>\n<td>\n                <p>\n                  516840\n                </p>\n              </td>\n<td>\n                <p>\n                  496561\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  172\n                </p>\n              </td>\n<td>\n                <p>\n                  372645\n                </p>\n              </td>\n<td>\n                <p>\n                  533169\n                </p>\n              </td>\n<td>\n                <p>\n                  512315\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  174\n                </p>\n              </td>\n<td>\n                <p>\n                  382908\n                </p>\n              </td>\n<td>\n                <p>\n                  549962\n                </p>\n              </td>\n<td>\n                <p>\n                  528510\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  176\n                </p>\n              </td>\n<td>\n                <p>\n                  392507\n                </p>\n              </td>\n<td>\n                <p>\n                  567018\n                </p>\n              </td>\n<td>\n                <p>\n                  544947\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  178\n                </p>\n              </td>\n<td>\n                <p>\n                  404163\n                </p>\n              </td>\n<td>\n                <p>\n                  597694\n                </p>\n              </td>\n<td>\n                <p>\n                  561666\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  180\n                </p>\n              </td>\n<td>\n                <p>\n                  417539\n                </p>\n              </td>\n<td>\n                <p>\n                  615615\n                </p>\n              </td>\n<td>\n                <p>\n                  578647\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  182\n                </p>\n              </td>\n<td>\n                <p>\n                  432009\n                </p>\n              </td>\n<td>\n                <p>\n                  634079\n                </p>\n              </td>\n<td>\n                <p>\n                  596234\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  184\n                </p>\n              </td>\n<td>\n                <p>\n                  444684\n                </p>\n              </td>\n<td>\n                <p>\n                  652902\n                </p>\n              </td>\n<td>\n                <p>\n                  614114\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  186\n                </p>\n              </td>\n<td>\n                <p>\n                  457104\n                </p>\n              </td>\n<td>\n                <p>\n                  672042\n                </p>\n              </td>\n<td>\n                <p>\n                  632248\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  188\n                </p>\n              </td>\n<td>\n                <p>\n                  469331\n                </p>\n              </td>\n<td>\n                <p>\n                  691451\n                </p>\n              </td>\n<td>\n                <p>\n                  650654\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  190\n                </p>\n              </td>\n<td>\n                <p>\n                  481583\n                </p>\n              </td>\n<td>\n                <p>\n                  711512\n                </p>\n              </td>\n<td>\n                <p>\n                  669753\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  192\n                </p>\n              </td>\n<td>\n                <p>\n                  477225\n                </p>\n              </td>\n<td>\n                <p>\n                  698188\n                </p>\n              </td>\n<td>\n                <p>\n                  689111\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  194\n                </p>\n              </td>\n<td>\n                <p>\n                  488955\n                </p>\n              </td>\n<td>\n                <p>\n                  736905\n                </p>\n              </td>\n<td>\n                <p>\n                  708760\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  196\n                </p>\n              </td>\n<td>\n                <p>\n                  499797\n                </p>\n              </td>\n<td>\n                <p>\n                  757502\n                </p>\n              </td>\n<td>\n                <p>\n                  728675\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  198\n                </p>\n              </td>\n<td>\n                <p>\n                  511163\n                </p>\n              </td>\n<td>\n                <p>\n                  778591\n                </p>\n              </td>\n<td>\n                <p>\n                  749102\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><p>\n        The second <a href=\"http://www.boost.org/doc/libs/release/libs/multiprecision/doc/html/../../performance/rational_determinant_bench.cpp\" target=\"_top\">example</a>\n        measures the time taken to calculate the determinant of a 3x3 matrix of rational\n        numbers. These numbers are randomly generated with <span class=\"emphasis\"><em>n</em></span>\n        bits in both numerator and denominator. In this case the rate limiting step\n        is the cost of calculating the GCD's during the computation:\n      </p>\n<div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_real_world.relative_time_taken_to_calculate\"></a><p class=\"title\"><b>Table 1.20. Relative Time Taken to Calculate 100 Determinants of Random 3x3 Matrixes</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Relative Time Taken to Calculate 100 Determinants of Random 3x3 Matrixes\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Bits\n                </p>\n              </th>\n<th>\n                <p>\n                  cpp_rational (ms)\n                </p>\n              </th>\n<th>\n                <p>\n                  mpq_rational (relative to cpp_rational)\n                </p>\n              </th>\n<th>\n                <p>\n                  mpq_class (relative to cpp_rational)\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  512\n                </p>\n              </td>\n<td>\n                <p>\n                  45\n                </p>\n              </td>\n<td>\n                <p>\n                  0.3111111111\n                </p>\n              </td>\n<td>\n                <p>\n                  0.3177777778\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  1024\n                </p>\n              </td>\n<td>\n                <p>\n                  103\n                </p>\n              </td>\n<td>\n                <p>\n                  0.3038834951\n                </p>\n              </td>\n<td>\n                <p>\n                  0.3038834951\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  2048\n                </p>\n              </td>\n<td>\n                <p>\n                  251\n                </p>\n              </td>\n<td>\n                <p>\n                  0.3087649402\n                </p>\n              </td>\n<td>\n                <p>\n                  0.3011952191\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  4096\n                </p>\n              </td>\n<td>\n                <p>\n                  667\n                </p>\n              </td>\n<td>\n                <p>\n                  0.2983508246\n                </p>\n              </td>\n<td>\n                <p>\n                  0.2893553223\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  8192\n                </p>\n              </td>\n<td>\n                <p>\n                  2033\n                </p>\n              </td>\n<td>\n                <p>\n                  0.261682243\n                </p>\n              </td>\n<td>\n                <p>\n                  0.2956222332\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  16384\n                </p>\n              </td>\n<td>\n                <p>\n                  6423\n                </p>\n              </td>\n<td>\n                <p>\n                  0.2358710883\n                </p>\n              </td>\n<td>\n                <p>\n                  0.3059318076\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  32768\n                </p>\n              </td>\n<td>\n                <p>\n                  24223\n                </p>\n              </td>\n<td>\n                <p>\n                  0.1875903067\n                </p>\n              </td>\n<td>\n                <p>\n                  0.1955992239\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.rational_real_world.platform\"></a><p class=\"title\"><b>Table 1.21. Platform Details</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Platform Details\">\n<colgroup>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n              </th>\n<th>\n                <p>\n                  Version\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  Compiler\n                </p>\n              </td>\n<td>\n                <p>\n                  GNU C++ version 10.3.0\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  GMP\n                </p>\n              </td>\n<td>\n                <p>\n                  6.2.0\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  MPFR\n                </p>\n              </td>\n<td>\n                <p>\n                  262146\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  Boost\n                </p>\n              </td>\n<td>\n                <p>\n                  107800\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  Run date\n                </p>\n              </td>\n<td>\n                <p>\n                  Sep 30 2021\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\">\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"int_real_world.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../perf.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"float_performance.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/perf/realworld.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Floating-Point Real World Tests</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../perf.html\" title=\"Performance Comparison\">\n<link rel=\"prev\" href=\"overhead.html\" title=\"The Overhead in the Number Class Wrapper\">\n<link rel=\"next\" href=\"int_real_world.html\" title=\"Integer Real World Tests\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"overhead.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../perf.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"int_real_world.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.perf.realworld\"></a><a class=\"link\" href=\"realworld.html\" title=\"Floating-Point Real World Tests\">Floating-Point Real\n      World Tests</a>\n</h3></div></div></div>\n<p>\n        These tests test the total time taken to execute all of Boost.Math's test\n        cases for these functions. In each case the best performing library gets\n        a relative score of 1, with the total execution time given in brackets. Times\n        are shown for both single threaded runs and concurrent execution - the latter\n        increases contension inside new/delete.\n      </p>\n<div class=\"table\">\n<a name=\"boost_multiprecision.perf.realworld.bessel_functions_50_digit_precis\"></a><p class=\"title\"><b>Table 1.14. Bessel Functions (50 digit precision)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Bessel Functions (50 digit precision)\">\n<colgroup>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Type\n                </p>\n              </th>\n<th>\n                <p>\n                  Time\n                </p>\n              </th>\n<th>\n                <div class=\"orderedlist\"><ol class=\"orderedlist\" type=\"1\"><li class=\"listitem\">\n                      Allocations\n                    </li></ol></div>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float_50\n                </p>\n              </td>\n<td>\n                <p>\n                  2.24409 (0.207745s)\n                </p>\n              </td>\n<td>\n                <p>\n                  399\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float_50 (3 concurrent threads)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.87977 (0.266594s)\n                </p>\n              </td>\n<td>\n                <p>\n                  463\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float_50\n                </p>\n              </td>\n<td>\n                <p>\n                  4.56157 (0.422285s)\n                </p>\n              </td>\n<td>\n                <p>\n                  381\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float_50 (3 concurrent threads)\n                </p>\n              </td>\n<td>\n                <p>\n                  5.66114 (0.524077s)\n                </p>\n              </td>\n<td>\n                <p>\n                  424\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpf_float_50\n                </p>\n              </td>\n<td>\n                <p>\n                  1.03648 (0.0959515s)\n                </p>\n              </td>\n<td>\n                <p>\n                  640961\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpf_float_50 (3 concurrent threads)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.50439 (0.139268s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2563517\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpf_float_50 (no expression templates\n                </p>\n              </td>\n<td>\n                <p>\n                  1 (0.0925745s)\n                </p>\n              </td>\n<td>\n                <p>\n                  1019039\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpf_float_50 (no expression templates (3 concurrent threads)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.52451 (0.141131s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4075842\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float_50\n                </p>\n              </td>\n<td>\n                <p>\n                  1.2513 (0.115838s)\n                </p>\n              </td>\n<td>\n                <p>\n                  583054\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float_50 (3 concurrent threads)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.61301 (0.149324s)\n                </p>\n              </td>\n<td>\n                <p>\n                  2330876\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float_50 (no expression templates\n                </p>\n              </td>\n<td>\n                <p>\n                  1.42667 (0.132073s)\n                </p>\n              </td>\n<td>\n                <p>\n                  999594\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float_50 (no expression templates (3 concurrent threads)\n                </p>\n              </td>\n<td>\n                <p>\n                  2.00203 (0.185337s)\n                </p>\n              </td>\n<td>\n                <p>\n                  4000039\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  static_mpfr_float_50\n                </p>\n              </td>\n<td>\n                <p>\n                  1.18358 (0.10957s)\n                </p>\n              </td>\n<td>\n                <p>\n                  22930\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  static_mpfr_float_50 (3 concurrent threads)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.38802 (0.128496s)\n                </p>\n              </td>\n<td>\n                <p>\n                  93140\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  static_mpfr_float_50 (no expression templates)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.14598 (0.106089s)\n                </p>\n              </td>\n<td>\n                <p>\n                  46861\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  static_mpfr_float_50 (no expression templates) (3 concurrent threads)\n                </p>\n              </td>\n<td>\n                <p>\n                  1.24535 (0.115288s)\n                </p>\n              </td>\n<td>\n                <p>\n                  189227\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.realworld.non_central_t_distribution_50_di\"></a><p class=\"title\"><b>Table 1.15. Non-central T Distribution (50 digit precision)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Non-central T Distribution (50 digit precision)\">\n<colgroup>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Type\n                </p>\n              </th>\n<th>\n                <p>\n                  Time\n                </p>\n              </th>\n<th>\n                <div class=\"orderedlist\"><ol class=\"orderedlist\" type=\"1\"><li class=\"listitem\">\n                      Allocations\n                    </li></ol></div>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float_50\n                </p>\n              </td>\n<td>\n                <p>\n                  2.38959 (38.5842s)\n                </p>\n              </td>\n<td>\n                <p>\n                  0\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_bin_float_50 (3 concurrent threads)\n                </p>\n              </td>\n<td>\n                <p>\n                  3.50535 (56.6s)\n                </p>\n              </td>\n<td>\n                <p>\n                  28\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float_50\n                </p>\n              </td>\n<td>\n                <p>\n                  4.82763 (77.9505s)\n                </p>\n              </td>\n<td>\n                <p>\n                  0\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpf_float_50\n                </p>\n              </td>\n<td>\n                <p>\n                  1.06817 (17.2475s)\n                </p>\n              </td>\n<td>\n                <p>\n                  123749688\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpf_float_50 (no expression templates\n                </p>\n              </td>\n<td>\n                <p>\n                  1 (16.1468s)\n                </p>\n              </td>\n<td>\n                <p>\n                  152610085\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float_50\n                </p>\n              </td>\n<td>\n                <p>\n                  1.18754 (19.1749s)\n                </p>\n              </td>\n<td>\n                <p>\n                  118401290\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr_float_50 (no expression templates\n                </p>\n              </td>\n<td>\n                <p>\n                  1.36782 (22.0858s)\n                </p>\n              </td>\n<td>\n                <p>\n                  152816346\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  static_mpfr_float_50\n                </p>\n              </td>\n<td>\n                <p>\n                  1.04471 (16.8686s)\n                </p>\n              </td>\n<td>\n                <p>\n                  113395\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.perf.realworld.platform\"></a><p class=\"title\"><b>Table 1.16. Platform Details</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Platform Details\">\n<colgroup>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n              </th>\n<th>\n                <p>\n                  Version\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  Compiler\n                </p>\n              </td>\n<td>\n                <p>\n                  GNU C++ version 10.3.0\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  GMP\n                </p>\n              </td>\n<td>\n                <p>\n                  6.2.0\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  MPFR\n                </p>\n              </td>\n<td>\n                <p>\n                  262146\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  Boost\n                </p>\n              </td>\n<td>\n                <p>\n                  107800\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  Run date\n                </p>\n              </td>\n<td>\n                <p>\n                  Sep 30 2021\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\">\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"overhead.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../perf.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"int_real_world.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/perf.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Performance Comparison</title>\n<link rel=\"stylesheet\" href=\"../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"prev\" href=\"ref/headers.html\" title=\"Header File Structure\">\n<link rel=\"next\" href=\"perf/overhead.html\" title=\"The Overhead in the Number Class Wrapper\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"ref/headers.html\"><img src=\"../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"perf/overhead.html\"><img src=\"../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h2 class=\"title\" style=\"clear: both\">\n<a name=\"boost_multiprecision.perf\"></a><a class=\"link\" href=\"perf.html\" title=\"Performance Comparison\">Performance Comparison</a>\n</h2></div></div></div>\n<div class=\"toc\"><dl class=\"toc\">\n<dt><span class=\"section\"><a href=\"perf/overhead.html\">The Overhead in the\n      Number Class Wrapper</a></span></dt>\n<dt><span class=\"section\"><a href=\"perf/realworld.html\">Floating-Point Real\n      World Tests</a></span></dt>\n<dt><span class=\"section\"><a href=\"perf/int_real_world.html\">Integer Real\n      World Tests</a></span></dt>\n<dt><span class=\"section\"><a href=\"perf/rational_real_world.html\">Rational\n      Real World Tests</a></span></dt>\n<dt><span class=\"section\"><a href=\"perf/float_performance.html\">Float Algorithm\n      Performance</a></span></dt>\n<dt><span class=\"section\"><a href=\"perf/integer_performance.html\">Integer\n      Algorithm Performance</a></span></dt>\n<dt><span class=\"section\"><a href=\"perf/rational_performance.html\">Rational\n      Type Performance</a></span></dt>\n</dl></div>\n<p>\n      In the beginning of the project and throughout, many performance analyses,\n      counts of multiprecision-operations-per-second and the like have been performed.\n      Some of these are already listed in the ensuing sections.\n    </p>\n<p>\n      We will now provide some general notes on performance, valid for all of the\n      multiprecision backends, before the detailed benchmarks of the following sections.\n    </p>\n<p>\n      The header-only, library-independent Boost-licenses integer and floating-point\n      backends including <a class=\"link\" href=\"tut/ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>\n      for multiprecision integers, <a class=\"link\" href=\"tut/floats/cpp_bin_float.html\" title=\"cpp_bin_float\">cpp_bin_float</a>\n      and <a class=\"link\" href=\"tut/floats/cpp_dec_float.html\" title=\"cpp_dec_float\">cpp_dec_float</a>\n      for multiprecision floating-point types are significantly slower than the world's\n      fastest implementations generally agreed to be found in GMP/MPIR, MPFR and\n      MPC (which are based on GMP). Complex types <a class=\"link\" href=\"tut/complex/cpp_complex.html\" title=\"cpp_complex\">cpp_complex</a>\n      that are synthesized from these types share similar relative performances.\n    </p>\n<p>\n      The backends which effectively wrap GMP/MPIR and MPFR retain the superior performance\n      of the low-level big-number engines. When these are used (in association with\n      at least some level of optmization) they achieve and retain the expected low-level\n      performances.\n    </p>\n<p>\n      At low digit counts, however, it is noted that the performances of <a class=\"link\" href=\"tut/ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>,\n      <a class=\"link\" href=\"tut/floats/cpp_bin_float.html\" title=\"cpp_bin_float\">cpp_bin_float</a>\n      and <a class=\"link\" href=\"tut/floats/cpp_dec_float.html\" title=\"cpp_dec_float\">cpp_dec_float</a>\n      can actually meet or exceed those encountered for GMP/MPIR, MPFR, etc. The\n      reason for this is because stack allocation and/or the use of fast container\n      storage can actually out-perform the allocation mechanisms in GMP/MPIR, which\n      dominate run-time costs at low digit counts.\n    </p>\n<p>\n      As digit counts rise above about 50 or so, however, GMP/MPIR performance steadily\n      increases, and simultaneously increases beyond (in relation to) the performances\n      of the Boost-licensed, self-written backends. At around a few hundred to several\n      thousands of digits, factors of about two through five are observed, whereby\n      GMP/MPIR-based calculations are (performance-wise) supreior ones.\n    </p>\n<p>\n      At a few thousand decimal digits, the upper end of the Boost backends is reached.\n      At the moment, advanced big-number multiplication schemes in the Boost-licensed,\n      self-written backends is limited to school multiplication and Karatsuba multiplication.\n      Higher-orders of Toom-Cook and FFT-based multiplication are not (yet) implemented.\n      So it is not yet feasible to perform mega-digit calculations with the Boost-licensed,\n      self-written backends, whereas these are readily possible with the GMP/MPIR\n      and MPRF based backends.\n    </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"ref/headers.html\"><img src=\"../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"perf/overhead.html\"><img src=\"../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/ref/backendconc.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Backend Requirements</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../ref.html\" title=\"Reference\">\n<link rel=\"prev\" href=\"internals.html\" title=\"Internal Support Code\">\n<link rel=\"next\" href=\"headers.html\" title=\"Header File Structure\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"internals.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"headers.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.ref.backendconc\"></a><a class=\"link\" href=\"backendconc.html\" title=\"Backend Requirements\">Backend Requirements</a>\n</h3></div></div></div>\n<p>\n        The requirements on the <code class=\"computeroutput\"><span class=\"identifier\">Backend</span></code>\n        template argument to <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n        are split up into sections: compulsory and optional.\n      </p>\n<p>\n        Compulsory requirements have no default implementation in the library, therefore\n        if the feature they implement is to be supported at all, then they must be\n        implemented by the backend.\n      </p>\n<p>\n        Optional requirements have default implementations that are called if the\n        backend doesn't provide its own. Typically the backend will implement these\n        to improve performance.\n      </p>\n<p>\n        In the following tables, type B is the <code class=\"computeroutput\"><span class=\"identifier\">Backend</span></code>\n        template argument to <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">b2</span></code>\n        are a variables of type B, <code class=\"computeroutput\"><span class=\"identifier\">pb</span></code>\n        is a variable of type B*, <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">cb3</span></code>\n        are constant variables of type <code class=\"computeroutput\"><span class=\"keyword\">const</span>\n        <span class=\"identifier\">B</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">rb</span></code>\n        is a variable of type <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">&amp;&amp;</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">a2</span></code>\n        are variables of Arithmetic type, <code class=\"computeroutput\"><span class=\"identifier\">s</span></code>\n        is a variable of type <code class=\"computeroutput\"><span class=\"keyword\">const</span> <span class=\"keyword\">char</span><span class=\"special\">*</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">ui</span></code> is a variable of type <code class=\"computeroutput\"><span class=\"keyword\">unsigned</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">bb</span></code>\n        is a variable of type <code class=\"computeroutput\"><span class=\"keyword\">bool</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">pa</span></code> is a variable of type\n        pointer-to-arithmetic-type, <code class=\"computeroutput\"><span class=\"identifier\">exp</span></code>\n        is a variable of type <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">exp_type</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">pexp</span></code>\n        is a variable of type <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">exp_type</span><span class=\"special\">*</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">i</span></code> is a variable of type\n        <code class=\"computeroutput\"><span class=\"keyword\">int</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">pi</span></code>\n        pointer to a variable of type <code class=\"computeroutput\"><span class=\"keyword\">int</span></code>,\n        B2 is another type that meets these requirements, b2 is a variable of type\n        B2, <code class=\"computeroutput\"><span class=\"identifier\">ss</span></code> is variable of type\n        <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">streamsize</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">ff</span></code>\n        is a variable of type <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">ios_base</span><span class=\"special\">::</span><span class=\"identifier\">fmtflags</span></code>.\n      </p>\n<div class=\"table\">\n<a name=\"boost_multiprecision.ref.backendconc.compulsory_requirements_on_the_b\"></a><p class=\"title\"><b>Table 1.8. Compulsory Requirements on the Backend type.</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Compulsory Requirements on the Backend type.\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Expression\n                </p>\n              </th>\n<th>\n                <p>\n                  Return Type\n                </p>\n              </th>\n<th>\n                <p>\n                  Comments\n                </p>\n              </th>\n<th>\n                <p>\n                  Throws\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">tuple</span><span class=\"special\">&lt;</span><span class=\"identifier\">type</span><span class=\"special\">-</span><span class=\"identifier\">list</span><span class=\"special\">&gt;</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  A list of signed integral types that can be assigned to type B.\n                  The types shall be listed in order of size, smallest first, and\n                  shall terminate in the type that is <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">intmax_t</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">tuple</span><span class=\"special\">&lt;</span><span class=\"identifier\">type</span><span class=\"special\">-</span><span class=\"identifier\">list</span><span class=\"special\">&gt;</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  A list of unsigned integral types that can be assigned to type\n                  B. The types shall be listed in order of size, smallest first,\n                  and shall terminate in the type that is <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">uintmax_t</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">tuple</span><span class=\"special\">&lt;</span><span class=\"identifier\">type</span><span class=\"special\">-</span><span class=\"identifier\">list</span><span class=\"special\">&gt;</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  A list of floating-point types that can be assigned to type B.The\n                  types shall be listed in order of size, smallest first, and shall\n                  terminate in type <code class=\"computeroutput\"><span class=\"keyword\">long</span> <span class=\"keyword\">double</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">exponent_type</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  A signed integral type.\n                </p>\n              </td>\n<td>\n                <p>\n                  The type of the exponent of type B. This type is required only\n                  for floating-point types.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">()</span></code>\n                </p>\n              </td>\n<td>\n              </td>\n<td>\n                <p>\n                  Default constructor.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n              </td>\n<td>\n                <p>\n                  Copy Constructor.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">b</span> <span class=\"special\">=</span>\n                  <span class=\"identifier\">b</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">&amp;</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Assignment operator.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">b</span> <span class=\"special\">=</span>\n                  <span class=\"identifier\">a</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">&amp;</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Assignment from an Arithmetic type. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">b</span> <span class=\"special\">=</span>\n                  <span class=\"identifier\">s</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">&amp;</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Assignment from a string.\n                </p>\n              </td>\n<td>\n                <p>\n                  Throws a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code> if the string could\n                  not be interpreted as a valid number.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">b</span><span class=\"special\">.</span><span class=\"identifier\">swap</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Swaps the contents of its arguments.\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">noexcept</span></code>\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">cb</span><span class=\"special\">.</span><span class=\"identifier\">str</span><span class=\"special\">(</span><span class=\"identifier\">ss</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">ff</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">string</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns the string representation of <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>\n                  with <code class=\"computeroutput\"><span class=\"identifier\">ss</span></code> digits\n                  and formatted according to the flags set in <code class=\"computeroutput\"><span class=\"identifier\">ff</span></code>.\n                  If <code class=\"computeroutput\"><span class=\"identifier\">ss</span></code> is zero,\n                  then returns as many digits as are required to reconstruct the\n                  original value.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">b</span><span class=\"special\">.</span><span class=\"identifier\">negate</span><span class=\"special\">()</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Negates <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">cb</span><span class=\"special\">.</span><span class=\"identifier\">compare</span><span class=\"special\">(</span><span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">int</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Compares <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> and\n                  <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code>, returns a\n                  value less than zero if <code class=\"computeroutput\"><span class=\"identifier\">cb</span>\n                  <span class=\"special\">&lt;</span> <span class=\"identifier\">cb2</span></code>,\n                  a value greater than zero if <code class=\"computeroutput\"><span class=\"identifier\">cb</span>\n                  <span class=\"special\">&gt;</span> <span class=\"identifier\">cb2</span></code>\n                  and zero if <code class=\"computeroutput\"><span class=\"identifier\">cb</span> <span class=\"special\">==</span> <span class=\"identifier\">cb2</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">noexcept</span></code>\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">cb</span><span class=\"special\">.</span><span class=\"identifier\">compare</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">int</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Compares <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> and\n                  <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>, returns a value\n                  less than zero if <code class=\"computeroutput\"><span class=\"identifier\">cb</span>\n                  <span class=\"special\">&lt;</span> <span class=\"identifier\">a</span></code>,\n                  a value greater than zero if <code class=\"computeroutput\"><span class=\"identifier\">cb</span>\n                  <span class=\"special\">&gt;</span> <span class=\"identifier\">a</span></code>\n                  and zero if <code class=\"computeroutput\"><span class=\"identifier\">cb</span> <span class=\"special\">==</span> <span class=\"identifier\">a</span></code>.\n                  The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall\n                  be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_add</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Adds <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> to <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_subtract</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Subtracts <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> from\n                  <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Multiplies <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> by\n                  <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_divide</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Divides <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> by <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code> if cb has the\n                  value zero, and <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">B</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;::</span><span class=\"identifier\">has_infinity</span> <span class=\"special\">==</span>\n                  <span class=\"keyword\">false</span></code>\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_modulus</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">b</span> <span class=\"special\">%=</span>\n                  <span class=\"identifier\">cb</span></code>, only required when\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type.\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code> if cb has the\n                  value zero.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_and</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">b</span> <span class=\"special\">&amp;=</span>\n                  <span class=\"identifier\">cb</span></code>, only required when\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_or</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">b</span> <span class=\"special\">|=</span>\n                  <span class=\"identifier\">cb</span></code>, only required when\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_xor</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">b</span> <span class=\"special\">^=</span>\n                  <span class=\"identifier\">cb</span></code>, only required when\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_complement</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes the ones-complement of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and stores the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>,\n                  only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an integer type.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_left_shift</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">ui</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">b</span> <span class=\"special\">&lt;&lt;=</span>\n                  <span class=\"identifier\">ui</span></code>, only required when\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_right_shift</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">ui</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">b</span> <span class=\"special\">&gt;&gt;=</span>\n                  <span class=\"identifier\">ui</span></code>, only required when\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_convert_to</span><span class=\"special\">(</span><span class=\"identifier\">pa</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Converts <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> to\n                  the type of <code class=\"computeroutput\"><span class=\"special\">*</span><span class=\"identifier\">pa</span></code>\n                  and store the result in <code class=\"computeroutput\"><span class=\"special\">*</span><span class=\"identifier\">pa</span></code>. Type <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  shall support conversion to at least types <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">intmax_t</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">uintmax_t</span></code> and <code class=\"computeroutput\"><span class=\"keyword\">long</span>\n                  <span class=\"keyword\">long</span></code>. Conversion to other\n                  arithmetic types can then be synthesised using other operations.\n                  Conversions to other types are entirely optional.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_frexp</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">pexp</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Stores values in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>\n                  and <code class=\"computeroutput\"><span class=\"special\">*</span><span class=\"identifier\">pexp</span></code>\n                  such that the value of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  is b * 2<sup>*pexp</sup>, only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is a floating-point type.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_ldexp</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">exp</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Stores a value in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>\n                  that is cb * 2<sup>exp</sup>, only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is a floating-point type.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_frexp</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">pi</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Stores values in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>\n                  and <code class=\"computeroutput\"><span class=\"special\">*</span><span class=\"identifier\">pi</span></code>\n                  such that the value of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  is b * 2<sup>*pi</sup>, only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is a floating-point type.\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code> if the exponent\n                  of cb is too large to be stored in an <code class=\"computeroutput\"><span class=\"keyword\">int</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_ldexp</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">i</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Stores a value in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>\n                  that is cb * 2<sup>i</sup>, only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is a floating-point type.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_floor</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Stores the floor of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>, only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is a floating-point\n                  type.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_ceil</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Stores the ceiling of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>, only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is a floating-point\n                  type.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_sqrt</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Stores the square root of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>, only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is a floating-point\n                  type.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">number_category</span><span class=\"special\">&lt;</span><span class=\"identifier\">B</span><span class=\"special\">&gt;::</span><span class=\"identifier\">type</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">integral_constant</span><span class=\"special\">&lt;</span><span class=\"keyword\">int</span><span class=\"special\">,</span> <span class=\"identifier\">N</span><span class=\"special\">&gt;</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">N</span></code> is one of the\n                  values <code class=\"computeroutput\"><span class=\"identifier\">number_kind_integer</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">number_kind_floating_point</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">number_kind_complex</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">number_kind_rational</span></code>\n                  or <code class=\"computeroutput\"><span class=\"identifier\">number_kind_fixed_point</span></code>.\n                  Defaults to <code class=\"computeroutput\"><span class=\"identifier\">number_kind_floating_point</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_conj</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the complex\n                  conjugate of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>.\n                  Required for complex types only - other types have a sensible default.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_proj</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the Riemann\n                  projection of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>.\n                  Required for complex types only - other types have a sensible default.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_real</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the real\n                  part of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>. Required\n                  for complex types only - other types have a sensible default.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_imag</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the imaginary\n                  of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>. Required\n                  for complex types only - other types have a sensible default.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_set_real</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets the real part of <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>\n                  to <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>. Required\n                  for complex types only - other types have a sensible default.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_set_imag</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets the imaginary part of <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>\n                  to <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>. Required\n                  for complex types only - other types have a sensible default.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.ref.backendconc.optional_requirements_on_the_bac\"></a><p class=\"title\"><b>Table 1.9. Optional Requirements on the Backend Type</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Optional Requirements on the Backend Type\">\n<colgroup>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Expression\n                </p>\n              </th>\n<th>\n                <p>\n                  Returns\n                </p>\n              </th>\n<th>\n                <p>\n                  Comments\n                </p>\n              </th>\n<th>\n                <p>\n                  Throws\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  <span class=\"emphasis\"><em>Construct and assign:</em></span>\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">rb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Move constructor. Afterwards variable <code class=\"computeroutput\"><span class=\"identifier\">rb</span></code>\n                  shall be in sane state, albeit with unspecified value. Only destruction\n                  and assignment to the moved-from variable <code class=\"computeroutput\"><span class=\"identifier\">rb</span></code>\n                  need be supported after the operation.\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">noexcept</span></code>\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">b</span> <span class=\"special\">=</span>\n                  <span class=\"identifier\">rb</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">&amp;</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Move-assign. Afterwards variable <code class=\"computeroutput\"><span class=\"identifier\">rb</span></code>\n                  shall be in sane state, albeit with unspecified value. Only destruction\n                  and assignment to the moved-from variable <code class=\"computeroutput\"><span class=\"identifier\">rb</span></code>\n                  need be supported after the operation.\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">noexcept</span></code>\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Direct construction from an arithmetic type. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall be listed in one of the\n                  type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code>\n                  or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  this operation is simulated using default-construction followed\n                  by assignment.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">b2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Copy constructor from a different back-end type. When not provided,\n                  a generic interconversion routine is used. This constructor may\n                  be <code class=\"computeroutput\"><span class=\"keyword\">explicit</span></code> if the\n                  corresponding frontend constructor should also be <code class=\"computeroutput\"><span class=\"keyword\">explicit</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">b</span> <span class=\"special\">=</span>\n                  <span class=\"identifier\">b2</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">b</span><span class=\"special\">&amp;</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Assignment operator from a different back-end type. When not provided,\n                  a generic interconversion routine is used.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">assign_components</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Assigns to <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> the\n                  two components in the following arguments. Only applies to rational\n                  and complex number types. When not provided, arithmetic operations\n                  are used to synthesise the result from the two values.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">assign_components</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">b2</span><span class=\"special\">,</span> <span class=\"identifier\">b2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Assigns to <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> the\n                  two components in the following arguments. Only applies to rational\n                  and complex number types. When not provided, arithmetic operations\n                  are used to synthesise the result from the two values.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <span class=\"emphasis\"><em>Comparisons:</em></span>\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_eq</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">bool</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code>\n                  are equal in value. When not provided, the default implementation\n                  returns <code class=\"computeroutput\"><span class=\"identifier\">cb</span><span class=\"special\">.</span><span class=\"identifier\">compare</span><span class=\"special\">(</span><span class=\"identifier\">cb2</span><span class=\"special\">)</span>\n                  <span class=\"special\">==</span> <span class=\"number\">0</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">noexcept</span></code>\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_eq</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">bool</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  are equal in value. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  return the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_eq</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_eq</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">bool</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  are equal in value. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  the default version returns <code class=\"computeroutput\"><span class=\"identifier\">eval_eq</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_lt</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">bool</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> is less than <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code> in value. When not provided,\n                  the default implementation returns <code class=\"computeroutput\"><span class=\"identifier\">cb</span><span class=\"special\">.</span><span class=\"identifier\">compare</span><span class=\"special\">(</span><span class=\"identifier\">cb2</span><span class=\"special\">)</span> <span class=\"special\">&lt;</span>\n                  <span class=\"number\">0</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">noexcept</span></code>\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_lt</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">bool</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> is less than <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> in value. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall be listed in one of the\n                  type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code>\n                  or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  the default implementation returns <code class=\"computeroutput\"><span class=\"identifier\">eval_lt</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_lt</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">bool</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> is less than <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> in value. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall be listed in one of the\n                  type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code>\n                  or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  the default implementation returns <code class=\"computeroutput\"><span class=\"identifier\">eval_gt</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_gt</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">bool</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> is greater than <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code> in value. When not provided,\n                  the default implementation returns <code class=\"computeroutput\"><span class=\"identifier\">cb</span><span class=\"special\">.</span><span class=\"identifier\">compare</span><span class=\"special\">(</span><span class=\"identifier\">cb2</span><span class=\"special\">)</span> <span class=\"special\">&gt;</span>\n                  <span class=\"number\">0</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">noexcept</span></code>\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_gt</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">bool</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> is greater than <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> in value. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall be listed in one of the\n                  type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code>\n                  or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  the default implementation returns <code class=\"computeroutput\"><span class=\"identifier\">eval_gt</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_gt</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">bool</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> is greater than <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> in value. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall be listed in one of the\n                  type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code>\n                  or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  the default implementation returns <code class=\"computeroutput\"><span class=\"identifier\">eval_lt</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_is_zero</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">bool</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> is zero, otherwise <code class=\"computeroutput\"><span class=\"keyword\">false</span></code>. The default version of this\n                  function returns <code class=\"computeroutput\"><span class=\"identifier\">cb</span><span class=\"special\">.</span><span class=\"identifier\">compare</span><span class=\"special\">(</span><span class=\"identifier\">ui_type</span><span class=\"special\">(</span><span class=\"number\">0</span><span class=\"special\">))</span> <span class=\"special\">==</span>\n                  <span class=\"number\">0</span></code>, where <code class=\"computeroutput\"><span class=\"identifier\">ui_type</span></code>\n                  is <code class=\"computeroutput\"><span class=\"identifier\">ui_type</span></code> is\n                  <code class=\"computeroutput\"><span class=\"keyword\">typename</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">tuple_element</span><span class=\"special\">&lt;</span><span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"keyword\">typename</span>\n                  <span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span><span class=\"special\">&gt;::</span><span class=\"identifier\">type</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_get_sign</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">int</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns a value &lt; zero if <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  is negative, a value &gt; zero if <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  is positive, and zero if <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  is zero. The default version of this function returns <code class=\"computeroutput\"><span class=\"identifier\">cb</span><span class=\"special\">.</span><span class=\"identifier\">compare</span><span class=\"special\">(</span><span class=\"identifier\">ui_type</span><span class=\"special\">(</span><span class=\"number\">0</span><span class=\"special\">))</span></code>,\n                  where <code class=\"computeroutput\"><span class=\"identifier\">ui_type</span></code> is\n                  <code class=\"computeroutput\"><span class=\"identifier\">ui_type</span></code> is <code class=\"computeroutput\"><span class=\"keyword\">typename</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">tuple_element</span><span class=\"special\">&lt;</span><span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"keyword\">typename</span>\n                  <span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span><span class=\"special\">&gt;::</span><span class=\"identifier\">type</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <span class=\"emphasis\"><em>Basic arithmetic:</em></span>\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_add</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Adds <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> to <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall be listed in one of the\n                  type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code>\n                  or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  the default version calls <code class=\"computeroutput\"><span class=\"identifier\">eval_add</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_add</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Add <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> to <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code> and stores the result in\n                  <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>. When not provided,\n                  does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">b</span>\n                  <span class=\"special\">=</span> <span class=\"identifier\">cb</span><span class=\"special\">;</span> <span class=\"identifier\">eval_add</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_add</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Add <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> to <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> and stores the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall be listed in one of the\n                  type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code>\n                  or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_add</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_add</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Add <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> to <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> and stores the result in\n                  <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>. The type of\n                  <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall be listed\n                  in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_add</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_subtract</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Subtracts <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> from\n                  <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>. The type of\n                  <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall be listed\n                  in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  the default version calls <code class=\"computeroutput\"><span class=\"identifier\">eval_subtract</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_subtract</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Subtracts <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code> from\n                  <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> and stores the\n                  result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>. When\n                  not provided, does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">b</span>\n                  <span class=\"special\">=</span> <span class=\"identifier\">cb</span><span class=\"special\">;</span> <span class=\"identifier\">eval_subtract</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_subtract</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Subtracts <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> from\n                  <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> and stores the\n                  result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>. The\n                  type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall\n                  be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_subtract</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_subtract</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Subtracts <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> from\n                  <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> and stores the\n                  result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>. The\n                  type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall\n                  be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_subtract</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">);</span> <span class=\"identifier\">b</span><span class=\"special\">.</span><span class=\"identifier\">negate</span><span class=\"special\">();</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Multiplies <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> by\n                  <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>. The type of\n                  <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall be listed\n                  in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  the default version calls <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Multiplies <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> by\n                  <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code> and stores\n                  the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  When not provided, does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">b</span>\n                  <span class=\"special\">=</span> <span class=\"identifier\">cb</span><span class=\"special\">;</span> <span class=\"identifier\">eval_multiply</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Multiplies <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> by\n                  <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> and stores the\n                  result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>. The\n                  type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall\n                  be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Multiplies <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> by\n                  <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> and stores the\n                  result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>. The\n                  type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall\n                  be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply_add</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Multiplies <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> by\n                  <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code> and adds the\n                  result to <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>. When\n                  not provided does the equivalent of creating a temporary <code class=\"computeroutput\"><span class=\"identifier\">B</span> <span class=\"identifier\">t</span></code>\n                  and <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply</span><span class=\"special\">(</span><span class=\"identifier\">t</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code> followed by <code class=\"computeroutput\"><span class=\"identifier\">eval_add</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">t</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply_add</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Multiplies <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> by\n                  <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> and adds the\n                  result to <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>. The\n                  type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall\n                  be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided\n                  does the equivalent of creating a temporary <code class=\"computeroutput\"><span class=\"identifier\">B</span>\n                  <span class=\"identifier\">t</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply</span><span class=\"special\">(</span><span class=\"identifier\">t</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code> followed by <code class=\"computeroutput\"><span class=\"identifier\">eval_add</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">t</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply_add</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Multiplies <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> by\n                  <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> and adds the\n                  result to <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>. The\n                  type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall\n                  be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided\n                  does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply_add</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply_subtract</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Multiplies <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> by\n                  <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code> and subtracts\n                  the result from <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  When not provided does the equivalent of creating a temporary\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span> <span class=\"identifier\">t</span></code>\n                  and <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply</span><span class=\"special\">(</span><span class=\"identifier\">t</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code> followed by <code class=\"computeroutput\"><span class=\"identifier\">eval_subtract</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">t</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply_subtract</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Multiplies <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> by\n                  <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> and subtracts\n                  the result from <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall\n                  be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided\n                  does the equivalent of creating a temporary <code class=\"computeroutput\"><span class=\"identifier\">B</span>\n                  <span class=\"identifier\">t</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply</span><span class=\"special\">(</span><span class=\"identifier\">t</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code> followed by <code class=\"computeroutput\"><span class=\"identifier\">eval_subtract</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">t</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply_subtract</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Multiplies <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> by\n                  <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> and subtracts\n                  the result from <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall\n                  be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided\n                  does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply_subtract</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply_add</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">cb2</span><span class=\"special\">,</span> <span class=\"identifier\">cb3</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Multiplies <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> by\n                  <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code> and adds the\n                  result to <code class=\"computeroutput\"><span class=\"identifier\">cb3</span></code> storing\n                  the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  When not provided does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code> followed by <code class=\"computeroutput\"><span class=\"identifier\">eval_add</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb3</span><span class=\"special\">)</span></code>. For brevity, only a version showing\n                  all arguments of type <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is shown here, but you can replace up to any 2 of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code>\n                  and <code class=\"computeroutput\"><span class=\"identifier\">cb3</span></code> with any\n                  type listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply_subtract</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">cb2</span><span class=\"special\">,</span> <span class=\"identifier\">cb3</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Multiplies <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> by\n                  <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code> and subtracts\n                  from the result <code class=\"computeroutput\"><span class=\"identifier\">cb3</span></code>\n                  storing the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  When not provided does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_multiply</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code> followed by <code class=\"computeroutput\"><span class=\"identifier\">eval_subtract</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb3</span><span class=\"special\">)</span></code>. For brevity, only a version showing\n                  all arguments of type <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is shown here, but you can replace up to any 2 of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code>\n                  and <code class=\"computeroutput\"><span class=\"identifier\">cb3</span></code> with any\n                  type listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_divide</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Divides <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> by <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall be listed in one of the\n                  type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code>\n                  or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  the default version calls <code class=\"computeroutput\"><span class=\"identifier\">eval_divide</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> has the value zero, and <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">B</span><span class=\"special\">&gt;</span>\n                  <span class=\"special\">&gt;::</span><span class=\"identifier\">has_infinity</span>\n                  <span class=\"special\">==</span> <span class=\"keyword\">false</span></code>\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_divide</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Divides <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> by\n                  <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code> and stores\n                  the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  When not provided, does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">b</span>\n                  <span class=\"special\">=</span> <span class=\"identifier\">cb</span><span class=\"special\">;</span> <span class=\"identifier\">eval_divide</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code> has the value zero, and\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">B</span><span class=\"special\">&gt;</span>\n                  <span class=\"special\">&gt;::</span><span class=\"identifier\">has_infinity</span>\n                  <span class=\"special\">==</span> <span class=\"keyword\">false</span></code>\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_divide</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Divides <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> by\n                  <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> and stores the\n                  result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>. The\n                  type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall\n                  be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_divide</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> has the value zero, and <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">B</span><span class=\"special\">&gt;</span>\n                  <span class=\"special\">&gt;::</span><span class=\"identifier\">has_infinity</span>\n                  <span class=\"special\">==</span> <span class=\"keyword\">false</span></code>\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_divide</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Divides <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> by <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> and stores the result in\n                  <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>. The type of\n                  <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> shall be listed\n                  in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_divide</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">),</span> <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code> if cb has the\n                  value zero, and <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">B</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;::</span><span class=\"identifier\">has_infinity</span> <span class=\"special\">==</span>\n                  <span class=\"keyword\">false</span></code>\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_increment</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  void\n                </p>\n              </td>\n<td>\n                <p>\n                  Increments the value of <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>\n                  by one. When not provided, does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_add</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"keyword\">static_cast</span><span class=\"special\">&lt;</span><span class=\"identifier\">ui_type</span><span class=\"special\">&gt;(</span><span class=\"number\">1u</span><span class=\"special\">))</span></code>.\n                  Where <code class=\"computeroutput\"><span class=\"identifier\">ui_type</span></code> is\n                  <code class=\"computeroutput\"><span class=\"keyword\">typename</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">tuple_element</span><span class=\"special\">&lt;</span><span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"keyword\">typename</span>\n                  <span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span><span class=\"special\">&gt;::</span><span class=\"identifier\">type</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_decrement</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  void\n                </p>\n              </td>\n<td>\n                <p>\n                  Decrements the value of <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>\n                  by one. When not provided, does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_subtract</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"keyword\">static_cast</span><span class=\"special\">&lt;</span><span class=\"identifier\">ui_type</span><span class=\"special\">&gt;(</span><span class=\"number\">1u</span><span class=\"special\">))</span></code>.\n                  Where <code class=\"computeroutput\"><span class=\"identifier\">ui_type</span></code> is\n                  <code class=\"computeroutput\"><span class=\"keyword\">typename</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">tuple_element</span><span class=\"special\">&lt;</span><span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"keyword\">typename</span>\n                  <span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span><span class=\"special\">&gt;::</span><span class=\"identifier\">type</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <span class=\"emphasis\"><em>Integer specific operations:</em></span>\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_modulus</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">b</span> <span class=\"special\">%=</span>\n                  <span class=\"identifier\">cb</span></code>, only required when\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  the default version calls <code class=\"computeroutput\"><span class=\"identifier\">eval_modulus</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> has the value zero.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_modulus</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">cb</span> <span class=\"special\">%</span>\n                  <span class=\"identifier\">cb2</span></code> and stores the result\n                  in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>, only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. When not provided, does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">b</span>\n                  <span class=\"special\">=</span> <span class=\"identifier\">cb</span><span class=\"special\">;</span> <span class=\"identifier\">eval_modulus</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> has the value zero.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_modulus</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">cb</span> <span class=\"special\">%</span>\n                  <span class=\"identifier\">a</span></code> and stores the result\n                  in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>, only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_modulus</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> has the value zero.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_modulus</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">cb</span> <span class=\"special\">%</span>\n                  <span class=\"identifier\">a</span></code> and stores the result\n                  in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>, only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_modulus</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">),</span> <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> has the value zero.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_and</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">b</span> <span class=\"special\">&amp;=</span>\n                  <span class=\"identifier\">cb</span></code>, only required when\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  the default version calls <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_and</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_and</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">cb</span> <span class=\"special\">&amp;</span>\n                  <span class=\"identifier\">cb2</span></code> and stores the result\n                  in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>, only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. When not provided, does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">b</span>\n                  <span class=\"special\">=</span> <span class=\"identifier\">cb</span><span class=\"special\">;</span> <span class=\"identifier\">eval_bitwise_and</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_and</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">cb</span> <span class=\"special\">&amp;</span>\n                  <span class=\"identifier\">a</span></code> and stores the result\n                  in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>, only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_and</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_and</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">cb</span> <span class=\"special\">&amp;</span>\n                  <span class=\"identifier\">a</span></code> and stores the result\n                  in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>, only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_and</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_or</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">b</span> <span class=\"special\">|=</span>\n                  <span class=\"identifier\">cb</span></code>, only required when\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  the default version calls <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_or</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_or</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">cb</span> <span class=\"special\">|</span>\n                  <span class=\"identifier\">cb2</span></code> and stores the result\n                  in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>, only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. When not provided, does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">b</span>\n                  <span class=\"special\">=</span> <span class=\"identifier\">cb</span><span class=\"special\">;</span> <span class=\"identifier\">eval_bitwise_or</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_or</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">cb</span> <span class=\"special\">|</span>\n                  <span class=\"identifier\">a</span></code> and stores the result\n                  in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>, only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_or</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_or</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">cb</span> <span class=\"special\">|</span>\n                  <span class=\"identifier\">a</span></code> and stores the result\n                  in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>, only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_or</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_xor</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">b</span> <span class=\"special\">^=</span>\n                  <span class=\"identifier\">cb</span></code>, only required when\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  the default version calls <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_xor</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_xor</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">cb</span> <span class=\"special\">^</span>\n                  <span class=\"identifier\">cb2</span></code> and stores the result\n                  in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>, only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. When not provided, does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">b</span>\n                  <span class=\"special\">=</span> <span class=\"identifier\">cb</span><span class=\"special\">;</span> <span class=\"identifier\">eval_bitwise_xor</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_xor</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">cb</span> <span class=\"special\">^</span>\n                  <span class=\"identifier\">a</span></code> and stores the result\n                  in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>, only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_xor</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_xor</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">a</span> <span class=\"special\">^</span>\n                  <span class=\"identifier\">cb</span></code> and stores the result\n                  in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>, only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. When not provided,\n                  does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">eval_bitwise_xor</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_left_shift</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">ui</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">cb</span> <span class=\"special\">&lt;&lt;</span>\n                  <span class=\"identifier\">ui</span></code> and stores the result\n                  in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>, only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. When not provided, does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">b</span>\n                  <span class=\"special\">=</span> <span class=\"identifier\">cb</span><span class=\"special\">;</span> <span class=\"identifier\">eval_left_shift</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">);</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_right_shift</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">ui</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Computes <code class=\"computeroutput\"><span class=\"identifier\">cb</span> <span class=\"special\">&gt;&gt;</span>\n                  <span class=\"identifier\">ui</span></code> and stores the result\n                  in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>, only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. When not provided, does the equivalent of <code class=\"computeroutput\"><span class=\"identifier\">b</span>\n                  <span class=\"special\">=</span> <span class=\"identifier\">cb</span><span class=\"special\">;</span> <span class=\"identifier\">eval_right_shift</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">);</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_qr</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">b2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the result\n                  of <code class=\"computeroutput\"><span class=\"identifier\">cb</span> <span class=\"special\">/</span>\n                  <span class=\"identifier\">cb2</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">b2</span></code> to the result of <code class=\"computeroutput\"><span class=\"identifier\">cb</span> <span class=\"special\">%</span>\n                  <span class=\"identifier\">cb2</span></code>. Only required when\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The default version of this function is synthesised from\n                  other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> has the value zero.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_integer_modulus</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">ui</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">unsigned</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns the result of <code class=\"computeroutput\"><span class=\"identifier\">cb</span>\n                  <span class=\"special\">%</span> <span class=\"identifier\">ui</span></code>.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an integer type. The default version of this function is synthesised\n                  from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> has the value zero.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_lsb</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">unsigned</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns the index of the least significant bit that is set. Only\n                  required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an integer type. The default version of this function is synthesised\n                  from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_msb</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">unsigned</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns the index of the most significant bit that is set. Only\n                  required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an integer type. The default version of this function is synthesised\n                  from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_bit_test</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">ui</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">bool</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns true if <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  has bit <code class=\"computeroutput\"><span class=\"identifier\">ui</span></code> set.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an integer type. The default version of this function is synthesised\n                  from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_bit_set</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">ui</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets the bit at index <code class=\"computeroutput\"><span class=\"identifier\">ui</span></code>\n                  in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>. Only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The default version of this function is synthesised from\n                  other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_bit_unset</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">ui</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Unsets the bit at index <code class=\"computeroutput\"><span class=\"identifier\">ui</span></code>\n                  in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>. Only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The default version of this function is synthesised from\n                  other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_bit_flip</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">ui</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Flips the bit at index <code class=\"computeroutput\"><span class=\"identifier\">ui</span></code>\n                  in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>. Only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The default version of this function is synthesised from\n                  other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_gcd</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the greatest\n                  common divisor of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code>. Only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The default version of this function is synthesised from\n                  other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_lcm</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the least\n                  common multiple of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code>. Only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The default version of this function is synthesised from\n                  other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_gcd</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the greatest\n                  common divisor of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code>. Only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. The default version\n                  of this function calls <code class=\"computeroutput\"><span class=\"identifier\">eval_gcd</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_lcm</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the least\n                  common multiple of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code>. Only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. The default version\n                  of this function calls <code class=\"computeroutput\"><span class=\"identifier\">eval_lcm</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">B</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">))</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_gcd</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the greatest\n                  common divisor of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>. Only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. The default version\n                  of this function calls <code class=\"computeroutput\"><span class=\"identifier\">eval_gcd</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_lcm</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the least\n                  common multiple of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>. Only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an integer\n                  type. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">float_types</span></code>. The default version\n                  of this function calls <code class=\"computeroutput\"><span class=\"identifier\">eval_lcm</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_powm</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb3</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the result\n                  of <span class=\"emphasis\"><em>(cb^cb2)%cb3</em></span>. The default version of this\n                  function is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_powm</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the result\n                  of <span class=\"emphasis\"><em>(cb^cb2)%a</em></span>. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code>. The default version\n                  of this function is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_powm</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the result\n                  of <span class=\"emphasis\"><em>(cb^a)%cb2</em></span>. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code>. The default version\n                  of this function is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_powm</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the result\n                  of <span class=\"emphasis\"><em>(cb^a)%a2</em></span>. The type of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                  shall be listed in one of the type lists <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">signed_types</span></code>,\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">unsigned_types</span></code>. The default version\n                  of this function is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_integer_sqrt</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">b2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the largest\n                  integer which when squared is less than <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>,\n                  also sets <code class=\"computeroutput\"><span class=\"identifier\">b2</span></code> to\n                  the remainder, ie to <span class=\"emphasis\"><em>cb - b<sup>2</sup></em></span>. The default\n                  version of this function is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <span class=\"emphasis\"><em>Sign manipulation:</em></span>\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_abs</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Set <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the absolute\n                  value of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>. The\n                  default version of this functions assigns <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  to <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>, and then\n                  calls <code class=\"computeroutput\"><span class=\"identifier\">b</span><span class=\"special\">.</span><span class=\"identifier\">negate</span><span class=\"special\">()</span></code>\n                  if <code class=\"computeroutput\"><span class=\"identifier\">eval_get_sign</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">)</span> <span class=\"special\">&lt;</span>\n                  <span class=\"number\">0</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_fabs</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Set <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the absolute\n                  value of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>. The\n                  default version of this functions assigns <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  to <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>, and then\n                  calls <code class=\"computeroutput\"><span class=\"identifier\">b</span><span class=\"special\">.</span><span class=\"identifier\">negate</span><span class=\"special\">()</span></code>\n                  if <code class=\"computeroutput\"><span class=\"identifier\">eval_get_sign</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">)</span> <span class=\"special\">&lt;</span>\n                  <span class=\"number\">0</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <span class=\"emphasis\"><em>floating-point functions:</em></span>\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_fpclassify</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">int</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns one of the same values returned by <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">fpclassify</span></code>.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an floating-point type. The default version of this function\n                  will only test for zero <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_trunc</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Performs the equivalent operation to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">trunc</span></code>\n                  on argument <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and stores the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an floating-point type. The default version of this function\n                  is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_round</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Performs the equivalent operation to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">round</span></code>\n                  on argument <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and stores the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an floating-point type. The default version of this function\n                  is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_exp</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Performs the equivalent operation to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">exp</span></code>\n                  on argument <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and stores the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an floating-point type. The default version of this function\n                  is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_exp2</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Performs the equivalent operation to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">exp2</span></code>\n                  on argument <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and stores the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an floating-point type. The default version of this function\n                  is implemented in terms of <code class=\"computeroutput\"><span class=\"identifier\">eval_pow</span></code>.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_log</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Performs the equivalent operation to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">log</span></code>\n                  on argument <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and stores the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an floating-point type. The default version of this function\n                  is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_log10</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Performs the equivalent operation to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">log10</span></code>\n                  on argument <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and stores the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an floating-point type. The default version of this function\n                  is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_sin</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Performs the equivalent operation to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">sin</span></code>\n                  on argument <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and stores the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an floating-point type. The default version of this function\n                  is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_cos</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Performs the equivalent operation to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cos</span></code>\n                  on argument <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and stores the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an floating-point type. The default version of this function\n                  is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_tan</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Performs the equivalent operation to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">exp</span></code>\n                  on argument <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and stores the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an floating-point type. The default version of this function\n                  is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_asin</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Performs the equivalent operation to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">asin</span></code>\n                  on argument <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and stores the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an floating-point type. The default version of this function\n                  is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_acos</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Performs the equivalent operation to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">acos</span></code>\n                  on argument <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and stores the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an floating-point type. The default version of this function\n                  is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_atan</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Performs the equivalent operation to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">atan</span></code>\n                  on argument <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and stores the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an floating-point type. The default version of this function\n                  is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_sinh</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Performs the equivalent operation to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">sinh</span></code>\n                  on argument <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and stores the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an floating-point type. The default version of this function\n                  is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_cosh</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Performs the equivalent operation to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cosh</span></code>\n                  on argument <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and stores the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an floating-point type. The default version of this function\n                  is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_tanh</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Performs the equivalent operation to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">tanh</span></code>\n                  on argument <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and stores the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an floating-point type. The default version of this function\n                  is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_fmod</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Performs the equivalent operation to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">fmod</span></code>\n                  on arguments <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code>, and store\n                  the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an floating-point type. The default version of this function\n                  is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_modf</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">pb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Performs the equivalent operation to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">modf</span></code>\n                  on argument <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>,\n                  and store the integer result in <code class=\"computeroutput\"><span class=\"special\">*</span><span class=\"identifier\">pb</span></code> and the fractional part in\n                  <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>. Only required\n                  when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code> is an floating-point\n                  type. The default version of this function is synthesised from\n                  other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_pow</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Performs the equivalent operation to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">pow</span></code>\n                  on arguments <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code>, and store\n                  the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an floating-point type. The default version of this function\n                  is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_atan2</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Performs the equivalent operation to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">atan</span></code>\n                  on arguments <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code>, and store\n                  the result in <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n                  Only required when <code class=\"computeroutput\"><span class=\"identifier\">B</span></code>\n                  is an floating-point type. The default version of this function\n                  is synthesised from other operations above.\n                </p>\n              </td>\n<td>\n                <p>\n                   \n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_scalbn</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">e</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Scales value <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  by <span class=\"emphasis\"><em>r<sup>e</sup></em></span>, where <span class=\"emphasis\"><em>r</em></span> is the\n                  radix of the type. The default version of this function is implemented\n                  in terms of eval_ldexp, consequently this function must be provided\n                  for types with a radix other than 2.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_scalbln</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">e</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Calls <code class=\"computeroutput\"><span class=\"identifier\">eval_scalbn</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">e</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_ilogb</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">exponent_type</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns the exponent <span class=\"emphasis\"><em>e</em></span> of value <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> such that <span class=\"emphasis\"><em>1 &lt;=\n                  cb*r<sup>-e</sup> &lt; r</em></span>, where <span class=\"emphasis\"><em>r</em></span> is the radix\n                  of type B. The default version of this function is implemented\n                  in terms of eval_frexp, consequently this function must be provided\n                  for types with a radix other than 2.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_remquo</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">pi</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span> <span class=\"special\">=</span>\n                  <span class=\"identifier\">cb</span> <span class=\"special\">-</span>\n                  <span class=\"identifier\">n</span> <span class=\"special\">*</span>\n                  <span class=\"identifier\">cb2</span></code> and stores <code class=\"computeroutput\"><span class=\"identifier\">n</span></code> in <code class=\"computeroutput\"><span class=\"special\">*</span><span class=\"identifier\">pi</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_remquo</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">pi</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Default version converts a to type B and calls the overload above.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_remquo</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">pi</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Default version converts a to type B and calls the overload above.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_remainder</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Default version calls eval_remquo with a dummy final argument.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_remainder</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Default version calls eval_remquo with a dummy final argument.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_remainder</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Default version calls eval_remquo with a dummy final argument.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_fdim</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Default version sets <code class=\"computeroutput\"><span class=\"identifier\">b</span>\n                  <span class=\"special\">=</span> <span class=\"identifier\">cb</span>\n                  <span class=\"special\">-</span> <span class=\"identifier\">cb2</span></code>\n                  if <code class=\"computeroutput\"><span class=\"identifier\">cb</span> <span class=\"special\">&gt;</span>\n                  <span class=\"identifier\">cb2</span></code> and zero otherwise.\n                  Special cases are handled as in the C99 annex.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_fdim</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Default version sets <code class=\"computeroutput\"><span class=\"identifier\">b</span>\n                  <span class=\"special\">=</span> <span class=\"identifier\">cb</span>\n                  <span class=\"special\">-</span> <span class=\"identifier\">cb2</span></code>\n                  if <code class=\"computeroutput\"><span class=\"identifier\">cb</span> <span class=\"special\">&gt;</span>\n                  <span class=\"identifier\">cb2</span></code> and zero otherwise.\n                  Special cases are handled as in the C99 annex.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_fdim</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Default version sets <code class=\"computeroutput\"><span class=\"identifier\">b</span>\n                  <span class=\"special\">=</span> <span class=\"identifier\">cb</span>\n                  <span class=\"special\">-</span> <span class=\"identifier\">cb2</span></code>\n                  if <code class=\"computeroutput\"><span class=\"identifier\">cb</span> <span class=\"special\">&gt;</span>\n                  <span class=\"identifier\">cb2</span></code> and zero otherwise.\n                  Special cases are handled as in the C99 annex.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_fmax</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the larger\n                  of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_fmax</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the larger\n                  of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_fmax</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the larger\n                  of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_fmin</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the smaller\n                  of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_fmin</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the smaller\n                  of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_fmin</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the smaller\n                  of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_hypot</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb2</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the square\n                  root of the sum of the squares of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  and <code class=\"computeroutput\"><span class=\"identifier\">cb2</span></code> without\n                  undue over or under flow.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_hypot</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  As above.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_hypot</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">a</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  As above.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_logb</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">B</span><span class=\"special\">::</span><span class=\"identifier\">exponent_type</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the exponent\n                  <span class=\"emphasis\"><em>e</em></span> of value <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>\n                  such that <span class=\"emphasis\"><em>1 &lt;= cb*r<sup>-b</sup> &lt; r</em></span>, where <span class=\"emphasis\"><em>r</em></span>\n                  is the radix of type B. The default version of this function is\n                  implemented in terms of <code class=\"computeroutput\"><span class=\"identifier\">eval_ilogb</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_nearbyint</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Calls <code class=\"computeroutput\"><span class=\"identifier\">eval_round</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_rint</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Calls <code class=\"computeroutput\"><span class=\"identifier\">eval_nearbyint</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">eval_log2</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> to the logarithm\n                  base 2 of <code class=\"computeroutput\"><span class=\"identifier\">cb</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <span class=\"emphasis\"><em>hashing:</em></span>\n                </p>\n              </td>\n<td class=\"auto-generated\"> </td>\n<td class=\"auto-generated\"> </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">hash_value</span><span class=\"special\">(</span><span class=\"identifier\">cb</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns a hash value for the argument that is suitable for use\n                  with <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">hash</span></code> etc. If not provided then\n                  no automatic hashing support will be available for the number type.\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><p>\n        When the tables above place no <span class=\"emphasis\"><em>throws</em></span> requirements on\n        an operation, then it is up to each type modelling this concept to decide\n        when or whether throwing an exception is desirable. However, thrown exceptions\n        should always either be the type, or inherit from the type <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code>.\n        For example, a floating-point type might choose to throw <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code>\n        whenever the result of an operation would be infinite, and <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">underflow_error</span></code>\n        whenever it would round to zero.\n      </p>\n<div class=\"note\"><table border=\"0\" summary=\"Note\">\n<tr>\n<td rowspan=\"2\" align=\"center\" valign=\"top\" width=\"25\"><img alt=\"[Note]\" src=\"../../../../../../doc/src/images/note.png\"></td>\n<th align=\"left\">Note</th>\n</tr>\n<tr><td align=\"left\" valign=\"top\"><p>\n          The non-member functions are all named with an \"eval_\" prefix\n          to avoid conflicts with template classes of the same name - in point of\n          fact this naming convention shouldn't be necessary, but rather works around\n          some compiler bugs.\n        </p></td></tr>\n</table></div>\n<h5>\n<a name=\"boost_multiprecision.ref.backendconc.h0\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.ref.backendconc.overloadable_functions\"></a></span><a class=\"link\" href=\"backendconc.html#boost_multiprecision.ref.backendconc.overloadable_functions\">Overloadable\n        Functions</a>\n      </h5>\n<p>\n        Some of the C99 math functions do not have <code class=\"computeroutput\"><span class=\"identifier\">eval_</span></code>\n        functions but must be overloaded directly: these functions are either trivial\n        or are forwarded to the Boost.Math implementations by default. The full list\n        of these functions is:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">int</span>           <span class=\"identifier\">sign</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>          <span class=\"identifier\">signbit</span>    <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>        <span class=\"identifier\">changesign</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>        <span class=\"identifier\">copysign</span>   <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>        <span class=\"identifier\">asinh</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>        <span class=\"identifier\">acosh</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>        <span class=\"identifier\">atanh</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>        <span class=\"identifier\">cbrt</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>        <span class=\"identifier\">erf</span>        <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>        <span class=\"identifier\">erfc</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>        <span class=\"identifier\">expm1</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>        <span class=\"identifier\">log1p</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>        <span class=\"identifier\">tgamma</span>     <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>        <span class=\"identifier\">lgamma</span>     <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">long</span>          <span class=\"identifier\">lrint</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">long</span> <span class=\"keyword\">long</span>     <span class=\"identifier\">llrint</span>     <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>        <span class=\"identifier\">nextafter</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>        <span class=\"identifier\">nexttoward</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"internals.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"headers.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/ref/cpp_bin_float_ref.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>cpp_bin_float</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../ref.html\" title=\"Reference\">\n<link rel=\"prev\" href=\"mpfr_ref.html\" title=\"mpfr_float_backend\">\n<link rel=\"next\" href=\"cpp_dec_ref.html\" title=\"cpp_dec_float\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"mpfr_ref.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"cpp_dec_ref.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.ref.cpp_bin_float_ref\"></a><a class=\"link\" href=\"cpp_bin_float_ref.html\" title=\"cpp_bin_float\">cpp_bin_float</a>\n</h3></div></div></div>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">enum</span> <span class=\"identifier\">digit_base_type</span>\n<span class=\"special\">{</span>\n   <span class=\"identifier\">digit_base_2</span> <span class=\"special\">=</span> <span class=\"number\">2</span><span class=\"special\">,</span>\n   <span class=\"identifier\">digit_base_10</span> <span class=\"special\">=</span> <span class=\"number\">10</span>\n<span class=\"special\">};</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits</span><span class=\"special\">,</span> <span class=\"identifier\">digit_base_type</span> <span class=\"identifier\">base</span> <span class=\"special\">=</span> <span class=\"identifier\">digit_base_10</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Allocator</span> <span class=\"special\">=</span> <span class=\"keyword\">void</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Exponent</span> <span class=\"special\">=</span> <span class=\"keyword\">int</span><span class=\"special\">,</span> <span class=\"identifier\">ExponentMin</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"identifier\">ExponentMax</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">cpp_bin_float</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"number\">100</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">cpp_bin_float_100</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"number\">24</span><span class=\"special\">,</span> <span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">digit_base_2</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">int16_t</span><span class=\"special\">,</span> <span class=\"special\">-</span><span class=\"number\">126</span><span class=\"special\">,</span> <span class=\"number\">127</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span>         <span class=\"identifier\">cpp_bin_float_single</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"number\">53</span><span class=\"special\">,</span> <span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">digit_base_2</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">int16_t</span><span class=\"special\">,</span> <span class=\"special\">-</span><span class=\"number\">1022</span><span class=\"special\">,</span> <span class=\"number\">1023</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span>       <span class=\"identifier\">cpp_bin_float_double</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"number\">64</span><span class=\"special\">,</span> <span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">digit_base_2</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">int16_t</span><span class=\"special\">,</span> <span class=\"special\">-</span><span class=\"number\">16382</span><span class=\"special\">,</span> <span class=\"number\">16383</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span>     <span class=\"identifier\">cpp_bin_float_double_extended</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"number\">113</span><span class=\"special\">,</span> <span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">digit_base_2</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">int16_t</span><span class=\"special\">,</span> <span class=\"special\">-</span><span class=\"number\">16382</span><span class=\"special\">,</span> <span class=\"number\">16383</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span>    <span class=\"identifier\">cpp_bin_float_quad</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"number\">237</span><span class=\"special\">,</span> <span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">digit_base_2</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">int32_t</span><span class=\"special\">,</span> <span class=\"special\">-</span><span class=\"number\">262142</span><span class=\"special\">,</span> <span class=\"number\">262143</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span>  <span class=\"identifier\">cpp_bin_float_oct</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n        Class template <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span></code>\n        fulfils all of the requirements for a <a class=\"link\" href=\"backendconc.html\" title=\"Backend Requirements\">Backend</a>\n        type. Its members and non-member functions are deliberately not documented:\n        these are considered implementation details that are subject to change.\n      </p>\n<p>\n        The class takes six template parameters:\n      </p>\n<div class=\"variablelist\">\n<p class=\"title\"><b></b></p>\n<dl class=\"variablelist\">\n<dt><span class=\"term\">Digits</span></dt>\n<dd><p>\n              The number of digits precision the type should support. This is normally\n              expressed as base-10 digits, but that can be changed via the second\n              template parameter.\n            </p></dd>\n<dt><span class=\"term\">base</span></dt>\n<dd><p>\n              An enumerated value (either <code class=\"computeroutput\"><span class=\"identifier\">digit_base_10</span></code>\n              or <code class=\"computeroutput\"><span class=\"identifier\">digit_base_2</span></code>) that\n              indicates whether <code class=\"computeroutput\"><span class=\"identifier\">Digits</span></code>\n              is base-10 or base-2\n            </p></dd>\n<dt><span class=\"term\">Allocator</span></dt>\n<dd><p>\n              The allocator used: defaults to type <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>,\n              meaning all storage is within the class, and no dynamic allocation\n              is performed, but can be set to a standard library allocator if dynamic\n              allocation makes more sense.\n            </p></dd>\n<dt><span class=\"term\">Exponent</span></dt>\n<dd><p>\n              A signed integer type to use as the type of the exponent - defaults\n              to <code class=\"computeroutput\"><span class=\"keyword\">int</span></code>.\n            </p></dd>\n<dt><span class=\"term\">ExponentMin</span></dt>\n<dd><p>\n              The smallest (most negative) permitted exponent, defaults to zero,\n              meaning \"define as small as possible given the limitations of\n              the type and our internal requirements\".\n            </p></dd>\n<dt><span class=\"term\">ExponentMax</span></dt>\n<dd><p>\n              The largest (most positive) permitted exponent, defaults to zero, meaning\n              \"define as large as possible given the limitations of the type\n              and our internal requirements\".\n            </p></dd>\n</dl>\n</div>\n<p>\n        The type of <code class=\"computeroutput\"><span class=\"identifier\">number_category</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"identifier\">Args</span><span class=\"special\">...&gt;</span> <span class=\"special\">&gt;::</span><span class=\"identifier\">type</span></code> is <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">integral_constant</span><span class=\"special\">&lt;</span><span class=\"keyword\">int</span><span class=\"special\">,</span>\n        <span class=\"identifier\">number_kind_floating_point</span><span class=\"special\">&gt;</span></code>.\n      </p>\n<p>\n        More information on this type can be found in the <a class=\"link\" href=\"../tut/floats/cpp_bin_float.html\" title=\"cpp_bin_float\">tutorial</a>.\n      </p>\n<h5>\n<a name=\"boost_multiprecision.ref.cpp_bin_float_ref.h0\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.ref.cpp_bin_float_ref.implementation_notes\"></a></span><a class=\"link\" href=\"cpp_bin_float_ref.html#boost_multiprecision.ref.cpp_bin_float_ref.implementation_notes\">Implementation\n        Notes</a>\n      </h5>\n<p>\n        Internally, an N-bit <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span></code>\n        is represented as an N-bit unsigned integer along with an exponent and a\n        sign. The integer part is normalized so that its most significant bit is\n        always 1. The decimal point is assumed to be directly after the most significant\n        bit of the integer part. The special values zero, infinity and NaN all have\n        the integer part set to zero, and the exponent to one of 3 special values\n        above the maximum permitted exponent.\n      </p>\n<p>\n        Multiplication is trivial: multiply the two N-bit integer mantissa's to obtain\n        a 2N-bit number, then round and adjust the sign and exponent.\n      </p>\n<p>\n        Addition and subtraction proceed similarly - if the exponents are such that\n        there is overlap between the two values, then left shift the larger value\n        to produce a number with between N and 2N bits, then perform integer addition\n        or subtraction, round, and adjust the exponent.\n      </p>\n<p>\n        Division proceeds as follows: first scale the numerator by some power of\n        2 so that integer division will produce either an N-bit or N+1 bit result\n        plus a remainder. If we get an N bit result then the size of twice the remainder\n        compared to the denominator gives us the rounding direction. Otherwise we\n        have one extra bit in the result which we can use to determine rounding (in\n        this case ties occur only if the remainder is zero and the extra bit is a\n        1).\n      </p>\n<p>\n        Square root uses integer square root in a manner analogous to division.\n      </p>\n<p>\n        Decimal string to binary conversion proceeds as follows: first parse the\n        digits to produce an integer multiplied by a decimal exponent. Note that\n        we stop parsing digits once we have parsed as many as can possibly effect\n        the result - this stops the integer part growing too large when there are\n        a very large number of input digits provided. At this stage if the decimal\n        exponent is positive then the result is an integer and we can in principle\n        simply multiply by 10^N to get an exact integer result. In practice however,\n        that could produce some very large integers. We also need to be able to divide\n        by 10^N in the event that the exponent is negative. Therefore calculation\n        of the 10^N values plus the multiplication or division are performed using\n        limited precision integer arithmetic, plus an exponent, and a track of the\n        accumulated error. At the end of the calculation we will either be able to\n        round unambiguously, or the error will be such that we can't tell which way\n        to round. In the latter case we simply up the precision and try again until\n        we have an unambiguously rounded result.\n      </p>\n<p>\n        Binary to decimal conversion proceeds very similarly to the above, our aim\n        is to calculate <code class=\"computeroutput\"><span class=\"identifier\">mantissa</span> <span class=\"special\">*</span> <span class=\"number\">2</span><span class=\"special\">^</span><span class=\"identifier\">shift</span> <span class=\"special\">*</span> <span class=\"number\">10</span><span class=\"special\">^</span><span class=\"identifier\">E</span></code>\n        where <code class=\"computeroutput\"><span class=\"identifier\">E</span></code> is the decimal exponent\n        and <code class=\"computeroutput\"><span class=\"identifier\">shift</span></code> is calculated so\n        that the result is an N bit integer assuming we want N digits printed in\n        the result. As before we use limited precision arithmetic to calculate the\n        result and up the precision as necessary until the result is unambiguously\n        correctly rounded. In addition our initial calculation of the decimal exponent\n        may be out by 1, so we have to correct that and loop as well in the that\n        case.\n      </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"mpfr_ref.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"cpp_dec_ref.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/ref/cpp_dec_ref.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>cpp_dec_float</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../ref.html\" title=\"Reference\">\n<link rel=\"prev\" href=\"cpp_bin_float_ref.html\" title=\"cpp_bin_float\">\n<link rel=\"next\" href=\"internals.html\" title=\"Internal Support Code\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"cpp_bin_float_ref.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"internals.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.ref.cpp_dec_ref\"></a><a class=\"link\" href=\"cpp_dec_ref.html\" title=\"cpp_dec_float\">cpp_dec_float</a>\n</h3></div></div></div>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">ExponentType</span> <span class=\"special\">=</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">int32_t</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Allocator</span> <span class=\"special\">=</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">cpp_dec_float</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float</span><span class=\"special\">&lt;</span><span class=\"number\">100</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">cpp_dec_float_100</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n        Class template <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float</span></code>\n        fulfils all of the requirements for a <a class=\"link\" href=\"backendconc.html\" title=\"Backend Requirements\">Backend</a>\n        type. Its members and non-member functions are deliberately not documented:\n        these are considered implementation details that are subject to change.\n      </p>\n<p>\n        The class takes three template parameters:\n      </p>\n<div class=\"variablelist\">\n<p class=\"title\"><b></b></p>\n<dl class=\"variablelist\">\n<dt><span class=\"term\">Digits10</span></dt>\n<dd><p>\n              The number of decimal digits precision the type should support. Note\n              that this type does not normally perform any dynamic memory allocation,\n              and as a result the <code class=\"computeroutput\"><span class=\"identifier\">Digits10</span></code>\n              template argument should not be set too high or the class's size will\n              grow unreasonably large.\n            </p></dd>\n<dt><span class=\"term\">ExponentType</span></dt>\n<dd><p>\n              A signed integer type that represents the exponent of the number\n            </p></dd>\n<dt><span class=\"term\">Allocator</span></dt>\n<dd><p>\n              The allocator used: defaults to type <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>,\n              meaning all storage is within the class, and no dynamic allocation\n              is performed, but can be set to a standard library allocator if dynamic\n              allocation makes more sense.\n            </p></dd>\n</dl>\n</div>\n<p>\n        The type of <code class=\"computeroutput\"><span class=\"identifier\">number_category</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float</span><span class=\"special\">&lt;</span><span class=\"identifier\">Args</span><span class=\"special\">...&gt;</span> <span class=\"special\">&gt;::</span><span class=\"identifier\">type</span></code> is <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">integral_constant</span><span class=\"special\">&lt;</span><span class=\"keyword\">int</span><span class=\"special\">,</span>\n        <span class=\"identifier\">number_kind_floating_point</span><span class=\"special\">&gt;</span></code>.\n      </p>\n<p>\n        More information on this type can be found in the <a class=\"link\" href=\"../tut/floats/cpp_dec_float.html\" title=\"cpp_dec_float\">tutorial</a>.\n      </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"cpp_bin_float_ref.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"internals.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/ref/cpp_int_ref.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>cpp_int</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../ref.html\" title=\"Reference\">\n<link rel=\"prev\" href=\"number.html\" title=\"number\">\n<link rel=\"next\" href=\"gmp_int_ref.html\" title=\"gmp_int\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"number.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"gmp_int_ref.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.ref.cpp_int_ref\"></a><a class=\"link\" href=\"cpp_int_ref.html\" title=\"cpp_int\">cpp_int</a>\n</h3></div></div></div>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">unspecified</span><span class=\"special\">-</span><span class=\"identifier\">type</span> <span class=\"identifier\">limb_type</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">enum</span> <span class=\"identifier\">cpp_integer_type</span>    <span class=\"special\">{</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">unsigned_magnitude</span> <span class=\"special\">};</span>\n<span class=\"keyword\">enum</span> <span class=\"identifier\">cpp_int_check_type</span>  <span class=\"special\">{</span> <span class=\"identifier\">checked</span><span class=\"special\">,</span> <span class=\"identifier\">unchecked</span> <span class=\"special\">};</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">MinDigits</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">,</span>\n          <span class=\"keyword\">unsigned</span> <span class=\"identifier\">MaxDits</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">,</span>\n          <span class=\"identifier\">cpp_integer_type</span> <span class=\"identifier\">SignType</span> <span class=\"special\">=</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span>\n          <span class=\"identifier\">cpp_int_check_type</span> <span class=\"identifier\">Checked</span> <span class=\"special\">=</span> <span class=\"identifier\">unchecked</span><span class=\"special\">,</span>\n          <span class=\"keyword\">class</span> <span class=\"identifier\">Allocator</span> <span class=\"special\">=</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">allocator</span><span class=\"special\">&lt;</span><span class=\"identifier\">limb_type</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">cpp_int_backend</span><span class=\"special\">;</span>\n<span class=\"comment\">//</span>\n<span class=\"comment\">// Expression templates default to et_off if there is no allocator:</span>\n<span class=\"comment\">//</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">MinDigits</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">MaxDigits</span><span class=\"special\">,</span> <span class=\"identifier\">cpp_integer_type</span> <span class=\"identifier\">SignType</span><span class=\"special\">,</span> <span class=\"identifier\">cpp_int_check_type</span> <span class=\"identifier\">Checked</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">struct</span> <span class=\"identifier\">expression_template_default</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">MinDigits</span><span class=\"special\">,</span> <span class=\"identifier\">MaxDigits</span><span class=\"special\">,</span> <span class=\"identifier\">SignType</span><span class=\"special\">,</span> <span class=\"identifier\">Checked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>\n<span class=\"special\">{</span> <span class=\"keyword\">static</span> <span class=\"keyword\">const</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">value</span> <span class=\"special\">=</span> <span class=\"identifier\">et_off</span><span class=\"special\">;</span> <span class=\"special\">};</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;&gt;</span> <span class=\"special\">&gt;</span>              <span class=\"identifier\">cpp_int</span><span class=\"special\">;</span>    <span class=\"comment\">// arbitrary precision integer</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">rational_adaptor</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;&gt;</span> <span class=\"special\">&gt;</span>    <span class=\"identifier\">cpp_rational_backend</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_rational_backend</span><span class=\"special\">&gt;</span>            <span class=\"identifier\">cpp_rational</span><span class=\"special\">;</span> <span class=\"comment\">// arbitrary precision rational number</span>\n\n<span class=\"comment\">// Fixed precision unsigned types:</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">128</span><span class=\"special\">,</span> <span class=\"number\">128</span><span class=\"special\">,</span> <span class=\"identifier\">unsigned_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">unchecked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">uint128_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">256</span><span class=\"special\">,</span> <span class=\"number\">256</span><span class=\"special\">,</span> <span class=\"identifier\">unsigned_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">unchecked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">uint256_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">512</span><span class=\"special\">,</span> <span class=\"number\">512</span><span class=\"special\">,</span> <span class=\"identifier\">unsigned_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">unchecked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">uint512_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">1024</span><span class=\"special\">,</span> <span class=\"number\">1024</span><span class=\"special\">,</span> <span class=\"identifier\">unsigned_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">unchecked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">uint1024_t</span><span class=\"special\">;</span>\n\n<span class=\"comment\">// Fixed precision signed types:</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">128</span><span class=\"special\">,</span> <span class=\"number\">128</span><span class=\"special\">,</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">unchecked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>     <span class=\"identifier\">int128_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">256</span><span class=\"special\">,</span> <span class=\"number\">256</span><span class=\"special\">,</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">unchecked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>     <span class=\"identifier\">int256_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">512</span><span class=\"special\">,</span> <span class=\"number\">512</span><span class=\"special\">,</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">unchecked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>     <span class=\"identifier\">int512_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">1024</span><span class=\"special\">,</span> <span class=\"number\">1024</span><span class=\"special\">,</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">unchecked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">int1024_t</span><span class=\"special\">;</span>\n\n<span class=\"comment\">// Over again, but with checking enabled this time:</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">checked</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>                 <span class=\"identifier\">checked_cpp_int</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">rational_adaptor</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">checked</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>       <span class=\"identifier\">checked_cpp_rational_backend</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">checked_cpp_rational_backend</span><span class=\"special\">&gt;</span>                                      <span class=\"identifier\">checked_cpp_rational</span><span class=\"special\">;</span>\n\n<span class=\"comment\">// Checked fixed precision unsigned types:</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">128</span><span class=\"special\">,</span> <span class=\"number\">128</span><span class=\"special\">,</span> <span class=\"identifier\">unsigned_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">checked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>     <span class=\"identifier\">checked_uint128_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">256</span><span class=\"special\">,</span> <span class=\"number\">256</span><span class=\"special\">,</span> <span class=\"identifier\">unsigned_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">checked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>     <span class=\"identifier\">checked_uint256_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">512</span><span class=\"special\">,</span> <span class=\"number\">512</span><span class=\"special\">,</span> <span class=\"identifier\">unsigned_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">checked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>     <span class=\"identifier\">checked_uint512_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">1024</span><span class=\"special\">,</span> <span class=\"number\">1024</span><span class=\"special\">,</span> <span class=\"identifier\">unsigned_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">checked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">checked_uint1024_t</span><span class=\"special\">;</span>\n\n<span class=\"comment\">// Fixed precision signed types:</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">128</span><span class=\"special\">,</span> <span class=\"number\">128</span><span class=\"special\">,</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">checked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>       <span class=\"identifier\">checked_int128_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">256</span><span class=\"special\">,</span> <span class=\"number\">256</span><span class=\"special\">,</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">checked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>       <span class=\"identifier\">checked_int256_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">512</span><span class=\"special\">,</span> <span class=\"number\">512</span><span class=\"special\">,</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">checked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>       <span class=\"identifier\">checked_int512_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">1024</span><span class=\"special\">,</span> <span class=\"number\">1024</span><span class=\"special\">,</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">checked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>     <span class=\"identifier\">checked_int1024_t</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n        Class template <code class=\"computeroutput\"><span class=\"identifier\">cpp_int_backend</span></code>\n        fulfils all of the requirements for a <a class=\"link\" href=\"backendconc.html\" title=\"Backend Requirements\">Backend</a>\n        type. Its members and non-member functions are deliberately not documented:\n        these are considered implementation details that are subject to change.\n      </p>\n<p>\n        The template arguments are:\n      </p>\n<div class=\"variablelist\">\n<p class=\"title\"><b></b></p>\n<dl class=\"variablelist\">\n<dt><span class=\"term\">MinBits</span></dt>\n<dd><p>\n              Determines the number of Bits to store directly within the object before\n              resorting to dynamic memory allocation. When zero, this field is determined\n              automatically based on how many bits can be stored in union with the\n              dynamic storage header: setting a larger value may improve performance\n              as larger integer values will be stored internally before memory allocation\n              is required.\n            </p></dd>\n<dt><span class=\"term\">MaxBits</span></dt>\n<dd><p>\n              Determines the maximum number of bits to be stored in the type: resulting\n              in a fixed precision type. When this value is the same as MinBits,\n              then the Allocator parameter is ignored, as no dynamic memory allocation\n              will ever be performed: in this situation the Allocator parameter should\n              be set to type <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>. Note\n              that this parameter should not be used simply to prevent large memory\n              allocations, not only is that role better performed by the allocator,\n              but fixed precision integers have a tendency to allocate all of MaxBits\n              of storage more often than one would expect.\n            </p></dd>\n<dt><span class=\"term\">SignType</span></dt>\n<dd><p>\n              Determines whether the resulting type is signed or not. Note that for\n              <a href=\"http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic\" target=\"_top\">arbitrary\n              precision</a> types this parameter must be <code class=\"computeroutput\"><span class=\"identifier\">signed_magnitude</span></code>.\n              For fixed precision types then this type may be either <code class=\"computeroutput\"><span class=\"identifier\">signed_magnitude</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">unsigned_magnitude</span></code>.\n            </p></dd>\n<dt><span class=\"term\">Checked</span></dt>\n<dd><p>\n              This parameter has two values: <code class=\"computeroutput\"><span class=\"identifier\">checked</span></code>\n              or <code class=\"computeroutput\"><span class=\"identifier\">unchecked</span></code>. See the\n              <a class=\"link\" href=\"../tut/ints/cpp_int.html\" title=\"cpp_int\">tutorial</a>\n              for more information.\n            </p></dd>\n<dt><span class=\"term\">Allocator</span></dt>\n<dd><p>\n              The allocator to use for dynamic memory allocation, or type <code class=\"computeroutput\"><span class=\"keyword\">void</span></code> if MaxBits == MinBits.\n            </p></dd>\n</dl>\n</div>\n<p>\n        The type of <code class=\"computeroutput\"><span class=\"identifier\">number_category</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int</span><span class=\"special\">&lt;</span><span class=\"identifier\">Args</span><span class=\"special\">...&gt;</span> <span class=\"special\">&gt;::</span><span class=\"identifier\">type</span></code> is <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">integral_constant</span><span class=\"special\">&lt;</span><span class=\"keyword\">int</span><span class=\"special\">,</span>\n        <span class=\"identifier\">number_kind_integer</span><span class=\"special\">&gt;</span></code>.\n      </p>\n<p>\n        More information on this type can be found in the <a class=\"link\" href=\"../tut/ints/cpp_int.html\" title=\"cpp_int\">tutorial</a>.\n      </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"number.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"gmp_int_ref.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/ref/gmp_int_ref.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>gmp_int</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../ref.html\" title=\"Reference\">\n<link rel=\"prev\" href=\"cpp_int_ref.html\" title=\"cpp_int\">\n<link rel=\"next\" href=\"tom_int_ref.html\" title=\"tom_int\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"cpp_int_ref.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"tom_int_ref.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.ref.gmp_int_ref\"></a><a class=\"link\" href=\"gmp_int_ref.html\" title=\"gmp_int\">gmp_int</a>\n</h3></div></div></div>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">class</span> <span class=\"identifier\">gmp_int</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_int</span> <span class=\"special\">&gt;</span>         <span class=\"identifier\">mpz_int</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n        Class template <code class=\"computeroutput\"><span class=\"identifier\">gmp_int</span></code> fulfils\n        all of the requirements for a <a class=\"link\" href=\"backendconc.html\" title=\"Backend Requirements\">Backend</a>\n        type. Its members and non-member functions are deliberately not documented:\n        these are considered implementation details that are subject to change.\n      </p>\n<p>\n        The type of <code class=\"computeroutput\"><span class=\"identifier\">number_category</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int</span><span class=\"special\">&lt;</span><span class=\"identifier\">Args</span><span class=\"special\">...&gt;</span> <span class=\"special\">&gt;::</span><span class=\"identifier\">type</span></code> is <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">integral_constant</span><span class=\"special\">&lt;</span><span class=\"keyword\">int</span><span class=\"special\">,</span>\n        <span class=\"identifier\">number_kind_integer</span><span class=\"special\">&gt;</span></code>.\n      </p>\n<p>\n        More information on this type can be found in the <a class=\"link\" href=\"../tut/ints/gmp_int.html\" title=\"gmp_int\">tutorial</a>.\n      </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"cpp_int_ref.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"tom_int_ref.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/ref/headers.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Header File Structure</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../ref.html\" title=\"Reference\">\n<link rel=\"prev\" href=\"backendconc.html\" title=\"Backend Requirements\">\n<link rel=\"next\" href=\"../perf.html\" title=\"Performance Comparison\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"backendconc.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../perf.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.ref.headers\"></a><a class=\"link\" href=\"headers.html\" title=\"Header File Structure\">Header File Structure</a>\n</h3></div></div></div>\n<div class=\"table\">\n<a name=\"boost_multiprecision.ref.headers.top_level_headers\"></a><p class=\"title\"><b>Table 1.10. Top level headers</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Top level headers\">\n<colgroup>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Header\n                </p>\n              </th>\n<th>\n                <p>\n                  Contains\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  The <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code> backend\n                  type.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  gmp.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Defines all <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> related\n                  backends.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  miller_rabin.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Miller Rabin primality testing code.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  number.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Defines the <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n                  backend, is included by all the backend headers.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  mpfr.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Defines the mpfr_float_backend backend.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  random.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Defines code to interoperate with Boost.Random.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  rational_adaptor.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Defines the <code class=\"computeroutput\"><span class=\"identifier\">rational_adaptor</span></code>\n                  backend.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_dec_float.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Defines the <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float</span></code>\n                  backend.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tommath.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Defines the <code class=\"computeroutput\"><span class=\"identifier\">tommath_int</span></code>\n                  backend.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  concepts/number_archetypes.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Defines a backend concept archetypes for testing use.\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.ref.headers.implementation_headers\"></a><p class=\"title\"><b>Table 1.11. Implementation Headers</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Implementation Headers\">\n<colgroup>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Header\n                </p>\n              </th>\n<th>\n                <p>\n                  Contains\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  cpp_int/add.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Add and subtract operators for <code class=\"computeroutput\"><span class=\"identifier\">cpp_int_backend</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int/bitwise.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Bitwise operators for <code class=\"computeroutput\"><span class=\"identifier\">cpp_int_backend</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int/checked.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Helper functions for checked arithmetic for <code class=\"computeroutput\"><span class=\"identifier\">cpp_int_backend</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int/comparison.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Comparison operators for <code class=\"computeroutput\"><span class=\"identifier\">cpp_int_backend</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int/cpp_int_config.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Basic setup and configuration for <code class=\"computeroutput\"><span class=\"identifier\">cpp_int_backend</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int/divide.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Division and modulus operators for <code class=\"computeroutput\"><span class=\"identifier\">cpp_int_backend</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int/limits.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">numeric_limits</span></code>\n                  support for <code class=\"computeroutput\"><span class=\"identifier\">cpp_int_backend</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int/misc.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Miscellaneous operators for <code class=\"computeroutput\"><span class=\"identifier\">cpp_int_backend</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cpp_int/multiply.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Multiply operators for <code class=\"computeroutput\"><span class=\"identifier\">cpp_int_backend</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  detail/default_ops.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Default versions of the optional backend non-member functions.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  detail/generic_interconvert.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Generic interconversion routines.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  detail/number_base.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  All the expression template code, metaprogramming, and operator\n                  overloads for <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  detail/no_et_ops.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  The non-expression template operators.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  detail/functions/constants.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Defines constants used by the floating-point functions.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  detail/functions/pow.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Defines default versions of the power and exponential related floating-point\n                  functions.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  detail/functions/trig.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  Defines default versions of the trigonometric related floating-point\n                  functions.\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\">\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"backendconc.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../perf.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/ref/internals.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Internal Support Code</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../ref.html\" title=\"Reference\">\n<link rel=\"prev\" href=\"cpp_dec_ref.html\" title=\"cpp_dec_float\">\n<link rel=\"next\" href=\"backendconc.html\" title=\"Backend Requirements\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"cpp_dec_ref.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"backendconc.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.ref.internals\"></a><a class=\"link\" href=\"internals.html\" title=\"Internal Support Code\">Internal Support\n      Code</a>\n</h3></div></div></div>\n<p>\n        There are some traits classes which authors of new backends should be aware\n        of:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">detail</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">template</span><span class=\"special\">&lt;</span><span class=\"keyword\">typename</span> <span class=\"identifier\">From</span><span class=\"special\">,</span> <span class=\"keyword\">typename</span> <span class=\"identifier\">To</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">struct</span> <span class=\"identifier\">is_explicitly_convertible</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}}</span>\n</pre>\n<p>\n        Inherits from <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">integral_constant</span><span class=\"special\">&lt;</span><span class=\"keyword\">bool</span><span class=\"special\">,</span><span class=\"keyword\">true</span><span class=\"special\">&gt;</span></code> if type <code class=\"computeroutput\"><span class=\"identifier\">From</span></code>\n        has an explicit conversion from <code class=\"computeroutput\"><span class=\"identifier\">To</span></code>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">From</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">To</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">struct</span> <span class=\"identifier\">is_lossy_conversion</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">static</span> <span class=\"keyword\">const</span> <span class=\"keyword\">bool</span> <span class=\"identifier\">value</span> <span class=\"special\">=</span> <span class=\"identifier\">see</span> <span class=\"identifier\">below</span><span class=\"special\">;</span>\n<span class=\"special\">};</span>\n</pre>\n<p>\n        Member <code class=\"computeroutput\"><span class=\"identifier\">value</span></code> is true if the\n        conversion from <code class=\"computeroutput\"><span class=\"identifier\">From</span></code> to\n        <code class=\"computeroutput\"><span class=\"identifier\">To</span></code> would result in a loss\n        of precision, and <code class=\"computeroutput\"><span class=\"keyword\">false</span></code> otherwise.\n      </p>\n<p>\n        The default version of this trait simply checks whether the <span class=\"emphasis\"><em>kind</em></span>\n        of conversion (for example from a floating-point to an integer type) is inherently\n        lossy. Note that if either of the types <code class=\"computeroutput\"><span class=\"identifier\">From</span></code>\n        or <code class=\"computeroutput\"><span class=\"identifier\">To</span></code> are of an unknown number\n        category (because <code class=\"computeroutput\"><span class=\"identifier\">number_category</span></code>\n        is not specialised for that type) then this trait will be <code class=\"computeroutput\"><span class=\"keyword\">true</span></code>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span><span class=\"special\">&lt;</span><span class=\"keyword\">typename</span> <span class=\"identifier\">From</span><span class=\"special\">,</span> <span class=\"keyword\">typename</span> <span class=\"identifier\">To</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">struct</span> <span class=\"identifier\">is_restricted_conversion</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">static</span> <span class=\"keyword\">const</span> <span class=\"keyword\">bool</span> <span class=\"identifier\">value</span> <span class=\"special\">=</span> <span class=\"identifier\">see</span> <span class=\"identifier\">below</span><span class=\"special\">;</span>\n<span class=\"special\">};</span>\n</pre>\n<p>\n        Member <code class=\"computeroutput\"><span class=\"identifier\">value</span></code> is <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">From</span></code>\n        is only explicitly convertible to <code class=\"computeroutput\"><span class=\"identifier\">To</span></code>\n        and not implicitly convertible, or if <code class=\"computeroutput\"><span class=\"identifier\">is_lossy_conversion</span><span class=\"special\">&lt;</span><span class=\"identifier\">From</span><span class=\"special\">,</span> <span class=\"identifier\">To</span><span class=\"special\">&gt;::</span><span class=\"identifier\">value</span></code> is <code class=\"computeroutput\"><span class=\"keyword\">true</span></code>.\n        Otherwise <code class=\"computeroutput\"><span class=\"keyword\">false</span></code>.\n      </p>\n<p>\n        Note that while this trait is the ultimate arbiter of which constructors\n        are marked as <code class=\"computeroutput\"><span class=\"keyword\">explicit</span></code> in class\n        <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>, authors of backend\n        types should generally specialise one of the traits above, rather than this\n        one directly.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">is_signed_number</span><span class=\"special\">;</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">is_unsigned_number</span><span class=\"special\">;</span>\n</pre>\n<p>\n        These two traits inherit from either <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">integral_constant</span><span class=\"special\">&lt;</span><span class=\"keyword\">bool</span><span class=\"special\">,</span>\n        <span class=\"keyword\">true</span><span class=\"special\">&gt;</span></code>\n        or <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">integral_constant</span><span class=\"special\">&lt;</span><span class=\"keyword\">bool</span><span class=\"special\">,</span> <span class=\"keyword\">false</span><span class=\"special\">&gt;</span></code>, by default types are assumed to be signed\n        unless <code class=\"computeroutput\"><span class=\"identifier\">is_unsigned_number</span></code>\n        is specialized for that type.\n      </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"cpp_dec_ref.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"backendconc.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/ref/mpf_ref.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>gmp_float</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../ref.html\" title=\"Reference\">\n<link rel=\"prev\" href=\"tom_int_ref.html\" title=\"tom_int\">\n<link rel=\"next\" href=\"mpfr_ref.html\" title=\"mpfr_float_backend\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"tom_int_ref.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"mpfr_ref.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.ref.mpf_ref\"></a><a class=\"link\" href=\"mpf_ref.html\" title=\"gmp_float\">gmp_float</a>\n</h3></div></div></div>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">gmp_float</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_float</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>    <span class=\"identifier\">mpf_float_50</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_float</span><span class=\"special\">&lt;</span><span class=\"number\">100</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">mpf_float_100</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_float</span><span class=\"special\">&lt;</span><span class=\"number\">500</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">mpf_float_500</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_float</span><span class=\"special\">&lt;</span><span class=\"number\">1000</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>  <span class=\"identifier\">mpf_float_1000</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_float</span><span class=\"special\">&lt;</span><span class=\"number\">0</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>     <span class=\"identifier\">mpf_float</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n        Class template <code class=\"computeroutput\"><span class=\"identifier\">gmp_float</span></code>\n        fulfils all of the requirements for a <a class=\"link\" href=\"backendconc.html\" title=\"Backend Requirements\">Backend</a>\n        type. Its members and non-member functions are deliberately not documented:\n        these are considered implementation details that are subject to change.\n      </p>\n<p>\n        The class takes a single template parameter - <code class=\"computeroutput\"><span class=\"identifier\">Digits10</span></code>\n        - which is the number of decimal digits precision the type should support.\n        When this parameter is zero, then the precision can be set at runtime via\n        <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">::</span><span class=\"identifier\">default_precision</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">::</span><span class=\"identifier\">precision</span></code>.\n        Note that this type does not in any way change the GMP library's global state\n        (for example it does not change the default precision of the mpf_t data type),\n        therefore you can safely mix this type with existing code that uses GMP,\n        and also mix <code class=\"computeroutput\"><span class=\"identifier\">gmp_float</span></code>s of\n        differing precision.\n      </p>\n<p>\n        The type of <code class=\"computeroutput\"><span class=\"identifier\">number_category</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int</span><span class=\"special\">&lt;</span><span class=\"identifier\">Args</span><span class=\"special\">...&gt;</span> <span class=\"special\">&gt;::</span><span class=\"identifier\">type</span></code> is <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">integral_constant</span><span class=\"special\">&lt;</span><span class=\"keyword\">int</span><span class=\"special\">,</span>\n        <span class=\"identifier\">number_kind_floating_point</span><span class=\"special\">&gt;</span></code>.\n      </p>\n<p>\n        More information on this type can be found in the <a class=\"link\" href=\"../tut/floats/gmp_float.html\" title=\"gmp_float\">tutorial</a>.\n      </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"tom_int_ref.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"mpfr_ref.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/ref/mpfr_ref.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>mpfr_float_backend</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../ref.html\" title=\"Reference\">\n<link rel=\"prev\" href=\"mpf_ref.html\" title=\"gmp_float\">\n<link rel=\"next\" href=\"cpp_bin_float_ref.html\" title=\"cpp_bin_float\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"mpf_ref.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"cpp_bin_float_ref.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.ref.mpfr_ref\"></a><a class=\"link\" href=\"mpfr_ref.html\" title=\"mpfr_float_backend\">mpfr_float_backend</a>\n</h3></div></div></div>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>    <span class=\"identifier\">mpfr_float_50</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">100</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">mpfr_float_100</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">500</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">mpfr_float_500</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">1000</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>  <span class=\"identifier\">mpfr_float_1000</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">0</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>     <span class=\"identifier\">mpfr_float</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n        Class template <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float_backend</span></code>\n        fulfils all of the requirements for a <a class=\"link\" href=\"backendconc.html\" title=\"Backend Requirements\">Backend</a>\n        type. Its members and non-member functions are deliberately not documented:\n        these are considered implementation details that are subject to change.\n      </p>\n<p>\n        The class takes a single template parameter - <code class=\"computeroutput\"><span class=\"identifier\">Digits10</span></code>\n        - which is the number of decimal digits precision the type should support.\n        When this parameter is zero, then the precision can be set at runtime via\n        <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">::</span><span class=\"identifier\">default_precision</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">::</span><span class=\"identifier\">precision</span></code>.\n        Note that this type does not in any way change the GMP or MPFR library's\n        global state (for example it does not change the default precision of the\n        mpfr_t data type), therefore you can safely mix this type with existing code\n        that uses GMP or MPFR, and also mix <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float_backend</span></code>s\n        of differing precision.\n      </p>\n<p>\n        The type of <code class=\"computeroutput\"><span class=\"identifier\">number_category</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int</span><span class=\"special\">&lt;</span><span class=\"identifier\">Args</span><span class=\"special\">...&gt;</span> <span class=\"special\">&gt;::</span><span class=\"identifier\">type</span></code> is <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">integral_constant</span><span class=\"special\">&lt;</span><span class=\"keyword\">int</span><span class=\"special\">,</span>\n        <span class=\"identifier\">number_kind_floating_point</span><span class=\"special\">&gt;</span></code>.\n      </p>\n<p>\n        More information on this type can be found in the <a class=\"link\" href=\"../tut/floats/mpfr_float.html\" title=\"mpfr_float\">tutorial</a>.\n      </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"mpf_ref.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"cpp_bin_float_ref.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/ref/number.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>number</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../ref.html\" title=\"Reference\">\n<link rel=\"prev\" href=\"../ref.html\" title=\"Reference\">\n<link rel=\"next\" href=\"cpp_int_ref.html\" title=\"cpp_int\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"cpp_int_ref.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.ref.number\"></a><a class=\"link\" href=\"number.html\" title=\"number\">number</a>\n</h3></div></div></div>\n<h5>\n<a name=\"boost_multiprecision.ref.number.h0\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.ref.number.synopsis\"></a></span><a class=\"link\" href=\"number.html#boost_multiprecision.ref.number.synopsis\">Synopsis</a>\n      </h5>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">enum</span> <span class=\"identifier\">expression_template_option</span> <span class=\"special\">{</span> <span class=\"identifier\">et_on</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">,</span> <span class=\"identifier\">et_off</span> <span class=\"special\">=</span> <span class=\"number\">0</span> <span class=\"special\">};</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">&gt;</span> <span class=\"keyword\">struct</span> <span class=\"identifier\">expression_template_default</span>\n<span class=\"special\">{</span> <span class=\"keyword\">static</span> <span class=\"keyword\">const</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">value</span> <span class=\"special\">=</span> <span class=\"identifier\">et_on</span><span class=\"special\">;</span> <span class=\"special\">};</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span> <span class=\"special\">=</span> <span class=\"identifier\">expression_template_default</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">&gt;::</span><span class=\"identifier\">value</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">number</span>\n<span class=\"special\">{</span>\n<span class=\"keyword\">public</span><span class=\"special\">:</span>\n   <span class=\"keyword\">typedef</span>          <span class=\"identifier\">Backend</span>                          <span class=\"identifier\">backend_type</span><span class=\"special\">;</span>\n   <span class=\"keyword\">typedef</span> <span class=\"keyword\">typename</span> <span class=\"identifier\">component_type</span><span class=\"special\">&lt;</span><span class=\"identifier\">self_type</span><span class=\"special\">&gt;::</span><span class=\"identifier\">type</span>  <span class=\"identifier\">value_type</span><span class=\"special\">;</span>\n\n   <span class=\"keyword\">static</span> <span class=\"keyword\">constexpr</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">et</span> <span class=\"special\">=</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">number</span><span class=\"special\">();</span>\n   <span class=\"identifier\">number</span><span class=\"special\">(</span><span class=\"identifier\">see</span><span class=\"special\">-</span><span class=\"identifier\">below</span><span class=\"special\">);</span>\n   <span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">=(</span><span class=\"identifier\">see</span><span class=\"special\">-</span><span class=\"identifier\">below</span><span class=\"special\">);</span>\n   <span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"identifier\">assign</span><span class=\"special\">(</span><span class=\"identifier\">see</span><span class=\"special\">-</span><span class=\"identifier\">below</span><span class=\"special\">);</span>\n\n   <span class=\"comment\">// Member operators</span>\n   <span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">+=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n   <span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">-=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n   <span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">*=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n   <span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">/=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n   <span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">++();</span>\n   <span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">--();</span>\n   <span class=\"identifier\">number</span>  <span class=\"keyword\">operator</span><span class=\"special\">++(</span><span class=\"keyword\">int</span><span class=\"special\">);</span>\n   <span class=\"identifier\">number</span>  <span class=\"keyword\">operator</span><span class=\"special\">--(</span><span class=\"keyword\">int</span><span class=\"special\">);</span>\n\n   <span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">%=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n   <span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">&amp;=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n   <span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">|=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n   <span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">^=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n   <span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">&lt;&lt;=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>integer-type</em></span><span class=\"special\">&amp;);</span>\n   <span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">&gt;&gt;=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>integer-type</em></span><span class=\"special\">&amp;);</span>\n\n   <span class=\"comment\">// Use in Boolean context:</span>\n   <span class=\"keyword\">operator</span> <span class=\"emphasis\"><em>convertible-to-bool-type</em></span><span class=\"special\">()</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n   <span class=\"comment\">// swap:</span>\n   <span class=\"keyword\">void</span> <span class=\"identifier\">swap</span><span class=\"special\">(</span><span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"identifier\">other</span><span class=\"special\">);</span>\n   <span class=\"comment\">// Sign:</span>\n   <span class=\"keyword\">bool</span> <span class=\"identifier\">is_zero</span><span class=\"special\">()</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n   <span class=\"keyword\">int</span> <span class=\"identifier\">sign</span><span class=\"special\">()</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n   <span class=\"comment\">// string conversion:</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">string</span> <span class=\"identifier\">str</span><span class=\"special\">()</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n   <span class=\"comment\">// Generic conversion mechanism</span>\n   <span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n   <span class=\"identifier\">T</span> <span class=\"identifier\">convert_to</span><span class=\"special\">()</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n   <span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n   <span class=\"keyword\">explicit</span> <span class=\"keyword\">operator</span> <span class=\"identifier\">T</span> <span class=\"special\">()</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n   <span class=\"comment\">// precision control:</span>\n   <span class=\"keyword\">static</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">default_precision</span><span class=\"special\">();</span>\n   <span class=\"keyword\">static</span> <span class=\"keyword\">void</span> <span class=\"identifier\">default_precision</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n   <span class=\"keyword\">unsigned</span> <span class=\"identifier\">precision</span><span class=\"special\">()</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n   <span class=\"keyword\">void</span> <span class=\"identifier\">precision</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n   <span class=\"comment\">// Comparison:</span>\n   <span class=\"keyword\">int</span> <span class=\"identifier\">compare</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">o</span><span class=\"special\">)</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n   <span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">V</span><span class=\"special\">&gt;</span>\n   <span class=\"keyword\">typename</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">enable_if</span><span class=\"special\">&lt;</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">is_convertible</span><span class=\"special\">&lt;</span><span class=\"identifier\">V</span><span class=\"special\">,</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;::</span><span class=\"identifier\">value</span> <span class=\"special\">&gt;,</span> <span class=\"keyword\">int</span><span class=\"special\">&gt;::</span><span class=\"identifier\">type</span>\n      <span class=\"identifier\">compare</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">V</span><span class=\"special\">&amp;</span> <span class=\"identifier\">o</span><span class=\"special\">)</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n   <span class=\"comment\">// real and imaginary parts:</span>\n   <span class=\"identifier\">value_type</span> <span class=\"identifier\">real</span><span class=\"special\">()</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n   <span class=\"identifier\">value_type</span> <span class=\"identifier\">imag</span><span class=\"special\">()</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n   <span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n   <span class=\"keyword\">void</span> <span class=\"identifier\">real</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">T</span><span class=\"special\">&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">);</span>\n   <span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n   <span class=\"keyword\">void</span> <span class=\"identifier\">imag</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">T</span><span class=\"special\">&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">);</span>\n   <span class=\"comment\">// Access to the underlying implementation:</span>\n   <span class=\"identifier\">Backend</span><span class=\"special\">&amp;</span> <span class=\"identifier\">backend</span><span class=\"special\">();</span>\n   <span class=\"keyword\">const</span> <span class=\"identifier\">Backend</span><span class=\"special\">&amp;</span> <span class=\"identifier\">backend</span><span class=\"special\">()</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n<span class=\"special\">};</span>\n\n<span class=\"comment\">// Non member operators:</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">+(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">-(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">+(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">-(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">*(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">/(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"comment\">// Integer only operations:</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">%(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">&amp;(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">|(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">^(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">&lt;&lt;(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>integer-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">&gt;&gt;(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>integer-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"comment\">// Comparison operators:</span>\n<span class=\"keyword\">bool</span> <span class=\"keyword\">operator</span><span class=\"special\">==(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span> <span class=\"keyword\">operator</span><span class=\"special\">!=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span> <span class=\"keyword\">operator</span><span class=\"special\">&lt;</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span> <span class=\"keyword\">operator</span><span class=\"special\">&gt;</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span> <span class=\"keyword\">operator</span><span class=\"special\">&lt;=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span> <span class=\"keyword\">operator</span><span class=\"special\">&gt;=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n\n<span class=\"comment\">// Swap:</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">void</span> <span class=\"identifier\">swap</span><span class=\"special\">(</span><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">);</span>\n\n<span class=\"comment\">// iostream support:</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">ostream</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span> <span class=\"special\">&lt;&lt;</span> <span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">ostream</span><span class=\"special\">&amp;</span> <span class=\"identifier\">os</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">r</span><span class=\"special\">);</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">ostream</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span> <span class=\"special\">&lt;&lt;</span> <span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">ostream</span><span class=\"special\">&amp;</span> <span class=\"identifier\">os</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">r</span><span class=\"special\">);</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">istream</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span> <span class=\"special\">&gt;&gt;</span> <span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">istream</span><span class=\"special\">&amp;</span> <span class=\"identifier\">is</span><span class=\"special\">,</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">r</span><span class=\"special\">);</span>\n\n<span class=\"comment\">// to_string support:</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">string</span> <span class=\"identifier\">to_string</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">);</span>\n\n<span class=\"comment\">// Arithmetic with a higher precision result:</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">ResultType</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Source1</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Source2</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">ResultType</span><span class=\"special\">&amp;</span> <span class=\"identifier\">add</span><span class=\"special\">(</span><span class=\"identifier\">ResultType</span><span class=\"special\">&amp;</span> <span class=\"identifier\">result</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Source1</span><span class=\"special\">&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Source2</span><span class=\"special\">&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">);</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">ResultType</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Source1</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Source2</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">ResultType</span><span class=\"special\">&amp;</span> <span class=\"identifier\">subtract</span><span class=\"special\">(</span><span class=\"identifier\">ResultType</span><span class=\"special\">&amp;</span> <span class=\"identifier\">result</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Source1</span><span class=\"special\">&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Source2</span><span class=\"special\">&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">);</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">ResultType</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Source1</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Source2</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">ResultType</span><span class=\"special\">&amp;</span> <span class=\"identifier\">multiply</span><span class=\"special\">(</span><span class=\"identifier\">ResultType</span><span class=\"special\">&amp;</span> <span class=\"identifier\">result</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Source1</span><span class=\"special\">&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Source2</span><span class=\"special\">&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">);</span>\n\n<span class=\"comment\">// min and max overloads:</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">min</span>    <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">max</span>    <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n\n<span class=\"comment\">// C99 Non-member function standard library support:</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">abs</span>        <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">acos</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">acosh</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">asin</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">asinh</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">atan</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">atan2</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">atanh</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">cbrt</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">ceil</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">copysign</span>   <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">cos</span>        <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">cosh</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">erf</span>        <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">erfc</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">exp</span>        <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">exp2</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">expm1</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">fabs</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">fdim</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">floor</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">fma</span>        <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">fmin</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">fmax</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">fmod</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">frexp</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"emphasis\"><em>integer-type</em></span><span class=\"special\">*);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">hypot</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>integer-type</em></span>                              <span class=\"identifier\">ilogb</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">ldexp</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"emphasis\"><em>integer-type</em></span><span class=\"special\">);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">lgamma</span>     <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">long</span> <span class=\"keyword\">long</span>                                 <span class=\"identifier\">llrint</span>     <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">long</span> <span class=\"keyword\">long</span>                                 <span class=\"identifier\">llround</span>    <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">log</span>        <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">log2</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">log10</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">log1p</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">logb</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">long</span>                                      <span class=\"identifier\">lrint</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">long</span>                                      <span class=\"identifier\">lround</span>     <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">modf</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">nearbyint</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">nextafter</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">nexttoward</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">pow</span>        <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">remainder</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">remquo</span>     <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">int</span><span class=\"special\">*);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">rint</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">round</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">scalbn</span>     <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"emphasis\"><em>integer-type</em></span><span class=\"special\">);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">scalbln</span>    <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"emphasis\"><em>integer-type</em></span><span class=\"special\">);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">sin</span>        <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">sinh</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">sqrt</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">tan</span>        <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">tanh</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">tgamma</span>     <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">trunc</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n\n<span class=\"keyword\">int</span>                                       <span class=\"identifier\">fpclassify</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">isfinite</span>   <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">isinf</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">isnan</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">isnormal</span>   <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">signbit</span>    <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">isgreater</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">isgreaterequal</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">isless</span>     <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">islessequal</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-typearea</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">islessgreater</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">isunordered</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"comment\">// Complex number functions:</span>\n<span class=\"emphasis\"><em>number&lt;...&gt;::value_type</em></span>                   <span class=\"identifier\">real</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number&lt;...&gt;::value_type</em></span>                   <span class=\"identifier\">imag</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number&lt;...&gt;::value_type</em></span>                   <span class=\"identifier\">abs</span>   <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number&lt;...&gt;::value_type</em></span>                   <span class=\"identifier\">arg</span>   <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number&lt;...&gt;::value_type</em></span>                   <span class=\"identifier\">norm</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">conj</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">proj</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">polar</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"comment\">// Misc other common C library functions:</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">itrunc</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">ltrunc</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">lltrunc</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">iround</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">changesign</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">copysign</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n\n<span class=\"comment\">// Traits support:</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">struct</span> <span class=\"identifier\">component_type</span><span class=\"special\">;</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">struct</span> <span class=\"identifier\">number_category</span><span class=\"special\">;</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">struct</span> <span class=\"identifier\">is_number</span><span class=\"special\">;</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">struct</span> <span class=\"identifier\">is_number_expression</span><span class=\"special\">;</span>\n\n<span class=\"comment\">// Integer specific functions:</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">gcd</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">lcm</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">pow</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">unsigned</span><span class=\"special\">);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">powm</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">p</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">m</span><span class=\"special\">);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">sqrt</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">EXpressionTemplates</span><span class=\"special\">&gt;</span>      <span class=\"identifier\">sqrt</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">EXpressionTemplates</span><span class=\"special\">&gt;&amp;);</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">void</span> <span class=\"identifier\">divide_qr</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">x</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">y</span><span class=\"special\">,</span>\n               <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">q</span><span class=\"special\">,</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">r</span><span class=\"special\">);</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Integer</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">Integer</span> <span class=\"identifier\">integer_modulus</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">x</span><span class=\"special\">,</span> <span class=\"identifier\">Integer</span> <span class=\"identifier\">val</span><span class=\"special\">);</span>\n<span class=\"keyword\">unsigned</span> <span class=\"identifier\">lsb</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">x</span><span class=\"special\">);</span>\n<span class=\"keyword\">unsigned</span> <span class=\"identifier\">msb</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">x</span><span class=\"special\">);</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">bit_test</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">index</span><span class=\"special\">);</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">bit_set</span><span class=\"special\">(</span><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">index</span><span class=\"special\">);</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">bit_unset</span><span class=\"special\">(</span><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">index</span><span class=\"special\">);</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">bit_flip</span><span class=\"special\">(</span><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">index</span><span class=\"special\">);</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Engine</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">miller_rabin_test</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">n</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">trials</span><span class=\"special\">,</span> <span class=\"identifier\">Engine</span><span class=\"special\">&amp;</span> <span class=\"identifier\">gen</span><span class=\"special\">);</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">miller_rabin_test</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">n</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">trials</span><span class=\"special\">);</span>\n\n<span class=\"comment\">// Rational number support:</span>\n<span class=\"keyword\">typename</span> <span class=\"identifier\">component_type</span><span class=\"special\">&lt;</span><span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&gt;::</span><span class=\"identifier\">type</span> <span class=\"identifier\">numerator</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">typename</span> <span class=\"identifier\">component_type</span><span class=\"special\">&lt;</span><span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&gt;::</span><span class=\"identifier\">type</span> <span class=\"identifier\">denominator</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n\n<span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">math</span><span class=\"special\">{</span>\n\n<span class=\"comment\">// Boost.Math interoperability functions:</span>\n<span class=\"keyword\">int</span>                                              <span class=\"identifier\">fpclassify</span>     <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">int</span><span class=\"special\">);</span>\n<span class=\"keyword\">bool</span>                                             <span class=\"identifier\">isfinite</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">int</span><span class=\"special\">);</span>\n<span class=\"keyword\">bool</span>                                             <span class=\"identifier\">isnan</span>          <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">int</span><span class=\"special\">);</span>\n<span class=\"keyword\">bool</span>                                             <span class=\"identifier\">isinf</span>          <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">int</span><span class=\"special\">);</span>\n<span class=\"keyword\">bool</span>                                             <span class=\"identifier\">isnormal</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">int</span><span class=\"special\">);</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n\n<span class=\"comment\">// numeric_limits support:</span>\n<span class=\"keyword\">namespace</span> <span class=\"identifier\">std</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">struct</span> <span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>\n<span class=\"special\">{</span>\n   <span class=\"comment\">/* Usual members here */</span>\n<span class=\"special\">};</span>\n\n<span class=\"special\">}</span>\n</pre>\n<h5>\n<a name=\"boost_multiprecision.ref.number.h1\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.ref.number.description\"></a></span><a class=\"link\" href=\"number.html#boost_multiprecision.ref.number.description\">Description</a>\n      </h5>\n<pre class=\"programlisting\"><span class=\"keyword\">enum</span> <span class=\"identifier\">expression_template_option</span> <span class=\"special\">{</span> <span class=\"identifier\">et_on</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">,</span> <span class=\"identifier\">et_off</span> <span class=\"special\">=</span> <span class=\"number\">0</span> <span class=\"special\">};</span>\n</pre>\n<p>\n        This enumerated type is used to specify whether expression templates are\n        turned on (et_on) or turned off (et_off).\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">&gt;</span> <span class=\"keyword\">struct</span> <span class=\"identifier\">expression_template_default</span>\n<span class=\"special\">{</span> <span class=\"keyword\">static</span> <span class=\"keyword\">const</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">value</span> <span class=\"special\">=</span> <span class=\"identifier\">et_on</span><span class=\"special\">;</span> <span class=\"special\">};</span>\n</pre>\n<p>\n        This traits class specifies the default expression template option to be\n        used with a particular Backend type. It defaults to <code class=\"computeroutput\"><span class=\"identifier\">et_on</span></code>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span> <span class=\"special\">=</span> <span class=\"identifier\">expression_template_default</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">&gt;::</span><span class=\"identifier\">value</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">number</span><span class=\"special\">;</span>\n</pre>\n<p>\n        Class <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> has two template\n        arguments:\n      </p>\n<div class=\"variablelist\">\n<p class=\"title\"><b></b></p>\n<dl class=\"variablelist\">\n<dt><span class=\"term\">Backend</span></dt>\n<dd><p>\n              The actual arithmetic back-end that does all the work.\n            </p></dd>\n<dt><span class=\"term\">ExpressionTemplates</span></dt>\n<dd><p>\n              A Boolean value: when <code class=\"computeroutput\"><span class=\"identifier\">et_on</span></code>,\n              then expression templates are enabled, otherwise when set to <code class=\"computeroutput\"><span class=\"identifier\">et_off</span></code> they are disabled. The default\n              for this parameter is computed via the traits class <code class=\"computeroutput\"><span class=\"identifier\">expression_template_default</span></code>\n              whose member <code class=\"computeroutput\"><span class=\"identifier\">value</span></code>\n              defaults to <code class=\"computeroutput\"><span class=\"identifier\">et_on</span></code> unless\n              the traits class is specialized for a particular backend.\n            </p></dd>\n</dl>\n</div>\n<pre class=\"programlisting\"><span class=\"identifier\">number</span><span class=\"special\">();</span>\n<span class=\"identifier\">number</span><span class=\"special\">(</span><span class=\"identifier\">see</span><span class=\"special\">-</span><span class=\"identifier\">below</span><span class=\"special\">);</span>\n<span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">=(</span><span class=\"identifier\">see</span><span class=\"special\">-</span><span class=\"identifier\">below</span><span class=\"special\">);</span>\n<span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"identifier\">assign</span><span class=\"special\">(</span><span class=\"identifier\">see</span><span class=\"special\">-</span><span class=\"identifier\">below</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Type <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> is default constructible,\n        and both copy constructible and assignable from:\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Itself.\n          </li>\n<li class=\"listitem\">\n            An expression template which is the result of one of the arithmetic operators.\n          </li>\n<li class=\"listitem\">\n            Any <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n            (built-in)</a> arithmetic type, as long as the result would not be\n            lossy (for example float to integer conversion).\n          </li>\n<li class=\"listitem\">\n            Any type that the Backend is implicitly constructible or assignable from.\n          </li>\n<li class=\"listitem\">\n            An rvalue reference to another <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>.\n            Move-semantics are used for construction if the backend also supports\n            rvalue reference construction. In the case of assignment, move semantics\n            are always supported when the argument is an rvalue reference irrespective\n            of the backend.\n          </li>\n<li class=\"listitem\">\n            Any type in the same family, as long as no loss of precision is involved.\n            For example from <code class=\"computeroutput\"><span class=\"identifier\">int128_t</span></code>\n            to <code class=\"computeroutput\"><span class=\"identifier\">int256_t</span></code>, or <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float_50</span></code> to <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float_100</span></code>.\n          </li>\n</ul></div>\n<p>\n        Type <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> is explicitly\n        constructible from:\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Any type mentioned above.\n          </li>\n<li class=\"listitem\">\n            A <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">string</span></code> or any type which is convertible\n            to <code class=\"computeroutput\"><span class=\"keyword\">const</span> <span class=\"keyword\">char</span><span class=\"special\">*</span></code>.\n          </li>\n<li class=\"listitem\">\n            Any arithmetic type (including those that would result in lossy conversions).\n          </li>\n<li class=\"listitem\">\n            Any type in the same family, including those that result in loss of precision.\n          </li>\n<li class=\"listitem\">\n            Any type that the Backend is explicitly constructible from.\n          </li>\n<li class=\"listitem\">\n            Any pair of types for which a generic interconversion exists: that is\n            from integer to integer, integer to rational, integer to float, rational\n            to rational, rational to float, or float to float.\n          </li>\n</ul></div>\n<p>\n        The assign member function is available for any type for which an explicit\n        converting constructor exists. It is intended to be used where a temporary\n        generated from an explicit assignment would be expensive, for example:\n      </p>\n<pre class=\"programlisting\"><span class=\"identifier\">mpfr_float_50</span>    <span class=\"identifier\">f50</span><span class=\"special\">;</span>\n<span class=\"identifier\">mpfr_float_100</span>   <span class=\"identifier\">f100</span><span class=\"special\">;</span>\n\n<span class=\"identifier\">f50</span> <span class=\"special\">=</span> <span class=\"keyword\">static_cast</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_50</span><span class=\"special\">&gt;(</span><span class=\"identifier\">f100</span><span class=\"special\">);</span>  <span class=\"comment\">// explicit cast create a temporary</span>\n<span class=\"identifier\">f50</span><span class=\"special\">.</span><span class=\"identifier\">assign</span><span class=\"special\">(</span><span class=\"identifier\">f100</span><span class=\"special\">);</span>                        <span class=\"comment\">// explicit call to assign create no temporary</span>\n</pre>\n<p>\n        In addition, if the type has multiple components (for example rational or\n        complex number types), then there is a two argument constructor:\n      </p>\n<pre class=\"programlisting\"><span class=\"identifier\">number</span><span class=\"special\">(</span><span class=\"identifier\">arg1</span><span class=\"special\">,</span> <span class=\"identifier\">arg2</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Where the two args must either be arithmetic types, or types that are convertible\n        to the two components of <code class=\"computeroutput\"><span class=\"keyword\">this</span></code>.\n        Rvalue forwarding overloads are provided so either one or both arguments\n        may be rvalue-references which will be moved into the result, if the backend\n        is able to make use of them.\n      </p>\n<p>\n        Finally, when the type has a variable precision, then there are constructors:\n      </p>\n<pre class=\"programlisting\"><span class=\"identifier\">number</span><span class=\"special\">(</span><span class=\"identifier\">arg1</span><span class=\"special\">,</span> <span class=\"identifier\">precision</span><span class=\"special\">);</span>\n<span class=\"identifier\">number</span><span class=\"special\">(</span><span class=\"identifier\">arg1</span><span class=\"special\">,</span> <span class=\"identifier\">arg2</span><span class=\"special\">,</span> <span class=\"identifier\">precision</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Where <code class=\"computeroutput\"><span class=\"identifier\">precision</span></code> is an unsigned\n        value, the 2 arg version is active for scalar types and/or copy-construction\n        with specific precision, and the 3-arg version for complex types.\n      </p>\n<p>\n        Likewise <code class=\"computeroutput\"><span class=\"identifier\">assign</span></code> has a 2-arg\n        overloaded, with the second argument being the precision.\n      </p>\n<pre class=\"programlisting\"><span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">+=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">-=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">*=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">/=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">++();</span>\n<span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">--();</span>\n<span class=\"identifier\">number</span>  <span class=\"keyword\">operator</span><span class=\"special\">++(</span><span class=\"keyword\">int</span><span class=\"special\">);</span>\n<span class=\"identifier\">number</span>  <span class=\"keyword\">operator</span><span class=\"special\">--(</span><span class=\"keyword\">int</span><span class=\"special\">);</span>\n<span class=\"comment\">// Integer only operations:</span>\n<span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">%=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">&amp;=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">|=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">^=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">&lt;&lt;=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>integer-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">&gt;&gt;=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>integer-type</em></span><span class=\"special\">&amp;);</span>\n</pre>\n<p>\n        These operators all take their usual arithmetic meanings.\n      </p>\n<p>\n        The arguments to these operators is either:\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Another <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span>\n            <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span></code>.\n          </li>\n<li class=\"listitem\">\n            An expression template derived from <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">&gt;</span></code>.\n          </li>\n<li class=\"listitem\">\n            Any type implicitly convertible to <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span></code>, including some other instance of\n            class <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>.\n          </li>\n</ul></div>\n<p>\n        For the left and right shift operations, the argument must be a <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n        (built-in)</a> integer type with a positive value (negative values result\n        in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code> being thrown).\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">operator</span> <span class=\"emphasis\"><em>convertible-to-bool-type</em></span><span class=\"special\">()</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n</pre>\n<p>\n        Returns an <span class=\"emphasis\"><em>unmentionable-type</em></span> that is usable in Boolean\n        contexts (this allows <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n        to be used in any Boolean context - if statements, conditional statements,\n        or as an argument to a logical operator - without type <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n        being convertible to type <code class=\"computeroutput\"><span class=\"keyword\">bool</span></code>.\n      </p>\n<p>\n        This operator also enables the use of <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n        with any of the following operators: <code class=\"computeroutput\"><span class=\"special\">!</span></code>,\n        <code class=\"computeroutput\"><span class=\"special\">||</span></code>, <code class=\"computeroutput\"><span class=\"special\">&amp;&amp;</span></code>\n        and <code class=\"computeroutput\"><span class=\"special\">?:</span></code>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">void</span> <span class=\"identifier\">swap</span><span class=\"special\">(</span><span class=\"identifier\">number</span><span class=\"special\">&amp;</span> <span class=\"identifier\">other</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Swaps <code class=\"computeroutput\"><span class=\"special\">*</span><span class=\"keyword\">this</span></code>\n        with <code class=\"computeroutput\"><span class=\"identifier\">other</span></code>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">bool</span> <span class=\"identifier\">is_zero</span><span class=\"special\">()</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n</pre>\n<p>\n        Returns <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> is <code class=\"computeroutput\"><span class=\"special\">*</span><span class=\"keyword\">this</span></code> is zero,\n        otherwise <code class=\"computeroutput\"><span class=\"keyword\">false</span></code>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">int</span> <span class=\"identifier\">sign</span><span class=\"special\">()</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n</pre>\n<p>\n        Returns a value less than zero if <code class=\"computeroutput\"><span class=\"special\">*</span><span class=\"keyword\">this</span></code> is negative, a value greater than zero\n        if <code class=\"computeroutput\"><span class=\"special\">*</span><span class=\"keyword\">this</span></code>\n        is positive, and zero if <code class=\"computeroutput\"><span class=\"special\">*</span><span class=\"keyword\">this</span></code>\n        is zero.\n      </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">string</span> <span class=\"identifier\">str</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">precision</span><span class=\"special\">,</span> <span class=\"keyword\">bool</span> <span class=\"identifier\">scientific</span> <span class=\"special\">=</span> <span class=\"keyword\">true</span><span class=\"special\">)</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n</pre>\n<p>\n        Returns the number formatted as a string, with at least <span class=\"emphasis\"><em>precision</em></span>\n        digits, and in scientific format if <span class=\"emphasis\"><em>scientific</em></span> is true.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">T</span> <span class=\"identifier\">convert_to</span><span class=\"special\">()</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">explicit</span> <span class=\"keyword\">operator</span> <span class=\"identifier\">T</span> <span class=\"special\">()</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n</pre>\n<p>\n        Provides a generic conversion mechanism to convert <code class=\"computeroutput\"><span class=\"special\">*</span><span class=\"keyword\">this</span></code> to type <code class=\"computeroutput\"><span class=\"identifier\">T</span></code>.\n        Type <code class=\"computeroutput\"><span class=\"identifier\">T</span></code> may be any arithmetic\n        type. Optionally other types may also be supported by specific <code class=\"computeroutput\"><span class=\"identifier\">Backend</span></code> types.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">static</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">default_precision</span><span class=\"special\">();</span>\n<span class=\"keyword\">static</span> <span class=\"keyword\">void</span> <span class=\"identifier\">default_precision</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n<span class=\"keyword\">unsigned</span> <span class=\"identifier\">precision</span><span class=\"special\">()</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n<span class=\"keyword\">void</span> <span class=\"identifier\">precision</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n</pre>\n<p>\n        These functions are only available if the Backend template parameter supports\n        runtime changes to precision. They get and set the default precision and\n        the precision of <code class=\"computeroutput\"><span class=\"special\">*</span><span class=\"keyword\">this</span></code>\n        respectively.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">int</span> <span class=\"identifier\">compare</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">o</span><span class=\"special\">)</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">V</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">typename</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">enable_if</span><span class=\"special\">&lt;</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">is_convertible</span><span class=\"special\">&lt;</span><span class=\"identifier\">V</span><span class=\"special\">,</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;::</span><span class=\"identifier\">value</span> <span class=\"special\">&gt;,</span> <span class=\"keyword\">int</span><span class=\"special\">&gt;::</span><span class=\"identifier\">type</span>\n   <span class=\"identifier\">compare</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">V</span><span class=\"special\">&amp;</span> <span class=\"identifier\">other</span><span class=\"special\">)</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n</pre>\n<p>\n        Returns:\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            A value less that 0 for <code class=\"computeroutput\"><span class=\"special\">*</span><span class=\"keyword\">this</span> <span class=\"special\">&lt;</span> <span class=\"identifier\">other</span></code>\n          </li>\n<li class=\"listitem\">\n            A value greater that 0 for <code class=\"computeroutput\"><span class=\"special\">*</span><span class=\"keyword\">this</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">other</span></code>\n          </li>\n<li class=\"listitem\">\n<p class=\"simpara\">\n            Zero for <code class=\"computeroutput\"><span class=\"special\">*</span><span class=\"keyword\">this</span>\n            <span class=\"special\">==</span> <span class=\"identifier\">other</span></code>\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">value_type</span> <span class=\"identifier\">real</span><span class=\"special\">()</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n<span class=\"identifier\">value_type</span> <span class=\"identifier\">imag</span><span class=\"special\">()</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n</pre>\n</li>\n</ul></div>\n<p>\n        These return the real and imaginary parts respectively. If the number is\n        not a complex type, then the imaginary part is always zero.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">void</span> <span class=\"identifier\">real</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">T</span><span class=\"special\">&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">);</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">void</span> <span class=\"identifier\">imag</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">T</span><span class=\"special\">&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">);</span>\n</pre>\n<p>\n        These set the real and imaginary parts respectively of the number. If the\n        number is not a complex type, then setting the real part is equivalent to\n        assignment, and attempting to set the imaginary part will result in a compile\n        time error.\n      </p>\n<pre class=\"programlisting\"><span class=\"identifier\">Backend</span><span class=\"special\">&amp;</span> <span class=\"identifier\">backend</span><span class=\"special\">();</span>\n<span class=\"keyword\">const</span> <span class=\"identifier\">Backend</span><span class=\"special\">&amp;</span> <span class=\"identifier\">backend</span><span class=\"special\">()</span><span class=\"keyword\">const</span><span class=\"special\">;</span>\n</pre>\n<p>\n        Returns the underlying back-end instance used by <code class=\"computeroutput\"><span class=\"special\">*</span><span class=\"keyword\">this</span></code>.\n      </p>\n<h5>\n<a name=\"boost_multiprecision.ref.number.h2\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.ref.number.non_member_operators\"></a></span><a class=\"link\" href=\"number.html#boost_multiprecision.ref.number.non_member_operators\">Non-member\n        operators</a>\n      </h5>\n<pre class=\"programlisting\"><span class=\"comment\">// Non member operators:</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">+(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">-(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">+(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">-(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">*(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">/(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"comment\">// Integer only operations:</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">%(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">&amp;(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">|(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">^(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">&lt;&lt;(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>integer-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span> <span class=\"keyword\">operator</span><span class=\"special\">&gt;&gt;(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>integer-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"comment\">// Comparison operators:</span>\n<span class=\"keyword\">bool</span> <span class=\"keyword\">operator</span><span class=\"special\">==(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span> <span class=\"keyword\">operator</span><span class=\"special\">!=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span> <span class=\"keyword\">operator</span><span class=\"special\">&lt;</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span> <span class=\"keyword\">operator</span><span class=\"special\">&gt;</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span> <span class=\"keyword\">operator</span><span class=\"special\">&lt;=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span> <span class=\"keyword\">operator</span><span class=\"special\">&gt;=(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>see-below</em></span><span class=\"special\">&amp;);</span>\n</pre>\n<p>\n        These operators all take their usual arithmetic meanings.\n      </p>\n<p>\n        The arguments to these functions must contain at least one of the following:\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            A <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>.\n          </li>\n<li class=\"listitem\">\n            An expression template type derived from <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>.\n          </li>\n<li class=\"listitem\">\n            Any type for which <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n            has an implicit constructor - for example a <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n            (built-in)</a> arithmetic type.\n          </li>\n</ul></div>\n<p>\n        The return type of these operators is either:\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            An <span class=\"emphasis\"><em>unmentionable-type</em></span> expression template type when\n            <code class=\"computeroutput\"><span class=\"identifier\">ExpressionTemplates</span></code> is\n            <code class=\"computeroutput\"><span class=\"keyword\">true</span></code>.\n          </li>\n<li class=\"listitem\">\n            Type <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span>\n            <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span></code>\n            when <code class=\"computeroutput\"><span class=\"identifier\">ExpressionTemplates</span></code>\n            is <code class=\"computeroutput\"><span class=\"keyword\">false</span></code>.\n          </li>\n<li class=\"listitem\">\n            Type <code class=\"computeroutput\"><span class=\"keyword\">bool</span></code> if the operator\n            is a comparison operator.\n          </li>\n</ul></div>\n<p>\n        Finally note that the second argument to the left and right shift operations\n        must be a <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n        (built-in)</a> integer type, and that the argument must be positive (negative\n        arguments result in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code>\n        being thrown).\n      </p>\n<h5>\n<a name=\"boost_multiprecision.ref.number.h3\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.ref.number.swap\"></a></span><a class=\"link\" href=\"number.html#boost_multiprecision.ref.number.swap\">swap</a>\n      </h5>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">void</span> <span class=\"identifier\">swap</span><span class=\"special\">(</span><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Swaps <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n      </p>\n<h5>\n<a name=\"boost_multiprecision.ref.number.h4\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.ref.number.iostream_support\"></a></span><a class=\"link\" href=\"number.html#boost_multiprecision.ref.number.iostream_support\">Iostream\n        Support</a>\n      </h5>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">ostream</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span> <span class=\"special\">&lt;&lt;</span> <span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">ostream</span><span class=\"special\">&amp;</span> <span class=\"identifier\">os</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">r</span><span class=\"special\">);</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Unspecified</span><span class=\"special\">...&gt;</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">ostream</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span> <span class=\"special\">&lt;&lt;</span> <span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">ostream</span><span class=\"special\">&amp;</span> <span class=\"identifier\">os</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">unmentionable</span><span class=\"special\">-</span><span class=\"identifier\">expression</span><span class=\"special\">-</span><span class=\"keyword\">template</span><span class=\"special\">&amp;</span> <span class=\"identifier\">r</span><span class=\"special\">);</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">inline</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">istream</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span> <span class=\"special\">&gt;&gt;</span> <span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">istream</span><span class=\"special\">&amp;</span> <span class=\"identifier\">is</span><span class=\"special\">,</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">r</span><span class=\"special\">)</span>\n</pre>\n<p>\n        These operators provided formatted input-output operations on <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> types, and expression templates\n        derived from them.\n      </p>\n<p>\n        It's down to the back-end type to actually implement string conversion. However,\n        the back-ends provided with this library support all of the iostream formatting\n        flags, field width and precision settings.\n      </p>\n<p>\n        In addition, the C++11 <code class=\"computeroutput\"><span class=\"identifier\">to_string</span></code>\n        function is provided for use in generic code:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">string</span> <span class=\"identifier\">to_string</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">);</span>\n</pre>\n<p>\n        This a string with 6 digits of accuracy past the decimal point, matching\n        the behavior of <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">to_string</span></code>. Note that this is a <span class=\"emphasis\"><em>fixed\n        precision</em></span> representation, and hence monstrous strings can be returned.\n      </p>\n<h5>\n<a name=\"boost_multiprecision.ref.number.h5\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.ref.number.arithmetic_with_a_higher_precisi\"></a></span><a class=\"link\" href=\"number.html#boost_multiprecision.ref.number.arithmetic_with_a_higher_precisi\">Arithmetic\n        with a higher precision result</a>\n      </h5>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">ResultType</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Source1</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Source2</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">ResultType</span><span class=\"special\">&amp;</span> <span class=\"identifier\">add</span><span class=\"special\">(</span><span class=\"identifier\">ResultType</span><span class=\"special\">&amp;</span> <span class=\"identifier\">result</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Source1</span><span class=\"special\">&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Source2</span><span class=\"special\">&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">);</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">ResultType</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Source1</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Source2</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">ResultType</span><span class=\"special\">&amp;</span> <span class=\"identifier\">subtract</span><span class=\"special\">(</span><span class=\"identifier\">ResultType</span><span class=\"special\">&amp;</span> <span class=\"identifier\">result</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Source1</span><span class=\"special\">&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Source2</span><span class=\"special\">&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">);</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">ResultType</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Source1</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Source2</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">ResultType</span><span class=\"special\">&amp;</span> <span class=\"identifier\">multiply</span><span class=\"special\">(</span><span class=\"identifier\">ResultType</span><span class=\"special\">&amp;</span> <span class=\"identifier\">result</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Source1</span><span class=\"special\">&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Source2</span><span class=\"special\">&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">);</span>\n</pre>\n<p>\n        These functions apply the named operator to the arguments <span class=\"emphasis\"><em>a</em></span>\n        and <span class=\"emphasis\"><em>b</em></span> and store the result in <span class=\"emphasis\"><em>result</em></span>,\n        returning <span class=\"emphasis\"><em>result</em></span>. In all cases they behave \"as\n        if\" arguments <span class=\"emphasis\"><em>a</em></span> and <span class=\"emphasis\"><em>b</em></span> were\n        first promoted to type <code class=\"computeroutput\"><span class=\"identifier\">ResultType</span></code>\n        before applying the operator, though particular backends may well avoid that\n        step by way of an optimization.\n      </p>\n<p>\n        The type <code class=\"computeroutput\"><span class=\"identifier\">ResultType</span></code> must\n        be an instance of class <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>,\n        and the types <code class=\"computeroutput\"><span class=\"identifier\">Source1</span></code> and\n        <code class=\"computeroutput\"><span class=\"identifier\">Source2</span></code> may be either instances\n        of class <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> or native\n        integer types. The latter is an optimization that allows arithmetic to be\n        performed on native integer types producing an extended precision result.\n      </p>\n<h5>\n<a name=\"boost_multiprecision.ref.number.h6\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.ref.number.non_member_standard_library_func\"></a></span><a class=\"link\" href=\"number.html#boost_multiprecision.ref.number.non_member_standard_library_func\">Non-member\n        standard library function support</a>\n      </h5>\n<pre class=\"programlisting\"><span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">abs</span>        <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">acos</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">acosh</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">asin</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">asinh</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">atan</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">atan2</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">atanh</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">cbrt</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">ceil</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">copysign</span>   <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">cos</span>        <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">cosh</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">erf</span>        <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">erfc</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">exp</span>        <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">exp2</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">expm1</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">fabs</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">fdim</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">floor</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">fma</span>        <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">fmin</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">fmax</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">fmod</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">frexp</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"emphasis\"><em>integer-type</em></span><span class=\"special\">*);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">hypot</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>integer-type</em></span>                              <span class=\"identifier\">ilogb</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">ldexp</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"emphasis\"><em>integer-type</em></span><span class=\"special\">);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">lgamma</span>     <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">long</span> <span class=\"keyword\">long</span>                                 <span class=\"identifier\">llrint</span>     <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">long</span> <span class=\"keyword\">long</span>                                 <span class=\"identifier\">llround</span>    <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">log</span>        <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">log2</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">log10</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">log1p</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">logb</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">long</span>                                      <span class=\"identifier\">lrint</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">long</span>                                      <span class=\"identifier\">lround</span>     <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">modf</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">nearbyint</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">nextafter</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">nexttoward</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">pow</span>        <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">remainder</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">remquo</span>     <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">int</span><span class=\"special\">*);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">rint</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">round</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">scalbn</span>     <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"emphasis\"><em>integer-type</em></span><span class=\"special\">);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">scalbln</span>    <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"emphasis\"><em>integer-type</em></span><span class=\"special\">);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">sin</span>        <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">sinh</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">sqrt</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">tan</span>        <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">tanh</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">tgamma</span>     <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">trunc</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n\n<span class=\"keyword\">int</span>                                       <span class=\"identifier\">fpclassify</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">isfinite</span>   <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">isinf</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">isnan</span>      <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">isnormal</span>   <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">signbit</span>    <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">isgreater</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">isgreaterequal</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">isless</span>     <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">islessequal</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">islessgreater</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">bool</span>                                      <span class=\"identifier\">isunordered</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n</pre>\n<p>\n        These functions all behave exactly as their standard library C++11 counterparts\n        do: their argument is either an instance of <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n        or an expression template derived from it; If the argument is of type <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span></code>\n        then that is also the return type, otherwise the return type is an expression\n        template unless otherwise stated.\n      </p>\n<p>\n        The integer type arguments to <code class=\"computeroutput\"><span class=\"identifier\">ldexp</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">frexp</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">scalbn</span></code>\n        and <code class=\"computeroutput\"><span class=\"identifier\">ilogb</span></code> may be either type\n        <code class=\"computeroutput\"><span class=\"keyword\">int</span></code>, or the actual type of the\n        exponent of the number type.\n      </p>\n<p>\n        Complex number types support the following functions:\n      </p>\n<pre class=\"programlisting\"><span class=\"comment\">// Complex number functions:</span>\n<span class=\"emphasis\"><em>number&lt;...&gt;::value_type</em></span>                   <span class=\"identifier\">real</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number&lt;...&gt;::value_type</em></span>                   <span class=\"identifier\">imag</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number&lt;...&gt;::value_type</em></span>                   <span class=\"identifier\">abs</span>   <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number&lt;...&gt;::value_type</em></span>                   <span class=\"identifier\">arg</span>   <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number&lt;...&gt;::value_type</em></span>                   <span class=\"identifier\">norm</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">conj</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">proj</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">polar</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n</pre>\n<p>\n        In addition the functions <code class=\"computeroutput\"><span class=\"identifier\">real</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">imag</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">arg</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">norm</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">conj</span></code>\n        and <code class=\"computeroutput\"><span class=\"identifier\">proj</span></code> are overloaded for\n        scalar (ie non-complex) types in the same manner as <code class=\"computeroutput\"><span class=\"special\">&lt;</span><span class=\"identifier\">complex</span><span class=\"special\">&gt;</span></code>\n        and treat the argument as a value whose imaginary part is zero.\n      </p>\n<p>\n        There are also some functions implemented for compatibility with the Boost.Math\n        functions of the same name:\n      </p>\n<pre class=\"programlisting\"><span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">itrunc</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">ltrunc</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">lltrunc</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">iround</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">changesign</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"emphasis\"><em>number</em></span>                                    <span class=\"identifier\">copysign</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n</pre>\n<p>\n        All these functions are normally implemented by the Backend type. However,\n        default versions are provided for Backend types that don't have native support\n        for these functions. Please note however, that this default support requires\n        the precision of the type to be a compile time constant - this means for\n        example that the <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> MPF Backend will\n        not work with these functions when that type is used at variable precision.\n      </p>\n<p>\n        Also note that with the exception of <code class=\"computeroutput\"><span class=\"identifier\">abs</span></code>\n        that these functions can only be used with floating-point Backend types (if\n        any other types such as fixed precision or complex types are added to the\n        library later, then these functions may be extended to support those number\n        types).\n      </p>\n<p>\n        The precision of these functions is generally determined by the backend implementation.\n        For example the precision of these functions when used with <a class=\"link\" href=\"../tut/floats/mpfr_float.html\" title=\"mpfr_float\">mpfr_float</a>\n        is determined entirely by <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a>.\n        When these functions use our own implementations, the accuracy of the transcendental\n        functions is generally a few epsilon. Note however, that the trigonometrical\n        functions incur the usual accuracy loss when reducing arguments by large\n        multiples of π. Also note that both <a class=\"link\" href=\"../tut/floats/gmp_float.html\" title=\"gmp_float\">gmp_float</a>\n        and <a class=\"link\" href=\"../tut/floats/cpp_dec_float.html\" title=\"cpp_dec_float\">cpp_dec_float</a>\n        have a number of guard digits beyond their stated precision, so the error\n        rates listed for these are in some sense artificially low.\n      </p>\n<p>\n        The following table shows the error rates we observe for these functions\n        with various backend types, functions not listed here are exact (tested on\n        Win32 with VC++10, MPFR-3.0.0, MPIR-2.1.1):\n      </p>\n<div class=\"informaltable\"><table class=\"table\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Function\n                </p>\n              </th>\n<th>\n                <p>\n                  mpfr_float_50\n                </p>\n              </th>\n<th>\n                <p>\n                  mpf_float_50\n                </p>\n              </th>\n<th>\n                <p>\n                  cpp_dec_float_50\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  sqrt\n                </p>\n              </td>\n<td>\n                <p>\n                  1eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  exp\n                </p>\n              </td>\n<td>\n                <p>\n                  1eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  log\n                </p>\n              </td>\n<td>\n                <p>\n                  1eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  log10\n                </p>\n              </td>\n<td>\n                <p>\n                  1eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cos\n                </p>\n              </td>\n<td>\n                <p>\n                  700eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  sin\n                </p>\n              </td>\n<td>\n                <p>\n                  1eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tan\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  acos\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  asin\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  atan\n                </p>\n              </td>\n<td>\n                <p>\n                  1eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  cosh\n                </p>\n              </td>\n<td>\n                <p>\n                  1045eps<a href=\"#ftn.boost_multiprecision.ref.number.f0\" class=\"footnote\" name=\"boost_multiprecision.ref.number.f0\"><sup class=\"footnote\">[1]</sup></a>\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  sinh\n                </p>\n              </td>\n<td>\n                <p>\n                  2eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  tanh\n                </p>\n              </td>\n<td>\n                <p>\n                  1eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  pow\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n<td>\n                <p>\n                  4eps\n                </p>\n              </td>\n<td>\n                <p>\n                  3eps\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  atan2\n                </p>\n              </td>\n<td>\n                <p>\n                  1eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n<td>\n                <p>\n                  0eps\n                </p>\n              </td>\n</tr>\n</tbody>\n<tbody class=\"footnotes\"><tr><td colspan=\"4\"><div id=\"ftn.boost_multiprecision.ref.number.f0\" class=\"footnote\"><p><a href=\"#boost_multiprecision.ref.number.f0\" class=\"para\"><sup class=\"para\">[1] </sup></a>\n                    It's likely that the inherent error in the input values to our\n                    test cases are to blame here.\n                  </p></div></td></tr></tbody>\n</table></div>\n<h5>\n<a name=\"boost_multiprecision.ref.number.h7\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.ref.number.traits_class_support\"></a></span><a class=\"link\" href=\"number.html#boost_multiprecision.ref.number.traits_class_support\">Traits Class\n        Support</a>\n      </h5>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">struct</span> <span class=\"identifier\">component_type</span><span class=\"special\">;</span>\n</pre>\n<p>\n        If this is a type with multiple components (for example rational or complex\n        types), then this trait has a single member <code class=\"computeroutput\"><span class=\"identifier\">type</span></code>\n        that is the type of those components.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">struct</span> <span class=\"identifier\">number_category</span><span class=\"special\">;</span>\n</pre>\n<p>\n        A traits class that inherits from <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">integral_constant</span><span class=\"special\">&lt;</span><span class=\"keyword\">int</span><span class=\"special\">,</span>\n        <span class=\"identifier\">N</span><span class=\"special\">&gt;</span></code>\n        where <code class=\"computeroutput\"><span class=\"identifier\">N</span></code> is one of the enumerated\n        values <code class=\"computeroutput\"><span class=\"identifier\">number_kind_integer</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">number_kind_floating_point</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">number_kind_rational</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">number_kind_fixed_point</span></code>, or <code class=\"computeroutput\"><span class=\"identifier\">number_kind_unknown</span></code>. This traits class\n        is specialized for any type that has <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code>\n        support as well as for classes in this library: which means it can be used\n        for generic code that must work with <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n        (built-in)</a> arithmetic types as well as multiprecision ones.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">struct</span> <span class=\"identifier\">is_number</span><span class=\"special\">;</span>\n</pre>\n<p>\n        A traits class that inherits from <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">integral_constant</span><span class=\"special\">&lt;</span><span class=\"keyword\">bool</span><span class=\"special\">,</span>\n        <span class=\"keyword\">true</span><span class=\"special\">&gt;</span></code>\n        if T is an instance of <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;&gt;</span></code>, otherwise from <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">integral_constant</span><span class=\"special\">&lt;</span><span class=\"keyword\">bool</span><span class=\"special\">,</span>\n        <span class=\"keyword\">false</span><span class=\"special\">&gt;</span></code>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">struct</span> <span class=\"identifier\">is_number_expression</span><span class=\"special\">;</span>\n</pre>\n<p>\n        A traits class that inherits from <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">integral_constant</span><span class=\"special\">&lt;</span><span class=\"keyword\">bool</span><span class=\"special\">,</span>\n        <span class=\"keyword\">true</span><span class=\"special\">&gt;</span></code>\n        if T is an expression template type derived from <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;&gt;</span></code>, otherwise from <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">integral_constant</span><span class=\"special\">&lt;</span><span class=\"keyword\">bool</span><span class=\"special\">,</span>\n        <span class=\"keyword\">false</span><span class=\"special\">&gt;</span></code>.\n      </p>\n<h5>\n<a name=\"boost_multiprecision.ref.number.h8\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.ref.number.integer_functions\"></a></span><a class=\"link\" href=\"number.html#boost_multiprecision.ref.number.integer_functions\">Integer\n        functions</a>\n      </h5>\n<p>\n        In addition to functioning with types from this library, these functions\n        are also overloaded for <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n        (built-in)</a> integer types if you include <code class=\"computeroutput\"><span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">integer</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>.\n        Further, when used with fixed precision types (whether <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n        (built-in)</a> integers or multiprecision ones), the functions will promote\n        to a wider type internally when the algorithm requires it. Versions overloaded\n        for <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n        (built-in)</a> integer types return that integer type rather than an\n        expression template.\n      </p>\n<pre class=\"programlisting\"><span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">gcd</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Returns the largest integer <code class=\"computeroutput\"><span class=\"identifier\">x</span></code>\n        that divides both <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> and\n        <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n      </p>\n<pre class=\"programlisting\"><span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">lcm</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Returns the smallest integer <code class=\"computeroutput\"><span class=\"identifier\">x</span></code>\n        that is divisible by both <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n        and <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>.\n      </p>\n<pre class=\"programlisting\"><span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">pow</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">p</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Returns <span class=\"emphasis\"><em>b<sup>p</sup></em></span> as an expression template. Note that this\n        function should be used with extreme care as the result can grow so large\n        as to take \"effectively forever\" to compute, or else simply run\n        the host machine out of memory. This is the one function in this category\n        that is not overloaded for <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n        (built-in)</a> integer types, further, it's probably not a good idea\n        to use it with fixed precision <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>'s\n        either.\n      </p>\n<pre class=\"programlisting\"><span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">powm</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">p</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">m</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Returns <span class=\"emphasis\"><em>b<sup>p</sup> mod m</em></span> as an expression template. Fixed precision\n        types are promoted internally to ensure accuracy.\n      </p>\n<pre class=\"programlisting\"><span class=\"emphasis\"><em>unmentionable-expression-template-type</em></span>    <span class=\"identifier\">sqrt</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Returns the largest integer <code class=\"computeroutput\"><span class=\"identifier\">x</span></code>\n        such that <code class=\"computeroutput\"><span class=\"identifier\">x</span> <span class=\"special\">*</span>\n        <span class=\"identifier\">x</span> <span class=\"special\">&lt;</span>\n        <span class=\"identifier\">a</span></code>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">EXpressionTemplates</span><span class=\"special\">&gt;</span>      <span class=\"identifier\">sqrt</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">EXpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">r</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Returns the largest integer <code class=\"computeroutput\"><span class=\"identifier\">x</span></code>\n        such that <code class=\"computeroutput\"><span class=\"identifier\">x</span> <span class=\"special\">*</span>\n        <span class=\"identifier\">x</span> <span class=\"special\">&lt;</span>\n        <span class=\"identifier\">a</span></code>, and sets the remainder <code class=\"computeroutput\"><span class=\"identifier\">r</span></code> such that <code class=\"computeroutput\"><span class=\"identifier\">r</span>\n        <span class=\"special\">=</span> <span class=\"identifier\">a</span> <span class=\"special\">-</span> <span class=\"identifier\">x</span> <span class=\"special\">*</span>\n        <span class=\"identifier\">x</span></code>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">void</span> <span class=\"identifier\">divide_qr</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">x</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">y</span><span class=\"special\">,</span>\n               <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">q</span><span class=\"special\">,</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">r</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Divides x by y and returns both the quotient and remainder. After the call\n        <code class=\"computeroutput\"><span class=\"identifier\">q</span> <span class=\"special\">=</span>\n        <span class=\"identifier\">x</span> <span class=\"special\">/</span> <span class=\"identifier\">y</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">r</span>\n        <span class=\"special\">=</span> <span class=\"identifier\">x</span> <span class=\"special\">%</span> <span class=\"identifier\">y</span></code>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Integer</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">Integer</span> <span class=\"identifier\">integer_modulus</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">x</span><span class=\"special\">,</span> <span class=\"identifier\">Integer</span> <span class=\"identifier\">val</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Returns the absolute value of <code class=\"computeroutput\"><span class=\"identifier\">x</span>\n        <span class=\"special\">%</span> <span class=\"identifier\">val</span></code>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">unsigned</span> <span class=\"identifier\">lsb</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">x</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Returns the (zero-based) index of the least significant bit that is set to\n        1.\n      </p>\n<p>\n        Throws a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">range_error</span></code> if the argument is &lt;= 0.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">unsigned</span> <span class=\"identifier\">msb</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">x</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Returns the (zero-based) index of the most significant bit.\n      </p>\n<p>\n        Throws a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">range_error</span></code> if the argument is &lt;= 0.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">bit_test</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">index</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Returns <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> if the bit at\n        <span class=\"emphasis\"><em>index</em></span> in <span class=\"emphasis\"><em>val</em></span> is set.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">bit_set</span><span class=\"special\">(</span><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">index</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Sets the bit at <span class=\"emphasis\"><em>index</em></span> in <span class=\"emphasis\"><em>val</em></span>, and\n        returns <span class=\"emphasis\"><em>val</em></span>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">bit_unset</span><span class=\"special\">(</span><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">index</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Unsets the bit at <span class=\"emphasis\"><em>index</em></span> in <span class=\"emphasis\"><em>val</em></span>,\n        and returns <span class=\"emphasis\"><em>val</em></span>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">bit_flip</span><span class=\"special\">(</span><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">index</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Flips the bit at <span class=\"emphasis\"><em>index</em></span> in <span class=\"emphasis\"><em>val</em></span>,\n        and returns <span class=\"emphasis\"><em>val</em></span>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Engine</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">miller_rabin_test</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">n</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">trials</span><span class=\"special\">,</span> <span class=\"identifier\">Engine</span><span class=\"special\">&amp;</span> <span class=\"identifier\">gen</span><span class=\"special\">);</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">miller_rabin_test</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;</span> <span class=\"identifier\">n</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">trials</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Tests to see if the number <span class=\"emphasis\"><em>n</em></span> is probably prime - the\n        test excludes the vast majority of composite numbers by excluding small prime\n        factors and performing a single Fermat test. Then performs <span class=\"emphasis\"><em>trials</em></span>\n        Miller-Rabin tests. Returns <code class=\"computeroutput\"><span class=\"keyword\">false</span></code>\n        if <span class=\"emphasis\"><em>n</em></span> is definitely composite, or <code class=\"computeroutput\"><span class=\"keyword\">true</span></code>\n        if <span class=\"emphasis\"><em>n</em></span> is probably prime with the probability of it being\n        composite less than 0.25^trials. Fixed precision types are promoted internally\n        to ensure accuracy.\n      </p>\n<h5>\n<a name=\"boost_multiprecision.ref.number.h9\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.ref.number.rational_number_functions\"></a></span><a class=\"link\" href=\"number.html#boost_multiprecision.ref.number.rational_number_functions\">Rational\n        Number Functions</a>\n      </h5>\n<pre class=\"programlisting\"><span class=\"keyword\">typename</span> <span class=\"identifier\">component_type</span><span class=\"special\">&lt;</span><span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&gt;::</span><span class=\"identifier\">type</span> <span class=\"identifier\">numerator</span>  <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n<span class=\"keyword\">typename</span> <span class=\"identifier\">component_type</span><span class=\"special\">&lt;</span><span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&gt;::</span><span class=\"identifier\">type</span> <span class=\"identifier\">denominator</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;);</span>\n</pre>\n<p>\n        These functions return the numerator and denominator of a rational number\n        respectively.\n      </p>\n<h5>\n<a name=\"boost_multiprecision.ref.number.h10\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.ref.number.boost_math_interoperability_supp\"></a></span><a class=\"link\" href=\"number.html#boost_multiprecision.ref.number.boost_math_interoperability_supp\">Boost.Math\n        Interoperability Support</a>\n      </h5>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">math</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">int</span>  <span class=\"identifier\">fpclassify</span>     <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">int</span><span class=\"special\">);</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">isfinite</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">int</span><span class=\"special\">);</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">isnan</span>          <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">int</span><span class=\"special\">);</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">isinf</span>          <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">int</span><span class=\"special\">);</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">isnormal</span>       <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"emphasis\"><em>number-or-expression-template-type</em></span><span class=\"special\">&amp;,</span> <span class=\"keyword\">int</span><span class=\"special\">);</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n        These floating-point classification functions behave exactly as their Boost.Math\n        equivalents.\n      </p>\n<p>\n        Other Boost.Math functions and templates may also be specialized or overloaded\n        to ensure interoperability.\n      </p>\n<h5>\n<a name=\"boost_multiprecision.ref.number.h11\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.ref.number.std_numeric_limits_support\"></a></span><a class=\"link\" href=\"number.html#boost_multiprecision.ref.number.std_numeric_limits_support\">std::numeric_limits\n        support</a>\n      </h5>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">std</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">struct</span> <span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>\n<span class=\"special\">{</span>\n   <span class=\"comment\">/* Usual members here */</span>\n<span class=\"special\">};</span>\n\n<span class=\"special\">}</span>\n</pre>\n<p>\n        Class template <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code> is specialized for all instantiations\n        of <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> whose precision\n        is known at compile time, plus those types whose precision is unlimited (though\n        it is much less useful in those cases). It is not specialized for types whose\n        precision can vary at compile time (such as <code class=\"computeroutput\"><span class=\"identifier\">mpf_float</span></code>).\n      </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"cpp_int_ref.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/ref/tom_int_ref.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>tom_int</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../ref.html\" title=\"Reference\">\n<link rel=\"prev\" href=\"gmp_int_ref.html\" title=\"gmp_int\">\n<link rel=\"next\" href=\"mpf_ref.html\" title=\"gmp_float\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"gmp_int_ref.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"mpf_ref.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.ref.tom_int_ref\"></a><a class=\"link\" href=\"tom_int_ref.html\" title=\"tom_int\">tom_int</a>\n</h3></div></div></div>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">class</span> <span class=\"identifier\">tommath_int</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">tommath_int</span> <span class=\"special\">&gt;</span>         <span class=\"identifier\">tom_int</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n        Class template <code class=\"computeroutput\"><span class=\"identifier\">tommath_int</span></code>\n        fulfils all of the requirements for a <a class=\"link\" href=\"backendconc.html\" title=\"Backend Requirements\">Backend</a>\n        type. Its members and non-member functions are deliberately not documented:\n        these are considered implementation details that are subject to change.\n      </p>\n<p>\n        The type of <code class=\"computeroutput\"><span class=\"identifier\">number_category</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int</span><span class=\"special\">&lt;</span><span class=\"identifier\">Args</span><span class=\"special\">...&gt;</span> <span class=\"special\">&gt;::</span><span class=\"identifier\">type</span></code> is <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">integral_constant</span><span class=\"special\">&lt;</span><span class=\"keyword\">int</span><span class=\"special\">,</span>\n        <span class=\"identifier\">number_kind_integer</span><span class=\"special\">&gt;</span></code>.\n      </p>\n<p>\n        More information on this type can be found in the <a class=\"link\" href=\"../tut/ints/tom_int.html\" title=\"tom_int\">tutorial</a>.\n      </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"gmp_int_ref.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"mpf_ref.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/ref.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Reference</title>\n<link rel=\"stylesheet\" href=\"../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"prev\" href=\"tut/new_backend.html\" title=\"Writing a New Backend\">\n<link rel=\"next\" href=\"ref/number.html\" title=\"number\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"tut/new_backend.html\"><img src=\"../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"ref/number.html\"><img src=\"../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h2 class=\"title\" style=\"clear: both\">\n<a name=\"boost_multiprecision.ref\"></a><a class=\"link\" href=\"ref.html\" title=\"Reference\">Reference</a>\n</h2></div></div></div>\n<div class=\"toc\"><dl class=\"toc\">\n<dt><span class=\"section\"><a href=\"ref/number.html\">number</a></span></dt>\n<dt><span class=\"section\"><a href=\"ref/cpp_int_ref.html\">cpp_int</a></span></dt>\n<dt><span class=\"section\"><a href=\"ref/gmp_int_ref.html\">gmp_int</a></span></dt>\n<dt><span class=\"section\"><a href=\"ref/tom_int_ref.html\">tom_int</a></span></dt>\n<dt><span class=\"section\"><a href=\"ref/mpf_ref.html\">gmp_float</a></span></dt>\n<dt><span class=\"section\"><a href=\"ref/mpfr_ref.html\">mpfr_float_backend</a></span></dt>\n<dt><span class=\"section\"><a href=\"ref/cpp_bin_float_ref.html\">cpp_bin_float</a></span></dt>\n<dt><span class=\"section\"><a href=\"ref/cpp_dec_ref.html\">cpp_dec_float</a></span></dt>\n<dt><span class=\"section\"><a href=\"ref/internals.html\">Internal Support\n      Code</a></span></dt>\n<dt><span class=\"section\"><a href=\"ref/backendconc.html\">Backend Requirements</a></span></dt>\n<dt><span class=\"section\"><a href=\"ref/headers.html\">Header File Structure</a></span></dt>\n</dl></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"tut/new_backend.html\"><img src=\"../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"ref/number.html\"><img src=\"../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/complex/complex128.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>complex128</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../complex.html\" title=\"Complex Number Types\">\n<link rel=\"prev\" href=\"mpc_complex.html\" title=\"mpc_complex\">\n<link rel=\"next\" href=\"complex_adaptor.html\" title=\"complex_adaptor\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"mpc_complex.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../complex.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"complex_adaptor.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.complex.complex128\"></a><a class=\"link\" href=\"complex128.html\" title=\"complex128\">complex128</a>\n</h4></div></div></div>\n<p>\n          <code class=\"computeroutput\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">complex128</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">class</span> <span class=\"identifier\">complex128_backend</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">complex128_backend</span><span class=\"special\">,</span> <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span>    <span class=\"identifier\">complex128</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n          The <code class=\"computeroutput\"><span class=\"identifier\">complex128</span></code> number type\n          is a very thin wrapper around GCC's <code class=\"computeroutput\"><span class=\"identifier\">__float128</span></code>\n          or Intel's <code class=\"computeroutput\"><span class=\"identifier\">_Quad</span></code> data types\n          and provides a complex-number type that is a drop-in replacement for the\n          native C++ floating-point types, but with a 113 bit mantissa, and compatible\n          with FORTRAN's 128-bit QUAD real.\n        </p>\n<p>\n          All the usual standard library functions are available, performance should\n          be equivalent to the underlying native types.\n        </p>\n<p>\n          As well as the usual conversions from arithmetic and string types, instances\n          of <code class=\"computeroutput\"><span class=\"identifier\">float128</span></code> are copy constructible\n          and assignable from GCC's <code class=\"computeroutput\"><span class=\"identifier\">__float128</span></code>\n          and Intel's <code class=\"computeroutput\"><span class=\"identifier\">_Quad</span></code> data\n          types.\n        </p>\n<p>\n          Things you should know when using this type:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              Default constructed <code class=\"computeroutput\"><span class=\"identifier\">complex128</span></code>s\n              have the value zero.\n            </li>\n<li class=\"listitem\">\n              This backend supports rvalue-references and is move-aware, making instantiations\n              of <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> on this backend\n              move aware.\n            </li>\n<li class=\"listitem\">\n              It is not possible to round-trip objects of this type to and from a\n              string and get back exactly the same value when compiled with Intel's\n              C++ compiler and using <code class=\"computeroutput\"><span class=\"identifier\">_Quad</span></code>\n              as the underlying type: this is a current limitation of our code. Round\n              tripping when using <code class=\"computeroutput\"><span class=\"identifier\">__float128</span></code>\n              as the underlying type is possible (both for GCC and Intel).\n            </li>\n<li class=\"listitem\">\n              Conversion from a string results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code>\n              being thrown if the string can not be interpreted as a valid floating-point\n              number.\n            </li>\n<li class=\"listitem\">\n              Division by zero results in an infinity being produced.\n            </li>\n<li class=\"listitem\">\n              When using the Intel compiler, the underlying type defaults to <code class=\"computeroutput\"><span class=\"identifier\">__float128</span></code> if it's available and\n              <code class=\"computeroutput\"><span class=\"identifier\">_Quad</span></code> if not. You can\n              override the default by defining either <code class=\"computeroutput\"><span class=\"identifier\">BOOST_MP_USE_FLOAT128</span></code>\n              or <code class=\"computeroutput\"><span class=\"identifier\">BOOST_MP_USE_QUAD</span></code>.\n            </li>\n<li class=\"listitem\">\n              When the underlying type is Intel's <code class=\"computeroutput\"><span class=\"identifier\">_Quad</span></code>\n              type, the code must be compiled with the compiler option <code class=\"computeroutput\"><span class=\"special\">-</span><span class=\"identifier\">Qoption</span><span class=\"special\">,</span><span class=\"identifier\">cpp</span><span class=\"special\">,--</span><span class=\"identifier\">extended_float_type</span></code>.\n            </li>\n</ul></div>\n<h6>\n<a name=\"boost_multiprecision.tut.complex.complex128.h0\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.complex.complex128.complex128_example\"></a></span><a class=\"link\" href=\"complex128.html#boost_multiprecision.tut.complex.complex128.complex128_example\">complex128\n          example:</a>\n        </h6>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">complex</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">complex128</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">template</span><span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Complex</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">void</span> <span class=\"identifier\">complex_number_examples</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n    <span class=\"identifier\">Complex</span> <span class=\"identifier\">z1</span><span class=\"special\">{</span><span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"number\">1</span><span class=\"special\">};</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">typename</span> <span class=\"identifier\">Complex</span><span class=\"special\">::</span><span class=\"identifier\">value_type</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">scientific</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">fixed</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Print a complex number: \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">z1</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Square it             : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">z1</span><span class=\"special\">*</span><span class=\"identifier\">z1</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Real part             : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">z1</span><span class=\"special\">.</span><span class=\"identifier\">real</span><span class=\"special\">()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\" = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">real</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Imaginary part        : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">z1</span><span class=\"special\">.</span><span class=\"identifier\">imag</span><span class=\"special\">()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\" = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">imag</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">abs</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Absolute value        : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">abs</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Argument              : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">arg</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Norm                  : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">norm</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Complex conjugate     : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">conj</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Projection onto Riemann sphere: \"</span> <span class=\"special\">&lt;&lt;</span>  <span class=\"identifier\">proj</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">typename</span> <span class=\"identifier\">Complex</span><span class=\"special\">::</span><span class=\"identifier\">value_type</span> <span class=\"identifier\">r</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n    <span class=\"keyword\">typename</span> <span class=\"identifier\">Complex</span><span class=\"special\">::</span><span class=\"identifier\">value_type</span> <span class=\"identifier\">theta</span> <span class=\"special\">=</span> <span class=\"number\">0.8</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">polar</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Polar coordinates (phase = 0)    : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">polar</span><span class=\"special\">(</span><span class=\"identifier\">r</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Polar coordinates (phase !=0)    : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">polar</span><span class=\"special\">(</span><span class=\"identifier\">r</span><span class=\"special\">,</span> <span class=\"identifier\">theta</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"\\nElementary special functions:\\n\"</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">exp</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"exp(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">exp</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">log</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"log(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">log</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">log10</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"log10(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">log10</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">pow</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"pow(z1, z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">pow</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">,</span> <span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">sqrt</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Take its square root  : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">sqrt</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">sin</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"sin(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">sin</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cos</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"cos(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">cos</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">tan</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"tan(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">tan</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">asin</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"asin(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">asin</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">acos</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"acos(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">acos</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">atan</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"atan(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">atan</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">sinh</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"sinh(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">sinh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cosh</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"cosh(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">cosh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">tanh</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"tanh(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">tanh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">asinh</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"asinh(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">asinh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">acosh</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"acosh(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">acosh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">atanh</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"atanh(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">atanh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"First, some operations we usually perform with std::complex:\\n\"</span><span class=\"special\">;</span>\n    <span class=\"identifier\">complex_number_examples</span><span class=\"special\">&lt;</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">complex</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;&gt;();</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"\\nNow the same operations performed using quad precision complex numbers:\\n\"</span><span class=\"special\">;</span>\n    <span class=\"identifier\">complex_number_examples</span><span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">complex128</span><span class=\"special\">&gt;();</span>\n\n    <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n          Which results in the output:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">Print</span> <span class=\"identifier\">a</span> <span class=\"identifier\">complex</span> <span class=\"identifier\">number</span><span class=\"special\">:</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">1.000000000000000000000000000000000</span><span class=\"special\">)</span>\n<span class=\"identifier\">Square</span> <span class=\"identifier\">it</span>             <span class=\"special\">:</span> <span class=\"special\">-</span><span class=\"number\">1.000000000000000000000000000000000</span>\n<span class=\"identifier\">Real</span> <span class=\"identifier\">part</span>             <span class=\"special\">:</span> <span class=\"number\">0.000000000000000000000000000000000</span> <span class=\"special\">=</span> <span class=\"number\">0.000000000000000000000000000000000</span>\n<span class=\"identifier\">Imaginary</span> <span class=\"identifier\">part</span>        <span class=\"special\">:</span> <span class=\"number\">1.000000000000000000000000000000000</span> <span class=\"special\">=</span> <span class=\"number\">1.000000000000000000000000000000000</span>\n<span class=\"identifier\">Absolute</span> <span class=\"identifier\">value</span>        <span class=\"special\">:</span> <span class=\"number\">1.000000000000000000000000000000000</span>\n<span class=\"identifier\">Argument</span>              <span class=\"special\">:</span> <span class=\"number\">1.570796326794896619231321691639751</span>\n<span class=\"identifier\">Norm</span>                  <span class=\"special\">:</span> <span class=\"number\">1.000000000000000000000000000000000</span>\n<span class=\"identifier\">Complex</span> <span class=\"identifier\">conjugate</span>     <span class=\"special\">:</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,-</span><span class=\"number\">1.000000000000000000000000000000000</span><span class=\"special\">)</span>\n<span class=\"identifier\">Projection</span> <span class=\"identifier\">onto</span> <span class=\"identifier\">Riemann</span> <span class=\"identifier\">sphere</span><span class=\"special\">:</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">1.000000000000000000000000000000000</span><span class=\"special\">)</span>\n<span class=\"identifier\">Polar</span> <span class=\"identifier\">coordinates</span> <span class=\"special\">(</span><span class=\"identifier\">phase</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">)</span>    <span class=\"special\">:</span> <span class=\"number\">1.000000000000000000000000000000000</span>\n<span class=\"identifier\">Polar</span> <span class=\"identifier\">coordinates</span> <span class=\"special\">(</span><span class=\"identifier\">phase</span> <span class=\"special\">!=</span><span class=\"number\">0</span><span class=\"special\">)</span>    <span class=\"special\">:</span> <span class=\"special\">(</span><span class=\"number\">0.696706709347165389063740022772449</span><span class=\"special\">,</span><span class=\"number\">0.717356090899522792567167815703377</span><span class=\"special\">)</span>\n\n<span class=\"identifier\">Elementary</span> <span class=\"identifier\">special</span> <span class=\"identifier\">functions</span><span class=\"special\">:</span>\n<span class=\"identifier\">exp</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.540302305868139717400936607442977</span><span class=\"special\">,</span><span class=\"number\">0.841470984807896506652502321630299</span><span class=\"special\">)</span>\n<span class=\"identifier\">log</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">1.570796326794896619231321691639751</span><span class=\"special\">)</span>\n<span class=\"identifier\">log10</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">0.682188176920920673742891812715678</span><span class=\"special\">)</span>\n<span class=\"identifier\">pow</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">,</span> <span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"number\">0.207879576350761908546955619834979</span>\n<span class=\"identifier\">Take</span> <span class=\"identifier\">its</span> <span class=\"identifier\">square</span> <span class=\"identifier\">root</span>  <span class=\"special\">:</span> <span class=\"special\">(</span><span class=\"number\">0.707106781186547524400844362104849</span><span class=\"special\">,</span><span class=\"number\">0.707106781186547524400844362104849</span><span class=\"special\">)</span>\n<span class=\"identifier\">sin</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">1.175201193643801456882381850595601</span><span class=\"special\">)</span>\n<span class=\"identifier\">cos</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"number\">1.543080634815243778477905620757061</span>\n<span class=\"identifier\">tan</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">0.761594155955764888119458282604794</span><span class=\"special\">)</span>\n<span class=\"identifier\">asin</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">0.881373587019543025232609324979792</span><span class=\"special\">)</span>\n<span class=\"identifier\">acos</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">1.570796326794896619231321691639751</span><span class=\"special\">,-</span><span class=\"number\">0.881373587019543025232609324979792</span><span class=\"special\">)</span>\n<span class=\"identifier\">atan</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"identifier\">inf</span><span class=\"special\">)</span>\n<span class=\"identifier\">sinh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">0.841470984807896506652502321630299</span><span class=\"special\">)</span>\n<span class=\"identifier\">cosh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"number\">0.540302305868139717400936607442977</span>\n<span class=\"identifier\">tanh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">1.557407724654902230506974807458360</span><span class=\"special\">)</span>\n<span class=\"identifier\">asinh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">1.570796326794896619231321691639751</span><span class=\"special\">)</span>\n<span class=\"identifier\">acosh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.881373587019543025232609324979792</span><span class=\"special\">,</span><span class=\"number\">1.570796326794896619231321691639751</span><span class=\"special\">)</span>\n<span class=\"identifier\">atanh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">0.785398163397448309615660845819876</span><span class=\"special\">)</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"mpc_complex.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../complex.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"complex_adaptor.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/complex/complex_adaptor.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>complex_adaptor</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../complex.html\" title=\"Complex Number Types\">\n<link rel=\"prev\" href=\"complex128.html\" title=\"complex128\">\n<link rel=\"next\" href=\"../rational.html\" title=\"Rational Number Types\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"complex128.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../complex.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../rational.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.complex.complex_adaptor\"></a><a class=\"link\" href=\"complex_adaptor.html\" title=\"complex_adaptor\">complex_adaptor</a>\n</h4></div></div></div>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">struct</span> <span class=\"identifier\">complex_adaptor</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span>\n</pre>\n<p>\n          Class template <code class=\"computeroutput\"><span class=\"identifier\">complex_adaptor</span></code>\n          is designed to sit inbetween class <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n          and an actual floating point backend, in order to create a new complex\n          number type.\n        </p>\n<p>\n          It is the means by which we implement <a class=\"link\" href=\"cpp_complex.html\" title=\"cpp_complex\">cpp_complex</a>\n          and <a class=\"link\" href=\"complex128.html\" title=\"complex128\">complex128</a>.\n        </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"complex128.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../complex.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../rational.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/complex/cpp_complex.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>cpp_complex</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../complex.html\" title=\"Complex Number Types\">\n<link rel=\"prev\" href=\"../complex.html\" title=\"Complex Number Types\">\n<link rel=\"next\" href=\"mpc_complex.html\" title=\"mpc_complex\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../complex.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../complex.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"mpc_complex.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.complex.cpp_complex\"></a><a class=\"link\" href=\"cpp_complex.html\" title=\"cpp_complex\">cpp_complex</a>\n</h4></div></div></div>\n<p>\n          <code class=\"computeroutput\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_complex</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n   <span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits</span><span class=\"special\">,</span> <span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">digit_base_type</span> <span class=\"identifier\">DigitBase</span> <span class=\"special\">=</span> <span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">digit_base_10</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Allocator</span> <span class=\"special\">=</span> <span class=\"keyword\">void</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Exponent</span> <span class=\"special\">=</span> <span class=\"keyword\">int</span><span class=\"special\">,</span> <span class=\"identifier\">Exponent</span> <span class=\"identifier\">MinExponent</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"identifier\">Exponent</span> <span class=\"identifier\">MaxExponent</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">&gt;</span>\n   <span class=\"keyword\">using</span> <span class=\"identifier\">cpp_complex_backend</span> <span class=\"special\">=</span> <span class=\"identifier\">complex_adaptor</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits</span><span class=\"special\">,</span> <span class=\"identifier\">DigitBase</span><span class=\"special\">,</span> <span class=\"identifier\">Allocator</span><span class=\"special\">,</span> <span class=\"identifier\">Exponent</span><span class=\"special\">,</span> <span class=\"identifier\">MinExponent</span><span class=\"special\">,</span> <span class=\"identifier\">MaxExponent</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;;</span>\n\n   <span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits</span><span class=\"special\">,</span> <span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">digit_base_type</span> <span class=\"identifier\">DigitBase</span> <span class=\"special\">=</span> <span class=\"identifier\">digit_base_10</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Allocator</span> <span class=\"special\">=</span> <span class=\"keyword\">void</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Exponent</span> <span class=\"special\">=</span> <span class=\"keyword\">int</span><span class=\"special\">,</span> <span class=\"identifier\">Exponent</span> <span class=\"identifier\">MinExponent</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"identifier\">Exponent</span> <span class=\"identifier\">MaxExponent</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span> <span class=\"special\">=</span> <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span>\n   <span class=\"keyword\">using</span> <span class=\"identifier\">cpp_complex</span> <span class=\"special\">=</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">complex_adaptor</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits</span><span class=\"special\">,</span> <span class=\"identifier\">DigitBase</span><span class=\"special\">,</span> <span class=\"identifier\">Allocator</span><span class=\"special\">,</span> <span class=\"identifier\">Exponent</span><span class=\"special\">,</span> <span class=\"identifier\">MinExponent</span><span class=\"special\">,</span> <span class=\"identifier\">MaxExponent</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;;</span>\n\n   <span class=\"keyword\">typedef</span> <span class=\"identifier\">cpp_complex</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">&gt;</span> <span class=\"identifier\">cpp_complex_50</span><span class=\"special\">;</span>\n   <span class=\"keyword\">typedef</span> <span class=\"identifier\">cpp_complex</span><span class=\"special\">&lt;</span><span class=\"number\">100</span><span class=\"special\">&gt;</span> <span class=\"identifier\">cpp_complex_100</span><span class=\"special\">;</span>\n\n   <span class=\"keyword\">typedef</span> <span class=\"identifier\">cpp_complex</span><span class=\"special\">&lt;</span><span class=\"number\">24</span><span class=\"special\">,</span> <span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">digit_base_2</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">int16_t</span><span class=\"special\">,</span> <span class=\"special\">-</span><span class=\"number\">126</span><span class=\"special\">,</span> <span class=\"number\">127</span><span class=\"special\">&gt;</span> <span class=\"identifier\">cpp_complex_single</span><span class=\"special\">;</span>\n   <span class=\"keyword\">typedef</span> <span class=\"identifier\">cpp_complex</span><span class=\"special\">&lt;</span><span class=\"number\">53</span><span class=\"special\">,</span> <span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">digit_base_2</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">int16_t</span><span class=\"special\">,</span> <span class=\"special\">-</span><span class=\"number\">1022</span><span class=\"special\">,</span> <span class=\"number\">1023</span><span class=\"special\">&gt;</span> <span class=\"identifier\">cpp_complex_double</span><span class=\"special\">;</span>\n   <span class=\"keyword\">typedef</span> <span class=\"identifier\">cpp_complex</span><span class=\"special\">&lt;</span><span class=\"number\">64</span><span class=\"special\">,</span> <span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">digit_base_2</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">int16_t</span><span class=\"special\">,</span> <span class=\"special\">-</span><span class=\"number\">16382</span><span class=\"special\">,</span> <span class=\"number\">16383</span><span class=\"special\">&gt;</span> <span class=\"identifier\">cpp_complex_extended</span><span class=\"special\">;</span>\n   <span class=\"keyword\">typedef</span> <span class=\"identifier\">cpp_complex</span><span class=\"special\">&lt;</span><span class=\"number\">113</span><span class=\"special\">,</span> <span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">digit_base_2</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">int16_t</span><span class=\"special\">,</span> <span class=\"special\">-</span><span class=\"number\">16382</span><span class=\"special\">,</span> <span class=\"number\">16383</span><span class=\"special\">&gt;</span> <span class=\"identifier\">cpp_complex_quad</span><span class=\"special\">;</span>\n   <span class=\"keyword\">typedef</span> <span class=\"identifier\">cpp_complex</span><span class=\"special\">&lt;</span><span class=\"number\">237</span><span class=\"special\">,</span> <span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">digit_base_2</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">int32_t</span><span class=\"special\">,</span> <span class=\"special\">-</span><span class=\"number\">262142</span><span class=\"special\">,</span> <span class=\"number\">262143</span><span class=\"special\">&gt;</span> <span class=\"identifier\">cpp_complex_oct</span><span class=\"special\">;</span>\n\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n          The <code class=\"computeroutput\"><span class=\"identifier\">cpp_complex_backend</span></code>\n          back-end is used in conjunction with <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>:\n          It acts as an entirely C++ (header only and dependency free) complex number\n          type that is a drop-in replacement for <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">complex</span></code>,\n          but with much greater precision.\n        </p>\n<p>\n          The template alias <code class=\"computeroutput\"><span class=\"identifier\">cpp_complex</span></code>\n          avoids the need to use class <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n          directly.\n        </p>\n<p>\n          Type <code class=\"computeroutput\"><span class=\"identifier\">cpp_complex</span></code> can be\n          used at fixed precision by specifying a non-zero <code class=\"computeroutput\"><span class=\"identifier\">Digits</span></code>\n          template parameter. The typedefs <code class=\"computeroutput\"><span class=\"identifier\">cpp_complex_50</span></code>\n          and <code class=\"computeroutput\"><span class=\"identifier\">cpp_complex_100</span></code> provide\n          complex number types at 50 and 100 decimal digits precision respectively.\n        </p>\n<p>\n          Optionally, you can specify whether the precision is specified in decimal\n          digits or binary bits - for example to declare a <code class=\"computeroutput\"><span class=\"identifier\">cpp_complex</span></code>\n          with exactly the same precision as <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">complex</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;</span></code> one would use <code class=\"computeroutput\"><span class=\"identifier\">cpp_complex</span><span class=\"special\">&lt;</span><span class=\"number\">53</span><span class=\"special\">,</span>\n          <span class=\"identifier\">digit_base_2</span><span class=\"special\">&gt;</span></code>.\n          The typedefs <code class=\"computeroutput\"><span class=\"identifier\">cpp_complex_single</span></code>,\n          <code class=\"computeroutput\"><span class=\"identifier\">cpp_complex_double</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">cpp_complex_quad</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">cpp_complex_oct</span></code>\n          and <code class=\"computeroutput\"><span class=\"identifier\">cpp_complex_double_extended</span></code>\n          provide software analogues of the IEEE single, double, quad and octuple\n          float data types, plus the Intel-extended-double type respectively. Note\n          that while these types are functionally equivalent to the native IEEE types,\n          but they do not have the same size or bit-layout as true IEEE compatible\n          types.\n        </p>\n<p>\n          Normally <code class=\"computeroutput\"><span class=\"identifier\">cpp_complex</span></code> allocates\n          no memory: all of the space required for its digits are allocated directly\n          within the class. As a result care should be taken not to use the class\n          with too high a digit count as stack space requirements can grow out of\n          control. If that represents a problem then providing an allocator as a\n          template parameter causes <code class=\"computeroutput\"><span class=\"identifier\">cpp_complex</span></code>\n          to dynamically allocate the memory it needs: this significantly reduces\n          the size of <code class=\"computeroutput\"><span class=\"identifier\">cpp_complex</span></code>\n          and increases the viable upper limit on the number of digits at the expense\n          of performance. However, please bear in mind that arithmetic operations\n          rapidly become <span class=\"emphasis\"><em>very</em></span> expensive as the digit count grows:\n          the current implementation really isn't optimized or designed for large\n          digit counts. Note that since the actual type of the objects allocated\n          is completely opaque, the suggestion would be to use an allocator with\n          <code class=\"computeroutput\"><span class=\"keyword\">char</span></code> <code class=\"computeroutput\"><span class=\"identifier\">value_type</span></code>,\n          for example: <code class=\"computeroutput\"><span class=\"identifier\">cpp_complex</span><span class=\"special\">&lt;</span><span class=\"number\">1000</span><span class=\"special\">,</span> <span class=\"identifier\">digit_base_10</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">allocator</span><span class=\"special\">&lt;</span><span class=\"keyword\">char</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code>.\n        </p>\n<p>\n          The next template parameters determine the type and range of the exponent:\n          parameter <code class=\"computeroutput\"><span class=\"identifier\">Exponent</span></code> can\n          be any signed integer type, but note that <code class=\"computeroutput\"><span class=\"identifier\">MinExponent</span></code>\n          and <code class=\"computeroutput\"><span class=\"identifier\">MaxExponent</span></code> can not\n          go right up to the limits of the <code class=\"computeroutput\"><span class=\"identifier\">Exponent</span></code>\n          type as there has to be a little extra headroom for internal calculations.\n          You will get a compile time error if this is the case. In addition if MinExponent\n          or MaxExponent are zero, then the library will choose suitable values that\n          are as large as possible given the constraints of the type and need for\n          extra headroom for internal calculations.\n        </p>\n<p>\n          Finally, as with class <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>,\n          the final template parameter determines whether expression templates are\n          turn on or not. Since by default this type allocates no memory, expression\n          template support is off by default. However, you should probably turn it\n          on if you specify an allocator.\n        </p>\n<p>\n          There is full standard library support available for this type, comparable\n          with what <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">complex</span></code> provides.\n        </p>\n<p>\n          Things you should know when using this type:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              Default constructed <code class=\"computeroutput\"><span class=\"identifier\">cpp_complex</span></code>s\n              have a value of zero.\n            </li>\n<li class=\"listitem\">\n              The radix of this type is 2, even when the precision is specified as\n              decimal digits.\n            </li>\n<li class=\"listitem\">\n              The type supports both infinities and NaNs. An infinity is generated\n              whenever the result would overflow, and a NaN is generated for any\n              mathematically undefined operation.\n            </li>\n<li class=\"listitem\">\n              There is no <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code> specialisation for\n              this type: this is the same behaviour as <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">complex</span></code>.\n              If you need <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code> support you need to\n              look at <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">my_complex_number_type</span><span class=\"special\">::</span><span class=\"identifier\">value_type</span><span class=\"special\">&gt;</span></code>.\n            </li>\n<li class=\"listitem\">\n              Any <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> instantiated\n              on this type, is convertible to any other <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n              instantiated on this type - for example you can convert from <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_complex</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code> to <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"identifier\">SomeOtherValue</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code>.\n              Narrowing conversions round to nearest and are <code class=\"computeroutput\"><span class=\"keyword\">explicit</span></code>.\n            </li>\n<li class=\"listitem\">\n              Conversion from a string results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code>\n              being thrown if the string can not be interpreted as a valid complex\n              number.\n            </li>\n</ul></div>\n<h6>\n<a name=\"boost_multiprecision.tut.complex.cpp_complex.h0\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.complex.cpp_complex.example\"></a></span><a class=\"link\" href=\"cpp_complex.html#boost_multiprecision.tut.complex.cpp_complex.example\">example:</a>\n        </h6>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">complex</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_complex</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">template</span><span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Complex</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">void</span> <span class=\"identifier\">complex_number_examples</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n    <span class=\"identifier\">Complex</span> <span class=\"identifier\">z1</span><span class=\"special\">{</span><span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"number\">1</span><span class=\"special\">};</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">typename</span> <span class=\"identifier\">Complex</span><span class=\"special\">::</span><span class=\"identifier\">value_type</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">scientific</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">fixed</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Print a complex number: \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">z1</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Square it             : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">z1</span><span class=\"special\">*</span><span class=\"identifier\">z1</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Real part             : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">z1</span><span class=\"special\">.</span><span class=\"identifier\">real</span><span class=\"special\">()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\" = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">real</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Imaginary part        : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">z1</span><span class=\"special\">.</span><span class=\"identifier\">imag</span><span class=\"special\">()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\" = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">imag</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">abs</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Absolute value        : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">abs</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Argument              : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">arg</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Norm                  : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">norm</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Complex conjugate     : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">conj</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Projection onto Riemann sphere: \"</span> <span class=\"special\">&lt;&lt;</span>  <span class=\"identifier\">proj</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">typename</span> <span class=\"identifier\">Complex</span><span class=\"special\">::</span><span class=\"identifier\">value_type</span> <span class=\"identifier\">r</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n    <span class=\"keyword\">typename</span> <span class=\"identifier\">Complex</span><span class=\"special\">::</span><span class=\"identifier\">value_type</span> <span class=\"identifier\">theta</span> <span class=\"special\">=</span> <span class=\"number\">0.8</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">polar</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Polar coordinates (phase = 0)    : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">polar</span><span class=\"special\">(</span><span class=\"identifier\">r</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Polar coordinates (phase !=0)    : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">polar</span><span class=\"special\">(</span><span class=\"identifier\">r</span><span class=\"special\">,</span> <span class=\"identifier\">theta</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"\\nElementary special functions:\\n\"</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">exp</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"exp(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">exp</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">log</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"log(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">log</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">log10</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"log10(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">log10</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">pow</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"pow(z1, z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">pow</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">,</span> <span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">sqrt</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Take its square root  : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">sqrt</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">sin</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"sin(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">sin</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cos</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"cos(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">cos</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">tan</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"tan(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">tan</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">asin</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"asin(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">asin</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">acos</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"acos(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">acos</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">atan</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"atan(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">atan</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">sinh</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"sinh(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">sinh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cosh</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"cosh(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">cosh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">tanh</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"tanh(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">tanh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">asinh</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"asinh(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">asinh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">acosh</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"acosh(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">acosh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">atanh</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"atanh(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">atanh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"First, some operations we usually perform with std::complex:\\n\"</span><span class=\"special\">;</span>\n    <span class=\"identifier\">complex_number_examples</span><span class=\"special\">&lt;</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">complex</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;&gt;();</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"\\nNow the same operations performed using quad precision complex numbers:\\n\"</span><span class=\"special\">;</span>\n    <span class=\"identifier\">complex_number_examples</span><span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_complex_quad</span><span class=\"special\">&gt;();</span>\n\n    <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n          Which produces the output (for the multiprecision type):\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">Print</span> <span class=\"identifier\">a</span> <span class=\"identifier\">complex</span> <span class=\"identifier\">number</span><span class=\"special\">:</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">1.000000000000000000000000000000000</span><span class=\"special\">)</span>\n<span class=\"identifier\">Square</span> <span class=\"identifier\">it</span>             <span class=\"special\">:</span> <span class=\"special\">-</span><span class=\"number\">1.000000000000000000000000000000000</span>\n<span class=\"identifier\">Real</span> <span class=\"identifier\">part</span>             <span class=\"special\">:</span> <span class=\"number\">0.000000000000000000000000000000000</span> <span class=\"special\">=</span> <span class=\"number\">0.000000000000000000000000000000000</span>\n<span class=\"identifier\">Imaginary</span> <span class=\"identifier\">part</span>        <span class=\"special\">:</span> <span class=\"number\">1.000000000000000000000000000000000</span> <span class=\"special\">=</span> <span class=\"number\">1.000000000000000000000000000000000</span>\n<span class=\"identifier\">Absolute</span> <span class=\"identifier\">value</span>        <span class=\"special\">:</span> <span class=\"number\">1.000000000000000000000000000000000</span>\n<span class=\"identifier\">Argument</span>              <span class=\"special\">:</span> <span class=\"number\">1.570796326794896619231321691639751</span>\n<span class=\"identifier\">Norm</span>                  <span class=\"special\">:</span> <span class=\"number\">1.000000000000000000000000000000000</span>\n<span class=\"identifier\">Complex</span> <span class=\"identifier\">conjugate</span>     <span class=\"special\">:</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,-</span><span class=\"number\">1.000000000000000000000000000000000</span><span class=\"special\">)</span>\n<span class=\"identifier\">Projection</span> <span class=\"identifier\">onto</span> <span class=\"identifier\">Riemann</span> <span class=\"identifier\">sphere</span><span class=\"special\">:</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">1.000000000000000000000000000000000</span><span class=\"special\">)</span>\n<span class=\"identifier\">Polar</span> <span class=\"identifier\">coordinates</span> <span class=\"special\">(</span><span class=\"identifier\">phase</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">)</span>    <span class=\"special\">:</span> <span class=\"number\">1.000000000000000000000000000000000</span>\n<span class=\"identifier\">Polar</span> <span class=\"identifier\">coordinates</span> <span class=\"special\">(</span><span class=\"identifier\">phase</span> <span class=\"special\">!=</span><span class=\"number\">0</span><span class=\"special\">)</span>    <span class=\"special\">:</span> <span class=\"special\">(</span><span class=\"number\">0.696706709347165389063740022772448</span><span class=\"special\">,</span><span class=\"number\">0.717356090899522792567167815703377</span><span class=\"special\">)</span>\n\n<span class=\"identifier\">Elementary</span> <span class=\"identifier\">special</span> <span class=\"identifier\">functions</span><span class=\"special\">:</span>\n<span class=\"identifier\">exp</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.540302305868139717400936607442977</span><span class=\"special\">,</span><span class=\"number\">0.841470984807896506652502321630299</span><span class=\"special\">)</span>\n<span class=\"identifier\">log</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">1.570796326794896619231321691639751</span><span class=\"special\">)</span>\n<span class=\"identifier\">log10</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">0.682188176920920673742891812715678</span><span class=\"special\">)</span>\n<span class=\"identifier\">pow</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">,</span> <span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"number\">0.207879576350761908546955619834979</span>\n<span class=\"identifier\">Take</span> <span class=\"identifier\">its</span> <span class=\"identifier\">square</span> <span class=\"identifier\">root</span>  <span class=\"special\">:</span> <span class=\"special\">(</span><span class=\"number\">0.707106781186547524400844362104849</span><span class=\"special\">,</span><span class=\"number\">0.707106781186547524400844362104849</span><span class=\"special\">)</span>\n<span class=\"identifier\">sin</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">1.175201193643801456882381850595601</span><span class=\"special\">)</span>\n<span class=\"identifier\">cos</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"number\">1.543080634815243778477905620757062</span>\n<span class=\"identifier\">tan</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">0.761594155955764888119458282604794</span><span class=\"special\">)</span>\n<span class=\"identifier\">asin</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">0.881373587019543025232609324979793</span><span class=\"special\">)</span>\n<span class=\"identifier\">acos</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">1.570796326794896619231321691639751</span><span class=\"special\">,-</span><span class=\"number\">0.881373587019543025232609324979793</span><span class=\"special\">)</span>\n<span class=\"identifier\">atan</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"identifier\">inf</span><span class=\"special\">)</span>\n<span class=\"identifier\">sinh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">0.841470984807896506652502321630299</span><span class=\"special\">)</span>\n<span class=\"identifier\">cosh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"number\">0.540302305868139717400936607442977</span>\n<span class=\"identifier\">tanh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">1.557407724654902230506974807458360</span><span class=\"special\">)</span>\n<span class=\"identifier\">asinh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">1.570796326794896619231321691639751</span><span class=\"special\">)</span>\n<span class=\"identifier\">acosh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.881373587019543025232609324979792</span><span class=\"special\">,</span><span class=\"number\">1.570796326794896619231321691639751</span><span class=\"special\">)</span>\n<span class=\"identifier\">atanh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">0.785398163397448309615660845819876</span><span class=\"special\">)</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../complex.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../complex.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"mpc_complex.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/complex/mpc_complex.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>mpc_complex</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../complex.html\" title=\"Complex Number Types\">\n<link rel=\"prev\" href=\"cpp_complex.html\" title=\"cpp_complex\">\n<link rel=\"next\" href=\"complex128.html\" title=\"complex128\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"cpp_complex.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../complex.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"complex128.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.complex.mpc_complex\"></a><a class=\"link\" href=\"mpc_complex.html\" title=\"mpc_complex\">mpc_complex</a>\n</h4></div></div></div>\n<p>\n          <code class=\"computeroutput\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">mpc</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">mpc_complex_backend</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpc_complex_backend</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>    <span class=\"identifier\">mpc_complex_50</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpc_complex_backend</span><span class=\"special\">&lt;</span><span class=\"number\">100</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">mpc_complex_100</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpc_complex_backend</span><span class=\"special\">&lt;</span><span class=\"number\">500</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">mpc_complex_500</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpc_complex_backend</span><span class=\"special\">&lt;</span><span class=\"number\">1000</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>  <span class=\"identifier\">mpc_complex_1000</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpc_complex_backend</span><span class=\"special\">&lt;</span><span class=\"number\">0</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>     <span class=\"identifier\">mpc_complex</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n          The <code class=\"computeroutput\"><span class=\"identifier\">mpc_complex_backend</span></code>\n          type is used in conjunction with <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>:\n          It acts as a thin wrapper around the <a href=\"http://www.multiprecision.org\" target=\"_top\">MPC</a>\n          <code class=\"computeroutput\"><span class=\"identifier\">mpc_t</span></code> to provide an real-number\n          type that is a drop-in replacement for <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">complex</span></code>,\n          but with much greater precision.\n        </p>\n<p>\n          Type <code class=\"computeroutput\"><span class=\"identifier\">mpc_complex_backend</span></code>\n          can be used at fixed precision by specifying a non-zero <code class=\"computeroutput\"><span class=\"identifier\">Digits10</span></code>\n          template parameter, or at variable precision by setting the template argument\n          to zero. The typedefs mpc_complex_50, mpc_complex_100, mpc_complex_500,\n          mpc_complex_1000 provide complex types at 50, 100, 500 and 1000 decimal\n          digits precision respectively. The typedef mpc_complex provides a variable\n          precision type whose precision can be controlled via the <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>s member functions.\n        </p>\n<p>\n          The <code class=\"computeroutput\"><span class=\"identifier\">mpc</span></code> backend should\n          allow use of the same syntax as the C++ standard library complex type.\n          When using this backend, remember to link with the flags <code class=\"computeroutput\"><span class=\"special\">-</span><span class=\"identifier\">lmpc</span> <span class=\"special\">-</span><span class=\"identifier\">lmpfr</span> <span class=\"special\">-</span><span class=\"identifier\">lgmp</span></code>.\n        </p>\n<p>\n          As well as the usual conversions from arithmetic and string types, instances\n          of <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpc_complex_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code> are copy constructible and assignable\n          from:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              The <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> native types <code class=\"computeroutput\"><span class=\"identifier\">mpf_t</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">mpz_t</span></code>,\n              <code class=\"computeroutput\"><span class=\"identifier\">mpq_t</span></code>.\n            </li>\n<li class=\"listitem\">\n              The <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a> native type <code class=\"computeroutput\"><span class=\"identifier\">mpfr_t</span></code>.\n            </li>\n<li class=\"listitem\">\n              The <a href=\"http://www.multiprecision.org\" target=\"_top\">MPC</a> native type\n              <code class=\"computeroutput\"><span class=\"identifier\">mpc_t</span></code>.\n            </li>\n<li class=\"listitem\">\n              The <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> wrappers\n              around those types: <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">M</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code>,\n              <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpf_float</span><span class=\"special\">&lt;</span><span class=\"identifier\">M</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_int</span><span class=\"special\">&gt;</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_rational</span><span class=\"special\">&gt;</span></code>.\n            </li>\n</ul></div>\n<p>\n          It's also possible to access the underlying <code class=\"computeroutput\"><span class=\"identifier\">mpc_t</span></code>\n          via the <code class=\"computeroutput\"><span class=\"identifier\">data</span><span class=\"special\">()</span></code>\n          member function of <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float_backend</span></code>.\n        </p>\n<p>\n          Things you should know when using this type:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              A default constructed <code class=\"computeroutput\"><span class=\"identifier\">mpc_complex_backend</span></code>\n              is set to zero (<span class=\"emphasis\"><em>Note that this is <span class=\"bold\"><strong>not</strong></span>\n              the default <a href=\"http://www.multiprecision.org\" target=\"_top\">MPC</a>\n              behavior</em></span>).\n            </li>\n<li class=\"listitem\">\n              All operations use round to nearest.\n            </li>\n<li class=\"listitem\">\n              No changes are made to <a href=\"http://www.multiprecision.org\" target=\"_top\">MPC</a>,\n              <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> or <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a>\n              global settings, so this type can coexist with existing <a href=\"http://www.multiprecision.org\" target=\"_top\">MPC</a>,\n              <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a> or <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>\n              code.\n            </li>\n<li class=\"listitem\">\n              The code can equally use <a href=\"http://mpir.org/\" target=\"_top\">MPIR</a>\n              in place of <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> - indeed that\n              is the preferred option on Win32.\n            </li>\n<li class=\"listitem\">\n              This backend supports rvalue-references and is move-aware, making instantiations\n              of <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> on this backend\n              move aware.\n            </li>\n<li class=\"listitem\">\n              Conversion from a string results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code>\n              being thrown if the string can not be interpreted as a valid complex\n              number.\n            </li>\n<li class=\"listitem\">\n              Division by zero results in a complex-infinity.\n            </li>\n<li class=\"listitem\">\n              Unlike <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">complex</span></code>, you can not use <code class=\"computeroutput\"><span class=\"keyword\">reinterpret_cast</span></code> to treat this type\n              as an array of the underlying floating point type.\n            </li>\n<li class=\"listitem\">\n              Unlike <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">complex</span></code>, there are no literals for\n              imaginary values.\n            </li>\n<li class=\"listitem\">\n              When using the variable precision type <code class=\"computeroutput\"><span class=\"identifier\">mpc_complex</span></code>,\n              then copy construction and assignment <span class=\"emphasis\"><em>copies the precision\n              of the source variable</em></span>. Likewise move construction and assignment.\n            </li>\n<li class=\"listitem\">\n              When constructing the variable precision type <code class=\"computeroutput\"><span class=\"identifier\">mpc_complex</span></code>\n              you can specify two arguments to the constructor - the first is the\n              value to assign to the variable, the second is an unsigned integer\n              specifying the precision in decimal places. The <code class=\"computeroutput\"><span class=\"identifier\">assign</span></code>\n              member function similarly has a 2-argument overload taking the value\n              to assign and the precision. You can use this to preserve the precision\n              of the target variable using the somewhat arcane: <code class=\"computeroutput\"><span class=\"identifier\">a</span><span class=\"special\">.</span><span class=\"identifier\">assign</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">())</span></code>, which assigns <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>\n              to <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> but preserves\n              the precision of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>.\n            </li>\n</ul></div>\n<h6>\n<a name=\"boost_multiprecision.tut.complex.mpc_complex.h0\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.complex.mpc_complex.mpc_example\"></a></span><a class=\"link\" href=\"mpc_complex.html#boost_multiprecision.tut.complex.mpc_complex.mpc_example\"> MPC example:</a>\n        </h6>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">complex</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">mpc</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">template</span><span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Complex</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">void</span> <span class=\"identifier\">complex_number_examples</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n    <span class=\"identifier\">Complex</span> <span class=\"identifier\">z1</span><span class=\"special\">{</span><span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"number\">1</span><span class=\"special\">};</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">typename</span> <span class=\"identifier\">Complex</span><span class=\"special\">::</span><span class=\"identifier\">value_type</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">scientific</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">fixed</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Print a complex number: \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">z1</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Square it             : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">z1</span><span class=\"special\">*</span><span class=\"identifier\">z1</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Real part             : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">z1</span><span class=\"special\">.</span><span class=\"identifier\">real</span><span class=\"special\">()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\" = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">real</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Imaginary part        : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">z1</span><span class=\"special\">.</span><span class=\"identifier\">imag</span><span class=\"special\">()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\" = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">imag</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">abs</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Absolute value        : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">abs</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Argument              : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">arg</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Norm                  : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">norm</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Complex conjugate     : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">conj</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Projection onto Riemann sphere: \"</span> <span class=\"special\">&lt;&lt;</span>  <span class=\"identifier\">proj</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">typename</span> <span class=\"identifier\">Complex</span><span class=\"special\">::</span><span class=\"identifier\">value_type</span> <span class=\"identifier\">r</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n    <span class=\"keyword\">typename</span> <span class=\"identifier\">Complex</span><span class=\"special\">::</span><span class=\"identifier\">value_type</span> <span class=\"identifier\">theta</span> <span class=\"special\">=</span> <span class=\"number\">0.8</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">polar</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Polar coordinates (phase = 0)    : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">polar</span><span class=\"special\">(</span><span class=\"identifier\">r</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Polar coordinates (phase !=0)    : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">polar</span><span class=\"special\">(</span><span class=\"identifier\">r</span><span class=\"special\">,</span> <span class=\"identifier\">theta</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"\\nElementary special functions:\\n\"</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">exp</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"exp(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">exp</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">log</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"log(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">log</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">log10</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"log10(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">log10</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">pow</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"pow(z1, z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">pow</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">,</span> <span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">sqrt</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Take its square root  : \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">sqrt</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">sin</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"sin(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">sin</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cos</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"cos(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">cos</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">tan</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"tan(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">tan</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">asin</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"asin(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">asin</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">acos</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"acos(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">acos</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">atan</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"atan(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">atan</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">sinh</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"sinh(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">sinh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cosh</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"cosh(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">cosh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">tanh</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"tanh(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">tanh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">asinh</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"asinh(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">asinh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">acosh</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"acosh(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">acosh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n    <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">atanh</span><span class=\"special\">;</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"atanh(z1) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">atanh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"First, some operations we usually perform with std::complex:\\n\"</span><span class=\"special\">;</span>\n    <span class=\"identifier\">complex_number_examples</span><span class=\"special\">&lt;</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">complex</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;&gt;();</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"\\nNow the same operations performed using the MPC backend:\\n\"</span><span class=\"special\">;</span>\n    <span class=\"identifier\">complex_number_examples</span><span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">mpc_complex_50</span><span class=\"special\">&gt;();</span>\n\n    <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n          Which produces the output (for the multiprecision type):\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">Print</span> <span class=\"identifier\">a</span> <span class=\"identifier\">complex</span> <span class=\"identifier\">number</span><span class=\"special\">:</span> <span class=\"special\">(</span><span class=\"number\">0.00000000000000000000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">1.00000000000000000000000000000000000000000000000000</span><span class=\"special\">)</span>\n<span class=\"identifier\">Square</span> <span class=\"identifier\">it</span>             <span class=\"special\">:</span> <span class=\"special\">-</span><span class=\"number\">1.00000000000000000000000000000000000000000000000000</span>\n<span class=\"identifier\">Real</span> <span class=\"identifier\">part</span>             <span class=\"special\">:</span> <span class=\"number\">0.00000000000000000000000000000000000000000000000000</span> <span class=\"special\">=</span> <span class=\"number\">0.00000000000000000000000000000000000000000000000000</span>\n<span class=\"identifier\">Imaginary</span> <span class=\"identifier\">part</span>        <span class=\"special\">:</span> <span class=\"number\">1.00000000000000000000000000000000000000000000000000</span> <span class=\"special\">=</span> <span class=\"number\">1.00000000000000000000000000000000000000000000000000</span>\n<span class=\"identifier\">Absolute</span> <span class=\"identifier\">value</span>        <span class=\"special\">:</span> <span class=\"number\">1.00000000000000000000000000000000000000000000000000</span>\n<span class=\"identifier\">Argument</span>              <span class=\"special\">:</span> <span class=\"number\">1.57079632679489661923132169163975144209858469968755</span>\n<span class=\"identifier\">Norm</span>                  <span class=\"special\">:</span> <span class=\"number\">1.00000000000000000000000000000000000000000000000000</span>\n<span class=\"identifier\">Complex</span> <span class=\"identifier\">conjugate</span>     <span class=\"special\">:</span> <span class=\"special\">(</span><span class=\"number\">0.00000000000000000000000000000000000000000000000000</span><span class=\"special\">,-</span><span class=\"number\">1.00000000000000000000000000000000000000000000000000</span><span class=\"special\">)</span>\n<span class=\"identifier\">Projection</span> <span class=\"identifier\">onto</span> <span class=\"identifier\">Riemann</span> <span class=\"identifier\">sphere</span><span class=\"special\">:</span> <span class=\"special\">(</span><span class=\"number\">0.00000000000000000000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">1.00000000000000000000000000000000000000000000000000</span><span class=\"special\">)</span>\n<span class=\"identifier\">Polar</span> <span class=\"identifier\">coordinates</span> <span class=\"special\">(</span><span class=\"identifier\">phase</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">)</span>    <span class=\"special\">:</span> <span class=\"number\">1.00000000000000000000000000000000000000000000000000</span>\n<span class=\"identifier\">Polar</span> <span class=\"identifier\">coordinates</span> <span class=\"special\">(</span><span class=\"identifier\">phase</span> <span class=\"special\">!=</span><span class=\"number\">0</span><span class=\"special\">)</span>    <span class=\"special\">:</span> <span class=\"special\">(</span><span class=\"number\">0.69670670934716538906374002277244853473117519431538</span><span class=\"special\">,</span><span class=\"number\">0.71735609089952279256716781570337728075604730751255</span><span class=\"special\">)</span>\n\n<span class=\"identifier\">Elementary</span> <span class=\"identifier\">special</span> <span class=\"identifier\">functions</span><span class=\"special\">:</span>\n<span class=\"identifier\">exp</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.54030230586813971740093660744297660373231042061792</span><span class=\"special\">,</span><span class=\"number\">0.84147098480789650665250232163029899962256306079837</span><span class=\"special\">)</span>\n<span class=\"identifier\">log</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.00000000000000000000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">1.57079632679489661923132169163975144209858469968755</span><span class=\"special\">)</span>\n<span class=\"identifier\">log10</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.00000000000000000000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">0.68218817692092067374289181271567788510506374186196</span><span class=\"special\">)</span>\n<span class=\"identifier\">pow</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">,</span> <span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"number\">0.20787957635076190854695561983497877003387784163177</span>\n<span class=\"identifier\">Take</span> <span class=\"identifier\">its</span> <span class=\"identifier\">square</span> <span class=\"identifier\">root</span>  <span class=\"special\">:</span> <span class=\"special\">(</span><span class=\"number\">0.70710678118654752440084436210484903928483593768847</span><span class=\"special\">,</span><span class=\"number\">0.70710678118654752440084436210484903928483593768847</span><span class=\"special\">)</span>\n<span class=\"identifier\">sin</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.00000000000000000000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">1.17520119364380145688238185059560081515571798133410</span><span class=\"special\">)</span>\n<span class=\"identifier\">cos</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"number\">1.54308063481524377847790562075706168260152911236587</span>\n<span class=\"identifier\">tan</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.00000000000000000000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">0.76159415595576488811945828260479359041276859725794</span><span class=\"special\">)</span>\n<span class=\"identifier\">asin</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.00000000000000000000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">0.88137358701954302523260932497979230902816032826163</span><span class=\"special\">)</span>\n<span class=\"identifier\">acos</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">1.57079632679489661923132169163975144209858469968755</span><span class=\"special\">,-</span><span class=\"number\">0.88137358701954302523260932497979230902816032826163</span><span class=\"special\">)</span>\n<span class=\"identifier\">atan</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.00000000000000000000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"identifier\">inf</span><span class=\"special\">)</span>\n<span class=\"identifier\">sinh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.00000000000000000000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">0.84147098480789650665250232163029899962256306079837</span><span class=\"special\">)</span>\n<span class=\"identifier\">cosh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"number\">0.54030230586813971740093660744297660373231042061792</span>\n<span class=\"identifier\">tanh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.00000000000000000000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">1.55740772465490223050697480745836017308725077238152</span><span class=\"special\">)</span>\n<span class=\"identifier\">asinh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.00000000000000000000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">1.57079632679489661923132169163975144209858469968755</span><span class=\"special\">)</span>\n<span class=\"identifier\">acosh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.88137358701954302523260932497979230902816032826163</span><span class=\"special\">,</span><span class=\"number\">1.57079632679489661923132169163975144209858469968755</span><span class=\"special\">)</span>\n<span class=\"identifier\">atanh</span><span class=\"special\">(</span><span class=\"identifier\">z1</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"number\">0.00000000000000000000000000000000000000000000000000</span><span class=\"special\">,</span><span class=\"number\">0.78539816339744830961566084581987572104929234984378</span><span class=\"special\">)</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"cpp_complex.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../complex.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"complex128.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/complex.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Complex Number Types</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"interval/mpfi.html\" title=\"mpfi_float\">\n<link rel=\"next\" href=\"complex/cpp_complex.html\" title=\"cpp_complex\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"interval/mpfi.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"complex/cpp_complex.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.complex\"></a><a class=\"link\" href=\"complex.html\" title=\"Complex Number Types\">Complex Number Types</a>\n</h3></div></div></div>\n<div class=\"toc\"><dl class=\"toc\">\n<dt><span class=\"section\"><a href=\"complex/cpp_complex.html\">cpp_complex</a></span></dt>\n<dt><span class=\"section\"><a href=\"complex/mpc_complex.html\">mpc_complex</a></span></dt>\n<dt><span class=\"section\"><a href=\"complex/complex128.html\">complex128</a></span></dt>\n<dt><span class=\"section\"><a href=\"complex/complex_adaptor.html\">complex_adaptor</a></span></dt>\n</dl></div>\n<p>\n        The following backends provide complex number arithmetic:\n      </p>\n<div class=\"informaltable\"><table class=\"table\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend Type\n                </p>\n              </th>\n<th>\n                <p>\n                  Header\n                </p>\n              </th>\n<th>\n                <p>\n                  Radix\n                </p>\n              </th>\n<th>\n                <p>\n                  Dependencies\n                </p>\n              </th>\n<th>\n                <p>\n                  Pros\n                </p>\n              </th>\n<th>\n                <p>\n                  Cons\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">cpp_complex</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  boost/multiprecision/cpp_complex.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  2\n                </p>\n              </td>\n<td>\n                <p>\n                  None\n                </p>\n              </td>\n<td>\n                <p>\n                  An all C++ Boost-licensed implementation.\n                </p>\n              </td>\n<td>\n                <p>\n                  Slower than <a href=\"http://www.multiprecision.org\" target=\"_top\">MPC</a>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">mpc</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  boost/multiprecision/mpc.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  2\n                </p>\n              </td>\n<td>\n                <p>\n                  <a href=\"http://www.multiprecision.org\" target=\"_top\">MPC</a>\n                </p>\n              </td>\n<td>\n                <p>\n                  Very fast and efficient back-end.\n                </p>\n              </td>\n<td>\n                <p>\n                  Dependency on LGLP-licensed [MPC] library.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">complex128</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  boost/multiprecision/complex128.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  2\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">__float128</span></code> and\n                  libquadmath\n                </p>\n              </td>\n<td>\n                <p>\n                  Very fast and efficient number type.\n                </p>\n              </td>\n<td>\n                <p>\n                  128-bit precision only, and restricted to GCC.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">complex_adaptor</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  boost/multiprecision/complex_adaptor.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  -\n                </p>\n              </td>\n<td>\n                <p>\n                  none\n                </p>\n              </td>\n<td>\n                <p>\n                  Can convert any backend type into a complex number backend.\n                </p>\n              </td>\n<td>\n                <p>\n                  Not a number in its own right, and hard to use as a result.\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"interval/mpfi.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"complex/cpp_complex.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/conversions.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Constructing and Interconverting Between Number Types</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"misc/visualizers.html\" title=\"Visual C++ Debugger Visualizers\">\n<link rel=\"next\" href=\"random.html\" title=\"Generating Random Numbers\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"misc/visualizers.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"random.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.conversions\"></a><a class=\"link\" href=\"conversions.html\" title=\"Constructing and Interconverting Between Number Types\">Constructing and\n      Interconverting Between Number Types</a>\n</h3></div></div></div>\n<p>\n        All of the number types that are based on <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n        have certain conversion rules in common. In particular:\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n<p class=\"simpara\">\n            Any number type can be constructed (or assigned) from any <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n            (built-in)</a> arithmetic type, as long as the conversion isn't lossy\n            (for example float to int conversion):\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">cpp_dec_float_50</span> <span class=\"identifier\">df</span><span class=\"special\">(</span><span class=\"number\">0.5</span><span class=\"special\">);</span>   <span class=\"comment\">// OK construction from double</span>\n<span class=\"identifier\">cpp_int</span>          <span class=\"identifier\">i</span><span class=\"special\">(</span><span class=\"number\">450</span><span class=\"special\">);</span>    <span class=\"comment\">// OK constructs from signed int</span>\n<span class=\"identifier\">cpp_int</span>          <span class=\"identifier\">j</span> <span class=\"special\">=</span> <span class=\"number\">3.14</span><span class=\"special\">;</span>  <span class=\"comment\">// Error, lossy conversion.</span>\n</pre>\n</li>\n<li class=\"listitem\">\n<p class=\"simpara\">\n            A number can be explicitly constructed from an arithmetic type, even\n            when the conversion is lossy:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">cpp_int</span>          <span class=\"identifier\">i</span><span class=\"special\">(</span><span class=\"number\">3.14</span><span class=\"special\">);</span>       <span class=\"comment\">// OK explicit conversion</span>\n<span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"keyword\">static_cast</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int</span><span class=\"special\">&gt;(</span><span class=\"number\">3.14</span><span class=\"special\">)</span>  <span class=\"comment\">// OK explicit conversion</span>\n<span class=\"identifier\">i</span><span class=\"special\">.</span><span class=\"identifier\">assign</span><span class=\"special\">(</span><span class=\"number\">3.14</span><span class=\"special\">);</span>                 <span class=\"comment\">// OK, explicit assign and avoid a temporary from the cast above</span>\n<span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">3.14</span><span class=\"special\">;</span>                       <span class=\"comment\">// Error, no implicit assignment operator for lossy conversion.</span>\n<span class=\"identifier\">cpp_int</span>          <span class=\"identifier\">j</span> <span class=\"special\">=</span> <span class=\"number\">3.14</span><span class=\"special\">;</span>      <span class=\"comment\">// Error, no implicit constructor for lossy conversion.</span>\n</pre>\n</li>\n<li class=\"listitem\">\n<p class=\"simpara\">\n            A <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> can be converted\n            to any <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n            (built-in)</a> type, via the <code class=\"computeroutput\"><span class=\"identifier\">convert_to</span></code>\n            member function:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">mpz_int</span> <span class=\"identifier\">z</span><span class=\"special\">(</span><span class=\"number\">2</span><span class=\"special\">);</span>\n<span class=\"keyword\">int</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"identifier\">z</span><span class=\"special\">.</span><span class=\"identifier\">convert_to</span><span class=\"special\">&lt;</span><span class=\"keyword\">int</span><span class=\"special\">&gt;();</span> <span class=\"comment\">// sets i to 2</span>\n</pre>\n</li>\n<li class=\"listitem\">\n            Conversions to rational numbers from floating-point ones are always allowed,\n            and are exact and implicit as long as the rational number uses an unbounded\n            integer type. Please be aware that constructing a rational number from\n            an extended precision floating-point type with a large exponent range\n            can effectively run the system out of memory, as in the extreme case\n            <span class=\"emphasis\"><em>2<sup>max_exponent</sup> / CHAR_BITS</em></span> bytes of storage may be\n            required. This does not represent a problem for <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n            (built-in)</a> floating-point types however, as the exponent range\n            for these is rather limited.\n          </li>\n<li class=\"listitem\">\n            Conversions to floating-point numbers from rational ones are rounded\n            to nearest (less than 0.5 <a href=\"http://en.wikipedia.org/wiki/Unit_in_the_last_place\" target=\"_top\">Unit\n            in the last place (ULP)</a> error) as long as the floating-point\n            number is binary, and the integer type used by the rational number is\n            unbounded.\n          </li>\n</ul></div>\n<p>\n        Additional conversions may be supported by particular backends.\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n<p class=\"simpara\">\n            A <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> can be converted\n            to any <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n            (built-in)</a> type, via an explicit conversion operator: this functionality\n            is only available on compilers supporting C++11's explicit conversion\n            syntax.\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">mpz_int</span> <span class=\"identifier\">z</span><span class=\"special\">(</span><span class=\"number\">2</span><span class=\"special\">);</span>\n<span class=\"keyword\">int</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"identifier\">z</span><span class=\"special\">;</span>                     <span class=\"comment\">// Error, implicit conversion not allowed.</span>\n<span class=\"keyword\">int</span> <span class=\"identifier\">j</span> <span class=\"special\">=</span> <span class=\"keyword\">static_cast</span><span class=\"special\">&lt;</span><span class=\"keyword\">int</span><span class=\"special\">&gt;(</span><span class=\"identifier\">z</span><span class=\"special\">);</span>   <span class=\"comment\">// OK explicit conversion.</span>\n</pre>\n</li>\n<li class=\"listitem\">\n<p class=\"simpara\">\n            Any number type can be <span class=\"emphasis\"><em>explicitly</em></span> constructed (or\n            assigned) from a <code class=\"computeroutput\"><span class=\"keyword\">const</span> <span class=\"keyword\">char</span><span class=\"special\">*</span></code>\n            or a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">string</span></code>:\n          </p>\n<pre class=\"programlisting\"><span class=\"comment\">// pi to 50 places from a string:</span>\n<span class=\"identifier\">cpp_dec_float_50</span> <span class=\"identifier\">df</span><span class=\"special\">(</span><span class=\"string\">\"3.14159265358979323846264338327950288419716939937510\"</span><span class=\"special\">);</span>\n<span class=\"comment\">// Integer type will automatically detect \"0x\" and \"0\" prefixes and parse the string accordingly:</span>\n<span class=\"identifier\">cpp_int</span>          <span class=\"identifier\">i</span><span class=\"special\">(</span><span class=\"string\">\"0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000\"</span><span class=\"special\">);</span>\n<span class=\"comment\">// Invalid input always results in a std::runtime_error being thrown:</span>\n<span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"keyword\">static_cast</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int</span><span class=\"special\">&gt;(</span><span class=\"string\">\"3.14\"</span><span class=\"special\">);</span>\n<span class=\"comment\">// implicit conversions from strings are not allowed:</span>\n<span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"string\">\"23\"</span><span class=\"special\">;</span> <span class=\"comment\">// Error, no assignment operator for implicit conversion from string</span>\n<span class=\"comment\">// assign member function, avoids having to create a temporary via a static_cast:</span>\n<span class=\"identifier\">i</span><span class=\"special\">.</span><span class=\"identifier\">assign</span><span class=\"special\">(</span><span class=\"string\">\"23\"</span><span class=\"special\">);</span>  <span class=\"comment\">// OK</span>\n</pre>\n</li>\n<li class=\"listitem\">\n<p class=\"simpara\">\n            Any number type will interoperate with the <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n            (built-in)</a> types in arithmetic expressions as long as the conversions\n            are not lossy:\n          </p>\n<pre class=\"programlisting\"><span class=\"comment\">// pi to 50 places from a string:</span>\n<span class=\"identifier\">cpp_dec_float_50</span> <span class=\"identifier\">df</span> <span class=\"special\">=</span> <span class=\"string\">\"3.14159265358979323846264338327950288419716939937510\"</span><span class=\"special\">;</span>\n<span class=\"comment\">// Multiply by 2 - using an integer literal here is usually more efficient</span>\n<span class=\"comment\">// than constructing a temporary:</span>\n<span class=\"identifier\">df</span> <span class=\"special\">*=</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n\n<span class=\"comment\">// You can't mix integer types with floats though:</span>\n<span class=\"identifier\">cpp_int</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n<span class=\"identifier\">i</span> <span class=\"special\">*=</span> <span class=\"number\">3.14</span><span class=\"special\">;</span>  <span class=\"comment\">// Error, no *= operator will be found.</span>\n</pre>\n</li>\n<li class=\"listitem\">\n<p class=\"simpara\">\n            Any number type can be streamed to and from the C++ iostreams:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">cpp_dec_float_50</span> <span class=\"identifier\">df</span> <span class=\"special\">=</span> <span class=\"string\">\"3.14159265358979323846264338327950288419716939937510\"</span><span class=\"special\">;</span>\n<span class=\"comment\">// Now print at full precision:</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_digits10</span><span class=\"special\">)</span>\n   <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">df</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span>\n<span class=\"identifier\">cpp_int</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n<span class=\"identifier\">i</span> <span class=\"special\">&lt;&lt;=</span> <span class=\"number\">256</span><span class=\"special\">;</span>\n<span class=\"comment\">// Now print in hex format with prefix:</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">hex</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">showbase</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n</pre>\n</li>\n<li class=\"listitem\">\n<p class=\"simpara\">\n            Interconversions between number types of the same family are allowed\n            and are implicit conversions if no loss of precision is involved, and\n            explicit if it is:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">int128_t</span>     <span class=\"identifier\">i128</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"identifier\">int266_t</span>     <span class=\"identifier\">i256</span> <span class=\"special\">=</span> <span class=\"identifier\">i128</span><span class=\"special\">;</span>  <span class=\"comment\">// OK implicit widening conversion</span>\n<span class=\"identifier\">i128_t</span>            <span class=\"special\">=</span> <span class=\"identifier\">i256</span><span class=\"special\">;</span>  <span class=\"comment\">// Error, no assignment operator found, narrowing conversion is explicit.</span>\n<span class=\"identifier\">i128_t</span>            <span class=\"special\">=</span> <span class=\"keyword\">static_cast</span><span class=\"special\">&lt;</span><span class=\"identifier\">int128_t</span><span class=\"special\">&gt;(</span><span class=\"identifier\">i256</span><span class=\"special\">);</span> <span class=\"comment\">// OK, explicit narrowing conversion.</span>\n\n<span class=\"identifier\">mpz_int</span>      <span class=\"identifier\">z</span>    <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"identifier\">mpf_float</span>    <span class=\"identifier\">f</span>    <span class=\"special\">=</span> <span class=\"identifier\">z</span><span class=\"special\">;</span>    <span class=\"comment\">// OK, GMP handles this conversion natively, and it's not lossy and therefore implicit.</span>\n\n<span class=\"identifier\">mpf_float_50</span> <span class=\"identifier\">f50</span>  <span class=\"special\">=</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n<span class=\"identifier\">f</span>                 <span class=\"special\">=</span> <span class=\"identifier\">f50</span><span class=\"special\">;</span>  <span class=\"comment\">// OK, conversion from fixed to variable precision, f will have 50 digits precision.</span>\n<span class=\"identifier\">f50</span>               <span class=\"special\">=</span> <span class=\"identifier\">f</span><span class=\"special\">;</span>    <span class=\"comment\">// Error, conversion from variable to fixed precision is potentially lossy, explicit cast required.</span>\n</pre>\n</li>\n<li class=\"listitem\">\n<p class=\"simpara\">\n            Some interconversions between number types are completely generic, and\n            are always available, albeit the conversions are always <span class=\"emphasis\"><em>explicit</em></span>:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">cpp_int</span> <span class=\"identifier\">cppi</span><span class=\"special\">(</span><span class=\"number\">2</span><span class=\"special\">);</span>\n<span class=\"comment\">// We can always convert between numbers of the same category -</span>\n<span class=\"comment\">// int to int, rational to rational, or float to float, so this is OK</span>\n<span class=\"comment\">// as long as we use an explicit conversion:</span>\n<span class=\"identifier\">mpz_int</span> <span class=\"identifier\">z</span><span class=\"special\">(</span><span class=\"identifier\">cppi</span><span class=\"special\">);</span>\n<span class=\"comment\">// We can always promote from int to rational, int to float, or rational to float:</span>\n<span class=\"identifier\">cpp_rational</span>     <span class=\"identifier\">cppr</span><span class=\"special\">(</span><span class=\"identifier\">cppi</span><span class=\"special\">);</span>  <span class=\"comment\">// OK, int to rational</span>\n<span class=\"identifier\">cpp_dec_float_50</span> <span class=\"identifier\">df</span><span class=\"special\">(</span><span class=\"identifier\">cppi</span><span class=\"special\">);</span>    <span class=\"comment\">// OK, int to float</span>\n<span class=\"identifier\">df</span>                  <span class=\"special\">=</span> <span class=\"keyword\">static_cast</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">&gt;(</span><span class=\"identifier\">cppr</span><span class=\"special\">);</span>  <span class=\"comment\">// OK, explicit rational to float conversion</span>\n<span class=\"comment\">// However narrowing and/or implicit conversions always fail:</span>\n<span class=\"identifier\">cppi</span>                <span class=\"special\">=</span>   <span class=\"identifier\">df</span><span class=\"special\">;</span>    <span class=\"comment\">// Compiler error, conversion not allowed</span>\n</pre>\n</li>\n<li class=\"listitem\">\n<p class=\"simpara\">\n            Other interconversions may be allowed as special cases, whenever the\n            backend allows it:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">mpf_t</span>     <span class=\"identifier\">m</span><span class=\"special\">;</span>           <span class=\"comment\">// Native GMP type.</span>\n<span class=\"identifier\">mpf_init_set_ui</span><span class=\"special\">(</span><span class=\"identifier\">m</span><span class=\"special\">,</span> <span class=\"number\">0</span><span class=\"special\">);</span> <span class=\"comment\">// set to a value;</span>\n<span class=\"identifier\">mpf_float</span> <span class=\"identifier\">i</span><span class=\"special\">(</span><span class=\"identifier\">m</span><span class=\"special\">);</span>        <span class=\"comment\">// copies the value of the native type.</span>\n</pre>\n</li>\n</ul></div>\n<p>\n        More information on what additional types a backend supports conversions\n        from are given in the tutorial for each backend. The converting constructor\n        will be implicit if the backend's converting constructor is also implicit,\n        and explicit if the backends converting constructor is also explicit.\n      </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"misc/visualizers.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"random.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/eigen.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Eigen Interoperability</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"hash.html\" title=\"Hash Function Support\">\n<link rel=\"next\" href=\"new_backend.html\" title=\"Writing a New Backend\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"hash.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"new_backend.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.eigen\"></a><a class=\"link\" href=\"eigen.html\" title=\"Eigen Interoperability\">Eigen Interoperability</a>\n</h3></div></div></div>\n<p>\n        This library provides the header:\n      </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">eigen</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n</pre>\n<p>\n        which defines the traits classes and functions that the Eigen library needs\n        all user-defined number types to provide.\n      </p>\n<p>\n        For example the following code performs quad-precision matrix solving on\n        complex numbers:\n      </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_complex</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">eigen</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">Eigen</span><span class=\"special\">/</span><span class=\"identifier\">Dense</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">Eigen</span><span class=\"special\">;</span>\n   <span class=\"keyword\">typedef</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_complex_quad</span> <span class=\"identifier\">complex_type</span><span class=\"special\">;</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// We want to solve Ax = b for x,</span>\n   <span class=\"comment\">// define A and b first:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">Matrix</span><span class=\"special\">&lt;</span><span class=\"identifier\">complex_type</span><span class=\"special\">,</span> <span class=\"number\">2</span><span class=\"special\">,</span> <span class=\"number\">2</span><span class=\"special\">&gt;</span> <span class=\"identifier\">A</span><span class=\"special\">,</span> <span class=\"identifier\">b</span><span class=\"special\">;</span>\n   <span class=\"identifier\">A</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">complex_type</span><span class=\"special\">(</span><span class=\"number\">2</span><span class=\"special\">,</span> <span class=\"number\">3</span><span class=\"special\">),</span> <span class=\"identifier\">complex_type</span><span class=\"special\">(-</span><span class=\"number\">1</span><span class=\"special\">,</span> <span class=\"special\">-</span><span class=\"number\">2</span><span class=\"special\">),</span> <span class=\"identifier\">complex_type</span><span class=\"special\">(-</span><span class=\"number\">1</span><span class=\"special\">,</span> <span class=\"special\">-</span><span class=\"number\">4</span><span class=\"special\">),</span> <span class=\"identifier\">complex_type</span><span class=\"special\">(</span><span class=\"number\">3</span><span class=\"special\">,</span> <span class=\"number\">6</span><span class=\"special\">);</span>\n   <span class=\"identifier\">b</span> <span class=\"special\">&lt;&lt;</span> <span class=\"number\">1</span><span class=\"special\">,</span> <span class=\"number\">2</span><span class=\"special\">,</span> <span class=\"number\">3</span><span class=\"special\">,</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Here is the matrix A:\\n\"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">A</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Here is the right hand side b:\\n\"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">b</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Solve for x:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">Matrix</span><span class=\"special\">&lt;</span><span class=\"identifier\">complex_type</span><span class=\"special\">,</span> <span class=\"number\">2</span><span class=\"special\">,</span> <span class=\"number\">2</span><span class=\"special\">&gt;</span> <span class=\"identifier\">x</span> <span class=\"special\">=</span> <span class=\"identifier\">A</span><span class=\"special\">.</span><span class=\"identifier\">fullPivHouseholderQr</span><span class=\"special\">().</span><span class=\"identifier\">solve</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">);</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"The solution is:\\n\"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">x</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Compute the error in the solution by using the norms of Ax - b and b:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">complex_type</span><span class=\"special\">::</span><span class=\"identifier\">value_type</span> <span class=\"identifier\">relative_error</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"identifier\">A</span><span class=\"special\">*</span><span class=\"identifier\">x</span> <span class=\"special\">-</span> <span class=\"identifier\">b</span><span class=\"special\">).</span><span class=\"identifier\">norm</span><span class=\"special\">()</span> <span class=\"special\">/</span> <span class=\"identifier\">b</span><span class=\"special\">.</span><span class=\"identifier\">norm</span><span class=\"special\">();</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"The relative error is: \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">relative_error</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n        Which produces the following output:\n      </p>\n<pre class=\"programlisting\"><span class=\"identifier\">Here</span> <span class=\"identifier\">is</span> <span class=\"identifier\">the</span> <span class=\"identifier\">matrix</span> <span class=\"identifier\">A</span><span class=\"special\">:</span>\n<span class=\"special\">(</span><span class=\"number\">2</span><span class=\"special\">,</span><span class=\"number\">3</span><span class=\"special\">)</span> <span class=\"special\">(-</span><span class=\"number\">1</span><span class=\"special\">,-</span><span class=\"number\">2</span><span class=\"special\">)</span>\n<span class=\"special\">(-</span><span class=\"number\">1</span><span class=\"special\">,-</span><span class=\"number\">4</span><span class=\"special\">)</span>   <span class=\"special\">(</span><span class=\"number\">3</span><span class=\"special\">,</span><span class=\"number\">6</span><span class=\"special\">)</span>\n<span class=\"identifier\">Here</span> <span class=\"identifier\">is</span> <span class=\"identifier\">the</span> <span class=\"identifier\">right</span> <span class=\"identifier\">hand</span> <span class=\"identifier\">side</span> <span class=\"identifier\">b</span><span class=\"special\">:</span>\n<span class=\"number\">1</span> <span class=\"number\">2</span>\n<span class=\"number\">3</span> <span class=\"number\">1</span>\n<span class=\"identifier\">The</span> <span class=\"identifier\">solution</span> <span class=\"identifier\">is</span><span class=\"special\">:</span>\n<span class=\"special\">(</span><span class=\"number\">0.6</span><span class=\"special\">,-</span><span class=\"number\">0.6</span><span class=\"special\">)</span>   <span class=\"special\">(</span><span class=\"number\">0.7</span><span class=\"special\">,-</span><span class=\"number\">0.7</span><span class=\"special\">)</span>\n<span class=\"special\">(</span><span class=\"number\">0.64</span><span class=\"special\">,-</span><span class=\"number\">0.68</span><span class=\"special\">)</span> <span class=\"special\">(</span><span class=\"number\">0.58</span><span class=\"special\">,-</span><span class=\"number\">0.46</span><span class=\"special\">)</span>\n<span class=\"identifier\">The</span> <span class=\"identifier\">relative</span> <span class=\"identifier\">error</span> <span class=\"identifier\">is</span><span class=\"special\">:</span> <span class=\"number\">2.63132e-34</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"hash.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"new_backend.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/floats/cpp_bin_float.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>cpp_bin_float</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../floats.html\" title=\"Floating-point Types\">\n<link rel=\"prev\" href=\"../floats.html\" title=\"Floating-point Types\">\n<link rel=\"next\" href=\"cpp_dec_float.html\" title=\"cpp_dec_float\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../floats.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../floats.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"cpp_dec_float.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.floats.cpp_bin_float\"></a><a class=\"link\" href=\"cpp_bin_float.html\" title=\"cpp_bin_float\">cpp_bin_float</a>\n</h4></div></div></div>\n<p>\n          <code class=\"computeroutput\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">enum</span> <span class=\"identifier\">digit_base_type</span>\n<span class=\"special\">{</span>\n   <span class=\"identifier\">digit_base_2</span> <span class=\"special\">=</span> <span class=\"number\">2</span><span class=\"special\">,</span>\n   <span class=\"identifier\">digit_base_10</span> <span class=\"special\">=</span> <span class=\"number\">10</span>\n<span class=\"special\">};</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits</span><span class=\"special\">,</span> <span class=\"identifier\">digit_base_type</span> <span class=\"identifier\">base</span> <span class=\"special\">=</span> <span class=\"identifier\">digit_base_10</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Allocator</span> <span class=\"special\">=</span> <span class=\"keyword\">void</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Exponent</span> <span class=\"special\">=</span> <span class=\"keyword\">int</span><span class=\"special\">,</span> <span class=\"identifier\">ExponentMin</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"identifier\">ExponentMax</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">cpp_bin_float</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"number\">100</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">cpp_bin_float_100</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"number\">24</span><span class=\"special\">,</span> <span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">digit_base_2</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">int16_t</span><span class=\"special\">,</span> <span class=\"special\">-</span><span class=\"number\">126</span><span class=\"special\">,</span> <span class=\"number\">127</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span>         <span class=\"identifier\">cpp_bin_float_single</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"number\">53</span><span class=\"special\">,</span> <span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">digit_base_2</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">int16_t</span><span class=\"special\">,</span> <span class=\"special\">-</span><span class=\"number\">1022</span><span class=\"special\">,</span> <span class=\"number\">1023</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span>       <span class=\"identifier\">cpp_bin_float_double</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"number\">64</span><span class=\"special\">,</span> <span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">digit_base_2</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">int16_t</span><span class=\"special\">,</span> <span class=\"special\">-</span><span class=\"number\">16382</span><span class=\"special\">,</span> <span class=\"number\">16383</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span>     <span class=\"identifier\">cpp_bin_float_double_extended</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"number\">113</span><span class=\"special\">,</span> <span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">digit_base_2</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">int16_t</span><span class=\"special\">,</span> <span class=\"special\">-</span><span class=\"number\">16382</span><span class=\"special\">,</span> <span class=\"number\">16383</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span>    <span class=\"identifier\">cpp_bin_float_quad</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"number\">237</span><span class=\"special\">,</span> <span class=\"identifier\">backends</span><span class=\"special\">::</span><span class=\"identifier\">digit_base_2</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">int32_t</span><span class=\"special\">,</span> <span class=\"special\">-</span><span class=\"number\">262142</span><span class=\"special\">,</span> <span class=\"number\">262143</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span>  <span class=\"identifier\">cpp_bin_float_oct</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n          The <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span></code> back-end\n          is used in conjunction with <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>:\n          It acts as an entirely C++ (header only and dependency free) floating-point\n          number type that is a drop-in replacement for the native C++ floating-point\n          types, but with much greater precision.\n        </p>\n<p>\n          Type <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span></code> can\n          be used at fixed precision by specifying a non-zero <code class=\"computeroutput\"><span class=\"identifier\">Digits</span></code>\n          template parameter. The typedefs <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float_50</span></code>\n          and <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float_100</span></code> provide\n          arithmetic types at 50 and 100 decimal digits precision respectively.\n        </p>\n<p>\n          Optionally, you can specify whether the precision is specified in decimal\n          digits or binary bits - for example to declare a <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span></code>\n          with exactly the same precision as <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>\n          one would use <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"number\">53</span><span class=\"special\">,</span> <span class=\"identifier\">digit_base_2</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code>.\n          The typedefs <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float_single</span></code>,\n          <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float_double</span></code>,\n          <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float_quad</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float_oct</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float_double_extended</span></code>\n          provide software analogues of the IEEE single, double, quad and octuple\n          float data types, plus the Intel-extended-double type respectively. Note\n          that while these types are functionally equivalent to the native IEEE types,\n          but they do not have the same size or bit-layout as true IEEE compatible\n          types.\n        </p>\n<p>\n          Normally <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span></code>\n          allocates no memory: all of the space required for its digits are allocated\n          directly within the class. As a result care should be taken not to use\n          the class with too high a digit count as stack space requirements can grow\n          out of control. If that represents a problem then providing an allocator\n          as a template parameter causes <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span></code>\n          to dynamically allocate the memory it needs: this significantly reduces\n          the size of <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span></code>\n          and increases the viable upper limit on the number of digits at the expense\n          of performance. However, please bear in mind that arithmetic operations\n          rapidly become <span class=\"emphasis\"><em>very</em></span> expensive as the digit count grows:\n          the current implementation really isn't optimized or designed for large\n          digit counts. Note that since the actual type of the objects allocated\n          is completely opaque, the suggestion would be to use an allocator with\n          <code class=\"computeroutput\"><span class=\"keyword\">void</span></code> <code class=\"computeroutput\"><span class=\"identifier\">value_type</span></code>,\n          for example: <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"number\">1000</span><span class=\"special\">,</span> <span class=\"identifier\">digit_base_10</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">allocator</span><span class=\"special\">&lt;</span><span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code>.\n        </p>\n<p>\n          The final template parameters determine the type and range of the exponent:\n          parameter <code class=\"computeroutput\"><span class=\"identifier\">Exponent</span></code> can\n          be any signed integer type, but note that <code class=\"computeroutput\"><span class=\"identifier\">MinExponent</span></code>\n          and <code class=\"computeroutput\"><span class=\"identifier\">MaxExponent</span></code> can not\n          go right up to the limits of the <code class=\"computeroutput\"><span class=\"identifier\">Exponent</span></code>\n          type as there has to be a little extra headroom for internal calculations.\n          You will get a compile time error if this is the case. In addition if MinExponent\n          or MaxExponent are zero, then the library will choose suitable values that\n          are as large as possible given the constraints of the type and need for\n          extra headroom for internal calculations.\n        </p>\n<p>\n          There is full standard library and <code class=\"computeroutput\"><span class=\"identifier\">numeric_limits</span></code>\n          support available for this type.\n        </p>\n<p>\n          Things you should know when using this type:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              Default constructed <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span></code>s\n              have a value of zero.\n            </li>\n<li class=\"listitem\">\n              The radix of this type is 2, even when the precision is specified as\n              decimal digits.\n            </li>\n<li class=\"listitem\">\n              The type supports both infinities and NaNs. An infinity is generated\n              whenever the result would overflow, and a NaN is generated for any\n              mathematically undefined operation.\n            </li>\n<li class=\"listitem\">\n              There is a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code> specialisation for\n              this type.\n            </li>\n<li class=\"listitem\">\n              Any <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> instantiated\n              on this type, is convertible to any other <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n              instantiated on this type - for example you can convert from <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code> to <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"identifier\">SomeOtherValue</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code>.\n              Narrowing conversions round to nearest and are <code class=\"computeroutput\"><span class=\"keyword\">explicit</span></code>.\n            </li>\n<li class=\"listitem\">\n              Conversion from a string results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code>\n              being thrown if the string can not be interpreted as a valid floating-point\n              number.\n            </li>\n<li class=\"listitem\">\n              All arithmetic operations are correctly rounded to nearest. String\n              conversions and the <code class=\"computeroutput\"><span class=\"identifier\">sqrt</span></code>\n              function are also correctly rounded, but transcendental functions (sin,\n              cos, pow, exp etc) are not.\n            </li>\n</ul></div>\n<h6>\n<a name=\"boost_multiprecision.tut.floats.cpp_bin_float.h0\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.floats.cpp_bin_float.cpp_bin_float_example\"></a></span><a class=\"link\" href=\"cpp_bin_float.html#boost_multiprecision.tut.floats.cpp_bin_float.cpp_bin_float_example\">cpp_bin_float\n          example:</a>\n        </h6>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">math</span><span class=\"special\">/</span><span class=\"identifier\">special_functions</span><span class=\"special\">/</span><span class=\"identifier\">gamma</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// Operations at fixed precision and full numeric_limits support:</span>\n   <span class=\"identifier\">cpp_bin_float_100</span> <span class=\"identifier\">b</span> <span class=\"special\">=</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float_100</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float_100</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// We can use any C++ std lib function, lets print all the digits as well:</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float_100</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_digits10</span><span class=\"special\">)</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">log</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// print log(2)</span>\n\n   <span class=\"comment\">// We can also use any function from Boost.Math:</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tgamma</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"comment\">// These even work when the argument is an expression template:</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tgamma</span><span class=\"special\">(</span><span class=\"identifier\">b</span> <span class=\"special\">*</span> <span class=\"identifier\">b</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// And since we have an extended exponent range we can generate some really large</span>\n   <span class=\"comment\">// numbers here (4.0238726007709377354370243e+2564):</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tgamma</span><span class=\"special\">(</span><span class=\"identifier\">cpp_bin_float_100</span><span class=\"special\">(</span><span class=\"number\">1000</span><span class=\"special\">))</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../floats.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../floats.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"cpp_dec_float.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/floats/cpp_dec_float.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>cpp_dec_float</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../floats.html\" title=\"Floating-point Types\">\n<link rel=\"prev\" href=\"cpp_bin_float.html\" title=\"cpp_bin_float\">\n<link rel=\"next\" href=\"gmp_float.html\" title=\"gmp_float\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"cpp_bin_float.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../floats.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"gmp_float.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.floats.cpp_dec_float\"></a><a class=\"link\" href=\"cpp_dec_float.html\" title=\"cpp_dec_float\">cpp_dec_float</a>\n</h4></div></div></div>\n<p>\n          <code class=\"computeroutput\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_dec_float</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">ExponentType</span> <span class=\"special\">=</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">int32_t</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Allocator</span> <span class=\"special\">=</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">cpp_dec_float</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float</span><span class=\"special\">&lt;</span><span class=\"number\">100</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">cpp_dec_float_100</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n          The <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float</span></code> back-end\n          is used in conjunction with <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>:\n          It acts as an entirely C++ (header only and dependency free) floating-point\n          number type that is a drop-in replacement for the native C++ floating-point\n          types, but with much greater precision.\n        </p>\n<p>\n          Type <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float</span></code> can\n          be used at fixed precision by specifying a non-zero <code class=\"computeroutput\"><span class=\"identifier\">Digits10</span></code>\n          template parameter. The typedefs <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float_50</span></code>\n          and <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float_100</span></code> provide\n          arithmetic types at 50 and 100 decimal digits precision respectively. Optionally,\n          you can specify an integer type to use for the exponent, this defaults\n          to a 32-bit integer type which is more than large enough for the vast majority\n          of use cases, but larger types such as <code class=\"computeroutput\"><span class=\"keyword\">long</span>\n          <span class=\"keyword\">long</span></code> can also be specified if you\n          need a truly huge exponent range. In any case the ExponentType must be\n          a <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n          (built-in)</a> signed integer type at least 2 bytes and 16-bits wide.\n        </p>\n<p>\n          Normally <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float</span></code>\n          allocates no memory: all of the space required for its digits are allocated\n          directly within the class. As a result care should be taken not to use\n          the class with too high a digit count as stack space requirements can grow\n          out of control. If that represents a problem then providing an allocator\n          as the final template parameter causes <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float</span></code>\n          to dynamically allocate the memory it needs: this significantly reduces\n          the size of <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float</span></code>\n          and increases the viable upper limit on the number of digits at the expense\n          of performance. However, please bear in mind that arithmetic operations\n          rapidly become <span class=\"emphasis\"><em>very</em></span> expensive as the digit count grows:\n          the current implementation really isn't optimized or designed for large\n          digit counts.\n        </p>\n<p>\n          There is full standard library and <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code>\n          support available for this type.\n        </p>\n<p>\n          Things you should know when using this type:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              Default constructed <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float</span></code>s\n              have a value of zero.\n            </li>\n<li class=\"listitem\">\n              The radix of this type is 10. As a result it can behave subtly differently\n              from base-2 types.\n            </li>\n<li class=\"listitem\">\n              The type has a number of internal guard digits over and above those\n              specified in the template argument. Normally these should not be visible\n              to the user.\n            </li>\n<li class=\"listitem\">\n              The type supports both infinities and NaNs. An infinity is generated\n              whenever the result would overflow, and a NaN is generated for any\n              mathematically undefined operation.\n            </li>\n<li class=\"listitem\">\n              There is a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code> specialisation for\n              this type.\n            </li>\n<li class=\"listitem\">\n              Any <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> instantiated\n              on this type, is convertible to any other <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n              instantiated on this type - for example you can convert from <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code> to <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float</span><span class=\"special\">&lt;</span><span class=\"identifier\">SomeOtherValue</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code>.\n              Narrowing conversions are truncating and <code class=\"computeroutput\"><span class=\"keyword\">explicit</span></code>.\n            </li>\n<li class=\"listitem\">\n              Conversion from a string results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code>\n              being thrown if the string can not be interpreted as a valid floating-point\n              number.\n            </li>\n<li class=\"listitem\">\n              The actual precision of a <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float</span></code>\n              is always slightly higher than the number of digits specified in the\n              template parameter, actually how much higher is an implementation detail\n              but is always at least 8 decimal digits.\n            </li>\n<li class=\"listitem\">\n              Operations involving <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float</span></code>\n              are always truncating. However, note that since there are guard digits\n              in effect, in practice this has no real impact on accuracy for most\n              use cases.\n            </li>\n</ul></div>\n<h6>\n<a name=\"boost_multiprecision.tut.floats.cpp_dec_float.h0\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.floats.cpp_dec_float.cpp_dec_float_example\"></a></span><a class=\"link\" href=\"cpp_dec_float.html#boost_multiprecision.tut.floats.cpp_dec_float.cpp_dec_float_example\">cpp_dec_float\n          example:</a>\n        </h6>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_dec_float</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">math</span><span class=\"special\">/</span><span class=\"identifier\">special_functions</span><span class=\"special\">/</span><span class=\"identifier\">gamma</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// Operations at fixed precision and full numeric_limits support:</span>\n   <span class=\"identifier\">cpp_dec_float_100</span> <span class=\"identifier\">b</span> <span class=\"special\">=</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float_100</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"comment\">// Note that digits10 is the same as digits, since we're base 10! :</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float_100</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"comment\">// We can use any C++ std lib function, lets print all the digits as well:</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float_100</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_digits10</span><span class=\"special\">)</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">log</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// print log(2)</span>\n   <span class=\"comment\">// We can also use any function from Boost.Math:</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tgamma</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"comment\">// These even work when the argument is an expression template:</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tgamma</span><span class=\"special\">(</span><span class=\"identifier\">b</span> <span class=\"special\">*</span> <span class=\"identifier\">b</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"comment\">// And since we have an extended exponent range we can generate some really large </span>\n   <span class=\"comment\">// numbers here (4.0238726007709377354370243e+2564):</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tgamma</span><span class=\"special\">(</span><span class=\"identifier\">cpp_dec_float_100</span><span class=\"special\">(</span><span class=\"number\">1000</span><span class=\"special\">))</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"cpp_bin_float.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../floats.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"gmp_float.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/floats/float128.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>float128</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../floats.html\" title=\"Floating-point Types\">\n<link rel=\"prev\" href=\"mpfr_float.html\" title=\"mpfr_float\">\n<link rel=\"next\" href=\"fp_eg.html\" title=\"Examples\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"mpfr_float.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../floats.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"fp_eg.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.floats.float128\"></a><a class=\"link\" href=\"float128.html\" title=\"float128\">float128</a>\n</h4></div></div></div>\n<p>\n          <code class=\"computeroutput\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">float128</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">class</span> <span class=\"identifier\">float128_backend</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">float128_backend</span><span class=\"special\">,</span> <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span>    <span class=\"identifier\">float128</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n          The <code class=\"computeroutput\"><span class=\"identifier\">float128</span></code> number type\n          is a very thin wrapper around GCC's <code class=\"computeroutput\"><span class=\"identifier\">__float128</span></code>\n          or Intel's <code class=\"computeroutput\"><span class=\"identifier\">_Quad</span></code> data types\n          and provides an real-number type that is a drop-in replacement for the\n          native C++ floating-point types, but with a 113 bit mantissa, and compatible\n          with FORTRAN's 128-bit QUAD real.\n        </p>\n<p>\n          All the usual standard library and <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code>\n          support are available, performance should be equivalent to the underlying\n          native types: for example the LINPACK benchmarks for GCC's <code class=\"computeroutput\"><span class=\"identifier\">__float128</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">float128</span></code>\n          both achieved 5.6 MFLOPS<a href=\"#ftn.boost_multiprecision.tut.floats.float128.f0\" class=\"footnote\" name=\"boost_multiprecision.tut.floats.float128.f0\"><sup class=\"footnote\">[3]</sup></a>.\n        </p>\n<p>\n          As well as the usual conversions from arithmetic and string types, instances\n          of <code class=\"computeroutput\"><span class=\"identifier\">float128</span></code> are copy constructible\n          and assignable from GCC's <code class=\"computeroutput\"><span class=\"identifier\">__float128</span></code>\n          and Intel's <code class=\"computeroutput\"><span class=\"identifier\">_Quad</span></code> data\n          types.\n        </p>\n<p>\n          It's also possible to access the underlying <code class=\"computeroutput\"><span class=\"identifier\">__float128</span></code>\n          or <code class=\"computeroutput\"><span class=\"identifier\">_Quad</span></code> type via the\n          <code class=\"computeroutput\"><span class=\"identifier\">data</span><span class=\"special\">()</span></code>\n          member function of <code class=\"computeroutput\"><span class=\"identifier\">float128_backend</span></code>.\n        </p>\n<p>\n          Things you should know when using this type:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              Default constructed <code class=\"computeroutput\"><span class=\"identifier\">float128</span></code>s\n              have the value zero.\n            </li>\n<li class=\"listitem\">\n              This backend supports rvalue-references and is move-aware, making instantiations\n              of <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> on this backend\n              move aware.\n            </li>\n<li class=\"listitem\">\n              This type is fully <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code>\n              aware - basic constexpr arithmetic is supported from C++14 and onwards,\n              comparisons, plus the functions <code class=\"computeroutput\"><span class=\"identifier\">fabs</span></code>,\n              <code class=\"computeroutput\"><span class=\"identifier\">abs</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">fpclassify</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">isnormal</span></code>,\n              <code class=\"computeroutput\"><span class=\"identifier\">isfinite</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">isinf</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">isnan</span></code>\n              are also supported if either the compiler implements C++20's <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">is_constant_evaluated</span><span class=\"special\">()</span></code>,\n              or if the compiler is GCC.\n            </li>\n<li class=\"listitem\">\n              It is not possible to round-trip objects of this type to and from a\n              string and get back exactly the same value when compiled with Intel's\n              C++ compiler and using <code class=\"computeroutput\"><span class=\"identifier\">_Quad</span></code>\n              as the underlying type: this is a current limitation of our code. Round\n              tripping when using <code class=\"computeroutput\"><span class=\"identifier\">__float128</span></code>\n              as the underlying type is possible (both for GCC and Intel).\n            </li>\n<li class=\"listitem\">\n              Conversion from a string results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code>\n              being thrown if the string can not be interpreted as a valid floating-point\n              number.\n            </li>\n<li class=\"listitem\">\n              Division by zero results in an infinity being produced.\n            </li>\n<li class=\"listitem\">\n              Type <code class=\"computeroutput\"><span class=\"identifier\">float128</span></code> can be\n              used as a literal type (constexpr support).\n            </li>\n<li class=\"listitem\">\n              Type <code class=\"computeroutput\"><span class=\"identifier\">float128</span></code> can be\n              used for full <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code>\n              arithmetic from C++14 and later with GCC. The functions <code class=\"computeroutput\"><span class=\"identifier\">abs</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">fabs</span></code>,\n              <code class=\"computeroutput\"><span class=\"identifier\">fpclassify</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">isnan</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">isinf</span></code>,\n              <code class=\"computeroutput\"><span class=\"identifier\">isfinite</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">isnormal</span></code> are also <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code>,\n              but the transcendental functions are not.\n            </li>\n<li class=\"listitem\">\n              When using the Intel compiler, the underlying type defaults to <code class=\"computeroutput\"><span class=\"identifier\">__float128</span></code> if it's available and\n              <code class=\"computeroutput\"><span class=\"identifier\">_Quad</span></code> if not. You can\n              override the default by defining either <code class=\"computeroutput\"><span class=\"identifier\">BOOST_MP_USE_FLOAT128</span></code>\n              or <code class=\"computeroutput\"><span class=\"identifier\">BOOST_MP_USE_QUAD</span></code>.\n            </li>\n<li class=\"listitem\">\n              When the underlying type is Intel's <code class=\"computeroutput\"><span class=\"identifier\">_Quad</span></code>\n              type, the code must be compiled with the compiler option <code class=\"computeroutput\"><span class=\"special\">-</span><span class=\"identifier\">Qoption</span><span class=\"special\">,</span><span class=\"identifier\">cpp</span><span class=\"special\">,--</span><span class=\"identifier\">extended_float_type</span></code>.\n            </li>\n<li class=\"listitem\">\n              When compiling with <code class=\"computeroutput\"><span class=\"identifier\">gcc</span></code>,\n              you need to use the flag <code class=\"computeroutput\"><span class=\"special\">--</span><span class=\"identifier\">std</span><span class=\"special\">=</span><span class=\"identifier\">gnu</span><span class=\"special\">++</span><span class=\"number\">11</span><span class=\"special\">/</span><span class=\"number\">14</span><span class=\"special\">/</span><span class=\"number\">17</span></code>,\n              as the suffix 'Q' is a GNU extension. Compilation fails with the flag\n              <code class=\"computeroutput\"><span class=\"special\">--</span><span class=\"identifier\">std</span><span class=\"special\">=</span><span class=\"identifier\">c</span><span class=\"special\">++</span><span class=\"number\">11</span><span class=\"special\">/</span><span class=\"number\">14</span><span class=\"special\">/</span><span class=\"number\">17</span></code> unless you also use <code class=\"computeroutput\"><span class=\"special\">-</span><span class=\"identifier\">fext</span><span class=\"special\">-</span><span class=\"identifier\">numeric</span><span class=\"special\">-</span><span class=\"identifier\">literals</span></code>.\n            </li>\n<li class=\"listitem\">\n              You will need to link to <code class=\"computeroutput\"><span class=\"identifier\">libquadmath</span><span class=\"special\">.</span><span class=\"identifier\">dll</span></code>\n              with the link command <code class=\"computeroutput\"><span class=\"special\">-</span><span class=\"identifier\">lquadmath</span></code> and ensure that the DLL\n              is visible by the linker. If you are using the B2/bjam build system\n              then commands<code class=\"computeroutput\"><span class=\"special\">&lt;</span><span class=\"identifier\">linkflags</span><span class=\"special\">&gt;-</span><span class=\"identifier\">lQUADMATH</span></code>\n              and <code class=\"computeroutput\"><span class=\"special\">&lt;</span><span class=\"identifier\">linkflags</span><span class=\"special\">&gt;-</span><span class=\"identifier\">L</span><span class=\"string\">\"path/to/lib\"</span></code> will be needed.\n            </li>\n<li class=\"listitem\">\n              The values shown by <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">float128</span><span class=\"special\">&gt;</span></code> and extremely close <span class=\"emphasis\"><em>but\n              not identical</em></span> to those from the equivalent precision and\n              range multiprecision types <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float_quad</span><span class=\"special\">&gt;</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float_quad</span><span class=\"special\">&gt;</span></code>.\n            </li>\n</ul></div>\n<h6>\n<a name=\"boost_multiprecision.tut.floats.float128.h0\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.floats.float128.float128_example\"></a></span><a class=\"link\" href=\"float128.html#boost_multiprecision.tut.floats.float128.float128_example\">float128\n          example:</a>\n        </h6>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">float128</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">math</span><span class=\"special\">/</span><span class=\"identifier\">special_functions</span><span class=\"special\">/</span><span class=\"identifier\">gamma</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span> <span class=\"comment\">// Potential to cause name collisions?</span>\n   <span class=\"comment\">// using boost::multiprecision::float128; // is safer.</span>\n</pre>\n<p>\n          The type float128 provides operations at 128-bit precision with <a href=\"https://en.wikipedia.org/wiki/Quadruple-precision_floating-point_format#IEEE_754_quadruple-precision_binary_floating-point_format:_binary128\" target=\"_top\">Quadruple-precision\n          floating-point format</a> and have full <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code>\n          support:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">float128</span> <span class=\"identifier\">b</span> <span class=\"special\">=</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n</pre>\n<p>\n          There are 15 bits of (biased) binary exponent and 113-bits of significand\n          precision\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">float128</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n</pre>\n<p>\n          or 33 decimal places:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">float128</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n</pre>\n<p>\n          We can use any C++ std library function, so let's show all the at-most\n          36 potentially significant digits, and any trailing zeros, as well:\n        </p>\n<pre class=\"programlisting\"> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span><span class=\"special\">.</span><span class=\"identifier\">setf</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">ios_base</span><span class=\"special\">::</span><span class=\"identifier\">showpoint</span><span class=\"special\">);</span> <span class=\"comment\">// Include any trailing zeros.</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">float128</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_digits10</span><span class=\"special\">)</span>\n   <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">log</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// Shows log(2) = 0.693147180559945309417232121458176575</span>\n</pre>\n<p>\n          We can also use any function from Boost.Math, for example, the 'true gamma'\n          function <code class=\"computeroutput\"><span class=\"identifier\">tgamma</span></code>:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tgamma</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n</pre>\n<p>\n          And since we have an extended exponent range, we can generate some really\n          large numbers here (4.02387260077093773543702433923004111e+2564):\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tgamma</span><span class=\"special\">(</span><span class=\"identifier\">float128</span><span class=\"special\">(</span><span class=\"number\">1000</span><span class=\"special\">))</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n</pre>\n<p>\n          We can declare constants using GCC or Intel's native types, and literals\n          with the Q suffix, and these can be declared <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code>\n          if required:\n        </p>\n<pre class=\"programlisting\"><span class=\"comment\">// std::numeric_limits&lt;float128&gt;::max_digits10 = 36</span>\n<span class=\"keyword\">constexpr</span> <span class=\"identifier\">float128</span> <span class=\"identifier\">pi</span> <span class=\"special\">=</span> <span class=\"number\">3.14159265358979323846264338327950288</span><span class=\"identifier\">Q</span><span class=\"special\">;</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">float128</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_digits10</span><span class=\"special\">);</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"pi = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">pi</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">//pi = 3.14159265358979323846264338327950280</span>\n</pre>\n<p>\n          Values for <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">float128</span><span class=\"special\">&gt;</span></code>\n          are:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">GCC</span> <span class=\"number\">8.1</span><span class=\"special\">.</span><span class=\"number\">0</span>\n\n<span class=\"identifier\">Type</span> <span class=\"identifier\">name</span> <span class=\"identifier\">is</span> <span class=\"identifier\">float128_t</span><span class=\"special\">:</span>\n<span class=\"identifier\">Type</span> <span class=\"identifier\">is</span> <span class=\"identifier\">g</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">is_fundamental</span><span class=\"special\">&lt;&gt;</span> <span class=\"special\">=</span> <span class=\"keyword\">true</span>\n<span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">detail</span><span class=\"special\">::</span><span class=\"identifier\">is_signed</span><span class=\"special\">&lt;&gt;</span> <span class=\"special\">=</span> <span class=\"keyword\">true</span>\n<span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">detail</span><span class=\"special\">::</span><span class=\"identifier\">is_unsigned</span><span class=\"special\">&lt;&gt;</span> <span class=\"special\">=</span> <span class=\"keyword\">false</span>\n<span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">detail</span><span class=\"special\">::</span><span class=\"identifier\">is_integral</span><span class=\"special\">&lt;&gt;</span> <span class=\"special\">=</span> <span class=\"keyword\">false</span>\n<span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">detail</span><span class=\"special\">::</span><span class=\"identifier\">is_arithmetic</span><span class=\"special\">&lt;&gt;</span> <span class=\"special\">=</span> <span class=\"keyword\">true</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">is_const</span><span class=\"special\">&lt;&gt;</span> <span class=\"special\">=</span> <span class=\"keyword\">false</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">is_trivial</span><span class=\"special\">&lt;&gt;</span> <span class=\"special\">=</span> <span class=\"keyword\">true</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">is_standard_layout</span><span class=\"special\">&lt;&gt;</span> <span class=\"special\">=</span> <span class=\"keyword\">true</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">is_pod</span><span class=\"special\">&lt;&gt;</span> <span class=\"special\">=</span> <span class=\"keyword\">true</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">::&lt;&gt;</span><span class=\"identifier\">is_exact</span> <span class=\"special\">=</span> <span class=\"keyword\">false</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">::&lt;&gt;</span><span class=\"identifier\">is</span> <span class=\"identifier\">bounded</span> <span class=\"special\">=</span> <span class=\"keyword\">true</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">::&lt;&gt;</span><span class=\"identifier\">is_modulo</span> <span class=\"special\">=</span> <span class=\"keyword\">false</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">::&lt;&gt;</span><span class=\"identifier\">is_iec559</span> <span class=\"special\">=</span> <span class=\"keyword\">true</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">::&lt;&gt;</span><span class=\"identifier\">traps</span> <span class=\"special\">=</span> <span class=\"keyword\">false</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">::&lt;&gt;</span><span class=\"identifier\">tinyness_before</span> <span class=\"special\">=</span> <span class=\"keyword\">false</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">::&lt;&gt;</span><span class=\"identifier\">max</span><span class=\"special\">()</span> <span class=\"special\">=</span> <span class=\"number\">1.18973149535723176508575932662800702e+4932</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">::&lt;&gt;</span><span class=\"identifier\">min</span><span class=\"special\">()</span> <span class=\"special\">=</span> <span class=\"number\">3.36210314311209350626267781732175260e-4932</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">::&lt;&gt;</span><span class=\"identifier\">lowest</span><span class=\"special\">()</span> <span class=\"special\">=</span> <span class=\"special\">-</span><span class=\"number\">1.18973149535723176508575932662800702e+4932</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">::&lt;&gt;</span><span class=\"identifier\">min_exponent</span> <span class=\"special\">=</span> <span class=\"special\">-</span><span class=\"number\">16381</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">::&lt;&gt;</span><span class=\"identifier\">max_exponent</span> <span class=\"special\">=</span> <span class=\"number\">16384</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">::&lt;&gt;</span><span class=\"identifier\">epsilon</span><span class=\"special\">()</span> <span class=\"special\">=</span> <span class=\"number\">1.92592994438723585305597794258492732e-34</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">::&lt;&gt;</span><span class=\"identifier\">radix</span> <span class=\"special\">=</span> <span class=\"number\">2</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">::&lt;&gt;</span><span class=\"identifier\">digits</span> <span class=\"special\">=</span> <span class=\"number\">113</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">::&lt;&gt;</span><span class=\"identifier\">digits10</span> <span class=\"special\">=</span> <span class=\"number\">33</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">::&lt;&gt;</span><span class=\"identifier\">max_digits10</span> <span class=\"special\">=</span> <span class=\"number\">36</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">::&lt;&gt;</span><span class=\"identifier\">has</span> <span class=\"identifier\">denorm</span> <span class=\"special\">=</span> <span class=\"keyword\">true</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">::&lt;&gt;</span><span class=\"identifier\">denorm</span> <span class=\"identifier\">min</span> <span class=\"special\">=</span> <span class=\"number\">6.47517511943802511092443895822764655e-4966</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">denorm_loss</span> <span class=\"special\">=</span> <span class=\"keyword\">false</span>\n<span class=\"identifier\">limits</span><span class=\"special\">::</span><span class=\"identifier\">has_signaling_NaN</span> <span class=\"special\">==</span> <span class=\"keyword\">false</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">::&lt;&gt;</span><span class=\"identifier\">quiet_NaN</span> <span class=\"special\">=</span> <span class=\"identifier\">nan</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">::&lt;&gt;</span><span class=\"identifier\">infinity</span> <span class=\"special\">=</span> <span class=\"identifier\">inf</span>\n</pre>\n<div class=\"footnotes\">\n<br><hr style=\"width:100; text-align:left;margin-left: 0\">\n<div id=\"ftn.boost_multiprecision.tut.floats.float128.f0\" class=\"footnote\"><p><a href=\"#boost_multiprecision.tut.floats.float128.f0\" class=\"para\"><sup class=\"para\">[3] </sup></a>\n            On 64-bit Ubuntu 11.10, GCC-4.8.0, Intel Core 2 Duo T5800.\n          </p></div>\n</div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"mpfr_float.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../floats.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"fp_eg.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/floats/fp_eg/aos.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Area of Circle</title>\n<link rel=\"stylesheet\" href=\"../../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../fp_eg.html\" title=\"Examples\">\n<link rel=\"prev\" href=\"floatbuiltinctor.html\" title=\"Construction from Specific Values Without Precision Loss\">\n<link rel=\"next\" href=\"caveats.html\" title=\"Drop-in Caveats\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"floatbuiltinctor.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../fp_eg.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"caveats.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h5 class=\"title\">\n<a name=\"boost_multiprecision.tut.floats.fp_eg.aos\"></a><a class=\"link\" href=\"aos.html\" title=\"Area of Circle\">Area of\n          Circle</a>\n</h5></div></div></div>\n<p>\n            Generic numeric programming employs templates to use the same code for\n            different floating-point types and functions. Consider the area of a\n            circle a of radius r, given by\n          </p>\n<div class=\"blockquote\"><blockquote class=\"blockquote\"><p>\n              <span class=\"emphasis\"><em>a = π * r<sup>2</sup></em></span>\n            </p></blockquote></div>\n<p>\n            The area of a circle can be computed in generic programming using Boost.Math\n            for the constant π as shown below:\n          </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">math</span><span class=\"special\">/</span><span class=\"identifier\">constants</span><span class=\"special\">/</span><span class=\"identifier\">constants</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">template</span><span class=\"special\">&lt;</span><span class=\"keyword\">typename</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">inline</span> <span class=\"identifier\">T</span> <span class=\"identifier\">area_of_a_circle</span><span class=\"special\">(</span><span class=\"identifier\">T</span> <span class=\"identifier\">r</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">constants</span><span class=\"special\">::</span><span class=\"identifier\">pi</span><span class=\"special\">;</span>\n   <span class=\"keyword\">return</span> <span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;()</span> <span class=\"special\">*</span> <span class=\"identifier\">r</span> <span class=\"special\">*</span> <span class=\"identifier\">r</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n            It is possible to use <code class=\"computeroutput\"><span class=\"identifier\">area_of_a_circle</span><span class=\"special\">()</span></code> with built-in floating-point types\n            as well as floating-point types from Boost.Multiprecision. In particular,\n            consider a system with 4-byte single-precision float, 8-byte double-precision\n            double and also the <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float_50</span></code>\n            data type from Boost.Multiprecision with 50 decimal digits of precision.\n          </p>\n<p>\n            We can compute and print the approximate area of a circle with radius\n            123/100 for <code class=\"computeroutput\"><span class=\"keyword\">float</span></code>, <code class=\"computeroutput\"><span class=\"keyword\">double</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float_50</span></code>\n            with the program below (see next section for choosing 123/100 instead\n            of 1.23).\n          </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iomanip</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_dec_float</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">using</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">(</span><span class=\"keyword\">int</span><span class=\"special\">,</span> <span class=\"keyword\">char</span><span class=\"special\">**)</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">const</span> <span class=\"keyword\">float</span> <span class=\"identifier\">r_f</span><span class=\"special\">(</span><span class=\"keyword\">float</span><span class=\"special\">(</span><span class=\"number\">123</span><span class=\"special\">)</span> <span class=\"special\">/</span> <span class=\"number\">100</span><span class=\"special\">);</span>\n   <span class=\"keyword\">const</span> <span class=\"keyword\">float</span> <span class=\"identifier\">a_f</span> <span class=\"special\">=</span> <span class=\"identifier\">area_of_a_circle</span><span class=\"special\">(</span><span class=\"identifier\">r_f</span><span class=\"special\">);</span>\n\n   <span class=\"keyword\">const</span> <span class=\"keyword\">double</span> <span class=\"identifier\">r_d</span><span class=\"special\">(</span><span class=\"keyword\">double</span><span class=\"special\">(</span><span class=\"number\">123</span><span class=\"special\">)</span> <span class=\"special\">/</span> <span class=\"number\">100</span><span class=\"special\">);</span>\n   <span class=\"keyword\">const</span> <span class=\"keyword\">double</span> <span class=\"identifier\">a_d</span> <span class=\"special\">=</span> <span class=\"identifier\">area_of_a_circle</span><span class=\"special\">(</span><span class=\"identifier\">r_d</span><span class=\"special\">);</span>\n\n   <span class=\"keyword\">const</span> <span class=\"identifier\">cpp_dec_float_50</span> <span class=\"identifier\">r_mp</span><span class=\"special\">(</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">(</span><span class=\"number\">123</span><span class=\"special\">)</span> <span class=\"special\">/</span> <span class=\"number\">100</span><span class=\"special\">);</span>\n   <span class=\"keyword\">const</span> <span class=\"identifier\">cpp_dec_float_50</span> <span class=\"identifier\">a_mp</span> <span class=\"special\">=</span> <span class=\"identifier\">area_of_a_circle</span><span class=\"special\">(</span><span class=\"identifier\">r_mp</span><span class=\"special\">);</span>\n\n   <span class=\"comment\">// 4.75292</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">float</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">)</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">a_f</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// 4.752915525616</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">)</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">a_d</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// 4.7529155256159981904701331745635599135018975843146</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">)</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">a_mp</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n            In later examples we'll look at calling both standard library and Boost.Math\n            functions from within generic code. We'll also show how to cope with\n            template arguments which are expression-templates rather than number\n            types.\n          </p>\n<p>\n            But first some warnings about how multiprecision types are slightly but\n            significantly different <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n            (built-in) types</a>.\n          </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"floatbuiltinctor.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../fp_eg.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"caveats.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/floats/fp_eg/caveats.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Drop-in Caveats</title>\n<link rel=\"stylesheet\" href=\"../../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../fp_eg.html\" title=\"Examples\">\n<link rel=\"prev\" href=\"aos.html\" title=\"Area of Circle\">\n<link rel=\"next\" href=\"jel.html\" title=\"Defining a Special Function.\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"aos.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../fp_eg.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"jel.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h5 class=\"title\">\n<a name=\"boost_multiprecision.tut.floats.fp_eg.caveats\"></a><a class=\"link\" href=\"caveats.html\" title=\"Drop-in Caveats\">Drop-in\n          Caveats</a>\n</h5></div></div></div>\n<h6>\n<a name=\"boost_multiprecision.tut.floats.fp_eg.caveats.h0\"></a>\n            <span class=\"phrase\"><a name=\"boost_multiprecision.tut.floats.fp_eg.caveats.using_boost_multiprecision_cpp_f\"></a></span><a class=\"link\" href=\"caveats.html#boost_multiprecision.tut.floats.fp_eg.caveats.using_boost_multiprecision_cpp_f\">Using\n            Boost.Multiprecision <code class=\"computeroutput\"><span class=\"identifier\">cpp_float</span></code>\n            types for numerical calculations with higher precision than fundamental\n            (built-in) <code class=\"computeroutput\"><span class=\"keyword\">long</span> <span class=\"keyword\">double</span></code>.</a>\n          </h6>\n<p>\n            The Boost.Multiprecision library can be used for computations requiring\n            precision exceeding that of standard <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n            (built-in)</a> types such as <code class=\"computeroutput\"><span class=\"keyword\">float</span></code>,\n            <code class=\"computeroutput\"><span class=\"keyword\">double</span></code> and <code class=\"computeroutput\"><span class=\"keyword\">long</span> <span class=\"keyword\">double</span></code>.\n            For extended-precision calculations, Boost.Multiprecision supplies several\n            template data types called <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float_</span></code>.\n          </p>\n<p>\n            The number of decimal digits of precision is fixed at compile-time via\n            template parameter.\n          </p>\n<p>\n            To use these floating-point types and <a href=\"https://www.boost.org/doc/libs/release/libs/math/doc/html/constants.html\" target=\"_top\">Boost.Math\n            collection of high-precision constants</a>, we need some includes:\n          </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">math</span><span class=\"special\">/</span><span class=\"identifier\">constants</span><span class=\"special\">/</span><span class=\"identifier\">constants</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"comment\">// that includes some predefined typedefs like:</span>\n<span class=\"comment\">// using boost::multiprecision::cpp_bin_float_quad;</span>\n<span class=\"comment\">// using boost::multiprecision::cpp_bin_float_50;</span>\n<span class=\"comment\">// using boost::multiprecision::cpp_bin_float_100;</span>\n\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">limits</span><span class=\"special\">&gt;</span>\n</pre>\n<p>\n            So now we can demonstrate with some trivial calculations:\n          </p>\n<p>\n            Using a <code class=\"computeroutput\"><span class=\"keyword\">typedef</span></code> like <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float_50</span></code> hides the complexity\n            of multiprecision, and allows us to define variables with 50 decimal\n            digit precision just like <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n            (built-in)</a> <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>.\n          </p>\n<pre class=\"programlisting\"><span class=\"keyword\">using</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">;</span>\n\n<span class=\"identifier\">cpp_bin_float_50</span> <span class=\"identifier\">seventh</span> <span class=\"special\">=</span> <span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">(</span><span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"special\">/</span> <span class=\"number\">7</span><span class=\"special\">;</span>  <span class=\"comment\">// 1 / 7</span>\n</pre>\n<p>\n            By default, output would only show the standard 6 decimal digits, so\n            set precision to show all 50 significant digits, including any trailing\n            zeros (to show the full implied 50 digit precision).\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">);</span> <span class=\"comment\">// Show 50 decimal digit precision.</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">showpoint</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// Append any trailing zeros.</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">seventh</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n</pre>\n<p>\n            which outputs:\n          </p>\n<pre class=\"programlisting\"><span class=\"number\">0.14285714285714285714285714285714285714285714285714</span>\n</pre>\n<p>\n            We can also use Boost.Math <a href=\"https://www.boost.org/doc/libs/release/libs/math/doc/html/math_toolkit/constants.html\" target=\"_top\">Boost.Math\n            constants</a> like π, guaranteed to be initialized with the very last\n            bit of precision for the floating-point type.\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"pi = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">constants</span><span class=\"special\">::</span><span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">&gt;()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"identifier\">cpp_bin_float_50</span> <span class=\"identifier\">circumference</span> <span class=\"special\">=</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">constants</span><span class=\"special\">::</span><span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">&gt;()</span> <span class=\"special\">*</span> <span class=\"number\">2</span> <span class=\"special\">*</span> <span class=\"identifier\">seventh</span><span class=\"special\">;</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"c =  \"</span><span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">circumference</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n</pre>\n<p>\n            which outputs\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">pi</span> <span class=\"special\">=</span> <span class=\"number\">3.1415926535897932384626433832795028841971693993751</span>\n\n<span class=\"identifier\">c</span> <span class=\"special\">=</span>  <span class=\"number\">0.89759790102565521098932668093700082405633411410717</span>\n</pre>\n<p>\n            So using <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float_50</span></code>\n            looks like a simple 'drop-in' for the <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n            (built-in) type</a> like 'double', but beware of less-than-expected\n            precision from construction or conversion from <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>\n            or other lower precision types. This is a mistake that is very easy to\n            make, and very difficult to detect because the difference in precision\n            is only visible after about the 17th decimal digit.\n          </p>\n<p>\n            We can show this by constructing a fraction one seventh from <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">cpp_bin_float_50</span> <span class=\"identifier\">seventh_0</span> <span class=\"special\">=</span> <span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">(</span><span class=\"number\">1</span><span class=\"special\">/</span><span class=\"number\">7</span><span class=\"special\">);</span>  <span class=\"comment\">// Avoid the schoolboy-error `double d7 = 1 / 7;` giving zero!</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"seventh_0 = \"</span>  <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">seventh_0</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"comment\">// seventh_double0 = 0.0000000000000000000000000000000000000000000000000</span>\n\n<span class=\"identifier\">cpp_bin_float_50</span> <span class=\"identifier\">seventh_double</span> <span class=\"special\">=</span> <span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">(</span><span class=\"number\">1.</span><span class=\"special\">/</span><span class=\"number\">7</span><span class=\"special\">);</span>  <span class=\"comment\">// Construct from double! (0.14285714285714)</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"seventh_double = \"</span>  <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">seventh_double</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// Boost.Multiprecision post-school error!</span>\n<span class=\"comment\">// seventh_double = 0.14285714285714284921269268124888185411691665649414</span>\n</pre>\n<p>\n            Did you spot the probably-unintended difference? After the 17th decimal\n            digit, result is apparently random and not the expected recurring pattern\n            14285714285714...\n          </p>\n<p>\n            The 'random' digits after digit 17 are from the <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float_50</span></code>\n            representation of the <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>\n            value 0.14285714285714 which is different from the 'better' <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float_50</span></code> representation of\n            the fraction 1/7\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">cpp_bin_float_50</span> <span class=\"identifier\">seventh_big</span><span class=\"special\">(</span><span class=\"number\">1</span><span class=\"special\">);</span>  <span class=\"comment\">// 1</span>\n<span class=\"identifier\">seventh_big</span> <span class=\"special\">/=</span> <span class=\"number\">7</span><span class=\"special\">;</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"seventh_big = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">seventh_big</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">//</span>\n<span class=\"comment\">// seventh_big     = 0.14285714285714285714285714285714285714285714285714</span>\n</pre>\n<p>\n            Note the recurring 14285714285714 pattern as expected. We can also construct\n            a <code class=\"computeroutput\"><span class=\"keyword\">const</span></code> version (but not\n            yet <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code>) and evaluate\n            in a single expression:\n          </p>\n<pre class=\"programlisting\"><span class=\"keyword\">const</span> <span class=\"identifier\">cpp_bin_float_50</span> <span class=\"identifier\">seventh_const</span> <span class=\"special\">(</span><span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">(</span><span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"special\">/</span> <span class=\"number\">7</span><span class=\"special\">);</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"seventh_const = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">seventh_const</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">//</span>\n<span class=\"comment\">// seventh_const = 0.14285714285714285714285714285714285714285714285714</span>\n</pre>\n<pre class=\"programlisting\"><span class=\"comment\">// Sadly we cannot (yet) write:</span>\n<span class=\"comment\">// constexpr cpp_bin_float_50 any_constexpr(0);</span>\n\n<span class=\"comment\">// constexpr cpp_bin_float_50 seventh_constexpr (cpp_bin_float_50(1) / 7);</span>\n<span class=\"comment\">// std::cout &lt;&lt; \"seventh_constexpr = \" &lt;&lt; seventh_constexpr &lt;&lt; std::endl; //</span>\n<span class=\"comment\">// nor use the macro constexpr unless it returns `const`</span>\n<span class=\"comment\">// constexpr cpp_bin_float_50 seventh_constexpr(seventh_const);</span>\n</pre>\n<p>\n            For some purposes, this difference in precision may be insignificant,\n            but if one is implementing a formula involving a fraction from integers,\n            including decimal fractions like 1/10, 1/100, then comparison with other\n            computations like <a href=\"http://www.wolframalpha.com/\" target=\"_top\">Wolfram Alpha</a>\n            will reveal differences whose cause may be perplexing.\n          </p>\n<p>\n            To get as precise-as-possible decimal fractions like 1.234, we can write\n          </p>\n<pre class=\"programlisting\"><span class=\"keyword\">const</span> <span class=\"identifier\">cpp_bin_float_50</span> <span class=\"identifier\">f1</span><span class=\"special\">(</span><span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">(</span><span class=\"number\">1234</span><span class=\"special\">)</span> <span class=\"special\">/</span> <span class=\"number\">1000</span><span class=\"special\">);</span>  <span class=\"comment\">// Construct from a fraction.</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"cpp_bin_float_50 f1(cpp_bin_float_50(1234) / 1000) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">f1</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// cpp_bin_float_50 f1(cpp_bin_float_50(1234) / 1000) = 1.2340000000000000000000000000000000000000000000000</span>\n</pre>\n<p>\n            or\n          </p>\n<pre class=\"programlisting\"><span class=\"keyword\">const</span> <span class=\"identifier\">cpp_bin_float_50</span> <span class=\"identifier\">f2</span><span class=\"special\">(</span><span class=\"string\">\"1.234\"</span><span class=\"special\">);</span>  <span class=\"comment\">// Construct from decimal digit string.</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"cpp_bin_float_50 f2(\\\"1.234\\\") = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">f2</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// cpp_bin_float_50 f2(\"1.234\") = 1.2340000000000000000000000000000000000000000000000</span>\n</pre>\n<p>\n            that are different from constructing from a <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>\n            with value 1.234\n          </p>\n<pre class=\"programlisting\"><span class=\"keyword\">const</span> <span class=\"identifier\">cpp_bin_float_50</span> <span class=\"identifier\">f3</span><span class=\"special\">(</span><span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">(</span><span class=\"number\">1.234</span><span class=\"special\">));</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"cpp_bin_float_50 f3(cpp_bin_float_50(1.234)) = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">f3</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// 1.2339999999999999857891452847979962825775146484375</span>\n</pre>\n<p>\n            Typical output is:\n          </p>\n<pre class=\"programlisting\"><span class=\"number\">0.14285714285714285714285714285714285714285714285714</span>\n<span class=\"identifier\">pi</span> <span class=\"special\">=</span> <span class=\"number\">3.1415926535897932384626433832795028841971693993751</span>\n<span class=\"identifier\">c</span> <span class=\"special\">=</span>  <span class=\"number\">0.89759790102565521098932668093700082405633411410717</span>\n<span class=\"identifier\">seventh_0</span> <span class=\"special\">=</span> <span class=\"number\">0.0000000000000000000000000000000000000000000000000</span>\n<span class=\"identifier\">seventh_double</span> <span class=\"special\">=</span> <span class=\"number\">0.14285714285714284921269268124888185411691665649414</span>\n<span class=\"identifier\">seventh_big</span> <span class=\"special\">=</span> <span class=\"number\">0.14285714285714285714285714285714285714285714285714</span>\n<span class=\"identifier\">seventh_const</span> <span class=\"special\">=</span> <span class=\"number\">0.14285714285714285714285714285714285714285714285714</span>\n<span class=\"identifier\">cpp_bin_float_50</span> <span class=\"identifier\">f1</span><span class=\"special\">(</span><span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">(</span><span class=\"number\">1234</span><span class=\"special\">)</span> <span class=\"special\">/</span> <span class=\"number\">100</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"number\">12.340000000000000000000000000000000000000000000000</span>\n<span class=\"identifier\">cpp_bin_float_50</span> <span class=\"identifier\">f2</span><span class=\"special\">(</span><span class=\"string\">\"1.234\"</span><span class=\"special\">)</span> <span class=\"special\">=</span> <span class=\"number\">1.2340000000000000000000000000000000000000000000000</span>\n<span class=\"identifier\">cpp_bin_float_50</span> <span class=\"identifier\">f3</span><span class=\"special\">(</span><span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">(</span><span class=\"number\">1.234</span><span class=\"special\">))</span> <span class=\"special\">=</span> <span class=\"number\">1.2339999999999999857891452847979962825775146484375</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"aos.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../fp_eg.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"jel.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/floats/fp_eg/floatbuiltinctor.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Construction from Specific Values Without Precision Loss</title>\n<link rel=\"stylesheet\" href=\"../../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../fp_eg.html\" title=\"Examples\">\n<link rel=\"prev\" href=\"../fp_eg.html\" title=\"Examples\">\n<link rel=\"next\" href=\"aos.html\" title=\"Area of Circle\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../fp_eg.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../fp_eg.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"aos.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h5 class=\"title\">\n<a name=\"boost_multiprecision.tut.floats.fp_eg.floatbuiltinctor\"></a><a class=\"link\" href=\"floatbuiltinctor.html\" title=\"Construction from Specific Values Without Precision Loss\">Construction\n          from Specific Values Without Precision Loss</a>\n</h5></div></div></div>\n<p>\n            Construction of multiprecision types from built-in floating-point types\n            can lead to potentially unexpected, yet correct, results. Consider, for\n            instance constructing an instance of <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float_50</span></code>\n            from the literal built-in floating-point <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>\n            value 11.1.\n          </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iomanip</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">limits</span><span class=\"special\">&gt;</span>\n\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_dec_float</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n  <span class=\"keyword\">using</span> <span class=\"identifier\">my_dec_100</span> <span class=\"special\">=</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">;</span>\n\n  <span class=\"keyword\">const</span> <span class=\"identifier\">my_dec_100</span> <span class=\"identifier\">f11</span><span class=\"special\">(</span><span class=\"number\">11.1</span><span class=\"special\">);</span>\n\n  <span class=\"comment\">// On a system with 64-bit double:</span>\n  <span class=\"comment\">// 11.09999999999999964472863211994990706443786621093750</span>\n  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">my_dec_100</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">)</span>\n            <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">fixed</span>\n            <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">f11</span>\n            <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n            In this example, the system has a 64-bit built in <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>\n            representation. The variable <code class=\"computeroutput\"><span class=\"identifier\">f11</span></code>\n            is initialized with the literal <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>\n            value 11.1. Recall that built-in floating-point representations are based\n            on successive binary fractional approximations. These are, in fact, very\n            close approximations. But they are approximations nonetheless, having\n            their built-in finite precision.\n          </p>\n<p>\n            For this reason, the full multiple precision value of the <code class=\"computeroutput\"><span class=\"keyword\">double</span></code> approximation of 11.1 is given\n            by the large value shown above. Observations show us that the value is\n            reliable up to the approximate 15 decimal digit precision of built-in\n            64-bit <code class=\"computeroutput\"><span class=\"keyword\">double</span></code> on this system.\n          </p>\n<p>\n            If the exact value of 11.1 is desired (within the wider precision of\n            the multiprecision type), then construction from literal string or from\n            a rational integral construction/division sequence should be used.\n          </p>\n<pre class=\"programlisting\"><span class=\"keyword\">const</span> <span class=\"identifier\">my_dec_100</span> <span class=\"identifier\">f11_str</span><span class=\"special\">(</span><span class=\"string\">\"11.1\"</span><span class=\"special\">);</span>\n<span class=\"keyword\">const</span> <span class=\"identifier\">my_dec_100</span> <span class=\"identifier\">f11_n</span>  <span class=\"special\">(</span><span class=\"identifier\">my_dec_100</span><span class=\"special\">(</span><span class=\"number\">111</span><span class=\"special\">)</span> <span class=\"special\">/</span> <span class=\"number\">10</span><span class=\"special\">);</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../fp_eg.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../fp_eg.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"aos.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/floats/fp_eg/gauss_lagerre_quadrature.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Gauss-Laguerre quadrature</title>\n<link rel=\"stylesheet\" href=\"../../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../fp_eg.html\" title=\"Examples\">\n<link rel=\"prev\" href=\"variable_precision.html\" title=\"Variable-Precision Newton Evaluation\">\n<link rel=\"next\" href=\"../../interval.html\" title=\"Interval Number Types\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"variable_precision.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../fp_eg.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../../interval.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h5 class=\"title\">\n<a name=\"boost_multiprecision.tut.floats.fp_eg.gauss_lagerre_quadrature\"></a><a class=\"link\" href=\"gauss_lagerre_quadrature.html\" title=\"Gauss-Laguerre quadrature\">Gauss-Laguerre\n          quadrature</a>\n</h5></div></div></div>\n<p>\n            This example uses <a href=\"https://www.boost.org/doc/libs/release/libs/multiprecision/doc/index.html\" target=\"_top\">Boost.Multiprecision</a>\n            to implement a high-precision Gauss-Laguerre quadrature integration.\n            The quadrature is used to calculate the <code class=\"computeroutput\"><span class=\"identifier\">airy_ai</span><span class=\"special\">(</span><span class=\"identifier\">x</span><span class=\"special\">)</span></code> function for real-valued <code class=\"computeroutput\"><span class=\"identifier\">x</span></code> on the positive axis with <code class=\"computeroutput\"><span class=\"identifier\">x</span> <span class=\"special\">&gt;=</span> <span class=\"number\">1</span></code>.\n          </p>\n<p>\n            In this way, the integral representation could be seen as part of a scheme\n            to calculate real-valued Airy functions on the positive axis for medium\n            to large argument. A Taylor series or hypergeometric function (not part\n            of this example) could be used for smaller arguments.\n          </p>\n<p>\n            This example has been tested with decimal digits counts ranging from\n            21...301, by adjusting the parameter <code class=\"computeroutput\"><span class=\"identifier\">local</span><span class=\"special\">::</span><span class=\"identifier\">my_digits10</span></code>\n            at compile time.\n          </p>\n<p>\n            The quadrature integral representaion of <code class=\"computeroutput\"><span class=\"identifier\">airy_ai</span><span class=\"special\">(</span><span class=\"identifier\">x</span><span class=\"special\">)</span></code> used in this example can be found in:\n          </p>\n<p>\n            A. Gil, J. Segura, N.M. Temme, \"Numerical Methods for Special Functions\"\n            (SIAM Press 2007), ISBN 9780898717822, Sect. 5.3.3, in particular Eq.\n            5.110, page 145.\n          </p>\n<p>\n            Subsequently, Gil et al's book cites the another work: W. Gautschi, \"Computation\n            of Bessel and Airy functions and of related Gaussian quadrature formulae\",\n            BIT, 42 (2002), pp. 110-118, <a href=\"https://doi.org/10.1023/A:1021974203359\" target=\"_top\">https://doi.org/10.1023/A:1021974203359</a>\n            that is also available as <a href=\"https://www.cs.purdue.edu/homes/wxg/selected_works/section_02/169.pdf\" target=\"_top\">Gautschi_169.pdf</a>.\n          </p>\n<p>\n            This Gauss-Laguerre quadrature is designed for <code class=\"computeroutput\"><span class=\"identifier\">airy_ai</span><span class=\"special\">(</span><span class=\"identifier\">x</span><span class=\"special\">)</span></code> with real-valued <code class=\"computeroutput\"><span class=\"identifier\">x</span>\n            <span class=\"special\">&gt;=</span> <span class=\"number\">1</span></code>.\n          </p>\n<p>\n            The example uses Gauss-Laguerre quadrature integration to compute <code class=\"computeroutput\"><span class=\"identifier\">airy_ai</span><span class=\"special\">(</span><span class=\"identifier\">x</span> <span class=\"special\">/</span> <span class=\"number\">7</span><span class=\"special\">)</span></code> with\n            <code class=\"computeroutput\"><span class=\"number\">7</span> <span class=\"special\">&lt;=</span>\n            <span class=\"identifier\">x</span> <span class=\"special\">&lt;=</span>\n            <span class=\"number\">120</span></code> and where <code class=\"computeroutput\"><span class=\"identifier\">x</span></code>\n            is incremented in steps of 1.\n          </p>\n<p>\n            During development of this example, we have empirically found the numbers\n            of Gauss-Laguerre coefficients needed for convergence when using various\n            counts of base-10 digits.\n          </p>\n<p>\n            Let's calibrate, for instance, the number of coefficients needed at the\n            point <code class=\"computeroutput\"><span class=\"identifier\">x</span> <span class=\"special\">=</span>\n            <span class=\"number\">1</span></code>.\n          </p>\n<p>\n            Empirical data were used with <a href=\"http://www.wolframalpha.com/\" target=\"_top\">Wolfram\n            Alpha</a> :\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">Fit</span><span class=\"special\">[{{</span><span class=\"number\">21.0</span><span class=\"special\">,</span> <span class=\"number\">3.5</span><span class=\"special\">},</span> <span class=\"special\">{</span><span class=\"number\">51.0</span><span class=\"special\">,</span> <span class=\"number\">11.1</span><span class=\"special\">},</span> <span class=\"special\">{</span><span class=\"number\">101.0</span><span class=\"special\">,</span> <span class=\"number\">22.5</span><span class=\"special\">},</span> <span class=\"special\">{</span><span class=\"number\">201.0</span><span class=\"special\">,</span> <span class=\"number\">46.8</span><span class=\"special\">}},</span> <span class=\"special\">{</span><span class=\"number\">1</span><span class=\"special\">,</span> <span class=\"identifier\">d</span><span class=\"special\">,</span> <span class=\"identifier\">d</span><span class=\"special\">^</span><span class=\"number\">2</span><span class=\"special\">},</span> <span class=\"identifier\">d</span><span class=\"special\">]</span><span class=\"identifier\">FullSimplify</span><span class=\"special\">[%]</span>\n  <span class=\"number\">0.0000178915</span> <span class=\"identifier\">d</span><span class=\"special\">^</span><span class=\"number\">2</span> <span class=\"special\">+</span> <span class=\"number\">0.235487</span> <span class=\"identifier\">d</span> <span class=\"special\">-</span> <span class=\"number\">1.28301</span>\n  <span class=\"keyword\">or</span>\n  <span class=\"special\">-</span><span class=\"number\">1.28301</span> <span class=\"special\">+</span> <span class=\"special\">(</span><span class=\"number\">0.235487</span> <span class=\"special\">+</span> <span class=\"number\">0.0000178915</span> <span class=\"identifier\">d</span><span class=\"special\">)</span> <span class=\"identifier\">d</span>\n</pre>\n<p>\n            We need significantly more coefficients at smaller real values than are\n            needed at larger real values because the slope derivative of <code class=\"computeroutput\"><span class=\"identifier\">airy_ai</span><span class=\"special\">(</span><span class=\"identifier\">x</span><span class=\"special\">)</span></code>\n            gets more steep as x approaches zero. <code class=\"computeroutput\"><span class=\"identifier\">laguerre_order</span></code>\n            is calculated using this equation.\n          </p>\n<p>\n            Snippets from (copious) output from a progress bar during calculation\n            of approximate root estimates followed by calculation of accurate abscissa\n            and weights is:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">local</span><span class=\"special\">::</span><span class=\"identifier\">float_type</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">:</span> <span class=\"number\">101</span>\n<span class=\"identifier\">laguerre_order</span><span class=\"special\">:</span> <span class=\"number\">2291</span>\n\n<span class=\"identifier\">Finding</span> <span class=\"identifier\">the</span> <span class=\"identifier\">approximate</span> <span class=\"identifier\">roots</span><span class=\"special\">...</span>\n<span class=\"identifier\">root_estimates</span><span class=\"special\">.</span><span class=\"identifier\">size</span><span class=\"special\">():</span> <span class=\"number\">1</span><span class=\"special\">,</span> <span class=\"number\">0.0</span><span class=\"special\">%</span>\n<span class=\"identifier\">root_estimates</span><span class=\"special\">.</span><span class=\"identifier\">size</span><span class=\"special\">():</span> <span class=\"number\">8</span><span class=\"special\">,</span> <span class=\"number\">0.3</span><span class=\"special\">%</span>\n<span class=\"identifier\">root_estimates</span><span class=\"special\">.</span><span class=\"identifier\">size</span><span class=\"special\">():</span> <span class=\"number\">16</span><span class=\"special\">,</span> <span class=\"number\">0.7</span><span class=\"special\">%</span>\n<span class=\"special\">...</span>\n<span class=\"identifier\">root_estimates</span><span class=\"special\">.</span><span class=\"identifier\">size</span><span class=\"special\">():</span> <span class=\"number\">2288</span><span class=\"special\">,</span> <span class=\"number\">99.9</span><span class=\"special\">%</span>\n<span class=\"identifier\">root_estimates</span><span class=\"special\">.</span><span class=\"identifier\">size</span><span class=\"special\">():</span> <span class=\"number\">2291</span><span class=\"special\">,</span> <span class=\"number\">100.0</span><span class=\"special\">%</span>\n\n\n<span class=\"identifier\">Calculating</span> <span class=\"identifier\">abscissas</span> <span class=\"keyword\">and</span> <span class=\"identifier\">weights</span><span class=\"special\">.</span> <span class=\"identifier\">Processed</span> <span class=\"number\">1</span><span class=\"special\">,</span> <span class=\"number\">0.0</span><span class=\"special\">%</span>\n<span class=\"identifier\">Calculating</span> <span class=\"identifier\">abscissas</span> <span class=\"keyword\">and</span> <span class=\"identifier\">weights</span><span class=\"special\">.</span> <span class=\"identifier\">Processed</span> <span class=\"number\">9</span><span class=\"special\">,</span> <span class=\"number\">0.4</span><span class=\"special\">%</span>\n<span class=\"special\">...</span>\n<span class=\"identifier\">Calculating</span> <span class=\"identifier\">abscissas</span> <span class=\"keyword\">and</span> <span class=\"identifier\">weights</span><span class=\"special\">.</span> <span class=\"identifier\">Processed</span> <span class=\"number\">2289</span><span class=\"special\">,</span> <span class=\"number\">99.9</span><span class=\"special\">%</span>\n<span class=\"identifier\">Calculating</span> <span class=\"identifier\">abscissas</span> <span class=\"keyword\">and</span> <span class=\"identifier\">weights</span><span class=\"special\">.</span> <span class=\"identifier\">Processed</span> <span class=\"number\">2291</span><span class=\"special\">,</span> <span class=\"number\">100.0</span><span class=\"special\">%</span>\n</pre>\n<p>\n            Finally the result using Gauss-Laguerre quadrature is compared with a\n            calculation using <code class=\"computeroutput\"><span class=\"identifier\">cyl_bessel_k</span></code>,\n            and both are listed, finally confirming that none differ more than a\n            small tolerance.\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">airy_ai_value</span>  <span class=\"special\">:</span> <span class=\"number\">0.13529241631288141552414742351546630617494414298833070600910205475763353480226572366348710990874867334</span>\n<span class=\"identifier\">airy_ai_control</span><span class=\"special\">:</span> <span class=\"number\">0.13529241631288141552414742351546630617494414298833070600910205475763353480226572366348710990874868323</span>\n<span class=\"identifier\">airy_ai_value</span>  <span class=\"special\">:</span> <span class=\"number\">0.11392302126009621102904231059693500086750049240884734708541630001378825889924647699516200868335286103</span>\n<span class=\"identifier\">airy_ai_control</span><span class=\"special\">:</span> <span class=\"number\">0.1139230212600962110290423105969350008675004924088473470854163000137882588992464769951620086833528582</span>\n<span class=\"special\">...</span>\n<span class=\"identifier\">airy_ai_value</span>  <span class=\"special\">:</span> <span class=\"number\">3.8990420982303275013276114626640705170145070824317976771461533035231088620152288641360519429331427451e-22</span>\n<span class=\"identifier\">airy_ai_control</span><span class=\"special\">:</span> <span class=\"number\">3.8990420982303275013276114626640705170145070824317976771461533035231088620152288641360519429331426481e-22</span>\n\n<span class=\"identifier\">Total</span><span class=\"special\">...</span> <span class=\"identifier\">result_is_ok</span><span class=\"special\">:</span> <span class=\"keyword\">true</span>\n</pre>\n<p>\n            For more detail see comments in the source code for this example at\n            <a href=\"http://www.boost.org/doc/libs/release/libs/multiprecision/doc/html/../../example/gauss_laguerre_quadrature.cpp\" target=\"_top\">gauss_laguerre_quadrature.cpp</a>.\n          </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"variable_precision.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../fp_eg.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../../interval.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/floats/fp_eg/gi.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Calculating an Integral</title>\n<link rel=\"stylesheet\" href=\"../../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../fp_eg.html\" title=\"Examples\">\n<link rel=\"prev\" href=\"nd.html\" title=\"Calculating a Derivative\">\n<link rel=\"next\" href=\"poly_eg.html\" title=\"Polynomial Evaluation\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"nd.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../fp_eg.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"poly_eg.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h5 class=\"title\">\n<a name=\"boost_multiprecision.tut.floats.fp_eg.gi\"></a><a class=\"link\" href=\"gi.html\" title=\"Calculating an Integral\">Calculating\n          an Integral</a>\n</h5></div></div></div>\n<p>\n            Similar to the generic derivative example, we can calculate integrals\n            in a similar manner:\n          </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span><span class=\"special\">&lt;</span><span class=\"keyword\">typename</span> <span class=\"identifier\">value_type</span><span class=\"special\">,</span> <span class=\"keyword\">typename</span> <span class=\"identifier\">function_type</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">inline</span> <span class=\"identifier\">value_type</span> <span class=\"identifier\">integral</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span> <span class=\"identifier\">a</span><span class=\"special\">,</span>\n                           <span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span> <span class=\"identifier\">b</span><span class=\"special\">,</span>\n                           <span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span> <span class=\"identifier\">tol</span><span class=\"special\">,</span>\n                           <span class=\"identifier\">function_type</span> <span class=\"identifier\">func</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">unsigned</span> <span class=\"identifier\">n</span> <span class=\"special\">=</span> <span class=\"number\">1U</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">value_type</span> <span class=\"identifier\">h</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"identifier\">b</span> <span class=\"special\">-</span> <span class=\"identifier\">a</span><span class=\"special\">);</span>\n   <span class=\"identifier\">value_type</span> <span class=\"identifier\">I</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"identifier\">func</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">)</span> <span class=\"special\">+</span> <span class=\"identifier\">func</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">))</span> <span class=\"special\">*</span> <span class=\"special\">(</span><span class=\"identifier\">h</span> <span class=\"special\">/</span> <span class=\"number\">2</span><span class=\"special\">);</span>\n\n   <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">k</span> <span class=\"special\">=</span> <span class=\"number\">0U</span><span class=\"special\">;</span> <span class=\"identifier\">k</span> <span class=\"special\">&lt;</span> <span class=\"number\">8U</span><span class=\"special\">;</span> <span class=\"identifier\">k</span><span class=\"special\">++)</span>\n   <span class=\"special\">{</span>\n      <span class=\"identifier\">h</span> <span class=\"special\">/=</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n\n      <span class=\"identifier\">value_type</span> <span class=\"identifier\">sum</span><span class=\"special\">(</span><span class=\"number\">0</span><span class=\"special\">);</span>\n      <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">j</span> <span class=\"special\">=</span> <span class=\"number\">1U</span><span class=\"special\">;</span> <span class=\"identifier\">j</span> <span class=\"special\">&lt;=</span> <span class=\"identifier\">n</span><span class=\"special\">;</span> <span class=\"identifier\">j</span><span class=\"special\">++)</span>\n      <span class=\"special\">{</span>\n         <span class=\"identifier\">sum</span> <span class=\"special\">+=</span> <span class=\"identifier\">func</span><span class=\"special\">(</span><span class=\"identifier\">a</span> <span class=\"special\">+</span> <span class=\"special\">(</span><span class=\"identifier\">value_type</span><span class=\"special\">((</span><span class=\"identifier\">j</span> <span class=\"special\">*</span> <span class=\"number\">2</span><span class=\"special\">)</span> <span class=\"special\">-</span> <span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"special\">*</span> <span class=\"identifier\">h</span><span class=\"special\">));</span>\n      <span class=\"special\">}</span>\n\n      <span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span> <span class=\"identifier\">I0</span> <span class=\"special\">=</span> <span class=\"identifier\">I</span><span class=\"special\">;</span>\n      <span class=\"identifier\">I</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"identifier\">I</span> <span class=\"special\">/</span> <span class=\"number\">2</span><span class=\"special\">)</span> <span class=\"special\">+</span> <span class=\"special\">(</span><span class=\"identifier\">h</span> <span class=\"special\">*</span> <span class=\"identifier\">sum</span><span class=\"special\">);</span>\n\n      <span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span> <span class=\"identifier\">ratio</span>     <span class=\"special\">=</span> <span class=\"identifier\">I0</span> <span class=\"special\">/</span> <span class=\"identifier\">I</span><span class=\"special\">;</span>\n      <span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span> <span class=\"identifier\">delta</span>     <span class=\"special\">=</span> <span class=\"identifier\">ratio</span> <span class=\"special\">-</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n      <span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span> <span class=\"identifier\">delta_abs</span> <span class=\"special\">=</span> <span class=\"special\">((</span><span class=\"identifier\">delta</span> <span class=\"special\">&lt;</span> <span class=\"number\">0</span><span class=\"special\">)</span> <span class=\"special\">?</span> <span class=\"special\">-</span><span class=\"identifier\">delta</span> <span class=\"special\">:</span> <span class=\"identifier\">delta</span><span class=\"special\">);</span>\n\n      <span class=\"keyword\">if</span><span class=\"special\">((</span><span class=\"identifier\">k</span> <span class=\"special\">&gt;</span> <span class=\"number\">1U</span><span class=\"special\">)</span> <span class=\"special\">&amp;&amp;</span> <span class=\"special\">(</span><span class=\"identifier\">delta_abs</span> <span class=\"special\">&lt;</span> <span class=\"identifier\">tol</span><span class=\"special\">))</span>\n      <span class=\"special\">{</span>\n         <span class=\"keyword\">break</span><span class=\"special\">;</span>\n      <span class=\"special\">}</span>\n\n      <span class=\"identifier\">n</span> <span class=\"special\">*=</span> <span class=\"number\">2U</span><span class=\"special\">;</span>\n   <span class=\"special\">}</span>\n\n   <span class=\"keyword\">return</span> <span class=\"identifier\">I</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n            The following sample program shows how the function can be called, we\n            begin by defining a function object, which when integrated should yield\n            the Bessel J function:\n          </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span><span class=\"special\">&lt;</span><span class=\"keyword\">typename</span> <span class=\"identifier\">value_type</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">cyl_bessel_j_integral_rep</span>\n<span class=\"special\">{</span>\n<span class=\"keyword\">public</span><span class=\"special\">:</span>\n   <span class=\"identifier\">cyl_bessel_j_integral_rep</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">N</span><span class=\"special\">,</span>\n      <span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span><span class=\"special\">&amp;</span> <span class=\"identifier\">X</span><span class=\"special\">)</span> <span class=\"special\">:</span> <span class=\"identifier\">n</span><span class=\"special\">(</span><span class=\"identifier\">N</span><span class=\"special\">),</span> <span class=\"identifier\">x</span><span class=\"special\">(</span><span class=\"identifier\">X</span><span class=\"special\">)</span> <span class=\"special\">{</span> <span class=\"special\">}</span>\n\n   <span class=\"identifier\">value_type</span> <span class=\"keyword\">operator</span><span class=\"special\">()(</span><span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span><span class=\"special\">&amp;</span> <span class=\"identifier\">t</span><span class=\"special\">)</span> <span class=\"keyword\">const</span>\n   <span class=\"special\">{</span>\n      <span class=\"comment\">// pi * Jn(x) = Int_0^pi [cos(x * sin(t) - n*t) dt]</span>\n      <span class=\"keyword\">return</span> <span class=\"identifier\">cos</span><span class=\"special\">(</span><span class=\"identifier\">x</span> <span class=\"special\">*</span> <span class=\"identifier\">sin</span><span class=\"special\">(</span><span class=\"identifier\">t</span><span class=\"special\">)</span> <span class=\"special\">-</span> <span class=\"special\">(</span><span class=\"identifier\">n</span> <span class=\"special\">*</span> <span class=\"identifier\">t</span><span class=\"special\">));</span>\n   <span class=\"special\">}</span>\n\n<span class=\"keyword\">private</span><span class=\"special\">:</span>\n   <span class=\"keyword\">const</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">n</span><span class=\"special\">;</span>\n   <span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span> <span class=\"identifier\">x</span><span class=\"special\">;</span>\n<span class=\"special\">};</span>\n</pre>\n<pre class=\"programlisting\">   <span class=\"comment\">/* The function can now be called as follows: */</span>\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">(</span><span class=\"keyword\">int</span><span class=\"special\">,</span> <span class=\"keyword\">char</span><span class=\"special\">**)</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">constants</span><span class=\"special\">::</span><span class=\"identifier\">pi</span><span class=\"special\">;</span>\n   <span class=\"keyword\">typedef</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_dec_float_50</span> <span class=\"identifier\">mp_type</span><span class=\"special\">;</span>\n\n   <span class=\"keyword\">const</span> <span class=\"keyword\">float</span> <span class=\"identifier\">j2_f</span> <span class=\"special\">=</span>\n      <span class=\"identifier\">integral</span><span class=\"special\">(</span><span class=\"number\">0.0F</span><span class=\"special\">,</span>\n      <span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"keyword\">float</span><span class=\"special\">&gt;(),</span>\n      <span class=\"number\">0.01F</span><span class=\"special\">,</span>\n      <span class=\"identifier\">cyl_bessel_j_integral_rep</span><span class=\"special\">&lt;</span><span class=\"keyword\">float</span><span class=\"special\">&gt;(</span><span class=\"number\">2U</span><span class=\"special\">,</span> <span class=\"number\">1.23F</span><span class=\"special\">))</span> <span class=\"special\">/</span> <span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"keyword\">float</span><span class=\"special\">&gt;();</span>\n\n   <span class=\"keyword\">const</span> <span class=\"keyword\">double</span> <span class=\"identifier\">j2_d</span> <span class=\"special\">=</span>\n      <span class=\"identifier\">integral</span><span class=\"special\">(</span><span class=\"number\">0.0</span><span class=\"special\">,</span>\n      <span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;(),</span>\n      <span class=\"number\">0.0001</span><span class=\"special\">,</span>\n      <span class=\"identifier\">cyl_bessel_j_integral_rep</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;(</span><span class=\"number\">2U</span><span class=\"special\">,</span> <span class=\"number\">1.23</span><span class=\"special\">))</span> <span class=\"special\">/</span> <span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;();</span>\n\n   <span class=\"keyword\">const</span> <span class=\"identifier\">mp_type</span> <span class=\"identifier\">j2_mp</span> <span class=\"special\">=</span>\n      <span class=\"identifier\">integral</span><span class=\"special\">(</span><span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"number\">0</span><span class=\"special\">),</span>\n      <span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"identifier\">mp_type</span><span class=\"special\">&gt;(),</span>\n      <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"number\">1.0E-20</span><span class=\"special\">),</span>\n      <span class=\"identifier\">cyl_bessel_j_integral_rep</span><span class=\"special\">&lt;</span><span class=\"identifier\">mp_type</span><span class=\"special\">&gt;(</span><span class=\"number\">2U</span><span class=\"special\">,</span> <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"number\">123</span><span class=\"special\">)</span> <span class=\"special\">/</span> <span class=\"number\">100</span><span class=\"special\">))</span> <span class=\"special\">/</span> <span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"identifier\">mp_type</span><span class=\"special\">&gt;();</span>\n\n   <span class=\"comment\">// 0.166369</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">float</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">)</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">j2_f</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// 0.166369383786814</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">)</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">j2_d</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// 0.16636938378681407351267852431513159437103348245333</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">mp_type</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">)</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">j2_mp</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Print true value for comparison:</span>\n   <span class=\"comment\">// 0.166369383786814073512678524315131594371033482453329</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">cyl_bessel_j</span><span class=\"special\">(</span><span class=\"number\">2</span><span class=\"special\">,</span> <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"number\">123</span><span class=\"special\">)</span> <span class=\"special\">/</span> <span class=\"number\">100</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"nd.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../fp_eg.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"poly_eg.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/floats/fp_eg/jel.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Defining a Special Function.</title>\n<link rel=\"stylesheet\" href=\"../../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../fp_eg.html\" title=\"Examples\">\n<link rel=\"prev\" href=\"caveats.html\" title=\"Drop-in Caveats\">\n<link rel=\"next\" href=\"nd.html\" title=\"Calculating a Derivative\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"caveats.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../fp_eg.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"nd.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h5 class=\"title\">\n<a name=\"boost_multiprecision.tut.floats.fp_eg.jel\"></a><a class=\"link\" href=\"jel.html\" title=\"Defining a Special Function.\">Defining\n          a Special Function.</a>\n</h5></div></div></div>\n<p>\n            In this example we'll show several implementations of the <a href=\"http://mathworld.wolfram.com/LambdaFunction.html\" target=\"_top\">Jahnke\n            and Emden Lambda function</a>, each implementation a little more\n            sophisticated than the last.\n          </p>\n<p>\n            The Jahnke-Emden Lambda function is defined by the equation:\n          </p>\n<div class=\"blockquote\"><blockquote class=\"blockquote\"><p>\n              <span class=\"emphasis\"><em>JahnkeEmden(v, z) = Γ(v+1) * J<sub>v</sub>(z) / (z / 2)<sup>v</sup></em></span>\n            </p></blockquote></div>\n<p>\n            If we were to implement this at double precision using Boost.Math's facilities\n            for the Gamma and Bessel function calls it would look like this:\n          </p>\n<pre class=\"programlisting\"><span class=\"keyword\">double</span> <span class=\"identifier\">JEL1</span><span class=\"special\">(</span><span class=\"keyword\">double</span> <span class=\"identifier\">v</span><span class=\"special\">,</span> <span class=\"keyword\">double</span> <span class=\"identifier\">z</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">return</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tgamma</span><span class=\"special\">(</span><span class=\"identifier\">v</span> <span class=\"special\">+</span> <span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"special\">*</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">cyl_bessel_j</span><span class=\"special\">(</span><span class=\"identifier\">v</span><span class=\"special\">,</span> <span class=\"identifier\">z</span><span class=\"special\">)</span> <span class=\"special\">/</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">pow</span><span class=\"special\">(</span><span class=\"identifier\">z</span> <span class=\"special\">/</span> <span class=\"number\">2</span><span class=\"special\">,</span> <span class=\"identifier\">v</span><span class=\"special\">);</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n            Calling this function as:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">scientific</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">JEL1</span><span class=\"special\">(</span><span class=\"number\">2.5</span><span class=\"special\">,</span> <span class=\"number\">0.5</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n</pre>\n<p>\n            Yields the output:\n          </p>\n<pre class=\"programlisting\">9.822663964796047e-001</pre>\n<p>\n            Now let's implement the function again, but this time using the multiprecision\n            type <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float_50</span></code>\n            as the argument type:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_dec_float_50</span>\n   <span class=\"identifier\">JEL2</span><span class=\"special\">(</span><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_dec_float_50</span> <span class=\"identifier\">v</span><span class=\"special\">,</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_dec_float_50</span> <span class=\"identifier\">z</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">return</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tgamma</span><span class=\"special\">(</span><span class=\"identifier\">v</span> <span class=\"special\">+</span> <span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"special\">*</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">cyl_bessel_j</span><span class=\"special\">(</span><span class=\"identifier\">v</span><span class=\"special\">,</span> <span class=\"identifier\">z</span><span class=\"special\">)</span> <span class=\"special\">/</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">pow</span><span class=\"special\">(</span><span class=\"identifier\">z</span> <span class=\"special\">/</span> <span class=\"number\">2</span><span class=\"special\">,</span> <span class=\"identifier\">v</span><span class=\"special\">);</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n            The implementation is almost the same as before, but with one key difference\n            - we can no longer call <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">pow</span></code>,\n            instead we must call the version inside the <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span></code>\n            namespace. In point of fact, we could have omitted the namespace prefix\n            on the call to <code class=\"computeroutput\"><span class=\"identifier\">pow</span></code> since\n            the right overload would have been found via <a href=\"http://en.wikipedia.org/wiki/Argument-dependent_name_lookup\" target=\"_top\">argument\n            dependent lookup</a> in any case.\n          </p>\n<p>\n            Note also that the first argument to <code class=\"computeroutput\"><span class=\"identifier\">pow</span></code>\n            along with the argument to <code class=\"computeroutput\"><span class=\"identifier\">tgamma</span></code>\n            in the above code are actually expression templates. The <code class=\"computeroutput\"><span class=\"identifier\">pow</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">tgamma</span></code>\n            functions will handle these arguments just fine.\n          </p>\n<p>\n            Here's an example of how the function may be called:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">scientific</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">JEL2</span><span class=\"special\">(</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">(</span><span class=\"number\">2.5</span><span class=\"special\">),</span> <span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">(</span><span class=\"number\">0.5</span><span class=\"special\">))</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n</pre>\n<p>\n            Which outputs:\n          </p>\n<pre class=\"programlisting\">9.82266396479604757017335009796882833995903762577173e-01</pre>\n<p>\n            Now that we've seen some non-template examples, lets repeat the code\n            again, but this time as a template that can be called either with a builtin\n            type (<code class=\"computeroutput\"><span class=\"keyword\">float</span></code>, <code class=\"computeroutput\"><span class=\"keyword\">double</span></code> etc), or with a multiprecision\n            type:\n          </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Float</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">Float</span> <span class=\"identifier\">JEL3</span><span class=\"special\">(</span><span class=\"identifier\">Float</span> <span class=\"identifier\">v</span><span class=\"special\">,</span> <span class=\"identifier\">Float</span> <span class=\"identifier\">z</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">pow</span><span class=\"special\">;</span>\n   <span class=\"keyword\">return</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tgamma</span><span class=\"special\">(</span><span class=\"identifier\">v</span> <span class=\"special\">+</span> <span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"special\">*</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">cyl_bessel_j</span><span class=\"special\">(</span><span class=\"identifier\">v</span><span class=\"special\">,</span> <span class=\"identifier\">z</span><span class=\"special\">)</span> <span class=\"special\">/</span> <span class=\"identifier\">pow</span><span class=\"special\">(</span><span class=\"identifier\">z</span> <span class=\"special\">/</span> <span class=\"number\">2</span><span class=\"special\">,</span> <span class=\"identifier\">v</span><span class=\"special\">);</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n            Once again the code is almost the same as before, but the call to <code class=\"computeroutput\"><span class=\"identifier\">pow</span></code> has changed yet again. We need\n            the call to resolve to either <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">pow</span></code>\n            (when the argument is a builtin type), or to <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">pow</span></code>\n            (when the argument is a multiprecision type). We do that by making the\n            call unqualified so that versions of <code class=\"computeroutput\"><span class=\"identifier\">pow</span></code>\n            defined in the same namespace as type <code class=\"computeroutput\"><span class=\"identifier\">Float</span></code>\n            are found via argument dependent lookup, while the <code class=\"computeroutput\"><span class=\"keyword\">using</span>\n            <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">pow</span></code> directive makes the standard library\n            versions visible for builtin floating point types.\n          </p>\n<p>\n            Let's call the function with both <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>\n            and multiprecision arguments:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">scientific</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">JEL3</span><span class=\"special\">(</span><span class=\"number\">2.5</span><span class=\"special\">,</span> <span class=\"number\">0.5</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">scientific</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">JEL3</span><span class=\"special\">(</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">(</span><span class=\"number\">2.5</span><span class=\"special\">),</span> <span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">(</span><span class=\"number\">0.5</span><span class=\"special\">))</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n</pre>\n<p>\n            Which outputs:\n          </p>\n<pre class=\"programlisting\">9.822663964796047e-001\n9.82266396479604757017335009796882833995903762577173e-01\n</pre>\n<p>\n            Unfortunately there is a problem with this version: if we were to call\n            it like this:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_dec_float_50</span> <span class=\"identifier\">v</span><span class=\"special\">(</span><span class=\"number\">2</span><span class=\"special\">),</span> <span class=\"identifier\">z</span><span class=\"special\">(</span><span class=\"number\">0.5</span><span class=\"special\">);</span>\n<span class=\"identifier\">JEL3</span><span class=\"special\">(</span><span class=\"identifier\">v</span> <span class=\"special\">+</span> <span class=\"number\">0.5</span><span class=\"special\">,</span> <span class=\"identifier\">z</span><span class=\"special\">);</span>\n</pre>\n<p>\n            Then we would get a long and inscrutable error message from the compiler:\n            the problem here is that the first argument to <code class=\"computeroutput\"><span class=\"identifier\">JEL3</span></code>\n            is not a number type, but an expression template. We could obviously\n            add a typecast to fix the issue:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">JEL</span><span class=\"special\">(</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">(</span><span class=\"identifier\">v</span> <span class=\"special\">+</span> <span class=\"number\">0.5</span><span class=\"special\">),</span> <span class=\"identifier\">z</span><span class=\"special\">);</span>\n</pre>\n<p>\n            However, if we want the function JEL to be truly reusable, then a better\n            solution might be preferred. To achieve this we can borrow some code\n            from Boost.Math which calculates the return type of mixed-argument functions,\n            here's how the new code looks now:\n          </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Float1</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Float2</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">typename</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tools</span><span class=\"special\">::</span><span class=\"identifier\">promote_args</span><span class=\"special\">&lt;</span><span class=\"identifier\">Float1</span><span class=\"special\">,</span> <span class=\"identifier\">Float2</span><span class=\"special\">&gt;::</span><span class=\"identifier\">type</span>\n   <span class=\"identifier\">JEL4</span><span class=\"special\">(</span><span class=\"identifier\">Float1</span> <span class=\"identifier\">v</span><span class=\"special\">,</span> <span class=\"identifier\">Float2</span> <span class=\"identifier\">z</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">pow</span><span class=\"special\">;</span>\n   <span class=\"keyword\">return</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tgamma</span><span class=\"special\">(</span><span class=\"identifier\">v</span> <span class=\"special\">+</span> <span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"special\">*</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">cyl_bessel_j</span><span class=\"special\">(</span><span class=\"identifier\">v</span><span class=\"special\">,</span> <span class=\"identifier\">z</span><span class=\"special\">)</span> <span class=\"special\">/</span> <span class=\"identifier\">pow</span><span class=\"special\">(</span><span class=\"identifier\">z</span> <span class=\"special\">/</span> <span class=\"number\">2</span><span class=\"special\">,</span> <span class=\"identifier\">v</span><span class=\"special\">);</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n            As you can see the two arguments to the function are now separate template\n            types, and the return type is computed using the <code class=\"computeroutput\"><span class=\"identifier\">promote_args</span></code>\n            metafunction from Boost.Math.\n          </p>\n<p>\n            Now we can call:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">scientific</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float_100</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">JEL4</span><span class=\"special\">(</span><span class=\"identifier\">cpp_dec_float_100</span><span class=\"special\">(</span><span class=\"number\">2</span><span class=\"special\">)</span> <span class=\"special\">+</span> <span class=\"number\">0.5</span><span class=\"special\">,</span> <span class=\"identifier\">cpp_dec_float_100</span><span class=\"special\">(</span><span class=\"number\">0.5</span><span class=\"special\">))</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n</pre>\n<p>\n            And get 100 digits of output:\n          </p>\n<pre class=\"programlisting\">9.8226639647960475701733500979688283399590376257717309069410413822165082248153638454147004236848917775e-01</pre>\n<p>\n            As a bonus, we can now call the function not just with expression templates,\n            but with other mixed types as well: for example <code class=\"computeroutput\"><span class=\"keyword\">float</span></code>\n            and <code class=\"computeroutput\"><span class=\"keyword\">double</span></code> or <code class=\"computeroutput\"><span class=\"keyword\">int</span></code> and <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>,\n            and the correct return type will be computed in each case.\n          </p>\n<p>\n            Note that while in this case we didn't have to change the body of the\n            function, in the general case any function like this which creates local\n            variables internally would have to use <code class=\"computeroutput\"><span class=\"identifier\">promote_args</span></code>\n            to work out what type those variables should be, for example:\n          </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Float1</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Float2</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">typename</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tools</span><span class=\"special\">::</span><span class=\"identifier\">promote_args</span><span class=\"special\">&lt;</span><span class=\"identifier\">Float1</span><span class=\"special\">,</span> <span class=\"identifier\">Float2</span><span class=\"special\">&gt;::</span><span class=\"identifier\">type</span>\n   <span class=\"identifier\">JEL5</span><span class=\"special\">(</span><span class=\"identifier\">Float1</span> <span class=\"identifier\">v</span><span class=\"special\">,</span> <span class=\"identifier\">Float2</span> <span class=\"identifier\">z</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">pow</span><span class=\"special\">;</span>\n   <span class=\"keyword\">typedef</span> <span class=\"keyword\">typename</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tools</span><span class=\"special\">::</span><span class=\"identifier\">promote_args</span><span class=\"special\">&lt;</span><span class=\"identifier\">Float1</span><span class=\"special\">,</span> <span class=\"identifier\">Float2</span><span class=\"special\">&gt;::</span><span class=\"identifier\">type</span> <span class=\"identifier\">variable_type</span><span class=\"special\">;</span>\n   <span class=\"identifier\">variable_type</span> <span class=\"identifier\">t</span> <span class=\"special\">=</span> <span class=\"identifier\">pow</span><span class=\"special\">(</span><span class=\"identifier\">z</span> <span class=\"special\">/</span> <span class=\"number\">2</span><span class=\"special\">,</span> <span class=\"identifier\">v</span><span class=\"special\">);</span>\n   <span class=\"keyword\">return</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tgamma</span><span class=\"special\">(</span><span class=\"identifier\">v</span> <span class=\"special\">+</span> <span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"special\">*</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">cyl_bessel_j</span><span class=\"special\">(</span><span class=\"identifier\">v</span><span class=\"special\">,</span> <span class=\"identifier\">z</span><span class=\"special\">)</span> <span class=\"special\">/</span> <span class=\"identifier\">t</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"caveats.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../fp_eg.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"nd.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/floats/fp_eg/nd.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Calculating a Derivative</title>\n<link rel=\"stylesheet\" href=\"../../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../fp_eg.html\" title=\"Examples\">\n<link rel=\"prev\" href=\"jel.html\" title=\"Defining a Special Function.\">\n<link rel=\"next\" href=\"gi.html\" title=\"Calculating an Integral\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"jel.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../fp_eg.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"gi.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h5 class=\"title\">\n<a name=\"boost_multiprecision.tut.floats.fp_eg.nd\"></a><a class=\"link\" href=\"nd.html\" title=\"Calculating a Derivative\">Calculating\n          a Derivative</a>\n</h5></div></div></div>\n<p>\n            In this example we'll add even more power to generic numeric programming\n            using not only different floating-point types but also function objects\n            as template parameters. Consider some well-known central difference rules\n            for numerically computing the first derivative of a function <span class=\"emphasis\"><em>f′(x)</em></span>\n            with <span class=\"emphasis\"><em>x ∈ ℜ</em></span>:\n          </p>\n<p>\n            <span class=\"inlinemediaobject\"><img src=\"../../../../../floating_point_eg1.svg\"></span>\n          </p>\n<p>\n            Where the difference terms <span class=\"emphasis\"><em>m<sub>n</sub></em></span> are given by:\n          </p>\n<p>\n            <span class=\"inlinemediaobject\"><img src=\"../../../../../floating_point_eg2.svg\"></span>\n          </p>\n<p>\n            and <span class=\"emphasis\"><em>dx</em></span> is the step-size of the derivative.\n          </p>\n<p>\n            The third formula in Equation 1 is a three-point central difference rule.\n            It calculates the first derivative of <span class=\"emphasis\"><em>f′(x)</em></span> to <span class=\"emphasis\"><em>O(dx<sup>6</sup>)</em></span>,\n            where <span class=\"emphasis\"><em>dx</em></span> is the given step-size. For example, if\n            the step-size is 0.01 this derivative calculation has about 6 decimal\n            digits of precision - just about right for the 7 decimal digits of single-precision\n            float. Let's make a generic template subroutine using this three-point\n            central difference rule. In particular:\n          </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span><span class=\"special\">&lt;</span><span class=\"keyword\">typename</span> <span class=\"identifier\">value_type</span><span class=\"special\">,</span> <span class=\"keyword\">typename</span> <span class=\"identifier\">function_type</span><span class=\"special\">&gt;</span>\n   <span class=\"identifier\">value_type</span> <span class=\"identifier\">derivative</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span> <span class=\"identifier\">x</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span> <span class=\"identifier\">dx</span><span class=\"special\">,</span> <span class=\"identifier\">function_type</span> <span class=\"identifier\">func</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"comment\">// Compute d/dx[func(*first)] using a three-point</span>\n   <span class=\"comment\">// central difference rule of O(dx^6).</span>\n\n   <span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span> <span class=\"identifier\">dx1</span> <span class=\"special\">=</span> <span class=\"identifier\">dx</span><span class=\"special\">;</span>\n   <span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span> <span class=\"identifier\">dx2</span> <span class=\"special\">=</span> <span class=\"identifier\">dx1</span> <span class=\"special\">*</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n   <span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span> <span class=\"identifier\">dx3</span> <span class=\"special\">=</span> <span class=\"identifier\">dx1</span> <span class=\"special\">*</span> <span class=\"number\">3</span><span class=\"special\">;</span>\n\n   <span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span> <span class=\"identifier\">m1</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"identifier\">func</span><span class=\"special\">(</span><span class=\"identifier\">x</span> <span class=\"special\">+</span> <span class=\"identifier\">dx1</span><span class=\"special\">)</span> <span class=\"special\">-</span> <span class=\"identifier\">func</span><span class=\"special\">(</span><span class=\"identifier\">x</span> <span class=\"special\">-</span> <span class=\"identifier\">dx1</span><span class=\"special\">))</span> <span class=\"special\">/</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n   <span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span> <span class=\"identifier\">m2</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"identifier\">func</span><span class=\"special\">(</span><span class=\"identifier\">x</span> <span class=\"special\">+</span> <span class=\"identifier\">dx2</span><span class=\"special\">)</span> <span class=\"special\">-</span> <span class=\"identifier\">func</span><span class=\"special\">(</span><span class=\"identifier\">x</span> <span class=\"special\">-</span> <span class=\"identifier\">dx2</span><span class=\"special\">))</span> <span class=\"special\">/</span> <span class=\"number\">4</span><span class=\"special\">;</span>\n   <span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span> <span class=\"identifier\">m3</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"identifier\">func</span><span class=\"special\">(</span><span class=\"identifier\">x</span> <span class=\"special\">+</span> <span class=\"identifier\">dx3</span><span class=\"special\">)</span> <span class=\"special\">-</span> <span class=\"identifier\">func</span><span class=\"special\">(</span><span class=\"identifier\">x</span> <span class=\"special\">-</span> <span class=\"identifier\">dx3</span><span class=\"special\">))</span> <span class=\"special\">/</span> <span class=\"number\">6</span><span class=\"special\">;</span>\n\n   <span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span> <span class=\"identifier\">fifteen_m1</span> <span class=\"special\">=</span> <span class=\"number\">15</span> <span class=\"special\">*</span> <span class=\"identifier\">m1</span><span class=\"special\">;</span>\n   <span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span> <span class=\"identifier\">six_m2</span>     <span class=\"special\">=</span>  <span class=\"number\">6</span> <span class=\"special\">*</span> <span class=\"identifier\">m2</span><span class=\"special\">;</span>\n   <span class=\"keyword\">const</span> <span class=\"identifier\">value_type</span> <span class=\"identifier\">ten_dx1</span>    <span class=\"special\">=</span> <span class=\"number\">10</span> <span class=\"special\">*</span> <span class=\"identifier\">dx1</span><span class=\"special\">;</span>\n\n   <span class=\"keyword\">return</span> <span class=\"special\">((</span><span class=\"identifier\">fifteen_m1</span> <span class=\"special\">-</span> <span class=\"identifier\">six_m2</span><span class=\"special\">)</span> <span class=\"special\">+</span> <span class=\"identifier\">m3</span><span class=\"special\">)</span> <span class=\"special\">/</span> <span class=\"identifier\">ten_dx1</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n            The <code class=\"computeroutput\"><span class=\"identifier\">derivative</span><span class=\"special\">()</span></code>\n            template function can be used to compute the first derivative of any\n            function to <span class=\"emphasis\"><em>O(dx<sup>6</sup>)</em></span>. For example, consider the first\n            derivative of <span class=\"emphasis\"><em>sin(x)</em></span> evaluated at <span class=\"emphasis\"><em>x =\n            π/3</em></span>. In other words,\n          </p>\n<p>\n            <span class=\"inlinemediaobject\"><img src=\"../../../../../floating_point_eg3.svg\"></span>\n          </p>\n<p>\n            The code below computes the derivative in Equation 3 for float, double\n            and boost's multiple-precision type cpp_dec_float_50.\n          </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iomanip</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_dec_float</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">math</span><span class=\"special\">/</span><span class=\"identifier\">constants</span><span class=\"special\">/</span><span class=\"identifier\">constants</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">(</span><span class=\"keyword\">int</span><span class=\"special\">,</span> <span class=\"keyword\">char</span><span class=\"special\">**)</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">constants</span><span class=\"special\">::</span><span class=\"identifier\">pi</span><span class=\"special\">;</span>\n   <span class=\"keyword\">using</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">;</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// We'll pass a function pointer for the function object passed to derivative,</span>\n   <span class=\"comment\">// the typecast is needed to select the correct overload of std::sin:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"keyword\">const</span> <span class=\"keyword\">float</span> <span class=\"identifier\">d_f</span> <span class=\"special\">=</span> <span class=\"identifier\">derivative</span><span class=\"special\">(</span>\n      <span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"keyword\">float</span><span class=\"special\">&gt;()</span> <span class=\"special\">/</span> <span class=\"number\">3</span><span class=\"special\">,</span>\n      <span class=\"number\">0.01F</span><span class=\"special\">,</span>\n      <span class=\"keyword\">static_cast</span><span class=\"special\">&lt;</span><span class=\"keyword\">float</span><span class=\"special\">(*)(</span><span class=\"keyword\">float</span><span class=\"special\">)&gt;(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">sin</span><span class=\"special\">)</span>\n   <span class=\"special\">);</span>\n\n   <span class=\"keyword\">const</span> <span class=\"keyword\">double</span> <span class=\"identifier\">d_d</span> <span class=\"special\">=</span> <span class=\"identifier\">derivative</span><span class=\"special\">(</span>\n      <span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;()</span> <span class=\"special\">/</span> <span class=\"number\">3</span><span class=\"special\">,</span>\n      <span class=\"number\">0.001</span><span class=\"special\">,</span>\n      <span class=\"keyword\">static_cast</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">(*)(</span><span class=\"keyword\">double</span><span class=\"special\">)&gt;(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">sin</span><span class=\"special\">)</span>\n      <span class=\"special\">);</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// In the cpp_dec_float_50 case, the sin function is multiply overloaded</span>\n   <span class=\"comment\">// to handle expression templates etc.  As a result it's hard to take its</span>\n   <span class=\"comment\">// address without knowing about its implementation details.  We'll use a </span>\n   <span class=\"comment\">// C++11 lambda expression to capture the call.</span>\n   <span class=\"comment\">// We also need a typecast on the first argument so we don't accidentally pass</span>\n   <span class=\"comment\">// an expression template to a template function:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"keyword\">const</span> <span class=\"identifier\">cpp_dec_float_50</span> <span class=\"identifier\">d_mp</span> <span class=\"special\">=</span> <span class=\"identifier\">derivative</span><span class=\"special\">(</span>\n      <span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">(</span><span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">&gt;()</span> <span class=\"special\">/</span> <span class=\"number\">3</span><span class=\"special\">),</span>\n      <span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">(</span><span class=\"number\">1.0E-9</span><span class=\"special\">),</span>\n      <span class=\"special\">[](</span><span class=\"keyword\">const</span> <span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">&amp;</span> <span class=\"identifier\">x</span><span class=\"special\">)</span> <span class=\"special\">-&gt;</span> <span class=\"identifier\">cpp_dec_float_50</span>\n      <span class=\"special\">{</span>\n         <span class=\"keyword\">return</span> <span class=\"identifier\">sin</span><span class=\"special\">(</span><span class=\"identifier\">x</span><span class=\"special\">);</span>\n      <span class=\"special\">}</span>\n      <span class=\"special\">);</span>\n\n   <span class=\"comment\">// 5.000029e-001</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">float</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">)</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">d_f</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// 4.999999999998876e-001</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">)</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">d_d</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// 4.99999999999999999999999999999999999999999999999999e-01</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">)</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">d_mp</span>\n      <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n            The expected value of the derivative is 0.5. This central difference\n            rule in this example is ill-conditioned, meaning it suffers from slight\n            loss of precision. With that in mind, the results agree with the expected\n            value of 0.5.\n          </p>\n<p>\n            We can take this a step further and use our derivative function to compute\n            a partial derivative. For example if we take the incomplete gamma function\n            <span class=\"emphasis\"><em>P(a, z)</em></span>, and take the derivative with respect to\n            <span class=\"emphasis\"><em>z</em></span> at <span class=\"emphasis\"><em>(2,2)</em></span> then we can calculate\n            the result as shown below, for good measure we'll compare with the \"correct\"\n            result obtained from a call to <span class=\"emphasis\"><em>gamma_p_derivative</em></span>,\n            the results agree to approximately 44 digits:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">cpp_dec_float_50</span> <span class=\"identifier\">gd</span> <span class=\"special\">=</span> <span class=\"identifier\">derivative</span><span class=\"special\">(</span>\n   <span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">(</span><span class=\"number\">2</span><span class=\"special\">),</span>\n   <span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">(</span><span class=\"number\">1.0E-9</span><span class=\"special\">),</span>\n   <span class=\"special\">[](</span><span class=\"keyword\">const</span> <span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">&amp;</span> <span class=\"identifier\">x</span><span class=\"special\">)</span> <span class=\"special\">-&gt;</span><span class=\"identifier\">cpp_dec_float_50</span>\n   <span class=\"special\">{</span>\n      <span class=\"keyword\">return</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">gamma_p</span><span class=\"special\">(</span><span class=\"number\">2</span><span class=\"special\">,</span> <span class=\"identifier\">x</span><span class=\"special\">);</span>\n   <span class=\"special\">}</span>\n<span class=\"special\">);</span>\n<span class=\"comment\">// 2.70670566473225383787998989944968806815263091819151e-01</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span>\n   <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">)</span>\n   <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">gd</span>\n   <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"comment\">// 2.70670566473225383787998989944968806815253190143120e-01</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">gamma_p_derivative</span><span class=\"special\">(</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">(</span><span class=\"number\">2</span><span class=\"special\">),</span> <span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">(</span><span class=\"number\">2</span><span class=\"special\">))</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"jel.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../fp_eg.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"gi.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/floats/fp_eg/poly_eg.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Polynomial Evaluation</title>\n<link rel=\"stylesheet\" href=\"../../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../fp_eg.html\" title=\"Examples\">\n<link rel=\"prev\" href=\"gi.html\" title=\"Calculating an Integral\">\n<link rel=\"next\" href=\"variable_precision.html\" title=\"Variable-Precision Newton Evaluation\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"gi.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../fp_eg.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"variable_precision.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h5 class=\"title\">\n<a name=\"boost_multiprecision.tut.floats.fp_eg.poly_eg\"></a><a class=\"link\" href=\"poly_eg.html\" title=\"Polynomial Evaluation\">Polynomial\n          Evaluation</a>\n</h5></div></div></div>\n<p>\n            In this example we'll look at polynomial evaluation, this is not only\n            an important use case, but it's one that <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n            performs particularly well at because the expression templates <span class=\"emphasis\"><em>completely\n            eliminate all temporaries</em></span> from a <a href=\"http://en.wikipedia.org/wiki/Horner%27s_method\" target=\"_top\">Horner\n            polynomial evaluation scheme</a>.\n          </p>\n<p>\n            The following code evaluates <code class=\"computeroutput\"><span class=\"identifier\">sin</span><span class=\"special\">(</span><span class=\"identifier\">x</span><span class=\"special\">)</span></code> as a polynomial, accurate to at least\n            64 decimal places:\n          </p>\n<pre class=\"programlisting\"><span class=\"keyword\">using</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_dec_float</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float</span><span class=\"special\">&lt;</span><span class=\"number\">64</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">mp_type</span><span class=\"special\">;</span>\n\n<span class=\"identifier\">mp_type</span> <span class=\"identifier\">mysin</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">mp_type</span><span class=\"special\">&amp;</span> <span class=\"identifier\">x</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n  <span class=\"comment\">// Approximation of sin(x * pi/2) for -1 &lt;= x &lt;= 1, using an order 63 polynomial.</span>\n  <span class=\"keyword\">static</span> <span class=\"keyword\">const</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">array</span><span class=\"special\">&lt;</span><span class=\"identifier\">mp_type</span><span class=\"special\">,</span> <span class=\"number\">32U</span><span class=\"special\">&gt;</span> <span class=\"identifier\">coefs</span> <span class=\"special\">=</span>\n  <span class=\"special\">{{</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"+1.5707963267948966192313216916397514420985846996875529104874722961539082031431044993140174126711\"</span><span class=\"special\">),</span> <span class=\"comment\">//\"),</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"-0.64596409750624625365575656389794573337969351178927307696134454382929989411386887578263960484\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^3</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"+0.07969262624616704512050554949047802252091164235106119545663865720995702920146198554317279\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^5</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"-0.0046817541353186881006854639339534378594950280185010575749538605102665157913157426229824\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^7</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"+0.00016044118478735982187266087016347332970280754062061156858775174056686380286868007443\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^9</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"-3.598843235212085340458540018208389404888495232432127661083907575106196374913134E-6\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^11</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"+5.692172921967926811775255303592184372902829756054598109818158853197797542565E-8\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^13</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"-6.688035109811467232478226335783138689956270985704278659373558497256423498E-10\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^15</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"+6.066935731106195667101445665327140070166203261129845646380005577490472E-12\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^17</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"-4.377065467313742277184271313776319094862897030084226361576452003432E-14\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^19</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"+2.571422892860473866153865950420487369167895373255729246889168337E-16\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^21</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"-1.253899540535457665340073300390626396596970180355253776711660E-18\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^23</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"+5.15645517658028233395375998562329055050964428219501277474E-21\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^25</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"-1.812399312848887477410034071087545686586497030654642705E-23\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^27</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"+5.50728578652238583570585513920522536675023562254864E-26\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^29</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"-1.461148710664467988723468673933026649943084902958E-28\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^31</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"+3.41405297003316172502972039913417222912445427E-31\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^33</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"-7.07885550810745570069916712806856538290251E-34\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^35</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"+1.31128947968267628970845439024155655665E-36\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^37</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"-2.18318293181145698535113946654065918E-39\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^39</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"+3.28462680978498856345937578502923E-42\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^41</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"-4.48753699028101089490067137298E-45\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^43</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"+5.59219884208696457859353716E-48\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^45</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"-6.38214503973500471720565E-51\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^47</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"+6.69528558381794452556E-54\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^49</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"-6.47841373182350206E-57\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^51</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"+5.800016389666445E-60\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^53</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"-4.818507347289E-63\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^55</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"+3.724683686E-66\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^57</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"-2.6856479E-69\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^59</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"+1.81046E-72\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^61</span>\n    <span class=\"identifier\">mp_type</span><span class=\"special\">(</span><span class=\"string\">\"-1.133E-75\"</span><span class=\"special\">),</span> <span class=\"comment\">// ^63</span>\n  <span class=\"special\">}};</span>\n\n  <span class=\"keyword\">const</span> <span class=\"identifier\">mp_type</span> <span class=\"identifier\">v</span> <span class=\"special\">=</span> <span class=\"identifier\">x</span> <span class=\"special\">*</span> <span class=\"number\">2</span> <span class=\"special\">/</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">constants</span><span class=\"special\">::</span><span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"identifier\">mp_type</span><span class=\"special\">&gt;();</span>\n  <span class=\"keyword\">const</span> <span class=\"identifier\">mp_type</span> <span class=\"identifier\">x2</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"identifier\">v</span> <span class=\"special\">*</span> <span class=\"identifier\">v</span><span class=\"special\">);</span>\n  <span class=\"comment\">//</span>\n  <span class=\"comment\">// Polynomial evaluation follows, if mp_type allocates memory then</span>\n  <span class=\"comment\">// just one such allocation occurs - to initialize the variable \"sum\" -</span>\n  <span class=\"comment\">// and no temporaries are created at all.</span>\n  <span class=\"comment\">//</span>\n  <span class=\"keyword\">const</span> <span class=\"identifier\">mp_type</span> <span class=\"identifier\">sum</span> <span class=\"special\">=</span> <span class=\"special\">(((((((((((((((((((((((((((((((</span>     <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">31U</span><span class=\"special\">]</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">30U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">29U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">28U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">27U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">26U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">25U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">24U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">23U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">22U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">21U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">20U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">19U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">18U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">17U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">16U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">15U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">14U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">13U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">12U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">11U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">10U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">9U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">8U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">7U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">6U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">5U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">4U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">3U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">2U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">1U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">x2</span> <span class=\"special\">+</span> <span class=\"identifier\">coefs</span><span class=\"special\">[</span><span class=\"number\">0U</span><span class=\"special\">])</span>\n                                                     <span class=\"special\">*</span> <span class=\"identifier\">v</span><span class=\"special\">;</span>\n\n  <span class=\"keyword\">return</span> <span class=\"identifier\">sum</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n            Calling the function like so:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">mp_type</span> <span class=\"identifier\">pid4</span> <span class=\"special\">=</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">constants</span><span class=\"special\">::</span><span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"identifier\">mp_type</span><span class=\"special\">&gt;()</span> <span class=\"special\">/</span> <span class=\"number\">4</span><span class=\"special\">;</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span> <span class=\"special\">::</span><span class=\"identifier\">mp_type</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">scientific</span><span class=\"special\">;</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">mysin</span><span class=\"special\">(</span><span class=\"identifier\">pid4</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n</pre>\n<p>\n            Yields the expected output:\n          </p>\n<pre class=\"programlisting\">7.0710678118654752440084436210484903928483593768847403658833986900e-01</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"gi.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../fp_eg.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"variable_precision.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/floats/fp_eg/variable_precision.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Variable-Precision Newton Evaluation</title>\n<link rel=\"stylesheet\" href=\"../../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../fp_eg.html\" title=\"Examples\">\n<link rel=\"prev\" href=\"poly_eg.html\" title=\"Polynomial Evaluation\">\n<link rel=\"next\" href=\"gauss_lagerre_quadrature.html\" title=\"Gauss-Laguerre quadrature\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"poly_eg.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../fp_eg.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"gauss_lagerre_quadrature.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h5 class=\"title\">\n<a name=\"boost_multiprecision.tut.floats.fp_eg.variable_precision\"></a><a class=\"link\" href=\"variable_precision.html\" title=\"Variable-Precision Newton Evaluation\">Variable-Precision\n          Newton Evaluation</a>\n</h5></div></div></div>\n<p>\n            This example illustrates the use of variable-precision arithmetic with\n            the <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float</span></code> number\n            type. We'll calculate the median of the beta distribution to an absurdly\n            high precision and compare the accuracy and times taken for various methods.\n            That is, we want to calculate the value of <code class=\"computeroutput\"><span class=\"identifier\">x</span></code>\n            for which <span class=\"emphasis\"><em>I<sub>x</sub>(a, b) = 0.5</em></span>.\n          </p>\n<p>\n            Ultimately we'll use Newtons method and set the precision of mpfr_float\n            to have just enough digits at each iteration.\n          </p>\n<p>\n            The full source of the this program is in <a href=\"http://www.boost.org/doc/libs/release/libs/multiprecision/doc/html/../../example/mpfr_precision.cpp\" target=\"_top\">../../example/mpfr_precision.cpp</a>\n          </p>\n<p>\n            We'll skip over the #includes and using declations, and go straight to\n            some support code, first off a simple stopwatch for performance measurement:\n          </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">clock_type</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">struct</span> <span class=\"identifier\">stopwatch</span> <span class=\"special\">{</span> <span class=\"comment\">/*details \\*/</span> <span class=\"special\">};</span>\n</pre>\n<p>\n            We'll use <code class=\"computeroutput\"><span class=\"identifier\">stopwatch</span><span class=\"special\">&lt;</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">chono</span><span class=\"special\">::</span><span class=\"identifier\">high_resolution_clock</span><span class=\"special\">&gt;</span></code>\n            as our performance measuring device.\n          </p>\n<p>\n            We also have a small utility class for controlling the current precision\n            of mpfr_float:\n          </p>\n<pre class=\"programlisting\"><span class=\"keyword\">struct</span> <span class=\"identifier\">scoped_precision</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">unsigned</span> <span class=\"identifier\">p</span><span class=\"special\">;</span>\n   <span class=\"identifier\">scoped_precision</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">new_p</span><span class=\"special\">)</span> <span class=\"special\">:</span> <span class=\"identifier\">p</span><span class=\"special\">(</span><span class=\"identifier\">mpfr_float</span><span class=\"special\">::</span><span class=\"identifier\">default_precision</span><span class=\"special\">())</span>\n   <span class=\"special\">{</span>\n      <span class=\"identifier\">mpfr_float</span><span class=\"special\">::</span><span class=\"identifier\">default_precision</span><span class=\"special\">(</span><span class=\"identifier\">new_p</span><span class=\"special\">);</span>\n   <span class=\"special\">}</span>\n   <span class=\"special\">~</span><span class=\"identifier\">scoped_precision</span><span class=\"special\">()</span>\n   <span class=\"special\">{</span>\n      <span class=\"identifier\">mpfr_float</span><span class=\"special\">::</span><span class=\"identifier\">default_precision</span><span class=\"special\">(</span><span class=\"identifier\">p</span><span class=\"special\">);</span>\n   <span class=\"special\">}</span>\n<span class=\"special\">};</span>\n</pre>\n<p>\n            We'll begin with a reference method that simply calls the Boost.Math\n            function <code class=\"computeroutput\"><span class=\"identifier\">ibeta_inv</span></code> and\n            uses the full working precision of the arguments throughout. Our reference\n            function takes 3 arguments:\n          </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n                The 2 parameters <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n                and <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> of the beta\n                distribution, and\n              </li>\n<li class=\"listitem\">\n                The number of decimal digits precision to achieve in the result.\n              </li>\n</ul></div>\n<p>\n            We begin by setting the default working precision to that requested,\n            and then, since we don't know where our arguments <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>\n            and <code class=\"computeroutput\"><span class=\"identifier\">b</span></code> have been or what\n            precision they have, we make a copy of them - note that since copying\n            also copies the precision as well as the value, we have to set the precision\n            expicitly with a second argument to the copy. Then we can simply return\n            the result of <code class=\"computeroutput\"><span class=\"identifier\">ibeta_inv</span></code>:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">mpfr_float</span> <span class=\"identifier\">beta_distribution_median_method_1</span><span class=\"special\">(</span><span class=\"identifier\">mpfr_float</span> <span class=\"keyword\">const</span><span class=\"special\">&amp;</span> <span class=\"identifier\">a_</span><span class=\"special\">,</span> <span class=\"identifier\">mpfr_float</span> <span class=\"keyword\">const</span><span class=\"special\">&amp;</span> <span class=\"identifier\">b_</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">digits10</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"identifier\">scoped_precision</span> <span class=\"identifier\">sp</span><span class=\"special\">(</span><span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n   <span class=\"identifier\">mpfr_float</span> <span class=\"identifier\">half</span><span class=\"special\">(</span><span class=\"number\">0.5</span><span class=\"special\">),</span> <span class=\"identifier\">a</span><span class=\"special\">(</span><span class=\"identifier\">a_</span><span class=\"special\">,</span> <span class=\"identifier\">digits10</span><span class=\"special\">),</span> <span class=\"identifier\">b</span><span class=\"special\">(</span><span class=\"identifier\">b_</span><span class=\"special\">,</span> <span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n   <span class=\"keyword\">return</span> <span class=\"identifier\">ibeta_inv</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">half</span><span class=\"special\">);</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n            You be wondering why we needed to change the precision of our variables\n            <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>\n            as well as setting the default - there are in fact two ways in which\n            this can go wrong if we don't do that:\n          </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n                The variables have too much precision - this will cause all arithmetic\n                operations involving those types to be promoted to the higher precision\n                wasting precious calculation time.\n              </li>\n<li class=\"listitem\">\n                The variables have too little precision - this will cause expressions\n                involving only those variables to be calculated at the lower precision\n                - for example if we calculate <code class=\"computeroutput\"><span class=\"identifier\">exp</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">)</span></code> internally, this will be evaluated\n                at the precision of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>,\n                and not the current default.\n              </li>\n</ul></div>\n<p>\n            Since our reference method carries out all calculations at the full precision\n            requested, an obvious refinement would be to calculate a first approximation\n            to <code class=\"computeroutput\"><span class=\"keyword\">double</span></code> precision and\n            then to use Newton steps to refine it further.\n          </p>\n<p>\n            Our function begins the same as before: set the new default precision\n            and then make copies of our arguments at the correct precision. We then\n            call <code class=\"computeroutput\"><span class=\"identifier\">ibeta_inv</span></code> with all\n            double precision arguments, promote the result to an <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float</span></code>\n            and perform Newton steps to obtain the result. Note that our termination\n            condition is somewhat crude: we simply assume that we have approximately\n            14 digits correct from the double-precision approximation and that the\n            precision doubles with each step. We also cheat, and use an internal\n            Boost.Math function that calculates <span class=\"emphasis\"><em>I<sub>x</sub>(a, b)</em></span> and\n            its derivative in one go:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">mpfr_float</span> <span class=\"identifier\">beta_distribution_median_method_2</span><span class=\"special\">(</span><span class=\"identifier\">mpfr_float</span> <span class=\"keyword\">const</span><span class=\"special\">&amp;</span> <span class=\"identifier\">a_</span><span class=\"special\">,</span> <span class=\"identifier\">mpfr_float</span> <span class=\"keyword\">const</span><span class=\"special\">&amp;</span> <span class=\"identifier\">b_</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">digits10</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"identifier\">scoped_precision</span> <span class=\"identifier\">sp</span><span class=\"special\">(</span><span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n   <span class=\"identifier\">mpfr_float</span> <span class=\"identifier\">half</span><span class=\"special\">(</span><span class=\"number\">0.5</span><span class=\"special\">),</span> <span class=\"identifier\">a</span><span class=\"special\">(</span><span class=\"identifier\">a_</span><span class=\"special\">,</span> <span class=\"identifier\">digits10</span><span class=\"special\">),</span> <span class=\"identifier\">b</span><span class=\"special\">(</span><span class=\"identifier\">b_</span><span class=\"special\">,</span> <span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n   <span class=\"identifier\">mpfr_float</span> <span class=\"identifier\">guess</span> <span class=\"special\">=</span> <span class=\"identifier\">ibeta_inv</span><span class=\"special\">((</span><span class=\"keyword\">double</span><span class=\"special\">)</span><span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"special\">(</span><span class=\"keyword\">double</span><span class=\"special\">)</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"number\">0.5</span><span class=\"special\">);</span>\n   <span class=\"keyword\">unsigned</span> <span class=\"identifier\">current_digits</span> <span class=\"special\">=</span> <span class=\"number\">14</span><span class=\"special\">;</span>\n   <span class=\"identifier\">mpfr_float</span> <span class=\"identifier\">f</span><span class=\"special\">,</span> <span class=\"identifier\">f1</span><span class=\"special\">;</span>\n   <span class=\"keyword\">while</span> <span class=\"special\">(</span><span class=\"identifier\">current_digits</span> <span class=\"special\">&lt;</span> <span class=\"identifier\">digits10</span><span class=\"special\">)</span>\n   <span class=\"special\">{</span>\n      <span class=\"identifier\">f</span> <span class=\"special\">=</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">detail</span><span class=\"special\">::</span><span class=\"identifier\">ibeta_imp</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">guess</span><span class=\"special\">,</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">policies</span><span class=\"special\">::</span><span class=\"identifier\">policy</span><span class=\"special\">&lt;&gt;(),</span> <span class=\"keyword\">false</span><span class=\"special\">,</span> <span class=\"keyword\">true</span><span class=\"special\">,</span> <span class=\"special\">&amp;</span><span class=\"identifier\">f1</span><span class=\"special\">)</span> <span class=\"special\">-</span> <span class=\"identifier\">half</span><span class=\"special\">;</span>\n      <span class=\"identifier\">guess</span> <span class=\"special\">-=</span> <span class=\"identifier\">f</span> <span class=\"special\">/</span> <span class=\"identifier\">f1</span><span class=\"special\">;</span>\n      <span class=\"identifier\">current_digits</span> <span class=\"special\">*=</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n   <span class=\"special\">}</span>\n   <span class=\"keyword\">return</span> <span class=\"identifier\">guess</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n            Before we refine the method further, it might be wise to take stock and\n            see how methods 1 and 2 compare. We'll ask them both for 1500 digit precision,\n            and compare against the value produced by <code class=\"computeroutput\"><span class=\"identifier\">ibeta_inv</span></code>\n            at 1700 digits. Here's what the results look like:\n          </p>\n<pre class=\"programlisting\">Method 1 time = 0.611647\nRelative error: 2.99991e-1501\nMethod 2 time = 0.646746\nRelative error: 7.55843e-1501\n</pre>\n<p>\n            Clearly they are both equally accurate, but Method 1 is actually faster\n            and our plan for improved performance hasn't actually worked. It turns\n            out that we're not actually comparing like with like, because <code class=\"computeroutput\"><span class=\"identifier\">ibeta_inv</span></code> uses Halley iteration internally\n            which churns out more digits of precision rather more rapidly than Newton\n            iteration. So the time we save by refining an initial <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>\n            approximation, then loose it again by taking more iterations to get to\n            the result.\n          </p>\n<p>\n            Time for a more refined approach. It follows the same form as Method\n            2, but now we set the working precision within the Newton iteration loop,\n            to just enough digits to cover the expected precision at each step. That\n            means we also create new copies of our arguments at the correct precision\n            within the loop, and likewise change the precision of the current <code class=\"computeroutput\"><span class=\"identifier\">guess</span></code> each time through:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">mpfr_float</span> <span class=\"identifier\">beta_distribution_median_method_3</span><span class=\"special\">(</span><span class=\"identifier\">mpfr_float</span> <span class=\"keyword\">const</span><span class=\"special\">&amp;</span> <span class=\"identifier\">a_</span><span class=\"special\">,</span> <span class=\"identifier\">mpfr_float</span> <span class=\"keyword\">const</span><span class=\"special\">&amp;</span> <span class=\"identifier\">b_</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">digits10</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"identifier\">mpfr_float</span> <span class=\"identifier\">guess</span> <span class=\"special\">=</span> <span class=\"identifier\">ibeta_inv</span><span class=\"special\">((</span><span class=\"keyword\">double</span><span class=\"special\">)</span><span class=\"identifier\">a_</span><span class=\"special\">,</span> <span class=\"special\">(</span><span class=\"keyword\">double</span><span class=\"special\">)</span><span class=\"identifier\">b_</span><span class=\"special\">,</span> <span class=\"number\">0.5</span><span class=\"special\">);</span>\n   <span class=\"keyword\">unsigned</span> <span class=\"identifier\">current_digits</span> <span class=\"special\">=</span> <span class=\"number\">14</span><span class=\"special\">;</span>\n   <span class=\"identifier\">mpfr_float</span> <span class=\"identifier\">f</span><span class=\"special\">(</span><span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"identifier\">current_digits</span><span class=\"special\">),</span> <span class=\"identifier\">f1</span><span class=\"special\">(</span><span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"identifier\">current_digits</span><span class=\"special\">),</span> <span class=\"identifier\">delta</span><span class=\"special\">(</span><span class=\"number\">1</span><span class=\"special\">);</span>\n   <span class=\"keyword\">while</span> <span class=\"special\">(</span><span class=\"identifier\">current_digits</span> <span class=\"special\">&lt;</span> <span class=\"identifier\">digits10</span><span class=\"special\">)</span>\n   <span class=\"special\">{</span>\n      <span class=\"identifier\">current_digits</span> <span class=\"special\">*=</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n      <span class=\"identifier\">scoped_precision</span> <span class=\"identifier\">sp</span><span class=\"special\">((</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">min</span><span class=\"special\">)(</span><span class=\"identifier\">current_digits</span><span class=\"special\">,</span> <span class=\"identifier\">digits10</span><span class=\"special\">));</span>\n      <span class=\"identifier\">mpfr_float</span> <span class=\"identifier\">a</span><span class=\"special\">(</span><span class=\"identifier\">a_</span><span class=\"special\">,</span> <span class=\"identifier\">mpfr_float</span><span class=\"special\">::</span><span class=\"identifier\">default_precision</span><span class=\"special\">()),</span> <span class=\"identifier\">b</span><span class=\"special\">(</span><span class=\"identifier\">b_</span><span class=\"special\">,</span> <span class=\"identifier\">mpfr_float</span><span class=\"special\">::</span><span class=\"identifier\">default_precision</span><span class=\"special\">());</span>\n      <span class=\"identifier\">guess</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">(</span><span class=\"identifier\">mpfr_float</span><span class=\"special\">::</span><span class=\"identifier\">default_precision</span><span class=\"special\">());</span>\n      <span class=\"identifier\">f</span> <span class=\"special\">=</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">detail</span><span class=\"special\">::</span><span class=\"identifier\">ibeta_imp</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">guess</span><span class=\"special\">,</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">policies</span><span class=\"special\">::</span><span class=\"identifier\">policy</span><span class=\"special\">&lt;&gt;(),</span> <span class=\"keyword\">false</span><span class=\"special\">,</span> <span class=\"keyword\">true</span><span class=\"special\">,</span> <span class=\"special\">&amp;</span><span class=\"identifier\">f1</span><span class=\"special\">)</span> <span class=\"special\">-</span> <span class=\"number\">0.5f</span><span class=\"special\">;</span>\n      <span class=\"identifier\">guess</span> <span class=\"special\">-=</span> <span class=\"identifier\">f</span> <span class=\"special\">/</span> <span class=\"identifier\">f1</span><span class=\"special\">;</span>\n   <span class=\"special\">}</span>\n   <span class=\"keyword\">return</span> <span class=\"identifier\">guess</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n            The new performance results look much more promising:\n          </p>\n<pre class=\"programlisting\">Method 1 time = 0.591244\nRelative error: 2.99991e-1501\nMethod 2 time = 0.622679\nRelative error: 7.55843e-1501\nMethod 3 time = 0.143393\nRelative error: 4.03898e-1501\n</pre>\n<p>\n            This time we're 4x faster than <code class=\"computeroutput\"><span class=\"identifier\">ibeta_inv</span></code>,\n            and no doubt that could be improved a little more by carefully optimising\n            the number of iterations and the method (Halley vs Newton) taken.\n          </p>\n<p>\n            Finally, here's the driver code for the above methods:\n          </p>\n<pre class=\"programlisting\"><span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">try</span> <span class=\"special\">{</span>\n      <span class=\"identifier\">mpfr_float</span> <span class=\"identifier\">a</span><span class=\"special\">(</span><span class=\"number\">10</span><span class=\"special\">),</span> <span class=\"identifier\">b</span><span class=\"special\">(</span><span class=\"number\">20</span><span class=\"special\">);</span>\n\n      <span class=\"identifier\">mpfr_float</span> <span class=\"identifier\">true_value</span> <span class=\"special\">=</span> <span class=\"identifier\">beta_distribution_median_method_1</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"number\">1700</span><span class=\"special\">);</span>\n\n      <span class=\"identifier\">stopwatch</span><span class=\"special\">&lt;</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">chrono</span><span class=\"special\">::</span><span class=\"identifier\">high_resolution_clock</span><span class=\"special\">&gt;</span> <span class=\"identifier\">my_stopwatch</span><span class=\"special\">;</span>\n\n      <span class=\"identifier\">mpfr_float</span> <span class=\"identifier\">v1</span> <span class=\"special\">=</span> <span class=\"identifier\">beta_distribution_median_method_1</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"number\">1500</span><span class=\"special\">);</span>\n      <span class=\"keyword\">float</span> <span class=\"identifier\">hp_time</span> <span class=\"special\">=</span> <span class=\"identifier\">my_stopwatch</span><span class=\"special\">.</span><span class=\"identifier\">elapsed</span><span class=\"special\">();</span>\n      <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Method 1 time = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">hp_time</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n      <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Relative error: \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">relative_difference</span><span class=\"special\">(</span><span class=\"identifier\">v1</span><span class=\"special\">,</span> <span class=\"identifier\">true_value</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n      <span class=\"identifier\">my_stopwatch</span><span class=\"special\">.</span><span class=\"identifier\">reset</span><span class=\"special\">();</span>\n      <span class=\"identifier\">mpfr_float</span> <span class=\"identifier\">v2</span> <span class=\"special\">=</span> <span class=\"identifier\">beta_distribution_median_method_2</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"number\">1500</span><span class=\"special\">);</span>\n      <span class=\"identifier\">hp_time</span> <span class=\"special\">=</span> <span class=\"identifier\">my_stopwatch</span><span class=\"special\">.</span><span class=\"identifier\">elapsed</span><span class=\"special\">();</span>\n      <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Method 2 time = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">hp_time</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n      <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Relative error: \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">relative_difference</span><span class=\"special\">(</span><span class=\"identifier\">v2</span><span class=\"special\">,</span> <span class=\"identifier\">true_value</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n      <span class=\"identifier\">my_stopwatch</span><span class=\"special\">.</span><span class=\"identifier\">reset</span><span class=\"special\">();</span>\n      <span class=\"identifier\">mpfr_float</span> <span class=\"identifier\">v3</span> <span class=\"special\">=</span> <span class=\"identifier\">beta_distribution_median_method_3</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"number\">1500</span><span class=\"special\">);</span>\n      <span class=\"identifier\">hp_time</span> <span class=\"special\">=</span> <span class=\"identifier\">my_stopwatch</span><span class=\"special\">.</span><span class=\"identifier\">elapsed</span><span class=\"special\">();</span>\n      <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Method 3 time = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">hp_time</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n      <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Relative error: \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">relative_difference</span><span class=\"special\">(</span><span class=\"identifier\">v3</span><span class=\"special\">,</span> <span class=\"identifier\">true_value</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"special\">}</span>\n   <span class=\"keyword\">catch</span> <span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">exception</span><span class=\"special\">&amp;</span> <span class=\"identifier\">e</span><span class=\"special\">)</span>\n   <span class=\"special\">{</span>\n      <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Found exception with message: \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">e</span><span class=\"special\">.</span><span class=\"identifier\">what</span><span class=\"special\">()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"special\">}</span>\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"poly_eg.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../fp_eg.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"gauss_lagerre_quadrature.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/floats/fp_eg.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Examples</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../floats.html\" title=\"Floating-point Types\">\n<link rel=\"prev\" href=\"float128.html\" title=\"float128\">\n<link rel=\"next\" href=\"fp_eg/floatbuiltinctor.html\" title=\"Construction from Specific Values Without Precision Loss\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"float128.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../floats.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"fp_eg/floatbuiltinctor.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.floats.fp_eg\"></a><a class=\"link\" href=\"fp_eg.html\" title=\"Examples\">Examples</a>\n</h4></div></div></div>\n<div class=\"toc\"><dl class=\"toc\">\n<dt><span class=\"section\"><a href=\"fp_eg/floatbuiltinctor.html\">Construction\n          from Specific Values Without Precision Loss</a></span></dt>\n<dt><span class=\"section\"><a href=\"fp_eg/aos.html\">Area of\n          Circle</a></span></dt>\n<dt><span class=\"section\"><a href=\"fp_eg/caveats.html\">Drop-in\n          Caveats</a></span></dt>\n<dt><span class=\"section\"><a href=\"fp_eg/jel.html\">Defining\n          a Special Function.</a></span></dt>\n<dt><span class=\"section\"><a href=\"fp_eg/nd.html\">Calculating\n          a Derivative</a></span></dt>\n<dt><span class=\"section\"><a href=\"fp_eg/gi.html\">Calculating\n          an Integral</a></span></dt>\n<dt><span class=\"section\"><a href=\"fp_eg/poly_eg.html\">Polynomial\n          Evaluation</a></span></dt>\n<dt><span class=\"section\"><a href=\"fp_eg/variable_precision.html\">Variable-Precision\n          Newton Evaluation</a></span></dt>\n<dt><span class=\"section\"><a href=\"fp_eg/gauss_lagerre_quadrature.html\">Gauss-Laguerre\n          quadrature</a></span></dt>\n</dl></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"float128.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../floats.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"fp_eg/floatbuiltinctor.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/floats/gmp_float.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>gmp_float</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../floats.html\" title=\"Floating-point Types\">\n<link rel=\"prev\" href=\"cpp_dec_float.html\" title=\"cpp_dec_float\">\n<link rel=\"next\" href=\"mpfr_float.html\" title=\"mpfr_float\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"cpp_dec_float.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../floats.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"mpfr_float.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.floats.gmp_float\"></a><a class=\"link\" href=\"gmp_float.html\" title=\"gmp_float\">gmp_float</a>\n</h4></div></div></div>\n<p>\n          <code class=\"computeroutput\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">gmp</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">gmp_float</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_float</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>    <span class=\"identifier\">mpf_float_50</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_float</span><span class=\"special\">&lt;</span><span class=\"number\">100</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">mpf_float_100</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_float</span><span class=\"special\">&lt;</span><span class=\"number\">500</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">mpf_float_500</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_float</span><span class=\"special\">&lt;</span><span class=\"number\">1000</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>  <span class=\"identifier\">mpf_float_1000</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_float</span><span class=\"special\">&lt;</span><span class=\"number\">0</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>     <span class=\"identifier\">mpf_float</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n          The <code class=\"computeroutput\"><span class=\"identifier\">gmp_float</span></code> back-end\n          is used in conjunction with <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n          : it acts as a thin wrapper around the <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>\n          <code class=\"computeroutput\"><span class=\"identifier\">mpf_t</span></code> to provide an real-number\n          type that is a drop-in replacement for the native C++ floating-point types,\n          but with much greater precision.\n        </p>\n<p>\n          Type <code class=\"computeroutput\"><span class=\"identifier\">gmp_float</span></code> can be used\n          at fixed precision by specifying a non-zero <code class=\"computeroutput\"><span class=\"identifier\">Digits10</span></code>\n          template parameter, or at variable precision by setting the template argument\n          to zero. The typedefs mpf_float_50, mpf_float_100, mpf_float_500, mpf_float_1000\n          provide arithmetic types at 50, 100, 500 and 1000 decimal digits precision\n          respectively. The typedef mpf_float provides a variable precision type\n          whose precision can be controlled via the <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>s\n          member functions.\n        </p>\n<div class=\"note\"><table border=\"0\" summary=\"Note\">\n<tr>\n<td rowspan=\"2\" align=\"center\" valign=\"top\" width=\"25\"><img alt=\"[Note]\" src=\"../../../../../../../doc/src/images/note.png\"></td>\n<th align=\"left\">Note</th>\n</tr>\n<tr><td align=\"left\" valign=\"top\"><p>\n            This type only provides standard library and <code class=\"computeroutput\"><span class=\"identifier\">numeric_limits</span></code>\n            support when the precision is fixed at compile time.\n          </p></td></tr>\n</table></div>\n<p>\n          As well as the usual conversions from arithmetic and string types, instances\n          of <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpf_float</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code> are copy constructible and assignable\n          from:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              The <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> native types <code class=\"computeroutput\"><span class=\"identifier\">mpf_t</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">mpz_t</span></code>,\n              <code class=\"computeroutput\"><span class=\"identifier\">mpq_t</span></code>.\n            </li>\n<li class=\"listitem\">\n              The <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> wrappers\n              around those types: <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpf_float</span><span class=\"special\">&lt;</span><span class=\"identifier\">M</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code>,\n              <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_int</span><span class=\"special\">&gt;</span></code>,\n              <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_rational</span><span class=\"special\">&gt;</span></code>.\n            </li>\n</ul></div>\n<p>\n          It's also possible to access the underlying <code class=\"computeroutput\"><span class=\"identifier\">mpf_t</span></code>\n          via the <code class=\"computeroutput\"><span class=\"identifier\">data</span><span class=\"special\">()</span></code>\n          member function of <code class=\"computeroutput\"><span class=\"identifier\">gmp_float</span></code>.\n        </p>\n<p>\n          Things you should know when using this type:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              Default constructed <code class=\"computeroutput\"><span class=\"identifier\">gmp_float</span></code>s\n              have the value zero (this is the <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>\n              library's default behavior).\n            </li>\n<li class=\"listitem\">\n              No changes are made to the <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>\n              library's global settings, so this type can be safely mixed with existing\n              <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> code.\n            </li>\n<li class=\"listitem\">\n              This backend supports rvalue-references and is move-aware, making instantiations\n              of <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> on this backend\n              move aware.\n            </li>\n<li class=\"listitem\">\n              It is not possible to round-trip objects of this type to and from a\n              string and get back exactly the same value. This appears to be a limitation\n              of <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>.\n            </li>\n<li class=\"listitem\">\n              Since the underlying <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> types\n              have no notion of infinities or NaNs, care should be taken to avoid\n              numeric overflow or division by zero. That latter will result in a\n              std::overflow_error being thrown, while generating excessively large\n              exponents may result in instability of the underlying <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>\n              library (in testing, converting a number with an excessively large\n              or small exponent to a string caused <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>\n              to segfault).\n            </li>\n<li class=\"listitem\">\n              This type can equally be used with <a href=\"http://mpir.org/\" target=\"_top\">MPIR</a>\n              as the underlying implementation - indeed that is the recommended option\n              on Win32.\n            </li>\n<li class=\"listitem\">\n              Conversion from a string results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code>\n              being thrown if the string can not be interpreted as a valid floating-point\n              number.\n            </li>\n<li class=\"listitem\">\n              Division by zero results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code>\n              being thrown.\n            </li>\n</ul></div>\n<h6>\n<a name=\"boost_multiprecision.tut.floats.gmp_float.h0\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.floats.gmp_float.gmp_example\"></a></span><a class=\"link\" href=\"gmp_float.html#boost_multiprecision.tut.floats.gmp_float.gmp_example\"> GMP example:</a>\n        </h6>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">gmp</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">math</span><span class=\"special\">/</span><span class=\"identifier\">special_functions</span><span class=\"special\">/</span><span class=\"identifier\">gamma</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// Operations at variable precision and limited standard library support:</span>\n   <span class=\"identifier\">mpf_float</span> <span class=\"identifier\">a</span> <span class=\"special\">=</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n   <span class=\"identifier\">mpf_float</span><span class=\"special\">::</span><span class=\"identifier\">default_precision</span><span class=\"special\">(</span><span class=\"number\">1000</span><span class=\"special\">);</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">mpf_float</span><span class=\"special\">::</span><span class=\"identifier\">default_precision</span><span class=\"special\">()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">sqrt</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// print root-2</span>\n\n   <span class=\"comment\">// Operations at fixed precision and full standard library support:</span>\n   <span class=\"identifier\">mpf_float_100</span> <span class=\"identifier\">b</span> <span class=\"special\">=</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpf_float_100</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"comment\">// We can use any C++ std lib function:</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">log</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// print log(2)</span>\n   <span class=\"comment\">// We can also use any function from Boost.Math:</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tgamma</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"comment\">// These even work when the argument is an expression template:</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tgamma</span><span class=\"special\">(</span><span class=\"identifier\">b</span> <span class=\"special\">*</span> <span class=\"identifier\">b</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// Access the underlying representation:</span>\n   <span class=\"identifier\">mpf_t</span> <span class=\"identifier\">f</span><span class=\"special\">;</span>\n   <span class=\"identifier\">mpf_init</span><span class=\"special\">(</span><span class=\"identifier\">f</span><span class=\"special\">);</span>\n   <span class=\"identifier\">mpf_set</span><span class=\"special\">(</span><span class=\"identifier\">f</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">.</span><span class=\"identifier\">backend</span><span class=\"special\">().</span><span class=\"identifier\">data</span><span class=\"special\">());</span>\n   <span class=\"identifier\">mpf_clear</span><span class=\"special\">(</span><span class=\"identifier\">f</span><span class=\"special\">);</span>\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"cpp_dec_float.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../floats.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"mpfr_float.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/floats/mpfr_float.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>mpfr_float</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../floats.html\" title=\"Floating-point Types\">\n<link rel=\"prev\" href=\"gmp_float.html\" title=\"gmp_float\">\n<link rel=\"next\" href=\"float128.html\" title=\"float128\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"gmp_float.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../floats.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"float128.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.floats.mpfr_float\"></a><a class=\"link\" href=\"mpfr_float.html\" title=\"mpfr_float\">mpfr_float</a>\n</h4></div></div></div>\n<p>\n          <code class=\"computeroutput\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">mpfr</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">enum</span> <span class=\"identifier\">mpfr_allocation_type</span>\n<span class=\"special\">{</span>\n   <span class=\"identifier\">allocate_stack</span><span class=\"special\">,</span>\n   <span class=\"identifier\">allocate_dynamic</span>\n<span class=\"special\">};</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">,</span> <span class=\"identifier\">mpfr_allocation_type</span> <span class=\"identifier\">AllocateType</span> <span class=\"special\">=</span> <span class=\"identifier\">allocate_dynamic</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>    <span class=\"identifier\">mpfr_float_50</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">100</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">mpfr_float_100</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">500</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">mpfr_float_500</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">1000</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>  <span class=\"identifier\">mpfr_float_1000</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">0</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>     <span class=\"identifier\">mpfr_float</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">,</span> <span class=\"identifier\">allocate_stack</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>    <span class=\"identifier\">static_mpfr_float_50</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">100</span><span class=\"special\">,</span> <span class=\"identifier\">allocate_stack</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">static_mpfr_float_100</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n          The <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float_backend</span></code>\n          type is used in conjunction with <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>:\n          It acts as a thin wrapper around the <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a>\n          <code class=\"computeroutput\"><span class=\"identifier\">mpfr_t</span></code> to provide an real-number\n          type that is a drop-in replacement for the native C++ floating-point types,\n          but with much greater precision.\n        </p>\n<p>\n          Type <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float_backend</span></code>\n          can be used at fixed precision by specifying a non-zero <code class=\"computeroutput\"><span class=\"identifier\">Digits10</span></code>\n          template parameter, or at variable precision by setting the template argument\n          to zero. The typedefs mpfr_float_50, mpfr_float_100, mpfr_float_500, mpfr_float_1000\n          provide arithmetic types at 50, 100, 500 and 1000 decimal digits precision\n          respectively. The typedef mpfr_float provides a variable precision type\n          whose precision can be controlled via the <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>s\n          member functions.\n        </p>\n<p>\n          In addition the second template parameter lets you choose between dynamic\n          allocation (the default, and uses MPFR's normal allocation routines), or\n          stack allocation (where all the memory required for the underlying data\n          types is stored within <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float_backend</span></code>).\n          The latter option can result in significantly faster code, at the expense\n          of growing the size of <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float_backend</span></code>.\n          It can only be used at <span class=\"emphasis\"><em>fixed precision</em></span>, and should\n          only be used for lower digit counts. Note that we can not guarantee that\n          using <code class=\"computeroutput\"><span class=\"identifier\">allocate_stack</span></code> won't\n          cause any calls to <code class=\"computeroutput\"><span class=\"identifier\">mpfr</span></code>'s\n          allocation routines, as <code class=\"computeroutput\"><span class=\"identifier\">mpfr</span></code>\n          may call these inside its own code. The following table gives an idea of\n          the performance tradeoff's at 50 decimal digits precision<a href=\"#ftn.boost_multiprecision.tut.floats.mpfr_float.f0\" class=\"footnote\" name=\"boost_multiprecision.tut.floats.mpfr_float.f0\"><sup class=\"footnote\">[2]</sup></a>:\n        </p>\n<div class=\"informaltable\"><table class=\"table\">\n<colgroup>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                  <p>\n                    Type\n                  </p>\n                </th>\n<th>\n                  <p>\n                    Bessel function evaluation, relative times\n                  </p>\n                </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                  <p>\n                    <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">,</span> <span class=\"identifier\">allocate_static</span><span class=\"special\">&gt;,</span>\n                    <span class=\"identifier\">et_on</span><span class=\"special\">&gt;</span></code>\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1.0 (5.5s)\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">,</span> <span class=\"identifier\">allocate_static</span><span class=\"special\">&gt;,</span>\n                    <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span></code>\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1.05 (5.8s)\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">,</span> <span class=\"identifier\">allocate_dynamic</span><span class=\"special\">&gt;,</span>\n                    <span class=\"identifier\">et_on</span><span class=\"special\">&gt;</span></code>\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1.05 (5.8s)\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">,</span> <span class=\"identifier\">allocate_dynamic</span><span class=\"special\">&gt;,</span>\n                    <span class=\"identifier\">et_off</span><span class=\"special\">&gt;</span></code>\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1.16 (6.4s)\n                  </p>\n                </td>\n</tr>\n</tbody>\n</table></div>\n<div class=\"note\"><table border=\"0\" summary=\"Note\">\n<tr>\n<td rowspan=\"2\" align=\"center\" valign=\"top\" width=\"25\"><img alt=\"[Note]\" src=\"../../../../../../../doc/src/images/note.png\"></td>\n<th align=\"left\">Note</th>\n</tr>\n<tr><td align=\"left\" valign=\"top\"><p>\n            This type only provides <code class=\"computeroutput\"><span class=\"identifier\">numeric_limits</span></code>\n            support when the precision is fixed at compile time.\n          </p></td></tr>\n</table></div>\n<p>\n          As well as the usual conversions from arithmetic and string types, instances\n          of <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code> are copy constructible and assignable\n          from:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              The <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> native types <code class=\"computeroutput\"><span class=\"identifier\">mpf_t</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">mpz_t</span></code>,\n              <code class=\"computeroutput\"><span class=\"identifier\">mpq_t</span></code>.\n            </li>\n<li class=\"listitem\">\n              The <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a> native type <code class=\"computeroutput\"><span class=\"identifier\">mpfr_t</span></code>.\n            </li>\n<li class=\"listitem\">\n              The <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> wrappers\n              around those types: <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">M</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code>,\n              <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpf_float</span><span class=\"special\">&lt;</span><span class=\"identifier\">M</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_int</span><span class=\"special\">&gt;</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_rational</span><span class=\"special\">&gt;</span></code>.\n            </li>\n</ul></div>\n<p>\n          It's also possible to access the underlying <code class=\"computeroutput\"><span class=\"identifier\">mpfr_t</span></code>\n          via the data() member function of <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float_backend</span></code>.\n        </p>\n<p>\n          Things you should know when using this type:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              A default constructed <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float_backend</span></code>\n              is set to zero (<span class=\"emphasis\"><em>Note that this is <span class=\"bold\"><strong>not</strong></span>\n              the default <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a> behavior</em></span>).\n            </li>\n<li class=\"listitem\">\n              All operations use round to nearest.\n            </li>\n<li class=\"listitem\">\n              No changes are made to <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> or\n              <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a> global settings, so this\n              type can coexist with existing <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a>\n              or <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> code.\n            </li>\n<li class=\"listitem\">\n              The code can equally use <a href=\"http://mpir.org/\" target=\"_top\">MPIR</a>\n              in place of <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> - indeed that\n              is the preferred option on Win32.\n            </li>\n<li class=\"listitem\">\n              This backend supports rvalue-references and is move-aware, making instantiations\n              of <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> on this backend\n              move aware.\n            </li>\n<li class=\"listitem\">\n              Conversion from a string results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code>\n              being thrown if the string can not be interpreted as a valid floating-point\n              number.\n            </li>\n<li class=\"listitem\">\n              Division by zero results in an infinity.\n            </li>\n<li class=\"listitem\">\n              When using the variable precision type <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float</span></code>,\n              then copy construction and assignment <span class=\"emphasis\"><em>copies the precision\n              of the source variable</em></span>. Likewise move construction and assignment.\n            </li>\n<li class=\"listitem\">\n              When constructing the variable precision type <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float</span></code>\n              you can specify two arguments to the constructor - the first is the\n              value to assign to the variable, the second is an unsigned integer\n              specifying the precision in decimal places. The <code class=\"computeroutput\"><span class=\"identifier\">assign</span></code>\n              member function similarly has a 2-argument overload taking the value\n              to assign and the precision. You can use this to preserve the precision\n              of the target variable using the somewhat arcane: <code class=\"computeroutput\"><span class=\"identifier\">a</span><span class=\"special\">.</span><span class=\"identifier\">assign</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"identifier\">a</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">())</span></code>, which assigns <code class=\"computeroutput\"><span class=\"identifier\">b</span></code>\n              to <code class=\"computeroutput\"><span class=\"identifier\">a</span></code> but preserves\n              the precision of <code class=\"computeroutput\"><span class=\"identifier\">a</span></code>.\n            </li>\n</ul></div>\n<h6>\n<a name=\"boost_multiprecision.tut.floats.mpfr_float.h0\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.floats.mpfr_float.mpfr_example\"></a></span><a class=\"link\" href=\"mpfr_float.html#boost_multiprecision.tut.floats.mpfr_float.mpfr_example\"> MPFR example:</a>\n        </h6>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">mpfr</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">math</span><span class=\"special\">/</span><span class=\"identifier\">special_functions</span><span class=\"special\">/</span><span class=\"identifier\">gamma</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// Operations at variable precision and no numeric_limits support:</span>\n   <span class=\"identifier\">mpfr_float</span> <span class=\"identifier\">a</span> <span class=\"special\">=</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n   <span class=\"identifier\">mpfr_float</span><span class=\"special\">::</span><span class=\"identifier\">default_precision</span><span class=\"special\">(</span><span class=\"number\">1000</span><span class=\"special\">);</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">mpfr_float</span><span class=\"special\">::</span><span class=\"identifier\">default_precision</span><span class=\"special\">()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">sqrt</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// print root-2</span>\n\n   <span class=\"comment\">// Operations at fixed precision and full numeric_limits support:</span>\n   <span class=\"identifier\">mpfr_float_100</span> <span class=\"identifier\">b</span> <span class=\"special\">=</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_100</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"comment\">// We can use any C++ std lib function:</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">log</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// print log(2)</span>\n   <span class=\"comment\">// We can also use any function from Boost.Math:</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tgamma</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"comment\">// These even work when the argument is an expression template:</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tgamma</span><span class=\"special\">(</span><span class=\"identifier\">b</span> <span class=\"special\">*</span> <span class=\"identifier\">b</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// Access the underlying data:</span>\n   <span class=\"identifier\">mpfr_t</span> <span class=\"identifier\">r</span><span class=\"special\">;</span>\n   <span class=\"identifier\">mpfr_init</span><span class=\"special\">(</span><span class=\"identifier\">r</span><span class=\"special\">);</span>\n   <span class=\"identifier\">mpfr_set</span><span class=\"special\">(</span><span class=\"identifier\">r</span><span class=\"special\">,</span> <span class=\"identifier\">b</span><span class=\"special\">.</span><span class=\"identifier\">backend</span><span class=\"special\">().</span><span class=\"identifier\">data</span><span class=\"special\">(),</span> <span class=\"identifier\">GMP_RNDN</span><span class=\"special\">);</span>\n   <span class=\"identifier\">mpfr_clear</span><span class=\"special\">(</span><span class=\"identifier\">r</span><span class=\"special\">);</span>\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<div class=\"footnotes\">\n<br><hr style=\"width:100; text-align:left;margin-left: 0\">\n<div id=\"ftn.boost_multiprecision.tut.floats.mpfr_float.f0\" class=\"footnote\"><p><a href=\"#boost_multiprecision.tut.floats.mpfr_float.f0\" class=\"para\"><sup class=\"para\">[2] </sup></a>\n            Compiled with VC++10 and /Ox, with MPFR-3.0.0 and MPIR-2.3.0\n          </p></div>\n</div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"gmp_float.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../floats.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"float128.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/floats.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Floating-point Types</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"ints/egs/bitops.html\" title=\"Bit Operations\">\n<link rel=\"next\" href=\"floats/cpp_bin_float.html\" title=\"cpp_bin_float\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"ints/egs/bitops.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"floats/cpp_bin_float.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.floats\"></a><a class=\"link\" href=\"floats.html\" title=\"Floating-point Types\">Floating-point Types</a>\n</h3></div></div></div>\n<div class=\"toc\"><dl class=\"toc\">\n<dt><span class=\"section\"><a href=\"floats/cpp_bin_float.html\">cpp_bin_float</a></span></dt>\n<dt><span class=\"section\"><a href=\"floats/cpp_dec_float.html\">cpp_dec_float</a></span></dt>\n<dt><span class=\"section\"><a href=\"floats/gmp_float.html\">gmp_float</a></span></dt>\n<dt><span class=\"section\"><a href=\"floats/mpfr_float.html\">mpfr_float</a></span></dt>\n<dt><span class=\"section\"><a href=\"floats/float128.html\">float128</a></span></dt>\n<dt><span class=\"section\"><a href=\"floats/fp_eg.html\">Examples</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"floats/fp_eg/floatbuiltinctor.html\">Construction\n          from Specific Values Without Precision Loss</a></span></dt>\n<dt><span class=\"section\"><a href=\"floats/fp_eg/aos.html\">Area of\n          Circle</a></span></dt>\n<dt><span class=\"section\"><a href=\"floats/fp_eg/caveats.html\">Drop-in\n          Caveats</a></span></dt>\n<dt><span class=\"section\"><a href=\"floats/fp_eg/jel.html\">Defining\n          a Special Function.</a></span></dt>\n<dt><span class=\"section\"><a href=\"floats/fp_eg/nd.html\">Calculating\n          a Derivative</a></span></dt>\n<dt><span class=\"section\"><a href=\"floats/fp_eg/gi.html\">Calculating\n          an Integral</a></span></dt>\n<dt><span class=\"section\"><a href=\"floats/fp_eg/poly_eg.html\">Polynomial\n          Evaluation</a></span></dt>\n<dt><span class=\"section\"><a href=\"floats/fp_eg/variable_precision.html\">Variable-Precision\n          Newton Evaluation</a></span></dt>\n<dt><span class=\"section\"><a href=\"floats/fp_eg/gauss_lagerre_quadrature.html\">Gauss-Laguerre\n          quadrature</a></span></dt>\n</dl></dd>\n</dl></div>\n<p>\n        The following back-ends provide floating-point arithmetic:\n      </p>\n<div class=\"informaltable\"><table class=\"table\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend Type\n                </p>\n              </th>\n<th>\n                <p>\n                  Header\n                </p>\n              </th>\n<th>\n                <p>\n                  Radix\n                </p>\n              </th>\n<th>\n                <p>\n                  Dependencies\n                </p>\n              </th>\n<th>\n                <p>\n                  Pros\n                </p>\n              </th>\n<th>\n                <p>\n                  Cons\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">&gt;</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  boost/multiprecision/cpp_bin_float.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  2\n                </p>\n              </td>\n<td>\n                <p>\n                  None\n                </p>\n              </td>\n<td>\n                <p>\n                  Header only, all C++ implementation. Boost licence.\n                </p>\n              </td>\n<td>\n                <p>\n                  Approximately 2x slower than the <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a>\n                  or <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> libraries.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">&gt;</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  boost/multiprecision/cpp_dec_float.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  10\n                </p>\n              </td>\n<td>\n                <p>\n                  None\n                </p>\n              </td>\n<td>\n                <p>\n                  Header only, all C++ implementation. Boost licence.\n                </p>\n              </td>\n<td>\n                <p>\n                  Approximately 2x slower than the <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a>\n                  or <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> libraries.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">mpf_float</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">&gt;</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  boost/multiprecision/gmp.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  2\n                </p>\n              </td>\n<td>\n                <p>\n                  <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>\n                </p>\n              </td>\n<td>\n                <p>\n                  Very fast and efficient back-end.\n                </p>\n              </td>\n<td>\n                <p>\n                  Dependency on GNU licensed <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>\n                  library.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">&gt;</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  boost/multiprecision/mpfr.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  2\n                </p>\n              </td>\n<td>\n                <p>\n                  <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> and <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a>\n                </p>\n              </td>\n<td>\n                <p>\n                  Very fast and efficient back-end, with its own standard library\n                  implementation.\n                </p>\n              </td>\n<td>\n                <p>\n                  Dependency on GNU licensed <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>\n                  and <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a> libraries.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">float128</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  boost/multiprecision/float128.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  2\n                </p>\n              </td>\n<td>\n                <p>\n                  Either <a href=\"http://gcc.gnu.org/onlinedocs/libquadmath/\" target=\"_top\">libquadmath</a>\n                  or the Intel C++ Math library.\n                </p>\n              </td>\n<td>\n                <p>\n                  Very fast and efficient back-end for 128-bit floating-point values\n                  (113-bit mantissa, equivalent to FORTRAN's QUAD real)\n                </p>\n              </td>\n<td>\n                <p>\n                  Depends on the compiler being either recent GCC or Intel C++ versions.\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"ints/egs/bitops.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"floats/cpp_bin_float.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/gen_int.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Generic Integer Operations</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"variable.html\" title=\"Variable Precision Arithmetic\">\n<link rel=\"next\" href=\"serial.html\" title=\"Boost.Serialization Support\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"variable.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"serial.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.gen_int\"></a><a class=\"link\" href=\"gen_int.html\" title=\"Generic Integer Operations\">Generic Integer Operations</a>\n</h3></div></div></div>\n<p>\n        All of the <a class=\"link\" href=\"../ref/number.html#boost_multiprecision.ref.number.integer_functions\">non-member\n        integer operations</a> are overloaded for the <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n        (built-in)</a> integer types in <code class=\"computeroutput\"><span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">integer</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>.\n        Where these operations require a temporary increase in precision (such as\n        for <code class=\"computeroutput\"><span class=\"identifier\">powm</span></code>), then if no <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental (built-in)</a>\n        type is available, a <a class=\"link\" href=\"ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>\n        of appropriate precision will be used.\n      </p>\n<p>\n        Some of these functions are trivial, others use compiler intrinsics (where\n        available) to ensure optimal evaluation.\n      </p>\n<p>\n        The overloaded functions are:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Integer</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">I2</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">multiply</span><span class=\"special\">(</span><span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">result</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">I2</span><span class=\"special\">&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">I2</span><span class=\"special\">&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Multiplies two <code class=\"computeroutput\"><span class=\"identifier\">I2</span></code> values,\n        to produce a wider <code class=\"computeroutput\"><span class=\"identifier\">Integer</span></code>\n        result.\n      </p>\n<p>\n        Returns <code class=\"computeroutput\"><span class=\"identifier\">result</span> <span class=\"special\">=</span>\n        <span class=\"identifier\">a</span> <span class=\"special\">*</span> <span class=\"identifier\">b</span></code> without overflow or loss of precision\n        in the multiplication.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Integer</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">I2</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">add</span><span class=\"special\">(</span><span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">result</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">I2</span><span class=\"special\">&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">I2</span><span class=\"special\">&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Adds two <code class=\"computeroutput\"><span class=\"identifier\">I2</span></code> values, to produce\n        a wider <code class=\"computeroutput\"><span class=\"identifier\">Integer</span></code> result.\n      </p>\n<p>\n        Returns <code class=\"computeroutput\"><span class=\"identifier\">result</span> <span class=\"special\">=</span>\n        <span class=\"identifier\">a</span> <span class=\"special\">+</span> <span class=\"identifier\">b</span></code> without overflow or loss of precision\n        in the addition.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Integer</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">I2</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">subtract</span><span class=\"special\">(</span><span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">result</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">I2</span><span class=\"special\">&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">I2</span><span class=\"special\">&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Subtracts two <code class=\"computeroutput\"><span class=\"identifier\">I2</span></code> values,\n        to produce a wider <code class=\"computeroutput\"><span class=\"identifier\">Integer</span></code>\n        result.\n      </p>\n<p>\n        Returns <code class=\"computeroutput\"><span class=\"identifier\">result</span> <span class=\"special\">=</span>\n        <span class=\"identifier\">a</span> <span class=\"special\">-</span> <span class=\"identifier\">b</span></code> without overflow or loss of precision\n        in the subtraction.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Integer</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">Integer</span> <span class=\"identifier\">powm</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">p</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">m</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Returns b<sup>p</sup> % m.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Integer</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">void</span> <span class=\"identifier\">divide_qr</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">x</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">y</span><span class=\"special\">,</span> <span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">q</span><span class=\"special\">,</span> <span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">r</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Sets <code class=\"computeroutput\"><span class=\"identifier\">q</span> <span class=\"special\">=</span>\n        <span class=\"identifier\">x</span> <span class=\"special\">/</span> <span class=\"identifier\">y</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">r</span>\n        <span class=\"special\">=</span> <span class=\"identifier\">x</span> <span class=\"special\">%</span> <span class=\"identifier\">y</span></code>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Integer1</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Integer2</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">Integer2</span> <span class=\"identifier\">integer_modulus</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">Integer1</span><span class=\"special\">&amp;</span> <span class=\"identifier\">x</span><span class=\"special\">,</span> <span class=\"identifier\">Integer2</span> <span class=\"identifier\">val</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Returns x % val;\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Integer</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">unsigned</span> <span class=\"identifier\">lsb</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">x</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Returns the (zero-based) index of the least significant bit of <code class=\"computeroutput\"><span class=\"identifier\">x</span></code>.\n      </p>\n<p>\n        Throws a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">domain_error</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">x</span>\n        <span class=\"special\">&lt;=</span> <span class=\"number\">0</span></code>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Integer</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">unsigned</span> <span class=\"identifier\">msb</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">x</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Returns the (zero-based) index of the most significant bit of <code class=\"computeroutput\"><span class=\"identifier\">x</span></code>.\n      </p>\n<p>\n        Throws a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">domain_error</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">x</span>\n        <span class=\"special\">&lt;=</span> <span class=\"number\">0</span></code>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Integer</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">bit_test</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">index</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Returns <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> if bit <code class=\"computeroutput\"><span class=\"identifier\">index</span></code> is set in <code class=\"computeroutput\"><span class=\"identifier\">val</span></code>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Integer</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">bit_set</span><span class=\"special\">(</span><span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">index</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Sets the <code class=\"computeroutput\"><span class=\"identifier\">index</span></code> bit in <code class=\"computeroutput\"><span class=\"identifier\">val</span></code>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Integer</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">bit_unset</span><span class=\"special\">(</span><span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">index</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Unsets the <code class=\"computeroutput\"><span class=\"identifier\">index</span></code> bit in\n        <code class=\"computeroutput\"><span class=\"identifier\">val</span></code>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Integer</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">bit_flip</span><span class=\"special\">(</span><span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">index</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Flips the <code class=\"computeroutput\"><span class=\"identifier\">index</span></code> bit in <code class=\"computeroutput\"><span class=\"identifier\">val</span></code>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Integer</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">Integer</span> <span class=\"identifier\">sqrt</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">x</span><span class=\"special\">);</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Integer</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">Integer</span> <span class=\"identifier\">sqrt</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">x</span><span class=\"special\">,</span> <span class=\"identifier\">Integer</span><span class=\"special\">&amp;</span> <span class=\"identifier\">r</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Returns the integer square root <code class=\"computeroutput\"><span class=\"identifier\">s</span></code>\n        of x and sets <code class=\"computeroutput\"><span class=\"identifier\">r</span></code> to the remainder\n        <span class=\"emphasis\"><em>x - s<sup>2</sup></em></span>.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Engine</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">miller_rabin_test</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">-</span><span class=\"keyword\">or</span><span class=\"special\">-</span><span class=\"identifier\">expression</span><span class=\"special\">-</span><span class=\"keyword\">template</span><span class=\"special\">-</span><span class=\"identifier\">type</span><span class=\"special\">&amp;</span> <span class=\"identifier\">n</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">trials</span><span class=\"special\">,</span> <span class=\"identifier\">Engine</span><span class=\"special\">&amp;</span> <span class=\"identifier\">gen</span><span class=\"special\">);</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">miller_rabin_test</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">-</span><span class=\"keyword\">or</span><span class=\"special\">-</span><span class=\"identifier\">expression</span><span class=\"special\">-</span><span class=\"keyword\">template</span><span class=\"special\">-</span><span class=\"identifier\">type</span><span class=\"special\">&amp;</span> <span class=\"identifier\">n</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">trials</span><span class=\"special\">);</span>\n</pre>\n<p>\n        The regular Miller-Rabin functions in <code class=\"computeroutput\"><span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">miller_rabin</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>\n        are defined in terms of the above generic operations, and so function equally\n        well for <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n        (built-in) types</a> and multiprecision types.\n      </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"variable.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"serial.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/hash.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Hash Function Support</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"input_output.html\" title=\"Input Output\">\n<link rel=\"next\" href=\"eigen.html\" title=\"Eigen Interoperability\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"input_output.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"eigen.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.hash\"></a><a class=\"link\" href=\"hash.html\" title=\"Hash Function Support\">Hash Function Support</a>\n</h3></div></div></div>\n<p>\n        All of the types in this library support hashing via boost::hash or std::hash.\n        That means we can use multiprecision types directly in hashed containers\n        such as std::unordered_set:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n<span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">random</span><span class=\"special\">;</span>\n\n<span class=\"identifier\">mt19937</span> <span class=\"identifier\">mt</span><span class=\"special\">;</span>\n<span class=\"identifier\">uniform_int_distribution</span><span class=\"special\">&lt;</span><span class=\"identifier\">uint256_t</span><span class=\"special\">&gt;</span> <span class=\"identifier\">ui</span><span class=\"special\">;</span>\n\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">unordered_set</span><span class=\"special\">&lt;</span><span class=\"identifier\">uint256_t</span><span class=\"special\">&gt;</span> <span class=\"identifier\">set</span><span class=\"special\">;</span>\n<span class=\"comment\">// Put 1000 random values into the container:</span>\n<span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;</span> <span class=\"number\">1000</span><span class=\"special\">;</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n   <span class=\"identifier\">set</span><span class=\"special\">.</span><span class=\"identifier\">insert</span><span class=\"special\">(</span><span class=\"identifier\">ui</span><span class=\"special\">(</span><span class=\"identifier\">mt</span><span class=\"special\">));</span>\n</pre>\n<p>\n        Or we can define our own hash function, for example in this case based on\n        Google's CityHash:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">struct</span> <span class=\"identifier\">cityhash</span>\n<span class=\"special\">{</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span> <span class=\"keyword\">operator</span><span class=\"special\">()(</span><span class=\"keyword\">const</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">uint256_t</span><span class=\"special\">&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">)</span><span class=\"keyword\">const</span>\n   <span class=\"special\">{</span>\n      <span class=\"comment\">// create a hash from all the limbs of the argument, this function is probably x64 specific,</span>\n      <span class=\"comment\">// and requires that we access the internals of the data type:</span>\n      <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span> <span class=\"identifier\">result</span> <span class=\"special\">=</span> <span class=\"identifier\">CityHash64</span><span class=\"special\">(</span><span class=\"keyword\">reinterpret_cast</span><span class=\"special\">&lt;</span><span class=\"keyword\">const</span> <span class=\"keyword\">char</span><span class=\"special\">*&gt;(</span><span class=\"identifier\">val</span><span class=\"special\">.</span><span class=\"identifier\">backend</span><span class=\"special\">().</span><span class=\"identifier\">limbs</span><span class=\"special\">()),</span> <span class=\"identifier\">val</span><span class=\"special\">.</span><span class=\"identifier\">backend</span><span class=\"special\">().</span><span class=\"identifier\">size</span><span class=\"special\">()</span> <span class=\"special\">*</span> <span class=\"keyword\">sizeof</span><span class=\"special\">(</span><span class=\"identifier\">val</span><span class=\"special\">.</span><span class=\"identifier\">backend</span><span class=\"special\">().</span><span class=\"identifier\">limbs</span><span class=\"special\">()[</span><span class=\"number\">0</span><span class=\"special\">]));</span>\n      <span class=\"comment\">// modify the returned hash based on sign:</span>\n      <span class=\"keyword\">return</span> <span class=\"identifier\">val</span> <span class=\"special\">&lt;</span> <span class=\"number\">0</span> <span class=\"special\">?</span> <span class=\"special\">~</span><span class=\"identifier\">result</span> <span class=\"special\">:</span> <span class=\"identifier\">result</span><span class=\"special\">;</span>\n   <span class=\"special\">}</span>\n<span class=\"special\">};</span>\n</pre>\n<p>\n        As before insert some values into a container, this time using our custom\n        hasher:\n      </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">unordered_set</span><span class=\"special\">&lt;</span><span class=\"identifier\">uint256_t</span><span class=\"special\">,</span> <span class=\"identifier\">cityhash</span><span class=\"special\">&gt;</span> <span class=\"identifier\">set2</span><span class=\"special\">;</span>\n<span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;</span> <span class=\"number\">1000</span><span class=\"special\">;</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n   <span class=\"identifier\">set2</span><span class=\"special\">.</span><span class=\"identifier\">insert</span><span class=\"special\">(</span><span class=\"identifier\">ui</span><span class=\"special\">(</span><span class=\"identifier\">mt</span><span class=\"special\">));</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"input_output.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"eigen.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/import_export.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Importing and Exporting Data to and from cpp_int and cpp_bin_float</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"lits.html\" title=\"Literal Types and constexpr Support\">\n<link rel=\"next\" href=\"rounding.html\" title=\"Rounding Rules for Conversions\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"lits.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"rounding.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.import_export\"></a><a class=\"link\" href=\"import_export.html\" title=\"Importing and Exporting Data to and from cpp_int and cpp_bin_float\">Importing and\n      Exporting Data to and from <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>\n      and <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span></code></a>\n</h3></div></div></div>\n<p>\n        Any integer number type that uses <code class=\"computeroutput\"><span class=\"identifier\">cpp_int_backend</span></code>\n        as its implementation layer can import or export its bits via two non-member\n        functions:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span> <span class=\"identifier\">MinBits</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span> <span class=\"identifier\">MaxBits</span><span class=\"special\">,</span> <span class=\"identifier\">cpp_integer_type</span> <span class=\"identifier\">SignType</span><span class=\"special\">,</span> <span class=\"identifier\">cpp_int_check_type</span> <span class=\"identifier\">Checked</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Allocator</span><span class=\"special\">,</span>\n          <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">OutputIterator</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">OutputIterator</span> <span class=\"identifier\">export_bits</span><span class=\"special\">(</span>\n   <span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"keyword\">const</span> <span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">MinBits</span><span class=\"special\">,</span> <span class=\"identifier\">MaxBits</span><span class=\"special\">,</span> <span class=\"identifier\">SignType</span><span class=\"special\">,</span> <span class=\"identifier\">Checked</span><span class=\"special\">,</span> <span class=\"identifier\">Allocator</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">,</span>\n   <span class=\"identifier\">OutputIterator</span> <span class=\"identifier\">out</span><span class=\"special\">,</span>\n   <span class=\"keyword\">unsigned</span> <span class=\"identifier\">chunk_size</span><span class=\"special\">,</span>\n   <span class=\"keyword\">bool</span> <span class=\"identifier\">msv_first</span> <span class=\"special\">=</span> <span class=\"keyword\">true</span><span class=\"special\">);</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span> <span class=\"identifier\">MinBits</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span> <span class=\"identifier\">MaxBits</span><span class=\"special\">,</span> <span class=\"identifier\">cpp_integer_type</span> <span class=\"identifier\">SignType</span><span class=\"special\">,</span> <span class=\"identifier\">cpp_int_check_type</span> <span class=\"identifier\">Checked</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Allocator</span><span class=\"special\">,</span>\n          <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Iterator</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">MinBits</span><span class=\"special\">,</span> <span class=\"identifier\">MaxBits</span><span class=\"special\">,</span> <span class=\"identifier\">SignType</span><span class=\"special\">,</span> <span class=\"identifier\">Checked</span><span class=\"special\">,</span> <span class=\"identifier\">Allocator</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span>\n   <span class=\"identifier\">import_bits</span><span class=\"special\">(</span>\n      <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">MinBits</span><span class=\"special\">,</span> <span class=\"identifier\">MaxBits</span><span class=\"special\">,</span> <span class=\"identifier\">SignType</span><span class=\"special\">,</span> <span class=\"identifier\">Checked</span><span class=\"special\">,</span> <span class=\"identifier\">Allocator</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">,</span>\n      <span class=\"identifier\">Iterator</span> <span class=\"identifier\">i</span><span class=\"special\">,</span>\n      <span class=\"identifier\">Iterator</span> <span class=\"identifier\">j</span><span class=\"special\">,</span>\n      <span class=\"keyword\">unsigned</span> <span class=\"identifier\">chunk_size</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">,</span>\n      <span class=\"keyword\">bool</span> <span class=\"identifier\">msv_first</span> <span class=\"special\">=</span> <span class=\"keyword\">true</span><span class=\"special\">);</span>\n</pre>\n<p>\n        These functions are designed for data-interchange with other storage formats,\n        and since <a class=\"link\" href=\"floats/cpp_bin_float.html\" title=\"cpp_bin_float\">cpp_bin_float</a>\n        uses <a class=\"link\" href=\"ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>\n        internally, by extension they can be used for floating-point numbers based\n        on that backend as well (see example below). Parameters and use are as follows:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span> <span class=\"identifier\">MinBits</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span> <span class=\"identifier\">MaxBits</span><span class=\"special\">,</span> <span class=\"identifier\">cpp_integer_type</span> <span class=\"identifier\">SignType</span><span class=\"special\">,</span> <span class=\"identifier\">cpp_int_check_type</span> <span class=\"identifier\">Checked</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Allocator</span><span class=\"special\">,</span>\n          <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">OutputIterator</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">OutputIterator</span> <span class=\"identifier\">export_bits</span><span class=\"special\">(</span>\n   <span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"keyword\">const</span> <span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">MinBits</span><span class=\"special\">,</span> <span class=\"identifier\">MaxBits</span><span class=\"special\">,</span> <span class=\"identifier\">SignType</span><span class=\"special\">,</span> <span class=\"identifier\">Checked</span><span class=\"special\">,</span> <span class=\"identifier\">Allocator</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">,</span>\n   <span class=\"identifier\">OutputIterator</span> <span class=\"identifier\">out</span><span class=\"special\">,</span>\n   <span class=\"keyword\">unsigned</span> <span class=\"identifier\">chunk_size</span><span class=\"special\">,</span>\n   <span class=\"keyword\">bool</span> <span class=\"identifier\">msv_first</span> <span class=\"special\">=</span> <span class=\"keyword\">true</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Exports the absolute value of <code class=\"computeroutput\"><span class=\"identifier\">val</span></code>\n        to OutputIterator <code class=\"computeroutput\"><span class=\"identifier\">out</span></code>. The\n        function will write <code class=\"computeroutput\"><span class=\"identifier\">chunk_size</span></code>\n        bits at a time to the OutputIterator, and if <code class=\"computeroutput\"><span class=\"identifier\">msv_first</span></code>\n        is true, will write the most-significant block first. Byte and bit order\n        within each <code class=\"computeroutput\"><span class=\"identifier\">chunk_size</span></code> block\n        is always in the machines native format. Further, each block is stored in\n        a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">uintmax_t</span></code> when it's assigned to <code class=\"computeroutput\"><span class=\"special\">*</span><span class=\"identifier\">out</span></code>.\n      </p>\n<div class=\"note\"><table border=\"0\" summary=\"Note\">\n<tr>\n<td rowspan=\"2\" align=\"center\" valign=\"top\" width=\"25\"><img alt=\"[Note]\" src=\"../../../../../../doc/src/images/note.png\"></td>\n<th align=\"left\">Note</th>\n</tr>\n<tr><td align=\"left\" valign=\"top\"><p>\n          Unfortunately, the standard's OutputIterator concept provides no means\n          of deducing the type to output since <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">iterator_traits</span><span class=\"special\">&lt;</span><span class=\"identifier\">OutputIteratorType</span><span class=\"special\">&gt;::</span><span class=\"identifier\">value_type</span></code>\n          is type <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>. This is why\n          the bit count for each block has to be specified manually. It may also\n          result in compiler warnings about the value being narrowed.\n        </p></td></tr>\n</table></div>\n<div class=\"tip\"><table border=\"0\" summary=\"Tip\">\n<tr>\n<td rowspan=\"2\" align=\"center\" valign=\"top\" width=\"25\"><img alt=\"[Tip]\" src=\"../../../../../../doc/src/images/tip.png\"></td>\n<th align=\"left\">Tip</th>\n</tr>\n<tr><td align=\"left\" valign=\"top\"><p>\n          If you're exporting to non-native byte layout, then use <a href=\"http://www.boost.org/doc/libs/release/libs/endian/doc/index.html\" target=\"_top\">Boost.Endian</a>\n          to create a custom OutputIterator that reverses the byte order of each\n          chunk prior to actually storing the result.\n        </p></td></tr>\n</table></div>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span> <span class=\"identifier\">MinBits</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span> <span class=\"identifier\">MaxBits</span><span class=\"special\">,</span> <span class=\"identifier\">cpp_integer_type</span> <span class=\"identifier\">SignType</span><span class=\"special\">,</span> <span class=\"identifier\">cpp_int_check_type</span> <span class=\"identifier\">Checked</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Allocator</span><span class=\"special\">,</span>\n          <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">ForwardIterator</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">MinBits</span><span class=\"special\">,</span> <span class=\"identifier\">MaxBits</span><span class=\"special\">,</span> <span class=\"identifier\">SignType</span><span class=\"special\">,</span> <span class=\"identifier\">Checked</span><span class=\"special\">,</span> <span class=\"identifier\">Allocator</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span>\n   <span class=\"identifier\">import_bits</span><span class=\"special\">(</span>\n      <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">MinBits</span><span class=\"special\">,</span> <span class=\"identifier\">MaxBits</span><span class=\"special\">,</span> <span class=\"identifier\">SignType</span><span class=\"special\">,</span> <span class=\"identifier\">Checked</span><span class=\"special\">,</span> <span class=\"identifier\">Allocator</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">,</span>\n      <span class=\"identifier\">ForwardIterator</span> <span class=\"identifier\">i</span><span class=\"special\">,</span>\n      <span class=\"identifier\">ForwardIterator</span> <span class=\"identifier\">j</span><span class=\"special\">,</span>\n      <span class=\"keyword\">unsigned</span> <span class=\"identifier\">chunk_size</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">,</span>\n      <span class=\"keyword\">bool</span> <span class=\"identifier\">msv_first</span> <span class=\"special\">=</span> <span class=\"keyword\">true</span><span class=\"special\">);</span>\n</pre>\n<p>\n        Imports bits from the iterator range <span class=\"emphasis\"><em>[i,j)</em></span> and stores\n        them in <code class=\"computeroutput\"><span class=\"identifier\">val</span></code> to produce an\n        unsigned result (if the result is to be signed you will need to handle that\n        separately). When <code class=\"computeroutput\"><span class=\"identifier\">msv_first</span></code>\n        is true, takes <code class=\"computeroutput\"><span class=\"special\">*</span><span class=\"identifier\">i</span></code>\n        as the most significant chunk. Assumes there are <code class=\"computeroutput\"><span class=\"identifier\">chunk_size</span></code>\n        bits in each value read from the iterator range, and that these are in machine\n        native bit/byte order. When <code class=\"computeroutput\"><span class=\"identifier\">chunk_size</span></code>\n        is zero, then assumes that each chunk contains <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">iterator_traits</span><span class=\"special\">&lt;</span><span class=\"identifier\">ForwardIterator</span><span class=\"special\">&gt;::</span><span class=\"identifier\">value_type</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits</span></code>,\n        note that this will give the wrong result if dereferencing the iterators\n        leads to a signed-integer type, <span class=\"bold\"><strong>and</strong></span> the\n        sign bit is significant (be particularly careful if you expect type <code class=\"computeroutput\"><span class=\"keyword\">char</span></code> to contain 8-bit values, as by default\n        it will extract only 7-bits at a time if <code class=\"computeroutput\"><span class=\"keyword\">char</span></code>\n        is signed). As with exporting, if the external data is to be in a non-native\n        byte order (within each chunk), then you will need to create an iterator\n        adaptor that presents it in native order (see <a href=\"http://www.boost.org/doc/libs/release/libs/endian/doc/index.html\" target=\"_top\">Boost.Endian</a>).\n      </p>\n<div class=\"note\"><table border=\"0\" summary=\"Note\">\n<tr>\n<td rowspan=\"2\" align=\"center\" valign=\"top\" width=\"25\"><img alt=\"[Note]\" src=\"../../../../../../doc/src/images/note.png\"></td>\n<th align=\"left\">Note</th>\n</tr>\n<tr><td align=\"left\" valign=\"top\"><p>\n          Note that this function is optimized for the case where the data can be\n          <code class=\"computeroutput\"><span class=\"identifier\">memcpy</span></code>ed from the source\n          to the integer - in this case both iterators much be pointers, and everything\n          must be little-endian.\n        </p></td></tr>\n</table></div>\n<h5>\n<a name=\"boost_multiprecision.tut.import_export.h0\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.tut.import_export.examples\"></a></span><a class=\"link\" href=\"import_export.html#boost_multiprecision.tut.import_export.examples\">Examples</a>\n      </h5>\n<p>\n        In this simple example, we'll import/export the bits of a cpp_int to a vector\n        of 8-bit unsigned values:\n      </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_int</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iomanip</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">vector</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iterator</span><span class=\"special\">&gt;</span>\n\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_int</span><span class=\"special\">;</span>\n   <span class=\"comment\">// Create a cpp_int with just a couple of bits set:</span>\n   <span class=\"identifier\">cpp_int</span> <span class=\"identifier\">i</span><span class=\"special\">;</span>\n   <span class=\"identifier\">bit_set</span><span class=\"special\">(</span><span class=\"identifier\">i</span><span class=\"special\">,</span> <span class=\"number\">5000</span><span class=\"special\">);</span> <span class=\"comment\">// set the 5000'th bit</span>\n   <span class=\"identifier\">bit_set</span><span class=\"special\">(</span><span class=\"identifier\">i</span><span class=\"special\">,</span> <span class=\"number\">200</span><span class=\"special\">);</span>\n   <span class=\"identifier\">bit_set</span><span class=\"special\">(</span><span class=\"identifier\">i</span><span class=\"special\">,</span> <span class=\"number\">50</span><span class=\"special\">);</span>\n   <span class=\"comment\">// export into 8-bit unsigned values, most significant bit first:</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">vector</span><span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"keyword\">char</span><span class=\"special\">&gt;</span> <span class=\"identifier\">v</span><span class=\"special\">;</span>\n   <span class=\"identifier\">export_bits</span><span class=\"special\">(</span><span class=\"identifier\">i</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">back_inserter</span><span class=\"special\">(</span><span class=\"identifier\">v</span><span class=\"special\">),</span> <span class=\"number\">8</span><span class=\"special\">);</span>\n   <span class=\"comment\">// import back again, and check for equality:</span>\n   <span class=\"identifier\">cpp_int</span> <span class=\"identifier\">j</span><span class=\"special\">;</span>\n   <span class=\"identifier\">import_bits</span><span class=\"special\">(</span><span class=\"identifier\">j</span><span class=\"special\">,</span> <span class=\"identifier\">v</span><span class=\"special\">.</span><span class=\"identifier\">begin</span><span class=\"special\">(),</span> <span class=\"identifier\">v</span><span class=\"special\">.</span><span class=\"identifier\">end</span><span class=\"special\">());</span>\n   <span class=\"identifier\">BOOST_MP_ASSERT</span><span class=\"special\">(</span><span class=\"identifier\">i</span> <span class=\"special\">==</span> <span class=\"identifier\">j</span><span class=\"special\">);</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n        Importing or exporting cpp_bin_float is similar, but we must proceed via\n        an intermediate integer:\n      </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iomanip</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">vector</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iterator</span><span class=\"special\">&gt;</span>\n\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_bin_float_100</span><span class=\"special\">;</span>\n   <span class=\"keyword\">using</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_int</span><span class=\"special\">;</span>\n   <span class=\"comment\">// Create a cpp_bin_float to import/export:</span>\n   <span class=\"identifier\">cpp_bin_float_100</span> <span class=\"identifier\">f</span><span class=\"special\">(</span><span class=\"number\">1</span><span class=\"special\">);</span>\n   <span class=\"identifier\">f</span> <span class=\"special\">/=</span> <span class=\"number\">3</span><span class=\"special\">;</span>\n   <span class=\"comment\">// export into 8-bit unsigned values, most significant bit first:</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">vector</span><span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"keyword\">char</span><span class=\"special\">&gt;</span> <span class=\"identifier\">v</span><span class=\"special\">;</span>\n   <span class=\"identifier\">export_bits</span><span class=\"special\">(</span><span class=\"identifier\">cpp_int</span><span class=\"special\">(</span><span class=\"identifier\">f</span><span class=\"special\">.</span><span class=\"identifier\">backend</span><span class=\"special\">().</span><span class=\"identifier\">bits</span><span class=\"special\">()),</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">back_inserter</span><span class=\"special\">(</span><span class=\"identifier\">v</span><span class=\"special\">),</span> <span class=\"number\">8</span><span class=\"special\">);</span>\n   <span class=\"comment\">// Grab the exponent as well:</span>\n   <span class=\"keyword\">int</span> <span class=\"identifier\">e</span> <span class=\"special\">=</span> <span class=\"identifier\">f</span><span class=\"special\">.</span><span class=\"identifier\">backend</span><span class=\"special\">().</span><span class=\"identifier\">exponent</span><span class=\"special\">();</span>\n   <span class=\"comment\">// Import back again, and check for equality, we have to proceed via</span>\n   <span class=\"comment\">// an intermediate integer:</span>\n   <span class=\"identifier\">cpp_int</span> <span class=\"identifier\">i</span><span class=\"special\">;</span>\n   <span class=\"identifier\">import_bits</span><span class=\"special\">(</span><span class=\"identifier\">i</span><span class=\"special\">,</span> <span class=\"identifier\">v</span><span class=\"special\">.</span><span class=\"identifier\">begin</span><span class=\"special\">(),</span> <span class=\"identifier\">v</span><span class=\"special\">.</span><span class=\"identifier\">end</span><span class=\"special\">());</span>\n   <span class=\"identifier\">cpp_bin_float_100</span> <span class=\"identifier\">g</span><span class=\"special\">(</span><span class=\"identifier\">i</span><span class=\"special\">);</span>\n   <span class=\"identifier\">g</span><span class=\"special\">.</span><span class=\"identifier\">backend</span><span class=\"special\">().</span><span class=\"identifier\">exponent</span><span class=\"special\">()</span> <span class=\"special\">=</span> <span class=\"identifier\">e</span><span class=\"special\">;</span>\n   <span class=\"identifier\">BOOST_MP_ASSERT</span><span class=\"special\">(</span><span class=\"identifier\">f</span> <span class=\"special\">==</span> <span class=\"identifier\">g</span><span class=\"special\">);</span>\n<span class=\"special\">}</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"lits.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"rounding.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/input_output.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Input Output</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"limits/how_to_tell.html\" title=\"How to Determine the Kind of a Number From std::numeric_limits\">\n<link rel=\"next\" href=\"hash.html\" title=\"Hash Function Support\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"limits/how_to_tell.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"hash.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.input_output\"></a><a class=\"link\" href=\"input_output.html\" title=\"Input Output\">Input Output</a>\n</h3></div></div></div>\n<h5>\n<a name=\"boost_multiprecision.tut.input_output.h0\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.tut.input_output.loopback_testing\"></a></span><a class=\"link\" href=\"input_output.html#boost_multiprecision.tut.input_output.loopback_testing\">Loopback\n        testing</a>\n      </h5>\n<p>\n        <span class=\"emphasis\"><em>Loopback</em></span> or <span class=\"emphasis\"><em>round-tripping</em></span> refers\n        to writing out a value as a decimal digit string using <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">iostream</span></code>,\n        usually to a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">stringstream</span></code>, and then reading the string\n        back in to another value, and confirming that the two values are identical.\n        A trivial example using <code class=\"computeroutput\"><span class=\"keyword\">float</span></code>\n        is:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">float</span> <span class=\"identifier\">write</span><span class=\"special\">;</span> <span class=\"comment\">// Value to round-trip.</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">stringstream</span> <span class=\"identifier\">ss</span><span class=\"special\">;</span>  <span class=\"comment\">// Read and write std::stringstream.</span>\n<span class=\"identifier\">ss</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_digits10</span><span class=\"special\">);</span>  <span class=\"comment\">// Ensure all potentially significant bits are output.</span>\n<span class=\"identifier\">ss</span><span class=\"special\">.</span><span class=\"identifier\">flags</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">ios_base</span><span class=\"special\">::</span><span class=\"identifier\">fmtflags</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">ios_base</span><span class=\"special\">::</span><span class=\"identifier\">scientific</span><span class=\"special\">));</span> <span class=\"comment\">// Use scientific format.</span>\n<span class=\"identifier\">ss</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">write</span><span class=\"special\">;</span> <span class=\"comment\">// Output to string.</span>\n<span class=\"keyword\">float</span> <span class=\"identifier\">read</span><span class=\"special\">;</span>  <span class=\"comment\">// Expected.</span>\n<span class=\"identifier\">ss</span> <span class=\"special\">&gt;&gt;</span> <span class=\"identifier\">read</span><span class=\"special\">;</span> <span class=\"comment\">// Read decimal digits string from stringstream.</span>\n<span class=\"identifier\">BOOST_CHECK_EQUAL</span><span class=\"special\">(</span><span class=\"identifier\">write</span><span class=\"special\">,</span> <span class=\"identifier\">read</span><span class=\"special\">);</span> <span class=\"comment\">// Should be the same.</span>\n</pre>\n<p>\n        and this can be run in a loop for all possible values of a 32-bit float.\n        For other floating-point types <code class=\"computeroutput\"><span class=\"identifier\">T</span></code>,\n        including <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n        (built-in)</a> <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>, it\n        takes far too long to test all values, so a reasonable test strategy is to\n        use a large number of random values.\n      </p>\n<pre class=\"programlisting\"><span class=\"identifier\">T</span> <span class=\"identifier\">write</span><span class=\"special\">;</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">stringstream</span> <span class=\"identifier\">ss</span><span class=\"special\">;</span>\n<span class=\"identifier\">ss</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_digits10</span><span class=\"special\">);</span>  <span class=\"comment\">// Ensure all potentially significant bits are output.</span>\n<span class=\"identifier\">ss</span><span class=\"special\">.</span><span class=\"identifier\">flags</span><span class=\"special\">(</span><span class=\"identifier\">f</span><span class=\"special\">);</span> <span class=\"comment\">// Changed from default iostream format flags if desired.</span>\n<span class=\"identifier\">ss</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">write</span><span class=\"special\">;</span> <span class=\"comment\">// Output to stringstream.</span>\n\n<span class=\"identifier\">T</span> <span class=\"identifier\">read</span><span class=\"special\">;</span>\n<span class=\"identifier\">ss</span> <span class=\"special\">&gt;&gt;</span> <span class=\"identifier\">read</span><span class=\"special\">;</span> <span class=\"comment\">// Get read using operator&gt;&gt; from stringstream.</span>\n<span class=\"identifier\">BOOST_CHECK_EQUAL</span><span class=\"special\">(</span><span class=\"identifier\">read</span><span class=\"special\">,</span> <span class=\"identifier\">write</span><span class=\"special\">);</span>\n\n<span class=\"identifier\">read</span> <span class=\"special\">=</span> <span class=\"keyword\">static_cast</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;(</span><span class=\"identifier\">ss</span><span class=\"special\">.</span><span class=\"identifier\">str</span><span class=\"special\">());</span> <span class=\"comment\">// Get read by converting from decimal digits string representation of write.</span>\n<span class=\"identifier\">BOOST_CHECK_EQUAL</span><span class=\"special\">(</span><span class=\"identifier\">read</span><span class=\"special\">,</span> <span class=\"identifier\">write</span><span class=\"special\">);</span>\n\n<span class=\"identifier\">read</span> <span class=\"special\">=</span> <span class=\"keyword\">static_cast</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;(</span><span class=\"identifier\">write</span><span class=\"special\">.</span><span class=\"identifier\">str</span><span class=\"special\">(</span><span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"identifier\">f</span><span class=\"special\">));</span>  <span class=\"comment\">// Get read using format specified when written.</span>\n<span class=\"identifier\">BOOST_CHECK_EQUAL</span><span class=\"special\">(</span><span class=\"identifier\">read</span><span class=\"special\">,</span> <span class=\"identifier\">write</span><span class=\"special\">);</span>\n</pre>\n<p>\n        The test at <a href=\"http://www.boost.org/doc/libs/release/libs/multiprecision/doc/html/../../test/test_cpp_bin_float_io.cpp\" target=\"_top\">test_cpp_bin_float_io.cpp</a>\n        allows any floating-point type to be <span class=\"emphasis\"><em>round_tripped</em></span> using\n        a wide range of fairly random values. It also includes tests compared a collection\n        of <a href=\"http://www.boost.org/doc/libs/release/libs/multiprecision/doc/html/../../test/string_data.ipp\" target=\"_top\">stringdata</a> test cases\n        in a file.\n      </p>\n<h5>\n<a name=\"boost_multiprecision.tut.input_output.h1\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.tut.input_output.comparing_with_output_using_fund\"></a></span><a class=\"link\" href=\"input_output.html#boost_multiprecision.tut.input_output.comparing_with_output_using_fund\">Comparing\n        with output using fundamental\n        (built-in) types</a>\n      </h5>\n<p>\n        One can make some comparisons with the output of\n      </p>\n<pre class=\"programlisting\"><span class=\"special\">&lt;</span><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"number\">53</span><span class=\"special\">,</span> <span class=\"identifier\">digit_count_2</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>\n</pre>\n<p>\n        which has the same number of significant bits (53) as 64-bit double precision\n        floating-point.\n      </p>\n<p>\n        However, although most outputs are identical, there are differences on some\n        platforms caused by the implementation-dependent behaviours allowed by the\n        C99 specification <a href=\"http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf\" target=\"_top\">C99\n        ISO/IEC 9899:TC2</a>, incorporated by C++.\n      </p>\n<div class=\"blockquote\"><blockquote class=\"blockquote\"><p>\n          <span class=\"emphasis\"><em>\"For e, E, f, F, g, and G conversions, if the number of\n          significant decimal digits is at most DECIMAL_DIG, then the result should\n          be correctly rounded. If the number of significant decimal digits is more\n          than DECIMAL_DIG but the source value is exactly representable with DECIMAL_DIG\n          digits, then the result should be an exact representation with trailing\n          zeros. Otherwise, the source value is bounded by two adjacent decimal strings\n          L &lt; U, both having DECIMAL_DIG significant digits; the value of the\n          resultant decimal string D should satisfy L&lt;= D &lt;= U, with the extra\n          stipulation that the error should have a correct sign for the current rounding\n          direction.\"</em></span>\n        </p></blockquote></div>\n<p>\n        So not only is correct rounding for the full number of digits not required,\n        but even if the <span class=\"bold\"><strong>optional</strong></span> recommended practice\n        is followed, then the value of these last few digits is unspecified as long\n        as the value is within certain bounds.\n      </p>\n<div class=\"note\"><table border=\"0\" summary=\"Note\">\n<tr>\n<td rowspan=\"2\" align=\"center\" valign=\"top\" width=\"25\"><img alt=\"[Note]\" src=\"../../../../../../doc/src/images/note.png\"></td>\n<th align=\"left\">Note</th>\n</tr>\n<tr><td align=\"left\" valign=\"top\"><p>\n          Do not expect the output from different platforms to be <span class=\"bold\"><strong>identical</strong></span>,\n          but <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span></code> (and other backends) outputs\n          should be correctly rounded to the number of digits requested by the set\n          precision and format.\n        </p></td></tr>\n</table></div>\n<h5>\n<a name=\"boost_multiprecision.tut.input_output.h2\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.tut.input_output.macro_boost_mp_min_exponent_digi\"></a></span><a class=\"link\" href=\"input_output.html#boost_multiprecision.tut.input_output.macro_boost_mp_min_exponent_digi\">Macro\n        BOOST_MP_MIN_EXPONENT_DIGITS</a>\n      </h5>\n<p>\n        <a href=\"http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf\" target=\"_top\">C99\n        Standard</a> for format specifiers, 7.19.6 Formatted input/output functions\n        requires:\n      </p>\n<p>\n        \"The exponent always contains at least two digits, and only as many\n        more digits as necessary to represent the exponent.\"\n      </p>\n<p>\n        So to conform to the C99 standard (incorporated by C++)\n      </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#define</span> <span class=\"identifier\">BOOST_MP_MIN_EXPONENT_DIGITS</span> <span class=\"number\">2</span>\n</pre>\n<p>\n        Confusingly, Microsoft (and MinGW) do not conform to this standard and provide\n        <span class=\"bold\"><strong>at least three digits</strong></span>, for example <code class=\"computeroutput\"><span class=\"number\">1e+001</span></code>. So if you want the output to match\n        that from <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n        (built-in)</a> floating-point types on compilers that use Microsofts\n        runtime then use:\n      </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#define</span> <span class=\"identifier\">BOOST_MP_MIN_EXPONENT_DIGITS</span> <span class=\"number\">3</span>\n</pre>\n<p>\n        Also useful to get the minimum exponent field width is\n      </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#define</span> <span class=\"identifier\">BOOST_MP_MIN_EXPONENT_DIGITS</span> <span class=\"number\">1</span>\n</pre>\n<p>\n        producing a compact output like <code class=\"computeroutput\"><span class=\"number\">2e+4</span></code>,\n        useful when conserving space is important.\n      </p>\n<p>\n        Larger values are also supported, for example, value 4 for <code class=\"computeroutput\"><span class=\"number\">2e+0004</span></code> which may be useful to ensure that\n        columns line up.\n      </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"limits/how_to_tell.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"hash.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/interval/mpfi.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>mpfi_float</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../interval.html\" title=\"Interval Number Types\">\n<link rel=\"prev\" href=\"../interval.html\" title=\"Interval Number Types\">\n<link rel=\"next\" href=\"../complex.html\" title=\"Complex Number Types\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../interval.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../interval.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../complex.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.interval.mpfi\"></a><a class=\"link\" href=\"mpfi.html\" title=\"mpfi_float\">mpfi_float</a>\n</h4></div></div></div>\n<p>\n          <code class=\"computeroutput\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">mpfi</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>    <span class=\"identifier\">mpfi_float_50</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">100</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">mpfifloat_100</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">500</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">mpfifloat_500</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">1000</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>  <span class=\"identifier\">mpfi_float_1000</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">0</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>     <span class=\"identifier\">mpfi_float</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n          The <code class=\"computeroutput\"><span class=\"identifier\">mpfi_float_backend</span></code>\n          type is used in conjunction with <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>:\n          It acts as a thin wrapper around the <a href=\"http://perso.ens-lyon.fr/nathalie.revol/software.html\" target=\"_top\">MPFI</a>\n          <code class=\"computeroutput\"><span class=\"identifier\">mpfi_t</span></code> to provide an real-number\n          type that is a drop-in replacement for the native C++ floating-point types,\n          but with much greater precision and implementing interval arithmetic.\n        </p>\n<p>\n          Type <code class=\"computeroutput\"><span class=\"identifier\">mpfi_float_backend</span></code>\n          can be used at fixed precision by specifying a non-zero <code class=\"computeroutput\"><span class=\"identifier\">Digits10</span></code>\n          template parameter, or at variable precision by setting the template argument\n          to zero. The <code class=\"computeroutput\"><span class=\"keyword\">typedef</span></code>s <code class=\"computeroutput\"><span class=\"identifier\">mpfi_float_50</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">mpfi_float_100</span></code>,\n          <code class=\"computeroutput\"><span class=\"identifier\">mpfi_float_500</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">mpfi_float_1000</span></code> provide arithmetic types\n          at 50, 100, 500 and 1000 decimal digits precision respectively. The <code class=\"computeroutput\"><span class=\"keyword\">typedef</span> <span class=\"identifier\">mpfi_float</span></code>\n          provides a variable precision type whose precision can be controlled via\n          theF <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>s member functions.\n        </p>\n<div class=\"note\"><table border=\"0\" summary=\"Note\">\n<tr>\n<td rowspan=\"2\" align=\"center\" valign=\"top\" width=\"25\"><img alt=\"[Note]\" src=\"../../../../../../../doc/src/images/note.png\"></td>\n<th align=\"left\">Note</th>\n</tr>\n<tr><td align=\"left\" valign=\"top\"><p>\n            This type only provides <code class=\"computeroutput\"><span class=\"identifier\">numeric_limits</span></code>\n            support when the precision is fixed at compile time.\n          </p></td></tr>\n</table></div>\n<p>\n          As well as the usual conversions from arithmetic and string types, instances\n          of <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code> are copy constructible and assignable\n          from:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              The <a href=\"http://perso.ens-lyon.fr/nathalie.revol/software.html\" target=\"_top\">MPFI</a>\n              native type <code class=\"computeroutput\"><span class=\"identifier\">mpfi_t</span></code>.\n            </li>\n<li class=\"listitem\">\n              The <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> wrappers\n              around <a href=\"http://perso.ens-lyon.fr/nathalie.revol/software.html\" target=\"_top\">MPFI</a>\n              or <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a>: <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">M</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code>\n              and <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float</span><span class=\"special\">&lt;</span><span class=\"identifier\">M</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code>.\n            </li>\n<li class=\"listitem\">\n              There is a two argument constructor taking two <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float</span><span class=\"special\">&lt;</span><span class=\"identifier\">M</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code>\n              arguments specifying the interval.\n            </li>\n</ul></div>\n<p>\n          It's also possible to access the underlying <code class=\"computeroutput\"><span class=\"identifier\">mpfi_t</span></code>\n          via the <code class=\"computeroutput\"><span class=\"identifier\">data</span><span class=\"special\">()</span></code>\n          member function of <code class=\"computeroutput\"><span class=\"identifier\">mpfi_float_backend</span></code>.\n        </p>\n<p>\n          Things you should know when using this type:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              A default constructed <code class=\"computeroutput\"><span class=\"identifier\">mpfi_float_backend</span></code>\n              is set to zero (<span class=\"emphasis\"><em>Note that this is <span class=\"bold\"><strong>not</strong></span>\n              the default <a href=\"http://perso.ens-lyon.fr/nathalie.revol/software.html\" target=\"_top\">MPFI</a>\n              behavior</em></span>).\n            </li>\n<li class=\"listitem\">\n              No changes are made to <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> or\n              <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a> global settings, so this\n              type can coexist with existing <a href=\"http://www.mpfr.org\" target=\"_top\">MPFR</a>\n              or <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> code.\n            </li>\n<li class=\"listitem\">\n              The code can equally use <a href=\"http://mpir.org/\" target=\"_top\">MPIR</a>\n              in place of <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> - indeed that\n              is the preferred option on Win32.\n            </li>\n<li class=\"listitem\">\n              This backend supports rvalue-references and is move-aware, making instantiations\n              of <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> on this backend\n              move aware.\n            </li>\n<li class=\"listitem\">\n              Conversion from a string results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code>\n              being thrown if the string can not be interpreted as a valid floating-point\n              number.\n            </li>\n<li class=\"listitem\">\n              Division by zero results in an infinity.\n            </li>\n</ul></div>\n<p>\n          There are some additional non member functions for working on intervals:\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span> <span class=\"identifier\">lower</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">);</span>\n</pre>\n<p>\n          Returns the lower end of the interval.\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span> <span class=\"identifier\">upper</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">);</span>\n</pre>\n<p>\n          Returns the upper end of the interval.\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span> <span class=\"identifier\">median</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">);</span>\n</pre>\n<p>\n          Returns the mid point of the interval.\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span> <span class=\"identifier\">width</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">);</span>\n</pre>\n<p>\n          Returns the absolute width of the interval.\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span> <span class=\"identifier\">intersect</span><span class=\"special\">(</span>\n  <span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span>\n  <span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span>  <span class=\"identifier\">b</span><span class=\"special\">);</span>\n</pre>\n<p>\n          Returns the interval which is the intersection of the <span class=\"emphasis\"><em>a</em></span>\n          and <span class=\"emphasis\"><em>b</em></span>. Returns an unspecified empty interval if there\n          is no such intersection.\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span> <span class=\"identifier\">hull</span><span class=\"special\">(</span>\n  <span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span>\n  <span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span>  <span class=\"identifier\">b</span><span class=\"special\">);</span>\n</pre>\n<p>\n          Returns the interval which is the union of <span class=\"emphasis\"><em>a</em></span> and\n          <span class=\"emphasis\"><em>b</em></span>.\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">overlap</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span>\n             <span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span>  <span class=\"identifier\">b</span><span class=\"special\">);</span>\n</pre>\n<p>\n          Returns <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> only if the intervals\n          <span class=\"emphasis\"><em>a</em></span> and <span class=\"emphasis\"><em>b</em></span> overlap.\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates1</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates2</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">in</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates1</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span>\n        <span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates2</span><span class=\"special\">&gt;&amp;</span>  <span class=\"identifier\">b</span><span class=\"special\">);</span>\n</pre>\n<p>\n          Returns <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> only if point\n          <span class=\"emphasis\"><em>a</em></span> is contained within the interval <span class=\"emphasis\"><em>b</em></span>.\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">zero_in</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">);</span>\n</pre>\n<p>\n          Returns <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> only if the interval\n          <span class=\"emphasis\"><em>a</em></span> contains the value zero.\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">subset</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span>\n            <span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">);</span>\n</pre>\n<p>\n          Returns <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> only if <span class=\"emphasis\"><em>a</em></span>\n          is a subset of <span class=\"emphasis\"><em>b</em></span>.\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">proper_subset</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span>\n                   <span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">);</span>\n</pre>\n<p>\n          Returns <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> only if <span class=\"emphasis\"><em>a</em></span>\n          is a proper subset of <span class=\"emphasis\"><em>b</em></span>.\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">empty</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">);</span>\n</pre>\n<p>\n          Returns <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> only if <span class=\"emphasis\"><em>a</em></span>\n          is an empty interval, equivalent to <code class=\"computeroutput\"><span class=\"identifier\">upper</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">)</span>\n          <span class=\"special\">&lt;</span> <span class=\"identifier\">lower</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">)</span></code>.\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">Digits10</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">singleton</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">Digits10</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">);</span>\n</pre>\n<p>\n          Returns <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> if <code class=\"computeroutput\"><span class=\"identifier\">lower</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">)</span> <span class=\"special\">==</span>\n          <span class=\"identifier\">upper</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">)</span></code>.\n        </p>\n<h6>\n<a name=\"boost_multiprecision.tut.interval.mpfi.h0\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.interval.mpfi.mpfi_example\"></a></span><a class=\"link\" href=\"mpfi.html#boost_multiprecision.tut.interval.mpfi.mpfi_example\"> MPFI\n          example:</a>\n        </h6>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">mpfi</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">math</span><span class=\"special\">/</span><span class=\"identifier\">special_functions</span><span class=\"special\">/</span><span class=\"identifier\">gamma</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// Operations at variable precision and no numeric_limits support:</span>\n   <span class=\"identifier\">mpfi_float</span> <span class=\"identifier\">a</span> <span class=\"special\">=</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n   <span class=\"identifier\">mpfi_float</span><span class=\"special\">::</span><span class=\"identifier\">default_precision</span><span class=\"special\">(</span><span class=\"number\">1000</span><span class=\"special\">);</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">mpfi_float</span><span class=\"special\">::</span><span class=\"identifier\">default_precision</span><span class=\"special\">()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">sqrt</span><span class=\"special\">(</span><span class=\"identifier\">a</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// print root-2</span>\n\n   <span class=\"comment\">// Operations at fixed precision and full numeric_limits support:</span>\n   <span class=\"identifier\">mpfi_float_100</span> <span class=\"identifier\">b</span> <span class=\"special\">=</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_100</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"comment\">// We can use any C++ std lib function:</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">log</span><span class=\"special\">(</span><span class=\"identifier\">b</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// print log(2)</span>\n\n   <span class=\"comment\">// Access the underlying data:</span>\n   <span class=\"identifier\">mpfi_t</span> <span class=\"identifier\">r</span><span class=\"special\">;</span>\n   <span class=\"identifier\">mpfi_init</span><span class=\"special\">(</span><span class=\"identifier\">r</span><span class=\"special\">);</span>\n   <span class=\"identifier\">mpfi_set</span><span class=\"special\">(</span><span class=\"identifier\">r</span><span class=\"special\">,</span> <span class=\"identifier\">b</span><span class=\"special\">.</span><span class=\"identifier\">backend</span><span class=\"special\">().</span><span class=\"identifier\">data</span><span class=\"special\">());</span>\n\n   <span class=\"comment\">// Construct some explicit intervals and perform set operations:</span>\n   <span class=\"identifier\">mpfi_float_50</span> <span class=\"identifier\">i1</span><span class=\"special\">(</span><span class=\"number\">1</span><span class=\"special\">,</span> <span class=\"number\">2</span><span class=\"special\">),</span> <span class=\"identifier\">i2</span><span class=\"special\">(</span><span class=\"number\">1.5</span><span class=\"special\">,</span> <span class=\"number\">2.5</span><span class=\"special\">);</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">intersect</span><span class=\"special\">(</span><span class=\"identifier\">i1</span><span class=\"special\">,</span> <span class=\"identifier\">i2</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">hull</span><span class=\"special\">(</span><span class=\"identifier\">i1</span><span class=\"special\">,</span> <span class=\"identifier\">i2</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">overlap</span><span class=\"special\">(</span><span class=\"identifier\">i1</span><span class=\"special\">,</span> <span class=\"identifier\">i2</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">subset</span><span class=\"special\">(</span><span class=\"identifier\">i1</span><span class=\"special\">,</span> <span class=\"identifier\">i2</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"identifier\">mpfi_clear</span><span class=\"special\">(</span><span class=\"identifier\">r</span><span class=\"special\">);</span>\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../interval.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../interval.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../complex.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/interval.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Interval Number Types</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"floats/fp_eg/gauss_lagerre_quadrature.html\" title=\"Gauss-Laguerre quadrature\">\n<link rel=\"next\" href=\"interval/mpfi.html\" title=\"mpfi_float\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"floats/fp_eg/gauss_lagerre_quadrature.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"interval/mpfi.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.interval\"></a><a class=\"link\" href=\"interval.html\" title=\"Interval Number Types\">Interval Number Types</a>\n</h3></div></div></div>\n<div class=\"toc\"><dl class=\"toc\"><dt><span class=\"section\"><a href=\"interval/mpfi.html\">mpfi_float</a></span></dt></dl></div>\n<p>\n        There is one currently only one interval number type supported - <a href=\"http://perso.ens-lyon.fr/nathalie.revol/software.html\" target=\"_top\">MPFI</a>.\n      </p>\n<p>\n        [ section:mpfi mpfi_float]\n      </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"floats/fp_eg/gauss_lagerre_quadrature.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"interval/mpfi.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/ints/cpp_int.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>cpp_int</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../ints.html\" title=\"Integer Types\">\n<link rel=\"prev\" href=\"../ints.html\" title=\"Integer Types\">\n<link rel=\"next\" href=\"gmp_int.html\" title=\"gmp_int\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../ints.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ints.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"gmp_int.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.ints.cpp_int\"></a><a class=\"link\" href=\"cpp_int.html\" title=\"cpp_int\">cpp_int</a>\n</h4></div></div></div>\n<p>\n          <code class=\"computeroutput\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_int</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">unspecified</span><span class=\"special\">-</span><span class=\"identifier\">type</span> <span class=\"identifier\">limb_type</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">enum</span> <span class=\"identifier\">cpp_integer_type</span>    <span class=\"special\">{</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">unsigned_magnitude</span> <span class=\"special\">};</span>\n<span class=\"keyword\">enum</span> <span class=\"identifier\">cpp_int_check_type</span>  <span class=\"special\">{</span> <span class=\"identifier\">checked</span><span class=\"special\">,</span> <span class=\"identifier\">unchecked</span> <span class=\"special\">};</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span> <span class=\"identifier\">MinBits</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">,</span>\n          <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span> <span class=\"identifier\">MaxBits</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">,</span>\n          <span class=\"identifier\">cpp_integer_type</span> <span class=\"identifier\">SignType</span> <span class=\"special\">=</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span>\n          <span class=\"identifier\">cpp_int_check_type</span> <span class=\"identifier\">Checked</span> <span class=\"special\">=</span> <span class=\"identifier\">unchecked</span><span class=\"special\">,</span>\n          <span class=\"keyword\">class</span> <span class=\"identifier\">Allocator</span> <span class=\"special\">=</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">allocator</span><span class=\"special\">&lt;</span><span class=\"identifier\">limb_type</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">cpp_int_backend</span><span class=\"special\">;</span>\n<span class=\"comment\">//</span>\n<span class=\"comment\">// Expression templates default to et_off if there is no allocator:</span>\n<span class=\"comment\">//</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span> <span class=\"identifier\">MinBits</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span> <span class=\"identifier\">MaxBits</span><span class=\"special\">,</span> <span class=\"identifier\">cpp_integer_type</span> <span class=\"identifier\">SignType</span><span class=\"special\">,</span> <span class=\"identifier\">cpp_int_check_type</span> <span class=\"identifier\">Checked</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">struct</span> <span class=\"identifier\">expression_template_default</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">MinBits</span><span class=\"special\">,</span> <span class=\"identifier\">MaxBits</span><span class=\"special\">,</span> <span class=\"identifier\">SignType</span><span class=\"special\">,</span> <span class=\"identifier\">Checked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>\n<span class=\"special\">{</span> <span class=\"keyword\">static</span> <span class=\"keyword\">const</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">value</span> <span class=\"special\">=</span> <span class=\"identifier\">et_off</span><span class=\"special\">;</span> <span class=\"special\">};</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;&gt;</span> <span class=\"special\">&gt;</span>              <span class=\"identifier\">cpp_int</span><span class=\"special\">;</span>    <span class=\"comment\">// arbitrary precision integer</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">rational_adaptor</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;&gt;</span> <span class=\"special\">&gt;</span>    <span class=\"identifier\">cpp_rational_backend</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_rational_backend</span><span class=\"special\">&gt;</span>            <span class=\"identifier\">cpp_rational</span><span class=\"special\">;</span> <span class=\"comment\">// arbitrary precision rational number</span>\n\n<span class=\"comment\">// Fixed precision unsigned types:</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">128</span><span class=\"special\">,</span> <span class=\"number\">128</span><span class=\"special\">,</span> <span class=\"identifier\">unsigned_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">unchecked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">uint128_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">256</span><span class=\"special\">,</span> <span class=\"number\">256</span><span class=\"special\">,</span> <span class=\"identifier\">unsigned_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">unchecked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">uint256_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">512</span><span class=\"special\">,</span> <span class=\"number\">512</span><span class=\"special\">,</span> <span class=\"identifier\">unsigned_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">unchecked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">uint512_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">1024</span><span class=\"special\">,</span> <span class=\"number\">1024</span><span class=\"special\">,</span> <span class=\"identifier\">unsigned_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">unchecked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">uint1024_t</span><span class=\"special\">;</span>\n\n<span class=\"comment\">// Fixed precision signed types:</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">128</span><span class=\"special\">,</span> <span class=\"number\">128</span><span class=\"special\">,</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">unchecked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>     <span class=\"identifier\">int128_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">256</span><span class=\"special\">,</span> <span class=\"number\">256</span><span class=\"special\">,</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">unchecked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>     <span class=\"identifier\">int256_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">512</span><span class=\"special\">,</span> <span class=\"number\">512</span><span class=\"special\">,</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">unchecked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>     <span class=\"identifier\">int512_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">1024</span><span class=\"special\">,</span> <span class=\"number\">1024</span><span class=\"special\">,</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">unchecked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">int1024_t</span><span class=\"special\">;</span>\n\n<span class=\"comment\">// Over again, but with checking enabled this time:</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">checked</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>                 <span class=\"identifier\">checked_cpp_int</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">rational_adaptor</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">checked</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>       <span class=\"identifier\">checked_cpp_rational_backend</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_rational_backend</span><span class=\"special\">&gt;</span>                                              <span class=\"identifier\">checked_cpp_rational</span><span class=\"special\">;</span>\n\n<span class=\"comment\">// Checked fixed precision unsigned types:</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">128</span><span class=\"special\">,</span> <span class=\"number\">128</span><span class=\"special\">,</span> <span class=\"identifier\">unsigned_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">checked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>     <span class=\"identifier\">checked_uint128_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">256</span><span class=\"special\">,</span> <span class=\"number\">256</span><span class=\"special\">,</span> <span class=\"identifier\">unsigned_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">checked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>     <span class=\"identifier\">checked_uint256_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">512</span><span class=\"special\">,</span> <span class=\"number\">512</span><span class=\"special\">,</span> <span class=\"identifier\">unsigned_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">checked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>     <span class=\"identifier\">checked_uint512_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">1024</span><span class=\"special\">,</span> <span class=\"number\">1024</span><span class=\"special\">,</span> <span class=\"identifier\">unsigned_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">checked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">checked_uint1024_t</span><span class=\"special\">;</span>\n\n<span class=\"comment\">// Fixed precision signed types:</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">128</span><span class=\"special\">,</span> <span class=\"number\">128</span><span class=\"special\">,</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">checked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>       <span class=\"identifier\">checked_int128_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">256</span><span class=\"special\">,</span> <span class=\"number\">256</span><span class=\"special\">,</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">checked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>       <span class=\"identifier\">checked_int256_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">512</span><span class=\"special\">,</span> <span class=\"number\">512</span><span class=\"special\">,</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">checked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>       <span class=\"identifier\">checked_int512_t</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">1024</span><span class=\"special\">,</span> <span class=\"number\">1024</span><span class=\"special\">,</span> <span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span> <span class=\"identifier\">checked</span><span class=\"special\">,</span> <span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>     <span class=\"identifier\">checked_int1024_t</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n          The <code class=\"computeroutput\"><span class=\"identifier\">cpp_int_backend</span></code> type\n          is normally used via one of the convenience typedefs given above.\n        </p>\n<p>\n          This back-end is the \"Swiss Army Knife\" of integer types as it\n          can represent both fixed and <a href=\"http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic\" target=\"_top\">arbitrary\n          precision</a> integer types, and both signed and unsigned types. There\n          are five template arguments:\n        </p>\n<div class=\"variablelist\">\n<p class=\"title\"><b></b></p>\n<dl class=\"variablelist\">\n<dt><span class=\"term\">MinBits</span></dt>\n<dd><p>\n                Determines the number of Bits to store directly within the object\n                before resorting to dynamic memory allocation. When zero, this field\n                is determined automatically based on how many bits can be stored\n                in union with the dynamic storage header: setting a larger value\n                may improve performance as larger integer values will be stored internally\n                before memory allocation is required.\n              </p></dd>\n<dt><span class=\"term\">MaxBits</span></dt>\n<dd><p>\n                Determines the maximum number of bits to be stored in the type: resulting\n                in a fixed precision type. When this value is the same as MinBits,\n                then the Allocator parameter is ignored, as no dynamic memory allocation\n                will ever be performed: in this situation the Allocator parameter\n                should be set to type <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>.\n                Note that this parameter should not be used simply to prevent large\n                memory allocations, not only is that role better performed by the\n                allocator, but fixed precision integers have a tendency to allocate\n                all of MaxBits of storage more often than one would expect.\n              </p></dd>\n<dt><span class=\"term\">SignType</span></dt>\n<dd><p>\n                Determines whether the resulting type is signed or not. Note that\n                for <a href=\"http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic\" target=\"_top\">arbitrary\n                precision</a> types this parameter must be <code class=\"computeroutput\"><span class=\"identifier\">signed_magnitude</span></code>.\n                For fixed precision types then this type may be either <code class=\"computeroutput\"><span class=\"identifier\">signed_magnitude</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">unsigned_magnitude</span></code>.\n              </p></dd>\n<dt><span class=\"term\">Checked</span></dt>\n<dd><p>\n                This parameter has two values: <code class=\"computeroutput\"><span class=\"identifier\">checked</span></code>\n                or <code class=\"computeroutput\"><span class=\"identifier\">unchecked</span></code>. See\n                below.\n              </p></dd>\n<dt><span class=\"term\">Allocator</span></dt>\n<dd><p>\n                The allocator to use for dynamic memory allocation, or type <code class=\"computeroutput\"><span class=\"keyword\">void</span></code> if MaxBits == MinBits.\n              </p></dd>\n</dl>\n</div>\n<p>\n          When the template parameter Checked is set to <code class=\"computeroutput\"><span class=\"identifier\">checked</span></code>\n          then the result is a <span class=\"emphasis\"><em>checked-integer</em></span>, checked and\n          unchecked integers have the following properties:\n        </p>\n<div class=\"informaltable\"><table class=\"table\">\n<colgroup>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                  <p>\n                    Condition\n                  </p>\n                </th>\n<th>\n                  <p>\n                    Checked-Integer\n                  </p>\n                </th>\n<th>\n                  <p>\n                    Unchecked-Integer\n                  </p>\n                </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                  <p>\n                    Numeric overflow in fixed precision arithmetic\n                  </p>\n                </td>\n<td>\n                  <p>\n                    Throws a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code>.\n                  </p>\n                </td>\n<td>\n                  <p>\n                    Performs arithmetic modulo 2<sup>MaxBits</sup>\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    Constructing an integer from a value that can not be represented\n                    in the target type\n                  </p>\n                </td>\n<td>\n                  <p>\n                    Throws a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">range_error</span></code>.\n                  </p>\n                </td>\n<td>\n                  <p>\n                    Converts the value modulo 2<sup>MaxBits</sup>, signed to unsigned conversions\n                    extract the last MaxBits bits of the 2's complement representation\n                    of the input value.\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    Unsigned subtraction yielding a negative value.\n                  </p>\n                </td>\n<td>\n                  <p>\n                    Throws a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">range_error</span></code>.\n                  </p>\n                </td>\n<td>\n                  <p>\n                    Yields the value that would result from treating the unsigned\n                    type as a 2's complement signed type.\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    Attempting a bitwise operation on a negative value.\n                  </p>\n                </td>\n<td>\n                  <p>\n                    Throws a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">range_error</span></code>\n                  </p>\n                </td>\n<td>\n                  <p>\n                    Yields the value, but not the bit pattern, that would result\n                    from performing the operation on a 2's complement integer type.\n                  </p>\n                </td>\n</tr>\n</tbody>\n</table></div>\n<p>\n          Things you should know when using this type:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              Default constructed <code class=\"computeroutput\"><span class=\"identifier\">cpp_int_backend</span></code>s\n              have the value zero.\n            </li>\n<li class=\"listitem\">\n              Division by zero results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code>\n              being thrown.\n            </li>\n<li class=\"listitem\">\n              Construction from a string that contains invalid non-numeric characters\n              results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code> being thrown.\n            </li>\n<li class=\"listitem\">\n              Since the precision of <code class=\"computeroutput\"><span class=\"identifier\">cpp_int_backend</span></code>\n              is necessarily limited when the allocator parameter is void, care should\n              be taken to avoid numeric overflow when using this type unless you\n              actually want modulo-arithmetic behavior.\n            </li>\n<li class=\"listitem\">\n              The type uses a sign-magnitude representation internally, so type\n              <code class=\"computeroutput\"><span class=\"identifier\">int128_t</span></code> has 128-bits\n              of precision plus an extra sign bit. In this respect the behaviour\n              of these types differs from <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n              (built-in)</a> 2's complement types. In might be tempting to use\n              a 127-bit type instead, and indeed this does work, but behaviour is\n              still slightly different from a 2's complement <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n              (built-in)</a> type as the minimum and maximum values are identical\n              (apart from the sign), where as they differ by one for a true 2's complement\n              type. That said it should be noted that there's no requirement for\n              fundamental_types to be 2's complement either - it's simply that this\n              is the most common format by far.\n            </li>\n<li class=\"listitem\">\n              Attempting to print negative values as either an Octal or Hexadecimal\n              string results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code>\n              being thrown, this is a direct consequence of the sign-magnitude representation.\n            </li>\n<li class=\"listitem\">\n              The fixed precision types <code class=\"computeroutput\"><span class=\"special\">[</span><span class=\"identifier\">checked_</span><span class=\"special\">][</span><span class=\"identifier\">u</span><span class=\"special\">]</span><span class=\"identifier\">intXXX_t</span></code> have expression template\n              support turned off - it seems to make little difference to the performance\n              of these types either way - so we may as well have the faster compile\n              times by turning the feature off.\n            </li>\n<li class=\"listitem\">\n              Unsigned types support subtraction - the result is \"as if\"\n              a 2's complement operation had been performed as long as they are not\n              <span class=\"emphasis\"><em>checked-integers</em></span> (see above). In other words they\n              behave pretty much as a <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n              (built-in)</a> integer type would in this situation. So for example\n              if we were using <code class=\"computeroutput\"><span class=\"identifier\">uint128_t</span></code>\n              then <code class=\"computeroutput\"><span class=\"identifier\">uint128_t</span><span class=\"special\">(</span><span class=\"number\">1</span><span class=\"special\">)-</span><span class=\"number\">4</span></code>\n              would result in the value <code class=\"computeroutput\"><span class=\"number\">0</span><span class=\"identifier\">xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD</span></code>\n              of type <code class=\"computeroutput\"><span class=\"identifier\">uint128_t</span></code>.\n              However, had this operation been performed on <code class=\"computeroutput\"><span class=\"identifier\">checked_uint128_t</span></code>\n              then a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">range_error</span></code> would have been thrown.\n            </li>\n<li class=\"listitem\">\n              Unary negation of unsigned types results in a compiler error (static\n              assertion).\n            </li>\n<li class=\"listitem\">\n              This backend supports rvalue-references and is move-aware, making instantiations\n              of <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> on this backend\n              move aware.\n            </li>\n<li class=\"listitem\">\n              When used at fixed precision, the size of this type is always one machine\n              word (plus any compiler-applied alignment padding) larger than you\n              would expect for an N-bit integer: the extra word stores both the sign,\n              and how many machine words in the integer are actually in use. The\n              latter is an optimisation for larger fixed precision integers, so that\n              a 1024-bit integer has almost the same performance characteristics\n              as a 128-bit integer, rather than being 4 times slower for addition\n              and 16 times slower for multiplication (assuming the values involved\n              would always fit in 128 bits). Typically this means you can use an\n              integer type wide enough for the \"worst case scenario\" with\n              only minor performance degradation even if most of the time the arithmetic\n              could in fact be done with a narrower type. Also note that unsigned\n              fixed precision types small enough to fit inside the largest native\n              integer become a simple wrapper around that type, this includes the\n              \"checked\" variants. Small signed types will always have an\n              extra sign word and so be larger than their native equivalent.\n            </li>\n<li class=\"listitem\">\n              When used at fixed precision and MaxBits is smaller than the number\n              of bits in the largest native integer type, then internally <code class=\"computeroutput\"><span class=\"identifier\">cpp_int_backend</span></code> switches to a \"trivial\"\n              implementation where it is just a thin wrapper around a single integer.\n              Note that it will still be slightly slower than a bare native integer,\n              as it emulates a signed-magnitude representation rather than simply\n              using the platforms native sign representation: this ensures there\n              is no step change in behavior as a cpp_int grows in size.\n            </li>\n<li class=\"listitem\">\n              Fixed precision <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>'s\n              have some support for <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code>\n              values and user-defined literals, see <a class=\"link\" href=\"../lits.html\" title=\"Literal Types and constexpr Support\">here</a>\n              for the full description. For example <code class=\"computeroutput\"><span class=\"number\">0xfffff</span><span class=\"identifier\">_cppi1024</span></code> specifies a 1024-bit integer\n              with the value 0xffff. This can be used to generate compile-time constants\n              that are too large to fit into any <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n              (built-in)</a> number type.\n            </li>\n<li class=\"listitem\">\n              The <a class=\"link\" href=\"cpp_int.html\" title=\"cpp_int\">cpp_int</a>\n              types support constexpr arithmetic, provided it is a fixed-precision\n              type with no allocator. It may also be a checked integer: in which\n              case a compiler error will be generated on overflow or undefined behaviour.\n              In addition the free functions <code class=\"computeroutput\"><span class=\"identifier\">abs</span></code>,\n              <code class=\"computeroutput\"><span class=\"identifier\">swap</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">multiply</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">add</span></code>,\n              <code class=\"computeroutput\"><span class=\"identifier\">subtract</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">divide_qr</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">integer_modulus</span></code>,\n              <code class=\"computeroutput\"><span class=\"identifier\">powm</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">lsb</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">msb</span></code>,\n              <code class=\"computeroutput\"><span class=\"identifier\">bit_test</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">bit_set</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">bit_unset</span></code>,\n              <code class=\"computeroutput\"><span class=\"identifier\">bit_flip</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">sqrt</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">gcd</span></code>,\n              <code class=\"computeroutput\"><span class=\"identifier\">lcm</span></code> are all supported.\n              Use of <a class=\"link\" href=\"cpp_int.html\" title=\"cpp_int\">cpp_int</a>\n              in this way requires either a C++2a compiler (one which supports <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">is_constant_evaluated</span><span class=\"special\">()</span></code>),\n              or GCC-6 or later in C++14 mode. Compilers other than GCC and without\n              <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">is_constant_evaluated</span><span class=\"special\">()</span></code>\n              will support a very limited set of operations: expect to hit roadblocks\n              rather easily.\n            </li>\n<li class=\"listitem\">\n              You can import/export the raw bits of a <a class=\"link\" href=\"cpp_int.html\" title=\"cpp_int\">cpp_int</a>\n              to and from external storage via the <code class=\"computeroutput\"><span class=\"identifier\">import_bits</span></code>\n              and <code class=\"computeroutput\"><span class=\"identifier\">export_bits</span></code> functions.\n              More information is in the <a class=\"link\" href=\"../import_export.html\" title=\"Importing and Exporting Data to and from cpp_int and cpp_bin_float\">section\n              on import/export</a>.\n            </li>\n</ul></div>\n<h6>\n<a name=\"boost_multiprecision.tut.ints.cpp_int.h0\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.ints.cpp_int.cpp_int_eg\"></a></span><a class=\"link\" href=\"cpp_int.html#boost_multiprecision.tut.ints.cpp_int.cpp_int_eg\">Example:</a>\n        </h6>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_int</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">int128_t</span> <span class=\"identifier\">v</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// Do some fixed precision arithmetic:</span>\n   <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;=</span> <span class=\"number\">20</span><span class=\"special\">;</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n      <span class=\"identifier\">v</span> <span class=\"special\">*=</span> <span class=\"identifier\">i</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">v</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// prints 2432902008176640000 (i.e. 20!)</span>\n\n   <span class=\"comment\">// Repeat at arbitrary precision:</span>\n   <span class=\"identifier\">cpp_int</span> <span class=\"identifier\">u</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n   <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;=</span> <span class=\"number\">100</span><span class=\"special\">;</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n      <span class=\"identifier\">u</span> <span class=\"special\">*=</span> <span class=\"identifier\">i</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// prints 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 (i.e. 100!)</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">u</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../ints.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ints.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"gmp_int.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/ints/egs/bitops.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Bit Operations</title>\n<link rel=\"stylesheet\" href=\"../../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../egs.html\" title=\"Examples\">\n<link rel=\"prev\" href=\"factorials.html\" title=\"Factorials\">\n<link rel=\"next\" href=\"../../floats.html\" title=\"Floating-point Types\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"factorials.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../egs.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../../floats.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h5 class=\"title\">\n<a name=\"boost_multiprecision.tut.ints.egs.bitops\"></a><a class=\"link\" href=\"bitops.html\" title=\"Bit Operations\">Bit Operations</a>\n</h5></div></div></div>\n<p>\n            In this example we'll show how individual bits within an integer may\n            be manipulated, we'll start with an often needed calculation of <span class=\"emphasis\"><em>2<sup>n</sup> -\n            1</em></span>, which we could obviously implement like this:\n          </p>\n<pre class=\"programlisting\"><span class=\"keyword\">using</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_int</span><span class=\"special\">;</span>\n\n<span class=\"identifier\">cpp_int</span> <span class=\"identifier\">b1</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">n</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"identifier\">cpp_int</span> <span class=\"identifier\">r</span><span class=\"special\">(</span><span class=\"number\">1</span><span class=\"special\">);</span>\n   <span class=\"keyword\">return</span> <span class=\"special\">(</span><span class=\"identifier\">r</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">n</span><span class=\"special\">)</span> <span class=\"special\">-</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n            Calling:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">hex</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">showbase</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">b1</span><span class=\"special\">(</span><span class=\"number\">200</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n</pre>\n<p>\n            Yields as expected:\n          </p>\n<pre class=\"programlisting\">0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF</pre>\n<p>\n            However, we could equally just set the n'th bit in the result, like this:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">cpp_int</span> <span class=\"identifier\">b2</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">n</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"identifier\">cpp_int</span> <span class=\"identifier\">r</span><span class=\"special\">(</span><span class=\"number\">0</span><span class=\"special\">);</span>\n   <span class=\"keyword\">return</span> <span class=\"special\">--</span><span class=\"identifier\">bit_set</span><span class=\"special\">(</span><span class=\"identifier\">r</span><span class=\"special\">,</span> <span class=\"identifier\">n</span><span class=\"special\">);</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n            Note how the <code class=\"computeroutput\"><span class=\"identifier\">bit_set</span></code>\n            function sets the specified bit in its argument and then returns a reference\n            to the result - which we can then simply decrement. The result from a\n            call to <code class=\"computeroutput\"><span class=\"identifier\">b2</span></code> is the same\n            as that to <code class=\"computeroutput\"><span class=\"identifier\">b1</span></code>.\n          </p>\n<p>\n            We can equally test bits, so for example the n'th bit of the result returned\n            from <code class=\"computeroutput\"><span class=\"identifier\">b2</span></code> shouldn't be\n            set unless we increment it first:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">BOOST_MP_ASSERT</span><span class=\"special\">(!</span><span class=\"identifier\">bit_test</span><span class=\"special\">(</span><span class=\"identifier\">b1</span><span class=\"special\">(</span><span class=\"number\">200</span><span class=\"special\">),</span> <span class=\"number\">200</span><span class=\"special\">));</span>     <span class=\"comment\">// OK</span>\n<span class=\"identifier\">BOOST_MP_ASSERT</span><span class=\"special\">(</span><span class=\"identifier\">bit_test</span><span class=\"special\">(++</span><span class=\"identifier\">b1</span><span class=\"special\">(</span><span class=\"number\">200</span><span class=\"special\">),</span> <span class=\"number\">200</span><span class=\"special\">));</span>    <span class=\"comment\">// OK</span>\n</pre>\n<p>\n            And of course if we flip the n'th bit after increment, then we should\n            get back to zero:\n          </p>\n<pre class=\"programlisting\"><span class=\"identifier\">BOOST_MP_ASSERT</span><span class=\"special\">(!</span><span class=\"identifier\">bit_flip</span><span class=\"special\">(++</span><span class=\"identifier\">b1</span><span class=\"special\">(</span><span class=\"number\">200</span><span class=\"special\">),</span> <span class=\"number\">200</span><span class=\"special\">));</span>   <span class=\"comment\">// OK</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"factorials.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../egs.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../../floats.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/ints/egs/factorials.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Factorials</title>\n<link rel=\"stylesheet\" href=\"../../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../egs.html\" title=\"Examples\">\n<link rel=\"prev\" href=\"../egs.html\" title=\"Examples\">\n<link rel=\"next\" href=\"bitops.html\" title=\"Bit Operations\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../egs.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../egs.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"bitops.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h5 class=\"title\">\n<a name=\"boost_multiprecision.tut.ints.egs.factorials\"></a><a class=\"link\" href=\"factorials.html\" title=\"Factorials\">Factorials</a>\n</h5></div></div></div>\n<p>\n            In this simple example, we'll write a routine to print out all of the\n            factorials which will fit into a 128-bit integer. At the end of the routine\n            we do some fancy iostream formatting of the results:\n          </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_int</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iomanip</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">vector</span><span class=\"special\">&gt;</span>\n\n\n<span class=\"keyword\">void</span> <span class=\"identifier\">print_factorials</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_int</span><span class=\"special\">;</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Print all the factorials that will fit inside a 128-bit integer.</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Begin by building a big table of factorials, once we know just how</span>\n   <span class=\"comment\">// large the largest is, we'll be able to \"pretty format\" the results.</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Calculate the largest number that will fit inside 128 bits, we could</span>\n   <span class=\"comment\">// also have used numeric_limits&lt;int128_t&gt;::max() for this value:</span>\n   <span class=\"identifier\">cpp_int</span> <span class=\"identifier\">limit</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"identifier\">cpp_int</span><span class=\"special\">(</span><span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"number\">128</span><span class=\"special\">)</span> <span class=\"special\">-</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Our table of values:</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">vector</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int</span><span class=\"special\">&gt;</span> <span class=\"identifier\">results</span><span class=\"special\">;</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Initial values:</span>\n   <span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n   <span class=\"identifier\">cpp_int</span> <span class=\"identifier\">factorial</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Cycle through the factorials till we reach the limit:</span>\n   <span class=\"keyword\">while</span><span class=\"special\">(</span><span class=\"identifier\">factorial</span> <span class=\"special\">&lt;</span> <span class=\"identifier\">limit</span><span class=\"special\">)</span>\n   <span class=\"special\">{</span>\n      <span class=\"identifier\">results</span><span class=\"special\">.</span><span class=\"identifier\">push_back</span><span class=\"special\">(</span><span class=\"identifier\">factorial</span><span class=\"special\">);</span>\n      <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">;</span>\n      <span class=\"identifier\">factorial</span> <span class=\"special\">*=</span> <span class=\"identifier\">i</span><span class=\"special\">;</span>\n   <span class=\"special\">}</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Lets see how many digits the largest factorial was:</span>\n   <span class=\"keyword\">unsigned</span> <span class=\"identifier\">digits</span> <span class=\"special\">=</span> <span class=\"identifier\">results</span><span class=\"special\">.</span><span class=\"identifier\">back</span><span class=\"special\">().</span><span class=\"identifier\">str</span><span class=\"special\">().</span><span class=\"identifier\">size</span><span class=\"special\">();</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Now print them out, using right justification, while we're at it</span>\n   <span class=\"comment\">// we'll indicate the limit of each integer type, so begin by defining</span>\n   <span class=\"comment\">// the limits for 16, 32, 64 etc bit integers:</span>\n   <span class=\"identifier\">cpp_int</span> <span class=\"identifier\">limits</span><span class=\"special\">[]</span> <span class=\"special\">=</span> <span class=\"special\">{</span>\n      <span class=\"special\">(</span><span class=\"identifier\">cpp_int</span><span class=\"special\">(</span><span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"number\">16</span><span class=\"special\">)</span> <span class=\"special\">-</span> <span class=\"number\">1</span><span class=\"special\">,</span>\n      <span class=\"special\">(</span><span class=\"identifier\">cpp_int</span><span class=\"special\">(</span><span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"number\">32</span><span class=\"special\">)</span> <span class=\"special\">-</span> <span class=\"number\">1</span><span class=\"special\">,</span>\n      <span class=\"special\">(</span><span class=\"identifier\">cpp_int</span><span class=\"special\">(</span><span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"number\">64</span><span class=\"special\">)</span> <span class=\"special\">-</span> <span class=\"number\">1</span><span class=\"special\">,</span>\n      <span class=\"special\">(</span><span class=\"identifier\">cpp_int</span><span class=\"special\">(</span><span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"number\">128</span><span class=\"special\">)</span> <span class=\"special\">-</span> <span class=\"number\">1</span><span class=\"special\">,</span>\n   <span class=\"special\">};</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">string</span> <span class=\"identifier\">bit_counts</span><span class=\"special\">[]</span> <span class=\"special\">=</span> <span class=\"special\">{</span> <span class=\"string\">\"16\"</span><span class=\"special\">,</span> <span class=\"string\">\"32\"</span><span class=\"special\">,</span> <span class=\"string\">\"64\"</span><span class=\"special\">,</span> <span class=\"string\">\"128\"</span> <span class=\"special\">};</span>\n   <span class=\"keyword\">unsigned</span> <span class=\"identifier\">current_limit</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n   <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">j</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span> <span class=\"identifier\">j</span> <span class=\"special\">&lt;</span> <span class=\"identifier\">results</span><span class=\"special\">.</span><span class=\"identifier\">size</span><span class=\"special\">();</span> <span class=\"special\">++</span><span class=\"identifier\">j</span><span class=\"special\">)</span>\n   <span class=\"special\">{</span>\n      <span class=\"keyword\">if</span><span class=\"special\">(</span><span class=\"identifier\">limits</span><span class=\"special\">[</span><span class=\"identifier\">current_limit</span><span class=\"special\">]</span> <span class=\"special\">&lt;</span> <span class=\"identifier\">results</span><span class=\"special\">[</span><span class=\"identifier\">j</span><span class=\"special\">])</span>\n      <span class=\"special\">{</span>\n         <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">string</span> <span class=\"identifier\">message</span> <span class=\"special\">=</span> <span class=\"string\">\"Limit of \"</span> <span class=\"special\">+</span> <span class=\"identifier\">bit_counts</span><span class=\"special\">[</span><span class=\"identifier\">current_limit</span><span class=\"special\">]</span> <span class=\"special\">+</span> <span class=\"string\">\" bit integers\"</span><span class=\"special\">;</span>\n         <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setfill</span><span class=\"special\">(</span><span class=\"char\">'.'</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setw</span><span class=\"special\">(</span><span class=\"identifier\">digits</span><span class=\"special\">+</span><span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">right</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">message</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setfill</span><span class=\"special\">(</span><span class=\"char\">' '</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n         <span class=\"special\">++</span><span class=\"identifier\">current_limit</span><span class=\"special\">;</span>\n      <span class=\"special\">}</span>\n      <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setw</span><span class=\"special\">(</span><span class=\"identifier\">digits</span> <span class=\"special\">+</span> <span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">right</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">results</span><span class=\"special\">[</span><span class=\"identifier\">j</span><span class=\"special\">]</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"special\">}</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n            The output from this routine is:\n          </p>\n<pre class=\"programlisting\">                                       1\n                                       2\n                                       6\n                                      24\n                                     120\n                                     720\n                                    5040\n                                   40320\n................Limit of 16 bit integers\n                                  362880\n                                 3628800\n                                39916800\n                               479001600\n................Limit of 32 bit integers\n                              6227020800\n                             87178291200\n                           1307674368000\n                          20922789888000\n                         355687428096000\n                        6402373705728000\n                      121645100408832000\n                     2432902008176640000\n................Limit of 64 bit integers\n                    51090942171709440000\n                  1124000727777607680000\n                 25852016738884976640000\n                620448401733239439360000\n              15511210043330985984000000\n             403291461126605635584000000\n           10888869450418352160768000000\n          304888344611713860501504000000\n         8841761993739701954543616000000\n       265252859812191058636308480000000\n      8222838654177922817725562880000000\n    263130836933693530167218012160000000\n   8683317618811886495518194401280000000\n 295232799039604140847618609643520000000\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../egs.html\"><img src=\"../../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../egs.html\"><img src=\"../../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../../index.html\"><img src=\"../../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"bitops.html\"><img src=\"../../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/ints/egs.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Examples</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../ints.html\" title=\"Integer Types\">\n<link rel=\"prev\" href=\"tom_int.html\" title=\"tom_int\">\n<link rel=\"next\" href=\"egs/factorials.html\" title=\"Factorials\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"tom_int.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ints.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"egs/factorials.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.ints.egs\"></a><a class=\"link\" href=\"egs.html\" title=\"Examples\">Examples</a>\n</h4></div></div></div>\n<div class=\"toc\"><dl class=\"toc\">\n<dt><span class=\"section\"><a href=\"egs/factorials.html\">Factorials</a></span></dt>\n<dt><span class=\"section\"><a href=\"egs/bitops.html\">Bit Operations</a></span></dt>\n</dl></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"tom_int.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ints.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"egs/factorials.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/ints/gmp_int.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>gmp_int</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../ints.html\" title=\"Integer Types\">\n<link rel=\"prev\" href=\"cpp_int.html\" title=\"cpp_int\">\n<link rel=\"next\" href=\"tom_int.html\" title=\"tom_int\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"cpp_int.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ints.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"tom_int.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.ints.gmp_int\"></a><a class=\"link\" href=\"gmp_int.html\" title=\"gmp_int\">gmp_int</a>\n</h4></div></div></div>\n<p>\n          <code class=\"computeroutput\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">gmp</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">class</span> <span class=\"identifier\">gmp_int</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_int</span> <span class=\"special\">&gt;</span>         <span class=\"identifier\">mpz_int</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n          The <code class=\"computeroutput\"><span class=\"identifier\">gmp_int</span></code> back-end is\n          used via the typedef <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">mpz_int</span></code>.\n          It acts as a thin wrapper around the <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>\n          <code class=\"computeroutput\"><span class=\"identifier\">mpz_t</span></code> to provide an integer\n          type that is a drop-in replacement for the native C++ integer types, but\n          with unlimited precision.\n        </p>\n<p>\n          As well as the usual conversions from arithmetic and string types, type\n          <code class=\"computeroutput\"><span class=\"identifier\">mpz_int</span></code> is copy constructible\n          and assignable from:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              The <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> native types: <code class=\"computeroutput\"><span class=\"identifier\">mpf_t</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">mpz_t</span></code>,\n              <code class=\"computeroutput\"><span class=\"identifier\">mpq_t</span></code>.\n            </li>\n<li class=\"listitem\">\n              Instances of <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;</span></code> that are wrappers around those\n              types: <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_float</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_rational</span><span class=\"special\">&gt;</span></code>.\n            </li>\n</ul></div>\n<p>\n          It's also possible to access the underlying <code class=\"computeroutput\"><span class=\"identifier\">mpz_t</span></code>\n          via the <code class=\"computeroutput\"><span class=\"identifier\">data</span><span class=\"special\">()</span></code>\n          member function of <code class=\"computeroutput\"><span class=\"identifier\">gmp_int</span></code>.\n        </p>\n<p>\n          Things you should know when using this type:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              No changes are made to the GMP library's global settings - so you can\n              safely mix this type with existing code that uses <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>.\n            </li>\n<li class=\"listitem\">\n              Default constructed <code class=\"computeroutput\"><span class=\"identifier\">gmp_int</span></code>s\n              have the value zero (this is GMP's default behavior).\n            </li>\n<li class=\"listitem\">\n              Formatted IO for this type does not support octal or hexadecimal notation\n              for negative values, as a result performing formatted output on this\n              type when the argument is negative and either of the flags <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">ios_base</span><span class=\"special\">::</span><span class=\"identifier\">oct</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">ios_base</span><span class=\"special\">::</span><span class=\"identifier\">hex</span></code>\n              are set, will result in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code>\n              will be thrown.\n            </li>\n<li class=\"listitem\">\n              Conversion from a string results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code>\n              being thrown if the string can not be interpreted as a valid integer.\n            </li>\n<li class=\"listitem\">\n              Division by zero results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code>\n              being thrown.\n            </li>\n<li class=\"listitem\">\n              Although this type is a wrapper around <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>\n              it will work equally well with <a href=\"http://mpir.org/\" target=\"_top\">MPIR</a>.\n              Indeed use of <a href=\"http://mpir.org/\" target=\"_top\">MPIR</a> is recommended\n              on Win32.\n            </li>\n<li class=\"listitem\">\n              This backend supports rvalue-references and is move-aware, making instantiations\n              of <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> on this backend\n              move aware.\n            </li>\n</ul></div>\n<h6>\n<a name=\"boost_multiprecision.tut.ints.gmp_int.h0\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.ints.gmp_int.example\"></a></span><a class=\"link\" href=\"gmp_int.html#boost_multiprecision.tut.ints.gmp_int.example\">Example:</a>\n        </h6>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">gmp</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">mpz_int</span> <span class=\"identifier\">v</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// Do some arithmetic:</span>\n   <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;=</span> <span class=\"number\">1000</span><span class=\"special\">;</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n      <span class=\"identifier\">v</span> <span class=\"special\">*=</span> <span class=\"identifier\">i</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">v</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// prints 1000!</span>\n\n   <span class=\"comment\">// Access the underlying representation:</span>\n   <span class=\"identifier\">mpz_t</span> <span class=\"identifier\">z</span><span class=\"special\">;</span>\n   <span class=\"identifier\">mpz_init</span><span class=\"special\">(</span><span class=\"identifier\">z</span><span class=\"special\">);</span>\n   <span class=\"identifier\">mpz_set</span><span class=\"special\">(</span><span class=\"identifier\">z</span><span class=\"special\">,</span> <span class=\"identifier\">v</span><span class=\"special\">.</span><span class=\"identifier\">backend</span><span class=\"special\">().</span><span class=\"identifier\">data</span><span class=\"special\">());</span>\n   <span class=\"identifier\">mpz_clear</span><span class=\"special\">(</span><span class=\"identifier\">z</span><span class=\"special\">);</span>\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"cpp_int.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ints.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"tom_int.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/ints/tom_int.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>tom_int</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../ints.html\" title=\"Integer Types\">\n<link rel=\"prev\" href=\"gmp_int.html\" title=\"gmp_int\">\n<link rel=\"next\" href=\"egs.html\" title=\"Examples\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"gmp_int.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ints.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"egs.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.ints.tom_int\"></a><a class=\"link\" href=\"tom_int.html\" title=\"tom_int\">tom_int</a>\n</h4></div></div></div>\n<p>\n          <code class=\"computeroutput\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">tommath</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">class</span> <span class=\"identifier\">tommath_int</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">tommath_int</span> <span class=\"special\">&gt;</span>         <span class=\"identifier\">tom_int</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n          The <code class=\"computeroutput\"><span class=\"identifier\">tommath_int</span></code> back-end\n          is used via the typedef <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">tom_int</span></code>.\n          It acts as a thin wrapper around the <a href=\"http://libtom.net\" target=\"_top\">libtommath</a>\n          <code class=\"computeroutput\"><span class=\"identifier\">tom_int</span></code> to provide an integer\n          type that is a drop-in replacement for the native C++ integer types, but\n          with unlimited precision.\n        </p>\n<p>\n          Things you should know when using this type:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              Default constructed objects have the value zero (this is <a href=\"http://libtom.net\" target=\"_top\">libtommath</a>'s\n              default behavior).\n            </li>\n<li class=\"listitem\">\n              Although <code class=\"computeroutput\"><span class=\"identifier\">tom_int</span></code> is\n              mostly a drop in replacement for the integer <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n              (built-in) types</a>, it should be noted that it is a rather strange\n              beast as it's a signed type that is not a 2's complement type. As a\n              result the bitwise operations <code class=\"computeroutput\"><span class=\"special\">|</span>\n              <span class=\"special\">&amp;</span> <span class=\"special\">^</span></code>\n              will throw a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code> exception if either\n              of the arguments is negative. Similarly the complement operator<code class=\"computeroutput\"><span class=\"special\">~</span></code> is deliberately not implemented for\n              this type.\n            </li>\n<li class=\"listitem\">\n              Formatted IO for this type does not support octal or hexadecimal notation\n              for negative values, as a result performing formatted output on this\n              type when the argument is negative and either of the flags <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">ios_base</span><span class=\"special\">::</span><span class=\"identifier\">oct</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">ios_base</span><span class=\"special\">::</span><span class=\"identifier\">hex</span></code>\n              are set, will result in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code>\n              will be thrown.\n            </li>\n<li class=\"listitem\">\n              Conversion from a string results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code>\n              being thrown if the string can not be interpreted as a valid integer.\n            </li>\n<li class=\"listitem\">\n              Division by zero results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code>\n              being thrown.\n            </li>\n</ul></div>\n<h6>\n<a name=\"boost_multiprecision.tut.ints.tom_int.h0\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.ints.tom_int.example\"></a></span><a class=\"link\" href=\"tom_int.html#boost_multiprecision.tut.ints.tom_int.example\">Example:</a>\n        </h6>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">tommath</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">tom_int</span> <span class=\"identifier\">v</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// Do some arithmetic:</span>\n   <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;=</span> <span class=\"number\">1000</span><span class=\"special\">;</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n      <span class=\"identifier\">v</span> <span class=\"special\">*=</span> <span class=\"identifier\">i</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">v</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// prints 1000!</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">hex</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">v</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// prints 1000! in hex format</span>\n\n   <span class=\"keyword\">try</span><span class=\"special\">{</span>\n      <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">hex</span> <span class=\"special\">&lt;&lt;</span> <span class=\"special\">-</span><span class=\"identifier\">v</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// Ooops! can't print a negative value in hex format!</span>\n   <span class=\"special\">}</span>\n   <span class=\"keyword\">catch</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span><span class=\"special\">&amp;</span> <span class=\"identifier\">e</span><span class=\"special\">)</span>\n   <span class=\"special\">{</span>\n      <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">e</span><span class=\"special\">.</span><span class=\"identifier\">what</span><span class=\"special\">()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"special\">}</span>\n\n   <span class=\"keyword\">try</span><span class=\"special\">{</span>\n      <span class=\"comment\">// v is not a 2's complement type, bitwise operations are only supported</span>\n      <span class=\"comment\">// on positive values:</span>\n      <span class=\"identifier\">v</span> <span class=\"special\">=</span> <span class=\"special\">-</span><span class=\"identifier\">v</span> <span class=\"special\">&amp;</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n   <span class=\"special\">}</span>\n   <span class=\"keyword\">catch</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span><span class=\"special\">&amp;</span> <span class=\"identifier\">e</span><span class=\"special\">)</span>\n   <span class=\"special\">{</span>\n      <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">e</span><span class=\"special\">.</span><span class=\"identifier\">what</span><span class=\"special\">()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"special\">}</span>\n\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"gmp_int.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../ints.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"egs.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/ints.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Integer Types</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"next\" href=\"ints/cpp_int.html\" title=\"cpp_int\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"ints/cpp_int.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.ints\"></a><a class=\"link\" href=\"ints.html\" title=\"Integer Types\">Integer Types</a>\n</h3></div></div></div>\n<div class=\"toc\"><dl class=\"toc\">\n<dt><span class=\"section\"><a href=\"ints/cpp_int.html\">cpp_int</a></span></dt>\n<dt><span class=\"section\"><a href=\"ints/gmp_int.html\">gmp_int</a></span></dt>\n<dt><span class=\"section\"><a href=\"ints/tom_int.html\">tom_int</a></span></dt>\n<dt><span class=\"section\"><a href=\"ints/egs.html\">Examples</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"ints/egs/factorials.html\">Factorials</a></span></dt>\n<dt><span class=\"section\"><a href=\"ints/egs/bitops.html\">Bit Operations</a></span></dt>\n</dl></dd>\n</dl></div>\n<p>\n        The following back-ends provide integer arithmetic:\n      </p>\n<div class=\"informaltable\"><table class=\"table\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend Type\n                </p>\n              </th>\n<th>\n                <p>\n                  Header\n                </p>\n              </th>\n<th>\n                <p>\n                  Radix\n                </p>\n              </th>\n<th>\n                <p>\n                  Dependencies\n                </p>\n              </th>\n<th>\n                <p>\n                  Pros\n                </p>\n              </th>\n<th>\n                <p>\n                  Cons\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  boost/multiprecision/cpp_int.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  2\n                </p>\n              </td>\n<td>\n                <p>\n                  None\n                </p>\n              </td>\n<td>\n                <p>\n                  Very versatile, Boost licensed, all C++ integer type which support\n                  both <a href=\"http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic\" target=\"_top\">arbitrary\n                  precision</a> and fixed precision integer types.\n                </p>\n              </td>\n<td>\n                <p>\n                  Slower than <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>, though\n                  typically not as slow as <a href=\"http://libtom.net\" target=\"_top\">libtommath</a>\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">gmp_int</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  boost/multiprecision/gmp.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  2\n                </p>\n              </td>\n<td>\n                <p>\n                  <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>\n                </p>\n              </td>\n<td>\n                <p>\n                  Very fast and efficient back-end.\n                </p>\n              </td>\n<td>\n                <p>\n                  Dependency on GNU licensed <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>\n                  library.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">tom_int</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  boost/multiprecision/tommath.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  2\n                </p>\n              </td>\n<td>\n                <p>\n                  <a href=\"http://libtom.net\" target=\"_top\">libtommath</a>\n                </p>\n              </td>\n<td>\n                <p>\n                  Public domain back-end with no licence restrictions.\n                </p>\n              </td>\n<td>\n                <p>\n                  Slower than <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>.\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"ints/cpp_int.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/limits/constants.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>std::numeric_limits&lt;&gt; constants</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../limits.html\" title=\"Numeric Limits\">\n<link rel=\"prev\" href=\"../limits.html\" title=\"Numeric Limits\">\n<link rel=\"next\" href=\"functions.html\" title=\"std::numeric_limits&lt;&gt; functions\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../limits.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../limits.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"functions.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.limits.constants\"></a><a class=\"link\" href=\"constants.html\" title=\"std::numeric_limits&lt;&gt; constants\">std::numeric_limits&lt;&gt;\n        constants</a>\n</h4></div></div></div>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.constants.h0\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.constants.is_specialized\"></a></span><a class=\"link\" href=\"constants.html#boost_multiprecision.tut.limits.constants.is_specialized\">is_specialized</a>\n        </h5>\n<p>\n          <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> for all arithmetic types\n          (integer, floating and fixed-point) for which <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">numeric_limits</span></code>\n          is specialized.\n        </p>\n<p>\n          A typical test is\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">if</span> <span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_specialized</span> <span class=\"special\">==</span> <span class=\"keyword\">false</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"type \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"keyword\">typeid</span><span class=\"special\">(</span><span class=\"identifier\">T</span><span class=\"special\">).</span><span class=\"identifier\">name</span><span class=\"special\">()</span>  <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\" is not specialized for std::numeric_limits!\"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"comment\">// ...</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n          Typically <code class=\"computeroutput\"><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_specialized</span></code>\n          is <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> for all <code class=\"computeroutput\"><span class=\"identifier\">T</span></code> where the compile-time constant members\n          of <code class=\"computeroutput\"><span class=\"identifier\">numeric_limits</span></code> are indeed\n          known at compile time, and don't vary at runtime. For example floating-point\n          types with runtime-variable precision such as <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float</span></code>\n          have no <code class=\"computeroutput\"><span class=\"identifier\">numeric_limits</span></code>\n          specialization as it would be impossible to define all the members at compile\n          time. In contrast the precision of a type such as <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float_50</span></code>\n          is known at compile time, and so it <span class=\"emphasis\"><em>does</em></span> have a <code class=\"computeroutput\"><span class=\"identifier\">numeric_limits</span></code> specialization.\n        </p>\n<p>\n          Note that not all the <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code>\n          member constants and functions are meaningful for all user-defined types\n          (UDT), such as the decimal and binary multiprecision types provided here.\n          More information on this is given in the sections below.\n        </p>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.constants.h1\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.constants.infinity\"></a></span><a class=\"link\" href=\"constants.html#boost_multiprecision.tut.limits.constants.infinity\">infinity</a>\n        </h5>\n<p>\n          For floating-point types, ∞ is defined wherever possible, but clearly infinity\n          is meaningless for __arbitrary_precision arithmetic backends, and there\n          is one floating-point type (GMP's <code class=\"computeroutput\"><span class=\"identifier\">mpf_t</span></code>,\n          see <a class=\"link\" href=\"../floats/gmp_float.html\" title=\"gmp_float\">gmp_float</a>)\n          which has no notion of infinity or NaN at all.\n        </p>\n<p>\n          A typical test whether infinity is implemented is\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">if</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">has_infinity</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">infinity</span><span class=\"special\">()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n          and using tests like this is strongly recommended to improve portability.\n        </p>\n<div class=\"warning\"><table border=\"0\" summary=\"Warning\">\n<tr>\n<td rowspan=\"2\" align=\"center\" valign=\"top\" width=\"25\"><img alt=\"[Warning]\" src=\"../../../../../../../doc/src/images/warning.png\"></td>\n<th align=\"left\">Warning</th>\n</tr>\n<tr><td align=\"left\" valign=\"top\"><p>\n            If the backend is switched to a type that does not support infinity (or\n            similarly NaNs) then, without checks like this, there will be trouble.\n          </p></td></tr>\n</table></div>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.constants.h2\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.constants.is_signed\"></a></span><a class=\"link\" href=\"constants.html#boost_multiprecision.tut.limits.constants.is_signed\">is_signed</a>\n        </h5>\n<p>\n          <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_signed</span> <span class=\"special\">==</span>\n          <span class=\"keyword\">true</span></code> if the type <code class=\"computeroutput\"><span class=\"identifier\">T</span></code>\n          is signed.\n        </p>\n<p>\n          For <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n          (built-in)</a> binary types, the sign is held in a single bit, but\n          for other types (<code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float</span></code>\n          and <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span></code>) it may\n          be a separate storage element, usually <code class=\"computeroutput\"><span class=\"keyword\">bool</span></code>.\n        </p>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.constants.h3\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.constants.is_exact\"></a></span><a class=\"link\" href=\"constants.html#boost_multiprecision.tut.limits.constants.is_exact\">is_exact</a>\n        </h5>\n<p>\n          <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_exact</span> <span class=\"special\">==</span>\n          <span class=\"keyword\">true</span></code> if type T uses exact representations.\n        </p>\n<p>\n          This is defined as <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> for\n          all integer types and <code class=\"computeroutput\"><span class=\"keyword\">false</span></code>\n          for floating-point types.\n        </p>\n<p>\n          <a href=\"http://stackoverflow.com/questions/14203654/stdnumeric-limitsis-exact-what-is-a-usable-definition\" target=\"_top\">A\n          usable definition</a> has been discussed.\n        </p>\n<p>\n          ISO/IEC 10967-1, Language independent arithmetic, noted by the C++ Standard\n          defines\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">A</span> <span class=\"identifier\">floating</span><span class=\"special\">-</span><span class=\"identifier\">point</span> <span class=\"identifier\">type</span> <span class=\"identifier\">F</span> <span class=\"identifier\">shall</span> <span class=\"identifier\">be</span> <span class=\"identifier\">a</span> <span class=\"identifier\">finite</span> <span class=\"identifier\">subset</span> <span class=\"identifier\">of</span> <span class=\"special\">[</span><span class=\"identifier\">real</span><span class=\"special\">].</span>\n</pre>\n<p>\n          The important practical distinction is that all integers (up to <code class=\"computeroutput\"><span class=\"identifier\">max</span><span class=\"special\">()</span></code>)\n          can be stored exactly.\n        </p>\n<p>\n          <a href=\"http://en.wikipedia.org/wiki/Rational_number\" target=\"_top\">Rational</a>\n          types using two integer types are also exact.\n        </p>\n<p>\n          Floating-point types <span class=\"bold\"><strong>cannot store all real values</strong></span>\n          (those in the set of ℜ) <span class=\"bold\"><strong>exactly</strong></span>. For example,\n          0.5 can be stored exactly in a binary floating-point, but 0.1 cannot. What\n          is stored is the nearest representable real value, that is, rounded to\n          nearest.\n        </p>\n<p>\n          Fixed-point types (usually decimal) are also defined as exact, in that\n          they only store a <span class=\"bold\"><strong>fixed precision</strong></span>, so\n          half cents or pennies (or less) cannot be stored. The results of computations\n          are rounded up or down, just like the result of integer division stored\n          as an integer result.\n        </p>\n<p>\n          There are number of proposals to <a href=\"http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3407.html\" target=\"_top\">add\n          Decimal floating-point Support to C++</a>.\n        </p>\n<p>\n          <a href=\"http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2849.pdf\" target=\"_top\">Decimal\n          TR</a>.\n        </p>\n<p>\n          And also <a href=\"http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3352.html\" target=\"_top\">C++\n          Binary Fixed-Point Arithmetic</a>.\n        </p>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.constants.h4\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.constants.is_bounded\"></a></span><a class=\"link\" href=\"constants.html#boost_multiprecision.tut.limits.constants.is_bounded\">is_bounded</a>\n        </h5>\n<p>\n          <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_bounded</span> <span class=\"special\">==</span>\n          <span class=\"keyword\">true</span></code> if the set of values represented\n          by the type <code class=\"computeroutput\"><span class=\"identifier\">T</span></code> is finite.\n        </p>\n<p>\n          This is <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> for all <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental (built-in)\n          type</a> integer, fixed and floating-point types, and most multi-precision\n          types.\n        </p>\n<p>\n          It is only <code class=\"computeroutput\"><span class=\"keyword\">false</span></code> for a few\n          __arbitrary_precision types like <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>.\n        </p>\n<p>\n          Rational and fixed-exponent representations are exact but not integer.\n        </p>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.constants.h5\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.constants.is_modulo\"></a></span><a class=\"link\" href=\"constants.html#boost_multiprecision.tut.limits.constants.is_modulo\">is_modulo</a>\n        </h5>\n<p>\n          <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_modulo</span></code> is defined as <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> if adding two positive values of type\n          T can yield a result less than either value.\n        </p>\n<p>\n          <code class=\"computeroutput\"><span class=\"identifier\">is_modulo</span> <span class=\"special\">==</span>\n          <span class=\"keyword\">true</span></code> means that the type does not\n          overflow, but, for example, 'wraps around' to zero, when adding one to\n          the <code class=\"computeroutput\"><span class=\"identifier\">max</span><span class=\"special\">()</span></code>\n          value.\n        </p>\n<p>\n          For most <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n          (built-in)</a> integer types, <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;&gt;::</span><span class=\"identifier\">is_modulo</span></code>\n          is <code class=\"computeroutput\"><span class=\"keyword\">true</span></code>.\n        </p>\n<p>\n          <code class=\"computeroutput\"><span class=\"keyword\">bool</span></code> is the only exception.\n        </p>\n<p>\n          The modulo behaviour is sometimes useful, but also can be unexpected, and\n          sometimes undesired, behaviour.\n        </p>\n<p>\n          Overflow of signed integers can be especially unexpected, possibly causing\n          change of sign.\n        </p>\n<p>\n          Boost.Multiprecision integer type <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>\n          is not modulo because as an __arbitrary_precision types, it expands to\n          hold any value that the machine resources permit.\n        </p>\n<p>\n          However fixed precision <a class=\"link\" href=\"../ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>'s\n          may be modulo if they are unchecked (i.e. they behave just like <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental (built-in)</a>\n          integers), but not if they are checked (overflow causes an exception to\n          be raised).\n        </p>\n<p>\n          <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n          (built-in)</a> and multi-precision floating-point types are normally\n          not modulo.\n        </p>\n<p>\n          Where possible, overflow is to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;&gt;::</span><span class=\"identifier\">infinity</span><span class=\"special\">()</span></code>, provided <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;&gt;::</span><span class=\"identifier\">has_infinity</span>\n          <span class=\"special\">==</span> <span class=\"keyword\">true</span></code>.\n        </p>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.constants.h6\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.constants.radix\"></a></span><a class=\"link\" href=\"constants.html#boost_multiprecision.tut.limits.constants.radix\">radix</a>\n        </h5>\n<p>\n          Constant <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">radix</span></code> returns either 2 (for <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n          (built-in)</a> and binary types) or 10 (for decimal types).\n        </p>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.constants.h7\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.constants.digits\"></a></span><a class=\"link\" href=\"constants.html#boost_multiprecision.tut.limits.constants.digits\">digits</a>\n        </h5>\n<p>\n          The number of <code class=\"computeroutput\"><span class=\"identifier\">radix</span></code> digits\n          that be represented without change:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              for integer types, the number of <span class=\"bold\"><strong>non-sign bits</strong></span>\n              in the significand.\n            </li>\n<li class=\"listitem\">\n              for floating types, the number of <span class=\"bold\"><strong>radix digits</strong></span>\n              in the significand.\n            </li>\n</ul></div>\n<p>\n          The values include any implicit bit, so for example, for the ubiquious\n          <code class=\"computeroutput\"><span class=\"keyword\">double</span></code> using 64 bits (<a href=\"http://en.wikipedia.org/wiki/Double_precision_floating-point_format\" target=\"_top\">IEEE\n          binary64 </a>), <code class=\"computeroutput\"><span class=\"identifier\">digits</span></code>\n          == 53, even though there are only 52 actual bits of the significand stored\n          in the representation. The value of <code class=\"computeroutput\"><span class=\"identifier\">digits</span></code>\n          reflects the fact that there is one implicit bit which is always set to\n          1.\n        </p>\n<p>\n          The Boost.Multiprecision binary types do not use an implicit bit, so the\n          <code class=\"computeroutput\"><span class=\"identifier\">digits</span></code> member reflects\n          exactly how many bits of precision were requested:\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"number\">53</span><span class=\"special\">,</span> <span class=\"identifier\">digit_base_2</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>   <span class=\"identifier\">float64</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">&lt;</span><span class=\"number\">113</span><span class=\"special\">,</span> <span class=\"identifier\">digit_base_2</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>  <span class=\"identifier\">float128</span><span class=\"special\">;</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">float64</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits</span> <span class=\"special\">==</span> <span class=\"number\">53.</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">float128</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits</span> <span class=\"special\">==</span> <span class=\"number\">113.</span>\n</pre>\n<p>\n          For the most common case of <code class=\"computeroutput\"><span class=\"identifier\">radix</span>\n          <span class=\"special\">==</span> <span class=\"number\">2</span></code>,\n          <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits</span></code> is the number of bits in the representation,\n          not counting any sign bit.\n        </p>\n<p>\n          For a decimal integer type, when <code class=\"computeroutput\"><span class=\"identifier\">radix</span>\n          <span class=\"special\">==</span> <span class=\"number\">10</span></code>,\n          it is the number of decimal digits.\n        </p>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.constants.h8\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.constants.digits10\"></a></span><a class=\"link\" href=\"constants.html#boost_multiprecision.tut.limits.constants.digits10\">digits10</a>\n        </h5>\n<p>\n          Constant <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span></code> returns the number of decimal\n          digits that can be represented without change or loss.\n        </p>\n<p>\n          For example, <code class=\"computeroutput\"><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"keyword\">char</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span></code> is 2.\n        </p>\n<p>\n          This somewhat inscrutable definition means that an <code class=\"computeroutput\"><span class=\"keyword\">unsigned</span>\n          <span class=\"keyword\">char</span></code> can hold decimal values <code class=\"computeroutput\"><span class=\"number\">0.</span><span class=\"special\">.</span><span class=\"number\">99</span></code>\n          without loss of precision or accuracy, usually from truncation.\n        </p>\n<p>\n          Had the definition been 3 then that would imply it could hold 0..999, but\n          as we all know, an 8-bit <code class=\"computeroutput\"><span class=\"keyword\">unsigned</span>\n          <span class=\"keyword\">char</span></code> can only hold 0..255, and an\n          attempt to store 256 or more will involve loss or change.\n        </p>\n<p>\n          For bounded integers, it is thus <span class=\"bold\"><strong>one less</strong></span>\n          than number of decimal digits you need to display the biggest integer\n          <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max</span><span class=\"special\">()</span></code>.\n          This value can be used to predict the layout width required for\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span>\n  <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setw</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">short</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span> <span class=\"special\">+</span><span class=\"number\">1</span> <span class=\"special\">+</span><span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"comment\">// digits10+1, and +1 for sign.</span>\n  <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">showpos</span> <span class=\"special\">&lt;&lt;</span> <span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">short</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max</span><span class=\"special\">)()</span> <span class=\"comment\">// +32767</span>\n  <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span>\n  <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setw</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">short</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span> <span class=\"special\">+</span><span class=\"number\">1</span> <span class=\"special\">+</span><span class=\"number\">1</span><span class=\"special\">)</span>\n  <span class=\"special\">&lt;&lt;</span> <span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">short</span><span class=\"special\">&gt;::</span><span class=\"identifier\">min</span><span class=\"special\">)()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>   <span class=\"comment\">// -32767</span>\n</pre>\n<p>\n          For example, <code class=\"computeroutput\"><span class=\"keyword\">unsigned</span> <span class=\"keyword\">short</span></code>\n          is often stored in 16 bits, so the maximum value is 0xFFFF or 65535.\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span>\n  <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setw</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"keyword\">short</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span> <span class=\"special\">+</span><span class=\"number\">1</span> <span class=\"special\">+</span><span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"comment\">// digits10+1, and +1 for sign.</span>\n  <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">showpos</span> <span class=\"special\">&lt;&lt;</span> <span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"keyword\">short</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max</span><span class=\"special\">)()</span> <span class=\"comment\">//  65535</span>\n  <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span>\n  <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setw</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"keyword\">short</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span> <span class=\"special\">+</span><span class=\"number\">1</span> <span class=\"special\">+</span><span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"comment\">// digits10+1, and +1 for sign.</span>\n  <span class=\"special\">&lt;&lt;</span> <span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"keyword\">short</span><span class=\"special\">&gt;::</span><span class=\"identifier\">min</span><span class=\"special\">)()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>   <span class=\"comment\">//      0</span>\n</pre>\n<p>\n          For bounded floating-point types, if we create a <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>\n          with a value with <code class=\"computeroutput\"><span class=\"identifier\">digits10</span></code>\n          (usually 15) decimal digits, <code class=\"computeroutput\"><span class=\"number\">1e15</span></code>\n          or <code class=\"computeroutput\"><span class=\"number\">1000000000000000</span></code> :\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_digits10</span><span class=\"special\">);</span>\n<span class=\"keyword\">double</span> <span class=\"identifier\">d</span> <span class=\"special\">=</span>  <span class=\"number\">1e15</span><span class=\"special\">;</span>\n<span class=\"keyword\">double</span> <span class=\"identifier\">dp1</span> <span class=\"special\">=</span> <span class=\"identifier\">d</span><span class=\"special\">+</span><span class=\"number\">1</span><span class=\"special\">;</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">d</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"\\n\"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">dp1</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"comment\">// 1000000000000000</span>\n<span class=\"comment\">// 1000000000000001</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span>  <span class=\"identifier\">dp1</span> <span class=\"special\">-</span> <span class=\"identifier\">d</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// 1</span>\n</pre>\n<p>\n          and we can increment this value to <code class=\"computeroutput\"><span class=\"number\">1000000000000001</span></code>\n          as expected and show the difference too.\n        </p>\n<p>\n          But if we try to repeat this with more than <code class=\"computeroutput\"><span class=\"identifier\">digits10</span></code>\n          digits,\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_digits10</span><span class=\"special\">);</span>\n<span class=\"keyword\">double</span> <span class=\"identifier\">d</span> <span class=\"special\">=</span>  <span class=\"number\">1e16</span><span class=\"special\">;</span>\n<span class=\"keyword\">double</span> <span class=\"identifier\">dp1</span> <span class=\"special\">=</span> <span class=\"identifier\">d</span><span class=\"special\">+</span><span class=\"number\">1</span><span class=\"special\">;</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">d</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"\\n\"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">dp1</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"comment\">// 10000000000000000</span>\n<span class=\"comment\">// 10000000000000000</span>\n  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">dp1</span> <span class=\"special\">-</span> <span class=\"identifier\">d</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// 0 !!!</span>\n</pre>\n<p>\n          then we find that when we add one it has no effect, and display show that\n          there is loss of precision. See <a href=\"http://en.wikipedia.org/wiki/Loss_of_significance\" target=\"_top\">Loss\n          of significance or cancellation error</a>.\n        </p>\n<p>\n          So <code class=\"computeroutput\"><span class=\"identifier\">digits10</span></code> is the number\n          of decimal digits <span class=\"bold\"><strong>guaranteed</strong></span> to be correct.\n        </p>\n<p>\n          For example, 'round-tripping' for <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              If a decimal string with at most <code class=\"computeroutput\"><span class=\"identifier\">digits10</span></code>(\n              == 15) significant decimal digits is converted to <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>\n              and then converted back to the same number of significant decimal digits,\n              then the final string will match the original 15 decimal digit string.\n            </li>\n<li class=\"listitem\">\n              If a <code class=\"computeroutput\"><span class=\"keyword\">double</span></code> floating-point\n              number is converted to a decimal string with at least 17 decimal digits\n              and then converted back to <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>,\n              then the result will be binary identical to the original <code class=\"computeroutput\"><span class=\"keyword\">double</span></code> value.\n            </li>\n</ul></div>\n<p>\n          For most purposes, you will much more likely want <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;&gt;::</span><span class=\"identifier\">max_digits10</span></code>,\n          the number of decimal digits that ensure that a change of one least significant\n          bit (<a href=\"http://en.wikipedia.org/wiki/Unit_in_the_last_place\" target=\"_top\">Unit\n          in the last place (ULP)</a>) produces a different decimal digits string.\n        </p>\n<p>\n          For the most common <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>\n          floating-point type,<code class=\"computeroutput\"><span class=\"identifier\">max_digits10</span></code>\n          is <code class=\"computeroutput\"><span class=\"identifier\">digits10</span><span class=\"special\">+</span><span class=\"number\">2</span></code>, but you should use C++11 <code class=\"computeroutput\"><span class=\"identifier\">max_digits10</span></code> where possible (see <a class=\"link\" href=\"constants.html#boost_multiprecision.tut.limits.constants.max_digits10\">below</a>).\n        </p>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.constants.h9\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.constants.max_digits10\"></a></span><a class=\"link\" href=\"constants.html#boost_multiprecision.tut.limits.constants.max_digits10\">max_digits10</a>\n        </h5>\n<p>\n          <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_digits10</span></code> was added for floating-point\n          because <code class=\"computeroutput\"><span class=\"identifier\">digits10</span></code> decimal\n          digits are insufficient to show a least significant bit (ULP) change giving\n          puzzling displays like\n        </p>\n<pre class=\"programlisting\"><span class=\"number\">0.666666666666667</span> <span class=\"special\">!=</span> <span class=\"number\">0.666666666666667</span>\n</pre>\n<p>\n          from failure to 'round-trip', for example:\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">double</span> <span class=\"identifier\">write</span> <span class=\"special\">=</span> <span class=\"number\">2.</span><span class=\"special\">/</span><span class=\"number\">3</span><span class=\"special\">;</span> <span class=\"comment\">// Any arbitrary value that cannot be represented exactly.</span>\n<span class=\"keyword\">double</span> <span class=\"identifier\">read</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">stringstream</span> <span class=\"identifier\">s</span><span class=\"special\">;</span>\n<span class=\"identifier\">s</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">);</span> <span class=\"comment\">// or `float64_t` for 64-bit IEE754 double.</span>\n<span class=\"identifier\">s</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">write</span><span class=\"special\">;</span>\n<span class=\"identifier\">s</span> <span class=\"special\">&gt;&gt;</span> <span class=\"identifier\">read</span><span class=\"special\">;</span>\n<span class=\"keyword\">if</span><span class=\"special\">(</span><span class=\"identifier\">read</span> <span class=\"special\">!=</span> <span class=\"identifier\">write</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span>  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits10</span><span class=\"special\">)</span>\n    <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">read</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\" != \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">write</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n          If you wish to ensure that a change of one least significant bit (ULP)\n          produces a different decimal digits string, then <code class=\"computeroutput\"><span class=\"identifier\">max_digits10</span></code>\n          is the precision to use.\n        </p>\n<p>\n          For example:\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">double</span> <span class=\"identifier\">pi</span> <span class=\"special\">=</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">double_constants</span><span class=\"special\">::</span><span class=\"identifier\">pi</span><span class=\"special\">;</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_digits10</span><span class=\"special\">);</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">pi</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// 3.1415926535897931</span>\n</pre>\n<p>\n          will display π to the maximum possible precision using a <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>.\n        </p>\n<p>\n          and similarly for a much higher precision type:\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">;</span> <span class=\"comment\">// 50 decimal digits.</span>\n\n<span class=\"comment\">// or using boost::multiprecision::cpp_dec_float_50;</span>\n\n<span class=\"identifier\">cpp_dec_float_50</span> <span class=\"identifier\">pi</span> <span class=\"special\">=</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">constants</span><span class=\"special\">::</span><span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">&gt;();</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_digits10</span><span class=\"special\">);</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">pi</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"comment\">// 3.141592653589793238462643383279502884197169399375105820974944592307816406</span>\n</pre>\n<p>\n          For integer types, <code class=\"computeroutput\"><span class=\"identifier\">max_digits10</span></code>\n          is implementation-dependent, but is usually <code class=\"computeroutput\"><span class=\"identifier\">digits10</span>\n          <span class=\"special\">+</span> <span class=\"number\">2</span></code>.\n          This is the output field-width required for the maximum value of the type\n          T <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max</span><span class=\"special\">()</span></code>\n          <span class=\"emphasis\"><em>including a sign and a space</em></span>.\n        </p>\n<p>\n          So this will produce neat columns.\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setw</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">int</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_digits10</span><span class=\"special\">)</span> <span class=\"special\">...</span>\n</pre>\n<p>\n          The extra two or three least-significant digits are 'noisy' and may be\n          junk, but if you want to 'round-trip' - printing a value out as a decimal\n          digit string and reading it back in - (most commonly during serialization\n          and de-serialization) you must use <code class=\"computeroutput\"><span class=\"identifier\">os</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_digits10</span><span class=\"special\">)</span></code>.\n        </p>\n<div class=\"note\"><table border=\"0\" summary=\"Note\">\n<tr>\n<td rowspan=\"2\" align=\"center\" valign=\"top\" width=\"25\"><img alt=\"[Note]\" src=\"../../../../../../../doc/src/images/note.png\"></td>\n<th align=\"left\">Note</th>\n</tr>\n<tr><td align=\"left\" valign=\"top\"><p>\n            For Microsoft Visual Studio 2010, <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">float</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_digits10</span></code>\n            is wrongly defined as 8. It should be 9.\n          </p></td></tr>\n</table></div>\n<div class=\"note\"><table border=\"0\" summary=\"Note\">\n<tr>\n<td rowspan=\"2\" align=\"center\" valign=\"top\" width=\"25\"><img alt=\"[Note]\" src=\"../../../../../../../doc/src/images/note.png\"></td>\n<th align=\"left\">Note</th>\n</tr>\n<tr><td align=\"left\" valign=\"top\">\n<p>\n            For Microsoft Visual Studio before 2013 and the default floating-point\n            format, a small range of double-precision floating-point values with\n            a significand of approximately 0.0001 to 0.004 and exponent values of\n            1010 to 1014 do not round-trip exactly being off by one least significant\n            bit, for probably every third value of the significand.\n          </p>\n<p>\n            A workaround is using the scientific or exponential format <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">scientific</span></code>.\n          </p>\n<p>\n            Other older compilers also fail to implement round-tripping entirely\n            fault-free, for example, see <a href=\"https://www.exploringbinary.com/incorrectly-rounded-conversions-in-gcc-and-glibc/\" target=\"_top\">Incorrectly\n            Rounded Conversions in GCC and GLIBC</a>.\n          </p>\n<p>\n            For more details see <a href=\"https://www.exploringbinary.com/incorrect-round-trip-conversions-in-visual-c-plus-plus/\" target=\"_top\">Incorrect\n            Round-Trip Conversions in Visual C++</a>, and references therein\n            and <a href=\"https://arxiv.org/pdf/1310.8121.pdf\" target=\"_top\">Easy Accurate Reading\n            and Writing of Floating-Point Numbers, Aubrey Jaffer (August 2018)</a>.\n          </p>\n<p>\n            Microsoft VS2017 and other recent compilers, now use the <a href=\"https://doi.org/10.1145/3192366.3192369\" target=\"_top\">Ryu\n            fast float-to-string conversion by Ulf Adams</a> algorithm, claimed\n            to be both exact and fast for 32 and 64-bit floating-point numbers.\n          </p>\n</td></tr>\n</table></div>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.constants.h10\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.constants.round_style\"></a></span><a class=\"link\" href=\"constants.html#boost_multiprecision.tut.limits.constants.round_style\">round_style</a>\n        </h5>\n<p>\n          The rounding style determines how the result of floating-point operations\n          is treated when the result cannot be <span class=\"bold\"><strong>exactly represented</strong></span>\n          in the significand. Various rounding modes may be provided:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              round to nearest up or down (default for floating-point types).\n            </li>\n<li class=\"listitem\">\n              round up (toward positive infinity).\n            </li>\n<li class=\"listitem\">\n              round down (toward negative infinity).\n            </li>\n<li class=\"listitem\">\n              round toward zero (integer types).\n            </li>\n<li class=\"listitem\">\n              no rounding (if decimal radix).\n            </li>\n<li class=\"listitem\">\n              rounding mode is not determinable.\n            </li>\n</ul></div>\n<p>\n          For integer types, <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">round_style</span></code>\n          is always towards zero, so\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">round_style</span> <span class=\"special\">==</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">round_to_zero</span><span class=\"special\">;</span>\n</pre>\n<p>\n          A decimal type, <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float</span></code>\n          rounds in no particular direction, which is to say it doesn't round at\n          all. And since there are several guard digits, it's not really the same\n          as truncation (round toward zero) either.\n        </p>\n<p>\n          For floating-point types, it is normal to round to nearest.\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">round_style</span> <span class=\"special\">==</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">round_to_nearest</span><span class=\"special\">;</span>\n</pre>\n<p>\n          See function <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">round_error</span></code> for the maximum error (in\n          ULP) that rounding can cause.\n        </p>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.constants.h11\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.constants.has_denorm_loss\"></a></span><a class=\"link\" href=\"constants.html#boost_multiprecision.tut.limits.constants.has_denorm_loss\">has_denorm_loss</a>\n        </h5>\n<p>\n          <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> if a loss of precision\n          is detected as a <a href=\"http://en.wikipedia.org/wiki/Denormalization\" target=\"_top\">denormalization</a>\n          loss, rather than an inexact result.\n        </p>\n<p>\n          Always <code class=\"computeroutput\"><span class=\"keyword\">false</span></code> for integer types.\n        </p>\n<p>\n          <code class=\"computeroutput\"><span class=\"keyword\">false</span></code> for all types which\n          do not have <code class=\"computeroutput\"><span class=\"identifier\">has_denorm</span></code>\n          == <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">denorm_present</span></code>.\n        </p>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.constants.h12\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.constants.denorm_style\"></a></span><a class=\"link\" href=\"constants.html#boost_multiprecision.tut.limits.constants.denorm_style\">denorm_style</a>\n        </h5>\n<p>\n          <a href=\"http://en.wikipedia.org/wiki/Denormal_number\" target=\"_top\">Denormalized\n          values</a> are representations with a variable number of exponent bits\n          that can permit gradual underflow, so that, if type T is <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>.\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">denorm_min</span><span class=\"special\">()</span> <span class=\"special\">&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">min</span><span class=\"special\">()</span>\n</pre>\n<p>\n          A type may have any of the following <code class=\"computeroutput\"><span class=\"keyword\">enum</span>\n          <span class=\"identifier\">float_denorm_style</span></code> values:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">denorm_absent</span></code>, if it does not allow\n              denormalized values. (Always used for all integer and exact types).\n            </li>\n<li class=\"listitem\">\n              <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">denorm_present</span></code>, if the floating-point\n              type allows denormalized values.\n            </li>\n<li class=\"listitem\">\n              <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">denorm_indeterminate</span></code>, if indeterminate\n              at compile time.\n            </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.constants.h13\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.constants.tinyness_before_rounding\"></a></span><a class=\"link\" href=\"constants.html#boost_multiprecision.tut.limits.constants.tinyness_before_rounding\">Tinyness\n          before rounding</a>\n        </h5>\n<p>\n          <code class=\"computeroutput\"><span class=\"keyword\">bool</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">tinyness_before</span></code>\n        </p>\n<p>\n          <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> if a type can determine\n          that a value is too small to be represent as a normalized value before\n          rounding it.\n        </p>\n<p>\n          Generally true for <code class=\"computeroutput\"><span class=\"identifier\">is_iec559</span></code>\n          floating-point __fundamantal types, but false for integer types.\n        </p>\n<p>\n          Standard-compliant IEEE 754 floating-point implementations may detect the\n          floating-point underflow at three predefined moments:\n        </p>\n<div class=\"orderedlist\"><ol class=\"orderedlist\" type=\"1\">\n<li class=\"listitem\">\n              After computation of a result with absolute value smaller than <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">min</span><span class=\"special\">()</span></code>,\n              such implementation detects <span class=\"emphasis\"><em>tinyness before rounding</em></span>\n              (e.g. UltraSparc).\n            </li>\n<li class=\"listitem\">\n              After rounding of the result to <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits</span></code>\n              bits, if the result is tiny, such implementation detects <span class=\"emphasis\"><em>tinyness\n              after rounding</em></span> (e.g. SuperSparc).\n            </li>\n<li class=\"listitem\">\n              If the conversion of the rounded tiny result to subnormal form resulted\n              in the loss of precision, such implementation detects <span class=\"emphasis\"><em>denorm\n              loss</em></span>.\n            </li>\n</ol></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../limits.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../limits.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"functions.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/limits/functions.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>std::numeric_limits&lt;&gt; functions</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../limits.html\" title=\"Numeric Limits\">\n<link rel=\"prev\" href=\"constants.html\" title=\"std::numeric_limits&lt;&gt; constants\">\n<link rel=\"next\" href=\"limits32.html\" title=\"Numeric limits for 32-bit platform\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"constants.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../limits.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"limits32.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.limits.functions\"></a><a class=\"link\" href=\"functions.html\" title=\"std::numeric_limits&lt;&gt; functions\"><code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;&gt;</span></code> functions</a>\n</h4></div></div></div>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.functions.h0\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.functions.max_function\"></a></span><a class=\"link\" href=\"functions.html#boost_multiprecision.tut.limits.functions.max_function\"><code class=\"computeroutput\"><span class=\"identifier\">max</span></code> function</a>\n        </h5>\n<p>\n          Function <code class=\"computeroutput\"><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max</span><span class=\"special\">)()</span></code> returns the largest finite value that\n          can be represented by the type T. If there is no such value (and <code class=\"computeroutput\"><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">bounded</span></code> is <code class=\"computeroutput\"><span class=\"keyword\">false</span></code>)\n          then returns <code class=\"computeroutput\"><span class=\"identifier\">T</span><span class=\"special\">()</span></code>.\n        </p>\n<p>\n          For <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n          (built-in)</a> types there is usually a corresponding MACRO value TYPE_MAX,\n          where TYPE is CHAR, INT, FLOAT etc.\n        </p>\n<p>\n          Other types, including those provided by a typedef, for example <code class=\"computeroutput\"><span class=\"identifier\">INT64_T_MAX</span></code> for <code class=\"computeroutput\"><span class=\"identifier\">int64_t</span></code>,\n          may provide a macro definition.\n        </p>\n<p>\n          To cater for situations where no <code class=\"computeroutput\"><span class=\"identifier\">numeric_limits</span></code>\n          specialization is available (for example because the precision of the type\n          varies at runtime), packaged versions of this (and other functions) are\n          provided using\n        </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">math</span><span class=\"special\">/</span><span class=\"identifier\">tools</span><span class=\"special\">/</span><span class=\"identifier\">precision</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n\n<span class=\"identifier\">T</span> <span class=\"special\">=</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tools</span><span class=\"special\">::</span><span class=\"identifier\">max_value</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;();</span>\n</pre>\n<p>\n          Of course, these simply use <code class=\"computeroutput\"><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max</span><span class=\"special\">)()</span></code>\n          if available, but otherwise 'do something sensible'.\n        </p>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.functions.h1\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.functions.lowest_function\"></a></span><a class=\"link\" href=\"functions.html#boost_multiprecision.tut.limits.functions.lowest_function\">lowest\n          function</a>\n        </h5>\n<p>\n          Since C++11: <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">lowest</span><span class=\"special\">()</span></code>\n          is\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              For integral types, the same as function <code class=\"computeroutput\"><span class=\"identifier\">min</span><span class=\"special\">()</span></code>.\n            </li>\n<li class=\"listitem\">\n              For floating-point types, generally the negative of <code class=\"computeroutput\"><span class=\"identifier\">max</span><span class=\"special\">()</span></code> (but implementation-dependent).\n            </li>\n</ul></div>\n<pre class=\"programlisting\"><span class=\"special\">-(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max</span><span class=\"special\">)()</span> <span class=\"special\">==</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">lowest</span><span class=\"special\">();</span>\n</pre>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.functions.h2\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.functions.min_function\"></a></span><a class=\"link\" href=\"functions.html#boost_multiprecision.tut.limits.functions.min_function\"><code class=\"computeroutput\"><span class=\"identifier\">min</span></code> function</a>\n        </h5>\n<p>\n          Function <code class=\"computeroutput\"><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">min</span><span class=\"special\">)()</span></code> returns the minimum finite value that\n          can be represented by the type T.\n        </p>\n<p>\n          For <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n          (built-in)</a> types, there is usually a corresponding MACRO value\n          TYPE_MIN, where TYPE is CHAR, INT, FLOAT etc.\n        </p>\n<p>\n          Other types, including those provided by a <code class=\"computeroutput\"><span class=\"keyword\">typedef</span></code>,\n          for example, <code class=\"computeroutput\"><span class=\"identifier\">INT64_T_MIN</span></code>\n          for <code class=\"computeroutput\"><span class=\"identifier\">int64_t</span></code>, may provide\n          a macro definition.\n        </p>\n<p>\n          For floating-point types, it is more fully defined as the <span class=\"emphasis\"><em>minimum\n          positive normalized value</em></span>.\n        </p>\n<p>\n          See <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">denorm_min</span><span class=\"special\">()</span></code>\n          for the smallest denormalized value, provided\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">has_denorm</span> <span class=\"special\">==</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">denorm_present</span>\n</pre>\n<p>\n          To cater for situations where no <code class=\"computeroutput\"><span class=\"identifier\">numeric_limits</span></code>\n          specialization is available (for example because the precision of the type\n          varies at runtime), packaged versions of this (and other functions) are\n          provided using\n        </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">math</span><span class=\"special\">/</span><span class=\"identifier\">tools</span><span class=\"special\">/</span><span class=\"identifier\">precision</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n\n<span class=\"identifier\">T</span> <span class=\"special\">=</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tools</span><span class=\"special\">::</span><span class=\"identifier\">min_value</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;();</span>\n</pre>\n<p>\n          Of course, these simply use <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">min</span><span class=\"special\">()</span></code> if available.\n        </p>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.functions.h3\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.functions.denorm_min_function\"></a></span><a class=\"link\" href=\"functions.html#boost_multiprecision.tut.limits.functions.denorm_min_function\">denorm_min\n          function</a>\n        </h5>\n<p>\n          Function <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">denorm_min</span><span class=\"special\">()</span></code>\n          returns the smallest <a href=\"http://en.wikipedia.org/wiki/Denormal_number\" target=\"_top\">denormalized\n          value</a>, provided\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">has_denorm</span> <span class=\"special\">==</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">denorm_present</span>\n</pre>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_digits10</span><span class=\"special\">);</span>\n<span class=\"keyword\">if</span> <span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">has_denorm</span> <span class=\"special\">==</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">denorm_present</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n  <span class=\"keyword\">double</span> <span class=\"identifier\">d</span> <span class=\"special\">=</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">denorm_min</span><span class=\"special\">();</span>\n\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">d</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">//  4.9406564584124654e-324</span>\n\n    <span class=\"keyword\">int</span> <span class=\"identifier\">exponent</span><span class=\"special\">;</span>\n\n    <span class=\"keyword\">double</span> <span class=\"identifier\">significand</span> <span class=\"special\">=</span> <span class=\"identifier\">frexp</span><span class=\"special\">(</span><span class=\"identifier\">d</span><span class=\"special\">,</span> <span class=\"special\">&amp;</span><span class=\"identifier\">exponent</span><span class=\"special\">);</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"exponent = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">hex</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">exponent</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">//  fffffbcf</span>\n    <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"significand = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">hex</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">significand</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// 0.50000000000000000</span>\n<span class=\"special\">}</span>\n<span class=\"keyword\">else</span>\n<span class=\"special\">{</span>\n  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"No denormalization. \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n          The exponent is effectively reduced from -308 to -324 (though it remains\n          encoded as zero and leading zeros appear in the significand, thereby losing\n          precision until the significand reaches zero).\n        </p>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.functions.h4\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.functions.round_error\"></a></span><a class=\"link\" href=\"functions.html#boost_multiprecision.tut.limits.functions.round_error\">round_error</a>\n        </h5>\n<p>\n          Function <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">round_error</span><span class=\"special\">()</span></code>\n          returns the maximum error (in units of <a href=\"http://en.wikipedia.org/wiki/Unit_in_the_last_place\" target=\"_top\">Unit\n          in the last place (ULP)</a>) that can be caused by any basic arithmetic\n          operation.\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">round_style</span> <span class=\"special\">==</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">round_indeterminate</span><span class=\"special\">;</span>\n</pre>\n<p>\n          The rounding style is indeterminable at compile time.\n        </p>\n<p>\n          For floating-point types, when rounding is to nearest, only half a bit\n          is lost by rounding, and <code class=\"computeroutput\"><span class=\"identifier\">round_error</span>\n          <span class=\"special\">==</span> <span class=\"number\">0.5</span></code>.\n          In contrast when rounding is towards zero, or plus/minus infinity, we can\n          loose up to one bit from rounding, and <code class=\"computeroutput\"><span class=\"identifier\">round_error</span>\n          <span class=\"special\">==</span> <span class=\"number\">1</span></code>.\n        </p>\n<p>\n          For integer types, rounding always to zero, so at worst almost one bit\n          can be rounded, so <code class=\"computeroutput\"><span class=\"identifier\">round_error</span>\n          <span class=\"special\">==</span> <span class=\"number\">1</span></code>.\n        </p>\n<p>\n          <code class=\"computeroutput\"><span class=\"identifier\">round_error</span><span class=\"special\">()</span></code>\n          can be used with <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">epsilon</span><span class=\"special\">()</span></code>\n          to estimate the maximum potential error caused by rounding. For typical\n          floating-point types, <code class=\"computeroutput\"><span class=\"identifier\">round_error</span><span class=\"special\">()</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">/</span><span class=\"number\">2</span></code>, so half\n          epsilon is the maximum potential error.\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">double</span> <span class=\"identifier\">round_err</span> <span class=\"special\">=</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">epsilon</span><span class=\"special\">()</span> <span class=\"comment\">// 2.2204460492503131e-016</span>\n                 <span class=\"special\">*</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">round_error</span><span class=\"special\">();</span> <span class=\"comment\">// 1/2</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">round_err</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// 1.1102230246251565e-016</span>\n</pre>\n<p>\n          There are, of course, many occasions when much bigger loss of precision\n          occurs, for example, caused by <a href=\"http://en.wikipedia.org/wiki/Loss_of_significance\" target=\"_top\">Loss\n          of significance or cancellation error</a> or very many iterations.\n        </p>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.functions.h5\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.functions.epsilon\"></a></span><a class=\"link\" href=\"functions.html#boost_multiprecision.tut.limits.functions.epsilon\">epsilon</a>\n        </h5>\n<p>\n          Function <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">epsilon</span><span class=\"special\">()</span></code>\n          is meaningful only for non-integral types.\n        </p>\n<p>\n          It returns the difference between <code class=\"computeroutput\"><span class=\"number\">1.0</span></code>\n          and the next value representable by the floating-point type T. So it is\n          a one least-significant-bit change in this floating-point value.\n        </p>\n<p>\n          For <code class=\"computeroutput\"><span class=\"keyword\">double</span></code> (<code class=\"computeroutput\"><span class=\"identifier\">float_64t</span></code>) it is <code class=\"computeroutput\"><span class=\"number\">2.2204460492503131e-016</span></code>\n          showing all possibly significant 17 decimal digits.\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_digits10</span><span class=\"special\">);</span>\n<span class=\"keyword\">double</span> <span class=\"identifier\">d</span> <span class=\"special\">=</span> <span class=\"number\">1.</span><span class=\"special\">;</span>\n<span class=\"keyword\">double</span> <span class=\"identifier\">eps</span> <span class=\"special\">=</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">epsilon</span><span class=\"special\">();</span>\n<span class=\"keyword\">double</span> <span class=\"identifier\">dpeps</span> <span class=\"special\">=</span> <span class=\"identifier\">d</span><span class=\"special\">+</span><span class=\"identifier\">eps</span><span class=\"special\">;</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">showpoint</span> <span class=\"comment\">// Ensure all trailing zeros are shown.</span>\n  <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">d</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"\\n\"</span>           <span class=\"comment\">// 1.0000000000000000</span>\n  <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">dpeps</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// 2.2204460492503131e-016</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">dpeps</span> <span class=\"special\">-</span> <span class=\"identifier\">d</span>   <span class=\"comment\">// 1.0000000000000002</span>\n  <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n</pre>\n<p>\n          We can explicitly increment by one bit using the function <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">float_next</span><span class=\"special\">()</span></code>\n          and the result is the same as adding <code class=\"computeroutput\"><span class=\"identifier\">epsilon</span></code>.\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">double</span> <span class=\"identifier\">one</span> <span class=\"special\">=</span> <span class=\"number\">1.</span><span class=\"special\">;</span>\n<span class=\"keyword\">double</span> <span class=\"identifier\">nad</span> <span class=\"special\">=</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">float_next</span><span class=\"special\">(</span><span class=\"identifier\">one</span><span class=\"special\">);</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">nad</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"\\n\"</span>  <span class=\"comment\">//  1.0000000000000002</span>\n  <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">nad</span> <span class=\"special\">-</span> <span class=\"identifier\">one</span> <span class=\"comment\">// 2.2204460492503131e-016</span>\n  <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n</pre>\n<p>\n          Adding any smaller value, like half <code class=\"computeroutput\"><span class=\"identifier\">epsilon</span></code>,\n          will have no effect on this value.\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_digits10</span><span class=\"special\">);</span>\n<span class=\"keyword\">double</span> <span class=\"identifier\">d</span> <span class=\"special\">=</span> <span class=\"number\">1.</span><span class=\"special\">;</span>\n<span class=\"keyword\">double</span> <span class=\"identifier\">eps</span> <span class=\"special\">=</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">double</span><span class=\"special\">&gt;::</span><span class=\"identifier\">epsilon</span><span class=\"special\">();</span>\n<span class=\"keyword\">double</span> <span class=\"identifier\">dpeps</span> <span class=\"special\">=</span> <span class=\"identifier\">d</span> <span class=\"special\">+</span> <span class=\"identifier\">eps</span><span class=\"special\">/</span><span class=\"number\">2</span><span class=\"special\">;</span>\n\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">showpoint</span> <span class=\"comment\">// Ensure all trailing zeros are shown.</span>\n  <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">dpeps</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"\\n\"</span>       <span class=\"comment\">// 1.0000000000000000</span>\n  <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">eps</span><span class=\"special\">/</span><span class=\"number\">2</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// 1.1102230246251565e-016</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">dpeps</span> <span class=\"special\">-</span> <span class=\"identifier\">d</span>   <span class=\"comment\">// 0.00000000000000000</span>\n  <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n</pre>\n<p>\n          So this cancellation error leaves the values equal, despite adding half\n          <code class=\"computeroutput\"><span class=\"identifier\">epsilon</span></code>.\n        </p>\n<p>\n          To achieve greater portability over platform and floating-point type, Boost.Math\n          and Boost.Multiprecision provide a package of functions that 'do something\n          sensible' if the standard <code class=\"computeroutput\"><span class=\"identifier\">numeric_limits</span></code>\n          is not available. To use these <code class=\"computeroutput\"><span class=\"preprocessor\">#include</span>\n          <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">math</span><span class=\"special\">/</span><span class=\"identifier\">tools</span><span class=\"special\">/</span><span class=\"identifier\">precision</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>.\n        </p>\n<p>\n          A tolerance might be defined using this version of epsilon thus:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">RealType</span> <span class=\"identifier\">tolerance</span> <span class=\"special\">=</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">tools</span><span class=\"special\">::</span><span class=\"identifier\">epsilon</span><span class=\"special\">&lt;</span><span class=\"identifier\">RealType</span><span class=\"special\">&gt;()</span> <span class=\"special\">*</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n</pre>\n<h6>\n<a name=\"boost_multiprecision.tut.limits.functions.h6\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.functions.FP_tolerance\"></a></span><a class=\"link\" href=\"functions.html#boost_multiprecision.tut.limits.functions.FP_tolerance\">Tolerance\n          for Floating-point Comparisons</a>\n        </h6>\n<p>\n          <a href=\"https://en.wikipedia.org/wiki/Machine_epsilon\" target=\"_top\">Machine epsilon\n          ε</a> is very useful to compute a tolerance when comparing floating-point\n          values, a much more difficult task than is commonly imagined.\n        </p>\n<p>\n          The C++ standard specifies <a href=\"https://en.cppreference.com/w/cpp/types/numeric_limits/epsilon\" target=\"_top\"><code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;&gt;::</span><span class=\"identifier\">epsilon</span><span class=\"special\">()</span></code></a>\n          and Boost.Multiprecision implements this (where possible) for its program-defined\n          types analogous to the <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n          (built-in)</a> floating-point types like <code class=\"computeroutput\"><span class=\"keyword\">double</span></code>\n          <code class=\"computeroutput\"><span class=\"keyword\">float</span></code>.\n        </p>\n<p>\n          For more information than you probably want (but still need) see <a href=\"http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html\" target=\"_top\">What\n          Every Computer Scientist Should Know About Floating-Point Arithmetic</a>\n        </p>\n<p>\n          The naive test comparing the absolute difference between two values and\n          a tolerance does not give useful results if the values are too large or\n          too small.\n        </p>\n<p>\n          So Boost.Test uses an algorithm first devised by Knuth for reliably checking\n          if floating-point values are close enough.\n        </p>\n<p>\n          See Donald. E. Knuth. The art of computer programming (vol II). Copyright\n          1998 Addison-Wesley Longman, Inc., 0-201-89684-2. Addison-Wesley Professional;\n          3rd edition. (The relevant equations are in paragraph 4.2.2, Eq. 36 and\n          37.)\n        </p>\n<p>\n          See <a href=\"https://www.boost.org/doc/libs/release/libs/test/doc/html/boost_test/testing_tools/extended_comparison/floating_point/floating_points_comparison_theory.html\" target=\"_top\">Boost.Math\n          floating_point comparison</a> for more details.\n        </p>\n<p>\n          See also:\n        </p>\n<p>\n          <a href=\"http://adtmag.com/articles/2000/03/15/comparing-floats-how-to-determine-if-floating-quantities-are-close-enough-once-a-tolerance-has-been.aspx\" target=\"_top\">Alberto\n          Squassia, Comparing floats</a>\n        </p>\n<p>\n          <a href=\"http://adtmag.com/articles/2000/03/16/comparing-floats-how-to-determine-if-floating-quantities-are-close-enough-once-a-tolerance-has-been.aspx\" target=\"_top\">Alberto\n          Squassia, Comparing floats code</a>\n        </p>\n<p>\n          <a href=\"https://www.boost.org/doc/libs/release/libs/test/doc/html/boost_test/testing_tools/extended_comparison/floating_point.html\" target=\"_top\">Boost.Test\n          Floating-Point_Comparison</a>\n        </p>\n<p>\n          For example, if we want a tolerance that might suit about 9 arithmetical\n          operations, say sqrt(9) = 3, we could define:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">T</span> <span class=\"identifier\">tolerance</span> <span class=\"special\">=</span>  <span class=\"number\">3</span> <span class=\"special\">*</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">epsilon</span><span class=\"special\">();</span>\n</pre>\n<p>\n          This is very widely used in Boost.Math testing with Boost.Test's macro\n          <code class=\"computeroutput\"><span class=\"identifier\">BOOST_CHECK_CLOSE_FRACTION</span></code>\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">T</span> <span class=\"identifier\">expected</span> <span class=\"special\">=</span> <span class=\"number\">1.0</span><span class=\"special\">;</span>\n<span class=\"identifier\">T</span> <span class=\"identifier\">calculated</span> <span class=\"special\">=</span> <span class=\"number\">1.0</span> <span class=\"special\">+</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">epsilon</span><span class=\"special\">();</span>\n\n<span class=\"identifier\">BOOST_CHECK_CLOSE_FRACTION</span><span class=\"special\">(</span><span class=\"identifier\">expected</span><span class=\"special\">,</span> <span class=\"identifier\">calculated</span><span class=\"special\">,</span> <span class=\"identifier\">tolerance</span><span class=\"special\">);</span>\n</pre>\n<p>\n          used thus:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">cd</span> <span class=\"special\">./</span><span class=\"identifier\">test</span>\n<span class=\"identifier\">BOOST_CHECK_CLOSE_FRACTION</span><span class=\"special\">(</span><span class=\"identifier\">expected</span><span class=\"special\">,</span> <span class=\"identifier\">calculated</span><span class=\"special\">,</span> <span class=\"identifier\">tolerance</span><span class=\"special\">);</span>\n</pre>\n<p>\n          (There is also a version BOOST_CHECK_CLOSE using tolerance as a <span class=\"bold\"><strong>percentage</strong></span> rather than a fraction; usually the fraction\n          version is simpler to use).\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">using</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">number</span><span class=\"special\">;</span>\n<span class=\"keyword\">using</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_dec_float</span><span class=\"special\">;</span>\n<span class=\"keyword\">using</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">et_off</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">et_off</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">;</span> <span class=\"comment\">// 50 decimal digits.</span>\n</pre>\n<div class=\"note\"><table border=\"0\" summary=\"Note\">\n<tr>\n<td rowspan=\"2\" align=\"center\" valign=\"top\" width=\"25\"><img alt=\"[Note]\" src=\"../../../../../../../doc/src/images/note.png\"></td>\n<th align=\"left\">Note</th>\n</tr>\n<tr><td align=\"left\" valign=\"top\"><p>\n            that Boost.Test does not yet allow floating-point comparisons with expression\n            templates on, so the default expression template parameter has been replaced\n            by <code class=\"computeroutput\"><span class=\"identifier\">et_off</span></code>.\n          </p></td></tr>\n</table></div>\n<pre class=\"programlisting\"><span class=\"identifier\">cpp_dec_float_50</span> <span class=\"identifier\">tolerance</span> <span class=\"special\">=</span>  <span class=\"number\">3</span> <span class=\"special\">*</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">&gt;::</span><span class=\"identifier\">epsilon</span><span class=\"special\">();</span>\n<span class=\"identifier\">cpp_dec_float_50</span> <span class=\"identifier\">expected</span> <span class=\"special\">=</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">constants</span><span class=\"special\">::</span><span class=\"identifier\">two_pi</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">&gt;();</span>\n<span class=\"identifier\">cpp_dec_float_50</span> <span class=\"identifier\">calculated</span> <span class=\"special\">=</span> <span class=\"number\">2</span> <span class=\"special\">*</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">constants</span><span class=\"special\">::</span><span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float_50</span><span class=\"special\">&gt;();</span>\n\n<span class=\"identifier\">BOOST_CHECK_CLOSE_FRACTION</span><span class=\"special\">(</span><span class=\"identifier\">expected</span><span class=\"special\">,</span> <span class=\"identifier\">calculated</span><span class=\"special\">,</span> <span class=\"identifier\">tolerance</span><span class=\"special\">);</span>\n</pre>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.functions.h7\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.functions.infinity\"></a></span><a class=\"link\" href=\"functions.html#boost_multiprecision.tut.limits.functions.infinity\">Infinity -\n          positive and negative</a>\n        </h5>\n<p>\n          For floating-point types only, for which <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">has_infinity</span>\n          <span class=\"special\">==</span> <span class=\"keyword\">true</span></code>,\n          function <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">infinity</span><span class=\"special\">()</span></code>\n          provides an implementation-defined representation for ∞.\n        </p>\n<p>\n          The 'representation' is a particular bit pattern reserved for infinity.\n          For IEEE754 system (for which <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_iec559</span>\n          <span class=\"special\">==</span> <span class=\"keyword\">true</span></code>)\n          <a href=\"http://en.wikipedia.org/wiki/IEEE_754-1985#Positive_and_negative_infinity\" target=\"_top\">positive\n          and negative infinity</a> are assigned bit patterns for all defined\n          floating-point types.\n        </p>\n<p>\n          Confusingly, the string resulting from outputting this representation,\n          is also implementation-defined. And the string that can be input to generate\n          the representation is also implementation-defined.\n        </p>\n<p>\n          For example, the output is <code class=\"computeroutput\"><span class=\"number\">1.</span><span class=\"special\">#</span><span class=\"identifier\">INF</span></code>\n          on Microsoft systems, but <code class=\"computeroutput\"><span class=\"identifier\">inf</span></code>\n          on most *nix platforms.\n        </p>\n<p>\n          This implementation-defined-ness has hampered use of infinity (and NaNs)\n          but <a href=\"https://www.boost.org/doc/libs/release/libs/math/doc/index.html\" target=\"_top\">Boost.Math</a>\n          and <a href=\"https://www.boost.org/doc/libs/release/libs/multiprecision/doc/index.html\" target=\"_top\">Boost.Multiprecision</a>\n          work hard to provide a sensible representation for <span class=\"bold\"><strong>all</strong></span>\n          floating-point types, not just the <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n          (built-in) types</a>, which with the use of suitable facets to define\n          the input and output strings, makes it possible to use these useful features\n          portably and including <a href=\"https://www.boost.org/doc/libs/release/libs/serialization/doc/index.html\" target=\"_top\">Boost.Serialization</a>.\n        </p>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.functions.h8\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.functions.not_a_number_nan\"></a></span><a class=\"link\" href=\"functions.html#boost_multiprecision.tut.limits.functions.not_a_number_nan\">Not-A-Number\n          NaN</a>\n        </h5>\n<h6>\n<a name=\"boost_multiprecision.tut.limits.functions.h9\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.functions.quiet_nan\"></a></span><a class=\"link\" href=\"functions.html#boost_multiprecision.tut.limits.functions.quiet_nan\">Quiet_NaN</a>\n        </h6>\n<p>\n          For floating-point types only, for which <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">has_quiet_NaN</span>\n          <span class=\"special\">==</span> <span class=\"keyword\">true</span></code>,\n          function <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">quiet_NaN</span><span class=\"special\">()</span></code>\n          provides an implementation-defined representation for NaN.\n        </p>\n<p>\n          <a href=\"http://en.wikipedia.org/wiki/NaN\" target=\"_top\">NaNs</a> are values to\n          indicate that the result of an assignment or computation is meaningless.\n          A typical example is <code class=\"computeroutput\"><span class=\"number\">0</span><span class=\"special\">/</span><span class=\"number\">0</span></code> but there are many others.\n        </p>\n<p>\n          NaNs may also be used, to represent missing values: for example, these\n          could, by convention, be ignored in calculations of statistics like means.\n        </p>\n<p>\n          Many of the problems with a representation for <a href=\"http://en.wikipedia.org/wiki/NaN\" target=\"_top\">Not-A-Number</a>\n          has hampered portable use, similar to those with infinity.\n        </p>\n<p>\n          NaN can be used with binary multiprecision types like <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float_quad</span></code>:\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">using</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_bin_float_quad</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">if</span> <span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float_quad</span><span class=\"special\">&gt;::</span><span class=\"identifier\">has_quiet_NaN</span> <span class=\"special\">==</span> <span class=\"keyword\">true</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n  <span class=\"identifier\">cpp_bin_float_quad</span> <span class=\"identifier\">NaN</span> <span class=\"special\">=</span>  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float_quad</span><span class=\"special\">&gt;::</span><span class=\"identifier\">quiet_NaN</span><span class=\"special\">();</span>\n  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"cpp_bin_float_quad NaN is \"</span>  <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">NaN</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">//   cpp_bin_float_quad NaN is nan</span>\n\n  <span class=\"identifier\">cpp_bin_float_quad</span> <span class=\"identifier\">expected</span> <span class=\"special\">=</span> <span class=\"identifier\">NaN</span><span class=\"special\">;</span>\n  <span class=\"identifier\">cpp_bin_float_quad</span> <span class=\"identifier\">calculated</span> <span class=\"special\">=</span> <span class=\"number\">2</span> <span class=\"special\">*</span> <span class=\"identifier\">NaN</span><span class=\"special\">;</span>\n  <span class=\"comment\">// Comparisons of NaN's always fail:</span>\n  <span class=\"keyword\">bool</span> <span class=\"identifier\">b</span> <span class=\"special\">=</span> <span class=\"identifier\">expected</span> <span class=\"special\">==</span> <span class=\"identifier\">calculated</span><span class=\"special\">;</span>\n  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">b</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n  <span class=\"identifier\">BOOST_CHECK_NE</span><span class=\"special\">(</span><span class=\"identifier\">expected</span><span class=\"special\">,</span> <span class=\"identifier\">expected</span><span class=\"special\">);</span>\n  <span class=\"identifier\">BOOST_CHECK_NE</span><span class=\"special\">(</span><span class=\"identifier\">expected</span><span class=\"special\">,</span> <span class=\"identifier\">calculated</span><span class=\"special\">);</span>\n<span class=\"special\">}</span>\n<span class=\"keyword\">else</span>\n<span class=\"special\">{</span>\n  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Type \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"keyword\">typeid</span><span class=\"special\">(</span><span class=\"identifier\">cpp_bin_float_quad</span><span class=\"special\">).</span><span class=\"identifier\">name</span><span class=\"special\">()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\" does not have NaNs!\"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n          But using Boost.Math and suitable facets can permit portable use of both\n          NaNs and positive and negative infinity.\n        </p>\n<p>\n          See <a href=\"http://www.boost.org/doc/libs/release/libs/multiprecision/doc/html/../../../../libs/math/example/nonfinite_facet_sstream.cpp\" target=\"_top\">boost:/libs/math/example/nonfinite_facet_sstream.cpp</a>\n          and we also need\n        </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">math</span><span class=\"special\">/</span><span class=\"identifier\">special_functions</span><span class=\"special\">/</span><span class=\"identifier\">nonfinite_num_facets</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n</pre>\n<p>\n          Then we can equally well use a multiprecision type cpp_bin_float_quad:\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">using</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_bin_float_quad</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">cpp_bin_float_quad</span> <span class=\"identifier\">T</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">using</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">nonfinite_num_put</span><span class=\"special\">;</span>\n<span class=\"keyword\">using</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">nonfinite_num_get</span><span class=\"special\">;</span>\n<span class=\"special\">{</span>\n  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">locale</span> <span class=\"identifier\">old_locale</span><span class=\"special\">;</span>\n  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">locale</span> <span class=\"identifier\">tmp_locale</span><span class=\"special\">(</span><span class=\"identifier\">old_locale</span><span class=\"special\">,</span> <span class=\"keyword\">new</span> <span class=\"identifier\">nonfinite_num_put</span><span class=\"special\">&lt;</span><span class=\"keyword\">char</span><span class=\"special\">&gt;);</span>\n  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">locale</span> <span class=\"identifier\">new_locale</span><span class=\"special\">(</span><span class=\"identifier\">tmp_locale</span><span class=\"special\">,</span> <span class=\"keyword\">new</span> <span class=\"identifier\">nonfinite_num_get</span><span class=\"special\">&lt;</span><span class=\"keyword\">char</span><span class=\"special\">&gt;);</span>\n  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">stringstream</span> <span class=\"identifier\">ss</span><span class=\"special\">;</span>\n  <span class=\"identifier\">ss</span><span class=\"special\">.</span><span class=\"identifier\">imbue</span><span class=\"special\">(</span><span class=\"identifier\">new_locale</span><span class=\"special\">);</span>\n  <span class=\"identifier\">T</span> <span class=\"identifier\">inf</span> <span class=\"special\">=</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">infinity</span><span class=\"special\">();</span>\n  <span class=\"identifier\">ss</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">inf</span><span class=\"special\">;</span> <span class=\"comment\">// Write out.</span>\n <span class=\"identifier\">BOOST_MP_ASSERT</span><span class=\"special\">(</span><span class=\"identifier\">ss</span><span class=\"special\">.</span><span class=\"identifier\">str</span><span class=\"special\">()</span> <span class=\"special\">==</span> <span class=\"string\">\"inf\"</span><span class=\"special\">);</span>\n  <span class=\"identifier\">T</span> <span class=\"identifier\">r</span><span class=\"special\">;</span>\n  <span class=\"identifier\">ss</span> <span class=\"special\">&gt;&gt;</span> <span class=\"identifier\">r</span><span class=\"special\">;</span> <span class=\"comment\">// Read back in.</span>\n  <span class=\"identifier\">BOOST_MP_ASSERT</span><span class=\"special\">(</span><span class=\"identifier\">inf</span> <span class=\"special\">==</span> <span class=\"identifier\">r</span><span class=\"special\">);</span> <span class=\"comment\">// Confirms that the floating-point values really are identical.</span>\n  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"infinity output was \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">ss</span><span class=\"special\">.</span><span class=\"identifier\">str</span><span class=\"special\">()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"infinity input was \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">r</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<pre class=\"programlisting\"><span class=\"identifier\">infinity</span> <span class=\"identifier\">output</span> <span class=\"identifier\">was</span> <span class=\"identifier\">inf</span>\n<span class=\"identifier\">infinity</span> <span class=\"identifier\">input</span> <span class=\"identifier\">was</span> <span class=\"identifier\">inf</span>\n</pre>\n<p>\n          Similarly we can do the same with NaN (except that we cannot use <code class=\"computeroutput\"><span class=\"identifier\">assert</span></code> (because any comparisons with\n          NaN always return false).\n        </p>\n<pre class=\"programlisting\"><span class=\"special\">{</span>\n  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">locale</span> <span class=\"identifier\">old_locale</span><span class=\"special\">;</span>\n  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">locale</span> <span class=\"identifier\">tmp_locale</span><span class=\"special\">(</span><span class=\"identifier\">old_locale</span><span class=\"special\">,</span> <span class=\"keyword\">new</span> <span class=\"identifier\">nonfinite_num_put</span><span class=\"special\">&lt;</span><span class=\"keyword\">char</span><span class=\"special\">&gt;);</span>\n  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">locale</span> <span class=\"identifier\">new_locale</span><span class=\"special\">(</span><span class=\"identifier\">tmp_locale</span><span class=\"special\">,</span> <span class=\"keyword\">new</span> <span class=\"identifier\">nonfinite_num_get</span><span class=\"special\">&lt;</span><span class=\"keyword\">char</span><span class=\"special\">&gt;);</span>\n  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">stringstream</span> <span class=\"identifier\">ss</span><span class=\"special\">;</span>\n  <span class=\"identifier\">ss</span><span class=\"special\">.</span><span class=\"identifier\">imbue</span><span class=\"special\">(</span><span class=\"identifier\">new_locale</span><span class=\"special\">);</span>\n  <span class=\"identifier\">T</span> <span class=\"identifier\">n</span><span class=\"special\">;</span>\n  <span class=\"identifier\">T</span> <span class=\"identifier\">NaN</span> <span class=\"special\">=</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">quiet_NaN</span><span class=\"special\">();</span>\n  <span class=\"identifier\">ss</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">NaN</span><span class=\"special\">;</span> <span class=\"comment\">// Write out.</span>\n  <span class=\"identifier\">BOOST_MP_ASSERT</span><span class=\"special\">(</span><span class=\"identifier\">ss</span><span class=\"special\">.</span><span class=\"identifier\">str</span><span class=\"special\">()</span> <span class=\"special\">==</span> <span class=\"string\">\"nan\"</span><span class=\"special\">);</span>\n  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"NaN output was \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">ss</span><span class=\"special\">.</span><span class=\"identifier\">str</span><span class=\"special\">()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n  <span class=\"identifier\">ss</span> <span class=\"special\">&gt;&gt;</span> <span class=\"identifier\">n</span><span class=\"special\">;</span> <span class=\"comment\">// Read back in.</span>\n  <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"NaN input was \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">n</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<pre class=\"programlisting\"><span class=\"identifier\">NaN</span> <span class=\"identifier\">output</span> <span class=\"identifier\">was</span> <span class=\"identifier\">nan</span>\n<span class=\"identifier\">NaN</span> <span class=\"identifier\">input</span> <span class=\"identifier\">was</span> <span class=\"identifier\">nan</span>\n</pre>\n<h6>\n<a name=\"boost_multiprecision.tut.limits.functions.h10\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.functions.signaling_nan\"></a></span><a class=\"link\" href=\"functions.html#boost_multiprecision.tut.limits.functions.signaling_nan\">Signaling\n          NaN</a>\n        </h6>\n<p>\n          For floating-point types only, for which <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">has_signaling_NaN</span>\n          <span class=\"special\">==</span> <span class=\"keyword\">true</span></code>,\n          function <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">signaling_NaN</span><span class=\"special\">()</span></code>\n          provides an implementation-defined representation for NaN that causes a\n          hardware trap. It should be noted however, that at least one implementation\n          of this function causes a hardware trap to be triggered simply by calling\n          <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">signaling_NaN</span><span class=\"special\">()</span></code>,\n          and not only by using the value returned.\n        </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"constants.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../limits.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"limits32.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/limits/how_to_tell.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>How to Determine the Kind of a Number From std::numeric_limits</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../limits.html\" title=\"Numeric Limits\">\n<link rel=\"prev\" href=\"limits32.html\" title=\"Numeric limits for 32-bit platform\">\n<link rel=\"next\" href=\"../input_output.html\" title=\"Input Output\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"limits32.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../limits.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../input_output.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.limits.how_to_tell\"></a><a class=\"link\" href=\"how_to_tell.html\" title=\"How to Determine the Kind of a Number From std::numeric_limits\">How to\n        Determine the Kind of a Number From <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code></a>\n</h4></div></div></div>\n<p>\n          Based on the information above, one can see that different kinds of numbers\n          can be differentiated based on the information stored in <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code>. This is in addition to\n          the traits class <a class=\"link\" href=\"../../ref/number.html#boost_multiprecision.ref.number.traits_class_support\">number_category</a>\n          provided by this library.\n        </p>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.how_to_tell.h0\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.how_to_tell.integer_types\"></a></span><a class=\"link\" href=\"how_to_tell.html#boost_multiprecision.tut.limits.how_to_tell.integer_types\">Integer\n          Types</a>\n        </h5>\n<p>\n          For an integer type T, all of the following conditions hold:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_specialized</span> <span class=\"special\">==</span> <span class=\"keyword\">true</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_integer</span> <span class=\"special\">==</span> <span class=\"keyword\">true</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_exact</span> <span class=\"special\">==</span> <span class=\"keyword\">true</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">min_exponent</span> <span class=\"special\">==</span> <span class=\"number\">0</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_exponent</span> <span class=\"special\">==</span> <span class=\"number\">0</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">min_exponent10</span> <span class=\"special\">==</span> <span class=\"number\">0</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_exponent10</span> <span class=\"special\">==</span> <span class=\"number\">0</span>\n</pre>\n<p>\n          In addition the type is <span class=\"emphasis\"><em>signed</em></span> if:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_signed</span> <span class=\"special\">==</span> <span class=\"keyword\">true</span>\n</pre>\n<p>\n          If the type is arbitrary precision then:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_bounded</span> <span class=\"special\">==</span> <span class=\"keyword\">false</span>\n</pre>\n<p>\n          Otherwise the type is bounded, and returns a non zero value from:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max</span><span class=\"special\">()</span>\n</pre>\n<p>\n          and has:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_modulo</span> <span class=\"special\">==</span> <span class=\"keyword\">true</span>\n</pre>\n<p>\n          if the type implements modulo arithmetic on overflow.\n        </p>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.how_to_tell.h1\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.how_to_tell.rational_types\"></a></span><a class=\"link\" href=\"how_to_tell.html#boost_multiprecision.tut.limits.how_to_tell.rational_types\">Rational\n          Types</a>\n        </h5>\n<p>\n          Rational types are just like integers except that:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_integer</span> <span class=\"special\">==</span> <span class=\"keyword\">false</span>\n</pre>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.how_to_tell.h2\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.how_to_tell.fixed_precision_types\"></a></span><a class=\"link\" href=\"how_to_tell.html#boost_multiprecision.tut.limits.how_to_tell.fixed_precision_types\">Fixed\n          Precision Types</a>\n        </h5>\n<p>\n          There appears to be no way to tell these apart from rational types, unless\n          they set:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_exact</span> <span class=\"special\">==</span> <span class=\"keyword\">false</span>\n</pre>\n<p>\n          This is because these types are in essence a rational type with a fixed\n          denominator.\n        </p>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.how_to_tell.h3\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.how_to_tell.floating_point_types\"></a></span><a class=\"link\" href=\"how_to_tell.html#boost_multiprecision.tut.limits.how_to_tell.floating_point_types\">floating-point\n          Types</a>\n        </h5>\n<p>\n          For a floating-point type T, all of the following conditions hold:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_specialized</span> <span class=\"special\">==</span> <span class=\"keyword\">true</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_integer</span> <span class=\"special\">==</span> <span class=\"keyword\">false</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_exact</span> <span class=\"special\">==</span> <span class=\"keyword\">false</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">min_exponent</span> <span class=\"special\">!=</span> <span class=\"number\">0</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_exponent</span> <span class=\"special\">!=</span> <span class=\"number\">0</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">min_exponent10</span> <span class=\"special\">!=</span> <span class=\"number\">0</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max_exponent10</span> <span class=\"special\">!=</span> <span class=\"number\">0</span>\n</pre>\n<p>\n          In addition the type is <span class=\"emphasis\"><em>signed</em></span> if:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_signed</span> <span class=\"special\">==</span> <span class=\"keyword\">true</span>\n</pre>\n<p>\n          And the type may be decimal or binary depending on the value of:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">radix</span>\n</pre>\n<p>\n          In general, there are no arbitrary precision floating-point types, and\n          so:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_bounded</span> <span class=\"special\">==</span> <span class=\"keyword\">false</span>\n</pre>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.how_to_tell.h4\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.how_to_tell.exact_floating_point_types\"></a></span><a class=\"link\" href=\"how_to_tell.html#boost_multiprecision.tut.limits.how_to_tell.exact_floating_point_types\">Exact\n          floating-point Types</a>\n        </h5>\n<p>\n          Exact floating-point types are a <a href=\"http://en.wikipedia.org/wiki/Field_%28mathematics%29\" target=\"_top\">field</a>\n          composed of an arbitrary precision integer scaled by an exponent. Such\n          types have no division operator and are the same as floating-point types\n          except:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_exact</span> <span class=\"special\">==</span> <span class=\"keyword\">true</span>\n</pre>\n<h5>\n<a name=\"boost_multiprecision.tut.limits.how_to_tell.h5\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.limits.how_to_tell.complex_numbers\"></a></span><a class=\"link\" href=\"how_to_tell.html#boost_multiprecision.tut.limits.how_to_tell.complex_numbers\">Complex\n          Numbers</a>\n        </h5>\n<p>\n          For historical reasons, complex numbers do not specialize <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code>, instead you must inspect\n          <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"keyword\">typename</span> <span class=\"identifier\">T</span><span class=\"special\">::</span><span class=\"identifier\">value_type</span><span class=\"special\">&gt;</span></code>.\n        </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"limits32.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../limits.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../input_output.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/limits/limits32.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Numeric limits for 32-bit platform</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../limits.html\" title=\"Numeric Limits\">\n<link rel=\"prev\" href=\"functions.html\" title=\"std::numeric_limits&lt;&gt; functions\">\n<link rel=\"next\" href=\"how_to_tell.html\" title=\"How to Determine the Kind of a Number From std::numeric_limits\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"functions.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../limits.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"how_to_tell.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.limits.limits32\"></a><a class=\"link\" href=\"limits32.html\" title=\"Numeric limits for 32-bit platform\">Numeric limits\n        for 32-bit platform</a>\n</h4></div></div></div>\n<p>\n          These tables were generated using the following program and options:\n        </p>\n<pre class=\"programlisting\">\nProgram:\n numeric_limits_qbk.cpp\nMon Nov  4 18:09:06 2013\nBuildInfo:\n  Platform Win32\n  Compiler Microsoft Visual C++ version 10.0\n  MSVC version 160040219.\n  STL Dinkumware standard library version 520\n  Boost version 1.55.0\n</pre>\n<div class=\"table\">\n<a name=\"boost_multiprecision.tut.limits.limits32.integral_constants\"></a><p class=\"title\"><b>Table 1.4. Integer types constants (<code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_integer</span>\n          <span class=\"special\">==</span> <span class=\"keyword\">true</span></code>\n          &amp;&amp; is_exact == true)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Integer types constants (std::numeric_limits&lt;T&gt;::is_integer\n          == true\n          &amp;&amp; is_exact == true)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                  <p>\n                    type\n                  </p>\n                </th>\n<th>\n                  <p>\n                    signed\n                  </p>\n                </th>\n<th>\n                  <p>\n                    bound\n                  </p>\n                </th>\n<th>\n                  <p>\n                    modulo\n                  </p>\n                </th>\n<th>\n                  <p>\n                    round\n                  </p>\n                </th>\n<th>\n                  <p>\n                    radix\n                  </p>\n                </th>\n<th>\n                  <p>\n                    digits\n                  </p>\n                </th>\n<th>\n                  <p>\n                    digits10\n                  </p>\n                </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                  <p>\n                    bool\n                  </p>\n                </td>\n<td>\n                  <p>\n                    unsigned\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    no\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1\n                  </p>\n                </td>\n<td>\n                  <p>\n                    0\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    char\n                  </p>\n                </td>\n<td>\n                  <p>\n                    signed\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    modulo\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    7\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    unsigned char\n                  </p>\n                </td>\n<td>\n                  <p>\n                    unsigned\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    modulo\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    8\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    char16_t\n                  </p>\n                </td>\n<td>\n                  <p>\n                    unsigned\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    modulo\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    16\n                  </p>\n                </td>\n<td>\n                  <p>\n                    4\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    char32_t\n                  </p>\n                </td>\n<td>\n                  <p>\n                    unsigned\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    modulo\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    32\n                  </p>\n                </td>\n<td>\n                  <p>\n                    9\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    short\n                  </p>\n                </td>\n<td>\n                  <p>\n                    signed\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    modulo\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    15\n                  </p>\n                </td>\n<td>\n                  <p>\n                    4\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    unsigned short\n                  </p>\n                </td>\n<td>\n                  <p>\n                    unsigned\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    modulo\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    16\n                  </p>\n                </td>\n<td>\n                  <p>\n                    4\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    int\n                  </p>\n                </td>\n<td>\n                  <p>\n                    signed\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    modulo\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    31\n                  </p>\n                </td>\n<td>\n                  <p>\n                    9\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    unsigned\n                  </p>\n                </td>\n<td>\n                  <p>\n                    unsigned\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    modulo\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    32\n                  </p>\n                </td>\n<td>\n                  <p>\n                    9\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    long\n                  </p>\n                </td>\n<td>\n                  <p>\n                    signed\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    modulo\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    31\n                  </p>\n                </td>\n<td>\n                  <p>\n                    9\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    unsigned long\n                  </p>\n                </td>\n<td>\n                  <p>\n                    unsigned\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    modulo\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    32\n                  </p>\n                </td>\n<td>\n                  <p>\n                    9\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    long long\n                  </p>\n                </td>\n<td>\n                  <p>\n                    signed\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    modulo\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    63\n                  </p>\n                </td>\n<td>\n                  <p>\n                    18\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    unsigned long long\n                  </p>\n                </td>\n<td>\n                  <p>\n                    unsigned\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    modulo\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    64\n                  </p>\n                </td>\n<td>\n                  <p>\n                    19\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    int32_t\n                  </p>\n                </td>\n<td>\n                  <p>\n                    signed\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    modulo\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    31\n                  </p>\n                </td>\n<td>\n                  <p>\n                    9\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    uint32_t\n                  </p>\n                </td>\n<td>\n                  <p>\n                    unsigned\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    modulo\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    32\n                  </p>\n                </td>\n<td>\n                  <p>\n                    9\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    int64_t\n                  </p>\n                </td>\n<td>\n                  <p>\n                    signed\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    modulo\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    63\n                  </p>\n                </td>\n<td>\n                  <p>\n                    18\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    uint64_t\n                  </p>\n                </td>\n<td>\n                  <p>\n                    unsigned\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    modulo\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    64\n                  </p>\n                </td>\n<td>\n                  <p>\n                    19\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    int128_t\n                  </p>\n                </td>\n<td>\n                  <p>\n                    signed\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    modulo\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    128\n                  </p>\n                </td>\n<td>\n                  <p>\n                    38\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    uint128_t\n                  </p>\n                </td>\n<td>\n                  <p>\n                    unsigned\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    modulo\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    128\n                  </p>\n                </td>\n<td>\n                  <p>\n                    38\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    int256_t\n                  </p>\n                </td>\n<td>\n                  <p>\n                    signed\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    modulo\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    256\n                  </p>\n                </td>\n<td>\n                  <p>\n                    77\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    uint256_t\n                  </p>\n                </td>\n<td>\n                  <p>\n                    unsigned\n                  </p>\n                </td>\n<td>\n                  <p>\n                    bound\n                  </p>\n                </td>\n<td>\n                  <p>\n                    modulo\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    256\n                  </p>\n                </td>\n<td>\n                  <p>\n                    77\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    cpp_int\n                  </p>\n                </td>\n<td>\n                  <p>\n                    signed\n                  </p>\n                </td>\n<td>\n                  <p>\n                    unbounded\n                  </p>\n                </td>\n<td>\n                  <p>\n                    no\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to zero\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2147483647\n                  </p>\n                </td>\n<td>\n                  <p>\n                    646392383\n                  </p>\n                </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.tut.limits.limits32.integral_functions\"></a><p class=\"title\"><b>Table 1.5. Integer types functions (<code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_integer</span>\n          <span class=\"special\">==</span> <span class=\"keyword\">true</span>\n          <span class=\"special\">&amp;&amp;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">min</span><span class=\"special\">()</span> <span class=\"special\">==</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">lowest</span><span class=\"special\">()</span></code> )</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Integer types functions (std::numeric_limits&lt;T&gt;::is_integer\n          == true\n          &amp;&amp; std::numeric_limits&lt;T&gt;::min() == std::numeric_limits&lt;T&gt;::lowest() )\">\n<colgroup>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                  <p>\n                    function\n                  </p>\n                </th>\n<th>\n                  <p>\n                    max\n                  </p>\n                </th>\n<th>\n                  <p>\n                    min\n                  </p>\n                </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                  <p>\n                    bool\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1\n                  </p>\n                </td>\n<td>\n                  <p>\n                    0\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    char\n                  </p>\n                </td>\n<td>\n                  <p>\n                    127\n                  </p>\n                </td>\n<td>\n                  <p>\n                    -128\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    unsigned char\n                  </p>\n                </td>\n<td>\n                  <p>\n                    255\n                  </p>\n                </td>\n<td>\n                  <p>\n                    0\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    char16_t\n                  </p>\n                </td>\n<td>\n                  <p>\n                    65535\n                  </p>\n                </td>\n<td>\n                  <p>\n                    0\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    char32_t\n                  </p>\n                </td>\n<td>\n                  <p>\n                    4294967295\n                  </p>\n                </td>\n<td>\n                  <p>\n                    0\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    short\n                  </p>\n                </td>\n<td>\n                  <p>\n                    32767\n                  </p>\n                </td>\n<td>\n                  <p>\n                    -32768\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    unsigned short\n                  </p>\n                </td>\n<td>\n                  <p>\n                    65535\n                  </p>\n                </td>\n<td>\n                  <p>\n                    0\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    int\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2147483647\n                  </p>\n                </td>\n<td>\n                  <p>\n                    -2147483648\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    unsigned int\n                  </p>\n                </td>\n<td>\n                  <p>\n                    4294967295\n                  </p>\n                </td>\n<td>\n                  <p>\n                    0\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    long\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2147483647\n                  </p>\n                </td>\n<td>\n                  <p>\n                    -2147483648\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    unsigned long\n                  </p>\n                </td>\n<td>\n                  <p>\n                    4294967295\n                  </p>\n                </td>\n<td>\n                  <p>\n                    0\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    long long\n                  </p>\n                </td>\n<td>\n                  <p>\n                    9223372036854775807\n                  </p>\n                </td>\n<td>\n                  <p>\n                    -9223372036854775808\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    unsigned long long\n                  </p>\n                </td>\n<td>\n                  <p>\n                    18446744073709551615\n                  </p>\n                </td>\n<td>\n                  <p>\n                    0\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    int32_t\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2147483647\n                  </p>\n                </td>\n<td>\n                  <p>\n                    -2147483648\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    int64_t\n                  </p>\n                </td>\n<td>\n                  <p>\n                    9223372036854775807\n                  </p>\n                </td>\n<td>\n                  <p>\n                    -9223372036854775808\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    int128_t\n                  </p>\n                </td>\n<td>\n                  <p>\n                    340282366920938463463374607431768211455\n                  </p>\n                </td>\n<td>\n                  <p>\n                    -340282366920938463463374607431768211455\n                  </p>\n                </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.tut.limits.limits32.float_functions\"></a><p class=\"title\"><b>Table 1.6. Floating-point types constants (<code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_integer</span><span class=\"special\">==</span><span class=\"keyword\">false</span> <span class=\"special\">&amp;&amp;</span> <span class=\"identifier\">is_signed</span><span class=\"special\">==</span><span class=\"keyword\">true</span> <span class=\"special\">&amp;&amp;</span> <span class=\"identifier\">is_modulo</span><span class=\"special\">==</span><span class=\"keyword\">false</span> <span class=\"special\">&amp;&amp;</span> <span class=\"identifier\">is_exact</span><span class=\"special\">==</span><span class=\"keyword\">false</span> <span class=\"special\">&amp;&amp;</span> <span class=\"identifier\">is_bound</span><span class=\"special\">==</span><span class=\"keyword\">true</span></code>)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Floating-point types constants (std::numeric_limits&lt;T&gt;::is_integer==false &amp;&amp; is_signed==true &amp;&amp; is_modulo==false &amp;&amp; is_exact==false &amp;&amp; is_bound==true)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                  <p>\n                    type\n                  </p>\n                </th>\n<th>\n                  <p>\n                    round\n                  </p>\n                </th>\n<th>\n                  <p>\n                    radix\n                  </p>\n                </th>\n<th>\n                  <p>\n                    digits\n                  </p>\n                </th>\n<th>\n                  <p>\n                    digits10\n                  </p>\n                </th>\n<th>\n                  <p>\n                    max_digits10\n                  </p>\n                </th>\n<th>\n                  <p>\n                    min_exp\n                  </p>\n                </th>\n<th>\n                  <p>\n                    min_exp10\n                  </p>\n                </th>\n<th>\n                  <p>\n                    max_exp\n                  </p>\n                </th>\n<th>\n                  <p>\n                    max_exp10\n                  </p>\n                </th>\n<th>\n                  <p>\n                    tiny\n                  </p>\n                </th>\n<th>\n                  <p>\n                    trap\n                  </p>\n                </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                  <p>\n                    float\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to nearest\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    24\n                  </p>\n                </td>\n<td>\n                  <p>\n                    6\n                  </p>\n                </td>\n<td>\n                  <p>\n                    8\n                  </p>\n                </td>\n<td>\n                  <p>\n                    -125\n                  </p>\n                </td>\n<td>\n                  <p>\n                    -37\n                  </p>\n                </td>\n<td>\n                  <p>\n                    128\n                  </p>\n                </td>\n<td>\n                  <p>\n                    38\n                  </p>\n                </td>\n<td>\n                  <p>\n                    tiny\n                  </p>\n                </td>\n<td>\n                  <p>\n                    traps\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    double\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to nearest\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    53\n                  </p>\n                </td>\n<td>\n                  <p>\n                    15\n                  </p>\n                </td>\n<td>\n                  <p>\n                    17\n                  </p>\n                </td>\n<td>\n                  <p>\n                    -1021\n                  </p>\n                </td>\n<td>\n                  <p>\n                    -307\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1024\n                  </p>\n                </td>\n<td>\n                  <p>\n                    308\n                  </p>\n                </td>\n<td>\n                  <p>\n                    tiny\n                  </p>\n                </td>\n<td>\n                  <p>\n                    traps\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    long double\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to nearest\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    53\n                  </p>\n                </td>\n<td>\n                  <p>\n                    15\n                  </p>\n                </td>\n<td>\n                  <p>\n                    17\n                  </p>\n                </td>\n<td>\n                  <p>\n                    -1021\n                  </p>\n                </td>\n<td>\n                  <p>\n                    -307\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1024\n                  </p>\n                </td>\n<td>\n                  <p>\n                    308\n                  </p>\n                </td>\n<td>\n                  <p>\n                    tiny\n                  </p>\n                </td>\n<td>\n                  <p>\n                    traps\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    cpp_dec_float_50\n                  </p>\n                </td>\n<td>\n                  <p>\n                    indeterminate\n                  </p>\n                </td>\n<td>\n                  <p>\n                    10\n                  </p>\n                </td>\n<td>\n                  <p>\n                    50\n                  </p>\n                </td>\n<td>\n                  <p>\n                    50\n                  </p>\n                </td>\n<td>\n                  <p>\n                    80\n                  </p>\n                </td>\n<td>\n                  <p>\n                    -222953000\n                  </p>\n                </td>\n<td>\n                  <p>\n                    -67108864\n                  </p>\n                </td>\n<td>\n                  <p>\n                    222953000\n                  </p>\n                </td>\n<td>\n                  <p>\n                    67108864\n                  </p>\n                </td>\n<td>\n                  <p>\n                    no\n                  </p>\n                </td>\n<td>\n                  <p>\n                    no\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    bin_128bit_double_type\n                  </p>\n                </td>\n<td>\n                  <p>\n                    to nearest\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2\n                  </p>\n                </td>\n<td>\n                  <p>\n                    377\n                  </p>\n                </td>\n<td>\n                  <p>\n                    113\n                  </p>\n                </td>\n<td>\n                  <p>\n                    115\n                  </p>\n                </td>\n<td>\n                  <p>\n                    -2147482894\n                  </p>\n                </td>\n<td>\n                  <p>\n                    -646392082\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2147482893\n                  </p>\n                </td>\n<td>\n                  <p>\n                    646392082\n                  </p>\n                </td>\n<td>\n                  <p>\n                    no\n                  </p>\n                </td>\n<td>\n                  <p>\n                    traps\n                  </p>\n                </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\"><div class=\"table\">\n<a name=\"boost_multiprecision.tut.limits.limits32.float_functions0\"></a><p class=\"title\"><b>Table 1.7. Floating-point types functions (<code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;::</span><span class=\"identifier\">is_integer</span>\n          <span class=\"special\">==</span> <span class=\"keyword\">false</span></code>)</b></p>\n<div class=\"table-contents\"><table class=\"table\" summary=\"Floating-point types functions (std::numeric_limits&lt;T&gt;::is_integer\n          == false)\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                  <p>\n                    function\n                  </p>\n                </th>\n<th>\n                  <p>\n                    float\n                  </p>\n                </th>\n<th>\n                  <p>\n                    double\n                  </p>\n                </th>\n<th>\n                  <p>\n                    long double\n                  </p>\n                </th>\n<th>\n                  <p>\n                    cpp_dec_50\n                  </p>\n                </th>\n<th>\n                  <p>\n                    cpp_bin_128\n                  </p>\n                </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                  <p>\n                    max\n                  </p>\n                </td>\n<td>\n                  <p>\n                    3.40282e+038\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1.79769e+308\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1.79769e+308\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1e+67108865\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1.85906e+646456766\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    min\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1.17549e-038\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2.22507e-308\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2.22507e-308\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1e-67108864\n                  </p>\n                </td>\n<td>\n                  <p>\n                    5.37906e-646456767\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    epsilon\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1.19209e-007\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2.22045e-016\n                  </p>\n                </td>\n<td>\n                  <p>\n                    2.22045e-016\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1e-49\n                  </p>\n                </td>\n<td>\n                  <p>\n                    6.49713e-114\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    round_error\n                  </p>\n                </td>\n<td>\n                  <p>\n                    0.5\n                  </p>\n                </td>\n<td>\n                  <p>\n                    0.5\n                  </p>\n                </td>\n<td>\n                  <p>\n                    0.5\n                  </p>\n                </td>\n<td>\n                  <p>\n                    0.5\n                  </p>\n                </td>\n<td>\n                  <p>\n                    0.5\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    infinity\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1.#INF\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1.#INF\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1.#INF\n                  </p>\n                </td>\n<td>\n                  <p>\n                    inf\n                  </p>\n                </td>\n<td>\n                  <p>\n                    inf\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    quiet_NaN\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1.#QNAN\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1.#QNAN\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1.#QNAN\n                  </p>\n                </td>\n<td>\n                  <p>\n                    nan\n                  </p>\n                </td>\n<td>\n                  <p>\n                    nan\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    signaling_NaN\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1.#QNAN\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1.#QNAN\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1.#QNAN\n                  </p>\n                </td>\n<td>\n                  <p>\n                    0\n                  </p>\n                </td>\n<td>\n                  <p>\n                    0\n                  </p>\n                </td>\n</tr>\n<tr>\n<td>\n                  <p>\n                    denorm_min\n                  </p>\n                </td>\n<td>\n                  <p>\n                    1.4013e-045\n                  </p>\n                </td>\n<td>\n                  <p>\n                    4.94066e-324\n                  </p>\n                </td>\n<td>\n                  <p>\n                    4.94066e-324\n                  </p>\n                </td>\n<td>\n                  <p>\n                    0\n                  </p>\n                </td>\n<td>\n                  <p>\n                    0\n                  </p>\n                </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<br class=\"table-break\">\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"functions.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../limits.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"how_to_tell.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/limits.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Numeric Limits</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"serial.html\" title=\"Boost.Serialization Support\">\n<link rel=\"next\" href=\"limits/constants.html\" title=\"std::numeric_limits&lt;&gt; constants\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"serial.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"limits/constants.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.limits\"></a><a class=\"link\" href=\"limits.html\" title=\"Numeric Limits\">Numeric Limits</a>\n</h3></div></div></div>\n<div class=\"toc\"><dl class=\"toc\">\n<dt><span class=\"section\"><a href=\"limits/constants.html\">std::numeric_limits&lt;&gt;\n        constants</a></span></dt>\n<dt><span class=\"section\"><a href=\"limits/functions.html\"><code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;&gt;</span></code> functions</a></span></dt>\n<dt><span class=\"section\"><a href=\"limits/limits32.html\">Numeric limits\n        for 32-bit platform</a></span></dt>\n<dt><span class=\"section\"><a href=\"limits/how_to_tell.html\">How to\n        Determine the Kind of a Number From <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code></a></span></dt>\n</dl></div>\n<p>\n        Boost.Multiprecision tries hard to implement <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code>\n        for all types as far as possible and meaningful because experience with Boost.Math\n        has shown that this aids portability.\n      </p>\n<p>\n        The <a href=\"http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf\" target=\"_top\">C++\n        standard library</a> defines <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code>\n        in section 18.3.2.\n      </p>\n<p>\n        This in turn refers to the C standard <a href=\"http://www.open-std.org/jtc1/sc22/wg11/docs/n507.pdf\" target=\"_top\">SC22/WG11\n        N507 DRAFT INTERNATIONAL ISO/IEC STANDARD WD 10967-1</a> Information\n        technology Language independent arithmetic Part 1: Integer and floating-point\n        arithmetic.\n      </p>\n<p>\n        That C Standard in turn refers to\n      </p>\n<p>\n        <a href=\"https://doi.org/10.1109/IEEESTD.1985.82928\" target=\"_top\">IEEE754 IEEE Standard\n        for Binary Floating-Point Arithmetic</a>\n      </p>\n<p>\n        There is a useful summary of <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code>\n        at <a href=\"http://www.cplusplus.com/reference/limits/numeric_limits/\" target=\"_top\">C++\n        reference</a>.\n      </p>\n<p>\n        The chosen backend often determines how completely <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code>\n        is available.\n      </p>\n<p>\n        Compiler options, processor type, and definition of macros or assembler instructions\n        to control denormal numbers will alter the values in the tables given below.\n      </p>\n<div class=\"warning\"><table border=\"0\" summary=\"Warning\">\n<tr>\n<td rowspan=\"2\" align=\"center\" valign=\"top\" width=\"25\"><img alt=\"[Warning]\" src=\"../../../../../../doc/src/images/warning.png\"></td>\n<th align=\"left\">Warning</th>\n</tr>\n<tr><td align=\"left\" valign=\"top\"><p>\n          GMP's extendable floatin-point <code class=\"computeroutput\"><span class=\"identifier\">mpf_t</span></code>\n          does not have a concept of overflow: operations that lead to overflow eventually\n          run of out of resources and terminate with stack overflow (often after\n          several seconds).\n        </p></td></tr>\n</table></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"serial.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"limits/constants.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/lits.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Literal Types and constexpr Support</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"primetest.html\" title=\"Primality Testing\">\n<link rel=\"next\" href=\"import_export.html\" title=\"Importing and Exporting Data to and from cpp_int and cpp_bin_float\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"primetest.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"import_export.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.lits\"></a><a class=\"link\" href=\"lits.html\" title=\"Literal Types and constexpr Support\">Literal Types and <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code> Support</a>\n</h3></div></div></div>\n<p>\n        There are two kinds of <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code>\n        support in this library:\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            The more basic version requires only C++11 and allow the construction\n            of some number types as literals.\n          </li>\n<li class=\"listitem\">\n            The more advanced support permits constexpr arithmetic and requires at\n            least C++14 constexpr support, and for many operations C++2a support\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.tut.lits.h0\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.tut.lits.declaring_numeric_literals\"></a></span><a class=\"link\" href=\"lits.html#boost_multiprecision.tut.lits.declaring_numeric_literals\">Declaring\n        numeric literals</a>\n      </h5>\n<p>\n        There are two backend types which are literals:\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            <a class=\"link\" href=\"floats/float128.html\" title=\"float128\">float128</a>\n            (which requires GCC), and\n          </li>\n<li class=\"listitem\">\n            Instantiations of <code class=\"computeroutput\"><span class=\"identifier\">cpp_int_backend</span></code>\n            where the Allocator parameter is type <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>.\n            In addition, prior to C++14 the Checked parameter must be <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">unchecked</span></code>.\n          </li>\n</ul></div>\n<p>\n        For example:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">constexpr</span> <span class=\"identifier\">float128</span>            <span class=\"identifier\">f</span> <span class=\"special\">=</span> <span class=\"number\">0.1</span><span class=\"identifier\">Q</span>   <span class=\"comment\">// OK, float128's are always literals in C++11</span>\n\n<span class=\"keyword\">constexpr</span> <span class=\"identifier\">int128_t</span>            <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span>     <span class=\"comment\">// OK, fixed precision int128_t has no allocator.</span>\n<span class=\"keyword\">constexpr</span> <span class=\"identifier\">uint1024_t</span>          <span class=\"identifier\">j</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"identifier\">xFFFFFFFF00000000uLL</span><span class=\"special\">;</span>  <span class=\"comment\">// OK, fixed precision uint1024_t has no allocator.</span>\n\n<span class=\"keyword\">constexpr</span> <span class=\"identifier\">checked_uint128_t</span>   <span class=\"identifier\">k</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span> <span class=\"comment\">// OK from C++14 and later, not supported for C++11.</span>\n<span class=\"keyword\">constexpr</span> <span class=\"identifier\">checked_uint128_t</span>   <span class=\"identifier\">k</span> <span class=\"special\">=</span> <span class=\"special\">-</span><span class=\"number\">1</span><span class=\"special\">;</span> <span class=\"comment\">// Error, as this would normally lead to a runtime failure (exception).</span>\n<span class=\"keyword\">constexpr</span> <span class=\"identifier\">cpp_int</span>             <span class=\"identifier\">l</span> <span class=\"special\">=</span> <span class=\"number\">2</span><span class=\"special\">;</span>  <span class=\"comment\">// Error, type is not a literal as it performs memory management.</span>\n</pre>\n<p>\n        There is also support for user defined-literals with <a class=\"link\" href=\"ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>\n        - these are limited to unchecked, fixed precision <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>'s\n        which are specified in hexadecimal notation. The suffixes supported are:\n      </p>\n<div class=\"informaltable\"><table class=\"table\">\n<colgroup>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Suffix\n                </p>\n              </th>\n<th>\n                <p>\n                  Meaning\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  _cppi\n                </p>\n              </td>\n<td>\n                <p>\n                  Specifies a value of type: <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">,</span><span class=\"identifier\">N</span><span class=\"special\">,</span><span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span><span class=\"identifier\">unchecked</span><span class=\"special\">,</span><span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code>,\n                  where N is chosen to contain just enough digits to hold the number\n                  specified.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  _cppui\n                </p>\n              </td>\n<td>\n                <p>\n                  Specifies a value of type: <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">,</span><span class=\"identifier\">N</span><span class=\"special\">,</span><span class=\"identifier\">unsigned_magnitude</span><span class=\"special\">,</span><span class=\"identifier\">unchecked</span><span class=\"special\">,</span><span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code>,\n                  where N is chosen to contain just enough digits to hold the number\n                  specified.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  _cppi<span class=\"emphasis\"><em>N</em></span>\n                </p>\n              </td>\n<td>\n                <p>\n                  Specifies a value of type <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">,</span><span class=\"identifier\">N</span><span class=\"special\">,</span><span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span><span class=\"identifier\">unchecked</span><span class=\"special\">,</span><span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  _cppui<span class=\"emphasis\"><em>N</em></span>\n                </p>\n              </td>\n<td>\n                <p>\n                  Specifies a value of type <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">,</span><span class=\"identifier\">N</span><span class=\"special\">,</span><span class=\"identifier\">signed_magnitude</span><span class=\"special\">,</span><span class=\"identifier\">unchecked</span><span class=\"special\">,</span><span class=\"keyword\">void</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span></code>.\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n<p>\n        In each case, use of these suffixes with hexadecimal values produces a <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code> result.\n      </p>\n<p>\n        Examples:\n      </p>\n<pre class=\"programlisting\"><span class=\"comment\">// Any use of user defined literals requires that we import the literal-operators into current scope first:</span>\n<span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">literals</span><span class=\"special\">;</span>\n<span class=\"comment\">//</span>\n<span class=\"comment\">// To keep things simple in the example, we'll make our types used visible to this scope as well:</span>\n<span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n<span class=\"comment\">//</span>\n<span class=\"comment\">// The value zero as a number&lt;cpp_int_backend&lt;4,4,signed_magnitude,unchecked,void&gt; &gt;:</span>\n<span class=\"keyword\">constexpr</span> <span class=\"keyword\">auto</span> <span class=\"identifier\">a</span> <span class=\"special\">=</span> <span class=\"number\">0x0</span><span class=\"identifier\">_cppi</span><span class=\"special\">;</span>\n<span class=\"comment\">// The type of each constant has 4 bits per hexadecimal digit,</span>\n<span class=\"comment\">// so this is of type uint256_t (ie number&lt;cpp_int_backend&lt;256,256,unsigned_magnitude,unchecked,void&gt; &gt;):</span>\n<span class=\"keyword\">constexpr</span> <span class=\"keyword\">auto</span> <span class=\"identifier\">b</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"identifier\">xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_cppui</span><span class=\"special\">;</span>\n<span class=\"comment\">//</span>\n<span class=\"comment\">// Smaller values can be assigned to larger values:</span>\n<span class=\"identifier\">int256_t</span> <span class=\"identifier\">c</span> <span class=\"special\">=</span> <span class=\"number\">0x1234</span><span class=\"identifier\">_cppi</span><span class=\"special\">;</span> <span class=\"comment\">// OK</span>\n<span class=\"comment\">//</span>\n<span class=\"comment\">// However, this only works in constexpr contexts from C++14 onwards:</span>\n<span class=\"keyword\">constexpr</span> <span class=\"identifier\">int256_t</span> <span class=\"identifier\">d</span> <span class=\"special\">=</span> <span class=\"number\">0x1</span><span class=\"identifier\">_cppi</span><span class=\"special\">;</span> <span class=\"comment\">// Compiler error in C++11, requires C++14</span>\n<span class=\"comment\">//</span>\n<span class=\"comment\">// Constants can be padded out with leading zeros to generate wider types:</span>\n<span class=\"keyword\">constexpr</span> <span class=\"identifier\">uint256_t</span> <span class=\"identifier\">e</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"identifier\">x0000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFF_cppui</span><span class=\"special\">;</span> <span class=\"comment\">// OK</span>\n<span class=\"comment\">//</span>\n<span class=\"comment\">// However, specific-width types are best produced with specific-width suffixes,</span>\n<span class=\"comment\">// ones supported by default are `_cpp[u]i128`, `_cpp[u]i256`, `_cpp[u]i512`, `_cpp[u]i1024`.</span>\n<span class=\"comment\">//</span>\n<span class=\"keyword\">constexpr</span> <span class=\"identifier\">int128_t</span> <span class=\"identifier\">f</span> <span class=\"special\">=</span> <span class=\"number\">0x1234</span><span class=\"identifier\">_cppi128</span><span class=\"special\">;</span> <span class=\"comment\">// OK, always produces an int128_t as the result.</span>\n<span class=\"keyword\">constexpr</span> <span class=\"identifier\">uint1024_t</span> <span class=\"identifier\">g</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"identifier\">xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccc_cppui1024</span><span class=\"special\">;</span> <span class=\"comment\">// OK,</span>\n<span class=\"comment\">//  always produces an uint1024_t as the result.</span>\n<span class=\"comment\">//</span>\n<span class=\"comment\">// If other specific-width types are required, then there is a macro for generating the operators for these.</span>\n<span class=\"comment\">// The macro can be used at namespace scope only:</span>\n<span class=\"comment\">//</span>\n<span class=\"identifier\">BOOST_MP_DEFINE_SIZED_CPP_INT_LITERAL</span><span class=\"special\">(</span><span class=\"number\">2048</span><span class=\"special\">);</span>\n<span class=\"comment\">//</span>\n<span class=\"comment\">// Now we can create 2048-bit literals as well:</span>\n<span class=\"keyword\">constexpr</span> <span class=\"keyword\">auto</span> <span class=\"identifier\">h</span> <span class=\"special\">=</span> <span class=\"number\">0xff</span><span class=\"identifier\">_cppi2048</span><span class=\"special\">;</span> <span class=\"comment\">// h is of type number&lt;cpp_int_backend&lt;2048,2048,signed_magnitude,unchecked,void&gt; &gt;</span>\n<span class=\"comment\">//</span>\n<span class=\"comment\">// Finally, negative values are handled via the unary minus operator:</span>\n<span class=\"comment\">//</span>\n<span class=\"keyword\">constexpr</span> <span class=\"identifier\">int1024_t</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"special\">-</span><span class=\"number\">0</span><span class=\"identifier\">xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_cppui1024</span><span class=\"special\">;</span>\n<span class=\"comment\">//</span>\n<span class=\"comment\">// Which means this also works:</span>\n<span class=\"keyword\">constexpr</span> <span class=\"identifier\">int1024_t</span> <span class=\"identifier\">j</span> <span class=\"special\">=</span> <span class=\"special\">-</span><span class=\"identifier\">g</span><span class=\"special\">;</span>   <span class=\"comment\">// OK: unary minus operator is constexpr.</span>\n</pre>\n<h5>\n<a name=\"boost_multiprecision.tut.lits.h1\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.tut.lits.constexpr_arithmetic\"></a></span><a class=\"link\" href=\"lits.html#boost_multiprecision.tut.lits.constexpr_arithmetic\">constexpr\n        arithmetic</a>\n      </h5>\n<p>\n        The front end of the library is all <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code>\n        from C++14 and later. Currently there are only two backend types that are\n        <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code> aware: __float128\n        and <a class=\"link\" href=\"ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>.\n        More backends will follow at a later date.\n      </p>\n<p>\n        Provided the compiler is GCC, type <a class=\"link\" href=\"floats/float128.html\" title=\"float128\">float128</a>\n        support <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code> operations\n        on all arithmetic operations from C++14, comparisons, <code class=\"computeroutput\"><span class=\"identifier\">abs</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">fabs</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">fpclassify</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">isnan</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">isinf</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">isfinite</span></code> and <code class=\"computeroutput\"><span class=\"identifier\">isnormal</span></code> are also fully supported, but\n        the transcendental functions are not.\n      </p>\n<p>\n        The <a class=\"link\" href=\"ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>\n        types support constexpr arithmetic, provided it is a fixed precision type\n        with no allocator. It may also be a checked integer: in which case a compiler\n        error will be generated on overflow or undefined behaviour. In addition the\n        free functions <code class=\"computeroutput\"><span class=\"identifier\">abs</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">swap</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">multiply</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">add</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">subtract</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">divide_qr</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">integer_modulus</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">powm</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">lsb</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">msb</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">bit_test</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">bit_set</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">bit_unset</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">bit_flip</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">sqrt</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">gcd</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">lcm</span></code>\n        are all supported. Use of <a class=\"link\" href=\"ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>\n        in this way requires either a C++2a compiler (one which supports <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">is_constant_evaluated</span><span class=\"special\">()</span></code> - currently only gcc-9 or clang-9 or later),\n        or GCC-6 or later in C++14 mode. Compilers other than GCC and without <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">is_constant_evaluated</span><span class=\"special\">()</span></code> will support a very limited set of operations:\n        expect to hit roadblocks rather easily.\n      </p>\n<p>\n        See <a href=\"https://en.cppreference.com/w/cpp/compiler_support\" target=\"_top\">compiler\n        support</a> for <a href=\"https://en.cppreference.com/w/cpp/types/is_constant_evaluated\" target=\"_top\"><code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">is_constant_evaluated</span></code></a>;\n      </p>\n<p>\n        For example given:\n      </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">math</span><span class=\"special\">/</span><span class=\"identifier\">constants</span><span class=\"special\">/</span><span class=\"identifier\">constants</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span> <span class=\"comment\">// For constant pi with full precision of type T.</span>\n<span class=\"comment\">// using  boost::math::constants::pi;</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">inline</span> <span class=\"keyword\">constexpr</span> <span class=\"identifier\">T</span> <span class=\"identifier\">circumference</span><span class=\"special\">(</span><span class=\"identifier\">T</span> <span class=\"identifier\">radius</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">return</span> <span class=\"number\">2</span> <span class=\"special\">*</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">constants</span><span class=\"special\">::</span><span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;()</span> <span class=\"special\">*</span> <span class=\"identifier\">radius</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">inline</span> <span class=\"keyword\">constexpr</span> <span class=\"identifier\">T</span> <span class=\"identifier\">area</span><span class=\"special\">(</span><span class=\"identifier\">T</span> <span class=\"identifier\">radius</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">return</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">constants</span><span class=\"special\">::</span><span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">&gt;()</span> <span class=\"special\">*</span> <span class=\"identifier\">radius</span> <span class=\"special\">*</span> <span class=\"identifier\">radius</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n        We can now calculate areas and circumferences, using all compile-time <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code> arithmetic:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">using</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">float128</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">constexpr</span> <span class=\"identifier\">float128</span> <span class=\"identifier\">radius</span> <span class=\"special\">=</span> <span class=\"number\">2.25</span><span class=\"special\">;</span>\n<span class=\"keyword\">constexpr</span> <span class=\"identifier\">float128</span> <span class=\"identifier\">c</span>      <span class=\"special\">=</span> <span class=\"identifier\">circumference</span><span class=\"special\">(</span><span class=\"identifier\">radius</span><span class=\"special\">);</span>\n<span class=\"keyword\">constexpr</span> <span class=\"identifier\">float128</span> <span class=\"identifier\">a</span>      <span class=\"special\">=</span> <span class=\"identifier\">area</span><span class=\"special\">(</span><span class=\"identifier\">radius</span><span class=\"special\">);</span>\n\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Circumference = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">c</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Area = \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">a</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n</pre>\n<p>\n        Note that these make use of the numeric constants from the <a href=\"https://www.boost.org/doc/libs/release/libs/math/doc/html/math_toolkit/constants.html\" target=\"_top\">Boost.Math\n        constants</a> library, which also happen to be <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code>.\n        These usually have the full precision of the floating-point type, here 128-bit,\n        about 36 decimal digits.\n      </p>\n<h6>\n<a name=\"boost_multiprecision.tut.lits.h2\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.tut.lits.hermite_poly_coeffics\"></a></span><a class=\"link\" href=\"lits.html#boost_multiprecision.tut.lits.hermite_poly_coeffics\">Calculating\n        Hermite Polynomial coefficients at compile time</a>\n      </h6>\n<p>\n        For a more interesting example, in <a href=\"http://www.boost.org/doc/libs/release/libs/multiprecision/doc/html/../../example/constexpr_float_arithmetic_examples.cpp\" target=\"_top\">constexpr_float_arithmetic_examples.cpp</a>\n        we define a simple class for <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code>\n        polynomial arithmetic:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">Order</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">struct</span> <span class=\"identifier\">const_polynomial</span><span class=\"special\">;</span>\n</pre>\n<p>\n        Given this, we can use recurrence relations to calculate the coefficients\n        for various orthogonal polynomials - in the example we use the Hermite polynomials.\n        Only the constructor does any work - it uses the recurrence relations to\n        calculate the coefficient array:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">Order</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">hermite_polynomial</span>\n<span class=\"special\">{</span>\n   <span class=\"identifier\">const_polynomial</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">,</span> <span class=\"identifier\">Order</span><span class=\"special\">&gt;</span> <span class=\"identifier\">m_data</span><span class=\"special\">;</span>\n\n <span class=\"keyword\">public</span><span class=\"special\">:</span>\n   <span class=\"keyword\">constexpr</span> <span class=\"identifier\">hermite_polynomial</span><span class=\"special\">()</span> <span class=\"special\">:</span> <span class=\"identifier\">m_data</span><span class=\"special\">(</span><span class=\"identifier\">hermite_polynomial</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">,</span> <span class=\"identifier\">Order</span> <span class=\"special\">-</span> <span class=\"number\">1</span><span class=\"special\">&gt;().</span><span class=\"identifier\">data</span><span class=\"special\">()</span> <span class=\"special\">*</span> <span class=\"identifier\">const_polynomial</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">,</span> <span class=\"number\">1</span><span class=\"special\">&gt;{</span><span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"number\">2</span><span class=\"special\">}</span> <span class=\"special\">-</span> <span class=\"identifier\">hermite_polynomial</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">,</span> <span class=\"identifier\">Order</span> <span class=\"special\">-</span> <span class=\"number\">1</span><span class=\"special\">&gt;().</span><span class=\"identifier\">data</span><span class=\"special\">().</span><span class=\"identifier\">derivative</span><span class=\"special\">())</span>\n   <span class=\"special\">{</span>\n   <span class=\"special\">}</span>\n   <span class=\"keyword\">constexpr</span> <span class=\"keyword\">const</span> <span class=\"identifier\">const_polynomial</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">,</span> <span class=\"identifier\">Order</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">data</span><span class=\"special\">()</span> <span class=\"keyword\">const</span>\n   <span class=\"special\">{</span>\n      <span class=\"keyword\">return</span> <span class=\"identifier\">m_data</span><span class=\"special\">;</span>\n   <span class=\"special\">}</span>\n   <span class=\"keyword\">constexpr</span> <span class=\"keyword\">const</span> <span class=\"identifier\">T</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">[](</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span> <span class=\"identifier\">N</span><span class=\"special\">)</span><span class=\"keyword\">const</span>\n   <span class=\"special\">{</span>\n      <span class=\"keyword\">return</span> <span class=\"identifier\">m_data</span><span class=\"special\">[</span><span class=\"identifier\">N</span><span class=\"special\">];</span>\n   <span class=\"special\">}</span>\n   <span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">U</span><span class=\"special\">&gt;</span>\n   <span class=\"keyword\">constexpr</span> <span class=\"identifier\">T</span> <span class=\"keyword\">operator</span><span class=\"special\">()(</span><span class=\"identifier\">U</span> <span class=\"identifier\">val</span><span class=\"special\">)</span><span class=\"keyword\">const</span>\n   <span class=\"special\">{</span>\n      <span class=\"keyword\">return</span> <span class=\"identifier\">m_data</span><span class=\"special\">(</span><span class=\"identifier\">val</span><span class=\"special\">);</span>\n   <span class=\"special\">}</span>\n<span class=\"special\">};</span>\n</pre>\n<p>\n        Now we just need to define <span class=\"emphasis\"><em>H<sub>0</sub></em></span> and <span class=\"emphasis\"><em>H<sub>1</sub></em></span>\n        as termination conditions for the recurrence:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">hermite_polynomial</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">,</span> <span class=\"number\">0</span><span class=\"special\">&gt;</span>\n<span class=\"special\">{</span>\n   <span class=\"identifier\">const_polynomial</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">,</span> <span class=\"number\">0</span><span class=\"special\">&gt;</span> <span class=\"identifier\">m_data</span><span class=\"special\">;</span>\n\n <span class=\"keyword\">public</span><span class=\"special\">:</span>\n   <span class=\"keyword\">constexpr</span> <span class=\"identifier\">hermite_polynomial</span><span class=\"special\">()</span> <span class=\"special\">:</span> <span class=\"identifier\">m_data</span><span class=\"special\">{</span><span class=\"number\">1</span><span class=\"special\">}</span> <span class=\"special\">{}</span>\n   <span class=\"keyword\">constexpr</span> <span class=\"keyword\">const</span> <span class=\"identifier\">const_polynomial</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">,</span> <span class=\"number\">0</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">data</span><span class=\"special\">()</span> <span class=\"keyword\">const</span>\n   <span class=\"special\">{</span>\n      <span class=\"keyword\">return</span> <span class=\"identifier\">m_data</span><span class=\"special\">;</span>\n   <span class=\"special\">}</span>\n   <span class=\"keyword\">constexpr</span> <span class=\"keyword\">const</span> <span class=\"identifier\">T</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">[](</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span> <span class=\"identifier\">N</span><span class=\"special\">)</span> <span class=\"keyword\">const</span>\n   <span class=\"special\">{</span>\n      <span class=\"keyword\">return</span> <span class=\"identifier\">m_data</span><span class=\"special\">[</span><span class=\"identifier\">N</span><span class=\"special\">];</span>\n   <span class=\"special\">}</span>\n   <span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">U</span><span class=\"special\">&gt;</span>\n   <span class=\"keyword\">constexpr</span> <span class=\"identifier\">T</span> <span class=\"keyword\">operator</span><span class=\"special\">()(</span><span class=\"identifier\">U</span> <span class=\"identifier\">val</span><span class=\"special\">)</span>\n   <span class=\"special\">{</span>\n      <span class=\"keyword\">return</span> <span class=\"identifier\">m_data</span><span class=\"special\">(</span><span class=\"identifier\">val</span><span class=\"special\">);</span>\n   <span class=\"special\">}</span>\n<span class=\"special\">};</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">hermite_polynomial</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">,</span> <span class=\"number\">1</span><span class=\"special\">&gt;</span>\n<span class=\"special\">{</span>\n   <span class=\"identifier\">const_polynomial</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">,</span> <span class=\"number\">1</span><span class=\"special\">&gt;</span> <span class=\"identifier\">m_data</span><span class=\"special\">;</span>\n\n <span class=\"keyword\">public</span><span class=\"special\">:</span>\n   <span class=\"keyword\">constexpr</span> <span class=\"identifier\">hermite_polynomial</span><span class=\"special\">()</span> <span class=\"special\">:</span> <span class=\"identifier\">m_data</span><span class=\"special\">{</span><span class=\"number\">0</span><span class=\"special\">,</span> <span class=\"number\">2</span><span class=\"special\">}</span> <span class=\"special\">{}</span>\n   <span class=\"keyword\">constexpr</span> <span class=\"keyword\">const</span> <span class=\"identifier\">const_polynomial</span><span class=\"special\">&lt;</span><span class=\"identifier\">T</span><span class=\"special\">,</span> <span class=\"number\">1</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">data</span><span class=\"special\">()</span> <span class=\"keyword\">const</span>\n   <span class=\"special\">{</span>\n      <span class=\"keyword\">return</span> <span class=\"identifier\">m_data</span><span class=\"special\">;</span>\n   <span class=\"special\">}</span>\n   <span class=\"keyword\">constexpr</span> <span class=\"keyword\">const</span> <span class=\"identifier\">T</span><span class=\"special\">&amp;</span> <span class=\"keyword\">operator</span><span class=\"special\">[](</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span> <span class=\"identifier\">N</span><span class=\"special\">)</span> <span class=\"keyword\">const</span>\n   <span class=\"special\">{</span>\n      <span class=\"keyword\">return</span> <span class=\"identifier\">m_data</span><span class=\"special\">[</span><span class=\"identifier\">N</span><span class=\"special\">];</span>\n   <span class=\"special\">}</span>\n   <span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">U</span><span class=\"special\">&gt;</span>\n   <span class=\"keyword\">constexpr</span> <span class=\"identifier\">T</span> <span class=\"keyword\">operator</span><span class=\"special\">()(</span><span class=\"identifier\">U</span> <span class=\"identifier\">val</span><span class=\"special\">)</span>\n   <span class=\"special\">{</span>\n      <span class=\"keyword\">return</span> <span class=\"identifier\">m_data</span><span class=\"special\">(</span><span class=\"identifier\">val</span><span class=\"special\">);</span>\n   <span class=\"special\">}</span>\n<span class=\"special\">};</span>\n</pre>\n<p>\n        We can now declare <span class=\"emphasis\"><em>H<sub>9</sub></em></span> as a <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code>\n        object, access the coefficients, and evaluate at an abscissa value, all at\n        compile-time using <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code>\n        arithmetic:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">constexpr</span> <span class=\"identifier\">hermite_polynomial</span><span class=\"special\">&lt;</span><span class=\"identifier\">float128</span><span class=\"special\">,</span> <span class=\"number\">9</span><span class=\"special\">&gt;</span> <span class=\"identifier\">h9</span><span class=\"special\">;</span>\n<span class=\"comment\">//</span>\n<span class=\"comment\">// Verify that the polynomial's coefficients match the known values:</span>\n<span class=\"comment\">//</span>\n<span class=\"keyword\">static_assert</span><span class=\"special\">(</span><span class=\"identifier\">h9</span><span class=\"special\">[</span><span class=\"number\">0</span><span class=\"special\">]</span> <span class=\"special\">==</span> <span class=\"number\">0</span><span class=\"special\">);</span>\n<span class=\"keyword\">static_assert</span><span class=\"special\">(</span><span class=\"identifier\">h9</span><span class=\"special\">[</span><span class=\"number\">1</span><span class=\"special\">]</span> <span class=\"special\">==</span> <span class=\"number\">30240</span><span class=\"special\">);</span>\n<span class=\"keyword\">static_assert</span><span class=\"special\">(</span><span class=\"identifier\">h9</span><span class=\"special\">[</span><span class=\"number\">2</span><span class=\"special\">]</span> <span class=\"special\">==</span> <span class=\"number\">0</span><span class=\"special\">);</span>\n<span class=\"keyword\">static_assert</span><span class=\"special\">(</span><span class=\"identifier\">h9</span><span class=\"special\">[</span><span class=\"number\">3</span><span class=\"special\">]</span> <span class=\"special\">==</span> <span class=\"special\">-</span><span class=\"number\">80640</span><span class=\"special\">);</span>\n<span class=\"keyword\">static_assert</span><span class=\"special\">(</span><span class=\"identifier\">h9</span><span class=\"special\">[</span><span class=\"number\">4</span><span class=\"special\">]</span> <span class=\"special\">==</span> <span class=\"number\">0</span><span class=\"special\">);</span>\n<span class=\"keyword\">static_assert</span><span class=\"special\">(</span><span class=\"identifier\">h9</span><span class=\"special\">[</span><span class=\"number\">5</span><span class=\"special\">]</span> <span class=\"special\">==</span> <span class=\"number\">48384</span><span class=\"special\">);</span>\n<span class=\"keyword\">static_assert</span><span class=\"special\">(</span><span class=\"identifier\">h9</span><span class=\"special\">[</span><span class=\"number\">6</span><span class=\"special\">]</span> <span class=\"special\">==</span> <span class=\"number\">0</span><span class=\"special\">);</span>\n<span class=\"keyword\">static_assert</span><span class=\"special\">(</span><span class=\"identifier\">h9</span><span class=\"special\">[</span><span class=\"number\">7</span><span class=\"special\">]</span> <span class=\"special\">==</span> <span class=\"special\">-</span><span class=\"number\">9216</span><span class=\"special\">);</span>\n<span class=\"keyword\">static_assert</span><span class=\"special\">(</span><span class=\"identifier\">h9</span><span class=\"special\">[</span><span class=\"number\">8</span><span class=\"special\">]</span> <span class=\"special\">==</span> <span class=\"number\">0</span><span class=\"special\">);</span>\n<span class=\"keyword\">static_assert</span><span class=\"special\">(</span><span class=\"identifier\">h9</span><span class=\"special\">[</span><span class=\"number\">9</span><span class=\"special\">]</span> <span class=\"special\">==</span> <span class=\"number\">512</span><span class=\"special\">);</span>\n<span class=\"comment\">//</span>\n<span class=\"comment\">// Define an abscissa value to evaluate at:</span>\n<span class=\"keyword\">constexpr</span> <span class=\"identifier\">float128</span> <span class=\"identifier\">abscissa</span><span class=\"special\">(</span><span class=\"number\">0.5</span><span class=\"special\">);</span>\n<span class=\"comment\">//</span>\n<span class=\"comment\">// Evaluate H_9(0.5) using all constexpr arithmetic, and check that it has the expected result:</span>\n<span class=\"keyword\">static_assert</span><span class=\"special\">(</span><span class=\"identifier\">h9</span><span class=\"special\">(</span><span class=\"identifier\">abscissa</span><span class=\"special\">)</span> <span class=\"special\">==</span> <span class=\"number\">6481</span><span class=\"special\">);</span>\n</pre>\n<p>\n        See <a href=\"http://www.boost.org/doc/libs/release/libs/multiprecision/doc/html/../../example/constexpr_float_arithmetic_examples.cpp\" target=\"_top\">constexpr_float_arithmetic_examples.cpp</a>\n        for working code.\n      </p>\n<p>\n        Also since the coefficients to the Hermite polynomials are integers, we can\n        also generate the Hermite coefficients using (fixed precision) <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>s: see <a href=\"http://www.boost.org/doc/libs/release/libs/multiprecision/doc/html/../../test/constexpr_test_cpp_int_6.cpp\" target=\"_top\">constexpr_test_cpp_int_6.cpp</a>.\n      </p>\n<h6>\n<a name=\"boost_multiprecision.tut.lits.h3\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.tut.lits.factorial_constexpr\"></a></span><a class=\"link\" href=\"lits.html#boost_multiprecision.tut.lits.factorial_constexpr\"><code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code> Factorials</a>\n      </h6>\n<p>\n        We can also generate integer factorials in <a href=\"http://www.boost.org/doc/libs/release/libs/multiprecision/doc/html/../../test/constexpr_test_cpp_int_5.cpp\" target=\"_top\">constexpr_test_cpp_int_5.cpp</a>\n        like so:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">constexpr</span> <span class=\"identifier\">T</span> <span class=\"identifier\">factorial</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">T</span><span class=\"special\">&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">return</span> <span class=\"identifier\">a</span> <span class=\"special\">?</span> <span class=\"identifier\">a</span> <span class=\"special\">*</span> <span class=\"identifier\">factorial</span><span class=\"special\">(</span><span class=\"identifier\">a</span> <span class=\"special\">-</span> <span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"special\">:</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n        and validate the result:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">constexpr</span> <span class=\"identifier\">uint1024_t</span> <span class=\"identifier\">f1</span> <span class=\"special\">=</span> <span class=\"identifier\">factorial</span><span class=\"special\">(</span><span class=\"identifier\">uint1024_t</span><span class=\"special\">(</span><span class=\"number\">31</span><span class=\"special\">));</span> <span class=\"comment\">// Factorial 31!</span>\n<span class=\"keyword\">static_assert</span><span class=\"special\">(</span><span class=\"identifier\">f1</span> <span class=\"special\">==</span> <span class=\"number\">0</span><span class=\"identifier\">x1956ad0aae33a4560c5cd2c000000_cppi</span><span class=\"special\">);</span> <span class=\"comment\">// Expected result as an Boost.Multiprecision integer literal. </span>\n</pre>\n<h6>\n<a name=\"boost_multiprecision.tut.lits.h4\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.tut.lits.random_constexpr\"></a></span><a class=\"link\" href=\"lits.html#boost_multiprecision.tut.lits.random_constexpr\">Random\n        <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code> values</a>\n      </h6>\n<p>\n        Another example in <a href=\"http://www.boost.org/doc/libs/release/libs/multiprecision/doc/html/../../test/constexpr_test_cpp_int_7.cpp\" target=\"_top\">constexpr_test_cpp_int_7.cpp</a>\n        generates a fresh multiprecision random number each time the file is compiled.\n        It includes an C++ template implementation of the <a href=\"https://en.wikipedia.org/wiki/KISS_(algorithm)\" target=\"_top\">KISS\n        random number algorithm by George Marsaglia</a> for <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>\n        integers.\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">constexpr</span> <span class=\"identifier\">uint1024_t</span> <span class=\"identifier\">rand</span> <span class=\"special\">=</span> <span class=\"identifier\">nth_random_value</span><span class=\"special\">&lt;</span><span class=\"identifier\">uint1024_t</span><span class=\"special\">&gt;(</span><span class=\"number\">1000</span><span class=\"special\">);</span>\n<span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">hex</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">rand</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n</pre>\n<p>\n        See also the <a class=\"link\" href=\"random.html\" title=\"Generating Random Numbers\">random number\n        generation</a> section.\n      </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"primetest.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"import_export.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/misc/debug_adaptor.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>debug_adaptor</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../misc.html\" title=\"Miscellaneous Number Types.\">\n<link rel=\"prev\" href=\"logged_adaptor.html\" title=\"logged_adaptor\">\n<link rel=\"next\" href=\"visualizers.html\" title=\"Visual C++ Debugger Visualizers\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"logged_adaptor.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../misc.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"visualizers.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.misc.debug_adaptor\"></a><a class=\"link\" href=\"debug_adaptor.html\" title=\"debug_adaptor\">debug_adaptor</a>\n</h4></div></div></div>\n<p>\n          <code class=\"computeroutput\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">debug_adaptor</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">debug_adaptor</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Number</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">using</span> <span class=\"identifier\">debug_adaptor_t</span> <span class=\"special\">=</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">debug_adaptor</span><span class=\"special\">&lt;</span><span class=\"keyword\">typename</span> <span class=\"identifier\">Number</span><span class=\"special\">::</span><span class=\"identifier\">backend_type</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">Number</span><span class=\"special\">::</span><span class=\"identifier\">et</span><span class=\"special\">&gt;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n          The <code class=\"computeroutput\"><span class=\"identifier\">debug_adaptor</span></code> type\n          is used in conjunction with <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n          and some other backend type: it acts as a thin wrapper around some other\n          backend to class <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n          and intercepts all operations on that object storing the result as a string\n          within itself.\n        </p>\n<p>\n          This type provides <code class=\"computeroutput\"><span class=\"identifier\">numeric_limits</span></code>\n          support whenever the template argument Backend does so.\n        </p>\n<p>\n          This type is particularly useful when your debugger provides a good view\n          of <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">string</span></code>: when this is the case multiprecision\n          values can easily be inspected in the debugger by looking at the <code class=\"computeroutput\"><span class=\"identifier\">debug_value</span></code> member of <code class=\"computeroutput\"><span class=\"identifier\">debug_adaptor</span></code>.\n          The down side of this approach is that runtimes are much slower when using\n          this type. Set against that it can make debugging very much easier, certainly\n          much easier than sprinkling code with <code class=\"computeroutput\"><span class=\"identifier\">printf</span></code>\n          statements.\n        </p>\n<p>\n          When used in conjunction with the Visual C++ debugger visualisers, the\n          value of a multiprecision type that uses this backend is displayed in the\n          debugger just a <a href=\"https://en.cppreference.com/w/cpp/language/types\" target=\"_top\">fundamental\n          (built-in)</a> value would be, here we're inspecting a value of type\n          <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">debug_adaptor</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_dec_float</span><span class=\"special\">&lt;</span><span class=\"number\">50</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span>\n          <span class=\"special\">&gt;</span></code>:\n        </p>\n<p>\n          <span class=\"inlinemediaobject\"><img src=\"../../../../debugger1.png\"></span>\n        </p>\n<p>\n          Otherwise you will need to expand out the view and look at the \"debug_value\"\n          member:\n        </p>\n<p>\n          <span class=\"inlinemediaobject\"><img src=\"../../../../debugger2.png\"></span>\n        </p>\n<p>\n          It works for all the backend types equally too, here it is inspecting a\n          <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">debug_adaptor</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_rational</span><span class=\"special\">&gt;</span>\n          <span class=\"special\">&gt;</span></code>:\n        </p>\n<p>\n          <span class=\"inlinemediaobject\"><img src=\"../../../../debugger3.png\"></span>\n        </p>\n<p>\n          The template alias <code class=\"computeroutput\"><span class=\"identifier\">debug_adaptor_t</span></code>\n          is used as a shortcut for converting some other number type to it's debugged\n          equivalent, for example:\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">using</span> <span class=\"identifier\">mpfr_float_debug</span> <span class=\"special\">=</span> <span class=\"identifier\">debug_adaptor_t</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float</span><span class=\"special\">&gt;;</span>\n</pre>\n<p>\n          Defines <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float_debug</span></code>\n          to be the debugged equivalent of <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float</span></code>.\n        </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"logged_adaptor.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../misc.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"visualizers.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/misc/logged_adaptor.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>logged_adaptor</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../misc.html\" title=\"Miscellaneous Number Types.\">\n<link rel=\"prev\" href=\"../misc.html\" title=\"Miscellaneous Number Types.\">\n<link rel=\"next\" href=\"debug_adaptor.html\" title=\"debug_adaptor\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../misc.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../misc.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"debug_adaptor.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.misc.logged_adaptor\"></a><a class=\"link\" href=\"logged_adaptor.html\" title=\"logged_adaptor\">logged_adaptor</a>\n</h4></div></div></div>\n<p>\n          <code class=\"computeroutput\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">logged_adaptor</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">void</span> <span class=\"identifier\">log_postfix_event</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">Backend</span><span class=\"special\">&amp;</span> <span class=\"identifier\">result</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"keyword\">char</span><span class=\"special\">*</span> <span class=\"identifier\">event_description</span><span class=\"special\">);</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">void</span> <span class=\"identifier\">log_postfix_event</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">Backend</span><span class=\"special\">&amp;</span> <span class=\"identifier\">result1</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">T</span><span class=\"special\">&amp;</span> <span class=\"identifier\">result2</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"keyword\">char</span><span class=\"special\">*</span> <span class=\"identifier\">event_description</span><span class=\"special\">);</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">void</span> <span class=\"identifier\">log_prefix_event</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">Backend</span><span class=\"special\">&amp;</span> <span class=\"identifier\">arg1</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"keyword\">char</span><span class=\"special\">*</span> <span class=\"identifier\">event_description</span><span class=\"special\">);</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">void</span> <span class=\"identifier\">log_prefix_event</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">Backend</span><span class=\"special\">&amp;</span> <span class=\"identifier\">arg1</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">T</span><span class=\"special\">&amp;</span> <span class=\"identifier\">arg2</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"keyword\">char</span><span class=\"special\">*</span> <span class=\"identifier\">event_description</span><span class=\"special\">);</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">U</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">void</span> <span class=\"identifier\">log_prefix_event</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">Backend</span><span class=\"special\">&amp;</span> <span class=\"identifier\">arg1</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">T</span><span class=\"special\">&amp;</span> <span class=\"identifier\">arg2</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">U</span><span class=\"special\">&amp;</span> <span class=\"identifier\">arg3</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"keyword\">char</span><span class=\"special\">*</span> <span class=\"identifier\">event_description</span><span class=\"special\">);</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">U</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">V</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">void</span> <span class=\"identifier\">log_prefix_event</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">Backend</span><span class=\"special\">&amp;</span> <span class=\"identifier\">arg1</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">T</span><span class=\"special\">&amp;</span> <span class=\"identifier\">arg2</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">U</span><span class=\"special\">&amp;</span> <span class=\"identifier\">arg3</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">V</span><span class=\"special\">&amp;</span> <span class=\"identifier\">arg4</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"keyword\">char</span><span class=\"special\">*</span> <span class=\"identifier\">event_description</span><span class=\"special\">);</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">logged_adaptor</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Number</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">using</span> <span class=\"identifier\">logged_adaptor_t</span> <span class=\"special\">=</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">logged_adaptor</span><span class=\"special\">&lt;</span><span class=\"keyword\">typename</span> <span class=\"identifier\">Number</span><span class=\"special\">::</span><span class=\"identifier\">backend_type</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">Number</span><span class=\"special\">::</span><span class=\"identifier\">et</span><span class=\"special\">&gt;;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n          The <code class=\"computeroutput\"><span class=\"identifier\">logged_adaptor</span></code> type\n          is used in conjunction with <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n          and some other backend type: it acts as a thin wrapper around some other\n          backend to class <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n          and logs all the events that take place on that object. Before any number\n          operation takes place, it calls <code class=\"computeroutput\"><span class=\"identifier\">log_prefix_event</span></code>\n          with the arguments to the operation (up to 4), plus a string describing\n          the operation. Then after the operation it calls <code class=\"computeroutput\"><span class=\"identifier\">log_postfix_event</span></code>\n          with the result of the operation, plus a string describing the operation.\n          Optionally, <code class=\"computeroutput\"><span class=\"identifier\">log_postfix_event</span></code>\n          takes a second result argument: this occurs when the result of the operation\n          is not a <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>, for example\n          when <code class=\"computeroutput\"><span class=\"identifier\">fpclassify</span></code> is called,\n          <code class=\"computeroutput\"><span class=\"identifier\">log_postfix_event</span></code> will\n          be called with <code class=\"computeroutput\"><span class=\"identifier\">result1</span></code>\n          being the argument to the function, and <code class=\"computeroutput\"><span class=\"identifier\">result2</span></code>\n          being the integer result of <code class=\"computeroutput\"><span class=\"identifier\">fpclassify</span></code>.\n        </p>\n<p>\n          The default versions of <code class=\"computeroutput\"><span class=\"identifier\">log_prefix_event</span></code>\n          and <code class=\"computeroutput\"><span class=\"identifier\">log_postfix_event</span></code> do\n          nothing, it is therefore up to the user to overload these for the particular\n          backend being observed.\n        </p>\n<p>\n          This type provides <code class=\"computeroutput\"><span class=\"identifier\">numeric_limits</span></code>\n          support whenever the template argument Backend does so.\n        </p>\n<p>\n          Template alias <code class=\"computeroutput\"><span class=\"identifier\">logged_adaptor_t</span></code>\n          can be used as a shortcut for converting some instantiation of <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;&gt;</span></code>\n          to it's logged euqivalent.\n        </p>\n<p>\n          This type is particularly useful when combined with an interval number\n          type - in this case we can use <code class=\"computeroutput\"><span class=\"identifier\">log_postfix_event</span></code>\n          to monitor the error accumulated after each operation. We could either\n          set some kind of trap whenever the accumulated error exceeds some threshold,\n          or simply print out diagnostic information. Using this technique we can\n          quickly locate the cause of numerical instability in a particular routine.\n          The following example demonstrates this technique in a trivial algorithm\n          that deliberately introduces cancellation error:\n        </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">mpfi</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">logged_adaptor</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iomanip</span><span class=\"special\">&gt;</span>\n<span class=\"comment\">//</span>\n<span class=\"comment\">// Begin by overloading log_postfix_event so we can capture each arithmetic event as it happens:</span>\n<span class=\"comment\">//</span>\n<span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">D</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">inline</span> <span class=\"keyword\">void</span> <span class=\"identifier\">log_postfix_event</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">D</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">val</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"keyword\">char</span><span class=\"special\">*</span> <span class=\"identifier\">event_description</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"comment\">// Print out the (relative) diameter of the interval:</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n   <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">D</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">diam</span><span class=\"special\">;</span>\n   <span class=\"identifier\">mpfi_diam</span><span class=\"special\">(</span><span class=\"identifier\">diam</span><span class=\"special\">.</span><span class=\"identifier\">backend</span><span class=\"special\">().</span><span class=\"identifier\">data</span><span class=\"special\">(),</span> <span class=\"identifier\">val</span><span class=\"special\">.</span><span class=\"identifier\">data</span><span class=\"special\">());</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Diameter was \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">diam</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\" after operation: \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">event_description</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">D</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">T</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">inline</span> <span class=\"keyword\">void</span> <span class=\"identifier\">log_postfix_event</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">D</span><span class=\"special\">&gt;&amp;,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">T</span><span class=\"special\">&amp;,</span> <span class=\"keyword\">const</span> <span class=\"keyword\">char</span><span class=\"special\">*</span> <span class=\"identifier\">event_description</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"comment\">// This version is never called in this example.</span>\n<span class=\"special\">}</span>\n\n<span class=\"special\">}}</span>\n\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n   <span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">logged_adaptor</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfi_float_backend</span><span class=\"special\">&lt;</span><span class=\"number\">17</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">logged_type</span><span class=\"special\">;</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Test case deliberately introduces cancellation error, relative size of interval</span>\n   <span class=\"comment\">// gradually gets larger after each operation:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">logged_type</span> <span class=\"identifier\">a</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n   <span class=\"identifier\">a</span> <span class=\"special\">/=</span> <span class=\"number\">10</span><span class=\"special\">;</span>\n\n   <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;</span> <span class=\"number\">13</span><span class=\"special\">;</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n   <span class=\"special\">{</span>\n      <span class=\"identifier\">logged_type</span> <span class=\"identifier\">b</span> <span class=\"special\">=</span> <span class=\"identifier\">a</span> <span class=\"special\">*</span> <span class=\"number\">9</span><span class=\"special\">;</span>\n      <span class=\"identifier\">b</span> <span class=\"special\">/=</span> <span class=\"number\">10</span><span class=\"special\">;</span>\n      <span class=\"identifier\">a</span> <span class=\"special\">-=</span> <span class=\"identifier\">b</span><span class=\"special\">;</span>\n   <span class=\"special\">}</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Final value was: \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">a</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n          When we examine program output we can clearly see that the diameter of\n          the interval increases after each subtraction:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"identifier\">nan</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"identifier\">Default</span> <span class=\"identifier\">construct</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">0</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"identifier\">Assignment</span> <span class=\"identifier\">from</span> <span class=\"identifier\">arithmetic</span> <span class=\"identifier\">type</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">4.33681e-18</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">/=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"identifier\">nan</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"identifier\">Default</span> <span class=\"identifier\">construct</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">7.70988e-18</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">*</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">9.63735e-18</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">/=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">1.30104e-16</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">-=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"identifier\">nan</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"identifier\">Default</span> <span class=\"identifier\">construct</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">1.30104e-16</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">*</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">1.38537e-16</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">/=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">2.54788e-15</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">-=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"identifier\">nan</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"identifier\">Default</span> <span class=\"identifier\">construct</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">2.54788e-15</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">*</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">2.54863e-15</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">/=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">4.84164e-14</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">-=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"identifier\">nan</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"identifier\">Default</span> <span class=\"identifier\">construct</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">4.84164e-14</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">*</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">4.84221e-14</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">/=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">9.19962e-13</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">-=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"identifier\">nan</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"identifier\">Default</span> <span class=\"identifier\">construct</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">9.19962e-13</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">*</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">9.19966e-13</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">/=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">1.74793e-11</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">-=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"identifier\">nan</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"identifier\">Default</span> <span class=\"identifier\">construct</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">1.74793e-11</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">*</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">1.74793e-11</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">/=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">3.32107e-10</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">-=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"identifier\">nan</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"identifier\">Default</span> <span class=\"identifier\">construct</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">3.32107e-10</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">*</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">3.32107e-10</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">/=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">6.31003e-09</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">-=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"identifier\">nan</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"identifier\">Default</span> <span class=\"identifier\">construct</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">6.31003e-09</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">*</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">6.31003e-09</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">/=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">1.19891e-07</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">-=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"identifier\">nan</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"identifier\">Default</span> <span class=\"identifier\">construct</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">1.19891e-07</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">*</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">1.19891e-07</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">/=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">2.27792e-06</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">-=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"identifier\">nan</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"identifier\">Default</span> <span class=\"identifier\">construct</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">2.27792e-06</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">*</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">2.27792e-06</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">/=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">4.32805e-05</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">-=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"identifier\">nan</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"identifier\">Default</span> <span class=\"identifier\">construct</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">4.32805e-05</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">*</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">4.32805e-05</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">/=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">0.00082233</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">-=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"identifier\">nan</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"identifier\">Default</span> <span class=\"identifier\">construct</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">0.00082233</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">*</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">0.00082233</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">/=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">0.0156243</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">-=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"identifier\">nan</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"identifier\">Default</span> <span class=\"identifier\">construct</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">0.0156243</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">*</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">0.0156243</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">/=</span>\n<span class=\"identifier\">Diameter</span> <span class=\"identifier\">was</span> <span class=\"number\">0.296861</span> <span class=\"identifier\">after</span> <span class=\"identifier\">operation</span><span class=\"special\">:</span> <span class=\"special\">-=</span>\n<span class=\"identifier\">Final</span> <span class=\"identifier\">value</span> <span class=\"identifier\">was</span><span class=\"special\">:</span> <span class=\"special\">{</span><span class=\"number\">8.51569e-15</span><span class=\"special\">,</span><span class=\"number\">1.14843e-14</span><span class=\"special\">}</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../misc.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../misc.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"debug_adaptor.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/misc/visualizers.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Visual C++ Debugger Visualizers</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../misc.html\" title=\"Miscellaneous Number Types.\">\n<link rel=\"prev\" href=\"debug_adaptor.html\" title=\"debug_adaptor\">\n<link rel=\"next\" href=\"../conversions.html\" title=\"Constructing and Interconverting Between Number Types\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"debug_adaptor.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../misc.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../conversions.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.misc.visualizers\"></a><a class=\"link\" href=\"visualizers.html\" title=\"Visual C++ Debugger Visualizers\">Visual C++\n        Debugger Visualizers</a>\n</h4></div></div></div>\n<div class=\"important\"><table border=\"0\" summary=\"Important\">\n<tr>\n<td rowspan=\"2\" align=\"center\" valign=\"top\" width=\"25\"><img alt=\"[Important]\" src=\"../../../../../../../doc/src/images/important.png\"></td>\n<th align=\"left\">Important</th>\n</tr>\n<tr><td align=\"left\" valign=\"top\"><p>\n            This section is seriously out of date compared to recent Visual C++ releases.\n          </p></td></tr>\n</table></div>\n<p>\n          Let's face it debugger multiprecision numbers is hard - simply because\n          we can't easily inspect the value of the numbers. Visual C++ provides a\n          partial solution in the shape of \"visualizers\" which provide\n          improved views of complex data structures, these visualizers need to be\n          added to the <code class=\"computeroutput\"><span class=\"special\">[</span><span class=\"identifier\">Visualizer</span><span class=\"special\">]</span></code> section of <code class=\"computeroutput\"><span class=\"identifier\">autoexp</span><span class=\"special\">.</span><span class=\"identifier\">dat</span></code>\n          located in the <code class=\"computeroutput\"><span class=\"identifier\">Common7</span><span class=\"special\">/</span><span class=\"identifier\">Packages</span><span class=\"special\">/</span><span class=\"identifier\">Debugger</span></code>\n          directory of your Visual Studio installation. The actual visualizer code\n          is in the sandbox <a href=\"https://svn.boost.org/svn/boost/sandbox/boost_docs/subprojects/DebuggerVisualizers/multiprecision.vis.txt\" target=\"_top\">here</a>\n          - just cut and paste the code into your <code class=\"computeroutput\"><span class=\"identifier\">autoexp</span><span class=\"special\">.</span><span class=\"identifier\">dat</span></code>\n          file.\n        </p>\n<div class=\"note\"><table border=\"0\" summary=\"Note\">\n<tr>\n<td rowspan=\"2\" align=\"center\" valign=\"top\" width=\"25\"><img alt=\"[Note]\" src=\"../../../../../../../doc/src/images/note.png\"></td>\n<th align=\"left\">Note</th>\n</tr>\n<tr><td align=\"left\" valign=\"top\"><p>\n            These visualizers have only been tested with VC10, also given the ability\n            of buggy visualizers to crash your Visual C++ debugger, make sure you\n            back up <code class=\"computeroutput\"><span class=\"identifier\">autoexp</span><span class=\"special\">.</span><span class=\"identifier\">dat</span></code> file before using these!!\n          </p></td></tr>\n</table></div>\n<p>\n          The first visualizer provides improved views of <code class=\"computeroutput\"><span class=\"identifier\">debug_adaptor</span></code>:\n        </p>\n<p>\n          <span class=\"inlinemediaobject\"><img src=\"../../../../debugger1.png\"></span>\n        </p>\n<p>\n          The next visualizer provides improved views of cpp_int: small numbers are\n          displayed as actual values, while larger numbers are displayed as an array\n          of hexadecimal parts, with the most significant part first.\n        </p>\n<p>\n          Here's what it looks like for small values:\n        </p>\n<p>\n          <span class=\"inlinemediaobject\"><img src=\"../../../../debugger4.png\"></span>\n        </p>\n<p>\n          And for larger values:\n        </p>\n<p>\n          <span class=\"inlinemediaobject\"><img src=\"../../../../debugger5.png\"></span>\n        </p>\n<p>\n          There is also a <code class=\"computeroutput\"><span class=\"special\">~</span><span class=\"identifier\">raw</span></code>\n          child member that lets you see the actual members of the class:\n        </p>\n<p>\n          <span class=\"inlinemediaobject\"><img src=\"../../../../debugger6.png\"></span>\n        </p>\n<p>\n          The visualizer for <code class=\"computeroutput\"><span class=\"identifier\">cpp_dec_float</span></code>\n          shows the first few digits of the value in the preview field, and the full\n          array of digits when you expand the view. As before the <code class=\"computeroutput\"><span class=\"special\">~</span><span class=\"identifier\">raw</span></code> child gives you access to the actual\n          data members:\n        </p>\n<p>\n          <span class=\"inlinemediaobject\"><img src=\"../../../../debugger7.png\"></span>\n        </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"debug_adaptor.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../misc.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../conversions.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/misc.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Miscellaneous Number Types.</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"rational/rational_adaptor.html\" title=\"rational_adaptor\">\n<link rel=\"next\" href=\"misc/logged_adaptor.html\" title=\"logged_adaptor\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"rational/rational_adaptor.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"misc/logged_adaptor.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.misc\"></a><a class=\"link\" href=\"misc.html\" title=\"Miscellaneous Number Types.\">Miscellaneous Number Types.</a>\n</h3></div></div></div>\n<div class=\"toc\"><dl class=\"toc\">\n<dt><span class=\"section\"><a href=\"misc/logged_adaptor.html\">logged_adaptor</a></span></dt>\n<dt><span class=\"section\"><a href=\"misc/debug_adaptor.html\">debug_adaptor</a></span></dt>\n<dt><span class=\"section\"><a href=\"misc/visualizers.html\">Visual C++\n        Debugger Visualizers</a></span></dt>\n</dl></div>\n<p>\n        Backend types listed in this section are predominantly designed to aid debugging.\n      </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"rational/rational_adaptor.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"misc/logged_adaptor.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/mixed.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Mixed Precision Arithmetic</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"rounding.html\" title=\"Rounding Rules for Conversions\">\n<link rel=\"next\" href=\"variable.html\" title=\"Variable Precision Arithmetic\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"rounding.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"variable.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.mixed\"></a><a class=\"link\" href=\"mixed.html\" title=\"Mixed Precision Arithmetic\">Mixed Precision Arithmetic</a>\n</h3></div></div></div>\n<p>\n        Mixed precision arithmetic is fully supported by the library.\n      </p>\n<p>\n        There are three different forms:\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Where the operands are of different precision or types.\n          </li>\n<li class=\"listitem\">\n            Where the operands are of the same type and precision, but yield a higher\n            precision result.\n          </li>\n<li class=\"listitem\">\n            Where the operands or result are different but equivalent types (for\n            example types which differ only in their memory management).\n          </li>\n</ul></div>\n<h5>\n<a name=\"boost_multiprecision.tut.mixed.h0\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.tut.mixed.mixing_operands_of_differing_typ\"></a></span><a class=\"link\" href=\"mixed.html#boost_multiprecision.tut.mixed.mixing_operands_of_differing_typ\">Mixing\n        Operands of Differing Types or Precision</a>\n      </h5>\n<p>\n        If the arguments to a binary operator are of different types or precision,\n        then the operation is allowed as long as there is an unambiguous implicit\n        conversion from one argument type to the other. In all cases the arithmetic\n        is performed \"as if\" the lower precision type is promoted to the\n        higher precision type before applying the operator. However, particular backends\n        may optimise this and avoid actually creating a temporary if they are able\n        to do so.\n      </p>\n<p>\n        For example:\n      </p>\n<pre class=\"programlisting\"><span class=\"identifier\">mpfr_float_50</span>         <span class=\"identifier\">a</span><span class=\"special\">(</span><span class=\"number\">2</span><span class=\"special\">),</span> <span class=\"identifier\">b</span><span class=\"special\">;</span>\n<span class=\"identifier\">mpfr_float_100</span>        <span class=\"identifier\">c</span><span class=\"special\">(</span><span class=\"number\">3</span><span class=\"special\">),</span> <span class=\"identifier\">d</span><span class=\"special\">;</span>\n<span class=\"identifier\">static_mpfr_float_50</span>  <span class=\"identifier\">e</span><span class=\"special\">(</span><span class=\"number\">5</span><span class=\"special\">),</span> <span class=\"identifier\">f</span><span class=\"special\">;</span>\n<span class=\"identifier\">mpz_int</span>               <span class=\"identifier\">i</span><span class=\"special\">(</span><span class=\"number\">20</span><span class=\"special\">);</span>\n\n<span class=\"identifier\">d</span> <span class=\"special\">=</span> <span class=\"identifier\">a</span> <span class=\"special\">*</span> <span class=\"identifier\">c</span><span class=\"special\">;</span>  <span class=\"comment\">// OK, result of operand is an mpfr_float_100.</span>\n<span class=\"identifier\">b</span> <span class=\"special\">=</span> <span class=\"identifier\">a</span> <span class=\"special\">*</span> <span class=\"identifier\">c</span><span class=\"special\">;</span>  <span class=\"comment\">// Error, can't convert the result to an mpfr_float_50 as it will lose digits.</span>\n<span class=\"identifier\">f</span> <span class=\"special\">=</span> <span class=\"identifier\">e</span> <span class=\"special\">*</span> <span class=\"identifier\">i</span><span class=\"special\">;</span>  <span class=\"comment\">// OK, unambiguous conversion from mpz_int to static_mpfr_float_50</span>\n</pre>\n<h5>\n<a name=\"boost_multiprecision.tut.mixed.h1\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.tut.mixed.operands_of_the_same_precision\"></a></span><a class=\"link\" href=\"mixed.html#boost_multiprecision.tut.mixed.operands_of_the_same_precision\">Operands\n        of the Same Precision</a>\n      </h5>\n<p>\n        Sometimes you want to apply an operator to two arguments of the same precision\n        in such a way as to obtain a result of higher precision. The most common\n        situation occurs with fixed precision integers, where you want to multiply\n        two N-bit numbers to obtain a 2N-bit result. This is supported in this library\n        by the following free functions:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">ResultType</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Source1</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Source2</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">ResultType</span><span class=\"special\">&amp;</span> <span class=\"identifier\">add</span><span class=\"special\">(</span><span class=\"identifier\">ResultType</span><span class=\"special\">&amp;</span> <span class=\"identifier\">result</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Source1</span><span class=\"special\">&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Source2</span><span class=\"special\">&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">);</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">ResultType</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Source1</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Source2</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">ResultType</span><span class=\"special\">&amp;</span> <span class=\"identifier\">subtract</span><span class=\"special\">(</span><span class=\"identifier\">ResultType</span><span class=\"special\">&amp;</span> <span class=\"identifier\">result</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Source1</span><span class=\"special\">&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Source2</span><span class=\"special\">&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">);</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">ResultType</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Source1</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Source2</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">ResultType</span><span class=\"special\">&amp;</span> <span class=\"identifier\">multiply</span><span class=\"special\">(</span><span class=\"identifier\">ResultType</span><span class=\"special\">&amp;</span> <span class=\"identifier\">result</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Source1</span><span class=\"special\">&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">Source2</span><span class=\"special\">&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">);</span>\n</pre>\n<p>\n        These functions apply the named operator to the arguments <span class=\"emphasis\"><em>a</em></span>\n        and <span class=\"emphasis\"><em>b</em></span> and store the result in <span class=\"emphasis\"><em>result</em></span>,\n        returning <span class=\"emphasis\"><em>result</em></span>. In all cases they behave \"as\n        if\" arguments <span class=\"emphasis\"><em>a</em></span> and <span class=\"emphasis\"><em>b</em></span> were\n        first promoted to type <code class=\"computeroutput\"><span class=\"identifier\">ResultType</span></code>\n        before applying the operator, though particular backends may well avoid that\n        step by way of an optimization.\n      </p>\n<p>\n        The type <code class=\"computeroutput\"><span class=\"identifier\">ResultType</span></code> must\n        be an instance of class <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>,\n        and the types <code class=\"computeroutput\"><span class=\"identifier\">Source1</span></code> and\n        <code class=\"computeroutput\"><span class=\"identifier\">Source2</span></code> may be either instances\n        of class <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> or native\n        integer types. The latter is an optimization that allows arithmetic to be\n        performed on native integer types producing an extended precision result.\n      </p>\n<p>\n        For example:\n      </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_int</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">uint64_t</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">uint64_t</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max</span><span class=\"special\">)();</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">uint64_t</span> <span class=\"identifier\">j</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">uint128_t</span> <span class=\"identifier\">ui128</span><span class=\"special\">;</span>\n   <span class=\"identifier\">uint256_t</span> <span class=\"identifier\">ui256</span><span class=\"special\">;</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Start by performing arithmetic on 64-bit integers to yield 128-bit results:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">hex</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">showbase</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">hex</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">showbase</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">add</span><span class=\"special\">(</span><span class=\"identifier\">ui128</span><span class=\"special\">,</span> <span class=\"identifier\">i</span><span class=\"special\">,</span> <span class=\"identifier\">j</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">hex</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">showbase</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">multiply</span><span class=\"special\">(</span><span class=\"identifier\">ui128</span><span class=\"special\">,</span> <span class=\"identifier\">i</span><span class=\"special\">,</span> <span class=\"identifier\">i</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// The try squaring a 128-bit integer to yield a 256-bit result:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">ui128</span> <span class=\"special\">=</span> <span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">uint128_t</span><span class=\"special\">&gt;::</span><span class=\"identifier\">max</span><span class=\"special\">)();</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">hex</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">showbase</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">multiply</span><span class=\"special\">(</span><span class=\"identifier\">ui256</span><span class=\"special\">,</span> <span class=\"identifier\">ui128</span><span class=\"special\">,</span> <span class=\"identifier\">ui128</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n        Produces the output:\n      </p>\n<pre class=\"programlisting\"><span class=\"number\">0</span><span class=\"identifier\">xffffffffffffffff</span>\n<span class=\"number\">0</span><span class=\"identifier\">x10000000000000000</span>\n<span class=\"number\">0</span><span class=\"identifier\">xFFFFFFFFFFFFFFFE0000000000000001</span>\n<span class=\"number\">0</span><span class=\"identifier\">xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00000000000000000000000000000001</span>\n</pre>\n<h5>\n<a name=\"boost_multiprecision.tut.mixed.h2\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.tut.mixed.mixing_different_but_equivalent_\"></a></span><a class=\"link\" href=\"mixed.html#boost_multiprecision.tut.mixed.mixing_different_but_equivalent_\">Mixing\n        different, but \"equivalent\" types</a>\n      </h5>\n<p>\n        Ordinarily, mixing types of the same precision will produce a compiler error\n        since there is no unambiguous result type. However, there is a traits class:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">NumberType1</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">NumberType2</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">struct</span> <span class=\"identifier\">is_equivalent_number_type</span><span class=\"special\">;</span>\n\n<span class=\"special\">}</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n        When it's <code class=\"computeroutput\"><span class=\"identifier\">value</span></code> const-member\n        value is <code class=\"computeroutput\"><span class=\"keyword\">true</span></code> then the library\n        will treat the types <code class=\"computeroutput\"><span class=\"identifier\">NumberType1</span></code>\n        and <code class=\"computeroutput\"><span class=\"identifier\">NumberType2</span></code> as if they\n        are interchangeable. This is typically used to optimise memory management\n        by using two types with differing memory allocation strategies for different\n        roles. Typically, we would be using a type with dymanic memory allocation\n        and a minimal memory footprint for the main storage type (think large arrays\n        or matrices), but a type with internal storage and no dynamic allocation\n        (but a larger memory footprint) for a few select calculations.\n      </p>\n<p>\n        There are three backends that define this trait by default:\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            <a class=\"link\" href=\"ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>'s,\n            provided the two types differ only in their internal cache size.\n          </li>\n<li class=\"listitem\">\n            <a class=\"link\" href=\"floats/cpp_bin_float.html\" title=\"cpp_bin_float\">cpp_bin_float</a>'s\n            provided they are of the same precision.\n          </li>\n<li class=\"listitem\">\n            <a class=\"link\" href=\"floats/mpfr_float.html\" title=\"mpfr_float\">mpfr_float</a>'s\n            provided they are of the same precision.\n          </li>\n</ul></div>\n<p>\n        In addition, while this feature can be used with expression templates turned\n        off, this feature minimises temporaries and hence memory allocations when\n        expression template are turned on.\n      </p>\n<p>\n        By way of an example, consider the dot product of two vectors of <a class=\"link\" href=\"ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>'s,\n        our first, fairly trivial implementation might look like this:\n      </p>\n<pre class=\"programlisting\"><span class=\"identifier\">cpp_int</span> <span class=\"identifier\">dot_product_1</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">vector</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">v1</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">vector</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">v2</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">if</span> <span class=\"special\">(</span><span class=\"identifier\">v1</span><span class=\"special\">.</span><span class=\"identifier\">size</span><span class=\"special\">()</span> <span class=\"special\">!=</span> <span class=\"identifier\">v2</span><span class=\"special\">.</span><span class=\"identifier\">size</span><span class=\"special\">())</span>\n      <span class=\"keyword\">throw</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">domain_error</span><span class=\"special\">(</span><span class=\"string\">\"Mismatched arguments\"</span><span class=\"special\">);</span>\n\n   <span class=\"identifier\">cpp_int</span> <span class=\"identifier\">result</span><span class=\"special\">;</span>\n   <span class=\"keyword\">for</span> <span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;</span> <span class=\"identifier\">v1</span><span class=\"special\">.</span><span class=\"identifier\">size</span><span class=\"special\">();</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n      <span class=\"identifier\">result</span> <span class=\"special\">+=</span> <span class=\"identifier\">v1</span><span class=\"special\">[</span><span class=\"identifier\">i</span><span class=\"special\">]</span> <span class=\"special\">*</span> <span class=\"identifier\">v2</span><span class=\"special\">[</span><span class=\"identifier\">i</span><span class=\"special\">];</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Named-return value optimisation (even better than a move):</span>\n   <span class=\"comment\">//</span>\n   <span class=\"keyword\">return</span> <span class=\"identifier\">result</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n        However, in order to reduce the need for memory allocations when constructing\n        the temporaries needed for the multiply-and-add operations, we could use\n        an equivalent type with a larger internal cache like this:\n      </p>\n<pre class=\"programlisting\"><span class=\"identifier\">cpp_int</span> <span class=\"identifier\">dot_product_2</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">vector</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">v1</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">vector</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">v2</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">if</span> <span class=\"special\">(</span><span class=\"identifier\">v1</span><span class=\"special\">.</span><span class=\"identifier\">size</span><span class=\"special\">()</span> <span class=\"special\">!=</span> <span class=\"identifier\">v2</span><span class=\"special\">.</span><span class=\"identifier\">size</span><span class=\"special\">())</span>\n      <span class=\"keyword\">throw</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">domain_error</span><span class=\"special\">(</span><span class=\"string\">\"Mismatched arguments\"</span><span class=\"special\">);</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// If we know that most of our data is of a certain range of values, then we can use a cpp_int type</span>\n   <span class=\"comment\">// with an internal cache large enough to *probably* not require an allocation:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;</span><span class=\"number\">1024</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">result</span><span class=\"special\">;</span>\n   <span class=\"keyword\">for</span> <span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;</span> <span class=\"identifier\">v1</span><span class=\"special\">.</span><span class=\"identifier\">size</span><span class=\"special\">();</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n      <span class=\"identifier\">result</span> <span class=\"special\">+=</span> <span class=\"identifier\">v1</span><span class=\"special\">[</span><span class=\"identifier\">i</span><span class=\"special\">]</span> <span class=\"special\">*</span> <span class=\"identifier\">v2</span><span class=\"special\">[</span><span class=\"identifier\">i</span><span class=\"special\">];</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// We can't rely on the named-return-value optimisation here, since the variable being returned</span>\n   <span class=\"comment\">// is a different type to the return value.  However, since these are \"equivalent\" types we</span>\n   <span class=\"comment\">// can move the result to the return value and get all the expected move-optimisations should</span>\n   <span class=\"comment\">// variable result have dynamically allocated:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"keyword\">return</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">move</span><span class=\"special\">(</span><span class=\"identifier\">result</span><span class=\"special\">);</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n        Before we compare performance though, there is one other obvious thing we\n        could try. By simply declaring a variable for the result of the intermediate\n        multiplications, and reusing that variable each time through the loop, we\n        might also expect to greatly reduce the number of allocations required.\n      </p>\n<pre class=\"programlisting\"><span class=\"identifier\">cpp_int</span> <span class=\"identifier\">dot_product_3</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">vector</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">v1</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">vector</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">v2</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">if</span> <span class=\"special\">(</span><span class=\"identifier\">v1</span><span class=\"special\">.</span><span class=\"identifier\">size</span><span class=\"special\">()</span> <span class=\"special\">!=</span> <span class=\"identifier\">v2</span><span class=\"special\">.</span><span class=\"identifier\">size</span><span class=\"special\">())</span>\n      <span class=\"keyword\">throw</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">domain_error</span><span class=\"special\">(</span><span class=\"string\">\"Mismatched arguments\"</span><span class=\"special\">);</span>\n\n   <span class=\"identifier\">cpp_int</span> <span class=\"identifier\">result</span><span class=\"special\">,</span> <span class=\"identifier\">term</span><span class=\"special\">;</span>\n   <span class=\"keyword\">for</span> <span class=\"special\">(</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">size_t</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;</span> <span class=\"identifier\">v1</span><span class=\"special\">.</span><span class=\"identifier\">size</span><span class=\"special\">();</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n   <span class=\"special\">{</span>\n      <span class=\"comment\">//</span>\n      <span class=\"comment\">// Re-use the same variable for the result of the multiplications, rather than rely on </span>\n      <span class=\"comment\">// an internally generated temporary.  Depending on the input data, this may allocate</span>\n      <span class=\"comment\">// a few times depending how soon in the input vector's we encounter the largest values.</span>\n      <span class=\"comment\">// In the best case though, or for fairly uniformly sized input data, we will allocate </span>\n      <span class=\"comment\">// only once:</span>\n      <span class=\"comment\">//</span>\n      <span class=\"identifier\">term</span> <span class=\"special\">=</span> <span class=\"identifier\">v1</span><span class=\"special\">[</span><span class=\"identifier\">i</span><span class=\"special\">]</span> <span class=\"special\">*</span> <span class=\"identifier\">v2</span><span class=\"special\">[</span><span class=\"identifier\">i</span><span class=\"special\">];</span>\n      <span class=\"identifier\">result</span> <span class=\"special\">+=</span> <span class=\"identifier\">term</span><span class=\"special\">;</span>\n   <span class=\"special\">}</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Named-return value optimisation (even better than a move):</span>\n   <span class=\"comment\">//</span>\n   <span class=\"keyword\">return</span> <span class=\"identifier\">result</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n        We'll begin by comparing how many actual allocations were required to calculate\n        the dot product of 1000 value vectors for random data with various bit counts:\n      </p>\n<div class=\"informaltable\"><table class=\"table\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Bit Count\n                </p>\n              </th>\n<th>\n                <p>\n                  Allocations Count Version 1\n                </p>\n              </th>\n<th>\n                <p>\n                  Allocations Count Version 2\n                </p>\n              </th>\n<th>\n                <p>\n                  Allocations Count Version 3\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  32\n                </p>\n              </td>\n<td>\n                <p>\n                  1<a href=\"#ftn.boost_multiprecision.tut.mixed.f0\" class=\"footnote\" name=\"boost_multiprecision.tut.mixed.f0\"><sup class=\"footnote\">[1]</sup></a>\n                </p>\n              </td>\n<td>\n                <p>\n                  0\n                </p>\n              </td>\n<td>\n                <p>\n                  0\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  64\n                </p>\n              </td>\n<td>\n                <p>\n                  1001\n                </p>\n              </td>\n<td>\n                <p>\n                  1<a href=\"#ftn.boost_multiprecision.tut.mixed.f1\" class=\"footnote\" name=\"boost_multiprecision.tut.mixed.f1\"><sup class=\"footnote\">[2]</sup></a>\n                </p>\n              </td>\n<td>\n                <p>\n                  1\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  128\n                </p>\n              </td>\n<td>\n                <p>\n                  1002\n                </p>\n              </td>\n<td>\n                <p>\n                  1\n                </p>\n              </td>\n<td>\n                <p>\n                  2\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  256\n                </p>\n              </td>\n<td>\n                <p>\n                  1002\n                </p>\n              </td>\n<td>\n                <p>\n                  1\n                </p>\n              </td>\n<td>\n                <p>\n                  3<a href=\"#ftn.boost_multiprecision.tut.mixed.f2\" class=\"footnote\" name=\"boost_multiprecision.tut.mixed.f2\"><sup class=\"footnote\">[3]</sup></a>\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  512\n                </p>\n              </td>\n<td>\n                <p>\n                  1002\n                </p>\n              </td>\n<td>\n                <p>\n                  1\n                </p>\n              </td>\n<td>\n                <p>\n                  3\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  1024\n                </p>\n              </td>\n<td>\n                <p>\n                  1002\n                </p>\n              </td>\n<td>\n                <p>\n                  1001<a href=\"#ftn.boost_multiprecision.tut.mixed.f3\" class=\"footnote\" name=\"boost_multiprecision.tut.mixed.f3\"><sup class=\"footnote\">[4]</sup></a>\n                </p>\n              </td>\n<td>\n                <p>\n                  3\n                </p>\n              </td>\n</tr>\n</tbody>\n<tbody class=\"footnotes\"><tr><td colspan=\"4\">\n<div id=\"ftn.boost_multiprecision.tut.mixed.f0\" class=\"footnote\"><p><a href=\"#boost_multiprecision.tut.mixed.f0\" class=\"para\"><sup class=\"para\">[1] </sup></a>\n                    Here everything fits within <a class=\"link\" href=\"ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>'s\n                    default internal cache, so no allocation are required.\n                  </p></div>\n<div id=\"ftn.boost_multiprecision.tut.mixed.f1\" class=\"footnote\"><p><a href=\"#boost_multiprecision.tut.mixed.f1\" class=\"para\"><sup class=\"para\">[2] </sup></a>\n                    A single allocation for the return value.\n                  </p></div>\n<div id=\"ftn.boost_multiprecision.tut.mixed.f2\" class=\"footnote\"><p><a href=\"#boost_multiprecision.tut.mixed.f2\" class=\"para\"><sup class=\"para\">[3] </sup></a>\n                    Here the input data is such that more than one allocation is\n                    required for the temporary.\n                  </p></div>\n<div id=\"ftn.boost_multiprecision.tut.mixed.f3\" class=\"footnote\"><p><a href=\"#boost_multiprecision.tut.mixed.f3\" class=\"para\"><sup class=\"para\">[4] </sup></a>\n                    At this point we exceed the internal cache of our internal calculation\n                    type.\n                  </p></div>\n</td></tr></tbody>\n</table></div>\n<p>\n        Timings for the three methods are as follows (MSVC-16.8.0, x64):\n      </p>\n<div class=\"informaltable\"><table class=\"table\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Bit Count\n                </p>\n              </th>\n<th>\n                <p>\n                  time/ms Version 1\n                </p>\n              </th>\n<th>\n                <p>\n                  time/ms Version 2\n                </p>\n              </th>\n<th>\n                <p>\n                  time/ms Version 3\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  32\n                </p>\n              </td>\n<td>\n                <p>\n                  0.021\n                </p>\n              </td>\n<td>\n                <p>\n                  0.021\n                </p>\n              </td>\n<td>\n                <p>\n                  0.021\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  64\n                </p>\n              </td>\n<td>\n                <p>\n                  0.032\n                </p>\n              </td>\n<td>\n                <p>\n                  0.032\n                </p>\n              </td>\n<td>\n                <p>\n                  0.029\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  128\n                </p>\n              </td>\n<td>\n                <p>\n                  0.099\n                </p>\n              </td>\n<td>\n                <p>\n                  0.041\n                </p>\n              </td>\n<td>\n                <p>\n                  0.041\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  256\n                </p>\n              </td>\n<td>\n                <p>\n                  0.154\n                </p>\n              </td>\n<td>\n                <p>\n                  0.091\n                </p>\n              </td>\n<td>\n                <p>\n                  0.094\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  512\n                </p>\n              </td>\n<td>\n                <p>\n                  0.323\n                </p>\n              </td>\n<td>\n                <p>\n                  0.270\n                </p>\n              </td>\n<td>\n                <p>\n                  0.269\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  1024\n                </p>\n              </td>\n<td>\n                <p>\n                  0.998\n                </p>\n              </td>\n<td>\n                <p>\n                  0.995\n                </p>\n              </td>\n<td>\n                <p>\n                  0.949\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n<p>\n        As you can see, there is a sweet spot for middling-sized integers where we\n        gain: if the values are small, then <a class=\"link\" href=\"ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>'s\n        own internal cache is large enough anyway, and no allocation occur. Conversely,\n        if the values are sufficiently large, then the cost of the actual arithmetic\n        dwarfs the memory allocation time. In this particular case, carefully writing\n        the code (version 3) is clearly at least as good as using a separate type\n        with a larger cache. However, there may be times when it's not practical\n        to re-write existing code, purely to optimise it for the multiprecision use\n        case.\n      </p>\n<p>\n        A typical example where we can't rewrite our code to avoid unnecessary allocations,\n        occurs when we're calling an external routine. For example the arc length\n        of an ellipse with radii <span class=\"emphasis\"><em>a</em></span> and <span class=\"emphasis\"><em>b</em></span>\n        is given by:\n      </p>\n<pre class=\"programlisting\">L(a, b) = 4aE(k)</pre>\n<p>\n        with:\n      </p>\n<pre class=\"programlisting\">k = √(1 - b<sup>2</sup>/a<sup>2</sup>)</pre>\n<p>\n        where <span class=\"emphasis\"><em>E(k)</em></span> is the complete elliptic integral of the\n        second kind, which is available as a template function <code class=\"computeroutput\"><span class=\"identifier\">ellint_2</span></code>\n        in Boost.Math.\n      </p>\n<p>\n        Naively, we might implement this for use with <a class=\"link\" href=\"floats/mpfr_float.html\" title=\"mpfr_float\">mpfr_float</a>\n        like this:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">N</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">elliptic_arc_length_1</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">k</span> <span class=\"special\">=</span> <span class=\"identifier\">sqrt</span><span class=\"special\">(</span><span class=\"number\">1</span> <span class=\"special\">-</span> <span class=\"identifier\">b</span> <span class=\"special\">*</span> <span class=\"identifier\">b</span> <span class=\"special\">/</span> <span class=\"special\">(</span><span class=\"identifier\">a</span> <span class=\"special\">*</span> <span class=\"identifier\">a</span><span class=\"special\">));</span>\n   <span class=\"keyword\">return</span> <span class=\"number\">4</span> <span class=\"special\">*</span> <span class=\"identifier\">a</span> <span class=\"special\">*</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">ellint_2</span><span class=\"special\">(</span><span class=\"identifier\">k</span><span class=\"special\">);</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n        But we might also try mixing our arithmetic types - regular dynamically allocated\n        <a class=\"link\" href=\"floats/mpfr_float.html\" title=\"mpfr_float\">mpfr_float</a>'s\n        for the interface to minimise memory footprint in our external storage, and\n        statically allocated <a class=\"link\" href=\"floats/mpfr_float.html\" title=\"mpfr_float\">mpfr_float</a>'s\n        for the internal arithmetic:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">N</span><span class=\"special\">&gt;</span>\n<span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">elliptic_arc_length_2</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">a</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">b</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">,</span> <span class=\"identifier\">allocate_stack</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">k</span> <span class=\"special\">=</span> <span class=\"identifier\">sqrt</span><span class=\"special\">(</span><span class=\"number\">1</span> <span class=\"special\">-</span> <span class=\"identifier\">b</span> <span class=\"special\">*</span> <span class=\"identifier\">b</span> <span class=\"special\">/</span> <span class=\"special\">(</span><span class=\"identifier\">a</span> <span class=\"special\">*</span> <span class=\"identifier\">a</span><span class=\"special\">));</span>\n   <span class=\"keyword\">return</span> <span class=\"number\">4</span> <span class=\"special\">*</span> <span class=\"identifier\">a</span> <span class=\"special\">*</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">ellint_2</span><span class=\"special\">(</span><span class=\"identifier\">k</span><span class=\"special\">);</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n        The performance comparisons are surprisingly stark:\n      </p>\n<div class=\"informaltable\"><table class=\"table\">\n<colgroup>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  N\n                </p>\n              </th>\n<th>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">&gt;&gt;</span></code>\n                  / ms\n                </p>\n              </th>\n<th>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">,</span>\n                  <span class=\"identifier\">allocate_stack</span><span class=\"special\">&gt;&gt;</span></code>\n                  / ms\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  30\n                </p>\n              </td>\n<td>\n                <p>\n                  19.5\n                </p>\n              </td>\n<td>\n                <p>\n                  3.1\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  40\n                </p>\n              </td>\n<td>\n                <p>\n                  12.5\n                </p>\n              </td>\n<td>\n                <p>\n                  6.2\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  50\n                </p>\n              </td>\n<td>\n                <p>\n                  14.4\n                </p>\n              </td>\n<td>\n                <p>\n                  6.6\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  60\n                </p>\n              </td>\n<td>\n                <p>\n                  18.0\n                </p>\n              </td>\n<td>\n                <p>\n                  9.5\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  70\n                </p>\n              </td>\n<td>\n                <p>\n                  18.0\n                </p>\n              </td>\n<td>\n                <p>\n                  9.6\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  80\n                </p>\n              </td>\n<td>\n                <p>\n                  20.0\n                </p>\n              </td>\n<td>\n                <p>\n                  12.8\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n<p>\n        As before, the results are for MSVC-16.8.0/x64, and in point of fact, the\n        results do not always favour non-allocating types so much, it does depend\n        very much on the special function being called and/or the arguments used.\n      </p>\n<h5>\n<a name=\"boost_multiprecision.tut.mixed.h3\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.tut.mixed.backends_with_optimized_mixed_pr\"></a></span><a class=\"link\" href=\"mixed.html#boost_multiprecision.tut.mixed.backends_with_optimized_mixed_pr\">Backends\n        With Optimized Mixed Precision Arithmetic</a>\n      </h5>\n<p>\n        The following backends have at least some direct support for mixed-precision\n        arithmetic, and therefore avoid creating unnecessary temporaries when using\n        the interfaces above. Therefore when using these types it's more efficient\n        to use mixed-precision arithmetic, than it is to explicitly cast the operands\n        to the result type:\n      </p>\n<p>\n        <a class=\"link\" href=\"floats/mpfr_float.html\" title=\"mpfr_float\">mpfr_float</a>,\n        <a class=\"link\" href=\"floats/gmp_float.html\" title=\"gmp_float\">gmp_float</a>,\n        <a class=\"link\" href=\"ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>.\n      </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"rounding.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"variable.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/new_backend.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Writing a New Backend</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"eigen.html\" title=\"Eigen Interoperability\">\n<link rel=\"next\" href=\"../ref.html\" title=\"Reference\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"eigen.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.new_backend\"></a><a class=\"link\" href=\"new_backend.html\" title=\"Writing a New Backend\">Writing a New Backend</a>\n</h3></div></div></div>\n<p>\n        The formal requirements for a backend to class <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n        are given in the reference, but to help speed and simplify the process there\n        is a header <a href=\"http://www.boost.org/doc/libs/release/libs/multiprecision/doc/html/../../test/skeleton_backend.hpp\" target=\"_top\">skeleton_backend.hpp</a>\n        where all the methods needed to be written are declared but nothing is implemented.\n        The process of writing a new backend then simplifies to:\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Save skeleton_backend.hpp under a new name and change its #include guards\n            to match.\n          </li>\n<li class=\"listitem\">\n            Search and replace <code class=\"computeroutput\"><span class=\"identifier\">skeleton_backend</span></code>\n            to the name of the new backend type.\n          </li>\n<li class=\"listitem\">\n            Fill in the blanks in the class definition and for the compulsary non-members.\n          </li>\n<li class=\"listitem\">\n            Don't forget to mark the functions as <code class=\"computeroutput\"><span class=\"keyword\">inline</span></code>,\n            <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code> and <code class=\"computeroutput\"><span class=\"keyword\">noexcept</span></code> as required.\n          </li>\n<li class=\"listitem\">\n            Optionally fill in some of the optional methods - the header declares\n            these in rather verbose form, for example with overloads for every single\n            arithmetic type. No sane backend would ever implement all of these, just\n            choose the ones that make sense and leave the others.\n          </li>\n<li class=\"listitem\">\n            Add convenience typedefs for the actual instantiation(s) of class <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> that will use the new backend.\n          </li>\n</ul></div>\n<p>\n        To test the new backend, start with a basic arithmetic test, this is a test\n        case under <code class=\"computeroutput\"><span class=\"identifier\">libs</span><span class=\"special\">/</span><span class=\"identifier\">math</span><span class=\"special\">/</span><span class=\"identifier\">test</span></code>\n        that looks something like:\n      </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">my_new_number_type</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"string\">\"test_arithmetic.hpp\"</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"identifier\">test</span><span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">my_new_number_type</span><span class=\"special\">&gt;();</span>\n   <span class=\"keyword\">return</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">report_errors</span><span class=\"special\">();</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n        This will basically \"instantiate everything\", and perform a few\n        runtime sanity checks; it is a very good test that you have written legal\n        code!\n      </p>\n<p>\n        You should also create a \"header include test\" that verifies that\n        the new header includes everything it should, see <a href=\"http://www.boost.org/doc/libs/release/libs/multiprecision/doc/html/../../test/include_test/mpfr_include_test.cpp\" target=\"_top\">mpfr_include_test.cpp</a>\n        for an example.\n      </p>\n<p>\n        For integer types, you should add the new type to at least the following\n        tests as well:\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            test_hash.cpp\n          </li>\n<li class=\"listitem\">\n            test_int_io.cpp\n          </li>\n<li class=\"listitem\">\n            test_move.cpp\n          </li>\n<li class=\"listitem\">\n            test_numeric_limits.cpp\n          </li>\n</ul></div>\n<p>\n        For floating point types, you should add the new type to at least the following\n        tests as well:\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            test_acos.cpp\n          </li>\n<li class=\"listitem\">\n            test_asin.cpp\n          </li>\n<li class=\"listitem\">\n            test_atan.cpp\n          </li>\n<li class=\"listitem\">\n            test_constants.cpp\n          </li>\n<li class=\"listitem\">\n            test_cos.cpp\n          </li>\n<li class=\"listitem\">\n            test_cosh.cpp\n          </li>\n<li class=\"listitem\">\n            test_exp.cpp\n          </li>\n<li class=\"listitem\">\n            test_float_io.cpp\n          </li>\n<li class=\"listitem\">\n            test_fpclassify.cpp\n          </li>\n<li class=\"listitem\">\n            test_hash.cpp\n          </li>\n<li class=\"listitem\">\n            test_log.cpp\n          </li>\n<li class=\"listitem\">\n            test_move.cpp\n          </li>\n<li class=\"listitem\">\n            test_numeric_limits.cpp\n          </li>\n<li class=\"listitem\">\n            test_pow.cpp\n          </li>\n<li class=\"listitem\">\n            test_round.cpp\n          </li>\n<li class=\"listitem\">\n            test_sf_import_c99.cpp\n          </li>\n<li class=\"listitem\">\n            test_sin.cpp\n          </li>\n<li class=\"listitem\">\n            test_sinh.cpp\n          </li>\n<li class=\"listitem\">\n            test_sqrt.cpp\n          </li>\n<li class=\"listitem\">\n            test_tan.cpp\n          </li>\n<li class=\"listitem\">\n            test_tanh.cpp\n          </li>\n<li class=\"listitem\">\n            concepts/number_concept_check.cpp\n          </li>\n<li class=\"listitem\">\n            concepts/sf_concept_check_basic.cpp\n          </li>\n<li class=\"listitem\">\n            concepts/sf_concept_check_bessel.cpp\n          </li>\n<li class=\"listitem\">\n            concepts/sf_concept_check_beta.cpp\n          </li>\n<li class=\"listitem\">\n            concepts/sf_concept_check_beta_2.cpp\n          </li>\n<li class=\"listitem\">\n            concepts/sf_concept_check_beta_3.cpp\n          </li>\n<li class=\"listitem\">\n            concepts/sf_concept_check_elliptic.cpp\n          </li>\n<li class=\"listitem\">\n            concepts/sf_concept_check_gamma.cpp\n          </li>\n<li class=\"listitem\">\n            concepts/sf_concept_check_poly.cpp\n          </li>\n</ul></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"eigen.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../ref.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/primetest.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Primality Testing</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"random.html\" title=\"Generating Random Numbers\">\n<link rel=\"next\" href=\"lits.html\" title=\"Literal Types and constexpr Support\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"random.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"lits.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.primetest\"></a><a class=\"link\" href=\"primetest.html\" title=\"Primality Testing\">Primality Testing</a>\n</h3></div></div></div>\n<p>\n        The library implements a Miller-Rabin test for primality:\n      </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">miller_rabin</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Engine</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">miller_rabin_test</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">n</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">trials</span><span class=\"special\">,</span> <span class=\"identifier\">Engine</span><span class=\"special\">&amp;</span> <span class=\"identifier\">gen</span><span class=\"special\">);</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">expression_template_option</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">,</span> <span class=\"keyword\">class</span> <span class=\"identifier\">Engine</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">bool</span> <span class=\"identifier\">miller_rabin_test</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">Backend</span><span class=\"special\">,</span> <span class=\"identifier\">ExpressionTemplates</span><span class=\"special\">&gt;&amp;</span> <span class=\"identifier\">n</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">trials</span><span class=\"special\">);</span>\n</pre>\n<p>\n        These functions perform a Miller-Rabin test for primality, if the result\n        is <code class=\"computeroutput\"><span class=\"keyword\">false</span></code> then <span class=\"emphasis\"><em>n</em></span>\n        is definitely composite, while if the result is true then n is probably prime.\n        The probability to declare a composite n as probable prime is at most 0.25<sup>trials</sup>.\n        Note that this does not allow a statement about the probability of n being\n        actually prime (for that, the prior probability would have to be known).\n        The algorithm used performs some trial divisions to exclude small prime factors,\n        does one Fermat test to exclude many more composites, and then uses the Miller-Rabin\n        algorithm straight out of Knuth Vol 2, which recommends 25 trials for a pretty\n        strong likelihood that <span class=\"emphasis\"><em>n</em></span> is prime.\n      </p>\n<p>\n        The third optional argument is for a Uniform Random Number Generator from\n        Boost.Random. When not provided the <code class=\"computeroutput\"><span class=\"identifier\">mt19937</span></code>\n        generator is used. Note that when producing random primes then you should\n        probably use a different random number generator to produce candidate prime\n        numbers for testing, than is used internally by <code class=\"computeroutput\"><span class=\"identifier\">miller_rabin_test</span></code>\n        for determining whether the value is prime. It also helps of course to seed\n        the generators with some source of randomness.\n      </p>\n<p>\n        The following example searches for a prime <code class=\"computeroutput\"><span class=\"identifier\">p</span></code>\n        for which <code class=\"computeroutput\"><span class=\"special\">(</span><span class=\"identifier\">p</span><span class=\"special\">-</span><span class=\"number\">1</span><span class=\"special\">)/</span><span class=\"number\">2</span></code> is also probably prime:\n      </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">random</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_int</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">miller_rabin</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iomanip</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">random</span><span class=\"special\">;</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n\n   <span class=\"keyword\">typedef</span> <span class=\"identifier\">cpp_int</span> <span class=\"identifier\">int_type</span><span class=\"special\">;</span>\n   <span class=\"identifier\">mt11213b</span> <span class=\"identifier\">base_gen</span><span class=\"special\">(</span><span class=\"identifier\">clock</span><span class=\"special\">());</span>\n   <span class=\"identifier\">independent_bits_engine</span><span class=\"special\">&lt;</span><span class=\"identifier\">mt11213b</span><span class=\"special\">,</span> <span class=\"number\">256</span><span class=\"special\">,</span> <span class=\"identifier\">int_type</span><span class=\"special\">&gt;</span> <span class=\"identifier\">gen</span><span class=\"special\">(</span><span class=\"identifier\">base_gen</span><span class=\"special\">);</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// We must use a different generator for the tests and number generation, otherwise</span>\n   <span class=\"comment\">// we get false positives.</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">mt19937</span> <span class=\"identifier\">gen2</span><span class=\"special\">(</span><span class=\"identifier\">clock</span><span class=\"special\">());</span>\n\n   <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;</span> <span class=\"number\">100000</span><span class=\"special\">;</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n   <span class=\"special\">{</span>\n      <span class=\"identifier\">int_type</span> <span class=\"identifier\">n</span> <span class=\"special\">=</span> <span class=\"identifier\">gen</span><span class=\"special\">();</span>\n      <span class=\"keyword\">if</span><span class=\"special\">(</span><span class=\"identifier\">miller_rabin_test</span><span class=\"special\">(</span><span class=\"identifier\">n</span><span class=\"special\">,</span> <span class=\"number\">25</span><span class=\"special\">,</span> <span class=\"identifier\">gen2</span><span class=\"special\">))</span>\n      <span class=\"special\">{</span>\n         <span class=\"comment\">// Value n is probably prime, see if (n-1)/2 is also prime:</span>\n         <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"We have a probable prime with value: \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">hex</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">showbase</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">n</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n         <span class=\"keyword\">if</span><span class=\"special\">(</span><span class=\"identifier\">miller_rabin_test</span><span class=\"special\">((</span><span class=\"identifier\">n</span><span class=\"special\">-</span><span class=\"number\">1</span><span class=\"special\">)/</span><span class=\"number\">2</span><span class=\"special\">,</span> <span class=\"number\">25</span><span class=\"special\">,</span> <span class=\"identifier\">gen2</span><span class=\"special\">))</span>\n         <span class=\"special\">{</span>\n            <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"We have a safe prime with value: \"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">hex</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">showbase</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">n</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n            <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n         <span class=\"special\">}</span>\n      <span class=\"special\">}</span>\n   <span class=\"special\">}</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"string\">\"Ooops, no safe primes were found - probably a bad choice of seed values!\"</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"random.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"lits.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/random.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Generating Random Numbers</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"conversions.html\" title=\"Constructing and Interconverting Between Number Types\">\n<link rel=\"next\" href=\"primetest.html\" title=\"Primality Testing\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"conversions.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"primetest.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.random\"></a><a class=\"link\" href=\"random.html\" title=\"Generating Random Numbers\">Generating Random Numbers</a>\n</h3></div></div></div>\n<p>\n        Random numbers are generated in conjunction with Boost.Random.\n      </p>\n<p>\n        There is a single generator that supports generating random integers with\n        large bit counts: <a href=\"http://www.boost.org/doc/html/boost/random/independent_bits_engine.html\" target=\"_top\"><code class=\"computeroutput\"><span class=\"identifier\">independent_bits_engine</span></code></a>. This type\n        can be used with either <span class=\"emphasis\"><em>unbounded</em></span> integer types, or\n        with <span class=\"emphasis\"><em>bounded</em></span> (ie fixed precision) unsigned integers:\n      </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_int</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">random</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">random</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Declare our random number generator type, the underlying generator</span>\n   <span class=\"comment\">// is the Mersenne twister mt19937 engine, and we'll generate 256 bit</span>\n   <span class=\"comment\">// random values, independent_bits_engine will make multiple calls</span>\n   <span class=\"comment\">// to the underlying engine until we have the requested number of bits:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"keyword\">typedef</span> <span class=\"identifier\">independent_bits_engine</span><span class=\"special\">&lt;</span><span class=\"identifier\">mt19937</span><span class=\"special\">,</span> <span class=\"number\">256</span><span class=\"special\">,</span> <span class=\"identifier\">cpp_int</span><span class=\"special\">&gt;</span> <span class=\"identifier\">generator_type</span><span class=\"special\">;</span>\n   <span class=\"identifier\">generator_type</span> <span class=\"identifier\">gen</span><span class=\"special\">;</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Generate some values:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">hex</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">showbase</span><span class=\"special\">;</span>\n   <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;</span> <span class=\"number\">10</span><span class=\"special\">;</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n      <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">gen</span><span class=\"special\">()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Alternatively if we wish to generate random values in a fixed-precision</span>\n   <span class=\"comment\">// type, then we must use an unsigned type in order to adhere to the</span>\n   <span class=\"comment\">// conceptual requirements of the generator:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"keyword\">typedef</span> <span class=\"identifier\">independent_bits_engine</span><span class=\"special\">&lt;</span><span class=\"identifier\">mt19937</span><span class=\"special\">,</span> <span class=\"number\">512</span><span class=\"special\">,</span> <span class=\"identifier\">uint512_t</span><span class=\"special\">&gt;</span> <span class=\"identifier\">generator512_type</span><span class=\"special\">;</span>\n   <span class=\"identifier\">generator512_type</span> <span class=\"identifier\">gen512</span><span class=\"special\">;</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Generate some 1024-bit unsigned values:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">hex</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">showbase</span><span class=\"special\">;</span>\n   <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;</span> <span class=\"number\">10</span><span class=\"special\">;</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n      <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">gen512</span><span class=\"special\">()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n      <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n        Program output is:\n      </p>\n<pre class=\"programlisting\">0xD091BB5C22AE9EF6E7E1FAEED5C31F792082352CF807B7DFE9D300053895AFE1\n0xA1E24BBA4EE4092B18F868638C16A625474BA8C43039CD1A8C006D5FFE2D7810\n0xF51F2AE7FF1816E4F702EF59F7BADAFA285954A1B9D09511F878C4B3FB2A0137\n0xF508E4AA1C1FE6527C419418CC50AA59CCDF2E5C4C0A1F3B2452A9DC01397D8D\n0x6BF88C311CCA797AEA6DA4AEA3C78807CACE1969E0E0D4ADF5A14BAB80F00988\n0xA7DE9F4CCC450CBA0924668F5C7DC380D96089C53640AC4CEF1A2E6DAE6D9426\n0xADC1965B6613BA46C1FB41C2BD9B0ECDBE3DEDFC7989C8EE6468FD6E6C0DF032\n0xA7CD66342C826D8B2BD2E4124D4A2DBEB4BF6FA7CC1A89590826328251097330\n0x46E46CB0DF577EC20BD1E364262C556418DDA0C9FE7B45D9D2CE21C9D268409A\n0xB1E049E1200BFA47512D6E73C3851EEEF341C0817D973E4808D17554A9E20D28\n0xD091BB5C22AE9EF6E7E1FAEED5C31F792082352CF807B7DFE9D300053895AFE1A1E24BBA4EE4092B18F868638C16A625474BA8C43039CD1A8C006D5FFE2D7810\n0xF51F2AE7FF1816E4F702EF59F7BADAFA285954A1B9D09511F878C4B3FB2A0137F508E4AA1C1FE6527C419418CC50AA59CCDF2E5C4C0A1F3B2452A9DC01397D8D\n0x6BF88C311CCA797AEA6DA4AEA3C78807CACE1969E0E0D4ADF5A14BAB80F00988A7DE9F4CCC450CBA0924668F5C7DC380D96089C53640AC4CEF1A2E6DAE6D9426\n0xADC1965B6613BA46C1FB41C2BD9B0ECDBE3DEDFC7989C8EE6468FD6E6C0DF032A7CD66342C826D8B2BD2E4124D4A2DBEB4BF6FA7CC1A89590826328251097330\n0x46E46CB0DF577EC20BD1E364262C556418DDA0C9FE7B45D9D2CE21C9D268409AB1E049E1200BFA47512D6E73C3851EEEF341C0817D973E4808D17554A9E20D28\n0x70518CE6203AC30361ADD0AB35D0430CC3F8E8920D1C8509CB92388E095436BF2FD6E20868A29AF97D61330B753EC6FC7211EFEA7CD15133A574C4FFCB41F198\n0xB598EEF6EBBE7347C1332568CEBA5A7046A99459B4AD9F11AE00FEAA00B8B573A7B480B6B5F0B06C29A0EC27A4DAA0101E76A1C574BE91337F94C950C61F6ED6\n0xF5B1C7A192E195F8572384D4E0732C8895D41B68CEE496C3394BBD52048CD47CC05309BED23D2D63414DE9C5D2229F23818666A3F0A8B109B2F6B12769A48341\n0xE4123C566C548C8FF5941F6194B993AA8C1651342876763C237CE42EC300D11B263821CA3AEB820241EC0F84CF4AC36DD7393EE6FD0FC06A4118A30A551B54A4\n0xD074F86F4CC1C54A3E57A70303774CDAEDE43895379CE62759988939E8490DDC325410E1D9352F6A4047080AF47C081D9DB51A85C765D71F79297527FCCA2773\n</pre>\n<p>\n        In addition, the generator adaptors <a href=\"http://www.boost.org/doc/html/boost/random/discard_block_engine.html\" target=\"_top\"><code class=\"computeroutput\"><span class=\"identifier\">discard_block</span></code></a>, <a href=\"http://www.boost.org/doc/html/boost/random/xor_combine_engine.html\" target=\"_top\"><code class=\"computeroutput\"><span class=\"identifier\">xor_combine_engine</span></code></a> and <a href=\"http://www.boost.org/doc/html/boost/random/discrete_distribution.html\" target=\"_top\"><code class=\"computeroutput\"><span class=\"identifier\">discrete_distribution</span></code></a> can be used\n        with multiprecision types. Note that if you seed an <code class=\"computeroutput\"><span class=\"identifier\">independent_bits_engine</span></code>,\n        then you are actually seeding the underlying generator, and should therefore\n        provide a sequence of unsigned 32-bit values as the seed.\n      </p>\n<p>\n        Alternatively we can generate integers in a given range using <a href=\"http://www.boost.org/doc/html/boost/random/uniform_int_distribution.html\" target=\"_top\"><code class=\"computeroutput\"><span class=\"identifier\">uniform_int_distribution</span></code></a>, this\n        will invoke the underlying engine multiple times to build up the required\n        number of bits in the result:\n      </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_int</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">random</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">random</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Generate integers in a given range using uniform_int,</span>\n   <span class=\"comment\">// the underlying generator is invoked multiple times</span>\n   <span class=\"comment\">// to generate enough bits:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">mt19937</span> <span class=\"identifier\">mt</span><span class=\"special\">;</span>\n   <span class=\"identifier\">uniform_int_distribution</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int</span><span class=\"special\">&gt;</span> <span class=\"identifier\">ui</span><span class=\"special\">(-(</span><span class=\"identifier\">cpp_int</span><span class=\"special\">(</span><span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"number\">256</span><span class=\"special\">),</span> <span class=\"identifier\">cpp_int</span><span class=\"special\">(</span><span class=\"number\">1</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"number\">256</span><span class=\"special\">);</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Generate the numbers:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;</span> <span class=\"number\">10</span><span class=\"special\">;</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n      <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">ui</span><span class=\"special\">(</span><span class=\"identifier\">mt</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n        Program output is\n      </p>\n<pre class=\"programlisting\">25593993629538149833210527544371584707508847463356155903670894544241785158492\n12721121657520147247744796431842326146296294180809160027132416389225539366745\n106034929479008809862776424170460808190085984129117168803272987114325199071833\n86048861429530654936263414134573980939351899046345384016090167510299251354700\n-23473382144925885755951447143660880642389842563343761080591177733698450031250\n76840269649240973945508128641415259490679375154523618053296924666747244530145\n21638369166612496703991271955994563624044383325105383029306009417224944272131\n18829152205014764576551421737727569993966577957447887116062495161081023584880\n101521572847669971701030312596819435590097618913255156117898217707115132658117\n-97490271301923067621481012355971422109456300816856752380346627103308328292057\n</pre>\n<p>\n        It is also possible to use <a href=\"http://www.boost.org/doc/html/boost/random/uniform_int_distribution.html\" target=\"_top\"><code class=\"computeroutput\"><span class=\"identifier\">uniform_int_distribution</span></code></a> with a\n        multiprecision generator such as <a href=\"http://www.boost.org/doc/html/boost/random/independent_bits_engine.html\" target=\"_top\"><code class=\"computeroutput\"><span class=\"identifier\">independent_bits_engine</span></code></a>. Or to\n        use <a href=\"http://www.boost.org/doc/html/boost/random/uniform_smallint.html\" target=\"_top\"><code class=\"computeroutput\"><span class=\"identifier\">uniform_smallint</span></code></a> or <a href=\"http://www.boost.org/doc/html/boost/random/random_number_generator.html\" target=\"_top\"><code class=\"computeroutput\"><span class=\"identifier\">random_number_generator</span></code></a> with multiprecision\n        types.\n      </p>\n<p>\n        floating-point values in [0,1) are most easily generated using <a href=\"http://www.boost.org/doc/html/boost/random/generate_canonical.html\" target=\"_top\"><code class=\"computeroutput\"><span class=\"identifier\">generate_canonical</span></code></a>, note that\n        <code class=\"computeroutput\"><span class=\"identifier\">generate_canonical</span></code> will call\n        the generator multiple times to produce the requested number of bits, for\n        example we can use it with a regular generator like so:\n      </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">random</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">random</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">mt19937</span> <span class=\"identifier\">gen</span><span class=\"special\">;</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Generate the values:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"number\">50</span><span class=\"special\">);</span>\n   <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;</span> <span class=\"number\">20</span><span class=\"special\">;</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n      <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">generate_canonical</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits</span><span class=\"special\">&gt;(</span><span class=\"identifier\">gen</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n        Which produces the following output:\n      </p>\n<pre class=\"programlisting\">0.96886777112423135248554451482797431507115448261086\n0.54722059636785192454525760726084778627750790023546\n0.99646132554800874317788284808573062871409279729804\n0.98110969177693891782396443737643892769773768718591\n0.29702944955795083040856753579705872634075574515969\n0.63976335709815275010379796044374742646738557798647\n0.79792861516022605265555700991255998690336456180995\n0.68135953856026596523755400091345037778580909233387\n0.47475868061723477935404326837783394169122045199915\n0.30191312687731969398296589840622989141067852863748\n0.87242882006730022427155209451091472382531795659709\n0.82190326480741096300318873712966555706035846579562\n0.49058903962146072778707295967429263659897501512813\n0.2102090745190061764133345429475530760261103345204\n0.4087311609617603484960794513055502599728804206333\n0.79397497154919267900450180642484943996546102712187\n0.70577425166871982574205252142383800792823003687121\n0.64396095652194035523385641523010248768636064728226\n0.5737546665965914620678634509134819579811035412969\n0.017773895576552474810236796736785695789752666554273\n</pre>\n<p>\n        Note however, the distributions do not invoke the generator multiple times\n        to fill up the mantissa of a multiprecision floating-point type with random\n        bits. For these therefore, we should probably use a multiprecision generator\n        (ie <code class=\"computeroutput\"><span class=\"identifier\">independent_bits_engine</span></code>)\n        in combination with the distribution:\n      </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_int</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">random</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">random</span><span class=\"special\">;</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Generate some distruted values:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">uniform_real_distribution</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">&gt;</span> <span class=\"identifier\">ur</span><span class=\"special\">(-</span><span class=\"number\">20</span><span class=\"special\">,</span> <span class=\"number\">20</span><span class=\"special\">);</span>\n   <span class=\"identifier\">gamma_distribution</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">&gt;</span> <span class=\"identifier\">gd</span><span class=\"special\">(</span><span class=\"number\">20</span><span class=\"special\">);</span>\n   <span class=\"identifier\">independent_bits_engine</span><span class=\"special\">&lt;</span><span class=\"identifier\">mt19937</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits</span><span class=\"special\">,</span> <span class=\"identifier\">cpp_int</span><span class=\"special\">&gt;</span> <span class=\"identifier\">gen</span><span class=\"special\">;</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Generate some values:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"number\">50</span><span class=\"special\">);</span>\n   <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;</span> <span class=\"number\">20</span><span class=\"special\">;</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n      <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">ur</span><span class=\"special\">(</span><span class=\"identifier\">gen</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;</span> <span class=\"number\">20</span><span class=\"special\">;</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n      <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">gd</span><span class=\"special\">(</span><span class=\"identifier\">gen</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n        Which produces the following output:\n      </p>\n<pre class=\"programlisting\">-18.576837157065858312137736538355805944098004018928\n4.5605477000094480453928920098152026546185388161216\n-1.7611402252150150370944527411235180945558276280598\n-2.471338289511354190492328039842914272146783953149\n-7.4131520453411321647183692139916357315276121488316\n-9.192739117661751364518299455475684051782402347659\n7.0126880787149555595443325648941661436898526919013\n2.8554749162054097111723076181877881960039268668423\n14.390501287552165467965587841551705310012046701036\n-8.9747073123748752412086051960748002945548570524149\n-8.1305063133718605220959174700954037986278348616362\n9.5496899464463627949564295930962040525540578754312\n-15.309681742947663333436391348699943078942921692008\n2.0454914298189175280771944784358385982869708951824\n-10.069253024538932382193363493367304983742246396276\n13.449212808583153116670057807764145176004060370818\n-6.0065092542772507561228141992257782449634820245355\n15.00971466974838379824678369267201922989930663822\n16.158514812070905438581736305533045434508525979205\n-2.1531361299576399413547008719541457739794964378093\n19.398278792113040046930806838893737245011219380822\n12.965216582396067073600685365545292876001524716225\n19.561779374349650983983836397553672788578622096947\n15.982213641588944604037715576313848977716540941271\n23.96044616946856385664151481695038833903083043492\n21.054716943622792848187523422423642819628010070375\n18.596078774135209530930707331338838805575875990091\n19.539530839287848627426769425090194390388333335812\n17.176133236359396942946640290935498641489373354297\n16.228802394876800099035133760539461530246286999827\n23.63807160907473465631049083277558060813997674519\n12.838499607321990428122225501321564153572478845401\n16.878362445712403300584931374939967549572637230102\n20.646246409377134464856282996941395597420615529803\n16.602429236226052406561338766554127142762673418695\n21.680007865714197450495711030406314524681744024329\n21.038948660115771777833205901845639760348321521616\n30.494499676527802078320016654058105593076348727966\n18.704734464995637480940828829962787676146589788572\n22.502216997171061548799304902323434654678156658236\n</pre>\n<p>\n        And finally, it is possible to use the floating-point generators <a href=\"http://www.boost.org/doc/html/boost/random/lagged_fibonacci_01_engine.html\" target=\"_top\"><code class=\"computeroutput\"><span class=\"identifier\">lagged_fibonacci_01_engine</span></code></a> and\n        <a href=\"http://www.boost.org/doc/html/boost/random/subtract_with_idp144360752.html\" target=\"_top\"><code class=\"computeroutput\"><span class=\"identifier\">subtract_with_carry_01_engine</span></code></a> directly\n        with multiprecision floating-point types. It's worth noting however, that\n        there is a distinct lack of literature on generating high bit-count random\n        numbers, and therefore a lack of \"known good\" parameters to use\n        with these generators in this situation. For this reason, these should probably\n        be used for research purposes only:\n      </p>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_bin_float</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">random</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">scoped_ptr</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">random</span><span class=\"special\">;</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Generate some multiprecision values, note that the generator is so large</span>\n   <span class=\"comment\">// that we have to allocate it on the heap, otherwise we may run out of</span>\n   <span class=\"comment\">// stack space!  We could avoid this by using a floating point type which</span>\n   <span class=\"comment\">// allocates it's internal storage on the heap - cpp_bin_float will do</span>\n   <span class=\"comment\">// this with the correct template parameters, as will the GMP or MPFR</span>\n   <span class=\"comment\">// based reals.</span>\n   <span class=\"comment\">//</span>\n   <span class=\"keyword\">typedef</span> <span class=\"identifier\">lagged_fibonacci_01_engine</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">,</span> <span class=\"number\">48</span><span class=\"special\">,</span> <span class=\"number\">44497</span><span class=\"special\">,</span> <span class=\"number\">21034</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">big_fib_gen</span><span class=\"special\">;</span>\n   <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">scoped_ptr</span><span class=\"special\">&lt;</span><span class=\"identifier\">big_fib_gen</span><span class=\"special\">&gt;</span> <span class=\"identifier\">pgen</span><span class=\"special\">(</span><span class=\"keyword\">new</span> <span class=\"identifier\">big_fib_gen</span><span class=\"special\">);</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Generate some values:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">setprecision</span><span class=\"special\">(</span><span class=\"number\">50</span><span class=\"special\">);</span>\n   <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;</span> <span class=\"number\">20</span><span class=\"special\">;</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n      <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"special\">(*</span><span class=\"identifier\">pgen</span><span class=\"special\">)()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// try again with a ranlux generator, this is not quite so large</span>\n   <span class=\"comment\">// so we can use the heap this time:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"keyword\">typedef</span> <span class=\"identifier\">subtract_with_carry_01_engine</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">,</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_bin_float_50</span><span class=\"special\">&gt;::</span><span class=\"identifier\">digits</span> <span class=\"special\">-</span> <span class=\"number\">5</span><span class=\"special\">,</span> <span class=\"number\">10</span><span class=\"special\">,</span> <span class=\"number\">24</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">ranlux_big_base_01</span><span class=\"special\">;</span>\n   <span class=\"keyword\">typedef</span> <span class=\"identifier\">discard_block_engine</span><span class=\"special\">&lt;</span> <span class=\"identifier\">ranlux_big_base_01</span><span class=\"special\">,</span> <span class=\"number\">389</span><span class=\"special\">,</span> <span class=\"number\">24</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">big_ranlux</span><span class=\"special\">;</span>\n   <span class=\"identifier\">big_ranlux</span> <span class=\"identifier\">rg</span><span class=\"special\">;</span>\n   <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;</span> <span class=\"number\">20</span><span class=\"special\">;</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n      <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">rg</span><span class=\"special\">()</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"conversions.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"primetest.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/rational/cpp_rational.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>cpp_rational</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../rational.html\" title=\"Rational Number Types\">\n<link rel=\"prev\" href=\"../rational.html\" title=\"Rational Number Types\">\n<link rel=\"next\" href=\"gmp_rational.html\" title=\"gmp_rational\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../rational.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../rational.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"gmp_rational.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.rational.cpp_rational\"></a><a class=\"link\" href=\"cpp_rational.html\" title=\"cpp_rational\">cpp_rational</a>\n</h4></div></div></div>\n<p>\n          <code class=\"computeroutput\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_int</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">rational_adaptor</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_int_backend</span><span class=\"special\">&lt;&gt;</span> <span class=\"special\">&gt;</span>    <span class=\"identifier\">cpp_rational_backend</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">cpp_rational_backend</span><span class=\"special\">&gt;</span>         <span class=\"identifier\">cpp_rational</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n          The <code class=\"computeroutput\"><span class=\"identifier\">cpp_rational_backend</span></code>\n          type is used via the typedef <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">cpp_rational</span></code>.\n          It provides a rational number type that is a drop-in replacement for the\n          native C++ number types, but with unlimited precision.\n        </p>\n<p>\n          As well as the usual conversions from arithmetic and string types, instances\n          of <code class=\"computeroutput\"><span class=\"identifier\">cpp_rational</span></code> are copy\n          constructible and assignable from type <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>.\n        </p>\n<p>\n          There is also a two argument constructor that accepts a numerator and denominator:\n          both of type <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>.\n        </p>\n<p>\n          There are also non-member functions:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">cpp_int</span> <span class=\"identifier\">numerator</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">cpp_rational</span><span class=\"special\">&amp;);</span>\n<span class=\"identifier\">cpp_int</span> <span class=\"identifier\">denominator</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">cpp_rational</span><span class=\"special\">&amp;);</span>\n</pre>\n<p>\n          which return the numerator and denominator of the number.\n        </p>\n<p>\n          Things you should know when using this type:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              Default constructed <code class=\"computeroutput\"><span class=\"identifier\">cpp_rational</span></code>s\n              have the value zero.\n            </li>\n<li class=\"listitem\">\n              Division by zero results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code>\n              being thrown.\n            </li>\n<li class=\"listitem\">\n              Conversion from a string results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code>\n              being thrown if the string can not be interpreted as a valid rational\n              number.\n            </li>\n</ul></div>\n<h6>\n<a name=\"boost_multiprecision.tut.rational.cpp_rational.h0\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.rational.cpp_rational.example\"></a></span><a class=\"link\" href=\"cpp_rational.html#boost_multiprecision.tut.rational.cpp_rational.example\">Example:</a>\n        </h6>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">cpp_int</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">cpp_rational</span> <span class=\"identifier\">v</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// Do some arithmetic:</span>\n   <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;=</span> <span class=\"number\">1000</span><span class=\"special\">;</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n      <span class=\"identifier\">v</span> <span class=\"special\">*=</span> <span class=\"identifier\">i</span><span class=\"special\">;</span>\n   <span class=\"identifier\">v</span> <span class=\"special\">/=</span> <span class=\"number\">10</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">v</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// prints 1000! / 10</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">numerator</span><span class=\"special\">(</span><span class=\"identifier\">v</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">denominator</span><span class=\"special\">(</span><span class=\"identifier\">v</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">cpp_rational</span> <span class=\"identifier\">w</span><span class=\"special\">(</span><span class=\"number\">2</span><span class=\"special\">,</span> <span class=\"number\">3</span><span class=\"special\">);</span>  <span class=\"comment\">// component wise constructor</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">w</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// prints 2/3</span>\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"../rational.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../rational.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"gmp_rational.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/rational/gmp_rational.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>gmp_rational</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../rational.html\" title=\"Rational Number Types\">\n<link rel=\"prev\" href=\"cpp_rational.html\" title=\"cpp_rational\">\n<link rel=\"next\" href=\"tommath_rational.html\" title=\"tommath_rational\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"cpp_rational.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../rational.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"tommath_rational.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.rational.gmp_rational\"></a><a class=\"link\" href=\"gmp_rational.html\" title=\"gmp_rational\">gmp_rational</a>\n</h4></div></div></div>\n<p>\n          <code class=\"computeroutput\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">gmp</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">class</span> <span class=\"identifier\">gmp_rational</span><span class=\"special\">;</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_rational</span> <span class=\"special\">&gt;</span>         <span class=\"identifier\">mpq_rational</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n          The <code class=\"computeroutput\"><span class=\"identifier\">gmp_rational</span></code> back-end\n          is used via the typedef <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">mpq_rational</span></code>.\n          It acts as a thin wrapper around the <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>\n          <code class=\"computeroutput\"><span class=\"identifier\">mpq_t</span></code> to provide a rational\n          number type that is a drop-in replacement for the native C++ number types,\n          but with unlimited precision.\n        </p>\n<p>\n          As well as the usual conversions from arithmetic and string types, instances\n          of <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_rational</span><span class=\"special\">&gt;</span></code>\n          are copy constructible and assignable from:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              The <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> native types: <code class=\"computeroutput\"><span class=\"identifier\">mpz_t</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">mpq_t</span></code>.\n            </li>\n<li class=\"listitem\">\n              <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_int</span><span class=\"special\">&gt;</span></code>.\n            </li>\n</ul></div>\n<p>\n          There is also a two-argument constructor that accepts a numerator and denominator\n          (both of type <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">gmp_int</span><span class=\"special\">&gt;</span></code>).\n        </p>\n<p>\n          There are also non-member functions:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">mpz_int</span> <span class=\"identifier\">numerator</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">mpq_rational</span><span class=\"special\">&amp;);</span>\n<span class=\"identifier\">mpz_int</span> <span class=\"identifier\">denominator</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">mpq_rational</span><span class=\"special\">&amp;);</span>\n</pre>\n<p>\n          which return the numerator and denominator of the number.\n        </p>\n<p>\n          It's also possible to access the underlying <code class=\"computeroutput\"><span class=\"identifier\">mpq_t</span></code>\n          via the <code class=\"computeroutput\"><span class=\"identifier\">data</span><span class=\"special\">()</span></code>\n          member function of <code class=\"computeroutput\"><span class=\"identifier\">mpq_rational</span></code>.\n        </p>\n<p>\n          Things you should know when using this type:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              Default constructed <code class=\"computeroutput\"><span class=\"identifier\">mpq_rational</span></code>s\n              have the value zero (this is the <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>\n              default behavior).\n            </li>\n<li class=\"listitem\">\n              Division by zero results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code>\n              being thrown.\n            </li>\n<li class=\"listitem\">\n              Conversion from a string results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code>\n              being thrown if the string can not be interpreted as a valid rational\n              number.\n            </li>\n<li class=\"listitem\">\n              No changes are made to the <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>\n              library's global settings, so this type can coexist with existing\n              <a href=\"http://gmplib.org\" target=\"_top\">GMP</a> code.\n            </li>\n<li class=\"listitem\">\n              The code can equally be used with <a href=\"http://mpir.org/\" target=\"_top\">MPIR</a>\n              as the underlying library - indeed that is the preferred option on\n              Win32.\n            </li>\n</ul></div>\n<h6>\n<a name=\"boost_multiprecision.tut.rational.gmp_rational.h0\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.rational.gmp_rational.example\"></a></span><a class=\"link\" href=\"gmp_rational.html#boost_multiprecision.tut.rational.gmp_rational.example\">Example:</a>\n        </h6>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">gmp</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">gmp</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">mpq_rational</span> <span class=\"identifier\">v</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// Do some arithmetic:</span>\n   <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;=</span> <span class=\"number\">1000</span><span class=\"special\">;</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n      <span class=\"identifier\">v</span> <span class=\"special\">*=</span> <span class=\"identifier\">i</span><span class=\"special\">;</span>\n   <span class=\"identifier\">v</span> <span class=\"special\">/=</span> <span class=\"number\">10</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">v</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// prints 1000! / 10</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">numerator</span><span class=\"special\">(</span><span class=\"identifier\">v</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">denominator</span><span class=\"special\">(</span><span class=\"identifier\">v</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">mpq_rational</span> <span class=\"identifier\">w</span><span class=\"special\">(</span><span class=\"number\">2</span><span class=\"special\">,</span> <span class=\"number\">3</span><span class=\"special\">);</span>  <span class=\"comment\">// component wise constructor</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">w</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// prints 2/3</span>\n\n   <span class=\"comment\">// Access the underlying data:</span>\n   <span class=\"identifier\">mpq_t</span> <span class=\"identifier\">q</span><span class=\"special\">;</span>\n   <span class=\"identifier\">mpq_init</span><span class=\"special\">(</span><span class=\"identifier\">q</span><span class=\"special\">);</span>\n   <span class=\"identifier\">mpq_set</span><span class=\"special\">(</span><span class=\"identifier\">q</span><span class=\"special\">,</span> <span class=\"identifier\">v</span><span class=\"special\">.</span><span class=\"identifier\">backend</span><span class=\"special\">().</span><span class=\"identifier\">data</span><span class=\"special\">());</span>\n   <span class=\"identifier\">mpq_clear</span><span class=\"special\">(</span><span class=\"identifier\">q</span><span class=\"special\">);</span>\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"cpp_rational.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../rational.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"tommath_rational.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/rational/rational_adaptor.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>rational_adaptor</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../rational.html\" title=\"Rational Number Types\">\n<link rel=\"prev\" href=\"tommath_rational0.html\" title=\"tommath_rational\">\n<link rel=\"next\" href=\"../misc.html\" title=\"Miscellaneous Number Types.\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"tommath_rational0.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../rational.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../misc.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.rational.rational_adaptor\"></a><a class=\"link\" href=\"rational_adaptor.html\" title=\"rational_adaptor\">rational_adaptor</a>\n</h4></div></div></div>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">template</span> <span class=\"special\">&lt;</span><span class=\"keyword\">class</span> <span class=\"identifier\">IntBackend</span><span class=\"special\">&gt;</span>\n<span class=\"keyword\">class</span> <span class=\"identifier\">rational_adpater</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span>\n</pre>\n<p>\n          The class template <code class=\"computeroutput\"><span class=\"identifier\">rational_adaptor</span></code>\n          is a back-end for <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n          which converts any existing integer back-end into a rational-number back-end.\n        </p>\n<p>\n          So for example, given an integer back-end type <code class=\"computeroutput\"><span class=\"identifier\">MyIntegerBackend</span></code>,\n          the use would be something like:\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">MyIntegerBackend</span><span class=\"special\">&gt;</span>                    <span class=\"identifier\">MyInt</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">rational_adaptor</span><span class=\"special\">&lt;</span><span class=\"identifier\">MyIntegerBackend</span><span class=\"special\">&gt;</span> <span class=\"special\">&gt;</span> <span class=\"identifier\">MyRational</span><span class=\"special\">;</span>\n\n<span class=\"identifier\">MyRational</span> <span class=\"identifier\">r</span> <span class=\"special\">=</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n<span class=\"identifier\">r</span> <span class=\"special\">/=</span> <span class=\"number\">3</span><span class=\"special\">;</span>\n<span class=\"identifier\">MyInt</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"identifier\">numerator</span><span class=\"special\">(</span><span class=\"identifier\">r</span><span class=\"special\">);</span>\n<span class=\"identifier\">assert</span><span class=\"special\">(</span><span class=\"identifier\">i</span> <span class=\"special\">==</span> <span class=\"number\">2</span><span class=\"special\">);</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"tommath_rational0.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../rational.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"../misc.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/rational/tommath_rational.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>tommath_rational</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../rational.html\" title=\"Rational Number Types\">\n<link rel=\"prev\" href=\"gmp_rational.html\" title=\"gmp_rational\">\n<link rel=\"next\" href=\"tommath_rational0.html\" title=\"tommath_rational\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"gmp_rational.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../rational.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"tommath_rational0.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.rational.tommath_rational\"></a><a class=\"link\" href=\"tommath_rational.html\" title=\"tommath_rational\">tommath_rational</a>\n</h4></div></div></div>\n<p>\n          <code class=\"computeroutput\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">tommath</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">rational_adpater</span><span class=\"special\">&lt;</span><span class=\"identifier\">tommath_int</span><span class=\"special\">&gt;</span>        <span class=\"identifier\">tommath_rational</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">tommath_rational</span> <span class=\"special\">&gt;</span>         <span class=\"identifier\">tom_rational</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n          The <code class=\"computeroutput\"><span class=\"identifier\">tommath_rational</span></code> back-end\n          is used via the typedef <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">tom_rational</span></code>.\n          It acts as a thin wrapper around <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">rational</span><span class=\"special\">&lt;</span><span class=\"identifier\">tom_int</span><span class=\"special\">&gt;</span></code> to provide a rational number type that\n          is a drop-in replacement for the native C++ number types, but with unlimited\n          precision.\n        </p>\n<p>\n          The advantage of using this type rather than <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">rational</span><span class=\"special\">&lt;</span><span class=\"identifier\">tom_int</span><span class=\"special\">&gt;</span></code> directly, is that it is expression-template\n          enabled, greatly reducing the number of temporaries created in complex\n          expressions.\n        </p>\n<p>\n          There are also non-member functions:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">tom_int</span> <span class=\"identifier\">numerator</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">tom_rational</span><span class=\"special\">&amp;);</span>\n<span class=\"identifier\">tom_int</span> <span class=\"identifier\">denominator</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">tom_rational</span><span class=\"special\">&amp;);</span>\n</pre>\n<p>\n          which return the numerator and denominator of the number.\n        </p>\n<p>\n          Things you should know when using this type:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              Default constructed <code class=\"computeroutput\"><span class=\"identifier\">tom_rational</span></code>s\n              have the value zero (this the inherited Boost.Rational behavior).\n            </li>\n<li class=\"listitem\">\n              Division by zero results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code>\n              being thrown.\n            </li>\n<li class=\"listitem\">\n              Conversion from a string results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code>\n              being thrown if the string can not be interpreted as a valid rational\n              number.\n            </li>\n<li class=\"listitem\">\n              No changes are made to <a href=\"http://libtom.net\" target=\"_top\">libtommath</a>'s\n              global state, so this type can safely coexist with other <a href=\"http://libtom.net\" target=\"_top\">libtommath</a>\n              code.\n            </li>\n<li class=\"listitem\">\n              Performance of this type has been found to be pretty poor - this need\n              further investigation - but it appears that Boost.Rational needs some\n              improvement in this area.\n            </li>\n</ul></div>\n<h6>\n<a name=\"boost_multiprecision.tut.rational.tommath_rational.h0\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.rational.tommath_rational.example\"></a></span><a class=\"link\" href=\"tommath_rational.html#boost_multiprecision.tut.rational.tommath_rational.example\">Example:</a>\n        </h6>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">tommath</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">tom_rational</span> <span class=\"identifier\">v</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// Do some arithmetic:</span>\n   <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;=</span> <span class=\"number\">1000</span><span class=\"special\">;</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n      <span class=\"identifier\">v</span> <span class=\"special\">*=</span> <span class=\"identifier\">i</span><span class=\"special\">;</span>\n   <span class=\"identifier\">v</span> <span class=\"special\">/=</span> <span class=\"number\">10</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">v</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// prints 1000! / 10</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">numerator</span><span class=\"special\">(</span><span class=\"identifier\">v</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">denominator</span><span class=\"special\">(</span><span class=\"identifier\">v</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">tom_rational</span> <span class=\"identifier\">w</span><span class=\"special\">(</span><span class=\"number\">2</span><span class=\"special\">,</span> <span class=\"number\">3</span><span class=\"special\">);</span> <span class=\"comment\">// Component wise constructor</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">w</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// prints 2/3</span>\n\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"gmp_rational.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../rational.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"tommath_rational0.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/rational/tommath_rational0.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>tommath_rational</title>\n<link rel=\"stylesheet\" href=\"../../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../rational.html\" title=\"Rational Number Types\">\n<link rel=\"prev\" href=\"tommath_rational.html\" title=\"tommath_rational\">\n<link rel=\"next\" href=\"rational_adaptor.html\" title=\"rational_adaptor\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"tommath_rational.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../rational.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"rational_adaptor.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h4 class=\"title\">\n<a name=\"boost_multiprecision.tut.rational.tommath_rational0\"></a><a class=\"link\" href=\"tommath_rational0.html\" title=\"tommath_rational\">tommath_rational</a>\n</h4></div></div></div>\n<p>\n          <code class=\"computeroutput\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">tommath</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span></code>\n        </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">{</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">multiprecision</span><span class=\"special\">{</span>\n\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">rational_adpater</span><span class=\"special\">&lt;</span><span class=\"identifier\">tommath_int</span><span class=\"special\">&gt;</span>        <span class=\"identifier\">tommath_rational</span><span class=\"special\">;</span>\n<span class=\"keyword\">typedef</span> <span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">tommath_rational</span> <span class=\"special\">&gt;</span>         <span class=\"identifier\">tom_rational</span><span class=\"special\">;</span>\n\n<span class=\"special\">}}</span> <span class=\"comment\">// namespaces</span>\n</pre>\n<p>\n          The <code class=\"computeroutput\"><span class=\"identifier\">tommath_rational</span></code> back-end\n          is used via the typedef <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">tom_rational</span></code>.\n          It acts as a thin wrapper around <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">rational</span><span class=\"special\">&lt;</span><span class=\"identifier\">tom_int</span><span class=\"special\">&gt;</span></code> to provide a rational number type that\n          is a drop-in replacement for the native C++ number types, but with unlimited\n          precision.\n        </p>\n<p>\n          The advantage of using this type rather than <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">rational</span><span class=\"special\">&lt;</span><span class=\"identifier\">tom_int</span><span class=\"special\">&gt;</span></code> directly, is that it is expression-template\n          enabled, greatly reducing the number of temporaries created in complex\n          expressions.\n        </p>\n<p>\n          There are also non-member functions:\n        </p>\n<pre class=\"programlisting\"><span class=\"identifier\">tom_int</span> <span class=\"identifier\">numerator</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">tom_rational</span><span class=\"special\">&amp;);</span>\n<span class=\"identifier\">tom_int</span> <span class=\"identifier\">denominator</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">tom_rational</span><span class=\"special\">&amp;);</span>\n</pre>\n<p>\n          which return the numerator and denominator of the number.\n        </p>\n<p>\n          Things you should know when using this type:\n        </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n              Default constructed <code class=\"computeroutput\"><span class=\"identifier\">tom_rational</span></code>s\n              have the value zero (this the inherited Boost.Rational behavior).\n            </li>\n<li class=\"listitem\">\n              Division by zero results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">overflow_error</span></code>\n              being thrown.\n            </li>\n<li class=\"listitem\">\n              Conversion from a string results in a <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">runtime_error</span></code>\n              being thrown if the string can not be interpreted as a valid rational\n              number.\n            </li>\n<li class=\"listitem\">\n              No changes are made to <a href=\"http://libtom.net\" target=\"_top\">libtommath</a>'s\n              global state, so this type can safely coexist with other <a href=\"http://libtom.net\" target=\"_top\">libtommath</a>\n              code.\n            </li>\n<li class=\"listitem\">\n              Performance of this type has been found to be pretty poor - this need\n              further investigation - but it appears that Boost.Rational needs some\n              improvement in this area.\n            </li>\n</ul></div>\n<h6>\n<a name=\"boost_multiprecision.tut.rational.tommath_rational0.h0\"></a>\n          <span class=\"phrase\"><a name=\"boost_multiprecision.tut.rational.tommath_rational0.example\"></a></span><a class=\"link\" href=\"tommath_rational0.html#boost_multiprecision.tut.rational.tommath_rational0.example\">Example:</a>\n        </h6>\n<pre class=\"programlisting\"><span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">/</span><span class=\"identifier\">multiprecision</span><span class=\"special\">/</span><span class=\"identifier\">tommath</span><span class=\"special\">.</span><span class=\"identifier\">hpp</span><span class=\"special\">&gt;</span>\n<span class=\"preprocessor\">#include</span> <span class=\"special\">&lt;</span><span class=\"identifier\">iostream</span><span class=\"special\">&gt;</span>\n\n<span class=\"keyword\">int</span> <span class=\"identifier\">main</span><span class=\"special\">()</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">using</span> <span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">tom_rational</span> <span class=\"identifier\">v</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n\n   <span class=\"comment\">// Do some arithmetic:</span>\n   <span class=\"keyword\">for</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">i</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">;</span> <span class=\"identifier\">i</span> <span class=\"special\">&lt;=</span> <span class=\"number\">1000</span><span class=\"special\">;</span> <span class=\"special\">++</span><span class=\"identifier\">i</span><span class=\"special\">)</span>\n      <span class=\"identifier\">v</span> <span class=\"special\">*=</span> <span class=\"identifier\">i</span><span class=\"special\">;</span>\n   <span class=\"identifier\">v</span> <span class=\"special\">/=</span> <span class=\"number\">10</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">v</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// prints 1000! / 10</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">numerator</span><span class=\"special\">(</span><span class=\"identifier\">v</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">denominator</span><span class=\"special\">(</span><span class=\"identifier\">v</span><span class=\"special\">)</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span>\n\n   <span class=\"identifier\">tom_rational</span> <span class=\"identifier\">w</span><span class=\"special\">(</span><span class=\"number\">2</span><span class=\"special\">,</span> <span class=\"number\">3</span><span class=\"special\">);</span> <span class=\"comment\">// Component wise constructor</span>\n   <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">cout</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">w</span> <span class=\"special\">&lt;&lt;</span> <span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">endl</span><span class=\"special\">;</span> <span class=\"comment\">// prints 2/3</span>\n\n   <span class=\"keyword\">return</span> <span class=\"number\">0</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"tommath_rational.html\"><img src=\"../../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../rational.html\"><img src=\"../../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../../index.html\"><img src=\"../../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"rational_adaptor.html\"><img src=\"../../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/rational.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Rational Number Types</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"complex/complex_adaptor.html\" title=\"complex_adaptor\">\n<link rel=\"next\" href=\"rational/cpp_rational.html\" title=\"cpp_rational\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"complex/complex_adaptor.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"rational/cpp_rational.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.rational\"></a><a class=\"link\" href=\"rational.html\" title=\"Rational Number Types\">Rational Number Types</a>\n</h3></div></div></div>\n<div class=\"toc\"><dl class=\"toc\">\n<dt><span class=\"section\"><a href=\"rational/cpp_rational.html\">cpp_rational</a></span></dt>\n<dt><span class=\"section\"><a href=\"rational/gmp_rational.html\">gmp_rational</a></span></dt>\n<dt><span class=\"section\"><a href=\"rational/tommath_rational.html\">tommath_rational</a></span></dt>\n<dt><span class=\"section\"><a href=\"rational/tommath_rational0.html\">tommath_rational</a></span></dt>\n<dt><span class=\"section\"><a href=\"rational/rational_adaptor.html\">rational_adaptor</a></span></dt>\n</dl></div>\n<p>\n        The following back-ends provide rational number arithmetic:\n      </p>\n<div class=\"informaltable\"><table class=\"table\">\n<colgroup>\n<col>\n<col>\n<col>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend Type\n                </p>\n              </th>\n<th>\n                <p>\n                  Header\n                </p>\n              </th>\n<th>\n                <p>\n                  Radix\n                </p>\n              </th>\n<th>\n                <p>\n                  Dependencies\n                </p>\n              </th>\n<th>\n                <p>\n                  Pros\n                </p>\n              </th>\n<th>\n                <p>\n                  Cons\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">cpp_rational</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  boost/multiprecision/cpp_int.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  2\n                </p>\n              </td>\n<td>\n                <p>\n                  None\n                </p>\n              </td>\n<td>\n                <p>\n                  An all C++ Boost-licensed implementation.\n                </p>\n              </td>\n<td>\n                <p>\n                  Slower than <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">gmp_rational</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  boost/multiprecision/gmp.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  2\n                </p>\n              </td>\n<td>\n                <p>\n                  <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>\n                </p>\n              </td>\n<td>\n                <p>\n                  Very fast and efficient back-end.\n                </p>\n              </td>\n<td>\n                <p>\n                  Dependency on GNU licensed <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>\n                  library.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">tommath_rational</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  boost/multiprecision/tommath.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  2\n                </p>\n              </td>\n<td>\n                <p>\n                  <a href=\"http://libtom.net\" target=\"_top\">libtommath</a>\n                </p>\n              </td>\n<td>\n                <p>\n                  All C/C++ implementation that's Boost Software Licence compatible.\n                </p>\n              </td>\n<td>\n                <p>\n                  Slower than <a href=\"http://gmplib.org\" target=\"_top\">GMP</a>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">rational_adaptor</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  boost/multiprecision/rational_adaptor.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  N/A\n                </p>\n              </td>\n<td>\n                <p>\n                  none\n                </p>\n              </td>\n<td>\n                <p>\n                  All C++ adaptor that allows any integer back-end type to be used\n                  as a rational type.\n                </p>\n              </td>\n<td>\n                <p>\n                  Requires an underlying integer back-end type.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">rational</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  boost/rational.hpp\n                </p>\n              </td>\n<td>\n                <p>\n                  N/A\n                </p>\n              </td>\n<td>\n                <p>\n                  None\n                </p>\n              </td>\n<td>\n                <p>\n                  A C++ rational number type that can used with any <code class=\"computeroutput\"><span class=\"identifier\">number</span></code> integer type.\n                </p>\n              </td>\n<td>\n                <p>\n                  The expression templates used by <code class=\"computeroutput\"><span class=\"identifier\">number</span></code>\n                  end up being \"hidden\" inside <code class=\"computeroutput\"><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">rational</span></code>:\n                  performance may well suffer as a result.\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"complex/complex_adaptor.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"rational/cpp_rational.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/rounding.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Rounding Rules for Conversions</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"import_export.html\" title=\"Importing and Exporting Data to and from cpp_int and cpp_bin_float\">\n<link rel=\"next\" href=\"mixed.html\" title=\"Mixed Precision Arithmetic\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"import_export.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"mixed.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.rounding\"></a><a class=\"link\" href=\"rounding.html\" title=\"Rounding Rules for Conversions\">Rounding Rules for\n      Conversions</a>\n</h3></div></div></div>\n<p>\n        As a general rule, all conversions between unrelated types are performed\n        using basic arithmetic operations, therefore conversions are either exact,\n        or follow the same rounding rules as arithmetic for the type in question.\n      </p>\n<p>\n        The following table summarises the situation for conversions from native\n        types:\n      </p>\n<div class=\"informaltable\"><table class=\"table\">\n<colgroup>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Backend\n                </p>\n              </th>\n<th>\n                <p>\n                  Rounding Rules\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  <a class=\"link\" href=\"ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>\n                </p>\n              </td>\n<td>\n                <p>\n                  Conversions from integer types are exact if the target has sufficient\n                  precision, otherwise they truncate to the first 2^MaxBits bits\n                  (modulo arithmetic). Conversions from floating-point types are\n                  truncating to the nearest integer.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <a class=\"link\" href=\"ints/gmp_int.html\" title=\"gmp_int\">gmp_int</a>\n                </p>\n              </td>\n<td>\n                <p>\n                  Conversions are performed by the GMP library except for conversion\n                  from <code class=\"computeroutput\"><span class=\"keyword\">long</span> <span class=\"keyword\">double</span></code>\n                  which is truncating.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <a class=\"link\" href=\"ints/tom_int.html\" title=\"tom_int\">tom_int</a>\n                </p>\n              </td>\n<td>\n                <p>\n                  Conversions from floating-point types are truncating, all others\n                  are performed by libtommath and are exact.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <a class=\"link\" href=\"floats/gmp_float.html\" title=\"gmp_float\">gmp_float</a>\n                </p>\n              </td>\n<td>\n                <p>\n                  Conversions are performed by the GMP library except for conversion\n                  from <code class=\"computeroutput\"><span class=\"keyword\">long</span> <span class=\"keyword\">double</span></code>\n                  which should be exact provided the target type has as much precision\n                  as a <code class=\"computeroutput\"><span class=\"keyword\">long</span> <span class=\"keyword\">double</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <a class=\"link\" href=\"floats/mpfr_float.html\" title=\"mpfr_float\">mpfr_float</a>\n                </p>\n              </td>\n<td>\n                <p>\n                  All conversions are performed by the underlying MPFR library.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <a class=\"link\" href=\"floats/cpp_dec_float.html\" title=\"cpp_dec_float\">cpp_dec_float</a>\n                </p>\n              </td>\n<td>\n                <p>\n                  All conversions are performed using basic arithmetic operations\n                  and are truncating.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <a class=\"link\" href=\"rational/gmp_rational.html\" title=\"gmp_rational\">gmp_rational</a>\n                </p>\n              </td>\n<td>\n                <p>\n                  See <a class=\"link\" href=\"ints/gmp_int.html\" title=\"gmp_int\">gmp_int</a>\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <a class=\"link\" href=\"rational/cpp_rational.html\" title=\"cpp_rational\">cpp_rational</a>\n                </p>\n              </td>\n<td>\n                <p>\n                  See <a class=\"link\" href=\"ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <a class=\"link\" href=\"rational/tommath_rational.html\" title=\"tommath_rational\">tommath_rational</a>\n                </p>\n              </td>\n<td>\n                <p>\n                  See <a class=\"link\" href=\"ints/tom_int.html\" title=\"tom_int\">tom_int</a>\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"import_export.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"mixed.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/serial.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Boost.Serialization Support</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"gen_int.html\" title=\"Generic Integer Operations\">\n<link rel=\"next\" href=\"limits.html\" title=\"Numeric Limits\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"gen_int.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"limits.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.serial\"></a><a class=\"link\" href=\"serial.html\" title=\"Boost.Serialization Support\">Boost.Serialization\n      Support</a>\n</h3></div></div></div>\n<p>\n        Support for serialization comes in two forms:\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Classes <a class=\"link\" href=\"../ref/number.html\" title=\"number\">number</a>,\n            <a class=\"link\" href=\"misc/debug_adaptor.html\" title=\"debug_adaptor\">debug_adaptor</a>,\n            <a class=\"link\" href=\"misc/logged_adaptor.html\" title=\"logged_adaptor\">logged_adaptor</a>\n            and <a class=\"link\" href=\"rational/rational_adaptor.html\" title=\"rational_adaptor\">rational_adaptor</a>\n            have \"pass through\" serialization support which requires the\n            underlying backend to be serializable.\n          </li>\n<li class=\"listitem\">\n            Backends <a class=\"link\" href=\"ints/cpp_int.html\" title=\"cpp_int\">cpp_int</a>,\n            <a class=\"link\" href=\"floats/cpp_bin_float.html\" title=\"cpp_bin_float\">cpp_bin_float</a>,\n            <a class=\"link\" href=\"floats/cpp_dec_float.html\" title=\"cpp_dec_float\">cpp_dec_float</a>\n            and <a class=\"link\" href=\"floats/float128.html\" title=\"float128\">float128</a>\n            have full support for Boost.Serialization.\n          </li>\n</ul></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"gen_int.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"limits.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut/variable.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Variable Precision Arithmetic</title>\n<link rel=\"stylesheet\" href=\"../../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../tut.html\" title=\"Tutorial\">\n<link rel=\"prev\" href=\"mixed.html\" title=\"Mixed Precision Arithmetic\">\n<link rel=\"next\" href=\"gen_int.html\" title=\"Generic Integer Operations\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"mixed.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"gen_int.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h3 class=\"title\">\n<a name=\"boost_multiprecision.tut.variable\"></a><a class=\"link\" href=\"variable.html\" title=\"Variable Precision Arithmetic\">Variable Precision\n      Arithmetic</a>\n</h3></div></div></div>\n<p>\n        There are a number of types in this library whose precision can be changed\n        at runtime, the purpose of this section is to explain how these types interoperate\n        with each other when two variables of the same type can have different precisions.\n      </p>\n<p>\n        The main variable precision types being discussed here are:\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            <a class=\"link\" href=\"floats/gmp_float.html\" title=\"gmp_float\">gmp_float</a>.\n          </li>\n<li class=\"listitem\">\n            <a class=\"link\" href=\"floats/mpfr_float.html\" title=\"mpfr_float\">mpfr_float</a>.\n          </li>\n<li class=\"listitem\">\n            <a class=\"link\" href=\"interval/mpfi.html\" title=\"mpfi_float\">mpfi_float</a>.\n          </li>\n<li class=\"listitem\">\n            <a class=\"link\" href=\"complex/mpc_complex.html\" title=\"mpc_complex\">mpc_complex</a>.\n          </li>\n</ul></div>\n<p>\n        Functions for setting the current working precision are as follows, with\n        type <code class=\"computeroutput\"><span class=\"identifier\">Num</span></code> being one of <code class=\"computeroutput\"><span class=\"identifier\">mpf_float</span></code>, <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">mpfi_float</span></code> or <code class=\"computeroutput\"><span class=\"identifier\">mpc_float</span></code>, and <code class=\"computeroutput\"><span class=\"identifier\">val</span></code>\n        being an object of type <code class=\"computeroutput\"><span class=\"identifier\">Num</span></code>:\n      </p>\n<div class=\"informaltable\"><table class=\"table\">\n<colgroup>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Expression\n                </p>\n              </th>\n<th>\n                <p>\n                  Returns\n                </p>\n              </th>\n<th>\n                <p>\n                  Comments\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">val</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">()</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">unsigned</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns the precision of variable <code class=\"computeroutput\"><span class=\"identifier\">val</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">val</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">(</span><span class=\"identifier\">n</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets the precision of variable <code class=\"computeroutput\"><span class=\"identifier\">val</span></code>\n                  to <code class=\"computeroutput\"><span class=\"identifier\">n</span></code> decimal places.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">Num</span><span class=\"special\">::</span><span class=\"identifier\">default_precision</span><span class=\"special\">()</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">unsigned</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns the current global default precision, in decimal digits\n                  - this is the precision that all new threads will inherit.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">Num</span><span class=\"special\">::</span><span class=\"identifier\">thread_default_precision</span><span class=\"special\">()</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">unsigned</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns the current thread default precision, in decimal digits\n                  - this is the precision that the current thread will use when constructing\n                  new objects of type <code class=\"computeroutput\"><span class=\"identifier\">Num</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">Num</span><span class=\"special\">::</span><span class=\"identifier\">default_precision</span><span class=\"special\">(</span><span class=\"identifier\">Digits10</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets the global default precision to Digits10 decimal places, this\n                  is the precision that all new threads will inherit, also sets the\n                  working precision for the current thread.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">Num</span><span class=\"special\">::</span><span class=\"identifier\">thread_default_precision</span><span class=\"special\">(</span><span class=\"identifier\">Digits10</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets the default precision for the current thread to Digits10 decimal\n                  places.\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n<p>\n        We must now consider what happens in an expression such as:\n      </p>\n<pre class=\"programlisting\"><span class=\"identifier\">variable</span> <span class=\"special\">=</span> <span class=\"identifier\">some_expression</span><span class=\"special\">;</span>\n</pre>\n<p>\n        There are basically 2 options here when the precision of <code class=\"computeroutput\"><span class=\"identifier\">variable</span></code>\n        and <code class=\"computeroutput\"><span class=\"identifier\">some_expression</span></code> differ:\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            We can preserve the precision of the source, so that post assignment,\n            source and target are equal.\n          </li>\n<li class=\"listitem\">\n            We can preserve the precision of the target, so that the precision of\n            <code class=\"computeroutput\"><span class=\"identifier\">variable</span></code> doesn't change.\n          </li>\n</ul></div>\n<p>\n        In addition we must consider what happens if <code class=\"computeroutput\"><span class=\"identifier\">some_expression</span></code>\n        contains types other than <code class=\"computeroutput\"><span class=\"identifier\">Num</span></code>.\n      </p>\n<p>\n        The behaviour of the library is controlled by the following enumerated values:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">namespace</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span> <span class=\"special\">{</span>\n\n   <span class=\"keyword\">enum</span> <span class=\"keyword\">struct</span> <span class=\"identifier\">variable_precision_options</span>\n   <span class=\"special\">{</span>\n      <span class=\"identifier\">assume_uniform_precision</span> <span class=\"special\">=</span> <span class=\"special\">-</span><span class=\"number\">1</span><span class=\"special\">,</span>\n      <span class=\"identifier\">preserve_target_precision</span> <span class=\"special\">=</span> <span class=\"number\">0</span><span class=\"special\">,</span>\n      <span class=\"identifier\">preserve_source_precision</span> <span class=\"special\">=</span> <span class=\"number\">1</span><span class=\"special\">,</span>\n      <span class=\"identifier\">preserve_component_precision</span> <span class=\"special\">=</span> <span class=\"number\">2</span><span class=\"special\">,</span>\n      <span class=\"identifier\">preserve_related_precision</span> <span class=\"special\">=</span> <span class=\"number\">3</span><span class=\"special\">,</span>\n      <span class=\"identifier\">preserve_all_precision</span> <span class=\"special\">=</span> <span class=\"number\">4</span><span class=\"special\">,</span>\n   <span class=\"special\">};</span>\n\n<span class=\"special\">}</span>\n</pre>\n<p>\n        The enumerated values have the following meanings, with <code class=\"computeroutput\"><span class=\"identifier\">preserve_related_precision</span></code>\n        being the default.\n      </p>\n<div class=\"informaltable\"><table class=\"table\">\n<colgroup>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Value\n                </p>\n              </th>\n<th>\n                <p>\n                  Meaning\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  assume_uniform_precision\n                </p>\n              </td>\n<td>\n                <p>\n                  This is the most efficient option - it simply assumes that all\n                  variables in the current thread have the same precision, and ignores\n                  the precision of all other types. Should these assumptions not\n                  hold, then strange unexpected things may happen. No checks are\n                  made to ensure that all variables really are of the same precision.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  preserve_target_precision\n                </p>\n              </td>\n<td>\n                <p>\n                  All expressions are evaluated at the precision of the highest precision\n                  variable within the expression, and then rounded to the precision\n                  of the target variable upon assignment. The precision of other\n                  types (including related or component types - see preserve_component_precision/preserve_related_precision)\n                  contained within the expression are ignored. This option has the\n                  unfortunate side effect, that moves may become full deep copies.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  preserve_source_precision\n                </p>\n              </td>\n<td>\n                <p>\n                  All expressions are evaluated at the precision of the highest precision\n                  variable within the expression, and that precision is preserved\n                  upon assignment. The precision of other types (including related\n                  or component types - see preserve_component_precision/preserve_related_precision)\n                  contained within the expression are ignored. Moves, are true moves\n                  not copies.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  preserve_component_precision\n                </p>\n              </td>\n<td>\n                <p>\n                  All expressions are evaluated at the precision of the highest precision\n                  variable within the expression, and that precision is preserved\n                  upon assignment. If the expression contains component types then\n                  these are also considered when calculating the precision of the\n                  expression. Component types are the types which make up the two\n                  components of the number when dealing with interval or complex\n                  numbers. They are the same type as <code class=\"computeroutput\"><span class=\"identifier\">Num</span><span class=\"special\">::</span><span class=\"identifier\">value_type</span></code>.\n                  Moves, are true moves not copies.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  preserve_related_precision\n                </p>\n              </td>\n<td>\n                <p>\n                  All expressions are evaluated at the precision of the highest precision\n                  variable within the expression, and that precision is preserved\n                  upon assignment. If the expression contains component types then\n                  these are also considered when calculating the precision of the\n                  expression. In addition to component types, all related types are\n                  considered when evaluating the precision of the expression. Related\n                  types are considered to be instantiations of the same template,\n                  but with different parameters. So for example <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float_100</span></code>\n                  would be a related type to <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float</span></code>,\n                  and all expressions containing an <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float_100</span></code>\n                  variable would have at least 100 decimal digits of precision when\n                  evaluated as an <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float</span></code>\n                  expression. Moves, are true moves not copies.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  preserve_all_precision\n                </p>\n              </td>\n<td>\n                <p>\n                  All expressions are evaluated at the precision of the highest precision\n                  variable within the expression, and that precision is preserved\n                  upon assignment. In addition to component and related types, all\n                  types are considered when evaluating the precision of the expression.\n                  For example, if the expression contains an <code class=\"computeroutput\"><span class=\"identifier\">mpz_int</span></code>,\n                  then the precision of the expression will be sufficient to store\n                  all of the digits in the integer unchanged. This option should\n                  generally be used with extreme caution, as it can easily cause\n                  unintentional precision inflation. Moves, are true moves not copies.\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n<p>\n        Note how the values <code class=\"computeroutput\"><span class=\"identifier\">preserve_source_precision</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">preserve_component_precision</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">preserve_related_precision</span></code>\n        and <code class=\"computeroutput\"><span class=\"identifier\">preserve_all_precision</span></code>\n        form a hierarchy, with each adding progressively more types to the one before\n        to the list of types that are considered when calculating the precision of\n        an expression:\n      </p>\n<div class=\"informaltable\"><table class=\"table\">\n<colgroup>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Value\n                </p>\n              </th>\n<th>\n                <p>\n                  Considers types (lowest in hierarchy first, each builds on the\n                  one before)\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  preserve_source_precision\n                </p>\n              </td>\n<td>\n                <p>\n                  Considers types the same as the result in the expression only.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  preserve_component_precision\n                </p>\n              </td>\n<td>\n                <p>\n                  Also considers component types, ie <code class=\"computeroutput\"><span class=\"identifier\">Num</span><span class=\"special\">::</span><span class=\"identifier\">value_type</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  preserve_related_precision\n                </p>\n              </td>\n<td>\n                <p>\n                  Also considers all instantiations of the backend-template, not\n                  just the same type as the result.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  preserve_all_precision\n                </p>\n              </td>\n<td>\n                <p>\n                  Considers everything, including completely unrelated types such\n                  as (possibly arbitrary precision) integers.\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n<p>\n        As with working precision, the above options can be set or queried on either\n        a global or thread-local level, note that these options can not be set on\n        a per-variable basis since they control whole expressions, not individual\n        variables:\n      </p>\n<div class=\"informaltable\"><table class=\"table\">\n<colgroup>\n<col>\n<col>\n<col>\n</colgroup>\n<thead><tr>\n<th>\n                <p>\n                  Expression\n                </p>\n              </th>\n<th>\n                <p>\n                  Returns\n                </p>\n              </th>\n<th>\n                <p>\n                  Comments\n                </p>\n              </th>\n</tr></thead>\n<tbody>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">Num</span><span class=\"special\">::</span><span class=\"identifier\">default_variable_precision_options</span><span class=\"special\">()</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">variable_precision_options</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns the current global default options, these are the options\n                  that all new threads will inherit.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">Num</span><span class=\"special\">::</span><span class=\"identifier\">thread_default_variable_precision_options</span><span class=\"special\">()</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">variable_precision_options</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Returns the options in use in the current thread when evaluating\n                  expressions containing type <code class=\"computeroutput\"><span class=\"identifier\">Num</span></code>.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">Num</span><span class=\"special\">::</span><span class=\"identifier\">default_variable_precision_options</span><span class=\"special\">(</span><span class=\"identifier\">opts</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets the global default options to <code class=\"computeroutput\"><span class=\"identifier\">opts</span></code>\n                  which must be one of the enumerated <code class=\"computeroutput\"><span class=\"identifier\">variable_precision_options</span></code>\n                  values, this is setting that all new threads will inherit, also\n                  sets the options for the current thread.\n                </p>\n              </td>\n</tr>\n<tr>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"identifier\">Num</span><span class=\"special\">::</span><span class=\"identifier\">thread_default_variable_precision_options</span><span class=\"special\">(</span><span class=\"identifier\">opts</span><span class=\"special\">)</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  <code class=\"computeroutput\"><span class=\"keyword\">void</span></code>\n                </p>\n              </td>\n<td>\n                <p>\n                  Sets the options for the current thread to <code class=\"computeroutput\"><span class=\"identifier\">opts</span></code>\n                  which must be one of the <code class=\"computeroutput\"><span class=\"identifier\">variable_precision_options</span></code>\n                  enumerated values.\n                </p>\n              </td>\n</tr>\n</tbody>\n</table></div>\n<h5>\n<a name=\"boost_multiprecision.tut.variable.h0\"></a>\n        <span class=\"phrase\"><a name=\"boost_multiprecision.tut.variable.examples\"></a></span><a class=\"link\" href=\"variable.html#boost_multiprecision.tut.variable.examples\">Examples</a>\n      </h5>\n<p>\n        All our precision changing examples are based around <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float</span></code>.\n        However, in order to make running this example a little easier to debug,\n        we'll use <code class=\"computeroutput\"><span class=\"identifier\">debug_adaptor</span></code> throughout\n        so that the values of all variables can be displayed in your debugger of\n        choice:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">using</span> <span class=\"identifier\">mp_t</span> <span class=\"special\">=</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">debug_adaptor_t</span><span class=\"special\">&lt;</span><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">mpfr_float</span><span class=\"special\">&gt;;</span>\n</pre>\n<p>\n        Our first example will investigate calculating the Bessel J function via\n        it's well known series representation:\n      </p>\n<p>\n        <span class=\"inlinemediaobject\"><object type=\"image/svg+xml\" data=\"../../../bessel2.svg\"></object></span>\n      </p>\n<p>\n        This simple series suffers from catastrophic cancellation error near the\n        roots of the function, so we'll investigate slowly increasing the precision\n        of the calculation until we get the result to N-decimal places. We'll begin\n        by defining a function to calculate the series for Bessel J, the details\n        of which we'll leave in the source code:\n      </p>\n<pre class=\"programlisting\"><span class=\"identifier\">mp_t</span> <span class=\"identifier\">calculate_bessel_J_as_series</span><span class=\"special\">(</span><span class=\"identifier\">mp_t</span> <span class=\"identifier\">x</span><span class=\"special\">,</span> <span class=\"identifier\">mp_t</span> <span class=\"identifier\">v</span><span class=\"special\">,</span> <span class=\"identifier\">mp_t</span><span class=\"special\">*</span> <span class=\"identifier\">err</span><span class=\"special\">)</span>\n</pre>\n<p>\n        Next come some simple helper classes, these allow us to modify the current\n        precision and precision-options via scoped objects which will put everything\n        back as it was at the end. We'll begin with the class to modify the working\n        precision:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">struct</span> <span class=\"identifier\">scoped_mpfr_precision</span>\n<span class=\"special\">{</span>\n   <span class=\"keyword\">unsigned</span> <span class=\"identifier\">saved_digits10</span><span class=\"special\">;</span>\n   <span class=\"identifier\">scoped_mpfr_precision</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">digits10</span><span class=\"special\">)</span> <span class=\"special\">:</span> <span class=\"identifier\">saved_digits10</span><span class=\"special\">(</span><span class=\"identifier\">mp_t</span><span class=\"special\">::</span><span class=\"identifier\">thread_default_precision</span><span class=\"special\">())</span>\n   <span class=\"special\">{</span>\n      <span class=\"identifier\">mp_t</span><span class=\"special\">::</span><span class=\"identifier\">thread_default_precision</span><span class=\"special\">(</span><span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n   <span class=\"special\">}</span>\n   <span class=\"special\">~</span><span class=\"identifier\">scoped_mpfr_precision</span><span class=\"special\">()</span>\n   <span class=\"special\">{</span>\n      <span class=\"identifier\">mp_t</span><span class=\"special\">::</span><span class=\"identifier\">thread_default_precision</span><span class=\"special\">(</span><span class=\"identifier\">saved_digits10</span><span class=\"special\">);</span>\n   <span class=\"special\">}</span>\n   <span class=\"keyword\">void</span> <span class=\"identifier\">reset</span><span class=\"special\">(</span><span class=\"keyword\">unsigned</span> <span class=\"identifier\">digits10</span><span class=\"special\">)</span>\n   <span class=\"special\">{</span>\n      <span class=\"identifier\">mp_t</span><span class=\"special\">::</span><span class=\"identifier\">thread_default_precision</span><span class=\"special\">(</span><span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n   <span class=\"special\">}</span>\n   <span class=\"keyword\">void</span> <span class=\"identifier\">reset</span><span class=\"special\">()</span>\n   <span class=\"special\">{</span>\n      <span class=\"identifier\">mp_t</span><span class=\"special\">::</span><span class=\"identifier\">thread_default_precision</span><span class=\"special\">(</span><span class=\"identifier\">saved_digits10</span><span class=\"special\">);</span>\n   <span class=\"special\">}</span>\n<span class=\"special\">};</span>\n</pre>\n<p>\n        And a second class to modify the precision options:\n      </p>\n<pre class=\"programlisting\"><span class=\"keyword\">struct</span> <span class=\"identifier\">scoped_mpfr_precision_options</span>\n<span class=\"special\">{</span>\n   <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">variable_precision_options</span> <span class=\"identifier\">saved_options</span><span class=\"special\">;</span>\n   <span class=\"identifier\">scoped_mpfr_precision_options</span><span class=\"special\">(</span><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">variable_precision_options</span> <span class=\"identifier\">opts</span><span class=\"special\">)</span> <span class=\"special\">:</span> <span class=\"identifier\">saved_options</span><span class=\"special\">(</span><span class=\"identifier\">mp_t</span><span class=\"special\">::</span><span class=\"identifier\">thread_default_variable_precision_options</span><span class=\"special\">())</span>\n   <span class=\"special\">{</span>\n      <span class=\"identifier\">mp_t</span><span class=\"special\">::</span><span class=\"identifier\">thread_default_variable_precision_options</span><span class=\"special\">(</span><span class=\"identifier\">opts</span><span class=\"special\">);</span>\n   <span class=\"special\">}</span>\n   <span class=\"special\">~</span><span class=\"identifier\">scoped_mpfr_precision_options</span><span class=\"special\">()</span>\n   <span class=\"special\">{</span>\n      <span class=\"identifier\">mp_t</span><span class=\"special\">::</span><span class=\"identifier\">thread_default_variable_precision_options</span><span class=\"special\">(</span><span class=\"identifier\">saved_options</span><span class=\"special\">);</span>\n   <span class=\"special\">}</span>\n   <span class=\"keyword\">void</span> <span class=\"identifier\">reset</span><span class=\"special\">(</span><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">variable_precision_options</span> <span class=\"identifier\">opts</span><span class=\"special\">)</span>\n   <span class=\"special\">{</span>\n      <span class=\"identifier\">mp_t</span><span class=\"special\">::</span><span class=\"identifier\">thread_default_variable_precision_options</span><span class=\"special\">(</span><span class=\"identifier\">opts</span><span class=\"special\">);</span>\n   <span class=\"special\">}</span>\n<span class=\"special\">};</span>\n</pre>\n<p>\n        We can now begin writing a function to calculate J<sub>v</sub>(z) to a specified precision.\n        In order to keep the logic as simple as possible, we'll adopt a <span class=\"emphasis\"><em>uniform\n        precision computing</em></span> approach, which is to say, within the body\n        of the function, all variables are always at the same working precision.\n      </p>\n<pre class=\"programlisting\"><span class=\"identifier\">mp_t</span> <span class=\"identifier\">Bessel_J_to_precision</span><span class=\"special\">(</span><span class=\"identifier\">mp_t</span> <span class=\"identifier\">v</span><span class=\"special\">,</span> <span class=\"identifier\">mp_t</span> <span class=\"identifier\">x</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">digits10</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Begin by backing up digits10:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"keyword\">unsigned</span> <span class=\"identifier\">saved_digits10</span> <span class=\"special\">=</span> <span class=\"identifier\">digits10</span><span class=\"special\">;</span>\n   <span class=\"comment\">// </span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Start by defining 2 scoped objects to control precision and associated options.</span>\n   <span class=\"comment\">// We'll begin by setting the working precision to the required target precision,</span>\n   <span class=\"comment\">// and since all variables will always be of uniform precision, we can tell the</span>\n   <span class=\"comment\">// library to ignore all precision control by setting variable_precision_options::assume_uniform_precision:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">scoped_mpfr_precision</span>           <span class=\"identifier\">scoped</span><span class=\"special\">(</span><span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n   <span class=\"identifier\">scoped_mpfr_precision_options</span>   <span class=\"identifier\">scoped_opts</span><span class=\"special\">(</span><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">variable_precision_options</span><span class=\"special\">::</span><span class=\"identifier\">assume_uniform_precision</span><span class=\"special\">);</span>\n\n   <span class=\"identifier\">mp_t</span>            <span class=\"identifier\">result</span><span class=\"special\">;</span>\n   <span class=\"identifier\">mp_t</span>            <span class=\"identifier\">current_error</span><span class=\"special\">{</span><span class=\"number\">1</span><span class=\"special\">};</span>\n   <span class=\"identifier\">mp_t</span>            <span class=\"identifier\">target_error</span> <span class=\"special\">{</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">pow</span><span class=\"special\">(</span><span class=\"number\">10.</span><span class=\"special\">,</span> <span class=\"special\">-</span><span class=\"keyword\">static_cast</span><span class=\"special\">&lt;</span><span class=\"keyword\">int</span><span class=\"special\">&gt;(</span><span class=\"identifier\">digits10</span><span class=\"special\">))};</span>\n\n   <span class=\"keyword\">while</span> <span class=\"special\">(</span><span class=\"identifier\">target_error</span> <span class=\"special\">&lt;</span> <span class=\"identifier\">current_error</span><span class=\"special\">)</span>\n   <span class=\"special\">{</span>\n      <span class=\"comment\">//</span>\n      <span class=\"comment\">// Everything must be of uniform precision in here, including</span>\n      <span class=\"comment\">// our input values, so we'll begin by setting their precision:</span>\n      <span class=\"comment\">//</span>\n      <span class=\"identifier\">v</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">(</span><span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n      <span class=\"identifier\">x</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">(</span><span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n      <span class=\"comment\">//</span>\n      <span class=\"comment\">// Calculate our approximation and error estimate:</span>\n      <span class=\"comment\">//</span>\n      <span class=\"identifier\">result</span> <span class=\"special\">=</span> <span class=\"identifier\">calculate_bessel_J_as_series</span><span class=\"special\">(</span><span class=\"identifier\">x</span><span class=\"special\">,</span> <span class=\"identifier\">v</span><span class=\"special\">,</span> <span class=\"special\">&amp;</span><span class=\"identifier\">current_error</span><span class=\"special\">);</span>\n      <span class=\"comment\">//</span>\n      <span class=\"comment\">// If the error from the current approximation is too high we'll need </span>\n      <span class=\"comment\">// to loop round and try again, in this case we use the simple heuristic</span>\n      <span class=\"comment\">// of doubling the working precision with each loop.  More refined approaches</span>\n      <span class=\"comment\">// are certainly available:</span>\n      <span class=\"comment\">//</span>\n      <span class=\"identifier\">digits10</span> <span class=\"special\">*=</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n      <span class=\"identifier\">scoped</span><span class=\"special\">.</span><span class=\"identifier\">reset</span><span class=\"special\">(</span><span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n   <span class=\"special\">}</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// We now have an accurate result, but it may have too many digits,</span>\n   <span class=\"comment\">// so lets round the result to the requested precision now:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">result</span><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">(</span><span class=\"identifier\">saved_digits10</span><span class=\"special\">);</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// To maintain uniform precision during function return, lets</span>\n   <span class=\"comment\">// reset the default precision now:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">scoped</span><span class=\"special\">.</span><span class=\"identifier\">reset</span><span class=\"special\">(</span><span class=\"identifier\">saved_digits10</span><span class=\"special\">);</span>\n   <span class=\"keyword\">return</span> <span class=\"identifier\">result</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n        So far, this is all well and good, but there is still a potential trap for\n        the unwary here, when the function returns the variable may be copied/moved\n        either once or twice depending on whether the compiler implements the named-return-value\n        optimisation. And since this all happens outside the scope of this function,\n        the precision of the returned value may get unexpected changed - and potentially\n        with different behaviour once optimisations are turned on!\n      </p>\n<p>\n        To prevent these kinds of unintended consequences, a function returning a\n        value with specified precision must either:\n      </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n            Be called in a <span class=\"emphasis\"><em>uniform-precision-environment</em></span>, with\n            the current working precision, the same as both the returned value and\n            the variable to which the result will be assigned.\n          </li>\n<li class=\"listitem\">\n            Be called in an environment that has one of the following set:\n            <div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: circle; \">\n<li class=\"listitem\">\n                  variable_precision_options::preserve_source_precision\n                </li>\n<li class=\"listitem\">\n                  variable_precision_options::preserve_component_precision\n                </li>\n<li class=\"listitem\">\n                  variable_precision_options::preserve_related_precision\n                </li>\n<li class=\"listitem\">\n                  variable_precision_options::preserve_all_precision\n                </li>\n</ul></div>\n          </li>\n</ul></div>\n<p>\n        In the case of our example program, we use a <span class=\"emphasis\"><em>uniform-precision-environment</em></span>\n        and call the function with the value of <code class=\"computeroutput\"><span class=\"number\">6541389046624379</span>\n        <span class=\"special\">/</span> <span class=\"number\">562949953421312</span></code>\n        which happens to be near a root of J<sub>v</sub>(x) and requires a high-precision calculation\n        to obtain low relative error in the result of <code class=\"computeroutput\"><span class=\"special\">-</span><span class=\"number\">9.31614245636402072613249153246313221710284959883647822724e-15</span></code>.\n      </p>\n<p>\n        You will note in the example we have so far that there are a number of unnecessary\n        temporaries created: we pass values to our functions by value, and we call\n        the <code class=\"computeroutput\"><span class=\"special\">.</span><span class=\"identifier\">precision</span><span class=\"special\">()</span></code> member function to change the working precision\n        of some variables - something that requires a reallocation internally. We'll\n        now make our example just a little more efficient, by removing these temporaries,\n        though in the process, we'll need just a little more control over how mixed-precision\n        arithmetic behaves.\n      </p>\n<p>\n        It's tempting to simply define the function that calculates the series to\n        take arguments by constant reference like so:\n      </p>\n<pre class=\"programlisting\"><span class=\"identifier\">mp_t</span> <span class=\"identifier\">calculate_bessel_J_as_series_2</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">mp_t</span><span class=\"special\">&amp;</span> <span class=\"identifier\">x</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">mp_t</span><span class=\"special\">&amp;</span> <span class=\"identifier\">v</span><span class=\"special\">,</span> <span class=\"identifier\">mp_t</span><span class=\"special\">*</span> <span class=\"identifier\">err</span><span class=\"special\">)</span>\n</pre>\n<p>\n        And to then pass our arguments to it, without first altering their precision\n        to match the current working default. However, imagine that <code class=\"computeroutput\"><span class=\"identifier\">calculate_bessel_J_as_series_2</span></code> calculates\n        x<sup>2</sup> internally, what precision is the result? If it's the same as the precision\n        of <span class=\"emphasis\"><em>x</em></span>, then our calculation will loose precision, since\n        we really want the result calculated to the full current working precision,\n        which may be significantly higher than that of our input variables. Our new\n        version of Bessel_J_to_precision therefore uses <code class=\"computeroutput\"><span class=\"identifier\">variable_precision_options</span><span class=\"special\">::</span><span class=\"identifier\">preserve_target_precision</span></code>\n        internally, so that expressions containing only the low-precision input variables\n        are calculated at the precision of (at least) the target - which will have\n        been constructed at the current working precision.\n      </p>\n<p>\n        Here's our revised code:\n      </p>\n<pre class=\"programlisting\"><span class=\"identifier\">mp_t</span> <span class=\"identifier\">Bessel_J_to_precision_2</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">mp_t</span><span class=\"special\">&amp;</span> <span class=\"identifier\">v</span><span class=\"special\">,</span> <span class=\"keyword\">const</span> <span class=\"identifier\">mp_t</span><span class=\"special\">&amp;</span> <span class=\"identifier\">x</span><span class=\"special\">,</span> <span class=\"keyword\">unsigned</span> <span class=\"identifier\">digits10</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Begin with 2 scoped objects, one to manage current working precision, one to</span>\n   <span class=\"comment\">// manage mixed precision arithmetic.  Use of variable_precision_options::preserve_target_precision</span>\n   <span class=\"comment\">// ensures that expressions containing only low-precision input variables are evaluated at the precision</span>\n   <span class=\"comment\">// of the variable they are being assigned to (ie current working precision).</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">scoped_mpfr_precision</span> <span class=\"identifier\">scoped</span><span class=\"special\">(</span><span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n   <span class=\"identifier\">scoped_mpfr_precision_options</span> <span class=\"identifier\">scoped_opts</span><span class=\"special\">(</span><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">variable_precision_options</span><span class=\"special\">::</span><span class=\"identifier\">preserve_target_precision</span><span class=\"special\">);</span>\n\n   <span class=\"identifier\">mp_t</span>                    <span class=\"identifier\">result</span><span class=\"special\">;</span>\n   <span class=\"identifier\">mp_t</span>            <span class=\"identifier\">current_error</span><span class=\"special\">{</span><span class=\"number\">1</span><span class=\"special\">};</span>\n   <span class=\"identifier\">mp_t</span>            <span class=\"identifier\">target_error</span><span class=\"special\">{</span><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">pow</span><span class=\"special\">(</span><span class=\"number\">10.</span><span class=\"special\">,</span> <span class=\"special\">-</span><span class=\"keyword\">static_cast</span><span class=\"special\">&lt;</span><span class=\"keyword\">int</span><span class=\"special\">&gt;(</span><span class=\"identifier\">digits10</span><span class=\"special\">))};</span>\n\n   <span class=\"keyword\">while</span> <span class=\"special\">(</span><span class=\"identifier\">target_error</span> <span class=\"special\">&lt;</span> <span class=\"identifier\">current_error</span><span class=\"special\">)</span>\n   <span class=\"special\">{</span>\n      <span class=\"comment\">//</span>\n      <span class=\"comment\">// The assignment here, rounds the high precision result</span>\n      <span class=\"comment\">// returned by calculate_bessel_J_as_series_2, to the precision</span>\n      <span class=\"comment\">// of variable result: ie to the target precision we specified in</span>\n      <span class=\"comment\">// the function call.  This is only the case because we have</span>\n      <span class=\"comment\">// variable_precision_options::preserve_target_precision set.</span>\n      <span class=\"comment\">//</span>\n      <span class=\"identifier\">result</span> <span class=\"special\">=</span> <span class=\"identifier\">calculate_bessel_J_as_series_2</span><span class=\"special\">(</span><span class=\"identifier\">x</span><span class=\"special\">,</span> <span class=\"identifier\">v</span><span class=\"special\">,</span> <span class=\"special\">&amp;</span><span class=\"identifier\">current_error</span><span class=\"special\">);</span>\n\n      <span class=\"identifier\">digits10</span> <span class=\"special\">*=</span> <span class=\"number\">2</span><span class=\"special\">;</span>\n      <span class=\"identifier\">scoped</span><span class=\"special\">.</span><span class=\"identifier\">reset</span><span class=\"special\">(</span><span class=\"identifier\">digits10</span><span class=\"special\">);</span>\n   <span class=\"special\">}</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// There may be temporaries created when we return, we must make sure</span>\n   <span class=\"comment\">// that we reset the working precision and options before we return.</span>\n   <span class=\"comment\">// In the case of the options, we must preserve the precision of the source</span>\n   <span class=\"comment\">// object during the return, not only here, but in the calling function too:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">scoped</span><span class=\"special\">.</span><span class=\"identifier\">reset</span><span class=\"special\">();</span>\n   <span class=\"identifier\">scoped_opts</span><span class=\"special\">.</span><span class=\"identifier\">reset</span><span class=\"special\">(</span><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">variable_precision_options</span><span class=\"special\">::</span><span class=\"identifier\">preserve_source_precision</span><span class=\"special\">);</span>\n   <span class=\"keyword\">return</span> <span class=\"identifier\">result</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n        In our final example, we'll look at a (somewhat contrived) case where we\n        reduce the argument by N * PI, in this case we change the mixed-precision\n        arithmetic options several times, depending what it is we are trying to achieve\n        at that moment in time:\n      </p>\n<pre class=\"programlisting\"><span class=\"identifier\">mp_t</span> <span class=\"identifier\">reduce_n_pi</span><span class=\"special\">(</span><span class=\"keyword\">const</span> <span class=\"identifier\">mp_t</span><span class=\"special\">&amp;</span> <span class=\"identifier\">arg</span><span class=\"special\">)</span>\n<span class=\"special\">{</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// We begin by estimating how many multiples of PI we will be reducing by, </span>\n   <span class=\"comment\">// note that this is only an estimate because we're using low precision</span>\n   <span class=\"comment\">// arithmetic here to get a quick answer:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"keyword\">unsigned</span> <span class=\"identifier\">n</span> <span class=\"special\">=</span> <span class=\"keyword\">static_cast</span><span class=\"special\">&lt;</span><span class=\"keyword\">unsigned</span><span class=\"special\">&gt;(</span><span class=\"identifier\">arg</span> <span class=\"special\">/</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">constants</span><span class=\"special\">::</span><span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"identifier\">mp_t</span><span class=\"special\">&gt;());</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Now that we have an estimate for N, we can up the working precision and obtain</span>\n   <span class=\"comment\">// a high precision value for PI, best to play safe and preserve the precision of the</span>\n   <span class=\"comment\">// source here.  Though note that expressions are evaluated at the highest precision</span>\n   <span class=\"comment\">// of any of their components: in this case that's the current working precision</span>\n   <span class=\"comment\">// returned by boost::math::constants::pi, and not the precision of arg.</span>\n   <span class=\"comment\">// However, should this function be called with assume_uniform_precision set</span>\n   <span class=\"comment\">// then all bets are off unless we do this:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">scoped_mpfr_precision</span>            <span class=\"identifier\">scope_1</span><span class=\"special\">(</span><span class=\"identifier\">mp_t</span><span class=\"special\">::</span><span class=\"identifier\">thread_default_precision</span><span class=\"special\">()</span> <span class=\"special\">*</span> <span class=\"number\">2</span><span class=\"special\">);</span>\n   <span class=\"identifier\">scoped_mpfr_precision_options</span>    <span class=\"identifier\">scope_2</span><span class=\"special\">(</span><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">variable_precision_options</span><span class=\"special\">::</span><span class=\"identifier\">preserve_source_precision</span><span class=\"special\">);</span>\n\n   <span class=\"identifier\">mp_t</span> <span class=\"identifier\">reduced</span> <span class=\"special\">=</span> <span class=\"identifier\">arg</span> <span class=\"special\">-</span> <span class=\"identifier\">n</span> <span class=\"special\">*</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">constants</span><span class=\"special\">::</span><span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"identifier\">mp_t</span><span class=\"special\">&gt;();</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Since N was only an estimate, we may have subtracted one PI too many,</span>\n   <span class=\"comment\">// correct if that's the case now:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"keyword\">if</span> <span class=\"special\">(</span><span class=\"identifier\">reduced</span> <span class=\"special\">&lt;</span> <span class=\"number\">0</span><span class=\"special\">)</span>\n      <span class=\"identifier\">reduced</span> <span class=\"special\">+=</span> <span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">math</span><span class=\"special\">::</span><span class=\"identifier\">constants</span><span class=\"special\">::</span><span class=\"identifier\">pi</span><span class=\"special\">&lt;</span><span class=\"identifier\">mp_t</span><span class=\"special\">&gt;();</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// Our variable \"reduced\" now has the correct answer, but too many digits precision, </span>\n   <span class=\"comment\">// we can either call its .precision() member function, or assign to a new variable</span>\n   <span class=\"comment\">// with variable_precision_options::preserve_target_precision set:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">scope_1</span><span class=\"special\">.</span><span class=\"identifier\">reset</span><span class=\"special\">();</span>\n   <span class=\"identifier\">scope_2</span><span class=\"special\">.</span><span class=\"identifier\">reset</span><span class=\"special\">(</span><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">variable_precision_options</span><span class=\"special\">::</span><span class=\"identifier\">preserve_target_precision</span><span class=\"special\">);</span>\n   <span class=\"identifier\">mp_t</span> <span class=\"identifier\">result</span> <span class=\"special\">=</span> <span class=\"identifier\">reduced</span><span class=\"special\">;</span>\n   <span class=\"comment\">//</span>\n   <span class=\"comment\">// As with previous examples, returning the result may create temporaries, so lets</span>\n   <span class=\"comment\">// make sure that we preserve the precision of result.  Note that this isn't strictly</span>\n   <span class=\"comment\">// required if the calling context is always of uniform precision, but we can't be sure </span>\n   <span class=\"comment\">// of our calling context:</span>\n   <span class=\"comment\">//</span>\n   <span class=\"identifier\">scope_2</span><span class=\"special\">.</span><span class=\"identifier\">reset</span><span class=\"special\">(</span><span class=\"identifier\">boost</span><span class=\"special\">::</span><span class=\"identifier\">multiprecision</span><span class=\"special\">::</span><span class=\"identifier\">variable_precision_options</span><span class=\"special\">::</span><span class=\"identifier\">preserve_source_precision</span><span class=\"special\">);</span>\n   <span class=\"keyword\">return</span> <span class=\"identifier\">result</span><span class=\"special\">;</span>\n<span class=\"special\">}</span>\n</pre>\n<p>\n        And finally... we need to mention <code class=\"computeroutput\"><span class=\"identifier\">preserve_component_precision</span></code>,\n        <code class=\"computeroutput\"><span class=\"identifier\">preserve_related_precision</span></code>\n        and <code class=\"computeroutput\"><span class=\"identifier\">preserve_all_precision</span></code>.\n      </p>\n<p>\n        These form a hierarchy, with each inheriting the properties of those before\n        it. <code class=\"computeroutput\"><span class=\"identifier\">preserve_component_precision</span></code>\n        is used when dealing with complex or interval numbers, for example if we\n        have:\n      </p>\n<pre class=\"programlisting\"><span class=\"identifier\">mpc_complex</span> <span class=\"identifier\">val</span> <span class=\"special\">=</span> <span class=\"identifier\">some_expression</span><span class=\"special\">;</span>\n</pre>\n<p>\n        And <code class=\"computeroutput\"><span class=\"identifier\">some_expression</span></code> contains\n        scalar values of type <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float</span></code>,\n        then the precision of these is ignored unless we specify at least <code class=\"computeroutput\"><span class=\"identifier\">preserve_component_precision</span></code>.\n      </p>\n<p>\n        <code class=\"computeroutput\"><span class=\"identifier\">preserve_related_precision</span></code>\n        we'll somewhat skip over - it extends the range of types whose precision\n        is considered within an expression to related types - for example all instantiations\n        of <code class=\"computeroutput\"><span class=\"identifier\">number</span><span class=\"special\">&lt;</span><span class=\"identifier\">mpfr_float_backend</span><span class=\"special\">&lt;</span><span class=\"identifier\">N</span><span class=\"special\">&gt;,</span> <span class=\"identifier\">ET</span><span class=\"special\">&gt;</span></code>\n        when dealing with expression of type <code class=\"computeroutput\"><span class=\"identifier\">mpfr_float</span></code>.\n        However, such situations are - and should be - very rare.\n      </p>\n<p>\n        The final option - <code class=\"computeroutput\"><span class=\"identifier\">preserve_all_precision</span></code>\n        - is used to preserve the precision of all the types in an expression, for\n        example:\n      </p>\n<pre class=\"programlisting\"><span class=\"comment\">// calculate 2^1000 - 1:</span>\n<span class=\"identifier\">mpz_int</span> <span class=\"identifier\">i</span><span class=\"special\">(</span><span class=\"number\">1</span><span class=\"special\">);</span>\n<span class=\"identifier\">i</span> <span class=\"special\">&lt;&lt;=</span> <span class=\"number\">1000</span><span class=\"special\">;</span>\n<span class=\"identifier\">i</span> <span class=\"special\">-=</span> <span class=\"number\">1</span><span class=\"special\">;</span>\n\n<span class=\"identifier\">mp_t</span> <span class=\"identifier\">f</span> <span class=\"special\">=</span> <span class=\"identifier\">i</span><span class=\"special\">;</span>\n</pre>\n<p>\n        The final assignment above will round the value in <span class=\"emphasis\"><em>i</em></span>\n        to the current working precision, unless <code class=\"computeroutput\"><span class=\"identifier\">preserve_all_precision</span></code>\n        is set, in which case <span class=\"emphasis\"><em>f</em></span> will end up with sufficient\n        precision to store <span class=\"emphasis\"><em>i</em></span> unchanged.\n      </p>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"mixed.html\"><img src=\"../../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../tut.html\"><img src=\"../../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../../index.html\"><img src=\"../../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"gen_int.html\"><img src=\"../../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/boost_multiprecision/tut.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Tutorial</title>\n<link rel=\"stylesheet\" href=\"../multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"up\" href=\"../index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"prev\" href=\"intro.html\" title=\"Introduction\">\n<link rel=\"next\" href=\"tut/ints.html\" title=\"Integer Types\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"intro.html\"><img src=\"../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"tut/ints.html\"><img src=\"../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n<div class=\"section\">\n<div class=\"titlepage\"><div><div><h2 class=\"title\" style=\"clear: both\">\n<a name=\"boost_multiprecision.tut\"></a><a class=\"link\" href=\"tut.html\" title=\"Tutorial\">Tutorial</a>\n</h2></div></div></div>\n<div class=\"toc\"><dl class=\"toc\">\n<dt><span class=\"section\"><a href=\"tut/ints.html\">Integer Types</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"tut/ints/cpp_int.html\">cpp_int</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/ints/gmp_int.html\">gmp_int</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/ints/tom_int.html\">tom_int</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/ints/egs.html\">Examples</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"tut/ints/egs/factorials.html\">Factorials</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/ints/egs/bitops.html\">Bit Operations</a></span></dt>\n</dl></dd>\n</dl></dd>\n<dt><span class=\"section\"><a href=\"tut/floats.html\">Floating-point Types</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"tut/floats/cpp_bin_float.html\">cpp_bin_float</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/floats/cpp_dec_float.html\">cpp_dec_float</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/floats/gmp_float.html\">gmp_float</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/floats/mpfr_float.html\">mpfr_float</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/floats/float128.html\">float128</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/floats/fp_eg.html\">Examples</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"tut/floats/fp_eg/floatbuiltinctor.html\">Construction\n          from Specific Values Without Precision Loss</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/floats/fp_eg/aos.html\">Area of\n          Circle</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/floats/fp_eg/caveats.html\">Drop-in\n          Caveats</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/floats/fp_eg/jel.html\">Defining\n          a Special Function.</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/floats/fp_eg/nd.html\">Calculating\n          a Derivative</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/floats/fp_eg/gi.html\">Calculating\n          an Integral</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/floats/fp_eg/poly_eg.html\">Polynomial\n          Evaluation</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/floats/fp_eg/variable_precision.html\">Variable-Precision\n          Newton Evaluation</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/floats/fp_eg/gauss_lagerre_quadrature.html\">Gauss-Laguerre\n          quadrature</a></span></dt>\n</dl></dd>\n</dl></dd>\n<dt><span class=\"section\"><a href=\"tut/interval.html\">Interval Number Types</a></span></dt>\n<dd><dl><dt><span class=\"section\"><a href=\"tut/interval/mpfi.html\">mpfi_float</a></span></dt></dl></dd>\n<dt><span class=\"section\"><a href=\"tut/complex.html\">Complex Number Types</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"tut/complex/cpp_complex.html\">cpp_complex</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/complex/mpc_complex.html\">mpc_complex</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/complex/complex128.html\">complex128</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/complex/complex_adaptor.html\">complex_adaptor</a></span></dt>\n</dl></dd>\n<dt><span class=\"section\"><a href=\"tut/rational.html\">Rational Number Types</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"tut/rational/cpp_rational.html\">cpp_rational</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/rational/gmp_rational.html\">gmp_rational</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/rational/tommath_rational.html\">tommath_rational</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/rational/tommath_rational0.html\">tommath_rational</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/rational/rational_adaptor.html\">rational_adaptor</a></span></dt>\n</dl></dd>\n<dt><span class=\"section\"><a href=\"tut/misc.html\">Miscellaneous Number Types.</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"tut/misc/logged_adaptor.html\">logged_adaptor</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/misc/debug_adaptor.html\">debug_adaptor</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/misc/visualizers.html\">Visual C++\n        Debugger Visualizers</a></span></dt>\n</dl></dd>\n<dt><span class=\"section\"><a href=\"tut/conversions.html\">Constructing and\n      Interconverting Between Number Types</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/random.html\">Generating Random Numbers</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/primetest.html\">Primality Testing</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/lits.html\">Literal Types and <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code> Support</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/import_export.html\">Importing and\n      Exporting Data to and from <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>\n      and <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span></code></a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/rounding.html\">Rounding Rules for\n      Conversions</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/mixed.html\">Mixed Precision Arithmetic</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/variable.html\">Variable Precision\n      Arithmetic</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/gen_int.html\">Generic Integer Operations</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/serial.html\">Boost.Serialization\n      Support</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/limits.html\">Numeric Limits</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"tut/limits/constants.html\">std::numeric_limits&lt;&gt;\n        constants</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/limits/functions.html\"><code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;&gt;</span></code> functions</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/limits/limits32.html\">Numeric limits\n        for 32-bit platform</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/limits/how_to_tell.html\">How to\n        Determine the Kind of a Number From <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code></a></span></dt>\n</dl></dd>\n<dt><span class=\"section\"><a href=\"tut/input_output.html\">Input Output</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/hash.html\">Hash Function Support</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/eigen.html\">Eigen Interoperability</a></span></dt>\n<dt><span class=\"section\"><a href=\"tut/new_backend.html\">Writing a New Backend</a></span></dt>\n</dl></div>\n<p>\n      In order to use this library you need to make two choices:\n    </p>\n<div class=\"itemizedlist\"><ul class=\"itemizedlist\" style=\"list-style-type: disc; \">\n<li class=\"listitem\">\n          What kind of number do I want (<a class=\"link\" href=\"tut/ints.html\" title=\"Integer Types\">integer</a>,\n          <a class=\"link\" href=\"tut/floats.html\" title=\"Floating-point Types\">floating-point</a>,\n          <a class=\"link\" href=\"tut/rational.html\" title=\"Rational Number Types\">rational</a>, or\n          <a class=\"link\" href=\"tut/complex.html\" title=\"Complex Number Types\">complex</a>).\n        </li>\n<li class=\"listitem\">\n          Which back-end do I want to perform the actual arithmetic (Boost-supplied,\n          GMP, MPFR, MPC, Tommath etc)?\n        </li>\n</ul></div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"></td>\n<td align=\"right\"><div class=\"copyright-footer\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos<p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\">\n<a accesskey=\"p\" href=\"intro.html\"><img src=\"../../../../../doc/src/images/prev.png\" alt=\"Prev\"></a><a accesskey=\"u\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/up.png\" alt=\"Up\"></a><a accesskey=\"h\" href=\"../index.html\"><img src=\"../../../../../doc/src/images/home.png\" alt=\"Home\"></a><a accesskey=\"n\" href=\"tut/ints.html\"><img src=\"../../../../../doc/src/images/next.png\" alt=\"Next\"></a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/index.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<title>Chapter 1. Boost.Multiprecision</title>\n<link rel=\"stylesheet\" href=\"multiprecision.css\" type=\"text/css\">\n<meta name=\"generator\" content=\"DocBook XSL Stylesheets V1.79.1\">\n<link rel=\"home\" href=\"index.html\" title=\"Chapter 1. Boost.Multiprecision\">\n<link rel=\"next\" href=\"boost_multiprecision/intro.html\" title=\"Introduction\">\n</head>\n<body bgcolor=\"white\" text=\"black\" link=\"#0000FF\" vlink=\"#840084\" alink=\"#0000FF\">\n<table cellpadding=\"2\" width=\"100%\"><tr>\n<td valign=\"top\"><img alt=\"Boost C++ Libraries\" width=\"277\" height=\"86\" src=\"../../../../boost.png\"></td>\n<td align=\"center\"><a href=\"../../../../index.html\">Home</a></td>\n<td align=\"center\"><a href=\"../../../../libs/libraries.htm\">Libraries</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/people.html\">People</a></td>\n<td align=\"center\"><a href=\"http://www.boost.org/users/faq.html\">FAQ</a></td>\n<td align=\"center\"><a href=\"../../../../more/index.htm\">More</a></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\"><a accesskey=\"n\" href=\"boost_multiprecision/intro.html\"><img src=\"../../../../doc/src/images/next.png\" alt=\"Next\"></a></div>\n<div class=\"chapter\">\n<div class=\"titlepage\"><div>\n<div><h2 class=\"title\">\n<a name=\"boost_multiprecision\"></a>Chapter 1. Boost.Multiprecision</h2></div>\n<div><div class=\"author\"><h3 class=\"author\">\n<span class=\"firstname\">John</span> <span class=\"surname\">Maddock</span>\n</h3></div></div>\n<div><div class=\"author\"><h3 class=\"author\">\n<span class=\"firstname\">Christopher</span> <span class=\"surname\">Kormanyos</span>\n</h3></div></div>\n<div><p class=\"copyright\">Copyright © 2002-2020 John\n      Maddock and Christopher Kormanyos</p></div>\n<div><div class=\"legalnotice\">\n<a name=\"boost_multiprecision.legal\"></a><p>\n        Distributed under the Boost Software License, Version 1.0. (See accompanying\n        file LICENSE_1_0.txt or copy at <a href=\"http://www.boost.org/LICENSE_1_0.txt\" target=\"_top\">http://www.boost.org/LICENSE_1_0.txt</a>)\n      </p>\n</div></div>\n</div></div>\n<div class=\"toc\">\n<p><b>Table of Contents</b></p>\n<dl class=\"toc\">\n<dt><span class=\"section\"><a href=\"boost_multiprecision/intro.html\">Introduction</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut.html\">Tutorial</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/ints.html\">Integer Types</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/ints/cpp_int.html\">cpp_int</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/ints/gmp_int.html\">gmp_int</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/ints/tom_int.html\">tom_int</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/ints/egs.html\">Examples</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/ints/egs/factorials.html\">Factorials</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/ints/egs/bitops.html\">Bit Operations</a></span></dt>\n</dl></dd>\n</dl></dd>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/floats.html\">Floating-point Types</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/floats/cpp_bin_float.html\">cpp_bin_float</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/floats/cpp_dec_float.html\">cpp_dec_float</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/floats/gmp_float.html\">gmp_float</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/floats/mpfr_float.html\">mpfr_float</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/floats/float128.html\">float128</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/floats/fp_eg.html\">Examples</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/floats/fp_eg/floatbuiltinctor.html\">Construction\n          from Specific Values Without Precision Loss</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/floats/fp_eg/aos.html\">Area of\n          Circle</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/floats/fp_eg/caveats.html\">Drop-in\n          Caveats</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/floats/fp_eg/jel.html\">Defining\n          a Special Function.</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/floats/fp_eg/nd.html\">Calculating\n          a Derivative</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/floats/fp_eg/gi.html\">Calculating\n          an Integral</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/floats/fp_eg/poly_eg.html\">Polynomial\n          Evaluation</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/floats/fp_eg/variable_precision.html\">Variable-Precision\n          Newton Evaluation</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/floats/fp_eg/gauss_lagerre_quadrature.html\">Gauss-Laguerre\n          quadrature</a></span></dt>\n</dl></dd>\n</dl></dd>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/interval.html\">Interval Number Types</a></span></dt>\n<dd><dl><dt><span class=\"section\"><a href=\"boost_multiprecision/tut/interval/mpfi.html\">mpfi_float</a></span></dt></dl></dd>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/complex.html\">Complex Number Types</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/complex/cpp_complex.html\">cpp_complex</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/complex/mpc_complex.html\">mpc_complex</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/complex/complex128.html\">complex128</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/complex/complex_adaptor.html\">complex_adaptor</a></span></dt>\n</dl></dd>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/rational.html\">Rational Number Types</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/rational/cpp_rational.html\">cpp_rational</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/rational/gmp_rational.html\">gmp_rational</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/rational/tommath_rational.html\">tommath_rational</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/rational/tommath_rational0.html\">tommath_rational</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/rational/rational_adaptor.html\">rational_adaptor</a></span></dt>\n</dl></dd>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/misc.html\">Miscellaneous Number Types.</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/misc/logged_adaptor.html\">logged_adaptor</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/misc/debug_adaptor.html\">debug_adaptor</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/misc/visualizers.html\">Visual C++\n        Debugger Visualizers</a></span></dt>\n</dl></dd>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/conversions.html\">Constructing and\n      Interconverting Between Number Types</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/random.html\">Generating Random Numbers</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/primetest.html\">Primality Testing</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/lits.html\">Literal Types and <code class=\"computeroutput\"><span class=\"keyword\">constexpr</span></code> Support</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/import_export.html\">Importing and\n      Exporting Data to and from <code class=\"computeroutput\"><span class=\"identifier\">cpp_int</span></code>\n      and <code class=\"computeroutput\"><span class=\"identifier\">cpp_bin_float</span></code></a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/rounding.html\">Rounding Rules for\n      Conversions</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/mixed.html\">Mixed Precision Arithmetic</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/variable.html\">Variable Precision\n      Arithmetic</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/gen_int.html\">Generic Integer Operations</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/serial.html\">Boost.Serialization\n      Support</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/limits.html\">Numeric Limits</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/limits/constants.html\">std::numeric_limits&lt;&gt;\n        constants</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/limits/functions.html\"><code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span><span class=\"special\">&lt;&gt;</span></code> functions</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/limits/limits32.html\">Numeric limits\n        for 32-bit platform</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/limits/how_to_tell.html\">How to\n        Determine the Kind of a Number From <code class=\"computeroutput\"><span class=\"identifier\">std</span><span class=\"special\">::</span><span class=\"identifier\">numeric_limits</span></code></a></span></dt>\n</dl></dd>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/input_output.html\">Input Output</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/hash.html\">Hash Function Support</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/eigen.html\">Eigen Interoperability</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/tut/new_backend.html\">Writing a New Backend</a></span></dt>\n</dl></dd>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/ref.html\">Reference</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/ref/number.html\">number</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/ref/cpp_int_ref.html\">cpp_int</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/ref/gmp_int_ref.html\">gmp_int</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/ref/tom_int_ref.html\">tom_int</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/ref/mpf_ref.html\">gmp_float</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/ref/mpfr_ref.html\">mpfr_float_backend</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/ref/cpp_bin_float_ref.html\">cpp_bin_float</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/ref/cpp_dec_ref.html\">cpp_dec_float</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/ref/internals.html\">Internal Support\n      Code</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/ref/backendconc.html\">Backend Requirements</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/ref/headers.html\">Header File Structure</a></span></dt>\n</dl></dd>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/perf.html\">Performance Comparison</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/perf/overhead.html\">The Overhead in the\n      Number Class Wrapper</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/perf/realworld.html\">Floating-Point Real\n      World Tests</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/perf/int_real_world.html\">Integer Real\n      World Tests</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/perf/rational_real_world.html\">Rational\n      Real World Tests</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/perf/float_performance.html\">Float Algorithm\n      Performance</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/perf/integer_performance.html\">Integer\n      Algorithm Performance</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/perf/rational_performance.html\">Rational\n      Type Performance</a></span></dt>\n</dl></dd>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/map.html\">Roadmap</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/map/hist.html\">History</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/map/todo.html\">TODO</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/map/faq.html\">FAQ</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/map/ack.html\">Acknowledgements</a></span></dt>\n</dl></dd>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/indexes.html\">Indexes</a></span></dt>\n<dd><dl>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/indexes/s01.html\">Function Index</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/indexes/s02.html\">Class Index</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/indexes/s03.html\">Typedef Index</a></span></dt>\n<dt><span class=\"section\"><a href=\"boost_multiprecision/indexes/s04.html\">Index</a></span></dt>\n</dl></dd>\n</dl>\n</div>\n</div>\n<table xmlns:rev=\"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision\" width=\"100%\"><tr>\n<td align=\"left\"><p><small>Last revised: October 23, 2022 at 17:40:16 GMT</small></p></td>\n<td align=\"right\"><div class=\"copyright-footer\"></div></td>\n</tr></table>\n<hr>\n<div class=\"spirit-nav\"><a accesskey=\"n\" href=\"boost_multiprecision/intro.html\"><img src=\"../../../../doc/src/images/next.png\" alt=\"Next\"></a></div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html/multiprecision.css",
    "content": "@import url('../../../../doc/src/boostbook.css');\n/* Contains the basic settings for BoostBook and used by Quickbook to docbook conversion. */\n\n/*=============================================================================\nCopyright (c) 2004 Joel de Guzman    http://spirit.sourceforge.net/\nCopyright (c) 2014 John Maddock\nCopyright 2013 Niall Douglas additions for colors and alignment.\nCopyright 2013 Paul A. Bristow additions for more colors and alignments.\nCopyright 2019 Paul A. Bristow additions for more control of serif-italic font etc.\n\nDistributed under the Boost Software License, Version 1.0. (See accompany-\ning file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n    This Cascading Style Sheet is used to override and add to the standard Boost\n    CSS BoostBook for a particular library, for example Boost.Math and Boost.Multiprecision.\n\n    Visual Studio is recommended for editing this file \n    because it checks syntax, does layout and provides help on options.\n\nIMPORTANT: there are two versions of this file - \n\none in libs/math/doc and one in libs/math/doc/html\n\nONLY EVER EDIT THE FIRST OF THESE  !!!!\n\n=============================================================================*/\n\n/*=============================================================================\nProgram listings\n=============================================================================*/\n\n    /* Code on paragraphs */\n    p tt.computeroutput\n    {\n        font-size: 10pt;\n    }\n\n    pre.synopsis\n    {\n        font-size: 10pt;\n        margin: 1pc 4% 0pc 4%;\n        padding: 0.5pc 0.5pc 0.5pc 0.5pc;\n    }\n\n    .programlisting,\n    .screen\n    {\n        font-size: 10pt;\n        display: block;\n        /* was margin: 1pc 4% 0pc 4%; */\n        margin: 1pc 2% 0pc 2%;\n        padding: 0.5pc 0.5pc 0.5pc 0.5pc;\n    }\n\t\t@media screen\n    {\n       /* Syntax Highlighting */\n\t\t\t\t.comment { color: green; }\n\t\t\t\t/* .comment { color: #008000; }\t*/\n\t\t}\t\t\t\t\t\t\n    /* Program listings in tables don't get borders */\n    td .programlisting,\n    td .screen\n    {\n        margin: 0pc 0pc 0pc 0pc;\n        padding: 0pc 0pc 0pc 0pc;\n    }\n\n/*=============================================================================\nTable of contents\n=============================================================================*/\n\n    div.toc\n    {\n       margin: 1pc 4% 0pc 4%;\n       padding: 0.1pc 1pc 0.1pc 1pc;\n       font-size: 100%;\n       line-height: 1.15;\n    }\n\n    .boost-toc\n    {\n       float: right;\n       padding: 0.5pc;\n    }\n\n    /* Code on toc */\n    .toc .computeroutput { font-size: 120% }\n\n    /* No margin on nested menus */\n\n    .toc dl dl { margin: 0; }\n\n\n/*==============================================================================\nAlignment and coloring use 'role' feature, available from Quickbook 1.6 up.\nAdded from Niall Douglas for role color and alignment.\nhttp://article.gmane.org/gmane.comp.lib.boost.devel/243318\n*/\n\n/* Add text alignment (see http://www.w3schools.com/cssref/pr_text_text-align.asp) */\nspan.aligncenter\n{\n  display: inline-block; width: 100%; text-align: center;\n}\nspan.alignright\n{\n  display: inline-block; width: 100%; text-align: right;\n}\n/* alignleft is the default. */\nspan.alignleft\n{\n  display: inline-block; width: 100%; text-align: left;\n}\n\n/* alignjustify stretches the word spacing so that each line has equal width\nwithin a chosen fraction of page width (here arbitrarily 20%).\n*Not* useful inside table items as the column width remains the total string width.\nNor very useful, except to temporarily restrict the width.\n*/\nspan.alignjustify\n{\n  display: inline-block; width: 20%; text-align: justify;\n}\n\n/* Text colors.\nNames at http://www.w3.org/TR/2002/WD-css3-color-20020219/ 4.3. X11 color keywords.\nQuickbook Usage: [role red Some red text]\n\ninline-block - Flows a element inline with the text, but allows width and height to be specified.\n\nhttps://stackoverflow.com/questions/3043021/is-there-any-guide-on-when-to-use-displayblock-when-inline-and-when-inline-b#:~:text=The%20use%20cases%20for%20block,it%27s%20used%20naturally%20for%20images\n\n*/\nspan.red { display:inline-block; color: red; }\nspan.green { display:inline-block; color: green; }\nspan.lime { display:inline-block; color: #00FF00; }\nspan.blue { display:inline-block; color: blue; }\nspan.navy { display:inline-block; color: navy; }\nspan.yellow { display:inline-block; color: yellow; }\nspan.magenta { display:inline-block; color: magenta; }\nspan.indigo { display:inline-block; color: #4B0082; }\nspan.cyan { display:inline-block; color: cyan; }\nspan.purple { display:inline-block; color: purple; }\nspan.gold { display:inline-block; color: gold; }\nspan.silver { display:inline-block; color: silver; } /* lighter gray */\nspan.gray { display:inline-block; color: #808080; } /* light gray */\n\n/* role for inline Unicode mathematical equations,\n    making font an italic (as is conventional for equations)\n    and a serif version of font (to match those generated using .mml to SVG or PNG)\n    and a little bigger (* 125%) because the serif font appears smaller than the default sans serif fonts.\n    Used, for example: [role serif_italic This is in serif font and italic].\n    Used in turn by template for inline expressions to match equations as SVG or PNG images.\n    Can be combined with colors and bold.\n*/\nspan.serif_italic {\n    font-family: serif;\n    font-style: italic;\n    font-size: 125%;\n    font-stretch: expanded;\n}\n\n/* Custom indent of paragraphs to make equations look nicer.\nhttps://www.w3schools.com/tags/tag_blockquote.asp says \n  \"Most browsers will display the <blockquote> element with left and right margin 40px values: \"\n*/\nblockquote {\n    display: block;\n    margin-top: 1em;\n    margin-bottom: 1em;\n    margin-left: 2%;\n    margin-right: 2%;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/html4_symbols.qbk",
    "content": "[/ Symbols and Greek letters (about 120) from HTML4.]\n[/ File HTML4_symbols.qbk]\n[/ See http://www.htmlhelp.com/reference/html40/entities/symbols.html]\n[/ See also http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references]\n[/ http://www.alanwood.net/demos/ent4_frame.html]\n[/ http://www.unicode.org/charts/PDF/U2200.pdf and others]\n[/ All (except 2 angle brackets) show OK on Firefox 2.0 and higher]\n\n[/ See also Latin-1 aka Western (ISO-8859-1) in latin1_symbols.qbk]\n[/ http://www.htmlhelp.com/reference/html40/entities/latin1.html]\n[/Unicode Latin extended http://www.unicode.org/charts/U0080.pdf]\n[/https://en.wikipedia.org/wiki/Template:Unicode_chart_Arrows chart arrows]\n\n[/ Also some miscellaneous math characters added to this list - see the end.]\n[/ For others see also math_toolkit.symbols.qbk]\n\n[/ To use, enclose the template name in square brackets, for example: [pi] ]\n\n[template fnof[]'''&#x192;'''] [/  Latin small f with hook = function = florin]\n[/ Capital Greek start with capital letter, lower case all small.]\n[template Alpha[]'''&#x391;'''] [/ ? Greek capital letter alphadot]\n[template Beta[]'''&#x392;'''] [/ ? Greek capital letter beta]\n[template Gamma[]'''&#x393;'''] [/ G Greek capital letter gamma]\n[template Delta[]'''&#x394;'''] [/ ? Greek capital letter delta]\n[template Epsilon[]'''&#x395;'''] [/ ? Greek capital letter epsilon]\n[template Zeta[]'''&#x396;'''] [/ ? Greek capital letter zeta]\n[template Eta[]'''&#x397;'''] [/ ? Greek capital letter eta]\n[template Theta[]'''&#x398;'''] [/ T Greek capital letter theta]\n[template Iota[]'''&#x399;'''] [/ ? Greek capital letter iota]\n[template Kappa[]'''&#x39A;'''] [/ ? Greek capital letter kappa]\n[template Lambda[]'''&#x39B;'''] [/ ? Greek capital letter lambda]\n[template Mu[]'''&#x39C;'''] [/ ? Greek capital letter mu]\n[template Nu[]'''&#x39D;'''] [/ ? Greek capital letter nu]\n[template Xi[]'''&#x39E;'''] [/ ? Greek capital letter xi]\n[template Omicron[]'''&#x39F;'''] [/ ? Greek capital letter omicron]\n[template Pi[]'''&#x3A0;'''] [/ ? Greek capital letter pi]\n[template Rho[]'''&#x3A1;'''] [/ ? Greek capital letter rho]\n[template Sigma[]'''&#x3A3;'''] [/ S Greek capital letter sigma]\n[template Tau[]'''&#x3A4;'''] [/ ? Greek capital letter tau]\n[template Upsilon[]'''&#x3A5;'''] [/ ? Greek capital letter upsilon]\n[template Phi[]'''&#x3A6;'''] [/ F Greek capital letter phi]\n[template Chi[]'''&#x3A7;'''] [/ ? Greek capital letter chi]\n[template Psi[]'''&#x3A8;'''] [/ ? Greek capital letter psi]\n[template Omega[]'''&#x3A9;'''] [/ O Greek capital letter omega]\n[template alpha[]'''&#x3B1;'''] [/ a Greek small letter alpha]\n[template beta[]'''&#x3B2;'''] [/  Greek small letter beta]\n[template gamma[]'''&#x3B3;'''] [/ ? Greek small letter gamma]\n[template delta[]'''&#x3B4;'''] [/ d Greek small letter delta]\n[template epsilon[]'''&#x3B5;'''] [/ e Greek small letter epsilon]\n[template zeta[]'''&#x3B6;'''] [/ ? Greek small letter zeta]\n[template eta[]'''&#x3B7;'''] [/ ? Greek small letter eta]\n[template theta[]'''&#x3B8;'''] [/ ? Greek small letter theta]\n[template iota[]'''&#x3B9;'''] [/ ? Greek small letter iota]\n[template kappa[]'''&#x3BA;'''] [/ ? Greek small letter kappa]\n[template lambda[]'''&#x3BB;'''] [/ ? Greek small letter lambda]\n[template mu[]'''&#x3BC;'''] [/  Greek small letter mu]\n[template nu[]'''&#x3BD;'''] [/ ? Greek small letter nu]\n[template xi[]'''&#x3BE;'''] [/ ? Greek small letter xi]\n[template omicron[]'''&#x3BF;'''] [/ ? Greek small letter omicron]\n[template pi[]'''&#x3C0;'''] [/ p Greek small letter pi]\n[template rho[]'''&#x3C1;'''] [/ ? Greek small letter rho]\n[template sigmaf[]'''&#x3C2;'''] [/ ? Greek small letter final sigma]\n[template sigma[]'''&#x3C3;'''] [/ s Greek small letter sigma]\n[template tau[]'''&#x3C4;'''] [/ t Greek small letter tau]\n[template upsilon[]'''&#x3C5;'''] [/ ? Greek small letter upsilon]\n[template phi[]'''&#x3C6;'''] [/ f Greek small letter phi]\n[template chi[]'''&#x3C7;'''] [/ ? Greek small letter chi]\n[template psi[]'''&#x3C8;'''] [/ ? Greek small letter psi]\n[template omega[]'''&#x3C9;'''] [/ ? Greek small letter omega]\n[template thetasym[]'''&#x3D1;'''] [/ ? Greek small letter theta symbol]\n[template upsih[]'''&#x3D2;'''] [/ ? Greek upsilon with hook symbol]\n[template piv[]'''&#x3D6;'''] [/ ? Greek pi symbol]\n\n[/Math symbols]\n\n[template bull[]'''&#x2022;'''] [/   bullet = black small circle]\n[template hellip[]'''&#x2026;'''] [/   horizontal ellipsis = three dot leader]\n[template prime[]'''&#x2032;'''] [/  ' prime = minutes = feet]\n[template Prime[]'''&#x2033;'''] [/  ? double prime = seconds = inches]\n[template oline[]'''&#x203E;'''] [/  ? overline = spacing overscore]\n[template frasl[]'''&#x2044;'''] [/  / fraction slash]\n[template weierp[]'''&#x2118;'''] [/  P script capital P = power set = Weierstrass p]\n[template image[]'''&#x2111;'''] [/  I blackletter capital I = imaginary part]\n[template real[]'''&#x211C;'''] [/  R blackletter capital R = real part math symbol]\n[template bigo[]'''&#x1D476;'''] [/  O blackletter capital O = big O symbol]\n[template negative[]'''&#x2115;'''] [/  N blackletter capital N = Negative number math symbol]\n[template trade[]'''&#x2122;'''] [/   trade mark sign]\n[template alefsym[]'''&#x2135;'''] [/  ? alef symbol = first transfinite cardinal]\n[template larr[]'''&#x2190;'''] [/  ? leftwards arrow]\n[template uarr[]'''&#x2191;'''] [/  ? upwards arrow]\n[template rarr[]'''&#x2192;'''] [/  ? rightwards arrow]\n[template darr[]'''&#x2193;'''] [/  ? downwards arrow]\n[template harr[]'''&#x2194;'''] [/  ? left right arrow]\n[template crarr[]'''&#x21B5;'''] [/  ? downwards arrow with corner leftwards = CR]\n[template lArr[]'''&#x21D0;'''] [/  ? leftwards double arrow]\n[template uArr[]'''&#x21D1;'''] [/  ? upwards double arrow]\n[template rArr[]'''&#x21D2;'''] [/  ? rightwards double arrow]\n[template dArr[]'''&#x21D3;'''] [/  ? downwards double arrow]\n[template hArr[]'''&#x21D4;'''] [/  ? left right double arrow]\n[template forall[]'''&#x2200;'''] [/  ? for all]\n[template part[]'''&#x2202;'''] [/  ? partial differential]\n[template exist[]'''&#x2203;'''] [/  ? there exists]\n[template empty[]'''&#x2205;'''] [/   empty set = null set = diameter]\n[template nabla[]'''&#x2207;'''] [/  ? nabla = backward difference]\n[template isin[]'''&#x2208;'''] [/  ? element of]\n[template notin[]'''&#x2209;'''] [/  ? not an element of]\n[template ni[]'''&#x220B;'''] [/  ? contains as member]\n[template prod[]'''&#x220F;'''] [/  ? n-ary product = PI product sign]\n[template sum[]'''&#x2211;'''] [/  ? n-ary sumation]\n[template minus[]'''&#x2212;'''] [/  - minus sign]\n[template lowast[]'''&#x2217;'''] [/  * asterisk operator]\n[template bullet[]'''&#x2219;'''] [/  dot multiply operator ]\n\n[template radic[]'''&#x221A;'''] [/  v square root = radical sign]\n[/template sqrt  v square root = radical sign (duplicate of radic)]\n[template cbrt[]'''&#x221B;'''] [/  cube root= radical sign]\n[template fourthrt[]'''&#x221C;'''] [/  fourth root= radical sign]\n\n[template prop[]'''&#x221D;'''] [/  ? proportional to]\n[template infin[]'''&#x221E;'''] [/  8 infinity]\n[template ang[]'''&#x2220;'''] [/  ? angle]\n[template and[]'''&#x2227;'''] [/  ? logical and = wedge]\n[template or[]'''&#x2228;'''] [/  ? logical or = vee]\n[template cap[]'''&#x2229;'''] [/  n intersection = cap]\n[template cup[]'''&#x222A;'''] [/  ? union = cup]\n[template int[]'''&#x222B;'''] [/  ? integral]\n[template there4[]'''&#x2234;'''] [/  ? therefore]\n[template sim[]'''&#x223C;'''] [/  ~ tilde operator = varies with = similar to]\n[template simeq[]'''&#x2243;'''] [/  ~_asymptotic equality]\n[template cong[]'''&#x2245;'''] [/  =~ approximately equal to]\n[template approx[]'''&#x2248;'''] [/  ? ~~ very approximately equal to]\n[template asymp[]'''&#x2248;'''] [/   almost equal to = asymptotic to]\n[template ne[]'''&#x2260;'''] [/  ? not equal to]\n[template equiv[]'''&#x2261;'''] [/  = identical to]\n[template le[]'''&#x2264;'''] [/  = less-than or equal to]\n[template ge[]'''&#x2265;'''] [/  = greater-than or equal to]\n[template subset[]'''&#x2282;'''] [/  ? subset of]\n[template superset[]'''&#x2283;'''] [/  ? superset of]\n[template nsubset[]'''&#x2284;'''] [/  ? not a subset of]\n[template sube[]'''&#x2286;'''] [/  ? subset of or equal to]\n[template supe[]'''&#x2287;'''] [/  ? superset of or equal to]\n[template oplus[]'''&#x2295;'''] [/  ? circled plus = direct sum]\n[template otimes[]'''&#x2297;'''] [/  ? circled times = vector product]\n[template perp[]'''&#x22A5;'''] [/  ? up tack = orthogonal to = perpendicular]\n[template sdot[]'''&#x22C5;'''] [/   dot operator]\n[template cdot[]'''&#x00B7;'''] [/   dot operator]\n[template lceil[]'''&#x2308;'''] [/  ? left ceiling = APL upstile]\n[template rceil[]'''&#x2309;'''] [/  ? right ceiling]\n[template lfloor[]'''&#x230A;'''] [/  ? left floor = APL downstile]\n[template rfloor[]'''&#x230B;'''] [/  ? right floor]\n[template lang[]'''&#x2329;'''] [/  < left-pointing angle bracket = bra (Firefox shows ?)]\n[template rang[]'''&#x232A;'''] [/  > right-pointing angle bracket = ket (Firefox shows ?)]\n[template loz[]'''&#x25CA;'''] [/  ? lozenge]\n[template spades[]'''&#x2660;'''] [/  ? black spade suit]\n[template clubs[]'''&#x2663;'''] [/  ? black club suit = shamrock]\n[template hearts[]'''&#x2665;'''] [/  ? black heart suit = valentine]\n[template diams[]'''&#x2666;'''] [/  ? black diamond suit]\n[template euro[]'''&#x20AC;'''] [/  ? Euro currency symbol]\n[template lchev[]'''&#x27E8;'''] [/  ? left chevron]\n[template rchev[]'''&#x27E9;'''] [/  right chevron]\n[template rflat[]'''&#x27EE;'''] [/  right flat bracket Misc Math Symbol A]\n[template lflat[]'''&#x27EE;'''] [/  left flat bracket]\n[template mapsto[]'''&#x21A6;'''] [/  function maps to https://en.wikipedia.org/wiki/Maplet ]\n[template obelus[]'''&#x00F7;'''] [/ division dot over and under dash divide symbol]\n[template divide[]'''&#x00F7;'''] [/ division dot over and under dash divide symbol (duplicate of obelus)]\n\n[/ U2000.pdf punctuation]\n[template endash[]'''&#x2013;'''] [/  em width dash]\n[template emdash[]'''&#x2014;'''] [/  en width dash]\n[template hbar[]'''&#x2015;'''] [/  ? horizontal bar - introducing quoted text]\n[template vert2bar[]'''&#x2016;'''] [/  ? double vertical bar]\n[template line2[]'''&#x2016;'''] [/  ? double low line bar]\n[template dagger[]'''&#x2020;'''] [/  ? dagger]\n[template dagger2[]'''&#x2021;'''] [/  ? double dagger]\n[template dot[]'''&#x2024;'''] [/  dot leader]\n[template dot2[]'''&#x2025;'''] [/  ? dots leader]\n[template ellipsis[]'''&#x2026;'''] [/  horizontal ellipsis]\n[template sect[]'''&#x00A7;'''] [/  ? section or paragraph sign]\n\n[template dotover[]'''&#x0307;'''] [/  dot over symbol]\n[template recur[]'''&#x200A;&#x0307;'''] [/ math recurring symbol, eg after 0.333]\n[/ Note use of a thin space before digit, so that dot isn't placed directly over the digit.]\n[/ Use:1[recur]]\n\n[/ Other symbols, not in the HTML4 list:]\n[template enquad[] '''&#x2000;'''] [/ en quad space]\n[template emquad[] '''&#x2001;'''] [/ em quad space]\n[template enspace[] '''&#x2002;'''] [/ em half en space]\n[template emspace[] '''&#x2003;'''] [/ em space type size in points]\n[template thickspace[] '''&#x2004;'''] [/ 3 per em space]\n[template midspace[] '''&#x2005;'''] [/ 4 per em space]\n[template sixemspace[] '''&#x2006;'''] [/ 6 em space]\n[template indent[] '''&#x2006;&#x2006;&#x2006;'''] [/ 3 * 6 = 18 em space suitable for indenting formulae & equations.]\n[template figspace[] '''&#x2007;'''] [/ space = width fixed font digit]\n[template punctspace[] '''&#x2008;'''] [/ space = width punctuation]\n[template thin[] '''&#x2009;'''] [/ thin space ]\n[template hair[] '''&#x200A;'''] [/ hair space]\n[template nbsp[] '''&#x00A0;'''] [/ non-breaking space]\n[template space[] '''&#x00A0;'''] [/ plain non-breaking space == nbsp]\n\n[template nospace[] '''&#x200B;'''] [/ zero width space]\n[template wordjoin[] '''&#x2060;'''] [/ word joiner - no line break either side]\n[template narrownbsp[] '''&#x202F;'''] [/ narrow non-breaking space]\n[template hyphen[] '''&#x2010;'''] [/ soft hyphen]\n[template nbhyphen[] '''&#x2011;'''] [/ non-breaking hyphen]\n\n[template plusminus[]'''&#x00B1;'''] [/  ? plus or minus sign]\n[template sqrt[]'''&#x221A;'''] [/  ? square root sqrt symbol]\n[/template pow2[]'''&#x2073;'''] [/ 2073 is NOT superscript 2 and 3 characters]\n[template pow2[]'''&#x00B2;'''] [/ superscript 2 character]\n[template pow3[]'''&#x00B3;'''] [/ superscript 3 character]\n[/ Unicode 2070 to 209F has super and subscript digits and characters, unicode.org/charts/PDF/U2070.pdf]\n[template pow4[]'''&#x2074;'''] [/ superscript 4 character]\n[template pown[]'''&#x207F;'''] [/ superscript n character]\n[template frac12[]'''&#x00BD;'''] [/ fraction half]\n[template frac13[]'''&#x2153;'''] [/ fraction third]\n[template frac14[]'''&#x00BC;'''] [/ fraction quarter]\n[template frac34[]'''&#x00BE;'''] [/ fraction three quarter]\n[template frac23[]'''&#x2154;'''] [/ fraction two third]\n[template sup1[]'''&#xB9;'''] [/ superscript one = superscript digit one ]\n[template sup2[]'''&#xB2;'''] [/ superscript two = superscript digit two = squared ]\n[template supminus[]'''&#x207B;'''] [/ superscript minus]\n[template supplus[]'''&#x207A;'''] [/ superscript plus]\n\n[template cubed[]'''&#xB3;'''] [/ superscript three = superscript digit three = cubed ]\n[template macron[]'''&#xAF;'''] [/ macron = spacing macron = overline = APL overbar ]\n[template deg[]'''&#xB0;'''] [/ degree sign ]\n[template plusmn[]'''&#xB1;'''] [/ plus-minus sign = plus-or-minus sign ]\n[template micro[]'''&#xB5;'''] [/ micro sign ]\n[template agrave[]'''&#xE0;'''] [/  a  grave ]\n[template aacute[]'''&#xE1;'''] [/  a acute ]\n[template acircum[]'''&#xE2;'''] [/  a acircum ]\n[template atilde[]'''&#xE3;'''] [/  a tilde ]\n[template aumlaut[]'''&#xE4;'''] [/  a umlaut ]\n[template ae[]'''&#xE5;'''] [/  ae]\n\n[template cedil[]'''&#xB8;'''] [/  cedilla = spacing cedilla  ]\n[template ccedil[]'''&#xE7;'''] [/ small c with cedilla ]\n[template Ccedil[]'''&#xE7;'''] [/ capial C with cedilla ]\n\n[template eacute[]'''&#xE9;'''] [/ e acute ]\n[template egrave[]'''&#xE8;'''] [/ e grave ]\n[template eumlaut[]'''&#xEB;'''] [/ e umlaut ]\n\n[template uacute[]'''&#xFA;'''] [/  u acute ]\n[template ugrave[]'''&#xF9;'''] [/ u grave ]\n[template uumlaut[]'''&#xEB;'''] [/ u umlaut ]\n\n[template ordm[]'''&#xBA;'''] [/ masculine ordinal indicator ]\n[template ordf[]'''&#xAA;'''] [/ feminine ordinal indicator ]\n[template laquo[]'''&#xAB;'''] [/ left-pointing double angle quotation mark = left pointing guillemet ]\n[template raquo[]'''&#xBB;'''] [/ right-pointing double angle quotation mark = right pointing guillemet  ]\n\n[/\nCopyright 2007, 2010, 2012 Paul A. Bristow.\nDistributed under the Boost Software License, Version 1.0.\n(See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt).\n]\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/index.idx",
    "content": "#  Copyright 2011 John Maddock. Distributed under the Boost\n#  Software License, Version 1.0. (See accompanying file\n#  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#\n# Rewrite the class scanner to accept declarations, not just definitions, \n# as the docs don't include full definitions.\n#\n!define-scanner class_name \"^[[:space:]]*(template[[:space:]]*<[^;:{]+>[[:space:]]*)?(class|struct)[[:space:]]*(\\<\\w+\\>([[:blank:]]*\\([^)]*\\))?[[:space:]]*)*(\\<\\w*\\>)[[:space:]]*(<[^;:{]+>)?[[:space:]]*(\\{|:[^;\\{()]*\\{)\" \"(?:class|struct)[^;{]+\\\\<\\5\\\\>\\\\s*[;{]\" \\5\n\n!scan-path boost/multiprecision .*\\.hpp true\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/introduction.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:intro Introduction]\n\nThe Multiprecision Library provides [link boost_multiprecision.tut.ints integer],\n[link boost_multiprecision.tut.rational rational],\n[link boost_multiprecision.tut.floats floating-point],\nand [link boost_multiprecision.tut.complex complex] types in C++ that have more\nrange and precision than C++'s ordinary __fundamental types.\nThe big number types in Multiprecision can be used with a wide\nselection of basic mathematical operations, elementary transcendental\nfunctions as well as the functions in Boost.Math.\nThe Multiprecision types can also interoperate with any\n__fundamental_type in C++ using clearly defined conversion rules.\nThis allows Boost.Multiprecision to be used for all\nkinds of mathematical calculations involving integer,\nrational and floating-point types requiring extended\nrange and precision.\n\nMultiprecision consists of a generic interface to the\nmathematics of large numbers as well as a selection of\nbig number back-ends, with support for integer, rational,\nfloating-point, and complex types. Boost.Multiprecision provides a selection\nof back-ends provided off-the-rack in including\ninterfaces to GMP, MPFR, MPIR, MPC, TomMath as well as\nits own collection of Boost-licensed, header-only back-ends for\nintegers, rationals and floats. In addition, user-defined back-ends\ncan be created and used with the interface of Multiprecision,\nprovided the class implementation adheres to the necessary\n[link boost_multiprecision.ref.backendconc concepts].\n\nDepending upon the number type, precision may be arbitrarily large\n(limited only by available memory), fixed at compile time\n(for example, 50 or 100 decimal digits), or a variable controlled at run-time\nby member functions. The types are __expression_templates - enabled for\nbetter performance than naive user-defined types.\n\nThe Multiprecision library comes in two distinct parts:\n\n* An expression-template-enabled front-end `number`\nthat handles all the operator overloading, expression evaluation optimization, and code reduction.\n* A selection of back-ends that implement the actual arithmetic operations, and need conform only to the\nreduced interface requirements of the front-end.\n\nSeparation of front-end and back-end allows use of highly refined, but restricted license libraries\nwhere possible, but provides Boost license alternatives for users who must have a portable\nunconstrained license.\nWhich is to say some back-ends rely on 3rd party libraries,\nbut a header-only Boost license version is always available (if somewhat slower).\n\n[h5:getting_started Getting started with Boost.Multiprecision]\n\nShould you just wish to 'cut to the chase' just to get bigger integers and/or bigger and more precise reals as simply and portably as possible,\nclose to 'drop-in' replacements for the __fundamental_type analogs,\nthen use a fully Boost-licensed number type, and skip to one of more of :\n\n* __cpp_int for multiprecision integers, \n* __cpp_rational for rational types,\n* __cpp_bin_float and __cpp_dec_float for multiprecision floating-point types,  \n* __cpp_complex for complex types.\n\nThe library is very often used via one of the predefined convenience `typedef`s \nlike `boost::multiprecision::int128_t` or `boost::multiprecision::cpp_bin_float_quad`.\n\nFor example, if you want a signed, 128-bit fixed size integer:\n\n   #include <boost/multiprecision/cpp_int.hpp>  //  Integer types.\n   \n   boost::multiprecision::int128_t my_128_bit_int;\n\nAlternatively, and more adventurously, if you wanted an\n[@http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic arbitrary precision]\ninteger type using [gmp] as the underlying implementation then you could use:\n\n   #include <boost/multiprecision/gmp.hpp>  // Defines the wrappers around the GMP library's types\n\n   boost::multiprecision::mpz_int myint;    // Arbitrary precision integer type.\n   \nOr for a simple, portable 128-bit floating-point close to a drop-in for a __fundamental_type like `double`, usually 64-bit   \n\n   #include <boost/multiprecision/cpp_bin_float.hpp>\n   \n   boost::multiprecision::cpp_bin_float_quad my_quad_real;  \n\nAlternatively, you can compose your own 'custom' multiprecision type, by combining `number` with one of the\npredefined back-end types.  For example, suppose you wanted a 300 decimal digit floating-point type\nbased on the [mpfr] library. In this case, there's no predefined `typedef` with that level of precision,\nso instead we compose our own:\n\n   #include <boost/multiprecision/mpfr.hpp>  // Defines the Backend type that wraps MPFR.\n\n   namespace mp = boost::multiprecision;     // Reduce the typing a bit later...\n\n   typedef mp::number<mp::mpfr_float_backend<300> >  my_float;\n\n   my_float a, b, c; // These variables have 300 decimal digits precision.\n\nWe can repeat the above example, but with the expression templates disabled (for faster compile times, but slower runtimes)\nby passing a second template argument to `number`:\n\n   #include <boost/multiprecision/mpfr.hpp>  // Defines the Backend type that wraps MPFR.\n\n   namespace mp = boost::multiprecision;     // Reduce the typing a bit later...\n\n   typedef mp::number<mp::mpfr_float_backend<300>, et_off>  my_float;\n\n   my_float a, b, c; // These variables have 300 decimal digits precision\n\nWe can also mix arithmetic operations between different types, provided there is an unambiguous implicit conversion from one\ntype to the other:\n\n   #include <boost/multiprecision/cpp_int.hpp>\n\n   namespace mp = boost::multiprecision;     // Reduce the typing a bit later...\n\n   mp::int128_t a(3), b(4);\n   mp::int512_t c(50), d;\n\n   d = c * a;   // OK, result of mixed arithmetic is an int512_t\n\nConversions are also allowed:\n\n   d = a; // OK, widening conversion.\n   d = a * b;  // OK, can convert from an expression template too.\n\nHowever conversions that are inherently lossy are either declared explicit or else forbidden altogether:\n\n   d = 3.14;  // Error implicit conversion from double not allowed.\n   d = static_cast<mp::int512_t>(3.14);  // OK explicit construction is allowed\n\nMixed arithmetic will fail if the conversion is either ambiguous or explicit:\n\n   number<cpp_int_backend<>, et_off> a(2);\n   number<cpp_int_backend<>, et_on>  b(3);\n\n   b = a * b; // Error, implicit conversion could go either way.\n   b = a * 3.14; // Error, no operator overload if the conversion would be explicit.\n\n[h4 Move Semantics]\n\nOn compilers that support rvalue-references, class `number` is move-enabled if the underlying backend is.\n\nIn addition the non-expression template operator overloads (see below) are move aware and have overloads\nthat look something like:\n\n   template <class B>\n   number<B, et_off> operator + (number<B, et_off>&& a, const number<B, et_off>& b)\n   {\n       return std::move(a += b);\n   }\n\nThese operator overloads ensure that many expressions can be evaluated without actually generating any temporaries.\nHowever, there are still many simple expressions such as\n\n   a = b * c;\n\nwhich don't noticeably benefit from move support.  Therefore, optimal performance comes from having both\nmove-support, and expression templates enabled.\n\nNote that while \"moved-from\" objects are left in a sane state, they have an unspecified value, and the only permitted\noperations on them are destruction or the assignment of a new value.  Any other operation should be considered\na programming error and all of our backends will trigger an assertion if any other operation is attempted.  This behavior\nallows for optimal performance on move-construction (i.e. no allocation required, we just take ownership of the existing\nobject's internal state), while maintaining usability in the standard library containers.\n\n[h4:expression_templates Expression Templates]\n\nClass `number` is expression-template-enabled: that means that rather than having a multiplication\noperator that looks like this:\n\n   template <class Backend>\n   number<Backend> operator * (const number<Backend>& a, const number<Backend>& b)\n   {\n      number<Backend> result(a);\n      result *= b;\n      return result;\n   }\n\nInstead the operator looks more like this:\n\n   template <class Backend>\n   ``['unmentionable-type]`` operator * (const number<Backend>& a, const number<Backend>& b);\n\nWhere the '['unmentionable]' return type is an implementation detail that, rather than containing the result\nof the multiplication, contains instructions on how to compute the result.  In effect it's just a pair\nof references to the arguments of the function, plus some compile-time information that stores what the operation\nis.\n\nThe great advantage of this method is the ['elimination of temporaries]: for example, the \"naive\" implementation\nof `operator*` above, requires one temporary for computing the result, and at least another one to return it.  It's true\nthat sometimes this overhead can be reduced by using move-semantics, but it can't be eliminated completely.  For example,\nlets suppose we're evaluating a polynomial via Horner's method, something like this:\n\n    T a[7] = { /* some values */ };\n    //....\n    y = (((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0];\n\nIf type `T` is a `number`, then this expression is evaluated ['without creating a single temporary value].  In contrast,\nif we were using the [mpfr_class] C++ wrapper for [mpfr] - then this expression would result in no less than 11\ntemporaries (this is true even though [mpfr_class] does use expression templates to reduce the number of temporaries somewhat).  Had\nwe used an even simpler wrapper around [mpfr] like [mpreal] things would have been even worse and no less that 24 temporaries\nare created for this simple expression (note - we actually measure the number of memory allocations performed rather than\nthe number of temporaries directly, note also that the [mpf_class] wrapper that will be supplied with GMP-5.1 reduces the number of\ntemporaries to pretty much zero).  Note that if we compile with expression templates disabled and rvalue-reference support\non, then actually still have no wasted memory allocations as even though temporaries are created, their contents are moved\nrather than copied.\n[footnote The actual number generated will depend on the compiler, how well it optimizes the code, and whether it supports\nrvalue references.  The number of 11 temporaries was generated with Visual C++ 2010.]\n\n[important\nExpression templates can radically reorder the operations in an expression, for example:\n\n   a = (b * c) * a;\n\nWill get transformed into:\n\n   a *= c;\n   a *= b;\n\nIf this is likely to be an issue for a particular application, then they should be disabled.\n]\n\nThis library also extends expression template support to standard library functions like `abs` or `sin` with `number`\narguments.  This means that an expression such as:\n\n   y = abs(x);\n\ncan be evaluated without a single temporary being calculated.  Even expressions like:\n\n   y = sin(x);\n\nget this treatment, so that variable 'y' is used as \"working storage\" within the implementation of `sin`,\nthus reducing the number of temporaries used by one.  Of course, should you write:\n\n   x = sin(x);\n\nThen we clearly can't use `x` as working storage during the calculation, so then a temporary variable\nis created in this case.\n\nGiven the comments above, you might be forgiven for thinking that expression-templates are some kind of universal-panacea:\nsadly though, all tricks like this have their downsides.  For one thing, expression template libraries\nlike this one, tend to be slower to compile than their simpler cousins, they're also harder to debug\n(should you actually want to step through our code!), and rely on compiler optimizations being turned\non to give really good performance.  Also, since the return type from expressions involving `number`s\nis an \"unmentionable implementation detail\", you have to be careful to cast the result of an expression\nto the actual number type when passing an expression to a template function.  For example, given:\n\n   template <class T>\n   void my_proc(const T&);\n\nThen calling:\n\n   my_proc(a+b);\n\nWill very likely result in obscure error messages inside the body of `my_proc` - since we've passed it\nan expression template type, and not a number type.  Instead we probably need:\n\n   my_proc(my_number_type(a+b));\n\nHaving said that, these situations don't occur that often - or indeed not at all for non-template functions.\nIn addition, all the functions in the Boost.Math library will automatically convert expression-template arguments\nto the underlying number type without you having to do anything, so:\n\n   mpfr_float_100 a(20), delta(0.125);\n   boost::math::gamma_p(a, a + delta);\n\nWill work just fine, with the `a + delta` expression template argument getting converted to an `mpfr_float_100`\ninternally by the Boost.Math library.\n\n[caution In C++11 you should never store an expression template using:\n\n`auto my_expression = a + b - c;`\n\nunless you're absolutely sure that the lifetimes of `a`, `b` and `c` will outlive that of `my_expression`.\n\nIn fact, it is particularly easy to create dangling references by mixing expression templates with the `auto`\nkeyword, for example:\n\n`auto val = cpp_dec_float_50(\"23.1\") * 100;`\n\nIn this situation, the integer literal is stored directly in the expression template - so its use is OK here -\nbut the `cpp_dec_float_50` temporary is stored by reference and then destructed when the statement completes,\nleaving a dangling reference.\n\n[*['If in doubt, do not ever mix expression templates with the `auto` keyword.]]\n]\n\nAnd finally... the performance improvements from an expression template library like this are often not as\ndramatic as the reduction in number of temporaries would suggest.  For example, if we compare this library with\n[mpfr_class] and [mpreal], with all three using the underlying [mpfr] library at 50 decimal digits precision then\nwe see the following typical results for polynomial execution:\n\n[table Evaluation of Order 6 Polynomial.\n[[Library]         [Relative Time]   [Relative number of memory allocations]]\n[[number]          [1.0 (0.00957s)]  [1.0 (2996 total)]]\n[[[mpfr_class]]    [1.1 (0.0102s)]   [4.3 (12976 total)]]\n[[[mpreal]]        [1.6 (0.0151s)]   [9.3 (27947 total)]]\n]\n\nAs you can see, the execution time increases a lot more slowly than the number of memory allocations.  There are\na number of reasons for this:\n\n* The cost of extended-precision multiplication and division is so great, that the times taken for these tend to\nswamp everything else.\n* The cost of an in-place multiplication (using `operator*=`) tends to be more than an out-of-place\n`operator*` (typically `operator *=` has to create a temporary workspace to carry out the multiplication, where\nas `operator*` can use the target variable as workspace).  Since the expression templates carry out their\nmagic by converting out-of-place operators to in-place ones, we necessarily take this hit.  Even so the\ntransformation is more efficient than creating the extra temporary variable, just not by as much as\none would hope.\n\nFinally, note that `number` takes a second template argument, which, when set to `et_off` disables all\nthe expression template machinery.  The result is much faster to compile, but slower at runtime.\n\nWe'll conclude this section by providing some more performance comparisons between these three libraries,\nagain, all are using [mpfr] to carry out the underlying arithmetic, and all are operating at the same precision\n(50 decimal digits):\n\n[table Evaluation of Boost.Math's Bessel function test data\n[[Library]                                  [Relative Time] [Relative Number of Memory Allocations]]\n[[mpfr_float_50]                            [1.0 (5.78s)]   [1.0 (1611963)]]\n[[number<mpfr_float_backend<50>, et_off>[br](but with rvalue reference support)]\n                                            [1.1 (6.29s)]   [2.64 (4260868)]]\n[[[mpfr_class]]                             [1.1 (6.28s)]   [2.45 (3948316)]]\n[[[mpreal]]                                 [1.65 (9.54s)]  [8.21 (13226029)]]\n]\n\n[table Evaluation of Boost.Math's Non-Central T distribution test data\n[[Library][Relative Time][Relative Number of Memory Allocations]]\n[[number]                                   [1.0 (263s)][1.0 (127710873)]]\n[[number<mpfr_float_backend<50>, et_off>[br](but with rvalue reference support)]\n                                            [1.0 (260s)][1.2 (156797871)]]\n[[[mpfr_class]]                             [1.1 (287s)][2.1 (268336640)]]\n[[[mpreal]]                                 [1.5 (389s)][3.6 (466960653)]]\n]\n\nThe above results were generated on Win32 compiling with Visual C++ 2010, all optimizations on (/Ox),\nwith MPFR 3.0 and MPIR 2.3.0.\n\n[endsect] [/section:intro Introduction]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/multiprecision.css",
    "content": "/* Contains the basic settings for BoostBook and used by Quickbook to docbook conversion. */ \n\n/* Note:this import link assumes called from libs/multiprecision/doc/html, not from any backup copy in libs/multiprecision/doc. */\n/* boost-no-inspect */\n@import url('../../../../doc/src/boostbook.css');\n\n/*=============================================================================\nCopyright (c) 2004 Joel de Guzman    http://spirit.sourceforge.net/\nCopyright (c) 2014 John Maddock\nCopyright 2013 Niall Douglas additions for colors and alignment.\nCopyright 2013 Paul A. Bristow additions for more colors and alignments.\nCopyright 2019 Paul A. Bristow additions for more control of serif-italic font etc.\n\nDistributed under the Boost Software License, Version 1.0. (See accompany-\ning file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n    This Cascading Style Sheet is used to override and add to the standard Boost\n    CSS BoostBook for a particular library, for example Boost.Math and Boost.Multiprecision.\n\n    Visual Studio is recommended for editing this file \n    because it checks syntax, does layout and provides help on options.\n\nIMPORTANT: there are two versions of this file - \n\none in libs/math/doc and one in libs/math/doc/html\n\nONLY EVER EDIT THE FIRST OF THESE  !!!!\n\n=============================================================================*/\n\n/*=============================================================================\nProgram listings\n=============================================================================*/\n\n    /* Code on paragraphs */\n    p tt.computeroutput\n    {\n        font-size: 10pt;\n    }\n\n    pre.synopsis\n    {\n        font-size: 10pt;\n        margin: 1pc 4% 0pc 4%;\n        padding: 0.5pc 0.5pc 0.5pc 0.5pc;\n    }\n\n    .programlisting,\n    .screen\n    {\n        font-size: 10pt;\n        display: block;\n        /* was margin: 1pc 4% 0pc 4%; */\n        margin: 1pc 2% 0pc 2%;\n        padding: 0.5pc 0.5pc 0.5pc 0.5pc;\n    }\n\t\t@media screen\n    {\n       /* Syntax Highlighting */\n\t\t\t\t.comment { color: green; }\n\t\t\t\t/* .comment { color: #008000; }\t*/\n\t\t}\t\t\t\t\t\t\n    /* Program listings in tables don't get borders */\n    td .programlisting,\n    td .screen\n    {\n        margin: 0pc 0pc 0pc 0pc;\n        padding: 0pc 0pc 0pc 0pc;\n    }\n\n/*=============================================================================\nTable of contents\n=============================================================================*/\n\n    div.toc\n    {\n       margin: 1pc 4% 0pc 4%;\n       padding: 0.1pc 1pc 0.1pc 1pc;\n       font-size: 100%;\n       line-height: 1.15;\n    }\n\n    .boost-toc\n    {\n       float: right;\n       padding: 0.5pc;\n    }\n\n    /* Code on toc */\n    .toc .computeroutput { font-size: 120% }\n\n    /* No margin on nested menus */\n\n    .toc dl dl { margin: 0; }\n\n\n/*==============================================================================\nAlignment and coloring use 'role' feature, available from Quickbook 1.6 up.\nAdded from Niall Douglas for role color and alignment.\nhttp://article.gmane.org/gmane.comp.lib.boost.devel/243318\n*/\n\n/* Add text alignment (see http://www.w3schools.com/cssref/pr_text_text-align.asp) */\nspan.aligncenter\n{\n  display: inline-block; width: 100%; text-align: center;\n}\nspan.alignright\n{\n  display: inline-block; width: 100%; text-align: right;\n}\n/* alignleft is the default. */\nspan.alignleft\n{\n  display: inline-block; width: 100%; text-align: left;\n}\n\n/* alignjustify stretches the word spacing so that each line has equal width\nwithin a chosen fraction of page width (here arbitrarily 20%).\n*Not* useful inside table items as the column width remains the total string width.\nNor very useful, except to temporarily restrict the width.\n*/\nspan.alignjustify\n{\n  display: inline-block; width: 20%; text-align: justify;\n}\n\n/* Text colors.\nNames at http://www.w3.org/TR/2002/WD-css3-color-20020219/ 4.3. X11 color keywords.\nQuickbook Usage: [role red Some red text]\n\ninline-block - Flows a element inline with the text, but allows width and height to be specified.\n\nhttps://stackoverflow.com/questions/3043021/is-there-any-guide-on-when-to-use-displayblock-when-inline-and-when-inline-b#:~:text=The%20use%20cases%20for%20block,it%27s%20used%20naturally%20for%20images\n\n*/\nspan.red { display:inline-block; color: red; }\nspan.green { display:inline-block; color: green; }\nspan.lime { display:inline-block; color: #00FF00; }\nspan.blue { display:inline-block; color: blue; }\nspan.navy { display:inline-block; color: navy; }\nspan.yellow { display:inline-block; color: yellow; }\nspan.magenta { display:inline-block; color: magenta; }\nspan.indigo { display:inline-block; color: #4B0082; }\nspan.cyan { display:inline-block; color: cyan; }\nspan.purple { display:inline-block; color: purple; }\nspan.gold { display:inline-block; color: gold; }\nspan.silver { display:inline-block; color: silver; } /* lighter gray */\nspan.gray { display:inline-block; color: #808080; } /* light gray */\n\n/* role for inline Unicode mathematical equations,\n    making font an italic (as is conventional for equations)\n    and a serif version of font (to match those generated using .mml to SVG or PNG)\n    and a little bigger (* 125%) because the serif font appears smaller than the default sans serif fonts.\n    Used, for example: [role serif_italic This is in serif font and italic].\n    Used in turn by template for inline expressions to match equations as SVG or PNG images.\n    Can be combined with colors and bold.\n*/\nspan.serif_italic {\n    font-family: serif;\n    font-style: italic;\n    font-size: 125%;\n    font-stretch: expanded;\n}\n\n/* Custom indent of paragraphs to make equations look nicer.\nhttps://www.w3schools.com/tags/tag_blockquote.asp says \n  \"Most browsers will display the <blockquote> element with left and right margin 40px values: \"\n*/\nblockquote {\n    display: block;\n    margin-top: 1em;\n    margin-bottom: 1em;\n    margin-left: 2%;\n    margin-right: 2%;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/multiprecision.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[library Boost.Multiprecision\n    [quickbook 1.7]\n    [copyright 2002-2020 John Maddock and Christopher Kormanyos]\n    [purpose Multiprecision Number library]\n    [license\n         Distributed under the Boost Software License, Version 1.0.\n         (See accompanying file LICENSE_1_0.txt or copy at\n         [@http://www.boost.org/LICENSE_1_0.txt])\n    ]\n    [authors [Maddock, John], [Kormanyos, Christopher]]\n    [/last-revision $Date: 2011-07-08 18:51:46 +0100 (Fri, 08 Jul 2011) $]\n]\n\n[import html4_symbols.qbk] [/Ideally this should be the same as Boost.Math I:\\boost\\libs\\math\\doc]\n\n[import ../example/gmp_snips.cpp]\n[import ../example/mpfr_snips.cpp]\n[import ../example/mpfi_snips.cpp]\n[import ../example/float128_snips.cpp]\n[import ../example/cpp_dec_float_snips.cpp]\n[import ../example/cpp_bin_float_snips.cpp]\n[/import ../example/big_seventh.cpp]\n\n[import ../example/cpp_int_import_export.cpp]\n[import ../example/cpp_bin_float_import_export.cpp]\n[import ../example/tommath_snips.cpp]\n[import ../example/cpp_int_snips.cpp]\n[import ../example/random_snips.cpp]\n[import ../example/safe_prime.cpp]\n[import ../example/mixed_integer_arithmetic.cpp]\n[import ../example/logged_adaptor.cpp]\n[import ../example/numeric_limits_snips.cpp]\n[import ../example/hashing_examples.cpp]\n[import ../example/cpp_complex_examples.cpp]\n[import ../example/mpc_examples.cpp]\n[import ../example/complex128_examples.cpp]\n[import ../example/eigen_example.cpp]\n[import ../example/mpfr_precision.cpp]\n[import ../example/constexpr_float_arithmetic_examples.cpp]\n[import ../test/constexpr_test_cpp_int_5.cpp]\n[import ../test/constexpr_test_cpp_int_7.cpp]\n[import ../performance/mixed_equivalent_types_bench.cpp]\n\n[/External links as templates (see also some defs below)]\n[template mpfr[] [@http://www.mpfr.org MPFR]]\n[template mpc[] [@http://www.multiprecision.org MPC]]\n[template mpfi[] [@http://perso.ens-lyon.fr/nathalie.revol/software.html MPFI]]\n[template gmp[] [@http://gmplib.org GMP]]\n[template mpf_class[] [@http://gmplib.org/manual/C_002b_002b-Interface-Floats.html#C_002b_002b-Interface-Floats mpf_class]]\n[template mpfr_class[] [@http://math.berkeley.edu/~wilken/code/gmpfrxx/ mpfr_class]]\n[template mpreal[] [@http://www.holoborodko.com/pavel/mpfr/ mpreal]]\n[template mpir[] [@http://mpir.org/ MPIR]]\n[template tommath[] [@http://libtom.net libtommath]]\n[template quadmath[] [@http://gcc.gnu.org/onlinedocs/libquadmath/ libquadmath]]\n\n[template super[x]'''<superscript>'''[x]'''</superscript>''']\n[template sub[x]'''<subscript>'''[x]'''</subscript>''']\n\n[/insert Equation as a PNG or SVG image, previous generated with an external tool like Latex.]\n[/Used thus [equation ellint6]  - without the file type suffix which will chosen automatically.]\n\n[template equation[name]  '''<inlinemediaobject>\n<imageobject role=\"html\">\n<imagedata fileref=\"../'''[name]'''.png\"></imagedata>\n</imageobject>\n<imageobject role=\"print\">\n<imagedata fileref=\"../'''[name]'''.svg\"></imagedata>\n</imageobject>\n</inlinemediaobject>''']\n\n[/insert Indented one-line expression italic and serif font probably using Unicode symbols for Greek and symbols.]\n[/Example: [expression [sub 1]F[sub 0](a, z) = (1-z)[super -a]]]\n[template expression[equation] \n[:\n[role serif_italic [equation]]\n]\n[/ Hint you may need to enclose equation in brackets if it contains comma(s) to avoid \"error invalid number of arguments\"]\n]\n\n[def __tick [role aligncenter [role green \\u2714]]] [/ u2714 is a HEAVY CHECK MARK tick (2713 check mark), green]\n[def __cross [role aligncenter [role red \\u2718]]] [/ u2718 is a heavy cross, red]\n[def __star [role aligncenter [role red \\u2736]]] [/ 6-point star red ]\n\n[/Boost.Multiprecision internals links]\n[def __cpp_int [link boost_multiprecision.tut.ints.cpp_int cpp_int]]\n[def __gmp_int [link boost_multiprecision.tut.ints.gmp_int gmp_int]]\n[def __tom_int [link boost_multiprecision.tut.ints.tom_int tom_int]]\n[def __gmp_float [link boost_multiprecision.tut.floats.gmp_float gmp_float]]\n[def __mpf_float [link boost_multiprecision.tut.floats.gmp_float gmp_float]]\n[def __mpfr_float_backend [link boost_multiprecision.tut.floats.mpfr_float mpfr_float]]\n[def __cpp_bin_float [link boost_multiprecision.tut.floats.cpp_bin_float cpp_bin_float]]\n[def __cpp_dec_float [link boost_multiprecision.tut.floats.cpp_dec_float cpp_dec_float]]\n[def __gmp_rational [link boost_multiprecision.tut.rational.gmp_rational gmp_rational]]\n[def __cpp_rational [link boost_multiprecision.tut.rational.cpp_rational cpp_rational]]\n[def __tommath_rational [link boost_multiprecision.tut.rational.tommath_rational tommath_rational]]\n[def __number [link boost_multiprecision.ref.number number]]\n[def __float128__ [link boost_multiprecision.tut.floats.float128 float128]]\n[def __cpp_complex [link boost_multiprecision.tut.complex.cpp_complex cpp_complex]]\n[def __mpc_complex [link boost_multiprecision.tut.complex.mpc_complex mpc_complex]]\n[def __debug_adaptor [link boost_multiprecision.tut.misc.debug_adaptor debug_adaptor]]\n[def __logged_adaptor [link boost_multiprecision.tut.misc.logged_adaptor logged_adaptor]]\n[def __rational_adaptor [link boost_multiprecision.tut.rational.rational_adaptor rational_adaptor]]\n[def __cpp_complex [link boost_multiprecision.tut.complex.cpp_complex cpp_complex]]\n[def __mpfi_float [link boost_multiprecision.tut.interval.mpfi mpfi_float]]\n[def __complex128 [link boost_multiprecision.tut.complex.complex128 complex128]]\n[def __complex_adaptor [link boost_multiprecision.tut.complex.complex_adaptor complex_adaptor]]\n[def __random [link boost_multiprecision.tut.random random number generation]]\n[def __literals [link boost_multiprecision.tut.lits literals]]\n\n[/External references links as macro definitions.]\n[def __expression_template [@https://en.wikipedia.org/wiki/Expression_templates expression template]]\n[def __expression_templates [@https://en.wikipedia.org/wiki/Expression_templates expression templates]] [/plural version]\n[def __UDT [@http://eel.is/c++draft/definitions#defns.prog.def.type program-defined type]]\n[def __fundamental_type [@https://en.cppreference.com/w/cpp/language/types fundamental (built-in) type]]\n[def __fundamental_types [@https://en.cppreference.com/w/cpp/language/types fundamental (built-in) types]]\n[def __fundamental [@https://en.cppreference.com/w/cpp/language/types fundamental (built-in)]]\n[def __math_constants [@https://www.boost.org/doc/libs/release/libs/math/doc/html/math_toolkit/constants.html  Boost.Math constants]]\n[def __boost_macros [@https://www.boost.org/doc/libs/release/libs/config/doc/html/boost_config/boost_macro_reference.html Boost macros]]\n[def __boost_config [@https://www.boost.org/doc/libs/release/libs/config/doc/html/index.html Boost.Config]]\n[def __is_constant_evaluated [@https://en.cppreference.com/w/cpp/types/is_constant_evaluated `std::is_constant_evaluated`]]\n[def __compiler_support [@https://en.cppreference.com/w/cpp/compiler_support compiler support]]\n[def __ULP [@http://en.wikipedia.org/wiki/Unit_in_the_last_place  Unit in the last place (ULP)]]\n[def __Mathematica [@http://www.wolfram.com/products/mathematica/index.html Wolfram Mathematica]]\n[def __WolframAlpha [@http://www.wolframalpha.com/ Wolfram Alpha]]\n[def __Boost_Serialization [@https://www.boost.org/doc/libs/release/libs/serialization/doc/index.html Boost.Serialization]]\n[def __Boost_Math [@https://www.boost.org/doc/libs/release/libs/math/doc/index.html Boost.Math]]\n[def __Boost_Multiprecision [@https://www.boost.org/doc/libs/release/libs/multiprecision/doc/index.html Boost.Multiprecision]]\n\n[include introduction.qbk]\n\n[include tutorial.qbk]\n[include reference.qbk]\n[include performance.qbk]\n[include history.qbk]\n\n[section:indexes Indexes]\n\n'''\n<index type=\"function_name\">\n<title>Function Index</title>\n</index>\n\n<index type=\"class_name\">\n<title>Class Index</title>\n</index>\n\n<index type=\"typedef_name\">\n<title>Typedef Index</title>\n</index>\n\n<index/>\n'''\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/numeric_limits_32_tables.qbk",
    "content": "[/\nCopyright 2013 Paul A. Bristow.\nCopyright 2013 John Maddock.\nDistributed under the Boost Software License, Version 1.0.\n(See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:limits32 Numeric limits for 32-bit platform]\nThese tables were generated using the following program and options:\n\n[pre\n\nProgram:\n numeric_limits_qbk.cpp \nMon Nov  4 18:09:06 2013\nBuildInfo:\n  Platform Win32\n  Compiler Microsoft Visual C++ version 10.0\n  MSVC version 160040219.\n  STL Dinkumware standard library version 520\n  Boost version 1.55.0\n]\n\n[table:integral_constants Integer types constants (`std::numeric_limits<T>::is_integer == true` && is_exact == true)\n[[type][signed][bound][modulo][round][radix][digits][digits10]]\n[[bool][unsigned][bound][no][to zero][2][1][0]]\n[[char][signed][bound][modulo][to zero][2][7][2]]\n[[unsigned char][unsigned][bound][modulo][to zero][2][8][2]]\n[[char16_t][unsigned][bound][modulo][to zero][2][16][4]]\n[[char32_t][unsigned][bound][modulo][to zero][2][32][9]]\n[[short][signed][bound][modulo][to zero][2][15][4]]\n[[unsigned short][unsigned][bound][modulo][to zero][2][16][4]]\n[[int][signed][bound][modulo][to zero][2][31][9]]\n[[unsigned][unsigned][bound][modulo][to zero][2][32][9]]\n[[long][signed][bound][modulo][to zero][2][31][9]]\n[[unsigned long][unsigned][bound][modulo][to zero][2][32][9]]\n[[long long][signed][bound][modulo][to zero][2][63][18]]\n[[unsigned long long][unsigned][bound][modulo][to zero][2][64][19]]\n[[int32_t][signed][bound][modulo][to zero][2][31][9]]\n[[uint32_t][unsigned][bound][modulo][to zero][2][32][9]]\n[[int64_t][signed][bound][modulo][to zero][2][63][18]]\n[[uint64_t][unsigned][bound][modulo][to zero][2][64][19]]\n[[int128_t][signed][bound][modulo][to zero][2][128][38]]\n[[uint128_t][unsigned][bound][modulo][to zero][2][128][38]]\n[[int256_t][signed][bound][modulo][to zero][2][256][77]]\n[[uint256_t][unsigned][bound][modulo][to zero][2][256][77]]\n[[cpp_int][signed][unbounded][no][to zero][2][2147483647][646392383]]\n]\n\n[table:integral_functions Integer types functions (`std::numeric_limits<T>::is_integer == true && std::numeric_limits<T>::min() == std::numeric_limits<T>::lowest()` )\n[[function][max][min]]\n[[bool][1][0]]\n[[char][127][-128]]\n[[unsigned char][255][0]]\n[[char16_t][65535][0]]\n[[char32_t][4294967295][0]]\n[[short][32767][-32768]]\n[[unsigned short][65535][0]]\n[[int][2147483647][-2147483648]]\n[[unsigned int][4294967295][0]]\n[[long][2147483647][-2147483648]]\n[[unsigned long][4294967295][0]]\n[[long long][9223372036854775807][-9223372036854775808]]\n[[unsigned long long][18446744073709551615][0]]\n[[int32_t][2147483647][-2147483648]]\n[[int64_t][9223372036854775807][-9223372036854775808]]\n[[int128_t][340282366920938463463374607431768211455][-340282366920938463463374607431768211455]]]\n[table:float_functions Floating-point types constants (`std::numeric_limits<T>::is_integer==false && is_signed==true && is_modulo==false && is_exact==false && is_bound==true`)\n[[type][round][radix][digits][digits10][max_digits10][min_exp][min_exp10][max_exp][max_exp10][tiny][trap]]\n[[float][to nearest][2][24][6][8][-125][-37][128][38][tiny][traps]]\n\n[[double][to nearest][2][53][15][17][-1021][-307][1024][308][tiny][traps]]\n\n[[long double][to nearest][2][53][15][17][-1021][-307][1024][308][tiny][traps]]\n\n[[cpp_dec_float_50][indeterminate][10][50][50][80][-222953000][-67108864][222953000][67108864][no][no]]\n\n[[bin_128bit_double_type][to nearest][2][377][113][115][-2147482894][-646392082][2147482893][646392082][no][traps]]\n]\n[table:float_functions Floating-point types functions (`std::numeric_limits<T>::is_integer == false`)\n[[function][float][double][long double][cpp_dec_50][cpp_bin_128]][[max][3.40282e+038][1.79769e+308][1.79769e+308][1e+67108865][1.85906e+646456766]]\n[[min][1.17549e-038][2.22507e-308][2.22507e-308][1e-67108864][5.37906e-646456767]]\n[[epsilon][1.19209e-007][2.22045e-016][2.22045e-016][1e-49][6.49713e-114]]\n[[round_error][0.5][0.5][0.5][0.5][0.5]]\n[[infinity][1.#INF][1.#INF][1.#INF][inf][inf]]\n[[quiet_NaN][1.#QNAN][1.#QNAN][1.#QNAN][nan][nan]]\n[[signaling_NaN][1.#QNAN][1.#QNAN][1.#QNAN][0][0]]\n[[denorm_min][1.4013e-045][4.94066e-324][4.94066e-324][0][0]]\n]\n\n\n[endsect] [/section:limits32  Numeric limits for 32-bit platform]\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/numeric_limits_qbk.cpp",
    "content": "// Copyright Paul A. Bristow 2013\n\n// Use, modification and distribution are subject to the\n// Boost Software License, Version 1.0.\n// (See accompanying file LICENSE_1_0.txt\n// or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n// Program to list all numeric_limits items for any type to a file in Quickbook format.\n\n// C standard http://www.open-std.org/jtc1/sc22/wg11/docs/n507.pdf\n// SC22/WG11 N507 DRAFT INTERNATIONAL ISO/IEC STANDARD WD 10967-1\n// Information technology Language independent arithmetic Part 1: Integer and Floating point arithmetic\n\n/* E.3 C++\nThe programming language C++ is defined by ISO/IEC 14882:1998, Programming languages C++ [18].\nAn implementation should follow all the requirements of LIA-1 unless otherwise specified by\nthis language binding.\n*/\n\n// https://doi.org/10.1109/IEEESTD.1985.82928\n\n// http://www.cesura17.net/~will/Professional/Research/Papers/retrospective.pdf\n\n// http://www.exploringbinary.com/using-integers-to-check-a-floating-point-approximation/\n\n// http://stackoverflow.com/questions/12466745/how-to-convert-float-to-doubleboth-stored-in-ieee-754-representation-without-loss\n\n\n#ifdef _MSC_VER\n#  pragma warning (disable : 4127)  // conditional expression is constant.\n#  pragma warning (disable : 4100)  // unreferenced formal parameter.\n#endif\n\n\n#include <iostream>\n#include <iomanip>\n#include <string>\n#include <sstream>\n#include <fstream>\n#include <limits> // numeric_limits\n\n#include <typeinfo>\n\n#include <boost/version.hpp>\n#include <boost/config.hpp>\n\n// May need extra includes for other types, for example:\n#include <boost/multiprecision/cpp_dec_float.hpp> // is decimal.\n#include <boost/multiprecision/cpp_bin_float.hpp> // is binary.\n\n\n// Assume that this will be run on MSVC to get the 32 or 64 bit info.\n#ifdef _WIN32\n  std::string bits32_64 = \"32\";\nstd::string filename = \"numeric_limits_32_tables.qbk\";\n#else\n  std::string bits32_64 = \"64\";\nstd::string filename = \"numeric_limits_64_tables.qbk\";\n#endif\n\n#ifdef INT32_T_MAX\n  int i = INT256_T_MAX;\n#endif\n\nstd::array<std::string, 16> integer_type_names =\n{\n\"bool\",\n\"char\",\n\"unsigned char\",\n\"char16_t\",\n\"char32_t\",\n\"short\",\n\"unsigned short\",\n\"int\",\n\"unsigned int\",\n\"long\",\n\"unsigned long\",\n\"long long\",\n\"unsigned long long\",\n\"int32_t\",\n//\"uint32_t\",\n\"int64_t\",\n//\"uint64_t\",\n\"int128_t\",\n//\"uint128_t\" // Too big?\n//\"int256_t\",\n//\"uint256_t\"\n//\"int512_t\"\n};\n\nstd::array<std::string, 6> float_type_names =\n{\n  \"function\", \"float\", \"double\", \"long double\", \"cpp_dec_50\", \"cpp_bin_128\"\n};\n\n// Table headings for integer constants.\nstd::array<std::string, 8> integer_constant_heads =\n{\n    \"type\", \"signed\", \"bound\", \"modulo\", \"round\", \"radix\", \"digits\", \"digits10\", // \"max_digits10\"\n};\n\n// Table headings for integer functions.\nstd::array<std::string, 2> integer_function_heads =\n{\n  \"max\", // \"lowest\",  assumes is same for all integer types, so not worth listing.\n  \"min\"\n};\n\n// Table headings for float constants.\nstd::array<std::string, 12> float_constant_heads =\n{\n    \"type\", // \"signed\", \"exact\", \"bound\", // \"modulo\",\n    \"round\", \"radix\", \"digits\", \"digits10\", \"max_digits10\", \"min_exp\", \"min_exp10\", \"max_exp\", \"max_exp10\", \"tiny\", \"trap\"\n};\n\n// Table headings for float functions.\nstd::array<std::string, 10> float_function_heads =\n{\n  \"function\", \"max\", \"lowest\", \"min\", \"eps\", \"round\", \"infinity\", \"NaN\", \"sig_NaN\", \"denorm_min\"\n};\n\nstd::string versions()\n{ // Build a string of info about Boost, platform, STL, etc.\n  std::stringstream mess;\n  //mess << \"\\n\" << \"Program:\\n\\\" \" __FILE__  << \"\\\"\\n\"; // \\n is mis-interpreted!\n  mess << \"\\n\" << \"Program:\\n numeric_limits_qbk.cpp \\n\";\n#ifdef __TIMESTAMP__\n  mess << __TIMESTAMP__;\n#endif\n  mess << \"\\nBuildInfo:\\n\" \"  Platform \" << BOOST_PLATFORM;\n  mess << \"\\n  Compiler \" BOOST_COMPILER;\n#ifdef _MSC_FULL_VER\n  mess << \"\\n  MSVC version \"<< BOOST_STRINGIZE(_MSC_FULL_VER) << \".\";\n#endif\n  mess << \"\\n  STL \" BOOST_STDLIB;\n  mess << \"\\n  Boost version \" << BOOST_VERSION/100000 << \".\" << BOOST_VERSION/100 % 1000 << \".\" << BOOST_VERSION % 100 << std::endl;\n  return mess.str();\n} // std::string versions()\n\ntemplate <typename T>\nvoid out_round_style(std::ostream& os)\n{ //! Send short string describing STD::round_style to stream os.\n    // os << \"Round style is \";\n    if (std::numeric_limits<T>::round_style == std::round_indeterminate)\n    {\n     os << \"indeterminate\" ;\n    }\n    else if (std::numeric_limits<T>::round_style == std::round_toward_zero)\n    {\n      os << \"to zero\" ;\n    }\n    else if (std::numeric_limits<T>::round_style == std::round_to_nearest)\n    {\n      os << \"to nearest\" ;\n    }\n    else if (std::numeric_limits<T>::round_style == std::round_toward_infinity)\n    {\n      os << \"to infin[]\"; // Or << \"to \\u221E\"  << \"to infinity\" ;\n    }\n    else if (std::numeric_limits<T>::round_style == std::round_toward_neg_infinity)\n    {\n      os << \"to -infin[]\" ;\n    }\n    else\n    {\n      os << \"undefined!\";\n      std::cout << \"std::numeric_limits<T>::round_style is undefined value!\" << std::endl;\n    }\n    return;\n} // out_round_style(std::ostream& os);\n\ntemplate<typename T>\nvoid integer_constants(std::string type_name, std::ostream& os)\n{ //! Output a line of table integer constant values to ostream os.\n    os << \"\\n[\"\n          \"[\" << type_name << \"]\" ;\n    os << \"[\" << (std::numeric_limits<T>::is_signed ? \"signed\" : \"unsigned\") << \"]\" ;\n    // Is always exact for integer types, so removed:\n    // os << \"[\" << (std::numeric_limits<T>::is_exact ? \"exact\" : \"inexact\") << \"]\" ;\n    os << \"[\" << (std::numeric_limits<T>::is_bounded ? \"bound\" : \"unbounded\") << \"]\" ;\n    os << \"[\" << (std::numeric_limits<T>::is_modulo ? \"modulo\" : \"no\") << \"]\" ;\n    os << \"[\" ; out_round_style<T>(os); os << \"]\" ;\n    os << \"[\" << std::numeric_limits<T>::radix << \"]\" ;\n    os << \"[\" << std::numeric_limits<T>::digits << \"]\" ;\n    os << \"[\" << std::numeric_limits<T>::digits10 << \"]\" ;\n    // Undefined for integers, so removed:\n   // os << \"[\" << std::numeric_limits<T>::max_digits10 << \"]\"\n     os << \"]\";\n} // void integer_constants\n\n\ntemplate<typename T>\nvoid float_constants(std::string type_name, std::ostream& os)\n{ //! Output a row of table values to `ostream` os.\n    os << \"\\n[\"\n          \"[\" << type_name << \"]\" ;\n    //os << \"[\" << (std::numeric_limits<T>::is_signed ? \"signed\" : \"unsigned\") << \"]\" ;\n    //os << \"[\" << (std::numeric_limits<T>::is_exact ? \"exact\" : \"inexact\") << \"]\" ;\n    //os << \"[\" << (std::numeric_limits<T>::is_bounded ? \"bound\" : \"no\") << \"]\" ;\n    // os << \"[\" << (std::numeric_limits<T>::is_modulo ? \"modulo\" : \"no\") << \"]\" ;\n    os << \"[\" ; out_round_style<T>(os); os << \"]\" ;\n    os << \"[\" << std::numeric_limits<T>::radix << \"]\" ;\n    os << \"[\" << std::numeric_limits<T>::digits << \"]\" ;\n    os << \"[\" << std::numeric_limits<T>::digits10 << \"]\" ;\n    os << \"[\" << std::numeric_limits<T>::max_digits10 << \"]\";\n    os << \"[\" << std::numeric_limits<T>::min_exponent << \"]\" ;\n    os << \"[\" << std::numeric_limits<T>::min_exponent10 << \"]\" ;\n    os << \"[\" << std::numeric_limits<T>::max_exponent << \"]\" ;\n    os << \"[\" << std::numeric_limits<T>::max_exponent10  << \"]\" ;\n    os << \"[\" << (std::numeric_limits<T>::tinyness_before ? \"tiny\" : \"no\") << \"]\" ;\n    os << \"[\" << (std::numeric_limits<T>::traps ? \"traps\" : \"no\") << \"]\" ;\n    os << \"]\" \"\\n\"; // end of row.\n} // void float_constants\n\n/* Types across and two functions down.\n\ntemplate<typename T>\nvoid integer_functions(std::string type_name, std::ostream& os)\n{ //! Output a line of table integer function values to `ostream` os.\n    os << \"\\n[\"\n          \"[\" << type_name << \"]\" ;\n    os << \"[\" << std::numeric_limits<T>::max() << \"]\" ;\n    //os << \"[\" << std::numeric_limits<T>::lowest() << \"]\" ;  always == min for integer types,\n    // so removed to save space.\n    os << \"[\" << std::numeric_limits<T>::min() << \"]\"\n      \"]\";\n} // void integer_functions\n\n*/\n\n// Types down and two (or three) functions across.\ntemplate<typename T>\nvoid integer_functions(std::string type_name, std::ostream& os)\n{ //! Output a line of table integer function values to `ostream` os.\n    os << \"\\n[\" // start of row.\n          \"[\" << type_name << \"]\" ;\n    os << \"[\" << (std::numeric_limits<T>::max)() << \"]\" ;\n   // os << \"[\" << std::numeric_limits<T>::lowest() << \"]\" ;\n    os << \"[\" << (std::numeric_limits<T>::min)() << \"]\" ;\n    os <<  \"]\"; // end of row.\n} // void integer_functions\n\n\ntemplate<typename T>\nvoid float_functions(std::string type_name, std::ostream& os)\n{ //! Output a line of table float-point function values to `ostream` os.\n    os << \"\\n[\" // start of row.\n          \"[\" << type_name << \"]\" ;\n    os << \"[\" << (std::numeric_limits<T>::max)() << \"]\" ;\n    os << \"[\" << (std::numeric_limits<T>::lowest)() << \"]\" ;\n    os << \"[\" << (std::numeric_limits<T>::min)() << \"]\"\n    os << \"[\" << std::numeric_limits<T>::epsilon() << \"]\"\n    os << \"[\" << std::numeric_limits<T>::round_error() << \"]\"\n    os << \"[\" << std::numeric_limits<T>::infinity() << \"]\"\n    os << \"[\" << std::numeric_limits<T>::quiet_NaN() << \"]\"\n    os << \"[\" << std::numeric_limits<T>::signaling_NaN() << \"]\"\n    os << \"[\" << std::numeric_limits<T>::denorm_min() << \"]\"\n      \"]\"; // end of row.\n} // void float_functions\n\ntemplate<typename T>\nint numeric_limits_list(std::string description)\n{//!  Output numeric_limits for numeric_limits<T>, for example `numeric_limits_list<bool>()`.\n  // This is not used for Quickbook format.\n  // std::cout << versions()  << std::endl;\n\n  std::cout << \"\\n\" << description << \"\\n\"  << std::endl; // int, int64_t rather than full long typeid(T).name().\n\n  std::cout << \"Type \" << typeid(T).name() << \" std::numeric_limits::<\" << typeid(T).name() << \">\\n\"  << std::endl;\n  // ull long typeid(T).name()\n\n  if (std::numeric_limits<T>::is_specialized == false)\n  {\n    std::cout << \"type \" << typeid(T).name()  << \" is not specialized for std::numeric_limits!\" << std::endl;\n    //return -1;\n  }\n\n  // Member constants.\n\n  std::cout << (std::numeric_limits<T>::is_signed ? \"is signed.\" : \"unsigned.\")  << std::endl;\n  std::cout << (std::numeric_limits<T>::is_integer ? \"is integer.\" : \"not integer (fixed or float-point).\")  << std::endl;\n  std::cout << (std::numeric_limits<T>::is_exact ? \"is exact.\" : \"not exact.\")  << std::endl;\n  std::cout << (std::numeric_limits<T>::has_infinity ? \"has infinity.\" : \"no infinity.\")  << std::endl;\n  std::cout << (std::numeric_limits<T>::has_quiet_NaN ? \"has quiet NaN.\" : \"no quiet NaN.\")  << std::endl;\n  std::cout << (std::numeric_limits<T>::has_signaling_NaN ? \"has signaling NaN.\" : \"no signaling NaN.\")  << std::endl;\n  if (!std::numeric_limits<T>::is_integer)\n  { // is floating_point\n    std::cout << \"Denorm style is \" ;\n    if (std::numeric_limits<T>::has_denorm == std::denorm_absent)\n    {\n      std::cout << \"denorm_absent.\" << std::endl;\n    }\n    else if (std::numeric_limits<T>::has_denorm == std::denorm_present)\n    {\n      std::cout << \"denorm_present.\" << std::endl;\n    }\n    else if (std::numeric_limits<T>::has_denorm == std::denorm_indeterminate)\n    {\n      std::cout << \"denorm_indeterminate.\" << std::endl;\n    }\n    else\n    {\n      std::cout << \"std::numeric_limits<T>::has_denorm unexpected value!\" << std::endl;\n    }\n\n    std::cout << (std::numeric_limits<T>::has_denorm_loss ? \"has denorm loss.\" : \"no denorm loss.\")  << std::endl;\n    // true if a loss of accuracy is detected as a denormalization loss, rather than an inexact result.\n\n    std::cout << \"Round style is \";\n    if (std::numeric_limits<T>::round_style == std::round_indeterminate)\n    {\n      std::cout << \"round_indeterminate!\" << std::endl;\n    }\n    else if (std::numeric_limits<T>::round_style == std::round_toward_zero)\n    {\n      std::cout << \"round_toward_zero.\" << std::endl;\n    }\n    else if (std::numeric_limits<T>::round_style == std::round_to_nearest)\n    {\n      std::cout << \"round_to_nearest.\" << std::endl;\n    }\n    else if (std::numeric_limits<T>::round_style == std::round_toward_infinity)\n    {\n      std::cout << \"round_toward_infinity.\" << std::endl;\n    }\n    else if (std::numeric_limits<T>::round_style == std::round_toward_neg_infinity)\n    {\n      std::cout << \"round_toward_neg_infinity.\" << std::endl;\n    }\n    else\n    {\n      std::cout << \"undefined value!\" << std::endl;\n    }\n\n  } // is floating_point\n\n  std::cout << (std::numeric_limits<T>::is_iec559 ? \"is IEC599.\" : \"not IEC599.\")  << std::endl;\n  std::cout << (std::numeric_limits<T>::is_bounded ? \"is bound.\" : \"unbounded.\")  << std::endl;\n  std::cout << (std::numeric_limits<T>::is_modulo ? \"is modulo.\" : \"no modulo.\")  << std::endl;\n  std::cout << std::dec << \"radix \" << std::numeric_limits<T>::radix  << std::endl;\n  std::cout << \"digits \" << std::numeric_limits<T>::digits  << std::endl;\n  std::cout << \"digits10 \" << std::numeric_limits<T>::digits10  << std::endl;\n\n  std::cout.precision(std::numeric_limits<T>::max_digits10); // Full precision for floating-point values like max, min ...\n\n  std::cout << \"max_digits10 \" << std::numeric_limits<T>::max_digits10  << std::endl;\n  std::cout << \"min_exponent \" << std::numeric_limits<T>::min_exponent  << std::endl;\n  std::cout << \"min_exponent10 \" << std::numeric_limits<T>::min_exponent10  << std::endl;\n  std::cout << \"max_exponent \" << std::numeric_limits<T>::max_exponent  << std::endl;\n  std::cout << \"max_exponent10 \" << std::numeric_limits<T>::max_exponent10  << std::endl;\n\n  std::cout << (std::numeric_limits<T>::tinyness_before ? \"Can tiny values before rounding.\" : \"no tinyness_before.\")  << std::endl;\n  // true if the type can detect tiny values before rounding; false if it cannot.\n  std::cout << (std::numeric_limits<T>::traps ? \"traps\" : \"no trapping.\")  << std::endl;\n  // Whether trapping that reports on arithmetic exceptions is implemented for a type.\n\n  std::cout << \"Member functions.\" << std::endl;\n  // (assumes operator<< for type T is available).\n  // If floating-point then hex format may not be available.\n\n  std::cout << \"max = \" << (std::numeric_limits<T>::max)() << std::endl;\n  //if (std::numeric_limits<T>::is_integer)\n  //{\n  //  std::cout << \"    = \" << std::hex << std::numeric_limits<T>::max() << std::endl;\n  //}\n\n  std::cout << \"lowest = \" << std::dec << std::numeric_limits<T>::lowest() << std::endl;\n  //if (std::numeric_limits<T>::is_integer)\n  //{\n  //   std::cout << \"       = \" << std::hex << std::numeric_limits<T>::lowest() << std::endl;\n  //}\n\n  std::cout << \"min = \" << (std::dec << std::numeric_limits<T>::min)() << std::endl;\n  //if (std::numeric_limits<T>::is_integer)\n  //{\n  //  std::cout << \"    = \" << std::hex << std::numeric_limits<T>::min() << std::endl;\n  //}\n\n  std::cout << \"epsilon = \" << std::dec << std::numeric_limits<T>::epsilon() << std::endl;\n  //if (std::numeric_limits<T>::is_integer)\n  //{\n  //  std::cout << \"        = \" << std::hex << std::numeric_limits<T>::epsilon() << std::endl;\n  //}\n  // round_error is always zero for integer types.\n  // round_error is usually 1/2 = (T)0.5 for floating-point types.\n  // round_error is ? for fixed-point.\n  std::cout << \"round_error = \" << std::numeric_limits<T>::round_error() << \" ULP.\" << std::endl;\n\n  std::cout << \"infinity = \" << std::dec << std::numeric_limits<T>::infinity() << std::endl;\n  std::cout << \"         = \" << std::hex << std::numeric_limits<T>::infinity() << std::endl;\n\n  std::cout << \"quiet_NaN = \" << std::dec << std::numeric_limits<T>::quiet_NaN() << std::endl;\n  std::cout << \"          = \" << std::hex << std::numeric_limits<T>::quiet_NaN() << std::endl;\n\n  std::cout << \"signaling_NaN = \" << std::dec << std::numeric_limits<T>::signaling_NaN() << std::endl;\n  std::cout << \"              = \" << std::hex << std::numeric_limits<T>::signaling_NaN() << std::endl;\n\n  //  Only meaningful if (std::numeric_limits<T>::has_denorm == std::denorm_present)\n  // so might not bother to show if absent?\n  std::cout << \"denorm_min = \" << std::numeric_limits<T>::denorm_min()  << std::endl;\n  std::cout << \"           = \" << std::numeric_limits<T>::denorm_min()  << std::endl;\n  return 0;\n}\n\nint main()\n{\n\n\n\n  try\n  {\n    using namespace boost::multiprecision;\n\n    std::cout << versions() << std::endl;\n\n    std::ofstream fout(filename, std::ios_base::out);\n    if (!fout.is_open())\n    {\n      std::cout << \"Unable to open file \" << filename << \" for output.\\n\" << std::endl;\n      return -1; // boost::EXIT_FAILURE;\n    }\n    fout <<\n      \"[/\"\"\\n\"\n      \"Copyright 2013 Paul A. Bristow.\"\"\\n\"\n      \"Copyright 2013 John Maddock.\"\"\\n\"\n      \"Distributed under the Boost Software License, Version 1.0.\"\"\\n\"\n      \"(See accompanying file LICENSE_1_0.txt or copy at\"\"\\n\"\n      \"http://www.boost.org/LICENSE_1_0.txt).\"\"\\n\"\n      \"]\"\"\\n\"\n    << std::endl;\n\n    fout << \"[section:limits\"<< bits32_64 << \" Numeric limits for \" << bits32_64 << \"-bit platform]\" << std::endl;\n\n    // Output platform version info (32 or 64).\n    fout << \"These tables were generated using the following program and options:\\n\\n\"\n      \"[pre\"\"\\n\"\n      << versions()\n      << \"]\"\"\\n\"\n      << std::endl;\n\n    fout << \"[table:integral_constants Integer types constants (`std::numeric_limits<T>::is_integer == true` && is_exact == true)\" \"\\n\"\n      \"[\";\n\n    for (size_t i = 0; i < integer_constant_heads.size(); i++)\n    { // signed, bound, modulo ...\n      fout << \"[\" << integer_constant_heads[i] << \"]\" ;\n    }\n    fout << \"]\";\n\n    integer_constants<bool>(\"bool\", fout);\n    integer_constants<char>(\"char\", fout);\n    integer_constants<unsigned char>(\"unsigned char\", fout);\n    integer_constants<char16_t>(\"char16_t\", fout);\n    integer_constants<char32_t>(\"char32_t\", fout);\n    integer_constants<short>(\"short\", fout);\n    integer_constants<unsigned short>(\"unsigned short\", fout);\n    integer_constants<int>(\"int\", fout);\n    integer_constants<unsigned int>(\"unsigned\", fout);\n    integer_constants<long>(\"long\", fout);\n    integer_constants<unsigned long>(\"unsigned long\", fout);\n    integer_constants<long long>(\"long long\", fout);\n    integer_constants<unsigned long long>(\"unsigned long long\", fout);\n    integer_constants<int32_t>(\"int32_t\", fout);\n    integer_constants<uint32_t>(\"uint32_t\", fout);\n    integer_constants<int64_t>(\"int64_t\", fout);\n    integer_constants<uint64_t>(\"uint64_t\", fout);\n    integer_constants<int128_t>(\"int128_t\", fout);\n    integer_constants<uint128_t>(\"uint128_t\", fout);\n    integer_constants<int256_t>(\"int256_t\", fout);\n    integer_constants<uint256_t>(\"uint256_t\", fout);\n   // integer_constants<int512_t>(\"int512_t\", fout);\n    //integer_constants<uint512_t>(\"uint512_t\", fout); // Too big?\n    integer_constants<cpp_int>(\"cpp_int\", fout);\n\n    fout << \"\\n]\\n\\n\";\n\n\n    fout << \"[table:integral_functions Integer types functions (`std::numeric_limits<T>::is_integer == true && std::numeric_limits<T>::min() == std::numeric_limits<T>::lowest()` )\" \"\\n\"\n      \"[\";\n    // Display types across the page, and 2 (or 3) functions as rows.\n\n    fout << \"[function]\";\n    for (size_t i = 0; i < integer_function_heads.size(); i++)\n    {\n      fout << \"[\" << integer_function_heads[i] << \"]\" ;\n    }\n    fout << \"]\"; // end of headings.\n    integer_functions<bool>(\"bool\", fout);\n    //integer_functions<char>(\"char\", fout); // Need int value not char.\n    fout << \"\\n[\" // start of row.\n       \"[\" << \"char\"<< \"]\" ;\n    fout << \"[\" << static_cast<int>(std::numeric_limits<char>::max)() << \"]\" ;\n   // fout << \"[\" << (std::numeric_limits<T>::lowest)() << \"]\" ;\n    fout << \"[\" << static_cast<int>(std::numeric_limits<char>::min)() << \"]\" ;\n    fout <<  \"]\"; // end of row.\n    //integer_functions<unsigned char>(\"unsigned char\", fout); // Need int value not char.\n    fout << \"\\n[\" // start of row.\n       \"[\" << \"unsigned char\"<< \"]\" ;\n    fout << \"[\" << static_cast<int>(std::numeric_limits<unsigned char>::max)() << \"]\" ;\n   // fout << \"[\" << std::numeric_limits<unsigned char>::lowest() << \"]\" ;\n    fout << \"[\" << static_cast<int>(std::numeric_limits<unsigned char>::min)() << \"]\" ;\n    fout <<  \"]\"; // end of row.\n\n    integer_functions<char16_t>(\"char16_t\", fout);\n    integer_functions<char32_t>(\"char32_t\", fout);\n    integer_functions<short>(\"short\", fout);\n    integer_functions<unsigned short>(\"unsigned short\", fout);\n    integer_functions<int>(\"int\", fout);\n    integer_functions<unsigned int>(\"unsigned int\", fout);\n    integer_functions<long>(\"long\", fout);\n    integer_functions<unsigned long>(\"unsigned long\", fout);\n    integer_functions<long long>(\"long long\", fout);\n    integer_functions<unsigned long long>(\"unsigned long long\", fout);\n    integer_functions<int32_t>(\"int32_t\", fout);\n    integer_functions<int64_t>(\"int64_t\", fout);\n    integer_functions<int128_t>(\"int128_t\", fout);\n    fout << \"]\" \"\\n\";  // end of table;\n\n\n    //fout << \"[[max]\"\n    //  << \"[\" << std::numeric_limits<bool>::max() << \"]\"\n    //  << \"[\" << static_cast<int>(std::numeric_limits<char>::max()) << \"]\"\n    //  << \"[\" << static_cast<int>(std::numeric_limits<unsigned char>::max()) << \"]\"\n    //  << \"[\" << static_cast<int>(std::numeric_limits<char16_t>::max()) << \"]\"\n    //  << \"[\" << static_cast<int>(std::numeric_limits<char32_t>::max()) << \"]\"\n    //  << \"[\" << std::numeric_limits<short>::max() << \"]\"\n    //  << \"[\" << std::numeric_limits<unsigned short>::max() << \"]\"\n    //  << \"[\" << std::numeric_limits<int>::max() << \"]\"\n    //  << \"[\" << std::numeric_limits<unsigned int>::max() << \"]\"\n    //  << \"[\" << std::numeric_limits<long>::max() << \"]\"\n    //  << \"[\" << std::numeric_limits<unsigned long>::max() << \"]\"\n    //  << \"[\" << std::numeric_limits<long long>::max() << \"]\"\n    //  << \"[\" << std::numeric_limits<unsigned long long>::max() << \"]\"\n    //  << \"[\" << std::numeric_limits<int32_t>::max() << \"]\"\n    //  << \"[\" << std::numeric_limits<int64_t>::max() << \"]\"\n    //  << \"[\" << std::numeric_limits<int128_t>::max() << \"]\"\n    //  //<< \"[\" << std::numeric_limits<int256_t>::max() << \"]\"  // too big?\n    //  //<< \"[\" << std::numeric_limits<int512_t>::max() << \"]\" // too big?\n    //  << \"]\" \"\\n\";\n    ///*  Assume lowest() is not useful as == min for all integer types.\n    // */\n\n    //fout << \"[[min]\"\n    //  << \"[\" << std::numeric_limits<bool>::min() << \"]\"\n    //  << \"[\" << static_cast<int>(std::numeric_limits<char>::min()) << \"]\"\n    //  << \"[\" << static_cast<int>(std::numeric_limits<unsigned char>::min()) << \"]\"\n    //  << \"[\" << static_cast<int>(std::numeric_limits<char16_t>::min()) << \"]\"\n    //  << \"[\" << static_cast<int>(std::numeric_limits<char32_t>::min()) << \"]\"\n    //  << \"[\" << std::numeric_limits<short>::min() << \"]\"\n    //  << \"[\" << std::numeric_limits<unsigned short>::min() << \"]\"\n    //  << \"[\" << std::numeric_limits<int>::min() << \"]\"\n    //  << \"[\" << std::numeric_limits<unsigned int>::min() << \"]\"\n    //  << \"[\" << std::numeric_limits<long>::min() << \"]\"\n    //  << \"[\" << std::numeric_limits<unsigned long>::min() << \"]\"\n    //  << \"[\" << std::numeric_limits<long long>::min() << \"]\"\n    //  << \"[\" << std::numeric_limits<unsigned long long>::min() << \"]\"\n    //  << \"[\" << std::numeric_limits<int32_t>::min() << \"]\"\n    //  << \"[\" << std::numeric_limits<int64_t>::min() << \"]\"\n    //  << \"[\" << std::numeric_limits<int128_t>::min() << \"]\"\n    //  // << \"[\" << std::numeric_limits<int256_t>::min() << \"]\"  // too big?\n    //  // << \"[\" << std::numeric_limits<int512_t>::min() << \"]\"  // too big?\n    //  << \"]\"\"\\n\";\n\n\n\n  // Floating-point\n\n    typedef number<cpp_dec_float<50> > cpp_dec_float_50; // 50 decimal digits.\n    typedef number<cpp_bin_float<113> > bin_128bit_double_type; // == Binary rare long double.\n\n    fout <<\n      //\"[table:float_functions Floating-point types constants (`std::numeric_limits<T>::is_integer == false && std::numeric_limits<T>::is_modulo == false` )\" \"\\n\"\n      \"[table:float_functions Floating-point types constants (`std::numeric_limits<T>::is_integer==false && is_signed==true && is_modulo==false && is_exact==false && is_bound==true`)\" \"\\n\"\n      \"[\";\n    for (size_t i = 0; i < float_constant_heads.size(); i++)\n    {\n      fout << \"[\" << float_constant_heads[i] << \"]\" ;\n    }\n    fout << \"]\"; // end of headings.\n\n    float_constants<float>(\"float\", fout);\n    float_constants<double>(\"double\", fout);\n    float_constants<long double>(\"long double\", fout);\n    float_constants<cpp_dec_float_50>(\"cpp_dec_float_50\", fout);\n    float_constants<bin_128bit_double_type>(\"bin_128bit_double_type\", fout);\n    fout << \"]\" \"\\n\";  // end of table;\n\n    fout <<\n      \"[table:float_functions Floating-point types functions (`std::numeric_limits<T>::is_integer == false`)\" \"\\n\"\n      \"[\";\n\n    for (size_t i = 0; i < float_type_names.size(); i++)\n    {\n      fout << \"[\" << float_type_names[i] << \"]\" ;\n    }\n    fout << \"]\"; // end of headings.\n\n    fout << \"[[max]\"\n      << \"[\" << (std::numeric_limits<float>::max)() << \"]\"\n      << \"[\" << (std::numeric_limits<double>::max)() << \"]\"\n//#if LDBL_MANT_DIG > DBL_MANT_DIG\n    // Perhaps to test Long double is not just a duplication of double (but need change is headings too).\n      << \"[\" << (std::numeric_limits<long double>::max)() << \"]\"\n//#endif\n      << \"[\" << (std::numeric_limits<cpp_dec_float_50>::max)() << \"]\"\n      << \"[\" << (std::numeric_limits<bin_128bit_double_type >::max)() << \"]\"\n      << \"]\" \"\\n\"; // end of row.\n\n    fout << \"[[min]\"\n      << \"[\" << (std::numeric_limits<float>::min)() << \"]\"\n      << \"[\" << (std::numeric_limits<double>::min)() << \"]\"\n//#if LDBL_MANT_DIG > DBL_MANT_DIG\n    // Long double is not just a duplication of double.\n      << \"[\" << (std::numeric_limits<long double>::min)() << \"]\"\n//#endif\n      << \"[\" << (std::numeric_limits<cpp_dec_float_50 >::min)() << \"]\"\n      << \"[\" << (std::numeric_limits<bin_128bit_double_type >::min)() << \"]\"\n      << \"]\" \"\\n\"; // end of row.\n\n    fout << \"[[epsilon]\"\n      << \"[\" << std::numeric_limits<float>::epsilon() << \"]\"\n      << \"[\" << std::numeric_limits<double>::epsilon() << \"]\"\n//#if LDBL_MANT_DIG > DBL_MANT_DIG\n    // Long double is not just a duplication of double.\n      << \"[\" << std::numeric_limits<long double>::epsilon() << \"]\"\n//#endif\n      << \"[\" << std::numeric_limits<cpp_dec_float_50 >::epsilon() << \"]\"\n      << \"[\" << std::numeric_limits<bin_128bit_double_type >::epsilon() << \"]\"\n      << \"]\" \"\\n\"; // end of row.\n\n    fout << \"[[round_error]\"\n      << \"[\" << std::numeric_limits<float>::round_error() << \"]\"\n      << \"[\" << std::numeric_limits<double>::round_error() << \"]\"\n//#if LDBL_MANT_DIG > DBL_MANT_DIG\n    // Long double is not just a duplication of double.\n      << \"[\" << std::numeric_limits<long double>::round_error() << \"]\"\n//#endif\n      << \"[\" << std::numeric_limits<cpp_dec_float_50 >::round_error() << \"]\"\n      << \"[\" << std::numeric_limits<bin_128bit_double_type >::round_error() << \"]\"\n      << \"]\" \"\\n\"; // end of row.\n\n    fout << \"[[infinity]\"\n      << \"[\" << std::numeric_limits<float>::infinity() << \"]\"\n      << \"[\" << std::numeric_limits<double>::infinity() << \"]\"\n//#if LDBL_MANT_DIG > DBL_MANT_DIG\n    // Long double is not just a duplication of double.\n      << \"[\" << std::numeric_limits<long double>::infinity() << \"]\"\n//#endif\n      << \"[\" << std::numeric_limits<cpp_dec_float_50 >::infinity() << \"]\"\n      << \"[\" << std::numeric_limits<bin_128bit_double_type >::infinity() << \"]\"\n      << \"]\" \"\\n\"; // end of row.\n\n    fout << \"[[quiet_NaN]\"\n      << \"[\" << std::numeric_limits<float>::quiet_NaN() << \"]\"\n      << \"[\" << std::numeric_limits<double>::quiet_NaN() << \"]\"\n//#if LDBL_MANT_DIG > DBL_MANT_DIG\n    // Long double is not just a duplication of double.\n      << \"[\" << std::numeric_limits<long double>::quiet_NaN() << \"]\"\n//#endif\n      << \"[\" << std::numeric_limits<cpp_dec_float_50 >::quiet_NaN() << \"]\"\n      << \"[\" << std::numeric_limits<bin_128bit_double_type >::quiet_NaN() << \"]\"\n      << \"]\" \"\\n\"; // end of row.\n\n    fout << \"[[signaling_NaN]\"\n      << \"[\" << std::numeric_limits<float>::signaling_NaN() << \"]\"\n      << \"[\" << std::numeric_limits<double>::signaling_NaN() << \"]\"\n//#if LDBL_MANT_DIG > DBL_MANT_DIG\n    // Long double is not just a duplication of double.\n      << \"[\" << std::numeric_limits<long double>::signaling_NaN() << \"]\"\n//#endif\n      << \"[\" << std::numeric_limits<cpp_dec_float_50 >::signaling_NaN() << \"]\"\n      << \"[\" << std::numeric_limits<bin_128bit_double_type >::signaling_NaN() << \"]\"\n      << \"]\" \"\\n\"; // end of row.\n\n    fout << \"[[denorm_min]\"\n      << \"[\" << std::numeric_limits<float>::denorm_min() << \"]\"\n      << \"[\" << std::numeric_limits<double>::denorm_min() << \"]\"\n//#if LDBL_MANT_DIG > DBL_MANT_DIG\n    // Long double is not just a duplication of double.\n      << \"[\" << std::numeric_limits<long double>::denorm_min() << \"]\"\n//#endif\n      << \"[\" << std::numeric_limits<cpp_dec_float_50 >::denorm_min() << \"]\"\n      << \"[\" << std::numeric_limits<bin_128bit_double_type >::denorm_min() << \"]\"\n      << \"]\" \"\\n\"; // end of row.\n\n\n\n     fout << \"]\" \"\\n\";  // end of table;\n\n\n       fout <<  \"\\n\\n\"\n    \"[endsect] [/section:limits32  Numeric limits for 32-bit platform]\" \"\\n\" << std::endl;\n\n\n\n    fout.close();\n  }\n  catch(std::exception ex)\n  {\n    std::cout << \"exception thrown: \" << ex.what() << std::endl;\n  }\n\n\n} // int main()\n\n/*\n  Description: Autorun \"J:\\Cpp\\Misc\\Debug\\numeric_limits_qbk.exe\"\n\n  Program: I:\\boost-sandbox\\multiprecision.cpp_bin_float\\libs\\multiprecision\\doc\\numeric_limits_qbk.cpp\n  Wed Aug 28 14:17:21 2013\n  BuildInfo:\n    Platform Win32\n    Compiler Microsoft Visual C++ version 10.0\n    MSVC version 160040219.\n    STL Dinkumware standard library version 520\n    Boost version 1.55.0\n\n  */\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/performance.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:perf Performance Comparison]\n\nIn the beginning of the project and throughout,\nmany performance analyses, counts of multiprecision-operations-per-second\nand the like have been performed.\nSome of these are already listed in the ensuing sections.\n\nWe will now provide some general notes on performance, valid\nfor all of the multiprecision backends, before the detailed\nbenchmarks of the following sections.\n\nThe header-only, library-independent Boost-licenses integer\nand floating-point backends including\n__cpp_int for multiprecision integers,\n__cpp_bin_float and __cpp_dec_float for multiprecision floating-point types\nare significantly slower than the world's fastest implementations\ngenerally agreed to be found in GMP/MPIR, MPFR and MPC (which are based on GMP).\nComplex types __cpp_complex that are synthesized from these types\nshare similar relative performances.\n\nThe backends which effectively wrap GMP/MPIR and MPFR\nretain the superior performance of the low-level big-number engines.\nWhen these are used (in association with at least some level of optmization)\nthey achieve and retain the expected low-level performances.\n\nAt low digit counts, however, it is noted that the performances of __cpp_int,\n__cpp_bin_float and __cpp_dec_float can actually meet or exceed\nthose encountered for GMP/MPIR, MPFR, etc. The reason for this\nis because stack allocation and/or the use of fast container\nstorage can actually out-perform the allocation mechanisms in\nGMP/MPIR, which dominate run-time costs at low digit counts.\n\nAs digit counts rise above about 50 or so, however,\nGMP/MPIR performance steadily increases,\nand simultaneously increases beyond (in relation to)\nthe performances of the Boost-licensed, self-written backends.\nAt around a few hundred to several thousands of digits,\nfactors of about two through five are observed,\nwhereby GMP/MPIR-based calculations are (performance-wise)\nsupreior ones.\n\nAt a few thousand decimal digits, the upper end of\nthe Boost backends is reached. At the moment,\nadvanced big-number multiplication schemes in the\nBoost-licensed, self-written backends is limited\nto school multiplication and Karatsuba multiplication.\nHigher-orders of Toom-Cook and FFT-based multiplication\nare not (yet) implemented. So it is not yet\nfeasible to perform mega-digit calculations\nwith the Boost-licensed, self-written backends,\nwhereas these are readily possible with\nthe GMP/MPIR and MPRF based backends.\n\n[include performance_overhead.qbk]\n[include performance_real_world.qbk]\n[include performance_integer_real_world.qbk]\n[include performance_rational_real_world.qbk]\n[include performance_float.qbk]\n[include performance_integer.qbk]\n[include performance_rational.qbk]\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/performance_float.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:float_performance Float Algorithm Performance]\n\nNote that these tests are carefully designed to test performance of the underlying algorithms\nand not memory allocation or variable copying.  As usual, performance results should be taken\nwith a healthy dose of scepticism, and real-world performance may vary widely depending upon the\nspecifics of the program.  In each table relative times are given first, with the best performer\ngiven a score of 1.  Total actual times are given in brackets, measured in seconds for 500000\noperations.\n\n[table Operator *\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][4.45465 (0.0720574s)][4.33995 (0.111688s)][2.90491 (0.850904s)]]\n[[cpp_dec_float][3.82572 (0.061884s)][5.06288 (0.130292s)][5.77019 (1.6902s)]]\n[[gmp_float][1.28958 (0.02086s)][[*1] (0.0257348s)][[*1] (0.292919s)]]\n[[mpfr_float][[*1] (0.0161758s)][2.57159 (0.0661794s)][1.09888 (0.321884s)]]\n]\n[table Operator *(int)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][7.78457 (0.0399504s)][8.32801 (0.0464923s)][5.78369 (0.12206s)]]\n[[cpp_dec_float][12.2836 (0.0630393s)][22.4215 (0.125171s)][115.745 (2.44271s)]]\n[[gmp_float][[*1] (0.00513201s)][[*1] (0.00558264s)][[*1] (0.0211042s)]]\n[[mpfr_float][6.55686 (0.0336498s)][6.08531 (0.0339721s)][3.75579 (0.0792629s)]]\n]\n[table Operator *(unsigned long long)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][3.96061 (0.0508387s)][9.0225 (0.0540758s)][3.84877 (0.0843974s)]]\n[[cpp_dec_float][5.80905 (0.0745654s)][24.6321 (0.147631s)][122.419 (2.68446s)]]\n[[gmp_float][[*1] (0.0128361s)][[*1] (0.00599344s)][[*1] (0.0219284s)]]\n[[mpfr_float][2.15124 (0.0276134s)][4.61073 (0.0276341s)][2.31056 (0.0506668s)]]\n]\n[table Operator *=(unsigned long long)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][6.54027 (0.0500366s)][5.58857 (0.0547429s)][3.33593 (0.0987612s)]]\n[[cpp_dec_float][9.23894 (0.0706828s)][17.6238 (0.172634s)][81.1437 (2.40228s)]]\n[[gmp_float][[*1] (0.00765054s)][[*1] (0.00979552s)][[*1] (0.0296053s)]]\n[[mpfr_float][2.99517 (0.0229147s)][3.55395 (0.0348128s)][2.42098 (0.0716736s)]]\n]\n[table Operator +\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][2.61482 (0.0479759s)][6.91285 (0.0901201s)][8.04302 (0.219881s)]]\n[[cpp_dec_float][1.08384 (0.0198859s)][1.6631 (0.0216812s)][7.59843 (0.207727s)]]\n[[gmp_float][1.00042 (0.0183555s)][[*1] (0.0130366s)][[*1] (0.0273382s)]]\n[[mpfr_float][[*1] (0.0183477s)][1.4588 (0.0190178s)][2.22935 (0.0609463s)]]\n]\n[table Operator +(int)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][11.8195 (0.0524679s)][13.9144 (0.0871804s)][13.6745 (0.165014s)]]\n[[cpp_dec_float][3.22445 (0.0143136s)][2.703 (0.0169356s)][12.5227 (0.151114s)]]\n[[gmp_float][[*1] (0.00443909s)][[*1] (0.00626549s)][[*1] (0.0120673s)]]\n[[mpfr_float][5.78563 (0.0256829s)][4.78942 (0.0300081s)][5.21353 (0.062913s)]]\n]\n[table Operator +(unsigned long long)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][21.4259 (0.109321s)][16.4546 (0.128103s)][14.7256 (0.16427s)]]\n[[cpp_dec_float][4.53931 (0.0231609s)][3.75913 (0.0292658s)][13.3516 (0.148942s)]]\n[[gmp_float][[*1] (0.0051023s)][[*1] (0.00778526s)][[*1] (0.0111554s)]]\n[[mpfr_float][5.11905 (0.0261189s)][3.73777 (0.0290995s)][5.52758 (0.0616622s)]]\n]\n[table Operator +=(unsigned long long)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][6.6778 (0.109847s)][6.84045 (0.0942496s)][9.09759 (0.157162s)]]\n[[cpp_dec_float][1.06799 (0.017568s)][1.71962 (0.0236933s)][10.7777 (0.186187s)]]\n[[gmp_float][[*1] (0.0164496s)][[*1] (0.0137783s)][[*1] (0.0172751s)]]\n[[mpfr_float][3.47654 (0.0571878s)][3.64857 (0.0502709s)][4.56004 (0.0787754s)]]\n]\n[table Operator -\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][5.04597 (0.0688937s)][4.65775 (0.0896788s)][7.55005 (0.196627s)]]\n[[cpp_dec_float][1.42357 (0.0194363s)][1.62766 (0.0313385s)][8.16298 (0.21259s)]]\n[[gmp_float][[*1] (0.0136532s)][[*1] (0.0192537s)][[*1] (0.0260432s)]]\n[[mpfr_float][1.76726 (0.0241287s)][2.05663 (0.0395976s)][2.48295 (0.0646638s)]]\n]\n[table Operator -(int)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][6.31633 (0.0848243s)][7.07646 (0.084402s)][6.65523 (0.181209s)]]\n[[cpp_dec_float][1.6139 (0.0216737s)][2.20945 (0.0263524s)][5.27802 (0.14371s)]]\n[[gmp_float][[*1] (0.0134294s)][[*1] (0.0119272s)][[*1] (0.0272281s)]]\n[[mpfr_float][5.1551 (0.0692297s)][5.48391 (0.0654074s)][2.6116 (0.0711089s)]]\n]\n[table Operator -(unsigned long long)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][9.08373 (0.102878s)][4.54284 (0.0883961s)][7.01771 (0.185162s)]]\n[[cpp_dec_float][2.19345 (0.0248419s)][1.47898 (0.0287785s)][5.71248 (0.150724s)]]\n[[gmp_float][[*1] (0.0113255s)][[*1] (0.0194584s)][[*1] (0.026385s)]]\n[[mpfr_float][5.35926 (0.0606961s)][2.92255 (0.056868s)][3.43277 (0.0905736s)]]\n]\n[table Operator -=(unsigned long long)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][8.73347 (0.129938s)][4.58762 (0.101449s)][5.43827 (0.163157s)]]\n[[cpp_dec_float][1.67927 (0.0249846s)][1.79526 (0.0396995s)][6.63379 (0.199025s)]]\n[[gmp_float][[*1] (0.0148782s)][[*1] (0.0221136s)][[*1] (0.0300017s)]]\n[[mpfr_float][3.96488 (0.0589902s)][3.30899 (0.0731736s)][3.51566 (0.105476s)]]\n]\n[table Operator /\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][5.40221 (0.549759s)][10.0182 (1.39191s)][12.3684 (5.32129s)]]\n[[cpp_dec_float][8.16505 (0.83092s)][12.483 (1.73437s)][52.8644 (22.744s)]]\n[[gmp_float][[*1] (0.101766s)][[*1] (0.138938s)][[*1] (0.430233s)]]\n[[mpfr_float][1.6699 (0.169939s)][2.16251 (0.300455s)][2.82683 (1.2162s)]]\n]\n[table Operator /(int)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][5.81464 (0.141651s)][12.2991 (0.271491s)][8.20246 (0.643802s)]]\n[[cpp_dec_float][16.4865 (0.40163s)][39.0331 (0.861622s)][164 (12.8722s)]]\n[[gmp_float][[*1] (0.0243611s)][[*1] (0.0220741s)][[*1] (0.0784889s)]]\n[[mpfr_float][2.25501 (0.0549347s)][2.6832 (0.0592293s)][1.60852 (0.126251s)]]\n]\n[table Operator /(unsigned long long)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][10.879 (0.19558s)][10.4845 (0.244599s)][8.82445 (0.621615s)]]\n[[cpp_dec_float][22.028 (0.396014s)][42.4784 (0.991001s)][201.351 (14.1836s)]]\n[[gmp_float][[*1] (0.0179778s)][[*1] (0.0233296s)][[*1] (0.0704423s)]]\n[[mpfr_float][2.89723 (0.0520857s)][2.6935 (0.0628383s)][1.67233 (0.117803s)]]\n]\n[table Operator /=(unsigned long long)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][11.0264 (0.215322s)][7.78235 (0.256093s)][8.31638 (0.638041s)]]\n[[cpp_dec_float][20.9412 (0.408938s)][38.8146 (1.27727s)][142.377 (10.9233s)]]\n[[gmp_float][[*1] (0.0195279s)][[*1] (0.032907s)][[*1] (0.076721s)]]\n[[mpfr_float][2.67894 (0.0523141s)][2.16678 (0.071302s)][1.5964 (0.122477s)]]\n]\n[table Operator construct\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][[*1] (0.0030982s)][1.37355 (0.00608929s)][[*1] (0.0152335s)]]\n[[cpp_dec_float][1.23911 (0.00383901s)][[*1] (0.00443324s)][1.6806 (0.0256013s)]]\n[[gmp_float][7.50258 (0.0232445s)][5.47554 (0.0242744s)][5.81062 (0.0885159s)]]\n[[mpfr_float][24.9598 (0.0773304s)][19.5526 (0.0866815s)][5.00378 (0.0762248s)]]\n]\n[table Operator construct(unsigned long long)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][2.08541 (0.0175206s)][3.12821 (0.0267453s)][1.32687 (0.0570308s)]]\n[[cpp_dec_float][[*1] (0.00840151s)][[*1] (0.00854971s)][[*1] (0.0429815s)]]\n[[gmp_float][3.08163 (0.0258903s)][2.44895 (0.0209379s)][2.12806 (0.0914671s)]]\n[[mpfr_float][10.6814 (0.08974s)][8.42482 (0.0720298s)][1.8282 (0.0785786s)]]\n]\n[table Operator construct(unsigned)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][1.04974 (0.00808983s)][1.38823 (0.0120486s)][1.16321 (0.0530205s)]]\n[[cpp_dec_float][[*1] (0.00770653s)][[*1] (0.00867913s)][[*1] (0.0455813s)]]\n[[gmp_float][3.88496 (0.0299395s)][2.90503 (0.0252132s)][1.82072 (0.0829907s)]]\n[[mpfr_float][13.3088 (0.102564s)][8.41333 (0.0730204s)][1.78408 (0.0813206s)]]\n]\n[table Operator str\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][6.09659 (0.00301165s)][4.71882 (0.0051705s)][12.4899 (0.043165s)]]\n[[cpp_dec_float][2.94087 (0.00145276s)][1.64843 (0.00180621s)][3.16004 (0.0109211s)]]\n[[gmp_float][[*1] (0.000493989s)][[*1] (0.00109572s)][[*1] (0.00345598s)]]\n[[mpfr_float][4.60349 (0.00227407s)][1.21213 (0.00132816s)][1.41569 (0.0048926s)]]\n]\n\n[table:platform Platform Details\n[[][Version]]\n[[Compiler][GNU C++ version 10.3.0]]\n[[GMP][6.2.0]]\n[[MPFR][262146]]\n[[Boost][107800]]\n[[Run date][Sep 30 2021]]\n]\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/performance_integer.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:integer_performance Integer Algorithm Performance]\n\nNote that these tests are carefully designed to test performance of the underlying algorithms\nand not memory allocation or variable copying.  As usual, performance results should be taken\nwith a healthy dose of scepticism, and real-world performance may vary widely depending upon the\nspecifics of the program.  In each table relative times are given first, with the best performer\ngiven a score of 1.  Total actual times are given in brackets, measured in seconds for 500000\noperations.\n\n[table Operator %\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][1.51155 (0.0481508s)][1.60666 (0.0825917s)][1.75956 (0.127209s)][1.87154 (0.171986s)][2.58143 (0.368469s)][[*1] (0.512768s)][1.42429 (1.03083s)][[*1] (1.96988s)]]\n[[cpp_int(fixed)][[*1] (0.0318553s)][1.2913 (0.0663805s)][1.33672 (0.0966394s)][1.97924 (0.181883s)]]\n[[gmp_int][1.4659 (0.0466966s)][[*1] (0.0514059s)][[*1] (0.0722958s)][[*1] (0.0918952s)][[*1] (0.142738s)][[*1] (0.24073s)][1.17701 (0.603534s)][[*1] (0.723753s)]]\n[[tommath_int][27.46 (0.874748s)][20.1749 (1.03711s)][17.9774 (1.29969s)][19.0867 (1.75398s)][23.3789 (3.33706s)][26.6546 (6.41658s)][33.4553 (17.1548s)][70.788 (51.233s)]]\n]\n[table Operator %(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][[*1] (0.00790481s)][1.45288 (0.0215141s)][2.71488 (0.065874s)][4.05695 (0.1044s)][6.59285 (0.288068s)][3.58045 (0.429244s)][6.18417 (0.851447s)][[*1] (1.57951s)]]\n[[cpp_int(fixed)][2.18748 (0.0172916s)][1.67119 (0.0247468s)][2.83861 (0.0688759s)][4.3186 (0.111133s)]]\n[[gmp_int][1.50165 (0.0118703s)][[*1] (0.0148079s)][[*1] (0.024264s)][[*1] (0.0257336s)][[*1] (0.0436939s)][[*1] (0.0571251s)][[*1] (0.119886s)][[*1] (0.137682s)]]\n[[tommath_int][68.9623 (0.545134s)][54.52 (0.807325s)][38.3573 (0.930702s)][53.0833 (1.36603s)][59.6958 (2.60834s)][103.597 (5.91797s)][133.648 (16.0225s)][392.812 (54.083s)]]\n]\n[table Operator &\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][2.82137 (0.0101034s)][3.08842 (0.0128886s)][3.46566 (0.018172s)][2.55025 (0.0204051s)][2.97241 (0.0461406s)][[*1] (0.0440714s)][[*1] (0.0811524s)][[*1] (0.146531s)]]\n[[cpp_int(fixed)][[*1] (0.00358104s)][1.5374 (0.00641591s)][1.70378 (0.0089337s)][2.40825 (0.019269s)]]\n[[gmp_int][1.10071 (0.00394167s)][[*1] (0.00417321s)][[*1] (0.00524347s)][[*1] (0.00800121s)][[*1] (0.015523s)][1.04806 (0.0384586s)][2.0133 (0.0887291s)][1.38531 (0.112421s)]]\n[[tommath_int][2.18066 (0.00780901s)][2.22528 (0.00928657s)][2.15567 (0.0113032s)][3.05906 (0.0244762s)][2.34741 (0.0364387s)][1.50551 (0.0552444s)][2.29355 (0.10108s)][3.0313 (0.245997s)]]\n]\n[table Operator &(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][3.24695 (0.0124861s)][1.81002 (0.0114113s)][2.11984 (0.0179186s)][2.56949 (0.0262296s)][3.62157 (0.063826s)][3.95427 (0.0593859s)][4.84754 (0.102968s)][[*1] (0.168385s)]]\n[[cpp_int(fixed)][[*1] (0.0038455s)][[*1] (0.00630453s)][[*1] (0.00845281s)][2.20848 (0.0225444s)]]\n[[gmp_int][3.87448 (0.0148993s)][1.50343 (0.00947844s)][1.59793 (0.013507s)][[*1] (0.0102081s)][[*1] (0.0176239s)][[*1] (0.0121449s)][[*1] (0.0150182s)][[*1] (0.0212413s)]]\n[[tommath_int][25.1094 (0.0965583s)][15.7147 (0.0990734s)][9.65097 (0.0815778s)][8.5208 (0.0869813s)][5.74798 (0.101302s)][10.598 (0.128712s)][12.0534 (0.18102s)][13.0183 (0.276527s)]]\n]\n[table Operator *\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][12.4201 (0.0145016s)][1.838 (0.0246772s)][2.10406 (0.0631704s)][2.22846 (0.224062s)][2.53789 (0.918685s)][[*1] (2.65154s)][[*1] (7.83314s)][[*1] (26.1836s)]]\n[[cpp_int(fixed)][[*1] (0.00116759s)][1.76789 (0.0237359s)][1.58515 (0.047591s)][1.52628 (0.153461s)]]\n[[gmp_int][4.80091 (0.00560549s)][[*1] (0.0134261s)][[*1] (0.0300231s)][[*1] (0.100546s)][[*1] (0.361988s)][[*1] (1.11701s)][2.08347 (5.52441s)][1.44767 (11.3398s)]]\n[[tommath_int][16.9604 (0.0198027s)][2.43157 (0.0326465s)][2.82213 (0.0847288s)][1.67653 (0.168568s)][1.27293 (0.460786s)][1.41678 (1.58255s)][2.69181 (7.13744s)][3.30421 (25.8824s)]]\n]\n[table Operator *(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][10.9781 (0.0072726s)][1.52901 (0.00991594s)][3.35266 (0.0194072s)][2.30215 (0.0214459s)][1.95214 (0.047049s)][[*1] (0.0576663s)][[*1] (0.0955853s)][[*1] (0.167493s)]]\n[[cpp_int(fixed)][[*1] (0.000662467s)][[*1] (0.00648519s)][1.52643 (0.0088359s)][2.26708 (0.0211192s)]]\n[[gmp_int][7.14641 (0.00473426s)][1.74133 (0.0112929s)][[*1] (0.00578859s)][[*1] (0.00931559s)][[*1] (0.0241013s)][1.12075 (0.0477494s)][1.96831 (0.113505s)][1.44107 (0.137745s)]]\n[[tommath_int][156.154 (0.103447s)][14.5292 (0.0942242s)][16.82 (0.0973642s)][11.9029 (0.110883s)][5.61803 (0.135402s)][4.61241 (0.196512s)][5.30415 (0.30587s)][5.73424 (0.548109s)]]\n]\n[table Operator *(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][8.98335 (0.00669928s)][1.79861 (0.00820918s)][1.86924 (0.0119122s)][1.71773 (0.0175683s)][2.57826 (0.0539343s)][[*1] (0.0432066s)][[*1] (0.0813634s)][[*1] (0.159452s)]]\n[[cpp_int(fixed)][[*1] (0.000745744s)][1.07211 (0.00489332s)][1.19888 (0.00764018s)][1.53618 (0.0157115s)]]\n[[gmp_int][4.97741 (0.00371188s)][[*1] (0.00456418s)][[*1] (0.00637276s)][[*1] (0.0102277s)][[*1] (0.0209189s)][[*1] (0.0321931s)][2.05197 (0.0886586s)][1.59261 (0.12958s)]]\n[[tommath_int][143.938 (0.107341s)][24.0751 (0.109883s)][16.9325 (0.107907s)][11.5473 (0.118102s)][8.08283 (0.169084s)][6.84808 (0.220461s)][8.37134 (0.361697s)][8.20104 (0.667264s)]]\n]\n[table Operator *=(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][15.7803 (0.0131299s)][1.67116 (0.00790233s)][1.66661 (0.0119079s)][1.51408 (0.0203561s)][1.23815 (0.0373067s)][[*1] (0.0424701s)][[*1] (0.0946934s)][[*1] (0.177219s)]]\n[[cpp_int(fixed)][[*1] (0.000832044s)][[*1] (0.00472864s)][[*1] (0.00714494s)][[*1] (0.0134446s)]]\n[[gmp_int][6.73473 (0.00560359s)][1.81651 (0.00858963s)][1.36813 (0.00977523s)][1.00404 (0.0134989s)][[*1] (0.0301309s)][[*1] (0.0457849s)][2.56449 (0.108914s)][2.20384 (0.208689s)]]\n[[tommath_int][115.266 (0.0959064s)][24.7701 (0.117129s)][15.9941 (0.114277s)][11.3798 (0.152996s)][5.69861 (0.171704s)][5.47882 (0.250847s)][10.6875 (0.453899s)][7.29439 (0.690731s)]]\n]\n[table Operator +\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][9.80738 (0.0086037s)][2.34204 (0.0160922s)][1.00627 (0.0131305s)][1.67865 (0.0163002s)][1.88916 (0.033949s)][[*1] (0.0412289s)][[*1] (0.083134s)][[*1] (0.190174s)]]\n[[cpp_int(fixed)][[*1] (0.000877268s)][[*1] (0.00687102s)][1.82016 (0.0237507s)][1.90391 (0.0184876s)]]\n[[gmp_int][5.87168 (0.00515104s)][1.45191 (0.00997612s)][[*1] (0.0130487s)][[*1] (0.00971031s)][[*1] (0.0179704s)][[*1] (0.0300729s)][1.96754 (0.0811195s)][1.62045 (0.134715s)]]\n[[tommath_int][13.6707 (0.0119929s)][1.03266 (0.00709542s)][1.02249 (0.0133422s)][1.4749 (0.0143218s)][1.17551 (0.0211244s)][1.08462 (0.0326177s)][1.47125 (0.060658s)][2.75813 (0.229295s)]]\n]\n[table Operator +(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][7.65014 (0.00534018s)][1.8992 (0.0063589s)][1.56778 (0.00666443s)][1.29719 (0.00836612s)][1.73231 (0.0204874s)][[*1] (0.0198385s)][[*1] (0.0338486s)][[*1] (0.0760202s)]]\n[[cpp_int(fixed)][[*1] (0.000698051s)][1.72665 (0.00578118s)][1.57164 (0.00668085s)][1.90796 (0.0123052s)]]\n[[gmp_int][4.97679 (0.00347405s)][[*1] (0.0033482s)][[*1] (0.00425087s)][[*1] (0.0064494s)][[*1] (0.0118266s)][[*1] (0.0195694s)][3.53343 (0.0700979s)][2.28146 (0.0772241s)]]\n[[tommath_int][127.407 (0.0889366s)][24.8716 (0.0832749s)][20.4864 (0.0870848s)][12.5462 (0.0809152s)][7.07209 (0.083639s)][4.79434 (0.0938225s)][5.93694 (0.11778s)][5.20775 (0.176275s)]]\n]\n[table Operator +(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][9.92952 (0.00893714s)][2.68575 (0.0136811s)][1.73024 (0.0102989s)][1.43961 (0.0115471s)][1.46556 (0.0237404s)][[*1] (0.0253811s)][[*1] (0.0350422s)][[*1] (0.0761856s)]]\n[[cpp_int(fixed)][[*1] (0.000900057s)][1.27396 (0.00648945s)][1.38787 (0.008261s)][1.56798 (0.0125768s)]]\n[[gmp_int][5.22669 (0.00470432s)][[*1] (0.00509394s)][[*1] (0.00595229s)][[*1] (0.00802101s)][[*1] (0.0161988s)][[*1] (0.0174726s)][1.83602 (0.0466003s)][1.90731 (0.0668364s)]]\n[[tommath_int][100.859 (0.0907784s)][19.2654 (0.0981367s)][14.4537 (0.0860324s)][10.0594 (0.0806864s)][5.71755 (0.0926177s)][6.23483 (0.108939s)][4.63528 (0.117648s)][5.01743 (0.175822s)]]\n]\n[table Operator +=(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][12.2366 (0.0106404s)][1.48157 (0.00996803s)][1.58862 (0.0108279s)][2.06658 (0.0131949s)][1.1631 (0.0186902s)][[*1] (0.0218483s)][[*1] (0.0394761s)][[*1] (0.0783171s)]]\n[[cpp_int(fixed)][[*1] (0.000869555s)][1.34779 (0.00906799s)][[*1] (0.00681593s)][[*1] (0.00638493s)]]\n[[gmp_int][11.3522 (0.00987134s)][[*1] (0.00672804s)][1.27495 (0.00868995s)][2.42237 (0.0154667s)][[*1] (0.0160693s)][1.09672 (0.0221405s)][2.61199 (0.0570676s)][2.13093 (0.0841208s)]]\n[[tommath_int][88.4252 (0.0768906s)][14.139 (0.0951277s)][11.6282 (0.0792569s)][14.5551 (0.0929332s)][6.86867 (0.110375s)][5.67471 (0.11456s)][7.29502 (0.159384s)][5.733 (0.226317s)]]\n]\n[table Operator -\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][4.45457 (0.00859678s)][1.28478 (0.013219s)][1.27873 (0.0117779s)][1.43649 (0.0151597s)][2.82516 (0.0507822s)][[*1] (0.0463464s)][[*1] (0.0813138s)][[*1] (0.191562s)]]\n[[cpp_int(fixed)][[*1] (0.00192988s)][[*1] (0.010289s)][[*1] (0.00921062s)][1.5372 (0.0162226s)]]\n[[gmp_int][3.4436 (0.00664573s)][1.25045 (0.0128659s)][1.10953 (0.0102195s)][[*1] (0.0105533s)][[*1] (0.017975s)][[*1] (0.0321962s)][2.54862 (0.11812s)][1.83623 (0.14931s)]]\n[[tommath_int][9.3224 (0.0179911s)][1.08796 (0.011194s)][1.93265 (0.017801s)][1.82306 (0.0192393s)][1.55663 (0.0279804s)][1.6544 (0.0532653s)][1.90928 (0.0884881s)][4.41259 (0.358805s)]]\n]\n[table Operator -(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][3.07164 (0.00347144s)][1.38957 (0.00531251s)][1.29053 (0.00548206s)][1.35239 (0.00759591s)][1.50007 (0.0176467s)][[*1] (0.0209158s)][[*1] (0.0402632s)][[*1] (0.0674681s)]]\n[[cpp_int(fixed)][[*1] (0.00113016s)][1.26281 (0.00482789s)][1.25074 (0.00531307s)][3.3923 (0.0190533s)]]\n[[gmp_int][3.22069 (0.00363988s)][[*1] (0.00382312s)][[*1] (0.00424793s)][[*1] (0.00561665s)][[*1] (0.0117639s)][[*1] (0.0225873s)][2.75829 (0.0576919s)][2.03214 (0.0818204s)]]\n[[tommath_int][81.1433 (0.0917047s)][21.4543 (0.0820224s)][19.3098 (0.0820267s)][16.2994 (0.0915478s)][7.23608 (0.0851246s)][4.48441 (0.101291s)][5.51882 (0.115431s)][4.44737 (0.179066s)]]\n]\n[table Operator -(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][7.02787 (0.00807189s)][1.85949 (0.00922027s)][1.40179 (0.00830959s)][1.22546 (0.00988039s)][1.27526 (0.0235442s)][[*1] (0.0242017s)][[*1] (0.0317445s)][[*1] (0.0783054s)]]\n[[cpp_int(fixed)][[*1] (0.00114855s)][1.03947 (0.00515424s)][1.22566 (0.00726552s)][1.56568 (0.0126235s)]]\n[[gmp_int][7.54669 (0.00866778s)][[*1] (0.0049585s)][[*1] (0.00592785s)][[*1] (0.00806262s)][[*1] (0.0184622s)][[*1] (0.0220616s)][1.79985 (0.0435595s)][2.08427 (0.0661641s)]]\n[[tommath_int][72.1332 (0.0828488s)][18.985 (0.0941371s)][13.9301 (0.0825755s)][9.93889 (0.0801335s)][5.42256 (0.100113s)][4.58437 (0.101139s)][4.91664 (0.118991s)][5.5407 (0.175887s)]]\n]\n[table Operator -=(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][10.8565 (0.0103583s)][2.00541 (0.0102937s)][1.73348 (0.0103591s)][2.53718 (0.0189898s)][1.21308 (0.0265754s)][[*1] (0.0249248s)][[*1] (0.0377524s)][[*1] (0.070851s)]]\n[[cpp_int(fixed)][[*1] (0.000954108s)][[*1] (0.00513296s)][[*1] (0.00597589s)][[*1] (0.00748462s)]]\n[[gmp_int][6.6602 (0.00635455s)][1.61345 (0.00828179s)][1.41745 (0.00847054s)][1.41728 (0.0106078s)][[*1] (0.0219074s)][[*1] (0.0250737s)][2.12439 (0.05295s)][2.51074 (0.0947863s)]]\n[[tommath_int][88.858 (0.0847801s)][18.6448 (0.0957029s)][13.7283 (0.0820388s)][13.4423 (0.100611s)][4.83335 (0.105886s)][4.6829 (0.117418s)][7.59449 (0.189292s)][5.86189 (0.2213s)]]\n]\n[table Operator /\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][3.20876 (0.0878919s)][3.17469 (0.181536s)][3.14517 (0.250544s)][4.14655 (0.365546s)][4.70812 (0.702366s)][2.28619 (1.18106s)][3.54663 (2.26453s)][[*1] (4.52755s)]]\n[[cpp_int(fixed)][[*1] (0.0273912s)][1.72404 (0.098585s)][2.12584 (0.169344s)][3.71442 (0.327451s)]]\n[[gmp_int][1.70383 (0.04667s)][[*1] (0.0571824s)][[*1] (0.0796599s)][[*1] (0.0881567s)][[*1] (0.149182s)][[*1] (0.208719s)][[*1] (0.516606s)][[*1] (0.638503s)]]\n[[tommath_int][40.8044 (1.11768s)][17.2975 (0.989116s)][17.4097 (1.38686s)][20.9668 (1.84837s)][20.6415 (3.07934s)][31.5839 (6.59216s)][33.0087 (17.0525s)][81.0894 (51.7759s)]]\n]\n[table Operator /(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][4.50037 (0.0520677s)][6.30243 (0.108097s)][8.34437 (0.193637s)][7.02879 (0.296939s)][6.47793 (0.630264s)][2.64044 (1.08346s)][3.92627 (2.33772s)][[*1] (4.22641s)]]\n[[cpp_int(fixed)][1.27227 (0.0147198s)][4.34067 (0.0744498s)][6.08699 (0.141253s)][6.56549 (0.277366s)]]\n[[gmp_int][[*1] (0.0115696s)][[*1] (0.0171517s)][[*1] (0.0232057s)][[*1] (0.0422461s)][[*1] (0.0972941s)][[*1] (0.156597s)][[*1] (0.410334s)][[*1] (0.595404s)]]\n[[tommath_int][60.4712 (0.69963s)][44.8464 (0.769191s)][40.4334 (0.938285s)][35.0752 (1.48179s)][26.8178 (2.60921s)][37.2616 (5.83504s)][37.7146 (15.4756s)][84.1326 (50.0929s)]]\n]\n[table Operator /(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][6.09203 (0.0582351s)][6.42997 (0.0982056s)][6.2137 (0.151642s)][6.62408 (0.281298s)][9.30105 (0.706562s)][3.66307 (1.0584s)][4.10257 (2.14867s)][[*1] (4.2547s)]]\n[[cpp_int(fixed)][1.76794 (0.0169001s)][3.59379 (0.0548884s)][5.55499 (0.135566s)][6.36274 (0.2702s)]]\n[[gmp_int][[*1] (0.00955921s)][[*1] (0.0152731s)][[*1] (0.0244044s)][[*1] (0.042466s)][[*1] (0.0759658s)][[*1] (0.125208s)][[*1] (0.288938s)][[*1] (0.523737s)]]\n[[tommath_int][63.2738 (0.604848s)][57.3767 (0.876321s)][43.9301 (1.07209s)][40.0122 (1.69916s)][41.1147 (3.12331s)][57.9739 (7.25882s)][68.6676 (19.8407s)][109.312 (57.2509s)]]\n]\n[table Operator /=(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][5.21402 (0.0701172s)][4.76442 (0.105309s)][5.1245 (0.171387s)][7.39587 (0.299993s)][6.88568 (0.632889s)][3.2993 (1.05399s)][3.52936 (2.14442s)][[*1] (4.37618s)]]\n[[cpp_int(fixed)][1.68246 (0.0226255s)][3.12633 (0.0691018s)][3.98733 (0.133354s)][6.62903 (0.268888s)]]\n[[gmp_int][[*1] (0.0134478s)][[*1] (0.0221032s)][[*1] (0.0334445s)][[*1] (0.0405622s)][[*1] (0.0919138s)][[*1] (0.14699s)][[*1] (0.319457s)][[*1] (0.607595s)]]\n[[tommath_int][46.0731 (0.619583s)][43.6571 (0.964961s)][30.1861 (1.00956s)][41.4936 (1.68307s)][32.6785 (3.0036s)][48.2935 (7.09868s)][64.9093 (20.7357s)][111.801 (67.9296s)]]\n]\n[table Operator <<\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][9.93178 (0.0116142s)][1.74005 (0.0147029s)][2.68859 (0.0238748s)][2.04419 (0.0394659s)][2.15112 (0.0859331s)][[*1] (0.0889652s)][[*1] (0.190562s)][[*1] (0.32803s)]]\n[[cpp_int(fixed)][[*1] (0.00116939s)][[*1] (0.00844969s)][1.94851 (0.0173029s)][1.55242 (0.0299716s)]]\n[[gmp_int][4.60815 (0.00538874s)][1.02939 (0.00869801s)][[*1] (0.00888006s)][[*1] (0.0193064s)][[*1] (0.039948s)][[*1] (0.0597248s)][1.65224 (0.146992s)][1.08567 (0.206887s)]]\n[[tommath_int][10.7935 (0.0126218s)][2.38166 (0.0201243s)][2.42444 (0.0215291s)][1.87488 (0.0361972s)][1.73489 (0.0693055s)][1.93177 (0.115375s)][2.49667 (0.222116s)][2.82346 (0.538044s)]]\n]\n[table Operator >>\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][12.5304 (0.011709s)][6.85524 (0.0153366s)][8.77866 (0.0209131s)][3.21549 (0.0146098s)][4.04361 (0.0183489s)][3.04276 (0.0219967s)][8.19636 (0.0537598s)][[*1] (0.0745484s)]]\n[[cpp_int(fixed)][[*1] (0.000934446s)][6.55349 (0.0146615s)][6.51353 (0.0155169s)][4.90631 (0.0222922s)]]\n[[gmp_int][2.59712 (0.00242687s)][[*1] (0.0022372s)][[*1] (0.00238226s)][[*1] (0.00454358s)][[*1] (0.00453774s)][[*1] (0.00313265s)][[*1] (0.00722919s)][[*1] (0.00655899s)]]\n[[tommath_int][102.662 (0.0959319s)][42.5337 (0.0951565s)][39.1437 (0.0932504s)][21.0397 (0.0955953s)][29.6104 (0.134364s)][62.7092 (0.196446s)][49.6167 (0.358689s)][137.105 (0.899272s)]]\n]\n[table Operator ^\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][2.8103 (0.0101384s)][4.11932 (0.0282768s)][2.25923 (0.0139063s)][1.94172 (0.0187085s)][1.66067 (0.0405646s)][[*1] (0.0369865s)][[*1] (0.0918676s)][[*1] (0.150955s)]]\n[[cpp_int(fixed)][[*1] (0.00360758s)][[*1] (0.00686442s)][1.50683 (0.00927498s)][1.79076 (0.0172541s)]]\n[[gmp_int][1.35398 (0.0048846s)][1.00969 (0.00693092s)][[*1] (0.00615531s)][[*1] (0.00963503s)][[*1] (0.0244266s)][[*1] (0.0429561s)][2.17737 (0.0805332s)][1.3521 (0.124214s)]]\n[[tommath_int][2.28701 (0.00825059s)][1.65996 (0.0113947s)][2.06089 (0.0126854s)][2.03244 (0.0195826s)][1.4173 (0.0346198s)][1.32237 (0.0568037s)][2.69468 (0.0996668s)][2.55626 (0.234837s)]]\n]\n[table Operator ^(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][2.67312 (0.00991885s)][1.57246 (0.0115174s)][2.50193 (0.0198209s)][[*1] (0.0153479s)][[*1] (0.0264078s)][[*1] (0.0235546s)][[*1] (0.0392727s)][[*1] (0.0657809s)]]\n[[cpp_int(fixed)][[*1] (0.00371059s)][[*1] (0.0073244s)][[*1] (0.00792226s)][1.04763 (0.0160789s)]]\n[[gmp_int][2.86377 (0.0106263s)][2.18619 (0.0160125s)][2.18777 (0.0173321s)][1.01844 (0.0156309s)][1.13176 (0.0298873s)][1.9665 (0.0406408s)][3.34613 (0.0788165s)][3.54952 (0.139399s)]]\n[[tommath_int][26.101 (0.0968501s)][14.6444 (0.107261s)][10.0538 (0.079649s)][5.64392 (0.0866224s)][3.8806 (0.102478s)][6.36386 (0.131519s)][8.07216 (0.190136s)][8.01428 (0.314742s)]]\n]\n[table Operator construct\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][3.24638 (0.00190752s)][1.06172 (0.00258002s)][[*1] (0.00248269s)][[*1] (0.00191598s)][[*1] (0.00273948s)][[*1] (0.0017072s)][[*1] (0.00191549s)][[*1] (0.0016635s)]]\n[[cpp_int(fixed)][[*1] (0.000587582s)][[*1] (0.00243004s)][1.51116 (0.00375174s)][4.66482 (0.00893771s)]]\n[[gmp_int][5.61558 (0.00329962s)][1.52898 (0.0037155s)][2.51713 (0.00624925s)][1.755 (0.00336255s)][1.40183 (0.00384029s)][1.60131 (0.00385483s)][4.7818 (0.0081635s)][2.07779 (0.00397999s)]]\n[[tommath_int][251.1 (0.147542s)][63.6186 (0.154596s)][54.6947 (0.13579s)][66.8839 (0.128148s)][47.8098 (0.130974s)][54.8252 (0.13198s)][74.1436 (0.126578s)][83.945 (0.160796s)]]\n]\n[table Operator construct(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][2.12644 (0.00192028s)][[*1] (0.00200418s)][[*1] (0.00223886s)][[*1] (0.00189442s)][[*1] (0.00190833s)][[*1] (0.00199036s)][[*1] (0.00200998s)][[*1] (0.00168004s)]]\n[[cpp_int(fixed)][[*1] (0.000903049s)][1.26395 (0.00253319s)][1.78621 (0.00399907s)][5.10701 (0.0096748s)]]\n[[gmp_int][27.1389 (0.0245077s)][10.3593 (0.020762s)][9.02272 (0.0202006s)][9.96334 (0.0188747s)][15.2262 (0.0290565s)][8.50239 (0.0244927s)][35.6564 (0.0709692s)][10.9129 (0.0219346s)]]\n[[tommath_int][183.484 (0.165695s)][83.0709 (0.166489s)][69.5984 (0.155821s)][75.8903 (0.143768s)][85.5979 (0.163349s)][50.8174 (0.146389s)][70.0602 (0.139445s)][95.4952 (0.191943s)]]\n]\n[table Operator construct(unsigned)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][2.00349 (0.00174712s)][[*1] (0.00225895s)][[*1] (0.00241092s)][[*1] (0.00177047s)][[*1] (0.00304865s)][[*1] (0.0018378s)][[*1] (0.0017583s)][[*1] (0.00197229s)]]\n[[cpp_int(fixed)][[*1] (0.000872038s)][1.1805 (0.0026667s)][1.66167 (0.00400614s)][5.54475 (0.00981681s)]]\n[[gmp_int][27.6419 (0.0241048s)][10.0723 (0.0227529s)][7.60577 (0.0183369s)][10.2725 (0.0181871s)][9.38419 (0.0286091s)][9.10394 (0.0220052s)][34.6032 (0.0635939s)][15.7134 (0.0276289s)]]\n[[tommath_int][207.462 (0.180915s)][84.5379 (0.190967s)][65.2109 (0.157218s)][84.8572 (0.150237s)][47.0682 (0.143494s)][59.4466 (0.143689s)][78.5549 (0.144368s)][103.519 (0.182018s)]]\n]\n[table Operator gcd\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][2.10743 (0.358587s)][1.8778 (1.42989s)][2.03859 (3.30534s)][2.01435 (7.01715s)][2.16957 (17.7583s)][[*1] (32.2572s)][[*1] (76.6459s)][[*1] (201.791s)]]\n[[cpp_int(fixed)][3.65486 (0.621889s)][1.78424 (1.35865s)][2.02664 (3.28597s)][1.95328 (6.8044s)]]\n[[gmp_int][[*1] (0.170154s)][[*1] (0.761472s)][[*1] (1.62139s)][[*1] (3.48358s)][[*1] (8.18516s)][[*1] (18.7879s)][1.82325 (58.8129s)][1.59356 (122.14s)]]\n[[tommath_int][8.01966 (1.36458s)][4.44226 (3.38266s)][4.55056 (7.37824s)][4.42983 (15.4317s)][5.23788 (42.8729s)][7.25799 (136.362s)][14.6265 (471.81s)][23.1025 (1770.72s)]]\n]\n[table Operator powm\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][14.8198 (0.565871s)][13.2096 (2.0199s)][11.8233 (9.06469s)][9.12533 (46.9932s)]]\n[[cpp_int(fixed)][9.40069 (0.35895s)][10.0395 (1.53516s)][10.5353 (8.07714s)][8.49678 (43.7564s)]]\n[[gmp_int][[*1] (0.0381833s)][[*1] (0.152912s)][[*1] (0.766677s)][[*1] (5.14976s)]]\n[[tommath_int][11.0485 (0.421869s)][8.44037 (1.29063s)][4.18756 (3.21051s)][2.45216 (12.628s)]]\n]\n[table Operator str\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][1.47697 (0.000264092s)][2.87174 (0.000644609s)][2.28911 (0.00141073s)][4.92453 (0.00383604s)][5.61647 (0.0137593s)][1.87264 (0.0491109s)][4.29909 (0.171316s)][[*1] (0.595522s)]]\n[[cpp_int(fixed)][4.73326 (0.00084634s)][1.78742 (0.000401216s)][1.68455 (0.00103815s)][4.30889 (0.00335647s)]]\n[[gmp_int][[*1] (0.000178807s)][[*1] (0.000224466s)][[*1] (0.00061628s)][[*1] (0.000778966s)][[*1] (0.00244981s)][[*1] (0.00486654s)][[*1] (0.0262254s)][[*1] (0.0398493s)]]\n[[tommath_int][16.7304 (0.00299152s)][26.6015 (0.00597113s)][30.9815 (0.0190933s)][74.7467 (0.0582251s)][82.4773 (0.202054s)][154.996 (0.754295s)][107.534 (2.82013s)][279.178 (11.1251s)]]\n]\n[table Operator |\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][2.26845 (0.00991773s)][1.955 (0.00939722s)][2.01122 (0.012635s)][1.76421 (0.0152013s)][1.92162 (0.0293243s)][[*1] (0.0377549s)][[*1] (0.0916779s)][[*1] (0.152323s)]]\n[[cpp_int(fixed)][1.00452 (0.0043918s)][1.37689 (0.00661838s)][1.3138 (0.00825362s)][1.71906 (0.0148123s)]]\n[[gmp_int][[*1] (0.00437203s)][[*1] (0.00480677s)][[*1] (0.00628228s)][[*1] (0.00861647s)][[*1] (0.0152602s)][1.09283 (0.0365187s)][2.43832 (0.0920584s)][1.21204 (0.111118s)]]\n[[tommath_int][1.69103 (0.00739324s)][1.85402 (0.00891185s)][1.78526 (0.0112155s)][1.86487 (0.0160686s)][1.75184 (0.0267336s)][1.44011 (0.0481236s)][2.33195 (0.0880424s)][2.33204 (0.213797s)]]\n]\n[table Operator |(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][2.11741 (0.00805945s)][2.16753 (0.0119795s)][1.5717 (0.012189s)][1.10016 (0.0134288s)][1.11289 (0.0309032s)][[*1] (0.0232284s)][[*1] (0.042441s)][[*1] (0.0711061s)]]\n[[cpp_int(fixed)][[*1] (0.00380628s)][[*1] (0.00552682s)][[*1] (0.00775532s)][[*1] (0.0122062s)]]\n[[gmp_int][2.62934 (0.010008s)][1.86878 (0.0103284s)][3.19589 (0.0247852s)][1.1073 (0.0135159s)][[*1] (0.0277685s)][1.67609 (0.0360071s)][3.76493 (0.0874534s)][2.72382 (0.115602s)]]\n[[tommath_int][22.0502 (0.0839291s)][18.6272 (0.102949s)][9.99323 (0.0775007s)][6.28905 (0.0767652s)][3.28821 (0.0913086s)][5.0968 (0.109494s)][6.47865 (0.150489s)][4.8474 (0.205729s)]]\n]\n\n[table:platform Platform Details\n[[][Version]]\n[[Compiler][GNU C++ version 10.3.0]]\n[[GMP][6.2.0]]\n[[MPFR][262146]]\n[[Boost][107800]]\n[[Run date][Sep 30 2021]]\n]\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/performance_integer_real_world.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:int_real_world Integer Real World Tests]\n\nThe first set of [@../../performance/voronoi_performance.cpp tests] measure the times taken to\nexecute the multiprecision part of the Voronoi-diagram builder from Boost.Polygon.  The tests\nmainly create a large number of temporaries \"just in case\" multiprecision arithmetic is required,\nfor comparison, also included in the tests is Boost.Polygon's own partial-multiprecision integer\ntype which was custom written for this specific task:\n\n[table\n[[Integer Type][Relative Performance (Actual time in parenthesis)]]\n[[checked_int1024_t][1.53714(0.0415328s)]]\n[[checked_int256_t][1.20715(0.0326167s)]]\n[[checked_int512_t][1.2587(0.0340095s)]]\n[[cpp_int][1.80575(0.0487904s)]]\n[[extended_int][1.35652(0.0366527s)]]\n[[int1024_t][1.36237(0.0368107s)]]\n[[int256_t][1(0.0270196s)]]\n[[int512_t][1.0779(0.0291243s)]]\n[[mpz_int][3.83495(0.103619s)]]\n[[tom_int][41.6378(1.12504s)]]\n]\n\nNote how for this use case, any dynamic allocation is a performance killer.\n\nThe next [@../../performance/miller_rabin_performance.cpp tests] measure the time taken to generate 1000 128-bit\nrandom numbers and test for primality using the Miller Rabin test.  This is primarily a test of modular-exponentiation\nsince that is the rate limiting step:\n\n[table\n[[Integer Type][Relative Performance (Actual time in parenthesis)]]\n[[checked_uint1024_t][9.52301(0.0422246s)]]\n[[cpp_int][11.2194(0.0497465s)]]\n[[cpp_int (1024-bit cache)][10.7941(0.0478607s)]]\n[[cpp_int (128-bit cache)][11.0637(0.0490558s)]]\n[[cpp_int (256-bit cache)][11.5069(0.0510209s)]]\n[[cpp_int (512-bit cache)][10.3303(0.0458041s)]]\n[[cpp_int (no Expression templates)][16.1792(0.0717379s)]]\n[[mpz_int][1.05106(0.00466034s)]]\n[[mpz_int (no Expression templates)][1(0.00443395s)]]\n[[tom_int][5.10595(0.0226395s)]]\n[[tom_int (no Expression templates)][61.9684(0.274765s)]]\n[[uint1024_t][9.32113(0.0413295s)]]\n]\n\nIt's interesting to note that expression templates have little effect here - perhaps because the actual expressions involved\nare relatively trivial in this case - so the time taken for multiplication and division tends to dominate.  The much \nquicker times from GMP and tommath are down to their\nmuch better modular-exponentiation algorithms (GMP's is about 5x faster).  That's an issue which needs to be addressed\nin a future release for __cpp_int.\n\n[table:platform Platform Details\n[[][Version]]\n[[Compiler][GNU C++ version 10.3.0]]\n[[GMP][6.2.0]]\n[[MPFR][262146]]\n[[Boost][107800]]\n[[Run date][Sep 30 2021]]\n]\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/performance_overhead.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:overhead The Overhead in the Number Class Wrapper]\n\nUsing a simple [@../../performance/arithmetic_backend.hpp backend class] that wraps any __fundamental arithmetic type\nwe can measure the overhead involved in wrapping a type inside the `number` frontend, and the effect that turning\non expression templates has.  The following table compares the performance between `double` and a `double` wrapped\ninside class `number`:\n\n[table Bessel Functions (16 digit precision)\n[[Type][Time]]\n[[arithmetic_backend<double>][2.09301 (0.00133409s)]]\n[[arithmetic_backend<double> - no expression templates][1 (0.000637403s)]]\n[[double][1.07956 (0.000688113s)]]\n]\n\nAs you can see whether or not there is an overhead, and how large it is depends on the actual situation,\nbut the overhead is in any cases small.  Expression templates generally add a greater overhead the\nmore complex the expression becomes due to the logic of figuring out how to best unpack and evaluate\nthe expression, but of course this is also the situation where you save more temporaries.  For a\n\"trivial\" backend like this, saving temporaries has no benefit, but for larger types it becomes\na bigger win.\n\nThe following table compares arithmetic using either `long long` or `number<arithmetic_backend<long long> >`\nfor the [@../../performance/voronoi_performance.cpp voronoi-diagram builder test]:\n\n[table\n[[Type][Relative time]]\n[[`int64_t`][[*1.0](0.0128646s)]]\n[[`number<arithmetic_backend<int64_t>, et_off>`][1.005 (0.0129255s)]]\n]\n\nThis test involves mainly creating a lot of temporaries and performing a small amount of arithmetic on them,\nwith very little difference in performance between the native and \"wrapped\" types.\n\n[table:platform Platform Details\n[[][Version]]\n[[Compiler][GNU C++ version 10.3.0]]\n[[GMP][6.2.0]]\n[[MPFR][262146]]\n[[Boost][107800]]\n[[Run date][Sep 30 2021]]\n]\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/performance_rational.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:rational_performance Rational Type Performance]\n\nNote that these tests are carefully designed to test performance of the underlying algorithms\nand not memory allocation or variable copying.  As usual, performance results should be taken\nwith a healthy dose of scepticism, and real-world performance may vary widely depending upon the\nspecifics of the program.  In each table relative times are given first, with the best performer\ngiven a score of 1.  Total actual times are given in brackets, measured in seconds for 500000\noperations.\n\n[table Operator *\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][2.00025 (0.797425s)][1.97726 (2.96998s)][1.86844 (6.73224s)][1.96608 (14.4259s)]]\n[[mpq_rational][[*1] (0.398662s)][[*1] (1.50207s)][[*1] (3.60314s)][[*1] (7.3374s)]]\n]\n[table Operator *(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.88073 (0.0637195s)][1.93184 (0.0917847s)][2.15609 (0.118274s)][2.4236 (0.218283s)]]\n[[mpq_rational][[*1] (0.0338803s)][[*1] (0.0475114s)][[*1] (0.0548556s)][[*1] (0.0900656s)]]\n]\n[table Operator *(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.60877 (0.161844s)][2.33429 (0.240069s)][1.8835 (0.298935s)][2.70338 (0.448194s)]]\n[[mpq_rational][[*1] (0.100601s)][[*1] (0.102844s)][[*1] (0.158713s)][[*1] (0.16579s)]]\n]\n[table Operator *(value_type)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.97503 (0.408791s)][2.42069 (0.600225s)][2.65138 (0.803009s)][4.65673 (1.54645s)]]\n[[mpq_rational][[*1] (0.20698s)][[*1] (0.247956s)][[*1] (0.302865s)][[*1] (0.332089s)]]\n]\n[table Operator *=(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.97207 (0.211848s)][2.18482 (0.226179s)][2.43682 (0.319695s)][2.69933 (0.485819s)]]\n[[mpq_rational][[*1] (0.107424s)][[*1] (0.103523s)][[*1] (0.131194s)][[*1] (0.179978s)]]\n]\n[table Operator *=(value_type)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.95211 (0.40255s)][2.60942 (0.629302s)][2.83854 (0.8029s)][4.34054 (1.37083s)]]\n[[mpq_rational][[*1] (0.206213s)][[*1] (0.241165s)][[*1] (0.282857s)][[*1] (0.31582s)]]\n]\n[table Operator +\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][2.20364 (0.415006s)][1.97574 (1.53458s)][1.75945 (3.41194s)][2.11634 (8.04044s)]]\n[[mpq_rational][[*1] (0.188327s)][[*1] (0.776716s)][[*1] (1.93921s)][[*1] (3.79923s)]]\n]\n[table Operator +(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][2.06836 (0.0177811s)][1.80334 (0.0183744s)][1.38442 (0.020452s)][1.81894 (0.0449351s)]]\n[[mpq_rational][[*1] (0.00859669s)][[*1] (0.0101891s)][[*1] (0.014773s)][[*1] (0.024704s)]]\n]\n[table Operator +(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][2.07187 (0.0177151s)][2.3005 (0.0241089s)][1.81397 (0.0297836s)][1.72202 (0.046594s)]]\n[[mpq_rational][[*1] (0.0085503s)][[*1] (0.0104799s)][[*1] (0.016419s)][[*1] (0.0270577s)]]\n]\n[table Operator +(value_type)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.2805 (0.0265647s)][1.59353 (0.0391054s)][1.26613 (0.044067s)][1.95307 (0.105801s)]]\n[[mpq_rational][[*1] (0.0207456s)][[*1] (0.0245401s)][[*1] (0.0348044s)][[*1] (0.0541719s)]]\n]\n[table Operator +=(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][7.29749 (0.0565983s)][3.77253 (0.0371419s)][2.72128 (0.0556987s)][2.01495 (0.0662456s)]]\n[[mpq_rational][[*1] (0.00775585s)][[*1] (0.00984535s)][[*1] (0.0204678s)][[*1] (0.032877s)]]\n]\n[table Operator +=(value_type)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.92025 (0.0335896s)][2.08321 (0.0422867s)][1.587 (0.0564267s)][1.85357 (0.0840696s)]]\n[[mpq_rational][[*1] (0.0174923s)][[*1] (0.0202988s)][[*1] (0.0355556s)][[*1] (0.0453556s)]]\n]\n[table Operator -\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][2.38126 (0.471759s)][1.92631 (1.52484s)][1.76181 (3.49648s)][2.03462 (7.71926s)]]\n[[mpq_rational][[*1] (0.198113s)][[*1] (0.791584s)][[*1] (1.98459s)][[*1] (3.79396s)]]\n]\n[table Operator -(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][2.44447 (0.0292894s)][2.54602 (0.0346718s)][1.4869 (0.035503s)][1.95344 (0.0577029s)]]\n[[mpq_rational][[*1] (0.0119819s)][[*1] (0.013618s)][[*1] (0.0238773s)][[*1] (0.0295391s)]]\n]\n[table Operator -(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][2.93654 (0.0296698s)][4.23087 (0.0496956s)][1.68041 (0.0461985s)][1.4455 (0.0581714s)]]\n[[mpq_rational][[*1] (0.0101037s)][[*1] (0.0117459s)][[*1] (0.0274924s)][[*1] (0.040243s)]]\n]\n[table Operator -(value_type)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.69242 (0.0408789s)][1.5205 (0.0467416s)][1.31525 (0.0548939s)][2.16115 (0.103471s)]]\n[[mpq_rational][[*1] (0.0241541s)][[*1] (0.030741s)][[*1] (0.0417365s)][[*1] (0.0478777s)]]\n]\n[table Operator -=(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][3.69509 (0.0366534s)][3.7306 (0.0439181s)][1.8352 (0.0491612s)][1.86662 (0.071761s)]]\n[[mpq_rational][[*1] (0.00991947s)][[*1] (0.0117724s)][[*1] (0.0267879s)][[*1] (0.0384444s)]]\n]\n[table Operator -=(value_type)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.76299 (0.0421283s)][2.03803 (0.0490152s)][1.84864 (0.053198s)][2.10533 (0.0881228s)]]\n[[mpq_rational][[*1] (0.023896s)][[*1] (0.0240502s)][[*1] (0.0287769s)][[*1] (0.041857s)]]\n]\n[table Operator /\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][2.03433 (2.28881s)][2.24309 (6.34454s)][2.1203 (13.2036s)][2.36142 (29.3236s)]]\n[[mpq_rational][[*1] (1.12509s)][[*1] (2.82848s)][[*1] (6.22726s)][[*1] (12.4178s)]]\n]\n[table Operator /(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][[*1] (0.035134s)][1.08556 (0.0774619s)][1.08797 (0.104628s)][1.29134 (0.207067s)]]\n[[mpq_rational][1.85049 (0.0650149s)][[*1] (0.0713565s)][[*1] (0.0961679s)][[*1] (0.16035s)]]\n]\n[table Operator /(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.31397 (0.170727s)][1.63747 (0.216019s)][1.68581 (0.292536s)][1.76695 (0.435259s)]]\n[[mpq_rational][[*1] (0.129932s)][[*1] (0.131923s)][[*1] (0.173528s)][[*1] (0.246334s)]]\n]\n[table Operator /(value_type)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.82473 (0.431612s)][2.20261 (0.596248s)][2.45848 (0.809662s)][3.88675 (1.38001s)]]\n[[mpq_rational][[*1] (0.236534s)][[*1] (0.270701s)][[*1] (0.329335s)][[*1] (0.355055s)]]\n]\n[table Operator /=(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.58868 (0.216252s)][1.71288 (0.235781s)][1.78218 (0.314161s)][1.98715 (0.460033s)]]\n[[mpq_rational][[*1] (0.136121s)][[*1] (0.137652s)][[*1] (0.176279s)][[*1] (0.231505s)]]\n]\n[table Operator /=(value_type)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.72896 (0.40369s)][2.55949 (0.689514s)][2.4929 (0.832288s)][3.51238 (1.37478s)]]\n[[mpq_rational][[*1] (0.233487s)][[*1] (0.269395s)][[*1] (0.333863s)][[*1] (0.391409s)]]\n]\n[table Operator construct\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][[*1] (0.0135822s)][[*1] (0.00935293s)][[*1] (0.0083784s)][[*1] (0.00962697s)]]\n[[mpq_rational][1.44264 (0.0195942s)][2.18249 (0.0204126s)][2.64725 (0.0221797s)][2.87767 (0.0277033s)]]\n]\n[table Operator construct(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][[*1] (0.00806026s)][[*1] (0.00960336s)][[*1] (0.00769898s)][[*1] (0.0176689s)]]\n[[mpq_rational][4.87225 (0.0392716s)][5.91987 (0.0568506s)][9.03811 (0.0695842s)][3.68339 (0.0650815s)]]\n]\n[table Operator construct(unsigned)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][[*1] (0.00672081s)][[*1] (0.0064826s)][[*1] (0.00618635s)][[*1] (0.00923644s)]]\n[[mpq_rational][6.47138 (0.0434929s)][7.48645 (0.0485316s)][8.2942 (0.0513108s)][5.77363 (0.0533278s)]]\n]\n[table Operator str\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][6.17439 (0.00168424s)][7.6748 (0.0033367s)][6.38435 (0.00662873s)][9.07696 (0.0174979s)]]\n[[mpq_rational][[*1] (0.000272779s)][[*1] (0.000434761s)][[*1] (0.00103828s)][[*1] (0.00192772s)]]\n]\n\n[table:platform Platform Details\n[[][Version]]\n[[Compiler][GNU C++ version 10.3.0]]\n[[GMP][6.2.0]]\n[[MPFR][262146]]\n[[Boost][107800]]\n[[Run date][Sep 30 2021]]\n]\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/performance_rational_real_world.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:rational_real_world Rational Real World Tests]\n\nThe first set of [@../../performance/rational_bernoulli_bench.cpp tests] measure the times taken to\ncalculate the n'th Bernoulli number via mixed rational/integer arithmetic to give an exact rational result.\n\n[table Relative times taken to calculate Bm\n[[m][cpp_rational (time in seconds)][mpq_rational (time relative to cpp_rational)][mpq_class (time relative to cpp_rational)]]\n[[50][1.888453][1.7317576874][1.893438174]]\n[[54][2.250503][2.1519411438][2.4936252029]]\n[[58][2.734527][2.2056805437][1.9866752093]]\n[[62][3.318122][2.5182796172][2.2662876772]]\n[[66][3.887281][2.4263077457][2.588347485]]\n[[70][4.628535][1.9756346231][2.5367158291]]\n[[74][5.3541][1.7052929531][2.3345854579]]\n[[78][6.321172][1.6669601776][2.0390342171]]\n[[82][7.13052][1.7689101216][1.9837833706]]\n[[86][8.390095][1.6245518078][1.5785492298]]\n[[90][10.62176][1.6294440846][1.5779053566]]\n[[94][11.364409][1.5786845581][1.5614997665]]\n[[98][14.030636][1.2616490799][1.4799734666]]\n[[102][15.268211][1.6145657798][1.6128342738]]\n[[106][15.253028][1.8985381788][1.8206293859]]\n[[110][17.637756][1.8283953469][1.6559522084]]\n[[114][18.335007][1.8018346543][1.8343225612]]\n[[118][21.044146][2.0462015897][1.8106934346]]\n[[122][23.71295][2.0041556196][1.7127701108]]\n[[126][25.993901][1.9901613075][1.6974264848]]\n[[130][30.17278][1.8897211328][1.6405006433]]\n[[134][43.992333][1.2223514038][1.2232961594]]\n[[138][40.702777][1.3551305848][1.492072224]]\n[[142][47.01495][1.4361410785][1.4005683724]]\n[[146][51.468592][1.4279172043][1.4072223891]]\n[[150][70.736106][1.3628087048][1.2309294917]]\n[[154][74.638691][1.2509392749][1.2846060497]]\n[[158][76.642396][1.3383691449][1.2555573941]]\n[[162][104.906795][1.1722665057][1.0121124375]]\n[[166][108.175914][0.9272805682][1.2472813403]]\n[[170][125.363885][0.8114005082][1.1349673712]]\n[[174][119.813754][0.9747547014][1.5677900135]]\n[[178][130.672631][0.904429444][1.6089208382]]\n[[182][136.002124][0.8359445107][1.3173987636]]\n[[186][152.169271][0.7919228515][1.3523570012]]\n[[190][149.444035][0.8353259734][1.4571606823]]\n[[194][149.609183][0.8898088896][1.6132629038]]\n[[198][167.594528][0.8947434429][1.326461858]]\n]\n\nIn this use case, most the of the rational numbers are fairly small and so the times taken are dominated by\nthe number of allocations performed.  The following table illustrates how well each type performs on suppressing\nallocations:\n\n[table Total Allocation Counts for Bernoulli Number Calculation\n[[m][cpp_rational][mpq_rational][mpq_class]]\n[[2][0][77][101]]\n[[4][0][187][252]]\n[[6][0][345][471]]\n[[8][0][551][758]]\n[[10][0][805][1113]]\n[[12][0][1107][1536]]\n[[14][0][1457][2027]]\n[[16][0][1857][2587]]\n[[18][0][2336][3216]]\n[[20][0][2885][3913]]\n[[22][6][3511][4706]]\n[[24][22][4203][5600]]\n[[26][83][4963][6575]]\n[[28][377][5806][7632]]\n[[30][780][6738][8769]]\n[[32][1454][7771][9988]]\n[[34][2001][9357][11289]]\n[[36][2789][10598][12704]]\n[[38][3669][11948][14252]]\n[[40][4653][13403][15891]]\n[[42][5923][14976][17620]]\n[[44][7379][16622][19449]]\n[[46][8839][18367][21367]]\n[[48][10296][20227][23431]]\n[[50][12045][22857][25646]]\n[[52][13603][25044][27962]]\n[[54][15276][27331][30389]]\n[[56][17239][29749][32919]]\n[[58][19337][32257][35552]]\n[[60][21409][34958][38417]]\n[[62][23694][37800][41396]]\n[[64][27923][39556][44498]]\n[[66][30240][44706][47711]]\n[[68][32566][47934][51042]]\n[[70][35019][51417][54637]]\n[[72][37460][55047][58363]]\n[[74][40282][58777][62211]]\n[[76][42914][62691][66183]]\n[[78][45752][66694][70296]]\n[[80][48681][70905][74620]]\n[[82][51986][77633][79160]]\n[[84][54855][82364][83842]]\n[[86][59032][87239][88659]]\n[[88][63595][92256][93618]]\n[[90][68352][97486][98820]]\n[[92][72446][102974][104256]]\n[[94][76468][108620][109844]]\n[[96][80361][111109][115594]]\n[[98][84783][121460][121486]]\n[[100][89044][127730][127633]]\n[[102][93561][134241][134050]]\n[[104][98452][140919][140616]]\n[[106][103530][147763][147364]]\n[[108][108326][154804][154276]]\n[[110][113891][162184][161562]]\n[[112][119213][169736][169038]]\n[[114][124770][182417][176693]]\n[[116][130624][190589][184519]]\n[[118][137941][198975][192525]]\n[[120][144829][207759][200952]]\n[[122][152045][216736][209561]]\n[[124][158610][225905][218371]]\n[[126][165383][235283][227360]]\n[[128][173971][230678][236670]]\n[[130][181696][248593][246308]]\n[[132][189310][258615][256148]]\n[[134][197708][268800][266192]]\n[[136][205800][279215][276436]]\n[[138][212940][290112][287167]]\n[[140][217502][301235][298101]]\n[[142][223486][312564][309243]]\n[[144][229579][324133][320605]]\n[[146][237213][344671][332333]]\n[[148][248799][357200][344420]]\n[[150][261345][369947][356745]]\n[[152][272741][382909][369279]]\n[[154][283982][396162][382048]]\n[[156][293626][409993][395353]]\n[[158][304036][424022][408907]]\n[[160][313869][427747][422690]]\n[[162][323626][454723][436715]]\n[[164][333294][469863][451304]]\n[[166][343072][485238][466149]]\n[[168][352236][500922][481221]]\n[[170][362793][516840][496561]]\n[[172][372645][533169][512315]]\n[[174][382908][549962][528510]]\n[[176][392507][567018][544947]]\n[[178][404163][597694][561666]]\n[[180][417539][615615][578647]]\n[[182][432009][634079][596234]]\n[[184][444684][652902][614114]]\n[[186][457104][672042][632248]]\n[[188][469331][691451][650654]]\n[[190][481583][711512][669753]]\n[[192][477225][698188][689111]]\n[[194][488955][736905][708760]]\n[[196][499797][757502][728675]]\n[[198][511163][778591][749102]]\n]\n\nThe second [@../../performance/rational_determinant_bench.cpp example] measures the time taken to calculate the determinant of a 3x3 matrix of rational\nnumbers.  These numbers are randomly generated with /n/ bits in both numerator and denominator.  In this case the rate limiting step is the cost of\ncalculating the GCD's during the computation:\n\n\n[table Relative Time Taken to Calculate 100 Determinants of Random 3x3 Matrixes\n[[Bits][cpp_rational (ms)][mpq_rational (relative to cpp_rational)][mpq_class (relative to cpp_rational)]]\n[[512][45][0.3111111111][0.3177777778]]\n[[1024][103][0.3038834951][0.3038834951]]\n[[2048][251][0.3087649402][0.3011952191]]\n[[4096][667][0.2983508246][0.2893553223]]\n[[8192][2033][0.261682243][0.2956222332]]\n[[16384][6423][0.2358710883][0.3059318076]]\n[[32768][24223][0.1875903067][0.1955992239]]\n]\n\n[table:platform Platform Details\n[[][Version]]\n[[Compiler][GNU C++ version 10.3.0]]\n[[GMP][6.2.0]]\n[[MPFR][262146]]\n[[Boost][107800]]\n[[Run date][Sep 30 2021]]\n]\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/performance_real_world.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:realworld Floating-Point Real World Tests]\n\nThese tests test the total time taken to execute all of Boost.Math's test cases for these functions.\nIn each case the best performing library gets a relative score of 1, with the total execution time\ngiven in brackets.  Times are shown for both single threaded runs and concurrent execution - the latter\nincreases contension inside new/delete.\n\n[table Bessel Functions (50 digit precision)\n[[Type][Time][# Allocations]]\n[[cpp_bin_float_50][2.24409 (0.207745s)][399]]\n[[cpp_bin_float_50 (3 concurrent threads)][2.87977 (0.266594s)][463]]\n[[cpp_dec_float_50][4.56157 (0.422285s)][381]]\n[[cpp_dec_float_50 (3 concurrent threads)][5.66114 (0.524077s)][424]]\n[[mpf_float_50][1.03648 (0.0959515s)][640961]]\n[[mpf_float_50 (3 concurrent threads)][1.50439 (0.139268s)][2563517]]\n[[mpf_float_50 (no expression templates][1 (0.0925745s)][1019039]]\n[[mpf_float_50 (no expression templates (3 concurrent threads)][1.52451 (0.141131s)][4075842]]\n[[mpfr_float_50][1.2513 (0.115838s)][583054]]\n[[mpfr_float_50 (3 concurrent threads)][1.61301 (0.149324s)][2330876]]\n[[mpfr_float_50 (no expression templates][1.42667 (0.132073s)][999594]]\n[[mpfr_float_50 (no expression templates (3 concurrent threads)][2.00203 (0.185337s)][4000039]]\n[[static_mpfr_float_50][1.18358 (0.10957s)][22930]]\n[[static_mpfr_float_50 (3 concurrent threads)][1.38802 (0.128496s)][93140]]\n[[static_mpfr_float_50 (no expression templates)][1.14598 (0.106089s)][46861]]\n[[static_mpfr_float_50 (no expression templates) (3 concurrent threads)][1.24535 (0.115288s)][189227]]\n]\n\n[table Non-central T Distribution (50 digit precision)\n[[Type][Time][# Allocations]]\n[[cpp_bin_float_50][2.38959 (38.5842s)][0]]\n[[cpp_bin_float_50 (3 concurrent threads)][3.50535 (56.6s)][28]]\n[[cpp_dec_float_50][4.82763 (77.9505s)][0]]\n[[mpf_float_50][1.06817 (17.2475s)][123749688]]\n[[mpf_float_50 (no expression templates][1 (16.1468s)][152610085]]\n[[mpfr_float_50][1.18754 (19.1749s)][118401290]]\n[[mpfr_float_50 (no expression templates][1.36782 (22.0858s)][152816346]]\n[[static_mpfr_float_50][1.04471 (16.8686s)][113395]]\n]\n\n[table:platform Platform Details\n[[][Version]]\n[[Compiler][GNU C++ version 10.3.0]]\n[[GMP][6.2.0]]\n[[MPFR][262146]]\n[[Boost][107800]]\n[[Run date][Sep 30 2021]]\n]\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/reference.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:ref Reference]\n\n[include reference_number.qbk]\n[include reference_cpp_int.qbk]\n[include reference_gmp_int.qbk]\n[include reference_tom_int.qbk]\n[include reference_gmp_float.qbk]\n[include reference_mpfr_float.qbk]\n[include reference_cpp_bin_float.qbk]\n[include reference_cpp_dec_float.qbk]\n[include reference_internal_support.qbk]\n[include reference_backend_requirements.qbk]\n[include reference_header_structure.qbk]\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/reference_backend_requirements.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:backendconc Backend Requirements]\n\nThe requirements on the `Backend` template argument to `number` are split up into\nsections: compulsory and optional.\n\nCompulsory requirements have no default implementation in the library, therefore if the feature\nthey implement is to be supported at all, then they must be implemented by the backend.\n\nOptional requirements have default implementations that are called if the backend doesn't provide\nits own.  Typically the backend will implement these to improve performance.\n\nIn the following tables, type B is the `Backend` template argument to `number`, `b` and `b2` are\na variables of type B, `pb` is a variable of type B*, `cb`, `cb2` and `cb3` are constant variables of type `const B`,\n`rb` is a variable of type `B&&`, `a` and `a2` are variables of Arithmetic type,\n`s` is a variable of type `const char*`, `ui` is a variable of type `unsigned`, `bb` is a variable of type `bool`,\n`pa` is a variable of type pointer-to-arithmetic-type, `exp` is a variable of type `B::exp_type`,\n`pexp` is a variable of type `B::exp_type*`, `i` is a variable of type `int`, `pi` pointer to a variable of type `int`,\nB2 is another type that meets these requirements, b2 is a variable of type B2, `ss` is variable of type `std::streamsize`\nand `ff` is a variable of type `std::ios_base::fmtflags`.\n\n[table Compulsory Requirements on the Backend type.\n[[Expression][Return Type][Comments][Throws]]\n[[`B::signed_types`][`std::tuple<type-list>`][A list of signed integral types that can be assigned to type B.  The types shall be\n                   listed in order of size, smallest first, and shall terminate in the type that is `std::intmax_t`.][[space]]]\n[[`B::unsigned_types`][`std::tuple<type-list>`][A list of unsigned integral types that can be assigned to type B.  The types shall be\n                   listed in order of size, smallest first, and shall terminate in the type that is `std::uintmax_t`.][[space]]]\n[[`B::float_types`][`std::tuple<type-list>`][A list of floating-point types that can be assigned to type B.The types shall be\n                   listed in order of size, smallest first, and shall terminate in type `long double`.][[space]]]\n[[`B::exponent_type`][A signed integral type.][The type of the exponent of type B.  This type is required only for floating-point types.][[space]]]\n[[`B()`][ ][Default constructor.][[space]]]\n[[`B(cb)`][ ][Copy Constructor.][[space]]]\n[[`b = b`][`B&`][Assignment operator.][[space]]]\n[[`b = a`][`B&`][Assignment from an Arithmetic type.  The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.][[space]]]\n[[`b = s`][`B&`][Assignment from a string.][Throws a `std::runtime_error` if the string could not be interpreted as a valid number.]]\n[[`b.swap(b)`][`void`][Swaps the contents of its arguments.][`noexcept`]]\n[[`cb.str(ss, ff)`][`std::string`][Returns the string representation of `b` with `ss` digits and formatted according to the flags set in `ff`.\n                  If `ss` is zero, then returns as many digits as are required to reconstruct the original value.][[space]]]\n[[`b.negate()`][`void`][Negates `b`.][[space]]]\n[[`cb.compare(cb2)`][`int`][Compares `cb` and `cb2`, returns a value less than zero if `cb < cb2`, a value greater than zero if `cb > cb2` and zero\n                   if `cb == cb2`.][`noexcept`]]\n[[`cb.compare(a)`][`int`][Compares `cb` and `a`, returns a value less than zero if `cb < a`, a value greater than zero if `cb > a` and zero\n                   if `cb == a`.  The type of `a` shall be listed in one of the type lists\n                   `B::signed_types`, `B::unsigned_types` or `B::float_types`.][[space]]]\n[[`eval_add(b, cb)`][`void`][Adds `cb` to `b`.][[space]]]\n[[`eval_subtract(b, cb)`][`void`][Subtracts `cb` from `b`.][[space]]]\n[[`eval_multiply(b, cb)`][`void`][Multiplies `b` by `cb`.][[space]]]\n[[`eval_divide(b, cb)`][`void`][Divides `b` by `cb`.]\n            [`std::overflow_error` if cb has the value zero, and `std::numeric_limits<number<B> >::has_infinity == false`]]\n[[`eval_modulus(b, cb)`][`void`][Computes `b %= cb`, only required when `B` is an integer type.]\n            [`std::overflow_error` if cb has the value zero.]]\n[[`eval_bitwise_and(b, cb)`][`void`][Computes `b &= cb`, only required when `B` is an integer type.][[space]]]\n[[`eval_bitwise_or(b, cb)`][`void`][Computes `b |= cb`, only required when `B` is an integer type.][[space]]]\n[[`eval_bitwise_xor(b, cb)`][`void`][Computes `b ^= cb`, only required when `B` is an integer type.][[space]]]\n[[`eval_complement(b, cb)`][`void`][Computes the ones-complement of `cb` and stores the result in `b`, only required when `B` is an integer type.][[space]]]\n[[`eval_left_shift(b, ui)`][`void`][Computes `b <<= ui`, only required when `B` is an integer type.][[space]]]\n[[`eval_right_shift(b, ui)`][`void`][Computes `b >>= ui`, only required when `B` is an integer type.][[space]]]\n[[`eval_convert_to(pa, cb)`][`void`][Converts `cb` to the type of `*pa` and store the result in `*pa`.  Type `B` shall support\n                     conversion to at least types `std::intmax_t`, `std::uintmax_t` and `long long`.\n                     Conversion to other arithmetic types can then be synthesised using other operations.\n                     Conversions to other types are entirely optional.][[space]]]\n[[`eval_frexp(b, cb, pexp)`][`void`][Stores values in `b` and `*pexp` such that the value of `cb` is b * 2[super *pexp], only required when `B` is a floating-point type.][[space]]]\n[[`eval_ldexp(b, cb, exp)`][`void`][Stores a value in `b` that is cb * 2[super exp], only required when `B` is a floating-point type.][[space]]]\n[[`eval_frexp(b, cb, pi)`][`void`][Stores values in `b` and `*pi` such that the value of `cb` is b * 2[super *pi], only required when `B` is a floating-point type.]\n            [`std::runtime_error` if the exponent of cb is too large to be stored in an `int`.]]\n[[`eval_ldexp(b, cb, i)`][`void`][Stores a value in `b` that is cb * 2[super i], only required when `B` is a floating-point type.][[space]]]\n[[`eval_floor(b, cb)`][`void`][Stores the floor of `cb` in `b`, only required when `B` is a floating-point type.][[space]]]\n[[`eval_ceil(b, cb)`][`void`][Stores the ceiling of `cb` in `b`, only required when `B` is a floating-point type.][[space]]]\n[[`eval_sqrt(b, cb)`][`void`][Stores the square root of `cb` in `b`, only required when `B` is a floating-point type.][[space]]]\n[[`boost::multiprecision::number_category<B>::type`][`std::integral_constant<int, N>`][`N` is one of the values `number_kind_integer`, `number_kind_floating_point`, `number_kind_complex`, `number_kind_rational` or `number_kind_fixed_point`.\n                                                Defaults to `number_kind_floating_point`.][[space]]]\n[[`eval_conj(b, cb)`][`void`][Sets `b` to the complex conjugate of `cb`.  Required for complex types only - other types have a sensible default.][[space]]]\n[[`eval_proj(b, cb)`][`void`][Sets `b` to the Riemann projection of `cb`.  Required for complex types only - other types have a sensible default.][[space]]]\n[[`eval_real(b, cb)`][`void`][Sets `b` to the real part of `cb`.  Required for complex types only - other types have a sensible default.][[space]]]\n[[`eval_imag(b, cb)`][`void`][Sets `b` to the imaginary of `cb`.  Required for complex types only - other types have a sensible default.][[space]]]\n[[`eval_set_real(b, a)`][`void`][Sets the real part of `b` to `cb`.  Required for complex types only - other types have a sensible default.][[space]]]\n[[`eval_set_imag(b, a)`][`void`][Sets the imaginary part of `b` to `cb`.  Required for complex types only - other types have a sensible default.][[space]]]\n]\n\n[table Optional Requirements on the Backend Type\n[[Expression][Returns][Comments][Throws]]\n\n[[['Construct and assign:]]]\n[[`B(rb)`][`B`][Move constructor.  Afterwards variable `rb` shall be in sane state, albeit with unspecified value.\n      Only destruction and assignment to the moved-from variable `rb` need be supported after the operation.][`noexcept`]]\n[[`b = rb`][`B&`][Move-assign.  Afterwards variable `rb` shall be in sane state, albeit with unspecified value.\n      Only destruction and assignment to the moved-from variable `rb` need be supported after the operation.][`noexcept`]]\n[[`B(a)`][`B`][Direct construction from an arithmetic type.  The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, this operation is simulated using default-construction followed by assignment.][[space]]]\n[[`B(b2)`][`B`][Copy constructor from a different back-end type.  When not provided, a generic interconversion routine is used.\n          This constructor may be `explicit` if the corresponding frontend constructor should also be `explicit`.][[space]]]\n[[`b = b2`][`b&`][Assignment operator from a different back-end type.  When not provided, a generic interconversion routine is used.][[space]]]\n[[`assign_components(b, a, a)`][`void`][Assigns to `b` the two components in the following arguments.\n                           Only applies to rational and complex number types.\n                           When not provided, arithmetic operations are used to synthesise the result from the two values.][[space]]]\n[[`assign_components(b, b2, b2)`][`void`][Assigns to `b` the two components in the following arguments.\n                           Only applies to rational and complex number types.\n                           When not provided, arithmetic operations are used to synthesise the result from the two values.][[space]]]\n\n[[['Comparisons:]]]\n[[`eval_eq(cb, cb2)`][`bool`][Returns `true` if `cb` and `cb2` are equal in value.\n            When not provided, the default implementation returns `cb.compare(cb2) == 0`.][`noexcept`]]\n[[`eval_eq(cb, a)`][`bool`][Returns `true` if `cb` and `a` are equal in value.\n            The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, return the equivalent of `eval_eq(cb, B(a))`.][[space]]]\n[[`eval_eq(a, cb)`][`bool`][Returns `true` if `cb` and `a` are equal in value.\n            The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, the default version returns `eval_eq(cb, a)`.][[space]]]\n[[`eval_lt(cb, cb2)`][`bool`][Returns `true` if `cb` is less than `cb2` in value.\n            When not provided, the default implementation returns `cb.compare(cb2) < 0`.][`noexcept`]]\n[[`eval_lt(cb, a)`][`bool`][Returns `true` if `cb` is less than `a` in value.\n            The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, the default implementation returns `eval_lt(cb, B(a))`.][[space]]]\n[[`eval_lt(a, cb)`][`bool`][Returns `true` if `a` is less than `cb` in value.\n            The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, the default implementation returns `eval_gt(cb, a)`.][[space]]]\n[[`eval_gt(cb, cb2)`][`bool`][Returns `true` if `cb` is greater than `cb2` in value.\n            When not provided, the default implementation returns `cb.compare(cb2) > 0`.][`noexcept`]]\n[[`eval_gt(cb, a)`][`bool`][Returns `true` if `cb` is greater than `a` in value.\n            The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, the default implementation returns `eval_gt(cb, B(a))`.][[space]]]\n[[`eval_gt(a, cb)`][`bool`][Returns `true` if `a` is greater than `cb` in value.\n            The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, the default implementation returns `eval_lt(cb, a)`.][[space]]]\n[[`eval_is_zero(cb)`][`bool`][Returns `true` if `cb` is zero, otherwise `false`.  The default version of this function\n            returns `cb.compare(ui_type(0)) == 0`, where `ui_type` is `ui_type` is\n            `typename std::tuple_element<0, typename B::unsigned_types>::type`.][[space]]]\n[[`eval_get_sign(cb)`][`int`][Returns a value < zero if `cb` is negative, a value > zero if `cb` is positive, and zero if `cb` is zero.\n            The default version of this function\n            returns `cb.compare(ui_type(0))`, where `ui_type` is `ui_type` is\n            `typename std::tuple_element<0, typename B::unsigned_types>::type`.][[space]]]\n\n[[['Basic arithmetic:]]]\n[[`eval_add(b, a)`][`void`][Adds `a` to `b`.  The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, the default version calls `eval_add(b, B(a))`][[space]]]\n[[`eval_add(b, cb, cb2)`][`void`][Add `cb` to `cb2` and stores the result in `b`.\n            When not provided, does the equivalent of `b = cb; eval_add(b, cb2)`.][[space]]]\n[[`eval_add(b, cb, a)`][`void`][Add `cb` to `a` and stores the result in `b`.  The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, does the equivalent of `eval_add(b, cb, B(a))`.][[space]]]\n[[`eval_add(b, a, cb)`][`void`][Add `a` to `cb` and stores the result in `b`.  The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, does the equivalent of `eval_add(b, cb, a)`.][[space]]]\n[[`eval_subtract(b, a)`][`void`][Subtracts `a` from `b`.  The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, the default version calls `eval_subtract(b, B(a))`][[space]]]\n[[`eval_subtract(b, cb, cb2)`][`void`][Subtracts `cb2` from `cb` and stores the result in `b`.\n            When not provided, does the equivalent of `b = cb; eval_subtract(b, cb2)`.][[space]]]\n[[`eval_subtract(b, cb, a)`][`void`][Subtracts `a` from `cb` and stores the result in `b`.  The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, does the equivalent of `eval_subtract(b, cb, B(a))`.][[space]]]\n[[`eval_subtract(b, a, cb)`][`void`][Subtracts `cb` from `a` and stores the result in `b`.  The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, does the equivalent of `eval_subtract(b, cb, a); b.negate();`.][[space]]]\n[[`eval_multiply(b, a)`][`void`][Multiplies `b` by `a`.  The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, the default version calls `eval_multiply(b, B(a))`][[space]]]\n[[`eval_multiply(b, cb, cb2)`][`void`][Multiplies `cb` by `cb2` and stores the result in `b`.\n            When not provided, does the equivalent of `b = cb; eval_multiply(b, cb2)`.][[space]]]\n[[`eval_multiply(b, cb, a)`][`void`][Multiplies `cb` by `a` and stores the result in `b`.  The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, does the equivalent of `eval_multiply(b, cb, B(a))`.][[space]]]\n[[`eval_multiply(b, a, cb)`][`void`][Multiplies `a` by `cb` and stores the result in `b`.  The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, does the equivalent of `eval_multiply(b, cb, a)`.][[space]]]\n[[`eval_multiply_add(b, cb, cb2)`][`void`][Multiplies `cb` by `cb2` and adds the result to `b`.\n            When not provided does the equivalent of creating a temporary `B t` and `eval_multiply(t, cb, cb2)` followed by\n            `eval_add(b, t)`.][[space]]]\n[[`eval_multiply_add(b, cb, a)`][`void`][Multiplies `a` by `cb` and adds the result to `b`.\n            The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided does the equivalent of creating a temporary `B t` and `eval_multiply(t, cb, a)` followed by\n            `eval_add(b, t)`.][[space]]]\n[[`eval_multiply_add(b, a, cb)`][`void`][Multiplies `a` by `cb` and adds the result to `b`.\n            The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided does the equivalent of  `eval_multiply_add(b, cb, a)`.][[space]]]\n[[`eval_multiply_subtract(b, cb, cb2)`][`void`][Multiplies `cb` by `cb2` and subtracts the result from `b`.\n            When not provided does the equivalent of creating a temporary `B t` and `eval_multiply(t, cb, cb2)` followed by\n            `eval_subtract(b, t)`.][[space]]]\n[[`eval_multiply_subtract(b, cb, a)`][`void`][Multiplies `a` by `cb` and subtracts the result from `b`.\n            The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided does the equivalent of creating a temporary `B t` and `eval_multiply(t, cb, a)` followed by\n            `eval_subtract(b, t)`.][[space]]]\n[[`eval_multiply_subtract(b, a, cb)`][`void`][Multiplies `a` by `cb` and subtracts the result from `b`.\n            The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided does the equivalent of  `eval_multiply_subtract(b, cb, a)`.][[space]]]\n[[`eval_multiply_add(b, cb, cb2, cb3)`][`void`][Multiplies `cb` by `cb2` and adds the result to `cb3` storing the result in `b`.\n            When not provided does the equivalent of `eval_multiply(b, cb, cb2)` followed by\n            `eval_add(b, cb3)`.\n            For brevity, only a version showing all arguments of type `B` is shown here, but you can replace up to any 2 of\n            `cb`, `cb2` and `cb3` with any type listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.][[space]]]\n[[`eval_multiply_subtract(b, cb, cb2, cb3)`][`void`][Multiplies `cb` by `cb2` and subtracts from the result `cb3` storing the result in `b`.\n            When not provided does the equivalent of `eval_multiply(b, cb, cb2)` followed by\n            `eval_subtract(b, cb3)`.\n            For brevity, only a version showing all arguments of type `B` is shown here, but you can replace up to any 2 of\n            `cb`, `cb2` and `cb3` with any type listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.][[space]]]\n[[`eval_divide(b, a)`][`void`][Divides `b` by `a`.  The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, the default version calls `eval_divide(b, B(a))`]\n            [`std::overflow_error` if `a` has the value zero, and `std::numeric_limits<number<B> >::has_infinity == false`]]\n[[`eval_divide(b, cb, cb2)`][`void`][Divides `cb` by `cb2` and stores the result in `b`.\n            When not provided, does the equivalent of `b = cb; eval_divide(b, cb2)`.]\n            [`std::overflow_error` if `cb2` has the value zero, and `std::numeric_limits<number<B> >::has_infinity == false`]]\n[[`eval_divide(b, cb, a)`][`void`][Divides `cb` by `a` and stores the result in `b`.  The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, does the equivalent of `eval_divide(b, cb, B(a))`.]\n            [`std::overflow_error` if `a` has the value zero, and `std::numeric_limits<number<B> >::has_infinity == false`]]\n[[`eval_divide(b, a, cb)`][`void`][Divides `a` by `cb` and stores the result in `b`.  The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, does the equivalent of `eval_divide(b, B(a), cb)`.]\n            [`std::overflow_error` if cb has the value zero, and `std::numeric_limits<number<B> >::has_infinity == false`]]\n[[`eval_increment(b)`][void][Increments the value of `b` by one.\n            When not provided, does the equivalent of `eval_add(b, static_cast<ui_type>(1u))`.\n            Where `ui_type` is `typename std::tuple_element<0, typename B::unsigned_types>::type`.][[space]]]\n[[`eval_decrement(b)`][void][Decrements the value of `b` by one.\n            When not provided, does the equivalent of `eval_subtract(b, static_cast<ui_type>(1u))`.\n            Where `ui_type` is `typename std::tuple_element<0, typename B::unsigned_types>::type`.][[space]]]\n\n[[['Integer specific operations:]]]\n[[`eval_modulus(b, a)`][`void`][Computes `b %= cb`, only required when `B` is an integer type.  The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, the default version calls `eval_modulus(b, B(a))`]\n            [`std::overflow_error` if `a` has the value zero.]]\n[[`eval_modulus(b, cb, cb2)`][`void`][Computes `cb % cb2` and stores the result in `b`, only required when `B` is an integer type.\n            When not provided, does the equivalent of `b = cb; eval_modulus(b, cb2)`.]\n            [`std::overflow_error` if `a` has the value zero.]]\n[[`eval_modulus(b, cb, a)`][`void`][Computes `cb % a` and stores the result in `b`, only required when `B` is an integer type. The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, does the equivalent of `eval_modulus(b, cb, B(a))`.]\n            [`std::overflow_error` if `a` has the value zero.]]\n[[`eval_modulus(b, a, cb)`][`void`][Computes `cb % a` and stores the result in `b`, only required when `B` is an integer type. The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, does the equivalent of `eval_modulus(b, B(a), cb)`.]\n            [`std::overflow_error` if `a` has the value zero.]]\n[[`eval_bitwise_and(b, a)`][`void`][Computes `b &= cb`, only required when `B` is an integer type.  The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, the default version calls `eval_bitwise_and(b, B(a))`][[space]]]\n[[`eval_bitwise_and(b, cb, cb2)`][`void`][Computes `cb & cb2` and stores the result in `b`, only required when `B` is an integer type.\n            When not provided, does the equivalent of `b = cb; eval_bitwise_and(b, cb2)`.][[space]]]\n[[`eval_bitwise_and(b, cb, a)`][`void`][Computes `cb & a` and stores the result in `b`, only required when `B` is an integer type. The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, does the equivalent of `eval_bitwise_and(b, cb, B(a))`.][[space]]]\n[[`eval_bitwise_and(b, a, cb)`][`void`][Computes `cb & a` and stores the result in `b`, only required when `B` is an integer type. The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, does the equivalent of `eval_bitwise_and(b, cb, a)`.][[space]]]\n[[`eval_bitwise_or(b, a)`][`void`][Computes `b |= cb`, only required when `B` is an integer type.  The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, the default version calls `eval_bitwise_or(b, B(a))`][[space]]]\n[[`eval_bitwise_or(b, cb, cb2)`][`void`][Computes `cb | cb2` and stores the result in `b`, only required when `B` is an integer type.\n            When not provided, does the equivalent of `b = cb; eval_bitwise_or(b, cb2)`.][[space]]]\n[[`eval_bitwise_or(b, cb, a)`][`void`][Computes `cb | a` and stores the result in `b`, only required when `B` is an integer type. The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, does the equivalent of `eval_bitwise_or(b, cb, B(a))`.][[space]]]\n[[`eval_bitwise_or(b, a, cb)`][`void`][Computes `cb | a` and stores the result in `b`, only required when `B` is an integer type. The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, does the equivalent of `eval_bitwise_or(b, cb, a)`.][[space]]]\n[[`eval_bitwise_xor(b, a)`][`void`][Computes `b ^= cb`, only required when `B` is an integer type.  The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, the default version calls `eval_bitwise_xor(b, B(a))`][[space]]]\n[[`eval_bitwise_xor(b, cb, cb2)`][`void`][Computes `cb ^ cb2` and stores the result in `b`, only required when `B` is an integer type.\n            When not provided, does the equivalent of `b = cb; eval_bitwise_xor(b, cb2)`.][[space]]]\n[[`eval_bitwise_xor(b, cb, a)`][`void`][Computes `cb ^ a` and stores the result in `b`, only required when `B` is an integer type. The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, does the equivalent of `eval_bitwise_xor(b, cb, B(a))`.][[space]]]\n[[`eval_bitwise_xor(b, a, cb)`][`void`][Computes `a ^ cb` and stores the result in `b`, only required when `B` is an integer type. The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            When not provided, does the equivalent of `eval_bitwise_xor(b, cb, a)`.][[space]]]\n[[`eval_left_shift(b, cb, ui)`][`void`][Computes `cb << ui` and stores the result in `b`, only required when `B` is an integer type.\n            When not provided, does the equivalent of `b = cb; eval_left_shift(b, a);`.][[space]]]\n[[`eval_right_shift(b, cb, ui)`][`void`][Computes `cb >> ui` and stores the result in `b`, only required when `B` is an integer type.\n            When not provided, does the equivalent of `b = cb; eval_right_shift(b, a);`.][[space]]]\n[[`eval_qr(cb, cb2, b, b2)`][`void`][Sets `b` to the result of `cb / cb2` and `b2` to the result of `cb % cb2`.  Only required when `B` is an integer type.\n            The default version of this function is synthesised from other operations above.]\n            [`std::overflow_error` if `a` has the value zero.]]\n[[`eval_integer_modulus(cb, ui)`][`unsigned`][Returns the result of `cb % ui`.    Only required when `B` is an integer type.\n            The default version of this function is synthesised from other operations above.]\n            [`std::overflow_error` if `a` has the value zero.]]\n[[`eval_lsb(cb)`][`unsigned`][Returns the index of the least significant bit that is set.  Only required when `B` is an integer type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_msb(cb)`][`unsigned`][Returns the index of the most significant bit that is set.  Only required when `B` is an integer type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_bit_test(cb, ui)`][`bool`][Returns true if `cb` has bit `ui` set.  Only required when `B` is an integer type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_bit_set(b, ui)`][`void`][Sets the bit at index `ui` in `b`.  Only required when `B` is an integer type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_bit_unset(b, ui)`][`void`][Unsets the bit at index `ui` in `b`.  Only required when `B` is an integer type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_bit_flip(b, ui)`][`void`][Flips the bit at index `ui` in `b`.  Only required when `B` is an integer type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_gcd(b, cb, cb2)`][`void`][Sets `b` to the greatest common divisor of `cb` and `cb2`.  Only required when `B` is an integer type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_lcm(b, cb, cb2)`][`void`][Sets `b` to the least common multiple of `cb` and `cb2`.  Only required when `B` is an integer type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_gcd(b, cb, a)`][`void`][Sets `b` to the greatest common divisor of `cb` and `cb2`.  Only required when `B` is an integer type.\n            The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            The default version of this function calls `eval_gcd(b, cb, B(a))`.][[space]]]\n[[`eval_lcm(b, cb, a)`][`void`][Sets `b` to the least common multiple of `cb` and `cb2`.  Only required when `B` is an integer type.\n            The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            The default version of this function calls `eval_lcm(b, cb, B(a))`.][[space]]]\n[[`eval_gcd(b, a, cb)`][`void`][Sets `b` to the greatest common divisor of `cb` and `a`.  Only required when `B` is an integer type.\n            The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            The default version of this function calls `eval_gcd(b, cb, a)`.][[space]]]\n[[`eval_lcm(b, a, cb)`][`void`][Sets `b` to the least common multiple of `cb` and `a`.  Only required when `B` is an integer type.\n            The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types` or `B::float_types`.\n            The default version of this function calls `eval_lcm(b, cb, a)`.][[space]]]\n[[`eval_powm(b, cb, cb2, cb3)`][`void`][Sets `b` to the result of ['(cb^cb2)%cb3].\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_powm(b, cb, cb2, a)`][`void`][Sets `b` to the result of ['(cb^cb2)%a].\n            The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types`.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_powm(b, cb, a, cb2)`][`void`][Sets `b` to the result of ['(cb^a)%cb2].\n            The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types`.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_powm(b, cb, a, a2)`][`void`][Sets `b` to the result of ['(cb^a)%a2].\n            The type of `a` shall be listed in one of the type lists\n            `B::signed_types`, `B::unsigned_types`.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_integer_sqrt(b, cb, b2)`][`void`][Sets `b` to the largest integer which when squared is less than `cb`, also\n            sets `b2` to the remainder, ie to ['cb - b[super 2]].\n            The default version of this function is synthesised from other operations above.][[space]]]\n\n[[['Sign manipulation:]]]\n[[`eval_abs(b, cb)`][`void`][Set `b` to the absolute value of `cb`.\n            The default version of this functions assigns `cb` to `b`, and then calls `b.negate()` if\n            `eval_get_sign(cb) < 0`.][[space]]]\n[[`eval_fabs(b, cb)`][`void`][Set `b` to the absolute value of `cb`.\n            The default version of this functions assigns `cb` to `b`, and then calls `b.negate()` if\n            `eval_get_sign(cb) < 0`.][[space]]]\n\n[[['floating-point functions:]]]\n[[`eval_fpclassify(cb)`][`int`][Returns one of the same values returned by `std::fpclassify`.  Only required when `B` is an floating-point type.\n            The default version of this function will only test for zero `cb`.][[space]]]\n[[`eval_trunc(b, cb)`][`void`][Performs the equivalent operation to `std::trunc` on argument `cb` and stores the result in `b`.  Only required when `B` is an floating-point type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_round(b, cb)`][`void`][Performs the equivalent operation to `std::round` on argument `cb` and stores the result in `b`.  Only required when `B` is an floating-point type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_exp(b, cb)`][`void`][Performs the equivalent operation to `std::exp` on argument `cb` and stores the result in `b`.  Only required when `B` is an floating-point type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_exp2(b, cb)`][`void`][Performs the equivalent operation to `std::exp2` on argument `cb` and stores the result in `b`.  Only required when `B` is an floating-point type.\n            The default version of this function is implemented in terms of `eval_pow`.][[space]]]\n[[`eval_log(b, cb)`][`void`][Performs the equivalent operation to `std::log` on argument `cb` and stores the result in `b`.  Only required when `B` is an floating-point type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_log10(b, cb)`][`void`][Performs the equivalent operation to `std::log10` on argument `cb` and stores the result in `b`.  Only required when `B` is an floating-point type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_sin(b, cb)`][`void`][Performs the equivalent operation to `std::sin` on argument `cb` and stores the result in `b`.  Only required when `B` is an floating-point type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_cos(b, cb)`][`void`][Performs the equivalent operation to `std::cos` on argument `cb` and stores the result in `b`.  Only required when `B` is an floating-point type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_tan(b, cb)`][`void`][Performs the equivalent operation to `std::exp` on argument `cb` and stores the result in `b`.  Only required when `B` is an floating-point type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_asin(b, cb)`][`void`][Performs the equivalent operation to `std::asin` on argument `cb` and stores the result in `b`.  Only required when `B` is an floating-point type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_acos(b, cb)`][`void`][Performs the equivalent operation to `std::acos` on argument `cb` and stores the result in `b`.  Only required when `B` is an floating-point type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_atan(b, cb)`][`void`][Performs the equivalent operation to `std::atan` on argument `cb` and stores the result in `b`.  Only required when `B` is an floating-point type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_sinh(b, cb)`][`void`][Performs the equivalent operation to `std::sinh` on argument `cb` and stores the result in `b`.  Only required when `B` is an floating-point type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_cosh(b, cb)`][`void`][Performs the equivalent operation to `std::cosh` on argument `cb` and stores the result in `b`.  Only required when `B` is an floating-point type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_tanh(b, cb)`][`void`][Performs the equivalent operation to `std::tanh` on argument `cb` and stores the result in `b`.  Only required when `B` is an floating-point type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_fmod(b, cb, cb2)`][`void`][Performs the equivalent operation to `std::fmod` on arguments `cb` and `cb2`, and store the result in `b`.  Only required when `B` is an floating-point type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_modf(b, cb, pb)`][`void`][Performs the equivalent operation to `std::modf` on argument `cb`, and store the integer result in `*pb` and the fractional part in `b`.\n            Only required when `B` is an floating-point type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_pow(b, cb, cb2)`][`void`][Performs the equivalent operation to `std::pow` on arguments `cb` and `cb2`, and store the result in `b`.  Only required when `B` is an floating-point type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_atan2(b, cb, cb2)`][`void`][Performs the equivalent operation to `std::atan` on arguments `cb` and `cb2`, and store the result in `b`.  Only required when `B` is an floating-point type.\n            The default version of this function is synthesised from other operations above.][[space]]]\n[[`eval_scalbn(b, cb, e)`][`void`][Scales value `cb` by ['r[super e]], where ['r] is the radix of the type.  The default version of this function\n                  is implemented in terms of eval_ldexp, consequently this function must be provided for types with a radix other than 2.]]\n[[`eval_scalbln(b, cb, e)`][`void`][Calls `eval_scalbn(b, cb, e)`.]]\n[[`eval_ilogb(cb)`][`B::exponent_type`][Returns the exponent ['e] of value `cb` such that ['1 <= cb*r[super -e] < r], where ['r] is the radix of type B.\n                    The default version of this function is implemented in terms of eval_frexp, consequently this function must be provided for types with a radix other than 2.]]\n[[`eval_remquo(b, cb, cb2, pi)`][`void`][Sets `b = cb - n * cb2` and stores `n` in `*pi`.]]\n[[`eval_remquo(b, cb, a, pi)`][`void`][Default version converts a to type B and calls the overload above.]]\n[[`eval_remquo(b, a, cb, pi)`][`void`][Default version converts a to type B and calls the overload above.]]\n[[`eval_remainder(b, cb, cb2)`][`void`][Default version calls eval_remquo with a dummy final argument.]]\n[[`eval_remainder(b, cb, a)`][`void`][Default version calls eval_remquo with a dummy final argument.]]\n[[`eval_remainder(b, a, cb)`][`void`][Default version calls eval_remquo with a dummy final argument.]]\n\n[[`eval_fdim(b, cb, cb2)`][`void`][Default version sets `b = cb - cb2` if `cb > cb2` and zero otherwise.  Special cases are handled as in the C99 annex.]]\n[[`eval_fdim(b, cb, a)`][`void`][Default version sets `b = cb - cb2` if `cb > cb2` and zero otherwise.  Special cases are handled as in the C99 annex.]]\n[[`eval_fdim(b, a, cb)`][`void`][Default version sets `b = cb - cb2` if `cb > cb2` and zero otherwise.  Special cases are handled as in the C99 annex.]]\n\n[[`eval_fmax(b, cb, cb2)`][`void`][Sets `b` to the larger of `cb` and `cb2`.]]\n[[`eval_fmax(b, cb, a)`][`void`][Sets `b` to the larger of `cb` and `a`.]]\n[[`eval_fmax(b, a, cb)`][`void`][Sets `b` to the larger of `cb` and `a`.]]\n[[`eval_fmin(b, cb, cb2)`][`void`][Sets `b` to the smaller of `cb` and `cb2`.]]\n[[`eval_fmin(b, cb, a)`][`void`][Sets `b` to the smaller of `cb` and `a`.]]\n[[`eval_fmin(b, a, cb)`][`void`][Sets `b` to the smaller of `cb` and `a`.]]\n\n[[`eval_hypot(b, cb, cb2)`][`void`][Sets `b` to the square root of the sum of the squares of `cb` and `cb2` without undue over or under flow.]]\n[[`eval_hypot(b, cb, a)`][`void`][As above.]]\n[[`eval_hypot(b, a, cb)`][`void`][As above.]]\n\n[[`eval_logb(b, cb)`][`B::exponent_type`][Sets `b` to the exponent ['e] of value `cb` such that ['1 <= cb*r[super -b] < r], where ['r] is the radix of type B.\n                  The default version of this function is implemented in terms of `eval_ilogb`.]]\n[[`eval_nearbyint(b, cb)`][`void`][Calls `eval_round(b, cb)`.]]\n[[`eval_rint(b, cb)`][`void`][Calls `eval_nearbyint(b, cb)`.]]\n[[`eval_log2(b, cb)`][`void`][Sets `b` to the logarithm base 2 of `cb`.]]\n\n[[['hashing:]]]\n[[`hash_value(cb)`][`std::size_t`]\n         [Returns a hash value for the argument that is suitable for use with `std::hash` etc.  If not provided then no automatic hashing support will be available for the number type.]]\n]\n\nWhen the tables above place no ['throws] requirements on an operation, then it is up to each type modelling this concept to\ndecide when or whether throwing an exception is desirable.  However, thrown exceptions should always either be the type, or\ninherit from the type `std::runtime_error`.  For example, a floating-point type might choose to throw `std::overflow_error`\nwhenever the result of an operation would be infinite, and `std::underflow_error` whenever it would round to zero.\n\n[note\nThe non-member functions are all named with an \"eval_\" prefix to avoid conflicts with template classes of the same name -\nin point of fact this naming convention shouldn't be necessary, but rather works around some compiler bugs.]\n\n[h4 Overloadable Functions]\n\nSome of the C99 math functions do not have `eval_` functions but must be overloaded directly: these functions\nare either trivial or are forwarded to the Boost.Math implementations by default.\nThe full list of these functions is:\n\n   int           sign       (const ``['number-or-expression-template-type]``&);\n   bool          signbit    (const ``['number-or-expression-template-type]``&);\n   ``['number]``        changesign (const ``['number-or-expression-template-type]``&);\n   ``['number]``        copysign   (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['number]``        asinh      (const ``['number-or-expression-template-type]``&);\n   ``['number]``        acosh      (const ``['number-or-expression-template-type]``&);\n   ``['number]``        atanh      (const ``['number-or-expression-template-type]``&);\n   ``['number]``        cbrt       (const ``['number-or-expression-template-type]``&);\n   ``['number]``        erf        (const ``['number-or-expression-template-type]``&);\n   ``['number]``        erfc       (const ``['number-or-expression-template-type]``&);\n   ``['number]``        expm1      (const ``['number-or-expression-template-type]``&);\n   ``['number]``        log1p      (const ``['number-or-expression-template-type]``&);\n   ``['number]``        tgamma     (const ``['number-or-expression-template-type]``&);\n   ``['number]``        lgamma     (const ``['number-or-expression-template-type]``&);\n   long          lrint      (const ``['number-or-expression-template-type]``&);\n   long long     llrint     (const ``['number-or-expression-template-type]``&);\n   ``['number]``        nextafter  (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['number]``        nexttoward (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/reference_cpp_bin_float.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:cpp_bin_float_ref cpp_bin_float]\n\n   namespace boost{ namespace multiprecision{\n\n   enum digit_base_type\n   {\n      digit_base_2 = 2,\n      digit_base_10 = 10\n   };\n\n   template <unsigned Digits, digit_base_type base = digit_base_10, class Allocator = void, class Exponent = int, ExponentMin = 0, ExponentMax = 0>\n   class cpp_bin_float;\n\n   typedef number<cpp_bin_float<50> > cpp_bin_float_50;\n   typedef number<cpp_bin_float<100> > cpp_bin_float_100;\n\n   typedef number<backends::cpp_bin_float<24, backends::digit_base_2, void, std::int16_t, -126, 127>, et_off>         cpp_bin_float_single;\n   typedef number<backends::cpp_bin_float<53, backends::digit_base_2, void, std::int16_t, -1022, 1023>, et_off>       cpp_bin_float_double;\n   typedef number<backends::cpp_bin_float<64, backends::digit_base_2, void, std::int16_t, -16382, 16383>, et_off>     cpp_bin_float_double_extended;\n   typedef number<backends::cpp_bin_float<113, backends::digit_base_2, void, std::int16_t, -16382, 16383>, et_off>    cpp_bin_float_quad;\n   typedef number<backends::cpp_bin_float<237, backends::digit_base_2, void, std::int32_t, -262142, 262143>, et_off>  cpp_bin_float_oct;\n\n   }} // namespaces\n\nClass template `cpp_bin_float` fulfils all of the requirements for a [link boost_multiprecision.ref.backendconc Backend] type.\nIts members and non-member functions are deliberately not documented: these are considered implementation details that are subject\nto change.\n\nThe class takes six template parameters:\n\n[variablelist\n[[Digits][The number of digits precision the type\nshould support.  This is normally expressed as base-10 digits, but that can be changed via the second template parameter.]]\n[[base][An enumerated value (either `digit_base_10` or `digit_base_2`) that indicates whether `Digits` is base-10 or base-2]]\n[[Allocator][The allocator used: defaults to type `void`, meaning all storage is within the class, and no dynamic\nallocation is performed, but can be set to a standard library allocator if dynamic allocation makes more sense.]]\n[[Exponent][A signed integer type to use as the type of the exponent - defaults to `int`.]]\n[[ExponentMin][The smallest (most negative) permitted exponent, defaults to zero, meaning \"define as small as possible\ngiven the limitations of the type and our internal requirements\".]]\n[[ExponentMax][The largest (most positive) permitted exponent, defaults to zero, meaning \"define as large as possible\ngiven the limitations of the type and our internal requirements\".]]\n]\n\nThe type of `number_category<cpp_bin_float<Args...> >::type` is `std::integral_constant<int, number_kind_floating_point>`.\n\nMore information on this type can be found in the [link boost_multiprecision.tut.floats.cpp_bin_float tutorial].\n\n[h4 Implementation Notes]\n\nInternally, an N-bit `cpp_bin_float` is represented as an N-bit unsigned integer along with an exponent and a sign.\nThe integer part is normalized so that its most significant bit is always 1.  The decimal point is assumed to be\ndirectly after the most significant bit of the integer part.  The special values zero, infinity and NaN all have\nthe integer part set to zero, and the exponent to one of 3 special values above the maximum permitted exponent.\n\nMultiplication is trivial: multiply the two N-bit integer mantissa's to obtain a 2N-bit number, then round and\nadjust the sign and exponent.\n\nAddition and subtraction proceed similarly - if the exponents are such that there is overlap between the two\nvalues, then left shift the larger value to produce a number with between N and 2N bits, then perform integer\naddition or subtraction, round, and adjust the exponent.\n\nDivision proceeds as follows: first scale the numerator by some power of 2 so that integer division will\nproduce either an N-bit or N+1 bit result plus a remainder.  If we get an N bit result then the size of\ntwice the remainder compared to the denominator gives us the rounding direction.  Otherwise we have one extra bit\nin the result which we can use to determine rounding (in this case ties occur only if the remainder is zero and\nthe extra bit is a 1).\n\nSquare root uses integer square root in a manner analogous to division.\n\nDecimal string to binary conversion proceeds as follows: first parse the digits to\nproduce an integer multiplied by a decimal exponent.  Note that we stop parsing digits\nonce we have parsed as many as can possibly effect the result - this stops the integer\npart growing too large when there are a very large number of input digits provided.\nAt this stage if the decimal exponent is positive then the result is an integer and we\ncan in principle simply multiply by 10^N to get an exact integer result.  In practice\nhowever, that could produce some very large integers.  We also need to be able to divide\nby 10^N in the event that the exponent is negative.  Therefore calculation of the 10^N\nvalues plus the multiplication or division are performed using limited precision\ninteger arithmetic, plus an exponent, and a track of the accumulated error.  At the end of\nthe calculation we will either be able to round unambiguously, or the error will be such\nthat we can't tell which way to round.  In the latter case we simply up the precision and try\nagain until we have an unambiguously rounded result.\n\nBinary to decimal conversion proceeds very similarly to the above, our aim is to calculate\n`mantissa * 2^shift * 10^E` where `E` is the decimal exponent and `shift` is calculated\nso that the result is an N bit integer assuming we want N digits printed in the result.\nAs before we use limited precision arithmetic to calculate the result and up the\nprecision as necessary until the result is unambiguously correctly rounded.  In addition\nour initial calculation of the decimal exponent may be out by 1, so we have to correct\nthat and loop as well in the that case.\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/reference_cpp_dec_float.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:cpp_dec_ref cpp_dec_float]\n\n   namespace boost{ namespace multiprecision{\n\n   template <unsigned Digits10, class ExponentType = std::int32_t, class Allocator = void>\n   class cpp_dec_float;\n\n   typedef number<cpp_dec_float<50> > cpp_dec_float_50;\n   typedef number<cpp_dec_float<100> > cpp_dec_float_100;\n\n   }} // namespaces\n\nClass template `cpp_dec_float` fulfils all of the requirements for a [link boost_multiprecision.ref.backendconc Backend] type.\nIts members and non-member functions are deliberately not documented: these are considered implementation details that are subject\nto change.\n\nThe class takes three template parameters:\n\n[variablelist\n[[Digits10][The number of decimal digits precision the type\nshould support.  Note that this type does not normally perform any dynamic memory allocation, and as a result the `Digits10`\ntemplate argument should not be set too high or the class's size will grow unreasonably large.]]\n[[ExponentType][A signed integer type that represents the exponent of the number]]\n[[Allocator][The allocator used: defaults to type `void`, meaning all storage is within the class, and no dynamic\nallocation is performed, but can be set to a standard library allocator if dynamic allocation makes more sense.]]\n]\n\nThe type of `number_category<cpp_dec_float<Args...> >::type` is `std::integral_constant<int, number_kind_floating_point>`.\n\nMore information on this type can be found in the [link boost_multiprecision.tut.floats.cpp_dec_float tutorial].\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/reference_cpp_int.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:cpp_int_ref cpp_int]\n\n   namespace boost{ namespace multiprecision{\n\n   typedef unspecified-type limb_type;\n\n   enum cpp_integer_type    { signed_magnitude, unsigned_magnitude };\n   enum cpp_int_check_type  { checked, unchecked };\n\n   template <unsigned MinDigits = 0,\n             unsigned MaxDits = 0,\n             cpp_integer_type SignType = signed_magnitude,\n             cpp_int_check_type Checked = unchecked,\n             class Allocator = std::allocator<limb_type> >\n   class cpp_int_backend;\n   //\n   // Expression templates default to et_off if there is no allocator:\n   //\n   template <unsigned MinDigits, unsigned MaxDigits, cpp_integer_type SignType, cpp_int_check_type Checked>\n   struct expression_template_default<cpp_int_backend<MinDigits, MaxDigits, SignType, Checked, void> >\n   { static const expression_template_option value = et_off; };\n\n   typedef number<cpp_int_backend<> >              cpp_int;    // arbitrary precision integer\n   typedef rational_adaptor<cpp_int_backend<> >    cpp_rational_backend;\n   typedef number<cpp_rational_backend>            cpp_rational; // arbitrary precision rational number\n\n   // Fixed precision unsigned types:\n   typedef number<cpp_int_backend<128, 128, unsigned_magnitude, unchecked, void> >   uint128_t;\n   typedef number<cpp_int_backend<256, 256, unsigned_magnitude, unchecked, void> >   uint256_t;\n   typedef number<cpp_int_backend<512, 512, unsigned_magnitude, unchecked, void> >   uint512_t;\n   typedef number<cpp_int_backend<1024, 1024, unsigned_magnitude, unchecked, void> > uint1024_t;\n\n   // Fixed precision signed types:\n   typedef number<cpp_int_backend<128, 128, signed_magnitude, unchecked, void> >     int128_t;\n   typedef number<cpp_int_backend<256, 256, signed_magnitude, unchecked, void> >     int256_t;\n   typedef number<cpp_int_backend<512, 512, signed_magnitude, unchecked, void> >     int512_t;\n   typedef number<cpp_int_backend<1024, 1024, signed_magnitude, unchecked, void> >   int1024_t;\n\n   // Over again, but with checking enabled this time:\n   typedef number<cpp_int_backend<0, 0, signed_magnitude, checked> >                 checked_cpp_int;\n   typedef rational_adaptor<cpp_int_backend<0, 0, signed_magnitude, checked> >       checked_cpp_rational_backend;\n   typedef number<checked_cpp_rational_backend>                                      checked_cpp_rational;\n\n   // Checked fixed precision unsigned types:\n   typedef number<cpp_int_backend<128, 128, unsigned_magnitude, checked, void> >     checked_uint128_t;\n   typedef number<cpp_int_backend<256, 256, unsigned_magnitude, checked, void> >     checked_uint256_t;\n   typedef number<cpp_int_backend<512, 512, unsigned_magnitude, checked, void> >     checked_uint512_t;\n   typedef number<cpp_int_backend<1024, 1024, unsigned_magnitude, checked, void> >   checked_uint1024_t;\n\n   // Fixed precision signed types:\n   typedef number<cpp_int_backend<128, 128, signed_magnitude, checked, void> >       checked_int128_t;\n   typedef number<cpp_int_backend<256, 256, signed_magnitude, checked, void> >       checked_int256_t;\n   typedef number<cpp_int_backend<512, 512, signed_magnitude, checked, void> >       checked_int512_t;\n   typedef number<cpp_int_backend<1024, 1024, signed_magnitude, checked, void> >     checked_int1024_t;\n\n   }} // namespaces\n\nClass template `cpp_int_backend` fulfils all of the requirements for a [link boost_multiprecision.ref.backendconc Backend] type.\nIts members and non-member functions are deliberately not documented: these are considered implementation details that are subject\nto change.\n\nThe template arguments are:\n\n[variablelist\n[[MinBits][Determines the number of Bits to store directly within the object before resorting to dynamic memory\n           allocation.  When zero, this field is determined automatically based on how many bits can be stored\n           in union with the dynamic storage header: setting a larger value may improve performance as larger integer\n           values will be stored internally before memory allocation is required.]]\n[[MaxBits][Determines the maximum number of bits to be stored in the type: resulting in a fixed precision type.\n           When this value is the same as MinBits, then the Allocator parameter is ignored, as no dynamic\n           memory allocation will ever be performed: in this situation the Allocator parameter should be set to\n           type `void`.  Note that this parameter should not be used simply to prevent large memory\n           allocations, not only is that role better performed by the allocator, but fixed precision\n           integers have a tendency to allocate all of MaxBits of storage more often than one would expect.]]\n[[SignType][Determines whether the resulting type is signed or not.  Note that for\n[@http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic arbitrary precision] types\n          this parameter must be `signed_magnitude`.  For fixed precision\n          types then this type may be either `signed_magnitude` or `unsigned_magnitude`.]]\n[[Checked][This parameter has two values: `checked` or `unchecked`.  See the [link boost_multiprecision.tut.ints.cpp_int tutorial] for more information.]]\n[[Allocator][The allocator to use for dynamic memory allocation, or type `void` if MaxBits == MinBits.]]\n]\n\nThe type of `number_category<cpp_int<Args...> >::type` is `std::integral_constant<int, number_kind_integer>`.\n\nMore information on this type can be found in the [link boost_multiprecision.tut.ints.cpp_int tutorial].\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/reference_gmp_float.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:mpf_ref gmp_float]\n\n   namespace boost{ namespace multiprecision{\n\n   template <unsigned Digits10>\n   class gmp_float;\n\n   typedef number<gmp_float<50> >    mpf_float_50;\n   typedef number<gmp_float<100> >   mpf_float_100;\n   typedef number<gmp_float<500> >   mpf_float_500;\n   typedef number<gmp_float<1000> >  mpf_float_1000;\n   typedef number<gmp_float<0> >     mpf_float;\n\n   }} // namespaces\n\nClass template `gmp_float` fulfils all of the requirements for a [link boost_multiprecision.ref.backendconc Backend] type.\nIts members and non-member functions are deliberately not documented: these are considered implementation details that are subject\nto change.\n\nThe class takes a single template parameter - `Digits10` - which is the number of decimal digits precision the type\nshould support.  When this parameter is zero, then the precision can be set at runtime via `number::default_precision`\nand `number::precision`.  Note that this type does not in any way change the GMP library's global state (for example\nit does not change the default precision of the mpf_t data type), therefore you can safely mix this type with existing\ncode that uses GMP, and also mix `gmp_float`s of differing precision.\n\nThe type of `number_category<cpp_int<Args...> >::type` is `std::integral_constant<int, number_kind_floating_point>`.\n\nMore information on this type can be found in the [link boost_multiprecision.tut.floats.gmp_float tutorial].\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/reference_gmp_int.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:gmp_int_ref gmp_int]\n\n   namespace boost{ namespace multiprecision{\n\n   class gmp_int;\n\n   typedef number<gmp_int >         mpz_int;\n\n   }} // namespaces\n\nClass template `gmp_int` fulfils all of the requirements for a [link boost_multiprecision.ref.backendconc Backend] type.\nIts members and non-member functions are deliberately not documented: these are considered implementation details that are subject\nto change.\n\nThe type of `number_category<cpp_int<Args...> >::type` is `std::integral_constant<int, number_kind_integer>`.\n\nMore information on this type can be found in the [link boost_multiprecision.tut.ints.gmp_int tutorial].\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/reference_header_structure.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:headers Header File Structure]\n\n[table Top level headers\n[[Header][Contains]]\n[[cpp_int.hpp][The `cpp_int` backend type.]]\n[[gmp.hpp][Defines all [gmp] related backends.]]\n[[miller_rabin.hpp][Miller Rabin primality testing code.]]\n[[number.hpp][Defines the `number` backend, is included by all the backend headers.]]\n[[mpfr.hpp][Defines the mpfr_float_backend backend.]]\n[[random.hpp][Defines code to interoperate with Boost.Random.]]\n[[rational_adaptor.hpp][Defines the `rational_adaptor` backend.]]\n[[cpp_dec_float.hpp][Defines the `cpp_dec_float` backend.]]\n[[tommath.hpp][Defines the `tommath_int` backend.]]\n[[concepts/number_archetypes.hpp][Defines a backend concept archetypes for testing use.]]\n]\n\n[table Implementation Headers\n[[Header][Contains]]\n[[cpp_int/add.hpp][Add and subtract operators for `cpp_int_backend`.]]\n[[cpp_int/bitwise.hpp][Bitwise operators for `cpp_int_backend`.]]\n[[cpp_int/checked.hpp][Helper functions for checked arithmetic for `cpp_int_backend`.]]\n[[cpp_int/comparison.hpp][Comparison operators for `cpp_int_backend`.]]\n[[cpp_int/cpp_int_config.hpp][Basic setup and configuration for `cpp_int_backend`.]]\n[[cpp_int/divide.hpp][Division and modulus operators for `cpp_int_backend`.]]\n[[cpp_int/limits.hpp][`numeric_limits` support for `cpp_int_backend`.]]\n[[cpp_int/misc.hpp][Miscellaneous operators for `cpp_int_backend`.]]\n[[cpp_int/multiply.hpp][Multiply operators for `cpp_int_backend`.]]\n[[detail/default_ops.hpp][Default versions of the optional backend non-member functions.]]\n[[detail/generic_interconvert.hpp][Generic interconversion routines.]]\n[[detail/number_base.hpp][All the expression template code, metaprogramming, and operator overloads for `number`.]]\n[[detail/no_et_ops.hpp][The non-expression template operators.]]\n[[detail/functions/constants.hpp][Defines constants used by the floating-point functions.]]\n[[detail/functions/pow.hpp][Defines default versions of the power and exponential related floating-point functions.]]\n[[detail/functions/trig.hpp][Defines default versions of the trigonometric related floating-point functions.]]\n]\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/reference_internal_support.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:internals Internal Support Code]\n\nThere are some traits classes which authors of new backends should be aware of:\n\n   namespace boost{ namespace multiprecision{ namespace detail{\n\n   template<typename From, typename To>\n   struct is_explicitly_convertible;\n\n   }}}\n\nInherits from `std::integral_constant<bool,true>` if type `From` has an explicit conversion from `To`.\n\n   template <class From, class To>\n   struct is_lossy_conversion\n   {\n      static const bool value = see below;\n   };\n\nMember `value` is true if the conversion from `From` to `To` would result in a loss of precision, and `false` otherwise.\n\nThe default version of this trait simply checks whether the ['kind] of conversion (for example from a floating-point to an integer type)\nis inherently lossy.  Note that if either of the types `From` or `To` are of an unknown number category (because `number_category` is not\nspecialised for that type) then this trait will be `true`.\n\n   template<typename From, typename To>\n   struct is_restricted_conversion\n   {\n      static const bool value = see below;\n   };\n\nMember `value` is `true` if `From` is only explicitly convertible to `To` and not implicitly convertible, or\nif `is_lossy_conversion<From, To>::value` is `true`.  Otherwise `false`.\n\nNote that while this trait is the ultimate arbiter of which constructors are marked as `explicit` in class `number`,\nauthors of backend types should generally specialise one of the traits above, rather than this one directly.\n\n   template <class T>\n   is_signed_number;\n   template <class T>\n   is_unsigned_number;\n\nThese two traits inherit from either `std::integral_constant<bool, true>` or `std::integral_constant<bool, false>`, by default types are assumed to be signed unless\n`is_unsigned_number` is specialized for that type.\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/reference_mpfr_float.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:mpfr_ref mpfr_float_backend]\n\n   namespace boost{ namespace multiprecision{\n\n   template <unsigned Digits10>\n   class mpfr_float_backend;\n\n   typedef number<mpfr_float_backend<50> >    mpfr_float_50;\n   typedef number<mpfr_float_backend<100> >   mpfr_float_100;\n   typedef number<mpfr_float_backend<500> >   mpfr_float_500;\n   typedef number<mpfr_float_backend<1000> >  mpfr_float_1000;\n   typedef number<mpfr_float_backend<0> >     mpfr_float;\n\n   }} // namespaces\n\nClass template `mpfr_float_backend` fulfils all of the requirements for a [link boost_multiprecision.ref.backendconc Backend] type.\nIts members and non-member functions are deliberately not documented: these are considered implementation details that are subject\nto change.\n\nThe class takes a single template parameter - `Digits10` - which is the number of decimal digits precision the type\nshould support.  When this parameter is zero, then the precision can be set at runtime via `number::default_precision`\nand `number::precision`.  Note that this type does not in any way change the GMP or MPFR library's global state (for example\nit does not change the default precision of the mpfr_t data type), therefore you can safely mix this type with existing\ncode that uses GMP or MPFR, and also mix `mpfr_float_backend`s of differing precision.\n\nThe type of `number_category<cpp_int<Args...> >::type` is `std::integral_constant<int, number_kind_floating_point>`.\n\nMore information on this type can be found in the [link boost_multiprecision.tut.floats.mpfr_float tutorial].\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/reference_number.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:number number]\n\n[h4 Synopsis]\n\n   namespace boost{ namespace multiprecision{\n\n   enum expression_template_option { et_on = 1, et_off = 0 };\n\n   template <class Backend> struct expression_template_default\n   { static const expression_template_option value = et_on; };\n\n   template <class Backend, expression_template_option ExpressionTemplates = expression_template_default<Backend>::value>\n   class number\n   {\n   public:\n      typedef          Backend                          backend_type;\n      typedef typename component_type<self_type>::type  value_type;\n\n      static constexpr expression_template_option et = ExpressionTemplates;\n\n      number();\n      number(see-below);\n      number& operator=(see-below);\n      number& assign(see-below);\n\n      // Member operators\n      number& operator+=(const ``['see-below]``&);\n      number& operator-=(const ``['see-below]``&);\n      number& operator*=(const ``['see-below]``&);\n      number& operator/=(const ``['see-below]``&);\n      number& operator++();\n      number& operator--();\n      number  operator++(int);\n      number  operator--(int);\n\n      number& operator%=(const ``['see-below]``&);\n      number& operator&=(const ``['see-below]``&);\n      number& operator|=(const ``['see-below]``&);\n      number& operator^=(const ``['see-below]``&);\n      number& operator<<=(const ``['integer-type]``&);\n      number& operator>>=(const ``['integer-type]``&);\n\n      // Use in Boolean context:\n      operator ``['convertible-to-bool-type]``()const;\n      // swap:\n      void swap(number& other);\n      // Sign:\n      bool is_zero()const;\n      int sign()const;\n      // string conversion:\n      std::string str()const;\n      // Generic conversion mechanism\n      template <class T>\n      T convert_to()const;\n      template <class T>\n      explicit operator T ()const;\n      // precision control:\n      static unsigned default_precision();\n      static void default_precision(unsigned digits10);\n      unsigned precision()const;\n      void precision(unsigned digits10);\n      // Comparison:\n      int compare(const number<Backend>& o)const;\n      template <class V>\n      typename std::enable_if<std::is_convertible<V, number<Backend, ExpressionTemplates>::value >, int>::type\n         compare(const V& o)const;\n      // real and imaginary parts:\n      value_type real()const;\n      value_type imag()const;\n      template <class T>\n      void real(const T& val);\n      template <class T>\n      void imag(const T& val);\n      // Access to the underlying implementation:\n      Backend& backend();\n      const Backend& backend()const;\n   };\n\n   // Non member operators:\n   ``['unmentionable-expression-template-type]`` operator+(const ``['see-below]``&);\n   ``['unmentionable-expression-template-type]`` operator-(const ``['see-below]``&);\n   ``['unmentionable-expression-template-type]`` operator+(const ``['see-below]``&, const ``['see-below]``&);\n   ``['unmentionable-expression-template-type]`` operator-(const ``['see-below]``&, const ``['see-below]``&);\n   ``['unmentionable-expression-template-type]`` operator*(const ``['see-below]``&, const ``['see-below]``&);\n   ``['unmentionable-expression-template-type]`` operator/(const ``['see-below]``&, const ``['see-below]``&);\n   // Integer only operations:\n   ``['unmentionable-expression-template-type]`` operator%(const ``['see-below]``&, const ``['see-below]``&);\n   ``['unmentionable-expression-template-type]`` operator&(const ``['see-below]``&, const ``['see-below]``&);\n   ``['unmentionable-expression-template-type]`` operator|(const ``['see-below]``&, const ``['see-below]``&);\n   ``['unmentionable-expression-template-type]`` operator^(const ``['see-below]``&, const ``['see-below]``&);\n   ``['unmentionable-expression-template-type]`` operator<<(const ``['see-below]``&, const ``['integer-type]``&);\n   ``['unmentionable-expression-template-type]`` operator>>(const ``['see-below]``&, const ``['integer-type]``&);\n   // Comparison operators:\n   bool operator==(const ``['see-below]``&, const ``['see-below]``&);\n   bool operator!=(const ``['see-below]``&, const ``['see-below]``&);\n   bool operator< (const ``['see-below]``&, const ``['see-below]``&);\n   bool operator> (const ``['see-below]``&, const ``['see-below]``&);\n   bool operator<=(const ``['see-below]``&, const ``['see-below]``&);\n   bool operator>=(const ``['see-below]``&, const ``['see-below]``&);\n\n   // Swap:\n   template <class Backend, expression_template_option ExpressionTemplates>\n   void swap(number<Backend, ExpressionTemplates>& a, number<Backend, ExpressionTemplates>& b);\n\n   // iostream support:\n   template <class Backend, expression_template_option ExpressionTemplates>\n   std::ostream& operator << (std::ostream& os, const number<Backend, ExpressionTemplates>& r);\n   std::ostream& operator << (std::ostream& os, const ``['unmentionable-expression-template-type]``& r);\n   template <class Backend, expression_template_option ExpressionTemplates>\n   std::istream& operator >> (std::istream& is, number<Backend, ExpressionTemplates>& r);\n\n   // to_string support:\n   template <class Backend, expression_template_option ExpressionTemplates>\n   std::string to_string(const number<Backend, ExpressionTemplates>& val);\n\n   // Arithmetic with a higher precision result:\n   template <class ResultType, class Source1 class Source2>\n   ResultType& add(ResultType& result, const Source1& a, const Source2& b);\n   template <class ResultType, class Source1 class Source2>\n   ResultType& subtract(ResultType& result, const Source1& a, const Source2& b);\n   template <class ResultType, class Source1 class Source2>\n   ResultType& multiply(ResultType& result, const Source1& a, const Source2& b);\n\n   // min and max overloads:\n   ``['number]``                                    min    (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    max    (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n\n   // C99 Non-member function standard library support:\n   ``['unmentionable-expression-template-type]``    abs        (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    acos       (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    acosh      (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    asin       (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    asinh      (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    atan       (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    atan2      (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    atanh      (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    cbrt       (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    ceil       (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    copysign   (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    cos        (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    cosh       (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    erf        (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    erfc       (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    exp        (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    exp2       (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    expm1      (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    fabs       (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    fdim       (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    floor      (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    fma        (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    fmin       (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    fmax       (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    fmod       (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    frexp      (const ``['number-or-expression-template-type]``&, ``['integer-type]``*);\n   ``['unmentionable-expression-template-type]``    hypot      (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['integer-type]``                              ilogb      (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    ldexp      (const ``['number-or-expression-template-type]``&, ``['integer-type]``);\n   ``['number]``                                    lgamma     (const ``['number-or-expression-template-type]``&);\n   long long                                 llrint     (const ``['number-or-expression-template-type]``&);\n   long long                                 llround    (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    log        (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    log2       (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    log10      (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    log1p      (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    logb       (const ``['number-or-expression-template-type]``&);\n   long                                      lrint      (const ``['number-or-expression-template-type]``&);\n   long                                      lround     (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    modf       (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    nearbyint  (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    nextafter  (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    nexttoward (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    pow        (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    remainder  (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    remquo     (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&, int*);\n   ``['unmentionable-expression-template-type]``    rint       (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    round      (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    scalbn     (const ``['number-or-expression-template-type]``&, ``['integer-type]``);\n   ``['unmentionable-expression-template-type]``    scalbln    (const ``['number-or-expression-template-type]``&, ``['integer-type]``);\n   ``['unmentionable-expression-template-type]``    sin        (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    sinh       (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    sqrt       (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    tan        (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    tanh       (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    tgamma     (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    trunc      (const ``['number-or-expression-template-type]``&);\n\n   int                                       fpclassify (const ``['number-or-expression-template-type]``&);\n   bool                                      isfinite   (const ``['number-or-expression-template-type]``&);\n   bool                                      isinf      (const ``['number-or-expression-template-type]``&);\n   bool                                      isnan      (const ``['number-or-expression-template-type]``&);\n   bool                                      isnormal   (const ``['number-or-expression-template-type]``&);\n   bool                                      signbit    (const ``['number-or-expression-template-type]``&);\n\n   bool                                      isgreater  (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   bool                                      isgreaterequal(const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   bool                                      isless     (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   bool                                      islessequal(const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-typearea]``&);\n   bool                                      islessgreater(const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   bool                                      isunordered(const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   // Complex number functions:\n   ``['number<...>::value_type]``                   real  (const ``['number-or-expression-template-type]``&);\n   ``['number<...>::value_type]``                   imag  (const ``['number-or-expression-template-type]``&);\n   ``['number<...>::value_type]``                   abs   (const ``['number-or-expression-template-type]``&);\n   ``['number<...>::value_type]``                   arg   (const ``['number-or-expression-template-type]``&);\n   ``['number<...>::value_type]``                   norm  (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    conj  (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    proj  (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    polar (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   // Misc other common C library functions:\n   ``['unmentionable-expression-template-type]``    itrunc (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    ltrunc (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    lltrunc(const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    iround (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    changesign(const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    copysign(const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n\n   // Traits support:\n   template <class T>\n   struct component_type;\n   template <class T>\n   struct number_category;\n   template <class T>\n   struct is_number;\n   template <class T>\n   struct is_number_expression;\n\n   // Integer specific functions:\n   ``['unmentionable-expression-template-type]``    gcd(const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    lcm(const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    pow(const ``['number-or-expression-template-type]``&, unsigned);\n   ``['unmentionable-expression-template-type]``    powm(const ``['number-or-expression-template-type]``& b, const ``['number-or-expression-template-type]``& p, const ``['number-or-expression-template-type]``& m);\n   ``['unmentionable-expression-template-type]``    sqrt(const ``['number-or-expression-template-type]``&);\n   template <class Backend, expression_template_option ExpressionTemplates>\n   number<Backend, EXpressionTemplates>      sqrt(const ``['number-or-expression-template-type]``&, number<Backend, EXpressionTemplates>&);\n   template <class Backend, expression_template_option ExpressionTemplates>\n   void divide_qr(const ``['number-or-expression-template-type]``& x, const ``['number-or-expression-template-type]``& y,\n                  number<Backend, ExpressionTemplates>& q, number<Backend, ExpressionTemplates>& r);\n   template <class Integer>\n   Integer integer_modulus(const ``['number-or-expression-template-type]``& x, Integer val);\n   unsigned lsb(const ``['number-or-expression-template-type]``& x);\n   unsigned msb(const ``['number-or-expression-template-type]``& x);\n   template <class Backend, class ExpressionTemplates>\n   bool bit_test(const number<Backend, ExpressionTemplates>& val, unsigned index);\n   template <class Backend, class ExpressionTemplates>\n   number<Backend, ExpressionTemplates>& bit_set(number<Backend, ExpressionTemplates>& val, unsigned index);\n   template <class Backend, class ExpressionTemplates>\n   number<Backend, ExpressionTemplates>& bit_unset(number<Backend, ExpressionTemplates>& val, unsigned index);\n   template <class Backend, class ExpressionTemplates>\n   number<Backend, ExpressionTemplates>& bit_flip(number<Backend, ExpressionTemplates>& val, unsigned index);\n   template <class Engine>\n   bool miller_rabin_test(const ``['number-or-expression-template-type]``& n, unsigned trials, Engine& gen);\n   bool miller_rabin_test(const ``['number-or-expression-template-type]``& n, unsigned trials);\n\n   // Rational number support:\n   typename component_type<``['number-or-expression-template-type]``>::type numerator  (const ``['number-or-expression-template-type]``&);\n   typename component_type<``['number-or-expression-template-type]``>::type denominator(const ``['number-or-expression-template-type]``&);\n\n   }} // namespaces\n\n   namespace boost{ namespace math{\n\n   // Boost.Math interoperability functions:\n   int                                              fpclassify     (const ``['number-or-expression-template-type]``&, int);\n   bool                                             isfinite       (const ``['number-or-expression-template-type]``&, int);\n   bool                                             isnan          (const ``['number-or-expression-template-type]``&, int);\n   bool                                             isinf          (const ``['number-or-expression-template-type]``&, int);\n   bool                                             isnormal       (const ``['number-or-expression-template-type]``&, int);\n\n   }} // namespaces\n\n   // numeric_limits support:\n   namespace std{\n\n   template <class Backend, expression_template_option ExpressionTemplates>\n   struct numeric_limits<boost::multiprecision<Backend, ExpressionTemplates> >\n   {\n      /* Usual members here */\n   };\n\n   }\n\n[h4 Description]\n\n   enum expression_template_option { et_on = 1, et_off = 0 };\n\nThis enumerated type is used to specify whether expression templates are turned on (et_on) or turned off (et_off).\n\n   template <class Backend> struct expression_template_default\n   { static const expression_template_option value = et_on; };\n\nThis traits class specifies the default expression template option to be used with a particular Backend type.\nIt defaults to `et_on`.\n\n   template <class Backend, expression_template_option ExpressionTemplates = expression_template_default<Backend>::value>\n   class number;\n\nClass `number` has two template arguments:\n\n[variablelist\n[[Backend][The actual arithmetic back-end that does all the work.]]\n[[ExpressionTemplates][A Boolean value: when `et_on`, then expression templates are enabled, otherwise when set to `et_off` they are disabled.\n   The default for this parameter is computed via the traits class `expression_template_default` whose member `value` defaults to `et_on` unless\n   the traits class is specialized for a particular backend.]]\n]\n\n   number();\n   number(see-below);\n   number& operator=(see-below);\n   number& assign(see-below);\n\nType `number` is default constructible, and both copy constructible and assignable from:\n\n* Itself.\n* An expression template which is the result of one of the arithmetic operators.\n* Any __fundamental arithmetic type, as long as the result would not be lossy (for example float to integer conversion).\n* Any type that the Backend is implicitly constructible or assignable from.\n* An rvalue reference to another `number`.  Move-semantics are used for construction if the backend also\nsupports rvalue reference construction.  In the case of assignment, move semantics are always supported\nwhen the argument is an rvalue reference irrespective of the backend.\n* Any type in the same family, as long as no loss of precision is involved.  For example from `int128_t` to `int256_t`,\nor `cpp_dec_float_50` to `cpp_dec_float_100`.\n\nType `number` is explicitly constructible from:\n\n* Any type mentioned above.\n* A `std::string` or any type which is convertible to `const char*`.\n* Any arithmetic type (including those that would result in lossy conversions).\n* Any type in the same family, including those that result in loss of precision.\n* Any type that the Backend is explicitly constructible from.\n* Any pair of types for which a generic interconversion exists: that is from integer to integer, integer\nto rational, integer to float, rational to rational, rational to float, or float to float.\n\nThe assign member function is available for any type for which an explicit converting constructor exists.\nIt is intended to be used where a temporary generated from an explicit assignment would be expensive, for example:\n\n   mpfr_float_50    f50;\n   mpfr_float_100   f100;\n\n   f50 = static_cast<mpfr_float_50>(f100);  // explicit cast create a temporary\n   f50.assign(f100);                        // explicit call to assign create no temporary\n\nIn addition, if the type has multiple components (for example rational or complex number types), then there is a\ntwo argument constructor:\n\n   number(arg1, arg2);\n\nWhere the two args must either be arithmetic types, or types that are convertible to the two components of `this`.\nRvalue forwarding overloads are provided so either one or both arguments may be rvalue-references which will be moved\ninto the result, if the backend is able to make use of them.\n\nFinally, when the type has a variable precision, then there are constructors:\n\n   number(arg1, precision);\n   number(arg1, arg2, precision);\n\nWhere `precision` is an unsigned value, the 2 arg version is active for scalar types and/or copy-construction with specific precision, and the 3-arg version for complex types.\n\nLikewise `assign` has a 2-arg overloaded, with the second argument being the precision.\n\n      number& operator+=(const ``['see-below]``&);\n      number& operator-=(const ``['see-below]``&);\n      number& operator*=(const ``['see-below]``&);\n      number& operator/=(const ``['see-below]``&);\n      number& operator++();\n      number& operator--();\n      number  operator++(int);\n      number  operator--(int);\n      // Integer only operations:\n      number& operator%=(const ``['see-below]``&);\n      number& operator&=(const ``['see-below]``&);\n      number& operator|=(const ``['see-below]``&);\n      number& operator^=(const ``['see-below]``&);\n      number& operator<<=(const ``['integer-type]``&);\n      number& operator>>=(const ``['integer-type]``&);\n\nThese operators all take their usual arithmetic meanings.\n\nThe arguments to these operators is either:\n\n* Another `number<Backend, ExpressionTemplates>`.\n* An expression template derived from `number<Backend>`.\n* Any type implicitly convertible to `number<Backend, ExpressionTemplates>`, including some other instance of class `number`.\n\nFor the left and right shift operations, the argument must be a __fundamental\ninteger type with a positive value (negative values result in a `std::runtime_error` being thrown).\n\n      operator ``['convertible-to-bool-type]``()const;\n\nReturns an ['unmentionable-type] that is usable in Boolean contexts (this allows `number` to be used in any\nBoolean context - if statements, conditional statements, or as an argument to a logical operator - without\ntype `number` being convertible to type `bool`.\n\nThis operator also enables the use of `number` with any of the following operators:\n`!`, `||`, `&&` and `?:`.\n\n      void swap(number& other);\n\nSwaps `*this` with `other`.\n\n      bool is_zero()const;\n\nReturns `true` is `*this` is zero, otherwise `false`.\n\n      int sign()const;\n\nReturns a value less than zero if `*this` is negative, a value greater than zero if `*this` is positive, and zero\nif `*this` is zero.\n\n      std::string str(unsigned precision, bool scientific = true)const;\n\nReturns the number formatted as a string, with at least /precision/ digits, and in scientific format\nif /scientific/ is true.\n\n      template <class T>\n      T convert_to()const;\n\n      template <class T>\n      explicit operator T ()const;\n\nProvides a generic conversion mechanism to convert `*this` to type `T`.  Type `T` may be any arithmetic type.\nOptionally other types may also be supported by specific `Backend` types.\n\n\n      static unsigned default_precision();\n      static void default_precision(unsigned digits10);\n      unsigned precision()const;\n      void precision(unsigned digits10);\n\nThese functions are only available if the Backend template parameter supports runtime changes to precision.  They get and set\nthe default precision and the precision of `*this` respectively.\n\n      int compare(const number<Backend, ExpressionTemplates>& o)const;\n      template <class V>\n      typename std::enable_if<std::is_convertible<V, number<Backend, ExpressionTemplates>::value >, int>::type\n         compare(const V& other)const;\n\nReturns:\n\n* A value less that 0 for `*this < other`\n* A value greater that 0 for `*this > other`\n* Zero for `*this == other`\n\n      value_type real()const;\n      value_type imag()const;\n\nThese return the real and imaginary parts respectively.  If the number is not a complex type, then the imaginary part is always zero.\n\n      template <class T>\n      void real(const T& val);\n      template <class T>\n      void imag(const T& val);\n\nThese set the real and imaginary parts respectively of the number.  If the number is not a complex type, then setting the real part\nis equivalent to assignment, and attempting to set the imaginary part will result in a compile time error.\n\n      Backend& backend();\n      const Backend& backend()const;\n\nReturns the underlying back-end instance used by `*this`.\n\n[h4 Non-member operators]\n\n   // Non member operators:\n   ``['unmentionable-expression-template-type]`` operator+(const ``['see-below]``&);\n   ``['unmentionable-expression-template-type]`` operator-(const ``['see-below]``&);\n   ``['unmentionable-expression-template-type]`` operator+(const ``['see-below]``&, const ``['see-below]``&);\n   ``['unmentionable-expression-template-type]`` operator-(const ``['see-below]``&, const ``['see-below]``&);\n   ``['unmentionable-expression-template-type]`` operator*(const ``['see-below]``&, const ``['see-below]``&);\n   ``['unmentionable-expression-template-type]`` operator/(const ``['see-below]``&, const ``['see-below]``&);\n   // Integer only operations:\n   ``['unmentionable-expression-template-type]`` operator%(const ``['see-below]``&, const ``['see-below]``&);\n   ``['unmentionable-expression-template-type]`` operator&(const ``['see-below]``&, const ``['see-below]``&);\n   ``['unmentionable-expression-template-type]`` operator|(const ``['see-below]``&, const ``['see-below]``&);\n   ``['unmentionable-expression-template-type]`` operator^(const ``['see-below]``&, const ``['see-below]``&);\n   ``['unmentionable-expression-template-type]`` operator<<(const ``['see-below]``&, const ``['integer-type]``&);\n   ``['unmentionable-expression-template-type]`` operator>>(const ``['see-below]``&, const ``['integer-type]``&);\n   // Comparison operators:\n   bool operator==(const ``['see-below]``&, const ``['see-below]``&);\n   bool operator!=(const ``['see-below]``&, const ``['see-below]``&);\n   bool operator< (const ``['see-below]``&, const ``['see-below]``&);\n   bool operator> (const ``['see-below]``&, const ``['see-below]``&);\n   bool operator<=(const ``['see-below]``&, const ``['see-below]``&);\n   bool operator>=(const ``['see-below]``&, const ``['see-below]``&);\n\nThese operators all take their usual arithmetic meanings.\n\nThe arguments to these functions must contain at least one of the following:\n\n* A `number`.\n* An expression template type derived from `number`.\n* Any type for which `number` has an implicit constructor - for example a __fundamental arithmetic type.\n\nThe return type of these operators is either:\n\n* An ['unmentionable-type] expression template type when `ExpressionTemplates` is `true`.\n* Type `number<Backend, et_off>` when `ExpressionTemplates` is `false`.\n* Type `bool` if the operator is a comparison operator.\n\nFinally note that the second argument to the left and right shift operations must be a __fundamental integer type,\nand that the argument must be positive (negative arguments result in a `std::runtime_error` being thrown).\n\n[h4 swap]\n\n   template <class Backend, ExpressionTemplates>\n   void swap(number<Backend, ExpressionTemplates>& a, number<Backend, ExpressionTemplates>& b);\n\nSwaps `a` and `b`.\n\n[h4 Iostream Support]\n\n   template <class Backend, expression_template_option ExpressionTemplates>\n   std::ostream& operator << (std::ostream& os, const number<Backend, ExpressionTemplates>& r);\n   template <class Unspecified...>\n   std::ostream& operator << (std::ostream& os, const unmentionable-expression-template& r);\n   template <class Backend, expression_template_option ExpressionTemplates>\n   inline std::istream& operator >> (std::istream& is, number<Backend, ExpressionTemplates>& r)\n\nThese operators provided formatted input-output operations on `number` types, and expression templates derived from them.\n\nIt's down to the back-end type to actually implement string conversion.  However, the back-ends provided with\nthis library support all of the iostream formatting flags, field width and precision settings.\n\nIn addition, the C++11 `to_string` function is provided for use in generic code:\n\n      template <class Backend, expression_template_option ExpressionTemplates>\n      std::string to_string(const number<Backend, ExpressionTemplates>& val);\n\nThis a string with 6 digits of accuracy past the decimal point, matching the behavior of `std::to_string`.\nNote that this is a /fixed precision/ representation, and hence monstrous strings can be returned.\n\n[h4 Arithmetic with a higher precision result]\n\n   template <class ResultType, class Source1 class Source2>\n   ResultType& add(ResultType& result, const Source1& a, const Source2& b);\n\n   template <class ResultType, class Source1 class Source2>\n   ResultType& subtract(ResultType& result, const Source1& a, const Source2& b);\n\n   template <class ResultType, class Source1 class Source2>\n   ResultType& multiply(ResultType& result, const Source1& a, const Source2& b);\n\nThese functions apply the named operator to the arguments ['a] and ['b] and store the\nresult in ['result], returning ['result].  In all cases they behave \"as if\"\narguments ['a] and ['b] were first promoted to type `ResultType` before applying the\noperator, though particular backends may well avoid that step by way of an optimization.\n\nThe type `ResultType` must be an instance of class `number`, and the types `Source1` and `Source2`\nmay be either instances of class `number` or native integer types.  The latter is an optimization\nthat allows arithmetic to be performed on native integer types producing an extended precision result.\n\n[h4 Non-member standard library function support]\n\n   ``['unmentionable-expression-template-type]``    abs        (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    acos       (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    acosh      (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    asin       (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    asinh      (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    atan       (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    atan2      (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    atanh      (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    cbrt       (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    ceil       (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    copysign   (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    cos        (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    cosh       (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    erf        (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    erfc       (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    exp        (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    exp2       (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    expm1      (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    fabs       (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    fdim       (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    floor      (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    fma        (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    fmin       (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    fmax       (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    fmod       (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    frexp      (const ``['number-or-expression-template-type]``&, ``['integer-type]``*);\n   ``['unmentionable-expression-template-type]``    hypot      (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['integer-type]``                              ilogb      (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    ldexp      (const ``['number-or-expression-template-type]``&, ``['integer-type]``);\n   ``['number]``                                    lgamma     (const ``['number-or-expression-template-type]``&);\n   long long                                 llrint     (const ``['number-or-expression-template-type]``&);\n   long long                                 llround    (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    log        (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    log2       (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    log10      (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    log1p      (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    logb       (const ``['number-or-expression-template-type]``&);\n   long                                      lrint      (const ``['number-or-expression-template-type]``&);\n   long                                      lround     (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    modf       (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    nearbyint  (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    nextafter  (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    nexttoward (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    pow        (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    remainder  (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    remquo     (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&, int*);\n   ``['unmentionable-expression-template-type]``    rint       (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    round      (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    scalbn     (const ``['number-or-expression-template-type]``&, ``['integer-type]``);\n   ``['unmentionable-expression-template-type]``    scalbln    (const ``['number-or-expression-template-type]``&, ``['integer-type]``);\n   ``['unmentionable-expression-template-type]``    sin        (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    sinh       (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    sqrt       (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    tan        (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    tanh       (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    tgamma     (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    trunc      (const ``['number-or-expression-template-type]``&);\n\n   int                                       fpclassify (const ``['number-or-expression-template-type]``&);\n   bool                                      isfinite   (const ``['number-or-expression-template-type]``&);\n   bool                                      isinf      (const ``['number-or-expression-template-type]``&);\n   bool                                      isnan      (const ``['number-or-expression-template-type]``&);\n   bool                                      isnormal   (const ``['number-or-expression-template-type]``&);\n   bool                                      signbit    (const ``['number-or-expression-template-type]``&);\n\n   bool                                      isgreater  (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   bool                                      isgreaterequal(const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   bool                                      isless     (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   bool                                      islessequal(const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   bool                                      islessgreater(const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n   bool                                      isunordered(const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n\nThese functions all behave exactly as their standard library C++11 counterparts do: their argument is either an instance of `number` or\nan expression template derived from it; If the argument is of type `number<Backend, et_off>` then that is also the return type,\notherwise the return type is an expression template unless otherwise stated.\n\nThe integer type arguments to `ldexp`, `frexp`, `scalbn` and `ilogb` may be either type `int`, or the actual\ntype of the exponent of the number type.\n\nComplex number types support the following functions:\n\n   // Complex number functions:\n   ``['number<...>::value_type]``                   real  (const ``['number-or-expression-template-type]``&);\n   ``['number<...>::value_type]``                   imag  (const ``['number-or-expression-template-type]``&);\n   ``['number<...>::value_type]``                   abs   (const ``['number-or-expression-template-type]``&);\n   ``['number<...>::value_type]``                   arg   (const ``['number-or-expression-template-type]``&);\n   ``['number<...>::value_type]``                   norm  (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    conj  (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    proj  (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    polar (const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n\nIn addition the functions `real`, `imag`, `arg`, `norm`, `conj` and `proj` are overloaded for scalar (ie non-complex) types in the same\nmanner as `<complex>` and treat the argument as a value whose imaginary part is zero.\n\nThere are also some functions implemented for compatibility with the Boost.Math functions of the same name:\n\n   ``['unmentionable-expression-template-type]``    itrunc (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    ltrunc (const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    lltrunc(const ``['number-or-expression-template-type]``&);\n   ``['unmentionable-expression-template-type]``    iround (const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    changesign(const ``['number-or-expression-template-type]``&);\n   ``['number]``                                    copysign(const ``['number-or-expression-template-type]``&, const ``['number-or-expression-template-type]``&);\n\nAll these functions are normally implemented by the Backend type.  However, default versions are provided for Backend types that\ndon't have native support for these functions.  Please note however, that this default support requires the precision of the type\nto be a compile time constant - this means for example that the [gmp] MPF Backend will not work with these functions when that type is\nused at variable precision.\n\nAlso note that with the exception of `abs` that these functions can only be used with floating-point Backend types (if any other types\nsuch as fixed precision or complex types are added to the library later, then these functions may be extended to support those number types).\n\nThe precision of these functions is generally determined by the backend implementation.  For example the precision\nof these functions when used with __mpfr_float_backend is determined entirely by [mpfr].  When these functions use our own\nimplementations, the accuracy of the transcendental functions is generally a few epsilon.  Note however, that the trigonometrical\nfunctions incur the usual accuracy loss when reducing arguments by large multiples of [pi].  Also note that both __mpf_float\nand __cpp_dec_float have a number of guard digits beyond their stated precision, so the error rates listed for these\nare in some sense artificially low.\n\nThe following table shows the error rates we observe for these functions with various backend types, functions not listed\nhere are exact (tested on Win32 with VC++10, MPFR-3.0.0, MPIR-2.1.1):\n\n[table\n[[Function][mpfr_float_50][mpf_float_50][cpp_dec_float_50]]\n[[sqrt][1eps][0eps][0eps]]\n[[exp][1eps][0eps][0eps]]\n[[log][1eps][0eps][0eps]]\n[[log10][1eps][0eps][0eps]]\n[[cos][700eps][0eps][0eps]]\n[[sin][1eps][0eps][0eps]]\n[[tan][0eps][0eps][0eps]]\n[[acos][0eps][0eps][0eps]]\n[[asin][0eps][0eps][0eps]]\n[[atan][1eps][0eps][0eps]]\n[[cosh][1045eps[footnote It's likely that the inherent error in the input values to our test cases are to blame here.]][0eps][0eps]]\n[[sinh][2eps][0eps][0eps]]\n[[tanh][1eps][0eps][0eps]]\n[[pow][0eps][4eps][3eps]]\n[[atan2][1eps][0eps][0eps]]\n]\n[h4 Traits Class Support]\n\n   template <class T>\n   struct component_type;\n\nIf this is a type with multiple components (for example rational or complex types), then this trait has a single member\n`type` that is the type of those components.\n\n   template <class T>\n   struct number_category;\n\nA traits class that inherits from `std::integral_constant<int, N>` where `N` is one of the enumerated values `number_kind_integer`, `number_kind_floating_point`,\n`number_kind_rational`, `number_kind_fixed_point`, or `number_kind_unknown`.  This traits class is specialized for any type that has\n`std::numeric_limits` support as well as for classes in this library: which means it can be used for generic code that must work\nwith __fundamental arithmetic types as well as multiprecision ones.\n\n   template <class T>\n   struct is_number;\n\nA traits class that inherits from `std::integral_constant<bool, true>` if T is an instance of `number<>`, otherwise from `std::integral_constant<bool, false>`.\n\n   template <class T>\n   struct is_number_expression;\n\nA traits class that inherits from `std::integral_constant<bool, true>` if T is an expression template type derived from `number<>`, otherwise from `std::integral_constant<bool, false>`.\n\n\n[h4 Integer functions]\n\nIn addition to functioning with types from this library, these functions are also overloaded for __fundamental integer\ntypes if you include `<boost/multiprecision/integer.hpp>`.  Further, when used with fixed precision types (whether\n__fundamental integers or multiprecision ones), the functions will promote to a wider type internally when the algorithm\nrequires it.  Versions overloaded for __fundamental integer types return that integer type rather than an expression\ntemplate.\n\n   ``['unmentionable-expression-template-type]``    gcd(const ``['number-or-expression-template-type]``& a, const ``['number-or-expression-template-type]``& b);\n\nReturns the largest integer `x` that divides both `a` and `b`.\n\n   ``['unmentionable-expression-template-type]``    lcm(const ``['number-or-expression-template-type]``& a, const ``['number-or-expression-template-type]``& b);\n\nReturns the smallest integer `x` that is divisible by both `a` and `b`.\n\n   ``['unmentionable-expression-template-type]``    pow(const ``['number-or-expression-template-type]``& b, unsigned p);\n\nReturns ['b[super p]] as an expression template.  Note that this function should be used with extreme care as the result can grow so\nlarge as to take \"effectively forever\" to compute, or else simply run the host machine out of memory.  This is the one function in\nthis category that is not overloaded for __fundamental integer types, further, it's probably not a good idea to use it with\nfixed precision `cpp_int`'s either.\n\n   ``['unmentionable-expression-template-type]``    powm(const ``['number-or-expression-template-type]``& b, const ``['number-or-expression-template-type]``& p, const ``['number-or-expression-template-type]``& m);\n\nReturns ['b[super p] mod m] as an expression template.  Fixed precision types are promoted internally to ensure accuracy.\n\n   ``['unmentionable-expression-template-type]``    sqrt(const ``['number-or-expression-template-type]``& a);\n\nReturns the largest integer `x` such that `x * x < a`.\n\n   template <class Backend, expression_template_option ExpressionTemplates>\n   number<Backend, EXpressionTemplates>      sqrt(const ``['number-or-expression-template-type]``& a, number<Backend, EXpressionTemplates>& r);\n\nReturns the largest integer `x` such that `x * x < a`, and sets the remainder `r` such that `r = a - x * x`.\n\n   template <class Backend, expression_template_option ExpressionTemplates>\n   void divide_qr(const ``['number-or-expression-template-type]``& x, const ``['number-or-expression-template-type]``& y,\n                  number<Backend, ExpressionTemplates>& q, number<Backend, ExpressionTemplates>& r);\n\nDivides x by y and returns both the quotient and remainder.  After the call `q = x / y` and `r = x % y`.\n\n   template <class Integer>\n   Integer integer_modulus(const ``['number-or-expression-template-type]``& x, Integer val);\n\nReturns the absolute value of `x % val`.\n\n   unsigned lsb(const ``['number-or-expression-template-type]``& x);\n\nReturns the (zero-based) index of the least significant bit that is set to 1.\n\nThrows a `std::range_error` if the argument is <= 0.\n\n   unsigned msb(const ``['number-or-expression-template-type]``& x);\n\nReturns the (zero-based) index of the most significant bit.\n\nThrows a `std::range_error` if the argument is <= 0.\n\n   template <class Backend, class ExpressionTemplates>\n   bool bit_test(const number<Backend, ExpressionTemplates>& val, unsigned index);\n\nReturns `true` if the bit at /index/ in /val/ is set.\n\n   template <class Backend, class ExpressionTemplates>\n   number<Backend, ExpressionTemplates>& bit_set(number<Backend, ExpressionTemplates>& val, unsigned index);\n\nSets the bit at /index/ in /val/, and returns /val/.\n\n   template <class Backend, class ExpressionTemplates>\n   number<Backend, ExpressionTemplates>& bit_unset(number<Backend, ExpressionTemplates>& val, unsigned index);\n\nUnsets the bit at /index/ in /val/, and returns /val/.\n\n   template <class Backend, class ExpressionTemplates>\n   number<Backend, ExpressionTemplates>& bit_flip(number<Backend, ExpressionTemplates>& val, unsigned index);\n\nFlips the bit at /index/ in /val/, and returns /val/.\n\n   template <class Engine>\n   bool miller_rabin_test(const ``['number-or-expression-template-type]``& n, unsigned trials, Engine& gen);\n   bool miller_rabin_test(const ``['number-or-expression-template-type]``& n, unsigned trials);\n\nTests to see if the number /n/ is probably prime - the test excludes the vast majority of composite numbers\nby excluding small prime factors and performing a single Fermat test.  Then performs /trials/ Miller-Rabin\ntests.  Returns `false` if /n/ is definitely composite, or `true` if /n/ is probably prime with the\nprobability of it being composite less than 0.25^trials.  Fixed precision types are promoted internally\nto ensure accuracy.\n\n[h4 Rational Number Functions]\n\n   typename component_type<``['number-or-expression-template-type]``>::type numerator  (const ``['number-or-expression-template-type]``&);\n   typename component_type<``['number-or-expression-template-type]``>::type denominator(const ``['number-or-expression-template-type]``&);\n\nThese functions return the numerator and denominator of a rational number respectively.\n\n[h4 Boost.Math Interoperability Support]\n\n   namespace boost{ namespace math{\n\n   int  fpclassify     (const ``['number-or-expression-template-type]``&, int);\n   bool isfinite       (const ``['number-or-expression-template-type]``&, int);\n   bool isnan          (const ``['number-or-expression-template-type]``&, int);\n   bool isinf          (const ``['number-or-expression-template-type]``&, int);\n   bool isnormal       (const ``['number-or-expression-template-type]``&, int);\n\n   }} // namespaces\n\nThese floating-point classification functions behave exactly as their Boost.Math equivalents.\n\nOther Boost.Math functions and templates may also be\nspecialized or overloaded to ensure interoperability.\n\n[h4 std::numeric_limits support]\n\n   namespace std{\n\n   template <class Backend, ExpressionTemplates>\n   struct numeric_limits<boost::multiprecision<Backend, ExpressionTemplates> >\n   {\n      /* Usual members here */\n   };\n\n   }\n\nClass template `std::numeric_limits` is specialized for all instantiations of `number` whose precision is known at compile time, plus those\ntypes whose precision is unlimited (though it is much less useful in those cases).  It is not specialized for types\nwhose precision can vary at compile time (such as `mpf_float`).\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/reference_tom_int.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:tom_int_ref tom_int]\n\n   namespace boost{ namespace multiprecision{\n\n   class tommath_int;\n\n   typedef number<tommath_int >         tom_int;\n\n   }} // namespaces\n\nClass template `tommath_int` fulfils all of the requirements for a [link boost_multiprecision.ref.backendconc Backend] type.\nIts members and non-member functions are deliberately not documented: these are considered implementation details that are subject\nto change.\n\nThe type of `number_category<cpp_int<Args...> >::type` is `std::integral_constant<int, number_kind_integer>`.\n\nMore information on this type can be found in the [link boost_multiprecision.tut.ints.tom_int tutorial].\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:tut Tutorial]\n\nIn order to use this library you need to make two choices:\n\n* What kind of number do I want ([link boost_multiprecision.tut.ints integer],\n[link boost_multiprecision.tut.floats floating-point], [link boost_multiprecision.tut.rational rational], or [link boost_multiprecision.tut.complex complex]).\n* Which back-end do I want to perform the actual arithmetic (Boost-supplied, GMP, MPFR, MPC, Tommath etc)?\n\n[include tutorial_integer.qbk]\n[include tutorial_floats.qbk]\n[include tutorial_interval_mpfi.qbk]\n[include tutorial_complex.qbk]\n[include tutorial_rational.qbk]\n[include tutorial_misc_backends.qbk]\n[include tutorial_conversions.qbk]\n[include tutorial_random.qbk]\n[include tutorial_primality.qbk]\n[include tutorial_constexpr.qbk]\n[include tutorial_import_export.qbk]\n[include tutorial_rounding.qbk]\n[include tutorial_mixed_precision.qbk]\n[include tutorial_variable_precision.qbk]\n[include tutorial_integer_ops.qbk]\n[include tutorial_serialization.qbk]\n[include tutorial_numeric_limits.qbk]\n[include tutorial_io.qbk]\n[include tutorial_hash.qbk]\n[include tutorial_eigen.qbk]\n[include tutorial_new_backend.qbk]\n\n[endsect] [/section:tut Tutorial]\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_boost_rational.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:tommath_rational tommath_rational]\n\n`#include <boost/multiprecision/tommath.hpp>`\n\n   namespace boost{ namespace multiprecision{\n\n   typedef rational_adpater<tommath_int>        tommath_rational;\n   typedef number<tommath_rational >         tom_rational;\n\n   }} // namespaces\n\nThe `tommath_rational` back-end is used via the typedef `boost::multiprecision::tom_rational`.  It acts as a thin wrapper around\n`boost::rational<tom_int>`\nto provide a rational number type that is a drop-in replacement for the native C++ number types, but with unlimited precision.\n\nThe advantage of using this type rather than `boost::rational<tom_int>` directly, is that it is expression-template enabled,\ngreatly reducing the number of temporaries created in complex expressions.\n\nThere are also non-member functions:\n\n   tom_int numerator(const tom_rational&);\n   tom_int denominator(const tom_rational&);\n\nwhich return the numerator and denominator of the number.\n\nThings you should know when using this type:\n\n* Default constructed `tom_rational`s have the value zero (this the inherited Boost.Rational behavior).\n* Division by zero results in a `std::overflow_error` being thrown.\n* Conversion from a string results in a `std::runtime_error` being thrown if the string can not be\ninterpreted as a valid rational number.\n* No changes are made to [tommath]'s global state, so this type can safely coexist with other [tommath] code.\n* Performance of this type has been found to be pretty poor - this need further investigation - but it appears that Boost.Rational\nneeds some improvement in this area.\n\n[h5 Example:]\n\n[mp_rat_eg]\n\n[endsect] [/section:tommath_rational tommath_rational]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_complex.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:complex Complex Number Types]\n\nThe following backends provide complex number arithmetic:\n\n[table\n[[Backend Type][Header][Radix][Dependencies][Pros][Cons]]\n[[`cpp_complex`][boost/multiprecision/cpp_complex.hpp][2][None][An all C++ Boost-licensed implementation.][Slower than [mpc].]]\n[[`mpc`][boost/multiprecision/mpc.hpp][2][[mpc]][Very fast and efficient back-end.][Dependency on LGLP-licensed [MPC] library.]]\n[[`complex128`][boost/multiprecision/complex128.hpp][2][`__float128` and libquadmath][Very fast and efficient number type.][128-bit precision only, and restricted to GCC.]]\n[[`complex_adaptor`][boost/multiprecision/complex_adaptor.hpp][-][none][Can convert any backend type into a complex number backend.][Not a number in its own right, and hard to use as a result.]]\n]\n\n[include tutorial_cpp_complex.qbk]\n[include tutorial_mpc_complex.qbk]\n[include tutorial_float128_complex.qbk]\n[include tutorial_complex_adaptor.qbk]\n\n[endsect] [/section:complex Complex Number Types]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_complex_adaptor.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:complex_adaptor complex_adaptor]\n\n   namespace boost{ namespace multiprecision{\n\n   template <class Backend>\n   struct complex_adaptor;\n\n   }}\n\nClass template `complex_adaptor` is designed to sit inbetween class `number` and an actual floating point backend,\nin order to create a new complex number type.\n\nIt is the means by which we implement __cpp_complex and __complex128.\n\n[endsect] [/section:complex_adaptor complex_adaptor]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_constexpr.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:lits Literal Types and `constexpr` Support]\n\nThere are two kinds of `constexpr` support in this library:\n\n* The more basic version requires only C++11 and allow the construction of some number types as literals.\n* The more advanced support permits constexpr arithmetic and requires at least C++14 \nconstexpr support, and for many operations C++2a support\n\n[h4 Declaring numeric literals]\n\nThere are two backend types which are literals:\n\n* __float128__ (which requires GCC), and\n* Instantiations of `cpp_int_backend` where the Allocator parameter is type `void`.\nIn addition, prior to C++14 the Checked parameter must be `boost::multiprecision::unchecked`.\n\nFor example:\n\n   using namespace boost::multiprecision;\n\n   constexpr float128            f = 0.1Q   // OK, float128's are always literals in C++11\n\n   constexpr int128_t            i = 0;     // OK, fixed precision int128_t has no allocator.\n   constexpr uint1024_t          j = 0xFFFFFFFF00000000uLL;  // OK, fixed precision uint1024_t has no allocator.\n\n   constexpr checked_uint128_t   k = 1; // OK from C++14 and later, not supported for C++11.\n   constexpr checked_uint128_t   k = -1; // Error, as this would normally lead to a runtime failure (exception).\n   constexpr cpp_int             l = 2;  // Error, type is not a literal as it performs memory management.\n\nThere is also support for user defined-literals with __cpp_int - these are limited to unchecked, fixed precision `cpp_int`'s\nwhich are specified in hexadecimal notation.  The suffixes supported are:\n\n[table\n[[Suffix][Meaning]]\n[[_cppi][Specifies a value of type: `number<cpp_int_backend<N,N,signed_magnitude,unchecked,void> >`, where N is chosen\nto contain just enough digits to hold the number specified.]]\n[[_cppui][Specifies a value of type: `number<cpp_int_backend<N,N,unsigned_magnitude,unchecked,void> >`, where N is chosen\nto contain just enough digits to hold the number specified.]]\n[[_cppi['N]][Specifies a value of type `number<cpp_int_backend<N,N,signed_magnitude,unchecked,void> >`.]]\n[[_cppui['N]][Specifies a value of type `number<cpp_int_backend<N,N,signed_magnitude,unchecked,void> >`.]]\n]\n\nIn each case, use of these suffixes with hexadecimal values produces a `constexpr` result.\n\nExamples:\n\n   // Any use of user defined literals requires that we import the literal-operators into current scope first:\n   using namespace boost::multiprecision::literals;\n   //\n   // To keep things simple in the example, we'll make our types used visible to this scope as well:\n   using namespace boost::multiprecision;\n   //\n   // The value zero as a number<cpp_int_backend<4,4,signed_magnitude,unchecked,void> >:\n   constexpr auto a = 0x0_cppi;\n   // The type of each constant has 4 bits per hexadecimal digit,\n   // so this is of type uint256_t (ie number<cpp_int_backend<256,256,unsigned_magnitude,unchecked,void> >):\n   constexpr auto b = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_cppui;\n   //\n   // Smaller values can be assigned to larger values:\n   int256_t c = 0x1234_cppi; // OK\n   //\n   // However, this only works in constexpr contexts from C++14 onwards:\n   constexpr int256_t d = 0x1_cppi; // Compiler error in C++11, requires C++14\n   //\n   // Constants can be padded out with leading zeros to generate wider types:\n   constexpr uint256_t e = 0x0000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFF_cppui; // OK\n   //\n   // However, specific-width types are best produced with specific-width suffixes,\n   // ones supported by default are `_cpp[u]i128`, `_cpp[u]i256`, `_cpp[u]i512`, `_cpp[u]i1024`.\n   //\n   constexpr int128_t f = 0x1234_cppi128; // OK, always produces an int128_t as the result.\n   constexpr uint1024_t g = 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccc_cppui1024; // OK,\n   //  always produces an uint1024_t as the result.\n   //\n   // If other specific-width types are required, then there is a macro for generating the operators for these.\n   // The macro can be used at namespace scope only:\n   //\n   BOOST_MP_DEFINE_SIZED_CPP_INT_LITERAL(2048);\n   //\n   // Now we can create 2048-bit literals as well:\n   constexpr auto h = 0xff_cppi2048; // h is of type number<cpp_int_backend<2048,2048,signed_magnitude,unchecked,void> >\n   //\n   // Finally, negative values are handled via the unary minus operator:\n   //\n   constexpr int1024_t i = -0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_cppui1024;\n   //\n   // Which means this also works:\n   constexpr int1024_t j = -g;   // OK: unary minus operator is constexpr.\n\n[h4 constexpr arithmetic]\n\nThe front end of the library is all `constexpr` from C++14 and later.  Currently there are only two\nbackend types that are `constexpr` aware: __float128 and __cpp_int.  More backends will follow at a later date.\n\nProvided the compiler is GCC, type __float128__ support `constexpr` operations on all arithmetic operations from C++14, comparisons,\n`abs`, `fabs`, `fpclassify`, `isnan`, `isinf`, `isfinite` and `isnormal` are also fully supported, but the transcendental functions are not.\n\nThe __cpp_int types support constexpr arithmetic, provided it is a fixed precision type with no allocator.  It may also\nbe a checked integer: in which case a compiler error will be generated on overflow or undefined behaviour.  In addition\nthe free functions `abs`, `swap`, `multiply`, `add`, `subtract`, `divide_qr`, `integer_modulus`, `powm`, `lsb`, `msb`, \n`bit_test`, `bit_set`, `bit_unset`, `bit_flip`, `sqrt`, `gcd`, `lcm` are all supported.  Use of __cpp_int in this way\nrequires either a C++2a compiler (one which supports `std::is_constant_evaluated()` - currently only gcc-9 or clang-9 or later), \nor GCC-6 or later in C++14 mode.\nCompilers other than GCC and without `std::is_constant_evaluated()` will support a very limited set of operations:\nexpect to hit roadblocks rather easily.\n\nSee __compiler_support for __is_constant_evaluated;\n\nFor example given:\n\n[constexpr_circle]\n\nWe can now calculate areas and circumferences, using all compile-time `constexpr` arithmetic:\n\n[constexpr_circle_usage]\n\nNote that these make use of the numeric constants from the __math_constants library, which also happen to be `constexpr`. \nThese usually have the full precision of the floating-point type, here 128-bit, about 36 decimal digits.\n\n[h5:hermite_poly_coeffics Calculating Hermite Polynomial coefficients at compile time]\n\nFor a more interesting example, in [@../../example/constexpr_float_arithmetic_examples.cpp constexpr_float_arithmetic_examples.cpp]\nwe define a simple class for `constexpr` polynomial arithmetic:\n\n   template <class T, unsigned Order>\n   struct const_polynomial;\n\nGiven this, we can use recurrence relations to calculate the coefficients for various orthogonal\npolynomials - in the example we use the Hermite polynomials. Only the constructor does any work - \nit uses the recurrence relations to calculate the coefficient array:\n\n[hermite_example]\n\nNow we just need to define ['H[sub 0]] and ['H[sub 1]] as termination conditions for the recurrence:\n\n[hermite_example2]\n\nWe can now declare ['H[sub 9]] as a `constexpr` object, access the coefficients, and evaluate\nat an abscissa value, all at compile-time using `constexpr` arithmetic:\n\n[hermite_example3]\n\nSee [@../../example/constexpr_float_arithmetic_examples.cpp constexpr_float_arithmetic_examples.cpp] for working code.\n\nAlso since the coefficients to the Hermite polynomials are integers, we can also generate the Hermite\ncoefficients using (fixed precision) `cpp_int`s: see [@../../test/constexpr_test_cpp_int_6.cpp constexpr_test_cpp_int_6.cpp].\n\n[h5:factorial_constexpr `constexpr` Factorials]\n\nWe can also generate integer factorials in [@../../test/constexpr_test_cpp_int_5.cpp constexpr_test_cpp_int_5.cpp] like so:\n\n[factorial_decl]\n\nand validate the result:\n \n  constexpr uint1024_t f1 = factorial(uint1024_t(31)); // Factorial 31!\n  static_assert(f1 == 0x1956ad0aae33a4560c5cd2c000000_cppi); // Expected result as an Boost.Multiprecision integer literal. \n  \n[h5:random_constexpr Random `constexpr` values] \n\nAnother example in [@../../test/constexpr_test_cpp_int_7.cpp constexpr_test_cpp_int_7.cpp] generates\na fresh multiprecision random number each time the file is compiled.  It includes an C++ template implementation of the \n[@https://en.wikipedia.org/wiki/KISS_(algorithm) KISS random number algorithm by George Marsaglia] for `cpp_int` integers.\n\n[random_constexpr_cppint]\n\nSee also the __random section.\n\n[endsect] [/section:lits Literal Types and `constexpr` Support]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_conversions.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:conversions Constructing and Interconverting Between Number Types]\n\nAll of the number types that are based on `number` have certain conversion rules in common.\nIn particular:\n\n* Any number type can be constructed (or assigned) from any __fundamental arithmetic type, as long\n  as the conversion isn't lossy (for example float to int conversion):\n\n   cpp_dec_float_50 df(0.5);   // OK construction from double\n   cpp_int          i(450);    // OK constructs from signed int\n   cpp_int          j = 3.14;  // Error, lossy conversion.\n\n* A number can be explicitly constructed from an arithmetic type, even when the conversion is lossy:\n\n   cpp_int          i(3.14);       // OK explicit conversion\n   i = static_cast<cpp_int>(3.14)  // OK explicit conversion\n   i.assign(3.14);                 // OK, explicit assign and avoid a temporary from the cast above\n   i = 3.14;                       // Error, no implicit assignment operator for lossy conversion.\n   cpp_int          j = 3.14;      // Error, no implicit constructor for lossy conversion.\n\n* A `number` can be converted to any __fundamental type, via the `convert_to` member function:\n\n   mpz_int z(2);\n   int i = z.convert_to<int>(); // sets i to 2\n\n* Conversions to rational numbers from floating-point ones are always allowed, and are exact and implicit\nas long as the rational number uses an unbounded integer type.  Please be aware that constructing a rational\nnumber from an extended precision floating-point type with a large exponent range can effectively run the system\nout of memory, as in the extreme case ['2[super max_exponent] / CHAR_BITS] bytes of storage may be required.  This\ndoes not represent a problem for __fundamental floating-point types however, as the exponent range for these is rather\nlimited.\n\n* Conversions to floating-point numbers from rational ones are rounded to nearest (less than 0.5 __ULP error)\nas long as the floating-point number is binary, and the integer type used by the rational number is unbounded.\n\nAdditional conversions may be supported by particular backends.\n\n* A `number` can be converted to any __fundamental type, via an explicit conversion operator:\nthis functionality is only available on compilers supporting C++11's explicit conversion syntax.\n\n   mpz_int z(2);\n   int i = z;                     // Error, implicit conversion not allowed.\n   int j = static_cast<int>(z);   // OK explicit conversion.\n\n* Any number type can be ['explicitly] constructed (or assigned) from a `const char*` or a `std::string`:\n\n   // pi to 50 places from a string:\n   cpp_dec_float_50 df(\"3.14159265358979323846264338327950288419716939937510\");\n   // Integer type will automatically detect \"0x\" and \"0\" prefixes and parse the string accordingly:\n   cpp_int          i(\"0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000\");\n   // Invalid input always results in a std::runtime_error being thrown:\n   i = static_cast<cpp_int>(\"3.14\");\n   // implicit conversions from strings are not allowed:\n   i = \"23\"; // Error, no assignment operator for implicit conversion from string\n   // assign member function, avoids having to create a temporary via a static_cast:\n   i.assign(\"23\");  // OK\n\n* Any number type will interoperate with the __fundamental types in arithmetic expressions as long as the conversions\nare not lossy:\n\n   // pi to 50 places from a string:\n   cpp_dec_float_50 df = \"3.14159265358979323846264338327950288419716939937510\";\n   // Multiply by 2 - using an integer literal here is usually more efficient\n   // than constructing a temporary:\n   df *= 2;\n\n   // You can't mix integer types with floats though:\n   cpp_int i = 2;\n   i *= 3.14;  // Error, no *= operator will be found.\n\n* Any number type can be streamed to and from the C++ iostreams:\n\n   cpp_dec_float_50 df = \"3.14159265358979323846264338327950288419716939937510\";\n   // Now print at full precision:\n   std::cout << std::setprecision(std::numeric_limits<cpp_dec_float_50>::max_digits10)\n      << df << std::endl\n   cpp_int i = 1;\n   i <<= 256;\n   // Now print in hex format with prefix:\n   std::cout << std::hex << std::showbase << i << std::endl;\n\n* Interconversions between number types of the same family are allowed and are implicit conversions if no\nloss of precision is involved, and explicit if it is:\n\n   int128_t     i128 = 0;\n   int266_t     i256 = i128;  // OK implicit widening conversion\n   i128_t            = i256;  // Error, no assignment operator found, narrowing conversion is explicit.\n   i128_t            = static_cast<int128_t>(i256); // OK, explicit narrowing conversion.\n\n   mpz_int      z    = 0;\n   mpf_float    f    = z;    // OK, GMP handles this conversion natively, and it's not lossy and therefore implicit.\n\n   mpf_float_50 f50  = 2;\n   f                 = f50;  // OK, conversion from fixed to variable precision, f will have 50 digits precision.\n   f50               = f;    // Error, conversion from variable to fixed precision is potentially lossy, explicit cast required.\n\n* Some interconversions between number types are completely generic, and are always available, albeit the conversions are always ['explicit]:\n\n   cpp_int cppi(2);\n   // We can always convert between numbers of the same category -\n   // int to int, rational to rational, or float to float, so this is OK\n   // as long as we use an explicit conversion:\n   mpz_int z(cppi);\n   // We can always promote from int to rational, int to float, or rational to float:\n   cpp_rational     cppr(cppi);  // OK, int to rational\n   cpp_dec_float_50 df(cppi);    // OK, int to float\n   df                  = static_cast<cpp_dec_float_50>(cppr);  // OK, explicit rational to float conversion\n   // However narrowing and/or implicit conversions always fail:\n   cppi                =   df;    // Compiler error, conversion not allowed\n\n* Other interconversions may be allowed as special cases, whenever the backend allows it:\n\n   mpf_t     m;           // Native GMP type.\n   mpf_init_set_ui(m, 0); // set to a value;\n   mpf_float i(m);        // copies the value of the native type.\n\nMore information on what additional types a backend supports conversions from are given in the tutorial for each backend.\nThe converting constructor will be implicit if the backend's converting constructor is also implicit, and explicit if the\nbackends converting constructor is also explicit.\n\n[endsect] [/section:conversions Constructing and Interconverting Between Number Types]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_cpp_bin_float.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:cpp_bin_float cpp_bin_float]\n\n`#include <boost/multiprecision/cpp_bin_float.hpp>`\n\n   namespace boost{ namespace multiprecision{\n\n   enum digit_base_type\n   {\n      digit_base_2 = 2,\n      digit_base_10 = 10\n   };\n\n   template <unsigned Digits, digit_base_type base = digit_base_10, class Allocator = void, class Exponent = int, ExponentMin = 0, ExponentMax = 0>\n   class cpp_bin_float;\n\n   typedef number<cpp_bin_float<50> > cpp_bin_float_50;\n   typedef number<cpp_bin_float<100> > cpp_bin_float_100;\n\n   typedef number<backends::cpp_bin_float<24, backends::digit_base_2, void, std::int16_t, -126, 127>, et_off>         cpp_bin_float_single;\n   typedef number<backends::cpp_bin_float<53, backends::digit_base_2, void, std::int16_t, -1022, 1023>, et_off>       cpp_bin_float_double;\n   typedef number<backends::cpp_bin_float<64, backends::digit_base_2, void, std::int16_t, -16382, 16383>, et_off>     cpp_bin_float_double_extended;\n   typedef number<backends::cpp_bin_float<113, backends::digit_base_2, void, std::int16_t, -16382, 16383>, et_off>    cpp_bin_float_quad;\n   typedef number<backends::cpp_bin_float<237, backends::digit_base_2, void, std::int32_t, -262142, 262143>, et_off>  cpp_bin_float_oct;\n\n   }} // namespaces\n\nThe `cpp_bin_float` back-end is used in conjunction with `number`: It acts as an entirely C++ (header only and dependency free)\nfloating-point number type that is a drop-in replacement for the native C++ floating-point types, but with\nmuch greater precision.\n\nType `cpp_bin_float` can be used at fixed precision by specifying a non-zero `Digits` template parameter.\nThe typedefs `cpp_bin_float_50` and `cpp_bin_float_100` provide arithmetic types at 50 and 100 decimal digits precision\nrespectively.\n\nOptionally, you can specify whether the precision is specified in decimal digits or binary bits - for example\nto declare a `cpp_bin_float` with exactly the same precision as `double` one would use\n`number<cpp_bin_float<53, digit_base_2> >`.  The typedefs `cpp_bin_float_single`, `cpp_bin_float_double`,\n`cpp_bin_float_quad`, `cpp_bin_float_oct` and `cpp_bin_float_double_extended` provide\nsoftware analogues of the IEEE single, double, quad and octuple float data types, plus the Intel-extended-double type respectively.\nNote that while these types are functionally equivalent to the native IEEE types, but they do not have the same size\nor bit-layout as true IEEE compatible types.\n\nNormally `cpp_bin_float` allocates no memory: all of the space required for its digits are allocated\ndirectly within the class.  As a result care should be taken not to use the class with too high a digit count\nas stack space requirements can grow out of control.  If that represents a problem then providing an allocator\nas a template parameter causes `cpp_bin_float` to dynamically allocate the memory it needs: this\nsignificantly reduces the size of `cpp_bin_float` and increases the viable upper limit on the number of digits\nat the expense of performance.  However, please bear in mind that arithmetic operations rapidly become ['very] expensive\nas the digit count grows: the current implementation really isn't optimized or designed for large digit counts.\nNote that since the actual type of the objects allocated\nis completely opaque, the suggestion would be to use an allocator with `void` `value_type`, for example:\n`number<cpp_bin_float<1000, digit_base_10, std::allocator<void> > >`.\n\nThe final template parameters determine the type and range of the exponent: parameter `Exponent` can be\nany signed integer type, but note that `MinExponent` and `MaxExponent` can not go right up to the limits\nof the `Exponent` type as there has to be a little extra headroom for internal calculations.  You will\nget a compile time error if this is the case.  In addition if MinExponent or MaxExponent are zero, then\nthe library will choose suitable values that are as large as possible given the constraints of the type\nand need for extra headroom for internal calculations.\n\nThere is full standard library and `numeric_limits` support available for this type.\n\nThings you should know when using this type:\n\n* Default constructed `cpp_bin_float`s have a value of zero.\n* The radix of this type is 2, even when the precision is specified as decimal digits.\n* The type supports both infinities and NaNs.  An infinity is generated whenever the result would overflow,\nand a NaN is generated for any mathematically undefined operation.\n* There is a `std::numeric_limits` specialisation for this type.\n* Any `number` instantiated on this type, is convertible to any other `number` instantiated on this type -\nfor example you can convert from `number<cpp_bin_float<50> >` to `number<cpp_bin_float<SomeOtherValue> >`.\nNarrowing conversions round to nearest and are `explicit`.\n* Conversion from a string results in a `std::runtime_error` being thrown if the string can not be interpreted\nas a valid floating-point number.\n* All arithmetic operations are correctly rounded to nearest.  String conversions and the `sqrt` function\nare also correctly rounded, but transcendental functions (sin, cos, pow, exp etc) are not.\n\n[h5 cpp_bin_float example:]\n\n[cpp_bin_float_eg]\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_cpp_complex.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:cpp_complex cpp_complex]\n\n`#include <boost/multiprecision/cpp_complex.hpp>`\n\n   namespace boost{ namespace multiprecision{\n\n      template <unsigned Digits, backends::digit_base_type DigitBase = backends::digit_base_10, class Allocator = void, class Exponent = int, Exponent MinExponent = 0, Exponent MaxExponent = 0>\n      using cpp_complex_backend = complex_adaptor<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent> >;\n\n      template <unsigned Digits, backends::digit_base_type DigitBase = digit_base_10, class Allocator = void, class Exponent = int, Exponent MinExponent = 0, Exponent MaxExponent = 0, expression_template_option ExpressionTemplates = et_off>\n      using cpp_complex = number<complex_adaptor<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent> >, ExpressionTemplates>;\n\n      typedef cpp_complex<50> cpp_complex_50;\n      typedef cpp_complex<100> cpp_complex_100;\n\n      typedef cpp_complex<24, backends::digit_base_2, void, std::int16_t, -126, 127> cpp_complex_single;\n      typedef cpp_complex<53, backends::digit_base_2, void, std::int16_t, -1022, 1023> cpp_complex_double;\n      typedef cpp_complex<64, backends::digit_base_2, void, std::int16_t, -16382, 16383> cpp_complex_extended;\n      typedef cpp_complex<113, backends::digit_base_2, void, std::int16_t, -16382, 16383> cpp_complex_quad;\n      typedef cpp_complex<237, backends::digit_base_2, void, std::int32_t, -262142, 262143> cpp_complex_oct;\n\n\n   }} // namespaces\n\nThe `cpp_complex_backend` back-end is used in conjunction with `number`: It acts as an entirely C++ (header only and dependency free)\ncomplex number type that is a drop-in replacement for `std::complex`, but with much greater precision.\n\nThe template alias `cpp_complex` avoids the need to use class `number` directly.\n\nType `cpp_complex` can be used at fixed precision by specifying a non-zero `Digits` template parameter.\nThe typedefs `cpp_complex_50` and `cpp_complex_100` provide complex number types at 50 and 100 decimal digits precision\nrespectively.\n\nOptionally, you can specify whether the precision is specified in decimal digits or binary bits - for example\nto declare a `cpp_complex` with exactly the same precision as `std::complex<double>` one would use\n`cpp_complex<53, digit_base_2>`.  The typedefs `cpp_complex_single`, `cpp_complex_double`,\n`cpp_complex_quad`, `cpp_complex_oct` and `cpp_complex_double_extended` provide\nsoftware analogues of the IEEE single, double, quad and octuple float data types, plus the Intel-extended-double type respectively.\nNote that while these types are functionally equivalent to the native IEEE types, but they do not have the same size\nor bit-layout as true IEEE compatible types.\n\nNormally `cpp_complex` allocates no memory: all of the space required for its digits are allocated\ndirectly within the class.  As a result care should be taken not to use the class with too high a digit count\nas stack space requirements can grow out of control.  If that represents a problem then providing an allocator\nas a template parameter causes `cpp_complex` to dynamically allocate the memory it needs: this\nsignificantly reduces the size of `cpp_complex` and increases the viable upper limit on the number of digits\nat the expense of performance.  However, please bear in mind that arithmetic operations rapidly become ['very] expensive\nas the digit count grows: the current implementation really isn't optimized or designed for large digit counts.\nNote that since the actual type of the objects allocated\nis completely opaque, the suggestion would be to use an allocator with `char` `value_type`, for example:\n`cpp_complex<1000, digit_base_10, std::allocator<char> >`.\n\nThe next template parameters determine the type and range of the exponent: parameter `Exponent` can be\nany signed integer type, but note that `MinExponent` and `MaxExponent` can not go right up to the limits\nof the `Exponent` type as there has to be a little extra headroom for internal calculations.  You will\nget a compile time error if this is the case.  In addition if MinExponent or MaxExponent are zero, then\nthe library will choose suitable values that are as large as possible given the constraints of the type\nand need for extra headroom for internal calculations.\n\nFinally, as with class `number`, the final template parameter determines whether expression templates are turn\non or not.  Since by default this type allocates no memory, expression template support is off by default.\nHowever, you should probably turn it on if you specify an allocator.\n\nThere is full standard library support available for this type, comparable with what `std::complex` provides.\n\nThings you should know when using this type:\n\n* Default constructed `cpp_complex`s have a value of zero.\n* The radix of this type is 2, even when the precision is specified as decimal digits.\n* The type supports both infinities and NaNs.  An infinity is generated whenever the result would overflow,\nand a NaN is generated for any mathematically undefined operation.\n* There is no `std::numeric_limits` specialisation for this type: this is the same behaviour as `std::complex`.  If you need\n`std::numeric_limits` support you need to look at `std::numeric_limits<my_complex_number_type::value_type>`.\n* Any `number` instantiated on this type, is convertible to any other `number` instantiated on this type -\nfor example you can convert from `number<cpp_complex<50> >` to `number<cpp_bin_float<SomeOtherValue> >`.\nNarrowing conversions round to nearest and are `explicit`.\n* Conversion from a string results in a `std::runtime_error` being thrown if the string can not be interpreted\nas a valid complex number.\n\n[h5 example:]\n\n[cpp_complex_eg]\n\nWhich produces the output (for the multiprecision type):\n\n[cpp_complex_out]\n\n[endsect] [/section:complex Complex Number Types]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_cpp_dec_float.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:cpp_dec_float cpp_dec_float]\n\n`#include <boost/multiprecision/cpp_dec_float.hpp>`\n\n   namespace boost{ namespace multiprecision{\n\n   template <unsigned Digits10, class ExponentType = std::int32_t, class Allocator = void>\n   class cpp_dec_float;\n\n   typedef number<cpp_dec_float<50> > cpp_dec_float_50;\n   typedef number<cpp_dec_float<100> > cpp_dec_float_100;\n\n   }} // namespaces\n\nThe `cpp_dec_float` back-end is used in conjunction with `number`: It acts as an entirely C++ (header only and dependency free)\nfloating-point number type that is a drop-in replacement for the native C++ floating-point types, but with\nmuch greater precision.\n\nType `cpp_dec_float` can be used at fixed precision by specifying a non-zero `Digits10` template parameter.\nThe typedefs `cpp_dec_float_50` and `cpp_dec_float_100` provide arithmetic types at 50 and 100 decimal digits precision\nrespectively.  Optionally, you can specify an integer type to use for the exponent, this defaults to a 32-bit integer type\nwhich is more than large enough for the vast majority of use cases, but larger types such as `long long` can also be specified\nif you need a truly huge exponent range.  In any case the ExponentType must be a __fundamental signed integer type at least 2 bytes\nand 16-bits wide.\n\nNormally `cpp_dec_float` allocates no memory: all of the space required for its digits are allocated\ndirectly within the class.  As a result care should be taken not to use the class with too high a digit count\nas stack space requirements can grow out of control.  If that represents a problem then providing an allocator\nas the final template parameter causes `cpp_dec_float` to dynamically allocate the memory it needs: this\nsignificantly reduces the size of `cpp_dec_float` and increases the viable upper limit on the number of digits\nat the expense of performance.  However, please bear in mind that arithmetic operations rapidly become ['very] expensive\nas the digit count grows: the current implementation really isn't optimized or designed for large digit counts.\n\nThere is full standard library and `std::numeric_limits` support available for this type.\n\nThings you should know when using this type:\n\n* Default constructed `cpp_dec_float`s have a value of zero.\n* The radix of this type is 10.  As a result it can behave subtly differently from base-2 types.\n* The type has a number of internal guard digits over and above those specified in the template argument.\nNormally these should not be visible to the user.\n* The type supports both infinities and NaNs.  An infinity is generated whenever the result would overflow,\nand a NaN is generated for any mathematically undefined operation.\n* There is a `std::numeric_limits` specialisation for this type.\n* Any `number` instantiated on this type, is convertible to any other `number` instantiated on this type -\nfor example you can convert from `number<cpp_dec_float<50> >` to `number<cpp_dec_float<SomeOtherValue> >`.\nNarrowing conversions are truncating and `explicit`.\n* Conversion from a string results in a `std::runtime_error` being thrown if the string can not be interpreted\nas a valid floating-point number.\n* The actual precision of a `cpp_dec_float` is always slightly higher than the number of digits specified in\nthe template parameter, actually how much higher is an implementation detail but is always at least 8 decimal\ndigits.\n* Operations involving `cpp_dec_float` are always truncating.  However, note that since there are guard digits\nin effect, in practice this has no real impact on accuracy for most use cases.\n\n[h5 cpp_dec_float example:]\n\n[cpp_dec_float_eg]\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_cpp_int.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:cpp_int cpp_int]\n\n`#include <boost/multiprecision/cpp_int.hpp>`\n\n   namespace boost{ namespace multiprecision{\n\n   typedef unspecified-type limb_type;\n\n   enum cpp_integer_type    { signed_magnitude, unsigned_magnitude };\n   enum cpp_int_check_type  { checked, unchecked };\n\n   template <std::size_t MinBits = 0,\n             std::size_t MaxBits = 0,\n             cpp_integer_type SignType = signed_magnitude,\n             cpp_int_check_type Checked = unchecked,\n             class Allocator = std::allocator<limb_type> >\n   class cpp_int_backend;\n   //\n   // Expression templates default to et_off if there is no allocator:\n   //\n   template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked>\n   struct expression_template_default<cpp_int_backend<MinBits, MaxBits, SignType, Checked, void> >\n   { static const expression_template_option value = et_off; };\n\n   typedef number<cpp_int_backend<> >              cpp_int;    // arbitrary precision integer\n   typedef rational_adaptor<cpp_int_backend<> >    cpp_rational_backend;\n   typedef number<cpp_rational_backend>            cpp_rational; // arbitrary precision rational number\n\n   // Fixed precision unsigned types:\n   typedef number<cpp_int_backend<128, 128, unsigned_magnitude, unchecked, void> >   uint128_t;\n   typedef number<cpp_int_backend<256, 256, unsigned_magnitude, unchecked, void> >   uint256_t;\n   typedef number<cpp_int_backend<512, 512, unsigned_magnitude, unchecked, void> >   uint512_t;\n   typedef number<cpp_int_backend<1024, 1024, unsigned_magnitude, unchecked, void> > uint1024_t;\n\n   // Fixed precision signed types:\n   typedef number<cpp_int_backend<128, 128, signed_magnitude, unchecked, void> >     int128_t;\n   typedef number<cpp_int_backend<256, 256, signed_magnitude, unchecked, void> >     int256_t;\n   typedef number<cpp_int_backend<512, 512, signed_magnitude, unchecked, void> >     int512_t;\n   typedef number<cpp_int_backend<1024, 1024, signed_magnitude, unchecked, void> >   int1024_t;\n\n   // Over again, but with checking enabled this time:\n   typedef number<cpp_int_backend<0, 0, signed_magnitude, checked> >                 checked_cpp_int;\n   typedef rational_adaptor<cpp_int_backend<0, 0, signed_magnitude, checked> >       checked_cpp_rational_backend;\n   typedef number<cpp_rational_backend>                                              checked_cpp_rational;\n\n   // Checked fixed precision unsigned types:\n   typedef number<cpp_int_backend<128, 128, unsigned_magnitude, checked, void> >     checked_uint128_t;\n   typedef number<cpp_int_backend<256, 256, unsigned_magnitude, checked, void> >     checked_uint256_t;\n   typedef number<cpp_int_backend<512, 512, unsigned_magnitude, checked, void> >     checked_uint512_t;\n   typedef number<cpp_int_backend<1024, 1024, unsigned_magnitude, checked, void> >   checked_uint1024_t;\n\n   // Fixed precision signed types:\n   typedef number<cpp_int_backend<128, 128, signed_magnitude, checked, void> >       checked_int128_t;\n   typedef number<cpp_int_backend<256, 256, signed_magnitude, checked, void> >       checked_int256_t;\n   typedef number<cpp_int_backend<512, 512, signed_magnitude, checked, void> >       checked_int512_t;\n   typedef number<cpp_int_backend<1024, 1024, signed_magnitude, checked, void> >     checked_int1024_t;\n\n   }} // namespaces\n\nThe `cpp_int_backend` type is normally used via one of the convenience typedefs given above.\n\nThis back-end is the \"Swiss Army Knife\" of integer types as it can represent both fixed and\n[@http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic arbitrary precision]\ninteger types, and both signed and unsigned types.  There are five template arguments:\n\n[variablelist\n[[MinBits][Determines the number of Bits to store directly within the object before resorting to dynamic memory\n           allocation.  When zero, this field is determined automatically based on how many bits can be stored\n           in union with the dynamic storage header: setting a larger value may improve performance as larger integer\n           values will be stored internally before memory allocation is required.]]\n[[MaxBits][Determines the maximum number of bits to be stored in the type: resulting in a fixed precision type.\n           When this value is the same as MinBits, then the Allocator parameter is ignored, as no dynamic\n           memory allocation will ever be performed: in this situation the Allocator parameter should be set to\n           type `void`.  Note that this parameter should not be used simply to prevent large memory\n           allocations, not only is that role better performed by the allocator, but fixed precision\n           integers have a tendency to allocate all of MaxBits of storage more often than one would expect.]]\n[[SignType][Determines whether the resulting type is signed or not.  Note that for\n[@http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic arbitrary precision] types\n          this parameter must be `signed_magnitude`.  For fixed precision\n          types then this type may be either `signed_magnitude` or `unsigned_magnitude`.]]\n[[Checked][This parameter has two values: `checked` or `unchecked`.  See below.]]\n[[Allocator][The allocator to use for dynamic memory allocation, or type `void` if MaxBits == MinBits.]]\n]\n\nWhen the template parameter Checked is set to `checked` then the result is a ['checked-integer], checked\nand unchecked integers have the following properties:\n\n[table\n[[Condition][Checked-Integer][Unchecked-Integer]]\n[[Numeric overflow in fixed precision arithmetic][Throws a `std::overflow_error`.][Performs arithmetic modulo 2[super MaxBits]]]\n[[Constructing an integer from a value that can not be represented in the target type][Throws a `std::range_error`.]\n[Converts the value modulo 2[super MaxBits], signed to unsigned conversions extract the last MaxBits bits of the\n2's complement representation of the input value.]]\n[[Unsigned subtraction yielding a negative value.][Throws a `std::range_error`.][Yields the value that would\nresult from treating the unsigned type as a 2's complement signed type.]]\n[[Attempting a bitwise operation on a negative value.][Throws a `std::range_error`][Yields the value, but not the bit pattern,\nthat would result from performing the operation on a 2's complement integer type.]]\n]\n\nThings you should know when using this type:\n\n* Default constructed `cpp_int_backend`s have the value zero.\n* Division by zero results in a `std::overflow_error` being thrown.\n* Construction from a string that contains invalid non-numeric characters results in a `std::runtime_error` being thrown.\n* Since the precision of `cpp_int_backend` is necessarily limited when the allocator parameter is void,\ncare should be taken to avoid numeric overflow when using this type\nunless you actually want modulo-arithmetic behavior.\n* The type uses a sign-magnitude representation internally, so type `int128_t` has 128-bits of precision plus an extra sign bit.\nIn this respect the behaviour of these types differs from __fundamental 2's complement types.  In might be tempting to use a\n127-bit type instead, and indeed this does work, but behaviour is still slightly different from a 2's complement __fundamental type\nas the minimum and maximum values are identical (apart from the sign), where as they differ by one for a true 2's complement type.\nThat said it should be noted that there's no requirement for fundamental_types to be 2's complement either - it's simply that this\nis the most common format by far.\n* Attempting to print negative values as either an Octal or Hexadecimal string results in a `std::runtime_error` being thrown,\nthis is a direct consequence of the sign-magnitude representation.\n* The fixed precision types `[checked_][u]intXXX_t` have expression template support turned off - it seems to make little\ndifference to the performance of these types either way - so we may as well have the faster compile times by turning\nthe feature off.\n* Unsigned types support subtraction - the result is \"as if\" a 2's complement operation had been performed as long as they are not\n ['checked-integers] (see above).\n In other words they behave pretty much as a __fundamental integer type would in this situation.  So for example if we were using\n `uint128_t` then `uint128_t(1)-4` would result in the value `0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD`\n of type `uint128_t`.  However, had this operation been performed on `checked_uint128_t` then a `std::range_error` would have\n been thrown.\n* Unary negation of unsigned types results in a compiler error (static assertion).\n* This backend supports rvalue-references and is move-aware, making instantiations of `number` on this backend move aware.\n* When used at fixed precision, the size of this type is always one machine word (plus any compiler-applied alignment padding) \nlarger than you would expect for an N-bit integer:\nthe extra word stores both the sign, and how many machine words in the integer are actually in use.\nThe latter is an optimisation for larger fixed precision integers, so that a 1024-bit integer has almost the same performance\ncharacteristics as a 128-bit integer, rather than being 4 times slower for addition and 16 times slower for multiplication\n (assuming the values involved would always fit in 128 bits).\nTypically this means you can use\nan integer type wide enough for the \"worst case scenario\" with only minor performance degradation even if most of the time\nthe arithmetic could in fact be done with a narrower type.\nAlso note that unsigned fixed precision types small enough to fit inside the largest native integer become a simple wrapper around that type,\nthis includes the \"checked\" variants.  Small signed types will always have an extra sign word and so be larger than their native equivalent.\n* When used at fixed precision and MaxBits is smaller than the number of bits in the largest native integer type, then\ninternally `cpp_int_backend` switches to a \"trivial\" implementation where it is just a thin wrapper around a single\ninteger.  Note that it will still be slightly slower than a bare native integer, as it emulates a\nsigned-magnitude representation rather than simply using the platforms native sign representation: this ensures\nthere is no step change in behavior as a cpp_int grows in size.\n* Fixed precision `cpp_int`'s have some support for `constexpr` values and user-defined literals, see\n[link boost_multiprecision.tut.lits here] for the full description.  For example `0xfffff_cppi1024`\nspecifies a 1024-bit integer with the value 0xffff.  This can be used to generate compile-time constants that are\ntoo large to fit into any __fundamental number type.\n* The __cpp_int types support constexpr arithmetic, provided it is a fixed-precision type with no allocator.  It may also\nbe a checked integer: in which case a compiler error will be generated on overflow or undefined behaviour.  In addition\nthe free functions `abs`, `swap`, `multiply`, `add`, `subtract`, `divide_qr`, `integer_modulus`, `powm`, `lsb`, `msb`, \n`bit_test`, `bit_set`, `bit_unset`, `bit_flip`, `sqrt`, `gcd`, `lcm` are all supported.  Use of __cpp_int in this way\nrequires either a C++2a compiler (one which supports `std::is_constant_evaluated()`), or GCC-6 or later in C++14 mode.\nCompilers other than GCC and without `std::is_constant_evaluated()` will support a very limited set of operations:\nexpect to hit roadblocks rather easily.\n* You can import/export the raw bits of a __cpp_int to and from external storage via the `import_bits` and `export_bits`\nfunctions.  More information is in the [link boost_multiprecision.tut.import_export section on import/export].\n\n[h5:cpp_int_eg Example:]\n\n[cpp_int_eg]\n\n[endsect] [/section:cpp_int cpp_int]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_cpp_rational.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:cpp_rational cpp_rational]\n\n`#include <boost/multiprecision/cpp_int.hpp>`\n\n   namespace boost{ namespace multiprecision{\n\n   typedef rational_adaptor<cpp_int_backend<> >    cpp_rational_backend;\n\n   typedef number<cpp_rational_backend>         cpp_rational;\n\n   }} // namespaces\n\nThe `cpp_rational_backend` type is used via the typedef `boost::multiprecision::cpp_rational`.  It provides\na rational number type that is a drop-in replacement for the native C++ number types, but with unlimited precision.\n\nAs well as the usual conversions from arithmetic and string types, instances of `cpp_rational` are copy constructible\nand assignable from type `cpp_int`.\n\nThere is also a two argument constructor that accepts a numerator and denominator: both of type `cpp_int`.\n\nThere are also non-member functions:\n\n   cpp_int numerator(const cpp_rational&);\n   cpp_int denominator(const cpp_rational&);\n\nwhich return the numerator and denominator of the number.\n\nThings you should know when using this type:\n\n* Default constructed `cpp_rational`s have the value zero.\n* Division by zero results in a `std::overflow_error` being thrown.\n* Conversion from a string results in a `std::runtime_error` being thrown if the string can not be\ninterpreted as a valid rational number.\n\n[h5 Example:]\n\n[cpp_rational_eg]\n\n[endsect] [/section:rational Rational Number Types]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_debug_adaptor.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:debug_adaptor debug_adaptor]\n\n`#include <boost/multiprecision/debug_adaptor.hpp>`\n\n   namespace boost{ namespace multiprecision{\n\n   template <Backend>\n   class debug_adaptor;\n\n   template <class Number>\n   using debug_adaptor_t = number<debug_adaptor<typename Number::backend_type>, Number::et>\n\n   }} // namespaces\n\nThe `debug_adaptor` type is used in conjunction with `number` and some other backend type: it acts as a thin wrapper around\nsome other backend to class `number` and intercepts all operations on that object storing the result as a string within itself.\n\nThis type provides `numeric_limits` support whenever the template argument Backend does so.\n\nThis type is particularly useful when your debugger provides a good view of `std::string`: when this is the case\nmultiprecision values can easily be inspected in the debugger by looking at the `debug_value` member of `debug_adaptor`.\nThe down side of this approach is that runtimes are much slower when using this type.  Set against that it can make\ndebugging very much easier, certainly much easier than sprinkling code with `printf` statements.\n\nWhen used in conjunction with the Visual C++ debugger visualisers, the value of a multiprecision type that uses this\nbackend is displayed in the debugger just a __fundamental value would be, here we're inspecting a value of type\n`number<debug_adaptor<cpp_dec_float<50> > >`:\n\n[$../debugger1.png]\n\nOtherwise you will need to expand out the view and look at the \"debug_value\" member:\n\n[$../debugger2.png]\n\nIt works for all the backend types equally too, here it is inspecting a `number<debug_adaptor<gmp_rational> >`:\n\n[$../debugger3.png]\n\nThe template alias `debug_adaptor_t` is used as a shortcut for converting some other number type to it's debugged equivalent,\nfor example:\n\n   using mpfr_float_debug = debug_adaptor_t<mpfr_float>;\n\nDefines `mpfr_float_debug` to be the debugged equivalent of `mpfr_float`.\n\n\n[endsect] [/section:debug_adaptor debug_adaptor]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_eigen.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:eigen Eigen Interoperability]\n\nThis library provides the header:\n\n   #include <boost/multiprecision/eigen.hpp>\n\nwhich defines the traits classes and functions that the Eigen library needs all user-defined number types to provide.\n\nFor example the following code performs quad-precision matrix solving on complex numbers:\n\n[eigen_eg]\n\nWhich produces the following output:\n\n[eigen_out]\n\n[endsect] [/section:eigen Eigen Interoperability]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_float128.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:float128 float128]\n\n`#include <boost/multiprecision/float128.hpp>`\n\n   namespace boost{ namespace multiprecision{\n\n   class float128_backend;\n\n   typedef number<float128_backend, et_off>    float128;\n\n   }} // namespaces\n\nThe `float128` number type is a very thin wrapper around GCC's `__float128` or Intel's `_Quad` data types\nand provides an real-number type that is a drop-in replacement for the native C++ floating-point types, but with\na 113 bit mantissa, and compatible with FORTRAN's 128-bit QUAD real.\n\nAll the usual standard library and `std::numeric_limits` support are available, performance should be equivalent\nto the underlying native types: for example the LINPACK benchmarks for GCC's `__float128` and\n`boost::multiprecision::float128` both achieved 5.6 MFLOPS[footnote On 64-bit Ubuntu 11.10, GCC-4.8.0, Intel Core 2 Duo T5800.].\n\nAs well as the usual conversions from arithmetic and string types, instances of `float128` are\ncopy constructible and assignable from GCC's `__float128` and Intel's `_Quad` data types.\n\nIt's also possible to access the underlying `__float128` or `_Quad` type via the `data()` member\nfunction of `float128_backend`.\n\nThings you should know when using this type:\n\n* Default constructed `float128`s have the value zero.\n* This backend supports rvalue-references and is move-aware, making instantiations of `number` on this backend move aware.\n* This type is fully `constexpr` aware - basic constexpr arithmetic is supported from C++14 and onwards, comparisons,\nplus the functions `fabs`, `abs`, `fpclassify`, `isnormal`, `isfinite`, `isinf` and `isnan` are also supported if either\nthe compiler implements C++20's `std::is_constant_evaluated()`, or if the compiler is GCC.\n* It is not possible to round-trip objects of this type to and from a string and get back\nexactly the same value when compiled with Intel's C++ compiler and using `_Quad` as the underlying type: this is a current limitation of\nour code.  Round tripping when using `__float128` as the underlying type is possible (both for GCC and Intel).\n* Conversion from a string results in a `std::runtime_error` being thrown if the string can not be interpreted\nas a valid floating-point number.\n* Division by zero results in an infinity being produced.\n* Type `float128` can be used as a literal type (constexpr support).\n* Type `float128` can be used for full `constexpr` arithmetic from C++14 and later with GCC.  The functions `abs`, `fabs`, \n`fpclassify`, `isnan`, `isinf`, `isfinite` and `isnormal` are also `constexpr`, but the transcendental functions are not.\n* When using the Intel compiler, the underlying type defaults to `__float128` if it's available and `_Quad` if not.  You can override\nthe default by defining either `BOOST_MP_USE_FLOAT128` or `BOOST_MP_USE_QUAD`.\n* When the underlying type is Intel's `_Quad` type, the code must be compiled with the compiler option `-Qoption,cpp,--extended_float_type`.\n* When compiling with `gcc`, you need to use the flag `--std=gnu++11/14/17`, as the suffix 'Q' is a GNU extension. Compilation fails with the flag `--std=c++11/14/17`\nunless you also use `-fext-numeric-literals`.\n* You will need to link to `libquadmath.dll` with the link command `-lquadmath` and ensure that the DLL is visible by the linker. \nIf you are using the B2/bjam build system then commands`<linkflags>-lQUADMATH` and `<linkflags>-L\"path/to/lib\"` will be needed.\n* The values shown by `std::numeric_limits<float128>` and extremely close ['but not identical]\nto those from the equivalent precision and range multiprecision types `std::numeric_limits<cpp_bin_float_quad>` and `std::numeric_limits<cpp_dec_float_quad>`.\n\n[h5 float128 example:]\n\n[float128_eg]\n\nValues for `std::numeric_limits<float128>` are:\n\n[float128_numeric_limits]\n\n[endsect] [/section:float128 float128]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_float128_complex.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:complex128 complex128]\n\n`#include <boost/multiprecision/complex128.hpp>`\n\n   namespace boost{ namespace multiprecision{\n\n   class complex128_backend;\n\n   typedef number<complex128_backend, et_off>    complex128;\n\n   }} // namespaces\n\nThe `complex128` number type is a very thin wrapper around GCC's `__float128` or Intel's `_Quad` data types\nand provides a complex-number type that is a drop-in replacement for the native C++ floating-point types, but with\na 113 bit mantissa, and compatible with FORTRAN's 128-bit QUAD real.\n\nAll the usual standard library functions are available, performance should be equivalent\nto the underlying native types.\n\nAs well as the usual conversions from arithmetic and string types, instances of `float128` are\ncopy constructible and assignable from GCC's `__float128` and Intel's `_Quad` data types.\n\nThings you should know when using this type:\n\n* Default constructed `complex128`s have the value zero.\n* This backend supports rvalue-references and is move-aware, making instantiations of `number` on this backend move aware.\n* It is not possible to round-trip objects of this type to and from a string and get back\nexactly the same value when compiled with Intel's C++ compiler and using `_Quad` as the underlying type: this is a current limitation of\nour code.  Round tripping when using `__float128` as the underlying type is possible (both for GCC and Intel).\n* Conversion from a string results in a `std::runtime_error` being thrown if the string can not be interpreted\nas a valid floating-point number.\n* Division by zero results in an infinity being produced.\n* When using the Intel compiler, the underlying type defaults to `__float128` if it's available and `_Quad` if not.  You can override\nthe default by defining either `BOOST_MP_USE_FLOAT128` or `BOOST_MP_USE_QUAD`.\n* When the underlying type is Intel's `_Quad` type, the code must be compiled with the compiler option `-Qoption,cpp,--extended_float_type`.\n\n[h5 complex128 example:]\n\n[complex128_eg]\n\nWhich results in the output:\n\n[complex128_out]\n\n[endsect] [/section:complex128 complex128]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_float_builtin_ctor.qbk",
    "content": "[/\n  Copyright 2021 John Maddock.\n  Copyright 2021 Paul A. Bristow.\n  Copyright 2021 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:floatbuiltinctor Construction from Specific Values Without Precision Loss]\n\nConstruction of multiprecision types from built-in floating-point types\ncan lead to potentially unexpected, yet correct, results.\nConsider, for instance constructing an instance of `cpp_dec_float_50`\nfrom the literal built-in floating-point `double` value 11.1.\n\n   #include <iomanip>\n   #include <iostream>\n   #include <limits>\n\n   #include <boost/multiprecision/cpp_dec_float.hpp>\n\n   int main()\n   {\n     using my_dec_100 = boost::multiprecision::cpp_dec_float_50;\n\n     const my_dec_100 f11(11.1);\n\n     // On a system with 64-bit double:\n     // 11.09999999999999964472863211994990706443786621093750\n     std::cout << std::setprecision(std::numeric_limits<my_dec_100>::digits10)\n               << std::fixed\n               << f11\n               << std::endl;\n   }\n\nIn this example, the system has a 64-bit built in `double` representation.\nThe variable `f11` is initialized with the literal\n`double` value 11.1. Recall that built-in floating-point representations\nare based on successive binary fractional approximations.\nThese are, in fact, very close approximations.\nBut they are approximations nonetheless, having their built-in finite precision.\n\nFor this reason,\nthe full multiple precision value of the `double` approximation\nof 11.1 is given by the large value shown above. Observations show\nus that the value is reliable up to the approximate 15 decimal\ndigit precision of built-in 64-bit `double` on this system.\n\nIf the exact value of 11.1 is desired\n(within the wider precision of the multiprecision type),\nthen construction from literal string or from a rational\nintegral construction/division sequence should be used.\n\n   const my_dec_100 f11_str(\"11.1\");\n   const my_dec_100 f11_n  (my_dec_100(111) / 10);\n\n[endsect] [/section:floatbuiltinctor Construction from Built-In Floats]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_float_eg.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:fp_eg Examples]\n\n[include tutorial_float_builtin_ctor.qbk]\n\n[import ../example/floating_point_examples.cpp]\n\n[section:aos Area of Circle]\n\n[/I:\\boost\\libs\\multiprecision\\example\\floating_point_examples.cpp]\n[AOS1]\n[AOS2]\n[AOS3]\n\n[endsect] [/section:aos Area of Circle]\n\n\n[section:caveats Drop-in Caveats]\n[import ../example/big_seventh.cpp]\n\n[big_seventh_example_1]\n[big_seventh_example_2]\n[big_seventh_example_3]\n[big_seventh_example_constexpr]  [/ Hopefully a temporary restriction.]\n[big_seventh_example_4]\n\nTypical output is:\n[big_seventh_example_output]\n\n[endsect] [/section:caveats Caveats]\n\n[section:jel Defining a Special Function.]\n\n[JEL]\n\n[endsect] [/section:jel Defining a Special Function.]\n\n\n[section:nd Calculating a Derivative]\n\n[ND1]\n[ND2]\n[ND3]\n\n[endsect] [/section:nd Calculating a Derivative]\n\n\n[section:gi Calculating an Integral]\n\n[GI1]\n[GI2]\n\n[endsect] [/section:gi Calculating an Integral]\n\n\n[section:poly_eg Polynomial Evaluation]\n\n[POLY]\n\n[endsect] [/section:poly_eg Polynomial Evaluation]\n\n[section:variable_precision Variable-Precision Newton Evaluation]\n\n[mpfr_variable]\n\n[endsect] [/section:variable_precision Variable-Precision Newton Evaluation]\n\n[section:gauss_lagerre_quadrature Gauss-Laguerre quadrature]\n\n[import ../example/gauss_laguerre_quadrature.cpp]\n\nThis example uses __Boost_Multiprecision to implement a high-precision Gauss-Laguerre quadrature integration.\nThe quadrature is used to calculate the `airy_ai(x)` function for real-valued `x` on the positive axis with `x >= 1`.\n\nIn this way, the integral representation could be seen as part of a scheme to calculate \nreal-valued Airy functions on the positive axis for medium to large argument.\nA Taylor series or hypergeometric function (not part of this example) could be used for smaller arguments.\n\nThis example has been tested with decimal digits counts ranging from 21...301, by adjusting the parameter\n`local::my_digits10` at compile time.\n\nThe quadrature integral representaion of `airy_ai(x)` used in this example can be found in:\n\nA. Gil, J. Segura, N.M. Temme, \"Numerical Methods for Special Functions\"\n(SIAM Press 2007), ISBN 9780898717822, Sect. 5.3.3, in particular Eq. 5.110, page 145.\n\nSubsequently, Gil et al's book cites the another work:\nW. Gautschi, \"Computation of Bessel and Airy functions and of related Gaussian quadrature formulae\",\nBIT, 42 (2002), pp. 110-118, [@https://doi.org/10.1023/A:1021974203359] that is also available as\n[@https://www.cs.purdue.edu/homes/wxg/selected_works/section_02/169.pdf Gautschi_169.pdf].\n\nThis Gauss-Laguerre quadrature is designed for `airy_ai(x)` with real-valued `x >= 1`.\n\nThe example uses Gauss-Laguerre quadrature integration to compute `airy_ai(x / 7)` \nwith `7 <= x <= 120` and where `x` is incremented in steps of 1.\n\nDuring development of this example, we have empirically found the numbers of Gauss-Laguerre coefficients\nneeded for convergence when using various counts of base-10 digits.\n\nLet's calibrate, for instance, the number of coefficients needed at the point `x = 1`.\n\nEmpirical data were used with __WolframAlpha :\n``\nFit[{{21.0, 3.5}, {51.0, 11.1}, {101.0, 22.5}, {201.0, 46.8}}, {1, d, d^2}, d]FullSimplify[%]  \n  0.0000178915 d^2 + 0.235487 d - 1.28301\n  or\n  -1.28301 + (0.235487 + 0.0000178915 d) d\n``\n  \nWe need significantly more coefficients at smaller real values than are needed\nat larger real values because the slope derivative of `airy_ai(x)` gets more\nsteep as x approaches zero.  `laguerre_order` is calculated using this equation.\n\n\nSnippets from (copious) output from a progress bar during calculation of approximate root estimates \nfollowed by calculation of accurate abscissa and weights is:\n\n[gauss_laguerre_quadrature_output_1]\n\nFinally the result using Gauss-Laguerre quadrature is compared with a calculation using `cyl_bessel_k`,\nand both are listed, finally confirming that none differ more than a small tolerance.\n[gauss_laguerre_quadrature_output_2]\n\nFor more detail see comments in the source code for this example at [@../../example/gauss_laguerre_quadrature.cpp gauss_laguerre_quadrature.cpp].\n\n[endsect] [/section:gauss_lagerre_quadrature Gauss-Laguerre quadrature]\n\n[endsect] [/section:fp_eg Examples]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_floats.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:floats Floating-point Types]\n\nThe following back-ends provide floating-point arithmetic:\n\n[table\n[[Backend Type][Header][Radix][Dependencies][Pros][Cons]]\n[[`cpp_bin_float<N>`][boost/multiprecision/cpp_bin_float.hpp][2][None][Header only, all C++ implementation. Boost licence.][Approximately 2x slower than the [mpfr] or [gmp] libraries.]]\n[[`cpp_dec_float<N>`][boost/multiprecision/cpp_dec_float.hpp][10][None][Header only, all C++ implementation. Boost licence.][Approximately 2x slower than the [mpfr] or [gmp] libraries.]]\n[[`mpf_float<N>`][boost/multiprecision/gmp.hpp][2][[gmp]][Very fast and efficient back-end.][Dependency on GNU licensed [gmp] library.]]\n[[`mpfr_float<N>`][boost/multiprecision/mpfr.hpp][2][[gmp] and [mpfr]][Very fast and efficient back-end, with its own standard library implementation.][Dependency on GNU licensed [gmp] and [mpfr] libraries.]]\n[[`float128`][boost/multiprecision/float128.hpp][2][Either [quadmath] or the Intel C++ Math library.][Very fast and efficient back-end for 128-bit floating-point values (113-bit mantissa, equivalent to FORTRAN's QUAD real)][Depends on the compiler being either recent GCC or Intel C++ versions.]]\n]\n\n[include tutorial_cpp_bin_float.qbk]\n[include tutorial_cpp_dec_float.qbk]\n[include tutorial_gmp_float.qbk]\n[include tutorial_mpfr_float.qbk]\n[include tutorial_float128.qbk]\n[include tutorial_float_eg.qbk]\n\n[endsect] [/section:floats floating-point Numbers]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_gmp_float.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:gmp_float gmp_float]\n\n`#include <boost/multiprecision/gmp.hpp>`\n\n   namespace boost{ namespace multiprecision{\n\n   template <unsigned Digits10>\n   class gmp_float;\n\n   typedef number<gmp_float<50> >    mpf_float_50;\n   typedef number<gmp_float<100> >   mpf_float_100;\n   typedef number<gmp_float<500> >   mpf_float_500;\n   typedef number<gmp_float<1000> >  mpf_float_1000;\n   typedef number<gmp_float<0> >     mpf_float;\n\n   }} // namespaces\n\nThe `gmp_float` back-end is used in conjunction with `number` : it acts as a thin wrapper around the [gmp] `mpf_t`\nto provide an real-number type that is a drop-in replacement for the native C++ floating-point types, but with\nmuch greater precision.\n\nType `gmp_float` can be used at fixed precision by specifying a non-zero `Digits10` template parameter, or\nat variable precision by setting the template argument to zero.  The typedefs mpf_float_50, mpf_float_100,\nmpf_float_500, mpf_float_1000 provide arithmetic types at 50, 100, 500 and 1000 decimal digits precision\nrespectively.  The typedef mpf_float provides a variable precision type whose precision can be controlled via the\n`number`s member functions.\n\n[note This type only provides standard library and `numeric_limits` support when the precision is fixed at compile time.]\n\nAs well as the usual conversions from arithmetic and string types, instances of `number<mpf_float<N> >` are\ncopy constructible and assignable from:\n\n* The [gmp] native types `mpf_t`, `mpz_t`, `mpq_t`.\n* The `number` wrappers around those types: `number<mpf_float<M> >`, `number<gmp_int>`, `number<gmp_rational>`.\n\nIt's also possible to access the underlying `mpf_t` via the `data()` member function of `gmp_float`.\n\nThings you should know when using this type:\n\n* Default constructed `gmp_float`s have the value zero (this is the [gmp] library's default behavior).\n* No changes are made to the [gmp] library's global settings, so this type can be safely mixed with\nexisting [gmp] code.\n* This backend supports rvalue-references and is move-aware, making instantiations of `number` on this backend move aware.\n* It is not possible to round-trip objects of this type to and from a string and get back\nexactly the same value.  This appears to be a limitation of [gmp].\n* Since the underlying [gmp] types have no notion of infinities or NaNs, care should be taken\nto avoid numeric overflow or division by zero.  That latter will result in a std::overflow_error being thrown,\nwhile generating excessively large exponents may result in instability of the underlying [gmp]\nlibrary (in testing, converting a number with an excessively large or small exponent\nto a string caused [gmp] to segfault).\n* This type can equally be used with [mpir] as the underlying implementation - indeed that is\nthe recommended option on Win32.\n* Conversion from a string results in a `std::runtime_error` being thrown if the string can not be interpreted\nas a valid floating-point number.\n* Division by zero results in a `std::overflow_error` being thrown.\n\n[h5 [gmp] example:]\n\n[mpf_eg]\n\n[endsect]"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_gmp_int.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:gmp_int gmp_int]\n\n`#include <boost/multiprecision/gmp.hpp>`\n\n   namespace boost{ namespace multiprecision{\n\n   class gmp_int;\n\n   typedef number<gmp_int >         mpz_int;\n\n   }} // namespaces\n\nThe `gmp_int` back-end is used via the typedef `boost::multiprecision::mpz_int`.  It acts as a thin wrapper around the [gmp] `mpz_t`\nto provide an integer type that is a drop-in replacement for the native C++ integer types, but with unlimited precision.\n\nAs well as the usual conversions from arithmetic and string types, type `mpz_int` is copy constructible and assignable from:\n\n* The [gmp] native types: `mpf_t`, `mpz_t`, `mpq_t`.\n* Instances of `number<T>` that are wrappers around those types: `number<gmp_float<N> >`, `number<gmp_rational>`.\n\nIt's also possible to access the underlying `mpz_t` via the `data()` member function of `gmp_int`.\n\nThings you should know when using this type:\n\n* No changes are made to the GMP library's global settings - so you can safely mix this type with\nexisting code that uses [gmp].\n* Default constructed `gmp_int`s have the value zero (this is GMP's default behavior).\n* Formatted IO for this type does not support octal or hexadecimal notation for negative values,\nas a result performing formatted output on this type when the argument is negative and either of the flags\n`std::ios_base::oct` or `std::ios_base::hex` are set, will result in a `std::runtime_error` will be thrown.\n* Conversion from a string results in a `std::runtime_error` being thrown if the string can not be interpreted\nas a valid integer.\n* Division by zero results in a `std::overflow_error` being thrown.\n* Although this type is a wrapper around [gmp] it will work equally well with [mpir].  Indeed use of [mpir]\nis recommended on Win32.\n* This backend supports rvalue-references and is move-aware, making instantiations of `number` on this backend move aware.\n\n[h5 Example:]\n\n[mpz_eg]\n\n[endsect] [/section:gmp_int gmp_int]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_gmp_rational.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:gmp_rational gmp_rational]\n\n`#include <boost/multiprecision/gmp.hpp>`\n\n   namespace boost{ namespace multiprecision{\n\n   class gmp_rational;\n\n   typedef number<gmp_rational >         mpq_rational;\n\n   }} // namespaces\n\nThe `gmp_rational` back-end is used via the typedef `boost::multiprecision::mpq_rational`.  It acts as a thin wrapper around the [gmp] `mpq_t`\nto provide a rational number type that is a drop-in replacement for the native C++ number types, but with unlimited precision.\n\nAs well as the usual conversions from arithmetic and string types, instances of `number<gmp_rational>` are copy constructible\nand assignable from:\n\n* The [gmp] native types: `mpz_t`, `mpq_t`.\n* `number<gmp_int>`.\n\nThere is also a two-argument constructor that accepts a numerator and denominator (both of type `number<gmp_int>`).\n\nThere are also non-member functions:\n\n   mpz_int numerator(const mpq_rational&);\n   mpz_int denominator(const mpq_rational&);\n\nwhich return the numerator and denominator of the number.\n\nIt's also possible to access the underlying `mpq_t` via the `data()` member function of `mpq_rational`.\n\nThings you should know when using this type:\n\n* Default constructed `mpq_rational`s have the value zero (this is the [gmp] default behavior).\n* Division by zero results in a `std::overflow_error` being thrown.\n* Conversion from a string results in a `std::runtime_error` being thrown if the string can not be\ninterpreted as a valid rational number.\n* No changes are made to the [gmp] library's global settings, so this type can coexist with existing\n[gmp] code.\n* The code can equally be used with [mpir] as the underlying library - indeed that is the preferred option on Win32.\n\n[h5 Example:]\n\n[mpq_eg]\n\n[endsect] [/section:gmp_rational gmp_rational]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_hash.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:hash Hash Function Support]\n\n[hash1]\n\n[hash2]\n\n[hash3]\n\n[hash4]\n\n[endsect] [/section:hash Hash Function Support]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_import_export.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:import_export Importing and Exporting Data to and from `cpp_int` and `cpp_bin_float`]\n\nAny integer number type that uses `cpp_int_backend` as its implementation layer can import or export its bits via two non-member functions:\n\n      template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator,\n                expression_template_option ExpressionTemplates, class OutputIterator>\n      OutputIterator export_bits(\n         const number<const cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val,\n         OutputIterator out,\n         unsigned chunk_size,\n         bool msv_first = true);\n\n      template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator,\n                expression_template_option ExpressionTemplates, class Iterator>\n      number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>&\n         import_bits(\n            number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val,\n            Iterator i,\n            Iterator j,\n            unsigned chunk_size = 0,\n            bool msv_first = true);\n\nThese functions are designed for data-interchange with other storage formats, and since __cpp_bin_float uses __cpp_int internally,\nby extension they can be used for floating-point numbers based on that backend as well (see example below). \nParameters and use are as follows:\n\n      template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator,\n                expression_template_option ExpressionTemplates, class OutputIterator>\n      OutputIterator export_bits(\n         const number<const cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val,\n         OutputIterator out,\n         unsigned chunk_size,\n         bool msv_first = true);\n\nExports the absolute value of `val` to OutputIterator `out`.  The function will write `chunk_size` bits at a time\nto the OutputIterator, and if `msv_first` is true, will write the most-significant block first.  Byte and bit order\nwithin each `chunk_size` block is always in the machines native format.  Further, each block is stored in a\n`std::uintmax_t` when it's assigned to `*out`.\n\n[note Unfortunately, the standard's OutputIterator concept provides no means of deducing the type to output since\n`std::iterator_traits<OutputIteratorType>::value_type` is type `void`.  This is why the bit count for each block\nhas to be specified manually.  It may also result in compiler warnings about the value being narrowed.]\n\n[tip If you're exporting to non-native byte layout, then use\n[@http://www.boost.org/doc/libs/release/libs/endian/doc/index.html  Boost.Endian]\nto create a custom OutputIterator that reverses the byte order of each chunk prior to actually storing the result.]\n\n      template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator,\n                expression_template_option ExpressionTemplates, class ForwardIterator>\n      number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>&\n         import_bits(\n            number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val,\n            ForwardIterator i,\n            ForwardIterator j,\n            unsigned chunk_size = 0,\n            bool msv_first = true);\n\nImports bits from the iterator range ['\\[i,j)] and stores them in `val` to produce an unsigned result (if the result\nis to be signed you will need to handle that separately).  When `msv_first` is true, takes `*i` as the most significant\nchunk.  Assumes there are `chunk_size` bits in each value read from the iterator range, and that these are in machine native\nbit/byte order.  When `chunk_size` is zero, then assumes that each chunk contains\n`std::numeric_limits<std::iterator_traits<ForwardIterator>::value_type>::digits`, note that this will give the wrong result\nif dereferencing the iterators leads to a signed-integer type, [*and] the sign bit is significant (be particularly careful\nif you expect type `char` to contain 8-bit values, as by default it will extract only 7-bits at a time if `char` is signed).\nAs with exporting, if the external data is to be in a non-native byte order (within each chunk), then you will need to create an iterator adaptor\nthat presents it in native order (see [@http://www.boost.org/doc/libs/release/libs/endian/doc/index.html Boost.Endian]).\n\n[note\nNote that this function is optimized for the case where the data can be `memcpy`ed from the source to the integer - in this case both\niterators much be pointers, and everything must be little-endian.]\n\n[h4 Examples]\n\n[IE1]\n\n[IE2]\n\n[endsect] [/section:import_export Importing and Exporting Data to and from `cpp_int` and `cpp_bin_float`]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_integer.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:ints Integer Types]\n\nThe following back-ends provide integer arithmetic:\n\n[table\n[[Backend Type][Header][Radix][Dependencies][Pros][Cons]]\n[[`cpp_int`][boost/multiprecision/cpp_int.hpp][2][None]\n            [Very versatile, Boost licensed, all C++ integer type which support both [@http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic arbitrary precision] and fixed precision integer types.][Slower than [gmp], though typically not as slow as [tommath]]]\n[[`gmp_int`][boost/multiprecision/gmp.hpp][2][[gmp]][Very fast and efficient back-end.][Dependency on GNU licensed [gmp] library.]]\n[[`tom_int`][boost/multiprecision/tommath.hpp][2][[tommath]][Public domain back-end with no licence restrictions.][Slower than [gmp].]]\n]\n\n[include tutorial_cpp_int.qbk]\n[include tutorial_gmp_int.qbk]\n[include tutorial_tommath.qbk]\n[include tutorial_integer_examples.qbk]\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_integer_examples.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:egs Examples]\n\n[import ../example/integer_examples.cpp]\n\n[section:factorials Factorials]\n[FAC1]\n[endsect] [/section:factorials Factorials]\n\n\n[section:bitops Bit Operations]\n[BITOPS]\n[endsect] [/section:bitops Bit Operations]\n\n\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_integer_ops.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:gen_int Generic Integer Operations]\n\nAll of the [link boost_multiprecision.ref.number.integer_functions non-member integer operations] are overloaded for the\n__fundamental integer types in\n`<boost/multiprecision/integer.hpp>`.\nWhere these operations require a temporary increase in precision (such as for `powm`), then\nif no __fundamental type is available, a __cpp_int of appropriate precision will be used.\n\nSome of these functions are trivial, others use compiler intrinsics (where available) to ensure optimal evaluation.\n\nThe overloaded functions are:\n\n   template <class Integer, class I2>\n   Integer& multiply(Integer& result, const I2& a, const I2& b);\n\nMultiplies two `I2` values, to produce a wider `Integer` result.\n\nReturns `result = a * b` without overflow or loss of precision in the multiplication.\n\n   template <class Integer, class I2>\n   Integer& add(Integer& result, const I2& a, const I2& b);\n\nAdds two `I2` values, to produce a wider `Integer` result.\n\nReturns `result = a + b` without overflow or loss of precision in the addition.\n\n   template <class Integer, class I2>\n   Integer& subtract(Integer& result, const I2& a, const I2& b);\n\nSubtracts two `I2` values, to produce a wider `Integer` result.\n\nReturns `result = a - b` without overflow or loss of precision in the subtraction.\n\n   template <class Integer>\n   Integer powm(const Integer& b, const Integer& p, const Integer& m);\n\nReturns b[super p] % m.\n\n   template <class Integer>\n   void divide_qr(const Integer& x, const Integer& y, Integer& q, Integer& r);\n\nSets `q = x / y` and `r = x % y`.\n\n   template <class Integer1, class Integer2>\n   Integer2 integer_modulus(const Integer1& x, Integer2 val);\n\nReturns x % val;\n\n   template <class Integer>\n   unsigned lsb(const Integer& x);\n\nReturns the (zero-based) index of the least significant bit of `x`.\n\nThrows a `std::domain_error` if `x <= 0`.\n\n   template <class Integer>\n   unsigned msb(const Integer& x);\n\nReturns the (zero-based) index of the most significant bit of `x`.\n\nThrows a `std::domain_error` if `x <= 0`.\n\n   template <class Integer>\n   bool bit_test(const Integer& val, unsigned index);\n\nReturns `true` if bit `index` is set in `val`.\n\n   template <class Integer>\n   Integer& bit_set(Integer& val, unsigned index);\n\nSets the `index` bit in `val`.\n\n   template <class Integer>\n   Integer& bit_unset(Integer& val, unsigned index);\n\nUnsets the `index` bit in `val`.\n\n   template <class Integer>\n   Integer& bit_flip(Integer& val, unsigned index);\n\nFlips the `index` bit in `val`.\n\n   template <class Integer>\n   Integer sqrt(const Integer& x);\n   template <class Integer>\n   Integer sqrt(const Integer& x, Integer& r);\n\nReturns the integer square root `s` of x and sets `r` to the remainder ['x - s[super 2]].\n\n   template <class Engine>\n   bool miller_rabin_test(const number-or-expression-template-type& n, unsigned trials, Engine& gen);\n   bool miller_rabin_test(const number-or-expression-template-type& n, unsigned trials);\n\nThe regular Miller-Rabin functions in `<boost/multiprecision/miller_rabin.hpp>` are defined in terms of the above\ngeneric operations, and so function equally well for __fundamental_types and multiprecision types.\n\n[endsect] [/section:gen_int Generic Integer Operations]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_interval_mpfi.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:interval Interval Number Types]\n\nThere is one currently only one interval number type supported - [mpfi].\n\n[section:mpfi mpfi_float]\n\n`#include <boost/multiprecision/mpfi.hpp>`\n\n   namespace boost{ namespace multiprecision{\n\n   template <unsigned Digits10>\n   class mpfi_float_backend;\n\n   typedef number<mpfi_float_backend<50> >    mpfi_float_50;\n   typedef number<mpfi_float_backend<100> >   mpfifloat_100;\n   typedef number<mpfi_float_backend<500> >   mpfifloat_500;\n   typedef number<mpfi_float_backend<1000> >  mpfi_float_1000;\n   typedef number<mpfi_float_backend<0> >     mpfi_float;\n\n   }} // namespaces\n\nThe `mpfi_float_backend` type is used in conjunction with `number`: It acts as a thin wrapper around the [mpfi] `mpfi_t`\nto provide an real-number type that is a drop-in replacement for the native C++ floating-point types, but with\nmuch greater precision and implementing interval arithmetic.\n\nType `mpfi_float_backend` can be used at fixed precision by specifying a non-zero `Digits10` template parameter, or\nat variable precision by setting the template argument to zero.  The `typedef`s `mpfi_float_50`, `mpfi_float_100`,\n`mpfi_float_500`, `mpfi_float_1000` provide arithmetic types at 50, 100, 500 and 1000 decimal digits precision\nrespectively.  The `typedef mpfi_float` provides a variable precision type whose precision can be controlled via theF\n`number`s member functions.\n\n[note This type only provides `numeric_limits` support when the precision is fixed at compile time.]\n\nAs well as the usual conversions from arithmetic and string types, instances of `number<mpfi_float_backend<N> >` are\ncopy constructible and assignable from:\n\n* The [mpfi] native type `mpfi_t`.\n* The `number` wrappers around [mpfi] or [mpfr]: `number<mpfi_float_backend<M> >` and `number<mpfr_float<M> >`.\n* There is a two argument constructor taking two `number<mpfr_float<M> >` arguments specifying the interval.\n\nIt's also possible to access the underlying `mpfi_t` via the `data()` member function of `mpfi_float_backend`.\n\nThings you should know when using this type:\n\n* A default constructed `mpfi_float_backend` is set to zero (['Note that this is [*not] the default [mpfi] behavior]).\n* No changes are made to [gmp] or [mpfr] global settings, so this type can coexist with existing\n[mpfr] or [gmp] code.\n* The code can equally use [mpir] in place of [gmp] - indeed that is the preferred option on Win32.\n* This backend supports rvalue-references and is move-aware, making instantiations of `number` on this backend move aware.\n* Conversion from a string results in a `std::runtime_error` being thrown if the string can not be interpreted\nas a valid floating-point number.\n* Division by zero results in an infinity.\n\nThere are some additional non member functions for working on intervals:\n\n  template <unsigned Digits10, expression_template_option ExpressionTemplates>\n  number<mpfr_float_backend<Digits10>, ExpressionTemplates> lower(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& val);\n\nReturns the lower end of the interval.\n\n  template <unsigned Digits10, expression_template_option ExpressionTemplates>\n  number<mpfr_float_backend<Digits10>, ExpressionTemplates> upper(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& val);\n\nReturns the upper end of the interval.\n\n  template <unsigned Digits10, expression_template_option ExpressionTemplates>\n  number<mpfr_float_backend<Digits10>, ExpressionTemplates> median(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& val);\n\nReturns the mid point of the interval.\n\n  template <unsigned Digits10, expression_template_option ExpressionTemplates>\n  number<mpfr_float_backend<Digits10>, ExpressionTemplates> width(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& val);\n\nReturns the absolute width of the interval.\n\n  template <unsigned Digits10, expression_template_option ExpressionTemplates>\n  number<mpfi_float_backend<Digits10>, ExpressionTemplates> intersect(\n    const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& a,\n    const number<mpfi_float_backend<Digits10>, ExpressionTemplates>&  b);\n\nReturns the interval which is the intersection of the ['a] and ['b].  Returns an\nunspecified empty interval if there is no such intersection.\n\n  template <unsigned Digits10, expression_template_option ExpressionTemplates>\n  number<mpfi_float_backend<Digits10>, ExpressionTemplates> hull(\n    const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& a,\n    const number<mpfi_float_backend<Digits10>, ExpressionTemplates>&  b);\n\nReturns the interval which is the union of ['a] and ['b].\n\n  template <unsigned Digits10, expression_template_option ExpressionTemplates>\n  bool overlap(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& a,\n               const number<mpfi_float_backend<Digits10>, ExpressionTemplates>&  b);\n\nReturns `true` only if the intervals ['a] and ['b] overlap.\n\n  template <unsigned Digits10, expression_template_option ExpressionTemplates1, expression_template_option ExpressionTemplates2>\n  bool in(const number<mpfr_float_backend<Digits10>, ExpressionTemplates1>& a,\n          const number<mpfi_float_backend<Digits10>, ExpressionTemplates2>&  b);\n\nReturns `true` only if point ['a] is contained within the interval ['b].\n\n  template <unsigned Digits10, expression_template_option ExpressionTemplates>\n  bool zero_in(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& a);\n\nReturns `true` only if the interval ['a] contains the value zero.\n\n  template <unsigned Digits10, expression_template_option ExpressionTemplates>\n  bool subset(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& a,\n              const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& b);\n\nReturns `true` only if ['a] is a subset of ['b].\n\n  template <unsigned Digits10, expression_template_option ExpressionTemplates>\n  bool proper_subset(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& a,\n                     const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& b);\n\nReturns `true` only if ['a] is a proper subset of ['b].\n\n  template <unsigned Digits10, expression_template_option ExpressionTemplates>\n  bool empty(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& a);\n\nReturns `true` only if ['a] is an empty interval, equivalent to `upper(a) < lower(a)`.\n\n  template <unsigned Digits10, expression_template_option ExpressionTemplates>\n  bool singleton(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& a);\n\nReturns `true` if `lower(a) == upper(a)`.\n\n[h5 [mpfi] example:]\n\n[mpfi_eg]\n\n[endsect] [ section:mpfi mpfi_float]\n\n[endsect] [/section:interval Interval Number Types]\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_io.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:input_output  Input Output]\n\n[h4  Loopback testing]\n\n['Loopback] or ['round-tripping] refers to writing out a value as a decimal digit string using `std::iostream`,\nusually to a `std::stringstream`, and then reading the string back in to another value,\nand confirming that the two values are identical.  A trivial example using `float` is:\n\n  float write; // Value to round-trip.\n  std::stringstream ss;  // Read and write std::stringstream.\n  ss.precision(std::numeric_limits<T>::max_digits10);  // Ensure all potentially significant bits are output.\n  ss.flags(std::ios_base::fmtflags(std::ios_base::scientific)); // Use scientific format.\n  ss << write; // Output to string.\n  float read;  // Expected.\n  ss >> read; // Read decimal digits string from stringstream.\n  BOOST_CHECK_EQUAL(write, read); // Should be the same.\n\nand this can be run in a loop for all possible values of a 32-bit float.\nFor other floating-point types `T`, including __fundamental `double`,\nit takes far too long to test all values,\nso a reasonable test strategy is to use a large number of random values.\n\n  T write;\n  std::stringstream ss;\n  ss.precision(std::numeric_limits<T>::max_digits10);  // Ensure all potentially significant bits are output.\n  ss.flags(f); // Changed from default iostream format flags if desired.\n  ss << write; // Output to stringstream.\n\n  T read;\n  ss >> read; // Get read using operator>> from stringstream.\n  BOOST_CHECK_EQUAL(read, write);\n\n  read = static_cast<T>(ss.str()); // Get read by converting from decimal digits string representation of write.\n  BOOST_CHECK_EQUAL(read, write);\n\n  read = static_cast<T>(write.str(0, f));  // Get read using format specified when written.\n  BOOST_CHECK_EQUAL(read, write);\n\n\nThe test at\n[@../../test/test_cpp_bin_float_io.cpp test_cpp_bin_float_io.cpp]\nallows any floating-point type to be ['round_tripped] using a wide range of fairly random values.\nIt also includes tests compared a collection of\n[@../../test/string_data.ipp stringdata] test cases in a file.\n\n[h4 Comparing with output using __fundamental types]\n\nOne can make some comparisons with the output of\n\n   <number<cpp_bin_float<53, digit_count_2> >\n\nwhich has the same number of significant bits (53) as 64-bit double precision floating-point.\n\nHowever, although most outputs are identical, there are differences on some platforms\ncaused by the implementation-dependent behaviours allowed by the C99 specification\n[@http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf  C99 ISO/IEC 9899:TC2],\nincorporated by C++.\n\n[:['\"For e, E, f, F, g, and G conversions, if the number of significant decimal digits\nis at most DECIMAL_DIG, then the result should be correctly rounded.\nIf the number of significant decimal digits is more than DECIMAL_DIG\nbut the source value is exactly representable with DECIMAL_DIG digits,\nthen the result should be an exact representation with trailing zeros.\nOtherwise, the source value is bounded by two adjacent decimal strings L < U,\nboth having DECIMAL_DIG significant digits;\nthe value of the resultant decimal string D should satisfy L<= D <= U,\nwith the extra stipulation that the error should have a correct sign\nfor the current rounding direction.\"]]\n\nSo not only is correct rounding for the full number of digits not required,\nbut even if the *optional* recommended practice is followed,\nthen the value of these last few digits is unspecified\nas long as the value is within certain bounds.\n\n[note Do not expect the output from different platforms\nto be [*identical], but `cpp_dec_float`, `cpp_bin_float` (and other backends) outputs should be\ncorrectly rounded to the number of digits requested by the set precision and format.]\n\n\n[h4 Macro BOOST_MP_MIN_EXPONENT_DIGITS]\n\n[@http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf C99 Standard]\nfor [/e and E] format specifiers, 7.19.6 Formatted input/output functions requires:\n\n\\\"The exponent always contains at least two digits,\nand only as many more digits as necessary to represent the exponent.\\\"\n\nSo to conform to the C99 standard (incorporated by C++)\n\n  #define BOOST_MP_MIN_EXPONENT_DIGITS 2\n\nConfusingly, Microsoft (and MinGW) do not conform to this standard and provide\n[*at least three digits], for example `1e+001`.\nSo if you want the output to match that from\n__fundamental floating-point types on compilers that use Microsofts runtime then use:\n\n  #define BOOST_MP_MIN_EXPONENT_DIGITS 3\n\nAlso useful to get the minimum exponent field width is\n\n  #define BOOST_MP_MIN_EXPONENT_DIGITS 1\n\nproducing a compact output like `2e+4`,\nuseful when conserving space is important.\n\nLarger values are also supported, for example, value 4 for `2e+0004`\nwhich may be useful to ensure that columns line up.\n\n[endsect] [/section:input_output  Input Output]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_logged_adaptor.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:logged_adaptor logged_adaptor]\n\n`#include <boost/multiprecision/logged_adaptor.hpp>`\n\n   namespace boost{ namespace multiprecision{\n\n   template <class Backend>\n   void log_postfix_event(const Backend& result, const char* event_description);\n   template <class Backend, class T>\n   void log_postfix_event(const Backend& result1, const T& result2, const char* event_description);\n\n   template <class Backend>\n   void log_prefix_event(const Backend& arg1, const char* event_description);\n   template <class Backend, class T>\n   void log_prefix_event(const Backend& arg1, const T& arg2, const char* event_description);\n   template <class Backend, class T, class U>\n   void log_prefix_event(const Backend& arg1, const T& arg2, const U& arg3, const char* event_description);\n   template <class Backend, class T, class U, class V>\n   void log_prefix_event(const Backend& arg1, const T& arg2, const U& arg3, const V& arg4, const char* event_description);\n\n   template <Backend>\n   class logged_adaptor;\n\n   template <class Number>\n   using logged_adaptor_t = number<logged_adaptor<typename Number::backend_type>, Number::et>;\n\n   }} // namespaces\n\nThe `logged_adaptor` type is used in conjunction with `number` and some other backend type: it acts as a thin wrapper around\nsome other backend to class `number` and logs all the events that take place on that object.  Before any number operation takes\nplace, it calls `log_prefix_event` with the arguments to the operation (up to 4), plus a string describing the operation.\nThen after the operation it calls `log_postfix_event` with the result of the operation, plus a string describing the operation.\nOptionally, `log_postfix_event` takes a second result argument: this occurs when the result of the operation is not a `number`,\nfor example when `fpclassify` is called, `log_postfix_event` will be called with `result1` being the argument to the function, and\n`result2` being the integer result of `fpclassify`.\n\nThe default versions of `log_prefix_event` and `log_postfix_event` do nothing, it is therefore up to the user to overload these\nfor the particular backend being observed.\n\nThis type provides `numeric_limits` support whenever the template argument Backend does so.\n\nTemplate alias `logged_adaptor_t` can be used as a shortcut for converting some instantiation of `number<>` to it's logged euqivalent.\n\nThis type is particularly useful when combined with an interval number type - in this case we can use `log_postfix_event`\nto monitor the error accumulated after each operation.  We could either set some kind of trap whenever the accumulated error\nexceeds some threshold, or simply print out diagnostic information.  Using this technique we can quickly locate the cause of\nnumerical instability in a particular routine.  The following example demonstrates this technique in a trivial algorithm\nthat deliberately introduces cancellation error:\n\n[logged_adaptor]\n\nWhen we examine program output we can clearly see that the diameter of the interval increases after each subtraction:\n\n[logged_adaptor_output]\n\n[endsect] [/section:logged_adaptor logged_adaptor]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_misc_backends.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:misc Miscellaneous Number Types.]\n\nBackend types listed in this section are predominantly designed to aid debugging.\n\n[include tutorial_logged_adaptor.qbk]\n[include tutorial_debug_adaptor.qbk]\n[include tutorial_visualizers.qbk]\n\n[endsect]  [/section:misc Miscellaneous Number Types.]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_mixed_precision.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:mixed Mixed Precision Arithmetic]\n\nMixed precision arithmetic is fully supported by the library.\n\nThere are three different forms:\n\n* Where the operands are of different precision or types.\n* Where the operands are of the same type and precision, but yield a higher precision result.\n* Where the operands or result are different but equivalent types (for example types which differ only in their memory management).\n\n[h4 Mixing Operands of Differing Types or Precision]\n\nIf the arguments to a binary operator are of different types or precision, then the operation is allowed\nas long as there is an unambiguous implicit conversion from one argument type to the other.\nIn all cases the arithmetic is performed \"as if\" the lower precision type is promoted to the\nhigher precision type before applying the operator.  However, particular backends may optimise\nthis and avoid actually creating a temporary if they are able to do so.\n\nFor example:\n\n   mpfr_float_50         a(2), b;\n   mpfr_float_100        c(3), d;\n   static_mpfr_float_50  e(5), f;\n   mpz_int               i(20);\n\n   d = a * c;  // OK, result of operand is an mpfr_float_100.\n   b = a * c;  // Error, can't convert the result to an mpfr_float_50 as it will lose digits.\n   f = e * i;  // OK, unambiguous conversion from mpz_int to static_mpfr_float_50\n\n[h4 Operands of the Same Precision]\n\nSometimes you want to apply an operator to two arguments of the same precision in\nsuch a way as to obtain a result of higher precision.  The most common situation\noccurs with fixed precision integers, where you want to multiply two N-bit numbers\nto obtain a 2N-bit result.  This is supported in this library by the following\nfree functions:\n\n   template <class ResultType, class Source1 class Source2>\n   ResultType& add(ResultType& result, const Source1& a, const Source2& b);\n\n   template <class ResultType, class Source1 class Source2>\n   ResultType& subtract(ResultType& result, const Source1& a, const Source2& b);\n\n   template <class ResultType, class Source1 class Source2>\n   ResultType& multiply(ResultType& result, const Source1& a, const Source2& b);\n\nThese functions apply the named operator to the arguments ['a] and ['b] and store the\nresult in ['result], returning ['result].  In all cases they behave \"as if\"\narguments ['a] and ['b] were first promoted to type `ResultType` before applying the\noperator, though particular backends may well avoid that step by way of an optimization.\n\nThe type `ResultType` must be an instance of class `number`, and the types `Source1` and `Source2`\nmay be either instances of class `number` or native integer types.  The latter is an optimization\nthat allows arithmetic to be performed on native integer types producing an extended precision result.\n\nFor example:\n\n[mixed_eg]\n\nProduces the output:\n\n[mixed_output]\n\n[h4 Mixing different, but \"equivalent\" types]\n\nOrdinarily, mixing types of the same precision will produce a compiler error since there is\nno unambiguous result type.  However, there is a traits class:\n   \n   namespace boost{ namespace multiprecision\n   \n   template <class NumberType1, class NumberType2>\n   struct is_equivalent_number_type;\n\n   }\n   }\n\nWhen it's `value` const-member value is `true` then the library will treat the types `NumberType1` and `NumberType2` as if\nthey are interchangeable.  This is typically used to optimise memory management by using two types with differing\nmemory allocation strategies for different roles.  Typically, we would be using a type with dymanic memory allocation and a minimal\nmemory footprint for the main storage type (think large arrays or matrices), but a type with internal storage and no dynamic \nallocation (but a larger memory footprint) for a few select calculations.\n\nThere are three backends that define this trait by default:\n\n* __cpp_int's, provided the two types differ only in their internal cache size.\n* __cpp_bin_float's provided they are of the same precision.\n* __mpfr_float_backend's provided they are of the same precision.\n\nIn addition, while this feature can be used with expression templates turned off, this feature minimises temporaries\nand hence memory allocations when expression template are turned on.\n\nBy way of an example, consider the dot product of two vectors of __cpp_int's, our first, fairly trivial\nimplementation might look like this:\n\n[dot_prod_1]\n\nHowever, in order to reduce the need for memory allocations when constructing the temporaries needed\nfor the multiply-and-add operations, we could use an equivalent type with a larger internal cache like this:\n\n[dot_prod_2]\n\nBefore we compare performance though, there is one other obvious thing we could try.  By simply declaring\na variable for the result of the intermediate multiplications, and reusing that variable each time through\nthe loop, we might also expect to greatly reduce the number of allocations required.\n\n[dot_prod_3]\n\nWe'll begin by comparing how many actual allocations were required to calculate the dot product of 1000 \nvalue vectors for random data with various bit counts:\n\n[table\n[[Bit Count][Allocations Count Version 1][Allocations Count Version 2][Allocations Count Version 3]]\n[[32][1[footnote Here everything fits within __cpp_int's default internal cache, so no allocation are required.]][0][0]]\n[[64][1001][1[footnote A single allocation for the return value.]][1]]\n[[128][1002][1][2]]\n[[256][1002][1][3[footnote Here the input data is such that more than one allocation is required for the temporary.]]]\n[[512][1002][1][3]]\n[[1024][1002][1001[footnote At this point we exceed the internal cache of our internal calculation type.]][3]]\n]\n\nTimings for the three methods are as follows (MSVC-16.8.0, x64):\n\n[table\n[[Bit Count][time/ms Version 1][time/ms Version 2][time/ms Version 3]]\n[[32][0.021][0.021][0.021]]\n[[64][0.032][0.032][0.029]]\n[[128][0.099][0.041][0.041]]\n[[256][0.154][0.091][0.094]]\n[[512][0.323][0.270][0.269]]\n[[1024][0.998][0.995][0.949]]\n]\n\nAs you can see, there is a sweet spot for middling-sized integers where we gain: if the values are small, then\n__cpp_int's own internal cache is large enough anyway, and no allocation occur.  Conversely, if the values are\nsufficiently large, then the cost of the actual arithmetic dwarfs the memory allocation time.  In this particular\ncase, carefully writing the code (version 3) is clearly at least as good as using a separate type with a larger cache.\nHowever, there may be times when it's not practical to re-write existing code, purely to optimise it for the \nmultiprecision use case.\n\nA typical example where we can't rewrite our code to avoid unnecessary allocations, occurs when we're calling an\nexternal routine.  For example the arc length of an ellipse with radii ['a] and ['b] is given by:\n\n[pre L(a, b) = 4aE(k)]\n\nwith:\n\n[pre k = [sqrt](1 - b[super 2]/a[super 2])]\n\nwhere ['E(k)] is the complete elliptic integral of the second kind, which is available as a template function `ellint_2` in Boost.Math.\n\nNaively, we might implement this for use with __mpfr_float_backend like this:\n\n[elliptic_arc1]\n\nBut we might also try mixing our arithmetic types - regular dynamically allocated __mpfr_float_backend's for the\ninterface to minimise memory footprint in our external storage, and statically allocated __mpfr_float_backend's\nfor the internal arithmetic:\n\n[elliptic_arc2]\n\nThe performance comparisons are surprisingly stark:\n\n[table\n[[N][`number<mpfr_float_backend<N>>` / ms][`number<mpfr_float_backend<N, allocate_stack>>` / ms]]\n[[30][19.5][3.1]]\n[[40][12.5][6.2]]\n[[50][14.4][6.6]]\n[[60][18.0][9.5]]\n[[70][18.0][9.6]]\n[[80][20.0][12.8]]\n]\n\nAs before, the results are for MSVC-16.8.0/x64, and in point of fact, the results do not always favour\nnon-allocating types so much, it does depend very much on the special function being called and/or the arguments used.\n\n[h4 Backends With Optimized Mixed Precision Arithmetic]\n\nThe following backends have at least some direct support for mixed-precision arithmetic,\nand therefore avoid creating unnecessary temporaries when using the interfaces above.\nTherefore when using these types it's more efficient to use mixed-precision arithmetic,\nthan it is to explicitly cast the operands to the result type:\n\n__mpfr_float_backend, __mpf_float, __cpp_int.\n\n[endsect] [/section:mixed Mixed Precision Arithmetic]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_mpc_complex.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:mpc_complex mpc_complex]\n\n`#include <boost/multiprecision/mpc.hpp>`\n\n   namespace boost{ namespace multiprecision{\n\n   template <unsigned Digits10>\n   class mpc_complex_backend;\n\n   typedef number<mpc_complex_backend<50> >    mpc_complex_50;\n   typedef number<mpc_complex_backend<100> >   mpc_complex_100;\n   typedef number<mpc_complex_backend<500> >   mpc_complex_500;\n   typedef number<mpc_complex_backend<1000> >  mpc_complex_1000;\n   typedef number<mpc_complex_backend<0> >     mpc_complex;\n\n   }} // namespaces\n\nThe `mpc_complex_backend` type is used in conjunction with `number`: It acts as a thin wrapper around the [mpc] `mpc_t`\nto provide an real-number type that is a drop-in replacement for `std::complex`, but with\nmuch greater precision.\n\nType `mpc_complex_backend` can be used at fixed precision by specifying a non-zero `Digits10` template parameter, or\nat variable precision by setting the template argument to zero.  The typedefs mpc_complex_50, mpc_complex_100,\nmpc_complex_500, mpc_complex_1000 provide complex types at 50, 100, 500 and 1000 decimal digits precision\nrespectively.  The typedef mpc_complex provides a variable precision type whose precision can be controlled via the\n`number`s member functions.\n\nThe `mpc` backend should allow use of the same syntax as the C++ standard library complex type.\nWhen using this backend, remember to link with the flags `-lmpc -lmpfr -lgmp`.\n\nAs well as the usual conversions from arithmetic and string types, instances of `number<mpc_complex_backend<N> >` are\ncopy constructible and assignable from:\n\n* The [gmp] native types `mpf_t`, `mpz_t`, `mpq_t`.\n* The [mpfr] native type `mpfr_t`.\n* The [mpc] native type `mpc_t`.\n* The `number` wrappers around those types: `number<mpfr_float_backend<M> >`, `number<mpf_float<M> >`, `number<gmp_int>`, `number<gmp_rational>`.\n\nIt's also possible to access the underlying `mpc_t` via the `data()` member function of `mpfr_float_backend`.\n\nThings you should know when using this type:\n\n* A default constructed `mpc_complex_backend` is set to zero (['Note that this is [*not] the default [mpc] behavior]).\n* All operations use round to nearest.\n* No changes are made to [mpc], [gmp] or [mpfr] global settings, so this type can coexist with existing\n[mpc], [mpfr] or [gmp] code.\n* The code can equally use [mpir] in place of [gmp] - indeed that is the preferred option on Win32.\n* This backend supports rvalue-references and is move-aware, making instantiations of `number` on this backend move aware.\n* Conversion from a string results in a `std::runtime_error` being thrown if the string can not be interpreted\nas a valid complex number.\n* Division by zero results in a complex-infinity.\n* Unlike `std::complex`, you can not use `reinterpret_cast` to treat this type as an array of the underlying floating point type.\n* Unlike `std::complex`, there are no literals for imaginary values.\n* When using the variable precision type `mpc_complex`, then copy construction and assignment ['copies the precision\nof the source variable].  Likewise move construction and assignment.\n* When constructing the variable precision type `mpc_complex` you can specify two arguments to the constructor - the first\nis the value to assign to the variable, the second is an unsigned integer specifying the precision in decimal places.  The\n`assign` member function similarly has a 2-argument overload taking the value to assign and the precision.  You can use this\nto preserve the precision of the target variable using the somewhat arcane: `a.assign(b, a.precision())`, which assigns `b` to `a`\nbut preserves the precision of `a`.\n\n[h5 [mpc] example:]\n\n[mpc_eg]\n\nWhich produces the output (for the multiprecision type):\n\n[mpc_out]\n\n[endsect] [/section:mpc_complex mpc_complex]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_mpfr_float.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:mpfr_float mpfr_float]\n\n`#include <boost/multiprecision/mpfr.hpp>`\n\n   namespace boost{ namespace multiprecision{\n\n   enum mpfr_allocation_type\n   {\n      allocate_stack,\n      allocate_dynamic\n   };\n\n   template <unsigned Digits10, mpfr_allocation_type AllocateType = allocate_dynamic>\n   class mpfr_float_backend;\n\n   typedef number<mpfr_float_backend<50> >    mpfr_float_50;\n   typedef number<mpfr_float_backend<100> >   mpfr_float_100;\n   typedef number<mpfr_float_backend<500> >   mpfr_float_500;\n   typedef number<mpfr_float_backend<1000> >  mpfr_float_1000;\n   typedef number<mpfr_float_backend<0> >     mpfr_float;\n\n   typedef number<mpfr_float_backend<50, allocate_stack> >    static_mpfr_float_50;\n   typedef number<mpfr_float_backend<100, allocate_stack> >   static_mpfr_float_100;\n\n   }} // namespaces\n\nThe `mpfr_float_backend` type is used in conjunction with `number`: It acts as a thin wrapper around the [mpfr] `mpfr_t`\nto provide an real-number type that is a drop-in replacement for the native C++ floating-point types, but with\nmuch greater precision.\n\nType `mpfr_float_backend` can be used at fixed precision by specifying a non-zero `Digits10` template parameter, or\nat variable precision by setting the template argument to zero.  The typedefs mpfr_float_50, mpfr_float_100,\nmpfr_float_500, mpfr_float_1000 provide arithmetic types at 50, 100, 500 and 1000 decimal digits precision\nrespectively.  The typedef mpfr_float provides a variable precision type whose precision can be controlled via the\n`number`s member functions.\n\nIn addition the second template parameter lets you choose between dynamic allocation (the default,\nand uses MPFR's normal allocation routines),\nor stack allocation (where all the memory required for the underlying data types is stored\nwithin `mpfr_float_backend`).  The latter option can result in significantly faster code, at the\nexpense of growing the size of `mpfr_float_backend`.  It can only be used at ['fixed precision], and\nshould only be used for lower digit counts.  Note that we can not guarantee that using `allocate_stack`\nwon't cause any calls to `mpfr`'s allocation routines, as `mpfr` may call these inside its own code.\nThe following table gives an idea of the performance tradeoff's at 50 decimal digits\nprecision[footnote Compiled with VC++10 and /Ox, with MPFR-3.0.0 and MPIR-2.3.0]:\n\n[table\n[[Type][Bessel function evaluation, relative times]]\n[[`number<mpfr_float_backend<50, allocate_static>, et_on>`][1.0 (5.5s)]]\n[[`number<mpfr_float_backend<50, allocate_static>, et_off>`][1.05 (5.8s)]]\n[[`number<mpfr_float_backend<50, allocate_dynamic>, et_on>`][1.05 (5.8s)]]\n[[`number<mpfr_float_backend<50, allocate_dynamic>, et_off>`][1.16 (6.4s)]]\n]\n\n[note This type only provides `numeric_limits` support when the precision is fixed at compile time.]\n\nAs well as the usual conversions from arithmetic and string types, instances of `number<mpfr_float_backend<N> >` are\ncopy constructible and assignable from:\n\n* The [gmp] native types `mpf_t`, `mpz_t`, `mpq_t`.\n* The [mpfr] native type `mpfr_t`.\n* The `number` wrappers around those types: `number<mpfr_float_backend<M> >`, `number<mpf_float<M> >`, `number<gmp_int>`, `number<gmp_rational>`.\n\nIt's also possible to access the underlying `mpfr_t` via the data() member function of `mpfr_float_backend`.\n\nThings you should know when using this type:\n\n* A default constructed `mpfr_float_backend` is set to zero (['Note that this is [*not] the default [mpfr] behavior]).\n* All operations use round to nearest.\n* No changes are made to [gmp] or [mpfr] global settings, so this type can coexist with existing\n[mpfr] or [gmp] code.\n* The code can equally use [mpir] in place of [gmp] - indeed that is the preferred option on Win32.\n* This backend supports rvalue-references and is move-aware, making instantiations of `number` on this backend move aware.\n* Conversion from a string results in a `std::runtime_error` being thrown if the string can not be interpreted\nas a valid floating-point number.\n* Division by zero results in an infinity.\n* When using the variable precision type `mpfr_float`, then copy construction and assignment ['copies the precision\nof the source variable].  Likewise move construction and assignment.\n* When constructing the variable precision type `mpfr_float` you can specify two arguments to the constructor - the first\nis the value to assign to the variable, the second is an unsigned integer specifying the precision in decimal places.  The\n`assign` member function similarly has a 2-argument overload taking the value to assign and the precision.  You can use this\nto preserve the precision of the target variable using the somewhat arcane: `a.assign(b, a.precision())`, which assigns `b` to `a`\nbut preserves the precision of `a`.\n\n[h5 [mpfr] example:]\n\n[mpfr_eg]\n\n[endsect] [/section:mpfr_float mpfr_float]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_new_backend.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:new_backend Writing a New Backend]\n\nThe formal requirements for a backend to class `number` are given in the reference, but to help\nspeed and simplify the process there is a header [@../../test/skeleton_backend.hpp skeleton_backend.hpp]\nwhere all the methods needed to be written are declared but nothing is implemented.  The process of\nwriting a new backend then simplifies to:\n\n* Save skeleton_backend.hpp under a new name and change its #include guards to match.\n* Search and replace `skeleton_backend` to the name of the new backend type.\n* Fill in the blanks in the class definition and for the compulsary non-members.\n* Don't forget to mark the functions as `inline`, `constexpr` and `noexcept` as required.\n* Optionally fill in some of the optional methods - the header declares these in rather\n  verbose form, for example with overloads for every single arithmetic type.  No sane backend\n  would ever implement all of these, just choose the ones that make sense and leave the others.\n* Add convenience typedefs for the actual instantiation(s) of class `number` that will use the new backend.\n\nTo test the new backend, start with a basic arithmetic test, this is a test case under `libs/math/test`\nthat looks something like:\n\n   #include <boost/multiprecision/my_new_number_type.hpp>\n   #include \"test_arithmetic.hpp\"\n\n   int main()\n   {\n      test<boost::multiprecision::my_new_number_type>();\n      return boost::report_errors();\n   }\n\nThis will basically \"instantiate everything\", and perform a few runtime sanity checks; it is a very good test that you have written legal code!\n\nYou should also create a \"header include test\" that verifies that the new header includes everything it should, see \n[@../../test/include_test/mpfr_include_test.cpp mpfr_include_test.cpp] for an example.\n\nFor integer types, you should add the new type to at least the following tests as well:\n\n* test_hash.cpp\n* test_int_io.cpp\n* test_move.cpp\n* test_numeric_limits.cpp\n\nFor floating point types, you should add the new type to at least the following tests as well:\n\n* test_acos.cpp\n* test_asin.cpp\n* test_atan.cpp\n* test_constants.cpp\n* test_cos.cpp\n* test_cosh.cpp\n* test_exp.cpp\n* test_float_io.cpp\n* test_fpclassify.cpp\n* test_hash.cpp\n* test_log.cpp\n* test_move.cpp\n* test_numeric_limits.cpp\n* test_pow.cpp\n* test_round.cpp\n* test_sf_import_c99.cpp\n* test_sin.cpp\n* test_sinh.cpp\n* test_sqrt.cpp\n* test_tan.cpp\n* test_tanh.cpp\n* concepts/number_concept_check.cpp\n* concepts/sf_concept_check_basic.cpp\n* concepts/sf_concept_check_bessel.cpp\n* concepts/sf_concept_check_beta.cpp\n* concepts/sf_concept_check_beta_2.cpp\n* concepts/sf_concept_check_beta_3.cpp\n* concepts/sf_concept_check_elliptic.cpp\n* concepts/sf_concept_check_gamma.cpp\n* concepts/sf_concept_check_poly.cpp\n\n[endsect] [/section:new_backend Writing a New Backend]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_numeric_limits.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:limits Numeric Limits]\n\nBoost.Multiprecision tries hard to implement `std::numeric_limits` for all types\nas far as possible and meaningful because experience with Boost.Math has shown that this aids portability.\n\nThe [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf C++ standard library]\ndefines `std::numeric_limits` in section 18.3.2.\n\nThis in turn refers to the C standard\n[@http://www.open-std.org/jtc1/sc22/wg11/docs/n507.pdf SC22/WG11 N507 DRAFT INTERNATIONAL ISO/IEC STANDARD\n WD 10967-1]\nInformation technology Language independent arithmetic Part 1: Integer and floating-point arithmetic.\n\nThat C Standard in turn refers to\n\n[@https://doi.org/10.1109/IEEESTD.1985.82928 IEEE754 IEEE Standard for Binary\nFloating-Point Arithmetic]\n\nThere is a useful summary of `std::numeric_limits` at\n[@http://www.cplusplus.com/reference/limits/numeric_limits/ C++ reference].\n\nThe chosen backend often determines how completely `std::numeric_limits` is available.\n\nCompiler options, processor type, and definition of macros or assembler instructions to control denormal numbers will alter\nthe values in the tables given below.\n\n[warning GMP's extendable floatin-point `mpf_t` does not have a concept of overflow:\noperations that lead to overflow eventually run of out of resources\nand terminate with stack overflow (often after several seconds).]\n\n[section:constants std::numeric_limits<>  constants]\n\n[h4 is_specialized]\n\n`true` for all arithmetic types (integer, floating and fixed-point)\nfor which `std::numeric_limits<T>::numeric_limits` is specialized.\n\nA typical test is\n\n  if (std::numeric_limits<T>::is_specialized == false)\n  {\n    std::cout << \"type \" << typeid(T).name()  << \" is not specialized for std::numeric_limits!\" << std::endl;\n  // ...\n  }\n\nTypically `numeric_limits<T>::is_specialized` is `true` for all `T` where the compile-time constant\nmembers of `numeric_limits` are indeed known at compile time, and don't vary at runtime.  For example\nfloating-point types with runtime-variable precision such as `mpfr_float` have no `numeric_limits`\nspecialization as it would be impossible to define all the members at compile time.  In contrast\nthe precision of a type such as `mpfr_float_50` is known at compile time, and so it ['does] have a\n`numeric_limits` specialization.\n\nNote that not all the `std::numeric_limits` member constants and functions are meaningful for all user-defined types (UDT),\nsuch as the decimal and binary multiprecision types provided here.  More information on this is given in the sections below.\n\n[h4 infinity]\n\nFor floating-point types, [infin] is defined wherever possible,\nbut clearly infinity is meaningless for __arbitrary_precision arithmetic backends,\nand there is one floating-point type (GMP's `mpf_t`, see __mpf_float) which has no notion\nof infinity or NaN at all.\n\nA typical test whether infinity is implemented is\n\n  if(std::numeric_limits<T>::has_infinity)\n  {\n     std::cout << std::numeric_limits<T>::infinity() << std::endl;\n  }\n\nand using tests like this is strongly recommended to improve portability.\n\n[warning If the backend is switched to a type that does not support infinity (or similarly NaNs) then,\nwithout checks like this, there will be trouble.]\n\n[h4 is_signed]\n\n`std::numeric_limits<T>::is_signed == true` if the type `T` is signed.\n\nFor __fundamental binary types, the sign is held in a single bit,\nbut for other types (`cpp_dec_float` and `cpp_bin_float`)\nit may be a separate storage element, usually `bool`.\n\n[h4 is_exact]\n\n`std::numeric_limits<T>::is_exact == true` if type T uses exact representations.\n\nThis is defined as `true` for all integer types and `false` for floating-point types.\n\n[@http://stackoverflow.com/questions/14203654/stdnumeric-limitsis-exact-what-is-a-usable-definition A usable definition]\nhas been discussed.\n\nISO/IEC 10967-1, Language independent arithmetic, noted by the C++ Standard defines\n\n  A floating-point type F shall be a finite subset of [real].\n\nThe important practical distinction is that all integers (up to `max()`) can be stored exactly.\n\n[@http://en.wikipedia.org/wiki/Rational_number Rational]\ntypes using two integer types are also exact.\n\nFloating-point types [*cannot store all real values]\n(those in the set of [real]) [*exactly].\nFor example, 0.5 can be stored exactly in a binary floating-point, but 0.1 cannot.\nWhat is stored is the nearest representable real value, that is, rounded to nearest.\n\nFixed-point types (usually decimal) are also defined as exact, in that they only\nstore a [*fixed precision], so half cents or pennies (or less) cannot be stored.\nThe results of computations are rounded up or down,\njust like the result of integer division stored as an integer result.\n\nThere are number of proposals to\n[@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3407.html\nadd Decimal floating-point Support to C++].\n\n[@http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2849.pdf Decimal TR].\n\nAnd also\n[@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3352.html\nC++ Binary Fixed-Point Arithmetic].\n\n[h4 is_bounded]\n\n`std::numeric_limits<T>::is_bounded == true` if the set of values represented by the type `T` is finite.\n\nThis is `true` for all __fundamental_type integer, fixed and floating-point types,\nand most multi-precision types.\n\nIt is only `false` for a few __arbitrary_precision types like `cpp_int`.\n\nRational and fixed-exponent representations are exact but not integer.\n\n[h4 is_modulo]\n\n`std::numeric_limits<T>::is_modulo` is defined as `true` if adding two positive values of type T\ncan yield a result less than either value.\n\n`is_modulo == true` means that the type does not overflow, but, for example,\n'wraps around' to zero, when adding one to the `max()` value.\n\nFor most __fundamental integer types, `std::numeric_limits<>::is_modulo` is `true`.\n\n`bool` is the only exception.\n\nThe modulo behaviour is sometimes useful,\nbut also can be unexpected, and sometimes undesired, behaviour.\n\nOverflow of signed integers can be especially unexpected,\npossibly causing change of sign.\n\nBoost.Multiprecision integer type `cpp_int` is not modulo\nbecause as an __arbitrary_precision types,\nit expands to hold any value that the machine resources permit.\n\nHowever fixed precision __cpp_int's may be modulo if they are unchecked\n(i.e. they behave just like __fundamental integers), but not if they are checked\n(overflow causes an exception to be raised).\n\n__fundamental and multi-precision floating-point types are normally not modulo.\n\nWhere possible, overflow is to `std::numeric_limits<>::infinity()`,\nprovided `std::numeric_limits<>::has_infinity == true`.\n\n[h4 radix]\n\nConstant `std::numeric_limits<T>::radix` returns either 2 (for __fundamental and binary types)\nor 10 (for decimal types).\n\n[h4 digits]\n\nThe number of `radix` digits that be represented without change:\n\n* for integer types, the number of [*non-sign bits] in the significand.\n* for floating types, the number of [*radix digits] in the significand.\n\nThe values include any implicit bit, so for example, for the ubiquious\n`double` using 64 bits\n([@http://en.wikipedia.org/wiki/Double_precision_floating-point_format IEEE binary64 ]),\n`digits` == 53, even though there are only 52 actual bits of the significand stored in the representation.\nThe value of `digits` reflects the fact that there is one implicit bit which is always set to 1.\n\nThe Boost.Multiprecision binary types do not use an implicit bit, so the\n`digits` member reflects exactly how many bits of precision were requested:\n\n  typedef number<cpp_bin_float<53, digit_base_2> >   float64;\n  typedef number<cpp_bin_float<113, digit_base_2> >  float128;\n  std::numeric_limits<float64>::digits == 53.\n  std::numeric_limits<float128>::digits == 113.\n\nFor the most common case of `radix == 2`,\n`std::numeric_limits<T>::digits` is the number of bits in the representation,\nnot counting any sign bit.\n\nFor a decimal integer type, when `radix == 10`, it is the number of decimal digits.\n\n[h4 digits10]\n\nConstant `std::numeric_limits<T>::digits10` returns the number of\ndecimal digits that can be represented without change or loss.\n\nFor example, `numeric_limits<unsigned char>::digits10` is 2.\n\nThis somewhat inscrutable definition means that an `unsigned char`\ncan hold decimal values `0..99`\nwithout loss of precision or accuracy, usually from truncation.\n\nHad the definition been 3 then that would imply it could hold 0..999,\nbut as we all know, an 8-bit `unsigned char` can only hold 0..255,\nand an attempt to store 256 or more will involve loss or change.\n\nFor bounded integers, it is thus [*one less] than number of decimal digits\nyou need to display the biggest integer `std::numeric_limits<T>::max()`.\nThis value can be used to predict the layout width required for\n\n[digits10_1]\n\nFor example, `unsigned short` is often stored in 16 bits,\nso the maximum value is 0xFFFF or 65535.\n\n[digits10_2]\n\n\nFor bounded floating-point types,\nif we create a `double` with a value with `digits10` (usually 15) decimal digits,\n`1e15` or `1000000000000000` :\n\n[digits10_3]\n\nand we can increment this value to `1000000000000001`\nas expected and show the difference too.\n\nBut if we try to repeat this with more than `digits10` digits,\n\n[digits10_4]\n\nthen we find that when we add one it has no effect,\nand display show that there is loss of precision. See\n[@http://en.wikipedia.org/wiki/Loss_of_significance Loss of significance or cancellation error].\n\nSo `digits10` is the number of decimal digits [*guaranteed] to be correct.\n\nFor example, 'round-tripping' for `double`:\n\n* If a decimal string with at most `digits10`( == 15) significant decimal digits\nis converted to `double` and then converted back to the\nsame number of significant decimal digits,\nthen the final string will match the original 15 decimal digit string.\n* If a `double` floating-point number is converted to a decimal string\nwith at least 17 decimal digits\nand then converted back to `double`,\nthen the result will be binary identical to the original `double` value.\n\nFor most purposes, you will much more likely want\n`std::numeric_limits<>::max_digits10`,\nthe number of decimal digits that ensure that a change of one least significant bit (__ULP)\nproduces a different decimal digits string.\n\nFor the most common `double` floating-point type,`max_digits10` is `digits10+2`,\nbut you should use C++11 `max_digits10`\nwhere possible (see [link boost_multiprecision.tut.limits.constants.max_digits10 below]).\n\n[h4:max_digits10 max_digits10]\n\n`std::numeric_limits<T>::max_digits10` was added for floating-point\nbecause `digits10` decimal digits are insufficient to show\na least significant bit (ULP) change giving puzzling displays like\n\n  0.666666666666667 != 0.666666666666667\n\nfrom failure to 'round-trip', for example:\n\n[max_digits10_2]\n\nIf you wish to ensure that a change of one least significant bit (ULP)\nproduces a different decimal digits string,\nthen `max_digits10` is the precision to use.\n\nFor example:\n\n[max_digits10_3]\n\nwill display [pi] to the maximum possible precision using a `double`.\n\n[max_digits10_4]\n\nFor integer types, `max_digits10` is implementation-dependent,\nbut is usually `digits10 + 2`.\nThis is the output field-width required for the maximum value of the type T\n`std::numeric_limits<T>::max()` ['including a sign and a space].\n\nSo this will produce neat columns.\n\n  std::cout << std::setw(std::numeric_limits<int>::max_digits10) ...\n\nThe extra two or three least-significant digits are 'noisy' and may be junk,\nbut if you want to 'round-trip' - printing a value out as a decimal digit string and reading it back in -\n(most commonly during serialization and de-serialization)\nyou must use `os.precision(std::numeric_limits<T>::max_digits10)`.\n\n[note For Microsoft Visual Studio 2010,\n`std::numeric_limits<float>::max_digits10` is wrongly defined as 8. It should be 9.\n]\n\n[note For Microsoft Visual Studio before 2013 and the default floating-point\nformat, a small range of double-precision floating-point values with a\nsignificand of approximately 0.0001 to 0.004 and exponent values of 1010 to\n1014 do not round-trip exactly being off by one least significant bit,\nfor probably every third value of the significand.\n\nA workaround is using the scientific or exponential format `std::scientific`.\n\nOther older compilers also fail to implement round-tripping entirely fault-free, for example, see\n[@https://www.exploringbinary.com/incorrectly-rounded-conversions-in-gcc-and-glibc/  Incorrectly Rounded Conversions in GCC and GLIBC].\n\nFor more details see\n[@https://www.exploringbinary.com/incorrect-round-trip-conversions-in-visual-c-plus-plus/ Incorrect Round-Trip Conversions in Visual C++],\nand references therein\nand\n[@https://arxiv.org/pdf/1310.8121.pdf  Easy Accurate Reading and Writing of Floating-Point Numbers, Aubrey Jaffer (August 2018)].\n\nMicrosoft VS2017 and other recent compilers, now use the\n[@https://doi.org/10.1145/3192366.3192369 Ryu fast float-to-string conversion by Ulf Adams]\nalgorithm, claimed to be both exact and fast for 32 and 64-bit floating-point numbers.\n] [/note]\n\n[h4 round_style]\n\nThe rounding style determines how the result of floating-point operations\nis treated when the result cannot be [*exactly represented] in the significand.\nVarious rounding modes may be provided:\n\n* round to nearest up or down (default for floating-point types).\n* round up (toward positive infinity).\n* round down (toward negative infinity).\n* round toward zero (integer types).\n* no rounding (if decimal radix).\n* rounding mode is not determinable.\n\nFor integer types, `std::numeric_limits<T>::round_style` is always towards zero, so\n\n  std::numeric_limits<T>::round_style == std::round_to_zero;\n\nA decimal type, `cpp_dec_float` rounds in no particular direction,\nwhich is to say it doesn't round at all.\nAnd since there are several guard digits,\nit's not really the same as truncation (round toward zero) either.\n\nFor floating-point types, it is normal to round to nearest.\n\n  std::numeric_limits<T>::round_style == std::round_to_nearest;\n\nSee function `std::numeric_limits<T>::round_error` for the maximum error (in ULP)\nthat rounding can cause.\n\n[h4 has_denorm_loss]\n\n`true` if a loss of precision is detected as a\n[@http://en.wikipedia.org/wiki/Denormalization denormalization] loss,\nrather than an inexact result.\n\nAlways `false` for integer types.\n\n`false` for all types which do not have `has_denorm` == `std::denorm_present`.\n\n[h4 denorm_style]\n\n[@http://en.wikipedia.org/wiki/Denormal_number Denormalized values] are\nrepresentations with a variable number of exponent bits that can permit\ngradual underflow, so that, if type T is `double`.\n\n std::numeric_limits<T>::denorm_min() < std::numeric_limits<T>::min()\n\nA type may have any of the following `enum float_denorm_style` values:\n\n* `std::denorm_absent`, if it does not allow denormalized values.\n(Always used for all integer and exact types).\n* `std::denorm_present`, if the floating-point type allows denormalized values.\n*`std::denorm_indeterminate`, if indeterminate at compile time.\n\n[h4 Tinyness before rounding]\n\n`bool std::numeric_limits<T>::tinyness_before`\n\n`true` if a type can determine that a value is too small\nto be represent as a normalized value before rounding it.\n\nGenerally true for `is_iec559` floating-point __fundamantal types,\nbut false for integer types.\n\nStandard-compliant IEEE 754 floating-point implementations may detect the floating-point underflow at three predefined moments:\n\n# After computation of a result with absolute value smaller than\n`std::numeric_limits<T>::min()`,\nsuch implementation detects ['tinyness before rounding] (e.g. UltraSparc).\n\n# After rounding of the result to `std::numeric_limits<T>::digits` bits,\nif the result is tiny, such implementation detects ['tinyness after rounding]\n(e.g. SuperSparc).\n\n# If the conversion of the rounded tiny result to subnormal form\nresulted in the loss of precision, such implementation detects ['denorm loss].\n\n[endsect] [/section:constants std::numeric_limits<> Constants]\n\n[section:functions `std::numeric_limits<>` functions]\n\n[h4:max_function `max` function]\n\nFunction `(std::numeric_limits<T>::max)()` returns the largest finite value\nthat can be represented by the type T.  If there is no such value (and\n`numeric_limits<T>::bounded` is `false`) then returns `T()`.\n\nFor __fundamental types there is usually a corresponding MACRO value TYPE_MAX,\nwhere TYPE is CHAR, INT, FLOAT etc.\n\nOther types, including those provided by a typedef,\nfor example `INT64_T_MAX` for `int64_t`, may provide a macro definition.\n\nTo cater for situations where no `numeric_limits` specialization is available\n(for example because the precision of the type varies at runtime),\npackaged versions of this (and other functions) are provided using\n\n  #include <boost/math/tools/precision.hpp>\n\n  T = boost::math::tools::max_value<T>();\n\nOf course, these simply use `(std::numeric_limits<T>::max)()` if available,\nbut otherwise 'do something sensible'.\n\n[h4 lowest function]\n\nSince C++11: `std::numeric_limits<T>::lowest()` is\n\n* For integral types, the same as function `min()`.\n* For floating-point types, generally the negative of `max()`\n(but implementation-dependent).\n\n[digits10_5]\n\n[h4:min_function `min` function]\n\nFunction `(std::numeric_limits<T>::min)()` returns the minimum finite value\nthat can be represented by the type T.\n\nFor __fundamental types, there is usually a corresponding MACRO value TYPE_MIN,\nwhere TYPE is CHAR, INT, FLOAT etc.\n\nOther types, including those provided by a `typedef`,\nfor example, `INT64_T_MIN` for `int64_t`, may provide a macro definition.\n\nFor floating-point types,\nit is more fully defined as the ['minimum positive normalized value].\n\nSee `std::numeric_limits<T>::denorm_min()` for the smallest denormalized value, provided\n\n  std::numeric_limits<T>::has_denorm == std::denorm_present\n\nTo cater for situations where no `numeric_limits` specialization is available\n(for example because the precision of the type varies at runtime),\npackaged versions of this (and other functions) are provided using\n\n  #include <boost/math/tools/precision.hpp>\n\n  T = boost::math::tools::min_value<T>();\n\nOf course, these simply use `std::numeric_limits<T>::min()` if available.\n\n[h4 denorm_min function]\n\nFunction `std::numeric_limits<T>::denorm_min()`\nreturns the smallest\n[@http://en.wikipedia.org/wiki/Denormal_number denormalized value],\nprovided\n\n  std::numeric_limits<T>::has_denorm == std::denorm_present\n\n[denorm_min_1]\n\nThe exponent is effectively reduced from -308 to -324\n(though it remains encoded as zero and leading zeros appear in the significand,\nthereby losing precision until the significand reaches zero).\n\n[h4 round_error]\n\nFunction `std::numeric_limits<T>::round_error()` returns the maximum error\n(in units of __ULP)\nthat can be caused by any basic arithmetic operation.\n\n  round_style == std::round_indeterminate;\n\nThe rounding style is indeterminable at compile time.\n\nFor floating-point types, when rounding is to nearest,\nonly half a bit is lost by rounding, and `round_error == 0.5`.\nIn contrast when rounding is towards zero, or plus/minus infinity,\nwe can loose up to one bit from rounding, and `round_error == 1`.\n\nFor integer types, rounding always to zero, so at worst almost one bit can be rounded,\nso `round_error == 1`.\n\n`round_error()` can be used with `std::numeric_limits<T>::epsilon()` to estimate\nthe maximum potential error caused by rounding.  For typical floating-point types,\n`round_error() = 1/2`, so half epsilon is the maximum potential error.\n\n[round_error_1]\n\nThere are, of course, many occasions when much bigger loss of precision occurs,\nfor example, caused by\n[@http://en.wikipedia.org/wiki/Loss_of_significance Loss of significance or cancellation error]\nor very many iterations.\n\n[h4:epsilon epsilon]\n\nFunction `std::numeric_limits<T>::epsilon()` is meaningful only for non-integral types.\n\nIt returns the difference between `1.0` and the next value representable\nby the floating-point type T.\nSo it is a one least-significant-bit change in this floating-point value.\n\nFor `double` (`float_64t`) it is `2.2204460492503131e-016`\nshowing all possibly significant 17 decimal digits.\n\n[epsilon_1]\n\nWe can explicitly increment by one bit using the function `boost::math::float_next()`\nand the result is the same as adding `epsilon`.\n\n[epsilon_2]\n\nAdding any smaller value, like half `epsilon`,  will have no effect on this value.\n\n[epsilon_3]\n\nSo this cancellation error leaves the values equal, despite adding half `epsilon`.\n\nTo achieve greater portability over platform and floating-point type,\nBoost.Math and Boost.Multiprecision provide a package of functions that\n'do something sensible' if the standard `numeric_limits` is not available.\nTo use these `#include <boost/math/tools/precision.hpp>`.\n\n[epsilon_4]\n\n[h5:FP_tolerance Tolerance for Floating-point Comparisons]\n\n[@https://en.wikipedia.org/wiki/Machine_epsilon Machine epsilon [epsilon]]\nis very useful to compute a tolerance when comparing floating-point values,\na much more difficult task than is commonly imagined.\n\nThe C++ standard specifies [@https://en.cppreference.com/w/cpp/types/numeric_limits/epsilon  `std::numeric_limits<>::epsilon()`]\nand Boost.Multiprecision implements this (where possible) for its program-defined types analogous to the\n__fundamental floating-point types like `double` `float`.\n\nFor more information than you probably want (but still need) see\n[@http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html What Every Computer Scientist Should Know About Floating-Point Arithmetic]\n\nThe naive test comparing the absolute difference between two values and a tolerance\ndoes not give useful results if the values are too large or too small.\n\nSo Boost.Test uses an algorithm first devised by Knuth\nfor reliably checking if floating-point values are close enough.\n\nSee Donald. E. Knuth. The art of computer programming (vol II).\nCopyright 1998 Addison-Wesley Longman, Inc., 0-201-89684-2.\nAddison-Wesley Professional; 3rd edition. (The relevant equations are in paragraph 4.2.2, Eq. 36 and 37.)\n\nSee [@https://www.boost.org/doc/libs/release/libs/test/doc/html/boost_test/testing_tools/extended_comparison/floating_point/floating_points_comparison_theory.html Boost.Math floating_point comparison]\nfor more details.\n\nSee also:\n\n[@http://adtmag.com/articles/2000/03/15/comparing-floats-how-to-determine-if-floating-quantities-are-close-enough-once-a-tolerance-has-been.aspx Alberto Squassia, Comparing floats]\n\n[@http://adtmag.com/articles/2000/03/16/comparing-floats-how-to-determine-if-floating-quantities-are-close-enough-once-a-tolerance-has-been.aspx Alberto Squassia, Comparing floats code]\n\n[@https://www.boost.org/doc/libs/release/libs/test/doc/html/boost_test/testing_tools/extended_comparison/floating_point.html Boost.Test Floating-Point_Comparison]\n\n[tolerance_1]\n\nused thus:\n\n  cd ./test\n  BOOST_CHECK_CLOSE_FRACTION(expected, calculated, tolerance);\n\n(There is also a version BOOST_CHECK_CLOSE using tolerance as a [*percentage] rather than a fraction;\nusually the fraction version is simpler to use).\n\n[tolerance_2]\n\n[h4:infinity Infinity - positive and negative]\n\nFor floating-point types only, for which\n`std::numeric_limits<T>::has_infinity == true`,\nfunction `std::numeric_limits<T>::infinity()`\nprovides an implementation-defined representation for [infin].\n\nThe 'representation' is a particular bit pattern reserved for infinity.\nFor IEEE754 system (for which `std::numeric_limits<T>::is_iec559 == true`)\n[@http://en.wikipedia.org/wiki/IEEE_754-1985#Positive_and_negative_infinity positive and negative infinity]\nare assigned bit patterns for all defined floating-point types.\n\nConfusingly, the string resulting from outputting this representation, is also\nimplementation-defined. And the string that can be input to generate the representation is also implementation-defined.\n\nFor example, the output is `1.#INF` on Microsoft systems, but `inf` on most *nix platforms.\n\nThis implementation-defined-ness has hampered use of infinity (and NaNs)\nbut __Boost_Math and __Boost_Multiprecision work hard to provide a sensible representation\nfor [*all] floating-point types, not just the __fundamental_types,\nwhich with the use of suitable facets to define the input and output strings, makes it possible\nto use these useful features portably and including __Boost_Serialization.\n\n[h4 Not-A-Number NaN]\n\n[h5 Quiet_NaN]\n\nFor floating-point types only, for which\n`std::numeric_limits<T>::has_quiet_NaN == true`,\nfunction `std::numeric_limits<T>::quiet_NaN()`\nprovides an implementation-defined representation for NaN.\n\n[@http://en.wikipedia.org/wiki/NaN NaNs] are values to indicate that the\nresult of an assignment or computation is meaningless.\nA typical example is `0/0` but there are many others.\n\nNaNs may also be used, to represent missing values: for example,\nthese could, by convention, be ignored in calculations of statistics like means.\n\nMany of the problems with a representation for\n[@http://en.wikipedia.org/wiki/NaN Not-A-Number] has hampered portable use,\nsimilar to those with infinity.\n\n[nan_1]\n\nBut using Boost.Math and suitable facets can permit portable use\nof both NaNs and positive and negative infinity.\n\n[facet_1]\n\n[h5 Signaling NaN]\n\nFor floating-point types only, for which\n`std::numeric_limits<T>::has_signaling_NaN == true`,\nfunction `std::numeric_limits<T>::signaling_NaN()`\nprovides an implementation-defined representation for NaN that causes a hardware trap.\nIt should be noted however, that at least one implementation of this function causes a hardware\ntrap to be triggered simply by calling `std::numeric_limits<T>::signaling_NaN()`, and not only\nby using the value returned.\n\n[endsect] [/section:functions std::numeric_limits<>  functions]\n\n[/ Tables of values for numeric_limits for various __fundamental and cpp_bin_float types]\n[include numeric_limits_32_tables.qbk]\n[/include numeric_limits_64_tables.qbk]\n\n[section:how_to_tell How to Determine the Kind of a Number From `std::numeric_limits`]\n\nBased on the information above, one can see that different kinds of numbers can be\ndifferentiated based on the information stored in `std::numeric_limits`.  This is\nin addition to the traits class [link boost_multiprecision.ref.number.traits_class_support\nnumber_category] provided by this library.\n\n[h4 Integer Types]\n\nFor an integer type T, all of the following conditions hold:\n\n   std::numeric_limits<T>::is_specialized == true\n   std::numeric_limits<T>::is_integer == true\n   std::numeric_limits<T>::is_exact == true\n   std::numeric_limits<T>::min_exponent == 0\n   std::numeric_limits<T>::max_exponent == 0\n   std::numeric_limits<T>::min_exponent10 == 0\n   std::numeric_limits<T>::max_exponent10 == 0\n\nIn addition the type is /signed/ if:\n\n   std::numeric_limits<T>::is_signed == true\n\nIf the type is arbitrary precision then:\n\n   std::numeric_limits<T>::is_bounded == false\n\nOtherwise the type is bounded, and returns a non zero value\nfrom:\n\n   std::numeric_limits<T>::max()\n\nand has:\n\n   std::numeric_limits<T>::is_modulo == true\n\nif the type implements modulo arithmetic on overflow.\n\n[h4 Rational Types]\n\nRational types are just like integers except that:\n\n   std::numeric_limits<T>::is_integer == false\n\n[h4 Fixed Precision Types]\n\nThere appears to be no way to tell these apart from rational types, unless they set:\n\n   std::numeric_limits<T>::is_exact == false\n\nThis is because these types are in essence a rational type with a fixed denominator.\n\n[h4 floating-point Types]\n\nFor a floating-point type T, all of the following conditions hold:\n\n   std::numeric_limits<T>::is_specialized == true\n   std::numeric_limits<T>::is_integer == false\n   std::numeric_limits<T>::is_exact == false\n   std::numeric_limits<T>::min_exponent != 0\n   std::numeric_limits<T>::max_exponent != 0\n   std::numeric_limits<T>::min_exponent10 != 0\n   std::numeric_limits<T>::max_exponent10 != 0\n\nIn addition the type is /signed/ if:\n\n   std::numeric_limits<T>::is_signed == true\n\nAnd the type may be decimal or binary depending on the value of:\n\n   std::numeric_limits<T>::radix\n\nIn general, there are no arbitrary precision floating-point types, and so:\n\n   std::numeric_limits<T>::is_bounded == false\n\n[h4 Exact floating-point Types]\n\nExact floating-point types are a [@http://en.wikipedia.org/wiki/Field_%28mathematics%29 field]\ncomposed of an arbitrary precision integer scaled by an exponent.  Such types\nhave no division operator and are the same as floating-point types except:\n\n      std::numeric_limits<T>::is_exact == true\n\n[h4 Complex Numbers]\n\nFor historical reasons, complex numbers do not specialize `std::numeric_limits`, instead you must\ninspect `std::numeric_limits<typename T::value_type>`.\n\n[endsect] [/section:how_to_tell How to Determine the Kind of a Number From `std::numeric_limits`]\n\n[endsect] [/section:limits Numeric Limits]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_primality.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:primetest Primality Testing]\n\nThe library implements a Miller-Rabin test for primality:\n\n   #include <boost/multiprecision/miller_rabin.hpp>\n\n   template <class Backend, expression_template_option ExpressionTemplates, class Engine>\n   bool miller_rabin_test(const number<Backend, ExpressionTemplates>& n, unsigned trials, Engine& gen);\n\n   template <class Backend, expression_template_option ExpressionTemplates, class Engine>\n   bool miller_rabin_test(const number<Backend, ExpressionTemplates>& n, unsigned trials);\n\nThese functions perform a Miller-Rabin test for primality, if the result is `false` then /n/ is definitely composite,\nwhile if the result is true then n is probably prime. The probability to declare a composite n as probable prime is\nat most 0.25[super trials]. Note that this does not allow a statement about the probability of n being actually\nprime (for that, the prior probability would have to be known).  The algorithm used performs some\ntrial divisions to exclude small prime factors, does one Fermat test to exclude many more composites, and then\nuses the Miller-Rabin algorithm straight out of\nKnuth Vol 2, which recommends 25 trials for a pretty strong likelihood that /n/ is prime.\n\nThe third optional argument is for a Uniform Random Number Generator from Boost.Random.  When not provided the `mt19937`\ngenerator is used.   Note that when producing random primes then you should probably use a different random number generator\nto produce candidate prime numbers for testing, than is used internally by `miller_rabin_test` for determining\nwhether the value is prime.  It also helps of course to seed the generators with some source of randomness.\n\nThe following example searches for a prime `p` for which `(p-1)/2` is also probably prime:\n\n[safe_prime]\n\n[endsect] [/section:primetest Primality Testing]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_random.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:random Generating Random Numbers]\n\nRandom numbers are generated in conjunction with Boost.Random.\n\nThere is a single generator that supports generating random integers with large bit counts:\n[@http://www.boost.org/doc/html/boost/random/independent_bits_engine.html `independent_bits_engine`].\nThis type can be used with either ['unbounded] integer types, or with ['bounded] (ie fixed precision) unsigned integers:\n\n[random_eg1]\n\nProgram output is:\n\n[random_eg1_out]\n\nIn addition, the generator adaptors [@http://www.boost.org/doc/html/boost/random/discard_block_engine.html `discard_block`],\n[@http://www.boost.org/doc/html/boost/random/xor_combine_engine.html `xor_combine_engine`] and\n[@http://www.boost.org/doc/html/boost/random/discrete_distribution.html `discrete_distribution`] can be used\nwith multiprecision types.  Note that if you seed an `independent_bits_engine`, then you are actually seeding\nthe underlying generator, and should therefore provide a sequence of unsigned 32-bit values as the seed.\n\nAlternatively we can generate integers in a given range using\n[@http://www.boost.org/doc/html/boost/random/uniform_int_distribution.html `uniform_int_distribution`], this will\ninvoke the underlying engine multiple times to build up the required number of bits in the result:\n\n[random_eg2]\n\n[random_eg2_out]\n\nIt is also possible to use [@http://www.boost.org/doc/html/boost/random/uniform_int_distribution.html `uniform_int_distribution`]\nwith a multiprecision generator such as [@http://www.boost.org/doc/html/boost/random/independent_bits_engine.html `independent_bits_engine`].\nOr to use [@http://www.boost.org/doc/html/boost/random/uniform_smallint.html `uniform_smallint`] or\n[@http://www.boost.org/doc/html/boost/random/random_number_generator.html `random_number_generator`] with multiprecision types.\n\nfloating-point values in \\[0,1) are most easily generated using [@http://www.boost.org/doc/html/boost/random/generate_canonical.html `generate_canonical`],\nnote that `generate_canonical` will call the generator multiple times to produce the requested number of bits, for example we can use\nit with a regular generator like so:\n\n[random_eg3]\n\n[random_eg3_out]\n\nNote however, the distributions do not invoke the generator multiple times to fill up the mantissa of a multiprecision floating-point type\nwith random bits.  For these therefore, we should probably use a multiprecision generator (ie `independent_bits_engine`) in combination\nwith the distribution:\n\n[random_eg4]\n\n[random_eg4_out]\n\nAnd finally, it is possible to use the floating-point generators [@http://www.boost.org/doc/html/boost/random/lagged_fibonacci_01_engine.html `lagged_fibonacci_01_engine`]\nand [@http://www.boost.org/doc/html/boost/random/subtract_with_idp144360752.html `subtract_with_carry_01_engine`] directly with multiprecision floating-point types.\nIt's worth noting however, that there is a distinct lack of literature on generating high bit-count random numbers, and therefore a lack of \"known good\" parameters to\nuse with these generators in this situation.  For this reason, these should probably be used for research purposes only:\n\n[random_eg5]\n\n[endsect] [/section:random Generating Random Numbers]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_rational.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:rational Rational Number Types]\n\nThe following back-ends provide rational number arithmetic:\n\n[table\n[[Backend Type][Header][Radix][Dependencies][Pros][Cons]]\n[[`cpp_rational`][boost/multiprecision/cpp_int.hpp][2][None][An all C++ Boost-licensed implementation.][Slower than [gmp].]]\n[[`gmp_rational`][boost/multiprecision/gmp.hpp][2][[gmp]][Very fast and efficient back-end.][Dependency on GNU licensed [gmp] library.]]\n[[`tommath_rational`][boost/multiprecision/tommath.hpp][2][[tommath]][All C/C++ implementation that's Boost Software Licence compatible.][Slower than [gmp].]]\n[[`rational_adaptor`][boost/multiprecision/rational_adaptor.hpp][N/A][none][All C++ adaptor that allows any integer back-end type to be used as a rational type.][Requires an underlying integer back-end type.]]\n[[`boost::rational`][boost/rational.hpp][N/A][None][A C++ rational number type that can used with any `number` integer type.][The expression templates used by `number` end up being \"hidden\" inside `boost::rational`: performance may well suffer as a result.]]\n]\n\n[include tutorial_cpp_rational.qbk]\n[include tutorial_gmp_rational.qbk]\n[include tutorial_tommath_rational.qbk]\n[include tutorial_boost_rational.qbk]\n[include tutorial_rational_adaptor.qbk]\n\n[endsect] [/section:rational Rational Number Types]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_rational_adaptor.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:rational_adaptor rational_adaptor]\n\n   namespace boost{ namespace multiprecision{\n\n   template <class IntBackend>\n   class rational_adpater;\n\n   }}\n\nThe class template `rational_adaptor` is a back-end for `number` which converts any existing integer back-end\ninto a rational-number back-end.\n\nSo for example, given an integer back-end type `MyIntegerBackend`, the use would be something like:\n\n   typedef number<MyIntegerBackend>                    MyInt;\n   typedef number<rational_adaptor<MyIntegerBackend> > MyRational;\n\n   MyRational r = 2;\n   r /= 3;\n   MyInt i = numerator(r);\n   assert(i == 2);\n\n[endsect] [/section:rational_adaptor rational_adaptor]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_rounding.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:rounding Rounding Rules for Conversions]\n\nAs a general rule, all conversions between unrelated types are performed using basic arithmetic operations, therefore\nconversions are either exact, or follow the same rounding rules as arithmetic for the type in question.\n\nThe following table summarises the situation for conversions from native types:\n\n[table\n[[Backend][Rounding Rules]]\n[[__cpp_int][Conversions from integer types are exact if the target has sufficient precision, otherwise they\n            truncate to the first 2^MaxBits bits (modulo arithmetic).  Conversions from floating-point types\n            are truncating to the nearest integer.]]\n[[__gmp_int][Conversions are performed by the GMP library except for conversion from `long double` which is truncating.]]\n[[__tom_int][Conversions from floating-point types are truncating, all others are performed by libtommath and are exact.]]\n[[__gmp_float][Conversions are performed by the GMP library except for conversion from `long double` which should be exact\n            provided the target type has as much precision as a `long double`.]]\n[[__mpfr_float_backend][All conversions are performed by the underlying MPFR library.]]\n[[__cpp_dec_float][All conversions are performed using basic arithmetic operations and are truncating.]]\n[[__gmp_rational][See __gmp_int]]\n[[__cpp_rational][See __cpp_int]]\n[[__tommath_rational][See __tom_int]]\n]\n\n[endsect] [/section:rounding Rounding Rules for Conversions]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_serialization.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:serial Boost.Serialization Support]\n\nSupport for serialization comes in two forms:\n\n* Classes __number, __debug_adaptor, __logged_adaptor and __rational_adaptor have \"pass through\" serialization\nsupport which requires the underlying backend to be serializable.\n* Backends __cpp_int, __cpp_bin_float, __cpp_dec_float and __float128__ have full support for Boost.Serialization.\n\n[endsect] [/section:serialization Boost Serialization]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_tommath.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:tom_int tom_int]\n\n`#include <boost/multiprecision/tommath.hpp>`\n\n   namespace boost{ namespace multiprecision{\n\n   class tommath_int;\n\n   typedef number<tommath_int >         tom_int;\n\n   }} // namespaces\n\nThe `tommath_int` back-end is used via the typedef `boost::multiprecision::tom_int`.  It acts as a thin wrapper around the [tommath] `tom_int`\nto provide an integer type that is a drop-in replacement for the native C++ integer types, but with unlimited precision.\n\nThings you should know when using this type:\n\n* Default constructed objects have the value zero (this is [tommath]'s default behavior).\n* Although `tom_int` is mostly a drop in replacement for the integer __fundamental_types, it should be noted that it is a\nrather strange beast as it's a signed type that is not a 2's complement type.  As a result the bitwise operations\n`| & ^` will throw a `std::runtime_error` exception if either of the arguments is negative.  Similarly the complement\noperator`~` is deliberately not implemented for this type.\n* Formatted IO for this type does not support octal or hexadecimal notation for negative values,\nas a result performing formatted output on this type when the argument is negative and either of the flags\n`std::ios_base::oct` or `std::ios_base::hex` are set, will result in a `std::runtime_error` will be thrown.\n* Conversion from a string results in a `std::runtime_error` being thrown if the string can not be interpreted\nas a valid integer.\n* Division by zero results in a `std::overflow_error` being thrown.\n\n[h5 Example:]\n\n[tommath_eg]\n\n[endsect] [/section:tom_int tom_int]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_tommath_rational.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:tommath_rational tommath_rational]\n\n`#include <boost/multiprecision/tommath.hpp>`\n\n   namespace boost{ namespace multiprecision{\n\n   typedef rational_adpater<tommath_int>        tommath_rational;\n   typedef number<tommath_rational >         tom_rational;\n\n   }} // namespaces\n\nThe `tommath_rational` back-end is used via the typedef `boost::multiprecision::tom_rational`.  It acts as a thin wrapper around\n`boost::rational<tom_int>`\nto provide a rational number type that is a drop-in replacement for the native C++ number types, but with unlimited precision.\n\nThe advantage of using this type rather than `boost::rational<tom_int>` directly, is that it is expression-template enabled,\ngreatly reducing the number of temporaries created in complex expressions.\n\nThere are also non-member functions:\n\n   tom_int numerator(const tom_rational&);\n   tom_int denominator(const tom_rational&);\n\nwhich return the numerator and denominator of the number.\n\nThings you should know when using this type:\n\n* Default constructed `tom_rational`s have the value zero (this the inherited Boost.Rational behavior).\n* Division by zero results in a `std::overflow_error` being thrown.\n* Conversion from a string results in a `std::runtime_error` being thrown if the string can not be\ninterpreted as a valid rational number.\n* No changes are made to [tommath]'s global state, so this type can safely coexist with other [tommath] code.\n* Performance of this type has been found to be pretty poor - this need further investigation - but it appears that Boost.Rational\nneeds some improvement in this area.\n\n[h5 Example:]\n\n[mp_rat_eg]\n\n[endsect] [/section:tommath_rational tommath_rational]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_variable_precision.qbk",
    "content": "[/\n  Copyright 2021 John Maddock.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:variable Variable Precision Arithmetic]\n\nThere are a number of types in this library whose precision can be changed at runtime,\nthe purpose of this section is to explain how these types interoperate with each other\nwhen two variables of the same type can have different precisions.\n\nThe main variable precision types being discussed here are:\n\n* __mpf_float.\n* __mpfr_float_backend.\n* __mpfi_float.\n* __mpc_complex.\n\nFunctions for setting the current working precision are as follows, with type `Num` being one of `mpf_float`, `mpfr_float`, `mpfi_float` or `mpc_float`, and `val` being an object of type `Num`:\n\n[table\n[[Expression][Returns][Comments]]\n[[`val.precision()`][`unsigned`][Returns the precision of variable `val`.]]\n[[`val.precision(n)`][`void`][Sets the precision of variable `val` to `n` decimal places.]]\n[[`Num::default_precision()`][`unsigned`][Returns the current global default precision, in decimal digits - this is the precision that all new threads will inherit.]]\n[[`Num::thread_default_precision()`][`unsigned`][Returns the current thread default precision, in decimal digits - this is the precision that the current thread will use when constructing new objects of type `Num`.]]\n[[`Num::default_precision(Digits10)`][`void`][Sets the global default precision to Digits10 decimal places, this is the precision that all new threads will inherit, also sets the working precision for the current thread.]]\n[[`Num::thread_default_precision(Digits10)`][`void`][Sets the default precision for the current thread to Digits10 decimal places.]]\n]\n\nWe must now consider what happens in an expression such as:\n\n   variable = some_expression;\n\nThere are basically 2 options here when the precision of `variable` and `some_expression` differ:\n\n* We can preserve the precision of the source, so that post assignment, source and target are equal.\n* We can preserve the precision of the target, so that the precision of `variable` doesn't change.\n\nIn addition we must consider what happens if `some_expression` contains types other than `Num`.\n\nThe behaviour of the library is controlled by the following enumerated values:\n\n   namespace boost::multiprecision {\n\n      enum struct variable_precision_options\n      {\n         assume_uniform_precision = -1,\n         preserve_target_precision = 0,\n         preserve_source_precision = 1,\n         preserve_component_precision = 2,\n         preserve_related_precision = 3,\n         preserve_all_precision = 4,\n      };\n\n   }\n\nThe enumerated values have the following meanings, with `preserve_related_precision` being the default.\n\n[table\n[[Value][Meaning]]\n[[assume_uniform_precision][This is the most efficient option - it simply assumes that all variables in the current thread have the same precision, and ignores the precision of all other types.\n   Should these assumptions not hold, then strange unexpected things may happen.  No checks are made to ensure that all variables really are of the same precision.]]\n[[preserve_target_precision][All expressions are evaluated at the precision of the highest precision variable within the expression, and then rounded to the precision\n   of the target variable upon assignment.  The precision of other types (including related or component types - see preserve_component_precision/preserve_related_precision) \n   contained within the expression are ignored.\n   This option has the unfortunate side effect, that moves may become full deep copies.]]\n[[preserve_source_precision][All expressions are evaluated at the precision of the highest precision variable within the expression, and that precision is preserved upon assignment.  \n   The precision of other types (including related or component types - see preserve_component_precision/preserve_related_precision) contained within the expression are ignored.\n   Moves, are true moves not copies.]]\n[[preserve_component_precision][All expressions are evaluated at the precision of the highest precision variable within the expression, and that precision is preserved upon assignment.  \n   If the expression contains component types then these are also considered when calculating the precision of the expression.  Component types are the types which make up the two \n   components of the number when dealing with interval or complex numbers.  They are the same type as `Num::value_type`.\n   Moves, are true moves not copies.]]\n[[preserve_related_precision][All expressions are evaluated at the precision of the highest precision variable within the expression, and that precision is preserved upon assignment.  \n   If the expression contains component types then these are also considered when calculating the precision of the expression.  In addition to component types, \n   all related types are considered when evaluating the precision of the expression.\n   Related types are considered to be instantiations of the same template, but with different parameters.  So for example `mpfr_float_100` would be a related type to `mpfr_float`, and all expressions\n   containing an `mpfr_float_100` variable would have at least 100 decimal digits of precision when evaluated as an `mpfr_float` expression.  Moves, are true moves not copies.]]\n[[preserve_all_precision][All expressions are evaluated at the precision of the highest precision variable within the expression, and that precision is preserved upon assignment.  \n   In addition to component and related types, all types are considered when evaluating the precision of the expression.\n   For example, if the expression contains an `mpz_int`, then the precision of the expression will be sufficient to store all of the digits in the integer unchanged.\n   This option should generally be used with extreme caution, as it can easily cause unintentional precision inflation.  Moves, are true moves not copies.]]\n]\n\nNote how the values `preserve_source_precision`, `preserve_component_precision`,\n`preserve_related_precision` and `preserve_all_precision` form a hierarchy, with each adding progressively more types to the one before to the list of types that are considered when calculating\nthe precision of an expression:\n\n[table\n[[Value][Considers types (lowest in hierarchy first, each builds on the one before)]]\n[[preserve_source_precision][Considers types the same as the result in the expression only.]]\n[[preserve_component_precision][Also considers component types, ie `Num::value_type`.]]\n[[preserve_related_precision][Also considers all instantiations of the backend-template, not just the same type as the result.]]\n[[preserve_all_precision][Considers everything, including completely unrelated types such as (possibly arbitrary precision) integers.]]\n]\n\nAs with working precision, the above options can be set or queried on either a global or thread-local level, note that these options can not be set on a \nper-variable basis since they control whole expressions, not individual variables:\n\n[table\n[[Expression][Returns][Comments]]\n[[`Num::default_variable_precision_options()`][`variable_precision_options`][Returns the current global default options, these are the options that all new threads will inherit.]]\n[[`Num::thread_default_variable_precision_options()`][`variable_precision_options`][Returns the options in use in the current thread when evaluating expressions containing type `Num`.]]\n[[`Num::default_variable_precision_options(opts)`][`void`][Sets the global default options to `opts` which must be one of the enumerated `variable_precision_options` values, this is setting that all new threads will inherit, also sets the options for the current thread.]]\n[[`Num::thread_default_variable_precision_options(opts)`][`void`][Sets the options for the current thread to `opts` which must be one of the `variable_precision_options` enumerated values.]]\n]\n\n[h4 Examples]\n\n[import ../example/scoped_precision_example.cpp]\n\n[scoped_precision_1]\n\n[endsect] [/section:variable Variable Precision Arithmetic]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/doc/tutorial_visualizers.qbk",
    "content": "[/\n  Copyright 2011 - 2020 John Maddock.\n  Copyright 2013 - 2019 Paul A. Bristow.\n  Copyright 2013 Christopher Kormanyos.\n\n  Distributed under the Boost Software License, Version 1.0.\n  (See accompanying file LICENSE_1_0.txt or copy at\n  http://www.boost.org/LICENSE_1_0.txt).\n]\n\n[section:visualizers Visual C++ Debugger Visualizers]\n\n[important This section is seriously out of date compared to recent Visual C++ releases.]\n\nLet's face it debugger multiprecision numbers is hard - simply because we can't easily inspect the value of the numbers.\nVisual C++ provides a partial solution in the shape of \"visualizers\" which provide improved views of complex data structures,\nthese visualizers need to be added to the `[Visualizer]` section of `autoexp.dat` located in the `Common7/Packages/Debugger`\ndirectory of your Visual Studio installation.  The actual visualizer code is in the sandbox\n[@https://svn.boost.org/svn/boost/sandbox/boost_docs/subprojects/DebuggerVisualizers/multiprecision.vis.txt here] - just cut and paste the code\ninto your `autoexp.dat` file.\n\n[note These visualizers have only been tested with VC10, also given the ability of buggy visualizers to crash your Visual C++\ndebugger, make sure you back up `autoexp.dat` file before using these!!]\n\nThe first visualizer provides improved views of `debug_adaptor`:\n\n[$../debugger1.png]\n\nThe next visualizer provides improved views of cpp_int: small numbers are displayed as actual values, while larger numbers are\ndisplayed as an array of hexadecimal parts, with the most significant part first.\n\nHere's what it looks like for small values:\n\n[$../debugger4.png]\n\nAnd for larger values:\n\n[$../debugger5.png]\n\nThere is also a `~raw` child member that\nlets you see the actual members of the class:\n\n[$../debugger6.png]\n\nThe visualizer for `cpp_dec_float` shows the first few digits of the value in the preview field, and the full array of digits\nwhen you expand the view.  As before the `~raw` child gives you access to the actual data members:\n\n[$../debugger7.png]\n\n[endsect] [/section:visualizers Visual C++ Debugger Visualizers]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/Jamfile.v2",
    "content": "# \\libs\\multiprecision\\example\\jamfile.v2\n# Runs multiprecision examples.\n# Copyright 2014 John Maddock\n# Copyright Paul A. Bristow 2014.\n# Copyright Christopher Kormanyos 2014\n\n# Distributed under the Boost Software License, Version 1.0.\n# (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n# Bring in the rules for testing.\nimport testing ;\nimport modules ;\nimport path ;\nimport ../../config/checks/config : requires ;\n\nlocal ntl-path = [ modules.peek : NTL_PATH ] ;\nlocal gmp_path = [ modules.peek : GMP_PATH ] ;\nlocal mpfr_path = [ modules.peek : MPFR_PATH ] ;\nlocal mpfi_path = [ modules.peek : MPFI_PATH ] ;\nlocal tommath_path = [ modules.peek : TOMMATH_PATH ] ;\n\nproject\n    : requirements\n     <include>$(gmp_path)\n     <include>$(gmp_path)/mpfr\n     <include>$(gmp_path)/gmpfrxx\n     <include>$(mpfr_path)\n     <include>$(mpfi_path)\n     <include>$(mpfi_path)/src\n     <include>$(tommath_path)\n     <include>../include\n     <include>../../..\n     \n      <toolset>gcc:<cxxflags>-Wno-missing-braces\n      <toolset>darwin:<cxxflags>-Wno-missing-braces\n      <toolset>acc:<cxxflags>+W2068,2461,2236,4070\n      <toolset>intel:<cxxflags>-Qwd264,239\n      <toolset>msvc:<runtime-link>static\n      <toolset>msvc:<link>static\n      <toolset>msvc:<warnings>all\n      <toolset>msvc:<asynch-exceptions>on\n      <toolset>msvc:<define>_CRT_SECURE_NO_DEPRECATE\n      <toolset>msvc:<define>_SCL_SECURE_NO_DEPRECATE\n      <toolset>msvc:<define>_SCL_SECURE_NO_WARNINGS\n      <toolset>msvc:<define>_CRT_SECURE_NO_WARNINGS\n      <toolset>msvc:<cxxflags>/wd4996\n      <toolset>msvc:<cxxflags>/wd4512\n      <toolset>msvc:<cxxflags>/wd4610\n      <toolset>msvc:<cxxflags>/wd4510\n      #<toolset>msvc:<cxxflags>/wd4127\n      <toolset>msvc:<cxxflags>/wd4701\n      <toolset>msvc:<cxxflags>/wd4305\n      <toolset>clang:<link>static\n      [ requires  \n         cxx11_rvalue_references cxx11_template_aliases cxx11_hdr_array cxx11_allocator cxx11_constexpr cxx11_explicit_conversion_operators cxx11_ref_qualifiers\n         cxx11_hdr_functional cxx11_variadic_templates cxx11_user_defined_literals cxx11_decltype cxx11_static_assert cxx11_defaulted_functions\n         cxx11_noexcept cxx11_ref_qualifiers cxx11_user_defined_literals cxx11_hdr_type_traits\n         ]\n    ;\n\nlib gmp : : <search>$(gmp_path) ;\nlib mpfr : : <search>$(gmp_path) <search>$(mpfr_path) <search>$(mpfr_path)/build.vc10/lib/Win32/Debug ;\nlib mpfi : : <search>$(gmp_path) <search>$(mpfr_path) <search>$(mpfr_path)/build.vc10/lib/Win32/Debug <search>$(mpfi_path) <search>$(mpfi_path)/src ;\nlib quadmath ;\n\nif $(tommath_path)\n{\n   lib tommath : [ GLOB $(tommath_path) : *.c ] : <visibility>global ;\n   TOMMATH = tommath ;\n}\nelse\n{\n   lib tommath : : <search>$(tommath_path) ;\n   TOMMATH = tommath ;\n}\n\nlib no_eh_eg_support : ../test/no_eh_test_support.cpp ;\n\ntest-suite examples :\n\n      [ run cpp_int_snips.cpp no_eh_eg_support ]\n      [ run cpp_int_import_export.cpp no_eh_eg_support ]\n      [ run cpp_bin_float_import_export.cpp no_eh_eg_support ]\n\n      [ run cpp_dec_float_snips.cpp no_eh_eg_support ]\n\n      [ run cpp_bin_float_snips.cpp no_eh_eg_support ]\n\n      [ run debug_adaptor_snips.cpp no_eh_eg_support ]\n      [ run float128_snips.cpp quadmath no_eh_eg_support : : : [ check-target-builds ../config//has_float128 : : <build>no ] ]\n\n      [ run floating_point_examples.cpp no_eh_eg_support : : : [ check-target-builds ../config//has_big_obj : <cxxflags>-Wa,-mbig-obj <debug-symbols>off ] ]\n      [ run gauss_laguerre_quadrature.cpp no_eh_eg_support : : : release [ requires cxx11_lambdas ] ]\n      [ run hypergeometric_luke_algorithms.cpp no_eh_eg_support ../../chrono/build//boost_chrono ../../system/build//boost_system : : : [ requires cxx11_nullptr ]  ]\n      [ run integer_examples.cpp no_eh_eg_support ]\n      [ run logged_adaptor.cpp no_eh_eg_support mpfi mpfr gmp :  :  : [ check-target-builds ../config//has_mpfi : : <build>no ] ]\n      [ run mixed_integer_arithmetic.cpp no_eh_eg_support ]\n      [ run numeric_limits_snips.cpp no_eh_eg_support /boost//test_exec_monitor : : : [ requires cxx11_numeric_limits ]  [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n      [ run random_snips.cpp gmp no_eh_eg_support : : : [ requires cxx11_explicit_conversion_operators ] [ check-target-builds ../config//has_gmp : : <build>no ] ]\n      [ run safe_prime.cpp no_eh_eg_support ]\n\n      [ run gmp_snips.cpp gmp no_eh_eg_support : : : [ check-target-builds ../config//has_gmp : : <build>no ] ]\n      [ run mpfi_snips.cpp mpfi mpfr gmp no_eh_eg_support :  :  : [ check-target-builds ../config//has_mpfi : : <build>no ] ]\n      [ run mpfr_snips.cpp mpfr gmp no_eh_eg_support : : : [ check-target-builds ../config//has_mpfr : : <build>no ] ]\n      [ run tommath_snips.cpp $(TOMMATH) no_eh_eg_support : : : [ check-target-builds ../config//has_tommath : : <build>no ] ]\n      [ compile constexpr_float_arithmetic_examples.cpp : [ requires cxx14_constexpr cxx17_if_constexpr ] ]\n      \n      [ run big_seventh.cpp no_eh_eg_support ]\n\n      [ run exercise_threading_log_agm.cpp : : : <define>BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_TYPE=101 release [ requires cxx11_hdr_atomic cxx11_hdr_thread ] : exercise_threading_log_agm_cpp_dec_float ]\n      [ run exercise_threading_log_agm.cpp gmp : : : <define>BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_TYPE=102 release [ requires cxx11_hdr_atomic cxx11_hdr_thread ] [ check-target-builds ../config//has_gmp : : <build>no ] : exercise_threading_log_agm_gmp ]\n      [ run exercise_threading_log_agm.cpp mpfr gmp : : : <define>BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_TYPE=104 release [ requires cxx11_hdr_atomic cxx11_hdr_thread ] [ check-target-builds ../config//has_mpfr : : <build>no ] : exercise_threading_log_agm_mpfr ]\n      [ run exercise_threading_log_agm.cpp : : : <define>BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_TYPE=103 release [ requires cxx11_hdr_atomic cxx11_hdr_thread ] : exercise_threading_log_agm_cpp_bin_float ]\n\n;\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/big_seventh.cpp",
    "content": "// Use, modification and distribution are subject to the\n// Boost Software License, Version 1.0.\n// (See accompanying file LICENSE_1_0.txt\n// or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n// Copyright Paul A. Bristow 2019.\n// Copyright Christopher Kormanyos 2012.\n// Copyright John Maddock 2012.\n\n// This file is written to be included from a Quickbook .qbk document.\n// It can be compiled by the C++ compiler, and run. Any output can\n// also be added here as comment or included or pasted in elsewhere.\n// Caution: this file contains Quickbook markup as well as code\n// and comments: don't change any of the special comment markups!\n\n#ifdef _MSC_VER\n#  pragma warning (disable : 4512) // assignment operator could not be generated.\n#  pragma warning (disable : 4996)\n#endif\n\n//[big_seventh_example_1\n\n/*`[h5 Using Boost.Multiprecision `cpp_float` types for numerical calculations with higher precision than __fundamental `long double`.]\n\nThe Boost.Multiprecision library can be used for computations requiring precision\nexceeding that of standard __fundamental types such as `float`, `double`\nand `long double`. For extended-precision calculations, Boost.Multiprecision\nsupplies several template data types called `cpp_bin_float_`.\n\nThe number of decimal digits of precision is fixed at compile-time via template parameter.\n\nTo use these floating-point types and\n[@https://www.boost.org/doc/libs/release/libs/math/doc/html/constants.html Boost.Math collection of high-precision constants],\nwe need some includes:\n*/\n\n#include <boost/math/constants/constants.hpp>\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n// that includes some predefined typedefs like:\n// using boost::multiprecision::cpp_bin_float_quad;\n// using boost::multiprecision::cpp_bin_float_50;\n// using boost::multiprecision::cpp_bin_float_100;\n\n#include <iostream>\n#include <limits>\n\n/*` So now we can demonstrate with some trivial calculations:\n*/\n\n//] //[big_seventh_example_1]\n\nint main()\n{\n\n//[big_seventh_example_2\n/*`Using a `typedef` like `cpp_bin_float_50` hides the complexity of multiprecision, and\nallows us to define variables with 50 decimal digit precision just like __fundamental `double`.\n*/\n  using boost::multiprecision::cpp_bin_float_50;\n\n  cpp_bin_float_50 seventh = cpp_bin_float_50(1) / 7;  // 1 / 7\n\n/*`By default, output would only show the standard 6 decimal digits,\n so set precision to show all 50 significant digits, including any trailing zeros (to show the full implied 50 digit precision).\n*/\n  std::cout.precision(std::numeric_limits<cpp_bin_float_50>::digits10); // Show 50 decimal digit precision.\n  std::cout << std::showpoint << std::endl; // Append any trailing zeros.\n  std::cout << seventh << std::endl;\n/*`which outputs:\n\n  0.14285714285714285714285714285714285714285714285714\n\nWe can also use Boost.Math __math_constants like [pi],\nguaranteed to be initialized with the very last bit of precision for the floating-point type.\n*/\n   std::cout << \"pi = \" << boost::math::constants::pi<cpp_bin_float_50>() << std::endl;\n   cpp_bin_float_50 circumference = boost::math::constants::pi<cpp_bin_float_50>() * 2 * seventh;\n   std::cout << \"c =  \"<< circumference << std::endl;\n\n/*`which outputs\n\n  pi = 3.1415926535897932384626433832795028841971693993751\n\n  c =  0.89759790102565521098932668093700082405633411410717\n*/\n//]  [/big_seventh_example_2]\n\n//[big_seventh_example_3\n/*`So using `cpp_bin_float_50` looks like a simple 'drop-in' for the __fundamental_type like 'double',\nbut beware of less-than-expected precision from construction or conversion from `double` or other lower precision types.\nThis is a mistake that is very easy to make,\nand very difficult to detect because the difference in precision is only visible after about the 17th decimal digit.\n\nWe can show this by constructing a fraction one seventh from `double`:\n*/\n   cpp_bin_float_50 seventh_0 = cpp_bin_float_50(1/7);  // Avoid the schoolboy-error `double d7 = 1 / 7;` giving zero!\n   std::cout << \"seventh_0 = \"  << seventh_0 << std::endl;\n   // seventh_double0 = 0.0000000000000000000000000000000000000000000000000\n\n   cpp_bin_float_50 seventh_double = cpp_bin_float_50(1./7);  // Construct from double! (0.14285714285714)\n   std::cout << \"seventh_double = \"  << seventh_double << std::endl; // Boost.Multiprecision post-school error!\n   // seventh_double = 0.14285714285714284921269268124888185411691665649414\n\n/*`Did you spot the probably-unintended difference?  After the 17th decimal digit, result is apparently random\nand not the expected recurring pattern 14285714285714...\n\nThe 'random' digits after digit 17 are from the `cpp_bin_float_50` representation of the `double` value 0.14285714285714\nwhich is different from the 'better' `cpp_bin_float_50` representation of the fraction 1/7\n*/\n\n   cpp_bin_float_50 seventh_big(1);  // 1\n   seventh_big /= 7;\n   std::cout << \"seventh_big = \" << seventh_big << std::endl; //\n   // seventh_big     = 0.14285714285714285714285714285714285714285714285714\n//`Note the recurring 14285714285714 pattern as expected.\n\n//`We can also construct a `const` version (but not yet `constexpr`) and evaluate in a single expression:\n\n   const cpp_bin_float_50 seventh_const (cpp_bin_float_50(1) / 7);\n   std::cout << \"seventh_const = \" << seventh_const << std::endl; //\n   // seventh_const = 0.14285714285714285714285714285714285714285714285714\n//]  [/big_seventh_example_3]\n\n//[big_seventh_example_constexpr\n\n   // Sadly we cannot (yet) write:\n   // constexpr cpp_bin_float_50 any_constexpr(0);\n\n   // constexpr cpp_bin_float_50 seventh_constexpr (cpp_bin_float_50(1) / 7);\n   // std::cout << \"seventh_constexpr = \" << seventh_constexpr << std::endl; //\n   // nor use the macro constexpr unless it returns `const`\n   // constexpr cpp_bin_float_50 seventh_constexpr(seventh_const);\n\n//]  [/big_seventh_example_constexpr]\n\n//[big_seventh_example_4\n   /*`For some purposes, this difference in precision may be insignificant,\nbut if one is implementing a formula involving a fraction from integers,\nincluding decimal fractions like 1/10, 1/100, then comparison with other computations like __WolframAlpha\nwill reveal differences whose cause may be perplexing.\n\nTo get as precise-as-possible decimal fractions like 1.234, we can write\n*/\n\n  const cpp_bin_float_50 f1(cpp_bin_float_50(1234) / 1000);  // Construct from a fraction.\n  std::cout << \"cpp_bin_float_50 f1(cpp_bin_float_50(1234) / 1000) = \" << f1 << std::endl; // cpp_bin_float_50 f1(cpp_bin_float_50(1234) / 1000) = 1.2340000000000000000000000000000000000000000000000\n/*`or\n*/\n  const cpp_bin_float_50 f2(\"1.234\");  // Construct from decimal digit string.\n  std::cout << \"cpp_bin_float_50 f2(\\\"1.234\\\") = \" << f2 << std::endl; // cpp_bin_float_50 f2(\"1.234\") = 1.2340000000000000000000000000000000000000000000000\n\n/*`that are different from constructing from a `double` with value 1.234\n*/\n  const cpp_bin_float_50 f3(cpp_bin_float_50(1.234));\n  std::cout << \"cpp_bin_float_50 f3(cpp_bin_float_50(1.234)) = \" << f3 << std::endl; // 1.2339999999999999857891452847979962825775146484375\n\n//]  [/big_seventh_example_4]\n\n    return 0;\n} // int main()\n\n\n/*\n//[big_seventh_example_output\n\n0.14285714285714285714285714285714285714285714285714\npi = 3.1415926535897932384626433832795028841971693993751\nc =  0.89759790102565521098932668093700082405633411410717\nseventh_0 = 0.0000000000000000000000000000000000000000000000000\nseventh_double = 0.14285714285714284921269268124888185411691665649414\nseventh_big = 0.14285714285714285714285714285714285714285714285714\nseventh_const = 0.14285714285714285714285714285714285714285714285714\ncpp_bin_float_50 f1(cpp_bin_float_50(1234) / 100) = 12.340000000000000000000000000000000000000000000000\ncpp_bin_float_50 f2(\"1.234\") = 1.2340000000000000000000000000000000000000000000000\ncpp_bin_float_50 f3(cpp_bin_float_50(1.234)) = 1.2339999999999999857891452847979962825775146484375\n\n//] //[/big_seventh_example_output]\n\n*/\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/complex128_examples.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2018 Nick Thompson. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n/*`This example demonstrates the usage of the MPC backend for multiprecision complex numbers.\nIn the following, we will show how using MPC backend allows for the same operations as the C++ standard library complex numbers.\n*/\n\n//[complex128_eg\n#include <iostream>\n#include <complex>\n#include <boost/multiprecision/complex128.hpp>\n\ntemplate<class Complex>\nvoid complex_number_examples()\n{\n    Complex z1{0, 1};\n    std::cout << std::setprecision(std::numeric_limits<typename Complex::value_type>::digits10);\n    std::cout << std::scientific << std::fixed;\n    std::cout << \"Print a complex number: \" << z1 << std::endl;\n    std::cout << \"Square it             : \" << z1*z1 << std::endl;\n    std::cout << \"Real part             : \" << z1.real() << \" = \" << real(z1) << std::endl;\n    std::cout << \"Imaginary part        : \" << z1.imag() << \" = \" << imag(z1) << std::endl;\n    using std::abs;\n    std::cout << \"Absolute value        : \" << abs(z1) << std::endl;\n    std::cout << \"Argument              : \" << arg(z1) << std::endl;\n    std::cout << \"Norm                  : \" << norm(z1) << std::endl;\n    std::cout << \"Complex conjugate     : \" << conj(z1) << std::endl;\n    std::cout << \"Projection onto Riemann sphere: \" <<  proj(z1) << std::endl;\n    typename Complex::value_type r = 1;\n    typename Complex::value_type theta = 0.8;\n    using std::polar;\n    std::cout << \"Polar coordinates (phase = 0)    : \" << polar(r) << std::endl;\n    std::cout << \"Polar coordinates (phase !=0)    : \" << polar(r, theta) << std::endl;\n\n    std::cout << \"\\nElementary special functions:\\n\";\n    using std::exp;\n    std::cout << \"exp(z1) = \" << exp(z1) << std::endl;\n    using std::log;\n    std::cout << \"log(z1) = \" << log(z1) << std::endl;\n    using std::log10;\n    std::cout << \"log10(z1) = \" << log10(z1) << std::endl;\n    using std::pow;\n    std::cout << \"pow(z1, z1) = \" << pow(z1, z1) << std::endl;\n    using std::sqrt;\n    std::cout << \"Take its square root  : \" << sqrt(z1) << std::endl;\n    using std::sin;\n    std::cout << \"sin(z1) = \" << sin(z1) << std::endl;\n    using std::cos;\n    std::cout << \"cos(z1) = \" << cos(z1) << std::endl;\n    using std::tan;\n    std::cout << \"tan(z1) = \" << tan(z1) << std::endl;\n    using std::asin;\n    std::cout << \"asin(z1) = \" << asin(z1) << std::endl;\n    using std::acos;\n    std::cout << \"acos(z1) = \" << acos(z1) << std::endl;\n    using std::atan;\n    std::cout << \"atan(z1) = \" << atan(z1) << std::endl;\n    using std::sinh;\n    std::cout << \"sinh(z1) = \" << sinh(z1) << std::endl;\n    using std::cosh;\n    std::cout << \"cosh(z1) = \" << cosh(z1) << std::endl;\n    using std::tanh;\n    std::cout << \"tanh(z1) = \" << tanh(z1) << std::endl;\n    using std::asinh;\n    std::cout << \"asinh(z1) = \" << asinh(z1) << std::endl;\n    using std::acosh;\n    std::cout << \"acosh(z1) = \" << acosh(z1) << std::endl;\n    using std::atanh;\n    std::cout << \"atanh(z1) = \" << atanh(z1) << std::endl;\n}\n\nint main()\n{\n    std::cout << \"First, some operations we usually perform with std::complex:\\n\";\n    complex_number_examples<std::complex<double>>();\n    std::cout << \"\\nNow the same operations performed using quad precision complex numbers:\\n\";\n    complex_number_examples<boost::multiprecision::complex128>();\n\n    return 0;\n}\n//]\n\n/*\n\n//[complex128_out\n\nPrint a complex number: (0.000000000000000000000000000000000,1.000000000000000000000000000000000)\nSquare it             : -1.000000000000000000000000000000000\nReal part             : 0.000000000000000000000000000000000 = 0.000000000000000000000000000000000\nImaginary part        : 1.000000000000000000000000000000000 = 1.000000000000000000000000000000000\nAbsolute value        : 1.000000000000000000000000000000000\nArgument              : 1.570796326794896619231321691639751\nNorm                  : 1.000000000000000000000000000000000\nComplex conjugate     : (0.000000000000000000000000000000000,-1.000000000000000000000000000000000)\nProjection onto Riemann sphere: (0.000000000000000000000000000000000,1.000000000000000000000000000000000)\nPolar coordinates (phase = 0)    : 1.000000000000000000000000000000000\nPolar coordinates (phase !=0)    : (0.696706709347165389063740022772449,0.717356090899522792567167815703377)\n\nElementary special functions:\nexp(z1) = (0.540302305868139717400936607442977,0.841470984807896506652502321630299)\nlog(z1) = (0.000000000000000000000000000000000,1.570796326794896619231321691639751)\nlog10(z1) = (0.000000000000000000000000000000000,0.682188176920920673742891812715678)\npow(z1, z1) = 0.207879576350761908546955619834979\nTake its square root  : (0.707106781186547524400844362104849,0.707106781186547524400844362104849)\nsin(z1) = (0.000000000000000000000000000000000,1.175201193643801456882381850595601)\ncos(z1) = 1.543080634815243778477905620757061\ntan(z1) = (0.000000000000000000000000000000000,0.761594155955764888119458282604794)\nasin(z1) = (0.000000000000000000000000000000000,0.881373587019543025232609324979792)\nacos(z1) = (1.570796326794896619231321691639751,-0.881373587019543025232609324979792)\natan(z1) = (0.000000000000000000000000000000000,inf)\nsinh(z1) = (0.000000000000000000000000000000000,0.841470984807896506652502321630299)\ncosh(z1) = 0.540302305868139717400936607442977\ntanh(z1) = (0.000000000000000000000000000000000,1.557407724654902230506974807458360)\nasinh(z1) = (0.000000000000000000000000000000000,1.570796326794896619231321691639751)\nacosh(z1) = (0.881373587019543025232609324979792,1.570796326794896619231321691639751)\natanh(z1) = (0.000000000000000000000000000000000,0.785398163397448309615660845819876)\n//]\n*/\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/constexpr_float_arithmetic_examples.cpp",
    "content": "//  (C) Copyright John Maddock 2019.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n// Contains Quickbook snippets used by boost/libs/multiprecision/doc/multiprecision.qbk,\n// section Literal Types and constexpr Support.\n\n#include <iostream>\n#include <boost/config.hpp>\n\n#ifdef BOOST_HAS_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n\n//[constexpr_circle\n#include <boost/math/constants/constants.hpp> // For constant pi with full precision of type T.\n// using  boost::math::constants::pi;\n\ntemplate <class T>\ninline constexpr T circumference(T radius)\n{\n   return 2 * boost::math::constants::pi<T>() * radius;\n}\n\ntemplate <class T>\ninline constexpr T area(T radius)\n{\n   return boost::math::constants::pi<T>() * radius * radius;\n}\n//] [/constexpr_circle]\n\ntemplate <class T, unsigned Order>\nstruct const_polynomial\n{\n public:\n   T data[Order + 1];\n\n public:\n   constexpr const_polynomial(T val = 0) : data{val} {}\n   constexpr const_polynomial(const std::initializer_list<T>& init) : data{}\n   {\n      if (init.size() > Order + 1)\n         throw std::range_error(\"Too many initializers in list!\");\n      for (unsigned i = 0; i < init.size(); ++i)\n         data[i] = init.begin()[i];\n   }\n   constexpr T& operator[](std::size_t N)\n   {\n      return data[N];\n   }\n   constexpr const T& operator[](std::size_t N) const\n   {\n      return data[N];\n   }\n   template <class U>\n   constexpr T operator()(U val)const\n   {\n      T result = data[Order];\n      for (unsigned i = Order; i > 0; --i)\n      {\n         result *= val;\n         result += data[i - 1];\n      }\n      return result;\n   }\n   constexpr const_polynomial<T, Order - 1> derivative() const\n   {\n      const_polynomial<T, Order - 1> result;\n      for (unsigned i = 1; i <= Order; ++i)\n      {\n         result[i - 1] = (*this)[i] * i;\n      }\n      return result;\n   }\n   constexpr const_polynomial operator-()\n   {\n      const_polynomial t(*this);\n      for (unsigned i = 0; i <= Order; ++i)\n         t[i] = -t[i];\n      return t;\n   }\n   template <class U>\n   constexpr const_polynomial& operator*=(U val)\n   {\n      for (unsigned i = 0; i <= Order; ++i)\n         data[i] = data[i] * val;\n      return *this;\n   }\n   template <class U>\n   constexpr const_polynomial& operator/=(U val)\n   {\n      for (unsigned i = 0; i <= Order; ++i)\n         data[i] = data[i] / val;\n      return *this;\n   }\n   template <class U>\n   constexpr const_polynomial& operator+=(U val)\n   {\n      data[0] += val;\n      return *this;\n   }\n   template <class U>\n   constexpr const_polynomial& operator-=(U val)\n   {\n      data[0] -= val;\n      return *this;\n   }\n};\n\ntemplate <class T, unsigned Order1, unsigned Order2>\ninline constexpr const_polynomial<T, (Order1 > Order2 ? Order1 : Order2)> operator+(const const_polynomial<T, Order1>& a, const const_polynomial<T, Order2>& b)\n{\n   if\n      constexpr(Order1 > Order2)\n      {\n         const_polynomial<T, Order1> result(a);\n         for (unsigned i = 0; i <= Order2; ++i)\n            result[i] += b[i];\n         return result;\n      }\n   else\n   {\n      const_polynomial<T, Order2> result(b);\n      for (unsigned i = 0; i <= Order1; ++i)\n         result[i] += a[i];\n      return result;\n   }\n}\ntemplate <class T, unsigned Order1, unsigned Order2>\ninline constexpr const_polynomial<T, (Order1 > Order2 ? Order1 : Order2)> operator-(const const_polynomial<T, Order1>& a, const const_polynomial<T, Order2>& b)\n{\n   if\n      constexpr(Order1 > Order2)\n      {\n         const_polynomial<T, Order1> result(a);\n         for (unsigned i = 0; i <= Order2; ++i)\n            result[i] -= b[i];\n         return result;\n      }\n   else\n   {\n      const_polynomial<T, Order2> result(b);\n      for (unsigned i = 0; i <= Order1; ++i)\n         result[i] = a[i] - b[i];\n      return result;\n   }\n}\ntemplate <class T, unsigned Order1, unsigned Order2>\ninline constexpr const_polynomial<T, Order1 + Order2> operator*(const const_polynomial<T, Order1>& a, const const_polynomial<T, Order2>& b)\n{\n   const_polynomial<T, Order1 + Order2> result;\n   for (unsigned i = 0; i <= Order1; ++i)\n   {\n      for (unsigned j = 0; j <= Order2; ++j)\n      {\n         result[i + j] += a[i] * b[j];\n      }\n   }\n   return result;\n}\ntemplate <class T, unsigned Order, class U>\ninline constexpr const_polynomial<T, Order> operator*(const const_polynomial<T, Order>& a, const U& b)\n{\n   const_polynomial<T, Order> result(a);\n   for (unsigned i = 0; i <= Order; ++i)\n   {\n      result[i] *= b;\n   }\n   return result;\n}\ntemplate <class U, class T, unsigned Order>\ninline constexpr const_polynomial<T, Order> operator*(const U& b, const const_polynomial<T, Order>& a)\n{\n   const_polynomial<T, Order> result(a);\n   for (unsigned i = 0; i <= Order; ++i)\n   {\n      result[i] *= b;\n   }\n   return result;\n}\ntemplate <class T, unsigned Order, class U>\ninline constexpr const_polynomial<T, Order> operator/(const const_polynomial<T, Order>& a, const U& b)\n{\n   const_polynomial<T, Order> result;\n   for (unsigned i = 0; i <= Order; ++i)\n   {\n      result[i] /= b;\n   }\n   return result;\n}\n\n//[hermite_example\ntemplate <class T, unsigned Order>\nclass hermite_polynomial\n{\n   const_polynomial<T, Order> m_data;\n\n public:\n   constexpr hermite_polynomial() : m_data(hermite_polynomial<T, Order - 1>().data() * const_polynomial<T, 1>{0, 2} - hermite_polynomial<T, Order - 1>().data().derivative())\n   {\n   }\n   constexpr const const_polynomial<T, Order>& data() const\n   {\n      return m_data;\n   }\n   constexpr const T& operator[](std::size_t N)const\n   {\n      return m_data[N];\n   }\n   template <class U>\n   constexpr T operator()(U val)const\n   {\n      return m_data(val);\n   }\n};\n//] [/hermite_example]\n\n//[hermite_example2\ntemplate <class T>\nclass hermite_polynomial<T, 0>\n{\n   const_polynomial<T, 0> m_data;\n\n public:\n   constexpr hermite_polynomial() : m_data{1} {}\n   constexpr const const_polynomial<T, 0>& data() const\n   {\n      return m_data;\n   }\n   constexpr const T& operator[](std::size_t N) const\n   {\n      return m_data[N];\n   }\n   template <class U>\n   constexpr T operator()(U val)\n   {\n      return m_data(val);\n   }\n};\n\ntemplate <class T>\nclass hermite_polynomial<T, 1>\n{\n   const_polynomial<T, 1> m_data;\n\n public:\n   constexpr hermite_polynomial() : m_data{0, 2} {}\n   constexpr const const_polynomial<T, 1>& data() const\n   {\n      return m_data;\n   }\n   constexpr const T& operator[](std::size_t N) const\n   {\n      return m_data[N];\n   }\n   template <class U>\n   constexpr T operator()(U val)\n   {\n      return m_data(val);\n   }\n};\n//] [/hermite_example2]\n\n\nvoid test_double()\n{\n   constexpr double radius = 2.25;\n   constexpr double c      = circumference(radius);\n   constexpr double a      = area(radius);\n\n   std::cout << \"Circumference = \" << c << std::endl;\n   std::cout << \"Area = \" << a << std::endl;\n\n   constexpr const_polynomial<double, 2> pa = {3, 4};\n   constexpr const_polynomial<double, 2> pb = {5, 6};\n   static_assert(pa[0] == 3);\n   static_assert(pa[1] == 4);\n   constexpr auto pc = pa * 2;\n   static_assert(pc[0] == 6);\n   static_assert(pc[1] == 8);\n   constexpr auto pd = 3 * pa;\n   static_assert(pd[0] == 3 * 3);\n   static_assert(pd[1] == 4 * 3);\n   constexpr auto pe = pa + pb;\n   static_assert(pe[0] == 3 + 5);\n   static_assert(pe[1] == 4 + 6);\n   constexpr auto pf = pa - pb;\n   static_assert(pf[0] == 3 - 5);\n   static_assert(pf[1] == 4 - 6);\n   constexpr auto pg = pa * pb;\n   static_assert(pg[0] == 15);\n   static_assert(pg[1] == 38);\n   static_assert(pg[2] == 24);\n\n   #if defined(__clang__) && (__clang_major__ < 6)\n   #else\n   constexpr hermite_polynomial<double, 2> h1;\n   static_assert(h1[0] == -2);\n   static_assert(h1[1] == 0);\n   static_assert(h1[2] == 4);\n\n   constexpr hermite_polynomial<double, 3> h3;\n   static_assert(h3[0] == 0);\n   static_assert(h3[1] == -12);\n   static_assert(h3[2] == 0);\n   static_assert(h3[3] == 8);\n\n   constexpr hermite_polynomial<double, 9> h9;\n   static_assert(h9[0] == 0);\n   static_assert(h9[1] == 30240);\n   static_assert(h9[2] == 0);\n   static_assert(h9[3] == -80640);\n   static_assert(h9[4] == 0);\n   static_assert(h9[5] == 48384);\n   static_assert(h9[6] == 0);\n   static_assert(h9[7] == -9216);\n   static_assert(h9[8] == 0);\n   static_assert(h9[9] == 512);\n\n   static_assert(h9(0.5) == 6481);\n   #endif\n}\n\nvoid test_float128()\n{\n#ifdef BOOST_HAS_FLOAT128\n//[constexpr_circle_usage\n\n   using boost::multiprecision::float128;\n\n   constexpr float128 radius = 2.25;\n   constexpr float128 c      = circumference(radius);\n   constexpr float128 a      = area(radius);\n\n   std::cout << \"Circumference = \" << c << std::endl;\n   std::cout << \"Area = \" << a << std::endl;\n\n //]   [/constexpr_circle_usage]\n\n\n   constexpr hermite_polynomial<float128, 2> h1;\n   static_assert(h1[0] == -2);\n   static_assert(h1[1] == 0);\n   static_assert(h1[2] == 4);\n\n   constexpr hermite_polynomial<float128, 3> h3;\n   static_assert(h3[0] == 0);\n   static_assert(h3[1] == -12);\n   static_assert(h3[2] == 0);\n   static_assert(h3[3] == 8);\n\n   //[hermite_example3\n   constexpr hermite_polynomial<float128, 9> h9;\n   //\n   // Verify that the polynomial's coefficients match the known values:\n   //\n   static_assert(h9[0] == 0);\n   static_assert(h9[1] == 30240);\n   static_assert(h9[2] == 0);\n   static_assert(h9[3] == -80640);\n   static_assert(h9[4] == 0);\n   static_assert(h9[5] == 48384);\n   static_assert(h9[6] == 0);\n   static_assert(h9[7] == -9216);\n   static_assert(h9[8] == 0);\n   static_assert(h9[9] == 512);\n   //\n   // Define an abscissa value to evaluate at:\n   constexpr float128 abscissa(0.5);\n   //\n   // Evaluate H_9(0.5) using all constexpr arithmetic, and check that it has the expected result:\n   static_assert(h9(abscissa) == 6481);\n   //]\n#endif\n}\n\nint main()\n{\n   test_double();\n   test_float128();\n   std::cout << \"Done!\" << std::endl;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/cpp_bin_float_import_export.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2015 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <iostream>\n#include <iomanip>\n#include <vector>\n#include <iterator>\n\n// Contains Quickbook snippets in comments.\n\n//[IE2\n\n/*`\nImporting or exporting cpp_bin_float is similar, but we must proceed via an intermediate integer:\n*/\n/*=\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <iostream>\n#include <iomanip>\n#include <vector>\n#include <iterator>\n*/\n\nint main()\n{\n   using boost::multiprecision::cpp_bin_float_100;\n   using boost::multiprecision::cpp_int;\n   // Create a cpp_bin_float to import/export:\n   cpp_bin_float_100 f(1);\n   f /= 3;\n   // export into 8-bit unsigned values, most significant bit first:\n   std::vector<unsigned char> v;\n   export_bits(cpp_int(f.backend().bits()), std::back_inserter(v), 8);\n   // Grab the exponent as well:\n   int e = f.backend().exponent();\n   // Import back again, and check for equality, we have to proceed via\n   // an intermediate integer:\n   cpp_int i;\n   import_bits(i, v.begin(), v.end());\n   cpp_bin_float_100 g(i);\n   g.backend().exponent() = e;\n   BOOST_MP_ASSERT(f == g);\n}\n\n//]\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/cpp_bin_float_snips.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2013 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//[cpp_bin_float_eg\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n\n#include <iostream>\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n   // Operations at fixed precision and full numeric_limits support:\n   cpp_bin_float_100 b = 2;\n   std::cout << std::numeric_limits<cpp_bin_float_100>::digits << std::endl;\n   std::cout << std::numeric_limits<cpp_bin_float_100>::digits10 << std::endl;\n\n   // We can use any C++ std lib function, lets print all the digits as well:\n   std::cout << std::setprecision(std::numeric_limits<cpp_bin_float_100>::max_digits10)\n      << log(b) << std::endl; // print log(2)\n\n   // We can also use any function from Boost.Math:\n   std::cout << boost::math::tgamma(b) << std::endl;\n   // These even work when the argument is an expression template:\n   std::cout << boost::math::tgamma(b * b) << std::endl;\n\n   // And since we have an extended exponent range we can generate some really large\n   // numbers here (4.0238726007709377354370243e+2564):\n   std::cout << boost::math::tgamma(cpp_bin_float_100(1000)) << std::endl;\n   return 0;\n}\n\n//]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/cpp_complex_examples.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2018 Nick Thompson. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n/*`This example demonstrates the usage of the MPC backend for multiprecision complex numbers.\nIn the following, we will show how using MPC backend allows for the same operations as the C++ standard library complex numbers.\n*/\n\n//[cpp_complex_eg\n#include <iostream>\n#include <complex>\n#include <boost/multiprecision/cpp_complex.hpp>\n\ntemplate<class Complex>\nvoid complex_number_examples()\n{\n    Complex z1{0, 1};\n    std::cout << std::setprecision(std::numeric_limits<typename Complex::value_type>::digits10);\n    std::cout << std::scientific << std::fixed;\n    std::cout << \"Print a complex number: \" << z1 << std::endl;\n    std::cout << \"Square it             : \" << z1*z1 << std::endl;\n    std::cout << \"Real part             : \" << z1.real() << \" = \" << real(z1) << std::endl;\n    std::cout << \"Imaginary part        : \" << z1.imag() << \" = \" << imag(z1) << std::endl;\n    using std::abs;\n    std::cout << \"Absolute value        : \" << abs(z1) << std::endl;\n    std::cout << \"Argument              : \" << arg(z1) << std::endl;\n    std::cout << \"Norm                  : \" << norm(z1) << std::endl;\n    std::cout << \"Complex conjugate     : \" << conj(z1) << std::endl;\n    std::cout << \"Projection onto Riemann sphere: \" <<  proj(z1) << std::endl;\n    typename Complex::value_type r = 1;\n    typename Complex::value_type theta = 0.8;\n    using std::polar;\n    std::cout << \"Polar coordinates (phase = 0)    : \" << polar(r) << std::endl;\n    std::cout << \"Polar coordinates (phase !=0)    : \" << polar(r, theta) << std::endl;\n\n    std::cout << \"\\nElementary special functions:\\n\";\n    using std::exp;\n    std::cout << \"exp(z1) = \" << exp(z1) << std::endl;\n    using std::log;\n    std::cout << \"log(z1) = \" << log(z1) << std::endl;\n    using std::log10;\n    std::cout << \"log10(z1) = \" << log10(z1) << std::endl;\n    using std::pow;\n    std::cout << \"pow(z1, z1) = \" << pow(z1, z1) << std::endl;\n    using std::sqrt;\n    std::cout << \"Take its square root  : \" << sqrt(z1) << std::endl;\n    using std::sin;\n    std::cout << \"sin(z1) = \" << sin(z1) << std::endl;\n    using std::cos;\n    std::cout << \"cos(z1) = \" << cos(z1) << std::endl;\n    using std::tan;\n    std::cout << \"tan(z1) = \" << tan(z1) << std::endl;\n    using std::asin;\n    std::cout << \"asin(z1) = \" << asin(z1) << std::endl;\n    using std::acos;\n    std::cout << \"acos(z1) = \" << acos(z1) << std::endl;\n    using std::atan;\n    std::cout << \"atan(z1) = \" << atan(z1) << std::endl;\n    using std::sinh;\n    std::cout << \"sinh(z1) = \" << sinh(z1) << std::endl;\n    using std::cosh;\n    std::cout << \"cosh(z1) = \" << cosh(z1) << std::endl;\n    using std::tanh;\n    std::cout << \"tanh(z1) = \" << tanh(z1) << std::endl;\n    using std::asinh;\n    std::cout << \"asinh(z1) = \" << asinh(z1) << std::endl;\n    using std::acosh;\n    std::cout << \"acosh(z1) = \" << acosh(z1) << std::endl;\n    using std::atanh;\n    std::cout << \"atanh(z1) = \" << atanh(z1) << std::endl;\n}\n\nint main()\n{\n    std::cout << \"First, some operations we usually perform with std::complex:\\n\";\n    complex_number_examples<std::complex<double>>();\n    std::cout << \"\\nNow the same operations performed using quad precision complex numbers:\\n\";\n    complex_number_examples<boost::multiprecision::cpp_complex_quad>();\n\n    return 0;\n}\n//]\n\n/*\n\n//[cpp_complex_out\n\nPrint a complex number: (0.000000000000000000000000000000000,1.000000000000000000000000000000000)\nSquare it             : -1.000000000000000000000000000000000\nReal part             : 0.000000000000000000000000000000000 = 0.000000000000000000000000000000000\nImaginary part        : 1.000000000000000000000000000000000 = 1.000000000000000000000000000000000\nAbsolute value        : 1.000000000000000000000000000000000\nArgument              : 1.570796326794896619231321691639751\nNorm                  : 1.000000000000000000000000000000000\nComplex conjugate     : (0.000000000000000000000000000000000,-1.000000000000000000000000000000000)\nProjection onto Riemann sphere: (0.000000000000000000000000000000000,1.000000000000000000000000000000000)\nPolar coordinates (phase = 0)    : 1.000000000000000000000000000000000\nPolar coordinates (phase !=0)    : (0.696706709347165389063740022772448,0.717356090899522792567167815703377)\n\nElementary special functions:\nexp(z1) = (0.540302305868139717400936607442977,0.841470984807896506652502321630299)\nlog(z1) = (0.000000000000000000000000000000000,1.570796326794896619231321691639751)\nlog10(z1) = (0.000000000000000000000000000000000,0.682188176920920673742891812715678)\npow(z1, z1) = 0.207879576350761908546955619834979\nTake its square root  : (0.707106781186547524400844362104849,0.707106781186547524400844362104849)\nsin(z1) = (0.000000000000000000000000000000000,1.175201193643801456882381850595601)\ncos(z1) = 1.543080634815243778477905620757062\ntan(z1) = (0.000000000000000000000000000000000,0.761594155955764888119458282604794)\nasin(z1) = (0.000000000000000000000000000000000,0.881373587019543025232609324979793)\nacos(z1) = (1.570796326794896619231321691639751,-0.881373587019543025232609324979793)\natan(z1) = (0.000000000000000000000000000000000,inf)\nsinh(z1) = (0.000000000000000000000000000000000,0.841470984807896506652502321630299)\ncosh(z1) = 0.540302305868139717400936607442977\ntanh(z1) = (0.000000000000000000000000000000000,1.557407724654902230506974807458360)\nasinh(z1) = (0.000000000000000000000000000000000,1.570796326794896619231321691639751)\nacosh(z1) = (0.881373587019543025232609324979792,1.570796326794896619231321691639751)\natanh(z1) = (0.000000000000000000000000000000000,0.785398163397448309615660845819876)\n//]\n*/\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/cpp_dec_float_snips.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n   //[cpp_dec_float_eg\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#include <iostream>\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n   // Operations at fixed precision and full numeric_limits support:\n   cpp_dec_float_100 b = 2;\n   std::cout << std::numeric_limits<cpp_dec_float_100>::digits << std::endl;\n   // Note that digits10 is the same as digits, since we're base 10! :\n   std::cout << std::numeric_limits<cpp_dec_float_100>::digits10 << std::endl;\n   // We can use any C++ std lib function, lets print all the digits as well:\n   std::cout << std::setprecision(std::numeric_limits<cpp_dec_float_100>::max_digits10) \n      << log(b) << std::endl; // print log(2)\n   // We can also use any function from Boost.Math:\n   std::cout << boost::math::tgamma(b) << std::endl;\n   // These even work when the argument is an expression template:\n   std::cout << boost::math::tgamma(b * b) << std::endl;\n   // And since we have an extended exponent range we can generate some really large \n   // numbers here (4.0238726007709377354370243e+2564):\n   std::cout << boost::math::tgamma(cpp_dec_float_100(1000)) << std::endl;\n   return 0;\n}\n//]\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/cpp_int_import_export.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2015 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <iostream>\n#include <iomanip>\n#include <vector>\n#include <iterator>\n\n//[IE1\n\n/*`\nIn this simple example, we'll import/export the bits of a cpp_int\nto a vector of 8-bit unsigned values:\n*/\n/*=\n#include <boost/multiprecision/cpp_int.hpp>\n#include <iostream>\n#include <iomanip>\n#include <vector>\n#include <iterator>\n*/\n\nint main()\n{\n   using boost::multiprecision::cpp_int;\n   // Create a cpp_int with just a couple of bits set:\n   cpp_int i;\n   bit_set(i, 5000); // set the 5000'th bit\n   bit_set(i, 200);\n   bit_set(i, 50);\n   // export into 8-bit unsigned values, most significant bit first:\n   std::vector<unsigned char> v;\n   export_bits(i, std::back_inserter(v), 8);\n   // import back again, and check for equality:\n   cpp_int j;\n   import_bits(j, v.begin(), v.end());\n   BOOST_MP_ASSERT(i == j);\n}\n\n//]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/cpp_int_mul_timing.cpp",
    "content": "///////////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2019.                        //\n//  Distributed under the Boost Software License,                //\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt          //\n//  or copy at http://www.boost.org/LICENSE_1_0.txt)             //\n///////////////////////////////////////////////////////////////////\n\n#include <algorithm>\n#include <cstddef>\n#include <cstdint>\n#include <ctime>\n#include <iomanip>\n#include <iostream>\n#include <limits>\n#include <iterator>\n#include <vector>\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nclass random_pcg32_fast_base\n{\nprotected:\n  using itype = std::uint64_t;\n\n  static constexpr bool is_mcg = false;\n\npublic:\n  virtual ~random_pcg32_fast_base() = default;\n\nprotected:\n  explicit random_pcg32_fast_base(const itype = itype()) { }\n\n  random_pcg32_fast_base(const random_pcg32_fast_base&) = default;\n\n  random_pcg32_fast_base& operator=(const random_pcg32_fast_base&) = default;\n\n  template<typename ArithmeticType>\n  static ArithmeticType rotr(const ArithmeticType& value_being_shifted,\n                             const std::size_t     bits_to_shift)\n  {\n    const std::size_t left_shift_amount =\n      std::numeric_limits<ArithmeticType>::digits - bits_to_shift;\n\n    const ArithmeticType part1 = ((bits_to_shift > 0U) ? ArithmeticType(value_being_shifted >> bits_to_shift)     : value_being_shifted);\n    const ArithmeticType part2 = ((bits_to_shift > 0U) ? ArithmeticType(value_being_shifted << left_shift_amount) : 0U);\n\n    return ArithmeticType(part1 | part2);\n  }\n\n  template<typename xtype,\n           typename itype>\n  struct xsh_rr_mixin\n  {\n    static xtype output(const itype internal_value)\n    {\n      using bitcount_t = std::size_t;\n\n      constexpr bitcount_t bits         = bitcount_t(sizeof(itype) * 8U);\n      constexpr bitcount_t xtypebits    = bitcount_t(sizeof(xtype) * 8U);\n      constexpr bitcount_t sparebits    = bits - xtypebits;\n      constexpr bitcount_t wantedopbits =   ((xtypebits >= 128U) ? 7U\n                                          : ((xtypebits >=  64U) ? 6U\n                                          : ((xtypebits >=  32U) ? 5U\n                                          : ((xtypebits >=  16U) ? 4U\n                                          :                        3U))));\n\n      constexpr bitcount_t opbits       = ((sparebits >= wantedopbits) ? wantedopbits : sparebits);\n      constexpr bitcount_t amplifier    = wantedopbits - opbits;\n      constexpr bitcount_t mask         = (1ULL << opbits) - 1U;\n      constexpr bitcount_t topspare     = opbits;\n      constexpr bitcount_t bottomspare  = sparebits - topspare;\n      constexpr bitcount_t xshift       = (topspare + xtypebits) / 2U;\n\n      const bitcount_t rot =\n        ((opbits != 0U) ? (bitcount_t(internal_value >> (bits - opbits)) & mask)\n                        : 0U);\n\n      const bitcount_t amprot = (rot << amplifier) & mask;\n\n      const itype internal_value_xor = internal_value ^ itype(internal_value >> xshift);\n\n      const xtype result = rotr(xtype(internal_value_xor >> bottomspare), amprot);\n\n      return result;\n    }\n  };\n};\n\nclass random_pcg32_fast : public random_pcg32_fast_base\n{\nprivate:\n  static constexpr itype default_multiplier = static_cast<itype>(6364136223846793005ULL);\n  static constexpr itype default_increment  = static_cast<itype>(1442695040888963407ULL);\n\npublic:\n  using result_type = std::uint32_t;\n\n  static constexpr itype default_seed = static_cast<itype>(0xCAFEF00DD15EA5E5ULL);\n\n  explicit random_pcg32_fast(const itype state = default_seed)\n    : random_pcg32_fast_base(state),\n      my_inc  (default_increment),\n      my_state(is_mcg ? state | itype(3U) : bump(state + increment())) { }\n\n  random_pcg32_fast(const random_pcg32_fast& other)\n    : random_pcg32_fast_base(other),\n      my_inc  (other.my_inc),\n      my_state(other.my_state) { }\n\n  virtual ~random_pcg32_fast() = default;\n\n  random_pcg32_fast& operator=(const random_pcg32_fast& other)\n  {\n    static_cast<void>(random_pcg32_fast_base::operator=(other));\n\n    if(this != &other)\n    {\n      my_inc   = other.my_inc;\n      my_state = other.my_state;\n    }\n\n    return *this;\n  }\n\n  void seed(const itype state = default_seed)\n  {\n    my_inc = default_increment;\n\n    my_state = (is_mcg ? state | itype(3U) : bump(state + increment()));\n  }\n\n  result_type operator()()\n  {\n    const result_type value =\n      xsh_rr_mixin<result_type, itype>::output(base_generate0());\n\n    return value;\n  }\n\nprivate:\n  itype my_inc;\n  itype my_state;\n\n  itype multiplier() const\n  {\n    return default_multiplier;\n  }\n\n  itype increment() const\n  {\n    return default_increment;\n  }\n\n  itype bump(const itype state)\n  {\n    return itype(state * multiplier()) + increment();\n  }\n\n  itype base_generate0()\n  {\n    const itype old_state = my_state;\n\n    my_state = bump(my_state);\n\n    return old_state;\n  }\n};\n\n\ntemplate<typename UnsignedIntegralIteratorType,\n         typename RandomEngineType>\nvoid get_random_big_uint(RandomEngineType& rng, UnsignedIntegralIteratorType it_out)\n{\n  using local_random_value_type = typename RandomEngineType::result_type;\n\n  using local_uint_type = typename std::iterator_traits<UnsignedIntegralIteratorType>::value_type;\n\n  constexpr std::size_t digits_of_uint___type = static_cast<std::size_t>(std::numeric_limits<local_uint_type>::digits);\n  constexpr std::size_t digits_of_random_type = static_cast<std::size_t>(std::numeric_limits<local_random_value_type>::digits);\n\n  local_random_value_type next_random = rng();\n\n  *it_out = next_random;\n\n  for(std::size_t i = digits_of_random_type; i < digits_of_uint___type; i += digits_of_random_type)\n  {\n    (*it_out) <<= digits_of_random_type;\n\n    next_random = rng();\n\n    (*it_out) |= next_random;\n  }\n}\n\nusing big_uint_backend_type =\n  boost::multiprecision::cpp_int_backend<8192UL << 1U,\n                                         8192UL << 1U,\n                                         boost::multiprecision::unsigned_magnitude>;\n\nusing big_uint_type = boost::multiprecision::number<big_uint_backend_type>;\n\nnamespace local\n{\n  std::vector<big_uint_type> a(1024U);\n  std::vector<big_uint_type> b(a.size());\n}\n\nint main()\n{\n  random_pcg32_fast rng;\n\n  rng.seed(std::clock());\n\n  for(auto i = 0U; i < local::a.size(); ++i)\n  {\n    get_random_big_uint(rng, local::a.begin() + i);\n    get_random_big_uint(rng, local::b.begin() + i);\n  }\n\n  std::size_t count = 0U;\n\n  float total_time = 0.0F;\n\n  const std::clock_t start = std::clock();\n\n  do\n  {\n    const std::size_t index = count % local::a.size();\n\n    local::a[index] * local::b[index];\n\n    ++count;\n  }\n  while((total_time = (float(std::clock() - start) / float(CLOCKS_PER_SEC))) < 10.0F);\n\n  // Boost.Multiprecision 1.71\n  // bits: 16384, kops_per_sec: 4.7\n  // bits: 32768, kops_per_sec: 1.2\n  // bits: 65536, kops_per_sec: 0.3\n  // bits: 131072, kops_per_sec: 0.075\n  // bits: 262144, kops_per_sec: 0.019\n  // bits: 524288, kops_per_sec: 0.0047\n\n  // Boost.Multiprecision + kara mult\n  // bits: 16384, kops_per_sec: 4.8\n  // bits: 32768, kops_per_sec: 1.6\n  // bits: 65536, kops_per_sec: 0.5\n  // bits: 131072, kops_per_sec: 0.15\n  // bits: 262144, kops_per_sec: 0.043\n  // bits: 524288, kops_per_sec: 0.011\n\n  const float kops_per_sec = (float(count) / total_time) / 1000.0F;\n\n  std::cout << \"bits: \"\n            << std::numeric_limits<big_uint_type>::digits\n            << \", kops_per_sec: \"\n            << kops_per_sec\n            << count << std::endl;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/cpp_int_snips.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <iostream>\n\nvoid t1()\n{\n//[cpp_int_eg\n//=#include <boost/multiprecision/cpp_int.hpp>\n//=#include <iostream>\n//=\n//=int main()\n//={\n   using namespace boost::multiprecision;\n\n   int128_t v = 1;\n\n   // Do some fixed precision arithmetic:\n   for(unsigned i = 1; i <= 20; ++i)\n      v *= i;\n\n   std::cout << v << std::endl; // prints 2432902008176640000 (i.e. 20!)\n\n   // Repeat at arbitrary precision:\n   cpp_int u = 1;\n   for(unsigned i = 1; i <= 100; ++i)\n      u *= i;\n   \n   // prints 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 (i.e. 100!)\n   std::cout << u << std::endl;\n\n//=   return 0;\n//=}\n//]\n}\n\nvoid t3()\n{\n//[cpp_rational_eg\n//=#include <boost/multiprecision/cpp_int.hpp>\n//=#include <iostream>\n//=\n//=int main()\n//={\n   using namespace boost::multiprecision;\n\n   cpp_rational v = 1;\n\n   // Do some arithmetic:\n   for(unsigned i = 1; i <= 1000; ++i)\n      v *= i;\n   v /= 10;\n\n   std::cout << v << std::endl; // prints 1000! / 10\n   std::cout << numerator(v) << std::endl;\n   std::cout << denominator(v) << std::endl;\n\n   cpp_rational w(2, 3);  // component wise constructor\n   std::cout << w << std::endl; // prints 2/3\n//=   return 0;\n//=}\n//]\n}\n\n\nint main()\n{\n   t1();\n   t3();\n   return 0;\n}\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/debug_adaptor_snips.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include <boost/multiprecision/debug_adaptor.hpp>\n#include <iostream>\n\nvoid t1()\n{\n   //[debug_adaptor_eg\n   //=#include <boost/multiprecision/debug_adaptor.hpp>\n   //=#include <boost/multiprecision/cpp_dec_float.hpp>\n\n   using namespace boost::multiprecision;\n\n   typedef number<debug_adaptor<cpp_dec_float<50> > > fp_type;\n\n   fp_type denom = 1;\n   fp_type sum = 1;\n\n   for(unsigned i = 2; i < 50; ++i)\n   {\n      denom *= i;\n      sum += 1 / denom;\n   }\n\n   std::cout << std::setprecision(std::numeric_limits<fp_type>::digits) << sum << std::endl;\n   //]\n}\n\nint main()\n{\n   t1();\n   return 0;\n}\n\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/eigen_example.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//[eigen_eg\n#include <iostream>\n#include <boost/multiprecision/cpp_complex.hpp>\n#include <boost/multiprecision/eigen.hpp>\n#include <Eigen/Dense>\n\nint main()\n{\n   using namespace Eigen;\n   typedef boost::multiprecision::cpp_complex_quad complex_type;\n   //\n   // We want to solve Ax = b for x,\n   // define A and b first:\n   //\n   Matrix<complex_type, 2, 2> A, b;\n   A << complex_type(2, 3), complex_type(-1, -2), complex_type(-1, -4), complex_type(3, 6);\n   b << 1, 2, 3, 1;\n   std::cout << \"Here is the matrix A:\\n\" << A << std::endl;\n   std::cout << \"Here is the right hand side b:\\n\" << b << std::endl;\n   //\n   // Solve for x:\n   //\n   Matrix<complex_type, 2, 2> x = A.fullPivHouseholderQr().solve(b);\n   std::cout << \"The solution is:\\n\" << x << std::endl;\n   //\n   // Compute the error in the solution by using the norms of Ax - b and b:\n   //\n   complex_type::value_type relative_error = (A*x - b).norm() / b.norm();\n   std::cout << \"The relative error is: \" << relative_error << std::endl;\n   return 0;\n}\n//]\n\n/*\n//[eigen_out\nHere is the matrix A:\n(2,3) (-1,-2)\n(-1,-4)   (3,6)\nHere is the right hand side b:\n1 2\n3 1\nThe solution is:\n(0.6,-0.6)   (0.7,-0.7)\n(0.64,-0.68) (0.58,-0.46)\nThe relative error is: 2.63132e-34\n//]\n*/\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/exercise_threading_log_agm.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//      Copyright Christopher Kormanyos 2020 - 2021.\n// Distributed under the Boost Software License, Version 1.0.\n//    (See accompanying file LICENSE_1_0.txt or copy at\n//          http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// This example exercises Boost.Multiprecision in concurrent\n// multi-threaded environments. To do so a loop involving\n// non-trivial calculations of numerous function values\n// has been set up within both concurrent as well as\n// sequential running environments. In particular,\n// this example uses an AGM method to do a \"from the ground up\"\n// calculation of logarithms. The logarithm functions values\n// are compared with the values from Boost.Multiprecision's\n// specific log functions for the relevant backends.\n// The log GM here is not optimized or intended for\n// high-performance work, but can be taken as an\n// interesting example of an AGM iteration if helpful.\n\n// This example has been initially motivated in part\n// by discussions in:\n// https://github.com/boostorg/multiprecision/pull/211\n\n// We find the following performance data here:\n// https://github.com/boostorg/multiprecision/pull/213\n//\n// cpp_dec_float:\n// result_is_ok_concurrent: true, calculation_time_concurrent: 18.1s\n// result_is_ok_sequential: true, calculation_time_sequential: 48.5s\n//\n// cpp_bin_float:\n// result_is_ok_concurrent: true, calculation_time_concurrent: 18.7s\n// result_is_ok_sequential: true, calculation_time_sequential: 50.4s\n//\n// gmp_float:\n// result_is_ok_concurrent: true, calculation_time_concurrent: 3.3s\n// result_is_ok_sequential: true, calculation_time_sequential: 12.4s\n//\n// mpfr_float:\n// result_is_ok_concurrent: true, calculation_time_concurrent: 0.6s\n// result_is_ok_sequential: true, calculation_time_sequential: 1.9s\n\n#include <array>\n#include <atomic>\n#include <cstddef>\n#include <cstdint>\n#include <iomanip>\n#include <iostream>\n#include <limits>\n#include <thread>\n#include <vector>\n\n#include <boost/math/constants/constants.hpp>\n#include <boost/math/special_functions/prime.hpp>\n\n#define BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_CPP_DEC_FLOAT       101\n#define BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_GMP_FLOAT           102\n#define BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_CPP_BIN_FLOAT       103\n#define BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_MPFR_FLOAT          104\n\n#if !defined(BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_TYPE)\n#define BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_TYPE BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_CPP_DEC_FLOAT\n//#define BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_TYPE BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_CPP_BIN_FLOAT\n//#define BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_TYPE BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_GMP_FLOAT\n//#define BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_TYPE BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_MPFR_FLOAT\n#endif\n\n#if  (BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_TYPE == BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_CPP_DEC_FLOAT)\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing big_float_type = boost::multiprecision::number<boost::multiprecision::cpp_dec_float<501>,\n                                                     boost::multiprecision::et_off>;\n\n#elif (BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_TYPE == BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_CPP_BIN_FLOAT)\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\nusing big_float_type = boost::multiprecision::number<boost::multiprecision::cpp_bin_float<501>,\n                                                     boost::multiprecision::et_off>;\n\n#elif  (BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_TYPE == BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_GMP_FLOAT)\n#include <boost/multiprecision/gmp.hpp>\n\nusing big_float_type = boost::multiprecision::number<boost::multiprecision::gmp_float<501>,\n                                                     boost::multiprecision::et_off>;\n\n#elif  (BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_TYPE == BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_MPFR_FLOAT)\n#include <boost/multiprecision/mpfr.hpp>\n\nusing big_float_type = boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<501>,\n                                                     boost::multiprecision::et_off>;\n\n#else\n#error BOOST_MULTIPRECISION_EXERCISE_THREADING_BACKEND_TYPE is undefined.\n#endif\n\nnamespace boost { namespace multiprecision { namespace exercise_threading {\n\nnamespace detail {\n\nnamespace my_concurrency {\ntemplate<typename index_type,\n         typename callable_function_type>\nvoid parallel_for(index_type             start,\n                  index_type             end,\n                  callable_function_type parallel_function)\n{\n  // Estimate the number of threads available.\n  static const unsigned int number_of_threads_hint =\n    std::thread::hardware_concurrency();\n\n  static const unsigned int number_of_threads_total =\n    ((number_of_threads_hint == 0U) ? 4U : number_of_threads_hint);\n\n  // Use only 3/4 of the available cores.\n  static const unsigned int number_of_threads = number_of_threads_total - (number_of_threads_total / 8U);\n\n  std::cout << \"Executing with \" << number_of_threads << \" threads\" << std::endl;\n\n  // Set the size of a slice for the range functions.\n  index_type n = index_type(end - start) + index_type(1);\n\n  index_type slice =\n    static_cast<index_type>(std::round(n / static_cast<float>(number_of_threads)));\n\n  slice = (std::max)(slice, index_type(1));\n\n  // Inner loop.\n  auto launch_range =\n    [&parallel_function](index_type index_lo, index_type index_hi)\n    {\n      for(index_type i = index_lo; i < index_hi; ++i)\n      {\n        parallel_function(i);\n      }\n    };\n\n  // Create the thread pool and launch the jobs.\n  std::vector<std::thread> pool;\n\n  pool.reserve(number_of_threads);\n\n  index_type i1 = start;\n  index_type i2 = (std::min)(index_type(start + slice), end);\n\n  for(index_type i = 0U; ((index_type(i + index_type(1U)) < number_of_threads) && (i1 < end)); ++i)\n  {\n    pool.emplace_back(launch_range, i1, i2);\n\n    i1 = i2;\n\n    i2 = (std::min)(index_type(i2 + slice), end);\n  }\n\n  if(i1 < end)\n  {\n    pool.emplace_back(launch_range, i1, end);\n  }\n\n  // Wait for the jobs to finish.\n  for(std::thread& thread_in_pool : pool)\n  {\n    if(thread_in_pool.joinable())\n    {\n      thread_in_pool.join();\n    }\n  }\n}\n} // namespace my_concurrency\n\ntemplate<typename FloatingPointType,\n         typename UnsignedIntegralType>\nFloatingPointType pown(const FloatingPointType& b, const UnsignedIntegralType& p)\n{\n  // Calculate (b ^ p).\n\n  using local_floating_point_type    = FloatingPointType;\n  using local_unsigned_integral_type = UnsignedIntegralType;\n\n  local_floating_point_type result;\n\n  if     (p == local_unsigned_integral_type(0U)) { result = local_floating_point_type(1U); }\n  else if(p == local_unsigned_integral_type(1U)) { result = b; }\n  else if(p == local_unsigned_integral_type(2U)) { result = b; result *= b; }\n  else\n  {\n    result = local_floating_point_type(1U);\n\n    local_floating_point_type y(b);\n\n    for(local_unsigned_integral_type p_local(p); p_local != local_unsigned_integral_type(0U); p_local >>= 1U)\n    {\n      if((static_cast<unsigned>(p_local) & 1U) != 0U)\n      {\n        result *= y;\n      }\n\n      y *= y;\n    }\n  }\n\n  return result;\n}\n\nconst std::vector<std::uint32_t>& primes()\n{\n  static std::vector<std::uint32_t> my_primes;\n\n  if(my_primes.empty())\n  {\n    my_primes.resize(10000U);\n\n    // Get exactly 10,000 primes.\n    for(std::size_t i = 0U; i < my_primes.size(); ++i)\n    {\n      my_primes[i] = boost::math::prime((unsigned int) i);\n    }\n  }\n\n  return my_primes;\n}\n\n} // namespace detail\n\ntemplate<typename FloatingPointType>\nFloatingPointType log(const FloatingPointType& x)\n{\n  // Use an AGM method to compute the logarithm of x.\n\n  // For values less than 1 invert the argument and\n  // remember (in this case) to negate the result below.\n  const bool b_negate = (x < 1);\n\n  const FloatingPointType xx = ((b_negate == false) ? x : 1 / x);\n\n  // Set a0 = 1\n  // Set b0 = 4 / (x * 2^m) = 1 / (x * 2^(m - 2))\n\n  FloatingPointType ak(1U);\n\n  const float n_times_factor = static_cast<float>(static_cast<float>(std::numeric_limits<FloatingPointType>::digits10) * 1.67F);\n  const float lgx_over_lg2   = std::log(static_cast<float>(xx)) / std::log(2.0F);\n\n  std::int32_t m = static_cast<std::int32_t>(n_times_factor - lgx_over_lg2);\n\n  // Ensure that the resulting power is non-negative.\n  // Also enforce that m >= 8.\n  m = (std::max)(m, static_cast<std::int32_t>(8));\n\n  FloatingPointType bk = detail::pown(FloatingPointType(2), static_cast<std::uint32_t>(m));\n\n  bk *= xx;\n  bk  = 4 / bk;\n\n  FloatingPointType ak_tmp(0U);\n\n  using std::sqrt;\n\n  // Determine the requested precision of the upcoming iteration in units of digits10.\n  const FloatingPointType target_tolerance = sqrt(std::numeric_limits<FloatingPointType>::epsilon()) / 100;\n\n  for(std::int32_t k = static_cast<std::int32_t>(0); k < static_cast<std::int32_t>(64); ++k)\n  {\n    using std::fabs;\n\n    // Check for the number of significant digits to be\n    // at least half of the requested digits. If at least\n    // half of the requested digits have been achieved,\n    // then break after the upcoming iteration.\n    const bool break_after_this_iteration = (   (k > static_cast<std::int32_t>(4))\n                                             && (fabs(1 - fabs(ak / bk)) < target_tolerance));\n\n    ak_tmp  = ak;\n    ak     += bk;\n    ak     /= 2;\n\n    if(break_after_this_iteration)\n    {\n      break;\n    }\n\n    bk *= ak_tmp;\n    bk  = sqrt(bk);\n  }\n\n  // We are now finished with the AGM iteration for log(x).\n\n  // Compute log(x) = {pi / [2 * AGM(1, 4 / 2^m)]} - (m * ln2)\n  // Note at this time that (ak = bk) = AGM(...)\n\n  // Retrieve the value of pi, divide by (2 * a) and subtract (m * ln2).\n  const FloatingPointType result =\n       boost::math::constants::pi<FloatingPointType>() / (ak * 2)\n    - (boost::math::constants::ln_two<FloatingPointType>() * m);\n\n  return ((b_negate == true) ? -result : result);\n}\n\n} } } // namespace boost::multiprecision::exercise_threading\n\ntemplate<typename FloatingPointType>\nbool log_agm_concurrent(float& calculation_time)\n{\n  const std::size_t count = boost::multiprecision::exercise_threading::detail::primes().size();\n\n  std::vector<FloatingPointType> log_results(count);\n  std::vector<FloatingPointType> log_control(count);\n\n  std::atomic_flag log_agm_lock = ATOMIC_FLAG_INIT;\n\n  std::size_t concurrent_log_agm_count = 0U;\n\n  const std::clock_t start = std::clock();\n\n  boost::multiprecision::exercise_threading::detail::my_concurrency::parallel_for\n  (\n    std::size_t(0U),\n    log_results.size(),\n    [&log_results, &log_control, &concurrent_log_agm_count, &log_agm_lock](std::size_t i)\n    {\n      while(log_agm_lock.test_and_set()) { ; }\n      const FloatingPointType dx = (FloatingPointType(1U) / (boost::multiprecision::exercise_threading::detail::primes()[i]));\n      log_agm_lock.clear();\n\n      const FloatingPointType  x = boost::math::constants::catalan<FloatingPointType>() + dx;\n\n      const FloatingPointType lr = boost::multiprecision::exercise_threading::log(x);\n      const FloatingPointType lc = boost::multiprecision::log(x);\n\n      while(log_agm_lock.test_and_set()) { ; }\n\n      log_results[i] = lr;\n      log_control[i] = lc;\n\n      ++concurrent_log_agm_count;\n\n      if((concurrent_log_agm_count % 100U) == 0U)\n      {\n        std::cout << \"log agm concurrent at index \"\n                  << concurrent_log_agm_count\n                  << \" of \"\n                  << log_results.size()\n                  << \". Total processed so far: \"\n                  << std::fixed\n                  << std::setprecision(1)\n                  << (100.0F * float(concurrent_log_agm_count)) / float(log_results.size())\n                  << \"%.\"\n                  << \"\\r\";\n      }\n\n      log_agm_lock.clear();\n    }\n  );\n\n  calculation_time = static_cast<float>(std::clock() - start) / static_cast<float>(CLOCKS_PER_SEC);\n\n  std::cout << std::endl;\n\n  std::cout << \"Checking results concurrent: \";\n\n  bool result_is_ok = true;\n\n  const FloatingPointType tol = std::numeric_limits<FloatingPointType>::epsilon() * 1000000U;\n\n  for(std::size_t i = 0U; i < log_results.size(); ++i)\n  {\n    using std::fabs;\n\n    const FloatingPointType close_fraction = fabs(1 - (log_results[i] / log_control[i]));\n\n    result_is_ok &= (close_fraction < tol);\n  }\n\n  std::cout << std::boolalpha << result_is_ok << std::endl;\n\n  return result_is_ok;\n}\n\ntemplate<typename FloatingPointType>\nbool log_agm_sequential(float& calculation_time)\n{\n  const std::size_t count = boost::multiprecision::exercise_threading::detail::primes().size();\n\n  std::vector<FloatingPointType> log_results(count);\n  std::vector<FloatingPointType> log_control(count);\n\n  const std::clock_t start = std::clock();\n\n  for(std::size_t i = 0U; i < log_results.size(); ++i)\n  {\n    const std::size_t sequential_log_agm_count = i + 1U;\n\n    const FloatingPointType dx = (FloatingPointType(1U) / (boost::multiprecision::exercise_threading::detail::primes()[i]));\n    const FloatingPointType  x = boost::math::constants::catalan<FloatingPointType>() + dx;\n\n    log_results[i] = boost::multiprecision::exercise_threading::log(x);\n    log_control[i] = boost::multiprecision::log(x);\n\n    if((sequential_log_agm_count % 100U) == 0U)\n    {\n      std::cout << \"log agm sequential at index \"\n                << sequential_log_agm_count\n                << \" of \"\n                << log_results.size()\n                << \". Total processed so far: \"\n                << std::fixed\n                << std::setprecision(1)\n                << (100.0F * float(sequential_log_agm_count)) / float(log_results.size())\n                << \"%.\"\n                << \"\\r\";\n    }\n  }\n\n  calculation_time = static_cast<float>(std::clock() - start) / static_cast<float>(CLOCKS_PER_SEC);\n\n  std::cout << std::endl;\n\n  std::cout << \"Checking results sequential: \";\n\n  bool result_is_ok = true;\n\n  const FloatingPointType tol = std::numeric_limits<FloatingPointType>::epsilon() * 1000000U;\n\n  for(std::size_t i = 0U; i < log_results.size(); ++i)\n  {\n    using std::fabs;\n\n    const FloatingPointType close_fraction = fabs(1 - (log_results[i] / log_control[i]));\n\n    result_is_ok &= (close_fraction < tol);\n  }\n\n  std::cout << std::boolalpha << result_is_ok << std::endl;\n\n  return result_is_ok;\n}\n\nint main()\n{\n  std::cout << \"Calculating \"\n            << boost::multiprecision::exercise_threading::detail::primes().size()\n            << \" primes\"\n            << std::endl;\n\n  float calculation_time_concurrent;\n  const bool result_is_ok_concurrent = log_agm_concurrent<big_float_type>(calculation_time_concurrent);\n\n  float calculation_time_sequential;\n  const bool result_is_ok_sequential = log_agm_sequential<big_float_type>(calculation_time_sequential);\n\n  std::cout << std::endl;\n\n  std::cout << \"result_is_ok_concurrent: \"\n            << std::boolalpha\n            << result_is_ok_concurrent\n            << \", calculation_time_concurrent: \"\n            << std::fixed\n            << std::setprecision(1)\n            << calculation_time_concurrent\n            << \"s\"\n            << std::endl;\n\n  std::cout << \"result_is_ok_sequential: \"\n            << std::boolalpha\n            << result_is_ok_sequential\n            << \", calculation_time_sequential: \"\n            << std::fixed\n            << std::setprecision(1)\n            << calculation_time_sequential\n            << \"s\"\n            << std::endl;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/float128_snips.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2013 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n// Demonstrations of using Boost.Multiprecision float128 quad type.\n// (Only available using GCC compiler).\n\n// Contains Quickbook markup in comments.\n\n//[float128_eg\n#include <boost/multiprecision/float128.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#include <iostream>\n\nint main()\n{\n   using namespace boost::multiprecision; // Potential to cause name collisions?\n   // using boost::multiprecision::float128; // is safer.\n\n/*`The type float128 provides operations at 128-bit precision with\n[@https://en.wikipedia.org/wiki/Quadruple-precision_floating-point_format#IEEE_754_quadruple-precision_binary_floating-point_format:_binary128 Quadruple-precision floating-point format]\nand have full `std::numeric_limits` support:\n*/\n   float128 b = 2;\n//` There are  15 bits of (biased) binary exponent and 113-bits of significand precision\n   std::cout << std::numeric_limits<float128>::digits << std::endl;\n//` or 33 decimal places:\n   std::cout << std::numeric_limits<float128>::digits10 << std::endl;\n   //` We can use any C++ std library function, so let's show all the at-most 36 potentially significant digits, and any trailing zeros, as well:\n    std::cout.setf(std::ios_base::showpoint); // Include any trailing zeros.\n   std::cout << std::setprecision(std::numeric_limits<float128>::max_digits10)\n      << log(b) << std::endl; // Shows log(2) = 0.693147180559945309417232121458176575\n   //` We can also use any function from Boost.Math, for example, the 'true gamma' function `tgamma`:\n   std::cout << boost::math::tgamma(b) << std::endl;\n   /*` And since we have an extended exponent range, we can generate some really large\n    numbers here (4.02387260077093773543702433923004111e+2564):\n   */\n   std::cout << boost::math::tgamma(float128(1000)) << std::endl;\n   /*` We can declare constants using GCC or Intel's native types, and literals with the Q suffix, and these can be declared `constexpr` if required:\n   */\n   // std::numeric_limits<float128>::max_digits10 = 36\n   constexpr float128 pi = 3.14159265358979323846264338327950288Q;\n   std::cout.precision(std::numeric_limits<float128>::max_digits10);\n   std::cout << \"pi = \" << pi << std::endl; //pi = 3.14159265358979323846264338327950280\n//] [/float128_eg]\n   return 0;\n}\n\n/*\n//[float128_numeric_limits\n\nGCC 8.1.0\n\nType name is float128_t:\nType is g\nstd::is_fundamental<> = true\nboost::multiprecision::detail::is_signed<> = true\nboost::multiprecision::detail::is_unsigned<> = false\nboost::multiprecision::detail::is_integral<> = false\nboost::multiprecision::detail::is_arithmetic<> = true\nstd::is_const<> = false\nstd::is_trivial<> = true\nstd::is_standard_layout<> = true\nstd::is_pod<> = true\nstd::numeric_limits::<>is_exact = false\nstd::numeric_limits::<>is bounded = true\nstd::numeric_limits::<>is_modulo = false\nstd::numeric_limits::<>is_iec559 = true\nstd::numeric_limits::<>traps = false\nstd::numeric_limits::<>tinyness_before = false\nstd::numeric_limits::<>max() = 1.18973149535723176508575932662800702e+4932\nstd::numeric_limits::<>min() = 3.36210314311209350626267781732175260e-4932\nstd::numeric_limits::<>lowest() = -1.18973149535723176508575932662800702e+4932\nstd::numeric_limits::<>min_exponent = -16381\nstd::numeric_limits::<>max_exponent = 16384\nstd::numeric_limits::<>epsilon() = 1.92592994438723585305597794258492732e-34\nstd::numeric_limits::<>radix = 2\nstd::numeric_limits::<>digits = 113\nstd::numeric_limits::<>digits10 = 33\nstd::numeric_limits::<>max_digits10 = 36\nstd::numeric_limits::<>has denorm = true\nstd::numeric_limits::<>denorm min = 6.47517511943802511092443895822764655e-4966\nstd::denorm_loss = false\nlimits::has_signaling_NaN == false\nstd::numeric_limits::<>quiet_NaN = nan\nstd::numeric_limits::<>infinity = inf\n\n//] [/float128_numeric_limits]\n*/\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/floating_point_examples.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/math/constants/constants.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#include <boost/math/special_functions/bessel.hpp>\n#include <iostream>\n#include <iomanip>\n\n#if !defined(BOOST_NO_CXX11_HDR_ARRAY) && !defined(BOOST_NO_CXX11_LAMBDAS) && !(defined(CI_SUPPRESS_KNOWN_ISSUES) && defined(__GNUC__) && defined(_WIN32))\n\n#include <array>\n\n//[AOS1\n\n/*`Generic numeric programming employs templates to use the same code for different\nfloating-point types and functions. Consider the area of a circle a of radius r, given by\n\n[:['a = [pi] * r[super 2]]]\n\nThe area of a circle can be computed in generic programming using Boost.Math\nfor the constant [pi] as shown below:\n\n*/\n\n//=#include <boost/math/constants/constants.hpp>\n\ntemplate<typename T>\ninline T area_of_a_circle(T r)\n{\n   using boost::math::constants::pi;\n   return pi<T>() * r * r;\n}\n\n/*`\nIt is possible to use `area_of_a_circle()` with built-in floating-point types as\nwell as floating-point types from Boost.Multiprecision. In particular, consider a\nsystem with 4-byte single-precision float, 8-byte double-precision double and also the\n`cpp_dec_float_50` data type from Boost.Multiprecision with 50 decimal digits\nof precision.\n\nWe can compute and print the approximate area of a circle \nwith radius 123/100  for `float`, `double` and `cpp_dec_float_50` with the program below\n(see next section for choosing 123/100  instead of 1.23).\n\n*/\n\n//]\n\n//[AOS3\n\n/*`In later examples we'll look at calling both standard library and Boost.Math functions from within generic code.\nWe'll also show how to cope with template arguments which are expression-templates rather than number types.\n\nBut first some warnings about how multiprecision types are slightly but significantly different __fundamental_types. */\n\n//]\n\n//[JEL\n\n/*`\nIn this example we'll show several implementations of the \n[@http://mathworld.wolfram.com/LambdaFunction.html Jahnke and Emden Lambda function], \neach implementation a little more sophisticated than the last.\n\nThe Jahnke-Emden Lambda function is defined by the equation:\n\n[:['JahnkeEmden(v, z) = [Gamma](v+1) * J[sub v](z) / (z / 2)[super v]]]\n\nIf we were to implement this at double precision using Boost.Math's facilities for the Gamma and Bessel\nfunction calls it would look like this:\n\n*/\n\ndouble JEL1(double v, double z)\n{\n   return boost::math::tgamma(v + 1) * boost::math::cyl_bessel_j(v, z) / std::pow(z / 2, v);\n}\n\n/*`\nCalling this function as:\n\n   std::cout << std::scientific << std::setprecision(std::numeric_limits<double>::digits10);\n   std::cout << JEL1(2.5, 0.5) << std::endl;\n\nYields the output:\n\n[pre 9.822663964796047e-001]\n\nNow let's implement the function again, but this time using the multiprecision type\n`cpp_dec_float_50` as the argument type:\n\n*/   \n\nboost::multiprecision::cpp_dec_float_50 \n   JEL2(boost::multiprecision::cpp_dec_float_50 v, boost::multiprecision::cpp_dec_float_50 z)\n{\n   return boost::math::tgamma(v + 1) * boost::math::cyl_bessel_j(v, z) / boost::multiprecision::pow(z / 2, v);\n}\n\n/*`\nThe implementation is almost the same as before, but with one key difference - we can no longer call\n`std::pow`, instead we must call the version inside the `boost::multiprecision` namespace.  In point of\nfact, we could have omitted the namespace prefix on the call to `pow` since the right overload would \nhave been found via [@http://en.wikipedia.org/wiki/Argument-dependent_name_lookup \nargument dependent lookup] in any case.\n\nNote also that the first argument to `pow` along with the argument to `tgamma` in the above code\nare actually expression templates.  The `pow` and `tgamma` functions will handle these arguments\njust fine.\n\nHere's an example of how the function may be called:\n\n   std::cout << std::scientific << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits10);\n   std::cout << JEL2(cpp_dec_float_50(2.5), cpp_dec_float_50(0.5)) << std::endl;\n\nWhich outputs:\n\n[pre 9.82266396479604757017335009796882833995903762577173e-01]\n\nNow that we've seen some non-template examples, lets repeat the code again, but this time as a template\nthat can be called either with a builtin type (`float`, `double` etc), or with a multiprecision type:\n\n*/\n\ntemplate <class Float>\nFloat JEL3(Float v, Float z)\n{\n   using std::pow;\n   return boost::math::tgamma(v + 1) * boost::math::cyl_bessel_j(v, z) / pow(z / 2, v);\n}\n\n/*`\n\nOnce again the code is almost the same as before, but the call to `pow` has changed yet again.\nWe need the call to resolve to either `std::pow` (when the argument is a builtin type), or\nto `boost::multiprecision::pow` (when the argument is a multiprecision type).  We do that by\nmaking the call unqualified so that versions of `pow` defined in the same namespace as type\n`Float` are found via argument dependent lookup, while the `using std::pow` directive makes\nthe standard library versions visible for builtin floating point types.\n\nLet's call the function with both `double` and multiprecision arguments:\n\n   std::cout << std::scientific << std::setprecision(std::numeric_limits<double>::digits10);\n   std::cout << JEL3(2.5, 0.5) << std::endl;\n   std::cout << std::scientific << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits10);\n   std::cout << JEL3(cpp_dec_float_50(2.5), cpp_dec_float_50(0.5)) << std::endl;\n\nWhich outputs:\n\n[pre\n9.822663964796047e-001\n9.82266396479604757017335009796882833995903762577173e-01\n]\n\nUnfortunately there is a problem with this version: if we were to call it like this:\n\n   boost::multiprecision::cpp_dec_float_50 v(2), z(0.5);\n   JEL3(v + 0.5, z);\n\nThen we would get a long and inscrutable error message from the compiler: the problem here is that the first\nargument to `JEL3` is not a number type, but an expression template.  We could obviously add a typecast to\nfix the issue:\n\n   JEL(cpp_dec_float_50(v + 0.5), z);\n\nHowever, if we want the function JEL to be truly reusable, then a better solution might be preferred.\nTo achieve this we can borrow some code from Boost.Math which calculates the return type of mixed-argument\nfunctions, here's how the new code looks now:\n\n*/\n\ntemplate <class Float1, class Float2>\ntypename boost::math::tools::promote_args<Float1, Float2>::type \n   JEL4(Float1 v, Float2 z)\n{\n   using std::pow;\n   return boost::math::tgamma(v + 1) * boost::math::cyl_bessel_j(v, z) / pow(z / 2, v);\n}\n\n/*`\n\nAs you can see the two arguments to the function are now separate template types, and\nthe return type is computed using the `promote_args` metafunction from Boost.Math.\n\nNow we can call:\n\n   std::cout << std::scientific << std::setprecision(std::numeric_limits<cpp_dec_float_100>::digits10);\n   std::cout << JEL4(cpp_dec_float_100(2) + 0.5, cpp_dec_float_100(0.5)) << std::endl;\n\nAnd get 100 digits of output:\n\n[pre 9.8226639647960475701733500979688283399590376257717309069410413822165082248153638454147004236848917775e-01]\n\nAs a bonus, we can now call the function not just with expression templates, but with other mixed types as well:\nfor example `float` and `double` or `int` and `double`, and the correct return type will be computed in each case.\n\nNote that while in this case we didn't have to change the body of the function, in the general case\nany function like this which creates local variables internally would have to use `promote_args`\nto work out what type those variables should be, for example:\n\n   template <class Float1, class Float2>\n   typename boost::math::tools::promote_args<Float1, Float2>::type \n      JEL5(Float1 v, Float2 z)\n   {\n      using std::pow;\n      typedef typename boost::math::tools::promote_args<Float1, Float2>::type variable_type;\n      variable_type t = pow(z / 2, v);\n      return boost::math::tgamma(v + 1) * boost::math::cyl_bessel_j(v, z) / t;\n   }\n\n*/\n\n//]\n\n//[ND1\n\n/*`\nIn this example we'll add even more power to generic numeric programming using not only different\nfloating-point types but also function objects as template parameters. Consider\nsome well-known central difference rules for numerically computing the first derivative\nof a function ['f[prime](x)] with ['x [isin] [real]]:\n\n[equation floating_point_eg1]\n\nWhere the difference terms ['m[sub n]] are given by:\n\n[equation floating_point_eg2]\n\nand ['dx] is the step-size of the derivative.\n\nThe third formula in Equation 1 is a three-point central difference rule. It calculates\nthe first derivative of ['f[prime](x)] to ['O(dx[super 6])], where ['dx] is the given step-size. \nFor example, if\nthe step-size is 0.01 this derivative calculation has about 6 decimal digits of precision - \njust about right for the 7 decimal digits of single-precision float.\nLet's make a generic template subroutine using this three-point central difference\nrule.  In particular:\n*/\n\ntemplate<typename value_type, typename function_type>\n   value_type derivative(const value_type x, const value_type dx, function_type func)\n{\n   // Compute d/dx[func(*first)] using a three-point\n   // central difference rule of O(dx^6).\n\n   const value_type dx1 = dx;\n   const value_type dx2 = dx1 * 2;\n   const value_type dx3 = dx1 * 3;\n\n   const value_type m1 = (func(x + dx1) - func(x - dx1)) / 2;\n   const value_type m2 = (func(x + dx2) - func(x - dx2)) / 4;\n   const value_type m3 = (func(x + dx3) - func(x - dx3)) / 6;\n\n   const value_type fifteen_m1 = 15 * m1;\n   const value_type six_m2     =  6 * m2;\n   const value_type ten_dx1    = 10 * dx1;\n\n   return ((fifteen_m1 - six_m2) + m3) / ten_dx1;\n}\n\n/*`The `derivative()` template function can be used to compute the first derivative\nof any function to ['O(dx[super 6])]. For example, consider the first derivative of ['sin(x)] evaluated\nat ['x = [pi]/3]. In other words,\n\n[equation floating_point_eg3]\n\nThe code below computes the derivative in Equation 3 for float, double and boost's\nmultiple-precision type cpp_dec_float_50.\n*/\n\n//]\n\n//[GI1\n\n/*`\nSimilar to the generic derivative example, we can calculate integrals in a similar manner:\n*/\n\ntemplate<typename value_type, typename function_type>\ninline value_type integral(const value_type a, \n                           const value_type b, \n                           const value_type tol, \n                           function_type func)\n{\n   unsigned n = 1U;\n\n   value_type h = (b - a);\n   value_type I = (func(a) + func(b)) * (h / 2);\n\n   for(unsigned k = 0U; k < 8U; k++)\n   {\n      h /= 2;\n\n      value_type sum(0);\n      for(unsigned j = 1U; j <= n; j++)\n      {\n         sum += func(a + (value_type((j * 2) - 1) * h));\n      }\n\n      const value_type I0 = I;\n      I = (I / 2) + (h * sum);\n\n      const value_type ratio     = I0 / I;\n      const value_type delta     = ratio - 1;\n      const value_type delta_abs = ((delta < 0) ? -delta : delta);\n\n      if((k > 1U) && (delta_abs < tol))\n      {\n         break;\n      }\n\n      n *= 2U;\n   }\n\n   return I;\n}\n\n/*`\nThe following sample program shows how the function can be called, we begin\nby defining a function object, which when integrated should yield the Bessel J\nfunction:\n*/\n\ntemplate<typename value_type>\nclass cyl_bessel_j_integral_rep\n{\npublic:\n   cyl_bessel_j_integral_rep(const unsigned N,\n      const value_type& X) : n(N), x(X) { }\n\n   value_type operator()(const value_type& t) const\n   {\n      // pi * Jn(x) = Int_0^pi [cos(x * sin(t) - n*t) dt]\n      return cos(x * sin(t) - (n * t));\n   }\n\nprivate:\n   const unsigned n;\n   const value_type x;\n};\n\n\n//]\n\n//[POLY\n\n/*`\nIn this example we'll look at polynomial evaluation, this is not only an important\nuse case, but it's one that `number` performs particularly well at because the\nexpression templates ['completely eliminate all temporaries] from a \n[@http://en.wikipedia.org/wiki/Horner%27s_method Horner polynomial\nevaluation scheme].\n\nThe following code evaluates `sin(x)` as a polynomial, accurate to at least 64 decimal places:\n\n*/\n\nusing boost::multiprecision::cpp_dec_float;\ntypedef boost::multiprecision::number<cpp_dec_float<64> > mp_type;\n\nmp_type mysin(const mp_type& x)\n{\n  // Approximation of sin(x * pi/2) for -1 <= x <= 1, using an order 63 polynomial.\n  static const std::array<mp_type, 32U> coefs =\n  {{\n    mp_type(\"+1.5707963267948966192313216916397514420985846996875529104874722961539082031431044993140174126711\"), //\"),\n    mp_type(\"-0.64596409750624625365575656389794573337969351178927307696134454382929989411386887578263960484\"), // ^3\n    mp_type(\"+0.07969262624616704512050554949047802252091164235106119545663865720995702920146198554317279\"), // ^5\n    mp_type(\"-0.0046817541353186881006854639339534378594950280185010575749538605102665157913157426229824\"), // ^7\n    mp_type(\"+0.00016044118478735982187266087016347332970280754062061156858775174056686380286868007443\"), // ^9\n    mp_type(\"-3.598843235212085340458540018208389404888495232432127661083907575106196374913134E-6\"), // ^11\n    mp_type(\"+5.692172921967926811775255303592184372902829756054598109818158853197797542565E-8\"), // ^13\n    mp_type(\"-6.688035109811467232478226335783138689956270985704278659373558497256423498E-10\"), // ^15\n    mp_type(\"+6.066935731106195667101445665327140070166203261129845646380005577490472E-12\"), // ^17\n    mp_type(\"-4.377065467313742277184271313776319094862897030084226361576452003432E-14\"), // ^19\n    mp_type(\"+2.571422892860473866153865950420487369167895373255729246889168337E-16\"), // ^21\n    mp_type(\"-1.253899540535457665340073300390626396596970180355253776711660E-18\"), // ^23\n    mp_type(\"+5.15645517658028233395375998562329055050964428219501277474E-21\"), // ^25\n    mp_type(\"-1.812399312848887477410034071087545686586497030654642705E-23\"), // ^27\n    mp_type(\"+5.50728578652238583570585513920522536675023562254864E-26\"), // ^29\n    mp_type(\"-1.461148710664467988723468673933026649943084902958E-28\"), // ^31\n    mp_type(\"+3.41405297003316172502972039913417222912445427E-31\"), // ^33\n    mp_type(\"-7.07885550810745570069916712806856538290251E-34\"), // ^35\n    mp_type(\"+1.31128947968267628970845439024155655665E-36\"), // ^37\n    mp_type(\"-2.18318293181145698535113946654065918E-39\"), // ^39\n    mp_type(\"+3.28462680978498856345937578502923E-42\"), // ^41\n    mp_type(\"-4.48753699028101089490067137298E-45\"), // ^43\n    mp_type(\"+5.59219884208696457859353716E-48\"), // ^45\n    mp_type(\"-6.38214503973500471720565E-51\"), // ^47\n    mp_type(\"+6.69528558381794452556E-54\"), // ^49\n    mp_type(\"-6.47841373182350206E-57\"), // ^51\n    mp_type(\"+5.800016389666445E-60\"), // ^53\n    mp_type(\"-4.818507347289E-63\"), // ^55\n    mp_type(\"+3.724683686E-66\"), // ^57\n    mp_type(\"-2.6856479E-69\"), // ^59\n    mp_type(\"+1.81046E-72\"), // ^61\n    mp_type(\"-1.133E-75\"), // ^63\n  }};\n\n  const mp_type v = x * 2 / boost::math::constants::pi<mp_type>();\n  const mp_type x2 = (v * v);\n  //\n  // Polynomial evaluation follows, if mp_type allocates memory then\n  // just one such allocation occurs - to initialize the variable \"sum\" -\n  // and no temporaries are created at all.\n  //\n  const mp_type sum = (((((((((((((((((((((((((((((((     + coefs[31U]\n                                                     * x2 + coefs[30U])\n                                                     * x2 + coefs[29U])\n                                                     * x2 + coefs[28U])\n                                                     * x2 + coefs[27U])\n                                                     * x2 + coefs[26U])\n                                                     * x2 + coefs[25U])\n                                                     * x2 + coefs[24U])\n                                                     * x2 + coefs[23U])\n                                                     * x2 + coefs[22U])\n                                                     * x2 + coefs[21U])\n                                                     * x2 + coefs[20U])\n                                                     * x2 + coefs[19U])\n                                                     * x2 + coefs[18U])\n                                                     * x2 + coefs[17U])\n                                                     * x2 + coefs[16U])\n                                                     * x2 + coefs[15U])\n                                                     * x2 + coefs[14U])\n                                                     * x2 + coefs[13U])\n                                                     * x2 + coefs[12U])\n                                                     * x2 + coefs[11U])\n                                                     * x2 + coefs[10U])\n                                                     * x2 + coefs[9U])\n                                                     * x2 + coefs[8U])\n                                                     * x2 + coefs[7U])\n                                                     * x2 + coefs[6U])\n                                                     * x2 + coefs[5U])\n                                                     * x2 + coefs[4U])\n                                                     * x2 + coefs[3U])\n                                                     * x2 + coefs[2U])\n                                                     * x2 + coefs[1U])\n                                                     * x2 + coefs[0U])\n                                                     * v;\n\n  return sum;\n}\n\n/*`\nCalling the function like so:\n\n   mp_type pid4 = boost::math::constants::pi<mp_type>() / 4;\n   std::cout << std::setprecision(std::numeric_limits< ::mp_type>::digits10) << std::scientific;\n   std::cout << mysin(pid4) << std::endl;\n\nYields the expected output:\n\n[pre 7.0710678118654752440084436210484903928483593768847403658833986900e-01]\n\n*/\n\n//]\n\n\nint main()\n{\n   using namespace boost::multiprecision;\n   std::cout << std::scientific << std::setprecision(std::numeric_limits<double>::digits10);\n   std::cout << JEL1(2.5, 0.5) << std::endl;\n   std::cout << std::scientific << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits10);\n   std::cout << JEL2(cpp_dec_float_50(2.5), cpp_dec_float_50(0.5)) << std::endl;\n   std::cout << std::scientific << std::setprecision(std::numeric_limits<double>::digits10);\n   std::cout << JEL3(2.5, 0.5) << std::endl;\n   std::cout << std::scientific << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits10);\n   std::cout << JEL3(cpp_dec_float_50(2.5), cpp_dec_float_50(0.5)) << std::endl;\n   std::cout << std::scientific << std::setprecision(std::numeric_limits<cpp_dec_float_100>::digits10);\n   std::cout << JEL4(cpp_dec_float_100(2) + 0.5, cpp_dec_float_100(0.5)) << std::endl;\n\n   //[AOS2\n\n/*=#include <iostream>\n#include <iomanip>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing boost::multiprecision::cpp_dec_float_50;\n\nint main(int, char**)\n{*/\n   const float r_f(float(123) / 100);\n   const float a_f = area_of_a_circle(r_f);\n\n   const double r_d(double(123) / 100);\n   const double a_d = area_of_a_circle(r_d);\n\n   const cpp_dec_float_50 r_mp(cpp_dec_float_50(123) / 100);\n   const cpp_dec_float_50 a_mp = area_of_a_circle(r_mp);\n\n   // 4.75292\n   std::cout\n      << std::setprecision(std::numeric_limits<float>::digits10)\n      << a_f\n      << std::endl;\n\n   // 4.752915525616\n   std::cout\n      << std::setprecision(std::numeric_limits<double>::digits10)\n      << a_d\n      << std::endl;\n\n   // 4.7529155256159981904701331745635599135018975843146\n   std::cout\n      << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits10)\n      << a_mp\n      << std::endl;\n/*=}*/\n\n   //]\n\n   //[ND2\n/*=\n#include <iostream>\n#include <iomanip>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include <boost/math/constants/constants.hpp>\n\n\nint main(int, char**)\n{*/\n   using boost::math::constants::pi;\n   using boost::multiprecision::cpp_dec_float_50;\n   //\n   // We'll pass a function pointer for the function object passed to derivative,\n   // the typecast is needed to select the correct overload of std::sin:\n   //\n   const float d_f = derivative(\n      pi<float>() / 3,\n      0.01F,\n      static_cast<float(*)(float)>(std::sin)\n   );\n\n   const double d_d = derivative(\n      pi<double>() / 3,\n      0.001,\n      static_cast<double(*)(double)>(std::sin)\n      );\n   //\n   // In the cpp_dec_float_50 case, the sin function is multiply overloaded\n   // to handle expression templates etc.  As a result it's hard to take its\n   // address without knowing about its implementation details.  We'll use a \n   // C++11 lambda expression to capture the call.\n   // We also need a typecast on the first argument so we don't accidentally pass\n   // an expression template to a template function:\n   //\n   const cpp_dec_float_50 d_mp = derivative(\n      cpp_dec_float_50(pi<cpp_dec_float_50>() / 3),\n      cpp_dec_float_50(1.0E-9),\n      [](const cpp_dec_float_50& x) -> cpp_dec_float_50\n      {\n         return sin(x);\n      }\n      );\n\n   // 5.000029e-001\n   std::cout\n      << std::setprecision(std::numeric_limits<float>::digits10)\n      << d_f\n      << std::endl;\n\n   // 4.999999999998876e-001\n   std::cout\n      << std::setprecision(std::numeric_limits<double>::digits10)\n      << d_d\n      << std::endl;\n\n   // 4.99999999999999999999999999999999999999999999999999e-01\n   std::cout\n      << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits10)\n      << d_mp\n      << std::endl;\n//=}\n\n   /*`\n   The expected value of the derivative is 0.5. This central difference rule in this\n   example is ill-conditioned, meaning it suffers from slight loss of precision. With that\n   in mind, the results agree with the expected value of 0.5.*/\n\n   //]\n\n   //[ND3\n\n   /*`\n   We can take this a step further and use our derivative function to compute\n   a partial derivative.  For example if we take the incomplete gamma function\n   ['P(a, z)], and take the derivative with respect to /z/ at /(2,2)/ then we\n   can calculate the result as shown below, for good measure we'll compare with\n   the \"correct\" result obtained from a call to ['gamma_p_derivative], the results\n   agree to approximately 44 digits:\n   */\n\n   cpp_dec_float_50 gd = derivative(\n      cpp_dec_float_50(2),\n      cpp_dec_float_50(1.0E-9),\n      [](const cpp_dec_float_50& x) ->cpp_dec_float_50\n      {\n         return boost::math::gamma_p(2, x);\n      }\n   );\n   // 2.70670566473225383787998989944968806815263091819151e-01\n   std::cout\n      << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits10)\n      << gd\n      << std::endl;\n   // 2.70670566473225383787998989944968806815253190143120e-01\n   std::cout << boost::math::gamma_p_derivative(cpp_dec_float_50(2), cpp_dec_float_50(2)) << std::endl;\n   //]\n\n   //[GI2\n\n   /* The function can now be called as follows: */\n/*=int main(int, char**)\n{*/\n   using boost::math::constants::pi;\n   typedef boost::multiprecision::cpp_dec_float_50 mp_type;\n\n   const float j2_f =\n      integral(0.0F,\n      pi<float>(),\n      0.01F,\n      cyl_bessel_j_integral_rep<float>(2U, 1.23F)) / pi<float>();\n\n   const double j2_d =\n      integral(0.0,\n      pi<double>(),\n      0.0001,\n      cyl_bessel_j_integral_rep<double>(2U, 1.23)) / pi<double>();\n\n   const mp_type j2_mp =\n      integral(mp_type(0),\n      pi<mp_type>(),\n      mp_type(1.0E-20),\n      cyl_bessel_j_integral_rep<mp_type>(2U, mp_type(123) / 100)) / pi<mp_type>();\n\n   // 0.166369\n   std::cout\n      << std::setprecision(std::numeric_limits<float>::digits10)\n      << j2_f\n      << std::endl;\n\n   // 0.166369383786814\n   std::cout\n      << std::setprecision(std::numeric_limits<double>::digits10)\n      << j2_d\n      << std::endl;\n\n   // 0.16636938378681407351267852431513159437103348245333\n   std::cout\n      << std::setprecision(std::numeric_limits<mp_type>::digits10)\n      << j2_mp\n      << std::endl;\n\n   //\n   // Print true value for comparison:\n   // 0.166369383786814073512678524315131594371033482453329\n   std::cout << boost::math::cyl_bessel_j(2, mp_type(123) / 100) << std::endl;\n//=}\n\n   //]\n\n   std::cout << std::setprecision(std::numeric_limits< ::mp_type>::digits10) << std::scientific;\n   std::cout << mysin(boost::math::constants::pi< ::mp_type>() / 4) << std::endl;\n   std::cout << boost::multiprecision::sin(boost::math::constants::pi< ::mp_type>() / 4) << std::endl;\n\n   return 0;\n}\n\n/*\n\nProgram output:\n\n9.822663964796047e-001\n9.82266396479604757017335009796882833995903762577173e-01\n9.822663964796047e-001\n9.82266396479604757017335009796882833995903762577173e-01\n9.8226639647960475701733500979688283399590376257717309069410413822165082248153638454147004236848917775e-01\n4.752916e+000\n4.752915525615998e+000\n4.75291552561599819047013317456355991350189758431460e+00\n5.000029e-001\n4.999999999998876e-001\n4.99999999999999999999999999999999999999999999999999e-01\n2.70670566473225383787998989944968806815263091819151e-01\n2.70670566473225383787998989944968806815253190143120e-01\n7.0710678118654752440084436210484903928483593768847403658833986900e-01\n7.0710678118654752440084436210484903928483593768847403658833986900e-01\n*/\n\n#else\n\nint main() { return 0; }\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/gauss_laguerre_quadrature.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//      Copyright Christopher Kormanyos 2012 - 2015, 2020.\n// Distributed under the Boost Software License, Version 1.0.\n//    (See accompanying file LICENSE_1_0.txt or copy at\n//          http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// This example uses Boost.Multiprecision to implement\n// a high-precision Gauss-Laguerre quadrature integration.\n// The quadrature is used to calculate the airy_ai(x) function\n// for real-valued x on the positive axis with x.ge.1.\n\n// In this way, the integral representation could be seen\n// as part of a scheme to calculate real-valued Airy functions\n// on the positive axis for medium to large argument.\n// A Taylor series or hypergeometric function (not part\n// of this example) could be used for smaller arguments.\n\n// This example has been tested with decimal digits counts\n// ranging from 21...301, by adjusting the parameter\n// local::my_digits10 at compile time.\n\n// The quadrature integral representaion of airy_ai(x) used\n// in this example can be found in:\n\n// A. Gil, J. Segura, N.M. Temme, \"Numerical Methods for Special\n// Functions\" (SIAM Press 2007), Sect. 5.3.3, in particular Eq. 5.110,\n// page 145. Subsequently, Gil et al's book cites the another work:\n// W. Gautschi, \"Computation of Bessel and Airy functions and of\n// related Gaussian quadrature formulae\", BIT, 42 (2002), pp. 110-118.\n\n#include <cmath>\n#include <cstdint>\n#include <functional>\n#include <iomanip>\n#include <iostream>\n#include <numeric>\n#include <sstream>\n#include <tuple>\n#include <vector>\n\n#include <boost/cstdfloat.hpp>\n#include <boost/math/constants/constants.hpp>\n#include <boost/math/special_functions/cbrt.hpp>\n#include <boost/math/special_functions/bessel.hpp>\n#include <boost/math/special_functions/factorials.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#include <boost/math/tools/roots.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include <boost/noncopyable.hpp>\n\nnamespace gauss { namespace laguerre {\n\nnamespace util {\n\nvoid progress_bar(std::ostream& os, const float percent);\n\nvoid progress_bar(std::ostream& os, const float percent)\n{\n  std::stringstream strstrm;\n\n  strstrm.precision(1);\n\n  strstrm << std::fixed << percent << \"%\";\n\n  os << strstrm.str() << \"\\r\";\n\n  os.flush();\n}\n\n}\n\nnamespace detail\n{\n  template<typename T>\n  class laguerre_l_object BOOST_FINAL\n  {\n  public:\n    laguerre_l_object(const int n, const T a) noexcept\n      : order(n),\n        alpha(a),\n        p1   (0),\n        d2   (0) { }\n\n    laguerre_l_object& operator=(const laguerre_l_object& other)\n    {\n      if(this != other)\n      {\n        order = other.order;\n        alpha = other.alpha;\n        p1    = other.p1;\n        d2    = other.d2;\n      }\n\n      return *this;\n    }\n\n    T operator()(const T& x) const noexcept\n    {\n      // Calculate (via forward recursion):\n      // * the value of the Laguerre function L(n, alpha, x), called (p2),\n      // * the value of the derivative of the Laguerre function (d2),\n      // * and the value of the corresponding Laguerre function of\n      //   previous order (p1).\n\n      // Return the value of the function (p2) in order to be used as a\n      // function object with Boost.Math root-finding. Store the values\n      // of the Laguerre function derivative (d2) and the Laguerre function\n      // of previous order (p1) in class members for later use.\n\n        p1 = T(0);\n      T p2 = T(1);\n        d2 = T(0);\n\n      T j_plus_alpha = alpha;\n      T two_j_plus_one_plus_alpha_minus_x = (1 + alpha) - x;\n\n      const T my_two = 2;\n\n      for(int j = 0; j < order; ++j)\n      {\n        const T p0(p1);\n\n        // Set the value of the previous Laguerre function.\n        p1 = p2;\n\n        // Use a recurrence relation to compute the value of the Laguerre function.\n        p2 = ((two_j_plus_one_plus_alpha_minus_x * p1) - (j_plus_alpha * p0)) / (j + 1);\n\n        ++j_plus_alpha;\n        two_j_plus_one_plus_alpha_minus_x += my_two;\n      }\n\n      // Set the value of the derivative of the Laguerre function.\n      d2 = ((p2 * order) - (j_plus_alpha * p1)) / x;\n\n      // Return the value of the Laguerre function.\n      return p2;\n    }\n\n    const T previous  () const noexcept { return p1; }\n    const T derivative() const noexcept { return d2; }\n\n    static bool root_tolerance(const T& a, const T& b) noexcept\n    {\n      using std::fabs;\n\n      // The relative tolerance here is: ((a - b) * 2) / (a + b).\n      return ((fabs(a - b) * 2) < (fabs(a + b) * std::numeric_limits<T>::epsilon()));\n    }\n\n  private:\n    const   int order;\n    const   T   alpha;\n    mutable T   p1;\n    mutable T   d2;\n  };\n\n  template<typename T>\n  class abscissas_and_weights : private boost::noncopyable\n  {\n  public:\n    abscissas_and_weights(const int n, const T a) : order(n),\n                                                    alpha(a),\n                                                    xi   (),\n                                                    wi   ()\n    {\n      if(alpha < -20.0F)\n      {\n        // Users can decide to perform different range checking.\n        std::cout << \"Range error: the order of the Laguerre function must exceed -20.0.\"\n                  << std::endl;\n      }\n      else\n      {\n        calculate();\n      }\n    }\n\n    const std::vector<T>& abscissa_n() const noexcept { return xi; }\n    const std::vector<T>& weight_n  () const noexcept { return wi; }\n\n  private:\n    const int order;\n    const T   alpha;\n\n    std::vector<T> xi;\n    std::vector<T> wi;\n\n    abscissas_and_weights() : order(),\n                              alpha(),\n                              xi   (),\n                              wi   () { }\n\n    void calculate()\n    {\n      using std::abs;\n\n      std::cout << \"Finding the approximate roots...\" << std::endl;\n\n      std::vector<std::tuple<T, T>> root_estimates;\n\n      root_estimates.reserve(static_cast<typename std::vector<std::tuple<T, T>>::size_type>(order));\n\n      const laguerre_l_object<T> laguerre_root_object(order, alpha);\n\n      // Set the initial values of the step size and the running step\n      // to be used for finding the estimate of the first root.\n      T step_size  = 0.01F;\n      T step       = step_size;\n\n      T first_laguerre_root = 0.0F;\n\n      if(alpha < -1.0F)\n      {\n        // Iteratively step through the Laguerre function using a\n        // small step-size in order to find a rough estimate of\n        // the first zero.\n\n        const bool this_laguerre_value_is_negative = (laguerre_root_object(T(0)) < 0);\n\n        constexpr int j_max = 10000;\n\n        int j = 0;\n\n        while((j < j_max) && (this_laguerre_value_is_negative != (laguerre_root_object(step) < 0)))\n        {\n          // Increment the step size until the sign of the Laguerre function\n          // switches. This indicates a zero-crossing, signalling the next root.\n          step += step_size;\n\n          ++j;\n        }\n      }\n      else\n      {\n        // Calculate an estimate of the 1st root of a generalized Laguerre\n        // function using either a Taylor series or an expansion in Bessel\n        // function zeros. The Bessel function zeros expansion is from Tricomi.\n\n        // Here, we obtain an estimate of the first zero of cyl_bessel_j(alpha, x).\n\n        T j_alpha_m1;\n\n        if(alpha < 1.4F)\n        {\n          // For small alpha, use a short series obtained from Mathematica(R).\n          // Series[BesselJZero[v, 1], {v, 0, 3}]\n          // N[%, 12]\n          j_alpha_m1 = (((          T(0.09748661784476F)\n                          * alpha - T(0.17549359276115F))\n                          * alpha + T(1.54288974259931F))\n                          * alpha + T(2.40482555769577F));\n        }\n        else\n        {\n          // For larger alpha, use the first line of Eqs. 10.21.40 in the NIST Handbook.\n          const T alpha_pow_third(boost::math::cbrt(alpha));\n          const T alpha_pow_minus_two_thirds(T(1) / (alpha_pow_third * alpha_pow_third));\n\n          j_alpha_m1 = alpha * (((((                             + T(0.043F)\n                                    * alpha_pow_minus_two_thirds - T(0.0908F))\n                                    * alpha_pow_minus_two_thirds - T(0.00397F))\n                                    * alpha_pow_minus_two_thirds + T(1.033150F))\n                                    * alpha_pow_minus_two_thirds + T(1.8557571F))\n                                    * alpha_pow_minus_two_thirds + T(1.0F));\n        }\n\n        const T vf             = (  T(order * 4U)\n                                  + T(alpha * 2U)\n                                  + T(2U));\n        const T vf2            = vf * vf;\n        const T j_alpha_m1_sqr = j_alpha_m1 * j_alpha_m1;\n\n        first_laguerre_root = (j_alpha_m1_sqr * (   -T(0.6666666666667F)\n                                                 + ((T(0.6666666666667F) * alpha) * alpha)\n                                                 +  (T(0.3333333333333F) * j_alpha_m1_sqr) + vf2)) / (vf2 * vf);\n      }\n\n      bool this_laguerre_value_is_negative = (laguerre_root_object(T(0)) < 0);\n\n      // Re-set the initial value of the step-size based on the\n      // estimate of the first root.\n      step_size = first_laguerre_root / 2;\n      step      = step_size;\n\n      // Step through the Laguerre function using a step-size\n      // of dynamic width in order to find the zero crossings\n      // of the Laguerre function, providing rough estimates\n      // of the roots. Refine the brackets with a few bisection\n      // steps, and store the results as bracketed root estimates.\n\n      while(root_estimates.size() < static_cast<std::size_t>(order))\n      {\n        // Increment the step size until the sign of the Laguerre function\n        // switches. This indicates a zero-crossing, signalling the next root.\n        step += step_size;\n\n        if(this_laguerre_value_is_negative != (laguerre_root_object(step) < 0))\n        {\n          // We have found the next zero-crossing.\n\n          // Change the running sign of the Laguerre function.\n          this_laguerre_value_is_negative = (!this_laguerre_value_is_negative);\n\n          // We have found the first zero-crossing. Put a loose bracket around\n          // the root using a window. Here, we know that the first root lies\n          // between (x - step_size) < root < x.\n\n          // Before storing the approximate root, perform a couple of\n          // bisection steps in order to tighten up the root bracket.\n          std::uintmax_t a_couple_of_iterations = 4U;\n\n          const std::pair<T, T>\n            root_estimate_bracket = boost::math::tools::bisect(laguerre_root_object,\n                                                               step - step_size,\n                                                               step,\n                                                               laguerre_l_object<T>::root_tolerance,\n                                                               a_couple_of_iterations);\n\n          static_cast<void>(a_couple_of_iterations);\n\n          // Store the refined root estimate as a bracketed range in a tuple.\n          root_estimates.push_back(std::tuple<T, T>(std::get<0>(root_estimate_bracket),\n                                                    std::get<1>(root_estimate_bracket)));\n\n          if(    (root_estimates.size() == 1U)\n             || ((root_estimates.size() % 8U) == 0U)\n             ||  (root_estimates.size() == static_cast<std::size_t>(order)))\n          {\n            const float progress = (100.0F * static_cast<float>(root_estimates.size())) / static_cast<float>(order);\n\n            std::cout << \"root_estimates.size(): \"\n                      << root_estimates.size()\n                      << \", \"\n                      ;\n\n            util::progress_bar(std::cout, progress);\n          }\n\n          if(root_estimates.size() >= static_cast<std::size_t>(2U))\n          {\n            // Determine the next step size. This is based on the distance between\n            // the previous two roots, whereby the estimates of the previous roots\n            // are computed by taking the average of the lower and upper range of\n            // the root-estimate bracket.\n\n            const T r0 = (  std::get<0>(*(root_estimates.crbegin() + 1U))\n                          + std::get<1>(*(root_estimates.crbegin() + 1U))) / 2;\n\n            const T r1 = (  std::get<0>(*root_estimates.crbegin())\n                          + std::get<1>(*root_estimates.crbegin())) / 2;\n\n            const T distance_between_previous_roots = r1 - r0;\n\n            step_size = distance_between_previous_roots / 3;\n          }\n        }\n      }\n\n      const T norm_g =\n        ((alpha == 0) ? T(-1)\n                      : -boost::math::tgamma(alpha + order) / boost::math::factorial<T>(order - 1));\n\n      xi.reserve(root_estimates.size());\n      wi.reserve(root_estimates.size());\n\n      std::cout << std::endl;\n\n      // Calculate the abscissas and weights to full precision.\n      for(std::size_t i = static_cast<std::size_t>(0U); i < root_estimates.size(); ++i)\n      {\n        if(   ((i % 8U) == 0U)\n           || ( i == root_estimates.size() - 1U))\n        {\n          const float progress = (100.0F * static_cast<float>(i + 1U)) / static_cast<float>(root_estimates.size());\n\n          std::cout << \"Calculating abscissas and weights. Processed \"\n                    << (i + 1U)\n                    << \", \"\n                    ;\n\n          util::progress_bar(std::cout, progress);\n        }\n\n        // Calculate the abscissas using iterative root-finding.\n\n        // Select the maximum allowed iterations, being at least 20.\n        // The determination of the maximum allowed iterations is\n        // based on the number of decimal digits in the numerical\n        // type T.\n        constexpr int local_math_tools_digits10 =\n          static_cast<int>(static_cast<boost::float_least32_t>(boost::math::tools::digits<T>()) * BOOST_FLOAT32_C(0.301));\n\n        const std::uintmax_t number_of_iterations_allowed = (std::max)(20, local_math_tools_digits10 / 2);\n\n        std::uintmax_t number_of_iterations_used = number_of_iterations_allowed;\n\n        // Perform the root-finding using ACM TOMS 748 from Boost.Math.\n        const std::pair<T, T>\n          laguerre_root_bracket = boost::math::tools::toms748_solve(laguerre_root_object,\n                                                                    std::get<0>(root_estimates.at(i)),\n                                                                    std::get<1>(root_estimates.at(i)),\n                                                                    laguerre_l_object<T>::root_tolerance,\n                                                                    number_of_iterations_used);\n\n        static_cast<void>(number_of_iterations_used);\n\n        // Compute the Laguerre root as the average of the values from\n        // the solved root bracket.\n        const T laguerre_root = (  std::get<0>(laguerre_root_bracket)\n                                 + std::get<1>(laguerre_root_bracket)) / 2;\n\n        // Calculate the weight for this Laguerre root. Here, we calculate\n        // the derivative of the Laguerre function and the value of the\n        // previous Laguerre function on the x-axis at the value of this\n        // Laguerre root.\n        static_cast<void>(laguerre_root_object(laguerre_root));\n\n        // Store the abscissa and weight for this index.\n        xi.push_back(laguerre_root);\n        wi.push_back(norm_g / ((laguerre_root_object.derivative() * order) * laguerre_root_object.previous()));\n      }\n\n      std::cout << std::endl;\n    }\n  };\n\n  template<typename T>\n  struct airy_ai_object BOOST_FINAL\n  {\n  public:\n    airy_ai_object(const T& x)\n      : my_x     (x),\n        my_zeta  (((sqrt(x) * x) * 2) / 3),\n        my_factor(make_factor(my_zeta)) { }\n\n    T operator()(const T& t) const\n    {\n      using std::sqrt;\n\n      return my_factor / sqrt(boost::math::cbrt(2 + (t / my_zeta)));\n    }\n\n  private:\n    const T my_x;\n    const T my_zeta;\n    const T my_factor;\n\n    airy_ai_object() : my_x     (),\n                       my_zeta  (),\n                       my_factor() { }\n\n    static T make_factor(const T& z)\n    {\n      using std::exp;\n      using std::sqrt;\n\n      return 1 / ((sqrt(boost::math::constants::pi<T>()) * sqrt(boost::math::cbrt(z * 48))) * (exp(z) * boost::math::tgamma(T(5) / 6)));\n    }\n  };\n} // namespace detail\n\n} } // namespace gauss::laguerre\n\n\n// A float_type is created to handle the desired number of decimal digits from `cpp_dec_float` without using __expression_templates.\nstruct local\n{\n  static constexpr unsigned int my_digits10 = 101U;\n\n  typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<my_digits10>,\n                                        boost::multiprecision::et_off>\n  float_type;\n};\n\nstatic_assert(local::my_digits10 > 20U,\n                        \"Error: This example is intended to have more than 20 decimal digits\");\n\nint main()\n{\n  // Use Gauss-Laguerre quadrature integration to compute airy_ai(x / 7)\n  // with 7 <= x <= 120 and where x is incremented in steps of 1.\n\n  // During development of this example, we have empirically found\n  // the numbers of Gauss-Laguerre coefficients needed for convergence\n  // when using various counts of base-10 digits.\n\n  // Let's calibrate, for instance, the number of coefficients needed\n  // at the point x = 1.\n\n  // Empirical data lead to:\n  // Fit[{{21.0, 3.5}, {51.0, 11.1}, {101.0, 22.5}, {201.0, 46.8}}, {1, d, d^2}, d]\n  // FullSimplify[%]\n  // -1.28301 + (0.235487 + 0.0000178915 d) d\n\n  // We need significantly more coefficients at smaller real values than are needed\n  // at larger real values because the slope derivative of airy_ai(x) gets more\n  // steep as x approaches zero.\n\n  // This Gauss-Laguerre quadrature is designed for airy_ai(x) with real-valued x >= 1.\n\n  constexpr boost::float_least32_t d = static_cast<boost::float_least32_t>(std::numeric_limits<local::float_type>::digits10);\n\n  constexpr boost::float_least32_t laguerre_order_factor = -1.28301F + ((0.235487F + (0.0000178915F * d)) * d);\n\n  constexpr int laguerre_order = static_cast<int>(laguerre_order_factor * d);\n\n  std::cout << \"std::numeric_limits<local::float_type>::digits10: \" << std::numeric_limits<local::float_type>::digits10 << std::endl;\n  std::cout << \"laguerre_order: \" << laguerre_order << std::endl;\n\n  typedef gauss::laguerre::detail::abscissas_and_weights<local::float_type> abscissas_and_weights_type;\n\n  const abscissas_and_weights_type the_abscissas_and_weights(laguerre_order, local::float_type(-1) / 6);\n\n  bool result_is_ok = true;\n\n  for(std::uint32_t u = 7U; u < 121U; ++u)\n  {\n    const local::float_type x = local::float_type(u) / 7;\n\n    typedef gauss::laguerre::detail::airy_ai_object<local::float_type> airy_ai_object_type;\n\n    const airy_ai_object_type the_airy_ai_object(x);\n\n    const local::float_type airy_ai_value =\n      std::inner_product(the_abscissas_and_weights.abscissa_n().cbegin(),\n                         the_abscissas_and_weights.abscissa_n().cend(),\n                         the_abscissas_and_weights.weight_n().cbegin(),\n                         local::float_type(0U),\n                         std::plus<local::float_type>(),\n                         [&the_airy_ai_object](const local::float_type& this_abscissa,\n                                               const local::float_type& this_weight) -> local::float_type\n                         {\n                           return the_airy_ai_object(this_abscissa) * this_weight;\n                         });\n\n    static const local::float_type one_third = 1.0F / local::float_type(3U);\n\n    static const local::float_type one_over_pi_times_one_over_sqrt_three =\n      sqrt(one_third) * boost::math::constants::one_div_pi<local::float_type>();\n\n    const local::float_type sqrt_x = sqrt(x);\n\n    const local::float_type airy_ai_control =\n       (sqrt_x * one_over_pi_times_one_over_sqrt_three)\n      * boost::math::cyl_bessel_k(one_third, ((2.0F * x) * sqrt_x) * one_third);\n\n    std::cout << std::setprecision(std::numeric_limits<local::float_type>::digits10)\n              << \"airy_ai_value  : \"\n              << airy_ai_value\n              << std::endl;\n\n    std::cout << std::setprecision(std::numeric_limits<local::float_type>::digits10)\n              << \"airy_ai_control: \"\n              << airy_ai_control\n              << std::endl;\n\n    const local::float_type delta = fabs(1.0F - (airy_ai_control / airy_ai_value));\n\n    static const local::float_type tol(\"1E-\" + boost::lexical_cast<std::string>(std::numeric_limits<local::float_type>::digits10 - 7U));\n\n    result_is_ok &= (delta < tol);\n  }\n\n  std::cout << std::endl\n            << \"Total... result_is_ok: \"\n            << std::boolalpha\n            << result_is_ok\n            << std::endl;\n} // int main()\n\n/*\n\n\nPartial output:\n\n//[gauss_laguerre_quadrature_output_1\n\nstd::numeric_limits<local::float_type>::digits10: 101\nlaguerre_order: 2291\n\nFinding the approximate roots...\nroot_estimates.size(): 1, 0.0%\nroot_estimates.size(): 8, 0.3%\nroot_estimates.size(): 16, 0.7%\n...\nroot_estimates.size(): 2288, 99.9%\nroot_estimates.size(): 2291, 100.0%\n\n\nCalculating abscissas and weights. Processed 1, 0.0%\nCalculating abscissas and weights. Processed 9, 0.4%\n...\nCalculating abscissas and weights. Processed 2289, 99.9%\nCalculating abscissas and weights. Processed 2291, 100.0%\n//] [/gauss_laguerre_quadrature_output_1]\n\n//[gauss_laguerre_quadrature_output_2\n\nairy_ai_value  : 0.13529241631288141552414742351546630617494414298833070600910205475763353480226572366348710990874867334\nairy_ai_control: 0.13529241631288141552414742351546630617494414298833070600910205475763353480226572366348710990874868323\nairy_ai_value  : 0.11392302126009621102904231059693500086750049240884734708541630001378825889924647699516200868335286103\nairy_ai_control: 0.1139230212600962110290423105969350008675004924088473470854163000137882588992464769951620086833528582\n...\nairy_ai_value  : 3.8990420982303275013276114626640705170145070824317976771461533035231088620152288641360519429331427451e-22\nairy_ai_control: 3.8990420982303275013276114626640705170145070824317976771461533035231088620152288641360519429331426481e-22\n\nTotal... result_is_ok: true\n\n//] [/gauss_laguerre_quadrature_output_2]\n\n\n*/\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/gmp_snips.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#include <iostream>\n\nvoid t1()\n{\n   //[mpz_eg\n//=#include <boost/multiprecision/gmp.hpp>\n//=#include <iostream>\n//=\n//=int main()\n//={\n   using namespace boost::multiprecision;\n\n   mpz_int v = 1;\n\n   // Do some arithmetic:\n   for(unsigned i = 1; i <= 1000; ++i)\n      v *= i;\n\n   std::cout << v << std::endl; // prints 1000!\n\n   // Access the underlying representation:\n   mpz_t z;\n   mpz_init(z);\n   mpz_set(z, v.backend().data());\n   mpz_clear(z);\n//=   return 0;\n//=}\n//]\n}\n\nvoid t2()\n{\n//[mpf_eg\n//=#include <boost/multiprecision/gmp.hpp>\n//=#include <boost/math/special_functions/gamma.hpp>\n//=#include <iostream>\n//=\n//=int main()\n//={\n   using namespace boost::multiprecision;\n\n   // Operations at variable precision and limited standard library support:\n   mpf_float a = 2;\n   mpf_float::default_precision(1000);\n   std::cout << mpf_float::default_precision() << std::endl;\n   std::cout << sqrt(a) << std::endl; // print root-2\n\n   // Operations at fixed precision and full standard library support:\n   mpf_float_100 b = 2;\n   std::cout << std::numeric_limits<mpf_float_100>::digits << std::endl;\n   // We can use any C++ std lib function:\n   std::cout << log(b) << std::endl; // print log(2)\n   // We can also use any function from Boost.Math:\n   std::cout << boost::math::tgamma(b) << std::endl;\n   // These even work when the argument is an expression template:\n   std::cout << boost::math::tgamma(b * b) << std::endl;\n\n   // Access the underlying representation:\n   mpf_t f;\n   mpf_init(f);\n   mpf_set(f, a.backend().data());\n   mpf_clear(f);\n//=   return 0;\n//=}\n//]\n}\n\nvoid t3()\n{\n//[mpq_eg\n//=#include <boost/multiprecision/gmp.hpp>\n//=#include <boost/multiprecision/gmp.hpp>\n//=#include <iostream>\n//=\n//=int main()\n//={\n   using namespace boost::multiprecision;\n\n   mpq_rational v = 1;\n\n   // Do some arithmetic:\n   for(unsigned i = 1; i <= 1000; ++i)\n      v *= i;\n   v /= 10;\n\n   std::cout << v << std::endl; // prints 1000! / 10\n   std::cout << numerator(v) << std::endl;\n   std::cout << denominator(v) << std::endl;\n\n   mpq_rational w(2, 3);  // component wise constructor\n   std::cout << w << std::endl; // prints 2/3\n\n   // Access the underlying data:\n   mpq_t q;\n   mpq_init(q);\n   mpq_set(q, v.backend().data());\n   mpq_clear(q);\n//=   return 0;\n//=}\n//]\n}\n\nint main()\n{\n   t1();\n   t2();\n   t3();\n   return 0;\n}\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/hashing_examples.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random.hpp>\n#include <boost/functional/hash.hpp>\n#include <unordered_set>\n#include <city.h>\n\n//[hash1\n\n/*`\nAll of the types in this library support hashing via boost::hash or std::hash.\nThat means we can use multiprecision types directly in hashed containers such as std::unordered_set:\n*/\n//]\n\nvoid t1()\n{\n   //[hash2\n   using namespace boost::multiprecision;\n   using namespace boost::random;\n\n   mt19937 mt;\n   uniform_int_distribution<uint256_t> ui;\n\n   std::unordered_set<uint256_t> set;\n   // Put 1000 random values into the container:\n   for(unsigned i = 0; i < 1000; ++i)\n      set.insert(ui(mt));\n\n   //]\n}\n\n//[hash3\n\n/*` \nOr we can define our own hash function, for example in this case based on\nGoogle's CityHash:\n*/\n\nstruct cityhash\n{\n   std::size_t operator()(const boost::multiprecision::uint256_t& val)const\n   {\n      // create a hash from all the limbs of the argument, this function is probably x64 specific,\n      // and requires that we access the internals of the data type:\n      std::size_t result = CityHash64(reinterpret_cast<const char*>(val.backend().limbs()), val.backend().size() * sizeof(val.backend().limbs()[0]));\n      // modify the returned hash based on sign:\n      return val < 0 ? ~result : result;\n   }\n};\n\n//]\n\nvoid t2()\n{\n//[hash4\n\n/*`As before insert some values into a container, this time using our custom hasher:*/\n\n   std::unordered_set<uint256_t, cityhash> set2;\n   for(unsigned i = 0; i < 1000; ++i)\n      set2.insert(ui(mt));\n\n//]\n}\n\nint main()\n{\n   t1();\n   t2();\n   return 0;\n}\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/hypergeometric_luke_algorithms.cpp",
    "content": "\n///////////////////////////////////////////////////////////////////////////////\n// Copyright Christopher Kormanyos 2013 - 2014.\n// Copyright John Maddock 2013.\n// Distributed under the Boost Software License,\n// Version 1.0. (See accompanying file LICENSE_1_0.txt\n// or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n//\n\n#include <algorithm>\n#include <cstdint>\n#include <deque>\n#include <functional>\n#include <iostream>\n#include <limits>\n#include <numeric>\n#include <vector>\n#include <boost/math/constants/constants.hpp>\n#include <boost/noncopyable.hpp>\n\n//#define USE_CPP_BIN_FLOAT\n#define USE_CPP_DEC_FLOAT\n//#define USE_MPFR\n\n#if !defined(DIGIT_COUNT)\n#define DIGIT_COUNT 100\n#endif\n\n#include <chrono>\n\n#if defined(USE_CPP_BIN_FLOAT)\n  #include <boost/multiprecision/cpp_bin_float.hpp>\n  typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<DIGIT_COUNT + 10> > mp_type;\n#elif defined(USE_CPP_DEC_FLOAT)\n  #include <boost/multiprecision/cpp_dec_float.hpp>\n  typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<DIGIT_COUNT + 10> > mp_type;\n#elif defined(USE_MPFR)\n  #include <boost/multiprecision/mpfr.hpp>\n  typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<DIGIT_COUNT + 10> > mp_type;\n#else\n  #error no multiprecision floating type is defined\n#endif\n\ntemplate <class clock_type>\nstruct stopwatch\n{\npublic:\n  typedef typename clock_type::duration duration_type;\n\n  stopwatch() : m_start(clock_type::now()) { }\n\n  stopwatch(const stopwatch& other) : m_start(other.m_start) { }\n\n  stopwatch& operator=(const stopwatch& other)\n  {\n    m_start = other.m_start;\n    return *this;\n  }\n\n  ~stopwatch() { }\n\n  duration_type elapsed() const\n  {\n    return (clock_type::now() - m_start);\n  }\n\n  void reset()\n  {\n    m_start = clock_type::now();\n  }\n\nprivate:\n  typename clock_type::time_point m_start;\n};\n\nnamespace my_math\n{\n  template<class T> T chebyshev_t(const std::int32_t n, const T& x);\n\n  template<class T> T chebyshev_t(const std::uint32_t n, const T& x, std::vector<T>* vp);\n\n  template<class T> bool isneg(const T& x) { return (x < T(0)); }\n\n  template<class T> const T& zero() { static const T value_zero(0); return value_zero; }\n  template<class T> const T& one () { static const T value_one (1); return value_one; }\n  template<class T> const T& two () { static const T value_two (2); return value_two; }\n}\n\nnamespace orthogonal_polynomial_series\n{\n  template<typename T> static inline T orthogonal_polynomial_template(const T& x, const std::uint32_t n, std::vector<T>* const vp = static_cast<std::vector<T>*>(0u))\n  {\n    // Compute the value of an orthogonal chebyshev polinomial.\n    // Use stable upward recursion.\n\n    if(vp != nullptr)\n    {\n      vp->clear();\n      vp->reserve(static_cast<std::size_t>(n + 1u));\n    }\n\n    T y0 = my_math::one<T>();\n\n    if(vp != nullptr) { vp->push_back(y0); }\n\n    if(n == static_cast<std::uint32_t>(0u))\n    {\n      return y0;\n    }\n\n    T y1 = x;\n\n    if(vp != nullptr) { vp->push_back(y1); }\n\n    if(n == static_cast<std::uint32_t>(1u))\n    {\n      return y1;\n    }\n\n    T a = my_math::two <T>();\n    T b = my_math::zero<T>();\n    T c = my_math::one <T>();\n\n    T yk;\n\n    // Calculate higher orders using the recurrence relation.\n    // The direction of stability is upward recursion.\n    for(std::int32_t k = static_cast<std::int32_t>(2); k <= static_cast<std::int32_t>(n); ++k)\n    {\n      yk = (((a * x) + b) * y1) - (c * y0);\n\n      y0 = y1;\n      y1 = yk;\n\n      if(vp != nullptr) { vp->push_back(yk); }\n    }\n\n    return yk;\n  }\n}\n\ntemplate<class T> T my_math::chebyshev_t(const std::int32_t n, const T& x)\n{\n  if(my_math::isneg(x))\n  {\n    const bool b_negate = ((n % static_cast<std::int32_t>(2)) != static_cast<std::int32_t>(0));\n\n    const T y = chebyshev_t(n, -x);\n\n    return (!b_negate ? y : -y);\n  }\n\n  if(n < static_cast<std::int32_t>(0))\n  {\n    const std::int32_t nn = static_cast<std::int32_t>(-n);\n\n    return chebyshev_t(nn, x);\n  }\n  else\n  {\n    return orthogonal_polynomial_series::orthogonal_polynomial_template(x, static_cast<std::uint32_t>(n));\n  }\n}\n\ntemplate<class T> T my_math::chebyshev_t(const std::uint32_t n, const T& x, std::vector<T>* const vp) { return orthogonal_polynomial_series::orthogonal_polynomial_template(x, static_cast<std::int32_t>(n),  vp); }\n\nnamespace util\n{\n  template <class T> float digit_scale()\n  {\n    const int d = ((std::max)(std::numeric_limits<T>::digits10, 15));\n    return static_cast<float>(d) / 300.0F;\n  }\n}\n\nnamespace examples\n{\n  namespace nr_006\n  {\n    template<typename T> class hypergeometric_pfq_base : private boost::noncopyable\n    {\n    public:\n      virtual ~hypergeometric_pfq_base() { }\n\n      virtual void ccoef() const = 0;\n\n      virtual T series() const\n      {\n        using my_math::chebyshev_t;\n\n        // Compute the Chebyshev coefficients.\n        // Get the values of the shifted Chebyshev polynomials.\n        std::vector<T> chebyshev_t_shifted_values;\n        const T z_shifted = ((Z / W) * static_cast<std::int32_t>(2)) - static_cast<std::int32_t>(1);\n\n        chebyshev_t(static_cast<std::uint32_t>(C.size()),\n                    z_shifted,\n                    &chebyshev_t_shifted_values);\n\n        // Luke: C     ---------- COMPUTE SCALE FACTOR                       ----------\n        // Luke: C\n        // Luke: C     ---------- SCALE THE COEFFICIENTS                     ----------\n        // Luke: C\n\n        // The coefficient scaling is preformed after the Chebyshev summation,\n        // and it is carried out with a single division operation.\n        bool b_neg = false;\n\n        const T scale = std::accumulate(C.begin(),\n                                        C.end(),\n                                        T(0),\n                                        [&b_neg](T scale_sum, const T& ck) -> T\n                                        {\n                                          ((!b_neg) ? (scale_sum += ck) : (scale_sum -= ck));\n                                          b_neg = (!b_neg);\n                                          return scale_sum;\n                                        });\n\n        // Compute the result of the series expansion using unscaled coefficients.\n        const T sum = std::inner_product(C.begin(),\n                                         C.end(),\n                                         chebyshev_t_shifted_values.begin(),\n                                         T(0));\n\n        // Return the properly scaled result.\n        return sum / scale;\n      }\n\n    protected:\n      const   T             Z;\n      const   T             W;\n      mutable std::deque<T> C;\n\n      hypergeometric_pfq_base(const T& z,\n                              const T& w) : Z(z),\n                                            W(w),\n                                            C(0u) { }\n\n      virtual std::int32_t N() const { return static_cast<std::int32_t>(util::digit_scale<T>() * 500.0F); }\n    };\n\n    template<typename T> class ccoef4_hypergeometric_0f1 : public hypergeometric_pfq_base<T>\n    {\n    public:\n      ccoef4_hypergeometric_0f1(const T& c,\n                                const T& z,\n                                const T& w) : hypergeometric_pfq_base<T>(z, w),\n                                              CP(c) { }\n\n      virtual ~ccoef4_hypergeometric_0f1() { }\n\n      virtual void ccoef() const\n      {\n        // See Luke 1977 page 80.\n        const std::int32_t N1 = static_cast<std::int32_t>(this->N() + static_cast<std::int32_t>(1));\n        const std::int32_t N2 = static_cast<std::int32_t>(this->N() + static_cast<std::int32_t>(2));\n\n        // Luke: C     ---------- START COMPUTING COEFFICIENTS USING         ----------\n        // Luke: C     ---------- BACKWARD RECURRENCE SCHEME                 ----------\n        // Luke: C\n        T A3(0);\n        T A2(0);\n        T A1(boost::math::tools::root_epsilon<T>());\n\n        hypergeometric_pfq_base<T>::C.resize(1u, A1);\n\n        std::int32_t X1 = N2;\n\n        T C1 = T(1) - CP;\n\n        const T Z1 = T(4) / hypergeometric_pfq_base<T>::W;\n\n        for(std::int32_t k = static_cast<std::int32_t>(0); k < N1; ++k)\n        {\n          const T DIVFAC = T(1) / X1;\n\n          --X1;\n\n          // The terms have been slightly re-arranged resulting in lower complexity.\n          // Parentheses have been added to avoid reliance on operator precedence.\n          const T term =   (A2 - ((A3 * DIVFAC) * X1))\n                         + ((A2 * X1) * ((1 + (C1 + X1)) * Z1))\n                         + ((A1 * X1) * ((DIVFAC - (C1 * Z1)) + (X1 * Z1)));\n\n          hypergeometric_pfq_base<T>::C.push_front(term);\n\n          A3 = A2;\n          A2 = A1;\n          A1 = hypergeometric_pfq_base<T>::C.front();\n        }\n\n        hypergeometric_pfq_base<T>::C.front() /= static_cast<std::int32_t>(2);\n      }\n\n    private:\n      const T CP;\n    };\n\n    template<typename T> class ccoef1_hypergeometric_1f0 : public hypergeometric_pfq_base<T>\n    {\n    public:\n      ccoef1_hypergeometric_1f0(const T& a,\n                                const T& z,\n                                const T& w) : hypergeometric_pfq_base<T>(z, w),\n                                              AP(a) { }\n\n      virtual ~ccoef1_hypergeometric_1f0() { }\n\n      virtual void ccoef() const\n      {\n        // See Luke 1977 page 67.\n        const std::int32_t N1 = static_cast<std::int32_t>(N() + static_cast<std::int32_t>(1));\n        const std::int32_t N2 = static_cast<std::int32_t>(N() + static_cast<std::int32_t>(2));\n\n        // Luke: C     ---------- START COMPUTING COEFFICIENTS USING         ----------\n        // Luke: C     ---------- BACKWARD RECURRENCE SCHEME                 ----------\n        // Luke: C\n        T A2(0);\n        T A1(boost::math::tools::root_epsilon<T>());\n\n        hypergeometric_pfq_base<T>::C.resize(1u, A1);\n\n        std::int32_t X1 = N2;\n\n        T V1 = T(1) - AP;\n\n        // Here, we have corrected what appears to be an error in Luke's code.\n\n        // Luke's original code listing has:\n        //  AFAC = 2 + FOUR/W\n        // But it appears as though the correct form is:\n        //  AFAC = 2 - FOUR/W.\n\n        const T AFAC = 2 - (T(4) / hypergeometric_pfq_base<T>::W);\n\n        for(std::int32_t k = static_cast<std::int32_t>(0); k < N1; ++k)\n        {\n          --X1;\n\n          // The terms have been slightly re-arranged resulting in lower complexity.\n          // Parentheses have been added to avoid reliance on operator precedence.\n          const T term = -(((X1 * AFAC) * A1) + ((X1 + V1) * A2)) / (X1 - V1);\n\n          hypergeometric_pfq_base<T>::C.push_front(term);\n\n          A2 = A1;\n          A1 = hypergeometric_pfq_base<T>::C.front();\n        }\n\n        hypergeometric_pfq_base<T>::C.front() /= static_cast<std::int32_t>(2);\n      }\n\n    private:\n      const T AP;\n\n      virtual std::int32_t N() const { return static_cast<std::int32_t>(util::digit_scale<T>() * 1600.0F); }\n    };\n\n    template<typename T> class ccoef3_hypergeometric_1f1 : public hypergeometric_pfq_base<T>\n    {\n    public:\n      ccoef3_hypergeometric_1f1(const T& a,\n                                const T& c,\n                                const T& z,\n                                const T& w) : hypergeometric_pfq_base<T>(z, w),\n                                              AP(a),\n                                              CP(c) { }\n\n      virtual ~ccoef3_hypergeometric_1f1() { }\n\n      virtual void ccoef() const\n      {\n        // See Luke 1977 page 74.\n        const std::int32_t N1 = static_cast<std::int32_t>(this->N() + static_cast<std::int32_t>(1));\n        const std::int32_t N2 = static_cast<std::int32_t>(this->N() + static_cast<std::int32_t>(2));\n\n        // Luke: C     ---------- START COMPUTING COEFFICIENTS USING         ----------\n        // Luke: C     ---------- BACKWARD RECURRENCE SCHEME                 ----------\n        // Luke: C\n        T A3(0);\n        T A2(0);\n        T A1(boost::math::tools::root_epsilon<T>());\n\n        hypergeometric_pfq_base<T>::C.resize(1u, A1);\n\n        std::int32_t X  = N1;\n        std::int32_t X1 = N2;\n\n        T XA  =  X + AP;\n        T X3A = (X + 3) - AP;\n\n        const T Z1 = T(4) / hypergeometric_pfq_base<T>::W;\n\n        for(std::int32_t k = static_cast<std::int32_t>(0); k < N1; ++k)\n        {\n          --X;\n          --X1;\n          --XA;\n          --X3A;\n\n          const T X3A_over_X2 = X3A / static_cast<std::int32_t>(X + 2);\n\n          // The terms have been slightly re-arranged resulting in lower complexity.\n          // Parentheses have been added to avoid reliance on operator precedence.\n          const T PART1 =  A1 * (((X + CP) * Z1) - X3A_over_X2);\n          const T PART2 =  A2 * (Z1 * ((X + 3) - CP) + (XA / X1));\n          const T PART3 =  A3 * X3A_over_X2;\n\n          const T term = (((PART1 + PART2) + PART3) * X1) / XA;\n\n          hypergeometric_pfq_base<T>::C.push_front(term);\n\n          A3 = A2;\n          A2 = A1;\n          A1 = hypergeometric_pfq_base<T>::C.front();\n        }\n\n        hypergeometric_pfq_base<T>::C.front() /= static_cast<std::int32_t>(2);\n      }\n\n    private:\n      const T AP;\n      const T CP;\n    };\n\n    template<typename T> class ccoef6_hypergeometric_1f2 : public hypergeometric_pfq_base<T>\n    {\n    public:\n      ccoef6_hypergeometric_1f2(const T& a,\n                                const T& b,\n                                const T& c,\n                                const T& z,\n                                const T& w) : hypergeometric_pfq_base<T>(z, w),\n                                              AP(a),\n                                              BP(b),\n                                              CP(c) { }\n\n      virtual ~ccoef6_hypergeometric_1f2() { }\n\n      virtual void ccoef() const\n      {\n        // See Luke 1977 page 85.\n        const std::int32_t N1 = static_cast<std::int32_t>(this->N() + static_cast<std::int32_t>(1));\n\n        // Luke: C     ---------- START COMPUTING COEFFICIENTS USING         ----------\n        // Luke: C     ---------- BACKWARD RECURRENCE SCHEME                 ----------\n        // Luke: C\n        T A4(0);\n        T A3(0);\n        T A2(0);\n        T A1(boost::math::tools::root_epsilon<T>());\n\n        hypergeometric_pfq_base<T>::C.resize(1u, A1);\n\n        std::int32_t X  = N1;\n        T            PP = X + AP;\n\n        const T Z1 = T(4) / hypergeometric_pfq_base<T>::W;\n\n        for(std::int32_t k = static_cast<std::int32_t>(0); k < N1; ++k)\n        {\n          --X;\n          --PP;\n\n          const std::int32_t TWO_X    = static_cast<std::int32_t>(X * 2);\n          const std::int32_t X_PLUS_1 = static_cast<std::int32_t>(X + 1);\n          const std::int32_t X_PLUS_3 = static_cast<std::int32_t>(X + 3);\n          const std::int32_t X_PLUS_4 = static_cast<std::int32_t>(X + 4);\n\n          const T QQ = T(TWO_X + 3) / static_cast<std::int32_t>(TWO_X + static_cast<std::int32_t>(5));\n          const T SS = (X + BP) * (X + CP);\n\n          // The terms have been slightly re-arranged resulting in lower complexity.\n          // Parentheses have been added to avoid reliance on operator precedence.\n          const T PART1 =   A1 * (((PP - (QQ * (PP + 1))) * 2) + (SS * Z1));\n          const T PART2 =  (A2 * (X + 2)) * ((((TWO_X + 1) * PP) / X_PLUS_1) - ((QQ * 4) * (PP + 1)) + (((TWO_X + 3) * (PP + 2)) / X_PLUS_3) + ((Z1 * 2) * (SS - (QQ * (X_PLUS_1 + BP)) * (X_PLUS_1 + CP))));\n          const T PART3 =   A3 * ((((X_PLUS_3 - AP) - (QQ * (X_PLUS_4 - AP))) * 2) + (((QQ * Z1) * (X_PLUS_4 - BP)) * (X_PLUS_4 - CP)));\n          const T PART4 = ((A4 * QQ) * (X_PLUS_4 - AP)) / X_PLUS_3;\n\n          const T term = (((PART1 - PART2) + (PART3 - PART4)) * X_PLUS_1) / PP;\n\n          hypergeometric_pfq_base<T>::C.push_front(term);\n\n          A4 = A3;\n          A3 = A2;\n          A2 = A1;\n          A1 = hypergeometric_pfq_base<T>::C.front();\n        }\n\n        hypergeometric_pfq_base<T>::C.front() /= static_cast<std::int32_t>(2);\n      }\n\n    private:\n      const T AP;\n      const T BP;\n      const T CP;\n    };\n\n    template<typename T> class ccoef2_hypergeometric_2f1 : public hypergeometric_pfq_base<T>\n    {\n    public:\n      ccoef2_hypergeometric_2f1(const T& a,\n                                const T& b,\n                                const T& c,\n                                const T& z,\n                                const T& w) : hypergeometric_pfq_base<T>(z, w),\n                                              AP(a),\n                                              BP(b),\n                                              CP(c) { }\n\n      virtual ~ccoef2_hypergeometric_2f1() { }\n\n      virtual void ccoef() const\n      {\n        // See Luke 1977 page 59.\n        const std::int32_t N1 = static_cast<std::int32_t>(N() + static_cast<std::int32_t>(1));\n        const std::int32_t N2 = static_cast<std::int32_t>(N() + static_cast<std::int32_t>(2));\n\n        // Luke: C     ---------- START COMPUTING COEFFICIENTS USING         ----------\n        // Luke: C     ---------- BACKWARD RECURRENCE SCHEME                 ----------\n        // Luke: C\n        T A3(0);\n        T A2(0);\n        T A1(boost::math::tools::root_epsilon<T>());\n\n        hypergeometric_pfq_base<T>::C.resize(1u, A1);\n\n        std::int32_t X  = N1;\n        std::int32_t X1 = N2;\n        std::int32_t X3 = static_cast<std::int32_t>((X * 2) + 3);\n\n        T X3A = (X + 3) - AP;\n        T X3B = (X + 3) - BP;\n\n        const T Z1 = T(4) / hypergeometric_pfq_base<T>::W;\n\n        for(std::int32_t k = static_cast<std::int32_t>(0); k < N1; ++k)\n        {\n          --X;\n          --X1;\n          --X3A;\n          --X3B;\n          X3 -= 2;\n\n          const std::int32_t X_PLUS_2 = static_cast<std::int32_t>(X + 2);\n\n          const T XAB = T(1) / ((X + AP) * (X + BP));\n\n          // The terms have been slightly re-arranged resulting in lower complexity.\n          // Parentheses have been added to avoid reliance on operator precedence.\n          const T PART1 = (A1 * X1) * (2 - (((AP + X1) * (BP + X1)) * ((T(X3) / X_PLUS_2) * XAB)) + ((CP + X) * (XAB * Z1)));\n          const T PART2 = (A2 * XAB) * ((X3A * X3B) - (X3 * ((X3A + X3B) - 1)) + (((3 - CP) + X) * (X1 * Z1)));\n          const T PART3 = (A3 * X1) * (X3A / X_PLUS_2) * (X3B * XAB);\n\n          const T term = (PART1 + PART2) - PART3;\n\n          hypergeometric_pfq_base<T>::C.push_front(term);\n\n          A3 = A2;\n          A2 = A1;\n          A1 = hypergeometric_pfq_base<T>::C.front();\n        }\n\n        hypergeometric_pfq_base<T>::C.front() /= static_cast<std::int32_t>(2);\n      }\n\n    private:\n      const T AP;\n      const T BP;\n      const T CP;\n\n      virtual std::int32_t N() const { return static_cast<std::int32_t>(util::digit_scale<T>() * 1600.0F); }\n    };\n\n    template<class T> T luke_ccoef4_hypergeometric_0f1(const T& a, const T& x);\n    template<class T> T luke_ccoef1_hypergeometric_1f0(const T& a, const T& x);\n    template<class T> T luke_ccoef3_hypergeometric_1f1(const T& a, const T& b, const T& x);\n    template<class T> T luke_ccoef6_hypergeometric_1f2(const T& a, const T& b, const T& c, const T& x);\n    template<class T> T luke_ccoef2_hypergeometric_2f1(const T& a, const T& b, const T& c, const T& x);\n  }\n}\n\ntemplate<class T>\nT examples::nr_006::luke_ccoef4_hypergeometric_0f1(const T& a, const T& x)\n{\n  const ccoef4_hypergeometric_0f1<T> hypergeometric_0f1_object(a, x, T(-20));\n\n  hypergeometric_0f1_object.ccoef();\n\n  return hypergeometric_0f1_object.series();\n}\n\ntemplate<class T>\nT examples::nr_006::luke_ccoef1_hypergeometric_1f0(const T& a, const T& x)\n{\n  const ccoef1_hypergeometric_1f0<T> hypergeometric_1f0_object(a, x, T(-20));\n\n  hypergeometric_1f0_object.ccoef();\n\n  return hypergeometric_1f0_object.series();\n}\n\ntemplate<class T>\nT examples::nr_006::luke_ccoef3_hypergeometric_1f1(const T& a, const T& b, const T& x)\n{\n  const ccoef3_hypergeometric_1f1<T> hypergeometric_1f1_object(a, b, x, T(-20));\n\n  hypergeometric_1f1_object.ccoef();\n\n  return hypergeometric_1f1_object.series();\n}\n\ntemplate<class T>\nT examples::nr_006::luke_ccoef6_hypergeometric_1f2(const T& a, const T& b, const T& c, const T& x)\n{\n  const ccoef6_hypergeometric_1f2<T> hypergeometric_1f2_object(a, b, c, x, T(-20));\n\n  hypergeometric_1f2_object.ccoef();\n\n  return hypergeometric_1f2_object.series();\n}\n\ntemplate<class T>\nT examples::nr_006::luke_ccoef2_hypergeometric_2f1(const T& a, const T& b, const T& c, const T& x)\n{\n  const ccoef2_hypergeometric_2f1<T> hypergeometric_2f1_object(a, b, c, x, T(-20));\n\n  hypergeometric_2f1_object.ccoef();\n\n  return hypergeometric_2f1_object.series();\n}\n\nint main()\n{\n  stopwatch<std::chrono::high_resolution_clock> my_stopwatch;\n  float total_time = 0.0F;\n\n  std::vector<mp_type> hypergeometric_0f1_results(20U);\n  std::vector<mp_type> hypergeometric_1f0_results(20U);\n  std::vector<mp_type> hypergeometric_1f1_results(20U);\n  std::vector<mp_type> hypergeometric_2f1_results(20U);\n  std::vector<mp_type> hypergeometric_1f2_results(20U);\n\n  const mp_type a(mp_type(3) / 7);\n  const mp_type b(mp_type(2) / 3);\n  const mp_type c(mp_type(1) / 4);\n\n  std::int_least16_t i;\n\n  std::cout << \"test hypergeometric_0f1.\" << std::endl;\n  i = 1U;\n  my_stopwatch.reset();\n\n  // Generate a table of values of Hypergeometric0F1.\n  // Compare with the Mathematica command:\n  // Table[N[HypergeometricPFQ[{}, {3/7}, -(i*EulerGamma)], 100], {i, 1, 20, 1}]\n  std::for_each(hypergeometric_0f1_results.begin(),\n                hypergeometric_0f1_results.end(),\n                [&i, &a](mp_type& new_value)\n                {\n                  const mp_type x(-(boost::math::constants::euler<mp_type>() * i));\n\n                  new_value = examples::nr_006::luke_ccoef4_hypergeometric_0f1(a, x);\n\n                  ++i;\n                });\n\n  total_time += std::chrono::duration_cast<std::chrono::duration<float> >(my_stopwatch.elapsed()).count();\n\n  // Print the values of Hypergeometric0F1.\n  std::for_each(hypergeometric_0f1_results.begin(),\n                hypergeometric_0f1_results.end(),\n                [](const mp_type& h)\n                {\n                  std::cout << std::setprecision(DIGIT_COUNT) << h << std::endl;\n                });\n\n  std::cout << \"test hypergeometric_1f0.\" << std::endl;\n  i = 1U;\n  my_stopwatch.reset();\n\n  // Generate a table of values of Hypergeometric1F0.\n  // Compare with the Mathematica command:\n  // Table[N[HypergeometricPFQ[{3/7}, {}, -(i*EulerGamma)], 100], {i, 1, 20, 1}]\n  std::for_each(hypergeometric_1f0_results.begin(),\n                hypergeometric_1f0_results.end(),\n                [&i, &a](mp_type& new_value)\n                {\n                  const mp_type x(-(boost::math::constants::euler<mp_type>() * i));\n\n                  new_value = examples::nr_006::luke_ccoef1_hypergeometric_1f0(a, x);\n\n                  ++i;\n                });\n\n  total_time += std::chrono::duration_cast<std::chrono::duration<float> >(my_stopwatch.elapsed()).count();\n\n  // Print the values of Hypergeometric1F0.\n  std::for_each(hypergeometric_1f0_results.begin(),\n                hypergeometric_1f0_results.end(),\n                [](const mp_type& h)\n                {\n                  std::cout << std::setprecision(DIGIT_COUNT) << h << std::endl;\n                });\n\n  std::cout << \"test hypergeometric_1f1.\" << std::endl;\n  i = 1U;\n  my_stopwatch.reset();\n\n  // Generate a table of values of Hypergeometric1F1.\n  // Compare with the Mathematica command:\n  // Table[N[HypergeometricPFQ[{3/7}, {2/3}, -(i*EulerGamma)], 100], {i, 1, 20, 1}]\n  std::for_each(hypergeometric_1f1_results.begin(),\n                hypergeometric_1f1_results.end(),\n                [&i, &a, &b](mp_type& new_value)\n                {\n                  const mp_type x(-(boost::math::constants::euler<mp_type>() * i));\n\n                  new_value = examples::nr_006::luke_ccoef3_hypergeometric_1f1(a, b, x);\n\n                  ++i;\n                });\n\n  total_time += std::chrono::duration_cast<std::chrono::duration<float> >(my_stopwatch.elapsed()).count();\n\n  // Print the values of Hypergeometric1F1.\n  std::for_each(hypergeometric_1f1_results.begin(),\n                hypergeometric_1f1_results.end(),\n                [](const mp_type& h)\n                {\n                  std::cout << std::setprecision(DIGIT_COUNT) << h << std::endl;\n                });\n\n  std::cout << \"test hypergeometric_1f2.\" << std::endl;\n  i = 1U;\n  my_stopwatch.reset();\n\n  // Generate a table of values of Hypergeometric1F2.\n  // Compare with the Mathematica command:\n  // Table[N[HypergeometricPFQ[{3/7}, {2/3, 1/4}, -(i*EulerGamma)], 100], {i, 1, 20, 1}]\n  std::for_each(hypergeometric_1f2_results.begin(),\n                hypergeometric_1f2_results.end(),\n                [&i, &a, &b, &c](mp_type& new_value)\n                {\n                  const mp_type x(-(boost::math::constants::euler<mp_type>() * i));\n\n                  new_value = examples::nr_006::luke_ccoef6_hypergeometric_1f2(a, b, c, x);\n\n                  ++i;\n                });\n\n  total_time += std::chrono::duration_cast<std::chrono::duration<float> >(my_stopwatch.elapsed()).count();\n\n  // Print the values of Hypergeometric1F2.\n  std::for_each(hypergeometric_1f2_results.begin(),\n                hypergeometric_1f2_results.end(),\n                [](const mp_type& h)\n                {\n                  std::cout << std::setprecision(DIGIT_COUNT) << h << std::endl;\n                });\n\n  std::cout << \"test hypergeometric_2f1.\" << std::endl;\n  i = 1U;\n  my_stopwatch.reset();\n\n  // Generate a table of values of Hypergeometric2F1.\n  // Compare with the Mathematica command:\n  // Table[N[HypergeometricPFQ[{3/7, 2/3}, {1/4}, -(i * EulerGamma)], 100], {i, 1, 20, 1}]\n  std::for_each(hypergeometric_2f1_results.begin(),\n                hypergeometric_2f1_results.end(),\n                [&i, &a, &b, &c](mp_type& new_value)\n                {\n                  const mp_type x(-(boost::math::constants::euler<mp_type>() * i));\n\n                  new_value = examples::nr_006::luke_ccoef2_hypergeometric_2f1(a, b, c, x);\n\n                  ++i;\n                });\n\n  total_time += std::chrono::duration_cast<std::chrono::duration<float> >(my_stopwatch.elapsed()).count();\n\n  // Print the values of Hypergeometric2F1.\n  std::for_each(hypergeometric_2f1_results.begin(),\n                hypergeometric_2f1_results.end(),\n                [](const mp_type& h)\n                {\n                  std::cout << std::setprecision(DIGIT_COUNT) << h << std::endl;\n                });\n\n  std::cout << \"Total execution time = \" << std::setprecision(3) << total_time << \"s\" << std::endl;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/integer_examples.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <iostream>\n#include <iomanip>\n#include <vector>\n\n// Includes Quickbook code snippets as comments.\n\n//[FAC1\n\n/*`\nIn this simple example, we'll write a routine to print out all of the factorials\nwhich will fit into a 128-bit integer.  At the end of the routine we do some\nfancy iostream formatting of the results:\n*/\n/*=\n#include <boost/multiprecision/cpp_int.hpp>\n#include <iostream>\n#include <iomanip>\n#include <vector>\n*/\n\nvoid print_factorials()\n{\n   using boost::multiprecision::cpp_int;\n   //\n   // Print all the factorials that will fit inside a 128-bit integer.\n   //\n   // Begin by building a big table of factorials, once we know just how\n   // large the largest is, we'll be able to \"pretty format\" the results.\n   //\n   // Calculate the largest number that will fit inside 128 bits, we could\n   // also have used numeric_limits<int128_t>::max() for this value:\n   cpp_int limit = (cpp_int(1) << 128) - 1;\n   //\n   // Our table of values:\n   std::vector<cpp_int> results;\n   //\n   // Initial values:\n   unsigned i = 1;\n   cpp_int factorial = 1;\n   //\n   // Cycle through the factorials till we reach the limit:\n   while(factorial < limit)\n   {\n      results.push_back(factorial);\n      ++i;\n      factorial *= i;\n   }\n   //\n   // Lets see how many digits the largest factorial was:\n   unsigned digits = results.back().str().size();\n   //\n   // Now print them out, using right justification, while we're at it\n   // we'll indicate the limit of each integer type, so begin by defining\n   // the limits for 16, 32, 64 etc bit integers:\n   cpp_int limits[] = {\n      (cpp_int(1) << 16) - 1,\n      (cpp_int(1) << 32) - 1,\n      (cpp_int(1) << 64) - 1,\n      (cpp_int(1) << 128) - 1,\n   };\n   std::string bit_counts[] = { \"16\", \"32\", \"64\", \"128\" };\n   unsigned current_limit = 0;\n   for(unsigned j = 0; j < results.size(); ++j)\n   {\n      if(limits[current_limit] < results[j])\n      {\n         std::string message = \"Limit of \" + bit_counts[current_limit] + \" bit integers\";\n         std::cout << std::setfill('.') << std::setw(digits+1) << std::right << message << std::setfill(' ') << std::endl;\n         ++current_limit;\n      }\n      std::cout << std::setw(digits + 1) << std::right << results[j] << std::endl;\n   }\n}\n\n/*`\nThe output from this routine is:\n[pre\n                                       1\n                                       2\n                                       6\n                                      24\n                                     120\n                                     720\n                                    5040\n                                   40320\n................Limit of 16 bit integers\n                                  362880\n                                 3628800\n                                39916800\n                               479001600\n................Limit of 32 bit integers\n                              6227020800\n                             87178291200\n                           1307674368000\n                          20922789888000\n                         355687428096000\n                        6402373705728000\n                      121645100408832000\n                     2432902008176640000\n................Limit of 64 bit integers\n                    51090942171709440000\n                  1124000727777607680000\n                 25852016738884976640000\n                620448401733239439360000\n              15511210043330985984000000\n             403291461126605635584000000\n           10888869450418352160768000000\n          304888344611713860501504000000\n         8841761993739701954543616000000\n       265252859812191058636308480000000\n      8222838654177922817725562880000000\n    263130836933693530167218012160000000\n   8683317618811886495518194401280000000\n 295232799039604140847618609643520000000\n]\n*/\n\n//]\n\n//[BITOPS\n\n/*`\nIn this example we'll show how individual bits within an integer may be manipulated,\nwe'll start with an often needed calculation of ['2[super n] - 1], which we could obviously\nimplement like this:\n*/\n\nusing boost::multiprecision::cpp_int;\n\ncpp_int b1(unsigned n)\n{\n   cpp_int r(1);\n   return (r << n) - 1;\n}\n\n/*`\nCalling:\n\n   std::cout << std::hex << std::showbase << b1(200) << std::endl;\n\nYields as expected:\n\n[pre 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF]\n\nHowever, we could equally just set the n'th bit in the result, like this:\n*/\n\ncpp_int b2(unsigned n)\n{\n   cpp_int r(0);\n   return --bit_set(r, n);\n}\n\n/*`\nNote how the `bit_set` function sets the specified bit in its argument and then returns a reference to the result -\nwhich we can then simply decrement.  The result from a call to `b2` is the same as that to `b1`.\n\nWe can equally test bits, so for example the n'th bit of the result returned from `b2` shouldn't be set\nunless we increment it first:\n\n   BOOST_MP_ASSERT(!bit_test(b1(200), 200));     // OK\n   BOOST_MP_ASSERT(bit_test(++b1(200), 200));    // OK\n\nAnd of course if we flip the n'th bit after increment, then we should get back to zero:\n\n   BOOST_MP_ASSERT(!bit_flip(++b1(200), 200));   // OK\n*/\n\n//]\n\nint main()\n{\n   print_factorials();\n\n   std::cout << std::hex << std::showbase << b1(200) << std::endl;\n   std::cout << std::hex << std::showbase << b2(200) << std::endl;\n   BOOST_MP_ASSERT(!bit_test(b1(200), 200));  // OK\n   BOOST_MP_ASSERT(bit_test(++b1(200), 200));    // OK\n   BOOST_MP_ASSERT(!bit_flip(++b1(200), 200));   // OK\n   return 0;\n}\n\n/*\n\nProgram output:\n\n                                       1\n                                       2\n                                       6\n                                      24\n                                     120\n                                     720\n                                    5040\n                                   40320\n................Limit of 16 bit integers\n                                  362880\n                                 3628800\n                                39916800\n                               479001600\n................Limit of 32 bit integers\n                              6227020800\n                             87178291200\n                           1307674368000\n                          20922789888000\n                         355687428096000\n                        6402373705728000\n                      121645100408832000\n                     2432902008176640000\n................Limit of 64 bit integers\n                    51090942171709440000\n                  1124000727777607680000\n                 25852016738884976640000\n                620448401733239439360000\n              15511210043330985984000000\n             403291461126605635584000000\n           10888869450418352160768000000\n          304888344611713860501504000000\n         8841761993739701954543616000000\n       265252859812191058636308480000000\n      8222838654177922817725562880000000\n    263130836933693530167218012160000000\n   8683317618811886495518194401280000000\n 295232799039604140847618609643520000000\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\n */\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/logged_adaptor.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2013 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//[logged_adaptor\n\n#include <boost/multiprecision/mpfi.hpp>\n#include <boost/multiprecision/logged_adaptor.hpp>\n#include <iostream>\n#include <iomanip>\n//\n// Begin by overloading log_postfix_event so we can capture each arithmetic event as it happens:\n//\nnamespace boost{ namespace multiprecision{\n\ntemplate <unsigned D>\ninline void log_postfix_event(const mpfi_float_backend<D>& val, const char* event_description)\n{\n   // Print out the (relative) diameter of the interval:\n   using namespace boost::multiprecision;\n   number<mpfr_float_backend<D> > diam;\n   mpfi_diam(diam.backend().data(), val.data());\n   std::cout << \"Diameter was \" << diam << \" after operation: \" << event_description << std::endl;\n}\ntemplate <unsigned D, class T>\ninline void log_postfix_event(const mpfi_float_backend<D>&, const T&, const char* event_description)\n{\n   // This version is never called in this example.\n}\n\n}}\n\n\nint main()\n{\n   using namespace boost::multiprecision;\n   typedef number<logged_adaptor<mpfi_float_backend<17> > > logged_type;\n   //\n   // Test case deliberately introduces cancellation error, relative size of interval\n   // gradually gets larger after each operation:\n   //\n   logged_type a = 1;\n   a /= 10;\n\n   for(unsigned i = 0; i < 13; ++i)\n   {\n      logged_type b = a * 9;\n      b /= 10;\n      a -= b;\n   }\n   std::cout << \"Final value was: \" << a << std::endl;\n   return 0;\n}\n\n//]\n\n/*\n//[logged_adaptor_output\n\nDiameter was nan after operation: Default construct\nDiameter was 0 after operation: Assignment from arithmetic type\nDiameter was 4.33681e-18 after operation: /=\nDiameter was nan after operation: Default construct\nDiameter was 7.70988e-18 after operation: *\nDiameter was 9.63735e-18 after operation: /=\nDiameter was 1.30104e-16 after operation: -=\nDiameter was nan after operation: Default construct\nDiameter was 1.30104e-16 after operation: *\nDiameter was 1.38537e-16 after operation: /=\nDiameter was 2.54788e-15 after operation: -=\nDiameter was nan after operation: Default construct\nDiameter was 2.54788e-15 after operation: *\nDiameter was 2.54863e-15 after operation: /=\nDiameter was 4.84164e-14 after operation: -=\nDiameter was nan after operation: Default construct\nDiameter was 4.84164e-14 after operation: *\nDiameter was 4.84221e-14 after operation: /=\nDiameter was 9.19962e-13 after operation: -=\nDiameter was nan after operation: Default construct\nDiameter was 9.19962e-13 after operation: *\nDiameter was 9.19966e-13 after operation: /=\nDiameter was 1.74793e-11 after operation: -=\nDiameter was nan after operation: Default construct\nDiameter was 1.74793e-11 after operation: *\nDiameter was 1.74793e-11 after operation: /=\nDiameter was 3.32107e-10 after operation: -=\nDiameter was nan after operation: Default construct\nDiameter was 3.32107e-10 after operation: *\nDiameter was 3.32107e-10 after operation: /=\nDiameter was 6.31003e-09 after operation: -=\nDiameter was nan after operation: Default construct\nDiameter was 6.31003e-09 after operation: *\nDiameter was 6.31003e-09 after operation: /=\nDiameter was 1.19891e-07 after operation: -=\nDiameter was nan after operation: Default construct\nDiameter was 1.19891e-07 after operation: *\nDiameter was 1.19891e-07 after operation: /=\nDiameter was 2.27792e-06 after operation: -=\nDiameter was nan after operation: Default construct\nDiameter was 2.27792e-06 after operation: *\nDiameter was 2.27792e-06 after operation: /=\nDiameter was 4.32805e-05 after operation: -=\nDiameter was nan after operation: Default construct\nDiameter was 4.32805e-05 after operation: *\nDiameter was 4.32805e-05 after operation: /=\nDiameter was 0.00082233 after operation: -=\nDiameter was nan after operation: Default construct\nDiameter was 0.00082233 after operation: *\nDiameter was 0.00082233 after operation: /=\nDiameter was 0.0156243 after operation: -=\nDiameter was nan after operation: Default construct\nDiameter was 0.0156243 after operation: *\nDiameter was 0.0156243 after operation: /=\nDiameter was 0.296861 after operation: -=\nFinal value was: {8.51569e-15,1.14843e-14}\n\n//]\n*/\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/mixed_integer_arithmetic.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//\n// Compare arithmetic results using fixed_int to GMP results.\n//\n\n#ifdef _MSC_VER\n#  define _SCL_SECURE_NO_WARNINGS\n#endif\n\n//[mixed_eg\n#include <boost/multiprecision/cpp_int.hpp>\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n   std::uint64_t i = (std::numeric_limits<std::uint64_t>::max)();\n   std::uint64_t j = 1;\n\n   uint128_t ui128;\n   uint256_t ui256;\n   //\n   // Start by performing arithmetic on 64-bit integers to yield 128-bit results:\n   //\n   std::cout << std::hex << std::showbase << i << std::endl;\n   std::cout << std::hex << std::showbase << add(ui128, i, j) << std::endl;\n   std::cout << std::hex << std::showbase << multiply(ui128, i, i) << std::endl;\n   //\n   // The try squaring a 128-bit integer to yield a 256-bit result:\n   //\n   ui128 = (std::numeric_limits<uint128_t>::max)();\n   std::cout << std::hex << std::showbase << multiply(ui256, ui128, ui128) << std::endl;\n\n   return 0;\n}\n//]\n\n/* \n\nProgram output:\n\n//[mixed_output\n\n0xffffffffffffffff\n0x10000000000000000\n0xFFFFFFFFFFFFFFFE0000000000000001\n0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00000000000000000000000000000001\n\n//]\n*/\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/mpc_examples.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2018 Nick Thompson. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n/*`This example demonstrates the usage of the MPC backend for multiprecision complex numbers.\nIn the following, we will show how using MPC backend allows for the same operations as the C++ standard library complex numbers.\n*/\n\n//[mpc_eg\n#include <iostream>\n#include <complex>\n#include <boost/multiprecision/mpc.hpp>\n\ntemplate<class Complex>\nvoid complex_number_examples()\n{\n    Complex z1{0, 1};\n    std::cout << std::setprecision(std::numeric_limits<typename Complex::value_type>::digits10);\n    std::cout << std::scientific << std::fixed;\n    std::cout << \"Print a complex number: \" << z1 << std::endl;\n    std::cout << \"Square it             : \" << z1*z1 << std::endl;\n    std::cout << \"Real part             : \" << z1.real() << \" = \" << real(z1) << std::endl;\n    std::cout << \"Imaginary part        : \" << z1.imag() << \" = \" << imag(z1) << std::endl;\n    using std::abs;\n    std::cout << \"Absolute value        : \" << abs(z1) << std::endl;\n    std::cout << \"Argument              : \" << arg(z1) << std::endl;\n    std::cout << \"Norm                  : \" << norm(z1) << std::endl;\n    std::cout << \"Complex conjugate     : \" << conj(z1) << std::endl;\n    std::cout << \"Projection onto Riemann sphere: \" <<  proj(z1) << std::endl;\n    typename Complex::value_type r = 1;\n    typename Complex::value_type theta = 0.8;\n    using std::polar;\n    std::cout << \"Polar coordinates (phase = 0)    : \" << polar(r) << std::endl;\n    std::cout << \"Polar coordinates (phase !=0)    : \" << polar(r, theta) << std::endl;\n\n    std::cout << \"\\nElementary special functions:\\n\";\n    using std::exp;\n    std::cout << \"exp(z1) = \" << exp(z1) << std::endl;\n    using std::log;\n    std::cout << \"log(z1) = \" << log(z1) << std::endl;\n    using std::log10;\n    std::cout << \"log10(z1) = \" << log10(z1) << std::endl;\n    using std::pow;\n    std::cout << \"pow(z1, z1) = \" << pow(z1, z1) << std::endl;\n    using std::sqrt;\n    std::cout << \"Take its square root  : \" << sqrt(z1) << std::endl;\n    using std::sin;\n    std::cout << \"sin(z1) = \" << sin(z1) << std::endl;\n    using std::cos;\n    std::cout << \"cos(z1) = \" << cos(z1) << std::endl;\n    using std::tan;\n    std::cout << \"tan(z1) = \" << tan(z1) << std::endl;\n    using std::asin;\n    std::cout << \"asin(z1) = \" << asin(z1) << std::endl;\n    using std::acos;\n    std::cout << \"acos(z1) = \" << acos(z1) << std::endl;\n    using std::atan;\n    std::cout << \"atan(z1) = \" << atan(z1) << std::endl;\n    using std::sinh;\n    std::cout << \"sinh(z1) = \" << sinh(z1) << std::endl;\n    using std::cosh;\n    std::cout << \"cosh(z1) = \" << cosh(z1) << std::endl;\n    using std::tanh;\n    std::cout << \"tanh(z1) = \" << tanh(z1) << std::endl;\n    using std::asinh;\n    std::cout << \"asinh(z1) = \" << asinh(z1) << std::endl;\n    using std::acosh;\n    std::cout << \"acosh(z1) = \" << acosh(z1) << std::endl;\n    using std::atanh;\n    std::cout << \"atanh(z1) = \" << atanh(z1) << std::endl;\n}\n\nint main()\n{\n    std::cout << \"First, some operations we usually perform with std::complex:\\n\";\n    complex_number_examples<std::complex<double>>();\n    std::cout << \"\\nNow the same operations performed using the MPC backend:\\n\";\n    complex_number_examples<boost::multiprecision::mpc_complex_50>();\n\n    return 0;\n}\n//]\n\n/*\n\n//[mpc_out\n\nPrint a complex number: (0.00000000000000000000000000000000000000000000000000,1.00000000000000000000000000000000000000000000000000)\nSquare it             : -1.00000000000000000000000000000000000000000000000000\nReal part             : 0.00000000000000000000000000000000000000000000000000 = 0.00000000000000000000000000000000000000000000000000\nImaginary part        : 1.00000000000000000000000000000000000000000000000000 = 1.00000000000000000000000000000000000000000000000000\nAbsolute value        : 1.00000000000000000000000000000000000000000000000000\nArgument              : 1.57079632679489661923132169163975144209858469968755\nNorm                  : 1.00000000000000000000000000000000000000000000000000\nComplex conjugate     : (0.00000000000000000000000000000000000000000000000000,-1.00000000000000000000000000000000000000000000000000)\nProjection onto Riemann sphere: (0.00000000000000000000000000000000000000000000000000,1.00000000000000000000000000000000000000000000000000)\nPolar coordinates (phase = 0)    : 1.00000000000000000000000000000000000000000000000000\nPolar coordinates (phase !=0)    : (0.69670670934716538906374002277244853473117519431538,0.71735609089952279256716781570337728075604730751255)\n\nElementary special functions:\nexp(z1) = (0.54030230586813971740093660744297660373231042061792,0.84147098480789650665250232163029899962256306079837)\nlog(z1) = (0.00000000000000000000000000000000000000000000000000,1.57079632679489661923132169163975144209858469968755)\nlog10(z1) = (0.00000000000000000000000000000000000000000000000000,0.68218817692092067374289181271567788510506374186196)\npow(z1, z1) = 0.20787957635076190854695561983497877003387784163177\nTake its square root  : (0.70710678118654752440084436210484903928483593768847,0.70710678118654752440084436210484903928483593768847)\nsin(z1) = (0.00000000000000000000000000000000000000000000000000,1.17520119364380145688238185059560081515571798133410)\ncos(z1) = 1.54308063481524377847790562075706168260152911236587\ntan(z1) = (0.00000000000000000000000000000000000000000000000000,0.76159415595576488811945828260479359041276859725794)\nasin(z1) = (0.00000000000000000000000000000000000000000000000000,0.88137358701954302523260932497979230902816032826163)\nacos(z1) = (1.57079632679489661923132169163975144209858469968755,-0.88137358701954302523260932497979230902816032826163)\natan(z1) = (0.00000000000000000000000000000000000000000000000000,inf)\nsinh(z1) = (0.00000000000000000000000000000000000000000000000000,0.84147098480789650665250232163029899962256306079837)\ncosh(z1) = 0.54030230586813971740093660744297660373231042061792\ntanh(z1) = (0.00000000000000000000000000000000000000000000000000,1.55740772465490223050697480745836017308725077238152)\nasinh(z1) = (0.00000000000000000000000000000000000000000000000000,1.57079632679489661923132169163975144209858469968755)\nacosh(z1) = (0.88137358701954302523260932497979230902816032826163,1.57079632679489661923132169163975144209858469968755)\natanh(z1) = (0.00000000000000000000000000000000000000000000000000,0.78539816339744830961566084581987572104929234984378)\n\n//]\n*/\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/mpfi_snips.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//[mpfi_eg\n#include <boost/multiprecision/mpfi.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#include <iostream>\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n   // Operations at variable precision and no numeric_limits support:\n   mpfi_float a = 2;\n   mpfi_float::default_precision(1000);\n   std::cout << mpfi_float::default_precision() << std::endl;\n   std::cout << sqrt(a) << std::endl; // print root-2\n\n   // Operations at fixed precision and full numeric_limits support:\n   mpfi_float_100 b = 2;\n   std::cout << std::numeric_limits<mpfi_float_100>::digits << std::endl;\n   // We can use any C++ std lib function:\n   std::cout << log(b) << std::endl; // print log(2)\n\n   // Access the underlying data:\n   mpfi_t r;\n   mpfi_init(r);\n   mpfi_set(r, b.backend().data());\n\n   // Construct some explicit intervals and perform set operations:\n   mpfi_float_50 i1(1, 2), i2(1.5, 2.5);\n   std::cout << intersect(i1, i2) << std::endl;\n   std::cout << hull(i1, i2) << std::endl;\n   std::cout << overlap(i1, i2) << std::endl;\n   std::cout << subset(i1, i2) << std::endl;\n   mpfi_clear(r);\n   return 0;\n}\n//]\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/mpfr_precision.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//[mpfr_variable\n\n/*`\nThis example illustrates the use of variable-precision arithmetic with\nthe `mpfr_float` number type.  We'll calculate the median of the\nbeta distribution to an absurdly high precision and compare the\naccuracy and times taken for various methods.  That is, we want\nto calculate the value of `x` for which ['I[sub x](a, b) = 0.5].\n\nUltimately we'll use Newtons method and set the precision of\nmpfr_float to have just enough digits at each iteration.\n\nThe full source of the this program is in [@../../example/mpfr_precision.cpp]\n\nWe'll skip over the #includes and using declations, and go straight to\nsome support code, first off a simple stopwatch for performance measurement:\n\n*/\n\n//=template <class clock_type>\n//=struct stopwatch { /*details \\*/ };\n\n/*`\nWe'll use `stopwatch<std::chono::high_resolution_clock>` as our performance measuring device.\n\nWe also have a small utility class for controlling the current precision of mpfr_float:\n\n   struct scoped_precision\n   {\n      unsigned p;\n      scoped_precision(unsigned new_p) : p(mpfr_float::default_precision())\n      {\n         mpfr_float::default_precision(new_p);\n      }\n      ~scoped_precision()\n      {\n         mpfr_float::default_precision(p);\n      }\n   };\n\n*/\n//<-\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/math/special_functions/beta.hpp>\n#include <boost/math/special_functions/relative_difference.hpp>\n#include <iostream>\n#include <chrono>\n\nusing boost::multiprecision::mpfr_float;\nusing boost::math::ibeta_inv;\nusing namespace boost::math::policies;\n\ntemplate <class clock_type>\nstruct stopwatch\n{\npublic:\n   typedef typename clock_type::duration duration_type;\n\n   stopwatch() : m_start(clock_type::now()) { }\n\n   stopwatch(const stopwatch& other) : m_start(other.m_start) { }\n\n   stopwatch& operator=(const stopwatch& other)\n   {\n      m_start = other.m_start;\n      return *this;\n   }\n\n   ~stopwatch() { }\n\n   float elapsed() const\n   {\n      return float(std::chrono::nanoseconds((clock_type::now() - m_start)).count()) / 1e9f;\n   }\n\n   void reset()\n   {\n      m_start = clock_type::now();\n   }\n\nprivate:\n   typename clock_type::time_point m_start;\n};\n\nstruct scoped_precision\n{\n   unsigned p;\n   scoped_precision(unsigned new_p) : p(mpfr_float::default_precision())\n   {\n      mpfr_float::default_precision(new_p);\n   }\n   ~scoped_precision()\n   {\n      mpfr_float::default_precision(p);\n   }\n};\n//->\n\n/*`\nWe'll begin with a reference method that simply calls the Boost.Math function `ibeta_inv` and uses the\nfull working precision of the arguments throughout.  Our reference function takes 3 arguments:\n\n* The 2 parameters `a` and `b` of the beta distribution, and\n* The number of decimal digits precision to achieve in the result.\n\nWe begin by setting the default working precision to that requested, and then, since we don't know where\nour arguments `a` and `b` have been or what precision they have, we make a copy of them - note that since\ncopying also copies the precision as well as the value, we have to set the precision expicitly with a\nsecond argument to the copy.  Then we can simply return the result of `ibeta_inv`:\n*/\nmpfr_float beta_distribution_median_method_1(mpfr_float const& a_, mpfr_float const& b_, unsigned digits10)\n{\n   scoped_precision sp(digits10);\n   mpfr_float half(0.5), a(a_, digits10), b(b_, digits10);\n   return ibeta_inv(a, b, half);\n}\n/*`\nYou be wondering why we needed to change the precision of our variables `a` and `b` as well as setting the default -\nthere are in fact two ways in which this can go wrong if we don't do that:\n\n* The variables have too much precision - this will cause all arithmetic operations involving those types to be\npromoted to the higher precision wasting precious calculation time.\n* The variables have too little precision - this will cause expressions involving only those variables to be\ncalculated at the lower precision - for example if we calculate `exp(a)` internally, this will be evaluated at\nthe precision of `a`, and not the current default.\n\nSince our reference method carries out all calculations at the full precision requested, an obvious refinement\nwould be to calculate a first approximation to `double` precision and then to use Newton steps to refine it further.\n\nOur function begins the same as before: set the new default precision and then make copies of our arguments\nat the correct precision.  We then call `ibeta_inv` with all double precision arguments, promote the result\nto an `mpfr_float` and perform Newton steps to obtain the result.  Note that our termination condition is somewhat\ncrude: we simply assume that we have approximately 14 digits correct from the double-precision approximation and\nthat the precision doubles with each step.  We also cheat, and use an internal Boost.Math function that calculates\n['I[sub x](a, b)] and its derivative in one go:\n\n*/\nmpfr_float beta_distribution_median_method_2(mpfr_float const& a_, mpfr_float const& b_, unsigned digits10)\n{\n   scoped_precision sp(digits10);\n   mpfr_float half(0.5), a(a_, digits10), b(b_, digits10);\n   mpfr_float guess = ibeta_inv((double)a, (double)b, 0.5);\n   unsigned current_digits = 14;\n   mpfr_float f, f1;\n   while (current_digits < digits10)\n   {\n      f = boost::math::detail::ibeta_imp(a, b, guess, boost::math::policies::policy<>(), false, true, &f1) - half;\n      guess -= f / f1;\n      current_digits *= 2;\n   }\n   return guess;\n}\n/*`\nBefore we refine the method further, it might be wise to take stock and see how methods 1 and 2 compare.\nWe'll ask them both for 1500 digit precision, and compare against the value produced by `ibeta_inv` at 1700 digits.\nHere's what the results look like:\n\n[pre\nMethod 1 time = 0.611647\nRelative error: 2.99991e-1501\nMethod 2 time = 0.646746\nRelative error: 7.55843e-1501\n]\n\nClearly they are both equally accurate, but Method 1 is actually faster and our plan for improved performance\nhasn't actually worked.  It turns out that we're not actually comparing like with like, because `ibeta_inv` uses\nHalley iteration internally which churns out more digits of precision rather more rapidly than Newton iteration.\nSo the time we save by refining an initial `double` approximation, then loose it again by taking more iterations\nto get to the result.\n\nTime for a more refined approach.  It follows the same form as Method 2, but now we set the working precision\nwithin the Newton iteration loop, to just enough digits to cover the expected precision at each step.  That means\nwe also create new copies of our arguments at the correct precision within the loop, and likewise change the precision\nof the current `guess` each time through:\n\n*/\n\nmpfr_float beta_distribution_median_method_3(mpfr_float const& a_, mpfr_float const& b_, unsigned digits10)\n{\n   mpfr_float guess = ibeta_inv((double)a_, (double)b_, 0.5);\n   unsigned current_digits = 14;\n   mpfr_float f(0, current_digits), f1(0, current_digits), delta(1);\n   while (current_digits < digits10)\n   {\n      current_digits *= 2;\n      scoped_precision sp((std::min)(current_digits, digits10));\n      mpfr_float a(a_, mpfr_float::default_precision()), b(b_, mpfr_float::default_precision());\n      guess.precision(mpfr_float::default_precision());\n      f = boost::math::detail::ibeta_imp(a, b, guess, boost::math::policies::policy<>(), false, true, &f1) - 0.5f;\n      guess -= f / f1;\n   }\n   return guess;\n}\n\n/*`\nThe new performance results look much more promising:\n\n[pre\nMethod 1 time = 0.591244\nRelative error: 2.99991e-1501\nMethod 2 time = 0.622679\nRelative error: 7.55843e-1501\nMethod 3 time = 0.143393\nRelative error: 4.03898e-1501\n]\n\nThis time we're 4x faster than `ibeta_inv`, and no doubt that could be improved a little more by carefully\noptimising the number of iterations and the method (Halley vs Newton) taken.\n\nFinally, here's the driver code for the above methods:\n\n*/\n\nint main()\n{\n   try {\n      mpfr_float a(10), b(20);\n\n      mpfr_float true_value = beta_distribution_median_method_1(a, b, 1700);\n\n      stopwatch<std::chrono::high_resolution_clock> my_stopwatch;\n\n      mpfr_float v1 = beta_distribution_median_method_1(a, b, 1500);\n      float hp_time = my_stopwatch.elapsed();\n      std::cout << \"Method 1 time = \" << hp_time << std::endl;\n      std::cout << \"Relative error: \" << boost::math::relative_difference(v1, true_value) << std::endl;\n\n      my_stopwatch.reset();\n      mpfr_float v2 = beta_distribution_median_method_2(a, b, 1500);\n      hp_time = my_stopwatch.elapsed();\n      std::cout << \"Method 2 time = \" << hp_time << std::endl;\n      std::cout << \"Relative error: \" << boost::math::relative_difference(v2, true_value) << std::endl;\n\n      my_stopwatch.reset();\n      mpfr_float v3 = beta_distribution_median_method_3(a, b, 1500);\n      hp_time = my_stopwatch.elapsed();\n      std::cout << \"Method 3 time = \" << hp_time << std::endl;\n      std::cout << \"Relative error: \" << boost::math::relative_difference(v3, true_value) << std::endl;\n   }\n   catch (const std::exception& e)\n   {\n      std::cout << \"Found exception with message: \" << e.what() << std::endl;\n   }\n   return 0;\n}\n//] //[/mpfr_variable]\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/mpfr_snips.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//[mpfr_eg\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#include <iostream>\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n   // Operations at variable precision and no numeric_limits support:\n   mpfr_float a = 2;\n   mpfr_float::default_precision(1000);\n   std::cout << mpfr_float::default_precision() << std::endl;\n   std::cout << sqrt(a) << std::endl; // print root-2\n\n   // Operations at fixed precision and full numeric_limits support:\n   mpfr_float_100 b = 2;\n   std::cout << std::numeric_limits<mpfr_float_100>::digits << std::endl;\n   // We can use any C++ std lib function:\n   std::cout << log(b) << std::endl; // print log(2)\n   // We can also use any function from Boost.Math:\n   std::cout << boost::math::tgamma(b) << std::endl;\n   // These even work when the argument is an expression template:\n   std::cout << boost::math::tgamma(b * b) << std::endl;\n\n   // Access the underlying data:\n   mpfr_t r;\n   mpfr_init(r);\n   mpfr_set(r, b.backend().data(), GMP_RNDN);\n   mpfr_clear(r);\n   return 0;\n}\n//]\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/numeric_limits_snips.cpp",
    "content": "// Copyright Paul A. Bristow 2013\n// Copyright John Maddock 2013\n// Copyright Christopher Kormanyos\n\n// Use, modification and distribution are subject to the\n// Boost Software License, Version 1.0.\n// (See accompanying file LICENSE_1_0.txt\n// or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n// Examples of std::numeric_limits usage as snippets for multiprecision documentation at multiprecision.qbk.\n\n// Includes text as Quickbook comments.\n\n#include <boost/assert.hpp>\n\n#include <boost/math/constants/constants.hpp>\n#include <boost/math/special_functions/nonfinite_num_facets.hpp>\n\n#include <boost/math/special_functions/factorials.hpp>\n#include <boost/math/special_functions/next.hpp>\n#include <boost/math/tools/precision.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp> // is decimal.\n#include <boost/multiprecision/cpp_bin_float.hpp> // is binary.\n\n#define BOOST_TEST_MAIN\n#include <boost/test/unit_test.hpp> // Boost.Test\n#include <boost/test/tools/floating_point_comparison.hpp>\n\n#include <iostream>\n#include <iomanip>\n#include <string>\n#include <sstream>\n#include <limits> // numeric_limits\n#include <iomanip>\n#include <locale>\n\n// static long double const log10Two = 0.30102999566398119521373889472449L; // log10(2.)\n// It is more portable useful to use a Boost macro\n// See https://www.boost.org/doc/libs/release/libs/config/doc/html/boost_config/boost_macro_reference.html\nstatic constexpr long double log10Two = 0.30102999566398119521373889472449L;\n// which expands to static constexpr on standard C++11 and up, but static const on earlier versions.\n\n  /*`By default, output would only show the standard 6 decimal digits,\n so set precision to show all 50 significant digits, including any trailing zeros.\n This is generally useful to show the implicit precision of the type of the value.\n*/\n\n\n\n\ntemplate <typename T>\nint max_digits10()\n{\n   int significand_digits = std::numeric_limits<T>::digits;\n  // constexpr int significand_digits = std::numeric_limits<T>::digits;\n   return static_cast<int>(ceil(1 + significand_digits * log10Two));\n} // template <typename T> int max_digits10()\n\n// Used to test max_digits10<>() function below.\n\nBOOST_AUTO_TEST_CASE(test_numeric_limits_snips)\n{\n#if !(defined(CI_SUPPRESS_KNOWN_ISSUES) && defined(BOOST_MSVC) && (BOOST_MSVC == 1600))\n  try\n  {\n\n// Example of portable way to get `std::numeric_limits<T>::max_digits10`.\n//[max_digits10_1\n\n/*`For example, to be portable (including obselete platforms) for type `T` where `T` may be:\n `float`, `double`, `long double`, `128-bit quad type`, `cpp_bin_float_50` ...\n*/\n\n  typedef float T;\n\n  std::cout.precision(std::numeric_limits<T>::max_digits10);\n  std::cout.precision(std::numeric_limits<T>::digits10);\n  std::cout.setf(std::ios_base::showpoint); // Append any trailing zeros,\n  // or more memorably\n  std::cout << std::showpoint << std::endl; //\n\n  std::cout << \"std::cout.precision(max_digits10) = \" << std::cout.precision() << std::endl; // 9\n\n  double x = 1.2345678901234567889;\n\n  std::cout << \"x = \" << x << std::endl; //\n\n/*`which should output:\n\n  std::cout.precision(max_digits10) = 9\n  x = 1.23456789\n*/\n\n//] [/max_digits10_1]\n\n  {\n//[max_digits10_2\n\n  double write = 2./3; // Any arbitrary value that cannot be represented exactly.\n  double read = 0;\n  std::stringstream s;\n  s.precision(std::numeric_limits<double>::digits10); // or `float64_t` for 64-bit IEE754 double.\n  s << write;\n  s >> read;\n  if(read != write)\n  {\n    std::cout <<  std::setprecision(std::numeric_limits<double>::digits10)\n      << read << \" != \" << write << std::endl;\n  }\n\n//] [/max_digits10_2]\n  // 0.666666666666667 != 0.666666666666667\n  }\n\n  {\n//[max_digits10_3\n\n  double pi = boost::math::double_constants::pi;\n  std::cout.precision(std::numeric_limits<double>::max_digits10);\n  std::cout << pi << std::endl; // 3.1415926535897931\n\n//] [/max_digits10_3]\n  }\n  {\n//[max_digits10_4\n/*`and similarly for a much higher precision type:\n*/\n\n  using namespace boost::multiprecision;\n\n  typedef number<cpp_dec_float<50> > cpp_dec_float_50; // 50 decimal digits.\n\n  // or using boost::multiprecision::cpp_dec_float_50;\n\n  cpp_dec_float_50 pi = boost::math::constants::pi<cpp_dec_float_50>();\n  std::cout.precision(std::numeric_limits<cpp_dec_float_50>::max_digits10);\n  std::cout << pi << std::endl;\n  // 3.141592653589793238462643383279502884197169399375105820974944592307816406\n//] [/max_digits10_4]\n  }\n\n  {\n//[max_digits10_5\n\n  for (int i = 2; i < 15; i++)\n  {\n    std::cout << std::setw(std::numeric_limits<int>::max_digits10)\n      << boost::math::factorial<double>(i)  << std::endl;\n  }\n\n//] [/max_digits10_5]\n  }\n\n  }\n  catch(const std::exception& ex)\n  {\n    std::cout << \"Caught Exception \" << ex.what() << std::endl;\n  }\n\n  {\n//[max_digits10_6\n\n  typedef double T;\n\n  bool denorm = std::numeric_limits<T>::denorm_min() < (std::numeric_limits<T>::min)();\n  BOOST_MP_ASSERT(denorm);\n\n//] [/max_digits10_6]\n  }\n\n  {\n    unsigned char c = 255;\n    std::cout << \"char c = \" << (int)c << std::endl;\n  }\n\n  {\n//[digits10_1\n    std::cout\n      << std::setw(std::numeric_limits<short>::digits10 +1 +1) // digits10+1, and +1 for sign.\n      << std::showpos << (std::numeric_limits<short>::max)() // +32767\n      << std::endl\n      << std::setw(std::numeric_limits<short>::digits10 +1 +1)\n      << (std::numeric_limits<short>::min)() << std::endl;   // -32767\n//] [/digits10_1]\n  }\n\n  {\n//[digits10_2\n    std::cout\n      << std::setw(std::numeric_limits<unsigned short>::digits10 +1 +1) // digits10+1, and +1 for sign.\n      << std::showpos << (std::numeric_limits<unsigned short>::max)() //  65535\n      << std::endl\n      << std::setw(std::numeric_limits<unsigned short>::digits10 +1 +1) // digits10+1, and +1 for sign.\n      << (std::numeric_limits<unsigned short>::min)() << std::endl;   //      0\n//] [/digits10_2]\n  }\n\n  std::cout <<std::noshowpos << std::endl;\n\n  {\n//[digits10_3\n  std::cout.precision(std::numeric_limits<double>::max_digits10);\n  double d =  1e15;\n  double dp1 = d+1;\n  std::cout << d << \"\\n\" << dp1 << std::endl;\n  // 1000000000000000\n  // 1000000000000001\n  std::cout <<  dp1 - d << std::endl; // 1\n//] [/digits10_3]\n  }\n\n  {\n//[digits10_4\n  std::cout.precision(std::numeric_limits<double>::max_digits10);\n  double d =  1e16;\n  double dp1 = d+1;\n  std::cout << d << \"\\n\" << dp1 << std::endl;\n  // 10000000000000000\n  // 10000000000000000\n    std::cout << dp1 - d << std::endl; // 0 !!!\n//] [/digits10_4]\n  }\n\n  {\n//[epsilon_1\n  std::cout.precision(std::numeric_limits<double>::max_digits10);\n  double d = 1.;\n  double eps = std::numeric_limits<double>::epsilon();\n  double dpeps = d+eps;\n  std::cout << std::showpoint // Ensure all trailing zeros are shown.\n    << d << \"\\n\"           // 1.0000000000000000\n    << dpeps << std::endl; // 2.2204460492503131e-016\n  std::cout << dpeps - d   // 1.0000000000000002\n    << std::endl;\n//] [epsilon_1]\n  }\n\n  {\n//[epsilon_2\n  double one = 1.;\n  double nad = boost::math::float_next(one);\n  std::cout << nad << \"\\n\"  //  1.0000000000000002\n    << nad - one // 2.2204460492503131e-016\n    << std::endl;\n//] [epsilon_2]\n  }\n  {\n//[epsilon_3\n  std::cout.precision(std::numeric_limits<double>::max_digits10);\n  double d = 1.;\n  double eps = std::numeric_limits<double>::epsilon();\n  double dpeps = d + eps/2;\n\n  std::cout << std::showpoint // Ensure all trailing zeros are shown.\n    << dpeps << \"\\n\"       // 1.0000000000000000\n    << eps/2 << std::endl; // 1.1102230246251565e-016\n  std::cout << dpeps - d   // 0.00000000000000000\n    << std::endl;\n//] [epsilon_3]\n  }\n\n  {\n    typedef double RealType;\n//[epsilon_4\n/*`A tolerance might be defined using this version of epsilon thus:\n*/\n    RealType tolerance = boost::math::tools::epsilon<RealType>() * 2;\n//] [epsilon_4]\n    (void)tolerance; // warning suppression\n  }\n\n  {\n    bool b =\n//[digits10_5\n    -(std::numeric_limits<double>::max)() == std::numeric_limits<double>::lowest();\n//] [/digits10_5]\n    (void)b;  // warning suppression\n  }\n\n  {\n//[denorm_min_1\n  std::cout.precision(std::numeric_limits<double>::max_digits10);\n  if (std::numeric_limits<double>::has_denorm == std::denorm_present)\n  {\n    double d = std::numeric_limits<double>::denorm_min();\n\n      std::cout << d << std::endl; //  4.9406564584124654e-324\n\n      int exponent;\n\n      double significand = frexp(d, &exponent);\n      std::cout << \"exponent = \" << std::hex << exponent << std::endl; //  fffffbcf\n      std::cout << \"significand = \" << std::hex << significand << std::endl; // 0.50000000000000000\n  }\n  else\n  {\n    std::cout << \"No denormalization. \" << std::endl;\n  }\n//] [denorm_min_1]\n  }\n\n  {\n//[round_error_1\n    double round_err = std::numeric_limits<double>::epsilon() // 2.2204460492503131e-016\n                     * std::numeric_limits<double>::round_error(); // 1/2\n    std::cout << round_err << std::endl; // 1.1102230246251565e-016\n//] [/round_error_1]\n  }\n\n  {\n    typedef double T;\n//[tolerance_1\n/*`For example, if we want a tolerance that might suit about 9 arithmetical operations,\nsay sqrt(9) = 3,  we could define:\n*/\n\n    T tolerance =  3 * std::numeric_limits<T>::epsilon();\n\n/*`This is very widely used in Boost.Math testing\nwith Boost.Test's macro `BOOST_CHECK_CLOSE_FRACTION`\n*/\n\n    T expected = 1.0;\n    T calculated = 1.0 + std::numeric_limits<T>::epsilon();\n\n    BOOST_CHECK_CLOSE_FRACTION(expected, calculated, tolerance);\n\n//] [/tolerance_1]\n  }\n\n#if !(defined(CI_SUPPRESS_KNOWN_ISSUES) && defined(__GNUC__) && defined(_WIN32))\n  {\n//[tolerance_2\n\n  using boost::multiprecision::number;\n  using boost::multiprecision::cpp_dec_float;\n  using boost::multiprecision::et_off;\n\n  typedef number<cpp_dec_float<50>, et_off > cpp_dec_float_50; // 50 decimal digits.\n/*`[note that Boost.Test does not yet allow floating-point comparisons with expression templates on,\nso the default expression template parameter has been replaced by `et_off`.]\n*/\n\n  cpp_dec_float_50 tolerance =  3 * std::numeric_limits<cpp_dec_float_50>::epsilon();\n  cpp_dec_float_50 expected = boost::math::constants::two_pi<cpp_dec_float_50>();\n  cpp_dec_float_50 calculated = 2 * boost::math::constants::pi<cpp_dec_float_50>();\n\n  BOOST_CHECK_CLOSE_FRACTION(expected, calculated, tolerance);\n\n//] [/tolerance_2]\n  }\n\n  {\n//[tolerance_3\n\n  using boost::multiprecision::cpp_bin_float_quad;\n\n  cpp_bin_float_quad tolerance =  3 * std::numeric_limits<cpp_bin_float_quad>::epsilon();\n  cpp_bin_float_quad expected = boost::math::constants::two_pi<cpp_bin_float_quad>();\n  cpp_bin_float_quad calculated = 2 * boost::math::constants::pi<cpp_bin_float_quad>();\n\n  BOOST_CHECK_CLOSE_FRACTION(expected, calculated, tolerance);\n\n//] [/tolerance_3]\n  }\n\n  {\n//[tolerance_4\n\n  using boost::multiprecision::cpp_bin_float_oct;\n\n  cpp_bin_float_oct tolerance =  3 * std::numeric_limits<cpp_bin_float_oct>::epsilon();\n  cpp_bin_float_oct expected = boost::math::constants::two_pi<cpp_bin_float_oct>();\n  cpp_bin_float_oct calculated = 2 * boost::math::constants::pi<cpp_bin_float_oct>();\n\n  BOOST_CHECK_CLOSE_FRACTION(expected, calculated, tolerance);\n\n//] [/tolerance_4]\n  }\n\n  {\n//[nan_1]\n\n/*`NaN can be used with binary multiprecision types like `cpp_bin_float_quad`:\n*/\n  using boost::multiprecision::cpp_bin_float_quad;\n\n  if (std::numeric_limits<cpp_bin_float_quad>::has_quiet_NaN == true)\n  {\n    cpp_bin_float_quad NaN =  std::numeric_limits<cpp_bin_float_quad>::quiet_NaN();\n    std::cout << \"cpp_bin_float_quad NaN is \"  << NaN << std::endl; //   cpp_bin_float_quad NaN is nan\n\n    cpp_bin_float_quad expected = NaN;\n    cpp_bin_float_quad calculated = 2 * NaN;\n    // Comparisons of NaN's always fail:\n    bool b = expected == calculated;\n    std::cout << b << std::endl;\n    BOOST_CHECK_NE(expected, expected);\n    BOOST_CHECK_NE(expected, calculated);\n  }\n  else\n  {\n    std::cout << \"Type \" << typeid(cpp_bin_float_quad).name() << \" does not have NaNs!\" << std::endl;\n  }\n\n//]  [/nan_1]\n  }\n\n  {\n//[facet_1]\n\n/*`\nSee [@boost:/libs/math/example/nonfinite_facet_sstream.cpp]\nand we also need\n\n  #include <boost/math/special_functions/nonfinite_num_facets.hpp>\n\nThen we can equally well use a multiprecision type cpp_bin_float_quad:\n\n*/\n  using boost::multiprecision::cpp_bin_float_quad;\n\n  typedef cpp_bin_float_quad T;\n\n  using boost::math::nonfinite_num_put;\n  using boost::math::nonfinite_num_get;\n  {\n    std::locale old_locale;\n    std::locale tmp_locale(old_locale, new nonfinite_num_put<char>);\n    std::locale new_locale(tmp_locale, new nonfinite_num_get<char>);\n    std::stringstream ss;\n    ss.imbue(new_locale);\n    T inf = std::numeric_limits<T>::infinity();\n    ss << inf; // Write out.\n   BOOST_MP_ASSERT(ss.str() == \"inf\");\n    T r;\n    ss >> r; // Read back in.\n    BOOST_MP_ASSERT(inf == r); // Confirms that the floating-point values really are identical.\n    std::cout << \"infinity output was \" << ss.str() << std::endl;\n    std::cout << \"infinity input was \" << r << std::endl;\n  }\n\n/*`\n``\n  infinity output was inf\n  infinity input was inf\n``\nSimilarly we can do the same with NaN (except that we cannot use `assert` (because any comparisons with NaN always return false).\n*/\n  {\n    std::locale old_locale;\n    std::locale tmp_locale(old_locale, new nonfinite_num_put<char>);\n    std::locale new_locale(tmp_locale, new nonfinite_num_get<char>);\n    std::stringstream ss;\n    ss.imbue(new_locale);\n    T n;\n    T NaN = std::numeric_limits<T>::quiet_NaN();\n    ss << NaN; // Write out.\n    BOOST_MP_ASSERT(ss.str() == \"nan\");\n    std::cout << \"NaN output was \" << ss.str() << std::endl;\n    ss >> n; // Read back in.\n    std::cout << \"NaN input was \" << n << std::endl;\n  }\n/*`\n``\n  NaN output was nan\n  NaN input was nan\n``\n*/\n//]  [/facet_1]\n  }\n\n#endif\n#endif\n} // BOOST_AUTO_TEST_CASE(test_numeric_limits_snips)\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/random_snips.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/random.hpp>\n#include <boost/scoped_ptr.hpp>\n#include <iostream>\n#include <iomanip>\n\nvoid t1()\n{\n//[random_eg1\n//=#include <boost/multiprecision/cpp_int.hpp>\n//=#include <boost/random.hpp>\n//=\n//=int main()\n//={\n   using namespace boost::multiprecision;\n   using namespace boost::random;\n\n   //\n   // Declare our random number generator type, the underlying generator\n   // is the Mersenne twister mt19937 engine, and we'll generate 256 bit\n   // random values, independent_bits_engine will make multiple calls\n   // to the underlying engine until we have the requested number of bits:\n   //\n   typedef independent_bits_engine<mt19937, 256, cpp_int> generator_type;\n   generator_type gen;\n   //\n   // Generate some values:\n   //\n   std::cout << std::hex << std::showbase;\n   for(unsigned i = 0; i < 10; ++i)\n      std::cout << gen() << std::endl;\n   //\n   // Alternatively if we wish to generate random values in a fixed-precision\n   // type, then we must use an unsigned type in order to adhere to the\n   // conceptual requirements of the generator:\n   //\n   typedef independent_bits_engine<mt19937, 512, uint512_t> generator512_type;\n   generator512_type gen512;\n   //\n   // Generate some 1024-bit unsigned values:\n   //\n   std::cout << std::hex << std::showbase;\n   for(unsigned i = 0; i < 10; ++i)\n      std::cout << gen512() << std::endl;\n   //=   return 0;\n//=}\n//]\n}\n\n//\n// Output from t1() is:\n//[random_eg1_out\n/*`[pre\n0xD091BB5C22AE9EF6E7E1FAEED5C31F792082352CF807B7DFE9D300053895AFE1\n0xA1E24BBA4EE4092B18F868638C16A625474BA8C43039CD1A8C006D5FFE2D7810\n0xF51F2AE7FF1816E4F702EF59F7BADAFA285954A1B9D09511F878C4B3FB2A0137\n0xF508E4AA1C1FE6527C419418CC50AA59CCDF2E5C4C0A1F3B2452A9DC01397D8D\n0x6BF88C311CCA797AEA6DA4AEA3C78807CACE1969E0E0D4ADF5A14BAB80F00988\n0xA7DE9F4CCC450CBA0924668F5C7DC380D96089C53640AC4CEF1A2E6DAE6D9426\n0xADC1965B6613BA46C1FB41C2BD9B0ECDBE3DEDFC7989C8EE6468FD6E6C0DF032\n0xA7CD66342C826D8B2BD2E4124D4A2DBEB4BF6FA7CC1A89590826328251097330\n0x46E46CB0DF577EC20BD1E364262C556418DDA0C9FE7B45D9D2CE21C9D268409A\n0xB1E049E1200BFA47512D6E73C3851EEEF341C0817D973E4808D17554A9E20D28\n0xD091BB5C22AE9EF6E7E1FAEED5C31F792082352CF807B7DFE9D300053895AFE1A1E24BBA4EE4092B18F868638C16A625474BA8C43039CD1A8C006D5FFE2D7810\n0xF51F2AE7FF1816E4F702EF59F7BADAFA285954A1B9D09511F878C4B3FB2A0137F508E4AA1C1FE6527C419418CC50AA59CCDF2E5C4C0A1F3B2452A9DC01397D8D\n0x6BF88C311CCA797AEA6DA4AEA3C78807CACE1969E0E0D4ADF5A14BAB80F00988A7DE9F4CCC450CBA0924668F5C7DC380D96089C53640AC4CEF1A2E6DAE6D9426\n0xADC1965B6613BA46C1FB41C2BD9B0ECDBE3DEDFC7989C8EE6468FD6E6C0DF032A7CD66342C826D8B2BD2E4124D4A2DBEB4BF6FA7CC1A89590826328251097330\n0x46E46CB0DF577EC20BD1E364262C556418DDA0C9FE7B45D9D2CE21C9D268409AB1E049E1200BFA47512D6E73C3851EEEF341C0817D973E4808D17554A9E20D28\n0x70518CE6203AC30361ADD0AB35D0430CC3F8E8920D1C8509CB92388E095436BF2FD6E20868A29AF97D61330B753EC6FC7211EFEA7CD15133A574C4FFCB41F198\n0xB598EEF6EBBE7347C1332568CEBA5A7046A99459B4AD9F11AE00FEAA00B8B573A7B480B6B5F0B06C29A0EC27A4DAA0101E76A1C574BE91337F94C950C61F6ED6\n0xF5B1C7A192E195F8572384D4E0732C8895D41B68CEE496C3394BBD52048CD47CC05309BED23D2D63414DE9C5D2229F23818666A3F0A8B109B2F6B12769A48341\n0xE4123C566C548C8FF5941F6194B993AA8C1651342876763C237CE42EC300D11B263821CA3AEB820241EC0F84CF4AC36DD7393EE6FD0FC06A4118A30A551B54A4\n0xD074F86F4CC1C54A3E57A70303774CDAEDE43895379CE62759988939E8490DDC325410E1D9352F6A4047080AF47C081D9DB51A85C765D71F79297527FCCA2773\n]\n*/\n//]\n\n\nvoid t2()\n{\n   std::cout << std::dec;\n//[random_eg2\n//=#include <boost/multiprecision/cpp_int.hpp>\n//=#include <boost/random.hpp>\n//=\n//=int main()\n//={\n   using namespace boost::multiprecision;\n   using namespace boost::random;\n\n   //\n   // Generate integers in a given range using uniform_int,\n   // the underlying generator is invoked multiple times\n   // to generate enough bits:\n   //\n   mt19937 mt;\n   uniform_int_distribution<cpp_int> ui(-(cpp_int(1) << 256), cpp_int(1) << 256);\n   //\n   // Generate the numbers:\n   //\n   for(unsigned i = 0; i < 10; ++i)\n      std::cout << ui(mt) << std::endl;\n\n//=   return 0;\n//=}\n//]\n}\n//[random_eg2_out\n/*`\nProgram output is\n\n[pre\n25593993629538149833210527544371584707508847463356155903670894544241785158492\n12721121657520147247744796431842326146296294180809160027132416389225539366745\n106034929479008809862776424170460808190085984129117168803272987114325199071833\n86048861429530654936263414134573980939351899046345384016090167510299251354700\n-23473382144925885755951447143660880642389842563343761080591177733698450031250\n76840269649240973945508128641415259490679375154523618053296924666747244530145\n21638369166612496703991271955994563624044383325105383029306009417224944272131\n18829152205014764576551421737727569993966577957447887116062495161081023584880\n101521572847669971701030312596819435590097618913255156117898217707115132658117\n-97490271301923067621481012355971422109456300816856752380346627103308328292057\n]\n*/\n//]\n\nvoid t3()\n{\n//[random_eg3\n//=#include <boost/multiprecision/cpp_bin_float.hpp>\n//=#include <boost/random.hpp>\n//=\n//=int main()\n//={\n   using namespace boost::multiprecision;\n   using namespace boost::random;\n\n   mt19937 gen;\n   //\n   // Generate the values:\n   //\n   std::cout << std::setprecision(50);\n   for(unsigned i = 0; i < 20; ++i)\n      std::cout << generate_canonical<cpp_bin_float_50, std::numeric_limits<cpp_bin_float_50>::digits>(gen) << std::endl;\n//=   return 0;\n//=}\n//]\n}\n\n//[random_eg3_out\n/*`\nWhich produces the following output:\n\n[pre\n0.96886777112423135248554451482797431507115448261086\n0.54722059636785192454525760726084778627750790023546\n0.99646132554800874317788284808573062871409279729804\n0.98110969177693891782396443737643892769773768718591\n0.29702944955795083040856753579705872634075574515969\n0.63976335709815275010379796044374742646738557798647\n0.79792861516022605265555700991255998690336456180995\n0.68135953856026596523755400091345037778580909233387\n0.47475868061723477935404326837783394169122045199915\n0.30191312687731969398296589840622989141067852863748\n0.87242882006730022427155209451091472382531795659709\n0.82190326480741096300318873712966555706035846579562\n0.49058903962146072778707295967429263659897501512813\n0.2102090745190061764133345429475530760261103345204\n0.4087311609617603484960794513055502599728804206333\n0.79397497154919267900450180642484943996546102712187\n0.70577425166871982574205252142383800792823003687121\n0.64396095652194035523385641523010248768636064728226\n0.5737546665965914620678634509134819579811035412969\n0.017773895576552474810236796736785695789752666554273\n]\n*/\n//]\n\nvoid t4()\n{\n   std::cout << std::endl;\n//[random_eg4\n//=#include <boost/multiprecision/cpp_bin_float.hpp>\n//=#include <boost/multiprecision/cpp_int.hpp>\n//=#include <boost/random.hpp>\n//=\n//=int main()\n//={\n   using namespace boost::multiprecision;\n   using namespace boost::random;\n   //\n   // Generate some distruted values:\n   //\n   uniform_real_distribution<cpp_bin_float_50> ur(-20, 20);\n   gamma_distribution<cpp_bin_float_50> gd(20);\n   independent_bits_engine<mt19937, std::numeric_limits<cpp_bin_float_50>::digits, cpp_int> gen;\n   //\n   // Generate some values:\n   //\n   std::cout << std::setprecision(50);\n   for(unsigned i = 0; i < 20; ++i)\n      std::cout << ur(gen) << std::endl;\n   for(unsigned i = 0; i < 20; ++i)\n      std::cout << gd(gen) << std::endl;\n//=   return 0;\n//=}\n//]\n}\n\n//[random_eg4_out\n/*`\nWhich produces the following output:\n\n[pre\n-18.576837157065858312137736538355805944098004018928\n4.5605477000094480453928920098152026546185388161216\n-1.7611402252150150370944527411235180945558276280598\n-2.471338289511354190492328039842914272146783953149\n-7.4131520453411321647183692139916357315276121488316\n-9.192739117661751364518299455475684051782402347659\n7.0126880787149555595443325648941661436898526919013\n2.8554749162054097111723076181877881960039268668423\n14.390501287552165467965587841551705310012046701036\n-8.9747073123748752412086051960748002945548570524149\n-8.1305063133718605220959174700954037986278348616362\n9.5496899464463627949564295930962040525540578754312\n-15.309681742947663333436391348699943078942921692008\n2.0454914298189175280771944784358385982869708951824\n-10.069253024538932382193363493367304983742246396276\n13.449212808583153116670057807764145176004060370818\n-6.0065092542772507561228141992257782449634820245355\n15.00971466974838379824678369267201922989930663822\n16.158514812070905438581736305533045434508525979205\n-2.1531361299576399413547008719541457739794964378093\n19.398278792113040046930806838893737245011219380822\n12.965216582396067073600685365545292876001524716225\n19.561779374349650983983836397553672788578622096947\n15.982213641588944604037715576313848977716540941271\n23.96044616946856385664151481695038833903083043492\n21.054716943622792848187523422423642819628010070375\n18.596078774135209530930707331338838805575875990091\n19.539530839287848627426769425090194390388333335812\n17.176133236359396942946640290935498641489373354297\n16.228802394876800099035133760539461530246286999827\n23.63807160907473465631049083277558060813997674519\n12.838499607321990428122225501321564153572478845401\n16.878362445712403300584931374939967549572637230102\n20.646246409377134464856282996941395597420615529803\n16.602429236226052406561338766554127142762673418695\n21.680007865714197450495711030406314524681744024329\n21.038948660115771777833205901845639760348321521616\n30.494499676527802078320016654058105593076348727966\n18.704734464995637480940828829962787676146589788572\n22.502216997171061548799304902323434654678156658236\n]\n*/\n//]\n\nvoid t5()\n{\n//[random_eg5\n//=#include <boost/multiprecision/cpp_bin_float.hpp>\n//=#include <boost/random.hpp>\n//=#include <boost/scoped_ptr.hpp>\n//=\n//=int main()\n//={\n   using namespace boost::multiprecision;\n   using namespace boost::random;\n   //\n   // Generate some multiprecision values, note that the generator is so large\n   // that we have to allocate it on the heap, otherwise we may run out of\n   // stack space!  We could avoid this by using a floating point type which\n   // allocates it's internal storage on the heap - cpp_bin_float will do\n   // this with the correct template parameters, as will the GMP or MPFR\n   // based reals.\n   //\n   typedef lagged_fibonacci_01_engine<cpp_bin_float_50, 48, 44497, 21034 > big_fib_gen;\n   boost::scoped_ptr<big_fib_gen> pgen(new big_fib_gen);\n   //\n   // Generate some values:\n   //\n   std::cout << std::setprecision(50);\n   for(unsigned i = 0; i < 20; ++i)\n      std::cout << (*pgen)() << std::endl;\n   //\n   // try again with a ranlux generator, this is not quite so large\n   // so we can use the heap this time:\n   //\n   typedef subtract_with_carry_01_engine<cpp_bin_float_50, std::numeric_limits<cpp_bin_float_50>::digits - 5, 10, 24 > ranlux_big_base_01;\n   typedef discard_block_engine< ranlux_big_base_01, 389, 24 > big_ranlux;\n   big_ranlux rg;\n   for(unsigned i = 0; i < 20; ++i)\n      std::cout << rg() << std::endl;\n//=   return 0;\n//=}\n//]\n}\n\nint main()\n{\n   t1();\n   t2();\n   t3();\n   t4();\n   t5();\n   return 0;\n}\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/safe_prime.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//[safe_prime\n\n#include <boost/random.hpp>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/miller_rabin.hpp>\n#include <iostream>\n#include <iomanip>\n\nint main()\n{\n   using namespace boost::random;\n   using namespace boost::multiprecision;\n\n   typedef cpp_int int_type;\n   mt11213b base_gen(clock());\n   independent_bits_engine<mt11213b, 256, int_type> gen(base_gen);\n   //\n   // We must use a different generator for the tests and number generation, otherwise\n   // we get false positives.\n   //\n   mt19937 gen2(clock());\n\n   for(unsigned i = 0; i < 100000; ++i)\n   {\n      int_type n = gen();\n      if(miller_rabin_test(n, 25, gen2))\n      {\n         // Value n is probably prime, see if (n-1)/2 is also prime:\n         std::cout << \"We have a probable prime with value: \" << std::hex << std::showbase << n << std::endl;\n         if(miller_rabin_test((n-1)/2, 25, gen2))\n         {\n            std::cout << \"We have a safe prime with value: \" << std::hex << std::showbase << n << std::endl;\n            return 0;\n         }\n      }\n   }\n   std::cout << \"Ooops, no safe primes were found - probably a bad choice of seed values!\" << std::endl;\n   return 0;\n}\n\n//]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/scoped_precision_example.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <iostream>\n#include <boost/math/special_functions/relative_difference.hpp>\n#include <boost/math/special_functions/next.hpp>\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/multiprecision/debug_adaptor.hpp>\n\n//[scoped_precision_1\n\n/*`\nAll our precision changing examples are based around `mpfr_float`.\nHowever, in order to make running this example a little easier to debug,\nwe'll use `debug_adaptor` throughout so that the values of all variables\ncan be displayed in your debugger of choice:\n*/\n\nusing mp_t = boost::multiprecision::debug_adaptor_t<boost::multiprecision::mpfr_float>;\n\n/*`\nOur first example will investigate calculating the Bessel J function via it's well known \nseries representation:\n\n[$../bessel2.svg]\n\nThis simple series suffers from catastrophic cancellation error\nnear the roots of the function, so we'll investigate slowly increasing the precision of\nthe calculation until we get the result to N-decimal places.  We'll begin by defining\na function to calculate the series for Bessel J, the details of which we'll leave in the\nsource code:\n*/\nmp_t calculate_bessel_J_as_series(mp_t x, mp_t v, mp_t* err)\n//<-\n{\n   mp_t sum        = pow(x / 2, v) / tgamma(v + 1);\n   mp_t abs_sum    = abs(sum);\n   mp_t multiplier = -x * x / 4;\n   mp_t divider    = v + 1;\n   mp_t term       = sum;\n   mp_t eps        = boost::math::tools::epsilon<mp_t>();\n   unsigned   m          = 1;\n\n   while (fabs(term / abs_sum) > eps)\n   {\n      term *= multiplier;\n      term /= m;\n      term /= divider;\n      ++divider;\n      ++m;\n      sum += term;\n      abs_sum += abs(term);\n   }\n   if (err)\n      *err = eps * fabs(abs_sum / sum);\n   /*\n   std::cout << eps << std::endl;\n   if (err)\n      std::cout << *err << std::endl;\n   std::cout << abs_sum << std::endl;\n   std::cout << sum << std::endl;\n   */\n   return sum;\n}\n//->\n\n/*`\nNext come some simple helper classes, these allow us to modify the current precision and precision-options\nvia scoped objects which will put everything back as it was at the end.  We'll begin with the class to\nmodify the working precision:\n*/\nstruct scoped_mpfr_precision\n{\n   unsigned saved_digits10;\n   scoped_mpfr_precision(unsigned digits10) : saved_digits10(mp_t::thread_default_precision())\n   {\n      mp_t::thread_default_precision(digits10);\n   }\n   ~scoped_mpfr_precision()\n   {\n      mp_t::thread_default_precision(saved_digits10);\n   }\n   void reset(unsigned digits10)\n   {\n      mp_t::thread_default_precision(digits10);\n   }\n   void reset()\n   {\n      mp_t::thread_default_precision(saved_digits10);\n   }\n};\n/*`\nAnd a second class to modify the precision options:\n*/\nstruct scoped_mpfr_precision_options\n{\n   boost::multiprecision::variable_precision_options saved_options;\n   scoped_mpfr_precision_options(boost::multiprecision::variable_precision_options opts) : saved_options(mp_t::thread_default_variable_precision_options())\n   {\n      mp_t::thread_default_variable_precision_options(opts);\n   }\n   ~scoped_mpfr_precision_options()\n   {\n      mp_t::thread_default_variable_precision_options(saved_options);\n   }\n   void reset(boost::multiprecision::variable_precision_options opts)\n   {\n      mp_t::thread_default_variable_precision_options(opts);\n   }\n};\n/*`\nWe can now begin writing a function to calculate J[sub v](z) to a specified precision.  \nIn order to keep the logic as simple as possible, we'll adopt a ['uniform precision computing] approach, \nwhich is to say, within the body of the function, all variables are always at the same working precision.\n*/\nmp_t Bessel_J_to_precision(mp_t v, mp_t x, unsigned digits10)\n{\n   //\n   // Begin by backing up digits10:\n   //\n   unsigned saved_digits10 = digits10;\n   // \n   //\n   // Start by defining 2 scoped objects to control precision and associated options.\n   // We'll begin by setting the working precision to the required target precision,\n   // and since all variables will always be of uniform precision, we can tell the\n   // library to ignore all precision control by setting variable_precision_options::assume_uniform_precision:\n   //\n   scoped_mpfr_precision           scoped(digits10);\n   scoped_mpfr_precision_options   scoped_opts(boost::multiprecision::variable_precision_options::assume_uniform_precision);\n\n   mp_t            result;\n   mp_t            current_error{1};\n   mp_t            target_error {std::pow(10., -static_cast<int>(digits10))};\n\n   while (target_error < current_error)\n   {\n      //\n      // Everything must be of uniform precision in here, including\n      // our input values, so we'll begin by setting their precision:\n      //\n      v.precision(digits10);\n      x.precision(digits10);\n      //\n      // Calculate our approximation and error estimate:\n      //\n      result = calculate_bessel_J_as_series(x, v, &current_error);\n      //\n      // If the error from the current approximation is too high we'll need \n      // to loop round and try again, in this case we use the simple heuristic\n      // of doubling the working precision with each loop.  More refined approaches\n      // are certainly available:\n      //\n      digits10 *= 2;\n      scoped.reset(digits10);\n   }\n   //\n   // We now have an accurate result, but it may have too many digits,\n   // so lets round the result to the requested precision now:\n   //\n   result.precision(saved_digits10);\n   //\n   // To maintain uniform precision during function return, lets\n   // reset the default precision now:\n   //\n   scoped.reset(saved_digits10);\n   return result;\n}\n\n/*`\nSo far, this is all well and good, but there is still a potential trap for the unwary here,\nwhen the function returns the variable [/result] may be copied/moved either once or twice\ndepending on whether the compiler implements the named-return-value optimisation.  And since this\nall happens outside the scope of this function, the precision of the returned value may get unexpected\nchanged - and potentially with different behaviour once optimisations are turned on!\n\nTo prevent these kinds of unintended consequences, a function returning a value with specified precision\nmust either:\n\n* Be called in a /uniform-precision-environment/, with the current working precision, the same as both\nthe returned value and the variable to which the result will be assigned.\n* Be called in an environment that has one of the following set:\n   * variable_precision_options::preserve_source_precision\n   * variable_precision_options::preserve_component_precision\n   * variable_precision_options::preserve_related_precision\n   * variable_precision_options::preserve_all_precision\n\nIn the case of our example program, we use a /uniform-precision-environment/ and call the function\nwith the value of `6541389046624379 / 562949953421312` which happens to be near a root of J[sub v](x)\nand requires a high-precision calculation to obtain low relative error in the result of \n`-9.31614245636402072613249153246313221710284959883647822724e-15`.\n\nYou will note in the example we have so far that there are a number of unnecessary temporaries\ncreated: we pass values to our functions by value, and we call the `.precision()` member function\nto change the working precision of some variables - something that requires a reallocation internally.\nWe'll now make our example just a little more efficient, by removing these temporaries, though in the\nprocess, we'll need just a little more control over how mixed-precision arithmetic behaves.\n\nIt's tempting to simply define the function that calculates the series to take arguments\nby constant reference like so:\n\n*/\n\nmp_t calculate_bessel_J_as_series_2(const mp_t& x, const mp_t& v, mp_t* err)\n//<-\n{\n   mp_t sum        = pow(x / 2, v) / tgamma(v + 1);\n   mp_t abs_sum    = abs(sum);\n   mp_t multiplier = -x * x / 4;\n   mp_t divider    = v + 1;\n   mp_t term       = sum;\n   mp_t eps        = boost::math::tools::epsilon<mp_t>();\n   unsigned   m          = 1;\n\n   while (fabs(term / abs_sum) > eps)\n   {\n      term *= multiplier;\n      term /= m;\n      term /= divider;\n      ++divider;\n      ++m;\n      sum += term;\n      abs_sum += abs(term);\n   }\n   if (err)\n      *err = eps * fabs(abs_sum / sum);\n\n   return sum;\n}\n//->\n\n/*`\nAnd to then pass our arguments to it, without first altering their precision to match\nthe current working default.  However, imagine that `calculate_bessel_J_as_series_2`\ncalculates x[super 2] internally, what precision is the result?  If it's the same as the\nprecision of /x/, then our calculation will loose precision, since we really want the result\ncalculated to the full current working precision, which may be significantly higher than\nthat of our input variables.  Our new version of Bessel_J_to_precision therefore uses\n`variable_precision_options::preserve_target_precision` internally, so that expressions\ncontaining only the low-precision input variables are calculated at the precision of\n(at least) the target - which will have been constructed at the current working precision.\n\nHere's our revised code:\n\n*/\n\nmp_t Bessel_J_to_precision_2(const mp_t& v, const mp_t& x, unsigned digits10)\n{\n   //\n   // Begin with 2 scoped objects, one to manage current working precision, one to\n   // manage mixed precision arithmetic.  Use of variable_precision_options::preserve_target_precision\n   // ensures that expressions containing only low-precision input variables are evaluated at the precision\n   // of the variable they are being assigned to (ie current working precision).\n   //\n   scoped_mpfr_precision scoped(digits10);\n   scoped_mpfr_precision_options scoped_opts(boost::multiprecision::variable_precision_options::preserve_target_precision);\n\n   mp_t                    result;\n   mp_t            current_error{1};\n   mp_t            target_error{std::pow(10., -static_cast<int>(digits10))};\n\n   while (target_error < current_error)\n   {\n      //\n      // The assignment here, rounds the high precision result\n      // returned by calculate_bessel_J_as_series_2, to the precision\n      // of variable result: ie to the target precision we specified in\n      // the function call.  This is only the case because we have\n      // variable_precision_options::preserve_target_precision set.\n      //\n      result = calculate_bessel_J_as_series_2(x, v, &current_error);\n\n      digits10 *= 2;\n      scoped.reset(digits10);\n   }\n   //\n   // There may be temporaries created when we return, we must make sure\n   // that we reset the working precision and options before we return.\n   // In the case of the options, we must preserve the precision of the source\n   // object during the return, not only here, but in the calling function too:\n   //\n   scoped.reset();\n   scoped_opts.reset(boost::multiprecision::variable_precision_options::preserve_source_precision);\n   return result;\n}\n\n/*`\nIn our final example, we'll look at a (somewhat contrived) case where we reduce the argument\nby N * PI, in this case we change the mixed-precision arithmetic options several times,\ndepending what it is we are trying to achieve at that moment in time:\n\n*/\nmp_t reduce_n_pi(const mp_t& arg)\n{\n   //\n   // We begin by estimating how many multiples of PI we will be reducing by, \n   // note that this is only an estimate because we're using low precision\n   // arithmetic here to get a quick answer:\n   //\n   unsigned n = static_cast<unsigned>(arg / boost::math::constants::pi<mp_t>());\n   //\n   // Now that we have an estimate for N, we can up the working precision and obtain\n   // a high precision value for PI, best to play safe and preserve the precision of the\n   // source here.  Though note that expressions are evaluated at the highest precision\n   // of any of their components: in this case that's the current working precision\n   // returned by boost::math::constants::pi, and not the precision of arg.\n   // However, should this function be called with assume_uniform_precision set\n   // then all bets are off unless we do this:\n   //\n   scoped_mpfr_precision            scope_1(mp_t::thread_default_precision() * 2);\n   scoped_mpfr_precision_options    scope_2(boost::multiprecision::variable_precision_options::preserve_source_precision);\n\n   mp_t reduced = arg - n * boost::math::constants::pi<mp_t>();\n   //\n   // Since N was only an estimate, we may have subtracted one PI too many,\n   // correct if that's the case now:\n   //\n   if (reduced < 0)\n      reduced += boost::math::constants::pi<mp_t>();\n   //\n   // Our variable \"reduced\" now has the correct answer, but too many digits precision, \n   // we can either call its .precision() member function, or assign to a new variable\n   // with variable_precision_options::preserve_target_precision set:\n   //\n   scope_1.reset();\n   scope_2.reset(boost::multiprecision::variable_precision_options::preserve_target_precision);\n   mp_t result = reduced;\n   //\n   // As with previous examples, returning the result may create temporaries, so lets\n   // make sure that we preserve the precision of result.  Note that this isn't strictly\n   // required if the calling context is always of uniform precision, but we can't be sure \n   // of our calling context:\n   //\n   scope_2.reset(boost::multiprecision::variable_precision_options::preserve_source_precision);\n   return result;\n}\n\n/*`\nAnd finally... we need to mention `preserve_component_precision`, `preserve_related_precision` and `preserve_all_precision`.\n\nThese form a hierarchy, with each inheriting the properties of those before it.\n`preserve_component_precision` is used when dealing with complex or interval numbers, for example if we have:\n\n   mpc_complex val = some_expression;\n\nAnd `some_expression` contains scalar values of type `mpfr_float`, then the precision of these is ignored unless\nwe specify at least `preserve_component_precision`.\n\n`preserve_related_precision` we'll somewhat skip over - it extends the range of types whose precision is\nconsidered within an expression to related types - for example all instantiations of `number<mpfr_float_backend<N>, ET>`\nwhen dealing with expression of type `mpfr_float`.  However, such situations are - and should be -  very rare.\n\nThe final option - `preserve_all_precision` - is used to preserve the precision of all the types in an expression, \nfor example:\n\n   // calculate 2^1000 - 1:\n   mpz_int i(1);\n   i <<= 1000;\n   i -= 1;\n\n   mp_t f = i;\n\nThe final assignment above will round the value in /i/ to the current working precision, unless `preserve_all_precision`\nis set, in which case /f/ will end up with sufficient precision to store /i/ unchanged.\n\n*/\n\n//]\n\nint main()\n{\n   mp_t::thread_default_precision(50);\n   mp_t x{6541389046624379uLL};\n   x /= 562949953421312uLL;\n   mp_t v{2};\n   mp_t err;\n   mp_t J = Bessel_J_to_precision(v, x, 50);\n\n   std::cout << std::setprecision(50) << J << std::endl;\n   std::cout << J.precision() << std::endl;\n\n   mp_t expected{\"-9.31614245636402072613249153246313221710284959883647822724e-15\"};\n   std::cout << boost::math::relative_difference(expected, J) << std::endl;\n   \n   J = Bessel_J_to_precision_2(v, x, 50);\n   std::cout << boost::math::relative_difference(expected, J) << std::endl;\n   std::cout << J.precision() << std::endl;\n   \n   std::cout << reduce_n_pi(boost::math::float_next(boost::math::float_next(5 * boost::math::constants::pi<mp_t>()))) << std::endl;\n\n   return 0;\n}\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/standalone_bernoulli_tgamma.cpp",
    "content": "///////////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2020 - 2022.                 //\n//  Distributed under the Boost Software License,                //\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt          //\n//  or copy at http://www.boost.org/LICENSE_1_0.txt)             //\n///////////////////////////////////////////////////////////////////\n\n#include <array>\n#include <cstdint>\n#include <ctime>\n#include <iomanip>\n#include <iostream>\n#include <memory>\n#include <utility>\n#include <vector>\n\n#define EXAMPLE008_BERNOULLI_USE_LOCAL_PI\n\n#if !defined(BOOST_MP_STANDALONE)\n#define BOOST_MP_STANDALONE\n#endif\n\n#if !defined(EXAMPLE008_BERNOULLI_USE_LOCAL_PI)\n#if !defined(BOOST_MATH_STANDALONE)\n#define BOOST_MATH_STANDALONE\n#endif\n#include <boost/math/constants/constants.hpp>\n#endif\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\n// cd /mnt/c/Users/User/Documents/Ks/PC_Software/Test\n// g++ -Wall -Wextra -Wconversion -Wsign-conversion -Wshadow -Wundef -O3 -std=c++11 -I/mnt/c/boost/modular_boost/boost/libs/multiprecision/include -I/mnt/c/boost/modular_boost/boost/libs/config/include standalone_bernoulli_tgamma.cpp -o standalone_bernoulli_tgamma.exe\n\n// D:\\MinGW_nuwen\\MinGW\\bin\\g++ -Wall -Wextra -Wconversion -Wsign-conversion -Wshadow -Wundef -O3 -std=c++11 -IC:\\boost\\modular_boost\\boost\\libs\\multiprecision\\include -IC:\\boost\\modular_boost\\boost\\libs\\config\\include test.cpp -o test.exe\nnamespace example008_bernoulli\n{\n  constexpr std::int32_t wide_decimal_digits10 = INT32_C(1001);\n\n  using wide_float_backend_type = boost::multiprecision::cpp_bin_float<wide_decimal_digits10, boost::multiprecision::digit_base_10, std::allocator<void>>;\n\n  using wide_float_type = boost::multiprecision::number<wide_float_backend_type, boost::multiprecision::et_off>;\n\n  template<typename FloatingPointType>\n  auto pi() -> FloatingPointType\n  {\n    return static_cast<FloatingPointType>(3.1415926535897932384626433832795029L); // NOLINT(cppcoreguidelines-avoid-magic-numbers,readability-magic-numbers)\n  }\n\n  #if defined(EXAMPLE008_BERNOULLI_USE_LOCAL_PI)\n  template<typename FloatingPointType>\n  auto calc_pi() -> FloatingPointType\n  {\n    // Use a quadratically convergent Gauss AGM to compute pi.\n\n    using floating_point_type = FloatingPointType;\n\n    floating_point_type val_pi;\n\n    floating_point_type a(1U);\n\n    // Initialize bB to 0.5.\n    floating_point_type bB(0.5F); // NOLINT(readability-identifier-naming,cppcoreguidelines-avoid-magic-numbers,readability-magic-numbers)\n\n    // Initialize t to 0.375.\n    floating_point_type t(static_cast<floating_point_type>(3U) / 8U); // NOLINT(cppcoreguidelines-avoid-magic-numbers,readability-magic-numbers)\n\n    floating_point_type s(bB);\n\n    // This loop is designed for a maximum of several million\n    // decimal digits of pi. The index k should reach no higher\n    // than about 25 or 30. After about 20 iterations, the precision\n    // is about one million decimal digits.\n\n    const auto digits10_iteration_goal =\n      static_cast<std::uint32_t>\n      (\n          static_cast<std::uint32_t>(std::numeric_limits<floating_point_type>::digits10 / 2)\n        + static_cast<std::uint32_t>(9U)\n      );\n\n    using std::log;\n    using std::lround;\n\n    const auto digits10_scale =\n      static_cast<std::uint32_t>\n      (\n        lround\n        (\n          static_cast<float>(1000.0F * log(static_cast<float>(std::numeric_limits<floating_point_type>::radix))) / log(10.0F)\n        )\n      );\n\n    for(auto   k = static_cast<unsigned>(UINT8_C(0));\n                k < static_cast<unsigned>(UINT8_C(48));\n              ++k)\n    {\n      using std::sqrt;\n\n      a      += sqrt(bB);\n      a      /= 2U;\n      val_pi  = a;\n      val_pi *= a;\n      bB      = val_pi;\n      bB     -= t;\n      bB     *= 2U;\n\n      floating_point_type iterate_term(bB);\n\n      iterate_term -= val_pi;\n      iterate_term *= static_cast<unsigned long long>(1ULL << (k + 1U)); // NOLINT(google-runtime-int)\n\n      s += iterate_term;\n\n      // Test the number of precise digits from this iteration.\n      // If it is there are enough precise digits, then the calculation\n      // is finished.\n      const auto ib =\n        (std::max)\n        (\n          static_cast<std::int32_t>(0),\n          static_cast<std::int32_t>(-ilogb(iterate_term))\n        );\n\n      const auto digits10_of_iteration =\n        static_cast<std::uint32_t>\n        (\n          static_cast<std::uint64_t>(static_cast<std::uint64_t>(ib) * digits10_scale) / UINT32_C(1000)\n        );\n\n      // Estimate the approximate decimal digits of this iteration term.\n      // If we have attained about half of the total desired digits\n      // with this iteration term, then the calculation is finished\n      // because the change from the next iteration will be\n      // insignificantly small.\n\n      if(digits10_of_iteration > digits10_iteration_goal)\n      {\n        break;\n      }\n\n      t  = val_pi;\n      t += bB;\n      t /= 4U;\n    }\n\n    return (val_pi + bB) / s;\n  }\n\n  template<typename FloatingPointType>\n  auto my_pi() -> const FloatingPointType&\n  {\n    using floating_point_type = FloatingPointType;\n\n    static const floating_point_type local_pi = calc_pi<floating_point_type>();\n\n    return local_pi;\n  }\n  #endif\n\n  template<>\n  auto pi() -> wide_float_type\n  {\n    #if defined(EXAMPLE008_BERNOULLI_USE_LOCAL_PI)\n    return my_pi<wide_float_type>();\n    #else\n    return boost::math::constants::pi<wide_float_type>();\n    #endif\n  }\n\n  auto bernoulli_table() -> std::vector<wide_float_type>&\n  {\n    static std::vector<wide_float_type>\n      bernoulli_table\n      (\n        static_cast<std::size_t>\n        (\n          static_cast<float>(std::numeric_limits<wide_float_type>::digits10) * 0.95F\n        )\n      );\n\n    return bernoulli_table;\n  }\n\n  template<typename FloatingPointType>\n  auto bernoulli_b(FloatingPointType* bn, std::uint32_t n) -> void\n  {\n    using floating_point_type = FloatingPointType;\n\n    // See reference \"Computing Bernoulli and Tangent Numbers\", Richard P. Brent.\n    // See also the book Richard P. Brent and Paul Zimmermann, \"Modern Computer Arithmetic\",\n    // Cambridge University Press, 2010, p. 237.\n\n    const auto m = static_cast<std::uint32_t>(n / 2U);\n\n    std::vector<floating_point_type> tangent_numbers(m + 1U);\n\n    tangent_numbers[0U] = 0U;\n    tangent_numbers[1U] = 1U;\n\n    for(std::uint32_t k = 1U; k < m; ++k)\n    {\n      tangent_numbers[k + 1U] = tangent_numbers[k] * k;\n    }\n\n    for(auto k = static_cast<std::uint32_t>(2U); k <= m; ++k)\n    {\n      for(auto j = k; j <= m; ++j)\n      {\n        const std::uint32_t j_minus_k = j - k;\n\n        tangent_numbers[j] =   (tangent_numbers[j - 1] *  j_minus_k)\n                             + (tangent_numbers[j]     * (j_minus_k + 2U));\n      }\n    }\n\n    floating_point_type two_pow_two_m(4U);\n\n    for(std::uint32_t i = 1U; i < static_cast<std::uint32_t>(n / 2U); ++i)\n    {\n      const auto two_i = static_cast<std::uint32_t>(2U * i);\n\n      const floating_point_type b = (tangent_numbers[i] * two_i) / (two_pow_two_m * (two_pow_two_m - 1));\n\n      const bool  b_neg = ((two_i % 4U) == 0U);\n\n      bn[two_i] = ((!b_neg) ? b : -b); // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)\n\n      two_pow_two_m *= 4U;\n    }\n\n    bn[0U] =  1U;                          // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)\n    bn[1U] = floating_point_type(-1) / 2U; // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)\n  }\n\n  template<typename FloatingPointType>\n  auto tgamma(const FloatingPointType& x) -> FloatingPointType\n  {\n    using floating_point_type = FloatingPointType;\n\n    // Check if the argument should be scaled up for the Bernoulli series expansion.\n    static const auto min_arg_n =\n      static_cast<std::int32_t>\n      (\n        static_cast<float>(static_cast<float>(std::numeric_limits<floating_point_type>::digits10) * 0.8F)\n      );\n\n    static const floating_point_type min_arg_x = floating_point_type(min_arg_n);\n\n    const auto n_recur =\n      static_cast<std::uint32_t>\n      (\n        (x < min_arg_x) ? static_cast<std::uint32_t>(static_cast<std::uint32_t>(min_arg_n - static_cast<std::int32_t>(x)) + 1U)\n                        : static_cast<std::uint32_t>(0U)\n      );\n\n    floating_point_type xx(x);\n\n    // Scale the argument up and use downward recursion later for the final result.\n    if(n_recur != 0U)\n    {\n      xx += n_recur;\n    }\n\n          floating_point_type one_over_x_pow_two_n_minus_one = 1 / xx;\n    const floating_point_type one_over_x2                    =  one_over_x_pow_two_n_minus_one * one_over_x_pow_two_n_minus_one;\n          floating_point_type sum                            = (one_over_x_pow_two_n_minus_one * bernoulli_table()[2U]) / 2U;\n\n    floating_point_type tol = std::numeric_limits<floating_point_type>::epsilon();\n\n    using std::log;\n\n    if(xx > 8U) // NOLINT(cppcoreguidelines-avoid-magic-numbers,readability-magic-numbers)\n    {\n      // In the following code sequence, we extract the approximate logarithm\n      // of the argument x and use the leading term of Stirling's approximation,\n      // which is Log[Gamma[x]] aprox. (x (Log[x] - 1)) in order to scale\n      // the tolerance. In order to do this, we find the built-in floating point\n      // approximation of (x (Log[x] - 1)).\n\n      // Limit fx to the range 8 <= fx <= 10^16, where 8 is chosen to\n      // ensure that (log(fx) - 1.0F) remains positive and 10^16 is\n      // selected arbitrarily, yet ensured to be rather large.\n      auto fx_max = (std::max)(static_cast<floating_point_type>(8U), xx); // NOLINT(cppcoreguidelines-avoid-magic-numbers,readability-magic-numbers)\n\n      auto fx = (std::min)(fx_max, static_cast<floating_point_type>(UINT64_C(10000000000000000)));\n\n      tol *= static_cast<float>(fx * (log(fx) - 1.0F));\n    }\n\n    // Perform the Bernoulli series expansion.\n    for(auto n2 = static_cast<std::uint32_t>(4U); n2 < static_cast<std::uint32_t>(bernoulli_table().size()); n2 += 2U)\n    {\n      one_over_x_pow_two_n_minus_one *= one_over_x2;\n\n      const floating_point_type term =\n          (one_over_x_pow_two_n_minus_one * bernoulli_table()[n2])\n        / static_cast<std::uint64_t>(static_cast<std::uint64_t>(n2) * static_cast<std::uint32_t>(n2 - 1U));\n\n      using std::fabs;\n\n      if((n2 > 6U) && (fabs(term) < tol)) // NOLINT(cppcoreguidelines-avoid-magic-numbers,readability-magic-numbers)\n      {\n        break;\n      }\n\n      sum += term;\n    }\n\n    using example008_bernoulli::pi;\n    using std::exp;\n\n    static const floating_point_type half           = floating_point_type(1U) / 2U;\n    static const floating_point_type half_ln_two_pi = log(pi<floating_point_type>() * 2U) / 2U;\n\n    floating_point_type g = exp(((((xx - half) * log(xx)) - xx) + half_ln_two_pi) + sum);\n\n    // Rescale the result using downward recursion if necessary.\n    for(auto k = static_cast<std::uint32_t>(0U); k < n_recur; ++k)\n    {\n      g /= --xx;\n    }\n\n    return g;\n  }\n} // namespace example008_bernoulli\n\nauto example008_bernoulli_tgamma() -> bool\n{\n  const std::clock_t start = std::clock();\n\n  // Initialize the table of Bernoulli numbers.\n  example008_bernoulli::bernoulli_b\n  (\n    example008_bernoulli::bernoulli_table().data(),\n    static_cast<std::uint32_t>(example008_bernoulli::bernoulli_table().size())\n  );\n\n  // In this example, we compute values of Gamma[1/2 + n].\n\n  // We will make use of the relation\n  //                     (2n)!\n  //   Gamma[1/2 + n] = -------- * Sqrt[Pi].\n  //                    (4^n) n!\n\n  // Table[Factorial[2 n]/((4^n) Factorial[n]), {n, 0, 17, 1}]\n  const std::array<std::pair<std::uint64_t, std::uint32_t>, 18U> ratios =\n  {{\n    { UINT64_C(                  1), UINT32_C(     1) },\n    { UINT64_C(                  1), UINT32_C(     2) },\n    { UINT64_C(                  3), UINT32_C(     4) },\n    { UINT64_C(                 15), UINT32_C(     8) },\n    { UINT64_C(                105), UINT32_C(    16) },\n    { UINT64_C(                945), UINT32_C(    32) },\n    { UINT64_C(              10395), UINT32_C(    64) },\n    { UINT64_C(             135135), UINT32_C(   128) },\n    { UINT64_C(            2027025), UINT32_C(   256) },\n    { UINT64_C(           34459425), UINT32_C(   512) },\n    { UINT64_C(          654729075), UINT32_C(  1024) },\n    { UINT64_C(        13749310575), UINT32_C(  2048) },\n    { UINT64_C(       316234143225), UINT32_C(  4096) },\n    { UINT64_C(      7905853580625), UINT32_C(  8192) },\n    { UINT64_C(    213458046676875), UINT32_C( 16384) },\n    { UINT64_C(   6190283353629375), UINT32_C( 32768) },\n    { UINT64_C( 191898783962510625), UINT32_C( 65536) },\n    { UINT64_C(6332659870762850625), UINT32_C(131072) }\n  }};\n\n  bool result_is_ok = true;\n\n  using example008_bernoulli::wide_float_type;\n\n  const wide_float_type tol (std::numeric_limits<wide_float_type>::epsilon() * UINT32_C(100000));\n  const wide_float_type half(0.5F);\n\n  for(auto i = static_cast<std::size_t>(0U); i < ratios.size(); ++i)\n  {\n    // Calculate Gamma[1/2 + i]\n\n    const wide_float_type g = example008_bernoulli::tgamma(half + i);\n\n    // Calculate the control value.\n\n    using example008_bernoulli::pi;\n    using std::fabs;\n    using std::sqrt;\n\n    const wide_float_type control = (sqrt(pi<wide_float_type>()) * ratios[i].first) / ratios[i].second; // NOLINT(cppcoreguidelines-pro-bounds-constant-array-index)\n\n    const wide_float_type closeness = fabs(1 - (g / control));\n\n    result_is_ok &= (closeness < tol);\n  }\n\n  const std::clock_t stop = std::clock();\n\n  std::cout << \"Time example008_bernoulli_tgamma(): \"\n            << static_cast<float>(stop - start) / static_cast<float>(CLOCKS_PER_SEC)\n            << std::endl;\n\n  return result_is_ok;\n}\n\nint main()\n{\n  const bool result_is_ok = example008_bernoulli_tgamma();\n\n  std::cout << \"result_is_ok: \" << std::boolalpha << result_is_ok << std::endl;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/example/tommath_snips.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/tommath.hpp>\n#include <iostream>\n\nvoid t1()\n{\n//[tommath_eg\n//=#include <boost/multiprecision/tommath.hpp>\n//=#include <iostream>\n//=\n//=int main()\n//={\n   boost::multiprecision::tom_int v = 1;\n\n   // Do some arithmetic:\n   for(unsigned i = 1; i <= 1000; ++i)\n      v *= i;\n\n   std::cout << v << std::endl; // prints 1000!\n   std::cout << std::hex << v << std::endl; // prints 1000! in hex format\n\n   try{\n      std::cout << std::hex << -v << std::endl; // Ooops! can't print a negative value in hex format!\n   }\n   catch(const std::runtime_error& e)\n   {\n      std::cout << e.what() << std::endl;\n   }\n\n   try{\n      // v is not a 2's complement type, bitwise operations are only supported\n      // on positive values:\n      v = -v & 2;\n   }\n   catch(const std::runtime_error& e)\n   {\n      std::cout << e.what() << std::endl;\n   }\n\n//=   return 0;\n//=}\n//]\n}\n\nvoid t3()\n{\n//[mp_rat_eg\n//=#include <boost/multiprecision/tommath.hpp>\n//=#include <iostream>\n//=\n//=int main()\n//={\n   using namespace boost::multiprecision;\n\n   tom_rational v = 1;\n\n   // Do some arithmetic:\n   for(unsigned i = 1; i <= 1000; ++i)\n      v *= i;\n   v /= 10;\n\n   std::cout << v << std::endl; // prints 1000! / 10\n   std::cout << numerator(v) << std::endl;\n   std::cout << denominator(v) << std::endl;\n\n   tom_rational w(2, 3); // Component wise constructor\n   std::cout << w << std::endl; // prints 2/3\n\n//=   return 0;\n//=}\n//]\n}\n\nint main()\n{\n   t1();\n   t3();\n   return 0;\n}\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/abi/borland_prefix.hpp",
    "content": "//  (C) Copyright John Maddock 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  for C++ Builder the following options effect the ABI:\n//\n//  -b (on or off - effect emum sizes)\n//  -Vx  (on or off - empty members)\n//  -Ve (on or off - empty base classes)\n//  -aX (alignment - 5 options).\n//  -pX (Calling convention - 4 options)\n//  -VmX (member pointer size and layout - 5 options)\n//  -VC (on or off, changes name mangling)\n//  -Vl (on or off, changes struct layout).\n\n//  In addition the following warnings are sufficiently annoying (and\n//  unfixable) to have them turned off by default:\n//\n//  8027 - functions containing [for|while] loops are not expanded inline\n//  8026 - functions taking class by value arguments are not expanded inline\n\n#pragma nopushoptwarn\n#  pragma option push -a8 -Vx- -Ve- -b- -pc -Vmv -VC- -Vl- -w-8027 -w-8026\n\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/abi/borland_suffix.hpp",
    "content": "//  (C) Copyright John Maddock 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#  pragma option pop\n#pragma nopushoptwarn\n\n\n\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/abi/msvc_prefix.hpp",
    "content": "//  (C) Copyright John Maddock 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//\n// Boost binaries are built with the compiler's default ABI settings,\n// if the user changes their default alignment in the VS IDE then their\n// code will no longer be binary compatible with the bjam built binaries\n// unless this header is included to force Boost code into a consistent ABI.\n//\n// Note that inclusion of this header is only necessary for libraries with \n// separate source, header only libraries DO NOT need this as long as all\n// translation units are built with the same options.\n//\n#if defined(_M_X64)\n#  pragma pack(push,16)\n#else\n#  pragma pack(push,8)\n#endif\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/abi/msvc_suffix.hpp",
    "content": "//  (C) Copyright John Maddock 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#pragma pack(pop)\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/abi_prefix.hpp",
    "content": "//  abi_prefix header  -------------------------------------------------------//\n\n// (c) Copyright John Maddock 2003\n   \n// Use, modification and distribution are subject to the Boost Software License,\n// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt).\n\n#ifndef BOOST_CONFIG_ABI_PREFIX_HPP\n# define BOOST_CONFIG_ABI_PREFIX_HPP\n#else\n# error double inclusion of header boost/config/abi_prefix.hpp is an error\n#endif\n\n#include <boost/config.hpp>\n\n// this must occur after all other includes and before any code appears:\n#ifdef BOOST_HAS_ABI_HEADERS\n#  include BOOST_ABI_PREFIX\n#endif\n\n#if defined( BOOST_BORLANDC )\n#pragma nopushoptwarn\n#endif\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/abi_suffix.hpp",
    "content": "//  abi_sufffix header  -------------------------------------------------------//\n\n// (c) Copyright John Maddock 2003\n   \n// Use, modification and distribution are subject to the Boost Software License,\n// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt).\n\n// This header should be #included AFTER code that was preceded by a #include\n// <boost/config/abi_prefix.hpp>.\n\n#ifndef BOOST_CONFIG_ABI_PREFIX_HPP\n# error Header boost/config/abi_suffix.hpp must only be used after boost/config/abi_prefix.hpp\n#else\n# undef BOOST_CONFIG_ABI_PREFIX_HPP\n#endif\n\n// the suffix header occurs after all of our code:\n#ifdef BOOST_HAS_ABI_HEADERS\n#  include BOOST_ABI_SUFFIX\n#endif\n\n#if defined( BOOST_BORLANDC )\n#pragma nopushoptwarn\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/assert_cxx03.hpp",
    "content": "//  This file was automatically generated on Sun Jun  5 16:50:18 2022\n//  by libs/config/tools/generate.cpp\n//  Copyright John Maddock 2002-21.\n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/libs/config for the most recent version.//\n//  Revision $Id$\n//\n\n#include <boost/config.hpp>\n\n#ifdef BOOST_NO_ADL_BARRIER\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_ADL_BARRIER.\"\n#endif\n#ifdef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP.\"\n#endif\n#ifdef BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS.\"\n#endif\n#ifdef BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_COMPLETE_VALUE_INITIALIZATION.\"\n#endif\n#ifdef BOOST_NO_CTYPE_FUNCTIONS\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_CTYPE_FUNCTIONS.\"\n#endif\n#ifdef BOOST_NO_CV_SPECIALIZATIONS\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_CV_SPECIALIZATIONS.\"\n#endif\n#ifdef BOOST_NO_CV_VOID_SPECIALIZATIONS\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_CV_VOID_SPECIALIZATIONS.\"\n#endif\n#ifdef BOOST_NO_CWCHAR\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_CWCHAR.\"\n#endif\n#ifdef BOOST_NO_CWCTYPE\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_CWCTYPE.\"\n#endif\n#ifdef BOOST_NO_DEPENDENT_NESTED_DERIVATIONS\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_DEPENDENT_NESTED_DERIVATIONS.\"\n#endif\n#ifdef BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS.\"\n#endif\n#ifdef BOOST_NO_EXCEPTIONS\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_EXCEPTIONS.\"\n#endif\n#ifdef BOOST_NO_EXCEPTION_STD_NAMESPACE\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_EXCEPTION_STD_NAMESPACE.\"\n#endif\n#ifdef BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS.\"\n#endif\n#ifdef BOOST_NO_FENV_H\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_FENV_H.\"\n#endif\n#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_FUNCTION_TEMPLATE_ORDERING.\"\n#endif\n#ifdef BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS.\"\n#endif\n#ifdef BOOST_NO_INCLASS_MEMBER_INITIALIZATION\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_INCLASS_MEMBER_INITIALIZATION.\"\n#endif\n#ifdef BOOST_NO_INTEGRAL_INT64_T\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_INTEGRAL_INT64_T.\"\n#endif\n#ifdef BOOST_NO_INTRINSIC_WCHAR_T\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_INTRINSIC_WCHAR_T.\"\n#endif\n#ifdef BOOST_NO_IOSFWD\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_IOSFWD.\"\n#endif\n#ifdef BOOST_NO_IOSTREAM\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_IOSTREAM.\"\n#endif\n#ifdef BOOST_NO_IS_ABSTRACT\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_IS_ABSTRACT.\"\n#endif\n#ifdef BOOST_NO_LIMITS\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_LIMITS.\"\n#endif\n#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS.\"\n#endif\n#ifdef BOOST_NO_LONG_LONG\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_LONG_LONG.\"\n#endif\n#ifdef BOOST_NO_LONG_LONG_NUMERIC_LIMITS\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_LONG_LONG_NUMERIC_LIMITS.\"\n#endif\n#ifdef BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS.\"\n#endif\n#ifdef BOOST_NO_MEMBER_TEMPLATES\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_MEMBER_TEMPLATES.\"\n#endif\n#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_MEMBER_TEMPLATE_FRIENDS.\"\n#endif\n#ifdef BOOST_NO_MEMBER_TEMPLATE_KEYWORD\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_MEMBER_TEMPLATE_KEYWORD.\"\n#endif\n#ifdef BOOST_NO_NESTED_FRIENDSHIP\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_NESTED_FRIENDSHIP.\"\n#endif\n#ifdef BOOST_NO_OPERATORS_IN_NAMESPACE\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_OPERATORS_IN_NAMESPACE.\"\n#endif\n#ifdef BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS.\"\n#endif\n#ifdef BOOST_NO_POINTER_TO_MEMBER_CONST\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_POINTER_TO_MEMBER_CONST.\"\n#endif\n#ifdef BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS.\"\n#endif\n#ifdef BOOST_NO_PRIVATE_IN_AGGREGATE\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_PRIVATE_IN_AGGREGATE.\"\n#endif\n#ifdef BOOST_NO_RESTRICT_REFERENCES\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_RESTRICT_REFERENCES.\"\n#endif\n#ifdef BOOST_NO_RTTI\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_RTTI.\"\n#endif\n#ifdef BOOST_NO_SFINAE\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_SFINAE.\"\n#endif\n#ifdef BOOST_NO_SFINAE_EXPR\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_SFINAE_EXPR.\"\n#endif\n#ifdef BOOST_NO_STDC_NAMESPACE\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_STDC_NAMESPACE.\"\n#endif\n#ifdef BOOST_NO_STD_ALLOCATOR\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_STD_ALLOCATOR.\"\n#endif\n#ifdef BOOST_NO_STD_DISTANCE\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_STD_DISTANCE.\"\n#endif\n#ifdef BOOST_NO_STD_ITERATOR\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_STD_ITERATOR.\"\n#endif\n#ifdef BOOST_NO_STD_ITERATOR_TRAITS\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_STD_ITERATOR_TRAITS.\"\n#endif\n#ifdef BOOST_NO_STD_LOCALE\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_STD_LOCALE.\"\n#endif\n#ifdef BOOST_NO_STD_MESSAGES\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_STD_MESSAGES.\"\n#endif\n#ifdef BOOST_NO_STD_MIN_MAX\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_STD_MIN_MAX.\"\n#endif\n#ifdef BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN.\"\n#endif\n#ifdef BOOST_NO_STD_TYPEINFO\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_STD_TYPEINFO.\"\n#endif\n#ifdef BOOST_NO_STD_USE_FACET\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_STD_USE_FACET.\"\n#endif\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_STD_WSTREAMBUF.\"\n#endif\n#ifdef BOOST_NO_STD_WSTRING\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_STD_WSTRING.\"\n#endif\n#ifdef BOOST_NO_STRINGSTREAM\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_STRINGSTREAM.\"\n#endif\n#ifdef BOOST_NO_TEMPLATED_IOSTREAMS\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_TEMPLATED_IOSTREAMS.\"\n#endif\n#ifdef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS.\"\n#endif\n#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION.\"\n#endif\n#ifdef BOOST_NO_TEMPLATE_TEMPLATES\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_TEMPLATE_TEMPLATES.\"\n#endif\n#ifdef BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_TWO_PHASE_NAME_LOOKUP.\"\n#endif\n#ifdef BOOST_NO_TYPEID\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_TYPEID.\"\n#endif\n#ifdef BOOST_NO_TYPENAME_WITH_CTOR\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_TYPENAME_WITH_CTOR.\"\n#endif\n#ifdef BOOST_NO_UNREACHABLE_RETURN_DETECTION\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_UNREACHABLE_RETURN_DETECTION.\"\n#endif\n#ifdef BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE.\"\n#endif\n#ifdef BOOST_NO_USING_TEMPLATE\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_USING_TEMPLATE.\"\n#endif\n#ifdef BOOST_NO_VOID_RETURNS\n#  error \"Your compiler appears not to be fully C++03 compliant.  Detected via defect macro BOOST_NO_VOID_RETURNS.\"\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/assert_cxx11.hpp",
    "content": "//  This file was automatically generated on Sun Jun  5 16:50:18 2022\n//  by libs/config/tools/generate.cpp\n//  Copyright John Maddock 2002-21.\n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/libs/config for the most recent version.//\n//  Revision $Id$\n//\n\n#include <boost/config.hpp>\n#include <boost/config/assert_cxx03.hpp>\n\n#ifdef BOOST_NO_CXX11_ADDRESSOF\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_ADDRESSOF.\"\n#endif\n#ifdef BOOST_NO_CXX11_ALIGNAS\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_ALIGNAS.\"\n#endif\n#ifdef BOOST_NO_CXX11_ALLOCATOR\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_ALLOCATOR.\"\n#endif\n#ifdef BOOST_NO_CXX11_AUTO_DECLARATIONS\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_AUTO_DECLARATIONS.\"\n#endif\n#ifdef BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS.\"\n#endif\n#ifdef BOOST_NO_CXX11_CHAR16_T\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_CHAR16_T.\"\n#endif\n#ifdef BOOST_NO_CXX11_CHAR32_T\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_CHAR32_T.\"\n#endif\n#ifdef BOOST_NO_CXX11_CONSTEXPR\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_CONSTEXPR.\"\n#endif\n#ifdef BOOST_NO_CXX11_DECLTYPE\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_DECLTYPE.\"\n#endif\n#ifdef BOOST_NO_CXX11_DECLTYPE_N3276\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_DECLTYPE_N3276.\"\n#endif\n#ifdef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_DEFAULTED_FUNCTIONS.\"\n#endif\n#ifdef BOOST_NO_CXX11_DEFAULTED_MOVES\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_DEFAULTED_MOVES.\"\n#endif\n#ifdef BOOST_NO_CXX11_DELETED_FUNCTIONS\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_DELETED_FUNCTIONS.\"\n#endif\n#ifdef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS.\"\n#endif\n#ifdef BOOST_NO_CXX11_EXTERN_TEMPLATE\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_EXTERN_TEMPLATE.\"\n#endif\n#ifdef BOOST_NO_CXX11_FINAL\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_FINAL.\"\n#endif\n#ifdef BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS.\"\n#endif\n#ifdef BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS.\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_ARRAY\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_HDR_ARRAY.\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_ATOMIC\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_HDR_ATOMIC.\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_CHRONO\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_HDR_CHRONO.\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_HDR_CONDITION_VARIABLE.\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_EXCEPTION\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_HDR_EXCEPTION.\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_HDR_FORWARD_LIST.\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_FUNCTIONAL\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_HDR_FUNCTIONAL.\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_FUTURE\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_HDR_FUTURE.\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_HDR_INITIALIZER_LIST.\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_MUTEX\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_HDR_MUTEX.\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_RANDOM\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_HDR_RANDOM.\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_RATIO\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_HDR_RATIO.\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_REGEX\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_HDR_REGEX.\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_HDR_SYSTEM_ERROR.\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_THREAD\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_HDR_THREAD.\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_TUPLE\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_HDR_TUPLE.\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_TYPEINDEX\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_HDR_TYPEINDEX.\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_HDR_TYPE_TRAITS.\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_HDR_UNORDERED_MAP.\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_HDR_UNORDERED_SET.\"\n#endif\n#ifdef BOOST_NO_CXX11_INLINE_NAMESPACES\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_INLINE_NAMESPACES.\"\n#endif\n#ifdef BOOST_NO_CXX11_LAMBDAS\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_LAMBDAS.\"\n#endif\n#ifdef BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS.\"\n#endif\n#ifdef BOOST_NO_CXX11_NOEXCEPT\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_NOEXCEPT.\"\n#endif\n#ifdef BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS.\"\n#endif\n#ifdef BOOST_NO_CXX11_NULLPTR\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_NULLPTR.\"\n#endif\n#ifdef BOOST_NO_CXX11_NUMERIC_LIMITS\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_NUMERIC_LIMITS.\"\n#endif\n#ifdef BOOST_NO_CXX11_OVERRIDE\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_OVERRIDE.\"\n#endif\n#ifdef BOOST_NO_CXX11_POINTER_TRAITS\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_POINTER_TRAITS.\"\n#endif\n#ifdef BOOST_NO_CXX11_RANGE_BASED_FOR\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_RANGE_BASED_FOR.\"\n#endif\n#ifdef BOOST_NO_CXX11_RAW_LITERALS\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_RAW_LITERALS.\"\n#endif\n#ifdef BOOST_NO_CXX11_REF_QUALIFIERS\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_REF_QUALIFIERS.\"\n#endif\n#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_RVALUE_REFERENCES.\"\n#endif\n#ifdef BOOST_NO_CXX11_SCOPED_ENUMS\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_SCOPED_ENUMS.\"\n#endif\n#ifdef BOOST_NO_CXX11_SFINAE_EXPR\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_SFINAE_EXPR.\"\n#endif\n#ifdef BOOST_NO_CXX11_SMART_PTR\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_SMART_PTR.\"\n#endif\n#ifdef BOOST_NO_CXX11_STATIC_ASSERT\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_STATIC_ASSERT.\"\n#endif\n#ifdef BOOST_NO_CXX11_STD_ALIGN\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_STD_ALIGN.\"\n#endif\n#ifdef BOOST_NO_CXX11_TEMPLATE_ALIASES\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_TEMPLATE_ALIASES.\"\n#endif\n#ifdef BOOST_NO_CXX11_THREAD_LOCAL\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_THREAD_LOCAL.\"\n#endif\n#ifdef BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_TRAILING_RESULT_TYPES.\"\n#endif\n#ifdef BOOST_NO_CXX11_UNICODE_LITERALS\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_UNICODE_LITERALS.\"\n#endif\n#ifdef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX.\"\n#endif\n#ifdef BOOST_NO_CXX11_UNRESTRICTED_UNION\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_UNRESTRICTED_UNION.\"\n#endif\n#ifdef BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_USER_DEFINED_LITERALS.\"\n#endif\n#ifdef BOOST_NO_CXX11_VARIADIC_MACROS\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_VARIADIC_MACROS.\"\n#endif\n#ifdef BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#  error \"Your compiler appears not to be fully C++11 compliant.  Detected via defect macro BOOST_NO_CXX11_VARIADIC_TEMPLATES.\"\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/assert_cxx14.hpp",
    "content": "//  This file was automatically generated on Sun Jun  5 16:50:18 2022\n//  by libs/config/tools/generate.cpp\n//  Copyright John Maddock 2002-21.\n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/libs/config for the most recent version.//\n//  Revision $Id$\n//\n\n#include <boost/config.hpp>\n#include <boost/config/assert_cxx11.hpp>\n\n#ifdef BOOST_NO_CXX14_AGGREGATE_NSDMI\n#  error \"Your compiler appears not to be fully C++14 compliant.  Detected via defect macro BOOST_NO_CXX14_AGGREGATE_NSDMI.\"\n#endif\n#ifdef BOOST_NO_CXX14_BINARY_LITERALS\n#  error \"Your compiler appears not to be fully C++14 compliant.  Detected via defect macro BOOST_NO_CXX14_BINARY_LITERALS.\"\n#endif\n#ifdef BOOST_NO_CXX14_CONSTEXPR\n#  error \"Your compiler appears not to be fully C++14 compliant.  Detected via defect macro BOOST_NO_CXX14_CONSTEXPR.\"\n#endif\n#ifdef BOOST_NO_CXX14_DECLTYPE_AUTO\n#  error \"Your compiler appears not to be fully C++14 compliant.  Detected via defect macro BOOST_NO_CXX14_DECLTYPE_AUTO.\"\n#endif\n#ifdef BOOST_NO_CXX14_DIGIT_SEPARATORS\n#  error \"Your compiler appears not to be fully C++14 compliant.  Detected via defect macro BOOST_NO_CXX14_DIGIT_SEPARATORS.\"\n#endif\n#ifdef BOOST_NO_CXX14_GENERIC_LAMBDAS\n#  error \"Your compiler appears not to be fully C++14 compliant.  Detected via defect macro BOOST_NO_CXX14_GENERIC_LAMBDAS.\"\n#endif\n#ifdef BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#  error \"Your compiler appears not to be fully C++14 compliant.  Detected via defect macro BOOST_NO_CXX14_HDR_SHARED_MUTEX.\"\n#endif\n#ifdef BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#  error \"Your compiler appears not to be fully C++14 compliant.  Detected via defect macro BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES.\"\n#endif\n#ifdef BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#  error \"Your compiler appears not to be fully C++14 compliant.  Detected via defect macro BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION.\"\n#endif\n#ifdef BOOST_NO_CXX14_STD_EXCHANGE\n#  error \"Your compiler appears not to be fully C++14 compliant.  Detected via defect macro BOOST_NO_CXX14_STD_EXCHANGE.\"\n#endif\n#ifdef BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#  error \"Your compiler appears not to be fully C++14 compliant.  Detected via defect macro BOOST_NO_CXX14_VARIABLE_TEMPLATES.\"\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/assert_cxx17.hpp",
    "content": "//  This file was automatically generated on Sun Jun  5 16:50:18 2022\n//  by libs/config/tools/generate.cpp\n//  Copyright John Maddock 2002-21.\n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/libs/config for the most recent version.//\n//  Revision $Id$\n//\n\n#include <boost/config.hpp>\n#include <boost/config/assert_cxx14.hpp>\n\n#ifdef BOOST_NO_CXX17_DEDUCTION_GUIDES\n#  error \"Your compiler appears not to be fully C++17 compliant.  Detected via defect macro BOOST_NO_CXX17_DEDUCTION_GUIDES.\"\n#endif\n#ifdef BOOST_NO_CXX17_FOLD_EXPRESSIONS\n#  error \"Your compiler appears not to be fully C++17 compliant.  Detected via defect macro BOOST_NO_CXX17_FOLD_EXPRESSIONS.\"\n#endif\n#ifdef BOOST_NO_CXX17_HDR_ANY\n#  error \"Your compiler appears not to be fully C++17 compliant.  Detected via defect macro BOOST_NO_CXX17_HDR_ANY.\"\n#endif\n#ifdef BOOST_NO_CXX17_HDR_CHARCONV\n#  error \"Your compiler appears not to be fully C++17 compliant.  Detected via defect macro BOOST_NO_CXX17_HDR_CHARCONV.\"\n#endif\n#ifdef BOOST_NO_CXX17_HDR_EXECUTION\n#  error \"Your compiler appears not to be fully C++17 compliant.  Detected via defect macro BOOST_NO_CXX17_HDR_EXECUTION.\"\n#endif\n#ifdef BOOST_NO_CXX17_HDR_FILESYSTEM\n#  error \"Your compiler appears not to be fully C++17 compliant.  Detected via defect macro BOOST_NO_CXX17_HDR_FILESYSTEM.\"\n#endif\n#ifdef BOOST_NO_CXX17_HDR_MEMORY_RESOURCE\n#  error \"Your compiler appears not to be fully C++17 compliant.  Detected via defect macro BOOST_NO_CXX17_HDR_MEMORY_RESOURCE.\"\n#endif\n#ifdef BOOST_NO_CXX17_HDR_OPTIONAL\n#  error \"Your compiler appears not to be fully C++17 compliant.  Detected via defect macro BOOST_NO_CXX17_HDR_OPTIONAL.\"\n#endif\n#ifdef BOOST_NO_CXX17_HDR_STRING_VIEW\n#  error \"Your compiler appears not to be fully C++17 compliant.  Detected via defect macro BOOST_NO_CXX17_HDR_STRING_VIEW.\"\n#endif\n#ifdef BOOST_NO_CXX17_HDR_VARIANT\n#  error \"Your compiler appears not to be fully C++17 compliant.  Detected via defect macro BOOST_NO_CXX17_HDR_VARIANT.\"\n#endif\n#ifdef BOOST_NO_CXX17_IF_CONSTEXPR\n#  error \"Your compiler appears not to be fully C++17 compliant.  Detected via defect macro BOOST_NO_CXX17_IF_CONSTEXPR.\"\n#endif\n#ifdef BOOST_NO_CXX17_INLINE_VARIABLES\n#  error \"Your compiler appears not to be fully C++17 compliant.  Detected via defect macro BOOST_NO_CXX17_INLINE_VARIABLES.\"\n#endif\n#ifdef BOOST_NO_CXX17_ITERATOR_TRAITS\n#  error \"Your compiler appears not to be fully C++17 compliant.  Detected via defect macro BOOST_NO_CXX17_ITERATOR_TRAITS.\"\n#endif\n#ifdef BOOST_NO_CXX17_STD_APPLY\n#  error \"Your compiler appears not to be fully C++17 compliant.  Detected via defect macro BOOST_NO_CXX17_STD_APPLY.\"\n#endif\n#ifdef BOOST_NO_CXX17_STD_INVOKE\n#  error \"Your compiler appears not to be fully C++17 compliant.  Detected via defect macro BOOST_NO_CXX17_STD_INVOKE.\"\n#endif\n#ifdef BOOST_NO_CXX17_STRUCTURED_BINDINGS\n#  error \"Your compiler appears not to be fully C++17 compliant.  Detected via defect macro BOOST_NO_CXX17_STRUCTURED_BINDINGS.\"\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/assert_cxx20.hpp",
    "content": "//  This file was automatically generated on Sun Jun  5 16:50:18 2022\n//  by libs/config/tools/generate.cpp\n//  Copyright John Maddock 2002-21.\n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/libs/config for the most recent version.//\n//  Revision $Id$\n//\n\n#include <boost/config.hpp>\n#include <boost/config/assert_cxx17.hpp>\n\n#ifdef BOOST_NO_CXX20_HDR_BARRIER\n#  error \"Your compiler appears not to be fully C++20 compliant.  Detected via defect macro BOOST_NO_CXX20_HDR_BARRIER.\"\n#endif\n#ifdef BOOST_NO_CXX20_HDR_BIT\n#  error \"Your compiler appears not to be fully C++20 compliant.  Detected via defect macro BOOST_NO_CXX20_HDR_BIT.\"\n#endif\n#ifdef BOOST_NO_CXX20_HDR_COMPARE\n#  error \"Your compiler appears not to be fully C++20 compliant.  Detected via defect macro BOOST_NO_CXX20_HDR_COMPARE.\"\n#endif\n#ifdef BOOST_NO_CXX20_HDR_CONCEPTS\n#  error \"Your compiler appears not to be fully C++20 compliant.  Detected via defect macro BOOST_NO_CXX20_HDR_CONCEPTS.\"\n#endif\n#ifdef BOOST_NO_CXX20_HDR_COROUTINE\n#  error \"Your compiler appears not to be fully C++20 compliant.  Detected via defect macro BOOST_NO_CXX20_HDR_COROUTINE.\"\n#endif\n#ifdef BOOST_NO_CXX20_HDR_FORMAT\n#  error \"Your compiler appears not to be fully C++20 compliant.  Detected via defect macro BOOST_NO_CXX20_HDR_FORMAT.\"\n#endif\n#ifdef BOOST_NO_CXX20_HDR_LATCH\n#  error \"Your compiler appears not to be fully C++20 compliant.  Detected via defect macro BOOST_NO_CXX20_HDR_LATCH.\"\n#endif\n#ifdef BOOST_NO_CXX20_HDR_NUMBERS\n#  error \"Your compiler appears not to be fully C++20 compliant.  Detected via defect macro BOOST_NO_CXX20_HDR_NUMBERS.\"\n#endif\n#ifdef BOOST_NO_CXX20_HDR_RANGES\n#  error \"Your compiler appears not to be fully C++20 compliant.  Detected via defect macro BOOST_NO_CXX20_HDR_RANGES.\"\n#endif\n#ifdef BOOST_NO_CXX20_HDR_SEMAPHORE\n#  error \"Your compiler appears not to be fully C++20 compliant.  Detected via defect macro BOOST_NO_CXX20_HDR_SEMAPHORE.\"\n#endif\n#ifdef BOOST_NO_CXX20_HDR_SOURCE_LOCATION\n#  error \"Your compiler appears not to be fully C++20 compliant.  Detected via defect macro BOOST_NO_CXX20_HDR_SOURCE_LOCATION.\"\n#endif\n#ifdef BOOST_NO_CXX20_HDR_SPAN\n#  error \"Your compiler appears not to be fully C++20 compliant.  Detected via defect macro BOOST_NO_CXX20_HDR_SPAN.\"\n#endif\n#ifdef BOOST_NO_CXX20_HDR_STOP_TOKEN\n#  error \"Your compiler appears not to be fully C++20 compliant.  Detected via defect macro BOOST_NO_CXX20_HDR_STOP_TOKEN.\"\n#endif\n#ifdef BOOST_NO_CXX20_HDR_SYNCSTREAM\n#  error \"Your compiler appears not to be fully C++20 compliant.  Detected via defect macro BOOST_NO_CXX20_HDR_SYNCSTREAM.\"\n#endif\n#ifdef BOOST_NO_CXX20_HDR_VERSION\n#  error \"Your compiler appears not to be fully C++20 compliant.  Detected via defect macro BOOST_NO_CXX20_HDR_VERSION.\"\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/assert_cxx98.hpp",
    "content": "//  This file was automatically generated on Wed Mar  3 08:46:11 2021\n//  by libs/config/tools/generate.cpp\n//  Copyright John Maddock 2002-4.\n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/libs/config for the most recent version.//\n//  Revision $Id$\n//\n\n#include <boost/config.hpp>\n#include <boost/config/assert_cxx17.hpp>\n\n#ifdef BOOST_NO_CXX98_BINDERS\n#  error \"Your compiler appears not to be fully C++98 compliant.  Detected via defect macro BOOST_NO_CXX98_BINDERS.\"\n#endif\n#ifdef BOOST_NO_CXX98_FUNCTION_BASE\n#  error \"Your compiler appears not to be fully C++98 compliant.  Detected via defect macro BOOST_NO_CXX98_FUNCTION_BASE.\"\n#endif\n#ifdef BOOST_NO_CXX98_RANDOM_SHUFFLE\n#  error \"Your compiler appears not to be fully C++98 compliant.  Detected via defect macro BOOST_NO_CXX98_RANDOM_SHUFFLE.\"\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/auto_link.hpp",
    "content": "//  (C) Copyright John Maddock 2003.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n /*\n  *   LOCATION:    see http://www.boost.org for most recent version.\n  *   FILE         auto_link.hpp\n  *   VERSION      see <boost/version.hpp>\n  *   DESCRIPTION: Automatic library inclusion for Borland/Microsoft compilers.\n  */\n\n/*************************************************************************\n\nUSAGE:\n~~~~~~\n\nBefore including this header you must define one or more of define the following macros:\n\nBOOST_LIB_NAME:           Required: A string containing the basename of the library,\n                          for example boost_regex.\nBOOST_LIB_TOOLSET:        Optional: the base name of the toolset.\nBOOST_DYN_LINK:           Optional: when set link to dll rather than static library.\nBOOST_LIB_DIAGNOSTIC:     Optional: when set the header will print out the name\n                          of the library selected (useful for debugging).\nBOOST_AUTO_LINK_NOMANGLE: Specifies that we should link to BOOST_LIB_NAME.lib,\n                          rather than a mangled-name version.\nBOOST_AUTO_LINK_TAGGED:   Specifies that we link to libraries built with the --layout=tagged option.\n                          This is essentially the same as the default name-mangled version, but without\n                          the compiler name and version, or the Boost version.  Just the build options.\nBOOST_AUTO_LINK_SYSTEM:   Specifies that we link to libraries built with the --layout=system option.\n                          This is essentially the same as the non-name-mangled version, but with\n                          the prefix to differentiate static and dll builds\n\nThese macros will be undef'ed at the end of the header, further this header\nhas no include guards - so be sure to include it only once from your library!\n\nAlgorithm:\n~~~~~~~~~~\n\nLibraries for Borland and Microsoft compilers are automatically\nselected here, the name of the lib is selected according to the following\nformula:\n\nBOOST_LIB_PREFIX\n   + BOOST_LIB_NAME\n   + \"_\"\n   + BOOST_LIB_TOOLSET\n   + BOOST_LIB_THREAD_OPT\n   + BOOST_LIB_RT_OPT\n   + BOOST_LIB_ARCH_AND_MODEL_OPT\n   \"-\"\n   + BOOST_LIB_VERSION\n   + BOOST_LIB_SUFFIX\n\nThese are defined as:\n\nBOOST_LIB_PREFIX:     \"lib\" for static libraries otherwise \"\".\n\nBOOST_LIB_NAME:       The base name of the lib ( for example boost_regex).\n\nBOOST_LIB_TOOLSET:    The compiler toolset name (vc6, vc7, bcb5 etc).\n\nBOOST_LIB_THREAD_OPT: \"-mt\" for multithread builds, otherwise nothing.\n\nBOOST_LIB_RT_OPT:     A suffix that indicates the runtime library used,\n                      contains one or more of the following letters after\n                      a hyphen:\n\n                      s      static runtime (dynamic if not present).\n                      g      debug/diagnostic runtime (release if not present).\n                      y      Python debug/diagnostic runtime (release if not present).\n                      d      debug build (release if not present).\n                      p      STLport build.\n                      n      STLport build without its IOStreams.\n\nBOOST_LIB_ARCH_AND_MODEL_OPT: The architecture and address model\n                              (-x32 or -x64 for x86/32 and x86/64 respectively)\n\nBOOST_LIB_VERSION:    The Boost version, in the form x_y, for Boost version x.y.\n\nBOOST_LIB_SUFFIX:     Static/import libraries extension (\".lib\", \".a\") for the compiler.\n\n***************************************************************************/\n\n#ifdef __cplusplus\n#  ifndef BOOST_CONFIG_HPP\n#     include <boost/config.hpp>\n#  endif\n#elif defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__EDG_VERSION__)\n//\n// C language compatability (no, honestly)\n//\n#  define BOOST_MSVC _MSC_VER\n#  define BOOST_STRINGIZE(X) BOOST_DO_STRINGIZE(X)\n#  define BOOST_DO_STRINGIZE(X) #X\n#endif\n//\n// Only include what follows for known and supported compilers:\n//\n#if defined(BOOST_MSVC) \\\n    || defined(BOOST_EMBTC_WINDOWS) \\\n    || defined(BOOST_BORLANDC) \\\n    || (defined(__MWERKS__) && defined(_WIN32) && (__MWERKS__ >= 0x3000)) \\\n    || (defined(__ICL) && defined(_MSC_EXTENSIONS) && (_MSC_VER >= 1200)) \\\n    || (defined(BOOST_CLANG) && defined(BOOST_WINDOWS) && defined(_MSC_VER) && (__clang_major__ >= 4))\n\n#ifndef BOOST_VERSION_HPP\n#  include <boost/version.hpp>\n#endif\n\n#ifndef BOOST_LIB_NAME\n#  error \"Macro BOOST_LIB_NAME not set (internal error)\"\n#endif\n\n//\n// error check:\n//\n#if defined(__MSVC_RUNTIME_CHECKS) && !defined(_DEBUG)\n#  pragma message(\"Using the /RTC option without specifying a debug runtime will lead to linker errors\")\n#  pragma message(\"Hint: go to the code generation options and switch to one of the debugging runtimes\")\n#  error \"Incompatible build options\"\n#endif\n//\n// select toolset if not defined already:\n//\n#ifndef BOOST_LIB_TOOLSET\n#  if defined(BOOST_MSVC) && (BOOST_MSVC < 1200)\n    // Note: no compilers before 1200 are supported\n#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1300)\n\n#    ifdef UNDER_CE\n       // eVC4:\n#      define BOOST_LIB_TOOLSET \"evc4\"\n#    else\n       // vc6:\n#      define BOOST_LIB_TOOLSET \"vc6\"\n#    endif\n\n#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1310)\n\n     // vc7:\n#    define BOOST_LIB_TOOLSET \"vc7\"\n\n#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1400)\n\n     // vc71:\n#    define BOOST_LIB_TOOLSET \"vc71\"\n\n#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1500)\n\n     // vc80:\n#    define BOOST_LIB_TOOLSET \"vc80\"\n\n#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1600)\n\n     // vc90:\n#    define BOOST_LIB_TOOLSET \"vc90\"\n\n#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1700)\n\n     // vc10:\n#    define BOOST_LIB_TOOLSET \"vc100\"\n\n#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1800)\n\n     // vc11:\n#    define BOOST_LIB_TOOLSET \"vc110\"\n\n#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1900)\n\n     // vc12:\n#    define BOOST_LIB_TOOLSET \"vc120\"\n\n#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1910)\n\n     // vc14:\n#    define BOOST_LIB_TOOLSET \"vc140\"\n\n#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1920)\n\n     // vc14.1:\n#    define BOOST_LIB_TOOLSET \"vc141\"\n\n#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1930)\n\n     // vc14.2:\n#    define BOOST_LIB_TOOLSET \"vc142\"\n\n#  elif defined(BOOST_MSVC)\n\n     // vc14.3:\n#    define BOOST_LIB_TOOLSET \"vc143\"\n\n#  elif defined(BOOST_EMBTC_WINDOWS)\n\n     // Embarcadero Clang based compilers:\n#    define BOOST_LIB_TOOLSET \"embtc\"\n\n#  elif defined(BOOST_BORLANDC)\n\n     // CBuilder 6:\n#    define BOOST_LIB_TOOLSET \"bcb\"\n\n#  elif defined(__ICL)\n\n     // Intel C++, no version number:\n#    define BOOST_LIB_TOOLSET \"iw\"\n\n#  elif defined(__MWERKS__) && (__MWERKS__ <= 0x31FF )\n\n     // Metrowerks CodeWarrior 8.x\n#    define BOOST_LIB_TOOLSET \"cw8\"\n\n#  elif defined(__MWERKS__) && (__MWERKS__ <= 0x32FF )\n\n     // Metrowerks CodeWarrior 9.x\n#    define BOOST_LIB_TOOLSET \"cw9\"\n\n#  elif defined(BOOST_CLANG) && defined(BOOST_WINDOWS) && defined(_MSC_VER) && (__clang_major__ >= 4)\n\n     // Clang on Windows\n#    define BOOST_LIB_TOOLSET \"clangw\" BOOST_STRINGIZE(__clang_major__)\n\n#  endif\n#endif // BOOST_LIB_TOOLSET\n\n//\n// select thread opt:\n//\n#if defined(_MT) || defined(__MT__)\n#  define BOOST_LIB_THREAD_OPT \"-mt\"\n#else\n#  define BOOST_LIB_THREAD_OPT\n#endif\n\n#if defined(_MSC_VER) || defined(__MWERKS__)\n\n#  ifdef _DLL\n\n#     if (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) && (defined(_STLP_OWN_IOSTREAMS) || defined(__STL_OWN_IOSTREAMS))\n\n#        if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#            define BOOST_LIB_RT_OPT \"-gydp\"\n#        elif defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\n#            define BOOST_LIB_RT_OPT \"-gdp\"\n#        elif defined(_DEBUG)\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#            define BOOST_LIB_RT_OPT \"-gydp\"\n#            pragma message(\"warning: STLport debug versions are built with /D_STLP_DEBUG=1\")\n#            error \"Build options aren't compatible with pre-built libraries\"\n#        elif defined(_DEBUG)\n#            define BOOST_LIB_RT_OPT \"-gdp\"\n#            pragma message(\"warning: STLport debug versions are built with /D_STLP_DEBUG=1\")\n#            error \"Build options aren't compatible with pre-built libraries\"\n#        else\n#            define BOOST_LIB_RT_OPT \"-p\"\n#        endif\n\n#     elif defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)\n\n#        if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#            define BOOST_LIB_RT_OPT \"-gydpn\"\n#        elif defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\n#            define BOOST_LIB_RT_OPT \"-gdpn\"\n#        elif defined(_DEBUG)\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#            define BOOST_LIB_RT_OPT \"-gydpn\"\n#            pragma message(\"warning: STLport debug versions are built with /D_STLP_DEBUG=1\")\n#            error \"Build options aren't compatible with pre-built libraries\"\n#        elif defined(_DEBUG)\n#            define BOOST_LIB_RT_OPT \"-gdpn\"\n#            pragma message(\"warning: STLport debug versions are built with /D_STLP_DEBUG=1\")\n#            error \"Build options aren't compatible with pre-built libraries\"\n#        else\n#            define BOOST_LIB_RT_OPT \"-pn\"\n#        endif\n\n#     else\n\n#        if defined(_DEBUG) && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#            define BOOST_LIB_RT_OPT \"-gyd\"\n#        elif defined(_DEBUG)\n#            define BOOST_LIB_RT_OPT \"-gd\"\n#        else\n#            define BOOST_LIB_RT_OPT\n#        endif\n\n#     endif\n\n#  else\n\n#     if (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) && (defined(_STLP_OWN_IOSTREAMS) || defined(__STL_OWN_IOSTREAMS))\n\n#        if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#            define BOOST_LIB_RT_OPT \"-sgydp\"\n#        elif defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\n#            define BOOST_LIB_RT_OPT \"-sgdp\"\n#        elif defined(_DEBUG)\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#             define BOOST_LIB_RT_OPT \"-sgydp\"\n#            pragma message(\"warning: STLport debug versions are built with /D_STLP_DEBUG=1\")\n#            error \"Build options aren't compatible with pre-built libraries\"\n#        elif defined(_DEBUG)\n#             define BOOST_LIB_RT_OPT \"-sgdp\"\n#            pragma message(\"warning: STLport debug versions are built with /D_STLP_DEBUG=1\")\n#            error \"Build options aren't compatible with pre-built libraries\"\n#        else\n#            define BOOST_LIB_RT_OPT \"-sp\"\n#        endif\n\n#     elif defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)\n\n#        if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#            define BOOST_LIB_RT_OPT \"-sgydpn\"\n#        elif defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\n#            define BOOST_LIB_RT_OPT \"-sgdpn\"\n#        elif defined(_DEBUG)\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#             define BOOST_LIB_RT_OPT \"-sgydpn\"\n#            pragma message(\"warning: STLport debug versions are built with /D_STLP_DEBUG=1\")\n#            error \"Build options aren't compatible with pre-built libraries\"\n#        elif defined(_DEBUG)\n#             define BOOST_LIB_RT_OPT \"-sgdpn\"\n#            pragma message(\"warning: STLport debug versions are built with /D_STLP_DEBUG=1\")\n#            error \"Build options aren't compatible with pre-built libraries\"\n#        else\n#            define BOOST_LIB_RT_OPT \"-spn\"\n#        endif\n\n#     else\n\n#        if defined(_DEBUG)\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#             define BOOST_LIB_RT_OPT \"-sgyd\"\n#        elif defined(_DEBUG)\n#             define BOOST_LIB_RT_OPT \"-sgd\"\n#        else\n#            define BOOST_LIB_RT_OPT \"-s\"\n#        endif\n\n#     endif\n\n#  endif\n\n#elif defined(BOOST_EMBTC_WINDOWS)\n\n#  ifdef _RTLDLL\n\n#     if defined(_DEBUG)\n#         define BOOST_LIB_RT_OPT \"-d\"\n#     else\n#         define BOOST_LIB_RT_OPT\n#     endif\n\n#  else\n\n#     if defined(_DEBUG)\n#         define BOOST_LIB_RT_OPT \"-sd\"\n#     else\n#         define BOOST_LIB_RT_OPT \"-s\"\n#     endif\n\n#  endif\n\n#elif defined(BOOST_BORLANDC)\n\n//\n// figure out whether we want the debug builds or not:\n//\n#if BOOST_BORLANDC > 0x561\n#pragma defineonoption BOOST_BORLAND_DEBUG -v\n#endif\n//\n// sanity check:\n//\n#if defined(__STL_DEBUG) || defined(_STLP_DEBUG)\n#error \"Pre-built versions of the Boost libraries are not provided in STLport-debug form\"\n#endif\n\n#  ifdef _RTLDLL\n\n#     if defined(BOOST_BORLAND_DEBUG)\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#         define BOOST_LIB_RT_OPT \"-yd\"\n#     elif defined(BOOST_BORLAND_DEBUG)\n#         define BOOST_LIB_RT_OPT \"-d\"\n#     elif defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#         define BOOST_LIB_RT_OPT \"-y\"\n#     else\n#         define BOOST_LIB_RT_OPT\n#     endif\n\n#  else\n\n#     if defined(BOOST_BORLAND_DEBUG)\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#         define BOOST_LIB_RT_OPT \"-syd\"\n#     elif defined(BOOST_BORLAND_DEBUG)\n#         define BOOST_LIB_RT_OPT \"-sd\"\n#     elif defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#         define BOOST_LIB_RT_OPT \"-sy\"\n#     else\n#         define BOOST_LIB_RT_OPT \"-s\"\n#     endif\n\n#  endif\n\n#endif\n\n//\n// BOOST_LIB_ARCH_AND_MODEL_OPT\n//\n\n#if defined( _M_IX86 )\n#  define BOOST_LIB_ARCH_AND_MODEL_OPT \"-x32\"\n#elif defined( _M_X64 )\n#  define BOOST_LIB_ARCH_AND_MODEL_OPT \"-x64\"\n#elif defined( _M_ARM )\n#  define BOOST_LIB_ARCH_AND_MODEL_OPT \"-a32\"\n#elif defined( _M_ARM64 )\n#  define BOOST_LIB_ARCH_AND_MODEL_OPT \"-a64\"\n#endif\n\n//\n// select linkage opt:\n//\n#if (defined(_DLL) || defined(_RTLDLL)) && defined(BOOST_DYN_LINK)\n#  define BOOST_LIB_PREFIX\n#elif defined(BOOST_DYN_LINK)\n#  error \"Mixing a dll boost library with a static runtime is a really bad idea...\"\n#else\n#  define BOOST_LIB_PREFIX \"lib\"\n#endif\n\n//\n// now include the lib:\n//\n#if defined(BOOST_LIB_NAME) \\\n      && defined(BOOST_LIB_PREFIX) \\\n      && defined(BOOST_LIB_TOOLSET) \\\n      && defined(BOOST_LIB_THREAD_OPT) \\\n      && defined(BOOST_LIB_RT_OPT) \\\n      && defined(BOOST_LIB_ARCH_AND_MODEL_OPT) \\\n      && defined(BOOST_LIB_VERSION)\n\n#if defined(BOOST_EMBTC_WIN64)\n#  define BOOST_LIB_SUFFIX \".a\"\n#else\n#  define BOOST_LIB_SUFFIX \".lib\"\n#endif\n\n#ifdef BOOST_AUTO_LINK_NOMANGLE\n#  pragma comment(lib, BOOST_STRINGIZE(BOOST_LIB_NAME) BOOST_LIB_SUFFIX)\n#  ifdef BOOST_LIB_DIAGNOSTIC\n#     pragma message (\"Linking to lib file: \" BOOST_STRINGIZE(BOOST_LIB_NAME) BOOST_LIB_SUFFIX)\n#  endif\n#elif defined(BOOST_AUTO_LINK_TAGGED)\n#  pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT BOOST_LIB_ARCH_AND_MODEL_OPT BOOST_LIB_SUFFIX)\n#  ifdef BOOST_LIB_DIAGNOSTIC\n#     pragma message (\"Linking to lib file: \" BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT BOOST_LIB_ARCH_AND_MODEL_OPT BOOST_LIB_SUFFIX)\n#  endif\n#elif defined(BOOST_AUTO_LINK_SYSTEM)\n#  pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) BOOST_LIB_SUFFIX)\n#  ifdef BOOST_LIB_DIAGNOSTIC\n#     pragma message (\"Linking to lib file: \" BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) BOOST_LIB_SUFFIX)\n#  endif\n#elif defined(BOOST_LIB_BUILDID)\n#  pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) \"-\" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT BOOST_LIB_ARCH_AND_MODEL_OPT \"-\" BOOST_LIB_VERSION \"-\" BOOST_STRINGIZE(BOOST_LIB_BUILDID) BOOST_LIB_SUFFIX)\n#  ifdef BOOST_LIB_DIAGNOSTIC\n#     pragma message (\"Linking to lib file: \" BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) \"-\" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT BOOST_LIB_ARCH_AND_MODEL_OPT \"-\" BOOST_LIB_VERSION \"-\" BOOST_STRINGIZE(BOOST_LIB_BUILDID) BOOST_LIB_SUFFIX)\n#  endif\n#else\n#  pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) \"-\" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT BOOST_LIB_ARCH_AND_MODEL_OPT \"-\" BOOST_LIB_VERSION BOOST_LIB_SUFFIX)\n#  ifdef BOOST_LIB_DIAGNOSTIC\n#     pragma message (\"Linking to lib file: \" BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) \"-\" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT BOOST_LIB_ARCH_AND_MODEL_OPT \"-\" BOOST_LIB_VERSION BOOST_LIB_SUFFIX)\n#  endif\n#endif\n\n#else\n#  error \"some required macros where not defined (internal logic error).\"\n#endif\n\n\n#endif // _MSC_VER || __BORLANDC__\n\n//\n// finally undef any macros we may have set:\n//\n#ifdef BOOST_LIB_PREFIX\n#  undef BOOST_LIB_PREFIX\n#endif\n#if defined(BOOST_LIB_NAME)\n#  undef BOOST_LIB_NAME\n#endif\n// Don't undef this one: it can be set by the user and should be the \n// same for all libraries:\n//#if defined(BOOST_LIB_TOOLSET)\n//#  undef BOOST_LIB_TOOLSET\n//#endif\n#if defined(BOOST_LIB_THREAD_OPT)\n#  undef BOOST_LIB_THREAD_OPT\n#endif\n#if defined(BOOST_LIB_RT_OPT)\n#  undef BOOST_LIB_RT_OPT\n#endif\n#if defined(BOOST_LIB_ARCH_AND_MODEL_OPT)\n#  undef BOOST_LIB_ARCH_AND_MODEL_OPT\n#endif\n#if defined(BOOST_LIB_LINK_OPT)\n#  undef BOOST_LIB_LINK_OPT\n#endif\n#if defined(BOOST_LIB_DEBUG_OPT)\n#  undef BOOST_LIB_DEBUG_OPT\n#endif\n#if defined(BOOST_DYN_LINK)\n#  undef BOOST_DYN_LINK\n#endif\n#if defined(BOOST_LIB_SUFFIX)\n#  undef BOOST_LIB_SUFFIX\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/borland.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003.\n//  (C) Copyright David Abrahams 2002 - 2003.\n//  (C) Copyright Aleksey Gurtovoy 2002.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Borland C++ compiler setup:\n\n//\n// versions check:\n// we don't support Borland prior to version 5.4:\n#if __BORLANDC__ < 0x540\n#  error \"Compiler not supported or configured - please reconfigure\"\n#endif\n\n// last known compiler version:\n#if (__BORLANDC__ > 0x613)\n//#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"boost: Unknown compiler version - please run the configure tests and report the results\"\n//#  else\n//#     pragma message( \"boost: Unknown compiler version - please run the configure tests and report the results\")\n//#  endif\n#elif (__BORLANDC__ == 0x600)\n#  error \"CBuilderX preview compiler is no longer supported\"\n#endif\n\n//\n// Support macros to help with standard library detection\n#if (__BORLANDC__ < 0x560) || defined(_USE_OLD_RW_STL)\n#  define BOOST_BCB_WITH_ROGUE_WAVE\n#elif __BORLANDC__ < 0x570\n#  define BOOST_BCB_WITH_STLPORT\n#else\n#  define BOOST_BCB_WITH_DINKUMWARE\n#endif\n\n//\n// Version 5.0 and below:\n#   if __BORLANDC__ <= 0x0550\n// Borland C++Builder 4 and 5:\n#     define BOOST_NO_MEMBER_TEMPLATE_FRIENDS\n#     if __BORLANDC__ == 0x0550\n// Borland C++Builder 5, command-line compiler 5.5:\n#       define BOOST_NO_OPERATORS_IN_NAMESPACE\n#     endif\n// Variadic macros do not exist for C++ Builder versions 5 and below\n#define BOOST_NO_CXX11_VARIADIC_MACROS\n#   endif\n\n// Version 5.51 and below:\n#if (__BORLANDC__ <= 0x551)\n#  define BOOST_NO_CV_SPECIALIZATIONS\n#  define BOOST_NO_CV_VOID_SPECIALIZATIONS\n#  define BOOST_NO_DEDUCED_TYPENAME\n// workaround for missing WCHAR_MAX/WCHAR_MIN:\n#ifdef __cplusplus\n#include <climits>\n#include <cwchar>\n#else\n#include <limits.h>\n#include <wchar.h>\n#endif // __cplusplus\n#ifndef WCHAR_MAX\n#  define WCHAR_MAX 0xffff\n#endif\n#ifndef WCHAR_MIN\n#  define WCHAR_MIN 0\n#endif\n#endif\n\n// Borland C++ Builder 6 and below:\n#if (__BORLANDC__ <= 0x564)\n\n#  if defined(NDEBUG) && defined(__cplusplus)\n      // fix broken <cstring> so that Boost.test works:\n#     include <cstring>\n#     undef strcmp\n#  endif\n   // fix broken errno declaration:\n#  include <errno.h>\n#  ifndef errno\n#     define errno errno\n#  endif\n\n#endif\n\n//\n// new bug in 5.61:\n#if (__BORLANDC__ >= 0x561) && (__BORLANDC__ <= 0x580)\n   // this seems to be needed by the command line compiler, but not the IDE:\n#  define BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS\n#endif\n\n// Borland C++ Builder 2006 Update 2 and below:\n#if (__BORLANDC__ <= 0x582)\n#  define BOOST_NO_SFINAE\n#  define BOOST_BCB_PARTIAL_SPECIALIZATION_BUG\n#  define BOOST_NO_TEMPLATE_TEMPLATES\n\n#  define BOOST_NO_PRIVATE_IN_AGGREGATE\n\n#  ifdef _WIN32\n#     define BOOST_NO_SWPRINTF\n#  elif defined(linux) || defined(__linux__) || defined(__linux)\n      // we should really be able to do without this\n      // but the wcs* functions aren't imported into std::\n#     define BOOST_NO_STDC_NAMESPACE\n      // _CPPUNWIND doesn't get automatically set for some reason:\n#     pragma defineonoption BOOST_CPPUNWIND -x\n#  endif\n#endif\n\n#if (__BORLANDC__ <= 0x613)  // Beman has asked Alisdair for more info\n   // we shouldn't really need this - but too many things choke\n   // without it, this needs more investigation:\n#  define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS\n#  define BOOST_NO_IS_ABSTRACT\n#  define BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS\n#  define BOOST_NO_USING_TEMPLATE\n#  define BOOST_SP_NO_SP_CONVERTIBLE\n\n// Temporary workaround\n#define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n#endif\n\n// Borland C++ Builder 2008 and below:\n#  define BOOST_NO_INTEGRAL_INT64_T\n#  define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL\n#  define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS\n#  define BOOST_NO_MEMBER_TEMPLATE_FRIENDS\n#  define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#  define BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE\n#  define BOOST_NO_NESTED_FRIENDSHIP\n#  define BOOST_NO_TYPENAME_WITH_CTOR\n#if (__BORLANDC__ < 0x600)\n#  define BOOST_ILLEGAL_CV_REFERENCES\n#endif\n\n//\n//  Positive Feature detection\n//\n// Borland C++ Builder 2008 and below:\n#if (__BORLANDC__ >= 0x599)\n#  pragma defineonoption BOOST_CODEGEAR_0X_SUPPORT -Ax\n#endif\n//\n// C++0x Macros:\n//\n#if !defined( BOOST_CODEGEAR_0X_SUPPORT ) || (__BORLANDC__ < 0x610)\n#  define BOOST_NO_CXX11_CHAR16_T\n#  define BOOST_NO_CXX11_CHAR32_T\n#  define BOOST_NO_CXX11_DECLTYPE\n#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#  define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#  define BOOST_NO_CXX11_RVALUE_REFERENCES\n#  define BOOST_NO_CXX11_SCOPED_ENUMS\n#  define BOOST_NO_CXX11_STATIC_ASSERT\n#else\n#  define BOOST_HAS_ALIGNOF\n#  define BOOST_HAS_CHAR16_T\n#  define BOOST_HAS_CHAR32_T\n#  define BOOST_HAS_DECLTYPE\n#  define BOOST_HAS_EXPLICIT_CONVERSION_OPS\n#  define BOOST_HAS_REF_QUALIFIER\n#  define BOOST_HAS_RVALUE_REFS\n#  define BOOST_HAS_STATIC_ASSERT\n#endif\n\n#define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#define BOOST_NO_CXX11_CONSTEXPR\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DEFAULTED_MOVES\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_RVALUE_REFERENCES\n#define BOOST_NO_CXX11_SCOPED_ENUMS\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_CXX11_SFINAE_EXPR\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_UNICODE_LITERALS    // UTF-8 still not supported\n#define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#define BOOST_NO_CXX11_ALIGNAS\n#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#define BOOST_NO_CXX11_INLINE_NAMESPACES\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_FINAL\n#define BOOST_NO_CXX11_OVERRIDE\n#define BOOST_NO_CXX11_THREAD_LOCAL\n#define BOOST_NO_CXX11_UNRESTRICTED_UNION\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n// C++17\n#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606)\n#  define BOOST_NO_CXX17_STRUCTURED_BINDINGS\n#endif\n#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606)\n#  define BOOST_NO_CXX17_INLINE_VARIABLES\n#endif\n#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603)\n#  define BOOST_NO_CXX17_FOLD_EXPRESSIONS\n#endif\n#if !defined(__cpp_if_constexpr) || (__cpp_if_constexpr < 201606)\n#  define BOOST_NO_CXX17_IF_CONSTEXPR\n#endif\n\n#if __BORLANDC__ >= 0x590\n#  define BOOST_HAS_TR1_HASH\n\n#  define BOOST_HAS_MACRO_USE_FACET\n#endif\n\n//\n// Post 0x561 we have long long and stdint.h:\n#if __BORLANDC__ >= 0x561\n#  ifndef __NO_LONG_LONG\n#     define BOOST_HAS_LONG_LONG\n#  else\n#     define BOOST_NO_LONG_LONG\n#  endif\n   // On non-Win32 platforms let the platform config figure this out:\n#  ifdef _WIN32\n#      define BOOST_HAS_STDINT_H\n#  endif\n#endif\n\n// Borland C++Builder 6 defaults to using STLPort.  If _USE_OLD_RW_STL is\n// defined, then we have 0x560 or greater with the Rogue Wave implementation\n// which presumably has the std::DBL_MAX bug.\n#if defined( BOOST_BCB_WITH_ROGUE_WAVE )\n// <climits> is partly broken, some macros define symbols that are really in\n// namespace std, so you end up having to use illegal constructs like\n// std::DBL_MAX, as a fix we'll just include float.h and have done with:\n#include <float.h>\n#endif\n//\n// __int64:\n//\n#if (__BORLANDC__ >= 0x530) && !defined(__STRICT_ANSI__)\n#  define BOOST_HAS_MS_INT64\n#endif\n//\n// check for exception handling support:\n//\n#if !defined(_CPPUNWIND) && !defined(BOOST_CPPUNWIND) && !defined(__EXCEPTIONS) && !defined(BOOST_NO_EXCEPTIONS)\n#  define BOOST_NO_EXCEPTIONS\n#endif\n//\n// all versions have a <dirent.h>:\n//\n#ifndef __STRICT_ANSI__\n#  define BOOST_HAS_DIRENT_H\n#endif\n//\n// all versions support __declspec:\n//\n#if defined(__STRICT_ANSI__)\n// config/platform/win32.hpp will define BOOST_SYMBOL_EXPORT, etc., unless already defined\n#  define BOOST_SYMBOL_EXPORT\n#endif\n//\n// ABI fixing headers:\n//\n#if __BORLANDC__ != 0x600 // not implemented for version 6 compiler yet\n#ifndef BOOST_ABI_PREFIX\n#  define BOOST_ABI_PREFIX \"boost/config/abi/borland_prefix.hpp\"\n#endif\n#ifndef BOOST_ABI_SUFFIX\n#  define BOOST_ABI_SUFFIX \"boost/config/abi/borland_suffix.hpp\"\n#endif\n#endif\n//\n// Disable Win32 support in ANSI mode:\n//\n#if __BORLANDC__ < 0x600\n#  pragma defineonoption BOOST_DISABLE_WIN32 -A\n#elif defined(__STRICT_ANSI__)\n#  define BOOST_DISABLE_WIN32\n#endif\n//\n// MSVC compatibility mode does some nasty things:\n// TODO: look up if this doesn't apply to the whole 12xx range\n//\n#if defined(_MSC_VER) && (_MSC_VER <= 1200)\n#  define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP\n#  define BOOST_NO_VOID_RETURNS\n#endif\n\n// Borland did not implement value-initialization completely, as I reported\n// in 2007, Borland Report 51854, \"Value-initialization: POD struct should be\n// zero-initialized\", http://qc.embarcadero.com/wc/qcmain.aspx?d=51854\n// See also: http://www.boost.org/libs/utility/value_init.htm#compiler_issues\n// (Niels Dekker, LKEB, April 2010)\n#define BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n\n#define BOOST_BORLANDC __BORLANDC__\n#define BOOST_COMPILER \"Classic Borland C++ version \" BOOST_STRINGIZE(__BORLANDC__)\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/clang.hpp",
    "content": "// (C) Copyright Douglas Gregor 2010\n//\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n// Clang compiler setup.\n\n#define BOOST_HAS_PRAGMA_ONCE\n\n// Detecting `-fms-extension` compiler flag assuming that _MSC_VER defined when that flag is used.\n#if defined (_MSC_VER) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 4))\n#   define BOOST_HAS_PRAGMA_DETECT_MISMATCH\n#endif\n\n// When compiling with clang before __has_extension was defined,\n// even if one writes 'defined(__has_extension) && __has_extension(xxx)',\n// clang reports a compiler error. So the only workaround found is:\n\n#ifndef __has_extension\n#define __has_extension __has_feature\n#endif\n\n#ifndef __has_attribute\n#define __has_attribute(x) 0\n#endif\n\n#ifndef __has_cpp_attribute\n#define __has_cpp_attribute(x) 0\n#endif\n\n#if !__has_feature(cxx_exceptions) && !defined(BOOST_NO_EXCEPTIONS)\n#  define BOOST_NO_EXCEPTIONS\n#endif\n\n#if !__has_feature(cxx_rtti) && !defined(BOOST_NO_RTTI)\n#  define BOOST_NO_RTTI\n#endif\n\n#if !__has_feature(cxx_rtti) && !defined(BOOST_NO_TYPEID)\n#  define BOOST_NO_TYPEID\n#endif\n\n#if !__has_feature(cxx_thread_local)\n#  define BOOST_NO_CXX11_THREAD_LOCAL\n#endif\n\n#ifdef __is_identifier\n#if !__is_identifier(__int64) && !defined(__GNUC__)\n#  define BOOST_HAS_MS_INT64\n#endif\n#endif\n\n#if __has_include(<stdint.h>)\n#  define BOOST_HAS_STDINT_H\n#endif\n\n#if (defined(linux) || defined(__linux) || defined(__linux__) || defined(__GNU__) || defined(__GLIBC__)) && !defined(_CRAYC)\n#if (__clang_major__ >= 4) && defined(__has_include)\n#if __has_include(<quadmath.h>)\n#  define BOOST_HAS_FLOAT128\n#endif\n#endif\n#endif\n\n\n#define BOOST_HAS_NRVO\n\n// Branch prediction hints\n#if !defined (__c2__) && defined(__has_builtin)\n#if __has_builtin(__builtin_expect)\n#define BOOST_LIKELY(x) __builtin_expect(x, 1)\n#define BOOST_UNLIKELY(x) __builtin_expect(x, 0)\n#endif\n#endif\n\n// Clang supports \"long long\" in all compilation modes.\n#define BOOST_HAS_LONG_LONG\n\n//\n// We disable this if the compiler is really nvcc with C++03 as it\n// doesn't actually support __int128 as of CUDA_VERSION=7500\n// even though it defines __SIZEOF_INT128__.\n// See https://svn.boost.org/trac/boost/ticket/10418\n//     https://svn.boost.org/trac/boost/ticket/11852\n// Only re-enable this for nvcc if you're absolutely sure\n// of the circumstances under which it's supported.\n// Similarly __SIZEOF_INT128__ is defined when targetting msvc\n// compatibility even though the required support functions are absent.\n//\n#if defined(__CUDACC__)\n#  if defined(BOOST_GCC_CXX11)\n#    define BOOST_NVCC_CXX11\n#  else\n#    define BOOST_NVCC_CXX03\n#  endif\n#endif\n\n#if defined(__SIZEOF_INT128__) && !defined(BOOST_NVCC_CXX03) && !defined(_MSC_VER)\n#  define BOOST_HAS_INT128\n#endif\n\n\n//\n// Dynamic shared object (DSO) and dynamic-link library (DLL) support\n//\n#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__)\n#  define BOOST_HAS_DECLSPEC\n#  define BOOST_SYMBOL_EXPORT __attribute__((__dllexport__))\n#  define BOOST_SYMBOL_IMPORT __attribute__((__dllimport__))\n#else\n#  define BOOST_SYMBOL_EXPORT __attribute__((__visibility__(\"default\")))\n#  define BOOST_SYMBOL_VISIBLE __attribute__((__visibility__(\"default\")))\n#  define BOOST_SYMBOL_IMPORT\n#endif\n\n//\n// The BOOST_FALLTHROUGH macro can be used to annotate implicit fall-through\n// between switch labels.\n//\n#if __cplusplus >= 201103L && defined(__has_warning)\n#  if __has_feature(cxx_attributes) && __has_warning(\"-Wimplicit-fallthrough\")\n#    define BOOST_FALLTHROUGH [[clang::fallthrough]]\n#  endif\n#endif\n\n#if !__has_feature(cxx_auto_type)\n#  define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#endif\n\n//\n// Currently clang on Windows using VC++ RTL does not support C++11's char16_t or char32_t\n//\n#if (defined(_MSC_VER) && (_MSC_VER < 1900)) || !(defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L)\n#  define BOOST_NO_CXX11_CHAR16_T\n#  define BOOST_NO_CXX11_CHAR32_T\n#endif\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1800) && !defined(__GNUC__)\n#define BOOST_HAS_EXPM1\n#define BOOST_HAS_LOG1P\n#endif\n\n#if !__has_feature(cxx_constexpr)\n#  define BOOST_NO_CXX11_CONSTEXPR\n#endif\n\n#if !__has_feature(cxx_decltype)\n#  define BOOST_NO_CXX11_DECLTYPE\n#endif\n\n#if !__has_feature(cxx_decltype_incomplete_return_types)\n#  define BOOST_NO_CXX11_DECLTYPE_N3276\n#endif\n\n#if !__has_feature(cxx_defaulted_functions)\n#  define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#endif\n\n#if !__has_feature(cxx_deleted_functions)\n#  define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#endif\n\n#if !__has_feature(cxx_explicit_conversions)\n#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#endif\n\n#if !__has_feature(cxx_default_function_template_args)\n#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#endif\n\n#if !__has_feature(cxx_generalized_initializers)\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#endif\n\n#if !__has_feature(cxx_lambdas)\n#  define BOOST_NO_CXX11_LAMBDAS\n#endif\n\n#if !__has_feature(cxx_local_type_template_args)\n#  define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#endif\n\n#if !__has_feature(cxx_noexcept)\n#  define BOOST_NO_CXX11_NOEXCEPT\n#endif\n\n#if !__has_feature(cxx_nullptr)\n#  define BOOST_NO_CXX11_NULLPTR\n#endif\n\n#if !__has_feature(cxx_range_for)\n#  define BOOST_NO_CXX11_RANGE_BASED_FOR\n#endif\n\n#if !__has_feature(cxx_raw_string_literals)\n#  define BOOST_NO_CXX11_RAW_LITERALS\n#endif\n\n#if !__has_feature(cxx_reference_qualified_functions)\n#  define BOOST_NO_CXX11_REF_QUALIFIERS\n#endif\n\n#if !__has_feature(cxx_generalized_initializers)\n#  define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#endif\n\n#if !__has_feature(cxx_rvalue_references)\n#  define BOOST_NO_CXX11_RVALUE_REFERENCES\n#endif\n\n#if !__has_feature(cxx_strong_enums)\n#  define BOOST_NO_CXX11_SCOPED_ENUMS\n#endif\n\n#if !__has_feature(cxx_static_assert)\n#  define BOOST_NO_CXX11_STATIC_ASSERT\n#endif\n\n#if !__has_feature(cxx_alias_templates)\n#  define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#endif\n\n#if !__has_feature(cxx_unicode_literals)\n#  define BOOST_NO_CXX11_UNICODE_LITERALS\n#endif\n\n#if !__has_feature(cxx_variadic_templates)\n#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#endif\n\n#if !__has_feature(cxx_user_literals)\n#  define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#endif\n\n#if !__has_feature(cxx_alignas)\n#  define BOOST_NO_CXX11_ALIGNAS\n#endif\n\n#if !__has_feature(cxx_trailing_return)\n#  define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#endif\n\n#if !__has_feature(cxx_inline_namespaces)\n#  define BOOST_NO_CXX11_INLINE_NAMESPACES\n#endif\n\n#if !__has_feature(cxx_override_control)\n#  define BOOST_NO_CXX11_FINAL\n#  define BOOST_NO_CXX11_OVERRIDE\n#endif\n\n#if !__has_feature(cxx_unrestricted_unions)\n#  define BOOST_NO_CXX11_UNRESTRICTED_UNION\n#endif\n\n#if !(__has_feature(__cxx_binary_literals__) || __has_extension(__cxx_binary_literals__))\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n\n#if !__has_feature(__cxx_decltype_auto__)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n\n#if !__has_feature(__cxx_aggregate_nsdmi__)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n\n#if !__has_feature(__cxx_init_captures__)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n\n#if !__has_feature(__cxx_generic_lambdas__)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n\n// clang < 3.5 has a defect with dependent type, like following.\n//\n//  template <class T>\n//  constexpr typename enable_if<pred<T> >::type foo(T &)\n//  { } // error: no return statement in constexpr function\n//\n// This issue also affects C++11 mode, but C++11 constexpr requires return stmt.\n// Therefore we don't care such case.\n//\n// Note that we can't check Clang version directly as the numbering system changes depending who's\n// creating the Clang release (see https://github.com/boostorg/config/pull/39#issuecomment-59927873)\n// so instead verify that we have a feature that was introduced at the same time as working C++14\n// constexpr (generic lambda's in this case):\n//\n#if !__has_feature(__cxx_generic_lambdas__) || !__has_feature(__cxx_relaxed_constexpr__)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n\n#if !__has_feature(__cxx_return_type_deduction__)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n\n#if !__has_feature(__cxx_variable_templates__)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606)\n#  define BOOST_NO_CXX17_STRUCTURED_BINDINGS\n#endif\n\n#if !defined(__cpp_if_constexpr) || (__cpp_if_constexpr < 201606)\n#  define BOOST_NO_CXX17_IF_CONSTEXPR\n#endif\n\n// Clang 3.9+ in c++1z\n#if !__has_cpp_attribute(fallthrough) || __cplusplus < 201406L\n#  define BOOST_NO_CXX17_INLINE_VARIABLES\n#  define BOOST_NO_CXX17_FOLD_EXPRESSIONS\n#endif\n\n#if __cplusplus < 201103L\n#define BOOST_NO_CXX11_SFINAE_EXPR\n#endif\n\n#if __cplusplus < 201400\n// All versions with __cplusplus above this value seem to support this:\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n\n// Unreachable code markup\n#if defined(__has_builtin)\n#if __has_builtin(__builtin_unreachable)\n#define BOOST_UNREACHABLE_RETURN(x) __builtin_unreachable();\n#endif\n#endif\n\n// Deprecated symbol markup\n#if __has_attribute(deprecated)\n#define BOOST_DEPRECATED(msg) __attribute__((deprecated(msg)))\n#endif\n\n#if (__clang_major__ == 3) && (__clang_minor__ == 0)\n// Apparently a clang bug:\n#  define BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS\n#endif\n\n// Clang has supported the 'unused' attribute since the first release.\n#define BOOST_ATTRIBUTE_UNUSED __attribute__((__unused__))\n\n// Type aliasing hint.\n#if __has_attribute(__may_alias__)\n#  define BOOST_MAY_ALIAS __attribute__((__may_alias__))\n#endif\n\n#ifndef BOOST_COMPILER\n#  define BOOST_COMPILER \"Clang version \" __clang_version__\n#endif\n\n// Macro used to identify the Clang compiler.\n#define BOOST_CLANG 1\n\n// BOOST_CLANG_VERSION\n#include <boost/config/compiler/clang_version.hpp>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/clang_version.hpp",
    "content": "// Copyright 2021 Peter Dimov\n// Distributed under the Boost Software License, Version 1.0.\n// https://www.boost.org/LICENSE_1_0.txt)\n\n#if !defined(__APPLE__)\n\n# define BOOST_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__ % 100)\n\n#else\n# define BOOST_CLANG_REPORTED_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__ % 100)\n\n// https://en.wikipedia.org/wiki/Xcode#Toolchain_versions\n\n# if BOOST_CLANG_REPORTED_VERSION >= 140000\n#   define BOOST_CLANG_VERSION 140000\n\n# elif BOOST_CLANG_REPORTED_VERSION >= 130100\n#   define BOOST_CLANG_VERSION 130000\n\n# elif BOOST_CLANG_REPORTED_VERSION >= 130000\n#   define BOOST_CLANG_VERSION 120000\n\n# elif BOOST_CLANG_REPORTED_VERSION >= 120005\n#   define BOOST_CLANG_VERSION 110100\n\n# elif BOOST_CLANG_REPORTED_VERSION >= 120000\n#   define BOOST_CLANG_VERSION 100000\n\n# elif BOOST_CLANG_REPORTED_VERSION >= 110003\n#   define BOOST_CLANG_VERSION 90000\n\n# elif BOOST_CLANG_REPORTED_VERSION >= 110000\n#   define BOOST_CLANG_VERSION 80000\n\n# elif BOOST_CLANG_REPORTED_VERSION >= 100001\n#   define BOOST_CLANG_VERSION 70000\n\n# elif BOOST_CLANG_REPORTED_VERSION >= 100000\n#   define BOOST_CLANG_VERSION 60001\n\n# elif BOOST_CLANG_REPORTED_VERSION >= 90100\n#   define BOOST_CLANG_VERSION 50002\n\n# elif BOOST_CLANG_REPORTED_VERSION >= 90000\n#   define BOOST_CLANG_VERSION 40000\n\n# elif BOOST_CLANG_REPORTED_VERSION >= 80000\n#   define BOOST_CLANG_VERSION 30900\n\n# elif BOOST_CLANG_REPORTED_VERSION >= 70300\n#   define BOOST_CLANG_VERSION 30800\n\n# elif BOOST_CLANG_REPORTED_VERSION >= 70000\n#   define BOOST_CLANG_VERSION 30700\n\n# elif BOOST_CLANG_REPORTED_VERSION >= 60100\n#   define BOOST_CLANG_VERSION 30600\n\n# elif BOOST_CLANG_REPORTED_VERSION >= 60000\n#   define BOOST_CLANG_VERSION 30500\n\n# elif BOOST_CLANG_REPORTED_VERSION >= 50100\n#   define BOOST_CLANG_VERSION 30400\n\n# elif BOOST_CLANG_REPORTED_VERSION >= 50000\n#   define BOOST_CLANG_VERSION 30300\n\n# elif BOOST_CLANG_REPORTED_VERSION >= 40200\n#   define BOOST_CLANG_VERSION 30200\n\n# elif BOOST_CLANG_REPORTED_VERSION >= 30100\n#   define BOOST_CLANG_VERSION 30100\n\n# elif BOOST_CLANG_REPORTED_VERSION >= 20100\n#   define BOOST_CLANG_VERSION 30000\n\n# else\n#   define BOOST_CLANG_VERSION 20900\n\n# endif\n\n# undef BOOST_CLANG_REPORTED_VERSION\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/codegear.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003.\n//  (C) Copyright David Abrahams 2002 - 2003.\n//  (C) Copyright Aleksey Gurtovoy 2002.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  CodeGear C++ compiler setup:\n\n//\n// versions check:\n// last known and checked version is 0x740\n#if (__CODEGEARC__ > 0x740)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"boost: Unknown compiler version - please run the configure tests and report the results\"\n#  else\n#     pragma message( \"boost: Unknown compiler version - please run the configure tests and report the results\")\n#  endif\n#endif\n\n#ifdef __clang__ // Clang enhanced Windows compiler\n\n#  include \"clang.hpp\"\n#  define BOOST_NO_CXX11_THREAD_LOCAL\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n\n// This bug has been reported to Embarcadero\n\n#if defined(BOOST_HAS_INT128)\n#undef BOOST_HAS_INT128\n#endif\n#if defined(BOOST_HAS_FLOAT128)\n#undef BOOST_HAS_FLOAT128\n#endif\n\n// The clang-based compilers can not do 128 atomic exchanges\n\n#define BOOST_ATOMIC_NO_CMPXCHG16B\n\n// 32 functions are missing from the current RTL in cwchar, so it really can not be used even if it exists\n\n#  define BOOST_NO_CWCHAR\n\n#  ifndef __MT__  /* If compiling in single-threaded mode, assume there is no CXX11_HDR_ATOMIC */\n#    define BOOST_NO_CXX11_HDR_ATOMIC\n#  endif\n\n/* temporarily disable this until we can link against fegetround fesetround feholdexcept */\n\n#define BOOST_NO_FENV_H\n\n/* Reported this bug to Embarcadero with the latest C++ Builder Rio release */\n\n#define BOOST_NO_CXX11_HDR_EXCEPTION\n\n//\n// check for exception handling support:\n//\n#if !defined(_CPPUNWIND) && !defined(__EXCEPTIONS) && !defined(BOOST_NO_EXCEPTIONS)\n#  define BOOST_NO_EXCEPTIONS\n#endif\n\n/*\n\n// On non-Win32 platforms let the platform config figure this out:\n#ifdef _WIN32\n#  define BOOST_HAS_STDINT_H\n#endif\n\n//\n// __int64:\n//\n#if !defined(__STRICT_ANSI__)\n#  define BOOST_HAS_MS_INT64\n#endif\n//\n// all versions have a <dirent.h>:\n//\n#if !defined(__STRICT_ANSI__)\n#  define BOOST_HAS_DIRENT_H\n#endif\n//\n// Disable Win32 support in ANSI mode:\n//\n#  pragma defineonoption BOOST_DISABLE_WIN32 -A\n//\n// MSVC compatibility mode does some nasty things:\n// TODO: look up if this doesn't apply to the whole 12xx range\n//\n#if defined(_MSC_VER) && (_MSC_VER <= 1200)\n#  define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP\n#  define BOOST_NO_VOID_RETURNS\n#endif\n//\n\n*/\n\n// Specific settings for Embarcadero drivers\n#  define BOOST_EMBTC          __CODEGEARC__\n#  define BOOST_EMBTC_FULL_VER ((__clang_major__      << 16) | \\\n                                (__clang_minor__      <<  8) | \\\n                                 __clang_patchlevel__         )\n\n// Detecting which Embarcadero driver is being used\n#if defined(BOOST_EMBTC)\n#  if defined(_WIN64)\n#    define BOOST_EMBTC_WIN64 1\n#    define BOOST_EMBTC_WINDOWS 1\n#    ifndef BOOST_USE_WINDOWS_H\n#      define BOOST_USE_WINDOWS_H\n#    endif\n#  elif defined(_WIN32)\n#    define BOOST_EMBTC_WIN32C 1\n#    define BOOST_EMBTC_WINDOWS 1\n#    ifndef BOOST_USE_WINDOWS_H\n#      define BOOST_USE_WINDOWS_H\n#    endif\n#  elif defined(__APPLE__) && defined(__arm__)\n#    define BOOST_EMBTC_IOSARM 1\n#    define BOOST_EMBTC_IOS 1\n#  elif defined(__APPLE__) && defined(__aarch64__)\n#    define BOOST_EMBTC_IOSARM64 1\n#    define BOOST_EMBTC_IOS 1\n#  elif defined(__ANDROID__) && defined(__arm__)\n#    define BOOST_EMBTC_AARM 1\n#    define BOOST_EMBTC_ANDROID 1\n#  elif\n#    if defined(BOOST_ASSERT_CONFIG)\n#       error \"Unknown Embarcadero driver\"\n#    else\n#       warning \"Unknown Embarcadero driver\"\n#    endif /* defined(BOOST_ASSERT_CONFIG) */\n#  endif\n#endif /* defined(BOOST_EMBTC) */\n\n#if defined(BOOST_EMBTC_WINDOWS)\n\n#if !defined(_chdir)\n#define _chdir(x) chdir(x)\n#endif\n\n#if !defined(_dup2)\n#define _dup2(x,y) dup2(x,y)\n#endif\n\n#endif\n\n#  undef BOOST_COMPILER\n#  define BOOST_COMPILER \"Embarcadero-Clang C++ version \" BOOST_STRINGIZE(__CODEGEARC__) \" clang: \" __clang_version__\n// #  define __CODEGEARC_CLANG__ __CODEGEARC__\n// #  define __EMBARCADERO_CLANG__ __CODEGEARC__\n// #  define __BORLANDC_CLANG__ __BORLANDC__\n\n#else // #if !defined(__clang__)\n\n# define BOOST_CODEGEARC  __CODEGEARC__\n# define BOOST_BORLANDC   __BORLANDC__\n\n#if !defined( BOOST_WITH_CODEGEAR_WARNINGS )\n// these warnings occur frequently in optimized template code\n# pragma warn -8004 // var assigned value, but never used\n# pragma warn -8008 // condition always true/false\n# pragma warn -8066 // dead code can never execute\n# pragma warn -8104 // static members with ctors not threadsafe\n# pragma warn -8105 // reference member in class without ctors\n#endif\n\n// CodeGear C++ Builder 2009\n#if (__CODEGEARC__ <= 0x613)\n#  define BOOST_NO_INTEGRAL_INT64_T\n#  define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS\n#  define BOOST_NO_PRIVATE_IN_AGGREGATE\n#  define BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE\n   // we shouldn't really need this - but too many things choke\n   // without it, this needs more investigation:\n#  define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS\n#  define BOOST_SP_NO_SP_CONVERTIBLE\n#endif\n\n// CodeGear C++ Builder 2010\n#if (__CODEGEARC__ <= 0x621)\n#  define BOOST_NO_TYPENAME_WITH_CTOR    // Cannot use typename keyword when making temporaries of a dependant type\n#  define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL\n#  define BOOST_NO_MEMBER_TEMPLATE_FRIENDS\n#  define BOOST_NO_NESTED_FRIENDSHIP     // TC1 gives nested classes access rights as any other member\n#  define BOOST_NO_USING_TEMPLATE\n#  define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n// Temporary hack, until specific MPL preprocessed headers are generated\n#  define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n\n// CodeGear has not yet completely implemented value-initialization, for\n// example for array types, as I reported in 2010: Embarcadero Report 83751,\n// \"Value-initialization: arrays should have each element value-initialized\",\n// http://qc.embarcadero.com/wc/qcmain.aspx?d=83751\n// Last checked version: Embarcadero C++ 6.21\n// See also: http://www.boost.org/libs/utility/value_init.htm#compiler_issues\n// (Niels Dekker, LKEB, April 2010)\n#  define BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n\n#  if defined(NDEBUG) && defined(__cplusplus)\n      // fix broken <cstring> so that Boost.test works:\n#     include <cstring>\n#     undef strcmp\n#  endif\n   // fix broken errno declaration:\n#  include <errno.h>\n#  ifndef errno\n#     define errno errno\n#  endif\n\n#endif\n\n// Reportedly, #pragma once is supported since C++ Builder 2010\n#if (__CODEGEARC__ >= 0x620)\n#  define BOOST_HAS_PRAGMA_ONCE\n#endif\n\n#define BOOST_NO_FENV_H\n\n//\n// C++0x macros:\n//\n#if (__CODEGEARC__ <= 0x620)\n#define BOOST_NO_CXX11_STATIC_ASSERT\n#else\n#define BOOST_HAS_STATIC_ASSERT\n#endif\n#define BOOST_HAS_CHAR16_T\n#define BOOST_HAS_CHAR32_T\n#define BOOST_HAS_LONG_LONG\n// #define BOOST_HAS_ALIGNOF\n#define BOOST_HAS_DECLTYPE\n#define BOOST_HAS_EXPLICIT_CONVERSION_OPS\n// #define BOOST_HAS_RVALUE_REFS\n#define BOOST_HAS_SCOPED_ENUM\n// #define BOOST_HAS_STATIC_ASSERT\n#define BOOST_HAS_STD_TYPE_TRAITS\n\n#define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#define BOOST_NO_CXX11_CONSTEXPR\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_RVALUE_REFERENCES\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_CXX11_SFINAE_EXPR\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_UNICODE_LITERALS\n#define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#define BOOST_NO_CXX11_ALIGNAS\n#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#define BOOST_NO_CXX11_INLINE_NAMESPACES\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_FINAL\n#define BOOST_NO_CXX11_OVERRIDE\n#define BOOST_NO_CXX11_THREAD_LOCAL\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n#define BOOST_NO_CXX11_UNRESTRICTED_UNION\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n// C++17\n#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606)\n#  define BOOST_NO_CXX17_STRUCTURED_BINDINGS\n#endif\n\n#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606)\n#  define BOOST_NO_CXX17_INLINE_VARIABLES\n#endif\n\n#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603)\n#  define BOOST_NO_CXX17_FOLD_EXPRESSIONS\n#endif\n\n#if !defined(__cpp_if_constexpr) || (__cpp_if_constexpr < 201606)\n#  define BOOST_NO_CXX17_IF_CONSTEXPR\n#endif\n\n//\n// TR1 macros:\n//\n#define BOOST_HAS_TR1_HASH\n#define BOOST_HAS_TR1_TYPE_TRAITS\n#define BOOST_HAS_TR1_UNORDERED_MAP\n#define BOOST_HAS_TR1_UNORDERED_SET\n\n#define BOOST_HAS_MACRO_USE_FACET\n\n#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n\n// On non-Win32 platforms let the platform config figure this out:\n#ifdef _WIN32\n#  define BOOST_HAS_STDINT_H\n#endif\n\n//\n// __int64:\n//\n#if !defined(__STRICT_ANSI__)\n#  define BOOST_HAS_MS_INT64\n#endif\n//\n// check for exception handling support:\n//\n#if !defined(_CPPUNWIND) && !defined(BOOST_CPPUNWIND) && !defined(__EXCEPTIONS) && !defined(BOOST_NO_EXCEPTIONS)\n#  define BOOST_NO_EXCEPTIONS\n#endif\n//\n// all versions have a <dirent.h>:\n//\n#if !defined(__STRICT_ANSI__)\n#  define BOOST_HAS_DIRENT_H\n#endif\n//\n// all versions support __declspec:\n//\n#if defined(__STRICT_ANSI__)\n// config/platform/win32.hpp will define BOOST_SYMBOL_EXPORT, etc., unless already defined\n#  define BOOST_SYMBOL_EXPORT\n#endif\n//\n// ABI fixing headers:\n//\n#ifndef BOOST_ABI_PREFIX\n#  define BOOST_ABI_PREFIX \"boost/config/abi/borland_prefix.hpp\"\n#endif\n#ifndef BOOST_ABI_SUFFIX\n#  define BOOST_ABI_SUFFIX \"boost/config/abi/borland_suffix.hpp\"\n#endif\n//\n// Disable Win32 support in ANSI mode:\n//\n#  pragma defineonoption BOOST_DISABLE_WIN32 -A\n//\n// MSVC compatibility mode does some nasty things:\n// TODO: look up if this doesn't apply to the whole 12xx range\n//\n#if defined(_MSC_VER) && (_MSC_VER <= 1200)\n#  define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP\n#  define BOOST_NO_VOID_RETURNS\n#endif\n\n#define BOOST_COMPILER \"CodeGear C++ version \" BOOST_STRINGIZE(__CODEGEARC__)\n\n#endif // #if !defined(__clang__)\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/comeau.hpp",
    "content": "//  (C) Copyright John Maddock 2001. \n//  (C) Copyright Douglas Gregor 2001. \n//  (C) Copyright Peter Dimov 2001. \n//  (C) Copyright Aleksey Gurtovoy 2003. \n//  (C) Copyright Beman Dawes 2003. \n//  (C) Copyright Jens Maurer 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Comeau C++ compiler setup:\n\n#include <boost/config/compiler/common_edg.hpp>\n\n#if (__COMO_VERSION__ <= 4245)\n\n#  if defined(_MSC_VER) && _MSC_VER <= 1300\n#     if _MSC_VER > 100\n         // only set this in non-strict mode:\n#        define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP\n#     endif\n#  endif\n\n// Void returns don't work when emulating VC 6 (Peter Dimov)\n// TODO: look up if this doesn't apply to the whole 12xx range\n#  if defined(_MSC_VER) && (_MSC_VER < 1300)\n#     define BOOST_NO_VOID_RETURNS\n#  endif\n\n#endif  // version 4245\n\n//\n// enable __int64 support in VC emulation mode\n//\n#  if defined(_MSC_VER) && (_MSC_VER >= 1200)\n#     define BOOST_HAS_MS_INT64\n#  endif\n\n#define BOOST_COMPILER \"Comeau compiler version \" BOOST_STRINGIZE(__COMO_VERSION__)\n\n//\n// versions check:\n// we don't know Comeau prior to version 4245:\n#if __COMO_VERSION__ < 4245\n#  error \"Compiler not configured - please reconfigure\"\n#endif\n//\n// last known and checked version is 4245:\n#if (__COMO_VERSION__ > 4245)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"boost: Unknown compiler version - please run the configure tests and report the results\"\n#  endif\n#endif\n\n\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/common_edg.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2002.\n//  (C) Copyright Jens Maurer 2001.\n//  (C) Copyright David Abrahams 2002.\n//  (C) Copyright Aleksey Gurtovoy 2002.\n//  (C) Copyright Markus Schoepflin 2005.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//\n// Options common to all edg based compilers.\n//\n// This is included from within the individual compiler mini-configs.\n\n#ifndef  __EDG_VERSION__\n#  error This file requires that __EDG_VERSION__ be defined.\n#endif\n\n#if (__EDG_VERSION__ <= 238)\n#   define BOOST_NO_INTEGRAL_INT64_T\n#   define BOOST_NO_SFINAE\n#endif\n\n#if (__EDG_VERSION__ <= 240)\n#   define BOOST_NO_VOID_RETURNS\n#endif\n\n#if (__EDG_VERSION__ <= 241) && !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)\n#   define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP\n#endif\n\n#if (__EDG_VERSION__ <= 244) && !defined(BOOST_NO_TEMPLATE_TEMPLATES)\n#   define BOOST_NO_TEMPLATE_TEMPLATES\n#endif\n\n#if (__EDG_VERSION__ < 300) && !defined(BOOST_NO_IS_ABSTRACT)\n#   define BOOST_NO_IS_ABSTRACT\n#endif\n\n#if (__EDG_VERSION__ <= 303) && !defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL)\n#   define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL\n#endif\n\n// See also kai.hpp which checks a Kai-specific symbol for EH\n# if !defined(__KCC) && !defined(__EXCEPTIONS) && !defined(BOOST_NO_EXCEPTIONS)\n#     define BOOST_NO_EXCEPTIONS\n# endif\n\n# if !defined(__NO_LONG_LONG)\n#     define BOOST_HAS_LONG_LONG\n# else\n#     define BOOST_NO_LONG_LONG\n# endif\n\n// Not sure what version was the first to support #pragma once, but\n// different EDG-based compilers (e.g. Intel) supported it for ages.\n// Add a proper version check if it causes problems.\n#define BOOST_HAS_PRAGMA_ONCE\n\n//\n// C++0x features\n//\n//   See above for BOOST_NO_LONG_LONG\n//\n#if (__EDG_VERSION__ < 310)\n#  define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#endif\n#if (__EDG_VERSION__ <= 310)\n// No support for initializer lists\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#endif\n#if (__EDG_VERSION__ < 400)\n#  define BOOST_NO_CXX11_VARIADIC_MACROS\n#endif\n\n#define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RVALUE_REFERENCES\n#define BOOST_NO_CXX11_SCOPED_ENUMS\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_CXX11_SFINAE_EXPR\n#define BOOST_NO_CXX11_STATIC_ASSERT\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#define BOOST_NO_CXX11_ALIGNAS\n#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#define BOOST_NO_CXX11_INLINE_NAMESPACES\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_FINAL\n#define BOOST_NO_CXX11_OVERRIDE\n#define BOOST_NO_CXX11_THREAD_LOCAL\n#define BOOST_NO_CXX11_UNRESTRICTED_UNION\n\n//__cpp_decltype 200707 possibly?\n#define BOOST_NO_CXX11_DECLTYPE\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n\n#if !defined(__cpp_unicode_characters) || (__cpp_unicode_characters < 200704)\n#   define BOOST_NO_CXX11_CHAR16_T\n#   define BOOST_NO_CXX11_CHAR32_T\n#endif\n#if !defined(__cpp_unicode_literals) || (__cpp_unicode_literals < 200710)\n#   define BOOST_NO_CXX11_UNICODE_LITERALS\n#endif\n#if !defined(__cpp_user_defined_literals) || (__cpp_user_defined_literals < 200809)\n#   define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#endif\n#if !defined(__cpp_variadic_templates) || (__cpp_variadic_templates < 200704)\n#   define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 200907)\n#   define BOOST_NO_CXX11_CONSTEXPR\n#endif\n#if !defined(__cpp_lambdas) || (__cpp_lambdas < 200907)\n#   define BOOST_NO_CXX11_LAMBDAS\n#endif\n#if !defined(__cpp_range_based_for) || (__cpp_range_based_for < 200710)\n#   define BOOST_NO_CXX11_RANGE_BASED_FOR\n#endif\n#if !defined(__cpp_raw_strings) || (__cpp_raw_strings < 200610)\n#   define BOOST_NO_CXX11_RAW_LITERALS\n#endif\n\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n// C++17\n#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606)\n#  define BOOST_NO_CXX17_STRUCTURED_BINDINGS\n#endif\n#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606)\n#  define BOOST_NO_CXX17_INLINE_VARIABLES\n#endif\n#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603)\n#  define BOOST_NO_CXX17_FOLD_EXPRESSIONS\n#endif\n\n#if !defined(__cpp_if_constexpr) || (__cpp_if_constexpr < 201606)\n#  define BOOST_NO_CXX17_IF_CONSTEXPR\n#endif\n\n#ifdef c_plusplus\n// EDG has \"long long\" in non-strict mode\n// However, some libraries have insufficient \"long long\" support\n// #define BOOST_HAS_LONG_LONG\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/compaq_cxx.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Tru64 C++ compiler setup (now HP):\n\n#define BOOST_COMPILER \"HP Tru64 C++ \" BOOST_STRINGIZE(__DECCXX_VER)\n\n#include <boost/config/compiler/common_edg.hpp>\n\n//\n// versions check:\n// Nothing to do here?\n\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/cray.hpp",
    "content": "//  Copyright 2011 John Maddock\n//  Copyright 2013, 2017-2018 Cray, Inc.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n// Cray C++ compiler setup.\n//\n// There are a few parameters that affect the macros defined in this file:\n//\n// - What version of CCE (Cray Compiling Environment) are we running? This\n//   comes from the '_RELEASE_MAJOR', '_RELEASE_MINOR', and\n//   '_RELEASE_PATCHLEVEL' macros.\n// - What C++ standards conformance level are we using (e.g. '-h\n//   std=c++14')? This comes from the '__cplusplus' macro.\n// - Are we using GCC extensions ('-h gnu' or '-h nognu')? If we have '-h\n//   gnu' then CCE emulates GCC, and the macros '__GNUC__',\n//   '__GNUC_MINOR__', and '__GNUC_PATCHLEVEL__' are defined.\n//\n// This file is organized as follows:\n//\n// - Verify that the combination of parameters listed above is supported.\n//   If we have an unsupported combination, we abort with '#error'.\n// - Establish baseline values for all Boost macros.\n// - Apply changes to the baseline macros based on compiler version. These\n//   changes are cummulative so each version section only describes the\n//   changes since the previous version.\n//   - Within each version section, we may also apply changes based on\n//     other parameters (i.e. C++ standards conformance level and GCC\n//     extensions).\n//\n// To test changes to this file:\n//\n// ```\n// module load cce/8.6.5 # Pick the version you want to test.\n// cd boost/libs/config/test/all\n// b2 -j 8 toolset=cray cxxstd=03 cxxstd=11 cxxstd=14 cxxstd-dialect=gnu linkflags=-lrt\n// ```\n// Note: Using 'cxxstd-dialect=iso' is not supported at this time (the\n// tests run, but many tests fail).\n//\n// Note: 'linkflags=-lrt' is needed in Cray Linux Environment. Otherwise\n// you get an 'undefined reference to clock_gettime' error.\n//\n// Note: If a test '*_fail.cpp' file compiles, but fails to run, then it is\n// reported as a defect. However, this is not actually a defect. This is an\n// area where the test system is somewhat broken. Tests that are failing\n// because of this problem are noted in the comments.\n//\n// Pay attention to the macro definitions for the macros you wish to\n// modify. For example, only macros categorized as compiler macros should\n// appear in this file; platform macros should not appear in this file.\n// Also, some macros have to be defined to specific values; it is not\n// always enough to define or undefine a macro.\n//\n// Macro definitions are available in the source code at:\n//\n// `boost/libs/config/doc/html/boost_config/boost_macro_reference.html`\n//\n// Macro definitions are also available online at:\n//\n// http://www.boost.org/doc/libs/master/libs/config/doc/html/boost_config/boost_macro_reference.html\n//\n// Typically, if you enable a feature, and the tests pass, then you have\n// nothing to worry about. However, it's sometimes hard to figure out if a\n// disabled feature needs to stay disabled. To get a list of disabled\n// features, run 'b2' in 'boost/libs/config/checks'. These are the macros\n// you should pay attention to (in addition to macros that cause test\n// failures).\n\n////\n//// Front matter\n////\n\n// In a developer build of the Cray compiler (i.e. a compiler built by a\n// Cray employee), the release patch level is reported as \"x\". This gives\n// versions that look like e.g. \"8.6.x\".\n//\n// To accomplish this, the the Cray compiler preprocessor inserts:\n//\n// #define _RELEASE_PATCHLEVEL x\n//\n// If we are using a developer build of the compiler, we want to use the\n// configuration macros for the most recent patch level of the release. To\n// accomplish this, we'll pretend that _RELEASE_PATCHLEVEL is 99.\n//\n// However, it's difficult to detect if _RELEASE_PATCHLEVEL is x. We must\n// consider that the x will be expanded if x is defined as a macro\n// elsewhere. For example, imagine if someone put \"-D x=3\" on the command\n// line, and _RELEASE_PATCHLEVEL is x. Then _RELEASE_PATCHLEVEL would\n// expand to 3, and we could not distinguish it from an actual\n// _RELEASE_PATCHLEVEL of 3. This problem only affects developer builds; in\n// production builds, _RELEASE_PATCHLEVEL is always an integer.\n//\n// IMPORTANT: In developer builds, if x is defined as a macro, you will get\n// an incorrect configuration. The behavior in this case is undefined.\n//\n// Even if x is not defined, we have to use some trickery to detect if\n// _RELEASE_PATCHLEVEL is x. First we define BOOST_CRAY_x to some arbitrary\n// magic value, 9867657. Then we use BOOST_CRAY_APPEND to append the\n// expanded value of _RELEASE_PATCHLEVEL to the string \"BOOST_CRAY_\".\n//\n// - If _RELEASE_PATCHLEVEL is undefined, we get \"BOOST_CRAY_\".\n// - If _RELEASE_PATCHLEVEL is 5, we get \"BOOST_CRAY_5\".\n// - If _RELEASE_PATCHLEVEL is x (and x is not defined) we get\n//   \"BOOST_CRAY_x\":\n//\n// Then we check if BOOST_CRAY_x is equal to the output of\n// BOOST_CRAY_APPEND. In other words, the output of BOOST_CRAY_APPEND is\n// treated as a macro name, and expanded again. If we can safely assume\n// that BOOST_CRAY_ is not a macro defined as our magic number, and\n// BOOST_CRAY_5 is not a macro defined as our magic number, then the only\n// way the equality test can pass is if _RELEASE_PATCHLEVEL expands to x.\n//\n// So, that is how we detect if we are using a developer build of the Cray\n// compiler.\n\n#define BOOST_CRAY_x 9867657 // Arbitrary number\n#define BOOST_CRAY_APPEND(MACRO) BOOST_CRAY_APPEND_INTERNAL(MACRO)\n#define BOOST_CRAY_APPEND_INTERNAL(MACRO) BOOST_CRAY_##MACRO\n\n#if BOOST_CRAY_x == BOOST_CRAY_APPEND(_RELEASE_PATCHLEVEL)\n\n    // This is a developer build.\n    //\n    // - _RELEASE_PATCHLEVEL is defined as x, and x is not defined as a macro.\n\n    // Pretend _RELEASE_PATCHLEVEL is 99, so we get the configuration for the\n    // most recent patch level in this release.\n\n    #define BOOST_CRAY_VERSION (_RELEASE_MAJOR * 10000 + _RELEASE_MINOR * 100 + 99)\n\n#else\n\n    // This is a production build.\n    //\n    // _RELEASE_PATCHLEVEL is not defined as x, or x is defined as a macro.\n\n    #define BOOST_CRAY_VERSION (_RELEASE_MAJOR * 10000 + _RELEASE_MINOR * 100 + _RELEASE_PATCHLEVEL)\n\n#endif // BOOST_CRAY_x == BOOST_CRAY_APPEND(_RELEASE_PATCHLEVEL)\n\n#undef BOOST_CRAY_APPEND_INTERNAL\n#undef BOOST_CRAY_APPEND\n#undef BOOST_CRAY_x\n\n\n#ifdef __GNUC__\n#   define BOOST_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)\n#endif\n\n#ifndef BOOST_COMPILER\n#   define BOOST_COMPILER \"Cray C++ version \" BOOST_STRINGIZE(_RELEASE_MAJOR) \".\" BOOST_STRINGIZE(_RELEASE_MINOR) \".\" BOOST_STRINGIZE(_RELEASE_PATCHLEVEL)\n#endif\n\n// Since the Cray compiler defines '__GNUC__', we have to emulate some\n// additional GCC macros in order to make everything work.\n//\n// FIXME: Perhaps Cray should fix the compiler to define these additional\n// macros for GCC emulation?\n\n#if __cplusplus >= 201103L && defined(__GNUC__) && !defined(__GXX_EXPERIMENTAL_CXX0X__)\n#   define __GXX_EXPERIMENTAL_CXX0X__ 1\n#endif\n\n////\n//// Parameter validation\n////\n\n// FIXME: Do we really need to support compilers before 8.5? Do they pass\n// the Boost.Config tests?\n\n#if BOOST_CRAY_VERSION < 80000\n#  error \"Boost is not configured for Cray compilers prior to version 8, please try the configure script.\"\n#endif\n\n// We only support recent EDG based compilers.\n\n#ifndef __EDG__\n#  error \"Unsupported Cray compiler, please try running the configure script.\"\n#endif\n\n////\n//// Baseline values\n////\n\n#include <boost/config/compiler/common_edg.hpp>\n\n#define BOOST_HAS_NRVO\n#define BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n#define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#define BOOST_NO_CXX11_CHAR16_T\n#define BOOST_NO_CXX11_CHAR32_T\n#define BOOST_NO_CXX11_CONSTEXPR\n#define BOOST_NO_CXX11_DECLTYPE\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#define BOOST_NO_CXX11_FINAL\n#define BOOST_NO_CXX11_OVERRIDE\n#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_RVALUE_REFERENCES\n#define BOOST_NO_CXX11_SCOPED_ENUMS\n#define BOOST_NO_CXX11_SFINAE_EXPR\n#define BOOST_NO_CXX11_STATIC_ASSERT\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_THREAD_LOCAL\n#define BOOST_NO_CXX11_UNICODE_LITERALS\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#define BOOST_NO_CXX11_VARIADIC_MACROS\n#define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#define BOOST_NO_CXX11_UNRESTRICTED_UNION\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n\n//#define BOOST_BCB_PARTIAL_SPECIALIZATION_BUG\n#define BOOST_MATH_DISABLE_STD_FPCLASSIFY\n//#define BOOST_HAS_FPCLASSIFY\n\n#define BOOST_SP_USE_PTHREADS \n#define BOOST_AC_USE_PTHREADS \n\n//\n// Everything that follows is working around what are thought to be\n// compiler shortcomings. Revist all of these regularly.\n//\n\n//#define BOOST_USE_ENUM_STATIC_ASSERT\n//#define BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS //(this may be implied by the previous #define\n\n// These constants should be provided by the compiler.\n\n#ifndef __ATOMIC_RELAXED\n#define __ATOMIC_RELAXED 0\n#define __ATOMIC_CONSUME 1\n#define __ATOMIC_ACQUIRE 2\n#define __ATOMIC_RELEASE 3\n#define __ATOMIC_ACQ_REL 4\n#define __ATOMIC_SEQ_CST 5\n#endif\n\n////\n//// Version changes\n////\n\n//\n// 8.5.0\n//\n\n#if BOOST_CRAY_VERSION >= 80500\n\n#if __cplusplus >= 201103L\n\n#undef BOOST_HAS_NRVO\n#undef BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n#undef BOOST_NO_CXX11_AUTO_DECLARATIONS\n#undef BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#undef BOOST_NO_CXX11_CHAR16_T\n#undef BOOST_NO_CXX11_CHAR32_T\n#undef BOOST_NO_CXX11_CONSTEXPR\n#undef BOOST_NO_CXX11_DECLTYPE\n#undef BOOST_NO_CXX11_DECLTYPE_N3276\n#undef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#undef BOOST_NO_CXX11_DELETED_FUNCTIONS\n#undef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#undef BOOST_NO_CXX11_FINAL\n#undef BOOST_NO_CXX11_OVERRIDE\n#undef BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#undef BOOST_NO_CXX11_LAMBDAS\n#undef BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#undef BOOST_NO_CXX11_NOEXCEPT\n#undef BOOST_NO_CXX11_NULLPTR\n#undef BOOST_NO_CXX11_RANGE_BASED_FOR\n#undef BOOST_NO_CXX11_RAW_LITERALS\n#undef BOOST_NO_CXX11_REF_QUALIFIERS\n#undef BOOST_NO_CXX11_RVALUE_REFERENCES\n#undef BOOST_NO_CXX11_SCOPED_ENUMS\n#undef BOOST_NO_CXX11_SFINAE_EXPR\n#undef BOOST_NO_CXX11_STATIC_ASSERT\n#undef BOOST_NO_CXX11_TEMPLATE_ALIASES\n#undef BOOST_NO_CXX11_THREAD_LOCAL\n#undef BOOST_NO_CXX11_UNICODE_LITERALS\n#undef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#undef BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#undef BOOST_NO_CXX11_VARIADIC_MACROS\n#undef BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#undef BOOST_NO_CXX11_UNRESTRICTED_UNION\n#undef BOOST_NO_SFINAE_EXPR\n#undef BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#undef BOOST_MATH_DISABLE_STD_FPCLASSIFY\n#undef BOOST_SP_USE_PTHREADS \n#undef BOOST_AC_USE_PTHREADS \n\n#define BOOST_HAS_VARIADIC_TMPL\n#define BOOST_HAS_UNISTD_H\n#define BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG\n#define BOOST_HAS_TR1_COMPLEX_OVERLOADS\n#define BOOST_HAS_STDINT_H\n#define BOOST_HAS_STATIC_ASSERT\n#define BOOST_HAS_SIGACTION\n#define BOOST_HAS_SCHED_YIELD\n#define BOOST_HAS_RVALUE_REFS\n#define BOOST_HAS_PTHREADS\n#define BOOST_HAS_PTHREAD_YIELD\n#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#define BOOST_HAS_PARTIAL_STD_ALLOCATOR\n#define BOOST_HAS_NRVO\n#define BOOST_HAS_NL_TYPES_H\n#define BOOST_HAS_NANOSLEEP\n#define BOOST_NO_CXX11_SMART_PTR\n#define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#define BOOST_NO_CXX14_CONSTEXPR\n#define BOOST_HAS_LONG_LONG\n#define BOOST_HAS_FLOAT128\n\n#if __cplusplus < 201402L\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n#endif // __cplusplus < 201402L\n\n#endif // __cplusplus >= 201103L\n\n#endif // BOOST_CRAY_VERSION >= 80500\n\n//\n// 8.6.4\n// (versions prior to 8.6.5 do not define _RELEASE_PATCHLEVEL)\n//\n\n#if BOOST_CRAY_VERSION >= 80600\n\n#if __cplusplus >= 199711L\n#define BOOST_HAS_FLOAT128\n#define BOOST_HAS_PTHREAD_YIELD // This is a platform macro, but it improves test results.\n#define BOOST_NO_COMPLETE_VALUE_INITIALIZATION // This is correct. Test compiles, but fails to run.\n#undef  BOOST_NO_CXX11_CHAR16_T\n#undef  BOOST_NO_CXX11_CHAR32_T\n#undef  BOOST_NO_CXX11_INLINE_NAMESPACES\n#undef  BOOST_NO_CXX11_FINAL\n#undef BOOST_NO_CXX11_OVERRIDE\n#undef  BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS\n#undef  BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#define BOOST_NO_CXX11_SFINAE_EXPR // This is correct, even though '*_fail.cpp' test fails.\n#undef  BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#undef  BOOST_NO_CXX11_VARIADIC_MACROS\n#undef  BOOST_NO_CXX11_VARIADIC_TEMPLATES\n// 'BOOST_NO_DEDUCED_TYPENAME' test is broken. The test files are enabled /\n// disabled with an '#ifdef BOOST_DEDUCED_TYPENAME'. However,\n// 'boost/libs/config/include/boost/config/detail/suffix.hpp' ensures that\n// 'BOOST_DEDUCED_TYPENAME' is always defined (the value it is defined as\n// depends on 'BOOST_NO_DEDUCED_TYPENAME'). So, modifying\n// 'BOOST_NO_DEDUCED_TYPENAME' has no effect on which tests are run.\n//\n// The 'no_ded_typename_pass.cpp' test should always compile and run\n// successfully, because 'BOOST_DEDUCED_TYPENAME' must always have an\n// appropriate value (it's not just something that you turn on or off).\n// Therefore, if you wish to test changes to 'BOOST_NO_DEDUCED_TYPENAME',\n// you have to modify 'no_ded_typename_pass.cpp' to unconditionally include\n// 'boost_no_ded_typename.ipp'.\n#undef  BOOST_NO_DEDUCED_TYPENAME // This is correct. Test is broken.\n#undef  BOOST_NO_SFINAE_EXPR\n#undef  BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#endif // __cplusplus >= 199711L\n\n#if __cplusplus >= 201103L\n#undef  BOOST_NO_CXX11_ALIGNAS\n#undef  BOOST_NO_CXX11_DECLTYPE_N3276\n#define BOOST_NO_CXX11_HDR_ATOMIC\n#undef  BOOST_NO_CXX11_HDR_FUNCTIONAL\n#define BOOST_NO_CXX11_HDR_REGEX // This is correct. Test compiles, but fails to run.\n#undef  BOOST_NO_CXX11_SFINAE_EXPR\n#undef  BOOST_NO_CXX11_SMART_PTR\n#undef  BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#endif // __cplusplus >= 201103L\n\n#if __cplusplus >= 201402L\n#undef  BOOST_NO_CXX14_CONSTEXPR\n#define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif // __cplusplus == 201402L\n\n#endif // BOOST_CRAY_VERSION >= 80600\n\n//\n// 8.6.5\n// (no change from 8.6.4)\n//\n\n//\n// 8.7.0\n//\n\n#if BOOST_CRAY_VERSION >= 80700\n\n#if __cplusplus >= 199711L\n#endif // __cplusplus >= 199711L\n\n#if __cplusplus >= 201103L\n#undef  BOOST_NO_CXX11_HDR_ATOMIC\n#undef  BOOST_NO_CXX11_HDR_REGEX\n#endif // __cplusplus >= 201103L\n\n#if __cplusplus >= 201402L\n#endif // __cplusplus == 201402L\n\n#endif // BOOST_CRAY_VERSION >= 80700\n\n//\n// Next release\n//\n\n#if BOOST_CRAY_VERSION > 80799\n\n#if __cplusplus >= 199711L\n#endif // __cplusplus >= 199711L\n\n#if __cplusplus >= 201103L\n#endif // __cplusplus >= 201103L\n\n#if __cplusplus >= 201402L\n#endif // __cplusplus == 201402L\n\n#endif // BOOST_CRAY_VERSION > 80799\n\n////\n//// Remove temporary macros\n////\n\n// I've commented out some '#undef' statements to signify that we purposely\n// want to keep certain macros.\n\n//#undef __GXX_EXPERIMENTAL_CXX0X__\n//#undef BOOST_COMPILER\n#undef BOOST_GCC_VERSION\n#undef BOOST_CRAY_VERSION\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/diab.hpp",
    "content": "//  (C) Copyright Brian Kuhl 2016.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n// Check this is a recent EDG based compiler, otherwise we don't support it here:\n\n\n#ifndef __EDG_VERSION__\n#     error \"Unknown Diab compiler version - please run the configure tests and report the results\"\n#endif\n\n#include \"boost/config/compiler/common_edg.hpp\"\n\n#define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#define BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS\n\n#define BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE\n#define BOOST_LOG_NO_MEMBER_TEMPLATE_FRIENDS\n#define BOOST_REGEX_NO_EXTERNAL_TEMPLATES\n\n#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#define BOOST_NO_CXX11_HDR_CODECVT\n#define BOOST_NO_CXX11_NUMERIC_LIMITS \n\n#define BOOST_COMPILER \"Wind River Diab \" BOOST_STRINGIZE(__VERSION_NUMBER__)\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/digitalmars.hpp",
    "content": "//  Copyright (C) Christof Meerwald 2003\n//  Copyright (C) Dan Watkins 2003\n//\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  Digital Mars C++ compiler setup:\n#define BOOST_COMPILER __DMC_VERSION_STRING__\n\n#define BOOST_HAS_LONG_LONG\n#define BOOST_HAS_PRAGMA_ONCE\n\n#if !defined(BOOST_STRICT_CONFIG)\n#define BOOST_NO_MEMBER_TEMPLATE_FRIENDS\n#define BOOST_NO_OPERATORS_IN_NAMESPACE\n#define BOOST_NO_UNREACHABLE_RETURN_DETECTION\n#define BOOST_NO_SFINAE\n#define BOOST_NO_USING_TEMPLATE\n#define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL\n#endif\n\n//\n// has macros:\n#define BOOST_HAS_DIRENT_H\n#define BOOST_HAS_STDINT_H\n#define BOOST_HAS_WINTHREADS\n\n#if (__DMC__ >= 0x847)\n#define BOOST_HAS_EXPM1\n#define BOOST_HAS_LOG1P\n#endif\n\n//\n// Is this really the best way to detect whether the std lib is in namespace std?\n//\n#ifdef __cplusplus\n#include <cstddef>\n#endif\n#if !defined(__STL_IMPORT_VENDOR_CSTD) && !defined(_STLP_IMPORT_VENDOR_CSTD)\n#  define BOOST_NO_STDC_NAMESPACE\n#endif\n\n\n// check for exception handling support:\n#if !defined(_CPPUNWIND) && !defined(BOOST_NO_EXCEPTIONS)\n#  define BOOST_NO_EXCEPTIONS\n#endif\n\n//\n// C++0x features\n//\n#define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#define BOOST_NO_CXX11_CHAR16_T\n#define BOOST_NO_CXX11_CHAR32_T\n#define BOOST_NO_CXX11_CONSTEXPR\n#define BOOST_NO_CXX11_DECLTYPE\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_RVALUE_REFERENCES\n#define BOOST_NO_CXX11_SCOPED_ENUMS\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_CXX11_SFINAE_EXPR\n#define BOOST_NO_CXX11_STATIC_ASSERT\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_UNICODE_LITERALS\n#define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#define BOOST_NO_CXX11_ALIGNAS\n#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#define BOOST_NO_CXX11_INLINE_NAMESPACES\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_FINAL\n#define BOOST_NO_CXX11_OVERRIDE\n#define BOOST_NO_CXX11_THREAD_LOCAL\n#define BOOST_NO_CXX11_UNRESTRICTED_UNION\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n// C++17\n#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606)\n#  define BOOST_NO_CXX17_STRUCTURED_BINDINGS\n#endif\n#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606)\n#  define BOOST_NO_CXX17_INLINE_VARIABLES\n#endif\n#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603)\n#  define BOOST_NO_CXX17_FOLD_EXPRESSIONS\n#endif\n#if !defined(__cpp_if_constexpr) || (__cpp_if_constexpr < 201606)\n#  define BOOST_NO_CXX17_IF_CONSTEXPR\n#endif\n\n#if (__DMC__ <= 0x840)\n#error \"Compiler not supported or configured - please reconfigure\"\n#endif\n//\n// last known and checked version is ...:\n#if (__DMC__ > 0x848)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"boost: Unknown compiler version - please run the configure tests and report the results\"\n#  endif\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/gcc.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003.\n//  (C) Copyright Darin Adler 2001 - 2002.\n//  (C) Copyright Jens Maurer 2001 - 2002.\n//  (C) Copyright Beman Dawes 2001 - 2003.\n//  (C) Copyright Douglas Gregor 2002.\n//  (C) Copyright David Abrahams 2002 - 2003.\n//  (C) Copyright Synge Todo 2003.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  GNU C++ compiler setup.\n\n//\n// Define BOOST_GCC so we know this is \"real\" GCC and not some pretender:\n//\n#define BOOST_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)\n#if !defined(__CUDACC__)\n#define BOOST_GCC BOOST_GCC_VERSION\n#endif\n\n#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L)\n#  define BOOST_GCC_CXX11\n#endif\n\n#if __GNUC__ == 3\n#  if defined (__PATHSCALE__)\n#     define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#     define BOOST_NO_IS_ABSTRACT\n#  endif\n\n#  if __GNUC_MINOR__ < 4\n#     define BOOST_NO_IS_ABSTRACT\n#  endif\n#  define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#endif\n#if __GNUC__ < 4\n//\n// All problems to gcc-3.x and earlier here:\n//\n#define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#  ifdef __OPEN64__\n#     define BOOST_NO_IS_ABSTRACT\n#  endif\n#endif\n\n// GCC prior to 3.4 had #pragma once too but it didn't work well with filesystem links\n#if BOOST_GCC_VERSION >= 30400\n#define BOOST_HAS_PRAGMA_ONCE\n#endif\n\n#if BOOST_GCC_VERSION < 40400\n// Previous versions of GCC did not completely implement value-initialization:\n// GCC Bug 30111, \"Value-initialization of POD base class doesn't initialize\n// members\", reported by Jonathan Wakely in 2006,\n// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30111 (fixed for GCC 4.4)\n// GCC Bug 33916, \"Default constructor fails to initialize array members\",\n// reported by Michael Elizabeth Chastain in 2007,\n// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33916 (fixed for GCC 4.2.4)\n// See also: http://www.boost.org/libs/utility/value_init.htm#compiler_issues\n#define BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n#endif\n\n#if !defined(__EXCEPTIONS) && !defined(BOOST_NO_EXCEPTIONS)\n# define BOOST_NO_EXCEPTIONS\n#endif\n\n\n//\n// Threading support: Turn this on unconditionally here (except for\n// those platforms where we can know for sure). It will get turned off again\n// later if no threading API is detected.\n//\n#if !defined(__MINGW32__) && !defined(linux) && !defined(__linux) && !defined(__linux__)\n# define BOOST_HAS_THREADS\n#endif\n\n//\n// gcc has \"long long\"\n// Except on Darwin with standard compliance enabled (-pedantic)\n// Apple gcc helpfully defines this macro we can query\n//\n#if !defined(__DARWIN_NO_LONG_LONG)\n# define BOOST_HAS_LONG_LONG\n#endif\n\n//\n// gcc implements the named return value optimization since version 3.1\n//\n#define BOOST_HAS_NRVO\n\n// Branch prediction hints\n#define BOOST_LIKELY(x) __builtin_expect(x, 1)\n#define BOOST_UNLIKELY(x) __builtin_expect(x, 0)\n\n//\n// Dynamic shared object (DSO) and dynamic-link library (DLL) support\n//\n#if __GNUC__ >= 4\n#  if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__)\n     // All Win32 development environments, including 64-bit Windows and MinGW, define\n     // _WIN32 or one of its variant spellings. Note that Cygwin is a POSIX environment,\n     // so does not define _WIN32 or its variants, but still supports dllexport/dllimport.\n#    define BOOST_HAS_DECLSPEC\n#    define BOOST_SYMBOL_EXPORT __attribute__((__dllexport__))\n#    define BOOST_SYMBOL_IMPORT __attribute__((__dllimport__))\n#  else\n#    define BOOST_SYMBOL_EXPORT __attribute__((__visibility__(\"default\")))\n#    define BOOST_SYMBOL_IMPORT\n#  endif\n#  define BOOST_SYMBOL_VISIBLE __attribute__((__visibility__(\"default\")))\n#else\n// config/platform/win32.hpp will define BOOST_SYMBOL_EXPORT, etc., unless already defined\n#  define BOOST_SYMBOL_EXPORT\n#endif\n\n//\n// RTTI and typeinfo detection is possible post gcc-4.3:\n//\n#if BOOST_GCC_VERSION > 40300\n#  ifndef __GXX_RTTI\n#     ifndef BOOST_NO_TYPEID\n#        define BOOST_NO_TYPEID\n#     endif\n#     ifndef BOOST_NO_RTTI\n#        define BOOST_NO_RTTI\n#     endif\n#  endif\n#endif\n\n//\n// Recent GCC versions have __int128 when in 64-bit mode.\n//\n// We disable this if the compiler is really nvcc with C++03 as it\n// doesn't actually support __int128 as of CUDA_VERSION=7500\n// even though it defines __SIZEOF_INT128__.\n// See https://svn.boost.org/trac/boost/ticket/8048\n//     https://svn.boost.org/trac/boost/ticket/11852\n// Only re-enable this for nvcc if you're absolutely sure\n// of the circumstances under which it's supported:\n//\n#if defined(__CUDACC__)\n#  if defined(BOOST_GCC_CXX11)\n#    define BOOST_NVCC_CXX11\n#  else\n#    define BOOST_NVCC_CXX03\n#  endif\n#endif\n\n#if defined(__SIZEOF_INT128__) && !defined(BOOST_NVCC_CXX03)\n#  define BOOST_HAS_INT128\n#endif\n//\n// Recent GCC versions have a __float128 native type, we need to\n// include a std lib header to detect this - not ideal, but we'll\n// be including <cstddef> later anyway when we select the std lib.\n//\n// Nevertheless, as of CUDA 7.5, using __float128 with the host\n// compiler in pre-C++11 mode is still not supported.\n// See https://svn.boost.org/trac/boost/ticket/11852\n//\n#ifdef __cplusplus\n#include <cstddef>\n#else\n#include <stddef.h>\n#endif\n#if defined(_GLIBCXX_USE_FLOAT128) && !defined(__STRICT_ANSI__) && !defined(BOOST_NVCC_CXX03)\n# define BOOST_HAS_FLOAT128\n#endif\n\n// C++0x features in 4.3.n and later\n//\n#if (BOOST_GCC_VERSION >= 40300) && defined(BOOST_GCC_CXX11)\n// C++0x features are only enabled when -std=c++0x or -std=gnu++0x are\n// passed on the command line, which in turn defines\n// __GXX_EXPERIMENTAL_CXX0X__.\n#  define BOOST_HAS_DECLTYPE\n#  define BOOST_HAS_RVALUE_REFS\n#  define BOOST_HAS_STATIC_ASSERT\n#  define BOOST_HAS_VARIADIC_TMPL\n#else\n#  define BOOST_NO_CXX11_DECLTYPE\n#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#  define BOOST_NO_CXX11_RVALUE_REFERENCES\n#  define BOOST_NO_CXX11_STATIC_ASSERT\n#endif\n\n// C++0x features in 4.4.n and later\n//\n#if (BOOST_GCC_VERSION < 40400) || !defined(BOOST_GCC_CXX11)\n#  define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#  define BOOST_NO_CXX11_CHAR16_T\n#  define BOOST_NO_CXX11_CHAR32_T\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#  define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#  define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#  define BOOST_NO_CXX11_INLINE_NAMESPACES\n#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#endif\n\n#if BOOST_GCC_VERSION < 40500\n#  define BOOST_NO_SFINAE_EXPR\n#endif\n\n// GCC 4.5 forbids declaration of defaulted functions in private or protected sections\n#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ == 5) || !defined(BOOST_GCC_CXX11)\n#  define BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS\n#endif\n\n// C++0x features in 4.5.0 and later\n//\n#if (BOOST_GCC_VERSION < 40500) || !defined(BOOST_GCC_CXX11)\n#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#  define BOOST_NO_CXX11_LAMBDAS\n#  define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#  define BOOST_NO_CXX11_RAW_LITERALS\n#  define BOOST_NO_CXX11_UNICODE_LITERALS\n#endif\n\n// C++0x features in 4.5.1 and later\n//\n#if (BOOST_GCC_VERSION < 40501) || !defined(BOOST_GCC_CXX11)\n// scoped enums have a serious bug in 4.4.0, so define BOOST_NO_CXX11_SCOPED_ENUMS before 4.5.1\n// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38064\n#  define BOOST_NO_CXX11_SCOPED_ENUMS\n#endif\n\n// C++0x features in 4.6.n and later\n//\n#if (BOOST_GCC_VERSION < 40600) || !defined(BOOST_GCC_CXX11)\n#define BOOST_NO_CXX11_DEFAULTED_MOVES\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#endif\n\n// C++0x features in 4.7.n and later\n//\n#if (BOOST_GCC_VERSION < 40700) || !defined(BOOST_GCC_CXX11)\n// Note that while constexpr is partly supported in gcc-4.6 it's a \n// pre-std version with several bugs:\n#  define BOOST_NO_CXX11_CONSTEXPR\n#  define BOOST_NO_CXX11_FINAL\n#  define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#  define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#  define BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS\n#  define BOOST_NO_CXX11_OVERRIDE\n#endif\n\n// C++0x features in 4.8.n and later\n//\n#if (BOOST_GCC_VERSION < 40800) || !defined(BOOST_GCC_CXX11)\n#  define BOOST_NO_CXX11_THREAD_LOCAL\n#  define BOOST_NO_CXX11_SFINAE_EXPR\n#endif\n\n// C++0x features in 4.8.1 and later\n//\n#if (BOOST_GCC_VERSION < 40801) || !defined(BOOST_GCC_CXX11)\n#  define BOOST_NO_CXX11_DECLTYPE_N3276\n#  define BOOST_NO_CXX11_REF_QUALIFIERS\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n\n// C++0x features in 4.9.n and later\n//\n#if (BOOST_GCC_VERSION < 40900) || !defined(BOOST_GCC_CXX11)\n// Although alignas support is added in gcc 4.8, it does not accept\n// dependent constant expressions as an argument until gcc 4.9.\n#  define BOOST_NO_CXX11_ALIGNAS\n#endif\n\n// C++0x features in 5.1 and later\n//\n#if (BOOST_GCC_VERSION < 50100) || !defined(BOOST_GCC_CXX11)\n#  define BOOST_NO_CXX11_UNRESTRICTED_UNION\n#endif\n\n// C++14 features in 4.9.0 and later\n//\n#if (BOOST_GCC_VERSION < 40900) || (__cplusplus < 201300)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#  if !((BOOST_GCC_VERSION >= 40801) && (BOOST_GCC_VERSION < 40900) && defined(BOOST_GCC_CXX11))\n#     define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#  endif\n#endif\n\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if (BOOST_GCC_VERSION < 50200) || !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n// C++17\n#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606)\n#  define BOOST_NO_CXX17_STRUCTURED_BINDINGS\n#endif\n#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606)\n#  define BOOST_NO_CXX17_INLINE_VARIABLES\n#endif\n#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603)\n#  define BOOST_NO_CXX17_FOLD_EXPRESSIONS\n#endif\n#if !defined(__cpp_if_constexpr) || (__cpp_if_constexpr < 201606)\n#  define BOOST_NO_CXX17_IF_CONSTEXPR\n#endif\n\n#if __GNUC__ >= 7\n#  define BOOST_FALLTHROUGH __attribute__((fallthrough))\n#endif\n\n#if (__GNUC__ < 11) && defined(__MINGW32__) && !defined(__MINGW64__)\n// thread_local was broken on mingw for all 32bit compiler releases prior to 11.x, see\n// https://sourceforge.net/p/mingw-w64/bugs/527/\n// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83562\n// Not setting this causes program termination on thread exit.\n#define BOOST_NO_CXX11_THREAD_LOCAL\n#endif\n\n//\n// Unused attribute:\n#if __GNUC__ >= 4\n#  define BOOST_ATTRIBUTE_UNUSED __attribute__((__unused__))\n#endif\n\n// Type aliasing hint. Supported since gcc 3.3.\n#define BOOST_MAY_ALIAS __attribute__((__may_alias__))\n\n// Unreachable code markup\n#if BOOST_GCC_VERSION >= 40500\n#define BOOST_UNREACHABLE_RETURN(x) __builtin_unreachable();\n#endif\n\n// Deprecated symbol markup\n#if BOOST_GCC_VERSION >= 40500\n#define BOOST_DEPRECATED(msg) __attribute__((deprecated(msg)))\n#else\n#define BOOST_DEPRECATED(msg) __attribute__((deprecated))\n#endif\n\n#ifndef BOOST_COMPILER\n#  define BOOST_COMPILER \"GNU C++ version \" __VERSION__\n#endif\n\n// ConceptGCC compiler:\n//   http://www.generic-programming.org/software/ConceptGCC/\n#ifdef __GXX_CONCEPTS__\n#  define BOOST_HAS_CONCEPTS\n#  define BOOST_COMPILER \"ConceptGCC version \" __VERSION__\n#endif\n\n// versions check:\n// we don't know gcc prior to version 3.30:\n#if (BOOST_GCC_VERSION < 30300)\n#  error \"Compiler not configured - please reconfigure\"\n#endif\n//\n// last known and checked version is 8.1:\n#if (BOOST_GCC_VERSION > 80100)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"Boost.Config is older than your compiler - please check for an updated Boost release.\"\n#  else\n// we don't emit warnings here anymore since there are no defect macros defined for\n// gcc post 3.4, so any failures are gcc regressions...\n//#     warning \"boost: Unknown compiler version - please run the configure tests and report the results\"\n#  endif\n#endif\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/gcc_xml.hpp",
    "content": "//  (C) Copyright John Maddock 2006.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  GCC-XML C++ compiler setup:\n\n#  if !defined(__GCCXML_GNUC__) || ((__GCCXML_GNUC__ <= 3) && (__GCCXML_GNUC_MINOR__ <= 3))\n#     define BOOST_NO_IS_ABSTRACT\n#  endif\n\n//\n// Threading support: Turn this on unconditionally here (except for\n// those platforms where we can know for sure). It will get turned off again\n// later if no threading API is detected.\n//\n#if !defined(__MINGW32__) && !defined(_MSC_VER) && !defined(linux) && !defined(__linux) && !defined(__linux__)\n# define BOOST_HAS_THREADS\n#endif\n\n//\n// gcc has \"long long\"\n//\n#define BOOST_HAS_LONG_LONG\n\n// C++0x features:\n//\n#  define BOOST_NO_CXX11_CONSTEXPR\n#  define BOOST_NO_CXX11_NULLPTR\n#  define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#  define BOOST_NO_CXX11_DECLTYPE\n#  define BOOST_NO_CXX11_DECLTYPE_N3276\n#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#  define BOOST_NO_CXX11_RVALUE_REFERENCES\n#  define BOOST_NO_CXX11_STATIC_ASSERT\n#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#  define BOOST_NO_CXX11_VARIADIC_MACROS\n#  define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#  define BOOST_NO_CXX11_CHAR16_T\n#  define BOOST_NO_CXX11_CHAR32_T\n#  define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#  define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_SCOPED_ENUMS\n#  define BOOST_NO_SFINAE_EXPR\n#  define BOOST_NO_CXX11_SFINAE_EXPR\n#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#  define BOOST_NO_CXX11_LAMBDAS\n#  define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#  define BOOST_NO_CXX11_RANGE_BASED_FOR\n#  define BOOST_NO_CXX11_RAW_LITERALS\n#  define BOOST_NO_CXX11_UNICODE_LITERALS\n#  define BOOST_NO_CXX11_NOEXCEPT\n#  define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#  define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#  define BOOST_NO_CXX11_ALIGNAS\n#  define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#  define BOOST_NO_CXX11_INLINE_NAMESPACES\n#  define BOOST_NO_CXX11_REF_QUALIFIERS\n#  define BOOST_NO_CXX11_FINAL\n#  define BOOST_NO_CXX11_OVERRIDE\n#  define BOOST_NO_CXX11_THREAD_LOCAL\n#  define BOOST_NO_CXX11_UNRESTRICTED_UNION\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n// C++17\n#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606)\n#  define BOOST_NO_CXX17_STRUCTURED_BINDINGS\n#endif\n#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606)\n#  define BOOST_NO_CXX17_INLINE_VARIABLES\n#endif\n#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603)\n#  define BOOST_NO_CXX17_FOLD_EXPRESSIONS\n#endif\n#if !defined(__cpp_if_constexpr) || (__cpp_if_constexpr < 201606)\n#  define BOOST_NO_CXX17_IF_CONSTEXPR\n#endif\n\n#define BOOST_COMPILER \"GCC-XML C++ version \" __GCCXML__\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/greenhills.hpp",
    "content": "//  (C) Copyright John Maddock 2001. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Greenhills C++ compiler setup:\n\n#define BOOST_COMPILER \"Greenhills C++ version \" BOOST_STRINGIZE(__ghs)\n\n#include <boost/config/compiler/common_edg.hpp>\n\n//\n// versions check:\n// we don't support Greenhills prior to version 0:\n#if __ghs < 0\n#  error \"Compiler not supported or configured - please reconfigure\"\n#endif\n//\n// last known and checked version is 0:\n#if (__ghs > 0)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"boost: Unknown compiler version - please run the configure tests and report the results\"\n#  endif\n#endif\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/hp_acc.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003.\n//  (C) Copyright Jens Maurer 2001 - 2003.\n//  (C) Copyright Aleksey Gurtovoy 2002.\n//  (C) Copyright David Abrahams 2002 - 2003.\n//  (C) Copyright Toon Knapen 2003.\n//  (C) Copyright Boris Gubenko 2006 - 2007.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  HP aCC C++ compiler setup:\n\n#if defined(__EDG__)\n#include <boost/config/compiler/common_edg.hpp>\n#endif\n\n#if (__HP_aCC <= 33100)\n#    define BOOST_NO_INTEGRAL_INT64_T\n#    define BOOST_NO_OPERATORS_IN_NAMESPACE\n#  if !defined(_NAMESPACE_STD)\n#     define BOOST_NO_STD_LOCALE\n#     define BOOST_NO_STRINGSTREAM\n#  endif\n#endif\n\n#if (__HP_aCC <= 33300)\n// member templates are sufficiently broken that we disable them for now\n#    define BOOST_NO_MEMBER_TEMPLATES\n#    define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS\n#    define BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE\n#endif\n\n#if (__HP_aCC <= 38000)\n#  define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#endif\n\n#if (__HP_aCC > 50000) && (__HP_aCC < 60000)\n#    define BOOST_NO_UNREACHABLE_RETURN_DETECTION\n#    define BOOST_NO_TEMPLATE_TEMPLATES\n#    define BOOST_NO_SWPRINTF\n#    define BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS\n#    define BOOST_NO_IS_ABSTRACT\n#    define BOOST_NO_MEMBER_TEMPLATE_FRIENDS\n#endif\n\n// optional features rather than defects:\n#if (__HP_aCC >= 33900)\n#    define BOOST_HAS_LONG_LONG\n#    define BOOST_HAS_PARTIAL_STD_ALLOCATOR\n#endif\n\n#if (__HP_aCC >= 50000 ) && (__HP_aCC <= 53800 ) || (__HP_aCC < 31300 )\n#    define BOOST_NO_MEMBER_TEMPLATE_KEYWORD\n#endif\n\n// This macro should not be defined when compiling in strict ansi\n// mode, but, currently, we don't have the ability to determine\n// what standard mode we are compiling with. Some future version\n// of aCC6 compiler will provide predefined macros reflecting the\n// compilation options, including the standard mode.\n#if (__HP_aCC >= 60000) || ((__HP_aCC > 38000) && defined(__hpxstd98))\n#    define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#endif\n\n#define BOOST_COMPILER \"HP aCC version \" BOOST_STRINGIZE(__HP_aCC)\n\n//\n// versions check:\n// we don't support HP aCC prior to version 33000:\n#if __HP_aCC < 33000\n#  error \"Compiler not supported or configured - please reconfigure\"\n#endif\n\n//\n// Extended checks for supporting aCC on PA-RISC\n#if __HP_aCC > 30000 && __HP_aCC < 50000\n#  if __HP_aCC < 38000\n      // versions prior to version A.03.80 not supported\n#     error \"Compiler version not supported - version A.03.80 or higher is required\"\n#  elif !defined(__hpxstd98)\n      // must compile using the option +hpxstd98 with version A.03.80 and above\n#     error \"Compiler option '+hpxstd98' is required for proper support\"\n#  endif //PA-RISC\n#endif\n\n//\n// C++0x features\n//\n//   See boost\\config\\suffix.hpp for BOOST_NO_LONG_LONG\n//\n#if !defined(__EDG__)\n\n#define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#define BOOST_NO_CXX11_CHAR16_T\n#define BOOST_NO_CXX11_CHAR32_T\n#define BOOST_NO_CXX11_CONSTEXPR\n#define BOOST_NO_CXX11_DECLTYPE\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_RVALUE_REFERENCES\n#define BOOST_NO_CXX11_SCOPED_ENUMS\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_CXX11_SFINAE_EXPR\n#define BOOST_NO_CXX11_STATIC_ASSERT\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_UNICODE_LITERALS\n#define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#define BOOST_NO_CXX11_ALIGNAS\n#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#define BOOST_NO_CXX11_INLINE_NAMESPACES\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_THREAD_LOCAL\n#define BOOST_NO_CXX11_UNRESTRICTED_UNION\n\n/*\n  See https://forums13.itrc.hp.com/service/forums/questionanswer.do?threadId=1443331 and\n      https://forums13.itrc.hp.com/service/forums/questionanswer.do?threadId=1443436\n*/\n\n#if (__HP_aCC < 62500) || !defined(HP_CXX0x_SOURCE)\n  #define BOOST_NO_CXX11_VARIADIC_MACROS\n#endif\n\n#endif\n\n//\n// last known and checked version for HP-UX/ia64 is 61300\n// last known and checked version for PA-RISC is 38000\n#if ((__HP_aCC > 61300) || ((__HP_aCC > 38000) && defined(__hpxstd98)))\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"boost: Unknown compiler version - please run the configure tests and report the results\"\n#  endif\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/intel.hpp",
    "content": "//  (C) Copyright John Maddock 2001-8.\n//  (C) Copyright Peter Dimov 2001.\n//  (C) Copyright Jens Maurer 2001.\n//  (C) Copyright David Abrahams 2002 - 2003.\n//  (C) Copyright Aleksey Gurtovoy 2002 - 2003.\n//  (C) Copyright Guillaume Melquiond 2002 - 2003.\n//  (C) Copyright Beman Dawes 2003.\n//  (C) Copyright Martin Wille 2003.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Intel compiler setup:\n\n#if defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1500) && (defined(_MSC_VER) || defined(__GNUC__))\n\n#ifdef _MSC_VER\n\n#include <boost/config/compiler/visualc.hpp>\n\n#undef BOOST_MSVC\n#undef BOOST_MSVC_FULL_VER\n\n#if (__INTEL_COMPILER >= 1500) && (_MSC_VER >= 1900)\n//\n// These appear to be supported, even though VC++ may not support them:\n//\n#define BOOST_HAS_EXPM1\n#define BOOST_HAS_LOG1P\n#undef BOOST_NO_CXX14_BINARY_LITERALS\n// This one may be a little risky to enable??\n#undef BOOST_NO_SFINAE_EXPR\n\n#endif\n\n#if (__INTEL_COMPILER <= 1600) && !defined(BOOST_NO_CXX14_VARIABLE_TEMPLATES)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n#else // defined(_MSC_VER)\n\n#include <boost/config/compiler/gcc.hpp>\n\n#undef BOOST_GCC_VERSION\n#undef BOOST_GCC_CXX11\n#undef BOOST_GCC\n#undef BOOST_FALLTHROUGH\n\n// Broken in all versions up to 17 (newer versions not tested)\n#if (__INTEL_COMPILER <= 1700) && !defined(BOOST_NO_CXX14_CONSTEXPR)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n\n#if (__INTEL_COMPILER >= 1800) && (__cplusplus >= 201703)\n#  define BOOST_FALLTHROUGH [[fallthrough]]\n#endif\n\n#endif // defined(_MSC_VER)\n\n#undef BOOST_COMPILER\n\n#if defined(__INTEL_COMPILER)\n#if __INTEL_COMPILER == 9999\n#  define BOOST_INTEL_CXX_VERSION 1200 // Intel bug in 12.1.\n#else\n#  define BOOST_INTEL_CXX_VERSION __INTEL_COMPILER\n#endif\n#elif defined(__ICL)\n#  define BOOST_INTEL_CXX_VERSION __ICL\n#elif defined(__ICC)\n#  define BOOST_INTEL_CXX_VERSION __ICC\n#elif defined(__ECC)\n#  define BOOST_INTEL_CXX_VERSION __ECC\n#endif\n\n// Flags determined by comparing output of 'icpc -dM -E' with and without '-std=c++0x'\n#if (!(defined(_WIN32) || defined(_WIN64)) && defined(__STDC_HOSTED__) && (__STDC_HOSTED__ && (BOOST_INTEL_CXX_VERSION <= 1200))) || defined(__GXX_EXPERIMENTAL_CPP0X__) || defined(__GXX_EXPERIMENTAL_CXX0X__)\n#  define BOOST_INTEL_STDCXX0X\n#endif\n#if defined(_MSC_VER) && (_MSC_VER >= 1600)\n#  define BOOST_INTEL_STDCXX0X\n#endif\n\n#ifdef __GNUC__\n#  define BOOST_INTEL_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)\n#endif\n\n#if !defined(BOOST_COMPILER)\n#  if defined(BOOST_INTEL_STDCXX0X)\n#    define BOOST_COMPILER \"Intel C++ C++0x mode version \" BOOST_STRINGIZE(BOOST_INTEL_CXX_VERSION)\n#  else\n#    define BOOST_COMPILER \"Intel C++ version \" BOOST_STRINGIZE(BOOST_INTEL_CXX_VERSION)\n#  endif\n#endif\n\n#define BOOST_INTEL BOOST_INTEL_CXX_VERSION\n\n#if defined(_WIN32) || defined(_WIN64)\n#  define BOOST_INTEL_WIN BOOST_INTEL\n#else\n#  define BOOST_INTEL_LINUX BOOST_INTEL\n#endif\n\n#else // defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1500) && (defined(_MSC_VER) || defined(__GNUC__))\n\n#include <boost/config/compiler/common_edg.hpp>\n\n#if defined(__INTEL_COMPILER)\n#if __INTEL_COMPILER == 9999\n#  define BOOST_INTEL_CXX_VERSION 1200 // Intel bug in 12.1.\n#else\n#  define BOOST_INTEL_CXX_VERSION __INTEL_COMPILER\n#endif\n#elif defined(__ICL)\n#  define BOOST_INTEL_CXX_VERSION __ICL\n#elif defined(__ICC)\n#  define BOOST_INTEL_CXX_VERSION __ICC\n#elif defined(__ECC)\n#  define BOOST_INTEL_CXX_VERSION __ECC\n#endif\n\n// Flags determined by comparing output of 'icpc -dM -E' with and without '-std=c++0x'\n#if (!(defined(_WIN32) || defined(_WIN64)) && defined(__STDC_HOSTED__) && (__STDC_HOSTED__ && (BOOST_INTEL_CXX_VERSION <= 1200))) || defined(__GXX_EXPERIMENTAL_CPP0X__) || defined(__GXX_EXPERIMENTAL_CXX0X__)\n#  define BOOST_INTEL_STDCXX0X\n#endif\n#if defined(_MSC_VER) && (_MSC_VER >= 1600)\n#  define BOOST_INTEL_STDCXX0X\n#endif\n\n#ifdef __GNUC__\n#  define BOOST_INTEL_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)\n#endif\n\n#if !defined(BOOST_COMPILER)\n#  if defined(BOOST_INTEL_STDCXX0X)\n#    define BOOST_COMPILER \"Intel C++ C++0x mode version \" BOOST_STRINGIZE(BOOST_INTEL_CXX_VERSION)\n#  else\n#    define BOOST_COMPILER \"Intel C++ version \" BOOST_STRINGIZE(BOOST_INTEL_CXX_VERSION)\n#  endif\n#endif\n\n#define BOOST_INTEL BOOST_INTEL_CXX_VERSION\n\n#if defined(_WIN32) || defined(_WIN64)\n#  define BOOST_INTEL_WIN BOOST_INTEL\n#else\n#  define BOOST_INTEL_LINUX BOOST_INTEL\n#endif\n\n#if (BOOST_INTEL_CXX_VERSION <= 600)\n\n#  if defined(_MSC_VER) && (_MSC_VER <= 1300) // added check for <= VC 7 (Peter Dimov)\n\n// Boost libraries assume strong standard conformance unless otherwise\n// indicated by a config macro. As configured by Intel, the EDG front-end\n// requires certain compiler options be set to achieve that strong conformance.\n// Particularly /Qoption,c,--arg_dep_lookup (reported by Kirk Klobe & Thomas Witt)\n// and /Zc:wchar_t,forScope. See boost-root/tools/build/intel-win32-tools.jam for\n// details as they apply to particular versions of the compiler. When the\n// compiler does not predefine a macro indicating if an option has been set,\n// this config file simply assumes the option has been set.\n// Thus BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP will not be defined, even if\n// the compiler option is not enabled.\n\n#     define BOOST_NO_SWPRINTF\n#  endif\n\n// Void returns, 64 bit integrals don't work when emulating VC 6 (Peter Dimov)\n\n#  if defined(_MSC_VER) && (_MSC_VER <= 1200)\n#     define BOOST_NO_VOID_RETURNS\n#     define BOOST_NO_INTEGRAL_INT64_T\n#  endif\n\n#endif\n\n#if (BOOST_INTEL_CXX_VERSION <= 710) && defined(_WIN32)\n#  define BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS\n#endif\n\n// See http://aspn.activestate.com/ASPN/Mail/Message/boost/1614864\n#if BOOST_INTEL_CXX_VERSION < 600\n#  define BOOST_NO_INTRINSIC_WCHAR_T\n#else\n// We should test the macro _WCHAR_T_DEFINED to check if the compiler\n// supports wchar_t natively. *BUT* there is a problem here: the standard\n// headers define this macro if they typedef wchar_t. Anyway, we're lucky\n// because they define it without a value, while Intel C++ defines it\n// to 1. So we can check its value to see if the macro was defined natively\n// or not.\n// Under UNIX, the situation is exactly the same, but the macro _WCHAR_T\n// is used instead.\n#  if ((_WCHAR_T_DEFINED + 0) == 0) && ((_WCHAR_T + 0) == 0)\n#    define BOOST_NO_INTRINSIC_WCHAR_T\n#  endif\n#endif\n\n#if defined(__GNUC__) && !defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL)\n//\n// Figure out when Intel is emulating this gcc bug\n// (All Intel versions prior to 9.0.26, and versions\n// later than that if they are set up to emulate gcc 3.2\n// or earlier):\n//\n#  if ((__GNUC__ == 3) && (__GNUC_MINOR__ <= 2)) || (BOOST_INTEL < 900) || (__INTEL_COMPILER_BUILD_DATE < 20050912)\n#     define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL\n#  endif\n#endif\n#if (defined(__GNUC__) && (__GNUC__ < 4)) || (defined(_WIN32) && (BOOST_INTEL_CXX_VERSION <= 1200)) || (BOOST_INTEL_CXX_VERSION <= 1200)\n// GCC or VC emulation:\n#define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#endif\n//\n// Verify that we have actually got BOOST_NO_INTRINSIC_WCHAR_T\n// set correctly, if we don't do this now, we will get errors later\n// in type_traits code among other things, getting this correct\n// for the Intel compiler is actually remarkably fragile and tricky:\n//\n#ifdef __cplusplus\n#if defined(BOOST_NO_INTRINSIC_WCHAR_T)\n#include <cwchar>\ntemplate< typename T > struct assert_no_intrinsic_wchar_t;\ntemplate<> struct assert_no_intrinsic_wchar_t<wchar_t> { typedef void type; };\n// if you see an error here then you need to unset BOOST_NO_INTRINSIC_WCHAR_T\n// where it is defined above:\ntypedef assert_no_intrinsic_wchar_t<unsigned short>::type assert_no_intrinsic_wchar_t_;\n#else\ntemplate< typename T > struct assert_intrinsic_wchar_t;\ntemplate<> struct assert_intrinsic_wchar_t<wchar_t> {};\n// if you see an error here then define BOOST_NO_INTRINSIC_WCHAR_T on the command line:\ntemplate<> struct assert_intrinsic_wchar_t<unsigned short> {};\n#endif\n#endif\n\n#if defined(_MSC_VER) && (_MSC_VER+0 >= 1000)\n#  if _MSC_VER >= 1200\n#     define BOOST_HAS_MS_INT64\n#  endif\n#  define BOOST_NO_SWPRINTF\n#  define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#elif defined(_WIN32)\n#  define BOOST_DISABLE_WIN32\n#endif\n\n// I checked version 6.0 build 020312Z, it implements the NRVO.\n// Correct this as you find out which version of the compiler\n// implemented the NRVO first.  (Daniel Frey)\n#if (BOOST_INTEL_CXX_VERSION >= 600)\n#  define BOOST_HAS_NRVO\n#endif\n\n// Branch prediction hints\n// I'm not sure 8.0 was the first version to support these builtins,\n// update the condition if the version is not accurate. (Andrey Semashev)\n#if defined(__GNUC__) && BOOST_INTEL_CXX_VERSION >= 800\n#define BOOST_LIKELY(x) __builtin_expect(x, 1)\n#define BOOST_UNLIKELY(x) __builtin_expect(x, 0)\n#endif\n\n// RTTI\n// __RTTI is the EDG macro\n// __INTEL_RTTI__ is the Intel macro\n// __GXX_RTTI is the g++ macro\n// _CPPRTTI is the MSVC++ macro\n#if !defined(__RTTI) && !defined(__INTEL_RTTI__) && !defined(__GXX_RTTI) && !defined(_CPPRTTI)\n\n#if !defined(BOOST_NO_RTTI)\n# define BOOST_NO_RTTI\n#endif\n\n// in MS mode, static typeid works even when RTTI is off\n#if !defined(_MSC_VER) && !defined(BOOST_NO_TYPEID)\n# define BOOST_NO_TYPEID\n#endif\n\n#endif\n\n//\n// versions check:\n// we don't support Intel prior to version 6.0:\n#if BOOST_INTEL_CXX_VERSION < 600\n#  error \"Compiler not supported or configured - please reconfigure\"\n#endif\n\n// Intel on MacOS requires\n#if defined(__APPLE__) && defined(__INTEL_COMPILER)\n#  define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#endif\n\n// Intel on Altix Itanium\n#if defined(__itanium__) && defined(__INTEL_COMPILER)\n#  define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#endif\n\n//\n// An attempt to value-initialize a pointer-to-member may trigger an\n// internal error on Intel <= 11.1 (last checked version), as was\n// reported by John Maddock, Intel support issue 589832, May 2010.\n// Moreover, according to test results from Huang-Vista-x86_32_intel,\n// intel-vc9-win-11.1 may leave a non-POD array uninitialized, in some\n// cases when it should be value-initialized.\n// (Niels Dekker, LKEB, May 2010)\n// Apparently Intel 12.1 (compiler version number 9999 !!) has the same issue (compiler regression).\n#if defined(__INTEL_COMPILER)\n#  if (__INTEL_COMPILER <= 1110) || (__INTEL_COMPILER == 9999) || (defined(_WIN32) && (__INTEL_COMPILER < 1600))\n#    define BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n#  endif\n#endif\n\n//\n// Dynamic shared object (DSO) and dynamic-link library (DLL) support\n//\n#if defined(__GNUC__) && (__GNUC__ >= 4)\n#  define BOOST_SYMBOL_EXPORT __attribute__((visibility(\"default\")))\n#  define BOOST_SYMBOL_IMPORT\n#  define BOOST_SYMBOL_VISIBLE __attribute__((visibility(\"default\")))\n#endif\n\n// Type aliasing hint\n#if defined(__GNUC__) && (BOOST_INTEL_CXX_VERSION >= 1300)\n#  define BOOST_MAY_ALIAS __attribute__((__may_alias__))\n#endif\n\n//\n// C++0x features\n// For each feature we need to check both the Intel compiler version, \n// and the version of MSVC or GCC that we are emulating.\n// See http://software.intel.com/en-us/articles/c0x-features-supported-by-intel-c-compiler/\n// for a list of which features were implemented in which Intel releases.\n//\n#if defined(BOOST_INTEL_STDCXX0X)\n// BOOST_NO_CXX11_CONSTEXPR:\n#if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40600)) && !defined(_MSC_VER)\n// Available in earlier Intel versions, but fail our tests:\n#  undef BOOST_NO_CXX11_CONSTEXPR\n#endif\n// BOOST_NO_CXX11_NULLPTR:\n#if (BOOST_INTEL_CXX_VERSION >= 1210) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40600)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))\n#  undef BOOST_NO_CXX11_NULLPTR\n#endif\n// BOOST_NO_CXX11_TEMPLATE_ALIASES\n#if (BOOST_INTEL_CXX_VERSION >= 1210) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40700)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))\n#  undef BOOST_NO_CXX11_TEMPLATE_ALIASES\n#endif\n\n// BOOST_NO_CXX11_DECLTYPE\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40300)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))\n#  undef BOOST_NO_CXX11_DECLTYPE\n#endif\n\n// BOOST_NO_CXX11_DECLTYPE_N3276\n#if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40800)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))\n#  undef BOOST_NO_CXX11_DECLTYPE_N3276\n#endif\n\n// BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40300)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))\n#  undef BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#endif\n\n// BOOST_NO_CXX11_RVALUE_REFERENCES\n#if (BOOST_INTEL_CXX_VERSION >= 1300) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40300)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))\n// This is available from earlier Intel versions, but breaks Filesystem and other libraries:\n#  undef BOOST_NO_CXX11_RVALUE_REFERENCES\n#endif\n\n// BOOST_NO_CXX11_STATIC_ASSERT\n#if (BOOST_INTEL_CXX_VERSION >= 1110) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40300)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))\n#  undef BOOST_NO_CXX11_STATIC_ASSERT\n#endif\n\n// BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))\n#  undef BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#endif\n\n// BOOST_NO_CXX11_VARIADIC_MACROS\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40200)) && (!defined(_MSC_VER) || (_MSC_VER >= 1400))\n#  undef BOOST_NO_CXX11_VARIADIC_MACROS\n#endif\n\n// BOOST_NO_CXX11_AUTO_DECLARATIONS\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))\n#  undef BOOST_NO_CXX11_AUTO_DECLARATIONS\n#endif\n\n// BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))\n#  undef BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#endif\n\n// BOOST_NO_CXX11_CHAR16_T\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_VER >= 9999))\n#  undef BOOST_NO_CXX11_CHAR16_T\n#endif\n\n// BOOST_NO_CXX11_CHAR32_T\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_VER >= 9999))\n#  undef BOOST_NO_CXX11_CHAR32_T\n#endif\n\n// BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))\n#  undef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#endif\n\n// BOOST_NO_CXX11_DELETED_FUNCTIONS\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))\n#  undef BOOST_NO_CXX11_DELETED_FUNCTIONS\n#endif\n\n// BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_VER >= 1700))\n#  undef BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#endif\n\n// BOOST_NO_CXX11_SCOPED_ENUMS\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40501)) && (!defined(_MSC_VER) || (_MSC_VER >= 1700))\n// This is available but broken in earlier Intel releases.\n#  undef BOOST_NO_CXX11_SCOPED_ENUMS\n#endif\n\n// BOOST_NO_SFINAE_EXPR\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40500)) && (!defined(_MSC_VER) || (_MSC_VER >= 9999))\n#  undef BOOST_NO_SFINAE_EXPR\n#endif\n\n// BOOST_NO_CXX11_SFINAE_EXPR\n#if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40800)) && !defined(_MSC_VER)\n#  undef BOOST_NO_CXX11_SFINAE_EXPR\n#endif\n\n// BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40500)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))\n// This is available in earlier Intel releases, but breaks Multiprecision:\n#  undef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#endif\n\n// BOOST_NO_CXX11_LAMBDAS\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40500)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))\n#  undef BOOST_NO_CXX11_LAMBDAS\n#endif\n\n// BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40500))\n#  undef BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#endif\n\n// BOOST_NO_CXX11_RANGE_BASED_FOR\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40600)) && (!defined(_MSC_VER) || (_MSC_VER >= 1700))\n#  undef BOOST_NO_CXX11_RANGE_BASED_FOR\n#endif\n\n// BOOST_NO_CXX11_RAW_LITERALS\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40500)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))\n#  undef BOOST_NO_CXX11_RAW_LITERALS\n#endif\n\n// BOOST_NO_CXX11_UNICODE_LITERALS\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40500)) && (!defined(_MSC_VER) || (_MSC_VER >= 9999))\n#  undef BOOST_NO_CXX11_UNICODE_LITERALS\n#endif\n\n// BOOST_NO_CXX11_NOEXCEPT\n#if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40600)) && (!defined(_MSC_VER) || (_MSC_VER >= 9999))\n// Available in earlier Intel release, but generates errors when used with \n// conditional exception specifications, for example in multiprecision:\n#  undef BOOST_NO_CXX11_NOEXCEPT\n#endif\n\n// BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40600)) && (!defined(_MSC_VER) || (_MSC_VER >= 9999))\n#  undef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#endif\n\n// BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40700)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 190021730))\n#  undef BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#endif\n\n// BOOST_NO_CXX11_ALIGNAS\n#if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40800)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 190021730))\n#  undef BOOST_NO_CXX11_ALIGNAS\n#endif\n\n// BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))\n#  undef BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#endif\n\n// BOOST_NO_CXX11_INLINE_NAMESPACES\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 190021730))\n#  undef BOOST_NO_CXX11_INLINE_NAMESPACES\n#endif\n\n// BOOST_NO_CXX11_REF_QUALIFIERS\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40800)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 190021730))\n#  undef BOOST_NO_CXX11_REF_QUALIFIERS\n#endif\n\n// BOOST_NO_CXX11_FINAL\n// BOOST_NO_CXX11_OVERRIDE\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40700)) && (!defined(_MSC_VER) || (_MSC_VER >= 1700))\n#  undef BOOST_NO_CXX11_FINAL\n#  undef BOOST_NO_CXX11_OVERRIDE\n#endif\n\n// BOOST_NO_CXX11_UNRESTRICTED_UNION\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 50100)) && (!defined(_MSC_VER))\n#  undef BOOST_NO_CXX11_UNRESTRICTED_UNION\n#endif\n\n#endif // defined(BOOST_INTEL_STDCXX0X)\n\n//\n// Broken in all versions up to 15:\n#define BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS\n\n#if defined(BOOST_INTEL_STDCXX0X) && (BOOST_INTEL_CXX_VERSION <= 1310)\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#endif\n\n#if defined(BOOST_INTEL_STDCXX0X) && (BOOST_INTEL_CXX_VERSION == 1400)\n// A regression in Intel's compiler means that <tuple> seems to be broken in this release as well as <future> :\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#endif\n\n#if (BOOST_INTEL_CXX_VERSION < 1200)\n//\n// fenv.h appears not to work with Intel prior to 12.0:\n//\n#  define BOOST_NO_FENV_H\n#endif\n\n// Intel 13.10 fails to access defaulted functions of a base class declared in private or protected sections,\n// producing the following errors:\n// error #453: protected function \"...\" (declared at ...\") is not accessible through a \"...\" pointer or object\n#if (BOOST_INTEL_CXX_VERSION <= 1310)\n#  define BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS\n#endif\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1600)\n#  define BOOST_HAS_STDINT_H\n#endif\n\n#if defined(__CUDACC__)\n#  if defined(BOOST_GCC_CXX11)\n#    define BOOST_NVCC_CXX11\n#  else\n#    define BOOST_NVCC_CXX03\n#  endif\n#endif\n\n#if defined(__LP64__) && defined(__GNUC__) && (BOOST_INTEL_CXX_VERSION >= 1310) && !defined(BOOST_NVCC_CXX03)\n#  define BOOST_HAS_INT128\n#endif\n\n#endif // defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1500) && (defined(_MSC_VER) || defined(__GNUC__))\n//\n// last known and checked version:\n#if (BOOST_INTEL_CXX_VERSION > 1700)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"Boost.Config is older than your compiler - please check for an updated Boost release.\"\n#  elif defined(_MSC_VER)\n//\n//      We don't emit this warning any more, since we have so few\n//      defect macros set anyway (just the one).\n//\n//#     pragma message(\"boost: Unknown compiler version - please run the configure tests and report the results\")\n#  endif\n#endif\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/kai.hpp",
    "content": "//  (C) Copyright John Maddock 2001. \n//  (C) Copyright David Abrahams 2002. \n//  (C) Copyright Aleksey Gurtovoy 2002. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Kai C++ compiler setup:\n\n#include <boost/config/compiler/common_edg.hpp>\n\n#   if (__KCC_VERSION <= 4001) || !defined(BOOST_STRICT_CONFIG)\n      // at least on Sun, the contents of <cwchar> is not in namespace std\n#     define BOOST_NO_STDC_NAMESPACE\n#   endif\n\n// see also common_edg.hpp which needs a special check for __KCC\n# if !defined(_EXCEPTIONS) && !defined(BOOST_NO_EXCEPTIONS)\n#     define BOOST_NO_EXCEPTIONS\n# endif\n\n//\n// last known and checked version is 4001:\n#if (__KCC_VERSION > 4001)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"boost: Unknown compiler version - please run the configure tests and report the results\"\n#  endif\n#endif\n\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/metrowerks.hpp",
    "content": "//  (C) Copyright John Maddock 2001.\n//  (C) Copyright Darin Adler 2001.\n//  (C) Copyright Peter Dimov 2001.\n//  (C) Copyright David Abrahams 2001 - 2002.\n//  (C) Copyright Beman Dawes 2001 - 2003.\n//  (C) Copyright Stefan Slapeta 2004.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Metrowerks C++ compiler setup:\n\n// locale support is disabled when linking with the dynamic runtime\n#   ifdef _MSL_NO_LOCALE\n#     define BOOST_NO_STD_LOCALE\n#   endif\n\n#   if __MWERKS__ <= 0x2301  // 5.3\n#     define BOOST_NO_FUNCTION_TEMPLATE_ORDERING\n#     define BOOST_NO_POINTER_TO_MEMBER_CONST\n#     define BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS\n#     define BOOST_NO_MEMBER_TEMPLATE_KEYWORD\n#   endif\n\n#   if __MWERKS__ <= 0x2401  // 6.2\n//#     define BOOST_NO_FUNCTION_TEMPLATE_ORDERING\n#   endif\n\n#   if(__MWERKS__ <= 0x2407)  // 7.x\n#     define BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS\n#     define BOOST_NO_UNREACHABLE_RETURN_DETECTION\n#   endif\n\n#   if(__MWERKS__ <= 0x3003)  // 8.x\n#     define BOOST_NO_SFINAE\n#    endif\n\n// the \"|| !defined(BOOST_STRICT_CONFIG)\" part should apply to the last\n// tested version *only*:\n#   if(__MWERKS__ <= 0x3207) || !defined(BOOST_STRICT_CONFIG) // 9.6\n#     define BOOST_NO_MEMBER_TEMPLATE_FRIENDS\n#     define BOOST_NO_IS_ABSTRACT\n#    endif\n\n#if !__option(wchar_type)\n#   define BOOST_NO_INTRINSIC_WCHAR_T\n#endif\n\n#if !__option(exceptions) && !defined(BOOST_NO_EXCEPTIONS)\n#   define BOOST_NO_EXCEPTIONS\n#endif\n\n#if (__INTEL__ && _WIN32) || (__POWERPC__ && macintosh)\n#   if __MWERKS__ == 0x3000\n#     define BOOST_COMPILER_VERSION 8.0\n#   elif __MWERKS__ == 0x3001\n#     define BOOST_COMPILER_VERSION 8.1\n#   elif __MWERKS__ == 0x3002\n#     define BOOST_COMPILER_VERSION 8.2\n#   elif __MWERKS__ == 0x3003\n#     define BOOST_COMPILER_VERSION 8.3\n#   elif __MWERKS__ == 0x3200\n#     define BOOST_COMPILER_VERSION 9.0\n#   elif __MWERKS__ == 0x3201\n#     define BOOST_COMPILER_VERSION 9.1\n#   elif __MWERKS__ == 0x3202\n#     define BOOST_COMPILER_VERSION 9.2\n#   elif __MWERKS__ == 0x3204\n#     define BOOST_COMPILER_VERSION 9.3\n#   elif __MWERKS__ == 0x3205\n#     define BOOST_COMPILER_VERSION 9.4\n#   elif __MWERKS__ == 0x3206\n#     define BOOST_COMPILER_VERSION 9.5\n#   elif __MWERKS__ == 0x3207\n#     define BOOST_COMPILER_VERSION 9.6\n#   else\n#     define BOOST_COMPILER_VERSION __MWERKS__\n#   endif\n#else\n#  define BOOST_COMPILER_VERSION __MWERKS__\n#endif\n\n//\n// C++0x features\n//\n//   See boost\\config\\suffix.hpp for BOOST_NO_LONG_LONG\n//\n#if __MWERKS__ > 0x3206 && __option(rvalue_refs)\n#  define BOOST_HAS_RVALUE_REFS\n#else\n#  define BOOST_NO_CXX11_RVALUE_REFERENCES\n#endif\n#define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#define BOOST_NO_CXX11_CHAR16_T\n#define BOOST_NO_CXX11_CHAR32_T\n#define BOOST_NO_CXX11_CONSTEXPR\n#define BOOST_NO_CXX11_DECLTYPE\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_SCOPED_ENUMS\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_CXX11_SFINAE_EXPR\n#define BOOST_NO_CXX11_STATIC_ASSERT\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_UNICODE_LITERALS\n#define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#define BOOST_NO_CXX11_VARIADIC_MACROS\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#define BOOST_NO_CXX11_ALIGNAS\n#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#define BOOST_NO_CXX11_INLINE_NAMESPACES\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_FINAL\n#define BOOST_NO_CXX11_OVERRIDE\n#define BOOST_NO_CXX11_THREAD_LOCAL\n#define BOOST_NO_CXX11_UNRESTRICTED_UNION\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n// C++17\n#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606)\n#  define BOOST_NO_CXX17_STRUCTURED_BINDINGS\n#endif\n#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606)\n#  define BOOST_NO_CXX17_INLINE_VARIABLES\n#endif\n#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603)\n#  define BOOST_NO_CXX17_FOLD_EXPRESSIONS\n#endif\n#if !defined(__cpp_if_constexpr) || (__cpp_if_constexpr < 201606)\n#  define BOOST_NO_CXX17_IF_CONSTEXPR\n#endif\n\n#define BOOST_COMPILER \"Metrowerks CodeWarrior C++ version \" BOOST_STRINGIZE(BOOST_COMPILER_VERSION)\n\n//\n// versions check:\n// we don't support Metrowerks prior to version 5.3:\n#if __MWERKS__ < 0x2301\n#  error \"Compiler not supported or configured - please reconfigure\"\n#endif\n//\n// last known and checked version:\n#if (__MWERKS__ > 0x3205)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"boost: Unknown compiler version - please run the configure tests and report the results\"\n#  endif\n#endif\n\n\n\n\n\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/mpw.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2002.\n//  (C) Copyright Aleksey Gurtovoy 2002.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  MPW C++ compilers setup:\n\n#   if    defined(__SC__)\n#     define BOOST_COMPILER \"MPW SCpp version \" BOOST_STRINGIZE(__SC__)\n#   elif defined(__MRC__)\n#     define BOOST_COMPILER \"MPW MrCpp version \" BOOST_STRINGIZE(__MRC__)\n#   else\n#     error \"Using MPW compiler configuration by mistake.  Please update.\"\n#   endif\n\n//\n// MPW 8.90:\n//\n#if (MPW_CPLUS <= 0x890) || !defined(BOOST_STRICT_CONFIG)\n#  define BOOST_NO_CV_SPECIALIZATIONS\n#  define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS\n#  define BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS\n#  define BOOST_NO_INCLASS_MEMBER_INITIALIZATION\n#  define BOOST_NO_INTRINSIC_WCHAR_T\n#  define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n#  define BOOST_NO_USING_TEMPLATE\n\n#  define BOOST_NO_CWCHAR\n#  define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS\n\n#  define BOOST_NO_STD_ALLOCATOR /* actually a bug with const reference overloading */\n\n#endif\n\n//\n// C++0x features\n//\n//   See boost\\config\\suffix.hpp for BOOST_NO_LONG_LONG\n//\n#define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#define BOOST_NO_CXX11_CHAR16_T\n#define BOOST_NO_CXX11_CHAR32_T\n#define BOOST_NO_CXX11_CONSTEXPR\n#define BOOST_NO_CXX11_DECLTYPE\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_RVALUE_REFERENCES\n#define BOOST_NO_CXX11_SCOPED_ENUMS\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_CXX11_SFINAE_EXPR\n#define BOOST_NO_CXX11_STATIC_ASSERT\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_UNICODE_LITERALS\n#define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#define BOOST_NO_CXX11_VARIADIC_MACROS\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#define BOOST_NO_CXX11_ALIGNAS\n#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#define BOOST_NO_CXX11_INLINE_NAMESPACES\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_FINAL\n#define BOOST_NO_CXX11_OVERRIDE\n#define BOOST_NO_CXX11_THREAD_LOCAL\n#define BOOST_NO_CXX11_UNRESTRICTED_UNION\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n// C++17\n#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606)\n#  define BOOST_NO_CXX17_STRUCTURED_BINDINGS\n#endif\n#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606)\n#  define BOOST_NO_CXX17_INLINE_VARIABLES\n#endif\n#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603)\n#  define BOOST_NO_CXX17_FOLD_EXPRESSIONS\n#endif\n#if !defined(__cpp_if_constexpr) || (__cpp_if_constexpr < 201606)\n#  define BOOST_NO_CXX17_IF_CONSTEXPR\n#endif\n\n//\n// versions check:\n// we don't support MPW prior to version 8.9:\n#if MPW_CPLUS < 0x890\n#  error \"Compiler not supported or configured - please reconfigure\"\n#endif\n//\n// last known and checked version is 0x890:\n#if (MPW_CPLUS > 0x890)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"boost: Unknown compiler version - please run the configure tests and report the results\"\n#  endif\n#endif\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/nvcc.hpp",
    "content": "//  (C) Copyright Eric Jourdanneau, Joel Falcou 2010\n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  NVIDIA CUDA C++ compiler setup\n\n#ifndef BOOST_COMPILER\n#  define BOOST_COMPILER \"NVIDIA CUDA C++ Compiler\"\n#endif\n\n#if defined(__CUDACC_VER_MAJOR__) && defined(__CUDACC_VER_MINOR__) && defined(__CUDACC_VER_BUILD__)\n#  define BOOST_CUDA_VERSION (__CUDACC_VER_MAJOR__ * 1000000 + __CUDACC_VER_MINOR__ * 10000 + __CUDACC_VER_BUILD__)\n#else\n// We don't really know what the CUDA version is, but it's definitely before 7.5:\n#  define BOOST_CUDA_VERSION 7000000\n#endif\n\n// NVIDIA Specific support\n// BOOST_GPU_ENABLED : Flag a function or a method as being enabled on the host and device\n#define BOOST_GPU_ENABLED __host__ __device__\n\n#if !defined(__clang__) || defined(__NVCC__)\n// A bug in version 7.0 of CUDA prevents use of variadic templates in some occasions\n// https://svn.boost.org/trac/boost/ticket/11897\n// This is fixed in 7.5. As the following version macro was introduced in 7.5 an existance\n// check is enough to detect versions < 7.5\n#if BOOST_CUDA_VERSION < 7050000\n#   define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#endif\n// The same bug is back again in 8.0:\n#if (BOOST_CUDA_VERSION > 8000000) && (BOOST_CUDA_VERSION < 8010000)\n#   define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#endif\n// CUDA (8.0) has no constexpr support in msvc mode:\n#if defined(_MSC_VER) && (BOOST_CUDA_VERSION < 9000000)\n#  define BOOST_NO_CXX11_CONSTEXPR\n#endif\n\n#endif\n\n#ifdef __CUDACC__\n//\n// When compiing .cu files, there's a bunch of stuff that doesn't work with msvc:\n//\n#if defined(_MSC_VER)\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#  define BOOST_NO_CXX11_UNICODE_LITERALS\n#endif\n//\n// And this one effects the NVCC front end,\n// See https://svn.boost.org/trac/boost/ticket/13049\n//\n#if (BOOST_CUDA_VERSION >= 8000000) && (BOOST_CUDA_VERSION < 8010000)\n#  define BOOST_NO_CXX11_NOEXCEPT\n#endif\n\n#endif\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/pathscale.hpp",
    "content": "//  (C) Copyright Bryce Lelbach 2011\n\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n// PathScale EKOPath C++ Compiler\n\n#ifndef BOOST_COMPILER\n#  define BOOST_COMPILER \"PathScale EKOPath C++ Compiler version \" __PATHSCALE__\n#endif\n\n#if __PATHCC__ >= 6 \n// PathCC is based on clang, and supports the __has_*() builtins used \n// to detect features in clang.hpp. Since the clang toolset is much \n// better maintained, it is more convenient to reuse its definitions. \n#  include \"boost/config/compiler/clang.hpp\"\n#elif __PATHCC__ >= 4 \n#  define BOOST_MSVC6_MEMBER_TEMPLATES\n#  define BOOST_HAS_UNISTD_H\n#  define BOOST_HAS_STDINT_H\n#  define BOOST_HAS_SIGACTION\n#  define BOOST_HAS_SCHED_YIELD\n#  define BOOST_HAS_THREADS\n#  define BOOST_HAS_PTHREADS\n#  define BOOST_HAS_PTHREAD_YIELD\n#  define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#  define BOOST_HAS_PARTIAL_STD_ALLOCATOR\n#  define BOOST_HAS_NRVO\n#  define BOOST_HAS_NL_TYPES_H\n#  define BOOST_HAS_NANOSLEEP\n#  define BOOST_HAS_LONG_LONG\n#  define BOOST_HAS_LOG1P\n#  define BOOST_HAS_GETTIMEOFDAY\n#  define BOOST_HAS_EXPM1\n#  define BOOST_HAS_DIRENT_H\n#  define BOOST_HAS_CLOCK_GETTIME\n#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#  define BOOST_NO_CXX11_UNICODE_LITERALS\n#  define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#  define BOOST_NO_CXX11_STATIC_ASSERT\n#  define BOOST_NO_SFINAE_EXPR\n#  define BOOST_NO_CXX11_SFINAE_EXPR\n#  define BOOST_NO_CXX11_SCOPED_ENUMS\n#  define BOOST_NO_CXX11_RVALUE_REFERENCES\n#  define BOOST_NO_CXX11_RANGE_BASED_FOR\n#  define BOOST_NO_CXX11_RAW_LITERALS\n#  define BOOST_NO_CXX11_NULLPTR\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_NOEXCEPT\n#  define BOOST_NO_CXX11_LAMBDAS\n#  define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#  define BOOST_NO_MS_INT64_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#  define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#  define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#  define BOOST_NO_CXX11_DECLTYPE\n#  define BOOST_NO_CXX11_DECLTYPE_N3276\n#  define BOOST_NO_CXX11_CONSTEXPR\n#  define BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n#  define BOOST_NO_CXX11_CHAR32_T\n#  define BOOST_NO_CXX11_CHAR16_T\n#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#  define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#  define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#  define BOOST_NO_CXX11_ALIGNAS\n#  define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#  define BOOST_NO_CXX11_INLINE_NAMESPACES\n#  define BOOST_NO_CXX11_REF_QUALIFIERS\n#  define BOOST_NO_CXX11_FINAL\n#  define BOOST_NO_CXX11_OVERRIDE\n#  define BOOST_NO_CXX11_THREAD_LOCAL\n#  define BOOST_NO_CXX11_UNRESTRICTED_UNION\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n// C++17\n#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606)\n#  define BOOST_NO_CXX17_STRUCTURED_BINDINGS\n#endif\n#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606)\n#  define BOOST_NO_CXX17_INLINE_VARIABLES\n#endif\n#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603)\n#  define BOOST_NO_CXX17_FOLD_EXPRESSIONS\n#endif\n#if !defined(__cpp_if_constexpr) || (__cpp_if_constexpr < 201606)\n#  define BOOST_NO_CXX17_IF_CONSTEXPR\n#endif\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/pgi.hpp",
    "content": "//  (C) Copyright Noel Belcourt 2007.\n//  Copyright 2017, NVIDIA CORPORATION.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  PGI C++ compiler setup:\n\n#define BOOST_COMPILER_VERSION __PGIC__##__PGIC_MINOR__\n#define BOOST_COMPILER \"PGI compiler version \" BOOST_STRINGIZE(BOOST_COMPILER_VERSION)\n\n// PGI is mostly GNU compatible.  So start with that.\n#include <boost/config/compiler/gcc.hpp>\n\n// Now adjust for things that are different.\n\n// __float128 is a typedef, not a distinct type.\n#undef BOOST_HAS_FLOAT128\n\n// __int128 is not supported.\n#undef BOOST_HAS_INT128\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/sgi_mipspro.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2002. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  SGI C++ compiler setup:\n\n#define BOOST_COMPILER \"SGI Irix compiler version \" BOOST_STRINGIZE(_COMPILER_VERSION)\n\n#include <boost/config/compiler/common_edg.hpp>\n\n//\n// Threading support:\n// Turn this on unconditionally here, it will get turned off again later\n// if no threading API is detected.\n//\n#define BOOST_HAS_THREADS\n#define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n\n#undef BOOST_NO_SWPRINTF\n#undef BOOST_DEDUCED_TYPENAME\n\n//\n// version check:\n// probably nothing to do here?\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/sunpro_cc.hpp",
    "content": "//  (C) Copyright John Maddock 2001.\n//  (C) Copyright Jens Maurer 2001 - 2003.\n//  (C) Copyright Peter Dimov 2002.\n//  (C) Copyright Aleksey Gurtovoy 2002 - 2003.\n//  (C) Copyright David Abrahams 2002.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Sun C++ compiler setup:\n\n#    if __SUNPRO_CC <= 0x500\n#      define BOOST_NO_MEMBER_TEMPLATES\n#      define BOOST_NO_FUNCTION_TEMPLATE_ORDERING\n#    endif\n\n#    if (__SUNPRO_CC <= 0x520)\n       //\n       // Sunpro 5.2 and earler:\n       //\n       // although sunpro 5.2 supports the syntax for\n       // inline initialization it often gets the value\n       // wrong, especially where the value is computed\n       // from other constants (J Maddock 6th May 2001)\n#      define BOOST_NO_INCLASS_MEMBER_INITIALIZATION\n\n       // Although sunpro 5.2 supports the syntax for\n       // partial specialization, it often seems to\n       // bind to the wrong specialization.  Better\n       // to disable it until suppport becomes more stable\n       // (J Maddock 6th May 2001).\n#      define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n#    endif\n\n#    if (__SUNPRO_CC <= 0x530)\n       // Requesting debug info (-g) with Boost.Python results\n       // in an internal compiler error for \"static const\"\n       // initialized in-class.\n       //    >> Assertion:   (../links/dbg_cstabs.cc, line 611)\n       //         while processing ../test.cpp at line 0.\n       // (Jens Maurer according to Gottfried Ganssauge 04 Mar 2002)\n#      define BOOST_NO_INCLASS_MEMBER_INITIALIZATION\n\n       // SunPro 5.3 has better support for partial specialization,\n       // but breaks when compiling std::less<shared_ptr<T> >\n       // (Jens Maurer 4 Nov 2001).\n\n       // std::less specialization fixed as reported by George\n       // Heintzelman; partial specialization re-enabled\n       // (Peter Dimov 17 Jan 2002)\n\n//#      define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\n       // integral constant expressions with 64 bit numbers fail\n#      define BOOST_NO_INTEGRAL_INT64_T\n#    endif\n\n#    if (__SUNPRO_CC < 0x570)\n#      define BOOST_NO_TEMPLATE_TEMPLATES\n       // see http://lists.boost.org/MailArchives/boost/msg47184.php\n       // and http://lists.boost.org/MailArchives/boost/msg47220.php\n#      define BOOST_NO_INCLASS_MEMBER_INITIALIZATION\n#      define BOOST_NO_SFINAE\n#      define BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS\n#    endif\n#    if (__SUNPRO_CC <= 0x580)\n#      define BOOST_NO_IS_ABSTRACT\n#    endif\n\n#    if (__SUNPRO_CC <= 0x5100)\n       // Sun 5.10 may not correctly value-initialize objects of\n       // some user defined types, as was reported in April 2010\n       // (CR 6947016), and confirmed by Steve Clamage.\n       // (Niels Dekker, LKEB, May 2010).\n#      define BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n#    endif\n\n//\n// Dynamic shared object (DSO) and dynamic-link library (DLL) support\n//\n#if __SUNPRO_CC > 0x500\n#  define BOOST_SYMBOL_EXPORT __global\n#  define BOOST_SYMBOL_IMPORT __global\n#  define BOOST_SYMBOL_VISIBLE __global\n#endif\n\n// Deprecated symbol markup\n// Oracle Studio 12.4 supports deprecated attribute with a message; this is the first release that supports the attribute.\n#if (__SUNPRO_CC >= 0x5130)\n#define BOOST_DEPRECATED(msg) __attribute__((deprecated(msg)))\n#endif\n\n#if (__SUNPRO_CC < 0x5130)\n// C++03 features in 12.4:\n#define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_ADL_BARRIER\n#define BOOST_NO_CXX11_VARIADIC_MACROS\n#endif\n\n#if (__SUNPRO_CC < 0x5130) || (__cplusplus < 201100)\n// C++11 only featuires in 12.4:\n#define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#define BOOST_NO_CXX11_CHAR16_T\n#define BOOST_NO_CXX11_CHAR32_T\n#define BOOST_NO_CXX11_CONSTEXPR\n#define BOOST_NO_CXX11_DECLTYPE\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_RVALUE_REFERENCES\n#define BOOST_NO_CXX11_SCOPED_ENUMS\n#define BOOST_NO_CXX11_STATIC_ASSERT\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_UNICODE_LITERALS\n#define BOOST_NO_CXX11_ALIGNAS\n#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#define BOOST_NO_CXX11_INLINE_NAMESPACES\n#define BOOST_NO_CXX11_FINAL\n#define BOOST_NO_CXX11_OVERRIDE\n#define BOOST_NO_CXX11_UNRESTRICTED_UNION\n#endif\n\n#if (__SUNPRO_CC < 0x5140) || (__cplusplus < 201103)\n#define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#define BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_THREAD_LOCAL\n#endif\n\n#define BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n//\n// C++0x features\n//\n#  define BOOST_HAS_LONG_LONG\n\n#define BOOST_NO_CXX11_SFINAE_EXPR\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304) || (__cplusplus < 201402L)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n// C++17\n#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606)\n#  define BOOST_NO_CXX17_STRUCTURED_BINDINGS\n#endif\n#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606)\n#  define BOOST_NO_CXX17_INLINE_VARIABLES\n#endif\n#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603)\n#  define BOOST_NO_CXX17_FOLD_EXPRESSIONS\n#endif\n#if !defined(__cpp_if_constexpr) || (__cpp_if_constexpr < 201606)\n#  define BOOST_NO_CXX17_IF_CONSTEXPR\n#endif\n\n// Turn on threading support for Solaris 12.\n// Ticket #11972\n#if (__SUNPRO_CC >= 0x5140) && defined(__SunOS_5_12) && !defined(BOOST_HAS_THREADS)\n# define BOOST_HAS_THREADS\n#endif\n\n//\n// Version\n//\n\n#define BOOST_COMPILER \"Sun compiler version \" BOOST_STRINGIZE(__SUNPRO_CC)\n\n//\n// versions check:\n// we don't support sunpro prior to version 4:\n#if __SUNPRO_CC < 0x400\n#error \"Compiler not supported or configured - please reconfigure\"\n#endif\n//\n// last known and checked version:\n#if (__SUNPRO_CC > 0x5150)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"Boost.Config is older than your compiler - please check for an updated Boost release.\"\n#  endif\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/vacpp.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003.\n//  (C) Copyright Toon Knapen 2001 - 2003.\n//  (C) Copyright Lie-Quan Lee 2001.\n//  (C) Copyright Markus Schoepflin 2002 - 2003.\n//  (C) Copyright Beman Dawes 2002 - 2003.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Visual Age (IBM) C++ compiler setup:\n\n#if __IBMCPP__ <= 501\n#  define BOOST_NO_MEMBER_TEMPLATE_FRIENDS\n#  define BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS\n#endif\n\n#if (__IBMCPP__ <= 502)\n// Actually the compiler supports inclass member initialization but it\n// requires a definition for the class member and it doesn't recognize\n// it as an integral constant expression when used as a template argument.\n#  define BOOST_NO_INCLASS_MEMBER_INITIALIZATION\n#  define BOOST_NO_INTEGRAL_INT64_T\n#  define BOOST_NO_MEMBER_TEMPLATE_KEYWORD\n#endif\n\n#if (__IBMCPP__ <= 600) || !defined(BOOST_STRICT_CONFIG)\n#  define BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS\n#endif\n\n#if (__IBMCPP__ <= 1110)\n// XL C++ V11.1 and earlier versions may not always value-initialize\n// a temporary object T(), when T is a non-POD aggregate class type.\n// Michael Wong (IBM Canada Ltd) has confirmed this issue and gave it\n// high priority. -- Niels Dekker (LKEB), May 2010.\n#  define BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n#endif\n\n//\n// On AIX thread support seems to be indicated by _THREAD_SAFE:\n//\n#ifdef _THREAD_SAFE\n#  define BOOST_HAS_THREADS\n#endif\n\n#define BOOST_COMPILER \"IBM Visual Age version \" BOOST_STRINGIZE(__IBMCPP__)\n\n//\n// versions check:\n// we don't support Visual age prior to version 5:\n#if __IBMCPP__ < 500\n#error \"Compiler not supported or configured - please reconfigure\"\n#endif\n//\n// last known and checked version is 1210:\n#if (__IBMCPP__ > 1210)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"boost: Unknown compiler version - please run the configure tests and report the results\"\n#  endif\n#endif\n\n// Some versions of the compiler have issues with default arguments on partial specializations\n#if __IBMCPP__ <= 1010\n#define BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS\n#endif\n\n// Type aliasing hint. Supported since XL C++ 13.1\n#if (__IBMCPP__ >= 1310)\n#  define BOOST_MAY_ALIAS __attribute__((__may_alias__))\n#endif\n\n//\n// C++0x features\n//\n//   See boost\\config\\suffix.hpp for BOOST_NO_LONG_LONG\n//\n#if ! __IBMCPP_AUTO_TYPEDEDUCTION\n#  define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#endif\n#if ! __IBMCPP_UTF_LITERAL__\n#  define BOOST_NO_CXX11_CHAR16_T\n#  define BOOST_NO_CXX11_CHAR32_T\n#endif\n#if ! __IBMCPP_CONSTEXPR\n#  define BOOST_NO_CXX11_CONSTEXPR\n#endif\n#if ! __IBMCPP_DECLTYPE\n#  define BOOST_NO_CXX11_DECLTYPE\n#else\n#  define BOOST_HAS_DECLTYPE\n#endif\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#if ! __IBMCPP_EXPLICIT_CONVERSION_OPERATORS\n#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#endif\n#if ! __IBMCPP_EXTERN_TEMPLATE\n#  define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#endif\n#if ! __IBMCPP_VARIADIC_TEMPLATES\n// not enabled separately at this time\n#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#endif\n#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#if ! __IBMCPP_RVALUE_REFERENCES\n#  define BOOST_NO_CXX11_RVALUE_REFERENCES\n#endif\n#if ! __IBMCPP_SCOPED_ENUM\n#  define BOOST_NO_CXX11_SCOPED_ENUMS\n#endif\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_CXX11_SFINAE_EXPR\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#if ! __IBMCPP_STATIC_ASSERT\n#  define BOOST_NO_CXX11_STATIC_ASSERT\n#endif\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_UNICODE_LITERALS\n#if ! __IBMCPP_VARIADIC_TEMPLATES\n#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#endif\n#if ! __C99_MACRO_WITH_VA_ARGS\n#  define BOOST_NO_CXX11_VARIADIC_MACROS\n#endif\n#define BOOST_NO_CXX11_ALIGNAS\n#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#define BOOST_NO_CXX11_INLINE_NAMESPACES\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_FINAL\n#define BOOST_NO_CXX11_OVERRIDE\n#define BOOST_NO_CXX11_THREAD_LOCAL\n#define BOOST_NO_CXX11_UNRESTRICTED_UNION\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n// C++17\n#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606)\n#  define BOOST_NO_CXX17_STRUCTURED_BINDINGS\n#endif\n#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606)\n#  define BOOST_NO_CXX17_INLINE_VARIABLES\n#endif\n#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603)\n#  define BOOST_NO_CXX17_FOLD_EXPRESSIONS\n#endif\n#if !defined(__cpp_if_constexpr) || (__cpp_if_constexpr < 201606)\n#  define BOOST_NO_CXX17_IF_CONSTEXPR\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/visualc.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003.\n//  (C) Copyright Darin Adler 2001 - 2002.\n//  (C) Copyright Peter Dimov 2001.\n//  (C) Copyright Aleksey Gurtovoy 2002.\n//  (C) Copyright David Abrahams 2002 - 2003.\n//  (C) Copyright Beman Dawes 2002 - 2003.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n//\n//  Microsoft Visual C++ compiler setup:\n//\n//  We need to be careful with the checks in this file, as contrary\n//  to popular belief there are versions with _MSC_VER with the final\n//  digit non-zero (mainly the MIPS cross compiler).\n//\n//  So we either test _MSC_VER >= XXXX or else _MSC_VER < XXXX.\n//  No other comparisons (==, >, or <=) are safe.\n//\n\n#define BOOST_MSVC _MSC_VER\n\n//\n// Helper macro BOOST_MSVC_FULL_VER for use in Boost code:\n//\n#if _MSC_FULL_VER > 100000000\n#  define BOOST_MSVC_FULL_VER _MSC_FULL_VER\n#else\n#  define BOOST_MSVC_FULL_VER (_MSC_FULL_VER * 10)\n#endif\n\n// Attempt to suppress VC6 warnings about the length of decorated names (obsolete):\n#pragma warning( disable : 4503 ) // warning: decorated name length exceeded\n\n#define BOOST_HAS_PRAGMA_ONCE\n\n//\n// versions check:\n// we don't support Visual C++ prior to version 7.1:\n#if _MSC_VER < 1310\n#  error \"Compiler not supported or configured - please reconfigure\"\n#endif\n\n// VS2005 (VC8) docs: __assume has been in Visual C++ for multiple releases\n#define BOOST_UNREACHABLE_RETURN(x) __assume(0);\n\n#if _MSC_FULL_VER < 180020827\n#  define BOOST_NO_FENV_H\n#endif\n\n#if _MSC_VER < 1400\n// although a conforming signature for swprint exists in VC7.1\n// it appears not to actually work:\n#  define BOOST_NO_SWPRINTF\n// Our extern template tests also fail for this compiler:\n#  define BOOST_NO_CXX11_EXTERN_TEMPLATE\n// Variadic macros do not exist for VC7.1 and lower\n#  define BOOST_NO_CXX11_VARIADIC_MACROS\n#  define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#endif\n\n#if _MSC_VER < 1500  // 140X == VC++ 8.0\n#  define BOOST_NO_MEMBER_TEMPLATE_FRIENDS\n#endif\n\n#if _MSC_VER < 1600  // 150X == VC++ 9.0\n   // A bug in VC9:\n#  define BOOST_NO_ADL_BARRIER\n#endif\n\n\n#ifndef _NATIVE_WCHAR_T_DEFINED\n#  define BOOST_NO_INTRINSIC_WCHAR_T\n#endif\n\n//\n// check for exception handling support:\n#if !defined(_CPPUNWIND) && !defined(BOOST_NO_EXCEPTIONS)\n#  define BOOST_NO_EXCEPTIONS\n#endif\n\n//\n// __int64 support:\n//\n#define BOOST_HAS_MS_INT64\n#if defined(_MSC_EXTENSIONS) || (_MSC_VER >= 1400)\n#   define BOOST_HAS_LONG_LONG\n#else\n#   define BOOST_NO_LONG_LONG\n#endif\n#if (_MSC_VER >= 1400) && !defined(_DEBUG)\n#   define BOOST_HAS_NRVO\n#endif\n#if _MSC_VER >= 1600  // 160X == VC++ 10.0\n#  define BOOST_HAS_PRAGMA_DETECT_MISMATCH\n#endif\n//\n// disable Win32 API's if compiler extensions are\n// turned off:\n//\n#if !defined(_MSC_EXTENSIONS) && !defined(BOOST_DISABLE_WIN32)\n#  define BOOST_DISABLE_WIN32\n#endif\n#if !defined(_CPPRTTI) && !defined(BOOST_NO_RTTI)\n#  define BOOST_NO_RTTI\n#endif\n\n// Deprecated symbol markup\n#if (_MSC_VER >= 1400)\n#define BOOST_DEPRECATED(msg) __declspec(deprecated(msg))\n#else\n// MSVC 7.1 only supports the attribute without a message\n#define BOOST_DEPRECATED(msg) __declspec(deprecated)\n#endif\n\n//\n// TR1 features:\n//\n#if (_MSC_VER >= 1700) && defined(_HAS_CXX17) && (_HAS_CXX17 > 0)\n// # define BOOST_HAS_TR1_HASH          // don't know if this is true yet.\n// # define BOOST_HAS_TR1_TYPE_TRAITS   // don't know if this is true yet.\n# define BOOST_HAS_TR1_UNORDERED_MAP\n# define BOOST_HAS_TR1_UNORDERED_SET\n#endif\n\n//\n// C++0x features\n//\n//   See above for BOOST_NO_LONG_LONG\n\n// C++ features supported by VC++ 10 (aka 2010)\n//\n#if _MSC_VER < 1600\n#  define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#  define BOOST_NO_CXX11_LAMBDAS\n#  define BOOST_NO_CXX11_RVALUE_REFERENCES\n#  define BOOST_NO_CXX11_STATIC_ASSERT\n#  define BOOST_NO_CXX11_NULLPTR\n#  define BOOST_NO_CXX11_DECLTYPE\n#endif // _MSC_VER < 1600\n\n#if _MSC_VER >= 1600\n#  define BOOST_HAS_STDINT_H\n#endif\n\n// C++11 features supported by VC++ 11 (aka 2012)\n//\n#if _MSC_VER < 1700\n#  define BOOST_NO_CXX11_FINAL\n#  define BOOST_NO_CXX11_RANGE_BASED_FOR\n#  define BOOST_NO_CXX11_SCOPED_ENUMS\n#  define BOOST_NO_CXX11_OVERRIDE\n#endif // _MSC_VER < 1700\n\n// C++11 features supported by VC++ 12 (aka 2013).\n//\n#if _MSC_FULL_VER < 180020827\n#  define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#  define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#  define BOOST_NO_CXX11_RAW_LITERALS\n#  define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#  define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#  define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#  define BOOST_NO_CXX11_DECLTYPE_N3276\n#endif\n\n#if _MSC_FULL_VER >= 180020827\n#define BOOST_HAS_EXPM1\n#define BOOST_HAS_LOG1P\n#endif\n\n// C++11 features supported by VC++ 14 (aka 2015)\n//\n#if (_MSC_FULL_VER < 190023026)\n#  define BOOST_NO_CXX11_NOEXCEPT\n#  define BOOST_NO_CXX11_DEFAULTED_MOVES\n#  define BOOST_NO_CXX11_REF_QUALIFIERS\n#  define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#  define BOOST_NO_CXX11_ALIGNAS\n#  define BOOST_NO_CXX11_INLINE_NAMESPACES\n#  define BOOST_NO_CXX11_CHAR16_T\n#  define BOOST_NO_CXX11_CHAR32_T\n#  define BOOST_NO_CXX11_UNICODE_LITERALS\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#  define BOOST_NO_CXX11_THREAD_LOCAL\n#  define BOOST_NO_CXX11_UNRESTRICTED_UNION\n#endif\n// C++11 features supported by VC++ 14 update 3 (aka 2015)\n//\n#if (_MSC_FULL_VER < 190024210)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#  define BOOST_NO_SFINAE_EXPR\n#  define BOOST_NO_CXX11_CONSTEXPR\n#endif\n\n// C++14 features supported by VC++ 14.1 (Visual Studio 2017)\n//\n#if (_MSC_VER < 1910)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n\n// C++17 features supported by VC++ 14.1 (Visual Studio 2017) Update 3\n//\n#if (_MSC_VER < 1911) || (_MSVC_LANG < 201703)\n#  define BOOST_NO_CXX17_STRUCTURED_BINDINGS\n#  define BOOST_NO_CXX17_IF_CONSTEXPR\n// Let the defaults handle these now:\n//#  define BOOST_NO_CXX17_HDR_OPTIONAL\n//#  define BOOST_NO_CXX17_HDR_STRING_VIEW\n#endif\n\n// MSVC including version 14 has not yet completely\n// implemented value-initialization, as is reported:\n// \"VC++ does not value-initialize members of derived classes without\n// user-declared constructor\", reported in 2009 by Sylvester Hesp:\n// https://connect.microsoft.com/VisualStudio/feedback/details/484295\n// \"Presence of copy constructor breaks member class initialization\",\n// reported in 2009 by Alex Vakulenko:\n// https://connect.microsoft.com/VisualStudio/feedback/details/499606\n// \"Value-initialization in new-expression\", reported in 2005 by\n// Pavel Kuznetsov (MetaCommunications Engineering):\n// https://connect.microsoft.com/VisualStudio/feedback/details/100744\n// Reported again by John Maddock in 2015 for VC14:\n// https://connect.microsoft.com/VisualStudio/feedback/details/1582233/c-subobjects-still-not-value-initialized-correctly\n// See also: http://www.boost.org/libs/utility/value_init.htm#compiler_issues\n// (Niels Dekker, LKEB, May 2010)\n// Still present in VC15.5, Dec 2017.\n#define BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n//\n// C++ 11:\n//\n// This is supported with /permissive- for 15.5 onwards, unfortunately we appear to have no way to tell\n// if this is in effect or not, in any case nothing in Boost is currently using this, so we'll just go\n// on defining it for now:\n//\n#if (_MSC_FULL_VER < 193030705)  || (_MSVC_LANG < 202004)\n#  define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#endif\n\n#if (_MSC_VER < 1912) || (_MSVC_LANG < 201402)\n// Supported from msvc-15.5 onwards:\n#define BOOST_NO_CXX11_SFINAE_EXPR\n#endif\n#if (_MSC_VER < 1915) || (_MSVC_LANG < 201402)\n// C++ 14:\n// Still gives internal compiler error for msvc-15.5:\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n// C++ 17:\n#if (_MSC_VER < 1912) || (_MSVC_LANG < 201703)\n#define BOOST_NO_CXX17_INLINE_VARIABLES\n#define BOOST_NO_CXX17_FOLD_EXPRESSIONS\n#endif\n\n//\n// Things that don't work in clr mode:\n//\n#ifdef _M_CEE\n#ifndef BOOST_NO_CXX11_THREAD_LOCAL\n#  define BOOST_NO_CXX11_THREAD_LOCAL\n#endif\n#ifndef BOOST_NO_SFINAE_EXPR\n#  define BOOST_NO_SFINAE_EXPR\n#endif\n#ifndef BOOST_NO_CXX11_REF_QUALIFIERS\n#  define BOOST_NO_CXX11_REF_QUALIFIERS\n#endif\n#endif\n#ifdef _M_CEE_PURE\n#ifndef BOOST_NO_CXX11_CONSTEXPR\n#  define BOOST_NO_CXX11_CONSTEXPR\n#endif\n#endif\n\n//\n// prefix and suffix headers:\n//\n#ifndef BOOST_ABI_PREFIX\n#  define BOOST_ABI_PREFIX \"boost/config/abi/msvc_prefix.hpp\"\n#endif\n#ifndef BOOST_ABI_SUFFIX\n#  define BOOST_ABI_SUFFIX \"boost/config/abi/msvc_suffix.hpp\"\n#endif\n\n//\n// Approximate compiler conformance version\n//\n#ifdef _MSVC_LANG\n#  define BOOST_CXX_VERSION _MSVC_LANG\n#elif defined(_HAS_CXX17)\n#  define BOOST_CXX_VERSION 201703L\n#elif BOOST_MSVC >= 1916\n#  define BOOST_CXX_VERSION 201402L\n#endif\n\n#ifndef BOOST_COMPILER\n// TODO:\n// these things are mostly bogus. 1200 means version 12.0 of the compiler. The\n// artificial versions assigned to them only refer to the versions of some IDE\n// these compilers have been shipped with, and even that is not all of it. Some\n// were shipped with freely downloadable SDKs, others as crosscompilers in eVC.\n// IOW, you can't use these 'versions' in any sensible way. Sorry.\n# if defined(UNDER_CE)\n#   if _MSC_VER < 1400\n      // Note: I'm not aware of any CE compiler with version 13xx\n#      if defined(BOOST_ASSERT_CONFIG)\n#         error \"boost: Unknown EVC++ compiler version - please run the configure tests and report the results\"\n#      else\n#         pragma message(\"boost: Unknown EVC++ compiler version - please run the configure tests and report the results\")\n#      endif\n#   elif _MSC_VER < 1500\n#     define BOOST_COMPILER_VERSION evc8\n#   elif _MSC_VER < 1600\n#     define BOOST_COMPILER_VERSION evc9\n#   elif _MSC_VER < 1700\n#     define BOOST_COMPILER_VERSION evc10\n#   elif _MSC_VER < 1800 \n#     define BOOST_COMPILER_VERSION evc11 \n#   elif _MSC_VER < 1900 \n#     define BOOST_COMPILER_VERSION evc12\n#   elif _MSC_VER < 2000  \n#     define BOOST_COMPILER_VERSION evc14\n#   else\n#      if defined(BOOST_ASSERT_CONFIG)\n#         error \"boost: Unknown EVC++ compiler version - please run the configure tests and report the results\"\n#      else\n#         pragma message(\"boost: Unknown EVC++ compiler version - please run the configure tests and report the results\")\n#      endif\n#   endif\n# else\n#   if _MSC_VER < 1200\n      // Note: Versions up to 10.0 aren't supported.\n#     define BOOST_COMPILER_VERSION 5.0\n#   elif _MSC_VER < 1300\n#     define BOOST_COMPILER_VERSION 6.0\n#   elif _MSC_VER < 1310\n#     define BOOST_COMPILER_VERSION 7.0\n#   elif _MSC_VER < 1400\n#     define BOOST_COMPILER_VERSION 7.1\n#   elif _MSC_VER < 1500\n#     define BOOST_COMPILER_VERSION 8.0\n#   elif _MSC_VER < 1600\n#     define BOOST_COMPILER_VERSION 9.0\n#   elif _MSC_VER < 1700\n#     define BOOST_COMPILER_VERSION 10.0\n#   elif _MSC_VER < 1800 \n#     define BOOST_COMPILER_VERSION 11.0\n#   elif _MSC_VER < 1900\n#     define BOOST_COMPILER_VERSION 12.0\n#   elif _MSC_VER < 1910\n#     define BOOST_COMPILER_VERSION 14.0\n#   elif _MSC_VER < 1920\n#     define BOOST_COMPILER_VERSION 14.1\n#   elif _MSC_VER < 1930\n#     define BOOST_COMPILER_VERSION 14.2\n#   else\n#     define BOOST_COMPILER_VERSION _MSC_VER\n#   endif\n# endif\n\n#  define BOOST_COMPILER \"Microsoft Visual C++ version \" BOOST_STRINGIZE(BOOST_COMPILER_VERSION)\n#endif\n\n#include <boost/config/pragma_message.hpp>\n\n//\n// last known and checked version is 19.20.27508 (VC++ 2019 RC3):\n#if (_MSC_VER > 1920)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"Boost.Config is older than your current compiler version.\"\n#  elif !defined(BOOST_CONFIG_SUPPRESS_OUTDATED_MESSAGE)\n      //\n      // Disabled as of March 2018 - the pace of VS releases is hard to keep up with\n      // and in any case, we have relatively few defect macros defined now.\n      // BOOST_PRAGMA_MESSAGE(\"Info: Boost.Config is older than your compiler version - probably nothing bad will happen - but you may wish to look for an updated Boost version. Define BOOST_CONFIG_SUPPRESS_OUTDATED_MESSAGE to suppress this message.\")\n#  endif\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/xlcpp.hpp",
    "content": "// (C) Copyright Douglas Gregor 2010\n//\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  compiler setup for IBM XL C/C++ for Linux (Little Endian) based on clang.\n\n#define BOOST_HAS_PRAGMA_ONCE\n\n// Detecting `-fms-extension` compiler flag assuming that _MSC_VER defined when that flag is used.\n#if defined (_MSC_VER) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 4))\n#   define BOOST_HAS_PRAGMA_DETECT_MISMATCH\n#endif\n\n// When compiling with clang before __has_extension was defined,\n// even if one writes 'defined(__has_extension) && __has_extension(xxx)',\n// clang reports a compiler error. So the only workaround found is:\n\n#ifndef __has_extension\n#define __has_extension __has_feature\n#endif\n\n#ifndef __has_cpp_attribute\n#define __has_cpp_attribute(x) 0\n#endif\n\n#if !__has_feature(cxx_exceptions) && !defined(BOOST_NO_EXCEPTIONS)\n#  define BOOST_NO_EXCEPTIONS\n#endif\n\n#if !__has_feature(cxx_rtti) && !defined(BOOST_NO_RTTI)\n#  define BOOST_NO_RTTI\n#endif\n\n#if !__has_feature(cxx_rtti) && !defined(BOOST_NO_TYPEID)\n#  define BOOST_NO_TYPEID\n#endif\n\n#if defined(__int64) && !defined(__GNUC__)\n#  define BOOST_HAS_MS_INT64\n#endif\n\n#define BOOST_HAS_NRVO\n\n// Branch prediction hints\n#if defined(__has_builtin)\n#if __has_builtin(__builtin_expect)\n#define BOOST_LIKELY(x) __builtin_expect(x, 1)\n#define BOOST_UNLIKELY(x) __builtin_expect(x, 0)\n#endif\n#endif\n\n// Clang supports \"long long\" in all compilation modes.\n#define BOOST_HAS_LONG_LONG\n\n//\n// Dynamic shared object (DSO) and dynamic-link library (DLL) support\n//\n#if !defined(_WIN32) && !defined(__WIN32__) && !defined(WIN32)\n#  define BOOST_SYMBOL_EXPORT __attribute__((__visibility__(\"default\")))\n#  define BOOST_SYMBOL_IMPORT\n#  define BOOST_SYMBOL_VISIBLE __attribute__((__visibility__(\"default\")))\n#endif\n\n//\n// The BOOST_FALLTHROUGH macro can be used to annotate implicit fall-through\n// between switch labels.\n//\n#if __cplusplus >= 201103L && defined(__has_warning)\n#  if __has_feature(cxx_attributes) && __has_warning(\"-Wimplicit-fallthrough\")\n#    define BOOST_FALLTHROUGH [[clang::fallthrough]]\n#  endif\n#endif\n\n#if !__has_feature(cxx_auto_type)\n#  define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#endif\n\n//\n// Currently clang on Windows using VC++ RTL does not support C++11's char16_t or char32_t\n//\n#if defined(_MSC_VER) || !(defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L)\n#  define BOOST_NO_CXX11_CHAR16_T\n#  define BOOST_NO_CXX11_CHAR32_T\n#endif\n\n#if !__has_feature(cxx_constexpr)\n#  define BOOST_NO_CXX11_CONSTEXPR\n#endif\n\n#if !__has_feature(cxx_decltype)\n#  define BOOST_NO_CXX11_DECLTYPE\n#endif\n\n#if !__has_feature(cxx_decltype_incomplete_return_types)\n#  define BOOST_NO_CXX11_DECLTYPE_N3276\n#endif\n\n#if !__has_feature(cxx_defaulted_functions)\n#  define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#endif\n\n#if !__has_feature(cxx_deleted_functions)\n#  define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#endif\n\n#if !__has_feature(cxx_explicit_conversions)\n#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#endif\n\n#if !__has_feature(cxx_default_function_template_args)\n#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#endif\n\n#if !__has_feature(cxx_generalized_initializers)\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#endif\n\n#if !__has_feature(cxx_lambdas)\n#  define BOOST_NO_CXX11_LAMBDAS\n#endif\n\n#if !__has_feature(cxx_local_type_template_args)\n#  define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#endif\n\n#if !__has_feature(cxx_noexcept)\n#  define BOOST_NO_CXX11_NOEXCEPT\n#endif\n\n#if !__has_feature(cxx_nullptr)\n#  define BOOST_NO_CXX11_NULLPTR\n#endif\n\n#if !__has_feature(cxx_range_for)\n#  define BOOST_NO_CXX11_RANGE_BASED_FOR\n#endif\n\n#if !__has_feature(cxx_raw_string_literals)\n#  define BOOST_NO_CXX11_RAW_LITERALS\n#endif\n\n#if !__has_feature(cxx_reference_qualified_functions)\n#  define BOOST_NO_CXX11_REF_QUALIFIERS\n#endif\n\n#if !__has_feature(cxx_generalized_initializers)\n#  define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#endif\n\n#if !__has_feature(cxx_rvalue_references)\n#  define BOOST_NO_CXX11_RVALUE_REFERENCES\n#endif\n\n#if !__has_feature(cxx_strong_enums)\n#  define BOOST_NO_CXX11_SCOPED_ENUMS\n#endif\n\n#if !__has_feature(cxx_static_assert)\n#  define BOOST_NO_CXX11_STATIC_ASSERT\n#endif\n\n#if !__has_feature(cxx_alias_templates)\n#  define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#endif\n\n#if !__has_feature(cxx_unicode_literals)\n#  define BOOST_NO_CXX11_UNICODE_LITERALS\n#endif\n\n#if !__has_feature(cxx_variadic_templates)\n#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#endif\n\n#if !__has_feature(cxx_user_literals)\n#  define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#endif\n\n#if !__has_feature(cxx_alignas)\n#  define BOOST_NO_CXX11_ALIGNAS\n#endif\n\n#if !__has_feature(cxx_trailing_return)\n#  define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#endif\n\n#if !__has_feature(cxx_inline_namespaces)\n#  define BOOST_NO_CXX11_INLINE_NAMESPACES\n#endif\n\n#if !__has_feature(cxx_override_control)\n#  define BOOST_NO_CXX11_FINAL\n#  define BOOST_NO_CXX11_OVERRIDE\n#endif\n\n#if !__has_feature(cxx_unrestricted_unions)\n#  define BOOST_NO_CXX11_UNRESTRICTED_UNION\n#endif\n\n#if !(__has_feature(__cxx_binary_literals__) || __has_extension(__cxx_binary_literals__))\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n\n#if !__has_feature(__cxx_decltype_auto__)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n\n#if !__has_feature(__cxx_aggregate_nsdmi__)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n\n#if !__has_feature(__cxx_init_captures__)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n\n#if !__has_feature(__cxx_generic_lambdas__)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n\n// clang < 3.5 has a defect with dependent type, like following.\n//\n//  template <class T>\n//  constexpr typename enable_if<pred<T> >::type foo(T &)\n//  { } // error: no return statement in constexpr function\n//\n// This issue also affects C++11 mode, but C++11 constexpr requires return stmt.\n// Therefore we don't care such case.\n//\n// Note that we can't check Clang version directly as the numbering system changes depending who's\n// creating the Clang release (see https://github.com/boostorg/config/pull/39#issuecomment-59927873)\n// so instead verify that we have a feature that was introduced at the same time as working C++14\n// constexpr (generic lambda's in this case):\n//\n#if !__has_feature(__cxx_generic_lambdas__) || !__has_feature(__cxx_relaxed_constexpr__)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n\n#if !__has_feature(__cxx_return_type_deduction__)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n\n#if !__has_feature(__cxx_variable_templates__)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606)\n#  define BOOST_NO_CXX17_STRUCTURED_BINDINGS\n#endif\n\n#if !defined(__cpp_if_constexpr) || (__cpp_if_constexpr < 201606)\n#  define BOOST_NO_CXX17_IF_CONSTEXPR\n#endif\n\n// Clang 3.9+ in c++1z\n#if !__has_cpp_attribute(fallthrough) || __cplusplus < 201406L\n#  define BOOST_NO_CXX17_INLINE_VARIABLES\n#  define BOOST_NO_CXX17_FOLD_EXPRESSIONS\n#endif\n\n#if !__has_feature(cxx_thread_local)\n#  define BOOST_NO_CXX11_THREAD_LOCAL\n#endif\n\n#if __cplusplus < 201400\n// All versions with __cplusplus above this value seem to support this:\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n\n// Deprecated symbol markup\n#if __has_attribute(deprecated)\n#define BOOST_DEPRECATED(msg) __attribute__((deprecated(msg)))\n#endif\n\n// Unused attribute:\n#if defined(__GNUC__) && (__GNUC__ >= 4)\n#  define BOOST_ATTRIBUTE_UNUSED __attribute__((unused))\n#endif\n\n// Type aliasing hint.\n#if __has_attribute(__may_alias__)\n#  define BOOST_MAY_ALIAS __attribute__((__may_alias__))\n#endif\n\n#ifndef BOOST_COMPILER\n#  define BOOST_COMPILER \"Clang version \" __clang_version__\n#endif\n\n// Macro used to identify the Clang compiler.\n#define BOOST_CLANG 1\n\n#define BOOST_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/compiler/xlcpp_zos.hpp",
    "content": "//  Copyright (c) 2017 Dynatrace\n//\n//  Distributed under the Boost Software License, Version 1.0.\n//  See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt\n\n//  See http://www.boost.org for most recent version.\n\n//  Compiler setup for IBM z/OS XL C/C++ compiler.\n\n// Oldest compiler version currently supported is 2.1 (V2R1)\n#if !defined(__IBMCPP__) || !defined(__COMPILER_VER__) || __COMPILER_VER__ < 0x42010000\n#  error \"Compiler not supported or configured - please reconfigure\"\n#endif\n\n#if __COMPILER_VER__ > 0x42010000\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"Unknown compiler version - please run the configure tests and report the results\"\n#  endif\n#endif\n\n#define BOOST_COMPILER \"IBM z/OS XL C/C++ version \" BOOST_STRINGIZE(__COMPILER_VER__)\n#define BOOST_XLCPP_ZOS __COMPILER_VER__\n\n// -------------------------------------\n\n#include <features.h> // For __UU, __C99, __TR1, ...\n\n#if !defined(__IBMCPP_DEFAULTED_AND_DELETED_FUNCTIONS)\n#  define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#  define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#  define BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS\n#endif\n\n// -------------------------------------\n\n#if defined(__UU) || defined(__C99) || defined(__TR1)\n#  define BOOST_HAS_LOG1P\n#  define BOOST_HAS_EXPM1\n#endif\n\n#if defined(__C99) || defined(__TR1)\n#  define BOOST_HAS_STDINT_H\n#else\n#  define BOOST_NO_FENV_H\n#endif\n\n// -------------------------------------\n\n#define BOOST_HAS_NRVO\n\n#if !defined(__RTTI_ALL__)\n#  define BOOST_NO_RTTI\n#endif\n\n#if !defined(_CPPUNWIND) && !defined(__EXCEPTIONS)\n#  define BOOST_NO_EXCEPTIONS\n#endif\n\n#if defined(_LONG_LONG) || defined(__IBMCPP_C99_LONG_LONG) || defined(__LL)\n#  define BOOST_HAS_LONG_LONG\n#else\n#  define BOOST_NO_LONG_LONG\n#endif\n\n#if defined(_LONG_LONG) || defined(__IBMCPP_C99_LONG_LONG) || defined(__LL) || defined(_LP64)\n#  define BOOST_HAS_MS_INT64\n#endif\n\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_CXX11_SFINAE_EXPR\n\n#if defined(__IBMCPP_VARIADIC_TEMPLATES)\n#  define BOOST_HAS_VARIADIC_TMPL\n#else\n#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#endif\n\n#if defined(__IBMCPP_STATIC_ASSERT)\n#  define BOOST_HAS_STATIC_ASSERT\n#else\n#  define BOOST_NO_CXX11_STATIC_ASSERT\n#endif\n\n#if defined(__IBMCPP_RVALUE_REFERENCES)\n#  define BOOST_HAS_RVALUE_REFS\n#else\n#  define BOOST_NO_CXX11_RVALUE_REFERENCES\n#endif\n\n#if !defined(__IBMCPP_SCOPED_ENUM)\n#  define BOOST_NO_CXX11_SCOPED_ENUMS\n#endif\n\n#define BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n\n#if !defined(__IBMCPP_EXPLICIT_CONVERSION_OPERATORS)\n#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#endif\n\n#if !defined(__IBMCPP_DECLTYPE)\n#  define BOOST_NO_CXX11_DECLTYPE\n#else\n#  define BOOST_HAS_DECLTYPE\n#endif\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n\n#if !defined(__IBMCPP_INLINE_NAMESPACE)\n#  define BOOST_NO_CXX11_INLINE_NAMESPACES\n#endif\n\n#if !defined(__IBMCPP_AUTO_TYPEDEDUCTION)\n#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#  define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#  define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#endif\n\n#if !defined(__IBM_CHAR32_T__)\n#  define BOOST_NO_CXX11_CHAR32_T\n#endif\n#if !defined(__IBM_CHAR16_T__)\n#  define BOOST_NO_CXX11_CHAR16_T\n#endif\n\n#if !defined(__IBMCPP_CONSTEXPR)\n#  define BOOST_NO_CXX11_CONSTEXPR\n#endif\n\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#define BOOST_NO_CXX11_UNICODE_LITERALS\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#define BOOST_NO_CXX11_THREAD_LOCAL\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_FINAL\n#define BOOST_NO_CXX11_OVERRIDE\n#define BOOST_NO_CXX11_ALIGNAS\n#define BOOST_NO_CXX11_UNRESTRICTED_UNION\n#define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#define BOOST_NO_CXX14_DECLTYPE_AUTO\n#define BOOST_NO_CXX14_CONSTEXPR\n#define BOOST_NO_CXX14_BINARY_LITERALS\n#define BOOST_NO_CXX17_STRUCTURED_BINDINGS\n#define BOOST_NO_CXX17_INLINE_VARIABLES\n#define BOOST_NO_CXX17_FOLD_EXPRESSIONS\n#define BOOST_NO_CXX17_IF_CONSTEXPR\n\n// -------------------------------------\n\n#if defined(__IBM_ATTRIBUTES)\n#  define BOOST_FORCEINLINE inline __attribute__ ((__always_inline__))\n#  define BOOST_NOINLINE __attribute__ ((__noinline__))\n#  define BOOST_MAY_ALIAS __attribute__((__may_alias__))\n// No BOOST_ALIGNMENT - explicit alignment support is broken (V2R1).\n#endif\n\nextern \"builtin\" long __builtin_expect(long, long);\n\n#define BOOST_LIKELY(x) __builtin_expect((x) && true, 1)\n#define BOOST_UNLIKELY(x) __builtin_expect((x) && true, 0)\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/detail/cxx_composite.hpp",
    "content": "//  This file was automatically generated on Sun Jun  5 16:50:18 2022\n//  by libs/config/tools/generate.cpp\n//  Copyright John Maddock 2002-21.\n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/libs/config for the most recent version.//\n//  Revision $Id$\n//\n\n#if defined(BOOST_NO_ADL_BARRIER)\\\n   || defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)\\\n   || defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)\\\n   || defined(BOOST_NO_COMPLETE_VALUE_INITIALIZATION)\\\n   || defined(BOOST_NO_CTYPE_FUNCTIONS)\\\n   || defined(BOOST_NO_CV_SPECIALIZATIONS)\\\n   || defined(BOOST_NO_CV_VOID_SPECIALIZATIONS)\\\n   || defined(BOOST_NO_CWCHAR)\\\n   || defined(BOOST_NO_CWCTYPE)\\\n   || defined(BOOST_NO_DEPENDENT_NESTED_DERIVATIONS)\\\n   || defined(BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS)\\\n   || defined(BOOST_NO_EXCEPTIONS)\\\n   || defined(BOOST_NO_EXCEPTION_STD_NAMESPACE)\\\n   || defined(BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS)\\\n   || defined(BOOST_NO_FENV_H)\\\n   || defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)\\\n   || defined(BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS)\\\n   || defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)\\\n   || defined(BOOST_NO_INTEGRAL_INT64_T)\\\n   || defined(BOOST_NO_INTRINSIC_WCHAR_T)\\\n   || defined(BOOST_NO_IOSFWD)\\\n   || defined(BOOST_NO_IOSTREAM)\\\n   || defined(BOOST_NO_IS_ABSTRACT)\\\n   || defined(BOOST_NO_LIMITS)\\\n   || defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS)\\\n   || defined(BOOST_NO_LONG_LONG)\\\n   || defined(BOOST_NO_LONG_LONG_NUMERIC_LIMITS)\\\n   || defined(BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS)\\\n   || defined(BOOST_NO_MEMBER_TEMPLATES)\\\n   || defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)\\\n   || defined(BOOST_NO_MEMBER_TEMPLATE_KEYWORD)\\\n   || defined(BOOST_NO_NESTED_FRIENDSHIP)\\\n   || defined(BOOST_NO_OPERATORS_IN_NAMESPACE)\\\n   || defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS)\\\n   || defined(BOOST_NO_POINTER_TO_MEMBER_CONST)\\\n   || defined(BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS)\\\n   || defined(BOOST_NO_PRIVATE_IN_AGGREGATE)\\\n   || defined(BOOST_NO_RESTRICT_REFERENCES)\\\n   || defined(BOOST_NO_RTTI)\\\n   || defined(BOOST_NO_SFINAE)\\\n   || defined(BOOST_NO_SFINAE_EXPR)\\\n   || defined(BOOST_NO_STDC_NAMESPACE)\\\n   || defined(BOOST_NO_STD_ALLOCATOR)\\\n   || defined(BOOST_NO_STD_DISTANCE)\\\n   || defined(BOOST_NO_STD_ITERATOR)\\\n   || defined(BOOST_NO_STD_ITERATOR_TRAITS)\\\n   || defined(BOOST_NO_STD_LOCALE)\\\n   || defined(BOOST_NO_STD_MESSAGES)\\\n   || defined(BOOST_NO_STD_MIN_MAX)\\\n   || defined(BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN)\\\n   || defined(BOOST_NO_STD_TYPEINFO)\\\n   || defined(BOOST_NO_STD_USE_FACET)\\\n   || defined(BOOST_NO_STD_WSTREAMBUF)\\\n   || defined(BOOST_NO_STD_WSTRING)\\\n   || defined(BOOST_NO_STRINGSTREAM)\\\n   || defined(BOOST_NO_TEMPLATED_IOSTREAMS)\\\n   || defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\\\n   || defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\\\n   || defined(BOOST_NO_TEMPLATE_TEMPLATES)\\\n   || defined(BOOST_NO_TWO_PHASE_NAME_LOOKUP)\\\n   || defined(BOOST_NO_TYPEID)\\\n   || defined(BOOST_NO_TYPENAME_WITH_CTOR)\\\n   || defined(BOOST_NO_UNREACHABLE_RETURN_DETECTION)\\\n   || defined(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE)\\\n   || defined(BOOST_NO_USING_TEMPLATE)\\\n   || defined(BOOST_NO_VOID_RETURNS)\n#    define BOOST_NO_CXX03\n#endif\n\n#if defined(BOOST_NO_CXX03)\\\n   || defined(BOOST_NO_CXX11_ADDRESSOF)\\\n   || defined(BOOST_NO_CXX11_ALIGNAS)\\\n   || defined(BOOST_NO_CXX11_ALLOCATOR)\\\n   || defined(BOOST_NO_CXX11_AUTO_DECLARATIONS)\\\n   || defined(BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS)\\\n   || defined(BOOST_NO_CXX11_CHAR16_T)\\\n   || defined(BOOST_NO_CXX11_CHAR32_T)\\\n   || defined(BOOST_NO_CXX11_CONSTEXPR)\\\n   || defined(BOOST_NO_CXX11_DECLTYPE)\\\n   || defined(BOOST_NO_CXX11_DECLTYPE_N3276)\\\n   || defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS)\\\n   || defined(BOOST_NO_CXX11_DEFAULTED_MOVES)\\\n   || defined(BOOST_NO_CXX11_DELETED_FUNCTIONS)\\\n   || defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)\\\n   || defined(BOOST_NO_CXX11_EXTERN_TEMPLATE)\\\n   || defined(BOOST_NO_CXX11_FINAL)\\\n   || defined(BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS)\\\n   || defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS)\\\n   || defined(BOOST_NO_CXX11_HDR_ARRAY)\\\n   || defined(BOOST_NO_CXX11_HDR_ATOMIC)\\\n   || defined(BOOST_NO_CXX11_HDR_CHRONO)\\\n   || defined(BOOST_NO_CXX11_HDR_CONDITION_VARIABLE)\\\n   || defined(BOOST_NO_CXX11_HDR_EXCEPTION)\\\n   || defined(BOOST_NO_CXX11_HDR_FORWARD_LIST)\\\n   || defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)\\\n   || defined(BOOST_NO_CXX11_HDR_FUTURE)\\\n   || defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)\\\n   || defined(BOOST_NO_CXX11_HDR_MUTEX)\\\n   || defined(BOOST_NO_CXX11_HDR_RANDOM)\\\n   || defined(BOOST_NO_CXX11_HDR_RATIO)\\\n   || defined(BOOST_NO_CXX11_HDR_REGEX)\\\n   || defined(BOOST_NO_CXX11_HDR_SYSTEM_ERROR)\\\n   || defined(BOOST_NO_CXX11_HDR_THREAD)\\\n   || defined(BOOST_NO_CXX11_HDR_TUPLE)\\\n   || defined(BOOST_NO_CXX11_HDR_TYPEINDEX)\\\n   || defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)\\\n   || defined(BOOST_NO_CXX11_HDR_UNORDERED_MAP)\\\n   || defined(BOOST_NO_CXX11_HDR_UNORDERED_SET)\\\n   || defined(BOOST_NO_CXX11_INLINE_NAMESPACES)\\\n   || defined(BOOST_NO_CXX11_LAMBDAS)\\\n   || defined(BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS)\\\n   || defined(BOOST_NO_CXX11_NOEXCEPT)\\\n   || defined(BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS)\\\n   || defined(BOOST_NO_CXX11_NULLPTR)\\\n   || defined(BOOST_NO_CXX11_NUMERIC_LIMITS)\\\n   || defined(BOOST_NO_CXX11_OVERRIDE)\\\n   || defined(BOOST_NO_CXX11_POINTER_TRAITS)\\\n   || defined(BOOST_NO_CXX11_RANGE_BASED_FOR)\\\n   || defined(BOOST_NO_CXX11_RAW_LITERALS)\\\n   || defined(BOOST_NO_CXX11_REF_QUALIFIERS)\\\n   || defined(BOOST_NO_CXX11_RVALUE_REFERENCES)\\\n   || defined(BOOST_NO_CXX11_SCOPED_ENUMS)\\\n   || defined(BOOST_NO_CXX11_SFINAE_EXPR)\\\n   || defined(BOOST_NO_CXX11_SMART_PTR)\\\n   || defined(BOOST_NO_CXX11_STATIC_ASSERT)\\\n   || defined(BOOST_NO_CXX11_STD_ALIGN)\\\n   || defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)\\\n   || defined(BOOST_NO_CXX11_THREAD_LOCAL)\\\n   || defined(BOOST_NO_CXX11_TRAILING_RESULT_TYPES)\\\n   || defined(BOOST_NO_CXX11_UNICODE_LITERALS)\\\n   || defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)\\\n   || defined(BOOST_NO_CXX11_UNRESTRICTED_UNION)\\\n   || defined(BOOST_NO_CXX11_USER_DEFINED_LITERALS)\\\n   || defined(BOOST_NO_CXX11_VARIADIC_MACROS)\\\n   || defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)\n#    define BOOST_NO_CXX11\n#endif\n\n#if defined(BOOST_NO_CXX11)\\\n   || defined(BOOST_NO_CXX14_AGGREGATE_NSDMI)\\\n   || defined(BOOST_NO_CXX14_BINARY_LITERALS)\\\n   || defined(BOOST_NO_CXX14_CONSTEXPR)\\\n   || defined(BOOST_NO_CXX14_DECLTYPE_AUTO)\\\n   || defined(BOOST_NO_CXX14_DIGIT_SEPARATORS)\\\n   || defined(BOOST_NO_CXX14_GENERIC_LAMBDAS)\\\n   || defined(BOOST_NO_CXX14_HDR_SHARED_MUTEX)\\\n   || defined(BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES)\\\n   || defined(BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION)\\\n   || defined(BOOST_NO_CXX14_STD_EXCHANGE)\\\n   || defined(BOOST_NO_CXX14_VARIABLE_TEMPLATES)\n#    define BOOST_NO_CXX14\n#endif\n\n#if defined(BOOST_NO_CXX14)\\\n   || defined(BOOST_NO_CXX17_DEDUCTION_GUIDES)\\\n   || defined(BOOST_NO_CXX17_FOLD_EXPRESSIONS)\\\n   || defined(BOOST_NO_CXX17_HDR_ANY)\\\n   || defined(BOOST_NO_CXX17_HDR_CHARCONV)\\\n   || defined(BOOST_NO_CXX17_HDR_EXECUTION)\\\n   || defined(BOOST_NO_CXX17_HDR_FILESYSTEM)\\\n   || defined(BOOST_NO_CXX17_HDR_MEMORY_RESOURCE)\\\n   || defined(BOOST_NO_CXX17_HDR_OPTIONAL)\\\n   || defined(BOOST_NO_CXX17_HDR_STRING_VIEW)\\\n   || defined(BOOST_NO_CXX17_HDR_VARIANT)\\\n   || defined(BOOST_NO_CXX17_IF_CONSTEXPR)\\\n   || defined(BOOST_NO_CXX17_INLINE_VARIABLES)\\\n   || defined(BOOST_NO_CXX17_ITERATOR_TRAITS)\\\n   || defined(BOOST_NO_CXX17_STD_APPLY)\\\n   || defined(BOOST_NO_CXX17_STD_INVOKE)\\\n   || defined(BOOST_NO_CXX17_STRUCTURED_BINDINGS)\n#    define BOOST_NO_CXX17\n#endif\n\n#if defined(BOOST_NO_CXX17)\\\n   || defined(BOOST_NO_CXX20_HDR_BARRIER)\\\n   || defined(BOOST_NO_CXX20_HDR_BIT)\\\n   || defined(BOOST_NO_CXX20_HDR_COMPARE)\\\n   || defined(BOOST_NO_CXX20_HDR_CONCEPTS)\\\n   || defined(BOOST_NO_CXX20_HDR_COROUTINE)\\\n   || defined(BOOST_NO_CXX20_HDR_FORMAT)\\\n   || defined(BOOST_NO_CXX20_HDR_LATCH)\\\n   || defined(BOOST_NO_CXX20_HDR_NUMBERS)\\\n   || defined(BOOST_NO_CXX20_HDR_RANGES)\\\n   || defined(BOOST_NO_CXX20_HDR_SEMAPHORE)\\\n   || defined(BOOST_NO_CXX20_HDR_SOURCE_LOCATION)\\\n   || defined(BOOST_NO_CXX20_HDR_SPAN)\\\n   || defined(BOOST_NO_CXX20_HDR_STOP_TOKEN)\\\n   || defined(BOOST_NO_CXX20_HDR_SYNCSTREAM)\\\n   || defined(BOOST_NO_CXX20_HDR_VERSION)\n#    define BOOST_NO_CXX20\n#endif\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/detail/posix_features.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n\n//  See http://www.boost.org for most recent version.\n\n// All POSIX feature tests go in this file,\n// Note that we test _POSIX_C_SOURCE and _XOPEN_SOURCE as well\n// _POSIX_VERSION and _XOPEN_VERSION: on some systems POSIX API's\n// may be present but none-functional unless _POSIX_C_SOURCE and\n// _XOPEN_SOURCE have been defined to the right value (it's up\n// to the user to do this *before* including any header, although\n// in most cases the compiler will do this for you).\n\n#  if defined(BOOST_HAS_UNISTD_H)\n#     include <unistd.h>\n\n      // XOpen has <nl_types.h>, but is this the correct version check?\n#     if defined(_XOPEN_VERSION) && (_XOPEN_VERSION >= 3)\n#        define BOOST_HAS_NL_TYPES_H\n#     endif\n\n      // POSIX version 6 requires <stdint.h>\n#     if defined(_POSIX_VERSION) && (_POSIX_VERSION >= 200100)\n#        define BOOST_HAS_STDINT_H\n#     endif\n\n      // POSIX version 2 requires <dirent.h>\n#     if defined(_POSIX_VERSION) && (_POSIX_VERSION >= 199009L)\n#        define BOOST_HAS_DIRENT_H\n#     endif\n\n      // POSIX version 3 requires <signal.h> to have sigaction:\n#     if defined(_POSIX_VERSION) && (_POSIX_VERSION >= 199506L)\n#        define BOOST_HAS_SIGACTION\n#     endif\n      // POSIX defines _POSIX_THREADS > 0 for pthread support,\n      // however some platforms define _POSIX_THREADS without\n      // a value, hence the (_POSIX_THREADS+0 >= 0) check.\n      // Strictly speaking this may catch platforms with a\n      // non-functioning stub <pthreads.h>, but such occurrences should\n      // occur very rarely if at all.\n#     if defined(_POSIX_THREADS) && (_POSIX_THREADS+0 >= 0) && !defined(BOOST_HAS_WINTHREADS) && !defined(BOOST_HAS_MPTASKS)\n#        define BOOST_HAS_PTHREADS\n#     endif\n\n      // BOOST_HAS_NANOSLEEP:\n      // This is predicated on _POSIX_TIMERS or _XOPEN_REALTIME:\n#     if (defined(_POSIX_TIMERS) && (_POSIX_TIMERS+0 >= 0)) \\\n             || (defined(_XOPEN_REALTIME) && (_XOPEN_REALTIME+0 >= 0))\n#        define BOOST_HAS_NANOSLEEP\n#     endif\n\n      // BOOST_HAS_CLOCK_GETTIME:\n      // This is predicated on _POSIX_TIMERS (also on _XOPEN_REALTIME\n      // but at least one platform - linux - defines that flag without\n      // defining clock_gettime):\n#     if (defined(_POSIX_TIMERS) && (_POSIX_TIMERS+0 >= 0))\n#        define BOOST_HAS_CLOCK_GETTIME\n#     endif\n\n      // BOOST_HAS_SCHED_YIELD:\n      // This is predicated on _POSIX_PRIORITY_SCHEDULING or\n      // on _POSIX_THREAD_PRIORITY_SCHEDULING or on _XOPEN_REALTIME.\n#     if defined(_POSIX_PRIORITY_SCHEDULING) && (_POSIX_PRIORITY_SCHEDULING+0 > 0)\\\n            || (defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && (_POSIX_THREAD_PRIORITY_SCHEDULING+0 > 0))\\\n            || (defined(_XOPEN_REALTIME) && (_XOPEN_REALTIME+0 >= 0))\n#        define BOOST_HAS_SCHED_YIELD\n#     endif\n\n      // BOOST_HAS_GETTIMEOFDAY:\n      // BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE:\n      // These are predicated on _XOPEN_VERSION, and appears to be first released\n      // in issue 4, version 2 (_XOPEN_VERSION > 500).\n      // Likewise for the functions log1p and expm1.\n#     if defined(_XOPEN_VERSION) && (_XOPEN_VERSION+0 >= 500)\n#        define BOOST_HAS_GETTIMEOFDAY\n#        if defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE+0 >= 500)\n#           define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#        endif\n#        ifndef BOOST_HAS_LOG1P\n#           define BOOST_HAS_LOG1P\n#        endif\n#        ifndef BOOST_HAS_EXPM1\n#           define BOOST_HAS_EXPM1\n#        endif\n#     endif\n\n#  endif\n\n\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/detail/select_compiler_config.hpp",
    "content": "//  Boost compiler configuration selection header file\n\n//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Martin Wille 2003.\n//  (C) Copyright Guillaume Melquiond 2003.\n//\n//  Distributed under the Boost Software License, Version 1.0.\n//  (See accompanying file LICENSE_1_0.txt or copy at\n//   http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/ for most recent version.\n\n// locate which compiler we are using and define\n// BOOST_COMPILER_CONFIG as needed: \n\n#if defined __CUDACC__\n//  NVIDIA CUDA C++ compiler for GPU\n#   include \"boost/config/compiler/nvcc.hpp\"\n\n#endif\n\n#if defined(__GCCXML__)\n// GCC-XML emulates other compilers, it has to appear first here!\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/gcc_xml.hpp\"\n\n#elif defined(_CRAYC)\n// EDG based Cray compiler:\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/cray.hpp\"\n\n#elif defined __COMO__\n//  Comeau C++\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/comeau.hpp\"\n\n#elif defined(__PATHSCALE__) && (__PATHCC__ >= 4)\n// PathScale EKOPath compiler (has to come before clang and gcc)\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/pathscale.hpp\"\n\n#elif defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC)\n//  Intel\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/intel.hpp\"\n\n#elif defined __clang__ && !defined(__ibmxl__) && !defined(__CODEGEARC__)\n//  Clang C++ emulates GCC, so it has to appear early.\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/clang.hpp\"\n\n#elif defined __DMC__\n//  Digital Mars C++\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/digitalmars.hpp\"\n\n#elif defined __DCC__\n//  Wind River Diab C++\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/diab.hpp\"\n\n#elif defined(__PGI)\n//  Portland Group Inc.\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/pgi.hpp\"\n\n# elif defined(__GNUC__) && !defined(__ibmxl__)\n//  GNU C++:\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/gcc.hpp\"\n\n#elif defined __KCC\n//  Kai C++\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/kai.hpp\"\n\n#elif defined __sgi\n//  SGI MIPSpro C++\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/sgi_mipspro.hpp\"\n\n#elif defined __DECCXX\n//  Compaq Tru64 Unix cxx\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/compaq_cxx.hpp\"\n\n#elif defined __ghs\n//  Greenhills C++\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/greenhills.hpp\"\n\n#elif defined __CODEGEARC__\n//  CodeGear - must be checked for before Borland\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/codegear.hpp\"\n\n#elif defined __BORLANDC__\n//  Borland\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/borland.hpp\"\n\n#elif defined  __MWERKS__\n//  Metrowerks CodeWarrior\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/metrowerks.hpp\"\n\n#elif defined  __SUNPRO_CC\n//  Sun Workshop Compiler C++\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/sunpro_cc.hpp\"\n\n#elif defined __HP_aCC\n//  HP aCC\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/hp_acc.hpp\"\n\n#elif defined(__MRC__) || defined(__SC__)\n//  MPW MrCpp or SCpp\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/mpw.hpp\"\n\n#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) && defined(__MVS__)\n//  IBM z/OS XL C/C++\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/xlcpp_zos.hpp\"\n\n#elif defined(__ibmxl__)\n//  IBM XL C/C++ for Linux (Little Endian)\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/xlcpp.hpp\"\n\n#elif defined(__IBMCPP__)\n//  IBM Visual Age or IBM XL C/C++ for Linux (Big Endian)\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/vacpp.hpp\"\n\n#elif defined _MSC_VER\n//  Microsoft Visual C++\n//\n//  Must remain the last #elif since some other vendors (Metrowerks, for\n//  example) also #define _MSC_VER\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/visualc.hpp\"\n\n#elif defined (BOOST_ASSERT_CONFIG)\n// this must come last - generate an error if we don't\n// recognise the compiler:\n#  error \"Unknown compiler - please configure (http://www.boost.org/libs/config/config.htm#configuring) and report the results to the main boost mailing list (http://www.boost.org/more/mailing_lists.htm#main)\"\n\n#endif\n\n#if 0\n//\n// This section allows dependency scanners to find all the headers we *might* include:\n//\n#include <boost/config/compiler/gcc_xml.hpp>\n#include <boost/config/compiler/cray.hpp>\n#include <boost/config/compiler/comeau.hpp>\n#include <boost/config/compiler/pathscale.hpp>\n#include <boost/config/compiler/intel.hpp>\n#include <boost/config/compiler/clang.hpp>\n#include <boost/config/compiler/digitalmars.hpp>\n#include <boost/config/compiler/gcc.hpp>\n#include <boost/config/compiler/kai.hpp>\n#include <boost/config/compiler/sgi_mipspro.hpp>\n#include <boost/config/compiler/compaq_cxx.hpp>\n#include <boost/config/compiler/greenhills.hpp>\n#include <boost/config/compiler/codegear.hpp>\n#include <boost/config/compiler/borland.hpp>\n#include <boost/config/compiler/metrowerks.hpp>\n#include <boost/config/compiler/sunpro_cc.hpp>\n#include <boost/config/compiler/hp_acc.hpp>\n#include <boost/config/compiler/mpw.hpp>\n#include <boost/config/compiler/xlcpp_zos.hpp>\n#include <boost/config/compiler/xlcpp.hpp>\n#include <boost/config/compiler/vacpp.hpp>\n#include <boost/config/compiler/pgi.hpp>\n#include <boost/config/compiler/visualc.hpp>\n\n#endif\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/detail/select_platform_config.hpp",
    "content": "//  Boost compiler configuration selection header file\n\n//  (C) Copyright John Maddock 2001 - 2002. \n//  (C) Copyright Jens Maurer 2001. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n// locate which platform we are on and define BOOST_PLATFORM_CONFIG as needed.\n// Note that we define the headers to include using \"header_name\" not\n// <header_name> in order to prevent macro expansion within the header\n// name (for example \"linux\" is a macro on linux systems).\n\n#if (defined(linux) || defined(__linux) || defined(__linux__) || defined(__GNU__) || defined(__GLIBC__)) && !defined(_CRAYC)\n// linux, also other platforms (Hurd etc) that use GLIBC, should these really have their own config headers though?\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/linux.hpp\"\n\n#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)\n// BSD:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/bsd.hpp\"\n\n#elif defined(sun) || defined(__sun)\n// solaris:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/solaris.hpp\"\n\n#elif defined(__sgi)\n// SGI Irix:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/irix.hpp\"\n\n#elif defined(__hpux)\n// hp unix:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/hpux.hpp\"\n\n#elif defined(__CYGWIN__)\n// cygwin is not win32:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/cygwin.hpp\"\n\n#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)\n// win32:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/win32.hpp\"\n\n#elif defined(__HAIKU__)\n// Haiku\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/haiku.hpp\"\n\n#elif defined(__BEOS__)\n// BeOS\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/beos.hpp\"\n\n#elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)\n// MacOS\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/macos.hpp\"\n\n#elif defined(__TOS_MVS__)\n// IBM z/OS\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/zos.hpp\"\n\n#elif defined(__IBMCPP__) || defined(_AIX)\n// IBM AIX\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/aix.hpp\"\n\n#elif defined(__amigaos__)\n// AmigaOS\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/amigaos.hpp\"\n\n#elif defined(__QNXNTO__)\n// QNX:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/qnxnto.hpp\"\n\n#elif defined(__VXWORKS__)\n// vxWorks:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/vxworks.hpp\"\n\n#elif defined(__SYMBIAN32__) \n// Symbian: \n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/symbian.hpp\" \n\n#elif defined(_CRAYC)\n// Cray:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/cray.hpp\" \n\n#elif defined(__VMS) \n// VMS:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/vms.hpp\" \n\n#elif defined(__CloudABI__)\n// Nuxi CloudABI:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/cloudabi.hpp\"\n\n#elif defined (__wasm__)\n// Web assembly:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/wasm.hpp\"\n\n#else\n\n#  if defined(unix) \\\n      || defined(__unix) \\\n      || defined(_XOPEN_SOURCE) \\\n      || defined(_POSIX_SOURCE)\n\n   // generic unix platform:\n\n#  ifndef BOOST_HAS_UNISTD_H\n#     define BOOST_HAS_UNISTD_H\n#  endif\n\n#  include <boost/config/detail/posix_features.hpp>\n\n#  endif\n\n#  if defined (BOOST_ASSERT_CONFIG)\n      // this must come last - generate an error if we don't\n      // recognise the platform:\n#     error \"Unknown platform - please configure and report the results to boost.org\"\n#  endif\n\n#endif\n\n#if 0\n//\n// This section allows dependency scanners to find all the files we *might* include:\n//\n#  include \"boost/config/platform/linux.hpp\"\n#  include \"boost/config/platform/bsd.hpp\"\n#  include \"boost/config/platform/solaris.hpp\"\n#  include \"boost/config/platform/irix.hpp\"\n#  include \"boost/config/platform/hpux.hpp\"\n#  include \"boost/config/platform/cygwin.hpp\"\n#  include \"boost/config/platform/win32.hpp\"\n#  include \"boost/config/platform/beos.hpp\"\n#  include \"boost/config/platform/macos.hpp\"\n#  include \"boost/config/platform/zos.hpp\"\n#  include \"boost/config/platform/aix.hpp\"\n#  include \"boost/config/platform/amigaos.hpp\"\n#  include \"boost/config/platform/qnxnto.hpp\"\n#  include \"boost/config/platform/vxworks.hpp\"\n#  include \"boost/config/platform/symbian.hpp\" \n#  include \"boost/config/platform/cray.hpp\" \n#  include \"boost/config/platform/vms.hpp\" \n#  include <boost/config/detail/posix_features.hpp>\n\n\n\n#endif\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/detail/select_stdlib_config.hpp",
    "content": "//  Boost compiler configuration selection header file\n\n//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Jens Maurer 2001 - 2002. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n\n//  See http://www.boost.org for most recent version.\n\n// locate which std lib we are using and define BOOST_STDLIB_CONFIG as needed:\n\n// First, check if __has_include is available and <version> include can be located,\n// otherwise include <cstddef> to determine if some version of STLport is in use as the std lib\n// (do not rely on this header being included since users can short-circuit this header \n//  if they know whose std lib they are using.)\n#if defined(__cplusplus) && defined(__has_include)\n#  if __has_include(<version>)\n// It should be safe to include `<version>` when it is present without checking\n// the actual C++ language version as it consists solely of macro definitions.\n// [version.syn] p1: The header <version> supplies implementation-dependent\n// information about the C++ standard library (e.g., version number and release date).\n#    include <version>\n#  else\n#    include <cstddef>\n#  endif\n#elif defined(__cplusplus)\n#  include <cstddef>\n#else\n#  include <stddef.h>\n#endif\n\n#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)\n// STLPort library; this _must_ come first, otherwise since\n// STLport typically sits on top of some other library, we\n// can end up detecting that first rather than STLport:\n#  define BOOST_STDLIB_CONFIG \"boost/config/stdlib/stlport.hpp\"\n\n#else\n\n// If our std lib was not some version of STLport, and has not otherwise\n// been detected, then include <utility> as it is about \n// the smallest of the std lib headers that includes real C++ stuff.\n// Some std libs do not include their C++-related macros in <cstddef> \n// so this additional include makes sure we get those definitions.\n// Note: do not rely on this header being included since users can short-circuit this \n// #include if they know whose std lib they are using.\n#if !defined(__LIBCOMO__) && !defined(__STD_RWCOMPILER_H__) && !defined(_RWSTD_VER)\\\n   && !defined(_LIBCPP_VERSION) && !defined(__GLIBCPP__) && !defined(__GLIBCXX__)\\\n   && !defined(__STL_CONFIG_H) && !defined(__MSL_CPP__) && !defined(__IBMCPP__)\\\n   && !defined(MSIPL_COMPILE_H) && !defined(_YVALS) && !defined(_CPPLIB_VER)\n#include <utility>\n#endif\n\n#if defined(__LIBCOMO__)\n// Comeau STL:\n#define BOOST_STDLIB_CONFIG \"boost/config/stdlib/libcomo.hpp\"\n\n#elif defined(__STD_RWCOMPILER_H__) || defined(_RWSTD_VER)\n// Rogue Wave library:\n#  define BOOST_STDLIB_CONFIG \"boost/config/stdlib/roguewave.hpp\"\n\n#elif defined(_LIBCPP_VERSION)\n// libc++\n#  define BOOST_STDLIB_CONFIG \"boost/config/stdlib/libcpp.hpp\"\n\n#elif defined(__GLIBCPP__) || defined(__GLIBCXX__)\n// GNU libstdc++ 3\n#  define BOOST_STDLIB_CONFIG \"boost/config/stdlib/libstdcpp3.hpp\"\n\n#elif defined(__STL_CONFIG_H)\n// generic SGI STL\n#  define BOOST_STDLIB_CONFIG \"boost/config/stdlib/sgi.hpp\"\n\n#elif defined(__MSL_CPP__)\n// MSL standard lib:\n#  define BOOST_STDLIB_CONFIG \"boost/config/stdlib/msl.hpp\"\n\n#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) && defined(__MVS__)\n// IBM z/OS XL C/C++\n#  define BOOST_STDLIB_CONFIG \"boost/config/stdlib/xlcpp_zos.hpp\"\n\n#elif defined(__IBMCPP__)\n// take the default VACPP std lib\n#  define BOOST_STDLIB_CONFIG \"boost/config/stdlib/vacpp.hpp\"\n\n#elif defined(MSIPL_COMPILE_H)\n// Modena C++ standard library\n#  define BOOST_STDLIB_CONFIG \"boost/config/stdlib/modena.hpp\"\n\n#elif (defined(_YVALS) && !defined(__IBMCPP__)) || defined(_CPPLIB_VER)\n// Dinkumware Library (this has to appear after any possible replacement libraries):\n#  define BOOST_STDLIB_CONFIG \"boost/config/stdlib/dinkumware.hpp\"\n\n#elif defined (BOOST_ASSERT_CONFIG)\n// this must come last - generate an error if we don't\n// recognise the library:\n#  error \"Unknown standard library - please configure and report the results to boost.org\"\n\n#endif\n\n#endif\n\n#if 0\n//\n// This section allows dependency scanners to find all the files we *might* include:\n//\n#  include \"boost/config/stdlib/stlport.hpp\"\n#  include \"boost/config/stdlib/libcomo.hpp\"\n#  include \"boost/config/stdlib/roguewave.hpp\"\n#  include \"boost/config/stdlib/libcpp.hpp\"\n#  include \"boost/config/stdlib/libstdcpp3.hpp\"\n#  include \"boost/config/stdlib/sgi.hpp\"\n#  include \"boost/config/stdlib/msl.hpp\"\n#  include \"boost/config/stdlib/xlcpp_zos.hpp\"\n#  include \"boost/config/stdlib/vacpp.hpp\"\n#  include \"boost/config/stdlib/modena.hpp\"\n#  include \"boost/config/stdlib/dinkumware.hpp\"\n#endif\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/detail/suffix.hpp",
    "content": "//  Boost config.hpp configuration header file  ------------------------------//\n//  boostinspect:ndprecated_macros -- tell the inspect tool to ignore this file\n\n//  Copyright (c) 2001-2003 John Maddock\n//  Copyright (c) 2001 Darin Adler\n//  Copyright (c) 2001 Peter Dimov\n//  Copyright (c) 2002 Bill Kempf\n//  Copyright (c) 2002 Jens Maurer\n//  Copyright (c) 2002-2003 David Abrahams\n//  Copyright (c) 2003 Gennaro Prota\n//  Copyright (c) 2003 Eric Friedman\n//  Copyright (c) 2010 Eric Jourdanneau, Joel Falcou\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/ for most recent version.\n\n//  Boost config.hpp policy and rationale documentation has been moved to\n//  http://www.boost.org/libs/config/\n//\n//  This file is intended to be stable, and relatively unchanging.\n//  It should contain boilerplate code only - no compiler specific\n//  code unless it is unavoidable - no changes unless unavoidable.\n\n#ifndef BOOST_CONFIG_SUFFIX_HPP\n#define BOOST_CONFIG_SUFFIX_HPP\n\n#if defined(__GNUC__) && (__GNUC__ >= 4)\n//\n// Some GCC-4.x versions issue warnings even when __extension__ is used,\n// so use this as a workaround:\n//\n#pragma GCC system_header\n#endif\n\n//\n// ensure that visibility macros are always defined, thus simplifying use\n//\n#ifndef BOOST_SYMBOL_EXPORT\n# define BOOST_SYMBOL_EXPORT\n#endif\n#ifndef BOOST_SYMBOL_IMPORT\n# define BOOST_SYMBOL_IMPORT\n#endif\n#ifndef BOOST_SYMBOL_VISIBLE\n# define BOOST_SYMBOL_VISIBLE\n#endif\n\n//\n// disable explicitly enforced visibility\n//\n#if defined(BOOST_DISABLE_EXPLICIT_SYMBOL_VISIBILITY)\n\n#undef BOOST_SYMBOL_EXPORT\n#define BOOST_SYMBOL_EXPORT\n\n#undef BOOST_SYMBOL_IMPORT\n#define BOOST_SYMBOL_IMPORT\n\n#undef BOOST_SYMBOL_VISIBLE\n#define BOOST_SYMBOL_VISIBLE\n\n#endif\n\n//\n// look for long long by looking for the appropriate macros in <limits.h>.\n// Note that we use limits.h rather than climits for maximal portability,\n// remember that since these just declare a bunch of macros, there should be\n// no namespace issues from this.\n//\n#if !defined(BOOST_HAS_LONG_LONG) && !defined(BOOST_NO_LONG_LONG)                                              \\\n   && !defined(BOOST_MSVC) && !defined(BOOST_BORLANDC)\n# include <limits.h>\n# if (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX))\n#   define BOOST_HAS_LONG_LONG\n# else\n#   define BOOST_NO_LONG_LONG\n# endif\n#endif\n\n// GCC 3.x will clean up all of those nasty macro definitions that\n// BOOST_NO_CTYPE_FUNCTIONS is intended to help work around, so undefine\n// it under GCC 3.x.\n#if defined(__GNUC__) && (__GNUC__ >= 3) && defined(BOOST_NO_CTYPE_FUNCTIONS)\n#  undef BOOST_NO_CTYPE_FUNCTIONS\n#endif\n\n//\n// Assume any extensions are in namespace std:: unless stated otherwise:\n//\n#  ifndef BOOST_STD_EXTENSION_NAMESPACE\n#    define BOOST_STD_EXTENSION_NAMESPACE std\n#  endif\n\n//\n// If cv-qualified specializations are not allowed, then neither are cv-void ones:\n//\n#  if defined(BOOST_NO_CV_SPECIALIZATIONS) \\\n      && !defined(BOOST_NO_CV_VOID_SPECIALIZATIONS)\n#     define BOOST_NO_CV_VOID_SPECIALIZATIONS\n#  endif\n\n//\n// If there is no numeric_limits template, then it can't have any compile time\n// constants either!\n//\n#  if defined(BOOST_NO_LIMITS) \\\n      && !defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS)\n#     define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS\n#     define BOOST_NO_MS_INT64_NUMERIC_LIMITS\n#     define BOOST_NO_LONG_LONG_NUMERIC_LIMITS\n#  endif\n\n//\n// if there is no long long then there is no specialisation\n// for numeric_limits<long long> either:\n//\n#if !defined(BOOST_HAS_LONG_LONG) && !defined(BOOST_NO_LONG_LONG_NUMERIC_LIMITS)\n#  define BOOST_NO_LONG_LONG_NUMERIC_LIMITS\n#endif\n\n//\n// if there is no __int64 then there is no specialisation\n// for numeric_limits<__int64> either:\n//\n#if !defined(BOOST_HAS_MS_INT64) && !defined(BOOST_NO_MS_INT64_NUMERIC_LIMITS)\n#  define BOOST_NO_MS_INT64_NUMERIC_LIMITS\n#endif\n\n//\n// if member templates are supported then so is the\n// VC6 subset of member templates:\n//\n#  if !defined(BOOST_NO_MEMBER_TEMPLATES) \\\n       && !defined(BOOST_MSVC6_MEMBER_TEMPLATES)\n#     define BOOST_MSVC6_MEMBER_TEMPLATES\n#  endif\n\n//\n// Without partial specialization, can't test for partial specialisation bugs:\n//\n#  if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \\\n      && !defined(BOOST_BCB_PARTIAL_SPECIALIZATION_BUG)\n#     define BOOST_BCB_PARTIAL_SPECIALIZATION_BUG\n#  endif\n\n//\n// Without partial specialization, we can't have array-type partial specialisations:\n//\n#  if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \\\n      && !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)\n#     define BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS\n#  endif\n\n//\n// Without partial specialization, std::iterator_traits can't work:\n//\n#  if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \\\n      && !defined(BOOST_NO_STD_ITERATOR_TRAITS)\n#     define BOOST_NO_STD_ITERATOR_TRAITS\n#  endif\n\n//\n// Without partial specialization, partial\n// specialization with default args won't work either:\n//\n#  if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \\\n      && !defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS)\n#     define BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS\n#  endif\n\n//\n// Without member template support, we can't have template constructors\n// in the standard library either:\n//\n#  if defined(BOOST_NO_MEMBER_TEMPLATES) \\\n      && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) \\\n      && !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\n#     define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS\n#  endif\n\n//\n// Without member template support, we can't have a conforming\n// std::allocator template either:\n//\n#  if defined(BOOST_NO_MEMBER_TEMPLATES) \\\n      && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) \\\n      && !defined(BOOST_NO_STD_ALLOCATOR)\n#     define BOOST_NO_STD_ALLOCATOR\n#  endif\n\n//\n// without ADL support then using declarations will break ADL as well:\n//\n#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) && !defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL)\n#  define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL\n#endif\n\n//\n// Without typeid support we have no dynamic RTTI either:\n//\n#if defined(BOOST_NO_TYPEID) && !defined(BOOST_NO_RTTI)\n#  define BOOST_NO_RTTI\n#endif\n\n//\n// If we have a standard allocator, then we have a partial one as well:\n//\n#if !defined(BOOST_NO_STD_ALLOCATOR)\n#  define BOOST_HAS_PARTIAL_STD_ALLOCATOR\n#endif\n\n//\n// We can't have a working std::use_facet if there is no std::locale:\n//\n#  if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_USE_FACET)\n#     define BOOST_NO_STD_USE_FACET\n#  endif\n\n//\n// We can't have a std::messages facet if there is no std::locale:\n//\n#  if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_MESSAGES)\n#     define BOOST_NO_STD_MESSAGES\n#  endif\n\n//\n// We can't have a working std::wstreambuf if there is no std::locale:\n//\n#  if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_WSTREAMBUF)\n#     define BOOST_NO_STD_WSTREAMBUF\n#  endif\n\n//\n// We can't have a <cwctype> if there is no <cwchar>:\n//\n#  if defined(BOOST_NO_CWCHAR) && !defined(BOOST_NO_CWCTYPE)\n#     define BOOST_NO_CWCTYPE\n#  endif\n\n//\n// We can't have a swprintf if there is no <cwchar>:\n//\n#  if defined(BOOST_NO_CWCHAR) && !defined(BOOST_NO_SWPRINTF)\n#     define BOOST_NO_SWPRINTF\n#  endif\n\n//\n// If Win32 support is turned off, then we must turn off\n// threading support also, unless there is some other\n// thread API enabled:\n//\n#if defined(BOOST_DISABLE_WIN32) && defined(_WIN32) \\\n   && !defined(BOOST_DISABLE_THREADS) && !defined(BOOST_HAS_PTHREADS)\n#  define BOOST_DISABLE_THREADS\n#endif\n\n//\n// Turn on threading support if the compiler thinks that it's in\n// multithreaded mode.  We put this here because there are only a\n// limited number of macros that identify this (if there's any missing\n// from here then add to the appropriate compiler section):\n//\n#if (defined(__MT__) || defined(_MT) || defined(_REENTRANT) \\\n    || defined(_PTHREADS) || defined(__APPLE__) || defined(__DragonFly__)) \\\n    && !defined(BOOST_HAS_THREADS)\n#  define BOOST_HAS_THREADS\n#endif\n\n//\n// Turn threading support off if BOOST_DISABLE_THREADS is defined:\n//\n#if defined(BOOST_DISABLE_THREADS) && defined(BOOST_HAS_THREADS)\n#  undef BOOST_HAS_THREADS\n#endif\n\n//\n// Turn threading support off if we don't recognise the threading API:\n//\n#if defined(BOOST_HAS_THREADS) && !defined(BOOST_HAS_PTHREADS)\\\n      && !defined(BOOST_HAS_WINTHREADS) && !defined(BOOST_HAS_BETHREADS)\\\n      && !defined(BOOST_HAS_MPTASKS)\n#  undef BOOST_HAS_THREADS\n#endif\n\n//\n// Turn threading detail macros off if we don't (want to) use threading\n//\n#ifndef BOOST_HAS_THREADS\n#  undef BOOST_HAS_PTHREADS\n#  undef BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#  undef BOOST_HAS_PTHREAD_YIELD\n#  undef BOOST_HAS_PTHREAD_DELAY_NP\n#  undef BOOST_HAS_WINTHREADS\n#  undef BOOST_HAS_BETHREADS\n#  undef BOOST_HAS_MPTASKS\n#endif\n\n//\n// If the compiler claims to be C99 conformant, then it had better\n// have a <stdint.h>:\n//\n#  if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901)\n#     define BOOST_HAS_STDINT_H\n#     ifndef BOOST_HAS_LOG1P\n#        define BOOST_HAS_LOG1P\n#     endif\n#     ifndef BOOST_HAS_EXPM1\n#        define BOOST_HAS_EXPM1\n#     endif\n#  endif\n\n//\n// Define BOOST_NO_SLIST and BOOST_NO_HASH if required.\n// Note that this is for backwards compatibility only.\n//\n#  if !defined(BOOST_HAS_SLIST) && !defined(BOOST_NO_SLIST)\n#     define BOOST_NO_SLIST\n#  endif\n\n#  if !defined(BOOST_HAS_HASH) && !defined(BOOST_NO_HASH)\n#     define BOOST_NO_HASH\n#  endif\n\n//\n// Set BOOST_SLIST_HEADER if not set already:\n//\n#if defined(BOOST_HAS_SLIST) && !defined(BOOST_SLIST_HEADER)\n#  define BOOST_SLIST_HEADER <slist>\n#endif\n\n//\n// Set BOOST_HASH_SET_HEADER if not set already:\n//\n#if defined(BOOST_HAS_HASH) && !defined(BOOST_HASH_SET_HEADER)\n#  define BOOST_HASH_SET_HEADER <hash_set>\n#endif\n\n//\n// Set BOOST_HASH_MAP_HEADER if not set already:\n//\n#if defined(BOOST_HAS_HASH) && !defined(BOOST_HASH_MAP_HEADER)\n#  define BOOST_HASH_MAP_HEADER <hash_map>\n#endif\n\n//  BOOST_HAS_ABI_HEADERS\n//  This macro gets set if we have headers that fix the ABI,\n//  and prevent ODR violations when linking to external libraries:\n#if defined(BOOST_ABI_PREFIX) && defined(BOOST_ABI_SUFFIX) && !defined(BOOST_HAS_ABI_HEADERS)\n#  define BOOST_HAS_ABI_HEADERS\n#endif\n\n#if defined(BOOST_HAS_ABI_HEADERS) && defined(BOOST_DISABLE_ABI_HEADERS)\n#  undef BOOST_HAS_ABI_HEADERS\n#endif\n\n//  BOOST_NO_STDC_NAMESPACE workaround  --------------------------------------//\n//  Because std::size_t usage is so common, even in boost headers which do not\n//  otherwise use the C library, the <cstddef> workaround is included here so\n//  that ugly workaround code need not appear in many other boost headers.\n//  NOTE WELL: This is a workaround for non-conforming compilers; <cstddef>\n//  must still be #included in the usual places so that <cstddef> inclusion\n//  works as expected with standard conforming compilers.  The resulting\n//  double inclusion of <cstddef> is harmless.\n\n# if defined(BOOST_NO_STDC_NAMESPACE) && defined(__cplusplus)\n#   include <cstddef>\n    namespace std { using ::ptrdiff_t; using ::size_t; }\n# endif\n\n//  Workaround for the unfortunate min/max macros defined by some platform headers\n\n#define BOOST_PREVENT_MACRO_SUBSTITUTION\n\n#ifndef BOOST_USING_STD_MIN\n#  define BOOST_USING_STD_MIN() using std::min\n#endif\n\n#ifndef BOOST_USING_STD_MAX\n#  define BOOST_USING_STD_MAX() using std::max\n#endif\n\n//  BOOST_NO_STD_MIN_MAX workaround  -----------------------------------------//\n\n#  if defined(BOOST_NO_STD_MIN_MAX) && defined(__cplusplus)\n\nnamespace std {\n  template <class _Tp>\n  inline const _Tp& min BOOST_PREVENT_MACRO_SUBSTITUTION (const _Tp& __a, const _Tp& __b) {\n    return __b < __a ? __b : __a;\n  }\n  template <class _Tp>\n  inline const _Tp& max BOOST_PREVENT_MACRO_SUBSTITUTION (const _Tp& __a, const _Tp& __b) {\n    return  __a < __b ? __b : __a;\n  }\n}\n\n#  endif\n\n// BOOST_STATIC_CONSTANT workaround --------------------------------------- //\n// On compilers which don't allow in-class initialization of static integral\n// constant members, we must use enums as a workaround if we want the constants\n// to be available at compile-time. This macro gives us a convenient way to\n// declare such constants.\n\n#  ifdef BOOST_NO_INCLASS_MEMBER_INITIALIZATION\n#       define BOOST_STATIC_CONSTANT(type, assignment) enum { assignment }\n#  else\n#     define BOOST_STATIC_CONSTANT(type, assignment) static const type assignment\n#  endif\n\n// BOOST_USE_FACET / HAS_FACET workaround ----------------------------------//\n// When the standard library does not have a conforming std::use_facet there\n// are various workarounds available, but they differ from library to library.\n// The same problem occurs with has_facet.\n// These macros provide a consistent way to access a locale's facets.\n// Usage:\n//    replace\n//       std::use_facet<Type>(loc);\n//    with\n//       BOOST_USE_FACET(Type, loc);\n//    Note do not add a std:: prefix to the front of BOOST_USE_FACET!\n//  Use for BOOST_HAS_FACET is analogous.\n\n#if defined(BOOST_NO_STD_USE_FACET)\n#  ifdef BOOST_HAS_TWO_ARG_USE_FACET\n#     define BOOST_USE_FACET(Type, loc) std::use_facet(loc, static_cast<Type*>(0))\n#     define BOOST_HAS_FACET(Type, loc) std::has_facet(loc, static_cast<Type*>(0))\n#  elif defined(BOOST_HAS_MACRO_USE_FACET)\n#     define BOOST_USE_FACET(Type, loc) std::_USE(loc, Type)\n#     define BOOST_HAS_FACET(Type, loc) std::_HAS(loc, Type)\n#  elif defined(BOOST_HAS_STLP_USE_FACET)\n#     define BOOST_USE_FACET(Type, loc) (*std::_Use_facet<Type >(loc))\n#     define BOOST_HAS_FACET(Type, loc) std::has_facet< Type >(loc)\n#  endif\n#else\n#  define BOOST_USE_FACET(Type, loc) std::use_facet< Type >(loc)\n#  define BOOST_HAS_FACET(Type, loc) std::has_facet< Type >(loc)\n#endif\n\n// BOOST_NESTED_TEMPLATE workaround ------------------------------------------//\n// Member templates are supported by some compilers even though they can't use\n// the A::template member<U> syntax, as a workaround replace:\n//\n// typedef typename A::template rebind<U> binder;\n//\n// with:\n//\n// typedef typename A::BOOST_NESTED_TEMPLATE rebind<U> binder;\n\n#ifndef BOOST_NO_MEMBER_TEMPLATE_KEYWORD\n#  define BOOST_NESTED_TEMPLATE template\n#else\n#  define BOOST_NESTED_TEMPLATE\n#endif\n\n// BOOST_UNREACHABLE_RETURN(x) workaround -------------------------------------//\n// Normally evaluates to nothing, unless BOOST_NO_UNREACHABLE_RETURN_DETECTION\n// is defined, in which case it evaluates to return x; Use when you have a return\n// statement that can never be reached.\n\n#ifndef BOOST_UNREACHABLE_RETURN\n#  ifdef BOOST_NO_UNREACHABLE_RETURN_DETECTION\n#     define BOOST_UNREACHABLE_RETURN(x) return x;\n#  else\n#     define BOOST_UNREACHABLE_RETURN(x)\n#  endif\n#endif\n\n// BOOST_DEDUCED_TYPENAME workaround ------------------------------------------//\n//\n// Some compilers don't support the use of `typename' for dependent\n// types in deduced contexts, e.g.\n//\n//     template <class T> void f(T, typename T::type);\n//                                  ^^^^^^^^\n// Replace these declarations with:\n//\n//     template <class T> void f(T, BOOST_DEDUCED_TYPENAME T::type);\n\n#ifndef BOOST_NO_DEDUCED_TYPENAME\n#  define BOOST_DEDUCED_TYPENAME typename\n#else\n#  define BOOST_DEDUCED_TYPENAME\n#endif\n\n#ifndef BOOST_NO_TYPENAME_WITH_CTOR\n#  define BOOST_CTOR_TYPENAME typename\n#else\n#  define BOOST_CTOR_TYPENAME\n#endif\n\n//\n// If we're on a CUDA device (note DEVICE not HOST, irrespective of compiler) then disable __int128 and __float128 support if present:\n//\n#if defined(__CUDA_ARCH__) && defined(BOOST_HAS_FLOAT128)\n#  undef BOOST_HAS_FLOAT128\n#endif\n#if defined(__CUDA_ARCH__) && defined(BOOST_HAS_INT128)\n#  undef BOOST_HAS_INT128\n#endif\n\n// long long workaround ------------------------------------------//\n// On gcc (and maybe other compilers?) long long is alway supported\n// but it's use may generate either warnings (with -ansi), or errors\n// (with -pedantic -ansi) unless it's use is prefixed by __extension__\n//\n#if defined(BOOST_HAS_LONG_LONG) && defined(__cplusplus)\nnamespace boost{\n#  ifdef __GNUC__\n   __extension__ typedef long long long_long_type;\n   __extension__ typedef unsigned long long ulong_long_type;\n#  else\n   typedef long long long_long_type;\n   typedef unsigned long long ulong_long_type;\n#  endif\n}\n#endif\n// same again for __int128:\n#if defined(BOOST_HAS_INT128) && defined(__cplusplus)\nnamespace boost{\n#  ifdef __GNUC__\n   __extension__ typedef __int128 int128_type;\n   __extension__ typedef unsigned __int128 uint128_type;\n#  else\n   typedef __int128 int128_type;\n   typedef unsigned __int128 uint128_type;\n#  endif\n}\n#endif\n// same again for __float128:\n#if defined(BOOST_HAS_FLOAT128) && defined(__cplusplus)\nnamespace boost {\n#  ifdef __GNUC__\n   __extension__ typedef __float128 float128_type;\n#  else\n   typedef __float128 float128_type;\n#  endif\n}\n#endif\n\n// BOOST_[APPEND_]EXPLICIT_TEMPLATE_[NON_]TYPE macros --------------------------//\n\n// These macros are obsolete. Port away and remove.\n\n#  define BOOST_EXPLICIT_TEMPLATE_TYPE(t)\n#  define BOOST_EXPLICIT_TEMPLATE_TYPE_SPEC(t)\n#  define BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t, v)\n#  define BOOST_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v)\n\n#  define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(t)\n#  define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(t)\n#  define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(t, v)\n#  define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v)\n\n// When BOOST_NO_STD_TYPEINFO is defined, we can just import\n// the global definition into std namespace, \n// see https://svn.boost.org/trac10/ticket/4115\n#if defined(BOOST_NO_STD_TYPEINFO) && defined(__cplusplus) && defined(BOOST_MSVC)\n#include <typeinfo>\nnamespace std{ using ::type_info; }\n// Since we do now have typeinfo, undef the macro:\n#undef BOOST_NO_STD_TYPEINFO\n#endif\n\n// ---------------------------------------------------------------------------//\n\n// Helper macro BOOST_STRINGIZE:\n// Helper macro BOOST_JOIN:\n\n#include <boost/config/helper_macros.hpp>\n\n//\n// Set some default values for compiler/library/platform names.\n// These are for debugging config setup only:\n//\n#  ifndef BOOST_COMPILER\n#     define BOOST_COMPILER \"Unknown ISO C++ Compiler\"\n#  endif\n#  ifndef BOOST_STDLIB\n#     define BOOST_STDLIB \"Unknown ISO standard library\"\n#  endif\n#  ifndef BOOST_PLATFORM\n#     if defined(unix) || defined(__unix) || defined(_XOPEN_SOURCE) \\\n         || defined(_POSIX_SOURCE)\n#        define BOOST_PLATFORM \"Generic Unix\"\n#     else\n#        define BOOST_PLATFORM \"Unknown\"\n#     endif\n#  endif\n\n//\n// Set some default values GPU support\n//\n#  ifndef BOOST_GPU_ENABLED\n#  define BOOST_GPU_ENABLED\n#  endif\n\n// BOOST_RESTRICT ---------------------------------------------//\n// Macro to use in place of 'restrict' keyword variants\n#if !defined(BOOST_RESTRICT)\n#  if defined(_MSC_VER)\n#    define BOOST_RESTRICT __restrict\n#    if !defined(BOOST_NO_RESTRICT_REFERENCES) && (_MSC_FULL_VER < 190023026)\n#      define BOOST_NO_RESTRICT_REFERENCES\n#    endif\n#  elif defined(__GNUC__) && __GNUC__ > 3\n     // Clang also defines __GNUC__ (as 4)\n#    define BOOST_RESTRICT __restrict__\n#  else\n#    define BOOST_RESTRICT\n#    if !defined(BOOST_NO_RESTRICT_REFERENCES)\n#      define BOOST_NO_RESTRICT_REFERENCES\n#    endif\n#  endif\n#endif\n\n// BOOST_MAY_ALIAS -----------------------------------------------//\n// The macro expands to an attribute to mark a type that is allowed to alias other types.\n// The macro is defined in the compiler-specific headers.\n#if !defined(BOOST_MAY_ALIAS)\n#  define BOOST_NO_MAY_ALIAS\n#  define BOOST_MAY_ALIAS\n#endif\n\n// BOOST_FORCEINLINE ---------------------------------------------//\n// Macro to use in place of 'inline' to force a function to be inline\n#if !defined(BOOST_FORCEINLINE)\n#  if defined(_MSC_VER)\n#    define BOOST_FORCEINLINE __forceinline\n#  elif defined(__GNUC__) && __GNUC__ > 3\n     // Clang also defines __GNUC__ (as 4)\n#    define BOOST_FORCEINLINE inline __attribute__ ((__always_inline__))\n#  else\n#    define BOOST_FORCEINLINE inline\n#  endif\n#endif\n\n// BOOST_NOINLINE ---------------------------------------------//\n// Macro to use in place of 'inline' to prevent a function to be inlined\n#if !defined(BOOST_NOINLINE)\n#  if defined(_MSC_VER)\n#    define BOOST_NOINLINE __declspec(noinline)\n#  elif defined(__GNUC__) && __GNUC__ > 3\n     // Clang also defines __GNUC__ (as 4)\n#    if defined(__CUDACC__)\n       // nvcc doesn't always parse __noinline__,\n       // see: https://svn.boost.org/trac/boost/ticket/9392\n#      define BOOST_NOINLINE __attribute__ ((noinline))\n#    elif defined(__HIP__)\n       // See https://github.com/boostorg/config/issues/392\n#      define BOOST_NOINLINE __attribute__ ((noinline))\n#    else\n#      define BOOST_NOINLINE __attribute__ ((__noinline__))\n#    endif\n#  else\n#    define BOOST_NOINLINE\n#  endif\n#endif\n\n// BOOST_NORETURN ---------------------------------------------//\n// Macro to use before a function declaration/definition to designate\n// the function as not returning normally (i.e. with a return statement\n// or by leaving the function scope, if the function return type is void).\n#if !defined(BOOST_NORETURN)\n#  if defined(_MSC_VER)\n#    define BOOST_NORETURN __declspec(noreturn)\n#  elif defined(__GNUC__) || defined(__CODEGEARC__) && defined(__clang__)\n#    define BOOST_NORETURN __attribute__ ((__noreturn__))\n#  elif defined(__has_attribute) && defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x5130)\n#    if __has_attribute(noreturn)\n#      define BOOST_NORETURN [[noreturn]]\n#    endif\n#  elif defined(__has_cpp_attribute) \n#    if __has_cpp_attribute(noreturn)\n#      define BOOST_NORETURN [[noreturn]]\n#    endif\n#  endif\n#endif\n\n#if !defined(BOOST_NORETURN)\n#  define BOOST_NO_NORETURN\n#  define BOOST_NORETURN\n#endif\n\n// BOOST_DEPRECATED -------------------------------------------//\n// The macro can be used to mark deprecated symbols, such as functions, objects and types.\n// Any code that uses these symbols will produce warnings, possibly with a message specified\n// as an argument. The warnings can be suppressed by defining BOOST_ALLOW_DEPRECATED_SYMBOLS\n// or BOOST_ALLOW_DEPRECATED.\n#if !defined(BOOST_DEPRECATED) && __cplusplus >= 201402\n#define BOOST_DEPRECATED(msg) [[deprecated(msg)]]\n#endif\n\n#if defined(BOOST_ALLOW_DEPRECATED_SYMBOLS) || defined(BOOST_ALLOW_DEPRECATED)\n#undef BOOST_DEPRECATED\n#endif\n\n#if !defined(BOOST_DEPRECATED)\n#define BOOST_DEPRECATED(msg)\n#endif\n\n// Branch prediction hints\n// These macros are intended to wrap conditional expressions that yield true or false\n//\n//  if (BOOST_LIKELY(var == 10))\n//  {\n//     // the most probable code here\n//  }\n//\n#if !defined(BOOST_LIKELY)\n#  define BOOST_LIKELY(x) x\n#endif\n#if !defined(BOOST_UNLIKELY)\n#  define BOOST_UNLIKELY(x) x\n#endif\n\n#if !defined(BOOST_NO_CXX11_OVERRIDE)\n#  define BOOST_OVERRIDE override\n#else\n#  define BOOST_OVERRIDE\n#endif\n\n// Type and data alignment specification\n//\n#if !defined(BOOST_ALIGNMENT)\n#  if !defined(BOOST_NO_CXX11_ALIGNAS)\n#    define BOOST_ALIGNMENT(x) alignas(x)\n#  elif defined(_MSC_VER)\n#    define BOOST_ALIGNMENT(x) __declspec(align(x))\n#  elif defined(__GNUC__)\n#    define BOOST_ALIGNMENT(x) __attribute__ ((__aligned__(x)))\n#  else\n#    define BOOST_NO_ALIGNMENT\n#    define BOOST_ALIGNMENT(x)\n#  endif\n#endif\n\n// Lack of non-public defaulted functions is implied by the lack of any defaulted functions\n#if !defined(BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS) && defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS)\n#  define BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS\n#endif\n\n// Lack of defaulted moves is implied by the lack of either rvalue references or any defaulted functions\n#if !defined(BOOST_NO_CXX11_DEFAULTED_MOVES) && (defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) || defined(BOOST_NO_CXX11_RVALUE_REFERENCES))\n#  define BOOST_NO_CXX11_DEFAULTED_MOVES\n#endif\n\n// Defaulted and deleted function declaration helpers\n// These macros are intended to be inside a class definition.\n// BOOST_DEFAULTED_FUNCTION accepts the function declaration and its\n// body, which will be used if the compiler doesn't support defaulted functions.\n// BOOST_DELETED_FUNCTION only accepts the function declaration. It\n// will expand to a private function declaration, if the compiler doesn't support\n// deleted functions. Because of this it is recommended to use BOOST_DELETED_FUNCTION\n// in the end of the class definition.\n//\n//  class my_class\n//  {\n//  public:\n//      // Default-constructible\n//      BOOST_DEFAULTED_FUNCTION(my_class(), {})\n//      // Copying prohibited\n//      BOOST_DELETED_FUNCTION(my_class(my_class const&))\n//      BOOST_DELETED_FUNCTION(my_class& operator= (my_class const&))\n//  };\n//\n#if !(defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) || defined(BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS))\n#   define BOOST_DEFAULTED_FUNCTION(fun, body) fun = default;\n#else\n#   define BOOST_DEFAULTED_FUNCTION(fun, body) fun body\n#endif\n\n#if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS)\n#   define BOOST_DELETED_FUNCTION(fun) fun = delete;\n#else\n#   define BOOST_DELETED_FUNCTION(fun) private: fun;\n#endif\n\n//\n// Set BOOST_NO_DECLTYPE_N3276 when BOOST_NO_DECLTYPE is defined\n//\n#if defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276)\n#define BOOST_NO_CXX11_DECLTYPE_N3276 BOOST_NO_CXX11_DECLTYPE\n#endif\n\n//  -------------------- Deprecated macros for 1.50 ---------------------------\n//  These will go away in a future release\n\n//  Use BOOST_NO_CXX11_HDR_UNORDERED_SET or BOOST_NO_CXX11_HDR_UNORDERED_MAP\n//           instead of BOOST_NO_STD_UNORDERED\n#if defined(BOOST_NO_CXX11_HDR_UNORDERED_MAP) || defined (BOOST_NO_CXX11_HDR_UNORDERED_SET)\n# ifndef BOOST_NO_CXX11_STD_UNORDERED\n#  define BOOST_NO_CXX11_STD_UNORDERED\n# endif\n#endif\n\n//  Use BOOST_NO_CXX11_HDR_INITIALIZER_LIST instead of BOOST_NO_INITIALIZER_LISTS\n#if defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_INITIALIZER_LISTS)\n#  define BOOST_NO_INITIALIZER_LISTS\n#endif\n\n//  Use BOOST_NO_CXX11_HDR_ARRAY instead of BOOST_NO_0X_HDR_ARRAY\n#if defined(BOOST_NO_CXX11_HDR_ARRAY) && !defined(BOOST_NO_0X_HDR_ARRAY)\n#  define BOOST_NO_0X_HDR_ARRAY\n#endif\n//  Use BOOST_NO_CXX11_HDR_CHRONO instead of BOOST_NO_0X_HDR_CHRONO\n#if defined(BOOST_NO_CXX11_HDR_CHRONO) && !defined(BOOST_NO_0X_HDR_CHRONO)\n#  define BOOST_NO_0X_HDR_CHRONO\n#endif\n//  Use BOOST_NO_CXX11_HDR_CODECVT instead of BOOST_NO_0X_HDR_CODECVT\n#if defined(BOOST_NO_CXX11_HDR_CODECVT) && !defined(BOOST_NO_0X_HDR_CODECVT)\n#  define BOOST_NO_0X_HDR_CODECVT\n#endif\n//  Use BOOST_NO_CXX11_HDR_CONDITION_VARIABLE instead of BOOST_NO_0X_HDR_CONDITION_VARIABLE\n#if defined(BOOST_NO_CXX11_HDR_CONDITION_VARIABLE) && !defined(BOOST_NO_0X_HDR_CONDITION_VARIABLE)\n#  define BOOST_NO_0X_HDR_CONDITION_VARIABLE\n#endif\n//  Use BOOST_NO_CXX11_HDR_FORWARD_LIST instead of BOOST_NO_0X_HDR_FORWARD_LIST\n#if defined(BOOST_NO_CXX11_HDR_FORWARD_LIST) && !defined(BOOST_NO_0X_HDR_FORWARD_LIST)\n#  define BOOST_NO_0X_HDR_FORWARD_LIST\n#endif\n//  Use BOOST_NO_CXX11_HDR_FUTURE instead of BOOST_NO_0X_HDR_FUTURE\n#if defined(BOOST_NO_CXX11_HDR_FUTURE) && !defined(BOOST_NO_0X_HDR_FUTURE)\n#  define BOOST_NO_0X_HDR_FUTURE\n#endif\n\n//  Use BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n//  instead of BOOST_NO_0X_HDR_INITIALIZER_LIST or BOOST_NO_INITIALIZER_LISTS\n#ifdef BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n# ifndef BOOST_NO_0X_HDR_INITIALIZER_LIST\n#  define BOOST_NO_0X_HDR_INITIALIZER_LIST\n# endif\n# ifndef BOOST_NO_INITIALIZER_LISTS\n#  define BOOST_NO_INITIALIZER_LISTS\n# endif\n#endif\n\n//  Use BOOST_NO_CXX11_HDR_MUTEX instead of BOOST_NO_0X_HDR_MUTEX\n#if defined(BOOST_NO_CXX11_HDR_MUTEX) && !defined(BOOST_NO_0X_HDR_MUTEX)\n#  define BOOST_NO_0X_HDR_MUTEX\n#endif\n//  Use BOOST_NO_CXX11_HDR_RANDOM instead of BOOST_NO_0X_HDR_RANDOM\n#if defined(BOOST_NO_CXX11_HDR_RANDOM) && !defined(BOOST_NO_0X_HDR_RANDOM)\n#  define BOOST_NO_0X_HDR_RANDOM\n#endif\n//  Use BOOST_NO_CXX11_HDR_RATIO instead of BOOST_NO_0X_HDR_RATIO\n#if defined(BOOST_NO_CXX11_HDR_RATIO) && !defined(BOOST_NO_0X_HDR_RATIO)\n#  define BOOST_NO_0X_HDR_RATIO\n#endif\n//  Use BOOST_NO_CXX11_HDR_REGEX instead of BOOST_NO_0X_HDR_REGEX\n#if defined(BOOST_NO_CXX11_HDR_REGEX) && !defined(BOOST_NO_0X_HDR_REGEX)\n#  define BOOST_NO_0X_HDR_REGEX\n#endif\n//  Use BOOST_NO_CXX11_HDR_SYSTEM_ERROR instead of BOOST_NO_0X_HDR_SYSTEM_ERROR\n#if defined(BOOST_NO_CXX11_HDR_SYSTEM_ERROR) && !defined(BOOST_NO_0X_HDR_SYSTEM_ERROR)\n#  define BOOST_NO_0X_HDR_SYSTEM_ERROR\n#endif\n//  Use BOOST_NO_CXX11_HDR_THREAD instead of BOOST_NO_0X_HDR_THREAD\n#if defined(BOOST_NO_CXX11_HDR_THREAD) && !defined(BOOST_NO_0X_HDR_THREAD)\n#  define BOOST_NO_0X_HDR_THREAD\n#endif\n//  Use BOOST_NO_CXX11_HDR_TUPLE instead of BOOST_NO_0X_HDR_TUPLE\n#if defined(BOOST_NO_CXX11_HDR_TUPLE) && !defined(BOOST_NO_0X_HDR_TUPLE)\n#  define BOOST_NO_0X_HDR_TUPLE\n#endif\n//  Use BOOST_NO_CXX11_HDR_TYPE_TRAITS instead of BOOST_NO_0X_HDR_TYPE_TRAITS\n#if defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS) && !defined(BOOST_NO_0X_HDR_TYPE_TRAITS)\n#  define BOOST_NO_0X_HDR_TYPE_TRAITS\n#endif\n//  Use BOOST_NO_CXX11_HDR_TYPEINDEX instead of BOOST_NO_0X_HDR_TYPEINDEX\n#if defined(BOOST_NO_CXX11_HDR_TYPEINDEX) && !defined(BOOST_NO_0X_HDR_TYPEINDEX)\n#  define BOOST_NO_0X_HDR_TYPEINDEX\n#endif\n//  Use BOOST_NO_CXX11_HDR_UNORDERED_MAP instead of BOOST_NO_0X_HDR_UNORDERED_MAP\n#if defined(BOOST_NO_CXX11_HDR_UNORDERED_MAP) && !defined(BOOST_NO_0X_HDR_UNORDERED_MAP)\n#  define BOOST_NO_0X_HDR_UNORDERED_MAP\n#endif\n//  Use BOOST_NO_CXX11_HDR_UNORDERED_SET instead of BOOST_NO_0X_HDR_UNORDERED_SET\n#if defined(BOOST_NO_CXX11_HDR_UNORDERED_SET) && !defined(BOOST_NO_0X_HDR_UNORDERED_SET)\n#  define BOOST_NO_0X_HDR_UNORDERED_SET\n#endif\n\n//  ------------------ End of deprecated macros for 1.50 ---------------------------\n\n//  -------------------- Deprecated macros for 1.51 ---------------------------\n//  These will go away in a future release\n\n//  Use     BOOST_NO_CXX11_AUTO_DECLARATIONS instead of   BOOST_NO_AUTO_DECLARATIONS\n#if defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) && !defined(BOOST_NO_AUTO_DECLARATIONS)\n#  define BOOST_NO_AUTO_DECLARATIONS\n#endif\n//  Use     BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS instead of   BOOST_NO_AUTO_MULTIDECLARATIONS\n#if defined(BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS) && !defined(BOOST_NO_AUTO_MULTIDECLARATIONS)\n#  define BOOST_NO_AUTO_MULTIDECLARATIONS\n#endif\n//  Use     BOOST_NO_CXX11_CHAR16_T instead of   BOOST_NO_CHAR16_T\n#if defined(BOOST_NO_CXX11_CHAR16_T) && !defined(BOOST_NO_CHAR16_T)\n#  define BOOST_NO_CHAR16_T\n#endif\n//  Use     BOOST_NO_CXX11_CHAR32_T instead of   BOOST_NO_CHAR32_T\n#if defined(BOOST_NO_CXX11_CHAR32_T) && !defined(BOOST_NO_CHAR32_T)\n#  define BOOST_NO_CHAR32_T\n#endif\n//  Use     BOOST_NO_CXX11_TEMPLATE_ALIASES instead of   BOOST_NO_TEMPLATE_ALIASES\n#if defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) && !defined(BOOST_NO_TEMPLATE_ALIASES)\n#  define BOOST_NO_TEMPLATE_ALIASES\n#endif\n//  Use     BOOST_NO_CXX11_CONSTEXPR instead of   BOOST_NO_CONSTEXPR\n#if defined(BOOST_NO_CXX11_CONSTEXPR) && !defined(BOOST_NO_CONSTEXPR)\n#  define BOOST_NO_CONSTEXPR\n#endif\n//  Use     BOOST_NO_CXX11_DECLTYPE_N3276 instead of   BOOST_NO_DECLTYPE_N3276\n#if defined(BOOST_NO_CXX11_DECLTYPE_N3276) && !defined(BOOST_NO_DECLTYPE_N3276)\n#  define BOOST_NO_DECLTYPE_N3276\n#endif\n//  Use     BOOST_NO_CXX11_DECLTYPE instead of   BOOST_NO_DECLTYPE\n#if defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_NO_DECLTYPE)\n#  define BOOST_NO_DECLTYPE\n#endif\n//  Use     BOOST_NO_CXX11_DEFAULTED_FUNCTIONS instead of   BOOST_NO_DEFAULTED_FUNCTIONS\n#if defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) && !defined(BOOST_NO_DEFAULTED_FUNCTIONS)\n#  define BOOST_NO_DEFAULTED_FUNCTIONS\n#endif\n//  Use     BOOST_NO_CXX11_DELETED_FUNCTIONS instead of   BOOST_NO_DELETED_FUNCTIONS\n#if defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) && !defined(BOOST_NO_DELETED_FUNCTIONS)\n#  define BOOST_NO_DELETED_FUNCTIONS\n#endif\n//  Use     BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS instead of   BOOST_NO_EXPLICIT_CONVERSION_OPERATORS\n#if defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS) && !defined(BOOST_NO_EXPLICIT_CONVERSION_OPERATORS)\n#  define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS\n#endif\n//  Use     BOOST_NO_CXX11_EXTERN_TEMPLATE instead of   BOOST_NO_EXTERN_TEMPLATE\n#if defined(BOOST_NO_CXX11_EXTERN_TEMPLATE) && !defined(BOOST_NO_EXTERN_TEMPLATE)\n#  define BOOST_NO_EXTERN_TEMPLATE\n#endif\n//  Use     BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS instead of   BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#if defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS) && !defined(BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS)\n#  define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#endif\n//  Use     BOOST_NO_CXX11_LAMBDAS instead of   BOOST_NO_LAMBDAS\n#if defined(BOOST_NO_CXX11_LAMBDAS) && !defined(BOOST_NO_LAMBDAS)\n#  define BOOST_NO_LAMBDAS\n#endif\n//  Use     BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS instead of   BOOST_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#if defined(BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS) && !defined(BOOST_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS)\n#  define BOOST_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#endif\n//  Use     BOOST_NO_CXX11_NOEXCEPT instead of   BOOST_NO_NOEXCEPT\n#if defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_NOEXCEPT)\n#  define BOOST_NO_NOEXCEPT\n#endif\n//  Use     BOOST_NO_CXX11_NULLPTR instead of   BOOST_NO_NULLPTR\n#if defined(BOOST_NO_CXX11_NULLPTR) && !defined(BOOST_NO_NULLPTR)\n#  define BOOST_NO_NULLPTR\n#endif\n//  Use     BOOST_NO_CXX11_RAW_LITERALS instead of   BOOST_NO_RAW_LITERALS\n#if defined(BOOST_NO_CXX11_RAW_LITERALS) && !defined(BOOST_NO_RAW_LITERALS)\n#  define BOOST_NO_RAW_LITERALS\n#endif\n//  Use     BOOST_NO_CXX11_RVALUE_REFERENCES instead of   BOOST_NO_RVALUE_REFERENCES\n#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_NO_RVALUE_REFERENCES)\n#  define BOOST_NO_RVALUE_REFERENCES\n#endif\n//  Use     BOOST_NO_CXX11_SCOPED_ENUMS instead of   BOOST_NO_SCOPED_ENUMS\n#if defined(BOOST_NO_CXX11_SCOPED_ENUMS) && !defined(BOOST_NO_SCOPED_ENUMS)\n#  define BOOST_NO_SCOPED_ENUMS\n#endif\n//  Use     BOOST_NO_CXX11_STATIC_ASSERT instead of   BOOST_NO_STATIC_ASSERT\n#if defined(BOOST_NO_CXX11_STATIC_ASSERT) && !defined(BOOST_NO_STATIC_ASSERT)\n#  define BOOST_NO_STATIC_ASSERT\n#endif\n//  Use     BOOST_NO_CXX11_STD_UNORDERED instead of   BOOST_NO_STD_UNORDERED\n#if defined(BOOST_NO_CXX11_STD_UNORDERED) && !defined(BOOST_NO_STD_UNORDERED)\n#  define BOOST_NO_STD_UNORDERED\n#endif\n//  Use     BOOST_NO_CXX11_UNICODE_LITERALS instead of   BOOST_NO_UNICODE_LITERALS\n#if defined(BOOST_NO_CXX11_UNICODE_LITERALS) && !defined(BOOST_NO_UNICODE_LITERALS)\n#  define BOOST_NO_UNICODE_LITERALS\n#endif\n//  Use     BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX instead of   BOOST_NO_UNIFIED_INITIALIZATION_SYNTAX\n#if defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) && !defined(BOOST_NO_UNIFIED_INITIALIZATION_SYNTAX)\n#  define BOOST_NO_UNIFIED_INITIALIZATION_SYNTAX\n#endif\n//  Use     BOOST_NO_CXX11_VARIADIC_TEMPLATES instead of   BOOST_NO_VARIADIC_TEMPLATES\n#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_VARIADIC_TEMPLATES)\n#  define BOOST_NO_VARIADIC_TEMPLATES\n#endif\n//  Use     BOOST_NO_CXX11_VARIADIC_MACROS instead of   BOOST_NO_VARIADIC_MACROS\n#if defined(BOOST_NO_CXX11_VARIADIC_MACROS) && !defined(BOOST_NO_VARIADIC_MACROS)\n#  define BOOST_NO_VARIADIC_MACROS\n#endif\n//  Use     BOOST_NO_CXX11_NUMERIC_LIMITS instead of   BOOST_NO_NUMERIC_LIMITS_LOWEST\n#if defined(BOOST_NO_CXX11_NUMERIC_LIMITS) && !defined(BOOST_NO_NUMERIC_LIMITS_LOWEST)\n#  define BOOST_NO_NUMERIC_LIMITS_LOWEST\n#endif\n//  ------------------ End of deprecated macros for 1.51 ---------------------------\n\n\n//\n// Helper macro for marking types and methods final\n//\n#if !defined(BOOST_NO_CXX11_FINAL)\n#  define BOOST_FINAL final\n#else\n#  define BOOST_FINAL\n#endif\n\n//\n// Helper macros BOOST_NOEXCEPT, BOOST_NOEXCEPT_IF, BOOST_NOEXCEPT_EXPR\n// These aid the transition to C++11 while still supporting C++03 compilers\n//\n#ifdef BOOST_NO_CXX11_NOEXCEPT\n#  define BOOST_NOEXCEPT\n#  define BOOST_NOEXCEPT_OR_NOTHROW throw()\n#  define BOOST_NOEXCEPT_IF(Predicate)\n#  define BOOST_NOEXCEPT_EXPR(Expression) false\n#else\n#  define BOOST_NOEXCEPT noexcept\n#  define BOOST_NOEXCEPT_OR_NOTHROW noexcept\n#  define BOOST_NOEXCEPT_IF(Predicate) noexcept((Predicate))\n#  define BOOST_NOEXCEPT_EXPR(Expression) noexcept((Expression))\n#endif\n//\n// Helper macro BOOST_FALLTHROUGH\n// Fallback definition of BOOST_FALLTHROUGH macro used to mark intended\n// fall-through between case labels in a switch statement. We use a definition\n// that requires a semicolon after it to avoid at least one type of misuse even\n// on unsupported compilers.\n//\n#ifndef BOOST_FALLTHROUGH\n#  define BOOST_FALLTHROUGH ((void)0)\n#endif\n\n//\n// constexpr workarounds\n//\n#if defined(BOOST_NO_CXX11_CONSTEXPR)\n#define BOOST_CONSTEXPR\n#define BOOST_CONSTEXPR_OR_CONST const\n#else\n#define BOOST_CONSTEXPR constexpr\n#define BOOST_CONSTEXPR_OR_CONST constexpr\n#endif\n#if defined(BOOST_NO_CXX14_CONSTEXPR)\n#define BOOST_CXX14_CONSTEXPR\n#else\n#define BOOST_CXX14_CONSTEXPR constexpr\n#endif\n\n//\n// C++17 inline variables\n//\n#if !defined(BOOST_NO_CXX17_INLINE_VARIABLES)\n#define BOOST_INLINE_VARIABLE inline\n#else\n#define BOOST_INLINE_VARIABLE\n#endif\n//\n// C++17 if constexpr\n//\n#if !defined(BOOST_NO_CXX17_IF_CONSTEXPR)\n#  define BOOST_IF_CONSTEXPR if constexpr\n#else\n#  define BOOST_IF_CONSTEXPR if\n#endif\n\n#define BOOST_INLINE_CONSTEXPR  BOOST_INLINE_VARIABLE BOOST_CONSTEXPR_OR_CONST\n\n//\n// Unused variable/typedef workarounds:\n//\n#ifndef BOOST_ATTRIBUTE_UNUSED\n#  define BOOST_ATTRIBUTE_UNUSED\n#endif\n//\n// [[nodiscard]]:\n//\n#if defined(__has_attribute) && defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x5130)\n#if __has_attribute(nodiscard)\n# define BOOST_ATTRIBUTE_NODISCARD [[nodiscard]]\n#endif\n#if __has_attribute(no_unique_address)\n# define BOOST_ATTRIBUTE_NO_UNIQUE_ADDRESS [[no_unique_address]]\n#endif\n#elif defined(__has_cpp_attribute)\n// clang-6 accepts [[nodiscard]] with -std=c++14, but warns about it -pedantic\n#if __has_cpp_attribute(nodiscard) && !(defined(__clang__) && (__cplusplus < 201703L)) && !(defined(__GNUC__) && (__cplusplus < 201100))\n# define BOOST_ATTRIBUTE_NODISCARD [[nodiscard]]\n#endif\n#if __has_cpp_attribute(no_unique_address) && !(defined(__GNUC__) && (__cplusplus < 201100))\n# define BOOST_ATTRIBUTE_NO_UNIQUE_ADDRESS [[no_unique_address]]\n#endif\n#endif\n#ifndef BOOST_ATTRIBUTE_NODISCARD\n# define BOOST_ATTRIBUTE_NODISCARD\n#endif\n#ifndef BOOST_ATTRIBUTE_NO_UNIQUE_ADDRESS\n# define BOOST_ATTRIBUTE_NO_UNIQUE_ADDRESS\n#endif\n\n#define BOOST_STATIC_CONSTEXPR  static BOOST_CONSTEXPR_OR_CONST\n\n#if !defined(BOOST_NO_CXX11_NULLPTR)\n# define BOOST_NULLPTR nullptr\n#else\n# define BOOST_NULLPTR 0\n#endif\n\n//\n// Set BOOST_HAS_STATIC_ASSERT when BOOST_NO_CXX11_STATIC_ASSERT is not defined\n//\n#if !defined(BOOST_NO_CXX11_STATIC_ASSERT) && !defined(BOOST_HAS_STATIC_ASSERT)\n#  define BOOST_HAS_STATIC_ASSERT\n#endif\n\n//\n// Set BOOST_HAS_RVALUE_REFS when BOOST_NO_CXX11_RVALUE_REFERENCES is not defined\n//\n#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_HAS_RVALUE_REFS)\n#define BOOST_HAS_RVALUE_REFS\n#endif\n\n//\n// Set BOOST_HAS_VARIADIC_TMPL when BOOST_NO_CXX11_VARIADIC_TEMPLATES is not defined\n//\n#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_HAS_VARIADIC_TMPL)\n#define BOOST_HAS_VARIADIC_TMPL\n#endif\n//\n// Set BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS when\n// BOOST_NO_CXX11_VARIADIC_TEMPLATES is set:\n//\n#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS)\n#  define BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS\n#endif\n\n// This is a catch all case for obsolete compilers / std libs:\n#if !defined(_YVALS) && !defined(_CPPLIB_VER)  // msvc std lib already configured\n#if (!defined(__has_include) || (__cplusplus < 201700))\n#  define BOOST_NO_CXX17_HDR_OPTIONAL\n#  define BOOST_NO_CXX17_HDR_STRING_VIEW\n#  define BOOST_NO_CXX17_HDR_VARIANT\n#  define BOOST_NO_CXX17_HDR_ANY\n#  define BOOST_NO_CXX17_HDR_MEMORY_RESOURCE\n#  define BOOST_NO_CXX17_HDR_CHARCONV\n#  define BOOST_NO_CXX17_HDR_EXECUTION\n#  define BOOST_NO_CXX17_HDR_FILESYSTEM\n#else\n#if !__has_include(<optional>)\n#  define BOOST_NO_CXX17_HDR_OPTIONAL\n#endif\n#if !__has_include(<string_view>)\n#  define BOOST_NO_CXX17_HDR_STRING_VIEW\n#endif\n#if !__has_include(<variant>)\n#  define BOOST_NO_CXX17_HDR_VARIANT\n#endif\n#if !__has_include(<any>)\n#  define BOOST_NO_CXX17_HDR_ANY\n#endif\n#if !__has_include(<memory_resource>)\n#  define BOOST_NO_CXX17_HDR_MEMORY_RESOURCE\n#endif\n#if !__has_include(<charconv>)\n#  define BOOST_NO_CXX17_HDR_CHARCONV\n#endif\n#if !__has_include(<execution>)\n#  define BOOST_NO_CXX17_HDR_EXECUTION\n#endif\n#if !__has_include(<filesystem>)\n#  define BOOST_NO_CXX17_HDR_FILESYSTEM\n#endif\n#endif\n#endif\n//\n// Define the std level that the compiler claims to support:\n//\n#ifndef BOOST_CXX_VERSION\n#  define BOOST_CXX_VERSION __cplusplus\n#endif\n\n#if (!defined(__has_include) || (BOOST_CXX_VERSION < 201704))\n#  define BOOST_NO_CXX20_HDR_BARRIER\n#  define BOOST_NO_CXX20_HDR_FORMAT\n#  define BOOST_NO_CXX20_HDR_SOURCE_LOCATION\n#  define BOOST_NO_CXX20_HDR_BIT\n#  define BOOST_NO_CXX20_HDR_LATCH\n#  define BOOST_NO_CXX20_HDR_SPAN\n#  define BOOST_NO_CXX20_HDR_COMPARE\n#  define BOOST_NO_CXX20_HDR_NUMBERS\n#  define BOOST_NO_CXX20_HDR_STOP_TOKEN\n#  define BOOST_NO_CXX20_HDR_CONCEPTS\n#  define BOOST_NO_CXX20_HDR_RANGES\n#  define BOOST_NO_CXX20_HDR_SYNCSTREAM\n#  define BOOST_NO_CXX20_HDR_COROUTINE\n#  define BOOST_NO_CXX20_HDR_SEMAPHORE\n#else\n#if (!__has_include(<barrier>) || !defined(__cpp_lib_barrier) || (__cpp_lib_barrier < 201907L)) && !defined(BOOST_NO_CXX20_HDR_BARRIER)\n#  define BOOST_NO_CXX20_HDR_BARRIER\n#endif\n#if (!__has_include(<format>) || !defined(__cpp_lib_format) || (__cpp_lib_format < 201907L)) && !defined(BOOST_NO_CXX20_HDR_FORMAT)\n#  define BOOST_NO_CXX20_HDR_FORMAT\n#endif\n#if (!__has_include(<source_location>) || !defined(__cpp_lib_source_location) || (__cpp_lib_source_location < 201907L)) && !defined(BOOST_NO_CXX20_HDR_SOURCE_LOCATION)\n#  define BOOST_NO_CXX20_HDR_SOURCE_LOCATION\n#endif\n#if (!__has_include(<bit>) || !defined(__cpp_lib_bit_cast) || (__cpp_lib_bit_cast < 201806L) || !defined(__cpp_lib_bitops) || (__cpp_lib_bitops < 201907L) || !defined(__cpp_lib_endian) || (__cpp_lib_endian < 201907L)) && !defined(BOOST_NO_CXX20_HDR_BIT)\n#  define BOOST_NO_CXX20_HDR_BIT\n#endif\n#if (!__has_include(<latch>) || !defined(__cpp_lib_latch) || (__cpp_lib_latch < 201907L)) && !defined(BOOST_NO_CXX20_HDR_LATCH)\n#  define BOOST_NO_CXX20_HDR_LATCH\n#endif\n#if (!__has_include(<span>) || !defined(__cpp_lib_span) || (__cpp_lib_span < 202002L)) && !defined(BOOST_NO_CXX20_HDR_SPAN)\n#  define BOOST_NO_CXX20_HDR_SPAN\n#endif\n#if (!__has_include(<compare>) || !defined(__cpp_lib_three_way_comparison) || (__cpp_lib_three_way_comparison < 201907L)) && !defined(BOOST_NO_CXX20_HDR_COMPARE)\n#  define BOOST_NO_CXX20_HDR_COMPARE\n#endif\n#if (!__has_include(<numbers>) || !defined(__cpp_lib_math_constants) || (__cpp_lib_math_constants < 201907L)) && !defined(BOOST_NO_CXX20_HDR_NUMBERS)\n#  define BOOST_NO_CXX20_HDR_NUMBERS\n#endif\n#if (!__has_include(<stop_token>) || !defined(__cpp_lib_jthread) || (__cpp_lib_jthread < 201911L)) && !defined(BOOST_NO_CXX20_HDR_STOP_TOKEN)\n#  define BOOST_NO_CXX20_HDR_STOP_TOKEN\n#endif\n#if (!__has_include(<concepts>) || !defined(__cpp_lib_concepts) || (__cpp_lib_concepts < 202002L)) && !defined(_YVALS) && !defined(_CPPLIB_VER) && !defined(BOOST_NO_CXX20_HDR_CONCEPTS)\n#  define BOOST_NO_CXX20_HDR_CONCEPTS\n#endif\n#if (!__has_include(<ranges>) || !defined(__cpp_lib_ranges) || (__cpp_lib_ranges < 201911L)) && !defined(BOOST_NO_CXX20_HDR_RANGES)\n#  define BOOST_NO_CXX20_HDR_RANGES\n#endif\n#if (!__has_include(<syncstream>) || !defined(__cpp_lib_syncbuf) || (__cpp_lib_syncbuf < 201803L)) && !defined(BOOST_NO_CXX20_HDR_SYNCSTREAM)\n#  define BOOST_NO_CXX20_HDR_SYNCSTREAM\n#endif\n#if (!__has_include(<coroutine>) || !defined(__cpp_lib_coroutine) || (__cpp_lib_coroutine < 201902L)) && !defined(BOOST_NO_CXX20_HDR_COROUTINE)\n#  define BOOST_NO_CXX20_HDR_COROUTINE\n#endif\n#if (!__has_include(<semaphore>) || !defined(__cpp_lib_semaphore) || (__cpp_lib_semaphore < 201907L)) && !defined(BOOST_NO_CXX20_HDR_SEMAPHORE)\n#  define BOOST_NO_CXX20_HDR_SEMAPHORE\n#endif\n#endif\n\n#if defined(__cplusplus) && defined(__has_include)\n#if !__has_include(<version>)\n#  define BOOST_NO_CXX20_HDR_VERSION\n#else\n// For convenience, this is always included:\n#  include <version>\n#endif\n#else\n#  define BOOST_NO_CXX20_HDR_VERSION\n#endif\n\n#if defined(BOOST_MSVC)\n#if (BOOST_MSVC < 1914) || (_MSVC_LANG < 201703)\n#  define BOOST_NO_CXX17_DEDUCTION_GUIDES\n#endif\n#elif !defined(__cpp_deduction_guides) || (__cpp_deduction_guides < 201606)\n#  define BOOST_NO_CXX17_DEDUCTION_GUIDES\n#endif\n\n//\n// Define composite agregate macros:\n//\n#include <boost/config/detail/cxx_composite.hpp>\n\n//\n// Finish off with checks for macros that are depricated / no longer supported,\n// if any of these are set then it's very likely that much of Boost will no\n// longer work.  So stop with a #error for now, but give the user a chance\n// to continue at their own risk if they really want to:\n//\n#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_CONFIG_ALLOW_DEPRECATED)\n#  error \"You are using a compiler which lacks features which are now a minimum requirement in order to use Boost, define BOOST_CONFIG_ALLOW_DEPRECATED if you want to continue at your own risk!!!\"\n#endif\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/header_deprecated.hpp",
    "content": "#ifndef BOOST_CONFIG_HEADER_DEPRECATED_HPP_INCLUDED\n#define BOOST_CONFIG_HEADER_DEPRECATED_HPP_INCLUDED\n\n//  Copyright 2017 Peter Dimov.\n//\n//  Distributed under the Boost Software License, Version 1.0.\n//\n//  See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt\n//\n//  BOOST_HEADER_DEPRECATED(\"<alternative>\")\n//\n//  Expands to the equivalent of\n//    BOOST_PRAGMA_MESSAGE(\"This header is deprecated. Use <alternative> instead.\")\n//\n//  Note that this header is C compatible.\n\n#include <boost/config/pragma_message.hpp>\n\n#if defined(BOOST_ALLOW_DEPRECATED_HEADERS) || defined(BOOST_ALLOW_DEPRECATED)\n# define BOOST_HEADER_DEPRECATED(a)\n#else\n# define BOOST_HEADER_DEPRECATED(a) BOOST_PRAGMA_MESSAGE(\"This header is deprecated. Use \" a \" instead.\")\n#endif\n\n#endif // BOOST_CONFIG_HEADER_DEPRECATED_HPP_INCLUDED\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/helper_macros.hpp",
    "content": "#ifndef BOOST_CONFIG_HELPER_MACROS_HPP_INCLUDED\n#define BOOST_CONFIG_HELPER_MACROS_HPP_INCLUDED\n\n//  Copyright 2001 John Maddock.\n//  Copyright 2017 Peter Dimov.\n//\n//  Distributed under the Boost Software License, Version 1.0.\n//\n//  See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt\n//\n//  BOOST_STRINGIZE(X)\n//  BOOST_JOIN(X, Y)\n//\n//  Note that this header is C compatible.\n\n//\n// Helper macro BOOST_STRINGIZE:\n// Converts the parameter X to a string after macro replacement\n// on X has been performed.\n//\n#define BOOST_STRINGIZE(X) BOOST_DO_STRINGIZE(X)\n#define BOOST_DO_STRINGIZE(X) #X\n\n//\n// Helper macro BOOST_JOIN:\n// The following piece of macro magic joins the two\n// arguments together, even when one of the arguments is\n// itself a macro (see 16.3.1 in C++ standard).  The key\n// is that macro expansion of macro arguments does not\n// occur in BOOST_DO_JOIN2 but does in BOOST_DO_JOIN.\n//\n#define BOOST_JOIN(X, Y) BOOST_DO_JOIN(X, Y)\n#define BOOST_DO_JOIN(X, Y) BOOST_DO_JOIN2(X,Y)\n#define BOOST_DO_JOIN2(X, Y) X##Y\n\n#endif // BOOST_CONFIG_HELPER_MACROS_HPP_INCLUDED\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/no_tr1/cmath.hpp",
    "content": "//  (C) Copyright John Maddock 2008.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// The aim of this header is just to include <cmath> but to do\n// so in a way that does not result in recursive inclusion of\n// the Boost TR1 components if boost/tr1/tr1/cmath is in the\n// include search path.  We have to do this to avoid circular\n// dependencies:\n//\n\n#ifndef BOOST_CONFIG_CMATH\n#  define BOOST_CONFIG_CMATH\n\n#  ifndef BOOST_TR1_NO_RECURSION\n#     define BOOST_TR1_NO_RECURSION\n#     define BOOST_CONFIG_NO_CMATH_RECURSION\n#  endif\n\n#  include <cmath>\n\n#  ifdef BOOST_CONFIG_NO_CMATH_RECURSION\n#     undef BOOST_TR1_NO_RECURSION\n#     undef BOOST_CONFIG_NO_CMATH_RECURSION\n#  endif\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/no_tr1/complex.hpp",
    "content": "//  (C) Copyright John Maddock 2005.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// The aim of this header is just to include <complex> but to do\n// so in a way that does not result in recursive inclusion of\n// the Boost TR1 components if boost/tr1/tr1/complex is in the\n// include search path.  We have to do this to avoid circular\n// dependencies:\n//\n\n#ifndef BOOST_CONFIG_COMPLEX\n#  define BOOST_CONFIG_COMPLEX\n\n#  ifndef BOOST_TR1_NO_RECURSION\n#     define BOOST_TR1_NO_RECURSION\n#     define BOOST_CONFIG_NO_COMPLEX_RECURSION\n#  endif\n\n#  include <complex>\n\n#  ifdef BOOST_CONFIG_NO_COMPLEX_RECURSION\n#     undef BOOST_TR1_NO_RECURSION\n#     undef BOOST_CONFIG_NO_COMPLEX_RECURSION\n#  endif\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/no_tr1/functional.hpp",
    "content": "//  (C) Copyright John Maddock 2005.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// The aim of this header is just to include <functional> but to do\n// so in a way that does not result in recursive inclusion of\n// the Boost TR1 components if boost/tr1/tr1/functional is in the\n// include search path.  We have to do this to avoid circular\n// dependencies:\n//\n\n#ifndef BOOST_CONFIG_FUNCTIONAL\n#  define BOOST_CONFIG_FUNCTIONAL\n\n#  ifndef BOOST_TR1_NO_RECURSION\n#     define BOOST_TR1_NO_RECURSION\n#     define BOOST_CONFIG_NO_FUNCTIONAL_RECURSION\n#  endif\n\n#  include <functional>\n\n#  ifdef BOOST_CONFIG_NO_FUNCTIONAL_RECURSION\n#     undef BOOST_TR1_NO_RECURSION\n#     undef BOOST_CONFIG_NO_FUNCTIONAL_RECURSION\n#  endif\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/no_tr1/memory.hpp",
    "content": "//  (C) Copyright John Maddock 2005.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// The aim of this header is just to include <memory> but to do\n// so in a way that does not result in recursive inclusion of\n// the Boost TR1 components if boost/tr1/tr1/memory is in the\n// include search path.  We have to do this to avoid circular\n// dependencies:\n//\n\n#ifndef BOOST_CONFIG_MEMORY\n#  define BOOST_CONFIG_MEMORY\n\n#  ifndef BOOST_TR1_NO_RECURSION\n#     define BOOST_TR1_NO_RECURSION\n#     define BOOST_CONFIG_NO_MEMORY_RECURSION\n#  endif\n\n#  include <memory>\n\n#  ifdef BOOST_CONFIG_NO_MEMORY_RECURSION\n#     undef BOOST_TR1_NO_RECURSION\n#     undef BOOST_CONFIG_NO_MEMORY_RECURSION\n#  endif\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/no_tr1/utility.hpp",
    "content": "//  (C) Copyright John Maddock 2005.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// The aim of this header is just to include <utility> but to do\n// so in a way that does not result in recursive inclusion of\n// the Boost TR1 components if boost/tr1/tr1/utility is in the\n// include search path.  We have to do this to avoid circular\n// dependencies:\n//\n\n#ifndef BOOST_CONFIG_UTILITY\n#  define BOOST_CONFIG_UTILITY\n\n#  ifndef BOOST_TR1_NO_RECURSION\n#     define BOOST_TR1_NO_RECURSION\n#     define BOOST_CONFIG_NO_UTILITY_RECURSION\n#  endif\n\n#  include <utility>\n\n#  ifdef BOOST_CONFIG_NO_UTILITY_RECURSION\n#     undef BOOST_TR1_NO_RECURSION\n#     undef BOOST_CONFIG_NO_UTILITY_RECURSION\n#  endif\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/platform/aix.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2002. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  IBM/Aix specific config options:\n\n#define BOOST_PLATFORM \"IBM Aix\"\n\n#define BOOST_HAS_UNISTD_H\n#define BOOST_HAS_NL_TYPES_H\n#define BOOST_HAS_NANOSLEEP\n#define BOOST_HAS_CLOCK_GETTIME\n\n// This needs support in \"boost/cstdint.hpp\" exactly like FreeBSD.\n// This platform has header named <inttypes.h> which includes all\n// the things needed.\n#define BOOST_HAS_STDINT_H\n\n// Threading API's:\n#define BOOST_HAS_PTHREADS\n#define BOOST_HAS_PTHREAD_DELAY_NP\n#define BOOST_HAS_SCHED_YIELD\n//#define BOOST_HAS_PTHREAD_YIELD\n\n// boilerplate code:\n#include <boost/config/detail/posix_features.hpp>\n\n\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/platform/amigaos.hpp",
    "content": "//  (C) Copyright John Maddock 2002. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n#define BOOST_PLATFORM \"AmigaOS\"\n\n#define BOOST_DISABLE_THREADS\n#define BOOST_NO_CWCHAR\n#define BOOST_NO_STD_WSTRING\n#define BOOST_NO_INTRINSIC_WCHAR_T\n \n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/platform/beos.hpp",
    "content": "//  (C) Copyright John Maddock 2001. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  BeOS specific config options:\n\n#define BOOST_PLATFORM \"BeOS\"\n\n#define BOOST_NO_CWCHAR\n#define BOOST_NO_CWCTYPE\n#define BOOST_HAS_UNISTD_H\n\n#define BOOST_HAS_BETHREADS\n\n#ifndef BOOST_DISABLE_THREADS\n#  define BOOST_HAS_THREADS\n#endif\n\n// boilerplate code:\n#include <boost/config/detail/posix_features.hpp>\n \n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/platform/bsd.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Darin Adler 2001. \n//  (C) Copyright Douglas Gregor 2002. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  generic BSD config options:\n\n#if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__DragonFly__)\n#error \"This platform is not BSD\"\n#endif\n\n#ifdef __FreeBSD__\n#define BOOST_PLATFORM \"FreeBSD \" BOOST_STRINGIZE(__FreeBSD__)\n#elif defined(__NetBSD__)\n#define BOOST_PLATFORM \"NetBSD \" BOOST_STRINGIZE(__NetBSD__)\n#elif defined(__OpenBSD__)\n#define BOOST_PLATFORM \"OpenBSD \" BOOST_STRINGIZE(__OpenBSD__)\n#elif defined(__DragonFly__)\n#define BOOST_PLATFORM \"DragonFly \" BOOST_STRINGIZE(__DragonFly__)\n#endif\n\n//\n// is this the correct version check?\n// FreeBSD has <nl_types.h> but does not\n// advertise the fact in <unistd.h>:\n//\n#if (defined(__FreeBSD__) && (__FreeBSD__ >= 3)) \\\n   || defined(__OpenBSD__) || defined(__DragonFly__)\n#  define BOOST_HAS_NL_TYPES_H\n#endif\n\n//\n// FreeBSD 3.x has pthreads support, but defines _POSIX_THREADS in <pthread.h>\n// and not in <unistd.h>\n//\n#if (defined(__FreeBSD__) && (__FreeBSD__ <= 3))\\\n   || defined(__OpenBSD__) || defined(__DragonFly__) \n#  define BOOST_HAS_PTHREADS\n#endif\n\n//\n// No wide character support in the BSD header files:\n//\n#if defined(__NetBSD__)\n#define __NetBSD_GCC__ (__GNUC__         * 1000000 \\\n                       + __GNUC_MINOR__ *    1000 \\\n                       + __GNUC_PATCHLEVEL__)\n// XXX - the following is required until c++config.h\n//       defines _GLIBCXX_HAVE_SWPRINTF and friends\n//       or the preprocessor conditionals are removed\n//       from the cwchar header.\n#define _GLIBCXX_HAVE_SWPRINTF 1\n#endif\n\n#if !((defined(__FreeBSD__) && (__FreeBSD__ >= 5)) \\\n      || (defined(__NetBSD_GCC__) && (__NetBSD_GCC__ >= 2095003)) \\\n      || defined(__OpenBSD__) || defined(__DragonFly__))\n#  define BOOST_NO_CWCHAR\n#endif\n//\n// The BSD <ctype.h> has macros only, no functions:\n//\n#if !defined(__OpenBSD__) || defined(__DragonFly__)\n#  define BOOST_NO_CTYPE_FUNCTIONS\n#endif\n\n//\n// thread API's not auto detected:\n//\n#define BOOST_HAS_SCHED_YIELD\n#define BOOST_HAS_NANOSLEEP\n#define BOOST_HAS_GETTIMEOFDAY\n#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#define BOOST_HAS_SIGACTION\n#define BOOST_HAS_CLOCK_GETTIME\n\n// boilerplate code:\n#define BOOST_HAS_UNISTD_H\n#include <boost/config/detail/posix_features.hpp>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/platform/cloudabi.hpp",
    "content": "//       Copyright Nuxi, https://nuxi.nl/ 2015.\n// Distributed under the Boost Software License, Version 1.0.\n//    (See accompanying file LICENSE_1_0.txt or copy at\n//          http://www.boost.org/LICENSE_1_0.txt)\n\n#define BOOST_PLATFORM \"CloudABI\"\n\n#define BOOST_HAS_DIRENT_H\n#define BOOST_HAS_STDINT_H\n#define BOOST_HAS_UNISTD_H\n\n#define BOOST_HAS_CLOCK_GETTIME\n#define BOOST_HAS_EXPM1\n#define BOOST_HAS_GETTIMEOFDAY\n#define BOOST_HAS_LOG1P\n#define BOOST_HAS_NANOSLEEP\n#define BOOST_HAS_PTHREADS\n#define BOOST_HAS_SCHED_YIELD\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/platform/cray.hpp",
    "content": "//  (C) Copyright John Maddock 2011.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n\n//  See http://www.boost.org for most recent version.\n\n//  SGI Irix specific config options:\n\n#define BOOST_PLATFORM \"Cray\"\n\n// boilerplate code:\n#define BOOST_HAS_UNISTD_H\n#include <boost/config/detail/posix_features.hpp>\n\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/platform/cygwin.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  cygwin specific config options:\n\n#define BOOST_PLATFORM \"Cygwin\"\n#define BOOST_HAS_DIRENT_H\n#define BOOST_HAS_LOG1P\n#define BOOST_HAS_EXPM1\n\n//\n// Threading API:\n// See if we have POSIX threads, if we do use them, otherwise\n// revert to native Win threads.\n#define BOOST_HAS_UNISTD_H\n#include <unistd.h>\n#if defined(_POSIX_THREADS) && (_POSIX_THREADS+0 >= 0) && !defined(BOOST_HAS_WINTHREADS)\n#  define BOOST_HAS_PTHREADS\n#  define BOOST_HAS_SCHED_YIELD\n#  define BOOST_HAS_GETTIMEOFDAY\n#  define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n//#  define BOOST_HAS_SIGACTION\n#else\n#  if !defined(BOOST_HAS_WINTHREADS)\n#     define BOOST_HAS_WINTHREADS\n#  endif\n#  define BOOST_HAS_FTIME\n#endif\n\n//\n// find out if we have a stdint.h, there should be a better way to do this:\n//\n#include <sys/types.h>\n#ifdef _STDINT_H\n#define BOOST_HAS_STDINT_H\n#endif\n#if __GNUC__ > 5 && !defined(BOOST_HAS_STDINT_H)\n#   define BOOST_HAS_STDINT_H\n#endif\n\n#include <cygwin/version.h>\n#if (CYGWIN_VERSION_API_MAJOR == 0 && CYGWIN_VERSION_API_MINOR < 231)\n/// Cygwin has no fenv.h\n#define BOOST_NO_FENV_H\n#endif\n\n// Cygwin has it's own <pthread.h> which breaks <shared_mutex> unless the correct compiler flags are used:\n#ifndef BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#include <pthread.h>\n#if !(__XSI_VISIBLE >= 500 || __POSIX_VISIBLE >= 200112)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#endif\n\n// boilerplate code:\n#include <boost/config/detail/posix_features.hpp>\n\n//\n// Cygwin lies about XSI conformance, there is no nl_types.h:\n//\n#ifdef BOOST_HAS_NL_TYPES_H\n#  undef BOOST_HAS_NL_TYPES_H\n#endif\n\n\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/platform/haiku.hpp",
    "content": "//  (C) Copyright Jessica Hamilton 2014.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Haiku specific config options:\n\n#define BOOST_PLATFORM \"Haiku\"\n\n#define BOOST_HAS_UNISTD_H\n#define BOOST_HAS_STDINT_H\n\n#ifndef BOOST_DISABLE_THREADS\n#  define BOOST_HAS_THREADS\n#endif\n\n#define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#define BOOST_NO_CXX11_STATIC_ASSERT\n#define BOOST_NO_CXX11_VARIADIC_MACROS\n\n//\n// thread API's not auto detected:\n//\n#define BOOST_HAS_SCHED_YIELD\n#define BOOST_HAS_GETTIMEOFDAY\n\n// boilerplate code:\n#include <boost/config/detail/posix_features.hpp>\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/platform/hpux.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Jens Maurer 2001 - 2003. \n//  (C) Copyright David Abrahams 2002. \n//  (C) Copyright Toon Knapen 2003. \n//  (C) Copyright Boris Gubenko 2006 - 2007.\n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  hpux specific config options:\n\n#define BOOST_PLATFORM \"HP-UX\"\n\n// In principle, HP-UX has a nice <stdint.h> under the name <inttypes.h>\n// However, it has the following problem:\n// Use of UINT32_C(0) results in \"0u l\" for the preprocessed source\n// (verifyable with gcc 2.95.3)\n#if (defined(__GNUC__) && (__GNUC__ >= 3)) || defined(__HP_aCC)\n#  define BOOST_HAS_STDINT_H\n#endif\n\n#if !(defined(__HP_aCC) || !defined(_INCLUDE__STDC_A1_SOURCE))\n#  define BOOST_NO_SWPRINTF\n#endif\n#if defined(__HP_aCC) && !defined(_INCLUDE__STDC_A1_SOURCE)\n#  define BOOST_NO_CWCTYPE\n#endif\n\n#if defined(__GNUC__)\n#  if (__GNUC__ < 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ < 3))\n      // GNU C on HP-UX does not support threads (checked up to gcc 3.3)\n#     define BOOST_DISABLE_THREADS\n#  elif !defined(BOOST_DISABLE_THREADS)\n      // threads supported from gcc-3.3 onwards:\n#     define BOOST_HAS_THREADS\n#     define BOOST_HAS_PTHREADS\n#  endif\n#elif defined(__HP_aCC) && !defined(BOOST_DISABLE_THREADS)\n#  define BOOST_HAS_PTHREADS\n#endif\n\n// boilerplate code:\n#define BOOST_HAS_UNISTD_H\n#include <boost/config/detail/posix_features.hpp>\n\n// the following are always available:\n#ifndef BOOST_HAS_GETTIMEOFDAY\n#  define BOOST_HAS_GETTIMEOFDAY\n#endif\n#ifndef BOOST_HAS_SCHED_YIELD\n#    define BOOST_HAS_SCHED_YIELD\n#endif\n#ifndef BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#    define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#endif\n#ifndef BOOST_HAS_NL_TYPES_H\n#    define BOOST_HAS_NL_TYPES_H\n#endif\n#ifndef BOOST_HAS_NANOSLEEP\n#    define BOOST_HAS_NANOSLEEP\n#endif\n#ifndef BOOST_HAS_GETTIMEOFDAY\n#    define BOOST_HAS_GETTIMEOFDAY\n#endif\n#ifndef BOOST_HAS_DIRENT_H\n#    define BOOST_HAS_DIRENT_H\n#endif\n#ifndef BOOST_HAS_CLOCK_GETTIME\n#    define BOOST_HAS_CLOCK_GETTIME\n#endif\n#ifndef BOOST_HAS_SIGACTION\n#  define BOOST_HAS_SIGACTION\n#endif\n#ifndef BOOST_HAS_NRVO \n#  ifndef __parisc\n#    define BOOST_HAS_NRVO\n#  endif\n#endif\n#ifndef BOOST_HAS_LOG1P \n#  define BOOST_HAS_LOG1P\n#endif\n#ifndef BOOST_HAS_EXPM1\n#  define BOOST_HAS_EXPM1\n#endif\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/platform/irix.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Jens Maurer 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n\n//  See http://www.boost.org for most recent version.\n\n//  SGI Irix specific config options:\n\n#define BOOST_PLATFORM \"SGI Irix\"\n\n#define BOOST_NO_SWPRINTF \n//\n// these are not auto detected by POSIX feature tests:\n//\n#define BOOST_HAS_GETTIMEOFDAY\n#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n\n#ifdef __GNUC__\n   // GNU C on IRIX does not support threads (checked up to gcc 3.3)\n#  define BOOST_DISABLE_THREADS\n#endif\n\n// boilerplate code:\n#define BOOST_HAS_UNISTD_H\n#include <boost/config/detail/posix_features.hpp>\n\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/platform/linux.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Jens Maurer 2001 - 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  linux specific config options:\n\n#define BOOST_PLATFORM \"linux\"\n\n// make sure we have __GLIBC_PREREQ if available at all\n#ifdef __cplusplus\n#include <cstdlib>\n#else\n#include <stdlib.h>\n#endif\n\n//\n// <stdint.h> added to glibc 2.1.1\n// We can only test for 2.1 though:\n//\n#if defined(__GLIBC__) && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 1)))\n   // <stdint.h> defines int64_t unconditionally, but <sys/types.h> defines\n   // int64_t only if __GNUC__.  Thus, assume a fully usable <stdint.h>\n   // only when using GCC.  Update 2017: this appears not to be the case for\n   // recent glibc releases, see bug report: https://svn.boost.org/trac/boost/ticket/13045\n#  if defined(__GNUC__) || ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 5)))\n#    define BOOST_HAS_STDINT_H\n#  endif\n#endif\n\n#if defined(__LIBCOMO__)\n   //\n   // como on linux doesn't have std:: c functions:\n   // NOTE: versions of libcomo prior to beta28 have octal version numbering,\n   // e.g. version 25 is 21 (dec)\n   //\n#  if __LIBCOMO_VERSION__ <= 20\n#    define BOOST_NO_STDC_NAMESPACE\n#  endif\n\n#  if __LIBCOMO_VERSION__ <= 21\n#    define BOOST_NO_SWPRINTF\n#  endif\n\n#endif\n\n//\n// If glibc is past version 2 then we definitely have\n// gettimeofday, earlier versions may or may not have it:\n//\n#if defined(__GLIBC__) && (__GLIBC__ >= 2)\n#  define BOOST_HAS_GETTIMEOFDAY\n#endif\n\n#ifdef __USE_POSIX199309\n#  define BOOST_HAS_NANOSLEEP\n#endif\n\n#if defined(__GLIBC__) && defined(__GLIBC_PREREQ)\n// __GLIBC_PREREQ is available since 2.1.2\n\n   // swprintf is available since glibc 2.2.0\n#  if !__GLIBC_PREREQ(2,2) || (!defined(__USE_ISOC99) && !defined(__USE_UNIX98))\n#    define BOOST_NO_SWPRINTF\n#  endif\n#else\n#  define BOOST_NO_SWPRINTF\n#endif\n\n// boilerplate code:\n#define BOOST_HAS_UNISTD_H\n#include <boost/config/detail/posix_features.hpp>\n#if defined(__USE_GNU) && !defined(__ANDROID__) && !defined(ANDROID)\n#define BOOST_HAS_PTHREAD_YIELD\n#endif\n\n#ifndef __GNUC__\n//\n// if the compiler is not gcc we still need to be able to parse\n// the GNU system headers, some of which (mainly <stdint.h>)\n// use GNU specific extensions:\n//\n#  ifndef __extension__\n#     define __extension__\n#  endif\n#  ifndef __const__\n#     define __const__ const\n#  endif\n#  ifndef __volatile__\n#     define __volatile__ volatile\n#  endif\n#  ifndef __signed__\n#     define __signed__ signed\n#  endif\n#  ifndef __typeof__\n#     define __typeof__ typeof\n#  endif\n#  ifndef __inline__\n#     define __inline__ inline\n#  endif\n#endif\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/platform/macos.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Darin Adler 2001 - 2002. \n//  (C) Copyright Bill Kempf 2002. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Mac OS specific config options:\n\n#define BOOST_PLATFORM \"Mac OS\"\n\n#if __MACH__ && !defined(_MSL_USING_MSL_C)\n\n// Using the Mac OS X system BSD-style C library.\n\n#  ifndef BOOST_HAS_UNISTD_H\n#    define BOOST_HAS_UNISTD_H\n#  endif\n//\n// Begin by including our boilerplate code for POSIX\n// feature detection, this is safe even when using\n// the MSL as Metrowerks supply their own <unistd.h>\n// to replace the platform-native BSD one. G++ users\n// should also always be able to do this on MaxOS X.\n//\n#  include <boost/config/detail/posix_features.hpp>\n#  ifndef BOOST_HAS_STDINT_H\n#     define BOOST_HAS_STDINT_H\n#  endif\n\n//\n// BSD runtime has pthreads, sigaction, sched_yield and gettimeofday,\n// of these only pthreads are advertised in <unistd.h>, so set the \n// other options explicitly:\n//\n#  define BOOST_HAS_SCHED_YIELD\n#  define BOOST_HAS_GETTIMEOFDAY\n#  define BOOST_HAS_SIGACTION\n\n#  if (__GNUC__ < 3) && !defined( __APPLE_CC__)\n\n// GCC strange \"ignore std\" mode works better if you pretend everything\n// is in the std namespace, for the most part.\n\n#    define BOOST_NO_STDC_NAMESPACE\n#  endif\n\n#  if (__GNUC__ >= 4)\n\n// Both gcc and intel require these.  \n#    define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#    define BOOST_HAS_NANOSLEEP\n\n#  endif\n\n#else\n\n// Using the MSL C library.\n\n// We will eventually support threads in non-Carbon builds, but we do\n// not support this yet.\n#  if ( defined(TARGET_API_MAC_CARBON) && TARGET_API_MAC_CARBON ) || ( defined(TARGET_CARBON) && TARGET_CARBON )\n\n#  if !defined(BOOST_HAS_PTHREADS)\n// MPTasks support is deprecated/removed from Boost:\n//#    define BOOST_HAS_MPTASKS\n#  elif ( __dest_os == __mac_os_x )\n// We are doing a Carbon/Mach-O/MSL build which has pthreads, but only the\n// gettimeofday and no posix.\n#  define BOOST_HAS_GETTIMEOFDAY\n#  endif\n\n#ifdef BOOST_HAS_PTHREADS\n#  define BOOST_HAS_THREADS\n#endif\n\n// The remote call manager depends on this.\n#    define BOOST_BIND_ENABLE_PASCAL\n\n#  endif\n\n#endif\n\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/platform/qnxnto.hpp",
    "content": "//  (C) Copyright Jim Douglas 2005. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  QNX specific config options:\n\n#define BOOST_PLATFORM \"QNX\"\n\n#define BOOST_HAS_UNISTD_H\n#include <boost/config/detail/posix_features.hpp>\n\n// QNX claims XOpen version 5 compatibility, but doesn't have an nl_types.h\n// or log1p and expm1:\n#undef  BOOST_HAS_NL_TYPES_H\n#undef  BOOST_HAS_LOG1P\n#undef  BOOST_HAS_EXPM1\n\n#define BOOST_HAS_PTHREADS\n#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n\n#define BOOST_HAS_GETTIMEOFDAY\n#define BOOST_HAS_CLOCK_GETTIME\n#define BOOST_HAS_NANOSLEEP\n\n\n\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/platform/solaris.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Jens Maurer 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  sun specific config options:\n\n#define BOOST_PLATFORM \"Sun Solaris\"\n\n#define BOOST_HAS_GETTIMEOFDAY\n\n// boilerplate code:\n#define BOOST_HAS_UNISTD_H\n#include <boost/config/detail/posix_features.hpp>\n\n//\n// pthreads don't actually work with gcc unless _PTHREADS is defined:\n//\n#if defined(__GNUC__) && defined(_POSIX_THREADS) && !defined(_PTHREADS)\n# undef BOOST_HAS_PTHREADS\n#endif\n\n#define BOOST_HAS_STDINT_H \n#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE \n#define BOOST_HAS_LOG1P \n#define BOOST_HAS_EXPM1\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/platform/symbian.hpp",
    "content": "//  (C) Copyright Yuriy Krasnoschek 2009. \n//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Jens Maurer 2001 - 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  symbian specific config options:\n\n\n#define BOOST_PLATFORM \"Symbian\"\n#define BOOST_SYMBIAN 1\n\n\n#if defined(__S60_3X__)\n// Open C / C++ plugin was introdused in this SDK, earlier versions don't have CRT / STL\n#  define BOOST_S60_3rd_EDITION_FP2_OR_LATER_SDK\n// make sure we have __GLIBC_PREREQ if available at all\n#ifdef __cplusplus\n#include <cstdlib>\n#else\n#include <stdlib.h>\n#endif// boilerplate code:\n#  define BOOST_HAS_UNISTD_H\n#  include <boost/config/detail/posix_features.hpp>\n// S60 SDK defines _POSIX_VERSION as POSIX.1\n#  ifndef BOOST_HAS_STDINT_H\n#    define BOOST_HAS_STDINT_H\n#  endif\n#  ifndef BOOST_HAS_GETTIMEOFDAY\n#    define BOOST_HAS_GETTIMEOFDAY\n#  endif\n#  ifndef BOOST_HAS_DIRENT_H\n#    define BOOST_HAS_DIRENT_H\n#  endif\n#  ifndef BOOST_HAS_SIGACTION\n#    define BOOST_HAS_SIGACTION\n#  endif\n#  ifndef BOOST_HAS_PTHREADS\n#    define BOOST_HAS_PTHREADS\n#  endif\n#  ifndef BOOST_HAS_NANOSLEEP\n#    define BOOST_HAS_NANOSLEEP\n#  endif\n#  ifndef BOOST_HAS_SCHED_YIELD\n#    define BOOST_HAS_SCHED_YIELD\n#  endif\n#  ifndef BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#    define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#  endif\n#  ifndef BOOST_HAS_LOG1P\n#    define BOOST_HAS_LOG1P\n#  endif\n#  ifndef BOOST_HAS_EXPM1\n#    define BOOST_HAS_EXPM1\n#  endif\n#  ifndef BOOST_POSIX_API\n#    define BOOST_POSIX_API\n#  endif\n// endianess support\n#  include <sys/endian.h>\n// Symbian SDK provides _BYTE_ORDER instead of __BYTE_ORDER\n#  ifndef __LITTLE_ENDIAN\n#    ifdef _LITTLE_ENDIAN\n#      define __LITTLE_ENDIAN _LITTLE_ENDIAN\n#    else\n#      define __LITTLE_ENDIAN 1234\n#    endif\n#  endif\n#  ifndef __BIG_ENDIAN\n#    ifdef _BIG_ENDIAN\n#      define __BIG_ENDIAN _BIG_ENDIAN\n#    else\n#      define __BIG_ENDIAN 4321\n#    endif\n#  endif\n#  ifndef __BYTE_ORDER\n#    define __BYTE_ORDER __LITTLE_ENDIAN // Symbian is LE\n#  endif\n// Known limitations\n#  define BOOST_ASIO_DISABLE_SERIAL_PORT\n#  define BOOST_DATE_TIME_NO_LOCALE\n#  define BOOST_NO_STD_WSTRING\n#  define BOOST_EXCEPTION_DISABLE\n#  define BOOST_NO_EXCEPTIONS\n\n#else // TODO: More platform support e.g. UIQ\n#  error \"Unsuppoted Symbian SDK\"\n#endif\n\n#if defined(__WINSCW__) && !defined(BOOST_DISABLE_WIN32)\n#  define BOOST_DISABLE_WIN32 // winscw defines WIN32 macro\n#endif\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/platform/vms.hpp",
    "content": "//  (C) Copyright Artyom Beilis 2010.  \n//  Use, modification and distribution are subject to the  \n//  Boost Software License, Version 1.0. (See accompanying file  \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) \n\n#ifndef BOOST_CONFIG_PLATFORM_VMS_HPP \n#define BOOST_CONFIG_PLATFORM_VMS_HPP \n\n#define BOOST_PLATFORM \"OpenVMS\" \n\n#undef  BOOST_HAS_STDINT_H \n#define BOOST_HAS_UNISTD_H \n#define BOOST_HAS_NL_TYPES_H \n#define BOOST_HAS_GETTIMEOFDAY \n#define BOOST_HAS_DIRENT_H \n#define BOOST_HAS_PTHREADS \n#define BOOST_HAS_NANOSLEEP \n#define BOOST_HAS_CLOCK_GETTIME \n#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE \n#define BOOST_HAS_LOG1P \n#define BOOST_HAS_EXPM1 \n#define BOOST_HAS_THREADS \n#undef  BOOST_HAS_SCHED_YIELD \n\n#endif \n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/platform/vxworks.hpp",
    "content": "//  (C) Copyright Dustin Spicuzza 2009.\n//      Adapted to vxWorks 6.9 by Peter Brockamp 2012.\n//      Updated for VxWorks 7 by Brian Kuhl 2016\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Old versions of vxWorks (namely everything below 6.x) are\n//  absolutely unable to use boost. Old STLs and compilers \n//  like (GCC 2.96) . Do not even think of getting this to work, \n//  a miserable failure will  be guaranteed!\n//\n//  VxWorks supports C++ linkage in the kernel with\n//  DKMs (Downloadable Kernel Modules). But, until recently \n//  the kernel used a C89 library with no\n//  wide character support and no guarantee of ANSI C. \n//  Regardless of the C library the same Dinkum \n//  STL library is used in both contexts. \n//\n//  Similarly the Dinkum abridged STL that supports the loosely specified \n//  embedded C++ standard has not been tested and is unlikely to work \n//  on anything but the simplest library.\n// ====================================================================\n//\n// Some important information regarding the usage of POSIX semaphores:\n// -------------------------------------------------------------------\n//\n// VxWorks as a real time operating system handles threads somewhat\n// different from what \"normal\" OSes do, regarding their scheduling!\n// This could lead to a scenario called \"priority inversion\" when using\n// semaphores, see http://en.wikipedia.org/wiki/Priority_inversion.\n//\n// Now, VxWorks POSIX-semaphores for DKM's default to the usage of\n// priority inverting semaphores, which is fine. On the other hand,\n// for RTP's it defaults to using non priority inverting semaphores,\n// which could easily pose a serious problem for a real time process.\n//\n// To change the default properties for POSIX-semaphores in VxWorks 7\n// enable core > CORE_USER Menu > DEFAULT_PTHREAD_PRIO_INHERIT \n//  \n// In VxWorks 6.x so as to integrate with boost. \n// - Edit the file \n//   installDir/vxworks-6.x/target/usr/src/posix/pthreadLib.c\n// - Around line 917 there should be the definition of the default\n//   mutex attributes:\n//\n//   LOCAL pthread_mutexattr_t defaultMutexAttr =\n//       {\n//       PTHREAD_INITIALIZED_OBJ, PTHREAD_PRIO_NONE, 0,\n//       PTHREAD_MUTEX_DEFAULT\n//       };\n//\n//   Here, replace PTHREAD_PRIO_NONE by PTHREAD_PRIO_INHERIT.\n// - Around line 1236 there should be a definition for the function\n//   pthread_mutexattr_init(). A couple of lines below you should\n//   find a block of code like this:\n//\n//   pAttr->mutexAttrStatus      = PTHREAD_INITIALIZED_OBJ;\n//   pAttr->mutexAttrProtocol    = PTHREAD_PRIO_NONE;\n//   pAttr->mutexAttrPrioceiling = 0;\n//   pAttr->mutexAttrType        = PTHREAD_MUTEX_DEFAULT;\n//\n//   Here again, replace PTHREAD_PRIO_NONE by PTHREAD_PRIO_INHERIT.\n// - Finally, rebuild your VSB. This will rebuild the libraries\n//   with the changed properties. That's it! Now, using boost should\n//   no longer cause any problems with task deadlocks!\n//\n//  ====================================================================\n\n// Block out all versions before vxWorks 6.x, as these don't work:\n// Include header with the vxWorks version information and query them\n#include <version.h>\n#if !defined(_WRS_VXWORKS_MAJOR) || (_WRS_VXWORKS_MAJOR < 6)\n#  error \"The vxWorks version you're using is so badly outdated,\\\n          it doesn't work at all with boost, sorry, no chance!\"\n#endif\n\n// Handle versions above 5.X but below 6.9\n#if (_WRS_VXWORKS_MAJOR == 6) && (_WRS_VXWORKS_MINOR < 9)\n// TODO: Starting from what version does vxWorks work with boost?\n// We can't reasonably insert a #warning \"\" as a user hint here,\n// as this will show up with every file including some boost header,\n// badly bugging the user... So for the time being we just leave it.\n#endif\n\n// vxWorks specific config options:\n// --------------------------------\n#define BOOST_PLATFORM \"vxWorks\"\n\n\n// Generally available headers:\n#define BOOST_HAS_UNISTD_H\n#define BOOST_HAS_STDINT_H\n#define BOOST_HAS_DIRENT_H\n//#define BOOST_HAS_SLIST\n\n// vxWorks does not have installed an iconv-library by default,\n// so unfortunately no Unicode support from scratch is available!\n// Thus, instead it is suggested to switch to ICU, as this seems\n// to be the most complete and portable option...\n#ifndef BOOST_LOCALE_WITH_ICU\n   #define BOOST_LOCALE_WITH_ICU\n#endif\n\n// Generally available functionality:\n#define BOOST_HAS_THREADS\n#define BOOST_HAS_NANOSLEEP\n#define BOOST_HAS_GETTIMEOFDAY\n#define BOOST_HAS_CLOCK_GETTIME\n#define BOOST_HAS_MACRO_USE_FACET\n\n// Generally available threading API's:\n#define BOOST_HAS_PTHREADS\n#define BOOST_HAS_SCHED_YIELD\n#define BOOST_HAS_SIGACTION\n\n// Functionality available for RTPs only:\n#ifdef __RTP__\n#  define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#  define BOOST_HAS_LOG1P\n#  define BOOST_HAS_EXPM1\n#endif\n\n// Functionality available for DKMs only:\n#ifdef _WRS_KERNEL\n  // Luckily, at the moment there seems to be none!\n#endif\n\n// These #defines allow detail/posix_features to work, since vxWorks doesn't\n// #define them itself for DKMs (for RTPs on the contrary it does):\n#ifdef _WRS_KERNEL\n#  ifndef _POSIX_TIMERS\n#    define _POSIX_TIMERS  1\n#  endif\n#  ifndef _POSIX_THREADS\n#    define _POSIX_THREADS 1\n#  endif\n// no sysconf( _SC_PAGESIZE) in kernel\n#  define BOOST_THREAD_USES_GETPAGESIZE\n#endif\n\n#if (_WRS_VXWORKS_MAJOR < 7) \n// vxWorks-around: <time.h> #defines CLOCKS_PER_SEC as sysClkRateGet() but\n//                 miserably fails to #include the required <sysLib.h> to make\n//                 sysClkRateGet() available! So we manually include it here.\n#  ifdef __RTP__\n#    include <time.h>\n#    include <sysLib.h>\n#  endif\n\n// vxWorks-around: In <stdint.h> the macros INT32_C(), UINT32_C(), INT64_C() and\n//                 UINT64_C() are defined erroneously, yielding not a signed/\n//                 unsigned long/long long type, but a signed/unsigned int/long\n//                 type. Eventually this leads to compile errors in ratio_fwd.hpp,\n//                 when trying to define several constants which do not fit into a\n//                 long type! We correct them here by redefining.\n\n#  include <cstdint>\n\n// Special behaviour for DKMs:\n\n// Some macro-magic to do the job\n#  define VX_JOIN(X, Y)     VX_DO_JOIN(X, Y)\n#  define VX_DO_JOIN(X, Y)  VX_DO_JOIN2(X, Y)\n#  define VX_DO_JOIN2(X, Y) X##Y\n\n// Correctly setup the macros\n#  undef  INT32_C\n#  undef  UINT32_C\n#  undef  INT64_C\n#  undef  UINT64_C\n#  define INT32_C(x)  VX_JOIN(x, L)\n#  define UINT32_C(x) VX_JOIN(x, UL)\n#  define INT64_C(x)  VX_JOIN(x, LL)\n#  define UINT64_C(x) VX_JOIN(x, ULL)\n\n// #include Libraries required for the following function adaption\n#  include <sys/time.h>\n#endif  // _WRS_VXWORKS_MAJOR < 7\n\n#include <ioLib.h>\n#include <tickLib.h>\n\n#if defined(_WRS_KERNEL) && (_CPPLIB_VER < 700)\n  // recent kernels use Dinkum clib v7.00+\n  // with widechar but older kernels\n  // do not have the <cwchar>-header,\n  // but apparently they do have an intrinsic wchar_t meanwhile!\n#  define BOOST_NO_CWCHAR\n\n  // Lots of wide-functions and -headers are unavailable for DKMs as well:\n#  define BOOST_NO_CWCTYPE\n#  define BOOST_NO_SWPRINTF\n#  define BOOST_NO_STD_WSTRING\n#  define BOOST_NO_STD_WSTREAMBUF\n#endif\n\n\n// Use C-linkage for the following helper functions\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// vxWorks-around: The required functions getrlimit() and getrlimit() are missing.\n//                 But we have the similar functions getprlimit() and setprlimit(),\n//                 which may serve the purpose.\n//                 Problem: The vxWorks-documentation regarding these functions\n//                 doesn't deserve its name! It isn't documented what the first two\n//                 parameters idtype and id mean, so we must fall back to an educated\n//                 guess - null, argh... :-/\n\n// TODO: getprlimit() and setprlimit() do exist for RTPs only, for whatever reason.\n//       Thus for DKMs there would have to be another implementation.\n#if defined ( __RTP__) &&  (_WRS_VXWORKS_MAJOR < 7)\n  inline int getrlimit(int resource, struct rlimit *rlp){\n    return getprlimit(0, 0, resource, rlp);\n  }\n\n  inline int setrlimit(int resource, const struct rlimit *rlp){\n    return setprlimit(0, 0, resource, const_cast<struct rlimit*>(rlp));\n  }\n#endif\n\n// vxWorks has ftruncate() only, so we do simulate truncate():\ninline int truncate(const char *p, off_t l){\n  int fd = open(p, O_WRONLY);\n  if (fd == -1){\n    errno = EACCES;\n    return -1;\n  }\n  if (ftruncate(fd, l) == -1){\n    close(fd);\n    errno = EACCES;\n    return -1;\n  }\n  return close(fd);\n}\n\n#ifdef __GNUC__\n#  define ___unused __attribute__((unused))\n#else\n#  define ___unused\n#endif\n\n// Fake symlink handling by dummy functions:\ninline int symlink(const char* path1 ___unused, const char* path2 ___unused){\n  // vxWorks has no symlinks -> always return an error!\n  errno = EACCES;\n  return -1;\n}\n\ninline ssize_t readlink(const char* path1 ___unused, char* path2 ___unused, size_t size ___unused){\n  // vxWorks has no symlinks -> always return an error!\n  errno = EACCES;\n  return -1;\n}\n\n#if (_WRS_VXWORKS_MAJOR < 7)\n\ninline int gettimeofday(struct timeval *tv, void * /*tzv*/) {\n  struct timespec ts;\n  clock_gettime(CLOCK_MONOTONIC, &ts);\n  tv->tv_sec  = ts.tv_sec;\n  tv->tv_usec = ts.tv_nsec / 1000;\n  return 0;\n}\n#endif\n\n#ifdef __cplusplus\n} // extern \"C\"\n#endif\n\n/* \n * moved to os/utils/unix/freind_h/times.h in VxWorks 7\n * to avoid conflict with MPL operator times\n */\n#if (_WRS_VXWORKS_MAJOR < 7) \n#  ifdef __cplusplus\n\n// vxWorks provides neither struct tms nor function times()!\n// We implement an empty dummy-function, simply setting the user\n// and system time to the half of thew actual system ticks-value\n// and the child user and system time to 0.\n// Rather ugly but at least it suppresses compiler errors...\n// Unfortunately, this of course *does* have an severe impact on\n// dependant libraries, actually this is chrono only! Here it will\n// not be possible to correctly use user and system times! But\n// as vxWorks is lacking the ability to calculate user and system\n// process times there seems to be no other possible solution.\nstruct tms{\n  clock_t tms_utime;  // User CPU time\n  clock_t tms_stime;  // System CPU time\n  clock_t tms_cutime; // User CPU time of terminated child processes\n  clock_t tms_cstime; // System CPU time of terminated child processes\n};\n\n\n inline clock_t times(struct tms *t){\n  struct timespec ts;\n  clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts);\n  clock_t ticks(static_cast<clock_t>(static_cast<double>(ts.tv_sec)  * CLOCKS_PER_SEC +\n                                     static_cast<double>(ts.tv_nsec) * CLOCKS_PER_SEC / 1000000.0));\n  t->tms_utime  = ticks/2U;\n  t->tms_stime  = ticks/2U;\n  t->tms_cutime = 0; // vxWorks is lacking the concept of a child process!\n  t->tms_cstime = 0; // -> Set the wait times for childs to 0\n  return ticks;\n}\n\n\nnamespace std {\n    using ::times;\n}\n#  endif // __cplusplus\n#endif // _WRS_VXWORKS_MAJOR < 7\n\n\n#ifdef __cplusplus\nextern \"C\" void   bzero     (void *, size_t);    // FD_ZERO uses bzero() but doesn't include strings.h\n\n// Put the selfmade functions into the std-namespace, just in case\nnamespace std {\n#  ifdef __RTP__\n    using ::getrlimit;\n    using ::setrlimit;\n#  endif\n  using ::truncate;\n  using ::symlink;\n  using ::readlink;\n#  if (_WRS_VXWORKS_MAJOR < 7)  \n    using ::gettimeofday;\n#  endif  \n}\n#endif // __cplusplus\n\n// Some more macro-magic:\n// vxWorks-around: Some functions are not present or broken in vxWorks\n//                 but may be patched to life via helper macros...\n\n// Include signal.h which might contain a typo to be corrected here\n#include <signal.h>\n\n#if (_WRS_VXWORKS_MAJOR < 7)\n#  define getpagesize()    sysconf(_SC_PAGESIZE)         // getpagesize is deprecated anyway!\ninline int lstat(p, b) { return stat(p, b); }  // lstat() == stat(), as vxWorks has no symlinks!\n#endif\n\n#ifndef S_ISSOCK\n#  define S_ISSOCK(mode) ((mode & S_IFMT) == S_IFSOCK) // Is file a socket?\n#endif\n#ifndef FPE_FLTINV\n#  define FPE_FLTINV     (FPE_FLTSUB+1)                // vxWorks has no FPE_FLTINV, so define one as a dummy\n#endif\n#if !defined(BUS_ADRALN) && defined(BUS_ADRALNR)\n#  define BUS_ADRALN     BUS_ADRALNR                   // Correct a supposed typo in vxWorks' <signal.h>\n#endif\ntypedef int              locale_t;                     // locale_t is a POSIX-extension, currently not present in vxWorks!\n\n// #include boilerplate code:\n#include <boost/config/detail/posix_features.hpp>\n\n// vxWorks lies about XSI conformance, there is no nl_types.h:\n#undef BOOST_HAS_NL_TYPES_H\n\n// vxWorks 7 adds C++11 support \n// however it is optional, and does not match exactly the support determined\n// by examining the Dinkum STL version and GCC version (or ICC and DCC) \n#if !( defined( _WRS_CONFIG_LANG_LIB_CPLUS_CPLUS_USER_2011) || defined(_WRS_CONFIG_LIBCPLUS_STD))\n#  define BOOST_NO_CXX11_ADDRESSOF      // C11 addressof operator on memory location\n#  define BOOST_NO_CXX11_ALLOCATOR\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS  // max_digits10 in test/../print_helper.hpp\n#  define BOOST_NO_CXX11_SMART_PTR \n#  define BOOST_NO_CXX11_STD_ALIGN\n\n\n#  define BOOST_NO_CXX11_HDR_ARRAY\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST  //serialization/test/test_list.cpp\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL \n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RANDOM      //math/../test_data.hpp\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX \n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  define BOOST_NO_CXX11_HDR_TUPLE \n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET \n#else\n#  ifndef  BOOST_SYSTEM_NO_DEPRECATED\n#    define BOOST_SYSTEM_NO_DEPRECATED  // workaround link error in spirit\n#  endif\n#endif\n\n\n// NONE is used in enums in lamda and other libraries\n#undef NONE\n// restrict is an iostreams class\n#undef restrict\n// affects some typeof tests\n#undef V7\n\n// use fake poll() from Unix layer in ASIO to get full functionality \n// most libraries will use select() but this define allows 'iostream' functionality\n// which is based on poll() only\n#if (_WRS_VXWORKS_MAJOR > 6)\n#  ifndef BOOST_ASIO_HAS_POSIX_STREAM_DESCRIPTOR\n#    define BOOST_ASIO_HAS_POSIX_STREAM_DESCRIPTOR\n#  endif\n#else \n#  define BOOST_ASIO_DISABLE_SERIAL_PORT\n#endif\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/platform/wasm.hpp",
    "content": "//  (C) Copyright John Maddock 2020.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  WASM specific config options:\n\n#define BOOST_PLATFORM \"Wasm\"\n\n#ifdef __has_include\n#if __has_include(<unistd.h>)\n#  define BOOST_HAS_UNISTD_H\n#endif\n#endif\n\n// boilerplate code:\n#include <boost/config/detail/posix_features.hpp>\n//\n// fenv lacks the C++11 macros:\n//\n#define BOOST_NO_FENV_H\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/platform/win32.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Bill Kempf 2001. \n//  (C) Copyright Aleksey Gurtovoy 2003. \n//  (C) Copyright Rene Rivera 2005.\n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Win32 specific config options:\n\n#define BOOST_PLATFORM \"Win32\"\n\n//  Get the information about the MinGW runtime, i.e. __MINGW32_*VERSION.\n#if defined(__MINGW32__)\n#  include <_mingw.h>\n#endif\n\n#if defined(__GNUC__) && !defined(BOOST_NO_SWPRINTF)\n#  define BOOST_NO_SWPRINTF\n#endif\n\n//  Default defines for BOOST_SYMBOL_EXPORT and BOOST_SYMBOL_IMPORT\n//  If a compiler doesn't support __declspec(dllexport)/__declspec(dllimport),\n//  its boost/config/compiler/ file must define BOOST_SYMBOL_EXPORT and\n//  BOOST_SYMBOL_IMPORT\n#ifndef BOOST_SYMBOL_EXPORT\n#  define BOOST_HAS_DECLSPEC\n#  define BOOST_SYMBOL_EXPORT __declspec(dllexport)\n#  define BOOST_SYMBOL_IMPORT __declspec(dllimport)\n#endif\n\n#if defined(__MINGW32__) && ((__MINGW32_MAJOR_VERSION > 2) || ((__MINGW32_MAJOR_VERSION == 2) && (__MINGW32_MINOR_VERSION >= 0)))\n#  define BOOST_HAS_STDINT_H\n#  ifndef __STDC_LIMIT_MACROS\n#     define __STDC_LIMIT_MACROS\n#  endif\n#  define BOOST_HAS_DIRENT_H\n#  define BOOST_HAS_UNISTD_H\n#endif\n\n#if defined(__MINGW32__) && (__GNUC__ >= 4)\n// Mingw has these functions but there are persistent problems\n// with calls to these crashing, so disable for now:\n//#  define BOOST_HAS_EXPM1\n//#  define BOOST_HAS_LOG1P\n#  define BOOST_HAS_GETTIMEOFDAY\n#endif\n//\n// Win32 will normally be using native Win32 threads,\n// but there is a pthread library avaliable as an option,\n// we used to disable this when BOOST_DISABLE_WIN32 was \n// defined but no longer - this should allow some\n// files to be compiled in strict mode - while maintaining\n// a consistent setting of BOOST_HAS_THREADS across\n// all translation units (needed for shared_ptr etc).\n//\n\n#ifndef BOOST_HAS_PTHREADS\n#  define BOOST_HAS_WINTHREADS\n#endif\n\n//\n// WinCE configuration:\n//\n#if defined(_WIN32_WCE) || defined(UNDER_CE)\n#  define BOOST_NO_ANSI_APIS\n// Windows CE does not have a conforming signature for swprintf\n#  define BOOST_NO_SWPRINTF\n#else\n#  define BOOST_HAS_GETSYSTEMTIMEASFILETIME\n#  define BOOST_HAS_THREADEX\n#  define BOOST_HAS_GETSYSTEMTIMEASFILETIME\n#endif\n\n//\n// Windows Runtime\n//\n#if defined(WINAPI_FAMILY) && \\\n  (WINAPI_FAMILY == WINAPI_FAMILY_APP || WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP)\n#  define BOOST_NO_ANSI_APIS\n#endif\n\n#ifndef BOOST_DISABLE_WIN32\n// WEK: Added\n#define BOOST_HAS_FTIME\n#define BOOST_WINDOWS 1\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/platform/zos.hpp",
    "content": "//  Copyright (c) 2017 Dynatrace\n//\n//  Distributed under the Boost Software License, Version 1.0.\n//  See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt\n\n//  See http://www.boost.org for most recent version.\n\n//  Platform setup for IBM z/OS.\n\n#define BOOST_PLATFORM \"IBM z/OS\"\n\n#include <features.h> // For __UU, __C99, __TR1, ...\n\n#if defined(__UU)\n#  define BOOST_HAS_GETTIMEOFDAY\n#endif\n\n#if defined(_OPEN_THREADS) || defined(__SUSV3_THR)\n#  define BOOST_HAS_PTHREADS\n#  define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#  define BOOST_HAS_THREADS\n#endif\n\n#if defined(__SUSV3) || defined(__SUSV3_THR)\n#  define BOOST_HAS_SCHED_YIELD\n#endif\n\n#define BOOST_HAS_SIGACTION\n#define BOOST_HAS_UNISTD_H\n#define BOOST_HAS_DIRENT_H\n#define BOOST_HAS_NL_TYPES_H\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/pragma_message.hpp",
    "content": "#ifndef BOOST_CONFIG_PRAGMA_MESSAGE_HPP_INCLUDED\n#define BOOST_CONFIG_PRAGMA_MESSAGE_HPP_INCLUDED\n\n//  Copyright 2017 Peter Dimov.\n//\n//  Distributed under the Boost Software License, Version 1.0.\n//\n//  See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt\n//\n//  BOOST_PRAGMA_MESSAGE(\"message\")\n//\n//  Expands to the equivalent of #pragma message(\"message\")\n//\n//  Note that this header is C compatible.\n\n#include <boost/config/helper_macros.hpp>\n\n#if defined(BOOST_DISABLE_PRAGMA_MESSAGE)\n# define BOOST_PRAGMA_MESSAGE(x)\n#elif defined(__INTEL_COMPILER)\n# define BOOST_PRAGMA_MESSAGE(x) __pragma(message(__FILE__ \"(\" BOOST_STRINGIZE(__LINE__) \"): note: \" x))\n#elif defined(__GNUC__)\n# define BOOST_PRAGMA_MESSAGE(x) _Pragma(BOOST_STRINGIZE(message(x)))\n#elif defined(_MSC_VER)\n# define BOOST_PRAGMA_MESSAGE(x) __pragma(message(__FILE__ \"(\" BOOST_STRINGIZE(__LINE__) \"): note: \" x))\n#else\n# define BOOST_PRAGMA_MESSAGE(x)\n#endif\n\n#endif // BOOST_CONFIG_PRAGMA_MESSAGE_HPP_INCLUDED\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/requires_threads.hpp",
    "content": "//  (C) Copyright John Maddock 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n\n#ifndef BOOST_CONFIG_REQUIRES_THREADS_HPP\n#define BOOST_CONFIG_REQUIRES_THREADS_HPP\n\n#ifndef BOOST_CONFIG_HPP\n#  include <boost/config.hpp>\n#endif\n\n#if defined(BOOST_DISABLE_THREADS)\n\n//\n// special case to handle versions of gcc which don't currently support threads:\n//\n#if defined(__GNUC__) && ((__GNUC__ < 3) || (__GNUC_MINOR__ <= 3) || !defined(BOOST_STRICT_CONFIG))\n//\n// this is checked up to gcc 3.3:\n//\n#if defined(__sgi) || defined(__hpux)\n#  error \"Multi-threaded programs are not supported by gcc on HPUX or Irix (last checked with gcc 3.3)\"\n#endif\n\n#endif\n\n#  error \"Threading support unavaliable: it has been explicitly disabled with BOOST_DISABLE_THREADS\"\n\n#elif !defined(BOOST_HAS_THREADS)\n\n# if defined __COMO__\n//  Comeau C++\n#   error \"Compiler threading support is not turned on. Please set the correct command line options for threading: -D_MT (Windows) or -D_REENTRANT (Unix)\"\n\n#elif defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC)\n//  Intel\n#ifdef _WIN32\n#  error \"Compiler threading support is not turned on. Please set the correct command line options for threading: either /MT /MTd /MD or /MDd\"\n#else\n#   error \"Compiler threading support is not turned on. Please set the correct command line options for threading: -openmp\"\n#endif\n\n# elif defined __GNUC__\n//  GNU C++:\n#   error \"Compiler threading support is not turned on. Please set the correct command line options for threading: -pthread (Linux), -pthreads (Solaris) or -mthreads (Mingw32)\"\n\n#elif defined __sgi\n//  SGI MIPSpro C++\n#   error \"Compiler threading support is not turned on. Please set the correct command line options for threading: -D_SGI_MP_SOURCE\"\n\n#elif defined __DECCXX\n//  Compaq Tru64 Unix cxx\n#   error \"Compiler threading support is not turned on. Please set the correct command line options for threading: -pthread\"\n\n#elif defined BOOST_BORLANDC\n//  Borland\n#   error \"Compiler threading support is not turned on. Please set the correct command line options for threading: -tWM\"\n\n#elif defined  __MWERKS__\n//  Metrowerks CodeWarrior\n#   error \"Compiler threading support is not turned on. Please set the correct command line options for threading: either -runtime sm, -runtime smd, -runtime dm, or -runtime dmd\"\n\n#elif defined  __SUNPRO_CC\n//  Sun Workshop Compiler C++\n#   error \"Compiler threading support is not turned on. Please set the correct command line options for threading: -mt\"\n\n#elif defined __HP_aCC\n//  HP aCC\n#   error \"Compiler threading support is not turned on. Please set the correct command line options for threading: -mt\"\n\n#elif defined(__IBMCPP__)\n//  IBM Visual Age\n#   error \"Compiler threading support is not turned on. Please compile the code with the xlC_r compiler\"\n\n#elif defined _MSC_VER\n//  Microsoft Visual C++\n//\n//  Must remain the last #elif since some other vendors (Metrowerks, for\n//  example) also #define _MSC_VER\n#  error \"Compiler threading support is not turned on. Please set the correct command line options for threading: either /MT /MTd /MD or /MDd\"\n\n#else\n\n#  error \"Compiler threading support is not turned on.  Please consult your compiler's documentation for the appropriate options to use\"\n\n#endif // compilers\n\n#endif // BOOST_HAS_THREADS\n\n#endif // BOOST_CONFIG_REQUIRES_THREADS_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/stdlib/dinkumware.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003.\n//  (C) Copyright Jens Maurer 2001.\n//  (C) Copyright Peter Dimov 2001.\n//  (C) Copyright David Abrahams 2002.\n//  (C) Copyright Guillaume Melquiond 2003.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Dinkumware standard library config:\n\n#if !defined(_YVALS) && !defined(_CPPLIB_VER)\n#include <boost/config/no_tr1/utility.hpp>\n#if !defined(_YVALS) && !defined(_CPPLIB_VER)\n#error This is not the Dinkumware lib!\n#endif\n#endif\n\n\n#if defined(_CPPLIB_VER) && (_CPPLIB_VER >= 306)\n   // full dinkumware 3.06 and above\n   // fully conforming provided the compiler supports it:\n#  if !(defined(_GLOBAL_USING) && (_GLOBAL_USING+0 > 0)) && !defined(BOOST_BORLANDC) && !defined(_STD) && !(defined(__ICC) && (__ICC >= 700))   // can be defined in yvals.h\n#     define BOOST_NO_STDC_NAMESPACE\n#  endif\n#  if !(defined(_HAS_MEMBER_TEMPLATES_REBIND) && (_HAS_MEMBER_TEMPLATES_REBIND+0 > 0)) && !(defined(_MSC_VER) && (_MSC_VER > 1300)) && defined(BOOST_MSVC)\n#     define BOOST_NO_STD_ALLOCATOR\n#  endif\n#  define BOOST_HAS_PARTIAL_STD_ALLOCATOR\n#  if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)\n      // if this lib version is set up for vc6 then there is no std::use_facet:\n#     define BOOST_NO_STD_USE_FACET\n#     define BOOST_HAS_TWO_ARG_USE_FACET\n      // C lib functions aren't in namespace std either:\n#     define BOOST_NO_STDC_NAMESPACE\n      // and nor is <exception>\n#     define BOOST_NO_EXCEPTION_STD_NAMESPACE\n#  endif\n// There's no numeric_limits<long long> support unless _LONGLONG is defined:\n#  if !defined(_LONGLONG) && (_CPPLIB_VER <= 310)\n#     define BOOST_NO_MS_INT64_NUMERIC_LIMITS\n#  endif\n// 3.06 appears to have (non-sgi versions of) <hash_set> & <hash_map>,\n// and no <slist> at all\n#else\n#  define BOOST_MSVC_STD_ITERATOR 1\n#  define BOOST_NO_STD_ITERATOR\n#  define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS\n#  define BOOST_NO_STD_ALLOCATOR\n#  define BOOST_NO_STDC_NAMESPACE\n#  define BOOST_NO_STD_USE_FACET\n#  define BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN\n#  define BOOST_HAS_MACRO_USE_FACET\n#  ifndef _CPPLIB_VER\n      // Updated Dinkum library defines this, and provides\n      // its own min and max definitions, as does MTA version.\n#     ifndef __MTA__ \n#        define BOOST_NO_STD_MIN_MAX\n#     endif\n#     define BOOST_NO_MS_INT64_NUMERIC_LIMITS\n#  endif\n#endif\n\n//\n// std extension namespace is stdext for vc7.1 and later, \n// the same applies to other compilers that sit on top\n// of vc7.1 (Intel and Comeau):\n//\n#if defined(_MSC_VER) && (_MSC_VER >= 1310) && !defined(BOOST_BORLANDC)\n#  define BOOST_STD_EXTENSION_NAMESPACE stdext\n#endif\n\n\n#if (defined(_MSC_VER) && (_MSC_VER <= 1300) && !defined(BOOST_BORLANDC)) || !defined(_CPPLIB_VER) || (_CPPLIB_VER < 306)\n   // if we're using a dinkum lib that's\n   // been configured for VC6/7 then there is\n   // no iterator traits (true even for icl)\n#  define BOOST_NO_STD_ITERATOR_TRAITS\n#endif\n\n#if defined(__ICL) && (__ICL < 800) && defined(_CPPLIB_VER) && (_CPPLIB_VER <= 310)\n// Intel C++ chokes over any non-trivial use of <locale>\n// this may be an overly restrictive define, but regex fails without it:\n#  define BOOST_NO_STD_LOCALE\n#endif\n\n#if ((defined(BOOST_MSVC) && BOOST_MSVC >= 1400) || (defined(__clang__) && defined(_MSC_VER))) && (_MSC_VER < 1800)\n// Fix for VC++ 8.0 on up ( I do not have a previous version to test )\n// or clang-cl. If exceptions are off you must manually include the \n// <exception> header before including the <typeinfo> header. Admittedly \n// trying to use Boost libraries or the standard C++ libraries without \n// exception support is not suggested but currently clang-cl ( v 3.4 ) \n// does not support exceptions and must be compiled with exceptions off.\n#if !_HAS_EXCEPTIONS\n#include <exception>\n#endif\n#include <typeinfo>\n#if !_HAS_EXCEPTIONS\n#  define BOOST_NO_STD_TYPEINFO\n#endif  \n#endif\n#if defined(__ghs__) && !_HAS_NAMESPACE\n#  define BOOST_NO_STD_TYPEINFO\n#endif\n\n//  C++0x headers implemented in 520 (as shipped by Microsoft)\n//\n#if !defined(_CPPLIB_VER) || _CPPLIB_VER < 520\n#  define BOOST_NO_CXX11_HDR_ARRAY\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_SMART_PTR\n#endif\n\n#if ((!defined(_HAS_TR1_IMPORTS) || (_HAS_TR1_IMPORTS+0 == 0)) && !defined(BOOST_NO_CXX11_HDR_TUPLE)) \\\n  && (!defined(_CPPLIB_VER) || _CPPLIB_VER < 610)\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#endif\n\n//  C++0x headers implemented in 540 (as shipped by Microsoft)\n//\n#if !defined(_CPPLIB_VER) || _CPPLIB_VER < 540\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_EXCEPTION\n#endif\n\n//  C++0x headers implemented in 610 (as shipped by Microsoft)\n//\n#if !defined(_CPPLIB_VER) || _CPPLIB_VER < 610\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_ALLOCATOR\n// 540 has std::align but it is not a conforming implementation\n#  define BOOST_NO_CXX11_STD_ALIGN\n#endif\n\n// Before 650 std::pointer_traits has a broken rebind template\n#if !defined(_CPPLIB_VER) || _CPPLIB_VER < 650\n#  define BOOST_NO_CXX11_POINTER_TRAITS\n#elif defined(BOOST_MSVC) && BOOST_MSVC < 1910\n#  define BOOST_NO_CXX11_POINTER_TRAITS\n#endif\n\n#if defined(__has_include)\n#if !__has_include(<shared_mutex>)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#elif (__cplusplus < 201402) && !defined(_MSC_VER)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#elif !defined(_CPPLIB_VER) || (_CPPLIB_VER < 650)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n\n// C++14 features\n#if !defined(_CPPLIB_VER) || (_CPPLIB_VER < 650)\n#  define BOOST_NO_CXX14_STD_EXCHANGE\n#endif\n\n// C++17 features\n#if !defined(_CPPLIB_VER) || (_CPPLIB_VER < 650) \\\n || ((!defined(BOOST_MSVC) || (BOOST_MSVC < 1910))) && (!defined(__clang__) || !defined(_MSC_VER) || (_MSC_VER < 1929))\\\n || !defined(_HAS_CXX17) || (_HAS_CXX17 == 0)\n#  define BOOST_NO_CXX17_STD_APPLY\n#  define BOOST_NO_CXX17_ITERATOR_TRAITS\n#  define BOOST_NO_CXX17_HDR_STRING_VIEW\n#  define BOOST_NO_CXX17_HDR_OPTIONAL\n#  define BOOST_NO_CXX17_HDR_VARIANT\n#  define BOOST_NO_CXX17_HDR_ANY\n#  define BOOST_NO_CXX17_HDR_MEMORY_RESOURCE\n#  define BOOST_NO_CXX17_HDR_CHARCONV\n#  define BOOST_NO_CXX17_HDR_EXECUTION\n#  define BOOST_NO_CXX17_HDR_FILESYSTEM\n#endif\n#if !defined(_CPPLIB_VER) || (_CPPLIB_VER < 650) || !defined(_HAS_CXX17) || (_HAS_CXX17 == 0) || !defined(_MSVC_STL_UPDATE) || (_MSVC_STL_UPDATE < 201709)\n#  define BOOST_NO_CXX17_STD_INVOKE\n#endif\n\n// C++20 features which aren't configured in suffix.hpp correctly:\n#if !defined(_MSVC_STL_UPDATE) || (_MSVC_STL_UPDATE < 202008L) || !defined(_HAS_CXX20) || (_HAS_CXX20 == 0)\n#  define BOOST_NO_CXX20_HDR_CONCEPTS\n#endif\n\n#if !(!defined(_CPPLIB_VER) || (_CPPLIB_VER < 650) || !defined(BOOST_MSVC) || (BOOST_MSVC < 1912) || !defined(_HAS_CXX17) || (_HAS_CXX17 == 0))\n// Deprecated std::iterator:\n#  define BOOST_NO_STD_ITERATOR\n#endif\n\n#if defined(BOOST_INTEL) && (BOOST_INTEL <= 1400)\n// Intel's compiler can't handle this header yet:\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#endif\n\n\n//  520..610 have std::addressof, but it doesn't support functions\n//\n#if !defined(_CPPLIB_VER) || _CPPLIB_VER < 650\n#  define BOOST_NO_CXX11_ADDRESSOF\n#endif\n\n// Bug specific to VC14, \n// See https://connect.microsoft.com/VisualStudio/feedback/details/1348277/link-error-when-using-std-codecvt-utf8-utf16-char16-t\n// and discussion here: http://blogs.msdn.com/b/vcblog/archive/2014/11/12/visual-studio-2015-preview-now-available.aspx?PageIndex=2\n#if defined(_CPPLIB_VER) && (_CPPLIB_VER == 650) && (!defined(_MSVC_STL_VERSION) || (_MSVC_STL_VERSION < 142))\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#endif\n\n#if (_MSVC_LANG > 201700) && !defined(BOOST_NO_CXX11_HDR_CODECVT)\n//\n// <codecvt> is deprected as of C++17, and by default MSVC emits hard errors\n// if you try to use it, so mark it as unavailable:\n//\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#endif\n\n#if defined(_CPPLIB_VER) && (_CPPLIB_VER >= 650)\n// If _HAS_AUTO_PTR_ETC is defined to 0, std::auto_ptr and std::random_shuffle are not available.\n// See https://www.visualstudio.com/en-us/news/vs2015-vs.aspx#C++\n// and http://blogs.msdn.com/b/vcblog/archive/2015/06/19/c-11-14-17-features-in-vs-2015-rtm.aspx\n#  if defined(_HAS_AUTO_PTR_ETC) && (_HAS_AUTO_PTR_ETC == 0)\n#    define BOOST_NO_AUTO_PTR\n#    define BOOST_NO_CXX98_RANDOM_SHUFFLE\n#    define BOOST_NO_CXX98_FUNCTION_BASE\n#    define BOOST_NO_CXX98_BINDERS\n#  endif\n#endif\n//\n// Things deprecated in C++20:\n//\n#if defined(_HAS_CXX20)\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#endif\n\n\n//\n// Things not supported by the CLR:\n#ifdef _M_CEE\n#ifndef BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#endif\n#ifndef BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#endif\n#ifndef BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#endif\n#ifndef BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#endif\n#ifndef BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_HDR_THREAD\n#endif\n#ifndef BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#ifndef BOOST_NO_CXX14_STD_EXCHANGE\n#  define BOOST_NO_CXX14_STD_EXCHANGE\n#endif\n#ifndef BOOST_NO_FENV_H\n#  define BOOST_NO_FENV_H\n#endif\n#endif\n\n#ifdef _CPPLIB_VER\n#  define BOOST_DINKUMWARE_STDLIB _CPPLIB_VER\n#else\n#  define BOOST_DINKUMWARE_STDLIB 1\n#endif\n\n#ifdef _CPPLIB_VER\n#  define BOOST_STDLIB \"Dinkumware standard library version \" BOOST_STRINGIZE(_CPPLIB_VER)\n#else\n#  define BOOST_STDLIB \"Dinkumware standard library version 1.x\"\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/stdlib/libcomo.hpp",
    "content": "//  (C) Copyright John Maddock 2002 - 2003. \n//  (C) Copyright Jens Maurer 2002 - 2003. \n//  (C) Copyright Beman Dawes 2002 - 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Comeau STL:\n\n#if !defined(__LIBCOMO__)\n#  include <boost/config/no_tr1/utility.hpp>\n#  if !defined(__LIBCOMO__)\n#      error \"This is not the Comeau STL!\"\n#  endif\n#endif\n\n//\n// std::streambuf<wchar_t> is non-standard\n// NOTE: versions of libcomo prior to beta28 have octal version numbering,\n// e.g. version 25 is 21 (dec)\n#if __LIBCOMO_VERSION__ <= 22\n#  define BOOST_NO_STD_WSTREAMBUF\n#endif\n\n#if (__LIBCOMO_VERSION__ <= 31) && defined(_WIN32)\n#define BOOST_NO_SWPRINTF\n#endif\n\n#if __LIBCOMO_VERSION__ >= 31\n#  define BOOST_HAS_HASH\n#  define BOOST_HAS_SLIST\n#endif\n\n//  C++0x headers not yet implemented\n//\n#  define BOOST_NO_CXX11_HDR_ARRAY\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_EXCEPTION\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_ALLOCATOR\n#  define BOOST_NO_CXX11_POINTER_TRAITS\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_STD_ALIGN\n#  define BOOST_NO_CXX11_ADDRESSOF\n\n#if defined(__has_include)\n#if !__has_include(<shared_mutex>)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#elif __cplusplus < 201402\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#else\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n\n// C++14 features\n#  define BOOST_NO_CXX14_STD_EXCHANGE\n\n// C++17 features\n#  define BOOST_NO_CXX17_STD_APPLY\n#  define BOOST_NO_CXX17_STD_INVOKE\n#  define BOOST_NO_CXX17_ITERATOR_TRAITS\n\n//\n// Intrinsic type_traits support.\n// The SGI STL has it's own __type_traits class, which\n// has intrinsic compiler support with SGI's compilers.\n// Whatever map SGI style type traits to boost equivalents:\n//\n#define BOOST_HAS_SGI_TYPE_TRAITS\n\n#define BOOST_STDLIB \"Comeau standard library \" BOOST_STRINGIZE(__LIBCOMO_VERSION__)\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/stdlib/libcpp.hpp",
    "content": "//  (C) Copyright Christopher Jefferson 2011.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  config for libc++\n//  Might need more in here later.\n\n#if !defined(_LIBCPP_VERSION)\n#  include <ciso646>\n#  if !defined(_LIBCPP_VERSION)\n#      error \"This is not libc++!\"\n#  endif\n#endif\n\n#define BOOST_STDLIB \"libc++ version \" BOOST_STRINGIZE(_LIBCPP_VERSION)\n\n#define BOOST_HAS_THREADS\n\n#ifdef _LIBCPP_HAS_NO_VARIADICS\n#    define BOOST_NO_CXX11_HDR_TUPLE\n#endif\n\n// BOOST_NO_CXX11_ALLOCATOR should imply no support for the C++11\n// allocator model. The C++11 allocator model requires a conforming\n// std::allocator_traits which is only possible with C++11 template\n// aliases since members rebind_alloc and rebind_traits require it.\n#if defined(_LIBCPP_HAS_NO_TEMPLATE_ALIASES)\n#    define BOOST_NO_CXX11_ALLOCATOR\n#    define BOOST_NO_CXX11_POINTER_TRAITS\n#endif\n\n#if __cplusplus < 201103\n//\n// These two appear to be somewhat useable in C++03 mode, there may be others...\n//\n//#  define BOOST_NO_CXX11_HDR_ARRAY\n//#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_EXCEPTION\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_ALLOCATOR\n#  define BOOST_NO_CXX11_POINTER_TRAITS\n#  define BOOST_NO_CXX11_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#  define BOOST_NO_CXX11_STD_ALIGN\n#  define BOOST_NO_CXX11_ADDRESSOF\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#elif _LIBCPP_VERSION < 3700\n//\n// These appear to be unusable/incomplete so far:\n//\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#endif\n\n\n#if _LIBCPP_VERSION < 3700\n// libc++ uses a non-standard messages_base\n#define BOOST_NO_STD_MESSAGES\n#endif\n\n// C++14 features\n#if (_LIBCPP_VERSION < 3700) || (__cplusplus <= 201402L)\n#  define BOOST_NO_CXX14_STD_EXCHANGE\n#endif\n\n// C++17 features\n#if (_LIBCPP_VERSION < 4000) || (__cplusplus <= 201402L)\n#  define BOOST_NO_CXX17_STD_APPLY\n#  define BOOST_NO_CXX17_HDR_OPTIONAL\n#  define BOOST_NO_CXX17_HDR_STRING_VIEW\n#  define BOOST_NO_CXX17_HDR_VARIANT\n#endif\n#if (_LIBCPP_VERSION > 4000) && (__cplusplus > 201402L) && !defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)\n#  define BOOST_NO_AUTO_PTR\n#endif\n#if (_LIBCPP_VERSION > 4000) && (__cplusplus > 201402L) && !defined(_LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE)\n#  define BOOST_NO_CXX98_RANDOM_SHUFFLE\n#endif\n#if (_LIBCPP_VERSION > 4000) && (__cplusplus > 201402L) && !defined(_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS)\n#  define BOOST_NO_CXX98_BINDERS\n#endif\n\n#if defined(__cplusplus) && defined(__has_include)\n#if __has_include(<version>)\n#include <version>\n\n#if !defined(__cpp_lib_execution) || (__cpp_lib_execution < 201603L)\n#  define BOOST_NO_CXX17_HDR_EXECUTION\n#endif\n#if !defined(__cpp_lib_invoke) || (__cpp_lib_invoke < 201411L)\n#define BOOST_NO_CXX17_STD_INVOKE\n#endif\n\n#if(_LIBCPP_VERSION < 9000)\n// as_writable_bytes is missing.\n#  define BOOST_NO_CXX20_HDR_SPAN\n#endif\n\n#else\n#define BOOST_NO_CXX17_STD_INVOKE      // Invoke support is incomplete (no invoke_result)\n#define BOOST_NO_CXX17_HDR_EXECUTION\n#endif\n#else\n#define BOOST_NO_CXX17_STD_INVOKE      // Invoke support is incomplete (no invoke_result)\n#define BOOST_NO_CXX17_HDR_EXECUTION\n#endif\n\n#if _LIBCPP_VERSION < 10000  // What's the correct version check here?\n#define BOOST_NO_CXX17_ITERATOR_TRAITS\n#endif\n\n#if (_LIBCPP_VERSION <= 1101) && !defined(BOOST_NO_CXX11_THREAD_LOCAL)\n// This is a bit of a sledgehammer, because really it's just libc++abi that has no\n// support for thread_local, leading to linker errors such as\n// \"undefined reference to `__cxa_thread_atexit'\".  It is fixed in the\n// most recent releases of libc++abi though...\n#  define BOOST_NO_CXX11_THREAD_LOCAL\n#endif\n\n#if defined(__linux__) && (_LIBCPP_VERSION < 6000) && !defined(BOOST_NO_CXX11_THREAD_LOCAL)\n// After libc++-dev is installed on Trusty, clang++-libc++ almost works,\n// except uses of `thread_local` fail with undefined reference to\n// `__cxa_thread_atexit`.\n//\n// clang's libc++abi provides an implementation by deferring to the glibc\n// implementation, which may or may not be available (it is not on Trusty).\n// clang 4's libc++abi will provide an implementation if one is not in glibc\n// though, so thread local support should work with clang 4 and above as long\n// as libc++abi is linked in.\n#  define BOOST_NO_CXX11_THREAD_LOCAL\n#endif\n\n#if defined(__has_include)\n#if !__has_include(<shared_mutex>)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#elif __cplusplus <= 201103\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#elif __cplusplus < 201402\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n\n#if !defined(BOOST_NO_CXX14_HDR_SHARED_MUTEX) && (_LIBCPP_VERSION < 5000)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n\n#if _LIBCPP_VERSION >= 15000\n//\n// Unary function is now deprecated in C++11 and later:\n//\n#if __cplusplus >= 201103L\n#define BOOST_NO_CXX98_FUNCTION_BASE\n#endif\n#endif\n\n//  --- end ---\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/stdlib/libstdcpp3.hpp",
    "content": "//  (C) Copyright John Maddock 2001.\n//  (C) Copyright Jens Maurer 2001.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  config for libstdc++ v3\n//  not much to go in here:\n\n#define BOOST_GNU_STDLIB 1\n\n#ifdef __GLIBCXX__\n#define BOOST_STDLIB \"GNU libstdc++ version \" BOOST_STRINGIZE(__GLIBCXX__)\n#else\n#define BOOST_STDLIB \"GNU libstdc++ version \" BOOST_STRINGIZE(__GLIBCPP__)\n#endif\n\n#if !defined(_GLIBCPP_USE_WCHAR_T) && !defined(_GLIBCXX_USE_WCHAR_T)\n#  define BOOST_NO_CWCHAR\n#  define BOOST_NO_CWCTYPE\n#  define BOOST_NO_STD_WSTRING\n#  define BOOST_NO_STD_WSTREAMBUF\n#endif\n\n#if defined(__osf__) && !defined(_REENTRANT) \\\n  && ( defined(_GLIBCXX_HAVE_GTHR_DEFAULT) || defined(_GLIBCPP_HAVE_GTHR_DEFAULT) )\n// GCC 3 on Tru64 forces the definition of _REENTRANT when any std lib header\n// file is included, therefore for consistency we define it here as well.\n#  define _REENTRANT\n#endif\n\n#ifdef __GLIBCXX__ // gcc 3.4 and greater:\n#  if defined(_GLIBCXX_HAVE_GTHR_DEFAULT) \\\n        || defined(_GLIBCXX__PTHREADS) \\\n        || defined(_GLIBCXX_HAS_GTHREADS) \\\n        || defined(_WIN32) \\\n        || defined(_AIX) \\\n        || defined(__HAIKU__)\n      //\n      // If the std lib has thread support turned on, then turn it on in Boost\n      // as well.  We do this because some gcc-3.4 std lib headers define _REENTANT\n      // while others do not...\n      //\n#     define BOOST_HAS_THREADS\n#  else\n#     define BOOST_DISABLE_THREADS\n#  endif\n#elif defined(__GLIBCPP__) \\\n        && !defined(_GLIBCPP_HAVE_GTHR_DEFAULT) \\\n        && !defined(_GLIBCPP__PTHREADS)\n   // disable thread support if the std lib was built single threaded:\n#  define BOOST_DISABLE_THREADS\n#endif\n\n#if (defined(linux) || defined(__linux) || defined(__linux__)) && defined(__arm__) && defined(_GLIBCPP_HAVE_GTHR_DEFAULT)\n// linux on arm apparently doesn't define _REENTRANT\n// so just turn on threading support whenever the std lib is thread safe:\n#  define BOOST_HAS_THREADS\n#endif\n\n#if !defined(_GLIBCPP_USE_LONG_LONG) \\\n    && !defined(_GLIBCXX_USE_LONG_LONG)\\\n    && defined(BOOST_HAS_LONG_LONG)\n// May have been set by compiler/*.hpp, but \"long long\" without library\n// support is useless.\n#  undef BOOST_HAS_LONG_LONG\n#endif\n\n// Apple doesn't seem to reliably defined a *unix* macro\n#if !defined(CYGWIN) && (  defined(__unix__)  \\\n                        || defined(__unix)    \\\n                        || defined(unix)      \\\n                        || defined(__APPLE__) \\\n                        || defined(__APPLE)   \\\n                        || defined(APPLE))\n#  include <unistd.h>\n#endif\n\n#ifndef __VXWORKS__ // VxWorks uses Dinkum, not GNU STL with GCC \n#if defined(__GLIBCXX__) || (defined(__GLIBCPP__) && __GLIBCPP__>=20020514) // GCC >= 3.1.0\n#  define BOOST_STD_EXTENSION_NAMESPACE __gnu_cxx\n#  define BOOST_HAS_SLIST\n#  define BOOST_HAS_HASH\n#  define BOOST_SLIST_HEADER <ext/slist>\n# if !defined(__GNUC__) || __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)\n#   define BOOST_HASH_SET_HEADER <ext/hash_set>\n#   define BOOST_HASH_MAP_HEADER <ext/hash_map>\n# else\n#   define BOOST_HASH_SET_HEADER <backward/hash_set>\n#   define BOOST_HASH_MAP_HEADER <backward/hash_map>\n# endif\n#endif\n#endif\n\n#if defined(__has_include)\n#if defined(BOOST_HAS_HASH)\n#if !__has_include(BOOST_HASH_SET_HEADER) || (__GNUC__ >= 10)\n#undef BOOST_HAS_HASH\n#undef BOOST_HAS_SET_HEADER\n#undef BOOST_HAS_MAP_HEADER\n#endif\n#if !__has_include(BOOST_SLIST_HEADER)\n#undef BOOST_HAS_SLIST\n#undef BOOST_HAS_SLIST_HEADER\n#endif\n#endif\n#endif\n\n//\n// Decide whether we have C++11 support turned on:\n//\n#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103)\n#  define BOOST_LIBSTDCXX11\n#endif\n\n//\n//  Decide which version of libstdc++ we have, normally\n//  libstdc++ C++0x support is detected via __GNUC__, __GNUC_MINOR__, and possibly\n//  __GNUC_PATCHLEVEL__ at the suggestion of Jonathan Wakely, one of the libstdc++\n//  developers. He also commented:\n//\n//       \"I'm not sure how useful __GLIBCXX__ is for your purposes, for instance in\n//       GCC 4.2.4 it is set to 20080519 but in GCC 4.3.0 it is set to 20080305.\n//       Although 4.3.0 was released earlier than 4.2.4, it has better C++0x support\n//       than any release in the 4.2 series.\"\n//\n//  Another resource for understanding libstdc++ features is:\n//  http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#manual.intro.status.standard.200x\n//\n//  However, using the GCC version number fails when the compiler is clang since this\n//  only ever claims to emulate GCC-4.2, see https://svn.boost.org/trac/boost/ticket/7473\n//  for a long discussion on this issue.  What we can do though is use clang's __has_include\n//  to detect the presence of a C++11 header that was introduced with a specific GCC release.\n//  We still have to be careful though as many such headers were buggy and/or incomplete when\n//  first introduced, so we only check for headers that were fully featured from day 1, and then\n//  use that to infer the underlying GCC version:\n//\n#ifdef __clang__\n\n#if __has_include(<expected>)\n#  define BOOST_LIBSTDCXX_VERSION 120100\n#elif __has_include(<source_location>)\n#  define BOOST_LIBSTDCXX_VERSION 110100\n#elif __has_include(<compare>)\n#  define BOOST_LIBSTDCXX_VERSION 100100\n#elif __has_include(<memory_resource>)\n#  define BOOST_LIBSTDCXX_VERSION 90100\n#elif __has_include(<charconv>)\n#  define BOOST_LIBSTDCXX_VERSION 80100\n#elif __has_include(<variant>)\n#  define BOOST_LIBSTDCXX_VERSION 70100\n#elif __has_include(<experimental/memory_resource>)\n#  define BOOST_LIBSTDCXX_VERSION 60100\n#elif __has_include(<experimental/any>)\n#  define BOOST_LIBSTDCXX_VERSION 50100\n#elif __has_include(<shared_mutex>)\n#  define BOOST_LIBSTDCXX_VERSION 40900\n#elif __has_include(<ext/cmath>)\n#  define BOOST_LIBSTDCXX_VERSION 40800\n#elif __has_include(<scoped_allocator>)\n#  define BOOST_LIBSTDCXX_VERSION 40700\n#elif __has_include(<typeindex>)\n#  define BOOST_LIBSTDCXX_VERSION 40600\n#elif __has_include(<future>)\n#  define BOOST_LIBSTDCXX_VERSION 40500\n#elif  __has_include(<ratio>)\n#  define BOOST_LIBSTDCXX_VERSION 40400\n#elif __has_include(<array>)\n#  define BOOST_LIBSTDCXX_VERSION 40300\n#endif\n//\n// If BOOST_HAS_FLOAT128 is set, now that we know the std lib is libstdc++3, check to see if the std lib is\n// configured to support this type.  If not disable it:\n//\n#if defined(BOOST_HAS_FLOAT128) && !defined(_GLIBCXX_USE_FLOAT128)\n#  undef BOOST_HAS_FLOAT128\n#endif\n\n#if (BOOST_LIBSTDCXX_VERSION >= 100000) && defined(BOOST_HAS_HASH)\n//\n// hash_set/hash_map deprecated and have terminal bugs:\n//\n#undef BOOST_HAS_HASH\n#undef BOOST_HAS_SET_HEADER\n#undef BOOST_HAS_MAP_HEADER\n#endif\n\n\n#if (BOOST_LIBSTDCXX_VERSION >= 100000) && defined(BOOST_HAS_HASH)\n//\n// hash_set/hash_map deprecated and have terminal bugs:\n//\n#undef BOOST_HAS_HASH\n#undef BOOST_HAS_SET_HEADER\n#undef BOOST_HAS_MAP_HEADER\n#endif\n\n\n#if (BOOST_LIBSTDCXX_VERSION < 50100)\n// libstdc++ does not define this function as it's deprecated in C++11, but clang still looks for it,\n// defining it here is a terrible cludge, but should get things working:\nextern \"C\" char *gets (char *__s);\n#endif\n//\n// clang is unable to parse some GCC headers, add those workarounds here:\n//\n#if BOOST_LIBSTDCXX_VERSION < 50000\n#  define BOOST_NO_CXX11_HDR_REGEX\n#endif\n//\n// GCC 4.7.x has no __cxa_thread_atexit which\n// thread_local objects require for cleanup:\n//\n#if BOOST_LIBSTDCXX_VERSION < 40800\n#  define BOOST_NO_CXX11_THREAD_LOCAL\n#endif\n//\n// Early clang versions can handle <chrono>, not exactly sure which versions\n// but certainly up to clang-3.8 and gcc-4.6:\n//\n#if (__clang_major__ < 5)\n#  if BOOST_LIBSTDCXX_VERSION < 40800\n#     define BOOST_NO_CXX11_HDR_FUTURE\n#     define BOOST_NO_CXX11_HDR_MUTEX\n#     define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#     define BOOST_NO_CXX11_HDR_CHRONO\n#  endif\n#endif\n\n//\n//  GCC 4.8 and 9 add working versions of <atomic> and <regex> respectively.\n//  However, we have no test for these as the headers were present but broken\n//  in early GCC versions.\n//\n#endif\n\n#if defined(__SUNPRO_CC) && (__SUNPRO_CC >= 0x5130) && (__cplusplus >= 201103L)\n//\n// Oracle Solaris compiler uses it's own verison of libstdc++ but doesn't \n// set __GNUC__\n//\n#if __SUNPRO_CC >= 0x5140\n#define BOOST_LIBSTDCXX_VERSION 50100\n#else\n#define BOOST_LIBSTDCXX_VERSION 40800\n#endif\n#endif\n\n#if !defined(BOOST_LIBSTDCXX_VERSION)\n#  define BOOST_LIBSTDCXX_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)\n#endif\n\n// std::auto_ptr isn't provided with _GLIBCXX_DEPRECATED=0 (GCC 4.5 and earlier)\n// or _GLIBCXX_USE_DEPRECATED=0 (GCC 4.6 and later).\n#if defined(BOOST_LIBSTDCXX11)\n#  if BOOST_LIBSTDCXX_VERSION < 40600\n#     if !_GLIBCXX_DEPRECATED\n#        define BOOST_NO_AUTO_PTR\n#     endif\n#  elif !_GLIBCXX_USE_DEPRECATED\n#     define BOOST_NO_AUTO_PTR\n#     define BOOST_NO_CXX98_BINDERS\n#  endif\n#endif\n\n//  C++0x headers in GCC 4.3.0 and later\n//\n#if (BOOST_LIBSTDCXX_VERSION < 40300) || !defined(BOOST_LIBSTDCXX11)\n#  define BOOST_NO_CXX11_HDR_ARRAY\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#endif\n\n//  C++0x headers in GCC 4.4.0 and later\n//\n#if (BOOST_LIBSTDCXX_VERSION < 40400) || !defined(BOOST_LIBSTDCXX11)\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_EXCEPTION\n#else\n#  define BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG \n#  define BOOST_HAS_TR1_COMPLEX_OVERLOADS \n#endif\n\n//  C++0x features in GCC 4.5.0 and later\n//\n#if (BOOST_LIBSTDCXX_VERSION < 40500) || !defined(BOOST_LIBSTDCXX11)\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#endif\n\n//  C++0x features in GCC 4.6.0 and later\n//\n#if (BOOST_LIBSTDCXX_VERSION < 40600) || !defined(BOOST_LIBSTDCXX11)\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_ADDRESSOF\n#  define BOOST_NO_CXX17_ITERATOR_TRAITS\n#endif\n\n//  C++0x features in GCC 4.7.0 and later\n//\n#if (BOOST_LIBSTDCXX_VERSION < 40700) || !defined(BOOST_LIBSTDCXX11)\n// Note that although <chrono> existed prior to 4.7, \"steady_clock\" is spelled \"monotonic_clock\"\n// so 4.7.0 is the first truly conforming one.\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_ALLOCATOR\n#  define BOOST_NO_CXX11_POINTER_TRAITS\n#endif\n//  C++0x features in GCC 4.8.0 and later\n//\n#if (BOOST_LIBSTDCXX_VERSION < 40800) || !defined(BOOST_LIBSTDCXX11)\n// Note that although <atomic> existed prior to gcc 4.8 it was largely unimplemented for many types:\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_HDR_THREAD\n#endif\n//  C++0x features in GCC 4.9.0 and later\n//\n#if (BOOST_LIBSTDCXX_VERSION < 40900) || !defined(BOOST_LIBSTDCXX11)\n// Although <regex> is present and compilable against, the actual implementation is not functional\n// even for the simplest patterns such as \"\\d\" or \"[0-9]\". This is the case at least in gcc up to 4.8, inclusively.\n#  define BOOST_NO_CXX11_HDR_REGEX\n#endif\n#if (BOOST_LIBSTDCXX_VERSION < 40900) || (__cplusplus <= 201103)\n#  define BOOST_NO_CXX14_STD_EXCHANGE\n#endif\n\n//\n//  C++0x features in GCC 5.1 and later\n//\n#if (BOOST_LIBSTDCXX_VERSION < 50100) || !defined(BOOST_LIBSTDCXX11)\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_STD_ALIGN\n#endif\n\n//\n//  C++17 features in GCC 7.1 and later\n//\n#if (BOOST_LIBSTDCXX_VERSION < 70100) || (__cplusplus <= 201402L)\n#  define BOOST_NO_CXX17_STD_INVOKE\n#  define BOOST_NO_CXX17_STD_APPLY\n#  define BOOST_NO_CXX17_HDR_OPTIONAL\n#  define BOOST_NO_CXX17_HDR_STRING_VIEW\n#  define BOOST_NO_CXX17_HDR_VARIANT\n#endif\n\n#if defined(__has_include)\n#if !__has_include(<shared_mutex>)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#elif __cplusplus <= 201103\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n//\n// <execution> has a dependency to Intel's thread building blocks:\n// unless these are installed seperately, including <execution> leads\n// to inscrutable errors inside libstdc++'s own headers.\n//\n#if (BOOST_LIBSTDCXX_VERSION < 100100)\n#if !__has_include(<tbb/tbb.h>)\n#define BOOST_NO_CXX17_HDR_EXECUTION\n#endif\n#endif\n#elif __cplusplus < 201402 || (BOOST_LIBSTDCXX_VERSION < 40900) || !defined(BOOST_LIBSTDCXX11)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n\n#if BOOST_LIBSTDCXX_VERSION < 100100\n//\n// The header may be present but is incomplete:\n//\n#  define BOOST_NO_CXX17_HDR_CHARCONV\n#endif\n\n#if BOOST_LIBSTDCXX_VERSION < 110000\n//\n// Header <bit> may be present but lacks std::bit_cast:\n//\n#define BOOST_NO_CXX20_HDR_BIT\n#endif\n\n#if BOOST_LIBSTDCXX_VERSION >= 120000\n//\n// Unary function is now deprecated in C++11 and later:\n//\n#if __cplusplus >= 201103L\n#define BOOST_NO_CXX98_FUNCTION_BASE\n#endif\n#endif\n\n#ifndef __cpp_impl_coroutine\n#  define BOOST_NO_CXX20_HDR_COROUTINE\n#endif\n\n//\n// These next defines are mostly for older clang versions with a newer libstdc++ :\n//\n#if !defined(__cpp_lib_concepts)\n#if !defined(BOOST_NO_CXX20_HDR_COMPARE)\n#  define BOOST_NO_CXX20_HDR_COMPARE\n#endif\n#if !defined(BOOST_NO_CXX20_HDR_CONCEPTS)\n#  define BOOST_NO_CXX20_HDR_CONCEPTS\n#endif\n#if !defined(BOOST_NO_CXX20_HDR_SPAN)\n#  define BOOST_NO_CXX20_HDR_SPAN\n#endif\n#if !defined(BOOST_NO_CXX20_HDR_RANGES)\n#  define BOOST_NO_CXX20_HDR_RANGES\n#endif\n#endif\n\n#if defined(__clang__)\n#if (__clang_major__ < 11) && !defined(BOOST_NO_CXX20_HDR_RANGES)\n#  define BOOST_NO_CXX20_HDR_RANGES\n#endif\n#if (__clang_major__ < 10) && (BOOST_LIBSTDCXX_VERSION >= 110000) && !defined(BOOST_NO_CXX11_HDR_CHRONO)\n// Old clang can't parse <chrono>:\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#endif\n#endif\n\n//\n// Headers not present on Solaris with the Oracle compiler:\n#if defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x5140)\n#define BOOST_NO_CXX11_HDR_FUTURE\n#define BOOST_NO_CXX11_HDR_FORWARD_LIST \n#define BOOST_NO_CXX11_HDR_ATOMIC\n// shared_ptr is present, but is not convertible to bool\n// which causes all kinds of problems especially in Boost.Thread\n// but probably elsewhere as well.\n#define BOOST_NO_CXX11_SMART_PTR\n#endif\n\n#if (!defined(_GLIBCXX_HAS_GTHREADS) || !defined(_GLIBCXX_USE_C99_STDINT_TR1))\n   // Headers not always available:\n#  ifndef BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#     define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  endif\n#  ifndef BOOST_NO_CXX11_HDR_MUTEX\n#     define BOOST_NO_CXX11_HDR_MUTEX\n#  endif\n#  ifndef BOOST_NO_CXX11_HDR_THREAD\n#     define BOOST_NO_CXX11_HDR_THREAD\n#  endif\n#  ifndef BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#     define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#  endif\n#endif\n\n#if (!defined(_GTHREAD_USE_MUTEX_TIMEDLOCK) || (_GTHREAD_USE_MUTEX_TIMEDLOCK == 0)) && !defined(BOOST_NO_CXX11_HDR_MUTEX) && (__GNUC__ < 6)\n// Timed mutexes are not always available:\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#endif\n\n//  --- end ---\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/stdlib/modena.hpp",
    "content": "//  (C) Copyright Jens Maurer 2001. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Modena C++ standard library (comes with KAI C++)\n\n#if !defined(MSIPL_COMPILE_H)\n#  include <boost/config/no_tr1/utility.hpp>\n#  if !defined(__MSIPL_COMPILE_H)\n#      error \"This is not the Modena C++ library!\"\n#  endif\n#endif\n\n#ifndef MSIPL_NL_TYPES\n#define BOOST_NO_STD_MESSAGES\n#endif\n\n#ifndef MSIPL_WCHART\n#define BOOST_NO_STD_WSTRING\n#endif\n\n//  C++0x headers not yet implemented\n//\n#  define BOOST_NO_CXX11_HDR_ARRAY\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_ALLOCATOR\n#  define BOOST_NO_CXX11_POINTER_TRAITS\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_STD_ALIGN\n#  define BOOST_NO_CXX11_ADDRESSOF\n#  define BOOST_NO_CXX11_HDR_EXCEPTION\n\n#if defined(__has_include)\n#if !__has_include(<shared_mutex>)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#elif __cplusplus < 201402\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#else\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n\n// C++14 features\n#  define BOOST_NO_CXX14_STD_EXCHANGE\n\n// C++17 features\n#  define BOOST_NO_CXX17_STD_APPLY\n#  define BOOST_NO_CXX17_STD_INVOKE\n#  define BOOST_NO_CXX17_ITERATOR_TRAITS\n\n#define BOOST_STDLIB \"Modena C++ standard library\"\n\n\n\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/stdlib/msl.hpp",
    "content": "//  (C) Copyright John Maddock 2001. \n//  (C) Copyright Darin Adler 2001. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Metrowerks standard library:\n\n#ifndef __MSL_CPP__\n#  include <boost/config/no_tr1/utility.hpp>\n#  ifndef __MSL_CPP__\n#     error This is not the MSL standard library!\n#  endif\n#endif\n\n#if __MSL_CPP__ >= 0x6000  // Pro 6\n#  define BOOST_HAS_HASH\n#  define BOOST_STD_EXTENSION_NAMESPACE Metrowerks\n#endif\n#define BOOST_HAS_SLIST\n\n#if __MSL_CPP__ < 0x6209\n#  define BOOST_NO_STD_MESSAGES\n#endif\n\n// check C lib version for <stdint.h>\n#include <cstddef>\n\n#if defined(__MSL__) && (__MSL__ >= 0x5000)\n#  define BOOST_HAS_STDINT_H\n#  if !defined(__PALMOS_TRAPS__)\n#    define BOOST_HAS_UNISTD_H\n#  endif\n   // boilerplate code:\n#  include <boost/config/detail/posix_features.hpp>\n#endif\n\n#if defined(_MWMT) || _MSL_THREADSAFE\n#  define BOOST_HAS_THREADS\n#endif\n\n#ifdef _MSL_NO_EXPLICIT_FUNC_TEMPLATE_ARG\n#  define BOOST_NO_STD_USE_FACET\n#  define BOOST_HAS_TWO_ARG_USE_FACET\n#endif\n\n//  C++0x headers not yet implemented\n//\n#  define BOOST_NO_CXX11_HDR_ARRAY\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_ALLOCATOR\n#  define BOOST_NO_CXX11_POINTER_TRAITS\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_STD_ALIGN\n#  define BOOST_NO_CXX11_ADDRESSOF\n#  define BOOST_NO_CXX11_HDR_EXCEPTION\n\n#if defined(__has_include)\n#if !__has_include(<shared_mutex>)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#elif __cplusplus < 201402\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#else\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n\n// C++14 features\n#  define BOOST_NO_CXX14_STD_EXCHANGE\n\n// C++17 features\n#  define BOOST_NO_CXX17_STD_APPLY\n#  define BOOST_NO_CXX17_STD_INVOKE\n#  define BOOST_NO_CXX17_ITERATOR_TRAITS\n\n#define BOOST_STDLIB \"Metrowerks Standard Library version \" BOOST_STRINGIZE(__MSL_CPP__)\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/stdlib/roguewave.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Jens Maurer 2001. \n//  (C) Copyright David Abrahams 2003. \n//  (C) Copyright Boris Gubenko 2007. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Rogue Wave std lib:\n\n#define BOOST_RW_STDLIB 1 \n\n#if !defined(__STD_RWCOMPILER_H__) && !defined(_RWSTD_VER)\n#  include <boost/config/no_tr1/utility.hpp>\n#  if !defined(__STD_RWCOMPILER_H__) && !defined(_RWSTD_VER)\n#     error This is not the Rogue Wave standard library\n#  endif\n#endif\n//\n// figure out a consistent version number:\n//\n#ifndef _RWSTD_VER\n#  define BOOST_RWSTD_VER 0x010000\n#elif _RWSTD_VER < 0x010000\n#  define BOOST_RWSTD_VER (_RWSTD_VER << 8)\n#else\n#  define BOOST_RWSTD_VER _RWSTD_VER\n#endif\n\n#ifndef _RWSTD_VER\n#  define BOOST_STDLIB \"Rogue Wave standard library version (Unknown version)\"\n#elif _RWSTD_VER < 0x04010200\n #  define BOOST_STDLIB \"Rogue Wave standard library version \" BOOST_STRINGIZE(_RWSTD_VER)\n#else\n#  ifdef _RWSTD_VER_STR\n#    define BOOST_STDLIB \"Apache STDCXX standard library version \" _RWSTD_VER_STR\n#  else\n#    define BOOST_STDLIB \"Apache STDCXX standard library version \" BOOST_STRINGIZE(_RWSTD_VER)\n#  endif\n#endif\n\n//\n// Prior to version 2.2.0 the primary template for std::numeric_limits\n// does not have compile time constants, even though specializations of that\n// template do:\n//\n#if BOOST_RWSTD_VER < 0x020200\n#  define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS\n#endif\n\n// Sun CC 5.5 patch 113817-07 adds long long specialization, but does not change the\n// library version number (http://sunsolve6.sun.com/search/document.do?assetkey=1-21-113817):\n#if BOOST_RWSTD_VER <= 0x020101 && (!defined(__SUNPRO_CC) || (__SUNPRO_CC < 0x550))\n#  define BOOST_NO_LONG_LONG_NUMERIC_LIMITS\n# endif\n\n//\n// Borland version of numeric_limits lacks __int64 specialisation:\n//\n#ifdef BOOST_BORLANDC\n#  define BOOST_NO_MS_INT64_NUMERIC_LIMITS\n#endif\n\n//\n// No std::iterator if it can't figure out default template args:\n//\n#if defined(_RWSTD_NO_SIMPLE_DEFAULT_TEMPLATES) || defined(RWSTD_NO_SIMPLE_DEFAULT_TEMPLATES) || (BOOST_RWSTD_VER < 0x020000)\n#  define BOOST_NO_STD_ITERATOR\n#endif\n\n//\n// No iterator traits without partial specialization:\n//\n#if defined(_RWSTD_NO_CLASS_PARTIAL_SPEC) || defined(RWSTD_NO_CLASS_PARTIAL_SPEC)\n#  define BOOST_NO_STD_ITERATOR_TRAITS\n#endif\n\n//\n// Prior to version 2.0, std::auto_ptr was buggy, and there were no\n// new-style iostreams, and no conformant std::allocator:\n//\n#if (BOOST_RWSTD_VER < 0x020000)\n#  define BOOST_NO_AUTO_PTR\n#  define BOOST_NO_STRINGSTREAM\n#  define BOOST_NO_STD_ALLOCATOR\n#  define BOOST_NO_STD_LOCALE\n#endif\n\n//\n// No template iterator constructors without member template support:\n//\n#if defined(RWSTD_NO_MEMBER_TEMPLATES) || defined(_RWSTD_NO_MEMBER_TEMPLATES)\n#  define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS\n#endif\n\n//\n// RW defines _RWSTD_ALLOCATOR if the allocator is conformant and in use\n// (the or _HPACC_ part is a hack - the library seems to define _RWSTD_ALLOCATOR\n// on HP aCC systems even though the allocator is in fact broken):\n//\n#if !defined(_RWSTD_ALLOCATOR) || (defined(__HP_aCC) && __HP_aCC <= 33100)\n#  define BOOST_NO_STD_ALLOCATOR\n#endif\n\n//\n// If we have a std::locale, we still may not have std::use_facet:\n//\n#if defined(_RWSTD_NO_TEMPLATE_ON_RETURN_TYPE) && !defined(BOOST_NO_STD_LOCALE)\n#  define BOOST_NO_STD_USE_FACET\n#  define BOOST_HAS_TWO_ARG_USE_FACET\n#endif\n\n//\n// There's no std::distance prior to version 2, or without\n// partial specialization support:\n//\n#if (BOOST_RWSTD_VER < 0x020000) || defined(_RWSTD_NO_CLASS_PARTIAL_SPEC)\n    #define BOOST_NO_STD_DISTANCE\n#endif\n\n//\n// Some versions of the rogue wave library don't have assignable\n// OutputIterators:\n//\n#if BOOST_RWSTD_VER < 0x020100\n#  define BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN\n#endif\n\n//\n// Disable BOOST_HAS_LONG_LONG when the library has no support for it.\n//\n#if !defined(_RWSTD_LONG_LONG) && defined(BOOST_HAS_LONG_LONG)\n#  undef BOOST_HAS_LONG_LONG\n#endif\n\n//\n// check that on HP-UX, the proper RW library is used\n//\n#if defined(__HP_aCC) && !defined(_HP_NAMESPACE_STD)\n#  error \"Boost requires Standard RW library. Please compile and link with -AA\"\n#endif\n\n//\n// Define macros specific to RW V2.2 on HP-UX\n//\n#if defined(__HP_aCC) && (BOOST_RWSTD_VER == 0x02020100)\n#  ifndef __HP_TC1_MAKE_PAIR\n#    define __HP_TC1_MAKE_PAIR\n#  endif\n#  ifndef _HP_INSTANTIATE_STD2_VL\n#    define _HP_INSTANTIATE_STD2_VL\n#  endif\n#endif\n\n#if _RWSTD_VER < 0x05000000\n#  define BOOST_NO_CXX11_HDR_ARRAY\n#endif\n// type_traits header is incomplete:\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n//\n//  C++0x headers not yet implemented\n//\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_ALLOCATOR\n#  define BOOST_NO_CXX11_POINTER_TRAITS\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_STD_ALIGN\n#  define BOOST_NO_CXX11_ADDRESSOF\n#  define BOOST_NO_CXX11_HDR_EXCEPTION\n\n#if defined(__has_include)\n#if !__has_include(<shared_mutex>)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#elif __cplusplus < 201402\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#else\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n\n// C++14 features\n#  define BOOST_NO_CXX14_STD_EXCHANGE\n\n// C++17 features\n#  define BOOST_NO_CXX17_STD_APPLY\n#  define BOOST_NO_CXX17_STD_INVOKE\n#  define BOOST_NO_CXX17_ITERATOR_TRAITS\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/stdlib/sgi.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Darin Adler 2001. \n//  (C) Copyright Jens Maurer 2001 - 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  generic SGI STL:\n\n#if !defined(__STL_CONFIG_H)\n#  include <boost/config/no_tr1/utility.hpp>\n#  if !defined(__STL_CONFIG_H)\n#      error \"This is not the SGI STL!\"\n#  endif\n#endif\n\n//\n// No std::iterator traits without partial specialisation:\n//\n#if !defined(__STL_CLASS_PARTIAL_SPECIALIZATION)\n#  define BOOST_NO_STD_ITERATOR_TRAITS\n#endif\n\n//\n// No std::stringstream with gcc < 3\n//\n#if defined(__GNUC__) && (__GNUC__ < 3) && \\\n     ((__GNUC_MINOR__ < 95) || (__GNUC_MINOR__ == 96)) && \\\n     !defined(__STL_USE_NEW_IOSTREAMS) || \\\n   defined(__APPLE_CC__)\n   // Note that we only set this for GNU C++ prior to 2.95 since the\n   // latest patches for that release do contain a minimal <sstream>\n   // If you are running a 2.95 release prior to 2.95.3 then this will need\n   // setting, but there is no way to detect that automatically (other\n   // than by running the configure script).\n   // Also, the unofficial GNU C++ 2.96 included in RedHat 7.1 doesn't\n   // have <sstream>.\n#  define BOOST_NO_STRINGSTREAM\n#endif\n\n// Apple doesn't seem to reliably defined a *unix* macro\n#if !defined(CYGWIN) && (  defined(__unix__)  \\\n                        || defined(__unix)    \\\n                        || defined(unix)      \\\n                        || defined(__APPLE__) \\\n                        || defined(__APPLE)   \\\n                        || defined(APPLE))\n#  include <unistd.h>\n#endif\n\n\n//\n// Assume no std::locale without own iostreams (this may be an\n// incorrect assumption in some cases):\n//\n#if !defined(__SGI_STL_OWN_IOSTREAMS) && !defined(__STL_USE_NEW_IOSTREAMS)\n#  define BOOST_NO_STD_LOCALE\n#endif\n\n//\n// Original native SGI streams have non-standard std::messages facet:\n//\n#if defined(__sgi) && (_COMPILER_VERSION <= 650) && !defined(__SGI_STL_OWN_IOSTREAMS)\n#  define BOOST_NO_STD_LOCALE\n#endif\n\n//\n// SGI's new iostreams have missing \"const\" in messages<>::open\n//\n#if defined(__sgi) && (_COMPILER_VERSION <= 740) && defined(__STL_USE_NEW_IOSTREAMS)\n#  define BOOST_NO_STD_MESSAGES\n#endif\n\n//\n// No template iterator constructors, or std::allocator\n// without member templates:\n//\n#if !defined(__STL_MEMBER_TEMPLATES)\n#  define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS\n#  define BOOST_NO_STD_ALLOCATOR\n#endif\n\n//\n// We always have SGI style hash_set, hash_map, and slist:\n//\n#define BOOST_HAS_HASH\n#define BOOST_HAS_SLIST\n\n//\n// If this is GNU libstdc++2, then no <limits> and no std::wstring:\n//\n#if (defined(__GNUC__) && (__GNUC__ < 3))\n#  include <string>\n#  if defined(__BASTRING__)\n#     define BOOST_NO_LIMITS\n// Note: <boost/limits.hpp> will provide compile-time constants\n#     undef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS\n#     define BOOST_NO_STD_WSTRING\n#  endif\n#endif\n\n//\n// There is no standard iterator unless we have namespace support:\n//\n#if !defined(__STL_USE_NAMESPACES)\n#  define BOOST_NO_STD_ITERATOR\n#endif\n\n//\n// Intrinsic type_traits support.\n// The SGI STL has it's own __type_traits class, which\n// has intrinsic compiler support with SGI's compilers.\n// Whatever map SGI style type traits to boost equivalents:\n//\n#define BOOST_HAS_SGI_TYPE_TRAITS\n\n//  C++0x headers not yet implemented\n//\n#  define BOOST_NO_CXX11_HDR_ARRAY\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_ALLOCATOR\n#  define BOOST_NO_CXX11_POINTER_TRAITS\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_STD_ALIGN\n#  define BOOST_NO_CXX11_ADDRESSOF\n#  define BOOST_NO_CXX11_HDR_EXCEPTION\n\n#if defined(__has_include)\n#if !__has_include(<shared_mutex>)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#elif __cplusplus < 201402\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#else\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n\n// C++14 features\n#  define BOOST_NO_CXX14_STD_EXCHANGE\n\n// C++17 features\n#  define BOOST_NO_CXX17_STD_APPLY\n#  define BOOST_NO_CXX17_STD_INVOKE\n#  define BOOST_NO_CXX17_ITERATOR_TRAITS\n\n#define BOOST_STDLIB \"SGI standard library\"\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/stdlib/stlport.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2002. \n//  (C) Copyright Darin Adler 2001. \n//  (C) Copyright Jens Maurer 2001. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  STLPort standard library config:\n\n#if !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)\n#  include <cstddef>\n#  if !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)\n#      error \"This is not STLPort!\"\n#  endif\n#endif\n\n// Apple doesn't seem to reliably defined a *unix* macro\n#if !defined(CYGWIN) && (  defined(__unix__)  \\\n                        || defined(__unix)    \\\n                        || defined(unix)      \\\n                        || defined(__APPLE__) \\\n                        || defined(__APPLE)   \\\n                        || defined(APPLE))\n#  include <unistd.h>\n#endif\n\n//\n// __STL_STATIC_CONST_INIT_BUG implies BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS\n// for versions prior to 4.1(beta)\n//\n#if (defined(__STL_STATIC_CONST_INIT_BUG) || defined(_STLP_STATIC_CONST_INIT_BUG)) && (__SGI_STL_PORT <= 0x400)\n#  define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS\n#endif\n\n//\n// If STLport thinks that there is no partial specialisation, then there is no\n// std::iterator traits:\n//\n#if !(defined(_STLP_CLASS_PARTIAL_SPECIALIZATION) || defined(__STL_CLASS_PARTIAL_SPECIALIZATION))\n#  define BOOST_NO_STD_ITERATOR_TRAITS\n#endif\n\n//\n// No new style iostreams on GCC without STLport's iostreams enabled:\n//\n#if (defined(__GNUC__) && (__GNUC__ < 3)) && !(defined(__SGI_STL_OWN_IOSTREAMS) || defined(_STLP_OWN_IOSTREAMS))\n#  define BOOST_NO_STRINGSTREAM\n#endif\n\n//\n// No new iostreams implies no std::locale, and no std::stringstream:\n//\n#if defined(__STL_NO_IOSTREAMS) || defined(__STL_NO_NEW_IOSTREAMS) || defined(_STLP_NO_IOSTREAMS) || defined(_STLP_NO_NEW_IOSTREAMS)\n#  define BOOST_NO_STD_LOCALE\n#  define BOOST_NO_STRINGSTREAM\n#endif\n\n//\n// If the streams are not native, and we have a \"using ::x\" compiler bug\n// then the io stream facets are not available in namespace std::\n//\n#ifdef _STLPORT_VERSION\n#  if !(_STLPORT_VERSION >= 0x500) && !defined(_STLP_OWN_IOSTREAMS) && defined(_STLP_USE_NAMESPACES) && defined(BOOST_NO_USING_TEMPLATE) && !defined(BOOST_BORLANDC)\n#     define BOOST_NO_STD_LOCALE\n#  endif\n#else\n#  if !defined(__SGI_STL_OWN_IOSTREAMS) && defined(__STL_USE_NAMESPACES) && defined(BOOST_NO_USING_TEMPLATE) && !defined(BOOST_BORLANDC)\n#     define BOOST_NO_STD_LOCALE\n#  endif\n#endif\n\n#if defined(_STLPORT_VERSION) && (_STLPORT_VERSION >= 0x520)\n#  define BOOST_HAS_TR1_UNORDERED_SET\n#  define BOOST_HAS_TR1_UNORDERED_MAP\n#endif\n//\n// Without member template support enabled, their are no template\n// iterate constructors, and no std::allocator:\n//\n#if !(defined(__STL_MEMBER_TEMPLATES) || defined(_STLP_MEMBER_TEMPLATES))\n#  define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS\n#  define BOOST_NO_STD_ALLOCATOR\n#endif\n//\n// however we always have at least a partial allocator:\n//\n#define BOOST_HAS_PARTIAL_STD_ALLOCATOR\n\n#if !defined(_STLP_MEMBER_TEMPLATE_CLASSES) || defined(_STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE)\n#  define BOOST_NO_STD_ALLOCATOR\n#endif\n\n#if defined(_STLP_NO_MEMBER_TEMPLATE_KEYWORD) && defined(BOOST_MSVC) && (BOOST_MSVC <= 1300)\n#  define BOOST_NO_STD_ALLOCATOR\n#endif\n\n//\n// If STLport thinks there is no wchar_t at all, then we have to disable\n// the support for the relevant specilazations of std:: templates.\n//\n#if !defined(_STLP_HAS_WCHAR_T) && !defined(_STLP_WCHAR_T_IS_USHORT)\n#  ifndef  BOOST_NO_STD_WSTRING\n#     define BOOST_NO_STD_WSTRING\n#  endif\n#  ifndef  BOOST_NO_STD_WSTREAMBUF\n#     define BOOST_NO_STD_WSTREAMBUF\n#  endif\n#endif\n\n//\n// We always have SGI style hash_set, hash_map, and slist:\n//\n#ifndef _STLP_NO_EXTENSIONS\n#define BOOST_HAS_HASH\n#define BOOST_HAS_SLIST\n#endif\n\n//\n// STLport does a good job of importing names into namespace std::,\n// but doesn't always get them all, define BOOST_NO_STDC_NAMESPACE, since our\n// workaround does not conflict with STLports:\n//\n//\n// Harold Howe says:\n// Borland switched to STLport in BCB6. Defining BOOST_NO_STDC_NAMESPACE with\n// BCB6 does cause problems. If we detect C++ Builder, then don't define \n// BOOST_NO_STDC_NAMESPACE\n//\n#if !defined(BOOST_BORLANDC) && !defined(__DMC__)\n//\n// If STLport is using it's own namespace, and the real names are in\n// the global namespace, then we duplicate STLport's using declarations\n// (by defining BOOST_NO_STDC_NAMESPACE), we do this because STLport doesn't\n// necessarily import all the names we need into namespace std::\n// \n#  if (defined(__STL_IMPORT_VENDOR_CSTD) \\\n         || defined(__STL_USE_OWN_NAMESPACE) \\\n         || defined(_STLP_IMPORT_VENDOR_CSTD) \\\n         || defined(_STLP_USE_OWN_NAMESPACE)) \\\n      && (defined(__STL_VENDOR_GLOBAL_CSTD) || defined (_STLP_VENDOR_GLOBAL_CSTD))\n#     define BOOST_NO_STDC_NAMESPACE\n#     define BOOST_NO_EXCEPTION_STD_NAMESPACE\n#  endif\n#elif defined(BOOST_BORLANDC) && BOOST_BORLANDC < 0x560\n// STLport doesn't import std::abs correctly:\n#include <stdlib.h>\nnamespace std { using ::abs; }\n// and strcmp/strcpy don't get imported either ('cos they are macros)\n#include <string.h>\n#ifdef strcpy\n#  undef strcpy\n#endif\n#ifdef strcmp\n#  undef strcmp\n#endif\n#ifdef _STLP_VENDOR_CSTD\nnamespace std{ using _STLP_VENDOR_CSTD::strcmp; using _STLP_VENDOR_CSTD::strcpy; }\n#endif\n#endif\n\n//\n// std::use_facet may be non-standard, uses a class instead:\n//\n#if defined(__STL_NO_EXPLICIT_FUNCTION_TMPL_ARGS) || defined(_STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS)\n#  define BOOST_NO_STD_USE_FACET\n#  define BOOST_HAS_STLP_USE_FACET\n#endif\n\n//\n// If STLport thinks there are no wide functions, <cwchar> etc. is not working; but\n// only if BOOST_NO_STDC_NAMESPACE is not defined (if it is then we do the import \n// into std:: ourselves).\n//\n#if defined(_STLP_NO_NATIVE_WIDE_FUNCTIONS) && !defined(BOOST_NO_STDC_NAMESPACE)\n#  define BOOST_NO_CWCHAR\n#  define BOOST_NO_CWCTYPE\n#endif\n\n//\n// If STLport for some reason was configured so that it thinks that wchar_t\n// is not an intrinsic type, then we have to disable the support for it as\n// well (we would be missing required specializations otherwise).\n//\n#if !defined( _STLP_HAS_WCHAR_T) || defined(_STLP_WCHAR_T_IS_USHORT)\n#  undef  BOOST_NO_INTRINSIC_WCHAR_T\n#  define BOOST_NO_INTRINSIC_WCHAR_T\n#endif\n\n//\n// Borland ships a version of STLport with C++ Builder 6 that lacks\n// hashtables and the like:\n//\n#if defined(BOOST_BORLANDC) && (BOOST_BORLANDC == 0x560)\n#  undef BOOST_HAS_HASH\n#endif\n\n//\n// gcc-2.95.3/STLPort does not like the using declarations we use to get ADL with std::min/max\n//\n#if defined(__GNUC__) && (__GNUC__ < 3)\n#  include <algorithm> // for std::min and std::max\n#  define BOOST_USING_STD_MIN() ((void)0)\n#  define BOOST_USING_STD_MAX() ((void)0)\nnamespace boost { using std::min; using std::max; }\n#endif\n\n//  C++0x headers not yet implemented\n//\n#  define BOOST_NO_CXX11_HDR_ARRAY\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_ALLOCATOR\n#  define BOOST_NO_CXX11_POINTER_TRAITS\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_STD_ALIGN\n#  define BOOST_NO_CXX11_ADDRESSOF\n#  define BOOST_NO_CXX11_HDR_EXCEPTION\n\n#if defined(__has_include)\n#if !__has_include(<shared_mutex>)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#elif __cplusplus < 201402\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#else\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n\n// C++14 features\n#  define BOOST_NO_CXX14_STD_EXCHANGE\n\n// C++17 features\n#  define BOOST_NO_CXX17_STD_APPLY\n#  define BOOST_NO_CXX17_STD_INVOKE\n#  define BOOST_NO_CXX17_ITERATOR_TRAITS\n\n#define BOOST_STDLIB \"STLPort standard library version \" BOOST_STRINGIZE(__SGI_STL_PORT)\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/stdlib/vacpp.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2002. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n#if __IBMCPP__ <= 501\n#  define BOOST_NO_STD_ALLOCATOR\n#endif\n\n#define BOOST_HAS_MACRO_USE_FACET\n#define BOOST_NO_STD_MESSAGES\n\n// Apple doesn't seem to reliably defined a *unix* macro\n#if !defined(CYGWIN) && (  defined(__unix__)  \\\n                        || defined(__unix)    \\\n                        || defined(unix)      \\\n                        || defined(__APPLE__) \\\n                        || defined(__APPLE)   \\\n                        || defined(APPLE))\n#  include <unistd.h>\n#endif\n\n//  C++0x headers not yet implemented\n//\n#  define BOOST_NO_CXX11_HDR_ARRAY\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_ALLOCATOR\n#  define BOOST_NO_CXX11_POINTER_TRAITS\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_STD_ALIGN\n#  define BOOST_NO_CXX11_ADDRESSOF\n#  define BOOST_NO_CXX11_HDR_EXCEPTION\n\n#if defined(__has_include)\n#if !__has_include(<shared_mutex>)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#elif __cplusplus < 201402\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#else\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n\n// C++14 features\n#  define BOOST_NO_CXX14_STD_EXCHANGE\n\n// C++17 features\n#  define BOOST_NO_CXX17_STD_APPLY\n#  define BOOST_NO_CXX17_STD_INVOKE\n#  define BOOST_NO_CXX17_ITERATOR_TRAITS\n\n#define BOOST_STDLIB \"Visual Age default standard library\"\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/stdlib/xlcpp_zos.hpp",
    "content": "//  Copyright (c) 2017 Dynatrace\n//\n//  Distributed under the Boost Software License, Version 1.0.\n//  See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt\n\n//  See http://www.boost.org for most recent version.\n\n//  Standard library setup for IBM z/OS XL C/C++ compiler.\n\n// Oldest library version currently supported is 2.1 (V2R1)\n#if __TARGET_LIB__ < 0x42010000\n#  error \"Library version not supported or configured - please reconfigure\"\n#endif\n\n#if __TARGET_LIB__ > 0x42010000\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"Unknown library version - please run the configure tests and report the results\"\n#  endif\n#endif\n\n#define BOOST_STDLIB \"IBM z/OS XL C/C++ standard library\"\n\n#define BOOST_HAS_MACRO_USE_FACET\n\n#define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n\n#define BOOST_NO_CXX11_ADDRESSOF\n#define BOOST_NO_CXX11_SMART_PTR\n#define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#define BOOST_NO_CXX11_NUMERIC_LIMITS\n#define BOOST_NO_CXX11_ALLOCATOR\n#define BOOST_NO_CXX11_POINTER_TRAITS\n#define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#define BOOST_NO_CXX11_HDR_TYPEINDEX\n#define BOOST_NO_CXX11_HDR_TUPLE\n#define BOOST_NO_CXX11_HDR_THREAD\n#define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#define BOOST_NO_CXX11_HDR_REGEX\n#define BOOST_NO_CXX11_HDR_RATIO\n#define BOOST_NO_CXX11_HDR_RANDOM\n#define BOOST_NO_CXX11_HDR_MUTEX\n#define BOOST_NO_CXX11_HDR_FUTURE\n#define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#define BOOST_NO_CXX11_HDR_CODECVT\n#define BOOST_NO_CXX11_HDR_CHRONO\n#define BOOST_NO_CXX11_HDR_ATOMIC\n#define BOOST_NO_CXX11_HDR_ARRAY\n#define BOOST_NO_CXX11_HDR_EXCEPTION\n#define BOOST_NO_CXX11_STD_ALIGN\n\n#define BOOST_NO_CXX14_STD_EXCHANGE\n#define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n\n#define BOOST_NO_CXX17_STD_INVOKE\n#define BOOST_NO_CXX17_STD_APPLY\n#define BOOST_NO_CXX17_ITERATOR_TRAITS\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/user.hpp",
    "content": "//  boost/config/user.hpp  ---------------------------------------------------//\n\n//  (C) Copyright John Maddock 2001. \n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  Do not check in modified versions of this file,\n//  This file may be customized by the end user, but not by boost.\n\n//\n//  Use this file to define a site and compiler specific\n//  configuration policy:\n//\n\n// define this to locate a compiler config file:\n// #define BOOST_COMPILER_CONFIG <myheader>\n\n// define this to locate a stdlib config file:\n// #define BOOST_STDLIB_CONFIG   <myheader>\n\n// define this to locate a platform config file:\n// #define BOOST_PLATFORM_CONFIG <myheader>\n\n// define this to disable compiler config,\n// use if your compiler config has nothing to set:\n// #define BOOST_NO_COMPILER_CONFIG\n\n// define this to disable stdlib config,\n// use if your stdlib config has nothing to set:\n// #define BOOST_NO_STDLIB_CONFIG\n\n// define this to disable platform config,\n// use if your platform config has nothing to set:\n// #define BOOST_NO_PLATFORM_CONFIG\n\n// define this to disable all config options,\n// excluding the user config.  Use if your\n// setup is fully ISO compliant, and has no\n// useful extensions, or for autoconf generated\n// setups:\n// #define BOOST_NO_CONFIG\n\n// define this to make the config \"optimistic\"\n// about unknown compiler versions.  Normally\n// unknown compiler versions are assumed to have\n// all the defects of the last known version, however\n// setting this flag, causes the config to assume\n// that unknown compiler versions are fully conformant\n// with the standard:\n// #define BOOST_STRICT_CONFIG\n\n// define this to cause the config to halt compilation\n// with an #error if it encounters anything unknown --\n// either an unknown compiler version or an unknown\n// compiler/platform/library:\n// #define BOOST_ASSERT_CONFIG\n\n\n// define if you want to disable threading support, even\n// when available:\n// #define BOOST_DISABLE_THREADS\n\n// define when you want to disable Win32 specific features\n// even when available:\n// #define BOOST_DISABLE_WIN32\n\n// BOOST_DISABLE_ABI_HEADERS: Stops boost headers from including any \n// prefix/suffix headers that normally control things like struct \n// packing and alignment. \n// #define BOOST_DISABLE_ABI_HEADERS\n\n// BOOST_ABI_PREFIX: A prefix header to include in place of whatever\n// boost.config would normally select, any replacement should set up \n// struct packing and alignment options as required. \n// #define BOOST_ABI_PREFIX my-header-name\n\n// BOOST_ABI_SUFFIX: A suffix header to include in place of whatever \n// boost.config would normally select, any replacement should undo \n// the effects of the prefix header. \n// #define BOOST_ABI_SUFFIX my-header-name\n\n// BOOST_ALL_DYN_LINK: Forces all libraries that have separate source, \n// to be linked as dll's rather than static libraries on Microsoft Windows \n// (this macro is used to turn on __declspec(dllimport) modifiers, so that \n// the compiler knows which symbols to look for in a dll rather than in a \n// static library).  Note that there may be some libraries that can only \n// be linked in one way (statically or dynamically), in these cases this \n// macro has no effect.\n// #define BOOST_ALL_DYN_LINK\n \n// BOOST_WHATEVER_DYN_LINK: Forces library \"whatever\" to be linked as a dll \n// rather than a static library on Microsoft Windows: replace the WHATEVER \n// part of the macro name with the name of the library that you want to \n// dynamically link to, for example use BOOST_DATE_TIME_DYN_LINK or \n// BOOST_REGEX_DYN_LINK etc (this macro is used to turn on __declspec(dllimport) \n// modifiers, so that the compiler knows which symbols to look for in a dll \n// rather than in a static library).  \n// Note that there may be some libraries that can only \n// be linked in one way (statically or dynamically), \n// in these cases this macro is unsupported.\n// #define BOOST_WHATEVER_DYN_LINK\n \n// BOOST_ALL_NO_LIB: Tells the config system not to automatically select \n// which libraries to link against.  \n// Normally if a compiler supports #pragma lib, then the correct library \n// build variant will be automatically selected and linked against, \n// simply by the act of including one of that library's headers.  \n// This macro turns that feature off.\n// #define BOOST_ALL_NO_LIB\n \n// BOOST_WHATEVER_NO_LIB: Tells the config system not to automatically \n// select which library to link against for library \"whatever\", \n// replace WHATEVER in the macro name with the name of the library; \n// for example BOOST_DATE_TIME_NO_LIB or BOOST_REGEX_NO_LIB.  \n// Normally if a compiler supports #pragma lib, then the correct library \n// build variant will be automatically selected and linked against, simply \n// by the act of including one of that library's headers.  This macro turns \n// that feature off.\n// #define BOOST_WHATEVER_NO_LIB\n \n// BOOST_LIB_BUILDID: Set to the same value as the value passed to Boost.Build's\n// --buildid command line option.  For example if you built using:\n//\n// bjam address-model=64 --buildid=amd64\n//\n// then compile your code with:\n//\n// -DBOOST_LIB_BUILDID = amd64\n//\n// to ensure the correct libraries are selected at link time.\n// #define BOOST_LIB_BUILDID amd64\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/warning_disable.hpp",
    "content": "//  Copyright John Maddock 2008\n//  Use, modification, and distribution is subject to the Boost Software\n//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  This file exists to turn off some overly-pedantic warning emitted\n//  by certain compilers.  You should include this header only in:\n//\n//  * A test case, before any other headers, or,\n//  * A library source file before any other headers.\n//\n//  IT SHOULD NOT BE INCLUDED BY ANY BOOST HEADER.\n//\n//  YOU SHOULD NOT INCLUDE IT IF YOU CAN REASONABLY FIX THE WARNING.\n//\n//  The only warnings disabled here are those that are:\n//\n//  * Quite unreasonably pedantic.\n//  * Generally only emitted by a single compiler.\n//  * Can't easily be fixed: for example if the vendors own std lib \n//    code emits these warnings!\n//\n//  Note that THIS HEADER MUST NOT INCLUDE ANY OTHER HEADERS:\n//  not even std library ones!  Doing so may turn the warning\n//  off too late to be of any use.  For example the VC++ C4996\n//  warning can be emitted from <iosfwd> if that header is included\n//  before or by this one :-(\n//\n\n#ifndef BOOST_CONFIG_WARNING_DISABLE_HPP\n#define BOOST_CONFIG_WARNING_DISABLE_HPP\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1400) \n   // Error 'function': was declared deprecated\n   // http://msdn2.microsoft.com/en-us/library/ttcz0bys(VS.80).aspx\n   // This error is emitted when you use some perfectly conforming\n   // std lib functions in a perfectly correct way, and also by\n   // some of Microsoft's own std lib code !\n#  pragma warning(disable:4996)\n#endif\n#if defined(__INTEL_COMPILER) || defined(__ICL)\n   // As above: gives warning when a \"deprecated\"\n   // std library function is encountered.\n#  pragma warning(disable:1786)\n#endif\n\n#endif // BOOST_CONFIG_WARNING_DISABLE_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config/workaround.hpp",
    "content": "// Copyright David Abrahams 2002.\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n#ifndef BOOST_CONFIG_WORKAROUND_HPP\n#define BOOST_CONFIG_WORKAROUND_HPP\n\n// Compiler/library version workaround macro\n//\n// Usage:\n//\n//   #if BOOST_WORKAROUND(BOOST_MSVC, < 1300)\n//      // workaround for eVC4 and VC6\n//      ... // workaround code here\n//   #endif\n//\n// When BOOST_STRICT_CONFIG is defined, expands to 0. Otherwise, the\n// first argument must be undefined or expand to a numeric\n// value. The above expands to:\n//\n//   (BOOST_MSVC) != 0 && (BOOST_MSVC) < 1300\n//\n// When used for workarounds that apply to the latest known version\n// and all earlier versions of a compiler, the following convention\n// should be observed:\n//\n//   #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1301))\n//\n// The version number in this case corresponds to the last version in\n// which the workaround was known to have been required. When\n// BOOST_DETECT_OUTDATED_WORKAROUNDS is not the defined, the macro\n// BOOST_TESTED_AT(x) expands to \"!= 0\", which effectively activates\n// the workaround for any version of the compiler. When\n// BOOST_DETECT_OUTDATED_WORKAROUNDS is defined, a compiler warning or\n// error will be issued if the compiler version exceeds the argument\n// to BOOST_TESTED_AT().  This can be used to locate workarounds which\n// may be obsoleted by newer versions.\n\n#ifndef BOOST_STRICT_CONFIG\n\n#include <boost/config.hpp>\n\n#ifndef __BORLANDC__\n#define __BORLANDC___WORKAROUND_GUARD 1\n#else\n#define __BORLANDC___WORKAROUND_GUARD 0\n#endif\n#ifndef __CODEGEARC__\n#define __CODEGEARC___WORKAROUND_GUARD 1\n#else\n#define __CODEGEARC___WORKAROUND_GUARD 0\n#endif\n#ifndef BOOST_BORLANDC\n#define BOOST_BORLANDC_WORKAROUND_GUARD 1\n#else\n#define BOOST_BORLANDC_WORKAROUND_GUARD 0\n#endif\n#ifndef BOOST_CODEGEARC\n#define BOOST_CODEGEARC_WORKAROUND_GUARD 1\n#else\n#define BOOST_CODEGEARC_WORKAROUND_GUARD 0\n#endif\n#ifndef BOOST_EMBTC\n#define BOOST_EMBTC_WORKAROUND_GUARD 1\n#else\n#define BOOST_EMBTC_WORKAROUND_GUARD 0\n#endif\n#ifndef _MSC_VER\n#define _MSC_VER_WORKAROUND_GUARD 1\n#else\n#define _MSC_VER_WORKAROUND_GUARD 0\n#endif\n#ifndef _MSC_FULL_VER\n#define _MSC_FULL_VER_WORKAROUND_GUARD 1\n#else\n#define _MSC_FULL_VER_WORKAROUND_GUARD 0\n#endif\n#ifndef BOOST_MSVC\n#define BOOST_MSVC_WORKAROUND_GUARD 1\n#else\n#define BOOST_MSVC_WORKAROUND_GUARD 0\n#endif\n#ifndef BOOST_MSVC_FULL_VER\n#define BOOST_MSVC_FULL_VER_WORKAROUND_GUARD 1\n#else\n#define BOOST_MSVC_FULL_VER_WORKAROUND_GUARD 0\n#endif\n#ifndef __GNUC__\n#define __GNUC___WORKAROUND_GUARD 1\n#else\n#define __GNUC___WORKAROUND_GUARD 0\n#endif\n#ifndef __GNUC_MINOR__\n#define __GNUC_MINOR___WORKAROUND_GUARD 1\n#else\n#define __GNUC_MINOR___WORKAROUND_GUARD 0\n#endif\n#ifndef __GNUC_PATCHLEVEL__\n#define __GNUC_PATCHLEVEL___WORKAROUND_GUARD 1\n#else\n#define __GNUC_PATCHLEVEL___WORKAROUND_GUARD 0\n#endif\n#ifndef BOOST_GCC\n#define BOOST_GCC_WORKAROUND_GUARD 1\n#define BOOST_GCC_VERSION_WORKAROUND_GUARD 1\n#else\n#define BOOST_GCC_WORKAROUND_GUARD 0\n#define BOOST_GCC_VERSION_WORKAROUND_GUARD 0\n#endif\n#ifndef BOOST_XLCPP_ZOS\n#define BOOST_XLCPP_ZOS_WORKAROUND_GUARD 1\n#else\n#define BOOST_XLCPP_ZOS_WORKAROUND_GUARD 0\n#endif\n#ifndef __IBMCPP__\n#define __IBMCPP___WORKAROUND_GUARD 1\n#else\n#define __IBMCPP___WORKAROUND_GUARD 0\n#endif\n#ifndef __SUNPRO_CC\n#define __SUNPRO_CC_WORKAROUND_GUARD 1\n#else\n#define __SUNPRO_CC_WORKAROUND_GUARD 0\n#endif\n#ifndef __DECCXX_VER\n#define __DECCXX_VER_WORKAROUND_GUARD 1\n#else\n#define __DECCXX_VER_WORKAROUND_GUARD 0\n#endif\n#ifndef __MWERKS__\n#define __MWERKS___WORKAROUND_GUARD 1\n#else\n#define __MWERKS___WORKAROUND_GUARD 0\n#endif\n#ifndef __EDG__\n#define __EDG___WORKAROUND_GUARD 1\n#else\n#define __EDG___WORKAROUND_GUARD 0\n#endif\n#ifndef __EDG_VERSION__\n#define __EDG_VERSION___WORKAROUND_GUARD 1\n#else\n#define __EDG_VERSION___WORKAROUND_GUARD 0\n#endif\n#ifndef __HP_aCC\n#define __HP_aCC_WORKAROUND_GUARD 1\n#else\n#define __HP_aCC_WORKAROUND_GUARD 0\n#endif\n#ifndef __hpxstd98\n#define __hpxstd98_WORKAROUND_GUARD 1\n#else\n#define __hpxstd98_WORKAROUND_GUARD 0\n#endif\n#ifndef _CRAYC\n#define _CRAYC_WORKAROUND_GUARD 1\n#else\n#define _CRAYC_WORKAROUND_GUARD 0\n#endif\n#ifndef __DMC__\n#define __DMC___WORKAROUND_GUARD 1\n#else\n#define __DMC___WORKAROUND_GUARD 0\n#endif\n#ifndef MPW_CPLUS\n#define MPW_CPLUS_WORKAROUND_GUARD 1\n#else\n#define MPW_CPLUS_WORKAROUND_GUARD 0\n#endif\n#ifndef __COMO__\n#define __COMO___WORKAROUND_GUARD 1\n#else\n#define __COMO___WORKAROUND_GUARD 0\n#endif\n#ifndef __COMO_VERSION__\n#define __COMO_VERSION___WORKAROUND_GUARD 1\n#else\n#define __COMO_VERSION___WORKAROUND_GUARD 0\n#endif\n#ifndef __INTEL_COMPILER\n#define __INTEL_COMPILER_WORKAROUND_GUARD 1\n#else\n#define __INTEL_COMPILER_WORKAROUND_GUARD 0\n#endif\n#ifndef __ICL\n#define __ICL_WORKAROUND_GUARD 1\n#else\n#define __ICL_WORKAROUND_GUARD 0\n#endif\n#ifndef _COMPILER_VERSION\n#define _COMPILER_VERSION_WORKAROUND_GUARD 1\n#else\n#define _COMPILER_VERSION_WORKAROUND_GUARD 0\n#endif\n#ifndef __clang_major__\n#define __clang_major___WORKAROUND_GUARD 1\n#else\n#define __clang_major___WORKAROUND_GUARD 0\n#endif\n\n#ifndef _RWSTD_VER\n#define _RWSTD_VER_WORKAROUND_GUARD 1\n#else\n#define _RWSTD_VER_WORKAROUND_GUARD 0\n#endif\n#ifndef BOOST_RWSTD_VER\n#define BOOST_RWSTD_VER_WORKAROUND_GUARD 1\n#else\n#define BOOST_RWSTD_VER_WORKAROUND_GUARD 0\n#endif\n#ifndef __GLIBCPP__\n#define __GLIBCPP___WORKAROUND_GUARD 1\n#else\n#define __GLIBCPP___WORKAROUND_GUARD 0\n#endif\n#ifndef _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC\n#define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC_WORKAROUND_GUARD 1\n#else\n#define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC_WORKAROUND_GUARD 0\n#endif\n#ifndef __SGI_STL_PORT\n#define __SGI_STL_PORT_WORKAROUND_GUARD 1\n#else\n#define __SGI_STL_PORT_WORKAROUND_GUARD 0\n#endif\n#ifndef _STLPORT_VERSION\n#define _STLPORT_VERSION_WORKAROUND_GUARD 1\n#else\n#define _STLPORT_VERSION_WORKAROUND_GUARD 0\n#endif\n#ifndef __LIBCOMO_VERSION__\n#define __LIBCOMO_VERSION___WORKAROUND_GUARD 1\n#else\n#define __LIBCOMO_VERSION___WORKAROUND_GUARD 0\n#endif\n#ifndef _CPPLIB_VER\n#define _CPPLIB_VER_WORKAROUND_GUARD 1\n#else\n#define _CPPLIB_VER_WORKAROUND_GUARD 0\n#endif\n\n#ifndef BOOST_INTEL_CXX_VERSION\n#define BOOST_INTEL_CXX_VERSION_WORKAROUND_GUARD 1\n#else\n#define BOOST_INTEL_CXX_VERSION_WORKAROUND_GUARD 0\n#endif\n#ifndef BOOST_INTEL_WIN\n#define BOOST_INTEL_WIN_WORKAROUND_GUARD 1\n#else\n#define BOOST_INTEL_WIN_WORKAROUND_GUARD 0\n#endif\n#ifndef BOOST_DINKUMWARE_STDLIB\n#define BOOST_DINKUMWARE_STDLIB_WORKAROUND_GUARD 1\n#else\n#define BOOST_DINKUMWARE_STDLIB_WORKAROUND_GUARD 0\n#endif\n#ifndef BOOST_INTEL\n#define BOOST_INTEL_WORKAROUND_GUARD 1\n#else\n#define BOOST_INTEL_WORKAROUND_GUARD 0\n#endif\n#ifndef BOOST_CLANG_VERSION\n#define BOOST_CLANG_VERSION_WORKAROUND_GUARD 1\n#else\n#define BOOST_CLANG_VERSION_WORKAROUND_GUARD 0\n#endif\n\n// Always define to zero, if it's used it'll be defined my MPL:\n#define BOOST_MPL_CFG_GCC_WORKAROUND_GUARD 0\n\n#define BOOST_WORKAROUND(symbol, test)                \\\n       ((symbol ## _WORKAROUND_GUARD + 0 == 0) &&     \\\n       (symbol != 0) && (1 % (( (symbol test) ) + 1)))\n//                              ^ ^           ^ ^\n// The extra level of parenthesis nesting above, along with the\n// BOOST_OPEN_PAREN indirection below, is required to satisfy the\n// broken preprocessor in MWCW 8.3 and earlier.\n//\n// The basic mechanism works as follows:\n//   (symbol test) + 1        =>   if (symbol test) then 2 else 1\n//   1 % ((symbol test) + 1)  =>   if (symbol test) then 1 else 0\n//\n// The complication with % is for cooperation with BOOST_TESTED_AT().\n// When \"test\" is BOOST_TESTED_AT(x) and\n// BOOST_DETECT_OUTDATED_WORKAROUNDS is #defined,\n//\n//   symbol test              =>   if (symbol <= x) then 1 else -1\n//   (symbol test) + 1        =>   if (symbol <= x) then 2 else 0\n//   1 % ((symbol test) + 1)  =>   if (symbol <= x) then 1 else divide-by-zero\n//\n\n#ifdef BOOST_DETECT_OUTDATED_WORKAROUNDS\n#  define BOOST_OPEN_PAREN (\n#  define BOOST_TESTED_AT(value)  > value) ?(-1): BOOST_OPEN_PAREN 1\n#else\n#  define BOOST_TESTED_AT(value) != ((value)-(value))\n#endif\n\n#else\n\n#define BOOST_WORKAROUND(symbol, test) 0\n\n#endif\n\n#endif // BOOST_CONFIG_WORKAROUND_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/config.hpp",
    "content": "//  Boost config.hpp configuration header file  ------------------------------//\n\n//  (C) Copyright John Maddock 2002.\n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/libs/config for most recent version.\n\n//  Boost config.hpp policy and rationale documentation has been moved to\n//  http://www.boost.org/libs/config\n//\n//  CAUTION: This file is intended to be completely stable -\n//           DO NOT MODIFY THIS FILE!\n//\n\n#ifndef BOOST_CONFIG_HPP\n#define BOOST_CONFIG_HPP\n\n// if we don't have a user config, then use the default location:\n#if !defined(BOOST_USER_CONFIG) && !defined(BOOST_NO_USER_CONFIG)\n#  define BOOST_USER_CONFIG <boost/config/user.hpp>\n#if 0\n// For dependency trackers:\n#  include <boost/config/user.hpp>\n#endif\n#endif\n// include it first:\n#ifdef BOOST_USER_CONFIG\n#  include BOOST_USER_CONFIG\n#endif\n\n// if we don't have a compiler config set, try and find one:\n#if !defined(BOOST_COMPILER_CONFIG) && !defined(BOOST_NO_COMPILER_CONFIG) && !defined(BOOST_NO_CONFIG)\n#  include <boost/config/detail/select_compiler_config.hpp>\n#endif\n// if we have a compiler config, include it now:\n#ifdef BOOST_COMPILER_CONFIG\n#  include BOOST_COMPILER_CONFIG\n#endif\n\n// if we don't have a std library config set, try and find one:\n#if !defined(BOOST_STDLIB_CONFIG) && !defined(BOOST_NO_STDLIB_CONFIG) && !defined(BOOST_NO_CONFIG) && defined(__cplusplus)\n#  include <boost/config/detail/select_stdlib_config.hpp>\n#endif\n// if we have a std library config, include it now:\n#ifdef BOOST_STDLIB_CONFIG\n#  include BOOST_STDLIB_CONFIG\n#endif\n\n// if we don't have a platform config set, try and find one:\n#if !defined(BOOST_PLATFORM_CONFIG) && !defined(BOOST_NO_PLATFORM_CONFIG) && !defined(BOOST_NO_CONFIG)\n#  include <boost/config/detail/select_platform_config.hpp>\n#endif\n// if we have a platform config, include it now:\n#ifdef BOOST_PLATFORM_CONFIG\n#  include BOOST_PLATFORM_CONFIG\n#endif\n\n// get config suffix code:\n#include <boost/config/detail/suffix.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#endif  // BOOST_CONFIG_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/cstdint.hpp",
    "content": "//  boost cstdint.hpp header file  ------------------------------------------//\n\n//  (C) Copyright Beman Dawes 1999.\n//  (C) Copyright Jens Mauer 2001\n//  (C) Copyright John Maddock 2001\n//  Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/libs/integer for documentation.\n\n//  Revision History\n//   31 Oct 01  use BOOST_HAS_LONG_LONG to check for \"long long\" (Jens M.)\n//   16 Apr 01  check LONGLONG_MAX when looking for \"long long\" (Jens Maurer)\n//   23 Jan 01  prefer \"long\" over \"int\" for int32_t and intmax_t (Jens Maurer)\n//   12 Nov 00  Merged <boost/stdint.h> (Jens Maurer)\n//   23 Sep 00  Added INTXX_C macro support (John Maddock).\n//   22 Sep 00  Better 64-bit support (John Maddock)\n//   29 Jun 00  Reimplement to avoid including stdint.h within namespace boost\n//    8 Aug 99  Initial version (Beman Dawes)\n\n\n#ifndef BOOST_CSTDINT_HPP\n#define BOOST_CSTDINT_HPP\n\n//\n// Since we always define the INT#_C macros as per C++0x,\n// define __STDC_CONSTANT_MACROS so that <stdint.h> does the right\n// thing if possible, and so that the user knows that the macros\n// are actually defined as per C99.\n//\n#ifndef __STDC_CONSTANT_MACROS\n#  define __STDC_CONSTANT_MACROS\n#endif\n\n#include <boost/config.hpp>\n//\n// For the following code we get several warnings along the lines of:\n//\n// boost/cstdint.hpp:428:35: error: use of C99 long long integer constant\n//\n// So we declare this a system header to suppress these warnings.\n// See also https://github.com/boostorg/config/issues/190\n//\n#if defined(__GNUC__) && (__GNUC__ >= 4)\n#pragma GCC system_header\n#endif\n\n//\n// Note that GLIBC is a bit inconsistent about whether int64_t is defined or not\n// depending upon what headers happen to have been included first...\n// so we disable use of stdint.h when GLIBC does not define __GLIBC_HAVE_LONG_LONG.\n// See https://svn.boost.org/trac/boost/ticket/3548 and http://sources.redhat.com/bugzilla/show_bug.cgi?id=10990\n//\n#if defined(BOOST_HAS_STDINT_H)            \\\n  && (!defined(__GLIBC__)                  \\\n      || defined(__GLIBC_HAVE_LONG_LONG)   \\\n      || (defined(__GLIBC__) && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 17)))))\n\n// The following #include is an implementation artifact; not part of interface.\n# ifdef __hpux\n// HP-UX has a vaguely nice <stdint.h> in a non-standard location\n#   include <inttypes.h>\n#   ifdef __STDC_32_MODE__\n      // this is triggered with GCC, because it defines __cplusplus < 199707L\n#     define BOOST_NO_INT64_T\n#   endif\n# elif defined(__FreeBSD__) || defined(__IBMCPP__) || defined(_AIX)\n#   include <inttypes.h>\n# else\n#   include <stdint.h>\n\n// There is a bug in Cygwin two _C macros\n#   if defined(INTMAX_C) && defined(__CYGWIN__)\n#     undef INTMAX_C\n#     undef UINTMAX_C\n#     define INTMAX_C(c) c##LL\n#     define UINTMAX_C(c) c##ULL\n#   endif\n\n# endif\n\n#if defined(__QNX__) && defined(__EXT_QNX) \n\n// QNX (Dinkumware stdlib) defines these as non-standard names.\n// Reflect to the standard names.\n\ntypedef ::intleast8_t int_least8_t;\ntypedef ::intfast8_t int_fast8_t;\ntypedef ::uintleast8_t uint_least8_t;\ntypedef ::uintfast8_t uint_fast8_t;\n\ntypedef ::intleast16_t int_least16_t;\ntypedef ::intfast16_t int_fast16_t;\ntypedef ::uintleast16_t uint_least16_t;\ntypedef ::uintfast16_t uint_fast16_t;\n\ntypedef ::intleast32_t int_least32_t;\ntypedef ::intfast32_t int_fast32_t;\ntypedef ::uintleast32_t uint_least32_t;\ntypedef ::uintfast32_t uint_fast32_t;\n\n# ifndef BOOST_NO_INT64_T\n\ntypedef ::intleast64_t int_least64_t;\ntypedef ::intfast64_t int_fast64_t;\ntypedef ::uintleast64_t uint_least64_t;\ntypedef ::uintfast64_t uint_fast64_t;\n\n# endif\n\n#endif\n\nnamespace boost\n{\n\n  using ::int8_t;\n  using ::int_least8_t;\n  using ::int_fast8_t;\n  using ::uint8_t;\n  using ::uint_least8_t;\n  using ::uint_fast8_t;\n\n  using ::int16_t;\n  using ::int_least16_t;\n  using ::int_fast16_t;\n  using ::uint16_t;\n  using ::uint_least16_t;\n  using ::uint_fast16_t;\n\n  using ::int32_t;\n  using ::int_least32_t;\n  using ::int_fast32_t;\n  using ::uint32_t;\n  using ::uint_least32_t;\n  using ::uint_fast32_t;\n\n# ifndef BOOST_NO_INT64_T\n\n  using ::int64_t;\n  using ::int_least64_t;\n  using ::int_fast64_t;\n  using ::uint64_t;\n  using ::uint_least64_t;\n  using ::uint_fast64_t;\n\n# endif\n\n  using ::intmax_t;\n  using ::uintmax_t;\n\n} // namespace boost\n\n#elif defined(__FreeBSD__) && (__FreeBSD__ <= 4) || defined(__osf__) || defined(__VMS) || defined(__SOLARIS9__) || defined(__NetBSD__)\n// FreeBSD and Tru64 have an <inttypes.h> that contains much of what we need.\n# include <inttypes.h>\n\nnamespace boost {\n\n  using ::int8_t;\n  typedef int8_t int_least8_t;\n  typedef int8_t int_fast8_t;\n  using ::uint8_t;\n  typedef uint8_t uint_least8_t;\n  typedef uint8_t uint_fast8_t;\n\n  using ::int16_t;\n  typedef int16_t int_least16_t;\n  typedef int16_t int_fast16_t;\n  using ::uint16_t;\n  typedef uint16_t uint_least16_t;\n  typedef uint16_t uint_fast16_t;\n\n  using ::int32_t;\n  typedef int32_t int_least32_t;\n  typedef int32_t int_fast32_t;\n  using ::uint32_t;\n  typedef uint32_t uint_least32_t;\n  typedef uint32_t uint_fast32_t;\n\n# ifndef BOOST_NO_INT64_T\n\n  using ::int64_t;\n  typedef int64_t int_least64_t;\n  typedef int64_t int_fast64_t;\n  using ::uint64_t;\n  typedef uint64_t uint_least64_t;\n  typedef uint64_t uint_fast64_t;\n\n  typedef int64_t intmax_t;\n  typedef uint64_t uintmax_t;\n\n# else\n\n  typedef int32_t intmax_t;\n  typedef uint32_t uintmax_t;\n\n# endif\n\n} // namespace boost\n\n#else  // BOOST_HAS_STDINT_H\n\n# include <boost/limits.hpp> // implementation artifact; not part of interface\n# include <limits.h>         // needed for limits macros\n\n\nnamespace boost\n{\n\n//  These are fairly safe guesses for some 16-bit, and most 32-bit and 64-bit\n//  platforms.  For other systems, they will have to be hand tailored.\n//\n//  Because the fast types are assumed to be the same as the undecorated types,\n//  it may be possible to hand tailor a more efficient implementation.  Such\n//  an optimization may be illusionary; on the Intel x86-family 386 on, for\n//  example, byte arithmetic and load/stores are as fast as \"int\" sized ones.\n\n//  8-bit types  ------------------------------------------------------------//\n\n# if UCHAR_MAX == 0xff\n     typedef signed char     int8_t;\n     typedef signed char     int_least8_t;\n     typedef signed char     int_fast8_t;\n     typedef unsigned char   uint8_t;\n     typedef unsigned char   uint_least8_t;\n     typedef unsigned char   uint_fast8_t;\n# else\n#    error defaults not correct; you must hand modify boost/cstdint.hpp\n# endif\n\n//  16-bit types  -----------------------------------------------------------//\n\n# if USHRT_MAX == 0xffff\n#  if defined(__crayx1)\n     // The Cray X1 has a 16-bit short, however it is not recommend\n     // for use in performance critical code.\n     typedef short           int16_t;\n     typedef short           int_least16_t;\n     typedef int             int_fast16_t;\n     typedef unsigned short  uint16_t;\n     typedef unsigned short  uint_least16_t;\n     typedef unsigned int    uint_fast16_t;\n#  else\n     typedef short           int16_t;\n     typedef short           int_least16_t;\n     typedef short           int_fast16_t;\n     typedef unsigned short  uint16_t;\n     typedef unsigned short  uint_least16_t;\n     typedef unsigned short  uint_fast16_t;\n#  endif\n# elif (USHRT_MAX == 0xffffffff) && defined(__MTA__)\n      // On MTA / XMT short is 32 bits unless the -short16 compiler flag is specified\n      // MTA / XMT does support the following non-standard integer types\n      typedef __short16           int16_t;\n      typedef __short16           int_least16_t;\n      typedef __short16           int_fast16_t;\n      typedef unsigned __short16  uint16_t;\n      typedef unsigned __short16  uint_least16_t;\n      typedef unsigned __short16  uint_fast16_t;\n# elif (USHRT_MAX == 0xffffffff) && defined(CRAY)\n     // no 16-bit types on Cray:\n     typedef short           int_least16_t;\n     typedef short           int_fast16_t;\n     typedef unsigned short  uint_least16_t;\n     typedef unsigned short  uint_fast16_t;\n# else\n#    error defaults not correct; you must hand modify boost/cstdint.hpp\n# endif\n\n//  32-bit types  -----------------------------------------------------------//\n\n# if UINT_MAX == 0xffffffff\n     typedef int             int32_t;\n     typedef int             int_least32_t;\n     typedef int             int_fast32_t;\n     typedef unsigned int    uint32_t;\n     typedef unsigned int    uint_least32_t;\n     typedef unsigned int    uint_fast32_t;\n# elif (USHRT_MAX == 0xffffffff)\n     typedef short             int32_t;\n     typedef short             int_least32_t;\n     typedef short             int_fast32_t;\n     typedef unsigned short    uint32_t;\n     typedef unsigned short    uint_least32_t;\n     typedef unsigned short    uint_fast32_t;\n# elif ULONG_MAX == 0xffffffff\n     typedef long            int32_t;\n     typedef long            int_least32_t;\n     typedef long            int_fast32_t;\n     typedef unsigned long   uint32_t;\n     typedef unsigned long   uint_least32_t;\n     typedef unsigned long   uint_fast32_t;\n# elif (UINT_MAX == 0xffffffffffffffff) && defined(__MTA__)\n      // Integers are 64 bits on the MTA / XMT\n      typedef __int32           int32_t;\n      typedef __int32           int_least32_t;\n      typedef __int32           int_fast32_t;\n      typedef unsigned __int32  uint32_t;\n      typedef unsigned __int32  uint_least32_t;\n      typedef unsigned __int32  uint_fast32_t;\n# else\n#    error defaults not correct; you must hand modify boost/cstdint.hpp\n# endif\n\n//  64-bit types + intmax_t and uintmax_t  ----------------------------------//\n\n# if defined(BOOST_HAS_LONG_LONG) && \\\n   !defined(BOOST_MSVC) && !defined(BOOST_BORLANDC) && \\\n   (!defined(__GLIBCPP__) || defined(_GLIBCPP_USE_LONG_LONG)) && \\\n   (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX))\n#    if defined(__hpux)\n     // HP-UX's value of ULONG_LONG_MAX is unusable in preprocessor expressions\n#    elif (defined(ULLONG_MAX) && ULLONG_MAX == 18446744073709551615ULL) || (defined(ULONG_LONG_MAX) && ULONG_LONG_MAX == 18446744073709551615ULL) || (defined(ULONGLONG_MAX) && ULONGLONG_MAX == 18446744073709551615ULL)\n                                                                 // 2**64 - 1\n#    else\n#       error defaults not correct; you must hand modify boost/cstdint.hpp\n#    endif\n\n     typedef  ::boost::long_long_type            intmax_t;\n     typedef  ::boost::ulong_long_type   uintmax_t;\n     typedef  ::boost::long_long_type            int64_t;\n     typedef  ::boost::long_long_type            int_least64_t;\n     typedef  ::boost::long_long_type            int_fast64_t;\n     typedef  ::boost::ulong_long_type   uint64_t;\n     typedef  ::boost::ulong_long_type   uint_least64_t;\n     typedef  ::boost::ulong_long_type   uint_fast64_t;\n\n# elif ULONG_MAX != 0xffffffff\n\n#    if ULONG_MAX == 18446744073709551615 // 2**64 - 1\n     typedef long                 intmax_t;\n     typedef unsigned long        uintmax_t;\n     typedef long                 int64_t;\n     typedef long                 int_least64_t;\n     typedef long                 int_fast64_t;\n     typedef unsigned long        uint64_t;\n     typedef unsigned long        uint_least64_t;\n     typedef unsigned long        uint_fast64_t;\n#    else\n#       error defaults not correct; you must hand modify boost/cstdint.hpp\n#    endif\n# elif defined(__GNUC__) && defined(BOOST_HAS_LONG_LONG)\n     __extension__ typedef long long            intmax_t;\n     __extension__ typedef unsigned long long   uintmax_t;\n     __extension__ typedef long long            int64_t;\n     __extension__ typedef long long            int_least64_t;\n     __extension__ typedef long long            int_fast64_t;\n     __extension__ typedef unsigned long long   uint64_t;\n     __extension__ typedef unsigned long long   uint_least64_t;\n     __extension__ typedef unsigned long long   uint_fast64_t;\n# elif defined(BOOST_HAS_MS_INT64)\n     //\n     // we have Borland/Intel/Microsoft __int64:\n     //\n     typedef __int64             intmax_t;\n     typedef unsigned __int64    uintmax_t;\n     typedef __int64             int64_t;\n     typedef __int64             int_least64_t;\n     typedef __int64             int_fast64_t;\n     typedef unsigned __int64    uint64_t;\n     typedef unsigned __int64    uint_least64_t;\n     typedef unsigned __int64    uint_fast64_t;\n# else // assume no 64-bit integers\n#  define BOOST_NO_INT64_T\n     typedef int32_t              intmax_t;\n     typedef uint32_t             uintmax_t;\n# endif\n\n} // namespace boost\n\n\n#endif // BOOST_HAS_STDINT_H\n\n// intptr_t/uintptr_t are defined separately because they are optional and not universally available\n#if defined(BOOST_WINDOWS) && !defined(_WIN32_WCE) && !defined(BOOST_HAS_STDINT_H)\n// Older MSVC don't have stdint.h and have intptr_t/uintptr_t defined in stddef.h\n#include <stddef.h>\n#endif\n\n#if (defined(BOOST_WINDOWS) && !defined(_WIN32_WCE)) \\\n    || (defined(_XOPEN_UNIX) && (_XOPEN_UNIX+0 > 0) && !defined(__UCLIBC__)) \\\n    || defined(__CYGWIN__) || defined(__VXWORKS__) \\\n    || defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) \\\n    || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || (defined(sun) && !defined(BOOST_HAS_STDINT_H)) || defined(INTPTR_MAX)\n\nnamespace boost {\n    using ::intptr_t;\n    using ::uintptr_t;\n}\n#define BOOST_HAS_INTPTR_T\n\n// Clang pretends to be GCC, so it'll match this condition\n#elif defined(__GNUC__) && defined(__INTPTR_TYPE__) && defined(__UINTPTR_TYPE__)\n\nnamespace boost {\n    typedef __INTPTR_TYPE__ intptr_t;\n    typedef __UINTPTR_TYPE__ uintptr_t;\n}\n#define BOOST_HAS_INTPTR_T\n\n#endif\n\n#endif // BOOST_CSTDINT_HPP\n\n\n/****************************************************\n\nMacro definition section:\n\nAdded 23rd September 2000 (John Maddock).\nModified 11th September 2001 to be excluded when\nBOOST_HAS_STDINT_H is defined (John Maddock).\nModified 11th Dec 2009 to always define the\nINT#_C macros if they're not already defined (John Maddock).\n\n******************************************************/\n\n#if !defined(BOOST__STDC_CONSTANT_MACROS_DEFINED) && \\\n   (!defined(INT8_C) || !defined(INT16_C) || !defined(INT32_C) || !defined(INT64_C))\n//\n// Undef the macros as a precaution, since we may get here if <stdint.h> has failed\n// to define them all, see https://svn.boost.org/trac/boost/ticket/12786\n//\n#undef INT8_C\n#undef INT16_C\n#undef INT32_C\n#undef INT64_C\n#undef INTMAX_C\n#undef UINT8_C\n#undef UINT16_C\n#undef UINT32_C\n#undef UINT64_C\n#undef UINTMAX_C\n\n#include <limits.h>\n# define BOOST__STDC_CONSTANT_MACROS_DEFINED\n# if defined(BOOST_HAS_MS_INT64)\n//\n// Borland/Intel/Microsoft compilers have width specific suffixes:\n//\n#ifndef INT8_C\n#  define INT8_C(value)     value##i8\n#endif\n#ifndef INT16_C\n#  define INT16_C(value)    value##i16\n#endif\n#ifndef INT32_C\n#  define INT32_C(value)    value##i32\n#endif\n#ifndef INT64_C\n#  define INT64_C(value)    value##i64\n#endif\n#  ifdef BOOST_BORLANDC\n    // Borland bug: appending ui8 makes the type a signed char\n#   define UINT8_C(value)    static_cast<unsigned char>(value##u)\n#  else\n#   define UINT8_C(value)    value##ui8\n#  endif\n#ifndef UINT16_C\n#  define UINT16_C(value)   value##ui16\n#endif\n#ifndef UINT32_C\n#  define UINT32_C(value)   value##ui32\n#endif\n#ifndef UINT64_C\n#  define UINT64_C(value)   value##ui64\n#endif\n#ifndef INTMAX_C\n#  define INTMAX_C(value)   value##i64\n#  define UINTMAX_C(value)  value##ui64\n#endif\n\n# else\n//  do it the old fashioned way:\n\n//  8-bit types  ------------------------------------------------------------//\n\n#  if (UCHAR_MAX == 0xff) && !defined(INT8_C)\n#   define INT8_C(value) static_cast<boost::int8_t>(value)\n#   define UINT8_C(value) static_cast<boost::uint8_t>(value##u)\n#  endif\n\n//  16-bit types  -----------------------------------------------------------//\n\n#  if (USHRT_MAX == 0xffff) && !defined(INT16_C)\n#   define INT16_C(value) static_cast<boost::int16_t>(value)\n#   define UINT16_C(value) static_cast<boost::uint16_t>(value##u)\n#  endif\n\n//  32-bit types  -----------------------------------------------------------//\n#ifndef INT32_C\n#  if (UINT_MAX == 0xffffffff)\n#   define INT32_C(value) value\n#   define UINT32_C(value) value##u\n#  elif ULONG_MAX == 0xffffffff\n#   define INT32_C(value) value##L\n#   define UINT32_C(value) value##uL\n#  endif\n#endif\n\n//  64-bit types + intmax_t and uintmax_t  ----------------------------------//\n#ifndef INT64_C\n#  if defined(BOOST_HAS_LONG_LONG) && \\\n    (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX) || defined(_ULLONG_MAX) || defined(_LLONG_MAX))\n\n#    if defined(__hpux)\n        // HP-UX's value of ULONG_LONG_MAX is unusable in preprocessor expressions\n#       define INT64_C(value) value##LL\n#       define UINT64_C(value) value##uLL\n#    elif (defined(ULLONG_MAX) && ULLONG_MAX == 18446744073709551615ULL) ||  \\\n        (defined(ULONG_LONG_MAX) && ULONG_LONG_MAX == 18446744073709551615ULL) ||  \\\n        (defined(ULONGLONG_MAX) && ULONGLONG_MAX == 18446744073709551615ULL) || \\\n        (defined(_ULLONG_MAX) && _ULLONG_MAX == 18446744073709551615ULL) || \\\n        (defined(_LLONG_MAX) && _LLONG_MAX == 9223372036854775807LL)\n\n#       define INT64_C(value) value##LL\n#       define UINT64_C(value) value##uLL\n#    else\n#       error defaults not correct; you must hand modify boost/cstdint.hpp\n#    endif\n#  elif ULONG_MAX != 0xffffffff\n\n#    if ULONG_MAX == 18446744073709551615U // 2**64 - 1\n#       define INT64_C(value) value##L\n#       define UINT64_C(value) value##uL\n#    else\n#       error defaults not correct; you must hand modify boost/cstdint.hpp\n#    endif\n#  elif defined(BOOST_HAS_LONG_LONG)\n     // Usual macros not defined, work things out for ourselves:\n#    if(~0uLL == 18446744073709551615ULL)\n#       define INT64_C(value) value##LL\n#       define UINT64_C(value) value##uLL\n#    else\n#       error defaults not correct; you must hand modify boost/cstdint.hpp\n#    endif\n#  else\n#    error defaults not correct; you must hand modify boost/cstdint.hpp\n#  endif\n\n#  ifdef BOOST_NO_INT64_T\n#   define INTMAX_C(value) INT32_C(value)\n#   define UINTMAX_C(value) UINT32_C(value)\n#  else\n#   define INTMAX_C(value) INT64_C(value)\n#   define UINTMAX_C(value) UINT64_C(value)\n#  endif\n#endif\n# endif // Borland/Microsoft specific width suffixes\n\n#endif // INT#_C macros.\n\n\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/cxx11_char_types.hpp",
    "content": "//  boost cxx11_char_types.hpp  --------------------------------------------------------//\n\n//  Copyright Beman Dawes 2011\n\n//  Distributed under the Boost Software License, Version 1.0.\n//  See http://www.boost.org/LICENSE_1_0.txt\n\n//--------------------------------------------------------------------------------------//\n//                                                                                      //\n//  The purpose of this header is to emulate the C++11 char16_t and char32_t            //\n//  character and string types so that they can be used in both C++11 and C++03         //\n//  programs.                                                                           //\n//                                                                                      //\n//  The emulation names use char16/char32 rather than char16_t/char32_t to avoid use    //\n//  of names that are keywords in C++11.                                                //\n//                                                                                      //\n//  The emulation names are placed in namespace boost, as is usual for Boost C++11      //\n//  emulation names such as those in header <boost/cstdint.hpp>.                        //\n//                                                                                      //\n//  An alternative would would have been to place the C++11 emulation names at global   //\n//  scope, and put the C++11 string types in namespace std. That is the approach taken  //\n//  by Microsoft Visual Studio 2010, but is controversion with some Boost users and     //\n//  developers, and runs counter to usual Boost practice.                               //\n//                                                                                      //\n//  Thanks to Mathias Gaunard and others for discussions leading to the final form      //\n//  of these typedefs.                                                                  //\n//                                                                                      //\n//   Boost               C++11            C++03                                         //\n//   ----------------    --------------   --------------------------------              //\n//   boost::char16       char16_t         uint16_t                                      //\n//   boost::char32       char32_t         uint32_t                                      //\n//   boost::u16string    std::u16string   std::basic_string<boost::char16>              //\n//   boost::u32string    std::u32string   std::basic_string<boost::char32>              //\n//                                                                                      //\n//   Uses the typedefs provided by Microsoft Visual C++ 2010 if present                 //\n//                                                                                      //\n//   Thanks to Mathias Gaunard and others for discussions leading to the final form     //\n//   of these typedefs.                                                                 //\n//                                                                                      //\n//--------------------------------------------------------------------------------------//\n\n#if !defined(BOOST_CXX11_CHAR_TYPES_HPP)\n# define BOOST_CXX11_CHAR_TYPES_HPP\n\n# include <boost/config.hpp>\n# include <boost/cstdint.hpp>\n# include <string>\n\nnamespace boost\n{\n\n# if defined(BOOST_NO_CXX11_CHAR16_T) && (!defined(_MSC_VER) || _MSC_VER < 1600)  // 1600 == VC++10\n    typedef boost::uint_least16_t             char16;\n    typedef std::basic_string<boost::char16>  u16string;\n# else\n    typedef char16_t                          char16;\n    typedef std::u16string                    u16string;\n# endif\n\n# if defined(BOOST_NO_CXX11_CHAR32_T) && (!defined(_MSC_VER) || _MSC_VER < 1600)  // 1600 == VC++10\n    typedef  boost::uint_least32_t            char32;\n    typedef std::basic_string<boost::char32>  u32string;\n# else\n    typedef char32_t                          char32;\n    typedef std::u32string                    u32string;\n# endif\n\n}  // namespace boost\n\n#endif  // !defined(BOOST_CXX11_CHAR_TYPES_HPP)\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/detail/workaround.hpp",
    "content": "// Copyright David Abrahams 2002.\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n#ifndef BOOST_WORKAROUND_DWA2002126_HPP\n#define BOOST_WORKAROUND_DWA2002126_HPP\n\n#include <boost/config/workaround.hpp>\n\n#endif // BOOST_WORKAROUND_DWA2002126_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/limits.hpp",
    "content": "\n//  (C) Copyright John maddock 1999. \n//  (C) David Abrahams 2002.  Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// use this header as a workaround for missing <limits>\n\n//  See http://www.boost.org/libs/compatibility/index.html for documentation.\n\n#ifndef BOOST_LIMITS\n#define BOOST_LIMITS\n\n#include <boost/config.hpp>\n\n#ifdef BOOST_NO_LIMITS\n#  error \"There is no std::numeric_limits suppport available.\"\n#else\n# include <limits>\n#endif\n\n#if (defined(BOOST_HAS_LONG_LONG) && defined(BOOST_NO_LONG_LONG_NUMERIC_LIMITS)) \\\n      || (defined(BOOST_HAS_MS_INT64) && defined(BOOST_NO_MS_INT64_NUMERIC_LIMITS))\n// Add missing specializations for numeric_limits:\n#ifdef BOOST_HAS_MS_INT64\n#  define BOOST_LLT __int64\n#  define BOOST_ULLT unsigned __int64\n#else\n#  define BOOST_LLT  ::boost::long_long_type\n#  define BOOST_ULLT  ::boost::ulong_long_type\n#endif\n\n#include <climits>  // for CHAR_BIT\n\nnamespace std\n{\n  template<>\n  class numeric_limits<BOOST_LLT> \n  {\n   public:\n\n      BOOST_STATIC_CONSTANT(bool, is_specialized = true);\n#ifdef BOOST_HAS_MS_INT64\n      static BOOST_LLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0x8000000000000000i64; }\n      static BOOST_LLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0x7FFFFFFFFFFFFFFFi64; }\n#elif defined(LLONG_MAX)\n      static BOOST_LLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return LLONG_MIN; }\n      static BOOST_LLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return LLONG_MAX; }\n#elif defined(LONGLONG_MAX)\n      static BOOST_LLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return LONGLONG_MIN; }\n      static BOOST_LLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return LONGLONG_MAX; }\n#else\n      static BOOST_LLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 1LL << (sizeof(BOOST_LLT) * CHAR_BIT - 1); }\n      static BOOST_LLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ~(min)(); }\n#endif\n      BOOST_STATIC_CONSTANT(int, digits = sizeof(BOOST_LLT) * CHAR_BIT -1);\n      BOOST_STATIC_CONSTANT(int, digits10 = (CHAR_BIT * sizeof (BOOST_LLT) - 1) * 301L / 1000);\n      BOOST_STATIC_CONSTANT(bool, is_signed = true);\n      BOOST_STATIC_CONSTANT(bool, is_integer = true);\n      BOOST_STATIC_CONSTANT(bool, is_exact = true);\n      BOOST_STATIC_CONSTANT(int, radix = 2);\n      static BOOST_LLT epsilon() throw() { return 0; };\n      static BOOST_LLT round_error() throw() { return 0; };\n\n      BOOST_STATIC_CONSTANT(int, min_exponent = 0);\n      BOOST_STATIC_CONSTANT(int, min_exponent10 = 0);\n      BOOST_STATIC_CONSTANT(int, max_exponent = 0);\n      BOOST_STATIC_CONSTANT(int, max_exponent10 = 0);\n\n      BOOST_STATIC_CONSTANT(bool, has_infinity = false);\n      BOOST_STATIC_CONSTANT(bool, has_quiet_NaN = false);\n      BOOST_STATIC_CONSTANT(bool, has_signaling_NaN = false);\n      BOOST_STATIC_CONSTANT(bool, has_denorm = false);\n      BOOST_STATIC_CONSTANT(bool, has_denorm_loss = false);\n      static BOOST_LLT infinity() throw() { return 0; };\n      static BOOST_LLT quiet_NaN() throw() { return 0; };\n      static BOOST_LLT signaling_NaN() throw() { return 0; };\n      static BOOST_LLT denorm_min() throw() { return 0; };\n\n      BOOST_STATIC_CONSTANT(bool, is_iec559 = false);\n      BOOST_STATIC_CONSTANT(bool, is_bounded = true);\n      BOOST_STATIC_CONSTANT(bool, is_modulo = true);\n\n      BOOST_STATIC_CONSTANT(bool, traps = false);\n      BOOST_STATIC_CONSTANT(bool, tinyness_before = false);\n      BOOST_STATIC_CONSTANT(float_round_style, round_style = round_toward_zero);\n      \n  };\n\n  template<>\n  class numeric_limits<BOOST_ULLT> \n  {\n   public:\n\n      BOOST_STATIC_CONSTANT(bool, is_specialized = true);\n#ifdef BOOST_HAS_MS_INT64\n      static BOOST_ULLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0ui64; }\n      static BOOST_ULLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0xFFFFFFFFFFFFFFFFui64; }\n#elif defined(ULLONG_MAX) && defined(ULLONG_MIN)\n      static BOOST_ULLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULLONG_MIN; }\n      static BOOST_ULLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULLONG_MAX; }\n#elif defined(ULONGLONG_MAX) && defined(ULONGLONG_MIN)\n      static BOOST_ULLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULONGLONG_MIN; }\n      static BOOST_ULLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULONGLONG_MAX; }\n#else\n      static BOOST_ULLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0uLL; }\n      static BOOST_ULLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ~0uLL; }\n#endif\n      BOOST_STATIC_CONSTANT(int, digits = sizeof(BOOST_LLT) * CHAR_BIT);\n      BOOST_STATIC_CONSTANT(int, digits10 = (CHAR_BIT * sizeof (BOOST_LLT)) * 301L / 1000);\n      BOOST_STATIC_CONSTANT(bool, is_signed = false);\n      BOOST_STATIC_CONSTANT(bool, is_integer = true);\n      BOOST_STATIC_CONSTANT(bool, is_exact = true);\n      BOOST_STATIC_CONSTANT(int, radix = 2);\n      static BOOST_ULLT epsilon() throw() { return 0; };\n      static BOOST_ULLT round_error() throw() { return 0; };\n\n      BOOST_STATIC_CONSTANT(int, min_exponent = 0);\n      BOOST_STATIC_CONSTANT(int, min_exponent10 = 0);\n      BOOST_STATIC_CONSTANT(int, max_exponent = 0);\n      BOOST_STATIC_CONSTANT(int, max_exponent10 = 0);\n\n      BOOST_STATIC_CONSTANT(bool, has_infinity = false);\n      BOOST_STATIC_CONSTANT(bool, has_quiet_NaN = false);\n      BOOST_STATIC_CONSTANT(bool, has_signaling_NaN = false);\n      BOOST_STATIC_CONSTANT(bool, has_denorm = false);\n      BOOST_STATIC_CONSTANT(bool, has_denorm_loss = false);\n      static BOOST_ULLT infinity() throw() { return 0; };\n      static BOOST_ULLT quiet_NaN() throw() { return 0; };\n      static BOOST_ULLT signaling_NaN() throw() { return 0; };\n      static BOOST_ULLT denorm_min() throw() { return 0; };\n\n      BOOST_STATIC_CONSTANT(bool, is_iec559 = false);\n      BOOST_STATIC_CONSTANT(bool, is_bounded = true);\n      BOOST_STATIC_CONSTANT(bool, is_modulo = true);\n\n      BOOST_STATIC_CONSTANT(bool, traps = false);\n      BOOST_STATIC_CONSTANT(bool, tinyness_before = false);\n      BOOST_STATIC_CONSTANT(float_round_style, round_style = round_toward_zero);\n      \n  };\n}\n#endif \n\n#endif\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/complex128.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_COMPLEX128_HPP\n#define BOOST_MP_COMPLEX128_HPP\n\n#include <boost/multiprecision/float128.hpp>\n#include <boost/multiprecision/complex_adaptor.hpp>\n\nnamespace boost {\nnamespace multiprecision {\n\nusing complex128 = number<complex_adaptor<float128_backend>, et_off>;\n\ntemplate <>\nstruct component_type<number<complex_adaptor<float128_backend> > >\n{\n   using type = float128;\n};\n\n}\n} // namespace boost::multiprecision\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/complex_adaptor.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_COMPLEX_ADAPTOR_HPP\n#define BOOST_MP_COMPLEX_ADAPTOR_HPP\n\n#include <boost/multiprecision/number.hpp>\n#include <cstdint>\n#include <boost/multiprecision/detail/digits.hpp>\n#include <boost/multiprecision/detail/hash.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n#include <cmath>\n#include <algorithm>\n#include <complex>\n\nnamespace boost {\nnamespace multiprecision {\nnamespace backends {\n\ntemplate <class Backend>\nstruct debug_adaptor;\n\ntemplate <class Backend>\nstruct logged_adaptor;\n\ntemplate <class Backend>\nstruct complex_adaptor\n{\n protected:\n   Backend m_real, m_imag;\n\n public:\n   Backend& real_data()\n   {\n      return m_real;\n   }\n   const Backend& real_data() const\n   {\n      return m_real;\n   }\n   Backend& imag_data()\n   {\n      return m_imag;\n   }\n   const Backend& imag_data() const\n   {\n      return m_imag;\n   }\n\n   using signed_types = typename Backend::signed_types  ;\n   using unsigned_types = typename Backend::unsigned_types;\n   using float_types = typename Backend::float_types   ;\n   using exponent_type = typename Backend::exponent_type ;\n\n   complex_adaptor() {}\n   complex_adaptor(const complex_adaptor& o) : m_real(o.real_data()), m_imag(o.imag_data()) {}\n   // Rvalue construct:\n   complex_adaptor(complex_adaptor&& o) : m_real(std::move(o.real_data())), m_imag(std::move(o.imag_data()))\n   {}\n   complex_adaptor(const Backend& val)\n       : m_real(val)\n   {}\n\n   template <class T>\n   complex_adaptor(const T& val, const typename std::enable_if<std::is_convertible<T, Backend>::value>::type* = nullptr)\n       : m_real(val) \n   {}\n\n   complex_adaptor(const std::complex<float>& val)\n   {\n      m_real = (long double)val.real();\n      m_imag = (long double)val.imag();\n   }\n   complex_adaptor(const std::complex<double>& val)\n   {\n      m_real = (long double)val.real();\n      m_imag = (long double)val.imag();\n   }\n   complex_adaptor(const std::complex<long double>& val)\n   {\n      m_real = val.real();\n      m_imag = val.imag();\n   }\n   template <class T, class U>\n   complex_adaptor(const T& a, const U& b, typename std::enable_if<std::is_constructible<Backend, T const&>::value&& std::is_constructible<Backend, U const&>::value>::type const* = nullptr)\n      : m_real(a), m_imag(b) {}\n   template <class T, class U>\n   complex_adaptor(T&& a, const U& b, typename std::enable_if<std::is_constructible<Backend, T>::value&& std::is_constructible<Backend, U>::value>::type const* = nullptr)\n      : m_real(static_cast<T&&>(a)), m_imag(b) {}\n   template <class T, class U>\n   complex_adaptor(T&& a, U&& b, typename std::enable_if<std::is_constructible<Backend, T>::value&& std::is_constructible<Backend, U>::value>::type const* = nullptr)\n      : m_real(static_cast<T&&>(a)), m_imag(static_cast<U&&>(b)) {}\n   template <class T, class U>\n   complex_adaptor(const T& a, U&& b, typename std::enable_if<std::is_constructible<Backend, T>::value&& std::is_constructible<Backend, U>::value>::type const* = nullptr)\n      : m_real(a), m_imag(static_cast<U&&>(b)) {}\n\n   complex_adaptor& operator=(const complex_adaptor& o)\n   {\n      m_real = o.real_data();\n      m_imag = o.imag_data();\n      return *this;\n   }\n   // rvalue assign:\n   complex_adaptor& operator=(complex_adaptor&& o) noexcept\n   {\n      m_real = std::move(o.real_data());\n      m_imag = std::move(o.imag_data());\n      return *this;\n   }\n   template <class V>\n   typename std::enable_if<std::is_assignable<Backend, V>::value, complex_adaptor&>::type operator=(const V& v)\n   {\n      using ui_type = typename std::tuple_element<0, unsigned_types>::type;\n      m_real = v;\n      m_imag = ui_type(0u);\n      return *this;\n   }\n   template <class T>\n   complex_adaptor& operator=(const std::complex<T>& val)\n   {\n      m_real = (long double)val.real();\n      m_imag = (long double)val.imag();\n      return *this;\n   }\n   complex_adaptor& operator=(const char* s)\n   {\n      using ui_type = typename std::tuple_element<0, unsigned_types>::type;\n      ui_type                                           zero = 0u;\n\n      using default_ops::eval_fpclassify;\n\n      if (s && (*s == '('))\n      {\n         std::string part;\n         const char* p = ++s;\n         while (*p && (*p != ',') && (*p != ')'))\n            ++p;\n         part.assign(s, p);\n         if (part.size())\n            real_data() = part.c_str();\n         else\n            real_data() = zero;\n         s = p;\n         if (*p && (*p != ')'))\n         {\n            ++p;\n            while (*p && (*p != ')'))\n               ++p;\n            part.assign(s + 1, p);\n         }\n         else\n            part.erase();\n         if (part.size())\n            imag_data() = part.c_str();\n         else\n            imag_data() = zero;\n\n         if (eval_fpclassify(imag_data()) == static_cast<int>(FP_NAN))\n         {\n            real_data() = imag_data();\n         }\n      }\n      else\n      {\n         real_data() = s;\n         imag_data() = zero;\n      }\n      return *this;\n   }\n\n   int compare(const complex_adaptor& o) const\n   {\n      // They are either equal or not:\n      return (m_real.compare(o.real_data()) == 0) && (m_imag.compare(o.imag_data()) == 0) ? 0 : 1;\n   }\n   template <class T>\n   int compare(const T& val) const\n   {\n      using default_ops::eval_is_zero;\n      return (m_real.compare(val) == 0) && eval_is_zero(m_imag) ? 0 : 1;\n   }\n   void swap(complex_adaptor& o)\n   {\n      real_data().swap(o.real_data());\n      imag_data().swap(o.imag_data());\n   }\n   std::string str(std::streamsize dig, std::ios_base::fmtflags f) const\n   {\n      using default_ops::eval_is_zero;\n      if (eval_is_zero(imag_data()))\n         return m_real.str(dig, f);\n      return \"(\" + m_real.str(dig, f) + \",\" + m_imag.str(dig, f) + \")\";\n   }\n   void negate()\n   {\n      m_real.negate();\n      m_imag.negate();\n   }\n};\n\ntemplate <class Backend, class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_arithmetic<T>::value, bool>::type eval_eq(const complex_adaptor<Backend>& a, const T& b) noexcept\n{\n   return a.compare(b) == 0;\n}\n\ntemplate <class Backend>\ninline void eval_add(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& o)\n{\n   eval_add(result.real_data(), o.real_data());\n   eval_add(result.imag_data(), o.imag_data());\n}\ntemplate <class Backend>\ninline void eval_subtract(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& o)\n{\n   eval_subtract(result.real_data(), o.real_data());\n   eval_subtract(result.imag_data(), o.imag_data());\n}\ntemplate <class Backend>\ninline void eval_multiply(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& o)\n{\n   Backend t1, t2, t3;\n   eval_multiply(t1, result.real_data(), o.real_data());\n   eval_multiply(t2, result.imag_data(), o.imag_data());\n   eval_subtract(t3, t1, t2);\n   eval_multiply(t1, result.real_data(), o.imag_data());\n   eval_multiply(t2, result.imag_data(), o.real_data());\n   eval_add(t1, t2);\n   result.real_data() = std::move(t3);\n   result.imag_data() = std::move(t1);\n}\ntemplate <class Backend>\ninline void eval_divide(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& z)\n{\n   // (a+bi) / (c + di)\n   using default_ops::eval_add;\n   using default_ops::eval_divide;\n   using default_ops::eval_fabs;\n   using default_ops::eval_is_zero;\n   using default_ops::eval_multiply;\n   using default_ops::eval_subtract;\n   Backend t1, t2;\n\n   //\n   // Backup sign bits for later, so we can fix up\n   // signed zeros at the end:\n   //\n   int a_sign = eval_signbit(result.real_data());\n   int b_sign = eval_signbit(result.imag_data());\n   int c_sign = eval_signbit(z.real_data());\n   int d_sign = eval_signbit(z.imag_data());\n\n   if (eval_is_zero(z.imag_data()))\n   {\n      eval_divide(result.real_data(), z.real_data());\n      eval_divide(result.imag_data(), z.real_data());\n   }\n   else\n   {\n      eval_fabs(t1, z.real_data());\n      eval_fabs(t2, z.imag_data());\n      if (t1.compare(t2) < 0)\n      {\n         eval_divide(t1, z.real_data(), z.imag_data()); // t1 = c/d\n         eval_multiply(t2, z.real_data(), t1);\n         eval_add(t2, z.imag_data()); // denom = c * (c/d) + d\n         Backend t_real(result.real_data());\n         // real = (a * (c/d) + b) / (denom)\n         eval_multiply(result.real_data(), t1);\n         eval_add(result.real_data(), result.imag_data());\n         eval_divide(result.real_data(), t2);\n         // imag = (b * c/d - a) / denom\n         eval_multiply(result.imag_data(), t1);\n         eval_subtract(result.imag_data(), t_real);\n         eval_divide(result.imag_data(), t2);\n      }\n      else\n      {\n         eval_divide(t1, z.imag_data(), z.real_data()); // t1 = d/c\n         eval_multiply(t2, z.imag_data(), t1);\n         eval_add(t2, z.real_data()); // denom = d * d/c + c\n\n         Backend r_t(result.real_data());\n         Backend i_t(result.imag_data());\n\n         // real = (b * d/c + a) / denom\n         eval_multiply(result.real_data(), result.imag_data(), t1);\n         eval_add(result.real_data(), r_t);\n         eval_divide(result.real_data(), t2);\n         // imag = (-a * d/c + b) / denom\n         eval_multiply(result.imag_data(), r_t, t1);\n         result.imag_data().negate();\n         eval_add(result.imag_data(), i_t);\n         eval_divide(result.imag_data(), t2);\n      }\n   }\n   //\n   // Finish off by fixing up signed zeros.\n   // \n   // This sets the signs \"as if\" we had evaluated the result using:\n   // \n   // real = (ac + bd) / (c^2 + d^2)\n   // imag = (bc - ad) / (c^2 + d^2)\n   // \n   // ie a zero is negative only if the two parts of the numerator\n   // are both negative and zero.\n   //\n   if (eval_is_zero(result.real_data()))\n   {\n      int r_sign = eval_signbit(result.real_data());\n      int r_required = (a_sign != c_sign) && (b_sign != d_sign);\n      if (r_required != r_sign)\n         result.real_data().negate();\n   }\n   if (eval_is_zero(result.imag_data()))\n   {\n      int i_sign = eval_signbit(result.imag_data());\n      int i_required = (b_sign != c_sign) && (a_sign == d_sign);\n      if (i_required != i_sign)\n         result.imag_data().negate();\n   }\n}\ntemplate <class Backend, class T>\ninline typename std::enable_if< !std::is_same<complex_adaptor<Backend>, T>::value>::type eval_add(complex_adaptor<Backend>& result, const T& scalar)\n{\n   using default_ops::eval_add;\n   eval_add(result.real_data(), scalar);\n}\ntemplate <class Backend, class T>\ninline typename std::enable_if< !std::is_same<complex_adaptor<Backend>, T>::value>::type eval_subtract(complex_adaptor<Backend>& result, const T& scalar)\n{\n   using default_ops::eval_subtract;\n   eval_subtract(result.real_data(), scalar);\n}\ntemplate <class Backend, class T>\ninline typename std::enable_if< !std::is_same<complex_adaptor<Backend>, T>::value>::type eval_multiply(complex_adaptor<Backend>& result, const T& scalar)\n{\n   using default_ops::eval_multiply;\n   eval_multiply(result.real_data(), scalar);\n   eval_multiply(result.imag_data(), scalar);\n}\ntemplate <class Backend, class T>\ninline typename std::enable_if< !std::is_same<complex_adaptor<Backend>, T>::value>::type eval_divide(complex_adaptor<Backend>& result, const T& scalar)\n{\n   using default_ops::eval_divide;\n   eval_divide(result.real_data(), scalar);\n   eval_divide(result.imag_data(), scalar);\n}\n// Optimised 3 arg versions:\ntemplate <class Backend, class T>\ninline typename std::enable_if< !std::is_same<complex_adaptor<Backend>, T>::value>::type eval_add(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& a, const T& scalar)\n{\n   using default_ops::eval_add;\n   eval_add(result.real_data(), a.real_data(), scalar);\n   result.imag_data() = a.imag_data();\n}\ntemplate <class Backend, class T>\ninline typename std::enable_if< !std::is_same<complex_adaptor<Backend>, T>::value>::type eval_subtract(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& a, const T& scalar)\n{\n   using default_ops::eval_subtract;\n   eval_subtract(result.real_data(), a.real_data(), scalar);\n   result.imag_data() = a.imag_data();\n}\ntemplate <class Backend, class T>\ninline typename std::enable_if< !std::is_same<complex_adaptor<Backend>, T>::value>::type eval_multiply(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& a, const T& scalar)\n{\n   using default_ops::eval_multiply;\n   eval_multiply(result.real_data(), a.real_data(), scalar);\n   eval_multiply(result.imag_data(), a.imag_data(), scalar);\n}\ntemplate <class Backend, class T>\ninline typename std::enable_if< !std::is_same<complex_adaptor<Backend>, T>::value>::type eval_divide(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& a, const T& scalar)\n{\n   using default_ops::eval_divide;\n   eval_divide(result.real_data(), a.real_data(), scalar);\n   eval_divide(result.imag_data(), a.imag_data(), scalar);\n}\n\ntemplate <class Backend>\ninline bool eval_is_zero(const complex_adaptor<Backend>& val) noexcept\n{\n   using default_ops::eval_is_zero;\n   return eval_is_zero(val.real_data()) && eval_is_zero(val.imag_data());\n}\ntemplate <class Backend>\ninline int eval_get_sign(const complex_adaptor<Backend>&)\n{\n   static_assert(sizeof(Backend) == UINT_MAX, \"Complex numbers have no sign bit.\"); // designed to always fail\n   return 0;\n}\n\ntemplate <class Result, class Backend>\ninline typename std::enable_if< !boost::multiprecision::detail::is_complex<Result>::value>::type eval_convert_to(Result* result, const complex_adaptor<Backend>& val)\n{\n   using default_ops::eval_convert_to;\n   using default_ops::eval_is_zero;\n   if (!eval_is_zero(val.imag_data()))\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Could not convert imaginary number to scalar.\"));\n   }\n   eval_convert_to(result, val.real_data());\n}\n\ntemplate <class Backend, class T>\ninline void assign_components(complex_adaptor<Backend>& result, const T& a, const T& b)\n{\n   result.real_data() = a;\n   result.imag_data() = b;\n}\n\n//\n// Native non-member operations:\n//\ntemplate <class Backend>\ninline void eval_sqrt(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& val)\n{\n   // Use the following:\n   // sqrt(z) = (s, zi / 2s)       for zr >= 0\n   //           (|zi| / 2s, +-s)   for zr <  0\n   // where s = sqrt{ [ |zr| + sqrt(zr^2 + zi^2) ] / 2 },\n   // and the +- sign is the same as the sign of zi.\n   using default_ops::eval_abs;\n   using default_ops::eval_add;\n   using default_ops::eval_divide;\n   using default_ops::eval_get_sign;\n   using default_ops::eval_is_zero;\n\n   if (eval_is_zero(val.imag_data()) && (eval_get_sign(val.real_data()) >= 0))\n   {\n      constexpr typename std::tuple_element<0, typename Backend::unsigned_types>::type zero = 0u;\n      eval_sqrt(result.real_data(), val.real_data());\n      result.imag_data() = zero;\n      return;\n   }\n\n   const bool __my_real_part_is_neg(eval_get_sign(val.real_data()) < 0);\n\n   Backend __my_real_part_fabs(val.real_data());\n   if (__my_real_part_is_neg)\n      __my_real_part_fabs.negate();\n\n   Backend t, __my_sqrt_part;\n   eval_abs(__my_sqrt_part, val);\n   eval_add(__my_sqrt_part, __my_real_part_fabs);\n   eval_ldexp(t, __my_sqrt_part, -1);\n   eval_sqrt(__my_sqrt_part, t);\n\n   if (__my_real_part_is_neg == false)\n   {\n      eval_ldexp(t, __my_sqrt_part, 1);\n      eval_divide(result.imag_data(), val.imag_data(), t);\n      result.real_data() = __my_sqrt_part;\n   }\n   else\n   {\n      const bool __my_imag_part_is_neg(eval_get_sign(val.imag_data()) < 0);\n\n      Backend __my_imag_part_fabs(val.imag_data());\n      if (__my_imag_part_is_neg)\n         __my_imag_part_fabs.negate();\n\n      eval_ldexp(t, __my_sqrt_part, 1);\n      eval_divide(result.real_data(), __my_imag_part_fabs, t);\n      if (__my_imag_part_is_neg)\n         __my_sqrt_part.negate();\n      result.imag_data() = __my_sqrt_part;\n   }\n}\n\ntemplate <class Backend>\ninline void eval_abs(Backend& result, const complex_adaptor<Backend>& val)\n{\n   Backend t1, t2;\n   eval_multiply(t1, val.real_data(), val.real_data());\n   eval_multiply(t2, val.imag_data(), val.imag_data());\n   eval_add(t1, t2);\n   eval_sqrt(result, t1);\n}\n\ntemplate <class Backend>\ninline void eval_pow(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& b, const complex_adaptor<Backend>& e)\n{\n   using default_ops::eval_acos;\n   using default_ops::eval_cos;\n   using default_ops::eval_exp;\n   using default_ops::eval_get_sign;\n   using default_ops::eval_is_zero;\n   using default_ops::eval_multiply;\n   using default_ops::eval_sin;\n\n   if (eval_is_zero(e))\n   {\n      typename std::tuple_element<0, typename Backend::unsigned_types>::type one(1);\n      result = one;\n      return;\n   }\n   else if (eval_is_zero(b))\n   {\n      if (eval_is_zero(e.real_data()))\n      {\n         Backend n          = std::numeric_limits<number<Backend> >::quiet_NaN().backend();\n         result.real_data() = n;\n         result.imag_data() = n;\n      }\n      else if (eval_get_sign(e.real_data()) < 0)\n      {\n         Backend n          = std::numeric_limits<number<Backend> >::infinity().backend();\n         result.real_data() = n;\n         typename std::tuple_element<0, typename Backend::unsigned_types>::type zero(0);\n         if (eval_is_zero(e.imag_data()))\n            result.imag_data() = zero;\n         else\n            result.imag_data() = n;\n      }\n      else\n      {\n         typename std::tuple_element<0, typename Backend::unsigned_types>::type zero(0);\n         result = zero;\n      }\n      return;\n   }\n   complex_adaptor<Backend> t;\n   eval_log(t, b);\n   eval_multiply(t, e);\n   eval_exp(result, t);\n}\n\ntemplate <class Backend>\ninline void eval_exp(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)\n{\n   using default_ops::eval_cos;\n   using default_ops::eval_exp;\n   using default_ops::eval_is_zero;\n   using default_ops::eval_multiply;\n   using default_ops::eval_sin;\n\n   if (eval_is_zero(arg.imag_data()))\n   {\n      eval_exp(result.real_data(), arg.real_data());\n      typename std::tuple_element<0, typename Backend::unsigned_types>::type zero(0);\n      result.imag_data() = zero;\n      return;\n   }\n   eval_cos(result.real_data(), arg.imag_data());\n   eval_sin(result.imag_data(), arg.imag_data());\n   Backend e;\n   eval_exp(e, arg.real_data());\n   if (eval_is_zero(result.real_data()))\n      eval_multiply(result.imag_data(), e);\n   else if (eval_is_zero(result.imag_data()))\n      eval_multiply(result.real_data(), e);\n   else\n      eval_multiply(result, e);\n}\n\ntemplate <class Backend>\ninline void eval_log(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)\n{\n   using default_ops::eval_add;\n   using default_ops::eval_atan2;\n   using default_ops::eval_get_sign;\n   using default_ops::eval_is_zero;\n   using default_ops::eval_log;\n   using default_ops::eval_multiply;\n\n   if (eval_is_zero(arg.imag_data()) && (eval_get_sign(arg.real_data()) >= 0))\n   {\n      eval_log(result.real_data(), arg.real_data());\n      typename std::tuple_element<0, typename Backend::unsigned_types>::type zero(0);\n      result.imag_data() = zero;\n      return;\n   }\n\n   Backend t1, t2;\n   eval_multiply(t1, arg.real_data(), arg.real_data());\n   eval_multiply(t2, arg.imag_data(), arg.imag_data());\n   eval_add(t1, t2);\n   eval_log(t2, t1);\n   eval_ldexp(result.real_data(), t2, -1);\n   eval_atan2(result.imag_data(), arg.imag_data(), arg.real_data());\n}\n\ntemplate <class Backend>\ninline void eval_log10(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)\n{\n   using default_ops::eval_divide;\n   using default_ops::eval_log;\n\n   using ui_type = typename std::tuple_element<0, typename Backend::unsigned_types>::type;\n\n   Backend ten;\n   ten = ui_type(10);\n   Backend l_ten;\n   eval_log(l_ten, ten);\n   eval_log(result, arg);\n   eval_divide(result, l_ten);\n}\n\ntemplate <class Backend>\ninline void eval_sin(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)\n{\n   using default_ops::eval_cos;\n   using default_ops::eval_cosh;\n   using default_ops::eval_sin;\n   using default_ops::eval_sinh;\n\n   Backend t1, t2, t3;\n   eval_sin(t1, arg.real_data());\n   eval_cosh(t2, arg.imag_data());\n   eval_multiply(t3, t1, t2);\n\n   eval_cos(t1, arg.real_data());\n   eval_sinh(t2, arg.imag_data());\n   eval_multiply(result.imag_data(), t1, t2);\n   result.real_data() = t3;\n}\n\ntemplate <class Backend>\ninline void eval_cos(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)\n{\n   using default_ops::eval_cos;\n   using default_ops::eval_cosh;\n   using default_ops::eval_sin;\n   using default_ops::eval_sinh;\n\n   Backend t1, t2, t3;\n   eval_cos(t1, arg.real_data());\n   eval_cosh(t2, arg.imag_data());\n   eval_multiply(t3, t1, t2);\n\n   eval_sin(t1, arg.real_data());\n   eval_sinh(t2, arg.imag_data());\n   eval_multiply(result.imag_data(), t1, t2);\n   result.imag_data().negate();\n   result.real_data() = t3;\n}\n\ntemplate <class T>\nvoid tanh_imp(const T& r, const T& i, T& r_result, T& i_result)\n{\n   using default_ops::eval_tan;\n   using default_ops::eval_sinh;\n   using default_ops::eval_add;\n   using default_ops::eval_fpclassify;\n   using default_ops::eval_get_sign;\n\n   using ui_type = typename std::tuple_element<0, typename T::unsigned_types>::type;\n   ui_type one(1);\n   //\n   // Set:\n   // t = tan(i);\n   // s = sinh(r);\n   // b = s * (1 + t^2);\n   // d = 1 + b * s;\n   //\n   T t, s, b, d;\n   eval_tan(t, i);\n   eval_sinh(s, r);\n   eval_multiply(d, t, t);\n   eval_add(d, one);\n   eval_multiply(b, d, s);\n   eval_multiply(d, b, s);\n   eval_add(d, one);\n\n   if (eval_fpclassify(d) == FP_INFINITE)\n   {\n      r_result = one;\n      if (eval_get_sign(s) < 0)\n         r_result.negate();\n      //\n      // Imaginary part is a signed zero:\n      //\n      ui_type zero(0);\n      i_result = zero;\n      if (eval_get_sign(t) < 0)\n         i_result.negate();\n   }\n   //\n   // Real part is sqrt(1 + s^2) * b / d;\n   // Imaginary part is t / d;\n   //\n   eval_divide(i_result, t, d);\n   //\n   // variable t is now spare, as is r_result.\n   //\n   eval_multiply(t, s, s);\n   eval_add(t, one);\n   eval_sqrt(r_result, t);\n   eval_multiply(t, r_result, b);\n   eval_divide(r_result, t, d);\n}\n\ntemplate <class Backend>\ninline void eval_tanh(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)\n{\n   tanh_imp(arg.real_data(), arg.imag_data(), result.real_data(), result.imag_data());\n}\ntemplate <class Backend>\ninline void eval_tan(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)\n{\n   Backend t(arg.imag_data());\n   t.negate();\n   tanh_imp(t, arg.real_data(), result.imag_data(), result.real_data());\n   result.imag_data().negate();\n}\n\ntemplate <class Backend>\ninline void eval_asin(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)\n{\n   using default_ops::eval_add;\n   using default_ops::eval_multiply;\n\n   if (eval_is_zero(arg))\n   {\n      result = arg;\n      return;\n   }\n\n   complex_adaptor<Backend> t1, t2;\n   assign_components(t1, arg.imag_data(), arg.real_data());\n   t1.real_data().negate();\n   eval_asinh(t2, t1);\n\n   assign_components(result, t2.imag_data(), t2.real_data());\n   result.imag_data().negate();\n}\n\ntemplate <class Backend>\ninline void eval_acos(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)\n{\n   using ui_type = typename std::tuple_element<0, typename Backend::unsigned_types>::type;\n\n   using default_ops::eval_asin;\n\n   Backend half_pi, t1;\n   t1 = static_cast<ui_type>(1u);\n   eval_asin(half_pi, t1);\n   eval_asin(result, arg);\n   result.negate();\n   eval_add(result.real_data(), half_pi);\n}\n\ntemplate <class Backend>\ninline void eval_atan(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)\n{\n   using ui_type = typename std::tuple_element<0, typename Backend::unsigned_types>::type;\n   ui_type                                                             one = (ui_type)1u;\n\n   using default_ops::eval_add;\n   using default_ops::eval_is_zero;\n   using default_ops::eval_log;\n   using default_ops::eval_subtract;\n\n   complex_adaptor<Backend> __my_z_times_i, t1, t2, t3;\n   assign_components(__my_z_times_i, arg.imag_data(), arg.real_data());\n   __my_z_times_i.real_data().negate();\n\n   eval_add(t1, __my_z_times_i, one);\n   eval_log(t2, t1);\n   eval_subtract(t1, one, __my_z_times_i);\n   eval_log(t3, t1);\n   eval_subtract(t1, t3, t2);\n\n   eval_ldexp(result.real_data(), t1.imag_data(), -1);\n   eval_ldexp(result.imag_data(), t1.real_data(), -1);\n   if (!eval_is_zero(result.real_data()))\n      result.real_data().negate();\n}\n\ntemplate <class Backend>\ninline void eval_sinh(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)\n{\n   using default_ops::eval_cos;\n   using default_ops::eval_cosh;\n   using default_ops::eval_sin;\n   using default_ops::eval_sinh;\n\n   Backend t1, t2, t3;\n   eval_cos(t1, arg.imag_data());\n   eval_sinh(t2, arg.real_data());\n   eval_multiply(t3, t1, t2);\n\n   eval_cosh(t1, arg.real_data());\n   eval_sin(t2, arg.imag_data());\n   eval_multiply(result.imag_data(), t1, t2);\n   result.real_data() = t3;\n}\n\ntemplate <class Backend>\ninline void eval_cosh(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)\n{\n   using default_ops::eval_cos;\n   using default_ops::eval_cosh;\n   using default_ops::eval_sin;\n   using default_ops::eval_sinh;\n\n   Backend t1, t2, t3;\n   eval_cos(t1, arg.imag_data());\n   eval_cosh(t2, arg.real_data());\n   eval_multiply(t3, t1, t2);\n\n   eval_sin(t1, arg.imag_data());\n   eval_sinh(t2, arg.real_data());\n   eval_multiply(result.imag_data(), t1, t2);\n   result.real_data() = t3;\n}\n\ntemplate <class Backend>\ninline void eval_asinh(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)\n{\n   using ui_type = typename std::tuple_element<0, typename Backend::unsigned_types>::type;\n   ui_type                                                             one = (ui_type)1u;\n\n   using default_ops::eval_add;\n   using default_ops::eval_log;\n   using default_ops::eval_multiply;\n\n   complex_adaptor<Backend> t1, t2;\n   eval_multiply(t1, arg, arg);\n   eval_add(t1, one);\n   eval_sqrt(t2, t1);\n   eval_add(t2, arg);\n   eval_log(result, t2);\n}\n\ntemplate <class Backend>\ninline void eval_acosh(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)\n{\n   using ui_type = typename std::tuple_element<0, typename Backend::unsigned_types>::type;\n   ui_type                                                             one = (ui_type)1u;\n\n   using default_ops::eval_add;\n   using default_ops::eval_divide;\n   using default_ops::eval_log;\n   using default_ops::eval_multiply;\n   using default_ops::eval_subtract;\n\n   complex_adaptor<Backend> __my_zp(arg);\n   eval_add(__my_zp.real_data(), one);\n   complex_adaptor<Backend> __my_zm(arg);\n   eval_subtract(__my_zm.real_data(), one);\n\n   complex_adaptor<Backend> t1, t2;\n   eval_divide(t1, __my_zm, __my_zp);\n   eval_sqrt(t2, t1);\n   eval_multiply(t2, __my_zp);\n   eval_add(t2, arg);\n   eval_log(result, t2);\n}\n\ntemplate <class Backend>\ninline void eval_atanh(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)\n{\n   using ui_type = typename std::tuple_element<0, typename Backend::unsigned_types>::type;\n   ui_type                                                             one = (ui_type)1u;\n\n   using default_ops::eval_add;\n   using default_ops::eval_divide;\n   using default_ops::eval_log;\n   using default_ops::eval_multiply;\n   using default_ops::eval_subtract;\n\n   complex_adaptor<Backend> t1, t2, t3;\n   eval_add(t1, arg, one);\n   eval_log(t2, t1);\n   eval_subtract(t1, one, arg);\n   eval_log(t3, t1);\n   eval_subtract(t2, t3);\n\n   eval_ldexp(result.real_data(), t2.real_data(), -1);\n   eval_ldexp(result.imag_data(), t2.imag_data(), -1);\n}\n\ntemplate <class Backend>\ninline void eval_conj(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)\n{\n   result = arg;\n   result.imag_data().negate();\n}\n\ntemplate <class Backend>\ninline void eval_proj(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)\n{\n   using default_ops::eval_get_sign;\n\n   using ui_type = typename std::tuple_element<0, typename Backend::unsigned_types>::type;\n   ui_type                                                             zero = (ui_type)0u;\n\n   int c1 = eval_fpclassify(arg.real_data());\n   int c2 = eval_fpclassify(arg.imag_data());\n   if (c1 == FP_INFINITE)\n   {\n      result.real_data() = arg.real_data();\n      if (eval_get_sign(result.real_data()) < 0)\n         result.real_data().negate();\n      result.imag_data() = zero;\n      if (eval_get_sign(arg.imag_data()) < 0)\n         result.imag_data().negate();\n   }\n   else if (c2 == FP_INFINITE)\n   {\n      result.real_data() = arg.imag_data();\n      if (eval_get_sign(result.real_data()) < 0)\n         result.real_data().negate();\n      result.imag_data() = zero;\n      if (eval_get_sign(arg.imag_data()) < 0)\n         result.imag_data().negate();\n   }\n   else\n      result = arg;\n}\n\ntemplate <class Backend>\ninline void eval_real(Backend& result, const complex_adaptor<Backend>& arg)\n{\n   result = arg.real_data();\n}\ntemplate <class Backend>\ninline void eval_imag(Backend& result, const complex_adaptor<Backend>& arg)\n{\n   result = arg.imag_data();\n}\n\ntemplate <class Backend, class T>\ninline void eval_set_imag(complex_adaptor<Backend>& result, const T& arg)\n{\n   result.imag_data() = arg;\n}\n\ntemplate <class Backend, class T>\ninline void eval_set_real(complex_adaptor<Backend>& result, const T& arg)\n{\n   result.real_data() = arg;\n}\n\ntemplate <class Backend>\ninline std::size_t hash_value(const complex_adaptor<Backend>& val)\n{\n   std::size_t result  = hash_value(val.real_data());\n   std::size_t result2 = hash_value(val.imag_data());\n   boost::multiprecision::detail::hash_combine(result, result2);\n   return result;\n}\n\n} // namespace backends\n\nusing boost::multiprecision::backends::complex_adaptor;\n\ntemplate <class Backend>\nstruct number_category<complex_adaptor<Backend> > : public std::integral_constant<int, boost::multiprecision::number_kind_complex>\n{};\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\nstruct component_type<number<complex_adaptor<Backend>, ExpressionTemplates> >\n{\n   using type = number<Backend, ExpressionTemplates>;\n};\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\nstruct complex_result_from_scalar<number<Backend, ExpressionTemplates> >\n{\n   using type = number<complex_adaptor<Backend>, ExpressionTemplates>;\n};\n\nnamespace detail {\n   template <class Backend>\n   struct is_variable_precision<complex_adaptor<Backend> > : public is_variable_precision<Backend>\n   {};\n#ifdef BOOST_HAS_INT128\n   template <class Backend>\n   struct is_convertible_arithmetic<int128_type, complex_adaptor<Backend> > : is_convertible_arithmetic<int128_type, Backend>\n   {};\n   template <class Backend>\n   struct is_convertible_arithmetic<uint128_type, complex_adaptor<Backend> > : is_convertible_arithmetic<uint128_type, Backend>\n   {};\n#endif\n#ifdef BOOST_HAS_FLOAT128\n   template <class Backend>\n   struct is_convertible_arithmetic<float128_type, complex_adaptor<Backend> > : is_convertible_arithmetic<float128_type, Backend>\n   {};\n#endif\n   } // namespace detail\n\n\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\nstruct complex_result_from_scalar<number<backends::debug_adaptor<Backend>, ExpressionTemplates> >\n{\n   using type = number<backends::debug_adaptor<complex_adaptor<Backend> >, ExpressionTemplates>;\n};\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\nstruct complex_result_from_scalar<number<backends::logged_adaptor<Backend>, ExpressionTemplates> >\n{\n   using type = number<backends::logged_adaptor<complex_adaptor<Backend> >, ExpressionTemplates>;\n};\n\n}\n\n} // namespace boost::multiprecision\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/concepts/mp_number_archetypes.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_MP_NUMBER_ARCHETYPES_HPP\n#define BOOST_MP_MP_NUMBER_ARCHETYPES_HPP\n\n#include <cmath>\n#include <cstdint>\n#include <cstdlib>\n#include <iostream>\n#include <sstream>\n#include <iomanip>\n#include <tuple>\n#include <functional>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/number.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n#include <boost/multiprecision/detail/fpclassify.hpp>\n\nnamespace boost {\nnamespace multiprecision {\nnamespace concepts {\n\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4244)\n#endif\n\nstruct number_backend_float_architype\n{\n   using signed_types = std::tuple<long long> ;\n   using unsigned_types = std::tuple<unsigned long long>;\n   using float_types = std::tuple<long double>;\n   using exponent_type = int;\n\n   number_backend_float_architype()\n   {\n      m_value = 0;\n      std::cout << \"Default construct\" << std::endl;\n   }\n   number_backend_float_architype(const number_backend_float_architype& o)\n   {\n      std::cout << \"Copy construct\" << std::endl;\n      m_value = o.m_value;\n   }\n   number_backend_float_architype& operator=(const number_backend_float_architype& o)\n   {\n      m_value = o.m_value;\n      std::cout << \"Assignment (\" << m_value << \")\" << std::endl;\n      return *this;\n   }\n   number_backend_float_architype& operator=(unsigned long long i)\n   {\n      m_value = i;\n      std::cout << \"UInt Assignment (\" << i << \")\" << std::endl;\n      return *this;\n   }\n   number_backend_float_architype& operator=(long long i)\n   {\n      m_value = i;\n      std::cout << \"Int Assignment (\" << i << \")\" << std::endl;\n      return *this;\n   }\n   number_backend_float_architype& operator=(long double d)\n   {\n      m_value = d;\n      std::cout << \"long double Assignment (\" << d << \")\" << std::endl;\n      return *this;\n   }\n   number_backend_float_architype& operator=(const char* s)\n   {\n#ifndef BOOST_NO_EXCEPTIONS\n      try\n      {\n#endif\n         #ifndef BOOST_MP_STANDALONE\n         m_value = boost::lexical_cast<long double>(s);\n         #else\n         m_value = std::strtold(s, nullptr);\n\n         if(m_value == HUGE_VALL || m_value == 0)\n         {\n            BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Value can not be assigned in standalone mode. Please disable and try again.\"));\n         }\n         #endif\n#ifndef BOOST_NO_EXCEPTIONS\n      }\n      catch (const std::exception&)\n      {\n         BOOST_MP_THROW_EXCEPTION(std::runtime_error(std::string(\"Unable to parse input string: \\\"\") + s + std::string(\"\\\" as a valid floating point number.\")));\n      }\n#endif\n      std::cout << \"const char* Assignment (\" << s << \")\" << std::endl;\n      return *this;\n   }\n   void swap(number_backend_float_architype& o)\n   {\n      std::cout << \"Swapping (\" << m_value << \" with \" << o.m_value << \")\" << std::endl;\n      std::swap(m_value, o.m_value);\n   }\n   std::string str(std::streamsize digits, std::ios_base::fmtflags f) const\n   {\n      std::stringstream ss;\n      ss.flags(f);\n      if (digits)\n         ss.precision(digits);\n      else\n         ss.precision(std::numeric_limits<long double>::digits10 + 3);\n      std::intmax_t  i = m_value;\n      std::uintmax_t u = m_value;\n      if (!(f & std::ios_base::scientific) && m_value == i)\n         ss << i;\n      else if (!(f & std::ios_base::scientific) && m_value == u)\n         ss << u;\n      else\n         ss << m_value;\n      std::string s = ss.str();\n      std::cout << \"Converting to string (\" << s << \")\" << std::endl;\n      return s;\n   }\n   void negate()\n   {\n      std::cout << \"Negating (\" << m_value << \")\" << std::endl;\n      m_value = -m_value;\n   }\n   int compare(const number_backend_float_architype& o) const\n   {\n      std::cout << \"Comparison\" << std::endl;\n      return m_value > o.m_value ? 1 : (m_value < o.m_value ? -1 : 0);\n   }\n   int compare(long long i) const\n   {\n      std::cout << \"Comparison with int\" << std::endl;\n      return m_value > i ? 1 : (m_value < i ? -1 : 0);\n   }\n   int compare(unsigned long long i) const\n   {\n      std::cout << \"Comparison with unsigned\" << std::endl;\n      return m_value > i ? 1 : (m_value < i ? -1 : 0);\n   }\n   int compare(long double d) const\n   {\n      std::cout << \"Comparison with long double\" << std::endl;\n      return m_value > d ? 1 : (m_value < d ? -1 : 0);\n   }\n   long double m_value;\n};\n\ninline void eval_add(number_backend_float_architype& result, const number_backend_float_architype& o)\n{\n   std::cout << \"Addition (\" << result.m_value << \" += \" << o.m_value << \")\" << std::endl;\n   result.m_value += o.m_value;\n}\ninline void eval_subtract(number_backend_float_architype& result, const number_backend_float_architype& o)\n{\n   std::cout << \"Subtraction (\" << result.m_value << \" -= \" << o.m_value << \")\" << std::endl;\n   result.m_value -= o.m_value;\n}\ninline void eval_multiply(number_backend_float_architype& result, const number_backend_float_architype& o)\n{\n   std::cout << \"Multiplication (\" << result.m_value << \" *= \" << o.m_value << \")\" << std::endl;\n   result.m_value *= o.m_value;\n}\ninline void eval_divide(number_backend_float_architype& result, const number_backend_float_architype& o)\n{\n   std::cout << \"Division (\" << result.m_value << \" /= \" << o.m_value << \")\" << std::endl;\n   result.m_value /= o.m_value;\n}\n\ninline void eval_convert_to(unsigned long long* result, const number_backend_float_architype& val)\n{\n   *result = static_cast<unsigned long long>(val.m_value);\n}\ninline void eval_convert_to(long long* result, const number_backend_float_architype& val)\n{\n   *result = static_cast<long long>(val.m_value);\n}\ninline void eval_convert_to(long double* result, number_backend_float_architype& val)\n{\n   *result = val.m_value;\n}\n\ninline void eval_frexp(number_backend_float_architype& result, const number_backend_float_architype& arg, int* exp)\n{\n   result = std::frexp(arg.m_value, exp);\n}\n\ninline void eval_ldexp(number_backend_float_architype& result, const number_backend_float_architype& arg, int exp)\n{\n   result = std::ldexp(arg.m_value, exp);\n}\n\ninline void eval_floor(number_backend_float_architype& result, const number_backend_float_architype& arg)\n{\n   result = std::floor(arg.m_value);\n}\n\ninline void eval_ceil(number_backend_float_architype& result, const number_backend_float_architype& arg)\n{\n   result = std::ceil(arg.m_value);\n}\n\ninline void eval_sqrt(number_backend_float_architype& result, const number_backend_float_architype& arg)\n{\n   result = std::sqrt(arg.m_value);\n}\n\ninline int eval_fpclassify(const number_backend_float_architype& arg)\n{\n   return BOOST_MP_FPCLASSIFY(arg.m_value);\n}\n\ninline std::size_t hash_value(const number_backend_float_architype& v)\n{\n   std::hash<long double> hasher;\n   return hasher(v.m_value);\n}\n\nusing mp_number_float_architype = boost::multiprecision::number<number_backend_float_architype>;\n\n} // namespace concepts\n\ntemplate <>\nstruct number_category<concepts::number_backend_float_architype> : public std::integral_constant<int, number_kind_floating_point>\n{};\n\n}} // namespace boost::multiprecision\n\nnamespace std {\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nclass numeric_limits<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype, ExpressionTemplates> > : public std::numeric_limits<long double>\n{\n   using base_type = std::numeric_limits<long double>                                                                                   ;\n   using number_type = boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype, ExpressionTemplates>;\n\n public:\n   static number_type(min)() noexcept { return (base_type::min)(); }\n   static number_type(max)() noexcept { return (base_type::max)(); }\n   static number_type lowest() noexcept { return -(max)(); }\n   static number_type epsilon() noexcept { return base_type::epsilon(); }\n   static number_type round_error() noexcept { return base_type::round_error(); }\n   static number_type infinity() noexcept { return base_type::infinity(); }\n   static number_type quiet_NaN() noexcept { return base_type::quiet_NaN(); }\n   static number_type signaling_NaN() noexcept { return base_type::signaling_NaN(); }\n   static number_type denorm_min() noexcept { return base_type::denorm_min(); }\n};\n\n} // namespace std\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_bin_float/io.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2013 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_CPP_BIN_FLOAT_IO_HPP\n#define BOOST_MP_CPP_BIN_FLOAT_IO_HPP\n\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n\nnamespace boost { namespace multiprecision {\nnamespace cpp_bf_io_detail {\n\n//\n// Multiplies a by b and shifts the result so it fits inside max_bits bits,\n// returns by how much the result was shifted.\n//\ntemplate <class I>\ninline I restricted_multiply(cpp_int& result, const cpp_int& a, const cpp_int& b, I max_bits, std::int64_t& error)\n{\n   using local_integral_type = I;\n\n   result   = a * b;\n   local_integral_type gb     = static_cast<local_integral_type>(msb(result));\n   local_integral_type rshift = 0;\n   if (gb > max_bits)\n   {\n      rshift = gb - max_bits;\n      local_integral_type lb      = static_cast<local_integral_type>(lsb(result));\n      int roundup = 0;\n      // The error rate increases by the error of both a and b,\n      // this may be overly pessimistic in many case as we're assuming\n      // that a and b have the same level of uncertainty...\n      if (lb < rshift)\n         error = error ? error * 2 : 1;\n      if (rshift)\n      {\n         BOOST_MP_ASSERT(rshift < INT_MAX);\n         if (bit_test(result, static_cast<unsigned>(rshift - 1)))\n         {\n            if (lb == rshift - 1)\n               roundup = 1;\n            else\n               roundup = 2;\n         }\n         result >>= rshift;\n      }\n      if ((roundup == 2) || ((roundup == 1) && (result.backend().limbs()[0] & 1)))\n         ++result;\n   }\n   return rshift;\n}\n//\n// Computes a^e shifted to the right so it fits in max_bits, returns how far\n// to the right we are shifted.\n//\ntemplate <class I>\ninline I restricted_pow(cpp_int& result, const cpp_int& a, I e, I max_bits, std::int64_t& error)\n{\n   BOOST_MP_ASSERT(&result != &a);\n   I exp = 0;\n   if (e == 1)\n   {\n      result = a;\n      return exp;\n   }\n   else if (e == 2)\n   {\n      return restricted_multiply(result, a, a, max_bits, error);\n   }\n   else if (e == 3)\n   {\n      exp = restricted_multiply(result, a, a, max_bits, error);\n      exp += restricted_multiply(result, result, a, max_bits, error);\n      return exp;\n   }\n   I p = e / 2;\n   exp = restricted_pow(result, a, p, max_bits, error);\n   exp *= 2;\n   exp += restricted_multiply(result, result, result, max_bits, error);\n   if (e & 1)\n      exp += restricted_multiply(result, result, a, max_bits, error);\n   return exp;\n}\n\ninline int get_round_mode(const cpp_int& what, std::int64_t location, std::int64_t error)\n{\n   //\n   // Can we round what at /location/, if the error in what is /error/ in\n   // units of 0.5ulp.  Return:\n   //\n   // -1: Can't round.\n   //  0: leave as is.\n   //  1: tie.\n   //  2: round up.\n   //\n   BOOST_MP_ASSERT(location >= 0);\n   BOOST_MP_ASSERT(location < INT_MAX);\n   std::int64_t error_radius = error & 1 ? (1 + error) / 2 : error / 2;\n   if (error_radius && (static_cast<int>(msb(error_radius)) >= location))\n      return -1;\n   if (bit_test(what, static_cast<unsigned>(location)))\n   {\n      if (static_cast<int>(lsb(what)) == location)\n         return error ? -1 : 1; // Either a tie or can't round depending on whether we have any error\n      if (!error)\n         return 2; // no error, round up.\n      cpp_int t = what - error_radius;\n      if (static_cast<int>(lsb(t)) >= location)\n         return -1;\n      return 2;\n   }\n   else if (error)\n   {\n      cpp_int t = what + error_radius;\n      return bit_test(t, static_cast<unsigned>(location)) ? -1 : 0;\n   }\n   return 0;\n}\n\ninline int get_round_mode(cpp_int& r, cpp_int& d, std::int64_t error, const cpp_int& q)\n{\n   //\n   // Lets suppose we have an inexact division by d+delta, where the true\n   // value for the divisor is d, and with |delta| <= error/2, then\n   // we have calculated q and r such that:\n   //\n   // n                  r\n   // ---       = q + -----------\n   // d + error        d + error\n   //\n   // Rearranging for n / d we get:\n   //\n   //    n         delta*q + r\n   //   --- = q + -------------\n   //    d              d\n   //\n   // So rounding depends on whether 2r + error * q > d.\n   //\n   // We return:\n   //  0 = down down.\n   //  1 = tie.\n   //  2 = round up.\n   // -1 = couldn't decide.\n   //\n   r <<= 1;\n   int c = r.compare(d);\n   if (c == 0)\n      return error ? -1 : 1;\n   if (c > 0)\n   {\n      if (error)\n      {\n         r -= error * q;\n         return r.compare(d) > 0 ? 2 : -1;\n      }\n      return 2;\n   }\n   if (error)\n   {\n      r += error * q;\n      return r.compare(d) < 0 ? 0 : -1;\n   }\n   return 0;\n}\n\n} // namespace cpp_bf_io_detail\n\nnamespace backends {\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\ncpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::operator=(const char* s)\n{\n             cpp_int       n;\n             std::intmax_t decimal_exp     = 0;\n             std::intmax_t digits_seen     = 0;\n   constexpr std::intmax_t max_digits_seen = 4 + (cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count * 301L) / 1000;\n             bool          ss              = false;\n   //\n   // Extract the sign:\n   //\n   if (*s == '-')\n   {\n      ss = true;\n      ++s;\n   }\n   else if (*s == '+')\n      ++s;\n   //\n   // Special cases first:\n   //\n   if ((std::strcmp(s, \"nan\") == 0) || (std::strcmp(s, \"NaN\") == 0) || (std::strcmp(s, \"NAN\") == 0))\n   {\n      return *this = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();\n   }\n   if ((std::strcmp(s, \"inf\") == 0) || (std::strcmp(s, \"Inf\") == 0) || (std::strcmp(s, \"INF\") == 0) || (std::strcmp(s, \"infinity\") == 0) || (std::strcmp(s, \"Infinity\") == 0) || (std::strcmp(s, \"INFINITY\") == 0))\n   {\n      *this = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::infinity().backend();\n      if (ss)\n         negate();\n      return *this;\n   }\n   //\n   // Digits before the point:\n   //\n   while (*s && (*s >= '0') && (*s <= '9'))\n   {\n      n *= 10u;\n      n += *s - '0';\n      if (digits_seen || (*s != '0'))\n         ++digits_seen;\n      ++s;\n   }\n   // The decimal point (we really should localise this!!)\n   if (*s && (*s == '.'))\n      ++s;\n   //\n   // Digits after the point:\n   //\n   while (*s && (*s >= '0') && (*s <= '9'))\n   {\n      n *= 10u;\n      n += *s - '0';\n      --decimal_exp;\n      if (digits_seen || (*s != '0'))\n         ++digits_seen;\n      ++s;\n      if (digits_seen > max_digits_seen)\n         break;\n   }\n   //\n   // Digits we're skipping:\n   //\n   while (*s && (*s >= '0') && (*s <= '9'))\n      ++s;\n   //\n   // See if there's an exponent:\n   //\n   if (*s && ((*s == 'e') || (*s == 'E')))\n   {\n      ++s;\n      std::intmax_t e  = 0;\n      bool            es = false;\n      if (*s && (*s == '-'))\n      {\n         es = true;\n         ++s;\n      }\n      else if (*s && (*s == '+'))\n         ++s;\n      while (*s && (*s >= '0') && (*s <= '9'))\n      {\n         e *= 10u;\n         e += *s - '0';\n         ++s;\n      }\n      if (es)\n         e = -e;\n      decimal_exp += e;\n   }\n   if (*s)\n   {\n      //\n      // Oops unexpected input at the end of the number:\n      //\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Unable to parse string as a valid floating point number.\"));\n   }\n   if (n == 0)\n   {\n      // Result is necessarily zero:\n      *this = static_cast<limb_type>(0u);\n      return *this;\n   }\n\n   constexpr std::size_t limb_bits = sizeof(limb_type) * CHAR_BIT;\n   //\n   // Set our working precision - this is heuristic based, we want\n   // a value as small as possible > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count to avoid large computations\n   // and excessive memory usage, but we also want to avoid having to\n   // up the computation and start again at a higher precision.\n   // So we round cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count up to the nearest whole number of limbs, and add\n   // one limb for good measure.  This works very well for small exponents,\n   // but for larger exponents we may may need to restart, we could add some\n   // extra precision right from the start for larger exponents, but this\n   // seems to be slightly slower in the *average* case:\n   //\n#ifdef BOOST_MP_STRESS_IO\n   std::intmax_t max_bits = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + 32;\n#else\n   std::intmax_t max_bits = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + ((cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count % limb_bits) ? (limb_bits - cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count % limb_bits) : 0) + limb_bits;\n#endif\n   std::int64_t  error          = 0;\n   std::intmax_t calc_exp       = 0;\n   std::intmax_t final_exponent = 0;\n\n   if (decimal_exp >= 0)\n   {\n      // Nice and simple, the result is an integer...\n      do\n      {\n         cpp_int t;\n         if (decimal_exp)\n         {\n            calc_exp = boost::multiprecision::cpp_bf_io_detail::restricted_pow(t, cpp_int(5), decimal_exp, max_bits, error);\n            calc_exp += boost::multiprecision::cpp_bf_io_detail::restricted_multiply(t, t, n, max_bits, error);\n         }\n         else\n            t = n;\n         final_exponent = (std::int64_t)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1 + decimal_exp + calc_exp;\n         std::ptrdiff_t rshift     = static_cast<std::ptrdiff_t>(static_cast<std::ptrdiff_t>(msb(t)) - static_cast<std::ptrdiff_t>(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count) + 1);\n         if (rshift > 0)\n         {\n            final_exponent += rshift;\n            int roundup = boost::multiprecision::cpp_bf_io_detail::get_round_mode(t, rshift - 1, error);\n            t >>= rshift;\n            if ((roundup == 2) || ((roundup == 1) && t.backend().limbs()[0] & 1))\n               ++t;\n            else if (roundup < 0)\n            {\n#ifdef BOOST_MP_STRESS_IO\n               max_bits += 32;\n#else\n               max_bits *= 2;\n#endif\n               error = 0;\n               continue;\n            }\n         }\n         else\n         {\n            BOOST_MP_ASSERT(!error);\n         }\n         if (final_exponent > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent)\n         {\n            exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent;\n            final_exponent -= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent;\n         }\n         else if (final_exponent < cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent)\n         {\n            // Underflow:\n            exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent;\n            final_exponent -= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent;\n         }\n         else\n         {\n            exponent()     = static_cast<Exponent>(final_exponent);\n            final_exponent = 0;\n         }\n         copy_and_round(*this, t.backend());\n         break;\n      } while (true);\n\n      if (ss != sign())\n         negate();\n   }\n   else\n   {\n      // Result is the ratio of two integers: we need to organise the\n      // division so as to produce at least an N-bit result which we can\n      // round according to the remainder.\n      //cpp_int d = pow(cpp_int(5), -decimal_exp);\n      do\n      {\n         cpp_int d;\n         calc_exp                   = boost::multiprecision::cpp_bf_io_detail::restricted_pow(d, cpp_int(5), -decimal_exp, max_bits, error);\n         const std::ptrdiff_t shift = static_cast<std::ptrdiff_t>(static_cast<std::ptrdiff_t>(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count) - static_cast<std::ptrdiff_t>(msb(n)) + static_cast<std::ptrdiff_t>(msb(d)));\n         final_exponent             = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1 + decimal_exp - calc_exp;\n         if (shift > 0)\n         {\n            n <<= shift;\n            final_exponent -= static_cast<Exponent>(shift);\n         }\n         cpp_int q, r;\n         divide_qr(n, d, q, r);\n         std::ptrdiff_t gb = static_cast<std::ptrdiff_t>(msb(q));\n         BOOST_MP_ASSERT((gb >= static_cast<int>(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count) - 1));\n         //\n         // Check for rounding conditions we have to\n         // handle ourselves:\n         //\n         int roundup = 0;\n         if (gb == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1)\n         {\n            // Exactly the right number of bits, use the remainder to round:\n            roundup = boost::multiprecision::cpp_bf_io_detail::get_round_mode(r, d, error, q);\n         }\n         else if (bit_test(q, static_cast<std::size_t>(gb - static_cast<std::ptrdiff_t>(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count))) && (static_cast<std::ptrdiff_t>(lsb(q)) == static_cast<std::ptrdiff_t>(gb - static_cast<std::ptrdiff_t>(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count))))\n         {\n            // Too many bits in q and the bits in q indicate a tie, but we can break that using r,\n            // note that the radius of error in r is error/2 * q:\n            std::ptrdiff_t lshift = gb - static_cast<int>(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count) + 1;\n            q >>= lshift;\n            final_exponent += static_cast<Exponent>(lshift);\n            BOOST_MP_ASSERT((msb(q) >= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1));\n            if (error && (r < (error / 2) * q))\n               roundup = -1;\n            else if (error && (r + (error / 2) * q >= d))\n               roundup = -1;\n            else\n               roundup = r ? 2 : 1;\n         }\n         else if (error && (((error / 2) * q + r >= d) || (r < (error / 2) * q)))\n         {\n            // We might have been rounding up, or got the wrong quotient: can't tell!\n            roundup = -1;\n         }\n         if (roundup < 0)\n         {\n#ifdef BOOST_MP_STRESS_IO\n            max_bits += 32;\n#else\n            max_bits *= 2;\n#endif\n            error = 0;\n            if (shift > 0)\n            {\n               n >>= shift;\n               final_exponent += static_cast<Exponent>(shift);\n            }\n            continue;\n         }\n         else if ((roundup == 2) || ((roundup == 1) && q.backend().limbs()[0] & 1))\n            ++q;\n         if (final_exponent > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent)\n         {\n            // Overflow:\n            exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent;\n            final_exponent -= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent;\n         }\n         else if (final_exponent < cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent)\n         {\n            // Underflow:\n            exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent;\n            final_exponent -= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent;\n         }\n         else\n         {\n            exponent()     = static_cast<Exponent>(final_exponent);\n            final_exponent = 0;\n         }\n         copy_and_round(*this, q.backend());\n         if (ss != sign())\n            negate();\n         break;\n      } while (true);\n   }\n   //\n   // Check for scaling and/or over/under-flow:\n   //\n   final_exponent += exponent();\n   if (final_exponent > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent)\n   {\n      // Overflow:\n      exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity;\n      bits()     = limb_type(0);\n   }\n   else if (final_exponent < cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent)\n   {\n      // Underflow:\n      exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero;\n      bits()     = limb_type(0);\n      sign()     = 0;\n   }\n   else\n   {\n      exponent() = static_cast<Exponent>(final_exponent);\n   }\n   return *this;\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\nstd::string cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::str(std::streamsize dig, std::ios_base::fmtflags f) const\n{\n   bool scientific = (f & std::ios_base::scientific) == std::ios_base::scientific;\n   bool fixed      = !scientific && (f & std::ios_base::fixed);\n\n   if (dig == 0 && !fixed)\n      dig = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::max_digits10;\n\n   std::string s;\n\n   if (exponent() <= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent)\n   {\n      // How far to left-shift in order to demormalise the mantissa:\n      std::intmax_t shift         = (std::intmax_t)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - (std::intmax_t)exponent() - 1;\n      std::intmax_t digits_wanted = static_cast<int>(dig);\n      std::intmax_t base10_exp    = exponent() >= 0 ? static_cast<std::intmax_t>(std::floor(0.30103 * exponent())) : static_cast<std::intmax_t>(std::ceil(0.30103 * exponent()));\n      //\n      // For fixed formatting we want /dig/ digits after the decimal point,\n      // so if the exponent is zero, allowing for the one digit before the\n      // decimal point, we want 1 + dig digits etc.\n      //\n      if (fixed)\n         digits_wanted += 1 + base10_exp;\n      if (scientific)\n         digits_wanted += 1;\n      if (digits_wanted < -1)\n      {\n         // Fixed precision, no significant digits, and nothing to round!\n         s = \"0\";\n         if (sign())\n            s.insert(static_cast<std::string::size_type>(0), 1, '-');\n         boost::multiprecision::detail::format_float_string(s, base10_exp, dig, f, true);\n         return s;\n      }\n      //\n      // power10 is the base10 exponent we need to multiply/divide by in order\n      // to convert our denormalised number to an integer with the right number of digits:\n      //\n      std::intmax_t power10 = digits_wanted - base10_exp - 1;\n      //\n      // If we calculate 5^power10 rather than 10^power10 we need to move\n      // 2^power10 into /shift/\n      //\n      shift -= power10;\n      cpp_int               i;\n      int                   roundup   = 0; // 0=no rounding, 1=tie, 2=up\n      constexpr std::size_t limb_bits = sizeof(limb_type) * CHAR_BIT;\n      //\n      // Set our working precision - this is heuristic based, we want\n      // a value as small as possible > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count to avoid large computations\n      // and excessive memory usage, but we also want to avoid having to\n      // up the computation and start again at a higher precision.\n      // So we round cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count up to the nearest whole number of limbs, and add\n      // one limb for good measure.  This works very well for small exponents,\n      // but for larger exponents we add a few extra limbs to max_bits:\n      //\n#ifdef BOOST_MP_STRESS_IO\n      std::intmax_t max_bits = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + 32;\n#else\n      std::intmax_t max_bits = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + ((cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count % limb_bits) ? (limb_bits - cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count % limb_bits) : 0) + limb_bits;\n      if (power10)\n      {\n         const std::uintmax_t abs_power10 = static_cast<std::uintmax_t>(boost::multiprecision::detail::abs(power10));\n         const std::intmax_t  msb_div8    = static_cast<std::intmax_t>(msb(abs_power10) / 8u);\n\n         max_bits += (msb_div8 * static_cast<std::intmax_t>(limb_bits));\n      }\n#endif\n      do\n      {\n         std::int64_t  error    = 0;\n         std::intmax_t calc_exp = 0;\n         //\n         // Our integer result is: bits() * 2^-shift * 5^power10\n         //\n         i = bits();\n         if (shift < 0)\n         {\n            if (power10 >= 0)\n            {\n               // We go straight to the answer with all integer arithmetic,\n               // the result is always exact and never needs rounding:\n               BOOST_MP_ASSERT(power10 <= (std::intmax_t)INT_MAX);\n               i <<= -shift;\n               if (power10)\n                  i *= pow(cpp_int(5), static_cast<unsigned>(power10));\n            }\n            else if (power10 < 0)\n            {\n               cpp_int d;\n               calc_exp = boost::multiprecision::cpp_bf_io_detail::restricted_pow(d, cpp_int(5), -power10, max_bits, error);\n               shift += calc_exp;\n               BOOST_MP_ASSERT(shift < 0); // Must still be true!\n               i <<= -shift;\n               cpp_int r;\n               divide_qr(i, d, i, r);\n               roundup = boost::multiprecision::cpp_bf_io_detail::get_round_mode(r, d, error, i);\n               if (roundup < 0)\n               {\n#ifdef BOOST_MP_STRESS_IO\n                  max_bits += 32;\n#else\n                  max_bits *= 2;\n#endif\n                  shift = (std::intmax_t)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - exponent() - 1 - power10;\n                  continue;\n               }\n            }\n         }\n         else\n         {\n            //\n            // Our integer is bits() * 2^-shift * 10^power10\n            //\n            if (power10 > 0)\n            {\n               if (power10)\n               {\n                  cpp_int t;\n                  calc_exp = boost::multiprecision::cpp_bf_io_detail::restricted_pow(t, cpp_int(5), power10, max_bits, error);\n                  calc_exp += boost::multiprecision::cpp_bf_io_detail::restricted_multiply(i, i, t, max_bits, error);\n                  shift -= calc_exp;\n               }\n               if ((shift < 0) || ((shift == 0) && error))\n               {\n                  // We only get here if we were asked for a crazy number of decimal digits -\n                  // more than are present in a 2^max_bits number.\n#ifdef BOOST_MP_STRESS_IO\n                  max_bits += 32;\n#else\n                  max_bits *= 2;\n#endif\n                  shift = (std::intmax_t)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - exponent() - 1 - power10;\n                  continue;\n               }\n               if (shift)\n               {\n                  roundup = boost::multiprecision::cpp_bf_io_detail::get_round_mode(i, shift - 1, error);\n                  if (roundup < 0)\n                  {\n#ifdef BOOST_MP_STRESS_IO\n                     max_bits += 32;\n#else\n                     max_bits *= 2;\n#endif\n                     shift = (std::intmax_t)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - exponent() - 1 - power10;\n                     continue;\n                  }\n                  i >>= shift;\n               }\n            }\n            else\n            {\n               // We're right shifting, *and* dividing by 5^-power10,\n               // so 5^-power10 can never be that large or we'd simply\n               // get zero as a result, and that case is already handled above:\n               cpp_int r;\n               BOOST_MP_ASSERT(-power10 < INT_MAX);\n               cpp_int d = pow(cpp_int(5), static_cast<unsigned>(-power10));\n               d <<= shift;\n               divide_qr(i, d, i, r);\n               r <<= 1;\n               int c   = r.compare(d);\n               roundup = c < 0 ? 0 : c == 0 ? 1 : 2;\n            }\n         }\n         s = i.str(0, std::ios_base::fmtflags(0));\n         //\n         // Check if we got the right number of digits, this\n         // is really a test of whether we calculated the\n         // decimal exponent correctly:\n         //\n         std::intmax_t digits_got = i ? static_cast<std::intmax_t>(s.size()) : 0;\n         if (digits_got != digits_wanted)\n         {\n            base10_exp += digits_got - digits_wanted;\n            if (fixed)\n               digits_wanted = digits_got; // strange but true.\n            power10 = digits_wanted - base10_exp - 1;\n            shift   = (std::intmax_t)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - exponent() - 1 - power10;\n            if (fixed)\n               break;\n            roundup = 0;\n         }\n         else\n            break;\n      } while (true);\n      //\n      // Check whether we need to round up: note that we could equally round up\n      // the integer /i/ above, but since we need to perform the rounding *after*\n      // the conversion to a string and the digit count check, we might as well\n      // do it here:\n      //\n      if ((roundup == 2) || ((roundup == 1) && ((s[s.size() - 1] - '0') & 1)))\n      {\n         boost::multiprecision::detail::round_string_up_at(s, static_cast<int>(s.size() - 1), base10_exp);\n      }\n\n      if (sign())\n         s.insert(static_cast<std::string::size_type>(0), 1, '-');\n\n      boost::multiprecision::detail::format_float_string(s, base10_exp, dig, f, false);\n   }\n   else\n   {\n      switch (exponent())\n      {\n      case exponent_zero:\n         s = sign() ? \"-0\" : f & std::ios_base::showpos ? \"+0\" : \"0\";\n         boost::multiprecision::detail::format_float_string(s, 0, dig, f, true);\n         break;\n      case exponent_nan:\n         s = \"nan\";\n         break;\n      case exponent_infinity:\n         s = sign() ? \"-inf\" : f & std::ios_base::showpos ? \"+inf\" : \"inf\";\n         break;\n      }\n   }\n   return s;\n}\n\n} // namespace backends\n}} // namespace boost::multiprecision\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_bin_float/transcendental.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2013 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_CPP_BIN_FLOAT_TRANSCENDENTAL_HPP\n#define BOOST_MP_CPP_BIN_FLOAT_TRANSCENDENTAL_HPP\n\n#include <boost/multiprecision/detail/assert.hpp>\n\nnamespace boost { namespace multiprecision { namespace backends {\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\nvoid eval_exp_taylor(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg)\n{\n   constexpr std::ptrdiff_t bits = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count;\n   //\n   // Taylor series for small argument, note returns exp(x) - 1:\n   //\n   res = limb_type(0);\n   cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> num(arg), denom, t;\n   denom = limb_type(1);\n   eval_add(res, num);\n\n   for (std::size_t k = 2;; ++k)\n   {\n      eval_multiply(denom, k);\n      eval_multiply(num, arg);\n      eval_divide(t, num, denom);\n      eval_add(res, t);\n      if (eval_is_zero(t) || (res.exponent() - bits > t.exponent()))\n         break;\n   }\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\nvoid eval_exp(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg)\n{\n   //\n   // This is based on MPFR's method, let:\n   //\n   // n = floor(x / ln(2))\n   //\n   // Then:\n   //\n   // r = x - n ln(2) : 0 <= r < ln(2)\n   //\n   // We can reduce r further by dividing by 2^k, with k ~ sqrt(n),\n   // so if:\n   //\n   // e0 = exp(r / 2^k) - 1\n   //\n   // With e0 evaluated by taylor series for small arguments, then:\n   //\n   // exp(x) = 2^n (1 + e0)^2^k\n   //\n   // Note that to preserve precision we actually square (1 + e0) k times, calculating\n   // the result less one each time, i.e.\n   //\n   // (1 + e0)^2 - 1 = e0^2 + 2e0\n   //\n   // Then add the final 1 at the end, given that e0 is small, this effectively wipes\n   // out the error in the last step.\n   //\n   using default_ops::eval_add;\n   using default_ops::eval_convert_to;\n   using default_ops::eval_increment;\n   using default_ops::eval_multiply;\n   using default_ops::eval_subtract;\n\n   int  type  = eval_fpclassify(arg);\n   bool isneg = eval_get_sign(arg) < 0;\n   if (type == static_cast<int>(FP_NAN))\n   {\n      res   = arg;\n      errno = EDOM;\n      return;\n   }\n   else if (type == static_cast<int>(FP_INFINITE))\n   {\n      res = arg;\n      if (isneg)\n         res = limb_type(0u);\n      else\n         res = arg;\n      return;\n   }\n   else if (type == static_cast<int>(FP_ZERO))\n   {\n      res = limb_type(1);\n      return;\n   }\n   cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> t, n;\n   if (isneg)\n   {\n      t = arg;\n      t.negate();\n      eval_exp(res, t);\n      t.swap(res);\n      res = limb_type(1);\n      eval_divide(res, t);\n      return;\n   }\n\n   eval_divide(n, arg, default_ops::get_constant_ln2<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> >());\n   eval_floor(n, n);\n   eval_multiply(t, n, default_ops::get_constant_ln2<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> >());\n   eval_subtract(t, arg);\n   t.negate();\n   if (t.compare(default_ops::get_constant_ln2<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> >()) > 0)\n   {\n      // There are some rare cases where the multiply rounds down leaving a remainder > ln2\n      // See https://github.com/boostorg/multiprecision/issues/120\n      eval_increment(n);\n      t = limb_type(0);\n   }\n   if (eval_get_sign(t) < 0)\n   {\n      // There are some very rare cases where arg/ln2 is an integer, and the subsequent multiply\n      // rounds up, in that situation t ends up negative at this point which breaks our invariants below:\n      t = limb_type(0);\n   }\n\n   Exponent k, nn;\n   eval_convert_to(&nn, n);\n\n   if (nn == (std::numeric_limits<Exponent>::max)())\n   {\n      // The result will necessarily oveflow:\n      res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::infinity().backend();\n      return;\n   }\n\n   BOOST_MP_ASSERT(t.compare(default_ops::get_constant_ln2<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> >()) < 0);\n\n   k = nn ? Exponent(1) << (msb(nn) / 2) : 0;\n   k = (std::min)(k, (Exponent)(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count / 4));\n   eval_ldexp(t, t, -k);\n\n   eval_exp_taylor(res, t);\n   //\n   // Square 1 + res k times:\n   //\n   for (Exponent s = 0; s < k; ++s)\n   {\n      t.swap(res);\n      eval_multiply(res, t, t);\n      eval_ldexp(t, t, 1);\n      eval_add(res, t);\n   }\n   eval_add(res, limb_type(1));\n   eval_ldexp(res, res, nn);\n}\n\n}}} // namespace boost::multiprecision::backends\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_bin_float.hpp",
    "content": "////////////////////////////////////////////////////////////////\n//  Copyright 2013 - 2022 John Maddock.\n//  Copyright 2022 Christopher Kormanyos.\n//  Distributed under the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt\n//  or copy at https://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_CPP_BIN_FLOAT_HPP\n#define BOOST_MP_CPP_BIN_FLOAT_HPP\n\n#include <cmath>\n#include <cstdint>\n#include <limits>\n#include <type_traits>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/integer.hpp>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/detail/fpclassify.hpp>\n#include <boost/multiprecision/detail/float_string_cvt.hpp>\n#include <boost/multiprecision/traits/max_digits10.hpp>\n#include <boost/multiprecision/detail/hash.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n#include <boost/multiprecision/detail/float128_functions.hpp>\n#include <boost/multiprecision/detail/functions/trunc.hpp>\n\n//\n// Some includes we need from Boost.Math, since we rely on that library to provide these functions:\n//\n#ifdef BOOST_MP_MATH_AVAILABLE\n#include <boost/math/special_functions/asinh.hpp>\n#include <boost/math/special_functions/acosh.hpp>\n#include <boost/math/special_functions/atanh.hpp>\n#include <boost/math/special_functions/cbrt.hpp>\n#include <boost/math/special_functions/expm1.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#endif\n\n#ifdef BOOST_HAS_FLOAT128\n#include <quadmath.h>\n#endif\n\nnamespace boost {\nnamespace multiprecision {\nnamespace backends {\n\nenum digit_base_type\n{\n   digit_base_2  = 2,\n   digit_base_10 = 10\n};\n\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4522 6326) // multiple assignment operators specified, comparison of two constants\n#endif\n\nnamespace detail {\n\ntemplate <class U>\ninline typename std::enable_if<boost::multiprecision::detail::is_unsigned<U>::value, bool>::type is_negative(U) { return false; }\ntemplate <class S>\ninline typename std::enable_if< !boost::multiprecision::detail::is_unsigned<S>::value, bool>::type is_negative(S s) { return s < 0; }\n\ntemplate <class Float, std::ptrdiff_t, bool = number_category<Float>::value == number_kind_floating_point>\nstruct is_cpp_bin_float_implicitly_constructible_from_type\n{\n   static constexpr bool value = false;\n};\n\ntemplate <class Float, std::ptrdiff_t bit_count>\nstruct is_cpp_bin_float_implicitly_constructible_from_type<Float, bit_count, true>\n{\n   static constexpr bool value = (std::numeric_limits<Float>::digits <= static_cast<int>(bit_count)) && (std::numeric_limits<Float>::radix == 2) && std::numeric_limits<Float>::is_specialized\n#ifdef BOOST_HAS_FLOAT128\n                             && !std::is_same<Float, float128_type>::value\n#endif\n                             && (std::is_floating_point<Float>::value || is_number<Float>::value);\n};\n\ntemplate <class Float, std::ptrdiff_t, bool = number_category<Float>::value == number_kind_floating_point>\nstruct is_cpp_bin_float_explicitly_constructible_from_type\n{\n   static constexpr bool value = false;\n};\n\ntemplate <class Float, std::ptrdiff_t bit_count>\nstruct is_cpp_bin_float_explicitly_constructible_from_type<Float, bit_count, true>\n{\n   static constexpr bool value = (std::numeric_limits<Float>::digits > static_cast<int>(bit_count)) && (std::numeric_limits<Float>::radix == 2) && std::numeric_limits<Float>::is_specialized\n#ifdef BOOST_HAS_FLOAT128\n                             && !std::is_same<Float, float128_type>::value\n#endif\n       ;\n};\n\n} // namespace detail\n\ntemplate <unsigned Digits, digit_base_type DigitBase = digit_base_10, class Allocator = void, class Exponent = int, Exponent MinExponent = 0, Exponent MaxExponent = 0>\nclass cpp_bin_float\n{\n public:\n   static constexpr unsigned bit_count = DigitBase == digit_base_2 ? Digits : (Digits * 1000uL) / 301uL + (((Digits * 1000uL) % 301) ? 2u : 1u);\n   using rep_type = cpp_int_backend<std::is_void<Allocator>::value ? bit_count : 0, bit_count, std::is_void<Allocator>::value ? unsigned_magnitude : signed_magnitude, unchecked, Allocator>;\n   using double_rep_type = cpp_int_backend<std::is_void<Allocator>::value ? 2 * bit_count : 0, 2 * bit_count, std::is_void<Allocator>::value ? unsigned_magnitude : signed_magnitude, unchecked, Allocator>;\n\n   using signed_types = typename rep_type::signed_types;\n   using unsigned_types = typename rep_type::unsigned_types;\n   using float_types = std::tuple<float, double, long double>;\n   using exponent_type = Exponent;\n\n   static constexpr exponent_type max_exponent_limit = (std::numeric_limits<exponent_type>::max)()- 2 * static_cast<exponent_type>(bit_count);\n   static constexpr exponent_type min_exponent_limit = (std::numeric_limits<exponent_type>::min)() + 2 * static_cast<exponent_type>(bit_count);\n\n   static_assert(MinExponent >= min_exponent_limit, \"Template parameter MinExponent is too negative for our internal logic to function correctly, sorry!\");\n   static_assert(MaxExponent <= max_exponent_limit, \"Template parameter MaxExponent is too large for our internal logic to function correctly, sorry!\");\n   static_assert(MinExponent <= 0, \"Template parameter MinExponent can not be positive!\");\n   static_assert(MaxExponent >= 0, \"Template parameter MaxExponent can not be negative!\");\n\n   static constexpr exponent_type max_exponent = MaxExponent == 0 ? max_exponent_limit : MaxExponent;\n   static constexpr exponent_type min_exponent = MinExponent == 0 ? min_exponent_limit : MinExponent;\n\n   static constexpr exponent_type exponent_zero     = max_exponent + 1;\n   static constexpr exponent_type exponent_infinity = max_exponent + 2;\n   static constexpr exponent_type exponent_nan      = max_exponent + 3;\n\n private:\n   rep_type      m_data;\n   exponent_type m_exponent;\n   bool          m_sign;\n\n public:\n   cpp_bin_float() noexcept(noexcept(rep_type())) : m_data(), m_exponent(exponent_zero), m_sign(false) {}\n\n   cpp_bin_float(const cpp_bin_float& o) noexcept(noexcept(rep_type(std::declval<const rep_type&>())))\n       : m_data(o.m_data), m_exponent(o.m_exponent), m_sign(o.m_sign) {}\n\n   template <unsigned D, digit_base_type B, class A, class E, E MinE, E MaxE>\n   cpp_bin_float(const cpp_bin_float<D, B, A, E, MinE, MaxE>& o, typename std::enable_if<(bit_count >= cpp_bin_float<D, B, A, E, MinE, MaxE>::bit_count)>::type const* = nullptr)\n   {\n      *this = o;\n   }\n   template <unsigned D, digit_base_type B, class A, class E, E MinE, E MaxE>\n   explicit cpp_bin_float(const cpp_bin_float<D, B, A, E, MinE, MaxE>& o, typename std::enable_if< !(bit_count >= cpp_bin_float<D, B, A, E, MinE, MaxE>::bit_count)>::type const* = nullptr)\n       : m_exponent(o.exponent()), m_sign(o.sign())\n   {\n      *this = o;\n   }\n   // rvalue copy:\n   template <unsigned D, digit_base_type B, class A, class E, E MinE, E MaxE>\n   cpp_bin_float(cpp_bin_float<D, B, A, E, MinE, MaxE>&& o, typename std::enable_if<(bit_count >= cpp_bin_float<D, B, A, E, MinE, MaxE>::bit_count)>::type const* = nullptr)noexcept(noexcept(rep_type(std::declval<rep_type&&>())))\n   {\n      *this = std::move(o);\n   }\n   template <unsigned D, digit_base_type B, class A, class E, E MinE, E MaxE>\n   explicit cpp_bin_float(cpp_bin_float<D, B, A, E, MinE, MaxE>&& o, typename std::enable_if< !(bit_count >= cpp_bin_float<D, B, A, E, MinE, MaxE>::bit_count)>::type const* = nullptr) noexcept(noexcept(rep_type(std::declval<rep_type&&>())))\n       : m_exponent(o.exponent()), m_sign(o.sign())\n   {\n      *this = std::move(o);\n   }\n   template <class Float>\n   cpp_bin_float(const Float& f,\n                 typename std::enable_if<detail::is_cpp_bin_float_implicitly_constructible_from_type<Float, static_cast<std::ptrdiff_t>(bit_count)>::value>::type const* = nullptr)\n       : m_data(), m_exponent(0), m_sign(false)\n   {\n      this->assign_float(f);\n   }\n\n   template <class Float>\n   explicit cpp_bin_float(const Float& f,\n                          typename std::enable_if<detail::is_cpp_bin_float_explicitly_constructible_from_type<Float, static_cast<std::ptrdiff_t>(bit_count)>::value>::type const* = nullptr)\n       : m_data(), m_exponent(0), m_sign(false)\n   {\n      this->assign_float(f);\n   }\n#ifdef BOOST_HAS_FLOAT128\n   template <class Float>\n   cpp_bin_float(const Float& f,\n                 typename std::enable_if<\n                     std::is_same<Float, float128_type>::value && (static_cast<int>(bit_count) >= 113)>::type const* = nullptr)\n       : m_data(), m_exponent(0), m_sign(false)\n   {\n      this->assign_float(f);\n   }\n   template <class Float>\n   explicit cpp_bin_float(const Float& f,\n                          typename std::enable_if<\n                              std::is_same<Float, float128_type>::value && (static_cast<int>(bit_count) < 113)>::type const* = nullptr)\n       : m_data(), m_exponent(0), m_sign(false)\n   {\n      this->assign_float(f);\n   }\n#endif\n   cpp_bin_float& operator=(const cpp_bin_float& o) noexcept(noexcept(std::declval<rep_type&>() = std::declval<const rep_type&>()))\n   {\n      m_data     = o.m_data;\n      m_exponent = o.m_exponent;\n      m_sign     = o.m_sign;\n      return *this;\n   }\n\n   template <class A, class E, E MinE, E MaxE>\n   cpp_bin_float& operator=(const cpp_bin_float<Digits, DigitBase, A, E, MinE, MaxE>& o) noexcept(noexcept(std::declval<rep_type&>() = std::declval<const rep_type&>()))\n   {\n      m_data     = o.bits();\n      m_sign     = o.sign();\n      if (o.exponent() == cpp_bin_float<Digits, DigitBase, A, E, MinE, MaxE>::exponent_zero)\n         m_exponent = exponent_zero;\n      else if (o.exponent() == cpp_bin_float<Digits, DigitBase, A, E, MinE, MaxE>::exponent_nan)\n         m_exponent = exponent_nan;\n      else if (o.exponent() == cpp_bin_float<Digits, DigitBase, A, E, MinE, MaxE>::exponent_infinity)\n         m_exponent = exponent_infinity;\n      else if (o.exponent() > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent)\n      {\n         // Overflow:\n         exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity;\n         bits() = static_cast<limb_type>(0u);\n      }\n      else if (o.exponent() < cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent)\n      {\n         // Underflow:\n         exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero;\n         bits() = static_cast<limb_type>(0u);\n      }\n      else\n         m_exponent = o.exponent();\n      return *this;\n   }\n   // rvalue copy:\n   template <class A, class E, E MinE, E MaxE>\n   cpp_bin_float& operator=(cpp_bin_float<Digits, DigitBase, A, E, MinE, MaxE>&& o) noexcept(noexcept(std::declval<rep_type&>() = std::declval<rep_type&&>()))\n   {\n      m_data     = std::move(o.bits());\n      m_sign     = o.sign();\n      if (o.exponent() == cpp_bin_float<Digits, DigitBase, A, E, MinE, MaxE>::exponent_zero)\n         m_exponent = exponent_zero;\n      else if (o.exponent() == cpp_bin_float<Digits, DigitBase, A, E, MinE, MaxE>::exponent_nan)\n         m_exponent = exponent_nan;\n      else if (o.exponent() == cpp_bin_float<Digits, DigitBase, A, E, MinE, MaxE>::exponent_infinity)\n         m_exponent = exponent_infinity;\n      else if (o.exponent() > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent)\n      {\n         // Overflow:\n         exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity;\n         bits() = static_cast<limb_type>(0u);\n      }\n      else if (o.exponent() < cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent)\n      {\n         // Underflow:\n         exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero;\n         bits() = static_cast<limb_type>(0u);\n      }\n      else\n         m_exponent = o.exponent();\n      return *this;\n   }\n   template <unsigned D, digit_base_type B, class A, class E, E MinE, E MaxE>\n   cpp_bin_float& operator=(const cpp_bin_float<D, B, A, E, MinE, MaxE>& f)\n   {\n      switch (eval_fpclassify(f))\n      {\n      case FP_ZERO:\n         m_data     = limb_type(0);\n         m_sign     = f.sign();\n         m_exponent = exponent_zero;\n         break;\n      case FP_NAN:\n         m_data     = limb_type(0);\n         m_sign     = false;\n         m_exponent = exponent_nan;\n         break;\n         ;\n      case FP_INFINITE:\n         m_data     = limb_type(0);\n         m_sign     = f.sign();\n         m_exponent = exponent_infinity;\n         break;\n      default:\n         typename cpp_bin_float<D, B, A, E, MinE, MaxE>::rep_type b(f.bits());\n         this->exponent() = f.exponent() + (E)bit_count - (E)cpp_bin_float<D, B, A, E, MinE, MaxE>::bit_count;\n         this->sign()     = f.sign();\n         copy_and_round(*this, b);\n      }\n      return *this;\n   }\n#ifdef BOOST_HAS_FLOAT128\n   template <class Float>\n   typename std::enable_if<\n       (number_category<Float>::value == number_kind_floating_point)\n           //&& (std::numeric_limits<Float>::digits <= static_cast<int>(bit_count))\n           && ((std::numeric_limits<Float>::radix == 2) || (std::is_same<Float, float128_type>::value)),\n       cpp_bin_float&>::type\n   operator=(const Float& f)\n#else\n   template <class Float>\n   typename std::enable_if<\n       (number_category<Float>::value == number_kind_floating_point)\n           //&& (std::numeric_limits<Float>::digits <= static_cast<int>(bit_count))\n           && (std::numeric_limits<Float>::radix == 2),\n       cpp_bin_float&>::type\n   operator=(const Float& f)\n#endif\n   {\n      return assign_float(f);\n   }\n\n#ifdef BOOST_HAS_FLOAT128\n   template <class Float>\n   typename std::enable_if<std::is_same<Float, float128_type>::value, cpp_bin_float&>::type assign_float(Float f)\n   {\n      using default_ops::eval_add;\n      using bf_int_type = typename boost::multiprecision::detail::canonical<int, cpp_bin_float>::type;\n      if (f == 0)\n      {\n         m_data     = limb_type(0);\n         m_sign     = (signbitq(f) > 0);\n         m_exponent = exponent_zero;\n         return *this;\n      }\n      else if (isnanq(f))\n      {\n         m_data     = limb_type(0);\n         m_sign     = false;\n         m_exponent = exponent_nan;\n         return *this;\n      }\n      else if (isinfq(f))\n      {\n         m_data     = limb_type(0);\n         m_sign     = (f < 0);\n         m_exponent = exponent_infinity;\n         return *this;\n      }\n      if (f < 0)\n      {\n         *this = -f;\n         this->negate();\n         return *this;\n      }\n\n      using ui_type = typename std::tuple_element<0, unsigned_types>::type;\n      m_data     = static_cast<ui_type>(0u);\n      m_sign     = false;\n      m_exponent = 0;\n\n      constexpr std::ptrdiff_t bits = sizeof(int) * CHAR_BIT - 1;\n      int              e;\n      f = frexpq(f, &e);\n      while (f)\n      {\n         f = ldexpq(f, bits);\n         e -= bits;\n         int ipart = static_cast<int>(truncq(f));\n         f -= ipart;\n         m_exponent += bits;\n         cpp_bin_float t;\n         t = static_cast<bf_int_type>(ipart);\n         eval_add(*this, t);\n      }\n      m_exponent += static_cast<Exponent>(e);\n      return *this;\n   }\n#endif\n#ifdef BOOST_HAS_FLOAT128\n   template <class Float>\n   typename std::enable_if<std::is_floating_point<Float>::value && !std::is_same<Float, float128_type>::value, cpp_bin_float&>::type assign_float(Float f)\n#else\n   template <class Float>\n   typename std::enable_if<std::is_floating_point<Float>::value, cpp_bin_float&>::type assign_float(Float f)\n#endif\n   {\n      using std::frexp;\n      using std::ldexp;\n      using std::signbit;\n      using default_ops::eval_add;\n      using bf_int_type = typename boost::multiprecision::detail::canonical<int, cpp_bin_float>::type;\n\n      switch (BOOST_MP_FPCLASSIFY(f))\n      {\n      case FP_ZERO:\n         m_data     = limb_type(0);\n         m_sign     = ((signbit)(f));\n         m_exponent = exponent_zero;\n         return *this;\n      case FP_NAN:\n         m_data     = limb_type(0);\n         m_sign     = false;\n         m_exponent = exponent_nan;\n         return *this;\n      case FP_INFINITE:\n         m_data     = limb_type(0);\n         m_sign     = (f < 0);\n         m_exponent = exponent_infinity;\n         return *this;\n      }\n      if (f < 0)\n      {\n         *this = -f;\n         this->negate();\n         return *this;\n      }\n\n      using ui_type = typename std::tuple_element<0, unsigned_types>::type;\n      m_data     = static_cast<ui_type>(0u);\n      m_sign     = false;\n      m_exponent = 0;\n\n      constexpr std::ptrdiff_t bits = sizeof(int) * CHAR_BIT - 1;\n      int e;\n      f = frexp(f, &e);\n      while (f != static_cast<Float>(0.0F))\n      {\n         f = ldexp(f, bits);\n         e -= static_cast<int>(bits);\n         int ipart = boost::multiprecision::detail::itrunc(f);\n         f -= static_cast<Float>(ipart);\n         m_exponent += static_cast<exponent_type>(bits);\n         cpp_bin_float t;\n         t = static_cast<bf_int_type>(ipart);\n         eval_add(*this, t);\n      }\n      m_exponent += static_cast<Exponent>(e);\n      return *this;\n   }\n\n   template <class Float>\n   typename std::enable_if<\n       (number_category<Float>::value == number_kind_floating_point) && !std::is_floating_point<Float>::value && (number_category<Float>::value == number_kind_floating_point),\n       cpp_bin_float&>::type\n   assign_float(Float f)\n   {\n      using default_ops::eval_add;\n      using default_ops::eval_convert_to;\n      using default_ops::eval_get_sign;\n      using default_ops::eval_subtract;\n\n      using f_int_type = typename boost::multiprecision::detail::canonical<int, Float>::type        ;\n      using bf_int_type = typename boost::multiprecision::detail::canonical<int, cpp_bin_float>::type;\n\n      switch (eval_fpclassify(f))\n      {\n      case FP_ZERO:\n         m_data     = limb_type(0);\n         m_sign     = (eval_get_sign(f) > 0);\n         m_exponent = exponent_zero;\n         return *this;\n      case FP_NAN:\n         m_data     = limb_type(0);\n         m_sign     = false;\n         m_exponent = exponent_nan;\n         return *this;\n      case FP_INFINITE:\n         m_data     = limb_type(0);\n         m_sign     = eval_get_sign(f) < 0;\n         m_exponent = exponent_infinity;\n         return *this;\n      }\n      if (eval_get_sign(f) < 0)\n      {\n         f.negate();\n         assign_float(f);\n         this->negate();\n         return *this;\n      }\n\n      using ui_type = typename std::tuple_element<0, unsigned_types>::type;\n      m_data     = static_cast<ui_type>(0u);\n      m_sign     = false;\n      m_exponent = 0;\n\n      constexpr std::ptrdiff_t bits = sizeof(int) * CHAR_BIT - 1;\n      int              e;\n      eval_frexp(f, f, &e);\n      while (eval_get_sign(f) != 0)\n      {\n         eval_ldexp(f, f, bits);\n         e -= bits;\n         int ipart;\n         eval_convert_to(&ipart, f);\n         eval_subtract(f, static_cast<f_int_type>(ipart));\n         m_exponent += bits;\n         eval_add(*this, static_cast<bf_int_type>(ipart));\n      }\n      m_exponent += e;\n      if (m_exponent > max_exponent)\n         m_exponent = exponent_infinity;\n      if (m_exponent < min_exponent)\n      {\n         m_data     = limb_type(0u);\n         m_exponent = exponent_zero;\n         m_sign     = (eval_get_sign(f) > 0);\n      }\n      else if (eval_get_sign(m_data) == 0)\n      {\n         m_exponent = exponent_zero;\n         m_sign     = (eval_get_sign(f) > 0);\n      }\n      return *this;\n   }\n   template <class B, expression_template_option et>\n   cpp_bin_float& assign_float(const number<B, et>& f)\n   {\n      return assign_float(f.backend());\n   }\n   \n   template <class I>\n   typename std::enable_if<boost::multiprecision::detail::is_integral<I>::value, cpp_bin_float&>::type operator=(const I& i)\n   {\n      using default_ops::eval_bit_test;\n      if (!i)\n      {\n         m_data     = static_cast<limb_type>(0);\n         m_exponent = exponent_zero;\n         m_sign     = false;\n      }\n      else\n      {\n         using ui_type = typename boost::multiprecision::detail::make_unsigned<I>::type                                      ;\n         ui_type                                                                            fi = static_cast<ui_type>(boost::multiprecision::detail::unsigned_abs(i));\n         using ar_type = typename boost::multiprecision::detail::canonical<ui_type, rep_type>::type;\n         m_data         = static_cast<ar_type>(fi);\n         std::size_t shift = msb(fi);\n         if (shift >= bit_count)\n         {\n            m_exponent = static_cast<Exponent>(shift);\n            m_data     = static_cast<ar_type>(fi >> (shift + 1 - bit_count));\n         }\n         else\n         {\n            m_exponent = static_cast<Exponent>(shift);\n            eval_left_shift(m_data, bit_count - shift - 1);\n         }\n         BOOST_MP_ASSERT(eval_bit_test(m_data, bit_count - 1));\n         m_sign = detail::is_negative(i);\n      }\n      return *this;\n   }\n\n   cpp_bin_float& operator=(const char* s);\n\n   void swap(cpp_bin_float& o) noexcept\n   {\n      m_data.swap(o.m_data);\n      std::swap(m_exponent, o.m_exponent);\n      std::swap(m_sign, o.m_sign);\n   }\n\n   std::string str(std::streamsize dig, std::ios_base::fmtflags f) const;\n\n   void negate()\n   {\n      if (m_exponent != exponent_nan)\n         m_sign = !m_sign;\n   }\n\n   int compare(const cpp_bin_float& o) const noexcept\n   {\n      if (m_sign != o.m_sign)\n         return (m_exponent == exponent_zero) && (m_exponent == o.m_exponent) ? 0 : m_sign ? -1 : 1;\n      int result;\n      if (m_exponent == exponent_nan)\n         return -1;\n      else if (m_exponent != o.m_exponent)\n      {\n         if (m_exponent == exponent_zero)\n            result = -1;\n         else if (o.m_exponent == exponent_zero)\n            result = 1;\n         else\n            result = m_exponent > o.m_exponent ? 1 : -1;\n      }\n      else\n         result = m_data.compare(o.m_data);\n      if (m_sign)\n         result = -result;\n      return result;\n   }\n   template <class A>\n   int compare(const A& o) const noexcept\n   {\n      cpp_bin_float b;\n      b = o;\n      return compare(b);\n   }\n\n   rep_type&            bits() { return m_data; }\n   const rep_type&      bits() const { return m_data; }\n   exponent_type&       exponent() { return m_exponent; }\n   const exponent_type& exponent() const { return m_exponent; }\n   bool&                sign() { return m_sign; }\n   const bool&          sign() const { return m_sign; }\n   void                 check_invariants()\n   {\n      using default_ops::eval_bit_test;\n      using default_ops::eval_is_zero;\n      if ((m_exponent <= max_exponent) && (m_exponent >= min_exponent))\n      {\n         BOOST_MP_ASSERT(eval_bit_test(m_data, bit_count - 1));\n      }\n      else\n      {\n         BOOST_MP_ASSERT(m_exponent > max_exponent);\n         BOOST_MP_ASSERT(m_exponent <= exponent_nan);\n         BOOST_MP_ASSERT(eval_is_zero(m_data));\n      }\n   }\n\n   #ifndef BOOST_MP_STANDALONE\n   template <class Archive>\n   void serialize(Archive& ar, const unsigned int /*version*/)\n   {\n      ar& boost::make_nvp(\"data\", m_data);\n      ar& boost::make_nvp(\"exponent\", m_exponent);\n      ar& boost::make_nvp(\"sign\", m_sign);\n   }\n   #endif\n};\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class Int>\ninline void copy_and_round(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, Int& arg, std::ptrdiff_t bits_to_keep = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count)\n{\n   // Precondition: exponent of res must have been set before this function is called\n   // as we may need to adjust it based on how many bits_to_keep in arg are set.\n   using default_ops::eval_bit_test;\n   using default_ops::eval_get_sign;\n   using default_ops::eval_increment;\n   using default_ops::eval_left_shift;\n   using default_ops::eval_lsb;\n   using default_ops::eval_msb;\n   using default_ops::eval_right_shift;\n\n   // cancellation may have resulted in arg being all zeros:\n   if (eval_get_sign(arg) == 0)\n   {\n      res.exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero;\n      res.sign()     = false;\n      res.bits()     = static_cast<limb_type>(0u);\n      return;\n   }\n   std::ptrdiff_t msb = static_cast<std::ptrdiff_t>(eval_msb(arg));\n   if (static_cast<std::ptrdiff_t >(bits_to_keep) > msb + 1)\n   {\n      // Must have had cancellation in subtraction,\n      // or be converting from a narrower type, so shift left:\n      res.bits() = arg;\n      eval_left_shift(res.bits(), static_cast<double_limb_type>(bits_to_keep - msb - 1));\n      res.exponent() -= static_cast<Exponent>(bits_to_keep - msb - 1);\n   }\n   else if (static_cast<std::ptrdiff_t >(bits_to_keep) < msb + 1)\n   {\n      // We have more bits_to_keep than we need, so round as required,\n      // first get the rounding bit:\n      bool roundup = eval_bit_test(arg, static_cast<std::size_t>(msb - bits_to_keep));\n      // Then check for a tie:\n      if (roundup && (msb - bits_to_keep == static_cast<std::ptrdiff_t>(eval_lsb(arg))))\n      {\n         // Ties round towards even:\n         if (!eval_bit_test(arg, static_cast<std::size_t>(msb - bits_to_keep + 1)))\n            roundup = false;\n      }\n      // Shift off the bits_to_keep we don't need:\n      eval_right_shift(arg, static_cast<double_limb_type>(msb - bits_to_keep + 1));\n      res.exponent() += static_cast<Exponent>(msb - bits_to_keep + 1);\n      if (roundup)\n      {\n         eval_increment(arg);\n         if (bits_to_keep)\n         {\n            if (eval_bit_test(arg, static_cast<std::size_t>(bits_to_keep)))\n            {\n               // This happens very very rairly, all the bits left after\n               // truncation must be 1's and we're rounding up an order of magnitude:\n               eval_right_shift(arg, 1u);\n               ++res.exponent();\n            }\n         }\n         else\n         {\n            // We get here when bits_to_keep is zero but we're rounding up,\n            // as a result we end up with a single digit that is a 1:\n            ++bits_to_keep;\n         }\n      }\n      if (bits_to_keep != cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count)\n      {\n         // Normalize result when we're rounding to fewer bits than we can hold, only happens in conversions\n         // to narrower types:\n         eval_left_shift(arg, static_cast<double_limb_type>(static_cast<std::ptrdiff_t>(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count) - bits_to_keep));\n         res.exponent() -= static_cast<Exponent>(static_cast<std::ptrdiff_t>(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count) - bits_to_keep);\n      }\n      res.bits() = arg;\n   }\n   else\n   {\n      res.bits() = arg;\n   }\n   if (!bits_to_keep && !res.bits().limbs()[0])\n   {\n      // We're keeping zero bits and did not round up, so result is zero:\n      res.exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero;\n      return;\n   }\n   // Result must be normalized:\n   BOOST_MP_ASSERT(((std::ptrdiff_t )eval_msb(res.bits()) == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1));\n\n   if (res.exponent() > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent)\n   {\n      // Overflow:\n      res.exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity;\n      res.bits()     = static_cast<limb_type>(0u);\n   }\n   else if (res.exponent() < cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent)\n   {\n      // Underflow:\n      res.exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero;\n      res.bits()     = static_cast<limb_type>(0u);\n   }\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class BinFloat2, class BinFloat3>\ninline void do_eval_add(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, \n   const BinFloat2& a, const BinFloat3& b)\n{\n   if (a.exponent() < b.exponent())\n   {\n      bool s = a.sign();\n      do_eval_add(res, b, a);\n      if (res.sign() != s)\n         res.negate();\n      return;\n   }\n\n   using default_ops::eval_add;\n   using default_ops::eval_bit_test;\n\n   using exponent_type = typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type;\n\n   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::double_rep_type dt;\n\n   // Special cases first:\n   switch (a.exponent())\n   {\n   case BinFloat2::exponent_zero:\n   {\n      bool s     = a.sign();\n      res        = b;\n      res.sign() = s;\n      return;\n   }\n   case BinFloat2::exponent_infinity:\n      if (b.exponent() == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan)\n         res = b;\n      else\n         res = a;\n      return; // result is still infinite.\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:\n      res = a;\n      return; // result is still a NaN.\n   }\n   switch (b.exponent())\n   {\n   case BinFloat3::exponent_zero:\n      res = a;\n      return;\n   case BinFloat3::exponent_infinity:\n      res = b;\n      if (res.sign())\n         res.negate();\n      return; // result is infinite.\n   case BinFloat3::exponent_nan:\n      res = b;\n      return; // result is a NaN.\n   }\n\n   static_assert((std::numeric_limits<exponent_type>::max)() - cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent, \"Exponent range check failed\");\n\n   bool s = a.sign();\n   dt     = a.bits();\n   if (a.exponent() > (std::ptrdiff_t )cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + b.exponent())\n   {\n      res.exponent() = a.exponent();\n   }\n   else\n   {\n      exponent_type e_diff = a.exponent() - b.exponent();\n      BOOST_MP_ASSERT(e_diff >= 0);\n      eval_left_shift(dt, static_cast<double_limb_type>(e_diff));\n      res.exponent() = a.exponent() - e_diff;\n      eval_add(dt, b.bits());\n   }\n\n   copy_and_round(res, dt);\n   res.check_invariants();\n   if (res.sign() != s)\n      res.negate();\n}\n\ntemplate <class BinFloat1, class BinFloat2, class BinFloat3>\ninline void do_eval_subtract(BinFloat1& res, const BinFloat2& a, const BinFloat3& b)\n{\n   using default_ops::eval_bit_test;\n   using default_ops::eval_decrement;\n   using default_ops::eval_subtract;\n\n   typename BinFloat1::double_rep_type dt;\n\n   // Special cases first:\n   switch (a.exponent())\n   {\n   case BinFloat2::exponent_zero:\n      if (b.exponent() == BinFloat3::exponent_nan)\n         res = std::numeric_limits<number<BinFloat1> >::quiet_NaN().backend();\n      else\n      {\n         bool s = a.sign();\n         res    = b;\n         if (res.exponent() == BinFloat1::exponent_zero)\n            res.sign() = false;\n         else if (res.sign() == s)\n            res.negate();\n      }\n      return;\n   case BinFloat2::exponent_infinity:\n      if ((b.exponent() == BinFloat3::exponent_nan) || (b.exponent() == BinFloat3::exponent_infinity))\n         res = std::numeric_limits<number<BinFloat1> >::quiet_NaN().backend();\n      else\n         res = a;\n      return;\n   case BinFloat2::exponent_nan:\n      res = a;\n      return; // result is still a NaN.\n   }\n   switch (b.exponent())\n   {\n   case BinFloat3::exponent_zero:\n      res = a;\n      return;\n   case BinFloat3::exponent_infinity:\n      res.exponent() = BinFloat1::exponent_infinity;\n      res.sign()     = !a.sign();\n      res.bits()     = static_cast<limb_type>(0u);\n      return; // result is a NaN.\n   case BinFloat3::exponent_nan:\n      res = b;\n      return; // result is still a NaN.\n   }\n\n   bool s = a.sign();\n   if ((a.exponent() > b.exponent()) || ((a.exponent() == b.exponent()) && a.bits().compare(b.bits()) >= 0))\n   {\n      dt = a.bits();\n      if (a.exponent() <= (std::ptrdiff_t )BinFloat1::bit_count + b.exponent())\n      {\n         typename BinFloat1::exponent_type e_diff = a.exponent() - b.exponent();\n         eval_left_shift(dt, static_cast<double_limb_type>(e_diff));\n         res.exponent() = a.exponent() - e_diff;\n         eval_subtract(dt, b.bits());\n      }\n      else if (a.exponent() == (std::ptrdiff_t )BinFloat1::bit_count + b.exponent() + 1)\n      {\n         if ((eval_lsb(a.bits()) == BinFloat1::bit_count - 1)\n            && (eval_lsb(b.bits()) != BinFloat1::bit_count - 1))\n         {\n            eval_left_shift(dt, 1);\n            eval_decrement(dt);\n            res.exponent() = a.exponent() - 1;\n         }\n         else\n            res.exponent() = a.exponent();\n      }\n      else\n         res.exponent() = a.exponent();\n   }\n   else\n   {\n      dt = b.bits();\n      if (b.exponent() <= (std::ptrdiff_t )BinFloat1::bit_count + a.exponent())\n      {\n         typename BinFloat1::exponent_type e_diff = a.exponent() - b.exponent();\n         eval_left_shift(dt, static_cast<double_limb_type>(-e_diff));\n         res.exponent() = b.exponent() + e_diff;\n         eval_subtract(dt, a.bits());\n      }\n      else if (b.exponent() == (std::ptrdiff_t )BinFloat1::bit_count + a.exponent() + 1)\n      {\n         if ((eval_lsb(a.bits()) != BinFloat1::bit_count - 1)\n            && eval_lsb(b.bits()))\n         {\n            eval_left_shift(dt, 1);\n            eval_decrement(dt);\n            res.exponent() = b.exponent() - 1;\n         }\n         else\n            res.exponent() = b.exponent();\n      }\n      else\n         res.exponent() = b.exponent();\n      s = !s;\n   }\n\n   copy_and_round(res, dt);\n   if (res.exponent() == BinFloat1::exponent_zero)\n      res.sign() = false;\n   else if (res.sign() != s)\n      res.negate();\n   res.check_invariants();\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, \n   class Allocator2, class Exponent2, Exponent MinE2, Exponent MaxE2,\n   class Allocator3, class Exponent3, Exponent MinE3, Exponent MaxE3>\ninline void eval_add(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, \n   const cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>& a, \n   const cpp_bin_float<Digits, DigitBase, Allocator3, Exponent3, MinE3, MaxE3>& b)\n{\n   if (a.sign() == b.sign())\n      do_eval_add(res, a, b);\n   else\n      do_eval_subtract(res, a, b);\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE,\n   class Allocator2, class Exponent2, Exponent MinE2, Exponent MaxE2>\ninline void eval_add(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, \n   const cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>& a)\n{\n   return eval_add(res, res, a);\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE,\n   class Allocator2, class Exponent2, Exponent MinE2, Exponent MaxE2,\n   class Allocator3, class Exponent3, Exponent MinE3, Exponent MaxE3>\ninline void eval_subtract(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, \n   const cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>& a, \n   const cpp_bin_float<Digits, DigitBase, Allocator3, Exponent3, MinE3, MaxE3>& b)\n{\n   if (a.sign() != b.sign())\n      do_eval_add(res, a, b);\n   else\n      do_eval_subtract(res, a, b);\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE,\n   class Allocator2, class Exponent2, Exponent MinE2, Exponent MaxE2>\ninline void eval_subtract(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, \n   const cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>& a)\n{\n   return eval_subtract(res, res, a);\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, \n   class Allocator2, class Exponent2, Exponent MinE2, Exponent MaxE2, \n   class Allocator3, class Exponent3, Exponent MinE3, Exponent MaxE3>\ninline void eval_multiply(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, \n   const cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>& a, \n   const cpp_bin_float<Digits, DigitBase, Allocator3, Exponent3, MinE3, MaxE3>& b)\n{\n   using default_ops::eval_bit_test;\n   using default_ops::eval_multiply;\n\n   // Special cases first:\n   switch (a.exponent())\n   {\n   case cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>::exponent_zero:\n   {\n      if (b.exponent() == cpp_bin_float<Digits, DigitBase, Allocator3, Exponent3, MinE3, MaxE3>::exponent_nan)\n         res = b;\n      else if (b.exponent() == cpp_bin_float<Digits, DigitBase, Allocator3, Exponent3, MinE3, MaxE3>::exponent_infinity)\n         res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();\n      else\n      {\n         bool s     = a.sign() != b.sign();\n         res        = a;\n         res.sign() = s;\n      }\n      return;\n   }\n   case cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>::exponent_infinity:\n      switch (b.exponent())\n      {\n      case cpp_bin_float<Digits, DigitBase, Allocator3, Exponent3, MinE3, MaxE3>::exponent_zero:\n         res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();\n         break;\n      case cpp_bin_float<Digits, DigitBase, Allocator3, Exponent3, MinE3, MaxE3>::exponent_nan:\n         res = b;\n         break;\n      default:\n         bool s     = a.sign() != b.sign();\n         res        = a;\n         res.sign() = s;\n         break;\n      }\n      return;\n   case cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>::exponent_nan:\n      res = a;\n      return;\n   }\n   if (b.exponent() > cpp_bin_float<Digits, DigitBase, Allocator3, Exponent3, MinE3, MaxE3>::max_exponent)\n   {\n      bool s     = a.sign() != b.sign();\n      res        = b;\n      res.sign() = s;\n      return;\n   }\n   if ((a.exponent() > 0) && (b.exponent() > 0))\n   {\n      if (cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent + 2 - a.exponent() < b.exponent())\n      {\n         // We will certainly overflow:\n         bool s         = a.sign() != b.sign();\n         res.exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity;\n         res.sign()     = s;\n         res.bits()     = static_cast<limb_type>(0u);\n         return;\n      }\n   }\n   if ((a.exponent() < 0) && (b.exponent() < 0))\n   {\n      if (cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent - 2 - a.exponent() > b.exponent())\n      {\n         // We will certainly underflow:\n         res.exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero;\n         res.sign()     = a.sign() != b.sign();\n         res.bits()     = static_cast<limb_type>(0u);\n         return;\n      }\n   }\n\n   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::double_rep_type dt;\n   eval_multiply(dt, a.bits(), b.bits());\n   res.exponent() = a.exponent() + b.exponent() - (Exponent)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + 1;\n   copy_and_round(res, dt);\n   res.check_invariants();\n   res.sign() = a.sign() != b.sign();\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE,\n   class Allocator2, class Exponent2, Exponent MinE2, Exponent MaxE2>\ninline void eval_multiply(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, \n   const cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>& a)\n{\n   eval_multiply(res, res, a);\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE,\n   class Allocator2, class Exponent2, Exponent MinE2, Exponent MaxE2, class U>\ninline typename std::enable_if<boost::multiprecision::detail::is_unsigned<U>::value>::type eval_multiply(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, \n   const cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>& a, const U& b)\n{\n   using default_ops::eval_bit_test;\n   using default_ops::eval_multiply;\n\n   bool s = a.sign(); // saved for later in case a and res are the same object.\n\n   // Special cases first:\n   switch (a.exponent())\n   {\n   case cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>::exponent_zero:\n   {\n      res        = a;\n      res.sign() = s;\n      return;\n   }\n   case cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>::exponent_infinity:\n      if (b == 0)\n         res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();\n      else\n         res = a;\n      return;\n   case cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>::exponent_nan:\n      res = a;\n      return;\n   }\n\n   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::double_rep_type                                                                     dt;\n   using canon_ui_type = typename boost::multiprecision::detail::canonical<U, typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::double_rep_type>::type;\n   eval_multiply(dt, a.bits(), static_cast<canon_ui_type>(b));\n   res.exponent() = a.exponent();\n   copy_and_round(res, dt);\n   res.check_invariants();\n   res.sign() = s;\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class U>\ninline typename std::enable_if<boost::multiprecision::detail::is_unsigned<U>::value>::type eval_multiply(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, const U& b)\n{\n   eval_multiply(res, res, b);\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE,\n   class Allocator2, class Exponent2, Exponent MinE2, Exponent MaxE2, class S>\ninline typename std::enable_if<boost::multiprecision::detail::is_signed<S>::value && boost::multiprecision::detail::is_integral<S>::value>::type eval_multiply(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, \n   const cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>& a, const S& b)\n{\n   using ui_type = typename boost::multiprecision::detail::make_unsigned<S>::type;\n   eval_multiply(res, a, static_cast<ui_type>(boost::multiprecision::detail::unsigned_abs(b)));\n   if (b < 0)\n      res.negate();\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class S>\ninline typename std::enable_if<boost::multiprecision::detail::is_signed<S>::value && boost::multiprecision::detail::is_integral<S>::value>::type eval_multiply(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, const S& b)\n{\n   eval_multiply(res, res, b);\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE,\n   class Allocator2, class Exponent2, Exponent MinE2, Exponent MaxE2,\n   class Allocator3, class Exponent3, Exponent MinE3, Exponent MaxE3>\ninline void eval_divide(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, \n   const cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>& u, \n   const cpp_bin_float<Digits, DigitBase, Allocator3, Exponent3, MinE3, MaxE3>& v)\n{\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 6326) // comparison of two constants\n#endif\n   using default_ops::eval_bit_test;\n   using default_ops::eval_get_sign;\n   using default_ops::eval_increment;\n   using default_ops::eval_qr;\n   using default_ops::eval_subtract;\n\n   //\n   // Special cases first:\n   //\n   switch (u.exponent())\n   {\n   case cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>::exponent_zero:\n   {\n      switch (v.exponent())\n      {\n      case cpp_bin_float<Digits, DigitBase, Allocator3, Exponent3, MinE3, MaxE3>::exponent_zero:\n      case cpp_bin_float<Digits, DigitBase, Allocator3, Exponent3, MinE3, MaxE3>::exponent_nan:\n         res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();\n         return;\n      }\n      bool s     = u.sign() != v.sign();\n      res        = u;\n      res.sign() = s;\n      return;\n   }\n   case cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>::exponent_infinity:\n   {\n      switch (v.exponent())\n      {\n      case cpp_bin_float<Digits, DigitBase, Allocator3, Exponent3, MinE3, MaxE3>::exponent_infinity:\n      case cpp_bin_float<Digits, DigitBase, Allocator3, Exponent3, MinE3, MaxE3>::exponent_nan:\n         res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();\n         return;\n      }\n      bool s     = u.sign() != v.sign();\n      res        = u;\n      res.sign() = s;\n      return;\n   }\n   case cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>::exponent_nan:\n      res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();\n      return;\n   }\n   switch (v.exponent())\n   {\n   case cpp_bin_float<Digits, DigitBase, Allocator3, Exponent3, MinE3, MaxE3>::exponent_zero:\n   {\n      bool s     = u.sign() != v.sign();\n      res        = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::infinity().backend();\n      res.sign() = s;\n      return;\n   }\n   case cpp_bin_float<Digits, DigitBase, Allocator3, Exponent3, MinE3, MaxE3>::exponent_infinity:\n      res.exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero;\n      res.bits()     = limb_type(0);\n      res.sign()     = u.sign() != v.sign();\n      return;\n   case cpp_bin_float<Digits, DigitBase, Allocator3, Exponent3, MinE3, MaxE3>::exponent_nan:\n      res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();\n      return;\n   }\n\n   // We can scale u and v so that both are integers, then perform integer\n   // division to obtain quotient q and remainder r, such that:\n   //\n   // q * v + r = u\n   //\n   // and hense:\n   //\n   // q + r/v = u/v\n   //\n   // From this, assuming q has cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count\n   // bits we only need to determine whether\n   // r/v is less than, equal to, or greater than 0.5 to determine rounding -\n   // this we can do with a shift and comparison.\n   //\n   // We can set the exponent and sign of the result up front:\n   //\n   if ((v.exponent() < 0) && (u.exponent() > 0))\n   {\n      // Check for overflow:\n      if (cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent + v.exponent() < u.exponent() - 1)\n      {\n         res.exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity;\n         res.sign()     = u.sign() != v.sign();\n         res.bits()     = static_cast<limb_type>(0u);\n         return;\n      }\n   }\n   else if ((v.exponent() > 0) && (u.exponent() < 0))\n   {\n      // Check for underflow:\n      if (cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent + v.exponent() > u.exponent())\n      {\n         // We will certainly underflow:\n         res.exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero;\n         res.sign()     = u.sign() != v.sign();\n         res.bits()     = static_cast<limb_type>(0u);\n         return;\n      }\n   }\n   res.exponent() = u.exponent() - v.exponent() - 1;\n   res.sign()     = u.sign() != v.sign();\n   //\n   // Now get the quotient and remainder:\n   //\n   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::double_rep_type t(u.bits()), t2(v.bits()), q, r;\n   eval_left_shift(t, cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count);\n   eval_qr(t, t2, q, r);\n   //\n   // We now have either \"cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count\"\n   // or \"cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count+1\" significant\n   // bits in q.\n   //\n   constexpr unsigned limb_bits = sizeof(limb_type) * CHAR_BIT;\n   if (eval_bit_test(q, cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count))\n   {\n      //\n      // OK we have cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count+1 bits,\n      // so we already have rounding info,\n      // we just need to changes things if the last bit is 1 and either the\n      // remainder is non-zero (ie we do not have a tie) or the quotient would\n      // be odd if it were shifted to the correct number of bits (ie a tiebreak).\n      //\n      BOOST_MP_ASSERT((eval_msb(q) == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count));\n      if ((q.limbs()[0] & 1u) && (eval_get_sign(r) || (q.limbs()[0] & 2u)))\n      {\n         eval_increment(q);\n      }\n   }\n   else\n   {\n      //\n      // We have exactly \"cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count\" bits in q.\n      // Get rounding info, which we can get by comparing 2r with v.\n      // We want to call copy_and_round to handle rounding and general cleanup,\n      // so we'll left shift q and add some fake digits on the end to represent\n      // how we'll be rounding.\n      //\n      using local_exponent_type = typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type;\n\n      BOOST_MP_ASSERT((eval_msb(q) == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1));\n      constexpr unsigned lshift = (cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count < limb_bits) ? 2 : limb_bits;\n      eval_left_shift(q, lshift);\n      res.exponent() -= static_cast<local_exponent_type>(lshift);\n      eval_left_shift(r, 1u);\n      int c = r.compare(v.bits());\n      if (c == 0)\n         q.limbs()[0] |= static_cast<limb_type>(1u) << (lshift - 1);\n      else if (c > 0)\n         q.limbs()[0] |= (static_cast<limb_type>(1u) << (lshift - 1)) + static_cast<limb_type>(1u);\n   }\n   copy_and_round(res, q);\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE,\n   class Allocator2, class Exponent2, Exponent MinE2, Exponent MaxE2>\ninline void eval_divide(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, \n   const cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>& arg)\n{\n   eval_divide(res, res, arg);\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE,\n   class Allocator2, class Exponent2, Exponent MinE2, Exponent MaxE2, class U>\ninline typename std::enable_if<boost::multiprecision::detail::is_unsigned<U>::value>::type eval_divide(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, \n   const cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>& u, const U& v)\n{\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 6326) // comparison of two constants\n#endif\n   using default_ops::eval_bit_test;\n   using default_ops::eval_get_sign;\n   using default_ops::eval_increment;\n   using default_ops::eval_qr;\n   using default_ops::eval_subtract;\n\n   //\n   // Special cases first:\n   //\n   switch (u.exponent())\n   {\n   case cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>::exponent_zero:\n   {\n      if (v == 0)\n      {\n         res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();\n         return;\n      }\n      bool s     = u.sign() != (v < 0);\n      res        = u;\n      res.sign() = s;\n      return;\n   }\n   case cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>::exponent_infinity:\n      res = u;\n      return;\n   case cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>::exponent_nan:\n      res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();\n      return;\n   }\n   if (v == 0)\n   {\n      bool s     = u.sign();\n      res        = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::infinity().backend();\n      res.sign() = s;\n      return;\n   }\n\n   // We can scale u and v so that both are integers, then perform integer\n   // division to obtain quotient q and remainder r, such that:\n   //\n   // q * v + r = u\n   //\n   // and hense:\n   //\n   // q + r/v = u/v\n   //\n   // From this, assuming q has \"cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count\" cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count, we only need to determine whether\n   // r/v is less than, equal to, or greater than 0.5 to determine rounding -\n   // this we can do with a shift and comparison.\n   //\n   // We can set the exponent and sign of the result up front:\n   //\n   std::ptrdiff_t  gb         = static_cast<std::ptrdiff_t>(msb(v));\n   res.exponent() = u.exponent() - static_cast<Exponent>(gb) - static_cast<Exponent>(1);\n   res.sign()     = u.sign();\n   //\n   // Now get the quotient and remainder:\n   //\n   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::double_rep_type t(u.bits()), q, r;\n   eval_left_shift(t, static_cast<double_limb_type>(gb + 1));\n   eval_qr(t, number<typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::double_rep_type>::canonical_value(v), q, r);\n   //\n   // We now have either \"cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count\" or \"cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count+1\" significant cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count in q.\n   //\n   constexpr unsigned limb_bits = sizeof(limb_type) * CHAR_BIT;\n   if (eval_bit_test(q, cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count))\n   {\n      //\n      // OK we have cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count+1 cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count, so we already have rounding info,\n      // we just need to changes things if the last bit is 1 and the\n      // remainder is non-zero (ie we do not have a tie).\n      //\n      BOOST_MP_ASSERT((eval_msb(q) == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count));\n      if ((q.limbs()[0] & 1u) && eval_get_sign(r))\n      {\n         eval_increment(q);\n      }\n   }\n   else\n   {\n      //\n      // We have exactly \"cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count\" cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count in q.\n      // Get rounding info, which we can get by comparing 2r with v.\n      // We want to call copy_and_round to handle rounding and general cleanup,\n      // so we'll left shift q and add some fake cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count on the end to represent\n      // how we'll be rounding.\n      //\n      using local_exponent_type = typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type;\n\n      BOOST_MP_ASSERT((eval_msb(q) == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1));\n      constexpr unsigned lshift = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count < limb_bits ? 2 : limb_bits;\n      eval_left_shift(q, lshift);\n      res.exponent() -= static_cast<local_exponent_type>(lshift);\n      eval_left_shift(r, 1u);\n      int c = r.compare(number<typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::double_rep_type>::canonical_value(v));\n      if (c == 0)\n         q.limbs()[0] |= static_cast<limb_type>(1u) << (lshift - 1);\n      else if (c > 0)\n         q.limbs()[0] |= (static_cast<limb_type>(1u) << (lshift - 1)) + static_cast<limb_type>(1u);\n   }\n   copy_and_round(res, q);\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class U>\ninline typename std::enable_if<boost::multiprecision::detail::is_unsigned<U>::value>::type eval_divide(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, const U& v)\n{\n   eval_divide(res, res, v);\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE,\n   class Allocator2, class Exponent2, Exponent MinE2, Exponent MaxE2, class S>\ninline typename std::enable_if<boost::multiprecision::detail::is_signed<S>::value && boost::multiprecision::detail::is_integral<S>::value>::type eval_divide(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, \n   const cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2>& u, const S& v)\n{\n   using ui_type = typename boost::multiprecision::detail::make_unsigned<S>::type;\n   eval_divide(res, u, static_cast<ui_type>(boost::multiprecision::detail::unsigned_abs(v)));\n   if (v < 0)\n      res.negate();\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class S>\ninline typename std::enable_if<boost::multiprecision::detail::is_signed<S>::value && boost::multiprecision::detail::is_integral<S>::value>::type eval_divide(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, const S& v)\n{\n   eval_divide(res, res, v);\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\ninline int eval_get_sign(const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg)\n{\n   return arg.exponent() == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero ? 0 : arg.sign() ? -1 : 1;\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\ninline bool eval_is_zero(const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg)\n{\n   return arg.exponent() == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero;\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\ninline bool eval_eq(const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& a, cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& b)\n{\n   if (a.exponent() == b.exponent())\n   {\n      if (a.exponent() == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero)\n         return true;\n      return (a.sign() == b.sign()) && (a.bits().compare(b.bits()) == 0) && (a.exponent() != cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan);\n   }\n   return false;\n}\n\ntemplate <class I, unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\ninline void convert_to_signed_int(I* res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg)\n{\n   static constexpr int digits  = std::numeric_limits<I>::is_specialized ? std::numeric_limits<I>::digits : sizeof(I) * CHAR_BIT - 1;\n   static constexpr I max_val = std::numeric_limits<I>::is_specialized ? (std::numeric_limits<I>::max)() : (((I(1) << (sizeof(I) * CHAR_BIT - 2)) - 1) << 1) + 1;\n   static constexpr I min_val = std::numeric_limits<I>::is_specialized ? (std::numeric_limits<I>::min)() : -max_val - 1;\n\n\n   switch (arg.exponent())\n   {\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:\n      *res = 0;\n      return;\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Could not convert NaN to integer.\"));\n      return;\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:\n      *res = max_val;\n      if (arg.sign())\n         *res = -*res;\n      return;\n   }\n   using shift_type = typename std::conditional<sizeof(typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type) < sizeof(int), int, typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type>::type;\n   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::rep_type man(arg.bits());\n   shift_type                                                                           shift = (shift_type)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1 - arg.exponent();\n   if (shift > (shift_type)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1)\n   {\n      *res = 0;\n      return;\n   }\n   if (arg.sign() && (arg.compare(min_val) <= 0))\n   {\n      *res = min_val;\n      return;\n   }\n   else if (!arg.sign() && (arg.compare(max_val) >= 0))\n   {\n      *res = max_val;\n      return;\n   }\n\n   if (shift < 0)\n   {\n      if (static_cast<int>(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count) - static_cast<int>(shift) <= digits)\n      {\n         // We have more bits in long_long_type than the float, so it's OK to left shift:\n         eval_convert_to(res, man);\n         *res <<= -shift;\n      }\n      else\n      {\n         *res = (std::numeric_limits<I>::max)();\n         return;\n      }\n   }\n   else\n   {\n      eval_right_shift(man, static_cast<double_limb_type>(shift));\n      eval_convert_to(res, man);\n   }\n   if (arg.sign())\n   {\n      *res = -*res;\n   }\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\ninline void eval_convert_to(long long* res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg)\n{\n   convert_to_signed_int(res, arg);\n}\n\n#ifdef BOOST_HAS_INT128\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\ninline void eval_convert_to(int128_type* res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg)\n{\n   convert_to_signed_int(res, arg);\n}\n#endif\n\ntemplate <class I, unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\ninline void convert_to_unsigned_int(I* res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg)\n{\n   static constexpr int digits  = std::numeric_limits<I>::is_specialized ? std::numeric_limits<I>::digits : sizeof(I) * CHAR_BIT;\n   static constexpr I   max_val = std::numeric_limits<I>::is_specialized ? (std::numeric_limits<I>::max)() : ~static_cast<I>(0);\n\n   switch (arg.exponent())\n   {\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:\n      *res = 0;\n      return;\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Could not convert NaN to integer.\"));\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:\n      *res = max_val;\n      return;\n   }\n   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::rep_type                                                                                                                                                              man(arg.bits());\n   using shift_type = typename std::conditional<sizeof(typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type) < sizeof(int), int, typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type>::type;\n   shift_type                                                                                                                                                                                                                                        shift = (shift_type)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1 - arg.exponent();\n   if (shift > (shift_type)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1)\n   {\n      *res = 0;\n      return;\n   }\n   else if (shift < 0)\n   {\n      if (cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - shift <= digits)\n      {\n         // We have more bits in ulong_long_type than the float, so it's OK to left shift:\n         eval_convert_to(res, man);\n         *res <<= -shift;\n         return;\n      }\n      *res = max_val;\n      return;\n   }\n   eval_right_shift(man, shift);\n   eval_convert_to(res, man);\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\ninline void eval_convert_to(unsigned long long* res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg)\n{\n   convert_to_unsigned_int(res, arg);\n}\n\n#ifdef BOOST_HAS_INT128\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\ninline void eval_convert_to(uint128_type* res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg)\n{\n   convert_to_unsigned_int(res, arg);\n}\n#endif\n\ntemplate <class Float, unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\ninline typename std::enable_if<std::is_floating_point<Float>::value>::type eval_convert_to(Float* res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& original_arg)\n{\n   using conv_type = cpp_bin_float<std::numeric_limits<Float>::digits, digit_base_2, void, Exponent, MinE, MaxE>;\n   using common_exp_type = typename std::common_type<typename conv_type::exponent_type, int>::type;\n\n   static constexpr int float_digits = boost::multiprecision::detail::is_float128<Float>::value ? 113 : std::numeric_limits<Float>::digits;\n\n   BOOST_MP_FLOAT128_USING using std::ldexp;\n   //\n   // Special cases first:\n   //\n   switch (original_arg.exponent())\n   {\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:\n      *res = 0;\n      if (original_arg.sign())\n         *res = -*res;\n      return;\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:\n      BOOST_IF_CONSTEXPR(boost::multiprecision::detail::is_float128<Float>::value)\n      {\n         *res = static_cast<Float>(std::numeric_limits<double>::quiet_NaN());\n      }\n      else\n      {\n         *res = std::numeric_limits<Float>::quiet_NaN();\n      }\n      return;\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:\n      BOOST_IF_CONSTEXPR(boost::multiprecision::detail::is_float128<Float>::value)\n      {\n         *res = static_cast<Float>((std::numeric_limits<double>::infinity)());\n      }\n      else\n      {\n         *res = (std::numeric_limits<Float>::infinity)();\n      }\n      if (original_arg.sign())\n         *res = -*res;\n      return;\n   }\n   //\n   // Check for super large exponent that must be converted to infinity:\n   //\n   if (original_arg.exponent() > (boost::multiprecision::detail::is_float128<Float>::value ? 16384 : std::numeric_limits<Float>::max_exponent))\n   {\n      BOOST_IF_CONSTEXPR(boost::multiprecision::detail::is_float128<Float>::value)\n      {\n         *res = static_cast<Float>(std::numeric_limits<double>::infinity());\n      }\n      else\n      {\n         *res = std::numeric_limits<Float>::has_infinity ? std::numeric_limits<Float>::infinity() : (std::numeric_limits<Float>::max)();\n      }\n      if (original_arg.sign())\n         *res = -*res;\n      return;\n   }\n   //\n   // Figure out how many digits we will have in our result,\n   // allowing for a possibly denormalized result:\n   //\n   common_exp_type digits_to_round_to = float_digits;\n   if (original_arg.exponent() < std::numeric_limits<Float>::min_exponent - 1)\n   {\n      common_exp_type diff = original_arg.exponent();\n      diff -= boost::multiprecision::detail::is_float128<Float>::value ? -16382 : std::numeric_limits<Float>::min_exponent - 1;\n      digits_to_round_to += diff;\n   }\n   if (digits_to_round_to < 0)\n   {\n      // Result must be zero:\n      *res = 0;\n      if (original_arg.sign())\n         *res = -*res;\n      return;\n   }\n   //\n   // Perform rounding first, then afterwards extract the digits:\n   //\n   cpp_bin_float<static_cast<unsigned>(float_digits), digit_base_2, Allocator, Exponent, MinE, MaxE>           arg;\n   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::rep_type bits(original_arg.bits());\n   arg.exponent() = original_arg.exponent();\n   copy_and_round(arg, bits, (std::ptrdiff_t)digits_to_round_to);\n   common_exp_type e = arg.exponent();\n   e -= static_cast<common_exp_type>(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count) - 1;\n   constexpr std::size_t limbs_needed      = static_cast<std::size_t>(float_digits) / (sizeof(*arg.bits().limbs()) * CHAR_BIT) + (static_cast<std::size_t>(float_digits) % (sizeof(*arg.bits().limbs()) * CHAR_BIT) ? 1 : 0);\n   std::size_t                 first_limb_needed = arg.bits().size() - limbs_needed;\n   *res                                          = 0;\n   e += static_cast<common_exp_type>(first_limb_needed * sizeof(*arg.bits().limbs()) * CHAR_BIT);\n   while (first_limb_needed < arg.bits().size())\n   {\n      *res += ldexp(static_cast<Float>(arg.bits().limbs()[first_limb_needed]), static_cast<int>(e));\n      ++first_limb_needed;\n      e += static_cast<common_exp_type>(sizeof(*arg.bits().limbs()) * CHAR_BIT);\n   }\n   if (original_arg.sign())\n      *res = -*res;\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\ninline void eval_frexp(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg, Exponent* e)\n{\n   switch (arg.exponent())\n   {\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:\n      *e  = 0;\n      res = arg;\n      return;\n   }\n   res            = arg;\n   *e             = arg.exponent() + 1;\n   res.exponent() = -1;\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class I>\ninline void eval_frexp(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg, I* pe)\n{\n   Exponent e;\n   eval_frexp(res, arg, &e);\n   if ((e > (std::numeric_limits<I>::max)()) || (e < (std::numeric_limits<I>::min)()))\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Exponent was outside of the range of the argument type to frexp.\"));\n   }\n   *pe = static_cast<I>(e);\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\ninline void eval_ldexp(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg, Exponent e)\n{\n   switch (arg.exponent())\n   {\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:\n      res = arg;\n      return;\n   }\n   if ((e > 0) && (cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent - e < arg.exponent()))\n   {\n      // Overflow:\n      res        = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::infinity().backend();\n      res.sign() = arg.sign();\n   }\n   else if ((e < 0) && (cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent - e > arg.exponent()))\n   {\n      // Underflow:\n      res = limb_type(0);\n   }\n   else\n   {\n      res = arg;\n      res.exponent() += e;\n   }\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class I>\ninline typename std::enable_if<boost::multiprecision::detail::is_unsigned<I>::value>::type eval_ldexp(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg, I e)\n{\n   using si_type = typename boost::multiprecision::detail::make_signed<I>::type;\n   if (e > static_cast<I>((std::numeric_limits<si_type>::max)()))\n      res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::infinity().backend();\n   else\n      eval_ldexp(res, arg, static_cast<si_type>(e));\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class I>\ninline typename std::enable_if<boost::multiprecision::detail::is_signed<I>::value && boost::multiprecision::detail::is_integral<I>::value>::type eval_ldexp(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg, I e)\n{\n   if ((e > (std::numeric_limits<Exponent>::max)()) || (e < (std::numeric_limits<Exponent>::min)()))\n   {\n      res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::infinity().backend();\n      if (e < 0)\n         res.negate();\n   }\n   else\n      eval_ldexp(res, arg, static_cast<Exponent>(e));\n}\n\n/*\n* Sign manipulation\n*/\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE,\n   unsigned Digits2, digit_base_type DigitBase2, class Allocator2, class Exponent2, Exponent MinE2, Exponent MaxE2>\ninline void eval_abs(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, const cpp_bin_float<Digits2, DigitBase2, Allocator2, Exponent2, MinE2, MaxE2>& arg)\n{\n   res        = arg;\n   res.sign() = false;\n}\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\ninline void eval_abs(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg)\n{\n   res        = arg;\n   res.sign() = false;\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE,\n   unsigned Digits2, digit_base_type DigitBase2, class Allocator2, class Exponent2, Exponent MinE2, Exponent MaxE2>\ninline void eval_fabs(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, const cpp_bin_float<Digits2, DigitBase2, Allocator2, Exponent2, MinE2, MaxE2>& arg)\n{\n   res        = arg;\n   res.sign() = false;\n}\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\ninline void eval_fabs(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg)\n{\n   res        = arg;\n   res.sign() = false;\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\ninline int eval_fpclassify(const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg)\n{\n   switch (arg.exponent())\n   {\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:\n      return FP_ZERO;\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:\n      return FP_INFINITE;\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:\n      return FP_NAN;\n   }\n   return FP_NORMAL;\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\ninline void eval_sqrt(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg)\n{\n   using default_ops::eval_bit_test;\n   using default_ops::eval_increment;\n   using default_ops::eval_integer_sqrt;\n   switch (arg.exponent())\n   {\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:\n      errno = EDOM;\n      // fallthrough...\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:\n      res = arg;\n      return;\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:\n      if (arg.sign())\n      {\n         res   = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();\n         errno = EDOM;\n      }\n      else\n         res = arg;\n      return;\n   }\n   if (arg.sign())\n   {\n      res   = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();\n      errno = EDOM;\n      return;\n   }\n\n   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::double_rep_type t(arg.bits()), r, s;\n   eval_left_shift(t, arg.exponent() & 1 ? cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count : cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1);\n   eval_integer_sqrt(s, r, t);\n\n   if (!eval_bit_test(s, cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count))\n   {\n      // We have exactly the right number of cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count in the result, round as required:\n      if (s.compare(r) < 0)\n      {\n         eval_increment(s);\n      }\n   }\n   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type ae = arg.exponent();\n   res.exponent()                                                                               = ae / 2;\n   res.sign() = false;\n   if ((ae & 1) && (ae < 0))\n      --res.exponent();\n   copy_and_round(res, s);\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\ninline void eval_floor(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg)\n{\n   using default_ops::eval_increment;\n   switch (arg.exponent())\n   {\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:\n      errno = EDOM;\n      // fallthrough...\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:\n      res = arg;\n      return;\n   }\n   using shift_type = typename std::conditional<sizeof(typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type) < sizeof(int), int, typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type>::type;\n   shift_type                                                                                                                                                                                                                                        shift =\n       (shift_type)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - arg.exponent() - 1;\n   if ((arg.exponent() > (shift_type)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent) || (shift <= 0))\n   {\n      // Either arg is already an integer, or a special value:\n      res = arg;\n      return;\n   }\n   if (shift >= (shift_type)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count)\n   {\n      res = static_cast<signed_limb_type>(arg.sign() ? -1 : 0);\n      return;\n   }\n   bool fractional = (shift_type)eval_lsb(arg.bits()) < shift;\n   res             = arg;\n   eval_right_shift(res.bits(), static_cast<double_limb_type>(shift));\n   if (fractional && res.sign())\n   {\n      eval_increment(res.bits());\n\n      const std::ptrdiff_t shift_check =\n         static_cast<std::ptrdiff_t>(static_cast<std::ptrdiff_t>(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count) - 1 - static_cast<std::ptrdiff_t>(shift));\n\n      if (static_cast<std::ptrdiff_t>(eval_msb(res.bits())) != shift_check)\n      {\n         // Must have extended result by one bit in the increment:\n         --shift;\n         ++res.exponent();\n      }\n   }\n   eval_left_shift(res.bits(), static_cast<double_limb_type>(shift));\n}\n\ntemplate <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\ninline void eval_ceil(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg)\n{\n   using default_ops::eval_increment;\n   switch (arg.exponent())\n   {\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:\n      errno = EDOM;\n      // fallthrough...\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:\n   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:\n      res = arg;\n      return;\n   }\n   using shift_type = typename std::conditional<sizeof(typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type) < sizeof(int), int, typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type>::type;\n   shift_type                                                                                                                                                                                                                                        shift = (shift_type)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - arg.exponent() - 1;\n   if ((arg.exponent() > (shift_type)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent) || (shift <= 0))\n   {\n      // Either arg is already an integer, or a special value:\n      res = arg;\n      return;\n   }\n   if (shift >= (shift_type)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count)\n   {\n      bool s     = arg.sign(); // takes care of signed zeros\n      res        = static_cast<signed_limb_type>(arg.sign() ? 0 : 1);\n      res.sign() = s;\n      return;\n   }\n   bool fractional = (shift_type)eval_lsb(arg.bits()) < shift;\n   res             = arg;\n   eval_right_shift(res.bits(), shift);\n   if (fractional && !res.sign())\n   {\n      eval_increment(res.bits());\n      if ((std::ptrdiff_t)eval_msb(res.bits()) != cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1 - shift)\n      {\n         // Must have extended result by one bit in the increment:\n         --shift;\n         ++res.exponent();\n      }\n   }\n   eval_left_shift(res.bits(), shift);\n}\n\ntemplate <unsigned D1, backends::digit_base_type B1, class A1, class E1, E1 M1, E1 M2>\nint eval_signbit(const cpp_bin_float<D1, B1, A1, E1, M1, M2>& val)\n{\n   return val.sign();\n}\n\ntemplate <unsigned D1, backends::digit_base_type B1, class A1, class E1, E1 M1, E1 M2>\ninline std::size_t hash_value(const cpp_bin_float<D1, B1, A1, E1, M1, M2>& val)\n{\n   std::size_t result = hash_value(val.bits());\n   boost::multiprecision::detail::hash_combine(result, val.exponent(), val.sign());\n   return result;\n}\n\n} // namespace backends\n\nnamespace detail {\n\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinExponent, Exponent MaxExponent>\nstruct transcendental_reduction_type<boost::multiprecision::backends::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent> >\n{\n   //\n   // The type used for trigonometric reduction needs 3 times the precision of the base type.\n   // This is double the precision of the original type, plus the largest exponent supported.\n   // As a practical measure the largest argument supported is 1/eps, as supporting larger\n   // arguments requires the division of argument by PI/2 to also be done at higher precision,\n   // otherwise the result (an integer) can not be represented exactly.\n   // \n   // See ARGUMENT REDUCTION FOR HUGE ARGUMENTS. K C Ng.\n   //\n   using type = boost::multiprecision::backends::cpp_bin_float<\n       boost::multiprecision::backends::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent>::bit_count * 3, \n       boost::multiprecision::backends::digit_base_2, \n       Allocator, Exponent, MinExponent, MaxExponent>;\n};\n#ifdef BOOST_HAS_INT128\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinExponent, Exponent MaxExponent>\nstruct is_convertible_arithmetic<int128_type, boost::multiprecision::backends::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent> > : public std::true_type\n{};\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinExponent, Exponent MaxExponent>\nstruct is_convertible_arithmetic<uint128_type, boost::multiprecision::backends::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent> > : public std::true_type\n{};\n#endif\n\n} // namespace detail\n\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Exponent, Exponent MinE, Exponent MaxE, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates>\n    copysign BOOST_PREVENT_MACRO_SUBSTITUTION(\n        const boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates>& a,\n        const boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates>& b)\n{\n   boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> res(a);\n   res.backend().sign() = b.backend().sign();\n   return res;\n}\n\nusing backends::cpp_bin_float;\nusing backends::digit_base_10;\nusing backends::digit_base_2;\n\ntemplate <unsigned Digits, backends::digit_base_type DigitBase, class Exponent, Exponent MinE, Exponent MaxE, class Allocator>\nstruct number_category<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > : public std::integral_constant<int, boost::multiprecision::number_kind_floating_point>\n{};\n\ntemplate <unsigned Digits, backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>\nstruct expression_template_default<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> >\n{\n   static constexpr expression_template_option value = std::is_void<Allocator>::value ? et_off : et_on;\n};\n\ntemplate <unsigned Digits, backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class Allocator2, class Exponent2, Exponent MinE2, Exponent MaxE2>\nstruct is_equivalent_number_type<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, cpp_bin_float<Digits, DigitBase, Allocator2, Exponent2, MinE2, MaxE2> >\n   : public std::integral_constant<bool, true> {};\n\nusing cpp_bin_float_50 = number<backends::cpp_bin_float<50> > ;\nusing cpp_bin_float_100 = number<backends::cpp_bin_float<100> >;\n\nusing cpp_bin_float_single = number<backends::cpp_bin_float<24, backends::digit_base_2, void, std::int16_t, -126, 127>, et_off>       ;\nusing cpp_bin_float_double = number<backends::cpp_bin_float<53, backends::digit_base_2, void, std::int16_t, -1022, 1023>, et_off>     ;\nusing cpp_bin_float_double_extended = number<backends::cpp_bin_float<64, backends::digit_base_2, void, std::int16_t, -16382, 16383>, et_off>   ;\nusing cpp_bin_float_quad = number<backends::cpp_bin_float<113, backends::digit_base_2, void, std::int16_t, -16382, 16383>, et_off>  ;\nusing cpp_bin_float_oct = number<backends::cpp_bin_float<237, backends::digit_base_2, void, std::int32_t, -262142, 262143>, et_off>;\n\n} // namespace multiprecision\n\nnamespace math {\n\nusing boost::multiprecision::copysign;\nusing boost::multiprecision::signbit;\n\n} // namespace math\n\n} // namespace boost\n\n#include <boost/multiprecision/cpp_bin_float/io.hpp>\n#include <boost/multiprecision/cpp_bin_float/transcendental.hpp>\n\nnamespace std {\n\n//\n// numeric_limits [partial] specializations for the types declared in this header:\n//\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nclass numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >\n{\n   using number_type = boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates>;\n\n private:\n    //\n    // Functions to calculate cached values stored in static values:\n    //\n    static number_type get_min()\n    {\n       using ui_type = typename std::tuple_element<0, typename number_type::backend_type::unsigned_types>::type;\n       number_type value(ui_type(1u));\n       value.backend().exponent() = boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent;\n       return value;\n    }\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4127) // conditional expression is constant\n#endif\n    static number_type get_max()\n    {\n       number_type value;\n       BOOST_IF_CONSTEXPR(std::is_void<Allocator>::value)\n          eval_complement(value.backend().bits(), value.backend().bits());\n       else\n       {\n          // We jump through hoops here using the backend type directly just to keep VC12 happy\n          // (ie compiler workaround, for very strange compiler bug):\n          using boost::multiprecision::default_ops::eval_add;\n          using boost::multiprecision::default_ops::eval_decrement;\n          using boost::multiprecision::default_ops::eval_left_shift;\n          using int_backend_type = typename number_type::backend_type::rep_type;\n          using ui_type = typename std::tuple_element<0, typename int_backend_type::unsigned_types>::type;\n          int_backend_type                                                                    i;\n          i = ui_type(1u);\n          eval_left_shift(i, boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1);\n          int_backend_type j(i);\n          eval_decrement(i);\n          eval_add(j, i);\n          value.backend().bits() = j;\n       }\n       value.backend().exponent() = boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent;\n       return value;\n    }\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n    static number_type get_epsilon()\n    {\n       using ui_type = typename std::tuple_element<0, typename number_type::backend_type::unsigned_types>::type;\n       number_type value(ui_type(1u));\n       return ldexp(value, 1 - static_cast<int>(digits));\n    }\n    // What value should this be????\n    static number_type get_round_error()\n    {\n       // returns 0.5\n       return ldexp(number_type(1u), -1);\n    }\n    static number_type get_infinity()\n    {\n       number_type value;\n       value.backend().exponent() = boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity;\n       return value;\n    }\n    static number_type get_quiet_NaN()\n    {\n       number_type value;\n       value.backend().exponent() = boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan;\n       return value;\n    }\n\n public:\n   static constexpr bool is_specialized = true;\n   static number_type(min)()\n   {\n      // C++11 thread safe static initialization:\n      static number_type value = get_min();\n      return value;\n   }\n   static number_type(max)()\n   {\n      // C++11 thread safe static initialization:\n      static number_type value = get_max();\n      return value;\n   }\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n   static constexpr number_type lowest()\n   {\n      return -(max)();\n   }\n   static constexpr int digits   = boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count;\n   static constexpr int digits10 = boost::multiprecision::detail::calc_digits10<static_cast<unsigned>(digits)>::value;\n   // Is this really correct???\n   static constexpr int  max_digits10 = boost::multiprecision::detail::calc_max_digits10<static_cast<unsigned>(digits)>::value;\n   static constexpr bool is_signed    = true;\n   static constexpr bool is_integer   = false;\n   static constexpr bool is_exact     = false;\n   static constexpr int  radix        = 2;\n   static number_type          epsilon()\n   {\n      // C++11 thread safe static initialization:\n      static number_type value = get_epsilon();\n      return value;\n   }\n   // What value should this be????\n   static number_type round_error()\n   {\n      // returns 0.5\n      // C++11 thread safe static initialization:\n      static number_type value = get_round_error();\n      return value;\n   }\n   static constexpr typename boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type min_exponent      = boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent;\n   static constexpr typename boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type min_exponent10    = (min_exponent / 1000) * 301L;\n   static constexpr typename boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type max_exponent      = boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent;\n   static constexpr typename boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type max_exponent10    = (max_exponent / 1000) * 301L;\n   static constexpr bool                                                                                                             has_infinity      = true;\n   static constexpr bool                                                                                                             has_quiet_NaN     = true;\n   static constexpr bool                                                                                                             has_signaling_NaN = false;\n   static constexpr float_denorm_style has_denorm                                                                                                      = denorm_absent;\n   static constexpr bool               has_denorm_loss                                                                                                 = false;\n   static number_type infinity()\n   {\n      // C++11 thread safe static initialization:\n      static number_type value = get_infinity();\n      return value;\n   }\n   static number_type quiet_NaN()\n   {\n      // C++11 thread safe static initialization:\n      static number_type value = get_quiet_NaN();\n      return value;\n   }\n   static constexpr number_type signaling_NaN()\n   {\n      return number_type(0);\n   }\n   static constexpr number_type denorm_min() { return number_type(0); }\n   static constexpr bool        is_iec559         = false;\n   static constexpr bool        is_bounded        = true;\n   static constexpr bool        is_modulo         = false;\n   static constexpr bool        traps             = true;\n   static constexpr bool        tinyness_before   = false;\n   static constexpr float_round_style round_style = round_to_nearest;\n};\n\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::digits;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::digits10;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::max_digits10;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::is_signed;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::is_integer;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::is_exact;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::radix;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr typename boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::min_exponent;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr typename boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::min_exponent10;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr typename boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::max_exponent;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr typename boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::max_exponent10;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::has_infinity;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::has_quiet_NaN;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::has_signaling_NaN;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_denorm_style numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::has_denorm;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::has_denorm_loss;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::is_iec559;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::is_bounded;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::is_modulo;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::traps;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::tinyness_before;\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_round_style numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::round_style;\n\n\n} // namespace std\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_complex.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_CPP_COMPLEX_HPP\n#define BOOST_MP_CPP_COMPLEX_HPP\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/complex_adaptor.hpp>\n\nnamespace boost {\nnamespace multiprecision {\n\ntemplate <unsigned Digits, backends::digit_base_type DigitBase = backends::digit_base_10, class Allocator = void, class Exponent = int, Exponent MinExponent = 0, Exponent MaxExponent = 0>\nusing cpp_complex_backend = complex_adaptor<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent> >;\n\ntemplate <unsigned Digits, backends::digit_base_type DigitBase = digit_base_10, class Allocator = void, class Exponent = int, Exponent MinExponent = 0, Exponent MaxExponent = 0, expression_template_option ExpressionTemplates = et_off>\nusing cpp_complex = number<complex_adaptor<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent> >, ExpressionTemplates>;\n\nusing cpp_complex_50 = cpp_complex<50> ;\nusing cpp_complex_100 = cpp_complex<100>;\n\nusing cpp_complex_single = cpp_complex<24, backends::digit_base_2, void, std::int16_t, -126, 127>       ;\nusing cpp_complex_double = cpp_complex<53, backends::digit_base_2, void, std::int16_t, -1022, 1023>     ;\nusing cpp_complex_extended = cpp_complex<64, backends::digit_base_2, void, std::int16_t, -16382, 16383>   ;\nusing cpp_complex_quad = cpp_complex<113, backends::digit_base_2, void, std::int16_t, -16382, 16383>  ;\nusing cpp_complex_oct = cpp_complex<237, backends::digit_base_2, void, std::int32_t, -262142, 262143>;\n\n}\n} // namespace boost::multiprecision\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_dec_float.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n// Copyright Christopher Kormanyos 2002 - 2021.\n// Copyright 2011 -2021 John Maddock. Distributed under the Boost\n// Software License, Version 1.0. (See accompanying file\n// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n//\n// There are some \"noexcept\" specifications on the functions in this file.\n// Unlike in pre-C++11 versions, compilers can now detect noexcept misuse\n// at compile time, allowing for simple use of it here.\n//\n\n#ifndef BOOST_MP_CPP_DEC_FLOAT_HPP\n#define BOOST_MP_CPP_DEC_FLOAT_HPP\n\n#include <cmath>\n#include <cstdint>\n#include <cstdlib>\n#include <algorithm>\n#include <array>\n#include <initializer_list>\n#include <iomanip>\n#include <string>\n#include <limits>\n#include <stdexcept>\n#include <sstream>\n#include <locale>\n#include <ios>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/number.hpp>\n#include <boost/multiprecision/detail/fpclassify.hpp>\n#include <boost/multiprecision/detail/dynamic_array.hpp>\n#include <boost/multiprecision/detail/hash.hpp>\n#include <boost/multiprecision/detail/float128_functions.hpp>\n#include <boost/multiprecision/detail/itos.hpp>\n#include <boost/multiprecision/detail/static_array.hpp>\n#include <boost/multiprecision/detail/tables.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n\n#ifdef BOOST_MP_MATH_AVAILABLE\n//\n// Headers required for Boost.Math integration:\n//\n#include <boost/math/policies/policy.hpp>\n//\n// Some includes we need from Boost.Math, since we rely on that library to provide these functions:\n//\n#include <boost/math/special_functions/acosh.hpp>\n#include <boost/math/special_functions/asinh.hpp>\n#include <boost/math/special_functions/atanh.hpp>\n#include <boost/math/special_functions/cbrt.hpp>\n#include <boost/math/special_functions/expm1.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#endif\n\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 6326) // comparison of two constants\n#endif\n\nnamespace boost {\nnamespace multiprecision {\nnamespace backends {\n\ntemplate <unsigned Digits10, class ExponentType = std::int32_t, class Allocator = void>\nclass cpp_dec_float;\n\n} // namespace backends\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nstruct number_category<backends::cpp_dec_float<Digits10, ExponentType, Allocator> > : public std::integral_constant<int, number_kind_floating_point>\n{};\n\nnamespace backends {\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nclass cpp_dec_float\n{\n private:\n   // Perform some static sanity checks.\n   static_assert(boost::multiprecision::detail::is_signed<ExponentType>::value,\n                 \"ExponentType must be a signed built in integer type.\");\n\n   static_assert(sizeof(ExponentType) > 1,\n                 \"ExponentType is too small.\");\n\n   static_assert(Digits10 < UINT32_C(0x80000000),\n                 \"Digits10 exceeds the maximum.\");\n\n   // Private class-local constants.\n   static constexpr std::int32_t  cpp_dec_float_digits10_limit_lo = INT32_C(9);\n   static constexpr std::int32_t  cpp_dec_float_digits10_limit_hi = static_cast<std::int32_t>((std::numeric_limits<std::int32_t>::max)() - 100);\n\n   static constexpr std::int32_t cpp_dec_float_elem_digits10      = INT32_C(8);\n   static constexpr std::int32_t cpp_dec_float_elem_mask          = INT32_C(100000000);\n\n   static constexpr std::int32_t cpp_dec_float_elems_for_kara     = static_cast<std::int32_t>(128 + 1);\n\n public:\n   using signed_types   = std::tuple<long long> ;\n   using unsigned_types = std::tuple<unsigned long long>;\n   using float_types    = std::tuple<double, long double>;\n   using exponent_type  = ExponentType;\n\n   // Public class-local constants.\n   static constexpr std::int32_t  cpp_dec_float_radix             = INT32_C(10);\n   static constexpr std::int32_t  cpp_dec_float_digits10          = ((static_cast<std::int32_t>(Digits10) < cpp_dec_float_digits10_limit_lo) ? cpp_dec_float_digits10_limit_lo : ((static_cast<std::int32_t>(Digits10) > cpp_dec_float_digits10_limit_hi) ? cpp_dec_float_digits10_limit_hi : static_cast<std::int32_t>(Digits10)));\n   static constexpr exponent_type cpp_dec_float_max_exp10         = (static_cast<exponent_type>(1) << (std::numeric_limits<exponent_type>::digits - 5));\n   static constexpr exponent_type cpp_dec_float_min_exp10         = -cpp_dec_float_max_exp10;\n   static constexpr exponent_type cpp_dec_float_max_exp           = cpp_dec_float_max_exp10;\n   static constexpr exponent_type cpp_dec_float_min_exp           = cpp_dec_float_min_exp10;\n\n   static_assert(cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_max_exp10 == -cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_min_exp10, \"Failed exponent range check\");\n\n   static_assert(0 == cpp_dec_float_max_exp10 % cpp_dec_float_elem_digits10, \"Failed digit sanity check\");\n\n private:\n   // There are three guard limbs.\n   // 1) The first limb has 'play' from 1...8 decimal digits.\n   // 2) The last limb also has 'play' from 1...8 decimal digits.\n   // 3) One limb can get lost when justifying after multiply.\n   static constexpr std::int32_t cpp_dec_float_elem_number    = static_cast<std::int32_t>(((Digits10 / cpp_dec_float_elem_digits10) + (((Digits10 % cpp_dec_float_elem_digits10) != 0) ? 1 : 0)) + 3);\n\n public:\n   static constexpr std::int32_t cpp_dec_float_max_digits10   = static_cast<std::int32_t>(cpp_dec_float_elem_number * cpp_dec_float_elem_digits10);\n\n private:\n   using array_type =\n      typename std::conditional<std::is_void<Allocator>::value,\n                                detail::static_array <std::uint32_t, static_cast<std::uint32_t>(cpp_dec_float_elem_number)>,\n                                detail::dynamic_array<std::uint32_t, static_cast<std::uint32_t>(cpp_dec_float_elem_number), Allocator> >::type;\n\n   typedef enum enum_fpclass_type\n   {\n      cpp_dec_float_finite,\n      cpp_dec_float_inf,\n      cpp_dec_float_NaN\n   } fpclass_type;\n\n   array_type    data;\n   exponent_type exp;\n   bool          neg;\n   fpclass_type  fpclass;\n   std::int32_t  prec_elem;\n\n   // Private constructor from the floating-point class type.\n   explicit cpp_dec_float(fpclass_type c) : data(),\n                                            exp(static_cast<exponent_type>(0)),\n                                            neg(false),\n                                            fpclass(c),\n                                            prec_elem(cpp_dec_float_elem_number) {}\n\n   // Constructor from an initializer_list, an optional\n   // (value-aligned) exponent and a Boolean sign.\n   static cpp_dec_float from_lst(std::initializer_list<std::uint32_t> lst,\n                                 const exponent_type e = 0,\n                                 const bool n = false)\n   {\n      cpp_dec_float a;\n\n      a.data      = array_type(lst);\n      a.exp       = e;\n      a.neg       = n;\n      a.fpclass   = cpp_dec_float_finite;\n      a.prec_elem = cpp_dec_float_elem_number;\n\n      return a;\n   }\n\n public:\n   // Public Constructors\n   cpp_dec_float() noexcept(noexcept(array_type())) : data(),\n                                                      exp(static_cast<exponent_type>(0)),\n                                                      neg(false),\n                                                      fpclass(cpp_dec_float_finite),\n                                                      prec_elem(cpp_dec_float_elem_number) {}\n\n   cpp_dec_float(const char* s) : data(),\n                                  exp(static_cast<exponent_type>(0)),\n                                  neg(false),\n                                  fpclass(cpp_dec_float_finite),\n                                  prec_elem(cpp_dec_float_elem_number)\n   {\n      *this = s;\n   }\n\n   template <class I>\n   cpp_dec_float(I i,\n                 typename std::enable_if<boost::multiprecision::detail::is_unsigned<I>::value && (sizeof(I) <= sizeof(long long))>::type* = nullptr)\n      : data(),\n        exp(static_cast<exponent_type>(0)),\n        neg(false),\n        fpclass(cpp_dec_float_finite),\n        prec_elem(cpp_dec_float_elem_number)\n   {\n      from_unsigned_long_long(i);\n   }\n\n   template <class I>\n   cpp_dec_float(I i,\n                 typename std::enable_if<(   boost::multiprecision::detail::is_signed<I>::value\n                                          && boost::multiprecision::detail::is_integral<I>::value\n                                          && (sizeof(I) <= sizeof(long long)))>::type* = nullptr)\n      : data(),\n        exp(static_cast<exponent_type>(0)),\n        neg(false),\n        fpclass(cpp_dec_float_finite),\n        prec_elem(cpp_dec_float_elem_number)\n   {\n      if (i < 0)\n      {\n         from_unsigned_long_long(boost::multiprecision::detail::unsigned_abs(i));\n         negate();\n      }\n      else\n         from_unsigned_long_long(static_cast<unsigned long long>(i));\n   }\n\n   cpp_dec_float(const cpp_dec_float& f) noexcept(noexcept(array_type(std::declval<const array_type&>())))\n      : data(f.data),\n        exp(f.exp),\n        neg(f.neg),\n        fpclass(f.fpclass),\n        prec_elem(f.prec_elem) {}\n\n   template <unsigned D, class ET, class A>\n   cpp_dec_float(const cpp_dec_float<D, ET, A>& f, typename std::enable_if<D <= Digits10>::type* = nullptr)\n      : data(),\n        exp(f.exp),\n        neg(f.neg),\n        fpclass(static_cast<fpclass_type>(static_cast<int>(f.fpclass))),\n        prec_elem(cpp_dec_float_elem_number)\n   {\n      std::copy(f.data.begin(), f.data.begin() + f.prec_elem, data.begin());\n   }\n   template <unsigned D, class ET, class A>\n   explicit cpp_dec_float(const cpp_dec_float<D, ET, A>& f, typename std::enable_if< !(D <= Digits10)>::type* = nullptr)\n      : data(),\n        exp(f.exp),\n        neg(f.neg),\n        fpclass(static_cast<fpclass_type>(static_cast<int>(f.fpclass))),\n        prec_elem(cpp_dec_float_elem_number)\n   {\n      // TODO: this doesn't round!\n      std::copy(f.data.begin(), f.data.begin() + prec_elem, data.begin());\n   }\n\n   template <class F>\n   cpp_dec_float(const F val, typename std::enable_if<std::is_floating_point<F>::value\n                                                   >::type* = nullptr) : data(),\n                                                                         exp(static_cast<exponent_type>(0)),\n                                                                         neg(false),\n                                                                         fpclass(cpp_dec_float_finite),\n                                                                         prec_elem(cpp_dec_float_elem_number)\n   {\n      *this = val;\n   }\n\n   cpp_dec_float(const double mantissa, const exponent_type exponent);\n\n   std::size_t hash() const\n   {\n      std::size_t result = 0;\n      for (int i = 0; i < prec_elem; ++i)\n         boost::multiprecision::detail::hash_combine(result, data[i]);\n      boost::multiprecision::detail::hash_combine(result, exp, neg, static_cast<std::size_t>(fpclass));\n      return result;\n   }\n\n   // Specific special values.\n   static const cpp_dec_float&  nan () { static const cpp_dec_float val(cpp_dec_float_NaN); return val; }\n   static const cpp_dec_float&  inf () { static const cpp_dec_float val(cpp_dec_float_inf); return val; }\n   static const cpp_dec_float& (max)() { static const cpp_dec_float val(from_lst({ std::uint32_t(1u) }, cpp_dec_float_max_exp10)); return val; }\n   static const cpp_dec_float& (min)() { static const cpp_dec_float val(from_lst({ std::uint32_t(1u) }, cpp_dec_float_min_exp10)); return val; }\n   static const cpp_dec_float&  zero() { static const cpp_dec_float val(from_lst({ std::uint32_t(0u) })); return val; }\n   static const cpp_dec_float&  one () { static const cpp_dec_float val(from_lst({ std::uint32_t(1u) })); return val; }\n   static const cpp_dec_float&  two () { static const cpp_dec_float val(from_lst({ std::uint32_t(2u) })); return val; }\n   static const cpp_dec_float&  half() { static const cpp_dec_float val(from_lst({ std::uint32_t(cpp_dec_float_elem_mask / 2)}, -8)); return val; }\n\n   static const cpp_dec_float& double_min() { static const cpp_dec_float val((std::numeric_limits<double>::min)()); return val; }\n   static const cpp_dec_float& double_max() { static const cpp_dec_float val((std::numeric_limits<double>::max)()); return val; }\n\n   static const cpp_dec_float& long_double_min()\n   {\n#ifdef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS\n      static const cpp_dec_float val(static_cast<long double>((std::numeric_limits<double>::min)()));\n#else\n      static const cpp_dec_float val((std::numeric_limits<long double>::min)());\n#endif\n      return val;\n   }\n\n   static const cpp_dec_float& long_double_max()\n   {\n#ifdef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS\n      static const cpp_dec_float val(static_cast<long double>((std::numeric_limits<double>::max)()));\n#else\n      static const cpp_dec_float val((std::numeric_limits<long double>::max)());\n#endif\n      return val;\n   }\n\n   static const cpp_dec_float& long_long_max () { static const cpp_dec_float val((std::numeric_limits<long long>::max)()); return val; }\n   static const cpp_dec_float& long_long_min () { static const cpp_dec_float val((std::numeric_limits<long long>::min)()); return val; }\n   static const cpp_dec_float& ulong_long_max() { static const cpp_dec_float val((std::numeric_limits<unsigned long long>::max)()); return val; }\n\n   static const cpp_dec_float& eps()\n   {\n      static const cpp_dec_float val\n      (\n        from_lst\n        (\n          {\n            (std::uint32_t) detail::pow10_maker((std::uint32_t) ((std::int32_t) (INT32_C(1) + (std::int32_t) (((cpp_dec_float_digits10 / cpp_dec_float_elem_digits10) + ((cpp_dec_float_digits10 % cpp_dec_float_elem_digits10) != 0 ? 1 : 0)) * cpp_dec_float_elem_digits10)) - cpp_dec_float_digits10))\n          },\n          -(exponent_type) (((cpp_dec_float_digits10 / cpp_dec_float_elem_digits10) + ((cpp_dec_float_digits10 % cpp_dec_float_elem_digits10) != 0 ? 1 : 0)) * cpp_dec_float_elem_digits10)\n        )\n      );\n\n      return val;\n   }\n\n   // Basic operations.\n   cpp_dec_float& operator=(const cpp_dec_float& v) noexcept(noexcept(std::declval<array_type&>() = std::declval<const array_type&>()))\n   {\n      data      = v.data;\n      exp       = v.exp;\n      neg       = v.neg;\n      fpclass   = v.fpclass;\n      prec_elem = v.prec_elem;\n      return *this;\n   }\n\n   template <unsigned D>\n   cpp_dec_float& operator=(const cpp_dec_float<D>& f)\n   {\n      exp            = f.exp;\n      neg            = f.neg;\n      fpclass        = static_cast<enum_fpclass_type>(static_cast<int>(f.fpclass));\n      unsigned elems = (std::min)(f.prec_elem, cpp_dec_float_elem_number);\n      std::copy(f.data.begin(), f.data.begin() + elems, data.begin());\n      std::fill(data.begin() + elems, data.end(), 0);\n      prec_elem = cpp_dec_float_elem_number;\n      return *this;\n   }\n\n   cpp_dec_float& operator=(long long v)\n   {\n      if (v < 0)\n      {\n         from_unsigned_long_long(boost::multiprecision::detail::unsigned_abs(v));\n         negate();\n      }\n      else\n      {\n         using local_ulonglong_type = typename boost::multiprecision::detail::make_unsigned<long long>::type;\n\n         from_unsigned_long_long(static_cast<local_ulonglong_type>(v));\n      }\n      return *this;\n   }\n\n   cpp_dec_float& operator=(unsigned long long v)\n   {\n      from_unsigned_long_long(v);\n      return *this;\n   }\n#ifdef BOOST_HAS_INT128\n   cpp_dec_float& operator=(int128_type v)\n   {\n      *this = boost::multiprecision::detail::unsigned_abs(v);\n      if (v < 0)\n         negate();\n      return *this;\n   }\n\n   cpp_dec_float& operator=(uint128_type v)\n   {\n      using default_ops::eval_add;\n      using default_ops::eval_multiply;\n\n      constexpr unsigned     bit_shift = sizeof(unsigned long long) * CHAR_BIT;\n      constexpr uint128_type mask      = (static_cast<uint128_type>(1u) << bit_shift) - 1;\n\n      *this = static_cast<unsigned long long>(v & mask);\n\n      v >>= bit_shift;\n\n      while (v)\n      {\n         cpp_dec_float t(static_cast<unsigned long long>(v & mask));\n         eval_multiply(t, cpp_dec_float::pow2(bit_shift));\n         eval_add(*this, t);\n         v >>= bit_shift;\n      }\n      return *this;\n   }\n#endif\n\n   template <class Float>\n   typename std::enable_if<std::is_floating_point<Float>::value, cpp_dec_float&>::type operator=(Float v);\n\n   cpp_dec_float& operator=(const char* v)\n   {\n      rd_string(v);\n      return *this;\n   }\n\n   cpp_dec_float& operator+=(const cpp_dec_float& v);\n   cpp_dec_float& operator-=(const cpp_dec_float& v);\n   cpp_dec_float& operator*=(const cpp_dec_float& v);\n   cpp_dec_float& operator/=(const cpp_dec_float& v);\n\n   cpp_dec_float& add_unsigned_long_long(const unsigned long long n)\n   {\n      cpp_dec_float t;\n      t.from_unsigned_long_long(n);\n      return *this += t;\n   }\n\n   cpp_dec_float& sub_unsigned_long_long(const unsigned long long n)\n   {\n      cpp_dec_float t;\n      t.from_unsigned_long_long(n);\n      return *this -= t;\n   }\n\n   cpp_dec_float& mul_unsigned_long_long(const unsigned long long n);\n   cpp_dec_float& div_unsigned_long_long(const unsigned long long n);\n\n   // Elementary primitives.\n   cpp_dec_float& calculate_inv();\n   cpp_dec_float& calculate_sqrt();\n\n   void negate()\n   {\n      if (!iszero())\n         neg = !neg;\n   }\n\n   // Comparison functions\n   bool isnan BOOST_PREVENT_MACRO_SUBSTITUTION() const { return (fpclass == cpp_dec_float_NaN); }\n   bool isinf BOOST_PREVENT_MACRO_SUBSTITUTION() const { return (fpclass == cpp_dec_float_inf); }\n   bool isfinite BOOST_PREVENT_MACRO_SUBSTITUTION() const { return (fpclass == cpp_dec_float_finite); }\n\n   bool iszero() const\n   {\n      return ((fpclass == cpp_dec_float_finite) && (data[0u] == 0u));\n   }\n\n   bool isone() const;\n   bool isint() const;\n   bool isneg() const { return neg; }\n\n   // Operators pre-increment and pre-decrement\n   cpp_dec_float& operator++()\n   {\n      return *this += one();\n   }\n\n   cpp_dec_float& operator--()\n   {\n      return *this -= one();\n   }\n\n   std::string str(std::intmax_t digits, std::ios_base::fmtflags f) const;\n\n   int compare(const cpp_dec_float& v) const;\n\n   template <class V>\n   int compare(const V& v) const\n   {\n      cpp_dec_float<Digits10, ExponentType, Allocator> t;\n      t = v;\n      return compare(t);\n   }\n\n   void swap(cpp_dec_float& v)\n   {\n      data.swap(v.data);\n      std::swap(exp, v.exp);\n      std::swap(neg, v.neg);\n      std::swap(fpclass, v.fpclass);\n      std::swap(prec_elem, v.prec_elem);\n   }\n\n   double                 extract_double() const;\n   long double            extract_long_double() const;\n   long long  extract_signed_long_long() const;\n   unsigned long long extract_unsigned_long_long() const;\n#ifdef BOOST_HAS_INT128\n   int128_type  extract_signed_int128() const;\n   uint128_type extract_unsigned_int128() const;\n#endif\n   void                   extract_parts(double& mantissa, exponent_type& exponent) const;\n   cpp_dec_float          extract_integer_part() const;\n\n   void precision(const std::int32_t prec_digits)\n   {\n      const std::int32_t elems =\n        static_cast<std::int32_t>(    static_cast<std::int32_t>(prec_digits / cpp_dec_float_elem_digits10)\n                                  +                          (((prec_digits % cpp_dec_float_elem_digits10) != 0) ? 1 : 0));\n\n      prec_elem = (std::min)(cpp_dec_float_elem_number, (std::max)(elems, static_cast<std::int32_t>(2)));\n   }\n   static cpp_dec_float pow2(long long i);\n   exponent_type order() const\n   {\n      const bool bo_order_is_zero = ((!(isfinite)()) || (data[0] == static_cast<std::uint32_t>(0u)));\n      //\n      // Binary search to find the order of the leading term:\n      //\n      exponent_type prefix = 0;\n\n      if (data[0] >= 100000UL)\n      {\n         if (data[0] >= 10000000UL)\n         {\n            if (data[0] >= 100000000UL)\n            {\n               if (data[0] >= 1000000000UL)\n                  prefix = 9;\n               else\n                  prefix = 8;\n            }\n            else\n               prefix = 7;\n         }\n         else\n         {\n            if (data[0] >= 1000000UL)\n               prefix = 6;\n            else\n               prefix = 5;\n         }\n      }\n      else\n      {\n         if (data[0] >= 1000UL)\n         {\n            if (data[0] >= 10000UL)\n               prefix = 4;\n            else\n               prefix = 3;\n         }\n         else\n         {\n            if (data[0] >= 100)\n               prefix = 2;\n            else if (data[0] >= 10)\n               prefix = 1;\n         }\n      }\n\n      return (bo_order_is_zero ? static_cast<exponent_type>(0) : static_cast<exponent_type>(exp + prefix));\n   }\n\n   #ifndef BOOST_MP_STANDALONE\n   template <class Archive>\n   void serialize(Archive& ar, const unsigned int /*version*/)\n   {\n      for (unsigned i = 0; i < data.size(); ++i)\n         ar& boost::make_nvp(\"digit\", data[i]);\n      ar& boost::make_nvp(\"exponent\", exp);\n      ar& boost::make_nvp(\"sign\", neg);\n      ar& boost::make_nvp(\"class-type\", fpclass);\n      ar& boost::make_nvp(\"precision\", prec_elem);\n   }\n   #endif\n\n private:\n   static bool data_elem_is_non_zero_predicate(const std::uint32_t& d) { return (d != static_cast<std::uint32_t>(0u)); }\n   static bool data_elem_is_non_nine_predicate(const std::uint32_t& d) { return (d != static_cast<std::uint32_t>(cpp_dec_float::cpp_dec_float_elem_mask - 1)); }\n   static bool char_is_nonzero_predicate(const char& c) { return (c != static_cast<char>('0')); }\n\n   void from_unsigned_long_long(const unsigned long long u);\n\n   template <typename InputIteratorTypeLeft,\n             typename InputIteratorTypeRight>\n   static int compare_ranges(InputIteratorTypeLeft  a,\n                             InputIteratorTypeRight b,\n                             const std::uint32_t    count = cpp_dec_float_elem_number);\n\n   static std::uint32_t eval_add_n(      std::uint32_t* r,\n                                   const std::uint32_t* u,\n                                   const std::uint32_t* v,\n                                   const std::int32_t   count);\n\n   static std::uint32_t eval_subtract_n(      std::uint32_t* r,\n                                        const std::uint32_t* u,\n                                        const std::uint32_t* v,\n                                        const std::int32_t   count);\n\n   static void eval_multiply_n_by_n_to_2n(      std::uint32_t* r,\n                                          const std::uint32_t* a,\n                                          const std::uint32_t* b,\n                                          const std::uint32_t  count);\n\n   static std::uint32_t mul_loop_n(std::uint32_t* const u, std::uint32_t n, const std::int32_t p);\n   static std::uint32_t div_loop_n(std::uint32_t* const u, std::uint32_t n, const std::int32_t p);\n\n   static void eval_multiply_kara_propagate_carry (std::uint32_t* t, const std::uint32_t n, const std::uint32_t carry);\n   static void eval_multiply_kara_propagate_borrow(std::uint32_t* t, const std::uint32_t n, const bool has_borrow);\n   static void eval_multiply_kara_n_by_n_to_2n    (      std::uint32_t* r,\n                                                   const std::uint32_t* a,\n                                                   const std::uint32_t* b,\n                                                   const std::uint32_t  n,\n                                                         std::uint32_t* t);\n\n   template<unsigned D>\n   void eval_mul_dispatch_multiplication_method(\n      const cpp_dec_float<D, ExponentType, Allocator>& v,\n      const std::int32_t prec_elems_for_multiply,\n      const typename std::enable_if<   (D == Digits10)\n                                    && (cpp_dec_float<D, ExponentType, Allocator>::cpp_dec_float_elem_number < cpp_dec_float_elems_for_kara)>::type* = nullptr)\n   {\n      // Use school multiplication.\n\n      using array_for_mul_result_type =\n         typename std::conditional<std::is_void<Allocator>::value,\n                                   detail::static_array <std::uint32_t, std::uint32_t(cpp_dec_float_elem_number * 2)>,\n                                   detail::dynamic_array<std::uint32_t, std::uint32_t(cpp_dec_float_elem_number * 2), Allocator> >::type;\n\n      array_for_mul_result_type result;\n\n      eval_multiply_n_by_n_to_2n(result.data(), data.data(), v.data.data(), static_cast<std::uint32_t>(prec_elems_for_multiply));\n\n      // Handle a potential carry.\n      if(result[0U] != static_cast<std::uint32_t>(0U))\n      {\n         exp += static_cast<exponent_type>(cpp_dec_float_elem_digits10);\n\n         // Shift the result of the multiplication one element to the right.\n         std::copy(result.cbegin(),\n                   result.cbegin() + static_cast<std::ptrdiff_t>(prec_elems_for_multiply),\n                   data.begin());\n      }\n      else\n      {\n         std::copy(result.cbegin() + 1,\n                   result.cbegin() + (std::min)(static_cast<std::int32_t>(prec_elems_for_multiply + 1), cpp_dec_float_elem_number),\n                   data.begin());\n      }\n   }\n\n   template<unsigned D>\n   void eval_mul_dispatch_multiplication_method(\n      const cpp_dec_float<D, ExponentType, Allocator>& v,\n      const std::int32_t prec_elems_for_multiply,\n      const typename std::enable_if<    (D == Digits10)\n                                    && !(cpp_dec_float<D, ExponentType, Allocator>::cpp_dec_float_elem_number < cpp_dec_float_elems_for_kara)>::type* = nullptr)\n   {\n      if(prec_elems_for_multiply < cpp_dec_float_elems_for_kara)\n      {\n         // Use school multiplication.\n\n         using array_for_mul_result_type =\n            typename std::conditional<std::is_void<Allocator>::value,\n                                      detail::static_array <std::uint32_t, std::uint32_t(cpp_dec_float_elem_number * 2)>,\n                                      detail::dynamic_array<std::uint32_t, std::uint32_t(cpp_dec_float_elem_number * 2), Allocator> >::type;\n\n         array_for_mul_result_type result;\n\n         eval_multiply_n_by_n_to_2n(result.data(), data.data(), v.data.data(), static_cast<std::uint32_t>(prec_elems_for_multiply));\n\n         // Handle a potential carry.\n         if(result[0U] != static_cast<std::uint32_t>(0U))\n         {\n            exp += static_cast<exponent_type>(cpp_dec_float_elem_digits10);\n         \n            // Shift the result of the multiplication one element to the right.\n            std::copy(result.cbegin(),\n                      result.cbegin() + static_cast<std::ptrdiff_t>(prec_elems_for_multiply),\n                      data.begin());\n         }\n         else\n         {\n            std::copy(result.cbegin() + 1,\n                      result.cbegin() + (std::min)(static_cast<std::int32_t>(prec_elems_for_multiply + 1), cpp_dec_float_elem_number),\n                      data.begin());\n         }\n      }\n      else\n      {\n         // Use Karatsuba multiplication.\n\n         using array_for_kara_tmp_type =\n            typename std::conditional<std::is_void<Allocator>::value,\n                                      detail::static_array <std::uint32_t, detail::a029750::a029750_as_constexpr(static_cast<std::uint32_t>(cpp_dec_float_elem_number)) * 8U>,\n                                      detail::dynamic_array<std::uint32_t, detail::a029750::a029750_as_constexpr(static_cast<std::uint32_t>(cpp_dec_float_elem_number)) * 8U, Allocator> >::type;\n\n         // Sloanes's A029747: Numbers of the form 2^k times 1, 3 or 5.\n         const std::uint32_t kara_elems_for_multiply =\n            detail::a029750::a029750_as_runtime_value(static_cast<std::uint32_t>(prec_elems_for_multiply));\n\n         array_for_kara_tmp_type my_kara_mul_pool;\n\n         std::uint32_t* result  = my_kara_mul_pool.data() + (kara_elems_for_multiply * 0U);\n         std::uint32_t* t       = my_kara_mul_pool.data() + (kara_elems_for_multiply * 2U);\n         std::uint32_t* u_local = my_kara_mul_pool.data() + (kara_elems_for_multiply * 6U);\n         std::uint32_t* v_local = my_kara_mul_pool.data() + (kara_elems_for_multiply * 7U);\n\n         std::copy(  data.cbegin(),   data.cbegin() + prec_elems_for_multiply, u_local);\n         std::copy(v.data.cbegin(), v.data.cbegin() + prec_elems_for_multiply, v_local);\n\n         eval_multiply_kara_n_by_n_to_2n(result,\n                                         u_local,\n                                         v_local,\n                                         kara_elems_for_multiply,\n                                         t);\n\n         // Handle a potential carry.\n         if(result[0U] != static_cast<std::uint32_t>(0U))\n         {\n            exp += static_cast<exponent_type>(cpp_dec_float_elem_digits10);\n\n            // Shift the result of the multiplication one element to the right.\n            std::copy(result,\n                      result + static_cast<std::ptrdiff_t>(prec_elems_for_multiply),\n                      data.begin());\n         }\n         else\n         {\n            std::copy(result + 1,\n                      result + (std::min)(static_cast<std::int32_t>(prec_elems_for_multiply + 1), cpp_dec_float_elem_number),\n                      data.begin());\n         }\n      }\n   }\n\n   bool rd_string(const char* const s);\n\n   template <unsigned D, class ET, class A>\n   friend class cpp_dec_float;\n};\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nconstexpr std::int32_t cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_radix;\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nconstexpr std::int32_t cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_digits10_limit_lo;\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nconstexpr std::int32_t cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_digits10_limit_hi;\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nconstexpr std::int32_t cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_digits10;\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nconstexpr ExponentType cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_max_exp;\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nconstexpr ExponentType cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_min_exp;\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nconstexpr ExponentType cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_max_exp10;\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nconstexpr ExponentType cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_min_exp10;\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nconstexpr std::int32_t cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_elem_digits10;\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nconstexpr std::int32_t cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_elem_number;\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nconstexpr std::int32_t cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_elem_mask;\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ncpp_dec_float<Digits10, ExponentType, Allocator>& cpp_dec_float<Digits10, ExponentType, Allocator>::operator+=(const cpp_dec_float<Digits10, ExponentType, Allocator>& v)\n{\n   if ((isnan)())\n   {\n      return *this;\n   }\n\n   if ((isinf)())\n   {\n      if ((v.isinf)() && (isneg() != v.isneg()))\n      {\n         *this = nan();\n      }\n      return *this;\n   }\n\n   if (iszero())\n   {\n      return operator=(v);\n   }\n\n   if ((v.isnan)() || (v.isinf)())\n   {\n      *this = v;\n      return *this;\n   }\n\n   // Get the offset for the add/sub operation.\n   constexpr exponent_type max_delta_exp =\n     static_cast<exponent_type>((cpp_dec_float_elem_number - 1) * cpp_dec_float_elem_digits10);\n\n   const exponent_type ofs_exp = static_cast<exponent_type>(exp - v.exp);\n\n   // Check if the operation is out of range, requiring special handling.\n   if (v.iszero() || (ofs_exp > max_delta_exp))\n   {\n      // Result is *this unchanged since v is negligible compared to *this.\n      return *this;\n   }\n   else if (ofs_exp < -max_delta_exp)\n   {\n      // Result is *this = v since *this is negligible compared to v.\n      return operator=(v);\n   }\n\n   // Do the add/sub operation.\n\n   typename array_type::pointer       p_u    = data.data();\n   typename array_type::const_pointer p_v    = v.data.data();\n   bool                               b_copy = false;\n   const std::int32_t                 ofs    = static_cast<std::int32_t>(static_cast<std::int32_t>(ofs_exp) / cpp_dec_float_elem_digits10);\n   array_type                         n_data;\n\n   if (neg == v.neg)\n   {\n      // Add v to *this, where the data array of either *this or v\n      // might have to be treated with a positive, negative or zero offset.\n      // The result is stored in *this. The data are added one element\n      // at a time, each element with carry.\n      if (ofs >= static_cast<std::int32_t>(0))\n      {\n         std::copy(v.data.cbegin(), v.data.cend() - static_cast<std::ptrdiff_t>(ofs), n_data.begin() + static_cast<std::ptrdiff_t>(ofs));\n         std::fill(n_data.begin(), n_data.begin() + static_cast<std::ptrdiff_t>(ofs), static_cast<std::uint32_t>(0u));\n         p_v = n_data.data();\n      }\n      else\n      {\n         std::copy(data.cbegin(), data.cend() - static_cast<std::ptrdiff_t>(-ofs), n_data.begin() + static_cast<std::ptrdiff_t>(-ofs));\n         std::fill(n_data.begin(), n_data.begin() + static_cast<std::ptrdiff_t>(-ofs), static_cast<std::uint32_t>(0u));\n         p_u    = n_data.data();\n         b_copy = true;\n      }\n\n      // Addition algorithm\n      const std::uint32_t carry = eval_add_n(p_u, p_u, p_v, cpp_dec_float_elem_number);\n\n      if (b_copy)\n      {\n         data = n_data;\n         exp  = v.exp;\n      }\n\n      // There needs to be a carry into the element -1 of the array data\n      if (carry != static_cast<std::uint32_t>(0u))\n      {\n         std::copy_backward(data.cbegin(), data.cend() - static_cast<std::size_t>(1u), data.end());\n         data[0] = carry;\n         exp += static_cast<exponent_type>(cpp_dec_float_elem_digits10);\n      }\n   }\n   else\n   {\n      // Subtract v from *this, where the data array of either *this or v\n      // might have to be treated with a positive, negative or zero offset.\n      if ((ofs > static_cast<std::int32_t>(0)) || ((ofs == static_cast<std::int32_t>(0)) && (compare_ranges(data.cbegin(), v.data.cbegin()) > static_cast<std::int32_t>(0))))\n      {\n         // In this case, |u| > |v| and ofs is positive.\n         // Copy the data of v, shifted down to a lower value\n         // into the data array m_n. Set the operand pointer p_v\n         // to point to the copied, shifted data m_n.\n         std::copy(v.data.cbegin(), v.data.cend() - static_cast<std::ptrdiff_t>(ofs), n_data.begin() + static_cast<std::ptrdiff_t>(ofs));\n         std::fill(n_data.begin(), n_data.begin() + static_cast<std::ptrdiff_t>(ofs), static_cast<std::uint32_t>(0u));\n         p_v = n_data.data();\n      }\n      else\n      {\n         if (ofs != static_cast<std::int32_t>(0))\n         {\n            // In this case, |u| < |v| and ofs is negative.\n            // Shift the data of u down to a lower value.\n            std::copy_backward(data.cbegin(), data.cend() - static_cast<std::ptrdiff_t>(-ofs), data.end());\n            std::fill(data.begin(), data.begin() + static_cast<std::ptrdiff_t>(-ofs), static_cast<std::uint32_t>(0u));\n         }\n\n         // Copy the data of v into the data array n_data.\n         // Set the u-pointer p_u to point to m_n and the\n         // operand pointer p_v to point to the shifted\n         // data m_data.\n         n_data = v.data;\n         p_u    = n_data.data();\n         p_v    = data.data();\n         b_copy = true;\n      }\n\n      // Subtraction algorithm\n      static_cast<void>(eval_subtract_n(p_u, p_u, p_v, cpp_dec_float_elem_number));\n\n      if (b_copy)\n      {\n         data = n_data;\n         exp  = v.exp;\n         neg  = v.neg;\n      }\n\n      // Is it necessary to justify the data?\n      const typename array_type::const_iterator first_nonzero_elem = std::find_if(data.begin(), data.end(), data_elem_is_non_zero_predicate);\n\n      if (first_nonzero_elem != data.begin())\n      {\n         if (first_nonzero_elem == data.end())\n         {\n            // This result of the subtraction is exactly zero.\n            // Reset the sign and the exponent.\n            neg = false;\n            exp = static_cast<exponent_type>(0);\n         }\n         else\n         {\n            // Justify the data\n            const std::size_t sj = static_cast<std::size_t>(std::distance<typename array_type::const_iterator>(data.begin(), first_nonzero_elem));\n\n            std::copy(data.begin() + static_cast<std::ptrdiff_t>(sj), data.end(), data.begin());\n            std::fill(data.end() - static_cast<std::ptrdiff_t>(sj), data.end(), static_cast<std::uint32_t>(0u));\n\n            exp -= static_cast<exponent_type>(sj * static_cast<std::size_t>(cpp_dec_float_elem_digits10));\n         }\n      }\n   }\n\n   // Handle underflow.\n   if (iszero())\n      return (*this = zero());\n\n   // Check for potential overflow.\n   const bool b_result_might_overflow = (exp >= static_cast<exponent_type>(cpp_dec_float_max_exp10));\n\n   // Handle overflow.\n   if (b_result_might_overflow)\n   {\n      const bool b_result_is_neg = neg;\n      neg                        = false;\n\n      if (compare((cpp_dec_float::max)()) > 0)\n         *this = inf();\n\n      neg = b_result_is_neg;\n   }\n\n   return *this;\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ncpp_dec_float<Digits10, ExponentType, Allocator>& cpp_dec_float<Digits10, ExponentType, Allocator>::operator-=(const cpp_dec_float<Digits10, ExponentType, Allocator>& v)\n{\n   // Use *this - v = -(-*this + v).\n   negate();\n   *this += v;\n   negate();\n   return *this;\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ncpp_dec_float<Digits10, ExponentType, Allocator>& cpp_dec_float<Digits10, ExponentType, Allocator>::operator*=(const cpp_dec_float<Digits10, ExponentType, Allocator>& v)\n{\n   // Evaluate the sign of the result.\n   const bool b_result_is_neg = (neg != v.neg);\n\n   // Artificially set the sign of the result to be positive.\n   neg = false;\n\n   // Handle special cases like zero, inf and NaN.\n   const bool b_u_is_inf  = (isinf)();\n   const bool b_v_is_inf  = (v.isinf)();\n   const bool b_u_is_zero = iszero();\n   const bool b_v_is_zero = v.iszero();\n\n   if (((isnan)() || (v.isnan)()) || (b_u_is_inf && b_v_is_zero) || (b_v_is_inf && b_u_is_zero))\n   {\n      *this = nan();\n      return *this;\n   }\n\n   if (b_u_is_inf || b_v_is_inf)\n   {\n      *this = inf();\n      if (b_result_is_neg)\n         negate();\n      return *this;\n   }\n\n   if (b_u_is_zero || b_v_is_zero)\n   {\n      return *this = zero();\n   }\n\n   // Check for potential overflow or underflow.\n   const bool b_result_might_overflow  = ((exp + v.exp) >= static_cast<exponent_type>(cpp_dec_float_max_exp10));\n   const bool b_result_might_underflow = ((exp + v.exp) <= static_cast<exponent_type>(cpp_dec_float_min_exp10));\n\n   // Set the exponent of the result.\n   exp += v.exp;\n\n   const std::int32_t prec_mul = (std::min)(prec_elem, v.prec_elem);\n\n   eval_mul_dispatch_multiplication_method(v, prec_mul);\n\n   // Handle overflow.\n   if (b_result_might_overflow && (compare((cpp_dec_float::max)()) > 0))\n   {\n      *this = inf();\n   }\n\n   // Handle underflow.\n   if (b_result_might_underflow && (compare((cpp_dec_float::min)()) < 0))\n   {\n      *this = zero();\n\n      return *this;\n   }\n\n   // Set the sign of the result.\n   neg = b_result_is_neg;\n\n   return *this;\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ncpp_dec_float<Digits10, ExponentType, Allocator>& cpp_dec_float<Digits10, ExponentType, Allocator>::operator/=(const cpp_dec_float<Digits10, ExponentType, Allocator>& v)\n{\n   if (iszero())\n   {\n      if ((v.isnan)())\n      {\n         return *this = v;\n      }\n      else if (v.iszero())\n      {\n         return *this = nan();\n      }\n   }\n\n   const bool u_and_v_are_finite_and_identical = ((isfinite)() && (fpclass == v.fpclass) && (exp == v.exp) && (compare_ranges(data.cbegin(), v.data.cbegin()) == static_cast<std::int32_t>(0)));\n\n   if (u_and_v_are_finite_and_identical)\n   {\n      if (neg != v.neg)\n      {\n         *this = one();\n         negate();\n      }\n      else\n         *this = one();\n      return *this;\n   }\n   else\n   {\n      cpp_dec_float t(v);\n      t.calculate_inv();\n      return operator*=(t);\n   }\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ncpp_dec_float<Digits10, ExponentType, Allocator>& cpp_dec_float<Digits10, ExponentType, Allocator>::mul_unsigned_long_long(const unsigned long long n)\n{\n   // Multiply *this with a constant unsigned long long.\n\n   // Evaluate the sign of the result.\n   const bool b_neg = neg;\n\n   // Artificially set the sign of the result to be positive.\n   neg = false;\n\n   // Handle special cases like zero, inf and NaN.\n   const bool b_u_is_inf  = (isinf)();\n   const bool b_n_is_zero = (n == static_cast<std::int32_t>(0));\n\n   if ((isnan)() || (b_u_is_inf && b_n_is_zero))\n   {\n      return (*this = nan());\n   }\n\n   if (b_u_is_inf)\n   {\n      *this = inf();\n      if (b_neg)\n         negate();\n      return *this;\n   }\n\n   if (iszero() || b_n_is_zero)\n   {\n      // Multiplication by zero.\n      return *this = zero();\n   }\n\n   if (n >= static_cast<unsigned long long>(cpp_dec_float_elem_mask))\n   {\n      neg = b_neg;\n      cpp_dec_float t;\n      t = n;\n      return operator*=(t);\n   }\n\n   if (n == static_cast<unsigned long long>(1u))\n   {\n      neg = b_neg;\n      return *this;\n   }\n\n   // Set up the multiplication loop.\n   const std::uint32_t nn    = static_cast<std::uint32_t>(n);\n   const std::uint32_t carry = mul_loop_n(data.data(), nn, prec_elem);\n\n   // Handle the carry and adjust the exponent.\n   if (carry != static_cast<std::uint32_t>(0u))\n   {\n      exp += static_cast<exponent_type>(cpp_dec_float_elem_digits10);\n\n      // Shift the result of the multiplication one element to the right.\n      std::copy_backward(data.begin(),\n                         data.begin() + static_cast<std::ptrdiff_t>(prec_elem - static_cast<std::int32_t>(1)),\n                         data.begin() + static_cast<std::ptrdiff_t>(prec_elem));\n\n      data.front() = static_cast<std::uint32_t>(carry);\n   }\n\n   // Check for potential overflow.\n   const bool b_result_might_overflow = (exp >= cpp_dec_float_max_exp10);\n\n   // Handle overflow.\n   if (b_result_might_overflow && (compare((cpp_dec_float::max)()) > 0))\n   {\n      *this = inf();\n   }\n\n   // Set the sign.\n   neg = b_neg;\n\n   return *this;\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ncpp_dec_float<Digits10, ExponentType, Allocator>& cpp_dec_float<Digits10, ExponentType, Allocator>::div_unsigned_long_long(const unsigned long long n)\n{\n   // Divide *this by a constant unsigned long long.\n\n   // Evaluate the sign of the result.\n   const bool b_neg = neg;\n\n   // Artificially set the sign of the result to be positive.\n   neg = false;\n\n   // Handle special cases like zero, inf and NaN.\n   if ((isnan)())\n   {\n      return *this;\n   }\n\n   if ((isinf)())\n   {\n      *this = inf();\n      if (b_neg)\n         negate();\n      return *this;\n   }\n\n   if (n == static_cast<unsigned long long>(0u))\n   {\n      // Divide by 0.\n      if (iszero())\n      {\n         *this = nan();\n         return *this;\n      }\n      else\n      {\n         *this = inf();\n         if (isneg())\n            negate();\n         return *this;\n      }\n   }\n\n   if (iszero())\n   {\n      return *this;\n   }\n\n   if (n >= static_cast<unsigned long long>(cpp_dec_float_elem_mask))\n   {\n      neg = b_neg;\n      cpp_dec_float t;\n      t = n;\n      return operator/=(t);\n   }\n\n   const std::uint32_t nn = static_cast<std::uint32_t>(n);\n\n   if (nn > static_cast<std::uint32_t>(1u))\n   {\n      // Do the division loop.\n      const std::uint32_t prev = div_loop_n(data.data(), nn, prec_elem);\n\n      // Determine if one leading zero is in the result data.\n      if (data[0] == static_cast<std::uint32_t>(0u))\n      {\n         // Adjust the exponent\n         exp -= static_cast<exponent_type>(cpp_dec_float_elem_digits10);\n\n         // Shift result of the division one element to the left.\n         std::copy(data.begin() + static_cast<std::ptrdiff_t>(1),\n                   data.begin() + static_cast<std::ptrdiff_t>(prec_elem - static_cast<std::int32_t>(1)),\n                   data.begin());\n\n         data[static_cast<std::size_t>(prec_elem - static_cast<std::int32_t>(1))] = static_cast<std::uint32_t>(static_cast<std::uint64_t>(prev * static_cast<std::uint64_t>(cpp_dec_float_elem_mask)) / nn);\n      }\n   }\n\n   // Check for potential underflow.\n   const bool b_result_might_underflow = (exp <= cpp_dec_float_min_exp10);\n\n   // Handle underflow.\n   if (b_result_might_underflow && (compare((cpp_dec_float::min)()) < 0))\n      return (*this = zero());\n\n   // Set the sign of the result.\n   neg = b_neg;\n\n   return *this;\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ncpp_dec_float<Digits10, ExponentType, Allocator>& cpp_dec_float<Digits10, ExponentType, Allocator>::calculate_inv()\n{\n   // Compute the inverse of *this.\n   const bool b_neg = neg;\n\n   neg = false;\n\n   // Handle special cases like zero, inf and NaN.\n   if (iszero())\n   {\n      *this = inf();\n      if (b_neg)\n         negate();\n      return *this;\n   }\n\n   if ((isnan)())\n   {\n      return *this;\n   }\n\n   if ((isinf)())\n   {\n      return *this = zero();\n   }\n\n   if (isone())\n   {\n      if (b_neg)\n         negate();\n      return *this;\n   }\n\n   // Save the original *this.\n   cpp_dec_float<Digits10, ExponentType, Allocator> x(*this);\n\n   // Generate the initial estimate using division.\n   // Extract the mantissa and exponent for a \"manual\"\n   // computation of the estimate.\n   double        dd;\n   exponent_type ne;\n   x.extract_parts(dd, ne);\n\n   // Do the inverse estimate using double precision estimates of mantissa and exponent.\n   operator=(cpp_dec_float<Digits10, ExponentType, Allocator>(1.0 / dd, -ne));\n\n   // Compute the inverse of *this. Quadratically convergent Newton-Raphson iteration\n   // is used. During the iterative steps, the precision of the calculation is limited\n   // to the minimum required in order to minimize the run-time.\n\n   constexpr std::int32_t double_digits10_minus_a_few = std::numeric_limits<double>::digits10 - 3;\n\n   for (std::int32_t digits = double_digits10_minus_a_few; digits <= cpp_dec_float_max_digits10; digits *= static_cast<std::int32_t>(2))\n   {\n      // Adjust precision of the terms.\n      precision(static_cast<std::int32_t>((digits + 10) * static_cast<std::int32_t>(2)));\n      x.precision(static_cast<std::int32_t>((digits + 10) * static_cast<std::int32_t>(2)));\n\n      // Next iteration.\n      cpp_dec_float t(*this);\n      t *= x;\n      t -= two();\n      t.negate();\n      *this *= t;\n   }\n\n   neg = b_neg;\n\n   prec_elem = cpp_dec_float_elem_number;\n\n   return *this;\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ncpp_dec_float<Digits10, ExponentType, Allocator>& cpp_dec_float<Digits10, ExponentType, Allocator>::calculate_sqrt()\n{\n   // Compute the square root of *this.\n\n   if ((isinf)() && !isneg())\n   {\n      return *this;\n   }\n\n   if (isneg() || (!(isfinite)()))\n   {\n      *this = nan();\n      errno = EDOM;\n      return *this;\n   }\n\n   if (iszero() || isone())\n   {\n      return *this;\n   }\n\n   // Save the original *this.\n   cpp_dec_float<Digits10, ExponentType, Allocator> x(*this);\n\n   // Generate the initial estimate using division.\n   // Extract the mantissa and exponent for a \"manual\"\n   // computation of the estimate.\n   double        dd;\n   exponent_type ne;\n   extract_parts(dd, ne);\n\n   // Force the exponent to be an even multiple of two.\n   if ((ne % static_cast<exponent_type>(2)) != static_cast<exponent_type>(0))\n   {\n      ++ne;\n      dd /= 10.0;\n   }\n\n   // Setup the iteration.\n   // Estimate the square root using simple manipulations.\n   const double sqd = std::sqrt(dd);\n\n   *this = cpp_dec_float<Digits10, ExponentType, Allocator>(sqd, static_cast<ExponentType>(ne / static_cast<ExponentType>(2)));\n\n   // Estimate 1.0 / (2.0 * x0) using simple manipulations.\n   cpp_dec_float<Digits10, ExponentType, Allocator> vi(0.5 / sqd, static_cast<ExponentType>(-ne / static_cast<ExponentType>(2)));\n\n   // Compute the square root of x. Coupled Newton iteration\n   // as described in \"Pi Unleashed\" is used. During the\n   // iterative steps, the precision of the calculation is\n   // limited to the minimum required in order to minimize\n   // the run-time.\n   //\n   // Book reference to \"Pi Unleashed:\n   // https://www.springer.com/gp/book/9783642567353\n\n   constexpr std::uint32_t double_digits10_minus_a_few = std::numeric_limits<double>::digits10 - 3;\n\n   for (std::int32_t digits = double_digits10_minus_a_few; digits <= cpp_dec_float_max_digits10; digits *= 2)\n   {\n      // Adjust precision of the terms.\n      precision((digits + 10) * 2);\n      vi.precision((digits + 10) * 2);\n\n      // Next iteration of vi\n      cpp_dec_float t(*this);\n      t *= vi;\n      t.negate();\n      t.mul_unsigned_long_long(2u);\n      t += one();\n      t *= vi;\n      vi += t;\n\n      // Next iteration of *this\n      t = *this;\n      t *= *this;\n      t.negate();\n      t += x;\n      t *= vi;\n      *this += t;\n   }\n\n   prec_elem = cpp_dec_float_elem_number;\n\n   return *this;\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nint cpp_dec_float<Digits10, ExponentType, Allocator>::compare(const cpp_dec_float& v) const\n{\n   // Compare v with *this.\n   // Return +1 for *this > v\n   // 0 for *this = v\n   // -1 for *this < v\n\n   // Handle all non-finite cases.\n   if ((!(isfinite)()) || (!(v.isfinite)()))\n   {\n      // NaN can never equal NaN. Return an implementation-dependent\n      // signed result. Also note that comparison of NaN with NaN\n      // using operators greater-than or less-than is undefined.\n      if ((isnan)() || (v.isnan)())\n      {\n         return ((isnan)() ? 1 : -1);\n      }\n\n      if ((isinf)() && (v.isinf)())\n      {\n         // Both *this and v are infinite. They are equal if they have the same sign.\n         // Otherwise, *this is less than v if and only if *this is negative.\n         return ((neg == v.neg) ? 0 : (neg ? -1 : 1));\n      }\n\n      if ((isinf)())\n      {\n         // *this is infinite, but v is finite.\n         // So negative infinite *this is less than any finite v.\n         // Whereas positive infinite *this is greater than any finite v.\n         return (isneg() ? -1 : 1);\n      }\n      else\n      {\n         // *this is finite, and v is infinite.\n         // So any finite *this is greater than negative infinite v.\n         // Whereas any finite *this is less than positive infinite v.\n         return (v.neg ? 1 : -1);\n      }\n   }\n\n   // And now handle all *finite* cases.\n   if (iszero())\n   {\n      // The value of *this is zero and v is either zero or non-zero.\n      return (v.iszero() ? 0\n                         : (v.neg ? 1 : -1));\n   }\n   else if (v.iszero())\n   {\n      // The value of v is zero and *this is non-zero.\n      return (neg ? -1 : 1);\n   }\n   else\n   {\n      // Both *this and v are non-zero.\n\n      if (neg != v.neg)\n      {\n         // The signs are different.\n         return (neg ? -1 : 1);\n      }\n      else if (exp != v.exp)\n      {\n         // The signs are the same and the exponents are different.\n         const int val_cexpression = ((exp < v.exp) ? 1 : -1);\n\n         return (neg ? val_cexpression : -val_cexpression);\n      }\n      else\n      {\n         // The signs are the same and the exponents are the same.\n         // Compare the data.\n         const int val_cmp_data = compare_ranges(data.cbegin(), v.data.cbegin());\n\n         return ((!neg) ? val_cmp_data : -val_cmp_data);\n      }\n   }\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nbool cpp_dec_float<Digits10, ExponentType, Allocator>::isone() const\n{\n   // Check if the value of *this is identically 1 or very close to 1.\n\n   const bool not_negative_and_is_finite = ((!neg) && (isfinite)());\n\n   if (not_negative_and_is_finite)\n   {\n      if ((data[0u] == static_cast<std::uint32_t>(1u)) && (exp == static_cast<exponent_type>(0)))\n      {\n         const typename array_type::const_iterator it_non_zero = std::find_if(data.begin(), data.end(), data_elem_is_non_zero_predicate);\n         return (it_non_zero == data.end());\n      }\n      else if ((data[0u] == static_cast<std::uint32_t>(cpp_dec_float_elem_mask - 1)) && (exp == static_cast<exponent_type>(-cpp_dec_float_elem_digits10)))\n      {\n         const typename array_type::const_iterator it_non_nine = std::find_if(data.begin(), data.end(), data_elem_is_non_nine_predicate);\n         return (it_non_nine == data.end());\n      }\n   }\n\n   return false;\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nbool cpp_dec_float<Digits10, ExponentType, Allocator>::isint() const\n{\n   if (fpclass != cpp_dec_float_finite)\n   {\n      return false;\n   }\n\n   if (iszero())\n   {\n      return true;\n   }\n\n   if (exp < static_cast<exponent_type>(0))\n   {\n      return false;\n   } // |*this| < 1.\n\n   const typename array_type::size_type offset_decimal_part = static_cast<typename array_type::size_type>(exp / cpp_dec_float_elem_digits10) + 1u;\n\n   if (offset_decimal_part >= static_cast<typename array_type::size_type>(cpp_dec_float_elem_number))\n   {\n      // The number is too large to resolve the integer part.\n      // It considered to be a pure integer.\n      return true;\n   }\n\n   typename array_type::const_iterator it_non_zero = std::find_if(data.begin() + static_cast<std::ptrdiff_t>(offset_decimal_part), data.end(), data_elem_is_non_zero_predicate);\n\n   return (it_non_zero == data.end());\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nvoid cpp_dec_float<Digits10, ExponentType, Allocator>::extract_parts(double& mantissa, ExponentType& exponent) const\n{\n   // Extract the approximate parts mantissa and base-10 exponent from the input cpp_dec_float<Digits10, ExponentType, Allocator> value x.\n\n   // Extracts the mantissa and exponent.\n   exponent = exp;\n\n   std::uint32_t p10  = static_cast<std::uint32_t>(1u);\n   std::uint32_t test = data[0u];\n\n   for (;;)\n   {\n      test /= static_cast<std::uint32_t>(10u);\n\n      if (test == static_cast<std::uint32_t>(0u))\n      {\n         break;\n      }\n\n      p10 *= static_cast<std::uint32_t>(10u);\n      ++exponent;\n   }\n\n   // Establish the upper bound of limbs for extracting the double.\n   const int max_elem_in_double_count = static_cast<int>(static_cast<std::int32_t>(std::numeric_limits<double>::digits10) / cpp_dec_float_elem_digits10) + (static_cast<int>(static_cast<std::int32_t>(std::numeric_limits<double>::digits10) % cpp_dec_float_elem_digits10) != 0 ? 1 : 0) + 1;\n\n   // And make sure this upper bound stays within bounds of the elems.\n   const std::size_t max_elem_extract_count = static_cast<std::size_t>((std::min)(static_cast<std::int32_t>(max_elem_in_double_count), cpp_dec_float_elem_number));\n\n   // Extract into the mantissa the first limb, extracted as a double.\n   mantissa     = static_cast<double>(data[0]);\n   double scale = 1.0;\n\n   // Extract the rest of the mantissa piecewise from the limbs.\n   for (std::size_t i = 1u; i < max_elem_extract_count; i++)\n   {\n      scale /= static_cast<double>(cpp_dec_float_elem_mask);\n      mantissa += (static_cast<double>(data[i]) * scale);\n   }\n\n   mantissa /= static_cast<double>(p10);\n\n   if (neg)\n   {\n      mantissa = -mantissa;\n   }\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ndouble cpp_dec_float<Digits10, ExponentType, Allocator>::extract_double() const\n{\n   // Returns the double conversion of a cpp_dec_float<Digits10, ExponentType, Allocator>.\n\n   // Check for non-normal cpp_dec_float<Digits10, ExponentType, Allocator>.\n   if (!(isfinite)())\n   {\n      if ((isnan)())\n      {\n         return std::numeric_limits<double>::quiet_NaN();\n      }\n      else\n      {\n         return ((!neg) ? std::numeric_limits<double>::infinity()\n                        : -std::numeric_limits<double>::infinity());\n      }\n   }\n\n   cpp_dec_float<Digits10, ExponentType, Allocator> xx(*this);\n   if (xx.isneg())\n      xx.negate();\n\n   // Check if *this cpp_dec_float<Digits10, ExponentType, Allocator> is zero.\n   if (iszero() || (xx.compare(double_min()) < 0))\n   {\n      return 0.0;\n   }\n\n   // Check if *this cpp_dec_float<Digits10, ExponentType, Allocator> exceeds the maximum of double.\n   if (xx.compare(double_max()) > 0)\n   {\n      return ((!neg) ? std::numeric_limits<double>::infinity()\n                     : -std::numeric_limits<double>::infinity());\n   }\n\n   std::stringstream ss;\n   ss.imbue(std::locale::classic());\n\n   ss << str(std::numeric_limits<double>::digits10 + (2 + 1), std::ios_base::scientific);\n\n   double d;\n   ss >> d;\n\n   return d;\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nlong double cpp_dec_float<Digits10, ExponentType, Allocator>::extract_long_double() const\n{\n   // Returns the long double conversion of a cpp_dec_float<Digits10, ExponentType, Allocator>.\n\n   // Check if *this cpp_dec_float<Digits10, ExponentType, Allocator> is subnormal.\n   if (!(isfinite)())\n   {\n      if ((isnan)())\n      {\n         return std::numeric_limits<long double>::quiet_NaN();\n      }\n      else\n      {\n         return ((!neg) ? std::numeric_limits<long double>::infinity()\n                        : -std::numeric_limits<long double>::infinity());\n      }\n   }\n\n   cpp_dec_float<Digits10, ExponentType, Allocator> xx(*this);\n   if (xx.isneg())\n      xx.negate();\n\n   // Check if *this cpp_dec_float<Digits10, ExponentType, Allocator> is zero.\n   if (iszero() || (xx.compare(long_double_min()) < 0))\n   {\n      return static_cast<long double>(0.0);\n   }\n\n   // Check if *this cpp_dec_float<Digits10, ExponentType, Allocator> exceeds the maximum of double.\n   if (xx.compare(long_double_max()) > 0)\n   {\n      return ((!neg) ? std::numeric_limits<long double>::infinity()\n                     : -std::numeric_limits<long double>::infinity());\n   }\n\n   std::stringstream ss;\n   ss.imbue(std::locale::classic());\n\n   ss << str(std::numeric_limits<long double>::digits10 + (2 + 1), std::ios_base::scientific);\n\n   long double ld;\n   ss >> ld;\n\n   return ld;\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nlong long cpp_dec_float<Digits10, ExponentType, Allocator>::extract_signed_long_long() const\n{\n   // Extracts a signed long long from *this.\n   // If (x > maximum of long long) or (x < minimum of long long),\n   // then the maximum or minimum of long long is returned accordingly.\n\n   if (exp < static_cast<exponent_type>(0))\n   {\n      return static_cast<long long>(0);\n   }\n\n   const bool b_neg = isneg();\n\n   unsigned long long val;\n\n   if ((!b_neg) && (compare(long_long_max()) > 0))\n   {\n      return (std::numeric_limits<long long>::max)();\n   }\n   else if (b_neg && (compare(long_long_min()) < 0))\n   {\n      return (std::numeric_limits<long long>::min)();\n   }\n   else\n   {\n      // Extract the data into an unsigned long long value.\n      cpp_dec_float<Digits10, ExponentType, Allocator> xn(extract_integer_part());\n      if (xn.isneg())\n         xn.negate();\n\n      val = static_cast<unsigned long long>(xn.data[0]);\n\n      const std::int32_t imax = (std::min)(static_cast<std::int32_t>(static_cast<std::int32_t>(xn.exp) / cpp_dec_float_elem_digits10), static_cast<std::int32_t>(cpp_dec_float_elem_number - static_cast<std::int32_t>(1)));\n\n      for (std::int32_t i = static_cast<std::int32_t>(1); i <= imax; i++)\n      {\n         val *= static_cast<unsigned long long>(cpp_dec_float_elem_mask);\n         val += static_cast<unsigned long long>(xn.data[static_cast<std::size_t>(i)]);\n      }\n   }\n\n   if (!b_neg)\n   {\n      return static_cast<long long>(val);\n   }\n   else\n   {\n      // This strange expression avoids a hardware trap in the corner case\n      // that val is the most negative value permitted in long long.\n      // See https://svn.boost.org/trac/boost/ticket/9740.\n      //\n      long long sval = static_cast<long long>(val - 1);\n      sval                       = -sval;\n      --sval;\n      return sval;\n   }\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nunsigned long long cpp_dec_float<Digits10, ExponentType, Allocator>::extract_unsigned_long_long() const\n{\n   // Extracts an unsigned long long from *this.\n   // If x exceeds the maximum of unsigned long long,\n   // then the maximum of unsigned long long is returned.\n   // If x is negative, then the unsigned long long cast of\n   // the long long extracted value is returned.\n\n   if (isneg())\n   {\n      return static_cast<unsigned long long>(extract_signed_long_long());\n   }\n\n   if (exp < static_cast<exponent_type>(0))\n   {\n      return static_cast<unsigned long long>(0u);\n   }\n\n   const cpp_dec_float<Digits10, ExponentType, Allocator> xn(extract_integer_part());\n\n   unsigned long long val;\n\n   if (xn.compare(ulong_long_max()) > 0)\n   {\n      return (std::numeric_limits<unsigned long long>::max)();\n   }\n   else\n   {\n      // Extract the data into an unsigned long long value.\n      val = static_cast<unsigned long long>(xn.data[0]);\n\n      const std::int32_t imax = (std::min)(static_cast<std::int32_t>(static_cast<std::int32_t>(xn.exp) / cpp_dec_float_elem_digits10), static_cast<std::int32_t>(cpp_dec_float_elem_number - static_cast<std::int32_t>(1)));\n\n      for (std::int32_t i = static_cast<std::int32_t>(1); i <= imax; i++)\n      {\n         val *= static_cast<unsigned long long>(cpp_dec_float_elem_mask);\n         val += static_cast<unsigned long long>(xn.data[i]);\n      }\n   }\n\n   return val;\n}\n\n#ifdef BOOST_HAS_INT128\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nint128_type cpp_dec_float<Digits10, ExponentType, Allocator>::extract_signed_int128() const\n{\n   // Extracts a signed __int128 from *this.\n   // If (x > maximum of __int128) or (x < minimum of __int128),\n   // then the maximum or minimum of long long is returned accordingly.\n\n   if (exp < static_cast<exponent_type>(0))\n   {\n      return static_cast<int128_type>(0);\n   }\n\n   const bool b_neg = isneg();\n   cpp_dec_float<Digits10, ExponentType, Allocator> i128max;\n   i128max = ((~static_cast<uint128_type>(0)) >> 1);\n   cpp_dec_float<Digits10, ExponentType, Allocator> i128min;\n   i128min = (-1 - static_cast<int128_type>((static_cast<uint128_type>(1) << 127) - 1));\n\n   uint128_type val;\n\n   if ((!b_neg) && (compare(i128max) > 0))\n   {\n      return ((~static_cast<uint128_type>(0)) >> 1);\n   }\n   else if (b_neg && (compare(i128min) < 0))\n   {\n      return (-1 - static_cast<int128_type>((static_cast<uint128_type>(1) << 127) - 1));\n   }\n   else\n   {\n      // Extract the data into an unsigned long long value.\n      cpp_dec_float<Digits10, ExponentType, Allocator> xn(extract_integer_part());\n      if (xn.isneg())\n         xn.negate();\n\n      val = static_cast<uint128_type>(xn.data[0]);\n\n      const std::int32_t imax = (std::min)(static_cast<std::int32_t>(static_cast<std::int32_t>(xn.exp) / cpp_dec_float_elem_digits10), static_cast<std::int32_t>(cpp_dec_float_elem_number - static_cast<std::int32_t>(1)));\n\n      for (std::int32_t i = static_cast<std::int32_t>(1); i <= imax; i++)\n      {\n         val *= static_cast<uint128_type>(cpp_dec_float_elem_mask);\n         val += static_cast<uint128_type>(xn.data[static_cast<std::size_t>(i)]);\n      }\n   }\n\n   if (!b_neg)\n   {\n      return static_cast<int128_type>(val);\n   }\n   else\n   {\n      // This strange expression avoids a hardware trap in the corner case\n      // that val is the most negative value permitted in long long.\n      // See https://svn.boost.org/trac/boost/ticket/9740.\n      //\n      int128_type sval = static_cast<int128_type>(val - 1);\n      sval                       = -sval;\n      --sval;\n      return sval;\n   }\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nuint128_type cpp_dec_float<Digits10, ExponentType, Allocator>::extract_unsigned_int128() const\n{\n   // Extracts an unsigned __int128 from *this.\n   // If x exceeds the maximum of unsigned __int128,\n   // then the maximum of unsigned __int128 is returned.\n   // If x is negative, then the unsigned __int128 cast of\n   // the __int128 extracted value is returned.\n\n   if (isneg())\n   {\n      return static_cast<uint128_type>(extract_signed_int128());\n   }\n\n   if (exp < static_cast<exponent_type>(0))\n   {\n      return 0u;\n   }\n\n   const cpp_dec_float<Digits10, ExponentType, Allocator> xn(extract_integer_part());\n   cpp_dec_float<Digits10, ExponentType, Allocator>       i128max;\n   i128max = (~static_cast<uint128_type>(0));\n\n   uint128_type val;\n\n   if (xn.compare(i128max) > 0)\n   {\n      return (~static_cast<uint128_type>(0));\n   }\n   else\n   {\n      // Extract the data into an unsigned long long value.\n      val = static_cast<uint128_type>(xn.data[0]);\n\n      const std::int32_t imax = (std::min)(static_cast<std::int32_t>(static_cast<std::int32_t>(xn.exp) / cpp_dec_float_elem_digits10), static_cast<std::int32_t>(cpp_dec_float_elem_number - static_cast<std::int32_t>(1)));\n\n      for (std::int32_t i = static_cast<std::int32_t>(1); i <= imax; i++)\n      {\n         val *= static_cast<uint128_type>(cpp_dec_float_elem_mask);\n         val += static_cast<uint128_type>(xn.data[i]);\n      }\n   }\n\n   return val;\n}\n\n#endif\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ncpp_dec_float<Digits10, ExponentType, Allocator> cpp_dec_float<Digits10, ExponentType, Allocator>::extract_integer_part() const\n{\n   // Compute the signed integer part of x.\n\n   if (!(isfinite)())\n   {\n      return *this;\n   }\n\n   if (exp < static_cast<ExponentType>(0))\n   {\n      // The absolute value of the number is smaller than 1.\n      // Thus the integer part is zero.\n      return zero();\n   }\n\n   // Truncate the digits from the decimal part, including guard digits\n   // that do not belong to the integer part.\n\n   // Make a local copy.\n   cpp_dec_float<Digits10, ExponentType, Allocator> x = *this;\n\n   // Clear out the decimal portion\n   const std::size_t first_clear = (static_cast<std::size_t>(x.exp) / static_cast<std::size_t>(cpp_dec_float_elem_digits10)) + 1u;\n   const std::size_t last_clear  =  static_cast<std::size_t>(cpp_dec_float_elem_number);\n\n   if (first_clear < last_clear)\n      std::fill(x.data.begin() + static_cast<std::ptrdiff_t>(first_clear), x.data.begin() + static_cast<std::ptrdiff_t>(last_clear), static_cast<std::uint32_t>(0u));\n\n   return x;\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nstd::string cpp_dec_float<Digits10, ExponentType, Allocator>::str(std::intmax_t number_of_digits, std::ios_base::fmtflags f) const\n{\n   if ((this->isinf)())\n   {\n      if (this->isneg())\n         return \"-inf\";\n      else if (f & std::ios_base::showpos)\n         return \"+inf\";\n      else\n         return \"inf\";\n   }\n   else if ((this->isnan)())\n   {\n      return \"nan\";\n   }\n\n   std::string     str;\n   std::intmax_t org_digits(number_of_digits);\n   exponent_type    my_exp = order();\n\n   if (!(f & std::ios_base::fixed) && (number_of_digits == 0))\n      number_of_digits = cpp_dec_float_max_digits10;\n\n   if (f & std::ios_base::fixed)\n   {\n      number_of_digits += my_exp + 1;\n   }\n   else if (f & std::ios_base::scientific)\n      ++number_of_digits;\n   // Determine the number of elements needed to provide the requested digits from cpp_dec_float<Digits10, ExponentType, Allocator>.\n   const std::size_t number_of_elements = (std::min)(static_cast<std::size_t>(static_cast<std::size_t>(number_of_digits / static_cast<std::intmax_t>(cpp_dec_float_elem_digits10)) + 2u),\n                                                     static_cast<std::size_t>(cpp_dec_float_elem_number));\n\n   // Extract the remaining digits from cpp_dec_float<Digits10, ExponentType, Allocator> after the decimal point.\n   std::stringstream ss;\n   ss.imbue(std::locale::classic());\n   ss << data[0];\n   // Extract all of the digits from cpp_dec_float<Digits10, ExponentType, Allocator>, beginning with the first data element.\n   for (std::size_t i = static_cast<std::size_t>(1u); i < number_of_elements; i++)\n   {\n      ss << std::setw(static_cast<std::streamsize>(cpp_dec_float_elem_digits10))\n         << std::setfill(static_cast<char>('0'))\n         << data[i];\n   }\n   str += ss.str();\n\n   bool have_leading_zeros = false;\n\n   if (number_of_digits == 0)\n   {\n      // We only get here if the output format is \"fixed\" and we just need to\n      // round the first non-zero digit.\n      number_of_digits -= my_exp + 1; // reset to original value\n      if (number_of_digits)\n      {\n         str.insert(static_cast<std::string::size_type>(0), std::string::size_type(number_of_digits), '0');\n         have_leading_zeros = true;\n      }\n   }\n\n   if (number_of_digits < 0)\n   {\n      str = \"0\";\n      if (isneg())\n         str.insert(static_cast<std::string::size_type>(0), 1, '-');\n      boost::multiprecision::detail::format_float_string(str, 0, number_of_digits - my_exp - 1, f, this->iszero());\n      return str;\n   }\n   else\n   {\n      // Cut the output to the size of the precision.\n      if (str.length() > static_cast<std::string::size_type>(number_of_digits))\n      {\n         // Get the digit after the last needed digit for rounding\n         const std::uint32_t round = static_cast<std::uint32_t>(static_cast<std::uint32_t>(str[static_cast<std::string::size_type>(number_of_digits)]) - static_cast<std::uint32_t>('0'));\n\n         bool need_round_up = round >= 5u;\n\n         if (round == 5u)\n         {\n            const std::uint32_t ix = number_of_digits == 0 ? 0 : static_cast<std::uint32_t>(static_cast<std::uint32_t>(str[static_cast<std::string::size_type>(number_of_digits - 1)]) - static_cast<std::uint32_t>('0'));\n            if ((ix & 1u) == 0)\n            {\n               // We have an even digit followed by a 5, so we might not actually need to round up\n               // if all the remaining digits are zero:\n               if (str.find_first_not_of('0', static_cast<std::string::size_type>(number_of_digits + 1)) == std::string::npos)\n               {\n                  bool all_zeros = true;\n                  // No none-zero trailing digits in the string, now check whatever parts we didn't convert to the string:\n                  for (std::size_t i = number_of_elements; i < data.size(); i++)\n                  {\n                     if (data[i])\n                     {\n                        all_zeros = false;\n                        break;\n                     }\n                  }\n                  if (all_zeros)\n                     need_round_up = false; // tie break - round to even.\n               }\n            }\n         }\n\n         // Truncate the string\n         str.erase(static_cast<std::string::size_type>(number_of_digits));\n\n         if (need_round_up)\n         {\n            if (str.size())\n            {\n               std::size_t ix = static_cast<std::size_t>(str.length() - 1u);\n\n               // Every trailing 9 must be rounded up\n               while (ix && (static_cast<std::int32_t>(str.at(ix)) - static_cast<std::int32_t>('0') == static_cast<std::int32_t>(9)))\n               {\n                  str.at(ix) = static_cast<char>('0');\n                  --ix;\n               }\n\n               if (!ix)\n               {\n                  // There were nothing but trailing nines.\n                  if (static_cast<std::int32_t>(static_cast<std::int32_t>(str.at(ix)) - static_cast<std::int32_t>(0x30)) == static_cast<std::int32_t>(9))\n                  {\n                     // Increment up to the next order and adjust exponent.\n                     str.at(ix) = static_cast<char>('1');\n                     ++my_exp;\n                  }\n                  else\n                  {\n                     // Round up this digit.\n                     ++str.at(ix);\n                  }\n               }\n               else\n               {\n                  // Round up the last digit.\n                  ++str[ix];\n               }\n            }\n            else\n            {\n               str = \"1\";\n               ++my_exp;\n            }\n         }\n      }\n   }\n\n   if (have_leading_zeros)\n   {\n      // We need to take the zeros back out again, and correct the exponent\n      // if we rounded up:\n      if (str[std::string::size_type(number_of_digits - 1)] != '0')\n      {\n         ++my_exp;\n         str.erase(0, std::string::size_type(number_of_digits - 1));\n      }\n      else\n         str.erase(0, std::string::size_type(number_of_digits));\n   }\n\n   if (isneg())\n      str.insert(static_cast<std::string::size_type>(0), 1, '-');\n\n   boost::multiprecision::detail::format_float_string(str, my_exp, org_digits, f, this->iszero());\n   return str;\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nbool cpp_dec_float<Digits10, ExponentType, Allocator>::rd_string(const char* const s)\n{\n#ifndef BOOST_NO_EXCEPTIONS\n   try\n   {\n#endif\n\n      std::string str(s);\n\n      // TBD: Using several regular expressions may significantly reduce\n      // the code complexity (and perhaps the run-time) of rd_string().\n\n      // Get a possible exponent and remove it.\n      exp = static_cast<exponent_type>(0);\n\n      std::size_t pos;\n\n      if (((pos = str.find('e')) != std::string::npos) || ((pos = str.find('E')) != std::string::npos))\n      {\n         // Remove the exponent part from the string.\n         #ifndef BOOST_MP_STANDALONE\n         exp = boost::lexical_cast<exponent_type>(static_cast<const char*>(str.c_str() + (pos + 1u)));\n         #else\n         exp = static_cast<exponent_type>(std::atoll(static_cast<const char*>(str.c_str() + (pos + 1u))));\n         #endif\n         \n         str = str.substr(static_cast<std::size_t>(0u), pos);\n      }\n\n      // Get a possible +/- sign and remove it.\n      neg = false;\n\n      if (str.size())\n      {\n         if (str[0] == '-')\n         {\n            neg = true;\n            str.erase(0, 1);\n         }\n         else if (str[0] == '+')\n         {\n            str.erase(0, 1);\n         }\n      }\n      //\n      // Special cases for infinities and NaN's:\n      //\n      if ((str == \"inf\") || (str == \"INF\") || (str == \"infinity\") || (str == \"INFINITY\"))\n      {\n         if (neg)\n         {\n            *this = this->inf();\n            this->negate();\n         }\n         else\n            *this = this->inf();\n         return true;\n      }\n      if ((str.size() >= 3) && ((str.substr(0, 3) == \"nan\") || (str.substr(0, 3) == \"NAN\") || (str.substr(0, 3) == \"NaN\")))\n      {\n         *this = this->nan();\n         return true;\n      }\n\n      // Remove the leading zeros for all input types.\n      const std::string::iterator fwd_it_leading_zero = std::find_if(str.begin(), str.end(), char_is_nonzero_predicate);\n\n      if (fwd_it_leading_zero != str.begin())\n      {\n         if (fwd_it_leading_zero == str.end())\n         {\n            // The string contains nothing but leading zeros.\n            // This string represents zero.\n            operator=(zero());\n            return true;\n         }\n         else\n         {\n            str.erase(str.begin(), fwd_it_leading_zero);\n         }\n      }\n\n      // Put the input string into the standard cpp_dec_float<Digits10, ExponentType, Allocator> input form\n      // aaa.bbbbE+/-n, where aaa has 1...cpp_dec_float_elem_digits10, bbbb has an\n      // even multiple of cpp_dec_float_elem_digits10 which are possibly zero padded\n      // on the right-end, and n is a signed 64-bit integer which is an\n      // even multiple of cpp_dec_float_elem_digits10.\n\n      // Find a possible decimal point.\n      pos = str.find(static_cast<char>('.'));\n\n      if (pos != std::string::npos)\n      {\n         // Remove all trailing insignificant zeros.\n         const std::string::const_reverse_iterator rit_non_zero = std::find_if(str.rbegin(), str.rend(), char_is_nonzero_predicate);\n\n         if (rit_non_zero != static_cast<std::string::const_reverse_iterator>(str.rbegin()))\n         {\n            const std::string::size_type ofs =\n               static_cast<std::string::size_type>\n               (\n                    static_cast<std::ptrdiff_t>(str.length())\n                  - std::distance<std::string::const_reverse_iterator>(str.rbegin(), rit_non_zero)\n               );\n            str.erase(str.begin() + static_cast<std::ptrdiff_t>(ofs), str.end());\n         }\n\n         // Check if the input is identically zero.\n         if (str == std::string(\".\"))\n         {\n            operator=(zero());\n            return true;\n         }\n\n         // Remove leading significant zeros just after the decimal point\n         // and adjust the exponent accordingly.\n         // Note that the while-loop operates only on strings of the form \".000abcd...\"\n         // and peels away the zeros just after the decimal point.\n         if (str.at(static_cast<std::size_t>(0u)) == static_cast<char>('.'))\n         {\n            const std::string::iterator it_non_zero = std::find_if(str.begin() + 1u, str.end(), char_is_nonzero_predicate);\n\n            std::size_t delta_exp = static_cast<std::size_t>(0u);\n\n            if (str.at(static_cast<std::size_t>(1u)) == static_cast<char>('0'))\n            {\n               delta_exp = static_cast<std::size_t>(std::distance<std::string::const_iterator>(str.begin() + 1u, it_non_zero));\n            }\n\n            // Bring one single digit into the mantissa and adjust the exponent accordingly.\n            str.erase(str.begin(), it_non_zero);\n            str.insert(static_cast<std::string::size_type>(1u), \".\");\n            exp -= static_cast<exponent_type>(delta_exp + 1u);\n         }\n      }\n      else\n      {\n         // Input string has no decimal point: Append decimal point.\n         str.append(\".\");\n      }\n\n      // Shift the decimal point such that the exponent is an even multiple of cpp_dec_float_elem_digits10.\n      std::ptrdiff_t       n_shift   = static_cast<std::ptrdiff_t>(0);\n      const std::ptrdiff_t n_exp_rem = static_cast<std::ptrdiff_t>(exp % static_cast<exponent_type>(cpp_dec_float_elem_digits10));\n\n      if((exp % static_cast<exponent_type>(cpp_dec_float_elem_digits10)) != static_cast<exponent_type>(0))\n      {\n         n_shift = ((exp < static_cast<exponent_type>(0))\n                        ? static_cast<std::ptrdiff_t>(n_exp_rem + static_cast<std::ptrdiff_t>(cpp_dec_float_elem_digits10))\n                        : static_cast<std::ptrdiff_t>(n_exp_rem));\n      }\n\n      // Make sure that there are enough digits for the decimal point shift.\n      pos = str.find(static_cast<char>('.'));\n\n      std::ptrdiff_t pos_plus_one = static_cast<std::ptrdiff_t>(pos + 1);\n\n      if ((static_cast<std::ptrdiff_t>(str.length()) - pos_plus_one) < n_shift)\n      {\n         const std::ptrdiff_t sz = static_cast<std::ptrdiff_t>(n_shift - (static_cast<std::ptrdiff_t>(str.length()) - pos_plus_one));\n\n         str.append(std::string(static_cast<std::string::size_type>(sz), static_cast<char>('0')));\n      }\n\n      // Do the decimal point shift.\n      if (n_shift != static_cast<std::ptrdiff_t>(0))\n      {\n         str.insert(static_cast<std::string::size_type>(pos_plus_one + n_shift), \".\");\n\n         str.erase(pos, static_cast<std::ptrdiff_t>(1));\n\n         exp -= static_cast<exponent_type>(n_shift);\n      }\n\n      // Cut the size of the mantissa to <= cpp_dec_float_elem_digits10.\n      pos          = str.find(static_cast<char>('.'));\n      pos_plus_one = static_cast<std::ptrdiff_t>(pos + 1u);\n\n      if (pos > static_cast<std::size_t>(cpp_dec_float_elem_digits10))\n      {\n         const std::int32_t n_pos         = static_cast<std::int32_t>(pos);\n         const std::int32_t n_rem_is_zero = ((static_cast<std::int32_t>(n_pos % cpp_dec_float_elem_digits10) == static_cast<std::int32_t>(0)) ? static_cast<std::int32_t>(1) : static_cast<std::int32_t>(0));\n         const std::int32_t n             = static_cast<std::int32_t>(static_cast<std::int32_t>(n_pos / cpp_dec_float_elem_digits10) - n_rem_is_zero);\n\n         str.insert(static_cast<std::size_t>(static_cast<std::int32_t>(n_pos - static_cast<std::int32_t>(n * cpp_dec_float_elem_digits10))), \".\");\n\n         str.erase(static_cast<std::size_t>(pos_plus_one), static_cast<std::size_t>(1u));\n\n         exp += static_cast<exponent_type>(static_cast<exponent_type>(n) * static_cast<exponent_type>(cpp_dec_float_elem_digits10));\n      }\n\n      // Pad the decimal part such that its value is an even\n      // multiple of cpp_dec_float_elem_digits10.\n      pos          = str.find(static_cast<char>('.'));\n      pos_plus_one = static_cast<std::ptrdiff_t>(pos + 1u);\n\n      // Throws an error for a strange construction like 3.14L\n      if(pos != std::string::npos && (str.back() == 'L' || str.back() == 'l' || str.back() == 'u' || str.back() == 'U'))\n      {\n         BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Can not construct a floating point with an integer literal\"));\n      }\n\n      const std::int32_t n_dec = static_cast<std::int32_t>(static_cast<std::int32_t>(str.length() - 1u) - static_cast<std::int32_t>(pos));\n      const std::int32_t n_rem = static_cast<std::int32_t>(n_dec % cpp_dec_float_elem_digits10);\n\n      std::int32_t n_cnt = ((n_rem != static_cast<std::int32_t>(0))\n                                  ? static_cast<std::int32_t>(cpp_dec_float_elem_digits10 - n_rem)\n                                  : static_cast<std::int32_t>(0));\n\n      if (n_cnt != static_cast<std::int32_t>(0))\n      {\n         str.append(static_cast<std::size_t>(n_cnt), static_cast<char>('0'));\n      }\n\n      // Truncate decimal part if it is too long.\n      const std::size_t max_dec = static_cast<std::size_t>((cpp_dec_float_elem_number - 1) * cpp_dec_float_elem_digits10);\n\n      if (static_cast<std::size_t>(str.length() - pos) > max_dec)\n      {\n         str = str.substr(static_cast<std::size_t>(0u),\n                          static_cast<std::size_t>(pos_plus_one + static_cast<std::ptrdiff_t>(max_dec)));\n      }\n\n      // Now the input string has the standard cpp_dec_float<Digits10, ExponentType, Allocator> input form.\n      // (See the comment above.)\n\n      // Set all the data elements to 0.\n      std::fill(data.begin(), data.end(), static_cast<std::uint32_t>(0u));\n\n      // Extract the data.\n\n      // First get the digits to the left of the decimal point...\n      data[0u] = static_cast<std::uint32_t>(std::stol(str.substr(static_cast<std::size_t>(0u), pos)));\n\n      // ...then get the remaining digits to the right of the decimal point.\n      const std::string::size_type i_end =\n      (\n           static_cast<std::string::size_type>(str.length() - static_cast<std::string::size_type>(pos_plus_one))\n         / static_cast<std::string::size_type>(cpp_dec_float_elem_digits10)\n      );\n\n      for (std::string::size_type i = static_cast<std::string::size_type>(0u); i < i_end; i++)\n      {\n         const std::string::const_iterator it =\n              str.begin()\n            + static_cast<std::ptrdiff_t>\n              (\n                   static_cast<std::string::size_type>(pos_plus_one)\n                 + static_cast<std::string::size_type>(i * static_cast<std::string::size_type>(cpp_dec_float_elem_digits10))\n              );\n\n         data[i + 1u] = static_cast<std::uint32_t>(std::stol(std::string(it, it + static_cast<std::string::size_type>(cpp_dec_float_elem_digits10))));\n      }\n\n      // Check for overflow...\n      if (exp > cpp_dec_float_max_exp10)\n      {\n         const bool b_result_is_neg = neg;\n\n         *this = inf();\n         if (b_result_is_neg)\n            negate();\n      }\n\n      // ...and check for underflow.\n      if (exp <= cpp_dec_float_min_exp10)\n      {\n         if (exp == cpp_dec_float_min_exp10)\n         {\n            // Check for identity with the minimum value.\n            cpp_dec_float<Digits10, ExponentType, Allocator> test = *this;\n\n            test.exp = static_cast<exponent_type>(0);\n\n            if (test.isone())\n            {\n               *this = zero();\n            }\n         }\n         else\n         {\n            *this = zero();\n         }\n      }\n\n#ifndef BOOST_NO_EXCEPTIONS\n   }\n   #ifndef BOOST_MP_STANDALONE\n   catch (const bad_lexical_cast&)\n   #else\n   catch (const std::exception&)\n   #endif\n   {\n      // Rethrow with better error message:\n      std::string msg = \"Unable to parse the string \\\"\";\n      msg += s;\n      msg += \"\\\" as a floating point value.\";\n      throw std::runtime_error(msg);\n   }\n#endif\n   return true;\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ncpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float(const double mantissa, const ExponentType exponent)\n    : data(),\n      exp(static_cast<ExponentType>(0)),\n      neg(false),\n      fpclass(cpp_dec_float_finite),\n      prec_elem(cpp_dec_float_elem_number)\n{\n   // Create *this cpp_dec_float<Digits10, ExponentType, Allocator> from a given mantissa and exponent.\n   // Note: This constructor does not maintain the full precision of double.\n\n   const bool mantissa_is_iszero = (::fabs(mantissa) < ((std::numeric_limits<double>::min)() * (1.0 + std::numeric_limits<double>::epsilon())));\n\n   if (mantissa_is_iszero)\n   {\n      std::fill(data.begin(), data.end(), static_cast<std::uint32_t>(0u));\n      return;\n   }\n\n   const bool b_neg = (mantissa < 0.0);\n\n   double       d = ((!b_neg) ? mantissa : -mantissa);\n   exponent_type e = exponent;\n\n   while (d > 10.0)\n   {\n      d /= 10.0;\n      ++e;\n   }\n   while (d < 1.0)\n   {\n      d *= 10.0;\n      --e;\n   }\n\n   std::int32_t shift = static_cast<std::int32_t>(e % static_cast<std::int32_t>(cpp_dec_float_elem_digits10));\n\n   while (static_cast<std::int32_t>(shift-- % cpp_dec_float_elem_digits10) != static_cast<std::int32_t>(0))\n   {\n      d *= 10.0;\n      --e;\n   }\n\n   exp = e;\n   neg = b_neg;\n\n   std::fill(data.begin(), data.end(), static_cast<std::uint32_t>(0u));\n\n   constexpr std::int32_t digit_ratio = static_cast<std::int32_t>(static_cast<std::int32_t>(std::numeric_limits<double>::digits10) / static_cast<std::int32_t>(cpp_dec_float_elem_digits10));\n   constexpr std::int32_t digit_loops = static_cast<std::int32_t>(digit_ratio + static_cast<std::int32_t>(2));\n\n   for (std::int32_t i = static_cast<std::int32_t>(0); i < digit_loops; i++)\n   {\n      std::uint32_t n = static_cast<std::uint32_t>(static_cast<std::uint64_t>(d));\n      data[static_cast<std::size_t>(i)] = static_cast<std::uint32_t>(n);\n      d -= static_cast<double>(n);\n      d *= static_cast<double>(cpp_dec_float_elem_mask);\n   }\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ntemplate <class Float>\ntypename std::enable_if<std::is_floating_point<Float>::value, cpp_dec_float<Digits10, ExponentType, Allocator>&>::type cpp_dec_float<Digits10, ExponentType, Allocator>::operator=(Float a)\n{\n   // Christopher Kormanyos's original code used a cast to long long here, but that fails\n   // when long double has more digits than a long long.\n   BOOST_MP_FLOAT128_USING\n   using std::floor;\n   using std::frexp; \n   using std::ldexp;\n\n   if (a == 0)\n      return *this = zero();\n\n   if (a == 1)\n      return *this = one();\n\n   if (BOOST_MP_ISINF(a))\n   {\n      *this = inf();\n      if (a < 0)\n         this->negate();\n      return *this;\n   }\n\n   if (BOOST_MP_ISNAN(a))\n      return *this = nan();\n\n   int         e;\n   Float f, term;\n   *this = zero();\n\n   f = frexp(a, &e);\n   // See https://svn.boost.org/trac/boost/ticket/10924 for an example of why this may go wrong:\n   BOOST_MP_ASSERT(!BOOST_MP_ISNAN(f) && !BOOST_MP_ISINF(f));\n\n   constexpr int shift = std::numeric_limits<int>::digits - 1;\n\n   while (f != static_cast<Float>(0.0f))\n   {\n      // extract int sized bits from f:\n      f = ldexp(f, shift);\n      BOOST_MP_ASSERT(!BOOST_MP_ISNAN(f) && !BOOST_MP_ISINF(f));\n      term = floor(f);\n      e -= shift;\n      *this *= pow2(shift);\n      if (term > 0)\n         add_unsigned_long_long(static_cast<unsigned>(term));\n      else\n         sub_unsigned_long_long(static_cast<unsigned>(-term));\n      f -= term;\n   }\n\n   if (e != 0)\n      *this *= pow2(e);\n\n   return *this;\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nvoid cpp_dec_float<Digits10, ExponentType, Allocator>::from_unsigned_long_long(const unsigned long long u)\n{\n   std::fill(data.begin(), data.end(), static_cast<std::uint32_t>(0u));\n\n   exp       = static_cast<exponent_type>(0);\n   neg       = false;\n   fpclass   = cpp_dec_float_finite;\n   prec_elem = cpp_dec_float_elem_number;\n\n   if (u == 0)\n   {\n      return;\n   }\n\n   std::size_t i = static_cast<std::size_t>(0u);\n\n   unsigned long long uu = u;\n\n   std::uint32_t temp[(std::numeric_limits<unsigned long long>::digits10 / static_cast<int>(cpp_dec_float_elem_digits10)) + 3] = {static_cast<std::uint32_t>(0u)};\n\n   while (uu != static_cast<unsigned long long>(0u))\n   {\n      temp[i] = static_cast<std::uint32_t>(uu % static_cast<unsigned long long>(cpp_dec_float_elem_mask));\n      uu      = static_cast<unsigned long long>(uu / static_cast<unsigned long long>(cpp_dec_float_elem_mask));\n      ++i;\n   }\n\n   if (i > static_cast<std::size_t>(1u))\n   {\n      exp += static_cast<exponent_type>((i - 1u) * static_cast<std::size_t>(cpp_dec_float_elem_digits10));\n   }\n\n   std::reverse(temp, temp + i);\n   std::copy(temp, temp + (std::min)(i, static_cast<std::size_t>(cpp_dec_float_elem_number)), data.begin());\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ntemplate <typename InputIteratorTypeLeft, typename InputIteratorTypeRight>\nint cpp_dec_float<Digits10, ExponentType, Allocator>::compare_ranges(InputIteratorTypeLeft  a,\n                                                                     InputIteratorTypeRight b,\n                                                                     const std::uint32_t    count)\n{\n   using local_iterator_left_type  = InputIteratorTypeLeft;\n   using local_iterator_right_type = InputIteratorTypeRight;\n\n   local_iterator_left_type  begin_a(a);\n   local_iterator_left_type  end_a  (a + static_cast<typename std::iterator_traits<local_iterator_left_type >::difference_type>(count));\n   local_iterator_right_type begin_b(b);\n   local_iterator_right_type end_b  (b + static_cast<typename std::iterator_traits<local_iterator_right_type>::difference_type>(count));\n\n   const auto mismatch_pair = std::mismatch(begin_a, end_a, begin_b);\n\n   int n_return;\n\n   if((mismatch_pair.first != end_a) || (mismatch_pair.second != end_b))\n   {\n      const typename std::iterator_traits<local_iterator_left_type >::value_type left  = *mismatch_pair.first;\n      const typename std::iterator_traits<local_iterator_right_type>::value_type right = *mismatch_pair.second;\n\n      n_return = ((left > right) ?  1 : -1);\n   }\n   else\n   {\n      n_return = 0;\n   }\n\n   return n_return;\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nstd::uint32_t cpp_dec_float<Digits10, ExponentType, Allocator>::eval_add_n(      std::uint32_t* r,\n                                                                           const std::uint32_t* u,\n                                                                           const std::uint32_t* v,\n                                                                           const std::int32_t   count)\n{\n   // Addition algorithm\n   std::uint_fast8_t carry = static_cast<std::uint_fast8_t>(0U);\n\n   for(std::int32_t j = static_cast<std::int32_t>(count - static_cast<std::int32_t>(1)); j >= static_cast<std::int32_t>(0); --j)\n   {\n      const std::uint32_t t = static_cast<std::uint32_t>(static_cast<std::uint32_t>(u[j] + v[j]) + carry);\n\n      carry = ((t >= static_cast<std::uint32_t>(cpp_dec_float_elem_mask)) ? static_cast<std::uint_fast8_t>(1U)\n                                                                   : static_cast<std::uint_fast8_t>(0U));\n\n      r[j]  = static_cast<std::uint32_t>(t - ((carry != 0U) ? static_cast<std::uint32_t>(cpp_dec_float_elem_mask)\n                                                            : static_cast<std::uint32_t>(0U)));\n   }\n\n   return static_cast<std::uint32_t>(carry);\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nstd::uint32_t cpp_dec_float<Digits10, ExponentType, Allocator>::eval_subtract_n(      std::uint32_t* r,\n                                                                                const std::uint32_t* u,\n                                                                                const std::uint32_t* v,\n                                                                                const std::int32_t   count)\n{\n   // Subtraction algorithm\n   std::int_fast8_t borrow = static_cast<std::int_fast8_t>(0);\n\n   for(std::uint32_t j = static_cast<std::uint32_t>(count - static_cast<std::int32_t>(1)); static_cast<std::int32_t>(j) >= static_cast<std::int32_t>(0); --j)\n   {\n      std::int32_t t = static_cast<std::int32_t>(  static_cast<std::int32_t>(u[j])\n                                                 - static_cast<std::int32_t>(v[j])) - borrow;\n\n      // Underflow? Borrow?\n      if(t < 0)\n      {\n         // Yes, underflow and borrow\n         t     += static_cast<std::int32_t>(cpp_dec_float_elem_mask);\n         borrow = static_cast<std::int_fast8_t>(1);\n      }\n      else\n      {\n         borrow = static_cast<std::int_fast8_t>(0);\n      }\n\n      r[j] = static_cast<std::uint32_t>(t);\n   }\n\n   return static_cast<std::uint32_t>(borrow);\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nvoid cpp_dec_float<Digits10, ExponentType, Allocator>::eval_multiply_n_by_n_to_2n(      std::uint32_t* r,\n                                                                                  const std::uint32_t* a,\n                                                                                  const std::uint32_t* b,\n                                                                                  const std::uint32_t  count)\n{\n   using local_limb_type = std::uint32_t;\n\n   using local_double_limb_type = std::uint64_t;\n\n   using local_reverse_iterator_type = std::reverse_iterator<local_limb_type*>;\n\n   local_reverse_iterator_type ir(r + (count * 2));\n\n   local_double_limb_type carry = 0U;\n\n   for(std::int32_t j = static_cast<std::int32_t>(count - 1); j >= static_cast<std::int32_t>(1); --j)\n   {\n      local_double_limb_type sum = carry;\n\n      for(std::int32_t i = static_cast<std::int32_t>(count - 1); i >= j; --i)\n      {\n         sum += local_double_limb_type(\n                local_double_limb_type(a[i]) * b[  static_cast<std::int32_t>(count - 1)\n                                                - static_cast<std::int32_t>(i - j)]);\n      }\n\n      carry = static_cast<local_double_limb_type>(sum / static_cast<local_limb_type>       (cpp_dec_float_elem_mask));\n      *ir++ = static_cast<local_limb_type>       (sum - static_cast<local_double_limb_type>(static_cast<local_double_limb_type>(carry) * static_cast<local_limb_type>(cpp_dec_float_elem_mask)));\n   }\n\n   for(std::int32_t j = static_cast<std::int32_t>(count - 1); j >= static_cast<std::int32_t>(0); --j)\n   {\n      local_double_limb_type sum = carry;\n\n      for(std::int32_t i = j; i >= static_cast<std::int32_t>(0); --i)\n      {\n         sum += static_cast<local_double_limb_type>(a[j - i] * static_cast<local_double_limb_type>(b[i]));\n      }\n\n      carry = static_cast<local_double_limb_type>(sum / static_cast<local_limb_type>(cpp_dec_float_elem_mask));\n      *ir++ = static_cast<local_limb_type>       (sum - static_cast<local_double_limb_type>(static_cast<local_double_limb_type>(carry) * static_cast<local_limb_type>(cpp_dec_float_elem_mask)));\n   }\n\n   *ir = static_cast<local_limb_type>(carry);\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nstd::uint32_t cpp_dec_float<Digits10, ExponentType, Allocator>::mul_loop_n(std::uint32_t* const u, std::uint32_t n, const std::int32_t p)\n{\n   std::uint64_t carry = static_cast<std::uint64_t>(0u);\n\n   // Multiplication loop.\n   for (std::int32_t j = p - 1; j >= static_cast<std::int32_t>(0); j--)\n   {\n      const std::uint64_t t = static_cast<std::uint64_t>(carry + static_cast<std::uint64_t>(u[j] * static_cast<std::uint64_t>(n)));\n      carry                 = static_cast<std::uint64_t>(t / static_cast<std::uint32_t>(cpp_dec_float_elem_mask));\n      u[j]                  = static_cast<std::uint32_t>(t - static_cast<std::uint64_t>(static_cast<std::uint32_t>(cpp_dec_float_elem_mask) * static_cast<std::uint64_t>(carry)));\n   }\n\n   return static_cast<std::uint32_t>(carry);\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nstd::uint32_t cpp_dec_float<Digits10, ExponentType, Allocator>::div_loop_n(std::uint32_t* const u, std::uint32_t n, const std::int32_t p)\n{\n   std::uint64_t prev = static_cast<std::uint64_t>(0u);\n\n   for (std::int32_t j = static_cast<std::int32_t>(0); j < p; j++)\n   {\n      const std::uint64_t t = static_cast<std::uint64_t>(u[j] + static_cast<std::uint64_t>(prev * static_cast<std::uint32_t>(cpp_dec_float_elem_mask)));\n      u[j]                    = static_cast<std::uint32_t>(t / n);\n      prev                    = static_cast<std::uint64_t>(t - static_cast<std::uint64_t>(n * static_cast<std::uint64_t>(u[j])));\n   }\n\n   return static_cast<std::uint32_t>(prev);\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nvoid cpp_dec_float<Digits10, ExponentType, Allocator>::eval_multiply_kara_propagate_carry(std::uint32_t* t, const std::uint32_t n, const std::uint32_t carry)\n{\n   std::uint_fast8_t carry_out = ((carry != 0U) ? static_cast<std::uint_fast8_t>(1U)\n                                                : static_cast<std::uint_fast8_t>(0U));\n\n   using local_reverse_iterator_type = std::reverse_iterator<std::uint32_t*>;\n\n   local_reverse_iterator_type ri_t  (t + n);\n   local_reverse_iterator_type rend_t(t);\n\n   while((carry_out != 0U) && (ri_t != rend_t))\n   {\n      const std::uint64_t tt = *ri_t + carry_out;\n\n      carry_out = ((tt >= static_cast<std::uint32_t>(cpp_dec_float_elem_mask)) ? static_cast<std::uint_fast8_t>(1U)\n                                                                               : static_cast<std::uint_fast8_t>(0U));\n\n      *ri_t++    = static_cast<std::uint32_t>(tt - ((carry_out != 0U) ? static_cast<std::uint32_t>(cpp_dec_float_elem_mask)\n                                                                      : static_cast<std::uint32_t>(0U)));\n   }\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nvoid cpp_dec_float<Digits10, ExponentType, Allocator>::eval_multiply_kara_propagate_borrow(std::uint32_t* t, const std::uint32_t n, const bool has_borrow)\n{\n   std::int_fast8_t borrow = (has_borrow ? static_cast<std::int_fast8_t>(1)\n                                         : static_cast<std::int_fast8_t>(0));\n\n   using local_reverse_iterator_type = std::reverse_iterator<std::uint32_t*>;\n\n   local_reverse_iterator_type ri_t  (t + n);\n   local_reverse_iterator_type rend_t(t);\n\n   while((borrow != 0U) && (ri_t != rend_t))\n   {\n      std::int32_t tt = static_cast<std::int32_t>(static_cast<std::int32_t>(*ri_t) - borrow);\n\n      // Underflow? Borrow?\n      if(tt < 0)\n      {\n         // Yes, underflow and borrow\n         tt     += static_cast<std::int32_t>(cpp_dec_float_elem_mask);\n         borrow  = static_cast<int_fast8_t>(1);\n      }\n      else\n      {\n         borrow = static_cast<int_fast8_t>(0);\n      }\n\n      *ri_t++ = static_cast<std::uint32_t>(tt);\n   }\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nvoid cpp_dec_float<Digits10, ExponentType, Allocator>::eval_multiply_kara_n_by_n_to_2n(      std::uint32_t* r,\n                                                                                       const std::uint32_t* a,\n                                                                                       const std::uint32_t* b,\n                                                                                       const std::uint32_t  n,\n                                                                                             std::uint32_t* t)\n{\n   if(n <= 32U)\n   {\n      static_cast<void>(t);\n\n      eval_multiply_n_by_n_to_2n(r, a, b, n);\n   }\n   else\n   {\n      // Based on \"Algorithm 1.3 KaratsubaMultiply\", Sect. 1.3.2, page 5\n      // of R.P. Brent and P. Zimmermann, \"Modern Computer Arithmetic\",\n      // Cambridge University Press (2011).\n\n      // The Karatsuba multipliation computes the product of a*b as:\n      // [b^N + b^(N/2)] a1*b1 + [b^(N/2)](a1 - a0)(b0 - b1) + [b^(N/2) + 1] a0*b0\n\n      // Here we visualize a and b in two components 1,0 corresponding\n      // to the high and low order parts, respectively.\n\n      // Step 1\n      // Calculate a1*b1 and store it in the upper-order part of r.\n      // Calculate a0*b0 and store it in the lower-order part of r.\n      // copy r to t0.\n\n      // Step 2\n      // Add a1*b1 (which is t2) to the middle two-quarters of r (which is r1)\n      // Add a0*b0 (which is t0) to the middle two-quarters of r (which is r1)\n\n      // Step 3\n      // Calculate |a1-a0| in t0 and note the sign (i.e., the borrow flag)\n\n      // Step 4\n      // Calculate |b0-b1| in t1 and note the sign (i.e., the borrow flag)\n\n      // Step 5\n      // Call kara mul to calculate |a1-a0|*|b0-b1| in (t2),\n      // while using temporary storage in t4 along the way.\n\n      // Step 6\n      // Check the borrow signs. If a1-a0 and b0-b1 have the same signs,\n      // then add |a1-a0|*|b0-b1| to r1, otherwise subtract it from r1.\n\n      const std::uint_fast32_t  nh = n / 2U;\n\n      const std::uint32_t* a0 = a + nh;\n      const std::uint32_t* a1 = a + 0U;\n\n      const std::uint32_t* b0 = b + nh;\n      const std::uint32_t* b1 = b + 0U;\n\n            std::uint32_t* r0 = r + 0U;\n            std::uint32_t* r1 = r + nh;\n            std::uint32_t* r2 = r + n;\n\n            std::uint32_t* t0 = t + 0U;\n            std::uint32_t* t1 = t + nh;\n            std::uint32_t* t2 = t + n;\n            std::uint32_t* t4 = t + (n + n);\n\n      // Step 1\n      eval_multiply_kara_n_by_n_to_2n(r0, a1, b1, static_cast<std::uint32_t>(nh), t);\n      eval_multiply_kara_n_by_n_to_2n(r2, a0, b0, static_cast<std::uint32_t>(nh), t);\n      std::copy(r0, r0 + (2U * n), t0);\n\n      // Step 2\n      std::uint32_t carry;\n      carry = eval_add_n(r1, r1, t0, static_cast<std::int32_t>(n));\n      eval_multiply_kara_propagate_carry(r0, static_cast<std::uint32_t>(nh), carry);\n      carry = eval_add_n(r1, r1, t2, static_cast<std::int32_t>(n));\n      eval_multiply_kara_propagate_carry(r0, static_cast<std::uint32_t>(nh), carry);\n\n      // Step 3\n      const int cmp_result_a1a0 = compare_ranges(a1, a0, static_cast<std::uint32_t>(nh));\n\n      if(cmp_result_a1a0 == 1)\n         static_cast<void>(eval_subtract_n(t0, a1, a0, static_cast<std::int32_t>(nh)));\n      else if(cmp_result_a1a0 == -1)\n         static_cast<void>(eval_subtract_n(t0, a0, a1, static_cast<std::int32_t>(nh)));\n\n      // Step 4\n      const int cmp_result_b0b1 = compare_ranges(b0, b1, static_cast<std::uint32_t>(nh));\n\n      if(cmp_result_b0b1 == 1)\n         static_cast<void>(eval_subtract_n(t1, b0, b1, static_cast<std::int32_t>(nh)));\n      else if(cmp_result_b0b1 == -1)\n         static_cast<void>(eval_subtract_n(t1, b1, b0, static_cast<std::int32_t>(nh)));\n\n      // Step 5\n      eval_multiply_kara_n_by_n_to_2n(t2, t0, t1, static_cast<std::uint32_t>(nh), t4);\n\n      // Step 6\n      if((cmp_result_a1a0 * cmp_result_b0b1) == 1)\n      {\n         carry = eval_add_n(r1, r1, t2, static_cast<std::int32_t>(n));\n\n         eval_multiply_kara_propagate_carry(r0, static_cast<std::uint32_t>(nh), carry);\n      }\n      else if((cmp_result_a1a0 * cmp_result_b0b1) == -1)\n      {\n         const bool has_borrow = eval_subtract_n(r1, r1, t2, static_cast<std::int32_t>(n));\n\n         eval_multiply_kara_propagate_borrow(r0, static_cast<std::uint32_t>(nh), has_borrow);\n      }\n   }\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ncpp_dec_float<Digits10, ExponentType, Allocator> cpp_dec_float<Digits10, ExponentType, Allocator>::pow2(const long long p)\n{\n   static const std::array<cpp_dec_float<Digits10, ExponentType, Allocator>, 256u> local_pow2_data =\n   {{\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       29u, 38735877u,  5571876u, 99218413u, 43055614u, 19454666u, 38919302u, 18803771u, 87926569u, 60431486u, 36817932u, 12890625u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       58u, 77471754u, 11143753u, 98436826u, 86111228u, 38909332u, 77838604u, 37607543u, 75853139u, 20862972u, 73635864u, 25781250u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      117u, 54943508u, 22287507u, 96873653u, 72222456u, 77818665u, 55677208u, 75215087u, 51706278u, 41725945u, 47271728u, 51562500u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      235u,  9887016u, 44575015u, 93747307u, 44444913u, 55637331u, 11354417u, 50430175u,  3412556u, 83451890u, 94543457u,  3125000u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      470u, 19774032u, 89150031u, 87494614u, 88889827u, 11274662u, 22708835u,   860350u,  6825113u, 66903781u, 89086914u,  6250000u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      940u, 39548065u, 78300063u, 74989229u, 77779654u, 22549324u, 45417670u,  1720700u, 13650227u, 33807563u, 78173828u, 12500000u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     1880u, 79096131u, 56600127u, 49978459u, 55559308u, 45098648u, 90835340u,  3441400u, 27300454u, 67615127u, 56347656u, 25000000u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     3761u, 58192263u, 13200254u, 99956919u, 11118616u, 90197297u, 81670680u,  6882800u, 54600909u, 35230255u, 12695312u, 50000000u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     7523u, 16384526u, 26400509u, 99913838u, 22237233u, 80394595u, 63341360u, 13765601u,  9201818u, 70460510u, 25390625u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    15046u, 32769052u, 52801019u, 99827676u, 44474467u, 60789191u, 26682720u, 27531202u, 18403637u, 40921020u, 50781250u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    30092u, 65538105u,  5602039u, 99655352u, 88948935u, 21578382u, 53365440u, 55062404u, 36807274u, 81842041u,  1562500u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    60185u, 31076210u, 11204079u, 99310705u, 77897870u, 43156765u,  6730881u, 10124808u, 73614549u, 63684082u,  3125000u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   120370u, 62152420u, 22408159u, 98621411u, 55795740u, 86313530u, 13461762u, 20249617u, 47229099u, 27368164u,  6250000u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   240741u, 24304840u, 44816319u, 97242823u, 11591481u, 72627060u, 26923524u, 40499234u, 94458198u, 54736328u, 12500000u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   481482u, 48609680u, 89632639u, 94485646u, 23182963u, 45254120u, 53847048u, 80998469u, 88916397u,  9472656u, 25000000u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   962964u, 97219361u, 79265279u, 88971292u, 46365926u, 90508241u,  7694097u, 61996939u, 77832794u, 18945312u, 50000000u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  1925929u, 94438723u, 58530559u, 77942584u, 92731853u, 81016482u, 15388195u, 23993879u, 55665588u, 37890625u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  3851859u, 88877447u, 17061119u, 55885169u, 85463707u, 62032964u, 30776390u, 47987759u, 11331176u, 75781250u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  7703719u, 77754894u, 34122239u, 11770339u, 70927415u, 24065928u, 61552780u, 95975518u, 22662353u, 51562500u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 15407439u, 55509788u, 68244478u, 23540679u, 41854830u, 48131857u, 23105561u, 91951036u, 45324707u,  3125000u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 30814879u, 11019577u, 36488956u, 47081358u, 83709660u, 96263714u, 46211123u, 83902072u, 90649414u,  6250000u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 61629758u, 22039154u, 72977912u, 94162717u, 67419321u, 92527428u, 92422247u, 67804145u, 81298828u, 12500000u }, -40 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        1u, 23259516u, 44078309u, 45955825u, 88325435u, 34838643u, 85054857u, 84844495u, 35608291u, 62597656u, 25000000u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        2u, 46519032u, 88156618u, 91911651u, 76650870u, 69677287u, 70109715u, 69688990u, 71216583u, 25195312u, 50000000u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        4u, 93038065u, 76313237u, 83823303u, 53301741u, 39354575u, 40219431u, 39377981u, 42433166u, 50390625u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        9u, 86076131u, 52626475u, 67646607u,  6603482u, 78709150u, 80438862u, 78755962u, 84866333u,   781250u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       19u, 72152263u,  5252951u, 35293214u, 13206965u, 57418301u, 60877725u, 57511925u, 69732666u,  1562500u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       39u, 44304526u, 10505902u, 70586428u, 26413931u, 14836603u, 21755451u, 15023851u, 39465332u,  3125000u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       78u, 88609052u, 21011805u, 41172856u, 52827862u, 29673206u, 43510902u, 30047702u, 78930664u,  6250000u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      157u, 77218104u, 42023610u, 82345713u,  5655724u, 59346412u, 87021804u, 60095405u, 57861328u, 12500000u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      315u, 54436208u, 84047221u, 64691426u, 11311449u, 18692825u, 74043609u, 20190811u, 15722656u, 25000000u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      631u,  8872417u, 68094443u, 29382852u, 22622898u, 37385651u, 48087218u, 40381622u, 31445312u, 50000000u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     1262u, 17744835u, 36188886u, 58765704u, 45245796u, 74771302u, 96174436u, 80763244u, 62890625u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     2524u, 35489670u, 72377773u, 17531408u, 90491593u, 49542605u, 92348873u, 61526489u, 25781250u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     5048u, 70979341u, 44755546u, 35062817u, 80983186u, 99085211u, 84697747u, 23052978u, 51562500u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    10097u, 41958682u, 89511092u, 70125635u, 61966373u, 98170423u, 69395494u, 46105957u,  3125000u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    20194u, 83917365u, 79022185u, 40251271u, 23932747u, 96340847u, 38790988u, 92211914u,  6250000u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    40389u, 67834731u, 58044370u, 80502542u, 47865495u, 92681694u, 77581977u, 84423828u, 12500000u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    80779u, 35669463u, 16088741u, 61005084u, 95730991u, 85363389u, 55163955u, 68847656u, 25000000u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   161558u, 71338926u, 32177483u, 22010169u, 91461983u, 70726779u, 10327911u, 37695312u, 50000000u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   323117u, 42677852u, 64354966u, 44020339u, 82923967u, 41453558u, 20655822u, 75390625u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   646234u, 85355705u, 28709932u, 88040679u, 65847934u, 82907116u, 41311645u, 50781250u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  1292469u, 70711410u, 57419865u, 76081359u, 31695869u, 65814232u, 82623291u,  1562500u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  2584939u, 41422821u, 14839731u, 52162718u, 63391739u, 31628465u, 65246582u,  3125000u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  5169878u, 82845642u, 29679463u,  4325437u, 26783478u, 63256931u, 30493164u,  6250000u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 10339757u, 65691284u, 59358926u,  8650874u, 53566957u, 26513862u, 60986328u, 12500000u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 20679515u, 31382569u, 18717852u, 17301749u,  7133914u, 53027725u, 21972656u, 25000000u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 41359030u, 62765138u, 37435704u, 34603498u, 14267829u,  6055450u, 43945312u, 50000000u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 82718061u, 25530276u, 74871408u, 69206996u, 28535658u, 12110900u, 87890625u }, -32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        1u, 65436122u, 51060553u, 49742817u, 38413992u, 57071316u, 24221801u, 75781250u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        3u, 30872245u,  2121106u, 99485634u, 76827985u, 14142632u, 48443603u, 51562500u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        6u, 61744490u,  4242213u, 98971269u, 53655970u, 28285264u, 96887207u,  3125000u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       13u, 23488980u,  8484427u, 97942539u,  7311940u, 56570529u, 93774414u,  6250000u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       26u, 46977960u, 16968855u, 95885078u, 14623881u, 13141059u, 87548828u, 12500000u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       52u, 93955920u, 33937711u, 91770156u, 29247762u, 26282119u, 75097656u, 25000000u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      105u, 87911840u, 67875423u, 83540312u, 58495524u, 52564239u, 50195312u, 50000000u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      211u, 75823681u, 35750847u, 67080625u, 16991049u,  5128479u,   390625u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      423u, 51647362u, 71501695u, 34161250u, 33982098u, 10256958u,   781250u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      847u,  3294725u, 43003390u, 68322500u, 67964196u, 20513916u,  1562500u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     1694u,  6589450u, 86006781u, 36645001u, 35928392u, 41027832u,  3125000u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     3388u, 13178901u, 72013562u, 73290002u, 71856784u, 82055664u,  6250000u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     6776u, 26357803u, 44027125u, 46580005u, 43713569u, 64111328u, 12500000u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    13552u, 52715606u, 88054250u, 93160010u, 87427139u, 28222656u, 25000000u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    27105u,  5431213u, 76108501u, 86320021u, 74854278u, 56445312u, 50000000u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    54210u, 10862427u, 52217003u, 72640043u, 49708557u, 12890625u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   108420u, 21724855u,  4434007u, 45280086u, 99417114u, 25781250u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   216840u, 43449710u,  8868014u, 90560173u, 98834228u, 51562500u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   433680u, 86899420u, 17736029u, 81120347u, 97668457u,  3125000u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   867361u, 73798840u, 35472059u, 62240695u, 95336914u,  6250000u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  1734723u, 47597680u, 70944119u, 24481391u, 90673828u, 12500000u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  3469446u, 95195361u, 41888238u, 48962783u, 81347656u, 25000000u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  6938893u, 90390722u, 83776476u, 97925567u, 62695312u, 50000000u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 13877787u, 80781445u, 67552953u, 95851135u, 25390625u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 27755575u, 61562891u, 35105907u, 91702270u, 50781250u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 55511151u, 23125782u, 70211815u, 83404541u,  1562500u }, -24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        1u, 11022302u, 46251565u, 40423631u, 66809082u,  3125000u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        2u, 22044604u, 92503130u, 80847263u, 33618164u,  6250000u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        4u, 44089209u, 85006261u, 61694526u, 67236328u, 12500000u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        8u, 88178419u, 70012523u, 23389053u, 34472656u, 25000000u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       17u, 76356839u, 40025046u, 46778106u, 68945312u, 50000000u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       35u, 52713678u, 80050092u, 93556213u, 37890625u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       71u,  5427357u, 60100185u, 87112426u, 75781250u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      142u, 10854715u, 20200371u, 74224853u, 51562500u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      284u, 21709430u, 40400743u, 48449707u,  3125000u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      568u, 43418860u, 80801486u, 96899414u,  6250000u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     1136u, 86837721u, 61602973u, 93798828u, 12500000u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     2273u, 73675443u, 23205947u, 87597656u, 25000000u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     4547u, 47350886u, 46411895u, 75195312u, 50000000u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     9094u, 94701772u, 92823791u, 50390625u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    18189u, 89403545u, 85647583u,   781250u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    36379u, 78807091u, 71295166u,  1562500u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    72759u, 57614183u, 42590332u,  3125000u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   145519u, 15228366u, 85180664u,  6250000u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   291038u, 30456733u, 70361328u, 12500000u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   582076u, 60913467u, 40722656u, 25000000u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  1164153u, 21826934u, 81445312u, 50000000u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  2328306u, 43653869u, 62890625u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  4656612u, 87307739u, 25781250u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  9313225u, 74615478u, 51562500u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 18626451u, 49230957u,  3125000u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 37252902u, 98461914u,  6250000u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 74505805u, 96923828u, 12500000u }, -16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        1u, 49011611u, 93847656u, 25000000u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        2u, 98023223u, 87695312u, 50000000u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        5u, 96046447u, 75390625u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       11u, 92092895u, 50781250u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       23u, 84185791u,  1562500u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       47u, 68371582u,  3125000u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       95u, 36743164u,  6250000u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      190u, 73486328u, 12500000u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      381u, 46972656u, 25000000u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      762u, 93945312u, 50000000u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     1525u, 87890625u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     3051u, 75781250u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     6103u, 51562500u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    12207u,  3125000u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    24414u,  6250000u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    48828u, 12500000u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    97656u, 25000000u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   195312u, 50000000u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   390625u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   781250u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  1562500u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  3125000u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  6250000u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 12500000u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 25000000u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 50000000u }, -8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        1u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        2u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        4u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        8u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       16u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       32u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       64u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      128u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      256u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      512u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     1024u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     2048u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     4096u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     8192u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    16384u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    32768u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    65536u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   131072u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   262144u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   524288u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  1048576u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  2097152u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  4194304u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  8388608u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 16777216u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 33554432u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 67108864u },  0 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        1u, 34217728u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        2u, 68435456u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        5u, 36870912u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       10u, 73741824u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       21u, 47483648u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       42u, 94967296u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       85u, 89934592u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      171u, 79869184u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      343u, 59738368u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      687u, 19476736u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     1374u, 38953472u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     2748u, 77906944u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     5497u, 55813888u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    10995u, 11627776u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    21990u, 23255552u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    43980u, 46511104u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    87960u, 93022208u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   175921u, 86044416u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   351843u, 72088832u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   703687u, 44177664u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  1407374u, 88355328u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  2814749u, 76710656u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  5629499u, 53421312u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 11258999u,  6842624u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 22517998u, 13685248u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 45035996u, 27370496u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 90071992u, 54740992u },  8 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        1u, 80143985u,  9481984u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        3u, 60287970u, 18963968u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        7u, 20575940u, 37927936u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       14u, 41151880u, 75855872u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       28u, 82303761u, 51711744u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       57u, 64607523u,  3423488u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      115u, 29215046u,  6846976u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      230u, 58430092u, 13693952u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      461u, 16860184u, 27387904u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      922u, 33720368u, 54775808u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     1844u, 67440737u,  9551616u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     3689u, 34881474u, 19103232u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     7378u, 69762948u, 38206464u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    14757u, 39525896u, 76412928u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    29514u, 79051793u, 52825856u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    59029u, 58103587u,  5651712u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   118059u, 16207174u, 11303424u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   236118u, 32414348u, 22606848u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   472236u, 64828696u, 45213696u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   944473u, 29657392u, 90427392u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  1888946u, 59314785u, 80854784u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  3777893u, 18629571u, 61709568u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  7555786u, 37259143u, 23419136u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 15111572u, 74518286u, 46838272u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 30223145u, 49036572u, 93676544u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 60446290u, 98073145u, 87353088u }, 16 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        1u, 20892581u, 96146291u, 74706176u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        2u, 41785163u, 92292583u, 49412352u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        4u, 83570327u, 84585166u, 98824704u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        9u, 67140655u, 69170333u, 97649408u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       19u, 34281311u, 38340667u, 95298816u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       38u, 68562622u, 76681335u, 90597632u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       77u, 37125245u, 53362671u, 81195264u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      154u, 74250491u,  6725343u, 62390528u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      309u, 48500982u, 13450687u, 24781056u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      618u, 97001964u, 26901374u, 49562112u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     1237u, 94003928u, 53802748u, 99124224u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     2475u, 88007857u,  7605497u, 98248448u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     4951u, 76015714u, 15210995u, 96496896u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     9903u, 52031428u, 30421991u, 92993792u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    19807u,  4062856u, 60843983u, 85987584u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    39614u,  8125713u, 21687967u, 71975168u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    79228u, 16251426u, 43375935u, 43950336u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   158456u, 32502852u, 86751870u, 87900672u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   316912u, 65005705u, 73503741u, 75801344u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   633825u, 30011411u, 47007483u, 51602688u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  1267650u, 60022822u, 94014967u,  3205376u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  2535301u, 20045645u, 88029934u,  6410752u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  5070602u, 40091291u, 76059868u, 12821504u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 10141204u, 80182583u, 52119736u, 25643008u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 20282409u, 60365167u,  4239472u, 51286016u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 40564819u, 20730334u,  8478945u,  2572032u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( { 81129638u, 41460668u, 16957890u,  5144064u }, 24 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        1u, 62259276u, 82921336u, 33915780u, 10288128u }, 32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        3u, 24518553u, 65842672u, 67831560u, 20576256u }, 32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {        6u, 49037107u, 31685345u, 35663120u, 41152512u }, 32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       12u, 98074214u, 63370690u, 71326240u, 82305024u }, 32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       25u, 96148429u, 26741381u, 42652481u, 64610048u }, 32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {       51u, 92296858u, 53482762u, 85304963u, 29220096u }, 32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      103u, 84593717u,  6965525u, 70609926u, 58440192u }, 32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      207u, 69187434u, 13931051u, 41219853u, 16880384u }, 32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      415u, 38374868u, 27862102u, 82439706u, 33760768u }, 32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {      830u, 76749736u, 55724205u, 64879412u, 67521536u }, 32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     1661u, 53499473u, 11448411u, 29758825u, 35043072u }, 32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     3323u,  6998946u, 22896822u, 59517650u, 70086144u }, 32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {     6646u, 13997892u, 45793645u, 19035301u, 40172288u }, 32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    13292u, 27995784u, 91587290u, 38070602u, 80344576u }, 32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    26584u, 55991569u, 83174580u, 76141205u, 60689152u }, 32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {    53169u, 11983139u, 66349161u, 52282411u, 21378304u }, 32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   106338u, 23966279u, 32698323u,  4564822u, 42756608u }, 32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   212676u, 47932558u, 65396646u,  9129644u, 85513216u }, 32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   425352u, 95865117u, 30793292u, 18259289u, 71026432u }, 32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {   850705u, 91730234u, 61586584u, 36518579u, 42052864u }, 32 ),\n      cpp_dec_float<Digits10, ExponentType, Allocator>::from_lst( {  1701411u, 83460469u, 23173168u, 73037158u, 84105728u }, 32 ),\n   }};\n\n   cpp_dec_float<Digits10, ExponentType, Allocator> t;\n\n   if(p < -128L)\n      default_ops::detail::pow_imp(t, cpp_dec_float<Digits10, ExponentType, Allocator>::half(), static_cast<unsigned long long>(-p), std::integral_constant<bool, false>());\n   else if ((p >= -128L) && (p <= 127L))\n      t = local_pow2_data[std::size_t(p + 128)];\n   else\n      default_ops::detail::pow_imp(t, cpp_dec_float<Digits10, ExponentType, Allocator>::two(), static_cast<unsigned long long>(p), std::integral_constant<bool, false>());\n\n   return t;\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_add(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& o)\n{\n   result += o;\n}\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_subtract(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& o)\n{\n   result -= o;\n}\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_multiply(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& o)\n{\n   result *= o;\n}\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_divide(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& o)\n{\n   result /= o;\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_add(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const unsigned long long& o)\n{\n   result.add_unsigned_long_long(o);\n}\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_subtract(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const unsigned long long& o)\n{\n   result.sub_unsigned_long_long(o);\n}\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_multiply(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const unsigned long long& o)\n{\n   result.mul_unsigned_long_long(o);\n}\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_divide(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const unsigned long long& o)\n{\n   result.div_unsigned_long_long(o);\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_add(cpp_dec_float<Digits10, ExponentType, Allocator>& result, long long o)\n{\n   if (o < 0)\n      result.sub_unsigned_long_long(boost::multiprecision::detail::unsigned_abs(o));\n   else\n   {\n      using local_ulonglong_type = typename boost::multiprecision::detail::make_unsigned<long long>::type;\n\n      result.add_unsigned_long_long(static_cast<local_ulonglong_type>(o));\n   }\n}\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_subtract(cpp_dec_float<Digits10, ExponentType, Allocator>& result, long long o)\n{\n   if (o < 0)\n      result.add_unsigned_long_long(boost::multiprecision::detail::unsigned_abs(o));\n   else\n   {\n      using local_ulonglong_type = typename boost::multiprecision::detail::make_unsigned<long long>::type;\n\n      result.sub_unsigned_long_long(static_cast<local_ulonglong_type>(o));\n   }\n}\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_multiply(cpp_dec_float<Digits10, ExponentType, Allocator>& result, long long o)\n{\n   if (o < 0)\n   {\n      result.mul_unsigned_long_long(boost::multiprecision::detail::unsigned_abs(o));\n      result.negate();\n   }\n   else\n   {\n      using local_ulonglong_type = typename boost::multiprecision::detail::make_unsigned<long long>::type;\n\n      result.mul_unsigned_long_long(static_cast<local_ulonglong_type>(o));\n   }\n}\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_divide(cpp_dec_float<Digits10, ExponentType, Allocator>& result, long long o)\n{\n   if (o < 0)\n   {\n      result.div_unsigned_long_long(boost::multiprecision::detail::unsigned_abs(o));\n      result.negate();\n   }\n   else\n   {\n      using local_ulonglong_type = typename boost::multiprecision::detail::make_unsigned<long long>::type;\n\n      result.div_unsigned_long_long(static_cast<local_ulonglong_type>(o));\n   }\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_convert_to(unsigned long long* result, const cpp_dec_float<Digits10, ExponentType, Allocator>& val)\n{\n   *result = val.extract_unsigned_long_long();\n}\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_convert_to(long long* result, const cpp_dec_float<Digits10, ExponentType, Allocator>& val)\n{\n   *result = val.extract_signed_long_long();\n}\n#ifdef BOOST_HAS_INT128\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_convert_to(uint128_type* result, const cpp_dec_float<Digits10, ExponentType, Allocator>& val)\n{\n   *result = val.extract_unsigned_int128();\n}\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_convert_to(int128_type* result, const cpp_dec_float<Digits10, ExponentType, Allocator>& val)\n{\n   *result = val.extract_signed_int128();\n}\n#endif\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_convert_to(long double* result, const cpp_dec_float<Digits10, ExponentType, Allocator>& val)\n{\n   *result = val.extract_long_double();\n}\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_convert_to(double* result, const cpp_dec_float<Digits10, ExponentType, Allocator>& val)\n{\n   *result = val.extract_double();\n}\n#if defined(BOOST_HAS_FLOAT128)\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_convert_to(float128_type* result, const cpp_dec_float<Digits10, ExponentType, Allocator>& val)\n{\n   *result = float128_procs::strtoflt128(val.str(0, std::ios_base::scientific).c_str(), nullptr);\n}\n#endif\n\n//\n// Non member function support:\n//\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline int eval_fpclassify(const cpp_dec_float<Digits10, ExponentType, Allocator>& x)\n{\n   if ((x.isinf)())\n      return FP_INFINITE;\n   if ((x.isnan)())\n      return FP_NAN;\n   if (x.iszero())\n      return FP_ZERO;\n   return FP_NORMAL;\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_abs(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& x)\n{\n   result = x;\n   if (x.isneg())\n      result.negate();\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_fabs(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& x)\n{\n   result = x;\n   if (x.isneg())\n      result.negate();\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_sqrt(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& x)\n{\n   result = x;\n   result.calculate_sqrt();\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_floor(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& x)\n{\n   result = x;\n   if (!(x.isfinite)() || x.isint())\n   {\n      if ((x.isnan)())\n         errno = EDOM;\n      return;\n   }\n\n   if (x.isneg())\n      result -= cpp_dec_float<Digits10, ExponentType, Allocator>::one();\n   result = result.extract_integer_part();\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_ceil(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& x)\n{\n   result = x;\n   if (!(x.isfinite)() || x.isint())\n   {\n      if ((x.isnan)())\n         errno = EDOM;\n      return;\n   }\n\n   if (!x.isneg())\n      result += cpp_dec_float<Digits10, ExponentType, Allocator>::one();\n   result = result.extract_integer_part();\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_trunc(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& x)\n{\n   if (x.isint() || !(x.isfinite)())\n   {\n      result = x;\n      if ((x.isnan)())\n         errno = EDOM;\n      return;\n   }\n   result = x.extract_integer_part();\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline ExponentType eval_ilogb(const cpp_dec_float<Digits10, ExponentType, Allocator>& val)\n{\n   if (val.iszero())\n      return (std::numeric_limits<typename cpp_dec_float<Digits10, ExponentType, Allocator>::exponent_type>::min)();\n   if ((val.isinf)())\n      return INT_MAX;\n   if ((val.isnan)())\n#ifdef FP_ILOGBNAN\n      return FP_ILOGBNAN;\n#else\n      return INT_MAX;\n#endif\n   // Set result, to the exponent of val:\n   return val.order();\n}\ntemplate <unsigned Digits10, class ExponentType, class Allocator, class ArgType>\ninline void eval_scalbn(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& val, ArgType e_)\n{\n   using default_ops::eval_multiply;\n   const typename cpp_dec_float<Digits10, ExponentType, Allocator>::exponent_type e = static_cast<typename cpp_dec_float<Digits10, ExponentType, Allocator>::exponent_type>(e_);\n   cpp_dec_float<Digits10, ExponentType, Allocator> t(1.0, e);\n   eval_multiply(result, val, t);\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator, class ArgType>\ninline void eval_ldexp(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& x, ArgType e)\n{\n   const long long the_exp = static_cast<long long>(e);\n\n   if ((the_exp > (std::numeric_limits<typename cpp_dec_float<Digits10, ExponentType, Allocator>::exponent_type>::max)()) || (the_exp < (std::numeric_limits<typename cpp_dec_float<Digits10, ExponentType, Allocator>::exponent_type>::min)()))\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(std::string(\"Exponent value is out of range.\")));\n\n   result = x;\n\n   if ((the_exp > static_cast<long long>(-std::numeric_limits<long long>::digits)) && (the_exp < static_cast<long long>(0)))\n      result.div_unsigned_long_long(1ULL << static_cast<long long>(-the_exp));\n   else if ((the_exp < static_cast<long long>(std::numeric_limits<long long>::digits)) && (the_exp > static_cast<long long>(0)))\n      result.mul_unsigned_long_long(1ULL << the_exp);\n   else if (the_exp != static_cast<long long>(0))\n   {\n      if ((the_exp < cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_min_exp / 2) && (x.order() > 0))\n      {\n         long long half_exp = e / 2;\n         cpp_dec_float<Digits10, ExponentType, Allocator> t = cpp_dec_float<Digits10, ExponentType, Allocator>::pow2(half_exp);\n         result *= t;\n         if (2 * half_exp != e)\n            t *= 2;\n         result *= t;\n      }\n      else\n         result *= cpp_dec_float<Digits10, ExponentType, Allocator>::pow2(e);\n   }\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline void eval_frexp(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& x, ExponentType* e)\n{\n   result = x;\n\n   if (result.iszero() || (result.isinf)() || (result.isnan)())\n   {\n      *e = 0;\n      return;\n   }\n\n   if (result.isneg())\n      result.negate();\n\n   typename cpp_dec_float<Digits10, ExponentType, Allocator>::exponent_type t = result.order();\n   BOOST_MP_USING_ABS\n   if (abs(t) < ((std::numeric_limits<typename cpp_dec_float<Digits10, ExponentType, Allocator>::exponent_type>::max)() / 1000))\n   {\n      t *= 1000;\n      t /= 301;\n   }\n   else\n   {\n      t /= 301;\n      t *= 1000;\n   }\n\n   result *= cpp_dec_float<Digits10, ExponentType, Allocator>::pow2(-t);\n\n   if (result.iszero() || (result.isinf)() || (result.isnan)())\n   {\n      // pow2 overflowed, slip the calculation up:\n      result = x;\n      if (result.isneg())\n         result.negate();\n      t /= 2;\n      result *= cpp_dec_float<Digits10, ExponentType, Allocator>::pow2(-t);\n   }\n   BOOST_MP_USING_ABS\n   if (abs(result.order()) > 5)\n   {\n      // If our first estimate doesn't get close enough then try recursion until we do:\n      typename cpp_dec_float<Digits10, ExponentType, Allocator>::exponent_type e2;\n      cpp_dec_float<Digits10, ExponentType, Allocator>                         r2;\n      eval_frexp(r2, result, &e2);\n      // overflow protection:\n      if ((t > 0) && (e2 > 0) && (t > (std::numeric_limits<typename cpp_dec_float<Digits10, ExponentType, Allocator>::exponent_type>::max)() - e2))\n         BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Exponent is too large to be represented as a power of 2.\"));\n      if ((t < 0) && (e2 < 0) && (t < (std::numeric_limits<typename cpp_dec_float<Digits10, ExponentType, Allocator>::exponent_type>::min)() - e2))\n         BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Exponent is too large to be represented as a power of 2.\"));\n      t += e2;\n      result = r2;\n   }\n\n   while (result.compare(cpp_dec_float<Digits10, ExponentType, Allocator>::one()) >= 0)\n   {\n      result /= cpp_dec_float<Digits10, ExponentType, Allocator>::two();\n      ++t;\n   }\n   while (result.compare(cpp_dec_float<Digits10, ExponentType, Allocator>::half()) < 0)\n   {\n      result *= cpp_dec_float<Digits10, ExponentType, Allocator>::two();\n      --t;\n   }\n   *e = t;\n   if (x.isneg())\n      result.negate();\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline typename std::enable_if< !std::is_same<ExponentType, int>::value>::type eval_frexp(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& x, int* e)\n{\n   typename cpp_dec_float<Digits10, ExponentType, Allocator>::exponent_type t;\n   eval_frexp(result, x, &t);\n   if ((t > (std::numeric_limits<int>::max)()) || (t < (std::numeric_limits<int>::min)()))\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Exponent is outside the range of an int\"));\n   *e = static_cast<int>(t);\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline bool eval_is_zero(const cpp_dec_float<Digits10, ExponentType, Allocator>& val)\n{\n   return val.iszero();\n}\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline int eval_get_sign(const cpp_dec_float<Digits10, ExponentType, Allocator>& val)\n{\n   return val.iszero() ? 0 : val.isneg() ? -1 : 1;\n}\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\ninline std::size_t hash_value(const cpp_dec_float<Digits10, ExponentType, Allocator>& val)\n{\n   return val.hash();\n}\n\n} // namespace backends\n\nusing boost::multiprecision::backends::cpp_dec_float;\n\nusing cpp_dec_float_50 = number<cpp_dec_float<50> > ;\nusing cpp_dec_float_100 = number<cpp_dec_float<100> >;\n\nnamespace detail {\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator>\nstruct transcendental_reduction_type<boost::multiprecision::backends::cpp_dec_float<Digits10, ExponentType, Allocator> >\n{\n   //\n   // The type used for trigonometric reduction needs 3 times the precision of the base type.\n   // This is double the precision of the original type, plus the largest exponent supported.\n   // As a practical measure the largest argument supported is 1/eps, as supporting larger\n   // arguments requires the division of argument by PI/2 to also be done at higher precision,\n   // otherwise the result (an integer) can not be represented exactly.\n   // \n   // See ARGUMENT REDUCTION FOR HUGE ARGUMENTS. K C Ng.\n   //\n   using type = boost::multiprecision::backends::cpp_dec_float<Digits10 * 3, ExponentType, Allocator>;\n};\n\n} // namespace detail\n\n\n}} // namespace boost::multiprecision\n\nnamespace std {\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nclass numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >\n{\n public:\n   static constexpr bool                    is_specialized    = true;\n   static constexpr bool                    is_signed         = true;\n   static constexpr bool                    is_integer        = false;\n   static constexpr bool                    is_exact          = false;\n   static constexpr bool                    is_bounded        = true;\n   static constexpr bool                    is_modulo         = false;\n   static constexpr bool                    is_iec559         = false;\n   static constexpr int                     digits            = boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_digits10;\n   static constexpr int                     digits10          = boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_digits10;\n   static constexpr int                     max_digits10      = boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_max_digits10;\n   static constexpr typename boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::exponent_type min_exponent                = boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_min_exp;   // Type differs from int.\n   static constexpr typename boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::exponent_type min_exponent10              = boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_min_exp10; // Type differs from int.\n   static constexpr typename boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::exponent_type max_exponent                = boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_max_exp;   // Type differs from int.\n   static constexpr typename boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::exponent_type max_exponent10              = boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_max_exp10; // Type differs from int.\n   static constexpr int                     radix             = boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_radix;\n   static constexpr std::float_round_style  round_style       = std::round_indeterminate;\n   static constexpr bool                    has_infinity      = true;\n   static constexpr bool                    has_quiet_NaN     = true;\n   static constexpr bool                    has_signaling_NaN = false;\n   static constexpr std::float_denorm_style has_denorm        = std::denorm_absent;\n   static constexpr bool                    has_denorm_loss   = false;\n   static constexpr bool                    traps             = false;\n   static constexpr bool                    tinyness_before   = false;\n\n   static constexpr boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates>(min)() { return (boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::min)(); }\n   static constexpr boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates>(max)() { return (boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::max)(); }\n   static constexpr boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> lowest() { return boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::zero(); }\n   static constexpr boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> epsilon() { return boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::eps(); }\n   static constexpr boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> round_error() { return 0.5L; }\n   static constexpr boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> infinity() { return boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::inf(); }\n   static constexpr boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> quiet_NaN() { return boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::nan(); }\n   static constexpr boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> signaling_NaN() { return boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::zero(); }\n   static constexpr boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> denorm_min() { return boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::zero(); }\n};\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::digits;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::digits10;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::max_digits10;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::is_signed;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::is_integer;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::is_exact;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::radix;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr typename boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::exponent_type numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::min_exponent;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr typename boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::exponent_type numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::min_exponent10;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr typename boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::exponent_type numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::max_exponent;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr typename boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::exponent_type numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::max_exponent10;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::has_infinity;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::has_quiet_NaN;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::has_signaling_NaN;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_denorm_style numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::has_denorm;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::has_denorm_loss;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::is_iec559;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::is_bounded;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::is_modulo;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::traps;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::tinyness_before;\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_round_style numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::round_style;\n\n} // namespace std\n\n#ifdef BOOST_MP_MATH_AVAILABLE\nnamespace boost {\nnamespace math {\n\nnamespace policies {\n\ntemplate <unsigned Digits10, class ExponentType, class Allocator, class Policy, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct precision<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates>, Policy>\n{\n   // Define a local copy of cpp_dec_float_digits10 because it might differ\n   // from the template parameter Digits10 for small or large digit counts.\n   static constexpr std::int32_t cpp_dec_float_digits10 = boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_digits10;\n\n   using precision_type = typename Policy::precision_type                           ;\n   using digits_2 = digits2<((cpp_dec_float_digits10 + 1LL) * 1000LL) / 301LL>;\n   using type = typename std::conditional<\n       ((digits_2::value <= precision_type::value) || (Policy::precision_type::value <= 0)),\n       // Default case, full precision for RealType:\n       digits_2,\n       // User customized precision:\n       precision_type>::type;\n};\n\n}\n\n}} // namespace boost::math::policies\n#endif\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_int/add.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// Comparison operators for cpp_int_backend:\n//\n#ifndef BOOST_MP_CPP_INT_ADD_HPP\n#define BOOST_MP_CPP_INT_ADD_HPP\n\n#include <boost/multiprecision/detail/constexpr.hpp>\n#include <boost/multiprecision/cpp_int/add_unsigned.hpp>\n\nnamespace boost { namespace multiprecision { namespace backends {\n\n//\n// As above, but for adding a single limb to a non-trivial cpp_int:\n//\ntemplate <class CppInt1, class CppInt2>\ninline BOOST_MP_CXX14_CONSTEXPR void add_unsigned(CppInt1& result, const CppInt2& a, const limb_type& o) noexcept(is_non_throwing_cpp_int<CppInt1>::value)\n{\n   // Addition using modular arithmetic.\n   // Nothing fancy, just let uintmax_t take the strain:\n   if (&result != &a)\n      result.resize(a.size(), a.size());\n   double_limb_type                     carry = o;\n   typename CppInt1::limb_pointer       pr    = result.limbs();\n   typename CppInt2::const_limb_pointer pa    = a.limbs();\n   std::size_t                             i     = 0;\n   // Addition with carry until we either run out of digits or carry is zero:\n   for (; carry && (i < result.size()); ++i)\n   {\n      carry += static_cast<double_limb_type>(pa[i]);\n#ifdef __MSVC_RUNTIME_CHECKS\n      pr[i] = static_cast<limb_type>(carry & ~static_cast<limb_type>(0));\n#else\n      pr[i] = static_cast<limb_type>(carry);\n#endif\n      carry >>= CppInt1::limb_bits;\n   }\n   // Just copy any remaining digits:\n   if (&a != &result)\n   {\n      std_constexpr::copy(pa + i, pa + a.size(), pr + i);\n   }\n   if (carry)\n   {\n      // We overflowed, need to add one more limb:\n      std::size_t x = result.size();\n      result.resize(x + 1, x + 1);\n      if (result.size() > x)\n         result.limbs()[x] = static_cast<limb_type>(carry);\n   }\n   result.normalize();\n   result.sign(a.sign());\n}\n//\n// And again to subtract a single limb:\n//\ntemplate <class CppInt1, class CppInt2>\ninline BOOST_MP_CXX14_CONSTEXPR void subtract_unsigned(CppInt1& result, const CppInt2& a, const limb_type& b) noexcept(is_non_throwing_cpp_int<CppInt1>::value)\n{\n   // Subtract one limb.\n   // Nothing fancy, just let uintmax_t take the strain:\n   constexpr double_limb_type borrow = static_cast<double_limb_type>(CppInt1::max_limb_value) + 1;\n   result.resize(a.size(), a.size());\n   typename CppInt1::limb_pointer       pr = result.limbs();\n   typename CppInt2::const_limb_pointer pa = a.limbs();\n   if (*pa >= b)\n   {\n      *pr = *pa - b;\n      if (&result != &a)\n      {\n         std_constexpr::copy(pa + 1, pa + a.size(), pr + 1);\n         result.sign(a.sign());\n      }\n      else if ((result.size() == 1) && (*pr == 0))\n      {\n         result.sign(false); // zero is unsigned.\n      }\n   }\n   else if (result.size() == 1)\n   {\n      *pr = b - *pa;\n      result.sign(!a.sign());\n   }\n   else\n   {\n      *pr        = static_cast<limb_type>((borrow + *pa) - b);\n      std::size_t i = 1;\n      while (!pa[i])\n      {\n         pr[i] = CppInt1::max_limb_value;\n         ++i;\n      }\n      pr[i] = pa[i] - 1;\n      if (&result != &a)\n      {\n         ++i;\n         std_constexpr::copy(pa + i, pa + a.size(), pr + i);\n      }\n      result.normalize();\n      result.sign(a.sign());\n   }\n}\n\n//\n// Now the actual functions called by the front end, all of which forward to one of the above:\n//\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_add(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   eval_add(result, result, o);\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, std::size_t MinBits3, std::size_t MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3> >::value>::type\neval_add(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,\n    const cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3>& b) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   if (a.sign() != b.sign())\n   {\n      subtract_unsigned(result, a, b);\n      return;\n   }\n   add_unsigned(result, a, b);\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_add(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, const limb_type& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   if (result.sign())\n   {\n      subtract_unsigned(result, result, o);\n   }\n   else\n      add_unsigned(result, result, o);\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_add(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,\n    const limb_type&                                                            o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   if (a.sign())\n   {\n      subtract_unsigned(result, a, o);\n   }\n   else\n      add_unsigned(result, a, o);\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_add(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,\n    const signed_limb_type&                                               o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   if (o < 0)\n      eval_subtract(result, static_cast<limb_type>(boost::multiprecision::detail::unsigned_abs(o)));\n   else if (o > 0)\n      eval_add(result, static_cast<limb_type>(o));\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_add(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,\n    const signed_limb_type&                                                     o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   if (o < 0)\n      eval_subtract(result, a, static_cast<limb_type>(boost::multiprecision::detail::unsigned_abs(o)));\n   else if (o > 0)\n      eval_add(result, a, static_cast<limb_type>(o));\n   else if (&result != &a)\n      result = a;\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_subtract(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,\n    const limb_type&                                                      o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   if (result.sign())\n   {\n      add_unsigned(result, result, o);\n   }\n   else\n      subtract_unsigned(result, result, o);\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_subtract(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,\n    const limb_type&                                                            o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   if (a.sign())\n   {\n      add_unsigned(result, a, o);\n   }\n   else\n   {\n      subtract_unsigned(result, a, o);\n   }\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_subtract(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,\n    const signed_limb_type&                                               o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   if (o)\n   {\n      if (o < 0)\n         eval_add(result, static_cast<limb_type>(boost::multiprecision::detail::unsigned_abs(o)));\n      else\n         eval_subtract(result, static_cast<limb_type>(o));\n   }\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_subtract(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,\n    const signed_limb_type&                                                     o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   if (o)\n   {\n      if (o < 0)\n         eval_add(result, a, static_cast<limb_type>(boost::multiprecision::detail::unsigned_abs(o)));\n      else\n         eval_subtract(result, a, static_cast<limb_type>(o));\n   }\n   else if (&result != &a)\n      result = a;\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_increment(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   constexpr limb_type one = 1;\n\n   if (!result.sign() && (result.limbs()[0] < cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::max_limb_value))\n      ++result.limbs()[0];\n   else if (result.sign() && result.limbs()[0])\n   {\n      --result.limbs()[0];\n      if (!result.limbs()[0] && (result.size() == 1))\n         result.sign(false);\n   }\n   else\n      eval_add(result, one);\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_decrement(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   constexpr limb_type one = 1;\n\n   if (!result.sign() && result.limbs()[0])\n      --result.limbs()[0];\n   else if (result.sign() && (result.limbs()[0] < cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::max_limb_value))\n      ++result.limbs()[0];\n   else\n      eval_subtract(result, one);\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_subtract(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   eval_subtract(result, result, o);\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, std::size_t MinBits3, std::size_t MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3> >::value>::type\neval_subtract(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,\n    const cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3>& b) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   if (a.sign() != b.sign())\n   {\n      add_unsigned(result, a, b);\n      return;\n   }\n   subtract_unsigned(result, a, b);\n}\n\n//\n// Simple addition and subtraction routine for trivial cpp_int's come last:\n//\n// One of the arguments is signed:\n//\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value)>::type\neval_add(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   if (result.sign() != o.sign())\n   {\n      if (*o.limbs() > *result.limbs())\n      {\n         *result.limbs() = detail::checked_subtract(*o.limbs(), *result.limbs(), typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n         result.negate();\n      }\n      else\n         *result.limbs() = detail::checked_subtract(*result.limbs(), *o.limbs(), typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n   }\n   else\n      *result.limbs() = detail::checked_add(*result.limbs(), *o.limbs(), typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n   result.normalize();\n}\n// Simple version for two unsigned arguments:\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_add(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n         const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   *result.limbs() = detail::checked_add(*result.limbs(), *o.limbs(), typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n   result.normalize();\n}\n\n// signed subtraction:\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value)>::type\neval_subtract(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   if (result.sign() != o.sign())\n   {\n      *result.limbs() = detail::checked_add(*result.limbs(), *o.limbs(), typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n   }\n   else if (*result.limbs() < *o.limbs())\n   {\n      *result.limbs() = detail::checked_subtract(*o.limbs(), *result.limbs(), typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n      result.negate();\n   }\n   else\n      *result.limbs() = detail::checked_subtract(*result.limbs(), *o.limbs(), typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n   result.normalize();\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_subtract(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   *result.limbs() = detail::checked_subtract(*result.limbs(), *o.limbs(), typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n   result.normalize();\n}\n\n}}} // namespace boost::multiprecision::backends\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_int/add_unsigned.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2020 Madhur Chauhan. \n//  Copyright 2020 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_ADD_UNSIGNED_HPP\n#define BOOST_MP_ADD_UNSIGNED_HPP\n\n#include <boost/multiprecision/cpp_int/intel_intrinsics.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n\nnamespace boost { namespace multiprecision { namespace backends {\n\ntemplate <class CppInt1, class CppInt2, class CppInt3>\ninline BOOST_MP_CXX14_CONSTEXPR void add_unsigned_constexpr(CppInt1& result, const CppInt2& a, const CppInt3& b) noexcept(is_non_throwing_cpp_int<CppInt1>::value)\n{\n   using ::boost::multiprecision::std_constexpr::swap;\n   //\n   // This is the generic, C++ only version of addition.\n   // It's also used for all constexpr branches, hence the name.\n   // Nothing fancy, just let uintmax_t take the strain:\n   //\n   double_limb_type carry = 0;\n   std::size_t         m(0), x(0);\n   std::size_t         as = a.size();\n   std::size_t         bs = b.size();\n   minmax(as, bs, m, x);\n   if (x == 1)\n   {\n      bool s = a.sign();\n      result = static_cast<double_limb_type>(*a.limbs()) + static_cast<double_limb_type>(*b.limbs());\n      result.sign(s);\n      return;\n   }\n   result.resize(x, x);\n   typename CppInt2::const_limb_pointer pa     = a.limbs();\n   typename CppInt3::const_limb_pointer pb     = b.limbs();\n   typename CppInt1::limb_pointer       pr     = result.limbs();\n   typename CppInt1::limb_pointer       pr_end = pr + m;\n\n   if (as < bs)\n      swap(pa, pb);\n\n   // First where a and b overlap:\n   while (pr != pr_end)\n   {\n      carry += static_cast<double_limb_type>(*pa) + static_cast<double_limb_type>(*pb);\n#ifdef __MSVC_RUNTIME_CHECKS\n      *pr = static_cast<limb_type>(carry & ~static_cast<limb_type>(0));\n#else\n      *pr = static_cast<limb_type>(carry);\n#endif\n      carry >>= CppInt1::limb_bits;\n      ++pr, ++pa, ++pb;\n   }\n   pr_end += x - m;\n   // Now where only a has digits:\n   while (pr != pr_end)\n   {\n      if (!carry)\n      {\n         if (pa != pr)\n            std_constexpr::copy(pa, pa + (pr_end - pr), pr);\n         break;\n      }\n      carry += static_cast<double_limb_type>(*pa);\n#ifdef __MSVC_RUNTIME_CHECKS\n      *pr = static_cast<limb_type>(carry & ~static_cast<limb_type>(0));\n#else\n      *pr = static_cast<limb_type>(carry);\n#endif\n      carry >>= CppInt1::limb_bits;\n      ++pr, ++pa;\n   }\n   if (carry)\n   {\n      // We overflowed, need to add one more limb:\n      result.resize(x + 1, x + 1);\n      if (result.size() > x)\n         result.limbs()[x] = static_cast<limb_type>(1u);\n   }\n   result.normalize();\n   result.sign(a.sign());\n}\n//\n// Core subtraction routine for all non-trivial cpp_int's:\n//\ntemplate <class CppInt1, class CppInt2, class CppInt3>\ninline BOOST_MP_CXX14_CONSTEXPR void subtract_unsigned_constexpr(CppInt1& result, const CppInt2& a, const CppInt3& b) noexcept(is_non_throwing_cpp_int<CppInt1>::value)\n{\n   using ::boost::multiprecision::std_constexpr::swap;\n   //\n   // This is the generic, C++ only version of subtraction.\n   // It's also used for all constexpr branches, hence the name.\n   // Nothing fancy, just let uintmax_t take the strain:\n   //\n   double_limb_type borrow = 0;\n   std::size_t         m(0), x(0);\n   minmax(a.size(), b.size(), m, x);\n   //\n   // special cases for small limb counts:\n   //\n   if (x == 1)\n   {\n      bool      s  = a.sign();\n      limb_type al = *a.limbs();\n      limb_type bl = *b.limbs();\n      if (bl > al)\n      {\n         ::boost::multiprecision::std_constexpr::swap(al, bl);\n         s = !s;\n      }\n      result = al - bl;\n      result.sign(s);\n      return;\n   }\n   // This isn't used till later, but comparison has to occur before we resize the result,\n   // as that may also resize a or b if this is an inplace operation:\n   int c = a.compare_unsigned(b);\n   // Set up the result vector:\n   result.resize(x, x);\n   // Now that a, b, and result are stable, get pointers to their limbs:\n   typename CppInt2::const_limb_pointer pa      = a.limbs();\n   typename CppInt3::const_limb_pointer pb      = b.limbs();\n   typename CppInt1::limb_pointer       pr      = result.limbs();\n   bool                                 swapped = false;\n   if (c < 0)\n   {\n      swap(pa, pb);\n      swapped = true;\n   }\n   else if (c == 0)\n   {\n      result = static_cast<limb_type>(0);\n      return;\n   }\n\n   std::size_t i = 0;\n   // First where a and b overlap:\n   while (i < m)\n   {\n      borrow = static_cast<double_limb_type>(pa[i]) - static_cast<double_limb_type>(pb[i]) - borrow;\n      pr[i]  = static_cast<limb_type>(borrow);\n      borrow = (borrow >> CppInt1::limb_bits) & 1u;\n      ++i;\n   }\n   // Now where only a has digits, only as long as we've borrowed:\n   while (borrow && (i < x))\n   {\n      borrow = static_cast<double_limb_type>(pa[i]) - borrow;\n      pr[i]  = static_cast<limb_type>(borrow);\n      borrow = (borrow >> CppInt1::limb_bits) & 1u;\n      ++i;\n   }\n   // Any remaining digits are the same as those in pa:\n   if ((x != i) && (pa != pr))\n      std_constexpr::copy(pa + i, pa + x, pr + i);\n   BOOST_MP_ASSERT(0 == borrow);\n\n   //\n   // We may have lost digits, if so update limb usage count:\n   //\n   result.normalize();\n   result.sign(a.sign());\n   if (swapped)\n      result.negate();\n}\n\n\n#ifdef BOOST_MP_HAS_IMMINTRIN_H\n//\n// This is the key addition routine where all the argument types are non-trivial cpp_int's:\n//\n//\n// This optimization is limited to: GCC, LLVM, ICC (Intel), MSVC for x86_64 and i386.\n// If your architecture and compiler supports ADC intrinsic, please file a bug\n//\n// As of May, 2020 major compilers don't recognize carry chain though adc\n// intrinsics are used to hint compilers to use ADC and still compilers don't\n// unroll the loop efficiently (except LLVM) so manual unrolling is done.\n//\n// Also note that these intrinsics were only introduced by Intel as part of the\n// ADX processor extensions, even though the addc instruction has been available\n// for basically all x86 processors.  That means gcc-9, clang-9, msvc-14.2 and up\n// are required to support these intrinsics.\n//\ntemplate <class CppInt1, class CppInt2, class CppInt3>\ninline BOOST_MP_CXX14_CONSTEXPR void add_unsigned(CppInt1& result, const CppInt2& a, const CppInt3& b) noexcept(is_non_throwing_cpp_int<CppInt1>::value)\n{\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n   if (BOOST_MP_IS_CONST_EVALUATED(a.size()))\n   {\n      add_unsigned_constexpr(result, a, b);\n   }\n   else\n#endif\n   {\n      using std::swap;\n\n      // Nothing fancy, just let uintmax_t take the strain:\n      std::size_t m(0), x(0);\n      std::size_t as = a.size();\n      std::size_t bs = b.size();\n      minmax(as, bs, m, x);\n      if (x == 1)\n      {\n         bool s = a.sign();\n         result = static_cast<double_limb_type>(*a.limbs()) + static_cast<double_limb_type>(*b.limbs());\n         result.sign(s);\n         return;\n      }\n      result.resize(x, x);\n      typename CppInt2::const_limb_pointer pa = a.limbs();\n      typename CppInt3::const_limb_pointer pb = b.limbs();\n      typename CppInt1::limb_pointer       pr = result.limbs();\n\n      if (as < bs)\n         swap(pa, pb);\n      // First where a and b overlap:\n      std::size_t      i = 0;\n      unsigned char carry = 0;\n#if defined(BOOST_MSVC) && !defined(BOOST_HAS_INT128) && defined(_M_X64)\n      //\n      // Special case for 32-bit limbs on 64-bit architecture - we can process\n      // 2 limbs with each instruction.\n      //\n      for (; i + 8 <= m; i += 8)\n      {\n         carry = _addcarry_u64(carry, *(unsigned long long*)(pa + i + 0), *(unsigned long long*)(pb + i + 0), (unsigned long long*)(pr + i));\n         carry = _addcarry_u64(carry, *(unsigned long long*)(pa + i + 2), *(unsigned long long*)(pb + i + 2), (unsigned long long*)(pr + i + 2));\n         carry = _addcarry_u64(carry, *(unsigned long long*)(pa + i + 4), *(unsigned long long*)(pb + i + 4), (unsigned long long*)(pr + i + 4));\n         carry = _addcarry_u64(carry, *(unsigned long long*)(pa + i + 6), *(unsigned long long*)(pb + i + 6), (unsigned long long*)(pr + i + 6));\n      }\n#else\n      for (; i + 4 <= m; i += 4)\n      {\n         carry = ::boost::multiprecision::detail::addcarry_limb(carry, pa[i + 0], pb[i + 0], pr + i);\n         carry = ::boost::multiprecision::detail::addcarry_limb(carry, pa[i + 1], pb[i + 1], pr + i + 1);\n         carry = ::boost::multiprecision::detail::addcarry_limb(carry, pa[i + 2], pb[i + 2], pr + i + 2);\n         carry = ::boost::multiprecision::detail::addcarry_limb(carry, pa[i + 3], pb[i + 3], pr + i + 3);\n      }\n#endif\n      for (; i < m; ++i)\n         carry = ::boost::multiprecision::detail::addcarry_limb(carry, pa[i], pb[i], pr + i);\n      for (; i < x && carry; ++i)\n         // We know carry is 1, so we just need to increment pa[i] (ie add a literal 1) and capture the carry:\n         carry = ::boost::multiprecision::detail::addcarry_limb(0, pa[i], 1, pr + i);\n      if (i == x && carry)\n      {\n         // We overflowed, need to add one more limb:\n         result.resize(x + 1, x + 1);\n         if (result.size() > x)\n            result.limbs()[x] = static_cast<limb_type>(1u);\n      }\n      else if ((x != i) && (pa != pr))\n         // Copy remaining digits only if we need to:\n         std_constexpr::copy(pa + i, pa + x, pr + i);\n      result.normalize();\n      result.sign(a.sign());\n   }\n}\n\ntemplate <class CppInt1, class CppInt2, class CppInt3>\ninline BOOST_MP_CXX14_CONSTEXPR void subtract_unsigned(CppInt1& result, const CppInt2& a, const CppInt3& b) noexcept(is_non_throwing_cpp_int<CppInt1>::value)\n{\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n   if (BOOST_MP_IS_CONST_EVALUATED(a.size()))\n   {\n      subtract_unsigned_constexpr(result, a, b);\n   }\n   else\n#endif\n   {\n      using std::swap;\n\n      // Nothing fancy, just let uintmax_t take the strain:\n      std::size_t         m(0), x(0);\n      minmax(a.size(), b.size(), m, x);\n      //\n      // special cases for small limb counts:\n      //\n      if (x == 1)\n      {\n         bool      s = a.sign();\n         limb_type al = *a.limbs();\n         limb_type bl = *b.limbs();\n         if (bl > al)\n         {\n            ::boost::multiprecision::std_constexpr::swap(al, bl);\n            s = !s;\n         }\n         result = al - bl;\n         result.sign(s);\n         return;\n      }\n      // This isn't used till later, but comparison has to occur before we resize the result,\n      // as that may also resize a or b if this is an inplace operation:\n      int c = a.compare_unsigned(b);\n      // Set up the result vector:\n      result.resize(x, x);\n      // Now that a, b, and result are stable, get pointers to their limbs:\n      typename CppInt2::const_limb_pointer pa = a.limbs();\n      typename CppInt3::const_limb_pointer pb = b.limbs();\n      typename CppInt1::limb_pointer       pr = result.limbs();\n      bool                                 swapped = false;\n      if (c < 0)\n      {\n         swap(pa, pb);\n         swapped = true;\n      }\n      else if (c == 0)\n      {\n         result = static_cast<limb_type>(0);\n         return;\n      }\n\n      std::size_t i = 0;\n      unsigned char borrow = 0;\n      // First where a and b overlap:\n#if defined(BOOST_MSVC) && !defined(BOOST_HAS_INT128) && defined(_M_X64)\n      //\n      // Special case for 32-bit limbs on 64-bit architecture - we can process\n      // 2 limbs with each instruction.\n      //\n      for (; i + 8 <= m; i += 8)\n      {\n         borrow = _subborrow_u64(borrow, *reinterpret_cast<const unsigned long long*>(pa + i), *reinterpret_cast<const unsigned long long*>(pb + i), reinterpret_cast<unsigned long long*>(pr + i));\n         borrow = _subborrow_u64(borrow, *reinterpret_cast<const unsigned long long*>(pa + i + 2), *reinterpret_cast<const unsigned long long*>(pb + i + 2), reinterpret_cast<unsigned long long*>(pr + i + 2));\n         borrow = _subborrow_u64(borrow, *reinterpret_cast<const unsigned long long*>(pa + i + 4), *reinterpret_cast<const unsigned long long*>(pb + i + 4), reinterpret_cast<unsigned long long*>(pr + i + 4));\n         borrow = _subborrow_u64(borrow, *reinterpret_cast<const unsigned long long*>(pa + i + 6), *reinterpret_cast<const unsigned long long*>(pb + i + 6), reinterpret_cast<unsigned long long*>(pr + i + 6));\n      }\n#else\n      for(; i + 4 <= m; i += 4)\n      {\n         borrow = boost::multiprecision::detail::subborrow_limb(borrow, pa[i], pb[i], pr + i);\n         borrow = boost::multiprecision::detail::subborrow_limb(borrow, pa[i + 1], pb[i + 1], pr + i + 1);\n         borrow = boost::multiprecision::detail::subborrow_limb(borrow, pa[i + 2], pb[i + 2], pr + i + 2);\n         borrow = boost::multiprecision::detail::subborrow_limb(borrow, pa[i + 3], pb[i + 3], pr + i + 3);\n      }\n#endif\n      for (; i < m; ++i)\n         borrow = boost::multiprecision::detail::subborrow_limb(borrow, pa[i], pb[i], pr + i);\n\n      // Now where only a has digits, only as long as we've borrowed:\n      while (borrow && (i < x))\n      {\n         borrow = boost::multiprecision::detail::subborrow_limb(borrow, pa[i], 0, pr + i);\n         ++i;\n      }\n      // Any remaining digits are the same as those in pa:\n      if ((x != i) && (pa != pr))\n         std_constexpr::copy(pa + i, pa + x, pr + i);\n      BOOST_MP_ASSERT(0 == borrow);\n\n      //\n      // We may have lost digits, if so update limb usage count:\n      //\n      result.normalize();\n      result.sign(a.sign());\n      if (swapped)\n         result.negate();\n   }  // constepxr.\n}\n\n#else\n\ntemplate <class CppInt1, class CppInt2, class CppInt3>\ninline BOOST_MP_CXX14_CONSTEXPR void add_unsigned(CppInt1& result, const CppInt2& a, const CppInt3& b) noexcept(is_non_throwing_cpp_int<CppInt1>::value)\n{\n   add_unsigned_constexpr(result, a, b);\n}\n\ntemplate <class CppInt1, class CppInt2, class CppInt3>\ninline BOOST_MP_CXX14_CONSTEXPR void subtract_unsigned(CppInt1& result, const CppInt2& a, const CppInt3& b) noexcept(is_non_throwing_cpp_int<CppInt1>::value)\n{\n   subtract_unsigned_constexpr(result, a, b);\n}\n\n#endif\n\n} } }  // namespaces\n\n\n#endif\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_int/bitwise.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// Comparison operators for cpp_int_backend:\n//\n#ifndef BOOST_MP_CPP_INT_BITWISE_HPP\n#define BOOST_MP_CPP_INT_BITWISE_HPP\n\n#include <stdexcept>\n#include <type_traits>\n#include <boost/multiprecision/detail/endian.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4319)\n#endif\n\n\nnamespace boost { namespace multiprecision { namespace backends {\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_CXX14_CONSTEXPR void is_valid_bitwise_op(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o, const std::integral_constant<int, checked>&)\n{\n   if (result.sign() || o.sign())\n      BOOST_MP_THROW_EXCEPTION(std::range_error(\"Bitwise operations on negative values results in undefined behavior.\"));\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_CXX14_CONSTEXPR void is_valid_bitwise_op(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>&, const std::integral_constant<int, unchecked>&) {}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_CXX14_CONSTEXPR void is_valid_bitwise_op(\n    const cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1>& result, const std::integral_constant<int, checked>&)\n{\n   if (result.sign())\n      BOOST_MP_THROW_EXCEPTION(std::range_error(\"Bitwise operations on negative values results in undefined behavior.\"));\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_CXX14_CONSTEXPR void is_valid_bitwise_op(\n    const cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1>&, const std::integral_constant<int, checked>&) {}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_CXX14_CONSTEXPR void is_valid_bitwise_op(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&, const std::integral_constant<int, unchecked>&) {}\n\ntemplate <class CppInt1, class CppInt2, class Op>\nBOOST_MP_CXX14_CONSTEXPR void bitwise_op(\n    CppInt1&       result,\n    const CppInt2& o,\n    Op             op, const std::integral_constant<bool, true>&) noexcept((is_non_throwing_cpp_int<CppInt1>::value))\n{\n   //\n   // There are 4 cases:\n   // * Both positive.\n   // * result negative, o positive.\n   // * o negative, result positive.\n   // * Both negative.\n   //\n   // When one arg is negative we convert to 2's complement form \"on the fly\",\n   // and then convert back to signed-magnitude form at the end.\n   //\n   // Note however, that if the type is checked, then bitwise ops on negative values\n   // are not permitted and an exception will result.\n   //\n   is_valid_bitwise_op(result, o, typename CppInt1::checked_type());\n   //\n   // First figure out how big the result needs to be and set up some data:\n   //\n   std::size_t rs = result.size();\n   std::size_t os = o.size();\n   std::size_t m(0), x(0);\n   minmax(rs, os, m, x);\n   result.resize(x, x);\n   typename CppInt1::limb_pointer       pr = result.limbs();\n   typename CppInt2::const_limb_pointer po = o.limbs();\n   for (std::size_t i = rs; i < x; ++i)\n      pr[i] = 0;\n\n   limb_type next_limb = 0;\n\n   if (!result.sign())\n   {\n      if (!o.sign())\n      {\n         for (std::size_t i = 0; i < os; ++i)\n            pr[i] = op(pr[i], po[i]);\n         for (std::size_t i = os; i < x; ++i)\n            pr[i] = op(pr[i], limb_type(0));\n      }\n      else\n      {\n         // \"o\" is negative:\n         double_limb_type carry = 1;\n         for (std::size_t i = 0; i < os; ++i)\n         {\n            carry += static_cast<double_limb_type>(~po[i]);\n            pr[i] = op(pr[i], static_cast<limb_type>(carry));\n            carry >>= CppInt1::limb_bits;\n         }\n         for (std::size_t i = os; i < x; ++i)\n         {\n            carry += static_cast<double_limb_type>(~limb_type(0));\n            pr[i] = op(pr[i], static_cast<limb_type>(carry));\n            carry >>= CppInt1::limb_bits;\n         }\n         // Set the overflow into the \"extra\" limb:\n         carry += static_cast<double_limb_type>(~limb_type(0));\n         next_limb = op(limb_type(0), static_cast<limb_type>(carry));\n      }\n   }\n   else\n   {\n      if (!o.sign())\n      {\n         // \"result\" is negative:\n         double_limb_type carry = 1;\n         for (std::size_t i = 0; i < os; ++i)\n         {\n            carry += static_cast<double_limb_type>(~pr[i]);\n            pr[i] = op(static_cast<limb_type>(carry), po[i]);\n            carry >>= CppInt1::limb_bits;\n         }\n         for (std::size_t i = os; i < x; ++i)\n         {\n            carry += static_cast<double_limb_type>(~pr[i]);\n            pr[i] = op(static_cast<limb_type>(carry), limb_type(0));\n            carry >>= CppInt1::limb_bits;\n         }\n         // Set the overflow into the \"extra\" limb:\n         carry += static_cast<double_limb_type>(~limb_type(0));\n         next_limb = op(static_cast<limb_type>(carry), limb_type(0));\n      }\n      else\n      {\n         // both are negative:\n         double_limb_type r_carry = 1;\n         double_limb_type o_carry = 1;\n         for (std::size_t i = 0; i < os; ++i)\n         {\n            r_carry += static_cast<double_limb_type>(~pr[i]);\n            o_carry += static_cast<double_limb_type>(~po[i]);\n            pr[i] = op(static_cast<limb_type>(r_carry), static_cast<limb_type>(o_carry));\n            r_carry >>= CppInt1::limb_bits;\n            o_carry >>= CppInt1::limb_bits;\n         }\n         for (std::size_t i = os; i < x; ++i)\n         {\n            r_carry += static_cast<double_limb_type>(~pr[i]);\n            o_carry += static_cast<double_limb_type>(~limb_type(0));\n            pr[i] = op(static_cast<limb_type>(r_carry), static_cast<limb_type>(o_carry));\n            r_carry >>= CppInt1::limb_bits;\n            o_carry >>= CppInt1::limb_bits;\n         }\n         // Set the overflow into the \"extra\" limb:\n         r_carry += static_cast<double_limb_type>(~limb_type(0));\n         o_carry += static_cast<double_limb_type>(~limb_type(0));\n         next_limb = op(static_cast<limb_type>(r_carry), static_cast<limb_type>(o_carry));\n      }\n   }\n   //\n   // See if the result is negative or not:\n   //\n   if (static_cast<signed_limb_type>(next_limb) < 0)\n   {\n      double_limb_type carry = 1;\n      for (std::size_t i = 0; i < x; ++i)\n      {\n         carry += static_cast<double_limb_type>(~pr[i]);\n         pr[i] = static_cast<limb_type>(carry);\n         carry >>= CppInt1::limb_bits;\n      }\n      if (carry)\n      {\n         result.resize(x + 1, x);\n         if (result.size() > x)\n            result.limbs()[x] = static_cast<limb_type>(carry);\n      }\n      result.sign(true);\n   }\n   else\n      result.sign(false);\n\n   result.normalize();\n}\n\ntemplate <class CppInt1, class CppInt2, class Op>\nBOOST_MP_CXX14_CONSTEXPR void bitwise_op(\n    CppInt1&       result,\n    const CppInt2& o,\n    Op             op, const std::integral_constant<bool, false>&) noexcept((is_non_throwing_cpp_int<CppInt1>::value))\n{\n   //\n   // Both arguments are unsigned types, very simple case handled as a special case.\n   //\n   // First figure out how big the result needs to be and set up some data:\n   //\n   std::size_t rs = result.size();\n   std::size_t os = o.size();\n   std::size_t m(0), x(0);\n   minmax(rs, os, m, x);\n   result.resize(x, x);\n   typename CppInt1::limb_pointer       pr = result.limbs();\n   typename CppInt2::const_limb_pointer po = o.limbs();\n   for (std::size_t i = rs; i < x; ++i)\n      pr[i] = 0;\n\n   for (std::size_t i = 0; i < os; ++i)\n      pr[i] = op(pr[i], po[i]);\n   for (std::size_t i = os; i < x; ++i)\n      pr[i] = op(pr[i], limb_type(0));\n\n   result.normalize();\n}\n\nstruct bit_and\n{\n   BOOST_MP_CXX14_CONSTEXPR limb_type operator()(limb_type a, limb_type b) const noexcept { return a & b; }\n};\nstruct bit_or\n{\n   BOOST_MP_CXX14_CONSTEXPR limb_type operator()(limb_type a, limb_type b) const noexcept { return a | b; }\n};\nstruct bit_xor\n{\n   BOOST_MP_CXX14_CONSTEXPR limb_type operator()(limb_type a, limb_type b) const noexcept { return a ^ b; }\n};\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_bitwise_and(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   bitwise_op(result, o, bit_and(),\n              std::integral_constant<bool, std::numeric_limits<number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> > >::is_signed || std::numeric_limits<number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> > >::is_signed > ());\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_bitwise_or(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   bitwise_op(result, o, bit_or(),\n              std::integral_constant<bool, std::numeric_limits<number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> > >::is_signed || std::numeric_limits<number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> > >::is_signed > ());\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_bitwise_xor(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   bitwise_op(result, o, bit_xor(),\n              std::integral_constant<bool, std::numeric_limits<number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> > >::is_signed || std::numeric_limits<number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> > >::is_signed > ());\n}\n//\n// Again for operands which are single limbs:\n//\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1> >::value>::type\neval_bitwise_and(\n    cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1>& result,\n    limb_type                                                                      l) noexcept\n{\n   result.limbs()[0] &= l;\n   result.resize(1, 1);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1> >::value>::type\neval_bitwise_or(\n    cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1>& result,\n    limb_type                                                                      l) noexcept\n{\n   result.limbs()[0] |= l;\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1> >::value>::type\neval_bitwise_xor(\n    cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1>& result,\n    limb_type                                                                      l) noexcept\n{\n   result.limbs()[0] ^= l;\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_complement(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   static_assert(((Checked1 != checked) || (Checked2 != checked)), \"Attempt to take the complement of a signed type results in undefined behavior.\");\n   // Increment and negate:\n   result = o;\n   eval_increment(result);\n   result.negate();\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_complement(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   std::size_t os = o.size();\n   result.resize(SIZE_MAX, os);\n   for (std::size_t i = 0; i < os; ++i)\n      result.limbs()[i] = ~o.limbs()[i];\n   for (std::size_t i = os; i < result.size(); ++i)\n      result.limbs()[i] = ~static_cast<limb_type>(0);\n   result.normalize();\n}\n\ntemplate <class Int>\ninline void left_shift_byte(Int& result, double_limb_type s)\n{\n   limb_type offset = static_cast<limb_type>(s / Int::limb_bits);\n   limb_type shift  = static_cast<limb_type>(s % Int::limb_bits);\n   std::size_t  ors    = result.size();\n   if ((ors == 1) && (!*result.limbs()))\n      return; // shifting zero yields zero.\n   std::size_t rs = ors;\n   if (shift && (result.limbs()[ors - 1] >> (Int::limb_bits - shift)))\n      ++rs; // Most significant limb will overflow when shifted\n   rs += offset;\n   result.resize(rs, rs);\n   rs = result.size();\n\n   typename Int::limb_pointer pr = result.limbs();\n\n   if (rs != ors)\n      pr[rs - 1] = 0u;\n   std::size_t bytes = static_cast<std::size_t>(s / CHAR_BIT);\n   std::size_t len   = (std::min)(ors * sizeof(limb_type), rs * sizeof(limb_type) - bytes);\n   if (bytes >= rs * sizeof(limb_type))\n      result = static_cast<limb_type>(0u);\n   else\n   {\n      unsigned char* pc = reinterpret_cast<unsigned char*>(pr);\n      std::memmove(pc + bytes, pc, len);\n      std::memset(pc, 0, bytes);\n   }\n}\n\ntemplate <class Int>\ninline BOOST_MP_CXX14_CONSTEXPR void left_shift_limb(Int& result, double_limb_type s)\n{\n   limb_type offset = static_cast<limb_type>(s / Int::limb_bits);\n   limb_type shift  = static_cast<limb_type>(s % Int::limb_bits);\n\n   std::size_t ors = result.size();\n   if ((ors == 1) && (!*result.limbs()))\n      return; // shifting zero yields zero.\n   std::size_t rs = ors;\n   if (shift && (result.limbs()[ors - 1] >> (Int::limb_bits - shift)))\n      ++rs; // Most significant limb will overflow when shifted\n   rs += offset;\n   result.resize(rs, rs);\n\n   typename Int::limb_pointer pr = result.limbs();\n\n   if (offset > rs)\n   {\n      // The result is shifted past the end of the result:\n      result = static_cast<limb_type>(0);\n      return;\n   }\n\n   std::size_t i = rs - result.size();\n   for (; i < ors; ++i)\n      pr[rs - 1 - i] = pr[ors - 1 - i];\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n   if (BOOST_MP_IS_CONST_EVALUATED(s))\n   {\n      for (; i < rs; ++i)\n         pr[rs - 1 - i] = 0;\n   }\n   else\n#endif\n   {\n      std::memset(pr, 0, (rs - i) * sizeof(*pr));\n   }\n}\n\ntemplate <class Int>\ninline BOOST_MP_CXX14_CONSTEXPR void left_shift_generic(Int& result, double_limb_type s)\n{\n   limb_type offset = static_cast<limb_type>(s / Int::limb_bits);\n   limb_type shift  = static_cast<limb_type>(s % Int::limb_bits);\n\n   std::size_t ors = result.size();\n   if ((ors == 1) && (!*result.limbs()))\n      return; // shifting zero yields zero.\n   std::size_t rs = ors;\n   if (shift && (result.limbs()[ors - 1] >> (Int::limb_bits - shift)))\n      ++rs; // Most significant limb will overflow when shifted\n   rs += offset;\n   result.resize(rs, rs);\n   bool truncated = result.size() != rs;\n\n   typename Int::limb_pointer pr = result.limbs();\n\n   if (offset > rs)\n   {\n      // The result is shifted past the end of the result:\n      result = static_cast<limb_type>(0);\n      return;\n   }\n\n   std::size_t i = rs - result.size();\n   // This code only works when shift is non-zero, otherwise we invoke undefined behaviour!\n   BOOST_MP_ASSERT(shift);\n   if (!truncated)\n   {\n      if (rs > ors + offset)\n      {\n         pr[rs - 1 - i] = pr[ors - 1 - i] >> (Int::limb_bits - shift);\n         --rs;\n      }\n      else\n      {\n         pr[rs - 1 - i] = pr[ors - 1 - i] << shift;\n         if (ors > 1)\n            pr[rs - 1 - i] |= pr[ors - 2 - i] >> (Int::limb_bits - shift);\n         ++i;\n      }\n   }\n   for (; rs - i >= 2 + offset; ++i)\n   {\n      pr[rs - 1 - i] = pr[rs - 1 - i - offset] << shift;\n      pr[rs - 1 - i] |= pr[rs - 2 - i - offset] >> (Int::limb_bits - shift);\n   }\n   if (rs - i >= 1 + offset)\n   {\n      pr[rs - 1 - i] = pr[rs - 1 - i - offset] << shift;\n      ++i;\n   }\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n   if (BOOST_MP_IS_CONST_EVALUATED(s))\n   {\n      for (; i < rs; ++i)\n         pr[rs - 1 - i] = 0;\n   }\n   else\n#endif\n   {\n      std::memset(pr, 0, (rs - i) * sizeof(*pr));\n   }\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_left_shift(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,\n    double_limb_type                                                      s) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   is_valid_bitwise_op(result, typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n   if (!s)\n      return;\n\n#if BOOST_MP_ENDIAN_LITTLE_BYTE && defined(BOOST_MP_USE_LIMB_SHIFT)\n   constexpr limb_type limb_shift_mask = cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits - 1;\n   constexpr limb_type byte_shift_mask = CHAR_BIT - 1;\n\n   if ((s & limb_shift_mask) == 0)\n   {\n      left_shift_limb(result, s);\n   }\n#ifdef BOOST_MP_NO_CONSTEXPR_DETECTION\n   else if ((s & byte_shift_mask) == 0)\n#else\n   else if (((s & byte_shift_mask) == 0) && !BOOST_MP_IS_CONST_EVALUATED(s))\n#endif\n   {\n      left_shift_byte(result, s);\n   }\n#elif BOOST_MP_ENDIAN_LITTLE_BYTE\n   constexpr limb_type byte_shift_mask = CHAR_BIT - 1;\n\n#ifdef BOOST_MP_NO_CONSTEXPR_DETECTION\n   if ((s & byte_shift_mask) == 0)\n#else\n   constexpr limb_type limb_shift_mask = cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits - 1;\n   if (BOOST_MP_IS_CONST_EVALUATED(s) && ((s & limb_shift_mask) == 0))\n      left_shift_limb(result, s);\n   else if (((s & byte_shift_mask) == 0) && !BOOST_MP_IS_CONST_EVALUATED(s))\n#endif\n   {\n      left_shift_byte(result, s);\n   }\n#else\n   constexpr limb_type limb_shift_mask = cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits - 1;\n\n   if ((s & limb_shift_mask) == 0)\n   {\n      left_shift_limb(result, s);\n   }\n#endif\n   else\n   {\n      left_shift_generic(result, s);\n   }\n   //\n   // We may have shifted off the end and have leading zeros:\n   //\n   result.normalize();\n}\n\ntemplate <class Int>\ninline void right_shift_byte(Int& result, double_limb_type s)\n{\n   limb_type offset = static_cast<limb_type>(s / Int::limb_bits);\n   BOOST_MP_ASSERT((s % CHAR_BIT) == 0);\n   std::size_t ors = result.size();\n   std::size_t rs  = ors;\n   if (offset >= rs)\n   {\n      result = limb_type(0);\n      return;\n   }\n   rs -= offset;\n   typename Int::limb_pointer pr = result.limbs();\n   unsigned char*             pc = reinterpret_cast<unsigned char*>(pr);\n   limb_type                  shift = static_cast<limb_type>(s / CHAR_BIT);\n   std::memmove(pc, pc + shift, ors * sizeof(pr[0]) - shift);\n   shift = (sizeof(limb_type) - shift % sizeof(limb_type)) * CHAR_BIT;\n   if (shift < Int::limb_bits)\n   {\n      pr[ors - offset - 1] &= (static_cast<limb_type>(1u) << shift) - 1;\n      if (!pr[ors - offset - 1] && (rs > 1))\n         --rs;\n   }\n   result.resize(rs, rs);\n}\n\ntemplate <class Int>\ninline BOOST_MP_CXX14_CONSTEXPR void right_shift_limb(Int& result, double_limb_type s)\n{\n   limb_type offset = static_cast<limb_type>(s / Int::limb_bits);\n   BOOST_MP_ASSERT((s % Int::limb_bits) == 0);\n   std::size_t ors = result.size();\n   std::size_t rs  = ors;\n   if (offset >= rs)\n   {\n      result = limb_type(0);\n      return;\n   }\n   rs -= offset;\n   typename Int::limb_pointer pr = result.limbs();\n   std::size_t                   i  = 0;\n   for (; i < rs; ++i)\n      pr[i] = pr[i + offset];\n   result.resize(rs, rs);\n}\n\ntemplate <class Int>\ninline BOOST_MP_CXX14_CONSTEXPR void right_shift_generic(Int& result, double_limb_type s)\n{\n   limb_type offset = static_cast<limb_type>(s / Int::limb_bits);\n   limb_type shift  = static_cast<limb_type>(s % Int::limb_bits);\n   std::size_t  ors    = result.size();\n   std::size_t  rs     = ors;\n   if (offset >= rs)\n   {\n      result = limb_type(0);\n      return;\n   }\n   rs -= offset;\n   typename Int::limb_pointer pr = result.limbs();\n   if ((pr[ors - 1] >> shift) == 0)\n   {\n      if (--rs == 0)\n      {\n         result = limb_type(0);\n         return;\n      }\n   }\n   std::size_t i = 0;\n\n   // This code only works for non-zero shift, otherwise we invoke undefined behaviour!\n   BOOST_MP_ASSERT(shift);\n   for (; i + offset + 1 < ors; ++i)\n   {\n      pr[i] = pr[i + offset] >> shift;\n      pr[i] |= pr[i + offset + 1] << (Int::limb_bits - shift);\n   }\n   pr[i] = pr[i + offset] >> shift;\n   result.resize(rs, rs);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1> >::value>::type\neval_right_shift(\n    cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1>& result,\n    double_limb_type                                                               s) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1> >::value))\n{\n   is_valid_bitwise_op(result, typename cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1>::checked_type());\n   if (!s)\n      return;\n\n#if BOOST_MP_ENDIAN_LITTLE_BYTE && defined(BOOST_MP_USE_LIMB_SHIFT)\n   constexpr limb_type limb_shift_mask = cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1>::limb_bits - 1;\n   constexpr limb_type byte_shift_mask = CHAR_BIT - 1;\n\n   if ((s & limb_shift_mask) == 0)\n      right_shift_limb(result, s);\n#ifdef BOOST_MP_NO_CONSTEXPR_DETECTION\n   else if ((s & byte_shift_mask) == 0)\n#else\n   else if (((s & byte_shift_mask) == 0) && !BOOST_MP_IS_CONST_EVALUATED(s))\n#endif\n      right_shift_byte(result, s);\n#elif BOOST_MP_ENDIAN_LITTLE_BYTE\n   constexpr limb_type byte_shift_mask = CHAR_BIT - 1;\n\n#ifdef BOOST_MP_NO_CONSTEXPR_DETECTION\n   if ((s & byte_shift_mask) == 0)\n#else\n   constexpr limb_type limb_shift_mask = cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1>::limb_bits - 1;\n   if (BOOST_MP_IS_CONST_EVALUATED(s) && ((s & limb_shift_mask) == 0))\n      right_shift_limb(result, s);\n   else if (((s & byte_shift_mask) == 0) && !BOOST_MP_IS_CONST_EVALUATED(s))\n#endif\n      right_shift_byte(result, s);\n#else\n   constexpr limb_type limb_shift_mask = cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1>::limb_bits - 1;\n\n   if ((s & limb_shift_mask) == 0)\n      right_shift_limb(result, s);\n#endif\n   else\n      right_shift_generic(result, s);\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1> >::value>::type\neval_right_shift(\n    cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1>& result,\n    double_limb_type                                                             s) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1> >::value))\n{\n   is_valid_bitwise_op(result, typename cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1>::checked_type());\n   if (!s)\n      return;\n\n   bool is_neg = result.sign();\n   if (is_neg)\n      eval_increment(result);\n\n#if BOOST_MP_ENDIAN_LITTLE_BYTE && defined(BOOST_MP_USE_LIMB_SHIFT)\n   constexpr limb_type limb_shift_mask = cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1>::limb_bits - 1;\n   constexpr limb_type byte_shift_mask = CHAR_BIT - 1;\n\n   if ((s & limb_shift_mask) == 0)\n      right_shift_limb(result, s);\n#ifdef BOOST_MP_NO_CONSTEXPR_DETECTION\n   else if ((s & byte_shift_mask) == 0)\n#else\n   else if (((s & byte_shift_mask) == 0) && !BOOST_MP_IS_CONST_EVALUATED(s))\n#endif\n      right_shift_byte(result, s);\n#elif BOOST_MP_ENDIAN_LITTLE_BYTE\n   constexpr limb_type byte_shift_mask = CHAR_BIT - 1;\n\n#ifdef BOOST_MP_NO_CONSTEXPR_DETECTION\n   if ((s & byte_shift_mask) == 0)\n#else\n   constexpr limb_type limb_shift_mask = cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1>::limb_bits - 1;\n   if (BOOST_MP_IS_CONST_EVALUATED(s) && ((s & limb_shift_mask) == 0))\n      right_shift_limb(result, s);\n   else if (((s & byte_shift_mask) == 0) && !BOOST_MP_IS_CONST_EVALUATED(s))\n#endif\n      right_shift_byte(result, s);\n#else\n   constexpr limb_type limb_shift_mask = cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1>::limb_bits - 1;\n\n   if ((s & limb_shift_mask) == 0)\n      right_shift_limb(result, s);\n#endif\n   else\n      right_shift_generic(result, s);\n   if (is_neg)\n      eval_decrement(result);\n}\n\n//\n// Over again for trivial cpp_int's:\n//\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class T>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value >::type\neval_left_shift(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, T s) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   is_valid_bitwise_op(result, typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n   *result.limbs() = detail::checked_left_shift(*result.limbs(), s, typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n   result.normalize();\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class T>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value >::type\neval_right_shift(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, T s) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   // Nothing to check here... just make sure we don't invoke undefined behavior:\n   is_valid_bitwise_op(result, typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n   *result.limbs() = (static_cast<unsigned>(s) >= sizeof(*result.limbs()) * CHAR_BIT) ? 0 : (result.sign() ? ((--*result.limbs()) >> s) + 1 : *result.limbs() >> s);\n   if (result.sign() && (*result.limbs() == 0))\n      result = static_cast<signed_limb_type>(-1);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value)>::type\neval_complement(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   static_assert(((Checked1 != checked) || (Checked2 != checked)), \"Attempt to take the complement of a signed type results in undefined behavior.\");\n   //\n   // If we're not checked then emulate 2's complement behavior:\n   //\n   if (o.sign())\n   {\n      *result.limbs() = *o.limbs() - 1;\n      result.sign(false);\n   }\n   else\n   {\n      *result.limbs() = 1 + *o.limbs();\n      result.sign(true);\n   }\n   result.normalize();\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_complement(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   *result.limbs() = ~*o.limbs();\n   result.normalize();\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_bitwise_and(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   *result.limbs() &= *o.limbs();\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value)>::type\neval_bitwise_and(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   is_valid_bitwise_op(result, o, typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n\n   using default_ops::eval_bit_test;\n   using default_ops::eval_increment;\n\n   if (result.sign() || o.sign())\n   {\n      constexpr std::size_t m = detail::static_unsigned_max<detail::static_unsigned_max<MinBits1, MinBits2>::value, detail::static_unsigned_max<MaxBits1, MaxBits2>::value>::value;\n      cpp_int_backend<m + 1, m + 1, unsigned_magnitude, unchecked, void> t1(result);\n      cpp_int_backend<m + 1, m + 1, unsigned_magnitude, unchecked, void> t2(o);\n      eval_bitwise_and(t1, t2);\n      bool s = eval_bit_test(t1, m + 1);\n      if (s)\n      {\n         eval_complement(t1, t1);\n         eval_increment(t1);\n      }\n      result = t1;\n      result.sign(s);\n   }\n   else\n   {\n      *result.limbs() &= *o.limbs();\n   }\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_bitwise_or(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   *result.limbs() |= *o.limbs();\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value)>::type\neval_bitwise_or(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   is_valid_bitwise_op(result, o, typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n\n   using default_ops::eval_bit_test;\n   using default_ops::eval_increment;\n\n   if (result.sign() || o.sign())\n   {\n      constexpr std::size_t m = detail::static_unsigned_max<detail::static_unsigned_max<MinBits1, MinBits2>::value, detail::static_unsigned_max<MaxBits1, MaxBits2>::value>::value;\n      cpp_int_backend<m + 1, m + 1, unsigned_magnitude, unchecked, void> t1(result);\n      cpp_int_backend<m + 1, m + 1, unsigned_magnitude, unchecked, void> t2(o);\n      eval_bitwise_or(t1, t2);\n      bool s = eval_bit_test(t1, m + 1);\n      if (s)\n      {\n         eval_complement(t1, t1);\n         eval_increment(t1);\n      }\n      result = t1;\n      result.sign(s);\n   }\n   else\n   {\n      *result.limbs() |= *o.limbs();\n      result.normalize();\n   }\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_bitwise_xor(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   *result.limbs() ^= *o.limbs();\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value)>::type\neval_bitwise_xor(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   is_valid_bitwise_op(result, o, typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n\n   using default_ops::eval_bit_test;\n   using default_ops::eval_increment;\n\n   if (result.sign() || o.sign())\n   {\n      constexpr std::size_t m = detail::static_unsigned_max<detail::static_unsigned_max<MinBits1, MinBits2>::value, detail::static_unsigned_max<MaxBits1, MaxBits2>::value>::value;\n      cpp_int_backend<m + 1, m + 1, unsigned_magnitude, unchecked, void> t1(result);\n      cpp_int_backend<m + 1, m + 1, unsigned_magnitude, unchecked, void> t2(o);\n      eval_bitwise_xor(t1, t2);\n      bool s = eval_bit_test(t1, m + 1);\n      if (s)\n      {\n         eval_complement(t1, t1);\n         eval_increment(t1);\n      }\n      result = t1;\n      result.sign(s);\n   }\n   else\n   {\n      *result.limbs() ^= *o.limbs();\n   }\n}\n\n}}} // namespace boost::multiprecision::backends\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_int/checked.hpp",
    "content": "\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_CPP_INT_CHECKED_HPP\n#define BOOST_MP_CPP_INT_CHECKED_HPP\n\n#include <climits>\n#include <limits>\n#include <type_traits>\n#include <stdexcept>\n#include <string>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n\nnamespace boost { namespace multiprecision { namespace backends { namespace detail {\n\n//\n// Simple routines for performing checked arithmetic with a builtin arithmetic type.\n// Note that this is not a complete header, it must be included as part of boost/multiprecision/cpp_int.hpp.\n//\n\ntemplate <typename T>\ninline constexpr T type_max() noexcept\n{\n   return \n   #ifdef BOOST_HAS_INT128\n   std::is_same<T, boost::multiprecision::int128_type>::value ? INT128_MAX :\n   std::is_same<T, boost::multiprecision::uint128_type>::value ? UINT128_MAX :\n   #endif\n   (std::numeric_limits<T>::max)();\n}\n\ntemplate <typename T>\ninline constexpr T type_min() noexcept\n{\n   return \n   #ifdef BOOST_HAS_INT128\n   std::is_same<T, boost::multiprecision::int128_type>::value ? INT128_MIN :\n   std::is_same<T, boost::multiprecision::uint128_type>::value ? T(0) :\n   #endif\n   (std::numeric_limits<T>::min)();\n}\n\ninline void raise_overflow(std::string op)\n{\n   BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"overflow in \" + op));\n}\ninline void raise_add_overflow()\n{\n   raise_overflow(\"addition\");\n}\ninline void raise_subtract_overflow()\n{\n   BOOST_MP_THROW_EXCEPTION(std::range_error(\"Subtraction resulted in a negative value, but the type is unsigned\"));\n}\ninline void raise_mul_overflow()\n{\n   raise_overflow(\"multiplication\");\n}\ninline void raise_div_overflow()\n{\n   raise_overflow(\"division\");\n}\n\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR A checked_add_imp(A a, A b, const std::integral_constant<bool, true>&)\n{\n   if (a > 0)\n   {\n      if ((b > 0) && ((type_max<A>() - b) < a))\n         raise_add_overflow();\n   }\n   else\n   {\n      if ((b < 0) && ((type_min<A>() - b) > a))\n         raise_add_overflow();\n   }\n   return a + b;\n}\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR A checked_add_imp(A a, A b, const std::integral_constant<bool, false>&)\n{\n   if ((type_max<A>() - b) < a)\n      raise_add_overflow();\n   return a + b;\n}\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR A checked_add(A a, A b, const std::integral_constant<int, checked>&)\n{\n   return checked_add_imp(a, b, std::integral_constant<bool, boost::multiprecision::detail::is_signed<A>::value && boost::multiprecision::detail::is_integral<A>::value > ());\n}\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR A checked_add(A a, A b, const std::integral_constant<int, unchecked>&)\n{\n   return a + b;\n}\n\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR A checked_subtract_imp(A a, A b, const std::integral_constant<bool, true>&)\n{\n   if (a > 0)\n   {\n      if ((b < 0) && ((type_max<A>() + b) < a))\n         raise_subtract_overflow();\n   }\n   else\n   {\n      if ((b > 0) && ((type_min<A>() + b) > a))\n         raise_subtract_overflow();\n   }\n   return a - b;\n}\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR A checked_subtract_imp(A a, A b, const std::integral_constant<bool, false>&)\n{\n   if (a < b)\n      raise_subtract_overflow();\n   return a - b;\n}\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR A checked_subtract(A a, A b, const std::integral_constant<int, checked>&)\n{\n   return checked_subtract_imp(a, b, std::integral_constant<bool, boost::multiprecision::detail::is_signed<A>::value && boost::multiprecision::detail::is_integral<A>::value>());\n}\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR A checked_subtract(A a, A b, const std::integral_constant<int, unchecked>&)\n{\n   return a - b;\n}\n\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR A checked_multiply(A a, A b, const std::integral_constant<int, checked>&)\n{\n   BOOST_MP_USING_ABS\n   if (a && (type_max<A>() / abs(a) < abs(b)))\n      raise_mul_overflow();\n   return a * b;\n}\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR A checked_multiply(A a, A b, const std::integral_constant<int, unchecked>&)\n{\n   return a * b;\n}\n\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR A checked_divide(A a, A b, const std::integral_constant<int, checked>&)\n{\n   if (b == 0)\n      raise_div_overflow();\n   return a / b;\n}\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR A checked_divide(A a, A b, const std::integral_constant<int, unchecked>&)\n{\n   return a / b;\n}\n\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR A checked_left_shift(A a, unsigned long long shift, const std::integral_constant<int, checked>&)\n{\n   if (a && shift)\n   {\n      if ((shift > sizeof(A) * CHAR_BIT) || (a >> (sizeof(A) * CHAR_BIT - shift)))\n         BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Shift out of range\"));\n   }\n   return a << shift;\n}\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR A checked_left_shift(A a, unsigned long long shift, const std::integral_constant<int, unchecked>&)\n{\n   return (shift >= sizeof(A) * CHAR_BIT) ? 0 : a << shift;\n}\n\n}}}} // namespace boost::multiprecision::backends::detail\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_int/comparison.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// Comparison operators for cpp_int_backend:\n//\n#ifndef BOOST_MP_CPP_INT_COMPARISON_HPP\n#define BOOST_MP_CPP_INT_COMPARISON_HPP\n\n#include <boost/multiprecision/detail/constexpr.hpp>\n\nnamespace boost { namespace multiprecision { namespace backends {\n\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4018 4389 4996)\n#endif\n\n//\n// Start with non-trivial cpp_int's:\n//\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value,\n    bool>::type\neval_eq(const cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& a, const cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& b) noexcept\n{\n   return (a.sign() == b.sign()) && (a.size() == b.size()) && std_constexpr::equal(a.limbs(), a.limbs() + a.size(), b.limbs());\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value,\n    bool>::type\neval_eq(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a, const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& b) noexcept\n{\n   return (a.sign() == b.sign()) && (a.size() == b.size()) && std_constexpr::equal(a.limbs(), a.limbs() + a.size(), b.limbs());\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator> >::value,\n    bool>::type\neval_eq(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator>& a, limb_type b) noexcept\n{\n   return (a.sign() == false) && (a.size() == 1) && (*a.limbs() == b);\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator> >::value,\n    bool>::type\neval_eq(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator>& a, signed_limb_type b) noexcept\n{\n   return (a.sign() == (b < 0)) && (a.size() == 1) && (*a.limbs() == boost::multiprecision::detail::unsigned_abs(b));\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,\n    bool>::type\neval_eq(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator>& a, limb_type b) noexcept\n{\n   return (a.size() == 1) && (*a.limbs() == b);\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,\n    bool>::type\neval_eq(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator>& a, signed_limb_type b) noexcept\n{\n   return (b < 0) ? eval_eq(a, cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator>(b)) : eval_eq(a, static_cast<limb_type>(b)); // Use bit pattern of b for comparison\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator> >::value,\n    bool>::type\neval_lt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator>& a, limb_type b) noexcept\n{\n   if (a.sign())\n      return true;\n   if (a.size() > 1)\n      return false;\n   return *a.limbs() < b;\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator> >::value,\n    bool>::type\neval_lt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator>& a, signed_limb_type b) noexcept\n{\n   if ((b == 0) || (a.sign() != (b < 0)))\n      return a.sign();\n   if (a.sign())\n   {\n      if (a.size() > 1)\n         return true;\n      return *a.limbs() > boost::multiprecision::detail::unsigned_abs(b);\n   }\n   else\n   {\n      if (a.size() > 1)\n         return false;\n      return *a.limbs() < boost::multiprecision::detail::unsigned_abs(b);\n   }\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,\n    bool>::type\neval_lt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator>& a, limb_type b) noexcept\n{\n   if (a.size() > 1)\n      return false;\n   return *a.limbs() < b;\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,\n    bool>::type\neval_lt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator>& a, signed_limb_type b) noexcept\n{\n   return (b < 0) ? a.compare(b) < 0 : eval_lt(a, static_cast<limb_type>(b)); // Use bit pattern of b for comparison\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator> >::value,\n    bool>::type\neval_gt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator>& a, limb_type b) noexcept\n{\n   if (a.sign())\n      return false;\n   if (a.size() > 1)\n      return true;\n   return *a.limbs() > b;\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,\n    bool>::type\neval_gt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator>& a, signed_limb_type b) noexcept\n{\n   if (b == 0)\n      return !a.sign() && ((a.size() > 1) || *a.limbs());\n   if (a.sign() != (b < 0))\n      return !a.sign();\n   if (a.sign())\n   {\n      if (a.size() > 1)\n         return false;\n      return *a.limbs() < boost::multiprecision::detail::unsigned_abs(b);\n   }\n   else\n   {\n      if (a.size() > 1)\n         return true;\n      return *a.limbs() > boost::multiprecision::detail::unsigned_abs(b);\n   }\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,\n    bool>::type\neval_gt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator>& a, limb_type b) noexcept\n{\n   if (a.size() > 1)\n      return true;\n   return *a.limbs() > b;\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,\n    bool>::type\neval_gt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator>& a, signed_limb_type b) noexcept\n{\n   return (b < 0) ? a.compare(b) > 0 : eval_gt(a, static_cast<limb_type>(b)); // Use bit pattern of b for comparison.\n}\n//\n// And again for trivial cpp_ints:\n//\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,\n    bool>::value\neval_eq(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& a, const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& b) noexcept\n{\n   return (a.sign() == b.sign()) && (*a.limbs() == *b.limbs());\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,\n    bool>::value\neval_eq(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& a, const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& b) noexcept\n{\n   return *a.limbs() == *b.limbs();\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class U>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    boost::multiprecision::detail::is_unsigned<U>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,\n    bool>::type\neval_eq(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& a, U b) noexcept\n{\n   return !a.sign() && (*a.limbs() == b);\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class S>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    boost::multiprecision::detail::is_signed<S>::value && boost::multiprecision::detail::is_integral<S>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,\n    bool>::type\neval_eq(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& a, S b) noexcept\n{\n   return (a.sign() == (b < 0)) && (*a.limbs() == boost::multiprecision::detail::unsigned_abs(b));\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class U>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    boost::multiprecision::detail::is_unsigned<U>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,\n    bool>::type\neval_eq(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& a, U b) noexcept\n{\n   return *a.limbs() == b;\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class S>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    boost::multiprecision::detail::is_signed<S>::value && boost::multiprecision::detail::is_integral<S>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,\n    bool>::type\neval_eq(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& a, S b) noexcept\n{\n   using ui_type = typename boost::multiprecision::detail::make_unsigned<S>::type;\n   if (b < 0)\n   {\n      cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> t(b);\n      return *a.limbs() == *t.limbs();\n   }\n   else\n   {\n      return *a.limbs() == static_cast<ui_type>(b);\n   }\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,\n    bool>::type\neval_lt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& a, const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& b) noexcept\n{\n   if (a.sign() != b.sign())\n      return a.sign();\n   return a.sign() ? *a.limbs() > *b.limbs() : *a.limbs() < *b.limbs();\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,\n    bool>::type\neval_lt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& a, const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& b) noexcept\n{\n   return *a.limbs() < *b.limbs();\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class U>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    boost::multiprecision::detail::is_unsigned<U>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,\n    bool>::type\neval_lt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& a, U b) noexcept\n{\n   if (a.sign())\n      return true;\n   return *a.limbs() < b;\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class S>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    boost::multiprecision::detail::is_signed<S>::value && boost::multiprecision::detail::is_integral<S>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,\n    bool>::type\neval_lt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& a, S b) noexcept\n{\n   if (a.sign() != (b < 0))\n      return a.sign();\n   return a.sign() ? (*a.limbs() > boost::multiprecision::detail::unsigned_abs(b)) : (*a.limbs() < boost::multiprecision::detail::unsigned_abs(b));\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class U>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    boost::multiprecision::detail::is_unsigned<U>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,\n    bool>::type\neval_lt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& a, U b) noexcept\n{\n   return *a.limbs() < b;\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class S>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    boost::multiprecision::detail::is_signed<S>::value && boost::multiprecision::detail::is_integral<S>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,\n    bool>::type\neval_lt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& a, S b) noexcept\n{\n   using ui_type = typename boost::multiprecision::detail::make_unsigned<S>::type;\n   if (b < 0)\n   {\n      cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> t(b);\n      return *a.limbs() < *t.limbs();\n   }\n   else\n   {\n      return *a.limbs() < static_cast<ui_type>(b);\n   }\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,\n    bool>::type\neval_gt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& a, const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& b) noexcept\n{\n   if (a.sign() != b.sign())\n      return !a.sign();\n   return a.sign() ? *a.limbs() < *b.limbs() : *a.limbs() > *b.limbs();\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,\n    bool>::type\neval_gt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& a, const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& b) noexcept\n{\n   return *a.limbs() > *b.limbs();\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class U>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    boost::multiprecision::detail::is_unsigned<U>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,\n    bool>::type\neval_gt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& a, U b) noexcept\n{\n   if (a.sign())\n      return false;\n   return *a.limbs() > b;\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class S>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    boost::multiprecision::detail::is_signed<S>::value && boost::multiprecision::detail::is_integral<S>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,\n    bool>::type\neval_gt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& a, S b) noexcept\n{\n   if (a.sign() != (b < 0))\n      return !a.sign();\n   return a.sign() ? (*a.limbs() < boost::multiprecision::detail::unsigned_abs(b)) : (*a.limbs() > boost::multiprecision::detail::unsigned_abs(b));\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class U>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    boost::multiprecision::detail::is_unsigned<U>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,\n    bool>::type\neval_gt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& a, U b) noexcept\n{\n   return *a.limbs() > b;\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class S>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    boost::multiprecision::detail::is_signed<S>::value && boost::multiprecision::detail::is_integral<S>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,\n    bool>::type\neval_gt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& a, S b) noexcept\n{\n   using ui_type = typename boost::multiprecision::detail::make_unsigned<S>::type;\n   if (b < 0)\n   {\n      cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> t(b);\n      return *a.limbs() > *t.limbs();\n   }\n   else\n   {\n      return *a.limbs() > static_cast<ui_type>(b);\n   }\n}\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n}}} // namespace boost::multiprecision::backends\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_int/cpp_int_config.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 - 2021 John Maddock.\n//  Copyright 2021 Matt Borland.\n//  Distributed under the Boost Software License, Version 1.0.\n//  See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_CPP_INT_CONFIG_HPP\n#define BOOST_MP_CPP_INT_CONFIG_HPP\n\n#include <cstdint>\n#include <type_traits>\n#include <limits>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/detail/number_base.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n\nnamespace boost {\nnamespace multiprecision {\n\nnamespace detail {\n\n//\n// These traits calculate the largest type in the list\n// [unsigned] long long, long, int, which has the specified number\n// of bits.  Note that int_t and uint_t find the first\n// member of the above list, not the last.  We want the last in the\n// list to ensure that mixed arithmetic operations are as efficient\n// as possible.\n//\n\ntemplate <std::size_t Bits>\nstruct int_t\n{\n   using exact = typename std::conditional<Bits <= sizeof(signed char) * CHAR_BIT, signed char,\n                 typename std::conditional<Bits <= sizeof(short) * CHAR_BIT, short,\n                 typename std::conditional<Bits <= sizeof(int) * CHAR_BIT, int,\n                 typename std::conditional<Bits <= sizeof(long) * CHAR_BIT, long,\n                 typename std::conditional<Bits <= sizeof(long long) * CHAR_BIT, long long, void\n                 >::type>::type>::type>::type>::type;\n\n   using least = typename std::conditional<Bits-1 <= std::numeric_limits<signed char>::digits, signed char,\n                 typename std::conditional<Bits-1 <= std::numeric_limits<short>::digits, short,\n                 typename std::conditional<Bits-1 <= std::numeric_limits<int>::digits, int,\n                 typename std::conditional<Bits-1 <= std::numeric_limits<long>::digits, long,\n                 typename std::conditional<Bits-1 <= std::numeric_limits<long long>::digits, long long, void\n                 >::type>::type>::type>::type>::type;\n   \n   static_assert(!std::is_same<void, exact>::value && !std::is_same<void, least>::value, \"Number of bits does not match any standard data type. \\\n      Please file an issue at https://github.com/boostorg/multiprecision/ referencing this error from cpp_int_config.hpp\");\n};\n\ntemplate <std::size_t Bits>\nstruct uint_t\n{\n   using exact = typename std::conditional<Bits <= sizeof(unsigned char) * CHAR_BIT, unsigned char,\n                 typename std::conditional<Bits <= sizeof(unsigned short) * CHAR_BIT, unsigned short,\n                 typename std::conditional<Bits <= sizeof(unsigned int) * CHAR_BIT, unsigned int,\n                 typename std::conditional<Bits <= sizeof(unsigned long) * CHAR_BIT, unsigned long,\n                 typename std::conditional<Bits <= sizeof(unsigned long long) * CHAR_BIT, unsigned long long, void\n                 >::type>::type>::type>::type>::type;\n\n   using least = typename std::conditional<Bits <= std::numeric_limits<unsigned char>::digits, unsigned char,\n                 typename std::conditional<Bits <= std::numeric_limits<unsigned short>::digits, unsigned short,\n                 typename std::conditional<Bits <= std::numeric_limits<unsigned int>::digits, unsigned int,\n                 typename std::conditional<Bits <= std::numeric_limits<unsigned long>::digits, unsigned long,\n                 typename std::conditional<Bits <= std::numeric_limits<unsigned long long>::digits, unsigned long long, void\n                 >::type>::type>::type>::type>::type;\n\n   static_assert(!std::is_same<void, exact>::value && !std::is_same<void, least>::value, \"Number of bits does not match any standard data type. \\\n      Please file an issue at https://github.com/boostorg/multiprecision/ referencing this error from cpp_int_config.hpp\");\n};\n\ntemplate <std::size_t N>\nstruct largest_signed_type\n{\n   using type = typename std::conditional<\n       1 + std::numeric_limits<long long>::digits == N,\n       long long,\n       typename std::conditional<\n           1 + std::numeric_limits<long>::digits == N,\n           long,\n           typename std::conditional<\n               1 + std::numeric_limits<int>::digits == N,\n               int,\n               typename int_t<N>::exact>::type>::type>::type;\n};\n\ntemplate <std::size_t N>\nstruct largest_unsigned_type\n{\n   using type = typename std::conditional<\n       std::numeric_limits<unsigned long long>::digits == N,\n       unsigned long long,\n       typename std::conditional<\n           std::numeric_limits<unsigned long>::digits == N,\n           unsigned long,\n           typename std::conditional<\n               std::numeric_limits<unsigned int>::digits == N,\n               unsigned int,\n               typename uint_t<N>::exact>::type>::type>::type;\n};\n\n} // namespace detail\n\n#if defined(BOOST_HAS_INT128)\n\nusing limb_type = detail::largest_unsigned_type<64>::type;\nusing signed_limb_type = detail::largest_signed_type<64>::type;\nusing double_limb_type = boost::multiprecision::uint128_type;\nusing signed_double_limb_type = boost::multiprecision::int128_type;\nconstexpr limb_type                       max_block_10        = 1000000000000000000uLL;\nconstexpr limb_type                       digits_per_block_10 = 18;\n\ninline BOOST_MP_CXX14_CONSTEXPR limb_type block_multiplier(std::size_t count)\n{\n   constexpr limb_type values[digits_per_block_10] = {10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 10000000000, 100000000000, 1000000000000, 10000000000000, 100000000000000, 1000000000000000, 10000000000000000, 100000000000000000, 1000000000000000000};\n   BOOST_MP_ASSERT(count < digits_per_block_10);\n   return values[count];\n}\n\n// Can't do formatted IO on an __int128\n#define BOOST_MP_NO_DOUBLE_LIMB_TYPE_IO\n\n#else\n\nusing limb_type = detail::largest_unsigned_type<32>::type;\nusing signed_limb_type = detail::largest_signed_type<32>::type  ;\nusing double_limb_type = detail::largest_unsigned_type<64>::type;\nusing signed_double_limb_type = detail::largest_signed_type<64>::type  ;\nconstexpr limb_type                       max_block_10        = 1000000000;\nconstexpr limb_type                       digits_per_block_10 = 9;\n\ninline limb_type block_multiplier(std::size_t count)\n{\n   constexpr limb_type values[digits_per_block_10] = {10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};\n   BOOST_MP_ASSERT(count < digits_per_block_10);\n   return values[count];\n}\n\n#endif\n\nconstexpr std::size_t bits_per_limb = sizeof(limb_type) * CHAR_BIT;\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void minmax(const T& a, const T& b, T& aa, T& bb)\n{\n   if (a < b)\n   {\n      aa = a;\n      bb = b;\n   }\n   else\n   {\n      aa = b;\n      bb = a;\n   }\n}\n\nenum cpp_integer_type\n{\n   signed_magnitude   = 1,\n   unsigned_magnitude = 0,\n   signed_packed      = 3,\n   unsigned_packed    = 2\n};\n\nenum cpp_int_check_type\n{\n   checked   = 1,\n   unchecked = 0\n};\n\n} // namespace multiprecision\n} // namespace boost\n\n#endif // BOOST_MP_CPP_INT_CONFIG_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_int/divide.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// Comparison operators for cpp_int_backend:\n//\n#ifndef BOOST_MP_CPP_INT_DIVIDE_HPP\n#define BOOST_MP_CPP_INT_DIVIDE_HPP\n\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n\nnamespace boost { namespace multiprecision { namespace backends {\n\ntemplate <class CppInt1, class CppInt2, class CppInt3>\nBOOST_MP_CXX14_CONSTEXPR void divide_unsigned_helper(\n    CppInt1*       result,\n    const CppInt2& x,\n    const CppInt3& y,\n    CppInt1&       r)\n{\n   if (((void*)result == (void*)&x) || ((void*)&r == (void*)&x))\n   {\n      CppInt2 t(x);\n      divide_unsigned_helper(result, t, y, r);\n      return;\n   }\n   if (((void*)result == (void*)&y) || ((void*)&r == (void*)&y))\n   {\n      CppInt3 t(y);\n      divide_unsigned_helper(result, x, t, r);\n      return;\n   }\n\n   /*\n    Very simple, fairly braindead long division.\n    Start by setting the remainder equal to x, and the\n    result equal to 0.  Then in each loop we calculate our\n    \"best guess\" for how many times y divides into r,\n    add our guess to the result, and subtract guess*y\n    from the remainder r.  One wrinkle is that the remainder\n    may go negative, in which case we subtract the current guess\n    from the result rather than adding.  The value of the guess\n    is determined by dividing the most-significant-limb of the\n    current remainder by the most-significant-limb of y.\n\n    Note that there are more efficient algorithms than this\n    available, in particular see Knuth Vol 2.  However for small\n    numbers of limbs this generally outperforms the alternatives\n    and avoids the normalisation step which would require extra storage.\n    */\n\n   using default_ops::eval_subtract;\n\n   if (result == &r)\n   {\n      CppInt1 rem;\n      divide_unsigned_helper(result, x, y, rem);\n      r = rem;\n      return;\n   }\n\n   //\n   // Find the most significant words of numerator and denominator.\n   //\n   std::size_t y_order = y.size() - 1;\n\n   if (y_order == 0)\n   {\n      //\n      // Only a single non-zero limb in the denominator, in this case\n      // we can use a specialized divide-by-single-limb routine which is\n      // much faster.  This also handles division by zero:\n      //\n      divide_unsigned_helper(result, x, y.limbs()[y_order], r);\n      return;\n   }\n\n   typename CppInt2::const_limb_pointer px = x.limbs();\n   typename CppInt3::const_limb_pointer py = y.limbs();\n\n   std::size_t r_order = x.size() - 1;\n   if ((r_order == 0) && (*px == 0))\n   {\n      // x is zero, so is the result:\n      r = x;\n      if (result)\n         *result = x;\n      return;\n   }\n\n   r = x;\n   r.sign(false);\n   if (result)\n      *result = static_cast<limb_type>(0u);\n   //\n   // Check if the remainder is already less than the divisor, if so\n   // we already have the result.  Note we try and avoid a full compare\n   // if we can:\n   //\n   if (r_order <= y_order)\n   {\n      if ((r_order < y_order) || (r.compare_unsigned(y) < 0))\n      {\n         return;\n      }\n   }\n\n   CppInt1 t;\n   bool    r_neg = false;\n\n   //\n   // See if we can short-circuit long division, and use basic arithmetic instead:\n   //\n   if (r_order == 0)\n   {\n      if (result)\n      {\n         *result = px[0] / py[0];\n      }\n      r = px[0] % py[0];\n      return;\n   }\n   else if (r_order == 1)\n   {\n      double_limb_type a = (static_cast<double_limb_type>(px[1]) << CppInt1::limb_bits) | px[0];\n      double_limb_type b = y_order ? (static_cast<double_limb_type>(py[1]) << CppInt1::limb_bits) | py[0]\n                                   : py[0];\n      if (result)\n      {\n         *result = a / b;\n      }\n      r = a % b;\n      return;\n   }\n   //\n   // prepare result:\n   //\n   if (result)\n      result->resize(1 + r_order - y_order, 1 + r_order - y_order);\n   typename CppInt1::const_limb_pointer prem = r.limbs();\n   // This is initialised just to keep the compiler from emitting useless warnings later on:\n   typename CppInt1::limb_pointer pr = typename CppInt1::limb_pointer();\n   if (result)\n   {\n      pr = result->limbs();\n      for (std::size_t i = 1; i < 1 + r_order - y_order; ++i)\n         pr[i] = 0;\n   }\n   bool first_pass = true;\n\n   do\n   {\n      //\n      // Calculate our best guess for how many times y divides into r:\n      //\n      limb_type guess = 1;\n      if ((prem[r_order] <= py[y_order]) && (r_order > 0))\n      {\n         double_limb_type a = (static_cast<double_limb_type>(prem[r_order]) << CppInt1::limb_bits) | prem[r_order - 1];\n         double_limb_type b = py[y_order];\n         double_limb_type v = a / b;\n         if (v <= CppInt1::max_limb_value)\n         {\n            guess = static_cast<limb_type>(v);\n            --r_order;\n         }\n      }\n      else if (r_order == 0)\n      {\n         guess = prem[0] / py[y_order];\n      }\n      else\n      {\n         double_limb_type a = (static_cast<double_limb_type>(prem[r_order]) << CppInt1::limb_bits) | prem[r_order - 1];\n         double_limb_type b = (y_order > 0) ? (static_cast<double_limb_type>(py[y_order]) << CppInt1::limb_bits) | py[y_order - 1] : (static_cast<double_limb_type>(py[y_order]) << CppInt1::limb_bits);\n         BOOST_MP_ASSERT(b);\n         double_limb_type v = a / b;\n         guess              = static_cast<limb_type>(v);\n      }\n      BOOST_MP_ASSERT(guess); // If the guess ever gets to zero we go on forever....\n      //\n      // Update result:\n      //\n      std::size_t shift = r_order - y_order;\n      if (result)\n      {\n         if (r_neg)\n         {\n            if (pr[shift] > guess)\n               pr[shift] -= guess;\n            else\n            {\n               t.resize(shift + 1, shift + 1);\n               t.limbs()[shift] = guess;\n               for (std::size_t i = 0; i < shift; ++i)\n                  t.limbs()[i] = 0;\n               eval_subtract(*result, t);\n            }\n         }\n         else if (CppInt1::max_limb_value - pr[shift] > guess)\n            pr[shift] += guess;\n         else\n         {\n            t.resize(shift + 1, shift + 1);\n            t.limbs()[shift] = guess;\n            for (std::size_t i = 0; i < shift; ++i)\n               t.limbs()[i] = 0;\n            eval_add(*result, t);\n         }\n      }\n      //\n      // Calculate guess * y, we use a fused mutiply-shift O(N) for this\n      // rather than a full O(N^2) multiply:\n      //\n      double_limb_type carry = 0;\n      t.resize(y.size() + shift + 1, y.size() + shift);\n      bool                           truncated_t = (t.size() != y.size() + shift + 1);\n      typename CppInt1::limb_pointer pt          = t.limbs();\n      for (std::size_t i = 0; i < shift; ++i)\n         pt[i] = 0;\n      for (std::size_t i = 0; i < y.size(); ++i)\n      {\n         carry += static_cast<double_limb_type>(py[i]) * static_cast<double_limb_type>(guess);\n#ifdef __MSVC_RUNTIME_CHECKS\n         pt[i + shift] = static_cast<limb_type>(carry & ~static_cast<limb_type>(0));\n#else\n         pt[i + shift]    = static_cast<limb_type>(carry);\n#endif\n         carry >>= CppInt1::limb_bits;\n      }\n      if (carry && !truncated_t)\n      {\n#ifdef __MSVC_RUNTIME_CHECKS\n         pt[t.size() - 1] = static_cast<limb_type>(carry & ~static_cast<limb_type>(0));\n#else\n         pt[t.size() - 1] = static_cast<limb_type>(carry);\n#endif\n      }\n      else if (!truncated_t)\n      {\n         t.resize(t.size() - 1, t.size() - 1);\n      }\n      //\n      // Update r in a way that won't actually produce a negative result\n      // in case the argument types are unsigned:\n      //\n      if (truncated_t && carry)\n      {\n         // We need to calculate 2^n + t - r\n         // where n is the number of bits in this type.\n         // Simplest way is to get 2^n - r by complementing\n         // r, then add t to it.  Note that we can't call eval_complement\n         // in case this is a signed checked type:\n         for (std::size_t i = 0; i <= r_order; ++i)\n            r.limbs()[i] = ~prem[i];\n         r.normalize();\n         eval_increment(r);\n         eval_add(r, t);\n         r_neg = !r_neg;\n      }\n      else if (r.compare(t) > 0)\n      {\n         eval_subtract(r, t);\n      }\n      else\n      {\n         r.swap(t);\n         eval_subtract(r, t);\n         prem  = r.limbs();\n         r_neg = !r_neg;\n      }\n      //\n      // First time through we need to strip any leading zero, otherwise\n      // the termination condition goes belly-up:\n      //\n      if (result && first_pass)\n      {\n         first_pass = false;\n         while (pr[result->size() - 1] == 0)\n            result->resize(result->size() - 1, result->size() - 1);\n      }\n      //\n      // Update r_order:\n      //\n      r_order = r.size() - 1;\n      if (r_order < y_order)\n         break;\n   }\n   // Termination condition is really just a check that r > y, but with a common\n   // short-circuit case handled first:\n   while ((r_order > y_order) || (r.compare_unsigned(y) >= 0));\n\n   //\n   // We now just have to normalise the result:\n   //\n   if (r_neg && eval_get_sign(r))\n   {\n      // We have one too many in the result:\n      if (result)\n         eval_decrement(*result);\n      if (y.sign())\n      {\n         r.negate();\n         eval_subtract(r, y);\n      }\n      else\n         eval_subtract(r, y, r);\n   }\n\n   BOOST_MP_ASSERT(r.compare_unsigned(y) < 0); // remainder must be less than the divisor or our code has failed\n}\n\ntemplate <class CppInt1, class CppInt2>\nBOOST_MP_CXX14_CONSTEXPR void divide_unsigned_helper(\n    CppInt1*       result,\n    const CppInt2& x,\n    limb_type      y,\n    CppInt1&       r)\n{\n   if (((void*)result == (void*)&x) || ((void*)&r == (void*)&x))\n   {\n      CppInt2 t(x);\n      divide_unsigned_helper(result, t, y, r);\n      return;\n   }\n\n   if (result == &r)\n   {\n      CppInt1 rem;\n      divide_unsigned_helper(result, x, y, rem);\n      r = rem;\n      return;\n   }\n\n   // As above, but simplified for integer divisor:\n\n   using default_ops::eval_subtract;\n\n   if (y == 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Integer Division by zero.\"));\n   }\n   //\n   // Find the most significant word of numerator.\n   //\n   std::size_t r_order = x.size() - 1;\n\n   //\n   // Set remainder and result to their initial values:\n   //\n   r = x;\n   r.sign(false);\n   typename CppInt1::limb_pointer pr = r.limbs();\n\n   //\n   // check for x < y, try to do this without actually having to\n   // do a full comparison:\n   //\n   if ((r_order == 0) && (*pr < y))\n   {\n      if (result)\n         *result = static_cast<limb_type>(0u);\n      return;\n   }\n\n   //\n   // See if we can short-circuit long division, and use basic arithmetic instead:\n   //\n   if (r_order == 0)\n   {\n      if (result)\n      {\n         *result = *pr / y;\n         result->sign(x.sign());\n      }\n      *pr %= y;\n      r.sign(x.sign());\n      return;\n   }\n   else if (r_order == 1)\n   {\n      double_limb_type a = (static_cast<double_limb_type>(pr[r_order]) << CppInt1::limb_bits) | pr[0];\n      if (result)\n      {\n         *result = a / y;\n         result->sign(x.sign());\n      }\n      r = a % y;\n      r.sign(x.sign());\n      return;\n   }\n\n   // This is initialised just to keep the compiler from emitting useless warnings later on:\n   typename CppInt1::limb_pointer pres = typename CppInt1::limb_pointer();\n   if (result)\n   {\n      result->resize(r_order + 1, r_order + 1);\n      pres = result->limbs();\n      if (result->size() > r_order)\n         pres[r_order] = 0; // just in case we don't set the most significant limb below.\n   }\n\n   do\n   {\n      //\n      // Calculate our best guess for how many times y divides into r:\n      //\n      if ((pr[r_order] < y) && r_order)\n      {\n         double_limb_type a = (static_cast<double_limb_type>(pr[r_order]) << CppInt1::limb_bits) | pr[r_order - 1];\n         double_limb_type b = a % y;\n         r.resize(r.size() - 1, r.size() - 1);\n         --r_order;\n         pr[r_order] = static_cast<limb_type>(b);\n         if (result)\n            pres[r_order] = static_cast<limb_type>(a / y);\n         if (r_order && pr[r_order] == 0)\n         {\n            --r_order; // No remainder, division was exact.\n            r.resize(r.size() - 1, r.size() - 1);\n            if (result)\n               pres[r_order] = static_cast<limb_type>(0u);\n         }\n      }\n      else\n      {\n         if (result)\n            pres[r_order] = pr[r_order] / y;\n         pr[r_order] %= y;\n         if (r_order && pr[r_order] == 0)\n         {\n            --r_order; // No remainder, division was exact.\n            r.resize(r.size() - 1, r.size() - 1);\n            if (result)\n               pres[r_order] = static_cast<limb_type>(0u);\n         }\n      }\n   }\n   // Termination condition is really just a check that r >= y, but with two common\n   // short-circuit cases handled first:\n   while (r_order || (pr[r_order] >= y));\n\n   if (result)\n   {\n      result->normalize();\n      result->sign(x.sign());\n   }\n   r.normalize();\n   r.sign(x.sign());\n\n   BOOST_MP_ASSERT(r.compare(y) < 0); // remainder must be less than the divisor or our code has failed\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, std::size_t MinBits3, std::size_t MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3> >::value>::type\neval_divide(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,\n    const cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3>& b)\n{\n   cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> r;\n   bool                                                                 s = a.sign() != b.sign();\n   divide_unsigned_helper(&result, a, b, r);\n   result.sign(s);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_divide(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,\n    limb_type&                                                                  b)\n{\n   cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> r;\n   bool                                                                 s = a.sign();\n   divide_unsigned_helper(&result, a, b, r);\n   result.sign(s);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_divide(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,\n    signed_limb_type&                                                           b)\n{\n   cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> r;\n   bool                                                                 s = a.sign() != (b < 0);\n   divide_unsigned_helper(&result, a, static_cast<limb_type>(boost::multiprecision::detail::unsigned_abs(b)), r);\n   result.sign(s);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_divide(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& b)\n{\n   // There is no in place divide:\n   cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> a(result);\n   eval_divide(result, a, b);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_divide(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,\n    limb_type                                                             b)\n{\n   // There is no in place divide:\n   cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> a(result);\n   eval_divide(result, a, b);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_divide(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,\n    signed_limb_type                                                      b)\n{\n   // There is no in place divide:\n   cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> a(result);\n   eval_divide(result, a, b);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, std::size_t MinBits3, std::size_t MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3> >::value>::type\neval_modulus(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,\n    const cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3>& b)\n{\n   bool s = a.sign();\n   if (b.size() == 1)\n      eval_modulus(result, a, *b.limbs());\n   else\n   {\n      using cpp_int_backend1_type = cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>;\n\n      divide_unsigned_helper(static_cast<cpp_int_backend1_type*>(nullptr), a, b, result);\n   }\n   result.sign(s);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_modulus(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,\n    const limb_type                                                             mod)\n{\n   const std::ptrdiff_t n = static_cast<std::ptrdiff_t>(a.size());\n   const double_limb_type two_n_mod = static_cast<limb_type>(1u) + (~static_cast<limb_type>(0u) - mod) % mod;\n   limb_type              res       = a.limbs()[n - 1] % mod;\n\n   for (std::ptrdiff_t i = n - 2; i >= 0; --i)\n      res = static_cast<limb_type>(static_cast<double_limb_type>(static_cast<double_limb_type>(res * two_n_mod) + a.limbs()[i]) % mod);\n   //\n   // We must not modify result until here in case\n   // result and a are the same object:\n   //\n   result.resize(1, 1);\n   *result.limbs() = res;\n   result.sign(a.sign());\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_modulus(\n   cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,\n   const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,\n   signed_limb_type                                                            b)\n{\n   const limb_type t = b < 0 ? static_cast<limb_type>(-b) : static_cast<limb_type>(b);\n   eval_modulus(result, a, t);\n   result.sign(a.sign());\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_modulus(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& b)\n{\n   // There is no in place divide:\n   cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> a(result);\n   eval_modulus(result, a, b);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_modulus(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,\n    limb_type                                                             b)\n{\n   // Single limb modulus is in place:\n   eval_modulus(result, result, b);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_modulus(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,\n    signed_limb_type                                                      b)\n{\n   // Single limb modulus is in place:\n   eval_modulus(result, result, b);\n}\n\n//\n// Over again for trivial cpp_int's:\n//\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value)>::type\neval_divide(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& o)\n{\n   if (!*o.limbs())\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n   *result.limbs() /= *o.limbs();\n   result.sign(result.sign() != o.sign());\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_divide(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& o)\n{\n   if (!*o.limbs())\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n   *result.limbs() /= *o.limbs();\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_modulus(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& o)\n{\n   if (!*o.limbs())\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n   *result.limbs() %= *o.limbs();\n   result.sign(result.sign());\n}\n\n}}} // namespace boost::multiprecision::backends\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_int/import_export.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2015 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_CPP_INT_IMPORT_EXPORT_HPP\n#define BOOST_MP_CPP_INT_IMPORT_EXPORT_HPP\n\n#include <climits>\n#include <cstring>\n#include <boost/multiprecision/detail/endian.hpp>\n\nnamespace boost {\nnamespace multiprecision {\n\nnamespace detail {\n\ntemplate <class Backend, class Unsigned>\nvoid assign_bits(Backend& val, Unsigned bits, std::size_t bit_location, std::size_t chunk_bits, const std::integral_constant<bool, false>& tag)\n{\n   std::size_t limb  = bit_location / (sizeof(limb_type) * CHAR_BIT);\n   std::size_t shift = bit_location % (sizeof(limb_type) * CHAR_BIT);\n\n   limb_type mask = chunk_bits >= sizeof(limb_type) * CHAR_BIT ? ~static_cast<limb_type>(0u) : (static_cast<limb_type>(1u) << chunk_bits) - 1;\n\n   limb_type value = static_cast<limb_type>(bits & mask) << shift;\n   if (value)\n   {\n      if (val.size() == limb)\n      {\n         val.resize(limb + 1, limb + 1);\n         if (val.size() > limb)\n            val.limbs()[limb] = value;\n      }\n      else if (val.size() > limb)\n         val.limbs()[limb] |= value;\n   }\n   if (chunk_bits > sizeof(limb_type) * CHAR_BIT - shift)\n   {\n      shift = sizeof(limb_type) * CHAR_BIT - shift;\n      chunk_bits -= shift;\n      bit_location += shift;\n      bits >>= shift;\n      if (bits)\n         assign_bits(val, bits, bit_location, chunk_bits, tag);\n   }\n}\ntemplate <class Backend, class Unsigned>\nvoid assign_bits(Backend& val, Unsigned bits, std::size_t bit_location, std::size_t chunk_bits, const std::integral_constant<bool, true>&)\n{\n   using local_limb_type = typename Backend::local_limb_type;\n   //\n   // Check for possible overflow, this may trigger an exception, or have no effect\n   // depending on whether this is a checked integer or not:\n   //\n   if ((bit_location >= sizeof(local_limb_type) * CHAR_BIT) && bits)\n      val.resize(2, 2);\n   else\n   {\n      local_limb_type mask  = chunk_bits >= sizeof(local_limb_type) * CHAR_BIT ? ~static_cast<local_limb_type>(0u) : (static_cast<local_limb_type>(1u) << chunk_bits) - 1;\n      local_limb_type value = (static_cast<local_limb_type>(bits) & mask) << bit_location;\n      *val.limbs() |= value;\n      //\n      // Check for overflow bits:\n      //\n      bit_location = sizeof(local_limb_type) * CHAR_BIT - bit_location;\n      if ((bit_location < sizeof(bits) * CHAR_BIT) && (bits >>= bit_location))\n         val.resize(2, 2); // May throw!\n   }\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>\ninline void resize_to_bit_size(cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& newval, std::size_t bits, const std::integral_constant<bool, false>&)\n{\n   std::size_t limb_count = static_cast<unsigned>(bits / (sizeof(limb_type) * CHAR_BIT));\n   if (bits % (sizeof(limb_type) * CHAR_BIT))\n      ++limb_count;\n   constexpr std::size_t max_limbs = MaxBits ? MaxBits / (CHAR_BIT * sizeof(limb_type)) + ((MaxBits % (CHAR_BIT * sizeof(limb_type))) ? 1 : 0) : (std::numeric_limits<unsigned>::max)();\n   if (limb_count > max_limbs)\n      limb_count = max_limbs;\n   newval.resize(limb_count, limb_count);\n   std::memset(newval.limbs(), 0, newval.size() * sizeof(limb_type));\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>\ninline void resize_to_bit_size(cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& newval, unsigned, const std::integral_constant<bool, true>&)\n{\n   *newval.limbs() = 0;\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class Iterator>\nnumber<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>&\nimport_bits_generic(\n    number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, Iterator i, Iterator j, std::size_t chunk_size = 0, bool msv_first = true)\n{\n   typename number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>::backend_type newval;\n\n   using value_type = typename std::iterator_traits<Iterator>::value_type                                  ;\n   using unsigned_value_type = typename boost::multiprecision::detail::make_unsigned<value_type>::type                                        ;\n   using difference_type = typename std::iterator_traits<Iterator>::difference_type                             ;\n   using size_type = typename boost::multiprecision::detail::make_unsigned<difference_type>::type                                   ;\n   using tag_type = typename cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>::trivial_tag;\n\n   if (!chunk_size)\n      chunk_size = std::numeric_limits<value_type>::digits;\n\n   size_type limbs = std::distance(i, j);\n   size_type bits  = limbs * chunk_size;\n\n   detail::resize_to_bit_size(newval, static_cast<unsigned>(bits), tag_type());\n\n   difference_type bit_location        = msv_first ? bits - chunk_size : 0;\n   difference_type bit_location_change = msv_first ? -static_cast<difference_type>(chunk_size) : chunk_size;\n\n   while (i != j)\n   {\n      detail::assign_bits(newval, static_cast<unsigned_value_type>(*i), static_cast<std::size_t>(bit_location), chunk_size, tag_type());\n      ++i;\n      bit_location += bit_location_change;\n   }\n\n   newval.normalize();\n\n   val.backend().swap(newval);\n   return val;\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class T>\ninline typename std::enable_if< !boost::multiprecision::backends::is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value, number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>&>::type\nimport_bits_fast(\n    number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, T* i, T* j, std::size_t chunk_size = 0)\n{\n   std::size_t byte_len = (j - i) * (chunk_size ? chunk_size / CHAR_BIT : sizeof(*i));\n   std::size_t limb_len = byte_len / sizeof(limb_type);\n   if (byte_len % sizeof(limb_type))\n      ++limb_len;\n   cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& result = val.backend();\n   result.resize(static_cast<unsigned>(limb_len), static_cast<unsigned>(limb_len)); // checked types may throw here if they're not large enough to hold the data!\n   result.limbs()[result.size() - 1] = 0u;\n   std::memcpy(result.limbs(), i, (std::min)(byte_len, result.size() * sizeof(limb_type)));\n   result.normalize(); // In case data has leading zeros.\n   return val;\n}\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class T>\ninline typename std::enable_if<boost::multiprecision::backends::is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value, number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>&>::type\nimport_bits_fast(\n    number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, T* i, T* j, std::size_t chunk_size = 0)\n{\n   cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& result   = val.backend();\n   std::size_t                                                      byte_len = (j - i) * (chunk_size ? chunk_size / CHAR_BIT : sizeof(*i));\n   std::size_t                                                      limb_len = byte_len / sizeof(result.limbs()[0]);\n   if (byte_len % sizeof(result.limbs()[0]))\n      ++limb_len;\n   result.limbs()[0] = 0u;\n   result.resize(static_cast<unsigned>(limb_len), static_cast<unsigned>(limb_len)); // checked types may throw here if they're not large enough to hold the data!\n   std::memcpy(result.limbs(), i, (std::min)(byte_len, result.size() * sizeof(result.limbs()[0])));\n   result.normalize(); // In case data has leading zeros.\n   return val;\n}\n} // namespace detail\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class Iterator>\ninline number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>&\nimport_bits(\n    number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, Iterator i, Iterator j, std::size_t chunk_size = 0, bool msv_first = true)\n{\n   return detail::import_bits_generic(val, i, j, chunk_size, msv_first);\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class T>\ninline number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>&\nimport_bits(\n    number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, T* i, T* j, std::size_t chunk_size = 0, bool msv_first = true)\n{\n#if BOOST_MP_ENDIAN_LITTLE_BYTE\n   if (((chunk_size % CHAR_BIT) == 0) && !msv_first && (sizeof(*i) * CHAR_BIT == chunk_size))\n      return detail::import_bits_fast(val, i, j, chunk_size);\n#endif\n   return detail::import_bits_generic(val, i, j, chunk_size, msv_first);\n}\n\nnamespace detail {\n\ntemplate <class Backend>\nstd::uintmax_t extract_bits(const Backend& val, std::size_t location, std::size_t count, const std::integral_constant<bool, false>& tag)\n{\n   std::size_t         limb   = location / (sizeof(limb_type) * CHAR_BIT);\n   std::size_t         shift  = location % (sizeof(limb_type) * CHAR_BIT);\n   std::uintmax_t result = 0;\n   std::uintmax_t mask   = count == std::numeric_limits<std::uintmax_t>::digits ? ~static_cast<std::uintmax_t>(0) : (static_cast<std::uintmax_t>(1u) << count) - 1;\n   if (count > (sizeof(limb_type) * CHAR_BIT - shift))\n   {\n      result = extract_bits(val, location + sizeof(limb_type) * CHAR_BIT - shift, count - sizeof(limb_type) * CHAR_BIT + shift, tag);\n      result <<= sizeof(limb_type) * CHAR_BIT - shift;\n   }\n   if (limb < val.size())\n      result |= (val.limbs()[limb] >> shift) & mask;\n   return result;\n}\n\ntemplate <class Backend>\ninline std::uintmax_t extract_bits(const Backend& val, std::size_t location, std::size_t count, const std::integral_constant<bool, true>&)\n{\n   typename Backend::local_limb_type result = *val.limbs();\n   typename Backend::local_limb_type mask   = count >= std::numeric_limits<typename Backend::local_limb_type>::digits ? ~static_cast<typename Backend::local_limb_type>(0) : (static_cast<typename Backend::local_limb_type>(1u) << count) - 1;\n   return (result >> location) & mask;\n}\n\n} // namespace detail\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class OutputIterator>\nOutputIterator export_bits(\n    const number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, OutputIterator out, std::size_t chunk_size, bool msv_first = true)\n{\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4244)\n#endif\n   using tag_type = typename cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>::trivial_tag;\n   if (!val)\n   {\n      *out = 0;\n      ++out;\n      return out;\n   }\n   std::size_t bitcount = boost::multiprecision::backends::eval_msb_imp(val.backend()) + 1;\n\n         std::ptrdiff_t bit_location = msv_first ? static_cast<std::ptrdiff_t>(bitcount - chunk_size) : 0;\n   const std::ptrdiff_t bit_step     = msv_first ? static_cast<std::ptrdiff_t>(-static_cast<std::ptrdiff_t>(chunk_size)) : static_cast<std::ptrdiff_t>(chunk_size);\n   while (bit_location % bit_step)\n      ++bit_location;\n\n   do\n   {\n      *out = detail::extract_bits(val.backend(), bit_location, chunk_size, tag_type());\n      ++out;\n      bit_location += bit_step;\n   } while ((bit_location >= 0) && (bit_location < static_cast<int>(bitcount)));\n\n   return out;\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n}\n\n}\n} // namespace boost::multiprecision\n\n#endif // BOOST_MP_CPP_INT_IMPORT_EXPORT_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_int/intel_intrinsics.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2020 Madhur Chauhan.\n//  Copyright 2020 John Maddock. \n//  Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_INTEL_INTRINSICS_HPP\n#define BOOST_MP_INTEL_INTRINSICS_HPP\n//\n// Select which actual implementation header to use:\n//\n#ifdef __has_include\n#if __has_include(<immintrin.h>)\n#define BOOST_MP_HAS_IMMINTRIN_H\n#endif\n#endif\n//\n// If this is GCC/clang, then check that the actual intrinsic exists:\n//\n#if defined(__has_builtin) && defined(__GNUC__)\n#if !__has_builtin(__builtin_ia32_addcarryx_u64) && defined(BOOST_MP_HAS_IMMINTRIN_H) \\\n   && !(defined(BOOST_GCC) && (__GNUC__ >= 9) \\\n      && (defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64)\\\n          || defined(i386) || defined(__i386) || defined(__i386__) || defined(_M_AMD64) \\\n          || defined(_M_X64) || defined(__amd64__) || defined(_M_X64)))\n#undef BOOST_MP_HAS_IMMINTRIN_H\n#endif\n#elif defined(BOOST_MP_HAS_IMMINTRIN_H) && defined(__GNUC__) && !(defined(BOOST_GCC) && (__GNUC__ >= 9))\n#undef BOOST_MP_HAS_IMMINTRIN_H\n#endif\n\n#if defined(__clang_major__) && (__clang_major__ < 9)\n// We appear to crash the compiler if we try to use these intrinsics?\n#undef BOOST_MP_HAS_IMMINTRIN_H\n#endif\n\n#if defined(_WIN32) && (defined(_M_ARM64) || defined(_M_ARM))\n//\n// When targeting platforms such as ARM, msvc (and also clang when emulating msvc) still has the\n// Intel headers in its include path even though they're not usable.\n// See https://github.com/boostorg/multiprecision/issues/321\n// Also https://github.com/boostorg/multiprecision/issues/475\n//\n#undef BOOST_MP_HAS_IMMINTRIN_H\n#endif\n\n#if defined(__APPLE_CC__) && defined(__clang_major__) && (__clang_major__ < 11) && defined(BOOST_MP_HAS_IMMINTRIN_H)\n// Apple clang has it's own version numbers.\n#undef BOOST_MP_HAS_IMMINTRIN_H\n#endif\n\n\n//\n// If the compiler supports the intrinsics used by GCC internally\n// inside <immintrin.h> then we'll use them directly.\n// This is a bit of defensive programming, mostly for a modern clang\n// sitting on top of an older GCC header install.\n//\n#if defined(__has_builtin) && !defined(BOOST_INTEL)\n\n# if __has_builtin(__builtin_ia32_addcarryx_u64)\n#  define BOOST_MP_ADDC __builtin_ia32_addcarryx_u\n# endif\n\n# if __has_builtin(__builtin_ia32_subborrow_u64)\n#  define BOOST_MP_SUBB __builtin_ia32_subborrow_u\n# elif __has_builtin(__builtin_ia32_sbb_u64)\n#  define BOOST_MP_SUBB __builtin_ia32_sbb_u\n# endif\n\n#endif\n\n#ifndef BOOST_MP_ADDC\n#define BOOST_MP_ADDC _addcarry_u\n#endif\n#ifndef BOOST_MP_SUBB\n#define BOOST_MP_SUBB _subborrow_u\n#endif\n\n#ifdef BOOST_MP_HAS_IMMINTRIN_H\n\n#ifdef BOOST_MSVC\n//\n// This is a subset of the full <immintrin.h> :\n//\n#include <intrin.h>\n#else\n#include <immintrin.h>\n#endif\n\n#if defined(BOOST_HAS_INT128)\n\nnamespace boost { namespace multiprecision { namespace detail {\n\nBOOST_MP_FORCEINLINE unsigned char addcarry_limb(unsigned char carry, limb_type a, limb_type b, limb_type* p_result)\n{\n#ifdef BOOST_INTEL\n   using cast_type = unsigned __int64;\n#else\n   using cast_type = unsigned long long;\n#endif\n   return BOOST_JOIN(BOOST_MP_ADDC, 64)(carry, a, b, reinterpret_cast<cast_type*>(p_result));\n}\n\nBOOST_MP_FORCEINLINE unsigned char subborrow_limb(unsigned char carry, limb_type a, limb_type b, limb_type* p_result)\n{\n#ifdef BOOST_INTEL\n   using cast_type = unsigned __int64;\n#else\n   using cast_type = unsigned long long;\n#endif\n   return BOOST_JOIN(BOOST_MP_SUBB, 64)(carry, a, b, reinterpret_cast<cast_type*>(p_result));\n}\n\n}}} // namespace boost::multiprecision::detail\n\n#else\n\nnamespace boost { namespace multiprecision { namespace detail {\n\nBOOST_MP_FORCEINLINE unsigned char addcarry_limb(unsigned char carry, limb_type a, limb_type b, limb_type* p_result)\n{\n   return BOOST_JOIN(BOOST_MP_ADDC, 32)(carry, a, b, reinterpret_cast<unsigned int*>(p_result));\n}\n\nBOOST_MP_FORCEINLINE unsigned char subborrow_limb(unsigned char carry, limb_type a, limb_type b, limb_type* p_result)\n{\n   return BOOST_JOIN(BOOST_MP_SUBB, 32)(carry, a, b, reinterpret_cast<unsigned int*>(p_result));\n}\n\n}}} // namespace boost::multiprecision::detail\n\n#endif\n\n#endif\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_int/limits.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// Comparison operators for cpp_int_backend:\n//\n#ifndef BOOST_MP_CPP_INT_LIMITS_HPP\n#define BOOST_MP_CPP_INT_LIMITS_HPP\n\n#include <boost/multiprecision/traits/max_digits10.hpp>\n\nnamespace std {\n\nnamespace detail {\n\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4307)\n#endif\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_CXX14_CONSTEXPR_IF_DETECTION boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>\nget_min(const std::integral_constant<bool, true>&, const std::integral_constant<bool, true>&, const std::integral_constant<bool, true>&)\n{\n   // Bounded, signed, and no allocator.\n   using result_type = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>                                               ;\n   using ui_type = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MaxBits, MaxBits, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked>, ExpressionTemplates>;\n#ifdef BOOST_MP_NO_CONSTEXPR_DETECTION\n   static\n#else\n   constexpr\n#endif\n   const result_type                                                                                                                                                                          val = -result_type(~ui_type(0));\n   return val;\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>\nget_min(const std::integral_constant<bool, true>&, const std::integral_constant<bool, true>&, const std::integral_constant<bool, false>&)\n{\n   // Bounded, signed, and an allocator (can't be constexpr).\n   using result_type = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>                                               ;\n   using ui_type = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MaxBits, MaxBits, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked>, ExpressionTemplates>;\n   static const result_type                                                                                                                                                                          val = -result_type(~ui_type(0));\n   return val;\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_CXX14_CONSTEXPR_IF_DETECTION boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>\nget_min(const std::integral_constant<bool, true>&, const std::integral_constant<bool, false>&, const std::integral_constant<bool, true>&)\n{\n   // Bounded, unsigned, no allocator (can be constexpr):\n#ifdef BOOST_MP_NO_CONSTEXPR_DETECTION\n   static\n#else\n   constexpr\n#endif\n   const boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> val(0u);\n   return val;\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>\nget_min(const std::integral_constant<bool, true>&, const std::integral_constant<bool, false>&, const std::integral_constant<bool, false>&)\n{\n   // Bounded and std::size_t with allocator (no constexpr):\n   static const boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> val(0u);\n   return val;\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates, bool has_allocator>\ninline boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>\nget_min(const std::integral_constant<bool, false>&, const std::integral_constant<bool, true>&, const std::integral_constant<bool, has_allocator>&)\n{\n   // Unbounded and signed, never constexpr because there must be an allocator.\n   // There is no minimum value, just return 0:\n   static const boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> val(0u);\n   return val;\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates, bool has_allocator>\ninline boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>\nget_min(const std::integral_constant<bool, false>&, const std::integral_constant<bool, false>&, const std::integral_constant<bool, has_allocator>&)\n{\n   // Unbound and unsigned, never constexpr because there must be an allocator.\n   static const boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> val(0u);\n   return val;\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_CXX14_CONSTEXPR_IF_DETECTION boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>\nget_max(const std::integral_constant<bool, true>&, const std::integral_constant<bool, true>&, const std::integral_constant<bool, true>&)\n{\n   // Bounded and signed, no allocator, can be constexpr.\n   using result_type = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>                                               ;\n   using ui_type = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MaxBits, MaxBits, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked>, ExpressionTemplates>;\n#ifdef BOOST_MP_NO_CONSTEXPR_DETECTION\n   static\n#else\n   constexpr\n#endif\n   const result_type                                                                                                                                                                          val = ~ui_type(0);\n   return val;\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>\nget_max(const std::integral_constant<bool, true>&, const std::integral_constant<bool, true>&, const std::integral_constant<bool, false>&)\n{\n   // Bounded and signed, has an allocator, never constexpr.\n   using result_type = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>                                               ;\n   using ui_type = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MaxBits, MaxBits, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked>, ExpressionTemplates>;\n   static const result_type                                                                                                                                                                          val = ~ui_type(0);\n   return val;\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_CXX14_CONSTEXPR_IF_DETECTION boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>\nget_max(const std::integral_constant<bool, true>&, const std::integral_constant<bool, false>&, const std::integral_constant<bool, true>&)\n{\n   // Bound and unsigned, no allocator so can be constexpr:\n   using result_type = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>                                                          ;\n   using ui_type = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, Allocator>, ExpressionTemplates>;\n#ifdef BOOST_MP_NO_CONSTEXPR_DETECTION\n   static\n#else\n   constexpr\n#endif\n   const result_type                                                                                                                                                                                     val = ~ui_type(0);\n   return val;\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>\nget_max(const std::integral_constant<bool, true>&, const std::integral_constant<bool, false>&, const std::integral_constant<bool, false>&)\n{\n   // Bound and unsigned, has an allocator so can never be constexpr:\n   using result_type = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>                                                          ;\n   using ui_type = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, Allocator>, ExpressionTemplates>;\n   static const result_type                                                                                                                                                                                     val = ~ui_type(0);\n   return val;\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates, bool has_allocator>\ninline boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>\nget_max(const std::integral_constant<bool, false>&, const std::integral_constant<bool, true>&, const std::integral_constant<bool, has_allocator>&)\n{\n   // Unbounded and signed.\n   // There is no maximum value, just return 0:\n   static const boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> val(0u);\n   return val;\n}\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates, bool has_allocator>\ninline boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>\nget_max(const std::integral_constant<bool, false>&, const std::integral_constant<bool, false>&, const std::integral_constant<bool, has_allocator>&)\n{\n   // Unbound and unsigned:\n   static const boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> val(0u);\n   return val;\n}\n\n} // namespace detail\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nclass numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >\n{\n   using backend_type = boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>;\n   using number_type = boost::multiprecision::number<backend_type, ExpressionTemplates>                      ;\n\n public:\n   static constexpr bool is_specialized = true;\n   //\n   // Largest and smallest numbers are bounded only by available memory, set\n   // to zero:\n   //\n   static BOOST_CXX14_CONSTEXPR_IF_DETECTION number_type(min)()\n   {\n      return detail::get_min<MinBits, MaxBits, SignType, Checked, Allocator, ExpressionTemplates>(boost::multiprecision::backends::is_fixed_precision<backend_type>(), boost::multiprecision::is_signed_number<backend_type>(), std::integral_constant<bool, std::is_void<Allocator>::value>());\n   }\n   static BOOST_CXX14_CONSTEXPR_IF_DETECTION number_type(max)()\n   {\n      return detail::get_max<MinBits, MaxBits, SignType, Checked, Allocator, ExpressionTemplates>(boost::multiprecision::backends::is_fixed_precision<backend_type>(), boost::multiprecision::is_signed_number<backend_type>(), std::integral_constant<bool, std::is_void<Allocator>::value>());\n   }\n   static BOOST_CXX14_CONSTEXPR_IF_DETECTION number_type          lowest() { return (min)(); }\n   static constexpr int  digits       = boost::multiprecision::backends::max_precision<backend_type>::value == SIZE_MAX ? INT_MAX : boost::multiprecision::backends::max_precision<backend_type>::value;\n   static constexpr int  digits10     = static_cast<int>(boost::multiprecision::detail::calc_digits10_s<static_cast<std::size_t>(digits)>::value);\n   static constexpr int  max_digits10 = static_cast<int>(boost::multiprecision::detail::calc_max_digits10_s<static_cast<std::size_t>(digits)>::value);\n   static constexpr bool is_signed    = boost::multiprecision::is_signed_number<backend_type>::value;\n   static constexpr bool is_integer   = true;\n   static constexpr bool is_exact     = true;\n   static constexpr int  radix        = 2;\n   static BOOST_CXX14_CONSTEXPR_IF_DETECTION number_type          epsilon() { return 0; }\n   static BOOST_CXX14_CONSTEXPR_IF_DETECTION number_type          round_error() { return 0; }\n   static constexpr int  min_exponent                  = 0;\n   static constexpr int  min_exponent10                = 0;\n   static constexpr int  max_exponent                  = 0;\n   static constexpr int  max_exponent10                = 0;\n   static constexpr bool has_infinity                  = false;\n   static constexpr bool has_quiet_NaN                 = false;\n   static constexpr bool has_signaling_NaN             = false;\n   static constexpr float_denorm_style has_denorm      = denorm_absent;\n   static constexpr bool               has_denorm_loss = false;\n   static BOOST_CXX14_CONSTEXPR_IF_DETECTION number_type                        infinity() { return 0; }\n   static BOOST_CXX14_CONSTEXPR_IF_DETECTION number_type                        quiet_NaN() { return 0; }\n   static BOOST_CXX14_CONSTEXPR_IF_DETECTION number_type                        signaling_NaN() { return 0; }\n   static BOOST_CXX14_CONSTEXPR_IF_DETECTION number_type                        denorm_min() { return 0; }\n   static constexpr bool               is_iec559       = false;\n   static constexpr bool               is_bounded      = boost::multiprecision::backends::is_fixed_precision<backend_type>::value;\n   static constexpr bool               is_modulo       = (boost::multiprecision::backends::is_fixed_precision<backend_type>::value && (Checked == boost::multiprecision::unchecked));\n   static constexpr bool               traps           = false;\n   static constexpr bool               tinyness_before = false;\n   static constexpr float_round_style round_style      = round_toward_zero;\n};\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::digits;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::digits10;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::max_digits10;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::is_signed;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::is_integer;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::is_exact;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::radix;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::min_exponent;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::min_exponent10;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::max_exponent;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::max_exponent10;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::has_infinity;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::has_quiet_NaN;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::has_signaling_NaN;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_denorm_style numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::has_denorm;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::has_denorm_loss;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::is_iec559;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::is_bounded;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::is_modulo;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::traps;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::tinyness_before;\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_round_style numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::round_style;\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n} // namespace std\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_int/literals.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2013 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_CPP_INT_LITERALS_HPP\n#define BOOST_MP_CPP_INT_LITERALS_HPP\n\n#include <boost/multiprecision/cpp_int/cpp_int_config.hpp>\n\nnamespace boost { namespace multiprecision {\n\nnamespace literals {\nnamespace detail {\n\ntemplate <char>\nstruct hex_value;\ntemplate <>\nstruct hex_value<'0'>\n{\n   static constexpr limb_type value = 0;\n};\ntemplate <>\nstruct hex_value<'1'>\n{\n   static constexpr limb_type value = 1;\n};\ntemplate <>\nstruct hex_value<'2'>\n{\n   static constexpr limb_type value = 2;\n};\ntemplate <>\nstruct hex_value<'3'>\n{\n   static constexpr limb_type value = 3;\n};\ntemplate <>\nstruct hex_value<'4'>\n{\n   static constexpr limb_type value = 4;\n};\ntemplate <>\nstruct hex_value<'5'>\n{\n   static constexpr limb_type value = 5;\n};\ntemplate <>\nstruct hex_value<'6'>\n{\n   static constexpr limb_type value = 6;\n};\ntemplate <>\nstruct hex_value<'7'>\n{\n   static constexpr limb_type value = 7;\n};\ntemplate <>\nstruct hex_value<'8'>\n{\n   static constexpr limb_type value = 8;\n};\ntemplate <>\nstruct hex_value<'9'>\n{\n   static constexpr limb_type value = 9;\n};\ntemplate <>\nstruct hex_value<'a'>\n{\n   static constexpr limb_type value = 10;\n};\ntemplate <>\nstruct hex_value<'b'>\n{\n   static constexpr limb_type value = 11;\n};\ntemplate <>\nstruct hex_value<'c'>\n{\n   static constexpr limb_type value = 12;\n};\ntemplate <>\nstruct hex_value<'d'>\n{\n   static constexpr limb_type value = 13;\n};\ntemplate <>\nstruct hex_value<'e'>\n{\n   static constexpr limb_type value = 14;\n};\ntemplate <>\nstruct hex_value<'f'>\n{\n   static constexpr limb_type value = 15;\n};\ntemplate <>\nstruct hex_value<'A'>\n{\n   static constexpr limb_type value = 10;\n};\ntemplate <>\nstruct hex_value<'B'>\n{\n   static constexpr limb_type value = 11;\n};\ntemplate <>\nstruct hex_value<'C'>\n{\n   static constexpr limb_type value = 12;\n};\ntemplate <>\nstruct hex_value<'D'>\n{\n   static constexpr limb_type value = 13;\n};\ntemplate <>\nstruct hex_value<'E'>\n{\n   static constexpr limb_type value = 14;\n};\ntemplate <>\nstruct hex_value<'F'>\n{\n   static constexpr limb_type value = 15;\n};\n\ntemplate <class Pack, limb_type value>\nstruct combine_value_to_pack;\ntemplate <limb_type first, limb_type... ARGS, limb_type value>\nstruct combine_value_to_pack<value_pack<first, ARGS...>, value>\n{\n   using type = value_pack<first | value, ARGS...>;\n};\n\ntemplate <char NextChar, char... CHARS>\nstruct pack_values\n{\n   static constexpr std::size_t chars_per_limb = sizeof(limb_type) * CHAR_BIT / 4;\n   static constexpr std::size_t shift          = ((sizeof...(CHARS)) % chars_per_limb) * 4;\n   static constexpr limb_type value_to_add  = shift ? hex_value<NextChar>::value << shift : hex_value<NextChar>::value;\n\n   using recursive_packed_type = typename pack_values<CHARS...>::type                         ;\n   using pack_type = typename std::conditional<shift == 0,\n                                     typename recursive_packed_type::next_type,\n                                     recursive_packed_type>::type;\n   using type = typename combine_value_to_pack<pack_type, value_to_add>::type;\n};\ntemplate <char NextChar>\nstruct pack_values<NextChar>\n{\n   static constexpr limb_type value_to_add = hex_value<NextChar>::value;\n\n   using type = value_pack<value_to_add>;\n};\n\ntemplate <class T>\nstruct strip_leading_zeros_from_pack;\ntemplate <limb_type... PACK>\nstruct strip_leading_zeros_from_pack<value_pack<PACK...> >\n{\n   using type = value_pack<PACK...>;\n};\ntemplate <limb_type... PACK>\nstruct strip_leading_zeros_from_pack<value_pack<0u, PACK...> >\n{\n   using type = typename strip_leading_zeros_from_pack<value_pack<PACK...> >::type;\n};\n\ntemplate <limb_type v, class PACK>\nstruct append_value_to_pack;\ntemplate <limb_type v, limb_type... PACK>\nstruct append_value_to_pack<v, value_pack<PACK...> >\n{\n   using type = value_pack<PACK..., v>;\n};\n\ntemplate <class T>\nstruct reverse_value_pack;\ntemplate <limb_type v, limb_type... VALUES>\nstruct reverse_value_pack<value_pack<v, VALUES...> >\n{\n   using lead_values = typename reverse_value_pack<value_pack<VALUES...> >::type;\n   using type = typename append_value_to_pack<v, lead_values>::type      ;\n};\ntemplate <limb_type v>\nstruct reverse_value_pack<value_pack<v> >\n{\n   using type = value_pack<v>;\n};\ntemplate <>\nstruct reverse_value_pack<value_pack<> >\n{\n   using type = value_pack<>;\n};\n\ntemplate <char l1, char l2, char... STR>\nstruct make_packed_value_from_str\n{\n   static_assert(l1 == '0', \"Multi-precision integer literals must be in hexadecimal notation.\");\n   static_assert((l2 == 'X') || (l2 == 'x'), \"Multi-precision integer literals must be in hexadecimal notation.\");\n   using packed_type = typename pack_values<STR...>::type                       ;\n   using stripped_type = typename strip_leading_zeros_from_pack<packed_type>::type;\n   using type = typename reverse_value_pack<stripped_type>::type         ;\n};\n\ntemplate <class Pack, class B>\nstruct make_backend_from_pack\n{\n   static constexpr Pack p  = {};\n   static constexpr B value = p;\n};\n\ntemplate <class Pack, class B>\nconstexpr B make_backend_from_pack<Pack, B>::value;\n\ntemplate <unsigned Digits>\nstruct signed_cpp_int_literal_result_type\n{\n   static constexpr unsigned                                                                               bits = Digits * 4;\n   using backend_type = boost::multiprecision::backends::cpp_int_backend<bits, bits, signed_magnitude, unchecked, void>;\n   using number_type = number<backend_type, et_off>                                                                   ;\n};\n\ntemplate <unsigned Digits>\nstruct unsigned_cpp_int_literal_result_type\n{\n   static constexpr unsigned                                                                                 bits = Digits * 4;\n   using backend_type = boost::multiprecision::backends::cpp_int_backend<bits, bits, unsigned_magnitude, unchecked, void>;\n   using number_type = number<backend_type, et_off>                                                                     ;\n};\n\n} // namespace detail\n\ntemplate <char... STR>\nconstexpr typename boost::multiprecision::literals::detail::signed_cpp_int_literal_result_type<static_cast<unsigned>((sizeof...(STR)) - 2u)>::number_type operator\"\" _cppi()\n{\n   using pt = typename boost::multiprecision::literals::detail::make_packed_value_from_str<STR...>::type;\n   return boost::multiprecision::literals::detail::make_backend_from_pack<pt, typename boost::multiprecision::literals::detail::signed_cpp_int_literal_result_type<static_cast<unsigned>((sizeof...(STR)) - 2u)>::backend_type>::value;\n}\n\ntemplate <char... STR>\nconstexpr typename boost::multiprecision::literals::detail::unsigned_cpp_int_literal_result_type<static_cast<unsigned>((sizeof...(STR)) - 2u)>::number_type operator\"\" _cppui()\n{\n   using pt = typename boost::multiprecision::literals::detail::make_packed_value_from_str<STR...>::type;\n   return boost::multiprecision::literals::detail::make_backend_from_pack<pt, typename boost::multiprecision::literals::detail::unsigned_cpp_int_literal_result_type<static_cast<unsigned>((sizeof...(STR)) - 2u)>::backend_type>::value;\n}\n\n#define BOOST_MP_DEFINE_SIZED_CPP_INT_LITERAL(Bits)                                                                                                                                                                                \\\n   template <char... STR>                                                                                                                                                                                                          \\\n   constexpr boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<Bits, Bits, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void> > operator\"\" BOOST_JOIN(_cppi, Bits)()    \\\n   {                                                                                                                                                                                                                               \\\n      using pt = typename boost::multiprecision::literals::detail::make_packed_value_from_str<STR...>::type;                                                                                                                       \\\n      return boost::multiprecision::literals::detail::make_backend_from_pack<                                                                                                                                                      \\\n          pt,                                                                                                                                                                                                                      \\\n          boost::multiprecision::backends::cpp_int_backend<Bits, Bits, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void> >::value;                                                                  \\\n   }                                                                                                                                                                                                                               \\\n   template <char... STR>                                                                                                                                                                                                          \\\n   constexpr boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<Bits, Bits, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void> > operator\"\" BOOST_JOIN(_cppui, Bits)() \\\n   {                                                                                                                                                                                                                               \\\n      using pt = typename boost::multiprecision::literals::detail::make_packed_value_from_str<STR...>::type;                                                                                                                       \\\n      return boost::multiprecision::literals::detail::make_backend_from_pack<                                                                                                                                                      \\\n          pt,                                                                                                                                                                                                                      \\\n          boost::multiprecision::backends::cpp_int_backend<Bits, Bits, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void> >::value;                                                                \\\n   }\n\nBOOST_MP_DEFINE_SIZED_CPP_INT_LITERAL(128)\nBOOST_MP_DEFINE_SIZED_CPP_INT_LITERAL(256)\nBOOST_MP_DEFINE_SIZED_CPP_INT_LITERAL(512)\nBOOST_MP_DEFINE_SIZED_CPP_INT_LITERAL(1024)\n\n} // namespace literals\n\n//\n// Overload unary minus operator for constexpr use:\n//\ntemplate <std::size_t MinBits, cpp_int_check_type Checked>\nconstexpr number<cpp_int_backend<MinBits, MinBits, signed_magnitude, Checked, void>, et_off>\noperator-(const number<cpp_int_backend<MinBits, MinBits, signed_magnitude, Checked, void>, et_off>& a)\n{\n   return cpp_int_backend<MinBits, MinBits, signed_magnitude, Checked, void>(a.backend(), boost::multiprecision::literals::detail::make_negate_tag());\n}\ntemplate <std::size_t MinBits, cpp_int_check_type Checked>\nconstexpr number<cpp_int_backend<MinBits, MinBits, signed_magnitude, Checked, void>, et_off>\noperator-(number<cpp_int_backend<MinBits, MinBits, signed_magnitude, Checked, void>, et_off>&& a)\n{\n   return cpp_int_backend<MinBits, MinBits, signed_magnitude, Checked, void>(static_cast<const number<cpp_int_backend<MinBits, MinBits, signed_magnitude, Checked, void>, et_off>&>(a).backend(), boost::multiprecision::literals::detail::make_negate_tag());\n}\n\n}} // namespace boost::multiprecision\n\n#endif // BOOST_MP_CPP_INT_CORE_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_int/misc.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012-2020 John Maddock.\n//  Copyright 2020 Madhur Chauhan.\n//  Copyright 2021 Matt Borland.\n//  Distributed under the Boost Software License, Version 1.0.\n//  (See accompanying file LICENSE_1_0.txt or copy at\n//   https://www.boost.org/LICENSE_1_0.txt)\n//\n// Comparison operators for cpp_int_backend:\n//\n#ifndef BOOST_MP_CPP_INT_MISC_HPP\n#define BOOST_MP_CPP_INT_MISC_HPP\n\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/detail/number_base.hpp>\n#include <boost/multiprecision/cpp_int/cpp_int_config.hpp>\n#include <boost/multiprecision/detail/float128_functions.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n#include <boost/multiprecision/detail/constexpr.hpp>\n#include <boost/multiprecision/detail/bitscan.hpp> // lsb etc\n#include <boost/multiprecision/detail/hash.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n#include <numeric> // std::gcd\n#include <type_traits>\n#include <stdexcept>\n#include <cmath>\n\n#ifndef BOOST_MP_STANDALONE\n#include <boost/integer/common_factor_rt.hpp>\n#endif\n\n#ifdef BOOST_MP_MATH_AVAILABLE\n#include <boost/math/special_functions/next.hpp>\n#endif\n\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4702)\n#pragma warning(disable : 4127) // conditional expression is constant\n#pragma warning(disable : 4146) // unary minus operator applied to unsigned type, result still unsigned\n#endif\n\n// Forward decleration of gcd and lcm functions\nnamespace boost { namespace multiprecision { namespace detail {\n\ntemplate <typename T>\ninline BOOST_CXX14_CONSTEXPR T constexpr_gcd(T a, T b) noexcept;\n\ntemplate <typename T>\ninline BOOST_CXX14_CONSTEXPR T constexpr_lcm(T a, T b) noexcept;\n\n}}} // namespace boost::multiprecision::detail\n\nnamespace boost { namespace multiprecision { namespace backends {\n\ntemplate <class T, bool has_limits = std::numeric_limits<T>::is_specialized>\nstruct numeric_limits_workaround : public std::numeric_limits<T>\n{\n};\ntemplate <class R>\nstruct numeric_limits_workaround<R, false>\n{\n   static constexpr unsigned digits = ~static_cast<R>(0) < 0 ? sizeof(R) * CHAR_BIT - 1 : sizeof(R) * CHAR_BIT;\n   static constexpr R (min)(){ return (static_cast<R>(-1) < 0) ? static_cast<R>(1) << digits : 0; }\n   static constexpr R (max)() { return (static_cast<R>(-1) < 0) ? ~(static_cast<R>(1) << digits) : ~static_cast<R>(0); }\n};\n\ntemplate <class R, class CppInt>\nBOOST_MP_CXX14_CONSTEXPR void check_in_range(const CppInt& val, const std::integral_constant<int, checked>&)\n{\n   using cast_type = typename boost::multiprecision::detail::canonical<R, CppInt>::type;\n\n   if (val.sign())\n   {\n      BOOST_IF_CONSTEXPR (boost::multiprecision::detail::is_signed<R>::value == false)\n         BOOST_MP_THROW_EXCEPTION(std::range_error(\"Attempt to assign a negative value to an unsigned type.\"));\n      if (val.compare(static_cast<cast_type>((numeric_limits_workaround<R>::min)())) < 0)\n         BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Could not convert to the target type - -value is out of range.\"));\n   }\n   else\n   {\n      if (val.compare(static_cast<cast_type>((numeric_limits_workaround<R>::max)())) > 0)\n         BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Could not convert to the target type - -value is out of range.\"));\n   }\n}\ntemplate <class R, class CppInt>\ninline BOOST_MP_CXX14_CONSTEXPR void check_in_range(const CppInt& /*val*/, const std::integral_constant<int, unchecked>&) noexcept {}\n\ninline BOOST_MP_CXX14_CONSTEXPR void check_is_negative(const std::integral_constant<bool, true>&) noexcept {}\ninline void                          check_is_negative(const std::integral_constant<bool, false>&)\n{\n   BOOST_MP_THROW_EXCEPTION(std::range_error(\"Attempt to assign a negative value to an unsigned type.\"));\n}\n\ntemplate <class Integer>\ninline BOOST_MP_CXX14_CONSTEXPR Integer negate_integer(Integer i, const std::integral_constant<bool, true>&) noexcept\n{\n   return -i;\n}\ntemplate <class Integer>\ninline BOOST_MP_CXX14_CONSTEXPR Integer negate_integer(Integer i, const std::integral_constant<bool, false>&) noexcept\n{\n   return ~(i - 1);\n}\n\ntemplate <class R, std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<R>::value && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, void>::type\neval_convert_to(R* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& backend)\n{\n   using checked_type = std::integral_constant<int, Checked1>;\n   check_in_range<R>(backend, checked_type());\n\n   BOOST_IF_CONSTEXPR(numeric_limits_workaround<R>::digits < cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits)\n   {\n      if ((backend.sign() && boost::multiprecision::detail::is_signed<R>::value && boost::multiprecision::detail::is_integral<R>::value) && (1 + static_cast<boost::multiprecision::limb_type>((std::numeric_limits<R>::max)()) <= backend.limbs()[0]))\n      {\n         *result = (numeric_limits_workaround<R>::min)();\n         return;\n      }\n      else if (boost::multiprecision::detail::is_signed<R>::value && boost::multiprecision::detail::is_integral<R>::value && !backend.sign() && static_cast<boost::multiprecision::limb_type>((std::numeric_limits<R>::max)()) <= backend.limbs()[0])\n      {\n         *result = (numeric_limits_workaround<R>::max)();\n         return;\n      }\n      else\n         *result = static_cast<R>(backend.limbs()[0]);\n   }\n   else\n      *result = static_cast<R>(backend.limbs()[0]);\n\n   BOOST_IF_CONSTEXPR(numeric_limits_workaround<R>::digits > cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits)\n   {\n     std::size_t shift = cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;\n     std::size_t i     = 1u;\n\n      while ((i < backend.size()) && (shift < static_cast<unsigned>(numeric_limits_workaround<R>::digits - cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits)))\n      {\n         *result += static_cast<R>(backend.limbs()[i]) << shift;\n         shift += cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;\n         ++i;\n      }\n      //\n      // We have one more limb to extract, but may not need all the bits, so treat this as a special case:\n      //\n      if (i < backend.size())\n      {\n         const limb_type mask                 = ((numeric_limits_workaround<R>::digits - shift) == cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits) ? ~static_cast<limb_type>(0) : static_cast<limb_type>(static_cast<limb_type>(1u) << (numeric_limits_workaround<R>::digits - shift)) - 1u;\n         const limb_type limb_at_index_masked = static_cast<limb_type>(backend.limbs()[i] & mask);\n\n         *result = static_cast<R>(*result + static_cast<R>(static_cast<R>(limb_at_index_masked) << shift));\n\n         if ((backend.limbs()[i] & static_cast<limb_type>(~mask)) || (i + 1 < backend.size()))\n         {\n            // Overflow:\n            if (backend.sign())\n            {\n               check_is_negative(boost::multiprecision::detail::is_signed<R>());\n               *result = (numeric_limits_workaround<R>::min)();\n            }\n            else if (boost::multiprecision::detail::is_signed<R>::value)\n               *result = (numeric_limits_workaround<R>::max)();\n            return;\n         }\n      }\n   }\n   else if (backend.size() > 1)\n   {\n      // Overflow:\n      if (backend.sign())\n      {\n         check_is_negative(boost::multiprecision::detail::is_signed<R>());\n         *result = (numeric_limits_workaround<R>::min)();\n      }\n      else if (boost::multiprecision::detail::is_signed<R>::value)\n         *result = (numeric_limits_workaround<R>::max)();\n      return;\n   }\n   if (backend.sign())\n   {\n      check_is_negative(std::integral_constant<bool, boost::multiprecision::detail::is_signed<R>::value && boost::multiprecision::detail::is_integral<R>::value>());\n      *result = negate_integer(*result, std::integral_constant<bool, boost::multiprecision::detail::is_signed<R>::value && boost::multiprecision::detail::is_integral<R>::value>());\n   }\n}\n\ntemplate <class R, std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_floating_point<R>::value && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, void>::type\neval_convert_to(R* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& backend) noexcept(boost::multiprecision::detail::is_arithmetic<R>::value)\n{\n   BOOST_MP_FLOAT128_USING using std::ldexp;\n   if (eval_is_zero(backend))\n   {\n      *result = 0.0f;\n      return;\n   }\n\n#ifdef BOOST_HAS_FLOAT128\n   std::ptrdiff_t bits_to_keep = static_cast<std::ptrdiff_t>(std::is_same<R, float128_type>::value ? 113 : std::numeric_limits<R>::digits);\n#else\n   std::ptrdiff_t bits_to_keep = static_cast<std::ptrdiff_t>(std::numeric_limits<R>::digits);\n#endif\n   std::ptrdiff_t bits = static_cast<std::ptrdiff_t>(eval_msb_imp(backend) + 1);\n\n   if (bits > bits_to_keep)\n   {\n      // Extract the bits we need, and then manually round the result:\n      *result = 0.0f;\n      typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::const_limb_pointer p = backend.limbs();\n      limb_type mask = ~static_cast<limb_type>(0u);\n      std::size_t index = backend.size() - 1;\n      std::size_t shift = cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits * index;\n      while (bits_to_keep > 0)\n      {\n         if (bits_to_keep < (std::ptrdiff_t)cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits)\n         {\n            if(index != backend.size() - 1)\n            {\n               const std::ptrdiff_t left_shift_amount = static_cast<std::ptrdiff_t>(static_cast<std::ptrdiff_t>(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits) - bits_to_keep);\n\n               mask <<= left_shift_amount;\n            }\n            else\n            {\n               std::ptrdiff_t bits_in_first_limb = static_cast<std::ptrdiff_t>(bits % static_cast<std::ptrdiff_t>(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits));\n               if (bits_in_first_limb == 0)\n                  bits_in_first_limb = cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;\n               if (bits_in_first_limb > bits_to_keep)\n                  mask <<= bits_in_first_limb - bits_to_keep;\n            }\n         }\n         *result += ldexp(static_cast<R>(p[index] & mask), static_cast<int>(shift));\n         shift -= cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;\n\n         const bool bits_has_non_zero_remainder = (bits % static_cast<std::ptrdiff_t>(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits) != 0);\n\n         bits_to_keep -= ((index == backend.size() - 1) && bits_has_non_zero_remainder)\n            ? bits % static_cast<std::ptrdiff_t>(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits)\n            :        static_cast<std::ptrdiff_t>(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits);\n         --index;\n      }\n      // Perform rounding:\n      bits -= 1 + std::numeric_limits<R>::digits;\n      if (eval_bit_test(backend, static_cast<unsigned>(bits)))\n      {\n         if ((eval_lsb_imp(backend) < static_cast<std::size_t>(bits)) || eval_bit_test(backend, static_cast<std::size_t>(bits + 1)))\n         {\n            #ifdef BOOST_MP_MATH_AVAILABLE\n            *result = boost::math::float_next(*result);\n            #else\n            using std::nextafter; BOOST_MP_FLOAT128_USING\n            *result = nextafter(*result, *result * 2);\n            #endif\n         }\n      }\n   }\n   else\n   {\n      typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::const_limb_pointer p = backend.limbs();\n      std::size_t shift = cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;\n      *result = static_cast<R>(*p);\n      for (std::size_t i = 1; i < backend.size(); ++i)\n      {\n         *result += static_cast<R>(ldexp(static_cast<long double>(p[i]), static_cast<int>(shift)));\n         shift += cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;\n      }\n   }\n   if (backend.sign())\n      *result = -*result;\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, bool>::type\neval_is_zero(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val) noexcept\n{\n   return (val.size() == 1) && (val.limbs()[0] == 0);\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, int>::type\neval_get_sign(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val) noexcept\n{\n   return eval_is_zero(val) ? 0 : val.sign() ? -1 : 1;\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_abs(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   result = val;\n   result.sign(false);\n}\n\n//\n// Get the location of the least-significant-bit:\n//\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, std::size_t>::type\neval_lsb_imp(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a)\n{\n   //\n   // Find the index of the least significant limb that is non-zero:\n   //\n   std::size_t index = 0;\n   while (!a.limbs()[index] && (index < a.size()))\n      ++index;\n   //\n   // Find the index of the least significant bit within that limb:\n   //\n   std::size_t result = boost::multiprecision::detail::find_lsb(a.limbs()[index]);\n\n   return result + index * cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, std::size_t>::type\neval_lsb(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a)\n{\n   using default_ops::eval_get_sign;\n   if (eval_get_sign(a) == 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::domain_error(\"No bits were set in the operand.\"));\n   }\n   if (a.sign())\n   {\n      BOOST_MP_THROW_EXCEPTION(std::domain_error(\"Testing individual bits in negative values is not supported - results are undefined.\"));\n   }\n   return eval_lsb_imp(a);\n}\n\n//\n// Get the location of the most-significant-bit:\n//\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, std::size_t>::type\neval_msb_imp(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a)\n{\n   //\n   // Find the index of the most significant bit that is non-zero:\n   //\n   return (a.size() - 1) * cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits + boost::multiprecision::detail::find_msb(a.limbs()[a.size() - 1]);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, std::size_t>::type\neval_msb(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a)\n{\n   using default_ops::eval_get_sign;\n   if (eval_get_sign(a) == 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::domain_error(\"No bits were set in the operand.\"));\n   }\n   if (a.sign())\n   {\n      BOOST_MP_THROW_EXCEPTION(std::domain_error(\"Testing individual bits in negative values is not supported - results are undefined.\"));\n   }\n   return eval_msb_imp(a);\n}\n\n#ifdef BOOST_GCC\n//\n// We really shouldn't need to be disabling this warning, but it really does appear to be\n// spurious.  The warning appears only when in release mode, and asserts are on.\n//\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Warray-bounds\"\n#endif\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, bool>::type\neval_bit_test(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val, std::size_t index) noexcept\n{\n   std::size_t  offset = index / cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;\n   std::size_t  shift  = index % cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;\n   limb_type mask   = shift ? limb_type(1u) << shift : limb_type(1u);\n   if (offset >= val.size())\n      return false;\n   return val.limbs()[offset] & mask ? true : false;\n}\n\n#ifdef BOOST_GCC\n#pragma GCC diagnostic pop\n#endif\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_bit_set(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val, std::size_t index)\n{\n   std::size_t  offset = index / cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;\n   std::size_t  shift  = index % cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;\n   limb_type mask   = shift ? limb_type(1u) << shift : limb_type(1u);\n   if (offset >= val.size())\n   {\n      std::size_t os = val.size();\n      val.resize(offset + 1, offset + 1);\n      if (offset >= val.size())\n         return; // fixed precision overflow\n      for (std::size_t i = os; i <= offset; ++i)\n         val.limbs()[i] = 0;\n   }\n   val.limbs()[offset] |= mask;\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_bit_unset(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val, std::size_t index) noexcept\n{\n   std::size_t  offset = index / cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;\n   std::size_t  shift  = index % cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;\n   limb_type mask   = shift ? limb_type(1u) << shift : limb_type(1u);\n   if (offset >= val.size())\n      return;\n   val.limbs()[offset] &= ~mask;\n   val.normalize();\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_bit_flip(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val, std::size_t index)\n{\n   std::size_t  offset = index / cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;\n   std::size_t  shift  = index % cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;\n   limb_type mask   = shift ? limb_type(1u) << shift : limb_type(1u);\n   if (offset >= val.size())\n   {\n      std::size_t os = val.size();\n      val.resize(offset + 1, offset + 1);\n      if (offset >= val.size())\n         return; // fixed precision overflow\n      for (std::size_t i = os; i <= offset; ++i)\n         val.limbs()[i] = 0;\n   }\n   val.limbs()[offset] ^= mask;\n   val.normalize();\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_qr(\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& x,\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& y,\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       q,\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       r) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   divide_unsigned_helper(&q, x, y, r);\n   q.sign(x.sign() != y.sign());\n   r.sign(x.sign());\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_qr(\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& x,\n    limb_type                                                                   y,\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       q,\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       r) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   divide_unsigned_helper(&q, x, y, r);\n   q.sign(x.sign());\n   r.sign(x.sign());\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<U>::value>::type eval_qr(\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& x,\n    U                                                                           y,\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       q,\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       r) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   using default_ops::eval_qr;\n   cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> t;\n   t = y;\n   eval_qr(x, t, q, r);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class Integer>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_unsigned<Integer>::value && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, Integer>::type\neval_integer_modulus(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a, Integer mod)\n{\n   BOOST_IF_CONSTEXPR (sizeof(Integer) <= sizeof(limb_type))\n   {\n      if (mod <= (std::numeric_limits<limb_type>::max)())\n      {\n         const std::ptrdiff_t n = a.size();\n         const double_limb_type two_n_mod = static_cast<limb_type>(1u) + (~static_cast<limb_type>(0u) - mod) % mod;\n         limb_type              res = a.limbs()[n - 1] % mod;\n\n         for (std::ptrdiff_t i = n - 2; i >= 0; --i)\n            res = static_cast<limb_type>((res * two_n_mod + a.limbs()[i]) % mod);\n         return res;\n      }\n      else\n         return default_ops::eval_integer_modulus(a, mod);\n   }\n   else\n   {\n      return default_ops::eval_integer_modulus(a, mod);\n   }\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class Integer>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_signed<Integer>::value && boost::multiprecision::detail::is_integral<Integer>::value && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, Integer>::type\neval_integer_modulus(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& x, Integer val)\n{\n   return eval_integer_modulus(x, boost::multiprecision::detail::unsigned_abs(val));\n}\n\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR limb_type eval_gcd(limb_type u, limb_type v)\n{\n   // boundary cases\n   if (!u || !v)\n      return u | v;\n#if (defined(__cpp_lib_gcd_lcm) && (__cpp_lib_gcd_lcm >= 201606L))\n   return std::gcd(u, v);\n#else\n   std::size_t shift = boost::multiprecision::detail::find_lsb(u | v);\n   u >>= boost::multiprecision::detail::find_lsb(u);\n   do\n   {\n      v >>= boost::multiprecision::detail::find_lsb(v);\n      if (u > v)\n         std_constexpr::swap(u, v);\n      v -= u;\n   } while (v);\n   return u << shift;\n#endif\n}\n\ninline BOOST_MP_CXX14_CONSTEXPR double_limb_type eval_gcd(double_limb_type u, double_limb_type v)\n{\n#if (defined(__cpp_lib_gcd_lcm) && (__cpp_lib_gcd_lcm >= 201606L)) && (!defined(BOOST_HAS_INT128) || !defined(__STRICT_ANSI__))\n   return std::gcd(u, v);\n#else\n   if (u == 0)\n      return v;\n\n   std::size_t shift = boost::multiprecision::detail::find_lsb(u | v);\n   u >>= boost::multiprecision::detail::find_lsb(u);\n   do\n   {\n      v >>= boost::multiprecision::detail::find_lsb(v);\n      if (u > v)\n         std_constexpr::swap(u, v);\n      v -= u;\n   } while (v);\n   return u << shift;\n#endif\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_gcd(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a,\n    limb_type                                                                   b)\n{\n   int s = eval_get_sign(a);\n   if (!b || !s)\n   {\n      result = a;\n      *result.limbs() |= b;\n   }\n   else\n   {\n      eval_modulus(result, a, b);\n      limb_type& res = *result.limbs();\n      res = eval_gcd(res, b);\n   }\n   result.sign(false);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_gcd(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a,\n    double_limb_type                                                            b)\n{\n   int s = eval_get_sign(a);\n   if (!b || !s)\n   {\n      if (!s)\n         result = b;\n      else\n         result = a;\n      return;\n   }\n   double_limb_type res = 0;\n   if(a.sign() == 0)\n      res = eval_integer_modulus(a, b);\n   else\n   {\n      cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> t(a);\n      t.negate();\n      res = eval_integer_modulus(t, b);\n   }\n   res            = eval_gcd(res, b);\n   result = res;\n   result.sign(false);\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_gcd(\n   cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,\n   const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a,\n   signed_double_limb_type                                                     v)\n{\n   eval_gcd(result, a, static_cast<double_limb_type>(v < 0 ? -v : v));\n}\n//\n// These 2 overloads take care of gcd against an (unsigned) short etc:\n//\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class Integer>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_unsigned<Integer>::value && (sizeof(Integer) <= sizeof(limb_type)) && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_gcd(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a,\n    const Integer&                                                              v)\n{\n   eval_gcd(result, a, static_cast<limb_type>(v));\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class Integer>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_signed<Integer>::value && boost::multiprecision::detail::is_integral<Integer>::value && (sizeof(Integer) <= sizeof(limb_type)) && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_gcd(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a,\n    const Integer&                                                              v)\n{\n   eval_gcd(result, a, static_cast<limb_type>(v < 0 ? -v : v));\n}\n//\n// What follows is Lehmer's GCD algorithm:\n// Essentially this uses the leading digit(s) of U and V\n// only to run a \"simulated\" Euclid algorithm.  It stops\n// when the calculated quotient differs from what would have been\n// the true quotient.  At that point the cosequences are used to\n// calculate the new U and V.  A nice lucid description appears\n// in \"An Analysis of Lehmer's Euclidean GCD Algorithm\",\n// by Jonathan Sorenson.  https://www.researchgate.net/publication/2424634_An_Analysis_of_Lehmer%27s_Euclidean_GCD_Algorithm\n// DOI: 10.1145/220346.220378.\n//\n// There are two versions of this algorithm here, and both are \"double digit\"\n// variations: which is to say if there are k bits per limb, then they extract\n// 2k bits into a double_limb_type and then run the algorithm on that.  The first\n// version is a straightforward version of the algorithm, and is designed for\n// situations where double_limb_type is a native integer (for example where\n// limb_type is a 32-bit integer on a 64-bit machine).  For 32-bit limbs it\n// reduces the size of U by about 30 bits per call.  The second is a more complex\n// version for situations where double_limb_type is a synthetic type: for example\n// __int128.  For 64 bit limbs it reduces the size of U by about 62 bits per call.\n//\n// The complexity of the algorithm given by Sorenson is roughly O(ln^2(N)) for\n// two N bit numbers.\n//\n// The original double-digit version of the algorithm is described in:\n// \n// \"A Double Digit Lehmer-Euclid Algorithm for Finding the GCD of Long Integers\",\n// Tudor Jebelean, J Symbolic Computation, 1995 (19), 145.\n//\n#ifndef BOOST_HAS_INT128\n//\n// When double_limb_type is a native integer type then we should just use it and not worry about the consequences.\n// This can eliminate approximately a full limb with each call.\n//\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class Storage>\nvoid eval_gcd_lehmer(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& U, cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& V, std::size_t lu, Storage& storage)\n{\n   //\n   // Extract the leading 2 * bits_per_limb bits from U and V:\n   //\n   std::size_t         h = lu % bits_per_limb;\n   double_limb_type u = (static_cast<double_limb_type>((U.limbs()[U.size() - 1])) << bits_per_limb) | U.limbs()[U.size() - 2];\n   double_limb_type v = (static_cast<double_limb_type>((V.size() < U.size() ? 0 : V.limbs()[V.size() - 1])) << bits_per_limb) | V.limbs()[U.size() - 2];\n   if (h)\n   {\n      u <<= bits_per_limb - h;\n      u |= U.limbs()[U.size() - 3] >> h;\n      v <<= bits_per_limb - h;\n      v |= V.limbs()[U.size() - 3] >> h;\n   }\n   //\n   // Co-sequences x an y: we need only the last 3 values of these,\n   // the first 2 values are known correct, the third gets checked\n   // in each loop operation, and we terminate when they go wrong.\n   //\n   // x[i+0] is positive for even i.\n   // y[i+0] is positive for odd i.\n   //\n   // However we track only absolute values here:\n   //\n   double_limb_type x[3] = {1, 0};\n   double_limb_type y[3] = {0, 1};\n   std::size_t         i    = 0;\n\n#ifdef BOOST_MP_GCD_DEBUG\n   cpp_int UU, VV;\n   UU = U;\n   VV = V;\n#endif\n\n   while (true)\n   {\n      double_limb_type q  = u / v;\n      x[2]                = x[0] + q * x[1];\n      y[2]                = y[0] + q * y[1];\n      double_limb_type tu = u;\n      u                   = v;\n      v                   = tu - q * v;\n      ++i;\n      //\n      // We must make sure that y[2] occupies a single limb otherwise\n      // the multiprecision multiplications below would be much more expensive.\n      // This can sometimes lose us one iteration, but is worth it for improved\n      // calculation efficiency.\n      //\n      if (y[2] >> bits_per_limb)\n         break;\n      //\n      // These are Jebelean's exact termination conditions:\n      //\n      if ((i & 1u) == 0)\n      {\n         BOOST_MP_ASSERT(u > v);\n         if ((v < x[2]) || ((u - v) < (y[2] + y[1])))\n            break;\n      }\n      else\n      {\n         BOOST_MP_ASSERT(u > v);\n         if ((v < y[2]) || ((u - v) < (x[2] + x[1])))\n            break;\n      }\n#ifdef BOOST_MP_GCD_DEBUG\n      BOOST_MP_ASSERT(q == UU / VV);\n      UU %= VV;\n      UU.swap(VV);\n#endif\n      x[0] = x[1];\n      x[1] = x[2];\n      y[0] = y[1];\n      y[1] = y[2];\n   }\n   if (i == 1)\n   {\n      // No change to U and V we've stalled!\n      cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> t;\n      eval_modulus(t, U, V);\n      U.swap(V);\n      V.swap(t);\n      return;\n   }\n   //\n   // Update U and V.\n   // We have:\n   //\n   // U = x[0]U + y[0]V and\n   // V = x[1]U + y[1]V.\n   //\n   // But since we track only absolute values of x and y\n   // we have to take account of the implied signs and perform\n   // the appropriate subtraction depending on the whether i is\n   // even or odd:\n   //\n   std::size_t                                                             ts = U.size() + 1;\n   cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> t1(storage, ts), t2(storage, ts), t3(storage, ts);\n   eval_multiply(t1, U, static_cast<limb_type>(x[0]));\n   eval_multiply(t2, V, static_cast<limb_type>(y[0]));\n   eval_multiply(t3, U, static_cast<limb_type>(x[1]));\n   if ((i & 1u) == 0)\n   {\n      if (x[0] == 0)\n         U = t2;\n      else\n      {\n         BOOST_MP_ASSERT(t2.compare(t1) >= 0);\n         eval_subtract(U, t2, t1);\n         BOOST_MP_ASSERT(U.sign() == false);\n      }\n   }\n   else\n   {\n      BOOST_MP_ASSERT(t1.compare(t2) >= 0);\n      eval_subtract(U, t1, t2);\n      BOOST_MP_ASSERT(U.sign() == false);\n   }\n   eval_multiply(t2, V, static_cast<limb_type>(y[1]));\n   if (i & 1u)\n   {\n      if (x[1] == 0)\n         V = t2;\n      else\n      {\n         BOOST_MP_ASSERT(t2.compare(t3) >= 0);\n         eval_subtract(V, t2, t3);\n         BOOST_MP_ASSERT(V.sign() == false);\n      }\n   }\n   else\n   {\n      BOOST_MP_ASSERT(t3.compare(t2) >= 0);\n      eval_subtract(V, t3, t2);\n      BOOST_MP_ASSERT(V.sign() == false);\n   }\n   BOOST_MP_ASSERT(U.compare(V) >= 0);\n   BOOST_MP_ASSERT(lu > eval_msb(U));\n#ifdef BOOST_MP_GCD_DEBUG\n\n   BOOST_MP_ASSERT(UU == U);\n   BOOST_MP_ASSERT(VV == V);\n\n   extern std::size_t total_lehmer_gcd_calls;\n   extern std::size_t total_lehmer_gcd_bits_saved;\n   extern std::size_t total_lehmer_gcd_cycles;\n\n   ++total_lehmer_gcd_calls;\n   total_lehmer_gcd_bits_saved += lu - eval_msb(U);\n   total_lehmer_gcd_cycles += i;\n#endif\n   if (lu < 2048)\n   {\n      //\n      // Since we have stripped all common powers of 2 from U and V at the start\n      // if either are even at this point, we can remove stray powers of 2 now.\n      // Note that it is not possible for *both* U and V to be even at this point.\n      //\n      // This has an adverse effect on performance for high bit counts, but has\n      // a significant positive effect for smaller counts.\n      //\n      if ((U.limbs()[0] & 1u) == 0)\n      {\n         eval_right_shift(U, eval_lsb(U));\n         if (U.compare(V) < 0)\n            U.swap(V);\n      }\n      else if ((V.limbs()[0] & 1u) == 0)\n      {\n         eval_right_shift(V, eval_lsb(V));\n      }\n   }\n   storage.deallocate(ts * 3);\n}\n\n#else\n//\n// This branch is taken when double_limb_type is a synthetic type with no native hardware support.\n// For example __int128.  The assumption is that add/subtract/multiply of double_limb_type are efficient,\n// but that division is very slow.\n//\n// We begin with a specialized routine for division.\n// We know that most of the time this is called the result will be 1.\n// For small limb counts, this almost doubles the performance of Lehmer's routine!\n//\nBOOST_FORCEINLINE void divide_subtract(double_limb_type& q, double_limb_type& u, const double_limb_type& v)\n{\n   BOOST_MP_ASSERT(q == 1); // precondition on entry.\n   u -= v;\n   while (u >= v)\n   {\n      u -= v;\n      if (++q > 30)\n      {\n         double_limb_type t = u / v;\n         u -= t * v;\n         q += t;\n      }\n   }\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class Storage>\nvoid eval_gcd_lehmer(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& U, cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& V, std::size_t lu, Storage& storage)\n{\n   //\n   // Extract the leading 2*bits_per_limb bits from U and V:\n   //\n   std::size_t  h = lu % bits_per_limb;\n   double_limb_type u, v;\n   if (h)\n   {\n      u = (static_cast<double_limb_type>((U.limbs()[U.size() - 1])) << bits_per_limb) | U.limbs()[U.size() - 2];\n      v = (static_cast<double_limb_type>((V.size() < U.size() ? 0 : V.limbs()[V.size() - 1])) << bits_per_limb) | V.limbs()[U.size() - 2];\n      u <<= bits_per_limb - h;\n      u |= U.limbs()[U.size() - 3] >> h;\n      v <<= bits_per_limb - h;\n      v |= V.limbs()[U.size() - 3] >> h;\n   }\n   else\n   {\n      u = (static_cast<double_limb_type>(U.limbs()[U.size() - 1]) << bits_per_limb) | U.limbs()[U.size() - 2];\n      v = (static_cast<double_limb_type>(V.limbs()[U.size() - 1]) << bits_per_limb) | V.limbs()[U.size() - 2];\n   }\n   //\n   // Cosequences are stored as limb_types, we take care not to overflow these:\n   //\n   // x[i+0] is positive for even i.\n   // y[i+0] is positive for odd i.\n   //\n   // However we track only absolute values here:\n   //\n   limb_type x[3] = { 1, 0 };\n   limb_type y[3] = { 0, 1 };\n   std::size_t  i = 0;\n\n#ifdef BOOST_MP_GCD_DEBUG\n   cpp_int UU, VV;\n   UU = U;\n   VV = V;\n#endif\n   //\n   // We begine by running a single digit version of Lehmer's algorithm, we still have\n   // to track u and v at double precision, but this adds only a tiny performance penalty.\n   // What we gain is fast division, and fast termination testing.\n   // When you see static_cast<limb_type>(u >> bits_per_limb) here, this is really just\n   // a direct access to the upper bits_per_limb of the double limb type.  For __int128\n   // this is simple a load of the upper 64 bits and the \"shift\" is optimised away.\n   //\n   double_limb_type old_u, old_v;\n   while (true)\n   {\n      limb_type q = static_cast<limb_type>(u >> bits_per_limb) / static_cast<limb_type>(v >> bits_per_limb);\n      x[2] = x[0] + q * x[1];\n      y[2] = y[0] + q * y[1];\n      double_limb_type tu = u;\n      old_u = u;\n      old_v = v;\n      u = v;\n      double_limb_type t = q * v;\n      if (tu < t)\n      {\n         ++i;\n         break;\n      }\n      v = tu - t;\n      ++i;\n      BOOST_MP_ASSERT((u <= v) || (t / q == old_v));\n      if (u <= v)\n      {\n         // We've gone terribly wrong, probably numeric overflow:\n         break;\n      }\n      if ((i & 1u) == 0)\n      {\n         if ((static_cast<limb_type>(v >> bits_per_limb) < x[2]) || ((static_cast<limb_type>(u >> bits_per_limb) - static_cast<limb_type>(v >> bits_per_limb)) < (y[2] + y[1])))\n            break;\n      }\n      else\n      {\n         if ((static_cast<limb_type>(v >> bits_per_limb) < y[2]) || ((static_cast<limb_type>(u >> bits_per_limb) - static_cast<limb_type>(v >> bits_per_limb)) < (x[2] + x[1])))\n            break;\n      }\n#ifdef BOOST_MP_GCD_DEBUG\n      BOOST_MP_ASSERT(q == UU / VV);\n      UU %= VV;\n      UU.swap(VV);\n#endif\n      x[0] = x[1];\n      x[1] = x[2];\n      y[0] = y[1];\n      y[1] = y[2];\n   }\n   //\n   // We get here when the single digit algorithm has gone wrong, back up i, u and v:\n   //\n   --i;\n   u = old_u;\n   v = old_v;\n   //\n   // Now run the full double-digit algorithm:\n   //\n   while (true)\n   {\n      double_limb_type q = 1u;\n      double_limb_type tt = u;\n      divide_subtract(q, u, v);\n      std::swap(u, v);\n      tt = y[0] + q * static_cast<double_limb_type>(y[1]);\n      //\n      // If calculation of y[2] would overflow a single limb, then we *must* terminate.\n      // Note that x[2] < y[2] so there is no need to check that as well:\n      //\n      if (tt >> bits_per_limb)\n      {\n         ++i;\n         break;\n      }\n      x[2] = static_cast<limb_type>(x[0] + static_cast<double_limb_type>(q * x[1]));\n      y[2] = static_cast<limb_type>(tt);\n      ++i;\n      if ((i & 1u) == 0)\n      {\n         BOOST_MP_ASSERT(u > v);\n         if ((v < x[2]) || ((u - v) < (static_cast<double_limb_type>(y[2]) + y[1])))\n            break;\n      }\n      else\n      {\n         BOOST_MP_ASSERT(u > v);\n         if ((v < y[2]) || ((u - v) < (static_cast<double_limb_type>(x[2]) + x[1])))\n            break;\n      }\n#ifdef BOOST_MP_GCD_DEBUG\n      BOOST_MP_ASSERT(q == UU / VV);\n      UU %= VV;\n      UU.swap(VV);\n#endif\n      x[0] = x[1];\n      x[1] = x[2];\n      y[0] = y[1];\n      y[1] = y[2];\n   }\n   if (i == 1)\n   {\n      // No change to U and V we've stalled!\n      cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> t;\n      eval_modulus(t, U, V);\n      U.swap(V);\n      V.swap(t);\n      return;\n   }\n   //\n   // Update U and V.\n   // We have:\n   //\n   // U = x[0]U + y[0]V and\n   // V = x[1]U + y[1]V.\n   //\n   // But since we track only absolute values of x and y\n   // we have to take account of the implied signs and perform\n   // the appropriate subtraction depending on the whether i is\n   // even or odd:\n   //\n   std::size_t ts = U.size() + 1;\n   cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> t1(storage, ts), t2(storage, ts), t3(storage, ts);\n   eval_multiply(t1, U, x[0]);\n   eval_multiply(t2, V, y[0]);\n   eval_multiply(t3, U, x[1]);\n   if ((i & 1u) == 0)\n   {\n      if (x[0] == 0)\n         U = t2;\n      else\n      {\n         BOOST_MP_ASSERT(t2.compare(t1) >= 0);\n         eval_subtract(U, t2, t1);\n         BOOST_MP_ASSERT(U.sign() == false);\n      }\n   }\n   else\n   {\n      BOOST_MP_ASSERT(t1.compare(t2) >= 0);\n      eval_subtract(U, t1, t2);\n      BOOST_MP_ASSERT(U.sign() == false);\n   }\n   eval_multiply(t2, V, y[1]);\n   if (i & 1u)\n   {\n      if (x[1] == 0)\n         V = t2;\n      else\n      {\n         BOOST_MP_ASSERT(t2.compare(t3) >= 0);\n         eval_subtract(V, t2, t3);\n         BOOST_MP_ASSERT(V.sign() == false);\n      }\n   }\n   else\n   {\n      BOOST_MP_ASSERT(t3.compare(t2) >= 0);\n      eval_subtract(V, t3, t2);\n      BOOST_MP_ASSERT(V.sign() == false);\n   }\n   BOOST_MP_ASSERT(U.compare(V) >= 0);\n   BOOST_MP_ASSERT(lu > eval_msb(U));\n#ifdef BOOST_MP_GCD_DEBUG\n\n   BOOST_MP_ASSERT(UU == U);\n   BOOST_MP_ASSERT(VV == V);\n\n   extern std::size_t total_lehmer_gcd_calls;\n   extern std::size_t total_lehmer_gcd_bits_saved;\n   extern std::size_t total_lehmer_gcd_cycles;\n\n   ++total_lehmer_gcd_calls;\n   total_lehmer_gcd_bits_saved += lu - eval_msb(U);\n   total_lehmer_gcd_cycles += i;\n#endif\n   if (lu < 2048)\n   {\n      //\n      // Since we have stripped all common powers of 2 from U and V at the start\n      // if either are even at this point, we can remove stray powers of 2 now.\n      // Note that it is not possible for *both* U and V to be even at this point.\n      //\n      // This has an adverse effect on performance for high bit counts, but has\n      // a significant positive effect for smaller counts.\n      //\n      if ((U.limbs()[0] & 1u) == 0)\n      {\n         eval_right_shift(U, eval_lsb(U));\n         if (U.compare(V) < 0)\n            U.swap(V);\n      }\n      else if ((V.limbs()[0] & 1u) == 0)\n      {\n         eval_right_shift(V, eval_lsb(V));\n      }\n   }\n   storage.deallocate(ts * 3);\n}\n\n#endif\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_gcd(\n   cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,\n   const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a,\n   const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& b)\n{\n   using default_ops::eval_get_sign;\n   using default_ops::eval_is_zero;\n   using default_ops::eval_lsb;\n\n   if (a.size() == 1)\n   {\n      eval_gcd(result, b, *a.limbs());\n      return;\n   }\n   if (b.size() == 1)\n   {\n      eval_gcd(result, a, *b.limbs());\n      return;\n   }\n   std::size_t temp_size = (std::max)(a.size(), b.size()) + 1;\n   typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::scoped_shared_storage storage(a, temp_size * 6);\n\n   cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> U(storage, temp_size);\n   cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> V(storage, temp_size);\n   cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> t(storage, temp_size);\n   U = a;\n   V = b;\n\n   int s = eval_get_sign(U);\n\n   /* GCD(0,x) := x */\n   if (s < 0)\n   {\n      U.negate();\n   }\n   else if (s == 0)\n   {\n      result = V;\n      return;\n   }\n   s = eval_get_sign(V);\n   if (s < 0)\n   {\n      V.negate();\n   }\n   else if (s == 0)\n   {\n      result = U;\n      return;\n   }\n   //\n   // Remove common factors of 2:\n   //\n   std::size_t us = eval_lsb(U);\n   std::size_t vs = eval_lsb(V);\n   std::size_t shift = (std::min)(us, vs);\n   if (us)\n      eval_right_shift(U, us);\n   if (vs)\n      eval_right_shift(V, vs);\n\n   if (U.compare(V) < 0)\n      U.swap(V);\n\n   while (!eval_is_zero(V))\n   {\n      if (U.size() <= 2)\n      {\n         //\n         // Special case: if V has no more than 2 limbs\n         // then we can reduce U and V to a pair of integers and perform\n         // direct integer gcd:\n         //\n         if (U.size() == 1)\n            U = eval_gcd(*V.limbs(), *U.limbs());\n         else\n         {\n            double_limb_type i = U.limbs()[0] | (static_cast<double_limb_type>(U.limbs()[1]) << sizeof(limb_type) * CHAR_BIT);\n            double_limb_type j = (V.size() == 1) ? *V.limbs() : V.limbs()[0] | (static_cast<double_limb_type>(V.limbs()[1]) << sizeof(limb_type) * CHAR_BIT);\n            U = eval_gcd(i, j);\n         }\n         break;\n      }\n      std::size_t lu = eval_msb(U) + 1;\n      std::size_t lv = eval_msb(V) + 1;\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n      if (!BOOST_MP_IS_CONST_EVALUATED(lu) && (lu - lv <= bits_per_limb / 2))\n#else\n      if (lu - lv <= bits_per_limb / 2)\n#endif\n      {\n         eval_gcd_lehmer(U, V, lu, storage);\n      }\n      else\n      {\n         eval_modulus(t, U, V);\n         U.swap(V);\n         V.swap(t);\n      }\n   }\n   result = U;\n   if (shift)\n      eval_left_shift(result, shift);\n}\n//\n// Now again for trivial backends:\n//\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_gcd(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& b) noexcept\n{\n   *result.limbs() = boost::multiprecision::detail::constexpr_gcd(*a.limbs(), *b.limbs());\n   result.sign(false);\n}\n// This one is only enabled for unchecked cpp_int's, for checked int's we need the checking in the default version:\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && (Checked1 == unchecked)>::type\neval_lcm(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& b) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   *result.limbs() = boost::multiprecision::detail::constexpr_lcm(*a.limbs(), *b.limbs());\n   result.normalize(); // result may overflow the specified number of bits\n   result.sign(false);\n}\n\ninline void conversion_overflow(const std::integral_constant<int, checked>&)\n{\n   BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Overflow in conversion to narrower type\"));\n}\ninline BOOST_MP_CXX14_CONSTEXPR void conversion_overflow(const std::integral_constant<int, unchecked>&) {}\n\n#if defined(__clang__) && defined(__MINGW32__)\n//\n// clang-11 on Mingw segfaults on conversion of __int128 -> float.\n// See: https://bugs.llvm.org/show_bug.cgi?id=48941\n// These workarounds pass everything through an intermediate uint64_t.\n//\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && std::is_same<typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::local_limb_type, double_limb_type>::value>::type\neval_convert_to(float* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val)\n{\n   float f = static_cast<std::uint64_t>((*val.limbs()) >> 64);\n   *result = std::ldexp(f, 64);\n   *result += static_cast<std::uint64_t>((*val.limbs()));\n   if(val.sign())\n      *result = -*result;\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && std::is_same<typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::local_limb_type, double_limb_type>::value>::type\neval_convert_to(double* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val)\n{\n   float f = static_cast<std::uint64_t>((*val.limbs()) >> 64);\n   *result = std::ldexp(f, 64);\n   *result += static_cast<std::uint64_t>((*val.limbs()));\n   if(val.sign())\n      *result = -*result;\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && std::is_same<typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::local_limb_type, double_limb_type>::value>::type\neval_convert_to(long double* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val)\n{\n   float f = static_cast<std::uint64_t>((*val.limbs()) >> 64);\n   *result = std::ldexp(f, 64);\n   *result += static_cast<std::uint64_t>((*val.limbs()));\n   if(val.sign())\n      *result = -*result;\n}\n#endif\n\ntemplate <class R, std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && std::is_convertible<typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::local_limb_type, R>::value>::type\neval_convert_to(R* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val)\n{\n   BOOST_IF_CONSTEXPR(std::numeric_limits<R>::is_specialized)\n   {\n      using common_type = typename std::common_type<R, typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::local_limb_type>::type;\n\n      if (static_cast<common_type>(*val.limbs()) > static_cast<common_type>((std::numeric_limits<R>::max)()))\n      {\n         if (val.isneg())\n         {\n            check_is_negative(std::integral_constant < bool, (boost::multiprecision::detail::is_signed<R>::value && boost::multiprecision::detail::is_integral<R>::value) || (number_category<R>::value == number_kind_floating_point) > ());\n            if (static_cast<common_type>(*val.limbs()) > -static_cast<common_type>((std::numeric_limits<R>::min)()))\n               conversion_overflow(typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n            *result = (std::numeric_limits<R>::min)();\n         }\n         else\n         {\n            conversion_overflow(typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n            *result = boost::multiprecision::detail::is_signed<R>::value && boost::multiprecision::detail::is_integral<R>::value ? (std::numeric_limits<R>::max)() : static_cast<R>(*val.limbs());\n         }\n      }\n      else\n      {\n         *result = static_cast<R>(*val.limbs());\n         if (val.isneg())\n         {\n            check_is_negative(std::integral_constant < bool, (boost::multiprecision::detail::is_signed<R>::value && boost::multiprecision::detail::is_integral<R>::value) || (number_category<R>::value == number_kind_floating_point) > ());\n            *result = negate_integer(*result, std::integral_constant < bool, is_signed_number<R>::value || (number_category<R>::value == number_kind_floating_point) > ());\n         }\n      }\n   }\n   else\n   {\n      *result = static_cast<R>(*val.limbs());\n      if (val.isneg())\n      {\n         check_is_negative(std::integral_constant<bool, (boost::multiprecision::detail::is_signed<R>::value && boost::multiprecision::detail::is_integral<R>::value) || (number_category<R>::value == number_kind_floating_point) > ());\n         *result = negate_integer(*result, std::integral_constant<bool, is_signed_number<R>::value || (number_category<R>::value == number_kind_floating_point) > ());\n      }\n   }\n}\n\ntemplate <class R, std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && std::is_convertible<typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::local_limb_type, R>::value>::type\neval_convert_to(R* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val)\n{\n   BOOST_IF_CONSTEXPR(std::numeric_limits<R>::is_specialized)\n   {\n      using common_type = typename std::common_type<R, typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::local_limb_type>::type;\n\n      if(static_cast<common_type>(*val.limbs()) > static_cast<common_type>((std::numeric_limits<R>::max)()))\n      {\n         conversion_overflow(typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n         *result = boost::multiprecision::detail::is_signed<R>::value && boost::multiprecision::detail::is_integral<R>::value ? (std::numeric_limits<R>::max)() : static_cast<R>(*val.limbs());\n      }\n      else\n         *result = static_cast<R>(*val.limbs());\n   }\n   else\n      *result = static_cast<R>(*val.limbs());\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, std::size_t>::type\neval_lsb(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a)\n{\n   using default_ops::eval_get_sign;\n   if (eval_get_sign(a) == 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::domain_error(\"No bits were set in the operand.\"));\n   }\n   if (a.sign())\n   {\n      BOOST_MP_THROW_EXCEPTION(std::domain_error(\"Testing individual bits in negative values is not supported - results are undefined.\"));\n   }\n   //\n   // Find the index of the least significant bit within that limb:\n   //\n   return boost::multiprecision::detail::find_lsb(*a.limbs());\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, std::size_t>::type\neval_msb_imp(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a)\n{\n   //\n   // Find the index of the least significant bit within that limb:\n   //\n   return boost::multiprecision::detail::find_msb(*a.limbs());\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, std::size_t>::type\neval_msb(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a)\n{\n   using default_ops::eval_get_sign;\n   if (eval_get_sign(a) == 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::domain_error(\"No bits were set in the operand.\"));\n   }\n   if (a.sign())\n   {\n      BOOST_MP_THROW_EXCEPTION(std::domain_error(\"Testing individual bits in negative values is not supported - results are undefined.\"));\n   }\n   return eval_msb_imp(a);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR std::size_t hash_value(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val) noexcept\n{\n   std::size_t result = 0;\n   for (std::size_t i = 0; i < val.size(); ++i)\n   {\n      boost::multiprecision::detail::hash_combine(result, val.limbs()[i]);\n   }\n   boost::multiprecision::detail::hash_combine(result, val.sign());\n   return result;\n}\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n} // Namespace backends\n\nnamespace detail {\n\n#ifndef BOOST_MP_STANDALONE\ntemplate <typename T>\ninline BOOST_CXX14_CONSTEXPR T constexpr_gcd(T a, T b) noexcept\n{\n   return boost::integer::gcd(a, b);\n}\n\ntemplate <typename T>\ninline BOOST_CXX14_CONSTEXPR T constexpr_lcm(T a, T b) noexcept\n{\n   return boost::integer::lcm(a, b);\n}\n\n#else\n\ntemplate <typename T>\ninline BOOST_CXX14_CONSTEXPR T constexpr_gcd(T a, T b) noexcept\n{\n   return boost::multiprecision::backends::eval_gcd(a, b);\n}\n\ntemplate <typename T>\ninline BOOST_CXX14_CONSTEXPR T constexpr_lcm(T a, T b) noexcept\n{\n   const T ab_gcd = boost::multiprecision::detail::constexpr_gcd(a, b);\n   return (a * b) / ab_gcd;\n}\n\n#endif // BOOST_MP_STANDALONE\n\n}\n\n}} // Namespace boost::multiprecision\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_int/multiply.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012-20 John Maddock. \n//  Copyright 2019-20 Christopher Kormanyos. \n//  Copyright 2019-20 Madhur Chauhan. \n//  Distributed under the Boost Software License, Version 1.0.\n//  (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// Comparison operators for cpp_int_backend:\n//\n#ifndef BOOST_MP_CPP_INT_MULTIPLY_HPP\n#define BOOST_MP_CPP_INT_MULTIPLY_HPP\n\n#include <limits>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/detail/endian.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n#include <boost/multiprecision/integer.hpp>\n\nnamespace boost { namespace multiprecision { namespace backends {\n\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4127) // conditional expression is constant\n#endif\n//\n// Multiplication by a single limb:\n//\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_multiply(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,\n    const limb_type&                                                            val) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   if (!val)\n   {\n      result = static_cast<limb_type>(0);\n      return;\n   }\n   if ((void*)&a != (void*)&result)\n      result.resize(a.size(), a.size());\n   double_limb_type                                                                                  carry = 0;\n   typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_pointer       p     = result.limbs();\n   typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_pointer       pe    = result.limbs() + result.size();\n   typename cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>::const_limb_pointer pa    = a.limbs();\n   while (p != pe)\n   {\n      carry += static_cast<double_limb_type>(*pa) * static_cast<double_limb_type>(val);\n#ifdef __MSVC_RUNTIME_CHECKS\n      *p = static_cast<limb_type>(carry & ~static_cast<limb_type>(0));\n#else\n      *p = static_cast<limb_type>(carry);\n#endif\n      carry >>= cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;\n      ++p, ++pa;\n   }\n   if (carry)\n   {\n      std::size_t i = result.size();\n      result.resize(i + 1, i + 1);\n      if (result.size() > i)\n         result.limbs()[i] = static_cast<limb_type>(carry);\n   }\n   result.sign(a.sign());\n   if (is_fixed_precision<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value)\n      result.normalize();\n}\n\n//\n// resize_for_carry forces a resize of the underlying buffer only if a previous request\n// for \"required\" elements could possibly have failed, *and* we have checking enabled.\n// This will cause an overflow error inside resize():\n//\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR void resize_for_carry(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& /*result*/, std::size_t /*required*/) {}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, class Allocator1>\ninline BOOST_MP_CXX14_CONSTEXPR void resize_for_carry(cpp_int_backend<MinBits1, MaxBits1, SignType1, checked, Allocator1>& result, std::size_t required)\n{\n   if (result.size() < required)\n      result.resize(required, required);\n}\n//\n// Minimum number of limbs required for Karatsuba to be worthwhile:\n//\n#ifdef BOOST_MP_KARATSUBA_CUTOFF\nconst size_t karatsuba_cutoff = BOOST_MP_KARATSUBA_CUTOFF;\n#else\nconst size_t karatsuba_cutoff = 40;\n#endif\n//\n// Core (recursive) Karatsuba multiplication, all the storage required is allocated upfront and \n// passed down the stack in this routine.  Note that all the cpp_int_backend's must be the same type\n// and full variable precision.  Karatsuba really doesn't play nice with fixed-size integers.  If necessary\n// fixed precision integers will get aliased as variable-precision types before this is called.\n//\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>\ninline void multiply_karatsuba(\n    cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator>&       result,\n    const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator>& a,\n    const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator>& b,\n    typename cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator>::scoped_shared_storage& storage)\n{\n   using cpp_int_type = cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator>;\n\n   std::size_t as = a.size();\n   std::size_t bs = b.size();\n   //\n   // Termination condition: if either argument is smaller than karatsuba_cutoff\n   // then schoolboy multiplication will be faster:\n   //\n   if ((as < karatsuba_cutoff) || (bs < karatsuba_cutoff))\n   {\n      eval_multiply(result, a, b);\n      return;\n   }\n   //\n   // Partitioning size: split the larger of a and b into 2 halves\n   //\n   std::size_t n  = (as > bs ? as : bs) / 2 + 1;\n   //\n   // Partition a and b into high and low parts.\n   // ie write a, b as a = a_h * 2^n + a_l, b = b_h * 2^n + b_l\n   //\n   // We could copy the high and low parts into new variables, but we'll\n   // use aliasing to reference the internal limbs of a and b.  There is one wart here:\n   // if a and b are mismatched in size, then n may be larger than the smaller\n   // of a and b.  In that situation the high part is zero, and we have no limbs\n   // to alias, so instead alias a local variable.\n   // This raises 2 questions:\n   // * Is this the best way to partition a and b?\n   // * Since we have one high part zero, the arithmetic simplifies considerably, \n   //   so should we have a special routine for this?\n   // \n   std::size_t          sz = (std::min)(as, n);\n   const cpp_int_type a_l(a.limbs(), 0, sz);\n\n   sz = (std::min)(bs, n);\n   const cpp_int_type b_l(b.limbs(), 0, sz);\n\n   limb_type          zero = 0;\n   const cpp_int_type a_h(as > n ? a.limbs() + n : &zero, 0, as > n ? as - n : 1);\n   const cpp_int_type b_h(bs > n ? b.limbs() + n : &zero, 0, bs > n ? bs - n : 1);\n   //\n   // The basis for the Karatsuba algorithm is as follows:\n   //\n   // let                x = a_h * b_ h\n   //                    y = a_l * b_l\n   //                    z = (a_h + a_l)*(b_h + b_l) - x - y\n   // and therefore  a * b = x * (2 ^ (2 * n))+ z * (2 ^ n) + y\n   //\n   // Begin by allocating our temporaries, these alias the memory already allocated in the shared storage:\n   //\n   cpp_int_type t1(storage, 2 * n + 2);\n   cpp_int_type t2(storage, n + 1);\n   cpp_int_type t3(storage, n + 1);\n   //\n   // Now we want:\n   //\n   // result = | a_h*b_h  | a_l*b_l |\n   // (bits)              <-- 2*n -->\n   //\n   // We create aliases for the low and high parts of result, and multiply directly into them:\n   //\n   cpp_int_type result_low(result.limbs(), 0, 2 * n);\n   cpp_int_type result_high(result.limbs(), 2 * n, result.size() - 2 * n);\n   //\n   // low part of result is a_l * b_l:\n   //\n   multiply_karatsuba(result_low, a_l, b_l, storage);\n   //\n   // We haven't zeroed out memory in result, so set to zero any unused limbs,\n   // if a_l and b_l have mostly random bits then nothing happens here, but if\n   // one is zero or nearly so, then a memset might be faster... it's not clear\n   // that it's worth the extra logic though (and is darn hard to measure\n   // what the \"average\" case is).\n   //\n   for (std::size_t i = result_low.size(); i < 2 * n; ++i)\n      result.limbs()[i] = 0;\n   //\n   // Set the high part of result to a_h * b_h:\n   //\n   multiply_karatsuba(result_high, a_h, b_h, storage);\n   for (std::size_t i = result_high.size() + 2 * n; i < result.size(); ++i)\n      result.limbs()[i] = 0;\n   //\n   // Now calculate (a_h+a_l)*(b_h+b_l):\n   //\n   add_unsigned(t2, a_l, a_h);\n   add_unsigned(t3, b_l, b_h);\n   multiply_karatsuba(t1, t2, t3, storage); // t1 = (a_h+a_l)*(b_h+b_l)\n   //\n   // There is now a slight deviation from Karatsuba, we want to subtract\n   // a_l*b_l + a_h*b_h from t1, but rather than use an addition and a subtraction\n   // plus one temporary, we'll use 2 subtractions.  On the minus side, a subtraction\n   // is on average slightly slower than an addition, but we save a temporary (ie memory)\n   // and also hammer the same piece of memory over and over rather than 2 disparate\n   // memory regions.  Overall it seems to be a slight win.\n   //\n   subtract_unsigned(t1, t1, result_high);\n   subtract_unsigned(t1, t1, result_low);\n   //\n   // The final step is to left shift t1 by n bits and add to the result.\n   // Rather than do an actual left shift, we can simply alias the result\n   // and add to the alias:\n   //\n   cpp_int_type result_alias(result.limbs(), n, result.size() - n);\n   add_unsigned(result_alias, result_alias, t1);\n   //\n   // Free up storage for use by sister branches to this one:\n   //\n   storage.deallocate(t1.capacity() + t2.capacity() + t3.capacity());\n\n   result.normalize();\n}\n\ninline std::size_t karatsuba_storage_size(std::size_t s)\n{\n   // \n   // This estimates how much memory we will need based on\n   // s-limb multiplication.  In an ideal world the number of limbs\n   // would halve with each recursion, and our storage requirements\n   // would be 4s in the limit, and rather less in practice since\n   // we bail out long before we reach one limb.  In the real world\n   // we don't quite halve s in each recursion, so this is an heuristic\n   // which over-estimates how much we need.  We could compute an exact\n   // value, but it would be rather time consuming.\n   //\n   return 5 * s;\n}\n//\n// There are 2 entry point routines for Karatsuba multiplication:\n// one for variable precision types, and one for fixed precision types.\n// These are responsible for allocating all the storage required for the recursive\n// routines above, and are always at the outermost level.\n//\n// Normal variable precision case comes first:\n//\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>\ninline typename std::enable_if<!is_fixed_precision<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value>::type\nsetup_karatsuba(\n   cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& result,\n   const cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& a,\n   const cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& b)\n{\n   std::size_t as = a.size();\n   std::size_t bs = b.size();\n   std::size_t s = as > bs ? as : bs;\n   std::size_t storage_size = karatsuba_storage_size(s);\n   if (storage_size < 300)\n   {\n      //\n      // Special case: if we don't need too much memory, we can use stack based storage\n      // and save a call to the allocator, this allows us to use Karatsuba multiply\n      // at lower limb counts than would otherwise be possible:\n      //\n      limb_type limbs[300];\n      typename cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>::scoped_shared_storage storage(limbs, storage_size);\n      multiply_karatsuba(result, a, b, storage);\n   }\n   else\n   {\n      typename cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>::scoped_shared_storage storage(result.allocator(), storage_size);\n      multiply_karatsuba(result, a, b, storage);\n   }\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, std::size_t MinBits3, std::size_t MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>\ninline typename std::enable_if<is_fixed_precision<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_fixed_precision<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value || is_fixed_precision<cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3> >::value>::type\nsetup_karatsuba(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,\n    const cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3>& b)\n{\n   //\n   // Now comes the fixed precision case.\n   // In fact Karatsuba doesn't really work with fixed precision since the logic\n   // requires that we calculate all the bits of the result (especially in the\n   // temporaries used internally).  So... we'll convert all the arguments\n   // to variable precision types by aliasing them, this also\n   // reduce the number of template instantations:\n   //\n   using variable_precision_type = cpp_int_backend<0, 0, signed_magnitude, unchecked, std::allocator<limb_type> >;\n   variable_precision_type a_t(a.limbs(), 0, a.size()), b_t(b.limbs(), 0, b.size());\n   std::size_t as = a.size();\n   std::size_t bs = b.size();\n   std::size_t s = as > bs ? as : bs;\n   std::size_t sz = as + bs;\n   std::size_t storage_size = karatsuba_storage_size(s);\n\n   if (!is_fixed_precision<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || (sz * sizeof(limb_type) * CHAR_BIT <= MaxBits1))\n   {\n      // Result is large enough for all the bits of the result, so we can use aliasing:\n      result.resize(sz, sz);\n      variable_precision_type t(result.limbs(), 0, result.size());\n      typename variable_precision_type::scoped_shared_storage storage(t.allocator(), storage_size);\n      multiply_karatsuba(t, a_t, b_t, storage);\n      result.resize(t.size(), t.size());\n   }\n   else\n   {\n      //\n      // Not enough bit in result for the answer, so we must use a temporary\n      // and then truncate (ie modular arithmetic):\n      //\n      typename variable_precision_type::scoped_shared_storage storage(variable_precision_type::allocator_type(), sz + storage_size);\n      variable_precision_type t(storage, sz);\n      multiply_karatsuba(t, a_t, b_t, storage);\n      //\n      // If there is truncation, and result is a checked type then this will throw:\n      //\n      result = t;\n   }\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, std::size_t MinBits3, std::size_t MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>\ninline typename std::enable_if<!is_fixed_precision<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_fixed_precision<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && !is_fixed_precision<cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3> >::value>::type\nsetup_karatsuba(\n   cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,\n   const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,\n   const cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3>& b)\n{\n   //\n   // Variable precision, mixed arguments, just alias and forward:\n   //\n   using variable_precision_type = cpp_int_backend<0, 0, signed_magnitude, unchecked, std::allocator<limb_type> >;\n   variable_precision_type a_t(a.limbs(), 0, a.size()), b_t(b.limbs(), 0, b.size());\n   std::size_t as = a.size();\n   std::size_t bs = b.size();\n   std::size_t s = as > bs ? as : bs;\n   std::size_t sz = as + bs;\n   std::size_t storage_size = karatsuba_storage_size(s);\n\n   result.resize(sz, sz);\n   variable_precision_type t(result.limbs(), 0, result.size());\n   typename variable_precision_type::scoped_shared_storage storage(t.allocator(), storage_size);\n   multiply_karatsuba(t, a_t, b_t, storage);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, std::size_t MinBits3, std::size_t MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>\ninline BOOST_MP_CXX14_CONSTEXPR void\neval_multiply_comba(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,\n    const cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3>& b) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   // \n   // see PR #182\n   // Comba Multiplier - based on Paul Comba's\n   // Exponentiation cryptosystems on the IBM PC, 1990\n   //\n   std::ptrdiff_t as                                                                                         = a.size(),\n       bs                                                                                         = b.size(),\n       rs                                                                                         = result.size();\n   typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_pointer pr = result.limbs();\n\n   double_limb_type carry    = 0,\n                    temp     = 0;\n   limb_type      overflow   = 0;\n   const std::size_t limb_bits  = sizeof(limb_type) * CHAR_BIT;\n   const bool     must_throw = rs < as + bs - 1;\n   for (std::ptrdiff_t r = 0, lim = (std::min)(rs, as + bs - 1); r < lim; ++r, overflow = 0)\n   {\n      std::ptrdiff_t i = r >= as ? as - 1 : r,\n          j = r - i,\n          k = i < bs - j ? i + 1 : bs - j; // min(i+1, bs-j);\n\n      typename cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>::const_limb_pointer pa = a.limbs() + i;\n      typename cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3>::const_limb_pointer pb = b.limbs() + j;\n\n      temp = carry;\n      carry += static_cast<double_limb_type>(*(pa)) * (*(pb));\n      overflow += carry < temp;\n      for (--k; k; k--)\n      {\n         temp = carry;\n         carry += static_cast<double_limb_type>(*(--pa)) * (*(++pb));\n         overflow += carry < temp;\n      }\n      *(pr++) = static_cast<limb_type>(carry);\n      carry   = (static_cast<double_limb_type>(overflow) << limb_bits) | (carry >> limb_bits);\n   }\n   if (carry || must_throw)\n   {\n      resize_for_carry(result, as + bs);\n      if (static_cast<int>(result.size()) >= as + bs)\n         *pr = static_cast<limb_type>(carry);\n   }\n}\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, std::size_t MinBits3, std::size_t MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3> >::value>::type\neval_multiply(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,\n    const cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3>& b) \n   noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value \n      && (karatsuba_cutoff * sizeof(limb_type) * CHAR_BIT > MaxBits1) \n      && (karatsuba_cutoff * sizeof(limb_type)* CHAR_BIT > MaxBits2) \n      && (karatsuba_cutoff * sizeof(limb_type)* CHAR_BIT > MaxBits3)))\n{\n   // Uses simple (O(n^2)) multiplication when the limbs are less\n   // otherwise switches to karatsuba algorithm based on experimental value (~40 limbs)\n   //\n   // Trivial cases first:\n   //\n   std::size_t                                                                                          as = a.size();\n   std::size_t                                                                                          bs = b.size();\n   typename cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>::const_limb_pointer pa = a.limbs();\n   typename cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3>::const_limb_pointer pb = b.limbs();\n   if (as == 1)\n   {\n      bool s = b.sign() != a.sign();\n      if (bs == 1)\n      {\n         result = static_cast<double_limb_type>(*pa) * static_cast<double_limb_type>(*pb);\n      }\n      else\n      {\n         limb_type l = *pa;\n         eval_multiply(result, b, l);\n      }\n      result.sign(s);\n      return;\n   }\n   if (bs == 1)\n   {\n      bool      s = b.sign() != a.sign();\n      limb_type l = *pb;\n      eval_multiply(result, a, l);\n      result.sign(s);\n      return;\n   }\n\n   if ((void*)&result == (void*)&a)\n   {\n      cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> t(a);\n      eval_multiply(result, t, b);\n      return;\n   }\n   if ((void*)&result == (void*)&b)\n   {\n      cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> t(b);\n      eval_multiply(result, a, t);\n      return;\n   }\n\n   constexpr double_limb_type limb_max        = static_cast<double_limb_type>(~static_cast<limb_type>(0u));\n   constexpr double_limb_type double_limb_max = static_cast<double_limb_type>(~static_cast<double_limb_type>(0u));\n\n   result.resize(as + bs, as + bs - 1);\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n   if (!BOOST_MP_IS_CONST_EVALUATED(as) && (as >= karatsuba_cutoff && bs >= karatsuba_cutoff))\n#else\n   if (as >= karatsuba_cutoff && bs >= karatsuba_cutoff)\n#endif\n   {\n      setup_karatsuba(result, a, b);\n      //\n      // Set the sign of the result:\n      //\n      result.sign(a.sign() != b.sign());\n      return;\n   }\n   typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_pointer pr = result.limbs();\n   static_assert(double_limb_max - 2 * limb_max >= limb_max * limb_max, \"failed limb size sanity check\");\n\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n   if (BOOST_MP_IS_CONST_EVALUATED(as))\n   {\n      for (std::size_t i = 0; i < result.size(); ++i)\n         pr[i] = 0;\n   }\n   else\n#endif\n   std::memset(pr, 0, result.size() * sizeof(limb_type));   \n\n#if defined(BOOST_MP_COMBA)\n       // \n       // Comba Multiplier might not be efficient because of less efficient assembly\n       // by the compiler as of 09/01/2020 (DD/MM/YY). See PR #182\n       // Till then this will lay dormant :(\n       //\n       eval_multiply_comba(result, a, b);\n#else\n\n   double_limb_type carry = 0;\n   for (std::size_t i = 0; i < as; ++i)\n   {\n      BOOST_MP_ASSERT(result.size() > i);\n      std::size_t inner_limit = !is_fixed_precision<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value ? bs : (std::min)(result.size() - i, bs);\n      std::size_t j           = 0;\n      for (; j < inner_limit; ++j)\n      {\n         BOOST_MP_ASSERT(i + j < result.size());\n#if (!defined(__GLIBCXX__) && !defined(__GLIBCPP__)) || !BOOST_WORKAROUND(BOOST_GCC_VERSION, <= 50100)\n         BOOST_MP_ASSERT(!std::numeric_limits<double_limb_type>::is_specialized || ((std::numeric_limits<double_limb_type>::max)() - carry >\n                                                                                 static_cast<double_limb_type>(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::max_limb_value) * static_cast<double_limb_type>(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::max_limb_value)));\n#endif\n         carry += static_cast<double_limb_type>(pa[i]) * static_cast<double_limb_type>(pb[j]);\n         BOOST_MP_ASSERT(!std::numeric_limits<double_limb_type>::is_specialized || ((std::numeric_limits<double_limb_type>::max)() - carry >= pr[i + j]));\n         carry += pr[i + j];\n#ifdef __MSVC_RUNTIME_CHECKS\n         pr[i + j] = static_cast<limb_type>(carry & ~static_cast<limb_type>(0));\n#else\n         pr[i + j] = static_cast<limb_type>(carry);\n#endif\n         carry >>= cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;\n         BOOST_MP_ASSERT(carry <= (cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::max_limb_value));\n      }\n      if (carry)\n      {\n         resize_for_carry(result, i + j + 1); // May throw if checking is enabled\n         if (i + j < result.size())\n#ifdef __MSVC_RUNTIME_CHECKS\n            pr[i + j] = static_cast<limb_type>(carry & ~static_cast<limb_type>(0));\n#else\n            pr[i + j] = static_cast<limb_type>(carry);\n#endif\n      }\n      carry = 0;\n   }\n#endif // ifdef(BOOST_MP_COMBA) ends\n\n   result.normalize();\n   //\n   // Set the sign of the result:\n   //\n   result.sign(a.sign() != b.sign());\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_multiply(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a) \n   noexcept((noexcept(eval_multiply(std::declval<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>&>()))))\n{\n   eval_multiply(result, result, a);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_multiply(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, const limb_type& val) \n   noexcept((noexcept(eval_multiply(std::declval<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const limb_type&>()))))\n{\n   eval_multiply(result, result, val);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_multiply(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,\n    const double_limb_type&                                                     val) \n   noexcept(\n      (noexcept(eval_multiply(std::declval<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>&>(), std::declval<const limb_type&>())))\n      && (noexcept(eval_multiply(std::declval<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>&>(), std::declval<const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>())))\n   )\n{\n   if (val <= (std::numeric_limits<limb_type>::max)())\n   {\n      eval_multiply(result, a, static_cast<limb_type>(val));\n   }\n   else\n   {\n#if BOOST_MP_ENDIAN_LITTLE_BYTE && !defined(BOOST_MP_TEST_NO_LE)\n      cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> t(val);\n#else\n      cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> t;\n      t = val;\n#endif\n      eval_multiply(result, a, t);\n   }\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_multiply(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, const double_limb_type& val)\n   noexcept((noexcept(eval_multiply(std::declval<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const double_limb_type&>()))))\n{\n   eval_multiply(result, result, val);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_multiply(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,\n    const signed_limb_type&                                                     val) \n   noexcept((noexcept(eval_multiply(std::declval<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>&>(), std::declval<const limb_type&>()))))\n{\n   if (val > 0)\n      eval_multiply(result, a, static_cast<limb_type>(val));\n   else\n   {\n      eval_multiply(result, a, static_cast<limb_type>(boost::multiprecision::detail::unsigned_abs(val)));\n      result.negate();\n   }\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_multiply(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, const signed_limb_type& val)\n   noexcept((noexcept(eval_multiply(std::declval<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const limb_type&>()))))\n{\n   eval_multiply(result, result, val);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_multiply(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,\n    const signed_double_limb_type&                                              val)\n   noexcept(\n   (noexcept(eval_multiply(std::declval<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>&>(), std::declval<const limb_type&>())))\n      && (noexcept(eval_multiply(std::declval<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>&>(), std::declval<const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>())))\n   )\n{\n   if (val > 0)\n   {\n      if (val <= (std::numeric_limits<limb_type>::max)())\n      {\n         eval_multiply(result, a, static_cast<limb_type>(val));\n         return;\n      }\n   }\n   else if (val >= -static_cast<signed_double_limb_type>((std::numeric_limits<limb_type>::max)()))\n   {\n      eval_multiply(result, a, static_cast<limb_type>(boost::multiprecision::detail::unsigned_abs(val)));\n      result.negate();\n      return;\n   }\n#if BOOST_MP_ENDIAN_LITTLE_BYTE && !defined(BOOST_MP_TEST_NO_LE)\n   cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> t(val);\n#else\n   cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> t;\n   t = val;\n#endif\n   eval_multiply(result, a, t);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_multiply(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, const signed_double_limb_type& val)\n   noexcept(\n   (noexcept(eval_multiply(std::declval<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const limb_type&>())))\n   && (noexcept(eval_multiply(std::declval<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>())))\n   )\n{\n   eval_multiply(result, result, val);\n}\n\n//\n// Now over again for trivial cpp_int's:\n//\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value)>::type\neval_multiply(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   *result.limbs() = detail::checked_multiply(*result.limbs(), *o.limbs(), typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n   result.sign(result.sign() != o.sign());\n   result.normalize();\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_multiply(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   *result.limbs() = detail::checked_multiply(*result.limbs(), *o.limbs(), typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n   result.normalize();\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value)>::type\neval_multiply(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a,\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& b) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   *result.limbs() = detail::checked_multiply(*a.limbs(), *b.limbs(), typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n   result.sign(a.sign() != b.sign());\n   result.normalize();\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_multiply(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a,\n    const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& b) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))\n{\n   *result.limbs() = detail::checked_multiply(*a.limbs(), *b.limbs(), typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());\n   result.normalize();\n}\n\n//\n// Special routines for multiplying two integers to obtain a multiprecision result:\n//\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_multiply(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,\n    signed_double_limb_type a, signed_double_limb_type b)\n{\n   constexpr signed_double_limb_type mask      = static_cast<signed_double_limb_type>(~static_cast<limb_type>(0));\n   constexpr std::size_t             limb_bits = static_cast<std::size_t>(sizeof(limb_type) * CHAR_BIT);\n\n   bool s = false;\n   if (a < 0)\n   {\n      a = -a;\n      s = true;\n   }\n   if (b < 0)\n   {\n      b = -b;\n      s = !s;\n   }\n   double_limb_type w = a & mask;\n   double_limb_type x = static_cast<double_limb_type>(a >> limb_bits);\n   double_limb_type y = b & mask;\n   double_limb_type z = static_cast<double_limb_type>(b >> limb_bits);\n\n   result.resize(4, 4);\n   limb_type* pr = result.limbs();\n\n   double_limb_type carry = w * y;\n#ifdef __MSVC_RUNTIME_CHECKS\n   pr[0] = static_cast<limb_type>(carry & ~static_cast<limb_type>(0));\n   carry >>= limb_bits;\n   carry += w * z + x * y;\n   pr[1] = static_cast<limb_type>(carry & ~static_cast<limb_type>(0));\n   carry >>= limb_bits;\n   carry += x * z;\n   pr[2] = static_cast<limb_type>(carry & ~static_cast<limb_type>(0));\n   pr[3] = static_cast<limb_type>(carry >> limb_bits);\n#else\n   pr[0] = static_cast<limb_type>(carry);\n   carry >>= limb_bits;\n   carry += w * z + x * y;\n   pr[1] = static_cast<limb_type>(carry);\n   carry >>= limb_bits;\n   carry += x * z;\n   pr[2] = static_cast<limb_type>(carry);\n   pr[3] = static_cast<limb_type>(carry >> limb_bits);\n#endif\n   result.sign(s);\n   result.normalize();\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\neval_multiply(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,\n    double_limb_type a, double_limb_type b)\n{\n   constexpr signed_double_limb_type mask      = static_cast<signed_double_limb_type>(~static_cast<limb_type>(0));\n   constexpr std::size_t             limb_bits = static_cast<std::size_t>(sizeof(limb_type) * CHAR_BIT);\n\n   double_limb_type w = a & mask;\n   double_limb_type x = a >> limb_bits;\n   double_limb_type y = b & mask;\n   double_limb_type z = b >> limb_bits;\n\n   result.resize(4, 4);\n   limb_type* pr = result.limbs();\n\n   double_limb_type carry = w * y;\n#ifdef __MSVC_RUNTIME_CHECKS\n   pr[0] = static_cast<limb_type>(carry & ~static_cast<limb_type>(0));\n   carry >>= limb_bits;\n   carry += w * z;\n   pr[1] = static_cast<limb_type>(carry & ~static_cast<limb_type>(0));\n   carry >>= limb_bits;\n   pr[2] = static_cast<limb_type>(carry & ~static_cast<limb_type>(0));\n   carry = x * y + pr[1];\n   pr[1] = static_cast<limb_type>(carry & ~static_cast<limb_type>(0));\n   carry >>= limb_bits;\n   carry += pr[2] + x * z;\n   pr[2] = static_cast<limb_type>(carry & ~static_cast<limb_type>(0));\n   pr[3] = static_cast<limb_type>(carry >> limb_bits);\n#else\n   pr[0] = static_cast<limb_type>(carry);\n   carry >>= limb_bits;\n   carry += w * z;\n   pr[1] = static_cast<limb_type>(carry);\n   carry >>= limb_bits;\n   pr[2] = static_cast<limb_type>(carry);\n   carry = x * y + pr[1];\n   pr[1] = static_cast<limb_type>(carry);\n   carry >>= limb_bits;\n   carry += pr[2] + x * z;\n   pr[2] = static_cast<limb_type>(carry);\n   pr[3] = static_cast<limb_type>(carry >> limb_bits);\n#endif\n   result.sign(false);\n   result.normalize();\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1,\n          std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type\neval_multiply(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n    cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> const& a,\n    cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> const& b)\n{\n   using canonical_type = typename boost::multiprecision::detail::canonical<typename cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>::local_limb_type, cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::type;\n   eval_multiply(result, static_cast<canonical_type>(*a.limbs()), static_cast<canonical_type>(*b.limbs()));\n   result.sign(a.sign() != b.sign());\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class SI>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_signed<SI>::value && boost::multiprecision::detail::is_integral<SI>::value && (sizeof(SI) <= sizeof(signed_double_limb_type) / 2)>::type\neval_multiply(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,\n    SI a, SI b)\n{\n   result = static_cast<signed_double_limb_type>(a) * static_cast<signed_double_limb_type>(b);\n}\n\ntemplate <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class UI>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_unsigned<UI>::value && (sizeof(UI) <= sizeof(signed_double_limb_type) / 2)>::type\neval_multiply(\n    cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,\n    UI a, UI b)\n{\n   result = static_cast<double_limb_type>(a) * static_cast<double_limb_type>(b);\n}\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n}}} // namespace boost::multiprecision::backends\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_int/serialize.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2013 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_CPP_INT_SERIALIZE_HPP\n#define BOOST_MP_CPP_INT_SERIALIZE_HPP\n\n#ifndef BOOST_MP_STANDALONE\n\nnamespace boost {\n\nnamespace archive {\n\nclass binary_oarchive;\nclass binary_iarchive;\n\n} // namespace archive\n\nnamespace serialization {\n\nnamespace mp = boost::multiprecision;\n\nnamespace cpp_int_detail {\n\nusing namespace boost::multiprecision;\nusing namespace boost::multiprecision::backends;\n\ntemplate <class T>\nstruct is_binary_archive : public std::integral_constant<bool, false>\n{};\ntemplate <>\nstruct is_binary_archive<boost::archive::binary_oarchive> : public std::integral_constant<bool, true>\n{};\ntemplate <>\nstruct is_binary_archive<boost::archive::binary_iarchive> : public std::integral_constant<bool, true>\n{};\n\n//\n// We have 8 serialization methods to fill out (and test), they are all permutations of:\n// Load vs Store.\n// Trivial or non-trivial cpp_int type.\n// Binary or not archive.\n//\ntemplate <class Archive, class Int>\nvoid do_serialize(Archive& ar, Int& val, std::integral_constant<bool, false> const&, std::integral_constant<bool, false> const&, std::integral_constant<bool, false> const&)\n{\n   // Load.\n   // Non-trivial.\n   // Non binary.\n\n   using boost::make_nvp;\n   bool        s;\n   ar&         make_nvp(\"sign\", s);\n   std::size_t limb_count;\n   std::size_t byte_count;\n   ar&         make_nvp(\"byte-count\", byte_count);\n   limb_count = byte_count / sizeof(limb_type) + ((byte_count % sizeof(limb_type)) ? 1 : 0);\n   val.resize(limb_count, limb_count);\n   limb_type* pl = val.limbs();\n   for (std::size_t i = 0; i < limb_count; ++i)\n   {\n      pl[i] = 0;\n      for (std::size_t j = 0; (j < sizeof(limb_type)) && byte_count; ++j)\n      {\n         unsigned char byte;\n         ar&           make_nvp(\"byte\", byte);\n         pl[i] |= static_cast<limb_type>(byte) << (j * CHAR_BIT);\n         --byte_count;\n      }\n   }\n   if (s != val.sign())\n      val.negate();\n   val.normalize();\n}\ntemplate <class Archive, class Int>\nvoid do_serialize(Archive& ar, Int& val, std::integral_constant<bool, true> const&, std::integral_constant<bool, false> const&, std::integral_constant<bool, false> const&)\n{\n   // Store.\n   // Non-trivial.\n   // Non binary.\n\n   using boost::make_nvp;\n   bool        s = val.sign();\n   ar&         make_nvp(\"sign\", s);\n   limb_type*  pl         = val.limbs();\n   std::size_t limb_count = val.size();\n   std::size_t byte_count = limb_count * sizeof(limb_type);\n   ar&         make_nvp(\"byte-count\", byte_count);\n\n   for (std::size_t i = 0; i < limb_count; ++i)\n   {\n      limb_type l = pl[i];\n      for (std::size_t j = 0; j < sizeof(limb_type); ++j)\n      {\n         unsigned char byte = static_cast<unsigned char>((l >> (j * CHAR_BIT)) & ((1u << CHAR_BIT) - 1));\n         ar&           make_nvp(\"byte\", byte);\n      }\n   }\n}\ntemplate <class Archive, class Int>\nvoid do_serialize(Archive& ar, Int& val, std::integral_constant<bool, false> const&, std::integral_constant<bool, true> const&, std::integral_constant<bool, false> const&)\n{\n   // Load.\n   // Trivial.\n   // Non binary.\n   using boost::make_nvp;\n   bool                          s;\n   typename Int::local_limb_type l = 0;\n   ar&                           make_nvp(\"sign\", s);\n   std::size_t                   byte_count;\n   ar&                           make_nvp(\"byte-count\", byte_count);\n   for (std::size_t i = 0; i < byte_count; ++i)\n   {\n      unsigned char b;\n      ar&           make_nvp(\"byte\", b);\n      l |= static_cast<typename Int::local_limb_type>(b) << (i * CHAR_BIT);\n   }\n   *val.limbs() = l;\n   if (s != val.sign())\n      val.negate();\n}\ntemplate <class Archive, class Int>\nvoid do_serialize(Archive& ar, Int& val, std::integral_constant<bool, true> const&, std::integral_constant<bool, true> const&, std::integral_constant<bool, false> const&)\n{\n   // Store.\n   // Trivial.\n   // Non binary.\n   using boost::make_nvp;\n   bool                          s = val.sign();\n   typename Int::local_limb_type l = *val.limbs();\n   ar&                           make_nvp(\"sign\", s);\n   std::size_t                   limb_count = sizeof(l);\n   ar&                           make_nvp(\"byte-count\", limb_count);\n   for (std::size_t i = 0; i < limb_count; ++i)\n   {\n      unsigned char b = static_cast<unsigned char>(static_cast<typename Int::local_limb_type>(l >> (i * CHAR_BIT)) & static_cast<typename Int::local_limb_type>((1u << CHAR_BIT) - 1));\n      ar&           make_nvp(\"byte\", b);\n   }\n}\ntemplate <class Archive, class Int>\nvoid do_serialize(Archive& ar, Int& val, std::integral_constant<bool, false> const&, std::integral_constant<bool, false> const&, std::integral_constant<bool, true> const&)\n{\n   // Load.\n   // Non-trivial.\n   // Binary.\n   bool        s;\n   std::size_t c;\n   ar&         s;\n   ar&         c;\n   val.resize(c, c);\n   ar.load_binary(val.limbs(), c * sizeof(limb_type));\n   if (s != val.sign())\n      val.negate();\n   val.normalize();\n}\ntemplate <class Archive, class Int>\nvoid do_serialize(Archive& ar, Int& val, std::integral_constant<bool, true> const&, std::integral_constant<bool, false> const&, std::integral_constant<bool, true> const&)\n{\n   // Store.\n   // Non-trivial.\n   // Binary.\n   bool        s = val.sign();\n   std::size_t c = val.size();\n   ar&         s;\n   ar&         c;\n   ar.save_binary(val.limbs(), c * sizeof(limb_type));\n}\ntemplate <class Archive, class Int>\nvoid do_serialize(Archive& ar, Int& val, std::integral_constant<bool, false> const&, std::integral_constant<bool, true> const&, std::integral_constant<bool, true> const&)\n{\n   // Load.\n   // Trivial.\n   // Binary.\n   bool s;\n   ar&  s;\n   ar.load_binary(val.limbs(), sizeof(*val.limbs()));\n   if (s != val.sign())\n      val.negate();\n}\ntemplate <class Archive, class Int>\nvoid do_serialize(Archive& ar, Int& val, std::integral_constant<bool, true> const&, std::integral_constant<bool, true> const&, std::integral_constant<bool, true> const&)\n{\n   // Store.\n   // Trivial.\n   // Binary.\n   bool s = val.sign();\n   ar&  s;\n   ar.save_binary(val.limbs(), sizeof(*val.limbs()));\n}\n\n} // namespace cpp_int_detail\n\ntemplate <class Archive, std::size_t MinBits, std::size_t MaxBits, mp::cpp_integer_type SignType, mp::cpp_int_check_type Checked, class Allocator>\nvoid serialize(Archive& ar, mp::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& val, const unsigned int /*version*/)\n{\n   using archive_save_tag = typename Archive::is_saving                                ;\n   using save_tag = std::integral_constant<bool, archive_save_tag::value>      ;\n   using trivial_tag = std::integral_constant<bool, mp::backends::is_trivial_cpp_int<mp::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value>;\n   using binary_tag = typename cpp_int_detail::is_binary_archive<Archive>::type  ;\n\n   // Just dispatch to the correct method:\n   cpp_int_detail::do_serialize(ar, val, save_tag(), trivial_tag(), binary_tag());\n}\n\n} // namespace serialization\n} // namespace boost\n\n#endif // BOOST_MP_STANDALONE\n\n#endif // BOOST_MP_CPP_INT_SERIALIZE_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_int/value_pack.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2013 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_CPP_INT_VP_HPP\n#define BOOST_MP_CPP_INT_VP_HPP\n\nnamespace boost {\nnamespace multiprecision {\n\nnamespace literals { namespace detail {\n\ntemplate <limb_type... VALUES>\nstruct value_pack\n{\n   constexpr value_pack() {}\n\n   using next_type = value_pack<0, VALUES...>;\n};\ntemplate <class T>\nstruct is_value_pack\n{\n   static constexpr bool value = false;\n};\ntemplate <limb_type... VALUES>\nstruct is_value_pack<value_pack<VALUES...> >\n{\n   static constexpr bool value = true;\n};\n\nstruct negate_tag\n{};\n\nconstexpr negate_tag make_negate_tag()\n{\n   return negate_tag();\n}\n\n}}}} // namespace boost::multiprecision::literals::detail\n\n#endif // BOOST_MP_CPP_INT_CORE_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/cpp_int.hpp",
    "content": "////////////////////////////////////////////////////////////////\n//  Copyright 2012 - 2022 John Maddock.\n//  Copyright 2022 Christopher Kormanyos.\n//  Distributed under the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt\n//  or copy at https://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_CPP_INT_HPP\n#define BOOST_MP_CPP_INT_HPP\n\n#include <cstdint>\n#include <cstring>\n#include <iostream>\n#include <iomanip>\n#include <type_traits>\n#include <string>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/detail/endian.hpp>\n#include <boost/multiprecision/number.hpp>\n#include <boost/multiprecision/detail/integer_ops.hpp>\n#include <boost/multiprecision/detail/rebind.hpp>\n#include <boost/multiprecision/cpp_int/cpp_int_config.hpp>\n#include <boost/multiprecision/rational_adaptor.hpp>\n#include <boost/multiprecision/traits/is_byte_container.hpp>\n#include <boost/multiprecision/cpp_int/checked.hpp>\n#include <boost/multiprecision/detail/constexpr.hpp>\n#include <boost/multiprecision/detail/float128_functions.hpp>\n#include <boost/multiprecision/cpp_int/value_pack.hpp>\n#include <boost/multiprecision/detail/empty_value.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n#include <boost/multiprecision/detail/fpclassify.hpp>\n\nnamespace boost {\nnamespace multiprecision {\nnamespace backends {\n\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4307) // integral constant overflow (oveflow is in a branch not taken when it would overflow)\n#pragma warning(disable : 4127) // conditional expression is constant\n#pragma warning(disable : 4702) // Unreachable code (reachability depends on template params)\n#endif\n#if defined(__GNUC__) && !defined(__clang__)\n// see https://github.com/boostorg/multiprecision/issues/413\n// and https://github.com/boostorg/multiprecision/issues/431\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wmaybe-uninitialized\"\n#endif\n\ntemplate <std::size_t MinBits = 0, std::size_t MaxBits = 0, boost::multiprecision::cpp_integer_type SignType = signed_magnitude, cpp_int_check_type Checked = unchecked, class Allocator = typename std::conditional<MinBits && (MinBits == MaxBits), void, std::allocator<limb_type> >::type>\nstruct cpp_int_backend;\n\n} // namespace backends\n\nnamespace detail {\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>\nstruct is_byte_container<backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> > : public std::false_type\n{};\n\n} // namespace detail\n\nnamespace backends {\n\nnamespace detail {\n   template <std::size_t Value1, std::size_t Value2>\n   struct static_unsigned_max\n   {\n      static constexpr std::size_t value = (Value1 > Value2) ? Value1 : Value2;\n   };\n} // Namespace detail\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, bool trivial = false>\nstruct cpp_int_base;\n//\n// Traits class determines the maximum and minimum precision values:\n//\ntemplate <class T>\nstruct max_precision;\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>\nstruct max_precision<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >\n{\n   static constexpr std::size_t value = std::is_void<Allocator>::value ? detail::static_unsigned_max<MinBits, MaxBits>::value\n                                                                       : (((MaxBits >= MinBits) && MaxBits) ? MaxBits : SIZE_MAX);\n};\n\ntemplate <class T>\nstruct min_precision;\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>\nstruct min_precision<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >\n{\n   static constexpr std::size_t value = (std::is_void<Allocator>::value ? detail::static_unsigned_max<MinBits, MaxBits>::value : MinBits);\n};\n//\n// Traits class determines whether the number of bits precision requested could fit in a native type,\n// we call this a \"trivial\" cpp_int:\n//\ntemplate <class T>\nstruct is_trivial_cpp_int\n{\n   static constexpr bool value = false;\n};\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>\nstruct is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >\n{\n   using self = cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>;\n   static constexpr bool value = std::is_void<Allocator>::value && (max_precision<self>::value <= (sizeof(double_limb_type) * CHAR_BIT) - (SignType == signed_packed ? 1 : 0));\n};\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>\nstruct is_trivial_cpp_int<cpp_int_base<MinBits, MaxBits, SignType, Checked, Allocator, true> >\n{\n   static constexpr bool value = true;\n};\n\n} // namespace backends\n//\n// Traits class to determine whether a cpp_int_backend is signed or not:\n//\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>\nstruct is_unsigned_number<backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >\n    : public std::integral_constant<bool, (SignType == unsigned_magnitude) || (SignType == unsigned_packed)>\n{};\n\nnamespace backends {\n//\n// Traits class determines whether T should be implicitly convertible to U, or\n// whether the constructor should be made explicit.  The latter happens if we\n// are losing the sign, or have fewer digits precision in the target type:\n//\ntemplate <class T, class U>\nstruct is_implicit_cpp_int_conversion;\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nstruct is_implicit_cpp_int_conversion<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >\n{\n   using t1 = cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>;\n   using t2 = cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>;\n   static constexpr bool value =\n       (is_signed_number<t2>::value || !is_signed_number<t1>::value) && (max_precision<t1>::value <= max_precision<t2>::value);\n};\n\n//\n// Traits class to determine whether operations on a cpp_int may throw:\n//\ntemplate <class T>\nstruct is_non_throwing_cpp_int : public std::integral_constant<bool, false>\n{};\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType>\nstruct is_non_throwing_cpp_int<cpp_int_backend<MinBits, MaxBits, SignType, unchecked, void> > : public std::integral_constant<bool, true>\n{};\n\n//\n// Traits class, determines whether the cpp_int is fixed precision or not:\n//\ntemplate <class T>\nstruct is_fixed_precision;\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>\nstruct is_fixed_precision<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >\n    : public std::integral_constant<bool, max_precision<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value != SIZE_MAX>\n{};\n\nnamespace detail {\n\ninline BOOST_MP_CXX14_CONSTEXPR void verify_new_size(std::size_t new_size, std::size_t min_size, const std::integral_constant<int, checked>&)\n{\n   if (new_size < min_size)\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Unable to allocate sufficient storage for the value of the result: value overflows the maximum allowable magnitude.\"));\n}\ninline BOOST_MP_CXX14_CONSTEXPR void verify_new_size(std::size_t /*new_size*/, std::size_t /*min_size*/, const std::integral_constant<int, unchecked>&) {}\n\ntemplate <class U>\ninline BOOST_MP_CXX14_CONSTEXPR void verify_limb_mask(bool b, U limb, U mask, const std::integral_constant<int, checked>&)\n{\n   // When we mask out \"limb\" with \"mask\", do we loose bits?  If so it's an overflow error:\n   if (b && (limb & ~mask))\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Overflow in cpp_int arithmetic: there is insufficient precision in the target type to hold all of the bits of the result.\"));\n}\ntemplate <class U>\ninline BOOST_MP_CXX14_CONSTEXPR void verify_limb_mask(bool /*b*/, U /*limb*/, U /*mask*/, const std::integral_constant<int, unchecked>&) {}\n\n} // namespace detail\n\n//\n// Now define the various data layouts that are possible as partial specializations of the base class,\n// starting with the default arbitrary precision signed integer type:\n//\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>\nstruct cpp_int_base<MinBits, MaxBits, signed_magnitude, Checked, Allocator, false>\n    : private boost::multiprecision::detail::empty_value<typename detail::rebind<limb_type, Allocator>::type>\n{\n   template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, bool trivial2>\n   friend struct cpp_int_base;\n\n   using allocator_type = typename detail::rebind<limb_type, Allocator>::type;\n   using limb_pointer = typename std::allocator_traits<allocator_type>::pointer      ;\n   using const_limb_pointer = typename std::allocator_traits<allocator_type>::const_pointer;\n   using checked_type = std::integral_constant<int, Checked>;\n\n   //\n   // Interface invariants:\n   //\n   static_assert(!std::is_void<Allocator>::value, \"Allocator must not be void here\");\n\n   using base_type = boost::multiprecision::detail::empty_value<allocator_type>;\n\nprivate:\n   struct limb_data\n   {\n      std::size_t        capacity;\n      limb_pointer    data;\n   };\n\n public:\n   static constexpr std::size_t limb_bits           = sizeof(limb_type) * CHAR_BIT;\n   static constexpr limb_type   max_limb_value      = ~static_cast<limb_type>(0u);\n   static constexpr limb_type   sign_bit_mask       = static_cast<limb_type>(1u) << (limb_bits - 1);\n   static constexpr std::size_t internal_limb_count =\n                                       MinBits\n                                           ? (MinBits / limb_bits + ((MinBits % limb_bits) ? 1 : 0))\n                                           : (sizeof(limb_data) / sizeof(limb_type)) > 1 ? (sizeof(limb_data) / sizeof(limb_type)) : 2;\n private:\n   union data_type\n   {\n      limb_data        ld;\n      limb_type        la[internal_limb_count];\n      limb_type        first;\n      double_limb_type double_first;\n\n      constexpr data_type() noexcept : first(0) {}\n      constexpr data_type(limb_type i) noexcept : first(i) {}\n      constexpr data_type(signed_limb_type i) noexcept : first(static_cast<limb_type>(boost::multiprecision::detail::unsigned_abs(i))) {}\n#if BOOST_MP_ENDIAN_LITTLE_BYTE\n      constexpr data_type(double_limb_type i) noexcept : double_first(i)\n      {}\n      constexpr data_type(signed_double_limb_type i) noexcept : double_first(static_cast<double_limb_type>(boost::multiprecision::detail::unsigned_abs(i))) {}\n#endif\n#if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) && !(defined(BOOST_MSVC) && (BOOST_MSVC < 1900))\n      constexpr data_type(limb_type* limbs, std::size_t len) noexcept : ld{ len, limbs }\n      {}\n#else\n      constexpr data_type(limb_type* limbs, std::size_t len) noexcept\n      {\n         ld.capacity = len;\n         ld.data = limbs;\n      }\n#endif\n   };\n\n   data_type m_data;\n   std::size_t  m_limbs;\n   bool      m_sign, m_internal, m_alias;\n\n public:\n   //\n   // Direct construction:\n   //\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(limb_type i) noexcept\n       : m_data(i),\n         m_limbs(1),\n         m_sign(false),\n         m_internal(true),\n         m_alias(false) {}\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(signed_limb_type i) noexcept\n       : m_data(i),\n         m_limbs(1),\n         m_sign(i < 0),\n         m_internal(true),\n         m_alias(false) {}\n#if BOOST_MP_ENDIAN_LITTLE_BYTE && !defined(BOOST_MP_TEST_NO_LE)\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(double_limb_type i) noexcept\n       : m_data(i),\n         m_limbs(i > max_limb_value ? 2 : 1),\n         m_sign(false),\n         m_internal(true),\n         m_alias(false)\n   {}\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(signed_double_limb_type i) noexcept\n       : m_data(i),\n         m_limbs(i < 0 ? (static_cast<double_limb_type>(boost::multiprecision::detail::unsigned_abs(i)) > static_cast<double_limb_type>(max_limb_value) ? 2 : 1) : (i > max_limb_value ? 2 : 1)),\n         m_sign(i < 0),\n         m_internal(true),\n         m_alias(false) {}\n#endif\n   //\n   // Aliasing constructor aliases data:\n   //\n   struct scoped_shared_storage : private boost::multiprecision::detail::empty_value<allocator_type>\n   {\n    private:\n      limb_type*      data;\n      std::size_t        capacity;\n      std::size_t        allocated;\n      bool            is_alias;\n      allocator_type& allocator() noexcept { return boost::multiprecision::detail::empty_value<allocator_type>::get(); }\n\n    public:\n      scoped_shared_storage(const allocator_type& a, std::size_t len)\n          : boost::multiprecision::detail::empty_value<allocator_type>(boost::multiprecision::detail::empty_init_t(), a), capacity(len), allocated(0), is_alias(false)\n      {\n         data = allocator().allocate(len);\n      }\n      scoped_shared_storage(const cpp_int_base& i, std::size_t len)\n          : boost::multiprecision::detail::empty_value<allocator_type>(boost::multiprecision::detail::empty_init_t(), i.allocator()), capacity(len), allocated(0), is_alias(false)\n      {\n         data = allocator().allocate(len);\n      }\n      scoped_shared_storage(limb_type* limbs, std::size_t n) : data(limbs), capacity(n), allocated(0), is_alias(true) {}\n      ~scoped_shared_storage()\n      {\n         if(!is_alias)\n            allocator().deallocate(data, capacity);\n      }\n      limb_type* allocate(std::size_t n) noexcept \n      {\n         limb_type* result = data + allocated;\n         allocated += n;\n         BOOST_MP_ASSERT(allocated <= capacity);\n         return result; \n      }\n      void deallocate(std::size_t n)\n      {\n         BOOST_MP_ASSERT(n <= allocated);\n         allocated -= n;\n      }\n   };\n   explicit constexpr cpp_int_base(limb_type* data, std::size_t offset, std::size_t len) noexcept\n       : m_data(data + offset, len),\n         m_limbs(len),\n         m_sign(false),\n         m_internal(false),\n         m_alias(true) {}\n   // This next constructor is for constructing const objects from const limb_type*'s only.\n   // Unfortunately we appear to have no way to assert that within the language, and the const_cast\n   // is a side effect of that :(\n   explicit constexpr cpp_int_base(const limb_type* data, std::size_t offset, std::size_t len) noexcept\n       : m_data(const_cast<limb_type*>(data) + offset, len),\n         m_limbs(len),\n         m_sign(false),\n         m_internal(false),\n         m_alias(true) {}\n   explicit cpp_int_base(scoped_shared_storage& data, std::size_t len) noexcept\n       : m_data(data.allocate(len), len),\n         m_limbs(len),\n         m_sign(false),\n         m_internal(false),\n         m_alias(true) {}\n   //\n   // Helper functions for getting at our internal data, and manipulating storage:\n   //\n   BOOST_MP_FORCEINLINE allocator_type&       allocator() noexcept { return base_type::get(); }\n   BOOST_MP_FORCEINLINE const allocator_type& allocator() const noexcept { return base_type::get(); }\n   BOOST_MP_FORCEINLINE std::size_t              size() const noexcept { return m_limbs; }\n   BOOST_MP_FORCEINLINE limb_pointer          limbs() noexcept { return m_internal ? m_data.la : m_data.ld.data; }\n   BOOST_MP_FORCEINLINE const_limb_pointer    limbs() const noexcept { return m_internal ? m_data.la : m_data.ld.data; }\n   BOOST_MP_FORCEINLINE std::size_t              capacity() const noexcept { return m_internal ? internal_limb_count : m_data.ld.capacity; }\n   BOOST_MP_FORCEINLINE bool                  sign() const noexcept { return m_sign; }\n   void                                       sign(bool b) noexcept\n   {\n      m_sign = b;\n      // Check for zero value:\n      if (m_sign && (m_limbs == 1))\n      {\n         if (limbs()[0] == 0)\n            m_sign = false;\n      }\n   }\n   void resize(std::size_t new_size, std::size_t min_size)\n   {\n      constexpr std::size_t max_limbs = MaxBits / (CHAR_BIT * sizeof(limb_type)) + ((MaxBits % (CHAR_BIT * sizeof(limb_type))) ? 1 : 0);\n      // We never resize beyond MaxSize:\n      if (new_size > max_limbs)\n         new_size = max_limbs;\n      detail::verify_new_size(new_size, min_size, checked_type());\n      // See if we have enough capacity already:\n      std::size_t cap = capacity();\n      if (new_size > cap)\n      {\n         // We must not be an alias, memory allocation here defeats the whole point of aliasing:\n         BOOST_MP_ASSERT(!m_alias);\n         // Allocate a new buffer and copy everything over:\n         cap             = (std::min)((std::max)(cap * 4, new_size), max_limbs);\n         limb_pointer pl = allocator().allocate(cap);\n         std::memcpy(pl, limbs(), size() * sizeof(limbs()[0]));\n         if (!m_internal && !m_alias)\n            allocator().deallocate(limbs(), capacity());\n         else\n            m_internal = false;\n         m_limbs            = new_size;\n         m_data.ld.capacity = cap;\n         m_data.ld.data     = pl;\n      }\n      else\n      {\n         m_limbs = new_size;\n      }\n   }\n   BOOST_MP_FORCEINLINE void normalize() noexcept\n   {\n      limb_pointer p = limbs();\n      while ((m_limbs - 1) && !p[m_limbs - 1])\n         --m_limbs;\n   }\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base() noexcept : m_data(), m_limbs(1), m_sign(false), m_internal(true), m_alias(false){}\n   BOOST_MP_FORCEINLINE                 cpp_int_base(const cpp_int_base& o) : base_type(o), m_limbs(o.m_alias ? o.m_limbs : 0), m_sign(o.m_sign), m_internal(o.m_alias ? false : true), m_alias(o.m_alias)\n   {\n      if (m_alias)\n      {\n         m_data.ld = o.m_data.ld;\n      }\n      else\n      {\n         resize(o.size(), o.size());\n         std::memcpy(limbs(), o.limbs(), o.size() * sizeof(limbs()[0]));\n      }\n   }\n   // rvalue copy:\n   cpp_int_base(cpp_int_base&& o)\n      : base_type(static_cast<base_type&&>(o)), m_limbs(o.m_limbs), m_sign(o.m_sign), m_internal(o.m_internal), m_alias(o.m_alias)\n   {\n      if (m_internal)\n      {\n         std::memcpy(limbs(), o.limbs(), o.size() * sizeof(limbs()[0]));\n      }\n      else\n      {\n         m_data.ld = o.m_data.ld;\n         o.m_limbs = 0;\n         o.m_internal = true;\n      }\n   }\n   cpp_int_base& operator=(cpp_int_base&& o) noexcept\n   {\n      if (!m_internal && !m_alias)\n         allocator().deallocate(m_data.ld.data, m_data.ld.capacity);\n      *static_cast<base_type*>(this) = static_cast<base_type&&>(o);\n      m_limbs = o.m_limbs;\n      m_sign = o.m_sign;\n      m_internal = o.m_internal;\n      m_alias = o.m_alias;\n      if (m_internal)\n      {\n         std::memcpy(limbs(), o.limbs(), o.size() * sizeof(limbs()[0]));\n      }\n      else\n      {\n         m_data.ld = o.m_data.ld;\n         o.m_limbs = 0;\n         o.m_internal = true;\n      }\n      return *this;\n   }\n   template <std::size_t MinBits2, std::size_t MaxBits2, cpp_int_check_type Checked2>\n   cpp_int_base& operator=(cpp_int_base<MinBits2, MaxBits2, signed_magnitude, Checked2, Allocator>&& o) noexcept\n   {\n      if(o.m_internal)\n      {\n         m_sign = o.m_sign;\n         this->resize(o.size(), o.size());\n         std::memcpy(this->limbs(), o.limbs(), o.size() * sizeof(*(o.limbs())));\n         return *this;\n      }\n      if (!m_internal && !m_alias)\n         allocator().deallocate(m_data.ld.data, m_data.ld.capacity);\n      *static_cast<base_type*>(this) = static_cast<typename cpp_int_base<MinBits2, MaxBits2, signed_magnitude, Checked2, Allocator>::base_type&&>(o);\n      m_limbs                        = o.m_limbs;\n      m_sign                         = o.m_sign;\n      m_internal                     = o.m_internal;\n      m_alias                        = o.m_alias;\n      m_data.ld.capacity             = o.m_data.ld.capacity;\n      m_data.ld.data                 = o.limbs();\n      o.m_limbs                      = 0;\n      o.m_internal                   = true;\n      return *this;\n   }\n   BOOST_MP_FORCEINLINE ~cpp_int_base() noexcept\n   {\n      if (!m_internal && !m_alias)\n         allocator().deallocate(limbs(), capacity());\n   }\n   void assign(const cpp_int_base& o)\n   {\n      if (this != &o)\n      {\n         static_cast<base_type&>(*this) = static_cast<const base_type&>(o);\n         m_limbs                        = 0;\n         resize(o.size(), o.size());\n         std::memcpy(limbs(), o.limbs(), o.size() * sizeof(limbs()[0]));\n         m_sign = o.m_sign;\n      }\n   }\n   BOOST_MP_FORCEINLINE void negate() noexcept\n   {\n      m_sign = !m_sign;\n      // Check for zero value:\n      if (m_sign && (m_limbs == 1))\n      {\n         if (limbs()[0] == 0)\n            m_sign = false;\n      }\n   }\n   BOOST_MP_FORCEINLINE bool isneg() const noexcept\n   {\n      return m_sign;\n   }\n   BOOST_MP_FORCEINLINE void do_swap(cpp_int_base& o) noexcept\n   {\n      std::swap(m_data, o.m_data);\n      std::swap(m_sign, o.m_sign);\n      std::swap(m_internal, o.m_internal);\n      std::swap(m_limbs, o.m_limbs);\n      std::swap(m_alias, o.m_alias);\n   }\n\n protected:\n   template <class A>\n   void check_in_range(const A&) noexcept {}\n};\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>\nconstexpr std::size_t cpp_int_base<MinBits, MaxBits, signed_magnitude, Checked, Allocator, false>::limb_bits;\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>\nconstexpr limb_type cpp_int_base<MinBits, MaxBits, signed_magnitude, Checked, Allocator, false>::max_limb_value;\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>\nconstexpr limb_type cpp_int_base<MinBits, MaxBits, signed_magnitude, Checked, Allocator, false>::sign_bit_mask;\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>\nconstexpr std::size_t cpp_int_base<MinBits, MaxBits, signed_magnitude, Checked, Allocator, false>::internal_limb_count;\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>\nstruct cpp_int_base<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator, false>\n    : private boost::multiprecision::detail::empty_value<typename detail::rebind<limb_type, Allocator>::type>\n{\n   //\n   // There is currently no support for unsigned arbitrary precision arithmetic, largely\n   // because it's not clear what subtraction should do:\n   //\n   static_assert(((sizeof(Allocator) == 0) && !std::is_void<Allocator>::value), \"There is curently no support for unsigned arbitrary precision integers.\");\n};\n//\n// Fixed precision (i.e. no allocator), signed-magnitude type with limb-usage count:\n//\ntemplate <std::size_t MinBits, cpp_int_check_type Checked>\nstruct cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, false>\n{\n   using limb_pointer = limb_type*        ;\n   using const_limb_pointer = const limb_type*  ;\n   using checked_type = std::integral_constant<int, Checked>;\n\n   struct scoped_shared_storage \n   {\n      BOOST_MP_CXX14_CONSTEXPR  scoped_shared_storage(const cpp_int_base&, std::size_t) {}\n      BOOST_MP_CXX14_CONSTEXPR void deallocate(std::size_t) {}\n   };\n\n   //\n   // Interface invariants:\n   //\n   static_assert(MinBits > sizeof(double_limb_type) * CHAR_BIT, \"Template parameter MinBits is inconsistent with the parameter trivial - did you mistakingly try to override the trivial parameter?\");\n\n public:\n   static constexpr std::size_t limb_bits = sizeof(limb_type) * CHAR_BIT;\n   static constexpr limb_type max_limb_value = ~static_cast<limb_type>(0u);\n   static constexpr limb_type sign_bit_mask = static_cast<limb_type>(1u) << (limb_bits - 1);\n   static constexpr std::size_t  internal_limb_count = MinBits / limb_bits + ((MinBits % limb_bits) ? 1 : 0);\n   static constexpr limb_type upper_limb_mask = (MinBits % limb_bits) ? (limb_type(1) << (MinBits % limb_bits)) - 1 : (~limb_type(0));\n   static_assert(internal_limb_count >= 2, \"A fixed precision integer type must have at least 2 limbs\");\n\n private:\n   union data_type\n   {\n      limb_type        m_data[internal_limb_count];\n      limb_type        m_first_limb;\n      double_limb_type m_double_first_limb;\n\n      constexpr data_type()\n          : m_data{0}\n      {}\n      constexpr data_type(limb_type i)\n          : m_data{i}\n      {}\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n      constexpr data_type(limb_type i, limb_type j) : m_data{i, j}\n      {}\n#endif\n      constexpr data_type(double_limb_type i) : m_double_first_limb(i)\n      {\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n         if (BOOST_MP_IS_CONST_EVALUATED(m_double_first_limb))\n         {\n            data_type t(static_cast<limb_type>(i & max_limb_value), static_cast<limb_type>(i >> limb_bits));\n            *this = t;\n         }\n#endif\n      }\n      template <limb_type... VALUES>\n      constexpr data_type(literals::detail::value_pack<VALUES...>) : m_data{VALUES...}\n      {}\n   } m_wrapper;\n   std::uint16_t m_limbs;\n   bool            m_sign;\n\n public:\n   //\n   // Direct construction:\n   //\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(limb_type i) noexcept\n       : m_wrapper(i),\n         m_limbs(1),\n         m_sign(false) {}\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(signed_limb_type i) noexcept\n       : m_wrapper(limb_type(i < 0 ? static_cast<limb_type>(-static_cast<signed_double_limb_type>(i)) : i)),\n         m_limbs(1),\n         m_sign(i < 0) {}\n#if BOOST_MP_ENDIAN_LITTLE_BYTE && !defined(BOOST_MP_TEST_NO_LE)\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(double_limb_type i) noexcept\n       : m_wrapper(i),\n         m_limbs(i > max_limb_value ? 2 : 1),\n         m_sign(false)\n   {}\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(signed_double_limb_type i) noexcept\n       : m_wrapper(double_limb_type(i < 0 ? static_cast<double_limb_type>(boost::multiprecision::detail::unsigned_abs(i)) : i)),\n         m_limbs(i < 0 ? (static_cast<double_limb_type>(boost::multiprecision::detail::unsigned_abs(i)) > max_limb_value ? 2 : 1) : (i > max_limb_value ? 2 : 1)),\n         m_sign(i < 0) {}\n#endif\n   template <limb_type... VALUES>\n   constexpr cpp_int_base(literals::detail::value_pack<VALUES...> i)\n       : m_wrapper(i), m_limbs(sizeof...(VALUES)), m_sign(false)\n   {}\n   constexpr cpp_int_base(literals::detail::value_pack<> i)\n       : m_wrapper(i), m_limbs(1), m_sign(false) {}\n   constexpr cpp_int_base(const cpp_int_base& a, const literals::detail::negate_tag&)\n       : m_wrapper(a.m_wrapper), m_limbs(a.m_limbs), m_sign((a.m_limbs == 1) && (*a.limbs() == 0) ? false : !a.m_sign) {}\n   explicit constexpr cpp_int_base(scoped_shared_storage&, std::size_t) noexcept : m_wrapper(), m_limbs(0), m_sign(false)\n   {}\n   //\n   // These are deprecated in C++20 unless we make them explicit:\n   //\n   BOOST_MP_CXX14_CONSTEXPR cpp_int_base& operator=(const cpp_int_base&) = default;\n   //\n   // Helper functions for getting at our internal data, and manipulating storage:\n   //\n   BOOST_MP_FORCEINLINE constexpr std::size_t              size() const noexcept { return m_limbs; }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR limb_pointer limbs() noexcept { return m_wrapper.m_data; }\n   BOOST_MP_FORCEINLINE constexpr const_limb_pointer    limbs() const noexcept { return m_wrapper.m_data; }\n   BOOST_MP_FORCEINLINE constexpr bool                  sign() const noexcept { return m_sign; }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void         sign(bool b) noexcept\n   {\n      m_sign = b;\n      // Check for zero value:\n      if (m_sign && (m_limbs == 1))\n      {\n         if (limbs()[0] == 0)\n            m_sign = false;\n      }\n   }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void resize(std::size_t new_size, std::size_t min_size) noexcept((Checked == unchecked))\n   {\n      m_limbs = static_cast<std::uint16_t>((std::min)(new_size, internal_limb_count));\n      detail::verify_new_size(m_limbs, min_size, checked_type());\n   }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void normalize() noexcept((Checked == unchecked))\n   {\n      limb_pointer p = limbs();\n      detail::verify_limb_mask(m_limbs == internal_limb_count, p[m_limbs - 1], upper_limb_mask, checked_type());\n      p[internal_limb_count - 1] &= upper_limb_mask;\n      while ((m_limbs - 1) && !p[m_limbs - 1])\n         --m_limbs;\n      if ((m_limbs == 1) && (!*p))\n         m_sign = false; // zero is always unsigned\n   }\n\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base() noexcept : m_wrapper(limb_type(0u)), m_limbs(1), m_sign(false) {}\n   // Not defaulted, it breaks constexpr support in the Intel compiler for some reason:\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(const cpp_int_base& o) noexcept\n       : m_wrapper(o.m_wrapper),\n         m_limbs(o.m_limbs),\n         m_sign(o.m_sign) {}\n   // Defaulted functions:\n   //~cpp_int_base() noexcept {}\n\n   void BOOST_MP_CXX14_CONSTEXPR assign(const cpp_int_base& o) noexcept\n   {\n      if (this != &o)\n      {\n         m_limbs = o.m_limbs;\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n         if (BOOST_MP_IS_CONST_EVALUATED(m_limbs))\n         {\n            for (std::size_t i = 0; i < m_limbs; ++i)\n               limbs()[i] = o.limbs()[i];\n         }\n         else\n#endif\n            std::memcpy(limbs(), o.limbs(), o.size() * sizeof(o.limbs()[0]));\n         m_sign = o.m_sign;\n      }\n   }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void negate() noexcept\n   {\n      m_sign = !m_sign;\n      // Check for zero value:\n      if (m_sign && (m_limbs == 1))\n      {\n         if (limbs()[0] == 0)\n            m_sign = false;\n      }\n   }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR bool isneg() const noexcept\n   {\n      return m_sign;\n   }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void do_swap(cpp_int_base& o) noexcept\n   {\n      for (std::size_t i = 0; i < (std::max)(size(), o.size()); ++i)\n         std_constexpr::swap(m_wrapper.m_data[i], o.m_wrapper.m_data[i]);\n      std_constexpr::swap(m_sign, o.m_sign);\n      std_constexpr::swap(m_limbs, o.m_limbs);\n   }\n\n protected:\n   template <class A>\n   BOOST_MP_CXX14_CONSTEXPR void check_in_range(const A&) noexcept {}\n};\n\ntemplate <std::size_t MinBits, cpp_int_check_type Checked>\nconstexpr std::size_t cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, false>::limb_bits;\ntemplate <std::size_t MinBits, cpp_int_check_type Checked>\nconstexpr limb_type cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, false>::max_limb_value;\ntemplate <std::size_t MinBits, cpp_int_check_type Checked>\nconstexpr limb_type cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, false>::sign_bit_mask;\ntemplate <std::size_t MinBits, cpp_int_check_type Checked>\nconstexpr std::size_t cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, false>::internal_limb_count;\n//\n// Fixed precision (i.e. no allocator), unsigned type with limb-usage count:\n//\ntemplate <std::size_t MinBits, cpp_int_check_type Checked>\nstruct cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>\n{\n   using limb_pointer = limb_type*        ;\n   using const_limb_pointer = const limb_type*  ;\n   using checked_type = std::integral_constant<int, Checked>;\n\n   struct scoped_shared_storage \n   {\n      BOOST_MP_CXX14_CONSTEXPR scoped_shared_storage(const cpp_int_base&, std::size_t) {}\n      BOOST_MP_CXX14_CONSTEXPR void deallocate(std::size_t) {}\n   };\n   //\n   // Interface invariants:\n   //\n   static_assert(MinBits > sizeof(double_limb_type) * CHAR_BIT, \"Template parameter MinBits is inconsistent with the parameter trivial - did you mistakingly try to override the trivial parameter?\");\n\n public:\n   static constexpr std::size_t limb_bits = sizeof(limb_type) * CHAR_BIT;\n   static constexpr limb_type max_limb_value = ~static_cast<limb_type>(0u);\n   static constexpr limb_type sign_bit_mask = static_cast<limb_type>(1u) << (limb_bits - 1);\n   static constexpr std::size_t internal_limb_count = MinBits / limb_bits + ((MinBits % limb_bits) ? 1 : 0);\n   static constexpr limb_type upper_limb_mask = (MinBits % limb_bits) ? (limb_type(1) << (MinBits % limb_bits)) - 1 : (~limb_type(0));\n   static_assert(internal_limb_count >= 2, \"A fixed precision integer type must have at least 2 limbs\");\n\n private:\n   union data_type\n   {\n      limb_type        m_data[internal_limb_count];\n      limb_type        m_first_limb;\n      double_limb_type m_double_first_limb;\n\n      constexpr data_type()\n          : m_data{0}\n      {}\n      constexpr data_type(limb_type i)\n          : m_data{i}\n      {}\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n      constexpr data_type(limb_type i, limb_type j) : m_data{i, j}\n      {}\n#endif\n      constexpr data_type(double_limb_type i) : m_double_first_limb(i)\n      {\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n         if (BOOST_MP_IS_CONST_EVALUATED(m_double_first_limb))\n         {\n            data_type t(static_cast<limb_type>(i & max_limb_value), static_cast<limb_type>(i >> limb_bits));\n            *this = t;\n         }\n#endif\n      }\n      template <limb_type... VALUES>\n      constexpr data_type(literals::detail::value_pack<VALUES...>) : m_data{VALUES...}\n      {}\n   } m_wrapper;\n   std::size_t m_limbs;\n\n public:\n   //\n   // Direct construction:\n   //\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(limb_type i) noexcept\n       : m_wrapper(i),\n         m_limbs(1) {}\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR cpp_int_base(signed_limb_type i) noexcept((Checked == unchecked))\n       : m_wrapper(static_cast<limb_type>(boost::multiprecision::detail::unsigned_abs(i))),\n         m_limbs(1)\n   {\n      if (i < 0)\n         negate();\n   }\n#if BOOST_MP_ENDIAN_LITTLE_BYTE && !defined(BOOST_MP_TEST_NO_LE)\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(double_limb_type i) noexcept\n       : m_wrapper(i),\n         m_limbs(i > max_limb_value ? 2 : 1)\n   {}\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR cpp_int_base(signed_double_limb_type i) noexcept((Checked == unchecked))\n       : m_wrapper(double_limb_type(i < 0 ? static_cast<double_limb_type>(boost::multiprecision::detail::unsigned_abs(i)) : i)),\n         m_limbs(i < 0 ? (static_cast<double_limb_type>(boost::multiprecision::detail::unsigned_abs(i)) > max_limb_value ? 2 : 1) : (i > max_limb_value ? 2 : 1))\n   {\n      if (i < 0)\n         negate();\n   }\n#endif\n   template <limb_type... VALUES>\n   constexpr cpp_int_base(literals::detail::value_pack<VALUES...> i)\n       : m_wrapper(i), m_limbs(sizeof...(VALUES))\n   {}\n   constexpr cpp_int_base(literals::detail::value_pack<>)\n       : m_wrapper(static_cast<limb_type>(0u)), m_limbs(1) {}\n   explicit constexpr cpp_int_base(scoped_shared_storage&, std::size_t) noexcept : m_wrapper(), m_limbs(1)\n   {}\n       //\n   // Helper functions for getting at our internal data, and manipulating storage:\n   //\n   BOOST_MP_FORCEINLINE constexpr std::size_t              size() const noexcept { return m_limbs; }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR limb_pointer limbs() noexcept { return m_wrapper.m_data; }\n   BOOST_MP_FORCEINLINE constexpr const_limb_pointer    limbs() const noexcept { return m_wrapper.m_data; }\n   BOOST_MP_FORCEINLINE constexpr bool                  sign() const noexcept { return false; }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void         sign(bool b) noexcept((Checked == unchecked))\n   {\n      if (b)\n         negate();\n   }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void resize(std::size_t new_size, std::size_t min_size) noexcept((Checked == unchecked))\n   {\n      m_limbs = (std::min)(new_size, internal_limb_count);\n      detail::verify_new_size(m_limbs, min_size, checked_type());\n   }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void normalize() noexcept((Checked == unchecked))\n   {\n      limb_pointer p = limbs();\n      detail::verify_limb_mask(m_limbs == internal_limb_count, p[internal_limb_count - 1], upper_limb_mask, checked_type());\n      p[internal_limb_count - 1] &= upper_limb_mask;\n      while ((m_limbs - 1) && !p[m_limbs - 1])\n         --m_limbs;\n   }\n\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base() noexcept\n       : m_wrapper(limb_type(0u)),\n         m_limbs(1) {}\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(const cpp_int_base& o) noexcept\n       : m_wrapper(o.m_wrapper),\n         m_limbs(o.m_limbs) {}\n   // Defaulted functions:\n   //~cpp_int_base() noexcept {}\n   //\n   // These are deprecated in C++20 unless we make them explicit:\n   //\n   BOOST_MP_CXX14_CONSTEXPR cpp_int_base& operator=(const cpp_int_base&) = default;\n\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void assign(const cpp_int_base& o) noexcept\n   {\n      if (this != &o)\n      {\n         m_limbs = o.m_limbs;\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n         if (BOOST_MP_IS_CONST_EVALUATED(m_limbs))\n         {\n            for (std::size_t i = 0; i < m_limbs; ++i)\n               limbs()[i] = o.limbs()[i];\n         }\n         else\n#endif\n            std::memcpy(limbs(), o.limbs(), o.size() * sizeof(limbs()[0]));\n      }\n   }\n\n private:\n   void check_negate(const std::integral_constant<int, checked>&)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::range_error(\"Attempt to negate an unsigned number.\"));\n   }\n   BOOST_MP_CXX14_CONSTEXPR void check_negate(const std::integral_constant<int, unchecked>&) {}\n\n public:\n   BOOST_MP_CXX14_CONSTEXPR void negate() noexcept((Checked == unchecked))\n   {\n      // Not so much a negate as a complement - this gets called when subtraction\n      // would result in a \"negative\" number:\n      if ((m_limbs == 1) && (m_wrapper.m_data[0] == 0))\n         return; // negating zero is always zero, and always OK.\n      check_negate(checked_type());\n      std::size_t i = m_limbs;\n      for (; i < internal_limb_count; ++i)\n         m_wrapper.m_data[i] = 0;\n      m_limbs = internal_limb_count;\n      for (i = 0; i < internal_limb_count; ++i)\n         m_wrapper.m_data[i] = ~m_wrapper.m_data[i];\n      normalize();\n      eval_increment(static_cast<cpp_int_backend<MinBits, MinBits, unsigned_magnitude, Checked, void>&>(*this));\n   }\n   BOOST_MP_FORCEINLINE constexpr bool isneg() const noexcept\n   {\n      return false;\n   }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void do_swap(cpp_int_base& o) noexcept\n   {\n      for (std::size_t i = 0; i < (std::max)(size(), o.size()); ++i)\n         std_constexpr::swap(m_wrapper.m_data[i], o.m_wrapper.m_data[i]);\n      std_constexpr::swap(m_limbs, o.m_limbs);\n   }\n\n protected:\n   template <class A>\n   BOOST_MP_CXX14_CONSTEXPR void check_in_range(const A&) noexcept {}\n};\n\ntemplate <std::size_t MinBits, cpp_int_check_type Checked>\nconstexpr std::size_t cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>::limb_bits;\ntemplate <std::size_t MinBits, cpp_int_check_type Checked>\nconstexpr limb_type cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>::max_limb_value;\ntemplate <std::size_t MinBits, cpp_int_check_type Checked>\nconstexpr limb_type cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>::sign_bit_mask;\ntemplate <std::size_t MinBits, cpp_int_check_type Checked>\nconstexpr std::size_t cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>::internal_limb_count;\n//\n// Traits classes to figure out a native type with N bits, these vary from boost::uint_t<N> only\n// because some platforms have native integer types longer than long long, \"really long long\" anyone??\n//\ntemplate <unsigned N, bool s>\nstruct trivial_limb_type_imp\n{\n   using type = double_limb_type;\n};\n\ntemplate <unsigned N>\nstruct trivial_limb_type_imp<N, true>\n{\n   using type = typename boost::multiprecision::detail::uint_t<N>::least;\n};\n\ntemplate <unsigned N>\nstruct trivial_limb_type : public trivial_limb_type_imp<N, N <= sizeof(long long) * CHAR_BIT>\n{};\n//\n// Backend for fixed precision signed-magnitude type which will fit entirely inside a \"double_limb_type\":\n//\ntemplate <std::size_t MinBits, cpp_int_check_type Checked>\nstruct cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, true>\n{\n   using local_limb_type = typename trivial_limb_type<static_cast<unsigned>(MinBits)>::type;\n   using limb_pointer = local_limb_type*;\n   using const_limb_pointer = const local_limb_type*;\n   using checked_type = std::integral_constant<int, Checked>;\n\n   struct scoped_shared_storage \n   {\n      BOOST_MP_CXX14_CONSTEXPR      scoped_shared_storage(const cpp_int_base&, std::size_t) {}\n      BOOST_MP_CXX14_CONSTEXPR void deallocate(std::size_t) {}\n   };\n\n protected:\n   static constexpr std::size_t limb_bits = sizeof(local_limb_type) * CHAR_BIT;\n   static constexpr local_limb_type limb_mask = (MinBits < limb_bits) ? local_limb_type((local_limb_type(~local_limb_type(0))) >> (limb_bits - MinBits)) : local_limb_type(~local_limb_type(0));\n\n private:\n   local_limb_type m_data;\n   bool            m_sign;\n\n   //\n   // Interface invariants:\n   //\n   static_assert(MinBits <= sizeof(double_limb_type) * CHAR_BIT, \"Template parameter MinBits is inconsistent with the parameter trivial - did you mistakingly try to override the trivial parameter?\");\n\n protected:\n   template <class T>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!(!boost::multiprecision::detail::is_integral<T>::value || (std::numeric_limits<T>::is_specialized && (std::numeric_limits<T>::digits <= static_cast<int>(MinBits))))>::type\n   check_in_range(T val, const std::integral_constant<int, checked>&)\n   {\n      using common_type = typename std::common_type<typename boost::multiprecision::detail::make_unsigned<T>::type, local_limb_type>::type;\n\n      if (static_cast<common_type>(boost::multiprecision::detail::unsigned_abs(val)) > static_cast<common_type>(limb_mask))\n         BOOST_MP_THROW_EXCEPTION(std::range_error(\"The argument to a cpp_int constructor exceeded the largest value it can represent.\"));\n   }\n   template <class T>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!(boost::multiprecision::detail::is_integral<T>::value || (std::numeric_limits<T>::is_specialized && (std::numeric_limits<T>::digits <= static_cast<int>(MinBits))))>::type\n   check_in_range(T val, const std::integral_constant<int, checked>&)\n   {\n      using std::abs;\n      using common_type = typename std::common_type<T, local_limb_type>::type;\n\n      if (static_cast<common_type>(abs(val)) > static_cast<common_type>(limb_mask))\n         BOOST_MP_THROW_EXCEPTION(std::range_error(\"The argument to a cpp_int constructor exceeded the largest value it can represent.\"));\n   }\n   template <class T, int C>\n   BOOST_MP_CXX14_CONSTEXPR void check_in_range(T, const std::integral_constant<int, C>&) noexcept {}\n\n   template <class T>\n   BOOST_MP_CXX14_CONSTEXPR void check_in_range(T val) noexcept(noexcept(std::declval<cpp_int_base>().check_in_range(std::declval<T>(), checked_type())))\n   {\n      check_in_range(val, checked_type());\n   }\n\n public:\n   //\n   // Direct construction:\n   //\n   template <class SI>\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(SI i, typename std::enable_if<boost::multiprecision::detail::is_signed<SI>::value && boost::multiprecision::detail::is_integral<SI>::value && (Checked == unchecked)>::type const* = nullptr) noexcept(noexcept(std::declval<cpp_int_base>().check_in_range(std::declval<SI>())))\n       : m_data(i < 0 ? static_cast<local_limb_type>(static_cast<typename boost::multiprecision::detail::make_unsigned<SI>::type>(boost::multiprecision::detail::unsigned_abs(i)) & limb_mask) : static_cast<local_limb_type>(i & limb_mask)), m_sign(i < 0) {}\n   template <class SI>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR cpp_int_base(SI i, typename std::enable_if<boost::multiprecision::detail::is_signed<SI>::value && boost::multiprecision::detail::is_integral<SI>::value && (Checked == checked)>::type const* = nullptr) noexcept(noexcept(std::declval<cpp_int_base>().check_in_range(std::declval<SI>())))\n       : m_data(i < 0 ? (static_cast<local_limb_type>(static_cast<typename boost::multiprecision::detail::make_unsigned<SI>::type>(boost::multiprecision::detail::unsigned_abs(i)) & limb_mask)) : static_cast<local_limb_type>(i & limb_mask)), m_sign(i < 0)\n   {\n      check_in_range(i);\n   }\n   template <class UI>\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(UI i, typename std::enable_if<boost::multiprecision::detail::is_unsigned<UI>::value && (Checked == unchecked)>::type const* = nullptr) noexcept\n       : m_data(static_cast<local_limb_type>(i) & limb_mask),\n         m_sign(false) {}\n   template <class UI>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR cpp_int_base(UI i, typename std::enable_if<boost::multiprecision::detail::is_unsigned<UI>::value && (Checked == checked)>::type const* = nullptr) noexcept(noexcept(std::declval<cpp_int_base>().check_in_range(std::declval<UI>())))\n       : m_data(static_cast<local_limb_type>(i) & limb_mask), m_sign(false) { check_in_range(i); }\n#if !(defined(__clang__) && defined(__MINGW32__))\n   template <class F>\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(F i, typename std::enable_if<std::is_floating_point<F>::value && (Checked == unchecked)>::type const* = nullptr) noexcept\n       : m_data(static_cast<local_limb_type>(i < 0 ? -i : i) & limb_mask),\n         m_sign(i < 0) {}\n   template <class F>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR cpp_int_base(F i, typename std::enable_if<std::is_floating_point<F>::value && (Checked == checked)>::type const* = nullptr)\n       : m_data(static_cast<local_limb_type>(i < 0 ? -i : i) & limb_mask), m_sign(i < 0) { check_in_range(i); }\n#else\n   //\n   // conversion from float to __int128 is broken on clang/mingw, \n   // see: https://bugs.llvm.org/show_bug.cgi?id=48940\n   // Since no floating point type has more than 64 bits of\n   // precision, we can simply cast to an intermediate type to\n   // solve the issue:\n   //\n   template <class F>\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(F i, typename std::enable_if<std::is_floating_point<F>::value && (Checked == unchecked)>::type const* = nullptr) noexcept\n       : m_data(static_cast<local_limb_type>(static_cast<std::uint64_t>(i < 0 ? -i : i)) & limb_mask),\n         m_sign(i < 0) {}\n   template <class F>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR cpp_int_base(F i, typename std::enable_if<std::is_floating_point<F>::value && (Checked == checked)>::type const* = nullptr)\n       : m_data(static_cast<local_limb_type>(static_cast<std::uint64_t>(i < 0 ? -i : i)) & limb_mask), m_sign(i < 0) { check_in_range(i); }\n#endif\n\n   constexpr cpp_int_base(literals::detail::value_pack<>) noexcept\n       : m_data(static_cast<local_limb_type>(0u)),\n         m_sign(false)\n   {}\n   template <limb_type a>\n   constexpr cpp_int_base(literals::detail::value_pack<a>) noexcept\n       : m_data(static_cast<local_limb_type>(a)),\n         m_sign(false) {}\n   template <limb_type a, limb_type b>\n   constexpr cpp_int_base(literals::detail::value_pack<a, b>) noexcept\n       : m_data(static_cast<local_limb_type>(a) | (static_cast<local_limb_type>(b) << bits_per_limb)),\n         m_sign(false) {}\n   constexpr cpp_int_base(const cpp_int_base& a, const literals::detail::negate_tag&) noexcept\n       : m_data(a.m_data),\n         m_sign(a.m_data ? !a.m_sign : false) {}\n   //\n   // These are deprecated in C++20 unless we make them explicit:\n   //\n   BOOST_MP_CXX14_CONSTEXPR cpp_int_base& operator=(const cpp_int_base&) = default;\n\n   explicit constexpr cpp_int_base(scoped_shared_storage&, std::size_t) noexcept : m_data(0), m_sign(false)\n   {}\n       //\n   // Helper functions for getting at our internal data, and manipulating storage:\n   //\n   BOOST_MP_FORCEINLINE constexpr std::size_t              size() const noexcept { return 1; }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR limb_pointer limbs() noexcept { return &m_data; }\n   BOOST_MP_FORCEINLINE constexpr const_limb_pointer    limbs() const noexcept { return &m_data; }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR bool         sign() const noexcept { return m_sign; }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void         sign(bool b) noexcept\n   {\n      m_sign = b;\n      // Check for zero value:\n      if (m_sign && !m_data)\n      {\n         m_sign = false;\n      }\n   }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void resize(std::size_t /* new_size */, std::size_t min_size)\n   {\n      detail::verify_new_size(2, min_size, checked_type());\n   }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void normalize() noexcept((Checked == unchecked))\n   {\n      if (!m_data)\n         m_sign = false; // zero is always unsigned\n      detail::verify_limb_mask(true, m_data, limb_mask, checked_type());\n      m_data &= limb_mask;\n   }\n\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base() noexcept : m_data(0), m_sign(false) {}\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(const cpp_int_base& o) noexcept\n       : m_data(o.m_data),\n         m_sign(o.m_sign) {}\n   //~cpp_int_base() noexcept {}\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void assign(const cpp_int_base& o) noexcept\n   {\n      m_data = o.m_data;\n      m_sign = o.m_sign;\n   }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void negate() noexcept\n   {\n      m_sign = !m_sign;\n      // Check for zero value:\n      if (m_data == 0)\n      {\n         m_sign = false;\n      }\n   }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR bool isneg() const noexcept\n   {\n      return m_sign;\n   }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void do_swap(cpp_int_base& o) noexcept\n   {\n      std_constexpr::swap(m_sign, o.m_sign);\n      std_constexpr::swap(m_data, o.m_data);\n   }\n};\n//\n// Backend for unsigned fixed precision (i.e. no allocator) type which will fit entirely inside a \"double_limb_type\":\n//\ntemplate <std::size_t MinBits, cpp_int_check_type Checked>\nstruct cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, true>\n{\n   using local_limb_type = typename trivial_limb_type<static_cast<unsigned>(MinBits)>::type;\n   using limb_pointer = local_limb_type*                         ;\n   using const_limb_pointer = const local_limb_type*                   ;\n\n   struct scoped_shared_storage \n   {\n      BOOST_MP_CXX14_CONSTEXPR      scoped_shared_storage(const cpp_int_base&, std::size_t) {}\n      BOOST_MP_CXX14_CONSTEXPR void deallocate(std::size_t) {}\n   };\n\n private:\n   static constexpr std::size_t limb_bits = sizeof(local_limb_type) * CHAR_BIT;\n   static constexpr local_limb_type limb_mask = limb_bits != MinBits ? static_cast<local_limb_type>(static_cast<local_limb_type>(~local_limb_type(0)) >> (limb_bits - MinBits))\n                                                                           : static_cast<local_limb_type>(~local_limb_type(0));\n\n   local_limb_type m_data;\n\n   using checked_type = std::integral_constant<int, Checked>;\n\n   //\n   // Interface invariants:\n   //\n   static_assert(MinBits <= sizeof(double_limb_type) * CHAR_BIT, \"Template parameter MinBits is inconsistent with the parameter trivial - did you mistakingly try to override the trivial parameter?\");\n\n protected:\n   template <class T>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if< !(std::numeric_limits<T>::is_specialized && (std::numeric_limits<T>::digits <= static_cast<int>(MinBits)))>::type\n   check_in_range(T val, const std::integral_constant<int, checked>&, const std::integral_constant<bool, false>&)\n   {\n      using common_type = typename std::common_type<T, local_limb_type>::type;\n\n      if (static_cast<common_type>(val) > limb_mask)\n         BOOST_MP_THROW_EXCEPTION(std::range_error(\"The argument to a cpp_int constructor exceeded the largest value it can represent.\"));\n   }\n   template <class T>\n   BOOST_MP_CXX14_CONSTEXPR void check_in_range(T val, const std::integral_constant<int, checked>&, const std::integral_constant<bool, true>&)\n   {\n      using common_type = typename std::common_type<T, local_limb_type>::type;\n\n      if (static_cast<common_type>(val) > static_cast<common_type>(limb_mask))\n         BOOST_MP_THROW_EXCEPTION(std::range_error(\"The argument to a cpp_int constructor exceeded the largest value it can represent.\"));\n      if (val < 0)\n         BOOST_MP_THROW_EXCEPTION(std::range_error(\"The argument to an unsigned cpp_int constructor was negative.\"));\n   }\n   template <class T, int C, bool B>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void check_in_range(T, const std::integral_constant<int, C>&, const std::integral_constant<bool, B>&) noexcept {}\n\n   template <class T>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void check_in_range(T val) noexcept(noexcept(std::declval<cpp_int_base>().check_in_range(std::declval<T>(), checked_type(), boost::multiprecision::detail::is_signed<T>())))\n   {\n      check_in_range(val, checked_type(), boost::multiprecision::detail::is_signed<T>());\n   }\n\n public:\n   //\n   // Direct construction:\n   //\n#ifdef __MSVC_RUNTIME_CHECKS\n   template <class SI>\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(SI i, typename std::enable_if<boost::multiprecision::detail::is_signed<SI>::value && boost::multiprecision::detail::is_integral<SI>::value && (Checked == unchecked)>::type const* = nullptr) noexcept\n       : m_data(i < 0 ? (1 + ~static_cast<local_limb_type>(-i & limb_mask)) & limb_mask : static_cast<local_limb_type>(i & limb_mask))\n   {}\n   template <class SI>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR cpp_int_base(SI i, typename std::enable_if<boost::multiprecision::detail::is_signed<SI>::value && boost::multiprecision::detail::is_integral<SI>::value && (Checked == checked)>::type const* = nullptr) noexcept(noexcept(std::declval<cpp_int_base>().check_in_range(std::declval<SI>())))\n       : m_data(i < 0 ? 1 + ~static_cast<local_limb_type>(-i & limb_mask) : static_cast<local_limb_type>(i & limb_mask)) { check_in_range(i); }\n   template <class UI>\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(UI i, typename std::enable_if<boost::multiprecision::detail::is_unsigned<UI>::value && (Checked == unchecked)>::type const* = nullptr) noexcept\n       : m_data(static_cast<local_limb_type>(i& limb_mask)) {}\n   template <class UI>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR cpp_int_base(UI i, typename std::enable_if<boost::multiprecision::detail::is_unsigned<UI>::value && (Checked == checked)>::type const* = nullptr) noexcept(noexcept(std::declval<cpp_int_base>().check_in_range(std::declval<UI>())))\n       : m_data(static_cast<local_limb_type>(i & limb_mask)) { check_in_range(i); }\n#else\n   template <class SI>\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(SI i, typename std::enable_if<boost::multiprecision::detail::is_signed<SI>::value && boost::multiprecision::detail::is_integral<SI>::value && (Checked == unchecked)>::type const* = nullptr) noexcept\n       : m_data(i < 0 ? (1 + ~static_cast<local_limb_type>(-i)) & limb_mask : static_cast<local_limb_type>(i) & limb_mask)\n   {}\n   template <class SI>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR cpp_int_base(SI i, typename std::enable_if<boost::multiprecision::detail::is_signed<SI>::value && boost::multiprecision::detail::is_integral<SI>::value && (Checked == checked)>::type const* = nullptr) noexcept(noexcept(std::declval<cpp_int_base>().check_in_range(std::declval<SI>())))\n       : m_data(i < 0 ? 1 + ~static_cast<local_limb_type>(-i) : static_cast<local_limb_type>(i)) { check_in_range(i); }\n   template <class UI>\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(UI i, typename std::enable_if<boost::multiprecision::detail::is_unsigned<UI>::value && (Checked == unchecked)>::type const* = nullptr) noexcept\n       : m_data(static_cast<local_limb_type>(i) & limb_mask) {}\n   template <class UI>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR cpp_int_base(UI i, typename std::enable_if<boost::multiprecision::detail::is_unsigned<UI>::value && (Checked == checked)>::type const* = nullptr) noexcept(noexcept(std::declval<cpp_int_base>().check_in_range(std::declval<UI>())))\n       : m_data(static_cast<local_limb_type>(i)) { check_in_range(i); }\n#endif\n   template <class F>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR cpp_int_base(F i, typename std::enable_if<std::is_floating_point<F>::value >::type const* = nullptr) noexcept((Checked == unchecked))\n       : m_data(static_cast<local_limb_type>(i < 0 ? -i : i) & limb_mask)\n   {\n      check_in_range(i);\n      if (i < 0)\n         negate();\n   }\n   constexpr cpp_int_base(literals::detail::value_pack<>) noexcept\n       : m_data(static_cast<local_limb_type>(0u))\n   {}\n   template <limb_type a>\n   constexpr cpp_int_base(literals::detail::value_pack<a>) noexcept\n       : m_data(static_cast<local_limb_type>(a)) {}\n   template <limb_type a, limb_type b>\n   constexpr cpp_int_base(literals::detail::value_pack<a, b>) noexcept\n       : m_data(static_cast<local_limb_type>(a) | (static_cast<local_limb_type>(b) << bits_per_limb)) {}\n   //\n   // These are deprecated in C++20 unless we make them explicit:\n   //\n   BOOST_MP_CXX14_CONSTEXPR cpp_int_base& operator=(const cpp_int_base&) = default;\n\n   explicit constexpr cpp_int_base(scoped_shared_storage&, std::size_t) noexcept : m_data(0)\n   {}\n       //\n   // Helper functions for getting at our internal data, and manipulating storage:\n   //\n   BOOST_MP_FORCEINLINE constexpr std::size_t              size() const noexcept { return 1; }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR limb_pointer limbs() noexcept { return &m_data; }\n   BOOST_MP_FORCEINLINE constexpr const_limb_pointer    limbs() const noexcept { return &m_data; }\n   BOOST_MP_FORCEINLINE constexpr bool                  sign() const noexcept { return false; }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void         sign(bool b) noexcept((Checked == unchecked))\n   {\n      if (b)\n         negate();\n   }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void resize(unsigned, std::size_t min_size)\n   {\n      detail::verify_new_size(2, min_size, checked_type());\n   }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void normalize() noexcept((Checked == unchecked))\n   {\n      detail::verify_limb_mask(true, m_data, limb_mask, checked_type());\n      m_data &= limb_mask;\n   }\n\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base() noexcept : m_data(0) {}\n   BOOST_MP_FORCEINLINE constexpr cpp_int_base(const cpp_int_base& o) noexcept\n       : m_data(o.m_data) {}\n   //~cpp_int_base() noexcept {}\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void assign(const cpp_int_base& o) noexcept\n   {\n      m_data = o.m_data;\n   }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void negate()\n   #if !defined(BOOST_NO_CXX17_IF_CONSTEXPR)\n   noexcept((Checked == unchecked))\n   #endif\n   {\n      BOOST_IF_CONSTEXPR(Checked == checked)\n      {\n         BOOST_MP_THROW_EXCEPTION(std::range_error(\"Attempt to negate an unsigned type.\"));\n      }\n      m_data = ~m_data;\n      ++m_data;\n   }\n   BOOST_MP_FORCEINLINE constexpr bool isneg() const noexcept\n   {\n      return false;\n   }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void do_swap(cpp_int_base& o) noexcept\n   {\n      std_constexpr::swap(m_data, o.m_data);\n   }\n};\n//\n// Traits class, lets us know whether type T can be directly converted to the base type,\n// used to enable/disable constructors etc:\n//\ntemplate <class Arg, class Base>\nstruct is_allowed_cpp_int_base_conversion : public std::conditional<\n                                                std::is_same<Arg, limb_type>::value || std::is_same<Arg, signed_limb_type>::value\n#if BOOST_MP_ENDIAN_LITTLE_BYTE && !defined(BOOST_MP_TEST_NO_LE)\n                                                    || std::is_same<Arg, double_limb_type>::value || std::is_same<Arg, signed_double_limb_type>::value\n#endif\n                                                    || literals::detail::is_value_pack<Arg>::value || (is_trivial_cpp_int<Base>::value && boost::multiprecision::detail::is_arithmetic<Arg>::value),\n                                                std::integral_constant<bool, true>,\n                                                std::integral_constant<bool, false>>::type\n{};\n//\n// Now the actual backend, normalising parameters passed to the base class:\n//\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>\nstruct cpp_int_backend\n    : public cpp_int_base<\n          min_precision<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value,\n          max_precision<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value,\n          SignType,\n          Checked,\n          Allocator,\n          is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value>\n{\n   using self_type = cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>;\n   using base_type = cpp_int_base<\n       min_precision<self_type>::value,\n       max_precision<self_type>::value,\n       SignType,\n       Checked,\n       Allocator,\n       is_trivial_cpp_int<self_type>::value>;\n   using trivial_tag = std::integral_constant<bool, is_trivial_cpp_int<self_type>::value>;\n\n public:\n   using signed_types = typename std::conditional<\n       is_trivial_cpp_int<self_type>::value,\n       std::tuple<\n           signed char, short, int, long,\n           long long, signed_double_limb_type>,\n       std::tuple<signed_limb_type, signed_double_limb_type> >::type;\n   using unsigned_types = typename std::conditional<\n       is_trivial_cpp_int<self_type>::value,\n       std::tuple<unsigned char, unsigned short, unsigned,\n                 unsigned long, unsigned long long, double_limb_type>,\n       std::tuple<limb_type, double_limb_type> >::type;\n   using float_types = typename std::conditional<\n       is_trivial_cpp_int<self_type>::value,\n       std::tuple<float, double, long double>,\n       std::tuple<long double> >::type;\n   using checked_type = std::integral_constant<int, Checked>        ;\n\n   BOOST_MP_FORCEINLINE constexpr cpp_int_backend() noexcept {}\n   BOOST_MP_FORCEINLINE constexpr cpp_int_backend(const cpp_int_backend& o) noexcept(std::is_void<Allocator>::value) : base_type(o) {}\n   // rvalue copy:\n   BOOST_MP_FORCEINLINE constexpr cpp_int_backend(cpp_int_backend&& o) noexcept\n       : base_type(static_cast<base_type&&>(o))\n   {}\n   template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2>\n   BOOST_MP_FORCEINLINE BOOST_CXX14_CONSTEXPR cpp_int_backend(cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2>&& o, typename std::enable_if<is_implicit_cpp_int_conversion<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2>, self_type>::value>::type* = nullptr) noexcept\n   {\n      *this = static_cast<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2>&&>(o);\n   }\n   //\n   // Direct construction from arithmetic type:\n   //\n   template <class Arg>\n   BOOST_MP_FORCEINLINE constexpr cpp_int_backend(Arg i, typename std::enable_if<is_allowed_cpp_int_base_conversion<Arg, base_type>::value>::type const* = nullptr) noexcept(noexcept(base_type(std::declval<Arg>())))\n       : base_type(i) {}\n   //\n   // Aliasing constructor: the result will alias the memory referenced, unless\n   // we have fixed precision and storage, in which case we copy the memory:\n   //\n   explicit constexpr cpp_int_backend(limb_type* data, std::size_t offset, std::size_t len) noexcept\n       : base_type(data, offset, len) {}\n   explicit cpp_int_backend(const limb_type* data, std::size_t offset, std::size_t len) noexcept\n       : base_type(data, offset, len) { this->normalize(); }\n   explicit constexpr cpp_int_backend(typename base_type::scoped_shared_storage& data, std::size_t len) noexcept\n       : base_type(data, len) {}\n\n private:\n   template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& other, std::true_type const&, std::true_type const&)\n   {\n      // Assigning trivial type to trivial type:\n      this->check_in_range(*other.limbs());\n      *this->limbs() = static_cast<typename self_type::local_limb_type>(*other.limbs());\n      this->sign(other.sign());\n      this->normalize();\n   }\n   template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& other, std::true_type const&, std::false_type const&)\n   {\n      // non-trivial to trivial narrowing conversion:\n      double_limb_type v = *other.limbs();\n      if (other.size() > 1)\n      {\n         v |= static_cast<double_limb_type>(other.limbs()[1]) << bits_per_limb;\n         BOOST_IF_CONSTEXPR(Checked == checked)\n         {\n            if (other.size() > 2)\n            {\n               BOOST_MP_THROW_EXCEPTION(std::range_error(\"Assignment of a cpp_int that is out of range for the target type.\"));\n            }\n         }\n      }\n      *this = v;\n      this->sign(other.sign());\n      this->normalize();\n   }\n   template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& other, std::false_type const&, std::true_type const&)\n   {\n      // trivial to non-trivial, treat the trivial argument as if it were an unsigned arithmetic type, then set the sign afterwards:\n      *this = static_cast<\n          typename boost::multiprecision::detail::canonical<\n              typename cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>::local_limb_type,\n              cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::type>(*other.limbs());\n      this->sign(other.sign());\n   }\n   template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& other, std::false_type const&, std::false_type const&)\n   {\n      // regular non-trivial to non-trivial assign:\n      this->resize(other.size(), other.size());\n\n#if !defined(BOOST_MP_HAS_IS_CONSTANT_EVALUATED) && !defined(BOOST_MP_HAS_BUILTIN_IS_CONSTANT_EVALUATED) && !defined(BOOST_NO_CXX14_CONSTEXPR)\n      std::size_t count = (std::min)(other.size(), this->size());\n      for (std::size_t i = 0; i < count; ++i)\n         this->limbs()[i] = other.limbs()[i];\n#else\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n      if (BOOST_MP_IS_CONST_EVALUATED(other.size()))\n      {\n         std::size_t count = (std::min)(other.size(), this->size());\n         for (std::size_t i = 0; i < count; ++i)\n            this->limbs()[i] = other.limbs()[i];\n      }\n      else\n#endif\n      {\n         static_assert(sizeof(other.limbs()[0]) == sizeof(this->limbs()[0]), \"This method requires equal limb sizes\");\n         std::memcpy(this->limbs(), other.limbs(), (std::min)(other.size() * sizeof(other.limbs()[0]), this->size() * sizeof(this->limbs()[0])));\n      }\n#endif\n      this->sign(other.sign());\n      this->normalize();\n   }\n\n public:\n   template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\n   BOOST_MP_CXX14_CONSTEXPR cpp_int_backend(\n       const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& other,\n       typename std::enable_if<is_implicit_cpp_int_conversion<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>, self_type>::value>::type* = nullptr)\n       : base_type()\n   {\n      do_assign(\n          other,\n          std::integral_constant<bool, is_trivial_cpp_int<self_type>::value>(),\n          std::integral_constant<bool, is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>());\n   }\n   template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\n   explicit BOOST_MP_CXX14_CONSTEXPR cpp_int_backend(\n       const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& other,\n       typename std::enable_if< !(is_implicit_cpp_int_conversion<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>, self_type>::value)>::type* = nullptr)\n       : base_type()\n   {\n      do_assign(\n          other,\n          std::integral_constant<bool, is_trivial_cpp_int<self_type>::value>(),\n          std::integral_constant<bool, is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>());\n   }\n   template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\n   BOOST_MP_CXX14_CONSTEXPR cpp_int_backend& operator=(\n       const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& other)\n   {\n      do_assign(\n          other,\n          std::integral_constant<bool, is_trivial_cpp_int<self_type>::value>(),\n          std::integral_constant<bool, is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>());\n      return *this;\n   }\n   constexpr cpp_int_backend(const cpp_int_backend& a, const literals::detail::negate_tag& tag)\n       : base_type(static_cast<const base_type&>(a), tag)\n   {}\n\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR cpp_int_backend& operator=(const cpp_int_backend& o) noexcept(noexcept(std::declval<cpp_int_backend>().assign(std::declval<const cpp_int_backend&>())))\n   {\n      this->assign(o);\n      return *this;\n   }\n   // rvalue copy:\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR cpp_int_backend& operator=(cpp_int_backend&& o) noexcept(noexcept(std::declval<base_type&>() = std::declval<base_type>()))\n   {\n      *static_cast<base_type*>(this) = static_cast<base_type&&>(o);\n      return *this;\n   }\n   template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<((MaxBits2 <= MaxBits) || (MaxBits == 0)) && !std::is_void<Allocator>::value, cpp_int_backend&>::type operator=(cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator>&& o) noexcept\n   {\n      *static_cast<base_type*>(this) = static_cast<typename cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2>::base_type&&>(o);\n      return *this;\n   }\n\n   template <class A>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n         boost::multiprecision::detail::is_unsigned<A>::value\n         && trivial_tag::value, cpp_int_backend&>::type \n      operator=(const A& val)\n         noexcept(noexcept(std::declval<cpp_int_backend>().check_in_range(std::declval<A>())))\n   {\n      this->check_in_range(val);\n      *this->limbs() = static_cast<typename self_type::local_limb_type>(val);\n      this->sign(false);\n      this->normalize();\n      return *this;\n   }\n   template <class A>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n         !(boost::multiprecision::detail::is_unsigned<A>::value || !boost::multiprecision::detail::is_integral<A>::value)\n         && trivial_tag::value, cpp_int_backend&>::type\n      operator=(const A& val)\n         noexcept(noexcept(std::declval<cpp_int_backend>().check_in_range(std::declval<A>())) && noexcept(std::declval<cpp_int_backend>().sign(true)))\n   {\n      this->check_in_range(val);\n      *this->limbs() = (val < 0) ? static_cast<typename self_type::local_limb_type>(boost::multiprecision::detail::unsigned_abs(val)) : static_cast<typename self_type::local_limb_type>(val);\n      this->sign(val < 0);\n      this->normalize();\n      return *this;\n   }\n   template <class A>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n         std::is_convertible<A, limb_type>::value \n         && !boost::multiprecision::detail::is_integral<A>::value\n         && trivial_tag::value, cpp_int_backend&>::type \n      operator=(const A& val)\n   {\n      this->check_in_range(val);\n      *this->limbs() = (val < 0) ? static_cast<typename self_type::local_limb_type>(boost::multiprecision::detail::abs(val)) : static_cast<typename self_type::local_limb_type>(val);\n      this->sign(val < 0);\n      this->normalize();\n      return *this;\n   }\n   template <class A>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n         std::is_same<A, limb_type>::value && !trivial_tag::value, cpp_int_backend&>::type\n      operator=(A i) noexcept\n   {\n      this->resize(1, 1);\n      *this->limbs() = i;\n      this->sign(false);\n      return *this;\n   }\n   template <class A>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if <\n         std::is_same<A, signed_limb_type>::value && !trivial_tag::value, cpp_int_backend&>::type\n      operator=(A i) noexcept(noexcept(std::declval<cpp_int_backend>().sign(true)))\n   {\n      this->resize(1, 1);\n      *this->limbs() = static_cast<limb_type>(boost::multiprecision::detail::unsigned_abs(i));\n      this->sign(i < 0);\n      return *this;\n   }\n   template <class A>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if <\n         std::is_same<A, double_limb_type>::value && !trivial_tag::value, cpp_int_backend&>::type\n      operator=(A i) noexcept\n   {\n      static_assert(sizeof(i) == 2 * sizeof(limb_type), \"Failed integer size check\");\n      static_assert(base_type::internal_limb_count >= 2, \"Failed internal limb count\");\n      typename base_type::limb_pointer p = this->limbs();\n#ifdef __MSVC_RUNTIME_CHECKS\n      *p = static_cast<limb_type>(i & ~static_cast<limb_type>(0));\n#else\n      *p                        = static_cast<limb_type>(i);\n#endif\n      p[1] = static_cast<limb_type>(i >> base_type::limb_bits);\n      this->resize(p[1] ? 2 : 1, p[1] ? 2 : 1);\n      this->sign(false);\n      return *this;\n   }\n   template <class A>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if <\n         std::is_same<A, signed_double_limb_type>::value && !trivial_tag::value, cpp_int_backend&>::type\n      operator=(A i) noexcept(noexcept(std::declval<cpp_int_backend>().sign(true)))\n   {\n      static_assert(sizeof(i) == 2 * sizeof(limb_type), \"double limb type size check failed\");\n      static_assert(base_type::internal_limb_count >= 2, \"Failed internal limb count check\");\n      bool s = false;\n      if (i < 0)\n         s = true;\n      double_limb_type                 ui = static_cast<double_limb_type>(boost::multiprecision::detail::unsigned_abs(i));\n      typename base_type::limb_pointer p  = this->limbs();\n#ifdef __MSVC_RUNTIME_CHECKS\n      *p = static_cast<limb_type>(ui & ~static_cast<limb_type>(0));\n#else\n      *p                        = static_cast<limb_type>(ui);\n#endif\n      p[1] = static_cast<limb_type>(ui >> base_type::limb_bits);\n      this->resize(p[1] ? 2 : 1, p[1] ? 2 : 1);\n      this->sign(s);\n      return *this;\n   }\nprivate:\n   template <class F>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_float(F a)\n   {\n      using default_ops::eval_add;\n      using default_ops::eval_subtract;\n      BOOST_MP_FLOAT128_USING using std::floor; using std::frexp; using std::ldexp;\n\n      if (a < 0)\n      {\n         do_assign_float(-a);\n         this->sign(true);\n         return;\n      }\n\n      if (a == 0)\n      {\n         *this = static_cast<limb_type>(0u);\n      }\n\n      if (a == 1)\n      {\n         *this = static_cast<limb_type>(1u);\n      }\n\n      if (!BOOST_MP_ISFINITE(a))\n      {\n         BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Cannot convert a non-finite number to an integer.\"));\n      }\n\n      int         e = 0;\n      F f(0), term(0);\n      *this = static_cast<limb_type>(0u);\n\n      f = frexp(a, &e);\n\n#if !(defined(__clang__) && (__clang_major__ <= 7))\n      constexpr limb_type shift = std::numeric_limits<limb_type>::digits;\n#else\n      // clang 7 has an issue converting long double to unsigned long long in\n      // release mode (bits get dropped, conversion appears to go via float)\n      // Never extract more than double bits at a time:\n      constexpr limb_type shift = std::numeric_limits<limb_type>::digits > std::numeric_limits<double>::digits\n            ? std::numeric_limits<double>::digits : std::numeric_limits<limb_type>::digits;\n#endif\n\n      while (f != static_cast<F>(0.0f))\n      {\n         // extract int sized bits from f:\n         f    = ldexp(f, shift);\n         term = floor(f);\n         e = e - static_cast<int>(shift);\n         eval_left_shift(*this, shift);\n#if !(defined(__clang__) && (__clang_major__ <= 7))\n         if (term > 0)\n            eval_add(*this, static_cast<limb_type>(term));\n         else\n            eval_subtract(*this, static_cast<limb_type>(-term));\n#else\n         // clang 7 requires extra cast to double to avoid buggy code generation:\n         if (term > 0)\n            eval_add(*this, static_cast<limb_type>(static_cast<double>(term)));\n         else\n            eval_subtract(*this, static_cast<limb_type>(static_cast<double>(-term)));\n#endif\n         f -= term;\n      }\n      if (e > 0)\n         eval_left_shift(*this, static_cast<unsigned int>(e));\n      else if (e < 0)\n         eval_right_shift(*this, static_cast<unsigned int>(-e));\n   }\npublic:\n   template <class A>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if <\n      std::is_floating_point<A>::value && !trivial_tag::value, cpp_int_backend&>::type\n      operator=(A a)\n   {\n      do_assign_float(a);\n      return *this;\n   }\n\n private:\n   void do_assign_string(const char* s, const std::integral_constant<bool, true>&)\n   {\n      std::size_t n  = s ? std::strlen(s) : 0;\n      *this          = 0;\n      unsigned radix = 10;\n      bool     isneg = false;\n      if (n && (*s == '-'))\n      {\n         --n;\n         ++s;\n         isneg = true;\n      }\n      if (n && (*s == '0'))\n      {\n         if ((n > 1) && ((s[1] == 'x') || (s[1] == 'X')))\n         {\n            radix = 16;\n            s += 2;\n            n -= 2;\n         }\n         else\n         {\n            radix = 8;\n            n -= 1;\n         }\n      }\n      if (n)\n      {\n         unsigned val;\n         while (*s)\n         {\n            if (*s >= '0' && *s <= '9')\n               val = static_cast<unsigned>(*s - '0');\n            else if (*s >= 'a' && *s <= 'f')\n               val = 10u + static_cast<unsigned>(*s - 'a');\n            else if (*s >= 'A' && *s <= 'F')\n               val = 10u + static_cast<unsigned>(*s - 'A');\n            else\n               val = radix + 1u;\n            if (val >= radix)\n            {\n               BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Unexpected content found while parsing character string.\"));\n            }\n            *this->limbs() = detail::checked_multiply(*this->limbs(), static_cast<typename base_type::local_limb_type>(radix), checked_type());\n            *this->limbs() = detail::checked_add(*this->limbs(), static_cast<typename base_type::local_limb_type>(val), checked_type());\n            ++s;\n         }\n      }\n      if (isneg)\n         this->negate();\n   }\n   void do_assign_string(const char* s, const std::integral_constant<bool, false>&)\n   {\n      using default_ops::eval_add;\n      using default_ops::eval_multiply;\n      std::size_t n  = s ? std::strlen(s) : 0;\n      *this          = static_cast<limb_type>(0u);\n      unsigned radix = 10;\n      bool     isneg = false;\n      if (n && (*s == '-'))\n      {\n         --n;\n         ++s;\n         isneg = true;\n      }\n      if (n && (*s == '0'))\n      {\n         if ((n > 1) && ((s[1] == 'x') || (s[1] == 'X')))\n         {\n            radix = 16;\n            s += 2;\n            n -= 2;\n         }\n         else\n         {\n            radix = 8;\n            n -= 1;\n         }\n      }\n      //\n      // Exception guarantee: create the result in stack variable \"result\"\n      // then do a swap at the end.  In the event of a throw, *this will\n      // be left unchanged.\n      //\n      cpp_int_backend result;\n      if (n)\n      {\n         if (radix == 16)\n         {\n            while (*s == '0')\n               ++s;\n            std::size_t bitcount = 4 * std::strlen(s);\n            limb_type   val;\n            std::size_t limb, shift;\n            if (bitcount > 4)\n               bitcount -= 4;\n            else\n               bitcount = 0;\n            std::size_t newsize = bitcount / (sizeof(limb_type) * CHAR_BIT) + 1;\n            result.resize(static_cast<unsigned>(newsize), static_cast<unsigned>(newsize)); // will throw if this is a checked integer that cannot be resized\n            std::memset(result.limbs(), 0, result.size() * sizeof(limb_type));\n            while (*s)\n            {\n               if (*s >= '0' && *s <= '9')\n                  val = static_cast<unsigned>(*s - '0');\n               else if (*s >= 'a' && *s <= 'f')\n                  val = 10u + static_cast<unsigned>(*s - 'a');\n               else if (*s >= 'A' && *s <= 'F')\n                  val = 10u + static_cast<unsigned>(*s - 'A');\n               else\n               {\n                  #if defined(BOOST_NO_EXCEPTIONS)\n                  val = static_cast<unsigned>('0');\n                  #endif\n\n                  BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Unexpected content found while parsing character string.\"));\n               }\n               limb  = bitcount / (sizeof(limb_type) * CHAR_BIT);\n               shift = bitcount % (sizeof(limb_type) * CHAR_BIT);\n               val <<= shift;\n               if (result.size() > limb)\n               {\n                  result.limbs()[limb] |= val;\n               }\n               ++s;\n               bitcount -= 4;\n            }\n            result.normalize();\n         }\n         else if (radix == 8)\n         {\n            while (*s == '0')\n               ++s;\n            std::size_t bitcount = 3 * std::strlen(s);\n            limb_type   val;\n            std::size_t limb, shift;\n            if (bitcount > 3)\n               bitcount -= 3;\n            else\n               bitcount = 0;\n            std::size_t newsize = bitcount / (sizeof(limb_type) * CHAR_BIT) + 1;\n            result.resize(static_cast<unsigned>(newsize), static_cast<unsigned>(newsize)); // will throw if this is a checked integer that cannot be resized\n            std::memset(result.limbs(), 0, result.size() * sizeof(limb_type));\n            while (*s)\n            {\n               if (*s >= '0' && *s <= '7')\n                  val = static_cast<unsigned>(*s - '0');\n               else\n               {\n                  #if defined(BOOST_NO_EXCEPTIONS)\n                  val = static_cast<unsigned>('0');\n                  #endif\n\n                  BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Unexpected content found while parsing character string.\"));\n               }\n               limb  = bitcount / (sizeof(limb_type) * CHAR_BIT);\n               shift = bitcount % (sizeof(limb_type) * CHAR_BIT);\n               if (result.size() > limb)\n               {\n                  result.limbs()[limb] |= (val << shift);\n                  if (shift > sizeof(limb_type) * CHAR_BIT - 3)\n                  {\n                     // Deal with the bits in val that overflow into the next limb:\n                     val >>= (sizeof(limb_type) * CHAR_BIT - shift);\n                     if (val)\n                     {\n                        // If this is the most-significant-limb, we may need to allocate an extra one for the overflow:\n                        if (limb + 1 == newsize)\n                           result.resize(static_cast<unsigned>(newsize + 1), static_cast<unsigned>(newsize + 1));\n                        if (result.size() > limb + 1)\n                        {\n                           result.limbs()[limb + 1] |= val;\n                        }\n                     }\n                  }\n               }\n               ++s;\n               bitcount -= 3;\n            }\n            result.normalize();\n         }\n         else\n         {\n            // Base 10, we extract blocks of size 10^9 at a time, that way\n            // the number of multiplications is kept to a minimum:\n            limb_type block_mult = max_block_10;\n            while (*s)\n            {\n               limb_type block = 0;\n               for (unsigned i = 0; i < digits_per_block_10; ++i)\n               {\n                  limb_type val;\n                  if (*s >= '0' && *s <= '9')\n                     val = static_cast<limb_type>(*s - '0');\n                  else\n                  {\n                     #if defined(BOOST_NO_EXCEPTIONS)\n                     val = static_cast<unsigned>('0');\n                     #endif\n\n                     BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Unexpected character encountered in input.\"));\n                  }\n                  block *= 10;\n                  block += val;\n                  if (!*++s)\n                  {\n                     block_mult = block_multiplier(i);\n                     break;\n                  }\n               }\n               eval_multiply(result, block_mult);\n               eval_add(result, block);\n            }\n         }\n      }\n      if (isneg)\n         result.negate();\n      result.swap(*this);\n   }\n\n public:\n   cpp_int_backend& operator=(const char* s)\n   {\n      do_assign_string(s, trivial_tag());\n      return *this;\n   }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void swap(cpp_int_backend& o) noexcept\n   {\n      this->do_swap(o);\n   }\n\n private:\n   std::string do_get_trivial_string(std::ios_base::fmtflags f, const std::integral_constant<bool, false>&) const\n   {\n      using io_type = typename std::conditional<sizeof(typename base_type::local_limb_type) == 1, unsigned, typename base_type::local_limb_type>::type;\n      if (this->sign() && (((f & std::ios_base::hex) == std::ios_base::hex) || ((f & std::ios_base::oct) == std::ios_base::oct)))\n         BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Base 8 or 16 printing of negative numbers is not supported.\"));\n      std::stringstream ss;\n      ss.flags(f & ~std::ios_base::showpos);\n      ss << static_cast<io_type>(*this->limbs());\n      std::string result;\n      if (this->sign())\n         result += '-';\n      else if (f & std::ios_base::showpos)\n         result += '+';\n      result += ss.str();\n      return result;\n   }\n   std::string do_get_trivial_string(std::ios_base::fmtflags f, const std::integral_constant<bool, true>&) const\n   {\n      // Even though we have only one limb, we can't do IO on it :-(\n      int base = 10;\n      if ((f & std::ios_base::oct) == std::ios_base::oct)\n         base = 8;\n      else if ((f & std::ios_base::hex) == std::ios_base::hex)\n         base = 16;\n      std::string result;\n\n      std::size_t Bits = sizeof(typename base_type::local_limb_type) * CHAR_BIT;\n\n      if (base == 8 || base == 16)\n      {\n         if (this->sign())\n            BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Base 8 or 16 printing of negative numbers is not supported.\"));\n         limb_type                           shift = base == 8 ? 3 : 4;\n         limb_type                           mask  = static_cast<limb_type>((1u << shift) - 1);\n         typename base_type::local_limb_type v     = *this->limbs();\n         result.assign(Bits / shift + (Bits % shift ? 1 : 0), '0');\n         std::string::difference_type pos      = static_cast<std::string::difference_type>(result.size() - 1u);\n         char                         letter_a = f & std::ios_base::uppercase ? 'A' : 'a';\n         for (std::size_t i = 0; i < Bits / shift; ++i)\n         {\n            char c = static_cast<char>('0' + static_cast<char>(v & mask));\n            if (c > '9')\n               c = static_cast<char>(c + letter_a - '9' - 1);\n            result[static_cast<std::size_t>(pos)] = c;\n            --pos;\n            v >>= shift;\n         }\n         if (Bits % shift)\n         {\n            mask   = static_cast<limb_type>((1u << (Bits % shift)) - 1);\n            char c = static_cast<char>('0' + static_cast<char>(v & mask));\n            if (c > '9')\n               c = static_cast<char>(c + letter_a - '9');\n            result[static_cast<std::size_t>(pos)] = c;\n         }\n         //\n         // Get rid of leading zeros:\n         //\n         std::string::size_type n = result.find_first_not_of('0');\n         if (!result.empty() && (n == std::string::npos))\n            n = result.size() - 1;\n         result.erase(0, n);\n         if (f & std::ios_base::showbase)\n         {\n            const char* pp = base == 8 ? \"0\" : (f & std::ios_base::uppercase) ? \"0X\" : \"0x\";\n            result.insert(static_cast<std::string::size_type>(0), pp);\n         }\n      }\n      else\n      {\n         result.assign(Bits / 3 + 1, '0');\n         std::string::difference_type        pos = static_cast<std::string::difference_type>(result.size() - 1u);\n         typename base_type::local_limb_type v(*this->limbs());\n         bool                                neg = false;\n         if (this->sign())\n         {\n            neg = true;\n         }\n         while (v)\n         {\n            result[static_cast<std::string::size_type>(pos)] = static_cast<char>(static_cast<char>(v % 10) + '0');\n            --pos;\n            v /= 10;\n         }\n         std::string::size_type n = result.find_first_not_of('0');\n         result.erase(0, n);\n         if (result.empty())\n            result = \"0\";\n         if (neg)\n            result.insert(static_cast<std::string::size_type>(0), 1, '-');\n         else if (f & std::ios_base::showpos)\n            result.insert(static_cast<std::string::size_type>(0), 1, '+');\n      }\n      return result;\n   }\n   std::string do_get_string(std::ios_base::fmtflags f, const std::integral_constant<bool, true>&) const\n   {\n#ifdef BOOST_MP_NO_DOUBLE_LIMB_TYPE_IO\n      return do_get_trivial_string(f, std::integral_constant<bool, std::is_same<typename base_type::local_limb_type, double_limb_type>::value>());\n#else\n      return do_get_trivial_string(f, std::integral_constant<bool, false>());\n#endif\n   }\n   std::string do_get_string(std::ios_base::fmtflags f, const std::integral_constant<bool, false>&) const\n   {\n      using default_ops::eval_get_sign;\n      int base = 10;\n      if ((f & std::ios_base::oct) == std::ios_base::oct)\n         base = 8;\n      else if ((f & std::ios_base::hex) == std::ios_base::hex)\n         base = 16;\n      std::string result;\n\n      std::size_t Bits = this->size() * base_type::limb_bits;\n\n      if (base == 8 || base == 16)\n      {\n         if (this->sign())\n            BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Base 8 or 16 printing of negative numbers is not supported.\"));\n         limb_type       shift = base == 8 ? 3 : 4;\n         limb_type       mask  = static_cast<limb_type>((1u << shift) - 1);\n         cpp_int_backend t(*this);\n         result.assign(Bits / shift + ((Bits % shift) ? 1 : 0), '0');\n         std::string::difference_type pos      = static_cast<std::string::difference_type>(result.size() - 1u);\n         char                         letter_a = f & std::ios_base::uppercase ? 'A' : 'a';\n         for (std::size_t i = 0; i < Bits / shift; ++i)\n         {\n            char c = static_cast<char>('0' + static_cast<char>(t.limbs()[0] & mask));\n            if (c > '9')\n               c = static_cast<char>(c + letter_a - '9' - 1);\n            result[static_cast<std::size_t>(pos)] = c;\n            --pos;\n            eval_right_shift(t, shift);\n         }\n         if (Bits % shift)\n         {\n            mask   = static_cast<limb_type>((1u << (Bits % shift)) - 1);\n            char c = static_cast<char>('0' + static_cast<char>(t.limbs()[0] & mask));\n            if (c > '9')\n               c = static_cast<char>(c + letter_a - '9');\n            result[static_cast<std::size_t>(pos)] = c;\n         }\n         //\n         // Get rid of leading zeros:\n         //\n         std::string::size_type n = result.find_first_not_of('0');\n         if (!result.empty() && (n == std::string::npos))\n            n = result.size() - 1;\n         result.erase(0, n);\n         if (f & std::ios_base::showbase)\n         {\n            const char* pp = base == 8 ? \"0\" : (f & std::ios_base::uppercase) ? \"0X\" : \"0x\";\n            result.insert(static_cast<std::string::size_type>(0), pp);\n         }\n      }\n      else\n      {\n         result.assign(Bits / 3 + 1, '0');\n         std::string::difference_type pos = static_cast<std::string::difference_type>(result.size() - 1u);\n         cpp_int_backend              t(*this);\n         cpp_int_backend              r;\n         bool                         neg = false;\n         if (t.sign())\n         {\n            t.negate();\n            neg = true;\n         }\n         if (this->size() == 1)\n         {\n            result = std::to_string(t.limbs()[0]);\n         }\n         else\n         {\n            cpp_int_backend block10;\n            block10 = max_block_10;\n            while (eval_get_sign(t) != 0)\n            {\n               cpp_int_backend t2;\n               divide_unsigned_helper(&t2, t, block10, r);\n               t           = t2;\n               limb_type v = r.limbs()[0];\n               for (std::size_t i = 0; i < digits_per_block_10; ++i)\n               {\n                  char c = static_cast<char>('0' + static_cast<char>(v % 10));\n                  v /= 10;\n                  result[static_cast<std::size_t>(pos)] = c;\n                  if (pos-- == 0u)\n                     break;\n               }\n            }\n         }\n         std::string::size_type n = result.find_first_not_of('0');\n         result.erase(0, n);\n         if (result.empty())\n            result = std::string(static_cast<std::size_t>(1u), '0');\n         if (neg)\n            result.insert(static_cast<std::string::size_type>(0), 1, '-');\n         else if (f & std::ios_base::showpos)\n            result.insert(static_cast<std::string::size_type>(0), 1, '+');\n      }\n      return result;\n   }\n\n public:\n   std::string str(std::streamsize /*digits*/, std::ios_base::fmtflags f) const\n   {\n      return do_get_string(f, trivial_tag());\n   }\n\n private:\n   template <class Container>\n   void construct_from_container(const Container& c, const std::integral_constant<bool, false>&)\n   {\n      //\n      // We assume that c is a sequence of (unsigned) bytes with the most significant byte first:\n      //\n      std::size_t newsize = static_cast<unsigned>(c.size() / sizeof(limb_type));\n      if (c.size() % sizeof(limb_type))\n      {\n         ++newsize;\n      }\n      if (newsize)\n      {\n         this->resize(newsize, newsize); // May throw\n         std::memset(this->limbs(), 0, this->size());\n         typename Container::const_iterator i(c.begin()), j(c.end());\n         std::size_t                           byte_location = static_cast<unsigned>(c.size() - 1);\n         while (i != j)\n         {\n            std::size_t limb  = byte_location / sizeof(limb_type);\n            std::size_t shift = (byte_location % sizeof(limb_type)) * CHAR_BIT;\n            if (this->size() > limb)\n               this->limbs()[limb] |= static_cast<limb_type>(static_cast<unsigned char>(*i)) << shift;\n            ++i;\n            --byte_location;\n         }\n      }\n   }\n   template <class Container>\n   BOOST_MP_CXX14_CONSTEXPR void construct_from_container(const Container& c, const std::integral_constant<bool, true>&)\n   {\n      //\n      // We assume that c is a sequence of (unsigned) bytes with the most significant byte first:\n      //\n      using local_limb_type = typename base_type::local_limb_type;\n      *this->limbs() = 0;\n      if (c.size())\n      {\n         typename Container::const_iterator i(c.begin()), j(c.end());\n         std::size_t                           byte_location = static_cast<unsigned>(c.size() - 1);\n         while (i != j)\n         {\n            std::size_t limb  = byte_location / sizeof(local_limb_type);\n            std::size_t shift = (byte_location % sizeof(local_limb_type)) * CHAR_BIT;\n            if (limb == 0)\n               this->limbs()[0] |= static_cast<limb_type>(static_cast<unsigned char>(*i)) << shift;\n            ++i;\n            --byte_location;\n         }\n      }\n   }\n\n public:\n   template <class Container>\n   BOOST_MP_CXX14_CONSTEXPR cpp_int_backend(const Container& c, typename std::enable_if<boost::multiprecision::detail::is_byte_container<Container>::value>::type const* = nullptr)\n   {\n      //\n      // We assume that c is a sequence of (unsigned) bytes with the most significant byte first:\n      //\n      construct_from_container(c, trivial_tag());\n   }\n   template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\n   BOOST_MP_CXX14_CONSTEXPR int compare_imp(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o, const std::integral_constant<bool, false>&, const std::integral_constant<bool, false>&) const noexcept\n   {\n      if (this->sign() != o.sign())\n         return this->sign() ? -1 : 1;\n\n      // Only do the compare if the same sign:\n      int result = compare_unsigned(o);\n\n      if (this->sign())\n         result = -result;\n      return result;\n   }\n   template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\n   BOOST_MP_CXX14_CONSTEXPR int compare_imp(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o, const std::integral_constant<bool, true>&, const std::integral_constant<bool, false>&) const\n   {\n      cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> t(*this);\n      return t.compare(o);\n   }\n   template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\n   BOOST_MP_CXX14_CONSTEXPR int compare_imp(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o, const std::integral_constant<bool, false>&, const std::integral_constant<bool, true>&) const\n   {\n      cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> t(o);\n      return compare(t);\n   }\n   template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\n   BOOST_MP_CXX14_CONSTEXPR int compare_imp(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o, const std::integral_constant<bool, true>&, const std::integral_constant<bool, true>&) const noexcept\n   {\n      if (this->sign())\n      {\n         if (o.sign())\n         {\n            return *this->limbs() < *o.limbs() ? 1 : (*this->limbs() > *o.limbs() ? -1 : 0);\n         }\n         else\n            return -1;\n      }\n      else\n      {\n         if (o.sign())\n            return 1;\n         return *this->limbs() < *o.limbs() ? -1 : (*this->limbs() > *o.limbs() ? 1 : 0);\n      }\n   }\n   template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\n   BOOST_MP_CXX14_CONSTEXPR int compare(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) const noexcept\n   {\n      using t1 = std::integral_constant<bool, is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value>     ;\n      using t2 = std::integral_constant<bool, is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>;\n      return compare_imp(o, t1(), t2());\n   }\n   template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\n   BOOST_MP_CXX14_CONSTEXPR int compare_unsigned(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) const noexcept\n   {\n      if (this->size() != o.size())\n      {\n         return this->size() > o.size() ? 1 : -1;\n      }\n      typename base_type::const_limb_pointer pa = this->limbs();\n      typename base_type::const_limb_pointer pb = o.limbs();\n      for (std::ptrdiff_t i = static_cast<std::ptrdiff_t>(static_cast<std::ptrdiff_t>(this->size()) - 1); i >= 0; --i)\n      {\n         if (pa[i] != pb[i])\n            return pa[i] > pb[i] ? 1 : -1;\n      }\n      return 0;\n   }\n   template <class Arithmetic>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<Arithmetic>::value, int>::type compare(Arithmetic i) const\n   {\n      // braindead version:\n      cpp_int_backend t;\n      t = i;\n      return compare(t);\n   }\n};\n\n} // namespace backends\n\nnamespace default_ops {\n\ntemplate <class Backend>\nstruct double_precision_type;\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>\nstruct double_precision_type<backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >\n{\n   using type = typename std::conditional<\n       backends::is_fixed_precision<backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value,\n       backends::cpp_int_backend<\n           (std::is_void<Allocator>::value ? 2 * backends::max_precision<backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value\n                                      : MinBits),\n           2 * backends::max_precision<backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value,\n           SignType,\n           Checked,\n           Allocator>,\n       backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::type;\n};\n\n} // namespace default_ops\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>\nstruct is_equivalent_number_type<backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, backends::cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >\n   : public std::integral_constant<bool, std::numeric_limits<number<backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, et_on> >::digits == std::numeric_limits<number<backends::cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>, et_on> >::digits>{};\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked>\nstruct expression_template_default<backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, void> >\n{\n   static constexpr expression_template_option value = et_off;\n};\n\nusing boost::multiprecision::backends::cpp_int_backend;\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>\nstruct number_category<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> > : public std::integral_constant<int, number_kind_integer>\n{};\n\nusing cpp_int = number<cpp_int_backend<> >          ;\nusing cpp_rational_backend = rational_adaptor<cpp_int_backend<> >;\nusing cpp_rational = number<cpp_rational_backend>        ;\n\n// Fixed precision unsigned types:\nusing uint128_t = number<cpp_int_backend<128, 128, unsigned_magnitude, unchecked, void> >  ;\nusing uint256_t = number<cpp_int_backend<256, 256, unsigned_magnitude, unchecked, void> >  ;\nusing uint512_t = number<cpp_int_backend<512, 512, unsigned_magnitude, unchecked, void> >  ;\nusing uint1024_t = number<cpp_int_backend<1024, 1024, unsigned_magnitude, unchecked, void> >;\n\n// Fixed precision signed types:\nusing int128_t = number<cpp_int_backend<128, 128, signed_magnitude, unchecked, void> >  ;\nusing int256_t = number<cpp_int_backend<256, 256, signed_magnitude, unchecked, void> >  ;\nusing int512_t = number<cpp_int_backend<512, 512, signed_magnitude, unchecked, void> >  ;\nusing int1024_t = number<cpp_int_backend<1024, 1024, signed_magnitude, unchecked, void> >;\n\n// Over again, but with checking enabled this time:\nusing checked_cpp_int = number<cpp_int_backend<0, 0, signed_magnitude, checked> >          ;\nusing checked_cpp_rational_backend = rational_adaptor<cpp_int_backend<0, 0, signed_magnitude, checked> >;\nusing checked_cpp_rational = number<checked_cpp_rational_backend>                               ;\n// Fixed precision unsigned types:\nusing checked_uint128_t = number<cpp_int_backend<128, 128, unsigned_magnitude, checked, void> >  ;\nusing checked_uint256_t = number<cpp_int_backend<256, 256, unsigned_magnitude, checked, void> >  ;\nusing checked_uint512_t = number<cpp_int_backend<512, 512, unsigned_magnitude, checked, void> >  ;\nusing checked_uint1024_t = number<cpp_int_backend<1024, 1024, unsigned_magnitude, checked, void> >;\n\n// Fixed precision signed types:\nusing checked_int128_t = number<cpp_int_backend<128, 128, signed_magnitude, checked, void> >  ;\nusing checked_int256_t = number<cpp_int_backend<256, 256, signed_magnitude, checked, void> >  ;\nusing checked_int512_t = number<cpp_int_backend<512, 512, signed_magnitude, checked, void> >  ;\nusing checked_int1024_t = number<cpp_int_backend<1024, 1024, signed_magnitude, checked, void> >;\n\n#if defined(__GNUC__) && !defined(__clang__)\n// see https://github.com/boostorg/multiprecision/issues/413\n// and https://github.com/boostorg/multiprecision/issues/431\n#pragma GCC diagnostic pop\n#endif\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n}} // namespace boost::multiprecision\n\n//\n// Last of all we include the implementations of all the eval_* non member functions:\n//\n#include <boost/multiprecision/cpp_int/limits.hpp>\n#include <boost/multiprecision/cpp_int/comparison.hpp>\n#include <boost/multiprecision/cpp_int/add.hpp>\n#include <boost/multiprecision/cpp_int/multiply.hpp>\n#include <boost/multiprecision/cpp_int/divide.hpp>\n#include <boost/multiprecision/cpp_int/bitwise.hpp>\n#include <boost/multiprecision/cpp_int/misc.hpp>\n#include <boost/multiprecision/cpp_int/literals.hpp>\n#include <boost/multiprecision/cpp_int/serialize.hpp>\n#include <boost/multiprecision/cpp_int/import_export.hpp>\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/debug_adaptor.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_DEBUG_ADAPTOR_HPP\n#define BOOST_MP_DEBUG_ADAPTOR_HPP\n\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/traits/extract_exponent_type.hpp>\n#include <boost/multiprecision/detail/integer_ops.hpp>\n\nnamespace boost {\nnamespace multiprecision {\nnamespace backends {\n\ntemplate <class Backend>\nstruct debug_adaptor\n{\n   using signed_types = typename Backend::signed_types  ;\n   using unsigned_types = typename Backend::unsigned_types;\n   using float_types = typename Backend::float_types   ;\n   using exponent_type = typename extract_exponent_type<Backend, number_category<Backend>::value>::type;\n\n private:\n   std::string debug_value;\n   Backend     m_value;\n\n public:\n   void update_view()\n   {\n#ifndef BOOST_NO_EXCEPTIONS\n      try\n      {\n#endif\n         debug_value = m_value.str(0, static_cast<std::ios_base::fmtflags>(0));\n#ifndef BOOST_NO_EXCEPTIONS\n      }\n      catch (const std::exception& e)\n      {\n         debug_value = \"String conversion failed with message: \\\"\";\n         debug_value += e.what();\n         debug_value += \"\\\"\";\n      }\n#endif\n   }\n   debug_adaptor()\n   {\n      update_view();\n   }\n   debug_adaptor(const debug_adaptor& o) : debug_value(o.debug_value), m_value(o.m_value)\n   {\n   }\n   debug_adaptor& operator=(const debug_adaptor& o)\n   {\n      debug_value = o.debug_value;\n      m_value     = o.m_value;\n      return *this;\n   }\n   template <class T>\n   debug_adaptor(const T& i, const typename std::enable_if<std::is_convertible<T, Backend>::value>::type* = nullptr)\n       : m_value(i)\n   {\n      update_view();\n   }\n   template <class T>\n   debug_adaptor(const debug_adaptor<T>& i, const typename std::enable_if<std::is_convertible<T, Backend>::value>::type* = nullptr)\n       : m_value(i.value())\n   {\n      update_view();\n   }\n   template <class T, class U>\n   debug_adaptor(const T& i, const U& j, typename std::enable_if<std::is_constructible<Backend, const T&, const U&>::value>::type* = nullptr)\n       : m_value(i, j)\n   {\n      update_view();\n   }\n   template <class B2>\n   debug_adaptor(const B2& i, unsigned digits10, typename std::enable_if<std::is_same<B2, Backend>::value && std::is_constructible<Backend, const Backend&, unsigned>::value>::type* = nullptr)\n       : m_value(i, digits10)\n   {\n      update_view();\n   }\n   template <class T>\n   typename std::enable_if<boost::multiprecision::detail::is_arithmetic<T>::value || std::is_assignable<Backend, T>::value, debug_adaptor&>::type operator=(const T& i)\n   {\n      m_value = i;\n      update_view();\n      return *this;\n   }\n   debug_adaptor& operator=(const char* s)\n   {\n      m_value = s;\n      update_view();\n      return *this;\n   }\n   void swap(debug_adaptor& o)\n   {\n      std::swap(m_value, o.value());\n      std::swap(debug_value, o.debug_value);\n   }\n   std::string str(std::streamsize digits, std::ios_base::fmtflags f) const\n   {\n      return m_value.str(digits, f);\n   }\n   void negate()\n   {\n      m_value.negate();\n      update_view();\n   }\n   int compare(const debug_adaptor& o) const\n   {\n      return m_value.compare(o.value());\n   }\n   template <class T>\n   int compare(const T& i) const\n   {\n      return m_value.compare(i);\n   }\n   Backend& value()\n   {\n      return m_value;\n   }\n   const Backend& value() const\n   {\n      return m_value;\n   }\n\n   #ifndef BOOST_MP_STANDALONE\n   template <class Archive>\n   void serialize(Archive& ar, const unsigned int /*version*/)\n   {\n      ar & boost::make_nvp(\"value\", m_value);\n      using tag = typename Archive::is_loading;\n      if (tag::value)\n         update_view();\n   }\n   #endif \n   \n   static unsigned default_precision() noexcept\n   {\n      return Backend::default_precision();\n   }\n   static void default_precision(unsigned v) noexcept\n   {\n      Backend::default_precision(v);\n   }\n   static unsigned thread_default_precision() noexcept\n   {\n      return Backend::thread_default_precision();\n   }\n   static void thread_default_precision(unsigned v) noexcept\n   {\n      Backend::thread_default_precision(v);\n   }\n   unsigned precision() const noexcept\n   {\n      return value().precision();\n   }\n   void precision(unsigned digits10) noexcept\n   {\n      value().precision(digits10);\n   }\n   //\n   // Variable precision options:\n   // \n   static constexpr variable_precision_options default_variable_precision_options()noexcept\n   {\n      return Backend::default_variable_precision_options();\n   }\n   static constexpr variable_precision_options thread_default_variable_precision_options()noexcept\n   {\n      return Backend::thread_default_variable_precision_options();\n   }\n   static BOOST_MP_CXX14_CONSTEXPR void default_variable_precision_options(variable_precision_options opts)\n   {\n      Backend::default_variable_precision_options(opts);\n   }\n   static BOOST_MP_CXX14_CONSTEXPR void thread_default_variable_precision_options(variable_precision_options opts)\n   {\n      Backend::thread_default_variable_precision_options(opts);\n   }\n};\n\ntemplate <class Backend>\ninline Backend const& unwrap_debug_type(debug_adaptor<Backend> const& val)\n{\n   return val.value();\n}\ntemplate <class T>\ninline const T& unwrap_debug_type(const T& val)\n{\n   return val;\n}\n\ntemplate <class Backend, class V, class U>\ninline BOOST_MP_CXX14_CONSTEXPR void assign_components(debug_adaptor<Backend>& result, const V& v1, const U& v2)\n{\n   using default_ops::assign_components;\n   assign_components(result.value(), unwrap_debug_type(v1), unwrap_debug_type(v2));\n   result.update_view();\n}\n\n#define NON_MEMBER_OP1(name, str)                                       \\\n   template <class Backend>                                             \\\n   inline void BOOST_JOIN(eval_, name)(debug_adaptor<Backend> & result) \\\n   {                                                                    \\\n      using default_ops::BOOST_JOIN(eval_, name);                       \\\n      BOOST_JOIN(eval_, name)                                           \\\n      (result.value());                                                 \\\n      result.update_view();                                             \\\n   }\n\n#define NON_MEMBER_OP2(name, str)                                                                        \\\n   template <class Backend, class T>                                                                     \\\n   inline void BOOST_JOIN(eval_, name)(debug_adaptor<Backend> & result, const T& a)                      \\\n   {                                                                                                     \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                        \\\n      BOOST_JOIN(eval_, name)                                                                            \\\n      (result.value(), unwrap_debug_type(a));                                                            \\\n      result.update_view();                                                                              \\\n   }                                                                                                     \\\n   template <class Backend>                                                                              \\\n   inline void BOOST_JOIN(eval_, name)(debug_adaptor<Backend> & result, const debug_adaptor<Backend>& a) \\\n   {                                                                                                     \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                        \\\n      BOOST_JOIN(eval_, name)                                                                            \\\n      (result.value(), unwrap_debug_type(a));                                                            \\\n      result.update_view();                                                                              \\\n   }\n\n#define NON_MEMBER_OP3(name, str)                                                                                                         \\\n   template <class Backend, class T, class U>                                                                                             \\\n   inline void BOOST_JOIN(eval_, name)(debug_adaptor<Backend> & result, const T& a, const U& b)                                           \\\n   {                                                                                                                                      \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                                                         \\\n      BOOST_JOIN(eval_, name)                                                                                                             \\\n      (result.value(), unwrap_debug_type(a), unwrap_debug_type(b));                                                                       \\\n      result.update_view();                                                                                                               \\\n   }                                                                                                                                      \\\n   template <class Backend, class T>                                                                                                      \\\n   inline void BOOST_JOIN(eval_, name)(debug_adaptor<Backend> & result, const debug_adaptor<Backend>& a, const T& b)                      \\\n   {                                                                                                                                      \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                                                         \\\n      BOOST_JOIN(eval_, name)                                                                                                             \\\n      (result.value(), unwrap_debug_type(a), unwrap_debug_type(b));                                                                       \\\n      result.update_view();                                                                                                               \\\n   }                                                                                                                                      \\\n   template <class Backend, class T>                                                                                                      \\\n   inline void BOOST_JOIN(eval_, name)(debug_adaptor<Backend> & result, const T& a, const debug_adaptor<Backend>& b)                      \\\n   {                                                                                                                                      \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                                                         \\\n      BOOST_JOIN(eval_, name)                                                                                                             \\\n      (result.value(), unwrap_debug_type(a), unwrap_debug_type(b));                                                                       \\\n      result.update_view();                                                                                                               \\\n   }                                                                                                                                      \\\n   template <class Backend>                                                                                                               \\\n   inline void BOOST_JOIN(eval_, name)(debug_adaptor<Backend> & result, const debug_adaptor<Backend>& a, const debug_adaptor<Backend>& b) \\\n   {                                                                                                                                      \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                                                         \\\n      BOOST_JOIN(eval_, name)                                                                                                             \\\n      (result.value(), unwrap_debug_type(a), unwrap_debug_type(b));                                                                       \\\n      result.update_view();                                                                                                               \\\n   }\n\n#define NON_MEMBER_OP4(name, str)                                                                                                                                          \\\n   template <class Backend, class T, class U, class V>                                                                                                                     \\\n   inline void BOOST_JOIN(eval_, name)(debug_adaptor<Backend> & result, const T& a, const U& b, const V& c)                                                                \\\n   {                                                                                                                                                                       \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                                                                                          \\\n      BOOST_JOIN(eval_, name)                                                                                                                                              \\\n      (result.value(), unwrap_debug_type(a), unwrap_debug_type(b), unwrap_debug_type(c));                                                                                  \\\n      result.update_view();                                                                                                                                                \\\n   }                                                                                                                                                                       \\\n   template <class Backend, class T>                                                                                                                                       \\\n   inline void BOOST_JOIN(eval_, name)(debug_adaptor<Backend> & result, const debug_adaptor<Backend>& a, const debug_adaptor<Backend>& b, const T& c)                      \\\n   {                                                                                                                                                                       \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                                                                                          \\\n      BOOST_JOIN(eval_, name)                                                                                                                                              \\\n      (result.value(), unwrap_debug_type(a), unwrap_debug_type(b), unwrap_debug_type(c));                                                                                  \\\n      result.update_view();                                                                                                                                                \\\n   }                                                                                                                                                                       \\\n   template <class Backend, class T>                                                                                                                                       \\\n   inline void BOOST_JOIN(eval_, name)(debug_adaptor<Backend> & result, const debug_adaptor<Backend>& a, const T& b, const debug_adaptor<Backend>& c)                      \\\n   {                                                                                                                                                                       \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                                                                                          \\\n      BOOST_JOIN(eval_, name)                                                                                                                                              \\\n      (result.value(), unwrap_debug_type(a), unwrap_debug_type(b), unwrap_debug_type(c));                                                                                  \\\n      result.update_view();                                                                                                                                                \\\n   }                                                                                                                                                                       \\\n   template <class Backend, class T>                                                                                                                                       \\\n   inline void BOOST_JOIN(eval_, name)(debug_adaptor<Backend> & result, const T& a, const debug_adaptor<Backend>& b, const debug_adaptor<Backend>& c)                      \\\n   {                                                                                                                                                                       \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                                                                                          \\\n      BOOST_JOIN(eval_, name)                                                                                                                                              \\\n      (result.value(), unwrap_debug_type(a), unwrap_debug_type(b), unwrap_debug_type(c));                                                                                  \\\n      result.update_view();                                                                                                                                                \\\n   }                                                                                                                                                                       \\\n   template <class Backend>                                                                                                                                                \\\n   inline void BOOST_JOIN(eval_, name)(debug_adaptor<Backend> & result, const debug_adaptor<Backend>& a, const debug_adaptor<Backend>& b, const debug_adaptor<Backend>& c) \\\n   {                                                                                                                                                                       \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                                                                                          \\\n      BOOST_JOIN(eval_, name)                                                                                                                                              \\\n      (result.value(), unwrap_debug_type(a), unwrap_debug_type(b), unwrap_debug_type(c));                                                                                  \\\n      result.update_view();                                                                                                                                                \\\n   }                                                                                                                                                                       \\\n   template <class Backend, class T, class U>                                                                                                                              \\\n   inline void BOOST_JOIN(eval_, name)(debug_adaptor<Backend> & result, const debug_adaptor<Backend>& a, const T& b, const U& c)                                           \\\n   {                                                                                                                                                                       \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                                                                                          \\\n      BOOST_JOIN(eval_, name)                                                                                                                                              \\\n      (result.value(), unwrap_debug_type(a), unwrap_debug_type(b), unwrap_debug_type(c));                                                                                  \\\n      result.update_view();                                                                                                                                                \\\n   }\n\nNON_MEMBER_OP2(add, \"+=\")\nNON_MEMBER_OP2(subtract, \"-=\")\nNON_MEMBER_OP2(multiply, \"*=\")\nNON_MEMBER_OP2(divide, \"/=\")\n\ntemplate <class Backend, class R>\ninline void eval_convert_to(R* result, const debug_adaptor<Backend>& val)\n{\n   using default_ops::eval_convert_to;\n   eval_convert_to(result, val.value());\n}\ntemplate <class Backend, class R>\ninline void eval_convert_to(debug_adaptor<R>* result, const debug_adaptor<Backend>& val)\n{\n   using default_ops::eval_convert_to;\n   eval_convert_to(&result->value(), val.value());\n}\ntemplate <class Backend, class R>\ninline void eval_convert_to(debug_adaptor<R>* result, const Backend& val)\n{\n   using default_ops::eval_convert_to;\n   eval_convert_to(&result->value(), val);\n}\n\ntemplate <class Backend>\ninline void eval_convert_to(std::complex<float>* result, const debug_adaptor<Backend>& val)\n{\n   using default_ops::eval_convert_to;\n   eval_convert_to(result, val.value());\n}\ntemplate <class Backend>\ninline void eval_convert_to(std::complex<double>* result, const debug_adaptor<Backend>& val)\n{\n   using default_ops::eval_convert_to;\n   eval_convert_to(result, val.value());\n}\ntemplate <class Backend>\ninline void eval_convert_to(std::complex<long double>* result, const debug_adaptor<Backend>& val)\n{\n   using default_ops::eval_convert_to;\n   eval_convert_to(result, val.value());\n}\n\n\n\ntemplate <class Backend, class Exp>\ninline void eval_frexp(debug_adaptor<Backend>& result, const debug_adaptor<Backend>& arg, Exp* exp)\n{\n   eval_frexp(result.value(), arg.value(), exp);\n   result.update_view();\n}\n\ntemplate <class Backend, class Exp>\ninline void eval_ldexp(debug_adaptor<Backend>& result, const debug_adaptor<Backend>& arg, Exp exp)\n{\n   eval_ldexp(result.value(), arg.value(), exp);\n   result.update_view();\n}\n\ntemplate <class Backend, class Exp>\ninline void eval_scalbn(debug_adaptor<Backend>& result, const debug_adaptor<Backend>& arg, Exp exp)\n{\n   using default_ops::eval_scalbn;\n   eval_scalbn(result.value(), arg.value(), exp);\n   result.update_view();\n}\n\ntemplate <class Backend>\ninline typename Backend::exponent_type eval_ilogb(const debug_adaptor<Backend>& arg)\n{\n   using default_ops::eval_ilogb;\n   return eval_ilogb(arg.value());\n}\n\nNON_MEMBER_OP2(floor, \"floor\")\nNON_MEMBER_OP2(ceil, \"ceil\")\nNON_MEMBER_OP2(sqrt, \"sqrt\")\nNON_MEMBER_OP2(logb, \"logb\")\n\ntemplate <class Backend>\ninline int eval_fpclassify(const debug_adaptor<Backend>& arg)\n{\n   using default_ops::eval_fpclassify;\n   return eval_fpclassify(arg.value());\n}\n\n/*********************************************************************\n*\n* Optional arithmetic operations come next:\n*\n*********************************************************************/\n\nNON_MEMBER_OP3(add, \"+\")\nNON_MEMBER_OP3(subtract, \"-\")\nNON_MEMBER_OP3(multiply, \"*\")\nNON_MEMBER_OP3(divide, \"/\")\nNON_MEMBER_OP3(multiply_add, \"fused-multiply-add\")\nNON_MEMBER_OP3(multiply_subtract, \"fused-multiply-subtract\")\nNON_MEMBER_OP4(multiply_add, \"fused-multiply-add\")\nNON_MEMBER_OP4(multiply_subtract, \"fused-multiply-subtract\")\n\nNON_MEMBER_OP1(increment, \"increment\")\nNON_MEMBER_OP1(decrement, \"decrement\")\n\n/*********************************************************************\n*\n* Optional integer operations come next:\n*\n*********************************************************************/\n\nNON_MEMBER_OP2(modulus, \"%=\")\nNON_MEMBER_OP3(modulus, \"%\")\nNON_MEMBER_OP2(bitwise_or, \"|=\")\nNON_MEMBER_OP3(bitwise_or, \"|\")\nNON_MEMBER_OP2(bitwise_and, \"&=\")\nNON_MEMBER_OP3(bitwise_and, \"&\")\nNON_MEMBER_OP2(bitwise_xor, \"^=\")\nNON_MEMBER_OP3(bitwise_xor, \"^\")\nNON_MEMBER_OP4(qr, \"quotient-and-remainder\")\nNON_MEMBER_OP2(complement, \"~\")\n\ntemplate <class Backend>\ninline void eval_left_shift(debug_adaptor<Backend>& arg, std::size_t a)\n{\n   using default_ops::eval_left_shift;\n   eval_left_shift(arg.value(), a);\n   arg.update_view();\n}\ntemplate <class Backend>\ninline void eval_left_shift(debug_adaptor<Backend>& arg, const debug_adaptor<Backend>& a, std::size_t b)\n{\n   using default_ops::eval_left_shift;\n   eval_left_shift(arg.value(), a.value(), b);\n   arg.update_view();\n}\ntemplate <class Backend>\ninline void eval_right_shift(debug_adaptor<Backend>& arg, std::size_t a)\n{\n   using default_ops::eval_right_shift;\n   eval_right_shift(arg.value(), a);\n   arg.update_view();\n}\ntemplate <class Backend>\ninline void eval_right_shift(debug_adaptor<Backend>& arg, const debug_adaptor<Backend>& a, std::size_t b)\n{\n   using default_ops::eval_right_shift;\n   eval_right_shift(arg.value(), a.value(), b);\n   arg.update_view();\n}\n\ntemplate <class Backend, class T>\ninline T eval_integer_modulus(const debug_adaptor<Backend>& arg, const T& a)\n{\n   using default_ops::eval_integer_modulus;\n   return eval_integer_modulus(arg.value(), a);\n}\n\ntemplate <class Backend>\ninline std::size_t eval_lsb(const debug_adaptor<Backend>& arg)\n{\n   using default_ops::eval_lsb;\n   return eval_lsb(arg.value());\n}\n\ntemplate <class Backend>\ninline std::size_t eval_msb(const debug_adaptor<Backend>& arg)\n{\n   using default_ops::eval_msb;\n   return eval_msb(arg.value());\n}\n\ntemplate <class Backend>\ninline bool eval_bit_test(const debug_adaptor<Backend>& arg, std::size_t a)\n{\n   using default_ops::eval_bit_test;\n   return eval_bit_test(arg.value(), a);\n}\n\ntemplate <class Backend>\ninline void eval_bit_set(const debug_adaptor<Backend>& arg, std::size_t a)\n{\n   using default_ops::eval_bit_set;\n   eval_bit_set(arg.value(), a);\n   arg.update_view();\n}\ntemplate <class Backend>\ninline void eval_bit_unset(const debug_adaptor<Backend>& arg, std::size_t a)\n{\n   using default_ops::eval_bit_unset;\n   eval_bit_unset(arg.value(), a);\n   arg.update_view();\n}\ntemplate <class Backend>\ninline void eval_bit_flip(const debug_adaptor<Backend>& arg, std::size_t a)\n{\n   using default_ops::eval_bit_flip;\n   eval_bit_flip(arg.value(), a);\n   arg.update_view();\n}\n\nNON_MEMBER_OP3(gcd, \"gcd\")\nNON_MEMBER_OP3(lcm, \"lcm\")\nNON_MEMBER_OP4(powm, \"powm\")\n\n/*********************************************************************\n*\n* abs/fabs:\n*\n*********************************************************************/\n\nNON_MEMBER_OP2(abs, \"abs\")\nNON_MEMBER_OP2(fabs, \"fabs\")\n\n/*********************************************************************\n*\n* Floating point functions:\n*\n*********************************************************************/\n\nNON_MEMBER_OP2(trunc, \"trunc\")\nNON_MEMBER_OP2(round, \"round\")\nNON_MEMBER_OP2(exp, \"exp\")\nNON_MEMBER_OP2(log, \"log\")\nNON_MEMBER_OP2(log10, \"log10\")\nNON_MEMBER_OP2(sin, \"sin\")\nNON_MEMBER_OP2(cos, \"cos\")\nNON_MEMBER_OP2(tan, \"tan\")\nNON_MEMBER_OP2(asin, \"asin\")\nNON_MEMBER_OP2(acos, \"acos\")\nNON_MEMBER_OP2(atan, \"atan\")\nNON_MEMBER_OP2(sinh, \"sinh\")\nNON_MEMBER_OP2(cosh, \"cosh\")\nNON_MEMBER_OP2(tanh, \"tanh\")\nNON_MEMBER_OP2(asinh, \"asinh\")\nNON_MEMBER_OP2(acosh, \"acosh\")\nNON_MEMBER_OP2(atanh, \"atanh\")\nNON_MEMBER_OP3(fmod, \"fmod\")\nNON_MEMBER_OP3(pow, \"pow\")\nNON_MEMBER_OP3(atan2, \"atan2\")\nNON_MEMBER_OP2(conj, \"conj\")\n\ntemplate <class Backend>\nint eval_signbit(const debug_adaptor<Backend>& val)\n{\n   using default_ops::eval_signbit;\n   return eval_signbit(val.value());\n}\n\ntemplate <class Backend>\nstd::size_t hash_value(const debug_adaptor<Backend>& val)\n{\n   return hash_value(val.value());\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\ninline typename std::enable_if<number_category<Backend>::value == number_kind_rational, typename number<debug_adaptor<Backend>, ExpressionTemplates>::value_type>::type\n   numerator(const number<debug_adaptor<Backend>, ExpressionTemplates>& arg)\n{\n   number<Backend, ExpressionTemplates> t(arg.backend().value());\n   return numerator(t).backend();\n}\ntemplate <class Backend, expression_template_option ExpressionTemplates>\ninline typename std::enable_if<number_category<Backend>::value == number_kind_rational, typename number<debug_adaptor<Backend>, ExpressionTemplates>::value_type>::type\n   denominator(const number<debug_adaptor<Backend>, ExpressionTemplates>& arg)\n{\n   number<Backend, ExpressionTemplates> t(arg.backend().value());\n   return denominator(t).backend();\n}\n\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_real(To& to, const debug_adaptor<From>& from)\n{\n   using default_ops::eval_real;\n   eval_real(to, from.value());\n}\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_real(debug_adaptor<To>& to, const debug_adaptor<From>& from)\n{\n   using default_ops::eval_real;\n   eval_real(to.value(), from.value());\n   to.update_view();\n}\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_real(debug_adaptor<To>& to, const From& from)\n{\n   using default_ops::eval_real;\n   eval_real(to.value(), from);\n   to.update_view();\n}\n\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_imag(To& to, const debug_adaptor<From>& from)\n{\n   using default_ops::eval_imag;\n   eval_imag(to, from.value());\n}\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_imag(debug_adaptor<To>& to, const debug_adaptor<From>& from)\n{\n   using default_ops::eval_imag;\n   eval_imag(to.value(), from.value());\n   to.update_view();\n}\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_imag(debug_adaptor<To>& to, const From& from)\n{\n   using default_ops::eval_imag;\n   eval_imag(to.value(), from);\n   to.update_view();\n}\n\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_set_real(To& to, const debug_adaptor<From>& from)\n{\n   using default_ops::eval_set_real;\n   eval_set_real(to, from.value());\n}\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_set_real(debug_adaptor<To>& to, const debug_adaptor<From>& from)\n{\n   using default_ops::eval_set_real;\n   eval_set_real(to.value(), from.value());\n   to.update_view();\n}\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_set_real(debug_adaptor<To>& to, const From& from)\n{\n   using default_ops::eval_set_real;\n   eval_set_real(to.value(), from);\n   to.update_view();\n}\n\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_set_imag(To& to, const debug_adaptor<From>& from)\n{\n   using default_ops::eval_set_imag;\n   eval_set_imag(to, from.value());\n}\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_set_imag(debug_adaptor<To>& to, const debug_adaptor<From>& from)\n{\n   using default_ops::eval_set_imag;\n   eval_set_imag(to.value(), from.value());\n   to.update_view();\n}\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_set_imag(debug_adaptor<To>& to, const From& from)\n{\n   using default_ops::eval_set_imag;\n   eval_set_imag(to.value(), from);\n   to.update_view();\n}\n\n\n} // namespace backends\n\nusing backends::debug_adaptor;\n\nnamespace detail {\n   template <class Backend>\n   struct is_variable_precision<debug_adaptor<Backend> > : public is_variable_precision<Backend>\n   {};\n#ifdef BOOST_HAS_INT128\n   template <class Backend>\n   struct is_convertible_arithmetic<int128_type, debug_adaptor<Backend> > : public is_convertible_arithmetic<int128_type, Backend>\n   {};\n   template <class Backend>\n   struct is_convertible_arithmetic<uint128_type, debug_adaptor<Backend> > : public is_convertible_arithmetic<uint128_type, Backend>\n   {};\n#endif\n#ifdef BOOST_HAS_FLOAT128\n   template <class Backend>\n   struct is_convertible_arithmetic<float128_type, debug_adaptor<Backend> > : public is_convertible_arithmetic<float128_type, Backend>\n   {};\n#endif\n   } // namespace detail\n\ntemplate <class Backend>\nstruct number_category<backends::debug_adaptor<Backend> > : public number_category<Backend>\n{};\n\ntemplate <class Number>\nusing debug_adaptor_t = number<debug_adaptor<typename Number::backend_type>, Number::et>;\n\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\nstruct component_type<number<debug_adaptor<Backend>, ExpressionTemplates>>\n{\n   //\n   // We'll make the component_type also a debug_adaptor:\n   //\n   using base_component_type = typename component_type<number<Backend, ExpressionTemplates>>::type;\n   using base_component_backend = typename base_component_type::backend_type;\n   using type = number<debug_adaptor<base_component_backend>, ExpressionTemplates>;\n};\n\ntemplate <class Backend>\nstruct is_interval_number<backends::debug_adaptor<Backend> > : public is_interval_number<Backend> {};\n\n}} // namespace boost::multiprecision\n\nnamespace std {\n\ntemplate <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates>\nclass numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<Backend>, ExpressionTemplates> >\n    : public std::numeric_limits<boost::multiprecision::number<Backend, ExpressionTemplates> >\n{\n   using base_type = std::numeric_limits<boost::multiprecision::number<Backend, ExpressionTemplates> >                          ;\n   using number_type = boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<Backend>, ExpressionTemplates>;\n\n public:\n   static number_type(min)() noexcept { return (base_type::min)(); }\n   static number_type(max)() noexcept { return (base_type::max)(); }\n   static number_type lowest() noexcept { return -(max)(); }\n   static number_type epsilon() noexcept { return base_type::epsilon(); }\n   static number_type round_error() noexcept { return epsilon() / 2; }\n   static number_type infinity() noexcept { return base_type::infinity(); }\n   static number_type quiet_NaN() noexcept { return base_type::quiet_NaN(); }\n   static number_type signaling_NaN() noexcept { return base_type::signaling_NaN(); }\n   static number_type denorm_min() noexcept { return base_type::denorm_min(); }\n};\n\n} // namespace std\n\n#ifdef BOOST_MP_MATH_AVAILABLE\nnamespace boost {\nnamespace math {\n\nnamespace policies {\n\ntemplate <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\nstruct precision<boost::multiprecision::number<boost::multiprecision::debug_adaptor<Backend>, ExpressionTemplates>, Policy>\n    : public precision<boost::multiprecision::number<Backend, ExpressionTemplates>, Policy>\n{};\n\n#undef NON_MEMBER_OP1\n#undef NON_MEMBER_OP2\n#undef NON_MEMBER_OP3\n#undef NON_MEMBER_OP4\n\n}\n\n}} // namespace boost::math::policies\n#else\n#undef NON_MEMBER_OP1\n#undef NON_MEMBER_OP2\n#undef NON_MEMBER_OP3\n#undef NON_MEMBER_OP4\n#endif // BOOST_MP_MATH_AVAILABLE\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/assert.hpp",
    "content": "//  (C) Copyright Matt Borland 2021.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// We deliberately use assert in here:\n//\n// boost-no-inspect\n\n#ifndef BOOST_MP_DETAIL_ASSERT_HPP\n#define BOOST_MP_DETAIL_ASSERT_HPP\n\n#include <boost/multiprecision/detail/standalone_config.hpp>\n\n#ifndef BOOST_MP_STANDALONE\n\n#include <boost/assert.hpp>\n#define BOOST_MP_ASSERT(expr) BOOST_ASSERT(expr)\n#define BOOST_MP_ASSERT_MSG(expr, msg) BOOST_ASSERT_MSG(expr, msg)\n\n#else // Standalone mode - use cassert\n\n#include <cassert>\n#define BOOST_MP_ASSERT(expr) assert(expr)\n#define BOOST_MP_ASSERT_MSG(expr, msg) assert((expr)&&(msg))\n\n#endif\n\n#endif // BOOST_MP_DETAIL_ASSERT_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/atomic.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2017 John Maddock\n//  Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_DETAIL_ATOMIC_HPP\n#define BOOST_MP_DETAIL_ATOMIC_HPP\n\n#include <boost/multiprecision/detail/standalone_config.hpp>\n\n#ifdef BOOST_HAS_THREADS\n\n#  include <atomic>\n#  define BOOST_MATH_ATOMIC_NS std\nnamespace boost {\n   namespace multiprecision {\n      namespace detail {\n#if ATOMIC_INT_LOCK_FREE == 2\n         using atomic_counter_type = std::atomic<int>;\n         using atomic_unsigned_type = std::atomic<unsigned>;\n         using atomic_integer_type = int;\n         using atomic_unsigned_integer_type = unsigned;\n#elif ATOMIC_SHORT_LOCK_FREE == 2\n         using atomic_counter_type = std::atomic<short>;\n         using atomic_unsigned_type = std::atomic<unsigned short>;\n         using atomic_integer_type = short;\n         using atomic_unsigned_integer_type = unsigned short;\n#elif ATOMIC_LONG_LOCK_FREE == 2\n         using atomic_unsigned_integer_type = std::atomic<long>;\n         using atomic_unsigned_type = std::atomic<unsigned long>;\n         using atomic_unsigned_integer_type = unsigned long;\n         using atomic_integer_type = long;\n#elif ATOMIC_LLONG_LOCK_FREE == 2\n         using atomic_unsigned_integer_type = std::atomic<long long>;\n         using atomic_unsigned_type = std::atomic<unsigned long long>;\n         using atomic_integer_type = long long;\n         using atomic_unsigned_integer_type = unsigned long long;\n#else\n\n#define BOOST_MT_NO_ATOMIC_INT\n\n#endif\n      }\n   }}\n#else // BOOST_HAS_THREADS\n\n#define BOOST_MT_NO_ATOMIC_INT\n\n#endif // BOOST_HAS_THREADS\n\nnamespace boost { namespace multiprecision { namespace detail {\n\n#ifdef BOOST_MT_NO_ATOMIC_INT\nusing precision_type = unsigned;\n#else\nusing precision_type = atomic_unsigned_type;\n#endif\n\n} } }\n\n#endif // BOOST_MP_DETAIL_ATOMIC_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/bitscan.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2013 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// Comparison operators for cpp_int_backend:\n//\n#ifndef BOOST_MP_DETAIL_BITSCAN_HPP\n#define BOOST_MP_DETAIL_BITSCAN_HPP\n\n#include <cstdint>\n#include <climits>\n#include <type_traits>\n#include <boost/multiprecision/detail/endian.hpp>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n\n#if (defined(BOOST_MSVC) || (defined(__clang__) && defined(__c2__)) || (defined(BOOST_INTEL) && defined(_MSC_VER))) && (defined(_M_IX86) || defined(_M_X64))\n#include <intrin.h>\n#endif\n\nnamespace boost { namespace multiprecision { namespace detail {\n\ntemplate <class Unsigned>\ninline BOOST_MP_CXX14_CONSTEXPR std::size_t find_lsb_default(Unsigned mask)\n{\n   std::size_t result = 0;\n   while (!(mask & 1u))\n   {\n      mask >>= 1;\n      ++result;\n   }\n   return result;\n}\n\ntemplate <class Unsigned>\ninline BOOST_MP_CXX14_CONSTEXPR std::size_t find_msb_default(Unsigned mask)\n{\n   std::size_t index = 0;\n   while (mask)\n   {\n      ++index;\n      mask >>= 1;\n   }\n   return --index;\n}\n\ntemplate <class Unsigned>\ninline BOOST_MP_CXX14_CONSTEXPR std::size_t find_lsb(Unsigned mask, const std::integral_constant<int, 0>&)\n{\n   return find_lsb_default(mask);\n}\n\ntemplate <class Unsigned>\ninline BOOST_MP_CXX14_CONSTEXPR std::size_t find_msb(Unsigned mask, const std::integral_constant<int, 0>&)\n{\n   return find_msb_default(mask);\n}\n\n#if (defined(BOOST_MSVC) || (defined(__clang__) && defined(__c2__)) || (defined(BOOST_INTEL) && defined(_MSC_VER))) && (defined(_M_IX86) || defined(_M_X64))\n\n#pragma intrinsic(_BitScanForward, _BitScanReverse)\n\nBOOST_FORCEINLINE std::size_t find_lsb(unsigned long mask, const std::integral_constant<int, 1>&)\n{\n   unsigned long result;\n   _BitScanForward(&result, mask);\n   return result;\n}\n\nBOOST_FORCEINLINE std::size_t find_msb(unsigned long mask, const std::integral_constant<int, 1>&)\n{\n   unsigned long result;\n   _BitScanReverse(&result, mask);\n   return result;\n}\n#ifdef _M_X64\n\n#pragma intrinsic(_BitScanForward64, _BitScanReverse64)\n\nBOOST_FORCEINLINE std::size_t find_lsb(unsigned __int64 mask, const std::integral_constant<int, 2>&)\n{\n   unsigned long result;\n   _BitScanForward64(&result, mask);\n   return result;\n}\ntemplate <class Unsigned>\nBOOST_FORCEINLINE std::size_t find_msb(Unsigned mask, const std::integral_constant<int, 2>&)\n{\n   unsigned long result;\n   _BitScanReverse64(&result, mask);\n   return result;\n}\n#endif\n\ntemplate <class Unsigned>\nBOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR std::size_t find_lsb(Unsigned mask)\n{\n   using ui_type = typename boost::multiprecision::detail::make_unsigned<Unsigned>::type;\n   using tag_type = typename std::conditional<\n       sizeof(Unsigned) <= sizeof(unsigned long),\n       std::integral_constant<int, 1>,\n#ifdef _M_X64\n       typename std::conditional<\n           sizeof(Unsigned) <= sizeof(__int64),\n           std::integral_constant<int, 2>,\n           std::integral_constant<int, 0> >::type\n#else\n       std::integral_constant<int, 0>\n#endif\n       >::type;\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n   if (BOOST_MP_IS_CONST_EVALUATED(mask))\n   {\n      return find_lsb_default(mask);\n   }\n   else\n#endif\n      return find_lsb(static_cast<ui_type>(mask), tag_type());\n}\n\ntemplate <class Unsigned>\nBOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR std::size_t find_msb(Unsigned mask)\n{\n   using ui_type = typename boost::multiprecision::detail::make_unsigned<Unsigned>::type;\n   using tag_type = typename std::conditional<\n       sizeof(Unsigned) <= sizeof(unsigned long),\n       std::integral_constant<int, 1>,\n#ifdef _M_X64\n       typename std::conditional<\n           sizeof(Unsigned) <= sizeof(__int64),\n           std::integral_constant<int, 2>,\n           std::integral_constant<int, 0> >::type\n#else\n       std::integral_constant<int, 0>\n#endif\n       >::type;\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n   if (BOOST_MP_IS_CONST_EVALUATED(mask))\n   {\n      return find_msb_default(mask);\n   }\n   else\n#endif\n      return find_msb(static_cast<ui_type>(mask), tag_type());\n}\n\n#elif defined(BOOST_GCC) || defined(__clang__) || (defined(BOOST_INTEL) && defined(__GNUC__))\n\nBOOST_FORCEINLINE std::size_t find_lsb(std::size_t mask, std::integral_constant<int, 1> const&)\n{\n   return static_cast<std::size_t>(__builtin_ctz(static_cast<unsigned int>(mask)));\n}\nBOOST_FORCEINLINE std::size_t find_lsb(unsigned long mask, std::integral_constant<int, 2> const&)\n{\n   return static_cast<std::size_t>(__builtin_ctzl(static_cast<unsigned long>(mask)));\n}\nBOOST_FORCEINLINE std::size_t find_lsb(unsigned long long mask, std::integral_constant<int, 3> const&)\n{\n   return static_cast<std::size_t>(__builtin_ctzll(static_cast<unsigned long long>(mask)));\n}\nBOOST_FORCEINLINE std::size_t find_msb(std::size_t mask, std::integral_constant<int, 1> const&)\n{\n   return static_cast<std::size_t>(static_cast<std::size_t>(sizeof(unsigned) * static_cast<std::size_t>(CHAR_BIT) - 1u) - static_cast<std::size_t>(__builtin_clz(static_cast<unsigned int>(mask))));\n}\nBOOST_FORCEINLINE std::size_t find_msb(unsigned long mask, std::integral_constant<int, 2> const&)\n{\n   return static_cast<std::size_t>(static_cast<std::size_t>(sizeof(unsigned long) * static_cast<std::size_t>(CHAR_BIT) - 1u) - static_cast<std::size_t>(__builtin_clzl(static_cast<unsigned long>(mask))));\n}\nBOOST_FORCEINLINE std::size_t find_msb(unsigned long long mask, std::integral_constant<int, 3> const&)\n{\n   return static_cast<std::size_t>(static_cast<std::size_t>(sizeof(unsigned long long) * static_cast<std::size_t>(CHAR_BIT) - 1u) - static_cast<std::size_t>(__builtin_clzll(static_cast<unsigned long long>(mask))));\n}\n#ifdef BOOST_HAS_INT128\n\nBOOST_FORCEINLINE std::size_t find_msb(uint128_type mask, std::integral_constant<int, 0> const&)\n{\n   union\n   {\n      uint128_type    v;\n      std::uint64_t sv[2];\n   } val;\n   val.v = mask;\n#if BOOST_MP_ENDIAN_LITTLE_BYTE\n   if (val.sv[1])\n      return find_msb(val.sv[1], std::integral_constant<int, 3>()) + 64;\n   return find_msb(val.sv[0], std::integral_constant<int, 3>());\n#else\n   if (val.sv[0])\n      return find_msb(val.sv[0], std::integral_constant<int, 3>()) + 64;\n   return find_msb(val.sv[1], std::integral_constant<int, 3>());\n#endif\n}\nBOOST_FORCEINLINE std::size_t find_lsb(uint128_type mask, std::integral_constant<int, 0> const&)\n{\n   union\n   {\n      uint128_type    v;\n      std::uint64_t sv[2];\n   } val;\n   val.v = mask;\n#if BOOST_MP_ENDIAN_LITTLE_BYTE\n   if (val.sv[0] == 0)\n      return find_lsb(val.sv[1], std::integral_constant<int, 3>()) + 64;\n   return find_lsb(val.sv[0], std::integral_constant<int, 3>());\n#else\n   if (val.sv[1] == 0)\n      return find_lsb(val.sv[0], std::integral_constant<int, 3>()) + 64;\n   return find_lsb(val.sv[1], std::integral_constant<int, 3>());\n#endif\n}\n#endif\n\ntemplate <class Unsigned>\nBOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR std::size_t find_lsb(Unsigned mask)\n{\n   using ui_type = typename boost::multiprecision::detail::make_unsigned<Unsigned>::type;\n   using tag_type = typename std::conditional<\n       sizeof(Unsigned) <= sizeof(unsigned),\n       std::integral_constant<int, 1>,\n       typename std::conditional<\n           sizeof(Unsigned) <= sizeof(unsigned long),\n           std::integral_constant<int, 2>,\n           typename std::conditional<\n               sizeof(Unsigned) <= sizeof(unsigned long long),\n               std::integral_constant<int, 3>,\n               std::integral_constant<int, 0> >::type>::type>::type;\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n   if (BOOST_MP_IS_CONST_EVALUATED(mask))\n   {\n      return find_lsb_default(mask);\n   }\n   else\n#endif\n   return find_lsb(static_cast<ui_type>(mask), tag_type());\n}\ntemplate <class Unsigned>\nBOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR std::size_t find_msb(Unsigned mask)\n{\n   using ui_type = typename boost::multiprecision::detail::make_unsigned<Unsigned>::type;\n   using tag_type = typename std::conditional<\n       sizeof(Unsigned) <= sizeof(unsigned),\n       std::integral_constant<int, 1>,\n       typename std::conditional<\n           sizeof(Unsigned) <= sizeof(unsigned long),\n           std::integral_constant<int, 2>,\n           typename std::conditional<\n               sizeof(Unsigned) <= sizeof(unsigned long long),\n               std::integral_constant<int, 3>,\n               std::integral_constant<int, 0> >::type>::type>::type;\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n   if (BOOST_MP_IS_CONST_EVALUATED(mask))\n   {\n      return find_msb_default(mask);\n   }\n   else\n#endif\n      return find_msb(static_cast<ui_type>(mask), tag_type());\n}\n#elif defined(BOOST_INTEL)\nBOOST_FORCEINLINE std::size_t find_lsb(std::size_t mask, std::integral_constant<int, 1> const&)\n{\n   return _bit_scan_forward(mask);\n}\nBOOST_FORCEINLINE std::size_t find_msb(std::size_t mask, std::integral_constant<int, 1> const&)\n{\n   return _bit_scan_reverse(mask);\n}\ntemplate <class Unsigned>\nBOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR std::size_t find_lsb(Unsigned mask)\n{\n   using ui_type = typename boost::multiprecision::detail::make_unsigned<Unsigned>::type;\n   using tag_type = typename std::conditional<\n       sizeof(Unsigned) <= sizeof(unsigned),\n       std::integral_constant<int, 1>,\n       std::integral_constant<int, 0> >::type;\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n   if (BOOST_MP_IS_CONST_EVALUATED(mask))\n   {\n      return find_lsb_default(mask);\n   }\n   else\n#endif\n      return find_lsb(static_cast<ui_type>(mask), tag_type());\n}\ntemplate <class Unsigned>\nBOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR std::size_t find_msb(Unsigned mask)\n{\n   using ui_type = typename boost::multiprecision::detail::make_unsigned<Unsigned>::type;\n   using tag_type = typename std::conditional<\n       sizeof(Unsigned) <= sizeof(unsigned),\n       std::integral_constant<int, 1>,\n       std::integral_constant<int, 0> >::type;\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n   if (BOOST_MP_IS_CONST_EVALUATED(mask))\n   {\n      return find_msb_default(mask);\n   }\n   else\n#endif\n      return find_msb(static_cast<ui_type>(mask), tag_type());\n}\n#else\ntemplate <class Unsigned>\nBOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR std::size_t find_lsb(Unsigned mask)\n{\n   return find_lsb(mask, std::integral_constant<int, 0>());\n}\ntemplate <class Unsigned>\nBOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR std::size_t find_msb(Unsigned mask)\n{\n   return find_msb(mask, std::integral_constant<int, 0>());\n}\n#endif\n\n}}} // namespace boost::multiprecision::detail\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/check_cpp11_config.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_CHECK_CPP11_CONFIG_HPP\n#define BOOST_MP_CHECK_CPP11_CONFIG_HPP\n\n//\n// We now require C++11, if something we use is not supported, then error and say why:\n//\n#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES\n#error \"This library now requires a C++11 or later compiler - this message was generated as a result of BOOST_NO_CXX11_RVALUE_REFERENCES being set\"\n#endif\n#ifdef BOOST_NO_CXX11_TEMPLATE_ALIASES\n#error \"This library now requires a C++11 or later compiler - this message was generated as a result of BOOST_NO_CXX11_TEMPLATE_ALIASES being set\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_ARRAY\n#error \"This library now requires a C++11 or later compiler - this message was generated as a result of BOOST_NO_CXX11_HDR_ARRAY being set\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#error \"This library now requires a C++11 or later compiler - this message was generated as a result of BOOST_NO_CXX11_HDR_TYPE_TRAITS being set\"\n#endif\n#ifdef BOOST_NO_CXX11_ALLOCATOR\n#error \"This library now requires a C++11 or later compiler - this message was generated as a result of BOOST_NO_CXX11_ALLOCATOR being set\"\n#endif\n#ifdef BOOST_NO_CXX11_CONSTEXPR\n#error \"This library now requires a C++11 or later compiler - this message was generated as a result of BOOST_NO_CXX11_CONSTEXPR being set\"\n#endif\n#ifdef BOOST_MP_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#error \"This library now requires a C++11 or later compiler - this message was generated as a result of BOOST_MP_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS being set\"\n#endif\n#ifdef BOOST_NO_CXX11_REF_QUALIFIERS\n#error \"This library now requires a C++11 or later compiler - this message was generated as a result of BOOST_NO_CXX11_REF_QUALIFIERS being set\"\n#endif\n#ifdef BOOST_NO_CXX11_HDR_FUNCTIONAL\n#error \"This library now requires a C++11 or later compiler - this message was generated as a result of BOOST_NO_CXX11_HDR_FUNCTIONAL being set\"\n#endif\n#ifdef BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#error \"This library now requires a C++11 or later compiler - this message was generated as a result of BOOST_NO_CXX11_VARIADIC_TEMPLATES being set\"\n#endif\n#ifdef BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#error \"This library now requires a C++11 or later compiler - this message was generated as a result of BOOST_NO_CXX11_USER_DEFINED_LITERALS being set\"\n#endif\n#ifdef BOOST_NO_CXX11_DECLTYPE\n#error \"This library now requires a C++11 or later compiler - this message was generated as a result of BOOST_NO_CXX11_DECLTYPE being set\"\n#endif\n#ifdef BOOST_NO_CXX11_STATIC_ASSERT\n#error \"This library now requires a C++11 or later compiler - this message was generated as a result of BOOST_NO_CXX11_STATIC_ASSERT being set\"\n#endif\n#ifdef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#error \"This library now requires a C++11 or later compiler - this message was generated as a result of BOOST_NO_CXX11_DEFAULTED_FUNCTIONS being set\"\n#endif\n#ifdef BOOST_NO_CXX11_NOEXCEPT\n#error \"This library now requires a C++11 or later compiler - this message was generated as a result of BOOST_NO_CXX11_NOEXCEPT being set\"\n#endif\n#ifdef BOOST_NO_CXX11_REF_QUALIFIERS\n#error \"This library now requires a C++11 or later compiler - this message was generated as a result of BOOST_NO_CXX11_REF_QUALIFIERS being set\"\n#endif\n#ifdef BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#error \"This library now requires a C++11 or later compiler - this message was generated as a result of BOOST_NO_CXX11_USER_DEFINED_LITERALS being set\"\n#endif\n\n#endif // BOOST_MP_CHECK_CPP11_CONFIG_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/constexpr.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_DETAIL_CONSTEXPR_HPP\n#define BOOST_MP_DETAIL_CONSTEXPR_HPP\n\n#include <cstring>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n\nnamespace boost {\n\nnamespace multiprecision {\n\nnamespace std_constexpr {\n\ntemplate <class T>\ninline BOOST_CXX14_CONSTEXPR void swap(T& a, T& b)\n{\n   T t(a);\n   a = b;\n   b = t;\n}\n\ntemplate <class InputIterator, class OutputIterator>\ninline BOOST_CXX14_CONSTEXPR OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result)\n{\n   //\n   // There are 3 branches here, only one of which is selected at compile time:\n   //\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n   if (BOOST_MP_IS_CONST_EVALUATED(*first))\n   {\n      // constexpr safe code, never generates runtime code:\n      while (first != last)\n      {\n         *result = *first;\n         ++first;\n         ++result;\n      }\n      return result;\n   }\n   else\n#endif\n   {\n#ifndef BOOST_NO_CXX17_IF_CONSTEXPR\n      if constexpr (std::is_pointer<InputIterator>::value && std::is_pointer<OutputIterator>::value && std::is_trivially_copyable<typename std::remove_reference<decltype(*first)>::type>::value)\n      {\n         // The normal runtime branch:\n         std::memcpy(result, first, static_cast<std::size_t>(static_cast<std::size_t>(last - first) * sizeof(*first)));\n         return result + (last - first);\n      }\n      else\n#endif\n      {\n         // Alternate runtime branch:\n         while (first != last)\n         {\n            *result = *first;\n            ++first;\n            ++result;\n         }\n         return result;\n      }\n   }\n}\n\ntemplate <class I>\ninline BOOST_CXX14_CONSTEXPR bool equal(const I* first, const I* last, const I* other)\n{\n   while (first != last)\n   {\n      if (*first != *other)\n         return false;\n      ++first;\n      ++other;\n   }\n   return true;\n}\n\n}\n\n}\n\n} // namespace boost::multiprecision::std_constexpr\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/default_ops.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2011-21 John Maddock.\n//  Copyright 2021 Iskandarov Lev. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_DEFAULT_OPS\n#define BOOST_MP_DEFAULT_OPS\n\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n#include <boost/multiprecision/detail/number_base.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n#include <boost/multiprecision/traits/is_backend.hpp>\n#include <boost/multiprecision/detail/fpclassify.hpp>\n#include <cstdint>\n#include <complex>\n#ifndef BOOST_NO_CXX17_HDR_STRING_VIEW\n#include <string_view>\n#endif\n\n#ifdef BOOST_MP_MATH_AVAILABLE\n#include <boost/math/special_functions/fpclassify.hpp>\n#include <boost/math/special_functions/next.hpp>\n#include <boost/math/special_functions/hypot.hpp>\n#include <boost/math/policies/error_handling.hpp>\n#endif\n\n#ifndef INSTRUMENT_BACKEND\n#ifndef BOOST_MP_INSTRUMENT\n#define INSTRUMENT_BACKEND(x)\n#else\n#define INSTRUMENT_BACKEND(x) \\\n   std::cout << BOOST_STRINGIZE(x) << \" = \" << x.str(0, std::ios_base::scientific) << std::endl;\n#endif\n#endif\n\nnamespace boost {\nnamespace multiprecision {\n\nnamespace detail {\n\ntemplate <class To, class From>\nvoid generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_floating_point>& /*to_type*/, const std::integral_constant<int, number_kind_integer>& /*from_type*/);\ntemplate <class To, class From>\nvoid generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_integer>& /*to_type*/, const std::integral_constant<int, number_kind_integer>& /*from_type*/);\ntemplate <class To, class From>\nvoid generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_floating_point>& /*to_type*/, const std::integral_constant<int, number_kind_floating_point>& /*from_type*/);\ntemplate <class To, class From>\nvoid generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_rational>& /*to_type*/, const std::integral_constant<int, number_kind_rational>& /*from_type*/);\ntemplate <class To, class From>\nvoid generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_rational>& /*to_type*/, const std::integral_constant<int, number_kind_integer>& /*from_type*/);\n\ntemplate <class Integer>\nBOOST_MP_CXX14_CONSTEXPR Integer karatsuba_sqrt(const Integer& x, Integer& r, size_t bits);\n\n} // namespace detail\n\nnamespace default_ops {\n\ntemplate <class T>\nBOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_backend<T>::value, int>::type eval_signbit(const T& val);\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!boost::multiprecision::detail::is_backend<T>::value, int>::type eval_signbit(const T& val) { return val < 0; }\n\ninline int eval_signbit(float val) { return (std::signbit)(val); }\ninline int eval_signbit(double val) { return (std::signbit)(val); }\ninline int eval_signbit(long double val) { return (std::signbit)(val); }\n#ifdef BOOST_HAS_FLOAT128\nextern \"C\" int signbitq(float128_type) throw();\ninline int            eval_signbit(float128_type val) { return signbitq(val); }\n#endif\n\ntemplate <class T>\nBOOST_MP_CXX14_CONSTEXPR bool eval_is_zero(const T& val);\n\n#ifdef BOOST_MSVC\n// warning C4127: conditional expression is constant\n// warning C4146: unary minus operator applied to unsigned type, result still unsigned\n#pragma warning(push)\n#pragma warning(disable : 4127 4146)\n#endif\n//\n// Default versions of mixed arithmetic, these just construct a temporary\n// from the arithmetic value and then do the arithmetic on that, two versions\n// of each depending on whether the backend can be directly constructed from type V.\n//\n// Note that we have to provide *all* the template parameters to class number when used in\n// enable_if as MSVC-10 won't compile the code if we rely on a computed-default parameter.\n// Since the result of the test doesn't depend on whether expression templates are on or off\n// we just use et_on everywhere.  We could use a BOOST_WORKAROUND but that just obfuscates the\n// code even more....\n//\ntemplate <class T, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if< !std::is_convertible<V, T>::value>::type\neval_add(T& result, V const& v)\n{\n   T t;\n   t = v;\n   eval_add(result, t);\n}\ntemplate <class T, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, T>::value>::type\neval_add(T& result, V const& v)\n{\n   T t(v);\n   eval_add(result, t);\n}\ntemplate <class T, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if< !std::is_convertible<V, T>::value>::type\neval_subtract(T& result, V const& v)\n{\n   T t;\n   t = v;\n   eval_subtract(result, t);\n}\ntemplate <class T, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, T>::value>::type\neval_subtract(T& result, V const& v)\n{\n   T t(v);\n   eval_subtract(result, t);\n}\ntemplate <class T, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if< !std::is_convertible<V, T>::value>::type\neval_multiply(T& result, V const& v)\n{\n   T t;\n   t = v;\n   eval_multiply(result, t);\n}\ntemplate <class T, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, T>::value>::type\neval_multiply(T& result, V const& v)\n{\n   T t(v);\n   eval_multiply(result, t);\n}\n\ntemplate <class T, class U, class V>\nBOOST_MP_CXX14_CONSTEXPR void eval_multiply(T& t, const U& u, const V& v);\n\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!(!std::is_same<T, U>::value && std::is_same<T, V>::value)>::type eval_multiply_add(T& t, const U& u, const V& v)\n{\n   T z;\n   eval_multiply(z, u, v);\n   eval_add(t, z);\n}\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!std::is_same<T, U>::value && std::is_same<T, V>::value>::type eval_multiply_add(T& t, const U& u, const V& v)\n{\n   eval_multiply_add(t, v, u);\n}\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!(!std::is_same<T, U>::value && std::is_same<T, V>::value)>::type eval_multiply_subtract(T& t, const U& u, const V& v)\n{\n   T z;\n   eval_multiply(z, u, v);\n   eval_subtract(t, z);\n}\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!std::is_same<T, U>::value && std::is_same<T, V>::value>::type eval_multiply_subtract(T& t, const U& u, const V& v)\n{\n   eval_multiply_subtract(t, v, u);\n}\ntemplate <class T, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, number<T, et_on> >::value && !std::is_convertible<V, T>::value>::type\neval_divide(T& result, V const& v)\n{\n   T t;\n   t = v;\n   eval_divide(result, t);\n}\ntemplate <class T, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, number<T, et_on> >::value && std::is_convertible<V, T>::value>::type\neval_divide(T& result, V const& v)\n{\n   T t(v);\n   eval_divide(result, t);\n}\ntemplate <class T, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, number<T, et_on> >::value && !std::is_convertible<V, T>::value>::type\neval_modulus(T& result, V const& v)\n{\n   T t;\n   t = v;\n   eval_modulus(result, t);\n}\ntemplate <class T, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, number<T, et_on> >::value && std::is_convertible<V, T>::value>::type\neval_modulus(T& result, V const& v)\n{\n   T t(v);\n   eval_modulus(result, t);\n}\ntemplate <class T, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, number<T, et_on> >::value && !std::is_convertible<V, T>::value>::type\neval_bitwise_and(T& result, V const& v)\n{\n   T t;\n   t = v;\n   eval_bitwise_and(result, t);\n}\ntemplate <class T, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, number<T, et_on> >::value && std::is_convertible<V, T>::value>::type\neval_bitwise_and(T& result, V const& v)\n{\n   T t(v);\n   eval_bitwise_and(result, t);\n}\ntemplate <class T, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, number<T, et_on> >::value && !std::is_convertible<V, T>::value>::type\neval_bitwise_or(T& result, V const& v)\n{\n   T t;\n   t = v;\n   eval_bitwise_or(result, t);\n}\ntemplate <class T, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, number<T, et_on> >::value && std::is_convertible<V, T>::value>::type\neval_bitwise_or(T& result, V const& v)\n{\n   T t(v);\n   eval_bitwise_or(result, t);\n}\ntemplate <class T, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, number<T, et_on> >::value && !std::is_convertible<V, T>::value>::type\neval_bitwise_xor(T& result, V const& v)\n{\n   T t;\n   t = v;\n   eval_bitwise_xor(result, t);\n}\ntemplate <class T, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, number<T, et_on> >::value && std::is_convertible<V, T>::value>::type\neval_bitwise_xor(T& result, V const& v)\n{\n   T t(v);\n   eval_bitwise_xor(result, t);\n}\n\ntemplate <class T, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, number<T, et_on> >::value && !std::is_convertible<V, T>::value>::type\neval_complement(T& result, V const& v)\n{\n   T t;\n   t = v;\n   eval_complement(result, t);\n}\ntemplate <class T, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, number<T, et_on> >::value && std::is_convertible<V, T>::value>::type\neval_complement(T& result, V const& v)\n{\n   T t(v);\n   eval_complement(result, t);\n}\n\n//\n// Default versions of 3-arg arithmetic functions, these mostly just forward to the 2 arg versions:\n//\ntemplate <class T, class U, class V>\nBOOST_MP_CXX14_CONSTEXPR void eval_add(T& t, const U& u, const V& v);\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_add_default(T& t, const T& u, const T& v)\n{\n   if (&t == &v)\n   {\n      eval_add(t, u);\n   }\n   else if (&t == &u)\n   {\n      eval_add(t, v);\n   }\n   else\n   {\n      t = u;\n      eval_add(t, v);\n   }\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && !std::is_convertible<U, T>::value>::type eval_add_default(T& t, const T& u, const U& v)\n{\n   T vv;\n   vv = v;\n   eval_add(t, u, vv);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && std::is_convertible<U, T>::value>::type eval_add_default(T& t, const T& u, const U& v)\n{\n   T vv(v);\n   eval_add(t, u, vv);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value>::type eval_add_default(T& t, const U& u, const T& v)\n{\n   eval_add(t, v, u);\n}\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_add_default(T& t, const U& u, const V& v)\n{\n   BOOST_IF_CONSTEXPR(std::is_same<T, V>::value)\n   {\n      if ((void*)&t == (void*)&v)\n      {\n         eval_add(t, u);\n      }\n      else\n      {\n         t = u;\n         eval_add(t, v);\n      }\n   }\n   else\n   {\n      t = u;\n      eval_add(t, v);\n   }\n}\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_add(T& t, const U& u, const V& v)\n{\n   eval_add_default(t, u, v);\n}\n\ntemplate <class T, class U, class V>\nvoid BOOST_MP_CXX14_CONSTEXPR eval_subtract(T& t, const U& u, const V& v);\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_subtract_default(T& t, const T& u, const T& v)\n{\n   if ((&t == &v) && is_signed_number<T>::value)\n   {\n      eval_subtract(t, u);\n      t.negate();\n   }\n   else if (&t == &u)\n   {\n      eval_subtract(t, v);\n   }\n   else\n   {\n      t = u;\n      eval_subtract(t, v);\n   }\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && !std::is_convertible<U, T>::value>::type eval_subtract_default(T& t, const T& u, const U& v)\n{\n   T vv;\n   vv = v;\n   eval_subtract(t, u, vv);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && std::is_convertible<U, T>::value>::type eval_subtract_default(T& t, const T& u, const U& v)\n{\n   T vv(v);\n   eval_subtract(t, u, vv);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && is_signed_number<T>::value && (number_category<T>::value != number_kind_complex)>::type eval_subtract_default(T& t, const U& u, const T& v)\n{\n   eval_subtract(t, v, u);\n   if(!eval_is_zero(t) || (eval_signbit(u) != eval_signbit(v)))\n      t.negate();\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && is_signed_number<T>::value && (number_category<T>::value == number_kind_complex)>::type eval_subtract_default(T& t, const U& u, const T& v)\n{\n   eval_subtract(t, v, u);\n   t.negate();\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && !std::is_convertible<U, T>::value && is_unsigned_number<T>::value>::type eval_subtract_default(T& t, const U& u, const T& v)\n{\n   T temp;\n   temp = u;\n   eval_subtract(t, temp, v);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && std::is_convertible<U, T>::value && is_unsigned_number<T>::value>::type eval_subtract_default(T& t, const U& u, const T& v)\n{\n   T temp(u);\n   eval_subtract(t, temp, v);\n}\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_subtract_default(T& t, const U& u, const V& v)\n{\n   BOOST_IF_CONSTEXPR(std::is_same<T, V>::value)\n   {\n      if ((void*)&t == (void*)&v)\n      {\n         eval_subtract(t, u);\n         t.negate();\n      }\n      else\n      {\n         t = u;\n         eval_subtract(t, v);\n      }\n   }\n   else\n   {\n      t = u;\n      eval_subtract(t, v);\n   }\n}\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_subtract(T& t, const U& u, const V& v)\n{\n   eval_subtract_default(t, u, v);\n}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_multiply_default(T& t, const T& u, const T& v)\n{\n   if (&t == &v)\n   {\n      eval_multiply(t, u);\n   }\n   else if (&t == &u)\n   {\n      eval_multiply(t, v);\n   }\n   else\n   {\n      t = u;\n      eval_multiply(t, v);\n   }\n}\n#if !BOOST_WORKAROUND(BOOST_MSVC, < 1900)\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && !std::is_convertible<U, T>::value>::type eval_multiply_default(T& t, const T& u, const U& v)\n{\n   T vv;\n   vv = v;\n   eval_multiply(t, u, vv);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && std::is_convertible<U, T>::value>::type eval_multiply_default(T& t, const T& u, const U& v)\n{\n   T vv(v);\n   eval_multiply(t, u, vv);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value>::type eval_multiply_default(T& t, const U& u, const T& v)\n{\n   eval_multiply(t, v, u);\n}\n#endif\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_multiply_default(T& t, const U& u, const V& v)\n{\n   BOOST_IF_CONSTEXPR(std::is_same<T, V>::value)\n   {\n      if ((void*)&t == (void*)&v)\n      {\n         eval_multiply(t, u);\n      }\n      else\n      {\n         t = number<T>::canonical_value(u);\n         eval_multiply(t, v);\n      }\n   }\n   else\n   {\n      t = number<T>::canonical_value(u);\n      eval_multiply(t, v);\n   }\n}\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_multiply(T& t, const U& u, const V& v)\n{\n   eval_multiply_default(t, u, v);\n}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_multiply_add(T& t, const T& u, const T& v, const T& x)\n{\n   if ((void*)&x == (void*)&t)\n   {\n      T z;\n      z = number<T>::canonical_value(x);\n      eval_multiply_add(t, u, v, z);\n   }\n   else\n   {\n      eval_multiply(t, u, v);\n      eval_add(t, x);\n   }\n}\n\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if< !std::is_same<T, U>::value, T>::type make_T(const U& u)\n{\n   T t;\n   t = number<T>::canonical_value(u);\n   return t;\n}\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR const T& make_T(const T& t)\n{\n   return t;\n}\n\ntemplate <class T, class U, class V, class X>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!(!std::is_same<T, U>::value && std::is_same<T, V>::value)>::type eval_multiply_add(T& t, const U& u, const V& v, const X& x)\n{\n   eval_multiply_add(t, make_T<T>(u), make_T<T>(v), make_T<T>(x));\n}\ntemplate <class T, class U, class V, class X>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!std::is_same<T, U>::value && std::is_same<T, V>::value>::type eval_multiply_add(T& t, const U& u, const V& v, const X& x)\n{\n   eval_multiply_add(t, v, u, x);\n}\ntemplate <class T, class U, class V, class X>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!(!std::is_same<T, U>::value && std::is_same<T, V>::value)>::type eval_multiply_subtract(T& t, const U& u, const V& v, const X& x)\n{\n   if ((void*)&x == (void*)&t)\n   {\n      T z;\n      z = x;\n      eval_multiply_subtract(t, u, v, z);\n   }\n   else\n   {\n      eval_multiply(t, u, v);\n      eval_subtract(t, x);\n   }\n}\ntemplate <class T, class U, class V, class X>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!std::is_same<T, U>::value && std::is_same<T, V>::value>::type eval_multiply_subtract(T& t, const U& u, const V& v, const X& x)\n{\n   eval_multiply_subtract(t, v, u, x);\n}\n\ntemplate <class T, class U, class V>\nBOOST_MP_CXX14_CONSTEXPR void eval_divide(T& t, const U& u, const V& v);\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_divide_default(T& t, const T& u, const T& v)\n{\n   if (&t == &u)\n      eval_divide(t, v);\n   else if (&t == &v)\n   {\n      T temp;\n      eval_divide(temp, u, v);\n      temp.swap(t);\n   }\n   else\n   {\n      t = u;\n      eval_divide(t, v);\n   }\n}\n#if !BOOST_WORKAROUND(BOOST_MSVC, < 1900)\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && !std::is_convertible<U, T>::value>::type eval_divide_default(T& t, const T& u, const U& v)\n{\n   T vv;\n   vv = v;\n   eval_divide(t, u, vv);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && std::is_convertible<U, T>::value>::type eval_divide_default(T& t, const T& u, const U& v)\n{\n   T vv(v);\n   eval_divide(t, u, vv);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && !std::is_convertible<U, T>::value>::type eval_divide_default(T& t, const U& u, const T& v)\n{\n   T uu;\n   uu = u;\n   eval_divide(t, uu, v);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && std::is_convertible<U, T>::value>::type eval_divide_default(T& t, const U& u, const T& v)\n{\n   T uu(u);\n   eval_divide(t, uu, v);\n}\n#endif\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_divide_default(T& t, const U& u, const V& v)\n{\n   BOOST_IF_CONSTEXPR(std::is_same<T, V>::value)\n   {\n      if ((void*)&t == (void*)&v)\n      {\n         T temp;\n         temp = u;\n         eval_divide(temp, v);\n         t = temp;\n      }\n      else\n      {\n         t = u;\n         eval_divide(t, v);\n      }\n   }\n   else\n   {\n      t = u;\n      eval_divide(t, v);\n   }\n}\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_divide(T& t, const U& u, const V& v)\n{\n   eval_divide_default(t, u, v);\n}\n\ntemplate <class T, class U, class V>\nBOOST_MP_CXX14_CONSTEXPR void eval_modulus(T& t, const U& u, const V& v);\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_modulus_default(T& t, const T& u, const T& v)\n{\n   if (&t == &u)\n      eval_modulus(t, v);\n   else if (&t == &v)\n   {\n      T temp;\n      eval_modulus(temp, u, v);\n      temp.swap(t);\n   }\n   else\n   {\n      t = u;\n      eval_modulus(t, v);\n   }\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && !std::is_convertible<U, T>::value>::type eval_modulus_default(T& t, const T& u, const U& v)\n{\n   T vv;\n   vv = v;\n   eval_modulus(t, u, vv);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && std::is_convertible<U, T>::value>::type eval_modulus_default(T& t, const T& u, const U& v)\n{\n   T vv(v);\n   eval_modulus(t, u, vv);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && !std::is_convertible<U, T>::value>::type eval_modulus_default(T& t, const U& u, const T& v)\n{\n   T uu;\n   uu = u;\n   eval_modulus(t, uu, v);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && std::is_convertible<U, T>::value>::type eval_modulus_default(T& t, const U& u, const T& v)\n{\n   T uu(u);\n   eval_modulus(t, uu, v);\n}\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_modulus_default(T& t, const U& u, const V& v)\n{\n   BOOST_IF_CONSTEXPR(std::is_same<T, V>::value)\n   {\n      if ((void*)&t == (void*)&v)\n      {\n         T temp(u);\n         eval_modulus(temp, v);\n         t = temp;\n      }\n      else\n      {\n         t = u;\n         eval_modulus(t, v);\n      }\n   }\n   else\n   {\n      t = u;\n      eval_modulus(t, v);\n   }\n}\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_modulus(T& t, const U& u, const V& v)\n{\n   eval_modulus_default(t, u, v);\n}\n\ntemplate <class T, class U, class V>\nBOOST_MP_CXX14_CONSTEXPR void eval_bitwise_and(T& t, const U& u, const V& v);\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_and_default(T& t, const T& u, const T& v)\n{\n   if (&t == &v)\n   {\n      eval_bitwise_and(t, u);\n   }\n   else if (&t == &u)\n   {\n      eval_bitwise_and(t, v);\n   }\n   else\n   {\n      t = u;\n      eval_bitwise_and(t, v);\n   }\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if< !std::is_convertible<U, T>::value>::type eval_bitwise_and_default(T& t, const T& u, const U& v)\n{\n   T vv;\n   vv = v;\n   eval_bitwise_and(t, u, vv);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, T>::value>::type eval_bitwise_and_default(T& t, const T& u, const U& v)\n{\n   T vv(v);\n   eval_bitwise_and(t, u, vv);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value>::type eval_bitwise_and_default(T& t, const U& u, const T& v)\n{\n   eval_bitwise_and(t, v, u);\n}\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!std::is_same<T, U>::value || std::is_same<T, V>::value>::type eval_bitwise_and_default(T& t, const U& u, const V& v)\n{\n   t = u;\n   eval_bitwise_and(t, v);\n}\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_and(T& t, const U& u, const V& v)\n{\n   eval_bitwise_and_default(t, u, v);\n}\n\ntemplate <class T, class U, class V>\nBOOST_MP_CXX14_CONSTEXPR void eval_bitwise_or(T& t, const U& u, const V& v);\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_or_default(T& t, const T& u, const T& v)\n{\n   if (&t == &v)\n   {\n      eval_bitwise_or(t, u);\n   }\n   else if (&t == &u)\n   {\n      eval_bitwise_or(t, v);\n   }\n   else\n   {\n      t = u;\n      eval_bitwise_or(t, v);\n   }\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && !std::is_convertible<U, T>::value>::type eval_bitwise_or_default(T& t, const T& u, const U& v)\n{\n   T vv;\n   vv = v;\n   eval_bitwise_or(t, u, vv);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && std::is_convertible<U, T>::value>::type eval_bitwise_or_default(T& t, const T& u, const U& v)\n{\n   T vv(v);\n   eval_bitwise_or(t, u, vv);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value>::type eval_bitwise_or_default(T& t, const U& u, const T& v)\n{\n   eval_bitwise_or(t, v, u);\n}\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_or_default(T& t, const U& u, const V& v)\n{\n   BOOST_IF_CONSTEXPR(std::is_same<T, V>::value)\n   {\n      if ((void*)&t == (void*)&v)\n      {\n         eval_bitwise_or(t, u);\n      }\n      else\n      {\n         t = u;\n         eval_bitwise_or(t, v);\n      }\n   }\n   else\n   {\n      t = u;\n      eval_bitwise_or(t, v);\n   }\n}\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_or(T& t, const U& u, const V& v)\n{\n   eval_bitwise_or_default(t, u, v);\n}\n\ntemplate <class T, class U, class V>\nBOOST_MP_CXX14_CONSTEXPR void eval_bitwise_xor(T& t, const U& u, const V& v);\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_xor_default(T& t, const T& u, const T& v)\n{\n   if (&t == &v)\n   {\n      eval_bitwise_xor(t, u);\n   }\n   else if (&t == &u)\n   {\n      eval_bitwise_xor(t, v);\n   }\n   else\n   {\n      t = u;\n      eval_bitwise_xor(t, v);\n   }\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && !std::is_convertible<U, T>::value>::type eval_bitwise_xor_default(T& t, const T& u, const U& v)\n{\n   T vv;\n   vv = v;\n   eval_bitwise_xor(t, u, vv);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value && std::is_convertible<U, T>::value>::type eval_bitwise_xor_default(T& t, const T& u, const U& v)\n{\n   T vv(v);\n   eval_bitwise_xor(t, u, vv);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<U, number<T, et_on> >::value>::type eval_bitwise_xor_default(T& t, const U& u, const T& v)\n{\n   eval_bitwise_xor(t, v, u);\n}\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_xor_default(T& t, const U& u, const V& v)\n{\n   BOOST_IF_CONSTEXPR(std::is_same<T, V>::value)\n   {\n      if ((void*)&t == (void*)&v)\n      {\n         eval_bitwise_xor(t, u);\n      }\n      else\n      {\n         t = u;\n         eval_bitwise_xor(t, v);\n      }\n   }\n   else\n   {\n      t = u;\n      eval_bitwise_xor(t, v);\n   }\n}\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_xor(T& t, const U& u, const V& v)\n{\n   eval_bitwise_xor_default(t, u, v);\n}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_increment(T& val)\n{\n   using ui_type = typename std::tuple_element<0, typename T::unsigned_types>::type;\n   eval_add(val, static_cast<ui_type>(1u));\n}\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_decrement(T& val)\n{\n   using ui_type = typename std::tuple_element<0, typename T::unsigned_types>::type;\n   eval_subtract(val, static_cast<ui_type>(1u));\n}\n\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_left_shift(T& result, const U& arg, const V val)\n{\n   result = arg;\n   eval_left_shift(result, val);\n}\n\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_right_shift(T& result, const U& arg, const V val)\n{\n   result = arg;\n   eval_right_shift(result, val);\n}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR bool eval_is_zero(const T& val)\n{\n   using ui_type = typename std::tuple_element<0, typename T::unsigned_types>::type;\n   return val.compare(static_cast<ui_type>(0)) == 0;\n}\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR int eval_get_sign(const T& val)\n{\n   using ui_type = typename std::tuple_element<0, typename T::unsigned_types>::type;\n   return val.compare(static_cast<ui_type>(0));\n}\n\ntemplate <class T, class V, class U>\ninline BOOST_MP_CXX14_CONSTEXPR void assign_components_imp2(T& result, const V& v1, const U& v2, const std::false_type&, const std::false_type&)\n{\n   using component_number_type = typename component_type<number<T> >::type;\n\n   boost::multiprecision::detail::scoped_precision_options<component_number_type> sp(result);\n   (void)sp;\n\n   component_number_type x(v1), y(v2);\n   assign_components(result, x.backend(), y.backend());\n}\ntemplate <class T, class V, class U>\ninline BOOST_MP_CXX14_CONSTEXPR void assign_components_imp2(T& result, const V& v1, const U& v2, const std::true_type&, const std::false_type&)\n{\n   boost::multiprecision::detail::scoped_source_precision<number<V>> scope;\n   (void)scope;\n   assign_components_imp2(result, number<V>(v1), v2, std::false_type(), std::false_type());\n}\ntemplate <class T, class V, class U>\ninline BOOST_MP_CXX14_CONSTEXPR void assign_components_imp2(T& result, const V& v1, const U& v2, const std::true_type&, const std::true_type&)\n{\n   boost::multiprecision::detail::scoped_source_precision<number<V>> scope1;\n   boost::multiprecision::detail::scoped_source_precision<number<U>> scope2;\n   (void)scope1;\n   (void)scope2;\n   assign_components_imp2(result, number<V>(v1), number<U>(v2), std::false_type(), std::false_type());\n}\ntemplate <class T, class V, class U>\ninline BOOST_MP_CXX14_CONSTEXPR void assign_components_imp2(T& result, const V& v1, const U& v2, const std::false_type&, const std::true_type&)\n{\n   boost::multiprecision::detail::scoped_source_precision<number<U>> scope;\n   (void)scope;\n   assign_components_imp2(result, v1, number<U>(v2), std::false_type(), std::false_type());\n}\n\n\ntemplate <class T, class V, class U>\ninline BOOST_MP_CXX14_CONSTEXPR void assign_components_imp(T& result, const V& v1, const U& v2, const std::integral_constant<int, number_kind_rational>&)\n{\n   result = v1;\n   T t;\n   t = v2;\n   eval_divide(result, t);\n}\n\ntemplate <class T, class V, class U, int N>\ninline BOOST_MP_CXX14_CONSTEXPR void assign_components_imp(T& result, const V& v1, const U& v2, const std::integral_constant<int, N>&)\n{\n   assign_components_imp2(result, v1, v2, boost::multiprecision::detail::is_backend<V>(), boost::multiprecision::detail::is_backend<U>());\n}\n\ntemplate <class T, class V, class U>\ninline BOOST_MP_CXX14_CONSTEXPR void assign_components(T& result, const V& v1, const U& v2)\n{\n   return assign_components_imp(result, v1, v2, typename number_category<T>::type());\n}\n#ifndef BOOST_NO_CXX17_HDR_STRING_VIEW\ntemplate <class Result, class Traits>\ninline void assign_from_string_view(Result& result, const std::basic_string_view<char, Traits>& view)\n{\n   // since most (all?) backends require a const char* to construct from, we just\n   // convert to that:\n   std::string s(view);\n   result = s.c_str();\n}\ntemplate <class Result, class Traits>\ninline void assign_from_string_view(Result& result, const std::basic_string_view<char, Traits>& view_x, const std::basic_string_view<char, Traits>& view_y)\n{\n   // since most (all?) backends require a const char* to construct from, we just\n   // convert to that:\n   std::string x(view_x), y(view_y);\n   assign_components(result, x.c_str(), y.c_str());\n}\n#endif\ntemplate <class R, int b>\nstruct has_enough_bits\n{\n   template <class T>\n   struct type : public std::integral_constant<bool, !std::is_same<R, T>::value && (std::numeric_limits<T>::digits >= b)>\n   {};\n};\n\ntemplate <class R>\nstruct terminal\n{\n   BOOST_MP_CXX14_CONSTEXPR terminal(const R& v) : value(v) {}\n   BOOST_MP_CXX14_CONSTEXPR terminal() {}\n   BOOST_MP_CXX14_CONSTEXPR terminal& operator=(R val)\n   {\n      value = val;\n      return *this;\n   }\n   R value;\n   BOOST_MP_CXX14_CONSTEXPR operator R() const { return value; }\n};\n\ntemplate <class Tuple, int i, class T, bool = (i == std::tuple_size<Tuple>::value)>\nstruct find_index_of_type\n{\n   static constexpr int value =\n      std::is_same<T, typename std::tuple_element<static_cast<std::size_t>(i), Tuple>::type>::value\n         ? i\n         : find_index_of_type<Tuple, i + 1, T>::value;\n};\ntemplate <class Tuple, int i, class T>\nstruct find_index_of_type<Tuple, i, T, true>\n{\n   static constexpr int value = -1;\n};\n\n\ntemplate <class R, class B>\nstruct calculate_next_larger_type\n{\n   // Find which list we're looking through:\n   using list_type = typename std::conditional<\n       boost::multiprecision::detail::is_signed<R>::value && boost::multiprecision::detail::is_integral<R>::value,\n       typename B::signed_types,\n       typename std::conditional<\n           boost::multiprecision::detail::is_unsigned<R>::value,\n           typename B::unsigned_types,\n           typename B::float_types>::type>::type;\n   static constexpr int start = find_index_of_type<list_type, 0, R>::value;\n   static constexpr int index_of_type = boost::multiprecision::detail::find_index_of_large_enough_type<list_type, start == INT_MAX ? 0 : start + 1, boost::multiprecision::detail::bits_of<R>::value> ::value;\n   using type = typename boost::multiprecision::detail::dereference_tuple<index_of_type, list_type, terminal<R> >::type;\n};\n\ntemplate <class R, class T>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<R>::value, bool>::type check_in_range(const T& t)\n{\n   // Can t fit in an R?\n   if ((t > 0) && std::numeric_limits<R>::is_specialized && std::numeric_limits<R>::is_bounded && (t > (std::numeric_limits<R>::max)()))\n      return true;\n   else\n      return false;\n}\n\ntemplate <class R, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<R>::value>::type eval_convert_to(R* result, const B& backend)\n{\n   using next_type = typename calculate_next_larger_type<R, B>::type;\n   next_type                                               n = next_type();\n   eval_convert_to(&n, backend);\n   BOOST_IF_CONSTEXPR(!boost::multiprecision::detail::is_unsigned<R>::value && std::numeric_limits<R>::is_specialized && std::numeric_limits<R>::is_bounded)\n   {\n      if(n > static_cast<next_type>((std::numeric_limits<R>::max)()))\n      {\n         *result = (std::numeric_limits<R>::max)();\n         return;\n      }\n   }\n   BOOST_IF_CONSTEXPR(std::numeric_limits<R>::is_specialized&& std::numeric_limits<R>::is_bounded)\n   {\n      if (n < static_cast<next_type>((std::numeric_limits<R>::min)()))\n      {\n         *result = (std::numeric_limits<R>::min)();\n         return;\n      }\n   }\n   *result = static_cast<R>(n);\n}\n\ntemplate <class R, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if< !boost::multiprecision::detail::is_integral<R>::value && !std::is_enum<R>::value>::type eval_convert_to(R* result, const B& backend)\n{\n   using next_type = typename calculate_next_larger_type<R, B>::type;\n   next_type                                               n = next_type();\n   eval_convert_to(&n, backend);\n   BOOST_IF_CONSTEXPR(std::numeric_limits<R>::is_specialized && std::numeric_limits<R>::is_bounded)\n   {\n      if ((n > (next_type)(std::numeric_limits<R>::max)() || (n < (next_type) - (std::numeric_limits<R>::max)())))\n      {\n         *result = n > 0 ? (std::numeric_limits<R>::max)() : -(std::numeric_limits<R>::max)();\n      }\n      else\n         *result = static_cast<R>(n);\n   }\n   else\n      *result = static_cast<R>(n);\n}\n\ntemplate <class R, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_enum<R>::value>::type eval_convert_to(R* result, const B& backend)\n{\n   typename std::underlying_type<R>::type t{};\n   eval_convert_to(&t, backend);\n   *result = static_cast<R>(t);\n}\n\n#ifndef BOOST_MP_STANDALONE\ntemplate <class R, class B>\ninline void last_chance_eval_convert_to(terminal<R>* result, const B& backend, const std::integral_constant<bool, false>&)\n{\n   //\n   // We ran out of types to try for the conversion, try\n   // a lexical_cast and hope for the best:\n   //\n   BOOST_IF_CONSTEXPR (std::numeric_limits<R>::is_integer && !std::numeric_limits<R>::is_signed)\n      if (eval_get_sign(backend) < 0)\n         BOOST_MP_THROW_EXCEPTION(std::range_error(\"Attempt to convert negative value to an unsigned integer results in undefined behaviour\"));\n   BOOST_MP_TRY {\n      result->value = boost::lexical_cast<R>(backend.str(0, std::ios_base::fmtflags(0)));\n   }\n   BOOST_MP_CATCH (const bad_lexical_cast&)\n   {\n      if (eval_get_sign(backend) < 0)\n      {\n         BOOST_IF_CONSTEXPR(std::numeric_limits<R>::is_integer && !std::numeric_limits<R>::is_signed)\n            *result = (std::numeric_limits<R>::max)(); // we should never get here, exception above will be raised.\n         else BOOST_IF_CONSTEXPR(std::numeric_limits<R>::is_integer)\n            *result = (std::numeric_limits<R>::min)();\n         else\n            *result = -(std::numeric_limits<R>::max)();\n      }\n      else\n         *result = (std::numeric_limits<R>::max)();\n   }\n   BOOST_MP_CATCH_END\n}\n\ntemplate <class R, class B>\ninline void last_chance_eval_convert_to(terminal<R>* result, const B& backend, const std::integral_constant<bool, true>&)\n{\n   //\n   // Last chance conversion to an unsigned integer.\n   // We ran out of types to try for the conversion, try\n   // a lexical_cast and hope for the best:\n   //\n   if (eval_get_sign(backend) < 0)\n      BOOST_MP_THROW_EXCEPTION(std::range_error(\"Attempt to convert negative value to an unsigned integer results in undefined behaviour\"));\n   BOOST_MP_TRY {\n      B t(backend);\n      R mask = ~static_cast<R>(0u);\n      eval_bitwise_and(t, mask);\n      result->value = boost::lexical_cast<R>(t.str(0, std::ios_base::fmtflags(0)));\n   }\n   BOOST_MP_CATCH (const bad_lexical_cast&)\n   {\n      // We should never really get here...\n      *result = (std::numeric_limits<R>::max)();\n   }\n   BOOST_MP_CATCH_END\n}\n#else // Using standalone mode\n\ntemplate <class R, class B>\ninline void last_chance_eval_convert_to(terminal<R>*, const B&, const std::integral_constant<bool, false>&)\n{\n   static_assert(sizeof(R) == 1, \"This type can not be used in standalone mode. Please de-activate and file a bug at https://github.com/boostorg/multiprecision/\");\n}\n\ntemplate <class R, class B>\ninline void last_chance_eval_convert_to(terminal<R>* result, const B& backend, const std::integral_constant<bool, true>&)\n{\n   static_cast<void>(result);\n   static_cast<void>(backend);\n\n   static_assert(sizeof(R) == 1, \"This type can not be used in standalone mode. Please de-activate and file a bug at https://github.com/boostorg/multiprecision/\");\n}\n#endif\n\ntemplate <class R, class B>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_convert_to(terminal<R>* result, const B& backend)\n{\n   using tag_type = std::integral_constant<bool, boost::multiprecision::detail::is_unsigned<R>::value && number_category<B>::value == number_kind_integer>;\n   last_chance_eval_convert_to(result, backend, tag_type());\n}\n\ntemplate <class B1, class B2, expression_template_option et>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_convert_to(terminal<number<B1, et> >* result, const B2& backend)\n{\n   //\n   // We ran out of types to try for the conversion, try\n   // a generic conversion and hope for the best:\n   //\n   boost::multiprecision::detail::generic_interconvert(result->value.backend(), backend, number_category<B1>(), number_category<B2>());\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_convert_to(std::string* result, const B& backend)\n{\n   *result = backend.str(0, std::ios_base::fmtflags(0));\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_convert_to(std::complex<float>* result, const B& backend)\n{\n   using scalar_type = typename scalar_result_from_possible_complex<multiprecision::number<B> >::type;\n   scalar_type                                                                            re, im;\n   eval_real(re.backend(), backend);\n   eval_imag(im.backend(), backend);\n\n   *result = std::complex<float>(re.template convert_to<float>(), im.template convert_to<float>());\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_convert_to(std::complex<double>* result, const B& backend)\n{\n   using scalar_type = typename scalar_result_from_possible_complex<multiprecision::number<B> >::type;\n   scalar_type                                                                            re, im;\n   eval_real(re.backend(), backend);\n   eval_imag(im.backend(), backend);\n\n   *result = std::complex<double>(re.template convert_to<double>(), im.template convert_to<double>());\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_convert_to(std::complex<long double>* result, const B& backend)\n{\n   using scalar_type = typename scalar_result_from_possible_complex<multiprecision::number<B> >::type;\n   scalar_type                                                                            re, im;\n   eval_real(re.backend(), backend);\n   eval_imag(im.backend(), backend);\n\n   *result = std::complex<long double>(re.template convert_to<long double>(), im.template convert_to<long double>());\n}\n\n//\n// Functions:\n//\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_abs(T& result, const U& arg)\n{\n   using type_list = typename U::signed_types            ;\n   using front = typename std::tuple_element<0, type_list>::type;\n   result = arg;\n   if (arg.compare(front(0)) < 0)\n      result.negate();\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_fabs(T& result, const U& arg)\n{\n   static_assert(number_category<T>::value == number_kind_floating_point, \"The fabs function is only valid for floating point types.\");\n   using type_list = typename U::signed_types            ;\n   using front = typename std::tuple_element<0, type_list>::type;\n   result = arg;\n   if (arg.compare(front(0)) < 0)\n      result.negate();\n}\n\ntemplate <class Backend>\ninline BOOST_MP_CXX14_CONSTEXPR int eval_fpclassify(const Backend& arg)\n{\n   static_assert(number_category<Backend>::value == number_kind_floating_point, \"The fpclassify function is only valid for floating point types.\");\n   return eval_is_zero(arg) ? FP_ZERO : FP_NORMAL;\n}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_fmod(T& result, const T& a, const T& b)\n{\n   static_assert(number_category<T>::value == number_kind_floating_point, \"The fmod function is only valid for floating point types.\");\n   if ((&result == &a) || (&result == &b))\n   {\n      T temp;\n      eval_fmod(temp, a, b);\n      result = temp;\n      return;\n   }\n   switch (eval_fpclassify(a))\n   {\n   case FP_ZERO:\n      result = a;\n      return;\n   case FP_INFINITE:\n   case FP_NAN:\n      result = std::numeric_limits<number<T> >::quiet_NaN().backend();\n      errno  = EDOM;\n      return;\n   }\n   switch (eval_fpclassify(b))\n   {\n   case FP_ZERO:\n   case FP_NAN:\n      result = std::numeric_limits<number<T> >::quiet_NaN().backend();\n      errno  = EDOM;\n      return;\n   }\n   T n;\n   eval_divide(result, a, b);\n   if (eval_get_sign(result) < 0)\n      eval_ceil(n, result);\n   else\n      eval_floor(n, result);\n   eval_multiply(n, b);\n   eval_subtract(result, a, n);\n}\ntemplate <class T, class A>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A>::value, void>::type eval_fmod(T& result, const T& x, const A& a)\n{\n   using canonical_type = typename boost::multiprecision::detail::canonical<A, T>::type         ;\n   using cast_type = typename std::conditional<std::is_same<A, canonical_type>::value, T, canonical_type>::type;\n   cast_type                                                                      c;\n   c = a;\n   eval_fmod(result, x, c);\n}\n\ntemplate <class T, class A>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A>::value, void>::type eval_fmod(T& result, const A& x, const T& a)\n{\n   using canonical_type = typename boost::multiprecision::detail::canonical<A, T>::type         ;\n   using cast_type = typename std::conditional<std::is_same<A, canonical_type>::value, T, canonical_type>::type;\n   cast_type                                                                      c;\n   c = x;\n   eval_fmod(result, c, a);\n}\n\ntemplate <class T>\nBOOST_MP_CXX14_CONSTEXPR void eval_round(T& result, const T& a);\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_remquo(T& result, const T& a, const T& b, int* pi)\n{\n   static_assert(number_category<T>::value == number_kind_floating_point, \"The remquo function is only valid for floating point types.\");\n   if ((&result == &a) || (&result == &b))\n   {\n      T temp;\n      eval_remquo(temp, a, b, pi);\n      result = temp;\n      return;\n   }\n   T n;\n   eval_divide(result, a, b);\n   eval_round(n, result);\n   eval_convert_to(pi, n);\n   eval_multiply(n, b);\n   eval_subtract(result, a, n);\n   if (eval_is_zero(result))\n   {\n      if (eval_signbit(a))\n         result.negate();\n   }\n}\ntemplate <class T, class A>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A>::value, void>::type eval_remquo(T& result, const T& x, const A& a, int* pi)\n{\n   using canonical_type = typename boost::multiprecision::detail::canonical<A, T>::type         ;\n   using cast_type = typename std::conditional<std::is_same<A, canonical_type>::value, T, canonical_type>::type;\n   cast_type                                                                      c = cast_type();\n   c = a;\n   eval_remquo(result, x, c, pi);\n}\ntemplate <class T, class A>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A>::value, void>::type eval_remquo(T& result, const A& x, const T& a, int* pi)\n{\n   using canonical_type = typename boost::multiprecision::detail::canonical<A, T>::type         ;\n   using cast_type = typename std::conditional<std::is_same<A, canonical_type>::value, T, canonical_type>::type;\n   cast_type                                                                      c = cast_type();\n   c = x;\n   eval_remquo(result, c, a, pi);\n}\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_remainder(T& result, const U& a, const V& b)\n{\n   int i(0);\n   eval_remquo(result, a, b, &i);\n}\n\ntemplate <class B>\nBOOST_MP_CXX14_CONSTEXPR bool eval_gt(const B& a, const B& b);\ntemplate <class T, class U>\nBOOST_MP_CXX14_CONSTEXPR bool eval_gt(const T& a, const U& b);\ntemplate <class B>\nBOOST_MP_CXX14_CONSTEXPR bool eval_lt(const B& a, const B& b);\ntemplate <class T, class U>\nBOOST_MP_CXX14_CONSTEXPR bool eval_lt(const T& a, const U& b);\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_fdim(T& result, const T& a, const T& b)\n{\n   using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;\n   const ui_type                                                                zero = 0u;\n   switch (eval_fpclassify(b))\n   {\n   case FP_NAN:\n   case FP_INFINITE:\n      result = zero;\n      return;\n   }\n   switch (eval_fpclassify(a))\n   {\n   case FP_NAN:\n      result = zero;\n      return;\n   case FP_INFINITE:\n      result = a;\n      return;\n   }\n   if (eval_gt(a, b))\n   {\n      eval_subtract(result, a, b);\n   }\n   else\n      result = zero;\n}\n\ntemplate <class T, class A>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A>::value>::type eval_fdim(T& result, const T& a, const A& b)\n{\n   using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;\n   using arithmetic_type = typename boost::multiprecision::detail::canonical<A, T>::type       ;\n   const ui_type                                                                zero        = 0u;\n   arithmetic_type                                                              canonical_b = b;\n   switch (BOOST_MP_FPCLASSIFY(b))\n   {\n   case FP_NAN:\n   case FP_INFINITE:\n      result = zero;\n      return;\n   }\n   switch (eval_fpclassify(a))\n   {\n   case FP_NAN:\n      result = zero;\n      return;\n   case FP_INFINITE:\n      result = a;\n      return;\n   }\n   if (eval_gt(a, canonical_b))\n   {\n      eval_subtract(result, a, canonical_b);\n   }\n   else\n      result = zero;\n}\n\ntemplate <class T, class A>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A>::value>::type eval_fdim(T& result, const A& a, const T& b)\n{\n   using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;\n   using arithmetic_type = typename boost::multiprecision::detail::canonical<A, T>::type       ;\n   const ui_type                                                                zero        = 0u;\n   arithmetic_type                                                              canonical_a = a;\n   switch (eval_fpclassify(b))\n   {\n   case FP_NAN:\n   case FP_INFINITE:\n      result = zero;\n      return;\n   }\n   switch (BOOST_MP_FPCLASSIFY(a))\n   {\n   case FP_NAN:\n      result = zero;\n      return;\n   case FP_INFINITE:\n      result = std::numeric_limits<number<T> >::infinity().backend();\n      return;\n   }\n   if (eval_gt(canonical_a, b))\n   {\n      eval_subtract(result, canonical_a, b);\n   }\n   else\n      result = zero;\n}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_trunc(T& result, const T& a)\n{\n   static_assert(number_category<T>::value == number_kind_floating_point, \"The trunc function is only valid for floating point types.\");\n   switch (eval_fpclassify(a))\n   {\n   case FP_NAN:\n      errno = EDOM;\n      // fallthrough...\n   case FP_ZERO:\n   case FP_INFINITE:\n      result = a;\n      return;\n   }\n   if (eval_get_sign(a) < 0)\n      eval_ceil(result, a);\n   else\n      eval_floor(result, a);\n}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_modf(T& result, T const& arg, T* pipart)\n{\n   using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;\n   int                                                                          c = eval_fpclassify(arg);\n   if (c == static_cast<int>(FP_NAN))\n   {\n      if (pipart)\n         *pipart = arg;\n      result = arg;\n      return;\n   }\n   else if (c == static_cast<int>(FP_INFINITE))\n   {\n      if (pipart)\n         *pipart = arg;\n      result = ui_type(0u);\n      return;\n   }\n   if (pipart)\n   {\n      eval_trunc(*pipart, arg);\n      eval_subtract(result, arg, *pipart);\n   }\n   else\n   {\n      T ipart;\n      eval_trunc(ipart, arg);\n      eval_subtract(result, arg, ipart);\n   }\n}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_round(T& result, const T& a)\n{\n   static_assert(number_category<T>::value == number_kind_floating_point, \"The round function is only valid for floating point types.\");\n   using fp_type = typename boost::multiprecision::detail::canonical<float, T>::type;\n   int                                                                       c = eval_fpclassify(a);\n   if (c == static_cast<int>(FP_NAN))\n   {\n      result = a;\n      errno  = EDOM;\n      return;\n   }\n   if ((c == FP_ZERO) || (c == static_cast<int>(FP_INFINITE)))\n   {\n      result = a;\n   }\n   else if (eval_get_sign(a) < 0)\n   {\n      eval_subtract(result, a, fp_type(0.5f));\n      eval_ceil(result, result);\n   }\n   else\n   {\n      eval_add(result, a, fp_type(0.5f));\n      eval_floor(result, result);\n   }\n}\n\ntemplate <class B>\nBOOST_MP_CXX14_CONSTEXPR void eval_lcm(B& result, const B& a, const B& b);\ntemplate <class B>\nBOOST_MP_CXX14_CONSTEXPR void eval_gcd(B& result, const B& a, const B& b);\n\ntemplate <class T, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Arithmetic>::value >::type eval_gcd(T& result, const T& a, const Arithmetic& b)\n{\n   using si_type = typename boost::multiprecision::detail::canonical<Arithmetic, T>::type;\n   using default_ops::eval_gcd;\n   T t;\n   t = static_cast<si_type>(b);\n   eval_gcd(result, a, t);\n}\ntemplate <class T, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Arithmetic>::value >::type eval_gcd(T& result, const Arithmetic& a, const T& b)\n{\n   eval_gcd(result, b, a);\n}\ntemplate <class T, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Arithmetic>::value >::type eval_lcm(T& result, const T& a, const Arithmetic& b)\n{\n   using si_type = typename boost::multiprecision::detail::canonical<Arithmetic, T>::type;\n   using default_ops::eval_lcm;\n   T t;\n   t = static_cast<si_type>(b);\n   eval_lcm(result, a, t);\n}\ntemplate <class T, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Arithmetic>::value >::type eval_lcm(T& result, const Arithmetic& a, const T& b)\n{\n   eval_lcm(result, b, a);\n}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR std::size_t eval_lsb(const T& val)\n{\n   using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;\n   int                                                                          c = eval_get_sign(val);\n   if (c == 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::domain_error(\"No bits were set in the operand.\"));\n   }\n   if (c < 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::domain_error(\"Testing individual bits in negative values is not supported - results are undefined.\"));\n   }\n   std::size_t result = 0;\n   T        mask, t;\n   mask = ui_type(1);\n   do\n   {\n      eval_bitwise_and(t, mask, val);\n      ++result;\n      eval_left_shift(mask, 1);\n   } while (eval_is_zero(t));\n\n   return --result;\n}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR std::ptrdiff_t eval_msb(const T& val)\n{\n   int c = eval_get_sign(val);\n   if (c == 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::domain_error(\"No bits were set in the operand.\"));\n   }\n   if (c < 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::domain_error(\"Testing individual bits in negative values is not supported - results are undefined.\"));\n   }\n   //\n   // This implementation is really really rubbish - it does\n   // a linear scan for the most-significant-bit.  We should really\n   // do a binary search, but as none of our backends actually needs\n   // this implementation, we'll leave it for now.  In fact for most\n   // backends it's likely that there will always be a more efficient\n   // native implementation possible.\n   //\n   std::size_t result = 0;\n   T        t(val);\n   while (!eval_is_zero(t))\n   {\n      eval_right_shift(t, 1);\n      ++result;\n   }\n   --result;\n\n   return static_cast<std::ptrdiff_t>(result);\n}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR bool eval_bit_test(const T& val, std::size_t index)\n{\n   using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;\n   T                                                                            mask, t;\n   mask = ui_type(1);\n   eval_left_shift(mask, index);\n   eval_bitwise_and(t, mask, val);\n   return !eval_is_zero(t);\n}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_bit_set(T& val, std::size_t index)\n{\n   using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;\n   T                                                                            mask;\n   mask = ui_type(1);\n   eval_left_shift(mask, index);\n   eval_bitwise_or(val, mask);\n}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_bit_flip(T& val, std::size_t index)\n{\n   using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;\n   T                                                                            mask;\n   mask = ui_type(1);\n   eval_left_shift(mask, index);\n   eval_bitwise_xor(val, mask);\n}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_bit_unset(T& val, std::size_t index)\n{\n   using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;\n   T                                                                            mask, t;\n   mask = ui_type(1);\n   eval_left_shift(mask, index);\n   eval_bitwise_and(t, mask, val);\n   if (!eval_is_zero(t))\n      eval_bitwise_xor(val, mask);\n}\n\ntemplate <class Backend>\nBOOST_MP_CXX14_CONSTEXPR void eval_qr(const Backend& x, const Backend& y, Backend& q, Backend& r);\n\ntemplate <class Backend>\nBOOST_MP_CXX14_CONSTEXPR void eval_karatsuba_sqrt(Backend& result, const Backend& x, Backend& r, Backend& t, size_t bits)\n{\n   using default_ops::eval_is_zero;\n   using default_ops::eval_subtract;\n   using default_ops::eval_right_shift;\n   using default_ops::eval_left_shift;\n   using default_ops::eval_bit_set;\n   using default_ops::eval_decrement;\n   using default_ops::eval_bitwise_and;\n   using default_ops::eval_add;\n   using default_ops::eval_qr;\n\n   using small_uint = typename std::tuple_element<0, typename Backend::unsigned_types>::type;\n\n   constexpr small_uint zero = 0u;\n\n   // we can calculate it faster with std::sqrt\n#ifdef BOOST_HAS_INT128\n   if (bits <= 128)\n   {\n      uint128_type a{}, b{}, c{};\n      eval_convert_to(&a, x);\n      c = boost::multiprecision::detail::karatsuba_sqrt(a, b, bits);\n      r = number<Backend>::canonical_value(b);\n      result = number<Backend>::canonical_value(c);\n      return;\n   }\n#else\n   if (bits <= std::numeric_limits<std::uintmax_t>::digits)\n   {\n      std::uintmax_t a{ 0 }, b{ 0 }, c{ 0 };\n      eval_convert_to(&a, x);\n      c = boost::multiprecision::detail::karatsuba_sqrt(a, b, bits);\n      r = number<Backend>::canonical_value(b);\n      result = number<Backend>::canonical_value(c);\n      return;\n   }\n#endif\n   // https://hal.inria.fr/file/index/docid/72854/filename/RR-3805.pdf\n   std::size_t  b = bits / 4;\n   Backend q(x);\n   eval_right_shift(q, b * 2);\n   Backend s;\n   eval_karatsuba_sqrt(s, q, r, t, bits - b * 2);\n   t = zero;\n   eval_bit_set(t, static_cast<unsigned>(b * 2));\n   eval_left_shift(r, b);\n   eval_decrement(t);\n   eval_bitwise_and(t, x);\n   eval_right_shift(t, b);\n   eval_add(t, r);\n   eval_left_shift(s, 1u);\n   eval_qr(t, s, q, r);\n   eval_left_shift(r, b);\n   t = zero;\n   eval_bit_set(t, static_cast<unsigned>(b));\n   eval_decrement(t);\n   eval_bitwise_and(t, x);\n   eval_add(r, t);\n   eval_left_shift(s, b - 1);\n   eval_add(s, q);\n   eval_multiply(q, q);\n   // we substract after, so it works for unsigned integers too\n   if (r.compare(q) < 0)\n   {\n      t = s;\n      eval_left_shift(t, 1u);\n      eval_decrement(t);\n      eval_add(r, t);\n      eval_decrement(s);\n   }\n   eval_subtract(r, q);\n   result = s;\n}\n\ntemplate <class B>\nvoid BOOST_MP_CXX14_CONSTEXPR eval_integer_sqrt_bitwise(B& s, B& r, const B& x)\n{\n   //\n   // This is slow bit-by-bit integer square root, see for example\n   // http://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Binary_numeral_system_.28base_2.29\n   // There are better methods such as http://hal.inria.fr/docs/00/07/28/54/PDF/RR-3805.pdf\n   // and http://hal.inria.fr/docs/00/07/21/13/PDF/RR-4475.pdf which should be implemented\n   // at some point.\n   //\n   using ui_type = typename boost::multiprecision::detail::canonical<unsigned char, B>::type;\n\n   s = ui_type(0u);\n   if (eval_get_sign(x) == 0)\n   {\n      r = ui_type(0u);\n      return;\n   }\n   std::ptrdiff_t g = static_cast<std::ptrdiff_t>(eval_msb(x));\n   if (g <= 1)\n   {\n      s = ui_type(1);\n      eval_subtract(r, x, s);\n      return;\n   }\n\n   B t;\n   r = x;\n   g /= 2;\n   std::ptrdiff_t org_g = g;\n   eval_bit_set(s, static_cast<std::size_t>(g));\n   eval_bit_set(t, static_cast<std::size_t>(2 * g));\n   eval_subtract(r, x, t);\n   --g;\n   if (eval_get_sign(r) == 0)\n      return;\n   std::ptrdiff_t msbr = static_cast<std::ptrdiff_t>(eval_msb(r));\n   do\n   {\n      if (msbr >= org_g + g + 1)\n      {\n         t = s;\n         eval_left_shift(t, static_cast<std::size_t>(g + 1));\n         eval_bit_set(t, static_cast<std::size_t>(2 * g));\n         if (t.compare(r) <= 0)\n         {\n            BOOST_MP_ASSERT(g >= 0);\n            eval_bit_set(s, static_cast<std::size_t>(g));\n            eval_subtract(r, t);\n            if (eval_get_sign(r) == 0)\n               return;\n            msbr = static_cast<std::ptrdiff_t>(eval_msb(r));\n         }\n      }\n      --g;\n   } while (g >= 0);\n}\n\ntemplate <class Backend>\nBOOST_MP_CXX14_CONSTEXPR void eval_integer_sqrt(Backend& result, Backend& r, const Backend& x)\n{\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n   // recursive Karatsuba sqrt can cause issues in constexpr context:\n   if (BOOST_MP_IS_CONST_EVALUATED(result.size()))\n      return eval_integer_sqrt_bitwise(result, r, x);\n#endif\n   using small_uint = typename std::tuple_element<0, typename Backend::unsigned_types>::type;\n\n   constexpr small_uint zero = 0u;\n\n   if (eval_is_zero(x))\n   {\n      r = zero;\n      result = zero;\n      return;\n   }\n   Backend t;\n   eval_karatsuba_sqrt(result, x, r, t, eval_msb(x) + 1);\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_conj(B& result, const B& val)\n{\n   result = val; // assume non-complex result.\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_proj(B& result, const B& val)\n{\n   result = val; // assume non-complex result.\n}\n\n//\n// These have to implemented by the backend, declared here so that our macro generated code compiles OK.\n//\ntemplate <class T>\ntypename std::enable_if<sizeof(T) == 0>::type eval_floor();\ntemplate <class T>\ntypename std::enable_if<sizeof(T) == 0>::type eval_ceil();\ntemplate <class T>\ntypename std::enable_if<sizeof(T) == 0>::type eval_trunc();\ntemplate <class T>\ntypename std::enable_if<sizeof(T) == 0>::type eval_sqrt();\ntemplate <class T>\ntypename std::enable_if<sizeof(T) == 0>::type eval_ldexp();\ntemplate <class T>\ntypename std::enable_if<sizeof(T) == 0>::type eval_frexp();\n// TODO implement default versions of these:\ntemplate <class T>\ntypename std::enable_if<sizeof(T) == 0>::type eval_asinh();\ntemplate <class T>\ntypename std::enable_if<sizeof(T) == 0>::type eval_acosh();\ntemplate <class T>\ntypename std::enable_if<sizeof(T) == 0>::type eval_atanh();\n\n//\n// eval_logb and eval_scalbn simply assume base 2 and forward to\n// eval_ldexp and eval_frexp:\n//\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename B::exponent_type eval_ilogb(const B& val)\n{\n   static_assert(!std::numeric_limits<number<B> >::is_specialized || (std::numeric_limits<number<B> >::radix == 2), \"The default implementation of ilogb requires a base 2 number type\");\n   typename B::exponent_type e(0);\n   switch (eval_fpclassify(val))\n   {\n   case FP_NAN:\n#ifdef FP_ILOGBNAN\n      return FP_ILOGBNAN > 0 ? (std::numeric_limits<typename B::exponent_type>::max)() : (std::numeric_limits<typename B::exponent_type>::min)();\n#else\n      return (std::numeric_limits<typename B::exponent_type>::max)();\n#endif\n   case FP_INFINITE:\n      return (std::numeric_limits<typename B::exponent_type>::max)();\n   case FP_ZERO:\n      return (std::numeric_limits<typename B::exponent_type>::min)();\n   }\n   B result;\n   eval_frexp(result, val, &e);\n   return e - 1;\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_logb(B& result, const B& val)\n{\n   switch (eval_fpclassify(val))\n   {\n   case FP_NAN:\n      result = val;\n      errno  = EDOM;\n      return;\n   case FP_ZERO:\n      result = std::numeric_limits<number<B> >::infinity().backend();\n      result.negate();\n      errno = ERANGE;\n      return;\n   case FP_INFINITE:\n      result = val;\n      if (eval_signbit(val))\n         result.negate();\n      return;\n   }\n   using max_t = typename std::conditional<std::is_same<std::intmax_t, long>::value, long long, std::intmax_t>::type;\n   result = static_cast<max_t>(eval_ilogb(val));\n}\ntemplate <class B, class A>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_scalbn(B& result, const B& val, A e)\n{\n   static_assert(!std::numeric_limits<number<B> >::is_specialized || (std::numeric_limits<number<B> >::radix == 2), \"The default implementation of scalbn requires a base 2 number type\");\n   eval_ldexp(result, val, static_cast<typename B::exponent_type>(e));\n}\ntemplate <class B, class A>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_scalbln(B& result, const B& val, A e)\n{\n   eval_scalbn(result, val, e);\n}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR bool is_arg_nan(const T& val, std::integral_constant<bool, true> const&, const std::integral_constant<bool, false>&)\n{\n   return eval_fpclassify(val) == FP_NAN;\n}\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR bool is_arg_nan(const T& val, std::integral_constant<bool, false> const&, const std::integral_constant<bool, true>&)\n{\n   return BOOST_MP_ISNAN(val);\n}\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR bool is_arg_nan(const T&, std::integral_constant<bool, false> const&, const std::integral_constant<bool, false>&)\n{\n   return false;\n}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR bool is_arg_nan(const T& val)\n{\n   return is_arg_nan(val, std::integral_constant<bool, boost::multiprecision::detail::is_backend<T>::value>(), std::is_floating_point<T>());\n}\n\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_fmax(T& result, const U& a, const V& b)\n{\n   if (is_arg_nan(a))\n      result = number<T>::canonical_value(b);\n   else if (is_arg_nan(b))\n      result = number<T>::canonical_value(a);\n   else if (eval_lt(number<T>::canonical_value(a), number<T>::canonical_value(b)))\n      result = number<T>::canonical_value(b);\n   else\n      result = number<T>::canonical_value(a);\n}\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_fmin(T& result, const U& a, const V& b)\n{\n   if (is_arg_nan(a))\n      result = number<T>::canonical_value(b);\n   else if (is_arg_nan(b))\n      result = number<T>::canonical_value(a);\n   else if (eval_lt(number<T>::canonical_value(a), number<T>::canonical_value(b)))\n      result = number<T>::canonical_value(a);\n   else\n      result = number<T>::canonical_value(b);\n}\n\ntemplate <class R, class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_hypot(R& result, const T& a, const U& b)\n{\n   //\n   // Normalize x and y, so that both are positive and x >= y:\n   //\n   R x, y;\n   x = number<R>::canonical_value(a);\n   y = number<R>::canonical_value(b);\n   if (eval_get_sign(x) < 0)\n      x.negate();\n   if (eval_get_sign(y) < 0)\n      y.negate();\n\n   // Special case, see C99 Annex F.\n   // The order of the if's is important: do not change!\n   int c1 = eval_fpclassify(x);\n   int c2 = eval_fpclassify(y);\n\n   if (c1 == FP_ZERO)\n   {\n      result = y;\n      return;\n   }\n   if (c2 == FP_ZERO)\n   {\n      result = x;\n      return;\n   }\n   if (c1 == FP_INFINITE)\n   {\n      result = x;\n      return;\n   }\n   if ((c2 == FP_INFINITE) || (c2 == FP_NAN))\n   {\n      result = y;\n      return;\n   }\n   if (c1 == FP_NAN)\n   {\n      result = x;\n      return;\n   }\n\n   if (eval_gt(y, x))\n      x.swap(y);\n\n   eval_multiply(result, x, std::numeric_limits<number<R> >::epsilon().backend());\n\n   if (eval_gt(result, y))\n   {\n      result = x;\n      return;\n   }\n\n   R rat;\n   eval_divide(rat, y, x);\n   eval_multiply(result, rat, rat);\n   eval_increment(result);\n   eval_sqrt(rat, result);\n   eval_multiply(result, rat, x);\n}\n\ntemplate <class R, class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_nearbyint(R& result, const T& a)\n{\n   eval_round(result, a);\n}\ntemplate <class R, class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_rint(R& result, const T& a)\n{\n   eval_nearbyint(result, a);\n}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_backend<T>::value, int>::type eval_signbit(const T& val)\n{\n   return eval_get_sign(val) < 0 ? 1 : 0;\n}\n\n//\n// Real and imaginary parts:\n//\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_real(To& to, const From& from)\n{\n   to = from;\n}\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_imag(To& to, const From&)\n{\n   using ui_type = typename std::tuple_element<0, typename To::unsigned_types>::type;\n   to = ui_type(0);\n}\n\n} // namespace default_ops\nnamespace default_ops_adl {\n\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_set_real_imp(To& to, const From& from)\n{\n   using to_component_type = typename component_type<number<To> >::type;\n   typename to_component_type::backend_type           to_component;\n   to_component = from;\n   eval_set_real(to, to_component);\n}\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_set_imag_imp(To& to, const From& from)\n{\n   using to_component_type = typename component_type<number<To> >::type;\n   typename to_component_type::backend_type           to_component;\n   to_component = from;\n   eval_set_imag(to, to_component);\n}\n\n} // namespace default_ops_adl\nnamespace default_ops {\n\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<To>::value == number_kind_complex>::type eval_set_real(To& to, const From& from)\n{\n   default_ops_adl::eval_set_real_imp(to, from);\n}\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<To>::value != number_kind_complex>::type eval_set_real(To& to, const From& from)\n{\n   to = from;\n}\n\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_set_imag(To& to, const From& from)\n{\n   default_ops_adl::eval_set_imag_imp(to, from);\n}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_set_real(T& to, const T& from)\n{\n   to = from;\n}\ntemplate <class T>\nvoid BOOST_MP_CXX14_CONSTEXPR eval_set_imag(T&, const T&)\n{\n   static_assert(sizeof(T) == INT_MAX, \"eval_set_imag needs to be specialised for each specific backend\");\n}\n\n//\n// These functions are implemented in separate files, but expanded inline here,\n// DO NOT CHANGE THE ORDER OF THESE INCLUDES:\n//\n#include <boost/multiprecision/detail/functions/constants.hpp>\n#include <boost/multiprecision/detail/functions/pow.hpp>\n#include <boost/multiprecision/detail/functions/trig.hpp>\n\n} // namespace default_ops\n\n//\n// Default versions of floating point classification routines:\n//\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR int fpclassify BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& arg)\n{\n   using multiprecision::default_ops::eval_fpclassify;\n   return eval_fpclassify(arg.backend());\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR int fpclassify BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return fpclassify                                                                     BOOST_PREVENT_MACRO_SUBSTITUTION(value_type(arg));\n}\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR bool isfinite BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& arg)\n{\n   int v = fpclassify BOOST_PREVENT_MACRO_SUBSTITUTION(arg);\n   return (v != static_cast<int>(FP_INFINITE)) && (v != static_cast<int>(FP_NAN));\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR bool isfinite BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return isfinite                                                                       BOOST_PREVENT_MACRO_SUBSTITUTION(value_type(arg));\n}\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR bool isnan BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& arg)\n{\n   return fpclassify BOOST_PREVENT_MACRO_SUBSTITUTION(arg) == static_cast<int>(FP_NAN);\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR bool isnan BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return isnan                                                                          BOOST_PREVENT_MACRO_SUBSTITUTION(value_type(arg));\n}\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR bool isinf BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& arg)\n{\n   return fpclassify BOOST_PREVENT_MACRO_SUBSTITUTION(arg) == static_cast<int>(FP_INFINITE);\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR bool isinf BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return isinf                                                                          BOOST_PREVENT_MACRO_SUBSTITUTION(value_type(arg));\n}\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR bool isnormal BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& arg)\n{\n   return fpclassify BOOST_PREVENT_MACRO_SUBSTITUTION(arg) == static_cast<int>(FP_NORMAL);\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR bool isnormal BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return isnormal                                                                       BOOST_PREVENT_MACRO_SUBSTITUTION(value_type(arg));\n}\n\n// Default versions of sign manipulation functions, if individual backends can do better than this\n// (for example with signed zero), then they should overload these functions further:\n\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR int sign BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& arg)\n{\n   return arg.sign();\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR int sign BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return sign                                                                           BOOST_PREVENT_MACRO_SUBSTITUTION(value_type(arg));\n}\n\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR bool signbit BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& arg)\n{\n   using default_ops::eval_signbit;\n   return static_cast<bool>(eval_signbit(arg.backend()));\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR bool signbit BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return static_cast<bool>(signbit BOOST_PREVENT_MACRO_SUBSTITUTION(value_type(arg)));\n}\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR multiprecision::number<Backend, ExpressionTemplates> changesign BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& arg)\n{\n   return -arg;\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type changesign BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return changesign                                                                     BOOST_PREVENT_MACRO_SUBSTITUTION(value_type(arg));\n}\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR multiprecision::number<Backend, ExpressionTemplates> copysign BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& a, const multiprecision::number<Backend, ExpressionTemplates>& b)\n{\n   return (boost::multiprecision::signbit)(a) != (boost::multiprecision::signbit)(b) ? (boost::multiprecision::changesign)(a) : a;\n}\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates, class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR multiprecision::number<Backend, ExpressionTemplates> copysign BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& a, const multiprecision::detail::expression<tag, A1, A2, A3, A4>& b)\n{\n   return copysign BOOST_PREVENT_MACRO_SUBSTITUTION(a, multiprecision::number<Backend, ExpressionTemplates>(b));\n}\ntemplate <class tag, class A1, class A2, class A3, class A4, class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR multiprecision::number<Backend, ExpressionTemplates> copysign BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& a, const multiprecision::number<Backend, ExpressionTemplates>& b)\n{\n   return copysign BOOST_PREVENT_MACRO_SUBSTITUTION(multiprecision::number<Backend, ExpressionTemplates>(a), b);\n}\ntemplate <class tag, class A1, class A2, class A3, class A4, class tagb, class A1b, class A2b, class A3b, class A4b>\ninline BOOST_MP_CXX14_CONSTEXPR typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type copysign BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& a, const multiprecision::detail::expression<tagb, A1b, A2b, A3b, A4b>& b)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return copysign                                                                       BOOST_PREVENT_MACRO_SUBSTITUTION(value_type(a), value_type(b));\n}\n//\n// real and imag:\n//\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename scalar_result_from_possible_complex<multiprecision::number<Backend, ExpressionTemplates> >::type\nreal(const multiprecision::number<Backend, ExpressionTemplates>& a)\n{\n   using default_ops::eval_real;\n   using result_type = typename scalar_result_from_possible_complex<multiprecision::number<Backend, ExpressionTemplates> >::type;\n   boost::multiprecision::detail::scoped_default_precision<result_type>                                              precision_guard(a);\n   result_type                                                                                                       result;\n   eval_real(result.backend(), a.backend());\n   return result;\n}\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename scalar_result_from_possible_complex<multiprecision::number<Backend, ExpressionTemplates> >::type\nimag(const multiprecision::number<Backend, ExpressionTemplates>& a)\n{\n   using default_ops::eval_imag;\n   using result_type = typename scalar_result_from_possible_complex<multiprecision::number<Backend, ExpressionTemplates> >::type;\n   boost::multiprecision::detail::scoped_default_precision<result_type>                                              precision_guard(a);\n   result_type                                                                                                       result;\n   eval_imag(result.backend(), a.backend());\n   return result;\n}\n\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename scalar_result_from_possible_complex<typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::type\nreal(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   detail::scoped_default_precision<value_type>                                          precision_guard(arg);\n   return real(value_type(arg));\n}\n\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename scalar_result_from_possible_complex<typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::type\nimag(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   detail::scoped_default_precision<value_type>                                          precision_guard(arg);\n   return imag(value_type(arg));\n}\n\n//\n// Complex number functions, these are overloaded at the Backend level, we just provide the\n// expression template versions here, plus overloads for non-complex types:\n//\n#ifdef BOOST_MP_MATH_AVAILABLE\ntemplate <class T, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<T>::value == number_kind_complex, component_type<number<T, ExpressionTemplates>>>::type::type\nabs(const number<T, ExpressionTemplates>& v)\n{\n   return std::move(boost::math::hypot(real(v), imag(v)));\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_complex, component_type<typename detail::expression<tag, A1, A2, A3, A4>::result_type>>::type::type\nabs(const detail::expression<tag, A1, A2, A3, A4>& v)\n{\n   using number_type = typename detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return std::move(abs(static_cast<number_type>(v)));\n}\n\ntemplate <class T, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<T>::value == number_kind_complex, typename scalar_result_from_possible_complex<number<T, ExpressionTemplates> >::type>::type\narg(const number<T, ExpressionTemplates>& v)\n{\n   return std::move(atan2(imag(v), real(v)));\n}\ntemplate <class T, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<T>::value == number_kind_floating_point, typename scalar_result_from_possible_complex<number<T, ExpressionTemplates> >::type>::type\narg(const number<T, ExpressionTemplates>&)\n{\n   return 0;\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_complex || number_category<typename detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_floating_point, typename scalar_result_from_possible_complex<typename detail::expression<tag, A1, A2, A3, A4>::result_type>::type>::type\narg(const detail::expression<tag, A1, A2, A3, A4>& v)\n{\n   using number_type = typename detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return std::move(arg(static_cast<number_type>(v)));\n}\n#endif // BOOST_MP_MATH_AVAILABLE\n\ntemplate <class T, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<T>::value == number_kind_complex, component_type<number<T, ExpressionTemplates>>>::type::type\nnorm(const number<T, ExpressionTemplates>& v)\n{\n   typename component_type<number<T, ExpressionTemplates> >::type a(real(v)), b(imag(v));\n   return std::move(a * a + b * b);\n}\ntemplate <class T, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<T>::value != number_kind_complex, typename scalar_result_from_possible_complex<number<T, ExpressionTemplates> >::type>::type\nnorm(const number<T, ExpressionTemplates>& v)\n{\n   return v * v;\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename scalar_result_from_possible_complex<typename detail::expression<tag, A1, A2, A3, A4>::result_type>::type\nnorm(const detail::expression<tag, A1, A2, A3, A4>& v)\n{\n   using number_type = typename detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return std::move(norm(static_cast<number_type>(v)));\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\nBOOST_MP_CXX14_CONSTEXPR typename complex_result_from_scalar<number<Backend, ExpressionTemplates> >::type polar(number<Backend, ExpressionTemplates> const& r, number<Backend, ExpressionTemplates> const& theta)\n{\n   return typename complex_result_from_scalar<number<Backend, ExpressionTemplates> >::type(number<Backend, ExpressionTemplates>(r * cos(theta)), number<Backend, ExpressionTemplates>(r * sin(theta)));\n}\n\ntemplate <class tag, class A1, class A2, class A3, class A4, class Backend, expression_template_option ExpressionTemplates>\nBOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_same<typename detail::expression<tag, A1, A2, A3, A4>::result_type, number<Backend, ExpressionTemplates> >::value,\n                     typename complex_result_from_scalar<number<Backend, ExpressionTemplates> >::type>::type\npolar(detail::expression<tag, A1, A2, A3, A4> const& r, number<Backend, ExpressionTemplates> const& theta)\n{\n   return typename complex_result_from_scalar<number<Backend, ExpressionTemplates> >::type(number<Backend, ExpressionTemplates>(r * cos(theta)), number<Backend, ExpressionTemplates>(r * sin(theta)));\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class tag, class A1, class A2, class A3, class A4>\nBOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_same<typename detail::expression<tag, A1, A2, A3, A4>::result_type, number<Backend, ExpressionTemplates> >::value,\n                     typename complex_result_from_scalar<number<Backend, ExpressionTemplates> >::type>::type\npolar(number<Backend, ExpressionTemplates> const& r, detail::expression<tag, A1, A2, A3, A4> const& theta)\n{\n   return typename complex_result_from_scalar<number<Backend, ExpressionTemplates> >::type(number<Backend, ExpressionTemplates>(r * cos(theta)), number<Backend, ExpressionTemplates>(r * sin(theta)));\n}\n\ntemplate <class tag, class A1, class A2, class A3, class A4, class tagb, class A1b, class A2b, class A3b, class A4b>\nBOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_same<typename detail::expression<tag, A1, A2, A3, A4>::result_type, typename detail::expression<tagb, A1b, A2b, A3b, A4b>::result_type>::value,\n                     typename complex_result_from_scalar<typename detail::expression<tag, A1, A2, A3, A4>::result_type>::type>::type\npolar(detail::expression<tag, A1, A2, A3, A4> const& r, detail::expression<tagb, A1b, A2b, A3b, A4b> const& theta)\n{\n   using scalar_type = typename detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return typename complex_result_from_scalar<scalar_type>::type(scalar_type(r * cos(theta)), scalar_type(r * sin(theta)));\n}\n//\n// We also allow the first argument to polar to be an arithmetic type (probably a literal):\n//\ntemplate <class Scalar, class Backend, expression_template_option ExpressionTemplates>\nBOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<Scalar>::value, typename complex_result_from_scalar<number<Backend, ExpressionTemplates> >::type>::type\npolar(Scalar const& r, number<Backend, ExpressionTemplates> const& theta)\n{\n   return typename complex_result_from_scalar<number<Backend, ExpressionTemplates> >::type(number<Backend, ExpressionTemplates>(r * cos(theta)), number<Backend, ExpressionTemplates>(r * sin(theta)));\n}\n\ntemplate <class tag, class A1, class A2, class A3, class A4, class Scalar>\nBOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<Scalar>::value,\n                     typename complex_result_from_scalar<typename detail::expression<tag, A1, A2, A3, A4>::result_type>::type>::type\npolar(Scalar const& r, detail::expression<tag, A1, A2, A3, A4> const& theta)\n{\n   using scalar_type = typename detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return typename complex_result_from_scalar<scalar_type>::type(scalar_type(r * cos(theta)), scalar_type(r * sin(theta)));\n}\n//\n// Single argument overloads:\n//\ntemplate <class Backend, expression_template_option ExpressionTemplates>\nBOOST_MP_CXX14_CONSTEXPR typename complex_result_from_scalar<number<Backend, ExpressionTemplates> >::type polar(number<Backend, ExpressionTemplates> const& r)\n{\n   return typename complex_result_from_scalar<number<Backend, ExpressionTemplates> >::type(r);\n}\n\ntemplate <class tag, class A1, class A2, class A3, class A4>\nBOOST_MP_CXX14_CONSTEXPR typename complex_result_from_scalar<typename detail::expression<tag, A1, A2, A3, A4>::result_type>::type\npolar(detail::expression<tag, A1, A2, A3, A4> const& r)\n{\n   return typename complex_result_from_scalar<typename detail::expression<tag, A1, A2, A3, A4>::result_type>::type(r);\n}\n\n} // namespace multiprecision\n\nnamespace math {\n\n//\n// Import Math functions here, so they can be found by Boost.Math:\n//\nusing boost::multiprecision::changesign;\nusing boost::multiprecision::copysign;\nusing boost::multiprecision::fpclassify;\nusing boost::multiprecision::isfinite;\nusing boost::multiprecision::isinf;\nusing boost::multiprecision::isnan;\nusing boost::multiprecision::isnormal;\nusing boost::multiprecision::sign;\nusing boost::multiprecision::signbit;\n\n#ifndef BOOST_MP_MATH_AVAILABLE\nnamespace policies {\n\ntemplate <typename... Args>\nclass policy {};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\nvoid raise_rounding_error(T1, T2, T3, T4, T5)\n{\n   BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Rounding error\"));\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\nvoid raise_overflow_error(T1, T2, T3, T4, T5)\n{\n   BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Overflow error\"));\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\nvoid raise_evaluation_error(T1, T2, T3, T4, T5)\n{\n   BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Evaluation error\"));\n}\n\ntemplate <typename T, typename... Args>\nstruct is_policy\n{\n   static constexpr bool value = false;\n};\n\ntemplate <typename... Args>\nstruct is_policy<policy<Args...>>\n{\n   static constexpr bool value = true;\n};\n\n} // namespace policies\n#endif\n\n} // namespace math\n\nnamespace multiprecision {\n#ifdef BOOST_MP_MATH_AVAILABLE\nusing c99_error_policy = ::boost::math::policies::policy<\n    ::boost::math::policies::domain_error< ::boost::math::policies::errno_on_error>,\n    ::boost::math::policies::pole_error< ::boost::math::policies::errno_on_error>,\n    ::boost::math::policies::overflow_error< ::boost::math::policies::errno_on_error>,\n    ::boost::math::policies::evaluation_error< ::boost::math::policies::errno_on_error>,\n    ::boost::math::policies::rounding_error< ::boost::math::policies::errno_on_error> >;\n\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value != number_kind_complex, multiprecision::number<Backend, ExpressionTemplates> >::type\n    asinh\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& arg)\n{\n   detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(arg);\n   return boost::math::asinh(arg, c99_error_policy());\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::value != number_kind_complex, typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::type\n    asinh\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   detail::scoped_default_precision<value_type>                                          precision_guard(arg);\n   return asinh(value_type(arg));\n}\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value != number_kind_complex, multiprecision::number<Backend, ExpressionTemplates> >::type\n    acosh\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& arg)\n{\n   detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(arg);\n   return boost::math::acosh(arg, c99_error_policy());\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::value != number_kind_complex, typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::type\n    acosh\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   detail::scoped_default_precision<value_type>                                          precision_guard(arg);\n   return acosh(value_type(arg));\n}\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value != number_kind_complex, multiprecision::number<Backend, ExpressionTemplates> >::type\n    atanh\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& arg)\n{\n   detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(arg);\n   return boost::math::atanh(arg, c99_error_policy());\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::value != number_kind_complex, typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::type\n    atanh\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   detail::scoped_default_precision<value_type>                                          precision_guard(arg);\n   return atanh(value_type(arg));\n}\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR multiprecision::number<Backend, ExpressionTemplates> cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& arg)\n{\n   detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(arg);\n   return boost::math::cbrt(arg, c99_error_policy());\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   detail::scoped_default_precision<value_type>                                          precision_guard(arg);\n   return cbrt(value_type(arg));\n}\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR multiprecision::number<Backend, ExpressionTemplates> erf BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& arg)\n{\n   detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(arg);\n   return boost::math::erf(arg, c99_error_policy());\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type erf BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   detail::scoped_default_precision<value_type>                                          precision_guard(arg);\n   return erf(value_type(arg));\n}\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR multiprecision::number<Backend, ExpressionTemplates> erfc BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& arg)\n{\n   detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(arg);\n   return boost::math::erfc(arg, c99_error_policy());\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type erfc BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   detail::scoped_default_precision<value_type>                                          precision_guard(arg);\n   return erfc(value_type(arg));\n}\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR multiprecision::number<Backend, ExpressionTemplates> expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& arg)\n{\n   detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(arg);\n   return boost::math::expm1(arg, c99_error_policy());\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   detail::scoped_default_precision<value_type>                                          precision_guard(arg);\n   return expm1(value_type(arg));\n}\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR multiprecision::number<Backend, ExpressionTemplates> lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& arg)\n{\n   detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(arg);\n   multiprecision::number<Backend, ExpressionTemplates>                                    result;\n   result = boost::math::lgamma(arg, c99_error_policy());\n   if ((boost::multiprecision::isnan)(result) && !(boost::multiprecision::isnan)(arg))\n   {\n      result = std::numeric_limits<multiprecision::number<Backend, ExpressionTemplates> >::infinity();\n      errno  = ERANGE;\n   }\n   return result;\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   detail::scoped_default_precision<value_type>                                          precision_guard(arg);\n   return lgamma(value_type(arg));\n}\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR multiprecision::number<Backend, ExpressionTemplates> tgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& arg)\n{\n   detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(arg);\n   if ((arg == 0) && std::numeric_limits<multiprecision::number<Backend, ExpressionTemplates> >::has_infinity)\n   {\n      errno = ERANGE;\n      return 1 / arg;\n   }\n   return boost::math::tgamma(arg, c99_error_policy());\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type tgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   detail::scoped_default_precision<value_type>                                          precision_guard(arg);\n   return tgamma(value_type(arg));\n}\n\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR long lrint BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& arg)\n{\n   return lround(arg);\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR long lrint BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   return lround(arg);\n}\n#ifndef BOOST_NO_LONG_LONG\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR long long llrint BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& arg)\n{\n   return llround(arg);\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR long long llrint BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   return llround(arg);\n}\n#endif\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR multiprecision::number<Backend, ExpressionTemplates> log1p BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& arg)\n{\n   detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(arg);\n   return boost::math::log1p(arg, c99_error_policy());\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type log1p BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   detail::scoped_default_precision<value_type>                                          precision_guard(arg);\n   return log1p(value_type(arg));\n}\n\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR multiprecision::number<Backend, ExpressionTemplates> nextafter BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& a, const multiprecision::number<Backend, ExpressionTemplates>& b)\n{\n   detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(a, b);\n   return boost::math::nextafter(a, b, c99_error_policy());\n}\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates, class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR multiprecision::number<Backend, ExpressionTemplates> nextafter BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& a, const multiprecision::detail::expression<tag, A1, A2, A3, A4>& b)\n{\n   detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(a, b);\n   return nextafter                                                                        BOOST_PREVENT_MACRO_SUBSTITUTION(a, multiprecision::number<Backend, ExpressionTemplates>(b));\n}\ntemplate <class tag, class A1, class A2, class A3, class A4, class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR multiprecision::number<Backend, ExpressionTemplates> nextafter BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& a, const multiprecision::number<Backend, ExpressionTemplates>& b)\n{\n   detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(a, b);\n   return nextafter                                                                        BOOST_PREVENT_MACRO_SUBSTITUTION(multiprecision::number<Backend, ExpressionTemplates>(a), b);\n}\ntemplate <class tag, class A1, class A2, class A3, class A4, class tagb, class A1b, class A2b, class A3b, class A4b>\ninline BOOST_MP_CXX14_CONSTEXPR typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type nextafter BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& a, const multiprecision::detail::expression<tagb, A1b, A2b, A3b, A4b>& b)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   detail::scoped_default_precision<value_type>                                          precision_guard(a, b);\n   return nextafter                                                                      BOOST_PREVENT_MACRO_SUBSTITUTION(value_type(a), value_type(b));\n}\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR multiprecision::number<Backend, ExpressionTemplates> nexttoward BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& a, const multiprecision::number<Backend, ExpressionTemplates>& b)\n{\n   detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(a, b);\n   return boost::math::nextafter(a, b, c99_error_policy());\n}\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates, class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR multiprecision::number<Backend, ExpressionTemplates> nexttoward BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::number<Backend, ExpressionTemplates>& a, const multiprecision::detail::expression<tag, A1, A2, A3, A4>& b)\n{\n   detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(a, b);\n   return nexttoward                                                                       BOOST_PREVENT_MACRO_SUBSTITUTION(a, multiprecision::number<Backend, ExpressionTemplates>(b));\n}\ntemplate <class tag, class A1, class A2, class A3, class A4, class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR multiprecision::number<Backend, ExpressionTemplates> nexttoward BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& a, const multiprecision::number<Backend, ExpressionTemplates>& b)\n{\n   detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(a, b);\n   return nexttoward                                                                       BOOST_PREVENT_MACRO_SUBSTITUTION(multiprecision::number<Backend, ExpressionTemplates>(a), b);\n}\ntemplate <class tag, class A1, class A2, class A3, class A4, class tagb, class A1b, class A2b, class A3b, class A4b>\ninline BOOST_MP_CXX14_CONSTEXPR typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type nexttoward BOOST_PREVENT_MACRO_SUBSTITUTION(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& a, const multiprecision::detail::expression<tagb, A1b, A2b, A3b, A4b>& b)\n{\n   using value_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   detail::scoped_default_precision<value_type>                                          precision_guard(a, b);\n   return nexttoward                                                                     BOOST_PREVENT_MACRO_SUBSTITUTION(value_type(a), value_type(b));\n}\n#endif // BOOST_MP_MATH_AVAILABLE\n\ntemplate <class B1, class B2, class B3, expression_template_option ET1, expression_template_option ET2, expression_template_option ET3>\ninline BOOST_MP_CXX14_CONSTEXPR number<B1, ET1>& add(number<B1, ET1>& result, const number<B2, ET2>& a, const number<B3, ET3>& b)\n{\n   static_assert((std::is_convertible<B2, B1>::value), \"No conversion to the target of a mixed precision addition exists\");\n   static_assert((std::is_convertible<B3, B1>::value), \"No conversion to the target of a mixed precision addition exists\");\n   using default_ops::eval_add;\n   eval_add(result.backend(), a.backend(), b.backend());\n   return result;\n}\n\ntemplate <class B1, class B2, class B3, expression_template_option ET1, expression_template_option ET2, expression_template_option ET3>\ninline BOOST_MP_CXX14_CONSTEXPR number<B1, ET1>& subtract(number<B1, ET1>& result, const number<B2, ET2>& a, const number<B3, ET3>& b)\n{\n   static_assert((std::is_convertible<B2, B1>::value), \"No conversion to the target of a mixed precision addition exists\");\n   static_assert((std::is_convertible<B3, B1>::value), \"No conversion to the target of a mixed precision addition exists\");\n   using default_ops::eval_subtract;\n   eval_subtract(result.backend(), a.backend(), b.backend());\n   return result;\n}\n\ntemplate <class B1, class B2, class B3, expression_template_option ET1, expression_template_option ET2, expression_template_option ET3>\ninline BOOST_MP_CXX14_CONSTEXPR number<B1, ET1>& multiply(number<B1, ET1>& result, const number<B2, ET2>& a, const number<B3, ET3>& b)\n{\n   static_assert((std::is_convertible<B2, B1>::value), \"No conversion to the target of a mixed precision addition exists\");\n   static_assert((std::is_convertible<B3, B1>::value), \"No conversion to the target of a mixed precision addition exists\");\n   using default_ops::eval_multiply;\n   eval_multiply(result.backend(), a.backend(), b.backend());\n   return result;\n}\n\ntemplate <class B, expression_template_option ET, class I>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<I>::value, number<B, ET>&>::type\nadd(number<B, ET>& result, const I& a, const I& b)\n{\n   using default_ops::eval_add;\n   using canonical_type = typename detail::canonical<I, B>::type;\n   eval_add(result.backend(), static_cast<canonical_type>(a), static_cast<canonical_type>(b));\n   return result;\n}\n\ntemplate <class B, expression_template_option ET, class I>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<I>::value, number<B, ET>&>::type\nsubtract(number<B, ET>& result, const I& a, const I& b)\n{\n   using default_ops::eval_subtract;\n   using canonical_type = typename detail::canonical<I, B>::type;\n   eval_subtract(result.backend(), static_cast<canonical_type>(a), static_cast<canonical_type>(b));\n   return result;\n}\n\ntemplate <class B, expression_template_option ET, class I>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<I>::value, number<B, ET>&>::type\nmultiply(number<B, ET>& result, const I& a, const I& b)\n{\n   using default_ops::eval_multiply;\n   using canonical_type = typename detail::canonical<I, B>::type;\n   eval_multiply(result.backend(), static_cast<canonical_type>(a), static_cast<canonical_type>(b));\n   return result;\n}\n\ntemplate <class tag, class A1, class A2, class A3, class A4, class Policy>\ninline BOOST_MP_CXX14_CONSTEXPR typename detail::expression<tag, A1, A2, A3, A4>::result_type trunc(const detail::expression<tag, A1, A2, A3, A4>& v, const Policy& pol)\n{\n   using number_type = typename detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return std::move(trunc(number_type(v), pol));\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Policy>\ninline BOOST_MP_CXX14_CONSTEXPR number<Backend, ExpressionTemplates> trunc(const number<Backend, ExpressionTemplates>& v, const Policy&)\n{\n   using default_ops::eval_trunc;\n   detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(v);\n   number<Backend, ExpressionTemplates>                                                    result;\n   eval_trunc(result.backend(), v.backend());\n   return result;\n}\n\ntemplate <class tag, class A1, class A2, class A3, class A4, class Policy>\ninline BOOST_MP_CXX14_CONSTEXPR int itrunc(const detail::expression<tag, A1, A2, A3, A4>& v, const Policy& pol)\n{\n   using number_type = typename detail::expression<tag, A1, A2, A3, A4>::result_type;\n   number_type                                                           r(trunc(v, pol));\n   if ((r > (std::numeric_limits<int>::max)()) || r < (std::numeric_limits<int>::min)() || !BOOST_MP_ISFINITE(v))\n      return boost::math::policies::raise_rounding_error(\"boost::multiprecision::itrunc<%1%>(%1%)\", nullptr, number_type(v), 0, pol);\n   return r.template convert_to<int>();\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR int itrunc(const detail::expression<tag, A1, A2, A3, A4>& v)\n{\n   return itrunc(v, boost::math::policies::policy<>());\n}\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Policy>\ninline BOOST_MP_CXX14_CONSTEXPR int itrunc(const number<Backend, ExpressionTemplates>& v, const Policy& pol)\n{\n   number<Backend, ExpressionTemplates> r(trunc(v, pol));\n   if ((r > (std::numeric_limits<int>::max)()) || r < (std::numeric_limits<int>::min)() || !BOOST_MP_ISFINITE(v))\n      return boost::math::policies::raise_rounding_error(\"boost::multiprecision::itrunc<%1%>(%1%)\", nullptr, v, 0, pol);\n   return r.template convert_to<int>();\n}\ntemplate <class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR int itrunc(const number<Backend, ExpressionTemplates>& v)\n{\n   return itrunc(v, boost::math::policies::policy<>());\n}\ntemplate <class tag, class A1, class A2, class A3, class A4, class Policy>\ninline BOOST_MP_CXX14_CONSTEXPR long ltrunc(const detail::expression<tag, A1, A2, A3, A4>& v, const Policy& pol)\n{\n   using number_type = typename detail::expression<tag, A1, A2, A3, A4>::result_type;\n   number_type                                                           r(trunc(v, pol));\n   if ((r > (std::numeric_limits<long>::max)()) || r < (std::numeric_limits<long>::min)() || !BOOST_MP_ISFINITE(v))\n      return boost::math::policies::raise_rounding_error(\"boost::multiprecision::ltrunc<%1%>(%1%)\", nullptr, number_type(v), 0L, pol);\n   return r.template convert_to<long>();\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR long ltrunc(const detail::expression<tag, A1, A2, A3, A4>& v)\n{\n   return ltrunc(v, boost::math::policies::policy<>());\n}\ntemplate <class T, expression_template_option ExpressionTemplates, class Policy>\ninline BOOST_MP_CXX14_CONSTEXPR long ltrunc(const number<T, ExpressionTemplates>& v, const Policy& pol)\n{\n   number<T, ExpressionTemplates> r(trunc(v, pol));\n   if ((r > (std::numeric_limits<long>::max)()) || r < (std::numeric_limits<long>::min)() || !BOOST_MP_ISFINITE(v))\n      return boost::math::policies::raise_rounding_error(\"boost::multiprecision::ltrunc<%1%>(%1%)\", nullptr, v, 0L, pol);\n   return r.template convert_to<long>();\n}\ntemplate <class T, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR long ltrunc(const number<T, ExpressionTemplates>& v)\n{\n   return ltrunc(v, boost::math::policies::policy<>());\n}\n#ifndef BOOST_NO_LONG_LONG\ntemplate <class tag, class A1, class A2, class A3, class A4, class Policy>\ninline BOOST_MP_CXX14_CONSTEXPR long long lltrunc(const detail::expression<tag, A1, A2, A3, A4>& v, const Policy& pol)\n{\n   using number_type = typename detail::expression<tag, A1, A2, A3, A4>::result_type;\n   number_type                                                           r(trunc(v, pol));\n   if ((r > (std::numeric_limits<long long>::max)()) || r < (std::numeric_limits<long long>::min)() || !BOOST_MP_ISFINITE(v))\n      return boost::math::policies::raise_rounding_error(\"boost::multiprecision::lltrunc<%1%>(%1%)\", nullptr, number_type(v), 0LL, pol);\n   return r.template convert_to<long long>();\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR long long lltrunc(const detail::expression<tag, A1, A2, A3, A4>& v)\n{\n   return lltrunc(v, boost::math::policies::policy<>());\n}\ntemplate <class T, expression_template_option ExpressionTemplates, class Policy>\ninline BOOST_MP_CXX14_CONSTEXPR long long lltrunc(const number<T, ExpressionTemplates>& v, const Policy& pol)\n{\n   number<T, ExpressionTemplates> r(trunc(v, pol));\n   if ((r > (std::numeric_limits<long long>::max)()) || r < (std::numeric_limits<long long>::min)() || !BOOST_MP_ISFINITE(v))\n      return boost::math::policies::raise_rounding_error(\"boost::multiprecision::lltrunc<%1%>(%1%)\", nullptr, v, 0LL, pol);\n   return r.template convert_to<long long>();\n}\ntemplate <class T, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR long long lltrunc(const number<T, ExpressionTemplates>& v)\n{\n   return lltrunc(v, boost::math::policies::policy<>());\n}\n#endif\ntemplate <class tag, class A1, class A2, class A3, class A4, class Policy>\ninline BOOST_MP_CXX14_CONSTEXPR typename detail::expression<tag, A1, A2, A3, A4>::result_type round(const detail::expression<tag, A1, A2, A3, A4>& v, const Policy& pol)\n{\n   using number_type = typename detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return std::move(round(static_cast<number_type>(v), pol));\n}\ntemplate <class T, expression_template_option ExpressionTemplates, class Policy>\ninline BOOST_MP_CXX14_CONSTEXPR number<T, ExpressionTemplates> round(const number<T, ExpressionTemplates>& v, const Policy&)\n{\n   using default_ops::eval_round;\n   detail::scoped_default_precision<multiprecision::number<T, ExpressionTemplates> > precision_guard(v);\n   number<T, ExpressionTemplates>                                                    result;\n   eval_round(result.backend(), v.backend());\n   return result;\n}\n\ntemplate <class tag, class A1, class A2, class A3, class A4, class Policy>\ninline BOOST_MP_CXX14_CONSTEXPR int iround(const detail::expression<tag, A1, A2, A3, A4>& v, const Policy& pol)\n{\n   using number_type = typename detail::expression<tag, A1, A2, A3, A4>::result_type;\n   number_type                                                           r(round(v, pol));\n   if ((r > (std::numeric_limits<int>::max)()) || r < (std::numeric_limits<int>::min)() || !BOOST_MP_ISFINITE(v))\n      return boost::math::policies::raise_rounding_error(\"boost::multiprecision::iround<%1%>(%1%)\", nullptr, number_type(v), 0, pol);\n   return r.template convert_to<int>();\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR int iround(const detail::expression<tag, A1, A2, A3, A4>& v)\n{\n   return iround(v, boost::math::policies::policy<>());\n}\ntemplate <class T, expression_template_option ExpressionTemplates, class Policy>\ninline BOOST_MP_CXX14_CONSTEXPR int iround(const number<T, ExpressionTemplates>& v, const Policy& pol)\n{\n   number<T, ExpressionTemplates> r(round(v, pol));\n   if ((r > (std::numeric_limits<int>::max)()) || r < (std::numeric_limits<int>::min)() || !BOOST_MP_ISFINITE(v))\n      return boost::math::policies::raise_rounding_error(\"boost::multiprecision::iround<%1%>(%1%)\", nullptr, v, 0, pol);\n   return r.template convert_to<int>();\n}\ntemplate <class T, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR int iround(const number<T, ExpressionTemplates>& v)\n{\n   return iround(v, boost::math::policies::policy<>());\n}\ntemplate <class tag, class A1, class A2, class A3, class A4, class Policy>\ninline BOOST_MP_CXX14_CONSTEXPR long lround(const detail::expression<tag, A1, A2, A3, A4>& v, const Policy& pol)\n{\n   using number_type = typename detail::expression<tag, A1, A2, A3, A4>::result_type;\n   number_type                                                           r(round(v, pol));\n   if ((r > (std::numeric_limits<long>::max)()) || r < (std::numeric_limits<long>::min)() || !BOOST_MP_ISFINITE(v))\n      return boost::math::policies::raise_rounding_error(\"boost::multiprecision::lround<%1%>(%1%)\", nullptr, number_type(v), 0L, pol);\n   return r.template convert_to<long>();\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR long lround(const detail::expression<tag, A1, A2, A3, A4>& v)\n{\n   return lround(v, boost::math::policies::policy<>());\n}\ntemplate <class T, expression_template_option ExpressionTemplates, class Policy>\ninline BOOST_MP_CXX14_CONSTEXPR long lround(const number<T, ExpressionTemplates>& v, const Policy& pol)\n{\n   number<T, ExpressionTemplates> r(round(v, pol));\n   if ((r > (std::numeric_limits<long>::max)()) || r < (std::numeric_limits<long>::min)() || !BOOST_MP_ISFINITE(v))\n      return boost::math::policies::raise_rounding_error(\"boost::multiprecision::lround<%1%>(%1%)\", nullptr, v, 0L, pol);\n   return r.template convert_to<long>();\n}\ntemplate <class T, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR long lround(const number<T, ExpressionTemplates>& v)\n{\n   return lround(v, boost::math::policies::policy<>());\n}\n#ifndef BOOST_NO_LONG_LONG\ntemplate <class tag, class A1, class A2, class A3, class A4, class Policy>\ninline BOOST_MP_CXX14_CONSTEXPR long long llround(const detail::expression<tag, A1, A2, A3, A4>& v, const Policy& pol)\n{\n   using number_type = typename detail::expression<tag, A1, A2, A3, A4>::result_type;\n   number_type                                                           r(round(v, pol));\n   if ((r > (std::numeric_limits<long long>::max)()) || r < (std::numeric_limits<long long>::min)() || !BOOST_MP_ISFINITE(v))\n      return boost::math::policies::raise_rounding_error(\"boost::multiprecision::iround<%1%>(%1%)\", nullptr, number_type(v), 0LL, pol);\n   return r.template convert_to<long long>();\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR long long llround(const detail::expression<tag, A1, A2, A3, A4>& v)\n{\n   return llround(v, boost::math::policies::policy<>());\n}\ntemplate <class T, expression_template_option ExpressionTemplates, class Policy>\ninline BOOST_MP_CXX14_CONSTEXPR long long llround(const number<T, ExpressionTemplates>& v, const Policy& pol)\n{\n   number<T, ExpressionTemplates> r(round(v, pol));\n   if ((r > (std::numeric_limits<long long>::max)()) || r < (std::numeric_limits<long long>::min)() || !BOOST_MP_ISFINITE(v))\n      return boost::math::policies::raise_rounding_error(\"boost::multiprecision::iround<%1%>(%1%)\", nullptr, v, 0LL, pol);\n   return r.template convert_to<long long>();\n}\ntemplate <class T, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR long long llround(const number<T, ExpressionTemplates>& v)\n{\n   return llround(v, boost::math::policies::policy<>());\n}\n#endif\n//\n// frexp does not return an expression template since we require the\n// integer argument to be evaluated even if the returned value is\n// not assigned to anything...\n//\ntemplate <class T, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<T>::value == number_kind_floating_point, number<T, ExpressionTemplates> >::type frexp(const number<T, ExpressionTemplates>& v, short* pint)\n{\n   using default_ops::eval_frexp;\n   detail::scoped_default_precision<multiprecision::number<T, ExpressionTemplates> > precision_guard(v);\n   number<T, ExpressionTemplates>                                                    result;\n   eval_frexp(result.backend(), v.backend(), pint);\n   return result;\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_floating_point, typename detail::expression<tag, A1, A2, A3, A4>::result_type>::type\nfrexp(const detail::expression<tag, A1, A2, A3, A4>& v, short* pint)\n{\n   using number_type = typename detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return std::move(frexp(static_cast<number_type>(v), pint));\n}\ntemplate <class T, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<T>::value == number_kind_floating_point, number<T, ExpressionTemplates> >::type frexp(const number<T, ExpressionTemplates>& v, int* pint)\n{\n   using default_ops::eval_frexp;\n   detail::scoped_default_precision<multiprecision::number<T, ExpressionTemplates> > precision_guard(v);\n   number<T, ExpressionTemplates>                                                    result;\n   eval_frexp(result.backend(), v.backend(), pint);\n   return result;\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_floating_point, typename detail::expression<tag, A1, A2, A3, A4>::result_type>::type\nfrexp(const detail::expression<tag, A1, A2, A3, A4>& v, int* pint)\n{\n   using number_type = typename detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return std::move(frexp(static_cast<number_type>(v), pint));\n}\ntemplate <class T, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<T>::value == number_kind_floating_point, number<T, ExpressionTemplates> >::type frexp(const number<T, ExpressionTemplates>& v, long* pint)\n{\n   using default_ops::eval_frexp;\n   detail::scoped_default_precision<multiprecision::number<T, ExpressionTemplates> > precision_guard(v);\n   number<T, ExpressionTemplates>                                                    result;\n   eval_frexp(result.backend(), v.backend(), pint);\n   return result;\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_floating_point, typename detail::expression<tag, A1, A2, A3, A4>::result_type>::type\nfrexp(const detail::expression<tag, A1, A2, A3, A4>& v, long* pint)\n{\n   using number_type = typename detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return std::move(frexp(static_cast<number_type>(v), pint));\n}\ntemplate <class T, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<T>::value == number_kind_floating_point, number<T, ExpressionTemplates> >::type frexp(const number<T, ExpressionTemplates>& v, long long* pint)\n{\n   using default_ops::eval_frexp;\n   detail::scoped_default_precision<multiprecision::number<T, ExpressionTemplates> > precision_guard(v);\n   number<T, ExpressionTemplates>                                                    result;\n   eval_frexp(result.backend(), v.backend(), pint);\n   return result;\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_floating_point, typename detail::expression<tag, A1, A2, A3, A4>::result_type>::type\nfrexp(const detail::expression<tag, A1, A2, A3, A4>& v, long long* pint)\n{\n   using number_type = typename detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return std::move(frexp(static_cast<number_type>(v), pint));\n}\n//\n// modf does not return an expression template since we require the\n// second argument to be evaluated even if the returned value is\n// not assigned to anything...\n//\ntemplate <class T, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<T>::value == number_kind_floating_point, number<T, ExpressionTemplates> >::type modf(const number<T, ExpressionTemplates>& v, number<T, ExpressionTemplates>* pipart)\n{\n   using default_ops::eval_modf;\n   detail::scoped_default_precision<multiprecision::number<T, ExpressionTemplates> > precision_guard(v);\n   number<T, ExpressionTemplates>                                                    result;\n   eval_modf(result.backend(), v.backend(), pipart ? &pipart->backend() : nullptr);\n   return result;\n}\ntemplate <class T, expression_template_option ExpressionTemplates, class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<T>::value == number_kind_floating_point, number<T, ExpressionTemplates> >::type modf(const detail::expression<tag, A1, A2, A3, A4>& v, number<T, ExpressionTemplates>* pipart)\n{\n   using default_ops::eval_modf;\n   detail::scoped_default_precision<multiprecision::number<T, ExpressionTemplates> > precision_guard(v);\n   number<T, ExpressionTemplates>                                                    result, arg(v);\n   eval_modf(result.backend(), arg.backend(), pipart ? &pipart->backend() : nullptr);\n   return result;\n}\n\n//\n// Integer square root:\n//\ntemplate <class B, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer, number<B, ExpressionTemplates> >::type\nsqrt(const number<B, ExpressionTemplates>& x)\n{\n   using default_ops::eval_integer_sqrt;\n   number<B, ExpressionTemplates> s, r;\n   eval_integer_sqrt(s.backend(), r.backend(), x.backend());\n   return s;\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_integer, typename detail::expression<tag, A1, A2, A3, A4>::result_type>::type\n         sqrt(const detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   using default_ops::eval_integer_sqrt;\n   using result_type = typename detail::expression<tag, A1, A2, A3, A4>::result_type;\n   detail::scoped_default_precision<result_type> precision_guard(arg);\n   result_type                                   result, v(arg), r;\n   eval_integer_sqrt(result.backend(), r.backend(), v.backend());\n   return result;\n}\n\n//\n// fma:\n//\n\nnamespace default_ops {\n\nstruct fma_func\n{\n   template <class B, class T, class U, class V>\n   BOOST_MP_CXX14_CONSTEXPR void operator()(B& result, const T& a, const U& b, const V& c) const\n   {\n      eval_multiply_add(result, a, b, c);\n   }\n};\n\n} // namespace default_ops\n\ntemplate <class Backend, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n        (number_category<number<Backend, et_on> >::value == number_kind_floating_point) &&\n        (is_number<U>::value || is_number_expression<U>::value || boost::multiprecision::detail::is_arithmetic<U>::value) &&\n        (is_number<V>::value || is_number_expression<V>::value || boost::multiprecision::detail::is_arithmetic<V>::value),\n    detail::expression<detail::function, default_ops::fma_func, number<Backend, et_on>, U, V> >::type\nfma(const number<Backend, et_on>& a, const U& b, const V& c)\n{\n   return detail::expression<detail::function, default_ops::fma_func, number<Backend, et_on>, U, V>(\n       default_ops::fma_func(), a, b, c);\n}\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n        (number_category<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value == number_kind_floating_point) &&\n        (is_number<U>::value || is_number_expression<U>::value || boost::multiprecision::detail::is_arithmetic<U>::value) &&\n        (is_number<V>::value || is_number_expression<V>::value || boost::multiprecision::detail::is_arithmetic<V>::value),\n    detail::expression<detail::function, default_ops::fma_func, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, U, V> >::type\nfma(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const U& b, const V& c)\n{\n   return detail::expression<detail::function, default_ops::fma_func, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, U, V>(\n       default_ops::fma_func(), a, b, c);\n}\n\ntemplate <class Backend, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n        (number_category<number<Backend, et_off> >::value == number_kind_floating_point) &&\n        (is_number<U>::value || is_number_expression<U>::value || boost::multiprecision::detail::is_arithmetic<U>::value) &&\n        (is_number<V>::value || is_number_expression<V>::value || boost::multiprecision::detail::is_arithmetic<V>::value),\n    number<Backend, et_off> >::type\nfma(const number<Backend, et_off>& a, const U& b, const V& c)\n{\n   using default_ops::eval_multiply_add;\n   detail::scoped_default_precision<multiprecision::number<Backend, et_off> > precision_guard(a, b, c);\n   number<Backend, et_off>                                                    result;\n   eval_multiply_add(result.backend(), number<Backend, et_off>::canonical_value(a), number<Backend, et_off>::canonical_value(b), number<Backend, et_off>::canonical_value(c));\n   return result;\n}\n\ntemplate <class U, class Backend, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n        (number_category<number<Backend, et_on> >::value == number_kind_floating_point) &&\n        boost::multiprecision::detail::is_arithmetic<U>::value &&\n        (is_number<V>::value || is_number_expression<V>::value || boost::multiprecision::detail::is_arithmetic<V>::value),\n    detail::expression<detail::function, default_ops::fma_func, U, number<Backend, et_on>, V> >::type\nfma(const U& a, const number<Backend, et_on>& b, const V& c)\n{\n   return detail::expression<detail::function, default_ops::fma_func, U, number<Backend, et_on>, V>(\n       default_ops::fma_func(), a, b, c);\n}\n\ntemplate <class U, class tag, class Arg1, class Arg2, class Arg3, class Arg4, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n        (number_category<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value == number_kind_floating_point) &&\n        boost::multiprecision::detail::is_arithmetic<U>::value &&\n        (is_number<V>::value || is_number_expression<V>::value || boost::multiprecision::detail::is_arithmetic<V>::value),\n    detail::expression<detail::function, default_ops::fma_func, U, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V> >::type\nfma(const U& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b, const V& c)\n{\n   return detail::expression<detail::function, default_ops::fma_func, U, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V>(\n       default_ops::fma_func(), a, b, c);\n}\n\ntemplate <class U, class Backend, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n        (number_category<number<Backend, et_off> >::value == number_kind_floating_point) &&\n        boost::multiprecision::detail::is_arithmetic<U>::value &&\n        (is_number<V>::value || is_number_expression<V>::value || boost::multiprecision::detail::is_arithmetic<V>::value),\n    number<Backend, et_off> >::type\nfma(const U& a, const number<Backend, et_off>& b, const V& c)\n{\n   using default_ops::eval_multiply_add;\n   detail::scoped_default_precision<multiprecision::number<Backend, et_off> > precision_guard(a, b, c);\n   number<Backend, et_off>                                                    result;\n   eval_multiply_add(result.backend(), number<Backend, et_off>::canonical_value(a), number<Backend, et_off>::canonical_value(b), number<Backend, et_off>::canonical_value(c));\n   return result;\n}\n\ntemplate <class U, class V, class Backend>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n        (number_category<number<Backend, et_on> >::value == number_kind_floating_point) &&\n        boost::multiprecision::detail::is_arithmetic<U>::value &&\n        boost::multiprecision::detail::is_arithmetic<V>::value,\n    detail::expression<detail::function, default_ops::fma_func, U, V, number<Backend, et_on> > >::type\nfma(const U& a, const V& b, const number<Backend, et_on>& c)\n{\n   return detail::expression<detail::function, default_ops::fma_func, U, V, number<Backend, et_on> >(\n       default_ops::fma_func(), a, b, c);\n}\n\ntemplate <class U, class V, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n        (number_category<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value == number_kind_floating_point) &&\n        boost::multiprecision::detail::is_arithmetic<U>::value &&\n        boost::multiprecision::detail::is_arithmetic<V>::value,\n    detail::expression<detail::function, default_ops::fma_func, U, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type\nfma(const U& a, const V& b, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& c)\n{\n   return detail::expression<detail::function, default_ops::fma_func, U, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(\n       default_ops::fma_func(), a, b, c);\n}\n\ntemplate <class U, class V, class Backend>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n        (number_category<number<Backend, et_off> >::value == number_kind_floating_point) &&\n        boost::multiprecision::detail::is_arithmetic<U>::value &&\n        boost::multiprecision::detail::is_arithmetic<V>::value,\n        number<Backend, et_off> >::type\nfma(const U& a, const V& b, const number<Backend, et_off>& c)\n{\n   using default_ops::eval_multiply_add;\n   detail::scoped_default_precision<multiprecision::number<Backend, et_off> > precision_guard(a, b, c);\n   number<Backend, et_off>                                                    result;\n   eval_multiply_add(result.backend(), number<Backend, et_off>::canonical_value(a), number<Backend, et_off>::canonical_value(b), number<Backend, et_off>::canonical_value(c));\n   return result;\n}\n\nnamespace default_ops {\n\nstruct remquo_func\n{\n   template <class B, class T, class U>\n   BOOST_MP_CXX14_CONSTEXPR void operator()(B& result, const T& a, const U& b, int* pi) const\n   {\n      eval_remquo(result, a, b, pi);\n   }\n};\n\n} // namespace default_ops\n\ntemplate <class Backend, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    number_category<number<Backend, et_on> >::value == number_kind_floating_point,\n    detail::expression<detail::function, default_ops::remquo_func, number<Backend, et_on>, U, int*> >::type\nremquo(const number<Backend, et_on>& a, const U& b, int* pi)\n{\n   return detail::expression<detail::function, default_ops::remquo_func, number<Backend, et_on>, U, int*>(\n       default_ops::remquo_func(), a, b, pi);\n}\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    number_category<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value == number_kind_floating_point,\n    detail::expression<detail::function, default_ops::remquo_func, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, U, int*> >::type\nremquo(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const U& b, int* pi)\n{\n   return detail::expression<detail::function, default_ops::remquo_func, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, U, int*>(\n       default_ops::remquo_func(), a, b, pi);\n}\n\ntemplate <class U, class Backend>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    (number_category<number<Backend, et_on> >::value == number_kind_floating_point) && !is_number<U>::value && !is_number_expression<U>::value,\n    detail::expression<detail::function, default_ops::remquo_func, U, number<Backend, et_on>, int*> >::type\nremquo(const U& a, const number<Backend, et_on>& b, int* pi)\n{\n   return detail::expression<detail::function, default_ops::remquo_func, U, number<Backend, et_on>, int*>(\n       default_ops::remquo_func(), a, b, pi);\n}\n\ntemplate <class U, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    (number_category<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value == number_kind_floating_point) && !is_number<U>::value && !is_number_expression<U>::value,\n    detail::expression<detail::function, default_ops::remquo_func, U, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, int*> >::type\nremquo(const U& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b, int* pi)\n{\n   return detail::expression<detail::function, default_ops::remquo_func, U, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, int*>(\n       default_ops::remquo_func(), a, b, pi);\n}\n\ntemplate <class Backend, class U>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    number_category<number<Backend, et_on> >::value == number_kind_floating_point,\n    number<Backend, et_off> >::type\nremquo(const number<Backend, et_off>& a, const U& b, int* pi)\n{\n   using default_ops::eval_remquo;\n   detail::scoped_default_precision<multiprecision::number<Backend, et_off> > precision_guard(a, b);\n   number<Backend, et_off>                                                    result;\n   eval_remquo(result.backend(), a.backend(), number<Backend, et_off>::canonical_value(b), pi);\n   return result;\n}\ntemplate <class U, class Backend>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    (number_category<number<Backend, et_on> >::value == number_kind_floating_point) && !is_number<U>::value && !is_number_expression<U>::value,\n    number<Backend, et_off> >::type\nremquo(const U& a, const number<Backend, et_off>& b, int* pi)\n{\n   using default_ops::eval_remquo;\n   detail::scoped_default_precision<multiprecision::number<Backend, et_off> > precision_guard(a, b);\n   number<Backend, et_off>                                                    result;\n   eval_remquo(result.backend(), number<Backend, et_off>::canonical_value(a), b.backend(), pi);\n   return result;\n}\n\ntemplate <class B, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer, number<B, ExpressionTemplates> >::type\nsqrt(const number<B, ExpressionTemplates>& x, number<B, ExpressionTemplates>& r)\n{\n   using default_ops::eval_integer_sqrt;\n   detail::scoped_default_precision<multiprecision::number<B, ExpressionTemplates> > precision_guard(x, r);\n   number<B, ExpressionTemplates>                                                    s;\n   eval_integer_sqrt(s.backend(), r.backend(), x.backend());\n   return s;\n}\ntemplate <class B, expression_template_option ExpressionTemplates, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer, number<B, ExpressionTemplates> >::type\nsqrt(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& arg, number<B, ExpressionTemplates>& r)\n{\n   using default_ops::eval_integer_sqrt;\n   detail::scoped_default_precision<multiprecision::number<B, ExpressionTemplates> > precision_guard(r);\n   number<B, ExpressionTemplates>                                                    s;\n   number<B, ExpressionTemplates>                                                    x(arg);\n   eval_integer_sqrt(s.backend(), r.backend(), x.backend());\n   return s;\n}\n\n// clang-format off\n//\n// Regrettably, when the argument to a function is an rvalue we must return by value, and not return an\n// expression template, otherwise we can end up with dangling references.\n// See https://github.com/boostorg/multiprecision/issues/175.\n//\n#define UNARY_OP_FUNCTOR_CXX11_RVALUE(func, category)\\\n   template <class Backend>                                                                                                                                                                               \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == category, number<Backend, et_on> > ::type                                                                      \\\n   func(number<Backend, et_on>&& arg)                                                                                                                                                                     \\\n   {                                                                                                                                                                                                      \\\n      detail::scoped_default_precision<multiprecision::number<Backend, et_on> > precision_guard(arg);                                                                                                    \\\n      number<Backend, et_on>                                                    result;                                                                                                                  \\\n      using default_ops::BOOST_JOIN(eval_, func);                                                                                                                                                         \\\n      BOOST_JOIN(eval_, func)(result.backend(), arg.backend());                                                                                                                                                                  \\\n      return result;                                                                                                                                                                       \\\n   }                                                                                                                                                                                                      \\\n\n#define BINARY_OP_FUNCTOR_CXX11_RVALUE(func, category)\\\n   template <class Backend>                                                                                                                                                                                                                                \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == category, number<Backend, et_on> >::type func(number<Backend, et_on>&& arg, const number<Backend, et_on>& a)                                                                                              \\\n   {                                                                                                                                                                                                                                                       \\\n      detail::scoped_default_precision<multiprecision::number<Backend, et_on> > precision_guard(arg, a);                                                                                                                                                  \\\n      number<Backend, et_on>                                                    result;                                                                                                                                                                   \\\n      using default_ops::BOOST_JOIN(eval_, func);                                                                                                                                                                                                          \\\n      BOOST_JOIN(eval_, func)(result.backend(), arg.backend(), a.backend());                                                                                                                                                                                                      \\\n      return result;                                                                                                                                                                                                                        \\\n   }                                                                                                                                                                                                                                                       \\\n   template <class Backend>                                                                                                                                                                                                                                \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == category, number<Backend, et_on> >::type func(const number<Backend, et_on>& arg, number<Backend, et_on>&& a)                                                                                              \\\n   {                                                                                                                                                                                                                                                       \\\n      detail::scoped_default_precision<multiprecision::number<Backend, et_on> > precision_guard(arg, a);                                                                                                                                                  \\\n      number<Backend, et_on>                                                    result;                                                                                                                                                                   \\\n      using default_ops::BOOST_JOIN(eval_, func);                                                                                                                                                                                                          \\\n      BOOST_JOIN(eval_, func)(result.backend(), arg.backend(), a.backend());                                                                                                                                                                                                      \\\n      return result;                                                                                                                                                                                                                        \\\n   }                                                                                                                                                                                                                                                       \\\n   template <class Backend>                                                                                                                                                                                                                                \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == category, number<Backend, et_on> >::type func(number<Backend, et_on>&& arg, number<Backend, et_on>&& a)                                                                                              \\\n   {                                                                                                                                                                                                                                                       \\\n      detail::scoped_default_precision<multiprecision::number<Backend, et_on> > precision_guard(arg, a);                                                                                                                                                  \\\n      number<Backend, et_on>                                                    result;                                                                                                                                                                   \\\n      using default_ops::BOOST_JOIN(eval_, func);                                                                                                                                                                                                          \\\n      BOOST_JOIN(eval_, func)(result.backend(), arg.backend(), a.backend());                                                                                                                                                                                                      \\\n      return result;                                                                                                                                                                                                                        \\\n   }                                                                                                                                                                                                                                                       \\\n   template <class Backend, class tag, class A1, class A2, class A3, class A4>                                                                                                                                                                             \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<(number_category<Backend>::value == category) && (std::is_convertible<typename detail::expression<tag, A1, A2, A3, A4>::result_type, number<Backend, et_on> >::value),                           \\\n           number<Backend, et_on> > ::type                                                                                                                                                                       \\\n   func(number<Backend, et_on>&& arg, const detail::expression<tag, A1, A2, A3, A4>& a)                                                                                    \\\n   {                                                                                                                                                                                                                                                       \\\n      return detail::expression<detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < Backend>,                                                                                                                                                      \\\n             number<Backend, et_on>, detail::expression<tag, A1, A2, A3, A4> > (detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct))<Backend>(), arg, a);                                                                                             \\\n   }                                                                                                                                                                                                                                                       \\\n   template <class tag, class A1, class A2, class A3, class A4, class Backend>                                                                                                                                                                             \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<(number_category<Backend>::value == category) && (std::is_convertible<typename detail::expression<tag, A1, A2, A3, A4>::result_type, number<Backend, et_on> >::value),                           \\\n           number<Backend, et_on> > ::type                                                                                                                                                                       \\\n   func(const detail::expression<tag, A1, A2, A3, A4>& arg, number<Backend, et_on>&& a)                                                                                    \\\n   {                                                                                                                                                                                                                                                       \\\n      return detail::expression<detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < Backend>,                                                                                                                                                      \\\n             detail::expression<tag, A1, A2, A3, A4>, number<Backend, et_on> > (detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct))<Backend>(), arg, a);                                                                                             \\\n   }                                                                                                                                                                                                                                                       \\\n   template <class Backend, class Arithmetic>                                                                                                                                                                                                              \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<                                                                                                                                                                                                                        \\\n           is_compatible_arithmetic_type<Arithmetic, number<Backend, et_on> >::value && (number_category<Backend>::value == category),                                                                                                                     \\\n           number<Backend, et_on> >::type                                                                                                                                                                                                     \\\n   func(number<Backend, et_on>&& arg, const Arithmetic& a)                                                                                                                                               \\\n   {                                                                                                                                                                                                                                                       \\\n      return detail::expression<detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct))<Backend>,                                                                                                                                                      \\\n             number<Backend, et_on>, Arithmetic > (detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct))<Backend>(), arg, a);                                                                                                                         \\\n   }                                                                                                                                                                                                                                                       \\\n   template <class Backend, class Arithmetic>                                                                                                                                                                                                              \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<                                                                                                                                                                                                                        \\\n           is_compatible_arithmetic_type<Arithmetic, number<Backend, et_on> >::value && (number_category<Backend>::value == category),                                                                                                                     \\\n           number<Backend, et_on> > ::type                                                                                                                                                                                                    \\\n   func(const Arithmetic& arg, number<Backend, et_on>&& a)                                                                                                                                              \\\n   {                                                                                                                                                                                                                                                       \\\n      return detail::expression<                                                                                                                                                                                                                           \\\n                 detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < Backend>,                                                                                                                                                      \\\n             Arithmetic, number<Backend, et_on> > (detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < Backend > (), arg, a);                                                                                                                          \\\n   }                                                                                                                                                                                                                                                       \\\n\n\n#define UNARY_OP_FUNCTOR(func, category)                                                                                                                                                                  \\\n   namespace detail {                                                                                                                                                                                     \\\n   template <class Backend>                                                                                                                                                                               \\\n   struct BOOST_JOIN(category, BOOST_JOIN(func, _funct))                                                                                                                                                  \\\n   {                                                                                                                                                                                                      \\\n      BOOST_MP_CXX14_CONSTEXPR void operator()(Backend& result, const Backend& arg) const                                                                                                                                          \\\n      {                                                                                                                                                                                                   \\\n         using default_ops::BOOST_JOIN(eval_, func);                                                                                                                                                      \\\n         BOOST_JOIN(eval_, func)                                                                                                                                                                          \\\n         (result, arg);                                                                                                                                                                                   \\\n      }                                                                                                                                                                                                   \\\n      template <class U>                                                                                                                                                                                  \\\n      BOOST_MP_CXX14_CONSTEXPR void operator()(U& result, const Backend& arg) const                                                                                                                                                \\\n      {                                                                                                                                                                                                   \\\n         using default_ops::BOOST_JOIN(eval_, func);                                                                                                                                                      \\\n         Backend temp;                                                                                                                                                                                    \\\n         BOOST_JOIN(eval_, func)                                                                                                                                                                          \\\n         (temp, arg);                                                                                                                                                                                     \\\n         result = std::move(temp);                                                                                                                                                                                   \\\n      }                                                                                                                                                                                                   \\\n   };                                                                                                                                                                                                     \\\n   }                                                                                                                                                                                                      \\\n                                                                                                                                                                                                          \\\n   template <class tag, class A1, class A2, class A3, class A4>                                                                                                                                           \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<detail::expression<tag, A1, A2, A3, A4> >::value == category,                                                                     \\\n                                                        detail::expression<detail::function,                                                                                                              \\\n                                                        detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct))<typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type>,            \\\n                                                        detail::expression<tag, A1, A2, A3, A4> > > ::type                                                                                                \\\n   func(const detail::expression<tag, A1, A2, A3, A4>& arg)                                                                    \\\n   {                                                                                                                                                                                                      \\\n      return detail::expression<                                                                                                                                                                          \\\n                 detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type>,                               \\\n             detail::expression<tag, A1, A2, A3, A4> > (detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type > (), arg); \\\n   }                                                                                                                                                                                                      \\\n   template <class Backend>                                                                                                                                                                               \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == category,                                                                                                      \\\n          detail::expression<detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < Backend>, number<Backend, et_on> > > ::type                                                       \\\n   func(const number<Backend, et_on>& arg)                                                                                                                                                                \\\n   {                                                                                                                                                                                                      \\\n      return detail::expression<                                                                                                                                                                          \\\n                 detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < Backend>,                                                                                                     \\\n             number<Backend, et_on> > (detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < Backend > (), arg);                                                                                        \\\n   }                                                                                                                                                                                                      \\\n   template <class Backend>                                                                                                                                                                               \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<                                                                                                                                                                    \\\n       boost::multiprecision::number_category<Backend>::value == category,                                                                                                                                \\\n       number<Backend, et_off> >::type                                                                                                                                                                    \\\n   func(const number<Backend, et_off>& arg)                                                                                                                                                               \\\n   {                                                                                                                                                                                                      \\\n      detail::scoped_default_precision<multiprecision::number<Backend, et_off> > precision_guard(arg);                                                                                                    \\\n      number<Backend, et_off>                                                    result;                                                                                                                  \\\n      using default_ops::BOOST_JOIN(eval_, func);                                                                                                                                                         \\\n      BOOST_JOIN(eval_, func)(result.backend(), arg.backend());                                                                                                                                                                  \\\n      return result;                                                                                                                                                                       \\\n   }\\\n   UNARY_OP_FUNCTOR_CXX11_RVALUE(func, category)\\\n\n#define BINARY_OP_FUNCTOR(func, category)                                                                                                                                                                                                                  \\\n   namespace detail {                                                                                                                                                                                                                                      \\\n   template <class Backend>                                                                                                                                                                                                                                \\\n   struct BOOST_JOIN(category, BOOST_JOIN(func, _funct))                                                                                                                                                                                                   \\\n   {                                                                                                                                                                                                                                                       \\\n      BOOST_MP_CXX14_CONSTEXPR void operator()(Backend& result, const Backend& arg, const Backend& a) const                                                                                                                                                                         \\\n      {                                                                                                                                                                                                                                                    \\\n         using default_ops::BOOST_JOIN(eval_, func);                                                                                                                                                                                                       \\\n         BOOST_JOIN(eval_, func)                                                                                                                                                                                                                           \\\n         (result, arg, a);                                                                                                                                                                                                                                 \\\n      }                                                                                                                                                                                                                                                    \\\n      template <class Arithmetic>                                                                                                                                                                                                                          \\\n      BOOST_MP_CXX14_CONSTEXPR void operator()(Backend& result, const Backend& arg, const Arithmetic& a) const                                                                                                                                                                      \\\n      {                                                                                                                                                                                                                                                    \\\n         using default_ops::BOOST_JOIN(eval_, func);                                                                                                                                                                                                       \\\n         BOOST_JOIN(eval_, func)                                                                                                                                                                                                                           \\\n         (result, arg, number<Backend>::canonical_value(a));                                                                                                                                                                                               \\\n      }                                                                                                                                                                                                                                                    \\\n      template <class Arithmetic>                                                                                                                                                                                                                          \\\n      BOOST_MP_CXX14_CONSTEXPR void operator()(Backend& result, const Arithmetic& arg, const Backend& a) const                                                                                                                                                                      \\\n      {                                                                                                                                                                                                                                                    \\\n         using default_ops::BOOST_JOIN(eval_, func);                                                                                                                                                                                                       \\\n         BOOST_JOIN(eval_, func)                                                                                                                                                                                                                           \\\n         (result, number<Backend>::canonical_value(arg), a);                                                                                                                                                                                               \\\n      }                                                                                                                                                                                                                                                    \\\n      template <class U>                                                                                                                                                                                                                                   \\\n      BOOST_MP_CXX14_CONSTEXPR void operator()(U& result, const Backend& arg, const Backend& a) const                                                                                                                                                                               \\\n      {                                                                                                                                                                                                                                                    \\\n         using default_ops::BOOST_JOIN(eval_, func);                                                                                                                                                                                                       \\\n         Backend r;                                                                                                                                                                                                                                        \\\n         BOOST_JOIN(eval_, func)                                                                                                                                                                                                                           \\\n         (r, arg, a);                                                                                                                                                                                                                                      \\\n         result = std::move(r);                                                                                                                                                                                                                                       \\\n      }                                                                                                                                                                                                                                                    \\\n      template <class U, class Arithmetic>                                                                                                                                                                                                                 \\\n      BOOST_MP_CXX14_CONSTEXPR void operator()(U& result, const Backend& arg, const Arithmetic& a) const                                                                                                                                                                            \\\n      {                                                                                                                                                                                                                                                    \\\n         using default_ops::BOOST_JOIN(eval_, func);                                                                                                                                                                                                       \\\n         Backend r;                                                                                                                                                                                                                                        \\\n         BOOST_JOIN(eval_, func)                                                                                                                                                                                                                           \\\n         (r, arg, number<Backend>::canonical_value(a));                                                                                                                                                                                                    \\\n         result = std::move(r);                                                                                                                                                                                                                                       \\\n      }                                                                                                                                                                                                                                                    \\\n      template <class U, class Arithmetic>                                                                                                                                                                                                                 \\\n      BOOST_MP_CXX14_CONSTEXPR void operator()(U& result, const Arithmetic& arg, const Backend& a) const                                                                                                                                                                            \\\n      {                                                                                                                                                                                                                                                    \\\n         using default_ops::BOOST_JOIN(eval_, func);                                                                                                                                                                                                       \\\n         Backend r;                                                                                                                                                                                                                                        \\\n         BOOST_JOIN(eval_, func)                                                                                                                                                                                                                           \\\n         (r, number<Backend>::canonical_value(arg), a);                                                                                                                                                                                                    \\\n         result = std::move(r);                                                                                                                                                                                                                                       \\\n      }                                                                                                                                                                                                                                                    \\\n   };                                                                                                                                                                                                                                                      \\\n   }                                                                                                                                                                                                                                                       \\\n   template <class Backend>                                                                                                                                                                                                                                \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == category, detail::expression<detail::function, \\\n         detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct))<Backend>, number<Backend, et_on>, number<Backend, et_on> > > ::type                                                                                                                                                                \\\n   func(const number<Backend, et_on>& arg, const number<Backend, et_on>& a)                                                                                              \\\n   {                                                                                                                                                                                                                                                       \\\n      return detail::expression<detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < Backend>,                                                                                                                                                      \\\n             number<Backend, et_on>, number<Backend, et_on> > (detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct))<Backend>(), arg, a);                                                                                                              \\\n   }                                                                                                                                                                                                                                                       \\\n   template <class Backend, class tag, class A1, class A2, class A3, class A4>                                                                                                                                                                             \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<(number_category<Backend>::value == category) && (std::is_convertible<typename detail::expression<tag, A1, A2, A3, A4>::result_type, number<Backend, et_on> >::value),                           \\\n           detail::expression<detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct))<Backend>, number<Backend, et_on>, detail::expression<tag, A1, A2, A3, A4> > > ::type                                                                                                                                                                       \\\n   func(const number<Backend, et_on>& arg, const detail::expression<tag, A1, A2, A3, A4>& a)                                                                                    \\\n   {                                                                                                                                                                                                                                                       \\\n      return detail::expression<detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < Backend>,                                                                                                                                                      \\\n             number<Backend, et_on>, detail::expression<tag, A1, A2, A3, A4> > (detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct))<Backend>(), arg, a);                                                                                             \\\n   }                                                                                                                                                                                                                                                       \\\n   template <class tag, class A1, class A2, class A3, class A4, class Backend>                                                                                                                                                                             \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<(number_category<Backend>::value == category) && (std::is_convertible<typename detail::expression<tag, A1, A2, A3, A4>::result_type, number<Backend, et_on> >::value),                           \\\n           detail::expression<detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct))<Backend>, detail::expression<tag, A1, A2, A3, A4>, number<Backend, et_on> > > ::type                                                                                                                                                                       \\\n   func(const detail::expression<tag, A1, A2, A3, A4>& arg, const number<Backend, et_on>& a)                                                                                    \\\n   {                                                                                                                                                                                                                                                       \\\n      return detail::expression<detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < Backend>,                                                                                                                                                      \\\n             detail::expression<tag, A1, A2, A3, A4>, number<Backend, et_on> > (detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct))<Backend>(), arg, a);                                                                                             \\\n   }                                                                                                                                                                                                                                                       \\\n   template <class tag, class A1, class A2, class A3, class A4, class tagb, class A1b, class A2b, class A3b, class A4b>                                                                                                                                    \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<(number_category<detail::expression<tag, A1, A2, A3, A4> >::value == category) && (number_category<detail::expression<tagb, A1b, A2b, A3b, A4b> >::value == category),                                                                          \\\n           detail::expression<detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct))<typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type>,                                                                                  \\\n           detail::expression<tag, A1, A2, A3, A4>, detail::expression<tagb, A1b, A2b, A3b, A4b> > > ::type                                                                                                                                                 \\\n   func(const detail::expression<tag, A1, A2, A3, A4>& arg, const detail::expression<tagb, A1b, A2b, A3b, A4b>& a)                                        \\\n   {                                                                                                                                                                                                                                                       \\\n      return detail::expression<detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct))<typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type>,                                                                                \\\n             detail::expression<tag, A1, A2, A3, A4>, detail::expression<tagb, A1b, A2b, A3b, A4b> > (detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct))<typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type>(), arg, a); \\\n   }                                                                                                                                                                                                                                                       \\\n   template <class Backend, class Arithmetic>                                                                                                                                                                                                              \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<                                                                                                                                                                                                                        \\\n           is_compatible_arithmetic_type<Arithmetic, number<Backend, et_on> >::value && (number_category<Backend>::value == category),                                                                                                                     \\\n           detail::expression<detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < Backend>,                                                                                                                                                        \\\n           number<Backend, et_on>, Arithmetic> > ::type                                                                                                                                                                                                     \\\n   func(const number<Backend, et_on>& arg, const Arithmetic& a)                                                                                                                                               \\\n   {                                                                                                                                                                                                                                                       \\\n      return detail::expression<detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct))<Backend>,                                                                                                                                                      \\\n             number<Backend, et_on>, Arithmetic > (detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct))<Backend>(), arg, a);                                                                                                                         \\\n   }                                                                                                                                                                                                                                                       \\\n   template <class tag, class A1, class A2, class A3, class A4, class Arithmetic>                                                                                                                                                                          \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<                                                                                                                                                                                                                        \\\n           is_compatible_arithmetic_type<Arithmetic, typename detail::expression<tag, A1, A2, A3, A4>::result_type>::value && (number_category<detail::expression<tag, A1, A2, A3, A4> >::value == category),                                              \\\n           detail::expression<                                                                                                                                                                                                                             \\\n               detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type>,                                                                                  \\\n           detail::expression<tag, A1, A2, A3, A4>, Arithmetic> > ::type                                                                                                                                                                                    \\\n   func(const detail::expression<tag, A1, A2, A3, A4>& arg, const Arithmetic& a)                                                                                                             \\\n   {                                                                                                                                                                                                                                                       \\\n      return detail::expression<                                                                                                                                                                                                                           \\\n                 detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type>,                                                                                \\\n             detail::expression<tag, A1, A2, A3, A4>, Arithmetic > (detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type > (), arg, a);                                  \\\n   }                                                                                                                                                                                                                                                       \\\n   template <class Backend, class Arithmetic>                                                                                                                                                                                                              \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<                                                                                                                                                                                                                        \\\n           is_compatible_arithmetic_type<Arithmetic, number<Backend, et_on> >::value && (number_category<Backend>::value == category),                                                                                                                     \\\n           detail::expression<                                                                                                                                                                                                                             \\\n               detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < Backend>,                                                                                                                                                        \\\n           Arithmetic, number<Backend, et_on> > > ::type                                                                                                                                                                                                    \\\n   func(const Arithmetic& arg, const number<Backend, et_on>& a)                                                                                                                                              \\\n   {                                                                                                                                                                                                                                                       \\\n      return detail::expression<                                                                                                                                                                                                                           \\\n                 detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < Backend>,                                                                                                                                                      \\\n             Arithmetic, number<Backend, et_on> > (detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < Backend > (), arg, a);                                                                                                                          \\\n   }                                                                                                                                                                                                                                                       \\\n   template <class tag, class A1, class A2, class A3, class A4, class Arithmetic>                                                                                                                                                                          \\\n       inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<                                                                                                                                                                                                                        \\\n           is_compatible_arithmetic_type<Arithmetic, typename detail::expression<tag, A1, A2, A3, A4>::result_type>::value && (number_category<detail::expression<tag, A1, A2, A3, A4> >::value == category),                                              \\\n           detail::expression<                                                                                                                                                                                                                             \\\n               detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type>,                                                                                  \\\n           Arithmetic, detail::expression<tag, A1, A2, A3, A4> > > ::type                                                                                                                                                                                   \\\n   func(const Arithmetic& arg, const detail::expression<tag, A1, A2, A3, A4>& a)                                                                                                            \\\n   {                                                                                                                                                                                                                                                       \\\n      return detail::expression<                                                                                                                                                                                                                           \\\n                 detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type>,                                                                                \\\n             Arithmetic, detail::expression<tag, A1, A2, A3, A4> > (detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type > (), arg, a);                                   \\\n   }                                                                                                                                                                                                                                                       \\\n   template <class Backend>                                                                                                                                                                                                                                \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<(number_category<Backend>::value == category), number<Backend, et_off> >::type                                                                                                                                                                                             \\\n   func(const number<Backend, et_off>& arg, const number<Backend, et_off>& a)                                                                                                                                                                              \\\n   {                                                                                                                                                                                                                                                       \\\n      detail::scoped_default_precision<multiprecision::number<Backend, et_off> > precision_guard(arg, a);                                                                                                                                                  \\\n      number<Backend, et_off>                                                    result;                                                                                                                                                                   \\\n      using default_ops::BOOST_JOIN(eval_, func);                                                                                                                                                                                                          \\\n      BOOST_JOIN(eval_, func)(result.backend(), arg.backend(), a.backend());                                                                                                                                                                                                      \\\n      return result;                                                                                                                                                                                                                        \\\n   }                                                                                                                                                                                                                                                       \\\n   template <class Backend, class Arithmetic>                                                                                                                                                                                                              \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<                                                                                                                                                                                                                            \\\n       is_compatible_arithmetic_type<Arithmetic, number<Backend, et_off> >::value && (number_category<Backend>::value == category),                                                                                                                        \\\n       number<Backend, et_off> >::type                                                                                                                                                                                                                     \\\n   func(const number<Backend, et_off>& arg, const Arithmetic& a)                                                                                                                                                                                           \\\n   {                                                                                                                                                                                                                                                       \\\n      detail::scoped_default_precision<multiprecision::number<Backend, et_off> > precision_guard(arg);                                                                                                                                                     \\\n      number<Backend, et_off>                                                    result;                                                                                                                                                                   \\\n      using default_ops::BOOST_JOIN(eval_, func);                                                                                                                                                                                                          \\\n      BOOST_JOIN(eval_, func)                                                                                                                                                                                                                              \\\n      (result.backend(), arg.backend(), number<Backend, et_off>::canonical_value(a));                                                                                                                                                                      \\\n      return result;                                                                                                                                                                                                                        \\\n   }                                                                                                                                                                                                                                                       \\\n   template <class Backend, class Arithmetic>                                                                                                                                                                                                              \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<                                                                                                                                                                                                                            \\\n       is_compatible_arithmetic_type<Arithmetic, number<Backend, et_off> >::value && (number_category<Backend>::value == category),                                                                                                                        \\\n       number<Backend, et_off> >::type                                                                                                                                                                                                                     \\\n   func(const Arithmetic& a, const number<Backend, et_off>& arg)                                                                                                                                                                                           \\\n   {                                                                                                                                                                                                                                                       \\\n      detail::scoped_default_precision<multiprecision::number<Backend, et_off> > precision_guard(arg);                                                                                                                                                     \\\n      number<Backend, et_off>                                                    result;                                                                                                                                                                   \\\n      using default_ops::BOOST_JOIN(eval_, func);                                                                                                                                                                                                          \\\n      BOOST_JOIN(eval_, func)                                                                                                                                                                                                                              \\\n      (result.backend(), number<Backend, et_off>::canonical_value(a), arg.backend());                                                                                                                                                                      \\\n      return result;                                                                                                                                                                                                                        \\\n   }\\\n   BINARY_OP_FUNCTOR_CXX11_RVALUE(func, category)\n\n#define HETERO_BINARY_OP_FUNCTOR_B(func, Arg2, category)                                                                                                                                                            \\\n   template <class tag, class A1, class A2, class A3, class A4>                                                                                                                                                     \\\n       inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<                                                                                                                                                                                 \\\n           (number_category<detail::expression<tag, A1, A2, A3, A4> >::value == category),                                                                                                                          \\\n           detail::expression<                                                                                                                                                                                      \\\n               detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type>,                                           \\\n           detail::expression<tag, A1, A2, A3, A4>, Arg2> > ::type                                                                                                                                                   \\\n                                                           func(const detail::expression<tag, A1, A2, A3, A4>& arg, Arg2 const& a)                                                                                  \\\n   {                                                                                                                                                                                                                \\\n      return detail::expression<                                                                                                                                                                                    \\\n                 detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type>,                                         \\\n             detail::expression<tag, A1, A2, A3, A4>, Arg2 > (detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type > (), arg, a); \\\n   }                                                                                                                                                                                                                \\\n   template <class Backend>                                                                                                                                                                                         \\\n       inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<                                                                                                                                                                                 \\\n           (number_category<Backend>::value == category),                                                                                                                                                           \\\n           detail::expression<                                                                                                                                                                                      \\\n               detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < Backend>,                                                                                                                 \\\n           number<Backend, et_on>, Arg2> > ::type                                                                                                                                                                    \\\n                                          func(const number<Backend, et_on>& arg, Arg2 const& a)                                                                                                                    \\\n   {                                                                                                                                                                                                                \\\n      return detail::expression<                                                                                                                                                                                    \\\n                 detail::function, detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < Backend>,                                                                                                               \\\n             number<Backend, et_on>, Arg2 > (detail::BOOST_JOIN(category, BOOST_JOIN(func, _funct)) < Backend > (), arg, a);                                                                                        \\\n   }                                                                                                                                                                                                                \\\n   template <class Backend>                                                                                                                                                                                         \\\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<                                                                                                                                                                                     \\\n       (number_category<Backend>::value == category),                                                                                                                                                               \\\n       number<Backend, et_off> >::type                                                                                                                                                                              \\\n   func(const number<Backend, et_off>& arg, Arg2 const& a)                                                                                                                                                          \\\n   {                                                                                                                                                                                                                \\\n      detail::scoped_default_precision<multiprecision::number<Backend, et_off> > precision_guard(arg, a);                                                                                                           \\\n      number<Backend, et_off>                                                    result;                                                                                                                            \\\n      using default_ops::BOOST_JOIN(eval_, func);                                                                                                                                                                   \\\n      BOOST_JOIN(eval_, func)                                                                                                                                                                                       \\\n      (result.backend(), arg.backend(), a);                                                                                                                                                                         \\\n      return result;                                                                                                                                                                                 \\\n   }\n\n#define HETERO_BINARY_OP_FUNCTOR(func, Arg2, category)                  \\\n   namespace detail {                                                   \\\n   template <class Backend>                                             \\\n   struct BOOST_JOIN(category, BOOST_JOIN(func, _funct))                \\\n   {                                                                    \\\n      template <class Arg>                                              \\\n      BOOST_MP_CXX14_CONSTEXPR void operator()(Backend& result, Backend const& arg, Arg a) const \\\n      {                                                                 \\\n         using default_ops::BOOST_JOIN(eval_, func);                    \\\n         BOOST_JOIN(eval_, func)                                        \\\n         (result, arg, a);                                              \\\n      }                                                                 \\\n      template <class U, class Arg>                                              \\\n      BOOST_MP_CXX14_CONSTEXPR void operator()(U& result, Backend const& arg, Arg a) const \\\n      {                                                                 \\\n         using default_ops::BOOST_JOIN(eval_, func);                    \\\n         Backend temp;                                                  \\\n         BOOST_JOIN(eval_, func)                                        \\\n         (temp, arg, a);                                                \\\n         result = std::move(temp);                                  \\\n      }                                                                 \\\n   };                                                                   \\\n   }                                                                    \\\n                                                                        \\\n   HETERO_BINARY_OP_FUNCTOR_B(func, Arg2, category)\n\n// clang-format on\n\nnamespace detail {\ntemplate <class Backend>\nstruct abs_funct\n{\n   BOOST_MP_CXX14_CONSTEXPR void operator()(Backend& result, const Backend& arg) const\n   {\n      using default_ops::eval_abs;\n      eval_abs(result, arg);\n   }\n};\ntemplate <class Backend>\nstruct conj_funct\n{\n   BOOST_MP_CXX14_CONSTEXPR void operator()(Backend& result, const Backend& arg) const\n   {\n      using default_ops::eval_conj;\n      eval_conj(result, arg);\n   }\n};\ntemplate <class Backend>\nstruct proj_funct\n{\n   BOOST_MP_CXX14_CONSTEXPR void operator()(Backend& result, const Backend& arg) const\n   {\n      using default_ops::eval_proj;\n      eval_proj(result, arg);\n   }\n};\n\n} // namespace detail\n\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename detail::expression<tag, A1, A2, A3, A4>::result_type>::value != number_kind_complex,\n                                    detail::expression<\n                                        detail::function, detail::abs_funct<typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type>, detail::expression<tag, A1, A2, A3, A4> > >::type\nabs(const detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   return detail::expression<\n       detail::function, detail::abs_funct<typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type>, detail::expression<tag, A1, A2, A3, A4> >(\n       detail::abs_funct<typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type>(), arg);\n}\ntemplate <class Backend>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value != number_kind_complex,\n                             detail::expression<\n                                 detail::function, detail::abs_funct<Backend>, number<Backend, et_on> > >::type\nabs(const number<Backend, et_on>& arg)\n{\n   return detail::expression<\n       detail::function, detail::abs_funct<Backend>, number<Backend, et_on> >(\n       detail::abs_funct<Backend>(), arg);\n}\ntemplate <class Backend>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value != number_kind_complex, number<Backend, et_off> >::type\nabs(const number<Backend, et_off>& arg)\n{\n   detail::scoped_default_precision<multiprecision::number<Backend, et_off> > precision_guard(arg);\n   number<Backend, et_off>                                                    result;\n   using default_ops::eval_abs;\n   eval_abs(result.backend(), arg.backend());\n   return result;\n}\n\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<\n    detail::function, detail::conj_funct<typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type>, detail::expression<tag, A1, A2, A3, A4> >\nconj(const detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   return detail::expression<\n       detail::function, detail::conj_funct<typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type>, detail::expression<tag, A1, A2, A3, A4> >(\n       detail::conj_funct<typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type>(), arg);\n}\ntemplate <class Backend>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<\n    detail::function, detail::conj_funct<Backend>, number<Backend, et_on> >\nconj(const number<Backend, et_on>& arg)\n{\n   return detail::expression<\n       detail::function, detail::conj_funct<Backend>, number<Backend, et_on> >(\n       detail::conj_funct<Backend>(), arg);\n}\ntemplate <class Backend>\ninline BOOST_MP_CXX14_CONSTEXPR number<Backend, et_off>\nconj(const number<Backend, et_off>& arg)\n{\n   detail::scoped_default_precision<multiprecision::number<Backend, et_off> > precision_guard(arg);\n   number<Backend, et_off>                                                    result;\n   using default_ops::eval_conj;\n   eval_conj(result.backend(), arg.backend());\n   return result;\n}\n\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<\n    detail::function, detail::proj_funct<typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type>, detail::expression<tag, A1, A2, A3, A4> >\nproj(const detail::expression<tag, A1, A2, A3, A4>& arg)\n{\n   return detail::expression<\n       detail::function, detail::proj_funct<typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type>, detail::expression<tag, A1, A2, A3, A4> >(\n       detail::proj_funct<typename detail::backend_type<detail::expression<tag, A1, A2, A3, A4> >::type>(), arg);\n}\ntemplate <class Backend>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<\n    detail::function, detail::proj_funct<Backend>, number<Backend, et_on> >\nproj(const number<Backend, et_on>& arg)\n{\n   return detail::expression<\n       detail::function, detail::proj_funct<Backend>, number<Backend, et_on> >(\n       detail::proj_funct<Backend>(), arg);\n}\ntemplate <class Backend>\ninline BOOST_MP_CXX14_CONSTEXPR number<Backend, et_off>\nproj(const number<Backend, et_off>& arg)\n{\n   detail::scoped_default_precision<multiprecision::number<Backend, et_off> > precision_guard(arg);\n   number<Backend, et_off>                                                    result;\n   using default_ops::eval_proj;\n   eval_proj(result.backend(), arg.backend());\n   return result;\n}\n\nUNARY_OP_FUNCTOR(fabs, number_kind_floating_point)\nUNARY_OP_FUNCTOR(sqrt, number_kind_floating_point)\nUNARY_OP_FUNCTOR(floor, number_kind_floating_point)\nUNARY_OP_FUNCTOR(ceil, number_kind_floating_point)\nUNARY_OP_FUNCTOR(trunc, number_kind_floating_point)\nUNARY_OP_FUNCTOR(round, number_kind_floating_point)\nUNARY_OP_FUNCTOR(exp, number_kind_floating_point)\nUNARY_OP_FUNCTOR(exp2, number_kind_floating_point)\nUNARY_OP_FUNCTOR(log, number_kind_floating_point)\nUNARY_OP_FUNCTOR(log10, number_kind_floating_point)\nUNARY_OP_FUNCTOR(cos, number_kind_floating_point)\nUNARY_OP_FUNCTOR(sin, number_kind_floating_point)\nUNARY_OP_FUNCTOR(tan, number_kind_floating_point)\nUNARY_OP_FUNCTOR(asin, number_kind_floating_point)\nUNARY_OP_FUNCTOR(acos, number_kind_floating_point)\nUNARY_OP_FUNCTOR(atan, number_kind_floating_point)\nUNARY_OP_FUNCTOR(cosh, number_kind_floating_point)\nUNARY_OP_FUNCTOR(sinh, number_kind_floating_point)\nUNARY_OP_FUNCTOR(tanh, number_kind_floating_point)\nUNARY_OP_FUNCTOR(log2, number_kind_floating_point)\nUNARY_OP_FUNCTOR(nearbyint, number_kind_floating_point)\nUNARY_OP_FUNCTOR(rint, number_kind_floating_point)\n\nHETERO_BINARY_OP_FUNCTOR(ldexp, short, number_kind_floating_point)\n//HETERO_BINARY_OP_FUNCTOR(frexp, short*, number_kind_floating_point)\nHETERO_BINARY_OP_FUNCTOR_B(ldexp, int, number_kind_floating_point)\n//HETERO_BINARY_OP_FUNCTOR_B(frexp, int*, number_kind_floating_point)\nHETERO_BINARY_OP_FUNCTOR_B(ldexp, long, number_kind_floating_point)\n//HETERO_BINARY_OP_FUNCTOR_B(frexp, long*, number_kind_floating_point)\nHETERO_BINARY_OP_FUNCTOR_B(ldexp, long long, number_kind_floating_point)\n//HETERO_BINARY_OP_FUNCTOR_B(frexp, long long*, number_kind_floating_point)\nBINARY_OP_FUNCTOR(pow, number_kind_floating_point)\nBINARY_OP_FUNCTOR(fmod, number_kind_floating_point)\nBINARY_OP_FUNCTOR(fmax, number_kind_floating_point)\nBINARY_OP_FUNCTOR(fmin, number_kind_floating_point)\nBINARY_OP_FUNCTOR(atan2, number_kind_floating_point)\nBINARY_OP_FUNCTOR(fdim, number_kind_floating_point)\nBINARY_OP_FUNCTOR(hypot, number_kind_floating_point)\nBINARY_OP_FUNCTOR(remainder, number_kind_floating_point)\n\nUNARY_OP_FUNCTOR(logb, number_kind_floating_point)\nHETERO_BINARY_OP_FUNCTOR(scalbn, short, number_kind_floating_point)\nHETERO_BINARY_OP_FUNCTOR(scalbln, short, number_kind_floating_point)\nHETERO_BINARY_OP_FUNCTOR_B(scalbn, int, number_kind_floating_point)\nHETERO_BINARY_OP_FUNCTOR_B(scalbln, int, number_kind_floating_point)\nHETERO_BINARY_OP_FUNCTOR_B(scalbn, long, number_kind_floating_point)\nHETERO_BINARY_OP_FUNCTOR_B(scalbln, long, number_kind_floating_point)\nHETERO_BINARY_OP_FUNCTOR_B(scalbn, long long, number_kind_floating_point)\nHETERO_BINARY_OP_FUNCTOR_B(scalbln, long long, number_kind_floating_point)\n\n//\n// Complex functions:\n//\nUNARY_OP_FUNCTOR(exp, number_kind_complex)\nUNARY_OP_FUNCTOR(log, number_kind_complex)\nUNARY_OP_FUNCTOR(log10, number_kind_complex)\nBINARY_OP_FUNCTOR(pow, number_kind_complex)\nUNARY_OP_FUNCTOR(sqrt, number_kind_complex)\nUNARY_OP_FUNCTOR(sin, number_kind_complex)\nUNARY_OP_FUNCTOR(cos, number_kind_complex)\nUNARY_OP_FUNCTOR(tan, number_kind_complex)\nUNARY_OP_FUNCTOR(asin, number_kind_complex)\nUNARY_OP_FUNCTOR(acos, number_kind_complex)\nUNARY_OP_FUNCTOR(atan, number_kind_complex)\nUNARY_OP_FUNCTOR(sinh, number_kind_complex)\nUNARY_OP_FUNCTOR(cosh, number_kind_complex)\nUNARY_OP_FUNCTOR(tanh, number_kind_complex)\nUNARY_OP_FUNCTOR(asinh, number_kind_complex)\nUNARY_OP_FUNCTOR(acosh, number_kind_complex)\nUNARY_OP_FUNCTOR(atanh, number_kind_complex)\n\n//\n// Integer functions:\n//\nBINARY_OP_FUNCTOR(gcd, number_kind_integer)\nBINARY_OP_FUNCTOR(lcm, number_kind_integer)\nHETERO_BINARY_OP_FUNCTOR(pow, unsigned, number_kind_integer)\n\n#undef BINARY_OP_FUNCTOR\n#undef UNARY_OP_FUNCTOR\n\n//\n// ilogb:\n//\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_floating_point, typename Backend::exponent_type>::type\nilogb(const multiprecision::number<Backend, ExpressionTemplates>& val)\n{\n   using default_ops::eval_ilogb;\n   return eval_ilogb(val.backend());\n}\n\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<detail::expression<tag, A1, A2, A3, A4> >::value == number_kind_floating_point, typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type::backend_type::exponent_type>::type\nilogb(const detail::expression<tag, A1, A2, A3, A4>& val)\n{\n   using default_ops::eval_ilogb;\n   typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type arg(val);\n   return eval_ilogb(arg.backend());\n}\n\n} //namespace multiprecision\n\nnamespace math {\n//\n// Overload of Boost.Math functions that find the wrong overload when used with number:\n//\nnamespace detail {\ntemplate <class T>\nT sinc_pi_imp(T);\ntemplate <class T>\nT sinhc_pi_imp(T);\n} // namespace detail\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline multiprecision::number<Backend, ExpressionTemplates> sinc_pi(const multiprecision::number<Backend, ExpressionTemplates>& x)\n{\n   boost::multiprecision::detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(x);\n   return std::move(detail::sinc_pi_imp(x));\n}\n\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline multiprecision::number<Backend, ExpressionTemplates> sinc_pi(const multiprecision::number<Backend, ExpressionTemplates>& x, const Policy&)\n{\n   boost::multiprecision::detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(x);\n   return std::move(detail::sinc_pi_imp(x));\n}\n\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline multiprecision::number<Backend, ExpressionTemplates> sinhc_pi(const multiprecision::number<Backend, ExpressionTemplates>& x)\n{\n   boost::multiprecision::detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(x);\n   return std::move(detail::sinhc_pi_imp(x));\n}\n\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline multiprecision::number<Backend, ExpressionTemplates> sinhc_pi(const multiprecision::number<Backend, ExpressionTemplates>& x, const Policy&)\n{\n   boost::multiprecision::detail::scoped_default_precision<multiprecision::number<Backend, ExpressionTemplates> > precision_guard(x);\n   return std::move(boost::math::sinhc_pi(x));\n}\n\nusing boost::multiprecision::gcd;\nusing boost::multiprecision::lcm;\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n} // namespace math\n\nnamespace integer {\n\nusing boost::multiprecision::gcd;\nusing boost::multiprecision::lcm;\n\n} // namespace integer\n\n} // namespace boost\n\n//\n// This has to come last of all:\n//\n#include <boost/multiprecision/detail/no_et_ops.hpp>\n#include <boost/multiprecision/detail/et_ops.hpp>\n//\n// min/max overloads:\n//\n#include <boost/multiprecision/detail/min_max.hpp>\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/digits.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_DETAIL_DIGITS_HPP\n#define BOOST_MP_DETAIL_DIGITS_HPP\n\nnamespace boost { namespace multiprecision { namespace detail {\n\ninline constexpr unsigned long digits10_2_2(unsigned long d10)\n{\n   return (d10 * 1000uL) / 301uL + ((d10 * 1000uL) % 301 ? 2u : 1u);\n}\n\ninline constexpr unsigned long digits2_2_10(unsigned long d2)\n{\n   return (d2 * 301uL) / 1000uL;\n}\n\n\n#if ULONG_MAX != SIZE_MAX\n\ninline constexpr std::size_t digits10_2_2(std::size_t d10)\n{\n   return (d10 * 1000uL) / 301uL + ((d10 * 1000uL) % 301 ? 2u : 1u);\n}\n\ninline constexpr std::size_t digits2_2_10(std::size_t d2)\n{\n   return (d2 * 301uL) / 1000uL;\n}\n\ntemplate <class I>\ninline constexpr typename std::enable_if<sizeof(I) <= sizeof(unsigned long), unsigned long>::type digits10_2_2(I d10)\n{\n   return digits10_2_2(static_cast<unsigned long>(d10));\n}\n\ntemplate <class I>\ninline constexpr typename std::enable_if<sizeof(I) <= sizeof(unsigned long), unsigned long>::type digits2_2_10(I d10)\n{\n   return digits2_2_10(static_cast<unsigned long>(d10));\n}\n#endif\n\n}}} // namespace boost::multiprecision::detail\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/dynamic_array.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock.\n//  Copyright Christopher Kormanyos 2013. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n\n#ifndef BOOST_MP_DETAIL_DYNAMIC_ARRAY_HPP\n#define BOOST_MP_DETAIL_DYNAMIC_ARRAY_HPP\n\n#include <algorithm>\n#include <cstddef>\n#include <cstdint>\n#include <vector>\n\n#include <boost/multiprecision/detail/rebind.hpp>\n\nnamespace boost { namespace multiprecision { namespace backends { namespace detail {\ntemplate <class ValueType, const std::uint32_t ElemNumber, class my_allocator>\nstruct dynamic_array : public std::vector<ValueType, typename rebind<ValueType, my_allocator>::type>\n{\nprivate:\n   using base_class_type = std::vector<ValueType, typename rebind<ValueType, my_allocator>::type>;\n\npublic:\n   dynamic_array()\n      : base_class_type(static_cast<typename base_class_type::size_type>(ElemNumber),\n                        static_cast<typename base_class_type::value_type>(0u)) { }\n\n   dynamic_array(std::initializer_list<std::uint32_t> lst)\n      : base_class_type(static_cast<typename base_class_type::size_type>(ElemNumber),\n                        static_cast<typename base_class_type::value_type>(0u))\n   {\n      std::copy(lst.begin(),\n                lst.begin() + (std::min)(std::size_t(lst.size()), std::size_t(ElemNumber)),\n                data());\n   }\n\n         typename base_class_type::value_type* data()       { return &(*(this->begin())); }\n   const typename base_class_type::value_type* data() const { return &(*(this->begin())); }\n};\n}}}} // namespace boost::multiprecision::backends::detail\n\n#endif // BOOST_MP_DETAIL_DYNAMIC_ARRAY_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/empty_value.hpp",
    "content": "/////////////////////////////////////////////////////////////////////\n//  Copyright 2018 Glen Joseph Fernandes. \n//  Copyright 2021 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_DETAIL_EMPTY_VALUE_HPP\n#define BOOST_MP_DETAIL_EMPTY_VALUE_HPP\n\n#include <utility>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n\n#if defined(BOOST_GCC_VERSION) && (BOOST_GCC_VERSION >= 40700)\n#define BOOST_DETAIL_EMPTY_VALUE_BASE\n#elif defined(BOOST_INTEL) && defined(_MSC_VER) && (_MSC_VER >= 1800)\n#define BOOST_DETAIL_EMPTY_VALUE_BASE\n#elif defined(BOOST_MSVC) && (BOOST_MSVC >= 1800)\n#define BOOST_DETAIL_EMPTY_VALUE_BASE\n#elif defined(BOOST_CLANG) && !defined(__CUDACC__)\n#if __has_feature(is_empty) && __has_feature(is_final)\n#define BOOST_DETAIL_EMPTY_VALUE_BASE\n#endif\n#endif\n\nnamespace boost { namespace multiprecision { namespace detail {\n\ntemplate <typename T>\nstruct use_empty_value_base \n{\n#if defined(BOOST_DETAIL_EMPTY_VALUE_BASE)\n        static constexpr bool value = __is_empty(T) && !__is_final(T);\n#else\n        static constexpr bool value = false;\n#endif\n};\n\nstruct empty_init_t {};\n\nnamespace empty_impl {\n\ntemplate <typename T, unsigned N = 0, \n          bool E = boost::multiprecision::detail::use_empty_value_base<T>::value>\nclass empty_value\n{\nprivate:\n    T value_;\n\npublic:\n    using type = T;\n\n    empty_value() = default;\n    explicit empty_value(boost::multiprecision::detail::empty_init_t) : value_ {} {}\n\n    template <typename U, typename... Args>\n    empty_value(boost::multiprecision::detail::empty_init_t, U&& value, Args&&... args) :\n        value_ {std::forward<U>(value), std::forward<Args>(args)...} {}\n\n    const T& get() const noexcept { return value_; }\n    T& get() noexcept { return value_; }\n};\n\ntemplate <typename T, unsigned N>\nclass empty_value<T, N, true> : T\n{\npublic:\n    using type = T;\n\n    empty_value() = default;\n    explicit empty_value(boost::multiprecision::detail::empty_init_t) : T{} {}\n\n    template <typename U, typename... Args>\n    empty_value(boost::multiprecision::detail::empty_init_t, U&& value, Args&&... args) :\n        T{std::forward<U>(value), std::forward<Args>(args)...} {}\n\n    const T& get() const noexcept { return *this; }\n    T& get() noexcept { return *this; }\n};\n\n} // Namespace empty impl\n\nusing empty_impl::empty_value;\n\nBOOST_INLINE_CONSTEXPR empty_init_t empty_init = empty_init_t();\n\n}}} // Namespaces\n\n#endif // BOOST_MP_DETAIL_EMPTY_VALUE_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/endian.hpp",
    "content": "////////////////////////////////////////////////////////////////\n//  Copyright 2021 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_DETAIL_ENDIAN_HPP\n#define BOOST_MP_DETAIL_ENDIAN_HPP\n\n#include <boost/multiprecision/detail/standalone_config.hpp>\n\n#ifndef BOOST_MP_STANDALONE\n\n#  include <boost/predef/other/endian.h>\n#  define BOOST_MP_ENDIAN_BIG_BYTE BOOST_ENDIAN_BIG_BYTE\n#  define BOOST_MP_ENDIAN_LITTLE_BYTE BOOST_ENDIAN_LITTLE_BYTE\n\n#elif defined(_WIN32)\n\n#  define BOOST_MP_ENDIAN_BIG_BYTE 0\n#  define BOOST_MP_ENDIAN_LITTLE_BYTE 1\n\n#elif defined(__BYTE_ORDER__)\n\n#  define BOOST_MP_ENDIAN_BIG_BYTE (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)\n#  define BOOST_MP_ENDIAN_LITTLE_BYTE (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)\n\n#else\n#  error Could not determine endian type. Please disable standalone mode, and file an issue at https://github.com/boostorg/multiprecision\n#endif // Determine endianness\n\nstatic_assert((BOOST_MP_ENDIAN_BIG_BYTE || BOOST_MP_ENDIAN_LITTLE_BYTE)\n    && !(BOOST_MP_ENDIAN_BIG_BYTE && BOOST_MP_ENDIAN_LITTLE_BYTE),\n    \"Inconsistent endianness detected. Please disable standalone mode, and file an issue at https://github.com/boostorg/multiprecision\");\n\n#endif // BOOST_MP_DETAIL_ENDIAN_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/et_ops.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_ET_OPS_HPP\n#define BOOST_MP_ET_OPS_HPP\n\nnamespace boost { namespace multiprecision {\n\n//\n// Non-member operators for number which return expression templates.\n// \n// Note that operators taking rvalue-references DO NOT return expression templates\n// as this can lead to dangling references, see https://github.com/boostorg/multiprecision/issues/175.\n//\n// Unary operators first.\n// Note that these *must* return by value, even though that's somewhat against\n// existing practice.  The issue is that in C++11 land one could easily and legitimately\n// write:\n//    auto x = +1234_my_user_defined_suffix;\n// which would result in a dangling-reference-to-temporary if unary + returned a reference\n// to it's argument.  While return-by-value is obviously inefficient in other situations\n// the reality is that no one ever uses unary operator+ anyway...!\n//\ntemplate <class B, expression_template_option ExpressionTemplates>\ninline constexpr const number<B, ExpressionTemplates> operator+(const number<B, ExpressionTemplates>& v) { return v; }\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline constexpr const detail::expression<tag, Arg1, Arg2, Arg3, Arg4> operator+(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& v) { return v; }\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::negate, number<B, et_on> > operator-(const number<B, et_on>& v)\n{\n   static_assert(is_signed_number<B>::value, \"Negating an unsigned type results in ill-defined behavior.\");\n   return detail::expression<detail::negate, number<B, et_on> >(v);\n}\n// rvalue ops:\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR number<B, et_on> operator-(number<B, et_on>&& v)\n{\n   static_assert(is_signed_number<B>::value, \"Negating an unsigned type results in ill-defined behavior.\");\n   v.backend().negate();\n   return std::move(v);\n}\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::negate, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > operator-(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& v)\n{\n   static_assert((is_signed_number<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value), \"Negating an unsigned type results in ill-defined behavior.\");\n   return detail::expression<detail::negate, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(v);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n                            detail::expression<detail::complement_immediates, number<B, et_on> > >::type\noperator~(const number<B, et_on>& v) { return detail::expression<detail::complement_immediates, number<B, et_on> >(v); }\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n                            number<B, et_on> >::type\noperator~(number<B, et_on>&& v) \n{ \n   using default_ops::eval_complement;\n   eval_complement(v.backend(), v.backend());\n   return std::move(v);\n}\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value == number_kind_integer,\n                            detail::expression<detail::bitwise_complement, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type\noperator~(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& v) { return detail::expression<detail::bitwise_complement, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(v); }\n//\n// Then addition:\n//\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::add_immediates, number<B, et_on>, number<B, et_on> >\noperator+(const number<B, et_on>& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::add_immediates, number<B, et_on>, number<B, et_on> >(a, b);\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR number<B, et_on>\noperator+(number<B, et_on>&& a, const number<B, et_on>& b)\n{\n   using default_ops::eval_add;\n   eval_add(a.backend(), b.backend());\n   return std::move(a);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR number<B, et_on>\noperator+(const number<B, et_on>& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_add;\n   eval_add(b.backend(), a.backend());\n   return std::move(b);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR number<B, et_on>\noperator+(number<B, et_on>&& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_add;\n   eval_add(a.backend(), b.backend());\n   return std::move(a);\n}\n\ntemplate <class B, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && !is_equivalent_number_type<V, number<B, et_on> >::value, detail::expression<detail::add_immediates, number<B, et_on>, V> >::type\noperator+(const number<B, et_on>& a, const V& b)\n{\n   return detail::expression<detail::add_immediates, number<B, et_on>, V>(a, b);\n}\n\ntemplate <class B, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && !is_equivalent_number_type<V, number<B, et_on> >::value, number<B, et_on> >::type\noperator+(number<B, et_on>&& a, const V& b)\n{\n   using default_ops::eval_add;\n   eval_add(a.backend(), number<B, et_on>::canonical_value(b));\n   return std::move(a);\n}\n\ntemplate <class V, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value, detail::expression<detail::add_immediates, V, number<B, et_on> > >::type\noperator+(const V& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::add_immediates, V, number<B, et_on> >(a, b);\n}\n\ntemplate <class V, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value, number<B, et_on> >::type\noperator+(const V& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_add;\n   eval_add(b.backend(), number<B, et_on>::canonical_value(a));\n   return std::move(b);\n}\n\ntemplate <class B, expression_template_option ET, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::plus, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >\noperator+(const number<B, ET>& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::plus, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\n\ntemplate <class B, expression_template_option ET, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if< \n   std::is_same<typename detail::expression<detail::plus, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type, number<B, ET> >::value,\n   typename detail::expression<detail::plus, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type>::type\noperator+(number<B, ET>&& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   a += b;\n   return std::move(a);\n}\ntemplate <class B, expression_template_option ET, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if< \n   !std::is_same<typename detail::expression<detail::plus, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type, number<B, ET> >::value,\n   typename detail::expression<detail::plus, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type>::type\noperator+(number<B, ET>&& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::plus, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::plus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >\noperator+(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const number<B, ET>& b)\n{\n   return detail::expression<detail::plus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >(a, b);\n}\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if< \n   std::is_same<typename detail::expression<detail::plus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::plus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >::result_type>::type\noperator+(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, number<B, ET>&& b)\n{\n   b += a;\n   return std::move(b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if< \n   !std::is_same<typename detail::expression<detail::plus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::plus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >::result_type>::type\noperator+(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, number<B, ET>&& b)\n{\n   return detail::expression<detail::plus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >(a, b);\n}\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class tag2, class Arg1b, class Arg2b, class Arg3b, class Arg4b>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::plus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> >\noperator+(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b>& b)\n{\n   return detail::expression<detail::plus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value, detail::expression<detail::plus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V> >::type\noperator+(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const V& b)\n{\n   return detail::expression<detail::plus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V>(a, b);\n}\ntemplate <class V, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value, detail::expression<detail::plus, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type\noperator+(const V& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::plus, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\n//\n// Fused multiply add:\n//\ntemplate <class V, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::result_type>::value,\n                          detail::expression<detail::multiply_add, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, V> >::type\noperator+(const V& a, const detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::multiply_add, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, V>(b.left(), b.right(), a);\n}\ntemplate <class Arg1, class Arg2, class Arg3, class Arg4, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::result_type>::value,\n                          detail::expression<detail::multiply_add, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, V> >::type\noperator+(const detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>& a, const V& b)\n{\n   return detail::expression<detail::multiply_add, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, V>(a.left(), a.right(), b);\n}\ntemplate <class B, expression_template_option ET, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::multiply_add, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> >\noperator+(const number<B, ET>& a, const detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::multiply_add, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> >(b.left(), b.right(), a);\n}\n\ntemplate <class B, expression_template_option ET, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::multiply_add, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::multiply_add, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> >::result_type>::type\noperator+(number<B, ET>&& a, const detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   a += b;\n   return std::move(a);\n}\ntemplate <class B, expression_template_option ET, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::multiply_add, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::multiply_add, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> >::result_type>::type\noperator+(number<B, ET>&& a, const detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::multiply_add, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> >(b.left(), b.right(), a);\n}\n\ntemplate <class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::multiply_add, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> >\noperator+(const detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>& a, const number<B, ET>& b)\n{\n   return detail::expression<detail::multiply_add, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> >(a.left(), a.right(), b);\n}\n\ntemplate <class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::multiply_add, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::multiply_add, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> >::result_type>::type\noperator+(const detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>& a, number<B, ET>&& b)\n{\n   b += a;\n   return std::move(b);\n}\ntemplate <class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::multiply_add, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::multiply_add, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> >::result_type>::type\noperator+(const detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>& a, number<B, ET>&& b)\n{\n   return detail::expression<detail::multiply_add, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> >(a.left(), a.right(), b);\n}\n\n//\n// Fused multiply subtract:\n//\ntemplate <class V, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::result_type>::value,\n                          detail::expression<detail::negate, detail::expression<detail::multiply_subtract, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, V> > >::type\noperator-(const V& a, const detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::multiply_subtract, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, V> >(detail::expression<detail::multiply_subtract, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, V>(b.left(), b.right(), a));\n}\ntemplate <class Arg1, class Arg2, class Arg3, class Arg4, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::result_type>::value,\n                          detail::expression<detail::multiply_subtract, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, V> >::type\noperator-(const detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>& a, const V& b)\n{\n   return detail::expression<detail::multiply_subtract, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, V>(a.left(), a.right(), b);\n}\ntemplate <class B, expression_template_option ET, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::negate, detail::expression<detail::multiply_subtract, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> > >\noperator-(const number<B, ET>& a, const detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::multiply_subtract, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> > >(detail::expression<detail::multiply_subtract, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> >(b.left(), b.right(), a));\n}\n\ntemplate <class B, expression_template_option ET, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::negate, detail::expression<detail::multiply_subtract, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> > >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::negate, detail::expression<detail::multiply_subtract, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> > >::result_type>::type\noperator-(number<B, ET>&& a, const detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   a -= b;\n   return std::move(a);\n}\ntemplate <class B, expression_template_option ET, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::negate, detail::expression<detail::multiply_subtract, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> > >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::negate, detail::expression<detail::multiply_subtract, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> > >::result_type>::type\noperator-(number<B, ET>&& a, const detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::multiply_subtract, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> > >(detail::expression<detail::multiply_subtract, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> >(b.left(), b.right(), a));\n}\n\ntemplate <class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::multiply_subtract, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> >\noperator-(const detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>& a, const number<B, ET>& b)\n{\n   return detail::expression<detail::multiply_subtract, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> >(a.left(), a.right(), b);\n}\n\ntemplate <class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename detail::expression<detail::multiply_subtract, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> >::result_type\noperator-(const detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>& a, number<B, ET>&& b)\n{\n   return detail::expression<detail::multiply_subtract, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::left_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::right_type, number<B, ET> >(a.left(), a.right(), b);\n}\n\n//\n// Repeat operator for negated arguments: propagate the negation to the top level to avoid temporaries:\n//\ntemplate <class B, expression_template_option ET, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::minus, number<B, ET>, Arg1>\noperator+(const number<B, ET>& a, const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::minus, number<B, ET>, Arg1>(a, b.left_ref());\n}\n\ntemplate <class B, expression_template_option ET, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::minus, number<B, ET>, Arg1>::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::minus, number<B, ET>, Arg1>::result_type>::type\noperator+(number<B, ET>&& a, const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   a -= b.left_ref();\n   return std::move(a);\n}\ntemplate <class B, expression_template_option ET, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::minus, number<B, ET>, Arg1>::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::minus, number<B, ET>, Arg1>::result_type>::type\noperator+(number<B, ET>&& a, const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::minus, number<B, ET>, Arg1>(a, b.left_ref());\n}\n\ntemplate <class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::minus, number<B, ET>, Arg1>\noperator+(const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& a, const number<B, ET>& b)\n{\n   return detail::expression<detail::minus, number<B, ET>, Arg1>(b, a.left_ref());\n}\n\ntemplate <class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::minus, number<B, ET>, Arg1>::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::minus, number<B, ET>, Arg1>::result_type>::type\noperator+(const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& a, number<B, ET>&& b)\n{\n   b -= a.left_ref();\n   return std::move(b);\n}\ntemplate <class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::minus, number<B, ET>, Arg1>::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::minus, number<B, ET>, Arg1>::result_type>::type\noperator+(const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& a, number<B, ET>&& b)\n{\n   return detail::expression<detail::minus, number<B, ET>, Arg1>(b, a.left_ref());\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::subtract_immediates, number<B, et_on>, number<B, et_on> >\noperator+(const number<B, et_on>& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   return detail::expression<detail::subtract_immediates, number<B, et_on>, number<B, et_on> >(a, b.left_ref());\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename detail::expression<detail::subtract_immediates, number<B, et_on>, number<B, et_on> >::result_type\noperator+(number<B, et_on>&& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   using default_ops::eval_subtract;\n   eval_subtract(a.backend(), b.left_ref().backend());\n   return std::move(a);\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::subtract_immediates, number<B, et_on>, number<B, et_on> >\noperator+(const detail::expression<detail::negate, number<B, et_on> >& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::subtract_immediates, number<B, et_on>, number<B, et_on> >(b, a.left_ref());\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename detail::expression<detail::subtract_immediates, number<B, et_on>, number<B, et_on> >::result_type\noperator+(const detail::expression<detail::negate, number<B, et_on> >& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_subtract;\n   eval_subtract(b.backend(), a.left_ref().backend());\n   return std::move(b);\n}\n\ntemplate <class B, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value, detail::expression<detail::subtract_immediates, V, number<B, et_on> > >::type\noperator+(const detail::expression<detail::negate, number<B, et_on> >& a, const V& b)\n{\n   return detail::expression<detail::subtract_immediates, V, number<B, et_on> >(b, a.left_ref());\n}\ntemplate <class B, class B2, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<number<B2, ET>, number<B, et_on> >::value, detail::expression<detail::subtract_immediates, number<B2, ET>, number<B, et_on> > >::type\noperator+(const detail::expression<detail::negate, number<B, et_on> >& a, const number<B2, ET>& b)\n{\n   return detail::expression<detail::subtract_immediates, number<B2, ET>, number<B, et_on> >(b, a.left_ref());\n}\n\ntemplate <class B, class B2, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<number<B2, ET>, number<B, et_on> >::value, typename detail::expression<detail::subtract_immediates, number<B2, ET>, number<B, et_on> >::result_type>::type\noperator+(const detail::expression<detail::negate, number<B, et_on> >& a, number<B2, ET>&& b)\n{\n   return detail::expression<detail::subtract_immediates, number<B2, ET>, number<B, et_on> >(b, a.left_ref());\n}\n\ntemplate <class B2, expression_template_option ET, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<number<B2, ET>, number<B, et_on> >::value, detail::expression<detail::subtract_immediates, number<B2, ET>, number<B, et_on> > >::type\noperator+(const number<B2, ET>& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   return detail::expression<detail::subtract_immediates, number<B2, ET>, number<B, et_on> >(a, b.left_ref());\n}\n\ntemplate <class B2, expression_template_option ET, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<number<B2, ET>, number<B, et_on> >::value, typename detail::expression<detail::subtract_immediates, number<B2, ET>, number<B, et_on> >::result_type>::type\noperator+(number<B2, ET>&& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   return detail::expression<detail::subtract_immediates, number<B2, ET>, number<B, et_on> >(a, b.left_ref());\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::negate, detail::expression<detail::add_immediates, number<B, et_on>, number<B, et_on> > >\noperator+(const detail::expression<detail::negate, number<B, et_on> >& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::add_immediates, number<B, et_on>, number<B, et_on> > >(detail::expression<detail::add_immediates, number<B, et_on>, number<B, et_on> >(a.left_ref(), b.left_ref()));\n}\n//\n// Subtraction:\n//\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::subtract_immediates, number<B, et_on>, number<B, et_on> >\noperator-(const number<B, et_on>& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::subtract_immediates, number<B, et_on>, number<B, et_on> >(a, b);\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR number<B, et_on>\noperator-(number<B, et_on>&& a, const number<B, et_on>& b)\n{\n   using default_ops::eval_subtract;\n   eval_subtract(a.backend(), b.backend());\n   return std::move(a);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR number<B, et_on>\noperator-(const number<B, et_on>& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_subtract;\n   eval_subtract(b.backend(), a.backend());\n   b.backend().negate();\n   return std::move(b);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR number<B, et_on>\noperator-(number<B, et_on>&& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_subtract;\n   eval_subtract(a.backend(), b.backend());\n   return std::move(a);\n}\n\ntemplate <class B, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && !is_equivalent_number_type<V, number<B, et_on> >::value, detail::expression<detail::subtract_immediates, number<B, et_on>, V> >::type\noperator-(const number<B, et_on>& a, const V& b)\n{\n   return detail::expression<detail::subtract_immediates, number<B, et_on>, V>(a, b);\n}\n\ntemplate <class B, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && !is_equivalent_number_type<V, number<B, et_on> >::value, number<B, et_on> >::type\noperator-(number<B, et_on>&& a, const V& b)\n{\n   using default_ops::eval_subtract;\n   eval_subtract(a.backend(), number<B, et_on>::canonical_value(b));\n   return std::move(a);\n}\n\ntemplate <class V, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value, detail::expression<detail::subtract_immediates, V, number<B, et_on> > >::type\noperator-(const V& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::subtract_immediates, V, number<B, et_on> >(a, b);\n}\n\ntemplate <class V, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value, number<B, et_on> >::type\noperator-(const V& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_subtract;\n   eval_subtract(b.backend(), number<B, et_on>::canonical_value(a));\n   b.backend().negate();\n   return std::move(b);\n}\n\ntemplate <class B, expression_template_option ET, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::minus, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >\noperator-(const number<B, ET>& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::minus, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\n\ntemplate <class B, expression_template_option ET, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::minus, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::minus, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type>::type\noperator-(number<B, ET>&& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   a -= b;\n   return std::move(a);\n}\ntemplate <class B, expression_template_option ET, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::minus, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::minus, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type>::type\noperator-(number<B, ET>&& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::minus, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::minus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >\noperator-(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const number<B, ET>& b)\n{\n   return detail::expression<detail::minus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >(a, b);\n}\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::minus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::minus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >::result_type>::type\noperator-(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, number<B, ET>&& b)\n{\n   b -= a;\n   b.backend().negate();\n   return std::move(b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::minus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::minus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >::result_type>::type\noperator-(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, number<B, ET>&& b)\n{\n   return detail::expression<detail::minus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >(a, b);\n}\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class tag2, class Arg1b, class Arg2b, class Arg3b, class Arg4b>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::minus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> >\noperator-(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b>& b)\n{\n   return detail::expression<detail::minus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value, detail::expression<detail::minus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V> >::type\noperator-(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const V& b)\n{\n   return detail::expression<detail::minus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V>(a, b);\n}\ntemplate <class V, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value, detail::expression<detail::minus, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type\noperator-(const V& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::minus, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\n//\n// Repeat operator for negated arguments: propagate the negation to the top level to avoid temporaries:\n//\ntemplate <class B, expression_template_option ET, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::plus, number<B, ET>, Arg1>\noperator-(const number<B, ET>& a, const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::plus, number<B, ET>, Arg1>(a, b.left_ref());\n}\n\ntemplate <class B, expression_template_option ET, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::plus, number<B, ET>, Arg1>::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::plus, number<B, ET>, Arg1>::result_type>::type\noperator-(number<B, ET>&& a, const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   a += b.left_ref();\n   return std::move(a);\n}\ntemplate <class B, expression_template_option ET, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::plus, number<B, ET>, Arg1>::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::plus, number<B, ET>, Arg1>::result_type>::type\noperator-(number<B, ET>&& a, const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::plus, number<B, ET>, Arg1>(a, b.left_ref());\n}\n\ntemplate <class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::negate, detail::expression<detail::plus, number<B, ET>, Arg1> >\noperator-(const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& a, const number<B, ET>& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::plus, number<B, ET>, Arg1> >(\n       detail::expression<detail::plus, number<B, ET>, Arg1>(b, a.left_ref()));\n}\n\ntemplate <class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::negate, detail::expression<detail::plus, number<B, ET>, Arg1> >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::negate, detail::expression<detail::plus, number<B, ET>, Arg1> >::result_type>::type\noperator-(const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& a, number<B, ET>&& b)\n{\n   b += a.left_ref();\n   b.backend().negate();\n   return std::move(b);\n}\ntemplate <class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::negate, detail::expression<detail::plus, number<B, ET>, Arg1> >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::negate, detail::expression<detail::plus, number<B, ET>, Arg1> >::result_type>::type\noperator-(const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& a, number<B, ET>&& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::plus, number<B, ET>, Arg1> >(detail::expression<detail::plus, number<B, ET>, Arg1>(b, a.left_ref()));\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::add_immediates, number<B, et_on>, number<B, et_on> >\noperator-(const number<B, et_on>& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   return detail::expression<detail::add_immediates, number<B, et_on>, number<B, et_on> >(a, b.left_ref());\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename detail::expression<detail::add_immediates, number<B, et_on>, number<B, et_on> >::result_type\noperator-(number<B, et_on>&& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   using default_ops::eval_add;\n   eval_add(a.backend(), b.left_ref().backend());\n   return std::move(a);\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::negate, detail::expression<detail::add_immediates, number<B, et_on>, number<B, et_on> > >\noperator-(const detail::expression<detail::negate, number<B, et_on> >& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::add_immediates, number<B, et_on>, number<B, et_on> > >(\n       detail::expression<detail::add_immediates, number<B, et_on>, number<B, et_on> >(b, a.left_ref()));\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::negate, detail::expression<detail::add_immediates, number<B, et_on>, number<B, et_on> > >::result_type, number<B, et_on>>::value,\n   typename detail::expression<detail::negate, detail::expression<detail::add_immediates, number<B, et_on>, number<B, et_on> > >::result_type>::type\noperator-(const detail::expression<detail::negate, number<B, et_on> >& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_add;\n   eval_add(b.backend(), a.left_ref().backend());\n   b.backend().negate();\n   return std::move(b);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::negate, detail::expression<detail::add_immediates, number<B, et_on>, number<B, et_on> > >::result_type, number<B, et_on>>::value,\n   typename detail::expression<detail::negate, detail::expression<detail::add_immediates, number<B, et_on>, number<B, et_on> > >::result_type>::type\noperator-(const detail::expression<detail::negate, number<B, et_on> >& a, number<B, et_on>&& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::add_immediates, number<B, et_on>, number<B, et_on> > >(\n         detail::expression<detail::add_immediates, number<B, et_on>, number<B, et_on> >(b, a.left_ref()));\n}\n\ntemplate <class B, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value, detail::expression<detail::negate, detail::expression<detail::add_immediates, number<B, et_on>, V> > >::type\noperator-(const detail::expression<detail::negate, number<B, et_on> >& a, const V& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::add_immediates, number<B, et_on>, V> >(detail::expression<detail::add_immediates, number<B, et_on>, V>(a.left_ref(), b));\n}\ntemplate <class B, class B2, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<number<B2, ET>, number<B, et_on> >::value, detail::expression<detail::negate, detail::expression<detail::add_immediates, number<B, et_on>, number<B2, ET> > > >::type\noperator-(const detail::expression<detail::negate, number<B, et_on> >& a, const number<B2, ET>& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::add_immediates, number<B, et_on>, number<B2, ET> > >(detail::expression<detail::add_immediates, number<B, et_on>, number<B2, ET> >(a.left_ref(), b));\n}\n\ntemplate <class B, class B2, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<number<B2, ET>, number<B, et_on> >::value, typename detail::expression<detail::negate, detail::expression<detail::add_immediates, number<B, et_on>, number<B2, ET> > >::result_type>::type\noperator-(const detail::expression<detail::negate, number<B, et_on> >& a, number<B2, ET>&& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::add_immediates, number<B, et_on>, number<B2, ET> > >(detail::expression<detail::add_immediates, number<B, et_on>, number<B2, ET> >(a.left_ref(), b));\n}\n\ntemplate <class V, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value, detail::expression<detail::add_immediates, V, number<B, et_on> > >::type\noperator-(const V& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   return detail::expression<detail::add_immediates, V, number<B, et_on> >(a, b.left_ref());\n}\ntemplate <class B2, expression_template_option ET, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<number<B2, ET>, number<B, et_on> >::value, detail::expression<detail::add_immediates, number<B2, ET>, number<B, et_on> > >::type\noperator-(const number<B2, ET>& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   return detail::expression<detail::add_immediates, number<B2, ET>, number<B, et_on> >(a, b.left_ref());\n}\n\ntemplate <class B2, expression_template_option ET, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<number<B2, ET>, number<B, et_on> >::value, typename detail::expression<detail::add_immediates, number<B2, ET>, number<B, et_on> >::result_type>::type\noperator-(number<B2, ET>&& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   return detail::expression<detail::add_immediates, number<B2, ET>, number<B, et_on> >(a, b.left_ref());\n}\n\n//\n// Multiplication:\n//\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::multiply_immediates, number<B, et_on>, number<B, et_on> >\noperator*(const number<B, et_on>& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::multiply_immediates, number<B, et_on>, number<B, et_on> >(a, b);\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR number<B, et_on>\noperator*(number<B, et_on>&& a, const number<B, et_on>& b)\n{\n   using default_ops::eval_multiply;\n   eval_multiply(a.backend(), b.backend());\n   return std::move(a);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR number<B, et_on>\noperator*(const number<B, et_on>& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_multiply;\n   eval_multiply(b.backend(), a.backend());\n   return std::move(b);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR number<B, et_on>\noperator*(number<B, et_on>&& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_multiply;\n   eval_multiply(a.backend(), b.backend());\n   return std::move(a);\n}\n\ntemplate <class B, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && !is_equivalent_number_type<V, number<B, et_on> >::value, detail::expression<detail::multiply_immediates, number<B, et_on>, V> >::type\noperator*(const number<B, et_on>& a, const V& b)\n{\n   return detail::expression<detail::multiply_immediates, number<B, et_on>, V>(a, b);\n}\n\ntemplate <class B, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && !is_equivalent_number_type<V, number<B, et_on> >::value, number<B, et_on> >::type\noperator*(number<B, et_on>&& a, const V& b)\n{\n   using default_ops::eval_multiply;\n   eval_multiply(a.backend(), number<B, et_on>::canonical_value(b));\n   return std::move(a);\n}\n\ntemplate <class V, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value, detail::expression<detail::multiply_immediates, V, number<B, et_on> > >::type\noperator*(const V& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::multiply_immediates, V, number<B, et_on> >(a, b);\n}\n\ntemplate <class V, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value, number<B, et_on> >::type\noperator*(const V& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_multiply;\n   eval_multiply(b.backend(), number<B, et_on>::canonical_value(a));\n   return std::move(b);\n}\n\ntemplate <class B, expression_template_option ET, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::multiplies, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >\noperator*(const number<B, ET>& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::multiplies, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\n\ntemplate <class B, expression_template_option ET, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::multiplies, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::multiplies, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type>::type\noperator*(number<B, ET>&& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   a *= b;\n   return std::move(a);\n}\ntemplate <class B, expression_template_option ET, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::multiplies, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::multiplies, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type>::type\noperator*(number<B, ET>&& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::multiplies, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::multiplies, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >\noperator*(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const number<B, ET>& b)\n{\n   return detail::expression<detail::multiplies, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >(a, b);\n}\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::multiplies, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::multiplies, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >::result_type>::type\noperator*(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, number<B, ET>&& b)\n{\n   b *= a;\n   return std::move(b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::multiplies, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::multiplies, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >::result_type>::type\noperator*(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, number<B, ET>&& b)\n{\n   return detail::expression<detail::multiplies, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >(a, b);\n}\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class tag2, class Arg1b, class Arg2b, class Arg3b, class Arg4b>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::multiplies, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> >\noperator*(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b>& b)\n{\n   return detail::expression<detail::multiplies, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value, detail::expression<detail::multiplies, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V> >::type\noperator*(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const V& b)\n{\n   return detail::expression<detail::multiplies, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V>(a, b);\n}\ntemplate <class V, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value, detail::expression<detail::multiplies, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type\noperator*(const V& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::multiplies, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\n//\n// Repeat operator for negated arguments: propagate the negation to the top level to avoid temporaries:\n//\ntemplate <class B, expression_template_option ET, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::negate, detail::expression<detail::multiplies, number<B, ET>, Arg1> >\noperator*(const number<B, ET>& a, const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::multiplies, number<B, ET>, Arg1> >(\n       detail::expression<detail::multiplies, number<B, ET>, Arg1>(a, b.left_ref()));\n}\n\ntemplate <class B, expression_template_option ET, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename detail::expression<detail::negate, detail::expression<detail::multiplies, number<B, ET>, Arg1> >::result_type\noperator*(number<B, ET>&& a, const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::multiplies, number<B, ET>, Arg1> >(\n       detail::expression<detail::multiplies, number<B, ET>, Arg1>(a, b.left_ref()));\n}\n\ntemplate <class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::negate, detail::expression<detail::multiplies, number<B, ET>, Arg1> >\noperator*(const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& a, const number<B, ET>& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::multiplies, number<B, ET>, Arg1> >(\n       detail::expression<detail::multiplies, number<B, ET>, Arg1>(b, a.left_ref()));\n}\n\ntemplate <class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename detail::expression<detail::negate, detail::expression<detail::multiplies, number<B, ET>, Arg1> >::result_type\noperator*(const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& a, number<B, ET>&& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::multiplies, number<B, ET>, Arg1> >(\n       detail::expression<detail::multiplies, number<B, ET>, Arg1>(b, a.left_ref()));\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B, et_on> > >\noperator*(const number<B, et_on>& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B, et_on> > >(\n       detail::expression<detail::multiply_immediates, number<B, et_on>, number<B, et_on> >(a, b.left_ref()));\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B, et_on> > >::result_type, number<B, et_on>>::value,\n   typename detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B, et_on> > >::result_type>::type\noperator*(number<B, et_on>&& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   a *= b.left_ref();\n   a.backend().negate();\n   return std::move(a);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B, et_on> > >::result_type, number<B, et_on>>::value,\n   typename detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B, et_on> > >::result_type>::type\noperator*(number<B, et_on>&& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B, et_on> > >(\n         detail::expression<detail::multiply_immediates, number<B, et_on>, number<B, et_on> >(a, b.left_ref()));\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B, et_on> > >\noperator*(const detail::expression<detail::negate, number<B, et_on> >& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B, et_on> > >(\n       detail::expression<detail::multiply_immediates, number<B, et_on>, number<B, et_on> >(b, a.left_ref()));\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B, et_on> > >::result_type, number<B, et_on>>::value,\n   typename detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B, et_on> > >::result_type>::type\noperator*(const detail::expression<detail::negate, number<B, et_on> >& a, number<B, et_on>&& b)\n{\n   b *= a.left_ref();\n   b.backend().negate();\n   return std::move(b);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B, et_on> > >::result_type, number<B, et_on>>::value,\n   typename detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B, et_on> > >::result_type>::type\noperator*(const detail::expression<detail::negate, number<B, et_on> >& a, number<B, et_on>&& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B, et_on> > >(\n         detail::expression<detail::multiply_immediates, number<B, et_on>, number<B, et_on> >(b, a.left_ref()));\n}\n\ntemplate <class B, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value, detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, V> > >::type\noperator*(const detail::expression<detail::negate, number<B, et_on> >& a, const V& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, V> >(\n       detail::expression<detail::multiply_immediates, number<B, et_on>, V>(a.left_ref(), b));\n}\ntemplate <class B, class B2, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<number<B2, ET>, number<B, et_on> >::value, detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B2, ET> > > >::type\noperator*(const detail::expression<detail::negate, number<B, et_on> >& a, const number<B2, ET>& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B2, ET> > >(\n       detail::expression<detail::multiply_immediates, number<B, et_on>, number<B2, ET> >(a.left_ref(), b));\n}\n\ntemplate <class B, class B2, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<number<B2, ET>, number<B, et_on> >::value, typename detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B2, ET> > >::result_type>::type\noperator*(const detail::expression<detail::negate, number<B, et_on> >& a, number<B2, ET>&& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B2, ET> > >(\n       detail::expression<detail::multiply_immediates, number<B, et_on>, number<B2, ET> >(a.left_ref(), b));\n}\n\ntemplate <class V, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value, detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, V> > >::type\noperator*(const V& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, V> >(\n       detail::expression<detail::multiply_immediates, number<B, et_on>, V>(b.left_ref(), a));\n}\ntemplate <class B2, expression_template_option ET, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<number<B2, ET>, number<B, et_on> >::value, detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B2, ET> > > >::type\noperator*(const number<B2, ET>& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B2, ET> > >(\n       detail::expression<detail::multiply_immediates, number<B, et_on>, number<B2, ET> >(b.left_ref(), a));\n}\n\ntemplate <class B2, expression_template_option ET, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<number<B2, ET>, number<B, et_on> >::value, typename detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B2, ET> > >::result_type>::type\noperator*(number<B2, ET>&& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, et_on>, number<B2, ET> > >(\n       detail::expression<detail::multiply_immediates, number<B, et_on>, number<B2, ET> >(b.left_ref(), a));\n}\n\n//\n// Division:\n//\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::divide_immediates, number<B, et_on>, number<B, et_on> >\noperator/(const number<B, et_on>& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::divide_immediates, number<B, et_on>, number<B, et_on> >(a, b);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR number<B, et_on>\noperator/(number<B, et_on>&& a, const number<B, et_on>& b)\n{\n   using default_ops::eval_divide;\n   eval_divide(a.backend(), b.backend());\n   return std::move(a);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR number<B, et_on>\noperator/(const number<B, et_on>& a, number<B, et_on>&& b)\n{\n   return detail::expression<detail::divide_immediates, number<B, et_on>, number<B, et_on> >(a, b);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR number<B, et_on>\noperator/(number<B, et_on>&& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_divide;\n   eval_divide(a.backend(), b.backend());\n   return std::move(a);\n}\ntemplate <class B, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && !is_equivalent_number_type<V, number<B, et_on> >::value, detail::expression<detail::divide_immediates, number<B, et_on>, V> >::type\noperator/(const number<B, et_on>& a, const V& b)\n{\n   return detail::expression<detail::divide_immediates, number<B, et_on>, V>(a, b);\n}\ntemplate <class B, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && !is_equivalent_number_type<V, number<B, et_on> >::value, number<B, et_on> >::type\noperator/(number<B, et_on>&& a, const V& b)\n{\n   using default_ops::eval_divide;\n   eval_divide(a.backend(), number<B, et_on>::canonical_value(b));\n   return std::move(a);\n}\ntemplate <class V, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value, detail::expression<detail::divide_immediates, V, number<B, et_on> > >::type\noperator/(const V& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::divide_immediates, V, number<B, et_on> >(a, b);\n}\ntemplate <class V, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value, number<B, et_on> >::type\noperator/(const V& a, number<B, et_on>&& b)\n{\n   return detail::expression<detail::divide_immediates, V, number<B, et_on> >(a, b);\n}\ntemplate <class B, expression_template_option ET, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::divides, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >\noperator/(const number<B, ET>& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::divides, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\ntemplate <class B, expression_template_option ET, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::divides, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::divides, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type>::type\noperator/(number<B, ET>&& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   a /= b;\n   return std::move(a);\n}\ntemplate <class B, expression_template_option ET, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::divides, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::divides, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type>::type\noperator/(number<B, ET>&& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::divides, number<B, ET>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::divides, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >\noperator/(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const number<B, ET>& b)\n{\n   return detail::expression<detail::divides, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename detail::expression<detail::divides, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >::result_type\noperator/(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, number<B, ET>&& b)\n{\n   return detail::expression<detail::divides, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class tag2, class Arg1b, class Arg2b, class Arg3b, class Arg4b>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::divides, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> >\noperator/(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b>& b)\n{\n   return detail::expression<detail::divides, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value, detail::expression<detail::divides, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V> >::type\noperator/(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const V& b)\n{\n   return detail::expression<detail::divides, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V>(a, b);\n}\ntemplate <class V, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value, detail::expression<detail::divides, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type\noperator/(const V& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::divides, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\n//\n// Repeat operator for negated arguments: propagate the negation to the top level to avoid temporaries:\n//\ntemplate <class B, expression_template_option ET, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::negate, detail::expression<detail::divides, number<B, ET>, Arg1> >\noperator/(const number<B, ET>& a, const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::divides, number<B, ET>, Arg1> >(\n       detail::expression<detail::divides, number<B, ET>, Arg1>(a, b.left_ref()));\n}\ntemplate <class B, expression_template_option ET, class Arg1, class Arg2, class Arg3, class Arg4>\ninline typename std::enable_if<\n   std::is_same<typename detail::expression<detail::negate, detail::expression<detail::divides, number<B, ET>, Arg1> >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::negate, detail::expression<detail::divides, number<B, ET>, Arg1> >::result_type>::type\noperator/(number<B, ET>&& a, const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   a /= b.left_ref();\n   a.backend().negate();\n   return std::move(a);\n}\ntemplate <class B, expression_template_option ET, class Arg1, class Arg2, class Arg3, class Arg4>\ninline typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::negate, detail::expression<detail::divides, number<B, ET>, Arg1> >::result_type, number<B, ET>>::value,\n   typename detail::expression<detail::negate, detail::expression<detail::divides, number<B, ET>, Arg1> >::result_type>::type\noperator/(number<B, ET>&& a, const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::divides, number<B, ET>, Arg1> >(\n         detail::expression<detail::divides, number<B, ET>, Arg1>(a, b.left_ref()));\n}\ntemplate <class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::negate, detail::expression<detail::divides, Arg1, number<B, ET> > >\noperator/(const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& a, const number<B, ET>& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::divides, Arg1, number<B, ET> > >(\n       detail::expression<detail::divides, Arg1, number<B, ET> >(a.left_ref(), b));\n}\ntemplate <class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename detail::expression<detail::negate, detail::expression<detail::divides, Arg1, number<B, ET> > >::result_type\noperator/(const detail::expression<detail::negate, Arg1, Arg2, Arg3, Arg4>& a, number<B, ET>&& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::divides, Arg1, number<B, ET> > >(\n       detail::expression<detail::divides, Arg1, number<B, ET> >(a.left_ref(), b));\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::negate, detail::expression<detail::divide_immediates, number<B, et_on>, number<B, et_on> > >\noperator/(const number<B, et_on>& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::divide_immediates, number<B, et_on>, number<B, et_on> > >(\n       detail::expression<detail::divide_immediates, number<B, et_on>, number<B, et_on> >(a, b.left_ref()));\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename detail::expression<detail::negate, detail::expression<detail::divide_immediates, number<B, et_on>, number<B, et_on> > >::result_type\noperator/(number<B, et_on>&& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   a /= b.left_ref();\n   a.backend().negate();\n   return std::move(a);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR detail::expression<detail::negate, detail::expression<detail::divide_immediates, number<B, et_on>, number<B, et_on> > >\noperator/(const detail::expression<detail::negate, number<B, et_on> >& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::divide_immediates, number<B, et_on>, number<B, et_on> > >(\n       detail::expression<detail::divide_immediates, number<B, et_on>, number<B, et_on> >(a.left_ref(), b));\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename detail::expression<detail::negate, detail::expression<detail::divide_immediates, number<B, et_on>, number<B, et_on> > >::result_type\noperator/(const detail::expression<detail::negate, number<B, et_on> >& a, number<B, et_on>&& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::divide_immediates, number<B, et_on>, number<B, et_on> > >(\n       detail::expression<detail::divide_immediates, number<B, et_on>, number<B, et_on> >(a.left_ref(), b));\n}\ntemplate <class B, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value, detail::expression<detail::negate, detail::expression<detail::divide_immediates, number<B, et_on>, V> > >::type\noperator/(const detail::expression<detail::negate, number<B, et_on> >& a, const V& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::divide_immediates, number<B, et_on>, V> >(\n       detail::expression<detail::divide_immediates, number<B, et_on>, V>(a.left_ref(), b));\n}\ntemplate <class B, class B2, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<number<B2, ET>, number<B, et_on> >::value, detail::expression<detail::negate, detail::expression<detail::divide_immediates, number<B, et_on>, number<B2, ET> > > >::type\noperator/(const detail::expression<detail::negate, number<B, et_on> >& a, const number<B2, ET>& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::divide_immediates, number<B, et_on>, number<B2, ET> > >(\n       detail::expression<detail::divide_immediates, number<B, et_on>, number<B2, ET> >(a.left_ref(), b));\n}\ntemplate <class B, class B2, expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<number<B2, ET>, number<B, et_on> >::value, typename detail::expression<detail::negate, detail::expression<detail::divide_immediates, number<B, et_on>, number<B2, ET> > >::result_type>::type\noperator/(const detail::expression<detail::negate, number<B, et_on> >& a, number<B2, ET>&& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::divide_immediates, number<B, et_on>, number<B2, ET> > >(\n       detail::expression<detail::divide_immediates, number<B, et_on>, number<B2, ET> >(a.left_ref(), b));\n}\ntemplate <class V, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value, detail::expression<detail::negate, detail::expression<detail::divide_immediates, V, number<B, et_on> > > >::type\noperator/(const V& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::divide_immediates, V, number<B, et_on> > >(\n       detail::expression<detail::divide_immediates, V, number<B, et_on> >(a, b.left_ref()));\n}\ntemplate <class B2, expression_template_option ET, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<number<B2, ET>, number<B, et_on> >::value, detail::expression<detail::negate, detail::expression<detail::divide_immediates, number<B2, ET>, number<B, et_on> > > >::type\noperator/(const number<B2, ET>& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::divide_immediates, number<B2, ET>, number<B, et_on> > >(\n       detail::expression<detail::divide_immediates, number<B2, ET>, number<B, et_on> >(a, b.left_ref()));\n}\ntemplate <class B2, expression_template_option ET, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<number<B2, ET>, typename detail::expression<detail::negate, detail::expression<detail::divide_immediates, number<B2, ET>, number<B, et_on> > >::result_type>::value, number<B, et_on> >::type\noperator/(number<B2, ET>&& a, const detail::expression<detail::negate, number<B, et_on> >& b)\n{\n   return detail::expression<detail::negate, detail::expression<detail::divide_immediates, number<B2, ET>, number<B, et_on> > >(\n       detail::expression<detail::divide_immediates, number<B2, ET>, number<B, et_on> >(a, b.left_ref()));\n}\n//\n// Modulus:\n//\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n                            detail::expression<detail::modulus_immediates, number<B, et_on>, number<B, et_on> > >::type\noperator%(const number<B, et_on>& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::modulus_immediates, number<B, et_on>, number<B, et_on> >(a, b);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n   number<B, et_on> >::type\noperator%(number<B, et_on>&& a, const number<B, et_on>& b)\n{\n   using default_ops::eval_modulus;\n   eval_modulus(a.backend(), b.backend());\n   return std::move(a);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n   number<B, et_on> >::type\noperator%(const number<B, et_on>& a, number<B, et_on>&& b)\n{\n   return detail::expression<detail::modulus_immediates, number<B, et_on>, number<B, et_on> >(a, b);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n   number<B, et_on> >::type\noperator%(number<B, et_on>&& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_modulus;\n   eval_modulus(a.backend(), b.backend());\n   return std::move(a);\n}\ntemplate <class B, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && (number_category<B>::value == number_kind_integer) && !is_equivalent_number_type<V, number<B, et_on> >::value,\n                            detail::expression<detail::modulus_immediates, number<B, et_on>, V> >::type\noperator%(const number<B, et_on>& a, const V& b)\n{\n   return detail::expression<detail::modulus_immediates, number<B, et_on>, V>(a, b);\n}\ntemplate <class B, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && (number_category<B>::value == number_kind_integer) && !is_equivalent_number_type<V, number<B, et_on> >::value,\n   number<B, et_on> >::type\noperator%(number<B, et_on>&& a, const V& b)\n{\n   using default_ops::eval_modulus;\n   eval_modulus(a.backend(), number<B, et_on>::canonical_value(b));\n   return std::move(a);\n}\ntemplate <class V, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && (number_category<B>::value == number_kind_integer),\n                            detail::expression<detail::modulus_immediates, V, number<B, et_on> > >::type\noperator%(const V& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::modulus_immediates, V, number<B, et_on> >(a, b);\n}\ntemplate <class V, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && (number_category<B>::value == number_kind_integer),\n   number<B, et_on> >::type\noperator%(const V& a, number<B, et_on>&& b)\n{\n   return detail::expression<detail::modulus_immediates, V, number<B, et_on> >(a, b);\n}\ntemplate <class B, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n                            detail::expression<detail::modulus, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type\noperator%(const number<B, et_on>& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::modulus, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\ntemplate <class B, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::modulus, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type, number<B, et_on>>::value \n   && number_category<B>::value == number_kind_integer,\n   typename detail::expression<detail::modulus, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type >::type\noperator%(number<B, et_on>&& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   a %= b;\n   return std::move(a);\n}\ntemplate <class B, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::modulus, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type, number<B, et_on>>::value \n   && number_category<B>::value == number_kind_integer,\n   typename detail::expression<detail::modulus, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type >::type\noperator%(number<B, et_on>&& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::modulus, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n                            detail::expression<detail::modulus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> > >::type\noperator%(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::modulus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n   typename detail::expression<detail::modulus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >::result_type >::type\noperator%(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, number<B, et_on>&& b)\n{\n   return detail::expression<detail::modulus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class tag2, class Arg1b, class Arg2b, class Arg3b, class Arg4b>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value == number_kind_integer,\n                            detail::expression<detail::modulus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> > >::type\noperator%(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b>& b)\n{\n   return detail::expression<detail::modulus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value && (number_category<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value == number_kind_integer),\n                            detail::expression<detail::modulus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V> >::type\noperator%(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const V& b)\n{\n   return detail::expression<detail::modulus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V>(a, b);\n}\ntemplate <class V, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value && (number_category<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value == number_kind_integer),\n                            detail::expression<detail::modulus, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type\noperator%(const V& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::modulus, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\n//\n// Left shift:\n//\ntemplate <class B, class I>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<I>::value && (number_category<B>::value == number_kind_integer), detail::expression<detail::shift_left, number<B, et_on>, I> >::type\noperator<<(const number<B, et_on>& a, const I& b)\n{\n   return detail::expression<detail::shift_left, number<B, et_on>, I>(a, b);\n}\ntemplate <class B, class I>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<I>::value && (number_category<B>::value == number_kind_integer), number<B, et_on> >::type\noperator<<(number<B, et_on>&& a, const I& b)\n{\n   using default_ops::eval_left_shift;\n   eval_left_shift(a.backend(), b);\n   return std::move(a);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class I>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<I>::value && (number_category<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value == number_kind_integer),\n                            detail::expression<detail::shift_left, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, I> >::type\noperator<<(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const I& b)\n{\n   return detail::expression<detail::shift_left, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, I>(a, b);\n}\n//\n// Right shift:\n//\ntemplate <class B, class I>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<I>::value && (number_category<B>::value == number_kind_integer),\n                            detail::expression<detail::shift_right, number<B, et_on>, I> >::type\noperator>>(const number<B, et_on>& a, const I& b)\n{\n   return detail::expression<detail::shift_right, number<B, et_on>, I>(a, b);\n}\ntemplate <class B, class I>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<I>::value && (number_category<B>::value == number_kind_integer),\n   number<B, et_on> >::type\noperator>>(number<B, et_on>&& a, const I& b)\n{\n   using default_ops::eval_right_shift;\n   eval_right_shift(a.backend(), b);\n   return std::move(a);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class I>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<I>::value && (number_category<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value == number_kind_integer),\n                            detail::expression<detail::shift_right, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, I> >::type\noperator>>(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const I& b)\n{\n   return detail::expression<detail::shift_right, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, I>(a, b);\n}\n//\n// Bitwise AND:\n//\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n                            detail::expression<detail::bitwise_and_immediates, number<B, et_on>, number<B, et_on> > >::type\noperator&(const number<B, et_on>& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::bitwise_and_immediates, number<B, et_on>, number<B, et_on> >(a, b);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n   number<B, et_on> >::type\noperator&(number<B, et_on>&& a, const number<B, et_on>& b)\n{\n   using default_ops::eval_bitwise_and;\n   eval_bitwise_and(a.backend(), b.backend());\n   return std::move(a);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n   number<B, et_on> >::type\noperator&(const number<B, et_on>& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_bitwise_and;\n   eval_bitwise_and(b.backend(), a.backend());\n   return std::move(b);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n   number<B, et_on> >::type\noperator&(number<B, et_on>&& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_bitwise_and;\n   eval_bitwise_and(a.backend(), b.backend());\n   return std::move(a);\n}\ntemplate <class B, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && (number_category<B>::value == number_kind_integer),\n                            detail::expression<detail::bitwise_and_immediates, number<B, et_on>, V> >::type\noperator&(const number<B, et_on>& a, const V& b)\n{\n   return detail::expression<detail::bitwise_and_immediates, number<B, et_on>, V>(a, b);\n}\ntemplate <class B, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && (number_category<B>::value == number_kind_integer),\n   number<B, et_on> >::type\noperator&(number<B, et_on>&& a, const V& b)\n{\n   using default_ops::eval_bitwise_and;\n   eval_bitwise_and(a.backend(), number<B, et_on>::canonical_value(b));\n   return std::move(a);\n}\ntemplate <class V, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && (number_category<B>::value == number_kind_integer),\n                            detail::expression<detail::bitwise_and_immediates, V, number<B, et_on> > >::type\noperator&(const V& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::bitwise_and_immediates, V, number<B, et_on> >(a, b);\n}\ntemplate <class V, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && (number_category<B>::value == number_kind_integer),\n   number<B, et_on> >::type\noperator&(const V& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_bitwise_and;\n   eval_bitwise_and(b.backend(), number<B, et_on>::canonical_value(a));\n   return std::move(b);\n}\ntemplate <class B, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n                            detail::expression<detail::bitwise_and, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type\noperator&(const number<B, et_on>& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::bitwise_and, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\ntemplate <class B, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::bitwise_and, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type, number<B, et_on>>::value\n   && number_category<B>::value == number_kind_integer,\n   typename detail::expression<detail::bitwise_and, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type >::type\noperator&(number<B, et_on>&& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   a &= b;\n   return std::move(a);\n}\ntemplate <class B, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::bitwise_and, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type, number<B, et_on>>::value\n   && number_category<B>::value == number_kind_integer,\n   typename detail::expression<detail::bitwise_and, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type >::type\noperator&(number<B, et_on>&& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::bitwise_and, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n                            detail::expression<detail::bitwise_and, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> > >::type\noperator&(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::bitwise_and, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::bitwise_and, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >::result_type, number<B, et_on>>::value\n   && number_category<B>::value == number_kind_integer,\n   typename detail::expression<detail::bitwise_and, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >::result_type >::type\noperator&(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, number<B, et_on>&& b)\n{\n   b &= a;\n   return std::move(b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::bitwise_and, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >::result_type, number<B, et_on>>::value\n   && number_category<B>::value == number_kind_integer,\n   typename detail::expression<detail::bitwise_and, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >::result_type >::type\noperator&(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, number<B, et_on>&& b)\n{\n   return detail::expression<detail::bitwise_and, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class tag2, class Arg1b, class Arg2b, class Arg3b, class Arg4b>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value == number_kind_integer,\n                            detail::expression<detail::bitwise_and, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> > >::type\noperator&(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b>& b)\n{\n   return detail::expression<detail::bitwise_and, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value && (number_category<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value == number_kind_integer),\n                            detail::expression<detail::bitwise_and, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V> >::type\noperator&(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const V& b)\n{\n   return detail::expression<detail::bitwise_and, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V>(a, b);\n}\ntemplate <class V, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value && (number_category<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value == number_kind_integer),\n                            detail::expression<detail::bitwise_and, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type\noperator&(const V& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::bitwise_and, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\n//\n// Bitwise OR:\n//\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n                            detail::expression<detail::bitwise_or_immediates, number<B, et_on>, number<B, et_on> > >::type\noperator|(const number<B, et_on>& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::bitwise_or_immediates, number<B, et_on>, number<B, et_on> >(a, b);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n   number<B, et_on> >::type\noperator|(number<B, et_on>&& a, const number<B, et_on>& b)\n{\n   using default_ops::eval_bitwise_or;\n   eval_bitwise_or(a.backend(), b.backend());\n   return std::move(a);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n   number<B, et_on> >::type\noperator|(const number<B, et_on>& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_bitwise_or;\n   eval_bitwise_or(b.backend(), a.backend());\n   return std::move(b);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n   number<B, et_on> >::type\noperator|(number<B, et_on>&& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_bitwise_or;\n   eval_bitwise_or(a.backend(), b.backend());\n   return std::move(a);\n}\ntemplate <class B, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && (number_category<B>::value == number_kind_integer),\n                            detail::expression<detail::bitwise_or_immediates, number<B, et_on>, V> >::type\noperator|(const number<B, et_on>& a, const V& b)\n{\n   return detail::expression<detail::bitwise_or_immediates, number<B, et_on>, V>(a, b);\n}\ntemplate <class B, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && (number_category<B>::value == number_kind_integer),\n   number<B, et_on> >::type\noperator|(number<B, et_on>&& a, const V& b)\n{\n   using default_ops::eval_bitwise_or;\n   eval_bitwise_or(a.backend(), number<B, et_on>::canonical_value(b));\n   return std::move(a);\n}\ntemplate <class V, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && (number_category<B>::value == number_kind_integer),\n                            detail::expression<detail::bitwise_or_immediates, V, number<B, et_on> > >::type\noperator|(const V& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::bitwise_or_immediates, V, number<B, et_on> >(a, b);\n}\ntemplate <class V, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && (number_category<B>::value == number_kind_integer),\n   number<B, et_on> >::type\noperator|(const V& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_bitwise_or;\n   eval_bitwise_or(b.backend(), number<B, et_on>::canonical_value(a));\n   return std::move(b);\n}\ntemplate <class B, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n                            detail::expression<detail::bitwise_or, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type\noperator|(const number<B, et_on>& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::bitwise_or, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\ntemplate <class B, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::bitwise_or, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type, number<B, et_on>>::value\n   && number_category<B>::value == number_kind_integer,\n   typename detail::expression<detail::bitwise_or, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type>::type\noperator|(number<B, et_on>&& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   a |= b;\n   return std::move(a);\n}\ntemplate <class B, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::bitwise_or, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type, number<B, et_on>>::value\n   && number_category<B>::value == number_kind_integer,\n   typename detail::expression<detail::bitwise_or, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type>::type\noperator|(number<B, et_on>&& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::bitwise_or, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n                            detail::expression<detail::bitwise_or, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> > >::type\noperator|(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::bitwise_or, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::bitwise_or, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >::result_type, number<B, et_on>>::value\n   && number_category<B>::value == number_kind_integer,\n   typename detail::expression<detail::bitwise_or, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >::result_type>::type\noperator|(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, number<B, et_on>&& b)\n{\n   b |= a;\n   return std::move(b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::bitwise_or, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >::result_type, number<B, et_on>>::value\n   && number_category<B>::value == number_kind_integer,\n   typename detail::expression<detail::bitwise_or, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >::result_type>::type\noperator|(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, number<B, et_on>&& b)\n{\n   return detail::expression<detail::bitwise_or, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class tag2, class Arg1b, class Arg2b, class Arg3b, class Arg4b>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value == number_kind_integer,\n                            detail::expression<detail::bitwise_or, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> > >::type\noperator|(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b>& b)\n{\n   return detail::expression<detail::bitwise_or, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value && (number_category<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value == number_kind_integer),\n                            detail::expression<detail::bitwise_or, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V> >::type\noperator|(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const V& b)\n{\n   return detail::expression<detail::bitwise_or, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V>(a, b);\n}\ntemplate <class V, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value && (number_category<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value == number_kind_integer),\n                            detail::expression<detail::bitwise_or, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type\noperator|(const V& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::bitwise_or, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\n//\n// Bitwise XOR:\n//\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n                            detail::expression<detail::bitwise_xor_immediates, number<B, et_on>, number<B, et_on> > >::type\noperator^(const number<B, et_on>& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::bitwise_xor_immediates, number<B, et_on>, number<B, et_on> >(a, b);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n   number<B, et_on> >::type\noperator^(number<B, et_on>&& a, const number<B, et_on>& b)\n{\n   using default_ops::eval_bitwise_xor;\n   eval_bitwise_xor(a.backend(), b.backend());\n   return std::move(a);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n   number<B, et_on> >::type\noperator^(const number<B, et_on>& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_bitwise_xor;\n   eval_bitwise_xor(b.backend(), a.backend());\n   return std::move(b);\n}\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n   number<B, et_on> >::type\noperator^(number<B, et_on>&& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_bitwise_xor;\n   eval_bitwise_xor(a.backend(), b.backend());\n   return std::move(a);\n}\ntemplate <class B, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && (number_category<B>::value == number_kind_integer),\n                            detail::expression<detail::bitwise_xor_immediates, number<B, et_on>, V> >::type\noperator^(const number<B, et_on>& a, const V& b)\n{\n   return detail::expression<detail::bitwise_xor_immediates, number<B, et_on>, V>(a, b);\n}\ntemplate <class B, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && (number_category<B>::value == number_kind_integer),\n   number<B, et_on> >::type\noperator^(number<B, et_on>&& a, const V& b)\n{\n   using default_ops::eval_bitwise_xor;\n   eval_bitwise_xor(a.backend(), number<B, et_on>::canonical_value(b));\n   return std::move(a);\n}\ntemplate <class V, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && (number_category<B>::value == number_kind_integer),\n                            detail::expression<detail::bitwise_xor_immediates, V, number<B, et_on> > >::type\noperator^(const V& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::bitwise_xor_immediates, V, number<B, et_on> >(a, b);\n}\ntemplate <class V, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >::value && (number_category<B>::value == number_kind_integer),\n   number<B, et_on> >::type\noperator^(const V& a, number<B, et_on>&& b)\n{\n   using default_ops::eval_bitwise_xor;\n   eval_bitwise_xor(b.backend(), number<B, et_on>::canonical_value(a));\n   return std::move(b);\n}\ntemplate <class B, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n                            detail::expression<detail::bitwise_xor, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type\noperator^(const number<B, et_on>& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::bitwise_xor, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\ntemplate <class B, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::bitwise_xor, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type, number<B, et_on>>::value\n   && number_category<B>::value == number_kind_integer,\n   typename detail::expression<detail::bitwise_xor, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type>::type\noperator^(number<B, et_on>&& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   a ^= b;\n   return std::move(a);\n}\ntemplate <class B, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::bitwise_xor, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type, number<B, et_on>>::value\n   && number_category<B>::value == number_kind_integer,\n   typename detail::expression<detail::bitwise_xor, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >::result_type>::type\noperator^(number<B, et_on>&& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::bitwise_xor, number<B, et_on>, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer,\n                            detail::expression<detail::bitwise_xor, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> > >::type\noperator^(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const number<B, et_on>& b)\n{\n   return detail::expression<detail::bitwise_xor, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   std::is_same<typename detail::expression<detail::bitwise_xor, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >::result_type, number<B, et_on>>::value\n   && number_category<B>::value == number_kind_integer,\n   typename detail::expression<detail::bitwise_xor, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >::result_type>::type\noperator^(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, number<B, et_on>&& b)\n{\n   b ^= a;\n   return std::move(b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n   !std::is_same<typename detail::expression<detail::bitwise_xor, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >::result_type, number<B, et_on>>::value\n   && number_category<B>::value == number_kind_integer,\n   typename detail::expression<detail::bitwise_xor, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >::result_type>::type\noperator^(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, number<B, et_on>&& b)\n{\n   return detail::expression<detail::bitwise_xor, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, et_on> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class tag2, class Arg1b, class Arg2b, class Arg3b, class Arg4b>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value == number_kind_integer,\n                            detail::expression<detail::bitwise_xor, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> > >::type\noperator^(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b>& b)\n{\n   return detail::expression<detail::bitwise_xor, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> >(a, b);\n}\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value && (number_category<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value == number_kind_integer),\n                            detail::expression<detail::bitwise_xor, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V> >::type\noperator^(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const V& b)\n{\n   return detail::expression<detail::bitwise_xor, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V>(a, b);\n}\ntemplate <class V, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value && (number_category<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value == number_kind_integer), detail::expression<detail::bitwise_xor, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type\noperator^(const V& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)\n{\n   return detail::expression<detail::bitwise_xor, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);\n}\n\n}} // namespace boost::multiprecision\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/float128_functions.hpp",
    "content": "//  (C) Copyright John Maddock 2021.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// We deliberately use assert in here:\n//\n\n#ifndef BOOST_MP_DETAIL_FLOAT128_FUNCTIONS_HPP\n#define BOOST_MP_DETAIL_FLOAT128_FUNCTIONS_HPP\n\n#include <boost/multiprecision/detail/standalone_config.hpp>\n\n#ifndef BOOST_MP_STANDALONE\n#include <boost/cstdfloat.hpp>\n#if defined(BOOST_MATH_USE_FLOAT128) && !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT)\n#  define BOOST_MP_HAVE_CSTDFLOAT\n#endif\n#endif\n\n#if defined(BOOST_HAS_FLOAT128)\n\nnamespace boost \n{\nnamespace multiprecision \n{\nnamespace float128_procs \n{\nextern \"C\" __float128 ldexpq(__float128, int) throw();\nextern \"C\" __float128 frexpq(__float128, int*) throw();\nextern \"C\" __float128 floorq(__float128) throw();\nextern \"C\" __float128 nextafterq(__float128, __float128) throw();\nextern \"C\" int        isinfq(__float128) throw();\nextern \"C\" int        isnanq(__float128) throw();\nextern \"C\" __float128 strtoflt128(const char*, char**) throw();\n\n#ifdef BOOST_MP_HAVE_CSTDFLOAT\nusing std::ldexp;\nusing std::frexp;\nusing std::floor;\nusing std::nextafter;\n#else\ninline __float128 ldexp(__float128 f, int i) throw() { return ldexpq(f, i); }\ninline __float128 frexp(__float128 f, int* p) throw() { return frexpq(f, p); }\ninline __float128 floor(__float128 f) throw() { return floorq(f); }\ninline __float128 nextafter(__float128 a, __float128 b) throw() { return nextafterq(a, b); }\n#endif\n}\n\nnamespace detail {\n\ntemplate <class T>\nstruct is_float128 : public std::is_same<__float128, T>\n{};\n\n}\n}\n}\n\nnamespace boost {\nnamespace math {\n\n   inline __float128 float_next(const __float128& f)\n   {\n      return boost::multiprecision::float128_procs::nextafterq(f, 2 * f);\n   }\n   inline int (isinf)(const __float128& f)\n   {\n      return boost::multiprecision::float128_procs::isinfq(f);\n   }\n   inline int (isnan)(const __float128& f)\n   {\n      return boost::multiprecision::float128_procs::isnanq(f);\n   }\n\n}}\n\n#define BOOST_MP_FLOAT128_USING using boost::multiprecision::float128_procs::ldexp; using boost::multiprecision::float128_procs::frexp; using boost::multiprecision::float128_procs::floor; using boost::multiprecision::float128_procs::nextafter; using boost::math::isinf; using boost::math::isnan;\n\n#else\n#define BOOST_MP_FLOAT128_USING\n\nnamespace boost {\nnamespace multiprecision {\nnamespace detail {\n\ntemplate <class T>\nstruct is_float128 : public std::false_type\n{};\n\n}}} // namespace boost::multiprecision::detail\n\n#endif\n\n#endif // BOOST_MP_DETAIL_FLOAT128_FUNCTIONS_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/float_string_cvt.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2013 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// Generic routines for converting floating point values to and from decimal strings.\n// Note that these use \"naive\" algorithms which result in rounding error - so they\n// do not round trip to and from the string representation (but should only be out\n// in the last bit).\n//\n\n#ifndef BOOST_MP_FLOAT_STRING_CVT_HPP\n#define BOOST_MP_FLOAT_STRING_CVT_HPP\n\n#include <string>\n#include <cctype>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n\nnamespace boost { namespace multiprecision { namespace detail {\n\ntemplate <class I>\ninline void round_string_up_at(std::string& s, std::ptrdiff_t pos, I& expon)\n{\n   //\n   // Rounds up a string representation of a number at pos:\n   //\n   if (pos < 0)\n   {\n      s.insert(static_cast<std::string::size_type>(0), 1, '1');\n      s.erase(s.size() - 1);\n      ++expon;\n   }\n   else if (s[static_cast<std::size_t>(pos)] == '9')\n   {\n      s[static_cast<std::size_t>(pos)] = '0';\n      round_string_up_at(s, pos - 1, expon);\n   }\n   else\n   {\n      if ((pos == 0) && (s[static_cast<std::size_t>(pos)] == '0') && (s.size() == 1))\n         ++expon;\n      ++s[static_cast<std::size_t>(pos)];\n   }\n}\n\ntemplate <class Backend>\nstd::string convert_to_string(Backend b, std::streamsize digits, std::ios_base::fmtflags f)\n{\n   using default_ops::eval_convert_to;\n   using default_ops::eval_divide;\n   using default_ops::eval_floor;\n   using default_ops::eval_fpclassify;\n   using default_ops::eval_log10;\n   using default_ops::eval_multiply;\n   using default_ops::eval_pow;\n   using default_ops::eval_subtract;\n\n   using ui_type = typename std::tuple_element<0, typename Backend::unsigned_types>::type;\n   using exponent_type = typename Backend::exponent_type                            ;\n\n   std::string     result;\n   bool            iszero     = false;\n   bool            isneg      = false;\n   exponent_type   expon      = 0;\n   std::streamsize org_digits = digits;\n   BOOST_MP_ASSERT(digits > 0);\n\n   int fpt = eval_fpclassify(b);\n\n   if (fpt == static_cast<int>(FP_ZERO))\n   {\n      result = \"0\";\n      iszero = true;\n   }\n   else if (fpt == static_cast<int>(FP_INFINITE))\n   {\n      if (b.compare(ui_type(0)) < 0)\n         return \"-inf\";\n      else\n         return ((f & std::ios_base::showpos) == std::ios_base::showpos) ? \"+inf\" : \"inf\";\n   }\n   else if (fpt == static_cast<int>(FP_NAN))\n   {\n      return \"nan\";\n   }\n   else\n   {\n      //\n      // Start by figuring out the exponent:\n      //\n      isneg = b.compare(ui_type(0)) < 0;\n      if (isneg)\n         b.negate();\n      Backend t;\n      Backend ten;\n      ten = ui_type(10);\n\n      eval_log10(t, b);\n      eval_floor(t, t);\n      eval_convert_to(&expon, t);\n      if (-expon > std::numeric_limits<number<Backend> >::max_exponent10 - 3)\n      {\n         int     e = -expon / 2;\n         Backend t2;\n         eval_pow(t2, ten, e);\n         eval_multiply(t, t2, b);\n         eval_multiply(t, t2);\n         if (expon & 1)\n            eval_multiply(t, ten);\n      }\n      else\n      {\n         eval_pow(t, ten, -expon);\n         eval_multiply(t, b);\n      }\n      //\n      // Make sure we're between [1,10) and adjust if not:\n      //\n      if (t.compare(ui_type(1)) < 0)\n      {\n         eval_multiply(t, ui_type(10));\n         --expon;\n      }\n      else if (t.compare(ui_type(10)) >= 0)\n      {\n         eval_divide(t, ui_type(10));\n         ++expon;\n      }\n      Backend digit;\n      ui_type cdigit;\n      //\n      // Adjust the number of digits required based on formatting options:\n      //\n      if (((f & std::ios_base::fixed) == std::ios_base::fixed) && (expon != -1))\n         digits += expon + 1;\n      if ((f & std::ios_base::scientific) == std::ios_base::scientific)\n         ++digits;\n      //\n      // Extract the digits one at a time:\n      //\n      for (unsigned i = 0; i < digits; ++i)\n      {\n         eval_floor(digit, t);\n         eval_convert_to(&cdigit, digit);\n         result += static_cast<char>('0' + cdigit);\n         eval_subtract(t, digit);\n         eval_multiply(t, ten);\n      }\n      //\n      // Possibly round result:\n      //\n      if (digits >= 0)\n      {\n         eval_floor(digit, t);\n         eval_convert_to(&cdigit, digit);\n         eval_subtract(t, digit);\n         if ((cdigit == 5) && (t.compare(ui_type(0)) == 0))\n         {\n            // Bankers rounding:\n            if ((*result.rbegin() - '0') & 1)\n            {\n               round_string_up_at(result, result.size() - 1, expon);\n            }\n         }\n         else if (cdigit >= 5)\n         {\n            round_string_up_at(result, result.size() - 1, expon);\n         }\n      }\n      eval_floor(t, b);\n      if ((t.compare(b) == 0) && (static_cast<std::size_t>(expon + 1) < result.size()))\n      {\n         // Input is an integer, sometimes we get a result which is not an integer here as a result of printing too\n         // many digits, so lets round if required:\n         round_string_up_at(result, expon + 1, expon);\n         result.erase(expon + 1);\n      }\n   }\n   while ((static_cast<std::streamsize>(result.size()) > digits) && (result.size() != 0U))\n   {\n      // We may get here as a result of rounding...\n      if (result.size() > 1)\n         result.erase(result.size() - 1);\n      else\n      {\n         if (expon > 0)\n            --expon; // so we put less padding in the result.\n         else\n            ++expon;\n         ++digits;\n      }\n   }\n   BOOST_MP_ASSERT(org_digits >= 0);\n   if (isneg)\n      result.insert(static_cast<std::string::size_type>(0), 1, '-');\n   format_float_string(result, expon, org_digits, f, iszero);\n\n   return result;\n}\n\ntemplate <class Backend>\nvoid convert_from_string(Backend& b, const char* p)\n{\n   using default_ops::eval_add;\n   using default_ops::eval_divide;\n   using default_ops::eval_multiply;\n   using default_ops::eval_pow;\n\n   using ui_type = typename std::tuple_element<0, typename Backend::unsigned_types>::type;\n   b = ui_type(0);\n   if (!p || (*p == 0))\n      return;\n\n   bool                            is_neg       = false;\n   bool                            is_neg_expon = false;\n   constexpr ui_type               ten          = ui_type(10);\n   typename Backend::exponent_type expon        = 0;\n   int                             digits_seen  = 0;\n\n   using limits = std::numeric_limits<number<Backend, et_off>>;\n\n   constexpr int max_digits = limits::is_specialized ? limits::max_digits10 + 1 : INT_MAX;\n\n   if (*p == '+')\n      ++p;\n   else if (*p == '-')\n   {\n      is_neg = true;\n      ++p;\n   }\n   if ((std::strcmp(p, \"nan\") == 0) || (std::strcmp(p, \"NaN\") == 0) || (std::strcmp(p, \"NAN\") == 0))\n   {\n      eval_divide(b, ui_type(0));\n      if (is_neg)\n         b.negate();\n      return;\n   }\n   if ((std::strcmp(p, \"inf\") == 0) || (std::strcmp(p, \"Inf\") == 0) || (std::strcmp(p, \"INF\") == 0))\n   {\n      b = ui_type(1);\n      eval_divide(b, ui_type(0));\n      if (is_neg)\n         b.negate();\n      return;\n   }\n   //\n   // Grab all the leading digits before the decimal point:\n   //\n   while (std::isdigit(*p))\n   {\n      eval_multiply(b, ten);\n      eval_add(b, ui_type(*p - '0'));\n      ++p;\n      ++digits_seen;\n   }\n   if (*p == '.')\n   {\n      //\n      // Grab everything after the point, stop when we've seen\n      // enough digits, even if there are actually more available:\n      //\n      ++p;\n      while (std::isdigit(*p))\n      {\n         eval_multiply(b, ten);\n         eval_add(b, ui_type(*p - '0'));\n         ++p;\n         --expon;\n         if (++digits_seen > max_digits)\n            break;\n      }\n      while (std::isdigit(*p))\n         ++p;\n   }\n   //\n   // Parse the exponent:\n   //\n   if ((*p == 'e') || (*p == 'E'))\n   {\n      ++p;\n      if (*p == '+')\n         ++p;\n      else if (*p == '-')\n      {\n         is_neg_expon = true;\n         ++p;\n      }\n      typename Backend::exponent_type e2 = 0;\n      while (std::isdigit(*p))\n      {\n         e2 *= 10;\n         e2 += (*p - '0');\n         ++p;\n      }\n      if (is_neg_expon)\n         e2 = -e2;\n      expon += e2;\n   }\n   if (expon)\n   {\n      // Scale by 10^expon, note that 10^expon can be\n      // outside the range of our number type, even though the\n      // result is within range, if that looks likely, then split\n      // the calculation in two:\n      Backend t;\n      t = ten;\n      if (expon > limits::min_exponent10 + 2)\n      {\n         eval_pow(t, t, expon);\n         eval_multiply(b, t);\n      }\n      else\n      {\n         eval_pow(t, t, expon + digits_seen + 1);\n         eval_multiply(b, t);\n         t = ten;\n         eval_pow(t, t, -digits_seen - 1);\n         eval_multiply(b, t);\n      }\n   }\n   if (is_neg)\n      b.negate();\n   if (*p)\n   {\n      // Unexpected input in string:\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Unexpected characters in string being interpreted as a float128.\"));\n   }\n}\n\n}}} // namespace boost::multiprecision::detail\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/fpclassify.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2022 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_DETAIL_FPCLASSIFY_HPP\n#define BOOST_MP_DETAIL_FPCLASSIFY_HPP\n\n#include <cmath>\n#include <limits>\n#include <type_traits>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/detail/float128_functions.hpp>\n\n#ifdef BOOST_MP_MATH_AVAILABLE\n#include <boost/math/special_functions/fpclassify.hpp>\n\n#define BOOST_MP_ISNAN(x) (boost::math::isnan)(x)\n#define BOOST_MP_ISINF(x) (boost::math::isinf)(x)\n#define BOOST_MP_FPCLASSIFY(x) (boost::math::fpclassify)(x)\n#define BOOST_MP_ISFINITE(x) (!(boost::math::isnan)(x) && !(boost::math::isinf)(x))\n\n#else\n\nnamespace boost { namespace multiprecision { namespace detail {\n\ntemplate <typename T, typename std::enable_if<std::is_floating_point<T>::value\n                      #ifdef BOOST_HAS_FLOAT128\n                      || std::is_same<T, float128_type>::value\n                      #endif\n                      , bool>::type = true>\ninline bool isnan BOOST_PREVENT_MACRO_SUBSTITUTION (const T x)\n{\n    BOOST_MP_FLOAT128_USING;\n    using std::isnan;\n    return static_cast<bool>((isnan)(x));\n}\n\ntemplate <typename T, typename std::enable_if<!std::is_floating_point<T>::value\n                      #ifdef BOOST_HAS_FLOAT128\n                      && !std::is_same<T, float128_type>::value\n                      #endif\n                      , bool>::type = true>\ninline bool isnan BOOST_PREVENT_MACRO_SUBSTITUTION (const T x)\n{\n    return x != x;\n}\n\ntemplate <typename T, typename std::enable_if<std::is_floating_point<T>::value\n                      #ifdef BOOST_HAS_FLOAT128\n                      || std::is_same<T, float128_type>::value\n                      #endif\n                      , bool>::type = true>\ninline bool isinf BOOST_PREVENT_MACRO_SUBSTITUTION (const T x)\n{\n    BOOST_MP_FLOAT128_USING;\n    using std::isinf;\n    return static_cast<bool>((isinf)(x));\n}\n\ntemplate <typename T, typename std::enable_if<!std::is_floating_point<T>::value\n                      #ifdef BOOST_HAS_FLOAT128\n                      && !std::is_same<T, float128_type>::value\n                      #endif\n                      , bool>::type = true>\ninline bool isinf BOOST_PREVENT_MACRO_SUBSTITUTION (const T x)\n{\n    return x == std::numeric_limits<T>::infinity() || x == -std::numeric_limits<T>::infinity();\n}\n\ntemplate <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true>\ninline int fpclassify BOOST_PREVENT_MACRO_SUBSTITUTION (const T x)\n{\n    using std::fpclassify;\n    return fpclassify(x);\n}\n\ntemplate <typename T, typename std::enable_if<!std::is_floating_point<T>::value, bool>::type = true>\ninline int fpclassify BOOST_PREVENT_MACRO_SUBSTITUTION (const T x)\n{\n    BOOST_MP_FLOAT128_USING;\n    using std::isnan;\n    using std::isinf;\n    using std::abs;\n\n    return (isnan)(x) ? FP_NAN :\n           (isinf)(x) ? FP_INFINITE :\n           abs(x) == T(0) ? FP_ZERO :\n           abs(x) > 0 && abs(x) < (std::numeric_limits<T>::min)() ? FP_SUBNORMAL : FP_NORMAL;\n}\n\n}}} // Namespace boost::multiprecision::detail\n\n#define BOOST_MP_ISNAN(x) (boost::multiprecision::detail::isnan)(x)\n#define BOOST_MP_ISINF(x) (boost::multiprecision::detail::isinf)(x)\n#define BOOST_MP_FPCLASSIFY(x) (boost::multiprecision::detail::fpclassify)(x)\n#define BOOST_MP_ISFINITE(x) (!(boost::multiprecision::detail::isnan)(x) && !(boost::multiprecision::detail::isinf)(x))\n\n#endif\n\n#endif // BOOST_MP_DETAIL_FPCLASSIFY_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/functions/constants.hpp",
    "content": "// Copyright 2011 John Maddock.\n// Distributed under the Boost Software License, Version 1.0.\n//    (See accompanying file LICENSE_1_0.txt or copy at\n//          http://www.boost.org/LICENSE_1_0.txt)\n//\n// This file has no include guards or namespaces - it's expanded inline inside default_ops.hpp\n//\n\ntemplate <class T>\nvoid calc_log2(T& num, unsigned digits)\n{\n   using ui_type = typename boost::multiprecision::detail::canonical<std::uint32_t, T>::type;\n   using si_type = typename std::tuple_element<0, typename T::signed_types>::type                        ;\n\n   //\n   // String value with 1100 digits:\n   //\n   static const char* string_val = \"0.\"\n                                   \"6931471805599453094172321214581765680755001343602552541206800094933936219696947156058633269964186875\"\n                                   \"4200148102057068573368552023575813055703267075163507596193072757082837143519030703862389167347112335\"\n                                   \"0115364497955239120475172681574932065155524734139525882950453007095326366642654104239157814952043740\"\n                                   \"4303855008019441706416715186447128399681717845469570262716310645461502572074024816377733896385506952\"\n                                   \"6066834113727387372292895649354702576265209885969320196505855476470330679365443254763274495125040606\"\n                                   \"9438147104689946506220167720424524529612687946546193165174681392672504103802546259656869144192871608\"\n                                   \"2938031727143677826548775664850856740776484514644399404614226031930967354025744460703080960850474866\"\n                                   \"3852313818167675143866747664789088143714198549423151997354880375165861275352916610007105355824987941\"\n                                   \"4729509293113897155998205654392871700072180857610252368892132449713893203784393530887748259701715591\"\n                                   \"0708823683627589842589185353024363421436706118923678919237231467232172053401649256872747782344535347\"\n                                   \"6481149418642386776774406069562657379600867076257199184734022651462837904883062033061144630073719489\";\n   //\n   // Check if we can just construct from string:\n   //\n   if (digits < 3640) // 3640 binary digits ~ 1100 decimal digits\n   {\n      num = string_val;\n      return;\n   }\n   //\n   // We calculate log2 from using the formula:\n   //\n   // ln(2) = 3/4 SUM[n>=0] ((-1)^n * N!^2 / (2^n(2n+1)!))\n   //\n   // Numerator and denominator are calculated separately and then\n   // divided at the end, we also precalculate the terms up to n = 5\n   // since these fit in a 32-bit integer anyway.\n   //\n   // See Gourdon, X., and Sebah, P. The logarithmic constant: log 2, Jan. 2004.\n   // Also http://www.mpfr.org/algorithms.pdf.\n   //\n   num = static_cast<ui_type>(1180509120uL);\n   T denom, next_term, temp;\n   denom        = static_cast<ui_type>(1277337600uL);\n   next_term    = static_cast<ui_type>(120uL);\n   si_type sign = -1;\n\n   ui_type limit = digits / 3 + 1;\n\n   for (ui_type n = 6; n < limit; ++n)\n   {\n      temp = static_cast<ui_type>(2);\n      eval_multiply(temp, ui_type(2 * n));\n      eval_multiply(temp, ui_type(2 * n + 1));\n      eval_multiply(num, temp);\n      eval_multiply(denom, temp);\n      sign = -sign;\n      eval_multiply(next_term, n);\n      eval_multiply(temp, next_term, next_term);\n      if (sign < 0)\n         temp.negate();\n      eval_add(num, temp);\n   }\n   eval_multiply(denom, ui_type(4));\n   eval_multiply(num, ui_type(3));\n   INSTRUMENT_BACKEND(denom);\n   INSTRUMENT_BACKEND(num);\n   eval_divide(num, denom);\n   INSTRUMENT_BACKEND(num);\n}\n\ntemplate <class T>\nvoid calc_e(T& result, unsigned digits)\n{\n   using ui_type = typename std::tuple_element<0, typename T::unsigned_types>::type;\n   //\n   // 1100 digits in string form:\n   //\n   const char* string_val = \"2.\"\n                            \"7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274\"\n                            \"2746639193200305992181741359662904357290033429526059563073813232862794349076323382988075319525101901\"\n                            \"1573834187930702154089149934884167509244761460668082264800168477411853742345442437107539077744992069\"\n                            \"5517027618386062613313845830007520449338265602976067371132007093287091274437470472306969772093101416\"\n                            \"9283681902551510865746377211125238978442505695369677078544996996794686445490598793163688923009879312\"\n                            \"7736178215424999229576351482208269895193668033182528869398496465105820939239829488793320362509443117\"\n                            \"3012381970684161403970198376793206832823764648042953118023287825098194558153017567173613320698112509\"\n                            \"9618188159304169035159888851934580727386673858942287922849989208680582574927961048419844436346324496\"\n                            \"8487560233624827041978623209002160990235304369941849146314093431738143640546253152096183690888707016\"\n                            \"7683964243781405927145635490613031072085103837505101157477041718986106873969655212671546889570350354\"\n                            \"0212340784981933432106817012100562788023519303322474501585390473041995777709350366041699732972508869\";\n   //\n   // Check if we can just construct from string:\n   //\n   if (digits < 3640) // 3640 binary digits ~ 1100 decimal digits\n   {\n      result = string_val;\n      return;\n   }\n\n   T lim;\n   lim = ui_type(1);\n   eval_ldexp(lim, lim, digits);\n\n   //\n   // Standard evaluation from the definition of e: http://functions.wolfram.com/Constants/E/02/\n   //\n   result = ui_type(2);\n   T denom;\n   denom     = ui_type(1);\n   ui_type i = 2;\n   do\n   {\n      eval_multiply(denom, i);\n      eval_multiply(result, i);\n      eval_add(result, ui_type(1));\n      ++i;\n   } while (denom.compare(lim) <= 0);\n   eval_divide(result, denom);\n}\n\ntemplate <class T>\nvoid calc_pi(T& result, unsigned digits)\n{\n   using ui_type = typename std::tuple_element<0, typename T::unsigned_types>::type;\n   using real_type = typename std::tuple_element<0, typename T::float_types>::type   ;\n   //\n   // 1100 digits in string form:\n   //\n   const char* string_val = \"3.\"\n                            \"1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679\"\n                            \"8214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196\"\n                            \"4428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273\"\n                            \"7245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094\"\n                            \"3305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912\"\n                            \"9833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132\"\n                            \"0005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235\"\n                            \"4201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859\"\n                            \"5024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303\"\n                            \"5982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989\"\n                            \"3809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913152\";\n   //\n   // Check if we can just construct from string:\n   //\n   if (digits < 3640) // 3640 binary digits ~ 1100 decimal digits\n   {\n      result = string_val;\n      return;\n   }\n\n   T a;\n   a = ui_type(1);\n   T b;\n   T A(a);\n   T B;\n   B = real_type(0.5f);\n   T D;\n   D = real_type(0.25f);\n\n   T lim;\n   lim = ui_type(1);\n   eval_ldexp(lim, lim, -static_cast<int>(digits));\n\n   //\n   // This algorithm is from:\n   // Schonhage, A., Grotefeld, A. F. W., and Vetter, E. Fast Algorithms: A Multitape Turing\n   // Machine Implementation. BI Wissenschaftverlag, 1994.\n   // Also described in MPFR's algorithm guide: http://www.mpfr.org/algorithms.pdf.\n   //\n   // Let:\n   // a[0] = A[0] = 1\n   // B[0] = 1/2\n   // D[0] = 1/4\n   // Then:\n   // S[k+1] = (A[k]+B[k]) / 4\n   // b[k] = sqrt(B[k])\n   // a[k+1] = a[k]^2\n   // B[k+1] = 2(A[k+1]-S[k+1])\n   // D[k+1] = D[k] - 2^k(A[k+1]-B[k+1])\n   // Stop when |A[k]-B[k]| <= 2^(k-p)\n   // and PI = B[k]/D[k]\n\n   unsigned k = 1;\n\n   do\n   {\n      eval_add(result, A, B);\n      eval_ldexp(result, result, -2);\n      eval_sqrt(b, B);\n      eval_add(a, b);\n      eval_ldexp(a, a, -1);\n      eval_multiply(A, a, a);\n      eval_subtract(B, A, result);\n      eval_ldexp(B, B, 1);\n      eval_subtract(result, A, B);\n      bool neg = eval_get_sign(result) < 0;\n      if (neg)\n         result.negate();\n      if (result.compare(lim) <= 0)\n         break;\n      if (neg)\n         result.negate();\n      eval_ldexp(result, result, k - 1);\n      eval_subtract(D, result);\n      ++k;\n      eval_ldexp(lim, lim, 1);\n   } while (true);\n\n   eval_divide(result, B, D);\n}\n\ntemplate <class T>\nconst T& get_constant_ln2()\n{\n   static BOOST_MP_THREAD_LOCAL T    result;\n   static BOOST_MP_THREAD_LOCAL long digits = 0;\n   if ((digits != boost::multiprecision::detail::digits2<number<T> >::value()))\n   {\n      boost::multiprecision::detail::maybe_promote_precision(&result);\n      calc_log2(result, boost::multiprecision::detail::digits2<number<T, et_on> >::value());\n      digits = boost::multiprecision::detail::digits2<number<T> >::value();\n   }\n\n   return result;\n}\n\ntemplate <class T>\nconst T& get_constant_e()\n{\n   static BOOST_MP_THREAD_LOCAL T    result;\n   static BOOST_MP_THREAD_LOCAL long digits = 0;\n   if ((digits != boost::multiprecision::detail::digits2<number<T> >::value()))\n   {\n      boost::multiprecision::detail::maybe_promote_precision(&result);\n      calc_e(result, boost::multiprecision::detail::digits2<number<T, et_on> >::value());\n      digits = boost::multiprecision::detail::digits2<number<T> >::value();\n   }\n\n   return result;\n}\n\ntemplate <class T>\nconst T& get_constant_pi()\n{\n   static BOOST_MP_THREAD_LOCAL T             result;\n   static BOOST_MP_THREAD_LOCAL long digits = 0;\n   if ((digits != boost::multiprecision::detail::digits2<number<T> >::value()))\n   {\n      boost::multiprecision::detail::maybe_promote_precision(&result);\n      calc_pi(result, boost::multiprecision::detail::digits2<number<T, et_on> >::value());\n      digits = boost::multiprecision::detail::digits2<number<T> >::value();\n   }\n\n   return result;\n}\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4127) // conditional expression is constant\n#endif\ntemplate <class T>\nconst T& get_constant_one_over_epsilon()\n{\n   static BOOST_MP_THREAD_LOCAL T             result;\n   static BOOST_MP_THREAD_LOCAL long digits = 0;\n   if ((digits != boost::multiprecision::detail::digits2<number<T> >::value()))\n   {\n      using ui_type = typename std::tuple_element<0, typename T::unsigned_types>::type;\n      boost::multiprecision::detail::maybe_promote_precision(&result);\n      result = static_cast<ui_type>(1u);\n      BOOST_IF_CONSTEXPR(std::numeric_limits<number<T> >::is_specialized)\n         eval_divide(result, std::numeric_limits<number<T> >::epsilon().backend());\n      else\n         eval_ldexp(result, result, boost::multiprecision::detail::digits2<number<T> >::value() - 1);\n      digits = boost::multiprecision::detail::digits2<number<T> >::value();\n   }\n\n   return result;\n}\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/functions/pow.hpp",
    "content": "\n// Copyright Christopher Kormanyos 2002 - 2013.\n// Copyright 2011 - 2013 John Maddock.\n// Distributed under the Boost Software License, Version 1.0.\n//    (See accompanying file LICENSE_1_0.txt or copy at\n//          http://www.boost.org/LICENSE_1_0.txt)\n\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n//\n// This file has no include guards or namespaces - it's expanded inline inside default_ops.hpp\n//\n\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 6326) // comparison of two constants\n#pragma warning(disable : 4127) // conditional expression is constant\n#endif\n\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n\nnamespace detail {\n\ntemplate <typename T, typename U>\ninline void pow_imp(T& result, const T& t, const U& p, const std::integral_constant<bool, false>&)\n{\n   // Compute the pure power of typename T t^p.\n   // Use the S-and-X binary method, as described in\n   // D. E. Knuth, \"The Art of Computer Programming\", Vol. 2,\n   // Section 4.6.3 . The resulting computational complexity\n   // is order log2[abs(p)].\n\n   using int_type = typename boost::multiprecision::detail::canonical<U, T>::type;\n\n   if (&result == &t)\n   {\n      T temp;\n      pow_imp(temp, t, p, std::integral_constant<bool, false>());\n      result = temp;\n      return;\n   }\n\n   // This will store the result.\n   if (U(p % U(2)) != U(0))\n   {\n      result = t;\n   }\n   else\n      result = int_type(1);\n\n   U p2(p);\n\n   // The variable x stores the binary powers of t.\n   T x(t);\n\n   while (U(p2 /= 2) != U(0))\n   {\n      // Square x for each binary power.\n      eval_multiply(x, x);\n\n      const bool has_binary_power = (U(p2 % U(2)) != U(0));\n\n      if (has_binary_power)\n      {\n         // Multiply the result with each binary power contained in the exponent.\n         eval_multiply(result, x);\n      }\n   }\n}\n\ntemplate <typename T, typename U>\ninline void pow_imp(T& result, const T& t, const U& p, const std::integral_constant<bool, true>&)\n{\n   // Signed integer power, just take care of the sign then call the unsigned version:\n   using int_type = typename boost::multiprecision::detail::canonical<U, T>::type;\n   using ui_type = typename boost::multiprecision::detail::make_unsigned<U>::type                         ;\n\n   if (p < 0)\n   {\n      T temp;\n      temp = static_cast<int_type>(1);\n      T denom;\n      pow_imp(denom, t, static_cast<ui_type>(-p), std::integral_constant<bool, false>());\n      eval_divide(result, temp, denom);\n      return;\n   }\n   pow_imp(result, t, static_cast<ui_type>(p), std::integral_constant<bool, false>());\n}\n\n} // namespace detail\n\ntemplate <typename T, typename U>\ninline typename std::enable_if<boost::multiprecision::detail::is_integral<U>::value>::type eval_pow(T& result, const T& t, const U& p)\n{\n   detail::pow_imp(result, t, p, boost::multiprecision::detail::is_signed<U>());\n}\n\ntemplate <class T>\nvoid hyp0F0(T& H0F0, const T& x)\n{\n   // Compute the series representation of Hypergeometric0F0 taken from\n   // http://functions.wolfram.com/HypergeometricFunctions/Hypergeometric0F0/06/01/\n   // There are no checks on input range or parameter boundaries.\n\n   using ui_type = typename std::tuple_element<0, typename T::unsigned_types>::type;\n\n   BOOST_MP_ASSERT(&H0F0 != &x);\n   long tol = boost::multiprecision::detail::digits2<number<T, et_on> >::value();\n   T    t;\n\n   T x_pow_n_div_n_fact(x);\n\n   eval_add(H0F0, x_pow_n_div_n_fact, ui_type(1));\n\n   T lim;\n   eval_ldexp(lim, H0F0, 1 - tol);\n   if (eval_get_sign(lim) < 0)\n      lim.negate();\n\n   ui_type n;\n\n   const unsigned series_limit =\n       boost::multiprecision::detail::digits2<number<T, et_on> >::value() < 100\n           ? 100\n           : boost::multiprecision::detail::digits2<number<T, et_on> >::value();\n   // Series expansion of hyperg_0f0(; ; x).\n   for (n = 2; n < series_limit; ++n)\n   {\n      eval_multiply(x_pow_n_div_n_fact, x);\n      eval_divide(x_pow_n_div_n_fact, n);\n      eval_add(H0F0, x_pow_n_div_n_fact);\n      bool neg = eval_get_sign(x_pow_n_div_n_fact) < 0;\n      if (neg)\n         x_pow_n_div_n_fact.negate();\n      if (lim.compare(x_pow_n_div_n_fact) > 0)\n         break;\n      if (neg)\n         x_pow_n_div_n_fact.negate();\n   }\n   if (n >= series_limit)\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"H0F0 failed to converge\"));\n}\n\ntemplate <class T>\nvoid hyp1F0(T& H1F0, const T& a, const T& x)\n{\n   // Compute the series representation of Hypergeometric1F0 taken from\n   // http://functions.wolfram.com/HypergeometricFunctions/Hypergeometric1F0/06/01/01/\n   // and also see the corresponding section for the power function (i.e. x^a).\n   // There are no checks on input range or parameter boundaries.\n\n   using si_type = typename boost::multiprecision::detail::canonical<int, T>::type;\n\n   BOOST_MP_ASSERT(&H1F0 != &x);\n   BOOST_MP_ASSERT(&H1F0 != &a);\n\n   T x_pow_n_div_n_fact(x);\n   T pochham_a(a);\n   T ap(a);\n\n   eval_multiply(H1F0, pochham_a, x_pow_n_div_n_fact);\n   eval_add(H1F0, si_type(1));\n   T lim;\n   eval_ldexp(lim, H1F0, 1 - boost::multiprecision::detail::digits2<number<T, et_on> >::value());\n   if (eval_get_sign(lim) < 0)\n      lim.negate();\n\n   si_type n;\n   T       term, part;\n\n   const si_type series_limit =\n       boost::multiprecision::detail::digits2<number<T, et_on> >::value() < 100\n           ? 100\n           : boost::multiprecision::detail::digits2<number<T, et_on> >::value();\n   // Series expansion of hyperg_1f0(a; ; x).\n   for (n = 2; n < series_limit; n++)\n   {\n      eval_multiply(x_pow_n_div_n_fact, x);\n      eval_divide(x_pow_n_div_n_fact, n);\n      eval_increment(ap);\n      eval_multiply(pochham_a, ap);\n      eval_multiply(term, pochham_a, x_pow_n_div_n_fact);\n      eval_add(H1F0, term);\n      if (eval_get_sign(term) < 0)\n         term.negate();\n      if (lim.compare(term) >= 0)\n         break;\n   }\n   if (n >= series_limit)\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"H1F0 failed to converge\"));\n}\n\ntemplate <class T>\nvoid eval_exp(T& result, const T& x)\n{\n   static_assert(number_category<T>::value == number_kind_floating_point, \"The exp function is only valid for floating point types.\");\n   if (&x == &result)\n   {\n      T temp;\n      eval_exp(temp, x);\n      result = temp;\n      return;\n   }\n   using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;\n   using si_type = typename boost::multiprecision::detail::canonical<int, T>::type     ;\n   using exp_type = typename T::exponent_type                                           ;\n   using canonical_exp_type = typename boost::multiprecision::detail::canonical<exp_type, T>::type;\n\n   // Handle special arguments.\n   int  type  = eval_fpclassify(x);\n   bool isneg = eval_get_sign(x) < 0;\n   if (type == static_cast<int>(FP_NAN))\n   {\n      result = x;\n      errno  = EDOM;\n      return;\n   }\n   else if (type == static_cast<int>(FP_INFINITE))\n   {\n      if (isneg)\n         result = ui_type(0u);\n      else\n         result = x;\n      return;\n   }\n   else if (type == static_cast<int>(FP_ZERO))\n   {\n      result = ui_type(1);\n      return;\n   }\n\n   // Get local copy of argument and force it to be positive.\n   T xx = x;\n   T exp_series;\n   if (isneg)\n      xx.negate();\n\n   // Check the range of the argument.\n   if (xx.compare(si_type(1)) <= 0)\n   {\n      //\n      // Use series for exp(x) - 1:\n      //\n      T lim;\n      BOOST_IF_CONSTEXPR(std::numeric_limits<number<T, et_on> >::is_specialized)\n         lim = std::numeric_limits<number<T, et_on> >::epsilon().backend();\n      else\n      {\n         result = ui_type(1);\n         eval_ldexp(lim, result, 1 - boost::multiprecision::detail::digits2<number<T, et_on> >::value());\n      }\n      unsigned k = 2;\n      exp_series = xx;\n      result     = si_type(1);\n      if (isneg)\n         eval_subtract(result, exp_series);\n      else\n         eval_add(result, exp_series);\n      eval_multiply(exp_series, xx);\n      eval_divide(exp_series, ui_type(k));\n      eval_add(result, exp_series);\n      while (exp_series.compare(lim) > 0)\n      {\n         ++k;\n         eval_multiply(exp_series, xx);\n         eval_divide(exp_series, ui_type(k));\n         if (isneg && (k & 1))\n            eval_subtract(result, exp_series);\n         else\n            eval_add(result, exp_series);\n      }\n      return;\n   }\n\n   // Check for pure-integer arguments which can be either signed or unsigned.\n   typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type ll;\n   eval_trunc(exp_series, x);\n   eval_convert_to(&ll, exp_series);\n   if (x.compare(ll) == 0)\n   {\n      detail::pow_imp(result, get_constant_e<T>(), ll, std::integral_constant<bool, true>());\n      return;\n   }\n   else if (exp_series.compare(x) == 0)\n   {\n      // We have a value that has no fractional part, but is too large to fit\n      // in a long long, in this situation the code below will fail, so\n      // we're just going to assume that this will overflow:\n      if (isneg)\n         result = ui_type(0);\n      else\n         result = std::numeric_limits<number<T> >::has_infinity ? std::numeric_limits<number<T> >::infinity().backend() : (std::numeric_limits<number<T> >::max)().backend();\n      return;\n   }\n\n   // The algorithm for exp has been taken from MPFUN.\n   // exp(t) = [ (1 + r + r^2/2! + r^3/3! + r^4/4! ...)^p2 ] * 2^n\n   // where p2 is a power of 2 such as 2048, r = t_prime / p2, and\n   // t_prime = t - n*ln2, with n chosen to minimize the absolute\n   // value of t_prime. In the resulting Taylor series, which is\n   // implemented as a hypergeometric function, |r| is bounded by\n   // ln2 / p2. For small arguments, no scaling is done.\n\n   // Compute the exponential series of the (possibly) scaled argument.\n\n   eval_divide(result, xx, get_constant_ln2<T>());\n   exp_type n;\n   eval_convert_to(&n, result);\n\n   if (n == (std::numeric_limits<exp_type>::max)())\n   {\n      // Exponent is too large to fit in our exponent type:\n      if (isneg)\n         result = ui_type(0);\n      else\n         result = std::numeric_limits<number<T> >::has_infinity ? std::numeric_limits<number<T> >::infinity().backend() : (std::numeric_limits<number<T> >::max)().backend();\n      return;\n   }\n\n   // The scaling is 2^11 = 2048.\n   const si_type p2 = static_cast<si_type>(si_type(1) << 11);\n\n   eval_multiply(exp_series, get_constant_ln2<T>(), static_cast<canonical_exp_type>(n));\n   eval_subtract(exp_series, xx);\n   eval_divide(exp_series, p2);\n   exp_series.negate();\n   hyp0F0(result, exp_series);\n\n   detail::pow_imp(exp_series, result, p2, std::integral_constant<bool, true>());\n   result = ui_type(1);\n   eval_ldexp(result, result, n);\n   eval_multiply(exp_series, result);\n\n   if (isneg)\n      eval_divide(result, ui_type(1), exp_series);\n   else\n      result = exp_series;\n}\n\ntemplate <class T>\nvoid eval_log(T& result, const T& arg)\n{\n   static_assert(number_category<T>::value == number_kind_floating_point, \"The log function is only valid for floating point types.\");\n   //\n   // We use a variation of http://dlmf.nist.gov/4.45#i\n   // using frexp to reduce the argument to x * 2^n,\n   // then let y = x - 1 and compute:\n   // log(x) = log(2) * n + log1p(1 + y)\n   //\n   using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;\n   using exp_type = typename T::exponent_type                                           ;\n   using canonical_exp_type = typename boost::multiprecision::detail::canonical<exp_type, T>::type;\n   using fp_type = typename std::tuple_element<0, typename T::float_types>::type                  ;\n   int                                                                          s = eval_signbit(arg);\n   switch (eval_fpclassify(arg))\n   {\n   case FP_NAN:\n      result = arg;\n      errno  = EDOM;\n      return;\n   case FP_INFINITE:\n      if (s)\n         break;\n      result = arg;\n      return;\n   case FP_ZERO:\n      result = std::numeric_limits<number<T> >::has_infinity ? std::numeric_limits<number<T> >::infinity().backend() : (std::numeric_limits<number<T> >::max)().backend();\n      result.negate();\n      errno = ERANGE;\n      return;\n   }\n   if (s)\n   {\n      result = std::numeric_limits<number<T> >::quiet_NaN().backend();\n      errno  = EDOM;\n      return;\n   }\n\n   exp_type e;\n   T        t;\n   eval_frexp(t, arg, &e);\n   bool alternate = false;\n\n   if (t.compare(fp_type(2) / fp_type(3)) <= 0)\n   {\n      alternate = true;\n      eval_ldexp(t, t, 1);\n      --e;\n   }\n\n   eval_multiply(result, get_constant_ln2<T>(), canonical_exp_type(e));\n   INSTRUMENT_BACKEND(result);\n   eval_subtract(t, ui_type(1)); /* -0.3 <= t <= 0.3 */\n   if (!alternate)\n      t.negate(); /* 0 <= t <= 0.33333 */\n   T pow = t;\n   T lim;\n   T t2;\n\n   if (alternate)\n      eval_add(result, t);\n   else\n      eval_subtract(result, t);\n\n   BOOST_IF_CONSTEXPR(std::numeric_limits<number<T, et_on> >::is_specialized)\n      eval_multiply(lim, result, std::numeric_limits<number<T, et_on> >::epsilon().backend());\n   else\n      eval_ldexp(lim, result, 1 - boost::multiprecision::detail::digits2<number<T, et_on> >::value());\n   if (eval_get_sign(lim) < 0)\n      lim.negate();\n   INSTRUMENT_BACKEND(lim);\n\n   ui_type k = 1;\n   do\n   {\n      ++k;\n      eval_multiply(pow, t);\n      eval_divide(t2, pow, k);\n      INSTRUMENT_BACKEND(t2);\n      if (alternate && ((k & 1) != 0))\n         eval_add(result, t2);\n      else\n         eval_subtract(result, t2);\n      INSTRUMENT_BACKEND(result);\n   } while (lim.compare(t2) < 0);\n}\n\ntemplate <class T>\nconst T& get_constant_log10()\n{\n   static BOOST_MP_THREAD_LOCAL T             result;\n   static BOOST_MP_THREAD_LOCAL long digits = 0;\n   if ((digits != boost::multiprecision::detail::digits2<number<T> >::value()))\n   {\n      using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;\n      T                                                                            ten;\n      ten = ui_type(10u);\n      eval_log(result, ten);\n      digits = boost::multiprecision::detail::digits2<number<T> >::value();\n   }\n\n   return result;\n}\n\ntemplate <class T>\nvoid eval_log10(T& result, const T& arg)\n{\n   static_assert(number_category<T>::value == number_kind_floating_point, \"The log10 function is only valid for floating point types.\");\n   eval_log(result, arg);\n   eval_divide(result, get_constant_log10<T>());\n}\n\ntemplate <class R, class T>\ninline void eval_log2(R& result, const T& a)\n{\n   eval_log(result, a);\n   eval_divide(result, get_constant_ln2<R>());\n}\n\ntemplate <typename T>\ninline void eval_pow(T& result, const T& x, const T& a)\n{\n   static_assert(number_category<T>::value == number_kind_floating_point, \"The pow function is only valid for floating point types.\");\n   using si_type = typename boost::multiprecision::detail::canonical<int, T>::type;\n   using fp_type = typename std::tuple_element<0, typename T::float_types>::type             ;\n\n   if ((&result == &x) || (&result == &a))\n   {\n      T t;\n      eval_pow(t, x, a);\n      result = t;\n      return;\n   }\n\n   if ((a.compare(si_type(1)) == 0) || (x.compare(si_type(1)) == 0))\n   {\n      result = x;\n      return;\n   }\n   if (a.compare(si_type(0)) == 0)\n   {\n      result = si_type(1);\n      return;\n   }\n\n   int type = eval_fpclassify(x);\n\n   switch (type)\n   {\n   case FP_ZERO:\n      switch (eval_fpclassify(a))\n      {\n      case FP_ZERO:\n         result = si_type(1);\n         break;\n      case FP_NAN:\n         result = a;\n         break;\n      case FP_NORMAL: {\n         // Need to check for a an odd integer as a special case:\n         BOOST_MP_TRY\n         {\n            typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type i;\n            eval_convert_to(&i, a);\n            if (a.compare(i) == 0)\n            {\n               if (eval_signbit(a))\n               {\n                  if (i & 1)\n                  {\n                     result = std::numeric_limits<number<T> >::infinity().backend();\n                     if (eval_signbit(x))\n                        result.negate();\n                     errno = ERANGE;\n                  }\n                  else\n                  {\n                     result = std::numeric_limits<number<T> >::infinity().backend();\n                     errno  = ERANGE;\n                  }\n               }\n               else if (i & 1)\n               {\n                  result = x;\n               }\n               else\n                  result = si_type(0);\n               return;\n            }\n         }\n         BOOST_MP_CATCH(const std::exception&)\n         {\n            // fallthrough..\n         }\n         BOOST_MP_CATCH_END\n         BOOST_FALLTHROUGH;\n      }\n      default:\n         if (eval_signbit(a))\n         {\n            result = std::numeric_limits<number<T> >::infinity().backend();\n            errno  = ERANGE;\n         }\n         else\n            result = x;\n         break;\n      }\n      return;\n   case FP_NAN:\n      result = x;\n      errno  = ERANGE;\n      return;\n   default:;\n   }\n\n   int s = eval_get_sign(a);\n   if (s == 0)\n   {\n      result = si_type(1);\n      return;\n   }\n\n   if (s < 0)\n   {\n      T t, da;\n      t = a;\n      t.negate();\n      eval_pow(da, x, t);\n      eval_divide(result, si_type(1), da);\n      return;\n   }\n\n   typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type an;\n   typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type max_an =\n       std::numeric_limits<typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type>::is_specialized ? (std::numeric_limits<typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type>::max)() : static_cast<typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type>(1) << (sizeof(typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type) * CHAR_BIT - 2);\n   typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type min_an =\n       std::numeric_limits<typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type>::is_specialized ? (std::numeric_limits<typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type>::min)() : -min_an;\n\n   T fa;\n   BOOST_MP_TRY\n   {\n      eval_convert_to(&an, a);\n      if (a.compare(an) == 0)\n      {\n         detail::pow_imp(result, x, an, std::integral_constant<bool, true>());\n         return;\n      }\n   }\n   BOOST_MP_CATCH(const std::exception&)\n   {\n      // conversion failed, just fall through, value is not an integer.\n      an = (std::numeric_limits<std::intmax_t>::max)();\n   }\n   BOOST_MP_CATCH_END\n   if ((eval_get_sign(x) < 0))\n   {\n      typename boost::multiprecision::detail::canonical<std::uintmax_t, T>::type aun;\n      BOOST_MP_TRY\n      {\n         eval_convert_to(&aun, a);\n         if (a.compare(aun) == 0)\n         {\n            fa = x;\n            fa.negate();\n            eval_pow(result, fa, a);\n            if (aun & 1u)\n               result.negate();\n            return;\n         }\n      }\n      BOOST_MP_CATCH(const std::exception&)\n      {\n         // conversion failed, just fall through, value is not an integer.\n      }\n      BOOST_MP_CATCH_END\n\n      eval_floor(result, a);\n      // -1^INF is a special case in C99:\n      if ((x.compare(si_type(-1)) == 0) && (eval_fpclassify(a) == FP_INFINITE))\n      {\n         result = si_type(1);\n      }\n      else if (a.compare(result) == 0)\n      {\n         // exponent is so large we have no fractional part:\n         if (x.compare(si_type(-1)) < 0)\n         {\n            result = std::numeric_limits<number<T, et_on> >::infinity().backend();\n         }\n         else\n         {\n            result = si_type(0);\n         }\n      }\n      else if (type == FP_INFINITE)\n      {\n         result = std::numeric_limits<number<T, et_on> >::infinity().backend();\n      }\n      else BOOST_IF_CONSTEXPR (std::numeric_limits<number<T, et_on> >::has_quiet_NaN)\n      {\n         result = std::numeric_limits<number<T, et_on> >::quiet_NaN().backend();\n         errno  = EDOM;\n      }\n      else\n      {\n         BOOST_MP_THROW_EXCEPTION(std::domain_error(\"Result of pow is undefined or non-real and there is no NaN for this number type.\"));\n      }\n      return;\n   }\n\n   T t, da;\n\n   eval_subtract(da, a, an);\n\n   if ((x.compare(fp_type(0.5)) >= 0) && (x.compare(fp_type(0.9)) < 0) && (an < max_an) && (an > min_an))\n   {\n      if (a.compare(fp_type(1e-5f)) <= 0)\n      {\n         // Series expansion for small a.\n         eval_log(t, x);\n         eval_multiply(t, a);\n         hyp0F0(result, t);\n         return;\n      }\n      else\n      {\n         // Series expansion for moderately sized x. Note that for large power of a,\n         // the power of the integer part of a is calculated using the pown function.\n         if (an)\n         {\n            da.negate();\n            t = si_type(1);\n            eval_subtract(t, x);\n            hyp1F0(result, da, t);\n            detail::pow_imp(t, x, an, std::integral_constant<bool, true>());\n            eval_multiply(result, t);\n         }\n         else\n         {\n            da = a;\n            da.negate();\n            t = si_type(1);\n            eval_subtract(t, x);\n            hyp1F0(result, da, t);\n         }\n      }\n   }\n   else\n   {\n      // Series expansion for pow(x, a). Note that for large power of a, the power\n      // of the integer part of a is calculated using the pown function.\n      if (an)\n      {\n         eval_log(t, x);\n         eval_multiply(t, da);\n         eval_exp(result, t);\n         detail::pow_imp(t, x, an, std::integral_constant<bool, true>());\n         eval_multiply(result, t);\n      }\n      else\n      {\n         eval_log(t, x);\n         eval_multiply(t, a);\n         eval_exp(result, t);\n      }\n   }\n}\n\ntemplate <class T, class A>\n#if BOOST_WORKAROUND(BOOST_MSVC, < 1800)\ninline typename std::enable_if<!boost::multiprecision::detail::is_integral<A>::value, void>::type\n#else\ninline typename std::enable_if<is_compatible_arithmetic_type<A, number<T> >::value && !boost::multiprecision::detail::is_integral<A>::value, void>::type\n#endif\neval_pow(T& result, const T& x, const A& a)\n{\n   // Note this one is restricted to float arguments since pow.hpp already has a version for\n   // integer powers....\n   using canonical_type = typename boost::multiprecision::detail::canonical<A, T>::type         ;\n   using cast_type = typename std::conditional<std::is_same<A, canonical_type>::value, T, canonical_type>::type;\n   cast_type                                                                      c;\n   c = a;\n   eval_pow(result, x, c);\n}\n\ntemplate <class T, class A>\n#if BOOST_WORKAROUND(BOOST_MSVC, < 1800)\ninline void\n#else\ninline typename std::enable_if<is_compatible_arithmetic_type<A, number<T> >::value, void>::type\n#endif\neval_pow(T& result, const A& x, const T& a)\n{\n   using canonical_type = typename boost::multiprecision::detail::canonical<A, T>::type         ;\n   using cast_type = typename std::conditional<std::is_same<A, canonical_type>::value, T, canonical_type>::type;\n   cast_type                                                                      c;\n   c = x;\n   eval_pow(result, c, a);\n}\n\ntemplate <class T>\nvoid eval_exp2(T& result, const T& arg)\n{\n   static_assert(number_category<T>::value == number_kind_floating_point, \"The log function is only valid for floating point types.\");\n\n   // Check for pure-integer arguments which can be either signed or unsigned.\n   typename boost::multiprecision::detail::canonical<typename T::exponent_type, T>::type i;\n   T                                                                                     temp;\n   BOOST_MP_TRY\n   {\n      eval_trunc(temp, arg);\n      eval_convert_to(&i, temp);\n      if (arg.compare(i) == 0)\n      {\n         temp = static_cast<typename std::tuple_element<0, typename T::unsigned_types>::type>(1u);\n         eval_ldexp(result, temp, i);\n         return;\n      }\n   }\n   #ifdef BOOST_MP_MATH_AVAILABLE\n   BOOST_MP_CATCH(const boost::math::rounding_error&)\n   { /* Fallthrough */\n   }\n   #endif\n   BOOST_MP_CATCH(const std::runtime_error&)\n   { /* Fallthrough */\n   }\n   BOOST_MP_CATCH_END\n\n   temp = static_cast<typename std::tuple_element<0, typename T::unsigned_types>::type>(2u);\n   eval_pow(result, temp, arg);\n}\n\nnamespace detail {\n\ntemplate <class T>\nvoid small_sinh_series(T x, T& result)\n{\n   using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;\n   bool                                                                         neg = eval_get_sign(x) < 0;\n   if (neg)\n      x.negate();\n   T p(x);\n   T mult(x);\n   eval_multiply(mult, x);\n   result    = x;\n   ui_type k = 1;\n\n   T lim(x);\n   eval_ldexp(lim, lim, 1 - boost::multiprecision::detail::digits2<number<T, et_on> >::value());\n\n   do\n   {\n      eval_multiply(p, mult);\n      eval_divide(p, ++k);\n      eval_divide(p, ++k);\n      eval_add(result, p);\n   } while (p.compare(lim) >= 0);\n   if (neg)\n      result.negate();\n}\n\ntemplate <class T>\nvoid sinhcosh(const T& x, T* p_sinh, T* p_cosh)\n{\n   using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;\n   using fp_type = typename std::tuple_element<0, typename T::float_types>::type                  ;\n\n   switch (eval_fpclassify(x))\n   {\n   case FP_NAN:\n      errno = EDOM;\n      // fallthrough...\n   case FP_INFINITE:\n      if (p_sinh)\n         *p_sinh = x;\n      if (p_cosh)\n      {\n         *p_cosh = x;\n         if (eval_get_sign(x) < 0)\n            p_cosh->negate();\n      }\n      return;\n   case FP_ZERO:\n      if (p_sinh)\n         *p_sinh = x;\n      if (p_cosh)\n         *p_cosh = ui_type(1);\n      return;\n   default:;\n   }\n\n   bool small_sinh = eval_get_sign(x) < 0 ? x.compare(fp_type(-0.5)) > 0 : x.compare(fp_type(0.5)) < 0;\n\n   if (p_cosh || !small_sinh)\n   {\n      T e_px, e_mx;\n      eval_exp(e_px, x);\n      eval_divide(e_mx, ui_type(1), e_px);\n      if (eval_signbit(e_mx) != eval_signbit(e_px))\n         e_mx.negate(); // Handles lack of signed zero in some types\n\n      if (p_sinh)\n      {\n         if (small_sinh)\n         {\n            small_sinh_series(x, *p_sinh);\n         }\n         else\n         {\n            eval_subtract(*p_sinh, e_px, e_mx);\n            eval_ldexp(*p_sinh, *p_sinh, -1);\n         }\n      }\n      if (p_cosh)\n      {\n         eval_add(*p_cosh, e_px, e_mx);\n         eval_ldexp(*p_cosh, *p_cosh, -1);\n      }\n   }\n   else\n   {\n      small_sinh_series(x, *p_sinh);\n   }\n}\n\n} // namespace detail\n\ntemplate <class T>\ninline void eval_sinh(T& result, const T& x)\n{\n   static_assert(number_category<T>::value == number_kind_floating_point, \"The sinh function is only valid for floating point types.\");\n   detail::sinhcosh(x, &result, static_cast<T*>(0));\n}\n\ntemplate <class T>\ninline void eval_cosh(T& result, const T& x)\n{\n   static_assert(number_category<T>::value == number_kind_floating_point, \"The cosh function is only valid for floating point types.\");\n   detail::sinhcosh(x, static_cast<T*>(0), &result);\n}\n\ntemplate <class T>\ninline void eval_tanh(T& result, const T& x)\n{\n   static_assert(number_category<T>::value == number_kind_floating_point, \"The tanh function is only valid for floating point types.\");\n   T c;\n   detail::sinhcosh(x, &result, &c);\n   if ((eval_fpclassify(result) == FP_INFINITE) && (eval_fpclassify(c) == FP_INFINITE))\n   {\n      bool s = eval_signbit(result) != eval_signbit(c);\n      result = static_cast<typename std::tuple_element<0, typename T::unsigned_types>::type>(1u);\n      if (s)\n         result.negate();\n      return;\n   }\n   eval_divide(result, c);\n}\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/functions/trig.hpp",
    "content": "\n// Copyright Christopher Kormanyos 2002 - 2011.\n// Copyright 2011 John Maddock.\n// Distributed under the Boost Software License, Version 1.0.\n//    (See accompanying file LICENSE_1_0.txt or copy at\n//          http://www.boost.org/LICENSE_1_0.txt)\n\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n//\n// This file has no include guards or namespaces - it's expanded inline inside default_ops.hpp\n//\n\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 6326) // comparison of two constants\n#pragma warning(disable : 4127) // conditional expression is constant\n#endif\n\ntemplate <class T>\nvoid hyp0F1(T& result, const T& b, const T& x)\n{\n   using si_type = typename boost::multiprecision::detail::canonical<std::int32_t, T>::type ;\n   using ui_type = typename boost::multiprecision::detail::canonical<std::uint32_t, T>::type;\n\n   // Compute the series representation of Hypergeometric0F1 taken from\n   // http://functions.wolfram.com/HypergeometricFunctions/Hypergeometric0F1/06/01/01/\n   // There are no checks on input range or parameter boundaries.\n\n   T x_pow_n_div_n_fact(x);\n   T pochham_b(b);\n   T bp(b);\n\n   eval_divide(result, x_pow_n_div_n_fact, pochham_b);\n   eval_add(result, ui_type(1));\n\n   si_type n;\n\n   T tol;\n   tol = ui_type(1);\n   eval_ldexp(tol, tol, 1 - boost::multiprecision::detail::digits2<number<T, et_on> >::value());\n   eval_multiply(tol, result);\n   if (eval_get_sign(tol) < 0)\n      tol.negate();\n   T term;\n\n   const int series_limit =\n       boost::multiprecision::detail::digits2<number<T, et_on> >::value() < 100\n           ? 100\n           : boost::multiprecision::detail::digits2<number<T, et_on> >::value();\n   // Series expansion of hyperg_0f1(; b; x).\n   for (n = 2; n < series_limit; ++n)\n   {\n      eval_multiply(x_pow_n_div_n_fact, x);\n      eval_divide(x_pow_n_div_n_fact, n);\n      eval_increment(bp);\n      eval_multiply(pochham_b, bp);\n\n      eval_divide(term, x_pow_n_div_n_fact, pochham_b);\n      eval_add(result, term);\n\n      bool neg_term = eval_get_sign(term) < 0;\n      if (neg_term)\n         term.negate();\n      if (term.compare(tol) <= 0)\n         break;\n   }\n\n   if (n >= series_limit)\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"H0F1 Failed to Converge\"));\n}\n\ntemplate <class T, unsigned N, bool b = boost::multiprecision::detail::is_variable_precision<boost::multiprecision::number<T> >::value>\nstruct scoped_N_precision\n{\n   template <class U>\n   scoped_N_precision(U const&) {}\n   template <class U>\n   void reduce(U&) {}\n};\n\ntemplate <class T, unsigned N>\nstruct scoped_N_precision<T, N, true>\n{\n   unsigned old_precision, old_arg_precision;\n   scoped_N_precision(T& arg)\n   {\n      old_precision     = T::thread_default_precision();\n      old_arg_precision = arg.precision();\n      T::thread_default_precision(old_arg_precision * N);\n      arg.precision(old_arg_precision * N);\n   }\n   ~scoped_N_precision()\n   {\n      T::thread_default_precision(old_precision);\n   }\n   void reduce(T& arg) \n   {\n      arg.precision(old_arg_precision);\n   }\n};\n\ntemplate <class T>\nvoid reduce_n_half_pi(T& arg, const T& n, bool go_down)\n{\n   //\n   // We need to perform argument reduction at 3 times the precision of arg\n   // in order to ensure a correct result up to arg = 1/epsilon.  Beyond that\n   // the value of n will have been incorrectly calculated anyway since it will\n   // have a value greater than 1/epsilon and no longer be an exact integer value.\n   //\n   // More information in ARGUMENT REDUCTION FOR HUGE ARGUMENTS. K C Ng.\n   //\n   // There are two mutually exclusive ways to achieve this, both of which are \n   // supported here:\n   // 1) To define a fixed precision type with 3 times the precision for the calculation.\n   // 2) To dynamically increase the precision of the variables.\n   //\n   using reduction_type = typename boost::multiprecision::detail::transcendental_reduction_type<T>::type;\n   //\n   // Make a copy of the arg at higher precision:\n   //\n   reduction_type big_arg(arg);\n   //\n   // Dynamically increase precision when supported, this increases the default\n   // and ups the precision of big_arg to match:\n   //\n   scoped_N_precision<T, 3> scoped_precision(big_arg);\n   //\n   // High precision PI:\n   //\n   reduction_type reduction = get_constant_pi<reduction_type>();\n   eval_ldexp(reduction, reduction, -1); // divide by 2\n   eval_multiply(reduction, n);\n\n   BOOST_MATH_INSTRUMENT_CODE(big_arg.str(10, std::ios_base::scientific));\n   BOOST_MATH_INSTRUMENT_CODE(reduction.str(10, std::ios_base::scientific));\n\n   if (go_down)\n      eval_subtract(big_arg, reduction, big_arg);\n   else\n      eval_subtract(big_arg, reduction);\n   arg = T(big_arg);\n   //\n   // If arg is a variable precision type, then we have just copied the\n   // precision of big_arg s well it's value.  Reduce the precision now:\n   //\n   scoped_precision.reduce(arg);\n   BOOST_MATH_INSTRUMENT_CODE(big_arg.str(10, std::ios_base::scientific));\n   BOOST_MATH_INSTRUMENT_CODE(arg.str(10, std::ios_base::scientific));\n}\n\ntemplate <class T>\nvoid eval_sin(T& result, const T& x)\n{\n   static_assert(number_category<T>::value == number_kind_floating_point, \"The sin function is only valid for floating point types.\");\n   BOOST_MATH_INSTRUMENT_CODE(x.str(0, std::ios_base::scientific));\n   if (&result == &x)\n   {\n      T temp;\n      eval_sin(temp, x);\n      result = temp;\n      return;\n   }\n\n   using si_type = typename boost::multiprecision::detail::canonical<std::int32_t, T>::type ;\n   using ui_type = typename boost::multiprecision::detail::canonical<std::uint32_t, T>::type;\n   using fp_type = typename std::tuple_element<0, typename T::float_types>::type                         ;\n\n   switch (eval_fpclassify(x))\n   {\n   case FP_INFINITE:\n   case FP_NAN:\n      BOOST_IF_CONSTEXPR(std::numeric_limits<number<T, et_on> >::has_quiet_NaN)\n      {\n         result = std::numeric_limits<number<T, et_on> >::quiet_NaN().backend();\n         errno  = EDOM;\n      }\n      else\n         BOOST_MP_THROW_EXCEPTION(std::domain_error(\"Result is undefined or complex and there is no NaN for this number type.\"));\n      return;\n   case FP_ZERO:\n      result = x;\n      return;\n   default:;\n   }\n\n   // Local copy of the argument\n   T xx = x;\n\n   // Analyze and prepare the phase of the argument.\n   // Make a local, positive copy of the argument, xx.\n   // The argument xx will be reduced to 0 <= xx <= pi/2.\n   bool b_negate_sin = false;\n\n   if (eval_get_sign(x) < 0)\n   {\n      xx.negate();\n      b_negate_sin = !b_negate_sin;\n   }\n\n   T n_pi, t;\n   T half_pi = get_constant_pi<T>();\n   eval_ldexp(half_pi, half_pi, -1); // divide by 2\n   // Remove multiples of pi/2.\n   if (xx.compare(half_pi) > 0)\n   {\n      eval_divide(n_pi, xx, half_pi);\n      eval_trunc(n_pi, n_pi);\n      t = ui_type(4);\n      eval_fmod(t, n_pi, t);\n      bool b_go_down = false;\n      if (t.compare(ui_type(1)) == 0)\n      {\n         b_go_down = true;\n      }\n      else if (t.compare(ui_type(2)) == 0)\n      {\n         b_negate_sin = !b_negate_sin;\n      }\n      else if (t.compare(ui_type(3)) == 0)\n      {\n         b_negate_sin = !b_negate_sin;\n         b_go_down    = true;\n      }\n\n      if (b_go_down)\n         eval_increment(n_pi);\n      //\n      // If n_pi is > 1/epsilon, then it is no longer an exact integer value\n      // but an approximation.  As a result we can no longer reliably reduce\n      // xx to 0 <= xx < pi/2, nor can we tell the sign of the result as we need\n      // n_pi % 4 for that, but that will always be zero in this situation.\n      // We could use a higher precision type for n_pi, along with division at\n      // higher precision, but that's rather expensive.  So for now we do not support\n      // this, and will see if anyone complains and has a legitimate use case.\n      //\n      if (n_pi.compare(get_constant_one_over_epsilon<T>()) > 0)\n      {\n         result = ui_type(0);\n         return;\n      }\n\n      reduce_n_half_pi(xx, n_pi, b_go_down);\n      //\n      // Post reduction we may be a few ulp below zero or above pi/2\n      // given that n_pi was calculated at working precision and not\n      // at the higher precision used for reduction.  Correct that now:\n      //\n      if (eval_get_sign(xx) < 0)\n      {\n         xx.negate();\n         b_negate_sin = !b_negate_sin;\n      }\n      if (xx.compare(half_pi) > 0)\n      {\n         eval_ldexp(half_pi, half_pi, 1);\n         eval_subtract(xx, half_pi, xx);\n         eval_ldexp(half_pi, half_pi, -1);\n         b_go_down = !b_go_down;\n      }\n\n      BOOST_MATH_INSTRUMENT_CODE(xx.str(0, std::ios_base::scientific));\n      BOOST_MATH_INSTRUMENT_CODE(n_pi.str(0, std::ios_base::scientific));\n      BOOST_MP_ASSERT(xx.compare(half_pi) <= 0);\n      BOOST_MP_ASSERT(xx.compare(ui_type(0)) >= 0);\n   }\n\n   t = half_pi;\n   eval_subtract(t, xx);\n\n   const bool b_zero    = eval_get_sign(xx) == 0;\n   const bool b_pi_half = eval_get_sign(t) == 0;\n\n   BOOST_MATH_INSTRUMENT_CODE(xx.str(0, std::ios_base::scientific));\n   BOOST_MATH_INSTRUMENT_CODE(t.str(0, std::ios_base::scientific));\n\n   // Check if the reduced argument is very close to 0 or pi/2.\n   const bool b_near_zero    = xx.compare(fp_type(1e-1)) < 0;\n   const bool b_near_pi_half = t.compare(fp_type(1e-1)) < 0;\n\n   if (b_zero)\n   {\n      result = ui_type(0);\n   }\n   else if (b_pi_half)\n   {\n      result = ui_type(1);\n   }\n   else if (b_near_zero)\n   {\n      eval_multiply(t, xx, xx);\n      eval_divide(t, si_type(-4));\n      T t2;\n      t2 = fp_type(1.5);\n      hyp0F1(result, t2, t);\n      BOOST_MATH_INSTRUMENT_CODE(result.str(0, std::ios_base::scientific));\n      eval_multiply(result, xx);\n   }\n   else if (b_near_pi_half)\n   {\n      eval_multiply(t, t);\n      eval_divide(t, si_type(-4));\n      T t2;\n      t2 = fp_type(0.5);\n      hyp0F1(result, t2, t);\n      BOOST_MATH_INSTRUMENT_CODE(result.str(0, std::ios_base::scientific));\n   }\n   else\n   {\n      // Scale to a small argument for an efficient Taylor series,\n      // implemented as a hypergeometric function. Use a standard\n      // divide by three identity a certain number of times.\n      // Here we use division by 3^9 --> (19683 = 3^9).\n\n      constexpr si_type n_scale           = 9;\n      constexpr si_type n_three_pow_scale = static_cast<si_type>(19683L);\n\n      eval_divide(xx, n_three_pow_scale);\n\n      // Now with small arguments, we are ready for a series expansion.\n      eval_multiply(t, xx, xx);\n      eval_divide(t, si_type(-4));\n      T t2;\n      t2 = fp_type(1.5);\n      hyp0F1(result, t2, t);\n      BOOST_MATH_INSTRUMENT_CODE(result.str(0, std::ios_base::scientific));\n      eval_multiply(result, xx);\n\n      // Convert back using multiple angle identity.\n      for (std::int32_t k = static_cast<std::int32_t>(0); k < n_scale; k++)\n      {\n         // Rescale the cosine value using the multiple angle identity.\n         eval_multiply(t2, result, ui_type(3));\n         eval_multiply(t, result, result);\n         eval_multiply(t, result);\n         eval_multiply(t, ui_type(4));\n         eval_subtract(result, t2, t);\n      }\n   }\n\n   if (b_negate_sin)\n      result.negate();\n   BOOST_MATH_INSTRUMENT_CODE(result.str(0, std::ios_base::scientific));\n}\n\ntemplate <class T>\nvoid eval_cos(T& result, const T& x)\n{\n   static_assert(number_category<T>::value == number_kind_floating_point, \"The cos function is only valid for floating point types.\");\n   if (&result == &x)\n   {\n      T temp;\n      eval_cos(temp, x);\n      result = temp;\n      return;\n   }\n\n   using si_type = typename boost::multiprecision::detail::canonical<std::int32_t, T>::type ;\n   using ui_type = typename boost::multiprecision::detail::canonical<std::uint32_t, T>::type;\n\n   switch (eval_fpclassify(x))\n   {\n   case FP_INFINITE:\n   case FP_NAN:\n      BOOST_IF_CONSTEXPR(std::numeric_limits<number<T, et_on> >::has_quiet_NaN)\n      {\n         result = std::numeric_limits<number<T, et_on> >::quiet_NaN().backend();\n         errno  = EDOM;\n      }\n      else\n         BOOST_MP_THROW_EXCEPTION(std::domain_error(\"Result is undefined or complex and there is no NaN for this number type.\"));\n      return;\n   case FP_ZERO:\n      result = ui_type(1);\n      return;\n   default:;\n   }\n\n   // Local copy of the argument\n   T xx = x;\n\n   // Analyze and prepare the phase of the argument.\n   // Make a local, positive copy of the argument, xx.\n   // The argument xx will be reduced to 0 <= xx <= pi/2.\n   bool b_negate_cos = false;\n\n   if (eval_get_sign(x) < 0)\n   {\n      xx.negate();\n   }\n   BOOST_MATH_INSTRUMENT_CODE(xx.str(0, std::ios_base::scientific));\n\n   T n_pi, t;\n   T half_pi = get_constant_pi<T>();\n   eval_ldexp(half_pi, half_pi, -1); // divide by 2\n   // Remove even multiples of pi.\n   if (xx.compare(half_pi) > 0)\n   {\n      eval_divide(t, xx, half_pi);\n      eval_trunc(n_pi, t);\n      //\n      // If n_pi is > 1/epsilon, then it is no longer an exact integer value\n      // but an approximation.  As a result we can no longer reliably reduce\n      // xx to 0 <= xx < pi/2, nor can we tell the sign of the result as we need\n      // n_pi % 4 for that, but that will always be zero in this situation.\n      // We could use a higher precision type for n_pi, along with division at\n      // higher precision, but that's rather expensive.  So for now we do not support\n      // this, and will see if anyone complains and has a legitimate use case.\n      //\n      if (n_pi.compare(get_constant_one_over_epsilon<T>()) > 0)\n      {\n         result = ui_type(1);\n         return;\n      }\n      BOOST_MATH_INSTRUMENT_CODE(n_pi.str(0, std::ios_base::scientific));\n      t = ui_type(4);\n      eval_fmod(t, n_pi, t);\n\n      bool b_go_down = false;\n      if (t.compare(ui_type(0)) == 0)\n      {\n         b_go_down = true;\n      }\n      else if (t.compare(ui_type(1)) == 0)\n      {\n         b_negate_cos = true;\n      }\n      else if (t.compare(ui_type(2)) == 0)\n      {\n         b_go_down    = true;\n         b_negate_cos = true;\n      }\n      else\n      {\n         BOOST_MP_ASSERT(t.compare(ui_type(3)) == 0);\n      }\n\n      if (b_go_down)\n         eval_increment(n_pi);\n\n      reduce_n_half_pi(xx, n_pi, b_go_down);\n      //\n      // Post reduction we may be a few ulp below zero or above pi/2\n      // given that n_pi was calculated at working precision and not\n      // at the higher precision used for reduction.  Correct that now:\n      //\n      if (eval_get_sign(xx) < 0)\n      {\n         xx.negate();\n         b_negate_cos = !b_negate_cos;\n      }\n      if (xx.compare(half_pi) > 0)\n      {\n         eval_ldexp(half_pi, half_pi, 1);\n         eval_subtract(xx, half_pi, xx);\n         eval_ldexp(half_pi, half_pi, -1);\n      }\n      BOOST_MP_ASSERT(xx.compare(half_pi) <= 0);\n      BOOST_MP_ASSERT(xx.compare(ui_type(0)) >= 0);\n   }\n   else\n   {\n      n_pi = ui_type(1);\n      reduce_n_half_pi(xx, n_pi, true);\n   }\n\n   const bool b_zero = eval_get_sign(xx) == 0;\n\n   if (b_zero)\n   {\n      result = si_type(0);\n   }\n   else\n   {\n      eval_sin(result, xx);\n   }\n   if (b_negate_cos)\n      result.negate();\n   BOOST_MATH_INSTRUMENT_CODE(result.str(0, std::ios_base::scientific));\n}\n\ntemplate <class T>\nvoid eval_tan(T& result, const T& x)\n{\n   static_assert(number_category<T>::value == number_kind_floating_point, \"The tan function is only valid for floating point types.\");\n   if (&result == &x)\n   {\n      T temp;\n      eval_tan(temp, x);\n      result = temp;\n      return;\n   }\n   T t;\n   eval_sin(result, x);\n   eval_cos(t, x);\n   eval_divide(result, t);\n}\n\ntemplate <class T>\nvoid hyp2F1(T& result, const T& a, const T& b, const T& c, const T& x)\n{\n   // Compute the series representation of hyperg_2f1 taken from\n   // Abramowitz and Stegun 15.1.1.\n   // There are no checks on input range or parameter boundaries.\n\n   using ui_type = typename boost::multiprecision::detail::canonical<std::uint32_t, T>::type;\n\n   T x_pow_n_div_n_fact(x);\n   T pochham_a(a);\n   T pochham_b(b);\n   T pochham_c(c);\n   T ap(a);\n   T bp(b);\n   T cp(c);\n\n   eval_multiply(result, pochham_a, pochham_b);\n   eval_divide(result, pochham_c);\n   eval_multiply(result, x_pow_n_div_n_fact);\n   eval_add(result, ui_type(1));\n\n   T lim;\n   eval_ldexp(lim, result, 1 - boost::multiprecision::detail::digits2<number<T, et_on> >::value());\n\n   if (eval_get_sign(lim) < 0)\n      lim.negate();\n\n   ui_type n;\n   T       term;\n\n   const unsigned series_limit =\n       boost::multiprecision::detail::digits2<number<T, et_on> >::value() < 100\n           ? 100\n           : boost::multiprecision::detail::digits2<number<T, et_on> >::value();\n   // Series expansion of hyperg_2f1(a, b; c; x).\n   for (n = 2; n < series_limit; ++n)\n   {\n      eval_multiply(x_pow_n_div_n_fact, x);\n      eval_divide(x_pow_n_div_n_fact, n);\n\n      eval_increment(ap);\n      eval_multiply(pochham_a, ap);\n      eval_increment(bp);\n      eval_multiply(pochham_b, bp);\n      eval_increment(cp);\n      eval_multiply(pochham_c, cp);\n\n      eval_multiply(term, pochham_a, pochham_b);\n      eval_divide(term, pochham_c);\n      eval_multiply(term, x_pow_n_div_n_fact);\n      eval_add(result, term);\n\n      if (eval_get_sign(term) < 0)\n         term.negate();\n      if (lim.compare(term) >= 0)\n         break;\n   }\n   if (n > series_limit)\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"H2F1 failed to converge.\"));\n}\n\ntemplate <class T>\nvoid eval_asin(T& result, const T& x)\n{\n   static_assert(number_category<T>::value == number_kind_floating_point, \"The asin function is only valid for floating point types.\");\n   using ui_type = typename boost::multiprecision::detail::canonical<std::uint32_t, T>::type;\n   using fp_type = typename std::tuple_element<0, typename T::float_types>::type                         ;\n\n   if (&result == &x)\n   {\n      T t(x);\n      eval_asin(result, t);\n      return;\n   }\n\n   switch (eval_fpclassify(x))\n   {\n   case FP_NAN:\n   case FP_INFINITE:\n      BOOST_IF_CONSTEXPR(std::numeric_limits<number<T, et_on> >::has_quiet_NaN)\n      {\n         result = std::numeric_limits<number<T, et_on> >::quiet_NaN().backend();\n         errno  = EDOM;\n      }\n      else\n         BOOST_MP_THROW_EXCEPTION(std::domain_error(\"Result is undefined or complex and there is no NaN for this number type.\"));\n      return;\n   case FP_ZERO:\n      result = x;\n      return;\n   default:;\n   }\n\n   const bool b_neg = eval_get_sign(x) < 0;\n\n   T xx(x);\n   if (b_neg)\n      xx.negate();\n\n   int c = xx.compare(ui_type(1));\n   if (c > 0)\n   {\n      BOOST_IF_CONSTEXPR(std::numeric_limits<number<T, et_on> >::has_quiet_NaN)\n      {\n         result = std::numeric_limits<number<T, et_on> >::quiet_NaN().backend();\n         errno  = EDOM;\n      }\n      else\n         BOOST_MP_THROW_EXCEPTION(std::domain_error(\"Result is undefined or complex and there is no NaN for this number type.\"));\n      return;\n   }\n   else if (c == 0)\n   {\n      result = get_constant_pi<T>();\n      eval_ldexp(result, result, -1);\n      if (b_neg)\n         result.negate();\n      return;\n   }\n\n   if (xx.compare(fp_type(1e-3)) < 0)\n   {\n      // http://functions.wolfram.com/ElementaryFunctions/ArcSin/26/01/01/\n      eval_multiply(xx, xx);\n      T t1, t2;\n      t1 = fp_type(0.5f);\n      t2 = fp_type(1.5f);\n      hyp2F1(result, t1, t1, t2, xx);\n      eval_multiply(result, x);\n      return;\n   }\n   else if (xx.compare(fp_type(1 - 5e-2f)) > 0)\n   {\n      // http://functions.wolfram.com/ElementaryFunctions/ArcSin/26/01/01/\n      // This branch is simlilar in complexity to Newton iterations down to\n      // the above limit.  It is *much* more accurate.\n      T dx1;\n      T t1, t2;\n      eval_subtract(dx1, ui_type(1), xx);\n      t1 = fp_type(0.5f);\n      t2 = fp_type(1.5f);\n      eval_ldexp(dx1, dx1, -1);\n      hyp2F1(result, t1, t1, t2, dx1);\n      eval_ldexp(dx1, dx1, 2);\n      eval_sqrt(t1, dx1);\n      eval_multiply(result, t1);\n      eval_ldexp(t1, get_constant_pi<T>(), -1);\n      result.negate();\n      eval_add(result, t1);\n      if (b_neg)\n         result.negate();\n      return;\n   }\n#ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS\n   using guess_type = typename boost::multiprecision::detail::canonical<long double, T>::type;\n#else\n   using guess_type = fp_type;\n#endif\n   // Get initial estimate using standard math function asin.\n   guess_type dd;\n   eval_convert_to(&dd, xx);\n\n   result = (guess_type)(std::asin(dd));\n\n   // Newton-Raphson iteration, we should double our precision with each iteration,\n   // in practice this seems to not quite work in all cases... so terminate when we\n   // have at least 2/3 of the digits correct on the assumption that the correction\n   // we've just added will finish the job...\n\n   std::intmax_t current_precision = eval_ilogb(result);\n   std::intmax_t target_precision  = std::numeric_limits<number<T> >::is_specialized ? \n      current_precision - 1 - (std::numeric_limits<number<T> >::digits * 2) / 3\n      : current_precision - 1 - (boost::multiprecision::detail::digits2<number<T> >::value() * 2) / 3;\n\n   // Newton-Raphson iteration\n   while (current_precision > target_precision)\n   {\n      T sine, cosine;\n      eval_sin(sine, result);\n      eval_cos(cosine, result);\n      eval_subtract(sine, xx);\n      eval_divide(sine, cosine);\n      eval_subtract(result, sine);\n      current_precision = eval_ilogb(sine);\n      if (current_precision <= (std::numeric_limits<typename T::exponent_type>::min)() + 1)\n         break;\n   }\n   if (b_neg)\n      result.negate();\n}\n\ntemplate <class T>\ninline void eval_acos(T& result, const T& x)\n{\n   static_assert(number_category<T>::value == number_kind_floating_point, \"The acos function is only valid for floating point types.\");\n   using ui_type = typename boost::multiprecision::detail::canonical<std::uint32_t, T>::type;\n\n   switch (eval_fpclassify(x))\n   {\n   case FP_NAN:\n   case FP_INFINITE:\n      BOOST_IF_CONSTEXPR(std::numeric_limits<number<T, et_on> >::has_quiet_NaN)\n      {\n         result = std::numeric_limits<number<T, et_on> >::quiet_NaN().backend();\n         errno  = EDOM;\n      }\n      else\n         BOOST_MP_THROW_EXCEPTION(std::domain_error(\"Result is undefined or complex and there is no NaN for this number type.\"));\n      return;\n   case FP_ZERO:\n      result = get_constant_pi<T>();\n      eval_ldexp(result, result, -1); // divide by two.\n      return;\n   }\n\n   T xx;\n   eval_abs(xx, x);\n   int c = xx.compare(ui_type(1));\n\n   if (c > 0)\n   {\n      BOOST_IF_CONSTEXPR(std::numeric_limits<number<T, et_on> >::has_quiet_NaN)\n      {\n         result = std::numeric_limits<number<T, et_on> >::quiet_NaN().backend();\n         errno  = EDOM;\n      }\n      else\n         BOOST_MP_THROW_EXCEPTION(std::domain_error(\"Result is undefined or complex and there is no NaN for this number type.\"));\n      return;\n   }\n   else if (c == 0)\n   {\n      if (eval_get_sign(x) < 0)\n         result = get_constant_pi<T>();\n      else\n         result = ui_type(0);\n      return;\n   }\n\n   using fp_type = typename std::tuple_element<0, typename T::float_types>::type;\n\n   if (xx.compare(fp_type(1e-3)) < 0)\n   {\n      // https://functions.wolfram.com/ElementaryFunctions/ArcCos/26/01/01/\n      eval_multiply(xx, xx);\n      T t1, t2;\n      t1 = fp_type(0.5f);\n      t2 = fp_type(1.5f);\n      hyp2F1(result, t1, t1, t2, xx);\n      eval_multiply(result, x);\n      eval_ldexp(t1, get_constant_pi<T>(), -1);\n      result.negate();\n      eval_add(result, t1);\n      return;\n   }\n   if (eval_get_sign(x) < 0)\n   {\n      eval_acos(result, xx);\n      result.negate();\n      eval_add(result, get_constant_pi<T>());\n      return;\n   }\n   else if (xx.compare(fp_type(0.85)) > 0)\n   {\n      // https://functions.wolfram.com/ElementaryFunctions/ArcCos/26/01/01/\n      // This branch is simlilar in complexity to Newton iterations down to\n      // the above limit.  It is *much* more accurate.\n      T dx1;\n      T t1, t2;\n      eval_subtract(dx1, ui_type(1), xx);\n      t1 = fp_type(0.5f);\n      t2 = fp_type(1.5f);\n      eval_ldexp(dx1, dx1, -1);\n      hyp2F1(result, t1, t1, t2, dx1);\n      eval_ldexp(dx1, dx1, 2);\n      eval_sqrt(t1, dx1);\n      eval_multiply(result, t1);\n      return;\n   }\n\n#ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS\n   using guess_type = typename boost::multiprecision::detail::canonical<long double, T>::type;\n#else\n   using guess_type = fp_type;\n#endif\n   // Get initial estimate using standard math function asin.\n   guess_type dd;\n   eval_convert_to(&dd, xx);\n\n   result = (guess_type)(std::acos(dd));\n\n   // Newton-Raphson iteration, we should double our precision with each iteration,\n   // in practice this seems to not quite work in all cases... so terminate when we\n   // have at least 2/3 of the digits correct on the assumption that the correction\n   // we've just added will finish the job...\n\n   std::intmax_t current_precision = eval_ilogb(result);\n   std::intmax_t target_precision = std::numeric_limits<number<T> >::is_specialized ?\n      current_precision - 1 - (std::numeric_limits<number<T> >::digits * 2) / 3\n      : current_precision - 1 - (boost::multiprecision::detail::digits2<number<T> >::value() * 2) / 3;\n\n   // Newton-Raphson iteration\n   while (current_precision > target_precision)\n   {\n      T sine, cosine;\n      eval_sin(sine, result);\n      eval_cos(cosine, result);\n      eval_subtract(cosine, xx);\n      cosine.negate();\n      eval_divide(cosine, sine);\n      eval_subtract(result, cosine);\n      current_precision = eval_ilogb(cosine);\n      if (current_precision <= (std::numeric_limits<typename T::exponent_type>::min)() + 1)\n         break;\n   }\n}\n\ntemplate <class T>\nvoid eval_atan(T& result, const T& x)\n{\n   static_assert(number_category<T>::value == number_kind_floating_point, \"The atan function is only valid for floating point types.\");\n   using si_type = typename boost::multiprecision::detail::canonical<std::int32_t, T>::type ;\n   using ui_type = typename boost::multiprecision::detail::canonical<std::uint32_t, T>::type;\n   using fp_type = typename std::tuple_element<0, typename T::float_types>::type                         ;\n\n   switch (eval_fpclassify(x))\n   {\n   case FP_NAN:\n      result = x;\n      errno  = EDOM;\n      return;\n   case FP_ZERO:\n      result = x;\n      return;\n   case FP_INFINITE:\n      if (eval_get_sign(x) < 0)\n      {\n         eval_ldexp(result, get_constant_pi<T>(), -1);\n         result.negate();\n      }\n      else\n         eval_ldexp(result, get_constant_pi<T>(), -1);\n      return;\n   default:;\n   }\n\n   const bool b_neg = eval_get_sign(x) < 0;\n\n   T xx(x);\n   if (b_neg)\n      xx.negate();\n\n   if (xx.compare(fp_type(0.1)) < 0)\n   {\n      T t1, t2, t3;\n      t1 = ui_type(1);\n      t2 = fp_type(0.5f);\n      t3 = fp_type(1.5f);\n      eval_multiply(xx, xx);\n      xx.negate();\n      hyp2F1(result, t1, t2, t3, xx);\n      eval_multiply(result, x);\n      return;\n   }\n\n   if (xx.compare(fp_type(10)) > 0)\n   {\n      T t1, t2, t3;\n      t1 = fp_type(0.5f);\n      t2 = ui_type(1u);\n      t3 = fp_type(1.5f);\n      eval_multiply(xx, xx);\n      eval_divide(xx, si_type(-1), xx);\n      hyp2F1(result, t1, t2, t3, xx);\n      eval_divide(result, x);\n      if (!b_neg)\n         result.negate();\n      eval_ldexp(t1, get_constant_pi<T>(), -1);\n      eval_add(result, t1);\n      if (b_neg)\n         result.negate();\n      return;\n   }\n\n   // Get initial estimate using standard math function atan.\n   fp_type d;\n   eval_convert_to(&d, xx);\n   result = fp_type(std::atan(d));\n\n   // Newton-Raphson iteration, we should double our precision with each iteration,\n   // in practice this seems to not quite work in all cases... so terminate when we\n   // have at least 2/3 of the digits correct on the assumption that the correction\n   // we've just added will finish the job...\n\n   std::intmax_t current_precision = eval_ilogb(result);\n   std::intmax_t target_precision  = std::numeric_limits<number<T> >::is_specialized ?\n      current_precision - 1 - (std::numeric_limits<number<T> >::digits * 2) / 3\n      : current_precision - 1 - (boost::multiprecision::detail::digits2<number<T> >::value() * 2) / 3;\n\n   T s, c, t;\n   while (current_precision > target_precision)\n   {\n      eval_sin(s, result);\n      eval_cos(c, result);\n      eval_multiply(t, xx, c);\n      eval_subtract(t, s);\n      eval_multiply(s, t, c);\n      eval_add(result, s);\n      current_precision = eval_ilogb(s);\n      if (current_precision <= (std::numeric_limits<typename T::exponent_type>::min)() + 1)\n         break;\n   }\n   if (b_neg)\n      result.negate();\n}\n\ntemplate <class T>\nvoid eval_atan2(T& result, const T& y, const T& x)\n{\n   static_assert(number_category<T>::value == number_kind_floating_point, \"The atan2 function is only valid for floating point types.\");\n   if (&result == &y)\n   {\n      T temp(y);\n      eval_atan2(result, temp, x);\n      return;\n   }\n   else if (&result == &x)\n   {\n      T temp(x);\n      eval_atan2(result, y, temp);\n      return;\n   }\n\n   using ui_type = typename boost::multiprecision::detail::canonical<std::uint32_t, T>::type;\n\n   switch (eval_fpclassify(y))\n   {\n   case FP_NAN:\n      result = y;\n      errno  = EDOM;\n      return;\n   case FP_ZERO:\n   {\n      if (eval_signbit(x))\n      {\n         result = get_constant_pi<T>();\n         if (eval_signbit(y))\n            result.negate();\n      }\n      else\n      {\n         result = y; // Note we allow atan2(0,0) to be +-zero, even though it's mathematically undefined\n      }\n      return;\n   }\n   case FP_INFINITE:\n   {\n      if (eval_fpclassify(x) == FP_INFINITE)\n      {\n         if (eval_signbit(x))\n         {\n            // 3Pi/4\n            eval_ldexp(result, get_constant_pi<T>(), -2);\n            eval_subtract(result, get_constant_pi<T>());\n            if (eval_get_sign(y) >= 0)\n               result.negate();\n         }\n         else\n         {\n            // Pi/4\n            eval_ldexp(result, get_constant_pi<T>(), -2);\n            if (eval_get_sign(y) < 0)\n               result.negate();\n         }\n      }\n      else\n      {\n         eval_ldexp(result, get_constant_pi<T>(), -1);\n         if (eval_get_sign(y) < 0)\n            result.negate();\n      }\n      return;\n   }\n   }\n\n   switch (eval_fpclassify(x))\n   {\n   case FP_NAN:\n      result = x;\n      errno  = EDOM;\n      return;\n   case FP_ZERO:\n   {\n      eval_ldexp(result, get_constant_pi<T>(), -1);\n      if (eval_get_sign(y) < 0)\n         result.negate();\n      return;\n   }\n   case FP_INFINITE:\n      if (eval_get_sign(x) > 0)\n         result = ui_type(0);\n      else\n         result = get_constant_pi<T>();\n      if (eval_get_sign(y) < 0)\n         result.negate();\n      return;\n   }\n\n   T xx;\n   eval_divide(xx, y, x);\n   if (eval_get_sign(xx) < 0)\n      xx.negate();\n\n   eval_atan(result, xx);\n\n   // Determine quadrant (sign) based on signs of x, y\n   const bool y_neg = eval_get_sign(y) < 0;\n   const bool x_neg = eval_get_sign(x) < 0;\n\n   if (y_neg != x_neg)\n      result.negate();\n\n   if (x_neg)\n   {\n      if (y_neg)\n         eval_subtract(result, get_constant_pi<T>());\n      else\n         eval_add(result, get_constant_pi<T>());\n   }\n}\ntemplate <class T, class A>\ninline typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A>::value, void>::type eval_atan2(T& result, const T& x, const A& a)\n{\n   using canonical_type = typename boost::multiprecision::detail::canonical<A, T>::type         ;\n   using cast_type = typename std::conditional<std::is_same<A, canonical_type>::value, T, canonical_type>::type;\n   cast_type                                                                      c;\n   c = a;\n   eval_atan2(result, x, c);\n}\n\ntemplate <class T, class A>\ninline typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A>::value, void>::type eval_atan2(T& result, const A& x, const T& a)\n{\n   using canonical_type = typename boost::multiprecision::detail::canonical<A, T>::type         ;\n   using cast_type = typename std::conditional<std::is_same<A, canonical_type>::value, T, canonical_type>::type;\n   cast_type                                                                      c;\n   c = x;\n   eval_atan2(result, c, a);\n}\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/functions/trunc.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2022 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_DETAIL_FUNCTIONS_TRUNC_HPP\n#define BOOST_MP_DETAIL_FUNCTIONS_TRUNC_HPP\n\n#include <cmath>\n#include <limits>\n#include <stdexcept>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n\n#ifdef BOOST_MP_MATH_AVAILABLE\n#include <boost/math/special_functions/trunc.hpp>\n#endif\n\nnamespace boost { namespace multiprecision { namespace detail {\n\nnamespace impl {\n\ntemplate <typename T>\ninline T trunc BOOST_PREVENT_MACRO_SUBSTITUTION (const T arg)\n{\n    using std::floor;\n    using std::ceil;\n\n    return (arg > 0) ? floor(arg) : ceil(arg);\n}\n\n} // namespace impl\n\n#ifdef BOOST_MP_MATH_AVAILABLE\n\ntemplate <typename T>\ninline long long lltrunc BOOST_PREVENT_MACRO_SUBSTITUTION (const T arg)\n{\n    return boost::math::lltrunc(arg);\n}\n\ntemplate <typename T>\ninline int itrunc BOOST_PREVENT_MACRO_SUBSTITUTION (const T arg)\n{\n    return boost::math::itrunc(arg);\n}\n\n#else\n\ntemplate <typename T>\ninline long long lltrunc BOOST_PREVENT_MACRO_SUBSTITUTION (const T arg)\n{\n    if (arg > LLONG_MAX)\n    {\n        BOOST_MP_THROW_EXCEPTION(std::domain_error(\"arg cannot be converted into a long long\"));\n    }\n\n    return static_cast<long long>(boost::multiprecision::detail::impl::trunc(arg));\n}\n\ntemplate <typename T>\ninline int itrunc BOOST_PREVENT_MACRO_SUBSTITUTION (const T arg)\n{\n    if (arg > static_cast<T>(INT_MAX))\n    {\n        BOOST_MP_THROW_EXCEPTION(std::domain_error(\"arg cannot be converted into an int\"));\n    }\n\n    return static_cast<int>(boost::multiprecision::detail::impl::trunc(arg));\n}\n\n#endif\n\n}}} // Namespaces\n\n#endif // BOOST_MP_DETAIL_FUNCTIONS_TRUNC_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/generic_interconvert.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_GENERIC_INTERCONVERT_HPP\n#define BOOST_MP_GENERIC_INTERCONVERT_HPP\n\n#include <cmath>\n#include <limits>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/detail/default_ops.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n#include <boost/multiprecision/detail/functions/trunc.hpp>\n\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4127 6326)\n#endif\n\nnamespace boost { namespace multiprecision { namespace detail {\n\ntemplate <class To, class From>\ninline To do_cast(const From& from)\n{\n   return static_cast<To>(from);\n}\ntemplate <class To, class B, ::boost::multiprecision::expression_template_option et>\ninline To do_cast(const number<B, et>& from)\n{\n   return from.template convert_to<To>();\n}\n\ntemplate <class To, class From>\nvoid generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_floating_point>& /*to_type*/, const std::integral_constant<int, number_kind_integer>& /*from_type*/)\n{\n   using default_ops::eval_add;\n   using default_ops::eval_bitwise_and;\n   using default_ops::eval_convert_to;\n   using default_ops::eval_get_sign;\n   using default_ops::eval_is_zero;\n   using default_ops::eval_ldexp;\n   using default_ops::eval_right_shift;\n   // smallest unsigned type handled natively by \"From\" is likely to be it's limb_type:\n   using l_limb_type = typename canonical<unsigned char, From>::type;\n   // get the corresponding type that we can assign to \"To\":\n   using to_type = typename canonical<l_limb_type, To>::type;\n   From                                              t(from);\n   bool                                              is_neg = eval_get_sign(t) < 0;\n   if (is_neg)\n      t.negate();\n   // Pick off the first limb:\n   l_limb_type limb;\n   l_limb_type mask = static_cast<l_limb_type>(~static_cast<l_limb_type>(0));\n   From        fl;\n   eval_bitwise_and(fl, t, mask);\n   eval_convert_to(&limb, fl);\n   to = static_cast<to_type>(limb);\n   eval_right_shift(t, std::numeric_limits<l_limb_type>::digits);\n   //\n   // Then keep picking off more limbs until \"t\" is zero:\n   //\n   To       l;\n   unsigned shift = std::numeric_limits<l_limb_type>::digits;\n   while (!eval_is_zero(t))\n   {\n      eval_bitwise_and(fl, t, mask);\n      eval_convert_to(&limb, fl);\n      l = static_cast<to_type>(limb);\n      eval_right_shift(t, std::numeric_limits<l_limb_type>::digits);\n      eval_ldexp(l, l, shift);\n      eval_add(to, l);\n      shift += std::numeric_limits<l_limb_type>::digits;\n   }\n   //\n   // Finish off by setting the sign:\n   //\n   if (is_neg)\n      to.negate();\n}\n\ntemplate <class To, class From>\nvoid generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_integer>& /*to_type*/, const std::integral_constant<int, number_kind_integer>& /*from_type*/)\n{\n   using default_ops::eval_bitwise_and;\n   using default_ops::eval_bitwise_or;\n   using default_ops::eval_convert_to;\n   using default_ops::eval_get_sign;\n   using default_ops::eval_is_zero;\n   using default_ops::eval_left_shift;\n   using default_ops::eval_right_shift;\n   // smallest unsigned type handled natively by \"From\" is likely to be it's limb_type:\n   using limb_type = typename canonical<unsigned char, From>::type;\n   // get the corresponding type that we can assign to \"To\":\n   using to_type = typename canonical<limb_type, To>::type;\n   From                                            t(from);\n   bool                                            is_neg = eval_get_sign(t) < 0;\n   if (is_neg)\n      t.negate();\n   // Pick off the first limb:\n   limb_type limb;\n   limb_type mask = static_cast<limb_type>(~static_cast<limb_type>(0));\n   From      fl;\n   eval_bitwise_and(fl, t, mask);\n   eval_convert_to(&limb, fl);\n   to = static_cast<to_type>(limb);\n   eval_right_shift(t, std::numeric_limits<limb_type>::digits);\n   //\n   // Then keep picking off more limbs until \"t\" is zero:\n   //\n   To       l;\n   unsigned shift = std::numeric_limits<limb_type>::digits;\n   while (!eval_is_zero(t))\n   {\n      eval_bitwise_and(fl, t, mask);\n      eval_convert_to(&limb, fl);\n      l = static_cast<to_type>(limb);\n      eval_right_shift(t, std::numeric_limits<limb_type>::digits);\n      eval_left_shift(l, shift);\n      eval_bitwise_or(to, l);\n      shift += std::numeric_limits<limb_type>::digits;\n   }\n   //\n   // Finish off by setting the sign:\n   //\n   if (is_neg)\n      to.negate();\n}\n\ntemplate <class To, class From>\nvoid generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_floating_point>& /*to_type*/, const std::integral_constant<int, number_kind_floating_point>& /*from_type*/)\n{\n#ifdef BOOST_MSVC\n#pragma warning(push)\n//#pragma warning(disable : 4127)\n#endif\n   //\n   // The code here only works when the radix of \"From\" is 2, we could try shifting by other\n   // radixes but it would complicate things.... use a string conversion when the radix is other\n   // than 2:\n   //\n   BOOST_IF_CONSTEXPR(std::numeric_limits<number<From> >::radix != 2)\n   {\n      to = from.str(0, std::ios_base::fmtflags()).c_str();\n      return;\n   }\n   else\n   {\n      using ui_type = typename canonical<unsigned char, To>::type;\n\n      using default_ops::eval_add;\n      using default_ops::eval_convert_to;\n      using default_ops::eval_fpclassify;\n      using default_ops::eval_get_sign;\n      using default_ops::eval_is_zero;\n      using default_ops::eval_subtract;\n\n      //\n      // First classify the input, then handle the special cases:\n      //\n      int c = eval_fpclassify(from);\n\n      if (c == static_cast<int>(FP_ZERO))\n      {\n         to = ui_type(0);\n         return;\n      }\n      else if (c == static_cast<int>(FP_NAN))\n      {\n         to = static_cast<const char*>(\"nan\");\n         return;\n      }\n      else if (c == static_cast<int>(FP_INFINITE))\n      {\n         to = static_cast<const char*>(\"inf\");\n         if (eval_get_sign(from) < 0)\n            to.negate();\n         return;\n      }\n\n      typename From::exponent_type e;\n      From                         f, term;\n      to = ui_type(0);\n\n      eval_frexp(f, from, &e);\n\n      constexpr int shift = std::numeric_limits<std::intmax_t>::digits - 1;\n\n      while (!eval_is_zero(f))\n      {\n         // extract int sized bits from f:\n         eval_ldexp(f, f, shift);\n         eval_floor(term, f);\n         e -= shift;\n         eval_ldexp(to, to, shift);\n         typename boost::multiprecision::detail::canonical<std::intmax_t, To>::type ll;\n         eval_convert_to(&ll, term);\n         eval_add(to, ll);\n         eval_subtract(f, term);\n      }\n      using to_exponent = typename To::exponent_type;\n      if (e > (std::numeric_limits<to_exponent>::max)())\n      {\n         to = static_cast<const char*>(\"inf\");\n         if (eval_get_sign(from) < 0)\n            to.negate();\n         return;\n      }\n      if (e < (std::numeric_limits<to_exponent>::min)())\n      {\n         to = ui_type(0);\n         if (eval_get_sign(from) < 0)\n            to.negate();\n         return;\n      }\n      eval_ldexp(to, to, static_cast<to_exponent>(e));\n   }\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n}\n\ntemplate <class To, class From>\nvoid generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_rational>& /*to_type*/, const std::integral_constant<int, number_kind_rational>& /*from_type*/)\n{\n   using to_component_type = typename component_type<number<To> >::type;\n\n   number<From>      t(from);\n   to_component_type n(numerator(t)), d(denominator(t));\n   using default_ops::assign_components;\n   assign_components(to, n.backend(), d.backend());\n}\n\ntemplate <class To, class From>\nvoid generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_rational>& /*to_type*/, const std::integral_constant<int, number_kind_integer>& /*from_type*/)\n{\n   using to_component_type = typename component_type<number<To> >::type;\n\n   number<From>      t(from);\n   to_component_type n(t), d(1);\n   using default_ops::assign_components;\n   assign_components(to, n.backend(), d.backend());\n}\n\ntemplate <class LargeInteger>\ninline typename std::enable_if<is_signed_number<LargeInteger>::value>::type make_positive(LargeInteger& val)\n{\n   if (val.sign() < 0)\n      val = -val;\n}\ntemplate <class LargeInteger>\ninline typename std::enable_if<!is_signed_number<LargeInteger>::value>::type make_positive(LargeInteger&){}\n\ntemplate <class R, class LargeInteger>\nR safe_convert_to_float(const LargeInteger& i)\n{\n   if (!i)\n      return R(0);\n   BOOST_IF_CONSTEXPR(std::numeric_limits<R>::is_specialized && std::numeric_limits<R>::max_exponent)\n   {\n      using std::ldexp;\n\n      LargeInteger val(i);\n      make_positive(val);\n      std::size_t mb = msb(val);\n      if (mb >= std::numeric_limits<R>::max_exponent)\n      {\n         int scale_factor = static_cast<int>(mb) + 1 - std::numeric_limits<R>::max_exponent;\n         BOOST_MP_ASSERT(scale_factor >= 1);\n         val >>= scale_factor;\n         R result = val.template convert_to<R>();\n         BOOST_IF_CONSTEXPR(std::numeric_limits<R>::digits == 0 || std::numeric_limits<R>::digits >= std::numeric_limits<R>::max_exponent)\n         {\n            //\n            // Calculate and add on the remainder, only if there are more\n            // digits in the mantissa that the size of the exponent, in\n            // other words if we are dropping digits in the conversion\n            // otherwise:\n            //\n            LargeInteger remainder(i);\n            remainder &= (LargeInteger(1) << scale_factor) - 1;\n            result += ldexp(safe_convert_to_float<R>(remainder), -scale_factor);\n         }\n         return i.sign() < 0 ? static_cast<R>(-result) : result;\n      }\n   }\n   return i.template convert_to<R>();\n}\n\ntemplate <class To, class Integer>\ninline typename std::enable_if<!(is_number<To>::value || std::is_floating_point<To>::value)>::type\ngeneric_convert_rational_to_float_imp(To& result, const Integer& n, const Integer& d, const std::integral_constant<bool, true>&)\n{\n   //\n   // If we get here, then there's something about one type or the other\n   // that prevents an exactly rounded result from being calculated\n   // (or at least it's not clear how to implement such a thing).\n   //\n   using default_ops::eval_divide;\n   number<To> fn(safe_convert_to_float<number<To> >(n)), fd(safe_convert_to_float<number<To> >(d));\n   eval_divide(result, fn.backend(), fd.backend());\n}\ntemplate <class To, class Integer>\ninline typename std::enable_if<is_number<To>::value || std::is_floating_point<To>::value>::type\ngeneric_convert_rational_to_float_imp(To& result, const Integer& n, const Integer& d, const std::integral_constant<bool, true>&)\n{\n   //\n   // If we get here, then there's something about one type or the other\n   // that prevents an exactly rounded result from being calculated\n   // (or at least it's not clear how to implement such a thing).\n   //\n   To fd(safe_convert_to_float<To>(d));\n   result = safe_convert_to_float<To>(n);\n   result /= fd;\n}\n\ntemplate <class To, class Integer>\ntypename std::enable_if<is_number<To>::value || std::is_floating_point<To>::value>::type\ngeneric_convert_rational_to_float_imp(To& result, Integer& num, Integer& denom, const std::integral_constant<bool, false>&)\n{\n   //\n   // If we get here, then the precision of type To is known, and the integer type is unbounded\n   // so we can use integer division plus manipulation of the remainder to get an exactly\n   // rounded result.\n   //\n   if (num == 0)\n   {\n      result = 0;\n      return;\n   }\n   bool s = false;\n   if (num < 0)\n   {\n      s   = true;\n      num = -num;\n   }\n   std::ptrdiff_t denom_bits = msb(denom);\n   std::ptrdiff_t shift      = std::numeric_limits<To>::digits + denom_bits - msb(num);\n   if (shift > 0)\n      num <<= shift;\n   else if (shift < 0)\n      denom <<= boost::multiprecision::detail::unsigned_abs(shift);\n   Integer q, r;\n   divide_qr(num, denom, q, r);\n   std::ptrdiff_t q_bits = msb(q);\n   if (q_bits == std::numeric_limits<To>::digits - 1)\n   {\n      //\n      // Round up if 2 * r > denom:\n      //\n      r <<= 1;\n      int c = r.compare(denom);\n      if (c > 0)\n         ++q;\n      else if ((c == 0) && (q & 1u))\n      {\n         ++q;\n      }\n   }\n   else\n   {\n      BOOST_MP_ASSERT(q_bits == std::numeric_limits<To>::digits);\n      //\n      // We basically already have the rounding info:\n      //\n      if (q & 1u)\n      {\n         if (r || (q & 2u))\n            ++q;\n      }\n   }\n   using std::ldexp;\n   result = do_cast<To>(q);\n   result = ldexp(result, static_cast<int>(-shift));\n   if (s)\n      result = -result;\n}\ntemplate <class To, class Integer>\ninline typename std::enable_if<!(is_number<To>::value || std::is_floating_point<To>::value)>::type\ngeneric_convert_rational_to_float_imp(To& result, Integer& num, Integer& denom, const std::integral_constant<bool, false>& tag)\n{\n   number<To> t;\n   generic_convert_rational_to_float_imp(t, num, denom, tag);\n   result = t.backend();\n}\n\ntemplate <class To, class From>\ninline void generic_convert_rational_to_float(To& result, const From& f)\n{\n   //\n   // Type From is always a Backend to number<>, or an\n   // instance of number<>, but we allow\n   // To to be either a Backend type, or a real number type,\n   // that way we can call this from generic conversions, and\n   // from specific conversions to built in types.\n   //\n   using actual_from_type = typename std::conditional<is_number<From>::value, From, number<From> >::type                                                                                                                                                                                                           ;\n   using actual_to_type = typename std::conditional<is_number<To>::value || std::is_floating_point<To>::value, To, number<To> >::type                                                                                                                                                                            ;\n   using integer_type = typename component_type<actual_from_type>::type                                                                                                                                                                                                                                 ;\n   using dispatch_tag = std::integral_constant<bool, !std::numeric_limits<integer_type>::is_specialized || std::numeric_limits<integer_type>::is_bounded || !std::numeric_limits<actual_to_type>::is_specialized || !std::numeric_limits<actual_to_type>::is_bounded || (std::numeric_limits<actual_to_type>::radix != 2)>;\n\n   integer_type n(numerator(static_cast<actual_from_type>(f))), d(denominator(static_cast<actual_from_type>(f)));\n   generic_convert_rational_to_float_imp(result, n, d, dispatch_tag());\n}\n\ntemplate <class To, class From>\ninline void generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_floating_point>& /*to_type*/, const std::integral_constant<int, number_kind_rational>& /*from_type*/)\n{\n   generic_convert_rational_to_float(to, from);\n}\n\ntemplate <class To, class From>\nvoid generic_interconvert_float2rational(To& to, const From& from, const std::integral_constant<int, 2>& /*radix*/)\n{\n   using std::ldexp;\n   using std::frexp;\n   using ui_type = typename std::tuple_element<0, typename To::unsigned_types>::type;\n   constexpr int shift = std::numeric_limits<long long>::digits;\n   typename From::exponent_type e;\n   typename component_type<number<To>>::type num, denom;\n   number<From> val(from);\n   val = frexp(val, &e);\n   while (val)\n   {\n      val = ldexp(val, shift);\n      e -= shift;\n      long long ll = boost::multiprecision::detail::lltrunc(val);\n      val -= ll;\n      num <<= shift;\n      num += ll;\n   }\n   denom = ui_type(1u);\n   if (e < 0)\n      denom <<= -e;\n   else if (e > 0)\n      num <<= e;\n   assign_components(to, num.backend(), denom.backend());\n}\n\ntemplate <class To, class From, int Radix>\nvoid generic_interconvert_float2rational(To& to, const From& from, const std::integral_constant<int, Radix>& /*radix*/)\n{\n   using std::ilogb;\n   using std::scalbn;\n   using std::pow;\n   using std::abs;\n   //\n   // This is almost the same as the binary case above, but we have to use\n   // scalbn and ilogb rather than ldexp and frexp, we also only extract\n   // one Radix digit at a time which is terribly inefficient!\n   //\n   using ui_type = typename std::tuple_element<0, typename To::unsigned_types>::type;\n   typename From::exponent_type e;\n   typename component_type<number<To>>::type num, denom;\n   number<From> val(from);\n\n   if (!val)\n   {\n      to = ui_type(0u);\n      return;\n   }\n\n   e   = ilogb(val);\n   val = scalbn(val, -e);\n   while (val)\n   {\n      long long ll = boost::multiprecision::detail::lltrunc(val);\n      val -= ll;\n      val = scalbn(val, 1);\n      num *= Radix;\n      num += ll;\n      --e;\n   }\n   ++e;\n   denom = ui_type(Radix);\n   denom = pow(denom, abs(e));\n   if (e > 0)\n   {\n      num *= denom;\n      denom = 1;\n   }\n   assign_components(to, num.backend(), denom.backend());\n}\n\ntemplate <class To, class From>\nvoid generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_rational>& /*to_type*/, const std::integral_constant<int, number_kind_floating_point>& /*from_type*/)\n{\n   generic_interconvert_float2rational(to, from, std::integral_constant<int, std::numeric_limits<number<From> >::is_specialized ? std::numeric_limits<number<From> >::radix : 2>());\n}\n\ntemplate <class To, class From>\nvoid generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_integer>& /*to_type*/, const std::integral_constant<int, number_kind_rational>& /*from_type*/)\n{\n   number<From> t(from);\n   number<To>   result(numerator(t) / denominator(t));\n   to = result.backend();\n}\n\ntemplate <class To, class From>\nvoid generic_interconvert_float2int(To& to, const From& from, const std::integral_constant<int, 2>& /*radix*/)\n{\n   using std::frexp;\n   using std::ldexp;\n   \n   using exponent_type = typename From::exponent_type;\n   constexpr exponent_type              shift = std::numeric_limits<long long>::digits;\n   exponent_type                        e;\n   number<To>                           num(0u);\n   number<From>                         val(from);\n   val      = frexp(val, &e);\n   bool neg = false;\n   if (val.sign() < 0)\n   {\n      val.backend().negate();\n      neg = true;\n   }\n   while (e > 0)\n   {\n      exponent_type s = (std::min)(e, shift);\n      val             = ldexp(val, s);\n      e -= s;\n      long long ll = boost::multiprecision::detail::lltrunc(val);\n      val -= ll;\n      num <<= s;\n      num += ll;\n   }\n   to = num.backend();\n   if (neg)\n      to.negate();\n}\n\ntemplate <class To, class From, int Radix>\nvoid generic_interconvert_float2int(To& to, const From& from, const std::integral_constant<int, Radix>& /*radix*/)\n{\n   using std::ilogb;\n   using std::scalbn;\n   //\n   // This is almost the same as the binary case above, but we have to use\n   // scalbn and ilogb rather than ldexp and frexp, we also only extract\n   // one Radix digit at a time which is terribly inefficient!\n   //\n   typename From::exponent_type e;\n   number<To>                   num(0u);\n   number<From>                 val(from);\n   e   = ilogb(val);\n   val = scalbn(val, -e);\n   while (e >= 0)\n   {\n      long long ll = boost::multiprecision::detail::lltrunc(val);\n      val -= ll;\n      val = scalbn(val, 1);\n      num *= Radix;\n      num += ll;\n      --e;\n   }\n   to = num.backend();\n}\n\ntemplate <class To, class From>\nvoid generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_integer>& /*to_type*/, const std::integral_constant<int, number_kind_floating_point>& /*from_type*/)\n{\n   generic_interconvert_float2int(to, from, std::integral_constant<int, (std::numeric_limits<number<From> >::is_specialized ? std::numeric_limits<number<From> >::radix : 2)>());\n}\n\ntemplate <class To, class From, class tag>\nvoid generic_interconvert_complex_to_scalar(To& to, const From& from, const std::integral_constant<bool, true>&, const tag&)\n{\n   // We just want the real part, and \"to\" is the correct type already:\n   eval_real(to, from);\n\n   To im;\n   eval_imag(im, from);\n   if (!eval_is_zero(im))\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Could not convert imaginary number to scalar.\"));\n}\ntemplate <class To, class From>\nvoid generic_interconvert_complex_to_scalar(To& to, const From& from, const std::integral_constant<bool, false>&, const std::integral_constant<bool, true>&)\n{\n   using component_number = typename component_type<number<From> >::type;\n   using component_backend = typename component_number::backend_type     ;\n   //\n   // Get the real part and copy-construct the result from it:\n   //\n   scoped_precision_options<component_number> scope(from);\n   component_backend r;\n   generic_interconvert_complex_to_scalar(r, from, std::integral_constant<bool, true>(), std::integral_constant<bool, true>());\n   to = r;\n}\ntemplate <class To, class From>\nvoid generic_interconvert_complex_to_scalar(To& to, const From& from, const std::integral_constant<bool, false>&, const std::integral_constant<bool, false>&)\n{\n   using component_number = typename component_type<number<From> >::type;\n   using component_backend = typename component_number::backend_type;\n   //\n   // Get the real part and use a generic_interconvert to type To:\n   //\n   scoped_precision_options<component_number> scope(from);\n   component_backend r;\n   generic_interconvert_complex_to_scalar(r, from, std::integral_constant<bool, true>(), std::integral_constant<bool, true>());\n   generic_interconvert(to, r, std::integral_constant<int, number_category<To>::value>(), std::integral_constant<int, number_category<component_backend>::value>());\n}\n\ntemplate <class To, class From>\nvoid generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_floating_point>& /*to_type*/, const std::integral_constant<int, number_kind_complex>& /*from_type*/)\n{\n   using component_number = typename component_type<number<From> >::type;\n   using component_backend = typename component_number::backend_type     ;\n\n   generic_interconvert_complex_to_scalar(to, from, std::integral_constant<bool, std::is_same<component_backend, To>::value>(), std::integral_constant<bool, std::is_constructible<To, const component_backend&>::value>());\n}\ntemplate <class To, class From>\nvoid generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_integer>& /*to_type*/, const std::integral_constant<int, number_kind_complex>& /*from_type*/)\n{\n   using component_number = typename component_type<number<From> >::type;\n   using component_backend = typename component_number::backend_type     ;\n\n   generic_interconvert_complex_to_scalar(to, from, std::integral_constant<bool, std::is_same<component_backend, To>::value>(), std::integral_constant<bool, std::is_constructible<To, const component_backend&>::value>());\n}\ntemplate <class To, class From>\nvoid generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_rational>& /*to_type*/, const std::integral_constant<int, number_kind_complex>& /*from_type*/)\n{\n   using component_number = typename component_type<number<From> >::type;\n   using component_backend = typename component_number::backend_type     ;\n\n   generic_interconvert_complex_to_scalar(to, from, std::integral_constant<bool, std::is_same<component_backend, To>::value>(), std::integral_constant<bool, std::is_constructible<To, const component_backend&>::value>());\n}\ntemplate <class To, class From>\nvoid generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_complex>& /*to_type*/, const std::integral_constant<int, number_kind_integer>& /*from_type*/)\n{\n   using component_number = typename component_type<number<To> >::type;\n\n   scoped_source_precision<number<From> >     scope1;\n   scoped_precision_options<component_number> scope2(number<To>::thread_default_precision(), number<To>::thread_default_variable_precision_options());\n   (void)scope1;\n   (void)scope2;\n\n   number<From>     f(from);\n   component_number scalar(f);\n   number<To> result(scalar);\n   to = result.backend();\n}\ntemplate <class To, class From>\nvoid generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_complex>& /*to_type*/, const std::integral_constant<int, number_kind_rational>& /*from_type*/)\n{\n   using component_number = typename component_type<number<To> >::type;\n\n   scoped_source_precision<number<From> >     scope1;\n   scoped_precision_options<component_number> scope2(number<To>::thread_default_precision(), number<To>::thread_default_variable_precision_options());\n   (void)scope1;\n   (void)scope2;\n\n   number<From>     f(from);\n   component_number scalar(f);\n   number<To> result(scalar);\n   to = result.backend();\n}\ntemplate <class To, class From>\nvoid generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_complex>& /*to_type*/, const std::integral_constant<int, number_kind_floating_point>& /*from_type*/)\n{\n   using component_number = typename component_type<number<To> >::type;\n\n   scoped_source_precision<number<From> > scope1;\n   scoped_precision_options<component_number> scope2(number<To>::thread_default_precision(), number<To>::thread_default_variable_precision_options());\n   (void)scope1;\n   (void)scope2;\n\n   number<From> f(from);\n   component_number scalar(f);\n   number<To> result(scalar);\n   to = result.backend();\n}\ntemplate <class To, class From, int Tag1, int Tag2>\nvoid generic_interconvert(To& /*to*/, const From& /*from*/, const std::integral_constant<int, Tag1>& /*to_type*/, const std::integral_constant<int, Tag2>& /*from_type*/)\n{\n   static_assert(sizeof(To) == 0, \"Sorry, you asked for a conversion bewteen types that hasn't been implemented yet!!\");\n}\n\n}\n}\n} // namespace boost::multiprecision::detail\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#endif // BOOST_MP_GENERIC_INTERCONVERT_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/hash.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2021 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_DETAIL_HASH_HPP\n#define BOOST_MP_DETAIL_HASH_HPP\n\n#include <cstddef>\n#include <functional>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n\nnamespace boost { namespace multiprecision { namespace detail {\n\ntemplate <typename T>\ninline std::size_t hash_value(const T& v)\n{\n    std::hash<T> hasher;\n    return hasher(v);\n}\n\n#if defined(BOOST_HAS_INT128)\n\nstd::size_t hash_value(const uint128_type& val);\n\ninline std::size_t hash_value(const int128_type& val)\n{\n   return hash_value(static_cast<uint128_type>(val));\n}\n\n#endif\n\ninline void hash_combine(std::size_t&) {}\n\ntemplate <typename T, typename... Args>\ninline void hash_combine(std::size_t& seed, const T& v, Args... args) \n{\n    constexpr std::size_t adder = 0x9e3779b9;\n    seed = seed ^ (hash_value(v) + adder + (seed<<6) + (seed>>2));\n    hash_combine(seed, args...);\n}\n\n#if defined(BOOST_HAS_INT128)\n\ninline std::size_t hash_value(const uint128_type& val)\n{\n   std::size_t result = static_cast<std::size_t>(val);\n   hash_combine(result, static_cast<std::size_t>(val >> 64));\n   return result;\n}\n\n#endif\n\n}}} // Namespaces\n\n#endif // BOOST_MP_DETAIL_HASH_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/integer_ops.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_DETAIL_INTEGER_OPS_HPP\n#define BOOST_MP_DETAIL_INTEGER_OPS_HPP\n\n#include <boost/multiprecision/number.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n\nnamespace boost { namespace multiprecision {\n\nnamespace default_ops {\n\ntemplate <class Backend>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_qr(const Backend& x, const Backend& y, Backend& q, Backend& r)\n{\n   eval_divide(q, x, y);\n   eval_modulus(r, x, y);\n}\n\ntemplate <class Backend, class Integer>\ninline BOOST_MP_CXX14_CONSTEXPR Integer eval_integer_modulus(const Backend& x, Integer val)\n{\n   BOOST_MP_USING_ABS\n   using default_ops::eval_convert_to;\n   using default_ops::eval_modulus;\n   using int_type = typename boost::multiprecision::detail::canonical<Integer, Backend>::type;\n   Backend                                                                           t;\n   eval_modulus(t, x, static_cast<int_type>(val));\n   Integer result(0);\n   eval_convert_to(&result, t);\n   return abs(result);\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_gcd(B& result, const B& a, const B& b)\n{\n   using default_ops::eval_get_sign;\n   using default_ops::eval_is_zero;\n   using default_ops::eval_lsb;\n\n   std::ptrdiff_t shift(0);\n\n   B u(a), v(b);\n\n   int s = eval_get_sign(u);\n\n   /* GCD(0,x) := x */\n   if (s < 0)\n   {\n      u.negate();\n   }\n   else if (s == 0)\n   {\n      result = v;\n      return;\n   }\n   s = eval_get_sign(v);\n   if (s < 0)\n   {\n      v.negate();\n   }\n   else if (s == 0)\n   {\n      result = u;\n      return;\n   }\n\n   /* Let shift := lg K, where K is the greatest power of 2\n   dividing both u and v. */\n\n   std::size_t us = eval_lsb(u);\n   std::size_t vs = eval_lsb(v);\n   shift       = static_cast<std::ptrdiff_t>((std::min)(us, vs));\n   eval_right_shift(u, us);\n   eval_right_shift(v, vs);\n\n   do\n   {\n      /* Now u and v are both odd, so diff(u, v) is even.\n      Let u = min(u, v), v = diff(u, v)/2. */\n      s = u.compare(v);\n      if (s > 0)\n         u.swap(v);\n      if (s == 0)\n         break;\n      eval_subtract(v, u);\n      vs = eval_lsb(v);\n      eval_right_shift(v, vs);\n   } while (true);\n\n   result = u;\n   eval_left_shift(result, shift);\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_lcm(B& result, const B& a, const B& b)\n{\n   using ui_type = typename std::tuple_element<0, typename B::unsigned_types>::type;\n   B                                                             t;\n   eval_gcd(t, a, b);\n\n   if (eval_is_zero(t))\n   {\n      result = static_cast<ui_type>(0);\n   }\n   else\n   {\n      eval_divide(result, a, t);\n      eval_multiply(result, b);\n   }\n   if (eval_get_sign(result) < 0)\n      result.negate();\n}\n\n} // namespace default_ops\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer>::type\ndivide_qr(const number<Backend, ExpressionTemplates>& x, const number<Backend, ExpressionTemplates>& y,\n          number<Backend, ExpressionTemplates>& q, number<Backend, ExpressionTemplates>& r)\n{\n   using default_ops::eval_qr;\n   eval_qr(x.backend(), y.backend(), q.backend(), r.backend());\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer>::type\ndivide_qr(const number<Backend, ExpressionTemplates>& x, const multiprecision::detail::expression<tag, A1, A2, A3, A4>& y,\n          number<Backend, ExpressionTemplates>& q, number<Backend, ExpressionTemplates>& r)\n{\n   divide_qr(x, number<Backend, ExpressionTemplates>(y), q, r);\n}\n\ntemplate <class tag, class A1, class A2, class A3, class A4, class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer>::type\ndivide_qr(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& x, const number<Backend, ExpressionTemplates>& y,\n          number<Backend, ExpressionTemplates>& q, number<Backend, ExpressionTemplates>& r)\n{\n   divide_qr(number<Backend, ExpressionTemplates>(x), y, q, r);\n}\n\ntemplate <class tag, class A1, class A2, class A3, class A4, class tagb, class A1b, class A2b, class A3b, class A4b, class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer>::type\ndivide_qr(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& x, const multiprecision::detail::expression<tagb, A1b, A2b, A3b, A4b>& y,\n          number<Backend, ExpressionTemplates>& q, number<Backend, ExpressionTemplates>& r)\n{\n   divide_qr(number<Backend, ExpressionTemplates>(x), number<Backend, ExpressionTemplates>(y), q, r);\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Integer>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value && (number_category<Backend>::value == number_kind_integer), Integer>::type\ninteger_modulus(const number<Backend, ExpressionTemplates>& x, Integer val)\n{\n   using default_ops::eval_integer_modulus;\n   return eval_integer_modulus(x.backend(), val);\n}\n\ntemplate <class tag, class A1, class A2, class A3, class A4, class Integer>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value && (number_category<typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_integer), Integer>::type\ninteger_modulus(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& x, Integer val)\n{\n   using result_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   return integer_modulus(result_type(x), val);\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer, std::size_t>::type\nlsb(const number<Backend, ExpressionTemplates>& x)\n{\n   using default_ops::eval_lsb;\n   return eval_lsb(x.backend());\n}\n\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_integer, std::size_t>::type\nlsb(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& x)\n{\n   using number_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   number_type                                                                           n(x);\n   using default_ops::eval_lsb;\n   return eval_lsb(n.backend());\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer, std::size_t>::type\nmsb(const number<Backend, ExpressionTemplates>& x)\n{\n   using default_ops::eval_msb;\n   return eval_msb(x.backend());\n}\n\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_integer, std::size_t>::type\nmsb(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& x)\n{\n   using number_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   number_type                                                                           n(x);\n   using default_ops::eval_msb;\n   return eval_msb(n.backend());\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer, bool>::type\nbit_test(const number<Backend, ExpressionTemplates>& x, std::size_t index)\n{\n   using default_ops::eval_bit_test;\n   return eval_bit_test(x.backend(), index);\n}\n\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_integer, bool>::type\nbit_test(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& x, std::size_t index)\n{\n   using number_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n   number_type                                                                           n(x);\n   using default_ops::eval_bit_test;\n   return eval_bit_test(n.backend(), index);\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer, number<Backend, ExpressionTemplates>&>::type\nbit_set(number<Backend, ExpressionTemplates>& x, std::size_t index)\n{\n   using default_ops::eval_bit_set;\n   eval_bit_set(x.backend(), index);\n   return x;\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer, number<Backend, ExpressionTemplates>&>::type\nbit_unset(number<Backend, ExpressionTemplates>& x, std::size_t index)\n{\n   using default_ops::eval_bit_unset;\n   eval_bit_unset(x.backend(), index);\n   return x;\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer, number<Backend, ExpressionTemplates>&>::type\nbit_flip(number<Backend, ExpressionTemplates>& x, std::size_t index)\n{\n   using default_ops::eval_bit_flip;\n   eval_bit_flip(x.backend(), index);\n   return x;\n}\n\nnamespace default_ops {\n\n//\n// Within powm, we need a type with twice as many digits as the argument type, define\n// a traits class to obtain that type:\n//\ntemplate <class Backend>\nstruct double_precision_type\n{\n   using type = Backend;\n};\n\n//\n// If the exponent is a signed integer type, then we need to\n// check the value is positive:\n//\ntemplate <class Backend>\ninline BOOST_MP_CXX14_CONSTEXPR void check_sign_of_backend(const Backend& v, const std::integral_constant<bool, true>)\n{\n   if (eval_get_sign(v) < 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"powm requires a positive exponent.\"));\n   }\n}\ntemplate <class Backend>\ninline BOOST_MP_CXX14_CONSTEXPR void check_sign_of_backend(const Backend&, const std::integral_constant<bool, false>) {}\n//\n// Calculate (a^p)%c:\n//\ntemplate <class Backend>\nBOOST_MP_CXX14_CONSTEXPR void eval_powm(Backend& result, const Backend& a, const Backend& p, const Backend& c)\n{\n   using default_ops::eval_bit_test;\n   using default_ops::eval_get_sign;\n   using default_ops::eval_modulus;\n   using default_ops::eval_multiply;\n   using default_ops::eval_right_shift;\n\n   using double_type = typename double_precision_type<Backend>::type                                      ;\n   using ui_type = typename boost::multiprecision::detail::canonical<unsigned char, double_type>::type;\n\n   check_sign_of_backend(p, std::integral_constant<bool, std::numeric_limits<number<Backend> >::is_signed>());\n\n   double_type x, y(a), b(p), t;\n   x = ui_type(1u);\n\n   while (eval_get_sign(b) > 0)\n   {\n      if (eval_bit_test(b, 0))\n      {\n         eval_multiply(t, x, y);\n         eval_modulus(x, t, c);\n      }\n      eval_multiply(t, y, y);\n      eval_modulus(y, t, c);\n      eval_right_shift(b, ui_type(1));\n   }\n   Backend x2(x);\n   eval_modulus(result, x2, c);\n}\n\ntemplate <class Backend, class Integer>\nBOOST_MP_CXX14_CONSTEXPR void eval_powm(Backend& result, const Backend& a, const Backend& p, Integer c)\n{\n   using double_type = typename double_precision_type<Backend>::type                                      ;\n   using ui_type = typename boost::multiprecision::detail::canonical<unsigned char, double_type>::type;\n   using i1_type = typename boost::multiprecision::detail::canonical<Integer, double_type>::type      ;\n   using i2_type = typename boost::multiprecision::detail::canonical<Integer, Backend>::type          ;\n\n   using default_ops::eval_bit_test;\n   using default_ops::eval_get_sign;\n   using default_ops::eval_modulus;\n   using default_ops::eval_multiply;\n   using default_ops::eval_right_shift;\n\n   check_sign_of_backend(p, std::integral_constant<bool, std::numeric_limits<number<Backend> >::is_signed>());\n\n   if (eval_get_sign(p) < 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"powm requires a positive exponent.\"));\n   }\n\n   double_type x, y(a), b(p), t;\n   x = ui_type(1u);\n\n   while (eval_get_sign(b) > 0)\n   {\n      if (eval_bit_test(b, 0))\n      {\n         eval_multiply(t, x, y);\n         eval_modulus(x, t, static_cast<i1_type>(c));\n      }\n      eval_multiply(t, y, y);\n      eval_modulus(y, t, static_cast<i1_type>(c));\n      eval_right_shift(b, ui_type(1));\n   }\n   Backend x2(x);\n   eval_modulus(result, x2, static_cast<i2_type>(c));\n}\n\ntemplate <class Backend, class Integer>\nBOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_unsigned<Integer>::value >::type eval_powm(Backend& result, const Backend& a, Integer b, const Backend& c)\n{\n   using double_type = typename double_precision_type<Backend>::type                                      ;\n   using ui_type = typename boost::multiprecision::detail::canonical<unsigned char, double_type>::type;\n\n   using default_ops::eval_bit_test;\n   using default_ops::eval_get_sign;\n   using default_ops::eval_modulus;\n   using default_ops::eval_multiply;\n   using default_ops::eval_right_shift;\n\n   double_type x, y(a), t;\n   x = ui_type(1u);\n\n   while (b > 0)\n   {\n      if (b & 1)\n      {\n         eval_multiply(t, x, y);\n         eval_modulus(x, t, c);\n      }\n      eval_multiply(t, y, y);\n      eval_modulus(y, t, c);\n      b >>= 1;\n   }\n   Backend x2(x);\n   eval_modulus(result, x2, c);\n}\n\ntemplate <class Backend, class Integer>\nBOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_signed<Integer>::value && boost::multiprecision::detail::is_integral<Integer>::value>::type eval_powm(Backend& result, const Backend& a, Integer b, const Backend& c)\n{\n   if (b < 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"powm requires a positive exponent.\"));\n   }\n   eval_powm(result, a, static_cast<typename boost::multiprecision::detail::make_unsigned<Integer>::type>(b), c);\n}\n\ntemplate <class Backend, class Integer1, class Integer2>\nBOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_unsigned<Integer1>::value >::type eval_powm(Backend& result, const Backend& a, Integer1 b, Integer2 c)\n{\n   using double_type = typename double_precision_type<Backend>::type                                      ;\n   using ui_type = typename boost::multiprecision::detail::canonical<unsigned char, double_type>::type;\n   using i1_type = typename boost::multiprecision::detail::canonical<Integer1, double_type>::type     ;\n   using i2_type = typename boost::multiprecision::detail::canonical<Integer2, Backend>::type         ;\n\n   using default_ops::eval_bit_test;\n   using default_ops::eval_get_sign;\n   using default_ops::eval_modulus;\n   using default_ops::eval_multiply;\n   using default_ops::eval_right_shift;\n\n   double_type x, y(a), t;\n   x = ui_type(1u);\n\n   while (b > 0)\n   {\n      if (b & 1)\n      {\n         eval_multiply(t, x, y);\n         eval_modulus(x, t, static_cast<i1_type>(c));\n      }\n      eval_multiply(t, y, y);\n      eval_modulus(y, t, static_cast<i1_type>(c));\n      b >>= 1;\n   }\n   Backend x2(x);\n   eval_modulus(result, x2, static_cast<i2_type>(c));\n}\n\ntemplate <class Backend, class Integer1, class Integer2>\nBOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_signed<Integer1>::value && boost::multiprecision::detail::is_integral<Integer1>::value>::type eval_powm(Backend& result, const Backend& a, Integer1 b, Integer2 c)\n{\n   if (b < 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"powm requires a positive exponent.\"));\n   }\n   eval_powm(result, a, static_cast<typename boost::multiprecision::detail::make_unsigned<Integer1>::type>(b), c);\n}\n\nstruct powm_func\n{\n   template <class T, class U, class V>\n   BOOST_MP_CXX14_CONSTEXPR void operator()(T& result, const T& b, const U& p, const V& m) const\n   {\n      eval_powm(result, b, p, m);\n   }\n   template <class R, class T, class U, class V>\n   BOOST_MP_CXX14_CONSTEXPR void operator()(R& result, const T& b, const U& p, const V& m) const\n   {\n      T temp;\n      eval_powm(temp, b, p, m);\n      result = std::move(temp);\n   }\n};\n\n} // namespace default_ops\n\ntemplate <class T, class U, class V>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n        (number_category<T>::value == number_kind_integer) &&\n        (is_number<T>::value || is_number_expression<T>::value) &&\n        (is_number<U>::value || is_number_expression<U>::value || boost::multiprecision::detail::is_integral<U>::value) &&\n        (is_number<V>::value || is_number_expression<V>::value || boost::multiprecision::detail::is_integral<V>::value),\n    typename std::conditional<\n        is_no_et_number<T>::value,\n        T,\n        typename std::conditional<\n            is_no_et_number<U>::value,\n            U,\n            typename std::conditional<\n                is_no_et_number<V>::value,\n                V,\n                detail::expression<detail::function, default_ops::powm_func, T, U, V> >::type>::type>::type>::type\npowm(const T& b, const U& p, const V& mod)\n{\n   return detail::expression<detail::function, default_ops::powm_func, T, U, V>(\n       default_ops::powm_func(), b, p, mod);\n}\n\n}} // namespace boost::multiprecision\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/itos.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// We used to use lexical_cast internally for quick conversions from integers \n// to strings, but that breaks if the global locale is something other than \"C\".\n// See https://github.com/boostorg/multiprecision/issues/167.\n//\n#ifndef BOOST_MP_DETAIL_ITOS_HPP\n#define BOOST_MP_DETAIL_ITOS_HPP\n\nnamespace boost { namespace multiprecision { namespace detail {\n\n   template <class Integer>\n   std::string itos(Integer val)\n   {\n      if (!val)  return \"0\";\n      std::string result;\n      bool isneg = false;\n      if (val < 0)\n      {\n         val = -val;\n         isneg = true;\n      }\n      while (val)\n      {\n         result.insert(result.begin(), char('0' + (val % 10)));\n         val /= 10;\n      }\n      if (isneg)\n         result.insert(result.begin(), '-');\n      return result;\n   }\n\n\n}}} // namespace boost::multiprecision::detail\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/min_max.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2016 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_MIN_MAX_HPP\n#define BOOST_MP_MIN_MAX_HPP\n\n#include <boost/multiprecision/traits/is_backend.hpp>\n\nnamespace boost { namespace multiprecision {\n\n//\n// Expression template overloads for (min) and (max):\n//\n// Introduced in response to https://svn.boost.org/trac/boost/ticket/11149\n// note that these can not legally be injected into namespace std, and that doing so\n// may break future enhancements to the standard.  None the less adding\n// namespace std{ using boost::multiprecision::(min); using boost::multiprecision::(max); }\n// to your code may get some generic code working that wouldn't work otherwise.\n//\n// The use of enable_if on the return type is to avoid poisoning std::min/max,\n// otherwise attempting to make an explicit call to min<long>(a, b) when these and std\n// versions are in scope, will cause the compiler to try to instantiate the signatures\n// for our versions as well as the std ones, which in turn instantiates number<long>\n// which fails to compile as \"long\" is not a valid backend type.\n//\ntemplate <class Backend>\ninline typename std::enable_if<boost::multiprecision::detail::is_backend<Backend>::value, const number<Backend, et_on>&>::type(min)(const number<Backend, et_on>& a, const number<Backend, et_on>& b)\n{\n   return a < b ? a : b;\n}\ntemplate <class Backend, class tag, class A1, class A2, class A3, class A4>\ninline typename std::enable_if<boost::multiprecision::detail::is_backend<Backend>::value, const number<Backend, et_on> >::type(min)(const number<Backend, et_on>& a, const detail::expression<tag, A1, A2, A3, A4>& b)\n{\n   number<Backend, et_on> t(b);\n   if (a < t)\n      return a;\n   return std::move(t);\n}\ntemplate <class tag, class A1, class A2, class A3, class A4, class Backend>\ninline typename std::enable_if<boost::multiprecision::detail::is_backend<Backend>::value, const number<Backend, et_on> >::type(min)(const detail::expression<tag, A1, A2, A3, A4>& a, const number<Backend, et_on>& b)\n{\n   number<Backend, et_on> t(a);\n   if (t < b)\n      return std::move(t);\n   return b;\n}\ntemplate <class tag, class A1, class A2, class A3, class A4, class tagb, class A1b, class A2b, class A3b, class A4b>\ninline typename detail::expression<tag, A1, A2, A3, A4>::result_type(min)(const detail::expression<tag, A1, A2, A3, A4>& a, const detail::expression<tagb, A1b, A2b, A3b, A4b>& b)\n{\n   typename detail::expression<tag, A1, A2, A3, A4>::result_type t1(a), t2(b);\n   if (t1 < t2)\n      return std::move(t1);\n   return std::move(t2);\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline typename detail::expression<tag, A1, A2, A3, A4>::result_type(min)(const detail::expression<tag, A1, A2, A3, A4>& a, const detail::expression<tag, A1, A2, A3, A4>& b)\n{\n   typename detail::expression<tag, A1, A2, A3, A4>::result_type t1(a), t2(b);\n   if (t1 < t2)\n      return std::move(t1);\n   return std::move(t2);\n}\n\ntemplate <class Backend>\ninline typename std::enable_if<boost::multiprecision::detail::is_backend<Backend>::value, const number<Backend, et_on>&>::type(max)(const number<Backend, et_on>& a, const number<Backend, et_on>& b)\n{\n   return a > b ? a : b;\n}\ntemplate <class Backend, class tag, class A1, class A2, class A3, class A4>\ninline typename std::enable_if<boost::multiprecision::detail::is_backend<Backend>::value, const number<Backend, et_on> >::type(max)(const number<Backend, et_on>& a, const detail::expression<tag, A1, A2, A3, A4>& b)\n{\n   number<Backend, et_on> t(b);\n   if (a > t)\n      return a;\n   return std::move(t);\n}\ntemplate <class tag, class A1, class A2, class A3, class A4, class Backend>\ninline typename std::enable_if<boost::multiprecision::detail::is_backend<Backend>::value, const number<Backend, et_on> >::type(max)(const detail::expression<tag, A1, A2, A3, A4>& a, const number<Backend, et_on>& b)\n{\n   number<Backend, et_on> t(a);\n   if (t > b)\n      return std::move(t);\n   return b;\n}\ntemplate <class tag, class A1, class A2, class A3, class A4, class tagb, class A1b, class A2b, class A3b, class A4b>\ninline typename detail::expression<tag, A1, A2, A3, A4>::result_type(max)(const detail::expression<tag, A1, A2, A3, A4>& a, const detail::expression<tagb, A1b, A2b, A3b, A4b>& b)\n{\n   typename detail::expression<tag, A1, A2, A3, A4>::result_type t1(a), t2(b);\n   if (t1 > t2)\n      return std::move(t1);\n   return std::move(t2);\n}\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline typename detail::expression<tag, A1, A2, A3, A4>::result_type(max)(const detail::expression<tag, A1, A2, A3, A4>& a, const detail::expression<tag, A1, A2, A3, A4>& b)\n{\n   typename detail::expression<tag, A1, A2, A3, A4>::result_type t1(a), t2(b);\n   if (t1 > t2)\n      return std::move(t1);\n   return std::move(t2);\n}\n\n}} // namespace boost::multiprecision\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/no_et_ops.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_NO_ET_OPS_HPP\n#define BOOST_MP_NO_ET_OPS_HPP\n\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4714)\n#endif\n\nnamespace boost {\n   namespace multiprecision {\n\n      //\n      // Operators for non-expression template enabled number.\n      // NOTE: this is not a complete header - really just a suffix to default_ops.hpp.\n      // NOTE: these operators have to be defined after the methods in default_ops.hpp.\n      //\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number<B, et_off> operator-(const number<B, et_off>& v)\n      {\n         static_assert(is_signed_number<B>::value, \"Negating an unsigned type results in ill-defined behavior.\");\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(v);\n         number<B, et_off>                                                    result(v);\n         result.backend().negate();\n         return result;\n      }\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number<B, et_off> operator~(const number<B, et_off>& v)\n      {\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(v);\n         number<B, et_off>                                                    result;\n         eval_complement(result.backend(), v.backend());\n         return result;\n      }\n      //\n      // Addition:\n      //\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number<B, et_off> operator+(const number<B, et_off>& a, const number<B, et_off>& b)\n      {\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         number<B, et_off>                                                    result;\n         using default_ops::eval_add;\n         eval_add(result.backend(), a.backend(), b.backend());\n         return result;\n      }\n      template <class B, class V>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value, number<B, et_off> >::type\n         operator+(const number<B, et_off>& a, const V& b)\n      {\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         number<B, et_off>                                                    result;\n         using default_ops::eval_add;\n         eval_add(result.backend(), a.backend(), number<B, et_off>::canonical_value(b));\n         return result;\n      }\n      template <class V, class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && !is_equivalent_number_type<V, B>::value, number<B, et_off> >::type\n         operator+(const V& a, const number<B, et_off>& b)\n      {\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(b, a);\n         number<B, et_off>                                                    result;\n         using default_ops::eval_add;\n         eval_add(result.backend(), b.backend(), number<B, et_off>::canonical_value(a));\n         return result;\n      }\n      //\n      // Subtraction:\n      //\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number<B, et_off> operator-(const number<B, et_off>& a, const number<B, et_off>& b)\n      {\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         number<B, et_off>                                                    result;\n         using default_ops::eval_subtract;\n         eval_subtract(result.backend(), a.backend(), b.backend());\n         return result;\n      }\n      template <class B, class V>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value, number<B, et_off> >::type\n         operator-(const number<B, et_off>& a, const V& b)\n      {\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         number<B, et_off>                                                    result;\n         using default_ops::eval_subtract;\n         eval_subtract(result.backend(), a.backend(), number<B, et_off>::canonical_value(b));\n         return result;\n      }\n      template <class V, class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && !is_equivalent_number_type<V, B>::value, number<B, et_off> >::type\n         operator-(const V& a, const number<B, et_off>& b)\n      {\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(b, a);\n         number<B, et_off>                                                    result;\n         using default_ops::eval_subtract;\n         eval_subtract(result.backend(), number<B, et_off>::canonical_value(a), b.backend());\n         return result;\n      }\n      //\n      // Multiply:\n      //\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number<B, et_off> operator*(const number<B, et_off>& a, const number<B, et_off>& b)\n      {\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         number<B, et_off>                                                    result;\n         using default_ops::eval_multiply;\n         eval_multiply(result.backend(), a.backend(), b.backend());\n         return result;\n      }\n      template <class B, class V>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value, number<B, et_off> >::type\n         operator*(const number<B, et_off>& a, const V& b)\n      {\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         number<B, et_off>                                                    result;\n         using default_ops::eval_multiply;\n         eval_multiply(result.backend(), a.backend(), number<B, et_off>::canonical_value(b));\n         return result;\n      }\n      template <class V, class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && !is_equivalent_number_type<V, B>::value, number<B, et_off> >::type\n         operator*(const V& a, const number<B, et_off>& b)\n      {\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(b, a);\n         number<B, et_off>                                                    result;\n         using default_ops::eval_multiply;\n         eval_multiply(result.backend(), b.backend(), number<B, et_off>::canonical_value(a));\n         return result;\n      }\n      //\n      // divide:\n      //\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number<B, et_off> operator/(const number<B, et_off>& a, const number<B, et_off>& b)\n      {\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         number<B, et_off>                                                    result;\n         using default_ops::eval_divide;\n         eval_divide(result.backend(), a.backend(), b.backend());\n         return result;\n      }\n      template <class B, class V>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value, number<B, et_off> >::type\n         operator/(const number<B, et_off>& a, const V& b)\n      {\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         number<B, et_off>                                                    result;\n         using default_ops::eval_divide;\n         eval_divide(result.backend(), a.backend(), number<B, et_off>::canonical_value(b));\n         return result;\n      }\n      template <class V, class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && !is_equivalent_number_type<V, B>::value, number<B, et_off> >::type\n         operator/(const V& a, const number<B, et_off>& b)\n      {\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(b, a);\n         number<B, et_off>                                                    result;\n         using default_ops::eval_divide;\n         eval_divide(result.backend(), number<B, et_off>::canonical_value(a), b.backend());\n         return result;\n      }\n      //\n      // modulus:\n      //\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer, number<B, et_off> >::type operator%(const number<B, et_off>& a, const number<B, et_off>& b)\n      {\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         number<B, et_off>                                                    result;\n         using default_ops::eval_modulus;\n         eval_modulus(result.backend(), a.backend(), b.backend());\n         return result;\n      }\n      template <class B, class V>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && (number_category<B>::value == number_kind_integer), number<B, et_off> >::type\n         operator%(const number<B, et_off>& a, const V& b)\n      {\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a);\n         number<B, et_off>                                                    result;\n         using default_ops::eval_modulus;\n         eval_modulus(result.backend(), a.backend(), number<B, et_off>::canonical_value(b));\n         return result;\n      }\n      template <class V, class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && (number_category<B>::value == number_kind_integer) && !is_equivalent_number_type<V, B>::value, number<B, et_off> >::type\n         operator%(const V& a, const number<B, et_off>& b)\n      {\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(b);\n         number<B, et_off>                                                    result;\n         using default_ops::eval_modulus;\n         eval_modulus(result.backend(), number<B, et_off>::canonical_value(a), b.backend());\n         return result;\n      }\n      //\n      // Bitwise or:\n      //\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer, number<B, et_off> >::type operator|(const number<B, et_off>& a, const number<B, et_off>& b)\n      {\n         number<B, et_off> result;\n         using default_ops::eval_bitwise_or;\n         eval_bitwise_or(result.backend(), a.backend(), b.backend());\n         return result;\n      }\n      template <class B, class V>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && (number_category<B>::value == number_kind_integer), number<B, et_off> >::type\n         operator|(const number<B, et_off>& a, const V& b)\n      {\n         number<B, et_off> result;\n         using default_ops::eval_bitwise_or;\n         eval_bitwise_or(result.backend(), a.backend(), number<B, et_off>::canonical_value(b));\n         return result;\n      }\n      template <class V, class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && (number_category<B>::value == number_kind_integer) && !is_equivalent_number_type<V, B>::value, number<B, et_off> >::type\n         operator|(const V& a, const number<B, et_off>& b)\n      {\n         number<B, et_off> result;\n         using default_ops::eval_bitwise_or;\n         eval_bitwise_or(result.backend(), b.backend(), number<B, et_off>::canonical_value(a));\n         return result;\n      }\n      //\n      // Bitwise xor:\n      //\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer, number<B, et_off> >::type operator^(const number<B, et_off>& a, const number<B, et_off>& b)\n      {\n         number<B, et_off> result;\n         using default_ops::eval_bitwise_xor;\n         eval_bitwise_xor(result.backend(), a.backend(), b.backend());\n         return result;\n      }\n      template <class B, class V>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && (number_category<B>::value == number_kind_integer), number<B, et_off> >::type\n         operator^(const number<B, et_off>& a, const V& b)\n      {\n         number<B, et_off> result;\n         using default_ops::eval_bitwise_xor;\n         eval_bitwise_xor(result.backend(), a.backend(), number<B, et_off>::canonical_value(b));\n         return result;\n      }\n      template <class V, class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && (number_category<B>::value == number_kind_integer) && !is_equivalent_number_type<V, B>::value, number<B, et_off> >::type\n         operator^(const V& a, const number<B, et_off>& b)\n      {\n         number<B, et_off> result;\n         using default_ops::eval_bitwise_xor;\n         eval_bitwise_xor(result.backend(), b.backend(), number<B, et_off>::canonical_value(a));\n         return result;\n      }\n      //\n      // Bitwise and:\n      //\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer, number<B, et_off> >::type operator&(const number<B, et_off>& a, const number<B, et_off>& b)\n      {\n         number<B, et_off> result;\n         using default_ops::eval_bitwise_and;\n         eval_bitwise_and(result.backend(), a.backend(), b.backend());\n         return result;\n      }\n      template <class B, class V>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && (number_category<B>::value == number_kind_integer), number<B, et_off> >::type\n         operator&(const number<B, et_off>& a, const V& b)\n      {\n         number<B, et_off> result;\n         using default_ops::eval_bitwise_and;\n         eval_bitwise_and(result.backend(), a.backend(), number<B, et_off>::canonical_value(b));\n         return result;\n      }\n      template <class V, class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && (number_category<B>::value == number_kind_integer) && !is_equivalent_number_type<V, B>::value, number<B, et_off> >::type\n         operator&(const V& a, const number<B, et_off>& b)\n      {\n         number<B, et_off> result;\n         using default_ops::eval_bitwise_and;\n         eval_bitwise_and(result.backend(), b.backend(), number<B, et_off>::canonical_value(a));\n         return result;\n      }\n      //\n      // shifts:\n      //\n      template <class B, class I>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<I>::value && (number_category<B>::value == number_kind_integer), number<B, et_off> >::type\n         operator<<(const number<B, et_off>& a, const I& b)\n      {\n         number<B, et_off> result(a);\n         using default_ops::eval_left_shift;\n         detail::check_shift_range(b, std::integral_constant<bool, (sizeof(I) > sizeof(std::size_t))>(), std::integral_constant<bool, boost::multiprecision::detail::is_signed<I>::value>());\n         eval_left_shift(result.backend(), b);\n         return result;\n      }\n      template <class B, class I>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<I>::value && (number_category<B>::value == number_kind_integer), number<B, et_off> >::type\n         operator>>(const number<B, et_off>& a, const I& b)\n      {\n         number<B, et_off> result(a);\n         using default_ops::eval_right_shift;\n         detail::check_shift_range(b, std::integral_constant<bool, (sizeof(I) > sizeof(std::size_t))>(), std::integral_constant<bool, boost::multiprecision::detail::is_signed<I>::value>());\n         eval_right_shift(result.backend(), b);\n         return result;\n      }\n\n      //\n      // If we have rvalue references go all over again with rvalue ref overloads and move semantics.\n      // Note that while it would be tempting to implement these so they return an rvalue reference\n      // (and indeed this would be optimally efficient), this is unsafe due to users propensity to\n      // write:\n      //\n      // const T& t = a * b;\n      //\n      // which would lead to a dangling reference if we didn't return by value.  Of course move\n      // semantics help a great deal in return by value, so performance is still pretty good...\n      //\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number<B, et_off> operator-(number<B, et_off>&& v)\n      {\n         static_assert(is_signed_number<B>::value, \"Negating an unsigned type results in ill-defined behavior.\");\n         v.backend().negate();\n         return std::move(v);\n      }\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer, number<B, et_off> >::type operator~(number<B, et_off>&& v)\n      {\n         eval_complement(v.backend(), v.backend());\n         return std::move(v);\n      }\n      //\n      // Addition:\n      //\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number<B, et_off> operator+(number<B, et_off>&& a, const number<B, et_off>& b)\n      {\n         using default_ops::eval_add;\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         eval_add(a.backend(), b.backend());\n         return std::move(a);\n      }\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number<B, et_off> operator+(const number<B, et_off>& a, number<B, et_off>&& b)\n      {\n         using default_ops::eval_add;\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         eval_add(b.backend(), a.backend());\n         return std::move(b);\n      }\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number<B, et_off> operator+(number<B, et_off>&& a, number<B, et_off>&& b)\n      {\n         using default_ops::eval_add;\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         eval_add(a.backend(), b.backend());\n         return std::move(a);\n      }\n      template <class B, class V>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value, number<B, et_off> >::type\n         operator+(number<B, et_off>&& a, const V& b)\n      {\n         using default_ops::eval_add;\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         eval_add(a.backend(), number<B, et_off>::canonical_value(b));\n         return std::move(a);\n      }\n      template <class V, class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && !is_equivalent_number_type<V, B>::value, number<B, et_off> >::type\n         operator+(const V& a, number<B, et_off>&& b)\n      {\n         using default_ops::eval_add;\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         eval_add(b.backend(), number<B, et_off>::canonical_value(a));\n         return std::move(b);\n      }\n      //\n      // Subtraction:\n      //\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number<B, et_off> operator-(number<B, et_off>&& a, const number<B, et_off>& b)\n      {\n         using default_ops::eval_subtract;\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         eval_subtract(a.backend(), b.backend());\n         return std::move(a);\n      }\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_signed_number<B>::value, number<B, et_off> >::type operator-(const number<B, et_off>& a, number<B, et_off>&& b)\n      {\n         using default_ops::eval_subtract;\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         eval_subtract(b.backend(), a.backend());\n         b.backend().negate();\n         return std::move(b);\n      }\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number<B, et_off> operator-(number<B, et_off>&& a, number<B, et_off>&& b)\n      {\n         using default_ops::eval_subtract;\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         eval_subtract(a.backend(), b.backend());\n         return std::move(a);\n      }\n      template <class B, class V>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value, number<B, et_off> >::type\n         operator-(number<B, et_off>&& a, const V& b)\n      {\n         using default_ops::eval_subtract;\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         eval_subtract(a.backend(), number<B, et_off>::canonical_value(b));\n         return std::move(a);\n      }\n      template <class V, class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<(is_compatible_arithmetic_type<V, number<B, et_off> >::value && is_signed_number<B>::value) && !is_equivalent_number_type<V, B>::value, number<B, et_off> >::type\n         operator-(const V& a, number<B, et_off>&& b)\n      {\n         using default_ops::eval_subtract;\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         eval_subtract(b.backend(), number<B, et_off>::canonical_value(a));\n         b.backend().negate();\n         return std::move(b);\n      }\n      //\n      // Multiply:\n      //\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number<B, et_off> operator*(number<B, et_off>&& a, const number<B, et_off>& b)\n      {\n         using default_ops::eval_multiply;\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         eval_multiply(a.backend(), b.backend());\n         return std::move(a);\n      }\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number<B, et_off> operator*(const number<B, et_off>& a, number<B, et_off>&& b)\n      {\n         using default_ops::eval_multiply;\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         eval_multiply(b.backend(), a.backend());\n         return std::move(b);\n      }\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number<B, et_off> operator*(number<B, et_off>&& a, number<B, et_off>&& b)\n      {\n         using default_ops::eval_multiply;\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         eval_multiply(a.backend(), b.backend());\n         return std::move(a);\n      }\n      template <class B, class V>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value, number<B, et_off> >::type\n         operator*(number<B, et_off>&& a, const V& b)\n      {\n         using default_ops::eval_multiply;\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         eval_multiply(a.backend(), number<B, et_off>::canonical_value(b));\n         return std::move(a);\n      }\n      template <class V, class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && !is_equivalent_number_type<V, B>::value, number<B, et_off> >::type\n         operator*(const V& a, number<B, et_off>&& b)\n      {\n         using default_ops::eval_multiply;\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         eval_multiply(b.backend(), number<B, et_off>::canonical_value(a));\n         return std::move(b);\n      }\n      //\n      // divide:\n      //\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number<B, et_off> operator/(number<B, et_off>&& a, const number<B, et_off>& b)\n      {\n         using default_ops::eval_divide;\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         eval_divide(a.backend(), b.backend());\n         return std::move(a);\n      }\n      template <class B, class V>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value, number<B, et_off> >::type\n         operator/(number<B, et_off>&& a, const V& b)\n      {\n         using default_ops::eval_divide;\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         eval_divide(a.backend(), number<B, et_off>::canonical_value(b));\n         return std::move(a);\n      }\n      //\n      // modulus:\n      //\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer, number<B, et_off> >::type operator%(number<B, et_off>&& a, const number<B, et_off>& b)\n      {\n         using default_ops::eval_modulus;\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         eval_modulus(a.backend(), b.backend());\n         return std::move(a);\n      }\n      template <class B, class V>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && (number_category<B>::value == number_kind_integer), number<B, et_off> >::type\n         operator%(number<B, et_off>&& a, const V& b)\n      {\n         using default_ops::eval_modulus;\n         detail::scoped_default_precision<multiprecision::number<B, et_off> > precision_guard(a, b);\n         eval_modulus(a.backend(), number<B, et_off>::canonical_value(b));\n         return std::move(a);\n      }\n      //\n      // Bitwise or:\n      //\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer, number<B, et_off> >::type operator|(number<B, et_off>&& a, const number<B, et_off>& b)\n      {\n         using default_ops::eval_bitwise_or;\n         eval_bitwise_or(a.backend(), b.backend());\n         return std::move(a);\n      }\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer, number<B, et_off> >::type operator|(const number<B, et_off>& a, number<B, et_off>&& b)\n      {\n         using default_ops::eval_bitwise_or;\n         eval_bitwise_or(b.backend(), a.backend());\n         return std::move(b);\n      }\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer, number<B, et_off> >::type operator|(number<B, et_off>&& a, number<B, et_off>&& b)\n      {\n         using default_ops::eval_bitwise_or;\n         eval_bitwise_or(a.backend(), b.backend());\n         return std::move(a);\n      }\n      template <class B, class V>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && (number_category<B>::value == number_kind_integer), number<B, et_off> >::type\n         operator|(number<B, et_off>&& a, const V& b)\n      {\n         using default_ops::eval_bitwise_or;\n         eval_bitwise_or(a.backend(), number<B, et_off>::canonical_value(b));\n         return std::move(a);\n      }\n      template <class V, class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && (number_category<B>::value == number_kind_integer) && !is_equivalent_number_type<V, B>::value, number<B, et_off> >::type\n         operator|(const V& a, number<B, et_off>&& b)\n      {\n         using default_ops::eval_bitwise_or;\n         eval_bitwise_or(b.backend(), number<B, et_off>::canonical_value(a));\n         return std::move(b);\n      }\n      //\n      // Bitwise xor:\n      //\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer, number<B, et_off> >::type operator^(number<B, et_off>&& a, const number<B, et_off>& b)\n      {\n         using default_ops::eval_bitwise_xor;\n         eval_bitwise_xor(a.backend(), b.backend());\n         return std::move(a);\n      }\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer, number<B, et_off> >::type operator^(const number<B, et_off>& a, number<B, et_off>&& b)\n      {\n         using default_ops::eval_bitwise_xor;\n         eval_bitwise_xor(b.backend(), a.backend());\n         return std::move(b);\n      }\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer, number<B, et_off> >::type operator^(number<B, et_off>&& a, number<B, et_off>&& b)\n      {\n         using default_ops::eval_bitwise_xor;\n         eval_bitwise_xor(a.backend(), b.backend());\n         return std::move(a);\n      }\n      template <class B, class V>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && (number_category<B>::value == number_kind_integer), number<B, et_off> >::type\n         operator^(number<B, et_off>&& a, const V& b)\n      {\n         using default_ops::eval_bitwise_xor;\n         eval_bitwise_xor(a.backend(), number<B, et_off>::canonical_value(b));\n         return std::move(a);\n      }\n      template <class V, class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && (number_category<B>::value == number_kind_integer) && !is_equivalent_number_type<V, B>::value, number<B, et_off> >::type\n         operator^(const V& a, number<B, et_off>&& b)\n      {\n         using default_ops::eval_bitwise_xor;\n         eval_bitwise_xor(b.backend(), number<B, et_off>::canonical_value(a));\n         return std::move(b);\n      }\n      //\n      // Bitwise and:\n      //\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer, number<B, et_off> >::type operator&(number<B, et_off>&& a, const number<B, et_off>& b)\n      {\n         using default_ops::eval_bitwise_and;\n         eval_bitwise_and(a.backend(), b.backend());\n         return std::move(a);\n      }\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer, number<B, et_off> >::type operator&(const number<B, et_off>& a, number<B, et_off>&& b)\n      {\n         using default_ops::eval_bitwise_and;\n         eval_bitwise_and(b.backend(), a.backend());\n         return std::move(b);\n      }\n      template <class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<B>::value == number_kind_integer, number<B, et_off> >::type operator&(number<B, et_off>&& a, number<B, et_off>&& b)\n      {\n         using default_ops::eval_bitwise_and;\n         eval_bitwise_and(a.backend(), b.backend());\n         return std::move(a);\n      }\n      template <class B, class V>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && (number_category<B>::value == number_kind_integer), number<B, et_off> >::type\n         operator&(number<B, et_off>&& a, const V& b)\n      {\n         using default_ops::eval_bitwise_and;\n         eval_bitwise_and(a.backend(), number<B, et_off>::canonical_value(b));\n         return std::move(a);\n      }\n      template <class V, class B>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_compatible_arithmetic_type<V, number<B, et_off> >::value && (number_category<B>::value == number_kind_integer) && !is_equivalent_number_type<V, B>::value, number<B, et_off> >::type\n         operator&(const V& a, number<B, et_off>&& b)\n      {\n         using default_ops::eval_bitwise_and;\n         eval_bitwise_and(b.backend(), number<B, et_off>::canonical_value(a));\n         return std::move(b);\n      }\n      //\n      // shifts:\n      //\n      template <class B, class I>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<I>::value && (number_category<B>::value == number_kind_integer), number<B, et_off> >::type\n         operator<<(number<B, et_off>&& a, const I& b)\n      {\n         using ui_type = typename boost::multiprecision::detail::make_unsigned<I>::type;\n\n         using default_ops::eval_left_shift;\n         eval_left_shift(a.backend(), static_cast<ui_type>(b));\n         return std::move(a);\n      }\n      template <class B, class I>\n      BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<I>::value && (number_category<B>::value == number_kind_integer), number<B, et_off> >::type\n         operator>>(number<B, et_off>&& a, const I& b)\n      {\n         using ui_type = typename boost::multiprecision::detail::make_unsigned<I>::type;\n\n         using default_ops::eval_right_shift;\n         eval_right_shift(a.backend(), static_cast<ui_type>(b));\n         return std::move(a);\n      }\n   }\n} // namespace boost::multiprecision\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#endif // BOOST_MP_NO_ET_OPS_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/no_exceptions_support.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2004 - 2021 Pavel Vozenilek.\n//  Copyright 2021 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_DETAIL_NO_EXCEPTIONS_SUPPORT_HPP\n#define BOOST_MP_DETAIL_NO_EXCEPTIONS_SUPPORT_HPP\n\n#include <boost/multiprecision/detail/standalone_config.hpp>\n\n#ifdef BOOST_MP_STANDALONE\n\n#ifndef BOOST_NO_EXCEPTIONS\n#   define BOOST_MP_TRY { try\n#   define BOOST_MP_CATCH(x) catch(x)\n#   define BOOST_MP_RETHROW throw;\n#   define BOOST_MP_CATCH_END }\n#   define BOOST_MP_THROW_EXCEPTION(x) throw (x);\n#else\n#   if !defined(BOOST_MSVC) || BOOST_MSVC >= 1900\n#       define BOOST_MP_TRY { if (true)\n#       define BOOST_MP_CATCH(x) else if (false)\n#   else\n        // warning C4127: conditional expression is constant\n#       define BOOST_MP_TRY { \\\n            __pragma(warning(push)) \\\n            __pragma(warning(disable: 4127)) \\\n            if (true) \\\n            __pragma(warning(pop))\n#       define BOOST_MP_CATCH(x) else \\\n            __pragma(warning(push)) \\\n            __pragma(warning(disable: 4127)) \\\n            if (false) \\\n            __pragma(warning(pop))\n#   endif\n#   define BOOST_MP_RETHROW\n#   define BOOST_MP_CATCH_END }\n#   define BOOST_MP_THROW_EXCEPTION(x) {static_cast<void>(x);}\n#endif\n\n#else // Not standalone mode\n\n#   include <boost/core/no_exceptions_support.hpp>\n#   include <boost/throw_exception.hpp>\n\n#   define BOOST_MP_TRY BOOST_TRY\n#   define BOOST_MP_CATCH(x) BOOST_CATCH(x)\n#   define BOOST_MP_RETHROW BOOST_RETHROW\n#   define BOOST_MP_CATCH_END BOOST_CATCH_END\n#   define BOOST_MP_THROW_EXCEPTION(x) BOOST_THROW_EXCEPTION(x)\n\n#endif // BOOST_MP_STANDALONE\n\n#endif // BOOST_MP_DETAIL_NO_EXCEPTIONS_SUPPORT_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/number_base.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_NUMBER_BASE_HPP\n#define BOOST_MP_NUMBER_BASE_HPP\n\n#include <climits>\n#include <ios>\n#include <string>\n#include <limits>\n#include <type_traits>\n#include <stdexcept>\n#include <tuple>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/traits/transcendental_reduction_type.hpp>\n#include <boost/multiprecision/traits/std_integer_traits.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4307)\n#pragma warning(pop)\n#endif\n\n#ifndef BOOST_MP_STANDALONE\n#include <boost/lexical_cast.hpp>\n#include <boost/core/nvp.hpp>\n#endif\n\n#ifdef BOOST_MP_MATH_AVAILABLE\n#include <boost/math/tools/complex.hpp>\n#endif\n\n// We now require C++11.\n#include <boost/multiprecision/detail/check_cpp11_config.hpp>\n\n#if defined(NDEBUG) && !defined(_DEBUG)\n#define BOOST_MP_FORCEINLINE BOOST_FORCEINLINE\n#else\n#define BOOST_MP_FORCEINLINE inline\n#endif\n\n//\n// Thread local storage:\n// Note fails on Mingw, see https://sourceforge.net/p/mingw-w64/bugs/527/\n//\n#if defined(BOOST_NO_CXX11_THREAD_LOCAL)\n#define BOOST_MP_THREAD_LOCAL\n#elif !(defined(__MINGW32__) && (defined(__GNUC__) && (__GNUC__ < 9)) && !defined(__clang__))\n#define BOOST_MP_THREAD_LOCAL thread_local\n#define BOOST_MP_USING_THREAD_LOCAL\n#else\n#pragma GCC warning \"thread_local on mingw is broken, please use MSys mingw gcc-9 or later, see https://sourceforge.net/p/mingw-w64/bugs/527/\"\n#define BOOST_MP_THREAD_LOCAL\n#endif\n\n#ifdef __has_include\n# if __has_include(<version>)\n#  include <version>\n#  ifdef __cpp_lib_is_constant_evaluated\n#   include <type_traits>\n#   define BOOST_MP_HAS_IS_CONSTANT_EVALUATED\n#  endif\n# endif\n#endif\n\n#ifdef __has_builtin\n#if __has_builtin(__builtin_is_constant_evaluated) && !defined(BOOST_NO_CXX14_CONSTEXPR) && !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)\n#define BOOST_MP_HAS_BUILTIN_IS_CONSTANT_EVALUATED\n#endif\n#endif\n//\n// MSVC also supports __builtin_is_constant_evaluated if it's recent enough:\n//\n#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 192528326)\n#  define BOOST_MP_HAS_BUILTIN_IS_CONSTANT_EVALUATED\n#endif\n//\n// As does GCC-9:\n//\n#if defined(BOOST_GCC) && !defined(BOOST_NO_CXX14_CONSTEXPR) && (__GNUC__ >= 9) && !defined(BOOST_MP_HAS_BUILTIN_IS_CONSTANT_EVALUATED)\n#  define BOOST_MP_HAS_BUILTIN_IS_CONSTANT_EVALUATED\n#endif\n\n#if defined(BOOST_MP_HAS_IS_CONSTANT_EVALUATED) && !defined(BOOST_NO_CXX14_CONSTEXPR)\n#  define BOOST_MP_IS_CONST_EVALUATED(x) std::is_constant_evaluated()\n#elif defined(BOOST_MP_HAS_BUILTIN_IS_CONSTANT_EVALUATED)\n#  define BOOST_MP_IS_CONST_EVALUATED(x) __builtin_is_constant_evaluated()\n#elif !defined(BOOST_NO_CXX14_CONSTEXPR) && defined(BOOST_GCC) && (__GNUC__ >= 6)\n#  define BOOST_MP_IS_CONST_EVALUATED(x) __builtin_constant_p(x)\n#else\n#  define BOOST_MP_NO_CONSTEXPR_DETECTION\n#endif\n\n#define BOOST_MP_CXX14_CONSTEXPR BOOST_CXX14_CONSTEXPR\n//\n// Early compiler versions trip over the constexpr code:\n//\n#if defined(__clang__) && (__clang_major__ < 5)\n#undef BOOST_MP_CXX14_CONSTEXPR\n#define BOOST_MP_CXX14_CONSTEXPR\n#endif\n#if defined(__apple_build_version__) && (__clang_major__ < 9)\n#undef BOOST_MP_CXX14_CONSTEXPR\n#define BOOST_MP_CXX14_CONSTEXPR\n#endif\n#if defined(BOOST_GCC) && (__GNUC__ < 6)\n#undef BOOST_MP_CXX14_CONSTEXPR\n#define BOOST_MP_CXX14_CONSTEXPR\n#endif\n#if defined(BOOST_INTEL)\n#undef BOOST_MP_CXX14_CONSTEXPR\n#define BOOST_MP_CXX14_CONSTEXPR\n#define BOOST_MP_NO_CONSTEXPR_DETECTION\n#endif\n\n#ifdef BOOST_MP_NO_CONSTEXPR_DETECTION\n#  define BOOST_CXX14_CONSTEXPR_IF_DETECTION\n#else\n#  define BOOST_CXX14_CONSTEXPR_IF_DETECTION constexpr\n#endif\n\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 6326)\n#endif\n\nnamespace boost {\nnamespace multiprecision {\n\nenum expression_template_option\n{\n   et_off = 0,\n   et_on  = 1\n};\n\nenum struct variable_precision_options : signed char\n{\n   assume_uniform_precision = -1,\n   preserve_target_precision = 0,\n   preserve_source_precision = 1,\n   preserve_component_precision = 2,\n   preserve_related_precision = 3,\n   preserve_all_precision = 4,\n};\n\ninline constexpr bool operator==(variable_precision_options a, variable_precision_options b)\n{\n   return static_cast<unsigned>(a) == static_cast<unsigned>(b);\n}\n\ntemplate <class Backend>\nstruct expression_template_default\n{\n   static constexpr expression_template_option value = et_on;\n};\n\ntemplate <class Backend, expression_template_option ExpressionTemplates = expression_template_default<Backend>::value>\nclass number;\n\ntemplate <class T>\nstruct is_number : public std::integral_constant<bool, false>\n{};\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\nstruct is_number<number<Backend, ExpressionTemplates> > : public std::integral_constant<bool, true>\n{};\n\ntemplate <class T>\nstruct is_et_number : public std::integral_constant<bool, false>\n{};\n\ntemplate <class Backend>\nstruct is_et_number<number<Backend, et_on> > : public std::integral_constant<bool, true>\n{};\n\ntemplate <class T>\nstruct is_no_et_number : public std::integral_constant<bool, false>\n{};\n\ntemplate <class Backend>\nstruct is_no_et_number<number<Backend, et_off> > : public std::integral_constant<bool, true>\n{};\n\nnamespace detail {\n\n// Forward-declare an expression wrapper\ntemplate <class tag, class Arg1 = void, class Arg2 = void, class Arg3 = void, class Arg4 = void>\nstruct expression;\n\n} // namespace detail\n\ntemplate <class T>\nstruct is_number_expression : public std::integral_constant<bool, false>\n{};\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\nstruct is_number_expression<detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > : public std::integral_constant<bool, true>\n{};\n\ntemplate <class T, class Num>\nstruct is_compatible_arithmetic_type\n    : public std::integral_constant<bool, \n          std::is_convertible<T, Num>::value && !std::is_same<T, Num>::value && !is_number_expression<T>::value>\n{};\n\nnamespace detail {\n//\n// Workaround for missing abs(long long) and abs(__int128) on some compilers:\n//\ntemplate <class T>\nconstexpr typename std::enable_if<(boost::multiprecision::detail::is_signed<T>::value || std::is_floating_point<T>::value), T>::type abs(T t) noexcept\n{\n   // This strange expression avoids a hardware trap in the corner case\n   // that val is the most negative value permitted in long long.\n   // See https://svn.boost.org/trac/boost/ticket/9740.\n   return t < 0 ? T(1u) + T(-(t + 1)) : t;\n}\ntemplate <class T>\nconstexpr typename std::enable_if<boost::multiprecision::detail::is_unsigned<T>::value, T>::type abs(T t) noexcept\n{\n   return t;\n}\n\n#define BOOST_MP_USING_ABS using boost::multiprecision::detail::abs;\n\ntemplate <class T>\nconstexpr typename std::enable_if<(boost::multiprecision::detail::is_signed<T>::value || std::is_floating_point<T>::value), typename boost::multiprecision::detail::make_unsigned<T>::type>::type unsigned_abs(T t) noexcept\n{\n   // This strange expression avoids a hardware trap in the corner case\n   // that val is the most negative value permitted in long long.\n   // See https://svn.boost.org/trac/boost/ticket/9740.\n   return t < 0 ? static_cast<typename boost::multiprecision::detail::make_unsigned<T>::type>(1u) + static_cast<typename boost::multiprecision::detail::make_unsigned<T>::type>(-(t + 1)) : static_cast<typename boost::multiprecision::detail::make_unsigned<T>::type>(t);\n}\ntemplate <class T>\nconstexpr typename std::enable_if<boost::multiprecision::detail::is_unsigned<T>::value, T>::type unsigned_abs(T t) noexcept\n{\n   return t;\n}\n\ntemplate <class T>\nstruct bits_of\n{\n   static_assert(boost::multiprecision::detail::is_integral<T>::value || std::is_enum<T>::value || std::numeric_limits<T>::is_specialized, \"Failed integer size check\");\n   static constexpr unsigned value =\n       std::numeric_limits<T>::is_specialized ? std::numeric_limits<T>::digits\n                                              : sizeof(T) * CHAR_BIT - (boost::multiprecision::detail::is_signed<T>::value ? 1 : 0);\n};\n\n#if defined(_GLIBCXX_USE_FLOAT128) && defined(BOOST_GCC) && !defined(__STRICT_ANSI__)\n#define BOOST_MP_BITS_OF_FLOAT128_DEFINED\ntemplate <>\nstruct bits_of<float128_type>\n{\n   static constexpr unsigned value = 113;\n};\n#endif\n\ntemplate <int b>\nstruct has_enough_bits\n{\n   template <class T>\n   struct type : public std::integral_constant<bool, bits_of<T>::value >= b>\n   {};\n};\n\ntemplate <class Tuple, int i, int digits, bool = (i >= std::tuple_size<Tuple>::value)>\nstruct find_index_of_large_enough_type\n{\n   static constexpr int value = bits_of<typename std::tuple_element<static_cast<std::size_t>(i), Tuple>::type>::value >= digits ? i : find_index_of_large_enough_type<Tuple, i + 1, digits>::value;\n};\ntemplate <class Tuple, int i, int digits>\nstruct find_index_of_large_enough_type<Tuple, i, digits, true>\n{\n   static constexpr int value = INT_MAX;\n};\n\ntemplate <int index, class Tuple, class Fallback, bool = (std::tuple_size<Tuple>::value <= index)>\nstruct dereference_tuple\n{\n   using type = typename std::tuple_element<static_cast<std::size_t>(index), Tuple>::type;\n};\ntemplate <int index, class Tuple, class Fallback>\nstruct dereference_tuple<index, Tuple, Fallback, true>\n{\n   using type = Fallback;\n};\n\ntemplate <class Val, class Backend, class Tag>\nstruct canonical_imp\n{\n   using type = typename std::remove_cv<typename std::decay<const Val>::type>::type;\n};\ntemplate <class B, class Backend, class Tag>\nstruct canonical_imp<number<B, et_on>, Backend, Tag>\n{\n   using type = B;\n};\ntemplate <class B, class Backend, class Tag>\nstruct canonical_imp<number<B, et_off>, Backend, Tag>\n{\n   using type = B;\n};\n#ifdef __SUNPRO_CC\ntemplate <class B, class Backend>\nstruct canonical_imp<number<B, et_on>, Backend, std::integral_constant<int, 3> >\n{\n   using type = B;\n};\ntemplate <class B, class Backend>\nstruct canonical_imp<number<B, et_off>, Backend, std::integral_constant<int, 3> >\n{\n   using type = B;\n};\n#endif\ntemplate <class Val, class Backend>\nstruct canonical_imp<Val, Backend, std::integral_constant<int, 0> >\n{\n   static constexpr int index = find_index_of_large_enough_type<typename Backend::signed_types, 0, bits_of<Val>::value>::value;\n   using type = typename dereference_tuple<index, typename Backend::signed_types, Val>::type;\n};\ntemplate <class Val, class Backend>\nstruct canonical_imp<Val, Backend, std::integral_constant<int, 1> >\n{\n   static constexpr int index = find_index_of_large_enough_type<typename Backend::unsigned_types, 0, bits_of<Val>::value>::value;\n   using type = typename dereference_tuple<index, typename Backend::unsigned_types, Val>::type;\n};\ntemplate <class Val, class Backend>\nstruct canonical_imp<Val, Backend, std::integral_constant<int, 2> >\n{\n   static constexpr int index = find_index_of_large_enough_type<typename Backend::float_types, 0, bits_of<Val>::value>::value;\n   using type = typename dereference_tuple<index, typename Backend::float_types, Val>::type;\n};\ntemplate <class Val, class Backend>\nstruct canonical_imp<Val, Backend, std::integral_constant<int, 3> >\n{\n   using type = const char*;\n};\ntemplate <class Val, class Backend>\nstruct canonical_imp<Val, Backend, std::integral_constant<int, 4> >\n{\n   using underlying = typename std::underlying_type<Val>::type;\n   using tag = typename std::conditional<boost::multiprecision::detail::is_signed<Val>::value, std::integral_constant<int, 0>, std::integral_constant<int, 1>>::type;\n   using type = typename canonical_imp<underlying, Backend, tag>::type;\n};\n\ntemplate <class Val, class Backend>\nstruct canonical\n{\n   using tag_type = typename std::conditional<\n       boost::multiprecision::detail::is_signed<Val>::value && boost::multiprecision::detail::is_integral<Val>::value,\n       std::integral_constant<int, 0>,\n       typename std::conditional<\n           boost::multiprecision::detail::is_unsigned<Val>::value,\n           std::integral_constant<int, 1>,\n           typename std::conditional<\n               std::is_floating_point<Val>::value,\n               std::integral_constant<int, 2>,\n               typename std::conditional<\n                   (std::is_convertible<Val, const char*>::value || std::is_same<Val, std::string>::value),\n                   std::integral_constant<int, 3>,\n                   typename std::conditional<\n                     std::is_enum<Val>::value,\n                     std::integral_constant<int, 4>,\n                     std::integral_constant<int, 5> >::type>::type>::type>::type>::type;\n\n   using type = typename canonical_imp<Val, Backend, tag_type>::type;\n};\n\nstruct terminal\n{};\nstruct negate\n{};\nstruct plus\n{};\nstruct minus\n{};\nstruct multiplies\n{};\nstruct divides\n{};\nstruct modulus\n{};\nstruct shift_left\n{};\nstruct shift_right\n{};\nstruct bitwise_and\n{};\nstruct bitwise_or\n{};\nstruct bitwise_xor\n{};\nstruct bitwise_complement\n{};\nstruct add_immediates\n{};\nstruct subtract_immediates\n{};\nstruct multiply_immediates\n{};\nstruct divide_immediates\n{};\nstruct modulus_immediates\n{};\nstruct bitwise_and_immediates\n{};\nstruct bitwise_or_immediates\n{};\nstruct bitwise_xor_immediates\n{};\nstruct complement_immediates\n{};\nstruct function\n{};\nstruct multiply_add\n{};\nstruct multiply_subtract\n{};\n\ntemplate <class T>\nstruct backend_type;\n\ntemplate <class T, expression_template_option ExpressionTemplates>\nstruct backend_type<number<T, ExpressionTemplates> >\n{\n   using type = T;\n};\n\ntemplate <class tag, class A1, class A2, class A3, class A4>\nstruct backend_type<expression<tag, A1, A2, A3, A4> >\n{\n   using type = typename backend_type<typename expression<tag, A1, A2, A3, A4>::result_type>::type;\n};\n\ntemplate <class T1, class T2>\nstruct combine_expression\n{\n   using type = decltype(T1() + T2());\n};\n\ntemplate <class T1, expression_template_option ExpressionTemplates, class T2>\nstruct combine_expression<number<T1, ExpressionTemplates>, T2>\n{\n   using type = number<T1, ExpressionTemplates>;\n};\n\ntemplate <class T1, class T2, expression_template_option ExpressionTemplates>\nstruct combine_expression<T1, number<T2, ExpressionTemplates> >\n{\n   using type = number<T2, ExpressionTemplates>;\n};\n\ntemplate <class T, expression_template_option ExpressionTemplates>\nstruct combine_expression<number<T, ExpressionTemplates>, number<T, ExpressionTemplates> >\n{\n   using type = number<T, ExpressionTemplates>;\n};\n\ntemplate <class T1, expression_template_option ExpressionTemplates1, class T2, expression_template_option ExpressionTemplates2>\nstruct combine_expression<number<T1, ExpressionTemplates1>, number<T2, ExpressionTemplates2> >\n{\n   using type = typename std::conditional<\n       std::is_convertible<number<T2, ExpressionTemplates2>, number<T1, ExpressionTemplates2> >::value,\n       number<T1, ExpressionTemplates1>,\n       number<T2, ExpressionTemplates2> >::type;\n};\n\ntemplate <class T>\nstruct arg_type\n{\n   using type = expression<terminal, T>;\n};\n\ntemplate <class Tag, class Arg1, class Arg2, class Arg3, class Arg4>\nstruct arg_type<expression<Tag, Arg1, Arg2, Arg3, Arg4> >\n{\n   using type = expression<Tag, Arg1, Arg2, Arg3, Arg4>;\n};\n\nstruct unmentionable\n{\n   unmentionable* proc() { return nullptr; }\n};\n\ntypedef unmentionable* (unmentionable::*unmentionable_type)();\n\ntemplate <class T, bool b>\nstruct expression_storage_base\n{\n   using type = const T&;\n};\n\ntemplate <class T>\nstruct expression_storage_base<T, true>\n{\n   using type = T;\n};\n\ntemplate <class T>\nstruct expression_storage : public expression_storage_base<T, boost::multiprecision::detail::is_arithmetic<T>::value>\n{};\n\ntemplate <class T>\nstruct expression_storage<T*>\n{\n   using type = T*;\n};\n\ntemplate <class T>\nstruct expression_storage<const T*>\n{\n   using type = const T*;\n};\n\ntemplate <class tag, class A1, class A2, class A3, class A4>\nstruct expression_storage<expression<tag, A1, A2, A3, A4> >\n{\n   using type = expression<tag, A1, A2, A3, A4>;\n};\n\ntemplate <class tag, class Arg1>\nstruct expression<tag, Arg1, void, void, void>\n{\n   using arity = std::integral_constant<int, 1>                   ;\n   using left_type = typename arg_type<Arg1>::type  ;\n   using left_result_type = typename left_type::result_type;\n   using result_type = typename left_type::result_type;\n   using tag_type = tag                            ;\n\n   explicit BOOST_MP_CXX14_CONSTEXPR expression(const Arg1& a) : arg(a) {}\n   BOOST_MP_CXX14_CONSTEXPR expression(const expression& e) : arg(e.arg) {}\n\n   //\n   // If we have static_assert we can give a more useful error message\n   // than if we simply have no operator defined at all:\n   //\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not assign to a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR expression& operator++()\n   {\n      // This should always fail:\n      static_assert(sizeof(*this) == INT_MAX, \"You can not increment a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR expression& operator++(int)\n   {\n      // This should always fail:\n      static_assert(sizeof(*this) == INT_MAX, \"You can not increment a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR expression& operator--()\n   {\n      // This should always fail:\n      static_assert(sizeof(*this) == INT_MAX, \"You can not decrement a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR expression& operator--(int)\n   {\n      // This should always fail:\n      static_assert(sizeof(*this) == INT_MAX, \"You can not decrement a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator+=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator+= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator-=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator-= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator*=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator*= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator/=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator/= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator%=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator%= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator|=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator|= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator&=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator&= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator^=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator^= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator<<=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator<<= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator>>=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator>>= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n\n   BOOST_MP_CXX14_CONSTEXPR left_type left() const\n   {\n      return left_type(arg);\n   }\n\n   BOOST_MP_CXX14_CONSTEXPR const Arg1& left_ref() const noexcept { return arg; }\n\n   static constexpr unsigned depth = left_type::depth + 1;\n   template <class T\n#ifndef __SUNPRO_CC\n             ,\n             typename std::enable_if<!is_number<T>::value && !std::is_convertible<result_type, T const&>::value && std::is_constructible<T, result_type>::value, int>::type = 0\n#endif\n             >\n   explicit BOOST_MP_CXX14_CONSTEXPR operator T() const\n   {\n      return static_cast<T>(static_cast<result_type>(*this));\n   }\n   BOOST_MP_FORCEINLINE explicit BOOST_MP_CXX14_CONSTEXPR operator bool() const\n   {\n      result_type r(*this);\n      return static_cast<bool>(r);\n   }\n\n   template <class T>\n   BOOST_MP_CXX14_CONSTEXPR T convert_to()\n   {\n      result_type r(*this);\n      return r.template convert_to<T>();\n   }\n\n private:\n   typename expression_storage<Arg1>::type arg;\n   expression&                             operator=(const expression&);\n};\n\ntemplate <class Arg1>\nstruct expression<terminal, Arg1, void, void, void>\n{\n   using arity = std::integral_constant<int, 0>;\n   using result_type = Arg1        ;\n   using tag_type = terminal    ;\n\n   explicit BOOST_MP_CXX14_CONSTEXPR expression(const Arg1& a) : arg(a) {}\n   BOOST_MP_CXX14_CONSTEXPR expression(const expression& e) : arg(e.arg) {}\n\n   //\n   // If we have static_assert we can give a more useful error message\n   // than if we simply have no operator defined at all:\n   //\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not assign to a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR expression& operator++()\n   {\n      // This should always fail:\n      static_assert(sizeof(*this) == INT_MAX, \"You can not increment a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR expression& operator++(int)\n   {\n      // This should always fail:\n      static_assert(sizeof(*this) == INT_MAX, \"You can not increment a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR expression& operator--()\n   {\n      // This should always fail:\n      static_assert(sizeof(*this) == INT_MAX, \"You can not decrement a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR expression& operator--(int)\n   {\n      // This should always fail:\n      static_assert(sizeof(*this) == INT_MAX, \"You can not decrement a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator+=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator+= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator-=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator-= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator*=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator*= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator/=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator/= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator%=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator%= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator|=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator|= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator&=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator&= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator^=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator^= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator<<=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator<<= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator>>=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator>>= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n\n   BOOST_MP_CXX14_CONSTEXPR const Arg1& value() const noexcept\n   {\n      return arg;\n   }\n\n   static constexpr unsigned depth = 0;\n\n   template <class T\n#ifndef __SUNPRO_CC\n             ,\n             typename std::enable_if<!is_number<T>::value && !std::is_convertible<result_type, T const&>::value && std::is_constructible<T, result_type>::value, int>::type = 0\n#endif\n             >\n   explicit BOOST_MP_CXX14_CONSTEXPR operator T() const\n   {\n      return static_cast<T>(static_cast<result_type>(*this));\n   }\n   BOOST_MP_FORCEINLINE explicit BOOST_MP_CXX14_CONSTEXPR operator bool() const\n   {\n      result_type r(*this);\n      return static_cast<bool>(r);\n   }\n\n   template <class T>\n   BOOST_MP_CXX14_CONSTEXPR T convert_to()\n   {\n      result_type r(*this);\n      return r.template convert_to<T>();\n   }\n\n private:\n   typename expression_storage<Arg1>::type arg;\n   expression&                             operator=(const expression&);\n};\n\ntemplate <class tag, class Arg1, class Arg2>\nstruct expression<tag, Arg1, Arg2, void, void>\n{\n   using arity = std::integral_constant<int, 2>                                                          ;\n   using left_type = typename arg_type<Arg1>::type                                         ;\n   using right_type = typename arg_type<Arg2>::type                                         ;\n   using left_result_type = typename left_type::result_type                                       ;\n   using right_result_type = typename right_type::result_type                                      ;\n   using result_type = typename combine_expression<left_result_type, right_result_type>::type;\n   using tag_type = tag                                                                   ;\n\n   BOOST_MP_CXX14_CONSTEXPR expression(const Arg1& a1, const Arg2& a2) : arg1(a1), arg2(a2) {}\n   BOOST_MP_CXX14_CONSTEXPR expression(const expression& e) : arg1(e.arg1), arg2(e.arg2) {}\n\n   //\n   // If we have static_assert we can give a more useful error message\n   // than if we simply have no operator defined at all:\n   //\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not assign to a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR expression& operator++()\n   {\n      // This should always fail:\n      static_assert(sizeof(*this) == INT_MAX, \"You can not increment a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR expression& operator++(int)\n   {\n      // This should always fail:\n      static_assert(sizeof(*this) == INT_MAX, \"You can not increment a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR expression& operator--()\n   {\n      // This should always fail:\n      static_assert(sizeof(*this) == INT_MAX, \"You can not decrement a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR expression& operator--(int)\n   {\n      // This should always fail:\n      static_assert(sizeof(*this) == INT_MAX, \"You can not decrement a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator+=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator+= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator-=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator-= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator*=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator*= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator/=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator/= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator%=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator%= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator|=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator|= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator&=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator&= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator^=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator^= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator<<=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator<<= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator>>=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator>>= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n\n   BOOST_MP_CXX14_CONSTEXPR left_type left() const\n   {\n      return left_type(arg1);\n   }\n   BOOST_MP_CXX14_CONSTEXPR right_type  right() const { return right_type(arg2); }\n   BOOST_MP_CXX14_CONSTEXPR const Arg1& left_ref() const noexcept { return arg1; }\n   BOOST_MP_CXX14_CONSTEXPR const Arg2& right_ref() const noexcept { return arg2; }\n\n   template <class T\n#ifndef __SUNPRO_CC\n             ,\n             typename std::enable_if<!is_number<T>::value && !std::is_convertible<result_type, T const&>::value && std::is_constructible<T, result_type>::value, int>::type = 0\n#endif\n             >\n   explicit BOOST_MP_CXX14_CONSTEXPR operator T() const\n   {\n      return static_cast<T>(static_cast<result_type>(*this));\n   }\n   BOOST_MP_FORCEINLINE explicit BOOST_MP_CXX14_CONSTEXPR operator bool() const\n   {\n      result_type r(*this);\n      return static_cast<bool>(r);\n   }\n   template <class T>\n   BOOST_MP_CXX14_CONSTEXPR T convert_to()\n   {\n      result_type r(*this);\n      return r.template convert_to<T>();\n   }\n\n   static const constexpr unsigned                left_depth  = left_type::depth + 1;\n   static const constexpr unsigned                right_depth = right_type::depth + 1;\n   static const constexpr unsigned                depth       = left_depth > right_depth ? left_depth : right_depth;\n\n private:\n   typename expression_storage<Arg1>::type arg1;\n   typename expression_storage<Arg2>::type arg2;\n   expression&                             operator=(const expression&);\n};\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3>\nstruct expression<tag, Arg1, Arg2, Arg3, void>\n{\n   using arity = std::integral_constant<int, 3>                     ;\n   using left_type = typename arg_type<Arg1>::type    ;\n   using middle_type = typename arg_type<Arg2>::type    ;\n   using right_type = typename arg_type<Arg3>::type    ;\n   using left_result_type = typename left_type::result_type  ;\n   using middle_result_type = typename middle_type::result_type;\n   using right_result_type = typename right_type::result_type ;\n   using result_type = typename combine_expression<\n       left_result_type,\n       typename combine_expression<right_result_type, middle_result_type>::type>::type;\n   using tag_type = tag                                                                        ;\n\n   BOOST_MP_CXX14_CONSTEXPR expression(const Arg1& a1, const Arg2& a2, const Arg3& a3) : arg1(a1), arg2(a2), arg3(a3) {}\n   BOOST_MP_CXX14_CONSTEXPR expression(const expression& e) : arg1(e.arg1), arg2(e.arg2), arg3(e.arg3) {}\n\n   //\n   // If we have static_assert we can give a more useful error message\n   // than if we simply have no operator defined at all:\n   //\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not assign to a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR expression& operator++()\n   {\n      // This should always fail:\n      static_assert(sizeof(*this) == INT_MAX, \"You can not increment a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR expression& operator++(int)\n   {\n      // This should always fail:\n      static_assert(sizeof(*this) == INT_MAX, \"You can not increment a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR expression& operator--()\n   {\n      // This should always fail:\n      static_assert(sizeof(*this) == INT_MAX, \"You can not decrement a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR expression& operator--(int)\n   {\n      // This should always fail:\n      static_assert(sizeof(*this) == INT_MAX, \"You can not decrement a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator+=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator+= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator-=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator-= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator*=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator*= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator/=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator/= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator%=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator%= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator|=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator|= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator&=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator&= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator^=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator^= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator<<=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator<<= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator>>=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator>>= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n\n   BOOST_MP_CXX14_CONSTEXPR left_type left() const\n   {\n      return left_type(arg1);\n   }\n   BOOST_MP_CXX14_CONSTEXPR middle_type middle() const { return middle_type(arg2); }\n   BOOST_MP_CXX14_CONSTEXPR right_type  right() const { return right_type(arg3); }\n   BOOST_MP_CXX14_CONSTEXPR const Arg1& left_ref() const noexcept { return arg1; }\n   BOOST_MP_CXX14_CONSTEXPR const Arg2& middle_ref() const noexcept { return arg2; }\n   BOOST_MP_CXX14_CONSTEXPR const Arg3& right_ref() const noexcept { return arg3; }\n\n   template <class T\n#ifndef __SUNPRO_CC\n             ,\n             typename std::enable_if<!is_number<T>::value && !std::is_convertible<result_type, T const&>::value && std::is_constructible<T, result_type>::value, int>::type = 0\n#endif\n             >\n   explicit BOOST_MP_CXX14_CONSTEXPR operator T() const\n   {\n      return static_cast<T>(static_cast<result_type>(*this));\n   }\n   BOOST_MP_FORCEINLINE explicit BOOST_MP_CXX14_CONSTEXPR operator bool() const\n   {\n      result_type r(*this);\n      return static_cast<bool>(r);\n   }\n   template <class T>\n   BOOST_MP_CXX14_CONSTEXPR T convert_to()\n   {\n      result_type r(*this);\n      return r.template convert_to<T>();\n   }\n\n   static constexpr unsigned left_depth   = left_type::depth + 1;\n   static constexpr unsigned middle_depth = middle_type::depth + 1;\n   static constexpr unsigned right_depth  = right_type::depth + 1;\n   static constexpr unsigned depth        = left_depth > right_depth ? (left_depth > middle_depth ? left_depth : middle_depth) : (right_depth > middle_depth ? right_depth : middle_depth);\n\n private:\n   typename expression_storage<Arg1>::type arg1;\n   typename expression_storage<Arg2>::type arg2;\n   typename expression_storage<Arg3>::type arg3;\n   expression&                             operator=(const expression&);\n};\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\nstruct expression\n{\n   using arity = std::integral_constant<int, 4>                           ;\n   using left_type = typename arg_type<Arg1>::type          ;\n   using left_middle_type = typename arg_type<Arg2>::type          ;\n   using right_middle_type = typename arg_type<Arg3>::type          ;\n   using right_type = typename arg_type<Arg4>::type          ;\n   using left_result_type = typename left_type::result_type        ;\n   using left_middle_result_type = typename left_middle_type::result_type ;\n   using right_middle_result_type = typename right_middle_type::result_type;\n   using right_result_type = typename right_type::result_type       ;\n   using result_type = typename combine_expression<\n       left_result_type,\n       typename combine_expression<\n           left_middle_result_type,\n           typename combine_expression<right_middle_result_type, right_result_type>::type>::type>::type;\n   using tag_type = tag                                                                                         ;\n\n   BOOST_MP_CXX14_CONSTEXPR expression(const Arg1& a1, const Arg2& a2, const Arg3& a3, const Arg4& a4) : arg1(a1), arg2(a2), arg3(a3), arg4(a4) {}\n   BOOST_MP_CXX14_CONSTEXPR expression(const expression& e) : arg1(e.arg1), arg2(e.arg2), arg3(e.arg3), arg4(e.arg4) {}\n\n   //\n   // If we have static_assert we can give a more useful error message\n   // than if we simply have no operator defined at all:\n   //\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not assign to a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR expression& operator++()\n   {\n      // This should always fail:\n      static_assert(sizeof(*this) == INT_MAX, \"You can not increment a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR expression& operator++(int)\n   {\n      // This should always fail:\n      static_assert(sizeof(*this) == INT_MAX, \"You can not increment a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR expression& operator--()\n   {\n      // This should always fail:\n      static_assert(sizeof(*this) == INT_MAX, \"You can not decrement a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR expression& operator--(int)\n   {\n      // This should always fail:\n      static_assert(sizeof(*this) == INT_MAX, \"You can not decrement a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator+=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator+= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator-=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator-= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator*=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator*= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator/=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator/= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator%=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator%= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator|=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator|= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator&=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator&= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator^=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator^= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator<<=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator<<= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n   template <class Other>\n   BOOST_MP_CXX14_CONSTEXPR expression& operator>>=(const Other&)\n   {\n      // This should always fail:\n      static_assert(sizeof(Other) == INT_MAX, \"You can not use operator>>= on a Boost.Multiprecision expression template: did you inadvertantly store an expression template in a \\\"auto\\\" variable?  Or pass an expression to a template function with deduced temnplate arguments?\");\n      return *this;\n   }\n\n   BOOST_MP_CXX14_CONSTEXPR left_type left() const\n   {\n      return left_type(arg1);\n   }\n   BOOST_MP_CXX14_CONSTEXPR left_middle_type  left_middle() const { return left_middle_type(arg2); }\n   BOOST_MP_CXX14_CONSTEXPR right_middle_type right_middle() const { return right_middle_type(arg3); }\n   BOOST_MP_CXX14_CONSTEXPR right_type        right() const { return right_type(arg4); }\n   BOOST_MP_CXX14_CONSTEXPR const Arg1&       left_ref() const noexcept { return arg1; }\n   BOOST_MP_CXX14_CONSTEXPR const Arg2&       left_middle_ref() const noexcept { return arg2; }\n   BOOST_MP_CXX14_CONSTEXPR const Arg3&       right_middle_ref() const noexcept { return arg3; }\n   BOOST_MP_CXX14_CONSTEXPR const Arg4&       right_ref() const noexcept { return arg4; }\n\n   template <class T\n#ifndef __SUNPRO_CC\n             ,\n             typename std::enable_if<!is_number<T>::value && !std::is_convertible<result_type, T const&>::value && std::is_constructible<T, result_type>::value, int>::type = 0\n#endif\n             >\n   explicit BOOST_MP_CXX14_CONSTEXPR operator T() const\n   {\n      return static_cast<T>(static_cast<result_type>(*this));\n   }\n   BOOST_MP_FORCEINLINE explicit BOOST_MP_CXX14_CONSTEXPR operator bool() const\n   {\n      result_type r(*this);\n      return static_cast<bool>(r);\n   }\n   template <class T>\n   BOOST_MP_CXX14_CONSTEXPR T convert_to()\n   {\n      result_type r(*this);\n      return r.template convert_to<T>();\n   }\n\n   static constexpr unsigned left_depth         = left_type::depth + 1;\n   static constexpr unsigned left_middle_depth  = left_middle_type::depth + 1;\n   static constexpr unsigned right_middle_depth = right_middle_type::depth + 1;\n   static constexpr unsigned right_depth        = right_type::depth + 1;\n\n   static constexpr unsigned left_max_depth  = left_depth > left_middle_depth ? left_depth : left_middle_depth;\n   static constexpr unsigned right_max_depth = right_depth > right_middle_depth ? right_depth : right_middle_depth;\n\n   static constexpr unsigned depth = left_max_depth > right_max_depth ? left_max_depth : right_max_depth;\n\n private:\n   typename expression_storage<Arg1>::type arg1;\n   typename expression_storage<Arg2>::type arg2;\n   typename expression_storage<Arg3>::type arg3;\n   typename expression_storage<Arg4>::type arg4;\n   expression&                             operator=(const expression&);\n};\n\ntemplate <class T>\nstruct digits2\n{\n   static_assert(std::numeric_limits<T>::is_specialized, \"numeric_limits must be specialized here\");\n   static_assert((std::numeric_limits<T>::radix == 2) || (std::numeric_limits<T>::radix == 10), \"Failed radix check\");\n   // If we really have so many digits that this fails, then we're probably going to hit other problems anyway:\n   static_assert(LONG_MAX / 1000 > (std::numeric_limits<T>::digits + 1), \"Too many digits to cope with here\");\n   static constexpr long  m_value = std::numeric_limits<T>::radix == 10 ? (((std::numeric_limits<T>::digits + 1) * 1000L) / 301L) : std::numeric_limits<T>::digits;\n   static inline constexpr long value() noexcept { return m_value; }\n};\n\n#ifndef BOOST_MP_MIN_EXPONENT_DIGITS\n#ifdef _MSC_VER\n#define BOOST_MP_MIN_EXPONENT_DIGITS 2\n#else\n#define BOOST_MP_MIN_EXPONENT_DIGITS 2\n#endif\n#endif\n\ntemplate <class S>\nvoid format_float_string(S& str, std::intmax_t my_exp, std::intmax_t digits, std::ios_base::fmtflags f, bool iszero)\n{\n   using size_type = typename S::size_type;\n\n   bool scientific = (f & std::ios_base::scientific) == std::ios_base::scientific;\n   bool fixed      = (f & std::ios_base::fixed) == std::ios_base::fixed;\n   bool showpoint  = (f & std::ios_base::showpoint) == std::ios_base::showpoint;\n   bool showpos    = (f & std::ios_base::showpos) == std::ios_base::showpos;\n\n   bool neg = str.size() && (str[0] == '-');\n\n   if (neg)\n      str.erase(0, 1);\n\n   if (digits == 0 && !fixed)\n   {\n      digits = static_cast<std::intmax_t>((std::max)(str.size(), size_type(16)));\n   }\n\n   if (iszero || str.empty() || (str.find_first_not_of('0') == S::npos))\n   {\n      // We will be printing zero, even though the value might not\n      // actually be zero (it just may have been rounded to zero).\n      str = \"0\";\n      if (scientific || fixed)\n      {\n         if (showpoint || digits > 0) {\n            str.append(1, '.');\n            if (digits > 0)\n               str.append(size_type(digits), '0');\n         }\n         if (scientific)\n            str.append(\"e+00\");\n      }\n      else\n      {\n         if (showpoint)\n         {\n            str.append(1, '.');\n            if (digits > 1)\n               str.append(size_type(digits - 1), '0');\n         }\n      }\n      if (neg)\n         str.insert(static_cast<std::string::size_type>(0), 1, '-');\n      else if (showpos)\n         str.insert(static_cast<std::string::size_type>(0), 1, '+');\n      return;\n   }\n\n   if (!fixed && !scientific && !showpoint)\n   {\n      //\n      // Suppress trailing zeros:\n      //\n      std::string::iterator pos = str.end();\n      while (pos != str.begin() && *--pos == '0')\n      {\n      }\n      if (pos != str.end())\n         ++pos;\n      str.erase(pos, str.end());\n      if (str.empty())\n         str = '0';\n   }\n   else if (!fixed || (my_exp >= 0))\n   {\n      //\n      // Pad out the end with zero's if we need to:\n      //\n      std::intmax_t chars = static_cast<std::intmax_t>(str.size());\n      chars                 = digits - chars;\n      if (scientific)\n         ++chars;\n      if (chars > 0)\n      {\n         str.append(static_cast<std::string::size_type>(chars), '0');\n      }\n   }\n\n   if (fixed || (!scientific && (my_exp >= -4) && (my_exp < digits)))\n   {\n      if (1 + my_exp > static_cast<std::intmax_t>(str.size()))\n      {\n         // Just pad out the end with zeros:\n         str.append(static_cast<std::string::size_type>(1 + my_exp - static_cast<std::intmax_t>(str.size())), '0');\n         if (showpoint || (fixed && digits > 0))\n            str.append(\".\");\n      }\n      else if (my_exp + 1 < static_cast<std::intmax_t>(str.size()))\n      {\n         if (my_exp < 0)\n         {\n            str.insert(static_cast<std::string::size_type>(0), static_cast<std::string::size_type>(-1 - my_exp), '0');\n            str.insert(static_cast<std::string::size_type>(0), \"0.\");\n         }\n         else\n         {\n            // Insert the decimal point:\n            str.insert(static_cast<std::string::size_type>(my_exp + 1), 1, '.');\n         }\n      }\n      else if (showpoint || (fixed && digits > 0)) // we have exactly the digits we require to left of the point\n         str += \".\";\n\n      if (fixed)\n      {\n         // We may need to add trailing zeros:\n         auto pos = str.find('.');\n         if (pos != str.npos) { // this test is probably redundant, but just to be safe and for clarity\n            std::intmax_t l = static_cast<std::intmax_t>(pos + 1);\n            l               = static_cast<std::intmax_t>(digits - (static_cast<std::intmax_t>(str.size()) - l));\n            if (l > 0)\n               str.append(size_type(l), '0');\n         }\n      }\n   }\n   else\n   {\n      BOOST_MP_USING_ABS\n      // Scientific format:\n      if (showpoint || (str.size() > 1))\n         str.insert(static_cast<std::string::size_type>(1u), 1, '.');\n      str.append(static_cast<std::string::size_type>(1u), 'e');\n\n      S e;\n\n      #ifndef BOOST_MP_STANDALONE\n      e = boost::lexical_cast<S>(abs(my_exp));\n      #else\n      BOOST_IF_CONSTEXPR(std::is_same<S, std::string>::value)\n      {\n         e = std::to_string(abs(my_exp));\n      }\n      else\n      {\n         const std::string str_local_exp = std::to_string(abs(my_exp));\n         e = S(str_local_exp.cbegin(), str_local_exp.cend());\n      }\n      #endif\n\n      if (e.size() < BOOST_MP_MIN_EXPONENT_DIGITS)\n         e.insert(static_cast<std::string::size_type>(0), BOOST_MP_MIN_EXPONENT_DIGITS - e.size(), '0');\n      if (my_exp < 0)\n         e.insert(static_cast<std::string::size_type>(0), 1, '-');\n      else\n         e.insert(static_cast<std::string::size_type>(0), 1, '+');\n      str.append(e);\n   }\n   if (neg)\n      str.insert(static_cast<std::string::size_type>(0), 1, '-');\n   else if (showpos)\n      str.insert(static_cast<std::string::size_type>(0), 1, '+');\n}\n\ntemplate <class V>\nBOOST_MP_CXX14_CONSTEXPR void check_shift_range(V val, const std::integral_constant<bool, true>&, const std::integral_constant<bool, true>&)\n{\n   if (val > (std::numeric_limits<std::size_t>::max)())\n      BOOST_MP_THROW_EXCEPTION(std::out_of_range(\"Can not shift by a value greater than std::numeric_limits<std::size_t>::max().\"));\n   if (val < 0)\n      BOOST_MP_THROW_EXCEPTION(std::out_of_range(\"Can not shift by a negative value.\"));\n}\ntemplate <class V>\nBOOST_MP_CXX14_CONSTEXPR void check_shift_range(V val, const std::integral_constant<bool, false>&, const std::integral_constant<bool, true>&)\n{\n   if (val < 0)\n      BOOST_MP_THROW_EXCEPTION(std::out_of_range(\"Can not shift by a negative value.\"));\n}\ntemplate <class V>\nBOOST_MP_CXX14_CONSTEXPR void check_shift_range(V val, const std::integral_constant<bool, true>&, const std::integral_constant<bool, false>&)\n{\n   if (val > (std::numeric_limits<std::size_t>::max)())\n      BOOST_MP_THROW_EXCEPTION(std::out_of_range(\"Can not shift by a value greater than std::numeric_limits<std::size_t>::max().\"));\n}\ntemplate <class V>\nBOOST_MP_CXX14_CONSTEXPR void check_shift_range(V, const std::integral_constant<bool, false>&, const std::integral_constant<bool, false>&) noexcept {}\n\ntemplate <class T>\nBOOST_MP_CXX14_CONSTEXPR const T& evaluate_if_expression(const T& val) { return val; }\ntemplate <class T>\nBOOST_MP_CXX14_CONSTEXPR T&& evaluate_if_expression(T&& val) { return static_cast<T&&>(val); }\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\nBOOST_MP_CXX14_CONSTEXPR typename expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type evaluate_if_expression(const expression<tag, Arg1, Arg2, Arg3, Arg4>& val) { return val; }\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\nBOOST_MP_CXX14_CONSTEXPR typename expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type evaluate_if_expression(expression<tag, Arg1, Arg2, Arg3, Arg4>&& val) { return val; }\n\ntemplate <class T>\nstruct convertible_to\n{\n   operator T () const;\n};\n\n} // namespace detail\n\n//\n// Traits class, lets us know what kind of number we have, defaults to a floating point type:\n//\nenum number_category_type\n{\n   number_kind_unknown        = -1,\n   number_kind_integer        = 0,\n   number_kind_floating_point = 1,\n   number_kind_rational       = 2,\n   number_kind_fixed_point    = 3,\n   number_kind_complex        = 4\n};\n\ntemplate <class Num, bool, bool>\nstruct number_category_base : public std::integral_constant<int, number_kind_unknown>\n{};\ntemplate <class Num>\nstruct number_category_base<Num, true, false> : public std::integral_constant<int, std::numeric_limits<Num>::is_integer ? number_kind_integer : (std::numeric_limits<Num>::max_exponent ? number_kind_floating_point : number_kind_unknown)>\n{};\ntemplate <class Num>\nstruct number_category : public number_category_base<Num, std::is_class<Num>::value || boost::multiprecision::detail::is_arithmetic<Num>::value, std::is_abstract<Num>::value>\n{};\ntemplate <class Backend, expression_template_option ExpressionTemplates>\nstruct number_category<number<Backend, ExpressionTemplates> > : public number_category<Backend>\n{};\ntemplate <class tag, class A1, class A2, class A3, class A4>\nstruct number_category<detail::expression<tag, A1, A2, A3, A4> > : public number_category<typename detail::expression<tag, A1, A2, A3, A4>::result_type>\n{};\n//\n// Specializations for types which do not always have numberic_limits specializations:\n//\n#ifdef BOOST_HAS_INT128\ntemplate <>\nstruct number_category<boost::multiprecision::int128_type> : public std::integral_constant<int, number_kind_integer>\n{};\ntemplate <>\nstruct number_category<boost::multiprecision::uint128_type> : public std::integral_constant<int, number_kind_integer>\n{};\n#endif\n#ifdef BOOST_HAS_FLOAT128\ntemplate <>\nstruct number_category<boost::multiprecision::float128_type> : public std::integral_constant<int, number_kind_floating_point>\n{};\n#endif\n\ntemplate <class T>\nstruct component_type\n{\n   using type = T;\n};\ntemplate <class tag, class A1, class A2, class A3, class A4>\nstruct component_type<detail::expression<tag, A1, A2, A3, A4> > : public component_type<typename detail::expression<tag, A1, A2, A3, A4>::result_type>\n{};\n\ntemplate <class T>\nstruct scalar_result_from_possible_complex\n{\n   using type = typename std::conditional<number_category<T>::value == number_kind_complex, typename component_type<T>::type, T>::type;\n};\n\ntemplate <class T>\nstruct complex_result_from_scalar; // individual backends must specialize this trait.\n\ntemplate <class T>\nstruct is_unsigned_number : public std::integral_constant<bool, false>\n{};\ntemplate <class Backend, expression_template_option ExpressionTemplates>\nstruct is_unsigned_number<number<Backend, ExpressionTemplates> > : public is_unsigned_number<Backend>\n{};\ntemplate <class T>\nstruct is_signed_number : public std::integral_constant<bool, !is_unsigned_number<T>::value>\n{};\ntemplate <class T>\nstruct is_interval_number : public std::integral_constant<bool, false>\n{};\ntemplate <class Backend, expression_template_option ExpressionTemplates>\nstruct is_interval_number<number<Backend, ExpressionTemplates> > : public is_interval_number<Backend>\n{};\n\ntemplate <class T, class U>\nstruct is_equivalent_number_type : public std::is_same<T, U>\n{};\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class T2>\nstruct is_equivalent_number_type<number<Backend, ExpressionTemplates>, T2> : public is_equivalent_number_type<Backend, T2>\n{};\ntemplate <class T1, class Backend, expression_template_option ExpressionTemplates>\nstruct is_equivalent_number_type<T1, number<Backend, ExpressionTemplates> > : public is_equivalent_number_type<Backend, T1>\n{};\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Backend2, expression_template_option ExpressionTemplates2>\nstruct is_equivalent_number_type<number<Backend, ExpressionTemplates>, number<Backend2, ExpressionTemplates2> > : public is_equivalent_number_type<Backend, Backend2>\n{};\n\n}\n} // namespace boost\n\n#ifdef BOOST_MP_MATH_AVAILABLE\nnamespace boost { namespace math {\n   namespace tools {\n\n      template <class T>\n      struct promote_arg;\n\n      template <class tag, class A1, class A2, class A3, class A4>\n      struct promote_arg<boost::multiprecision::detail::expression<tag, A1, A2, A3, A4> >\n      {\n         using type = typename boost::multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n      };\n\n      template <class R, class B, boost::multiprecision::expression_template_option ET>\n      inline R real_cast(const boost::multiprecision::number<B, ET>& val)\n      {\n         return val.template convert_to<R>();\n      }\n\n      template <class R, class tag, class A1, class A2, class A3, class A4>\n      inline R real_cast(const boost::multiprecision::detail::expression<tag, A1, A2, A3, A4>& val)\n      {\n         using val_type = typename boost::multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;\n         return val_type(val).template convert_to<R>();\n      }\n\n      template <class B, boost::multiprecision::expression_template_option ET>\n      struct is_complex_type<boost::multiprecision::number<B, ET> > : public std::integral_constant<bool, boost::multiprecision::number_category<B>::value == boost::multiprecision::number_kind_complex> {};\n\n} // namespace tools\n\nnamespace constants {\n\ntemplate <class T>\nstruct is_explicitly_convertible_from_string;\n\ntemplate <class B, boost::multiprecision::expression_template_option ET>\nstruct is_explicitly_convertible_from_string<boost::multiprecision::number<B, ET> >\n{\n   static constexpr bool value = true;\n};\n\n} // namespace constants\n\n}} // namespace boost::math\n#endif\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#endif // BOOST_MP_NUMBER_BASE_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/number_compare.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_NUMBER_COMPARE_HPP\n#define BOOST_MP_NUMBER_COMPARE_HPP\n\n#include <boost/multiprecision/traits/is_backend.hpp>\n#include <boost/multiprecision/detail/fpclassify.hpp>\n\n//\n// Comparison operators for number.\n//\n\nnamespace boost { namespace multiprecision {\n\nnamespace default_ops {\n\n//\n// The dispatching mechanism used here to deal with differently typed arguments\n// could be better replaced with enable_if overloads, but that breaks MSVC-12\n// under strange and hard to reproduce circumstances.\n//\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR bool eval_eq(const B& a, const B& b)\n{\n   return a.compare(b) == 0;\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR bool eval_eq_imp(const T& a, const U& b, const std::integral_constant<bool, true>&)\n{\n   typename boost::multiprecision::detail::number_from_backend<T, U>::type t(b);\n   return eval_eq(a, t.backend());\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR bool eval_eq_imp(const T& a, const U& b, const std::integral_constant<bool, false>&)\n{\n   typename boost::multiprecision::detail::number_from_backend<U, T>::type t(a);\n   return eval_eq(t.backend(), b);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR bool eval_eq(const T& a, const U& b)\n{\n   using tag_type = std::integral_constant<bool, boost::multiprecision::detail::is_first_backend<T, U>::value>;\n   return eval_eq_imp(a, b, tag_type());\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR bool eval_lt(const B& a, const B& b)\n{\n   return a.compare(b) < 0;\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR bool eval_lt_imp(const T& a, const U& b, const std::integral_constant<bool, true>&)\n{\n   typename boost::multiprecision::detail::number_from_backend<T, U>::type t(b);\n   return eval_lt(a, t.backend());\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR bool eval_lt_imp(const T& a, const U& b, const std::integral_constant<bool, false>&)\n{\n   typename boost::multiprecision::detail::number_from_backend<U, T>::type t(a);\n   return eval_lt(t.backend(), b);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR bool eval_lt(const T& a, const U& b)\n{\n   using tag_type = std::integral_constant<bool, boost::multiprecision::detail::is_first_backend<T, U>::value>;\n   return eval_lt_imp(a, b, tag_type());\n}\n\ntemplate <class B>\ninline BOOST_MP_CXX14_CONSTEXPR bool eval_gt(const B& a, const B& b)\n{\n   return a.compare(b) > 0;\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR bool eval_gt_imp(const T& a, const U& b, const std::integral_constant<bool, true>&)\n{\n   typename boost::multiprecision::detail::number_from_backend<T, U>::type t(b);\n   return eval_gt(a, t.backend());\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR bool eval_gt_imp(const T& a, const U& b, const std::integral_constant<bool, false>&)\n{\n   typename boost::multiprecision::detail::number_from_backend<U, T>::type t(a);\n   return eval_gt(t.backend(), b);\n}\ntemplate <class T, class U>\ninline BOOST_MP_CXX14_CONSTEXPR bool eval_gt(const T& a, const U& b)\n{\n   using tag_type = std::integral_constant<bool, boost::multiprecision::detail::is_first_backend<T, U>::value>;\n   return eval_gt_imp(a, b, tag_type());\n}\n\n} // namespace default_ops\n\nnamespace detail {\n\ntemplate <class Num, class Val>\nstruct is_valid_mixed_compare : public std::integral_constant<bool, false>\n{};\n\ntemplate <class B, expression_template_option ET, class Val>\nstruct is_valid_mixed_compare<number<B, ET>, Val> : public std::is_convertible<Val, number<B, ET> >\n{};\n\ntemplate <class B, expression_template_option ET>\nstruct is_valid_mixed_compare<number<B, ET>, number<B, ET> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <class B, expression_template_option ET, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\nstruct is_valid_mixed_compare<number<B, ET>, expression<tag, Arg1, Arg2, Arg3, Arg4> >\n    : public std::is_convertible<expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >\n{};\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class B, expression_template_option ET>\nstruct is_valid_mixed_compare<expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >\n    : public std::is_convertible<expression<tag, Arg1, Arg2, Arg3, Arg4>, number<B, ET> >\n{};\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\ninline constexpr typename std::enable_if<number_category<Backend>::value != number_kind_floating_point, bool>::type is_unordered_value(const number<Backend, ExpressionTemplates>&)\n{\n   return false;\n}\ntemplate <class Backend, expression_template_option ExpressionTemplates>\ninline constexpr typename std::enable_if<number_category<Backend>::value == number_kind_floating_point, bool>::type is_unordered_value(const number<Backend, ExpressionTemplates>& a)\n{\n   using default_ops::eval_fpclassify;\n   return eval_fpclassify(a.backend()) == FP_NAN;\n}\n\ntemplate <class Arithmetic>\ninline constexpr typename std::enable_if<number_category<Arithmetic>::value != number_kind_floating_point, bool>::type is_unordered_value(const Arithmetic&)\n{\n   return false;\n}\ntemplate <class Arithmetic>\ninline \n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n    BOOST_MP_CXX14_CONSTEXPR \n#endif\n   typename std::enable_if < number_category < Arithmetic> ::value == number_kind_floating_point, bool> ::type\n    is_unordered_value(const Arithmetic& a)\n{\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n   if (BOOST_MP_IS_CONST_EVALUATED(a))\n   {\n      return a != a;\n   }\n   else\n#endif\n   {\n      return BOOST_MP_ISNAN(a);\n   }\n}\n\ntemplate <class T, class U>\ninline constexpr bool is_unordered_comparison(const T& a, const U& b)\n{\n   return is_unordered_value(a) || is_unordered_value(b);\n}\n\n} // namespace detail\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Backend2, expression_template_option ExpressionTemplates2>\ninline BOOST_MP_CXX14_CONSTEXPR bool operator==(const number<Backend, ExpressionTemplates>& a, const number<Backend2, ExpressionTemplates2>& b)\n{\n   using default_ops::eval_eq;\n   if (detail::is_unordered_comparison(a, b))\n      return false;\n   return eval_eq(a.backend(), b.backend());\n}\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value && !is_number_expression<Arithmetic>::value, bool>::type\noperator==(const number<Backend, ExpressionTemplates>& a, const Arithmetic& b)\n{\n   using default_ops::eval_eq;\n   if (detail::is_unordered_comparison(a, b))\n      return false;\n   return eval_eq(a.backend(), number<Backend, ExpressionTemplates>::canonical_value(b));\n}\ntemplate <class Arithmetic, class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value && !is_number_expression<Arithmetic>::value, bool>::type\noperator==(const Arithmetic& a, const number<Backend, ExpressionTemplates>& b)\n{\n   using default_ops::eval_eq;\n   if (detail::is_unordered_comparison(a, b))\n      return false;\n   return eval_eq(b.backend(), number<Backend, ExpressionTemplates>::canonical_value(a));\n}\ntemplate <class Arithmetic, class Tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value, bool>::type\noperator==(const Arithmetic& a, const detail::expression<Tag, A1, A2, A3, A4>& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_eq;\n   result_type t(b);\n   if (detail::is_unordered_comparison(a, t))\n      return false;\n   return eval_eq(t.backend(), result_type::canonical_value(a));\n}\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR bool operator==(const number<Backend, ExpressionTemplates>& a, const detail::expression<Tag, A1, A2, A3, A4>& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_eq;\n   result_type t(b);\n   if (detail::is_unordered_comparison(a, t))\n      return false;\n   return eval_eq(t.backend(), a.backend());\n}\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value, bool>::type\noperator==(const detail::expression<Tag, A1, A2, A3, A4>& a, const Arithmetic& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_eq;\n   result_type t(a);\n   if (detail::is_unordered_comparison(t, b))\n      return false;\n   return eval_eq(t.backend(), result_type::canonical_value(b));\n}\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR bool operator==(const detail::expression<Tag, A1, A2, A3, A4>& a, const number<Backend, ExpressionTemplates>& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_eq;\n   result_type t(a);\n   if (detail::is_unordered_comparison(t, b))\n      return false;\n   return eval_eq(t.backend(), b.backend());\n}\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Tagb, class A1b, class A2b, class A3b, class A4b>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_equivalent_number_type<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, typename detail::expression<Tagb, A1b, A2b, A3b, A4b>::result_type>::value, bool>::type\noperator==(const detail::expression<Tag, A1, A2, A3, A4>& a, const detail::expression<Tagb, A1b, A2b, A3b, A4b>& b)\n{\n   using default_ops::eval_eq;\n   typename detail::expression<Tag, A1, A2, A3, A4>::result_type      t(a);\n   typename detail::expression<Tagb, A1b, A2b, A3b, A4b>::result_type t2(b);\n   if (detail::is_unordered_comparison(t, t2))\n      return false;\n   return eval_eq(t.backend(), t2.backend());\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Backend2, expression_template_option ExpressionTemplates2>\ninline BOOST_MP_CXX14_CONSTEXPR bool operator!=(const number<Backend, ExpressionTemplates>& a, const number<Backend2, ExpressionTemplates2>& b)\n{\n   using default_ops::eval_eq;\n   if (detail::is_unordered_comparison(a, b))\n      return true;\n   return !eval_eq(a.backend(), b.backend());\n}\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value && !is_number_expression<Arithmetic>::value, bool>::type\noperator!=(const number<Backend, ExpressionTemplates>& a, const Arithmetic& b)\n{\n   using default_ops::eval_eq;\n   if (detail::is_unordered_comparison(a, b))\n      return true;\n   return !eval_eq(a.backend(), number<Backend, et_on>::canonical_value(b));\n}\ntemplate <class Arithmetic, class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value && !is_number_expression<Arithmetic>::value, bool>::type\noperator!=(const Arithmetic& a, const number<Backend, ExpressionTemplates>& b)\n{\n   using default_ops::eval_eq;\n   if (detail::is_unordered_comparison(a, b))\n      return true;\n   return !eval_eq(b.backend(), number<Backend, et_on>::canonical_value(a));\n}\ntemplate <class Arithmetic, class Tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value, bool>::type\noperator!=(const Arithmetic& a, const detail::expression<Tag, A1, A2, A3, A4>& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_eq;\n   result_type t(b);\n   if (detail::is_unordered_comparison(a, t))\n      return true;\n   return !eval_eq(t.backend(), result_type::canonical_value(a));\n}\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR bool operator!=(const number<Backend, ExpressionTemplates>& a, const detail::expression<Tag, A1, A2, A3, A4>& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_eq;\n   result_type t(b);\n   if (detail::is_unordered_comparison(a, t))\n      return true;\n   return !eval_eq(t.backend(), a.backend());\n}\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value, bool>::type\noperator!=(const detail::expression<Tag, A1, A2, A3, A4>& a, const Arithmetic& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_eq;\n   result_type t(a);\n   if (detail::is_unordered_comparison(t, b))\n      return true;\n   return !eval_eq(t.backend(), result_type::canonical_value(b));\n}\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR bool operator!=(const detail::expression<Tag, A1, A2, A3, A4>& a, const number<Backend, ExpressionTemplates>& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_eq;\n   result_type t(a);\n   if (detail::is_unordered_comparison(t, b))\n      return true;\n   return !eval_eq(t.backend(), result_type::canonical_value(b));\n}\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Tagb, class A1b, class A2b, class A3b, class A4b>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_equivalent_number_type<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, typename detail::expression<Tagb, A1b, A2b, A3b, A4b>::result_type>::value, bool>::type\noperator!=(const detail::expression<Tag, A1, A2, A3, A4>& a, const detail::expression<Tagb, A1b, A2b, A3b, A4b>& b)\n{\n   using default_ops::eval_eq;\n   typename detail::expression<Tag, A1, A2, A3, A4>::result_type      t(a);\n   typename detail::expression<Tagb, A1b, A2b, A3b, A4b>::result_type t2(b);\n   if (detail::is_unordered_comparison(t, t2))\n      return true;\n   return !eval_eq(t.backend(), t2.backend());\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Backend2, expression_template_option ExpressionTemplates2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<(number_category<Backend>::value != number_kind_complex) && (number_category<Backend2>::value != number_kind_complex), bool>::type\noperator<(const number<Backend, ExpressionTemplates>& a, const number<Backend2, ExpressionTemplates2>& b)\n{\n   using default_ops::eval_lt;\n   if (detail::is_unordered_comparison(a, b))\n      return false;\n   return eval_lt(a.backend(), b.backend());\n}\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value && (number_category<Backend>::value != number_kind_complex) && !is_number_expression<Arithmetic>::value, bool>::type\noperator<(const number<Backend, ExpressionTemplates>& a, const Arithmetic& b)\n{\n   using default_ops::eval_lt;\n   if (detail::is_unordered_comparison(a, b))\n      return false;\n   return eval_lt(a.backend(), number<Backend, ExpressionTemplates>::canonical_value(b));\n}\ntemplate <class Arithmetic, class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value && (number_category<Backend>::value != number_kind_complex) && !is_number_expression<Arithmetic>::value, bool>::type\noperator<(const Arithmetic& a, const number<Backend, ExpressionTemplates>& b)\n{\n   using default_ops::eval_gt;\n   if (detail::is_unordered_comparison(a, b))\n      return false;\n   return eval_gt(b.backend(), number<Backend, ExpressionTemplates>::canonical_value(a));\n}\ntemplate <class Arithmetic, class Tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value && (number_category<typename detail::expression<Tag, A1, A2, A3, A4>::result_type>::value != number_kind_complex), bool>::type\noperator<(const Arithmetic& a, const detail::expression<Tag, A1, A2, A3, A4>& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_gt;\n   result_type t(b);\n   if (detail::is_unordered_comparison(a, t))\n      return false;\n   return eval_gt(t.backend(), result_type::canonical_value(a));\n}\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR bool operator<(const number<Backend, ExpressionTemplates>& a, const detail::expression<Tag, A1, A2, A3, A4>& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_gt;\n   result_type t(b);\n   return a < t;\n}\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value && (number_category<typename detail::expression<Tag, A1, A2, A3, A4>::result_type>::value != number_kind_complex), bool>::type\noperator<(const detail::expression<Tag, A1, A2, A3, A4>& a, const Arithmetic& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_lt;\n   result_type t(a);\n   if (detail::is_unordered_comparison(t, b))\n      return false;\n   return eval_lt(t.backend(), result_type::canonical_value(b));\n}\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR bool operator<(const detail::expression<Tag, A1, A2, A3, A4>& a, const number<Backend, ExpressionTemplates>& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_lt;\n   result_type t(a);\n   return t < b;\n}\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Tagb, class A1b, class A2b, class A3b, class A4b>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_equivalent_number_type<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, typename detail::expression<Tagb, A1b, A2b, A3b, A4b>::result_type>::value && (number_category<typename detail::expression<Tag, A1, A2, A3, A4>::result_type>::value != number_kind_complex), bool>::type\noperator<(const detail::expression<Tag, A1, A2, A3, A4>& a, const detail::expression<Tagb, A1b, A2b, A3b, A4b>& b)\n{\n   using default_ops::eval_lt;\n   typename detail::expression<Tag, A1, A2, A3, A4>::result_type      t(a);\n   typename detail::expression<Tagb, A1b, A2b, A3b, A4b>::result_type t2(b);\n   if (detail::is_unordered_comparison(t, t2))\n      return false;\n   return eval_lt(t.backend(), t2.backend());\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Backend2, expression_template_option ExpressionTemplates2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<(number_category<Backend>::value != number_kind_complex) && (number_category<Backend2>::value != number_kind_complex), bool>::type\noperator>(const number<Backend, ExpressionTemplates>& a, const number<Backend2, ExpressionTemplates2>& b)\n{\n   using default_ops::eval_gt;\n   if (detail::is_unordered_comparison(a, b))\n      return false;\n   return eval_gt(a.backend(), b.backend());\n}\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value && (number_category<Backend>::value != number_kind_complex) && !is_number_expression<Arithmetic>::value, bool>::type\noperator>(const number<Backend, ExpressionTemplates>& a, const Arithmetic& b)\n{\n   using default_ops::eval_gt;\n   if (detail::is_unordered_comparison(a, b))\n      return false;\n   return eval_gt(a.backend(), number<Backend, ExpressionTemplates>::canonical_value(b));\n}\ntemplate <class Arithmetic, class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value && (number_category<Backend>::value != number_kind_complex) && !is_number_expression<Arithmetic>::value, bool>::type\noperator>(const Arithmetic& a, const number<Backend, ExpressionTemplates>& b)\n{\n   using default_ops::eval_lt;\n   if (detail::is_unordered_comparison(a, b))\n      return false;\n   return eval_lt(b.backend(), number<Backend, ExpressionTemplates>::canonical_value(a));\n}\ntemplate <class Arithmetic, class Tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value && (number_category<typename detail::expression<Tag, A1, A2, A3, A4>::result_type>::value != number_kind_complex), bool>::type\noperator>(const Arithmetic& a, const detail::expression<Tag, A1, A2, A3, A4>& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_lt;\n   result_type t(b);\n   return a > t;\n}\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR bool operator>(const number<Backend, ExpressionTemplates>& a, const detail::expression<Tag, A1, A2, A3, A4>& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_lt;\n   result_type t(b);\n   return a > t;\n}\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value && (number_category<typename detail::expression<Tag, A1, A2, A3, A4>::result_type>::value != number_kind_complex), bool>::type\noperator>(const detail::expression<Tag, A1, A2, A3, A4>& a, const Arithmetic& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_gt;\n   result_type t(a);\n   return t > b;\n}\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR bool operator>(const detail::expression<Tag, A1, A2, A3, A4>& a, const number<Backend, ExpressionTemplates>& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_gt;\n   result_type t(a);\n   return t > b;\n}\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Tagb, class A1b, class A2b, class A3b, class A4b>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_equivalent_number_type<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, typename detail::expression<Tagb, A1b, A2b, A3b, A4b>::result_type>::value && (number_category<typename detail::expression<Tag, A1, A2, A3, A4>::result_type>::value != number_kind_complex), bool>::type\noperator>(const detail::expression<Tag, A1, A2, A3, A4>& a, const detail::expression<Tagb, A1b, A2b, A3b, A4b>& b)\n{\n   using default_ops::eval_gt;\n   typename detail::expression<Tag, A1, A2, A3, A4>::result_type      t(a);\n   typename detail::expression<Tagb, A1b, A2b, A3b, A4b>::result_type t2(b);\n   return t > t2;\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Backend2, expression_template_option ExpressionTemplates2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<(number_category<Backend>::value != number_kind_complex) && (number_category<Backend2>::value != number_kind_complex), bool>::type\noperator<=(const number<Backend, ExpressionTemplates>& a, const number<Backend2, ExpressionTemplates2>& b)\n{\n   using default_ops::eval_gt;\n   if (detail::is_unordered_comparison(a, b))\n      return false;\n   return !eval_gt(a.backend(), b.backend());\n}\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value && (number_category<Backend>::value != number_kind_complex) && !is_number_expression<Arithmetic>::value, bool>::type\noperator<=(const number<Backend, ExpressionTemplates>& a, const Arithmetic& b)\n{\n   using default_ops::eval_gt;\n   if (detail::is_unordered_comparison(a, b))\n      return false;\n   return !eval_gt(a.backend(), number<Backend, ExpressionTemplates>::canonical_value(b));\n}\ntemplate <class Arithmetic, class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value && (number_category<Backend>::value != number_kind_complex) && !is_number_expression<Arithmetic>::value, bool>::type\noperator<=(const Arithmetic& a, const number<Backend, ExpressionTemplates>& b)\n{\n   using default_ops::eval_lt;\n   if (detail::is_unordered_comparison(a, b))\n      return false;\n   return !eval_lt(b.backend(), number<Backend, ExpressionTemplates>::canonical_value(a));\n}\ntemplate <class Arithmetic, class Tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value && (number_category<typename detail::expression<Tag, A1, A2, A3, A4>::result_type>::value != number_kind_complex), bool>::type\noperator<=(const Arithmetic& a, const detail::expression<Tag, A1, A2, A3, A4>& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_lt;\n   if (detail::is_unordered_value(a) || detail::is_unordered_value(b))\n      return false;\n   result_type t(b);\n   if (detail::is_unordered_comparison(a, t))\n      return false;\n   return !eval_lt(t.backend(), result_type::canonical_value(a));\n}\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR bool operator<=(const number<Backend, ExpressionTemplates>& a, const detail::expression<Tag, A1, A2, A3, A4>& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_lt;\n   if (detail::is_unordered_value(a) || detail::is_unordered_value(b))\n      return false;\n   result_type t(b);\n   return a <= t;\n}\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value && (number_category<typename detail::expression<Tag, A1, A2, A3, A4>::result_type>::value != number_kind_complex), bool>::type\noperator<=(const detail::expression<Tag, A1, A2, A3, A4>& a, const Arithmetic& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_gt;\n   result_type t(a);\n   if (detail::is_unordered_comparison(t, b))\n      return false;\n   return !eval_gt(t.backend(), result_type::canonical_value(b));\n}\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR bool operator<=(const detail::expression<Tag, A1, A2, A3, A4>& a, const number<Backend, ExpressionTemplates>& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_gt;\n   result_type t(a);\n   return t <= b;\n}\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Tagb, class A1b, class A2b, class A3b, class A4b>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_equivalent_number_type<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, typename detail::expression<Tagb, A1b, A2b, A3b, A4b>::result_type>::value && (number_category<typename detail::expression<Tag, A1, A2, A3, A4>::result_type>::value != number_kind_complex), bool>::type\noperator<=(const detail::expression<Tag, A1, A2, A3, A4>& a, const detail::expression<Tagb, A1b, A2b, A3b, A4b>& b)\n{\n   using default_ops::eval_gt;\n   typename detail::expression<Tag, A1, A2, A3, A4>::result_type      t(a);\n   typename detail::expression<Tagb, A1b, A2b, A3b, A4b>::result_type t2(b);\n   if (detail::is_unordered_comparison(t, t2))\n      return false;\n   return !eval_gt(t.backend(), t2.backend());\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Backend2, expression_template_option ExpressionTemplates2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<(number_category<Backend>::value != number_kind_complex) && (number_category<Backend2>::value != number_kind_complex), bool>::type\noperator>=(const number<Backend, ExpressionTemplates>& a, const number<Backend2, ExpressionTemplates2>& b)\n{\n   using default_ops::eval_lt;\n   if (detail::is_unordered_comparison(a, b))\n      return false;\n   return !eval_lt(a.backend(), b.backend());\n}\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value && (number_category<Backend>::value != number_kind_complex) && !is_number_expression<Arithmetic>::value, bool>::type\noperator>=(const number<Backend, ExpressionTemplates>& a, const Arithmetic& b)\n{\n   using default_ops::eval_lt;\n   if (detail::is_unordered_comparison(a, b))\n      return false;\n   return !eval_lt(a.backend(), number<Backend, ExpressionTemplates>::canonical_value(b));\n}\ntemplate <class Arithmetic, class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value && (number_category<Backend>::value != number_kind_complex) && !is_number_expression<Arithmetic>::value, bool>::type\noperator>=(const Arithmetic& a, const number<Backend, ExpressionTemplates>& b)\n{\n   using default_ops::eval_gt;\n   if (detail::is_unordered_comparison(a, b))\n      return false;\n   return !eval_gt(b.backend(), number<Backend, ExpressionTemplates>::canonical_value(a));\n}\ntemplate <class Arithmetic, class Tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value && (number_category<typename detail::expression<Tag, A1, A2, A3, A4>::result_type>::value != number_kind_complex), bool>::type\noperator>=(const Arithmetic& a, const detail::expression<Tag, A1, A2, A3, A4>& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_gt;\n   result_type t(b);\n   if (detail::is_unordered_comparison(a, t))\n      return false;\n   return !eval_gt(t.backend(), result_type::canonical_value(a));\n}\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR bool operator>=(const number<Backend, ExpressionTemplates>& a, const detail::expression<Tag, A1, A2, A3, A4>& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_gt;\n   result_type t(b);\n   return a >= t;\n}\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value && (number_category<typename detail::expression<Tag, A1, A2, A3, A4>::result_type>::value != number_kind_complex), bool>::type\noperator>=(const detail::expression<Tag, A1, A2, A3, A4>& a, const Arithmetic& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_lt;\n   result_type t(a);\n   if (detail::is_unordered_comparison(t, b))\n      return false;\n   return !eval_lt(t.backend(), result_type::canonical_value(b));\n}\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR bool operator>=(const detail::expression<Tag, A1, A2, A3, A4>& a, const number<Backend, ExpressionTemplates>& b)\n{\n   using result_type = typename detail::expression<Tag, A1, A2, A3, A4>::result_type;\n   using default_ops::eval_lt;\n   result_type t(a);\n   return t >= b;\n}\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Tagb, class A1b, class A2b, class A3b, class A4b>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_equivalent_number_type<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, typename detail::expression<Tagb, A1b, A2b, A3b, A4b>::result_type>::value && (number_category<typename detail::expression<Tag, A1, A2, A3, A4>::result_type>::value != number_kind_complex), bool>::type\noperator>=(const detail::expression<Tag, A1, A2, A3, A4>& a, const detail::expression<Tagb, A1b, A2b, A3b, A4b>& b)\n{\n   using default_ops::eval_lt;\n   typename detail::expression<Tag, A1, A2, A3, A4>::result_type      t(a);\n   typename detail::expression<Tagb, A1b, A2b, A3b, A4b>::result_type t2(b);\n   if (detail::is_unordered_comparison(t, t2))\n      return false;\n   return !eval_lt(t.backend(), t2.backend());\n}\n\n//\n// C99 comparison macros as functions:\n//\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Backend2, expression_template_option ExpressionTemplates2>\ninline BOOST_MP_CXX14_CONSTEXPR bool isgreater BOOST_PREVENT_MACRO_SUBSTITUTION(const number<Backend, ExpressionTemplates>& a, const number<Backend2, ExpressionTemplates2>& b) { return a > b; }\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value, bool>::type\n    isgreater\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const number<Backend, ExpressionTemplates>& a, const Arithmetic& b) { return a > b; }\n\ntemplate <class Arithmetic, class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value, bool>::type\n    isgreater\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const Arithmetic& a, const number<Backend, ExpressionTemplates>& b) { return a > b; }\n\ntemplate <class Arithmetic, class Tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value, bool>::type\n    isgreater\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const Arithmetic& a, const detail::expression<Tag, A1, A2, A3, A4>& b) { return a > b; }\n\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value, bool>::type\n    isgreater\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const detail::expression<Tag, A1, A2, A3, A4>& a, const Arithmetic& b) { return a > b; }\n\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Tagb, class A1b, class A2b, class A3b, class A4b>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_equivalent_number_type<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, typename detail::expression<Tagb, A1b, A2b, A3b, A4b>::result_type>::value, bool>::type\n    isgreater\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const detail::expression<Tag, A1, A2, A3, A4>& a, const detail::expression<Tagb, A1b, A2b, A3b, A4b>& b) { return a > b; }\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Backend2, expression_template_option ExpressionTemplates2>\ninline BOOST_MP_CXX14_CONSTEXPR bool isgreaterequal BOOST_PREVENT_MACRO_SUBSTITUTION(const number<Backend, ExpressionTemplates>& a, const number<Backend2, ExpressionTemplates2>& b) { return a >= b; }\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value, bool>::type\n    isgreaterequal\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const number<Backend, ExpressionTemplates>& a, const Arithmetic& b) { return a >= b; }\n\ntemplate <class Arithmetic, class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value, bool>::type\n    isgreaterequal\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const Arithmetic& a, const number<Backend, ExpressionTemplates>& b) { return a >= b; }\n\ntemplate <class Arithmetic, class Tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value, bool>::type\n    isgreaterequal\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const Arithmetic& a, const detail::expression<Tag, A1, A2, A3, A4>& b) { return a >= b; }\n\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value, bool>::type\n    isgreaterequal\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const detail::expression<Tag, A1, A2, A3, A4>& a, const Arithmetic& b) { return a >= b; }\n\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Tagb, class A1b, class A2b, class A3b, class A4b>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_equivalent_number_type<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, typename detail::expression<Tagb, A1b, A2b, A3b, A4b>::result_type>::value, bool>::type\n    isgreaterequal\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const detail::expression<Tag, A1, A2, A3, A4>& a, const detail::expression<Tagb, A1b, A2b, A3b, A4b>& b) { return a >= b; }\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Backend2, expression_template_option ExpressionTemplates2>\ninline BOOST_MP_CXX14_CONSTEXPR bool islessequal BOOST_PREVENT_MACRO_SUBSTITUTION(const number<Backend, ExpressionTemplates>& a, const number<Backend2, ExpressionTemplates2>& b) { return a <= b; }\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value, bool>::type\n    islessequal\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const number<Backend, ExpressionTemplates>& a, const Arithmetic& b) { return a <= b; }\n\ntemplate <class Arithmetic, class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value, bool>::type\n    islessequal\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const Arithmetic& a, const number<Backend, ExpressionTemplates>& b) { return a <= b; }\n\ntemplate <class Arithmetic, class Tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value, bool>::type\n    islessequal\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const Arithmetic& a, const detail::expression<Tag, A1, A2, A3, A4>& b) { return a <= b; }\n\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value, bool>::type\n    islessequal\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const detail::expression<Tag, A1, A2, A3, A4>& a, const Arithmetic& b) { return a <= b; }\n\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Tagb, class A1b, class A2b, class A3b, class A4b>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_equivalent_number_type<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, typename detail::expression<Tagb, A1b, A2b, A3b, A4b>::result_type>::value, bool>::type\n    islessequal\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const detail::expression<Tag, A1, A2, A3, A4>& a, const detail::expression<Tagb, A1b, A2b, A3b, A4b>& b) { return a <= b; }\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Backend2, expression_template_option ExpressionTemplates2>\ninline BOOST_MP_CXX14_CONSTEXPR bool isless BOOST_PREVENT_MACRO_SUBSTITUTION(const number<Backend, ExpressionTemplates>& a, const number<Backend2, ExpressionTemplates2>& b) { return a < b; }\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value, bool>::type\n    isless\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const number<Backend, ExpressionTemplates>& a, const Arithmetic& b) { return a < b; }\n\ntemplate <class Arithmetic, class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value, bool>::type\n    isless\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const Arithmetic& a, const number<Backend, ExpressionTemplates>& b) { return a < b; }\n\ntemplate <class Arithmetic, class Tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value, bool>::type\n    isless\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const Arithmetic& a, const detail::expression<Tag, A1, A2, A3, A4>& b) { return a < b; }\n\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value, bool>::type\n    isless\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const detail::expression<Tag, A1, A2, A3, A4>& a, const Arithmetic& b) { return a < b; }\n\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Tagb, class A1b, class A2b, class A3b, class A4b>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_equivalent_number_type<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, typename detail::expression<Tagb, A1b, A2b, A3b, A4b>::result_type>::value, bool>::type\n    isless\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const detail::expression<Tag, A1, A2, A3, A4>& a, const detail::expression<Tagb, A1b, A2b, A3b, A4b>& b) { return a < b; }\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Backend2, expression_template_option ExpressionTemplates2>\ninline BOOST_MP_CXX14_CONSTEXPR bool islessgreater BOOST_PREVENT_MACRO_SUBSTITUTION(const number<Backend, ExpressionTemplates>& a, const number<Backend2, ExpressionTemplates2>& b)\n{\n   if (detail::is_unordered_comparison(a, b))\n      return false;\n   return a != b;\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value, bool>::type\n    islessgreater\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const number<Backend, ExpressionTemplates>& a, const Arithmetic& b)\n{\n   if (detail::is_unordered_comparison(a, b))\n      return false;\n   return a != b;\n}\n\ntemplate <class Arithmetic, class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value, bool>::type\n    islessgreater\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const Arithmetic& a, const number<Backend, ExpressionTemplates>& b)\n{\n   if (detail::is_unordered_comparison(a, b))\n      return false;\n   return a != b;\n}\n\ntemplate <class Arithmetic, class Tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value, bool>::type\n    islessgreater\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const Arithmetic& a, const detail::expression<Tag, A1, A2, A3, A4>& bb)\n{\n   typename detail::expression<Tag, A1, A2, A3, A4>::result_type b(bb);\n   return islessgreater                                          BOOST_PREVENT_MACRO_SUBSTITUTION(a, b);\n}\n\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value, bool>::type\n    islessgreater\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const detail::expression<Tag, A1, A2, A3, A4>& aa, const Arithmetic& b)\n{\n   typename detail::expression<Tag, A1, A2, A3, A4>::result_type a(aa);\n   return islessgreater                                          BOOST_PREVENT_MACRO_SUBSTITUTION(a, b);\n}\n\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Tagb, class A1b, class A2b, class A3b, class A4b>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_equivalent_number_type<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, typename detail::expression<Tagb, A1b, A2b, A3b, A4b>::result_type>::value, bool>::type\n    islessgreater\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const detail::expression<Tag, A1, A2, A3, A4>& aa, const detail::expression<Tagb, A1b, A2b, A3b, A4b>& bb)\n{\n   typename detail::expression<Tag, A1, A2, A3, A4>::result_type      a(aa);\n   typename detail::expression<Tagb, A1b, A2b, A3b, A4b>::result_type b(bb);\n   return islessgreater                                               BOOST_PREVENT_MACRO_SUBSTITUTION(a, b);\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Backend2, expression_template_option ExpressionTemplates2>\ninline BOOST_MP_CXX14_CONSTEXPR bool isunordered BOOST_PREVENT_MACRO_SUBSTITUTION(const number<Backend, ExpressionTemplates>& a, const number<Backend2, ExpressionTemplates2>& b) { return detail::is_unordered_comparison(a, b); }\n\ntemplate <class Backend, expression_template_option ExpressionTemplates, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value, bool>::type\n    isunordered\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const number<Backend, ExpressionTemplates>& a, const Arithmetic& b) { return detail::is_unordered_comparison(a, b); }\n\ntemplate <class Arithmetic, class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<number<Backend, ExpressionTemplates>, Arithmetic>::value, bool>::type\n    isunordered\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const Arithmetic& a, const number<Backend, ExpressionTemplates>& b) { return detail::is_unordered_comparison(a, b); }\n\ntemplate <class Arithmetic, class Tag, class A1, class A2, class A3, class A4>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value, bool>::type\n    isunordered\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const Arithmetic& a, const detail::expression<Tag, A1, A2, A3, A4>& bb)\n{\n   typename detail::expression<Tag, A1, A2, A3, A4>::result_type b(bb);\n   return detail::is_unordered_comparison(a, b);\n}\n\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<detail::is_valid_mixed_compare<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, Arithmetic>::value, bool>::type\n    isunordered\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const detail::expression<Tag, A1, A2, A3, A4>& aa, const Arithmetic& b)\n{\n   typename detail::expression<Tag, A1, A2, A3, A4>::result_type a(aa);\n   return detail::is_unordered_comparison(a, b);\n}\n\ntemplate <class Tag, class A1, class A2, class A3, class A4, class Tagb, class A1b, class A2b, class A3b, class A4b>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_equivalent_number_type<typename detail::expression<Tag, A1, A2, A3, A4>::result_type, typename detail::expression<Tagb, A1b, A2b, A3b, A4b>::result_type>::value, bool>::type\n    isunordered\n    BOOST_PREVENT_MACRO_SUBSTITUTION(const detail::expression<Tag, A1, A2, A3, A4>& aa, const detail::expression<Tagb, A1b, A2b, A3b, A4b>& bb)\n{\n   typename detail::expression<Tag, A1, A2, A3, A4>::result_type      a(aa);\n   typename detail::expression<Tagb, A1b, A2b, A3b, A4b>::result_type b(bb);\n   return detail::is_unordered_comparison(a, b);\n}\n\n}} // namespace boost::multiprecision\n\n#endif // BOOST_MP_NUMBER_COMPARE_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/precision.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_DETAIL_PRECISION_HPP\n#define BOOST_MP_DETAIL_PRECISION_HPP\n\n#include <boost/multiprecision/traits/is_variable_precision.hpp>\n#include <boost/multiprecision/detail/number_base.hpp>\n#include <boost/multiprecision/detail/digits.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n\nnamespace boost { namespace multiprecision { namespace detail {\n\ntemplate <class B, boost::multiprecision::expression_template_option ET>\ninline constexpr unsigned current_precision_of_last_chance_imp(const boost::multiprecision::number<B, ET>&, const std::integral_constant<int, 0>&)\n{\n   return std::numeric_limits<boost::multiprecision::number<B, ET> >::digits10;\n}\ntemplate <class B, boost::multiprecision::expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR unsigned current_precision_of_last_chance_imp(const boost::multiprecision::number<B, ET>& val, const std::integral_constant<int, 1>&)\n{\n   //\n   // We have an arbitrary precision integer, take it's \"precision\" as the\n   // location of the most-significant-bit less the location of the\n   // least-significant-bit, ie the number of bits required to represent the\n   // the value assuming we will have an exponent to shift things by:\n   //\n   return static_cast<unsigned>(val.is_zero() ? 1 : 1 + digits2_2_10(msb(abs(val)) - lsb(abs(val)) + 1));\n}\ntemplate <class B, boost::multiprecision::expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR unsigned current_precision_of_last_chance_imp(const boost::multiprecision::number<B, ET>& val, const std::integral_constant<int, 2>&)\n{\n   //\n   // We have an arbitrary precision rational, take it's \"precision\" as the\n   // the larger of the \"precision\" of numerator and denominator:\n   //\n   return (std::max)(current_precision_of_last_chance_imp(numerator(val), std::integral_constant<int, 1>()), current_precision_of_last_chance_imp(denominator(val), std::integral_constant<int, 1>()));\n}\n\ntemplate <class B, boost::multiprecision::expression_template_option ET>\ninline BOOST_MP_CXX14_CONSTEXPR unsigned current_precision_of_imp(const boost::multiprecision::number<B, ET>& n, const std::integral_constant<bool, true>&)\n{\n   return n.precision();\n}\ntemplate <class B, boost::multiprecision::expression_template_option ET>\ninline constexpr unsigned current_precision_of_imp(const boost::multiprecision::number<B, ET>& val, const std::integral_constant<bool, false>&)\n{\n   using tag = std::integral_constant<int,\n                                      std::numeric_limits<boost::multiprecision::number<B, ET> >::is_specialized &&\n                                              std::numeric_limits<boost::multiprecision::number<B, ET> >::is_integer &&\n                                              std::numeric_limits<boost::multiprecision::number<B, ET> >::is_exact &&\n                                              !std::numeric_limits<boost::multiprecision::number<B, ET> >::is_modulo\n                                          ? 1\n                                      : boost::multiprecision::number_category<boost::multiprecision::number<B, ET> >::value == boost::multiprecision::number_kind_rational ? 2\n                                                                                                                                                                            : 0>;\n   return current_precision_of_last_chance_imp(val, tag());\n}\n\ntemplate <class R, class Terminal>\ninline constexpr unsigned current_precision_of_terminal(const Terminal&)\n{\n   return (R::thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision) \n      ? (std::numeric_limits<Terminal>::min_exponent ? std::numeric_limits<Terminal>::digits10 : 1 + std::numeric_limits<Terminal>::digits10) : 0;\n}\ntemplate <class R, class Terminal>\ninline constexpr unsigned current_precision_of(const Terminal& r)\n{\n   return current_precision_of_terminal<R>(R::canonical_value(r));\n}\ntemplate <class R>\ninline constexpr unsigned current_precision_of(const float&)\n{\n   using list = typename R::backend_type::float_types;\n   using first_float = typename std::tuple_element<0, list>::type;\n\n   return (R::thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision) ? std::numeric_limits<first_float>::digits10 : 0;\n}\n\ntemplate <class R, class Terminal, std::size_t N>\ninline constexpr unsigned current_precision_of(const Terminal (&)[N])\n{ // For string literals:\n   return 0;\n}\n\ntemplate <class R, class B, boost::multiprecision::expression_template_option ET>\ninline constexpr unsigned current_precision_of_imp(const boost::multiprecision::number<B, ET>& n, const std::true_type&)\n{\n   return std::is_same<R, boost::multiprecision::number<B, ET> >::value \n      || (std::is_same<typename R::value_type, boost::multiprecision::number<B, ET> >::value && (R::thread_default_variable_precision_options() >= variable_precision_options::preserve_component_precision))\n      || (R::thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision) \n      ? current_precision_of_imp(n, boost::multiprecision::detail::is_variable_precision<boost::multiprecision::number<B, ET> >()) : 0;\n}\ntemplate <class R, class B, boost::multiprecision::expression_template_option ET>\ninline constexpr unsigned current_precision_of_imp(const boost::multiprecision::number<B, ET>& n, const std::false_type&)\n{\n   return std::is_same<R, boost::multiprecision::number<B, ET> >::value \n      || std::is_same<typename R::value_type, boost::multiprecision::number<B, ET> >::value\n      ? current_precision_of_imp(n, boost::multiprecision::detail::is_variable_precision<boost::multiprecision::number<B, ET> >()) : 0;\n}\n\ntemplate <class R, class B, boost::multiprecision::expression_template_option ET>\ninline constexpr unsigned current_precision_of(const boost::multiprecision::number<B, ET>& n)\n{\n   return current_precision_of_imp<R>(n, boost::multiprecision::detail::is_variable_precision<R>());\n}\n\ntemplate <class R, class tag, class Arg1>\ninline constexpr unsigned current_precision_of(const expression<tag, Arg1, void, void, void>& expr)\n{\n   return current_precision_of<R>(expr.left_ref());\n}\n\ntemplate <class R, class Arg1>\ninline constexpr unsigned current_precision_of(const expression<terminal, Arg1, void, void, void>& expr)\n{\n   return current_precision_of<R>(expr.value());\n}\n\ntemplate <class R, class tag, class Arg1, class Arg2>\ninline constexpr unsigned current_precision_of(const expression<tag, Arg1, Arg2, void, void>& expr)\n{\n   return (std::max)(current_precision_of<R>(expr.left_ref()), current_precision_of<R>(expr.right_ref()));\n}\n\ntemplate <class R, class tag, class Arg1, class Arg2, class Arg3>\ninline constexpr unsigned current_precision_of(const expression<tag, Arg1, Arg2, Arg3, void>& expr)\n{\n   return (std::max)((std::max)(current_precision_of<R>(expr.left_ref()), current_precision_of<R>(expr.right_ref())), current_precision_of<R>(expr.middle_ref()));\n}\n\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4130)\n#endif\n\ntemplate <class R, bool = boost::multiprecision::detail::is_variable_precision<R>::value>\nstruct scoped_default_precision\n{\n   template <class T>\n   constexpr scoped_default_precision(const T&) {}\n   template <class T, class U>\n   constexpr scoped_default_precision(const T&, const U&) {}\n   template <class T, class U, class V>\n   constexpr scoped_default_precision(const T&, const U&, const V&) {}\n\n   //\n   // This function is never called: in C++17 it won't be compiled either:\n   //\n   unsigned precision() const\n   {\n      BOOST_MP_ASSERT(\"This function should never be called!!\" == nullptr);\n      return 0;\n   }\n};\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\ntemplate <class R>\nstruct scoped_default_precision<R, true>\n{\n   template <class T>\n   BOOST_MP_CXX14_CONSTEXPR scoped_default_precision(const T& a)\n   {\n      init(has_uniform_precision() ? R::thread_default_precision() : (std::max)(R::thread_default_precision(), current_precision_of<R>(a)));\n   }\n   template <class T, class U>\n   BOOST_MP_CXX14_CONSTEXPR scoped_default_precision(const T& a, const U& b)\n   {\n      init(has_uniform_precision() ? R::thread_default_precision() : (std::max)(R::thread_default_precision(), (std::max)(current_precision_of<R>(a), current_precision_of<R>(b))));\n   }\n   template <class T, class U, class V>\n   BOOST_MP_CXX14_CONSTEXPR scoped_default_precision(const T& a, const U& b, const V& c)\n   {\n      init(has_uniform_precision() ? R::thread_default_precision() : (std::max)((std::max)(current_precision_of<R>(a), current_precision_of<R>(b)), (std::max)(R::thread_default_precision(), current_precision_of<R>(c))));\n   }\n   ~scoped_default_precision()\n   {\n      if(m_new_prec != m_old_prec)\n         R::thread_default_precision(m_old_prec);\n   }\n   BOOST_MP_CXX14_CONSTEXPR unsigned precision() const\n   {\n      return m_new_prec;\n   }\n\n   static constexpr bool has_uniform_precision()\n   {\n      return R::thread_default_variable_precision_options() <= boost::multiprecision::variable_precision_options::assume_uniform_precision;\n   }\n\n private:\n   BOOST_MP_CXX14_CONSTEXPR void init(unsigned p)\n   {\n      m_old_prec = R::thread_default_precision();\n      if (p && (p != m_old_prec))\n      {\n         R::thread_default_precision(p);\n         m_new_prec = p;\n      }\n      else\n         m_new_prec = m_old_prec;\n   }\n   unsigned m_old_prec, m_new_prec;\n};\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void maybe_promote_precision(T*, const std::integral_constant<bool, false>&) {}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void maybe_promote_precision(T* obj, const std::integral_constant<bool, true>&)\n{\n   if (obj->precision() != T::thread_default_precision())\n   {\n      obj->precision(T::thread_default_precision());\n   }\n}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR void maybe_promote_precision(T* obj)\n{\n   maybe_promote_precision(obj, std::integral_constant<bool, boost::multiprecision::detail::is_variable_precision<T>::value>());\n}\n\n#ifndef BOOST_NO_CXX17_IF_CONSTEXPR\n#define BOOST_MP_CONSTEXPR_IF_VARIABLE_PRECISION(T) \\\n   if                                               \\\n   constexpr(boost::multiprecision::detail::is_variable_precision<T>::value)\n#else\n#define BOOST_MP_CONSTEXPR_IF_VARIABLE_PRECISION(T) if (boost::multiprecision::detail::is_variable_precision<T>::value)\n#endif\n\ntemplate <class T, bool = boost::multiprecision::detail::is_variable_precision<T>::value>\nstruct scoped_target_precision\n{\n   variable_precision_options opts;\n   scoped_target_precision() : opts(T::thread_default_variable_precision_options())\n   {\n      T::thread_default_variable_precision_options(variable_precision_options::preserve_target_precision);\n   }\n   ~scoped_target_precision()\n   {\n      T::thread_default_variable_precision_options(opts);\n   }\n};\ntemplate <class T>\nstruct scoped_target_precision<T, false> {};\n\ntemplate <class T, bool = boost::multiprecision::detail::is_variable_precision<T>::value>\nstruct scoped_source_precision\n{\n   variable_precision_options opts;\n   scoped_source_precision() : opts(T::thread_default_variable_precision_options())\n   {\n      T::thread_default_variable_precision_options(variable_precision_options::preserve_source_precision);\n   }\n   ~scoped_source_precision()\n   {\n      T::thread_default_variable_precision_options(opts);\n   }\n};\ntemplate <class T>\nstruct scoped_source_precision<T, false> {};\n\ntemplate <class T, bool = boost::multiprecision::detail::is_variable_precision<T>::value>\nstruct scoped_precision_options\n{\n   unsigned saved_digits;\n   boost::multiprecision::variable_precision_options saved_options;\n\n   scoped_precision_options(unsigned digits) \n      : saved_digits(T::thread_default_precision()), saved_options(T::thread_default_variable_precision_options())\n   {\n      T::thread_default_precision(digits);\n   }\n   scoped_precision_options(unsigned digits, variable_precision_options opts)\n      : saved_digits(T::thread_default_precision()), saved_options(T::thread_default_variable_precision_options())\n   {\n      T::thread_default_precision(digits);\n      T::thread_default_variable_precision_options(opts);\n   }\n   template <class U>\n   scoped_precision_options(const U& u)\n      : saved_digits(T::thread_default_precision()), saved_options(T::thread_default_variable_precision_options())\n   {\n      T::thread_default_precision(u.precision());\n      T::thread_default_variable_precision_options(U::thread_default_variable_precision_options());\n   }\n   ~scoped_precision_options()\n   {\n      T::thread_default_variable_precision_options(saved_options);\n      T::thread_default_precision(saved_digits);\n   }\n};\n\ntemplate <class T>\nstruct scoped_precision_options<T, false>\n{\n   scoped_precision_options(unsigned) {}\n   scoped_precision_options(unsigned, variable_precision_options) {}\n   template <class U>\n   scoped_precision_options(const U&) {}\n   ~scoped_precision_options() {}\n};\n\n}\n}\n} // namespace boost::multiprecision::detail\n\n#endif // BOOST_MP_DETAIL_PRECISION_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/rebind.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock.\n//  Copyright Christopher Kormanyos 2013. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n\n#ifndef BOOST_MP_DETAIL_REBIND_HPP\n#define BOOST_MP_DETAIL_REBIND_HPP\n\nnamespace boost { namespace multiprecision { namespace backends { namespace detail {\ntemplate <class value_type, class my_allocator>\nstruct rebind\n{\n   using type = typename std::allocator_traits<my_allocator>::template rebind_alloc<value_type>;\n};\n}}}} // namespace boost::multiprecision::backends::detail\n\n#endif // BOOST_MP_DETAIL_REBIND_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/standalone_config.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2010 - 2021 Douglas Gregor\n//  Copyright 2021 Matt Borland.\n//  Distributed under the Boost Software License, Version 1.0.\n//  See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n//  Used to support configuration options depending on standalone context\n//  by providing either required support or disabling functionality  \n\n#ifndef BOOST_MP_STANDALONE_CONFIG_HPP\n#define BOOST_MP_STANDALONE_CONFIG_HPP\n\n#include <climits>\n\n// Boost.Config is dependency free so it is considered a requirement to use Boost.Multiprecision in standalone mode\n#ifdef __has_include\n#  if __has_include(<boost/config.hpp>)\n#    include <boost/config.hpp>\n#    include <boost/config/workaround.hpp>\n#  else\n#    error \"Boost.Config is considered a requirement to use Boost.Multiprecision in standalone mode. A package is provided at https://github.com/boostorg/multiprecision/releases\"\n#  endif\n#else\n// Provides the less helpful fatal error: 'boost/config.hpp' file not found if not available\n#  include <boost/config.hpp>\n#  include <boost/config/workaround.hpp>\n#endif\n\n// Minimum language standard transition\n #ifdef _MSVC_LANG\n #  if _MSVC_LANG < 201402L\n #    pragma warning(\"The minimum language standard to use Boost.Math will be C++14 starting in July 2023 (Boost 1.82 release)\");\n #  endif\n #else\n #  if __cplusplus < 201402L\n #    warning \"The minimum language standard to use Boost.Math will be C++14 starting in July 2023 (Boost 1.82 release)\"\n #  endif\n #endif\n\n// If any of the most frequently used boost headers are missing assume that standalone mode is supposed to be used\n#ifdef __has_include\n#if !__has_include(<boost/assert.hpp>) || !__has_include(<boost/lexical_cast.hpp>) || \\\n    !__has_include(<boost/throw_exception.hpp>) || !__has_include(<boost/predef/other/endian.h>)\n#   ifndef BOOST_MP_STANDALONE\n#       define BOOST_MP_STANDALONE\n#   endif\n#endif\n#endif\n\n#ifndef BOOST_MP_STANDALONE\n\n#include <boost/integer.hpp>\n#include <boost/integer_traits.hpp>\n\n// Required typedefs for interoperability with standalone mode\n#if defined(BOOST_HAS_INT128) && defined(__cplusplus)\nnamespace boost { namespace multiprecision {\n   using int128_type = boost::int128_type;\n   using uint128_type = boost::uint128_type;\n}}\n#endif\n#if defined(BOOST_HAS_FLOAT128) && defined(__cplusplus)\nnamespace boost { namespace multiprecision {\n   using float128_type = boost::float128_type;\n}}\n#endif\n\n// Boost.Math available by default\n#define BOOST_MP_MATH_AVAILABLE\n\n#else // Standalone mode\n\n#ifdef BOOST_MATH_STANDALONE\n#  define BOOST_MP_MATH_AVAILABLE\n#endif\n\n#ifndef BOOST_MP_MATH_AVAILABLE\n#  define BOOST_MATH_INSTRUMENT_CODE(x)\n#endif\n\n// Prevent Macro sub\n#ifndef BOOST_PREVENT_MACRO_SUBSTITUTION\n#  define BOOST_PREVENT_MACRO_SUBSTITUTION\n#endif\n\n#if defined(BOOST_HAS_INT128) && defined(__cplusplus)\nnamespace boost { namespace multiprecision {\n#  ifdef __GNUC__\n   __extension__ typedef __int128 int128_type;\n   __extension__ typedef unsigned __int128 uint128_type;\n#  else\n   typedef __int128 int128_type;\n   typedef unsigned __int128 uint128_type;\n#  endif\n}}\n\n#endif\n// same again for __float128:\n#if defined(BOOST_HAS_FLOAT128) && defined(__cplusplus)\nnamespace boost { namespace multiprecision {\n#  ifdef __GNUC__\n   __extension__ typedef __float128 float128_type;\n#  else\n   typedef __float128 float128_type;\n#  endif\n}}\n\n#endif\n\n#endif // BOOST_MP_STANDALONE\n\n// Workarounds for numeric limits on old compilers\n#ifdef BOOST_HAS_INT128\n#  ifndef INT128_MAX\n#    define INT128_MAX static_cast<boost::multiprecision::int128_type>((static_cast<boost::multiprecision::uint128_type>(1) << ((__SIZEOF_INT128__ * __CHAR_BIT__) - 1)) - 1)\n#  endif\n#  ifndef INT128_MIN\n#    define INT128_MIN (-INT128_MAX - 1)\n#  endif\n#  ifndef UINT128_MAX\n#    define UINT128_MAX ((2 * static_cast<boost::multiprecision::uint128_type>(INT128_MAX)) + 1)\n#  endif\n#endif\n\n#endif // BOOST_MP_STANDALONE_CONFIG_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/static_array.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock.\n//  Copyright Christopher Kormanyos 2021. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n\n#ifndef BOOST_MP_DETAIL_STATIC_ARRAY_HPP\n#define BOOST_MP_DETAIL_STATIC_ARRAY_HPP\n\n#include <array>\n#include <cstddef>\n#include <cstdint>\n#include <initializer_list>\n\nnamespace boost { namespace multiprecision { namespace backends { namespace detail {\ntemplate <class ValueType, const std::uint32_t ElemNumber>\nstruct static_array : public std::array<ValueType, std::size_t(ElemNumber)>\n{\nprivate:\n   using base_class_type = std::array<ValueType, std::size_t(ElemNumber)>;\n\npublic:\n   static_array() noexcept\n   {\n      base_class_type::fill(typename base_class_type::value_type(0u));\n   }\n\n   static_array(std::initializer_list<std::uint32_t> lst) noexcept\n   {\n      std::copy(lst.begin(),\n                lst.begin() + (std::min)(std::size_t(lst.size()), std::size_t(ElemNumber)),\n                base_class_type::begin());\n\n      std::fill(base_class_type::begin() + (std::min)(std::size_t(lst.size()), std::size_t(ElemNumber)),\n                base_class_type::end(),\n                typename base_class_type::value_type(0u));\n   }\n};\n}}}} // namespace boost::multiprecision::backends::detail\n\n#endif // BOOST_MP_DETAIL_STATIC_ARRAY_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/tables.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock.\n//  Copyright Christopher Kormanyos 2021. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n\n#ifndef BOOST_MP_DETAIL_TABLES_HPP\n#define BOOST_MP_DETAIL_TABLES_HPP\n\n#include <algorithm>\n#include <array>\n#include <cstdint>\n\nnamespace boost { namespace multiprecision { namespace backends { namespace detail {\nstruct a029750\n{\n   static constexpr std::uint32_t a029750_as_constexpr(const std::uint32_t value)\n   {\n      // Sloane's A029750 List of numbers of the form 2^k times 1, 3, 5 or 7.\n      // CoefficientList[Series[-(x + 1)^2 (x^2 + 1)^2/(2 x^4 - 1), {x, 0, 78}], x]\n      return ((value <= UINT32_C(     32)) ? UINT32_C(     32) : ((value <=  UINT32_C(     40)) ?  UINT32_C(     40) : ((value <= UINT32_C(     48)) ? UINT32_C(     48) : ((value <= UINT32_C(     56)) ? UINT32_C(     56) :\n             ((value <= UINT32_C(     64)) ? UINT32_C(     64) : ((value <=  UINT32_C(     80)) ?  UINT32_C(     80) : ((value <= UINT32_C(     96)) ? UINT32_C(     96) : ((value <= UINT32_C(    112)) ? UINT32_C(    112) :\n             ((value <= UINT32_C(    128)) ? UINT32_C(    128) : ((value <=  UINT32_C(    160)) ?  UINT32_C(    160) : ((value <= UINT32_C(    192)) ? UINT32_C(    192) : ((value <= UINT32_C(    224)) ? UINT32_C(    224) :\n             ((value <= UINT32_C(    256)) ? UINT32_C(    256) : ((value <=  UINT32_C(    320)) ?  UINT32_C(    320) : ((value <= UINT32_C(    384)) ? UINT32_C(    384) : ((value <= UINT32_C(    448)) ? UINT32_C(    448) :\n             ((value <= UINT32_C(    512)) ? UINT32_C(    512) : ((value <=  UINT32_C(    640)) ?  UINT32_C(    640) : ((value <= UINT32_C(    768)) ? UINT32_C(    768) : ((value <= UINT32_C(    896)) ? UINT32_C(    896) :\n             ((value <= UINT32_C(   1024)) ? UINT32_C(   1024) : ((value <=  UINT32_C(   1280)) ?  UINT32_C(   1280) : ((value <= UINT32_C(   1536)) ? UINT32_C(   1536) : ((value <= UINT32_C(   1792)) ? UINT32_C(   1792) :\n             ((value <= UINT32_C(   2048)) ? UINT32_C(   2048) : ((value <=  UINT32_C(   2560)) ?  UINT32_C(   2560) : ((value <= UINT32_C(   3072)) ? UINT32_C(   3072) : ((value <= UINT32_C(   3584)) ? UINT32_C(   3584) :\n             ((value <= UINT32_C(   4096)) ? UINT32_C(   4096) : ((value <=  UINT32_C(   5120)) ?  UINT32_C(   5120) : ((value <= UINT32_C(   6144)) ? UINT32_C(   6144) : ((value <= UINT32_C(   7168)) ? UINT32_C(   7168) :\n             ((value <= UINT32_C(   8192)) ? UINT32_C(   8192) : ((value <=  UINT32_C(  10240)) ?  UINT32_C(  10240) : ((value <= UINT32_C(  12288)) ? UINT32_C(  12288) : ((value <= UINT32_C(  14336)) ? UINT32_C(  14336) :\n             ((value <= UINT32_C(  16384)) ? UINT32_C(  16384) : ((value <=  UINT32_C(  20480)) ?  UINT32_C(  20480) : ((value <= UINT32_C(  24576)) ? UINT32_C(  24576) : ((value <= UINT32_C(  28672)) ? UINT32_C(  28672) :\n             ((value <= UINT32_C(  32768)) ? UINT32_C(  32768) : ((value <=  UINT32_C(  40960)) ?  UINT32_C(  40960) : ((value <= UINT32_C(  49152)) ? UINT32_C(  49152) : ((value <= UINT32_C(  57344)) ? UINT32_C(  57344) :\n             ((value <= UINT32_C(  65536)) ? UINT32_C(  65536) : ((value <=  UINT32_C(  81920)) ?  UINT32_C(  81920) : ((value <= UINT32_C(  98304)) ? UINT32_C(  98304) : ((value <= UINT32_C( 114688)) ? UINT32_C( 114688) :\n             ((value <= UINT32_C( 131072)) ? UINT32_C( 131072) : ((value <=  UINT32_C( 163840)) ?  UINT32_C( 163840) : ((value <= UINT32_C( 196608)) ? UINT32_C( 196608) : ((value <= UINT32_C( 229376)) ? UINT32_C( 229376) :\n             ((value <= UINT32_C( 262144)) ? UINT32_C( 262144) : ((value <=  UINT32_C( 327680)) ?  UINT32_C( 327680) : ((value <= UINT32_C( 393216)) ? UINT32_C( 393216) : ((value <= UINT32_C( 458752)) ? UINT32_C( 458752) :\n             ((value <= UINT32_C( 524288)) ? UINT32_C( 524288) : ((value <=  UINT32_C( 655360)) ?  UINT32_C( 655360) : ((value <= UINT32_C( 786432)) ? UINT32_C( 786432) : ((value <= UINT32_C( 917504)) ? UINT32_C( 917504) :\n             ((value <= UINT32_C(1048576)) ? UINT32_C(1048576) : ((value <=  UINT32_C(1310720)) ?  UINT32_C(1310720) : ((value <= UINT32_C(1572864)) ? UINT32_C(1572864) : ((value <= UINT32_C(1835008)) ? UINT32_C(1835008) : UINT32_C(0x7FFFFFFF)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))));\n   }\n\n   static std::uint32_t a029750_as_runtime_value(const std::uint32_t value)\n   {\n      // Sloane's A029750 List of numbers of the form 2^k times 1, 3, 5 or 7.\n      // CoefficientList[Series[-(x + 1)^2 (x^2 + 1)^2/(2 x^4 - 1), {x, 0, 78}], x]\n      constexpr std::array<std::uint32_t, 65U> a029750_data =\n      {{\n         UINT32_C(        32), UINT32_C(     40), UINT32_C(     48), UINT32_C(     56),\n         UINT32_C(        64), UINT32_C(     80), UINT32_C(     96), UINT32_C(    112),\n         UINT32_C(       128), UINT32_C(    160), UINT32_C(    192), UINT32_C(    224),\n         UINT32_C(       256), UINT32_C(    320), UINT32_C(    384), UINT32_C(    448),\n         UINT32_C(       512), UINT32_C(    640), UINT32_C(    768), UINT32_C(    896),\n         UINT32_C(      1024), UINT32_C(   1280), UINT32_C(   1536), UINT32_C(   1792),\n         UINT32_C(      2048), UINT32_C(   2560), UINT32_C(   3072), UINT32_C(   3584),\n         UINT32_C(      4096), UINT32_C(   5120), UINT32_C(   6144), UINT32_C(   7168),\n         UINT32_C(      8192), UINT32_C(  10240), UINT32_C(  12288), UINT32_C(  14336),\n         UINT32_C(     16384), UINT32_C(  20480), UINT32_C(  24576), UINT32_C(  28672),\n         UINT32_C(     32768), UINT32_C(  40960), UINT32_C(  49152), UINT32_C(  57344),\n         UINT32_C(     65536), UINT32_C(  81920), UINT32_C(  98304), UINT32_C( 114688),\n         UINT32_C(    131072), UINT32_C( 163840), UINT32_C( 196608), UINT32_C( 229376),\n         UINT32_C(    262144), UINT32_C( 327680), UINT32_C( 393216), UINT32_C( 458752),\n         UINT32_C(    524288), UINT32_C( 655360), UINT32_C( 786432), UINT32_C( 917504),\n         UINT32_C(   1048576), UINT32_C(1310720), UINT32_C(1572864), UINT32_C(1835008),\n         UINT32_C(0x7FFFFFFF)\n      }};\n\n      const std::array<std::uint32_t, 65U>::const_iterator it =\n         std::lower_bound(a029750_data.cbegin(), a029750_data.cend(), value);\n\n      return ((it != a029750_data.cend()) ? *it : UINT32_C(0xFFFFFFFF));\n   }\n};\n\nconstexpr std::uint32_t pow10_maker(std::uint32_t n)\n{\n   // Make the constant power of 10^n.\n   return ((n == UINT32_C(0)) ? UINT32_C(1) : pow10_maker(n - UINT32_C(1)) * UINT32_C(10));\n}\n\n}}}} // namespace boost::multiprecision::backends::detail\n\n#endif // BOOST_MP_DETAIL_TABLES_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/ublas_interop.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2013 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_UBLAS_INTEROP_HPP\n#define BOOST_MP_UBLAS_INTEROP_HPP\n\nnamespace boost { namespace numeric { namespace ublas {\n\ntemplate <class V>\nclass sparse_vector_element;\n\ntemplate <class V, class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline bool operator==(const sparse_vector_element<V>& a, const ::boost::multiprecision::number<Backend, ExpressionTemplates>& b)\n{\n   using ref_type = typename sparse_vector_element<V>::const_reference;\n   return static_cast<ref_type>(a) == b;\n}\n\ntemplate <class X, class Y>\nstruct promote_traits;\n\ntemplate <class Backend1, boost::multiprecision::expression_template_option ExpressionTemplates1, class Backend2, boost::multiprecision::expression_template_option ExpressionTemplates2>\nstruct promote_traits<boost::multiprecision::number<Backend1, ExpressionTemplates1>, boost::multiprecision::number<Backend2, ExpressionTemplates2> >\n{\n   using number1_t = boost::multiprecision::number<Backend1, ExpressionTemplates1>;\n   using number2_t = boost::multiprecision::number<Backend2, ExpressionTemplates2>;\n   using promote_type = typename std::conditional<\n       std::is_convertible<number1_t, number2_t>::value && !std::is_convertible<number2_t, number1_t>::value,\n       number2_t, number1_t>::type;\n};\n\ntemplate <class Backend1, boost::multiprecision::expression_template_option ExpressionTemplates1, class Arithmetic>\nstruct promote_traits<boost::multiprecision::number<Backend1, ExpressionTemplates1>, Arithmetic>\n{\n   using promote_type = boost::multiprecision::number<Backend1, ExpressionTemplates1>;\n};\n\ntemplate <class Arithmetic, class Backend1, boost::multiprecision::expression_template_option ExpressionTemplates1>\nstruct promote_traits<Arithmetic, boost::multiprecision::number<Backend1, ExpressionTemplates1> >\n{\n   using promote_type = boost::multiprecision::number<Backend1, ExpressionTemplates1>;\n};\n\ntemplate <class Backend1, boost::multiprecision::expression_template_option ExpressionTemplates1, class tag, class Arg1, class Arg2, class Arg3, class Arg4>\nstruct promote_traits<boost::multiprecision::number<Backend1, ExpressionTemplates1>, boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >\n{\n   using number1_t = boost::multiprecision::number<Backend1, ExpressionTemplates1>         ;\n   using expression_type = boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>;\n   using number2_t = typename expression_type::result_type                                 ;\n   using promote_type = typename promote_traits<number1_t, number2_t>::promote_type           ;\n};\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class Backend1, boost::multiprecision::expression_template_option ExpressionTemplates1>\nstruct promote_traits<boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, boost::multiprecision::number<Backend1, ExpressionTemplates1> >\n{\n   using number1_t = boost::multiprecision::number<Backend1, ExpressionTemplates1>         ;\n   using expression_type = boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>;\n   using number2_t = typename expression_type::result_type                                 ;\n   using promote_type = typename promote_traits<number1_t, number2_t>::promote_type           ;\n};\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class tagb, class Arg1b, class Arg2b, class Arg3b, class Arg4b>\nstruct promote_traits<boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, boost::multiprecision::detail::expression<tagb, Arg1b, Arg2b, Arg3b, Arg4b> >\n{\n   using expression1_t = boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>     ;\n   using number1_t = typename expression1_t::result_type                                        ;\n   using expression2_t = boost::multiprecision::detail::expression<tagb, Arg1b, Arg2b, Arg3b, Arg4b>;\n   using number2_t = typename expression2_t::result_type                                        ;\n};\n\n}}} // namespace boost::numeric::ublas\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/uniform_int_distribution.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Jens Maurer 2000-2021\n//  Copyright Steven Watanabe 2011-2021\n//  Copyright John Maddock 2015-2021\n//  Copyright Matt Borland 2021\n//  Distributed under the Boost Software License, Version 1.0. \n//  (See accompanying file LICENSE_1_0.txt or copy at \n//  https://www.boost.org/LICENSE_1_0.txt\n//\n//  This is a C++11 compliant port of Boost.Random's implementation\n//  of uniform_int_distribution. See their comments for detailed\n//  descriptions\n\n#ifndef BOOST_MP_UNIFORM_INT_DISTRIBUTION_HPP\n#define BOOST_MP_UNIFORM_INT_DISTRIBUTION_HPP\n\n#include <limits>\n#include <type_traits>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n#include <boost/multiprecision/traits/std_integer_traits.hpp>\n\nnamespace boost { namespace multiprecision { \n    \nnamespace detail {\n\ntemplate <typename T, bool intrinsic>\nstruct make_unsigned_impl\n{\n    using type = typename boost::multiprecision::detail::make_unsigned<T>::type;\n};\n\ntemplate <typename T>\nstruct make_unsigned_impl<T, false>\n{\n    using type = T;\n};\n\ntemplate <typename T>\nstruct make_unsigned_mp\n{\n    using type = typename make_unsigned_impl<T, boost::multiprecision::detail::is_integral<T>::value>::type;\n};\n\ntemplate <typename Engine, typename T>\nT generate_uniform_int (Engine& eng, T min_value, T max_value)\n{\n    using range_type = typename boost::multiprecision::detail::make_unsigned_mp<T>::type;\n    using base_result = typename Engine::result_type;\n    using base_unsigned = typename boost::multiprecision::detail::make_unsigned_mp<base_result>::type;\n\n    const range_type range = max_value - min_value;\n    const base_result bmin = (eng.min)();\n    const base_unsigned brange = (eng.max)() - (eng.min)();\n\n    if(range == 0)\n    {\n        return min_value;\n    }\n    else if (brange < range)\n    {\n        for(;;)\n        {\n            range_type limit;\n            if(range == (std::numeric_limits<range_type>::max)())\n            {\n                limit = range / (range_type(brange) + 1);\n                if(range % (range_type(brange) + 1) == range_type(brange))\n                {\n                    ++limit;\n                }\n            }\n            else\n            {\n                limit = (range + 1) / (range_type(brange) + 1);\n            }\n\n            range_type result = 0;\n            range_type mult = 1;\n\n            while (mult <= limit)\n            {\n                result += static_cast<range_type>(static_cast<range_type>(eng() - bmin) * mult);\n\n                if(mult * range_type(brange) == range - mult + 1)\n                {\n                    return(result);\n                }\n\n                mult *= range_type(brange)+range_type(1);\n            }\n\n            range_type result_increment = generate_uniform_int(eng, range_type(0), range_type(range/mult));\n\n            if(std::numeric_limits<range_type>::is_bounded && ((std::numeric_limits<range_type>::max)() / mult < result_increment))\n            {\n                continue;\n            }\n\n            result_increment *= mult;\n            result += result_increment;\n\n            if(result < result_increment)\n            {\n                continue;\n            }\n            if(result > range)\n            {\n                continue;\n            }\n\n            return result + min_value;\n        }\n    }\n    else\n    {\n        using mixed_range_type = \n        typename std::conditional<std::numeric_limits<range_type>::is_specialized && std::numeric_limits<base_unsigned>::is_specialized &&\n                                  (std::numeric_limits<range_type>::digits >= std::numeric_limits<base_unsigned>::digits),\n                                  range_type, base_unsigned>::type;\n\n        mixed_range_type bucket_size;\n\n        if(brange == (std::numeric_limits<base_unsigned>::max)()) \n        {\n            bucket_size = static_cast<mixed_range_type>(brange) / (static_cast<mixed_range_type>(range)+1);\n            if(static_cast<mixed_range_type>(brange) % (static_cast<mixed_range_type>(range)+1) == static_cast<mixed_range_type>(range)) \n            {\n                ++bucket_size;\n            }\n        } \n        else \n        {\n            bucket_size = static_cast<mixed_range_type>(brange + 1) / (static_cast<mixed_range_type>(range)+1);\n        }\n\n        for(;;) \n        {\n            mixed_range_type result = eng() - bmin;\n            result /= bucket_size;\n\n            if(result <= static_cast<mixed_range_type>(range))\n            {\n                return result + min_value;\n            }\n        }\n    }\n}\n\n} // Namespace detail\n\ntemplate <typename Integer = int>\nclass uniform_int_distribution\n{\nprivate:\n    Integer min_;\n    Integer max_;\n\npublic:\n    class param_type\n    {\n    private:\n        Integer min_;\n        Integer max_;\n    \n    public:\n        explicit param_type(Integer min_val, Integer max_val) : min_ {min_val}, max_ {max_val}\n        {\n            BOOST_MP_ASSERT(min_ <= max_);\n        }\n\n        Integer a() const { return min_; }\n        Integer b() const { return max_; }\n    };\n\n    explicit uniform_int_distribution(Integer min_arg, Integer max_arg) : min_ {min_arg}, max_ {max_arg}\n    {\n        BOOST_MP_ASSERT(min_ <= max_);\n    }\n\n    explicit uniform_int_distribution(const param_type& param_arg) : min_ {param_arg.a()}, max_ {param_arg.b()} {}\n\n    Integer min BOOST_PREVENT_MACRO_SUBSTITUTION () const { return min_; }\n    Integer max BOOST_PREVENT_MACRO_SUBSTITUTION () const { return max_; }\n    \n    Integer a() const { return min_; }\n    Integer b() const { return max_; }\n\n    param_type param() const { return param_type(min_, max_); }\n\n    void param(const param_type& param_arg)\n    {\n        min_ = param_arg.a();\n        max_ = param_arg.b();\n    }\n\n    template <typename Engine>\n    Integer operator() (Engine& eng) const\n    {\n        return detail::generate_uniform_int(eng, min_, max_);\n    }\n\n    template <typename Engine>\n    Integer operator() (Engine& eng, const param_type& param_arg) const\n    {\n        return detail::generate_uniform_int(eng, param_arg.a(), param_arg.b());\n    }\n};\n\n}} // Namespaces\n\n#endif // BOOST_MP_UNIFORM_INT_DISTRIBUTION_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/detail/utype_helper.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock.\n//  Copyright Christopher Kormanyos 2013. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n\n#ifndef BOOST_MP_UTYPE_HELPER_HPP\n#define BOOST_MP_UTYPE_HELPER_HPP\n\n#include <limits>\n#include <cstdint>\n\nnamespace boost {\nnamespace multiprecision {\nnamespace detail {\ntemplate <const unsigned>\nstruct utype_helper\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<0U>\n{\n   using exact = boost::uint8_t;\n};\ntemplate <>\nstruct utype_helper<1U>\n{\n   using exact = boost::uint8_t;\n};\ntemplate <>\nstruct utype_helper<2U>\n{\n   using exact = boost::uint8_t;\n};\ntemplate <>\nstruct utype_helper<3U>\n{\n   using exact = boost::uint8_t;\n};\ntemplate <>\nstruct utype_helper<4U>\n{\n   using exact = boost::uint8_t;\n};\ntemplate <>\nstruct utype_helper<5U>\n{\n   using exact = boost::uint8_t;\n};\ntemplate <>\nstruct utype_helper<6U>\n{\n   using exact = boost::uint8_t;\n};\ntemplate <>\nstruct utype_helper<7U>\n{\n   using exact = boost::uint8_t;\n};\ntemplate <>\nstruct utype_helper<8U>\n{\n   using exact = boost::uint8_t;\n};\n\ntemplate <>\nstruct utype_helper<9U>\n{\n   using exact = std::uint16_t;\n};\ntemplate <>\nstruct utype_helper<10U>\n{\n   using exact = std::uint16_t;\n};\ntemplate <>\nstruct utype_helper<11U>\n{\n   using exact = std::uint16_t;\n};\ntemplate <>\nstruct utype_helper<12U>\n{\n   using exact = std::uint16_t;\n};\ntemplate <>\nstruct utype_helper<13U>\n{\n   using exact = std::uint16_t;\n};\ntemplate <>\nstruct utype_helper<14U>\n{\n   using exact = std::uint16_t;\n};\ntemplate <>\nstruct utype_helper<15U>\n{\n   using exact = std::uint16_t;\n};\ntemplate <>\nstruct utype_helper<16U>\n{\n   using exact = std::uint16_t;\n};\n\ntemplate <>\nstruct utype_helper<17U>\n{\n   using exact = std::uint32_t;\n};\ntemplate <>\nstruct utype_helper<18U>\n{\n   using exact = std::uint32_t;\n};\ntemplate <>\nstruct utype_helper<19U>\n{\n   using exact = std::uint32_t;\n};\ntemplate <>\nstruct utype_helper<20U>\n{\n   using exact = std::uint32_t;\n};\ntemplate <>\nstruct utype_helper<21U>\n{\n   using exact = std::uint32_t;\n};\ntemplate <>\nstruct utype_helper<22U>\n{\n   using exact = std::uint32_t;\n};\ntemplate <>\nstruct utype_helper<23U>\n{\n   using exact = std::uint32_t;\n};\ntemplate <>\nstruct utype_helper<24U>\n{\n   using exact = std::uint32_t;\n};\ntemplate <>\nstruct utype_helper<25U>\n{\n   using exact = std::uint32_t;\n};\ntemplate <>\nstruct utype_helper<26U>\n{\n   using exact = std::uint32_t;\n};\ntemplate <>\nstruct utype_helper<27U>\n{\n   using exact = std::uint32_t;\n};\ntemplate <>\nstruct utype_helper<28U>\n{\n   using exact = std::uint32_t;\n};\ntemplate <>\nstruct utype_helper<29U>\n{\n   using exact = std::uint32_t;\n};\ntemplate <>\nstruct utype_helper<30U>\n{\n   using exact = std::uint32_t;\n};\ntemplate <>\nstruct utype_helper<31U>\n{\n   using exact = std::uint32_t;\n};\ntemplate <>\nstruct utype_helper<32U>\n{\n   using exact = std::uint32_t;\n};\n\ntemplate <>\nstruct utype_helper<33U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<34U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<35U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<36U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<37U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<38U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<39U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<40U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<41U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<42U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<43U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<44U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<45U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<46U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<47U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<48U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<49U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<50U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<51U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<52U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<53U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<54U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<55U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<56U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<57U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<58U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<59U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<60U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<61U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<62U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<63U>\n{\n   using exact = std::uint64_t;\n};\ntemplate <>\nstruct utype_helper<64U>\n{\n   using exact = std::uint64_t;\n};\n\ntemplate <class unsigned_type>\nint utype_prior(unsigned_type ui)\n{\n   // TBD: Implement a templated binary search for this.\n   int priority_bit;\n\n   unsigned_type priority_mask = unsigned_type(unsigned_type(1U) << (std::numeric_limits<unsigned_type>::digits - 1));\n\n   for (priority_bit = std::numeric_limits<unsigned_type>::digits - 1; priority_bit >= 0; --priority_bit)\n   {\n      if (unsigned_type(priority_mask & ui) != unsigned_type(0U))\n      {\n         break;\n      }\n\n      priority_mask >>= 1;\n   }\n\n   return priority_bit;\n}\n\n}}} // namespace boost::multiprecision::detail\n\n#endif // BOOST_MP_UTYPE_HELPER_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/eigen.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_EIGEN_HPP\n#define BOOST_MP_EIGEN_HPP\n\n#include <boost/multiprecision/number.hpp>\n#include <Eigen/Core>\n\n//\n// Generic Eigen support code:\n//\nnamespace Eigen {\n\ntemplate <class B1, class B2>\nstruct NumTraitsImp;\n\ntemplate <class B1>\nstruct NumTraitsImp<B1, B1>\n{\n   using self_type  = B1;\n   using Real       = typename boost::multiprecision::scalar_result_from_possible_complex<self_type>::type;\n   using NonInteger = self_type; // Not correct but we can't do much better??\n   using Literal    = double;\n   using Nested     = self_type;\n   enum\n   {\n      IsComplex             = boost::multiprecision::number_category<self_type>::value == boost::multiprecision::number_kind_complex,\n      IsInteger             = boost::multiprecision::number_category<self_type>::value == boost::multiprecision::number_kind_integer,\n      ReadCost              = 1,\n      AddCost               = 4,\n      MulCost               = 8,\n      IsSigned              = std::numeric_limits<self_type>::is_specialized ? std::numeric_limits<self_type>::is_signed : true,\n      RequireInitialization = 1,\n   };\n   static Real epsilon()\n   {\n      static_assert(std::numeric_limits<Real>::is_specialized, \"Eigen's NumTraits instantiated on a type with no numeric_limits support.  Are you using a variable precision type?\");\n      return std::numeric_limits<Real>::epsilon();\n   }\n   static Real dummy_precision()\n   {\n      return 1000 * epsilon();\n   }\n   static Real highest()\n   {\n      static_assert(std::numeric_limits<Real>::is_specialized, \"Eigen's NumTraits instantiated on a type with no numeric_limits support.  Are you using a variable precision type?\");\n      return (std::numeric_limits<Real>::max)();\n   }\n   static Real lowest()\n   {\n      static_assert(std::numeric_limits<Real>::is_specialized, \"Eigen's NumTraits instantiated on a type with no numeric_limits support.  Are you using a variable precision type?\");\n      return (std::numeric_limits<Real>::min)();\n   }\n   static int digits10_imp(const std::integral_constant<bool, true>&)\n   {\n      static_assert(std::numeric_limits<Real>::is_specialized, \"Eigen's NumTraits instantiated on a type with no numeric_limits support.  Are you using a variable precision type?\");\n      return std::numeric_limits<Real>::digits10;\n   }\n   template <bool B>\n   static int digits10_imp(const std::integral_constant<bool, B>&)\n   {\n      return Real::thread_default_precision();\n   }\n   static int digits10()\n   {\n      return digits10_imp(std::integral_constant < bool, std::numeric_limits<Real>::digits10 && (std::numeric_limits<Real>::digits10 != INT_MAX) ? true : false > ());\n   }\n   static int digits()\n   {\n      // return the number of digits in the component type in case Real is complex\n      // and we have no numeric_limits specialization.\n      static_assert(std::numeric_limits<Real>::is_specialized, \"Eigen's NumTraits instantiated on a type with no numeric_limits support.  Are you using a variable precision type?\");\n      return std::numeric_limits<Real>::digits;\n   }\n   static int min_exponent()\n   {\n      static_assert(std::numeric_limits<Real>::is_specialized, \"Eigen's NumTraits instantiated on a type with no numeric_limits support.  Are you using a variable precision type?\");\n      return std::numeric_limits<Real>::min_exponent;\n   }\n   static int max_exponent()\n   {\n      static_assert(std::numeric_limits<Real>::is_specialized, \"Eigen's NumTraits instantiated on a type with no numeric_limits support.  Are you using a variable precision type?\");\n      return std::numeric_limits<Real>::max_exponent;\n   }\n   static Real infinity()\n   {\n      static_assert(std::numeric_limits<Real>::is_specialized, \"Eigen's NumTraits instantiated on a type with no numeric_limits support.  Are you using a variable precision type?\");\n      return std::numeric_limits<Real>::infinity();\n   }\n   static Real quiet_NaN()\n   {\n      static_assert(std::numeric_limits<Real>::is_specialized, \"Eigen's NumTraits instantiated on a type with no numeric_limits support.  Are you using a variable precision type?\");\n      return std::numeric_limits<Real>::quiet_NaN();\n   }\n};   \n   \ntemplate <class B1, class B2>\nstruct NumTraitsImp : public NumTraitsImp<B2, B2>\n{\n   //\n   // This version is instantiated when B1 and B2 are different types, this happens for rational/complex/interval\n   // types, in which case many methods defer to those of the \"component type\" B2.\n   //\n   using self_type  = B1;\n   using Real       = typename boost::multiprecision::scalar_result_from_possible_complex<self_type>::type;\n   using NonInteger = self_type; // Not correct but we can't do much better??\n   using Literal    = double;\n   using Nested     = self_type;\n   enum\n   {\n      IsComplex             = boost::multiprecision::number_category<self_type>::value == boost::multiprecision::number_kind_complex,\n      IsInteger             = boost::multiprecision::number_category<self_type>::value == boost::multiprecision::number_kind_integer,\n      ReadCost              = 1,\n      AddCost               = 4,\n      MulCost               = 8,\n      IsSigned              = std::numeric_limits<self_type>::is_specialized ? std::numeric_limits<self_type>::is_signed : true,\n      RequireInitialization = 1,\n   };\n   static B2 epsilon()\n   {\n      return NumTraitsImp<B2, B2>::epsilon();\n   }\n   static B2 dummy_precision()\n   {\n      return 1000 * epsilon();\n   }\n   static B2 highest()\n   {\n      return NumTraitsImp<B2, B2>::highest();\n   }\n   static B2 lowest()\n   {\n      return NumTraitsImp<B2, B2>::lowest();\n   }\n   static int digits10()\n   {\n      return NumTraitsImp<B2, B2>::digits10();\n   }\n   static int digits()\n   {\n      return NumTraitsImp<B2, B2>::digits();\n   }\n   static int min_exponent()\n   {\n      return NumTraitsImp<B2, B2>::min_exponent();\n   }\n   static int max_exponent()\n   {\n      return NumTraitsImp<B2, B2>::max_exponent();\n   }\n   static B2 infinity()\n   {\n      return NumTraitsImp<B2, B2>::infinity();\n   }\n   static B2 quiet_NaN()\n   {\n      return NumTraitsImp<B2, B2>::quiet_NaN();\n   }\n};\n\ntemplate <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct NumTraits<boost::multiprecision::number<Backend, ExpressionTemplates> > : public NumTraitsImp<boost::multiprecision::number<Backend, ExpressionTemplates>, typename boost::multiprecision::number<Backend, ExpressionTemplates>::value_type>\n{};\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\nstruct NumTraits<boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > : public NumTraits<typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>\n{};\n\n#define BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(A)                                                                                                                                                                           \\\n   template <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates, typename BinaryOp>                                                                                                  \\\n   struct ScalarBinaryOpTraits<boost::multiprecision::number<Backend, ExpressionTemplates>, A, BinaryOp>                                                                                                               \\\n   {                                                                                                                                                                                                                   \\\n      /*static_assert(boost::multiprecision::is_compatible_arithmetic_type<A, boost::multiprecision::number<Backend, ExpressionTemplates> >::value, \"Interoperability with this arithmetic type is not supported.\");*/ \\\n      using ReturnType = boost::multiprecision::number<Backend, ExpressionTemplates>;                                                                                                                                  \\\n   };                                                                                                                                                                                                                  \\\n   template <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates, typename BinaryOp>                                                                                                  \\\n   struct ScalarBinaryOpTraits<A, boost::multiprecision::number<Backend, ExpressionTemplates>, BinaryOp>                                                                                                               \\\n   {                                                                                                                                                                                                                   \\\n      /*static_assert(boost::multiprecision::is_compatible_arithmetic_type<A, boost::multiprecision::number<Backend, ExpressionTemplates> >::value, \"Interoperability with this arithmetic type is not supported.\");*/ \\\n      using ReturnType = boost::multiprecision::number<Backend, ExpressionTemplates>;                                                                                                                                  \\\n   };\n\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(float)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(double)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(long double)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(char)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(unsigned char)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(signed char)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(short)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(unsigned short)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(int)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(unsigned int)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(long)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(unsigned long)\n\n#if 0    \n      template<class Backend, boost::multiprecision::expression_template_option ExpressionTemplates, class Backend2, boost::multiprecision::expression_template_option ExpressionTemplates2, typename BinaryOp>\n   struct ScalarBinaryOpTraits<boost::multiprecision::number<Backend, ExpressionTemplates>, boost::multiprecision::number<Backend2, ExpressionTemplates2>, BinaryOp>\n   {\n      static_assert(\n         boost::multiprecision::is_compatible_arithmetic_type<boost::multiprecision::number<Backend2, ExpressionTemplates2>, boost::multiprecision::number<Backend, ExpressionTemplates> >::value\n         || boost::multiprecision::is_compatible_arithmetic_type<boost::multiprecision::number<Backend, ExpressionTemplates>, boost::multiprecision::number<Backend2, ExpressionTemplates2> >::value, \"Interoperability with this arithmetic type is not supported.\");\n      using ReturnType = typename std::conditional<std::is_convertible<boost::multiprecision::number<Backend2, ExpressionTemplates2>, boost::multiprecision::number<Backend, ExpressionTemplates> >::value,\n         boost::multiprecision::number<Backend, ExpressionTemplates>, boost::multiprecision::number<Backend2, ExpressionTemplates2> >::type;\n   };\n\n   template<unsigned D, typename BinaryOp>\n   struct ScalarBinaryOpTraits<boost::multiprecision::number<boost::multiprecision::backends::mpc_complex_backend<D>, boost::multiprecision::et_on>, boost::multiprecision::mpfr_float, BinaryOp>\n   {\n      using ReturnType = boost::multiprecision::number<boost::multiprecision::backends::mpc_complex_backend<D>, boost::multiprecision::et_on>;\n   };\n\n   template<typename BinaryOp>\n   struct ScalarBinaryOpTraits<boost::multiprecision::mpfr_float, boost::multiprecision::mpc_complex, BinaryOp>\n   {\n      using ReturnType = boost::multiprecision::number<boost::multiprecision::backends::mpc_complex_backend<0>, boost::multiprecision::et_on>;\n   };\n\n   template<class Backend, boost::multiprecision::expression_template_option ExpressionTemplates, typename BinaryOp>\n   struct ScalarBinaryOpTraits<boost::multiprecision::number<Backend, ExpressionTemplates>, boost::multiprecision::number<Backend, ExpressionTemplates>, BinaryOp>\n   {\n      using ReturnType = boost::multiprecision::number<Backend, ExpressionTemplates>;\n   };\n#endif\n\ntemplate <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates, class tag, class Arg1, class Arg2, class Arg3, class Arg4, typename BinaryOp>\nstruct ScalarBinaryOpTraits<boost::multiprecision::number<Backend, ExpressionTemplates>, boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, BinaryOp>\n{\n   static_assert(std::is_convertible<typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, boost::multiprecision::number<Backend, ExpressionTemplates> >::value, \"Interoperability with this arithmetic type is not supported.\");\n   using ReturnType = boost::multiprecision::number<Backend, ExpressionTemplates>;\n};\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class Backend, boost::multiprecision::expression_template_option ExpressionTemplates, typename BinaryOp>\nstruct ScalarBinaryOpTraits<boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, boost::multiprecision::number<Backend, ExpressionTemplates>, BinaryOp>\n{\n   static_assert(std::is_convertible<typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, boost::multiprecision::number<Backend, ExpressionTemplates> >::value, \"Interoperability with this arithmetic type is not supported.\");\n   using ReturnType = boost::multiprecision::number<Backend, ExpressionTemplates>;\n};\n\nnamespace internal {\ntemplate <typename Scalar>\nstruct conj_retval;\n\ntemplate <typename Scalar, bool IsComplex>\nstruct conj_impl;\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\nstruct conj_retval<boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >\n{\n   using type = typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type;\n};\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\nstruct conj_impl<boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, true>\n{\n   EIGEN_DEVICE_FUNC\n   static inline typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type run(const typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& x)\n   {\n      return conj(x);\n   }\n};\n\n} // namespace internal\n\n} // namespace Eigen\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/float128.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2013 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_FLOAT128_HPP\n#define BOOST_MP_FLOAT128_HPP\n\n// https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html\n#if !defined(__amd64__) && !defined(__amd64) && !defined(__x86_64__) && !defined(__x86_64) && !defined(_M_X64) && !defined(_M_AMD64) && \\\n    !defined(i386) && !defined(__i386) && !defined(__i386__) && !defined(_M_IX86) && !defined(__X86__) && !defined(_X86_) && !defined(__I86__) && \\\n    !defined(__ia64__) && !defined(_IA64) && !defined(__IA64__) && !defined(__ia64) && !defined(_M_IA64) && !defined(__itanium__) && \\\n    !defined(__hppa__) && !defined(__HPPA__) && !defined(__hppa) && \\\n    !defined(__powerpc) && !defined(_M_PPC) && !defined(_ARCH_PPC) && !defined(_ARCH_PPC64) && !defined(__PPCBROADWAY__)\n#error libquadmath only works on on i386, x86_64, IA-64, and hppa HP-UX, as well as on PowerPC GNU/Linux targets that enable the vector scalar (VSX) instruction set.\n#endif\n\n#include <memory>\n#include <climits>\n#include <cfloat>\n#include <tuple>\n#include <cstring>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/number.hpp>\n#include <boost/multiprecision/detail/hash.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n\n#if defined(BOOST_INTEL) && !defined(BOOST_MP_USE_FLOAT128) && !defined(BOOST_MP_USE_QUAD)\n#if defined(BOOST_INTEL_CXX_VERSION) && (BOOST_INTEL_CXX_VERSION >= 1310) && defined(__GNUC__)\n#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6))\n#define BOOST_MP_USE_FLOAT128\n#endif\n#endif\n\n#ifndef BOOST_MP_USE_FLOAT128\n#define BOOST_MP_USE_QUAD\n#endif\n#endif\n\n#if defined(__GNUC__) && !defined(BOOST_MP_USE_FLOAT128) && !defined(BOOST_MP_USE_QUAD)\n#define BOOST_MP_USE_FLOAT128\n#endif\n\n#if !defined(BOOST_MP_USE_FLOAT128) && !defined(BOOST_MP_USE_QUAD)\n#error \"Sorry compiler is neither GCC, not Intel, don't know how to configure this header.\"\n#endif\n#if defined(BOOST_MP_USE_FLOAT128) && defined(BOOST_MP_USE_QUAD)\n#error \"Oh dear, both BOOST_MP_USE_FLOAT128 and BOOST_MP_USE_QUAD are defined, which one should I be using?\"\n#endif\n\n#if defined(BOOST_MP_USE_FLOAT128)\n\nextern \"C\" {\n#include <quadmath.h>\n}\n\nusing float128_type = __float128;\n\n#elif defined(BOOST_MP_USE_QUAD)\n\n#include <boost/multiprecision/detail/float_string_cvt.hpp>\n\nusing float128_type = _Quad;\n\nextern \"C\" {\n_Quad __ldexpq(_Quad, int);\n_Quad __frexpq(_Quad, int*);\n_Quad __fabsq(_Quad);\n_Quad __floorq(_Quad);\n_Quad __ceilq(_Quad);\n_Quad __sqrtq(_Quad);\n_Quad __truncq(_Quad);\n_Quad __expq(_Quad);\n_Quad __powq(_Quad, _Quad);\n_Quad __logq(_Quad);\n_Quad __log10q(_Quad);\n_Quad __sinq(_Quad);\n_Quad __cosq(_Quad);\n_Quad __tanq(_Quad);\n_Quad __asinq(_Quad);\n_Quad __acosq(_Quad);\n_Quad __atanq(_Quad);\n_Quad __sinhq(_Quad);\n_Quad __coshq(_Quad);\n_Quad __tanhq(_Quad);\n_Quad __fmodq(_Quad, _Quad);\n_Quad __atan2q(_Quad, _Quad);\n\n#define ldexpq __ldexpq\n#define frexpq __frexpq\n#define fabsq __fabsq\n#define floorq __floorq\n#define ceilq __ceilq\n#define sqrtq __sqrtq\n#define truncq __truncq\n#define expq __expq\n#define powq __powq\n#define logq __logq\n#define log10q __log10q\n#define sinq __sinq\n#define cosq __cosq\n#define tanq __tanq\n#define asinq __asinq\n#define acosq __acosq\n#define atanq __atanq\n#define sinhq __sinhq\n#define coshq __coshq\n#define tanhq __tanhq\n#define fmodq __fmodq\n#define atan2q __atan2q\n}\n\ninline _Quad isnanq(_Quad v)\n{\n   return v != v;\n}\ninline _Quad isinfq(_Quad v)\n{\n   return __fabsq(v) > 1.18973149535723176508575932662800702e4932Q;\n}\n\n#endif\n\nnamespace boost {\nnamespace multiprecision {\n\n#ifndef BOOST_MP_BITS_OF_FLOAT128_DEFINED\n\nnamespace detail {\n\ntemplate <>\nstruct bits_of<float128_type>\n{\n   static constexpr const unsigned value = 113;\n};\n\n}\n\n#endif\n\nnamespace backends {\n\nstruct float128_backend;\n\n}\n\nusing backends::float128_backend;\n\ntemplate <>\nstruct number_category<backends::float128_backend> : public std::integral_constant<int, number_kind_floating_point>\n{};\n#if defined(BOOST_MP_USE_QUAD)\ntemplate <>\nstruct number_category<float128_type> : public std::integral_constant<int, number_kind_floating_point>\n{};\n#endif\n\nusing float128 = number<float128_backend, et_off>;\n\nnamespace quad_constants {\nconstexpr float128_type quad_min = static_cast<float128_type>(1) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) / 1073741824;\n\nconstexpr float128_type quad_denorm_min = static_cast<float128_type>(1) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) * static_cast<float128_type>(DBL_MIN) / 5.5751862996326557854e+42;\n\nconstexpr double     dbl_mult = 8.9884656743115795386e+307;                                              // This has one bit set only.\nconstexpr float128_type quad_max = (static_cast<float128_type>(1) - 9.62964972193617926527988971292463659e-35) // This now has all bits sets to 1\n                                * static_cast<float128_type>(dbl_mult) * static_cast<float128_type>(dbl_mult) * static_cast<float128_type>(dbl_mult) * static_cast<float128_type>(dbl_mult) * static_cast<float128_type>(dbl_mult) * static_cast<float128_type>(dbl_mult) * static_cast<float128_type>(dbl_mult) * static_cast<float128_type>(dbl_mult) * static_cast<float128_type>(dbl_mult) * static_cast<float128_type>(dbl_mult) * static_cast<float128_type>(dbl_mult) * static_cast<float128_type>(dbl_mult) * static_cast<float128_type>(dbl_mult) * static_cast<float128_type>(dbl_mult) * static_cast<float128_type>(dbl_mult) * static_cast<float128_type>(dbl_mult) * 65536;\n} // namespace quad_constants\n\n#define BOOST_MP_QUAD_MIN boost::multiprecision::quad_constants::quad_min\n#define BOOST_MP_QUAD_DENORM_MIN boost::multiprecision::quad_constants::quad_denorm_min\n#define BOOST_MP_QUAD_MAX boost::multiprecision::quad_constants::quad_max\n\n\nnamespace backends {\n\nstruct float128_backend\n{\n   using signed_types = std::tuple<signed char, short, int, long, long long>;\n   using unsigned_types = std::tuple<unsigned char, unsigned short, unsigned int, unsigned long, unsigned long long>;\n   using float_types = std::tuple<float, double, long double>;\n   using exponent_type = int                                  ;\n\n private:\n   float128_type m_value;\n\n public:\n   constexpr   float128_backend() noexcept : m_value(0) {}\n   constexpr   float128_backend(const float128_backend& o) noexcept : m_value(o.m_value) {}\n   BOOST_MP_CXX14_CONSTEXPR float128_backend& operator=(const float128_backend& o) noexcept\n   {\n      m_value = o.m_value;\n      return *this;\n   }\n   template <class T>\n   constexpr float128_backend(const T& i, const typename std::enable_if<std::is_convertible<T, float128_type>::value>::type* = nullptr) noexcept(noexcept(std::declval<float128_type&>() = std::declval<const T&>()))\n       : m_value(i) {}\n   template <class T>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<T>::value || std::is_convertible<T, float128_type>::value, float128_backend&>::type operator=(const T& i) noexcept(noexcept(std::declval<float128_type&>() = std::declval<const T&>()))\n   {\n      m_value = i;\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR float128_backend(long double const& f) : m_value(f)\n   {\n      if (f > LDBL_MAX)\n         m_value = static_cast<float128_type>(HUGE_VAL);\n      else if (-f > LDBL_MAX)\n         m_value = -static_cast<float128_type>(HUGE_VAL);\n   }\n   BOOST_MP_CXX14_CONSTEXPR float128_backend& operator=(long double const& f)\n   {\n      if (f > LDBL_MAX)\n         m_value = static_cast<float128_type>(HUGE_VAL);\n      else if (-f > LDBL_MAX)\n         m_value = -static_cast<float128_type>(HUGE_VAL);\n      else\n         m_value = f;\n      return *this;\n   }\n   float128_backend& operator=(const char* s)\n   {\n#ifndef BOOST_MP_USE_QUAD\n      char* p_end;\n      m_value = strtoflt128(s, &p_end);\n      if (p_end - s != (std::ptrdiff_t)std::strlen(s))\n      {\n         BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Unable to interpret input string as a floating point value\"));\n      }\n#else\n      boost::multiprecision::detail::convert_from_string(*this, s);\n#endif\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR void swap(float128_backend& o) noexcept\n   {\n      // We don't call std::swap here because it's no constexpr (yet):\n      float128_type t(o.value());\n      o.value() = m_value;\n      m_value = t;\n   }\n   std::string str(std::streamsize digits, std::ios_base::fmtflags f) const\n   {\n#ifndef BOOST_MP_USE_QUAD\n      char        buf[128];\n      std::string format = \"%\";\n      if (f & std::ios_base::showpos)\n         format += \"+\";\n      if (f & std::ios_base::showpoint)\n         format += \"#\";\n      format += \".*\";\n      if ((digits == 0) && !(f & std::ios_base::fixed))\n         digits = 36;\n      format += \"Q\";\n\n      if (f & std::ios_base::scientific)\n         format += \"e\";\n      else if (f & std::ios_base::fixed)\n         format += \"f\";\n      else\n         format += \"g\";\n\n      int v;\n      if ((f & std::ios_base::scientific) && (f & std::ios_base::fixed))\n      {\n         v = quadmath_snprintf(buf, sizeof buf, \"%Qa\", m_value);\n      }\n      else\n      {\n         v = quadmath_snprintf(buf, sizeof buf, format.c_str(), digits, m_value);\n      }\n\n      if ((v < 0) || (v >= 127))\n      {\n         int                       v_max = v;\n         std::unique_ptr<char[]>   buf2;\n         buf2.reset(new char[v + 3]);\n         v = quadmath_snprintf(&buf2[0], v_max + 3, format.c_str(), digits, m_value);\n         if (v >= v_max + 3)\n         {\n            BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Formatting of float128_type failed.\"));\n         }\n         return &buf2[0];\n      }\n      return buf;\n#else\n      return boost::multiprecision::detail::convert_to_string(*this, digits ? digits : 36, f);\n#endif\n   }\n   BOOST_MP_CXX14_CONSTEXPR void negate() noexcept\n   {\n      m_value = -m_value;\n   }\n   BOOST_MP_CXX14_CONSTEXPR int compare(const float128_backend& o) const\n   {\n      return m_value == o.m_value ? 0 : m_value < o.m_value ? -1 : 1;\n   }\n   template <class T>\n   BOOST_MP_CXX14_CONSTEXPR int compare(const T& i) const\n   {\n      return m_value == i ? 0 : m_value < i ? -1 : 1;\n   }\n   BOOST_MP_CXX14_CONSTEXPR float128_type& value()\n   {\n      return m_value;\n   }\n   BOOST_MP_CXX14_CONSTEXPR const float128_type& value() const\n   {\n      return m_value;\n   }\n};\n\ninline BOOST_MP_CXX14_CONSTEXPR void eval_add(float128_backend& result, const float128_backend& a)\n{\n   result.value() += a.value();\n}\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_add(float128_backend& result, const A& a)\n{\n   result.value() += a;\n}\ninline BOOST_MP_CXX14_CONSTEXPR void eval_subtract(float128_backend& result, const float128_backend& a)\n{\n   result.value() -= a.value();\n}\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_subtract(float128_backend& result, const A& a)\n{\n   result.value() -= a;\n}\ninline BOOST_MP_CXX14_CONSTEXPR void eval_multiply(float128_backend& result, const float128_backend& a)\n{\n   result.value() *= a.value();\n}\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_multiply(float128_backend& result, const A& a)\n{\n   result.value() *= a;\n}\ninline BOOST_MP_CXX14_CONSTEXPR void eval_divide(float128_backend& result, const float128_backend& a)\n{\n   result.value() /= a.value();\n}\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_divide(float128_backend& result, const A& a)\n{\n   result.value() /= a;\n}\n\ninline BOOST_MP_CXX14_CONSTEXPR void eval_add(float128_backend& result, const float128_backend& a, const float128_backend& b)\n{\n   result.value() = a.value() + b.value();\n}\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_add(float128_backend& result, const float128_backend& a, const A& b)\n{\n   result.value() = a.value() + b;\n}\ninline BOOST_MP_CXX14_CONSTEXPR void eval_subtract(float128_backend& result, const float128_backend& a, const float128_backend& b)\n{\n   result.value() = a.value() - b.value();\n}\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_subtract(float128_backend& result, const float128_backend& a, const A& b)\n{\n   result.value() = a.value() - b;\n}\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_subtract(float128_backend& result, const A& a, const float128_backend& b)\n{\n   result.value() = a - b.value();\n}\ninline BOOST_MP_CXX14_CONSTEXPR void eval_multiply(float128_backend& result, const float128_backend& a, const float128_backend& b)\n{\n   result.value() = a.value() * b.value();\n}\ntemplate <class A>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_multiply(float128_backend& result, const float128_backend& a, const A& b)\n{\n   result.value() = a.value() * b;\n}\ninline BOOST_MP_CXX14_CONSTEXPR void eval_divide(float128_backend& result, const float128_backend& a, const float128_backend& b)\n{\n   result.value() = a.value() / b.value();\n}\n\ntemplate <class R>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_convert_to(R* result, const float128_backend& val)\n{\n   *result = static_cast<R>(val.value());\n}\n\ninline void eval_frexp(float128_backend& result, const float128_backend& arg, int* exp)\n{\n   result.value() = frexpq(arg.value(), exp);\n}\n\ninline void eval_ldexp(float128_backend& result, const float128_backend& arg, int exp)\n{\n   result.value() = ldexpq(arg.value(), exp);\n}\n\ninline void eval_floor(float128_backend& result, const float128_backend& arg)\n{\n   result.value() = floorq(arg.value());\n}\ninline void eval_ceil(float128_backend& result, const float128_backend& arg)\n{\n   result.value() = ceilq(arg.value());\n}\ninline void eval_sqrt(float128_backend& result, const float128_backend& arg)\n{\n   result.value() = sqrtq(arg.value());\n}\n\ninline void eval_rsqrt(float128_backend& result, const float128_backend& arg)\n{\n#if (LDBL_MANT_DIG > 100)\n   // GCC can't mix and match __float128 and quad precision long double\n   // error: __float128 and long double cannot be used in the same expression\n   result.value() = 1 / sqrtq(arg.value());\n#else\n   if (arg.value() < std::numeric_limits<long double>::denorm_min() || arg.value() > (std::numeric_limits<long double>::max)()) {\n      result.value() = 1/sqrtq(arg.value());\n      return;\n   }\n\n   using std::sqrt;\n   float128_backend xk = 1/sqrt(static_cast<long double>(arg.value()));\n\n   // Newton iteration for f(x) = arg.value() - 1/x^2.\n   BOOST_IF_CONSTEXPR (sizeof(long double) == sizeof(double)) {\n       // If the long double is the same as a double, then we need two Newton iterations:\n       xk.value() = xk.value() + xk.value()*(1-arg.value()*xk.value()*xk.value())/2;\n       result.value() = xk.value() + xk.value()*(1-arg.value()*xk.value()*xk.value())/2;\n   }\n   else\n   {\n      // 80 bit long double only needs a single iteration to produce ~2ULPs.\n      result.value() = xk.value() + xk.value() * (1 - arg.value() * xk.value() * xk.value()) / 2;\n   }\n#endif\n}\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\ninline BOOST_MP_CXX14_CONSTEXPR\n#else\ninline\n#endif\nint eval_fpclassify(const float128_backend& arg)\n{\n   float128_type v = arg.value();\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n   if (BOOST_MP_IS_CONST_EVALUATED(v))\n   {\n      if (v != v)\n         return FP_NAN;\n      if (v == 0)\n         return FP_ZERO;\n      float128_type t(v);\n      if (t < 0)\n         t = -t;\n      if (t > BOOST_MP_QUAD_MAX)\n         return FP_INFINITE;\n      if (t < BOOST_MP_QUAD_MIN)\n         return FP_SUBNORMAL;\n      return FP_NORMAL;\n   }\n   else\n#endif\n   {\n      if (isnanq(v))\n         return FP_NAN;\n      else if (isinfq(v))\n         return FP_INFINITE;\n      else if (v == 0)\n         return FP_ZERO;\n\n      float128_backend t(arg);\n      if (t.value() < 0)\n         t.negate();\n      if (t.value() < BOOST_MP_QUAD_MIN)\n         return FP_SUBNORMAL;\n      return FP_NORMAL;\n   }\n}\n#if defined(BOOST_GCC) && (__GNUC__ == 9)\n// See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91705\ninline BOOST_MP_CXX14_CONSTEXPR void eval_increment(float128_backend& arg)\n{\n   arg.value() = 1 + arg.value();\n}\ninline BOOST_MP_CXX14_CONSTEXPR void eval_decrement(float128_backend& arg)\n{\n   arg.value() = arg.value() - 1;\n}\n#else\ninline BOOST_MP_CXX14_CONSTEXPR void eval_increment(float128_backend& arg)\n{\n   ++arg.value();\n}\ninline BOOST_MP_CXX14_CONSTEXPR void eval_decrement(float128_backend& arg)\n{\n   --arg.value();\n}\n#endif\n\n/*********************************************************************\n*\n* abs/fabs:\n*\n*********************************************************************/\n\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\ninline BOOST_MP_CXX14_CONSTEXPR void eval_abs(float128_backend& result, const float128_backend& arg)\n#else\ninline void eval_abs(float128_backend& result, const float128_backend& arg)\n#endif\n{\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n   float128_type v(arg.value());\n   if (BOOST_MP_IS_CONST_EVALUATED(v))\n   {\n      result.value() = v < 0 ? -v : v;\n   }\n   else\n#endif\n   {\n      result.value() = fabsq(arg.value());\n   }\n}\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\ninline BOOST_MP_CXX14_CONSTEXPR void eval_fabs(float128_backend& result, const float128_backend& arg)\n#else\ninline void eval_fabs(float128_backend& result, const float128_backend& arg)\n#endif\n{\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n   float128_type v(arg.value());\n   if (BOOST_MP_IS_CONST_EVALUATED(v))\n   {\n      result.value() = v < 0 ? -v : v;\n   }\n   else\n#endif\n   {\n      result.value() = fabsq(arg.value());\n   }\n}\n\n/*********************************************************************\n*\n* Floating point functions:\n*\n*********************************************************************/\n\ninline void eval_trunc(float128_backend& result, const float128_backend& arg)\n{\n   result.value() = truncq(arg.value());\n}\n/*\n//\n// This doesn't actually work... rely on our own default version instead.\n//\ninline void eval_round(float128_backend& result, const float128_backend& arg)\n{\n   if(isnanq(arg.value()) || isinf(arg.value()))\n   {\n      result = boost::math::policies::raise_rounding_error(\n            \"boost::multiprecision::trunc<%1%>(%1%)\", nullptr,\n            number<float128_backend, et_off>(arg),\n            number<float128_backend, et_off>(arg),\n            boost::math::policies::policy<>()).backend();\n      return;\n   }\n   result.value() = roundq(arg.value());\n}\n*/\n\ninline void eval_exp(float128_backend& result, const float128_backend& arg)\n{\n   result.value() = expq(arg.value());\n}\ninline void eval_log(float128_backend& result, const float128_backend& arg)\n{\n   result.value() = logq(arg.value());\n}\ninline void eval_log10(float128_backend& result, const float128_backend& arg)\n{\n   result.value() = log10q(arg.value());\n}\ninline void eval_sin(float128_backend& result, const float128_backend& arg)\n{\n   result.value() = sinq(arg.value());\n}\ninline void eval_cos(float128_backend& result, const float128_backend& arg)\n{\n   result.value() = cosq(arg.value());\n}\ninline void eval_tan(float128_backend& result, const float128_backend& arg)\n{\n   result.value() = tanq(arg.value());\n}\ninline void eval_asin(float128_backend& result, const float128_backend& arg)\n{\n   result.value() = asinq(arg.value());\n}\ninline void eval_acos(float128_backend& result, const float128_backend& arg)\n{\n   result.value() = acosq(arg.value());\n}\ninline void eval_atan(float128_backend& result, const float128_backend& arg)\n{\n   result.value() = atanq(arg.value());\n}\ninline void eval_sinh(float128_backend& result, const float128_backend& arg)\n{\n   result.value() = sinhq(arg.value());\n}\ninline void eval_cosh(float128_backend& result, const float128_backend& arg)\n{\n   result.value() = coshq(arg.value());\n}\ninline void eval_tanh(float128_backend& result, const float128_backend& arg)\n{\n   result.value() = tanhq(arg.value());\n}\ninline void eval_fmod(float128_backend& result, const float128_backend& a, const float128_backend& b)\n{\n   result.value() = fmodq(a.value(), b.value());\n}\ninline void eval_pow(float128_backend& result, const float128_backend& a, const float128_backend& b)\n{\n   result.value() = powq(a.value(), b.value());\n}\ninline void eval_atan2(float128_backend& result, const float128_backend& a, const float128_backend& b)\n{\n   result.value() = atan2q(a.value(), b.value());\n}\n#ifndef BOOST_MP_USE_QUAD\ninline void eval_multiply_add(float128_backend& result, const float128_backend& a, const float128_backend& b, const float128_backend& c)\n{\n   result.value() = fmaq(a.value(), b.value(), c.value());\n}\ninline int eval_signbit BOOST_PREVENT_MACRO_SUBSTITUTION(const float128_backend& arg)\n{\n   return ::signbitq(arg.value());\n}\n#endif\n\ninline std::size_t hash_value(const float128_backend& val)\n{\n   return boost::multiprecision::detail::hash_value(static_cast<double>(val.value()));\n}\n\n} // namespace backends\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<float128_backend, ExpressionTemplates> asinh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<float128_backend, ExpressionTemplates>& arg)\n{\n   return asinhq(arg.backend().value());\n}\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<float128_backend, ExpressionTemplates> acosh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<float128_backend, ExpressionTemplates>& arg)\n{\n   return acoshq(arg.backend().value());\n}\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<float128_backend, ExpressionTemplates> atanh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<float128_backend, ExpressionTemplates>& arg)\n{\n   return atanhq(arg.backend().value());\n}\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<float128_backend, ExpressionTemplates> cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<float128_backend, ExpressionTemplates>& arg)\n{\n   return cbrtq(arg.backend().value());\n}\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<float128_backend, ExpressionTemplates> erf BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<float128_backend, ExpressionTemplates>& arg)\n{\n   return erfq(arg.backend().value());\n}\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<float128_backend, ExpressionTemplates> erfc BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<float128_backend, ExpressionTemplates>& arg)\n{\n   return erfcq(arg.backend().value());\n}\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<float128_backend, ExpressionTemplates> expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<float128_backend, ExpressionTemplates>& arg)\n{\n   return expm1q(arg.backend().value());\n}\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<float128_backend, ExpressionTemplates> lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<float128_backend, ExpressionTemplates>& arg)\n{\n   return lgammaq(arg.backend().value());\n}\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<float128_backend, ExpressionTemplates> tgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<float128_backend, ExpressionTemplates>& arg)\n{\n   if(eval_signbit(arg.backend()) != 0)\n   {\n      const bool result_is_neg = ((static_cast<unsigned long long>(floorq(-arg.backend().value())) % 2U) == 0U);\n\n      const boost::multiprecision::number<float128_backend, ExpressionTemplates> result_of_tgammaq = fabsq(tgammaq(arg.backend().value()));\n\n      return ((result_is_neg == false) ? result_of_tgammaq : -result_of_tgammaq);\n   }\n   else\n   {\n      return tgammaq(arg.backend().value());\n   }\n}\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<float128_backend, ExpressionTemplates> log1p BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<float128_backend, ExpressionTemplates>& arg)\n{\n   return log1pq(arg.backend().value());\n}\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<float128_backend, ExpressionTemplates> rsqrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<float128_backend, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::number<float128_backend, ExpressionTemplates> res;\n   eval_rsqrt(res.backend(), arg.backend());\n   return res;\n}\n\n#ifndef BOOST_MP_USE_QUAD\ntemplate <multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> copysign BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates>& a, const boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates>& b)\n{\n   return ::copysignq(a.backend().value(), b.backend().value());\n}\n\nnamespace backends {\n\ninline void eval_remainder(float128_backend& result, const float128_backend& a, const float128_backend& b)\n{\n   result.value() = remainderq(a.value(), b.value());\n}\ninline void eval_remainder(float128_backend& result, const float128_backend& a, const float128_backend& b, int* pi)\n{\n   result.value() = remquoq(a.value(), b.value(), pi);\n}\n} // namespace backends\n\n#endif\n\n} // namespace multiprecision\n\nnamespace math {\n\nusing boost::multiprecision::copysign;\nusing boost::multiprecision::signbit;\n\n} // namespace math\n\n} // namespace boost\n\n#ifndef BOOST_MP_STANDALONE\nnamespace boost {\nnamespace archive {\n\nclass binary_oarchive;\nclass binary_iarchive;\n\n} // namespace archive\n\nnamespace serialization {\nnamespace float128_detail {\n\ntemplate <class Archive>\nvoid do_serialize(Archive& ar, boost::multiprecision::backends::float128_backend& val, const std::integral_constant<bool, false>&, const std::integral_constant<bool, false>&)\n{\n   // saving\n   // non-binary\n   std::string s(val.str(0, std::ios_base::scientific));\n   ar&         boost::make_nvp(\"value\", s);\n}\ntemplate <class Archive>\nvoid do_serialize(Archive& ar, boost::multiprecision::backends::float128_backend& val, const std::integral_constant<bool, true>&, const std::integral_constant<bool, false>&)\n{\n   // loading\n   // non-binary\n   std::string s;\n   ar&         boost::make_nvp(\"value\", s);\n   val = s.c_str();\n}\n\ntemplate <class Archive>\nvoid do_serialize(Archive& ar, boost::multiprecision::backends::float128_backend& val, const std::integral_constant<bool, false>&, const std::integral_constant<bool, true>&)\n{\n   // saving\n   // binary\n   ar.save_binary(&val, sizeof(val));\n}\ntemplate <class Archive>\nvoid do_serialize(Archive& ar, boost::multiprecision::backends::float128_backend& val, const std::integral_constant<bool, true>&, const std::integral_constant<bool, true>&)\n{\n   // loading\n   // binary\n   ar.load_binary(&val, sizeof(val));\n}\n\n} // namespace float128_detail\n\ntemplate <class Archive>\nvoid serialize(Archive& ar, boost::multiprecision::backends::float128_backend& val, unsigned int /*version*/)\n{\n   using load_tag = typename Archive::is_loading                                                                                                                                         ;\n   using loading = std::integral_constant<bool, load_tag::value>                                                                                                                        ;\n   using binary_tag = typename std::integral_constant<bool, std::is_same<Archive, boost::archive::binary_oarchive>::value || std::is_same<Archive, boost::archive::binary_iarchive>::value>;\n\n   float128_detail::do_serialize(ar, val, loading(), binary_tag());\n}\n\n} // namespace serialization\n\n} // namespace boost\n#endif // BOOST_MP_STANDALONE\n\nnamespace std {\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nclass numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >\n{\n   using number_type = boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates>;\n\n public:\n   static constexpr bool is_specialized = true;\n   static BOOST_MP_CXX14_CONSTEXPR number_type(min)() noexcept { return BOOST_MP_QUAD_MIN; }\n   static BOOST_MP_CXX14_CONSTEXPR number_type(max)() noexcept { return BOOST_MP_QUAD_MAX; }\n   static BOOST_MP_CXX14_CONSTEXPR number_type          lowest() noexcept { return -(max)(); }\n   static constexpr int  digits       = 113;\n   static constexpr int  digits10     = 33;\n   static constexpr int  max_digits10 = 36;\n   static constexpr bool is_signed    = true;\n   static constexpr bool is_integer   = false;\n   static constexpr bool is_exact     = false;\n   static constexpr int  radix        = 2;\n   static BOOST_MP_CXX14_CONSTEXPR number_type          epsilon() { return 1.92592994438723585305597794258492732e-34; /* this double value has only one bit set and so is exact */ }\n   static BOOST_MP_CXX14_CONSTEXPR number_type          round_error() { return 0.5; }\n   static constexpr int  min_exponent                  = -16381;\n   static constexpr int  min_exponent10                = min_exponent * 301L / 1000L;\n   static constexpr int  max_exponent                  = 16384;\n   static constexpr int  max_exponent10                = max_exponent * 301L / 1000L;\n   static constexpr bool has_infinity                  = true;\n   static constexpr bool has_quiet_NaN                 = true;\n   static constexpr bool has_signaling_NaN             = false;\n   static constexpr float_denorm_style has_denorm      = denorm_present;\n   static constexpr bool               has_denorm_loss = true;\n   static BOOST_MP_CXX14_CONSTEXPR number_type                        infinity() { return HUGE_VAL; /* conversion from double infinity OK */ }\n   static BOOST_MP_CXX14_CONSTEXPR number_type                        quiet_NaN() { return number_type(NAN); }\n   static BOOST_MP_CXX14_CONSTEXPR number_type                        signaling_NaN() { return 0; }\n   static BOOST_MP_CXX14_CONSTEXPR number_type                        denorm_min() { return BOOST_MP_QUAD_DENORM_MIN; }\n   static constexpr bool               is_iec559       = true;\n   static constexpr bool               is_bounded      = true;\n   static constexpr bool               is_modulo       = false;\n   static constexpr bool               traps           = false;\n   static constexpr bool               tinyness_before = false;\n   static constexpr float_round_style round_style      = round_to_nearest;\n};\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::is_specialized;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::digits;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::digits10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::max_digits10;\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::is_signed;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::is_integer;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::is_exact;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::radix;\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::min_exponent;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::max_exponent;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::min_exponent10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::max_exponent10;\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::has_infinity;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::has_quiet_NaN;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::has_signaling_NaN;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::has_denorm_loss;\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::is_iec559;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::is_bounded;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::is_modulo;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::traps;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::tinyness_before;\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_round_style numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::round_style;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_denorm_style numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::has_denorm;\n\n} // namespace std\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/gmp.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock.\n//  Copyright 2021 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_GMP_HPP\n#define BOOST_MP_GMP_HPP\n\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/number.hpp>\n#include <boost/multiprecision/debug_adaptor.hpp>\n#include <boost/multiprecision/detail/integer_ops.hpp>\n#include <boost/multiprecision/detail/float128_functions.hpp>\n#include <boost/multiprecision/detail/digits.hpp>\n#include <boost/multiprecision/detail/atomic.hpp>\n#include <boost/multiprecision/detail/hash.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n#include <boost/multiprecision/detail/fpclassify.hpp>\n#include <algorithm>\n#include <cctype>\n#include <cfloat>\n#include <climits>\n#include <cmath>\n#include <cstdint>\n#include <cstdlib>\n#include <cstring>\n#include <iomanip>\n#include <iostream>\n#include <limits>\n#include <memory>\n#include <type_traits>\n#include <utility>\n\n//\n// Some includes we need from Boost.Math, since we rely on that library to provide these functions:\n//\n#ifdef BOOST_MP_MATH_AVAILABLE\n#include <boost/math/special_functions/asinh.hpp>\n#include <boost/math/special_functions/acosh.hpp>\n#include <boost/math/special_functions/atanh.hpp>\n#include <boost/math/special_functions/cbrt.hpp>\n#include <boost/math/special_functions/expm1.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#endif\n\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4127)\n#endif\n#include <gmp.h>\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#if defined(__MPIR_VERSION) && defined(__MPIR_VERSION_MINOR) && defined(__MPIR_VERSION_PATCHLEVEL)\n#define BOOST_MP_MPIR_VERSION (__MPIR_VERSION * 10000 + __MPIR_VERSION_MINOR * 100 + __MPIR_VERSION_PATCHLEVEL)\n#else\n#define BOOST_MP_MPIR_VERSION 0\n#endif\n\nnamespace boost {\nnamespace multiprecision {\nnamespace backends {\n\n#ifdef BOOST_MSVC\n// warning C4127: conditional expression is constant\n#pragma warning(push)\n//#pragma warning(disable : 4127)\n#endif\n\ntemplate <unsigned digits10>\nstruct gmp_float;\nstruct gmp_int;\nstruct gmp_rational;\n\n} // namespace backends\n\ntemplate <>\nstruct number_category<backends::gmp_int> : public std::integral_constant<int, number_kind_integer>\n{};\ntemplate <>\nstruct number_category<backends::gmp_rational> : public std::integral_constant<int, number_kind_rational>\n{};\ntemplate <unsigned digits10>\nstruct number_category<backends::gmp_float<digits10> > : public std::integral_constant<int, number_kind_floating_point>\n{};\n\nnamespace backends {\n//\n// Within this file, the only functions we mark as noexcept are those that manipulate\n// (but don't create) an mpf_t.  All other types may allocate at pretty much any time\n// via a user-supplied allocator, and therefore throw.\n//\nnamespace detail {\n\ntemplate <unsigned digits10>\nstruct gmp_float_imp\n{\n#ifdef BOOST_HAS_LONG_LONG\n   using signed_types = std::tuple<long, long long>          ;\n   using unsigned_types = std::tuple<unsigned long, unsigned long long>;\n#else\n   using signed_types = std::tuple<long>         ;\n   using unsigned_types = std::tuple<unsigned long>;\n#endif\n   using float_types = std::tuple<double, long double>;\n   using exponent_type = long                          ;\n\n   gmp_float_imp() noexcept\n   {\n      m_data[0]._mp_d = nullptr; // uninitialized m_data\n      m_data[0]._mp_prec = 1;\n   }\n\n   gmp_float_imp(const gmp_float_imp& o)\n   {\n      //\n      // We have to do an init followed by a set here, otherwise *this may be at\n      // a lower precision than o: seems like mpf_init_set copies just enough bits\n      // to get the right value, but if it's then used in further calculations\n      // things go badly wrong!!\n      //\n      mpf_init2(m_data, preserve_source_precision() ? mpf_get_prec(o.data()) : boost::multiprecision::detail::digits10_2_2(get_default_precision()));\n      if (o.m_data[0]._mp_d)\n         mpf_set(m_data, o.m_data);\n   }\n   // rvalue copy\n   gmp_float_imp(gmp_float_imp&& o) noexcept\n   {\n      if ((this->get_default_options() == variable_precision_options::preserve_target_precision) && (mpf_get_prec(o.data()) != boost::multiprecision::detail::digits10_2_2(get_default_precision())))\n      {\n         mpf_init2(m_data, boost::multiprecision::detail::digits10_2_2(get_default_precision()));\n         *this = static_cast<const gmp_float_imp&>(o);\n      }\n      else\n      {\n         m_data[0] = o.m_data[0];\n         o.m_data[0]._mp_d = nullptr;\n      }\n   }\n\n   gmp_float_imp& operator=(const gmp_float_imp& o)\n   {\n      if (m_data[0]._mp_d == nullptr)\n      {\n         mpf_init2(m_data, preserve_source_precision() ? mpf_get_prec(o.data()) : boost::multiprecision::detail::digits10_2_2(get_default_precision()));\n         mpf_set(m_data, o.m_data);\n      }\n      else if (preserve_source_precision() && (mpf_get_prec(data()) != mpf_get_prec(o.data())))\n      {\n         mpf_t t;\n         mpf_init2(t, mpf_get_prec(o.data()));\n         mpf_set(t, o.data());\n         mpf_swap(data(), t);\n         mpf_clear(t);\n      }\n      else\n      {\n         mpf_set(m_data, o.m_data);\n      }\n      return *this;\n   }\n   // rvalue assign\n   gmp_float_imp& operator=(gmp_float_imp&& o) noexcept\n   {\n      if ((this->get_default_options() == variable_precision_options::preserve_target_precision) && (mpf_get_prec(o.data()) != mpf_get_prec(data())))\n         *this = static_cast<const gmp_float_imp&>(o);\n      else\n      {\n         mpf_swap(m_data, o.m_data);\n      }\n      return *this;\n   }\n\n#ifdef BOOST_HAS_LONG_LONG\n#if defined(ULLONG_MAX) && (ULLONG_MAX == ULONG_MAX)\n   gmp_float_imp& operator=(unsigned long long i)\n   {\n      *this = static_cast<unsigned long>(i);\n      return *this;\n   }\n#else\n   gmp_float_imp& operator=(unsigned long long i)\n   {\n      if (m_data[0]._mp_d == nullptr)\n      {\n         mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      }\n      unsigned long long mask  = ((((1uLL << (std::numeric_limits<unsigned long>::digits - 1)) - 1) << 1) | 1uLL);\n      unsigned               shift = 0;\n      mpf_t                  t;\n      mpf_init2(t, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      mpf_set_ui(m_data, 0);\n      while (i)\n      {\n         mpf_set_ui(t, static_cast<unsigned long>(i & mask));\n         if (shift)\n            mpf_mul_2exp(t, t, shift);\n         mpf_add(m_data, m_data, t);\n         shift += std::numeric_limits<unsigned long>::digits;\n         i >>= std::numeric_limits<unsigned long>::digits;\n      }\n      mpf_clear(t);\n      return *this;\n   }\n#endif\n   gmp_float_imp& operator=(long long i)\n   {\n      if (m_data[0]._mp_d == nullptr)\n      {\n         mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      }\n      bool neg = i < 0;\n      *this    = static_cast<unsigned long long>(boost::multiprecision::detail::unsigned_abs(i));\n      if (neg)\n         mpf_neg(m_data, m_data);\n      return *this;\n   }\n#endif\n   gmp_float_imp& operator=(unsigned long i)\n   {\n      if (m_data[0]._mp_d == nullptr)\n      {\n         mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      }\n      mpf_set_ui(m_data, i);\n      return *this;\n   }\n   gmp_float_imp& operator=(long i)\n   {\n      if (m_data[0]._mp_d == nullptr)\n      {\n         mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      }\n      mpf_set_si(m_data, i);\n      return *this;\n   }\n#ifdef BOOST_HAS_INT128\n   gmp_float_imp& operator=(uint128_type i)\n   {\n      if (m_data[0]._mp_d == nullptr)\n      {\n         mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      }\n      unsigned long      mask  = ((((1uLL << (std::numeric_limits<unsigned long>::digits - 1)) - 1) << 1) | 1uLL);\n      unsigned           shift = 0;\n      mpf_t              t;\n      mpf_init2(t, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      mpf_set_ui(m_data, 0);\n      while (i)\n      {\n         mpf_set_ui(t, static_cast<unsigned long>(i & mask));\n         if (shift)\n            mpf_mul_2exp(t, t, shift);\n         mpf_add(m_data, m_data, t);\n         shift += std::numeric_limits<unsigned long>::digits;\n         i >>= std::numeric_limits<unsigned long>::digits;\n      }\n      mpf_clear(t);\n      return *this;\n   }\n   gmp_float_imp& operator=(int128_type i)\n   {\n      if (m_data[0]._mp_d == nullptr)\n      {\n         mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      }\n      bool neg = i < 0;\n      *this    = static_cast<uint128_type>(boost::multiprecision::detail::unsigned_abs(i));\n      if (neg)\n         mpf_neg(m_data, m_data);\n      return *this;\n   }\n#endif\n   gmp_float_imp& operator=(double d)\n   {\n      if (m_data[0]._mp_d == nullptr)\n      {\n         mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      }\n      mpf_set_d(m_data, d);\n      return *this;\n   }\n   template <class F>\n   gmp_float_imp& assign_float(F a)\n   {\n      BOOST_MP_FLOAT128_USING using std::floor; using std::frexp; using std::ldexp;\n\n      if (m_data[0]._mp_d == nullptr)\n      {\n         mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      }\n\n      if (a == 0)\n      {\n         mpf_set_si(m_data, 0);\n         return *this;\n      }\n\n      if (a == 1)\n      {\n         mpf_set_si(m_data, 1);\n         return *this;\n      }\n\n      BOOST_MP_ASSERT(!BOOST_MP_ISINF(a));\n      BOOST_MP_ASSERT(!BOOST_MP_ISNAN(a));\n\n      int         e;\n      F f, term;\n      mpf_set_ui(m_data, 0u);\n\n      f = frexp(a, &e);\n\n      constexpr int shift = std::numeric_limits<int>::digits - 1;\n\n      while (f)\n      {\n         // extract int sized bits from f:\n         f    = ldexp(f, shift);\n         term = floor(f);\n         e -= shift;\n         mpf_mul_2exp(m_data, m_data, shift);\n         if (term > 0)\n            mpf_add_ui(m_data, m_data, static_cast<unsigned>(term));\n         else\n            mpf_sub_ui(m_data, m_data, static_cast<unsigned>(-term));\n         f -= term;\n      }\n      if (e > 0)\n         mpf_mul_2exp(m_data, m_data, e);\n      else if (e < 0)\n         mpf_div_2exp(m_data, m_data, -e);\n      return *this;\n   }\n   gmp_float_imp& operator=(long double a)\n   {\n      return assign_float(a);\n   }\n#ifdef BOOST_HAS_FLOAT128\n   gmp_float_imp& operator= (float128_type a)\n   {\n      return assign_float(a);\n   }\n#endif\n   gmp_float_imp& operator=(const char* s)\n   {\n      if (m_data[0]._mp_d == nullptr)\n      {\n         mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      }\n      if (s && (*s == '+'))\n         ++s;  // Leading \"+\" sign not supported by mpf_set_str:\n      if (0 != mpf_set_str(m_data, s, 10))\n         BOOST_MP_THROW_EXCEPTION(std::runtime_error(std::string(\"The string \\\"\") + s + std::string(\"\\\"could not be interpreted as a valid floating point number.\")));\n      return *this;\n   }\n   void swap(gmp_float_imp& o) noexcept\n   {\n      mpf_swap(m_data, o.m_data);\n   }\n   std::string str(std::streamsize digits, std::ios_base::fmtflags f) const\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_d);\n\n      bool            scientific = (f & std::ios_base::scientific) == std::ios_base::scientific;\n      bool            fixed      = (f & std::ios_base::fixed) == std::ios_base::fixed;\n      std::streamsize org_digits(digits);\n\n      if (scientific && digits)\n         ++digits;\n\n      std::string result;\n      mp_exp_t    e;\n      void* (*alloc_func_ptr)(size_t);\n      void* (*realloc_func_ptr)(void*, size_t, size_t);\n      void (*free_func_ptr)(void*, size_t);\n      mp_get_memory_functions(&alloc_func_ptr, &realloc_func_ptr, &free_func_ptr);\n\n      if (mpf_sgn(m_data) == 0)\n      {\n         e      = 0;\n         result = \"0\";\n         if (fixed && digits)\n            ++digits;\n      }\n      else\n      {\n         char* ps = mpf_get_str(nullptr, &e, 10, static_cast<std::size_t>(digits), m_data);\n         --e; // To match with what our formatter expects.\n         if (fixed)\n         {\n            // Oops we actually need a different number of digits to what we asked for:\n            (*free_func_ptr)((void*)ps, std::strlen(ps) + 1);\n            digits += e + 1;\n            if (digits == 0)\n            {\n               // We need to get *all* the digits and then possibly round up,\n               // we end up with either \"0\" or \"1\" as the result.\n               ps = mpf_get_str(nullptr, &e, 10, 0, m_data);\n               --e;\n               unsigned offset = *ps == '-' ? 1 : 0;\n               if (ps[offset] > '5')\n               {\n                  ++e;\n                  ps[offset]     = '1';\n                  ps[offset + 1] = 0;\n               }\n               else if (ps[offset] == '5')\n               {\n                  unsigned i        = offset + 1;\n                  bool     round_up = false;\n                  while (ps[i] != 0)\n                  {\n                     if (ps[i] != '0')\n                     {\n                        round_up = true;\n                        break;\n                     }\n                     ++i;\n                  }\n                  if (round_up)\n                  {\n                     ++e;\n                     ps[offset]     = '1';\n                     ps[offset + 1] = 0;\n                  }\n                  else\n                  {\n                     ps[offset]     = '0';\n                     ps[offset + 1] = 0;\n                  }\n               }\n               else\n               {\n                  ps[offset]     = '0';\n                  ps[offset + 1] = 0;\n               }\n            }\n            else if (digits > 0)\n            {\n               mp_exp_t old_e = e;\n               ps             = mpf_get_str(nullptr, &e, 10, static_cast<std::size_t>(digits), m_data);\n               --e; // To match with what our formatter expects.\n               if (old_e > e)\n               {\n                  // in some cases, when we ask for more digits of precision, it will\n                  // change the number of digits to the left of the decimal, if that\n                  // happens, account for it here.\n                  // example: cout << fixed << setprecision(3) << mpf_float_50(\"99.9809\")\n                  digits -= old_e - e;\n                  (*free_func_ptr)((void*)ps, std::strlen(ps) + 1);\n                  ps = mpf_get_str(nullptr, &e, 10, static_cast<std::size_t>(digits), m_data);\n                  --e; // To match with what our formatter expects.\n               }\n            }\n            else\n            {\n               ps = mpf_get_str(nullptr, &e, 10, 1, m_data);\n               --e;\n               unsigned offset = *ps == '-' ? 1 : 0;\n               ps[offset]      = '0';\n               ps[offset + 1]  = 0;\n            }\n         }\n         result = ps;\n         (*free_func_ptr)((void*)ps, std::strlen(ps) + 1);\n      }\n      boost::multiprecision::detail::format_float_string(result, e, org_digits, f, mpf_sgn(m_data) == 0);\n      return result;\n   }\n   ~gmp_float_imp() noexcept\n   {\n      if (m_data[0]._mp_d)\n      {\n         mpf_clear(m_data);\n      }\n   }\n   void negate() noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_d);\n      mpf_neg(m_data, m_data);\n   }\n   int compare(const gmp_float<digits10>& o) const noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_d && o.m_data[0]._mp_d);\n      return mpf_cmp(m_data, o.m_data);\n   }\n   int compare(long i) const noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_d);\n      return mpf_cmp_si(m_data, i);\n   }\n   int compare(unsigned long i) const noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_d);\n      return mpf_cmp_ui(m_data, i);\n   }\n   template <class V>\n   typename std::enable_if<boost::multiprecision::detail::is_arithmetic<V>::value, int>::type compare(V v) const\n   {\n      gmp_float<digits10> d;\n      d = v;\n      return compare(d);\n   }\n   mpf_t& data() noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_d);\n      return m_data;\n   }\n   const mpf_t& data() const noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_d);\n      return m_data;\n   }\n\n protected:\n   mpf_t            m_data;\n   static unsigned& get_default_precision() noexcept\n   {\n      static BOOST_MP_THREAD_LOCAL unsigned val(get_global_default_precision());\n      return val;\n   }\n   static boost::multiprecision::detail::precision_type& get_global_default_precision() noexcept\n   {\n      static boost::multiprecision::detail::precision_type val(50);\n      return val;\n   }\n#ifndef BOOST_MT_NO_ATOMIC_INT\n   static std::atomic<variable_precision_options>& get_global_default_options() noexcept\n#else\n   static variable_precision_options& get_global_default_options() noexcept\n#endif\n   {\n#ifndef BOOST_MT_NO_ATOMIC_INT\n      static std::atomic<variable_precision_options> val{variable_precision_options::preserve_related_precision};\n#else\n      static variable_precision_options val{variable_precision_options::preserve_related_precision};\n#endif\n      return val;\n   }\n   static variable_precision_options& get_default_options()noexcept\n   {\n      static BOOST_MP_THREAD_LOCAL variable_precision_options val(get_global_default_options());\n      return val;\n   }\n   static bool preserve_source_precision() noexcept\n   {\n      return get_default_options() >= variable_precision_options::preserve_source_precision;\n   }\n};\n\nclass gmp_char_ptr\n{\nprivate:\n   char* ptr_val;\n   void* (*alloc_func_ptr)(size_t);\n   void* (*realloc_func_ptr)(void*, size_t, size_t);\n   void  (*free_func_ptr)(void*, size_t);\n\npublic:\n   gmp_char_ptr() = delete;\n   explicit gmp_char_ptr(char* val_) : ptr_val {val_}\n   {\n      mp_get_memory_functions(&alloc_func_ptr, &realloc_func_ptr, &free_func_ptr);\n   }\n   ~gmp_char_ptr() noexcept\n   {\n      (*free_func_ptr)((void*)ptr_val, sizeof(*ptr_val));\n      ptr_val = nullptr;\n   }\n   inline char* get() noexcept { return ptr_val; }\n};\n\n} // namespace detail\n\nstruct gmp_int;\nstruct gmp_rational;\n\ntemplate <unsigned digits10>\nstruct gmp_float : public detail::gmp_float_imp<digits10>\n{\n   gmp_float()\n   {\n      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));\n   }\n   gmp_float(const gmp_float& o) : detail::gmp_float_imp<digits10>(o) {}\n   template <unsigned D>\n   gmp_float(const gmp_float<D>& o, typename std::enable_if<D <= digits10>::type* = nullptr);\n   template <unsigned D>\n   explicit gmp_float(const gmp_float<D>& o, typename std::enable_if<!(D <= digits10)>::type* = nullptr);\n   gmp_float(const gmp_int& o);\n   gmp_float(const gmp_rational& o);\n   gmp_float(const mpf_t val)\n   {\n      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));\n      mpf_set(this->m_data, val);\n   }\n   gmp_float(const mpz_t val)\n   {\n      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));\n      mpf_set_z(this->m_data, val);\n   }\n   gmp_float(const mpq_t val)\n   {\n      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));\n      mpf_set_q(this->m_data, val);\n   }\n   // rvalue copy\n   gmp_float(gmp_float&& o) noexcept : detail::gmp_float_imp<digits10>(static_cast<detail::gmp_float_imp<digits10>&&>(o))\n   {}\n   gmp_float& operator=(const gmp_float& o)\n   {\n      *static_cast<detail::gmp_float_imp<digits10>*>(this) = static_cast<detail::gmp_float_imp<digits10> const&>(o);\n      return *this;\n   }\n   gmp_float& operator=(gmp_float&& o) noexcept\n   {\n      *static_cast<detail::gmp_float_imp<digits10>*>(this) = static_cast<detail::gmp_float_imp<digits10>&&>(o);\n      return *this;\n   }\n   template <unsigned D>\n   gmp_float& operator=(const gmp_float<D>& o);\n   gmp_float& operator=(const gmp_int& o);\n   gmp_float& operator=(const gmp_rational& o);\n   gmp_float& operator=(const mpf_t val)\n   {\n      if (this->m_data[0]._mp_d == nullptr)\n         mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));\n      mpf_set(this->m_data, val);\n      return *this;\n   }\n   gmp_float& operator=(const mpz_t val)\n   {\n      if (this->m_data[0]._mp_d == nullptr)\n         mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));\n      mpf_set_z(this->m_data, val);\n      return *this;\n   }\n   gmp_float& operator=(const mpq_t val)\n   {\n      if (this->m_data[0]._mp_d == nullptr)\n         mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));\n      mpf_set_q(this->m_data, val);\n      return *this;\n   }\n   template <class V>\n   typename std::enable_if<std::is_assignable<detail::gmp_float_imp<digits10>, V>::value, gmp_float&>::type operator=(const V& v)\n   {\n      *static_cast<detail::gmp_float_imp<digits10>*>(this) = v;\n      return *this;\n   }\n};\n\ntemplate <>\nstruct gmp_float<0> : public detail::gmp_float_imp<0>\n{\n   //\n   // We have a problem with mpf_t in that the precision we request isn't what we get.\n   // As a result the front end can end up chasing it's tail trying to create a variable\n   // with the the correct precision to hold the result of an expression.\n   // See: https://github.com/boostorg/multiprecision/issues/164\n   // The problem is made worse by the fact that our conversions from base10 to 2 and\n   // vice-versa do not exactly round trip (and probably never will).\n   // The workaround is to keep track of the precision requested, and always return\n   // that as the current actual precision.\n   //\n private:\n   unsigned requested_precision;\n\n public:\n   gmp_float() : requested_precision(get_default_precision())\n   {\n      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));\n   }\n   gmp_float(const mpf_t val) : requested_precision(get_default_precision())\n   {\n      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));\n      mpf_set(this->m_data, val);\n   }\n   gmp_float(const mpz_t val) : requested_precision(get_default_precision())\n   {\n      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));\n      mpf_set_z(this->m_data, val);\n   }\n   gmp_float(const mpq_t val) : requested_precision(get_default_precision())\n   {\n      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));\n      mpf_set_q(this->m_data, val);\n   }\n   gmp_float(const gmp_float& o) : detail::gmp_float_imp<0>(o), requested_precision(preserve_source_precision() ? o.requested_precision : get_default_precision()) {}\n   template <unsigned D>\n   gmp_float(const gmp_float<D>& o)\n   {\n      mpf_init2(this->m_data, preserve_related_precision() ? mpf_get_prec(o.data()) : multiprecision::detail::digits10_2_2(get_default_precision()));\n      mpf_set(this->m_data, o.data());\n      requested_precision = preserve_related_precision() ? D : get_default_precision();\n   }\n   // rvalue copy\n   gmp_float(gmp_float&& o) noexcept : detail::gmp_float_imp<0>(static_cast<detail::gmp_float_imp<0>&&>(o)), requested_precision((this->get_default_options() != variable_precision_options::preserve_target_precision) ? o.requested_precision : get_default_precision())\n   {}\n   gmp_float(const gmp_int& o);\n   gmp_float(const gmp_rational& o);\n   gmp_float(const gmp_float& o, unsigned digits10) : requested_precision(digits10)\n   {\n      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));\n      mpf_set(this->m_data, o.data());\n   }\n   template <class V>\n   gmp_float(const V& o, unsigned digits10) : requested_precision(digits10)\n   {\n      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));\n      *this = o;\n   }\n\n#ifndef BOOST_NO_CXX17_HDR_STRING_VIEW\n   //\n   // Support for new types in C++17\n   //\n   template <class Traits>\n   gmp_float(const std::basic_string_view<char, Traits>& o, unsigned digits10) : requested_precision(digits10)\n   {\n      using default_ops::assign_from_string_view;\n      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));\n      assign_from_string_view(*this, o);\n   }\n#endif\n   gmp_float& operator=(const gmp_float& o)\n   {\n      *static_cast<detail::gmp_float_imp<0>*>(this) = static_cast<detail::gmp_float_imp<0> const&>(o);\n      if(preserve_source_precision())\n         requested_precision = o.requested_precision;\n      return *this;\n   }\n   // rvalue copy\n   gmp_float& operator=(gmp_float&& o) noexcept\n   {\n      *static_cast<detail::gmp_float_imp<0>*>(this) = static_cast<detail::gmp_float_imp<0>&&>(o);\n      if ((this->get_default_options() != variable_precision_options::preserve_target_precision))\n         requested_precision = o.requested_precision;\n      return *this;\n   }\n   template <unsigned D>\n   gmp_float& operator=(const gmp_float<D>& o)\n   {\n      if (this->m_data[0]._mp_d == nullptr)\n      {\n         mpf_init2(this->m_data, preserve_related_precision() ? mpf_get_prec(o.data()) : multiprecision::detail::digits10_2_2(get_default_precision()));\n      }\n      else if(preserve_related_precision())\n      {\n         mpf_set_prec(this->m_data, mpf_get_prec(o.data()));\n      }\n      mpf_set(this->m_data, o.data());\n      if (preserve_related_precision())\n         requested_precision = D;\n      return *this;\n   }\n   gmp_float& operator=(const gmp_int& o);\n   gmp_float& operator=(const gmp_rational& o);\n   gmp_float& operator=(const mpf_t val)\n   {\n      if (this->m_data[0]._mp_d == nullptr)\n      {\n         requested_precision = get_default_precision();\n         mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));\n      }\n      mpf_set(this->m_data, val);\n      return *this;\n   }\n   gmp_float& operator=(const mpz_t val)\n   {\n      if (this->m_data[0]._mp_d == nullptr)\n      {\n         requested_precision = get_default_precision();\n         mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));\n      }\n      mpf_set_z(this->m_data, val);\n      return *this;\n   }\n   gmp_float& operator=(const mpq_t val)\n   {\n      if (this->m_data[0]._mp_d == nullptr)\n      {\n         requested_precision = get_default_precision();\n         mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));\n      }\n      mpf_set_q(this->m_data, val);\n      return *this;\n   }\n   template <class V>\n   typename std::enable_if<std::is_assignable<detail::gmp_float_imp<0>, V>::value, gmp_float&>::type operator=(const V& v)\n   {\n      constexpr unsigned d10 = std::is_floating_point<V>::value ?\n         std::numeric_limits<V>::digits10 :\n         std::numeric_limits<V>::digits10 ? 1 + std::numeric_limits<V>::digits10 :\n         1 + boost::multiprecision::detail::digits2_2_10(std::numeric_limits<V>::digits);\n      if((thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision) && (precision() < d10))\n         this->precision(d10);\n      *static_cast<detail::gmp_float_imp<0>*>(this) = v;\n      return *this;\n   }\n   static unsigned default_precision() noexcept\n   {\n      return get_global_default_precision();\n   }\n   static void default_precision(unsigned v) noexcept\n   {\n      get_global_default_precision() = v;\n   }\n   static unsigned thread_default_precision() noexcept\n   {\n      return get_default_precision();\n   }\n   static void thread_default_precision(unsigned v) noexcept\n   {\n      get_default_precision() = v;\n   }\n   unsigned precision() const noexcept\n   {\n      return requested_precision;\n   }\n   void precision(unsigned digits10) noexcept\n   {\n      requested_precision = digits10;\n      mpf_set_prec(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));\n   }\n   //\n   // Variable precision options:\n   //\n   static variable_precision_options default_variable_precision_options()noexcept\n   {\n      return get_global_default_options();\n   }\n   static variable_precision_options thread_default_variable_precision_options()noexcept\n   {\n      return get_default_options();\n   }\n   static void default_variable_precision_options(variable_precision_options opts)\n   {\n      get_global_default_options() = opts;\n   }\n   static void thread_default_variable_precision_options(variable_precision_options opts)\n   {\n      get_default_options() = opts;\n   }\n   static bool preserve_source_precision()\n   {\n      return get_default_options() >= variable_precision_options::preserve_source_precision;\n   }\n   static bool preserve_related_precision()\n   {\n      return get_default_options() >= variable_precision_options::preserve_related_precision;\n   }\n   static bool preserve_all_precision()\n   {\n      return get_default_options() >= variable_precision_options::preserve_all_precision;\n   }\n   //\n   // swap:\n   //\n   void swap(gmp_float& o)\n   {\n      std::swap(requested_precision, o.requested_precision);\n      gmp_float_imp<0>::swap(o);\n   }\n};\n\ntemplate <unsigned digits10, class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_arithmetic<T>::value, bool>::type eval_eq(const gmp_float<digits10>& a, const T& b) noexcept\n{\n   return a.compare(b) == 0;\n}\ntemplate <unsigned digits10, class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_arithmetic<T>::value, bool>::type eval_lt(const gmp_float<digits10>& a, const T& b) noexcept\n{\n   return a.compare(b) < 0;\n}\ntemplate <unsigned digits10, class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_arithmetic<T>::value, bool>::type eval_gt(const gmp_float<digits10>& a, const T& b) noexcept\n{\n   return a.compare(b) > 0;\n}\n\ntemplate <unsigned D1, unsigned D2>\ninline void eval_add(gmp_float<D1>& result, const gmp_float<D2>& o)\n{\n   mpf_add(result.data(), result.data(), o.data());\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_subtract(gmp_float<D1>& result, const gmp_float<D2>& o)\n{\n   mpf_sub(result.data(), result.data(), o.data());\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_multiply(gmp_float<D1>& result, const gmp_float<D2>& o)\n{\n   mpf_mul(result.data(), result.data(), o.data());\n}\ntemplate <unsigned digits10>\ninline bool eval_is_zero(const gmp_float<digits10>& val) noexcept\n{\n   return mpf_sgn(val.data()) == 0;\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_divide(gmp_float<D1>& result, const gmp_float<D2>& o)\n{\n   if (eval_is_zero(o))\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n   mpf_div(result.data(), result.data(), o.data());\n}\ntemplate <unsigned digits10>\ninline void eval_add(gmp_float<digits10>& result, unsigned long i)\n{\n   mpf_add_ui(result.data(), result.data(), i);\n}\ntemplate <unsigned digits10>\ninline void eval_subtract(gmp_float<digits10>& result, unsigned long i)\n{\n   mpf_sub_ui(result.data(), result.data(), i);\n}\ntemplate <unsigned digits10>\ninline void eval_multiply(gmp_float<digits10>& result, unsigned long i)\n{\n   mpf_mul_ui(result.data(), result.data(), i);\n}\ntemplate <unsigned digits10>\ninline void eval_divide(gmp_float<digits10>& result, unsigned long i)\n{\n   if (i == 0)\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n   mpf_div_ui(result.data(), result.data(), i);\n}\ntemplate <unsigned digits10>\ninline void eval_add(gmp_float<digits10>& result, long i)\n{\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   if (i > 0)\n      mpf_add_ui(result.data(), result.data(), static_cast<local_uint_type>(i));\n   else if (i < 0)\n      mpf_sub_ui(result.data(), result.data(), static_cast<local_uint_type>(-i));\n}\ntemplate <unsigned digits10>\ninline void eval_subtract(gmp_float<digits10>& result, long i)\n{\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   if (i > 0)\n      mpf_sub_ui(result.data(), result.data(), static_cast<local_uint_type>(i));\n   else if (i < 0)\n      mpf_add_ui(result.data(), result.data(), static_cast<local_uint_type>(-i));\n}\ntemplate <unsigned digits10>\ninline void eval_multiply(gmp_float<digits10>& result, long i)\n{\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   mpf_mul_ui(result.data(), result.data(), static_cast<local_uint_type>(boost::multiprecision::detail::unsigned_abs(i)));\n\n   if (i < 0)\n      mpf_neg(result.data(), result.data());\n}\ntemplate <unsigned digits10>\ninline void eval_divide(gmp_float<digits10>& result, long i)\n{\n   if (i == 0)\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   mpf_div_ui(result.data(), result.data(), static_cast<local_uint_type>(boost::multiprecision::detail::unsigned_abs(i)));\n\n   if (i < 0)\n      mpf_neg(result.data(), result.data());\n}\n//\n// Specialised 3 arg versions of the basic operators:\n//\ntemplate <unsigned D1, unsigned D2, unsigned D3>\ninline void eval_add(gmp_float<D1>& a, const gmp_float<D2>& x, const gmp_float<D3>& y)\n{\n   mpf_add(a.data(), x.data(), y.data());\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_add(gmp_float<D1>& a, const gmp_float<D2>& x, unsigned long y)\n{\n   mpf_add_ui(a.data(), x.data(), y);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_add(gmp_float<D1>& a, const gmp_float<D2>& x, long y)\n{\n   if (y < 0)\n      mpf_sub_ui(a.data(), x.data(), boost::multiprecision::detail::unsigned_abs(y));\n   else\n      mpf_add_ui(a.data(), x.data(), y);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_add(gmp_float<D1>& a, unsigned long x, const gmp_float<D2>& y)\n{\n   mpf_add_ui(a.data(), y.data(), x);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_add(gmp_float<D1>& a, long x, const gmp_float<D2>& y)\n{\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   if (x < 0)\n   {\n      mpf_ui_sub(a.data(), static_cast<local_uint_type>(-x), y.data());\n      mpf_neg(a.data(), a.data());\n   }\n   else\n      mpf_add_ui(a.data(), y.data(), static_cast<local_uint_type>(x));\n}\ntemplate <unsigned D1, unsigned D2, unsigned D3>\ninline void eval_subtract(gmp_float<D1>& a, const gmp_float<D2>& x, const gmp_float<D3>& y)\n{\n   mpf_sub(a.data(), x.data(), y.data());\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_subtract(gmp_float<D1>& a, const gmp_float<D2>& x, unsigned long y)\n{\n   mpf_sub_ui(a.data(), x.data(), y);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_subtract(gmp_float<D1>& a, const gmp_float<D2>& x, long y)\n{\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   if (y < 0)\n      mpf_add_ui(a.data(), x.data(), static_cast<local_uint_type>(-y));\n   else\n      mpf_sub_ui(a.data(), x.data(), static_cast<local_uint_type>(y));\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_subtract(gmp_float<D1>& a, unsigned long x, const gmp_float<D2>& y)\n{\n   mpf_ui_sub(a.data(), x, y.data());\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_subtract(gmp_float<D1>& a, long x, const gmp_float<D2>& y)\n{\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   if (x < 0)\n   {\n      mpf_add_ui(a.data(), y.data(), static_cast<local_uint_type>(-x));\n      mpf_neg(a.data(), a.data());\n   }\n   else\n      mpf_ui_sub(a.data(), static_cast<local_uint_type>(x), y.data());\n}\n\ntemplate <unsigned D1, unsigned D2, unsigned D3>\ninline void eval_multiply(gmp_float<D1>& a, const gmp_float<D2>& x, const gmp_float<D3>& y)\n{\n   mpf_mul(a.data(), x.data(), y.data());\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_multiply(gmp_float<D1>& a, const gmp_float<D2>& x, unsigned long y)\n{\n   mpf_mul_ui(a.data(), x.data(), y);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_multiply(gmp_float<D1>& a, const gmp_float<D2>& x, long y)\n{\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   if (y < 0)\n   {\n      mpf_mul_ui(a.data(), x.data(), static_cast<local_uint_type>(-y));\n      a.negate();\n   }\n   else\n      mpf_mul_ui(a.data(), x.data(), static_cast<local_uint_type>(y));\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_multiply(gmp_float<D1>& a, unsigned long x, const gmp_float<D2>& y)\n{\n   mpf_mul_ui(a.data(), y.data(), x);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_multiply(gmp_float<D1>& a, long x, const gmp_float<D2>& y)\n{\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   if (x < 0)\n   {\n      mpf_mul_ui(a.data(), y.data(), static_cast<local_uint_type>(-x));\n      mpf_neg(a.data(), a.data());\n   }\n   else\n      mpf_mul_ui(a.data(), y.data(), static_cast<local_uint_type>(x));\n}\n\ntemplate <unsigned D1, unsigned D2, unsigned D3>\ninline void eval_divide(gmp_float<D1>& a, const gmp_float<D2>& x, const gmp_float<D3>& y)\n{\n   if (eval_is_zero(y))\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n   mpf_div(a.data(), x.data(), y.data());\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_divide(gmp_float<D1>& a, const gmp_float<D2>& x, unsigned long y)\n{\n   if (y == 0)\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n   mpf_div_ui(a.data(), x.data(), y);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_divide(gmp_float<D1>& a, const gmp_float<D2>& x, long y)\n{\n   if (y == 0)\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   if (y < 0)\n   {\n      mpf_div_ui(a.data(), x.data(), static_cast<local_uint_type>(-y));\n      a.negate();\n   }\n   else\n      mpf_div_ui(a.data(), x.data(), static_cast<local_uint_type>(y));\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_divide(gmp_float<D1>& a, unsigned long x, const gmp_float<D2>& y)\n{\n   if (eval_is_zero(y))\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n   mpf_ui_div(a.data(), x, y.data());\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_divide(gmp_float<D1>& a, long x, const gmp_float<D2>& y)\n{\n   if (eval_is_zero(y))\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n   if (x < 0)\n   {\n      mpf_ui_div(a.data(), boost::multiprecision::detail::unsigned_abs(x), y.data());\n      mpf_neg(a.data(), a.data());\n   }\n   else\n   {\n      using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n      mpf_ui_div(a.data(), static_cast<local_uint_type>(x), y.data());\n   }\n}\n\ntemplate <unsigned digits10>\ninline int eval_get_sign(const gmp_float<digits10>& val) noexcept\n{\n   return mpf_sgn(val.data());\n}\n\ntemplate <unsigned digits10>\ninline void eval_convert_to(unsigned long* result, const gmp_float<digits10>& val) noexcept\n{\n   if (0 == mpf_fits_ulong_p(val.data()))\n      *result = (std::numeric_limits<unsigned long>::max)();\n   else\n      *result = static_cast<unsigned long>(mpf_get_ui(val.data()));\n}\ntemplate <unsigned digits10>\ninline void eval_convert_to(long* result, const gmp_float<digits10>& val) noexcept\n{\n   if (0 == mpf_fits_slong_p(val.data()))\n   {\n      *result = (std::numeric_limits<long>::max)();\n      *result *= mpf_sgn(val.data());\n   }\n   else\n      *result = static_cast<long>(mpf_get_si(val.data()));\n}\n#ifdef BOOST_MP_STANDALONE\ntemplate <unsigned digits10>\ninline void eval_convert_to(long double* result, const gmp_float<digits10>& val) noexcept\n{\n   mp_exp_t exp = 0;\n\n   detail::gmp_char_ptr val_char_ptr {mpf_get_str(nullptr, &exp, 10, LDBL_DIG, val.data())};\n\n   auto temp_string = std::string(val_char_ptr.get());\n   if(exp > 0 && static_cast<std::size_t>(exp) < temp_string.size())\n   {\n      if(temp_string.front() == '-')\n      {\n         ++exp;\n      }\n\n      temp_string.insert(static_cast<std::size_t>(exp), static_cast<std::size_t>(1u), '.');\n   }\n\n   *result = std::strtold(temp_string.c_str(), nullptr);\n\n   if((temp_string.size() == 2ul && *result < 0.0l) ||\n      (static_cast<std::size_t>(exp) > temp_string.size()))\n   {\n      *result *= std::pow(10l, exp-1);\n   }\n}\n#endif // BOOST_MP_STANDALONE\ntemplate <unsigned digits10>\ninline void eval_convert_to(double* result, const gmp_float<digits10>& val) noexcept\n{\n   *result = mpf_get_d(val.data());\n}\n#ifdef BOOST_HAS_LONG_LONG\ntemplate <unsigned digits10>\ninline void eval_convert_to(long long* result, const gmp_float<digits10>& val)\n{\n   gmp_float<digits10> t(val);\n   if (eval_get_sign(t) < 0)\n      t.negate();\n\n   long digits = std::numeric_limits<long long>::digits - std::numeric_limits<long>::digits;\n\n   if (digits > 0)\n      mpf_div_2exp(t.data(), t.data(), digits);\n\n   if (!mpf_fits_slong_p(t.data()))\n   {\n      if (eval_get_sign(val) < 0)\n         *result = (std::numeric_limits<long long>::min)();\n      else\n         *result = (std::numeric_limits<long long>::max)();\n      return;\n   };\n\n   *result = mpf_get_si(t.data());\n   while (digits > 0)\n   {\n      *result <<= digits;\n      digits -= std::numeric_limits<unsigned long>::digits;\n      mpf_mul_2exp(t.data(), t.data(), digits >= 0 ? std::numeric_limits<unsigned long>::digits : std::numeric_limits<unsigned long>::digits + digits);\n      unsigned long l = static_cast<unsigned long>(mpf_get_ui(t.data()));\n      if (digits < 0)\n         l >>= -digits;\n      *result |= l;\n   }\n   if (eval_get_sign(val) < 0)\n      *result = -*result;\n}\ntemplate <unsigned digits10>\ninline void eval_convert_to(unsigned long long* result, const gmp_float<digits10>& val)\n{\n   gmp_float<digits10> t(val);\n\n   long digits = std::numeric_limits<long long>::digits - std::numeric_limits<long>::digits;\n\n   if (digits > 0)\n      mpf_div_2exp(t.data(), t.data(), digits);\n\n   if (!mpf_fits_ulong_p(t.data()))\n   {\n      *result = (std::numeric_limits<long long>::max)();\n      return;\n   }\n\n   *result = mpf_get_ui(t.data());\n   while (digits > 0)\n   {\n      *result <<= digits;\n      digits -= std::numeric_limits<unsigned long>::digits;\n      mpf_mul_2exp(t.data(), t.data(), digits >= 0 ? std::numeric_limits<unsigned long>::digits : std::numeric_limits<unsigned long>::digits + digits);\n      unsigned long l = static_cast<unsigned long>(mpf_get_ui(t.data()));\n      if (digits < 0)\n         l >>= -digits;\n      *result |= l;\n   }\n}\n#endif\n\n\n#ifdef BOOST_HAS_FLOAT128\ntemplate <unsigned digits10>\ninline void eval_convert_to(float128_type* result, const gmp_float<digits10>& val)\n{\n   *result = float128_procs::strtoflt128(val.str(0, std::ios_base::scientific).c_str(), nullptr);\n}\n#endif\n\n\n//\n// Native non-member operations:\n//\ntemplate <unsigned Digits10>\ninline void eval_sqrt(gmp_float<Digits10>& result, const gmp_float<Digits10>& val)\n{\n   mpf_sqrt(result.data(), val.data());\n}\n\ntemplate <unsigned Digits10>\ninline void eval_abs(gmp_float<Digits10>& result, const gmp_float<Digits10>& val)\n{\n   mpf_abs(result.data(), val.data());\n}\n\ntemplate <unsigned Digits10>\ninline void eval_fabs(gmp_float<Digits10>& result, const gmp_float<Digits10>& val)\n{\n   mpf_abs(result.data(), val.data());\n}\ntemplate <unsigned Digits10>\ninline void eval_ceil(gmp_float<Digits10>& result, const gmp_float<Digits10>& val)\n{\n   mpf_ceil(result.data(), val.data());\n}\ntemplate <unsigned Digits10>\ninline void eval_floor(gmp_float<Digits10>& result, const gmp_float<Digits10>& val)\n{\n   mpf_floor(result.data(), val.data());\n}\ntemplate <unsigned Digits10>\ninline void eval_trunc(gmp_float<Digits10>& result, const gmp_float<Digits10>& val)\n{\n   mpf_trunc(result.data(), val.data());\n}\ntemplate <unsigned Digits10>\ninline void eval_ldexp(gmp_float<Digits10>& result, const gmp_float<Digits10>& val, long e)\n{\n   if (e > 0)\n      mpf_mul_2exp(result.data(), val.data(), static_cast<mp_bitcnt_t>(e));\n   else if (e < 0)\n      mpf_div_2exp(result.data(), val.data(), static_cast<mp_bitcnt_t>(-e));\n   else\n      result = val;\n}\ntemplate <unsigned Digits10>\ninline void eval_frexp(gmp_float<Digits10>& result, const gmp_float<Digits10>& val, int* e)\n{\n#if (BOOST_MP_MPIR_VERSION >= 20600) && (BOOST_MP_MPIR_VERSION < 30000)\n   mpir_si v;\n   mpf_get_d_2exp(&v, val.data());\n#else\n   long v;\n   mpf_get_d_2exp(&v, val.data());\n#endif\n   *e = static_cast<int>(v);\n   eval_ldexp(result, val, -v);\n}\ntemplate <unsigned Digits10>\ninline void eval_frexp(gmp_float<Digits10>& result, const gmp_float<Digits10>& val, long* e)\n{\n#if (BOOST_MP_MPIR_VERSION >= 20600) && (BOOST_MP_MPIR_VERSION < 30000)\n   mpir_si v;\n   mpf_get_d_2exp(&v, val.data());\n   *e = v;\n   eval_ldexp(result, val, -v);\n#else\n   mpf_get_d_2exp(e, val.data());\n   eval_ldexp(result, val, -*e);\n#endif\n}\n\ntemplate <unsigned Digits10>\ninline std::size_t hash_value(const gmp_float<Digits10>& val)\n{\n   std::size_t result = 0;\n   for (int i = 0; i < std::abs(val.data()[0]._mp_size); ++i)\n      boost::multiprecision::detail::hash_combine(result, val.data()[0]._mp_d[i]);\n   boost::multiprecision::detail::hash_combine(result, val.data()[0]._mp_exp, val.data()[0]._mp_size);\n   return result;\n}\n\nstruct gmp_int\n{\n#ifdef BOOST_HAS_LONG_LONG\n   using signed_types = std::tuple<long, long long>          ;\n   using unsigned_types = std::tuple<unsigned long, unsigned long long>;\n#else\n   using signed_types = std::tuple<long>         ;\n   using unsigned_types = std::tuple<unsigned long>;\n#endif\n   using float_types = std::tuple<double, long double>;\n\n   gmp_int()\n   {\n      mpz_init(this->m_data);\n   }\n   gmp_int(const gmp_int& o)\n   {\n      if (o.m_data[0]._mp_d)\n         mpz_init_set(m_data, o.m_data);\n      else\n         mpz_init(this->m_data);\n   }\n   // rvalue\n   gmp_int(gmp_int&& o) noexcept\n   {\n      m_data[0]         = o.m_data[0];\n      o.m_data[0]._mp_d = nullptr;\n   }\n   explicit gmp_int(const mpf_t val)\n   {\n      mpz_init(this->m_data);\n      mpz_set_f(this->m_data, val);\n   }\n   gmp_int(const mpz_t val)\n   {\n      mpz_init_set(this->m_data, val);\n   }\n   gmp_int(long i)\n   {\n      mpz_init_set_si(this->m_data, i);\n   }\n   gmp_int(unsigned long i)\n   {\n      mpz_init_set_ui(this->m_data, i);\n   }\n   explicit gmp_int(const mpq_t val)\n   {\n      mpz_init(this->m_data);\n      mpz_set_q(this->m_data, val);\n   }\n   template <unsigned Digits10>\n   explicit gmp_int(const gmp_float<Digits10>& o)\n   {\n      mpz_init(this->m_data);\n      mpz_set_f(this->m_data, o.data());\n   }\n   explicit gmp_int(const gmp_rational& o);\n   gmp_int& operator=(const gmp_int& o)\n   {\n      if (m_data[0]._mp_d == nullptr)\n         mpz_init(this->m_data);\n      mpz_set(m_data, o.m_data);\n      return *this;\n   }\n   // rvalue copy\n   gmp_int& operator=(gmp_int&& o) noexcept\n   {\n      mpz_swap(m_data, o.m_data);\n      return *this;\n   }\n#ifdef BOOST_HAS_LONG_LONG\n#if defined(ULLONG_MAX) && (ULLONG_MAX == ULONG_MAX)\n   gmp_int& operator=(unsigned long long i)\n   {\n      *this = static_cast<unsigned long>(i);\n      return *this;\n   }\n#else\n   gmp_int& operator=(unsigned long long i)\n   {\n      if (m_data[0]._mp_d == nullptr)\n         mpz_init(this->m_data);\n      unsigned long long mask  = ((((1uLL << (std::numeric_limits<unsigned long>::digits - 1)) - 1) << 1) | 1uLL);\n      unsigned               shift = 0;\n      mpz_t                  t;\n      mpz_set_ui(m_data, 0);\n      mpz_init_set_ui(t, 0);\n      while (i)\n      {\n         mpz_set_ui(t, static_cast<unsigned long>(i & mask));\n         if (shift)\n            mpz_mul_2exp(t, t, shift);\n         mpz_add(m_data, m_data, t);\n         shift += std::numeric_limits<unsigned long>::digits;\n         i >>= std::numeric_limits<unsigned long>::digits;\n      }\n      mpz_clear(t);\n      return *this;\n   }\n#endif\n   gmp_int& operator=(long long i)\n   {\n      if (m_data[0]._mp_d == nullptr)\n         mpz_init(this->m_data);\n      bool neg = i < 0;\n      *this    = boost::multiprecision::detail::unsigned_abs(i);\n      if (neg)\n         mpz_neg(m_data, m_data);\n      return *this;\n   }\n#endif\n#ifdef BOOST_HAS_INT128\n   gmp_int& operator=(uint128_type i)\n   {\n      if (m_data[0]._mp_d == nullptr)\n         mpz_init(this->m_data);\n      uint128_type mask  = ((((1uLL << (std::numeric_limits<unsigned long>::digits - 1)) - 1) << 1) | 1uLL);\n      unsigned               shift = 0;\n      mpz_t                  t;\n      mpz_set_ui(m_data, 0);\n      mpz_init_set_ui(t, 0);\n      while (i)\n      {\n         mpz_set_ui(t, static_cast<unsigned long>(i & mask));\n         if (shift)\n            mpz_mul_2exp(t, t, shift);\n         mpz_add(m_data, m_data, t);\n         shift += std::numeric_limits<unsigned long>::digits;\n         i >>= std::numeric_limits<unsigned long>::digits;\n      }\n      mpz_clear(t);\n      return *this;\n   }\n   gmp_int& operator=(int128_type i)\n   {\n      if (m_data[0]._mp_d == nullptr)\n         mpz_init(this->m_data);\n      bool neg = i < 0;\n      *this    = boost::multiprecision::detail::unsigned_abs(i);\n      if (neg)\n         mpz_neg(m_data, m_data);\n      return *this;\n   }\n#endif\n   gmp_int& operator=(unsigned long i)\n   {\n      if (m_data[0]._mp_d == nullptr)\n         mpz_init(this->m_data);\n      mpz_set_ui(m_data, i);\n      return *this;\n   }\n   gmp_int& operator=(long i)\n   {\n      if (m_data[0]._mp_d == nullptr)\n         mpz_init(this->m_data);\n      mpz_set_si(m_data, i);\n      return *this;\n   }\n   gmp_int& operator=(double d)\n   {\n      if (m_data[0]._mp_d == nullptr)\n         mpz_init(this->m_data);\n      mpz_set_d(m_data, d);\n      return *this;\n   }\n   template <class F>\n   gmp_int& assign_float(F a)\n   {\n      BOOST_MP_FLOAT128_USING using std::floor; using std::frexp; using std::ldexp;\n\n      if (m_data[0]._mp_d == nullptr)\n         mpz_init(this->m_data);\n\n      if (a == 0)\n      {\n         mpz_set_si(m_data, 0);\n         return *this;\n      }\n\n      if (a == 1)\n      {\n         mpz_set_si(m_data, 1);\n         return *this;\n      }\n\n      BOOST_MP_ASSERT(!BOOST_MP_ISINF(a));\n      BOOST_MP_ASSERT(!BOOST_MP_ISNAN(a));\n\n      int         e;\n      F f, term;\n      mpz_set_ui(m_data, 0u);\n\n      f = frexp(a, &e);\n\n      constexpr int shift = std::numeric_limits<int>::digits - 1;\n\n      while (f != static_cast<F>(0.0f))\n      {\n         // extract int sized bits from f:\n         f    = ldexp(f, shift);\n         term = floor(f);\n         e -= shift;\n         mpz_mul_2exp(m_data, m_data, shift);\n         if (term > 0)\n            mpz_add_ui(m_data, m_data, static_cast<unsigned>(term));\n         else\n            mpz_sub_ui(m_data, m_data, static_cast<unsigned>(-term));\n         f -= term;\n      }\n      if (e > 0)\n         mpz_mul_2exp(m_data, m_data, static_cast<mp_bitcnt_t>(e));\n      else if (e < 0)\n         mpz_div_2exp(m_data, m_data, static_cast<mp_bitcnt_t>(-e));\n      return *this;\n   }\n   gmp_int& operator=(long double a)\n   {\n      return assign_float(a);\n   }\n   gmp_int& operator=(const char* s)\n   {\n      if (m_data[0]._mp_d == nullptr)\n         mpz_init(this->m_data);\n      std::size_t n     = s ? std::strlen(s) : 0;\n      int         radix = 10;\n      if (n && (*s == '0'))\n      {\n         if ((n > 1) && ((s[1] == 'x') || (s[1] == 'X')))\n         {\n            radix = 16;\n            s += 2;\n            n -= 2;\n         }\n         else\n         {\n            radix = 8;\n            n -= 1;\n         }\n      }\n      if (n)\n      {\n         if (0 != mpz_set_str(m_data, s, radix))\n            BOOST_MP_THROW_EXCEPTION(std::runtime_error(std::string(\"The string \\\"\") + s + std::string(\"\\\"could not be interpreted as a valid integer.\")));\n      }\n      else\n         mpz_set_ui(m_data, 0);\n      return *this;\n   }\n#ifdef BOOST_HAS_FLOAT128\n   gmp_int& operator=(float128_type a)\n   {\n      return assign_float(a);\n   }\n#endif\n   gmp_int& operator=(const mpf_t val)\n   {\n      if (m_data[0]._mp_d == nullptr)\n         mpz_init(this->m_data);\n      mpz_set_f(this->m_data, val);\n      return *this;\n   }\n   gmp_int& operator=(const mpz_t val)\n   {\n      if (m_data[0]._mp_d == nullptr)\n         mpz_init(this->m_data);\n      mpz_set(this->m_data, val);\n      return *this;\n   }\n   gmp_int& operator=(const mpq_t val)\n   {\n      if (m_data[0]._mp_d == nullptr)\n         mpz_init(this->m_data);\n      mpz_set_q(this->m_data, val);\n      return *this;\n   }\n   template <unsigned Digits10>\n   gmp_int& operator=(const gmp_float<Digits10>& o)\n   {\n      if (m_data[0]._mp_d == nullptr)\n         mpz_init(this->m_data);\n      mpz_set_f(this->m_data, o.data());\n      return *this;\n   }\n   gmp_int& operator=(const gmp_rational& o);\n   void     swap(gmp_int& o)\n   {\n      mpz_swap(m_data, o.m_data);\n   }\n   std::string str(std::streamsize /*digits*/, std::ios_base::fmtflags f) const\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_d);\n\n      int base = 10;\n      if ((f & std::ios_base::oct) == std::ios_base::oct)\n         base = 8;\n      else if ((f & std::ios_base::hex) == std::ios_base::hex)\n         base = 16;\n      //\n      // sanity check, bases 8 and 16 are only available for positive numbers:\n      //\n      if ((base != 10) && (mpz_sgn(m_data) < 0))\n         BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Formatted output in bases 8 or 16 is only available for positive numbers\"));\n      void* (*alloc_func_ptr)(size_t);\n      void* (*realloc_func_ptr)(void*, size_t, size_t);\n      void (*free_func_ptr)(void*, size_t);\n      const char* ps = mpz_get_str(nullptr, base, m_data);\n      std::string s  = ps;\n      mp_get_memory_functions(&alloc_func_ptr, &realloc_func_ptr, &free_func_ptr);\n      (*free_func_ptr)((void*)ps, std::strlen(ps) + 1);\n      if (f & std::ios_base::uppercase)\n         for (size_t i = 0; i < s.length(); ++i)\n            s[i] = static_cast<char>(std::toupper(s[i]));\n      if ((base != 10) && (f & std::ios_base::showbase))\n      {\n         int         pos = s[0] == '-' ? 1 : 0;\n         const char* pp  = base == 8 ? \"0\" : (f & std::ios_base::uppercase) ? \"0X\" : \"0x\";\n         s.insert(static_cast<std::string::size_type>(pos), pp);\n      }\n      if ((f & std::ios_base::showpos) && (s[0] != '-'))\n         s.insert(static_cast<std::string::size_type>(0), 1, '+');\n\n      return s;\n   }\n   ~gmp_int() noexcept\n   {\n      if (m_data[0]._mp_d)\n         mpz_clear(m_data);\n   }\n   void negate() noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_d);\n      mpz_neg(m_data, m_data);\n   }\n   int compare(const gmp_int& o) const noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_d && o.m_data[0]._mp_d);\n      return mpz_cmp(m_data, o.m_data);\n   }\n   int compare(long i) const noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_d);\n      return mpz_cmp_si(m_data, i);\n   }\n   int compare(unsigned long i) const noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_d);\n      return mpz_cmp_ui(m_data, i);\n   }\n   template <class V>\n   int compare(V v) const\n   {\n      gmp_int d;\n      d = v;\n      return compare(d);\n   }\n   mpz_t& data() noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_d);\n      return m_data;\n   }\n   const mpz_t& data() const noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_d);\n      return m_data;\n   }\n\n protected:\n   mpz_t m_data;\n};\n\ntemplate <class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_arithmetic<T>::value, bool>::type eval_eq(const gmp_int& a, const T& b)\n{\n   return a.compare(b) == 0;\n}\ntemplate <class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_arithmetic<T>::value, bool>::type eval_lt(const gmp_int& a, const T& b)\n{\n   return a.compare(b) < 0;\n}\ntemplate <class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_arithmetic<T>::value, bool>::type eval_gt(const gmp_int& a, const T& b)\n{\n   return a.compare(b) > 0;\n}\n\ninline bool eval_is_zero(const gmp_int& val)\n{\n   return mpz_sgn(val.data()) == 0;\n}\ninline void eval_add(gmp_int& t, const gmp_int& o)\n{\n   mpz_add(t.data(), t.data(), o.data());\n}\ninline void eval_multiply_add(gmp_int& t, const gmp_int& a, const gmp_int& b)\n{\n   mpz_addmul(t.data(), a.data(), b.data());\n}\ninline void eval_multiply_subtract(gmp_int& t, const gmp_int& a, const gmp_int& b)\n{\n   mpz_submul(t.data(), a.data(), b.data());\n}\ninline void eval_subtract(gmp_int& t, const gmp_int& o)\n{\n   mpz_sub(t.data(), t.data(), o.data());\n}\ninline void eval_multiply(gmp_int& t, const gmp_int& o)\n{\n   mpz_mul(t.data(), t.data(), o.data());\n}\ninline void eval_divide(gmp_int& t, const gmp_int& o)\n{\n   if (eval_is_zero(o))\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n   mpz_tdiv_q(t.data(), t.data(), o.data());\n}\ninline void eval_modulus(gmp_int& t, const gmp_int& o)\n{\n   mpz_tdiv_r(t.data(), t.data(), o.data());\n}\ninline void eval_add(gmp_int& t, unsigned long i)\n{\n   mpz_add_ui(t.data(), t.data(), i);\n}\ninline void eval_multiply_add(gmp_int& t, const gmp_int& a, unsigned long i)\n{\n   mpz_addmul_ui(t.data(), a.data(), i);\n}\ninline void eval_multiply_subtract(gmp_int& t, const gmp_int& a, unsigned long i)\n{\n   mpz_submul_ui(t.data(), a.data(), i);\n}\ninline void eval_subtract(gmp_int& t, unsigned long i)\n{\n   mpz_sub_ui(t.data(), t.data(), i);\n}\ninline void eval_multiply(gmp_int& t, unsigned long i)\n{\n   mpz_mul_ui(t.data(), t.data(), i);\n}\ninline void eval_modulus(gmp_int& t, unsigned long i)\n{\n   mpz_tdiv_r_ui(t.data(), t.data(), i);\n}\ninline void eval_divide(gmp_int& t, unsigned long i)\n{\n   if (i == 0)\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n   mpz_tdiv_q_ui(t.data(), t.data(), i);\n}\ninline void eval_add(gmp_int& t, long i)\n{\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   if (i > 0)\n      mpz_add_ui(t.data(), t.data(), static_cast<local_uint_type>(i));\n   else if (i < 0)\n      mpz_sub_ui(t.data(), t.data(), static_cast<local_uint_type>(-i));\n}\ninline void eval_multiply_add(gmp_int& t, const gmp_int& a, long i)\n{\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   if (i > 0)\n      mpz_addmul_ui(t.data(), a.data(), static_cast<local_uint_type>(i));\n   else\n      mpz_submul_ui(t.data(), a.data(), static_cast<local_uint_type>(-i));\n}\ninline void eval_multiply_subtract(gmp_int& t, const gmp_int& a, long i)\n{\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   if (i > 0)\n      mpz_submul_ui(t.data(), a.data(), static_cast<local_uint_type>(i));\n   else\n      mpz_addmul_ui(t.data(), a.data(), static_cast<local_uint_type>(-i));\n}\ninline void eval_subtract(gmp_int& t, long i)\n{\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   if (i > 0)\n      mpz_sub_ui(t.data(), t.data(), static_cast<local_uint_type>(i));\n   else if (i < 0)\n      mpz_add_ui(t.data(), t.data(), static_cast<local_uint_type>(-i));\n}\ninline void eval_multiply(gmp_int& t, long i)\n{\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   mpz_mul_ui(t.data(), t.data(), static_cast<local_uint_type>(boost::multiprecision::detail::unsigned_abs(i)));\n\n   if (i < 0)\n      mpz_neg(t.data(), t.data());\n}\ninline void eval_modulus(gmp_int& t, long i)\n{\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   mpz_tdiv_r_ui(t.data(), t.data(), static_cast<local_uint_type>(boost::multiprecision::detail::unsigned_abs(i)));\n}\ninline void eval_divide(gmp_int& t, long i)\n{\n   if (i == 0)\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   mpz_tdiv_q_ui(t.data(), t.data(), static_cast<local_uint_type>(boost::multiprecision::detail::unsigned_abs(i)));\n\n   if (i < 0)\n      mpz_neg(t.data(), t.data());\n}\ntemplate <class UI>\ninline void eval_left_shift(gmp_int& t, UI i)\n{\n   mpz_mul_2exp(t.data(), t.data(), static_cast<unsigned long>(i));\n}\ntemplate <class UI>\ninline void eval_right_shift(gmp_int& t, UI i)\n{\n   mpz_fdiv_q_2exp(t.data(), t.data(), static_cast<unsigned long>(i));\n}\ntemplate <class UI>\ninline void eval_left_shift(gmp_int& t, const gmp_int& v, UI i)\n{\n   mpz_mul_2exp(t.data(), v.data(), static_cast<unsigned long>(i));\n}\ntemplate <class UI>\ninline void eval_right_shift(gmp_int& t, const gmp_int& v, UI i)\n{\n   mpz_fdiv_q_2exp(t.data(), v.data(), static_cast<unsigned long>(i));\n}\n\ninline void eval_bitwise_and(gmp_int& result, const gmp_int& v)\n{\n   mpz_and(result.data(), result.data(), v.data());\n}\n\ninline void eval_bitwise_or(gmp_int& result, const gmp_int& v)\n{\n   mpz_ior(result.data(), result.data(), v.data());\n}\n\ninline void eval_bitwise_xor(gmp_int& result, const gmp_int& v)\n{\n   mpz_xor(result.data(), result.data(), v.data());\n}\n\ninline void eval_add(gmp_int& t, const gmp_int& p, const gmp_int& o)\n{\n   mpz_add(t.data(), p.data(), o.data());\n}\ninline void eval_subtract(gmp_int& t, const gmp_int& p, const gmp_int& o)\n{\n   mpz_sub(t.data(), p.data(), o.data());\n}\ninline void eval_multiply(gmp_int& t, const gmp_int& p, const gmp_int& o)\n{\n   mpz_mul(t.data(), p.data(), o.data());\n}\ninline void eval_divide(gmp_int& t, const gmp_int& p, const gmp_int& o)\n{\n   if (eval_is_zero(o))\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n   mpz_tdiv_q(t.data(), p.data(), o.data());\n}\ninline void eval_modulus(gmp_int& t, const gmp_int& p, const gmp_int& o)\n{\n   mpz_tdiv_r(t.data(), p.data(), o.data());\n}\ninline void eval_add(gmp_int& t, const gmp_int& p, unsigned long i)\n{\n   mpz_add_ui(t.data(), p.data(), i);\n}\ninline void eval_subtract(gmp_int& t, const gmp_int& p, unsigned long i)\n{\n   mpz_sub_ui(t.data(), p.data(), i);\n}\ninline void eval_multiply(gmp_int& t, const gmp_int& p, unsigned long i)\n{\n   mpz_mul_ui(t.data(), p.data(), i);\n}\ninline void eval_modulus(gmp_int& t, const gmp_int& p, unsigned long i)\n{\n   mpz_tdiv_r_ui(t.data(), p.data(), i);\n}\ninline void eval_divide(gmp_int& t, const gmp_int& p, unsigned long i)\n{\n   if (i == 0)\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n   mpz_tdiv_q_ui(t.data(), p.data(), i);\n}\ninline void eval_add(gmp_int& t, const gmp_int& p, long i)\n{\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   if (i > 0)\n      mpz_add_ui(t.data(), p.data(), static_cast<local_uint_type>(i));\n   else\n      mpz_sub_ui(t.data(), p.data(), static_cast<local_uint_type>(-i));\n}\ninline void eval_subtract(gmp_int& t, const gmp_int& p, long i)\n{\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   if (i > 0)\n      mpz_sub_ui(t.data(), p.data(), static_cast<local_uint_type>(i));\n   else\n      mpz_add_ui(t.data(), p.data(), static_cast<local_uint_type>(-i));\n}\ninline void eval_multiply(gmp_int& t, const gmp_int& p, long i)\n{\n   mpz_mul_ui(t.data(), p.data(), boost::multiprecision::detail::unsigned_abs(i));\n   if (i < 0)\n      mpz_neg(t.data(), t.data());\n}\ninline void eval_modulus(gmp_int& t, const gmp_int& p, long i)\n{\n   mpz_tdiv_r_ui(t.data(), p.data(), boost::multiprecision::detail::unsigned_abs(i));\n}\ninline void eval_divide(gmp_int& t, const gmp_int& p, long i)\n{\n   if (i == 0)\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n   mpz_tdiv_q_ui(t.data(), p.data(), boost::multiprecision::detail::unsigned_abs(i));\n   if (i < 0)\n      mpz_neg(t.data(), t.data());\n}\n\ninline void eval_bitwise_and(gmp_int& result, const gmp_int& u, const gmp_int& v)\n{\n   mpz_and(result.data(), u.data(), v.data());\n}\n\ninline void eval_bitwise_or(gmp_int& result, const gmp_int& u, const gmp_int& v)\n{\n   mpz_ior(result.data(), u.data(), v.data());\n}\n\ninline void eval_bitwise_xor(gmp_int& result, const gmp_int& u, const gmp_int& v)\n{\n   mpz_xor(result.data(), u.data(), v.data());\n}\n\ninline void eval_complement(gmp_int& result, const gmp_int& u)\n{\n   mpz_com(result.data(), u.data());\n}\n\ninline int eval_get_sign(const gmp_int& val)\n{\n   return mpz_sgn(val.data());\n}\ninline void eval_convert_to(unsigned long* result, const gmp_int& val)\n{\n   if (mpz_sgn(val.data()) < 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::range_error(\"Conversion from negative integer to an unsigned type results in undefined behaviour\"));\n   }\n   else\n      *result = static_cast<unsigned long>(mpz_get_ui(val.data()));\n}\ninline void eval_convert_to(long* result, const gmp_int& val)\n{\n   if (0 == mpz_fits_slong_p(val.data()))\n   {\n      *result = mpz_sgn(val.data()) < 0 ? (std::numeric_limits<long>::min)() : (std::numeric_limits<long>::max)();\n   }\n   else\n      *result = static_cast<long>(mpz_get_si(val.data()));\n}\ninline void eval_convert_to(long double* result, const gmp_int& val)\n{\n   detail::gmp_char_ptr val_char_ptr {mpz_get_str(nullptr, 10, val.data())};\n   *result = std::strtold(val_char_ptr.get(), nullptr);\n}\ninline void eval_convert_to(double* result, const gmp_int& val)\n{\n   *result = mpz_get_d(val.data());\n}\n#ifdef BOOST_HAS_LONG_LONG\ninline void eval_convert_to(unsigned long long* result, const gmp_int& val)\n{\n   if (mpz_sgn(val.data()) < 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::range_error(\"Conversion from negative integer to an unsigned type results in undefined behaviour\"));\n   }\n   *result = 0;\n   gmp_int t(val);\n   unsigned parts = sizeof(unsigned long long) / sizeof(unsigned long);\n\n   for (unsigned i = 0; i < parts; ++i)\n   {\n      unsigned long long part = mpz_get_ui(t.data());\n      if (i)\n         *result |= part << (i * sizeof(unsigned long) * CHAR_BIT);\n      else\n         *result = part;\n      mpz_tdiv_q_2exp(t.data(), t.data(), sizeof(unsigned long) * CHAR_BIT);\n   }\n}\ninline void eval_convert_to(long long* result, const gmp_int& val)\n{\n   int s = mpz_sgn(val.data());\n   *result = 0;\n   gmp_int t(val);\n   unsigned parts = sizeof(unsigned long long) / sizeof(unsigned long);\n   unsigned long long unsigned_result = 0;\n\n   for (unsigned i = 0; i < parts; ++i)\n   {\n      unsigned long long part = mpz_get_ui(t.data());\n      if (i)\n         unsigned_result |= part << (i * sizeof(unsigned long) * CHAR_BIT);\n      else\n         unsigned_result = part;\n      mpz_tdiv_q_2exp(t.data(), t.data(), sizeof(unsigned long) * CHAR_BIT);\n   }\n   //\n   // Overflow check:\n   //\n   bool overflow = false;\n   if (mpz_sgn(t.data()))\n   {\n      overflow = true;\n   }\n   if ((s > 0) && (unsigned_result > static_cast<unsigned long long>((std::numeric_limits<long long>::max)())))\n      overflow = true;\n   if((s < 0) && (unsigned_result > 1u - static_cast<unsigned long long>((std::numeric_limits<long long>::min)() + 1)))\n      overflow = true;\n   if(overflow)\n      *result = s < 0 ? (std::numeric_limits<long long>::min)() : (std::numeric_limits<long long>::max)();\n   else\n      *result = s < 0 ? -static_cast<long long>(unsigned_result - 1u) - 1 : static_cast<long long>(unsigned_result);\n}\n#endif\n#ifdef BOOST_HAS_INT128\ninline void eval_convert_to(uint128_type* result, const gmp_int& val)\n{\n   if (mpz_sgn(val.data()) < 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::range_error(\"Conversion from negative integer to an unsigned type results in undefined behaviour\"));\n   }\n   *result = 0;\n   gmp_int t(val);\n   unsigned parts = sizeof(uint128_type) / sizeof(unsigned long);\n\n   for (unsigned i = 0; i < parts; ++i)\n   {\n      uint128_type part = mpz_get_ui(t.data());\n      if (i)\n         *result |= part << (i * sizeof(unsigned long) * CHAR_BIT);\n      else\n         *result = part;\n      mpz_tdiv_q_2exp(t.data(), t.data(), sizeof(unsigned long) * CHAR_BIT);\n   }\n}\ninline void eval_convert_to(int128_type* result, const gmp_int& val)\n{\n   int s = mpz_sgn(val.data());\n   *result = 0;\n   gmp_int t(val);\n   unsigned parts = sizeof(uint128_type) / sizeof(unsigned long);\n   uint128_type unsigned_result = 0;\n\n   for (unsigned i = 0; i < parts; ++i)\n   {\n      uint128_type part = mpz_get_ui(t.data());\n      if (i)\n         unsigned_result |= part << (i * sizeof(unsigned long) * CHAR_BIT);\n      else\n         unsigned_result = part;\n      mpz_tdiv_q_2exp(t.data(), t.data(), sizeof(unsigned long) * CHAR_BIT);\n   }\n   //\n   // Overflow check:\n   //\n   constexpr int128_type int128_max = static_cast<int128_type>((static_cast<uint128_type>(1u) << 127) - 1);\n   constexpr int128_type int128_min = static_cast<int128_type>(static_cast<int128_type>(-int128_max) -1);\n   bool overflow = false;\n   if (mpz_sgn(t.data()))\n   {\n      overflow = true;\n   }\n   if ((s > 0) && (unsigned_result > static_cast<uint128_type>(int128_max)))\n      overflow = true;\n   if ((s < 0) && (unsigned_result > 1u - static_cast<uint128_type>(int128_min + 1)))\n      overflow = true;\n   if (overflow)\n      *result = s < 0 ? int128_min : int128_max;\n   else\n      *result = s < 0 ? -static_cast<int128_type>(unsigned_result - 1u) - 1 : static_cast<int128_type>(unsigned_result);\n}\n\ntemplate <unsigned digits10>\ninline void eval_convert_to(int128_type* result, const gmp_float<digits10>& val)\n{\n   gmp_int i;\n   mpz_set_f(i.data(), val.data());\n   eval_convert_to(result, i);\n}\ntemplate <unsigned digits10>\ninline void eval_convert_to(uint128_type* result, const gmp_float<digits10>& val)\n{\n   gmp_int i;\n   mpz_set_f(i.data(), val.data());\n   eval_convert_to(result, i);\n}\n\n#endif\n\n#ifdef BOOST_HAS_FLOAT128\ninline void eval_convert_to(float128_type* result, const gmp_int& val)\n{\n   *result = float128_procs::strtoflt128(val.str(0, std::ios_base::fixed).c_str(), nullptr);\n}\n#endif\n\ninline void eval_abs(gmp_int& result, const gmp_int& val)\n{\n   mpz_abs(result.data(), val.data());\n}\n\ninline void eval_gcd(gmp_int& result, const gmp_int& a, const gmp_int& b)\n{\n   mpz_gcd(result.data(), a.data(), b.data());\n}\ninline void eval_lcm(gmp_int& result, const gmp_int& a, const gmp_int& b)\n{\n   mpz_lcm(result.data(), a.data(), b.data());\n}\ntemplate <class I>\ninline typename std::enable_if<(boost::multiprecision::detail::is_unsigned<I>::value && (sizeof(I) <= sizeof(unsigned long)))>::type eval_gcd(gmp_int& result, const gmp_int& a, const I b)\n{\n   mpz_gcd_ui(result.data(), a.data(), b);\n}\ntemplate <class I>\ninline typename std::enable_if<(boost::multiprecision::detail::is_unsigned<I>::value && (sizeof(I) <= sizeof(unsigned long)))>::type eval_lcm(gmp_int& result, const gmp_int& a, const I b)\n{\n   mpz_lcm_ui(result.data(), a.data(), b);\n}\ntemplate <class I>\ninline typename std::enable_if<(boost::multiprecision::detail::is_signed<I>::value && boost::multiprecision::detail::is_integral<I>::value && (sizeof(I) <= sizeof(long)))>::type eval_gcd(gmp_int& result, const gmp_int& a, const I b)\n{\n   mpz_gcd_ui(result.data(), a.data(), boost::multiprecision::detail::unsigned_abs(b));\n}\ntemplate <class I>\ninline typename std::enable_if<boost::multiprecision::detail::is_signed<I>::value && boost::multiprecision::detail::is_integral<I>::value && ((sizeof(I) <= sizeof(long)))>::type eval_lcm(gmp_int& result, const gmp_int& a, const I b)\n{\n   mpz_lcm_ui(result.data(), a.data(), boost::multiprecision::detail::unsigned_abs(b));\n}\n\ninline void eval_integer_sqrt(gmp_int& s, gmp_int& r, const gmp_int& x)\n{\n   mpz_sqrtrem(s.data(), r.data(), x.data());\n}\n\ninline std::size_t eval_lsb(const gmp_int& val)\n{\n   int c = eval_get_sign(val);\n   if (c == 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::domain_error(\"No bits were set in the operand.\"));\n   }\n   if (c < 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::domain_error(\"Testing individual bits in negative values is not supported - results are undefined.\"));\n   }\n   return static_cast<unsigned>(mpz_scan1(val.data(), 0));\n}\n\ninline std::size_t eval_msb(const gmp_int& val)\n{\n   int c = eval_get_sign(val);\n   if (c == 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::domain_error(\"No bits were set in the operand.\"));\n   }\n   if (c < 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::domain_error(\"Testing individual bits in negative values is not supported - results are undefined.\"));\n   }\n   return static_cast<unsigned>(mpz_sizeinbase(val.data(), 2) - 1);\n}\n\ninline bool eval_bit_test(const gmp_int& val, std::size_t index)\n{\n   return mpz_tstbit(val.data(), index) ? true : false;\n}\n\ninline void eval_bit_set(gmp_int& val, std::size_t index)\n{\n   mpz_setbit(val.data(), index);\n}\n\ninline void eval_bit_unset(gmp_int& val, std::size_t index)\n{\n   mpz_clrbit(val.data(), index);\n}\n\ninline void eval_bit_flip(gmp_int& val, std::size_t index)\n{\n   mpz_combit(val.data(), index);\n}\n\ninline void eval_qr(const gmp_int& x, const gmp_int& y,\n                    gmp_int& q, gmp_int& r)\n{\n   mpz_tdiv_qr(q.data(), r.data(), x.data(), y.data());\n}\n\ntemplate <class Integer>\ninline typename std::enable_if<boost::multiprecision::detail::is_unsigned<Integer>::value, Integer>::type eval_integer_modulus(const gmp_int& x, Integer val)\n{\n#if defined(__MPIR_VERSION) && (__MPIR_VERSION >= 3)\n   if ((sizeof(Integer) <= sizeof(mpir_ui)) || (val <= (std::numeric_limits<mpir_ui>::max)()))\n#else\n   if ((sizeof(Integer) <= sizeof(long)) || (val <= (std::numeric_limits<unsigned long>::max)()))\n#endif\n   {\n      return static_cast<Integer>(mpz_tdiv_ui(x.data(), val));\n   }\n   else\n   {\n      return default_ops::eval_integer_modulus(x, val);\n   }\n}\ntemplate <class Integer>\ninline typename std::enable_if<boost::multiprecision::detail::is_signed<Integer>::value && boost::multiprecision::detail::is_integral<Integer>::value, Integer>::type eval_integer_modulus(const gmp_int& x, Integer val)\n{\n   return eval_integer_modulus(x, boost::multiprecision::detail::unsigned_abs(val));\n}\ninline void eval_powm(gmp_int& result, const gmp_int& base, const gmp_int& p, const gmp_int& m)\n{\n   if (eval_get_sign(p) < 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"powm requires a positive exponent.\"));\n   }\n   mpz_powm(result.data(), base.data(), p.data(), m.data());\n}\n\ntemplate <class Integer>\ninline typename std::enable_if<\n    boost::multiprecision::detail::is_unsigned<Integer>::value && (sizeof(Integer) <= sizeof(unsigned long))>::type\neval_powm(gmp_int& result, const gmp_int& base, Integer p, const gmp_int& m)\n{\n   mpz_powm_ui(result.data(), base.data(), p, m.data());\n}\ntemplate <class Integer>\ninline typename std::enable_if<boost::multiprecision::detail::is_signed<Integer>::value && boost::multiprecision::detail::is_integral<Integer>::value && (sizeof(Integer) <= sizeof(unsigned long))>::type\neval_powm(gmp_int& result, const gmp_int& base, Integer p, const gmp_int& m)\n{\n   if (p < 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"powm requires a positive exponent.\"));\n   }\n   mpz_powm_ui(result.data(), base.data(), p, m.data());\n}\n\ninline std::size_t hash_value(const gmp_int& val)\n{\n   // We should really use mpz_limbs_read here, but that's unsupported on older versions:\n   std::size_t result = 0;\n   for (int i = 0; i < std::abs(val.data()[0]._mp_size); ++i)\n      boost::multiprecision::detail::hash_combine(result, val.data()[0]._mp_d[i]);\n   boost::multiprecision::detail::hash_combine(result, val.data()[0]._mp_size);\n   return result;\n}\n\nstruct gmp_rational;\nvoid eval_add(gmp_rational& t, const gmp_rational& o);\n\nstruct gmp_rational\n{\n#ifdef BOOST_HAS_LONG_LONG\n   using signed_types = std::tuple<long, long long>          ;\n   using unsigned_types = std::tuple<unsigned long, unsigned long long>;\n#else\n   using signed_types = std::tuple<long>         ;\n   using unsigned_types = std::tuple<unsigned long>;\n#endif\n   using float_types = std::tuple<double, long double>;\n\n   gmp_rational()\n   {\n      mpq_init(this->m_data);\n   }\n   gmp_rational(const gmp_rational& o)\n   {\n      mpq_init(m_data);\n      if (o.m_data[0]._mp_num._mp_d)\n         mpq_set(m_data, o.m_data);\n   }\n   gmp_rational(const gmp_int& o)\n   {\n      mpz_init_set(&m_data[0]._mp_num, o.data());\n      mpz_init_set_ui(&m_data[0]._mp_den, 1u);\n   }\n   gmp_rational(long i)\n   {\n      mpz_init_set_si(&m_data[0]._mp_num, i);\n      mpz_init_set_ui(&m_data[0]._mp_den, 1u);\n   }\n   gmp_rational(unsigned long ui)\n   {\n      mpz_init_set_ui(&m_data[0]._mp_num, ui);\n      mpz_init_set_ui(&m_data[0]._mp_den, 1u);\n   }\n   // 2-arg constructors:\n   template <class T, class U>\n   gmp_rational(const T& a, const U& b, typename std::enable_if<std::is_constructible<gmp_int, T>::value && std::is_constructible<gmp_int, U>::value>::type* = nullptr)\n   {\n      gmp_int i(a), j(b);\n\n      if (eval_is_zero(j))\n         BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n\n      m_data[0]._mp_num = i.data()[0];\n      m_data[0]._mp_den = j.data()[0];\n      mpq_canonicalize(m_data);\n      i.data()[0]._mp_d = nullptr;\n      j.data()[0]._mp_d = nullptr;\n   }\n   template <class U>\n   gmp_rational(const gmp_int& a, const U& b, typename std::enable_if<std::is_constructible<gmp_int, U>::value>::type* = nullptr)\n   {\n      gmp_int j(b);\n\n      if (eval_is_zero(j))\n         BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n\n      mpz_init_set(&m_data[0]._mp_num, a.data());\n      m_data[0]._mp_den = j.data()[0];\n      if (boost::multiprecision::detail::unsigned_abs(b) > 1)\n         mpq_canonicalize(m_data);\n      j.data()[0]._mp_d = nullptr;\n   }\n   template <class U>\n   gmp_rational(gmp_int&& a, const U& b, typename std::enable_if<std::is_constructible<gmp_int, U>::value>::type* = nullptr)\n   {\n      gmp_int j(b);\n\n      if (eval_is_zero(j))\n         BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n\n      m_data[0]._mp_num = a.data()[0];\n      m_data[0]._mp_den = j.data()[0];\n      if (boost::multiprecision::detail::unsigned_abs(b) > 1)\n         mpq_canonicalize(m_data);\n      a.data()[0]._mp_d = nullptr;\n      j.data()[0]._mp_d = nullptr;\n   }\n   template <class T>\n   gmp_rational(const T& a, const gmp_int& b, typename std::enable_if<std::is_constructible<gmp_int, T>::value>::type* = nullptr)\n   {\n      if (eval_is_zero(b))\n         BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n\n      gmp_int i(a);\n      m_data[0]._mp_num = i.data()[0];\n      mpz_init_set(&m_data[0]._mp_den, b.data());\n      if(boost::multiprecision::detail::unsigned_abs(a) > 1)\n         mpq_canonicalize(m_data);\n      i.data()[0]._mp_d = nullptr;\n   }\n   template <class T>\n   gmp_rational(const T& a, gmp_int&& b, typename std::enable_if<std::is_constructible<gmp_int, T>::value>::type* = nullptr)\n   {\n      if (eval_is_zero(static_cast<gmp_int&&>(b)))\n         BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n\n      gmp_int i(a);\n      m_data[0]._mp_num = i.data()[0];\n      m_data[0]._mp_den = b.data()[0];\n      if(boost::multiprecision::detail::unsigned_abs(a) > 1)\n         mpq_canonicalize(m_data);\n      i.data()[0]._mp_d = nullptr;\n      b.data()[0]._mp_d = nullptr;\n   }\n   gmp_rational(const gmp_int& a, const gmp_int& b)\n   {\n      if (eval_is_zero(b))\n         BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n\n      mpz_init_set(&m_data[0]._mp_num, a.data());\n      mpz_init_set(&m_data[0]._mp_den, b.data());\n      mpq_canonicalize(m_data);\n   }\n   gmp_rational(const gmp_int& a, gmp_int&& b)\n   {\n      if (eval_is_zero(static_cast<gmp_int&&>(b)))\n         BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n\n      mpz_init_set(&m_data[0]._mp_num, a.data());\n      m_data[0]._mp_den = b.data()[0];\n      mpq_canonicalize(m_data);\n      b.data()[0]._mp_d = nullptr;\n   }\n   gmp_rational(gmp_int&& a, const gmp_int& b)\n   {\n      if (eval_is_zero(b))\n         BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n\n      m_data[0]._mp_num = a.data()[0];\n      mpz_init_set(&m_data[0]._mp_den, b.data());\n      mpq_canonicalize(m_data);\n      a.data()[0]._mp_d = nullptr;\n   }\n   gmp_rational(gmp_int&& a, gmp_int&& b)\n   {\n      if (eval_is_zero(static_cast<gmp_int&&>(b)))\n         BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n\n      m_data[0]._mp_num = a.data()[0];\n      m_data[0]._mp_den = b.data()[0];\n      mpq_canonicalize(m_data);\n      a.data()[0]._mp_d = nullptr;\n      b.data()[0]._mp_d = nullptr;\n   }\n   // rvalue copy\n   gmp_rational(gmp_rational&& o) noexcept\n   {\n      m_data[0]                 = o.m_data[0];\n      o.m_data[0]._mp_num._mp_d = nullptr;\n      o.m_data[0]._mp_den._mp_d = nullptr;\n   }\n   gmp_rational(const mpq_t o)\n   {\n      mpq_init(m_data);\n      mpq_set(m_data, o);\n   }\n   gmp_rational(const mpz_t o)\n   {\n      mpq_init(m_data);\n      mpq_set_z(m_data, o);\n   }\n   gmp_rational& operator=(const gmp_rational& o)\n   {\n      if (m_data[0]._mp_den._mp_d == nullptr)\n         mpq_init(m_data);\n      mpq_set(m_data, o.m_data);\n      return *this;\n   }\n   // rvalue assign\n   gmp_rational& operator=(gmp_rational&& o) noexcept\n   {\n      mpq_swap(m_data, o.m_data);\n      return *this;\n   }\n#ifdef BOOST_HAS_LONG_LONG\n#if defined(ULLONG_MAX) && (ULLONG_MAX == ULONG_MAX)\n   gmp_rational& operator=(unsigned long long i)\n   {\n      *this = static_cast<unsigned long>(i);\n      return *this;\n   }\n#else\n   gmp_rational& operator=(unsigned long long i)\n   {\n      if (m_data[0]._mp_den._mp_d == nullptr)\n         mpq_init(m_data);\n      gmp_int zi;\n      zi = i;\n      mpq_set_z(m_data, zi.data());\n      return *this;\n   }\n   gmp_rational& operator=(long long i)\n   {\n      if (m_data[0]._mp_den._mp_d == nullptr)\n         mpq_init(m_data);\n      bool neg = i < 0;\n      *this    = boost::multiprecision::detail::unsigned_abs(i);\n      if (neg)\n         mpq_neg(m_data, m_data);\n      return *this;\n   }\n#endif\n#endif\n   gmp_rational& operator=(unsigned long i)\n   {\n      if (m_data[0]._mp_den._mp_d == nullptr)\n         mpq_init(m_data);\n      mpq_set_ui(m_data, i, 1);\n      return *this;\n   }\n   gmp_rational& operator=(long i)\n   {\n      if (m_data[0]._mp_den._mp_d == nullptr)\n         mpq_init(m_data);\n      mpq_set_si(m_data, i, 1);\n      return *this;\n   }\n   gmp_rational& operator=(double d)\n   {\n      if (m_data[0]._mp_den._mp_d == nullptr)\n         mpq_init(m_data);\n      mpq_set_d(m_data, d);\n      return *this;\n   }\n   template <class F>\n   gmp_rational& assign_float(F a)\n   {\n      using default_ops::eval_add;\n      using default_ops::eval_subtract;\n      BOOST_MP_FLOAT128_USING using std::floor; using std::frexp; using std::ldexp;\n\n      if (m_data[0]._mp_den._mp_d == nullptr)\n         mpq_init(m_data);\n\n      if (a == 0)\n      {\n         mpq_set_si(m_data, 0, 1);\n         return *this;\n      }\n\n      if (a == 1)\n      {\n         mpq_set_si(m_data, 1, 1);\n         return *this;\n      }\n\n      BOOST_MP_ASSERT(!BOOST_MP_ISINF(a));\n      BOOST_MP_ASSERT(!BOOST_MP_ISNAN(a));\n\n      int         e;\n      F f, term;\n      mpq_set_ui(m_data, 0, 1);\n      mpq_set_ui(m_data, 0u, 1);\n      gmp_rational t;\n\n      f = frexp(a, &e);\n\n      constexpr int shift = std::numeric_limits<int>::digits - 1;\n\n      while (f != static_cast<F>(0.0f))\n      {\n         // extract int sized bits from f:\n         f    = ldexp(f, shift);\n         term = floor(f);\n         e -= shift;\n         mpq_mul_2exp(m_data, m_data, shift);\n         t = static_cast<long>(term);\n         eval_add(*this, t);\n         f -= term;\n      }\n      if (e > 0)\n         mpq_mul_2exp(m_data, m_data, static_cast<mp_bitcnt_t>(e));\n      else if (e < 0)\n         mpq_div_2exp(m_data, m_data, static_cast<mp_bitcnt_t>(-e));\n      return *this;\n   }\n   gmp_rational& operator=(long double a)\n   {\n      return assign_float(a);\n   }\n#ifdef BOOST_HAS_FLOAT128\n   gmp_rational& operator=(float128_type a)\n   {\n      return assign_float(a);\n   }\n#endif\n#ifdef BOOST_HAS_INT128\n   gmp_rational& operator=(uint128_type i)\n   {\n      gmp_int gi;\n      gi = i;\n      return *this = gi;\n   }\n   gmp_rational& operator=(int128_type i)\n   {\n      gmp_int gi;\n      gi = i;\n      return *this = gi;\n   }\n#endif\n   gmp_rational& operator=(const char* s)\n   {\n      if (m_data[0]._mp_den._mp_d == nullptr)\n         mpq_init(m_data);\n      if (0 != mpq_set_str(m_data, s, 10))\n         BOOST_MP_THROW_EXCEPTION(std::runtime_error(std::string(\"The string \\\"\") + s + std::string(\"\\\"could not be interpreted as a valid rational number.\")));\n      return *this;\n   }\n   gmp_rational& operator=(const gmp_int& o)\n   {\n      if (m_data[0]._mp_den._mp_d == nullptr)\n         mpq_init(m_data);\n      mpq_set_z(m_data, o.data());\n      return *this;\n   }\n   gmp_rational& operator=(const mpq_t o)\n   {\n      if (m_data[0]._mp_den._mp_d == nullptr)\n         mpq_init(m_data);\n      mpq_set(m_data, o);\n      return *this;\n   }\n   gmp_rational& operator=(const mpz_t o)\n   {\n      if (m_data[0]._mp_den._mp_d == nullptr)\n         mpq_init(m_data);\n      mpq_set_z(m_data, o);\n      return *this;\n   }\n   void swap(gmp_rational& o)\n   {\n      mpq_swap(m_data, o.m_data);\n   }\n   std::string str(std::streamsize /*digits*/, std::ios_base::fmtflags /*f*/) const\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_num._mp_d);\n      // TODO make a better job of this including handling of f!!\n      void* (*alloc_func_ptr)(size_t);\n      void* (*realloc_func_ptr)(void*, size_t, size_t);\n      void (*free_func_ptr)(void*, size_t);\n      const char* ps = mpq_get_str(nullptr, 10, m_data);\n      std::string s  = ps;\n      mp_get_memory_functions(&alloc_func_ptr, &realloc_func_ptr, &free_func_ptr);\n      (*free_func_ptr)((void*)ps, std::strlen(ps) + 1);\n      return s;\n   }\n   ~gmp_rational()\n   {\n      if (m_data[0]._mp_num._mp_d || m_data[0]._mp_den._mp_d)\n         mpq_clear(m_data);\n   }\n   void negate()\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_num._mp_d);\n      mpq_neg(m_data, m_data);\n   }\n   int compare(const gmp_rational& o) const\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_num._mp_d && o.m_data[0]._mp_num._mp_d);\n      return mpq_cmp(m_data, o.m_data);\n   }\n   template <class V>\n   int compare(V v) const\n   {\n      gmp_rational d;\n      d = v;\n      return compare(d);\n   }\n   int compare(unsigned long v) const\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_num._mp_d);\n      return mpq_cmp_ui(m_data, v, 1);\n   }\n   int compare(long v) const\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_num._mp_d);\n      return mpq_cmp_si(m_data, v, 1);\n   }\n   mpq_t& data()\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_num._mp_d);\n      return m_data;\n   }\n   const mpq_t& data() const\n   {\n      BOOST_MP_ASSERT(m_data[0]._mp_num._mp_d);\n      return m_data;\n   }\n\n protected:\n   mpq_t m_data;\n};\n\ninline bool eval_is_zero(const gmp_rational& val)\n{\n   return mpq_sgn(val.data()) == 0;\n}\ntemplate <class T>\ninline bool eval_eq(gmp_rational& a, const T& b)\n{\n   return a.compare(b) == 0;\n}\ntemplate <class T>\ninline bool eval_lt(gmp_rational& a, const T& b)\n{\n   return a.compare(b) < 0;\n}\ntemplate <class T>\ninline bool eval_gt(gmp_rational& a, const T& b)\n{\n   return a.compare(b) > 0;\n}\n\ninline void eval_add(gmp_rational& t, const gmp_rational& o)\n{\n   mpq_add(t.data(), t.data(), o.data());\n}\ninline void eval_subtract(gmp_rational& t, const gmp_rational& o)\n{\n   mpq_sub(t.data(), t.data(), o.data());\n}\ninline void eval_multiply(gmp_rational& t, const gmp_rational& o)\n{\n   mpq_mul(t.data(), t.data(), o.data());\n}\ninline void eval_divide(gmp_rational& t, const gmp_rational& o)\n{\n   if (eval_is_zero(o))\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n   mpq_div(t.data(), t.data(), o.data());\n}\ninline void eval_add(gmp_rational& t, const gmp_rational& p, const gmp_rational& o)\n{\n   mpq_add(t.data(), p.data(), o.data());\n}\ninline void eval_subtract(gmp_rational& t, const gmp_rational& p, const gmp_rational& o)\n{\n   mpq_sub(t.data(), p.data(), o.data());\n}\ninline void eval_multiply(gmp_rational& t, const gmp_rational& p, const gmp_rational& o)\n{\n   mpq_mul(t.data(), p.data(), o.data());\n}\ninline void eval_divide(gmp_rational& t, const gmp_rational& p, const gmp_rational& o)\n{\n   if (eval_is_zero(o))\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n   mpq_div(t.data(), p.data(), o.data());\n}\n//\n// operator with scalars:\n//\ninline void eval_add(gmp_rational& result, gmp_rational const& a, gmp_int const& b)\n{\n   // we allow result and a to be the same object here:\n   if (&a != &result)\n   {\n      mpz_set(mpq_numref(result.data()), mpq_numref(a.data()));\n      mpz_set(mpq_denref(result.data()), mpq_denref(a.data()));\n   }\n   mpz_addmul(mpq_numref(result.data()), mpq_denref(a.data()), b.data());\n   // no need to normalize, there can be no common divisor as long as a is already normalized.\n}\ninline void eval_add(gmp_rational& result, gmp_rational const& a, unsigned long b)\n{\n   // we allow result and a to be the same object here:\n   if (&a != &result)\n   {\n      mpz_set(mpq_numref(result.data()), mpq_numref(a.data()));\n      mpz_set(mpq_denref(result.data()), mpq_denref(a.data()));\n   }\n   mpz_addmul_ui(mpq_numref(result.data()), mpq_denref(a.data()), b);\n   // no need to normalize, there can be no common divisor as long as a is already normalized.\n}\ninline void eval_add(gmp_rational& result, gmp_rational const& a, long b)\n{\n   // we allow result and a to be the same object here:\n   if (&a != &result)\n   {\n      mpz_set(mpq_numref(result.data()), mpq_numref(a.data()));\n      mpz_set(mpq_denref(result.data()), mpq_denref(a.data()));\n   }\n\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   if(b > 0)\n      mpz_addmul_ui(mpq_numref(result.data()), mpq_denref(a.data()), static_cast<local_uint_type>(b));\n   else\n      mpz_submul_ui(mpq_numref(result.data()), mpq_denref(a.data()), static_cast<local_uint_type>(-b));\n   // no need to normalize, there can be no common divisor as long as a is already normalized.\n}\ntemplate <class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_integral<T>::value>::type eval_add(gmp_rational& result, gmp_rational const& a, const T& b)\n{\n   gmp_int t;\n   t = b;\n   eval_add(result, a, t);\n}\ntemplate <class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_integral<T>::value>::type eval_add(gmp_rational& result, const T& b, gmp_rational const& a)\n{\n   eval_add(result, a, b);\n}\ntemplate <class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_integral<T>::value>::type eval_add(gmp_rational& result, const T& b)\n{\n   eval_add(result, result, b);\n}\ninline void eval_subtract(gmp_rational& result, gmp_rational const& a, gmp_int const& b)\n{\n   // we allow result and a to be the same object here:\n   if (&a != &result)\n   {\n      mpz_set(mpq_numref(result.data()), mpq_numref(a.data()));\n      mpz_set(mpq_denref(result.data()), mpq_denref(a.data()));\n   }\n   mpz_submul(mpq_numref(result.data()), mpq_denref(a.data()), b.data());\n   // no need to normalize, there can be no common divisor as long as a is already normalized.\n}\ninline void eval_subtract(gmp_rational& result, gmp_rational const& a, unsigned long b)\n{\n   // we allow result and a to be the same object here:\n   if (&a != &result)\n   {\n      mpz_set(mpq_numref(result.data()), mpq_numref(a.data()));\n      mpz_set(mpq_denref(result.data()), mpq_denref(a.data()));\n   }\n   mpz_submul_ui(mpq_numref(result.data()), mpq_denref(a.data()), b);\n   // no need to normalize, there can be no common divisor as long as a is already normalized.\n}\ninline void eval_subtract(gmp_rational& result, gmp_rational const& a, long b)\n{\n   // we allow result and a to be the same object here:\n   if (&a != &result)\n   {\n      mpz_set(mpq_numref(result.data()), mpq_numref(a.data()));\n      mpz_set(mpq_denref(result.data()), mpq_denref(a.data()));\n   }\n\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   if(b > 0)\n      mpz_submul_ui(mpq_numref(result.data()), mpq_denref(a.data()), static_cast<local_uint_type>(b));\n   else\n      mpz_addmul_ui(mpq_numref(result.data()), mpq_denref(a.data()), static_cast<local_uint_type>(-b));\n   // no need to normalize, there can be no common divisor as long as a is already normalized.\n}\ntemplate <class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_integral<T>::value>::type eval_subtract(gmp_rational& result, gmp_rational const& a, const T& b)\n{\n   gmp_int t;\n   t = b;\n   eval_subtract(result, a, t);\n}\ntemplate <class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_integral<T>::value>::type eval_subtract(gmp_rational& result, const T& b, gmp_rational const& a)\n{\n   eval_subtract(result, a, b);\n   result.negate();\n}\ntemplate <class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_integral<T>::value>::type eval_subtract(gmp_rational& result, const T& b)\n{\n   eval_subtract(result, result, b);\n}\n\ninline void eval_multiply(gmp_rational& result, gmp_rational const& a, gmp_int const& b)\n{\n   gmp_int g, t;\n   mpz_gcd(g.data(), mpq_denref(a.data()), b.data());\n   if (!mpz_fits_uint_p(g.data()) || (mpz_get_ui(g.data()) != 1))\n   {\n      // We get here if the gcd is not unity, this is true if the number is\n      // too large for an unsigned long, or if we get an unsigned long and check against 1.\n      eval_divide(t, b, g);\n      mpz_mul(mpq_numref(result.data()), t.data(), mpq_numref(a.data()));\n      mpz_divexact(mpq_denref(result.data()), mpq_denref(a.data()), g.data());\n   }\n   else\n   {\n      // gcd is 1.\n      mpz_mul(mpq_numref(result.data()), mpq_numref(a.data()), b.data());\n      if (&result != &a)\n         mpz_set(mpq_denref(result.data()), mpq_denref(a.data()));\n   }\n}\ninline void eval_multiply(gmp_rational& result, gmp_rational const& a, unsigned long b)\n{\n   if (b == 0)\n   {\n      mpq_set_ui(result.data(), b, 1);\n      return;\n   }\n   if (mpz_sgn(mpq_numref(a.data())) == 0)\n   {\n      result = a;\n      return;\n   }\n   unsigned long g = static_cast<unsigned long>(mpz_gcd_ui(nullptr, mpq_denref(a.data()), b));\n   if (g != 1)\n   {\n      BOOST_MP_ASSERT(g);\n      b /= g;\n      mpz_mul_ui(mpq_numref(result.data()), mpq_numref(a.data()), b);\n      mpz_divexact_ui(mpq_denref(result.data()), mpq_denref(a.data()), g);\n   }\n   else\n   {\n      mpz_mul_ui(mpq_numref(result.data()), mpq_numref(a.data()), b);\n      if (&result != &a)\n         mpz_set(mpq_denref(result.data()), mpq_denref(a.data()));\n   }\n}\ninline void eval_multiply(gmp_rational& result, gmp_rational const& a, long b)\n{\n   eval_multiply(result, a, boost::multiprecision::detail::unsigned_abs(b));\n   if (b < 0)\n      result.negate();\n}\ntemplate <class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_integral<T>::value>::type eval_multiply(gmp_rational& result, gmp_rational const& a, const T& b)\n{\n   gmp_int t;\n   t = b;\n   eval_multiply(result, a, t);\n}\ntemplate <class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_integral<T>::value>::type eval_multiply(gmp_rational& result, const T& b, gmp_rational const& a)\n{\n   eval_multiply(result, a, b);\n}\ntemplate <class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_integral<T>::value>::type eval_multiply(gmp_rational& result, const T& b)\n{\n   eval_multiply(result, result, b);\n}\n\ninline int eval_get_sign(const gmp_rational& val)\n{\n   return mpq_sgn(val.data());\n}\ntemplate <class R>\ninline typename std::enable_if<number_category<R>::value == number_kind_floating_point>::type eval_convert_to(R* result, const gmp_rational& backend)\n{\n   //\n   // The generic conversion is as good as anything we can write here:\n   //\n   // This does not round correctly:\n   //\n   //*result = mpq_get_d(val.data());\n   //\n   // This does:\n   //\n   ::boost::multiprecision::detail::generic_convert_rational_to_float(*result, backend);\n}\n#ifdef BOOST_HAS_FLOAT128\ninline void eval_convert_to(float128_type* result, const gmp_rational& val)\n{\n   using default_ops::eval_convert_to;\n\n   gmp_int n, d;\n   float128_type fn, fd;\n   mpz_set(n.data(), mpq_numref(val.data()));\n   mpz_set(d.data(), mpq_denref(val.data()));\n\n   eval_convert_to(&fn, n);\n   eval_convert_to(&fd, d);\n\n   *result = fn / fd;\n}\n#endif\n\ntemplate <class R>\ninline typename std::enable_if<number_category<R>::value == number_kind_integer>::type eval_convert_to(R* result, const gmp_rational& backend)\n{\n   gmp_int n(mpq_numref(backend.data()));\n   gmp_int d(mpq_denref(backend.data()));\n   using default_ops::eval_divide;\n   eval_divide(n, d);\n   using default_ops::eval_convert_to;\n   eval_convert_to(result, n);\n}\n\ninline void eval_abs(gmp_rational& result, const gmp_rational& val)\n{\n   mpq_abs(result.data(), val.data());\n}\n\ninline void assign_components(gmp_rational& result, unsigned long v1, unsigned long v2)\n{\n   if (v2 == 0u)\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n\n   mpq_set_ui(result.data(), v1, v2);\n   mpq_canonicalize(result.data());\n}\ninline void assign_components(gmp_rational& result, long v1, long v2)\n{\n   if (v2 == 0)\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   if (v2 < 0)\n      mpq_set_si(result.data(), -v1, static_cast<local_uint_type>(-v2));\n   else\n      mpq_set_si(result.data(), v1, static_cast<local_uint_type>(v2));\n\n   mpq_canonicalize(result.data());\n}\ninline void assign_components(gmp_rational& result, gmp_int const& v1, gmp_int const& v2)\n{\n   if (eval_is_zero(v2))\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n\n   mpz_set(mpq_numref(result.data()), v1.data());\n   mpz_set(mpq_denref(result.data()), v2.data());\n   mpq_canonicalize(result.data());\n}\ntemplate <class T, class U>\nvoid assign_components(gmp_rational& result, const T& a, const U& b)\n{\n   gmp_int x, y;\n\n   x = a;\n   y = b;\n\n   if (eval_is_zero(y))\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n\n   std::swap(result.data()[0]._mp_num, x.data()[0]);\n   std::swap(result.data()[0]._mp_den, y.data()[0]);\n   mpq_canonicalize(result.data());\n}\ntemplate <class U>\nvoid assign_components(gmp_rational& result, const gmp_int& a, const U& b)\n{\n   gmp_int y;\n\n   y = b;\n\n   if (eval_is_zero(y))\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n\n   mpz_set(&result.data()[0]._mp_num, a.data());\n   std::swap(result.data()[0]._mp_den, y.data()[0]);\n   mpq_canonicalize(result.data());\n}\ntemplate <class T>\nvoid assign_components(gmp_rational& result, const T& a, const gmp_int& b)\n{\n   if (eval_is_zero(b))\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Division by zero.\"));\n\n   gmp_int x;\n   x = a;\n   std::swap(result.data()[0]._mp_num, x.data()[0]);\n   mpz_set(&result.data()[0]._mp_den, b.data());\n   mpq_canonicalize(result.data());\n}\n\n\ninline std::size_t hash_value(const gmp_rational& val)\n{\n   std::size_t result = 0;\n   for (int i = 0; i < std::abs(val.data()[0]._mp_num._mp_size); ++i)\n      boost::multiprecision::detail::hash_combine(result, val.data()[0]._mp_num._mp_d[i]);\n   for (int i = 0; i < std::abs(val.data()[0]._mp_den._mp_size); ++i)\n      boost::multiprecision::detail::hash_combine(result, val.data()[0]._mp_den._mp_d[i]);\n   boost::multiprecision::detail::hash_combine(result, val.data()[0]._mp_num._mp_size);\n   return result;\n}\n\n//\n// Some useful helpers:\n//\ninline std::size_t used_gmp_int_bits(const gmp_int& val)\n{\n   return eval_msb(val) - eval_lsb(val) + 1;\n}\ninline std::size_t used_gmp_rational_bits(const gmp_rational& val)\n{\n   unsigned d2_d = static_cast<unsigned>(mpz_sizeinbase(mpq_denref(val.data()), 2) - mpz_scan1(mpq_denref(val.data()), 0));\n   unsigned d2_n = static_cast<unsigned>(mpz_sizeinbase(mpq_numref(val.data()), 2) - mpz_scan1(mpq_numref(val.data()), 0));\n   return (std::max)(d2_d, d2_n);\n}\n\n//\n// Some member functions that are dependent upon previous code go here:\n//\ntemplate <unsigned Digits10>\ntemplate <unsigned D>\ninline gmp_float<Digits10>::gmp_float(const gmp_float<D>& o, typename std::enable_if<D <= Digits10>::type*)\n{\n   mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : (unsigned)this->get_default_precision()));\n   mpf_set(this->m_data, o.data());\n}\ntemplate <unsigned Digits10>\ntemplate <unsigned D>\ninline gmp_float<Digits10>::gmp_float(const gmp_float<D>& o, typename std::enable_if< !(D <= Digits10)>::type*)\n{\n   mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : (unsigned)this->get_default_precision()));\n   mpf_set(this->m_data, o.data());\n}\ntemplate <unsigned Digits10>\ninline gmp_float<Digits10>::gmp_float(const gmp_int& o)\n{\n   mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : (unsigned)this->get_default_precision()));\n   mpf_set_z(this->data(), o.data());\n}\ntemplate <unsigned Digits10>\ninline gmp_float<Digits10>::gmp_float(const gmp_rational& o)\n{\n   mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : (unsigned)this->get_default_precision()));\n   mpf_set_q(this->data(), o.data());\n}\ntemplate <unsigned Digits10>\ntemplate <unsigned D>\ninline gmp_float<Digits10>& gmp_float<Digits10>::operator=(const gmp_float<D>& o)\n{\n   if (this->m_data[0]._mp_d == nullptr)\n      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : (unsigned)this->get_default_precision()));\n   mpf_set(this->m_data, o.data());\n   return *this;\n}\ntemplate <unsigned Digits10>\ninline gmp_float<Digits10>& gmp_float<Digits10>::operator=(const gmp_int& o)\n{\n   if (this->m_data[0]._mp_d == nullptr)\n      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : (unsigned)this->get_default_precision()));\n   mpf_set_z(this->data(), o.data());\n   return *this;\n}\ntemplate <unsigned Digits10>\ninline gmp_float<Digits10>& gmp_float<Digits10>::operator=(const gmp_rational& o)\n{\n   if (this->m_data[0]._mp_d == nullptr)\n      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : (unsigned)this->get_default_precision()));\n   mpf_set_q(this->data(), o.data());\n   return *this;\n}\ninline gmp_float<0>::gmp_float(const gmp_int& o) : requested_precision(get_default_precision())\n{\n   if (thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision)\n   {\n      std::size_t d2 = used_gmp_int_bits(o);\n      std::size_t d10 = 1 + multiprecision::detail::digits2_2_10(d2);\n      if (d10 > requested_precision)\n         requested_precision = static_cast<unsigned>(d10);\n   }\n   mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));\n   mpf_set_z(this->data(), o.data());\n}\ninline gmp_float<0>::gmp_float(const gmp_rational& o) : requested_precision(get_default_precision())\n{\n   if (thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision)\n   {\n      std::size_t d10 = 1 + multiprecision::detail::digits2_2_10(used_gmp_rational_bits(o));\n      if (d10 > requested_precision)\n         requested_precision = static_cast<unsigned>(d10);\n   }\n   mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));\n   mpf_set_q(this->data(), o.data());\n}\ninline gmp_float<0>& gmp_float<0>::operator=(const gmp_int& o)\n{\n   if (this->m_data[0]._mp_d == nullptr)\n   {\n      requested_precision = this->get_default_precision();\n      if (thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision)\n      {\n         std::size_t d2 = used_gmp_int_bits(o);\n         std::size_t d10 = 1 + multiprecision::detail::digits2_2_10(d2);\n         if (d10 > requested_precision)\n            requested_precision = static_cast<unsigned>(d10);\n      }\n      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));\n   }\n   else if (thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision)\n   {\n      std::size_t d2 = used_gmp_int_bits(o);\n      std::size_t d10 = 1 + multiprecision::detail::digits2_2_10(d2);\n      if (d10 > requested_precision)\n         this->precision(static_cast<unsigned>(d10));\n   }\n   mpf_set_z(this->data(), o.data());\n   return *this;\n}\ninline gmp_float<0>& gmp_float<0>::operator=(const gmp_rational& o)\n{\n   if (this->m_data[0]._mp_d == nullptr)\n   {\n      requested_precision = this->get_default_precision();\n      if (thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision)\n      {\n         std::size_t d10 = 1 + multiprecision::detail::digits2_2_10(used_gmp_rational_bits(o));\n         if (d10 > requested_precision)\n            requested_precision = static_cast<unsigned>(d10);\n      }\n      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));\n   }\n   else if (thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision)\n   {\n      std::size_t d10 = 1 + multiprecision::detail::digits2_2_10(used_gmp_rational_bits(o));\n      if (d10 > requested_precision)\n         this->precision(static_cast<unsigned>(d10));\n   }\n   mpf_set_q(this->data(), o.data());\n   return *this;\n}\ninline gmp_int::gmp_int(const gmp_rational& o)\n{\n   mpz_init(this->m_data);\n   mpz_set_q(this->m_data, o.data());\n}\ninline gmp_int& gmp_int::operator=(const gmp_rational& o)\n{\n   if (this->m_data[0]._mp_d == nullptr)\n      mpz_init(this->m_data);\n   mpz_set_q(this->m_data, o.data());\n   return *this;\n}\n\n} //namespace backends\n\nusing boost::multiprecision::backends::gmp_float;\nusing boost::multiprecision::backends::gmp_int;\nusing boost::multiprecision::backends::gmp_rational;\n\ntemplate <expression_template_option ExpressionTemplates>\nstruct component_type<number<gmp_rational, ExpressionTemplates> >\n{\n   using type = number<gmp_int, ExpressionTemplates>;\n};\n\ntemplate <expression_template_option ET>\ninline number<gmp_int, ET> numerator(const number<gmp_rational, ET>& val)\n{\n   number<gmp_int, ET> result;\n   mpz_set(result.backend().data(), (mpq_numref(val.backend().data())));\n   return result;\n}\ntemplate <expression_template_option ET>\ninline number<gmp_int, ET> denominator(const number<gmp_rational, ET>& val)\n{\n   number<gmp_int, ET> result;\n   mpz_set(result.backend().data(), (mpq_denref(val.backend().data())));\n   return result;\n}\n\nnamespace detail {\n\ntemplate <>\nstruct digits2<number<gmp_float<0>, et_on> >\n{\n   static long value()\n   {\n      return static_cast<long>(multiprecision::detail::digits10_2_2(gmp_float<0>::thread_default_precision()));\n   }\n};\n\ntemplate <>\nstruct digits2<number<gmp_float<0>, et_off> >\n{\n   static long value()\n   {\n      return static_cast<long>(multiprecision::detail::digits10_2_2(gmp_float<0>::thread_default_precision()));\n   }\n};\n\ntemplate <>\nstruct digits2<number<debug_adaptor<gmp_float<0> >, et_on> >\n{\n   static long value()\n   {\n      return static_cast<long>(multiprecision::detail::digits10_2_2(gmp_float<0>::thread_default_precision()));\n   }\n};\n\ntemplate <>\nstruct digits2<number<debug_adaptor<gmp_float<0> >, et_off> >\n{\n   static long value()\n   {\n      return static_cast<long>(multiprecision::detail::digits10_2_2(gmp_float<0>::thread_default_precision()));\n   }\n};\n\ntemplate <unsigned Digits10>\nstruct transcendental_reduction_type<boost::multiprecision::backends::gmp_float<Digits10> >\n{\n   //\n   // The type used for trigonometric reduction needs 3 times the precision of the base type.\n   // This is double the precision of the original type, plus the largest exponent supported.\n   // As a practical measure the largest argument supported is 1/eps, as supporting larger\n   // arguments requires the division of argument by PI/2 to also be done at higher precision,\n   // otherwise the result (an integer) can not be represented exactly.\n   //\n   // See ARGUMENT REDUCTION FOR HUGE ARGUMENTS. K C Ng.\n   //\n   using type = boost::multiprecision::backends::gmp_float<Digits10 * 3>;\n};\n\n\n} // namespace detail\n\ntemplate <>\nstruct number_category<detail::canonical<mpz_t, gmp_int>::type> : public std::integral_constant<int, number_kind_integer>\n{};\ntemplate <>\nstruct number_category<detail::canonical<mpq_t, gmp_rational>::type> : public std::integral_constant<int, number_kind_rational>\n{};\ntemplate <>\nstruct number_category<detail::canonical<mpf_t, gmp_float<0> >::type> : public std::integral_constant<int, number_kind_floating_point>\n{};\n\nnamespace detail {\ntemplate <>\nstruct is_variable_precision<backends::gmp_float<0> > : public std::integral_constant<bool, true>\n{};\n} // namespace detail\n\nusing mpf_float_50 = number<gmp_float<50> >;\nusing mpf_float_100 = number<gmp_float<100> >;\nusing mpf_float_500 = number<gmp_float<500> >;\nusing mpf_float_1000 = number<gmp_float<1000> >;\nusing mpf_float = number<gmp_float<0> >;\nusing mpz_int = number<gmp_int>;\nusing mpq_rational = number<gmp_rational>;\n\n} // namespace multiprecision\n\nnamespace math { namespace tools {\n\n#ifndef BOOST_MP_MATH_AVAILABLE\n\ntemplate <typename T>\ninline int digits();\n\ntemplate <typename T>\ninline T max_value();\n\ntemplate <typename T>\ninline T min_value();\n\n#endif // BOOST_MP_MATH_AVAILABLE\n\ninline void set_output_precision(const boost::multiprecision::mpf_float& val, std::ostream& os)\n{\n   const int sz_prec = static_cast<int>(val.precision());\n\n   os << std::setprecision(sz_prec);\n}\n\ntemplate <>\ninline int digits<boost::multiprecision::mpf_float>()\n#ifdef BOOST_MATH_NOEXCEPT\n    noexcept\n#endif\n{\n   return static_cast<int>(multiprecision::detail::digits10_2_2(boost::multiprecision::mpf_float::thread_default_precision()));\n}\ntemplate <>\ninline int digits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, boost::multiprecision::et_off> >()\n#ifdef BOOST_MATH_NOEXCEPT\n    noexcept\n#endif\n{\n   return static_cast<int>(multiprecision::detail::digits10_2_2(boost::multiprecision::mpf_float::thread_default_precision()));\n}\n\ntemplate <>\ninline boost::multiprecision::mpf_float\nmax_value<boost::multiprecision::mpf_float>()\n{\n   boost::multiprecision::mpf_float result(0.5);\n   mpf_mul_2exp(result.backend().data(), result.backend().data(), (std::numeric_limits<mp_exp_t>::max)() / 64 + 1);\n   return result;\n}\n\ntemplate <>\ninline boost::multiprecision::mpf_float\nmin_value<boost::multiprecision::mpf_float>()\n{\n   boost::multiprecision::mpf_float result(0.5);\n   mpf_div_2exp(result.backend().data(), result.backend().data(), (std::numeric_limits<mp_exp_t>::max)() / 64 + 1);\n   return result;\n}\n\ntemplate <>\ninline boost::multiprecision::number<boost::multiprecision::gmp_float<0>, boost::multiprecision::et_off>\nmax_value<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, boost::multiprecision::et_off> >()\n{\n   boost::multiprecision::number<boost::multiprecision::gmp_float<0>, boost::multiprecision::et_off> result(0.5);\n   mpf_mul_2exp(result.backend().data(), result.backend().data(), (std::numeric_limits<mp_exp_t>::max)() / 64 + 1);\n   return result;\n}\n\ntemplate <>\ninline boost::multiprecision::number<boost::multiprecision::gmp_float<0>, boost::multiprecision::et_off>\nmin_value<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, boost::multiprecision::et_off> >()\n{\n   boost::multiprecision::number<boost::multiprecision::gmp_float<0>, boost::multiprecision::et_off> result(0.5);\n   mpf_div_2exp(result.backend().data(), result.backend().data(), (std::numeric_limits<mp_exp_t>::max)() / 64 + 1);\n   return result;\n}\n\ntemplate <>\ninline int digits<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpf_float::backend_type> > >()\n#ifdef BOOST_MATH_NOEXCEPT\n    noexcept\n#endif\n{\n   return static_cast<int>(multiprecision::detail::digits10_2_2(boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpf_float::backend_type> >::thread_default_precision()));\n}\ntemplate <>\ninline int digits<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::gmp_float<0> >, boost::multiprecision::et_off> >()\n#ifdef BOOST_MATH_NOEXCEPT\n    noexcept\n#endif\n{\n   return static_cast<int>(multiprecision::detail::digits10_2_2(boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpf_float::backend_type> >::thread_default_precision()));\n}\n\ntemplate <>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpf_float::backend_type> >\nmax_value<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpf_float::backend_type> > >()\n{\n   return max_value<boost::multiprecision::mpf_float>().backend();\n}\n\ntemplate <>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpf_float::backend_type> >\nmin_value<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpf_float::backend_type> > >()\n{\n   return min_value<boost::multiprecision::mpf_float>().backend();\n}\n\ntemplate <>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::gmp_float<0> >, boost::multiprecision::et_off>\nmax_value<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::gmp_float<0> >, boost::multiprecision::et_off> >()\n{\n   return max_value<boost::multiprecision::mpf_float>().backend();\n}\n\ntemplate <>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::gmp_float<0> >, boost::multiprecision::et_off>\nmin_value<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::gmp_float<0> >, boost::multiprecision::et_off> >()\n{\n   return min_value<boost::multiprecision::mpf_float>().backend();\n}\n\n}} // namespace math::tools\n\n} // namespace boost\n\nnamespace std {\n\n//\n// numeric_limits [partial] specializations for the types declared in this header:\n//\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nclass numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >\n{\n   using number_type = boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates>;\n\n   //\n   // min and max values chosen so as to not cause segfaults when calling\n   // mpf_get_str on 64-bit Linux builds.  Possibly we could use larger\n   // exponent values elsewhere.\n   //\n   static number_type calc_min()\n   {\n      number_type result(1);\n      mpf_div_2exp(result.backend().data(), result.backend().data(), (std::numeric_limits<mp_exp_t>::max)() / 64 + 1);\n      return result;\n   }\n   static number_type calc_max()\n   {\n      number_type result(1);\n      mpf_mul_2exp(result.backend().data(), result.backend().data(), (std::numeric_limits<mp_exp_t>::max)() / 64 + 1);\n      return result;\n   }\n   static number_type calc_epsilon()\n   {\n      number_type result(1);\n      mpf_div_2exp(result.backend().data(), result.backend().data(), std::numeric_limits<number_type>::digits - 1);\n      return result;\n   }\n\n\n public:\n   static constexpr bool is_specialized = true;\n   static number_type(min)()\n   {\n      // rely on C++11 thread safe initialization of statics:\n      static const number_type value{calc_min()};\n      return value;\n   }\n   static number_type(max)()\n   {\n      static number_type value{calc_max()};\n      return value;\n   }\n   static constexpr number_type lowest()\n   {\n      return -(max)();\n   }\n   static constexpr int digits   = static_cast<int>((Digits10 * 1000L) / 301L + ((Digits10 * 1000L) % 301L ? 2 : 1));\n   static constexpr int digits10 = Digits10;\n   // Have to allow for a possible extra limb inside the gmp data structure:\n   static constexpr int  max_digits10 = Digits10 + 3 + ((GMP_LIMB_BITS * 301L) / 1000L);\n   static constexpr bool is_signed    = true;\n   static constexpr bool is_integer   = false;\n   static constexpr bool is_exact     = false;\n   static constexpr int  radix        = 2;\n   static number_type          epsilon()\n   {\n      static const number_type value{calc_epsilon()};\n      return value;\n   }\n   // What value should this be????\n   static number_type round_error()\n   {\n      return 1;\n   }\n   static constexpr long               min_exponent      = LONG_MIN;\n   static constexpr long               min_exponent10    = (LONG_MIN / 1000) * 301L;\n   static constexpr long               max_exponent      = LONG_MAX;\n   static constexpr long               max_exponent10    = (LONG_MAX / 1000) * 301L;\n   static constexpr bool               has_infinity      = false;\n   static constexpr bool               has_quiet_NaN     = false;\n   static constexpr bool               has_signaling_NaN = false;\n   static constexpr float_denorm_style has_denorm        = denorm_absent;\n   static constexpr bool               has_denorm_loss   = false;\n   static constexpr number_type        infinity() { return number_type(); }\n   static constexpr number_type        quiet_NaN() { return number_type(); }\n   static constexpr number_type        signaling_NaN() { return number_type(); }\n   static constexpr number_type        denorm_min() { return number_type(); }\n   static constexpr bool               is_iec559       = false;\n   static constexpr bool               is_bounded      = true;\n   static constexpr bool               is_modulo       = false;\n   static constexpr bool               traps           = true;\n   static constexpr bool               tinyness_before = false;\n   static constexpr float_round_style  round_style     = round_indeterminate;\n};\n\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::digits;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::digits10;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::max_digits10;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::is_signed;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::is_integer;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::is_exact;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::radix;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr long numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::min_exponent;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr long numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::min_exponent10;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr long numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::max_exponent;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr long numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::max_exponent10;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::has_infinity;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::has_quiet_NaN;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::has_signaling_NaN;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_denorm_style numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::has_denorm;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::has_denorm_loss;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::is_iec559;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::is_bounded;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::is_modulo;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::traps;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::tinyness_before;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_round_style numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<Digits10>, ExpressionTemplates> >::round_style;\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nclass numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >\n{\n   using number_type = boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates>;\n\n public:\n   static constexpr bool is_specialized = false;\n   static number_type(min)() { return number_type(); }\n   static number_type(max)() { return number_type(); }\n   static number_type                        lowest() { return number_type(); }\n   static constexpr int                digits       = 0;\n   static constexpr int                digits10     = 0;\n   static constexpr int                max_digits10 = 0;\n   static constexpr bool               is_signed    = false;\n   static constexpr bool               is_integer   = false;\n   static constexpr bool               is_exact     = false;\n   static constexpr int                radix        = 0;\n   static number_type                        epsilon() { return number_type(); }\n   static number_type                        round_error() { return number_type(); }\n   static constexpr int                min_exponent      = 0;\n   static constexpr int                min_exponent10    = 0;\n   static constexpr int                max_exponent      = 0;\n   static constexpr int                max_exponent10    = 0;\n   static constexpr bool               has_infinity      = false;\n   static constexpr bool               has_quiet_NaN     = false;\n   static constexpr bool               has_signaling_NaN = false;\n   static constexpr float_denorm_style has_denorm        = denorm_absent;\n   static constexpr bool               has_denorm_loss   = false;\n   static number_type                        infinity() { return number_type(); }\n   static number_type                        quiet_NaN() { return number_type(); }\n   static number_type                        signaling_NaN() { return number_type(); }\n   static number_type                        denorm_min() { return number_type(); }\n   static constexpr bool               is_iec559       = false;\n   static constexpr bool               is_bounded      = false;\n   static constexpr bool               is_modulo       = false;\n   static constexpr bool               traps           = false;\n   static constexpr bool               tinyness_before = false;\n   static constexpr float_round_style  round_style     = round_indeterminate;\n};\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::digits;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::digits10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::max_digits10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::is_signed;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::is_integer;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::is_exact;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::radix;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::min_exponent;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::min_exponent10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::max_exponent;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::max_exponent10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::has_infinity;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::has_quiet_NaN;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::has_signaling_NaN;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_denorm_style numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::has_denorm;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::has_denorm_loss;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::is_iec559;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::is_bounded;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::is_modulo;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::traps;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::tinyness_before;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_round_style numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >::round_style;\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nclass numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >\n{\n   using number_type = boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates>;\n\n public:\n   static constexpr bool is_specialized = true;\n   //\n   // Largest and smallest numbers are bounded only by available memory, set\n   // to zero:\n   //\n   static number_type(min)()\n   {\n      return number_type();\n   }\n   static number_type(max)()\n   {\n      return number_type();\n   }\n   static number_type                        lowest() { return (min)(); }\n   static constexpr int                digits       = INT_MAX;\n   static constexpr int                digits10     = (INT_MAX / 1000) * 301L;\n   static constexpr int                max_digits10 = digits10 + 3;\n   static constexpr bool               is_signed    = true;\n   static constexpr bool               is_integer   = true;\n   static constexpr bool               is_exact     = true;\n   static constexpr int                radix        = 2;\n   static number_type                        epsilon() { return number_type(); }\n   static number_type                        round_error() { return number_type(); }\n   static constexpr int                min_exponent      = 0;\n   static constexpr int                min_exponent10    = 0;\n   static constexpr int                max_exponent      = 0;\n   static constexpr int                max_exponent10    = 0;\n   static constexpr bool               has_infinity      = false;\n   static constexpr bool               has_quiet_NaN     = false;\n   static constexpr bool               has_signaling_NaN = false;\n   static constexpr float_denorm_style has_denorm        = denorm_absent;\n   static constexpr bool               has_denorm_loss   = false;\n   static number_type                        infinity() { return number_type(); }\n   static number_type                        quiet_NaN() { return number_type(); }\n   static number_type                        signaling_NaN() { return number_type(); }\n   static number_type                        denorm_min() { return number_type(); }\n   static constexpr bool               is_iec559       = false;\n   static constexpr bool               is_bounded      = false;\n   static constexpr bool               is_modulo       = false;\n   static constexpr bool               traps           = false;\n   static constexpr bool               tinyness_before = false;\n   static constexpr float_round_style  round_style     = round_toward_zero;\n};\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::digits;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::digits10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::max_digits10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::is_signed;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::is_integer;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::is_exact;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::radix;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::min_exponent;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::min_exponent10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::max_exponent;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::max_exponent10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::has_infinity;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::has_quiet_NaN;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::has_signaling_NaN;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_denorm_style numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::has_denorm;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::has_denorm_loss;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::is_iec559;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::is_bounded;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::is_modulo;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::traps;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::tinyness_before;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_round_style numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_int, ExpressionTemplates> >::round_style;\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nclass numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >\n{\n   using number_type = boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates>;\n\n public:\n   static constexpr bool is_specialized = true;\n   //\n   // Largest and smallest numbers are bounded only by available memory, set\n   // to zero:\n   //\n   static number_type(min)()\n   {\n      return number_type();\n   }\n   static number_type(max)()\n   {\n      return number_type();\n   }\n   static number_type lowest() { return (min)(); }\n   // Digits are unbounded, use zero for now:\n   static constexpr int                digits       = INT_MAX;\n   static constexpr int                digits10     = (INT_MAX / 1000) * 301L;\n   static constexpr int                max_digits10 = digits10 + 3;\n   static constexpr bool               is_signed    = true;\n   static constexpr bool               is_integer   = false;\n   static constexpr bool               is_exact     = true;\n   static constexpr int                radix        = 2;\n   static number_type                        epsilon() { return number_type(); }\n   static number_type                        round_error() { return number_type(); }\n   static constexpr int                min_exponent      = 0;\n   static constexpr int                min_exponent10    = 0;\n   static constexpr int                max_exponent      = 0;\n   static constexpr int                max_exponent10    = 0;\n   static constexpr bool               has_infinity      = false;\n   static constexpr bool               has_quiet_NaN     = false;\n   static constexpr bool               has_signaling_NaN = false;\n   static constexpr float_denorm_style has_denorm        = denorm_absent;\n   static constexpr bool               has_denorm_loss   = false;\n   static number_type                        infinity() { return number_type(); }\n   static number_type                        quiet_NaN() { return number_type(); }\n   static number_type                        signaling_NaN() { return number_type(); }\n   static number_type                        denorm_min() { return number_type(); }\n   static constexpr bool               is_iec559       = false;\n   static constexpr bool               is_bounded      = false;\n   static constexpr bool               is_modulo       = false;\n   static constexpr bool               traps           = false;\n   static constexpr bool               tinyness_before = false;\n   static constexpr float_round_style  round_style     = round_toward_zero;\n};\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::digits;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::digits10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::max_digits10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::is_signed;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::is_integer;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::is_exact;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::radix;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::min_exponent;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::min_exponent10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::max_exponent;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::max_exponent10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::has_infinity;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::has_quiet_NaN;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::has_signaling_NaN;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_denorm_style numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::has_denorm;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::has_denorm_loss;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::is_iec559;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::is_bounded;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::is_modulo;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::traps;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::tinyness_before;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_round_style numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_rational, ExpressionTemplates> >::round_style;\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n} // namespace std\n\nnamespace Eigen\n{\n\n   template <class B1, class B2>\n   struct NumTraitsImp;\n\n   template <boost::multiprecision::expression_template_option ExpressionTemplates>\n   struct NumTraitsImp<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates>, boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates> >\n   {\n      using self_type = boost::multiprecision::number<boost::multiprecision::gmp_float<0>, ExpressionTemplates>;\n      using Real = typename boost::multiprecision::scalar_result_from_possible_complex<self_type>::type;\n      using NonInteger = self_type; // Not correct but we can't do much better??\n      using Literal = double;\n      using Nested = self_type;\n      enum\n      {\n         IsComplex = boost::multiprecision::number_category<self_type>::value == boost::multiprecision::number_kind_complex,\n         IsInteger = boost::multiprecision::number_category<self_type>::value == boost::multiprecision::number_kind_integer,\n         ReadCost = 1,\n         AddCost = 4,\n         MulCost = 8,\n         IsSigned = std::numeric_limits<self_type>::is_specialized ? std::numeric_limits<self_type>::is_signed : true,\n         RequireInitialization = 1,\n      };\n\n      static Real highest() noexcept\n      {\n         return boost::math::tools::max_value<Real>();\n      }\n      static Real lowest() noexcept\n      {\n         return boost::math::tools::min_value<Real>();\n      }\n      static int digits() noexcept\n      {\n         return boost::math::tools::digits<Real>();\n      }\n      static int digits10()\n      {\n         return Real::thread_default_precision();\n      }\n      static Real epsilon()\n      {\n         return ldexp(Real(1), 1 - digits());\n      }\n      static Real dummy_precision()\n      {\n         return 1000 * epsilon();\n      }\n      static constexpr long min_exponent() noexcept\n      {\n         return LONG_MIN;\n      }\n      static constexpr long max_exponent() noexcept\n      {\n         return LONG_MAX;\n      }\n      static Real infinity()\n      {\n         return Real();\n      }\n      static Real quiet_NaN()\n      {\n         return Real();\n      }\n   };\n\n}\n\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/integer.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012-21 John Maddock.\n//  Copyright 2021 Iskandarov Lev. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_INTEGER_HPP\n#define BOOST_MP_INTEGER_HPP\n\n#include <type_traits>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/detail/bitscan.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n\nnamespace boost {\nnamespace multiprecision {\n\ntemplate <class Integer, class I2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value && boost::multiprecision::detail::is_integral<I2>::value, Integer&>::type\nmultiply(Integer& result, const I2& a, const I2& b)\n{\n   return result = static_cast<Integer>(a) * static_cast<Integer>(b);\n}\ntemplate <class Integer, class I2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value && boost::multiprecision::detail::is_integral<I2>::value, Integer&>::type\nadd(Integer& result, const I2& a, const I2& b)\n{\n   return result = static_cast<Integer>(a) + static_cast<Integer>(b);\n}\ntemplate <class Integer, class I2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value && boost::multiprecision::detail::is_integral<I2>::value, Integer&>::type\nsubtract(Integer& result, const I2& a, const I2& b)\n{\n   return result = static_cast<Integer>(a) - static_cast<Integer>(b);\n}\n\ntemplate <class Integer>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value>::type divide_qr(const Integer& x, const Integer& y, Integer& q, Integer& r)\n{\n   q = x / y;\n   r = x % y;\n}\n\ntemplate <class I1, class I2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<I1>::value && boost::multiprecision::detail::is_integral<I2>::value, I2>::type integer_modulus(const I1& x, I2 val)\n{\n   return static_cast<I2>(x % val);\n}\n\nnamespace detail {\n//\n// Figure out the kind of integer that has twice as many bits as some builtin\n// integer type I.  Use a native type if we can (including types which may not\n// be recognised by boost::int_t because they're larger than long long),\n// otherwise synthesize a cpp_int to do the job.\n//\ntemplate <class I>\nstruct double_integer\n{\n   static constexpr const unsigned int_t_digits =\n       2 * sizeof(I) <= sizeof(long long) ? std::numeric_limits<I>::digits * 2 : 1;\n\n   using type = typename std::conditional<\n       2 * sizeof(I) <= sizeof(long long),\n       typename std::conditional<\n           boost::multiprecision::detail::is_signed<I>::value && boost::multiprecision::detail::is_integral<I>::value,\n           typename boost::multiprecision::detail::int_t<int_t_digits>::least,\n           typename boost::multiprecision::detail::uint_t<int_t_digits>::least>::type,\n       typename std::conditional<\n           2 * sizeof(I) <= sizeof(double_limb_type),\n           typename std::conditional<\n               boost::multiprecision::detail::is_signed<I>::value && boost::multiprecision::detail::is_integral<I>::value,\n               signed_double_limb_type,\n               double_limb_type>::type,\n           number<cpp_int_backend<sizeof(I) * CHAR_BIT * 2, sizeof(I) * CHAR_BIT * 2, (boost::multiprecision::detail::is_signed<I>::value ? signed_magnitude : unsigned_magnitude), unchecked, void> > >::type>::type;\n};\n\n} // namespace detail\n\ntemplate <class I1, class I2, class I3>\nBOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<I1>::value && boost::multiprecision::detail::is_unsigned<I2>::value && boost::multiprecision::detail::is_integral<I3>::value, I1>::type\npowm(const I1& a, I2 b, I3 c)\n{\n   using double_type = typename detail::double_integer<I1>::type;\n\n   I1          x(1), y(a);\n   double_type result(0);\n\n   while (b > 0)\n   {\n      if (b & 1)\n      {\n         multiply(result, x, y);\n         x = integer_modulus(result, c);\n      }\n      multiply(result, y, y);\n      y = integer_modulus(result, c);\n      b >>= 1;\n   }\n   return x % c;\n}\n\ntemplate <class I1, class I2, class I3>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<I1>::value && boost::multiprecision::detail::is_signed<I2>::value && boost::multiprecision::detail::is_integral<I2>::value && boost::multiprecision::detail::is_integral<I3>::value, I1>::type\npowm(const I1& a, I2 b, I3 c)\n{\n   if (b < 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"powm requires a positive exponent.\"));\n   }\n   return powm(a, static_cast<typename boost::multiprecision::detail::make_unsigned<I2>::type>(b), c);\n}\n\ntemplate <class Integer>\nBOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value, std::size_t>::type lsb(const Integer& val)\n{\n   if (val <= 0)\n   {\n      if (val == 0)\n      {\n         BOOST_MP_THROW_EXCEPTION(std::domain_error(\"No bits were set in the operand.\"));\n      }\n      else\n      {\n         BOOST_MP_THROW_EXCEPTION(std::domain_error(\"Testing individual bits in negative values is not supported - results are undefined.\"));\n      }\n   }\n   return detail::find_lsb(val);\n}\n\ntemplate <class Integer>\nBOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value, std::size_t>::type msb(Integer val)\n{\n   if (val <= 0)\n   {\n      if (val == 0)\n      {\n         BOOST_MP_THROW_EXCEPTION(std::domain_error(\"No bits were set in the operand.\"));\n      }\n      else\n      {\n         BOOST_MP_THROW_EXCEPTION(std::domain_error(\"Testing individual bits in negative values is not supported - results are undefined.\"));\n      }\n   }\n   return detail::find_msb(val);\n}\n\ntemplate <class Integer>\nBOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value, bool>::type bit_test(const Integer& val, std::size_t index)\n{\n   Integer mask = 1;\n   if (index >= sizeof(Integer) * CHAR_BIT)\n      return 0;\n   if (index)\n      mask <<= index;\n   return val & mask ? true : false;\n}\n\ntemplate <class Integer>\nBOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value, Integer&>::type bit_set(Integer& val, std::size_t index)\n{\n   Integer mask = 1;\n   if (index >= sizeof(Integer) * CHAR_BIT)\n      return val;\n   if (index)\n      mask <<= index;\n   val |= mask;\n   return val;\n}\n\ntemplate <class Integer>\nBOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value, Integer&>::type bit_unset(Integer& val, std::size_t index)\n{\n   Integer mask = 1;\n   if (index >= sizeof(Integer) * CHAR_BIT)\n      return val;\n   if (index)\n      mask <<= index;\n   val &= ~mask;\n   return val;\n}\n\ntemplate <class Integer>\nBOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value, Integer&>::type bit_flip(Integer& val, std::size_t index)\n{\n   Integer mask = 1;\n   if (index >= sizeof(Integer) * CHAR_BIT)\n      return val;\n   if (index)\n      mask <<= index;\n   val ^= mask;\n   return val;\n}\n\nnamespace detail {\n\ntemplate <class Integer>\nBOOST_MP_CXX14_CONSTEXPR Integer karatsuba_sqrt(const Integer& x, Integer& r, size_t bits)\n{\n   //\n   // Define the floating point type used for std::sqrt, in our tests, sqrt(double) and sqrt(long double) take\n   // about the same amount of time as long as long double is not an emulated 128-bit type (ie the same type\n   // as __float128 from libquadmath).  So only use long double if it's an 80-bit type:\n   //\n#ifndef __clang__\n   typedef typename std::conditional<(std::numeric_limits<long double>::digits == 64), long double, double>::type real_cast_type;\n#else\n   // clang has buggy __int128 -> long double conversion:\n   typedef double real_cast_type;\n#endif\n   //\n   // As per the Karatsuba sqrt algorithm, the low order bits/4 bits pay no part in the result, only in the remainder,\n   // so define the number of bits our argument must have before passing to std::sqrt is safe, even if doing so\n   // looses a few bits:\n   //\n   constexpr std::size_t cutoff = (std::numeric_limits<real_cast_type>::digits * 4) / 3;\n   //\n   // Type which can hold at least \"cutoff\" bits:\n   // \n#ifdef BOOST_HAS_INT128\n   using cutoff_t = typename std::conditional<(cutoff > 64), uint128_type, std::uint64_t>::type;\n#else\n   using cutoff_t = std::uint64_t;\n#endif\n   //\n   // See if we can take the fast path:\n   //\n   if (bits <= cutoff)\n   {\n      constexpr cutoff_t half_bits = (cutoff_t(1u) << ((sizeof(cutoff_t) * CHAR_BIT) / 2)) - 1;\n      cutoff_t       val = static_cast<cutoff_t>(x);\n      real_cast_type real_val = static_cast<real_cast_type>(val);\n      cutoff_t       s64 = static_cast<cutoff_t>(std::sqrt(real_val));\n      // converting to long double can loose some precision, and `sqrt` can give eps error, so we'll fix this\n      // this is needed\n      while ((s64 > half_bits) || (s64 * s64 > val))\n         s64--;\n      // in my tests this never fired, but theoretically this might be needed\n      while ((s64 < half_bits) && ((s64 + 1) * (s64 + 1) <= val))\n         s64++;\n      r = static_cast<Integer>(val - s64 * s64);\n      return static_cast<Integer>(s64);\n   }\n   // https://hal.inria.fr/file/index/docid/72854/filename/RR-3805.pdf\n   std::size_t b = bits / 4;\n   Integer q = x;\n   q >>= b * 2;\n   Integer s = karatsuba_sqrt(q, r, bits - b * 2);\n   Integer t = 0u;\n   bit_set(t, static_cast<unsigned>(b * 2));\n   r <<= b;\n   t--;\n   t &= x;\n   t >>= b;\n   t += r;\n   s <<= 1;\n   divide_qr(t, s, q, r);\n   r <<= b;\n   t = 0u;\n   bit_set(t, static_cast<unsigned>(b));\n   t--;\n   t &= x;\n   r += t;\n   s <<= (b - 1); // we already <<1 it before\n   s += q;\n   q *= q;\n   // we substract after, so it works for unsigned integers too\n   if (r < q)\n   {\n      t = s;\n      t <<= 1;\n      t--;\n      r += t;\n      s--;\n   }\n   r -= q;\n   return s;\n}\n\ntemplate <class Integer>\nBOOST_MP_CXX14_CONSTEXPR Integer bitwise_sqrt(const Integer& x, Integer& r)\n{\n   //\n   // This is slow bit-by-bit integer square root, see for example\n   // http://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Binary_numeral_system_.28base_2.29\n   // There are better methods such as http://hal.inria.fr/docs/00/07/28/54/PDF/RR-3805.pdf\n   // and http://hal.inria.fr/docs/00/07/21/13/PDF/RR-4475.pdf which should be implemented\n   // at some point.\n   //\n   Integer s = 0;\n   switch (x)\n   {\n   case 0:\n      r = 0;\n      return s;\n   case 1:\n      r = 0;\n      return 1;\n   case 2:\n      r = 1;\n      return 1;\n   case 3:\n      r = 2;\n      return 1;\n   default:\n      break;\n      // fall through:\n   }\n   std::ptrdiff_t g = msb(x);\n\n   Integer t = 0;\n   r = x;\n   g /= 2;\n   bit_set(s, g);\n   bit_set(t, 2 * g);\n   r = x - t;\n   --g;\n   do\n   {\n      t = s;\n      t <<= g + 1;\n      bit_set(t, 2 * g);\n      if (t <= r)\n      {\n         bit_set(s, g);\n         r -= t;\n      }\n      --g;\n   } while (g >= 0);\n   return s;\n}\n\n} // namespace detail\n\ntemplate <class Integer>\nBOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value, Integer>::type sqrt(const Integer& x, Integer& r)\n{\n#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION\n   // recursive Karatsuba sqrt can cause issues in constexpr context:\n   if (BOOST_MP_IS_CONST_EVALUATED(x))\n   {\n      return detail::bitwise_sqrt(x, r);\n   }\n#endif\n   if (x == 0u) {\n      r = 0u;\n      return 0u;\n   }\n\n   return detail::karatsuba_sqrt(x, r, msb(x) + 1);\n}\n\ntemplate <class Integer>\nBOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value, Integer>::type sqrt(const Integer& x)\n{\n   Integer r(0);\n   return sqrt(x, r);\n}\n\n}} // namespace boost::multiprecision\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/logged_adaptor.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_LOGGED_ADAPTER_HPP\n#define BOOST_MP_LOGGED_ADAPTER_HPP\n\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/traits/extract_exponent_type.hpp>\n#include <boost/multiprecision/detail/integer_ops.hpp>\n\nnamespace boost {\nnamespace multiprecision {\n\ntemplate <class Backend>\ninline void log_postfix_event(const Backend&, const char* /*event_description*/)\n{\n}\ntemplate <class Backend, class T>\ninline void log_postfix_event(const Backend&, const T&, const char* /*event_description*/)\n{\n}\ntemplate <class Backend>\ninline void log_prefix_event(const Backend&, const char* /*event_description*/)\n{\n}\ntemplate <class Backend, class T>\ninline void log_prefix_event(const Backend&, const T&, const char* /*event_description*/)\n{\n}\ntemplate <class Backend, class T, class U>\ninline void log_prefix_event(const Backend&, const T&, const U&, const char* /*event_description*/)\n{\n}\ntemplate <class Backend, class T, class U, class V>\ninline void log_prefix_event(const Backend&, const T&, const U&, const V&, const char* /*event_description*/)\n{\n}\n\nnamespace backends {\n\ntemplate <class Backend>\nstruct logged_adaptor\n{\n   using signed_types = typename Backend::signed_types  ;\n   using unsigned_types = typename Backend::unsigned_types;\n   using float_types = typename Backend::float_types   ;\n   using exponent_type = typename extract_exponent_type<Backend, number_category<Backend>::value>::type;\n\n private:\n   Backend m_value;\n\n public:\n   logged_adaptor()\n   {\n      log_postfix_event(m_value, \"Default construct\");\n   }\n   logged_adaptor(const logged_adaptor& o)\n   {\n      log_prefix_event(m_value, o.value(), \"Copy construct\");\n      m_value = o.m_value;\n      log_postfix_event(m_value, \"Copy construct\");\n   }\n   // rvalue copy\n   logged_adaptor(logged_adaptor&& o)\n   {\n      log_prefix_event(m_value, o.value(), \"Move construct\");\n      m_value = static_cast<Backend&&>(o.m_value);\n      log_postfix_event(m_value, \"Move construct\");\n   }\n   logged_adaptor& operator=(logged_adaptor&& o)\n   {\n      log_prefix_event(m_value, o.value(), \"Move Assignment\");\n      m_value = static_cast<Backend&&>(o.m_value);\n      log_postfix_event(m_value, \"Move construct\");\n      return *this;\n   }\n   logged_adaptor& operator=(const logged_adaptor& o)\n   {\n      log_prefix_event(m_value, o.value(), \"Assignment\");\n      m_value = o.m_value;\n      log_postfix_event(m_value, \"Copy construct\");\n      return *this;\n   }\n   template <class T>\n   logged_adaptor(const T& i, const typename std::enable_if<std::is_convertible<T, Backend>::value>::type* = nullptr)\n       : m_value(i)\n   {\n      log_postfix_event(m_value, \"construct from arithmetic type\");\n   }\n   template <class T>\n   logged_adaptor(const logged_adaptor<T>& i, const typename std::enable_if<std::is_convertible<T, Backend>::value>::type* = nullptr)\n       : m_value(i.value())\n   {\n      log_postfix_event(m_value, \"construct from arithmetic type\");\n   }\n   template <class T, class U>\n   logged_adaptor(const T& i, const U& j, typename std::enable_if<std::is_constructible<Backend, const T&, const U&>::value>::type* = nullptr)\n      : m_value(i, j)\n   {\n      log_postfix_event(m_value, \"construct from a pair of arithmetic types\");\n   }\n   template <class D = Backend>\n   logged_adaptor(const Backend& i, unsigned digits10, typename std::enable_if<std::is_constructible<D, Backend const&, unsigned>::value>::type const* = nullptr)\n      : m_value(i, digits10)\n   {\n      log_postfix_event(m_value, \"construct from arithmetic type and precision\");\n   }\n   template <class D = Backend>\n   logged_adaptor(const logged_adaptor<Backend>& i, unsigned digits10, typename std::enable_if<std::is_constructible<D, Backend const&, unsigned>::value>::type const* = nullptr)\n      : m_value(i.value(), digits10)\n   {\n      log_postfix_event(m_value, \"construct from arithmetic type and precision\");\n   }\n   template <class T>\n   typename std::enable_if<boost::multiprecision::detail::is_arithmetic<T>::value || std::is_assignable<Backend, T>::value, logged_adaptor&>::type operator=(const T& i)\n   {\n      log_prefix_event(m_value, i, \"Assignment from arithmetic type\");\n      m_value = i;\n      log_postfix_event(m_value, \"Assignment from arithmetic type\");\n      return *this;\n   }\n   logged_adaptor& operator=(const char* s)\n   {\n      log_prefix_event(m_value, s, \"Assignment from string type\");\n      m_value = s;\n      log_postfix_event(m_value, \"Assignment from string type\");\n      return *this;\n   }\n   void swap(logged_adaptor& o)\n   {\n      log_prefix_event(m_value, o.value(), \"swap\");\n      std::swap(m_value, o.value());\n      log_postfix_event(m_value, \"swap\");\n   }\n   std::string str(std::streamsize digits, std::ios_base::fmtflags f) const\n   {\n      log_prefix_event(m_value, \"Conversion to string\");\n      std::string s = m_value.str(digits, f);\n      log_postfix_event(m_value, s, \"Conversion to string\");\n      return s;\n   }\n   void negate()\n   {\n      log_prefix_event(m_value, \"negate\");\n      m_value.negate();\n      log_postfix_event(m_value, \"negate\");\n   }\n   int compare(const logged_adaptor& o) const\n   {\n      log_prefix_event(m_value, o.value(), \"compare\");\n      int r = m_value.compare(o.value());\n      log_postfix_event(m_value, r, \"compare\");\n      return r;\n   }\n   template <class T>\n   int compare(const T& i) const\n   {\n      log_prefix_event(m_value, i, \"compare\");\n      int r = m_value.compare(i);\n      log_postfix_event(m_value, r, \"compare\");\n      return r;\n   }\n   Backend& value()\n   {\n      return m_value;\n   }\n   const Backend& value() const\n   {\n      return m_value;\n   }\n   \n   #ifndef BOOST_MP_STANDALONE\n   template <class Archive>\n   void serialize(Archive& ar, const unsigned int /*version*/)\n   {\n      log_prefix_event(m_value, \"serialize\");\n      ar& boost::make_nvp(\"value\", m_value);\n      log_postfix_event(m_value, \"serialize\");\n   }\n   #endif\n\n   static unsigned default_precision() noexcept\n   {\n      return Backend::default_precision();\n   }\n   static void default_precision(unsigned v) noexcept\n   {\n      Backend::default_precision(v);\n   }\n   static unsigned thread_default_precision() noexcept\n   {\n      return Backend::thread_default_precision();\n   }\n   static void thread_default_precision(unsigned v) noexcept\n   {\n      Backend::thread_default_precision(v);\n   }\n   unsigned precision() const noexcept\n   {\n      return value().precision();\n   }\n   void precision(unsigned digits10) noexcept\n   {\n      value().precision(digits10);\n   }\n   //\n   // Variable precision options:\n   // \n   static constexpr variable_precision_options default_variable_precision_options()noexcept\n   {\n      return Backend::default_variable_precision_options();\n   }\n   static constexpr variable_precision_options thread_default_variable_precision_options()noexcept\n   {\n      return Backend::thread_default_variable_precision_options();\n   }\n   static BOOST_MP_CXX14_CONSTEXPR void default_variable_precision_options(variable_precision_options opts)\n   {\n      Backend::default_variable_precision_options(opts);\n   }\n   static BOOST_MP_CXX14_CONSTEXPR void thread_default_variable_precision_options(variable_precision_options opts)\n   {\n      Backend::thread_default_variable_precision_options(opts);\n   }\n};\n\ntemplate <class T>\ninline const T& unwrap_logged_type(const T& a) { return a; }\ntemplate <class Backend>\ninline const Backend& unwrap_logged_type(const logged_adaptor<Backend>& a) { return a.value(); }\n\n#define NON_MEMBER_OP1(name, str)                                        \\\n   template <class Backend>                                              \\\n   inline void BOOST_JOIN(eval_, name)(logged_adaptor<Backend> & result) \\\n   {                                                                     \\\n      using default_ops::BOOST_JOIN(eval_, name);                        \\\n      log_prefix_event(result.value(), str);                             \\\n      BOOST_JOIN(eval_, name)                                            \\\n      (result.value());                                                  \\\n      log_postfix_event(result.value(), str);                            \\\n   }\n\n#define NON_MEMBER_OP2(name, str)                                                                          \\\n   template <class Backend, class T>                                                                       \\\n   inline void BOOST_JOIN(eval_, name)(logged_adaptor<Backend> & result, const T& a)                       \\\n   {                                                                                                       \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                          \\\n      log_prefix_event(result.value(), unwrap_logged_type(a), str);                                        \\\n      BOOST_JOIN(eval_, name)                                                                              \\\n      (result.value(), unwrap_logged_type(a));                                                             \\\n      log_postfix_event(result.value(), str);                                                              \\\n   }                                                                                                       \\\n   template <class Backend>                                                                                \\\n   inline void BOOST_JOIN(eval_, name)(logged_adaptor<Backend> & result, const logged_adaptor<Backend>& a) \\\n   {                                                                                                       \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                          \\\n      log_prefix_event(result.value(), unwrap_logged_type(a), str);                                        \\\n      BOOST_JOIN(eval_, name)                                                                              \\\n      (result.value(), unwrap_logged_type(a));                                                             \\\n      log_postfix_event(result.value(), str);                                                              \\\n   }\n\n#define NON_MEMBER_OP3(name, str)                                                                                                            \\\n   template <class Backend, class T, class U>                                                                                                \\\n   inline void BOOST_JOIN(eval_, name)(logged_adaptor<Backend> & result, const T& a, const U& b)                                             \\\n   {                                                                                                                                         \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                                                            \\\n      log_prefix_event(result.value(), unwrap_logged_type(a), unwrap_logged_type(b), str);                                                   \\\n      BOOST_JOIN(eval_, name)                                                                                                                \\\n      (result.value(), unwrap_logged_type(a), unwrap_logged_type(b));                                                                        \\\n      log_postfix_event(result.value(), str);                                                                                                \\\n   }                                                                                                                                         \\\n   template <class Backend, class T>                                                                                                         \\\n   inline void BOOST_JOIN(eval_, name)(logged_adaptor<Backend> & result, const logged_adaptor<Backend>& a, const T& b)                       \\\n   {                                                                                                                                         \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                                                            \\\n      log_prefix_event(result.value(), unwrap_logged_type(a), unwrap_logged_type(b), str);                                                   \\\n      BOOST_JOIN(eval_, name)                                                                                                                \\\n      (result.value(), unwrap_logged_type(a), unwrap_logged_type(b));                                                                        \\\n      log_postfix_event(result.value(), str);                                                                                                \\\n   }                                                                                                                                         \\\n   template <class Backend, class T>                                                                                                         \\\n   inline void BOOST_JOIN(eval_, name)(logged_adaptor<Backend> & result, const T& a, const logged_adaptor<Backend>& b)                       \\\n   {                                                                                                                                         \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                                                            \\\n      log_prefix_event(result.value(), unwrap_logged_type(a), unwrap_logged_type(b), str);                                                   \\\n      BOOST_JOIN(eval_, name)                                                                                                                \\\n      (result.value(), unwrap_logged_type(a), unwrap_logged_type(b));                                                                        \\\n      log_postfix_event(result.value(), str);                                                                                                \\\n   }                                                                                                                                         \\\n   template <class Backend>                                                                                                                  \\\n   inline void BOOST_JOIN(eval_, name)(logged_adaptor<Backend> & result, const logged_adaptor<Backend>& a, const logged_adaptor<Backend>& b) \\\n   {                                                                                                                                         \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                                                            \\\n      log_prefix_event(result.value(), unwrap_logged_type(a), unwrap_logged_type(b), str);                                                   \\\n      BOOST_JOIN(eval_, name)                                                                                                                \\\n      (result.value(), unwrap_logged_type(a), unwrap_logged_type(b));                                                                        \\\n      log_postfix_event(result.value(), str);                                                                                                \\\n   }\n\n#define NON_MEMBER_OP4(name, str)                                                                                                                                              \\\n   template <class Backend, class T, class U, class V>                                                                                                                         \\\n   inline void BOOST_JOIN(eval_, name)(logged_adaptor<Backend> & result, const T& a, const U& b, const V& c)                                                                   \\\n   {                                                                                                                                                                           \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                                                                                              \\\n      log_prefix_event(result.value(), unwrap_logged_type(a), unwrap_logged_type(b), unwrap_logged_type(c), str);                                                              \\\n      BOOST_JOIN(eval_, name)                                                                                                                                                  \\\n      (result.value(), unwrap_logged_type(a), unwrap_logged_type(b), unwrap_logged_type(c));                                                                                   \\\n      log_postfix_event(result.value(), str);                                                                                                                                  \\\n   }                                                                                                                                                                           \\\n   template <class Backend, class T>                                                                                                                                           \\\n   inline void BOOST_JOIN(eval_, name)(logged_adaptor<Backend> & result, const logged_adaptor<Backend>& a, const logged_adaptor<Backend>& b, const T& c)                       \\\n   {                                                                                                                                                                           \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                                                                                              \\\n      log_prefix_event(result.value(), unwrap_logged_type(a), unwrap_logged_type(b), unwrap_logged_type(c), str);                                                              \\\n      BOOST_JOIN(eval_, name)                                                                                                                                                  \\\n      (result.value(), unwrap_logged_type(a), unwrap_logged_type(b), unwrap_logged_type(c));                                                                                   \\\n      log_postfix_event(result.value(), str);                                                                                                                                  \\\n   }                                                                                                                                                                           \\\n   template <class Backend, class T>                                                                                                                                           \\\n   inline void BOOST_JOIN(eval_, name)(logged_adaptor<Backend> & result, const logged_adaptor<Backend>& a, const T& b, const logged_adaptor<Backend>& c)                       \\\n   {                                                                                                                                                                           \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                                                                                              \\\n      log_prefix_event(result.value(), unwrap_logged_type(a), unwrap_logged_type(b), unwrap_logged_type(c), str);                                                              \\\n      BOOST_JOIN(eval_, name)                                                                                                                                                  \\\n      (result.value(), unwrap_logged_type(a), unwrap_logged_type(b), unwrap_logged_type(c));                                                                                   \\\n      log_postfix_event(result.value(), str);                                                                                                                                  \\\n   }                                                                                                                                                                           \\\n   template <class Backend, class T>                                                                                                                                           \\\n   inline void BOOST_JOIN(eval_, name)(logged_adaptor<Backend> & result, const T& a, const logged_adaptor<Backend>& b, const logged_adaptor<Backend>& c)                       \\\n   {                                                                                                                                                                           \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                                                                                              \\\n      log_prefix_event(result.value(), unwrap_logged_type(a), unwrap_logged_type(b), unwrap_logged_type(c), str);                                                              \\\n      BOOST_JOIN(eval_, name)                                                                                                                                                  \\\n      (result.value(), unwrap_logged_type(a), unwrap_logged_type(b), unwrap_logged_type(c));                                                                                   \\\n      log_postfix_event(result.value(), str);                                                                                                                                  \\\n   }                                                                                                                                                                           \\\n   template <class Backend>                                                                                                                                                    \\\n   inline void BOOST_JOIN(eval_, name)(logged_adaptor<Backend> & result, const logged_adaptor<Backend>& a, const logged_adaptor<Backend>& b, const logged_adaptor<Backend>& c) \\\n   {                                                                                                                                                                           \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                                                                                              \\\n      log_prefix_event(result.value(), unwrap_logged_type(a), unwrap_logged_type(b), unwrap_logged_type(c), str);                                                              \\\n      BOOST_JOIN(eval_, name)                                                                                                                                                  \\\n      (result.value(), unwrap_logged_type(a), unwrap_logged_type(b), unwrap_logged_type(c));                                                                                   \\\n      log_postfix_event(result.value(), str);                                                                                                                                  \\\n   }                                                                                                                                                                           \\\n   template <class Backend, class T, class U>                                                                                                                                  \\\n   inline void BOOST_JOIN(eval_, name)(logged_adaptor<Backend> & result, const logged_adaptor<Backend>& a, const T& b, const U& c)                                             \\\n   {                                                                                                                                                                           \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                                                                                              \\\n      log_prefix_event(result.value(), unwrap_logged_type(a), unwrap_logged_type(b), unwrap_logged_type(c), str);                                                              \\\n      BOOST_JOIN(eval_, name)                                                                                                                                                  \\\n      (result.value(), unwrap_logged_type(a), unwrap_logged_type(b), unwrap_logged_type(c));                                                                                   \\\n      log_postfix_event(result.value(), str);                                                                                                                                  \\\n   }\n\nNON_MEMBER_OP2(add, \"+=\")\nNON_MEMBER_OP2(subtract, \"-=\")\nNON_MEMBER_OP2(multiply, \"*=\")\nNON_MEMBER_OP2(divide, \"/=\")\n\ntemplate <class Backend, class R>\ninline void eval_convert_to(R* result, const logged_adaptor<Backend>& val)\n{\n   using default_ops::eval_convert_to;\n   log_prefix_event(val.value(), \"convert_to\");\n   eval_convert_to(result, val.value());\n   log_postfix_event(val.value(), *result, \"convert_to\");\n}\n\ntemplate <class Backend, class R>\ninline void eval_convert_to(logged_adaptor<R>* result, const logged_adaptor<Backend>& val)\n{\n   using default_ops::eval_convert_to;\n   log_prefix_event(val.value(), \"convert_to\");\n   eval_convert_to(&result->value(), val.value());\n   log_postfix_event(val.value(), &result->value(), \"convert_to\");\n}\ntemplate <class Backend, class R>\ninline void eval_convert_to(logged_adaptor<R>* result, const Backend& val)\n{\n   using default_ops::eval_convert_to;\n   log_prefix_event(val, \"convert_to\");\n   eval_convert_to(&result->value(), val);\n   log_postfix_event(val, &result->value(), \"convert_to\");\n}\n\ntemplate <class Backend>\ninline void eval_convert_to(std::complex<float>* result, const logged_adaptor<Backend>& val)\n{\n   using default_ops::eval_convert_to;\n   log_prefix_event(val.value(), \"convert_to\");\n   eval_convert_to(result, val.value());\n   log_postfix_event(val.value(), *result, \"convert_to\");\n}\ntemplate <class Backend>\ninline void eval_convert_to(std::complex<double>* result, const logged_adaptor<Backend>& val)\n{\n   using default_ops::eval_convert_to;\n   log_prefix_event(val.value(), \"convert_to\");\n   eval_convert_to(result, val.value());\n   log_postfix_event(val.value(), *result, \"convert_to\");\n}\ntemplate <class Backend>\ninline void eval_convert_to(std::complex<long double>* result, const logged_adaptor<Backend>& val)\n{\n   using default_ops::eval_convert_to;\n   log_prefix_event(val.value(), \"convert_to\");\n   eval_convert_to(result, val.value());\n   log_postfix_event(val.value(), *result, \"convert_to\");\n}\n\n\ntemplate <class Backend, class Exp>\ninline void eval_frexp(logged_adaptor<Backend>& result, const logged_adaptor<Backend>& arg, Exp* exp)\n{\n   log_prefix_event(arg.value(), \"frexp\");\n   eval_frexp(result.value(), arg.value(), exp);\n   log_postfix_event(result.value(), *exp, \"frexp\");\n}\n\ntemplate <class Backend, class Exp>\ninline void eval_ldexp(logged_adaptor<Backend>& result, const logged_adaptor<Backend>& arg, Exp exp)\n{\n   log_prefix_event(arg.value(), \"ldexp\");\n   eval_ldexp(result.value(), arg.value(), exp);\n   log_postfix_event(result.value(), exp, \"ldexp\");\n}\n\ntemplate <class Backend, class Exp>\ninline void eval_scalbn(logged_adaptor<Backend>& result, const logged_adaptor<Backend>& arg, Exp exp)\n{\n   using default_ops::eval_scalbn;\n   log_prefix_event(arg.value(), \"scalbn\");\n   eval_scalbn(result.value(), arg.value(), exp);\n   log_postfix_event(result.value(), exp, \"scalbn\");\n}\n\ntemplate <class Backend>\ninline typename Backend::exponent_type eval_ilogb(const logged_adaptor<Backend>& arg)\n{\n   using default_ops::eval_ilogb;\n   log_prefix_event(arg.value(), \"ilogb\");\n   typename Backend::exponent_type r = eval_ilogb(arg.value());\n   log_postfix_event(arg.value(), \"ilogb\");\n   return r;\n}\n\nNON_MEMBER_OP2(floor, \"floor\")\nNON_MEMBER_OP2(ceil, \"ceil\")\nNON_MEMBER_OP2(sqrt, \"sqrt\")\n\ntemplate <class Backend>\ninline int eval_fpclassify(const logged_adaptor<Backend>& arg)\n{\n   using default_ops::eval_fpclassify;\n   log_prefix_event(arg.value(), \"fpclassify\");\n   int r = eval_fpclassify(arg.value());\n   log_postfix_event(arg.value(), r, \"fpclassify\");\n   return r;\n}\n\n/*********************************************************************\n*\n* Optional arithmetic operations come next:\n*\n*********************************************************************/\n\nNON_MEMBER_OP3(add, \"+\")\nNON_MEMBER_OP3(subtract, \"-\")\nNON_MEMBER_OP3(multiply, \"*\")\nNON_MEMBER_OP3(divide, \"/\")\nNON_MEMBER_OP3(multiply_add, \"fused-multiply-add\")\nNON_MEMBER_OP3(multiply_subtract, \"fused-multiply-subtract\")\nNON_MEMBER_OP4(multiply_add, \"fused-multiply-add\")\nNON_MEMBER_OP4(multiply_subtract, \"fused-multiply-subtract\")\n\nNON_MEMBER_OP1(increment, \"increment\")\nNON_MEMBER_OP1(decrement, \"decrement\")\n\n/*********************************************************************\n*\n* Optional integer operations come next:\n*\n*********************************************************************/\n\nNON_MEMBER_OP2(modulus, \"%=\")\nNON_MEMBER_OP3(modulus, \"%\")\nNON_MEMBER_OP2(bitwise_or, \"|=\")\nNON_MEMBER_OP3(bitwise_or, \"|\")\nNON_MEMBER_OP2(bitwise_and, \"&=\")\nNON_MEMBER_OP3(bitwise_and, \"&\")\nNON_MEMBER_OP2(bitwise_xor, \"^=\")\nNON_MEMBER_OP3(bitwise_xor, \"^\")\nNON_MEMBER_OP4(qr, \"quotient-and-remainder\")\nNON_MEMBER_OP2(complement, \"~\")\n\ntemplate <class Backend>\ninline void eval_left_shift(logged_adaptor<Backend>& arg, std::size_t a)\n{\n   using default_ops::eval_left_shift;\n   log_prefix_event(arg.value(), a, \"<<=\");\n   eval_left_shift(arg.value(), a);\n   log_postfix_event(arg.value(), \"<<=\");\n}\ntemplate <class Backend>\ninline void eval_left_shift(logged_adaptor<Backend>& arg, const logged_adaptor<Backend>& a, std::size_t b)\n{\n   using default_ops::eval_left_shift;\n   log_prefix_event(arg.value(), a, b, \"<<\");\n   eval_left_shift(arg.value(), a.value(), b);\n   log_postfix_event(arg.value(), \"<<\");\n}\ntemplate <class Backend>\ninline void eval_right_shift(logged_adaptor<Backend>& arg, std::size_t a)\n{\n   using default_ops::eval_right_shift;\n   log_prefix_event(arg.value(), a, \">>=\");\n   eval_right_shift(arg.value(), a);\n   log_postfix_event(arg.value(), \">>=\");\n}\ntemplate <class Backend>\ninline void eval_right_shift(logged_adaptor<Backend>& arg, const logged_adaptor<Backend>& a, std::size_t b)\n{\n   using default_ops::eval_right_shift;\n   log_prefix_event(arg.value(), a, b, \">>\");\n   eval_right_shift(arg.value(), a.value(), b);\n   log_postfix_event(arg.value(), \">>\");\n}\n\ntemplate <class Backend, class T>\ninline T eval_integer_modulus(const logged_adaptor<Backend>& arg, const T& a)\n{\n   using default_ops::eval_integer_modulus;\n   log_prefix_event(arg.value(), a, \"integer-modulus\");\n   T r = eval_integer_modulus(arg.value(), a);\n   log_postfix_event(arg.value(), r, \"integer-modulus\");\n   return r;\n}\n\ntemplate <class Backend>\ninline std::size_t eval_lsb(const logged_adaptor<Backend>& arg)\n{\n   using default_ops::eval_lsb;\n   log_prefix_event(arg.value(), \"least-significant-bit\");\n   std::size_t r = eval_lsb(arg.value());\n   log_postfix_event(arg.value(), r, \"least-significant-bit\");\n   return r;\n}\n\ntemplate <class Backend>\ninline std::size_t eval_msb(const logged_adaptor<Backend>& arg)\n{\n   using default_ops::eval_msb;\n   log_prefix_event(arg.value(), \"most-significant-bit\");\n   std::size_t r = eval_msb(arg.value());\n   log_postfix_event(arg.value(), r, \"most-significant-bit\");\n   return r;\n}\n\ntemplate <class Backend>\ninline bool eval_bit_test(const logged_adaptor<Backend>& arg, std::size_t a)\n{\n   using default_ops::eval_bit_test;\n   log_prefix_event(arg.value(), a, \"bit-test\");\n   bool r = eval_bit_test(arg.value(), a);\n   log_postfix_event(arg.value(), r, \"bit-test\");\n   return r;\n}\n\ntemplate <class Backend>\ninline void eval_bit_set(const logged_adaptor<Backend>& arg, std::size_t a)\n{\n   using default_ops::eval_bit_set;\n   log_prefix_event(arg.value(), a, \"bit-set\");\n   eval_bit_set(arg.value(), a);\n   log_postfix_event(arg.value(), arg, \"bit-set\");\n}\ntemplate <class Backend>\ninline void eval_bit_unset(const logged_adaptor<Backend>& arg, std::size_t a)\n{\n   using default_ops::eval_bit_unset;\n   log_prefix_event(arg.value(), a, \"bit-unset\");\n   eval_bit_unset(arg.value(), a);\n   log_postfix_event(arg.value(), arg, \"bit-unset\");\n}\ntemplate <class Backend>\ninline void eval_bit_flip(const logged_adaptor<Backend>& arg, std::size_t a)\n{\n   using default_ops::eval_bit_flip;\n   log_prefix_event(arg.value(), a, \"bit-flip\");\n   eval_bit_flip(arg.value(), a);\n   log_postfix_event(arg.value(), arg, \"bit-flip\");\n}\n\nNON_MEMBER_OP3(gcd, \"gcd\")\nNON_MEMBER_OP3(lcm, \"lcm\")\nNON_MEMBER_OP4(powm, \"powm\")\n\n/*********************************************************************\n*\n* abs/fabs:\n*\n*********************************************************************/\n\nNON_MEMBER_OP2(abs, \"abs\")\nNON_MEMBER_OP2(fabs, \"fabs\")\n\n/*********************************************************************\n*\n* Floating point functions:\n*\n*********************************************************************/\n\nNON_MEMBER_OP2(trunc, \"trunc\")\nNON_MEMBER_OP2(round, \"round\")\nNON_MEMBER_OP2(exp, \"exp\")\nNON_MEMBER_OP2(log, \"log\")\nNON_MEMBER_OP2(log10, \"log10\")\nNON_MEMBER_OP2(sin, \"sin\")\nNON_MEMBER_OP2(cos, \"cos\")\nNON_MEMBER_OP2(tan, \"tan\")\nNON_MEMBER_OP2(asin, \"asin\")\nNON_MEMBER_OP2(acos, \"acos\")\nNON_MEMBER_OP2(atan, \"atan\")\nNON_MEMBER_OP2(sinh, \"sinh\")\nNON_MEMBER_OP2(cosh, \"cosh\")\nNON_MEMBER_OP2(tanh, \"tanh\")\nNON_MEMBER_OP2(logb, \"logb\")\nNON_MEMBER_OP3(fmod, \"fmod\")\nNON_MEMBER_OP3(pow, \"pow\")\nNON_MEMBER_OP3(atan2, \"atan2\")\nNON_MEMBER_OP2(asinh, \"asinh\")\nNON_MEMBER_OP2(acosh, \"acosh\")\nNON_MEMBER_OP2(atanh, \"atanh\")\nNON_MEMBER_OP2(conj, \"conj\")\n\ntemplate <class Backend>\nint eval_signbit(const logged_adaptor<Backend>& val)\n{\n   using default_ops::eval_signbit;\n   return eval_signbit(val.value());\n}\n\ntemplate <class Backend>\nstd::size_t hash_value(const logged_adaptor<Backend>& val)\n{\n   return hash_value(val.value());\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\ninline typename std::enable_if<number_category<Backend>::value == number_kind_rational, typename number<logged_adaptor<Backend>, ExpressionTemplates>::value_type>::type\nnumerator(const number<logged_adaptor<Backend>, ExpressionTemplates>& arg)\n{\n   number<Backend, ExpressionTemplates> t(arg.backend().value());\n   return numerator(t).backend();\n}\ntemplate <class Backend, expression_template_option ExpressionTemplates>\ninline typename std::enable_if<number_category<Backend>::value == number_kind_rational, typename number<logged_adaptor<Backend>, ExpressionTemplates>::value_type>::type\ndenominator(const number<logged_adaptor<Backend>, ExpressionTemplates>& arg)\n{\n   number<Backend, ExpressionTemplates> t(arg.backend().value());\n   return denominator(t).backend();\n}\n\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_set_real(To& to, const logged_adaptor<From>& from)\n{\n   using default_ops::eval_set_real;\n   log_prefix_event(to, from.value(), \"Set real part\");\n   eval_set_real(to, from.value());\n   log_postfix_event(to, from.value(), \"Set real part\");\n}\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_set_real(logged_adaptor<To>& to, const logged_adaptor<From>& from)\n{\n   using default_ops::eval_set_real;\n   log_prefix_event(to.value(), from.value(), \"Set real part\");\n   eval_set_real(to.value(), from.value());\n   log_postfix_event(to.value(), from.value(), \"Set real part\");\n}\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_set_real(logged_adaptor<To>& to, const From& from)\n{\n   using default_ops::eval_set_real;\n   log_prefix_event(to.value(), from, \"Set real part\");\n   eval_set_real(to.value(), from);\n   log_postfix_event(to.value(), from, \"Set real part\");\n}\n\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_set_imag(To& to, const logged_adaptor<From>& from)\n{\n   using default_ops::eval_set_imag;\n   log_prefix_event(to, from.value(), \"Set imag part\");\n   eval_set_imag(to, from.value());\n   log_postfix_event(to, from.value(), \"Set imag part\");\n}\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_set_imag(logged_adaptor<To>& to, const logged_adaptor<From>& from)\n{\n   using default_ops::eval_set_imag;\n   log_prefix_event(to.value(), from.value(), \"Set imag part\");\n   eval_set_imag(to.value(), from.value());\n   log_postfix_event(to.value(), from.value(), \"Set imag part\");\n}\ntemplate <class To, class From>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_set_imag(logged_adaptor<To>& to, const From& from)\n{\n   using default_ops::eval_set_imag;\n   log_prefix_event(to.value(), from, \"Set imag part\");\n   eval_set_imag(to.value(), from);\n   log_postfix_event(to.value(), from, \"Set imag part\");\n}\n\n\n#define NON_MEMBER_COMPLEX_TO_REAL(name, str)                                                    \\\n   template <class B1, class B2>                                                                 \\\n   inline void BOOST_JOIN(eval_, name)(logged_adaptor<B1> & result, const logged_adaptor<B2>& a) \\\n   {                                                                                             \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                \\\n      log_prefix_event(a.value(), a.value(), str);                                               \\\n      BOOST_JOIN(eval_, name)                                                                    \\\n      (result.value(), a.value());                                                               \\\n      log_postfix_event(result.value(), str);                                                    \\\n   }                                                                                             \\\n   template <class B1, class B2>                                                                 \\\n   inline void BOOST_JOIN(eval_, name)(B1 & result, const logged_adaptor<B2>& a)                 \\\n   {                                                                                             \\\n      using default_ops::BOOST_JOIN(eval_, name);                                                \\\n      log_prefix_event(a.value(), a.value(), str);                                               \\\n      BOOST_JOIN(eval_, name)                                                                    \\\n      (result, a.value());                                                                       \\\n      log_postfix_event(result, str);                                                            \\\n   }\n\nNON_MEMBER_COMPLEX_TO_REAL(real, \"real\")\nNON_MEMBER_COMPLEX_TO_REAL(imag, \"imag\")\n\ntemplate <class T, class V, class U>\ninline void assign_components(logged_adaptor<T>& result, const V& v1, const U& v2)\n{\n   using default_ops::assign_components;\n   assign_components(result.value(), unwrap_logged_type(v1), unwrap_logged_type(v2));\n}\n\n} // namespace backends\n\nusing backends::logged_adaptor;\n\nnamespace detail {\n   template <class Backend>\n   struct is_variable_precision<logged_adaptor<Backend> > : public is_variable_precision<Backend>\n   {};\n#ifdef BOOST_HAS_INT128\n   template <class Backend>\n   struct is_convertible_arithmetic<int128_type, logged_adaptor<Backend> > : public is_convertible_arithmetic<int128_type, Backend>\n   {};\n   template <class Backend>\n   struct is_convertible_arithmetic<uint128_type, logged_adaptor<Backend> > : public is_convertible_arithmetic<uint128_type, Backend>\n   {};\n#endif\n#ifdef BOOST_HAS_FLOAT128\n   template <class Backend>\n   struct is_convertible_arithmetic<float128_type, logged_adaptor<Backend> > : public is_convertible_arithmetic<float128_type, Backend>\n   {};\n#endif\n   } // namespace detail\n\ntemplate <class Backend>\nstruct number_category<backends::logged_adaptor<Backend> > : public number_category<Backend>\n{};\n\ntemplate <class Number>\nusing logged_adaptor_t = number<logged_adaptor<typename Number::backend_type>, Number::et>;\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\nstruct component_type<number<logged_adaptor<Backend>, ExpressionTemplates>>\n{\n   //\n   // We'll make the component_type also a logged_adaptor:\n   //\n   using base_component_type = typename component_type<number<Backend, ExpressionTemplates>>::type;\n   using base_component_backend = typename base_component_type::backend_type;\n   using type = number<logged_adaptor<base_component_backend>, ExpressionTemplates>;\n};\n\ntemplate <class Backend>\nstruct is_interval_number<backends::logged_adaptor<Backend> > : public is_interval_number<Backend> {};\n\n}} // namespace boost::multiprecision\n\nnamespace std {\n\ntemplate <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates>\nclass numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<Backend>, ExpressionTemplates> >\n    : public std::numeric_limits<boost::multiprecision::number<Backend, ExpressionTemplates> >\n{\n   using base_type = std::numeric_limits<boost::multiprecision::number<Backend, ExpressionTemplates> >                           ;\n   using number_type = boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<Backend>, ExpressionTemplates>;\n\n public:\n   static number_type(min)() noexcept { return (base_type::min)(); }\n   static number_type(max)() noexcept { return (base_type::max)(); }\n   static number_type lowest() noexcept { return -(max)(); }\n   static number_type epsilon() noexcept { return base_type::epsilon(); }\n   static number_type round_error() noexcept { return epsilon() / 2; }\n   static number_type infinity() noexcept { return base_type::infinity(); }\n   static number_type quiet_NaN() noexcept { return base_type::quiet_NaN(); }\n   static number_type signaling_NaN() noexcept { return base_type::signaling_NaN(); }\n   static number_type denorm_min() noexcept { return base_type::denorm_min(); }\n};\n\n} // namespace std\n\n#ifdef BOOST_MP_MATH_AVAILABLE\nnamespace boost {\nnamespace math {\n\nnamespace policies {\n\ntemplate <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\nstruct precision<boost::multiprecision::number<boost::multiprecision::logged_adaptor<Backend>, ExpressionTemplates>, Policy>\n    : public precision<boost::multiprecision::number<Backend, ExpressionTemplates>, Policy>\n{};\n\n}\n\n}} // namespace boost::math::policies\n#endif // BOOST_MP_MATH_AVAILABLE\n\n#undef NON_MEMBER_OP1\n#undef NON_MEMBER_OP2\n#undef NON_MEMBER_OP3\n#undef NON_MEMBER_OP4\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/miller_rabin.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_MR_HPP\n#define BOOST_MP_MR_HPP\n\n#include <random>\n#include <cstdint>\n#include <type_traits>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/integer.hpp>\n#include <boost/multiprecision/detail/uniform_int_distribution.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n\nnamespace boost {\nnamespace multiprecision {\nnamespace detail {\n\ntemplate <class I>\nbool check_small_factors(const I& n)\n{\n   constexpr std::uint32_t small_factors1[] = {\n       3u, 5u, 7u, 11u, 13u, 17u, 19u, 23u};\n   constexpr std::uint32_t pp1 = 223092870u;\n\n   std::uint32_t m1 = integer_modulus(n, pp1);\n\n   for (std::size_t i = 0; i < sizeof(small_factors1) / sizeof(small_factors1[0]); ++i)\n   {\n      BOOST_MP_ASSERT(pp1 % small_factors1[i] == 0);\n      if (m1 % small_factors1[i] == 0)\n         return false;\n   }\n\n   constexpr std::uint32_t small_factors2[] = {\n       29u, 31u, 37u, 41u, 43u, 47u};\n   constexpr std::uint32_t pp2 = 2756205443u;\n\n   m1 = integer_modulus(n, pp2);\n\n   for (std::size_t i = 0; i < sizeof(small_factors2) / sizeof(small_factors2[0]); ++i)\n   {\n      BOOST_MP_ASSERT(pp2 % small_factors2[i] == 0);\n      if (m1 % small_factors2[i] == 0)\n         return false;\n   }\n\n   constexpr std::uint32_t small_factors3[] = {\n       53u, 59u, 61u, 67u, 71u};\n   constexpr std::uint32_t pp3 = 907383479u;\n\n   m1 = integer_modulus(n, pp3);\n\n   for (std::size_t i = 0; i < sizeof(small_factors3) / sizeof(small_factors3[0]); ++i)\n   {\n      BOOST_MP_ASSERT(pp3 % small_factors3[i] == 0);\n      if (m1 % small_factors3[i] == 0)\n         return false;\n   }\n\n   constexpr std::uint32_t small_factors4[] = {\n       73u, 79u, 83u, 89u, 97u};\n   constexpr std::uint32_t pp4 = 4132280413u;\n\n   m1 = integer_modulus(n, pp4);\n\n   for (std::size_t i = 0; i < sizeof(small_factors4) / sizeof(small_factors4[0]); ++i)\n   {\n      BOOST_MP_ASSERT(pp4 % small_factors4[i] == 0);\n      if (m1 % small_factors4[i] == 0)\n         return false;\n   }\n\n   constexpr std::uint32_t small_factors5[6][4] = {\n       {101u, 103u, 107u, 109u},\n       {113u, 127u, 131u, 137u},\n       {139u, 149u, 151u, 157u},\n       {163u, 167u, 173u, 179u},\n       {181u, 191u, 193u, 197u},\n       {199u, 211u, 223u, 227u}};\n   constexpr std::uint32_t pp5[6] =\n       {\n           121330189u,\n           113u * 127u * 131u * 137u,\n           139u * 149u * 151u * 157u,\n           163u * 167u * 173u * 179u,\n           181u * 191u * 193u * 197u,\n           199u * 211u * 223u * 227u};\n\n   for (std::size_t k = 0; k < sizeof(pp5) / sizeof(*pp5); ++k)\n   {\n      m1 = integer_modulus(n, pp5[k]);\n\n      for (std::size_t i = 0; i < 4; ++i)\n      {\n         BOOST_MP_ASSERT(pp5[k] % small_factors5[k][i] == 0);\n         if (m1 % small_factors5[k][i] == 0)\n            return false;\n      }\n   }\n   return true;\n}\n\ninline bool is_small_prime(std::size_t n)\n{\n   constexpr unsigned char p[] =\n       {\n           3u, 5u, 7u, 11u, 13u, 17u, 19u, 23u, 29u, 31u,\n           37u, 41u, 43u, 47u, 53u, 59u, 61u, 67u, 71u, 73u,\n           79u, 83u, 89u, 97u, 101u, 103u, 107u, 109u, 113u,\n           127u, 131u, 137u, 139u, 149u, 151u, 157u, 163u,\n           167u, 173u, 179u, 181u, 191u, 193u, 197u, 199u,\n           211u, 223u, 227u};\n   for (std::size_t i = 0; i < sizeof(p) / sizeof(*p); ++i)\n   {\n      if (n == p[i])\n         return true;\n   }\n   return false;\n}\n\ntemplate <class I>\ntypename std::enable_if<std::is_convertible<I, unsigned>::value, unsigned>::type\ncast_to_unsigned(const I& val)\n{\n   return static_cast<unsigned>(val);\n}\ntemplate <class I>\ntypename std::enable_if<!std::is_convertible<I, unsigned>::value, unsigned>::type\ncast_to_unsigned(const I& val)\n{\n   return val.template convert_to<unsigned>();\n}\n\n} // namespace detail\n\ntemplate <class I, class Engine>\ntypename std::enable_if<number_category<I>::value == number_kind_integer, bool>::type\nmiller_rabin_test(const I& n, std::size_t trials, Engine& gen)\n{\n   using number_type = I;\n\n   if (n == 2)\n      return true; // Trivial special case.\n   if (bit_test(n, 0) == 0)\n      return false; // n is even\n   if (n <= 227)\n      return detail::is_small_prime(detail::cast_to_unsigned(n));\n\n   if (!detail::check_small_factors(n))\n      return false;\n\n   number_type nm1 = n - 1;\n   //\n   // Begin with a single Fermat test - it excludes a lot of candidates:\n   //\n   number_type q(228), x, y; // We know n is greater than this, as we've excluded small factors\n   x = powm(q, nm1, n);\n   if (x != 1u)\n      return false;\n\n   q          = n - 1;\n   std::size_t k = lsb(q);\n   q >>= k;\n\n   // Declare our random number generator:\n   boost::multiprecision::uniform_int_distribution<number_type> dist(2, n - 2);\n\n   //\n   // Execute the trials:\n   //\n   for (std::size_t i = 0; i < trials; ++i)\n   {\n      x          = dist(gen);\n      y          = powm(x, q, n);\n      std::size_t j = 0;\n      while (true)\n      {\n         if (y == nm1)\n            break;\n         if (y == 1)\n         {\n            if (j == 0)\n               break;\n            return false; // test failed\n         }\n         if (++j == k)\n            return false; // failed\n         y = powm(y, 2, n);\n      }\n   }\n   return true; // Yeheh! probably prime.\n}\n\ntemplate <class I>\ntypename std::enable_if<number_category<I>::value == number_kind_integer, bool>::type\nmiller_rabin_test(const I& x, std::size_t trials)\n{\n   static std::mt19937 gen;\n   return miller_rabin_test(x, trials, gen);\n}\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class Engine>\nbool miller_rabin_test(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& n, std::size_t trials, Engine& gen)\n{\n   using number_type = typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type;\n   return miller_rabin_test(number_type(n), trials, gen);\n}\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\nbool miller_rabin_test(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& n, std::size_t trials)\n{\n   using number_type = typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type;\n   return miller_rabin_test(number_type(n), trials);\n}\n\n}} // namespace boost::multiprecision\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/mpc.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_MPC_HPP\n#define BOOST_MP_MPC_HPP\n\n#include <cstdint>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/detail/fpclassify.hpp>\n#include <boost/multiprecision/number.hpp>\n#include <boost/multiprecision/detail/digits.hpp>\n#include <boost/multiprecision/detail/atomic.hpp>\n#include <boost/multiprecision/traits/is_variable_precision.hpp>\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/multiprecision/detail/hash.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n#include <mpc.h>\n#include <cmath>\n#include <algorithm>\n#include <complex>\n\n#ifndef BOOST_MULTIPRECISION_MPFI_DEFAULT_PRECISION\n#define BOOST_MULTIPRECISION_MPFI_DEFAULT_PRECISION 20\n#endif\n\nnamespace boost {\nnamespace multiprecision {\nnamespace backends {\n\ntemplate <unsigned digits10>\nstruct mpc_complex_backend;\n\ntemplate <class Backend>\nstruct logged_adaptor;\ntemplate <class Backend>\nstruct debug_adaptor;\n\n} // namespace backends\n\ntemplate <unsigned digits10>\nstruct number_category<backends::mpc_complex_backend<digits10> > : public std::integral_constant<int, number_kind_complex>\n{};\n\nnamespace backends {\n\nnamespace detail {\n\ninline void mpc_copy_precision(mpc_t dest, const mpc_t src)\n{\n   mpfr_prec_t p_dest = mpc_get_prec(dest);\n   mpfr_prec_t p_src  = mpc_get_prec(src);\n   if (p_dest != p_src)\n      mpc_set_prec(dest, p_src);\n}\ninline void mpc_copy_precision(mpc_t dest, const mpc_t src1, const mpc_t src2)\n{\n   mpfr_prec_t p_dest = mpc_get_prec(dest);\n   mpfr_prec_t p_src1 = mpc_get_prec(src1);\n   mpfr_prec_t p_src2 = mpc_get_prec(src2);\n   if (p_src2 > p_src1)\n      p_src1 = p_src2;\n   if (p_dest != p_src1)\n      mpc_set_prec(dest, p_src1);\n}\n\ntemplate <unsigned digits10>\nstruct mpc_complex_imp\n{\n#ifdef BOOST_HAS_LONG_LONG\n   using signed_types = std::tuple<long, long long>          ;\n   using unsigned_types = std::tuple<unsigned long, unsigned long long>;\n#else\n   using signed_types = std::tuple<long>         ;\n   using unsigned_types = std::tuple<unsigned long>;\n#endif\n   using float_types = std::tuple<double, long double>;\n   using exponent_type = long                          ;\n\n   mpc_complex_imp()\n   {\n      mpc_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      mpc_set_ui(m_data, 0u, GMP_RNDN);\n   }\n   mpc_complex_imp(unsigned digits2)\n   {\n      mpc_init2(m_data, digits2);\n      mpc_set_ui(m_data, 0u, GMP_RNDN);\n   }\n\n   mpc_complex_imp(const mpc_complex_imp& o)\n   {\n      mpc_init2(m_data, preserve_source_precision() ? mpc_get_prec(o.data()) : boost::multiprecision::detail::digits10_2_2(get_default_precision()));\n      if (o.m_data[0].re[0]._mpfr_d)\n         mpc_set(m_data, o.m_data, GMP_RNDN);\n   }\n   // rvalue copy\n   mpc_complex_imp(mpc_complex_imp&& o) noexcept\n   {\n      mpfr_prec_t binary_default_precision = boost::multiprecision::detail::digits10_2_2(get_default_precision());\n      if ((this->get_default_options() != variable_precision_options::preserve_target_precision) || (mpc_get_prec(o.data()) == binary_default_precision))\n      {\n         m_data[0] = o.m_data[0];\n         o.m_data[0].re[0]._mpfr_d = nullptr;\n      }\n      else\n      {\n         // NOTE: C allocation interface must not throw:\n         mpc_init2(m_data, binary_default_precision);\n         if (o.m_data[0].re[0]._mpfr_d)\n            mpc_set(m_data, o.m_data, GMP_RNDN);\n      }\n   }\n   mpc_complex_imp& operator=(const mpc_complex_imp& o)\n   {\n      if ((o.m_data[0].re[0]._mpfr_d) && (this != &o))\n      {\n         if (m_data[0].re[0]._mpfr_d == nullptr)\n            mpc_init2(m_data, preserve_source_precision() ? mpc_get_prec(o.m_data) : boost::multiprecision::detail::digits10_2_2(get_default_precision()));\n         else if (preserve_source_precision() && (mpc_get_prec(o.data()) != mpc_get_prec(data())))\n         {\n            mpc_set_prec(m_data, mpc_get_prec(o.m_data));\n         }\n         mpc_set(m_data, o.m_data, GMP_RNDN);\n      }\n      return *this;\n   }\n   // rvalue assign\n   mpc_complex_imp& operator=(mpc_complex_imp&& o) noexcept\n   {\n      if ((this->get_default_options() != variable_precision_options::preserve_target_precision) || (mpc_get_prec(o.data()) == mpc_get_prec(data())))\n         mpc_swap(m_data, o.m_data);\n      else\n         *this = static_cast<const mpc_complex_imp&>(o);\n      return *this;\n   }\n#ifdef BOOST_HAS_LONG_LONG\n#ifdef _MPFR_H_HAVE_INTMAX_T\n   mpc_complex_imp& operator=(unsigned long long i)\n   {\n      if (m_data[0].re[0]._mpfr_d == nullptr)\n         mpc_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      mpc_set_uj(data(), i, GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_imp& operator=(long long i)\n   {\n      if (m_data[0].re[0]._mpfr_d == nullptr)\n         mpc_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      mpc_set_sj(data(), i, GMP_RNDN);\n      return *this;\n   }\n#else\n   mpc_complex_imp& operator=(unsigned long long i)\n   {\n      mpfr_float_backend<digits10> f(0uL, mpc_get_prec(m_data));\n      f = i;\n      mpc_set_fr(this->data(), f.data(), GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_imp& operator=(long long i)\n   {\n      mpfr_float_backend<digits10> f(0uL, mpc_get_prec(m_data));\n      f = i;\n      mpc_set_fr(this->data(), f.data(), GMP_RNDN);\n      return *this;\n   }\n#endif\n#endif\n   mpc_complex_imp& operator=(unsigned long i)\n   {\n      if (m_data[0].re[0]._mpfr_d == nullptr)\n         mpc_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      mpc_set_ui(m_data, i, GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_imp& operator=(long i)\n   {\n      if (m_data[0].re[0]._mpfr_d == nullptr)\n         mpc_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      mpc_set_si(m_data, i, GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_imp& operator=(double d)\n   {\n      if (m_data[0].re[0]._mpfr_d == nullptr)\n         mpc_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      mpc_set_d(m_data, d, GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_imp& operator=(long double d)\n   {\n      if (m_data[0].re[0]._mpfr_d == nullptr)\n         mpc_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      mpc_set_ld(m_data, d, GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_imp& operator=(mpz_t i)\n   {\n      if (m_data[0].re[0]._mpfr_d == nullptr)\n         mpc_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      mpc_set_z(m_data, i, GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_imp& operator=(gmp_int i)\n   {\n      if (m_data[0].re[0]._mpfr_d == nullptr)\n         mpc_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      mpc_set_z(m_data, i.data(), GMP_RNDN);\n      return *this;\n   }\n#ifdef BOOST_HAS_INT128\n   mpc_complex_imp& operator=(int128_type val)\n   {\n      gmp_int i;\n      i            = val;\n      return *this = i.data();\n   }\n   mpc_complex_imp& operator=(uint128_type val)\n   {\n      gmp_int i;\n      i            = val;\n      return *this = i.data();\n   }\n#endif\n#ifdef BOOST_HAS_FLOAT128\n   mpc_complex_imp& operator=(float128_type val)\n   {\n      mpfr_float_backend<digits10> f;\n      f            = val;\n      mpc_set_fr(this->m_data, f.data(), GMP_RNDN);\n      return *this;\n   }\n#endif\n\n   mpc_complex_imp& operator=(const char* s)\n   {\n      using default_ops::eval_fpclassify;\n\n      if (m_data[0].re[0]._mpfr_d == nullptr)\n         mpc_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n\n      mpfr_float_backend<digits10> a(0uL, mpc_get_prec(m_data)), b(0uL, mpc_get_prec(m_data));\n\n      if (s && (*s == '('))\n      {\n         std::string part;\n         const char* p = ++s;\n         while (*p && (*p != ',') && (*p != ')'))\n            ++p;\n         part.assign(s, p);\n         if (part.size())\n            a = part.c_str();\n         else\n            a = 0uL;\n         s = p;\n         if (*p && (*p != ')'))\n         {\n            ++p;\n            while (*p && (*p != ')'))\n               ++p;\n            part.assign(s + 1, p);\n         }\n         else\n            part.erase();\n         if (part.size())\n            b = part.c_str();\n         else\n            b = 0uL;\n      }\n      else\n      {\n         a = s;\n         b = 0uL;\n      }\n\n      if (eval_fpclassify(a) == static_cast<int>(FP_NAN))\n      {\n         mpc_set_fr(this->data(), a.data(), GMP_RNDN);\n      }\n      else if (eval_fpclassify(b) == static_cast<int>(FP_NAN))\n      {\n         mpc_set_fr(this->data(), b.data(), GMP_RNDN);\n      }\n      else\n      {\n         mpc_set_fr_fr(m_data, a.data(), b.data(), GMP_RNDN);\n      }\n      return *this;\n   }\n   void swap(mpc_complex_imp& o) noexcept\n   {\n      mpc_swap(m_data, o.m_data);\n   }\n   std::string str(std::streamsize digits, std::ios_base::fmtflags f) const\n   {\n      BOOST_MP_ASSERT(m_data[0].re[0]._mpfr_d);\n\n      mpfr_float_backend<digits10> a(0uL, mpc_get_prec(m_data)), b(0uL, mpc_get_prec(m_data));\n\n      mpc_real(a.data(), m_data, GMP_RNDN);\n      mpc_imag(b.data(), m_data, GMP_RNDN);\n\n      if (eval_is_zero(b))\n         return a.str(digits, f);\n\n      return \"(\" + a.str(digits, f) + \",\" + b.str(digits, f) + \")\";\n   }\n   ~mpc_complex_imp() noexcept\n   {\n      if (m_data[0].re[0]._mpfr_d)\n         mpc_clear(m_data);\n   }\n   void negate() noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0].re[0]._mpfr_d);\n      mpc_neg(m_data, m_data, GMP_RNDN);\n   }\n   int compare(const mpc_complex_imp& o) const noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0].re[0]._mpfr_d && o.m_data[0].re[0]._mpfr_d);\n      return mpc_cmp(m_data, o.m_data);\n   }\n   int compare(const mpc_complex_backend<digits10>& o) const noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0].re[0]._mpfr_d && o.m_data[0].re[0]._mpfr_d);\n      return mpc_cmp(m_data, o.data());\n   }\n   int compare(long int i) const noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0].re[0]._mpfr_d);\n      return mpc_cmp_si(m_data, i);\n   }\n   int compare(unsigned long int i) const noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0].re[0]._mpfr_d);\n      constexpr const unsigned long int max_val = (std::numeric_limits<long>::max)();\n      if (i > max_val)\n      {\n         mpc_complex_imp d(mpc_get_prec(m_data));\n         d = i;\n         return compare(d);\n      }\n      return mpc_cmp_si(m_data, static_cast<long>(i));\n   }\n   template <class V>\n   int compare(const V& v) const noexcept\n   {\n      mpc_complex_imp d(mpc_get_prec(m_data));\n      d = v;\n      return compare(d);\n   }\n   mpc_t& data() noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0].re[0]._mpfr_d);\n      return m_data;\n   }\n   const mpc_t& data() const noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0].re[0]._mpfr_d);\n      return m_data;\n   }\n\n protected:\n   mpc_t            m_data;\n   static boost::multiprecision::detail::precision_type& get_global_default_precision() noexcept\n   {\n      static boost::multiprecision::detail::precision_type val(BOOST_MULTIPRECISION_MPFI_DEFAULT_PRECISION);\n      return val;\n   }\n   static unsigned& get_default_precision() noexcept\n   {\n      static BOOST_MP_THREAD_LOCAL unsigned val(get_global_default_precision());\n      return val;\n   }\n#ifndef BOOST_MT_NO_ATOMIC_INT\n   static std::atomic<variable_precision_options>& get_global_default_options() noexcept\n#else\n   static variable_precision_options& get_global_default_options() noexcept\n#endif\n   {\n#ifndef BOOST_MT_NO_ATOMIC_INT\n      static std::atomic<variable_precision_options> val{variable_precision_options::preserve_related_precision};\n#else\n      static variable_precision_options val{variable_precision_options::preserve_related_precision};\n#endif\n      return val;\n   }\n   static variable_precision_options& get_default_options() noexcept\n   {\n      static BOOST_MP_THREAD_LOCAL variable_precision_options val(get_global_default_options());\n      return val;\n   }\n   static bool preserve_source_precision() noexcept\n   {\n      return get_default_options() >= variable_precision_options::preserve_source_precision;\n   }\n   static bool preserve_component_precision() noexcept\n   {\n      return get_default_options() >= variable_precision_options::preserve_component_precision;\n   }\n   static bool preserve_related_precision() noexcept\n   {\n      return get_default_options() >= variable_precision_options::preserve_related_precision;\n   }\n   static bool preserve_all_precision() noexcept\n   {\n      return get_default_options() >= variable_precision_options::preserve_all_precision;\n   }\n};\n\n} // namespace detail\n\ntemplate <unsigned digits10>\nstruct mpc_complex_backend : public detail::mpc_complex_imp<digits10>\n{\n   mpc_complex_backend() : detail::mpc_complex_imp<digits10>() {}\n   mpc_complex_backend(const mpc_complex_backend& o) : detail::mpc_complex_imp<digits10>(o) {}\n   // rvalue copy\n   mpc_complex_backend(mpc_complex_backend&& o) : detail::mpc_complex_imp<digits10>(static_cast<detail::mpc_complex_imp<digits10>&&>(o))\n   {}\n   template <unsigned D>\n   mpc_complex_backend(const mpc_complex_backend<D>& val, typename std::enable_if<D <= digits10>::type* = nullptr)\n       : detail::mpc_complex_imp<digits10>()\n   {\n      mpc_set(this->m_data, val.data(), GMP_RNDN);\n   }\n   template <unsigned D>\n   explicit mpc_complex_backend(const mpc_complex_backend<D>& val, typename std::enable_if<!(D <= digits10)>::type* = nullptr)\n       : detail::mpc_complex_imp<digits10>()\n   {\n      mpc_set(this->m_data, val.data(), GMP_RNDN);\n   }\n   mpc_complex_backend(const mpc_t val)\n       : detail::mpc_complex_imp<digits10>()\n   {\n      mpc_set(this->m_data, val, GMP_RNDN);\n   }\n   mpc_complex_backend(const std::complex<float>& val)\n       : detail::mpc_complex_imp<digits10>()\n   {\n      mpc_set_d_d(this->m_data, val.real(), val.imag(), GMP_RNDN);\n   }\n   mpc_complex_backend(const std::complex<double>& val)\n       : detail::mpc_complex_imp<digits10>()\n   {\n      mpc_set_d_d(this->m_data, val.real(), val.imag(), GMP_RNDN);\n   }\n   mpc_complex_backend(const std::complex<long double>& val)\n       : detail::mpc_complex_imp<digits10>()\n   {\n      mpc_set_ld_ld(this->m_data, val.real(), val.imag(), GMP_RNDN);\n   }\n   mpc_complex_backend(mpz_srcptr val) : detail::mpc_complex_imp<digits10>()\n   {\n      mpc_set_z(this->m_data, val, GMP_RNDN);\n   }\n   mpc_complex_backend& operator=(mpz_srcptr val)\n   {\n      mpc_set_z(this->m_data, val, GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_backend(gmp_int const& val) : detail::mpc_complex_imp<digits10>()\n   {\n      mpc_set_z(this->m_data, val.data(), GMP_RNDN);\n   }\n   mpc_complex_backend& operator=(gmp_int const& val)\n   {\n      mpc_set_z(this->m_data, val.data(), GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_backend(mpf_srcptr val) : detail::mpc_complex_imp<digits10>()\n   {\n      mpc_set_f(this->m_data, val, GMP_RNDN);\n   }\n   mpc_complex_backend& operator=(mpf_srcptr val)\n   {\n      mpc_set_f(this->m_data, val, GMP_RNDN);\n      return *this;\n   }\n   template <unsigned D10>\n   mpc_complex_backend(gmp_float<D10> const& val) : detail::mpc_complex_imp<digits10>()\n   {\n      mpc_set_f(this->m_data, val.data(), GMP_RNDN);\n   }\n   template <unsigned D10>\n   mpc_complex_backend& operator=(gmp_float<D10> const& val)\n   {\n      mpc_set_f(this->m_data, val.data(), GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_backend(mpq_srcptr val) : detail::mpc_complex_imp<digits10>()\n   {\n      mpc_set_q(this->m_data, val, GMP_RNDN);\n   }\n   mpc_complex_backend& operator=(mpq_srcptr val)\n   {\n      mpc_set_q(this->m_data, val, GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_backend(gmp_rational const& val) : detail::mpc_complex_imp<digits10>()\n   {\n      mpc_set_q(this->m_data, val.data(), GMP_RNDN);\n   }\n   mpc_complex_backend& operator=(gmp_rational const& val)\n   {\n      mpc_set_q(this->m_data, val.data(), GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_backend(mpfr_srcptr val) : detail::mpc_complex_imp<digits10>()\n   {\n      mpc_set_fr(this->m_data, val, GMP_RNDN);\n   }\n   mpc_complex_backend& operator=(mpfr_srcptr val)\n   {\n      mpc_set_fr(this->m_data, val, GMP_RNDN);\n      return *this;\n   }\n   template <unsigned D10, mpfr_allocation_type AllocationType>\n   mpc_complex_backend(mpfr_float_backend<D10, AllocationType> const& val, typename std::enable_if<D10 <= digits10>::type* = nullptr) : detail::mpc_complex_imp<digits10>()\n   {\n      mpc_set_fr(this->m_data, val.data(), GMP_RNDN);\n   }\n   template <unsigned D10, mpfr_allocation_type AllocationType>\n   explicit mpc_complex_backend(mpfr_float_backend<D10, AllocationType> const& val, typename std::enable_if<!(D10 <= digits10)>::type* = nullptr) : detail::mpc_complex_imp<digits10>()\n   {\n      mpc_set_fr(this->m_data, val.data(), GMP_RNDN);\n   }\n   template <unsigned D10, mpfr_allocation_type AllocationType>\n   mpc_complex_backend& operator=(mpfr_float_backend<D10, AllocationType> const& val)\n   {\n      mpc_set_fr(this->m_data, val.data(), GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_backend& operator=(const mpc_complex_backend& o)\n   {\n      *static_cast<detail::mpc_complex_imp<digits10>*>(this) = static_cast<detail::mpc_complex_imp<digits10> const&>(o);\n      return *this;\n   }\n   // rvalue assign\n   mpc_complex_backend& operator=(mpc_complex_backend&& o) noexcept\n   {\n      *static_cast<detail::mpc_complex_imp<digits10>*>(this) = static_cast<detail::mpc_complex_imp<digits10>&&>(o);\n      return *this;\n   }\n   template <class V>\n   typename std::enable_if<std::is_assignable<detail::mpc_complex_imp<digits10>, V>::value, mpc_complex_backend&>::type operator=(const V& v)\n   {\n      *static_cast<detail::mpc_complex_imp<digits10>*>(this) = v;\n      return *this;\n   }\n   mpc_complex_backend& operator=(const mpc_t val)\n   {\n      mpc_set(this->m_data, val, GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_backend& operator=(const std::complex<float>& val)\n   {\n      mpc_set_d_d(this->m_data, val.real(), val.imag(), GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_backend& operator=(const std::complex<double>& val)\n   {\n      mpc_set_d_d(this->m_data, val.real(), val.imag(), GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_backend& operator=(const std::complex<long double>& val)\n   {\n      mpc_set_ld_ld(this->m_data, val.real(), val.imag(), GMP_RNDN);\n      return *this;\n   }\n   // We don't change our precision here, this is a fixed precision type:\n   template <unsigned D>\n   mpc_complex_backend& operator=(const mpc_complex_backend<D>& val)\n   {\n      mpc_set(this->m_data, val.data(), GMP_RNDN);\n      return *this;\n   }\n};\n\ntemplate <>\nstruct mpc_complex_backend<0> : public detail::mpc_complex_imp<0>\n{\n   mpc_complex_backend() : detail::mpc_complex_imp<0>() {}\n   mpc_complex_backend(const mpc_t val)\n       : detail::mpc_complex_imp<0>(mpc_get_prec(val))\n   {\n      mpc_set(this->m_data, val, GMP_RNDN);\n   }\n   mpc_complex_backend(const mpc_complex_backend& o) : detail::mpc_complex_imp<0>(o) {}\n   // rvalue copy\n   mpc_complex_backend(mpc_complex_backend&& o) noexcept : detail::mpc_complex_imp<0>(static_cast<detail::mpc_complex_imp<0>&&>(o))\n   {}\n   mpc_complex_backend(const mpc_complex_backend& o, unsigned digits10)\n       : detail::mpc_complex_imp<0>(multiprecision::detail::digits10_2_2(digits10))\n   {\n      mpc_set(this->m_data, o.data(), GMP_RNDN);\n   }\n   template <unsigned D>\n   mpc_complex_backend(const mpc_complex_backend<D>& val)\n       : detail::mpc_complex_imp<0>(preserve_related_precision() ? mpc_get_prec(val.data()) : multiprecision::detail::digits10_2_2(get_default_precision()))\n   {\n      mpc_set(this->m_data, val.data(), GMP_RNDN);\n   }\n   template <unsigned D>\n   mpc_complex_backend(const mpfr_float_backend<D>& val)\n       : detail::mpc_complex_imp<0>((D == 0 ? this->preserve_component_precision() : this->preserve_related_precision()) ? mpfr_get_prec(val.data()) : multiprecision::detail::digits10_2_2(this->get_default_precision()))\n   {\n      mpc_set_fr(this->m_data, val.data(), GMP_RNDN);\n   }\n   mpc_complex_backend(mpz_srcptr val) : detail::mpc_complex_imp<0>()\n   {\n      mpc_set_z(this->m_data, val, GMP_RNDN);\n   }\n   mpc_complex_backend& operator=(mpz_srcptr val)\n   {\n      mpc_set_z(this->m_data, val, GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_backend(gmp_int const& val) : detail::mpc_complex_imp<0>(preserve_all_precision() ? used_gmp_int_bits(val) : boost::multiprecision::detail::digits10_2_2(thread_default_precision()))\n   {\n      mpc_set_z(this->m_data, val.data(), GMP_RNDN);\n   }\n   mpc_complex_backend& operator=(gmp_int const& val)\n   {\n      if (this->m_data[0].im->_mpfr_d == nullptr)\n      {\n         unsigned requested_precision = this->thread_default_precision();\n         if (thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision)\n         {\n            unsigned d2 = used_gmp_int_bits(val);\n            unsigned d10 = 1 + multiprecision::detail::digits2_2_10(d2);\n            if (d10 > requested_precision)\n               requested_precision = d10;\n         }\n         mpc_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));\n      }\n      else if (thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision)\n      {\n         unsigned requested_precision = this->thread_default_precision();\n         unsigned d2 = used_gmp_int_bits(val);\n         unsigned d10 = 1 + multiprecision::detail::digits2_2_10(d2);\n         if (d10 > requested_precision)\n            this->precision(d10);\n      }\n      mpc_set_z(this->m_data, val.data(), GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_backend(mpf_srcptr val) : detail::mpc_complex_imp<0>((unsigned)mpf_get_prec(val))\n   {\n      mpc_set_f(this->m_data, val, GMP_RNDN);\n   }\n   mpc_complex_backend& operator=(mpf_srcptr val)\n   {\n      if ((mp_bitcnt_t)mpc_get_prec(data()) != mpf_get_prec(val))\n      {\n         mpc_complex_backend t(val);\n         t.swap(*this);\n      }\n      else\n         mpc_set_f(this->m_data, val, GMP_RNDN);\n      return *this;\n   }\n   template <unsigned digits10>\n   mpc_complex_backend(gmp_float<digits10> const& val) : detail::mpc_complex_imp<0>(preserve_all_precision() ? (unsigned)mpf_get_prec(val.data()) : multiprecision::detail::digits10_2_2(get_default_precision()))\n   {\n      mpc_set_f(this->m_data, val.data(), GMP_RNDN);\n   }\n   template <unsigned digits10>\n   mpc_complex_backend& operator=(gmp_float<digits10> const& val)\n   {\n      if (preserve_all_precision() && (mpc_get_prec(data()) != (mpfr_prec_t)mpf_get_prec(val.data())))\n      {\n         mpc_complex_backend t(val);\n         t.swap(*this);\n      }\n      else\n         mpc_set_f(this->m_data, val.data(), GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_backend(mpq_srcptr val) : detail::mpc_complex_imp<0>()\n   {\n      mpc_set_q(this->m_data, val, GMP_RNDN);\n   }\n   mpc_complex_backend& operator=(mpq_srcptr val)\n   {\n      mpc_set_q(this->m_data, val, GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_backend(gmp_rational const& val) : detail::mpc_complex_imp<0>(preserve_all_precision() ? used_gmp_rational_bits(val) : boost::multiprecision::detail::digits10_2_2(thread_default_precision()))\n   {\n      mpc_set_q(this->m_data, val.data(), GMP_RNDN);\n   }\n   mpc_complex_backend& operator=(gmp_rational const& val)\n   {\n      if (this->m_data[0].im->_mpfr_d == nullptr)\n      {\n         unsigned requested_precision = this->get_default_precision();\n         if (thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision)\n         {\n            unsigned d10 = 1 + multiprecision::detail::digits2_2_10(used_gmp_rational_bits(val));\n            if (d10 > requested_precision)\n               requested_precision = d10;\n         }\n         mpc_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));\n      }\n      else if (thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision)\n      {\n         unsigned requested_precision = this->get_default_precision();\n         unsigned d10 = 1 + multiprecision::detail::digits2_2_10(used_gmp_rational_bits(val));\n         if (d10 > requested_precision)\n            this->precision(d10);\n      }\n      mpc_set_q(this->m_data, val.data(), GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_backend(mpfr_srcptr val) : detail::mpc_complex_imp<0>(mpfr_get_prec(val))\n   {\n      mpc_set_fr(this->m_data, val, GMP_RNDN);\n   }\n   mpc_complex_backend& operator=(mpfr_srcptr val)\n   {\n      if (mpc_get_prec(data()) != mpfr_get_prec(val))\n      {\n         mpc_complex_backend t(val);\n         t.swap(*this);\n      }\n      else\n         mpc_set_fr(this->m_data, val, GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_backend(const std::complex<float>& val)\n       : detail::mpc_complex_imp<0>()\n   {\n      mpc_set_d_d(this->m_data, val.real(), val.imag(), GMP_RNDN);\n   }\n   mpc_complex_backend(const std::complex<double>& val)\n       : detail::mpc_complex_imp<0>()\n   {\n      mpc_set_d_d(this->m_data, val.real(), val.imag(), GMP_RNDN);\n   }\n   mpc_complex_backend(const std::complex<long double>& val)\n       : detail::mpc_complex_imp<0>()\n   {\n      mpc_set_ld_ld(this->m_data, val.real(), val.imag(), GMP_RNDN);\n   }\n   // Construction with precision:\n   template <class T, class U>\n   mpc_complex_backend(const T& a, const U& b, unsigned digits10)\n       : detail::mpc_complex_imp<0>(multiprecision::detail::digits10_2_2(digits10))\n   {\n      // We can't use assign_components here because it copies the precision of\n      // a and b, not digits10....\n      boost::multiprecision::detail::scoped_precision_options<mpfr_float> scoped(*this);\n      (void)scoped;\n      mpfr_float ca(a), cb(b);\n      mpc_set_fr_fr(this->data(), ca.backend().data(), cb.backend().data(), GMP_RNDN);\n   }\n   template <unsigned N>\n   mpc_complex_backend(const mpfr_float_backend<N>& a, const mpfr_float_backend<N>& b, unsigned digits10)\n       : detail::mpc_complex_imp<0>(multiprecision::detail::digits10_2_2(digits10))\n   {\n      mpc_set_fr_fr(this->data(), a.data(), b.data(), GMP_RNDN);\n   }\n\n   mpc_complex_backend& operator=(const mpc_complex_backend& o) = default;\n   // rvalue assign\n   mpc_complex_backend& operator=(mpc_complex_backend&& o) noexcept = default;\n\n   template <class V>\n   mpc_complex_backend& operator=(const V& v)\n   {\n      constexpr unsigned d10 = std::is_floating_point<V>::value ?\n         std::numeric_limits<V>::digits10 :\n         std::numeric_limits<V>::digits10 ? 1 + std::numeric_limits<V>::digits10 :\n         1 + boost::multiprecision::detail::digits2_2_10(std::numeric_limits<V>::digits);\n\n      if (thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision)\n      {\n         BOOST_IF_CONSTEXPR(std::is_floating_point<V>::value)\n         {\n            if (std::numeric_limits<V>::digits > mpc_get_prec(this->data()))\n               mpc_set_prec(this->data(), std::numeric_limits<V>::digits);\n         }\n      else\n      {\n         if (precision() < d10)\n            this->precision(d10);\n      }\n      }\n\n      *static_cast<detail::mpc_complex_imp<0>*>(this) = v;\n      return *this;\n   }\n   mpc_complex_backend& operator=(const mpc_t val)\n   {\n      mpc_set_prec(this->m_data, mpc_get_prec(val));\n      mpc_set(this->m_data, val, GMP_RNDN);\n      return *this;\n   }\n   template <unsigned D>\n   mpc_complex_backend& operator=(const mpc_complex_backend<D>& val)\n   {\n      mpc_set_prec(this->m_data, mpc_get_prec(val.data()));\n      mpc_set(this->m_data, val.data(), GMP_RNDN);\n      return *this;\n   }\n   template <unsigned D>\n   mpc_complex_backend& operator=(const mpfr_float_backend<D>& val)\n   {\n      if (D == 0 ? this->preserve_component_precision() : this->preserve_related_precision())\n         mpc_set_prec(this->m_data, mpfr_get_prec(val.data()));\n      mpc_set_fr(this->m_data, val.data(), GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_backend& operator=(const std::complex<float>& val)\n   {\n      mpc_set_d_d(this->m_data, val.real(), val.imag(), GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_backend& operator=(const std::complex<double>& val)\n   {\n      mpc_set_d_d(this->m_data, val.real(), val.imag(), GMP_RNDN);\n      return *this;\n   }\n   mpc_complex_backend& operator=(const std::complex<long double>& val)\n   {\n      mpc_set_ld_ld(this->m_data, val.real(), val.imag(), GMP_RNDN);\n      return *this;\n   }\n   static unsigned default_precision() noexcept\n   {\n      return get_global_default_precision();\n   }\n   static void default_precision(unsigned v) noexcept\n   {\n      get_global_default_precision() = v;\n   }\n   static unsigned thread_default_precision() noexcept\n   {\n      return get_default_precision();\n   }\n   static void thread_default_precision(unsigned v) noexcept\n   {\n      get_default_precision() = v;\n   }\n   unsigned precision() const noexcept\n   {\n      return multiprecision::detail::digits2_2_10(mpc_get_prec(this->m_data));\n   }\n   void precision(unsigned digits10) noexcept\n   {\n      mpfr_prec_round(mpc_realref(this->m_data), multiprecision::detail::digits10_2_2((digits10)), GMP_RNDN);\n      mpfr_prec_round(mpc_imagref(this->m_data), multiprecision::detail::digits10_2_2((digits10)), GMP_RNDN);\n   }\n   //\n   // Variable precision options:\n   //\n   static variable_precision_options default_variable_precision_options() noexcept\n   {\n      return get_global_default_options();\n   }\n   static variable_precision_options thread_default_variable_precision_options() noexcept\n   {\n      return get_default_options();\n   }\n   static void default_variable_precision_options(variable_precision_options opts)\n   {\n      get_global_default_options() = opts;\n   }\n   static void thread_default_variable_precision_options(variable_precision_options opts)\n   {\n      get_default_options() = opts;\n   }\n};\n\ntemplate <unsigned digits10, class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_arithmetic<T>::value, bool>::type eval_eq(const mpc_complex_backend<digits10>& a, const T& b) noexcept\n{\n   return a.compare(b) == 0;\n}\ntemplate <unsigned digits10, class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_arithmetic<T>::value, bool>::type eval_lt(const mpc_complex_backend<digits10>& a, const T& b) noexcept\n{\n   return a.compare(b) < 0;\n}\ntemplate <unsigned digits10, class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_arithmetic<T>::value, bool>::type eval_gt(const mpc_complex_backend<digits10>& a, const T& b) noexcept\n{\n   return a.compare(b) > 0;\n}\n\ntemplate <unsigned D1, unsigned D2>\ninline void eval_add(mpc_complex_backend<D1>& result, const mpc_complex_backend<D2>& o)\n{\n   mpc_add(result.data(), result.data(), o.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_add(mpc_complex_backend<D1>& result, const mpfr_float_backend<D2>& o)\n{\n   mpc_add_fr(result.data(), result.data(), o.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_subtract(mpc_complex_backend<D1>& result, const mpc_complex_backend<D2>& o)\n{\n   mpc_sub(result.data(), result.data(), o.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_subtract(mpc_complex_backend<D1>& result, const mpfr_float_backend<D2>& o)\n{\n   mpc_sub_fr(result.data(), result.data(), o.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_multiply(mpc_complex_backend<D1>& result, const mpc_complex_backend<D2>& o)\n{\n   if ((void*)&result == (void*)&o)\n      mpc_sqr(result.data(), o.data(), GMP_RNDN);\n   else\n      mpc_mul(result.data(), result.data(), o.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_multiply(mpc_complex_backend<D1>& result, const mpfr_float_backend<D2>& o)\n{\n   mpc_mul_fr(result.data(), result.data(), o.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_divide(mpc_complex_backend<D1>& result, const mpc_complex_backend<D2>& o)\n{\n   mpc_div(result.data(), result.data(), o.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_divide(mpc_complex_backend<D1>& result, const mpfr_float_backend<D2>& o)\n{\n   mpc_div_fr(result.data(), result.data(), o.data(), GMP_RNDN);\n}\ntemplate <unsigned digits10>\ninline void eval_add(mpc_complex_backend<digits10>& result, unsigned long i)\n{\n   mpc_add_ui(result.data(), result.data(), i, GMP_RNDN);\n}\ntemplate <unsigned digits10>\ninline void eval_subtract(mpc_complex_backend<digits10>& result, unsigned long i)\n{\n   mpc_sub_ui(result.data(), result.data(), i, GMP_RNDN);\n}\ntemplate <unsigned digits10>\ninline void eval_multiply(mpc_complex_backend<digits10>& result, unsigned long i)\n{\n   mpc_mul_ui(result.data(), result.data(), i, GMP_RNDN);\n}\ntemplate <unsigned digits10>\ninline void eval_divide(mpc_complex_backend<digits10>& result, unsigned long i)\n{\n   mpc_div_ui(result.data(), result.data(), i, GMP_RNDN);\n}\ntemplate <unsigned digits10>\ninline void eval_add(mpc_complex_backend<digits10>& result, long i)\n{\n   if (i > 0)\n      mpc_add_ui(result.data(), result.data(), i, GMP_RNDN);\n   else\n      mpc_sub_ui(result.data(), result.data(), boost::multiprecision::detail::unsigned_abs(i), GMP_RNDN);\n}\ntemplate <unsigned digits10>\ninline void eval_subtract(mpc_complex_backend<digits10>& result, long i)\n{\n   if (i > 0)\n      mpc_sub_ui(result.data(), result.data(), i, GMP_RNDN);\n   else\n      mpc_add_ui(result.data(), result.data(), boost::multiprecision::detail::unsigned_abs(i), GMP_RNDN);\n}\ntemplate <unsigned digits10>\ninline void eval_multiply(mpc_complex_backend<digits10>& result, long i)\n{\n   mpc_mul_ui(result.data(), result.data(), boost::multiprecision::detail::unsigned_abs(i), GMP_RNDN);\n   if (i < 0)\n      mpc_neg(result.data(), result.data(), GMP_RNDN);\n}\ntemplate <unsigned digits10>\ninline void eval_divide(mpc_complex_backend<digits10>& result, long i)\n{\n   mpc_div_ui(result.data(), result.data(), boost::multiprecision::detail::unsigned_abs(i), GMP_RNDN);\n   if (i < 0)\n      mpc_neg(result.data(), result.data(), GMP_RNDN);\n}\n//\n// Specialised 3 arg versions of the basic operators:\n//\ntemplate <unsigned D1, unsigned D2, unsigned D3>\ninline void eval_add(mpc_complex_backend<D1>& a, const mpc_complex_backend<D2>& x, const mpc_complex_backend<D3>& y)\n{\n   mpc_add(a.data(), x.data(), y.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, unsigned D3>\ninline void eval_add(mpc_complex_backend<D1>& a, const mpc_complex_backend<D2>& x, const mpfr_float_backend<D3>& y)\n{\n   mpc_add_fr(a.data(), x.data(), y.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, unsigned D3>\ninline void eval_add(mpc_complex_backend<D1>& a, const mpfr_float_backend<D2>& x, const mpc_complex_backend<D3>& y)\n{\n   mpc_add_fr(a.data(), y.data(), x.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_add(mpc_complex_backend<D1>& a, const mpc_complex_backend<D2>& x, unsigned long y)\n{\n   mpc_add_ui(a.data(), x.data(), y, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_add(mpc_complex_backend<D1>& a, const mpc_complex_backend<D2>& x, long y)\n{\n   if (y < 0)\n      mpc_sub_ui(a.data(), x.data(), boost::multiprecision::detail::unsigned_abs(y), GMP_RNDN);\n   else\n      mpc_add_ui(a.data(), x.data(), y, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_add(mpc_complex_backend<D1>& a, unsigned long x, const mpc_complex_backend<D2>& y)\n{\n   mpc_add_ui(a.data(), y.data(), x, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_add(mpc_complex_backend<D1>& a, long x, const mpc_complex_backend<D2>& y)\n{\n   if (x < 0)\n   {\n      mpc_ui_sub(a.data(), boost::multiprecision::detail::unsigned_abs(x), y.data(), GMP_RNDN);\n      mpc_neg(a.data(), a.data(), GMP_RNDN);\n   }\n   else\n      mpc_add_ui(a.data(), y.data(), x, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, unsigned D3>\ninline void eval_subtract(mpc_complex_backend<D1>& a, const mpc_complex_backend<D2>& x, const mpc_complex_backend<D3>& y)\n{\n   mpc_sub(a.data(), x.data(), y.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, unsigned D3>\ninline void eval_subtract(mpc_complex_backend<D1>& a, const mpc_complex_backend<D2>& x, const mpfr_float_backend<D3>& y)\n{\n   mpc_sub_fr(a.data(), x.data(), y.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, unsigned D3>\ninline void eval_subtract(mpc_complex_backend<D1>& a, const mpfr_float_backend<D2>& x, const mpc_complex_backend<D3>& y)\n{\n   mpc_fr_sub(a.data(), x.data(), y.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_subtract(mpc_complex_backend<D1>& a, const mpc_complex_backend<D2>& x, unsigned long y)\n{\n   mpc_sub_ui(a.data(), x.data(), y, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_subtract(mpc_complex_backend<D1>& a, const mpc_complex_backend<D2>& x, long y)\n{\n   if (y < 0)\n      mpc_add_ui(a.data(), x.data(), boost::multiprecision::detail::unsigned_abs(y), GMP_RNDN);\n   else\n      mpc_sub_ui(a.data(), x.data(), y, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_subtract(mpc_complex_backend<D1>& a, unsigned long x, const mpc_complex_backend<D2>& y)\n{\n   mpc_ui_sub(a.data(), x, y.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_subtract(mpc_complex_backend<D1>& a, long x, const mpc_complex_backend<D2>& y)\n{\n   if (x < 0)\n   {\n      mpc_add_ui(a.data(), y.data(), boost::multiprecision::detail::unsigned_abs(x), GMP_RNDN);\n      mpc_neg(a.data(), a.data(), GMP_RNDN);\n   }\n   else\n      mpc_ui_sub(a.data(), x, y.data(), GMP_RNDN);\n}\n\ntemplate <unsigned D1, unsigned D2, unsigned D3>\ninline void eval_multiply(mpc_complex_backend<D1>& a, const mpc_complex_backend<D2>& x, const mpc_complex_backend<D3>& y)\n{\n   if ((void*)&x == (void*)&y)\n      mpc_sqr(a.data(), x.data(), GMP_RNDN);\n   else\n      mpc_mul(a.data(), x.data(), y.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, unsigned D3>\ninline void eval_multiply(mpc_complex_backend<D1>& a, const mpc_complex_backend<D2>& x, const mpfr_float_backend<D3>& y)\n{\n   mpc_mul_fr(a.data(), x.data(), y.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, unsigned D3>\ninline void eval_multiply(mpc_complex_backend<D1>& a, const mpfr_float_backend<D2>& x, const mpc_complex_backend<D3>& y)\n{\n   mpc_mul_fr(a.data(), y.data(), x.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_multiply(mpc_complex_backend<D1>& a, const mpc_complex_backend<D2>& x, unsigned long y)\n{\n   mpc_mul_ui(a.data(), x.data(), y, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_multiply(mpc_complex_backend<D1>& a, const mpc_complex_backend<D2>& x, long y)\n{\n   if (y < 0)\n   {\n      mpc_mul_ui(a.data(), x.data(), boost::multiprecision::detail::unsigned_abs(y), GMP_RNDN);\n      a.negate();\n   }\n   else\n      mpc_mul_ui(a.data(), x.data(), y, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_multiply(mpc_complex_backend<D1>& a, unsigned long x, const mpc_complex_backend<D2>& y)\n{\n   mpc_mul_ui(a.data(), y.data(), x, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_multiply(mpc_complex_backend<D1>& a, long x, const mpc_complex_backend<D2>& y)\n{\n   if (x < 0)\n   {\n      mpc_mul_ui(a.data(), y.data(), boost::multiprecision::detail::unsigned_abs(x), GMP_RNDN);\n      mpc_neg(a.data(), a.data(), GMP_RNDN);\n   }\n   else\n      mpc_mul_ui(a.data(), y.data(), x, GMP_RNDN);\n}\n\ntemplate <unsigned D1, unsigned D2, unsigned D3>\ninline void eval_divide(mpc_complex_backend<D1>& a, const mpc_complex_backend<D2>& x, const mpc_complex_backend<D3>& y)\n{\n   mpc_div(a.data(), x.data(), y.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, unsigned D3>\ninline void eval_divide(mpc_complex_backend<D1>& a, const mpc_complex_backend<D2>& x, const mpfr_float_backend<D3>& y)\n{\n   mpc_div_fr(a.data(), x.data(), y.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, unsigned D3>\ninline void eval_divide(mpc_complex_backend<D1>& a, const mpfr_float_backend<D2>& x, const mpc_complex_backend<D3>& y)\n{\n   mpc_fr_div(a.data(), x.data(), y.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_divide(mpc_complex_backend<D1>& a, const mpc_complex_backend<D2>& x, unsigned long y)\n{\n   mpc_div_ui(a.data(), x.data(), y, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_divide(mpc_complex_backend<D1>& a, const mpc_complex_backend<D2>& x, long y)\n{\n   if (y < 0)\n   {\n      mpc_div_ui(a.data(), x.data(), boost::multiprecision::detail::unsigned_abs(y), GMP_RNDN);\n      a.negate();\n   }\n   else\n      mpc_div_ui(a.data(), x.data(), y, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_divide(mpc_complex_backend<D1>& a, unsigned long x, const mpc_complex_backend<D2>& y)\n{\n   mpc_ui_div(a.data(), x, y.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_divide(mpc_complex_backend<D1>& a, long x, const mpc_complex_backend<D2>& y)\n{\n   if (x < 0)\n   {\n      mpc_ui_div(a.data(), boost::multiprecision::detail::unsigned_abs(x), y.data(), GMP_RNDN);\n      mpc_neg(a.data(), a.data(), GMP_RNDN);\n   }\n   else\n      mpc_ui_div(a.data(), x, y.data(), GMP_RNDN);\n}\n\ntemplate <unsigned digits10>\ninline bool eval_is_zero(const mpc_complex_backend<digits10>& val) noexcept\n{\n   return (0 != mpfr_zero_p(mpc_realref(val.data()))) && (0 != mpfr_zero_p(mpc_imagref(val.data())));\n}\ntemplate <unsigned digits10>\ninline int eval_get_sign(const mpc_complex_backend<digits10>&)\n{\n   static_assert(digits10 == UINT_MAX, \"Complex numbers have no sign bit.\"); // designed to always fail\n   return 0;\n}\n\ntemplate <unsigned digits10>\ninline void eval_convert_to(unsigned long* result, const mpc_complex_backend<digits10>& val)\n{\n   if (0 == mpfr_zero_p(mpc_imagref(val.data())))\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Could not convert imaginary number to scalar.\"));\n   }\n   mpfr_float_backend<digits10> t;\n   mpc_real(t.data(), val.data(), GMP_RNDN);\n   eval_convert_to(result, t);\n}\ntemplate <unsigned digits10>\ninline void eval_convert_to(long* result, const mpc_complex_backend<digits10>& val)\n{\n   if (0 == mpfr_zero_p(mpc_imagref(val.data())))\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Could not convert imaginary number to scalar.\"));\n   }\n   mpfr_float_backend<digits10> t;\n   mpc_real(t.data(), val.data(), GMP_RNDN);\n   eval_convert_to(result, t);\n}\n#ifdef _MPFR_H_HAVE_INTMAX_T\ntemplate <unsigned digits10>\ninline void eval_convert_to(unsigned long long* result, const mpc_complex_backend<digits10>& val)\n{\n   if (0 == mpfr_zero_p(mpc_imagref(val.data())))\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Could not convert imaginary number to scalar.\"));\n   }\n   mpfr_float_backend<digits10> t;\n   mpc_real(t.data(), val.data(), GMP_RNDN);\n   eval_convert_to(result, t);\n}\ntemplate <unsigned digits10>\ninline void eval_convert_to(long long* result, const mpc_complex_backend<digits10>& val)\n{\n   if (0 == mpfr_zero_p(mpc_imagref(val.data())))\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Could not convert imaginary number to scalar.\"));\n   }\n   mpfr_float_backend<digits10> t;\n   mpc_real(t.data(), val.data(), GMP_RNDN);\n   eval_convert_to(result, t);\n}\n#endif\ntemplate <unsigned digits10>\ninline void eval_convert_to(double* result, const mpc_complex_backend<digits10>& val) noexcept\n{\n   if (0 == mpfr_zero_p(mpc_imagref(val.data())))\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Could not convert imaginary number to scalar.\"));\n   }\n   mpfr_float_backend<digits10> t;\n   mpc_real(t.data(), val.data(), GMP_RNDN);\n   eval_convert_to(result, t);\n}\ntemplate <unsigned digits10>\ninline void eval_convert_to(long double* result, const mpc_complex_backend<digits10>& val) noexcept\n{\n   if (0 == mpfr_zero_p(mpc_imagref(val.data())))\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Could not convert imaginary number to scalar.\"));\n   }\n   mpfr_float_backend<digits10> t;\n   mpc_real(t.data(), val.data(), GMP_RNDN);\n   eval_convert_to(result, t);\n}\n#ifdef BOOST_HAS_INT128\ntemplate <unsigned digits10>\ninline void eval_convert_to(uint128_type* result, const mpc_complex_backend<digits10>& val)\n{\n   using default_ops::eval_convert_to;\n   if (0 == mpfr_zero_p(mpc_imagref(val.data())))\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Could not convert imaginary number to scalar.\"));\n   }\n   mpfr_float_backend<digits10> t;\n   mpc_real(t.data(), val.data(), GMP_RNDN);\n   eval_convert_to(result, t);\n}\ntemplate <unsigned digits10>\ninline void eval_convert_to(int128_type* result, const mpc_complex_backend<digits10>& val)\n{\n   using default_ops::eval_convert_to;\n   if (0 == mpfr_zero_p(mpc_imagref(val.data())))\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Could not convert imaginary number to scalar.\"));\n   }\n   mpfr_float_backend<digits10> t;\n   mpc_real(t.data(), val.data(), GMP_RNDN);\n   eval_convert_to(result, t);\n}\n#endif\n#ifdef BOOST_HAS_FLOAT128\ntemplate <unsigned digits10>\ninline void eval_convert_to(float128_type* result, const mpc_complex_backend<digits10>& val)\n{\n   using default_ops::eval_convert_to;\n   if (0 == mpfr_zero_p(mpc_imagref(val.data())))\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Could not convert imaginary number to scalar.\"));\n   }\n   mpfr_float_backend<digits10> t;\n   mpc_real(t.data(), val.data(), GMP_RNDN);\n   eval_convert_to(result, t);\n}\n#endif\n\ntemplate <mpfr_allocation_type AllocationType>\ninline void assign_components_set_precision(mpc_complex_backend<0>& result, const mpfr_float_backend<0, AllocationType>& a, const mpfr_float_backend<0, AllocationType>& b)\n{\n   if (result.thread_default_variable_precision_options() >= variable_precision_options::preserve_component_precision)\n   {\n      unsigned long prec = (std::max)(mpfr_get_prec(a.data()), mpfr_get_prec(b.data()));\n      mpc_set_prec(result.data(), prec);\n   }\n}\ntemplate <unsigned D2, mpfr_allocation_type AllocationType>\ninline void assign_components_set_precision(mpc_complex_backend<0>& result, const mpfr_float_backend<D2, AllocationType>& a, const mpfr_float_backend<D2, AllocationType>& b)\n{\n   if (result.thread_default_variable_precision_options() >= variable_precision_options::preserve_related_precision)\n   {\n      unsigned long prec = (std::max)(mpfr_get_prec(a.data()), mpfr_get_prec(b.data()));\n      mpc_set_prec(result.data(), prec);\n   }\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type AllocationType>\ninline void assign_components_set_precision(mpc_complex_backend<D1>&, const mpfr_float_backend<D2, AllocationType>&, const mpfr_float_backend<D2, AllocationType>&)\n{\n}\n\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type AllocationType>\ninline void assign_components(mpc_complex_backend<D1>& result, const mpfr_float_backend<D2, AllocationType>& a, const mpfr_float_backend<D2, AllocationType>& b)\n{\n   //\n   // This is called from class number's constructors, so if we have variable\n   // precision, then copy the precision of the source variables.\n   //\n   assign_components_set_precision(result, a, b);\n   using default_ops::eval_fpclassify;\n   if (eval_fpclassify(a) == static_cast<int>(FP_NAN))\n   {\n      mpc_set_fr(result.data(), a.data(), GMP_RNDN);\n   }\n   else if (eval_fpclassify(b) == static_cast<int>(FP_NAN))\n   {\n      mpc_set_fr(result.data(), b.data(), GMP_RNDN);\n   }\n   else\n   {\n      mpc_set_fr_fr(result.data(), a.data(), b.data(), GMP_RNDN);\n   }\n}\n\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type AllocationType>\ninline void assign_components(mpc_complex_backend<D1>& result, unsigned long a, unsigned long b)\n{\n   mpc_set_ui_ui(result.data(), a, b, GMP_RNDN);\n}\n\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type AllocationType>\ninline void assign_components(mpc_complex_backend<D1>& result, long a, long b)\n{\n   mpc_set_si_si(result.data(), a, b, GMP_RNDN);\n}\n\n#if defined(BOOST_HAS_LONG_LONG) && defined(_MPFR_H_HAVE_INTMAX_T)\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type AllocationType>\ninline void assign_components(mpc_complex_backend<D1>& result, unsigned long long a, unsigned long long b)\n{\n   mpc_set_uj_uj(result.data(), a, b, GMP_RNDN);\n}\n\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type AllocationType>\ninline void assign_components(mpc_complex_backend<D1>& result, long long a, long long b)\n{\n   mpc_set_sj_sj(result.data(), a, b, GMP_RNDN);\n}\n#endif\n\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type AllocationType>\ninline void assign_components(mpc_complex_backend<D1>& result, double a, double b)\n{\n   if (BOOST_MP_ISNAN(a))\n   {\n      mpc_set_d(result.data(), a, GMP_RNDN);\n   }\n   else if (BOOST_MP_ISNAN(b))\n   {\n      mpc_set_d(result.data(), b, GMP_RNDN);\n   }\n   else\n   {\n      mpc_set_d_d(result.data(), a, b, GMP_RNDN);\n   }\n}\n\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type AllocationType>\ninline void assign_components(mpc_complex_backend<D1>& result, long double a, long double b)\n{\n   if (BOOST_MP_ISNAN(a))\n   {\n      mpc_set_d(result.data(), a, GMP_RNDN);\n   }\n   else if (BOOST_MP_ISNAN(b))\n   {\n      mpc_set_d(result.data(), b, GMP_RNDN);\n   }\n   else\n   {\n      mpc_set_ld_ld(result.data(), a, b, GMP_RNDN);\n   }\n}\n\n//\n// Native non-member operations:\n//\ntemplate <unsigned Digits10>\ninline void eval_sqrt(mpc_complex_backend<Digits10>& result, const mpc_complex_backend<Digits10>& val)\n{\n   mpc_sqrt(result.data(), val.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_pow(mpc_complex_backend<Digits10>& result, const mpc_complex_backend<Digits10>& b, const mpc_complex_backend<Digits10>& e)\n{\n   mpc_pow(result.data(), b.data(), e.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_exp(mpc_complex_backend<Digits10>& result, const mpc_complex_backend<Digits10>& arg)\n{\n   mpc_exp(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_log(mpc_complex_backend<Digits10>& result, const mpc_complex_backend<Digits10>& arg)\n{\n   mpc_log(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_log10(mpc_complex_backend<Digits10>& result, const mpc_complex_backend<Digits10>& arg)\n{\n   mpc_log10(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_sin(mpc_complex_backend<Digits10>& result, const mpc_complex_backend<Digits10>& arg)\n{\n   mpc_sin(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_cos(mpc_complex_backend<Digits10>& result, const mpc_complex_backend<Digits10>& arg)\n{\n   mpc_cos(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_tan(mpc_complex_backend<Digits10>& result, const mpc_complex_backend<Digits10>& arg)\n{\n   mpc_tan(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_asin(mpc_complex_backend<Digits10>& result, const mpc_complex_backend<Digits10>& arg)\n{\n   mpc_asin(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_acos(mpc_complex_backend<Digits10>& result, const mpc_complex_backend<Digits10>& arg)\n{\n   mpc_acos(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_atan(mpc_complex_backend<Digits10>& result, const mpc_complex_backend<Digits10>& arg)\n{\n   mpc_atan(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_sinh(mpc_complex_backend<Digits10>& result, const mpc_complex_backend<Digits10>& arg)\n{\n   mpc_sinh(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_cosh(mpc_complex_backend<Digits10>& result, const mpc_complex_backend<Digits10>& arg)\n{\n   mpc_cosh(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_tanh(mpc_complex_backend<Digits10>& result, const mpc_complex_backend<Digits10>& arg)\n{\n   mpc_tanh(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_asinh(mpc_complex_backend<Digits10>& result, const mpc_complex_backend<Digits10>& arg)\n{\n   mpc_asinh(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_acosh(mpc_complex_backend<Digits10>& result, const mpc_complex_backend<Digits10>& arg)\n{\n   mpc_acosh(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_atanh(mpc_complex_backend<Digits10>& result, const mpc_complex_backend<Digits10>& arg)\n{\n   mpc_atanh(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_conj(mpc_complex_backend<Digits10>& result, const mpc_complex_backend<Digits10>& arg)\n{\n   mpc_conj(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_proj(mpc_complex_backend<Digits10>& result, const mpc_complex_backend<Digits10>& arg)\n{\n   mpc_proj(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_real(mpfr_float_backend<Digits10>& result, const mpc_complex_backend<Digits10>& arg)\n{\n   mpfr_set_prec(result.data(), mpfr_get_prec(mpc_realref(arg.data())));\n   mpfr_set(result.data(), mpc_realref(arg.data()), GMP_RNDN);\n}\ntemplate <unsigned Digits10>\ninline void eval_imag(mpfr_float_backend<Digits10>& result, const mpc_complex_backend<Digits10>& arg)\n{\n   mpfr_set_prec(result.data(), mpfr_get_prec(mpc_imagref(arg.data())));\n   mpfr_set(result.data(), mpc_imagref(arg.data()), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_set_imag(mpc_complex_backend<Digits10>& result, const mpfr_float_backend<Digits10>& arg)\n{\n   mpfr_set(mpc_imagref(result.data()), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10>\ninline void eval_set_real(mpc_complex_backend<Digits10>& result, const mpfr_float_backend<Digits10>& arg)\n{\n   mpfr_set(mpc_realref(result.data()), arg.data(), GMP_RNDN);\n}\ntemplate <unsigned Digits10>\ninline void eval_set_real(mpc_complex_backend<Digits10>& result, const gmp_int& arg)\n{\n   mpfr_set_z(mpc_realref(result.data()), arg.data(), GMP_RNDN);\n}\ntemplate <unsigned Digits10>\ninline void eval_set_real(mpc_complex_backend<Digits10>& result, const gmp_rational& arg)\n{\n   mpfr_set_q(mpc_realref(result.data()), arg.data(), GMP_RNDN);\n}\ntemplate <unsigned Digits10>\ninline void eval_set_real(mpc_complex_backend<Digits10>& result, const unsigned& arg)\n{\n   mpfr_set_ui(mpc_realref(result.data()), arg, GMP_RNDN);\n}\ntemplate <unsigned Digits10>\ninline void eval_set_real(mpc_complex_backend<Digits10>& result, const unsigned long& arg)\n{\n   mpfr_set_ui(mpc_realref(result.data()), arg, GMP_RNDN);\n}\ntemplate <unsigned Digits10>\ninline void eval_set_real(mpc_complex_backend<Digits10>& result, const int& arg)\n{\n   mpfr_set_si(mpc_realref(result.data()), arg, GMP_RNDN);\n}\ntemplate <unsigned Digits10>\ninline void eval_set_real(mpc_complex_backend<Digits10>& result, const long& arg)\n{\n   mpfr_set_si(mpc_realref(result.data()), arg, GMP_RNDN);\n}\ntemplate <unsigned Digits10>\ninline void eval_set_real(mpc_complex_backend<Digits10>& result, const float& arg)\n{\n   mpfr_set_flt(mpc_realref(result.data()), arg, GMP_RNDN);\n}\ntemplate <unsigned Digits10>\ninline void eval_set_real(mpc_complex_backend<Digits10>& result, const double& arg)\n{\n   mpfr_set_d(mpc_realref(result.data()), arg, GMP_RNDN);\n}\ntemplate <unsigned Digits10>\ninline void eval_set_real(mpc_complex_backend<Digits10>& result, const long double& arg)\n{\n   mpfr_set_ld(mpc_realref(result.data()), arg, GMP_RNDN);\n}\n#if defined(BOOST_HAS_LONG_LONG) && defined(_MPFR_H_HAVE_INTMAX_T)\ntemplate <unsigned Digits10>\ninline void eval_set_real(mpc_complex_backend<Digits10>& result, const unsigned long long& arg)\n{\n   mpfr_set_uj(mpc_realref(result.data()), arg, GMP_RNDN);\n}\ntemplate <unsigned Digits10>\ninline void eval_set_real(mpc_complex_backend<Digits10>& result, const long long& arg)\n{\n   mpfr_set_sj(mpc_realref(result.data()), arg, GMP_RNDN);\n}\n#endif\n\ntemplate <unsigned Digits10>\ninline void eval_set_imag(mpc_complex_backend<Digits10>& result, const gmp_int& arg)\n{\n   mpfr_set_z(mpc_imagref(result.data()), arg.data(), GMP_RNDN);\n}\ntemplate <unsigned Digits10>\ninline void eval_set_imag(mpc_complex_backend<Digits10>& result, const gmp_rational& arg)\n{\n   mpfr_set_q(mpc_imagref(result.data()), arg.data(), GMP_RNDN);\n}\ntemplate <unsigned Digits10>\ninline void eval_set_imag(mpc_complex_backend<Digits10>& result, const unsigned& arg)\n{\n   mpfr_set_ui(mpc_imagref(result.data()), arg, GMP_RNDN);\n}\ntemplate <unsigned Digits10>\ninline void eval_set_imag(mpc_complex_backend<Digits10>& result, const unsigned long& arg)\n{\n   mpfr_set_ui(mpc_imagref(result.data()), arg, GMP_RNDN);\n}\ntemplate <unsigned Digits10>\ninline void eval_set_imag(mpc_complex_backend<Digits10>& result, const int& arg)\n{\n   mpfr_set_si(mpc_imagref(result.data()), arg, GMP_RNDN);\n}\ntemplate <unsigned Digits10>\ninline void eval_set_imag(mpc_complex_backend<Digits10>& result, const long& arg)\n{\n   mpfr_set_si(mpc_imagref(result.data()), arg, GMP_RNDN);\n}\ntemplate <unsigned Digits10>\ninline void eval_set_imag(mpc_complex_backend<Digits10>& result, const float& arg)\n{\n   mpfr_set_flt(mpc_imagref(result.data()), arg, GMP_RNDN);\n}\ntemplate <unsigned Digits10>\ninline void eval_set_imag(mpc_complex_backend<Digits10>& result, const double& arg)\n{\n   mpfr_set_d(mpc_imagref(result.data()), arg, GMP_RNDN);\n}\ntemplate <unsigned Digits10>\ninline void eval_set_imag(mpc_complex_backend<Digits10>& result, const long double& arg)\n{\n   mpfr_set_ld(mpc_imagref(result.data()), arg, GMP_RNDN);\n}\n#if defined(BOOST_HAS_LONG_LONG) && defined(_MPFR_H_HAVE_INTMAX_T)\ntemplate <unsigned Digits10>\ninline void eval_set_imag(mpc_complex_backend<Digits10>& result, const unsigned long long& arg)\n{\n   mpfr_set_uj(mpc_imagref(result.data()), arg, GMP_RNDN);\n}\ntemplate <unsigned Digits10>\ninline void eval_set_imag(mpc_complex_backend<Digits10>& result, const long long& arg)\n{\n   mpfr_set_sj(mpc_imagref(result.data()), arg, GMP_RNDN);\n}\n#endif\n\ntemplate <unsigned Digits10>\ninline std::size_t hash_value(const mpc_complex_backend<Digits10>& val)\n{\n   std::size_t result = 0;\n   std::size_t len    = val.data()[0].re[0]._mpfr_prec / mp_bits_per_limb;\n   if (val.data()[0].re[0]._mpfr_prec % mp_bits_per_limb)\n      ++len;\n   for (std::size_t i = 0; i < len; ++i)\n      boost::multiprecision::detail::hash_combine(result, val.data()[0].re[0]._mpfr_d[i]);\n   boost::multiprecision::detail::hash_combine(result, val.data()[0].re[0]._mpfr_exp, val.data()[0].re[0]._mpfr_sign);\n\n   len = val.data()[0].im[0]._mpfr_prec / mp_bits_per_limb;\n   if (val.data()[0].im[0]._mpfr_prec % mp_bits_per_limb)\n      ++len;\n   for (std::size_t i = 0; i < len; ++i)\n      boost::multiprecision::detail::hash_combine(result, val.data()[0].im[0]._mpfr_d[i]);\n   boost::multiprecision::detail::hash_combine(result, val.data()[0].im[0]._mpfr_exp, val.data()[0].im[0]._mpfr_sign);\n   return result;\n}\n\n} // namespace backends\n\nnamespace detail {\ntemplate <>\nstruct is_variable_precision<backends::mpc_complex_backend<0> > : public std::integral_constant<bool, true>\n{};\n} // namespace detail\n\ntemplate <>\nstruct number_category<detail::canonical<mpc_t, backends::mpc_complex_backend<0> >::type> : public std::integral_constant<int, number_kind_floating_point>\n{};\n\nusing boost::multiprecision::backends::mpc_complex_backend;\n\nusing mpc_complex_50 = number<mpc_complex_backend<50> >  ;\nusing mpc_complex_100 = number<mpc_complex_backend<100> > ;\nusing mpc_complex_500 = number<mpc_complex_backend<500> > ;\nusing mpc_complex_1000 = number<mpc_complex_backend<1000> >;\nusing mpc_complex = number<mpc_complex_backend<0> >   ;\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\nstruct component_type<number<mpc_complex_backend<Digits10>, ExpressionTemplates> >\n{\n   using type = number<mpfr_float_backend<Digits10>, ExpressionTemplates>;\n};\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\nstruct component_type<number<backends::logged_adaptor<mpc_complex_backend<Digits10> >, ExpressionTemplates> >\n{\n   using type = number<mpfr_float_backend<Digits10>, ExpressionTemplates>;\n};\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\nstruct component_type<number<backends::debug_adaptor<mpc_complex_backend<Digits10> >, ExpressionTemplates> >\n{\n   using type = number<backends::debug_adaptor<mpfr_float_backend<Digits10> >, ExpressionTemplates>;\n};\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\nstruct complex_result_from_scalar<number<mpfr_float_backend<Digits10>, ExpressionTemplates> >\n{\n   using type = number<mpc_complex_backend<Digits10>, ExpressionTemplates>;\n};\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\nstruct complex_result_from_scalar<number<backends::logged_adaptor<mpfr_float_backend<Digits10>>, ExpressionTemplates> >\n{\n   using type = number<mpc_complex_backend<Digits10>, ExpressionTemplates>;\n};\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\nstruct complex_result_from_scalar<number<backends::debug_adaptor<mpfr_float_backend<Digits10>>, ExpressionTemplates> >\n{\n   using type = number<backends::debug_adaptor<mpc_complex_backend<Digits10> >, ExpressionTemplates>;\n};\n\n}\n\n} // namespace boost::multiprecision\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/mpfi.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_MPFI_HPP\n#define BOOST_MP_MPFI_HPP\n\n#include <algorithm>\n#include <cmath>\n#include <cstdint>\n#include <type_traits>\n#include <string>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/detail/fpclassify.hpp>\n#include <boost/multiprecision/number.hpp>\n#include <boost/multiprecision/detail/digits.hpp>\n#include <boost/multiprecision/detail/precision.hpp>\n#include <boost/multiprecision/detail/atomic.hpp>\n#include <boost/multiprecision/traits/max_digits10.hpp>\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/multiprecision/logged_adaptor.hpp>\n#include <boost/multiprecision/detail/hash.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n#include <mpfi.h>\n\n#ifdef BOOST_MP_MATH_AVAILABLE\n#include <boost/math/constants/constants.hpp>\n#endif\n\n#ifndef BOOST_MULTIPRECISION_MPFI_DEFAULT_PRECISION\n#define BOOST_MULTIPRECISION_MPFI_DEFAULT_PRECISION 20\n#endif\n\nnamespace boost {\nnamespace multiprecision {\nnamespace backends {\n\ntemplate <unsigned digits10>\nstruct mpfi_float_backend;\n\ntemplate <class Backend>\nstruct debug_adaptor;\n\n} // namespace backends\n\ntemplate <unsigned digits10>\nstruct number_category<backends::mpfi_float_backend<digits10> > : public std::integral_constant<int, number_kind_floating_point>\n{};\n\nstruct interval_error : public std::runtime_error\n{\n   interval_error(const std::string& s) : std::runtime_error(s) {}\n};\n\nnamespace detail {\n   template <>\n   struct is_variable_precision<backends::mpfi_float_backend<0> > : public std::integral_constant<bool, true>\n   {};\n} // namespace detail\n\n\nnamespace backends {\n\nnamespace detail {\n\ninline int mpfi_sgn(mpfi_srcptr p)\n{\n   if (mpfi_is_zero(p))\n      return 0;\n   if (mpfi_is_strictly_pos(p))\n      return 1;\n   if (mpfi_is_strictly_neg(p))\n      return -1;\n   BOOST_MP_THROW_EXCEPTION(interval_error(\"Sign of interval is ambiguous.\"));\n}\n\ntemplate <unsigned digits10>\nstruct mpfi_float_imp;\n\ntemplate <unsigned digits10>\nstruct mpfi_float_imp\n{\n#ifdef BOOST_HAS_LONG_LONG\n   using signed_types = std::tuple<long, long long>          ;\n   using unsigned_types = std::tuple<unsigned long, unsigned long long>;\n#else\n   using signed_types = std::tuple<long>         ;\n   using unsigned_types = std::tuple<unsigned long>;\n#endif\n   using float_types = std::tuple<double, long double>;\n   using exponent_type = long                          ;\n\n   mpfi_float_imp()\n   {\n      mpfi_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      mpfi_set_ui(m_data, 0u);\n   }\n   mpfi_float_imp(unsigned prec)\n   {\n      mpfi_init2(m_data, prec);\n      mpfi_set_ui(m_data, 0u);\n   }\n\n   mpfi_float_imp(const mpfi_float_imp& o)\n   {\n      mpfi_init2(m_data, preserve_source_precision() ? mpfi_get_prec(o.data()) : boost::multiprecision::detail::digits10_2_2(get_default_precision()));\n      if (o.m_data[0].left._mpfr_d)\n         mpfi_set(m_data, o.m_data);\n   }\n   template <unsigned D, mpfr_allocation_type AllocationType>\n   mpfi_float_imp(const mpfr_float_imp<D, AllocationType>& o)\n   {\n      mpfi_init2(m_data, (D == 0 ? preserve_component_precision() : preserve_related_precision()) ? mpfr_get_prec(o.data()) : boost::multiprecision::detail::digits10_2_2(get_default_precision()));\n      if (o.data()[0]._mpfr_d)\n         mpfi_set_fr(m_data, o.data());\n   }\n   // rvalue copy\n   mpfi_float_imp(mpfi_float_imp&& o) noexcept\n   {\n      mpfr_prec_t binary_default_precision = boost::multiprecision::detail::digits10_2_2(get_default_precision());\n      if ((this->get_default_options() != variable_precision_options::preserve_target_precision) || (mpfi_get_prec(o.data()) == binary_default_precision))\n      {\n         m_data[0]                = o.m_data[0];\n         o.m_data[0].left._mpfr_d = nullptr;\n      }\n      else\n      {\n         // NOTE: C allocation interface must not throw:\n         mpfi_init2(m_data, binary_default_precision);\n         mpfi_set(m_data, o.m_data);\n      }\n   }\n   mpfi_float_imp& operator=(const mpfi_float_imp& o)\n   {\n      if (this != &o)\n      {\n         if (m_data[0].left._mpfr_d == nullptr)\n            mpfi_init2(m_data, preserve_source_precision() ? mpfi_get_prec(o.m_data) : boost::multiprecision::detail::digits10_2_2(get_default_precision()));\n         else if (preserve_source_precision() && (mpfi_get_prec(o.data()) != mpfi_get_prec(data())))\n         {\n            mpfi_set_prec(m_data, mpfi_get_prec(o.m_data));\n         }\n         mpfi_set(m_data, o.m_data);\n      }\n      return *this;\n   }\n   // rvalue assign\n   mpfi_float_imp& operator=(mpfi_float_imp&& o) noexcept\n   {\n      if ((this->get_default_options() != variable_precision_options::preserve_target_precision) || (mpfi_get_prec(o.data()) == mpfi_get_prec(data())))\n         mpfi_swap(m_data, o.m_data);\n      else\n         *this = static_cast<const mpfi_float_imp&>(o);\n      return *this;\n   }\n#ifdef BOOST_HAS_LONG_LONG\n#ifdef _MPFR_H_HAVE_INTMAX_T\n   mpfi_float_imp& operator=(unsigned long long i)\n   {\n      if (m_data[0].left._mpfr_d == nullptr)\n         mpfi_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      mpfr_set_uj(left_data(), i, GMP_RNDD);\n      mpfr_set_uj(right_data(), i, GMP_RNDU);\n      return *this;\n   }\n   mpfi_float_imp& operator=(long long i)\n   {\n      if (m_data[0].left._mpfr_d == nullptr)\n         mpfi_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      mpfr_set_sj(left_data(), i, GMP_RNDD);\n      mpfr_set_sj(right_data(), i, GMP_RNDU);\n      return *this;\n   }\n#else\n   mpfi_float_imp& operator=(unsigned long long i)\n   {\n      if (m_data[0].left._mpfr_d == nullptr)\n         mpfi_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      unsigned long long mask  = ((((1uLL << (std::numeric_limits<unsigned long>::digits - 1)) - 1) << 1) | 1u);\n      unsigned               shift = 0;\n      mpfi_t                 t;\n      mpfi_init2(t, (std::max)(static_cast<mpfr_prec_t>(std::numeric_limits<unsigned long long>::digits), static_cast<mpfr_prec_t>(multiprecision::detail::digits10_2_2(digits10))));\n      mpfi_set_ui(m_data, 0);\n      while (i)\n      {\n         mpfi_set_ui(t, static_cast<unsigned long>(i & mask));\n         if (shift)\n            mpfi_mul_2exp(t, t, shift);\n         mpfi_add(m_data, m_data, t);\n         shift += std::numeric_limits<unsigned long>::digits;\n         i >>= std::numeric_limits<unsigned long>::digits;\n      }\n      mpfi_clear(t);\n      return *this;\n   }\n   mpfi_float_imp& operator=(long long i)\n   {\n      if (m_data[0].left._mpfr_d == nullptr)\n         mpfi_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      bool neg = i < 0;\n      *this    = boost::multiprecision::detail::unsigned_abs(i);\n      if (neg)\n         mpfi_neg(m_data, m_data);\n      return *this;\n   }\n#endif\n#endif\n#ifdef BOOST_HAS_INT128\n   mpfi_float_imp& operator=(uint128_type i)\n   {\n      if (m_data[0].left._mpfr_d == nullptr)\n         mpfi_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      constexpr uint128_type mask = ((((static_cast<uint128_type>(1u) << (std::numeric_limits<unsigned long>::digits - 1)) - 1) << 1) | 1u);\n      unsigned               shift = 0;\n      mpfi_t                 t;\n      mpfi_init2(t, (std::max)(static_cast<mpfr_prec_t>(128), static_cast<mpfr_prec_t>(multiprecision::detail::digits10_2_2(digits10))));\n      mpfi_set_ui(m_data, 0);\n      while (i)\n      {\n         mpfi_set_ui(t, static_cast<unsigned long>(i & mask));\n         if (shift)\n            mpfi_mul_2exp(t, t, shift);\n         mpfi_add(m_data, m_data, t);\n         shift += std::numeric_limits<unsigned long>::digits;\n         i >>= std::numeric_limits<unsigned long>::digits;\n      }\n      mpfi_clear(t);\n      return *this;\n   }\n   mpfi_float_imp& operator=(int128_type i)\n   {\n      if (m_data[0].left._mpfr_d == nullptr)\n         mpfi_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      bool neg = i < 0;\n      *this = boost::multiprecision::detail::unsigned_abs(i);\n      if (neg)\n         mpfi_neg(m_data, m_data);\n      return *this;\n   }\n#endif\n   mpfi_float_imp& operator=(unsigned long i)\n   {\n      if (m_data[0].left._mpfr_d == nullptr)\n         mpfi_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      mpfi_set_ui(m_data, i);\n      return *this;\n   }\n   mpfi_float_imp& operator=(long i)\n   {\n      if (m_data[0].left._mpfr_d == nullptr)\n         mpfi_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      mpfi_set_si(m_data, i);\n      return *this;\n   }\n   mpfi_float_imp& operator=(double d)\n   {\n      if (m_data[0].left._mpfr_d == nullptr)\n         mpfi_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      mpfi_set_d(m_data, d);\n      return *this;\n   }\n   mpfi_float_imp& operator=(long double a)\n   {\n      if (m_data[0].left._mpfr_d == nullptr)\n         mpfi_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n      mpfr_set_ld(left_data(), a, GMP_RNDD);\n      mpfr_set_ld(right_data(), a, GMP_RNDU);\n      return *this;\n   }\n#ifdef BOOST_HAS_FLOAT128\n   mpfi_float_imp& operator=(float128_type a)\n   {\n      BOOST_MP_FLOAT128_USING\n      if (m_data[0].left._mpfr_d == nullptr)\n         mpfi_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n\n      if (a == 0)\n      {\n         mpfi_set_si(m_data, 0);\n         return *this;\n      }\n\n      if (a == 1)\n      {\n         mpfi_set_si(m_data, 1);\n         return *this;\n      }\n\n      BOOST_MP_ASSERT(!BOOST_MP_ISINF(a));\n      BOOST_MP_ASSERT(!BOOST_MP_ISNAN(a));\n\n      int        e;\n      float128_type f, term;\n      mpfi_set_ui(m_data, 0u);\n\n      f = frexp(a, &e);\n\n      constexpr const int shift = std::numeric_limits<int>::digits - 1;\n\n      while (f)\n      {\n         // extract int sized bits from f:\n         f = ldexp(f, shift);\n         term = floor(f);\n         e -= shift;\n         mpfi_mul_2exp(m_data, m_data, shift);\n         if (term > 0)\n            mpfi_add_ui(m_data, m_data, static_cast<unsigned>(term));\n         else\n            mpfi_sub_ui(m_data, m_data, static_cast<unsigned>(-term));\n         f -= term;\n      }\n      if (e > 0)\n         mpfi_mul_2exp(m_data, m_data, e);\n      else if (e < 0)\n         mpfi_div_2exp(m_data, m_data, -e);\n      return *this;\n   }\n#endif\n   mpfi_float_imp& operator=(const char* s)\n   {\n      using default_ops::eval_fpclassify;\n\n      if (m_data[0].left._mpfr_d == nullptr)\n         mpfi_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));\n\n      if (s && (*s == '{'))\n      {\n         mpfr_float_backend<digits10> a, b;\n         std::string                  part;\n         const char*                  p = ++s;\n         while (*p && (*p != ',') && (*p != '}'))\n            ++p;\n         part.assign(s, p);\n         a = part.c_str();\n         s = p;\n         if (*p && (*p != '}'))\n         {\n            ++p;\n            while (*p && (*p != ',') && (*p != '}'))\n               ++p;\n            part.assign(s + 1, p);\n         }\n         else\n            part.erase();\n         b = part.c_str();\n\n         if (eval_fpclassify(a) == static_cast<int>(FP_NAN))\n         {\n            mpfi_set_fr(this->data(), a.data());\n         }\n         else if (eval_fpclassify(b) == static_cast<int>(FP_NAN))\n         {\n            mpfi_set_fr(this->data(), b.data());\n         }\n         else\n         {\n            if (a.compare(b) > 0)\n            {\n               BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Attempt to create interval with invalid range (start is greater than end).\"));\n            }\n            mpfi_interv_fr(m_data, a.data(), b.data());\n         }\n      }\n      else if (mpfi_set_str(m_data, s, 10) != 0)\n      {\n         BOOST_MP_THROW_EXCEPTION(std::runtime_error(std::string(\"Unable to parse string \\\"\") + s + std::string(\"\\\"as a valid floating point number.\")));\n      }\n      return *this;\n   }\n   void swap(mpfi_float_imp& o) noexcept\n   {\n      mpfi_swap(m_data, o.m_data);\n   }\n   std::string str(std::streamsize digits, std::ios_base::fmtflags f) const\n   {\n      BOOST_MP_ASSERT(m_data[0].left._mpfr_d);\n\n      mpfr_float_backend<digits10> a, b;\n\n      mpfi_get_left(a.data(), m_data);\n      mpfi_get_right(b.data(), m_data);\n\n      if (a.compare(b) == 0)\n         return a.str(digits, f);\n\n      return \"{\" + a.str(digits, f) + \",\" + b.str(digits, f) + \"}\";\n   }\n   ~mpfi_float_imp() noexcept\n   {\n      if (m_data[0].left._mpfr_d)\n         mpfi_clear(m_data);\n   }\n   void negate() noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0].left._mpfr_d);\n      mpfi_neg(m_data, m_data);\n   }\n   int compare(const mpfi_float_imp& o) const noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0].left._mpfr_d && o.m_data[0].left._mpfr_d);\n      if (mpfr_cmp(right_data(), o.left_data()) < 0)\n         return -1;\n      if (mpfr_cmp(left_data(), o.right_data()) > 0)\n         return 1;\n      if ((mpfr_cmp(left_data(), o.left_data()) == 0) && (mpfr_cmp(right_data(), o.right_data()) == 0))\n         return 0;\n      BOOST_MP_THROW_EXCEPTION(interval_error(\"Ambiguous comparison between two values.\"));\n      return 0;\n   }\n   template <class V>\n   int compare(V v) const noexcept\n   {\n      mpfi_float_imp d;\n      d = v;\n      return compare(d);\n   }\n   mpfi_t& data() noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0].left._mpfr_d);\n      return m_data;\n   }\n   const mpfi_t& data() const noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0].left._mpfr_d);\n      return m_data;\n   }\n   mpfr_ptr left_data() noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0].left._mpfr_d);\n      return &(m_data[0].left);\n   }\n   mpfr_srcptr left_data() const noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0].left._mpfr_d);\n      return &(m_data[0].left);\n   }\n   mpfr_ptr right_data() noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0].left._mpfr_d);\n      return &(m_data[0].right);\n   }\n   mpfr_srcptr right_data() const noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0].left._mpfr_d);\n      return &(m_data[0].right);\n   }\n\n protected:\n   mpfi_t           m_data;\n   static boost::multiprecision::detail::precision_type& get_global_default_precision() noexcept\n   {\n      static boost::multiprecision::detail::precision_type val(BOOST_MULTIPRECISION_MPFI_DEFAULT_PRECISION);\n      return val;\n   }\n   static unsigned& get_default_precision() noexcept\n   {\n      static BOOST_MP_THREAD_LOCAL unsigned val(get_global_default_precision());\n      return val;\n   }\n#ifndef BOOST_MT_NO_ATOMIC_INT\n   static std::atomic<variable_precision_options>& get_global_default_options() noexcept\n#else\n   static variable_precision_options& get_global_default_options() noexcept\n#endif\n   {\n#ifndef BOOST_MT_NO_ATOMIC_INT\n      static std::atomic<variable_precision_options> val{variable_precision_options::preserve_related_precision};\n#else\n      static variable_precision_optionss val{variable_precision_options::preserve_related_precision};\n#endif\n      return val;\n   }\n   static variable_precision_options& get_default_options() noexcept\n   {\n      static BOOST_MP_THREAD_LOCAL variable_precision_options val(get_global_default_options());\n      return val;\n   }\n   static bool preserve_source_precision() noexcept\n   {\n      return get_default_options() >= variable_precision_options::preserve_source_precision;\n   }\n   static bool preserve_component_precision() noexcept\n   {\n      return get_default_options() >= variable_precision_options::preserve_component_precision;\n   }\n   static bool preserve_related_precision() noexcept\n   {\n      return get_default_options() >= variable_precision_options::preserve_related_precision;\n   }\n   static bool preserve_all_precision() noexcept\n   {\n      return get_default_options() >= variable_precision_options::preserve_all_precision;\n   }\n};\n\n} // namespace detail\n\ntemplate <unsigned digits10>\nstruct mpfi_float_backend : public detail::mpfi_float_imp<digits10>\n{\n   mpfi_float_backend() : detail::mpfi_float_imp<digits10>() {}\n   mpfi_float_backend(const mpfi_float_backend& o) : detail::mpfi_float_imp<digits10>(o) {}\n   // rvalue copy\n   mpfi_float_backend(mpfi_float_backend&& o) : detail::mpfi_float_imp<digits10>(static_cast<detail::mpfi_float_imp<digits10>&&>(o))\n   {}\n   template <unsigned D>\n   mpfi_float_backend(const mpfi_float_backend<D>& val, typename std::enable_if<D <= digits10>::type* = nullptr)\n       : detail::mpfi_float_imp<digits10>()\n   {\n      mpfi_set(this->m_data, val.data());\n   }\n   template <unsigned D, mpfr_allocation_type AllocationType>\n   mpfi_float_backend(const mpfr_float_backend<D, AllocationType>& val, typename std::enable_if<D <= digits10>::type* = nullptr)\n       : detail::mpfi_float_imp<digits10>(val) {}\n\n   template <unsigned D>\n   explicit mpfi_float_backend(const mpfi_float_backend<D>& val, typename std::enable_if<!(D <= digits10)>::type* = nullptr)\n       : detail::mpfi_float_imp<digits10>()\n   {\n      mpfi_set(this->m_data, val.data());\n   }\n   mpfi_float_backend(const mpfi_t val)\n       : detail::mpfi_float_imp<digits10>()\n   {\n      mpfi_set(this->m_data, val);\n   }\n   mpfi_float_backend& operator=(const mpfi_float_backend& o)\n   {\n      *static_cast<detail::mpfi_float_imp<digits10>*>(this) = static_cast<detail::mpfi_float_imp<digits10> const&>(o);\n      return *this;\n   }\n   template <unsigned D>\n   mpfi_float_backend(const mpfr_float_backend<D>& val, typename std::enable_if<D <= digits10>::type* = nullptr)\n       : detail::mpfi_float_imp<digits10>()\n   {\n      mpfi_set_fr(this->m_data, val.data());\n   }\n   template <unsigned D>\n   mpfi_float_backend& operator=(const mpfr_float_backend<D>& val)\n   {\n      mpfi_set_fr(this->m_data, val.data());\n      return *this;\n   }\n   template <unsigned D>\n   explicit mpfi_float_backend(const mpfr_float_backend<D>& val, typename std::enable_if<!(D <= digits10)>::type* = nullptr)\n       : detail::mpfi_float_imp<digits10>()\n   {\n      mpfi_set_fr(this->m_data, val.data());\n   }\n   // rvalue copy\n   mpfi_float_backend& operator=(mpfi_float_backend&& o) noexcept\n   {\n      *static_cast<detail::mpfi_float_imp<digits10>*>(this) = static_cast<detail::mpfi_float_imp<digits10>&&>(o);\n      return *this;\n   }\n   template <class V>\n   typename std::enable_if<std::is_assignable<detail::mpfi_float_imp<digits10>, V>::value, mpfi_float_backend&>::type operator=(const V& v)\n   {\n      *static_cast<detail::mpfi_float_imp<digits10>*>(this) = v;\n      return *this;\n   }\n   mpfi_float_backend& operator=(const mpfi_t val)\n   {\n      mpfi_set(this->m_data, val);\n      return *this;\n   }\n   // We don't change our precision here, this is a fixed precision type:\n   template <unsigned D>\n   mpfi_float_backend& operator=(const mpfi_float_backend<D>& val)\n   {\n      mpfi_set(this->m_data, val.data());\n      return *this;\n   }\n};\n\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type AllocationType>\nvoid assign_components(mpfi_float_backend<D1>& result, const mpfr_float_backend<D2, AllocationType>& a, const mpfr_float_backend<D2, AllocationType>& b);\n\ntemplate <unsigned Digits10, class V>\ntypename std::enable_if<std::is_constructible<number<mpfr_float_backend<Digits10, allocate_dynamic>, et_on>, V>::value || std::is_convertible<V, const char*>::value>::type\nassign_components(mpfi_float_backend<Digits10>& result, const V& a, const V& b);\n\ntemplate <>\nstruct mpfi_float_backend<0> : public detail::mpfi_float_imp<0>\n{\n   mpfi_float_backend() : detail::mpfi_float_imp<0>() {}\n   mpfi_float_backend(const mpfi_t val)\n       : detail::mpfi_float_imp<0>(mpfi_get_prec(val))\n   {\n      mpfi_set(this->m_data, val);\n   }\n   mpfi_float_backend(const mpfi_float_backend& o) : detail::mpfi_float_imp<0>(o) {}\n\n   template <unsigned D, mpfr_allocation_type AllocationType>\n   mpfi_float_backend(const mpfr_float_backend<D, AllocationType>& val)\n       : detail::mpfi_float_imp<0>(val) {}\n\n   // rvalue copy\n   mpfi_float_backend(mpfi_float_backend&& o) noexcept : detail::mpfi_float_imp<0>(static_cast<detail::mpfi_float_imp<0>&&>(o))\n   {}\n   mpfi_float_backend(const mpfi_float_backend& o, unsigned digits10)\n       : detail::mpfi_float_imp<0>(multiprecision::detail::digits10_2_2(digits10))\n   {\n      mpfi_set(this->m_data, o.data());\n   }\n   template <class V>\n   mpfi_float_backend(const V& a, const V& b, unsigned digits10)\n       : detail::mpfi_float_imp<0>(multiprecision::detail::digits10_2_2(digits10))\n   {\n      boost::multiprecision::detail::scoped_target_precision<mpfi_float_backend<0> > opts;\n      assign_components(*this, a, b);\n   }\n\n   template <unsigned D>\n   mpfi_float_backend(const mpfi_float_backend<D>& val)\n       : detail::mpfi_float_imp<0>(mpfi_get_prec(val.data()))\n   {\n      mpfi_set(this->m_data, val.data());\n   }\n   mpfi_float_backend& operator=(const mpfi_float_backend& o) = default;\n   // rvalue assign\n   mpfi_float_backend& operator=(mpfi_float_backend&& o) noexcept = default;\n\n   template <class V>\n   mpfi_float_backend& operator=(const V& v)\n   {\n      constexpr unsigned d10 = std::is_floating_point<V>::value ?\n         std::numeric_limits<V>::digits10 :\n         std::numeric_limits<V>::digits10 ? 1 + std::numeric_limits<V>::digits10 :\n         1 + boost::multiprecision::detail::digits2_2_10(std::numeric_limits<V>::digits);\n\n      if (thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision)\n      {\n         BOOST_IF_CONSTEXPR(std::is_floating_point<V>::value)\n         {\n            if (std::numeric_limits<V>::digits > mpfi_get_prec(this->data()))\n               mpfi_set_prec(this->data(), std::numeric_limits<V>::digits);\n         }\n         else\n         {\n            if (precision() < d10)\n               this->precision(d10);\n         }\n      }\n\n      *static_cast<detail::mpfi_float_imp<0>*>(this) = v;\n      return *this;\n   }\n   mpfi_float_backend& operator=(const mpfi_t val)\n   {\n      mpfi_set_prec(this->m_data, mpfi_get_prec(val));\n      mpfi_set(this->m_data, val);\n      return *this;\n   }\n   template <unsigned D>\n   mpfi_float_backend& operator=(const mpfi_float_backend<D>& val)\n   {\n      mpfi_set_prec(this->m_data, mpfi_get_prec(val.data()));\n      mpfi_set(this->m_data, val.data());\n      return *this;\n   }\n   static unsigned thread_default_precision() noexcept\n   {\n      return get_default_precision();\n   }\n   static void thread_default_precision(unsigned v) noexcept\n   {\n      get_default_precision() = v;\n   }\n   static unsigned default_precision() noexcept\n   {\n      return get_global_default_precision();\n   }\n   static void default_precision(unsigned v) noexcept\n   {\n      get_global_default_precision() = v;\n   }\n   unsigned precision() const noexcept\n   {\n      return multiprecision::detail::digits2_2_10(mpfi_get_prec(this->m_data));\n   }\n   void precision(unsigned digits10) noexcept\n   {\n      mpfi_float_backend t(*this, digits10);\n      this->swap(t);\n   }\n   //\n   // Variable precision options:\n   //\n   static variable_precision_options default_variable_precision_options() noexcept\n   {\n      return get_global_default_options();\n   }\n   static variable_precision_options thread_default_variable_precision_options() noexcept\n   {\n      return get_default_options();\n   }\n   static void default_variable_precision_options(variable_precision_options opts)\n   {\n      get_global_default_options() = opts;\n   }\n   static void thread_default_variable_precision_options(variable_precision_options opts)\n   {\n      get_default_options() = opts;\n   }\n};\n\ntemplate <unsigned digits10, class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_arithmetic<T>::value, bool>::type eval_eq(const mpfi_float_backend<digits10>& a, const T& b) noexcept\n{\n   return a.compare(b) == 0;\n}\ntemplate <unsigned digits10, class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_arithmetic<T>::value, bool>::type eval_lt(const mpfi_float_backend<digits10>& a, const T& b) noexcept\n{\n   return a.compare(b) < 0;\n}\ntemplate <unsigned digits10, class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_arithmetic<T>::value, bool>::type eval_gt(const mpfi_float_backend<digits10>& a, const T& b) noexcept\n{\n   return a.compare(b) > 0;\n}\n\ntemplate <unsigned D1, unsigned D2>\ninline void eval_add(mpfi_float_backend<D1>& result, const mpfi_float_backend<D2>& o)\n{\n   mpfi_add(result.data(), result.data(), o.data());\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_subtract(mpfi_float_backend<D1>& result, const mpfi_float_backend<D2>& o)\n{\n   mpfi_sub(result.data(), result.data(), o.data());\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_multiply(mpfi_float_backend<D1>& result, const mpfi_float_backend<D2>& o)\n{\n   if ((void*)&result == (void*)&o)\n      mpfi_sqr(result.data(), o.data());\n   else\n      mpfi_mul(result.data(), result.data(), o.data());\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_divide(mpfi_float_backend<D1>& result, const mpfi_float_backend<D2>& o)\n{\n   mpfi_div(result.data(), result.data(), o.data());\n}\ntemplate <unsigned digits10>\ninline void eval_add(mpfi_float_backend<digits10>& result, unsigned long i)\n{\n   mpfi_add_ui(result.data(), result.data(), i);\n}\ntemplate <unsigned digits10>\ninline void eval_subtract(mpfi_float_backend<digits10>& result, unsigned long i)\n{\n   mpfi_sub_ui(result.data(), result.data(), i);\n}\ntemplate <unsigned digits10>\ninline void eval_multiply(mpfi_float_backend<digits10>& result, unsigned long i)\n{\n   mpfi_mul_ui(result.data(), result.data(), i);\n}\ntemplate <unsigned digits10>\ninline void eval_divide(mpfi_float_backend<digits10>& result, unsigned long i)\n{\n   mpfi_div_ui(result.data(), result.data(), i);\n}\ntemplate <unsigned digits10>\ninline void eval_add(mpfi_float_backend<digits10>& result, long i)\n{\n   if (i > 0)\n      mpfi_add_ui(result.data(), result.data(), i);\n   else\n      mpfi_sub_ui(result.data(), result.data(), boost::multiprecision::detail::unsigned_abs(i));\n}\ntemplate <unsigned digits10>\ninline void eval_subtract(mpfi_float_backend<digits10>& result, long i)\n{\n   if (i > 0)\n      mpfi_sub_ui(result.data(), result.data(), i);\n   else\n      mpfi_add_ui(result.data(), result.data(), boost::multiprecision::detail::unsigned_abs(i));\n}\ntemplate <unsigned digits10>\ninline void eval_multiply(mpfi_float_backend<digits10>& result, long i)\n{\n   mpfi_mul_ui(result.data(), result.data(), boost::multiprecision::detail::unsigned_abs(i));\n   if (i < 0)\n      mpfi_neg(result.data(), result.data());\n}\ntemplate <unsigned digits10>\ninline void eval_divide(mpfi_float_backend<digits10>& result, long i)\n{\n   mpfi_div_ui(result.data(), result.data(), boost::multiprecision::detail::unsigned_abs(i));\n   if (i < 0)\n      mpfi_neg(result.data(), result.data());\n}\n//\n// Specialised 3 arg versions of the basic operators:\n//\ntemplate <unsigned D1, unsigned D2, unsigned D3>\ninline void eval_add(mpfi_float_backend<D1>& a, const mpfi_float_backend<D2>& x, const mpfi_float_backend<D3>& y)\n{\n   mpfi_add(a.data(), x.data(), y.data());\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_add(mpfi_float_backend<D1>& a, const mpfi_float_backend<D2>& x, unsigned long y)\n{\n   mpfi_add_ui(a.data(), x.data(), y);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_add(mpfi_float_backend<D1>& a, const mpfi_float_backend<D2>& x, long y)\n{\n   if (y < 0)\n      mpfi_sub_ui(a.data(), x.data(), boost::multiprecision::detail::unsigned_abs(y));\n   else\n      mpfi_add_ui(a.data(), x.data(), y);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_add(mpfi_float_backend<D1>& a, unsigned long x, const mpfi_float_backend<D2>& y)\n{\n   mpfi_add_ui(a.data(), y.data(), x);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_add(mpfi_float_backend<D1>& a, long x, const mpfi_float_backend<D2>& y)\n{\n   if (x < 0)\n   {\n      mpfi_ui_sub(a.data(), boost::multiprecision::detail::unsigned_abs(x), y.data());\n      mpfi_neg(a.data(), a.data());\n   }\n   else\n      mpfi_add_ui(a.data(), y.data(), x);\n}\ntemplate <unsigned D1, unsigned D2, unsigned D3>\ninline void eval_subtract(mpfi_float_backend<D1>& a, const mpfi_float_backend<D2>& x, const mpfi_float_backend<D3>& y)\n{\n   mpfi_sub(a.data(), x.data(), y.data());\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_subtract(mpfi_float_backend<D1>& a, const mpfi_float_backend<D2>& x, unsigned long y)\n{\n   mpfi_sub_ui(a.data(), x.data(), y);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_subtract(mpfi_float_backend<D1>& a, const mpfi_float_backend<D2>& x, long y)\n{\n   if (y < 0)\n      mpfi_add_ui(a.data(), x.data(), boost::multiprecision::detail::unsigned_abs(y));\n   else\n      mpfi_sub_ui(a.data(), x.data(), y);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_subtract(mpfi_float_backend<D1>& a, unsigned long x, const mpfi_float_backend<D2>& y)\n{\n   mpfi_ui_sub(a.data(), x, y.data());\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_subtract(mpfi_float_backend<D1>& a, long x, const mpfi_float_backend<D2>& y)\n{\n   if (x < 0)\n   {\n      mpfi_add_ui(a.data(), y.data(), boost::multiprecision::detail::unsigned_abs(x));\n      mpfi_neg(a.data(), a.data());\n   }\n   else\n      mpfi_ui_sub(a.data(), x, y.data());\n}\n\ntemplate <unsigned D1, unsigned D2, unsigned D3>\ninline void eval_multiply(mpfi_float_backend<D1>& a, const mpfi_float_backend<D2>& x, const mpfi_float_backend<D3>& y)\n{\n   if ((void*)&x == (void*)&y)\n      mpfi_sqr(a.data(), x.data());\n   else\n      mpfi_mul(a.data(), x.data(), y.data());\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_multiply(mpfi_float_backend<D1>& a, const mpfi_float_backend<D2>& x, unsigned long y)\n{\n   mpfi_mul_ui(a.data(), x.data(), y);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_multiply(mpfi_float_backend<D1>& a, const mpfi_float_backend<D2>& x, long y)\n{\n   if (y < 0)\n   {\n      mpfi_mul_ui(a.data(), x.data(), boost::multiprecision::detail::unsigned_abs(y));\n      a.negate();\n   }\n   else\n      mpfi_mul_ui(a.data(), x.data(), y);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_multiply(mpfi_float_backend<D1>& a, unsigned long x, const mpfi_float_backend<D2>& y)\n{\n   mpfi_mul_ui(a.data(), y.data(), x);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_multiply(mpfi_float_backend<D1>& a, long x, const mpfi_float_backend<D2>& y)\n{\n   if (x < 0)\n   {\n      mpfi_mul_ui(a.data(), y.data(), boost::multiprecision::detail::unsigned_abs(x));\n      mpfi_neg(a.data(), a.data());\n   }\n   else\n      mpfi_mul_ui(a.data(), y.data(), x);\n}\n\ntemplate <unsigned D1, unsigned D2, unsigned D3>\ninline void eval_divide(mpfi_float_backend<D1>& a, const mpfi_float_backend<D2>& x, const mpfi_float_backend<D3>& y)\n{\n   mpfi_div(a.data(), x.data(), y.data());\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_divide(mpfi_float_backend<D1>& a, const mpfi_float_backend<D2>& x, unsigned long y)\n{\n   mpfi_div_ui(a.data(), x.data(), y);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_divide(mpfi_float_backend<D1>& a, const mpfi_float_backend<D2>& x, long y)\n{\n   if (y < 0)\n   {\n      mpfi_div_ui(a.data(), x.data(), boost::multiprecision::detail::unsigned_abs(y));\n      a.negate();\n   }\n   else\n      mpfi_div_ui(a.data(), x.data(), y);\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_divide(mpfi_float_backend<D1>& a, unsigned long x, const mpfi_float_backend<D2>& y)\n{\n   mpfi_ui_div(a.data(), x, y.data());\n}\ntemplate <unsigned D1, unsigned D2>\ninline void eval_divide(mpfi_float_backend<D1>& a, long x, const mpfi_float_backend<D2>& y)\n{\n   if (x < 0)\n   {\n      mpfi_ui_div(a.data(), boost::multiprecision::detail::unsigned_abs(x), y.data());\n      mpfi_neg(a.data(), a.data());\n   }\n   else\n      mpfi_ui_div(a.data(), x, y.data());\n}\n\ntemplate <unsigned digits10>\ninline bool eval_is_zero(const mpfi_float_backend<digits10>& val) noexcept\n{\n   return 0 != mpfi_is_zero(val.data());\n}\ntemplate <unsigned digits10>\ninline int eval_get_sign(const mpfi_float_backend<digits10>& val)\n{\n   return detail::mpfi_sgn(val.data());\n}\n\ntemplate <unsigned digits10>\ninline void eval_convert_to(unsigned long* result, const mpfi_float_backend<digits10>& val)\n{\n   mpfr_float_backend<digits10> t;\n   mpfi_mid(t.data(), val.data());\n   eval_convert_to(result, t);\n}\ntemplate <unsigned digits10>\ninline void eval_convert_to(long* result, const mpfi_float_backend<digits10>& val)\n{\n   mpfr_float_backend<digits10> t;\n   mpfi_mid(t.data(), val.data());\n   eval_convert_to(result, t);\n}\n#ifdef _MPFR_H_HAVE_INTMAX_T\ntemplate <unsigned digits10>\ninline void eval_convert_to(unsigned long long* result, const mpfi_float_backend<digits10>& val)\n{\n   mpfr_float_backend<digits10> t;\n   mpfi_mid(t.data(), val.data());\n   eval_convert_to(result, t);\n}\ntemplate <unsigned digits10>\ninline void eval_convert_to(long long* result, const mpfi_float_backend<digits10>& val)\n{\n   mpfr_float_backend<digits10> t;\n   mpfi_mid(t.data(), val.data());\n   eval_convert_to(result, t);\n}\n#endif\n#ifdef BOOST_HAS_INT128\ntemplate <unsigned digits10>\ninline void eval_convert_to(uint128_type* result, const mpfi_float_backend<digits10>& val)\n{\n   mpfr_float_backend<digits10> t;\n   mpfi_mid(t.data(), val.data());\n   eval_convert_to(result, t);\n}\ntemplate <unsigned digits10>\ninline void eval_convert_to(int128_type* result, const mpfi_float_backend<digits10>& val)\n{\n   mpfr_float_backend<digits10> t;\n   mpfi_mid(t.data(), val.data());\n   eval_convert_to(result, t);\n}\n#endif\ntemplate <unsigned digits10>\ninline void eval_convert_to(double* result, const mpfi_float_backend<digits10>& val) noexcept\n{\n   *result = mpfi_get_d(val.data());\n}\ntemplate <unsigned digits10>\ninline void eval_convert_to(long double* result, const mpfi_float_backend<digits10>& val) noexcept\n{\n   mpfr_float_backend<digits10> t;\n   mpfi_mid(t.data(), val.data());\n   eval_convert_to(result, t);\n}\n#ifdef BOOST_HAS_FLOAT128\ntemplate <unsigned digits10>\ninline void eval_convert_to(float128_type* result, const mpfi_float_backend<digits10>& val)\n{\n   mpfr_float_backend<digits10> t;\n   mpfi_mid(t.data(), val.data());\n   eval_convert_to(result, t);\n}\n#endif\ntemplate <mpfr_allocation_type AllocationType>\ninline void assign_components_set_precision(mpfi_float_backend<0>& result, const mpfr_float_backend<0, AllocationType>& a, const mpfr_float_backend<0, AllocationType>& b)\n{\n   if (result.thread_default_variable_precision_options() >= variable_precision_options::preserve_component_precision)\n   {\n      unsigned long prec = (std::max)(mpfr_get_prec(a.data()), mpfr_get_prec(b.data()));\n      mpfi_set_prec(result.data(), prec);\n   }\n}\ntemplate <unsigned D2, mpfr_allocation_type AllocationType>\ninline void assign_components_set_precision(mpfi_float_backend<0>& result, const mpfr_float_backend<D2, AllocationType>& a, const mpfr_float_backend<D2, AllocationType>& b)\n{\n   if (result.thread_default_variable_precision_options() >= variable_precision_options::preserve_related_precision)\n   {\n      unsigned long prec = (std::max)(mpfr_get_prec(a.data()), mpfr_get_prec(b.data()));\n      mpfi_set_prec(result.data(), prec);\n   }\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type AllocationType>\ninline void assign_components_set_precision(mpfi_float_backend<D1>&, const mpfr_float_backend<D2, AllocationType>&, const mpfr_float_backend<D2, AllocationType>&)\n{\n}\n\n\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type AllocationType>\ninline void assign_components(mpfi_float_backend<D1>& result, const mpfr_float_backend<D2, AllocationType>& a, const mpfr_float_backend<D2, AllocationType>& b)\n{\n   //\n   // This is called from class number's constructors, so if we have variable\n   // precision, then copy the precision of the source variables.\n   //\n   assign_components_set_precision(result, a, b);\n\n   using default_ops::eval_fpclassify;\n   if (eval_fpclassify(a) == static_cast<int>(FP_NAN))\n   {\n      mpfi_set_fr(result.data(), a.data());\n   }\n   else if (eval_fpclassify(b) == static_cast<int>(FP_NAN))\n   {\n      mpfi_set_fr(result.data(), b.data());\n   }\n   else\n   {\n      if (a.compare(b) > 0)\n      {\n         BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Attempt to create interval with invalid range (start is greater than end).\"));\n      }\n      mpfi_interv_fr(result.data(), a.data(), b.data());\n   }\n}\n\ntemplate <unsigned Digits10, class V>\ninline typename std::enable_if<std::is_constructible<number<mpfr_float_backend<Digits10, allocate_dynamic>, et_on>, V>::value || std::is_convertible<V, const char*>::value>::type\nassign_components(mpfi_float_backend<Digits10>& result, const V& a, const V& b)\n{\n   number<mpfr_float_backend<Digits10, allocate_dynamic>, et_on> x(a), y(b);\n   assign_components(result, x.backend(), y.backend());\n}\n\n//\n// Native non-member operations:\n//\ntemplate <unsigned Digits10>\ninline void eval_sqrt(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& val)\n{\n   mpfi_sqrt(result.data(), val.data());\n}\n\ntemplate <unsigned Digits10>\ninline void eval_abs(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& val)\n{\n   mpfi_abs(result.data(), val.data());\n}\n\ntemplate <unsigned Digits10>\ninline void eval_fabs(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& val)\n{\n   mpfi_abs(result.data(), val.data());\n}\ntemplate <unsigned Digits10>\ninline void eval_ceil(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& val)\n{\n   mpfr_float_backend<Digits10> a, b;\n   mpfr_set(a.data(), val.left_data(), GMP_RNDN);\n   mpfr_set(b.data(), val.right_data(), GMP_RNDN);\n   eval_ceil(a, a);\n   eval_ceil(b, b);\n   if (a.compare(b) != 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(interval_error(\"Attempt to take the ceil of a value that straddles an integer boundary.\"));\n   }\n   mpfi_set_fr(result.data(), a.data());\n}\ntemplate <unsigned Digits10>\ninline void eval_floor(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& val)\n{\n   mpfr_float_backend<Digits10> a, b;\n   mpfr_set(a.data(), val.left_data(), GMP_RNDN);\n   mpfr_set(b.data(), val.right_data(), GMP_RNDN);\n   eval_floor(a, a);\n   eval_floor(b, b);\n   if (a.compare(b) != 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(interval_error(\"Attempt to take the floor of a value that straddles an integer boundary.\"));\n   }\n   mpfi_set_fr(result.data(), a.data());\n}\ntemplate <unsigned Digits10>\ninline void eval_ldexp(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& val, long e)\n{\n   if (e > 0)\n      mpfi_mul_2exp(result.data(), val.data(), e);\n   else if (e < 0)\n      mpfi_div_2exp(result.data(), val.data(), -e);\n   else\n      result = val;\n}\ntemplate <unsigned Digits10>\ninline void eval_frexp(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& val, int* e)\n{\n   mpfr_float_backend<Digits10> t, rt;\n   mpfi_mid(t.data(), val.data());\n   eval_frexp(rt, t, e);\n   eval_ldexp(result, val, -*e);\n}\ntemplate <unsigned Digits10>\ninline void eval_frexp(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& val, long* e)\n{\n   mpfr_float_backend<Digits10> t, rt;\n   mpfi_mid(t.data(), val.data());\n   eval_frexp(rt, t, e);\n   eval_ldexp(result, val, -*e);\n}\n\ntemplate <unsigned Digits10>\ninline int eval_fpclassify(const mpfi_float_backend<Digits10>& val) noexcept\n{\n   return mpfi_inf_p(val.data()) ? FP_INFINITE : mpfi_nan_p(val.data()) ? FP_NAN : mpfi_is_zero(val.data()) ? FP_ZERO : FP_NORMAL;\n}\n\ntemplate <unsigned Digits10>\ninline void eval_pow(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& b, const mpfi_float_backend<Digits10>& e)\n{\n   using ui_type = typename boost::multiprecision::detail::canonical<unsigned, mpfi_float_backend<Digits10> >::type;\n   using default_ops::eval_get_sign;\n   int s = eval_get_sign(b);\n   if (s == 0)\n   {\n      if (eval_get_sign(e) == 0)\n      {\n         result = ui_type(1);\n      }\n      else\n      {\n         result = ui_type(0);\n      }\n      return;\n   }\n   if (s < 0)\n   {\n      if (eval_get_sign(e) < 0)\n      {\n         mpfi_float_backend<Digits10> t1, t2;\n         t1 = e;\n         t1.negate();\n         eval_pow(t2, b, t1);\n         t1 = ui_type(1);\n         eval_divide(result, t1, t2);\n         return;\n      }\n      typename boost::multiprecision::detail::canonical<std::uintmax_t, mpfi_float_backend<Digits10> >::type an;\n#ifndef BOOST_NO_EXCEPTIONS\n      try\n      {\n#endif\n         using default_ops::eval_convert_to;\n         eval_convert_to(&an, e);\n         if (e.compare(an) == 0)\n         {\n            mpfi_float_backend<Digits10> pb(b);\n            pb.negate();\n            eval_pow(result, pb, e);\n            if (an & 1u)\n               result.negate();\n            return;\n         }\n#ifndef BOOST_NO_EXCEPTIONS\n      }\n      catch (const std::exception&)\n      {\n         // conversion failed, just fall through, value is not an integer.\n      }\n#endif\n      result = std::numeric_limits<number<mpfi_float_backend<Digits10>, et_on> >::quiet_NaN().backend();\n      return;\n   }\n   mpfi_log(result.data(), b.data());\n   mpfi_mul(result.data(), result.data(), e.data());\n   mpfi_exp(result.data(), result.data());\n}\n\ntemplate <unsigned Digits10>\ninline void eval_exp(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& arg)\n{\n   mpfi_exp(result.data(), arg.data());\n}\n\ntemplate <unsigned Digits10>\ninline void eval_exp2(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& arg)\n{\n   mpfi_exp2(result.data(), arg.data());\n}\n\ntemplate <unsigned Digits10>\ninline void eval_log(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& arg)\n{\n   mpfi_log(result.data(), arg.data());\n}\n\ntemplate <unsigned Digits10>\ninline void eval_log10(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& arg)\n{\n   mpfi_log10(result.data(), arg.data());\n}\n\ntemplate <unsigned Digits10>\ninline void eval_sin(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& arg)\n{\n   mpfi_sin(result.data(), arg.data());\n}\n\ntemplate <unsigned Digits10>\ninline void eval_cos(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& arg)\n{\n   mpfi_cos(result.data(), arg.data());\n}\n\ntemplate <unsigned Digits10>\ninline void eval_tan(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& arg)\n{\n   mpfi_tan(result.data(), arg.data());\n}\n\ntemplate <unsigned Digits10>\ninline void eval_asin(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& arg)\n{\n   mpfi_asin(result.data(), arg.data());\n}\n\ntemplate <unsigned Digits10>\ninline void eval_acos(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& arg)\n{\n   mpfi_acos(result.data(), arg.data());\n}\n\ntemplate <unsigned Digits10>\ninline void eval_atan(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& arg)\n{\n   mpfi_atan(result.data(), arg.data());\n}\n\ntemplate <unsigned Digits10>\ninline void eval_atan2(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& arg1, const mpfi_float_backend<Digits10>& arg2)\n{\n   mpfi_atan2(result.data(), arg1.data(), arg2.data());\n}\n\ntemplate <unsigned Digits10>\ninline void eval_sinh(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& arg)\n{\n   mpfi_sinh(result.data(), arg.data());\n}\n\ntemplate <unsigned Digits10>\ninline void eval_cosh(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& arg)\n{\n   mpfi_cosh(result.data(), arg.data());\n}\n\ntemplate <unsigned Digits10>\ninline void eval_tanh(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& arg)\n{\n   mpfi_tanh(result.data(), arg.data());\n}\n\ntemplate <unsigned Digits10>\ninline void eval_log2(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& arg)\n{\n   mpfi_log2(result.data(), arg.data());\n}\n\ntemplate <unsigned Digits10>\ninline std::size_t hash_value(const mpfi_float_backend<Digits10>& val)\n{\n   std::size_t result = 0;\n   std::size_t len    = val.left_data()[0]._mpfr_prec / mp_bits_per_limb;\n   if (val.left_data()[0]._mpfr_prec % mp_bits_per_limb)\n      ++len;\n   for (std::size_t i = 0; i < len; ++i)\n      boost::multiprecision::detail::hash_combine(result, val.left_data()[0]._mpfr_d[i]);\n   boost::multiprecision::detail::hash_combine(result, val.left_data()[0]._mpfr_exp, val.left_data()[0]._mpfr_sign);\n\n   len = val.right_data()[0]._mpfr_prec / mp_bits_per_limb;\n   if (val.right_data()[0]._mpfr_prec % mp_bits_per_limb)\n      ++len;\n   for (std::size_t i = 0; i < len; ++i)\n      boost::multiprecision::detail::hash_combine(result, val.right_data()[0]._mpfr_d[i]);\n   boost::multiprecision::detail::hash_combine(result, val.right_data()[0]._mpfr_exp, val.right_data()[0]._mpfr_sign);\n   return result;\n}\n\ntemplate <class To, unsigned D>\nvoid generic_interconvert(To& to, const mpfi_float_backend<D>& from, const std::integral_constant<int, number_kind_integer>& to_type, const std::integral_constant<int, number_kind_floating_point>& from_type)\n{\n   using boost::multiprecision::detail::generic_interconvert;\n   boost::multiprecision::detail::scoped_precision_options<number<mpfr_float_backend<D>>> scoped(from);\n   mpfr_float_backend<D> t;\n   mpfi_mid(t.data(), from.data());\n   generic_interconvert(to, t, to_type, from_type);\n}\n\ntemplate <class To, unsigned D>\nvoid generic_interconvert(To& to, const mpfi_float_backend<D>& from, const std::integral_constant<int, number_kind_rational>& to_type, const std::integral_constant<int, number_kind_floating_point>& from_type)\n{\n   using boost::multiprecision::detail::generic_interconvert;\n   boost::multiprecision::detail::scoped_precision_options<number<mpfr_float_backend<D>>> scoped(from);\n   mpfr_float_backend<D> t;\n   mpfi_mid(t.data(), from.data());\n   generic_interconvert(to, t, to_type, from_type);\n}\n\ntemplate <class To, unsigned D>\nvoid generic_interconvert(To& to, const mpfi_float_backend<D>& from, const std::integral_constant<int, number_kind_floating_point>& to_type, const std::integral_constant<int, number_kind_floating_point>& from_type)\n{\n   using boost::multiprecision::detail::generic_interconvert;\n   boost::multiprecision::detail::scoped_precision_options<number<mpfr_float_backend<D>>> scoped(from);\n   mpfr_float_backend<D> t;\n   mpfi_mid(t.data(), from.data());\n   generic_interconvert(to, t, to_type, from_type);\n}\n\n} // namespace backends\n\ntemplate <>\nstruct number_category<detail::canonical<mpfi_t, backends::mpfi_float_backend<0> >::type> : public std::integral_constant<int, number_kind_floating_point>\n{};\ntemplate <unsigned Digits10>\nstruct is_interval_number<backends::mpfi_float_backend<Digits10> > : public std::integral_constant<bool, true>\n{};\n\nusing boost::multiprecision::backends::mpfi_float_backend;\n\nusing mpfi_float_50 = number<mpfi_float_backend<50> >  ;\nusing mpfi_float_100 = number<mpfi_float_backend<100> > ;\nusing mpfi_float_500 = number<mpfi_float_backend<500> > ;\nusing mpfi_float_1000 = number<mpfi_float_backend<1000> >;\nusing mpfi_float = number<mpfi_float_backend<0> >   ;\n\n//\n// Special interval specific functions:\n//\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline number<mpfr_float_backend<Digits10>, ExpressionTemplates> lower(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& val)\n{\n   boost::multiprecision::detail::scoped_precision_options<number<mpfr_float_backend<Digits10>, ExpressionTemplates> > precision_guard(val);\n   number<mpfr_float_backend<Digits10> >                                                                               result;\n   mpfr_set(result.backend().data(), val.backend().left_data(), GMP_RNDN);\n   return result;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline number<mpfr_float_backend<Digits10>, ExpressionTemplates> upper(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& val)\n{\n   boost::multiprecision::detail::scoped_precision_options<number<mpfr_float_backend<Digits10>, ExpressionTemplates> > precision_guard(val);\n   number<mpfr_float_backend<Digits10> >                                                                               result;\n   mpfr_set(result.backend().data(), val.backend().right_data(), GMP_RNDN);\n   return result;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline number<mpfr_float_backend<Digits10>, ExpressionTemplates> median(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& val)\n{\n   boost::multiprecision::detail::scoped_precision_options<number<mpfr_float_backend<Digits10>, ExpressionTemplates> > precision_guard(val);\n   number<mpfr_float_backend<Digits10> >                                                                               result;\n   mpfi_mid(result.backend().data(), val.backend().data());\n   return result;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline number<mpfr_float_backend<Digits10>, ExpressionTemplates> width(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& val)\n{\n   boost::multiprecision::detail::scoped_precision_options<number<mpfr_float_backend<Digits10>, ExpressionTemplates> > precision_guard(val);\n   number<mpfr_float_backend<Digits10> >                                                                               result;\n   mpfi_diam_abs(result.backend().data(), val.backend().data());\n   return result;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline number<mpfi_float_backend<Digits10>, ExpressionTemplates> intersect(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& a, const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& b)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<mpfi_float_backend<Digits10>, ExpressionTemplates> > precision_guard(a, b);\n   number<mpfi_float_backend<Digits10>, ExpressionTemplates>                                                           result;\n   mpfi_intersect(result.backend().data(), a.backend().data(), b.backend().data());\n   return result;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline number<mpfi_float_backend<Digits10>, ExpressionTemplates> hull(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& a, const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& b)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<mpfi_float_backend<Digits10>, ExpressionTemplates> > precision_guard(a, b);\n   number<mpfi_float_backend<Digits10>, ExpressionTemplates>                                                           result;\n   mpfi_union(result.backend().data(), a.backend().data(), b.backend().data());\n   return result;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline bool overlap(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& a, const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& b)\n{\n   return (lower(a) <= lower(b) && lower(b) <= upper(a)) ||\n          (lower(b) <= lower(a) && lower(a) <= upper(b));\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates1, expression_template_option ExpressionTemplates2>\ninline bool in(const number<mpfr_float_backend<Digits10>, ExpressionTemplates1>& a, const number<mpfi_float_backend<Digits10>, ExpressionTemplates2>& b)\n{\n   return mpfi_is_inside_fr(a.backend().data(), b.backend().data()) != 0;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline bool zero_in(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& a)\n{\n   return mpfi_has_zero(a.backend().data()) != 0;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline bool subset(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& a, const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& b)\n{\n   return mpfi_is_inside(a.backend().data(), b.backend().data()) != 0;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline bool proper_subset(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& a, const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& b)\n{\n   return mpfi_is_strictly_inside(a.backend().data(), b.backend().data()) != 0;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline bool empty(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& a)\n{\n   return mpfi_is_empty(a.backend().data()) != 0;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline bool singleton(const number<mpfi_float_backend<Digits10>, ExpressionTemplates>& a)\n{\n   return mpfr_cmp(a.backend().left_data(), a.backend().right_data()) == 0;\n}\n\n//\n// Again with debug_adaptor:\n//\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline number<debug_adaptor<mpfr_float_backend<Digits10> >, ExpressionTemplates> lower(const number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& val)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<debug_adaptor<mpfr_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(val);\n   number<debug_adaptor<mpfr_float_backend<Digits10> > >                                                                               result;\n   mpfr_set(result.backend().value().data(), val.backend().value().left_data(), GMP_RNDN);\n   return result;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline number<debug_adaptor<mpfr_float_backend<Digits10> >, ExpressionTemplates> upper(const number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& val)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<debug_adaptor<mpfr_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(val);\n   number<debug_adaptor<mpfr_float_backend<Digits10> > >                                                                               result;\n   mpfr_set(result.backend().value().data(), val.backend().value().right_data(), GMP_RNDN);\n   return result;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline number<debug_adaptor<mpfr_float_backend<Digits10> >, ExpressionTemplates> median(const number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& val)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<debug_adaptor<mpfr_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(val);\n   number<debug_adaptor<mpfr_float_backend<Digits10> > >                                                                               result;\n   mpfi_mid(result.backend().value().data(), val.backend().value().data());\n   return result;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline number<debug_adaptor<mpfr_float_backend<Digits10> >, ExpressionTemplates> width(const number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& val)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<debug_adaptor<mpfr_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(val);\n   number<debug_adaptor<mpfr_float_backend<Digits10> > >                                                                               result;\n   mpfi_diam_abs(result.backend().value().data(), val.backend().value().data());\n   return result;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates> intersect(const number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& a, const number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& b)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(a, b);\n   number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>                                                           result;\n   mpfi_intersect(result.backend().value().data(), a.backend().value().data(), b.backend().value().data());\n   return result;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates> hull(const number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& a, const number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& b)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(a, b);\n   number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>                                                           result;\n   mpfi_union(result.backend().value().data(), a.backend().value().data(), b.backend().value().data());\n   return result;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline bool overlap(const number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& a, const number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& b)\n{\n   return (lower(a) <= lower(b) && lower(b) <= upper(a)) ||\n          (lower(b) <= lower(a) && lower(a) <= upper(b));\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates1, expression_template_option ExpressionTemplates2>\ninline bool in(const number<debug_adaptor<mpfr_float_backend<Digits10> >, ExpressionTemplates1>& a, const number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates2>& b)\n{\n   return mpfi_is_inside_fr(a.backend().value().data(), b.backend().value().data()) != 0;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline bool zero_in(const number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& a)\n{\n   return mpfi_has_zero(a.backend().value().data()) != 0;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline bool subset(const number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& a, const number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& b)\n{\n   return mpfi_is_inside(a.backend().value().data(), b.backend().value().data()) != 0;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline bool proper_subset(const number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& a, const number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& b)\n{\n   return mpfi_is_strictly_inside(a.backend().value().data(), b.backend().value().data()) != 0;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline bool empty(const number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& a)\n{\n   return mpfi_is_empty(a.backend().value().data()) != 0;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline bool singleton(const number<debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& a)\n{\n   return mpfr_cmp(a.backend().value().left_data(), a.backend().value().right_data()) == 0;\n}\n//\n// Again with logged_adaptor:\n//\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline number<logged_adaptor<mpfr_float_backend<Digits10> >, ExpressionTemplates> lower(const number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& val)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<logged_adaptor<mpfr_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(val);\n   number<logged_adaptor<mpfr_float_backend<Digits10> > >                                                                               result;\n   mpfr_set(result.backend().value().data(), val.backend().value().left_data(), GMP_RNDN);\n   return result;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline number<logged_adaptor<mpfr_float_backend<Digits10> >, ExpressionTemplates> upper(const number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& val)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<logged_adaptor<mpfr_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(val);\n   number<logged_adaptor<mpfr_float_backend<Digits10> > >                                                                               result;\n   mpfr_set(result.backend().value().data(), val.backend().value().right_data(), GMP_RNDN);\n   return result;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline number<logged_adaptor<mpfr_float_backend<Digits10> >, ExpressionTemplates> median(const number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& val)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<logged_adaptor<mpfr_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(val);\n   number<logged_adaptor<mpfr_float_backend<Digits10> > >                                                                               result;\n   mpfi_mid(result.backend().value().data(), val.backend().value().data());\n   return result;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline number<logged_adaptor<mpfr_float_backend<Digits10> >, ExpressionTemplates> width(const number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& val)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<logged_adaptor<mpfr_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(val);\n   number<logged_adaptor<mpfr_float_backend<Digits10> > >                                                                               result;\n   mpfi_diam_abs(result.backend().value().data(), val.backend().value().data());\n   return result;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates> intersect(const number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& a, const number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& b)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(a, b);\n   number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>                                                           result;\n   mpfi_intersect(result.backend().value().data(), a.backend().value().data(), b.backend().value().data());\n   return result;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates> hull(const number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& a, const number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& b)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(a, b);\n   number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>                                                           result;\n   mpfi_union(result.backend().value().data(), a.backend().value().data(), b.backend().value().data());\n   return result;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline bool overlap(const number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& a, const number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& b)\n{\n   return (lower(a) <= lower(b) && lower(b) <= upper(a)) ||\n          (lower(b) <= lower(a) && lower(a) <= upper(b));\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates1, expression_template_option ExpressionTemplates2>\ninline bool in(const number<logged_adaptor<mpfr_float_backend<Digits10> >, ExpressionTemplates1>& a, const number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates2>& b)\n{\n   return mpfi_is_inside_fr(a.backend().value().data(), b.backend().value().data()) != 0;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline bool zero_in(const number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& a)\n{\n   return mpfi_has_zero(a.backend().value().data()) != 0;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline bool subset(const number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& a, const number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& b)\n{\n   return mpfi_is_inside(a.backend().value().data(), b.backend().value().data()) != 0;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline bool proper_subset(const number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& a, const number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& b)\n{\n   return mpfi_is_strictly_inside(a.backend().value().data(), b.backend().value().data()) != 0;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline bool empty(const number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& a)\n{\n   return mpfi_is_empty(a.backend().value().data()) != 0;\n}\n\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline bool singleton(const number<logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates>& a)\n{\n   return mpfr_cmp(a.backend().value().left_data(), a.backend().value().right_data()) == 0;\n}\n//\n// component_type specialization:\n//\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\nstruct component_type<number<mpfi_float_backend<Digits10>, ExpressionTemplates> >\n{\n   using type = number<mpfr_float_backend<Digits10>, ExpressionTemplates>;\n};\n\n//\n// Overloaded special functions which call native mpfr routines:\n//\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> asinh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<mpfi_float_backend<Digits10>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> result;\n   mpfi_asinh(result.backend().data(), arg.backend().data());\n   return result;\n}\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> acosh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<mpfi_float_backend<Digits10>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> result;\n   mpfi_acosh(result.backend().data(), arg.backend().data());\n   return result;\n}\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> atanh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<mpfi_float_backend<Digits10>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> result;\n   mpfi_atanh(result.backend().data(), arg.backend().data());\n   return result;\n}\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<mpfi_float_backend<Digits10>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> result;\n   mpfi_cbrt(result.backend().data(), arg.backend().data());\n   return result;\n}\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<mpfi_float_backend<Digits10>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> result;\n   mpfi_expm1(result.backend().data(), arg.backend().data());\n   return result;\n}\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> log1p BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<mpfi_float_backend<Digits10>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> result;\n   mpfi_log1p(result.backend().data(), arg.backend().data());\n   return result;\n}\n\n//\n// And again with debug_adaptor:\n//\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> asinh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> result;\n   mpfi_asinh(result.backend().value().data(), arg.backend().value().data());\n   return result;\n}\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> acosh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> result;\n   mpfi_acosh(result.backend().value().data(), arg.backend().value().data());\n   return result;\n}\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> atanh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> result;\n   mpfi_atanh(result.backend().value().data(), arg.backend().value().data());\n   return result;\n}\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> result;\n   mpfi_cbrt(result.backend().value().data(), arg.backend().value().data());\n   return result;\n}\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> result;\n   mpfi_expm1(result.backend().value().data(), arg.backend().value().data());\n   return result;\n}\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> log1p BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::debug_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> result;\n   mpfi_log1p(result.backend().value().data(), arg.backend().value().data());\n   return result;\n}\n\n//\n// And again with logged_adaptor:\n//\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> asinh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> result;\n   mpfi_asinh(result.backend().value().data(), arg.backend().value().data());\n   return result;\n}\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> acosh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> result;\n   mpfi_acosh(result.backend().value().data(), arg.backend().value().data());\n   return result;\n}\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> atanh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> result;\n   mpfi_atanh(result.backend().value().data(), arg.backend().value().data());\n   return result;\n}\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> result;\n   mpfi_cbrt(result.backend().value().data(), arg.backend().value().data());\n   return result;\n}\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> result;\n   mpfi_expm1(result.backend().value().data(), arg.backend().value().data());\n   return result;\n}\ntemplate <unsigned Digits10, expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> log1p BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::logged_adaptor<mpfi_float_backend<Digits10> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> result;\n   mpfi_log1p(result.backend().value().data(), arg.backend().value().data());\n   return result;\n}\n\n} // namespace multiprecision\n\nnamespace math {\n\nnamespace tools {\n\ninline void set_output_precision(const boost::multiprecision::mpfi_float& val, std::ostream& os)\n{\n   os << std::setprecision(val.precision());\n}\n\ntemplate <>\ninline int digits<boost::multiprecision::mpfi_float>()\n#ifdef BOOST_MATH_NOEXCEPT\n    noexcept\n#endif\n{\n   return multiprecision::detail::digits10_2_2(boost::multiprecision::mpfi_float::thread_default_precision());\n}\ntemplate <>\ninline int digits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, boost::multiprecision::et_off> >()\n#ifdef BOOST_MATH_NOEXCEPT\n    noexcept\n#endif\n{\n   return multiprecision::detail::digits10_2_2(boost::multiprecision::mpfi_float::thread_default_precision());\n}\n\ntemplate <>\ninline boost::multiprecision::mpfi_float\nmax_value<boost::multiprecision::mpfi_float>()\n{\n   boost::multiprecision::mpfi_float result(0.5);\n   mpfi_mul_2exp(result.backend().data(), result.backend().data(), mpfr_get_emax());\n   //BOOST_MP_ASSERT(mpfi_number_p(result.backend().data()));\n   return result;\n}\n\ntemplate <>\ninline boost::multiprecision::mpfi_float\nmin_value<boost::multiprecision::mpfi_float>()\n{\n   boost::multiprecision::mpfi_float result(0.5);\n   mpfi_div_2exp(result.backend().data(), result.backend().data(), -mpfr_get_emin());\n   //BOOST_MP_ASSERT(mpfi_number_p(result.backend().data()));\n   return result;\n}\n\ntemplate <>\ninline boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, boost::multiprecision::et_off>\nmax_value<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, boost::multiprecision::et_off> >()\n{\n   boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, boost::multiprecision::et_off> result(0.5);\n   mpfi_mul_2exp(result.backend().data(), result.backend().data(), mpfr_get_emax());\n   //BOOST_MP_ASSERT(mpfi_number_p(result.backend().data()));\n   return result;\n}\n\ntemplate <>\ninline boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, boost::multiprecision::et_off>\nmin_value<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, boost::multiprecision::et_off> >()\n{\n   boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, boost::multiprecision::et_off> result(0.5);\n   mpfi_div_2exp(result.backend().data(), result.backend().data(), -mpfr_get_emin());\n   //BOOST_MP_ASSERT(mpfi_number_p(result.backend().data()));\n   return result;\n}\n\n// mpfi gets used with logged_adaptor fairly often, so specialize for that use case as well:\nusing logged_type1 = boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float::backend_type>, boost::multiprecision::et_on> ;\nusing logged_type2 = boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float::backend_type>, boost::multiprecision::et_off>;\n\ntemplate <>\ninline int digits<logged_type1>()\n#ifdef BOOST_MATH_NOEXCEPT\n    noexcept\n#endif\n{\n   return multiprecision::detail::digits10_2_2(logged_type1::thread_default_precision());\n}\ntemplate <>\ninline int digits<logged_type2>()\n#ifdef BOOST_MATH_NOEXCEPT\n    noexcept\n#endif\n{\n   return multiprecision::detail::digits10_2_2(logged_type1::thread_default_precision());\n}\n\ntemplate <>\ninline logged_type1\nmax_value<logged_type1>()\n{\n   logged_type1 result(0.5);\n   mpfi_mul_2exp(result.backend().value().data(), result.backend().value().data(), mpfr_get_emax());\n   //BOOST_MP_ASSERT(mpfi_number_p(result.backend().data()));\n   return result;\n}\n\ntemplate <>\ninline logged_type1\nmin_value<logged_type1>()\n{\n   logged_type1 result(0.5);\n   mpfi_div_2exp(result.backend().value().data(), result.backend().value().data(), -mpfr_get_emin());\n   //BOOST_MP_ASSERT(mpfi_number_p(result.backend().data()));\n   return result;\n}\n\ntemplate <>\ninline logged_type2\nmax_value<logged_type2>()\n{\n   logged_type2 result(0.5);\n   mpfi_mul_2exp(result.backend().value().data(), result.backend().value().data(), mpfr_get_emax());\n   //BOOST_MP_ASSERT(mpfi_number_p(result.backend().data()));\n   return result;\n}\n\ntemplate <>\ninline logged_type2\nmin_value<logged_type2>()\n{\n   logged_type2 result(0.5);\n   mpfi_div_2exp(result.backend().value().data(), result.backend().value().data(), -mpfr_get_emin());\n   //BOOST_MP_ASSERT(mpfi_number_p(result.backend().data()));\n   return result;\n}\n// mpfi gets used with debug_adaptor fairly often, so specialize for that use case as well:\nusing debug_type1 = boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float::backend_type>, boost::multiprecision::et_on> ;\nusing debug_type2 = boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float::backend_type>, boost::multiprecision::et_off>;\n\ntemplate <>\ninline int digits<debug_type1>()\n#ifdef BOOST_MATH_NOEXCEPT\n    noexcept\n#endif\n{\n   return multiprecision::detail::digits10_2_2(debug_type1::default_precision());\n}\ntemplate <>\ninline int digits<debug_type2>()\n#ifdef BOOST_MATH_NOEXCEPT\n    noexcept\n#endif\n{\n   return multiprecision::detail::digits10_2_2(debug_type1::default_precision());\n}\n\ntemplate <>\ninline debug_type1\nmax_value<debug_type1>()\n{\n   debug_type1 result(0.5);\n   mpfi_mul_2exp(result.backend().value().data(), result.backend().value().data(), mpfr_get_emax());\n   //BOOST_MP_ASSERT(mpfi_number_p(result.backend().data()));\n   result.backend().update_view();\n   return result;\n}\n\ntemplate <>\ninline debug_type1\nmin_value<debug_type1>()\n{\n   debug_type1 result(0.5);\n   mpfi_div_2exp(result.backend().value().data(), result.backend().value().data(), -mpfr_get_emin());\n   //BOOST_MP_ASSERT(mpfi_number_p(result.backend().data()));\n   result.backend().update_view();\n   return result;\n}\n\ntemplate <>\ninline debug_type2\nmax_value<debug_type2>()\n{\n   debug_type2 result(0.5);\n   mpfi_mul_2exp(result.backend().value().data(), result.backend().value().data(), mpfr_get_emax());\n   //BOOST_MP_ASSERT(mpfi_number_p(result.backend().data()));\n   result.backend().update_view();\n   return result;\n}\n\ntemplate <>\ninline debug_type2\nmin_value<debug_type2>()\n{\n   debug_type2 result(0.5);\n   mpfi_div_2exp(result.backend().value().data(), result.backend().value().data(), -mpfr_get_emin());\n   //BOOST_MP_ASSERT(mpfi_number_p(result.backend().data()));\n   result.backend().update_view();\n   return result;\n}\n\n} // namespace tools\n\nnamespace constants { namespace detail {\n\ntemplate <class T>\nstruct constant_pi;\ntemplate <class T>\nstruct constant_ln_two;\ntemplate <class T>\nstruct constant_euler;\ntemplate <class T>\nstruct constant_catalan;\n\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_pi<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // Rely on C++11 thread safe initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfi_const_pi(result.backend().data());\n      return result;\n   }\n};\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_ln_two<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // Rely on C++11 thread safe initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfi_const_log2(result.backend().data());\n      return result;\n   }\n};\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_euler<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // Rely on C++11 thread safe initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfi_const_euler(result.backend().data());\n      return result;\n   }\n};\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_catalan<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // Rely on C++11 thread safe initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfi_const_catalan(result.backend().data());\n      return result;\n   }\n};\n//\n// And again with debug_adaptor:\n//\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_pi<boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // C++11 thread safe static initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfi_const_pi(result.backend().value().data());\n      result.backend().update_view();\n      return result;\n   }\n};\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_ln_two<boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // C++11 thread safe static initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfi_const_log2(result.backend().value().data());\n      result.backend().update_view();\n      return result;\n   }\n};\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_euler<boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // C++11 thread safe static initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfi_const_euler(result.backend().value().data());\n      result.backend().update_view();\n      return result;\n   }\n};\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_catalan<boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // C++11 thread safe static initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfi_const_catalan(result.backend().value().data());\n      result.backend().update_view();\n      return result;\n   }\n};\n//\n// And again with logged_adaptor:\n//\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_pi<boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // C++11 thread safe static initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfi_const_pi(result.backend().value().data());\n      return result;\n   }\n};\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_ln_two<boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // C++11 thread safe static initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfi_const_log2(result.backend().value().data());\n      return result;\n   }\n};\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_euler<boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // C++11 thread safe static initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfi_const_euler(result.backend().value().data());\n      return result;\n   }\n};\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_catalan<boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // C++11 thread safe static initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfi_const_catalan(result.backend().value().data());\n      return result;\n   }\n};\n\n}} // namespace constants::detail\n\n} // namespace math\n} // namespace boost\n\nnamespace std {\n\n//\n// numeric_limits [partial] specializations for the types declared in this header:\n//\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nclass numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >\n{\n   using number_type = boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates>;\n   static number_type get_min()\n   {\n      number_type value(0.5);\n      mpfi_div_2exp(value.backend().data(), value.backend().data(), -mpfr_get_emin());\n      return value;\n   }\n   static number_type get_max()\n   {\n      number_type value(0.5);\n      mpfi_mul_2exp(value.backend().data(), value.backend().data(), mpfr_get_emax());\n      return value;\n   }\n   static number_type get_epsilon()\n   {\n      number_type value(1);\n      mpfi_div_2exp(value.backend().data(), value.backend().data(), std::numeric_limits<number_type>::digits - 1);\n      return value;\n   }\n   static number_type get_infinity()\n   {\n      number_type value;\n      boost::multiprecision::mpfr_float_backend<Digits10> t;\n      mpfr_set_inf(t.data(), 1);\n      mpfi_set_fr(value.backend().data(), t.data());\n      return value;\n   }\n   static number_type get_quiet_NaN()\n   {\n      number_type value;\n      boost::multiprecision::mpfr_float_backend<Digits10> t;\n      mpfr_set_nan(t.data());\n      mpfi_set_fr(value.backend().data(), t.data());\n      return value;\n   }\n\n public:\n   static constexpr bool is_specialized = true;\n   static number_type(min)()\n   {\n      static number_type value{get_min()};\n      return value;\n   }\n   static number_type(max)()\n   {\n      static number_type value{get_max()};\n      return value;\n   }\n   static constexpr number_type lowest()\n   {\n      return -(max)();\n   }\n   static constexpr int digits   = static_cast<int>((Digits10 * 1000L) / 301L + ((Digits10 * 1000L) % 301 ? 2 : 1));\n   static constexpr int digits10 = Digits10;\n   // Is this really correct???\n   static constexpr int  max_digits10 = boost::multiprecision::detail::calc_max_digits10<digits>::value;\n   static constexpr bool is_signed    = true;\n   static constexpr bool is_integer   = false;\n   static constexpr bool is_exact     = false;\n   static constexpr int  radix        = 2;\n   static number_type          epsilon()\n   {\n      static number_type value{get_epsilon()};\n      return value;\n   }\n   // What value should this be????\n   static number_type round_error()\n   {\n      return 0.5;\n   }\n   static constexpr long min_exponent                  = MPFR_EMIN_DEFAULT;\n   static constexpr long min_exponent10                = (MPFR_EMIN_DEFAULT / 1000) * 301L;\n   static constexpr long max_exponent                  = MPFR_EMAX_DEFAULT;\n   static constexpr long max_exponent10                = (MPFR_EMAX_DEFAULT / 1000) * 301L;\n   static constexpr bool has_infinity                  = true;\n   static constexpr bool has_quiet_NaN                 = true;\n   static constexpr bool has_signaling_NaN             = false;\n   static constexpr float_denorm_style has_denorm      = denorm_absent;\n   static constexpr bool               has_denorm_loss = false;\n   static number_type                        infinity()\n   {\n      static number_type value{get_infinity()};\n      return value;\n   }\n   static number_type quiet_NaN()\n   {\n      static number_type value{get_quiet_NaN()};\n      return value;\n   }\n   static constexpr number_type signaling_NaN()\n   {\n      return number_type(0);\n   }\n   static constexpr number_type denorm_min() { return number_type(0); }\n   static constexpr bool        is_iec559         = false;\n   static constexpr bool        is_bounded        = true;\n   static constexpr bool        is_modulo         = false;\n   static constexpr bool        traps             = true;\n   static constexpr bool        tinyness_before   = false;\n   static constexpr float_round_style round_style = round_to_nearest;\n};\n\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::digits;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::digits10;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::max_digits10;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::is_signed;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::is_integer;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::is_exact;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::radix;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr long numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::min_exponent;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr long numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::min_exponent10;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr long numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::max_exponent;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr long numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::max_exponent10;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::has_infinity;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::has_quiet_NaN;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::has_signaling_NaN;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_denorm_style numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::has_denorm;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::has_denorm_loss;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::is_iec559;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::is_bounded;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::is_modulo;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::traps;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::tinyness_before;\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_round_style numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> >::round_style;\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nclass numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >\n{\n   using number_type = boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates>;\n\n public:\n   static constexpr bool is_specialized = false;\n   static number_type(min)() { return number_type(0); }\n   static number_type(max)() { return number_type(0); }\n   static number_type          lowest() { return number_type(0); }\n   static constexpr int  digits       = 0;\n   static constexpr int  digits10     = 0;\n   static constexpr int  max_digits10 = 0;\n   static constexpr bool is_signed    = false;\n   static constexpr bool is_integer   = false;\n   static constexpr bool is_exact     = false;\n   static constexpr int  radix        = 0;\n   static number_type          epsilon() { return number_type(0); }\n   static number_type          round_error() { return number_type(0); }\n   static constexpr int  min_exponent                  = 0;\n   static constexpr int  min_exponent10                = 0;\n   static constexpr int  max_exponent                  = 0;\n   static constexpr int  max_exponent10                = 0;\n   static constexpr bool has_infinity                  = false;\n   static constexpr bool has_quiet_NaN                 = false;\n   static constexpr bool has_signaling_NaN             = false;\n   static constexpr float_denorm_style has_denorm      = denorm_absent;\n   static constexpr bool               has_denorm_loss = false;\n   static number_type                        infinity() { return number_type(0); }\n   static number_type                        quiet_NaN() { return number_type(0); }\n   static number_type                        signaling_NaN() { return number_type(0); }\n   static number_type                        denorm_min() { return number_type(0); }\n   static constexpr bool               is_iec559       = false;\n   static constexpr bool               is_bounded      = false;\n   static constexpr bool               is_modulo       = false;\n   static constexpr bool               traps           = false;\n   static constexpr bool               tinyness_before = false;\n   static constexpr float_round_style round_style      = round_toward_zero;\n};\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::digits;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::digits10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::max_digits10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::is_signed;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::is_integer;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::is_exact;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::radix;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::min_exponent;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::min_exponent10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::max_exponent;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::max_exponent10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::has_infinity;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::has_quiet_NaN;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::has_signaling_NaN;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_denorm_style numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::has_denorm;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::has_denorm_loss;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::is_iec559;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::is_bounded;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::is_modulo;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::traps;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::tinyness_before;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_round_style numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, ExpressionTemplates> >::round_style;\n\n} // namespace std\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/mpfr.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_MPFR_HPP\n#define BOOST_MP_MPFR_HPP\n\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/number.hpp>\n#include <boost/multiprecision/debug_adaptor.hpp>\n#include <boost/multiprecision/logged_adaptor.hpp>\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/detail/digits.hpp>\n#include <boost/multiprecision/detail/float128_functions.hpp>\n#include <boost/multiprecision/detail/atomic.hpp>\n#include <boost/multiprecision/traits/max_digits10.hpp>\n#include <boost/multiprecision/detail/hash.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n#include <boost/multiprecision/detail/fpclassify.hpp>\n#include <mpfr.h>\n#include <cmath>\n#include <cstdint>\n#include <algorithm>\n#include <utility>\n#include <type_traits>\n#include <atomic>\n\n#ifdef BOOST_MP_MATH_AVAILABLE\n#include <boost/math/constants/constants.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#endif\n\n#ifndef BOOST_MULTIPRECISION_MPFR_DEFAULT_PRECISION\n#define BOOST_MULTIPRECISION_MPFR_DEFAULT_PRECISION 20\n#endif\n\nnamespace boost {\nnamespace multiprecision {\n\nenum mpfr_allocation_type\n{\n   allocate_stack,\n   allocate_dynamic\n};\n\nnamespace backends {\n\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType = allocate_dynamic>\nstruct mpfr_float_backend;\n\ntemplate <>\nstruct mpfr_float_backend<0, allocate_stack>;\n\n} // namespace backends\n\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\nstruct number_category<backends::mpfr_float_backend<digits10, AllocationType> > : public std::integral_constant<int, number_kind_floating_point>\n{};\n\nnamespace backends {\n\nnamespace detail {\n\ntemplate <bool b>\nstruct mpfr_cleanup\n{\n   //\n   // There are 2 seperate cleanup objects here, one calls\n   // mpfr_free_cache on destruction to perform global cleanup\n   // the other is declared thread_local and calls\n   // mpfr_free_cache2(MPFR_FREE_LOCAL_CACHE) to free thread local data.\n   //\n   struct initializer\n   {\n      initializer() {}\n      ~initializer() { mpfr_free_cache(); }\n      void force_instantiate() const {}\n   };\n#if MPFR_VERSION_MAJOR >= 4\n   struct thread_initializer\n   {\n      thread_initializer() {}\n      ~thread_initializer() { mpfr_free_cache2(MPFR_FREE_LOCAL_CACHE); }\n      void force_instantiate() const {}\n   };\n#endif\n   static const initializer init;\n   static void              force_instantiate()\n   {\n#if MPFR_VERSION_MAJOR >= 4\n      static const BOOST_MP_THREAD_LOCAL thread_initializer thread_init;\n      thread_init.force_instantiate();\n#endif\n      init.force_instantiate();\n   }\n};\n\ntemplate <bool b>\ntypename mpfr_cleanup<b>::initializer const mpfr_cleanup<b>::init;\n\ninline void mpfr_copy_precision(mpfr_t dest, const mpfr_t src)\n{\n   mpfr_prec_t p_dest = mpfr_get_prec(dest);\n   mpfr_prec_t p_src  = mpfr_get_prec(src);\n   if (p_dest != p_src)\n      mpfr_set_prec(dest, p_src);\n}\ninline void mpfr_copy_precision(mpfr_t dest, const mpfr_t src1, const mpfr_t src2)\n{\n   mpfr_prec_t p_dest = mpfr_get_prec(dest);\n   mpfr_prec_t p_src1 = mpfr_get_prec(src1);\n   mpfr_prec_t p_src2 = mpfr_get_prec(src2);\n   if (p_src2 > p_src1)\n      p_src1 = p_src2;\n   if (p_dest != p_src1)\n      mpfr_set_prec(dest, p_src1);\n}\n\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\nstruct mpfr_float_imp;\n\ntemplate <unsigned digits10>\nstruct mpfr_float_imp<digits10, allocate_dynamic>\n{\n#ifdef BOOST_HAS_LONG_LONG\n   using signed_types = std::tuple<long, long long>          ;\n   using unsigned_types = std::tuple<unsigned long, unsigned long long>;\n#else\n   using signed_types = std::tuple<long>         ;\n   using unsigned_types = std::tuple<unsigned long>;\n#endif\n   using float_types = std::tuple<double, long double>;\n   using exponent_type = long                          ;\n\n   mpfr_float_imp()\n   {\n      mpfr_init2(m_data, static_cast<mpfr_prec_t>(multiprecision::detail::digits10_2_2(digits10 ? digits10 : static_cast<unsigned>(get_default_precision()))));\n      mpfr_set_ui(m_data, 0u, GMP_RNDN);\n   }\n   mpfr_float_imp(unsigned digits2)\n   {\n      mpfr_init2(m_data, digits2);\n      mpfr_set_ui(m_data, 0u, GMP_RNDN);\n   }\n\n   mpfr_float_imp(const mpfr_float_imp& o)\n   {\n      mpfr_init2(m_data, preserve_source_precision() ? mpfr_get_prec(o.data()) : static_cast<mpfr_prec_t>(boost::multiprecision::detail::digits10_2_2(get_default_precision())));\n      if (o.m_data[0]._mpfr_d)\n         mpfr_set(m_data, o.m_data, GMP_RNDN);\n   }\n   // rvalue copy\n   mpfr_float_imp(mpfr_float_imp&& o) noexcept\n   {\n      mpfr_prec_t binary_default_precision = static_cast<mpfr_prec_t>(boost::multiprecision::detail::digits10_2_2(get_default_precision()));\n      if ((this->get_default_options() != variable_precision_options::preserve_target_precision) || (mpfr_get_prec(o.data()) == binary_default_precision))\n      {\n         m_data[0] = o.m_data[0];\n         o.m_data[0]._mpfr_d = nullptr;\n      }\n      else\n      {\n         // NOTE: C allocation interface must not throw:\n         mpfr_init2(m_data, binary_default_precision);\n         if (o.m_data[0]._mpfr_d)\n            mpfr_set(m_data, o.m_data, GMP_RNDN);\n      }\n   }\n   mpfr_float_imp& operator=(const mpfr_float_imp& o)\n   {\n      if ((o.m_data[0]._mpfr_d) && (this != &o))\n      {\n         if (m_data[0]._mpfr_d == nullptr)\n         {\n            mpfr_init2(m_data, preserve_source_precision() ? static_cast<mpfr_prec_t>(mpfr_get_prec(o.m_data)) : static_cast<mpfr_prec_t>(boost::multiprecision::detail::digits10_2_2(get_default_precision())));\n         }\n         else if (preserve_source_precision() && (mpfr_get_prec(o.data()) != mpfr_get_prec(data())))\n         {\n            mpfr_set_prec(m_data, mpfr_get_prec(o.m_data));\n         }\n         mpfr_set(m_data, o.m_data, GMP_RNDN);\n      }\n      return *this;\n   }\n   // rvalue assign\n   mpfr_float_imp& operator=(mpfr_float_imp&& o) noexcept\n   {\n      if ((this->get_default_options() != variable_precision_options::preserve_target_precision) || (mpfr_get_prec(o.data()) == mpfr_get_prec(data())))\n         mpfr_swap(m_data, o.m_data);\n      else\n         *this = static_cast<const mpfr_float_imp&>(o);\n      return *this;\n   }\n#ifdef BOOST_HAS_LONG_LONG\n#ifdef _MPFR_H_HAVE_INTMAX_T\n   mpfr_float_imp& operator=(unsigned long long i)\n   {\n      if (m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : static_cast<unsigned>(get_default_precision())));\n      mpfr_set_uj(m_data, i, GMP_RNDN);\n      return *this;\n   }\n   mpfr_float_imp& operator=(long long i)\n   {\n      if (m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : static_cast<unsigned>(get_default_precision())));\n      mpfr_set_sj(m_data, i, GMP_RNDN);\n      return *this;\n   }\n#else\n   mpfr_float_imp& operator=(unsigned long long i)\n   {\n      if (m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : static_cast<unsigned>(get_default_precision())));\n      unsigned long long mask  = ((((1uLL << (std::numeric_limits<unsigned long>::digits - 1)) - 1) << 1) | 1uLL);\n      unsigned               shift = 0;\n      mpfr_t                 t;\n      mpfr_init2(t, (std::max)(static_cast<mpfr_prec_t>(std::numeric_limits<unsigned long long>::digits), static_cast<mpfr_prec_t>(mpfr_get_prec(m_data))));\n      mpfr_set_ui(m_data, 0, GMP_RNDN);\n      while (i)\n      {\n         mpfr_set_ui(t, static_cast<unsigned long>(i & mask), GMP_RNDN);\n         if (shift)\n            mpfr_mul_2exp(t, t, shift, GMP_RNDN);\n         mpfr_add(m_data, m_data, t, GMP_RNDN);\n         shift += std::numeric_limits<unsigned long>::digits;\n         i >>= std::numeric_limits<unsigned long>::digits;\n      }\n      mpfr_clear(t);\n      return *this;\n   }\n   mpfr_float_imp& operator=(long long i)\n   {\n      if (m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : static_cast<unsigned>(get_default_precision())));\n      bool neg = i < 0;\n      *this    = boost::multiprecision::detail::unsigned_abs(i);\n      if (neg)\n         mpfr_neg(m_data, m_data, GMP_RNDN);\n      return *this;\n   }\n#endif\n#endif\n#ifdef BOOST_HAS_INT128\n   mpfr_float_imp& operator=(uint128_type i)\n   {\n      if (m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : static_cast<unsigned>(get_default_precision())));\n      unsigned long long mask  = ((((1uLL << (std::numeric_limits<unsigned long>::digits - 1)) - 1) << 1) | 1uLL);\n      unsigned           shift = 0;\n      mpfr_t             t;\n      mpfr_init2(t, (std::max)(static_cast<mpfr_prec_t>(std::numeric_limits<unsigned long long>::digits), static_cast<mpfr_prec_t>(mpfr_get_prec(m_data))));\n      mpfr_set_ui(m_data, 0, GMP_RNDN);\n      while (i)\n      {\n         mpfr_set_ui(t, static_cast<unsigned long>(i & mask), GMP_RNDN);\n         if (shift)\n            mpfr_mul_2exp(t, t, shift, GMP_RNDN);\n         mpfr_add(m_data, m_data, t, GMP_RNDN);\n         shift += std::numeric_limits<unsigned long>::digits;\n         i >>= std::numeric_limits<unsigned long>::digits;\n      }\n      mpfr_clear(t);\n      return *this;\n   }\n   mpfr_float_imp& operator=(int128_type i)\n   {\n      if (m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : static_cast<unsigned>(get_default_precision())));\n      bool neg = i < 0;\n      *this    = boost::multiprecision::detail::unsigned_abs(i);\n      if (neg)\n         mpfr_neg(m_data, m_data, GMP_RNDN);\n      return *this;\n   }\n#endif\n   mpfr_float_imp& operator=(unsigned long i)\n   {\n      if (m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : static_cast<unsigned>(get_default_precision())));\n      mpfr_set_ui(m_data, i, GMP_RNDN);\n      return *this;\n   }\n   mpfr_float_imp& operator=(long i)\n   {\n      if (m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : static_cast<unsigned>(get_default_precision())));\n      mpfr_set_si(m_data, i, GMP_RNDN);\n      return *this;\n   }\n   mpfr_float_imp& operator=(double d)\n   {\n      if (m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(m_data, static_cast<mpfr_prec_t>(multiprecision::detail::digits10_2_2(digits10 ? digits10 : static_cast<unsigned>(get_default_precision()))));\n      mpfr_set_d(m_data, d, GMP_RNDN);\n      return *this;\n   }\n   mpfr_float_imp& operator=(long double a)\n   {\n      if (m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : static_cast<unsigned>(get_default_precision())));\n      mpfr_set_ld(m_data, a, GMP_RNDN);\n      return *this;\n   }\n#ifdef BOOST_HAS_FLOAT128\n   mpfr_float_imp& operator=(float128_type a)\n   {\n      BOOST_MP_FLOAT128_USING\n      if (m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : static_cast<unsigned>(get_default_precision())));\n\n      if (a == 0)\n      {\n         mpfr_set_si(m_data, 0, GMP_RNDN);\n         return *this;\n      }\n\n      if (a == 1)\n      {\n         mpfr_set_si(m_data, 1, GMP_RNDN);\n         return *this;\n      }\n\n      if (BOOST_MP_ISINF(a))\n      {\n         mpfr_set_inf(m_data, a < 0 ? -1 : 1);\n         return *this;\n      }\n      if (BOOST_MP_ISNAN(a))\n      {\n         mpfr_set_nan(m_data);\n         return *this;\n      }\n\n      int        e;\n      float128_type f, term;\n      mpfr_set_ui(m_data, 0u, GMP_RNDN);\n\n      f = frexp(a, &e);\n\n      constexpr const int shift = std::numeric_limits<int>::digits - 1;\n\n      while (f)\n      {\n         // extract int sized bits from f:\n         f    = ldexp(f, shift);\n         term = floor(f);\n         e -= shift;\n         mpfr_mul_2exp(m_data, m_data, shift, GMP_RNDN);\n         if (term > 0)\n            mpfr_add_ui(m_data, m_data, static_cast<unsigned>(term), GMP_RNDN);\n         else\n            mpfr_sub_ui(m_data, m_data, static_cast<unsigned>(-term), GMP_RNDN);\n         f -= term;\n      }\n      if (e > 0)\n         mpfr_mul_2exp(m_data, m_data, e, GMP_RNDN);\n      else if (e < 0)\n         mpfr_div_2exp(m_data, m_data, -e, GMP_RNDN);\n      return *this;\n   }\n#endif\n   mpfr_float_imp& operator=(const char* s)\n   {\n      if (m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(m_data, static_cast<mpfr_prec_t>(multiprecision::detail::digits10_2_2(digits10 ? digits10 : static_cast<unsigned>(get_default_precision()))));\n      if (mpfr_set_str(m_data, s, 10, GMP_RNDN) != 0)\n      {\n         BOOST_MP_THROW_EXCEPTION(std::runtime_error(std::string(\"Unable to parse string \\\"\") + s + std::string(\"\\\"as a valid floating point number.\")));\n      }\n      return *this;\n   }\n   void swap(mpfr_float_imp& o) noexcept\n   {\n      mpfr_swap(m_data, o.m_data);\n   }\n   std::string str(std::streamsize digits, std::ios_base::fmtflags f) const\n   {\n      BOOST_MP_ASSERT(m_data[0]._mpfr_d);\n\n      bool scientific = (f & std::ios_base::scientific) == std::ios_base::scientific;\n      bool fixed      = (f & std::ios_base::fixed) == std::ios_base::fixed;\n\n      std::streamsize org_digits(digits);\n\n      if (scientific && digits)\n         ++digits;\n\n      std::string result;\n      mp_exp_t    e;\n      if (mpfr_inf_p(m_data))\n      {\n         if (mpfr_sgn(m_data) < 0)\n            result = \"-inf\";\n         else if (f & std::ios_base::showpos)\n            result = \"+inf\";\n         else\n            result = \"inf\";\n         return result;\n      }\n      if (mpfr_nan_p(m_data))\n      {\n         result = \"nan\";\n         return result;\n      }\n      if (mpfr_zero_p(m_data))\n      {\n         e      = 0;\n         if (mpfr_signbit(m_data))\n            result = \"-0\";\n         else\n            result = \"0\";\n      }\n      else if (fixed)\n      {\n         // We actually need a different number of digits to what one might expect:\n         char* ps = mpfr_get_str(nullptr, &e, 10, static_cast<std::size_t>(digits), m_data, GMP_RNDN);\n         --e;\n         mpfr_free_str(ps);\n         digits += e + 1;\n         if (digits == 0)\n         {\n            // We need to get *all* the digits and then possibly round up,\n            // we end up with either \"0\" or \"1\" as the result.\n            ps = mpfr_get_str(nullptr, &e, 10, 0, m_data, GMP_RNDN);\n            --e;\n            unsigned offset = *ps == '-' ? 1 : 0;\n            if (ps[offset] > '5')\n            {\n               ++e;\n               ps[offset] = '1';\n               ps[offset + 1] = 0;\n            }\n            else if (ps[offset] == '5')\n            {\n               unsigned i = offset + 1;\n               bool     round_up = false;\n               while (ps[i] != 0)\n               {\n                  if (ps[i] != '0')\n                  {\n                     round_up = true;\n                     break;\n                  }\n                  ++i;\n               }\n               if (round_up)\n               {\n                  ++e;\n                  ps[offset] = '1';\n                  ps[offset + 1] = 0;\n               }\n               else\n               {\n                  ps[offset] = '0';\n                  ps[offset + 1] = 0;\n               }\n            }\n            else\n            {\n               ps[offset] = '0';\n               ps[offset + 1] = 0;\n            }\n         }\n         else if (digits > 0)\n         {\n            mp_exp_t old_e = e;\n            ps = mpfr_get_str(nullptr, &e, 10, static_cast<std::size_t>(digits), m_data, GMP_RNDN);\n            --e; // To match with what our formatter expects.\n            if (old_e > e)\n            {\n               // in some cases, when we ask for more digits of precision, it will\n               // change the number of digits to the left of the decimal, if that\n               // happens, account for it here.\n               // example: cout << fixed << setprecision(3) << mpf_float_50(\"99.9809\")\n               mpfr_free_str(ps);\n               digits -= old_e - e;\n               ps = mpfr_get_str(nullptr, &e, 10, static_cast<std::size_t>(digits), m_data, GMP_RNDN);\n               --e; // To match with what our formatter expects.\n            }\n         }\n         else\n         {\n            ps = mpfr_get_str(nullptr, &e, 10, 1, m_data, GMP_RNDN);\n            --e;\n            unsigned offset = *ps == '-' ? 1 : 0;\n            ps[offset] = '0';\n            ps[offset + 1] = 0;\n         }\n         result = ps ? ps : \"0\";\n         if (ps)\n            mpfr_free_str(ps);\n      }\n      else\n      {\n         char* ps = mpfr_get_str(nullptr, &e, 10, static_cast<std::size_t>(digits), m_data, GMP_RNDN);\n         --e; // To match with what our formatter expects.\n         result = ps ? ps : \"0\";\n         if (ps)\n            mpfr_free_str(ps);\n      }\n      boost::multiprecision::detail::format_float_string(result, e, org_digits, f, 0 != mpfr_zero_p(m_data));\n      return result;\n   }\n   ~mpfr_float_imp() noexcept\n   {\n      if (m_data[0]._mpfr_d)\n         mpfr_clear(m_data);\n      detail::mpfr_cleanup<true>::force_instantiate();\n   }\n   void negate() noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0]._mpfr_d);\n      mpfr_neg(m_data, m_data, GMP_RNDN);\n   }\n   template <mpfr_allocation_type AllocationType>\n   int compare(const mpfr_float_backend<digits10, AllocationType>& o) const\n   {\n      BOOST_MP_ASSERT(m_data[0]._mpfr_d && o.m_data[0]._mpfr_d);\n      return mpfr_cmp(m_data, o.m_data);\n   }\n   int compare(long i) const\n   {\n      BOOST_MP_ASSERT(m_data[0]._mpfr_d);\n      return mpfr_cmp_si(m_data, i);\n   }\n   int compare(double i) const\n   {\n      BOOST_MP_ASSERT(m_data[0]._mpfr_d);\n      return mpfr_cmp_d(m_data, i);\n   }\n   int compare(long double i) const\n   {\n      BOOST_MP_ASSERT(m_data[0]._mpfr_d);\n      return mpfr_cmp_ld(m_data, i);\n   }\n   int compare(unsigned long i) const\n   {\n      BOOST_MP_ASSERT(m_data[0]._mpfr_d);\n      return mpfr_cmp_ui(m_data, i);\n   }\n   template <class V>\n   int compare(V v) const\n   {\n      mpfr_float_backend<digits10, allocate_dynamic> d(0uL, mpfr_get_prec(m_data));\n      d = v;\n      return compare(d);\n   }\n   mpfr_t& data() noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0]._mpfr_d);\n      return m_data;\n   }\n   const mpfr_t& data() const noexcept\n   {\n      BOOST_MP_ASSERT(m_data[0]._mpfr_d);\n      return m_data;\n   }\n\n protected:\n   mpfr_t           m_data;\n   static boost::multiprecision::detail::precision_type& get_global_default_precision() noexcept\n   {\n      static boost::multiprecision::detail::precision_type val(BOOST_MULTIPRECISION_MPFR_DEFAULT_PRECISION);\n      return val;\n   }\n   static unsigned& get_default_precision() noexcept\n   {\n      static BOOST_MP_THREAD_LOCAL unsigned val(get_global_default_precision());\n      return val;\n   }\n#ifndef BOOST_MT_NO_ATOMIC_INT\n   static std::atomic<variable_precision_options>& get_global_default_options() noexcept\n   {\n      static std::atomic<variable_precision_options> val{variable_precision_options::preserve_related_precision};\n      return val;\n   }\n#else\n   static variable_precision_options& get_global_default_options() noexcept\n   {\n      static variable_precision_options val{variable_precision_options::preserve_related_precision};\n      return val;\n   }\n#endif\n   static variable_precision_options& get_default_options()noexcept\n   {\n      static BOOST_MP_THREAD_LOCAL variable_precision_options val(get_global_default_options());\n      return val;\n   }\n   static bool preserve_source_precision() noexcept\n   {\n      return get_default_options() >= variable_precision_options::preserve_source_precision;\n   }\n};\n\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4127) // Conditional expression is constant\n#endif\n\ntemplate <unsigned digits10>\nstruct mpfr_float_imp<digits10, allocate_stack>\n{\n#ifdef BOOST_HAS_LONG_LONG\n   using signed_types = std::tuple<long, long long>          ;\n   using unsigned_types = std::tuple<unsigned long, unsigned long long>;\n#else\n   using signed_types = std::tuple<long>         ;\n   using unsigned_types = std::tuple<unsigned long>;\n#endif\n   using float_types = std::tuple<double, long double>;\n   using exponent_type = long                          ;\n\n   static constexpr const unsigned digits2    = (digits10 * 1000uL) / 301uL + ((digits10 * 1000uL) % 301 ? 2u : 1u);\n   static constexpr const unsigned limb_count = mpfr_custom_get_size(digits2) / sizeof(mp_limb_t);\n\n   ~mpfr_float_imp() noexcept\n   {\n      detail::mpfr_cleanup<true>::force_instantiate();\n   }\n   mpfr_float_imp()\n   {\n      mpfr_custom_init(m_buffer, digits2);\n      mpfr_custom_init_set(m_data, MPFR_NAN_KIND, 0, digits2, m_buffer);\n      mpfr_set_ui(m_data, 0u, GMP_RNDN);\n   }\n\n   mpfr_float_imp(const mpfr_float_imp& o)\n   {\n      mpfr_custom_init(m_buffer, digits2);\n      mpfr_custom_init_set(m_data, MPFR_NAN_KIND, 0, digits2, m_buffer);\n      mpfr_set(m_data, o.m_data, GMP_RNDN);\n   }\n   mpfr_float_imp& operator=(const mpfr_float_imp& o)\n   {\n      mpfr_set(m_data, o.m_data, GMP_RNDN);\n      return *this;\n   }\n#ifdef BOOST_HAS_LONG_LONG\n#ifdef _MPFR_H_HAVE_INTMAX_T\n   mpfr_float_imp& operator=(unsigned long long i)\n   {\n      mpfr_set_uj(m_data, i, GMP_RNDN);\n      return *this;\n   }\n   mpfr_float_imp& operator=(long long i)\n   {\n      mpfr_set_sj(m_data, i, GMP_RNDN);\n      return *this;\n   }\n#else\n   mpfr_float_imp& operator=(unsigned long long i)\n   {\n      unsigned long long mask  = ((((1uLL << (std::numeric_limits<unsigned long>::digits - 1)) - 1) << 1) | 1uL);\n      unsigned               shift = 0;\n      mpfr_t                 t;\n      mp_limb_t              t_limbs[limb_count];\n      mpfr_custom_init(t_limbs, digits2);\n      mpfr_custom_init_set(t, MPFR_NAN_KIND, 0, digits2, t_limbs);\n      mpfr_set_ui(m_data, 0, GMP_RNDN);\n      while (i)\n      {\n         mpfr_set_ui(t, static_cast<unsigned long>(i & mask), GMP_RNDN);\n         if (shift)\n            mpfr_mul_2exp(t, t, shift, GMP_RNDN);\n         mpfr_add(m_data, m_data, t, GMP_RNDN);\n         shift += std::numeric_limits<unsigned long>::digits;\n         i >>= std::numeric_limits<unsigned long>::digits;\n      }\n      return *this;\n   }\n   mpfr_float_imp& operator=(long long i)\n   {\n      bool neg = i < 0;\n      *this    = boost::multiprecision::detail::unsigned_abs(i);\n      if (neg)\n         mpfr_neg(m_data, m_data, GMP_RNDN);\n      return *this;\n   }\n#endif\n#endif\n#ifdef BOOST_HAS_INT128\n   mpfr_float_imp& operator=(uint128_type i)\n   {\n      unsigned long long mask  = ((((1uLL << (std::numeric_limits<unsigned long>::digits - 1)) - 1) << 1) | 1uL);\n      unsigned           shift = 0;\n      mpfr_t             t;\n      mp_limb_t          t_limbs[limb_count];\n      mpfr_custom_init(t_limbs, digits2);\n      mpfr_custom_init_set(t, MPFR_NAN_KIND, 0, digits2, t_limbs);\n      mpfr_set_ui(m_data, 0, GMP_RNDN);\n      while (i)\n      {\n         mpfr_set_ui(t, static_cast<unsigned long>(i & mask), GMP_RNDN);\n         if (shift)\n            mpfr_mul_2exp(t, t, shift, GMP_RNDN);\n         mpfr_add(m_data, m_data, t, GMP_RNDN);\n         shift += std::numeric_limits<unsigned long>::digits;\n         i >>= std::numeric_limits<unsigned long>::digits;\n      }\n      return *this;\n   }\n   mpfr_float_imp& operator=(int128_type i)\n   {\n      bool neg = i < 0;\n      *this    = boost::multiprecision::detail::unsigned_abs(i);\n      if (neg)\n         mpfr_neg(m_data, m_data, GMP_RNDN);\n      return *this;\n   }\n#endif\n   mpfr_float_imp& operator=(unsigned long i)\n   {\n      mpfr_set_ui(m_data, i, GMP_RNDN);\n      return *this;\n   }\n   mpfr_float_imp& operator=(long i)\n   {\n      mpfr_set_si(m_data, i, GMP_RNDN);\n      return *this;\n   }\n   mpfr_float_imp& operator=(double d)\n   {\n      mpfr_set_d(m_data, d, GMP_RNDN);\n      return *this;\n   }\n   mpfr_float_imp& operator=(long double a)\n   {\n      mpfr_set_ld(m_data, a, GMP_RNDN);\n      return *this;\n   }\n#ifdef BOOST_HAS_FLOAT128\n   mpfr_float_imp& operator=(float128_type a)\n   {\n      BOOST_MP_FLOAT128_USING\n      if (a == 0)\n      {\n         mpfr_set_si(m_data, 0, GMP_RNDN);\n         return *this;\n      }\n\n      if (a == 1)\n      {\n         mpfr_set_si(m_data, 1, GMP_RNDN);\n         return *this;\n      }\n\n      if (BOOST_MP_ISINF(a))\n      {\n         mpfr_set_inf(m_data, a < 0 ? -1 : 1);\n         return *this;\n      }\n      if (BOOST_MP_ISNAN(a))\n      {\n         mpfr_set_nan(m_data);\n         return *this;\n      }\n\n      int        e;\n      float128_type f, term;\n      mpfr_set_ui(m_data, 0u, GMP_RNDN);\n\n      f = frexp(a, &e);\n\n      constexpr const int shift = std::numeric_limits<int>::digits - 1;\n\n      while (f)\n      {\n         // extract int sized bits from f:\n         f    = ldexp(f, shift);\n         term = floor(f);\n         e -= shift;\n         mpfr_mul_2exp(m_data, m_data, shift, GMP_RNDN);\n         if (term > 0)\n            mpfr_add_ui(m_data, m_data, static_cast<unsigned>(term), GMP_RNDN);\n         else\n            mpfr_sub_ui(m_data, m_data, static_cast<unsigned>(-term), GMP_RNDN);\n         f -= term;\n      }\n      if (e > 0)\n         mpfr_mul_2exp(m_data, m_data, e, GMP_RNDN);\n      else if (e < 0)\n         mpfr_div_2exp(m_data, m_data, -e, GMP_RNDN);\n      return *this;\n   }\n#endif\n   mpfr_float_imp& operator=(const char* s)\n   {\n      if (mpfr_set_str(m_data, s, 10, GMP_RNDN) != 0)\n      {\n         BOOST_MP_THROW_EXCEPTION(std::runtime_error(std::string(\"Unable to parse string \\\"\") + s + std::string(\"\\\"as a valid floating point number.\")));\n      }\n      return *this;\n   }\n   void swap(mpfr_float_imp& o) noexcept\n   {\n      // We have to swap by copying:\n      mpfr_float_imp t(*this);\n      *this = o;\n      o     = t;\n   }\n   std::string str(std::streamsize digits, std::ios_base::fmtflags f) const\n   {\n      BOOST_MP_ASSERT(m_data[0]._mpfr_d);\n\n      bool scientific = (f & std::ios_base::scientific) == std::ios_base::scientific;\n      bool fixed      = (f & std::ios_base::fixed) == std::ios_base::fixed;\n\n      std::streamsize org_digits(digits);\n\n      if (scientific && digits)\n         ++digits;\n\n      std::string result;\n      mp_exp_t    e;\n      if (mpfr_inf_p(m_data))\n      {\n         if (mpfr_sgn(m_data) < 0)\n            result = \"-inf\";\n         else if (f & std::ios_base::showpos)\n            result = \"+inf\";\n         else\n            result = \"inf\";\n         return result;\n      }\n      if (mpfr_nan_p(m_data))\n      {\n         result = \"nan\";\n         return result;\n      }\n      if (mpfr_zero_p(m_data))\n      {\n         e      = 0;\n         result = \"0\";\n      }\n      else\n      {\n         char* ps = mpfr_get_str(nullptr, &e, 10, static_cast<std::size_t>(digits), m_data, GMP_RNDN);\n         --e; // To match with what our formatter expects.\n         if (fixed && e != -1)\n         {\n            // Oops we actually need a different number of digits to what we asked for:\n            mpfr_free_str(ps);\n            digits += e + 1;\n            if (digits == 0)\n            {\n               // We need to get *all* the digits and then possibly round up,\n               // we end up with either \"0\" or \"1\" as the result.\n               ps = mpfr_get_str(nullptr, &e, 10, 0, m_data, GMP_RNDN);\n               --e;\n               unsigned offset = *ps == '-' ? 1 : 0;\n               if (ps[offset] > '5')\n               {\n                  ++e;\n                  ps[offset]     = '1';\n                  ps[offset + 1] = 0;\n               }\n               else if (ps[offset] == '5')\n               {\n                  unsigned i        = offset + 1;\n                  bool     round_up = false;\n                  while (ps[i] != 0)\n                  {\n                     if (ps[i] != '0')\n                     {\n                        round_up = true;\n                        break;\n                     }\n                  }\n                  if (round_up)\n                  {\n                     ++e;\n                     ps[offset]     = '1';\n                     ps[offset + 1] = 0;\n                  }\n                  else\n                  {\n                     ps[offset]     = '0';\n                     ps[offset + 1] = 0;\n                  }\n               }\n               else\n               {\n                  ps[offset]     = '0';\n                  ps[offset + 1] = 0;\n               }\n            }\n            else if (digits > 0)\n            {\n               ps = mpfr_get_str(nullptr, &e, 10, static_cast<std::size_t>(digits), m_data, GMP_RNDN);\n               --e; // To match with what our formatter expects.\n            }\n            else\n            {\n               ps = mpfr_get_str(nullptr, &e, 10, 1, m_data, GMP_RNDN);\n               --e;\n               unsigned offset = *ps == '-' ? 1 : 0;\n               ps[offset]      = '0';\n               ps[offset + 1]  = 0;\n            }\n         }\n         result = ps ? ps : \"0\";\n         if (ps)\n            mpfr_free_str(ps);\n      }\n      boost::multiprecision::detail::format_float_string(result, e, org_digits, f, 0 != mpfr_zero_p(m_data));\n      return result;\n   }\n   void negate() noexcept\n   {\n      mpfr_neg(m_data, m_data, GMP_RNDN);\n   }\n   template <mpfr_allocation_type AllocationType>\n   int compare(const mpfr_float_backend<digits10, AllocationType>& o) const\n   {\n      return mpfr_cmp(m_data, o.m_data);\n   }\n   int compare(long i) const\n   {\n      return mpfr_cmp_si(m_data, i);\n   }\n   int compare(unsigned long i) const\n   {\n      return mpfr_cmp_ui(m_data, i);\n   }\n   int compare(double i) const\n   {\n      return mpfr_cmp_d(m_data, i);\n   }\n   int compare(long double i) const\n   {\n      return mpfr_cmp_ld(m_data, i);\n   }\n   template <class V>\n   int compare(V v) const\n   {\n      mpfr_float_backend<digits10, allocate_stack> d;\n      d = v;\n      return compare(d);\n   }\n   mpfr_t& data() noexcept\n   {\n      return m_data;\n   }\n   const mpfr_t& data() const noexcept\n   {\n      return m_data;\n   }\n\n protected:\n   mpfr_t    m_data;\n   mp_limb_t m_buffer[limb_count];\n};\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n} // namespace detail\n\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\nstruct mpfr_float_backend : public detail::mpfr_float_imp<digits10, AllocationType>\n{\n   mpfr_float_backend() : detail::mpfr_float_imp<digits10, AllocationType>() {}\n   mpfr_float_backend(const mpfr_float_backend& o) : detail::mpfr_float_imp<digits10, AllocationType>(o) {}\n   // rvalue copy\n   mpfr_float_backend(mpfr_float_backend&& o) noexcept : detail::mpfr_float_imp<digits10, AllocationType>(static_cast<detail::mpfr_float_imp<digits10, AllocationType>&&>(o))\n   {}\n   template <unsigned D, mpfr_allocation_type AT>\n   mpfr_float_backend(const mpfr_float_backend<D, AT>& val, typename std::enable_if<D <= digits10>::type* = nullptr)\n       : detail::mpfr_float_imp<digits10, AllocationType>()\n   {\n      mpfr_set(this->m_data, val.data(), GMP_RNDN);\n   }\n   template <unsigned D, mpfr_allocation_type AT>\n   explicit mpfr_float_backend(const mpfr_float_backend<D, AT>& val, typename std::enable_if<!(D <= digits10)>::type* = nullptr)\n       : detail::mpfr_float_imp<digits10, AllocationType>()\n   {\n      mpfr_set(this->m_data, val.data(), GMP_RNDN);\n   }\n   template <unsigned D>\n   mpfr_float_backend(const gmp_float<D>& val, typename std::enable_if<D <= digits10>::type* = nullptr)\n       : detail::mpfr_float_imp<digits10, AllocationType>()\n   {\n      mpfr_set_f(this->m_data, val.data(), GMP_RNDN);\n   }\n   template <unsigned D>\n   mpfr_float_backend(const gmp_float<D>& val, typename std::enable_if<!(D <= digits10)>::type* = nullptr)\n       : detail::mpfr_float_imp<digits10, AllocationType>()\n   {\n      mpfr_set_f(this->m_data, val.data(), GMP_RNDN);\n   }\n   mpfr_float_backend(const gmp_int& val)\n       : detail::mpfr_float_imp<digits10, AllocationType>()\n   {\n      mpfr_set_z(this->m_data, val.data(), GMP_RNDN);\n   }\n   mpfr_float_backend(const gmp_rational& val)\n       : detail::mpfr_float_imp<digits10, AllocationType>()\n   {\n      mpfr_set_q(this->m_data, val.data(), GMP_RNDN);\n   }\n   mpfr_float_backend(const mpfr_t val)\n       : detail::mpfr_float_imp<digits10, AllocationType>()\n   {\n      mpfr_set(this->m_data, val, GMP_RNDN);\n   }\n   mpfr_float_backend(const mpf_t val)\n       : detail::mpfr_float_imp<digits10, AllocationType>()\n   {\n      mpfr_set_f(this->m_data, val, GMP_RNDN);\n   }\n   mpfr_float_backend(const mpz_t val)\n       : detail::mpfr_float_imp<digits10, AllocationType>()\n   {\n      mpfr_set_z(this->m_data, val, GMP_RNDN);\n   }\n   mpfr_float_backend(const mpq_t val)\n       : detail::mpfr_float_imp<digits10, AllocationType>()\n   {\n      mpfr_set_q(this->m_data, val, GMP_RNDN);\n   }\n   // Construction with precision: we ignore the precision here.\n   template <class V>\n   mpfr_float_backend(const V& o, unsigned)\n   {\n      *this = o;\n   }\n   mpfr_float_backend& operator=(const mpfr_float_backend& o)\n   {\n      *static_cast<detail::mpfr_float_imp<digits10, AllocationType>*>(this) = static_cast<detail::mpfr_float_imp<digits10, AllocationType> const&>(o);\n      return *this;\n   }\n   // rvalue assign\n   mpfr_float_backend& operator=(mpfr_float_backend&& o) noexcept\n   {\n      *static_cast<detail::mpfr_float_imp<digits10, AllocationType>*>(this) = static_cast<detail::mpfr_float_imp<digits10, AllocationType>&&>(o);\n      return *this;\n   }\n   template <class V>\n   typename std::enable_if<std::is_assignable<detail::mpfr_float_imp<digits10, AllocationType>, V>::value, mpfr_float_backend&>::type operator=(const V& v)\n   {\n      *static_cast<detail::mpfr_float_imp<digits10, AllocationType>*>(this) = v;\n      return *this;\n   }\n   mpfr_float_backend& operator=(const mpfr_t val)\n   {\n      if (this->m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));\n      mpfr_set(this->m_data, val, GMP_RNDN);\n      return *this;\n   }\n   mpfr_float_backend& operator=(const mpf_t val)\n   {\n      if (this->m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));\n      mpfr_set_f(this->m_data, val, GMP_RNDN);\n      return *this;\n   }\n   mpfr_float_backend& operator=(const mpz_t val)\n   {\n      if (this->m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));\n      mpfr_set_z(this->m_data, val, GMP_RNDN);\n      return *this;\n   }\n   mpfr_float_backend& operator=(const mpq_t val)\n   {\n      if (this->m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));\n      mpfr_set_q(this->m_data, val, GMP_RNDN);\n      return *this;\n   }\n   // We don't change our precision here, this is a fixed precision type:\n   template <unsigned D, mpfr_allocation_type AT>\n   mpfr_float_backend& operator=(const mpfr_float_backend<D, AT>& val)\n   {\n      if (this->m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));\n      mpfr_set(this->m_data, val.data(), GMP_RNDN);\n      return *this;\n   }\n   template <unsigned D>\n   mpfr_float_backend& operator=(const gmp_float<D>& val)\n   {\n      if (this->m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));\n      mpfr_set_f(this->m_data, val.data(), GMP_RNDN);\n      return *this;\n   }\n   mpfr_float_backend& operator=(const gmp_int& val)\n   {\n      if (this->m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));\n      mpfr_set_z(this->m_data, val.data(), GMP_RNDN);\n      return *this;\n   }\n   mpfr_float_backend& operator=(const gmp_rational& val)\n   {\n      if (this->m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));\n      mpfr_set_q(this->m_data, val.data(), GMP_RNDN);\n      return *this;\n   }\n};\n\ntemplate <>\nstruct mpfr_float_backend<0, allocate_dynamic> : public detail::mpfr_float_imp<0, allocate_dynamic>\n{\n   mpfr_float_backend() : detail::mpfr_float_imp<0, allocate_dynamic>() {}\n   mpfr_float_backend(const mpfr_t val)\n       : detail::mpfr_float_imp<0, allocate_dynamic>(preserve_all_precision() ? static_cast<unsigned>(mpfr_get_prec(val)) : static_cast<unsigned>(boost::multiprecision::detail::digits10_2_2(get_default_precision())))\n   {\n      mpfr_set(this->m_data, val, GMP_RNDN);\n   }\n   mpfr_float_backend(const mpf_t val)\n       : detail::mpfr_float_imp<0, allocate_dynamic>(preserve_all_precision() ? static_cast<unsigned>(mpf_get_prec(val)) : static_cast<unsigned>(boost::multiprecision::detail::digits10_2_2(get_default_precision())))\n   {\n      mpfr_set_f(this->m_data, val, GMP_RNDN);\n   }\n   mpfr_float_backend(const mpz_t val)\n       : detail::mpfr_float_imp<0, allocate_dynamic>()\n   {\n      mpfr_set_z(this->m_data, val, GMP_RNDN);\n   }\n   mpfr_float_backend(const mpq_t val)\n       : detail::mpfr_float_imp<0, allocate_dynamic>()\n   {\n      mpfr_set_q(this->m_data, val, GMP_RNDN);\n   }\n   mpfr_float_backend(const mpfr_float_backend& o) : detail::mpfr_float_imp<0, allocate_dynamic>(o) {}\n   // rvalue copy\n   mpfr_float_backend(mpfr_float_backend&& o) noexcept : detail::mpfr_float_imp<0, allocate_dynamic>(static_cast<detail::mpfr_float_imp<0, allocate_dynamic>&&>(o))\n   {}\n   template <class V>\n   mpfr_float_backend(const V& o, unsigned digits10)\n       : detail::mpfr_float_imp<0, allocate_dynamic>(static_cast<unsigned>(multiprecision::detail::digits10_2_2(digits10)))\n   {\n      *this = o;\n   }\n#ifndef BOOST_NO_CXX17_HDR_STRING_VIEW\n   mpfr_float_backend(const std::string_view& o, unsigned digits10)\n       : detail::mpfr_float_imp<0, allocate_dynamic>(static_cast<unsigned>(multiprecision::detail::digits10_2_2(digits10)))\n   {\n      std::string s(o);\n      *this = s.c_str();\n   }\n#endif\n   template <unsigned D>\n   mpfr_float_backend(const gmp_float<D>& val, unsigned digits10)\n       : detail::mpfr_float_imp<0, allocate_dynamic>(static_cast<unsigned>(multiprecision::detail::digits10_2_2(digits10)))\n   {\n      mpfr_set_f(this->m_data, val.data(), GMP_RNDN);\n   }\n   template <unsigned D>\n   mpfr_float_backend(const mpfr_float_backend<D>& val, unsigned digits10)\n       : detail::mpfr_float_imp<0, allocate_dynamic>(static_cast<unsigned>(multiprecision::detail::digits10_2_2(digits10)))\n   {\n      mpfr_set(this->m_data, val.data(), GMP_RNDN);\n   }\n   template <unsigned D>\n   mpfr_float_backend(const mpfr_float_backend<D>& val)\n       : detail::mpfr_float_imp<0, allocate_dynamic>(preserve_related_precision() ? static_cast<unsigned>(mpfr_get_prec(val.data())) : static_cast<unsigned>(boost::multiprecision::detail::digits10_2_2(get_default_precision())))\n   {\n      mpfr_set(this->m_data, val.data(), GMP_RNDN);\n   }\n   template <unsigned D>\n   mpfr_float_backend(const gmp_float<D>& val)\n       : detail::mpfr_float_imp<0, allocate_dynamic>(preserve_all_precision() ? static_cast<unsigned>(mpf_get_prec(val.data())) : static_cast<unsigned>(boost::multiprecision::detail::digits10_2_2(get_default_precision())))\n   {\n      mpfr_set_f(this->m_data, val.data(), GMP_RNDN);\n   }\n   mpfr_float_backend(const gmp_int& val)\n       : detail::mpfr_float_imp<0, allocate_dynamic>(preserve_all_precision() ? static_cast<unsigned>(used_gmp_int_bits(val)) : static_cast<unsigned>(boost::multiprecision::detail::digits10_2_2(thread_default_precision())))\n   {\n      mpfr_set_z(this->m_data, val.data(), GMP_RNDN);\n   }\n   mpfr_float_backend(const gmp_rational& val)\n       : detail::mpfr_float_imp<0, allocate_dynamic>(preserve_all_precision() ? static_cast<unsigned>(used_gmp_rational_bits(val)) : static_cast<unsigned>(boost::multiprecision::detail::digits10_2_2(thread_default_precision())))\n   {\n      mpfr_set_q(this->m_data, val.data(), GMP_RNDN);\n   }\n\n   mpfr_float_backend& operator=(const mpfr_float_backend& o) = default;\n   // rvalue assign\n   mpfr_float_backend& operator=(mpfr_float_backend&& o) noexcept = default;\n\n   template <class V>\n   typename std::enable_if<std::is_assignable<detail::mpfr_float_imp<0, allocate_dynamic>, V>::value, mpfr_float_backend&>::type operator=(const V& v)\n   {\n      constexpr unsigned d10 = std::is_floating_point<V>::value ?\n         std::numeric_limits<V>::digits10 :\n         std::numeric_limits<V>::digits10 ? 1 + std::numeric_limits<V>::digits10 :\n         1 + boost::multiprecision::detail::digits2_2_10(std::numeric_limits<V>::digits);\n\n      if (thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision)\n      {\n         BOOST_IF_CONSTEXPR(std::is_floating_point<V>::value)\n         {\n            if (std::numeric_limits<V>::digits > mpfr_get_prec(this->data()))\n               mpfr_set_prec(this->data(), std::numeric_limits<V>::digits);\n         }\n         else\n         {\n            if(precision() < d10)\n               this->precision(d10);\n         }\n      }\n\n      *static_cast<detail::mpfr_float_imp<0, allocate_dynamic>*>(this) = v;\n      return *this;\n   }\n   mpfr_float_backend& operator=(const mpfr_t val)\n   {\n      if (this->m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(this->m_data, preserve_all_precision() ? static_cast<mpfr_prec_t>(mpfr_get_prec(val)) : static_cast<mpfr_prec_t>(boost::multiprecision::detail::digits10_2_2(get_default_precision())));\n      else if(preserve_all_precision())\n         mpfr_set_prec(this->m_data, mpfr_get_prec(val));\n      mpfr_set(this->m_data, val, GMP_RNDN);\n      return *this;\n   }\n   mpfr_float_backend& operator=(const mpf_t val)\n   {\n      if (this->m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(this->m_data, preserve_all_precision() ? static_cast<mpfr_prec_t>(mpf_get_prec(val)) : static_cast<mpfr_prec_t>(boost::multiprecision::detail::digits10_2_2(get_default_precision())));\n      else if(preserve_all_precision())\n         mpfr_set_prec(this->m_data, static_cast<mpfr_prec_t>(mpf_get_prec(val)));\n      mpfr_set_f(this->m_data, val, GMP_RNDN);\n      return *this;\n   }\n   mpfr_float_backend& operator=(const mpz_t val)\n   {\n      if (this->m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(this->m_data, static_cast<mpfr_prec_t>(multiprecision::detail::digits10_2_2(get_default_precision())));\n      mpfr_set_z(this->m_data, val, GMP_RNDN);\n      return *this;\n   }\n   mpfr_float_backend& operator=(const mpq_t val)\n   {\n      if (this->m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(this->m_data, static_cast<mpfr_prec_t>(multiprecision::detail::digits10_2_2(get_default_precision())));\n      mpfr_set_q(this->m_data, val, GMP_RNDN);\n      return *this;\n   }\n   template <unsigned D>\n   mpfr_float_backend& operator=(const mpfr_float_backend<D>& val)\n   {\n      if (this->m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(this->m_data, preserve_related_precision() ? static_cast<mpfr_prec_t>(mpfr_get_prec(val.data())) : boost::multiprecision::detail::digits10_2_2(get_default_precision()));\n      else if (preserve_related_precision())\n         mpfr_set_prec(this->m_data, mpfr_get_prec(val.data()));\n      mpfr_set(this->m_data, val.data(), GMP_RNDN);\n      return *this;\n   }\n   template <unsigned D>\n   mpfr_float_backend& operator=(const gmp_float<D>& val)\n   {\n      if (this->m_data[0]._mpfr_d == nullptr)\n         mpfr_init2(this->m_data, preserve_all_precision() ? static_cast<mpfr_prec_t>(mpf_get_prec(val.data())) : boost::multiprecision::detail::digits10_2_2(get_default_precision()));\n      else if (preserve_all_precision())\n         mpfr_set_prec(this->m_data, static_cast<mpfr_prec_t>(mpf_get_prec(val.data())));\n      mpfr_set_f(this->m_data, val.data(), GMP_RNDN);\n      return *this;\n   }\n   mpfr_float_backend& operator=(const gmp_int& val)\n   {\n      if (this->m_data[0]._mpfr_d == nullptr)\n      {\n         unsigned requested_precision = this->thread_default_precision();\n         if (thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision)\n         {\n            unsigned d2  = static_cast<unsigned>(used_gmp_int_bits(val));\n            unsigned d10 = static_cast<unsigned>(1ULL + multiprecision::detail::digits2_2_10(d2));\n            if (d10 > requested_precision)\n               requested_precision = d10;\n         }\n         mpfr_init2(this->m_data, static_cast<mpfr_prec_t>(multiprecision::detail::digits10_2_2(requested_precision)));\n      }\n      else if (thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision)\n      {\n         unsigned requested_precision = this->thread_default_precision();\n         unsigned d2  = static_cast<unsigned>(used_gmp_int_bits(val));\n         unsigned d10 = static_cast<unsigned>(1ULL + multiprecision::detail::digits2_2_10(d2));\n         if (d10 > requested_precision)\n            this->precision(d10);\n      }\n      mpfr_set_z(this->m_data, val.data(), GMP_RNDN);\n      return *this;\n   }\n   mpfr_float_backend& operator=(const gmp_rational& val)\n   {\n      if (this->m_data[0]._mpfr_d == nullptr)\n      {\n         unsigned requested_precision = this->get_default_precision();\n         if (thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision)\n         {\n            unsigned d10 = static_cast<unsigned>(1u + multiprecision::detail::digits2_2_10(used_gmp_rational_bits(val)));\n            if (d10 > requested_precision)\n               requested_precision = d10;\n         }\n         mpfr_init2(this->m_data, static_cast<mpfr_prec_t>(multiprecision::detail::digits10_2_2(requested_precision)));\n      }\n      else if (thread_default_variable_precision_options() >= variable_precision_options::preserve_all_precision)\n      {\n         unsigned requested_precision = this->get_default_precision();\n         unsigned d10 = static_cast<unsigned>(1u + multiprecision::detail::digits2_2_10(used_gmp_rational_bits(val)));\n         if (d10 > requested_precision)\n            this->precision(d10);\n      }\n      mpfr_set_q(this->m_data, val.data(), GMP_RNDN);\n      return *this;\n   }\n   static unsigned default_precision() noexcept\n   {\n      return get_global_default_precision();\n   }\n   static void default_precision(unsigned v) noexcept\n   {\n      get_global_default_precision() = v;\n   }\n   static unsigned thread_default_precision() noexcept\n   {\n      return get_default_precision();\n   }\n   static void thread_default_precision(unsigned v) noexcept\n   {\n      get_default_precision() = v;\n   }\n   unsigned precision() const noexcept\n   {\n      return static_cast<unsigned>(multiprecision::detail::digits2_2_10(static_cast<unsigned long>(mpfr_get_prec(this->m_data))));\n   }\n   void precision(unsigned digits10) noexcept\n   {\n      mpfr_prec_round(this->m_data, static_cast<mpfr_prec_t>(multiprecision::detail::digits10_2_2((digits10))), GMP_RNDN);\n   }\n   //\n   // Variable precision options:\n   //\n   static variable_precision_options default_variable_precision_options()noexcept\n   {\n      return get_global_default_options();\n   }\n   static variable_precision_options thread_default_variable_precision_options()noexcept\n   {\n      return get_default_options();\n   }\n   static void default_variable_precision_options(variable_precision_options opts)\n   {\n      get_global_default_options() = opts;\n   }\n   static void thread_default_variable_precision_options(variable_precision_options opts)\n   {\n      get_default_options() = opts;\n   }\n   static bool preserve_source_precision()\n   {\n      return get_default_options() >= variable_precision_options::preserve_source_precision;\n   }\n   static bool preserve_related_precision()\n   {\n      return get_default_options() >= variable_precision_options::preserve_related_precision;\n   }\n   static bool preserve_all_precision()\n   {\n      return get_default_options() >= variable_precision_options::preserve_all_precision;\n   }\n};\n\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType, class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_arithmetic<T>::value, bool>::type eval_eq(const mpfr_float_backend<digits10, AllocationType>& a, const T& b)\n{\n   return a.compare(b) == 0;\n}\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType, class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_arithmetic<T>::value, bool>::type eval_lt(const mpfr_float_backend<digits10, AllocationType>& a, const T& b)\n{\n   return a.compare(b) < 0;\n}\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType, class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_arithmetic<T>::value, bool>::type eval_gt(const mpfr_float_backend<digits10, AllocationType>& a, const T& b)\n{\n   return a.compare(b) > 0;\n}\n\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline bool eval_eq(const mpfr_float_backend<digits10, AllocationType>& a, const mpfr_float_backend<digits10, AllocationType>& b)noexcept\n{\n   return mpfr_equal_p(a.data(), b.data());\n}\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline bool eval_lt(const mpfr_float_backend<digits10, AllocationType>& a, const mpfr_float_backend<digits10, AllocationType>& b) noexcept\n{\n   return mpfr_less_p(a.data(), b.data());\n}\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline bool eval_gt(const mpfr_float_backend<digits10, AllocationType>& a, const mpfr_float_backend<digits10, AllocationType>& b) noexcept\n{\n   return mpfr_greater_p(a.data(), b.data());\n}\n\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2>\ninline void eval_add(mpfr_float_backend<D1, A1>& result, const mpfr_float_backend<D2, A2>& o)\n{\n   mpfr_add(result.data(), result.data(), o.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2>\ninline void eval_subtract(mpfr_float_backend<D1, A1>& result, const mpfr_float_backend<D2, A2>& o)\n{\n   mpfr_sub(result.data(), result.data(), o.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2>\ninline void eval_multiply(mpfr_float_backend<D1, A1>& result, const mpfr_float_backend<D2, A2>& o)\n{\n   if ((void*)&o == (void*)&result)\n      mpfr_sqr(result.data(), o.data(), GMP_RNDN);\n   else\n      mpfr_mul(result.data(), result.data(), o.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2>\ninline void eval_divide(mpfr_float_backend<D1, A1>& result, const mpfr_float_backend<D2, A2>& o)\n{\n   mpfr_div(result.data(), result.data(), o.data(), GMP_RNDN);\n}\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline void eval_add(mpfr_float_backend<digits10, AllocationType>& result, unsigned long i)\n{\n   mpfr_add_ui(result.data(), result.data(), i, GMP_RNDN);\n}\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline void eval_subtract(mpfr_float_backend<digits10, AllocationType>& result, unsigned long i)\n{\n   mpfr_sub_ui(result.data(), result.data(), i, GMP_RNDN);\n}\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline void eval_multiply(mpfr_float_backend<digits10, AllocationType>& result, unsigned long i)\n{\n   mpfr_mul_ui(result.data(), result.data(), i, GMP_RNDN);\n}\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline void eval_divide(mpfr_float_backend<digits10, AllocationType>& result, unsigned long i)\n{\n   mpfr_div_ui(result.data(), result.data(), i, GMP_RNDN);\n}\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline void eval_add(mpfr_float_backend<digits10, AllocationType>& result, long i)\n{\n   if (i > 0)\n      mpfr_add_ui(result.data(), result.data(), i, GMP_RNDN);\n   else\n      mpfr_sub_ui(result.data(), result.data(), boost::multiprecision::detail::unsigned_abs(i), GMP_RNDN);\n}\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline void eval_subtract(mpfr_float_backend<digits10, AllocationType>& result, long i)\n{\n   if (i > 0)\n      mpfr_sub_ui(result.data(), result.data(), static_cast<typename std::make_unsigned<long>::type>(i), GMP_RNDN);\n   else\n      mpfr_add_ui(result.data(), result.data(), boost::multiprecision::detail::unsigned_abs(i), GMP_RNDN);\n}\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline void eval_multiply(mpfr_float_backend<digits10, AllocationType>& result, long i)\n{\n   mpfr_mul_ui(result.data(), result.data(), boost::multiprecision::detail::unsigned_abs(i), GMP_RNDN);\n   if (i < 0)\n      mpfr_neg(result.data(), result.data(), GMP_RNDN);\n}\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline void eval_divide(mpfr_float_backend<digits10, AllocationType>& result, long i)\n{\n   mpfr_div_ui(result.data(), result.data(), boost::multiprecision::detail::unsigned_abs(i), GMP_RNDN);\n   if (i < 0)\n      mpfr_neg(result.data(), result.data(), GMP_RNDN);\n}\n//\n// Specialised 3 arg versions of the basic operators:\n//\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2, unsigned D3, mpfr_allocation_type A3>\ninline void eval_add(mpfr_float_backend<D1, A1>& a, const mpfr_float_backend<D2, A2>& x, const mpfr_float_backend<D3, A3>& y)\n{\n   mpfr_add(a.data(), x.data(), y.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2>\ninline void eval_add(mpfr_float_backend<D1, A1>& a, const mpfr_float_backend<D2, A2>& x, unsigned long y)\n{\n   mpfr_add_ui(a.data(), x.data(), y, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2>\ninline void eval_add(mpfr_float_backend<D1, A1>& a, const mpfr_float_backend<D2, A2>& x, long y)\n{\n   if (y < 0)\n      mpfr_sub_ui(a.data(), x.data(), boost::multiprecision::detail::unsigned_abs(y), GMP_RNDN);\n   else\n      mpfr_add_ui(a.data(), x.data(), y, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2>\ninline void eval_add(mpfr_float_backend<D1, A1>& a, unsigned long x, const mpfr_float_backend<D2, A2>& y)\n{\n   mpfr_add_ui(a.data(), y.data(), x, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2>\ninline void eval_add(mpfr_float_backend<D1, A1>& a, long x, const mpfr_float_backend<D2, A2>& y)\n{\n   if (x < 0)\n   {\n      mpfr_ui_sub(a.data(), boost::multiprecision::detail::unsigned_abs(x), y.data(), GMP_RNDN);\n      mpfr_neg(a.data(), a.data(), GMP_RNDN);\n   }\n   else\n      mpfr_add_ui(a.data(), y.data(), x, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2, unsigned D3, mpfr_allocation_type A3>\ninline void eval_subtract(mpfr_float_backend<D1, A1>& a, const mpfr_float_backend<D2, A2>& x, const mpfr_float_backend<D3, A3>& y)\n{\n   mpfr_sub(a.data(), x.data(), y.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2>\ninline void eval_subtract(mpfr_float_backend<D1, A1>& a, const mpfr_float_backend<D2, A2>& x, unsigned long y)\n{\n   mpfr_sub_ui(a.data(), x.data(), y, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2>\ninline void eval_subtract(mpfr_float_backend<D1, A1>& a, const mpfr_float_backend<D2, A2>& x, long y)\n{\n   if (y < 0)\n      mpfr_add_ui(a.data(), x.data(), boost::multiprecision::detail::unsigned_abs(y), GMP_RNDN);\n   else\n      mpfr_sub_ui(a.data(), x.data(), static_cast<typename std::make_unsigned<long>::type>(y), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2>\ninline void eval_subtract(mpfr_float_backend<D1, A1>& a, unsigned long x, const mpfr_float_backend<D2, A2>& y)\n{\n   mpfr_ui_sub(a.data(), x, y.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2>\ninline void eval_subtract(mpfr_float_backend<D1, A1>& a, long x, const mpfr_float_backend<D2, A2>& y)\n{\n   if (x < 0)\n   {\n      mpfr_add_ui(a.data(), y.data(), boost::multiprecision::detail::unsigned_abs(x), GMP_RNDN);\n      mpfr_neg(a.data(), a.data(), GMP_RNDN);\n   }\n   else\n      mpfr_ui_sub(a.data(), x, y.data(), GMP_RNDN);\n}\n\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2, unsigned D3, mpfr_allocation_type A3>\ninline void eval_multiply(mpfr_float_backend<D1, A1>& a, const mpfr_float_backend<D2, A2>& x, const mpfr_float_backend<D3, A3>& y)\n{\n   if ((void*)&x == (void*)&y)\n      mpfr_sqr(a.data(), x.data(), GMP_RNDN);\n   else\n      mpfr_mul(a.data(), x.data(), y.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2>\ninline void eval_multiply(mpfr_float_backend<D1, A1>& a, const mpfr_float_backend<D2, A2>& x, unsigned long y)\n{\n   mpfr_mul_ui(a.data(), x.data(), y, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2>\ninline void eval_multiply(mpfr_float_backend<D1, A1>& a, const mpfr_float_backend<D2, A2>& x, long y)\n{\n   if (y < 0)\n   {\n      mpfr_mul_ui(a.data(), x.data(), boost::multiprecision::detail::unsigned_abs(y), GMP_RNDN);\n      a.negate();\n   }\n   else\n      mpfr_mul_ui(a.data(), x.data(), y, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2>\ninline void eval_multiply(mpfr_float_backend<D1, A1>& a, unsigned long x, const mpfr_float_backend<D2, A2>& y)\n{\n   mpfr_mul_ui(a.data(), y.data(), x, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2>\ninline void eval_multiply(mpfr_float_backend<D1, A1>& a, long x, const mpfr_float_backend<D2, A2>& y)\n{\n   if (x < 0)\n   {\n      mpfr_mul_ui(a.data(), y.data(), boost::multiprecision::detail::unsigned_abs(x), GMP_RNDN);\n      mpfr_neg(a.data(), a.data(), GMP_RNDN);\n   }\n   else\n      mpfr_mul_ui(a.data(), y.data(), x, GMP_RNDN);\n}\n\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2, unsigned D3, mpfr_allocation_type A3>\ninline void eval_divide(mpfr_float_backend<D1, A1>& a, const mpfr_float_backend<D2, A2>& x, const mpfr_float_backend<D3, A3>& y)\n{\n   mpfr_div(a.data(), x.data(), y.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2>\ninline void eval_divide(mpfr_float_backend<D1, A1>& a, const mpfr_float_backend<D2, A2>& x, unsigned long y)\n{\n   mpfr_div_ui(a.data(), x.data(), y, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2>\ninline void eval_divide(mpfr_float_backend<D1, A1>& a, const mpfr_float_backend<D2, A2>& x, long y)\n{\n   if (y < 0)\n   {\n      mpfr_div_ui(a.data(), x.data(), boost::multiprecision::detail::unsigned_abs(y), GMP_RNDN);\n      a.negate();\n   }\n   else\n      mpfr_div_ui(a.data(), x.data(), y, GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2>\ninline void eval_divide(mpfr_float_backend<D1, A1>& a, unsigned long x, const mpfr_float_backend<D2, A2>& y)\n{\n   mpfr_ui_div(a.data(), x, y.data(), GMP_RNDN);\n}\ntemplate <unsigned D1, unsigned D2, mpfr_allocation_type A1, mpfr_allocation_type A2>\ninline void eval_divide(mpfr_float_backend<D1, A1>& a, long x, const mpfr_float_backend<D2, A2>& y)\n{\n   if (x < 0)\n   {\n      mpfr_ui_div(a.data(), boost::multiprecision::detail::unsigned_abs(x), y.data(), GMP_RNDN);\n      mpfr_neg(a.data(), a.data(), GMP_RNDN);\n   }\n   else\n      mpfr_ui_div(a.data(), x, y.data(), GMP_RNDN);\n}\n\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline bool eval_is_zero(const mpfr_float_backend<digits10, AllocationType>& val) noexcept\n{\n   return 0 != mpfr_zero_p(val.data());\n}\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline int eval_get_sign(const mpfr_float_backend<digits10, AllocationType>& val) noexcept\n{\n   return mpfr_sgn(val.data());\n}\n\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline void eval_convert_to(unsigned long* result, const mpfr_float_backend<digits10, AllocationType>& val)\n{\n   if (mpfr_nan_p(val.data()))\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Could not convert NaN to integer.\"));\n   }\n   *result = mpfr_get_ui(val.data(), GMP_RNDZ);\n}\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline void eval_convert_to(long* result, const mpfr_float_backend<digits10, AllocationType>& val)\n{\n   if (mpfr_nan_p(val.data()))\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Could not convert NaN to integer.\"));\n   }\n   *result = mpfr_get_si(val.data(), GMP_RNDZ);\n}\n#ifdef _MPFR_H_HAVE_INTMAX_T\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline void eval_convert_to(unsigned long long* result, const mpfr_float_backend<digits10, AllocationType>& val)\n{\n   if (mpfr_nan_p(val.data()))\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Could not convert NaN to integer.\"));\n   }\n   *result = mpfr_get_uj(val.data(), GMP_RNDZ);\n}\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline void eval_convert_to(long long* result, const mpfr_float_backend<digits10, AllocationType>& val)\n{\n   if (mpfr_nan_p(val.data()))\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Could not convert NaN to integer.\"));\n   }\n   *result = mpfr_get_sj(val.data(), GMP_RNDZ);\n}\n#endif\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline void eval_convert_to(float* result, const mpfr_float_backend<digits10, AllocationType>& val) noexcept\n{\n   *result = mpfr_get_flt(val.data(), GMP_RNDN);\n}\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline void eval_convert_to(double* result, const mpfr_float_backend<digits10, AllocationType>& val) noexcept\n{\n   *result = mpfr_get_d(val.data(), GMP_RNDN);\n}\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline void eval_convert_to(long double* result, const mpfr_float_backend<digits10, AllocationType>& val) noexcept\n{\n   *result = mpfr_get_ld(val.data(), GMP_RNDN);\n}\n\n#ifdef BOOST_HAS_INT128\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline void eval_convert_to(int128_type* result, const mpfr_float_backend<digits10, AllocationType>& val) noexcept\n{\n   gmp_int i;\n   mpfr_get_z(i.data(), val.data(), GMP_RNDN);\n   eval_convert_to(result, i);\n}\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline void eval_convert_to(uint128_type* result, const mpfr_float_backend<digits10, AllocationType>& val) noexcept\n{\n   gmp_int i;\n   mpfr_get_z(i.data(), val.data(), GMP_RNDN);\n   eval_convert_to(result, i);\n}\n#endif\n#if defined(BOOST_HAS_FLOAT128)\ntemplate <unsigned digits10, mpfr_allocation_type AllocationType>\ninline void eval_convert_to(float128_type* result, const mpfr_float_backend<digits10, AllocationType>& val) noexcept\n{\n   *result = float128_procs::strtoflt128(val.str(0, std::ios_base::scientific).c_str(), nullptr);\n}\n#endif\n\n//\n// Native non-member operations:\n//\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_sqrt(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& val)\n{\n   mpfr_sqrt(result.data(), val.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_abs(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& val)\n{\n   mpfr_abs(result.data(), val.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_fabs(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& val)\n{\n   mpfr_abs(result.data(), val.data(), GMP_RNDN);\n}\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_ceil(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& val)\n{\n   mpfr_ceil(result.data(), val.data());\n}\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_floor(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& val)\n{\n   mpfr_floor(result.data(), val.data());\n}\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_trunc(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& val)\n{\n   mpfr_trunc(result.data(), val.data());\n}\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_ldexp(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& val, long e)\n{\n   using local_uint_type = typename boost::multiprecision::detail::make_unsigned<long>::type;\n\n   if (e > 0)\n      mpfr_mul_2exp(result.data(), val.data(), static_cast<local_uint_type>(e), GMP_RNDN);\n   else if (e < 0)\n      mpfr_div_2exp(result.data(), val.data(), static_cast<local_uint_type>(-e), GMP_RNDN);\n   else\n      result = val;\n}\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_frexp(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& val, int* e)\n{\n   if (mpfr_zero_p(val.data()))\n   {\n      *e = 0;\n      result = val;\n      return;\n   }\n   mp_exp_t v = mpfr_get_exp(val.data());\n   *e = static_cast<int>(v);\n   if (v)\n      eval_ldexp(result, val, -v);\n   else\n      result = val;\n}\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_frexp(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& val, long* e)\n{\n   if (mpfr_zero_p(val.data()))\n   {\n      *e = 0;\n      result = val;\n      return;\n   }\n   mp_exp_t v = mpfr_get_exp(val.data());\n   *e = v;\n   if(v)\n      eval_ldexp(result, val, -v);\n   else\n      result = val;\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline int eval_fpclassify(const mpfr_float_backend<Digits10, AllocateType>& val) noexcept\n{\n   return mpfr_inf_p(val.data()) ? FP_INFINITE : mpfr_nan_p(val.data()) ? FP_NAN : mpfr_zero_p(val.data()) ? FP_ZERO : FP_NORMAL;\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_pow(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& b, const mpfr_float_backend<Digits10, AllocateType>& e)\n{\n   if (mpfr_zero_p(b.data()) && mpfr_integer_p(e.data()) && (mpfr_signbit(e.data()) == 0) && mpfr_fits_ulong_p(e.data(), GMP_RNDN) && (mpfr_get_ui(e.data(), GMP_RNDN) & 1))\n   {\n      mpfr_set(result.data(), b.data(), GMP_RNDN);\n   }\n   else\n      mpfr_pow(result.data(), b.data(), e.data(), GMP_RNDN);\n}\n\n#ifdef BOOST_MSVC\n//\n// The enable_if usage below doesn't work with msvc - but only when\n// certain other enable_if usages are defined first.  It's a capricious\n// and rather annoying compiler bug in other words....\n//\n#define BOOST_MP_ENABLE_IF_WORKAROUND (Digits10 || !Digits10)&&\n#else\n#define BOOST_MP_ENABLE_IF_WORKAROUND\n#endif\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType, class Integer>\ninline typename std::enable_if<boost::multiprecision::detail::is_signed<Integer>::value && boost::multiprecision::detail::is_integral<Integer>::value && (BOOST_MP_ENABLE_IF_WORKAROUND(sizeof(Integer) <= sizeof(long)))>::type\neval_pow(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& b, const Integer& e)\n{\n   mpfr_pow_si(result.data(), b.data(), e, GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType, class Integer>\ninline typename std::enable_if<boost::multiprecision::detail::is_unsigned<Integer>::value && (BOOST_MP_ENABLE_IF_WORKAROUND(sizeof(Integer) <= sizeof(long)))>::type\neval_pow(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& b, const Integer& e)\n{\n   mpfr_pow_ui(result.data(), b.data(), e, GMP_RNDN);\n}\n\n#undef BOOST_MP_ENABLE_IF_WORKAROUND\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_exp(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& arg)\n{\n   mpfr_exp(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_exp2(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& arg)\n{\n   mpfr_exp2(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_log(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& arg)\n{\n   mpfr_log(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_log10(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& arg)\n{\n   mpfr_log10(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_sin(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& arg)\n{\n   mpfr_sin(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_cos(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& arg)\n{\n   mpfr_cos(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_tan(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& arg)\n{\n   mpfr_tan(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_asin(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& arg)\n{\n   mpfr_asin(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_acos(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& arg)\n{\n   mpfr_acos(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_atan(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& arg)\n{\n   mpfr_atan(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_atan2(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& arg1, const mpfr_float_backend<Digits10, AllocateType>& arg2)\n{\n   mpfr_atan2(result.data(), arg1.data(), arg2.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_sinh(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& arg)\n{\n   mpfr_sinh(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_cosh(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& arg)\n{\n   mpfr_cosh(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_tanh(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& arg)\n{\n   mpfr_tanh(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_log2(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& arg)\n{\n   mpfr_log2(result.data(), arg.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_modf(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& arg, mpfr_float_backend<Digits10, AllocateType>* pipart)\n{\n   if (pipart == nullptr)\n   {\n      mpfr_float_backend<Digits10, AllocateType> ipart;\n      mpfr_modf(ipart.data(), result.data(), arg.data(), GMP_RNDN);\n   }\n   else\n   {\n      mpfr_modf(pipart->data(), result.data(), arg.data(), GMP_RNDN);\n   }\n}\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_remainder(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& a, const mpfr_float_backend<Digits10, AllocateType>& b)\n{\n   mpfr_remainder(result.data(), a.data(), b.data(), GMP_RNDN);\n}\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_remquo(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& a, const mpfr_float_backend<Digits10, AllocateType>& b, int* pi)\n{\n   long l;\n   mpfr_remquo(result.data(), &l, a.data(), b.data(), GMP_RNDN);\n   if (pi)\n      *pi = static_cast<int>(l);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_fmod(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& a, const mpfr_float_backend<Digits10, AllocateType>& b)\n{\n   mpfr_fmod(result.data(), a.data(), b.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_multiply_add(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& a, const mpfr_float_backend<Digits10, AllocateType>& b)\n{\n   mpfr_fma(result.data(), a.data(), b.data(), result.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_multiply_add(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& a, const mpfr_float_backend<Digits10, AllocateType>& b, const mpfr_float_backend<Digits10, AllocateType>& c)\n{\n   mpfr_fma(result.data(), a.data(), b.data(), c.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_multiply_subtract(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& a, const mpfr_float_backend<Digits10, AllocateType>& b)\n{\n   mpfr_fms(result.data(), a.data(), b.data(), result.data(), GMP_RNDN);\n   result.negate();\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline void eval_multiply_subtract(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& a, const mpfr_float_backend<Digits10, AllocateType>& b, const mpfr_float_backend<Digits10, AllocateType>& c)\n{\n   mpfr_fms(result.data(), a.data(), b.data(), c.data(), GMP_RNDN);\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline int eval_signbit BOOST_PREVENT_MACRO_SUBSTITUTION(const mpfr_float_backend<Digits10, AllocateType>& arg)\n{\n   return (arg.data()[0]._mpfr_sign < 0) ? 1 : 0;\n}\n\ntemplate <unsigned Digits10, mpfr_allocation_type AllocateType>\ninline std::size_t hash_value(const mpfr_float_backend<Digits10, AllocateType>& val)\n{\n   std::size_t result = 0;\n   std::size_t len    = val.data()[0]._mpfr_prec / mp_bits_per_limb;\n   if (val.data()[0]._mpfr_prec % mp_bits_per_limb)\n      ++len;\n   for (std::size_t i = 0; i < len; ++i)\n      boost::multiprecision::detail::hash_combine(result, val.data()[0]._mpfr_d[i]);\n   boost::multiprecision::detail::hash_combine(result, val.data()[0]._mpfr_exp, val.data()[0]._mpfr_sign);\n   return result;\n}\n\n} // namespace backends\n\nnamespace detail {\ntemplate <>\nstruct is_variable_precision<backends::mpfr_float_backend<0> > : public std::integral_constant<bool, true>\n{};\n} // namespace detail\n\ntemplate <>\nstruct number_category<detail::canonical<mpfr_t, backends::mpfr_float_backend<0> >::type> : public std::integral_constant<int, number_kind_floating_point>\n{};\n\ntemplate <unsigned D, boost::multiprecision::mpfr_allocation_type A1, boost::multiprecision::mpfr_allocation_type A2>\nstruct is_equivalent_number_type<backends::mpfr_float_backend<D, A1>, backends::mpfr_float_backend<D, A2> > : public std::integral_constant<bool, true> {};\n\nusing boost::multiprecision::backends::mpfr_float_backend;\n\nusing mpfr_float_50 = number<mpfr_float_backend<50> >  ;\nusing mpfr_float_100 = number<mpfr_float_backend<100> > ;\nusing mpfr_float_500 = number<mpfr_float_backend<500> > ;\nusing mpfr_float_1000 = number<mpfr_float_backend<1000> >;\nusing mpfr_float = number<mpfr_float_backend<0> >   ;\n\nusing static_mpfr_float_50 = number<mpfr_float_backend<50, allocate_stack> > ;\nusing static_mpfr_float_100 = number<mpfr_float_backend<100, allocate_stack> >;\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> copysign BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& a, const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& b)\n{\n   return (boost::multiprecision::signbit)(a) != (boost::multiprecision::signbit)(b) ? boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(-a) : a;\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> copysign BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& a, const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& b)\n{\n   return (boost::multiprecision::signbit)(a) != (boost::multiprecision::signbit)(b) ? boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>(-a) : a;\n}\n\n} // namespace multiprecision\n\nnamespace math {\n\nusing boost::multiprecision::copysign;\nusing boost::multiprecision::signbit;\n\nnamespace tools {\n\n#ifndef BOOST_MP_MATH_AVAILABLE\n\ntemplate <typename T>\ninline int digits();\n\ntemplate <typename T>\ninline T max_value();\n\ntemplate <typename T>\ninline T min_value();\n\n#endif\n\ninline void set_output_precision(const boost::multiprecision::mpfr_float& val, std::ostream& os)\n{\n   os << std::setprecision(static_cast<int>(val.precision()));\n}\n\ntemplate <>\ninline int digits<boost::multiprecision::mpfr_float>()\n#ifdef BOOST_MATH_NOEXCEPT\n    noexcept\n#endif\n{\n   return static_cast<int>(multiprecision::detail::digits10_2_2(boost::multiprecision::mpfr_float::thread_default_precision()));\n}\ntemplate <>\ninline int digits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off> >()\n#ifdef BOOST_MATH_NOEXCEPT\n    noexcept\n#endif\n{\n   return static_cast<int>(multiprecision::detail::digits10_2_2(boost::multiprecision::mpfr_float::thread_default_precision()));\n}\n\ntemplate <>\ninline boost::multiprecision::mpfr_float\nmax_value<boost::multiprecision::mpfr_float>()\n{\n   boost::multiprecision::mpfr_float result(0.5);\n   mpfr_mul_2exp(result.backend().data(), result.backend().data(), static_cast<typename std::make_unsigned<mpfr_exp_t>::type>(mpfr_get_emax()), GMP_RNDN);\n   BOOST_MP_ASSERT(mpfr_number_p(result.backend().data()));\n   return result;\n}\n\ntemplate <>\ninline boost::multiprecision::mpfr_float\nmin_value<boost::multiprecision::mpfr_float>()\n{\n   boost::multiprecision::mpfr_float result(0.5);\n   mpfr_div_2exp(result.backend().data(), result.backend().data(), static_cast<typename std::make_unsigned<mpfr_exp_t>::type>(-mpfr_get_emin()), GMP_RNDN);\n   BOOST_MP_ASSERT(mpfr_number_p(result.backend().data()));\n   return result;\n}\n\ntemplate <>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off>\nmax_value<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off> >()\n{\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off> result(0.5);\n   mpfr_mul_2exp(result.backend().data(), result.backend().data(), static_cast<typename std::make_unsigned<mpfr_exp_t>::type>(mpfr_get_emax()), GMP_RNDN);\n   BOOST_MP_ASSERT(mpfr_number_p(result.backend().data()));\n   return result;\n}\n\ntemplate <>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off>\nmin_value<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off> >()\n{\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off> result(0.5);\n   mpfr_div_2exp(result.backend().data(), result.backend().data(), static_cast<typename std::make_unsigned<mpfr_exp_t>::type>(-mpfr_get_emin()), GMP_RNDN);\n   BOOST_MP_ASSERT(mpfr_number_p(result.backend().data()));\n   return result;\n}\n//\n// Over again with debug_adaptor:\n//\ntemplate <>\ninline int digits<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float::backend_type> > >()\n#ifdef BOOST_MATH_NOEXCEPT\n    noexcept\n#endif\n{\n   return static_cast<int>(multiprecision::detail::digits10_2_2(boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float::backend_type> >::thread_default_precision()));\n}\ntemplate <>\ninline int digits<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<0> >, boost::multiprecision::et_off> >()\n#ifdef BOOST_MATH_NOEXCEPT\n    noexcept\n#endif\n{\n   return static_cast<int>(multiprecision::detail::digits10_2_2(boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float::backend_type> >::thread_default_precision()));\n}\n\ntemplate <>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float::backend_type> >\nmax_value<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float::backend_type> > >()\n{\n   return max_value<boost::multiprecision::mpfr_float>().backend();\n}\n\ntemplate <>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float::backend_type> >\nmin_value<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float::backend_type> > >()\n{\n   return min_value<boost::multiprecision::mpfr_float>().backend();\n}\n\ntemplate <>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<0> >, boost::multiprecision::et_off>\nmax_value<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<0> >, boost::multiprecision::et_off> >()\n{\n   return max_value<boost::multiprecision::mpfr_float>().backend();\n}\n\ntemplate <>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<0> >, boost::multiprecision::et_off>\nmin_value<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<0> >, boost::multiprecision::et_off> >()\n{\n   return min_value<boost::multiprecision::mpfr_float>().backend();\n}\n\n//\n// Over again with logged_adaptor:\n//\ntemplate <>\ninline int digits<boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float::backend_type> > >()\n#ifdef BOOST_MATH_NOEXCEPT\n    noexcept\n#endif\n{\n   return static_cast<int>(multiprecision::detail::digits10_2_2(boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float::backend_type> >::default_precision()));\n}\ntemplate <>\ninline int digits<boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<0> >, boost::multiprecision::et_off> >()\n#ifdef BOOST_MATH_NOEXCEPT\n    noexcept\n#endif\n{\n   return static_cast<int>(multiprecision::detail::digits10_2_2(boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float::backend_type> >::default_precision()));\n}\n\ntemplate <>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float::backend_type> >\nmax_value<boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float::backend_type> > >()\n{\n   return max_value<boost::multiprecision::mpfr_float>().backend();\n}\n\ntemplate <>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float::backend_type> >\nmin_value<boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float::backend_type> > >()\n{\n   return min_value<boost::multiprecision::mpfr_float>().backend();\n}\n\ntemplate <>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<0> >, boost::multiprecision::et_off>\nmax_value<boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<0> >, boost::multiprecision::et_off> >()\n{\n   return max_value<boost::multiprecision::mpfr_float>().backend();\n}\n\ntemplate <>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<0> >, boost::multiprecision::et_off>\nmin_value<boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<0> >, boost::multiprecision::et_off> >()\n{\n   return min_value<boost::multiprecision::mpfr_float>().backend();\n}\n\n} // namespace tools\n\nnamespace constants { namespace detail {\n\ntemplate <class T>\nstruct constant_pi;\ntemplate <class T>\nstruct constant_ln_two;\ntemplate <class T>\nstruct constant_euler;\ntemplate <class T>\nstruct constant_catalan;\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_pi<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // Rely on C++11 thread safe initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline const result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfr_const_pi(result.backend().data(), GMP_RNDN);\n      return result;\n   }\n};\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_ln_two<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // Rely on C++11 thread safe initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline const result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfr_const_log2(result.backend().data(), GMP_RNDN);\n      return result;\n   }\n};\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_euler<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // Rely on C++11 thread safe initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline const result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfr_const_euler(result.backend().data(), GMP_RNDN);\n      return result;\n   }\n};\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_catalan<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // Rely on C++11 thread safe initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline const result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfr_const_catalan(result.backend().data(), GMP_RNDN);\n      return result;\n   }\n};\n//\n// Over again with debug_adaptor:\n//\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_pi<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // Rely on C++11 thread safe initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline const result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfr_const_pi(result.backend().value().data(), GMP_RNDN);\n      result.backend().update_view();\n      return result;\n   }\n};\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_ln_two<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // Rely on C++11 thread safe initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline const result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfr_const_log2(result.backend().value().data(), GMP_RNDN);\n      result.backend().update_view();\n      return result;\n   }\n};\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_euler<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // Rely on C++11 thread safe initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline const result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfr_const_euler(result.backend().value().data(), GMP_RNDN);\n      result.backend().update_view();\n      return result;\n   }\n};\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_catalan<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // Rely on C++11 thread safe initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline const result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfr_const_catalan(result.backend().value().data(), GMP_RNDN);\n      result.backend().update_view();\n      return result;\n   }\n};\n\n//\n// Over again with logged_adaptor:\n//\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_pi<boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // C++11 thread safe static initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline const result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfr_const_pi(result.backend().value().data(), GMP_RNDN);\n      return result;\n   }\n};\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_ln_two<boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // C++11 thread safe static initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline const result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfr_const_log2(result.backend().value().data(), GMP_RNDN);\n      return result;\n   }\n};\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_euler<boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // C++11 thread safe static initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline const result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfr_const_euler(result.backend().value().data(), GMP_RNDN);\n      return result;\n   }\n};\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_catalan<boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> >\n{\n   using result_type = boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>;\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&)\n   {\n      // C++11 thread safe static initialization:\n      static result_type result{get(std::integral_constant<int, 0>())};\n      return result;\n   }\n   static inline const result_type get(const std::integral_constant<int, 0>&)\n   {\n      result_type result;\n      mpfr_const_catalan(result.backend().value().data(), GMP_RNDN);\n      return result;\n   }\n};\n\n}} // namespace constants::detail\n\n} // namespace math\n\nnamespace multiprecision {\n//\n// Overloaded special functions which call native mpfr routines:\n//\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> asinh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   mpfr_asinh(result.backend().data(), arg.backend().data(), GMP_RNDN);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> acosh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   mpfr_acosh(result.backend().data(), arg.backend().data(), GMP_RNDN);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> atanh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   mpfr_atanh(result.backend().data(), arg.backend().data(), GMP_RNDN);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   mpfr_cbrt(result.backend().data(), arg.backend().data(), GMP_RNDN);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> erf BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   mpfr_erf(result.backend().data(), arg.backend().data(), GMP_RNDN);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> erfc BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   mpfr_erfc(result.backend().data(), arg.backend().data(), GMP_RNDN);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   mpfr_expm1(result.backend().data(), arg.backend().data(), GMP_RNDN);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   mpfr_lngamma(result.backend().data(), arg.backend().data(), GMP_RNDN);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> tgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   mpfr_gamma(result.backend().data(), arg.backend().data(), GMP_RNDN);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> log1p BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   mpfr_log1p(result.backend().data(), arg.backend().data(), GMP_RNDN);\n   return result;\n}\n\n//\n// Over again with debug_adaptor:\n//\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> asinh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> result;\n   mpfr_asinh(result.backend().value().data(), arg.backend().value().data(), GMP_RNDN);\n   result.backend().update_view();\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> acosh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> result;\n   mpfr_acosh(result.backend().value().data(), arg.backend().value().data(), GMP_RNDN);\n   result.backend().update_view();\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> atanh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> result;\n   mpfr_atanh(result.backend().value().data(), arg.backend().value().data(), GMP_RNDN);\n   result.backend().update_view();\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> result;\n   mpfr_cbrt(result.backend().value().data(), arg.backend().value().data(), GMP_RNDN);\n   result.backend().update_view();\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> erf BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> result;\n   mpfr_erf(result.backend().value().data(), arg.backend().value().data(), GMP_RNDN);\n   result.backend().update_view();\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> erfc BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> result;\n   mpfr_erfc(result.backend().value().data(), arg.backend().value().data(), GMP_RNDN);\n   result.backend().update_view();\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> result;\n   mpfr_expm1(result.backend().value().data(), arg.backend().value().data(), GMP_RNDN);\n   result.backend().update_view();\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> result;\n   mpfr_lngamma(result.backend().value().data(), arg.backend().value().data(), GMP_RNDN);\n   result.backend().update_view();\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> tgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> result;\n   mpfr_gamma(result.backend().value().data(), arg.backend().value().data(), GMP_RNDN);\n   result.backend().update_view();\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> log1p BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> result;\n   mpfr_log1p(result.backend().value().data(), arg.backend().value().data(), GMP_RNDN);\n   result.backend().update_view();\n   return result;\n}\n\n//\n// Over again with logged_adaptor:\n//\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> asinh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> result;\n   mpfr_asinh(result.backend().value().data(), arg.backend().value().data(), GMP_RNDN);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> acosh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> result;\n   mpfr_acosh(result.backend().value().data(), arg.backend().value().data(), GMP_RNDN);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> atanh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> result;\n   mpfr_atanh(result.backend().value().data(), arg.backend().value().data(), GMP_RNDN);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> result;\n   mpfr_cbrt(result.backend().value().data(), arg.backend().value().data(), GMP_RNDN);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> erf BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> result;\n   mpfr_erf(result.backend().value().data(), arg.backend().value().data(), GMP_RNDN);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> erfc BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> result;\n   mpfr_erfc(result.backend().value().data(), arg.backend().value().data(), GMP_RNDN);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> result;\n   mpfr_expm1(result.backend().value().data(), arg.backend().value().data(), GMP_RNDN);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> result;\n   mpfr_lngamma(result.backend().value().data(), arg.backend().value().data(), GMP_RNDN);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> tgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> result;\n   mpfr_gamma(result.backend().value().data(), arg.backend().value().data(), GMP_RNDN);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> log1p BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   boost::multiprecision::detail::scoped_default_precision<number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> result;\n   mpfr_log1p(result.backend().value().data(), arg.backend().value().data(), GMP_RNDN);\n   return result;\n}\n\n} // namespace multiprecision\n\nnamespace math {\n//\n// Overloaded special functions which call native mpfr routines:\n//\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> asinh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg, const Policy&)\n{\n   boost::multiprecision::detail::scoped_default_precision<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   mpfr_asinh(result.backend().data(), arg.backend().data(), GMP_RNDN);\n   if (mpfr_inf_p(result.backend().data()))\n      return policies::raise_overflow_error<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >(\"asinh<%1%>(%1%)\", nullptr, Policy());\n   if (mpfr_nan_p(result.backend().data()))\n      return policies::raise_evaluation_error(\"asinh<%1%>(%1%)\", \"Unknown error, result is a NaN\", result, Policy());\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> asinh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   return asinh(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> acosh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg, const Policy&)\n{\n   boost::multiprecision::detail::scoped_default_precision<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   mpfr_acosh(result.backend().data(), arg.backend().data(), GMP_RNDN);\n   if (mpfr_inf_p(result.backend().data()))\n      return policies::raise_overflow_error<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >(\"acosh<%1%>(%1%)\", nullptr, Policy());\n   if (mpfr_nan_p(result.backend().data()))\n      return policies::raise_evaluation_error(\"acosh<%1%>(%1%)\", \"Unknown error, result is a NaN\", result, Policy());\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> acosh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   return acosh(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> atanh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg, const Policy& )\n{\n   boost::multiprecision::detail::scoped_default_precision<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   mpfr_atanh(result.backend().data(), arg.backend().data(), GMP_RNDN);\n   if (mpfr_inf_p(result.backend().data()))\n      return policies::raise_overflow_error<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >(\"atanh<%1%>(%1%)\", nullptr, Policy());\n   if (mpfr_nan_p(result.backend().data()))\n      return policies::raise_evaluation_error(\"atanh<%1%>(%1%)\", \"Unknown error, result is a NaN\", result, Policy());\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> atanh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   return atanh(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg, const Policy&)\n{\n   boost::multiprecision::detail::scoped_default_precision<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   mpfr_cbrt(result.backend().data(), arg.backend().data(), GMP_RNDN);\n   if (mpfr_inf_p(result.backend().data()))\n      return policies::raise_overflow_error<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >(\"cbrt<%1%>(%1%)\", nullptr, Policy());\n   if (mpfr_nan_p(result.backend().data()))\n      return policies::raise_evaluation_error(\"cbrt<%1%>(%1%)\", \"Unknown error, result is a NaN\", result, Policy());\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   return cbrt(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> erf BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg, const Policy& pol)\n{\n   boost::multiprecision::detail::scoped_default_precision<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   mpfr_erf(result.backend().data(), arg.backend().data(), GMP_RNDN);\n   if (mpfr_inf_p(result.backend().data()))\n      return policies::raise_overflow_error<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >(\"erf<%1%>(%1%)\", nullptr, pol);\n   if (mpfr_nan_p(result.backend().data()))\n      return policies::raise_evaluation_error(\"erf<%1%>(%1%)\", \"Unknown error, result is a NaN\", result, pol);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> erf BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   return erf(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> erfc BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg, const Policy& pol)\n{\n   boost::multiprecision::detail::scoped_default_precision<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   mpfr_erfc(result.backend().data(), arg.backend().data(), GMP_RNDN);\n   if (mpfr_inf_p(result.backend().data()))\n      return policies::raise_overflow_error<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >(\"erfc<%1%>(%1%)\", nullptr, pol);\n   if (mpfr_nan_p(result.backend().data()))\n      return policies::raise_evaluation_error(\"erfc<%1%>(%1%)\", \"Unknown error, result is a NaN\", result, pol);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> erfc BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   return erfc(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg, const Policy& pol)\n{\n   boost::multiprecision::detail::scoped_default_precision<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   mpfr_expm1(result.backend().data(), arg.backend().data(), GMP_RNDN);\n   if (mpfr_inf_p(result.backend().data()))\n      return policies::raise_overflow_error<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >(\"expm1<%1%>(%1%)\", nullptr, pol);\n   if (mpfr_nan_p(result.backend().data()))\n      return policies::raise_evaluation_error(\"expm1<%1%>(%1%)\", \"Unknown error, result is a NaN\", result, pol);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> exm1 BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   return expm1(arg, policies::policy<>());\n}\n\n#ifdef BOOST_MP_MATH_AVAILABLE\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> arg, int* sign, const Policy& pol)\n{\n   boost::multiprecision::detail::scoped_default_precision<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n   (void)precision_guard;  // warning suppression\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   if (arg > 0)\n   {\n      mpfr_lngamma(result.backend().data(), arg.backend().data(), GMP_RNDN);\n      if (sign)\n         *sign = 1;\n   }\n   else\n   {\n      if (floor(arg) == arg)\n         return policies::raise_pole_error<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >(\n             \"lgamma<%1%>\", \"Evaluation of lgamma at a negative integer %1%.\", arg, pol);\n\n      boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> t = detail::sinpx(arg);\n      arg                                                                                                                     = -arg;\n      if (t < 0)\n      {\n         t = -t;\n      }\n      result = boost::multiprecision::log(boost::math::constants::pi<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >()) - lgamma(arg, 0, pol) - boost::multiprecision::log(t);\n      if (sign)\n      {\n         boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> phase = 1 - arg;\n         phase                                                                                                                       = floor(phase) / 2;\n         if (floor(phase) == phase)\n            *sign = -1;\n         else\n            *sign = 1;\n      }\n   }\n   if (mpfr_inf_p(result.backend().data()))\n      return policies::raise_overflow_error<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >(\"lgamma<%1%>(%1%)\", nullptr, pol);\n   if (mpfr_nan_p(result.backend().data()))\n      return policies::raise_evaluation_error(\"lgamma<%1%>(%1%)\", \"Unknown error, result is a NaN\", result, pol);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg, int* sign)\n{\n   return lgamma(arg, sign, policies::policy<>());\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return lgamma(arg, 0, pol);\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   return lgamma(arg, 0, policies::policy<>());\n}\n#endif // BOOST_MP_MATH_AVAILABLE\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline typename std::enable_if<boost::math::policies::is_policy<Policy>::value, boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::type tgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg, const Policy& pol)\n{\n   boost::multiprecision::detail::scoped_default_precision<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   mpfr_gamma(result.backend().data(), arg.backend().data(), GMP_RNDN);\n   if (mpfr_inf_p(result.backend().data()))\n      return policies::raise_overflow_error<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >(\"tgamma<%1%>(%1%)\", nullptr, pol);\n   if (mpfr_nan_p(result.backend().data()))\n      return policies::raise_evaluation_error(\"tgamma<%1%>(%1%)\", \"Unknown error, result is a NaN\", result, pol);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> tgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   return tgamma(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> log1p BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg, const Policy& pol)\n{\n   boost::multiprecision::detail::scoped_default_precision<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   mpfr_log1p(result.backend().data(), arg.backend().data(), GMP_RNDN);\n   if (mpfr_inf_p(result.backend().data()))\n      return (arg == -1 ? -1 : 1) * policies::raise_overflow_error<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >(\"log1p<%1%>(%1%)\", nullptr, pol);\n   if (mpfr_nan_p(result.backend().data()))\n      return policies::raise_evaluation_error(\"log1p<%1%>(%1%)\", \"Unknown error, result is a NaN\", result, pol);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> log1p BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   return log1p(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> rsqrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg, const Policy& pol)\n{\n   boost::multiprecision::detail::scoped_default_precision<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);\n\n   boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;\n   mpfr_rec_sqrt(result.backend().data(), arg.backend().data(), GMP_RNDN);\n   if (mpfr_inf_p(result.backend().data()))\n      return policies::raise_overflow_error<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >(\"rsqrt<%1%>(%1%)\", nullptr, pol);\n   if (mpfr_nan_p(result.backend().data()))\n      return policies::raise_evaluation_error(\"rsqrt<%1%>(%1%)\", \"Negative argument, result is a NaN\", result, pol);\n   return result;\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> rsqrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)\n{\n   return rsqrt(arg, policies::policy<>());\n}\n\n//\n// Over again with debug_adaptor:\n//\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> asinh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return asinh(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> asinh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return asinh(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> acosh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return acosh(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> acosh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return acosh(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> atanh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return atanh(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> atanh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return atanh(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return cbrt(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return cbrt(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> erf BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return erf(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> erf BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return erf(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> erfc BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return erfc(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> erfc BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return erfc(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return expm1(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> exm1 BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return expm1(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> arg, int* sign, const Policy& pol)\n{\n   return lgamma(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), sign, pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, int* sign)\n{\n   return lgamma(arg, sign, policies::policy<>());\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return lgamma(arg, 0, pol);\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return lgamma(arg, 0, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline typename std::enable_if<boost::math::policies::is_policy<Policy>::value, boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> >::type tgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return tgamma(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> tgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return tgamma(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> log1p BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return log1p(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> log1p BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return log1p(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> rsqrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return rsqrt(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> rsqrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return rsqrt(arg, policies::policy<>());\n}\n\n//\n// Over again with logged_adaptor:\n//\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> asinh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return asinh(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> asinh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return asinh(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> acosh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return acosh(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> acosh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return acosh(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> atanh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return atanh(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> atanh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return atanh(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return cbrt(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return cbrt(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> erf BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return erf(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> erf BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return erf(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> erfc BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return erfc(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> erfc BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return erfc(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return expm1(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> exm1 BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return expm1(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> arg, int* sign, const Policy& pol)\n{\n   return lgamma(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), sign, pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, int* sign)\n{\n   return lgamma(arg, sign, policies::policy<>());\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return lgamma(arg, 0, pol);\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return lgamma(arg, 0, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline typename std::enable_if<boost::math::policies::is_policy<Policy>::value, boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> >::type tgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return tgamma(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> tgamma BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return tgamma(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> log1p BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return log1p(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> log1p BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return log1p(arg, policies::policy<>());\n}\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates, class Policy>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> rsqrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg, const Policy& pol)\n{\n   return rsqrt(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>(arg.backend().value()), pol).backend();\n}\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\ninline boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates> rsqrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>& arg)\n{\n   return rsqrt(arg, policies::policy<>());\n}\n\n} // namespace math\n\n} // namespace boost\n\nnamespace Eigen\n{\n\n   template <class B1, class B2>\n   struct NumTraitsImp;\n\n   template <boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\n   struct NumTraitsImp<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0, AllocateType>, ExpressionTemplates>, boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0, AllocateType>, ExpressionTemplates>>\n   {\n      using self_type = boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0, AllocateType>, ExpressionTemplates>;\n      using Real = typename boost::multiprecision::scalar_result_from_possible_complex<self_type>::type;\n      using NonInteger = self_type; // Not correct but we can't do much better??\n      using Literal = double;\n      using Nested = self_type;\n      enum\n      {\n         IsComplex = boost::multiprecision::number_category<self_type>::value == boost::multiprecision::number_kind_complex,\n         IsInteger = boost::multiprecision::number_category<self_type>::value == boost::multiprecision::number_kind_integer,\n         ReadCost = 1,\n         AddCost = 4,\n         MulCost = 8,\n         IsSigned = std::numeric_limits<self_type>::is_specialized ? std::numeric_limits<self_type>::is_signed : true,\n         RequireInitialization = 1,\n      };\n      static Real epsilon()\n      {\n         #ifdef BOOST_MP_MATH_AVAILABLE\n         return boost::math::tools::epsilon< boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0, AllocateType>, ExpressionTemplates>>();\n         #else\n         self_type result{1};\n         mpfr_div_2exp(result.backend().data(), result.backend().data(), std::numeric_limits<self_type>::digits - 1, GMP_RNDN);\n         return result;\n         #endif\n      }\n      static Real dummy_precision()\n      {\n         return 1000 * epsilon();\n      }\n      static Real highest()\n      {\n         #ifdef BOOST_MP_MATH_AVAILABLE\n         return boost::math::tools::max_value<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0, AllocateType>, ExpressionTemplates>>();\n         #else\n         self_type value(0.5);\n         mpfr_mul_2exp(value.backend().data(), value.backend().data(), mpfr_get_emax(), GMP_RNDN);\n         return value;\n         #endif\n      }\n      static Real lowest()\n      {\n         #ifdef BOOST_MP_MATH_AVAILABLE\n         return boost::math::tools::min_value<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0, AllocateType>, ExpressionTemplates>>();\n         #else\n         return -(highest)();\n         #endif\n      }\n      static int digits10()\n      {\n         return Real::thread_default_precision();\n      }\n      static int digits()\n      {\n         return boost::math::tools::digits<Real>();\n      }\n      static int min_exponent()\n      {\n         return static_cast<int>(mpfr_get_emin());\n      }\n      static int max_exponent()\n      {\n         return static_cast<int>(mpfr_get_emax());\n      }\n      static Real infinity()\n      {\n         return std::numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<50, AllocateType>, ExpressionTemplates>>::infinity();\n      }\n      static Real quiet_NaN()\n      {\n         return std::numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<50, AllocateType>, ExpressionTemplates>>::quiet_NaN();\n      }\n   };\n\n}\n\nnamespace std {\n\n//\n// numeric_limits [partial] specializations for the types declared in this header:\n//\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nclass numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >\n{\n   using number_type = boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>;\n\n   static number_type get_min()\n   {\n      number_type result{0.5};\n      mpfr_div_2exp(result.backend().data(), result.backend().data(), -mpfr_get_emin(), GMP_RNDN);\n      return result;\n   }\n   static number_type get_max()\n   {\n      number_type result{0.5};\n      mpfr_mul_2exp(result.backend().data(), result.backend().data(), mpfr_get_emax(), GMP_RNDN);\n      return result;\n   }\n   static number_type get_eps()\n   {\n      number_type result{1};\n      mpfr_div_2exp(result.backend().data(), result.backend().data(), std::numeric_limits<number_type>::digits - 1, GMP_RNDN);\n      return result;\n   }\n\n public:\n   static constexpr bool is_specialized = true;\n   static number_type(min)()\n   {\n      static number_type value{get_min()};\n      return value;\n   }\n   static number_type(max)()\n   {\n      static number_type value{get_max()};\n      return value;\n   }\n   static constexpr number_type lowest()\n   {\n      return -(max)();\n   }\n   static constexpr int digits   = static_cast<int>((Digits10 * 1000L) / 301L + ((Digits10 * 1000L) % 301 ? 2 : 1));\n   static constexpr int digits10 = Digits10;\n   // Is this really correct???\n   static constexpr int  max_digits10 = static_cast<int>(boost::multiprecision::detail::calc_max_digits10<static_cast<unsigned>(digits)>::value);\n   static constexpr bool is_signed    = true;\n   static constexpr bool is_integer   = false;\n   static constexpr bool is_exact     = false;\n   static constexpr int  radix        = 2;\n   static number_type          epsilon()\n   {\n      static number_type value{get_eps()};\n      return value;\n   }\n   // What value should this be????\n   static number_type round_error()\n   {\n      // returns epsilon/2\n      return 0.5;\n   }\n   static constexpr long min_exponent                  = MPFR_EMIN_DEFAULT;\n   static constexpr long min_exponent10                = (MPFR_EMIN_DEFAULT / 1000) * 301L;\n   static constexpr long max_exponent                  = MPFR_EMAX_DEFAULT;\n   static constexpr long max_exponent10                = (MPFR_EMAX_DEFAULT / 1000) * 301L;\n   static constexpr bool has_infinity                  = true;\n   static constexpr bool has_quiet_NaN                 = true;\n   static constexpr bool has_signaling_NaN             = false;\n   static constexpr float_denorm_style has_denorm      = denorm_absent;\n   static constexpr bool               has_denorm_loss = false;\n   static number_type                        infinity()\n   {\n      number_type value;\n      mpfr_set_inf(value.backend().data(), 1);\n      return value;\n   }\n   static number_type quiet_NaN()\n   {\n      number_type value;\n      mpfr_set_nan(value.backend().data());\n      return value;\n   }\n   static constexpr number_type signaling_NaN()\n   {\n      return number_type(0);\n   }\n   static constexpr number_type denorm_min() { return number_type(0); }\n   static constexpr bool        is_iec559         = false;\n   static constexpr bool        is_bounded        = true;\n   static constexpr bool        is_modulo         = false;\n   static constexpr bool        traps             = true;\n   static constexpr bool        tinyness_before   = false;\n   static constexpr float_round_style round_style = round_to_nearest;\n};\n\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::digits;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::digits10;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::max_digits10;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::is_signed;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::is_integer;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::is_exact;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::radix;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr long numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::min_exponent;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr long numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::min_exponent10;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr long numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::max_exponent;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr long numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::max_exponent10;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::has_infinity;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::has_quiet_NaN;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::has_signaling_NaN;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_denorm_style numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::has_denorm;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::has_denorm_loss;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::is_iec559;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::is_bounded;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::is_modulo;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::traps;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::tinyness_before;\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_round_style numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >::round_style;\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nclass numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >\n{\n   using number_type = boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates>;\n\n public:\n   static constexpr bool is_specialized = false;\n   static number_type(min)()\n   {\n      number_type value(0.5);\n      mpfr_div_2exp(value.backend().data(), value.backend().data(), -mpfr_get_emin(), GMP_RNDN);\n      return value;\n   }\n   static number_type(max)()\n   {\n      number_type value(0.5);\n      mpfr_mul_2exp(value.backend().data(), value.backend().data(), mpfr_get_emax(), GMP_RNDN);\n      return value;\n   }\n   static number_type lowest()\n   {\n      return -(max)();\n   }\n   static constexpr int  digits       = INT_MAX;\n   static constexpr int  digits10     = INT_MAX;\n   static constexpr int  max_digits10 = INT_MAX;\n   static constexpr bool is_signed    = true;\n   static constexpr bool is_integer   = false;\n   static constexpr bool is_exact     = false;\n   static constexpr int  radix        = 2;\n   static number_type          epsilon()\n   {\n      number_type value(1);\n      mpfr_div_2exp(value.backend().data(), value.backend().data(), boost::multiprecision::detail::digits10_2_2(number_type::thread_default_precision()) - 1, GMP_RNDN);\n      return value;\n   }\n   static number_type round_error()\n   {\n      return 0.5;\n   }\n   static constexpr long min_exponent                  = MPFR_EMIN_DEFAULT;\n   static constexpr long min_exponent10                = (MPFR_EMIN_DEFAULT / 1000) * 301L;\n   static constexpr long max_exponent                  = MPFR_EMAX_DEFAULT;\n   static constexpr long max_exponent10                = (MPFR_EMAX_DEFAULT / 1000) * 301L;\n   static constexpr bool has_infinity                  = true;\n   static constexpr bool has_quiet_NaN                 = true;\n   static constexpr bool has_signaling_NaN             = false;\n   static constexpr float_denorm_style has_denorm      = denorm_absent;\n   static constexpr bool               has_denorm_loss = false;\n   static number_type                        infinity()\n   {\n      number_type value;\n      mpfr_set_inf(value.backend().data(), 1);\n      return value;\n   }\n   static number_type quiet_NaN()\n   {\n      number_type value;\n      mpfr_set_nan(value.backend().data());\n      return value;\n   }\n   static number_type          signaling_NaN() { return number_type(0); }\n   static number_type          denorm_min() { return number_type(0); }\n   static constexpr bool is_iec559                = false;\n   static constexpr bool is_bounded               = true;\n   static constexpr bool is_modulo                = false;\n   static constexpr bool traps                    = false;\n   static constexpr bool tinyness_before          = false;\n   static constexpr float_round_style round_style = round_toward_zero;\n};\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::digits;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::digits10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::max_digits10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::is_signed;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::is_integer;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::is_exact;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::radix;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr long numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::min_exponent;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr long numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::min_exponent10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr long numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::max_exponent;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr long numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::max_exponent10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::has_infinity;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::has_quiet_NaN;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::has_signaling_NaN;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_denorm_style numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::has_denorm;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::has_denorm_loss;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::is_iec559;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::is_bounded;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::is_modulo;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::traps;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::tinyness_before;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_round_style numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, ExpressionTemplates> >::round_style;\n\n} // namespace std\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/number.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_NUMBER_HPP\n#define BOOST_MP_NUMBER_HPP\n\n#include <cstdint>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/detail/precision.hpp>\n#include <boost/multiprecision/detail/generic_interconvert.hpp>\n#include <boost/multiprecision/detail/number_compare.hpp>\n#include <boost/multiprecision/traits/is_restricted_conversion.hpp>\n#include <boost/multiprecision/traits/is_complex.hpp>\n#include <boost/multiprecision/traits/is_convertible_arithmetic.hpp>\n#include <boost/multiprecision/detail/hash.hpp>\n#include <boost/multiprecision/detail/number_base.hpp>\n#include <istream> // stream operators\n#include <cstdio>  // EOF\n#include <cctype>  // isspace\n#include <functional>  // std::hash\n#include <type_traits>\n#ifndef BOOST_NO_CXX17_HDR_STRING_VIEW\n#include <string_view>\n#endif\n\n#ifndef BOOST_MP_STANDALONE\n#include <boost/core/nvp.hpp>\n#endif\n\nnamespace boost {\nnamespace multiprecision {\n\n#ifdef BOOST_MSVC\n// warning C4127: conditional expression is constant\n// warning C4714: function marked as __forceinline not inlined\n#pragma warning(push)\n#pragma warning(disable : 4127 4714 6326)\n#endif\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\nclass number\n{\n   using self_type = number<Backend, ExpressionTemplates>;\n\n public:\n   using backend_type = Backend                                 ;\n   using value_type = typename component_type<self_type>::type;\n\n   static constexpr expression_template_option et = ExpressionTemplates;\n\n   BOOST_MP_FORCEINLINE constexpr number() noexcept(noexcept(Backend())) {}\n   BOOST_MP_FORCEINLINE constexpr number(const number& e) noexcept(noexcept(Backend(std::declval<Backend const&>()))) : m_backend(e.m_backend) {}\n   template <class V>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number(const V& v, \n      typename std::enable_if<\n      (boost::multiprecision::detail::is_convertible_arithmetic<V, Backend>::value \n            || std::is_same<std::string, V>::value \n            || std::is_convertible<V, const char*>::value) \n      && !std::is_convertible<typename detail::canonical<V, Backend>::type, Backend>::value \n      && !detail::is_restricted_conversion<typename detail::canonical<V, Backend>::type, Backend>::value>::type* = nullptr)\n   {\n      m_backend = canonical_value(v);\n   }\n   template <class V>\n   BOOST_MP_FORCEINLINE constexpr number(const V& v, typename std::enable_if<\n                                                         std::is_convertible<typename detail::canonical<V, Backend>::type, Backend>::value && !detail::is_restricted_conversion<typename detail::canonical<V, Backend>::type, Backend>::value>::type* = nullptr)\n#ifndef BOOST_INTEL\n       noexcept(noexcept(Backend(std::declval<typename detail::canonical<V, Backend>::type const&>())))\n#endif\n       : m_backend(canonical_value(v))\n   {}\n   template <class V, class U>\n   BOOST_MP_FORCEINLINE constexpr number(const V& v, U digits10, \n      typename std::enable_if<\n      (boost::multiprecision::detail::is_convertible_arithmetic<V, Backend>::value \n         || std::is_same<std::string, V>::value \n         || std::is_convertible<V, const char*>::value) \n      && !detail::is_restricted_conversion<typename detail::canonical<V, Backend>::type, Backend>::value \n      && (boost::multiprecision::number_category<Backend>::value != boost::multiprecision::number_kind_complex) \n      && (boost::multiprecision::number_category<Backend>::value != boost::multiprecision::number_kind_rational)\n      && std::is_same<self_type, value_type>::value\n      && std::is_integral<U>::value\n      && (std::numeric_limits<U>::digits <= std::numeric_limits<unsigned>::digits)\n      && std::is_constructible<Backend, typename detail::canonical<V, Backend>::type const&, unsigned>::value>::type* = nullptr)\n       : m_backend(canonical_value(v), static_cast<unsigned>(digits10))\n   {}\n   //\n   // Conversions from unscoped enum's are implicit:\n   //\n   template <class V>\n   BOOST_MP_FORCEINLINE \n#if !(defined(BOOST_MSVC) && (BOOST_MSVC <= 1900))\n      constexpr \n#endif\n      number(const V& v, typename std::enable_if<\n      std::is_enum<V>::value && std::is_convertible<V, int>::value && !std::is_convertible<typename detail::canonical<V, Backend>::type, Backend>::value && !detail::is_restricted_conversion<typename detail::canonical<V, Backend>::type, Backend>::value>::type* = nullptr)\n      : number(static_cast<typename std::underlying_type<V>::type>(v))\n   {}\n   //\n   // Conversions from scoped enum's are explicit:\n   //\n   template <class V>\n   BOOST_MP_FORCEINLINE explicit \n#if !(defined(BOOST_MSVC) && (BOOST_MSVC <= 1900))\n       constexpr\n#endif\n       number(const V& v, typename std::enable_if<\n      std::is_enum<V>::value && !std::is_convertible<V, int>::value && !std::is_convertible<typename detail::canonical<V, Backend>::type, Backend>::value && !detail::is_restricted_conversion<typename detail::canonical<V, Backend>::type, Backend>::value>::type* = nullptr)\n      : number(static_cast<typename std::underlying_type<V>::type>(v))\n   {}\n\n   template <class U>\n   BOOST_MP_FORCEINLINE constexpr number(const number& e, U digits10, typename std::enable_if<std::is_constructible<Backend, const Backend&, unsigned>::value && std::is_integral<U>::value && (std::numeric_limits<U>::digits <= std::numeric_limits<unsigned>::digits)>::type* = nullptr)\n       noexcept(noexcept(Backend(std::declval<Backend const&>(), std::declval<unsigned>())))\n       : m_backend(e.m_backend, static_cast<unsigned>(digits10)) {}\n   template <class V>\n   explicit BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number(const V& v, typename std::enable_if<\n                                                                                 (boost::multiprecision::detail::is_arithmetic<V>::value || std::is_same<std::string, V>::value || std::is_convertible<V, const char*>::value) && !detail::is_explicitly_convertible<typename detail::canonical<V, Backend>::type, Backend>::value && detail::is_restricted_conversion<typename detail::canonical<V, Backend>::type, Backend>::value>::type* = nullptr)\n       noexcept(noexcept(std::declval<Backend&>() = std::declval<typename detail::canonical<V, Backend>::type const&>()))\n   {\n      m_backend = canonical_value(v);\n   }\n   template <class V>\n   explicit BOOST_MP_FORCEINLINE constexpr number(const V& v, typename std::enable_if<\n                                                                  detail::is_explicitly_convertible<typename detail::canonical<V, Backend>::type, Backend>::value && (detail::is_restricted_conversion<typename detail::canonical<V, Backend>::type, Backend>::value || !std::is_convertible<typename detail::canonical<V, Backend>::type, Backend>::value)>::type* = nullptr)\n       noexcept(noexcept(Backend(std::declval<typename detail::canonical<V, Backend>::type const&>())))\n       : m_backend(canonical_value(v)) {}\n   template <class V>\n   explicit BOOST_MP_FORCEINLINE constexpr number(const V& v, unsigned digits10, typename std::enable_if<(boost::multiprecision::detail::is_arithmetic<V>::value || std::is_same<std::string, V>::value || std::is_convertible<V, const char*>::value) && detail::is_restricted_conversion<typename detail::canonical<V, Backend>::type, Backend>::value && (boost::multiprecision::number_category<Backend>::value != boost::multiprecision::number_kind_complex) && (boost::multiprecision::number_category<Backend>::value != boost::multiprecision::number_kind_rational)>::type* = nullptr)\n       : m_backend(canonical_value(v), digits10) {}\n\n   template <expression_template_option ET>\n   BOOST_MP_FORCEINLINE constexpr number(const number<Backend, ET>& val)\n       noexcept(noexcept(Backend(std::declval<Backend const&>()))) : m_backend(val.backend()) {}\n\n   template <class Other, expression_template_option ET>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number(const number<Other, ET>& val,\n                                                        typename std::enable_if<(std::is_convertible<Other, Backend>::value && !detail::is_restricted_conversion<Other, Backend>::value)>::type* = nullptr)\n       noexcept(noexcept(Backend(std::declval<Other const&>())))\n       : m_backend(val.backend()) {}\n\n   template <class Other, expression_template_option ET>\n   explicit BOOST_MP_CXX14_CONSTEXPR number(const number<Other, ET>& val, typename std::enable_if<\n                                                     (!detail::is_explicitly_convertible<Other, Backend>::value)>::type* = nullptr)\n   {\n      //\n      // Attempt a generic interconvertion:\n      //\n      detail::scoped_default_precision<number<Backend, ExpressionTemplates> > precision_guard_1(val);\n      detail::scoped_default_precision<number<Other, ET> >                    precision_guard_2(val);\n      using detail::generic_interconvert;\n      BOOST_MP_CONSTEXPR_IF_VARIABLE_PRECISION(number)\n      {\n         if (precision_guard_1.precision() != boost::multiprecision::detail::current_precision_of<self_type>(*this))\n         {\n            self_type t;\n            generic_interconvert(t.backend(), val.backend(), number_category<Backend>(), number_category<Other>());\n            *this = std::move(t);\n            return;\n         }\n      }\n      generic_interconvert(backend(), val.backend(), number_category<Backend>(), number_category<Other>());\n   }\n   template <class Other, expression_template_option ET>\n   explicit BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number(const number<Other, ET>& val, typename std::enable_if<\n                                                                                                   (detail::is_explicitly_convertible<Other, Backend>::value && (detail::is_restricted_conversion<Other, Backend>::value || !std::is_convertible<Other, Backend>::value))>::type* = nullptr) noexcept(noexcept(Backend(std::declval<Other const&>())))\n       : m_backend(val.backend()) {}\n\n   template <class V, class U>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number(const V& v1, const U& v2,\n      typename std::enable_if<\n         (std::is_convertible<V, value_type>::value\n            && std::is_convertible<U, value_type>::value\n            && !std::is_same<value_type, self_type>::value\n            && std::is_constructible<Backend, typename detail::canonical<typename std::remove_cv<typename std::remove_reference<decltype(detail::evaluate_if_expression(std::declval<const V&>()))>::type>::type, Backend>::type const&, typename detail::canonical<typename std::remove_cv<typename std::remove_reference<decltype(detail::evaluate_if_expression(std::declval<const U&>()))>::type>::type, Backend>::type const&>::value\n            && !boost::multiprecision::detail::is_variable_precision<Backend>::value)>::type* = nullptr)\n      : m_backend(canonical_value(detail::evaluate_if_expression(v1)), canonical_value(detail::evaluate_if_expression(v2)))\n   {\n   }\n   template <class V, class U>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number(V&& v1, const U& v2,\n      typename std::enable_if<\n         (std::is_convertible<V, value_type>::value\n            && std::is_convertible<U, value_type>::value\n            && !std::is_same<value_type, self_type>::value\n            && std::is_constructible<Backend, typename detail::canonical<typename std::remove_cv<typename std::remove_reference<decltype(detail::evaluate_if_expression(std::declval<const V&>()))>::type>::type, Backend>::type const&, typename detail::canonical<typename std::remove_cv<typename std::remove_reference<decltype(detail::evaluate_if_expression(std::declval<const U&>()))>::type>::type, Backend>::type const&>::value\n            && !boost::multiprecision::detail::is_variable_precision<Backend>::value)>::type* = nullptr)\n      : m_backend(canonical_value(detail::evaluate_if_expression(static_cast<V&&>(v1))), canonical_value(detail::evaluate_if_expression(v2)))\n   {\n   }\n   template <class V, class U>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number(const V& v1, U&& v2,\n      typename std::enable_if<\n      (std::is_convertible<V, value_type>::value\n         && std::is_convertible<U, value_type>::value\n         && !std::is_same<value_type, self_type>::value\n         && std::is_constructible<Backend, typename detail::canonical<typename std::remove_cv<typename std::remove_reference<decltype(detail::evaluate_if_expression(std::declval<const V&>()))>::type>::type, Backend>::type const&, typename detail::canonical<typename std::remove_cv<typename std::remove_reference<decltype(detail::evaluate_if_expression(std::declval<const U&>()))>::type>::type, Backend>::type const&>::value\n         && !boost::multiprecision::detail::is_variable_precision<Backend>::value)>::type* = nullptr)\n      : m_backend(canonical_value(detail::evaluate_if_expression(v1)), canonical_value(detail::evaluate_if_expression(static_cast<U&&>(v2))))\n   {\n   }\n   template <class V, class U>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number(V&& v1, U&& v2,\n      typename std::enable_if<\n      (std::is_convertible<V, value_type>::value\n         && std::is_convertible<U, value_type>::value\n         && !std::is_same<value_type, self_type>::value\n         && std::is_constructible<Backend, typename detail::canonical<typename std::remove_cv<typename std::remove_reference<decltype(detail::evaluate_if_expression(std::declval<const V&>()))>::type>::type, Backend>::type const&, typename detail::canonical<typename std::remove_cv<typename std::remove_reference<decltype(detail::evaluate_if_expression(std::declval<const U&>()))>::type>::type, Backend>::type const&>::value\n         && !boost::multiprecision::detail::is_variable_precision<Backend>::value)>::type* = nullptr)\n      : m_backend(canonical_value(detail::evaluate_if_expression(static_cast<V&&>(v1))), canonical_value(detail::evaluate_if_expression(static_cast<U&&>(v2))))\n   {\n   }\n   template <class V, class U>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number(const V& v1, const U& v2,\n      typename std::enable_if<\n         (std::is_convertible<V, value_type>::value \n            && std::is_convertible<U, value_type>::value \n            && !std::is_same<value_type, self_type>::value\n            && (!std::is_constructible<Backend, typename detail::canonical<typename std::remove_cv<typename std::remove_reference<decltype(detail::evaluate_if_expression(std::declval<const V&>()))>::type>::type, Backend>::type const&, typename detail::canonical<typename std::remove_cv<typename std::remove_reference<decltype(detail::evaluate_if_expression(std::declval<const U&>()))>::type>::type, Backend>::type const&>::value\n               || boost::multiprecision::detail::is_variable_precision<Backend>::value))>::type* = nullptr)\n   {\n      using default_ops::assign_components;\n      // Copy precision options from this type to component_type:\n      boost::multiprecision::detail::scoped_precision_options<value_type> scoped_opts(*this);\n      // precision guards:\n      detail::scoped_default_precision<self_type>  precision_guard(v1, v2, *this);\n      detail::scoped_default_precision<value_type> component_precision_guard(v1, v2, *this);\n      assign_components(m_backend, canonical_value(detail::evaluate_if_expression(v1)), canonical_value(detail::evaluate_if_expression(v2)));\n   }\n   template <class V, class U>\n   BOOST_MP_FORCEINLINE explicit BOOST_MP_CXX14_CONSTEXPR number(const V& v1, const U& v2,\n                                        typename std::enable_if<\n                                                                     (std::is_constructible<value_type, V>::value || std::is_convertible<V, std::string>::value) && (std::is_constructible<value_type, U>::value || std::is_convertible<U, std::string>::value) && !std::is_same<value_type, self_type>::value && !std::is_same<V, self_type>::value && !(std::is_convertible<V, value_type>::value && std::is_convertible<U, value_type>::value)>::type* = nullptr)\n   {\n      using default_ops::assign_components;\n      // Copy precision options from this type to component_type:\n      boost::multiprecision::detail::scoped_precision_options<value_type> scoped_opts(*this);\n      // precision guards:\n      detail::scoped_default_precision<self_type>  precision_guard(v1, v2, *this);\n      detail::scoped_default_precision<value_type> component_precision_guard(v1, v2, *this);\n      assign_components(m_backend, canonical_value(detail::evaluate_if_expression(v1)), canonical_value(detail::evaluate_if_expression(v2)));\n   }\n#ifndef BOOST_NO_CXX17_HDR_STRING_VIEW\n   //\n   // Support for new types in C++17\n   //\n   template <class Traits>\n   explicit inline BOOST_MP_CXX14_CONSTEXPR number(const std::basic_string_view<char, Traits>& view)\n   {\n      using default_ops::assign_from_string_view;\n      assign_from_string_view(this->backend(), view);\n   }\n   template <class Traits>\n   explicit inline BOOST_MP_CXX14_CONSTEXPR number(const std::basic_string_view<char, Traits>& view_x, const std::basic_string_view<char, Traits>& view_y)\n   {\n      using default_ops::assign_from_string_view;\n      assign_from_string_view(this->backend(), view_x, view_y);\n   }\n   template <class Traits>\n   explicit BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number(const std::basic_string_view<char, Traits>& v, unsigned digits10)\n       : m_backend(canonical_value(v), digits10) {}\n   template <class Traits>\n   BOOST_MP_CXX14_CONSTEXPR number& assign(const std::basic_string_view<char, Traits>& view)\n   {\n      using default_ops::assign_from_string_view;\n      assign_from_string_view(this->backend(), view);\n      return *this;\n   }\n#endif\n\n   template <class V, class U>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number(const V& v1, const U& v2, unsigned digits10,\n                                                        typename std::enable_if<(std::is_convertible<V, value_type>::value && std::is_convertible<U, value_type>::value && !std::is_same<value_type, self_type>::value)>::type* = nullptr)\n       : m_backend(canonical_value(detail::evaluate_if_expression(v1)), canonical_value(detail::evaluate_if_expression(v2)), digits10)\n   {}\n   template <class V, class U>\n   BOOST_MP_FORCEINLINE explicit BOOST_MP_CXX14_CONSTEXPR number(const V& v1, const U& v2, unsigned digits10,\n                                                                 typename std::enable_if<((std::is_constructible<value_type, V>::value || std::is_convertible<V, std::string>::value) && (std::is_constructible<value_type, U>::value || std::is_convertible<U, std::string>::value) && !std::is_same<value_type, self_type>::value) && !(std::is_convertible<V, value_type>::value && std::is_convertible<U, value_type>::value)>::type* = nullptr)\n       : m_backend(detail::evaluate_if_expression(v1), detail::evaluate_if_expression(v2), digits10) {}\n\n   template <class Other, expression_template_option ET>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number(\n      const number<Other, ET>& v1, \n      const number<Other, ET>& v2, \n      typename std::enable_if<\n         std::is_convertible<Other, Backend>::value \n         && (!std::is_constructible<Backend, typename detail::canonical<typename std::remove_cv<typename std::remove_reference<decltype(detail::evaluate_if_expression(std::declval<const number<Other, ET>&>()))>::type>::type, Backend>::type const&, typename detail::canonical<typename std::remove_cv<typename std::remove_reference<decltype(detail::evaluate_if_expression(std::declval<const number<Other, ET>&>()))>::type>::type, Backend>::type const&>::value || boost::multiprecision::detail::is_variable_precision<Backend>::value) >::type* = nullptr)\n   {\n      using default_ops::assign_components;\n      detail::scoped_default_precision<number<Backend, ExpressionTemplates> > precision_guard(v1, v2);\n      assign_components(m_backend, v1.backend(), v2.backend());\n   }\n\n   template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, self_type>::value, number&>::type operator=(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)\n   {\n      using tag_type = std::integral_constant<bool, is_equivalent_number_type<number, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value>;\n      detail::scoped_default_precision<number<Backend, ExpressionTemplates> >                                       precision_guard(e);\n      //\n      // If the current precision of *this differs from that of expression e, then we\n      // create a temporary (which will have the correct precision thanks to precision_guard)\n      // and then move the result into *this.  In C++17 we add a leading \"if constexpr\"\n      // which causes this code to be eliminated in the common case that this type is\n      // not actually variable precision.  Pre C++17 this code should still be mostly\n      // optimised away, but we can't prevent instantiation of the dead code leading\n      // to longer build and possibly link times.\n      //\n      BOOST_IF_CONSTEXPR (std::is_same<self_type, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value)\n      {\n         BOOST_MP_CONSTEXPR_IF_VARIABLE_PRECISION(number)\n            if (precision_guard.precision() != boost::multiprecision::detail::current_precision_of<self_type>(*this))\n            {\n               number t(e);\n               return *this = std::move(t);\n            }\n      }\n      do_assign(e, tag_type());\n      return *this;\n   }\n   template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\n   BOOST_MP_CXX14_CONSTEXPR number& assign(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)\n   {\n      using tag_type = std::integral_constant<bool, is_equivalent_number_type<number, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value>;\n\n      //\n      // If the current precision of *this differs from that of expression e, then we\n      // create a temporary (which will have the correct precision thanks to precision_guard)\n      // and then move the result into *this.  In C++17 we add a leading \"if constexpr\"\n      // which causes this code to be eliminated in the common case that this type is\n      // not actually variable precision.  Pre C++17 this code should still be mostly\n      // optimised away, but we can't prevent instantiation of the dead code leading\n      // to longer build and possibly link times.\n      //\n      BOOST_IF_CONSTEXPR(std::is_same<self_type, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value)\n      {\n         BOOST_MP_CONSTEXPR_IF_VARIABLE_PRECISION(number)\n         {\n            const detail::scoped_default_precision<number<Backend, ExpressionTemplates>> precision_guard(e);\n\n            if (precision_guard.precision() != boost::multiprecision::detail::current_precision_of<self_type>(*this))\n            {\n               number t;\n               t.assign(e);\n               return *this = std::move(t);\n            }\n         }\n      }\n      do_assign(e, tag_type());\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR number& assign(const value_type& a, const value_type& b)\n   {\n      assign_components(backend(), a.backend(), b.backend());\n      return *this;\n   }\n   template <class V, class U>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<(std::is_convertible<V, value_type>::value&& std::is_convertible<U, value_type>::value && !std::is_same<value_type, self_type>::value), number&>::type \n      assign(const V& v1, const U& v2, unsigned Digits)\n   {\n      self_type r(v1, v2, Digits);\n      boost::multiprecision::detail::scoped_source_precision<self_type> scope;\n      return *this = r;\n   }\n   BOOST_MP_CXX14_CONSTEXPR number& assign(const value_type & a, const value_type & b, unsigned Digits)\n   {\n      this->precision(Digits);\n      boost::multiprecision::detail::scoped_target_precision<self_type> scoped;\n      assign_components(backend(), canonical_value(detail::evaluate_if_expression(a)), canonical_value(detail::evaluate_if_expression(b)));\n      return *this;\n   }\n\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number& operator=(const number& e)\n       noexcept(noexcept(std::declval<Backend&>() = std::declval<Backend const&>()))\n   {\n      m_backend = e.m_backend;\n      return *this;\n   }\n\n   template <class V>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, self_type>::value, number<Backend, ExpressionTemplates>&>::type\n   operator=(const V& v)\n       noexcept(noexcept(std::declval<Backend&>() = std::declval<const typename detail::canonical<V, Backend>::type&>()))\n   {\n      m_backend = canonical_value(v);\n      return *this;\n   }\n   template <class V>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number<Backend, ExpressionTemplates>& assign(const V& v)\n       noexcept(noexcept(std::declval<Backend&>() = std::declval<const typename detail::canonical<V, Backend>::type&>()))\n   {\n      m_backend = canonical_value(v);\n      return *this;\n   }\n   template <class V, class U>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number<Backend, ExpressionTemplates>& assign(const V& v, const U& digits10_or_component)\n       noexcept(noexcept(std::declval<Backend&>() = std::declval<const typename detail::canonical<V, Backend>::type&>()))\n   {\n      number t(v, digits10_or_component);\n      boost::multiprecision::detail::scoped_source_precision<self_type> scope;\n      static_cast<void>(scope);\n      return *this = t;\n   }\n   template <class Other, expression_template_option ET>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!boost::multiprecision::detail::is_explicitly_convertible<Other, Backend>::value, number<Backend, ExpressionTemplates>&>::type\n   assign(const number<Other, ET>& v)\n   {\n      //\n      // Attempt a generic interconvertion:\n      //\n      using detail::generic_interconvert;\n      detail::scoped_default_precision<number<Backend, ExpressionTemplates> > precision_guard(*this, v);\n      detail::scoped_default_precision<number<Other, ET> >                    precision_guard2(*this, v);\n      //\n      // If the current precision of *this differs from that of value v, then we\n      // create a temporary (which will have the correct precision thanks to precision_guard)\n      // and then move the result into *this.  In C++17 we add a leading \"if constexpr\"\n      // which causes this code to be eliminated in the common case that this type is\n      // not actually variable precision.  Pre C++17 this code should still be mostly\n      // optimised away, but we can't prevent instantiation of the dead code leading\n      // to longer build and possibly link times.\n      //\n      BOOST_MP_CONSTEXPR_IF_VARIABLE_PRECISION(number)\n      if (precision_guard.precision() != boost::multiprecision::detail::current_precision_of<self_type>(*this))\n      {\n         number t(v);\n         return *this = std::move(t);\n      }\n      generic_interconvert(backend(), v.backend(), number_category<Backend>(), number_category<Other>());\n      return *this;\n   }\n\n   template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\n   BOOST_MP_CXX14_CONSTEXPR number(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e, typename std::enable_if<std::is_convertible<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, self_type>::value>::type* = nullptr)\n   {\n      //\n      // No preicsion guard here, we already have one in operator=\n      //\n      *this = e;\n   }\n   template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\n   explicit BOOST_MP_CXX14_CONSTEXPR number(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e,\n                                            typename std::enable_if<!std::is_convertible<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, self_type>::value && boost::multiprecision::detail::is_explicitly_convertible<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, self_type>::value>::type* = nullptr)\n   {\n      //\n      // No precision guard as assign has one already:\n      //\n      assign(e);\n   }\n\n   // rvalues:\n   BOOST_MP_FORCEINLINE constexpr number(number&& r)\n       noexcept(noexcept(Backend(std::declval<Backend>())))\n       : m_backend(static_cast<Backend&&>(r.m_backend))\n   {}\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number& operator=(number&& r) noexcept(noexcept(std::declval<Backend&>() = std::declval<Backend>()))\n   {\n      m_backend = static_cast<Backend&&>(r.m_backend);\n      return *this;\n   }\n   template <class Other, expression_template_option ET>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number(number<Other, ET>&& val,\n                                                        typename std::enable_if<(std::is_convertible<Other, Backend>::value && !detail::is_restricted_conversion<Other, Backend>::value)>::type* = nullptr)\n       noexcept(noexcept(Backend(std::declval<Other const&>())))\n       : m_backend(static_cast<number<Other, ET>&&>(val).backend()) {}\n   template <class Other, expression_template_option ET>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<(std::is_convertible<Other, Backend>::value && !detail::is_restricted_conversion<Other, Backend>::value), number&>::type \n         operator=(number<Other, ET>&& val)\n            noexcept(noexcept(Backend(std::declval<Other const&>())))\n   {\n      m_backend = std::move(val).backend();\n      return *this;\n   }\n\n   BOOST_MP_CXX14_CONSTEXPR number& operator+=(const self_type& val)\n   {\n      detail::scoped_default_precision<number<Backend, ExpressionTemplates> > precision_guard(*this, val);\n      //\n      // If the current precision of *this differs from that of expression e, then we\n      // create a temporary (which will have the correct precision thanks to precision_guard)\n      // and then move the result into *this.  In C++17 we add a leading \"if constexpr\"\n      // which causes this code to be eliminated in the common case that this type is\n      // not actually variable precision.  Pre C++17 this code should still be mostly\n      // optimised away, but we can't prevent instantiation of the dead code leading\n      // to longer build and possibly link times.\n      //\n      BOOST_MP_CONSTEXPR_IF_VARIABLE_PRECISION(number)\n      if (precision_guard.precision() != boost::multiprecision::detail::current_precision_of<self_type>(*this))\n      {\n         number t(*this + val);\n         return *this = std::move(t);\n      }\n      do_add(detail::expression<detail::terminal, self_type>(val), detail::terminal());\n      return *this;\n   }\n\n   template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, self_type>::value, number&>::type operator+=(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)\n   {\n      detail::scoped_default_precision<number<Backend, ExpressionTemplates> > precision_guard(*this, e);\n      // Create a copy if e contains this, but not if we're just doing a\n      //    x += x\n      if ((contains_self(e) && !is_self(e)))\n      {\n         self_type temp(e);\n         do_add(detail::expression<detail::terminal, self_type>(temp), detail::terminal());\n      }\n      else\n      {\n         do_add(e, tag());\n      }\n      return *this;\n   }\n\n   template <class Arg1, class Arg2, class Arg3, class Arg4>\n   BOOST_MP_CXX14_CONSTEXPR number& operator+=(const detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>& e)\n   {\n      detail::scoped_default_precision<number<Backend, ExpressionTemplates> > precision_guard(*this, e);\n      //\n      // If the current precision of *this differs from that of expression e, then we\n      // create a temporary (which will have the correct precision thanks to precision_guard)\n      // and then move the result into *this.  In C++17 we add a leading \"if constexpr\"\n      // which causes this code to be eliminated in the common case that this type is\n      // not actually variable precision.  Pre C++17 this code should still be mostly\n      // optimised away, but we can't prevent instantiation of the dead code leading\n      // to longer build and possibly link times.\n      //\n      BOOST_IF_CONSTEXPR(std::is_same<self_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::result_type>::value)\n      {\n         BOOST_MP_CONSTEXPR_IF_VARIABLE_PRECISION(number)\n         if (precision_guard.precision() != boost::multiprecision::detail::current_precision_of<self_type>(*this))\n            {\n               number t(*this + e);\n               return *this = std::move(t);\n            }\n      }\n      //\n      // Fused multiply-add:\n      //\n      using default_ops::eval_multiply_add;\n      eval_multiply_add(m_backend, canonical_value(e.left_ref()), canonical_value(e.right_ref()));\n      return *this;\n   }\n\n   template <class V>\n   typename std::enable_if<std::is_convertible<V, self_type>::value, number<Backend, ExpressionTemplates>&>::type\n      BOOST_MP_CXX14_CONSTEXPR operator+=(const V& v)\n   {\n      detail::scoped_default_precision<number<Backend, ExpressionTemplates> > precision_guard(*this, v);\n      //\n      // If the current precision of *this differs from that of value v, then we\n      // create a temporary (which will have the correct precision thanks to precision_guard)\n      // and then move the result into *this.  In C++17 we add a leading \"if constexpr\"\n      // which causes this code to be eliminated in the common case that this type is\n      // not actually variable precision.  Pre C++17 this code should still be mostly\n      // optimised away, but we can't prevent instantiation of the dead code leading\n      // to longer build and possibly link times.\n      //\n      BOOST_MP_CONSTEXPR_IF_VARIABLE_PRECISION(number)\n      if (precision_guard.precision() != boost::multiprecision::detail::current_precision_of<self_type>(*this))\n         {\n            number t(*this + v);\n            return *this = std::move(t);\n         }\n\n      using default_ops::eval_add;\n      eval_add(m_backend, canonical_value(v));\n      return *this;\n   }\n\n   BOOST_MP_CXX14_CONSTEXPR number& operator-=(const self_type& val)\n   {\n      detail::scoped_default_precision<number<Backend, ExpressionTemplates> > precision_guard(*this, val);\n      //\n      // If the current precision of *this differs from that of expression e, then we\n      // create a temporary (which will have the correct precision thanks to precision_guard)\n      // and then move the result into *this.  In C++17 we add a leading \"if constexpr\"\n      // which causes this code to be eliminated in the common case that this type is\n      // not actually variable precision.  Pre C++17 this code should still be mostly\n      // optimised away, but we can't prevent instantiation of the dead code leading\n      // to longer build and possibly link times.\n      //\n      BOOST_MP_CONSTEXPR_IF_VARIABLE_PRECISION(number)\n      if (precision_guard.precision() != boost::multiprecision::detail::current_precision_of<self_type>(*this))\n      {\n         number t(*this - val);\n         return *this = std::move(t);\n      }\n      do_subtract(detail::expression<detail::terminal, self_type>(val), detail::terminal());\n      return *this;\n   }\n\n   template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, self_type>::value, number&>::type operator-=(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)\n   {\n      detail::scoped_default_precision<number<Backend, ExpressionTemplates> > precision_guard(*this, e);\n      // Create a copy if e contains this:\n      if (contains_self(e))\n      {\n         self_type temp(e);\n         do_subtract(detail::expression<detail::terminal, self_type>(temp), detail::terminal());\n      }\n      else\n      {\n         do_subtract(e, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::tag_type());\n      }\n      return *this;\n   }\n\n   template <class V>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, self_type>::value, number<Backend, ExpressionTemplates>&>::type\n   operator-=(const V& v)\n   {\n      detail::scoped_default_precision<number<Backend, ExpressionTemplates> > precision_guard(*this, v);\n      //\n      // If the current precision of *this differs from that of value v, then we\n      // create a temporary (which will have the correct precision thanks to precision_guard)\n      // and then move the result into *this.  In C++17 we add a leading \"if constexpr\"\n      // which causes this code to be eliminated in the common case that this type is\n      // not actually variable precision.  Pre C++17 this code should still be mostly\n      // optimised away, but we can't prevent instantiation of the dead code leading\n      // to longer build and possibly link times.\n      //\n      BOOST_MP_CONSTEXPR_IF_VARIABLE_PRECISION(number)\n      if (precision_guard.precision() != boost::multiprecision::detail::current_precision_of<self_type>(*this))\n         {\n            number t(*this - v);\n            return *this = std::move(t);\n         }\n\n      using default_ops::eval_subtract;\n      eval_subtract(m_backend, canonical_value(v));\n      return *this;\n   }\n\n   template <class Arg1, class Arg2, class Arg3, class Arg4>\n   BOOST_MP_CXX14_CONSTEXPR number& operator-=(const detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>& e)\n   {\n      detail::scoped_default_precision<number<Backend, ExpressionTemplates> > precision_guard(*this, e);\n      //\n      // If the current precision of *this differs from that of expression e, then we\n      // create a temporary (which will have the correct precision thanks to precision_guard)\n      // and then move the result into *this.  In C++17 we add a leading \"if constexpr\"\n      // which causes this code to be eliminated in the common case that this type is\n      // not actually variable precision.  Pre C++17 this code should still be mostly\n      // optimised away, but we can't prevent instantiation of the dead code leading\n      // to longer build and possibly link times.\n      //\n      BOOST_IF_CONSTEXPR(std::is_same<self_type, typename detail::expression<detail::multiply_immediates, Arg1, Arg2, Arg3, Arg4>::result_type>::value)\n      {\n         BOOST_MP_CONSTEXPR_IF_VARIABLE_PRECISION(number)\n         if (precision_guard.precision() != boost::multiprecision::detail::current_precision_of<self_type>(*this))\n            {\n               number t(*this - e);\n               return *this = std::move(t);\n            }\n      }\n      //\n      // Fused multiply-subtract:\n      //\n      using default_ops::eval_multiply_subtract;\n      eval_multiply_subtract(m_backend, canonical_value(e.left_ref()), canonical_value(e.right_ref()));\n      return *this;\n   }\n\n   BOOST_MP_CXX14_CONSTEXPR number& operator*=(const self_type& e)\n   {\n      detail::scoped_default_precision<number<Backend, ExpressionTemplates> > precision_guard(*this, e);\n      //\n      // If the current precision of *this differs from that of expression e, then we\n      // create a temporary (which will have the correct precision thanks to precision_guard)\n      // and then move the result into *this.  In C++17 we add a leading \"if constexpr\"\n      // which causes this code to be eliminated in the common case that this type is\n      // not actually variable precision.  Pre C++17 this code should still be mostly\n      // optimised away, but we can't prevent instantiation of the dead code leading\n      // to longer build and possibly link times.\n      //\n      BOOST_MP_CONSTEXPR_IF_VARIABLE_PRECISION(number)\n      if (precision_guard.precision() != boost::multiprecision::detail::current_precision_of<self_type>(*this))\n      {\n         number t(*this * e);\n         return *this = std::move(t);\n      }\n      do_multiplies(detail::expression<detail::terminal, self_type>(e), detail::terminal());\n      return *this;\n   }\n\n   template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, self_type>::value, number&>::type operator*=(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)\n   {\n      detail::scoped_default_precision<number<Backend, ExpressionTemplates> > precision_guard(*this, e);\n      // Create a temporary if the RHS references *this, but not\n      // if we're just doing an   x *= x;\n      if ((contains_self(e) && !is_self(e)))\n      {\n         self_type temp(e);\n         do_multiplies(detail::expression<detail::terminal, self_type>(temp), detail::terminal());\n      }\n      else\n      {\n         do_multiplies(e, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::tag_type());\n      }\n      return *this;\n   }\n\n   template <class V>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, self_type>::value, number<Backend, ExpressionTemplates>&>::type\n   operator*=(const V& v)\n   {\n      detail::scoped_default_precision<number<Backend, ExpressionTemplates> > precision_guard(*this, v);\n      //\n      // If the current precision of *this differs from that of value v, then we\n      // create a temporary (which will have the correct precision thanks to precision_guard)\n      // and then move the result into *this.  In C++17 we add a leading \"if constexpr\"\n      // which causes this code to be eliminated in the common case that this type is\n      // not actually variable precision.  Pre C++17 this code should still be mostly\n      // optimised away, but we can't prevent instantiation of the dead code leading\n      // to longer build and possibly link times.\n      //\n      BOOST_MP_CONSTEXPR_IF_VARIABLE_PRECISION(number)\n      if (precision_guard.precision() != boost::multiprecision::detail::current_precision_of<self_type>(*this))\n         {\n            number t(*this * v);\n            return *this = std::move(t);\n         }\n\n      using default_ops::eval_multiply;\n      eval_multiply(m_backend, canonical_value(v));\n      return *this;\n   }\n\n   BOOST_MP_CXX14_CONSTEXPR number& operator%=(const self_type& e)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The modulus operation is only valid for integer types\");\n      detail::scoped_default_precision<number<Backend, ExpressionTemplates> > precision_guard(*this, e);\n      //\n      // If the current precision of *this differs from that of expression e, then we\n      // create a temporary (which will have the correct precision thanks to precision_guard)\n      // and then move the result into *this.  In C++17 we add a leading \"if constexpr\"\n      // which causes this code to be eliminated in the common case that this type is\n      // not actually variable precision.  Pre C++17 this code should still be mostly\n      // optimised away, but we can't prevent instantiation of the dead code leading\n      // to longer build and possibly link times.\n      //\n      BOOST_MP_CONSTEXPR_IF_VARIABLE_PRECISION(number)\n      if (precision_guard.precision() != boost::multiprecision::detail::current_precision_of<self_type>(*this))\n      {\n         number t(*this % e);\n         return *this = std::move(t);\n      }\n      do_modulus(detail::expression<detail::terminal, self_type>(e), detail::terminal());\n      return *this;\n   }\n   template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, self_type>::value, number&>::type operator%=(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The modulus operation is only valid for integer types\");\n      detail::scoped_default_precision<number<Backend, ExpressionTemplates> > precision_guard(*this, e);\n      // Create a temporary if the RHS references *this:\n      if (contains_self(e))\n      {\n         self_type temp(e);\n         do_modulus(detail::expression<detail::terminal, self_type>(temp), detail::terminal());\n      }\n      else\n      {\n         do_modulus(e, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::tag_type());\n      }\n      return *this;\n   }\n   template <class V>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, self_type>::value, number<Backend, ExpressionTemplates>&>::type\n   operator%=(const V& v)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The modulus operation is only valid for integer types\");\n      using default_ops::eval_modulus;\n      eval_modulus(m_backend, canonical_value(v));\n      return *this;\n   }\n\n   //\n   // These operators are *not* proto-ized.\n   // The issue is that the increment/decrement must happen\n   // even if the result of the operator *is never used*.\n   // Possibly we could modify our expression wrapper to\n   // execute the increment/decrement on destruction, but\n   // correct implementation will be tricky, so defered for now...\n   //\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number& operator++()\n   {\n      using default_ops::eval_increment;\n      eval_increment(m_backend);\n      return *this;\n   }\n\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number& operator--()\n   {\n      using default_ops::eval_decrement;\n      eval_decrement(m_backend);\n      return *this;\n   }\n\n   inline BOOST_MP_CXX14_CONSTEXPR number operator++(int)\n   {\n      using default_ops::eval_increment;\n      self_type temp(*this);\n      eval_increment(m_backend);\n      return temp;\n   }\n\n   inline BOOST_MP_CXX14_CONSTEXPR number operator--(int)\n   {\n      using default_ops::eval_decrement;\n      self_type temp(*this);\n      eval_decrement(m_backend);\n      return temp;\n   }\n\n   template <class V>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<V>::value, number&>::type operator<<=(V val)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The left-shift operation is only valid for integer types\");\n      detail::check_shift_range(val, std::integral_constant<bool, (sizeof(V) > sizeof(std::size_t))>(), std::integral_constant<bool, boost::multiprecision::detail::is_signed<V>::value && boost::multiprecision::detail::is_integral<V>::value > ());\n      eval_left_shift(m_backend, static_cast<std::size_t>(canonical_value(val)));\n      return *this;\n   }\n\n   template <class V>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<V>::value, number&>::type operator>>=(V val)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The right-shift operation is only valid for integer types\");\n      detail::check_shift_range(val, std::integral_constant<bool, (sizeof(V) > sizeof(std::size_t))>(), std::integral_constant<bool, boost::multiprecision::detail::is_signed<V>::value && boost::multiprecision::detail::is_integral<V>::value>());\n      eval_right_shift(m_backend, static_cast<std::size_t>(canonical_value(val)));\n      return *this;\n   }\n\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number& operator/=(const self_type& e)\n   {\n      detail::scoped_default_precision<number<Backend, ExpressionTemplates> > precision_guard(*this, e);\n      //\n      // If the current precision of *this differs from that of expression e, then we\n      // create a temporary (which will have the correct precision thanks to precision_guard)\n      // and then move the result into *this.  In C++17 we add a leading \"if constexpr\"\n      // which causes this code to be eliminated in the common case that this type is\n      // not actually variable precision.  Pre C++17 this code should still be mostly\n      // optimised away, but we can't prevent instantiation of the dead code leading\n      // to longer build and possibly link times.\n      //\n      BOOST_MP_CONSTEXPR_IF_VARIABLE_PRECISION(number)\n      if (precision_guard.precision() != boost::multiprecision::detail::current_precision_of<self_type>(*this))\n      {\n         number t(*this / e);\n         return *this = std::move(t);\n      }\n      do_divide(detail::expression<detail::terminal, self_type>(e), detail::terminal());\n      return *this;\n   }\n\n   template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, self_type>::value, number&>::type operator/=(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)\n   {\n      detail::scoped_default_precision<number<Backend, ExpressionTemplates> > precision_guard(*this, e);\n      // Create a temporary if the RHS references *this:\n      if (contains_self(e))\n      {\n         self_type temp(e);\n         do_divide(detail::expression<detail::terminal, self_type>(temp), detail::terminal());\n      }\n      else\n      {\n         do_divide(e, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::tag_type());\n      }\n      return *this;\n   }\n\n   template <class V>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, self_type>::value, number<Backend, ExpressionTemplates>&>::type\n   operator/=(const V& v)\n   {\n      detail::scoped_default_precision<number<Backend, ExpressionTemplates> > precision_guard(*this, v);\n      //\n      // If the current precision of *this differs from that of value v, then we\n      // create a temporary (which will have the correct precision thanks to precision_guard)\n      // and then move the result into *this.  In C++17 we add a leading \"if constexpr\"\n      // which causes this code to be eliminated in the common case that this type is\n      // not actually variable precision.  Pre C++17 this code should still be mostly\n      // optimised away, but we can't prevent instantiation of the dead code leading\n      // to longer build and possibly link times.\n      //\n      BOOST_MP_CONSTEXPR_IF_VARIABLE_PRECISION(number)\n      if (precision_guard.precision() != boost::multiprecision::detail::current_precision_of<self_type>(*this))\n         {\n            number t(*this / v);\n            return *this = std::move(t);\n         }\n\n      using default_ops::eval_divide;\n      eval_divide(m_backend, canonical_value(v));\n      return *this;\n   }\n\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number& operator&=(const self_type& e)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The bitwise & operation is only valid for integer types\");\n      do_bitwise_and(detail::expression<detail::terminal, self_type>(e), detail::terminal());\n      return *this;\n   }\n\n   template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, self_type>::value, number&>::type operator&=(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The bitwise & operation is only valid for integer types\");\n      // Create a temporary if the RHS references *this, but not\n      // if we're just doing an   x &= x;\n      if (contains_self(e) && !is_self(e))\n      {\n         self_type temp(e);\n         do_bitwise_and(detail::expression<detail::terminal, self_type>(temp), detail::terminal());\n      }\n      else\n      {\n         do_bitwise_and(e, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::tag_type());\n      }\n      return *this;\n   }\n\n   template <class V>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, self_type>::value, number<Backend, ExpressionTemplates>&>::type\n   operator&=(const V& v)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The bitwise & operation is only valid for integer types\");\n      using default_ops::eval_bitwise_and;\n      eval_bitwise_and(m_backend, canonical_value(v));\n      return *this;\n   }\n\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number& operator|=(const self_type& e)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The bitwise | operation is only valid for integer types\");\n      do_bitwise_or(detail::expression<detail::terminal, self_type>(e), detail::terminal());\n      return *this;\n   }\n\n   template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, self_type>::value, number&>::type operator|=(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The bitwise | operation is only valid for integer types\");\n      // Create a temporary if the RHS references *this, but not\n      // if we're just doing an   x |= x;\n      if (contains_self(e) && !is_self(e))\n      {\n         self_type temp(e);\n         do_bitwise_or(detail::expression<detail::terminal, self_type>(temp), detail::terminal());\n      }\n      else\n      {\n         do_bitwise_or(e, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::tag_type());\n      }\n      return *this;\n   }\n\n   template <class V>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, self_type>::value, number<Backend, ExpressionTemplates>&>::type\n   operator|=(const V& v)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The bitwise | operation is only valid for integer types\");\n      using default_ops::eval_bitwise_or;\n      eval_bitwise_or(m_backend, canonical_value(v));\n      return *this;\n   }\n\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR number& operator^=(const self_type& e)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The bitwise ^ operation is only valid for integer types\");\n      do_bitwise_xor(detail::expression<detail::terminal, self_type>(e), detail::terminal());\n      return *this;\n   }\n\n   template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, self_type>::value, number&>::type operator^=(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The bitwise ^ operation is only valid for integer types\");\n      if (contains_self(e))\n      {\n         self_type temp(e);\n         do_bitwise_xor(detail::expression<detail::terminal, self_type>(temp), detail::terminal());\n      }\n      else\n      {\n         do_bitwise_xor(e, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::tag_type());\n      }\n      return *this;\n   }\n\n   template <class V>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<V, self_type>::value, number<Backend, ExpressionTemplates>&>::type\n   operator^=(const V& v)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The bitwise ^ operation is only valid for integer types\");\n      using default_ops::eval_bitwise_xor;\n      eval_bitwise_xor(m_backend, canonical_value(v));\n      return *this;\n   }\n   //\n   // swap:\n   //\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void swap(self_type& other) noexcept(noexcept(std::declval<Backend>().swap(std::declval<Backend&>())))\n   {\n      m_backend.swap(other.backend());\n   }\n   //\n   // Zero and sign:\n   //\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR bool is_zero() const\n   {\n      using default_ops::eval_is_zero;\n      return eval_is_zero(m_backend);\n   }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR int sign() const\n   {\n      using default_ops::eval_get_sign;\n      return eval_get_sign(m_backend);\n   }\n   //\n   // String conversion functions:\n   //\n   std::string str(std::streamsize digits = 0, std::ios_base::fmtflags f = std::ios_base::fmtflags(0)) const\n   {\n      return m_backend.str(digits, f);\n   }\n\n   #ifndef BOOST_MP_STANDALONE\n   template <class Archive>\n   void serialize(Archive& ar, const unsigned int /*version*/)\n   {\n      ar& boost::make_nvp(\"backend\", m_backend);\n   }\n   #endif\n\n private:\n   template <class T>\n   BOOST_MP_CXX14_CONSTEXPR void convert_to_imp(T* result) const\n   {\n      using default_ops::eval_convert_to;\n      eval_convert_to(result, m_backend);\n   }\n   template <class B2, expression_template_option ET>\n   BOOST_MP_CXX14_CONSTEXPR void convert_to_imp(number<B2, ET>* result) const\n   {\n      result->assign(*this);\n   }\n   BOOST_MP_CXX14_CONSTEXPR void convert_to_imp(std::string* result) const\n   {\n      *result = this->str();\n   }\n\n public:\n   template <class T>\n   BOOST_MP_CXX14_CONSTEXPR T convert_to() const\n   {\n      T result = T();\n      convert_to_imp(&result);\n      return result;\n   }\n   //\n   // Use in boolean context, and explicit conversion operators:\n   //\n#if BOOST_WORKAROUND(BOOST_MSVC, < 1900) || (defined(__apple_build_version__) && BOOST_WORKAROUND(__clang_major__, < 9))\n   template <class T>\n#else\n   template <class T, class = typename std::enable_if<std::is_enum<T>::value || !(std::is_constructible<T, detail::convertible_to<self_type const&> >::value || !std::is_default_constructible<T>::value || (!boost::multiprecision::detail::is_arithmetic<T>::value && !boost::multiprecision::detail::is_complex<T>::value)), T>::type>\n#endif\n   explicit BOOST_MP_CXX14_CONSTEXPR operator T() const\n   {\n      return this->template convert_to<T>();\n   }\n   BOOST_MP_FORCEINLINE explicit BOOST_MP_CXX14_CONSTEXPR operator bool() const\n   {\n      return !is_zero();\n   }\n   //\n   // Default precision:\n   //\n   static BOOST_MP_CXX14_CONSTEXPR unsigned default_precision() noexcept\n   {\n      return Backend::default_precision();\n   }\n   static BOOST_MP_CXX14_CONSTEXPR void default_precision(unsigned digits10)\n   {\n      Backend::default_precision(digits10);\n      Backend::thread_default_precision(digits10);\n   }\n   static BOOST_MP_CXX14_CONSTEXPR unsigned thread_default_precision() noexcept\n   {\n      return Backend::thread_default_precision();\n   }\n   static BOOST_MP_CXX14_CONSTEXPR void thread_default_precision(unsigned digits10)\n   {\n      Backend::thread_default_precision(digits10);\n   }\n   BOOST_MP_CXX14_CONSTEXPR unsigned precision() const noexcept\n   {\n      return m_backend.precision();\n   }\n   BOOST_MP_CXX14_CONSTEXPR void precision(unsigned digits10)\n   {\n      m_backend.precision(digits10);\n   }\n   //\n   // Variable precision options:\n   // \n   static constexpr variable_precision_options default_variable_precision_options()noexcept\n   {\n      return Backend::default_variable_precision_options();\n   }\n   static constexpr variable_precision_options thread_default_variable_precision_options()noexcept\n   {\n      return Backend::thread_default_variable_precision_options();\n   }\n   static BOOST_MP_CXX14_CONSTEXPR void default_variable_precision_options(variable_precision_options opts)\n   {\n      Backend::default_variable_precision_options(opts);\n   }\n   static BOOST_MP_CXX14_CONSTEXPR void thread_default_variable_precision_options(variable_precision_options opts)\n   {\n      Backend::thread_default_variable_precision_options(opts);\n   }\n   //\n   // Comparison:\n   //\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR int compare(const number<Backend, ExpressionTemplates>& o) const\n       noexcept(noexcept(std::declval<Backend>().compare(std::declval<Backend>())))\n   {\n      return m_backend.compare(o.m_backend);\n   }\n   template <class V>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<V>::value && (number_category<Backend>::value != number_kind_complex), int>::type compare(const V& o) const\n   {\n      using default_ops::eval_get_sign;\n      if (o == 0)\n         return eval_get_sign(m_backend);\n      return m_backend.compare(canonical_value(o));\n   }\n   template <class V>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<V>::value && (number_category<Backend>::value == number_kind_complex), int>::type compare(const V& o) const\n   {\n      using default_ops::eval_get_sign;\n      return m_backend.compare(canonical_value(o));\n   }\n   //\n   // Direct access to the underlying backend:\n   //\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR Backend& backend() & noexcept\n   {\n      return m_backend;\n   }\n   BOOST_MP_FORCEINLINE constexpr const Backend& backend() const& noexcept { return m_backend; }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR Backend&& backend() && noexcept { return static_cast<Backend&&>(m_backend); }\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR Backend const&& backend() const&& noexcept { return static_cast<Backend const&&>(m_backend); }\n   //\n   // Complex number real and imag:\n   //\n   BOOST_MP_CXX14_CONSTEXPR typename scalar_result_from_possible_complex<number<Backend, ExpressionTemplates> >::type\n   real() const\n   {\n      using default_ops::eval_real;\n      detail::scoped_default_precision<typename scalar_result_from_possible_complex<multiprecision::number<Backend, ExpressionTemplates> >::type> precision_guard(*this);\n      typename scalar_result_from_possible_complex<multiprecision::number<Backend, ExpressionTemplates> >::type                                   result;\n      eval_real(result.backend(), backend());\n      return result;\n   }\n   BOOST_MP_CXX14_CONSTEXPR typename scalar_result_from_possible_complex<number<Backend, ExpressionTemplates> >::type\n   imag() const\n   {\n      using default_ops::eval_imag;\n      detail::scoped_default_precision<typename scalar_result_from_possible_complex<multiprecision::number<Backend, ExpressionTemplates> >::type> precision_guard(*this);\n      typename scalar_result_from_possible_complex<multiprecision::number<Backend, ExpressionTemplates> >::type                                   result;\n      eval_imag(result.backend(), backend());\n      return result;\n   }\n   template <class T>\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<T, self_type>::value, self_type&>::type real(const T& val)\n   {\n      using default_ops::eval_set_real;\n      eval_set_real(backend(), canonical_value(val));\n      return *this;\n   }\n   template <class T>\n   inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_convertible<T, self_type>::value && number_category<self_type>::value == number_kind_complex, self_type&>::type imag(const T& val)\n   {\n      using default_ops::eval_set_imag;\n      eval_set_imag(backend(), canonical_value(val));\n      return *this;\n   }\n\n private:\n   template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_assignable<number, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value>::type \n      do_assign(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e, const std::integral_constant<bool, false>&)\n   {\n      // The result of the expression isn't the same type as this -\n      // create a temporary result and assign it to *this:\n      using temp_type = typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type;\n      temp_type                                                                     t(e);\n      *this = std::move(t);\n   }\n   template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!std::is_assignable<number, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::value>::type \n      do_assign(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e, const std::integral_constant<bool, false>&)\n   {\n      // The result of the expression isn't the same type as this -\n      // create a temporary result and assign it to *this:\n      using temp_type = typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type;\n      temp_type                                                                     t(e);\n      this->assign(t);\n   }\n\n   template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e, const std::integral_constant<bool, true>&)\n   {\n      do_assign(e, tag());\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::add_immediates&)\n   {\n      using default_ops::eval_add;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      eval_add(m_backend, canonical_value(e.left().value()), canonical_value(e.right().value()));\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::subtract_immediates&)\n   {\n      using default_ops::eval_subtract;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      eval_subtract(m_backend, canonical_value(e.left().value()), canonical_value(e.right().value()));\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::multiply_immediates&)\n   {\n      using default_ops::eval_multiply;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      eval_multiply(m_backend, canonical_value(e.left().value()), canonical_value(e.right().value()));\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::multiply_add&)\n   {\n      using default_ops::eval_multiply_add;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      eval_multiply_add(m_backend, canonical_value(e.left().value()), canonical_value(e.middle().value()), canonical_value(e.right().value()));\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::multiply_subtract&)\n   {\n      using default_ops::eval_multiply_subtract;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      eval_multiply_subtract(m_backend, canonical_value(e.left().value()), canonical_value(e.middle().value()), canonical_value(e.right().value()));\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::divide_immediates&)\n   {\n      using default_ops::eval_divide;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      eval_divide(m_backend, canonical_value(e.left().value()), canonical_value(e.right().value()));\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::negate&)\n   {\n      using left_type = typename Exp::left_type;\n      do_assign(e.left(), typename left_type::tag_type());\n      m_backend.negate();\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::plus&)\n   {\n      using left_type = typename Exp::left_type ;\n      using right_type = typename Exp::right_type;\n\n      constexpr int const left_depth  = left_type::depth;\n      constexpr int const right_depth = right_type::depth;\n\n      bool bl = contains_self(e.left());\n      bool br = contains_self(e.right());\n\n      if (bl && br)\n      {\n         self_type temp(e);\n         temp.m_backend.swap(this->m_backend);\n      }\n      else if (bl && is_self(e.left()))\n      {\n         // Ignore the left node, it's *this, just add the right:\n         do_add(e.right(), typename right_type::tag_type());\n      }\n      else if (br && is_self(e.right()))\n      {\n         // Ignore the right node, it's *this, just add the left:\n         do_add(e.left(), typename left_type::tag_type());\n      }\n      else if (!br && (bl || (left_depth >= right_depth)))\n      { // br is always false, but if bl is true we must take the this branch:\n         do_assign(e.left(), typename left_type::tag_type());\n         do_add(e.right(), typename right_type::tag_type());\n      }\n      else\n      {\n         do_assign(e.right(), typename right_type::tag_type());\n         do_add(e.left(), typename left_type::tag_type());\n      }\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::minus&)\n   {\n      using left_type = typename Exp::left_type ;\n      using right_type = typename Exp::right_type;\n\n      constexpr int const left_depth  = left_type::depth;\n      constexpr int const right_depth = right_type::depth;\n\n      bool bl = contains_self(e.left());\n      bool br = contains_self(e.right());\n\n      if (bl && br)\n      {\n         self_type temp(e);\n         temp.m_backend.swap(this->m_backend);\n      }\n      else if (bl && is_self(e.left()))\n      {\n         // Ignore the left node, it's *this, just subtract the right:\n         do_subtract(e.right(), typename right_type::tag_type());\n      }\n      else if (br && is_self(e.right()))\n      {\n         // Ignore the right node, it's *this, just subtract the left and negate the result:\n         do_subtract(e.left(), typename left_type::tag_type());\n         m_backend.negate();\n      }\n      else if (!br && (bl || (left_depth >= right_depth)))\n      { // br is always false, but if bl is true we must take the this branch:\n         do_assign(e.left(), typename left_type::tag_type());\n         do_subtract(e.right(), typename right_type::tag_type());\n      }\n      else\n      {\n         do_assign(e.right(), typename right_type::tag_type());\n         do_subtract(e.left(), typename left_type::tag_type());\n         m_backend.negate();\n      }\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::multiplies&)\n   {\n      using left_type = typename Exp::left_type ;\n      using right_type = typename Exp::right_type;\n\n      constexpr int const left_depth  = left_type::depth;\n      constexpr int const right_depth = right_type::depth;\n\n      bool bl = contains_self(e.left());\n      bool br = contains_self(e.right());\n\n      if (bl && br)\n      {\n         self_type temp(e);\n         temp.m_backend.swap(this->m_backend);\n      }\n      else if (bl && is_self(e.left()))\n      {\n         // Ignore the left node, it's *this, just add the right:\n         do_multiplies(e.right(), typename right_type::tag_type());\n      }\n      else if (br && is_self(e.right()))\n      {\n         // Ignore the right node, it's *this, just add the left:\n         do_multiplies(e.left(), typename left_type::tag_type());\n      }\n      else if (!br && (bl || (left_depth >= right_depth)))\n      { // br is always false, but if bl is true we must take the this branch:\n         do_assign(e.left(), typename left_type::tag_type());\n         do_multiplies(e.right(), typename right_type::tag_type());\n      }\n      else\n      {\n         do_assign(e.right(), typename right_type::tag_type());\n         do_multiplies(e.left(), typename left_type::tag_type());\n      }\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::divides&)\n   {\n      using left_type = typename Exp::left_type ;\n      using right_type = typename Exp::right_type;\n\n      bool bl = contains_self(e.left());\n      bool br = contains_self(e.right());\n\n      if (bl && is_self(e.left()))\n      {\n         // Ignore the left node, it's *this, just add the right:\n         do_divide(e.right(), typename right_type::tag_type());\n      }\n      else if (br)\n      {\n         self_type temp(e);\n         temp.m_backend.swap(this->m_backend);\n      }\n      else\n      {\n         do_assign(e.left(), typename left_type::tag_type());\n         do_divide(e.right(), typename right_type::tag_type());\n      }\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::modulus&)\n   {\n      //\n      // This operation is only valid for integer backends:\n      //\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The modulus operation is only valid for integer types\");\n\n      using left_type = typename Exp::left_type ;\n      using right_type = typename Exp::right_type;\n\n      bool bl = contains_self(e.left());\n      bool br = contains_self(e.right());\n\n      if (bl && is_self(e.left()))\n      {\n         // Ignore the left node, it's *this, just add the right:\n         do_modulus(e.right(), typename right_type::tag_type());\n      }\n      else if (br)\n      {\n         self_type temp(e);\n         temp.m_backend.swap(this->m_backend);\n      }\n      else\n      {\n         do_assign(e.left(), typename left_type::tag_type());\n         do_modulus(e.right(), typename right_type::tag_type());\n      }\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::modulus_immediates&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The modulus operation is only valid for integer types\");\n      using default_ops::eval_modulus;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      eval_modulus(m_backend, canonical_value(e.left().value()), canonical_value(e.right().value()));\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::bitwise_and&)\n   {\n      //\n      // This operation is only valid for integer backends:\n      //\n      static_assert(number_category<Backend>::value == number_kind_integer, \"Bitwise operations are only valid for integer types\");\n\n      using left_type = typename Exp::left_type ;\n      using right_type = typename Exp::right_type;\n\n      constexpr int const left_depth  = left_type::depth;\n      constexpr int const right_depth = right_type::depth;\n\n      bool bl = contains_self(e.left());\n      bool br = contains_self(e.right());\n\n      if (bl && is_self(e.left()))\n      {\n         // Ignore the left node, it's *this, just add the right:\n         do_bitwise_and(e.right(), typename right_type::tag_type());\n      }\n      else if (br && is_self(e.right()))\n      {\n         do_bitwise_and(e.left(), typename left_type::tag_type());\n      }\n      else if (!br && (bl || (left_depth >= right_depth)))\n      {\n         do_assign(e.left(), typename left_type::tag_type());\n         do_bitwise_and(e.right(), typename right_type::tag_type());\n      }\n      else\n      {\n         do_assign(e.right(), typename right_type::tag_type());\n         do_bitwise_and(e.left(), typename left_type::tag_type());\n      }\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::bitwise_and_immediates&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"Bitwise operations are only valid for integer types\");\n      using default_ops::eval_bitwise_and;\n      eval_bitwise_and(m_backend, canonical_value(e.left().value()), canonical_value(e.right().value()));\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::bitwise_or&)\n   {\n      //\n      // This operation is only valid for integer backends:\n      //\n      static_assert(number_category<Backend>::value == number_kind_integer, \"Bitwise operations are only valid for integer types\");\n\n      using left_type = typename Exp::left_type ;\n      using right_type = typename Exp::right_type;\n\n      constexpr int const left_depth  = left_type::depth;\n      constexpr int const right_depth = right_type::depth;\n\n      bool bl = contains_self(e.left());\n      bool br = contains_self(e.right());\n\n      if (bl && is_self(e.left()))\n      {\n         // Ignore the left node, it's *this, just add the right:\n         do_bitwise_or(e.right(), typename right_type::tag_type());\n      }\n      else if (br && is_self(e.right()))\n      {\n         do_bitwise_or(e.left(), typename left_type::tag_type());\n      }\n      else if (!br && (bl || (left_depth >= right_depth)))\n      {\n         do_assign(e.left(), typename left_type::tag_type());\n         do_bitwise_or(e.right(), typename right_type::tag_type());\n      }\n      else\n      {\n         do_assign(e.right(), typename right_type::tag_type());\n         do_bitwise_or(e.left(), typename left_type::tag_type());\n      }\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::bitwise_or_immediates&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"Bitwise operations are only valid for integer types\");\n      using default_ops::eval_bitwise_or;\n      eval_bitwise_or(m_backend, canonical_value(e.left().value()), canonical_value(e.right().value()));\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::bitwise_xor&)\n   {\n      //\n      // This operation is only valid for integer backends:\n      //\n      static_assert(number_category<Backend>::value == number_kind_integer, \"Bitwise operations are only valid for integer types\");\n\n      using left_type = typename Exp::left_type ;\n      using right_type = typename Exp::right_type;\n\n      constexpr int const left_depth  = left_type::depth;\n      constexpr int const right_depth = right_type::depth;\n\n      bool bl = contains_self(e.left());\n      bool br = contains_self(e.right());\n\n      if (bl && is_self(e.left()))\n      {\n         // Ignore the left node, it's *this, just add the right:\n         do_bitwise_xor(e.right(), typename right_type::tag_type());\n      }\n      else if (br && is_self(e.right()))\n      {\n         do_bitwise_xor(e.left(), typename left_type::tag_type());\n      }\n      else if (!br && (bl || (left_depth >= right_depth)))\n      {\n         do_assign(e.left(), typename left_type::tag_type());\n         do_bitwise_xor(e.right(), typename right_type::tag_type());\n      }\n      else\n      {\n         do_assign(e.right(), typename right_type::tag_type());\n         do_bitwise_xor(e.left(), typename left_type::tag_type());\n      }\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::bitwise_xor_immediates&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"Bitwise operations are only valid for integer types\");\n      using default_ops::eval_bitwise_xor;\n      eval_bitwise_xor(m_backend, canonical_value(e.left().value()), canonical_value(e.right().value()));\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::terminal&)\n   {\n      if (!is_self(e))\n      {\n         m_backend = canonical_value(e.value());\n      }\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::function&)\n   {\n      using tag_type = typename Exp::arity;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      do_assign_function(e, tag_type());\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::shift_left&)\n   {\n      // We can only shift by an integer value, not an arbitrary expression:\n      using left_type = typename Exp::left_type   ;\n      using right_type = typename Exp::right_type  ;\n      using right_arity = typename right_type::arity;\n      static_assert(right_arity::value == 0, \"The left shift operator requires an integer value for the shift operand.\");\n      using right_value_type = typename right_type::result_type;\n      static_assert(boost::multiprecision::detail::is_integral<right_value_type>::value, \"The left shift operator requires an integer value for the shift operand.\");\n      using tag_type = typename left_type::tag_type;\n      do_assign_left_shift(e.left(), canonical_value(e.right().value()), tag_type());\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::shift_right&)\n   {\n      // We can only shift by an integer value, not an arbitrary expression:\n      using left_type = typename Exp::left_type   ;\n      using right_type = typename Exp::right_type  ;\n      using right_arity = typename right_type::arity;\n      static_assert(right_arity::value == 0, \"The left shift operator requires an integer value for the shift operand.\");\n      using right_value_type = typename right_type::result_type;\n      static_assert(boost::multiprecision::detail::is_integral<right_value_type>::value, \"The left shift operator requires an integer value for the shift operand.\");\n      using tag_type = typename left_type::tag_type;\n      do_assign_right_shift(e.left(), canonical_value(e.right().value()), tag_type());\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::bitwise_complement&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The bitwise ~ operation is only valid for integer types\");\n      using default_ops::eval_complement;\n      self_type temp(e.left());\n      eval_complement(m_backend, temp.backend());\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign(const Exp& e, const detail::complement_immediates&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The bitwise ~ operation is only valid for integer types\");\n      using default_ops::eval_complement;\n      eval_complement(m_backend, canonical_value(e.left().value()));\n   }\n\n   template <class Exp, class Val>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_right_shift(const Exp& e, const Val& val, const detail::terminal&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The right shift operation is only valid for integer types\");\n      using default_ops::eval_right_shift;\n      detail::check_shift_range(val, std::integral_constant<bool, (sizeof(Val) > sizeof(std::size_t))>(), std::integral_constant<bool, boost::multiprecision::detail::is_signed<Val>::value&& boost::multiprecision::detail::is_integral<Val>::value>());\n      eval_right_shift(m_backend, canonical_value(e.value()), static_cast<std::size_t>(val));\n   }\n\n   template <class Exp, class Val>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_left_shift(const Exp& e, const Val& val, const detail::terminal&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The left shift operation is only valid for integer types\");\n      using default_ops::eval_left_shift;\n      detail::check_shift_range(val, std::integral_constant<bool, (sizeof(Val) > sizeof(std::size_t))>(), std::integral_constant<bool, boost::multiprecision::detail::is_signed<Val>::value&& boost::multiprecision::detail::is_integral<Val>::value>());\n      eval_left_shift(m_backend, canonical_value(e.value()), static_cast<std::size_t>(val));\n   }\n\n   template <class Exp, class Val, class Tag>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_right_shift(const Exp& e, const Val& val, const Tag&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The right shift operation is only valid for integer types\");\n      using default_ops::eval_right_shift;\n      self_type temp(e);\n      detail::check_shift_range(val, std::integral_constant<bool, (sizeof(Val) > sizeof(std::size_t))>(), std::integral_constant<bool, boost::multiprecision::detail::is_signed<Val>::value&& boost::multiprecision::detail::is_integral<Val>::value>());\n      eval_right_shift(m_backend, temp.backend(), static_cast<std::size_t>(val));\n   }\n\n   template <class Exp, class Val, class Tag>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_left_shift(const Exp& e, const Val& val, const Tag&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The left shift operation is only valid for integer types\");\n      using default_ops::eval_left_shift;\n      self_type temp(e);\n      detail::check_shift_range(val, std::integral_constant<bool, (sizeof(Val) > sizeof(std::size_t))>(), std::integral_constant<bool, boost::multiprecision::detail::is_signed<Val>::value&& boost::multiprecision::detail::is_integral<Val>::value>());\n      eval_left_shift(m_backend, temp.backend(), static_cast<std::size_t>(val));\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_function(const Exp& e, const std::integral_constant<int, 1>&)\n   {\n      e.left().value()(&m_backend);\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_function(const Exp& e, const std::integral_constant<int, 2>&)\n   {\n      using right_type = typename Exp::right_type     ;\n      using tag_type = typename right_type::tag_type;\n      do_assign_function_1(e.left().value(), e.right_ref(), tag_type());\n   }\n   template <class F, class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_function_1(const F& f, const Exp& val, const detail::terminal&)\n   {\n      f(m_backend, function_arg_value(val));\n   }\n   template <class F, class Exp, class Tag>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_function_1(const F& f, const Exp& val, const Tag&)\n   {\n      typename Exp::result_type t(val);\n      f(m_backend, t.backend());\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_function(const Exp& e, const std::integral_constant<int, 3>&)\n   {\n      using middle_type = typename Exp::middle_type     ;\n      using tag_type = typename middle_type::tag_type;\n      using end_type = typename Exp::right_type      ;\n      using end_tag = typename end_type::tag_type   ;\n      do_assign_function_2(e.left().value(), e.middle_ref(), e.right_ref(), tag_type(), end_tag());\n   }\n   template <class F, class Exp1, class Exp2>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_function_2(const F& f, const Exp1& val1, const Exp2& val2, const detail::terminal&, const detail::terminal&)\n   {\n      f(m_backend, function_arg_value(val1), function_arg_value(val2));\n   }\n   template <class F, class Exp1, class Exp2, class Tag1>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_function_2(const F& f, const Exp1& val1, const Exp2& val2, const Tag1&, const detail::terminal&)\n   {\n      typename Exp1::result_type temp1(val1);\n      f(m_backend, std::move(temp1.backend()), function_arg_value(val2));\n   }\n   template <class F, class Exp1, class Exp2, class Tag2>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_function_2(const F& f, const Exp1& val1, const Exp2& val2, const detail::terminal&, const Tag2&)\n   {\n      typename Exp2::result_type temp2(val2);\n      f(m_backend, function_arg_value(val1), std::move(temp2.backend()));\n   }\n   template <class F, class Exp1, class Exp2, class Tag1, class Tag2>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_function_2(const F& f, const Exp1& val1, const Exp2& val2, const Tag1&, const Tag2&)\n   {\n      typename Exp1::result_type temp1(val1);\n      typename Exp2::result_type temp2(val2);\n      f(m_backend, std::move(temp1.backend()), std::move(temp2.backend()));\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_function(const Exp& e, const std::integral_constant<int, 4>&)\n   {\n      using left_type = typename Exp::left_middle_type ;\n      using left_tag_type = typename left_type::tag_type   ;\n      using middle_type = typename Exp::right_middle_type;\n      using middle_tag_type = typename middle_type::tag_type ;\n      using right_type = typename Exp::right_type       ;\n      using right_tag_type = typename right_type::tag_type  ;\n      do_assign_function_3a(e.left().value(), e.left_middle_ref(), e.right_middle_ref(), e.right_ref(), left_tag_type(), middle_tag_type(), right_tag_type());\n   }\n\n   template <class F, class Exp1, class Exp2, class Exp3, class Tag2, class Tag3>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_function_3a(const F& f, const Exp1& val1, const Exp2& val2, const Exp3& val3, const detail::terminal&, const Tag2& t2, const Tag3& t3)\n   {\n      do_assign_function_3b(f, val1, val2, val3, t2, t3);\n   }\n   template <class F, class Exp1, class Exp2, class Exp3, class Tag1, class Tag2, class Tag3>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_function_3a(const F& f, const Exp1& val1, const Exp2& val2, const Exp3& val3, const Tag1&, const Tag2& t2, const Tag3& t3)\n   {\n      typename Exp1::result_type t(val1);\n      do_assign_function_3b(f, std::move(t), val2, val3, t2, t3);\n   }\n   template <class F, class Exp1, class Exp2, class Exp3, class Tag3>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_function_3b(const F& f, const Exp1& val1, const Exp2& val2, const Exp3& val3, const detail::terminal&, const Tag3& t3)\n   {\n      do_assign_function_3c(f, val1, val2, val3, t3);\n   }\n   template <class F, class Exp1, class Exp2, class Exp3, class Tag2, class Tag3>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_function_3b(const F& f, const Exp1& val1, const Exp2& val2, const Exp3& val3, const Tag2& /*t2*/, const Tag3& t3)\n   {\n      typename Exp2::result_type t(val2);\n      do_assign_function_3c(f, val1, std::move(t), val3, t3);\n   }\n   template <class F, class Exp1, class Exp2, class Exp3>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_function_3c(const F& f, const Exp1& val1, const Exp2& val2, const Exp3& val3, const detail::terminal&)\n   {\n      f(m_backend, function_arg_value(val1), function_arg_value(val2), function_arg_value(val3));\n   }\n   template <class F, class Exp1, class Exp2, class Exp3, class Tag3>\n   BOOST_MP_CXX14_CONSTEXPR void do_assign_function_3c(const F& f, const Exp1& val1, const Exp2& val2, const Exp3& val3, const Tag3& /*t3*/)\n   {\n      typename Exp3::result_type t(val3);\n      do_assign_function_3c(f, val1, val2, std::move(t), detail::terminal());\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_add(const Exp& e, const detail::terminal&)\n   {\n      using default_ops::eval_add;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      eval_add(m_backend, canonical_value(e.value()));\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_add(const Exp& e, const detail::negate&)\n   {\n      using left_type = typename Exp::left_type;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      do_subtract(e.left(), typename left_type::tag_type());\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_add(const Exp& e, const detail::plus&)\n   {\n      using left_type = typename Exp::left_type ;\n      using right_type = typename Exp::right_type;\n      do_add(e.left(), typename left_type::tag_type());\n      do_add(e.right(), typename right_type::tag_type());\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_add(const Exp& e, const detail::minus&)\n   {\n      using left_type = typename Exp::left_type ;\n      using right_type = typename Exp::right_type;\n      do_add(e.left(), typename left_type::tag_type());\n      do_subtract(e.right(), typename right_type::tag_type());\n   }\n\n   template <class Exp, class unknown>\n   BOOST_MP_CXX14_CONSTEXPR void do_add(const Exp& e, const unknown&)\n   {\n      self_type temp(e);\n      do_add(detail::expression<detail::terminal, self_type>(temp), detail::terminal());\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_add(const Exp& e, const detail::add_immediates&)\n   {\n      using default_ops::eval_add;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      eval_add(m_backend, canonical_value(e.left().value()));\n      eval_add(m_backend, canonical_value(e.right().value()));\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_add(const Exp& e, const detail::subtract_immediates&)\n   {\n      using default_ops::eval_add;\n      using default_ops::eval_subtract;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      eval_add(m_backend, canonical_value(e.left().value()));\n      eval_subtract(m_backend, canonical_value(e.right().value()));\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_subtract(const Exp& e, const detail::terminal&)\n   {\n      using default_ops::eval_subtract;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      eval_subtract(m_backend, canonical_value(e.value()));\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_subtract(const Exp& e, const detail::negate&)\n   {\n      using left_type = typename Exp::left_type;\n      do_add(e.left(), typename left_type::tag_type());\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_subtract(const Exp& e, const detail::plus&)\n   {\n      using left_type = typename Exp::left_type ;\n      using right_type = typename Exp::right_type;\n      do_subtract(e.left(), typename left_type::tag_type());\n      do_subtract(e.right(), typename right_type::tag_type());\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_subtract(const Exp& e, const detail::minus&)\n   {\n      using left_type = typename Exp::left_type ;\n      using right_type = typename Exp::right_type;\n      do_subtract(e.left(), typename left_type::tag_type());\n      do_add(e.right(), typename right_type::tag_type());\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_subtract(const Exp& e, const detail::add_immediates&)\n   {\n      using default_ops::eval_subtract;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      eval_subtract(m_backend, canonical_value(e.left().value()));\n      eval_subtract(m_backend, canonical_value(e.right().value()));\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_subtract(const Exp& e, const detail::subtract_immediates&)\n   {\n      using default_ops::eval_add;\n      using default_ops::eval_subtract;\n      eval_subtract(m_backend, canonical_value(e.left().value()));\n      eval_add(m_backend, canonical_value(e.right().value()));\n   }\n   template <class Exp, class unknown>\n   BOOST_MP_CXX14_CONSTEXPR void do_subtract(const Exp& e, const unknown&)\n   {\n      self_type temp(e);\n      do_subtract(detail::expression<detail::terminal, self_type>(temp), detail::terminal());\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_multiplies(const Exp& e, const detail::terminal&)\n   {\n      using default_ops::eval_multiply;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      eval_multiply(m_backend, canonical_value(e.value()));\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_multiplies(const Exp& e, const detail::negate&)\n   {\n      using left_type = typename Exp::left_type;\n      do_multiplies(e.left(), typename left_type::tag_type());\n      m_backend.negate();\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_multiplies(const Exp& e, const detail::multiplies&)\n   {\n      using left_type = typename Exp::left_type ;\n      using right_type = typename Exp::right_type;\n      do_multiplies(e.left(), typename left_type::tag_type());\n      do_multiplies(e.right(), typename right_type::tag_type());\n   }\n   //\n   // This rearrangement is disabled for integer types, the test on sizeof(Exp) is simply to make\n   // the disable_if dependent on the template argument (the size of 1 can never occur in practice).\n   //\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!(boost::multiprecision::number_category<self_type>::value == boost::multiprecision::number_kind_integer || sizeof(Exp) == 1)>::type\n   do_multiplies(const Exp& e, const detail::divides&)\n   {\n      using left_type = typename Exp::left_type ;\n      using right_type = typename Exp::right_type;\n      do_multiplies(e.left(), typename left_type::tag_type());\n      do_divide(e.right(), typename right_type::tag_type());\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_multiplies(const Exp& e, const detail::multiply_immediates&)\n   {\n      using default_ops::eval_multiply;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      eval_multiply(m_backend, canonical_value(e.left().value()));\n      eval_multiply(m_backend, canonical_value(e.right().value()));\n   }\n   //\n   // This rearrangement is disabled for integer types, the test on sizeof(Exp) is simply to make\n   // the disable_if dependent on the template argument (the size of 1 can never occur in practice).\n   //\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!(boost::multiprecision::number_category<self_type>::value == boost::multiprecision::number_kind_integer || sizeof(Exp) == 1)>::type\n   do_multiplies(const Exp& e, const detail::divide_immediates&)\n   {\n      using default_ops::eval_divide;\n      using default_ops::eval_multiply;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      eval_multiply(m_backend, canonical_value(e.left().value()));\n      eval_divide(m_backend, canonical_value(e.right().value()));\n   }\n   template <class Exp, class unknown>\n   BOOST_MP_CXX14_CONSTEXPR void do_multiplies(const Exp& e, const unknown&)\n   {\n      using default_ops::eval_multiply;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      self_type temp(e);\n      eval_multiply(m_backend, temp.m_backend);\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_divide(const Exp& e, const detail::terminal&)\n   {\n      using default_ops::eval_divide;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      eval_divide(m_backend, canonical_value(e.value()));\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_divide(const Exp& e, const detail::negate&)\n   {\n      using left_type = typename Exp::left_type;\n      do_divide(e.left(), typename left_type::tag_type());\n      m_backend.negate();\n   }\n   //\n   // This rearrangement is disabled for integer types, the test on sizeof(Exp) is simply to make\n   // the disable_if dependent on the template argument (the size of 1 can never occur in practice).\n   //\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!(boost::multiprecision::number_category<self_type>::value == boost::multiprecision::number_kind_integer || sizeof(Exp) == 1)>::type\n   do_divide(const Exp& e, const detail::multiplies&)\n   {\n      using left_type = typename Exp::left_type ;\n      using right_type = typename Exp::right_type;\n      do_divide(e.left(), typename left_type::tag_type());\n      do_divide(e.right(), typename right_type::tag_type());\n   }\n   //\n   // This rearrangement is disabled for integer types, the test on sizeof(Exp) is simply to make\n   // the disable_if dependent on the template argument (the size of 1 can never occur in practice).\n   //\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!(boost::multiprecision::number_category<self_type>::value == boost::multiprecision::number_kind_integer || sizeof(Exp) == 1)>::type\n   do_divide(const Exp& e, const detail::divides&)\n   {\n      using left_type = typename Exp::left_type ;\n      using right_type = typename Exp::right_type;\n      do_divide(e.left(), typename left_type::tag_type());\n      do_multiplies(e.right(), typename right_type::tag_type());\n   }\n   //\n   // This rearrangement is disabled for integer types, the test on sizeof(Exp) is simply to make\n   // the disable_if dependent on the template argument (the size of 1 can never occur in practice).\n   //\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!(boost::multiprecision::number_category<self_type>::value == boost::multiprecision::number_kind_integer || sizeof(Exp) == 1)>::type\n   do_divides(const Exp& e, const detail::multiply_immediates&)\n   {\n      using default_ops::eval_divide;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      eval_divide(m_backend, canonical_value(e.left().value()));\n      eval_divide(m_backend, canonical_value(e.right().value()));\n   }\n   //\n   // This rearrangement is disabled for integer types, the test on sizeof(Exp) is simply to make\n   // the disable_if dependent on the template argument (the size of 1 can never occur in practice).\n   //\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!(boost::multiprecision::number_category<self_type>::value == boost::multiprecision::number_kind_integer || sizeof(Exp) == 1)>::type\n   do_divides(const Exp& e, const detail::divide_immediates&)\n   {\n      using default_ops::eval_divide;\n      using default_ops::eval_multiply;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      eval_divide(m_backend, canonical_value(e.left().value()));\n      mutiply(m_backend, canonical_value(e.right().value()));\n   }\n\n   template <class Exp, class unknown>\n   BOOST_MP_CXX14_CONSTEXPR void do_divide(const Exp& e, const unknown&)\n   {\n      using default_ops::eval_multiply;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      self_type temp(e);\n      eval_divide(m_backend, temp.m_backend);\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_modulus(const Exp& e, const detail::terminal&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The modulus operation is only valid for integer types\");\n      using default_ops::eval_modulus;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      eval_modulus(m_backend, canonical_value(e.value()));\n   }\n\n   template <class Exp, class Unknown>\n   BOOST_MP_CXX14_CONSTEXPR void do_modulus(const Exp& e, const Unknown&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The modulus operation is only valid for integer types\");\n      using default_ops::eval_modulus;\n      boost::multiprecision::detail::maybe_promote_precision(this);\n      self_type temp(e);\n      eval_modulus(m_backend, canonical_value(temp));\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_bitwise_and(const Exp& e, const detail::terminal&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The bitwise & operation is only valid for integer types\");\n      using default_ops::eval_bitwise_and;\n      eval_bitwise_and(m_backend, canonical_value(e.value()));\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_bitwise_and(const Exp& e, const detail::bitwise_and&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The bitwise & operation is only valid for integer types\");\n      using left_type = typename Exp::left_type ;\n      using right_type = typename Exp::right_type;\n      do_bitwise_and(e.left(), typename left_type::tag_type());\n      do_bitwise_and(e.right(), typename right_type::tag_type());\n   }\n   template <class Exp, class unknown>\n   BOOST_MP_CXX14_CONSTEXPR void do_bitwise_and(const Exp& e, const unknown&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The bitwise & operation is only valid for integer types\");\n      using default_ops::eval_bitwise_and;\n      self_type temp(e);\n      eval_bitwise_and(m_backend, temp.m_backend);\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_bitwise_or(const Exp& e, const detail::terminal&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The bitwise | operation is only valid for integer types\");\n      using default_ops::eval_bitwise_or;\n      eval_bitwise_or(m_backend, canonical_value(e.value()));\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_bitwise_or(const Exp& e, const detail::bitwise_or&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The bitwise | operation is only valid for integer types\");\n      using left_type = typename Exp::left_type ;\n      using right_type = typename Exp::right_type;\n      do_bitwise_or(e.left(), typename left_type::tag_type());\n      do_bitwise_or(e.right(), typename right_type::tag_type());\n   }\n   template <class Exp, class unknown>\n   BOOST_MP_CXX14_CONSTEXPR void do_bitwise_or(const Exp& e, const unknown&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The bitwise | operation is only valid for integer types\");\n      using default_ops::eval_bitwise_or;\n      self_type temp(e);\n      eval_bitwise_or(m_backend, temp.m_backend);\n   }\n\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_bitwise_xor(const Exp& e, const detail::terminal&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The bitwise ^ operation is only valid for integer types\");\n      using default_ops::eval_bitwise_xor;\n      eval_bitwise_xor(m_backend, canonical_value(e.value()));\n   }\n   template <class Exp>\n   BOOST_MP_CXX14_CONSTEXPR void do_bitwise_xor(const Exp& e, const detail::bitwise_xor&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The bitwise ^ operation is only valid for integer types\");\n      using left_type = typename Exp::left_type ;\n      using right_type = typename Exp::right_type;\n      do_bitwise_xor(e.left(), typename left_type::tag_type());\n      do_bitwise_xor(e.right(), typename right_type::tag_type());\n   }\n   template <class Exp, class unknown>\n   BOOST_MP_CXX14_CONSTEXPR void do_bitwise_xor(const Exp& e, const unknown&)\n   {\n      static_assert(number_category<Backend>::value == number_kind_integer, \"The bitwise ^ operation is only valid for integer types\");\n      using default_ops::eval_bitwise_xor;\n      self_type temp(e);\n      eval_bitwise_xor(m_backend, temp.m_backend);\n   }\n\n   // Tests if the expression contains a reference to *this:\n   template <class Exp>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR bool contains_self(const Exp& e) const noexcept\n   {\n      return contains_self(e, typename Exp::arity());\n   }\n   template <class Exp>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR bool contains_self(const Exp& e, std::integral_constant<int, 0> const&) const noexcept\n   {\n      return is_realy_self(e.value());\n   }\n   template <class Exp>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR bool contains_self(const Exp& e, std::integral_constant<int, 1> const&) const noexcept\n   {\n      using child_type = typename Exp::left_type;\n      return contains_self(e.left(), typename child_type::arity());\n   }\n   template <class Exp>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR bool contains_self(const Exp& e, std::integral_constant<int, 2> const&) const noexcept\n   {\n      using child0_type = typename Exp::left_type ;\n      using child1_type = typename Exp::right_type;\n      return contains_self(e.left(), typename child0_type::arity()) || contains_self(e.right(), typename child1_type::arity());\n   }\n   template <class Exp>\n   BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR bool contains_self(const Exp& e, std::integral_constant<int, 3> const&) const noexcept\n   {\n      using child0_type = typename Exp::left_type  ;\n      using child1_type = typename Exp::middle_type;\n      using child2_type = typename Exp::right_type ;\n      return contains_self(e.left(), typename child0_type::arity()) || contains_self(e.middle(), typename child1_type::arity()) || contains_self(e.right(), typename child2_type::arity());\n   }\n\n   // Test if the expression is a reference to *this:\n   template <class Exp>\n   BOOST_MP_FORCEINLINE constexpr bool is_self(const Exp& e) const noexcept\n   {\n      return is_self(e, typename Exp::arity());\n   }\n   template <class Exp>\n   BOOST_MP_FORCEINLINE constexpr bool is_self(const Exp& e, std::integral_constant<int, 0> const&) const noexcept\n   {\n      return is_realy_self(e.value());\n   }\n   template <class Exp, int v>\n   BOOST_MP_FORCEINLINE constexpr bool is_self(const Exp&, std::integral_constant<int, v> const&) const noexcept\n   {\n      return false;\n   }\n\n   template <class Val>\n   BOOST_MP_FORCEINLINE constexpr bool is_realy_self(const Val&) const noexcept { return false; }\n   BOOST_MP_FORCEINLINE constexpr bool is_realy_self(const self_type& v) const noexcept { return &v == this; }\n\n   static BOOST_MP_FORCEINLINE constexpr const Backend& function_arg_value(const self_type& v) noexcept { return v.backend(); }\n   template <class Other, expression_template_option ET2>\n   static BOOST_MP_FORCEINLINE constexpr const Other& function_arg_value(const number<Other, ET2>& v) noexcept { return v.backend(); }\n   template <class V>\n   static BOOST_MP_FORCEINLINE constexpr const V& function_arg_value(const V& v) noexcept { return v; }\n   template <class A1, class A2, class A3, class A4>\n   static BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR const A1& function_arg_value(const detail::expression<detail::terminal, A1, A2, A3, A4>& exp) noexcept { return exp.value(); }\n   template <class A2, class A3, class A4>\n   static BOOST_MP_FORCEINLINE constexpr const Backend& function_arg_value(const detail::expression<detail::terminal, number<Backend>, A2, A3, A4>& exp) noexcept { return exp.value().backend(); }\n   Backend                                                    m_backend;\n\n public:\n   //\n   // These shouldn't really need to be public, or even member functions, but it makes implementing\n   // the non-member operators way easier if they are:\n   //\n   static BOOST_MP_FORCEINLINE constexpr const Backend& canonical_value(const self_type& v) noexcept { return v.m_backend; }\n   template <class B2, expression_template_option ET>\n   static BOOST_MP_FORCEINLINE constexpr const B2& canonical_value(const number<B2, ET>& v) noexcept { return v.backend(); }\n   template <class B2, expression_template_option ET>\n   static BOOST_MP_FORCEINLINE constexpr B2&& canonical_value(number<B2, ET>&& v) noexcept { return static_cast<number<B2, ET>&&>(v).backend(); }\n   template <class V>\n   static BOOST_MP_FORCEINLINE constexpr typename std::enable_if<!std::is_same<typename detail::canonical<V, Backend>::type, V>::value, typename detail::canonical<V, Backend>::type>::type\n   canonical_value(const V& v) noexcept { return static_cast<typename detail::canonical<V, Backend>::type>(v); }\n   template <class V>\n   static BOOST_MP_FORCEINLINE constexpr typename std::enable_if<std::is_same<typename detail::canonical<V, Backend>::type, V>::value, const V&>::type\n   canonical_value(const V& v) noexcept { return v; }\n   static BOOST_MP_FORCEINLINE typename detail::canonical<std::string, Backend>::type canonical_value(const std::string& v) noexcept { return v.c_str(); }\n};\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\ninline std::ostream& operator<<(std::ostream& os, const number<Backend, ExpressionTemplates>& r)\n{\n   std::streamsize d  = os.precision();\n   std::string     s  = r.str(d, os.flags());\n   std::streamsize ss = os.width();\n   if (ss > static_cast<std::streamsize>(s.size()))\n   {\n      char fill = os.fill();\n      if ((os.flags() & std::ios_base::left) == std::ios_base::left)\n         s.append(static_cast<std::string::size_type>(ss - static_cast<std::streamsize>(s.size())), fill);\n      else\n         s.insert(static_cast<std::string::size_type>(0), static_cast<std::string::size_type>(ss - static_cast<std::streamsize>(s.size())), fill);\n   }\n   return os << s;\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\nstd::string to_string(const number<Backend, ExpressionTemplates>& val)\n{\n  return val.str(6, std::ios_base::fixed|std::ios_base::showpoint);\n}\n\nnamespace detail {\n\ntemplate <class tag, class A1, class A2, class A3, class A4>\ninline std::ostream& operator<<(std::ostream& os, const expression<tag, A1, A2, A3, A4>& r)\n{\n   using value_type = typename expression<tag, A1, A2, A3, A4>::result_type;\n   value_type                                                    temp(r);\n   return os << temp;\n}\n//\n// What follows is the input streaming code: this is not \"proper\" iostream code at all\n// but that's fiendishly hard to write when dealing with multiple backends all\n// with different requirements... yes we could deligate this to the backend author...\n// but we really want backends to be EASY to write!\n// For now just pull in all the characters that could possibly form the number\n// and let the backend's string parser make use of it.  This fixes most use cases\n// including CSV type formats such as those used by the Random lib.\n//\ninline std::string read_string_while(std::istream& is, std::string const& permitted_chars)\n{\n   std::ios_base::iostate     state = std::ios_base::goodbit;\n   const std::istream::sentry sentry_check(is);\n   std::string                result;\n\n   if (sentry_check)\n   {\n      int c = is.rdbuf()->sgetc();\n\n      for (;; c = is.rdbuf()->snextc())\n         if (std::istream::traits_type::eq_int_type(std::istream::traits_type::eof(), c))\n         { // end of file:\n            state |= std::ios_base::eofbit;\n            break;\n         }\n         else if (permitted_chars.find_first_of(std::istream::traits_type::to_char_type(c)) == std::string::npos)\n         {\n            // Invalid numeric character, stop reading:\n            //is.rdbuf()->sputbackc(static_cast<char>(c));\n            break;\n         }\n         else\n         {\n            result.append(1, std::istream::traits_type::to_char_type(c));\n         }\n   }\n\n   if (!result.size())\n      state |= std::ios_base::failbit;\n   is.setstate(state);\n   return result;\n}\n\n} // namespace detail\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\ninline std::istream& operator>>(std::istream& is, number<Backend, ExpressionTemplates>& r)\n{\n   bool        hex_format = (is.flags() & std::ios_base::hex) == std::ios_base::hex;\n   bool        oct_format = (is.flags() & std::ios_base::oct) == std::ios_base::oct;\n   std::string s;\n   switch (boost::multiprecision::number_category<number<Backend, ExpressionTemplates> >::value)\n   {\n   case boost::multiprecision::number_kind_integer:\n      if (oct_format)\n         s = detail::read_string_while(is, \"+-01234567\");\n      else if (hex_format)\n         s = detail::read_string_while(is, \"+-xXabcdefABCDEF0123456789\");\n      else\n         s = detail::read_string_while(is, \"+-0123456789\");\n      break;\n   case boost::multiprecision::number_kind_rational:\n      if (oct_format)\n         s = detail::read_string_while(is, \"+-01234567/\");\n      else if (hex_format)\n         s = detail::read_string_while(is, \"+-xXabcdefABCDEF0123456789/\");\n      else\n         s = detail::read_string_while(is, \"+-0123456789/\");\n      break;\n   case boost::multiprecision::number_kind_floating_point:\n      BOOST_IF_CONSTEXPR(std::is_same<number<Backend, ExpressionTemplates>, typename number<Backend, ExpressionTemplates>::value_type>::value)\n         s = detail::read_string_while(is, \"+-eE.0123456789infINFnanNANinfinityINFINITY\");\n      else\n         // Interval:\n         s = detail::read_string_while(is, \"+-eE.0123456789infINFnanNANinfinityINFINITY{,}\");\n      break;\n   case boost::multiprecision::number_kind_complex:\n      s = detail::read_string_while(is, \"+-eE.0123456789infINFnanNANinfinityINFINITY,()\");\n      break;\n   default:\n      is >> s;\n   }\n   if (s.size())\n   {\n      if (hex_format && (number_category<Backend>::value == number_kind_integer) && ((s[0] != '0') || (s[1] != 'x')))\n         s.insert(s.find_first_not_of(\"+-\"), \"0x\");\n      if (oct_format && (number_category<Backend>::value == number_kind_integer) && (s[0] != '0'))\n         s.insert(s.find_first_not_of(\"+-\"), \"0\");\n      r.assign(s);\n   }\n   else if (!is.fail())\n      is.setstate(std::istream::failbit);\n   return is;\n}\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\nBOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void swap(number<Backend, ExpressionTemplates>& a, number<Backend, ExpressionTemplates>& b)\n    noexcept(noexcept(std::declval<number<Backend, ExpressionTemplates>&>() = std::declval<number<Backend, ExpressionTemplates>&>()))\n{\n   a.swap(b);\n}\n//\n// Boost.Hash support, just call hash_value for the backend, which may or may not be supported:\n//\ntemplate <class Backend, expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR std::size_t hash_value(const number<Backend, ExpressionTemplates>& val)\n{\n   return hash_value(val.backend());\n}\n\nnamespace detail {\n\nBOOST_MP_FORCEINLINE bool istream_peek(std::istream& is, char& c, bool have_hex)\n{\n   int i = is.peek();\n   c = static_cast<char>(i);\n   return (EOF != i) && (c == 'x' || c == 'X' || c == '-' || c == '+' || (c >= '0' && c <= '9') || (have_hex && (c >= 'a' && c <= 'f')) || (have_hex && (c >= 'A' && c <= 'F')));\n}\n\n} // namespace detail\n\n} // namespace multiprecision\n\ntemplate <class T>\nclass rational;\n\ntemplate <class Backend, multiprecision::expression_template_option ExpressionTemplates>\ninline std::istream& operator>>(std::istream& is, rational<multiprecision::number<Backend, ExpressionTemplates> >& r)\n{\n   std::string                                          s1;\n   multiprecision::number<Backend, ExpressionTemplates> v1, v2;\n   char                                                 c;\n   bool                                                 have_hex   = false;\n   bool                                                 hex_format = (is.flags() & std::ios_base::hex) == std::ios_base::hex;\n   bool                                                 oct_format = (is.flags() & std::ios_base::oct) == std::ios_base::oct;\n\n   while (multiprecision::detail::istream_peek(is, c, have_hex))\n   {\n      if (c == 'x' || c == 'X')\n         have_hex = true;\n      s1.append(1, c);\n      is.get();\n   }\n   if (hex_format && ((s1[0] != '0') || (s1[1] != 'x')))\n      s1.insert(static_cast<std::string::size_type>(0), \"0x\");\n   if (oct_format && (s1[0] != '0'))\n      s1.insert(static_cast<std::string::size_type>(0), \"0\");\n   v1.assign(s1);\n   s1.erase();\n   if (c == '/')\n   {\n      is.get();\n      while (multiprecision::detail::istream_peek(is, c, have_hex))\n      {\n         if (c == 'x' || c == 'X')\n            have_hex = true;\n         s1.append(1, c);\n         is.get();\n      }\n      if (hex_format && ((s1[0] != '0') || (s1[1] != 'x')))\n         s1.insert(static_cast<std::string::size_type>(0), \"0x\");\n      if (oct_format && (s1[0] != '0'))\n         s1.insert(static_cast<std::string::size_type>(0), \"0\");\n      v2.assign(s1);\n   }\n   else\n      v2 = 1;\n   r.assign(v1, v2);\n   return is;\n}\n\ntemplate <class T, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR multiprecision::number<T, ExpressionTemplates> numerator(const rational<multiprecision::number<T, ExpressionTemplates> >& a)\n{\n   return a.numerator();\n}\n\ntemplate <class T, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR multiprecision::number<T, ExpressionTemplates> denominator(const rational<multiprecision::number<T, ExpressionTemplates> >& a)\n{\n   return a.denominator();\n}\n\ntemplate <class T, multiprecision::expression_template_option ExpressionTemplates>\ninline BOOST_MP_CXX14_CONSTEXPR std::size_t hash_value(const rational<multiprecision::number<T, ExpressionTemplates> >& val)\n{\n   std::size_t result = hash_value(val.numerator());\n   boost::multiprecision::detail::hash_combine(result, hash_value(val.denominator()));\n   return result;\n}\n\nnamespace multiprecision {\n\ntemplate <class I>\nstruct component_type<boost::rational<I> >\n{\n   using type = I;\n};\n\n} // namespace multiprecision\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n} // namespace boost\n\nnamespace std {\n\ntemplate <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct hash<boost::multiprecision::number<Backend, ExpressionTemplates> >\n{\n   BOOST_MP_CXX14_CONSTEXPR std::size_t operator()(const boost::multiprecision::number<Backend, ExpressionTemplates>& val) const { return hash_value(val); }\n};\ntemplate <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct hash<boost::rational<boost::multiprecision::number<Backend, ExpressionTemplates> > >\n{\n   BOOST_MP_CXX14_CONSTEXPR std::size_t operator()(const boost::rational<boost::multiprecision::number<Backend, ExpressionTemplates> >& val) const\n   {\n      std::size_t result = hash_value(val.numerator());\n      boost::multiprecision::detail::hash_combine(result, hash_value(val.denominator()));\n      return result;\n   }\n};\n\n} // namespace std\n\n#include <boost/multiprecision/detail/ublas_interop.hpp>\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/random.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Jens Maurer 2006-2011\n//  Copyright Steven Watanabe 2011\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_RANDOM_HPP\n#define BOOST_MP_RANDOM_HPP\n\n#include <boost/multiprecision/detail/standalone_config.hpp>\n\n#if defined(__GNUC__) || defined(_MSC_VER)\n#pragma message(\"NOTE: Use of this header (boost/multiprecision/random.hpp) is deprecated: please use the random number library headers directly.\")\n#endif\n\n#ifndef BOOST_MP_STANDALONE\n#include <boost/random.hpp>\n#else\n#error \"Use of this header is removed in standalone mode\"\n#endif\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/rational_adaptor.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2020 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_RATIONAL_ADAPTOR_HPP\n#define BOOST_MP_RATIONAL_ADAPTOR_HPP\n\n#include <boost/multiprecision/number.hpp>\n#include <boost/multiprecision/detail/hash.hpp>\n#include <boost/multiprecision/detail/float128_functions.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n\nnamespace boost {\nnamespace multiprecision {\nnamespace backends {\n\ntemplate <class Backend>\nstruct rational_adaptor\n{\n   //\n   // Each backend need to declare 3 type lists which declare the types\n   // with which this can interoperate.  These lists must at least contain\n   // the widest type in each category - so \"long long\" must be the final\n   // type in the signed_types list for example.  Any narrower types if not\n   // present in the list will get promoted to the next wider type that is\n   // in the list whenever mixed arithmetic involving that type is encountered.\n   //\n   typedef typename Backend::signed_types    signed_types;\n   typedef typename Backend::unsigned_types  unsigned_types;\n   typedef typename Backend::float_types     float_types;\n\n   typedef typename std::tuple_element<0, unsigned_types>::type ui_type;\n\n   static Backend get_one()\n   {\n      Backend t;\n      t = static_cast<ui_type>(1);\n      return t;\n   }\n   static Backend get_zero()\n   {\n      Backend t;\n      t = static_cast<ui_type>(0);\n      return t;\n   }\n\n   static const Backend& one()\n   {\n      static const Backend result(get_one());\n      return result;\n   }\n   static const Backend& zero()\n   {\n      static const Backend result(get_zero());\n      return result;\n   }\n\n   void normalize()\n   {\n      using default_ops::eval_gcd;\n      using default_ops::eval_eq;\n      using default_ops::eval_divide;\n      using default_ops::eval_get_sign;\n\n      int s = eval_get_sign(m_denom);\n\n      if(s == 0)\n      {\n         BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Integer division by zero\"));\n      }\n      else if (s < 0)\n      {\n         m_num.negate();\n         m_denom.negate();\n      }\n\n      Backend g, t;\n      eval_gcd(g, m_num, m_denom);\n      if (!eval_eq(g, one()))\n      {\n         eval_divide(t, m_num, g);\n         m_num.swap(t);\n         eval_divide(t, m_denom, g);\n         m_denom = std::move(t);\n      }\n   }\n\n   // We must have a default constructor:\n   rational_adaptor()\n      : m_num(zero()), m_denom(one()) {}\n\n   rational_adaptor(const rational_adaptor& o) : m_num(o.m_num), m_denom(o.m_denom) {}\n   rational_adaptor(rational_adaptor&& o) = default;\n\n   // Optional constructors, we can make this type slightly more efficient\n   // by providing constructors from any type we can handle natively.\n   // These will also cause number<> to be implicitly constructible\n   // from these types unless we make such constructors explicit.\n   //\n   template <class Arithmetic>\n   rational_adaptor(const Arithmetic& val, typename std::enable_if<std::is_constructible<Backend, Arithmetic>::value && !std::is_floating_point<Arithmetic>::value>::type const* = nullptr)\n      : m_num(val), m_denom(one()) {}\n\n   //\n   // Pass-through 2-arg construction of components:\n   //\n   template <class T, class U>\n   rational_adaptor(const T& a, const U& b, typename std::enable_if<std::is_constructible<Backend, T const&>::value && std::is_constructible<Backend, U const&>::value>::type const* = nullptr)\n      : m_num(a), m_denom(b) \n   {\n      normalize();\n   }\n   template <class T, class U>\n   rational_adaptor(T&& a, const U& b, typename std::enable_if<std::is_constructible<Backend, T>::value && std::is_constructible<Backend, U>::value>::type const* = nullptr)\n      : m_num(static_cast<T&&>(a)), m_denom(b) \n   {\n      normalize();\n   }\n   template <class T, class U>\n   rational_adaptor(T&& a, U&& b, typename std::enable_if<std::is_constructible<Backend, T>::value && std::is_constructible<Backend, U>::value>::type const* = nullptr)\n      : m_num(static_cast<T&&>(a)), m_denom(static_cast<U&&>(b)) \n   {\n      normalize();\n   }\n   template <class T, class U>\n   rational_adaptor(const T& a, U&& b, typename std::enable_if<std::is_constructible<Backend, T>::value && std::is_constructible<Backend, U>::value>::type const* = nullptr)\n      : m_num(a), m_denom(static_cast<U&&>(b)) \n   {\n      normalize();\n   }\n   //\n   // In the absense of converting constructors, operator= takes the strain.\n   // In addition to the usual suspects, there must be one operator= for each type\n   // listed in signed_types, unsigned_types, and float_types plus a string constructor.\n   //\n   rational_adaptor& operator=(const rational_adaptor& o) = default;\n   rational_adaptor& operator=(rational_adaptor&& o) = default;\n   template <class Arithmetic>\n   inline typename std::enable_if<!std::is_floating_point<Arithmetic>::value, rational_adaptor&>::type operator=(const Arithmetic& i)\n   {\n      m_num = i;\n      m_denom = one();\n      return *this;\n   }\n   rational_adaptor& operator=(const char* s)\n   {\n      using default_ops::eval_eq;\n\n      std::string                        s1;\n      multiprecision::number<Backend>    v1, v2;\n      char                               c;\n      bool                               have_hex = false;\n      const char* p = s; // saved for later\n\n      while ((0 != (c = *s)) && (c == 'x' || c == 'X' || c == '-' || c == '+' || (c >= '0' && c <= '9') || (have_hex && (c >= 'a' && c <= 'f')) || (have_hex && (c >= 'A' && c <= 'F'))))\n      {\n         if (c == 'x' || c == 'X')\n            have_hex = true;\n         s1.append(1, c);\n         ++s;\n      }\n      v1.assign(s1);\n      s1.erase();\n      if (c == '/')\n      {\n         ++s;\n         while ((0 != (c = *s)) && (c == 'x' || c == 'X' || c == '-' || c == '+' || (c >= '0' && c <= '9') || (have_hex && (c >= 'a' && c <= 'f')) || (have_hex && (c >= 'A' && c <= 'F'))))\n         {\n            if (c == 'x' || c == 'X')\n               have_hex = true;\n            s1.append(1, c);\n            ++s;\n         }\n         v2.assign(s1);\n      }\n      else\n         v2 = 1;\n      if (*s)\n      {\n         BOOST_MP_THROW_EXCEPTION(std::runtime_error(std::string(\"Could not parse the string \\\"\") + p + std::string(\"\\\" as a valid rational number.\")));\n      }\n      multiprecision::number<Backend> gcd;\n      eval_gcd(gcd.backend(), v1.backend(), v2.backend());\n      if (!eval_eq(gcd.backend(), one()))\n      {\n         v1 /= gcd;\n         v2 /= gcd;\n      }\n      num() = std::move(std::move(v1).backend());\n      denom() = std::move(std::move(v2).backend());\n      return *this;\n   }\n   template <class Float>\n   typename std::enable_if<std::is_floating_point<Float>::value, rational_adaptor&>::type operator=(Float i)\n   {\n      using default_ops::eval_eq;\n      BOOST_MP_FLOAT128_USING using std::floor; using std::frexp; using std::ldexp;\n\n      int   e;\n      Float f = frexp(i, &e);\n#ifdef BOOST_HAS_FLOAT128\n      f = ldexp(f, std::is_same<float128_type, Float>::value ? 113 : std::numeric_limits<Float>::digits);\n      e -= std::is_same<float128_type, Float>::value ? 113 : std::numeric_limits<Float>::digits;\n#else\n      f = ldexp(f, std::numeric_limits<Float>::digits);\n      e -= std::numeric_limits<Float>::digits;\n#endif\n      number<Backend> num(f);\n      number<Backend> denom(1u);\n      if (e > 0)\n      {\n         num <<= e;\n      }\n      else if (e < 0)\n      {\n         denom <<= -e;\n      }\n      number<Backend> gcd;\n      eval_gcd(gcd.backend(), num.backend(), denom.backend());\n      if (!eval_eq(gcd.backend(), one()))\n      {\n         num /= gcd;\n         denom /= gcd;\n      }\n      this->num() = std::move(std::move(num).backend());\n      this->denom() = std::move(std::move(denom).backend());\n      return *this;\n   }\n\n   void swap(rational_adaptor& o)\n   {\n      m_num.swap(o.m_num);\n      m_denom.swap(o.m_denom);\n   }\n   std::string str(std::streamsize digits, std::ios_base::fmtflags f) const\n   {\n      using default_ops::eval_eq;\n      //\n      // We format the string ourselves so we can match what GMP's mpq type does:\n      //\n      std::string result = num().str(digits, f);\n      if (!eval_eq(denom(), one()))\n      {\n         result.append(1, '/');\n         result.append(denom().str(digits, f));\n      }\n      return result;\n   }\n   void negate()\n   {\n      m_num.negate();\n   }\n   int compare(const rational_adaptor& o) const\n   {\n      std::ptrdiff_t s1 = eval_get_sign(*this);\n      std::ptrdiff_t s2 = eval_get_sign(o);\n      if (s1 != s2)\n      {\n         return s1 < s2 ? -1 : 1;\n      }\n      else if (s1 == 0)\n         return 0; // both zero.\n\n      bool neg = false;\n      if (s1 >= 0)\n      {\n         s1 = eval_msb(num()) + eval_msb(o.denom());\n         s2 = eval_msb(o.num()) + eval_msb(denom());\n      }\n      else\n      {\n         Backend t(num());\n         t.negate();\n         s1 = eval_msb(t) + eval_msb(o.denom());\n         t = o.num();\n         t.negate();\n         s2 = eval_msb(t) + eval_msb(denom());\n         neg = true;\n      }\n      s1 -= s2;\n      if (s1 < -1)\n         return neg ? 1 : -1;\n      else if (s1 > 1)\n         return neg ? -1 : 1;\n\n      Backend t1, t2;\n      eval_multiply(t1, num(), o.denom());\n      eval_multiply(t2, o.num(), denom());\n      return t1.compare(t2);\n   }\n   //\n   // Comparison with arithmetic types, default just constructs a temporary:\n   //\n   template <class A>\n   typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A>::value, int>::type compare(A i) const\n   {\n      rational_adaptor t;\n      t = i;  //  Note: construct directly from i if supported.\n      return compare(t);\n   }\n\n   Backend& num() { return m_num; }\n   const Backend& num()const { return m_num; }\n   Backend& denom() { return m_denom; }\n   const Backend& denom()const { return m_denom; }\n\n   #ifndef BOOST_MP_STANDALONE\n   template <class Archive>\n   void serialize(Archive& ar, const std::integral_constant<bool, true>&)\n   {\n      // Saving\n      number<Backend> n(num()), d(denom());\n      ar& boost::make_nvp(\"numerator\", n);\n      ar& boost::make_nvp(\"denominator\", d);\n   }\n   template <class Archive>\n   void serialize(Archive& ar, const std::integral_constant<bool, false>&)\n   {\n      // Loading\n      number<Backend> n, d;\n      ar& boost::make_nvp(\"numerator\", n);\n      ar& boost::make_nvp(\"denominator\", d);\n      num() = n.backend();\n      denom() = d.backend();\n   }\n   template <class Archive>\n   void serialize(Archive& ar, const unsigned int /*version*/)\n   {\n      using tag = typename Archive::is_saving;\n      using saving_tag = std::integral_constant<bool, tag::value>;\n      serialize(ar, saving_tag());\n   }\n   #endif // BOOST_MP_STANDALONE\n   \n private:\n   Backend m_num, m_denom;\n};\n\n//\n// Helpers:\n//\ntemplate <class T>\ninline constexpr typename std::enable_if<std::numeric_limits<T>::is_specialized && !std::numeric_limits<T>::is_signed, bool>::type\nis_minus_one(const T&)\n{\n   return false;\n}\ntemplate <class T>\ninline constexpr typename std::enable_if<!std::numeric_limits<T>::is_specialized || std::numeric_limits<T>::is_signed, bool>::type\nis_minus_one(const T& val)\n{\n   return val == -1;\n}\n\n//\n// Required non-members:\n//\ntemplate <class Backend> \ninline void eval_add(rational_adaptor<Backend>& a, const rational_adaptor<Backend>& b)\n{\n   eval_add_subtract_imp(a, a, b, true);\n}\ntemplate <class Backend> \ninline void eval_subtract(rational_adaptor<Backend>& a, const rational_adaptor<Backend>& b)\n{\n   eval_add_subtract_imp(a, a, b, false);\n}\n\ntemplate <class Backend> \ninline void eval_multiply(rational_adaptor<Backend>& a, const rational_adaptor<Backend>& b)\n{\n   eval_multiply_imp(a, a, b.num(), b.denom());\n}\n\ntemplate <class Backend> \nvoid eval_divide(rational_adaptor<Backend>& a, const rational_adaptor<Backend>& b)\n{\n   using default_ops::eval_divide;\n   rational_adaptor<Backend> t;\n   eval_divide(t, a, b);\n   a = std::move(t);\n}\n//\n// Conversions:\n//\ntemplate <class R, class IntBackend>\ninline typename std::enable_if<number_category<R>::value == number_kind_floating_point>::type eval_convert_to(R* result, const rational_adaptor<IntBackend>& backend)\n{\n   //\n   // The generic conversion is as good as anything we can write here:\n   //\n   ::boost::multiprecision::detail::generic_convert_rational_to_float(*result, backend);\n}\n\ntemplate <class R, class IntBackend>\ninline typename std::enable_if<(number_category<R>::value != number_kind_integer) && (number_category<R>::value != number_kind_floating_point) && !std::is_enum<R>::value>::type eval_convert_to(R* result, const rational_adaptor<IntBackend>& backend)\n{\n   using default_ops::eval_convert_to;\n   R d;\n   eval_convert_to(result, backend.num());\n   eval_convert_to(&d, backend.denom());\n   *result /= d;\n}\n\ntemplate <class R, class Backend>\ninline typename std::enable_if<number_category<R>::value == number_kind_integer>::type eval_convert_to(R* result, const rational_adaptor<Backend>& backend)\n{\n   using default_ops::eval_divide;\n   using default_ops::eval_convert_to;\n   Backend t;\n   eval_divide(t, backend.num(), backend.denom());\n   eval_convert_to(result, t);\n}\n\n//\n// Hashing support, not strictly required, but it is used in our tests:\n//\ntemplate <class Backend>\ninline std::size_t hash_value(const rational_adaptor<Backend>& arg)\n{\n   std::size_t result = hash_value(arg.num());\n   std::size_t result2 = hash_value(arg.denom());\n   boost::multiprecision::detail::hash_combine(result, result2);\n   return result;\n}\n//\n// assign_components:\n//\ntemplate <class Backend>\nvoid assign_components(rational_adaptor<Backend>& result, Backend const& a, Backend const& b)\n{\n   using default_ops::eval_gcd;\n   using default_ops::eval_divide;\n   using default_ops::eval_eq;\n   using default_ops::eval_is_zero;\n   using default_ops::eval_get_sign;\n\n   if (eval_is_zero(b))\n   {\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Integer division by zero\"));\n   }\n   Backend g;\n   eval_gcd(g, a, b);\n   if (eval_eq(g, rational_adaptor<Backend>::one()))\n   {\n      result.num() = a;\n      result.denom() = b;\n   }\n   else\n   {\n      eval_divide(result.num(), a, g);\n      eval_divide(result.denom(), b, g);\n   }\n   if (eval_get_sign(result.denom()) < 0)\n   {\n      result.num().negate();\n      result.denom().negate();\n   }\n}\n//\n// Again for arithmetic types, overload for whatever arithmetic types are directly supported:\n//\ntemplate <class Backend, class Arithmetic1, class Arithmetic2>\ninline void assign_components(rational_adaptor<Backend>& result, const Arithmetic1& a, typename std::enable_if<std::is_arithmetic<Arithmetic1>::value && std::is_arithmetic<Arithmetic2>::value, const Arithmetic2&>::type b)\n{\n   using default_ops::eval_gcd;\n   using default_ops::eval_divide;\n   using default_ops::eval_eq;\n\n   if (b == 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Integer division by zero\"));\n   }\n\n   Backend g;\n   result.num()   = a;\n   eval_gcd(g, result.num(), b);\n   if (eval_eq(g, rational_adaptor<Backend>::one()))\n   {\n      result.denom() = b;\n   }\n   else\n   {\n      eval_divide(result.num(), g);\n      eval_divide(result.denom(), b, g);\n   }\n   if (eval_get_sign(result.denom()) < 0)\n   {\n      result.num().negate();\n      result.denom().negate();\n   }\n}\ntemplate <class Backend, class Arithmetic1, class Arithmetic2>\ninline void assign_components(rational_adaptor<Backend>& result, const Arithmetic1& a, typename std::enable_if<!std::is_arithmetic<Arithmetic1>::value || !std::is_arithmetic<Arithmetic2>::value, const Arithmetic2&>::type b)\n{\n   using default_ops::eval_gcd;\n   using default_ops::eval_divide;\n   using default_ops::eval_eq;\n\n   Backend g;\n   result.num()   = a;\n   result.denom() = b;\n\n   if (eval_get_sign(result.denom()) == 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Integer division by zero\"));\n   }\n\n   eval_gcd(g, result.num(), result.denom());\n   if (!eval_eq(g, rational_adaptor<Backend>::one()))\n   {\n      eval_divide(result.num(), g);\n      eval_divide(result.denom(), g);\n   }\n   if (eval_get_sign(result.denom()) < 0)\n   {\n      result.num().negate();\n      result.denom().negate();\n   }\n}\n//\n// Optional comparison operators:\n//\ntemplate <class Backend>\ninline bool eval_is_zero(const rational_adaptor<Backend>& arg)\n{\n   using default_ops::eval_is_zero;\n   return eval_is_zero(arg.num());\n}\n\ntemplate <class Backend>\ninline int eval_get_sign(const rational_adaptor<Backend>& arg)\n{\n   using default_ops::eval_get_sign;\n   return eval_get_sign(arg.num());\n}\n\ntemplate <class Backend>\ninline bool eval_eq(const rational_adaptor<Backend>& a, const rational_adaptor<Backend>& b)\n{\n   using default_ops::eval_eq;\n   return eval_eq(a.num(), b.num()) && eval_eq(a.denom(), b.denom());\n}\n\ntemplate <class Backend, class Arithmetic>\ninline typename std::enable_if<std::is_convertible<Arithmetic, Backend>::value&& std::is_integral<Arithmetic>::value, bool>::type \n   eval_eq(const rational_adaptor<Backend>& a, Arithmetic b)\n{\n   using default_ops::eval_eq;\n   return eval_eq(a.denom(), rational_adaptor<Backend>::one()) && eval_eq(a.num(), b);\n}\n\ntemplate <class Backend, class Arithmetic>\ninline typename std::enable_if<std::is_convertible<Arithmetic, Backend>::value&& std::is_integral<Arithmetic>::value, bool>::type \n   eval_eq(Arithmetic b, const rational_adaptor<Backend>& a)\n{\n   using default_ops::eval_eq;\n   return eval_eq(a.denom(), rational_adaptor<Backend>::one()) && eval_eq(a.num(), b);\n}\n\n//\n// Arithmetic operations, starting with addition:\n//\ntemplate <class Backend, class Arithmetic> \nvoid eval_add_subtract_imp(rational_adaptor<Backend>& result, const Arithmetic& arg, bool isaddition)\n{\n   using default_ops::eval_multiply;\n   using default_ops::eval_divide;\n   using default_ops::eval_add;\n   using default_ops::eval_gcd;\n   Backend t;\n   eval_multiply(t, result.denom(), arg);\n   if (isaddition)\n      eval_add(result.num(), t);\n   else\n      eval_subtract(result.num(), t);\n   //\n   // There is no need to re-normalize here, we have \n   // (a + bm) / b\n   // and gcd(a + bm, b) = gcd(a, b) = 1\n   //\n   /*\n   eval_gcd(t, result.num(), result.denom());\n   if (!eval_eq(t, rational_adaptor<Backend>::one()) != 0)\n   {\n      Backend t2;\n      eval_divide(t2, result.num(), t);\n      t2.swap(result.num());\n      eval_divide(t2, result.denom(), t);\n      t2.swap(result.denom());\n   }\n   */\n}\n\ntemplate <class Backend, class Arithmetic> \ninline typename std::enable_if<std::is_convertible<Arithmetic, Backend>::value && (std::is_integral<Arithmetic>::value || std::is_same<Arithmetic, Backend>::value)>::type\n   eval_add(rational_adaptor<Backend>& result, const Arithmetic& arg)\n{\n   eval_add_subtract_imp(result, arg, true);\n}\n\ntemplate <class Backend, class Arithmetic> \ninline typename std::enable_if<std::is_convertible<Arithmetic, Backend>::value && (std::is_integral<Arithmetic>::value || std::is_same<Arithmetic, Backend>::value)>::type\n   eval_subtract(rational_adaptor<Backend>& result, const Arithmetic& arg)\n{\n   eval_add_subtract_imp(result, arg, false);\n}\n\ntemplate <class Backend>\nvoid eval_add_subtract_imp(rational_adaptor<Backend>& result, const rational_adaptor<Backend>& a, const rational_adaptor<Backend>& b, bool isaddition)\n{\n   using default_ops::eval_eq;\n   using default_ops::eval_multiply;\n   using default_ops::eval_divide;\n   using default_ops::eval_add;\n   using default_ops::eval_subtract;\n   //\n   // Let  a = an/ad\n   //      b = bn/bd\n   //      g = gcd(ad, bd)\n   // result = rn/rd\n   //\n   // Then:\n   // rn = an * (bd/g) + bn * (ad/g)\n   // rd = ad * (bd/g)\n   //    = (ad/g) * (bd/g) * g\n   //\n   // And the whole thing can then be rescaled by\n   //      gcd(rn, g)\n   //\n   Backend gcd, t1, t2, t3, t4;\n   //\n   // Begin by getting the gcd of the 2 denominators:\n   //\n   eval_gcd(gcd, a.denom(), b.denom());\n   //\n   // Do we have gcd > 1:\n   //\n   if (!eval_eq(gcd, rational_adaptor<Backend>::one()))\n   {\n      //\n      // Scale the denominators by gcd, and put the results in t1 and t2:\n      //\n      eval_divide(t1, b.denom(), gcd);\n      eval_divide(t2, a.denom(), gcd);\n      //\n      // multiply the numerators by the scale denominators and put the results in t3, t4:\n      //\n      eval_multiply(t3, a.num(), t1);\n      eval_multiply(t4, b.num(), t2);\n      //\n      // Add them up:\n      //\n      if (isaddition)\n         eval_add(t3, t4);\n      else\n         eval_subtract(t3, t4);\n      //\n      // Get the gcd of gcd and our numerator (t3):\n      //\n      eval_gcd(t4, t3, gcd);\n      if (eval_eq(t4, rational_adaptor<Backend>::one()))\n      {\n         result.num() = t3;\n         eval_multiply(result.denom(), t1, a.denom());\n      }\n      else\n      {\n         //\n         // Uncommon case where gcd is not 1, divide the numerator\n         // and the denominator terms by the new gcd.  Note we perform division\n         // on the existing gcd value as this is the smallest of the 3 denominator\n         // terms we'll be multiplying together, so there's a good chance it's a\n         // single limb value already:\n         //\n         eval_divide(result.num(), t3, t4);\n         eval_divide(t3, gcd, t4);\n         eval_multiply(t4, t1, t2);\n         eval_multiply(result.denom(), t4, t3);\n      }\n   }\n   else\n   {\n      //\n      // Most common case (approx 60%) where gcd is one:\n      //\n      eval_multiply(t1, a.num(), b.denom());\n      eval_multiply(t2, a.denom(), b.num());\n      if (isaddition)\n         eval_add(result.num(), t1, t2);\n      else\n         eval_subtract(result.num(), t1, t2);\n      eval_multiply(result.denom(), a.denom(), b.denom());\n   }\n}\n\n\ntemplate <class Backend>\ninline void eval_add(rational_adaptor<Backend>& result, const rational_adaptor<Backend>& a, const rational_adaptor<Backend>& b)\n{\n   eval_add_subtract_imp(result, a, b, true);\n}\ntemplate <class Backend>\ninline void eval_subtract(rational_adaptor<Backend>& result, const rational_adaptor<Backend>& a, const rational_adaptor<Backend>& b)\n{\n   eval_add_subtract_imp(result, a, b, false);\n}\n\ntemplate <class Backend, class Arithmetic>\nvoid eval_add_subtract_imp(rational_adaptor<Backend>& result, const rational_adaptor<Backend>& a, const Arithmetic& b, bool isaddition)\n{\n   using default_ops::eval_add;\n   using default_ops::eval_subtract;\n   using default_ops::eval_multiply;\n\n   if (&result == &a)\n      return eval_add_subtract_imp(result, b, isaddition);\n\n   eval_multiply(result.num(), a.denom(), b);\n   if (isaddition)\n      eval_add(result.num(), a.num());\n   else\n      BOOST_IF_CONSTEXPR(std::numeric_limits<Backend>::is_signed == false)\n   {\n      Backend t;\n      eval_subtract(t, a.num(), result.num());\n      result.num() = std::move(t);\n   }\n   else\n   {\n      eval_subtract(result.num(), a.num());\n      result.negate();\n   }\n   result.denom() = a.denom();\n   //\n   // There is no need to re-normalize here, we have \n   // (a + bm) / b\n   // and gcd(a + bm, b) = gcd(a, b) = 1\n   //\n}\ntemplate <class Backend, class Arithmetic>\ninline typename std::enable_if<std::is_convertible<Arithmetic, Backend>::value && (std::is_integral<Arithmetic>::value || std::is_same<Arithmetic, Backend>::value)>::type\n   eval_add(rational_adaptor<Backend>& result, const rational_adaptor<Backend>& a, const Arithmetic& b)\n{\n   eval_add_subtract_imp(result, a, b, true);\n}\ntemplate <class Backend, class Arithmetic>\ninline typename std::enable_if<std::is_convertible<Arithmetic, Backend>::value && (std::is_integral<Arithmetic>::value || std::is_same<Arithmetic, Backend>::value)>::type\n   eval_subtract(rational_adaptor<Backend>& result, const rational_adaptor<Backend>& a, const Arithmetic& b)\n{\n   eval_add_subtract_imp(result, a, b, false);\n}\n\n//\n// Multiplication:\n//\ntemplate <class Backend> \nvoid eval_multiply_imp(rational_adaptor<Backend>& result, const rational_adaptor<Backend>& a, const Backend& b_num, const Backend& b_denom)\n{\n   using default_ops::eval_multiply;\n   using default_ops::eval_divide;\n   using default_ops::eval_gcd;\n   using default_ops::eval_get_sign;\n   using default_ops::eval_eq;\n\n   Backend gcd_left, gcd_right, t1, t2;\n   eval_gcd(gcd_left, a.num(), b_denom);\n   eval_gcd(gcd_right, b_num, a.denom());\n   //\n   // Unit gcd's are the most likely case:\n   //\n   bool b_left = eval_eq(gcd_left, rational_adaptor<Backend>::one());\n   bool b_right = eval_eq(gcd_right, rational_adaptor<Backend>::one());\n\n   if (b_left && b_right)\n   {\n      eval_multiply(result.num(), a.num(), b_num);\n      eval_multiply(result.denom(), a.denom(), b_denom);\n   }\n   else if (b_left)\n   {\n      eval_divide(t2, b_num, gcd_right);\n      eval_multiply(result.num(), a.num(), t2);\n      eval_divide(t1, a.denom(), gcd_right);\n      eval_multiply(result.denom(), t1, b_denom);\n   }\n   else if (b_right)\n   {\n      eval_divide(t1, a.num(), gcd_left);\n      eval_multiply(result.num(), t1, b_num);\n      eval_divide(t2, b_denom, gcd_left);\n      eval_multiply(result.denom(), a.denom(), t2);\n   }\n   else\n   {\n      eval_divide(t1, a.num(), gcd_left);\n      eval_divide(t2, b_num, gcd_right);\n      eval_multiply(result.num(), t1, t2);\n      eval_divide(t1, a.denom(), gcd_right);\n      eval_divide(t2, b_denom, gcd_left);\n      eval_multiply(result.denom(), t1, t2);\n   }\n   //\n   // We may have b_denom negative if this is actually division, if so just correct things now:\n   //\n   if (eval_get_sign(b_denom) < 0)\n   {\n      result.num().negate();\n      result.denom().negate();\n   }\n}\n\ntemplate <class Backend> \nvoid eval_multiply(rational_adaptor<Backend>& result, const rational_adaptor<Backend>& a, const rational_adaptor<Backend>& b)\n{\n   using default_ops::eval_multiply;\n\n   if (&a == &b)\n   {\n      // squaring, gcd's are 1:\n      eval_multiply(result.num(), a.num(), b.num());\n      eval_multiply(result.denom(), a.denom(), b.denom());\n      return;\n   }\n   eval_multiply_imp(result, a, b.num(), b.denom());\n}\n\ntemplate <class Backend, class Arithmetic> \nvoid eval_multiply_imp(Backend& result_num, Backend& result_denom, Arithmetic arg)\n{\n   if (arg == 0)\n   {\n      result_num = rational_adaptor<Backend>::zero();\n      result_denom = rational_adaptor<Backend>::one();\n      return;\n   }\n   else if (arg == 1)\n      return;\n\n   using default_ops::eval_multiply;\n   using default_ops::eval_divide;\n   using default_ops::eval_gcd;\n   using default_ops::eval_convert_to;\n\n   Backend gcd, t;\n   Arithmetic integer_gcd;\n   eval_gcd(gcd, result_denom, arg);\n   eval_convert_to(&integer_gcd, gcd);\n   arg /= integer_gcd;\n   if (boost::multiprecision::detail::unsigned_abs(arg) > 1)\n   {\n      eval_multiply(t, result_num, arg);\n      result_num = std::move(t);\n   }\n   else if (is_minus_one(arg))\n      result_num.negate();\n   if (integer_gcd > 1)\n   {\n      eval_divide(t, result_denom, integer_gcd);\n      result_denom = std::move(t);\n   }\n}\ntemplate <class Backend> \nvoid eval_multiply_imp(Backend& result_num, Backend& result_denom, Backend arg)\n{\n   using default_ops::eval_multiply;\n   using default_ops::eval_divide;\n   using default_ops::eval_gcd;\n   using default_ops::eval_convert_to;\n   using default_ops::eval_is_zero;\n   using default_ops::eval_eq;\n   using default_ops::eval_get_sign;\n\n   if (eval_is_zero(arg))\n   {\n      result_num = rational_adaptor<Backend>::zero();\n      result_denom = rational_adaptor<Backend>::one();\n      return;\n   }\n   else if (eval_eq(arg, rational_adaptor<Backend>::one()))\n      return;\n\n   Backend gcd, t;\n   eval_gcd(gcd, result_denom, arg);\n   if (!eval_eq(gcd, rational_adaptor<Backend>::one()))\n   {\n      eval_divide(t, arg, gcd);\n      arg = t;\n   }\n   else\n      t = arg;\n   if (eval_get_sign(arg) < 0)\n      t.negate();\n\n   if (!eval_eq(t, rational_adaptor<Backend>::one()))\n   {\n      eval_multiply(t, result_num, arg);\n      result_num = std::move(t);\n   }\n   else if (eval_get_sign(arg) < 0)\n      result_num.negate();\n   if (!eval_eq(gcd, rational_adaptor<Backend>::one()))\n   {\n      eval_divide(t, result_denom, gcd);\n      result_denom = std::move(t);\n   }\n}\n\ntemplate <class Backend, class Arithmetic> \ninline typename std::enable_if<std::is_convertible<Arithmetic, Backend>::value && (std::is_integral<Arithmetic>::value || std::is_same<Arithmetic, Backend>::value)>::type\n   eval_multiply(rational_adaptor<Backend>& result, const Arithmetic& arg)\n{\n   eval_multiply_imp(result.num(), result.denom(), arg);\n}\n\ntemplate <class Backend, class Arithmetic> \ntypename std::enable_if<std::is_convertible<Arithmetic, Backend>::value && std::is_integral<Arithmetic>::value>::type\n   eval_multiply_imp(rational_adaptor<Backend>& result, const Backend& a_num, const Backend& a_denom, Arithmetic b)\n{\n   if (b == 0)\n   {\n      result.num() = rational_adaptor<Backend>::zero();\n      result.denom() = rational_adaptor<Backend>::one();\n      return;\n   }\n   else if (b == 1)\n   {\n      result.num() = a_num;\n      result.denom() = a_denom;\n      return;\n   }\n\n   using default_ops::eval_multiply;\n   using default_ops::eval_divide;\n   using default_ops::eval_gcd;\n   using default_ops::eval_convert_to;\n\n   Backend gcd;\n   Arithmetic integer_gcd;\n   eval_gcd(gcd, a_denom, b);\n   eval_convert_to(&integer_gcd, gcd);\n   b /= integer_gcd;\n   if (boost::multiprecision::detail::unsigned_abs(b) > 1)\n      eval_multiply(result.num(), a_num, b);\n   else if (is_minus_one(b))\n   {\n      result.num() = a_num;\n      result.num().negate();\n   }\n   else\n      result.num() = a_num;\n   if (integer_gcd > 1)\n      eval_divide(result.denom(), a_denom, integer_gcd);\n   else\n      result.denom() = a_denom;\n}\ntemplate <class Backend> \ninline void eval_multiply_imp(rational_adaptor<Backend>& result, const Backend& a_num, const Backend& a_denom, const Backend& b)\n{\n   result.num() = a_num;\n   result.denom() = a_denom;\n   eval_multiply_imp(result.num(), result.denom(), b);\n}\n\ntemplate <class Backend, class Arithmetic> \ninline typename std::enable_if<std::is_convertible<Arithmetic, Backend>::value && (std::is_integral<Arithmetic>::value || std::is_same<Arithmetic, Backend>::value)>::type\n   eval_multiply(rational_adaptor<Backend>& result, const rational_adaptor<Backend>& a, const Arithmetic& b)\n{\n   if (&result == &a)\n      return eval_multiply(result, b);\n\n   eval_multiply_imp(result, a.num(), a.denom(), b);\n}\n\ntemplate <class Backend, class Arithmetic> \ninline typename std::enable_if<std::is_convertible<Arithmetic, Backend>::value && (std::is_integral<Arithmetic>::value || std::is_same<Arithmetic, Backend>::value)>::type\n   eval_multiply(rational_adaptor<Backend>& result, const Arithmetic& b, const rational_adaptor<Backend>& a)\n{\n   return eval_multiply(result, a, b);\n}\n\n//\n// Division:\n//\ntemplate <class Backend>\ninline void eval_divide(rational_adaptor<Backend>& result, const rational_adaptor<Backend>& a, const rational_adaptor<Backend>& b)\n{\n   using default_ops::eval_multiply;\n   using default_ops::eval_get_sign;\n\n   if (eval_get_sign(b.num()) == 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Integer division by zero\"));\n      return;\n   }\n   if (&a == &b)\n   {\n      // Huh? Really?\n      result.num() = result.denom() = rational_adaptor<Backend>::one();\n      return;\n   }\n   if (&result == &b)\n   {\n      rational_adaptor<Backend> t(b);\n      return eval_divide(result, a, t);\n   }\n   eval_multiply_imp(result, a, b.denom(), b.num());\n}\n\ntemplate <class Backend, class Arithmetic> \ninline typename std::enable_if<std::is_convertible<Arithmetic, Backend>::value && (std::is_integral<Arithmetic>::value || std::is_same<Arithmetic, Backend>::value)>::type\n   eval_divide(rational_adaptor<Backend>& result, const Arithmetic& b, const rational_adaptor<Backend>& a)\n{\n   using default_ops::eval_get_sign;\n\n   if (eval_get_sign(a.num()) == 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Integer division by zero\"));\n      return;\n   }\n   if (&a == &result)\n   {\n      eval_multiply_imp(result.denom(), result.num(), b);\n      result.num().swap(result.denom());\n   }\n   else\n      eval_multiply_imp(result, a.denom(), a.num(), b);\n\n   if (eval_get_sign(result.denom()) < 0)\n   {\n      result.num().negate();\n      result.denom().negate();\n   }\n}\n\ntemplate <class Backend, class Arithmetic>\ntypename std::enable_if<std::is_convertible<Arithmetic, Backend>::value && std::is_integral<Arithmetic>::value>::type\neval_divide(rational_adaptor<Backend>& result, Arithmetic arg)\n{\n   if (arg == 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Integer division by zero\"));\n      return;\n   }\n   else if (arg == 1)\n      return;\n   else if (is_minus_one(arg))\n   {\n      result.negate();\n      return;\n   }\n   if (eval_get_sign(result) == 0)\n   {\n      return;\n   }\n\n\n   using default_ops::eval_multiply;\n   using default_ops::eval_gcd;\n   using default_ops::eval_convert_to;\n   using default_ops::eval_divide;\n\n   Backend gcd, t;\n   Arithmetic integer_gcd;\n   eval_gcd(gcd, result.num(), arg);\n   eval_convert_to(&integer_gcd, gcd);\n   arg /= integer_gcd;\n\n   eval_multiply(t, result.denom(), boost::multiprecision::detail::unsigned_abs(arg));\n   result.denom() = std::move(t);\n   if (arg < 0)\n   {\n      result.num().negate();\n   }\n   if (integer_gcd > 1)\n   {\n      eval_divide(t, result.num(), integer_gcd);\n      result.num() = std::move(t);\n   }\n}\ntemplate <class Backend>\nvoid eval_divide(rational_adaptor<Backend>& result, const rational_adaptor<Backend>& a, Backend arg)\n{\n   using default_ops::eval_multiply;\n   using default_ops::eval_gcd;\n   using default_ops::eval_convert_to;\n   using default_ops::eval_divide;\n   using default_ops::eval_is_zero;\n   using default_ops::eval_eq;\n   using default_ops::eval_get_sign;\n\n   if (eval_is_zero(arg))\n   {\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Integer division by zero\"));\n      return;\n   }\n   else if (eval_eq(a, rational_adaptor<Backend>::one()) || (eval_get_sign(a) == 0))\n   {\n      if (&result != &a)\n         result = a;\n      return;\n   }\n\n   Backend gcd, u_arg, t;\n   eval_gcd(gcd, a.num(), arg);\n   bool has_unit_gcd = eval_eq(gcd, rational_adaptor<Backend>::one());\n   if (!has_unit_gcd)\n   {\n      eval_divide(u_arg, arg, gcd);\n      arg = u_arg;\n   }\n   else\n      u_arg = arg;\n   if (eval_get_sign(u_arg) < 0)\n      u_arg.negate();\n\n   eval_multiply(t, a.denom(), u_arg);\n   result.denom() = std::move(t);\n   \n   if (!has_unit_gcd)\n   {\n      eval_divide(t, a.num(), gcd);\n      result.num() = std::move(t);\n   }\n   else if (&result != &a)\n      result.num() = a.num();\n\n   if (eval_get_sign(arg) < 0)\n   {\n      result.num().negate();\n   }\n}\ntemplate <class Backend>\nvoid eval_divide(rational_adaptor<Backend>& result, Backend arg)\n{\n   eval_divide(result, result, arg);\n}\n\ntemplate <class Backend, class Arithmetic>\ntypename std::enable_if<std::is_convertible<Arithmetic, Backend>::value && std::is_integral<Arithmetic>::value>::type\n   eval_divide(rational_adaptor<Backend>& result, const rational_adaptor<Backend>& a, Arithmetic arg)\n{\n   if (&result == &a)\n      return eval_divide(result, arg);\n   if (arg == 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Integer division by zero\"));\n      return;\n   }\n   else if (arg == 1)\n   {\n      result = a;\n      return;\n   }\n   else if (is_minus_one(arg))\n   {\n      result = a;\n      result.num().negate();\n      return;\n   }\n\n   if (eval_get_sign(a) == 0)\n   {\n      result = a;\n      return;\n   }\n\n   using default_ops::eval_multiply;\n   using default_ops::eval_divide;\n   using default_ops::eval_gcd;\n   using default_ops::eval_convert_to;\n\n   Backend gcd;\n   Arithmetic integer_gcd;\n   eval_gcd(gcd, a.num(), arg);\n   eval_convert_to(&integer_gcd, gcd);\n   arg /= integer_gcd;\n   eval_multiply(result.denom(), a.denom(), boost::multiprecision::detail::unsigned_abs(arg));\n\n   if (integer_gcd > 1)\n   {\n      eval_divide(result.num(), a.num(), integer_gcd);\n   }\n   else\n      result.num() = a.num();\n   if (arg < 0)\n   {\n      result.num().negate();\n   }\n}\n\n//\n// Increment and decrement:\n//\ntemplate <class Backend> \ninline void eval_increment(rational_adaptor<Backend>& arg)\n{\n   using default_ops::eval_add;\n   eval_add(arg.num(), arg.denom());\n}\ntemplate <class Backend> \ninline void eval_decrement(rational_adaptor<Backend>& arg)\n{\n   using default_ops::eval_subtract;\n   eval_subtract(arg.num(), arg.denom());\n}\n\n//\n// abs:\n//\ntemplate <class Backend> \ninline void eval_abs(rational_adaptor<Backend>& result, const rational_adaptor<Backend>& arg)\n{\n   using default_ops::eval_abs;\n   eval_abs(result.num(), arg.num());\n   result.denom() = arg.denom();\n}\n\n} // namespace backends\n\n//\n// Import the backend into this namespace:\n//\nusing boost::multiprecision::backends::rational_adaptor;\n//\n// Define a category for this number type, one of:\n// \n//    number_kind_integer\n//    number_kind_floating_point\n//    number_kind_rational\n//    number_kind_fixed_point\n//    number_kind_complex\n//\ntemplate<class Backend>\nstruct number_category<rational_adaptor<Backend> > : public std::integral_constant<int, number_kind_rational>\n{};\n\ntemplate <class IntBackend>\nstruct expression_template_default<backends::rational_adaptor<IntBackend> > : public expression_template_default<IntBackend>\n{};\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\nstruct component_type<number<rational_adaptor<Backend>, ExpressionTemplates> >\n{\n   typedef number<Backend, ExpressionTemplates> type;\n};\n\ntemplate <class IntBackend, expression_template_option ET>\ninline number<IntBackend, ET> numerator(const number<rational_adaptor<IntBackend>, ET>& val)\n{\n   return val.backend().num();\n}\ntemplate <class IntBackend, expression_template_option ET>\ninline number<IntBackend, ET> denominator(const number<rational_adaptor<IntBackend>, ET>& val)\n{\n   return val.backend().denom();\n}\n\ntemplate <class Backend>\nstruct is_unsigned_number<rational_adaptor<Backend> > : public is_unsigned_number<Backend>\n{};\n\n\n}} // namespace boost::multiprecision\n\nnamespace std {\n\n   template <class IntBackend, boost::multiprecision::expression_template_option ExpressionTemplates>\n   class numeric_limits<boost::multiprecision::number<boost::multiprecision::rational_adaptor<IntBackend>, ExpressionTemplates> > : public std::numeric_limits<boost::multiprecision::number<IntBackend, ExpressionTemplates> >\n   {\n      using base_type = std::numeric_limits<boost::multiprecision::number<IntBackend> >;\n      using number_type = boost::multiprecision::number<boost::multiprecision::rational_adaptor<IntBackend> >;\n\n   public:\n      static constexpr bool is_integer = false;\n      static constexpr bool is_exact = true;\n      static constexpr      number_type(min)() { return (base_type::min)(); }\n      static constexpr      number_type(max)() { return (base_type::max)(); }\n      static constexpr number_type lowest() { return -(max)(); }\n      static constexpr number_type epsilon() { return base_type::epsilon(); }\n      static constexpr number_type round_error() { return epsilon() / 2; }\n      static constexpr number_type infinity() { return base_type::infinity(); }\n      static constexpr number_type quiet_NaN() { return base_type::quiet_NaN(); }\n      static constexpr number_type signaling_NaN() { return base_type::signaling_NaN(); }\n      static constexpr number_type denorm_min() { return base_type::denorm_min(); }\n   };\n\n   template <class IntBackend, boost::multiprecision::expression_template_option ExpressionTemplates>\n   constexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::rational_adaptor<IntBackend>, ExpressionTemplates> >::is_integer;\n   template <class IntBackend, boost::multiprecision::expression_template_option ExpressionTemplates>\n   constexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::rational_adaptor<IntBackend>, ExpressionTemplates> >::is_exact;\n\n} // namespace std\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/tommath.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock.\n//  Copyright 2021 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_TOMMATH_HPP\n#define BOOST_MP_TOMMATH_HPP\n\n#include <cctype>\n#include <climits>\n#include <cmath>\n#include <cstdint>\n#include <cstddef>\n#include <cstdlib>\n#include <limits>\n#include <memory>\n#include <string>\n\n#include <tommath.h>\n\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/detail/fpclassify.hpp>\n#include <boost/multiprecision/number.hpp>\n#include <boost/multiprecision/rational_adaptor.hpp>\n#include <boost/multiprecision/detail/integer_ops.hpp>\n#include <boost/multiprecision/detail/hash.hpp>\n#include <boost/multiprecision/detail/no_exceptions_support.hpp>\n#include <boost/multiprecision/detail/assert.hpp>\n\nnamespace boost {\nnamespace multiprecision {\nnamespace backends {\n\nnamespace detail {\n\ntemplate <class ErrType>\ninline void check_tommath_result(ErrType v)\n{\n   if (v != MP_OKAY)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(mp_error_to_string(v)));\n   }\n}\n\n} // namespace detail\n\nstruct tommath_int;\n\nvoid eval_multiply(tommath_int& t, const tommath_int& o);\nvoid eval_add(tommath_int& t, const tommath_int& o);\n\nstruct tommath_int\n{\n   using signed_types = std::tuple<std::int32_t, long long>  ;\n   using unsigned_types = std::tuple<std::uint32_t, unsigned long long>;\n   using float_types = std::tuple<long double>                            ;\n\n   tommath_int()\n   {\n      detail::check_tommath_result(mp_init(&m_data));\n   }\n   tommath_int(const tommath_int& o)\n   {\n      detail::check_tommath_result(mp_init_copy(&m_data, const_cast< ::mp_int*>(&o.m_data)));\n   }\n   // rvalues:\n   tommath_int(tommath_int&& o) noexcept\n   {\n      m_data      = o.m_data;\n      o.m_data.dp = 0;\n   }\n   tommath_int& operator=(tommath_int&& o)\n   {\n      mp_exch(&m_data, &o.m_data);\n      return *this;\n   }\n   tommath_int& operator=(const tommath_int& o)\n   {\n      if (m_data.dp == nullptr)\n         detail::check_tommath_result(mp_init(&m_data));\n      if (o.m_data.dp)\n         detail::check_tommath_result(mp_copy(const_cast< ::mp_int*>(&o.m_data), &m_data));\n      return *this;\n   }\n#ifndef mp_get_u64\n   // Pick off 32 bit chunks for mp_set_int:\n   tommath_int& operator=(unsigned long long i)\n   {\n      if (m_data.dp == nullptr)\n         detail::check_tommath_result(mp_init(&m_data));\n      unsigned long long mask = ((1uLL << 32) - 1);\n      unsigned shift = 0;\n      ::mp_int t;\n      detail::check_tommath_result(mp_init(&t));\n      mp_zero(&m_data);\n      while (i)\n      {\n         detail::check_tommath_result(mp_set_int(&t, static_cast<unsigned>(i & mask)));\n         if (shift)\n            detail::check_tommath_result(mp_mul_2d(&t, shift, &t));\n         detail::check_tommath_result((mp_add(&m_data, &t, &m_data)));\n         shift += 32;\n         i >>= 32;\n      }\n      mp_clear(&t);\n      return *this;\n   }\n#elif !defined(ULLONG_MAX) || (ULLONG_MAX != 18446744073709551615uLL)\n   // Pick off 64 bit chunks for mp_set_u64:\n   tommath_int& operator=(unsigned long long i)\n   {\n      if (m_data.dp == nullptr)\n         detail::check_tommath_result(mp_init(&m_data));\n      if(sizeof(unsigned long long) * CHAR_BIT == 64)\n      {\n         mp_set_u64(&m_data, i);\n         return *this;\n      }\n      unsigned long long mask = ((1uLL << 64) - 1);\n      unsigned shift = 0;\n      ::mp_int t;\n      detail::check_tommath_result(mp_init(&t));\n      mp_zero(&m_data);\n      while (i)\n      {\n         detail::check_tommath_result(mp_set_u64(&t, static_cast<std::uint64_t>(i & mask)));\n         if (shift)\n            detail::check_tommath_result(mp_mul_2d(&t, shift, &t));\n         detail::check_tommath_result((mp_add(&m_data, &t, &m_data)));\n         shift += 64;\n         i >>= 64;\n      }\n      mp_clear(&t);\n      return *this;\n   }\n#else\n   tommath_int& operator=(unsigned long long i)\n   {\n      if (m_data.dp == nullptr)\n         detail::check_tommath_result(mp_init(&m_data));\n      mp_set_u64(&m_data, i);\n      return *this;\n   }\n#endif\n   tommath_int& operator=(long long i)\n   {\n      if (m_data.dp == nullptr)\n         detail::check_tommath_result(mp_init(&m_data));\n      bool neg = i < 0;\n      *this    = boost::multiprecision::detail::unsigned_abs(i);\n      if (neg)\n         detail::check_tommath_result(mp_neg(&m_data, &m_data));\n      return *this;\n   }\n#ifdef BOOST_HAS_INT128\n   // Pick off 64 bit chunks for mp_set_u64:\n   tommath_int& operator=(uint128_type i)\n   {\n      if (m_data.dp == nullptr)\n         detail::check_tommath_result(mp_init(&m_data));\n\n      int128_type  mask  = ((static_cast<uint128_type>(1u) << 64) - 1);\n      unsigned           shift = 0;\n      ::mp_int           t;\n      detail::check_tommath_result(mp_init(&t));\n      mp_zero(&m_data);\n      while (i)\n      {\n#ifndef mp_get_u32\n         detail::check_tommath_result(mp_set_long_long(&t, static_cast<std::uint64_t>(i & mask)));\n#else\n         mp_set_u64(&t, static_cast<std::uint64_t>(i & mask));\n#endif\n         if (shift)\n            detail::check_tommath_result(mp_mul_2d(&t, shift, &t));\n         detail::check_tommath_result((mp_add(&m_data, &t, &m_data)));\n         shift += 64;\n         i >>= 64;\n      }\n      mp_clear(&t);\n      return *this;\n   }\n   tommath_int& operator=(int128_type i)\n   {\n      if (m_data.dp == nullptr)\n         detail::check_tommath_result(mp_init(&m_data));\n      bool neg = i < 0;\n      *this    = boost::multiprecision::detail::unsigned_abs(i);\n      if (neg)\n         detail::check_tommath_result(mp_neg(&m_data, &m_data));\n      return *this;\n   }\n#endif\n   //\n   // Note that although mp_set_int takes an unsigned long as an argument\n   // it only sets the first 32-bits to the result, and ignores the rest.\n   // So use uint32_t as the largest type to pass to this function.\n   //\n   tommath_int& operator=(std::uint32_t i)\n   {\n      if (m_data.dp == nullptr)\n         detail::check_tommath_result(mp_init(&m_data));\n#ifndef mp_get_u32\n      detail::check_tommath_result((mp_set_int(&m_data, i)));\n#else\n      mp_set_u32(&m_data, i);\n#endif\n      return *this;\n   }\n   tommath_int& operator=(std::int32_t i)\n   {\n      if (m_data.dp == nullptr)\n         detail::check_tommath_result(mp_init(&m_data));\n      bool neg = i < 0;\n      *this    = boost::multiprecision::detail::unsigned_abs(i);\n      if (neg)\n         detail::check_tommath_result(mp_neg(&m_data, &m_data));\n      return *this;\n   }\n   template <class F>\n   tommath_int& assign_float(F a)\n   {\n      BOOST_MP_FLOAT128_USING using std::floor; using std::frexp; using std::ldexp;\n\n      if (m_data.dp == nullptr)\n         detail::check_tommath_result(mp_init(&m_data));\n\n      if (a == 0)\n      {\n#ifndef mp_get_u32\n         detail::check_tommath_result(mp_set_int(&m_data, 0));\n#else\n         mp_set_i32(&m_data, 0);\n#endif\n         return *this;\n      }\n\n      if (a == 1)\n      {\n#ifndef mp_get_u32\n         detail::check_tommath_result(mp_set_int(&m_data, 1));\n#else\n         mp_set_i32(&m_data, 1);\n#endif\n         return *this;\n      }\n\n      BOOST_MP_ASSERT(!BOOST_MP_ISINF(a));\n      BOOST_MP_ASSERT(!BOOST_MP_ISNAN(a));\n\n      int         e;\n      F f, term;\n#ifndef mp_get_u32\n      detail::check_tommath_result(mp_set_int(&m_data, 0u));\n#else\n      mp_set_i32(&m_data, 0);\n#endif\n      ::mp_int t;\n      detail::check_tommath_result(mp_init(&t));\n\n      f = frexp(a, &e);\n\n#ifdef MP_DIGIT_BIT\n      constexpr const int shift = std::numeric_limits<int>::digits - 1;\n      using part_type = int     ;\n#else\n      constexpr const int  shift = std::numeric_limits<std::int64_t>::digits - 1;\n      using part_type = std::int64_t;\n#endif\n\n      while (f)\n      {\n         // extract int sized bits from f:\n         f    = ldexp(f, shift);\n         term = floor(f);\n         e -= shift;\n         detail::check_tommath_result(mp_mul_2d(&m_data, shift, &m_data));\n         if (term > 0)\n         {\n#ifndef mp_get_u64\n            detail::check_tommath_result(mp_set_int(&t, static_cast<part_type>(term)));\n#else\n            mp_set_i64(&t, static_cast<part_type>(term));\n#endif\n            detail::check_tommath_result(mp_add(&m_data, &t, &m_data));\n         }\n         else\n         {\n#ifndef mp_get_u64\n            detail::check_tommath_result(mp_set_int(&t, static_cast<part_type>(-term)));\n#else\n            mp_set_i64(&t, static_cast<part_type>(-term));\n#endif\n            detail::check_tommath_result(mp_sub(&m_data, &t, &m_data));\n         }\n         f -= term;\n      }\n      if (e > 0)\n         detail::check_tommath_result(mp_mul_2d(&m_data, e, &m_data));\n      else if (e < 0)\n      {\n         tommath_int t2;\n         detail::check_tommath_result(mp_div_2d(&m_data, -e, &m_data, &t2.data()));\n      }\n      mp_clear(&t);\n      return *this;\n   }\n   tommath_int& operator=(long double a)\n   {\n      return assign_float(a);\n   }\n#ifdef BOOST_HAS_FLOAT128\n   tommath_int& operator= (float128_type a)\n   {\n      return assign_float(a);\n   }\n#endif\n   tommath_int& operator=(const char* s)\n   {\n      //\n      // We don't use libtommath's own routine because it doesn't error check the input :-(\n      //\n      if (m_data.dp == nullptr)\n         detail::check_tommath_result(mp_init(&m_data));\n      std::size_t n  = s ? std::strlen(s) : 0;\n      *this          = static_cast<std::uint32_t>(0u);\n      unsigned radix = 10;\n      bool     isneg = false;\n      if (n && (*s == '-'))\n      {\n         --n;\n         ++s;\n         isneg = true;\n      }\n      if (n && (*s == '0'))\n      {\n         if ((n > 1) && ((s[1] == 'x') || (s[1] == 'X')))\n         {\n            radix = 16;\n            s += 2;\n            n -= 2;\n         }\n         else\n         {\n            radix = 8;\n            n -= 1;\n         }\n      }\n      if (n)\n      {\n         if (radix == 8 || radix == 16)\n         {\n            unsigned shift = radix == 8 ? 3 : 4;\n#ifndef MP_DIGIT_BIT\n            unsigned block_count = DIGIT_BIT / shift;\n#else\n            unsigned block_count = MP_DIGIT_BIT / shift;\n#endif\n            unsigned               block_shift = shift * block_count;\n            unsigned long long val, block;\n            while (*s)\n            {\n               block = 0;\n               for (unsigned i = 0; (i < block_count); ++i)\n               {\n                  if (*s >= '0' && *s <= '9')\n                     val = *s - '0';\n                  else if (*s >= 'a' && *s <= 'f')\n                     val = 10 + *s - 'a';\n                  else if (*s >= 'A' && *s <= 'F')\n                     val = 10 + *s - 'A';\n                  else\n                     val = 400;\n                  if (val > radix)\n                  {\n                     BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Unexpected content found while parsing character string.\"));\n                  }\n                  block <<= shift;\n                  block |= val;\n                  if (!*++s)\n                  {\n                     // final shift is different:\n                     block_shift = (i + 1) * shift;\n                     break;\n                  }\n               }\n               detail::check_tommath_result(mp_mul_2d(&data(), block_shift, &data()));\n               if (data().used)\n                  data().dp[0] |= block;\n               else\n                  *this = block;\n            }\n         }\n         else\n         {\n            // Base 10, we extract blocks of size 10^9 at a time, that way\n            // the number of multiplications is kept to a minimum:\n            std::uint32_t block_mult = 1000000000;\n            while (*s)\n            {\n               std::uint32_t block = 0;\n               for (unsigned i = 0; i < 9; ++i)\n               {\n                  std::uint32_t val;\n                  if (*s >= '0' && *s <= '9')\n                     val = *s - '0';\n                  else\n                     BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Unexpected character encountered in input.\"));\n                  block *= 10;\n                  block += val;\n                  if (!*++s)\n                  {\n                     constexpr const std::uint32_t block_multiplier[9] = {10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};\n                     block_mult                                       = block_multiplier[i];\n                     break;\n                  }\n               }\n               tommath_int t;\n               t = block_mult;\n               eval_multiply(*this, t);\n               t = block;\n               eval_add(*this, t);\n            }\n         }\n      }\n      if (isneg)\n         this->negate();\n      return *this;\n   }\n   std::string str(std::streamsize /*digits*/, std::ios_base::fmtflags f) const\n   {\n      BOOST_MP_ASSERT(m_data.dp);\n      int base = 10;\n      if ((f & std::ios_base::oct) == std::ios_base::oct)\n         base = 8;\n      else if ((f & std::ios_base::hex) == std::ios_base::hex)\n         base = 16;\n      //\n      // sanity check, bases 8 and 16 are only available for positive numbers:\n      //\n      if ((base != 10) && m_data.sign)\n         BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Formatted output in bases 8 or 16 is only available for positive numbers\"));\n\n      int s;\n      detail::check_tommath_result(mp_radix_size(const_cast< ::mp_int*>(&m_data), base, &s));\n      std::unique_ptr<char[]> a(new char[s + 1]);\n#ifndef mp_to_binary\n      detail::check_tommath_result(mp_toradix_n(const_cast< ::mp_int*>(&m_data), a.get(), base, s + 1));\n#else\n      std::size_t written;\n      detail::check_tommath_result(mp_to_radix(&m_data, a.get(), s + 1, &written, base));\n#endif\n      std::string result = a.get();\n      if (f & std::ios_base::uppercase)\n         for (size_t i = 0; i < result.length(); ++i)\n            result[i] = std::toupper(result[i]);\n      if ((base != 10) && (f & std::ios_base::showbase))\n      {\n         int         pos = result[0] == '-' ? 1 : 0;\n         const char* pp  = base == 8 ? \"0\" : (f & std::ios_base::uppercase) ? \"0X\" : \"0x\";\n         result.insert(static_cast<std::string::size_type>(pos), pp);\n      }\n      if ((f & std::ios_base::showpos) && (result[0] != '-'))\n         result.insert(static_cast<std::string::size_type>(0), 1, '+');\n      if (((f & std::ios_base::uppercase) == 0) && (base == 16))\n      {\n         for (std::size_t i = 0; i < result.size(); ++i)\n            result[i] = std::tolower(result[i]);\n      }\n      return result;\n   }\n   ~tommath_int()\n   {\n      if (m_data.dp)\n         mp_clear(&m_data);\n   }\n   void negate()\n   {\n      BOOST_MP_ASSERT(m_data.dp);\n      detail::check_tommath_result(mp_neg(&m_data, &m_data));\n   }\n   int compare(const tommath_int& o) const\n   {\n      BOOST_MP_ASSERT(m_data.dp && o.m_data.dp);\n      return mp_cmp(const_cast< ::mp_int*>(&m_data), const_cast< ::mp_int*>(&o.m_data));\n   }\n   template <class V>\n   int compare(V v) const\n   {\n      tommath_int d;\n      tommath_int t(*this);\n      detail::check_tommath_result(mp_shrink(&t.data()));\n      d = v;\n      return t.compare(d);\n   }\n   ::mp_int& data()\n   {\n      BOOST_MP_ASSERT(m_data.dp);\n      return m_data;\n   }\n   const ::mp_int& data() const\n   {\n      BOOST_MP_ASSERT(m_data.dp);\n      return m_data;\n   }\n   void swap(tommath_int& o) noexcept\n   {\n      mp_exch(&m_data, &o.data());\n   }\n\n protected:\n   ::mp_int m_data;\n};\n\n#ifndef mp_isneg\n#define BOOST_MP_TOMMATH_BIT_OP_CHECK(x) \\\n   if (SIGN(&x.data()))                  \\\n   BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Bitwise operations on libtommath negative valued integers are disabled as they produce unpredictable results\"))\n#else\n#define BOOST_MP_TOMMATH_BIT_OP_CHECK(x) \\\n   if (mp_isneg(&x.data()))              \\\n   BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"Bitwise operations on libtommath negative valued integers are disabled as they produce unpredictable results\"))\n#endif\n\nint eval_get_sign(const tommath_int& val);\n\ninline void eval_add(tommath_int& t, const tommath_int& o)\n{\n   detail::check_tommath_result(mp_add(&t.data(), const_cast< ::mp_int*>(&o.data()), &t.data()));\n}\ninline void eval_subtract(tommath_int& t, const tommath_int& o)\n{\n   detail::check_tommath_result(mp_sub(&t.data(), const_cast< ::mp_int*>(&o.data()), &t.data()));\n}\ninline void eval_multiply(tommath_int& t, const tommath_int& o)\n{\n   detail::check_tommath_result(mp_mul(&t.data(), const_cast< ::mp_int*>(&o.data()), &t.data()));\n}\ninline void eval_divide(tommath_int& t, const tommath_int& o)\n{\n   using default_ops::eval_is_zero;\n   tommath_int temp;\n   if (eval_is_zero(o))\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Integer division by zero\"));\n   detail::check_tommath_result(mp_div(&t.data(), const_cast< ::mp_int*>(&o.data()), &t.data(), &temp.data()));\n}\ninline void eval_modulus(tommath_int& t, const tommath_int& o)\n{\n   using default_ops::eval_is_zero;\n   if (eval_is_zero(o))\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Integer division by zero\"));\n   bool neg  = eval_get_sign(t) < 0;\n   bool neg2 = eval_get_sign(o) < 0;\n   detail::check_tommath_result(mp_mod(&t.data(), const_cast< ::mp_int*>(&o.data()), &t.data()));\n   if ((neg != neg2) && (eval_get_sign(t) != 0))\n   {\n      t.negate();\n      detail::check_tommath_result(mp_add(&t.data(), const_cast< ::mp_int*>(&o.data()), &t.data()));\n      t.negate();\n   }\n   else if (neg && (t.compare(o) == 0))\n   {\n      mp_zero(&t.data());\n   }\n}\ntemplate <class UI>\ninline void eval_left_shift(tommath_int& t, UI i)\n{\n   detail::check_tommath_result(mp_mul_2d(&t.data(), static_cast<unsigned>(i), &t.data()));\n}\ntemplate <class UI>\ninline void eval_right_shift(tommath_int& t, UI i)\n{\n   using default_ops::eval_decrement;\n   using default_ops::eval_increment;\n   bool        neg = eval_get_sign(t) < 0;\n   tommath_int d;\n   if (neg)\n      eval_increment(t);\n   detail::check_tommath_result(mp_div_2d(&t.data(), static_cast<unsigned>(i), &t.data(), &d.data()));\n   if (neg)\n      eval_decrement(t);\n}\ntemplate <class UI>\ninline void eval_left_shift(tommath_int& t, const tommath_int& v, UI i)\n{\n   detail::check_tommath_result(mp_mul_2d(const_cast< ::mp_int*>(&v.data()), static_cast<unsigned>(i), &t.data()));\n}\n/*\ntemplate <class UI>\ninline void eval_right_shift(tommath_int& t, const tommath_int& v, UI i)\n{\n   tommath_int d;\n   detail::check_tommath_result(mp_div_2d(const_cast< ::mp_int*>(&v.data()), static_cast<unsigned long>(i), &t.data(), &d.data()));\n}\n*/\ninline void eval_bitwise_and(tommath_int& result, const tommath_int& v)\n{\n   BOOST_MP_TOMMATH_BIT_OP_CHECK(result);\n   BOOST_MP_TOMMATH_BIT_OP_CHECK(v);\n   detail::check_tommath_result(mp_and(&result.data(), const_cast< ::mp_int*>(&v.data()), &result.data()));\n}\n\ninline void eval_bitwise_or(tommath_int& result, const tommath_int& v)\n{\n   BOOST_MP_TOMMATH_BIT_OP_CHECK(result);\n   BOOST_MP_TOMMATH_BIT_OP_CHECK(v);\n   detail::check_tommath_result(mp_or(&result.data(), const_cast< ::mp_int*>(&v.data()), &result.data()));\n}\n\ninline void eval_bitwise_xor(tommath_int& result, const tommath_int& v)\n{\n   BOOST_MP_TOMMATH_BIT_OP_CHECK(result);\n   BOOST_MP_TOMMATH_BIT_OP_CHECK(v);\n   detail::check_tommath_result(mp_xor(&result.data(), const_cast< ::mp_int*>(&v.data()), &result.data()));\n}\n\ninline void eval_add(tommath_int& t, const tommath_int& p, const tommath_int& o)\n{\n   detail::check_tommath_result(mp_add(const_cast< ::mp_int*>(&p.data()), const_cast< ::mp_int*>(&o.data()), &t.data()));\n}\ninline void eval_subtract(tommath_int& t, const tommath_int& p, const tommath_int& o)\n{\n   detail::check_tommath_result(mp_sub(const_cast< ::mp_int*>(&p.data()), const_cast< ::mp_int*>(&o.data()), &t.data()));\n}\ninline void eval_multiply(tommath_int& t, const tommath_int& p, const tommath_int& o)\n{\n   detail::check_tommath_result(mp_mul(const_cast< ::mp_int*>(&p.data()), const_cast< ::mp_int*>(&o.data()), &t.data()));\n}\ninline void eval_divide(tommath_int& t, const tommath_int& p, const tommath_int& o)\n{\n   using default_ops::eval_is_zero;\n   tommath_int d;\n   if (eval_is_zero(o))\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Integer division by zero\"));\n   detail::check_tommath_result(mp_div(const_cast< ::mp_int*>(&p.data()), const_cast< ::mp_int*>(&o.data()), &t.data(), &d.data()));\n}\ninline void eval_modulus(tommath_int& t, const tommath_int& p, const tommath_int& o)\n{\n   using default_ops::eval_is_zero;\n   if (eval_is_zero(o))\n      BOOST_MP_THROW_EXCEPTION(std::overflow_error(\"Integer division by zero\"));\n   bool neg  = eval_get_sign(p) < 0;\n   bool neg2 = eval_get_sign(o) < 0;\n   detail::check_tommath_result(mp_mod(const_cast< ::mp_int*>(&p.data()), const_cast< ::mp_int*>(&o.data()), &t.data()));\n   if ((neg != neg2) && (eval_get_sign(t) != 0))\n   {\n      t.negate();\n      detail::check_tommath_result(mp_add(&t.data(), const_cast< ::mp_int*>(&o.data()), &t.data()));\n      t.negate();\n   }\n   else if (neg && (t.compare(o) == 0))\n   {\n      mp_zero(&t.data());\n   }\n}\n\ninline void eval_bitwise_and(tommath_int& result, const tommath_int& u, const tommath_int& v)\n{\n   BOOST_MP_TOMMATH_BIT_OP_CHECK(u);\n   BOOST_MP_TOMMATH_BIT_OP_CHECK(v);\n   detail::check_tommath_result(mp_and(const_cast< ::mp_int*>(&u.data()), const_cast< ::mp_int*>(&v.data()), &result.data()));\n}\n\ninline void eval_bitwise_or(tommath_int& result, const tommath_int& u, const tommath_int& v)\n{\n   BOOST_MP_TOMMATH_BIT_OP_CHECK(u);\n   BOOST_MP_TOMMATH_BIT_OP_CHECK(v);\n   detail::check_tommath_result(mp_or(const_cast< ::mp_int*>(&u.data()), const_cast< ::mp_int*>(&v.data()), &result.data()));\n}\n\ninline void eval_bitwise_xor(tommath_int& result, const tommath_int& u, const tommath_int& v)\n{\n   BOOST_MP_TOMMATH_BIT_OP_CHECK(u);\n   BOOST_MP_TOMMATH_BIT_OP_CHECK(v);\n   detail::check_tommath_result(mp_xor(const_cast< ::mp_int*>(&u.data()), const_cast< ::mp_int*>(&v.data()), &result.data()));\n}\n/*\ninline void eval_complement(tommath_int& result, const tommath_int& u)\n{\n   //\n   // Although this code works, it doesn't really do what the user might expect....\n   // and it's hard to see how it ever could.  Disabled for now:\n   //\n   result = u;\n   for(int i = 0; i < result.data().used; ++i)\n   {\n      result.data().dp[i] = MP_MASK & ~(result.data().dp[i]);\n   }\n   //\n   // We now need to pad out the left of the value with 1's to round up to a whole number of\n   // CHAR_BIT * sizeof(mp_digit) units.  Otherwise we'll end up with a very strange number of\n   // bits set!\n   //\n   unsigned shift = result.data().used * DIGIT_BIT;    // How many bits we're actually using\n   // How many bits we actually need, reduced by one to account for a mythical sign bit:\n   int padding = result.data().used * std::numeric_limits<mp_digit>::digits - shift - 1;\n   while(padding >= std::numeric_limits<mp_digit>::digits)\n      padding -= std::numeric_limits<mp_digit>::digits;\n\n   // Create a mask providing the extra bits we need and add to result:\n   tommath_int mask;\n   mask = static_cast<long long>((1u << padding) - 1);\n   eval_left_shift(mask, shift);\n   add(result, mask);\n}\n*/\ninline bool eval_is_zero(const tommath_int& val)\n{\n   return mp_iszero(&val.data());\n}\ninline int eval_get_sign(const tommath_int& val)\n{\n#ifndef mp_isneg\n   return mp_iszero(&val.data()) ? 0 : SIGN(&val.data()) ? -1 : 1;\n#else\n   return mp_iszero(&val.data()) ? 0 : mp_isneg(&val.data()) ? -1 : 1;\n#endif\n}\n\ninline void eval_convert_to(unsigned long long* result, const tommath_int& val)\n{\n   if (mp_isneg(&val.data()))\n   {\n      BOOST_MP_THROW_EXCEPTION(std::range_error(\"Converting negative arbitrary precision value to unsigned.\"));\n   }\n#ifdef MP_DEPRECATED\n   *result = mp_get_ull(&val.data());\n#else\n   *result = mp_get_long_long(const_cast<mp_int*>(&val.data()));\n#endif\n}\n\ninline void eval_convert_to(long long* result, const tommath_int& val)\n{\n   if (!mp_iszero(&val.data()) && (mp_count_bits(const_cast<::mp_int*>(&val.data())) > std::numeric_limits<long long>::digits))\n   {\n      *result = mp_isneg(&val.data()) ? (std::numeric_limits<long long>::min)() : (std::numeric_limits<long long>::max)();\n      return;\n   }\n#ifdef MP_DEPRECATED\n   unsigned long long r = mp_get_mag_ull(&val.data());\n#else\n   unsigned long long r = mp_get_long_long(const_cast<mp_int*>(&val.data()));\n#endif\n   if (mp_isneg(&val.data()))\n      *result = -static_cast<long long>(r);\n   else\n      *result = r;\n}\n\n#ifdef BOOST_HAS_INT128\ninline void eval_convert_to(uint128_type* result, const tommath_int& val)\n{\n#ifdef MP_DEPRECATED\n   if (mp_ubin_size(&val.data()) > sizeof(uint128_type))\n   {\n      *result = ~static_cast<uint128_type>(0);\n      return;\n   }\n   unsigned char buf[sizeof(uint128_type)];\n   std::size_t   len;\n   detail::check_tommath_result(mp_to_ubin(&val.data(), buf, sizeof(buf), &len));\n   *result = 0;\n   for (std::size_t i = 0; i < len; ++i)\n   {\n      *result <<= CHAR_BIT;\n      *result |= buf[i];\n   }\n#else\n   std::size_t len = mp_unsigned_bin_size(const_cast<mp_int*>(&val.data()));\n   if (len > sizeof(uint128_type))\n   {\n      *result = ~static_cast<uint128_type>(0);\n      return;\n   }\n   unsigned char buf[sizeof(uint128_type)];\n   detail::check_tommath_result(mp_to_unsigned_bin(const_cast<mp_int*>(&val.data()), buf));\n   *result = 0;\n   for (std::size_t i = 0; i < len; ++i)\n   {\n      *result <<= CHAR_BIT;\n      *result |= buf[i];\n   }\n#endif\n}\ninline void eval_convert_to(int128_type* result, const tommath_int& val)\n{\n   uint128_type r;\n   eval_convert_to(&r, val);\n   if (mp_isneg(&val.data()))\n      *result = -static_cast<int128_type>(r);\n   else\n      *result = r;\n}\n#endif\n#if defined(BOOST_HAS_FLOAT128)\ninline void eval_convert_to(float128_type* result, const tommath_int& val) noexcept\n{\n   *result = float128_procs::strtoflt128(val.str(0, std::ios_base::scientific).c_str(), nullptr);\n}\n#endif\ninline void eval_convert_to(long double* result, const tommath_int& val) noexcept\n{\n   *result = std::strtold(val.str(0, std::ios_base::scientific).c_str(), nullptr);\n}\ninline void eval_convert_to(double* result, const tommath_int& val) noexcept\n{\n   *result = std::strtod(val.str(0, std::ios_base::scientific).c_str(), nullptr);\n}\ninline void eval_convert_to(float* result, const tommath_int& val) noexcept\n{\n   *result = std::strtof(val.str(0, std::ios_base::scientific).c_str(), nullptr);\n}\n\n\ninline void eval_abs(tommath_int& result, const tommath_int& val)\n{\n   detail::check_tommath_result(mp_abs(const_cast< ::mp_int*>(&val.data()), &result.data()));\n}\ninline void eval_gcd(tommath_int& result, const tommath_int& a, const tommath_int& b)\n{\n   detail::check_tommath_result(mp_gcd(const_cast< ::mp_int*>(&a.data()), const_cast< ::mp_int*>(&b.data()), const_cast< ::mp_int*>(&result.data())));\n}\ninline void eval_lcm(tommath_int& result, const tommath_int& a, const tommath_int& b)\n{\n   detail::check_tommath_result(mp_lcm(const_cast< ::mp_int*>(&a.data()), const_cast< ::mp_int*>(&b.data()), const_cast< ::mp_int*>(&result.data())));\n}\ninline void eval_powm(tommath_int& result, const tommath_int& base, const tommath_int& p, const tommath_int& m)\n{\n   if (eval_get_sign(p) < 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::runtime_error(\"powm requires a positive exponent.\"));\n   }\n   detail::check_tommath_result(mp_exptmod(const_cast< ::mp_int*>(&base.data()), const_cast< ::mp_int*>(&p.data()), const_cast< ::mp_int*>(&m.data()), &result.data()));\n}\n\ninline void eval_qr(const tommath_int& x, const tommath_int& y,\n                    tommath_int& q, tommath_int& r)\n{\n   detail::check_tommath_result(mp_div(const_cast< ::mp_int*>(&x.data()), const_cast< ::mp_int*>(&y.data()), &q.data(), &r.data()));\n}\n\ninline std::size_t eval_lsb(const tommath_int& val)\n{\n   int c = eval_get_sign(val);\n   if (c == 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::domain_error(\"No bits were set in the operand.\"));\n   }\n   if (c < 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::domain_error(\"Testing individual bits in negative values is not supported - results are undefined.\"));\n   }\n   return mp_cnt_lsb(const_cast< ::mp_int*>(&val.data()));\n}\n\ninline std::size_t eval_msb(const tommath_int& val)\n{\n   int c = eval_get_sign(val);\n   if (c == 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::domain_error(\"No bits were set in the operand.\"));\n   }\n   if (c < 0)\n   {\n      BOOST_MP_THROW_EXCEPTION(std::domain_error(\"Testing individual bits in negative values is not supported - results are undefined.\"));\n   }\n   return mp_count_bits(const_cast< ::mp_int*>(&val.data())) - 1;\n}\n\ntemplate <class Integer>\ninline typename std::enable_if<boost::multiprecision::detail::is_unsigned<Integer>::value, Integer>::type eval_integer_modulus(const tommath_int& x, Integer val)\n{\n#ifndef MP_DIGIT_BIT\n   constexpr const mp_digit m = (static_cast<mp_digit>(1) << DIGIT_BIT) - 1;\n#else\n   constexpr const mp_digit m = (static_cast<mp_digit>(1) << MP_DIGIT_BIT) - 1;\n#endif\n   if (val <= m)\n   {\n      mp_digit d;\n      detail::check_tommath_result(mp_mod_d(const_cast< ::mp_int*>(&x.data()), static_cast<mp_digit>(val), &d));\n      return d;\n   }\n   else\n   {\n      return default_ops::eval_integer_modulus(x, val);\n   }\n}\ntemplate <class Integer>\ninline typename std::enable_if<boost::multiprecision::detail::is_signed<Integer>::value && boost::multiprecision::detail::is_integral<Integer>::value, Integer>::type eval_integer_modulus(const tommath_int& x, Integer val)\n{\n   return eval_integer_modulus(x, boost::multiprecision::detail::unsigned_abs(val));\n}\n\ninline std::size_t hash_value(const tommath_int& val)\n{\n   std::size_t result = 0;\n   std::size_t len    = val.data().used;\n   for (std::size_t i = 0; i < len; ++i)\n      boost::multiprecision::detail::hash_combine(result, val.data().dp[i]);\n   boost::multiprecision::detail::hash_combine(result, val.data().sign);\n   return result;\n}\n\n} // namespace backends\n\nusing boost::multiprecision::backends::tommath_int;\n\ntemplate <>\nstruct number_category<tommath_int> : public std::integral_constant<int, number_kind_integer>\n{};\n\nusing tom_int = number<tommath_int>          ;\nusing tommath_rational = rational_adaptor<tommath_int>;\nusing tom_rational = number<tommath_rational>     ;\n}\n} // namespace boost::multiprecision\n\nnamespace std {\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nclass numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >\n{\n   using number_type = boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates>;\n\n public:\n   static constexpr bool is_specialized = true;\n   //\n   // Largest and smallest numbers are bounded only by available memory, set\n   // to zero:\n   //\n   static number_type(min)()\n   {\n      return number_type();\n   }\n   static number_type(max)()\n   {\n      return number_type();\n   }\n   static number_type                        lowest() { return (min)(); }\n   static constexpr int                digits       = INT_MAX;\n   static constexpr int                digits10     = (INT_MAX / 1000) * 301L;\n   static constexpr int                max_digits10 = digits10 + 3;\n   static constexpr bool               is_signed    = true;\n   static constexpr bool               is_integer   = true;\n   static constexpr bool               is_exact     = true;\n   static constexpr int                radix        = 2;\n   static number_type                        epsilon() { return number_type(); }\n   static number_type                        round_error() { return number_type(); }\n   static constexpr int                min_exponent      = 0;\n   static constexpr int                min_exponent10    = 0;\n   static constexpr int                max_exponent      = 0;\n   static constexpr int                max_exponent10    = 0;\n   static constexpr bool               has_infinity      = false;\n   static constexpr bool               has_quiet_NaN     = false;\n   static constexpr bool               has_signaling_NaN = false;\n   static constexpr float_denorm_style has_denorm        = denorm_absent;\n   static constexpr bool               has_denorm_loss   = false;\n   static number_type                        infinity() { return number_type(); }\n   static number_type                        quiet_NaN() { return number_type(); }\n   static number_type                        signaling_NaN() { return number_type(); }\n   static number_type                        denorm_min() { return number_type(); }\n   static constexpr bool               is_iec559       = false;\n   static constexpr bool               is_bounded      = false;\n   static constexpr bool               is_modulo       = false;\n   static constexpr bool               traps           = false;\n   static constexpr bool               tinyness_before = false;\n   static constexpr float_round_style  round_style     = round_toward_zero;\n};\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::digits;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::digits10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::max_digits10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::is_signed;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::is_integer;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::is_exact;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::radix;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::min_exponent;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::min_exponent10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::max_exponent;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::max_exponent10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::has_infinity;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::has_quiet_NaN;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::has_signaling_NaN;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_denorm_style numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::has_denorm;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::has_denorm_loss;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::is_iec559;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::is_bounded;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::is_modulo;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::traps;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::tinyness_before;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_round_style numeric_limits<boost::multiprecision::number<boost::multiprecision::tommath_int, ExpressionTemplates> >::round_style;\n\n} // namespace std\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/traits/explicit_conversion.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright Vicente J. Botet Escriba 2009-2011\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_EXPLICIT_CONVERSION_HPP\n#define BOOST_MP_EXPLICIT_CONVERSION_HPP\n\n#include <type_traits>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n#include <boost/multiprecision/detail/number_base.hpp> // number_category\n\nnamespace boost {\nnamespace multiprecision {\nnamespace detail {\n\ntemplate <unsigned int N>\nstruct dummy_size\n{};\n\ntemplate <typename S, typename T>\nstruct has_generic_interconversion\n{\n   using type = typename std::conditional<\n       is_number<S>::value && is_number<T>::value,\n       typename std::conditional<\n           number_category<S>::value == number_kind_integer,\n           typename std::conditional<\n               number_category<T>::value == number_kind_integer || number_category<T>::value == number_kind_floating_point || number_category<T>::value == number_kind_rational || number_category<T>::value == number_kind_fixed_point,\n               std::true_type,\n               std::false_type >::type,\n           typename std::conditional<\n               number_category<S>::value == number_kind_rational,\n               typename std::conditional<\n                   number_category<T>::value == number_kind_rational || number_category<T>::value == number_kind_rational,\n                   std::true_type,\n                   std::false_type >::type,\n               typename std::conditional<\n                   number_category<T>::value == number_kind_floating_point,\n                   std::true_type,\n                   std::false_type >::type>::type>::type,\n       std::false_type >::type;\n};\n\ntemplate <typename S, typename T>\nstruct is_explicitly_convertible_imp\n{\n   template <typename S1, typename T1>\n   static int selector(dummy_size<static_cast<unsigned int>(sizeof(new T1(std::declval<S1>())))>*);\n\n   template <typename S1, typename T1>\n   static char selector(...);\n\n   static constexpr bool value = sizeof(selector<S, T>(nullptr)) == sizeof(int);\n\n   using type = std::integral_constant<bool, value>;\n};\n\ntemplate <typename From, typename To>\nstruct is_explicitly_convertible : public is_explicitly_convertible_imp<From, To>::type\n{\n};\n\n}}} // namespace boost::multiprecision::detail\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/traits/extract_exponent_type.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_EXTRACT_EXPONENT_TYPE_HPP\n#define BOOST_MP_EXTRACT_EXPONENT_TYPE_HPP\n\n#include <boost/multiprecision/number.hpp>\n\nnamespace boost {\nnamespace multiprecision {\nnamespace backends {\n\ntemplate <class Backend, int cat>\nstruct extract_exponent_type\n{\n   using type = int;\n};\ntemplate <class Backend>\nstruct extract_exponent_type<Backend, number_kind_floating_point>\n{\n   using type = typename Backend::exponent_type;\n};\n\n}}} // namespace boost::multiprecision::backends\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/traits/is_backend.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2015 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_IS_BACKEND_HPP\n#define BOOST_MP_IS_BACKEND_HPP\n\n#include <type_traits>\n#include <boost/multiprecision/detail/number_base.hpp>\n\nnamespace boost { namespace multiprecision { namespace detail {\n\ntemplate <class T>\nstruct has_signed_types\n{\n   template <class U>\n   static double check(U*, typename U::signed_types* = nullptr);\n   static char   check(...);\n   static T* get();\n   static constexpr bool value = sizeof(check(get())) == sizeof(double);\n};\ntemplate <class T>\nstruct has_unsigned_types\n{\n   template <class U>\n   static double check(U*, typename U::unsigned_types* = nullptr);\n   static char   check(...);\n   static T* get();\n   static constexpr bool value = sizeof(check(get())) == sizeof(double);\n};\ntemplate <class T>\nstruct has_float_types\n{\n   template <class U>\n   static double check(U*, typename U::float_types* = nullptr);\n   static char   check(...);\n   static T* get();\n   static constexpr bool value = sizeof(check(get())) == sizeof(double);\n};\n\ntemplate <class T>\nstruct is_backend : public std::integral_constant<bool, has_signed_types<T>::value && has_unsigned_types<T>::value && has_float_types<T>::value> {};\n\ntemplate <class Backend>\nstruct other_backend\n{\n   using type = typename std::conditional<\n       std::is_same<number<Backend>, number<Backend, et_on> >::value,\n       number<Backend, et_off>, number<Backend, et_on> >::type;\n};\n\ntemplate <class B, class V>\nstruct number_from_backend\n{\n   using type = typename std::conditional<\n       std::is_convertible<V, number<B> >::value,\n       number<B>,\n       typename other_backend<B>::type>::type;\n};\n\ntemplate <bool b, class T, class U>\nstruct is_first_backend_imp : public std::false_type {};\n\ntemplate <class T, class U>\n    struct is_first_backend_imp<true, T, U> : public std::integral_constant < bool, std::is_convertible<U, number<T, et_on> >::value || std::is_convertible<U, number<T, et_off> >::value> {};\n\ntemplate <class T, class U>\nstruct is_first_backend : is_first_backend_imp<is_backend<T>::value, T, U>\n{};\n\ntemplate <bool b, class T, class U>\nstruct is_second_backend_imp\n{\n   static constexpr bool value = false;\n};\ntemplate <class T, class U>\nstruct is_second_backend_imp<true, T, U>\n{\n   static constexpr bool value = (std::is_convertible<T, number<U, et_on> >::value || std::is_convertible<T, number<U, et_off> >::value) && !is_first_backend<T, U>::value;\n};\n\ntemplate <class T, class U>\nstruct is_second_backend : is_second_backend_imp<is_backend<U>::value, T, U>\n{};\n\n}\n}\n} // namespace boost::multiprecision::detail\n\n#endif // BOOST_MP_IS_BACKEND_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/traits/is_byte_container.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2015 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_IS_BYTE_CONTAINER_HPP\n#define BOOST_IS_BYTE_CONTAINER_HPP\n\n#include <iterator>\n#include <type_traits>\n\nnamespace boost { namespace multiprecision { namespace detail {\n\ntemplate <class T>\nstruct has_member_const_iterator\n{\n   template <class U>\n   static double         check(U*, typename U::const_iterator* = nullptr);\n   static char           check(...);\n   static T*             get();\n   static constexpr bool value = sizeof(check(get())) == sizeof(double);\n};\n\n\ntemplate <class C, class Iterator>\nstruct is_byte_container_imp_2\n{\n   using container_value_type = typename std::remove_cv<typename std::iterator_traits<typename C::const_iterator>::value_type>::type;\n   static constexpr bool value = boost::multiprecision::detail::is_integral<container_value_type>::value && (sizeof(container_value_type) == 1);\n};\n\ntemplate <class C>\nstruct is_byte_container_imp_2<C, void> : public std::false_type\n{};\n\ntemplate <class C, bool b>\nstruct is_byte_container_imp : public is_byte_container_imp_2<C, typename C::const_iterator>\n{\n};\n\ntemplate <class C>\nstruct is_byte_container_imp<C, false> : public std::false_type\n{};\n\ntemplate <class C>\nstruct is_byte_container : public is_byte_container_imp<C, has_member_const_iterator<C>::value>\n{};\n\n}}} // namespace boost::multiprecision::detail\n\n#endif // BOOST_IS_BYTE_CONTAINER_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/traits/is_complex.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_IS_COMPLEX_HPP\n#define BOOST_MP_IS_COMPLEX_HPP\n\n#include <type_traits>\n#include <complex>\n\nnamespace boost { namespace multiprecision { namespace detail {\n\ntemplate <class T> struct is_complex : public std::integral_constant<bool, false> {};\n\ntemplate <class T> struct is_complex<std::complex<T> > : public std::integral_constant<bool, true> {};\n\n}\n}\n} // namespace boost::multiprecision::detail\n\n#endif // BOOST_MP_IS_BACKEND_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/traits/is_convertible_arithmetic.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_IS_CONVERTIBLE_ARITHMETIC_HPP\n#define BOOST_IS_CONVERTIBLE_ARITHMETIC_HPP\n\n#include <type_traits>\n#include <boost/multiprecision/detail/number_base.hpp>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n\nnamespace boost { namespace multiprecision { namespace detail {\n\ntemplate <class V, class Backend>\nstruct is_convertible_arithmetic\n{\n   static constexpr bool value = boost::multiprecision::detail::is_arithmetic<V>::value;\n};\n//\n// For extension types, we don't *require* interoperability, \n// so only enable it if we can convert the type to the backend\n// losslessly, ie not via conversion to a narrower type.\n// Note that backends with templated constructors/=operators\n// will not be selected here, so these need to either specialize\n// this trait, or provide a proper non-template constructor/=operator\n// for the extension types it supports.\n//\n#ifdef BOOST_HAS_FLOAT128\ntemplate <class Backend>\nstruct is_convertible_arithmetic<float128_type, Backend>\n{\n   static constexpr bool value = std::is_assignable<Backend, convertible_to<float128_type>>::value;\n};\n#endif\n#ifdef BOOST_HAS_INT128\ntemplate <class Backend>\nstruct is_convertible_arithmetic<int128_type, Backend>\n{\n   static constexpr bool value = std::is_assignable<Backend, convertible_to<int128_type>>::value;\n};\ntemplate <class Backend>\nstruct is_convertible_arithmetic<uint128_type, Backend>\n{\n   static constexpr bool value = std::is_assignable<Backend, convertible_to<uint128_type>>::value;\n};\n#endif\n\n}}} // namespace boost::multiprecision::detail\n\n#endif // BOOST_IS_BYTE_CONTAINER_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/traits/is_restricted_conversion.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright Vicente J. Botet Escriba 2009-2011\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_IS_RESTRICTED_CONVERSION_HPP\n#define BOOST_MP_IS_RESTRICTED_CONVERSION_HPP\n\n#include <boost/multiprecision/traits/explicit_conversion.hpp>\n#include <boost/multiprecision/detail/number_base.hpp>\n\nnamespace boost { namespace multiprecision { namespace detail {\n\ntemplate <class From, class To>\nstruct is_lossy_conversion\n{\n   static constexpr bool category_conditional_is_true =\n         (   (static_cast<boost::multiprecision::number_category_type>(number_category<From>::value) == number_kind_floating_point)\n          && (static_cast<boost::multiprecision::number_category_type>(number_category<To  >::value) == number_kind_integer))\n      || (   (static_cast<boost::multiprecision::number_category_type>(number_category<From>::value) == number_kind_rational)\n          && (static_cast<boost::multiprecision::number_category_type>(number_category<To  >::value) == number_kind_integer))\n      || (   (static_cast<boost::multiprecision::number_category_type>(number_category<From>::value) == number_kind_fixed_point)\n          && (static_cast<boost::multiprecision::number_category_type>(number_category<To  >::value) == number_kind_integer))\n      ||     (static_cast<boost::multiprecision::number_category_type>(number_category<From>::value) == number_kind_unknown)\n      ||     (static_cast<boost::multiprecision::number_category_type>(number_category<To  >::value) == number_kind_unknown);\n\n   using type = typename std::conditional<category_conditional_is_true,\n                                          std::integral_constant<bool, true>,\n                                          std::integral_constant<bool, false>>::type;\n\n   static constexpr bool value = type::value;\n};\n\ntemplate <typename From, typename To>\nstruct is_restricted_conversion\n{\n   using type = typename std::conditional<\n       ((is_explicitly_convertible<From, To>::value && !std::is_convertible<From, To>::value) || is_lossy_conversion<From, To>::value),\n       std::integral_constant<bool, true>,\n       std::integral_constant<bool, false>>::type;\n   static constexpr const bool                     value = type::value;\n};\n\n}}} // namespace boost::multiprecision::detail\n\n#endif // BOOST_MP_IS_RESTRICTED_CONVERSION_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/traits/is_variable_precision.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_IS_VARIABLE_PRECISION_HPP\n#define BOOST_MP_IS_VARIABLE_PRECISION_HPP\n\n#include <boost/multiprecision/detail/number_base.hpp>\n\nnamespace boost { namespace multiprecision { namespace detail {\n\ntemplate <class Backend>\nstruct is_variable_precision : public std::integral_constant<bool, false>\n{};\n\ntemplate <class Backend, expression_template_option ExpressionTemplates>\nstruct is_variable_precision<number<Backend, ExpressionTemplates> > : public is_variable_precision<Backend>\n{};\n\n}\n}\n} // namespace boost::multiprecision::detail\n\n#endif // BOOST_MP_IS_BACKEND_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/traits/max_digits10.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_MAX_DIGITS10_HPP\n#define BOOST_MP_MAX_DIGITS10_HPP\n\nnamespace boost {\nnamespace multiprecision {\nnamespace detail {\n\ntemplate <unsigned digits>\nstruct calc_max_digits10\n{\n   static constexpr unsigned max_digits_10(unsigned d)\n   {\n      //\n      // We need ceil(log10(2) * d) + 1 decimal places to\n      // guarantee round tripping, see: https://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/\n      // and references therein.  Since log10(2) is irrational, then d*log10(2) will\n      // never be exactly an integer so we can replace by trunc(log10(2) * d) + 2\n      // and avoid the call to ceil:\n      //\n      return static_cast<unsigned>(0.301029995663981195213738894724493026768189881462108541310 * d) + 2;\n   }\n   static constexpr unsigned value = max_digits_10(digits);\n};\n\ntemplate <std::size_t digits>\nstruct calc_max_digits10_s\n{\n   static constexpr std::size_t max_digits_10(std::size_t d)\n   {\n      //\n      // We need ceil(log10(2) * d) + 1 decimal places to\n      // guarantee round tripping, see: https://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/\n      // and references therein.  Since log10(2) is irrational, then d*log10(2) will\n      // never be exactly an integer so we can replace by trunc(log10(2) * d) + 2\n      // and avoid the call to ceil:\n      //\n      return static_cast<std::size_t>(static_cast<std::size_t>(0.301029995663981195213738894724493026768189881462108541310 * static_cast<double>(d)) + 2u);\n   }\n   static constexpr std::size_t value = max_digits_10(digits);\n};\n\ntemplate <unsigned digits>\nstruct calc_digits10\n{\n   static constexpr unsigned digits_10(unsigned d)\n   {\n      //\n      // We need floor(log10(2) * (d-1)), see: \n      // https://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/\n      // and references therein.\n      //\n      return static_cast<unsigned>(0.301029995663981195213738894724493026768189881462108541310 * static_cast<double>(d - 1u));\n   }\n   static constexpr unsigned value = digits_10(digits);\n};\n\ntemplate <std::size_t digits>\nstruct calc_digits10_s\n{\n   static constexpr std::size_t digits_10(std::size_t d)\n   {\n      //\n      // We need floor(log10(2) * (d-1)), see: \n      // https://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/\n      // and references therein.\n      //\n      return static_cast<std::size_t>(0.301029995663981195213738894724493026768189881462108541310 * static_cast<double>(d - 1u));\n   }\n   static constexpr std::size_t value = digits_10(digits);\n};\n\n}}} // namespace boost::multiprecision::detail\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/traits/std_integer_traits.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012-2022 John Maddock.\n//  Copyright 2022 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_STD_INTEGER_TRAITS_HPP\n#define BOOST_MP_STD_INTEGER_TRAITS_HPP\n\n#include <type_traits>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n\nnamespace boost {\nnamespace multiprecision {\nnamespace detail {\n\ntemplate <class T>\nstruct is_signed : public std::is_signed<T> {};\ntemplate <class T>\nstruct is_unsigned : public std::is_unsigned<T> {};\ntemplate <class T>\nstruct is_integral : public std::is_integral<T> {};\ntemplate <class T>\nstruct is_arithmetic : public std::is_arithmetic<T> {};\ntemplate <class T>\nstruct make_unsigned : public std::make_unsigned<T> {};\ntemplate <class T>\nstruct make_signed : public std::make_signed<T> {};\n\n#ifdef BOOST_HAS_INT128\n\ntemplate <>\nstruct is_signed<int128_type> : public std::true_type {};\ntemplate <>\nstruct is_signed<uint128_type> : public std::false_type {};\ntemplate <>\nstruct is_unsigned<int128_type> : public std::false_type {};\ntemplate <>\nstruct is_unsigned<uint128_type> : public std::true_type {};\ntemplate <>\nstruct is_integral<int128_type> : public std::true_type {};\ntemplate <>\nstruct is_integral<uint128_type> : public std::true_type {};\ntemplate <>\nstruct is_arithmetic<int128_type> : public std::true_type {};\ntemplate <>\nstruct is_arithmetic<uint128_type> : public std::true_type {};\ntemplate <>\nstruct make_unsigned<int128_type>\n{\n   using type = uint128_type;\n};\ntemplate <>\nstruct make_unsigned<uint128_type>\n{\n   using type = uint128_type;\n};\ntemplate <>\nstruct make_signed<int128_type>\n{\n   using type = int128_type;\n};\ntemplate <>\nstruct make_signed<uint128_type>\n{\n   using type = int128_type;\n};\n\n#endif\n\n// C++17-esque helpers\n#if defined(__cpp_variable_templates) && __cpp_variable_templates >= 201304L\ntemplate <typename T>\nBOOST_INLINE_CONSTEXPR bool is_signed_v = is_signed<T>::value;\ntemplate <typename T>\nBOOST_INLINE_CONSTEXPR bool is_unsigned_v = is_unsigned<T>::value;\ntemplate <typename T>\nBOOST_INLINE_CONSTEXPR bool is_integral_v = is_integral<T>::value;\ntemplate <typename T>\nBOOST_INLINE_CONSTEXPR bool is_arithmetic_v = is_arithmetic<T>::value;\n#endif\n\ntemplate <typename T>\nusing make_unsigned_t = typename make_unsigned<T>::type;\ntemplate <typename T>\nusing make_signed_t = typename make_signed<T>::type;\n\n}}} // namespace boost::multiprecision::detail\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/multiprecision/traits/transcendental_reduction_type.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2020 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MP_TRANSCENDENTAL_REDUCTION_TYPE_HPP\n#define BOOST_MP_TRANSCENDENTAL_REDUCTION_TYPE_HPP\n\nnamespace boost { namespace multiprecision { namespace detail {\n\ntemplate <class T>\nstruct transcendental_reduction_type\n{\n   using type = T;\n};\n\n}\n}\n} // namespace boost::multiprecision::detail\n\n#endif // BOOST_MP_TRANSCENDENTAL_REDUCTION_TYPE_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/include/boost/version.hpp",
    "content": "//  Boost version.hpp configuration header file  ------------------------------//\n\n//  (C) Copyright John maddock 1999. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/libs/config for documentation\n\n#ifndef BOOST_VERSION_HPP\n#define BOOST_VERSION_HPP\n\n//\n//  Caution: this is the only Boost header that is guaranteed\n//  to change with every Boost release. Including this header\n//  will cause a recompile every time a new Boost version is\n//  used.\n//\n//  BOOST_VERSION % 100 is the patch level\n//  BOOST_VERSION / 100 % 1000 is the minor version\n//  BOOST_VERSION / 100000 is the major version\n\n#define BOOST_VERSION 108100\n\n//\n//  BOOST_LIB_VERSION must be defined to be the same as BOOST_VERSION\n//  but as a *string* in the form \"x_y[_z]\" where x is the major version\n//  number, y is the minor version number, and z is the patch level if not 0.\n//  This is used by <config/auto_link.hpp> to select which library version to link to.\n\n#define BOOST_LIB_VERSION \"1_81\"\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/index.html",
    "content": "<html>\n   <head>\n      <meta http-equiv=\"refresh\" content=\"0; URL=doc/html/index.html\">\n   </head>\n   <body>\n      <P>\n         Automatic redirection failed, please go to <a href=\"doc/html/index.html\">doc/html/index.html</a>.\n      </P>\n      <P>Copyright&nbsp;John Maddock 2001</P>\n      <P>Distributed under the Boost Software License, Version 1.0. (See accompanying file <A href=\"../../LICENSE_1_0.txt\">\n            LICENSE_1_0.txt</A> or copy at <A href=\"http://www.boost.org/LICENSE_1_0.txt\">www.boost.org/LICENSE_1_0.txt</A>).</P>\n   </body>\n</html>\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/meta/libraries.json",
    "content": "{\n    \"key\": \"multiprecision\",\n    \"name\": \"Multiprecision\",\n    \"authors\": [\n        \"John Maddock\",\n        \"Christopher Kormanyos\"\n    ],\n    \"description\": \"Extended precision arithmetic types for floating point, integer andrational arithmetic.\",\n    \"category\": [\n        \"Math\"\n    ],\n    \"maintainers\": [\n        \"John Maddock <john -at- johnmaddock.co.uk>\",\n        \"christopher Kormanyos <e_float -at- yahoo.com>\"\n    ],\n    \"cxxstd\": \"11\"\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/Jamfile.v2",
    "content": "# copyright John Maddock 2012\n# Distributed under the Boost Software License, Version 1.0. \n# (See accompanying file LICENSE_1_0.txt or copy at \n# http://www.boost.org/LICENSE_1_0.txt.\n\nimport modules ;\nimport path ;\nimport ../../config/checks/config : requires ;\n\nlocal ntl-path = [ modules.peek : NTL_PATH ] ;\nlocal gmp_path = [ modules.peek : GMP_PATH ] ;\nlocal mpfr_path = [ modules.peek : MPFR_PATH ] ;\nlocal tommath_path = [ modules.peek : TOMMATH_PATH ] ;\n\nproject : requirements \n   <target-os>freebsd:<linkflags>\"-lrt\" \n   <target-os>linux:<linkflags>\"-lrt\" \n   <toolset>pgi:<linkflags>\"-lrt\" \n   <include>$(gmp_path) \n   <include>$(gmp_path)/mpfr \n   <include>$(gmp_path)/gmpfrxx \n   <include>$(mpfr_path)\n   <include>$(tommath_path)\n   <include>../../.. \n   <search>$(gmp_path) \n   <search>$(mpfr_path) \n   <search>$(mpfr_path)/build.vc10/lib/Win32/Debug\n   <search>$(tommath_path) \n   # We set these to make it easier to set up and test GMP and MPFR under Win32:\n   <toolset>msvc:<runtime-link>static\n   <toolset>msvc:<link>static\n   <toolset>intel-win:<runtime-link>static\n   <toolset>intel-win:<link>static\n   <define>BOOST_ALL_NO_LIB\n   <debug-symbols>off\n   <define>NDEBUG=1\n   ;\n\n\nlib gmp ;\nlib mpfr ;\nlib quadmath ;\nlib f2c ;\n\nif $(tommath_path)\n{\n   TOMMATH = [ GLOB $(tommath_path) : *.c ] ;\n}\nelse\n{\n   lib tommath ;\n   TOMMATH = tommath ;\n}\n\ntest-suite performance :\n\n[ exe performance_test : performance_test.cpp \n            performance_test_files/test01.cpp  performance_test_files/test18.cpp  performance_test_files/test35.cpp\n            performance_test_files/test02.cpp  performance_test_files/test19.cpp  performance_test_files/test36.cpp\n            performance_test_files/test03.cpp  performance_test_files/test20.cpp  performance_test_files/test37.cpp\n            performance_test_files/test04.cpp  performance_test_files/test21.cpp  performance_test_files/test38.cpp\n            performance_test_files/test05.cpp  performance_test_files/test22.cpp  performance_test_files/test39.cpp\n            performance_test_files/test06.cpp  performance_test_files/test23.cpp  performance_test_files/test40.cpp\n            performance_test_files/test07.cpp  performance_test_files/test24.cpp  performance_test_files/test41.cpp\n            performance_test_files/test08.cpp  performance_test_files/test25.cpp  performance_test_files/test42.cpp\n            performance_test_files/test09.cpp  performance_test_files/test26.cpp  performance_test_files/test43.cpp\n            performance_test_files/test10.cpp  performance_test_files/test27.cpp  performance_test_files/test44.cpp\n            performance_test_files/test11.cpp  performance_test_files/test28.cpp  performance_test_files/test45.cpp\n            performance_test_files/test12.cpp  performance_test_files/test29.cpp  performance_test_files/test46.cpp\n            performance_test_files/test13.cpp  performance_test_files/test30.cpp  performance_test_files/test47.cpp\n            performance_test_files/test14.cpp  performance_test_files/test31.cpp  performance_test_files/test48.cpp\n            performance_test_files/test15.cpp  performance_test_files/test32.cpp  performance_test_files/test49.cpp\n            performance_test_files/test16.cpp  performance_test_files/test33.cpp  performance_test_files/test50.cpp\n            performance_test_files/test17.cpp  performance_test_files/test34.cpp  performance_test_files/test51.cpp            \n            /boost/system//boost_system\n          : release\n          [ check-target-builds ../config//has_gmp : <define>TEST_MPF <define>TEST_MPZ <define>TEST_MPQ <source>gmp : ]\n          [ check-target-builds ../config//has_mpfr : <define>TEST_MPFR <source>mpfr : ]\n          [ check-target-builds ../config//has_tommath : <define>TEST_TOMMATH <source>$(TOMMATH) : ]\n          <define>TEST_CPP_DEC_FLOAT\n          <define>TEST_CPP_BIN_FLOAT\n          <define>TEST_CPP_INT\n          <define>TEST_CPP_INT_RATIONAL\n          [ requires cxx11_auto_declarations cxx11_allocator ]\n          ]\n\n[ exe miller_rabin_performance : miller_rabin_performance.cpp \n            miller_rabin_performance_files/test01.cpp  miller_rabin_performance_files/test07.cpp\n            miller_rabin_performance_files/test02.cpp  miller_rabin_performance_files/test08.cpp\n            miller_rabin_performance_files/test03.cpp  miller_rabin_performance_files/test09.cpp\n            miller_rabin_performance_files/test04.cpp  miller_rabin_performance_files/test10.cpp\n            miller_rabin_performance_files/test05.cpp  miller_rabin_performance_files/test11.cpp\n            miller_rabin_performance_files/test06.cpp  miller_rabin_performance_files/test12.cpp\n            /boost/system//boost_system /boost/chrono//boost_chrono \n          : release\n          [ check-target-builds ../config//has_gmp : <define>TEST_MPF <define>TEST_MPZ <source>gmp : ]\n          [ check-target-builds ../config//has_mpfr : <define>TEST_MPFR <source>mpfr : ]\n          [ check-target-builds ../config//has_tommath : <define>TEST_TOMMATH <source>$(TOMMATH) : ]\n          <define>TEST_CPP_DEC_FLOAT\n          <define>TEST_CPP_INT\n          ]\n\n[ exe sf_performance : sf_performance.cpp sf_performance_basic.cpp sf_performance_bessel.cpp \n                     sf_performance_nct.cpp sf_performance_poly.cpp\n                     sf_performance_files/sf_performance_basic_1.cpp    sf_performance_files/sf_performance_nct_06.cpp\n                     sf_performance_files/sf_performance_basic_2.cpp    sf_performance_files/sf_performance_nct_07.cpp\n                     sf_performance_files/sf_performance_basic_3.cpp    sf_performance_files/sf_performance_nct_08.cpp\n                     sf_performance_files/sf_performance_basic_4.cpp    sf_performance_files/sf_performance_nct_09.cpp\n                     sf_performance_files/sf_performance_basic_5.cpp    sf_performance_files/sf_performance_nct_10.cpp\n                     sf_performance_files/sf_performance_basic_6.cpp    sf_performance_files/sf_performance_nct_11.cpp\n                     sf_performance_files/sf_performance_basic_7.cpp    sf_performance_files/sf_performance_nct_12.cpp\n                     sf_performance_files/sf_performance_basic_8.cpp    sf_performance_files/sf_performance_nct_13.cpp\n                     sf_performance_files/sf_performance_basic_9.cpp    sf_performance_files/sf_performance_nct_14.cpp\n                     sf_performance_files/sf_performance_bessel_01.cpp  sf_performance_files/sf_performance_nct_15.cpp\n                     sf_performance_files/sf_performance_bessel_02.cpp  sf_performance_files/sf_performance_nct_16.cpp\n                     sf_performance_files/sf_performance_bessel_03.cpp  sf_performance_files/sf_performance_nct_17.cpp\n                     sf_performance_files/sf_performance_bessel_04.cpp  sf_performance_files/sf_performance_nct_18.cpp\n                     sf_performance_files/sf_performance_bessel_05.cpp  sf_performance_files/sf_performance_nct_19.cpp\n                     sf_performance_files/sf_performance_bessel_06.cpp  sf_performance_files/sf_performance_nct_20.cpp\n                     sf_performance_files/sf_performance_bessel_07.cpp  sf_performance_files/sf_performance_poly_01.cpp\n                     sf_performance_files/sf_performance_bessel_08.cpp  sf_performance_files/sf_performance_poly_02.cpp\n                     sf_performance_files/sf_performance_bessel_09.cpp  sf_performance_files/sf_performance_poly_03.cpp\n                     sf_performance_files/sf_performance_bessel_10.cpp  sf_performance_files/sf_performance_poly_04.cpp\n                     sf_performance_files/sf_performance_bessel_11.cpp  sf_performance_files/sf_performance_poly_05.cpp\n                     sf_performance_files/sf_performance_bessel_12.cpp  sf_performance_files/sf_performance_poly_06.cpp\n                     sf_performance_files/sf_performance_bessel_13.cpp  sf_performance_files/sf_performance_poly_07.cpp\n                     sf_performance_files/sf_performance_bessel_14.cpp  sf_performance_files/sf_performance_poly_08.cpp\n                     sf_performance_files/sf_performance_bessel_15.cpp  sf_performance_files/sf_performance_poly_09.cpp\n                     sf_performance_files/sf_performance_bessel_16.cpp  sf_performance_files/sf_performance_poly_10.cpp\n                     sf_performance_files/sf_performance_bessel_17.cpp  sf_performance_files/sf_performance_poly_11.cpp\n                     sf_performance_files/sf_performance_bessel_18.cpp  sf_performance_files/sf_performance_poly_12.cpp\n                     sf_performance_files/sf_performance_bessel_19.cpp  sf_performance_files/sf_performance_poly_13.cpp\n                     sf_performance_files/sf_performance_nct_01.cpp     sf_performance_files/sf_performance_poly_14.cpp\n                     sf_performance_files/sf_performance_nct_02.cpp     sf_performance_files/sf_performance_poly_15.cpp\n                     sf_performance_files/sf_performance_nct_03.cpp     sf_performance_files/sf_performance_poly_16.cpp\n                     sf_performance_files/sf_performance_nct_04.cpp     sf_performance_files/sf_performance_poly_17.cpp\n                     sf_performance_files/sf_performance_nct_05.cpp     sf_performance_files/sf_performance_poly_18.cpp\n                     /boost/system//boost_system /boost/chrono//boost_chrono /boost/thread//boost_thread\n          : release\n          [ check-target-builds ../config//has_gmp : <define>TEST_MPF <define>TEST_MPZ <source>gmp : ]\n          [ check-target-builds ../config//has_mpfr : <define>TEST_MPFR <source>mpfr : ]\n          [ check-target-builds ../config//has_float128 : <source>quadmath : ]\n          <define>TEST_CPP_DEC_FLOAT\n          <define>TEST_CPP_BIN_FLOAT\n          <define>TEST_FLOAT\n          <toolset>msvc:<cxxflags>-bigobj\n          [ requires cxx11_auto_declarations cxx11_allocator ]\n          ]\n          \n[ exe delaunay_test : delaunay_test.cpp /boost/system//boost_system /boost/chrono//boost_chrono ]\n\n[ exe voronoi_performance : voronoi_performance.cpp /boost/system//boost_system /boost/chrono//boost_chrono\n   : release\n          [ check-target-builds ../config//has_gmp : <define>TEST_GMP <source>gmp : ]\n          [ check-target-builds ../config//has_tommath : <define>TEST_TOMMATH <source>$(TOMMATH) : ]\n   ]\n\n[ obj obj_linpack_benchmark_mpfr : linpack-benchmark.cpp\n          : release\n          [ check-target-builds ../config//has_mpfr : : <build>no ]\n          <define>TEST_MPFR_50\n          [ check-target-builds ../config//has_f2c : : <build>no ]\n          ]\n\n[ obj obj_linpack_benchmark_mpf : linpack-benchmark.cpp \n          : release\n          [ check-target-builds ../config//has_gmp : : <build>no ]\n          <define>TEST_MPF_50\n          [ check-target-builds ../config//has_f2c : : <build>no ]\n          ]\n\n[ obj obj_linpack_benchmark_cpp_float : linpack-benchmark.cpp\n          : release\n          <define>TEST_CPP_DEC_FLOAT\n          [ check-target-builds ../config//has_f2c : : <build>no ]\n          ]\n\n[ obj obj_linpack_benchmark_double : linpack-benchmark.cpp\n          : release\n          [ check-target-builds ../config//has_f2c : : <build>no ]\n          ]\n\n[ obj obj_linpack_benchmark_native_float128 : linpack-benchmark.cpp\n          : release\n          <define>NATIVE_FLOAT128\n          [ check-target-builds ../config//has_float128 : : <build>no ]\n          [ check-target-builds ../config//has_f2c : : <build>no ]\n          ]\n\n[ obj obj_linpack_benchmark_float128 : linpack-benchmark.cpp\n          : release\n          <define>TEST_FLOAT128\n          [ check-target-builds ../config//has_float128 : : <build>no ]\n          [ check-target-builds ../config//has_f2c : : <build>no ]\n          ]\n\n[ obj obj_linpack_benchmark_cpp_quad_float : linpack-benchmark.cpp\n          : release\n          <define>TEST_CPP_BIN_FLOAT_QUAD\n          [ check-target-builds ../config//has_f2c : : <build>no ]\n          ]\n\n[ obj obj_linpack_benchmark_cpp_oct_float : linpack-benchmark.cpp\n          : release\n          <define>TEST_CPP_BIN_FLOAT_OCT\n          [ check-target-builds ../config//has_f2c : : <build>no ]\n          ]\n\n[ exe linpack_benchmark_mpfr : obj_linpack_benchmark_mpfr mpfr f2c gmp\n          : release\n          [ check-target-builds ../config//has_mpfr : : <build>no ]\n          <define>TEST_MPFR_50\n          [ check-target-builds ../config//has_f2c : : <build>no ]\n          ]\n\n[ exe linpack_benchmark_mpf : obj_linpack_benchmark_mpf gmp  f2c\n          : release\n          [ check-target-builds ../config//has_gmp : : <build>no ]\n          <define>TEST_MPF_50\n          [ check-target-builds ../config//has_f2c : : <build>no ]\n          ]\n\n[ exe linpack_benchmark_cpp_float : obj_linpack_benchmark_cpp_float  f2c\n          : release\n          <define>TEST_CPP_DEC_FLOAT\n          [ check-target-builds ../config//has_f2c : : <build>no ]\n          ]\n\n[ exe linpack_benchmark_double : obj_linpack_benchmark_double  f2c\n          : release\n          [ check-target-builds ../config//has_f2c : : <build>no ]\n          ]\n\n[ exe linpack_benchmark_native_float128 : obj_linpack_benchmark_native_float128  f2c quadmath\n          : release\n          [ check-target-builds ../config//has_float128 : : <build>no ]\n          [ check-target-builds ../config//has_f2c : : <build>no ]\n          ]\n\n[ exe linpack_benchmark_float128 : obj_linpack_benchmark_float128  f2c quadmath\n          : release\n          [ check-target-builds ../config//has_float128 : : <build>no ]\n          [ check-target-builds ../config//has_f2c : : <build>no ]\n          ]\n\n[ exe linpack_benchmark_cpp_quad_float : obj_linpack_benchmark_cpp_quad_float  f2c\n          : release\n          [ check-target-builds ../config//has_f2c : : <build>no ]\n          ]\n\n[ exe linpack_benchmark_cpp_oct_float : obj_linpack_benchmark_cpp_oct_float  f2c\n          : release\n          [ check-target-builds ../config//has_f2c : : <build>no ]\n          ]\n\n;\n#\n# These cause conflicting targets for the build system when building\n# with multiple compilers, so they are not part of the regular CI tests:\n#\ntest-suite performance_install :\n\n[ install miller_rabin_install : miller_rabin_performance : <location>. ]\n[ install performance_test_install : performance_test  : <location>. ]\n[ install sf_performance_install : sf_performance   : <location>. ]\n[ install . : linpack_benchmark_double linpack_benchmark_cpp_float linpack_benchmark_mpf linpack_benchmark_mpfr linpack_benchmark_native_float128 linpack_benchmark_float128 linpack_benchmark_cpp_quad_float linpack_benchmark_cpp_oct_float ]\n[ install delaunay_install : delaunay_test : <location>. ]\n[ install voronoi_install : voronoi_performance : <location>. ]\n\n;\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/arithmetic_backend.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MATH_FLOAT_BACKEND_HPP\n#define BOOST_MATH_FLOAT_BACKEND_HPP\n\n#include <iostream>\n#include <iomanip>\n#include <sstream>\n#include <cstdint>\n#include <boost/lexical_cast.hpp>\n#include <boost/math/concepts/real_concept.hpp>\n#include <boost/multiprecision/number.hpp>\n#include <boost/integer/common_factor_rt.hpp>\n#include <boost/container_hash/hash.hpp>\n\nnamespace boost {\nnamespace multiprecision {\nnamespace backends {\n\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4389 4244 4018 4244 4127)\n#endif\n\ntemplate <class Arithmetic>\nstruct arithmetic_backend\n{\n   typedef std::tuple<short, int, long, long long>                                 signed_types;\n   typedef std::tuple<unsigned short, unsigned, unsigned long, unsigned long long> unsigned_types;\n   typedef std::tuple<float, double, long double>                                  float_types;\n   typedef int                                                                    exponent_type;\n\n   BOOST_MP_CXX14_CONSTEXPR arithmetic_backend() : m_value(0) {}\n   BOOST_MP_CXX14_CONSTEXPR arithmetic_backend(const arithmetic_backend& o) : m_value(o.m_value) {}\n   template <class A>\n   BOOST_MP_CXX14_CONSTEXPR arithmetic_backend(const A& o, const typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A>::value && std::numeric_limits<A>::is_specialized>::type* = nullptr) : m_value(o) {}\n   template <class A>\n   BOOST_MP_CXX14_CONSTEXPR arithmetic_backend(const arithmetic_backend<A>& o) : m_value(o.data()) {}\n   BOOST_MP_CXX14_CONSTEXPR arithmetic_backend& operator=(const arithmetic_backend& o)\n   {\n      m_value = o.m_value;\n      return *this;\n   }\n   template <class A>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A>::value, arithmetic_backend&>::type operator=(A i)\n   {\n      m_value = static_cast<Arithmetic>(i);\n      return *this;\n   }\n   template <class A>\n   BOOST_MP_CXX14_CONSTEXPR arithmetic_backend& operator=(const arithmetic_backend<A>& i)\n   {\n      m_value = i.data();\n      return *this;\n   }\n   arithmetic_backend& operator=(const char* s)\n   {\n#ifndef BOOST_NO_EXCEPTIONS\n      try\n      {\n#endif\n         m_value = boost::lexical_cast<Arithmetic>(s);\n#ifndef BOOST_NO_EXCEPTIONS\n      }\n      catch (const bad_lexical_cast&)\n      {\n         throw std::runtime_error(std::string(\"Unable to interpret the string provided: \\\"\") + s + std::string(\"\\\" as a compatible number type.\"));\n      }\n#endif\n      return *this;\n   }\n   BOOST_MP_CXX14_CONSTEXPR void swap(arithmetic_backend& o)\n   {\n      std::swap(m_value, o.m_value);\n   }\n   std::string str(std::streamsize digits, std::ios_base::fmtflags f) const\n   {\n      std::stringstream ss;\n      ss.flags(f);\n      ss << std::setprecision(digits ? digits : std::numeric_limits<Arithmetic>::digits10 + 4) << m_value;\n      return ss.str();\n   }\n   BOOST_MP_CXX14_CONSTEXPR void do_negate(const std::integral_constant<bool, true>&)\n   {\n      m_value = 1 + ~m_value;\n   }\n   BOOST_MP_CXX14_CONSTEXPR void do_negate(const std::integral_constant<bool, false>&)\n   {\n      m_value = -m_value;\n   }\n   BOOST_MP_CXX14_CONSTEXPR void negate()\n   {\n      do_negate(std::integral_constant<bool, boost::multiprecision::detail::is_unsigned<Arithmetic>::value>());\n   }\n   BOOST_MP_CXX14_CONSTEXPR int compare(const arithmetic_backend& o) const\n   {\n      return m_value > o.m_value ? 1 : (m_value < o.m_value ? -1 : 0);\n   }\n   template <class A>\n   BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A>::value, int>::type compare(A i) const\n   {\n      return m_value > static_cast<Arithmetic>(i) ? 1 : (m_value < static_cast<Arithmetic>(i) ? -1 : 0);\n   }\n   BOOST_MP_CXX14_CONSTEXPR Arithmetic& data() { return m_value; }\n   BOOST_MP_CXX14_CONSTEXPR const Arithmetic& data() const { return m_value; }\n\n private:\n   Arithmetic m_value;\n};\n\ntemplate <class R, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<R>::value>::type eval_convert_to(R* result, const arithmetic_backend<Arithmetic>& backend)\n{\n   using c_type = typename std::common_type<R, Arithmetic>::type;\n\n   constexpr const c_type max = static_cast<c_type>((std::numeric_limits<R>::max)());\n   constexpr const c_type min = static_cast<c_type>((std::numeric_limits<R>::min)());\n   c_type ct  = static_cast<c_type>(backend.data());\n\n   if ((backend.data() < 0) && !std::numeric_limits<R>::is_signed)\n   {\n      BOOST_THROW_EXCEPTION(std::range_error(\"Attempt to convert negative number to unsigned type.\"));\n   }\n\n   if (ct > max)\n   {\n      *result = boost::multiprecision::detail::is_signed<R>::value ? (std::numeric_limits<R>::max)() : static_cast<R>(backend.data());\n   }\n   else if (std::numeric_limits<Arithmetic>::is_signed && (ct < min))\n   {\n      *result = (std::numeric_limits<R>::min)();\n   }\n   else\n   {\n      *result = backend.data();\n   }\n}\n\ntemplate <class R, class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!boost::multiprecision::detail::is_integral<R>::value && !std::is_enum<R>::value>::type eval_convert_to(R* result, const arithmetic_backend<Arithmetic>& backend)\n{\n   *result = backend.data();\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR bool eval_eq(const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b)\n{\n   return a.data() == b.data();\n}\ntemplate <class Arithmetic, class A2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A2>::value, bool>::type eval_eq(const arithmetic_backend<Arithmetic>& a, const A2& b)\n{\n   return a.data() == static_cast<Arithmetic>(b);\n}\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR bool eval_lt(const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b)\n{\n   return a.data() < b.data();\n}\ntemplate <class Arithmetic, class A2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A2>::value, bool>::type eval_lt(const arithmetic_backend<Arithmetic>& a, const A2& b)\n{\n   return a.data() < static_cast<Arithmetic>(b);\n}\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR bool eval_gt(const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b)\n{\n   return a.data() > b.data();\n}\ntemplate <class Arithmetic, class A2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A2>::value, bool>::type eval_gt(const arithmetic_backend<Arithmetic>& a, const A2& b)\n{\n   return a.data() > static_cast<Arithmetic>(b);\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_add(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   result.data() += o.data();\n}\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_subtract(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   result.data() -= o.data();\n}\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_multiply(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   result.data() *= o.data();\n}\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::numeric_limits<Arithmetic>::has_infinity>::type eval_divide(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   result.data() /= o.data();\n}\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!std::numeric_limits<Arithmetic>::has_infinity>::type eval_divide(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   if (!o.data())\n      BOOST_THROW_EXCEPTION(std::overflow_error(\"Divide by zero\"));\n   result.data() /= o.data();\n}\n\ntemplate <class Arithmetic, class A2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A2>::value>::type eval_add(arithmetic_backend<Arithmetic>& result, const A2& o)\n{\n   result.data() += o;\n}\ntemplate <class Arithmetic, class A2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A2>::value>::type eval_subtract(arithmetic_backend<Arithmetic>& result, const A2& o)\n{\n   result.data() -= o;\n}\ntemplate <class Arithmetic, class A2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A2>::value>::type eval_multiply(arithmetic_backend<Arithmetic>& result, const A2& o)\n{\n   result.data() *= o;\n}\ntemplate <class Arithmetic, class A2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<(boost::multiprecision::detail::is_arithmetic<A2>::value && !std::numeric_limits<Arithmetic>::has_infinity)>::type\neval_divide(arithmetic_backend<Arithmetic>& result, const A2& o)\n{\n   if (!o)\n      BOOST_THROW_EXCEPTION(std::overflow_error(\"Divide by zero\"));\n   result.data() /= o;\n}\ntemplate <class Arithmetic, class A2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<(boost::multiprecision::detail::is_arithmetic<A2>::value && std::numeric_limits<Arithmetic>::has_infinity)>::type\neval_divide(arithmetic_backend<Arithmetic>& result, const A2& o)\n{\n   result.data() /= o;\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_add(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b)\n{\n   result.data() = a.data() + b.data();\n}\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_subtract(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b)\n{\n   result.data() = a.data() - b.data();\n}\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_multiply(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b)\n{\n   result.data() = a.data() * b.data();\n}\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::numeric_limits<Arithmetic>::has_infinity>::type eval_divide(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b)\n{\n   result.data() = a.data() / b.data();\n}\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!std::numeric_limits<Arithmetic>::has_infinity>::type eval_divide(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b)\n{\n   if (!b.data())\n      BOOST_THROW_EXCEPTION(std::overflow_error(\"Divide by zero\"));\n   result.data() = a.data() / b.data();\n}\n\ntemplate <class Arithmetic, class A2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A2>::value>::type eval_add(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const A2& b)\n{\n   result.data() = a.data() + b;\n}\ntemplate <class Arithmetic, class A2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A2>::value>::type eval_subtract(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const A2& b)\n{\n   result.data() = a.data() - b;\n}\ntemplate <class Arithmetic, class A2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A2>::value>::type eval_multiply(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const A2& b)\n{\n   result.data() = a.data() * b;\n}\ntemplate <class Arithmetic, class A2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<(boost::multiprecision::detail::is_arithmetic<A2>::value && !std::numeric_limits<Arithmetic>::has_infinity)>::type\neval_divide(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const A2& b)\n{\n   if (!b)\n      BOOST_THROW_EXCEPTION(std::overflow_error(\"Divide by zero\"));\n   result.data() = a.data() / b;\n}\ntemplate <class Arithmetic, class A2>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<(boost::multiprecision::detail::is_arithmetic<A2>::value && std::numeric_limits<Arithmetic>::has_infinity)>::type\neval_divide(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const A2& b)\n{\n   result.data() = a.data() / b;\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR bool eval_is_zero(const arithmetic_backend<Arithmetic>& val)\n{\n   return val.data() == 0;\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    (!std::numeric_limits<Arithmetic>::is_specialized || std::numeric_limits<Arithmetic>::is_signed), int>::type\neval_get_sign(const arithmetic_backend<Arithmetic>& val)\n{\n   return val.data() == 0 ? 0 : val.data() < 0 ? -1 : 1;\n}\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<\n    !(std::numeric_limits<Arithmetic>::is_specialized || std::numeric_limits<Arithmetic>::is_signed), int>::type\neval_get_sign(const arithmetic_backend<Arithmetic>& val)\n{\n   return val.data() == 0 ? 0 : 1;\n}\n\ntemplate <class T>\ninline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_unsigned<T>::value, T>::type abs(T v) { return v; }\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_abs(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   using boost::multiprecision::backends::abs;\n   using std::abs;\n   result.data() = abs(o.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_fabs(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   result.data() = std::abs(o.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_floor(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   BOOST_MATH_STD_USING\n   result.data() = floor(o.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_ceil(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   BOOST_MATH_STD_USING\n   result.data() = ceil(o.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_sqrt(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   BOOST_MATH_STD_USING\n   result.data() = sqrt(o.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR int eval_fpclassify(const arithmetic_backend<Arithmetic>& o)\n{\n   return (boost::math::fpclassify)(o.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_trunc(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   BOOST_MATH_STD_USING\n   result.data() = trunc(o.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_round(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   BOOST_MATH_STD_USING\n   result.data() = round(o.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_frexp(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, int* v)\n{\n   BOOST_MATH_STD_USING\n   result.data() = frexp(a.data(), v);\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_ldexp(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, int v)\n{\n   BOOST_MATH_STD_USING\n   result.data() = ldexp(a.data(), v);\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_exp(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   BOOST_MATH_STD_USING\n   result.data() = exp(o.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_log(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   BOOST_MATH_STD_USING\n   result.data() = log(o.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_log10(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   BOOST_MATH_STD_USING\n   result.data() = log10(o.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_sin(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   BOOST_MATH_STD_USING\n   result.data() = sin(o.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_cos(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   BOOST_MATH_STD_USING\n   result.data() = cos(o.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_tan(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   BOOST_MATH_STD_USING\n   result.data() = tan(o.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_acos(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   BOOST_MATH_STD_USING\n   result.data() = acos(o.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_asin(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   BOOST_MATH_STD_USING\n   result.data() = asin(o.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_atan(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   BOOST_MATH_STD_USING\n   result.data() = atan(o.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_sinh(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   BOOST_MATH_STD_USING\n   result.data() = sinh(o.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_cosh(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   BOOST_MATH_STD_USING\n   result.data() = cosh(o.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_tanh(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o)\n{\n   BOOST_MATH_STD_USING\n   result.data() = tanh(o.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_fmod(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b)\n{\n   BOOST_MATH_STD_USING\n   result.data() = fmod(a.data(), b.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_pow(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b)\n{\n   BOOST_MATH_STD_USING\n   result.data() = pow(a.data(), b.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_atan2(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b)\n{\n   BOOST_MATH_STD_USING\n   result.data() = atan2(a.data(), b.data());\n}\n\ntemplate <class Arithmetic, class I>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_left_shift(arithmetic_backend<Arithmetic>& result, I val)\n{\n   result.data() <<= val;\n}\n\ntemplate <class Arithmetic, class I>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_right_shift(arithmetic_backend<Arithmetic>& result, I val)\n{\n   result.data() >>= val;\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_modulus(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a)\n{\n   result.data() %= a.data();\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_and(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a)\n{\n   result.data() &= a.data();\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_or(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a)\n{\n   result.data() |= a.data();\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_xor(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a)\n{\n   result.data() ^= a.data();\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_complement(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a)\n{\n   result.data() = ~a.data();\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_gcd(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b)\n{\n   result.data() = boost::integer::gcd(a.data(), b.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR void eval_lcm(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b)\n{\n   result.data() = boost::integer::lcm(a.data(), b.data());\n}\n\ntemplate <class Arithmetic>\ninline BOOST_MP_CXX14_CONSTEXPR std::size_t hash_value(const arithmetic_backend<Arithmetic>& a)\n{\n   boost::hash<Arithmetic> hasher;\n   return hasher(a.data());\n}\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n} // namespace backends\n\nusing boost::multiprecision::backends::arithmetic_backend;\n\ntemplate <class Arithmetic>\nstruct number_category<arithmetic_backend<Arithmetic> > : public std::integral_constant<int, boost::multiprecision::detail::is_integral<Arithmetic>::value ? number_kind_integer : number_kind_floating_point>\n{};\n\nnamespace detail {\n\ntemplate <class Backend>\nstruct double_precision_type;\n\ntemplate <class Arithmetic, boost::multiprecision::expression_template_option ET>\nstruct double_precision_type<number<arithmetic_backend<Arithmetic>, ET> >\n{\n   typedef number<arithmetic_backend<typename double_precision_type<Arithmetic>::type>, ET> type;\n};\ntemplate <>\nstruct double_precision_type<arithmetic_backend<std::int32_t> >\n{\n   typedef arithmetic_backend<std::int64_t> type;\n};\n\n} // namespace detail\n\n}} // namespace boost::multiprecision\n#if !(defined(__SGI_STL_PORT) || defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS))\n//\n// We shouldn't need these to get code to compile, however for the sake of\n// \"level playing field\" performance comparisons they avoid the very slow\n// lexical_cast's that would otherwise take place.  Definition has to be guarded\n// by the inverse of pp-logic in real_concept.hpp which defines these as a workaround\n// for STLPort plus some other old/broken standartd libraries.\n//\nnamespace boost { namespace math { namespace tools {\n\ntemplate <>\ninline unsigned int real_cast<unsigned int, concepts::real_concept>(concepts::real_concept r)\n{\n   return static_cast<unsigned int>(r.value());\n}\n\ntemplate <>\ninline int real_cast<int, concepts::real_concept>(concepts::real_concept r)\n{\n   return static_cast<int>(r.value());\n}\n\ntemplate <>\ninline long real_cast<long, concepts::real_concept>(concepts::real_concept r)\n{\n   return static_cast<long>(r.value());\n}\n\n// Converts from T to narrower floating-point types, float, double & long double.\n\ntemplate <>\ninline float real_cast<float, concepts::real_concept>(concepts::real_concept r)\n{\n   return static_cast<float>(r.value());\n}\ntemplate <>\ninline double real_cast<double, concepts::real_concept>(concepts::real_concept r)\n{\n   return static_cast<double>(r.value());\n}\ntemplate <>\ninline long double real_cast<long double, concepts::real_concept>(concepts::real_concept r)\n{\n   return r.value();\n}\n\n}}} // namespace boost::math::tools\n#endif\n\nnamespace std {\n\ntemplate <class Arithmetic, boost::multiprecision::expression_template_option ExpressionTemplates>\nclass numeric_limits<boost::multiprecision::number<boost::multiprecision::arithmetic_backend<Arithmetic>, ExpressionTemplates> > : public std::numeric_limits<Arithmetic>\n{\n   typedef std::numeric_limits<Arithmetic>                                                                           base_type;\n   typedef boost::multiprecision::number<boost::multiprecision::arithmetic_backend<Arithmetic>, ExpressionTemplates> number_type;\n\n public:\n   static constexpr number_type(min)() noexcept { return (base_type::min)(); }\n   static constexpr number_type(max)() noexcept { return (base_type::max)(); }\n   static constexpr number_type lowest() noexcept { return -(max)(); }\n   static constexpr number_type epsilon() noexcept { return base_type::epsilon(); }\n   static constexpr number_type round_error() noexcept { return epsilon() / 2; }\n   static constexpr number_type infinity() noexcept { return base_type::infinity(); }\n   static constexpr number_type quiet_NaN() noexcept { return base_type::quiet_NaN(); }\n   static constexpr number_type signaling_NaN() noexcept { return base_type::signaling_NaN(); }\n   static constexpr number_type denorm_min() noexcept { return base_type::denorm_min(); }\n};\n\ntemplate <>\nclass numeric_limits<boost::math::concepts::real_concept> : public std::numeric_limits<long double>\n{\n   typedef std::numeric_limits<long double>    base_type;\n   typedef boost::math::concepts::real_concept number_type;\n\n public:\n   static const number_type(min)() noexcept { return (base_type::min)(); }\n   static const number_type(max)() noexcept { return (base_type::max)(); }\n   static const number_type lowest() noexcept { return -(max)(); }\n   static const number_type epsilon() noexcept { return base_type::epsilon(); }\n   static const number_type round_error() noexcept { return epsilon() / 2; }\n   static const number_type infinity() noexcept { return base_type::infinity(); }\n   static const number_type quiet_NaN() noexcept { return base_type::quiet_NaN(); }\n   static const number_type signaling_NaN() noexcept { return base_type::signaling_NaN(); }\n   static const number_type denorm_min() noexcept { return base_type::denorm_min(); }\n};\n\n} // namespace std\n\n#include <boost/multiprecision/detail/integer_ops.hpp>\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/cpp_bin_float_conversion_performance.cpp",
    "content": "//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/math/special_functions.hpp>\n#include <boost/chrono.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n\ntemplate <class Clock>\nstruct stopwatch\n{\n   typedef typename Clock::duration duration;\n   stopwatch()\n   {\n      m_start = Clock::now();\n   }\n   duration elapsed()\n   {\n      return Clock::now() - m_start;\n   }\n   void reset()\n   {\n      m_start = Clock::now();\n   }\n\n private:\n   typename Clock::time_point m_start;\n};\n\ntemplate <class T>\nT generate_random()\n{\n   typedef int                   e_type;\n   static boost::random::mt19937 gen;\n   T                             val      = gen();\n   T                             prev_val = -1;\n   while (val != prev_val)\n   {\n      val *= (gen.max)();\n      prev_val = val;\n      val += gen();\n   }\n   e_type e;\n   val = frexp(val, &e);\n\n   static boost::random::uniform_int_distribution<e_type> ui(-20, 20);\n   return ldexp(val, ui(gen));\n}\n\ntemplate <typename T>\ndouble my_convert_to_double(const T& x)\n{\n   double ret = 0;\n   if (isfinite(x))\n   {\n      if (x.backend().exponent() >= -1023 - 52 && x != 0)\n      {\n         if (x.backend().exponent() <= 1023)\n         {\n            int     e  = x.backend().exponent();\n            T       y  = ldexp(abs(x), 55 - e);\n            T       t  = trunc(y);\n            int64_t ti = t.template convert_to<int64_t>();\n            if ((ti & 1) == 0)\n            {\n               if (t < y)\n                  ti |= 1;\n            }\n            if (e >= -1023 + 1)\n            {\n               ret = ldexp(double(ti), e - 55);\n            }\n            else\n            {\n               // subnormal\n               typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<128, boost::multiprecision::backends::digit_base_2> > cpp_bin_float128_t;\n               cpp_bin_float128_t                                                                                                               sx = ldexp(cpp_bin_float128_t(ti), e - 55);\n               sx += DBL_MIN;\n               e                     = -1023 + 1;\n               cpp_bin_float128_t sy = ldexp(sx, 55 - e);\n               cpp_bin_float128_t st = trunc(sy);\n               ti                    = st.convert_to<int64_t>();\n               if ((ti & 1) == 0)\n               {\n                  if (st < sy)\n                     ti |= 1;\n               }\n               ret = ldexp(double(ti), e - 55) - DBL_MIN;\n            }\n         }\n         else\n         {\n            // overflow\n            ret = HUGE_VAL;\n         }\n      }\n   }\n   else\n   {\n      if (isnan(x))\n         return nan(\"\");\n      // inf\n      ret = HUGE_VAL;\n   }\n   return x.backend().sign() ? -ret : ret;\n}\n\ntemplate <class T>\nvoid test_conversion_time(const char* name)\n{\n   std::cout << \"Testing times for type: \" << name << \"\\n\";\n   std::vector<T> values;\n\n   for (unsigned i = 0; i < 10000000; ++i)\n   {\n      values.push_back(generate_random<T>());\n   }\n\n   boost::chrono::duration<double>                 time;\n   stopwatch<boost::chrono::high_resolution_clock> c;\n\n   double total = 0;\n\n   for (typename std::vector<T>::const_iterator i = values.begin(); i != values.end(); ++i)\n   {\n      total += my_convert_to_double(*i);\n   }\n\n   time = c.elapsed();\n   std::cout << std::setprecision(3) << std::fixed;\n   std::cout << \"Reference time: \" << std::setw(7) << std::right << time << \" (total sum = \" << total << \")\" << std::endl;\n\n   c.reset();\n\n   total = 0;\n\n   for (typename std::vector<T>::const_iterator i = values.begin(); i != values.end(); ++i)\n   {\n      total += i->template convert_to<double>();\n   }\n\n   time = c.elapsed();\n   std::cout << \"Boost time:     \" << std::setw(7) << std::right << time << \" (total sum = \" << total << \")\" << std::endl;\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n   test_conversion_time<cpp_bin_float_double>(\"cpp_bin_float_double\");\n   test_conversion_time<cpp_bin_float_quad>(\"cpp_bin_float_quad\");\n   test_conversion_time<cpp_bin_float_oct>(\"cpp_bin_float_oct\");\n   test_conversion_time<cpp_bin_float_50>(\"cpp_bin_float_50\");\n   test_conversion_time<cpp_bin_float_100>(\"cpp_bin_float_100\");\n\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/delaunay_test.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock.\n//  Copyright 2012 Phil Endecott\n//  Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include \"arithmetic_backend.hpp\"\n#include <boost/chrono.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int_distribution.hpp>\n\n#include <fstream>\n#include <iomanip>\n\ntemplate <class Clock>\nstruct stopwatch\n{\n   typedef typename Clock::duration duration;\n   stopwatch()\n   {\n      m_start = Clock::now();\n   }\n   duration elapsed()\n   {\n      return Clock::now() - m_start;\n   }\n   void reset()\n   {\n      m_start = Clock::now();\n   }\n\n private:\n   typename Clock::time_point m_start;\n};\n\n// Custom 128-bit maths used for exact calculation of the Delaunay test.\n// Only the few operators actually needed here are implemented.\n\nstruct int128_t\n{\n   int64_t  high;\n   uint64_t low;\n\n   int128_t() {}\n   int128_t(int32_t i) : high(i >> 31), low(static_cast<int64_t>(i)) {}\n   int128_t(uint32_t i) : high(0), low(i) {}\n   int128_t(int64_t i) : high(i >> 63), low(i) {}\n   int128_t(uint64_t i) : high(0), low(i) {}\n};\n\ninline int128_t operator<<(int128_t val, int amt)\n{\n   int128_t r;\n   r.low  = val.low << amt;\n   r.high = val.low >> (64 - amt);\n   r.high |= val.high << amt;\n   return r;\n}\n\ninline int128_t& operator+=(int128_t& l, int128_t r)\n{\n   l.low += r.low;\n   bool carry = l.low < r.low;\n   l.high += r.high;\n   if (carry)\n      ++l.high;\n   return l;\n}\n\ninline int128_t operator-(int128_t val)\n{\n   val.low  = ~val.low;\n   val.high = ~val.high;\n   val.low += 1;\n   if (val.low == 0)\n      val.high += 1;\n   return val;\n}\n\ninline int128_t operator+(int128_t l, int128_t r)\n{\n   l += r;\n   return l;\n}\n\ninline bool operator<(int128_t l, int128_t r)\n{\n   if (l.high != r.high)\n      return l.high < r.high;\n   return l.low < r.low;\n}\n\ninline int128_t mult_64x64_to_128(int64_t a, int64_t b)\n{\n   // Make life simple by dealing only with positive numbers:\n   bool neg = false;\n   if (a < 0)\n   {\n      neg = !neg;\n      a   = -a;\n   }\n   if (b < 0)\n   {\n      neg = !neg;\n      b   = -b;\n   }\n\n   // Divide input into 32-bit halves:\n   uint32_t ah = a >> 32;\n   uint32_t al = a & 0xffffffff;\n   uint32_t bh = b >> 32;\n   uint32_t bl = b & 0xffffffff;\n\n   // Long multiplication, with 64-bit temporaries:\n\n   //            ah al\n   //          * bh bl\n   // ----------------\n   //            al*bl   (t1)\n   // +       ah*bl      (t2)\n   // +       al*bh      (t3)\n   // +    ah*bh         (t4)\n   // ----------------\n\n   uint64_t t1 = static_cast<uint64_t>(al) * bl;\n   uint64_t t2 = static_cast<uint64_t>(ah) * bl;\n   uint64_t t3 = static_cast<uint64_t>(al) * bh;\n   uint64_t t4 = static_cast<uint64_t>(ah) * bh;\n\n   int128_t r(t1);\n   r.high = t4;\n   r += int128_t(t2) << 32;\n   r += int128_t(t3) << 32;\n\n   if (neg)\n      r = -r;\n\n   return r;\n}\n\ntemplate <class R, class T>\nBOOST_FORCEINLINE void mul_2n(R& r, const T& a, const T& b)\n{\n   r = a;\n   r *= b;\n}\n\ntemplate <class B, boost::multiprecision::expression_template_option ET, class T>\nBOOST_FORCEINLINE void mul_2n(boost::multiprecision::number<B, ET>& r, const T& a, const T& b)\n{\n   multiply(r, a, b);\n}\n\nBOOST_FORCEINLINE void mul_2n(int128_t& r, const std::int64_t& a, const std::int64_t& b)\n{\n   r = mult_64x64_to_128(a, b);\n}\n\ntemplate <class Traits>\ninline bool delaunay_test(int32_t ax, int32_t ay, int32_t bx, int32_t by,\n                          int32_t cx, int32_t cy, int32_t dx, int32_t dy)\n{\n   // Test whether the quadrilateral ABCD's diagonal AC should be flipped to BD.\n   // This is the Cline & Renka method.\n   // Flip if the sum of the angles ABC and CDA is greater than 180 degrees.\n   // Equivalently, flip if sin(ABC + CDA) < 0.\n   // Trig identity: cos(ABC) * sin(CDA) + sin(ABC) * cos(CDA) < 0\n   // We can use scalar and vector products to find sin and cos, and simplify\n   // to the following code.\n   // Numerical robustness is important.  This code addresses it by performing\n   // exact calculations with large integer types.\n   //\n   // NOTE: This routine is limited to inputs with up to 30 BIT PRECISION, which\n   // is to say all inputs must be in the range [INT_MIN/2, INT_MAX/2].\n\n   typedef typename Traits::i64_t  i64;\n   typedef typename Traits::i128_t i128;\n\n   i64 cos_abc, t;\n   mul_2n(cos_abc, (ax - bx), (cx - bx)); // subtraction yields 31-bit values, multiplied to give 62-bit values\n   mul_2n(t, (ay - by), (cy - by));\n   cos_abc += t; // addition yields 63 bit value, leaving one left for the sign\n\n   i64 cos_cda;\n   mul_2n(cos_cda, (cx - dx), (ax - dx));\n   mul_2n(t, (cy - dy), (ay - dy));\n   cos_cda += t;\n\n   if (cos_abc >= 0 && cos_cda >= 0)\n      return false;\n   if (cos_abc < 0 && cos_cda < 0)\n      return true;\n\n   i64 sin_abc;\n   mul_2n(sin_abc, (ax - bx), (cy - by));\n   mul_2n(t, (cx - bx), (ay - by));\n   sin_abc -= t;\n\n   i64 sin_cda;\n   mul_2n(sin_cda, (cx - dx), (ay - dy));\n   mul_2n(t, (ax - dx), (cy - dy));\n   sin_cda -= t;\n\n   i128 sin_sum, t128;\n   mul_2n(sin_sum, sin_abc, cos_cda); // 63-bit inputs multiplied to 126-bit output\n   mul_2n(t128, cos_abc, sin_cda);\n   sin_sum += t128; // Addition yields 127 bit result, leaving one bit for the sign\n\n   return sin_sum < 0;\n}\n\nstruct dt_dat\n{\n   int32_t ax, ay, bx, by, cx, cy, dx, dy;\n};\n\ntypedef std::vector<dt_dat> data_t;\ndata_t                      data;\n\ntemplate <class Traits>\nvoid do_calc(const char* name)\n{\n   std::cout << \"Running calculations for: \" << name << std::endl;\n\n   stopwatch<boost::chrono::high_resolution_clock> w;\n\n   std::uint64_t flips = 0;\n   std::uint64_t calcs = 0;\n\n   for (int j = 0; j < 1000; ++j)\n   {\n      for (data_t::const_iterator i = data.begin(); i != data.end(); ++i)\n      {\n         const dt_dat& d    = *i;\n         bool          flip = delaunay_test<Traits>(d.ax, d.ay, d.bx, d.by, d.cx, d.cy, d.dx, d.dy);\n         if (flip)\n            ++flips;\n         ++calcs;\n      }\n   }\n   double t = boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n\n   std::cout << \"Number of calculations = \" << calcs << std::endl;\n   std::cout << \"Number of flips = \" << flips << std::endl;\n   std::cout << \"Total execution time = \" << t << std::endl;\n   std::cout << \"Time per calculation = \" << t / calcs << std::endl\n             << std::endl;\n}\n\ntemplate <class I64, class I128>\nstruct test_traits\n{\n   typedef I64  i64_t;\n   typedef I128 i128_t;\n};\n\ndt_dat generate_quadrilateral()\n{\n   static boost::random::mt19937                    gen;\n   static boost::random::uniform_int_distribution<> dist(INT_MIN / 2, INT_MAX / 2);\n\n   dt_dat result;\n\n   result.ax = dist(gen);\n   result.ay = dist(gen);\n   result.bx = boost::random::uniform_int_distribution<>(result.ax, INT_MAX / 2)(gen); // bx is to the right of ax.\n   result.by = dist(gen);\n   result.cx = dist(gen);\n   result.cy = boost::random::uniform_int_distribution<>(result.cx > result.bx ? result.by : result.ay, INT_MAX / 2)(gen); // cy is below at least one of ay and by.\n   result.dx = boost::random::uniform_int_distribution<>(result.cx, INT_MAX / 2)(gen);                                     // dx is to the right of cx.\n   result.dy = boost::random::uniform_int_distribution<>(result.cx > result.bx ? result.by : result.ay, INT_MAX / 2)(gen); // cy is below at least one of ay and by.\n\n   return result;\n}\n\nstatic void load_data()\n{\n   for (unsigned i = 0; i < 100000; ++i)\n      data.push_back(generate_quadrilateral());\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n   std::cout << \"loading data...\\n\";\n   load_data();\n\n   std::cout << \"calculating...\\n\";\n\n   do_calc<test_traits<std::int64_t, std::int64_t> >(\"int64_t, int64_t\");\n   do_calc<test_traits<number<arithmetic_backend<std::int64_t>, et_off>, number<arithmetic_backend<std::int64_t>, et_off> > >(\"arithmetic_backend<int64_t>, arithmetic_backend<int64_t>\");\n   do_calc<test_traits<std::int64_t, number<arithmetic_backend<std::int64_t>, et_off> > >(\"int64_t, arithmetic_backend<int64_t>\");\n   do_calc<test_traits<number<cpp_int_backend<64, 64, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>, et_off>, number<cpp_int_backend<64, 64, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>, et_off> > >(\"multiprecision::int64_t, multiprecision::int64_t\");\n\n   do_calc<test_traits<std::int64_t, ::int128_t> >(\"int64_t, int128_t\");\n   do_calc<test_traits<std::int64_t, boost::multiprecision::int128_t> >(\"int64_t, boost::multiprecision::int128_t\");\n   do_calc<test_traits<std::int64_t, number<cpp_int_backend<128, 128, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>, et_on> > >(\"int64_t, int128_t (ET)\");\n   do_calc<test_traits<number<cpp_int_backend<64, 64, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>, et_off>, boost::multiprecision::int128_t> >(\"multiprecision::int64_t, multiprecision::int128_t\");\n\n   do_calc<test_traits<std::int64_t, cpp_int> >(\"int64_t, cpp_int\");\n   do_calc<test_traits<std::int64_t, number<cpp_int_backend<>, et_off> > >(\"int64_t, cpp_int (no ET's)\");\n   do_calc<test_traits<std::int64_t, number<cpp_int_backend<128> > > >(\"int64_t, cpp_int(128-bit cache)\");\n   do_calc<test_traits<std::int64_t, number<cpp_int_backend<128>, et_off> > >(\"int64_t, cpp_int (128-bit Cache no ET's)\");\n\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/delaunay_test.log",
    "content": "loading data...\ncalculating...\nRunning calculations for: int64_t, int64_t\nNumber of calculations = 100000000\nNumber of flips = 25765000\nTotal execution time = 4.87739\nTime per calculation = 4.87739e-08\n\nRunning calculations for: arithmetic_backend<int64_t>, arithmetic_backend<int64_t>\nNumber of calculations = 100000000\nNumber of flips = 25765000\nTotal execution time = 42.5469\nTime per calculation = 4.25469e-07\n\nRunning calculations for: int64_t, arithmetic_backend<int64_t>\nNumber of calculations = 100000000\nNumber of flips = 25765000\nTotal execution time = 9.24092\nTime per calculation = 9.24092e-08\n\nRunning calculations for: multiprecision::int64_t, multiprecision::int64_t\nNumber of calculations = 100000000\nNumber of flips = 24627000\nTotal execution time = 66.3086\nTime per calculation = 6.63086e-07\n\nRunning calculations for: int64_t, int128_t\nNumber of calculations = 100000000\nNumber of flips = 23892000\nTotal execution time = 10.3215\nTime per calculation = 1.03215e-07\n\nRunning calculations for: int64_t, boost::multiprecision::int128_t\nNumber of calculations = 100000000\nNumber of flips = 23892000\nTotal execution time = 12.848\nTime per calculation = 1.2848e-07\n\nRunning calculations for: int64_t, int128_t (ET)\nNumber of calculations = 100000000\nNumber of flips = 23892000\nTotal execution time = 12.7641\nTime per calculation = 1.27641e-07\n\nRunning calculations for: multiprecision::int64_t, multiprecision::int128_t\nNumber of calculations = 100000000\nNumber of flips = 23892000\nTotal execution time = 76.4744\nTime per calculation = 7.64744e-07\n\nRunning calculations for: int64_t, cpp_int\nNumber of calculations = 100000000\nNumber of flips = 23892000\nTotal execution time = 17.5545\nTime per calculation = 1.75545e-07\n\nRunning calculations for: int64_t, cpp_int (no ET's)\nNumber of calculations = 100000000\nNumber of flips = 23892000\nTotal execution time = 17.5139\nTime per calculation = 1.75139e-07\n\nRunning calculations for: int64_t, cpp_int(128-bit cache)\nNumber of calculations = 100000000\nNumber of flips = 23892000\nTotal execution time = 17.4647\nTime per calculation = 1.74647e-07\n\nRunning calculations for: int64_t, cpp_int (128-bit Cache no ET's)\nNumber of calculations = 100000000\nNumber of flips = 23892000\nTotal execution time = 18.6492\nTime per calculation = 1.86492e-07\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/gcd_bench.cpp",
    "content": "//  Copyright 2020 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <iostream>\n#include <benchmark/benchmark.h>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/random.hpp>\n#include <cmath>\n\n#include <immintrin.h>\n\nusing namespace boost::multiprecision;\nusing namespace boost::random;\n\nnamespace boost {\n   namespace multiprecision {\n      namespace backends {\n\n      template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>\n      inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type\n      eval_gcd_old(\n          cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&       result,\n          const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a,\n          const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& b)\n      {\n         using default_ops::eval_get_sign;\n         using default_ops::eval_is_zero;\n         using default_ops::eval_lsb;\n\n         if (a.size() == 1)\n         {\n            eval_gcd(result, b, *a.limbs());\n            return;\n         }\n         if (b.size() == 1)\n         {\n            eval_gcd(result, a, *b.limbs());\n            return;\n         }\n\n         cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> u(a), v(b);\n\n         int s = eval_get_sign(u);\n\n         /* GCD(0,x) := x */\n         if (s < 0)\n         {\n            u.negate();\n         }\n         else if (s == 0)\n         {\n            result = v;\n            return;\n         }\n         s = eval_get_sign(v);\n         if (s < 0)\n         {\n            v.negate();\n         }\n         else if (s == 0)\n         {\n            result = u;\n            return;\n         }\n\n         /* Let shift := lg K, where K is the greatest power of 2\n   dividing both u and v. */\n\n         unsigned us    = eval_lsb(u);\n         unsigned vs    = eval_lsb(v);\n         int      shift = (std::min)(us, vs);\n         eval_right_shift(u, us);\n         eval_right_shift(v, vs);\n\n         do\n         {\n            /* Now u and v are both odd, so diff(u, v) is even.\n      Let u = min(u, v), v = diff(u, v)/2. */\n            s = u.compare(v);\n            if (s > 0)\n               u.swap(v);\n            if (s == 0)\n               break;\n\n            while (((u.size() + 2 < v.size()) && (v.size() * 100 / u.size() > 105)) || ((u.size() <= 2) && (v.size() > 4)))\n            {\n               //\n               // Speical case: if u and v differ considerably in size, then a Euclid step\n               // is more efficient as we reduce v by several limbs in one go.\n               // Unfortunately it requires an expensive long division:\n               //\n               eval_modulus(v, v, u);\n               u.swap(v);\n            }\n            if (v.size() <= 2)\n            {\n               //\n               // Special case: if v has no more than 2 limbs\n               // then we can reduce u and v to a pair of integers and perform\n               // direct integer gcd:\n               //\n               if (v.size() == 1)\n                  u = eval_gcd(*v.limbs(), *u.limbs());\n               else\n               {\n                  double_limb_type i = v.limbs()[0] | (static_cast<double_limb_type>(v.limbs()[1]) << sizeof(limb_type) * CHAR_BIT);\n                  double_limb_type j = (u.size() == 1) ? *u.limbs() : u.limbs()[0] | (static_cast<double_limb_type>(u.limbs()[1]) << sizeof(limb_type) * CHAR_BIT);\n                  u                  = eval_gcd(i, j);\n               }\n               break;\n            }\n            //\n            // Regular binary gcd case:\n            //\n            eval_subtract(v, u);\n            vs = eval_lsb(v);\n            eval_right_shift(v, vs);\n         } while (true);\n\n         result = u;\n         eval_left_shift(result, shift);\n      }\n\n      }\n   }\n}\n\ntemplate <class T>\nstd::tuple<std::vector<T>, std::vector<T>, std::vector<T> >& get_test_vector(unsigned bits)\n{\n   static std::map<unsigned, std::tuple<std::vector<T>, std::vector<T>, std::vector<T> > > data;\n\n   std::tuple<std::vector<T>, std::vector<T>, std::vector<T> >& result = data[bits];\n\n   if (std::get<0>(result).size() == 0)\n   {\n      mt19937                     mt;\n      uniform_int_distribution<T> ui(T(1) << (bits - 1), T(1) << bits);\n\n      std::vector<T>& a = std::get<0>(result);\n      std::vector<T>& b = std::get<1>(result);\n      std::vector<T>& c = std::get<2>(result);\n\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         a.push_back(ui(mt));\n         b.push_back(ui(mt));\n         if (b.back() > a.back())\n            b.back().swap(a.back());\n         c.push_back(0);\n      }\n   }\n   return result;\n}\n\ntemplate <class T>\nstd::vector<T>& get_test_vector_a(unsigned bits)\n{\n   return std::get<0>(get_test_vector<T>(bits));\n}\ntemplate <class T>\nstd::vector<T>& get_test_vector_b(unsigned bits)\n{\n   return std::get<1>(get_test_vector<T>(bits));\n}\ntemplate <class T>\nstd::vector<T>& get_test_vector_c(unsigned bits)\n{\n   return std::get<2>(get_test_vector<T>(bits));\n}\n\n\ntemplate <typename T>\nstatic void BM_gcd_old(benchmark::State& state)\n{\n   int                         bits = state.range(0);\n\n   std::vector<T>& a = get_test_vector_a<T>(bits);\n   std::vector<T>& b = get_test_vector_b<T>(bits);\n   std::vector<T>& c = get_test_vector_c<T>(bits);\n\n   for (auto _ : state)\n   {\n      for (unsigned i = 0; i < a.size(); ++i)\n         eval_gcd_old(c[i].backend(), a[i].backend(), b[i].backend());\n   }\n   state.SetComplexityN(bits);\n}\n\ntemplate <typename T>\nstatic void BM_gcd_current(benchmark::State& state)\n{\n   int                         bits = state.range(0);\n\n   std::vector<T>& a = get_test_vector_a<T>(bits);\n   std::vector<T>& b = get_test_vector_b<T>(bits);\n   std::vector<T>& c = get_test_vector_c<T>(bits);\n\n   for (auto _ : state)\n   {\n      for (unsigned i = 0; i < a.size(); ++i)\n         eval_gcd(c[i].backend(), a[i].backend(), b[i].backend());\n   }\n   state.SetComplexityN(bits);\n}\n\nconstexpr unsigned lower_range = 512;\nconstexpr unsigned upper_range = 1 << 15;\n\nBENCHMARK_TEMPLATE(BM_gcd_old, cpp_int)->RangeMultiplier(2)->Range(lower_range, upper_range)->Unit(benchmark::kMillisecond)->Complexity();\nBENCHMARK_TEMPLATE(BM_gcd_current, cpp_int)->RangeMultiplier(2)->Range(lower_range, upper_range)->Unit(benchmark::kMillisecond)->Complexity();\nBENCHMARK_TEMPLATE(BM_gcd_old, cpp_int)->RangeMultiplier(2)->Range(lower_range, upper_range)->Unit(benchmark::kMillisecond)->Complexity();\nBENCHMARK_TEMPLATE(BM_gcd_current, mpz_int)->RangeMultiplier(2)->Range(lower_range, upper_range)->Unit(benchmark::kMillisecond)->Complexity();\nBENCHMARK_TEMPLATE(BM_gcd_current, mpz_int)->RangeMultiplier(2)->Range(lower_range, upper_range)->Unit(benchmark::kMillisecond)->Complexity();\n\nBENCHMARK_MAIN();\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/linpack-benchmark.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n/* 1000d.f -- translated by f2c (version 20050501).\nYou must link the resulting object file with libf2c:\non Microsoft Windows system, link with libf2c.lib;\non Linux or Unix systems, link with .../path/to/libf2c.a -lm\nor, if you install libf2c.a in a standard place, with -lf2c -lm\n-- in that order, at the end of the command line, as in\ncc *.o -lf2c -lm\nSource for libf2c is in /netlib/f2c/libf2c.zip, e.g.,\n\nhttp://www.netlib.org/f2c/libf2c.zip\n*/\n#include <iostream>\n#include <iomanip>\n#include <cmath>\n\n#if defined(TEST_GMPXX)\n#include <gmpxx.h>\ntypedef mpf_class real_type;\n#elif defined(TEST_MPFRXX)\n#include <gmpfrxx.h>\ntypedef mpfr_class real_type;\n#elif defined(TEST_CPP_DEC_FLOAT)\n#include <boost/multiprecision/cpp_dec_float.hpp>\ntypedef boost::multiprecision::cpp_dec_float_50 real_type;\n#elif defined(TEST_MPFR_50)\n#include <boost/multiprecision/mpfr.hpp>\ntypedef boost::multiprecision::mpfr_float_50 real_type;\n#elif defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\ntypedef boost::multiprecision::mpf_float_50 real_type;\n#elif defined(NATIVE_FLOAT128)\n#include <boost/multiprecision/float128.hpp>\ntypedef __float128 real_type;\n\nstd::ostream& operator<<(std::ostream& os, const __float128& f)\n{\n   return os << boost::multiprecision::float128(f);\n}\n\n#include <boost/type_traits/has_left_shift.hpp>\n\nnamespace boost {\n\ntemplate <>\nstruct has_left_shift<std::basic_ostream<char>, __float128> : public std::integral_constant<bool, true>\n{};\n\ntemplate <>\ndouble lexical_cast<double, __float128>(const __float128& f)\n{\n   return f;\n}\n\n} // namespace boost\n\n#elif defined(TEST_FLOAT128)\n#include <boost/multiprecision/float128.hpp>\ntypedef boost::multiprecision::float128 real_type;\n#elif defined(TEST_CPP_BIN_FLOAT_QUAD)\n#include <boost/multiprecision/cpp_bin_float.hpp>\ntypedef boost::multiprecision::cpp_bin_float_quad real_type;\n#elif defined(TEST_CPP_BIN_FLOAT_OCT)\n#include <boost/multiprecision/cpp_bin_float.hpp>\ntypedef boost::multiprecision::cpp_bin_float_oct real_type;\n#else\ntypedef double real_type;\n#endif\n\n#include <boost/lexical_cast.hpp>\n\n#ifndef CAST_TO_RT\n#define CAST_TO_RT(x) x\n#endif\n\nextern \"C\" {\n#include \"f2c.h\"\ninteger s_wsfe(cilist*), e_wsfe(void), do_fio(integer*, char*, ftnlen),\n    s_wsle(cilist*), do_lio(integer*, integer*, char*, ftnlen),\n    e_wsle(void);\n/* Subroutine */ int s_stop(char*, ftnlen);\n\n#undef abs\n#undef dabs\n#define dabs abs\n#undef dmin\n#undef dmax\n#define dmin min\n#define dmax max\n}\n#include <time.h>\n\nusing std::max;\nusing std::min;\n\n/* Table of constant values */\n\nstatic integer   c__0 = 0;\nstatic real_type c_b7 = CAST_TO_RT(1);\nstatic integer   c__1 = 1;\nstatic integer   c__9 = 9;\n\ninline double second_(void)\n{\n   return ((double)(clock())) / CLOCKS_PER_SEC;\n}\n\nint       dgefa_(real_type*, integer*, integer*, integer*, integer*), dgesl_(real_type*, integer*, integer*, integer*, real_type*, integer*);\nint       dmxpy_(integer*, real_type*, integer*, integer*, real_type*, real_type*);\nint       matgen_(real_type*, integer*, integer*, real_type*, real_type*);\nreal_type epslon_(real_type*);\nreal_type ran_(integer*);\nint       dscal_(integer*, real_type*, real_type*, integer*);\nint       daxpy_(integer*, real_type*, real_type*, integer*, real_type*, integer*);\ninteger   idamax_(integer*, real_type*, integer*);\nreal_type ddot_(integer*, real_type*, integer*, real_type*, integer*);\nint       daxpy_(integer*, real_type*, real_type*, integer*, real_type*, integer*);\nint       dmxpy_(integer*, real_type*, integer*, integer*, real_type*, real_type*);\n\nextern \"C\" int MAIN__()\n{\n#ifdef TEST_MPF_50\n   std::cout << \"Testing number<mpf_float<50> >\" << std::endl;\n#elif defined(TEST_MPFR_50)\n   std::cout << \"Testing number<mpf_float<50> >\" << std::endl;\n#elif defined(TEST_GMPXX)\n   std::cout << \"Testing mpf_class at 50 decimal degits\" << std::endl;\n   mpf_set_default_prec(((50 + 1) * 1000L) / 301L);\n#elif defined(TEST_MPFRXX)\n   std::cout << \"Testing mpfr_class at 50 decimal degits\" << std::endl;\n   mpfr_set_default_prec(((50 + 1) * 1000L) / 301L);\n#elif defined(TEST_CPP_DEC_FLOAT)\n   std::cout << \"Testing number<cpp_dec_float<50> >\" << std::endl;\n#elif defined(NATIVE_FLOAT128)\n   std::cout << \"Testing __float128\" << std::endl;\n#elif defined(TEST_FLOAT128)\n   std::cout << \"Testing number<float128_backend, et_off>\" << std::endl;\n#else\n   std::cout << \"Testing double\" << std::endl;\n#endif\n\n   /* Format strings */\n   static char fmt_1[] = \"(\\002 Please send the results of this run to:\\002\"\n                         \"//\\002 Jack J. Dongarra\\002/\\002 Computer Science Department\\002/\"\n                         \"\\002 University of Tennessee\\002/\\002 Knoxville, Tennessee 37996\"\n                         \"-1300\\002//\\002 Fax: 615-974-8296\\002//\\002 Internet: dongarra@c\"\n                         \"s.utk.edu\\002/)\";\n   static char fmt_40[] = \"(\\002     norm. resid      resid           mac\"\n                          \"hep\\002,\\002         x(1)          x(n)\\002)\";\n   static char fmt_50[] = \"(1p5e16.8)\";\n   static char fmt_60[] = \"(//\\002    times are reported for matrices of or\"\n                          \"der \\002,i5)\";\n   static char fmt_70[] = \"(6x,\\002factor\\002,5x,\\002solve\\002,6x,\\002tota\"\n                          \"l\\002,5x,\\002mflops\\002,7x,\\002unit\\002,6x,\\002ratio\\002)\";\n   static char fmt_80[] = \"(\\002 times for array with leading dimension o\"\n                          \"f\\002,i4)\";\n   static char fmt_110[] = \"(6(1pe11.3))\";\n\n   /* System generated locals */\n   integer   i__1;\n   real_type d__1, d__2, d__3;\n\n   /* Builtin functions */\n\n   /* Local variables */\n   static real_type a[1001000] /* was [1001][1000] */, b[1000];\n   static integer   i__, n;\n   static real_type x[1000];\n   static double    t1;\n   static integer   lda;\n   static double    ops;\n   static real_type eps;\n   static integer   info;\n   static double    time[6], cray, total;\n   static integer   ipvt[1000];\n   static real_type resid, norma;\n   static real_type normx;\n   static real_type residn;\n\n   /* Fortran I/O blocks */\n   static cilist io___4  = {0, 6, 0, fmt_1, 0};\n   static cilist io___20 = {0, 6, 0, fmt_40, 0};\n   static cilist io___21 = {0, 6, 0, fmt_50, 0};\n   static cilist io___22 = {0, 6, 0, fmt_60, 0};\n   static cilist io___23 = {0, 6, 0, fmt_70, 0};\n   static cilist io___24 = {0, 6, 0, fmt_80, 0};\n   static cilist io___25 = {0, 6, 0, fmt_110, 0};\n   static cilist io___26 = {0, 6, 0, 0, 0};\n\n   lda = 1001;\n\n   /*     this program was updated on 10/12/92 to correct a */\n   /*     problem with the random number generator. The previous */\n   /*     random number generator had a short period and produced */\n   /*     singular matrices occasionally. */\n\n   n    = 1000;\n   cray = .056f;\n   s_wsfe(&io___4);\n   e_wsfe();\n   /* Computing 3rd power */\n   d__1 = (real_type)n;\n   /* Computing 2nd power */\n   d__2 = (real_type)n;\n   ops  = boost::lexical_cast<double>(real_type(d__1 * (d__1 * d__1) * 2. / 3. + d__2 * d__2 * 2.));\n\n   matgen_(a, &lda, &n, b, &norma);\n\n   /* ****************************************************************** */\n   /* ****************************************************************** */\n   /*        you should replace the call to dgefa and dgesl */\n   /*        by calls to your linear equation solver. */\n   /* ****************************************************************** */\n   /* ****************************************************************** */\n\n   t1 = second_();\n   dgefa_(a, &lda, &n, ipvt, &info);\n   time[0] = second_() - t1;\n   t1      = second_();\n   dgesl_(a, &lda, &n, ipvt, b, &c__0);\n   time[1] = second_() - t1;\n   total   = time[0] + time[1];\n   /* ****************************************************************** */\n   /* ****************************************************************** */\n\n   /*     compute a residual to verify results. */\n\n   i__1 = n;\n   for (i__ = 1; i__ <= i__1; ++i__)\n   {\n      x[i__ - 1] = b[i__ - 1];\n      /* L10: */\n   }\n   matgen_(a, &lda, &n, b, &norma);\n   i__1 = n;\n   for (i__ = 1; i__ <= i__1; ++i__)\n   {\n      b[i__ - 1] = -b[i__ - 1];\n      /* L20: */\n   }\n   dmxpy_(&n, b, &n, &lda, x, a);\n   resid = CAST_TO_RT(0);\n   normx = CAST_TO_RT(0);\n   i__1  = n;\n   for (i__ = 1; i__ <= i__1; ++i__)\n   {\n      /* Computing MAX */\n      d__2 = resid, d__3 = (d__1 = b[i__ - 1], abs(d__1));\n      resid = (max)(d__2, d__3);\n      /* Computing MAX */\n      d__2 = normx, d__3 = (d__1 = x[i__ - 1], abs(d__1));\n      normx = (max)(d__2, d__3);\n      /* L30: */\n   }\n   eps    = epslon_(&c_b7);\n   residn = resid / (n * norma * normx * eps);\n   s_wsfe(&io___20);\n   e_wsfe();\n   s_wsfe(&io___21);\n   /*\n   do_fio(&c__1, (char *)&residn, (ftnlen)sizeof(real_type));\n   do_fio(&c__1, (char *)&resid, (ftnlen)sizeof(real_type));\n   do_fio(&c__1, (char *)&eps, (ftnlen)sizeof(real_type));\n   do_fio(&c__1, (char *)&x[0], (ftnlen)sizeof(real_type));\n   do_fio(&c__1, (char *)&x[n - 1], (ftnlen)sizeof(real_type));\n   */\n   std::cout << std::setw(12) << std::setprecision(5) << residn << \" \" << resid << \" \" << eps << \" \" << x[0] << \" \" << x[n - 1] << std::endl;\n   e_wsfe();\n\n   s_wsfe(&io___22);\n   do_fio(&c__1, (char*)&n, (ftnlen)sizeof(integer));\n   e_wsfe();\n   s_wsfe(&io___23);\n   e_wsfe();\n\n   time[2] = total;\n   time[3] = ops / (total * 1e6);\n   time[4] = 2. / time[3];\n   time[5] = total / cray;\n   s_wsfe(&io___24);\n   do_fio(&c__1, (char*)&lda, (ftnlen)sizeof(integer));\n   e_wsfe();\n   s_wsfe(&io___25);\n   for (i__ = 1; i__ <= 6; ++i__)\n   {\n      // do_fio(&c__1, (char *)&time[i__ - 1], (ftnlen)sizeof(real_type));\n      std::cout << std::setw(12) << std::setprecision(5) << time[i__ - 1];\n   }\n   e_wsfe();\n   s_wsle(&io___26);\n   do_lio(&c__9, &c__1, \" end of tests -- this version dated 10/12/92\", (ftnlen)44);\n   e_wsle();\n\n   s_stop(\"\", (ftnlen)0);\n   return 0;\n} /* MAIN__ */\n\n/* Subroutine */ int matgen_(real_type* a, integer* lda, integer* n,\n                             real_type* b, real_type* norma)\n{\n   /* System generated locals */\n   integer   a_dim1, a_offset, i__1, i__2;\n   real_type d__1, d__2;\n\n   /* Local variables */\n   static integer i__, j;\n   static integer init[4];\n\n   /* Parameter adjustments */\n   a_dim1   = *lda;\n   a_offset = 1 + a_dim1;\n   a -= a_offset;\n   --b;\n\n   /* Function Body */\n   init[0] = 1;\n   init[1] = 2;\n   init[2] = 3;\n   init[3] = 1325;\n   *norma  = CAST_TO_RT(0);\n   i__1    = *n;\n   for (j = 1; j <= i__1; ++j)\n   {\n      i__2 = *n;\n      for (i__ = 1; i__ <= i__2; ++i__)\n      {\n         a[i__ + j * a_dim1] = ran_(init) - .5f;\n         /* Computing MAX */\n         d__2   = (d__1 = a[i__ + j * a_dim1], abs(d__1));\n         *norma = (max)(d__2, *norma);\n         /* L20: */\n      }\n      /* L30: */\n   }\n   i__1 = *n;\n   for (i__ = 1; i__ <= i__1; ++i__)\n   {\n      b[i__] = CAST_TO_RT(0);\n      /* L35: */\n   }\n   i__1 = *n;\n   for (j = 1; j <= i__1; ++j)\n   {\n      i__2 = *n;\n      for (i__ = 1; i__ <= i__2; ++i__)\n      {\n         b[i__] += a[i__ + j * a_dim1];\n         /* L40: */\n      }\n      /* L50: */\n   }\n   return 0;\n} /* matgen_ */\n\n/* Subroutine */ int dgefa_(real_type* a, integer* lda, integer* n, integer* ipvt, integer* info)\n{\n   /* System generated locals */\n   integer a_dim1, a_offset, i__1, i__2, i__3;\n\n   /* Local variables */\n   static integer   j, k, l;\n   static real_type t;\n   static integer   kp1, nm1;\n\n   /*     dgefa factors a double precision matrix by gaussian elimination. */\n\n   /*     dgefa is usually called by dgeco, but it can be called */\n   /*     directly with a saving in time if  rcond  is not needed. */\n   /*     (time for dgeco) = (1 + 9/n)*(time for dgefa) . */\n\n   /*     on entry */\n\n   /*        a       double precision(lda, n) */\n   /*                the matrix to be factored. */\n\n   /*        lda     integer */\n   /*                the leading dimension of the array  a . */\n\n   /*        n       integer */\n   /*                the order of the matrix  a . */\n\n   /*     on return */\n\n   /*        a       an upper triangular matrix and the multipliers */\n   /*                which were used to obtain it. */\n   /*                the factorization can be written  a = l*u  where */\n   /*                l  is a product of permutation and unit lower */\n   /*                triangular matrices and  u  is upper triangular. */\n\n   /*        ipvt    integer(n) */\n   /*                an integer vector of pivot indices. */\n\n   /*        info    integer */\n   /*                = 0  normal value. */\n   /*                = k  if  u(k,k) .eq. 0.0 .  this is not an error */\n   /*                     condition for this subroutine, but it does */\n   /*                     indicate that dgesl or dgedi will divide by zero */\n   /*                     if called.  use  rcond  in dgeco for a reliable */\n   /*                     indication of singularity. */\n\n   /*     linpack. this version dated 08/14/78 . */\n   /*     cleve moler, university of new mexico, argonne national lab. */\n\n   /*     subroutines and functions */\n\n   /*     blas daxpy,dscal,idamax */\n\n   /*     internal variables */\n\n   /*     gaussian elimination with partial pivoting */\n\n   /* Parameter adjustments */\n   a_dim1   = *lda;\n   a_offset = 1 + a_dim1;\n   a -= a_offset;\n   --ipvt;\n\n   /* Function Body */\n   *info = 0;\n   nm1   = *n - 1;\n   if (nm1 < 1)\n   {\n      goto L70;\n   }\n   i__1 = nm1;\n   for (k = 1; k <= i__1; ++k)\n   {\n      kp1 = k + 1;\n\n      /*        find l = pivot index */\n\n      i__2    = *n - k + 1;\n      l       = idamax_(&i__2, &a[k + k * a_dim1], &c__1) + k - 1;\n      ipvt[k] = l;\n\n      /*        zero pivot implies this column already triangularized */\n\n      if (a[l + k * a_dim1] == 0.)\n      {\n         goto L40;\n      }\n\n      /*           interchange if necessary */\n\n      if (l == k)\n      {\n         goto L10;\n      }\n      t                 = a[l + k * a_dim1];\n      a[l + k * a_dim1] = a[k + k * a_dim1];\n      a[k + k * a_dim1] = t;\n   L10:\n\n      /*           compute multipliers */\n\n      t    = -1. / a[k + k * a_dim1];\n      i__2 = *n - k;\n      dscal_(&i__2, &t, &a[k + 1 + k * a_dim1], &c__1);\n\n      /*           row elimination with column indexing */\n\n      i__2 = *n;\n      for (j = kp1; j <= i__2; ++j)\n      {\n         t = a[l + j * a_dim1];\n         if (l == k)\n         {\n            goto L20;\n         }\n         a[l + j * a_dim1] = a[k + j * a_dim1];\n         a[k + j * a_dim1] = t;\n      L20:\n         i__3 = *n - k;\n         daxpy_(&i__3, &t, &a[k + 1 + k * a_dim1], &c__1, &a[k + 1 + j * a_dim1], &c__1);\n         /* L30: */\n      }\n      goto L50;\n   L40:\n      *info = k;\n   L50:\n       /* L60: */\n       ;\n   }\nL70:\n   ipvt[*n] = *n;\n   if (a[*n + *n * a_dim1] == 0.)\n   {\n      *info = *n;\n   }\n   return 0;\n} /* dgefa_ */\n\n/* Subroutine */ int dgesl_(real_type* a, integer* lda, integer* n, integer* ipvt, real_type* b, integer* job)\n{\n   /* System generated locals */\n   integer a_dim1, a_offset, i__1, i__2;\n\n   /* Local variables */\n   static integer   k, l;\n   static real_type t;\n   static integer   kb, nm1;\n\n   /*     dgesl solves the double precision system */\n   /*     a * x = b  or  trans(a) * x = b */\n   /*     using the factors computed by dgeco or dgefa. */\n\n   /*     on entry */\n\n   /*        a       double precision(lda, n) */\n   /*                the output from dgeco or dgefa. */\n\n   /*        lda     integer */\n   /*                the leading dimension of the array  a . */\n\n   /*        n       integer */\n   /*                the order of the matrix  a . */\n\n   /*        ipvt    integer(n) */\n   /*                the pivot vector from dgeco or dgefa. */\n\n   /*        b       double precision(n) */\n   /*                the right hand side vector. */\n\n   /*        job     integer */\n   /*                = 0         to solve  a*x = b , */\n   /*                = nonzero   to solve  trans(a)*x = b  where */\n   /*                            trans(a)  is the transpose. */\n\n   /*     on return */\n\n   /*        b       the solution vector  x . */\n\n   /*     error condition */\n\n   /*        a division by zero will occur if the input factor contains a */\n   /*        zero on the diagonal.  technically this indicates singularity */\n   /*        but it is often caused by improper arguments or improper */\n   /*        setting of lda .  it will not occur if the subroutines are */\n   /*        called correctly and if dgeco has set rcond .gt. 0.0 */\n   /*        or dgefa has set info .eq. 0 . */\n\n   /*     to compute  inverse(a) * c  where  c  is a matrix */\n   /*     with  p  columns */\n   /*           call dgeco(a,lda,n,ipvt,rcond,z) */\n   /*           if (rcond is too small) go to ... */\n   /*           do 10 j = 1, p */\n   /*              call dgesl(a,lda,n,ipvt,c(1,j),0) */\n   /*        10 continue */\n\n   /*     linpack. this version dated 08/14/78 . */\n   /*     cleve moler, university of new mexico, argonne national lab. */\n\n   /*     subroutines and functions */\n\n   /*     blas daxpy,ddot */\n\n   /*     internal variables */\n\n   /* Parameter adjustments */\n   a_dim1   = *lda;\n   a_offset = 1 + a_dim1;\n   a -= a_offset;\n   --ipvt;\n   --b;\n\n   /* Function Body */\n   nm1 = *n - 1;\n   if (*job != 0)\n   {\n      goto L50;\n   }\n\n   /*        job = 0 , solve  a * x = b */\n   /*        first solve  l*y = b */\n\n   if (nm1 < 1)\n   {\n      goto L30;\n   }\n   i__1 = nm1;\n   for (k = 1; k <= i__1; ++k)\n   {\n      l = ipvt[k];\n      t = b[l];\n      if (l == k)\n      {\n         goto L10;\n      }\n      b[l] = b[k];\n      b[k] = t;\n   L10:\n      i__2 = *n - k;\n      daxpy_(&i__2, &t, &a[k + 1 + k * a_dim1], &c__1, &b[k + 1], &c__1);\n      /* L20: */\n   }\nL30:\n\n   /*        now solve  u*x = y */\n\n   i__1 = *n;\n   for (kb = 1; kb <= i__1; ++kb)\n   {\n      k = *n + 1 - kb;\n      b[k] /= a[k + k * a_dim1];\n      t    = -b[k];\n      i__2 = k - 1;\n      daxpy_(&i__2, &t, &a[k * a_dim1 + 1], &c__1, &b[1], &c__1);\n      /* L40: */\n   }\n   goto L100;\nL50:\n\n   /*        job = nonzero, solve  trans(a) * x = b */\n   /*        first solve  trans(u)*y = b */\n\n   i__1 = *n;\n   for (k = 1; k <= i__1; ++k)\n   {\n      i__2 = k - 1;\n      t    = ddot_(&i__2, &a[k * a_dim1 + 1], &c__1, &b[1], &c__1);\n      b[k] = (b[k] - t) / a[k + k * a_dim1];\n      /* L60: */\n   }\n\n   /*        now solve trans(l)*x = y */\n\n   if (nm1 < 1)\n   {\n      goto L90;\n   }\n   i__1 = nm1;\n   for (kb = 1; kb <= i__1; ++kb)\n   {\n      k    = *n - kb;\n      i__2 = *n - k;\n      b[k] += ddot_(&i__2, &a[k + 1 + k * a_dim1], &c__1, &b[k + 1], &c__1);\n      l = ipvt[k];\n      if (l == k)\n      {\n         goto L70;\n      }\n      t    = b[l];\n      b[l] = b[k];\n      b[k] = t;\n   L70:\n       /* L80: */\n       ;\n   }\nL90:\nL100:\n   return 0;\n} /* dgesl_ */\n\n/* Subroutine */ int daxpy_(integer* n, real_type* da, real_type* dx,\n                            integer* incx, real_type* dy, integer* incy)\n{\n   /* System generated locals */\n   integer i__1;\n\n   /* Local variables */\n   static integer i__, m, ix, iy, mp1;\n\n   /*     constant times a vector plus a vector. */\n   /*     uses unrolled loops for increments equal to one. */\n   /*     jack dongarra, linpack, 3/11/78. */\n\n   /* Parameter adjustments */\n   --dy;\n   --dx;\n\n   /* Function Body */\n   if (*n <= 0)\n   {\n      return 0;\n   }\n   if (*da == 0.)\n   {\n      return 0;\n   }\n   if (*incx == 1 && *incy == 1)\n   {\n      goto L20;\n   }\n\n   /*        code for unequal increments or equal increments */\n   /*          not equal to 1 */\n\n   ix = 1;\n   iy = 1;\n   if (*incx < 0)\n   {\n      ix = (-(*n) + 1) * *incx + 1;\n   }\n   if (*incy < 0)\n   {\n      iy = (-(*n) + 1) * *incy + 1;\n   }\n   i__1 = *n;\n   for (i__ = 1; i__ <= i__1; ++i__)\n   {\n      dy[iy] += *da * dx[ix];\n      ix += *incx;\n      iy += *incy;\n      /* L10: */\n   }\n   return 0;\n\n   /*        code for both increments equal to 1 */\n\n   /*        clean-up loop */\n\nL20:\n   m = *n % 4;\n   if (m == 0)\n   {\n      goto L40;\n   }\n   i__1 = m;\n   for (i__ = 1; i__ <= i__1; ++i__)\n   {\n      dy[i__] += *da * dx[i__];\n      /* L30: */\n   }\n   if (*n < 4)\n   {\n      return 0;\n   }\nL40:\n   mp1  = m + 1;\n   i__1 = *n;\n   for (i__ = mp1; i__ <= i__1; i__ += 4)\n   {\n      dy[i__] += *da * dx[i__];\n      dy[i__ + 1] += *da * dx[i__ + 1];\n      dy[i__ + 2] += *da * dx[i__ + 2];\n      dy[i__ + 3] += *da * dx[i__ + 3];\n      /* L50: */\n   }\n   return 0;\n} /* daxpy_ */\n\nreal_type ddot_(integer* n, real_type* dx, integer* incx, real_type* dy,\n                integer* incy)\n{\n   /* System generated locals */\n   integer   i__1;\n   real_type ret_val;\n\n   /* Local variables */\n   static integer   i__, m, ix, iy, mp1;\n   static real_type dtemp;\n\n   /*     forms the dot product of two vectors. */\n   /*     uses unrolled loops for increments equal to one. */\n   /*     jack dongarra, linpack, 3/11/78. */\n\n   /* Parameter adjustments */\n   --dy;\n   --dx;\n\n   /* Function Body */\n   ret_val = CAST_TO_RT(0);\n   dtemp   = CAST_TO_RT(0);\n   if (*n <= 0)\n   {\n      return ret_val;\n   }\n   if (*incx == 1 && *incy == 1)\n   {\n      goto L20;\n   }\n\n   /*        code for unequal increments or equal increments */\n   /*          not equal to 1 */\n\n   ix = 1;\n   iy = 1;\n   if (*incx < 0)\n   {\n      ix = (-(*n) + 1) * *incx + 1;\n   }\n   if (*incy < 0)\n   {\n      iy = (-(*n) + 1) * *incy + 1;\n   }\n   i__1 = *n;\n   for (i__ = 1; i__ <= i__1; ++i__)\n   {\n      dtemp += dx[ix] * dy[iy];\n      ix += *incx;\n      iy += *incy;\n      /* L10: */\n   }\n   ret_val = dtemp;\n   return ret_val;\n\n   /*        code for both increments equal to 1 */\n\n   /*        clean-up loop */\n\nL20:\n   m = *n % 5;\n   if (m == 0)\n   {\n      goto L40;\n   }\n   i__1 = m;\n   for (i__ = 1; i__ <= i__1; ++i__)\n   {\n      dtemp += dx[i__] * dy[i__];\n      /* L30: */\n   }\n   if (*n < 5)\n   {\n      goto L60;\n   }\nL40:\n   mp1  = m + 1;\n   i__1 = *n;\n   for (i__ = mp1; i__ <= i__1; i__ += 5)\n   {\n      dtemp = dtemp + dx[i__] * dy[i__] + dx[i__ + 1] * dy[i__ + 1] + dx[i__ + 2] * dy[i__ + 2] + dx[i__ + 3] * dy[i__ + 3] + dx[i__ + 4] * dy[i__ + 4];\n      /* L50: */\n   }\nL60:\n   ret_val = dtemp;\n   return ret_val;\n} /* ddot_ */\n\n/* Subroutine */ int dscal_(integer* n, real_type* da, real_type* dx,\n                            integer* incx)\n{\n   /* System generated locals */\n   integer i__1, i__2;\n\n   /* Local variables */\n   static integer i__, m, mp1, nincx;\n\n   /*     scales a vector by a constant. */\n   /*     uses unrolled loops for increment equal to one. */\n   /*     jack dongarra, linpack, 3/11/78. */\n\n   /* Parameter adjustments */\n   --dx;\n\n   /* Function Body */\n   if (*n <= 0)\n   {\n      return 0;\n   }\n   if (*incx == 1)\n   {\n      goto L20;\n   }\n\n   /*        code for increment not equal to 1 */\n\n   nincx = *n * *incx;\n   i__1  = nincx;\n   i__2  = *incx;\n   for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2)\n   {\n      dx[i__] = *da * dx[i__];\n      /* L10: */\n   }\n   return 0;\n\n   /*        code for increment equal to 1 */\n\n   /*        clean-up loop */\n\nL20:\n   m = *n % 5;\n   if (m == 0)\n   {\n      goto L40;\n   }\n   i__2 = m;\n   for (i__ = 1; i__ <= i__2; ++i__)\n   {\n      dx[i__] = *da * dx[i__];\n      /* L30: */\n   }\n   if (*n < 5)\n   {\n      return 0;\n   }\nL40:\n   mp1  = m + 1;\n   i__2 = *n;\n   for (i__ = mp1; i__ <= i__2; i__ += 5)\n   {\n      dx[i__]     = *da * dx[i__];\n      dx[i__ + 1] = *da * dx[i__ + 1];\n      dx[i__ + 2] = *da * dx[i__ + 2];\n      dx[i__ + 3] = *da * dx[i__ + 3];\n      dx[i__ + 4] = *da * dx[i__ + 4];\n      /* L50: */\n   }\n   return 0;\n} /* dscal_ */\n\ninteger idamax_(integer* n, real_type* dx, integer* incx)\n{\n   /* System generated locals */\n   integer   ret_val, i__1;\n   real_type d__1;\n\n   /* Local variables */\n   static integer   i__, ix;\n   static real_type dmax__;\n\n   /*     finds the index of element having max. dabsolute value. */\n   /*     jack dongarra, linpack, 3/11/78. */\n\n   /* Parameter adjustments */\n   --dx;\n\n   /* Function Body */\n   ret_val = 0;\n   if (*n < 1)\n   {\n      return ret_val;\n   }\n   ret_val = 1;\n   if (*n == 1)\n   {\n      return ret_val;\n   }\n   if (*incx == 1)\n   {\n      goto L20;\n   }\n\n   /*        code for increment not equal to 1 */\n\n   ix     = 1;\n   dmax__ = abs(dx[1]);\n   ix += *incx;\n   i__1 = *n;\n   for (i__ = 2; i__ <= i__1; ++i__)\n   {\n      if ((d__1 = dx[ix], abs(d__1)) <= dmax__)\n      {\n         goto L5;\n      }\n      ret_val = i__;\n      dmax__  = (d__1 = dx[ix], abs(d__1));\n   L5:\n      ix += *incx;\n      /* L10: */\n   }\n   return ret_val;\n\n   /*        code for increment equal to 1 */\n\nL20:\n   dmax__ = abs(dx[1]);\n   i__1   = *n;\n   for (i__ = 2; i__ <= i__1; ++i__)\n   {\n      if ((d__1 = dx[i__], abs(d__1)) <= dmax__)\n      {\n         goto L30;\n      }\n      ret_val = i__;\n      dmax__  = (d__1 = dx[i__], abs(d__1));\n   L30:;\n   }\n   return ret_val;\n} /* idamax_ */\n\nreal_type epslon_(real_type* x)\n{\n#if defined(TEST_MPF_100) || defined(TEST_MPFR_100) || defined(TEST_GMPXX) || defined(TEST_MPFRXX)\n   return std::ldexp(1.0, 1 - ((100 + 1) * 1000L) / 301L);\n#elif defined(TEST_CPP_DEC_FLOAT_BN)\n   return std::pow(10.0, 1 - std::numeric_limits<efx::cpp_dec_float_50>::digits10);\n#elif defined(NATIVE_FLOAT128)\n   return FLT128_EPSILON;\n#else\n   return CAST_TO_RT(std::numeric_limits<real_type>::epsilon());\n#endif\n} /* epslon_ */\n\n/* Subroutine */ int mm_(real_type* a, integer* lda, integer* n1, integer* n3, real_type* b, integer* ldb, integer* n2, real_type* c__,\n                         integer* ldc)\n{\n   /* System generated locals */\n   integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2;\n\n   /* Local variables */\n   static integer i__, j;\n\n   /*   purpose: */\n   /*     multiply matrix b times matrix c and store the result in matrix a. */\n\n   /*   parameters: */\n\n   /*     a double precision(lda,n3), matrix of n1 rows and n3 columns */\n\n   /*     lda integer, leading dimension of array a */\n\n   /*     n1 integer, number of rows in matrices a and b */\n\n   /*     n3 integer, number of columns in matrices a and c */\n\n   /*     b double precision(ldb,n2), matrix of n1 rows and n2 columns */\n\n   /*     ldb integer, leading dimension of array b */\n\n   /*     n2 integer, number of columns in matrix b, and number of rows in */\n   /*         matrix c */\n\n   /*     c double precision(ldc,n3), matrix of n2 rows and n3 columns */\n\n   /*     ldc integer, leading dimension of array c */\n\n   /* ---------------------------------------------------------------------- */\n\n   /* Parameter adjustments */\n   a_dim1   = *lda;\n   a_offset = 1 + a_dim1;\n   a -= a_offset;\n   b_dim1   = *ldb;\n   b_offset = 1 + b_dim1;\n   b -= b_offset;\n   c_dim1   = *ldc;\n   c_offset = 1 + c_dim1;\n   c__ -= c_offset;\n\n   /* Function Body */\n   i__1 = *n3;\n   for (j = 1; j <= i__1; ++j)\n   {\n      i__2 = *n1;\n      for (i__ = 1; i__ <= i__2; ++i__)\n      {\n         a[i__ + j * a_dim1] = CAST_TO_RT(0);\n         /* L10: */\n      }\n      dmxpy_(n2, &a[j * a_dim1 + 1], n1, ldb, &c__[j * c_dim1 + 1], &b[b_offset]);\n      /* L20: */\n   }\n\n   return 0;\n} /* mm_ */\n\n/* Subroutine */ int dmxpy_(integer* n1, real_type* y, integer* n2, integer* ldm, real_type* x, real_type* m)\n{\n   /* System generated locals */\n   integer m_dim1, m_offset, i__1, i__2;\n\n   /* Local variables */\n   static integer i__, j, jmin;\n\n   /*   purpose: */\n   /*     multiply matrix m times vector x and add the result to vector y. */\n\n   /*   parameters: */\n\n   /*     n1 integer, number of elements in vector y, and number of rows in */\n   /*         matrix m */\n\n   /*     y double precision(n1), vector of length n1 to which is added */\n   /*         the product m*x */\n\n   /*     n2 integer, number of elements in vector x, and number of columns */\n   /*         in matrix m */\n\n   /*     ldm integer, leading dimension of array m */\n\n   /*     x double precision(n2), vector of length n2 */\n\n   /*     m double precision(ldm,n2), matrix of n1 rows and n2 columns */\n\n   /* ---------------------------------------------------------------------- */\n\n   /*   cleanup odd vector */\n\n   /* Parameter adjustments */\n   --y;\n   m_dim1   = *ldm;\n   m_offset = 1 + m_dim1;\n   m -= m_offset;\n   --x;\n\n   /* Function Body */\n   j = *n2 % 2;\n   if (j >= 1)\n   {\n      i__1 = *n1;\n      for (i__ = 1; i__ <= i__1; ++i__)\n      {\n         y[i__] += x[j] * m[i__ + j * m_dim1];\n         /* L10: */\n      }\n   }\n\n   /*   cleanup odd group of two vectors */\n\n   j = *n2 % 4;\n   if (j >= 2)\n   {\n      i__1 = *n1;\n      for (i__ = 1; i__ <= i__1; ++i__)\n      {\n         y[i__] = y[i__] + x[j - 1] * m[i__ + (j - 1) * m_dim1] + x[j] * m[i__ + j * m_dim1];\n         /* L20: */\n      }\n   }\n\n   /*   cleanup odd group of four vectors */\n\n   j = *n2 % 8;\n   if (j >= 4)\n   {\n      i__1 = *n1;\n      for (i__ = 1; i__ <= i__1; ++i__)\n      {\n         y[i__] = y[i__] + x[j - 3] * m[i__ + (j - 3) * m_dim1] + x[j - 2] * m[i__ + (j - 2) * m_dim1] + x[j - 1] * m[i__ + (j - 1) * m_dim1] + x[j] * m[i__ + j * m_dim1];\n         /* L30: */\n      }\n   }\n\n   /*   cleanup odd group of eight vectors */\n\n   j = *n2 % 16;\n   if (j >= 8)\n   {\n      i__1 = *n1;\n      for (i__ = 1; i__ <= i__1; ++i__)\n      {\n         y[i__] = y[i__] + x[j - 7] * m[i__ + (j - 7) * m_dim1] + x[j - 6] * m[i__ + (j - 6) * m_dim1] + x[j - 5] * m[i__ + (j - 5) * m_dim1] + x[j - 4] * m[i__ + (j - 4) * m_dim1] + x[j - 3] * m[i__ + (j - 3) * m_dim1] + x[j - 2] * m[i__ + (j - 2) * m_dim1] + x[j - 1] * m[i__ + (j - 1) * m_dim1] + x[j] * m[i__ + j * m_dim1];\n         /* L40: */\n      }\n   }\n\n   /*   main loop - groups of sixteen vectors */\n\n   jmin = j + 16;\n   i__1 = *n2;\n   for (j = jmin; j <= i__1; j += 16)\n   {\n      i__2 = *n1;\n      for (i__ = 1; i__ <= i__2; ++i__)\n      {\n         y[i__] = y[i__] + x[j - 15] * m[i__ + (j - 15) * m_dim1] + x[j - 14] * m[i__ + (j - 14) * m_dim1] + x[j - 13] * m[i__ + (j - 13) * m_dim1] + x[j - 12] * m[i__ + (j - 12) * m_dim1] + x[j - 11] * m[i__ + (j - 11) * m_dim1] + x[j - 10] * m[i__ + (j - 10) * m_dim1] + x[j - 9] * m[i__ + (j - 9) * m_dim1] + x[j - 8] * m[i__ + (j - 8) * m_dim1] + x[j - 7] * m[i__ + (j - 7) * m_dim1] + x[j - 6] * m[i__ + (j - 6) * m_dim1] + x[j - 5] * m[i__ + (j - 5) * m_dim1] + x[j - 4] * m[i__ + (j - 4) * m_dim1] + x[j - 3] * m[i__ + (j - 3) * m_dim1] + x[j - 2] * m[i__ + (j - 2) * m_dim1] + x[j - 1] * m[i__ + (j - 1) * m_dim1] + x[j] * m[i__ + j * m_dim1];\n         /* L50: */\n      }\n      /* L60: */\n   }\n   return 0;\n} /* dmxpy_ */\n\nreal_type ran_(integer* iseed)\n{\n   /* System generated locals */\n   real_type ret_val;\n\n   /* Local variables */\n   static integer it1, it2, it3, it4;\n\n   /*     modified from the LAPACK auxiliary routine 10/12/92 JD */\n   /*  -- LAPACK auxiliary routine (version 1.0) -- */\n   /*     Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */\n   /*     Courant Institute, Argonne National Lab, and Rice University */\n   /*     February 29, 1992 */\n\n   /*     .. Array Arguments .. */\n   /*     .. */\n\n   /*  Purpose */\n   /*  ======= */\n\n   /*  DLARAN returns a random double number from a uniform (0,1) */\n   /*  distribution. */\n\n   /*  Arguments */\n   /*  ========= */\n\n   /*  ISEED   (input/output) INTEGER array, dimension (4) */\n   /*          On entry, the seed of the random number generator; the array */\n   /*          elements must be between 0 and 4095, and ISEED(4) must be */\n   /*          odd. */\n   /*          On exit, the seed is updated. */\n\n   /*  Further Details */\n   /*  =============== */\n\n   /*  This routine uses a multiplicative congruential method with modulus */\n   /*  2**48 and multiplier 33952834046453 (see G.S.Fishman, */\n   /*  'Multiplicative congruential random number generators with modulus */\n   /*  2**b: an exhaustive analysis for b = 32 and a partial analysis for */\n   /*  b = 48', Math. Comp. 189, pp 331-344, 1990). */\n\n   /*  48-bit integers are stored in 4 integer array elements with 12 bits */\n   /*  per element. Hence the routine is portable across machines with */\n   /*  integers of 32 bits or more. */\n\n   /*     .. Parameters .. */\n   /*     .. */\n   /*     .. Local Scalars .. */\n   /*     .. */\n   /*     .. Intrinsic Functions .. */\n   /*     .. */\n   /*     .. Executable Statements .. */\n\n   /*     multiply the seed by the multiplier modulo 2**48 */\n\n   /* Parameter adjustments */\n   --iseed;\n\n   /* Function Body */\n   it4 = iseed[4] * 2549;\n   it3 = it4 / 4096;\n   it4 -= it3 << 12;\n   it3 = it3 + iseed[3] * 2549 + iseed[4] * 2508;\n   it2 = it3 / 4096;\n   it3 -= it2 << 12;\n   it2 = it2 + iseed[2] * 2549 + iseed[3] * 2508 + iseed[4] * 322;\n   it1 = it2 / 4096;\n   it2 -= it1 << 12;\n   it1 = it1 + iseed[1] * 2549 + iseed[2] * 2508 + iseed[3] * 322 + iseed[4] * 494;\n   it1 %= 4096;\n\n   /*     return updated seed */\n\n   iseed[1] = it1;\n   iseed[2] = it2;\n   iseed[3] = it3;\n   iseed[4] = it4;\n\n   /*     convert 48-bit integer to a double number in the interval (0,1) */\n\n   ret_val = ((real_type)it1 + ((real_type)it2 + ((real_type)it3 + (real_type)it4 * 2.44140625e-4) * 2.44140625e-4) * 2.44140625e-4) * 2.44140625e-4;\n   return ret_val;\n\n   /*     End of RAN */\n\n} /* ran_ */\n\n/*\n\nDouble results:\n~~~~~~~~~~~~~~\n\nnorm. resid      resid           machep         x(1)          x(n)\n6.4915           7.207e-013      2.2204e-016    1             1\n\n\n\ntimes are reported for matrices of order  1000\nfactor     solve      total     mflops       unit      ratio\ntimes for array with leading dimension of1001\n1.443     0.003      1.446     462.43       0.004325  25.821\n\n\nmpf_class results:\n~~~~~~~~~~~~~~~~~~\n\nnorm. resid      resid           machep         x(1)          x(n)\n3.6575e-05       5.2257e-103     2.8575e-101    1             1\n\n\n\ntimes are reported for matrices of order  1000\nfactor     solve      total     mflops       unit      ratio\ntimes for array with leading dimension of1001\n266.45     0.798      267.24    2.5021       0.79933   4772.2\n\n\nnumber<gmp_float<100> >:\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n     norm. resid      resid           machep         x(1)          x(n)\n  0.36575e-4          0.52257e-102   0.28575e-100    0.1e1         0.1e1\n\n\n\n    times are reported for matrices of order  1000\n      factor     solve      total     mflops       unit      ratio\n times for array with leading dimension of1001\n      279.96        0.84       280.8      2.3813     0.83988      5014.3\n\nboost::multiprecision::ef::cpp_dec_float_50:\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\n     norm. resid      resid           machep         x(1)          x(n)\n     2.551330735e-16  1.275665107e-112 1e-99         1             1\n\n\n\n    times are reported for matrices of order  1000\n      factor     solve      total     mflops       unit      ratio\n times for array with leading dimension of1001\n      363.89      1.074     364.97    1.8321       1.0916    6517.3\n*/\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/miller_rabin_performance.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"miller_rabin_performance.hpp\"\n\nunsigned allocation_count = 0;\n\nvoid* (*alloc_func_ptr)(size_t);\nvoid* (*realloc_func_ptr)(void*, size_t, size_t);\nvoid (*free_func_ptr)(void*, size_t);\n\nvoid* alloc_func(size_t n)\n{\n   ++allocation_count;\n   return (*alloc_func_ptr)(n);\n}\n\nvoid free_func(void* p, size_t n)\n{\n   (*free_func_ptr)(p, n);\n}\n\nvoid* realloc_func(void* p, size_t old, size_t n)\n{\n   ++allocation_count;\n   return (*realloc_func_ptr)(p, old, n);\n}\n\n#ifdef TEST_MPZ\nboost::chrono::duration<double> test_miller_rabin_gmp()\n{\n   using namespace boost::random;\n   using namespace boost::multiprecision;\n\n   stopwatch<boost::chrono::high_resolution_clock> c;\n\n   independent_bits_engine<mt11213b, 256, mpz_int> gen;\n\n   for (unsigned i = 0; i < 1000; ++i)\n   {\n      mpz_int n = gen();\n      mpz_probab_prime_p(n.backend().data(), 25);\n   }\n   return c.elapsed();\n}\n#endif\n\nstd::map<std::string, double> results;\ndouble                        min_time = (std::numeric_limits<double>::max)();\n\nvoid generate_quickbook()\n{\n   std::cout << \"[table\\n[[Integer Type][Relative Performance (Actual time in parenthesis)]]\\n\";\n\n   std::map<std::string, double>::const_iterator i(results.begin()), j(results.end());\n\n   while (i != j)\n   {\n      double rel = i->second / min_time;\n      std::cout << \"[[\" << i->first << \"][\" << rel << \"(\" << i->second << \"s)]]\\n\";\n      ++i;\n   }\n\n   std::cout << \"]\\n\";\n}\n\nint main()\n{\n   test01();\n   test02();\n   test03();\n   test04();\n   test05();\n   test06();\n   test07();\n   test08();\n   test09();\n   test10();\n   test11();\n   test12();\n\n   generate_quickbook();\n\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/miller_rabin_performance.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#define BOOST_CHRONO_HEADER_ONLY\n\n#if !defined(TEST_MPZ) && !defined(TEST_TOMMATH) && !defined(TEST_CPP_INT)\n#define TEST_MPZ\n#define TEST_TOMMATH\n#define TEST_CPP_INT\n#endif\n\n#ifdef TEST_MPZ\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_TOMMATH\n#include <boost/multiprecision/tommath.hpp>\n#endif\n#ifdef TEST_CPP_INT\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n#include <boost/multiprecision/miller_rabin.hpp>\n#include <boost/chrono.hpp>\n#include <boost/random.hpp>\n#include <map>\n\ntemplate <class Clock>\nstruct stopwatch\n{\n   typedef typename Clock::duration duration;\n   stopwatch()\n   {\n      m_start = Clock::now();\n   }\n   duration elapsed()\n   {\n      return Clock::now() - m_start;\n   }\n   void reset()\n   {\n      m_start = Clock::now();\n   }\n\n private:\n   typename Clock::time_point m_start;\n};\n\nextern unsigned allocation_count;\n\nextern std::map<std::string, double> results;\nextern double                        min_time;\n\ntemplate <class IntType>\nboost::chrono::duration<double> test_miller_rabin(const char* name)\n{\n   using namespace boost::random;\n\n   stopwatch<boost::chrono::high_resolution_clock> c;\n\n   independent_bits_engine<mt11213b, 256, IntType> gen;\n   //\n   // We must use a different generator for the tests and number generation, otherwise\n   // we get false positives.\n   //\n   mt19937  gen2;\n   unsigned result_count = 0;\n\n   for (unsigned i = 0; i < 1000; ++i)\n   {\n      IntType n = gen();\n      if (boost::multiprecision::miller_rabin_test(n, 25, gen2))\n         ++result_count;\n   }\n   boost::chrono::duration<double> t = c.elapsed();\n   double                          d = t.count();\n   if (d < min_time)\n      min_time = d;\n   results[name] = d;\n   std::cout << \"Time for \" << std::setw(30) << std::left << name << \" = \" << d << std::endl;\n   std::cout << \"Number of primes found = \" << result_count << std::endl;\n   return t;\n}\n\nboost::chrono::duration<double> test_miller_rabin_gmp();\n\nvoid test01();\nvoid test02();\nvoid test03();\nvoid test04();\nvoid test05();\nvoid test06();\nvoid test07();\nvoid test08();\nvoid test09();\nvoid test10();\nvoid test11();\nvoid test12();\nvoid test13();\nvoid test14();\nvoid test15();\nvoid test16();\nvoid test17();\nvoid test18();\nvoid test19();\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/miller_rabin_performance.log",
    "content": "Time for cpp_int (no Expression templates) = 0.0717379\nNumber of primes found = 9\nTime for cpp_int                        = 0.0497465\nNumber of primes found = 9\nTime for cpp_int (128-bit cache)        = 0.0490558\nNumber of primes found = 9\nTime for cpp_int (256-bit cache)        = 0.0510209\nNumber of primes found = 9\nTime for cpp_int (512-bit cache)        = 0.0458041\nNumber of primes found = 9\nTime for cpp_int (1024-bit cache)       = 0.0478607\nNumber of primes found = 9\nTime for uint1024_t                     = 0.0413295\nNumber of primes found = 9\nTime for checked_uint1024_t             = 0.0422246\nNumber of primes found = 9\nTime for mpz_int (no Expression templates) = 0.00443395\nNumber of primes found = 9\nTime for mpz_int                        = 0.00466034\nNumber of primes found = 9\nTime for mpz_int (native Miller Rabin Test) = 0.000165419 seconds\nTime for tom_int (no Expression templates) = 0.274765\nNumber of primes found = 9\nTime for tom_int                        = 0.0226395\nNumber of primes found = 9\n[table\n[[Integer Type][Relative Performance (Actual time in parenthesis)]]\n[[checked_uint1024_t][9.52301(0.0422246s)]]\n[[cpp_int][11.2194(0.0497465s)]]\n[[cpp_int (1024-bit cache)][10.7941(0.0478607s)]]\n[[cpp_int (128-bit cache)][11.0637(0.0490558s)]]\n[[cpp_int (256-bit cache)][11.5069(0.0510209s)]]\n[[cpp_int (512-bit cache)][10.3303(0.0458041s)]]\n[[cpp_int (no Expression templates)][16.1792(0.0717379s)]]\n[[mpz_int][1.05106(0.00466034s)]]\n[[mpz_int (no Expression templates)][1(0.00443395s)]]\n[[tom_int][5.10595(0.0226395s)]]\n[[tom_int (no Expression templates)][61.9684(0.274765s)]]\n[[uint1024_t][9.32113(0.0413295s)]]\n]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/miller_rabin_performance_files/test01.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../miller_rabin_performance.hpp\"\n\nvoid test01()\n{\n   using namespace boost::multiprecision;\n#ifdef TEST_CPP_INT\n   test_miller_rabin<number<cpp_int_backend<>, et_off> >(\"cpp_int (no Expression templates)\");\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/miller_rabin_performance_files/test02.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../miller_rabin_performance.hpp\"\n\nvoid test02()\n{\n   using namespace boost::multiprecision;\n#ifdef TEST_CPP_INT\n   test_miller_rabin<cpp_int>(\"cpp_int\");\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/miller_rabin_performance_files/test03.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../miller_rabin_performance.hpp\"\n\nvoid test03()\n{\n   using namespace boost::multiprecision;\n#ifdef TEST_CPP_INT\n   test_miller_rabin<number<cpp_int_backend<128> > >(\"cpp_int (128-bit cache)\");\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/miller_rabin_performance_files/test04.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../miller_rabin_performance.hpp\"\n\nvoid test04()\n{\n   using namespace boost::multiprecision;\n#ifdef TEST_CPP_INT\n   test_miller_rabin<number<cpp_int_backend<256> > >(\"cpp_int (256-bit cache)\");\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/miller_rabin_performance_files/test05.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../miller_rabin_performance.hpp\"\n\nvoid test05()\n{\n   using namespace boost::multiprecision;\n#ifdef TEST_CPP_INT\n   test_miller_rabin<number<cpp_int_backend<512> > >(\"cpp_int (512-bit cache)\");\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/miller_rabin_performance_files/test06.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../miller_rabin_performance.hpp\"\n\nvoid test06()\n{\n   using namespace boost::multiprecision;\n#ifdef TEST_CPP_INT\n   test_miller_rabin<number<cpp_int_backend<1024> > >(\"cpp_int (1024-bit cache)\");\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/miller_rabin_performance_files/test07.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../miller_rabin_performance.hpp\"\n\nvoid test07()\n{\n   using namespace boost::multiprecision;\n#ifdef TEST_CPP_INT\n   test_miller_rabin<uint1024_t>(\"uint1024_t\");\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/miller_rabin_performance_files/test08.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../miller_rabin_performance.hpp\"\n\nvoid test08()\n{\n   using namespace boost::multiprecision;\n#ifdef TEST_CPP_INT\n   test_miller_rabin<checked_uint1024_t>(\"checked_uint1024_t\");\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/miller_rabin_performance_files/test09.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../miller_rabin_performance.hpp\"\n\nvoid test09()\n{\n   using namespace boost::multiprecision;\n#ifdef TEST_MPZ\n   test_miller_rabin<number<gmp_int, et_off> >(\"mpz_int (no Expression templates)\");\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/miller_rabin_performance_files/test10.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../miller_rabin_performance.hpp\"\n\nvoid test10()\n{\n   using namespace boost::multiprecision;\n#ifdef TEST_MPZ\n   test_miller_rabin<mpz_int>(\"mpz_int\");\n   std::cout << \"Time for mpz_int (native Miller Rabin Test) = \" << test_miller_rabin_gmp() << std::endl;\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/miller_rabin_performance_files/test11.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../miller_rabin_performance.hpp\"\n\nvoid test11()\n{\n   using namespace boost::multiprecision;\n#ifdef TEST_TOMMATH\n   test_miller_rabin<number<boost::multiprecision::tommath_int, et_off> >(\"tom_int (no Expression templates)\");\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/miller_rabin_performance_files/test12.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../miller_rabin_performance.hpp\"\n\nvoid test12()\n{\n   using namespace boost::multiprecision;\n#ifdef TEST_TOMMATH\n   test_miller_rabin<boost::multiprecision::tom_int>(\"tom_int\");\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/mixed_equivalent_types_bench.cpp",
    "content": "//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <iostream>\n#include <benchmark/benchmark.h>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/random.hpp>\n#include <boost/math/special_functions/ellint_2.hpp>\n#include <cmath>\n\n\nusing namespace boost::multiprecision;\nusing namespace boost::random;\n\nunsigned allocation_count = 0;\n\nvoid* operator new(std::size_t count)\n{\n   ++allocation_count;\n   return std::malloc(count);\n}\nvoid* operator new[](std::size_t count)\n{\n   ++allocation_count;\n   return std::malloc(count);\n}\nvoid operator delete(void* ptr)noexcept\n{\n   std::free(ptr);\n}\nvoid operator delete[](void* ptr) noexcept\n{\n   std::free(ptr);\n}\n\ntemplate <class T>\nstd::tuple<std::vector<T>, std::vector<T> >& get_test_vector(unsigned bits)\n{\n   static std::map<unsigned, std::tuple<std::vector<T>, std::vector<T> > > data;\n\n   std::tuple<std::vector<T>, std::vector<T> >& result = data[bits];\n\n   if (std::get<0>(result).size() == 0)\n   {\n      mt19937                     mt;\n      uniform_int_distribution<T> ui(T(1) << (bits - 1), T(1) << bits);\n\n      std::vector<T>& a = std::get<0>(result);\n      std::vector<T>& b = std::get<1>(result);\n\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         a.push_back(ui(mt));\n         b.push_back(ui(mt));\n      }\n   }\n   return result;\n}\n\ntemplate <class T>\nstd::vector<T>& get_test_vector_a(unsigned bits)\n{\n   return std::get<0>(get_test_vector<T>(bits));\n}\ntemplate <class T>\nstd::vector<T>& get_test_vector_b(unsigned bits)\n{\n   return std::get<1>(get_test_vector<T>(bits));\n}\n\nusing namespace boost::multiprecision;\n\n//[dot_prod_1\ncpp_int dot_product_1(const std::vector<cpp_int>& v1, const std::vector<cpp_int>& v2)\n{\n   if (v1.size() != v2.size())\n      throw std::domain_error(\"Mismatched arguments\");\n\n   cpp_int result;\n   for (std::size_t i = 0; i < v1.size(); ++i)\n      result += v1[i] * v2[i];\n   //\n   // Named-return value optimisation (even better than a move):\n   //\n   return result;\n}\n//]\n//[dot_prod_2\ncpp_int dot_product_2(const std::vector<cpp_int>& v1, const std::vector<cpp_int>& v2)\n{\n   if (v1.size() != v2.size())\n      throw std::domain_error(\"Mismatched arguments\");\n   //\n   // If we know that most of our data is of a certain range of values, then we can use a cpp_int type\n   // with an internal cache large enough to *probably* not require an allocation:\n   //\n   number<cpp_int_backend<1024> > result;\n   for (std::size_t i = 0; i < v1.size(); ++i)\n      result += v1[i] * v2[i];\n   //\n   // We can't rely on the named-return-value optimisation here, since the variable being returned\n   // is a different type to the return value.  However, since these are \"equivalent\" types we\n   // can move the result to the return value and get all the expected move-optimisations should\n   // variable result have dynamically allocated:\n   //\n   return std::move(result);\n}\n//]\n//[dot_prod_3\ncpp_int dot_product_3(const std::vector<cpp_int>& v1, const std::vector<cpp_int>& v2)\n{\n   if (v1.size() != v2.size())\n      throw std::domain_error(\"Mismatched arguments\");\n\n   cpp_int result, term;\n   for (std::size_t i = 0; i < v1.size(); ++i)\n   {\n      //\n      // Re-use the same variable for the result of the multiplications, rather than rely on \n      // an internally generated temporary.  Depending on the input data, this may allocate\n      // a few times depending how soon in the input vector's we encounter the largest values.\n      // In the best case though, or for fairly uniformly sized input data, we will allocate \n      // only once:\n      //\n      term = v1[i] * v2[i];\n      result += term;\n   }\n   //\n   // Named-return value optimisation (even better than a move):\n   //\n   return result;\n}\n//]\n\ntemplate <typename T>\nstatic void BM_dot_product_1(benchmark::State& state)\n{\n   int bits = state.range(0);\n\n   std::vector<T>& a = get_test_vector_a<T>(bits);\n   std::vector<T>& b = get_test_vector_b<T>(bits);\n\n   static int done = 0;\n   if (done != bits)\n   {\n      allocation_count = 0;\n      benchmark::DoNotOptimize(dot_product_1(a, b));\n      std::cout << allocation_count << std::endl;\n      done = bits;\n   }\n\n   for (auto _ : state)\n   {\n      benchmark::DoNotOptimize(dot_product_1(a, b));\n   }\n   state.SetComplexityN(bits);\n}\ntemplate <typename T>\nstatic void BM_dot_product_2(benchmark::State& state)\n{\n   int                         bits = state.range(0);\n\n   std::vector<T>& a = get_test_vector_a<T>(bits);\n   std::vector<T>& b = get_test_vector_b<T>(bits);\n\n   static int done = 0;\n   if (done != bits)\n   {\n      allocation_count = 0;\n      benchmark::DoNotOptimize(dot_product_2(a, b));\n      std::cout << allocation_count << std::endl;\n      done = bits;\n   }\n\n   for (auto _ : state)\n   {\n      benchmark::DoNotOptimize(dot_product_2(a, b));\n   }\n   state.SetComplexityN(bits);\n}\ntemplate <typename T>\nstatic void BM_dot_product_3(benchmark::State& state)\n{\n   int                         bits = state.range(0);\n\n   std::vector<T>& a = get_test_vector_a<T>(bits);\n   std::vector<T>& b = get_test_vector_b<T>(bits);\n\n   static int done = 0;\n   if (done != bits)\n   {\n      allocation_count = 0;\n      benchmark::DoNotOptimize(dot_product_3(a, b));\n      std::cout << allocation_count << std::endl;\n      done = bits;\n   }\n\n   for (auto _ : state)\n   {\n      benchmark::DoNotOptimize(dot_product_3(a, b));\n   }\n   state.SetComplexityN(bits);\n}\n//[elliptic_arc1\ntemplate <unsigned N>\nnumber<mpfr_float_backend<N> > elliptic_arc_length_1(const number<mpfr_float_backend<N> >& a, const number<mpfr_float_backend<N> >& b)\n{\n   number<mpfr_float_backend<N> > k = sqrt(1 - b * b / (a * a));\n   return 4 * a * boost::math::ellint_2(k);\n}\n//]\n//[elliptic_arc2\ntemplate <unsigned N>\nnumber<mpfr_float_backend<N> > elliptic_arc_length_2(const number<mpfr_float_backend<N> >& a, const number<mpfr_float_backend<N> >& b)\n{\n   number<mpfr_float_backend<N, allocate_stack> > k = sqrt(1 - b * b / (a * a));\n   return 4 * a * boost::math::ellint_2(k);\n}\n//]\n\ntemplate <typename T>\nstatic void BM_elliptic_1(benchmark::State& state)\n{\n   T a = 25.25 * boost::math::constants::e<T>();\n   T b = 3.75 * boost::math::constants::e<T>();\n\n   //std::cout << elliptic_arc_length_1(a, b) << std::endl;\n\n   for (auto _ : state)\n   {\n      benchmark::DoNotOptimize(elliptic_arc_length_1(a, b));\n   }\n}\ntemplate <typename T>\nstatic void BM_elliptic_2(benchmark::State& state)\n{\n   T a = 25.25 * boost::math::constants::e<T>();\n   T b = 3.75 * boost::math::constants::e<T>();\n\n   //std::cout << elliptic_arc_length_2(a, b) << std::endl;\n\n   for (auto _ : state)\n   {\n      benchmark::DoNotOptimize(elliptic_arc_length_2(a, b));\n   }\n}\n\nconstexpr unsigned lower_range = 32;\nconstexpr unsigned upper_range = 1024;\n\nBENCHMARK_TEMPLATE(BM_dot_product_1, cpp_int)->RangeMultiplier(2)->Range(lower_range, upper_range)->Unit(benchmark::kMillisecond)->Complexity();\nBENCHMARK_TEMPLATE(BM_dot_product_1, cpp_int)->RangeMultiplier(2)->Range(lower_range, upper_range)->Unit(benchmark::kMillisecond)->Complexity();\nBENCHMARK_TEMPLATE(BM_dot_product_2, cpp_int)->RangeMultiplier(2)->Range(lower_range, upper_range)->Unit(benchmark::kMillisecond)->Complexity();\nBENCHMARK_TEMPLATE(BM_dot_product_3, cpp_int)->RangeMultiplier(2)->Range(lower_range, upper_range)->Unit(benchmark::kMillisecond)->Complexity();\n\nBENCHMARK_TEMPLATE(BM_elliptic_1, number<mpfr_float_backend<30> >);\nBENCHMARK_TEMPLATE(BM_elliptic_1, number<mpfr_float_backend<40> >);\nBENCHMARK_TEMPLATE(BM_elliptic_1, number<mpfr_float_backend<50> >);\nBENCHMARK_TEMPLATE(BM_elliptic_1, number<mpfr_float_backend<60> >);\nBENCHMARK_TEMPLATE(BM_elliptic_1, number<mpfr_float_backend<70> >);\nBENCHMARK_TEMPLATE(BM_elliptic_1, number<mpfr_float_backend<80> >);\n\nBENCHMARK_TEMPLATE(BM_elliptic_2, number<mpfr_float_backend<30> >);\nBENCHMARK_TEMPLATE(BM_elliptic_2, number<mpfr_float_backend<40> >);\nBENCHMARK_TEMPLATE(BM_elliptic_2, number<mpfr_float_backend<50> >);\nBENCHMARK_TEMPLATE(BM_elliptic_2, number<mpfr_float_backend<60> >);\nBENCHMARK_TEMPLATE(BM_elliptic_2, number<mpfr_float_backend<70> >);\nBENCHMARK_TEMPLATE(BM_elliptic_2, number<mpfr_float_backend<80> >);\n\nBENCHMARK_MAIN();\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test-gcc-linux.log",
    "content": "gmp_float      50        +    0.0180885\ngmp_float      50        -    0.0227712\ngmp_float      50        *    0.0567584\ngmp_float      50        /    0.289062\ngmp_float      50        str  0.00354863\ngmp_float      50        +(int)0.0129337\ngmp_float      50        -(int)0.0256267\ngmp_float      50        *(int)0.0197258\ngmp_float      50        /(int)0.087785\ngmp_float      100       +    0.0196977\ngmp_float      100       -    0.024745\ngmp_float      100       *    0.0972\ngmp_float      100       /    0.393792\ngmp_float      100       str  0.00528245\ngmp_float      100       +(int)0.0154802\ngmp_float      100       -(int)0.0242376\ngmp_float      100       *(int)0.0251239\ngmp_float      100       /(int)0.100588\ngmp_float      500       +    0.034133\ngmp_float      500       -    0.0411447\ngmp_float      500       *    0.938779\ngmp_float      500       /    1.5973\ngmp_float      500       str  0.0406575\ngmp_float      500       +(int)0.0220839\ngmp_float      500       -(int)0.0310849\ngmp_float      500       *(int)0.046899\ngmp_float      500       /(int)0.240511\ngmp_int        128       +    0.0236625\ngmp_int        128       -    0.0255431\ngmp_int        128       *    0.0164612\ngmp_int        128       /    0.20205\ngmp_int        128       str  0.000397397\ngmp_int        128       +(int)0.00907029\ngmp_int        128       -(int)0.0120936\ngmp_int        128       *(int)0.0139764\ngmp_int        128       /(int)0.061181\ngmp_int        128       %    0.167724\ngmp_int        128       |    0.0126627\ngmp_int        128       &    0.0129377\ngmp_int        128       ^    0.0136018\ngmp_int        128       <<   0.0109566\ngmp_int        128       >>   0.0107283\ngmp_int        128       %(int)0.0408971\ngmp_int        128       |(int)0.0463637\ngmp_int        128       &(int)0.0502028\ngmp_int        128       ^(int)0.047593\ngmp_int        128       gcd  0.452707\ngmp_int        256       +    0.0257277\ngmp_int        256       -    0.0314085\ngmp_int        256       *    0.0495293\ngmp_int        256       /    0.242695\ngmp_int        256       str  0.000617745\ngmp_int        256       +(int)0.0129046\ngmp_int        256       -(int)0.0163165\ngmp_int        256       *(int)0.0153128\ngmp_int        256       /(int)0.0730963\ngmp_int        256       %    0.203102\ngmp_int        256       |    0.0149383\ngmp_int        256       &    0.0170717\ngmp_int        256       ^    0.0160796\ngmp_int        256       <<   0.0146023\ngmp_int        256       >>   0.010293\ngmp_int        256       %(int)0.0525884\ngmp_int        256       |(int)0.0501017\ngmp_int        256       &(int)0.0508389\ngmp_int        256       ^(int)0.0498771\ngmp_int        256       gcd  2.17179\ngmp_int        512       +    0.0283556\ngmp_int        512       -    0.0398509\ngmp_int        512       *    0.104633\ngmp_int        512       /    0.294206\ngmp_int        512       str  0.00125749\ngmp_int        512       +(int)0.0156938\ngmp_int        512       -(int)0.0204795\ngmp_int        512       *(int)0.0190714\ngmp_int        512       /(int)0.09638\ngmp_int        512       %    0.23687\ngmp_int        512       |    0.0244134\ngmp_int        512       &    0.0209509\ngmp_int        512       ^    0.0266707\ngmp_int        512       <<   0.0178981\ngmp_int        512       >>   0.0122496\ngmp_int        512       %(int)0.0655264\ngmp_int        512       |(int)0.0536497\ngmp_int        512       &(int)0.0532932\ngmp_int        512       ^(int)0.0540655\ngmp_int        512       gcd  4.86569\ngmp_int        1024      +    0.0417292\ngmp_int        1024      -    0.0504965\ngmp_int        1024      *    0.330741\ngmp_int        1024      /    0.376529\ngmp_int        1024      str  0.00295526\ngmp_int        1024      +(int)0.0258726\ngmp_int        1024      -(int)0.0235972\ngmp_int        1024      *(int)0.0326542\ngmp_int        1024      /(int)0.148103\ngmp_int        1024      %    0.301177\ngmp_int        1024      |    0.0262977\ngmp_int        1024      &    0.0235786\ngmp_int        1024      ^    0.0254182\ngmp_int        1024      <<   0.0206225\ngmp_int        1024      >>   0.012848\ngmp_int        1024      %(int)0.0765616\ngmp_int        1024      |(int)0.0495613\ngmp_int        1024      &(int)0.0512979\ngmp_int        1024      ^(int)0.0491785\ngmp_int        1024      gcd  10.2899\ncpp_int        128       +    0.0226262\ncpp_int        128       -    0.0256171\ncpp_int        128       *    0.0363846\ncpp_int        128       /    0.227187\ncpp_int        128       str  0.000703371\ncpp_int        128       +(int)0.0156956\ncpp_int        128       -(int)0.0122229\ncpp_int        128       *(int)0.0257193\ncpp_int        128       /(int)0.129609\ncpp_int        128       %    0.226534\ncpp_int        128       |    0.0242976\ncpp_int        128       &    0.0244482\ncpp_int        128       ^    0.0243197\ncpp_int        128       <<   0.0182175\ncpp_int        128       >>   0.0215535\ncpp_int        128       %(int)0.181554\ncpp_int        128       |(int)0.0454215\ncpp_int        128       &(int)0.0426893\ncpp_int        128       ^(int)0.0404509\ncpp_int        128       gcd  4.16823\ncpp_int        256       +    0.0275581\ncpp_int        256       -    0.0305114\ncpp_int        256       *    0.100083\ncpp_int        256       /    0.467116\ncpp_int        256       str  0.00181769\ncpp_int        256       +(int)0.017033\ncpp_int        256       -(int)0.0143035\ncpp_int        256       *(int)0.0294836\ncpp_int        256       /(int)0.303922\ncpp_int        256       %    0.435207\ncpp_int        256       |    0.0281237\ncpp_int        256       &    0.028049\ncpp_int        256       ^    0.0280192\ncpp_int        256       <<   0.0210768\ncpp_int        256       >>   0.0175781\ncpp_int        256       %(int)0.279274\ncpp_int        256       |(int)0.0323883\ncpp_int        256       &(int)0.0338674\ncpp_int        256       ^(int)0.0299941\ncpp_int        256       gcd  8.51244\ncpp_int        512       +    0.033691\ncpp_int        512       -    0.0422701\ncpp_int        512       *    0.343683\ncpp_int        512       /    0.755608\ncpp_int        512       str  0.00434022\ncpp_int        512       +(int)0.0196755\ncpp_int        512       -(int)0.0171212\ncpp_int        512       *(int)0.039305\ncpp_int        512       /(int)0.535727\ncpp_int        512       %    0.719958\ncpp_int        512       |    0.0339623\ncpp_int        512       &    0.0342017\ncpp_int        512       ^    0.033929\ncpp_int        512       <<   0.0269161\ncpp_int        512       >>   0.0216914\ncpp_int        512       %(int)0.53345\ncpp_int        512       |(int)0.0324562\ncpp_int        512       &(int)0.0424884\ncpp_int        512       ^(int)0.0323887\ncpp_int        512       gcd  19.489\ncpp_int        1024      +    0.0456764\ncpp_int        1024      -    0.0574919\ncpp_int        1024      *    1.28548\ncpp_int        1024      /    1.30086\ncpp_int        1024      str  0.0122363\ncpp_int        1024      +(int)0.0241476\ncpp_int        1024      -(int)0.0212992\ncpp_int        1024      *(int)0.0540818\ncpp_int        1024      /(int)1.00179\ncpp_int        1024      %    1.27181\ncpp_int        1024      |    0.0457886\ncpp_int        1024      &    0.0456006\ncpp_int        1024      ^    0.0456494\ncpp_int        1024      <<   0.0394128\ncpp_int        1024      >>   0.0294462\ncpp_int        1024      %(int)0.962651\ncpp_int        1024      |(int)0.0372077\ncpp_int        1024      &(int)0.0577198\ncpp_int        1024      ^(int)0.0372218\ncpp_int        1024      gcd  47.7651\ncpp_int(fixed) 128       +    0.0183948\ncpp_int(fixed) 128       -    0.0182905\ncpp_int(fixed) 128       *    0.0201727\ncpp_int(fixed) 128       /    0.206852\ncpp_int(fixed) 128       str  0.000630107\ncpp_int(fixed) 128       +(int)0.00967714\ncpp_int(fixed) 128       -(int)0.00810627\ncpp_int(fixed) 128       *(int)0.0183201\ncpp_int(fixed) 128       /(int)0.111309\ncpp_int(fixed) 128       %    0.204164\ncpp_int(fixed) 128       |    0.0136789\ncpp_int(fixed) 128       &    0.0143848\ncpp_int(fixed) 128       ^    0.0137773\ncpp_int(fixed) 128       <<   0.0131154\ncpp_int(fixed) 128       >>   0.00912176\ncpp_int(fixed) 128       %(int)0.115583\ncpp_int(fixed) 128       |(int)0.0164462\ncpp_int(fixed) 128       &(int)0.0169816\ncpp_int(fixed) 128       ^(int)0.014607\ncpp_int(fixed) 128       gcd  2.87326\ncpp_int(fixed) 256       +    0.0217614\ncpp_int(fixed) 256       -    0.0208437\ncpp_int(fixed) 256       *    0.0385279\ncpp_int(fixed) 256       /    0.321272\ncpp_int(fixed) 256       str  0.00149991\ncpp_int(fixed) 256       +(int)0.0102395\ncpp_int(fixed) 256       -(int)0.00923316\ncpp_int(fixed) 256       *(int)0.021549\ncpp_int(fixed) 256       /(int)0.219146\ncpp_int(fixed) 256       %    0.321039\ncpp_int(fixed) 256       |    0.0154596\ncpp_int(fixed) 256       &    0.0156443\ncpp_int(fixed) 256       ^    0.015493\ncpp_int(fixed) 256       <<   0.0169546\ncpp_int(fixed) 256       >>   0.0114138\ncpp_int(fixed) 256       %(int)0.238857\ncpp_int(fixed) 256       |(int)0.015725\ncpp_int(fixed) 256       &(int)0.021641\ncpp_int(fixed) 256       ^(int)0.0163443\ncpp_int(fixed) 256       gcd  6.68597\ncpp_int(fixed) 512       +    0.0284799\ncpp_int(fixed) 512       -    0.028304\ncpp_int(fixed) 512       *    0.119904\ncpp_int(fixed) 512       /    0.616699\ncpp_int(fixed) 512       str  0.00415653\ncpp_int(fixed) 512       +(int)0.0122821\ncpp_int(fixed) 512       -(int)0.0110103\ncpp_int(fixed) 512       *(int)0.0283635\ncpp_int(fixed) 512       /(int)0.451373\ncpp_int(fixed) 512       %    0.620217\ncpp_int(fixed) 512       |    0.0189862\ncpp_int(fixed) 512       &    0.0192657\ncpp_int(fixed) 512       ^    0.018973\ncpp_int(fixed) 512       <<   0.0188263\ncpp_int(fixed) 512       >>   0.0152103\ncpp_int(fixed) 512       %(int)0.491398\ncpp_int(fixed) 512       |(int)0.0182191\ncpp_int(fixed) 512       &(int)0.0277722\ncpp_int(fixed) 512       ^(int)0.0182565\ncpp_int(fixed) 512       gcd  16.1788\ncpp_int(fixed) 1024      +    0.0396571\ncpp_int(fixed) 1024      -    0.0413187\ncpp_int(fixed) 1024      *    0.371065\ncpp_int(fixed) 1024      /    1.09072\ncpp_int(fixed) 1024      str  0.011546\ncpp_int(fixed) 1024      +(int)0.0254102\ncpp_int(fixed) 1024      -(int)0.020939\ncpp_int(fixed) 1024      *(int)0.0494233\ncpp_int(fixed) 1024      /(int)0.870306\ncpp_int(fixed) 1024      %    1.09888\ncpp_int(fixed) 1024      |    0.0393824\ncpp_int(fixed) 1024      &    0.0397966\ncpp_int(fixed) 1024      ^    0.0394082\ncpp_int(fixed) 1024      <<   0.0392477\ncpp_int(fixed) 1024      >>   0.0214742\ncpp_int(fixed) 1024      %(int)0.941513\ncpp_int(fixed) 1024      |(int)0.0304613\ncpp_int(fixed) 1024      &(int)0.0497983\ncpp_int(fixed) 1024      ^(int)0.0333848\ncpp_int(fixed) 1024      gcd  41.9178\ncpp_rational   128       +    8.33358\ncpp_rational   128       -    8.3543\ncpp_rational   128       *    15.3196\ncpp_rational   128       /    31.794\ncpp_rational   128       str  0.00980984\ncpp_rational   128       +(int)1.14042\ncpp_rational   128       -(int)1.13947\ncpp_rational   128       *(int)1.3425\ncpp_rational   128       /(int)1.35276\ncpp_rational   256       +    24.5753\ncpp_rational   256       -    24.3831\ncpp_rational   256       *    45.9283\ncpp_rational   256       /    80.7871\ncpp_rational   256       str  0.0288878\ncpp_rational   256       +(int)1.54697\ncpp_rational   256       -(int)1.55711\ncpp_rational   256       *(int)2.05921\ncpp_rational   256       /(int)2.12933\ncpp_rational   512       +    58.1983\ncpp_rational   512       -    58.3044\ncpp_rational   512       *    111.528\ncpp_rational   512       /    184.73\ncpp_rational   512       str  0.067039\ncpp_rational   512       +(int)1.83113\ncpp_rational   512       -(int)1.82889\ncpp_rational   512       *(int)2.75206\ncpp_rational   512       /(int)2.75885\ncpp_rational   1024      +    139.884\ncpp_rational   1024      -    139.665\ncpp_rational   1024      *    270.253\ncpp_rational   1024      /    436.471\ncpp_rational   1024      str  0.165057\ncpp_rational   1024      +(int)2.65768\ncpp_rational   1024      -(int)2.68279\ncpp_rational   1024      *(int)4.26866\ncpp_rational   1024      /(int)4.27228\nmpq_rational   128       +    0.518878\nmpq_rational   128       -    0.520249\nmpq_rational   128       *    0.940549\nmpq_rational   128       /    2.63335\nmpq_rational   128       str  0.000732008\nmpq_rational   128       +(int)0.145745\nmpq_rational   128       -(int)0.142505\nmpq_rational   128       *(int)0.173305\nmpq_rational   128       /(int)0.178914\nmpq_rational   256       +    2.2747\nmpq_rational   256       -    2.27886\nmpq_rational   256       *    4.27402\nmpq_rational   256       /    8.07149\nmpq_rational   256       str  0.00123256\nmpq_rational   256       +(int)0.164417\nmpq_rational   256       -(int)0.161741\nmpq_rational   256       *(int)0.193095\nmpq_rational   256       /(int)0.202255\nmpq_rational   512       +    5.09463\nmpq_rational   512       -    5.09757\nmpq_rational   512       *    9.6481\nmpq_rational   512       /    16.9064\nmpq_rational   512       str  0.00244388\nmpq_rational   512       +(int)0.202901\nmpq_rational   512       -(int)0.200644\nmpq_rational   512       *(int)0.248942\nmpq_rational   512       /(int)0.251928\nmpq_rational   1024      +    11.2492\nmpq_rational   1024      -    11.2528\nmpq_rational   1024      *    21.0227\nmpq_rational   1024      /    35.7647\nmpq_rational   1024      str  0.00559869\nmpq_rational   1024      +(int)0.287349\nmpq_rational   1024      -(int)0.28136\nmpq_rational   1024      *(int)0.337805\nmpq_rational   1024      /(int)0.351164\ntommath_int    128       +    0.0169999\ntommath_int    128       -    0.025088\ntommath_int    128       *    0.0608098\ntommath_int    128       /    1.14807\ntommath_int    128       str  0.00864677\ntommath_int    128       +(int)0.170239\ntommath_int    128       -(int)0.169805\ntommath_int    128       *(int)0.18998\ntommath_int    128       /(int)0.936106\ntommath_int    128       %    1.10993\ntommath_int    128       |    0.0742258\ntommath_int    128       &    0.0747022\ntommath_int    128       ^    0.0734074\ntommath_int    128       <<   0.0316344\ntommath_int    128       >>   0.139155\ntommath_int    128       %(int)0.871093\ntommath_int    128       |(int)0.249135\ntommath_int    128       &(int)0.224394\ntommath_int    128       ^(int)0.248407\ntommath_int    128       gcd  7.6073\ntommath_int    256       +    0.0191462\ntommath_int    256       -    0.0267191\ntommath_int    256       *    0.0843842\ntommath_int    256       /    1.34052\ntommath_int    256       str  0.0212684\ntommath_int    256       +(int)0.173633\ntommath_int    256       -(int)0.173084\ntommath_int    256       *(int)0.20074\ntommath_int    256       /(int)1.17192\ntommath_int    256       %    1.33781\ntommath_int    256       |    0.0740269\ntommath_int    256       &    0.0747001\ntommath_int    256       ^    0.0741847\ntommath_int    256       <<   0.0379471\ntommath_int    256       >>   0.14164\ntommath_int    256       %(int)1.52193\ntommath_int    256       |(int)0.251418\ntommath_int    256       &(int)0.230435\ntommath_int    256       ^(int)0.249516\ntommath_int    256       gcd  15.8851\ntommath_int    512       +    0.0241933\ntommath_int    512       -    0.032154\ntommath_int    512       *    0.195855\ntommath_int    512       /    2.061\ntommath_int    512       str  0.0827649\ntommath_int    512       +(int)0.25223\ntommath_int    512       -(int)0.25482\ntommath_int    512       *(int)0.305608\ntommath_int    512       /(int)1.76155\ntommath_int    512       %    1.97453\ntommath_int    512       |    0.0795209\ntommath_int    512       &    0.0815029\ntommath_int    512       ^    0.0793004\ntommath_int    512       <<   0.0449753\ntommath_int    512       >>   0.149597\ntommath_int    512       %(int)1.74258\ntommath_int    512       |(int)0.253519\ntommath_int    512       &(int)0.235246\ntommath_int    512       ^(int)0.261762\ntommath_int    512       gcd  33.8904\ntommath_int    1024      +    0.0356467\ntommath_int    1024      -    0.0426379\ntommath_int    1024      *    0.563154\ntommath_int    1024      /    3.3106\ntommath_int    1024      str  0.200351\ntommath_int    1024      +(int)0.183982\ntommath_int    1024      -(int)0.182348\ntommath_int    1024      *(int)0.265242\ntommath_int    1024      /(int)2.99248\ntommath_int    1024      %    3.36442\ntommath_int    1024      |    0.0935681\ntommath_int    1024      &    0.0990244\ntommath_int    1024      ^    0.0948247\ntommath_int    1024      <<   0.0671463\ntommath_int    1024      >>   0.167341\ntommath_int    1024      %(int)2.8911\ntommath_int    1024      |(int)0.26358\ntommath_int    1024      &(int)0.244976\ntommath_int    1024      ^(int)0.261357\ntommath_int    1024      gcd  67.1657\ncpp_dec_float  50        +    0.0139248\ncpp_dec_float  50        -    0.0142418\ncpp_dec_float  50        *    0.118247\ncpp_dec_float  50        /    1.82747\ncpp_dec_float  50        str  0.00932849\ncpp_dec_float  50        +(int)0.0253923\ncpp_dec_float  50        -(int)0.0248418\ncpp_dec_float  50        *(int)0.0371704\ncpp_dec_float  50        /(int)0.199883\ncpp_dec_float  100       +    0.0171021\ncpp_dec_float  100       -    0.0176287\ncpp_dec_float  100       *    0.237033\ncpp_dec_float  100       /    3.63766\ncpp_dec_float  100       str  0.0201057\ncpp_dec_float  100       +(int)0.0330663\ncpp_dec_float  100       -(int)0.0332922\ncpp_dec_float  100       *(int)0.0606472\ncpp_dec_float  100       /(int)0.343778\ncpp_dec_float  500       +    0.043194\ncpp_dec_float  500       -    0.0443422\ncpp_dec_float  500       *    2.12299\ncpp_dec_float  500       /    25.7245\ncpp_dec_float  500       str  0.0655127\ncpp_dec_float  500       +(int)0.0706977\ncpp_dec_float  500       -(int)0.0727089\ncpp_dec_float  500       *(int)0.239796\ncpp_dec_float  500       /(int)1.39609\nmpfr_float     50        +    0.019179\nmpfr_float     50        -    0.0225632\nmpfr_float     50        *    0.0588765\nmpfr_float     50        /    0.317276\nmpfr_float     50        str  0.00725414\nmpfr_float     50        +(int)0.0286079\nmpfr_float     50        -(int)0.0465151\nmpfr_float     50        *(int)0.0362579\nmpfr_float     50        /(int)0.0888645\nmpfr_float     100       +    0.0210236\nmpfr_float     100       -    0.0250703\nmpfr_float     100       *    0.0946262\nmpfr_float     100       /    0.456375\nmpfr_float     100       str  0.00900848\nmpfr_float     100       +(int)0.0320443\nmpfr_float     100       -(int)0.0487733\nmpfr_float     100       *(int)0.0437034\nmpfr_float     100       /(int)0.154203\nmpfr_float     500       +    0.033691\nmpfr_float     500       -    0.0371954\nmpfr_float     500       *    0.851721\nmpfr_float     500       /    2.7946\nmpfr_float     500       str  0.0342011\nmpfr_float     500       +(int)0.0414774\nmpfr_float     500       -(int)0.0616173\nmpfr_float     500       *(int)0.0826485\nmpfr_float     500       /(int)0.254227\n[section:float_performance Float Type Perfomance]\n[table Operator *\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][2.08334 (0.118247s)][2.50494 (0.237033s)][2.49259 (2.12299s)]]\n[[gmp_float][[*1] (0.0567584s)][1.0272 (0.0972s)][1.10221 (0.938779s)]]\n[[mpfr_float][1.03732 (0.0588765s)][[*1] (0.0946262s)][[*1] (0.851721s)]]\n]\n[table Operator *(int)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][1.88436 (0.0371704s)][2.41392 (0.0606472s)][5.11303 (0.239796s)]]\n[[gmp_float][[*1] (0.0197258s)][[*1] (0.0251239s)][[*1] (0.046899s)]]\n[[mpfr_float][1.8381 (0.0362579s)][1.73951 (0.0437034s)][1.76227 (0.0826485s)]]\n]\n[table Operator +\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][[*1] (0.0139248s)][[*1] (0.0171021s)][1.28206 (0.043194s)]]\n[[gmp_float][1.29901 (0.0180885s)][1.15177 (0.0196977s)][1.01312 (0.034133s)]]\n[[mpfr_float][1.37732 (0.019179s)][1.2293 (0.0210236s)][[*1] (0.033691s)]]\n]\n[table Operator +(int)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][1.96327 (0.0253923s)][2.13604 (0.0330663s)][3.20133 (0.0706977s)]]\n[[gmp_float][[*1] (0.0129337s)][[*1] (0.0154802s)][[*1] (0.0220839s)]]\n[[mpfr_float][2.21189 (0.0286079s)][2.07002 (0.0320443s)][1.87818 (0.0414774s)]]\n]\n[table Operator -\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][[*1] (0.0142418s)][[*1] (0.0176287s)][1.19214 (0.0443422s)]]\n[[gmp_float][1.5989 (0.0227712s)][1.40368 (0.024745s)][1.10618 (0.0411447s)]]\n[[mpfr_float][1.5843 (0.0225632s)][1.42213 (0.0250703s)][[*1] (0.0371954s)]]\n]\n[table Operator -(int)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][[*1] (0.0248418s)][1.37357 (0.0332922s)][2.33904 (0.0727089s)]]\n[[gmp_float][1.03159 (0.0256267s)][[*1] (0.0242376s)][[*1] (0.0310849s)]]\n[[mpfr_float][1.87245 (0.0465151s)][2.0123 (0.0487733s)][1.98223 (0.0616173s)]]\n]\n[table Operator /\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][6.32206 (1.82747s)][9.23752 (3.63766s)][16.1049 (25.7245s)]]\n[[gmp_float][[*1] (0.289062s)][[*1] (0.393792s)][[*1] (1.5973s)]]\n[[mpfr_float][1.09761 (0.317276s)][1.15892 (0.456375s)][1.74957 (2.7946s)]]\n]\n[table Operator /(int)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][2.27696 (0.199883s)][3.41769 (0.343778s)][5.8047 (1.39609s)]]\n[[gmp_float][[*1] (0.087785s)][[*1] (0.100588s)][[*1] (0.240511s)]]\n[[mpfr_float][1.0123 (0.0888645s)][1.53302 (0.154203s)][1.05703 (0.254227s)]]\n]\n[table Operator str\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][2.62876 (0.00932849s)][3.80613 (0.0201057s)][1.91552 (0.0655127s)]]\n[[gmp_float][[*1] (0.00354863s)][[*1] (0.00528245s)][1.18878 (0.0406575s)]]\n[[mpfr_float][2.04421 (0.00725414s)][1.70536 (0.00900848s)][[*1] (0.0342011s)]]\n]\n[endsect]\n[section:integer_performance Integer Type Perfomance]\n[table Operator %\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][1.35064 (0.226534s)][2.1428 (0.435207s)][3.03946 (0.719958s)][4.22281 (1.27181s)]]\n[[cpp_int(fixed)][1.21726 (0.204164s)][1.58068 (0.321039s)][2.61838 (0.620217s)][3.6486 (1.09888s)]]\n[[gmp_int][[*1] (0.167724s)][[*1] (0.203102s)][[*1] (0.23687s)][[*1] (0.301177s)]]\n[[tommath_int][6.61759 (1.10993s)][6.58689 (1.33781s)][8.33593 (1.97453s)][11.1709 (3.36442s)]]\n]\n[table Operator %(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][4.43928 (0.181554s)][5.31056 (0.279274s)][8.141 (0.53345s)][12.5735 (0.962651s)]]\n[[cpp_int(fixed)][2.82619 (0.115583s)][4.54202 (0.238857s)][7.49924 (0.491398s)][12.2974 (0.941513s)]]\n[[gmp_int][[*1] (0.0408971s)][[*1] (0.0525884s)][[*1] (0.0655264s)][[*1] (0.0765616s)]]\n[[tommath_int][21.2996 (0.871093s)][28.9405 (1.52193s)][26.5936 (1.74258s)][37.7618 (2.8911s)]]\n]\n[table Operator &\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][1.88968 (0.0244482s)][1.79292 (0.028049s)][1.77526 (0.0342017s)][1.93398 (0.0456006s)]]\n[[cpp_int(fixed)][1.11185 (0.0143848s)][[*1] (0.0156443s)][[*1] (0.0192657s)][1.68783 (0.0397966s)]]\n[[gmp_int][[*1] (0.0129377s)][1.09124 (0.0170717s)][1.08747 (0.0209509s)][[*1] (0.0235786s)]]\n[[tommath_int][5.77397 (0.0747022s)][4.7749 (0.0747001s)][4.23046 (0.0815029s)][4.19976 (0.0990244s)]]\n]\n[table Operator &(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][2.51385 (0.0426893s)][1.56497 (0.0338674s)][1.52989 (0.0424884s)][1.15907 (0.0577198s)]]\n[[cpp_int(fixed)][[*1] (0.0169816s)][[*1] (0.021641s)][[*1] (0.0277722s)][[*1] (0.0497983s)]]\n[[gmp_int][2.9563 (0.0502028s)][2.3492 (0.0508389s)][1.91894 (0.0532932s)][1.03011 (0.0512979s)]]\n[[tommath_int][13.2139 (0.224394s)][10.6481 (0.230435s)][8.47057 (0.235246s)][4.91936 (0.244976s)]]\n]\n[table Operator *\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][2.21032 (0.0363846s)][2.59769 (0.100083s)][3.28466 (0.343683s)][3.88666 (1.28548s)]]\n[[cpp_int(fixed)][1.22547 (0.0201727s)][[*1] (0.0385279s)][1.14595 (0.119904s)][1.12192 (0.371065s)]]\n[[gmp_int][[*1] (0.0164612s)][1.28554 (0.0495293s)][[*1] (0.104633s)][[*1] (0.330741s)]]\n[[tommath_int][3.69412 (0.0608098s)][2.19021 (0.0843842s)][1.87184 (0.195855s)][1.70271 (0.563154s)]]\n]\n[table Operator *(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][1.8402 (0.0257193s)][1.92542 (0.0294836s)][2.06094 (0.039305s)][1.6562 (0.0540818s)]]\n[[cpp_int(fixed)][1.3108 (0.0183201s)][1.40725 (0.021549s)][1.48723 (0.0283635s)][1.51354 (0.0494233s)]]\n[[gmp_int][[*1] (0.0139764s)][[*1] (0.0153128s)][[*1] (0.0190714s)][[*1] (0.0326542s)]]\n[[tommath_int][13.593 (0.18998s)][13.1093 (0.20074s)][16.0244 (0.305608s)][8.12274 (0.265242s)]]\n]\n[table Operator +\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][1.33096 (0.0226262s)][1.43935 (0.0275581s)][1.39258 (0.033691s)][1.28136 (0.0456764s)]]\n[[cpp_int(fixed)][1.08205 (0.0183948s)][1.13659 (0.0217614s)][1.17718 (0.0284799s)][1.1125 (0.0396571s)]]\n[[gmp_int][1.39192 (0.0236625s)][1.34375 (0.0257277s)][1.17204 (0.0283556s)][1.17063 (0.0417292s)]]\n[[tommath_int][[*1] (0.0169999s)][[*1] (0.0191462s)][[*1] (0.0241933s)][[*1] (0.0356467s)]]\n]\n[table Operator +(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][1.73044 (0.0156956s)][1.66346 (0.017033s)][1.60196 (0.0196755s)][[*1] (0.0241476s)]]\n[[cpp_int(fixed)][1.06691 (0.00967714s)][[*1] (0.0102395s)][[*1] (0.0122821s)][1.05229 (0.0254102s)]]\n[[gmp_int][[*1] (0.00907029s)][1.26028 (0.0129046s)][1.27777 (0.0156938s)][1.07144 (0.0258726s)]]\n[[tommath_int][18.7688 (0.170239s)][16.9572 (0.173633s)][20.5363 (0.25223s)][7.61905 (0.183982s)]]\n]\n[table Operator -\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][1.40057 (0.0256171s)][1.46382 (0.0305114s)][1.49343 (0.0422701s)][1.39142 (0.0574919s)]]\n[[cpp_int(fixed)][[*1] (0.0182905s)][[*1] (0.0208437s)][[*1] (0.028304s)][[*1] (0.0413187s)]]\n[[gmp_int][1.39653 (0.0255431s)][1.50686 (0.0314085s)][1.40796 (0.0398509s)][1.22212 (0.0504965s)]]\n[[tommath_int][1.37164 (0.025088s)][1.28188 (0.0267191s)][1.13602 (0.032154s)][1.03193 (0.0426379s)]]\n]\n[table Operator -(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][1.50784 (0.0122229s)][1.54914 (0.0143035s)][1.55501 (0.0171212s)][1.0172 (0.0212992s)]]\n[[cpp_int(fixed)][[*1] (0.00810627s)][[*1] (0.00923316s)][[*1] (0.0110103s)][[*1] (0.020939s)]]\n[[gmp_int][1.49189 (0.0120936s)][1.76716 (0.0163165s)][1.86002 (0.0204795s)][1.12695 (0.0235972s)]]\n[[tommath_int][20.9474 (0.169805s)][18.7459 (0.173084s)][23.1437 (0.25482s)][8.70855 (0.182348s)]]\n]\n[table Operator /\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][1.12441 (0.227187s)][1.92471 (0.467116s)][2.5683 (0.755608s)][3.45487 (1.30086s)]]\n[[cpp_int(fixed)][1.02377 (0.206852s)][1.32377 (0.321272s)][2.09615 (0.616699s)][2.89679 (1.09072s)]]\n[[gmp_int][[*1] (0.20205s)][[*1] (0.242695s)][[*1] (0.294206s)][[*1] (0.376529s)]]\n[[tommath_int][5.68214 (1.14807s)][5.52349 (1.34052s)][7.00529 (2.061s)][8.79242 (3.3106s)]]\n]\n[table Operator /(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][2.11845 (0.129609s)][4.15783 (0.303922s)][5.55849 (0.535727s)][6.76415 (1.00179s)]]\n[[cpp_int(fixed)][1.81934 (0.111309s)][2.99804 (0.219146s)][4.68327 (0.451373s)][5.87635 (0.870306s)]]\n[[gmp_int][[*1] (0.061181s)][[*1] (0.0730963s)][[*1] (0.09638s)][[*1] (0.148103s)]]\n[[tommath_int][15.3006 (0.936106s)][16.0325 (1.17192s)][18.2771 (1.76155s)][20.2054 (2.99248s)]]\n]\n[table Operator <<\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][1.66271 (0.0182175s)][1.44338 (0.0210768s)][1.50386 (0.0269161s)][1.91115 (0.0394128s)]]\n[[cpp_int(fixed)][1.19703 (0.0131154s)][1.16109 (0.0169546s)][1.05186 (0.0188263s)][1.90315 (0.0392477s)]]\n[[gmp_int][[*1] (0.0109566s)][[*1] (0.0146023s)][[*1] (0.0178981s)][[*1] (0.0206225s)]]\n[[tommath_int][2.88726 (0.0316344s)][2.5987 (0.0379471s)][2.51285 (0.0449753s)][3.25597 (0.0671463s)]]\n]\n[table Operator >>\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][2.36287 (0.0215535s)][1.70778 (0.0175781s)][1.77078 (0.0216914s)][2.29189 (0.0294462s)]]\n[[cpp_int(fixed)][[*1] (0.00912176s)][1.10889 (0.0114138s)][1.2417 (0.0152103s)][1.6714 (0.0214742s)]]\n[[gmp_int][1.17612 (0.0107283s)][[*1] (0.010293s)][[*1] (0.0122496s)][[*1] (0.012848s)]]\n[[tommath_int][15.2553 (0.139155s)][13.7608 (0.14164s)][12.2124 (0.149597s)][13.0247 (0.167341s)]]\n]\n[table Operator ^\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][1.78798 (0.0243197s)][1.8085 (0.0280192s)][1.78828 (0.033929s)][1.79594 (0.0456494s)]]\n[[cpp_int(fixed)][1.0129 (0.0137773s)][[*1] (0.015493s)][[*1] (0.018973s)][1.5504 (0.0394082s)]]\n[[gmp_int][[*1] (0.0136018s)][1.03786 (0.0160796s)][1.40572 (0.0266707s)][[*1] (0.0254182s)]]\n[[tommath_int][5.39689 (0.0734074s)][4.78827 (0.0741847s)][4.17964 (0.0793004s)][3.73059 (0.0948247s)]]\n]\n[table Operator ^(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][2.76928 (0.0404509s)][1.83515 (0.0299941s)][1.77409 (0.0323887s)][1.11493 (0.0372218s)]]\n[[cpp_int(fixed)][[*1] (0.014607s)][[*1] (0.0163443s)][[*1] (0.0182565s)][[*1] (0.0333848s)]]\n[[gmp_int][3.25823 (0.047593s)][3.05166 (0.0498771s)][2.96144 (0.0540655s)][1.47308 (0.0491785s)]]\n[[tommath_int][17.006 (0.248407s)][15.2663 (0.249516s)][14.338 (0.261762s)][7.82864 (0.261357s)]]\n]\n[table Operator gcd\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][9.20736 (4.16823s)][3.91955 (8.51244s)][4.00539 (19.489s)][4.64192 (47.7651s)]]\n[[cpp_int(fixed)][6.34685 (2.87326s)][3.07855 (6.68597s)][3.32507 (16.1788s)][4.07366 (41.9178s)]]\n[[gmp_int][[*1] (0.452707s)][[*1] (2.17179s)][[*1] (4.86569s)][[*1] (10.2899s)]]\n[[tommath_int][16.804 (7.6073s)][7.31428 (15.8851s)][6.96518 (33.8904s)][6.52732 (67.1657s)]]\n]\n[table Operator str\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][1.76995 (0.000703371s)][2.94246 (0.00181769s)][3.45149 (0.00434022s)][4.14052 (0.0122363s)]]\n[[cpp_int(fixed)][1.58559 (0.000630107s)][2.42804 (0.00149991s)][3.30542 (0.00415653s)][3.90693 (0.011546s)]]\n[[gmp_int][[*1] (0.000397397s)][[*1] (0.000617745s)][[*1] (0.00125749s)][[*1] (0.00295526s)]]\n[[tommath_int][21.7585 (0.00864677s)][34.4291 (0.0212684s)][65.8175 (0.0827649s)][67.7946 (0.200351s)]]\n]\n[table Operator |\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][1.91883 (0.0242976s)][1.88265 (0.0281237s)][1.78879 (0.0339623s)][1.74117 (0.0457886s)]]\n[[cpp_int(fixed)][1.08025 (0.0136789s)][1.03489 (0.0154596s)][[*1] (0.0189862s)][1.49756 (0.0393824s)]]\n[[gmp_int][[*1] (0.0126627s)][[*1] (0.0149383s)][1.28585 (0.0244134s)][[*1] (0.0262977s)]]\n[[tommath_int][5.86177 (0.0742258s)][4.9555 (0.0740269s)][4.18835 (0.0795209s)][3.55804 (0.0935681s)]]\n]\n[table Operator |(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][2.76183 (0.0454215s)][2.05967 (0.0323883s)][1.78143 (0.0324562s)][1.22147 (0.0372077s)]]\n[[cpp_int(fixed)][[*1] (0.0164462s)][[*1] (0.015725s)][[*1] (0.0182191s)][[*1] (0.0304613s)]]\n[[gmp_int][2.81912 (0.0463637s)][3.18611 (0.0501017s)][2.94469 (0.0536497s)][1.62702 (0.0495613s)]]\n[[tommath_int][15.1485 (0.249135s)][15.9884 (0.251418s)][13.915 (0.253519s)][8.65293 (0.26358s)]]\n]\n[endsect]\n[section:rational_performance Rational Type Perfomance]\n[table Operator *\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][16.2879 (15.3196s)][10.7459 (45.9283s)][11.5596 (111.528s)][12.8553 (270.253s)]]\n[[mpq_rational][[*1] (0.940549s)][[*1] (4.27402s)][[*1] (9.6481s)][[*1] (21.0227s)]]\n]\n[table Operator *(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][7.7465 (1.3425s)][10.6643 (2.05921s)][11.055 (2.75206s)][12.6365 (4.26866s)]]\n[[mpq_rational][[*1] (0.173305s)][[*1] (0.193095s)][[*1] (0.248942s)][[*1] (0.337805s)]]\n]\n[table Operator +\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][16.0608 (8.33358s)][10.8037 (24.5753s)][11.4235 (58.1983s)][12.435 (139.884s)]]\n[[mpq_rational][[*1] (0.518878s)][[*1] (2.2747s)][[*1] (5.09463s)][[*1] (11.2492s)]]\n]\n[table Operator +(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][7.82472 (1.14042s)][9.40883 (1.54697s)][9.02478 (1.83113s)][9.24894 (2.65768s)]]\n[[mpq_rational][[*1] (0.145745s)][[*1] (0.164417s)][[*1] (0.202901s)][[*1] (0.287349s)]]\n]\n[table Operator -\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][16.0583 (8.3543s)][10.6997 (24.3831s)][11.4377 (58.3044s)][12.4116 (139.665s)]]\n[[mpq_rational][[*1] (0.520249s)][[*1] (2.27886s)][[*1] (5.09757s)][[*1] (11.2528s)]]\n]\n[table Operator -(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][7.99602 (1.13947s)][9.62717 (1.55711s)][9.1151 (1.82889s)][9.53508 (2.68279s)]]\n[[mpq_rational][[*1] (0.142505s)][[*1] (0.161741s)][[*1] (0.200644s)][[*1] (0.28136s)]]\n]\n[table Operator /\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][12.0736 (31.794s)][10.0089 (80.7871s)][10.9267 (184.73s)][12.204 (436.471s)]]\n[[mpq_rational][[*1] (2.63335s)][[*1] (8.07149s)][[*1] (16.9064s)][[*1] (35.7647s)]]\n]\n[table Operator /(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][7.56092 (1.35276s)][10.5279 (2.12933s)][10.9509 (2.75885s)][12.166 (4.27228s)]]\n[[mpq_rational][[*1] (0.178914s)][[*1] (0.202255s)][[*1] (0.251928s)][[*1] (0.351164s)]]\n]\n[table Operator str\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][13.4013 (0.00980984s)][23.4372 (0.0288878s)][27.4314 (0.067039s)][29.4814 (0.165057s)]]\n[[mpq_rational][[*1] (0.000732008s)][[*1] (0.00123256s)][[*1] (0.00244388s)][[*1] (0.00559869s)]]\n]\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test-intel-linux.log",
    "content": "gmp_int        64        +    0.016582\ngmp_int        64        -    0.0174517\ngmp_int        64        *    0.0112253\ngmp_int        64        /    0.170951\ngmp_int        64        str  0.000343689\ngmp_int        64        +(int)0.00688382\ngmp_int        64        -(int)0.00734613\ngmp_int        64        *(int)0.00881438\ngmp_int        64        /(int)0.0465651\ngmp_int        64        %    0.164576\ngmp_int        64        |    0.0101555\ngmp_int        64        &    0.00955666\ngmp_int        64        ^    0.00987346\ngmp_int        64        <<   0.0106043\ngmp_int        64        >>   0.0093887\ngmp_int        64        %(int)0.0297463\ngmp_int        64        |(int)0.0403338\ngmp_int        64        &(int)0.0417288\ngmp_int        64        ^(int)0.0405779\ngmp_int        64        gcd  0.173816\ngmp_int        128       +    0.0183088\ngmp_int        128       -    0.0189266\ngmp_int        128       *    0.0161084\ngmp_int        128       /    0.191775\ngmp_int        128       str  0.000374699\ngmp_int        128       +(int)0.00866339\ngmp_int        128       -(int)0.0089443\ngmp_int        128       *(int)0.0114143\ngmp_int        128       /(int)0.0534638\ngmp_int        128       %    0.161212\ngmp_int        128       |    0.0107201\ngmp_int        128       &    0.0113559\ngmp_int        128       ^    0.0112116\ngmp_int        128       <<   0.0103295\ngmp_int        128       >>   0.00813413\ngmp_int        128       %(int)0.03692\ngmp_int        128       |(int)0.0412168\ngmp_int        128       &(int)0.0428359\ngmp_int        128       ^(int)0.0418522\ngmp_int        128       gcd  0.43131\ngmp_int        256       +    0.0224834\ngmp_int        256       -    0.025062\ngmp_int        256       *    0.0417471\ngmp_int        256       /    0.233656\ngmp_int        256       str  0.00059903\ngmp_int        256       +(int)0.0112071\ngmp_int        256       -(int)0.0116302\ngmp_int        256       *(int)0.0137181\ngmp_int        256       /(int)0.0667669\ngmp_int        256       %    0.191884\ngmp_int        256       |    0.0129489\ngmp_int        256       &    0.012778\ngmp_int        256       ^    0.0134548\ngmp_int        256       <<   0.0121471\ngmp_int        256       >>   0.00832878\ngmp_int        256       %(int)0.0474363\ngmp_int        256       |(int)0.0425591\ngmp_int        256       &(int)0.0436742\ngmp_int        256       ^(int)0.0425636\ngmp_int        256       gcd  2.06855\ngmp_int        512       +    0.0277439\ngmp_int        512       -    0.0318874\ngmp_int        512       *    0.0991032\ngmp_int        512       /    0.274993\ngmp_int        512       str  0.00129458\ngmp_int        512       +(int)0.014283\ngmp_int        512       -(int)0.0149874\ngmp_int        512       *(int)0.0180512\ngmp_int        512       /(int)0.0906691\ngmp_int        512       %    0.222477\ngmp_int        512       |    0.0217103\ngmp_int        512       &    0.0165285\ngmp_int        512       ^    0.0208848\ngmp_int        512       <<   0.014839\ngmp_int        512       >>   0.00988994\ngmp_int        512       %(int)0.0605682\ngmp_int        512       |(int)0.0462909\ngmp_int        512       &(int)0.046599\ngmp_int        512       ^(int)0.0456608\ngmp_int        512       gcd  4.68499\ngmp_int        1024      +    0.0397479\ngmp_int        1024      -    0.042232\ngmp_int        1024      *    0.31703\ngmp_int        1024      /    0.345984\ngmp_int        1024      str  0.00271592\ngmp_int        1024      +(int)0.0189969\ngmp_int        1024      -(int)0.0195046\ngmp_int        1024      *(int)0.0260306\ngmp_int        1024      /(int)0.140151\ngmp_int        1024      %    0.286399\ngmp_int        1024      |    0.0261953\ngmp_int        1024      &    0.023083\ngmp_int        1024      ^    0.0248084\ngmp_int        1024      <<   0.0202635\ngmp_int        1024      >>   0.0127909\ngmp_int        1024      %(int)0.0761102\ngmp_int        1024      |(int)0.049175\ngmp_int        1024      &(int)0.0499195\ngmp_int        1024      ^(int)0.0487102\ngmp_int        1024      gcd  10.1127\ncpp_int        64        +    0.0152915\ncpp_int        64        -    0.0191821\ncpp_int        64        *    0.0326218\ncpp_int        64        /    0.0951094\ncpp_int        64        str  0.000428547\ncpp_int        64        +(int)0.0132027\ncpp_int        64        -(int)0.0126144\ncpp_int        64        *(int)0.0151037\ncpp_int        64        /(int)0.0491116\ncpp_int        64        %    0.0951581\ncpp_int        64        |    0.0199629\ncpp_int        64        &    0.0196969\ncpp_int        64        ^    0.0208608\ncpp_int        64        <<   0.0179372\ncpp_int        64        >>   0.0146206\ncpp_int        64        %(int)0.0229261\ncpp_int        64        |(int)0.0185797\ncpp_int        64        &(int)0.0225055\ncpp_int        64        ^(int)0.0191337\ncpp_int        64        gcd  1.50205\ncpp_int        128       +    0.0170788\ncpp_int        128       -    0.0228373\ncpp_int        128       *    0.0375831\ncpp_int        128       /    0.163958\ncpp_int        128       str  0.000744647\ncpp_int        128       +(int)0.0144833\ncpp_int        128       -(int)0.013922\ncpp_int        128       *(int)0.0176402\ncpp_int        128       /(int)0.0972057\ncpp_int        128       %    0.169015\ncpp_int        128       |    0.0229631\ncpp_int        128       &    0.023126\ncpp_int        128       ^    0.0229278\ncpp_int        128       <<   0.0215749\ncpp_int        128       >>   0.0149198\ncpp_int        128       %(int)0.0476063\ncpp_int        128       |(int)0.0194697\ncpp_int        128       &(int)0.0270183\ncpp_int        128       ^(int)0.0194481\ncpp_int        128       gcd  3.36986\ncpp_int        256       +    0.0231877\ncpp_int        256       -    0.0293424\ncpp_int        256       *    0.113247\ncpp_int        256       /    0.336287\ncpp_int        256       str  0.00190436\ncpp_int        256       +(int)0.0161733\ncpp_int        256       -(int)0.0173225\ncpp_int        256       *(int)0.0199426\ncpp_int        256       /(int)0.229286\ncpp_int        256       %    0.306542\ncpp_int        256       |    0.0257191\ncpp_int        256       &    0.0254172\ncpp_int        256       ^    0.0259082\ncpp_int        256       <<   0.0253994\ncpp_int        256       >>   0.0172635\ncpp_int        256       %(int)0.116093\ncpp_int        256       |(int)0.0233559\ncpp_int        256       &(int)0.0367792\ncpp_int        256       ^(int)0.0232914\ncpp_int        256       gcd  7.88882\ncpp_int        512       +    0.0291058\ncpp_int        512       -    0.0380025\ncpp_int        512       *    0.337161\ncpp_int        512       /    0.487075\ncpp_int        512       str  0.00494162\ncpp_int        512       +(int)0.0201989\ncpp_int        512       -(int)0.0200688\ncpp_int        512       *(int)0.0311497\ncpp_int        512       /(int)0.375279\ncpp_int        512       %    0.459737\ncpp_int        512       |    0.0297101\ncpp_int        512       &    0.0297235\ncpp_int        512       ^    0.0296913\ncpp_int        512       <<   0.0328422\ncpp_int        512       >>   0.0234706\ncpp_int        512       %(int)0.194709\ncpp_int        512       |(int)0.0258992\ncpp_int        512       &(int)0.0529542\ncpp_int        512       ^(int)0.0258749\ncpp_int        512       gcd  19.7141\ncpp_int        1024      +    0.0410101\ncpp_int        1024      -    0.0576733\ncpp_int        1024      *    1.19319\ncpp_int        1024      /    0.850798\ncpp_int        1024      str  0.0149378\ncpp_int        1024      +(int)0.0222435\ncpp_int        1024      -(int)0.0219408\ncpp_int        1024      *(int)0.0435058\ncpp_int        1024      /(int)0.6795\ncpp_int        1024      %    0.800961\ncpp_int        1024      |    0.0369613\ncpp_int        1024      &    0.0368423\ncpp_int        1024      ^    0.0371252\ncpp_int        1024      <<   0.0474759\ncpp_int        1024      >>   0.0297527\ncpp_int        1024      %(int)0.360619\ncpp_int        1024      |(int)0.0326194\ncpp_int        1024      &(int)0.0801744\ncpp_int        1024      ^(int)0.0319848\ncpp_int        1024      gcd  53.3224\nfixed_int      64        +    0.00207275\nfixed_int      64        -    0.00214524\nfixed_int      64        *    0.00391097\nfixed_int      64        /    0.0608466\nfixed_int      64        str  0.000292286\nfixed_int      64        +(int)0.00357336\nfixed_int      64        -(int)0.00352796\nfixed_int      64        *(int)0.00292725\nfixed_int      64        /(int)0.0243018\nfixed_int      64        %    0.0603067\nfixed_int      64        |    0.00258063\nfixed_int      64        &    0.00257379\nfixed_int      64        ^    0.00258525\nfixed_int      64        <<   0.00134947\nfixed_int      64        >>   0.00560378\nfixed_int      64        %(int)0.0241499\nfixed_int      64        |(int)0.00201939\nfixed_int      64        &(int)0.00206716\nfixed_int      64        ^(int)0.00201848\nfixed_int      64        gcd  0.82127\nfixed_int      128       +    0.00325349\nfixed_int      128       -    0.00366953\nfixed_int      128       *    0.010445\nfixed_int      128       /    0.113697\nfixed_int      128       str  0.000564877\nfixed_int      128       +(int)0.00377625\nfixed_int      128       -(int)0.00360179\nfixed_int      128       *(int)0.00418426\nfixed_int      128       /(int)0.091141\nfixed_int      128       %    0.113804\nfixed_int      128       |    0.00360961\nfixed_int      128       &    0.00359913\nfixed_int      128       ^    0.00361317\nfixed_int      128       <<   0.0065905\nfixed_int      128       >>   0.00654308\nfixed_int      128       %(int)0.0809135\nfixed_int      128       |(int)0.00237125\nfixed_int      128       &(int)0.00231056\nfixed_int      128       ^(int)0.00190464\nfixed_int      128       gcd  2.05126\nfixed_int      256       +    0.00785776\nfixed_int      256       -    0.00635884\nfixed_int      256       *    0.0323875\nfixed_int      256       /    0.203194\nfixed_int      256       str  0.0013816\nfixed_int      256       +(int)0.00413397\nfixed_int      256       -(int)0.00379699\nfixed_int      256       *(int)0.00852456\nfixed_int      256       /(int)0.183053\nfixed_int      256       %    0.200368\nfixed_int      256       |    0.0105747\nfixed_int      256       &    0.0105856\nfixed_int      256       ^    0.0105755\nfixed_int      256       <<   0.00874545\nfixed_int      256       >>   0.00906624\nfixed_int      256       %(int)0.152826\nfixed_int      256       |(int)0.00261619\nfixed_int      256       &(int)0.00424202\nfixed_int      256       ^(int)0.00263274\nfixed_int      256       gcd  5.42715\nfixed_int      512       +    0.0131311\nfixed_int      512       -    0.0122513\nfixed_int      512       *    0.205979\nfixed_int      512       /    0.383601\nfixed_int      512       str  0.0043558\nfixed_int      512       +(int)0.00639746\nfixed_int      512       -(int)0.00641876\nfixed_int      512       *(int)0.0152369\nfixed_int      512       /(int)0.363289\nfixed_int      512       %    0.38201\nfixed_int      512       |    0.0131075\nfixed_int      512       &    0.0131292\nfixed_int      512       ^    0.01314\nfixed_int      512       <<   0.0130248\nfixed_int      512       >>   0.0131451\nfixed_int      512       %(int)0.304714\nfixed_int      512       |(int)0.00574368\nfixed_int      512       &(int)0.00810836\nfixed_int      512       ^(int)0.00576694\nfixed_int      512       gcd  16.6269\nfixed_int      1024      +    0.0322386\nfixed_int      1024      -    0.0312142\nfixed_int      1024      *    0.716002\nfixed_int      1024      /    0.728338\nfixed_int      1024      str  0.0135445\nfixed_int      1024      +(int)0.011986\nfixed_int      1024      -(int)0.0119838\nfixed_int      1024      *(int)0.0349878\nfixed_int      1024      /(int)0.708856\nfixed_int      1024      %    0.723622\nfixed_int      1024      |    0.0181468\nfixed_int      1024      &    0.0182648\nfixed_int      1024      ^    0.018185\nfixed_int      1024      <<   0.0252997\nfixed_int      1024      >>   0.0257832\nfixed_int      1024      %(int)0.597535\nfixed_int      1024      |(int)0.0116417\nfixed_int      1024      &(int)0.0172111\nfixed_int      1024      ^(int)0.011526\nfixed_int      1024      gcd  70.6396\n[section:integer_performance Integer Type Perfomance]\n[table Operator %\n[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][1.5779 (0.0951581s)][1.48514 (0.169015s)][1.59753 (0.306542s)][2.06645 (0.459737s)][2.79666 (0.800961s)]]\n[[fixed_int][[*1] (0.0603067s)][[*1] (0.113804s)][1.04421 (0.200368s)][1.71708 (0.38201s)][2.52662 (0.723622s)]]\n[[gmp_int][2.72898 (0.164576s)][1.41658 (0.161212s)][[*1] (0.191884s)][[*1] (0.222477s)][[*1] (0.286399s)]]\n]\n[table Operator %(int)\n[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][[*1] (0.0229261s)][1.28944 (0.0476063s)][2.44735 (0.116093s)][3.21471 (0.194709s)][4.73812 (0.360619s)]]\n[[fixed_int][1.05338 (0.0241499s)][2.19159 (0.0809135s)][3.22171 (0.152826s)][5.03092 (0.304714s)][7.85093 (0.597535s)]]\n[[gmp_int][1.29749 (0.0297463s)][[*1] (0.03692s)][[*1] (0.0474363s)][[*1] (0.0605682s)][[*1] (0.0761102s)]]\n]\n[table Operator &\n[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][7.65289 (0.0196969s)][6.42545 (0.023126s)][2.4011 (0.0254172s)][2.26393 (0.0297235s)][2.01712 (0.0368423s)]]\n[[fixed_int][[*1] (0.00257379s)][[*1] (0.00359913s)][[*1] (0.0105856s)][[*1] (0.0131292s)][[*1] (0.0182648s)]]\n[[gmp_int][3.71307 (0.00955666s)][3.15518 (0.0113559s)][1.2071 (0.012778s)][1.25891 (0.0165285s)][1.2638 (0.023083s)]]\n]\n[table Operator &(int)\n[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][10.8871 (0.0225055s)][11.6934 (0.0270183s)][8.67021 (0.0367792s)][6.53082 (0.0529542s)][4.65829 (0.0801744s)]]\n[[fixed_int][[*1] (0.00206716s)][[*1] (0.00231056s)][[*1] (0.00424202s)][[*1] (0.00810836s)][[*1] (0.0172111s)]]\n[[gmp_int][20.1865 (0.0417288s)][18.5392 (0.0428359s)][10.2956 (0.0436742s)][5.74703 (0.046599s)][2.90042 (0.0499195s)]]\n]\n[table Operator *\n[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][8.34111 (0.0326218s)][3.59818 (0.0375831s)][3.49662 (0.113247s)][3.40211 (0.337161s)][3.76364 (1.19319s)]]\n[[fixed_int][[*1] (0.00391097s)][[*1] (0.010445s)][[*1] (0.0323875s)][2.07843 (0.205979s)][2.25847 (0.716002s)]]\n[[gmp_int][2.87022 (0.0112253s)][1.54221 (0.0161084s)][1.28899 (0.0417471s)][[*1] (0.0991032s)][[*1] (0.31703s)]]\n]\n[table Operator *(int)\n[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][5.15967 (0.0151037s)][4.21584 (0.0176402s)][2.33943 (0.0199426s)][2.04436 (0.0311497s)][1.67133 (0.0435058s)]]\n[[fixed_int][[*1] (0.00292725s)][[*1] (0.00418426s)][[*1] (0.00852456s)][[*1] (0.0152369s)][1.3441 (0.0349878s)]]\n[[gmp_int][3.01114 (0.00881438s)][2.72791 (0.0114143s)][1.60924 (0.0137181s)][1.1847 (0.0180512s)][[*1] (0.0260306s)]]\n]\n[table Operator +\n[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][7.37741 (0.0152915s)][5.2494 (0.0170788s)][2.95092 (0.0231877s)][2.21655 (0.0291058s)][1.27208 (0.0410101s)]]\n[[fixed_int][[*1] (0.00207275s)][[*1] (0.00325349s)][[*1] (0.00785776s)][[*1] (0.0131311s)][[*1] (0.0322386s)]]\n[[gmp_int][7.99998 (0.016582s)][5.62745 (0.0183088s)][2.86129 (0.0224834s)][2.11283 (0.0277439s)][1.23293 (0.0397479s)]]\n]\n[table Operator +(int)\n[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][3.69474 (0.0132027s)][3.83536 (0.0144833s)][3.91229 (0.0161733s)][3.15733 (0.0201989s)][1.85579 (0.0222435s)]]\n[[fixed_int][[*1] (0.00357336s)][[*1] (0.00377625s)][[*1] (0.00413397s)][[*1] (0.00639746s)][[*1] (0.011986s)]]\n[[gmp_int][1.92643 (0.00688382s)][2.29418 (0.00866339s)][2.71097 (0.0112071s)][2.23261 (0.014283s)][1.58492 (0.0189969s)]]\n]\n[table Operator -\n[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][8.94166 (0.0191821s)][6.22351 (0.0228373s)][4.61443 (0.0293424s)][3.10192 (0.0380025s)][1.84766 (0.0576733s)]]\n[[fixed_int][[*1] (0.00214524s)][[*1] (0.00366953s)][[*1] (0.00635884s)][[*1] (0.0122513s)][[*1] (0.0312142s)]]\n[[gmp_int][8.13505 (0.0174517s)][5.15777 (0.0189266s)][3.94128 (0.025062s)][2.60278 (0.0318874s)][1.35297 (0.042232s)]]\n]\n[table Operator -(int)\n[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][3.57555 (0.0126144s)][3.86529 (0.013922s)][4.56215 (0.0173225s)][3.12658 (0.0200688s)][1.83087 (0.0219408s)]]\n[[fixed_int][[*1] (0.00352796s)][[*1] (0.00360179s)][[*1] (0.00379699s)][[*1] (0.00641876s)][[*1] (0.0119838s)]]\n[[gmp_int][2.08226 (0.00734613s)][2.4833 (0.0089443s)][3.063 (0.0116302s)][2.33493 (0.0149874s)][1.62759 (0.0195046s)]]\n]\n[table Operator /\n[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][1.5631 (0.0951094s)][1.44205 (0.163958s)][1.655 (0.336287s)][1.77123 (0.487075s)][2.45907 (0.850798s)]]\n[[fixed_int][[*1] (0.0608466s)][[*1] (0.113697s)][[*1] (0.203194s)][1.39495 (0.383601s)][2.10512 (0.728338s)]]\n[[gmp_int][2.80954 (0.170951s)][1.68671 (0.191775s)][1.14992 (0.233656s)][[*1] (0.274993s)][[*1] (0.345984s)]]\n]\n[table Operator /(int)\n[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][2.0209 (0.0491116s)][1.81816 (0.0972057s)][3.43412 (0.229286s)][4.13899 (0.375279s)][4.84836 (0.6795s)]]\n[[fixed_int][[*1] (0.0243018s)][1.70472 (0.091141s)][2.74167 (0.183053s)][4.00675 (0.363289s)][5.05782 (0.708856s)]]\n[[gmp_int][1.91611 (0.0465651s)][[*1] (0.0534638s)][[*1] (0.0667669s)][[*1] (0.0906691s)][[*1] (0.140151s)]]\n]\n[table Operator <<\n[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][13.292 (0.0179372s)][3.27363 (0.0215749s)][2.9043 (0.0253994s)][2.52151 (0.0328422s)][2.34293 (0.0474759s)]]\n[[fixed_int][[*1] (0.00134947s)][[*1] (0.0065905s)][[*1] (0.00874545s)][[*1] (0.0130248s)][1.24854 (0.0252997s)]]\n[[gmp_int][7.85814 (0.0106043s)][1.56732 (0.0103295s)][1.38897 (0.0121471s)][1.13928 (0.014839s)][[*1] (0.0202635s)]]\n]\n[table Operator >>\n[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][2.60907 (0.0146206s)][2.28025 (0.0149198s)][2.07275 (0.0172635s)][2.37318 (0.0234706s)][2.32609 (0.0297527s)]]\n[[fixed_int][[*1] (0.00560378s)][[*1] (0.00654308s)][1.08854 (0.00906624s)][1.32914 (0.0131451s)][2.01575 (0.0257832s)]]\n[[gmp_int][1.67542 (0.0093887s)][1.24317 (0.00813413s)][[*1] (0.00832878s)][[*1] (0.00988994s)][[*1] (0.0127909s)]]\n]\n[table Operator ^\n[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][8.06918 (0.0208608s)][6.34562 (0.0229278s)][2.44983 (0.0259082s)][2.25961 (0.0296913s)][2.04153 (0.0371252s)]]\n[[fixed_int][[*1] (0.00258525s)][[*1] (0.00361317s)][[*1] (0.0105755s)][[*1] (0.01314s)][[*1] (0.018185s)]]\n[[gmp_int][3.81916 (0.00987346s)][3.10299 (0.0112116s)][1.27226 (0.0134548s)][1.5894 (0.0208848s)][1.36422 (0.0248084s)]]\n]\n[table Operator ^(int)\n[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][9.47925 (0.0191337s)][10.2109 (0.0194481s)][8.84686 (0.0232914s)][4.48677 (0.0258749s)][2.775 (0.0319848s)]]\n[[fixed_int][[*1] (0.00201848s)][[*1] (0.00190464s)][[*1] (0.00263274s)][[*1] (0.00576694s)][[*1] (0.011526s)]]\n[[gmp_int][20.1032 (0.0405779s)][21.9738 (0.0418522s)][16.1671 (0.0425636s)][7.91768 (0.0456608s)][4.2261 (0.0487102s)]]\n]\n[table Operator gcd\n[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][8.64165 (1.50205s)][7.81307 (3.36986s)][3.81369 (7.88882s)][4.20792 (19.7141s)][5.27284 (53.3224s)]]\n[[fixed_int][4.72495 (0.82127s)][4.75589 (2.05126s)][2.62364 (5.42715s)][3.54898 (16.6269s)][6.98527 (70.6396s)]]\n[[gmp_int][[*1] (0.173816s)][[*1] (0.43131s)][[*1] (2.06855s)][[*1] (4.68499s)][[*1] (10.1127s)]]\n]\n[table Operator str\n[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][1.46619 (0.000428547s)][1.98732 (0.000744647s)][3.17907 (0.00190436s)][3.81717 (0.00494162s)][5.50009 (0.0149378s)]]\n[[fixed_int][[*1] (0.000292286s)][1.50755 (0.000564877s)][2.30639 (0.0013816s)][3.36465 (0.0043558s)][4.98706 (0.0135445s)]]\n[[gmp_int][1.17587 (0.000343689s)][[*1] (0.000374699s)][[*1] (0.00059903s)][[*1] (0.00129458s)][[*1] (0.00271592s)]]\n]\n[table Operator |\n[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][7.73565 (0.0199629s)][6.36166 (0.0229631s)][2.43214 (0.0257191s)][2.26665 (0.0297101s)][2.0368 (0.0369613s)]]\n[[fixed_int][[*1] (0.00258063s)][[*1] (0.00360961s)][[*1] (0.0105747s)][[*1] (0.0131075s)][[*1] (0.0181468s)]]\n[[gmp_int][3.9353 (0.0101555s)][2.96987 (0.0107201s)][1.22452 (0.0129489s)][1.65632 (0.0217103s)][1.44352 (0.0261953s)]]\n]\n[table Operator |(int)\n[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][9.20066 (0.0185797s)][8.21071 (0.0194697s)][8.92746 (0.0233559s)][4.50916 (0.0258992s)][2.80194 (0.0326194s)]]\n[[fixed_int][[*1] (0.00201939s)][[*1] (0.00237125s)][[*1] (0.00261619s)][[*1] (0.00574368s)][[*1] (0.0116417s)]]\n[[gmp_int][19.9733 (0.0403338s)][17.3819 (0.0412168s)][16.2676 (0.0425591s)][8.05945 (0.0462909s)][4.22404 (0.049175s)]]\n]\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test-msvc-10.log",
    "content": "gmp_float      50        +    0.110988\ngmp_float      50        -    0.119898\ngmp_float      50        *    0.275044\ngmp_float      50        /    1.27708\ngmp_float      50        str  0.013276\ngmp_float      50        +(int)0.0330888\ngmp_float      50        -(int)0.134451\ngmp_float      50        *(int)0.0422135\ngmp_float      50        /(int)0.180393\ngmp_float      50        construct0.19737\ngmp_float      50        construct(unsigned)0.208078\ngmp_float      50        construct(unsigned long long)0.520025\ngmp_float      50        +    0.498089\ngmp_float      50        -    0.502235\ngmp_float      50        *    0.564768\ngmp_float      50        /    0.90324\ngmp_float      50        +    0.477999\ngmp_float      50        -    0.499682\ngmp_float      50        *    0.551747\ngmp_float      50        /    0.893752\ngmp_float      100       +    0.111217\ngmp_float      100       -    0.120498\ngmp_float      100       *    0.416175\ngmp_float      100       /    1.69515\ngmp_float      100       str  0.0202949\ngmp_float      100       +(int)0.0386882\ngmp_float      100       -(int)0.1351\ngmp_float      100       *(int)0.0493716\ngmp_float      100       /(int)0.23378\ngmp_float      100       construct0.196599\ngmp_float      100       construct(unsigned)0.207062\ngmp_float      100       construct(unsigned long long)0.51936\ngmp_float      100       +    0.517172\ngmp_float      100       -    0.509588\ngmp_float      100       *    0.575954\ngmp_float      100       /    1.04262\ngmp_float      100       +    0.476701\ngmp_float      100       -    0.503546\ngmp_float      100       *    0.564962\ngmp_float      100       /    1.03328\ngmp_float      500       +    0.15445\ngmp_float      500       -    0.164099\ngmp_float      500       *    3.32799\ngmp_float      500       /    8.12655\ngmp_float      500       str  0.141162\ngmp_float      500       +(int)0.0646201\ngmp_float      500       -(int)0.176876\ngmp_float      500       *(int)0.0857876\ngmp_float      500       /(int)0.710204\ngmp_float      500       construct0.206063\ngmp_float      500       construct(unsigned)0.217019\ngmp_float      500       construct(unsigned long long)0.538021\ngmp_float      500       +    0.552532\ngmp_float      500       -    0.555754\ngmp_float      500       *    0.717186\ngmp_float      500       /    2.24686\ngmp_float      500       +    0.490614\ngmp_float      500       -    0.547751\ngmp_float      500       *    0.700957\ngmp_float      500       /    2.24146\ngmp_int        128       +    0.0421662\ngmp_int        128       -    0.0411848\ngmp_int        128       *    0.0708996\ngmp_int        128       /    0.868916\ngmp_int        128       str  0.00185638\ngmp_int        128       +(int)0.0311237\ngmp_int        128       -(int)0.030585\ngmp_int        128       *(int)0.022756\ngmp_int        128       /(int)0.0560401\ngmp_int        128       construct0.196182\ngmp_int        128       construct(unsigned)0.206113\ngmp_int        128       construct(unsigned long long)0.719741\ngmp_int        128       %    0.64148\ngmp_int        128       |    0.0474678\ngmp_int        128       &    0.0538128\ngmp_int        128       ^    0.0497194\ngmp_int        128       <<   0.0273994\ngmp_int        128       >>   0.0288237\ngmp_int        128       %(int)0.0572117\ngmp_int        128       |(int)0.141119\ngmp_int        128       &(int)0.141306\ngmp_int        128       ^(int)0.143934\ngmp_int        128       gcd  2.45095\ngmp_int        128       +    0.71217\ngmp_int        128       -    0.687129\ngmp_int        128       *    0.716479\ngmp_int        128       /    1.04926\ngmp_int        128       +    0.68136\ngmp_int        128       -    0.681187\ngmp_int        128       *    3.1627\ngmp_int        128       /    0.685487\ngmp_int        256       +    0.0449584\ngmp_int        256       -    0.0461316\ngmp_int        256       *    0.134302\ngmp_int        256       /    0.951505\ngmp_int        256       str  0.00344576\ngmp_int        256       +(int)0.0428011\ngmp_int        256       -(int)0.0400434\ngmp_int        256       *(int)0.0282672\ngmp_int        256       /(int)0.0982823\ngmp_int        256       construct0.201199\ngmp_int        256       construct(unsigned)0.211295\ngmp_int        256       construct(unsigned long long)0.729487\ngmp_int        256       %    0.703592\ngmp_int        256       |    0.0618281\ngmp_int        256       &    0.0652169\ngmp_int        256       ^    0.0630174\ngmp_int        256       <<   0.031973\ngmp_int        256       >>   0.0310184\ngmp_int        256       %(int)0.10258\ngmp_int        256       |(int)0.142987\ngmp_int        256       &(int)0.139398\ngmp_int        256       ^(int)0.144825\ngmp_int        256       gcd  5.89505\ngmp_int        256       +    0.728978\ngmp_int        256       -    0.707806\ngmp_int        256       *    0.731454\ngmp_int        256       /    1.17203\ngmp_int        256       +    0.68929\ngmp_int        256       -    0.683532\ngmp_int        256       *    3.15114\ngmp_int        256       /    0.689516\ngmp_int        512       +    0.0522202\ngmp_int        512       -    0.0567637\ngmp_int        512       *    0.532277\ngmp_int        512       /    1.06442\ngmp_int        512       str  0.00618403\ngmp_int        512       +(int)0.0665539\ngmp_int        512       -(int)0.0578194\ngmp_int        512       *(int)0.0361075\ngmp_int        512       /(int)0.183564\ngmp_int        512       construct0.19783\ngmp_int        512       construct(unsigned)0.206944\ngmp_int        512       construct(unsigned long long)0.724649\ngmp_int        512       %    0.819828\ngmp_int        512       |    0.0856626\ngmp_int        512       &    0.092104\ngmp_int        512       ^    0.0869819\ngmp_int        512       <<   0.0471709\ngmp_int        512       >>   0.0337511\ngmp_int        512       %(int)0.188529\ngmp_int        512       |(int)0.155656\ngmp_int        512       &(int)0.142498\ngmp_int        512       ^(int)0.152773\ngmp_int        512       gcd  13.6993\ngmp_int        512       +    0.759532\ngmp_int        512       -    0.732529\ngmp_int        512       *    0.779921\ngmp_int        512       /    1.39149\ngmp_int        512       +    0.694235\ngmp_int        512       -    0.69246\ngmp_int        512       *    3.17094\ngmp_int        512       /    0.688995\ngmp_int        1024      +    0.0699873\ngmp_int        1024      -    0.0731244\ngmp_int        1024      *    1.57852\ngmp_int        1024      /    1.30215\ngmp_int        1024      str  0.0144523\ngmp_int        1024      +(int)0.108272\ngmp_int        1024      -(int)0.100541\ngmp_int        1024      *(int)0.0518882\ngmp_int        1024      /(int)0.352238\ngmp_int        1024      construct0.19744\ngmp_int        1024      construct(unsigned)0.216229\ngmp_int        1024      construct(unsigned long long)0.722262\ngmp_int        1024      %    1.01959\ngmp_int        1024      |    0.136082\ngmp_int        1024      &    0.144412\ngmp_int        1024      ^    0.139109\ngmp_int        1024      <<   0.0721984\ngmp_int        1024      >>   0.0388038\ngmp_int        1024      %(int)0.355222\ngmp_int        1024      |(int)0.163236\ngmp_int        1024      &(int)0.141249\ngmp_int        1024      ^(int)0.161662\ngmp_int        1024      gcd  33.2232\ngmp_int        1024      +    0.83035\ngmp_int        1024      -    0.78115\ngmp_int        1024      *    0.815503\ngmp_int        1024      /    1.84054\ngmp_int        1024      +    0.690013\ngmp_int        1024      -    0.690838\ngmp_int        1024      *    3.20893\ngmp_int        1024      /    0.707578\ncpp_int(unsigned, fixed)64        +    0.00232166\ncpp_int(unsigned, fixed)64        -    0.00234506\ncpp_int(unsigned, fixed)64        *    0.00470304\ncpp_int(unsigned, fixed)64        /    0.0714786\ncpp_int(unsigned, fixed)64        str  0.00256457\ncpp_int(unsigned, fixed)64        +(int)0.00162053\ncpp_int(unsigned, fixed)64        -(int)0.00163617\ncpp_int(unsigned, fixed)64        *(int)0.00236511\ncpp_int(unsigned, fixed)64        /(int)0.0299559\ncpp_int(unsigned, fixed)64        construct0.00111299\ncpp_int(unsigned, fixed)64        construct(unsigned)0.00110489\ncpp_int(unsigned, fixed)64        construct(unsigned long long)0.00240876\ncpp_int(unsigned, fixed)64        %    0.0702826\ncpp_int(unsigned, fixed)64        |    0.00265921\ncpp_int(unsigned, fixed)64        &    0.00261653\ncpp_int(unsigned, fixed)64        ^    0.0040003\ncpp_int(unsigned, fixed)64        <<   0.00161592\ncpp_int(unsigned, fixed)64        >>   0.00161599\ncpp_int(unsigned, fixed)64        %(int)0.0298064\ncpp_int(unsigned, fixed)64        |(int)0.00165538\ncpp_int(unsigned, fixed)64        &(int)0.00161431\ncpp_int(unsigned, fixed)64        ^(int)0.00184507\ncpp_int(unsigned, fixed)64        gcd  0.602722\ncpp_int(unsigned, fixed)64        +    0.00253726\ncpp_int(unsigned, fixed)64        -    0.00301519\ncpp_int(unsigned, fixed)64        *    0.00474872\ncpp_int(unsigned, fixed)64        /    0.0450108\ncpp_int(unsigned, fixed)64        +    0.0020173\ncpp_int(unsigned, fixed)64        -    0.00191079\ncpp_int(unsigned, fixed)64        *    0.00445077\ncpp_int(unsigned, fixed)64        /    0.0294528\ncpp_int(fixed) 64        +    0.00573474\ncpp_int(fixed) 64        -    0.0096272\ncpp_int(fixed) 64        *    0.00897607\ncpp_int(fixed) 64        /    0.0783882\ncpp_int(fixed) 64        str  0.00251659\ncpp_int(fixed) 64        +(int)0.00636247\ncpp_int(fixed) 64        -(int)0.00668367\ncpp_int(fixed) 64        *(int)0.00548722\ncpp_int(fixed) 64        /(int)0.0362985\ncpp_int(fixed) 64        construct0.00161745\ncpp_int(fixed) 64        construct(unsigned)0.00209147\ncpp_int(fixed) 64        construct(unsigned long long)0.00204998\ncpp_int(fixed) 64        %    0.0777437\ncpp_int(fixed) 64        |    0.0108982\ncpp_int(fixed) 64        &    0.0124165\ncpp_int(fixed) 64        ^    0.0110313\ncpp_int(fixed) 64        <<   0.00516511\ncpp_int(fixed) 64        >>   0.00399499\ncpp_int(fixed) 64        %(int)0.0341425\ncpp_int(fixed) 64        |(int)0.0111002\ncpp_int(fixed) 64        &(int)0.0104782\ncpp_int(fixed) 64        ^(int)0.0107199\ncpp_int(fixed) 64        gcd  0.604291\ncpp_int(fixed) 64        +    0.00605482\ncpp_int(fixed) 64        -    0.00714372\ncpp_int(fixed) 64        *    0.00873093\ncpp_int(fixed) 64        /    0.0510195\ncpp_int(fixed) 64        +    0.00430062\ncpp_int(fixed) 64        -    0.00387577\ncpp_int(fixed) 64        *    0.00567824\ncpp_int(fixed) 64        /    0.0320162\ncpp_int(fixed) 128       +    0.0358493\ncpp_int(fixed) 128       -    0.0397574\ncpp_int(fixed) 128       *    0.0672363\ncpp_int(fixed) 128       /    0.222933\ncpp_int(fixed) 128       str  0.0015613\ncpp_int(fixed) 128       +(int)0.0268311\ncpp_int(fixed) 128       -(int)0.0241848\ncpp_int(fixed) 128       *(int)0.0328109\ncpp_int(fixed) 128       /(int)0.137619\ncpp_int(fixed) 128       construct0.00164665\ncpp_int(fixed) 128       construct(unsigned)0.0015986\ncpp_int(fixed) 128       construct(unsigned long long)0.00312994\ncpp_int(fixed) 128       %    0.1971\ncpp_int(fixed) 128       |    0.0380136\ncpp_int(fixed) 128       &    0.0341411\ncpp_int(fixed) 128       ^    0.0351059\ncpp_int(fixed) 128       <<   0.0320915\ncpp_int(fixed) 128       >>   0.0293055\ncpp_int(fixed) 128       %(int)0.103684\ncpp_int(fixed) 128       |(int)0.0317854\ncpp_int(fixed) 128       &(int)0.0417383\ncpp_int(fixed) 128       ^(int)0.0312355\ncpp_int(fixed) 128       gcd  4.18006\ncpp_int(fixed) 128       +    0.0341301\ncpp_int(fixed) 128       -    0.0346952\ncpp_int(fixed) 128       *    0.0675308\ncpp_int(fixed) 128       /    0.466907\ncpp_int(fixed) 128       +    0.0168342\ncpp_int(fixed) 128       -    0.0169449\ncpp_int(fixed) 128       *    0.0673436\ncpp_int(fixed) 128       /    0.0327432\ncpp_int(fixed) 256       +    0.0552275\ncpp_int(fixed) 256       -    0.0560103\ncpp_int(fixed) 256       *    0.166666\ncpp_int(fixed) 256       /    0.349956\ncpp_int(fixed) 256       str  0.00297279\ncpp_int(fixed) 256       +(int)0.0410749\ncpp_int(fixed) 256       -(int)0.0368306\ncpp_int(fixed) 256       *(int)0.049867\ncpp_int(fixed) 256       /(int)0.253796\ncpp_int(fixed) 256       construct0.00363363\ncpp_int(fixed) 256       construct(unsigned)0.00370466\ncpp_int(fixed) 256       construct(unsigned long long)0.00388115\ncpp_int(fixed) 256       %    0.334027\ncpp_int(fixed) 256       |    0.0529581\ncpp_int(fixed) 256       &    0.0501131\ncpp_int(fixed) 256       ^    0.0530521\ncpp_int(fixed) 256       <<   0.0507053\ncpp_int(fixed) 256       >>   0.039006\ncpp_int(fixed) 256       %(int)0.200647\ncpp_int(fixed) 256       |(int)0.0466958\ncpp_int(fixed) 256       &(int)0.0539427\ncpp_int(fixed) 256       ^(int)0.0476923\ncpp_int(fixed) 256       gcd  10.2671\ncpp_int(fixed) 256       +    0.0452762\ncpp_int(fixed) 256       -    0.0444216\ncpp_int(fixed) 256       *    0.112885\ncpp_int(fixed) 256       /    1.36886\ncpp_int(fixed) 256       +    0.0170491\ncpp_int(fixed) 256       -    0.0176783\ncpp_int(fixed) 256       *    0.107306\ncpp_int(fixed) 256       /    0.0340708\ncpp_int(fixed) 512       +    0.0760722\ncpp_int(fixed) 512       -    0.0756027\ncpp_int(fixed) 512       *    0.500399\ncpp_int(fixed) 512       /    0.560837\ncpp_int(fixed) 512       str  0.00708386\ncpp_int(fixed) 512       +(int)0.0524416\ncpp_int(fixed) 512       -(int)0.0503396\ncpp_int(fixed) 512       *(int)0.0658566\ncpp_int(fixed) 512       /(int)0.446782\ncpp_int(fixed) 512       construct0.00576526\ncpp_int(fixed) 512       construct(unsigned)0.0058189\ncpp_int(fixed) 512       construct(unsigned long long)0.00556537\ncpp_int(fixed) 512       %    0.539708\ncpp_int(fixed) 512       |    0.0676884\ncpp_int(fixed) 512       &    0.0588367\ncpp_int(fixed) 512       ^    0.0695132\ncpp_int(fixed) 512       <<   0.0597514\ncpp_int(fixed) 512       >>   0.0515714\ncpp_int(fixed) 512       %(int)0.377704\ncpp_int(fixed) 512       |(int)0.0536974\ncpp_int(fixed) 512       &(int)0.070425\ncpp_int(fixed) 512       ^(int)0.0540962\ncpp_int(fixed) 512       gcd  26.2762\ncpp_int(fixed) 512       +    0.0571069\ncpp_int(fixed) 512       -    0.0563175\ncpp_int(fixed) 512       *    0.177444\ncpp_int(fixed) 512       /    3.1662\ncpp_int(fixed) 512       +    0.0172628\ncpp_int(fixed) 512       -    0.0180756\ncpp_int(fixed) 512       *    0.171821\ncpp_int(fixed) 512       /    0.0444905\ncpp_int(fixed) 1024      +    0.121124\ncpp_int(fixed) 1024      -    0.114246\ncpp_int(fixed) 1024      *    1.54633\ncpp_int(fixed) 1024      /    0.975643\ncpp_int(fixed) 1024      str  0.0172514\ncpp_int(fixed) 1024      +(int)0.0728817\ncpp_int(fixed) 1024      -(int)0.0621059\ncpp_int(fixed) 1024      *(int)0.0948565\ncpp_int(fixed) 1024      /(int)0.84764\ncpp_int(fixed) 1024      construct0.00535599\ncpp_int(fixed) 1024      construct(unsigned)0.00836042\ncpp_int(fixed) 1024      construct(unsigned long long)0.00577713\ncpp_int(fixed) 1024      %    0.94847\ncpp_int(fixed) 1024      |    0.100936\ncpp_int(fixed) 1024      &    0.0774574\ncpp_int(fixed) 1024      ^    0.09783\ncpp_int(fixed) 1024      <<   0.0677088\ncpp_int(fixed) 1024      >>   0.0626121\ncpp_int(fixed) 1024      %(int)0.743202\ncpp_int(fixed) 1024      |(int)0.0819107\ncpp_int(fixed) 1024      &(int)0.112823\ncpp_int(fixed) 1024      ^(int)0.0806317\ncpp_int(fixed) 1024      gcd  76.2849\ncpp_int(fixed) 1024      +    0.0636724\ncpp_int(fixed) 1024      -    0.06467\ncpp_int(fixed) 1024      *    0.303514\ncpp_int(fixed) 1024      /    8.04418\ncpp_int(fixed) 1024      +    0.0181245\ncpp_int(fixed) 1024      -    0.0190581\ncpp_int(fixed) 1024      *    0.299236\ncpp_int(fixed) 1024      /    0.106788\ncpp_int        128       +    0.0273725\ncpp_int        128       -    0.0303219\ncpp_int        128       *    0.0774619\ncpp_int        128       /    0.589941\ncpp_int        128       str  0.00189808\ncpp_int        128       +(int)0.0159069\ncpp_int        128       -(int)0.0151244\ncpp_int        128       *(int)0.0235876\ncpp_int        128       /(int)0.235955\ncpp_int        128       construct0.00293927\ncpp_int        128       construct(unsigned)0.00270684\ncpp_int        128       construct(unsigned long long)0.00719854\ncpp_int        128       %    0.37333\ncpp_int        128       |    0.030991\ncpp_int        128       &    0.031605\ncpp_int        128       ^    0.0318172\ncpp_int        128       <<   0.0256107\ncpp_int        128       >>   0.0237523\ncpp_int        128       %(int)0.104856\ncpp_int        128       |(int)0.0280516\ncpp_int        128       &(int)0.0377678\ncpp_int        128       ^(int)0.0283305\ncpp_int        128       gcd  4.98644\ncpp_int        128       +    0.0283071\ncpp_int        128       -    0.027289\ncpp_int        128       *    0.0584001\ncpp_int        128       /    0.733741\ncpp_int        128       +    0.0196594\ncpp_int        128       -    0.0210968\ncpp_int        128       *    7.6372\ncpp_int        128       /    0.0578293\ncpp_int        256       +    0.0384835\ncpp_int        256       -    0.0402028\ncpp_int        256       *    0.211395\ncpp_int        256       /    0.708882\ncpp_int        256       str  0.00391656\ncpp_int        256       +(int)0.0218386\ncpp_int        256       -(int)0.017199\ncpp_int        256       *(int)0.0318939\ncpp_int        256       /(int)0.35212\ncpp_int        256       construct0.00277479\ncpp_int        256       construct(unsigned)0.0030529\ncpp_int        256       construct(unsigned long long)0.00725455\ncpp_int        256       %    0.673748\ncpp_int        256       |    0.0429658\ncpp_int        256       &    0.0455929\ncpp_int        256       ^    0.0425243\ncpp_int        256       <<   0.0401135\ncpp_int        256       >>   0.0302534\ncpp_int        256       %(int)0.203012\ncpp_int        256       |(int)0.0363929\ncpp_int        256       &(int)0.0471524\ncpp_int        256       ^(int)0.0353555\ncpp_int        256       gcd  11.1816\ncpp_int        256       +    0.030223\ncpp_int        256       -    0.0319489\ncpp_int        256       *    0.0885733\ncpp_int        256       /    1.62706\ncpp_int        256       +    0.0215291\ncpp_int        256       -    0.0213343\ncpp_int        256       *    7.7121\ncpp_int        256       /    0.0615507\ncpp_int        512       +    0.0561351\ncpp_int        512       -    0.0543342\ncpp_int        512       *    0.703234\ncpp_int        512       /    0.924042\ncpp_int        512       str  0.00832019\ncpp_int        512       +(int)0.0316584\ncpp_int        512       -(int)0.0248084\ncpp_int        512       *(int)0.0427792\ncpp_int        512       /(int)0.568032\ncpp_int        512       construct0.0028102\ncpp_int        512       construct(unsigned)0.00288857\ncpp_int        512       construct(unsigned long long)0.00723891\ncpp_int        512       %    0.701584\ncpp_int        512       |    0.0537846\ncpp_int        512       &    0.0546439\ncpp_int        512       ^    0.0542436\ncpp_int        512       <<   0.0436188\ncpp_int        512       >>   0.0355247\ncpp_int        512       %(int)0.391566\ncpp_int        512       |(int)0.0418143\ncpp_int        512       &(int)0.0647085\ncpp_int        512       ^(int)0.041758\ncpp_int        512       gcd  27.2257\ncpp_int        512       +    0.0382495\ncpp_int        512       -    0.0386744\ncpp_int        512       *    0.14417\ncpp_int        512       /    3.61202\ncpp_int        512       +    0.0228565\ncpp_int        512       -    0.0222868\ncpp_int        512       *    7.72815\ncpp_int        512       /    0.0732298\ncpp_int        1024      +    0.0928746\ncpp_int        1024      -    0.0853837\ncpp_int        1024      *    2.6591\ncpp_int        1024      /    1.38142\ncpp_int        1024      str  0.0221599\ncpp_int        1024      +(int)0.0430289\ncpp_int        1024      -(int)0.0331224\ncpp_int        1024      *(int)0.0668616\ncpp_int        1024      /(int)0.989885\ncpp_int        1024      construct0.00277298\ncpp_int        1024      construct(unsigned)0.00265201\ncpp_int        1024      construct(unsigned long long)0.00732796\ncpp_int        1024      %    1.14369\ncpp_int        1024      |    0.0827684\ncpp_int        1024      &    0.0843863\ncpp_int        1024      ^    0.08333\ncpp_int        1024      <<   0.0628544\ncpp_int        1024      >>   0.044717\ncpp_int        1024      %(int)0.768511\ncpp_int        1024      |(int)0.0527075\ncpp_int        1024      &(int)0.10089\ncpp_int        1024      ^(int)0.0538323\ncpp_int        1024      gcd  73.3735\ncpp_int        1024      +    0.0463315\ncpp_int        1024      -    0.0468398\ncpp_int        1024      *    0.255279\ncpp_int        1024      /    8.42528\ncpp_int        1024      +    0.0227402\ncpp_int        1024      -    0.0234526\ncpp_int        1024      *    7.86395\ncpp_int        1024      /    0.123568\ncpp_rational   128       +    18.0021\ncpp_rational   128       -    18.0006\ncpp_rational   128       *    31.5924\ncpp_rational   128       /    65.714\ncpp_rational   128       str  0.020339\ncpp_rational   128       +(int)2.47739\ncpp_rational   128       -(int)2.47959\ncpp_rational   128       *(int)2.4377\ncpp_rational   128       /(int)2.50843\ncpp_rational   128       construct0.0102665\ncpp_rational   128       construct(unsigned)0.0624887\ncpp_rational   128       construct(unsigned long long)0.0658436\ncpp_rational   128       +    2.58812\ncpp_rational   128       -    2.60864\ncpp_rational   128       *    5.53837\ncpp_rational   128       /    5.63033\ncpp_rational   128       +    2.68363\ncpp_rational   128       -    2.72926\ncpp_rational   128       *    57.9393\ncpp_rational   128       /    58.0332\ncpp_rational   256       +    46.3981\ncpp_rational   256       -    46.4818\ncpp_rational   256       *    86.0189\ncpp_rational   256       /    172.8\ncpp_rational   256       str  0.0517328\ncpp_rational   256       +(int)2.92179\ncpp_rational   256       -(int)2.90579\ncpp_rational   256       *(int)2.91325\ncpp_rational   256       /(int)3.00689\ncpp_rational   256       construct0.0101737\ncpp_rational   256       construct(unsigned)0.0609531\ncpp_rational   256       construct(unsigned long long)0.0665504\ncpp_rational   256       +    3.0953\ncpp_rational   256       -    3.08277\ncpp_rational   256       *    6.78796\ncpp_rational   256       /    6.90941\ncpp_rational   256       +    3.15142\ncpp_rational   256       -    3.19882\ncpp_rational   256       *    59.3172\ncpp_rational   256       /    59.5431\ncpp_rational   512       +    108.57\ncpp_rational   512       -    108.81\ncpp_rational   512       *    202.007\ncpp_rational   512       /    348.46\ncpp_rational   512       str  0.119248\ncpp_rational   512       +(int)3.80252\ncpp_rational   512       -(int)3.80714\ncpp_rational   512       *(int)3.94768\ncpp_rational   512       /(int)4.00588\ncpp_rational   512       construct0.0101965\ncpp_rational   512       construct(unsigned)0.0613968\ncpp_rational   512       construct(unsigned long long)0.0659082\ncpp_rational   512       +    4.00751\ncpp_rational   512       -    4.0117\ncpp_rational   512       *    9.43852\ncpp_rational   512       /    9.39508\ncpp_rational   512       +    4.05684\ncpp_rational   512       -    4.08474\ncpp_rational   512       *    61.8998\ncpp_rational   512       /    61.9712\ncpp_rational   1024      +    252.723\ncpp_rational   1024      -    253.81\ncpp_rational   1024      *    484.128\ncpp_rational   1024      /    834.057\ncpp_rational   1024      str  0.286067\ncpp_rational   1024      +(int)5.51612\ncpp_rational   1024      -(int)5.51949\ncpp_rational   1024      *(int)5.87507\ncpp_rational   1024      /(int)5.92837\ncpp_rational   1024      construct0.0102909\ncpp_rational   1024      construct(unsigned)0.062674\ncpp_rational   1024      construct(unsigned long long)0.0659089\ncpp_rational   1024      +    5.7444\ncpp_rational   1024      -    5.73296\ncpp_rational   1024      *    15.1475\ncpp_rational   1024      /    14.9497\ncpp_rational   1024      +    5.80438\ncpp_rational   1024      -    5.86\ncpp_rational   1024      *    67.4139\ncpp_rational   1024      /    67.4254\nmpq_rational   128       +    3.16879\nmpq_rational   128       -    3.18835\nmpq_rational   128       *    5.96709\nmpq_rational   128       /    15.0571\nmpq_rational   128       str  0.0037011\nmpq_rational   128       +(int)0.669634\nmpq_rational   128       -(int)0.666993\nmpq_rational   128       *(int)1.18047\nmpq_rational   128       /(int)1.43177\nmpq_rational   128       construct0.383107\nmpq_rational   128       construct(unsigned)0.394551\nmpq_rational   128       construct(unsigned long long)2.13183\nmpq_rational   128       +    2.33701\nmpq_rational   128       -    2.33227\nmpq_rational   128       *    4.15268\nmpq_rational   128       /    4.26818\nmpq_rational   128       +    2.33097\nmpq_rational   128       -    2.31793\nmpq_rational   128       *    9.34086\nmpq_rational   128       /    9.74135\nmpq_rational   256       +    6.93507\nmpq_rational   256       -    6.90939\nmpq_rational   256       *    12.9674\nmpq_rational   256       /    27.1144\nmpq_rational   256       str  0.00573278\nmpq_rational   256       +(int)0.707818\nmpq_rational   256       -(int)0.719174\nmpq_rational   256       *(int)1.22229\nmpq_rational   256       /(int)1.46082\nmpq_rational   256       construct0.381537\nmpq_rational   256       construct(unsigned)0.390987\nmpq_rational   256       construct(unsigned long long)2.12727\nmpq_rational   256       +    2.4159\nmpq_rational   256       -    2.41594\nmpq_rational   256       *    4.3447\nmpq_rational   256       /    4.43342\nmpq_rational   256       +    2.40187\nmpq_rational   256       -    2.39792\nmpq_rational   256       *    9.51195\nmpq_rational   256       /    9.65697\nmpq_rational   512       +    16.0886\nmpq_rational   512       -    16.1169\nmpq_rational   512       *    29.597\nmpq_rational   512       /    54.8579\nmpq_rational   512       str  0.012222\nmpq_rational   512       +(int)0.812783\nmpq_rational   512       -(int)0.810939\nmpq_rational   512       *(int)1.37678\nmpq_rational   512       /(int)1.6328\nmpq_rational   512       construct0.381355\nmpq_rational   512       construct(unsigned)0.392309\nmpq_rational   512       construct(unsigned long long)2.1179\nmpq_rational   512       +    2.55999\nmpq_rational   512       -    2.52842\nmpq_rational   512       *    4.82251\nmpq_rational   512       /    4.88079\nmpq_rational   512       +    2.5091\nmpq_rational   512       -    2.50572\nmpq_rational   512       *    9.90285\nmpq_rational   512       /    10.0077\nmpq_rational   1024      +    38.8883\nmpq_rational   1024      -    38.9096\nmpq_rational   1024      *    71.0635\nmpq_rational   1024      /    123.985\nmpq_rational   1024      str  0.0291802\nmpq_rational   1024      +(int)0.906471\nmpq_rational   1024      -(int)0.908293\nmpq_rational   1024      *(int)1.52386\nmpq_rational   1024      /(int)1.78575\nmpq_rational   1024      construct0.383461\nmpq_rational   1024      construct(unsigned)0.393504\nmpq_rational   1024      construct(unsigned long long)2.12279\nmpq_rational   1024      +    2.67794\nmpq_rational   1024      -    2.65991\nmpq_rational   1024      *    5.4209\nmpq_rational   1024      /    5.47417\nmpq_rational   1024      +    2.66144\nmpq_rational   1024      -    2.64168\nmpq_rational   1024      *    10.4664\nmpq_rational   1024      /    10.6781\ntommath_int    128       +    0.0222815\ntommath_int    128       -    0.027712\ntommath_int    128       *    0.113094\ntommath_int    128       /    3.09636\ntommath_int    128       str  0.0175165\ntommath_int    128       +(int)0.205506\ntommath_int    128       -(int)0.203148\ntommath_int    128       *(int)0.245897\ntommath_int    128       /(int)2.08045\ntommath_int    128       construct0.207455\ntommath_int    128       construct(unsigned)0.477971\ntommath_int    128       construct(unsigned long long)0.709516\ntommath_int    128       %    3.15171\ntommath_int    128       |    0.153434\ntommath_int    128       &    0.153508\ntommath_int    128       ^    0.153931\ntommath_int    128       <<   0.0408165\ntommath_int    128       >>   0.324163\ntommath_int    128       %(int)2.11648\ntommath_int    128       |(int)0.376671\ntommath_int    128       &(int)0.389144\ntommath_int    128       ^(int)0.374303\ntommath_int    128       gcd  12.5322\ntommath_int    128       +    0.514965\ntommath_int    128       -    0.517555\ntommath_int    128       *    0.607102\ntommath_int    128       /    2.36098\ntommath_int    128       +    0.510608\ntommath_int    128       -    0.520979\ntommath_int    128       *    18.5642\ntommath_int    128       /    1.13357\ntommath_int    256       +    0.0322049\ntommath_int    256       -    0.0407704\ntommath_int    256       *    0.346903\ntommath_int    256       /    4.01311\ntommath_int    256       str  0.0409078\ntommath_int    256       +(int)0.211847\ntommath_int    256       -(int)0.206481\ntommath_int    256       *(int)0.26894\ntommath_int    256       /(int)2.7099\ntommath_int    256       construct0.208012\ntommath_int    256       construct(unsigned)0.470752\ntommath_int    256       construct(unsigned long long)0.709045\ntommath_int    256       %    4.08522\ntommath_int    256       |    0.170093\ntommath_int    256       &    0.176384\ntommath_int    256       ^    0.172198\ntommath_int    256       <<   0.0698155\ntommath_int    256       >>   0.383757\ntommath_int    256       %(int)2.74052\ntommath_int    256       |(int)0.375206\ntommath_int    256       &(int)0.389768\ntommath_int    256       ^(int)0.379255\ntommath_int    256       gcd  26.1755\ntommath_int    256       +    0.530504\ntommath_int    256       -    0.527832\ntommath_int    256       *    0.648438\ntommath_int    256       /    3.16803\ntommath_int    256       +    0.526199\ntommath_int    256       -    0.527479\ntommath_int    256       *    18.624\ntommath_int    256       /    1.1208\ntommath_int    512       +    0.0455267\ntommath_int    512       -    0.0515883\ntommath_int    512       *    0.999026\ntommath_int    512       /    5.95775\ntommath_int    512       str  0.111392\ntommath_int    512       +(int)0.227429\ntommath_int    512       -(int)0.219998\ntommath_int    512       *(int)0.31746\ntommath_int    512       /(int)4.1339\ntommath_int    512       construct0.205622\ntommath_int    512       construct(unsigned)0.473807\ntommath_int    512       construct(unsigned long long)0.703879\ntommath_int    512       %    5.70483\ntommath_int    512       |    0.179084\ntommath_int    512       &    0.182373\ntommath_int    512       ^    0.183434\ntommath_int    512       <<   0.0973643\ntommath_int    512       >>   0.398354\ntommath_int    512       %(int)3.96918\ntommath_int    512       |(int)0.381428\ntommath_int    512       &(int)0.40432\ntommath_int    512       ^(int)0.390434\ntommath_int    512       gcd  56.7747\ntommath_int    512       +    0.546222\ntommath_int    512       -    0.53408\ntommath_int    512       *    0.718764\ntommath_int    512       /    5.07545\ntommath_int    512       +    0.543084\ntommath_int    512       -    0.535411\ntommath_int    512       *    18.745\ntommath_int    512       /    1.15084\ntommath_int    1024      +    0.074223\ntommath_int    1024      -    0.0786205\ntommath_int    1024      *    3.20269\ntommath_int    1024      /    12.7383\ntommath_int    1024      str  0.345861\ntommath_int    1024      +(int)0.250477\ntommath_int    1024      -(int)0.2372\ntommath_int    1024      *(int)0.408933\ntommath_int    1024      /(int)9.04346\ntommath_int    1024      construct0.207377\ntommath_int    1024      construct(unsigned)0.475755\ntommath_int    1024      construct(unsigned long long)0.712949\ntommath_int    1024      %    12.6845\ntommath_int    1024      |    0.436588\ntommath_int    1024      &    0.429721\ntommath_int    1024      ^    0.429478\ntommath_int    1024      <<   0.167289\ntommath_int    1024      >>   0.570323\ntommath_int    1024      %(int)9.09202\ntommath_int    1024      |(int)0.622404\ntommath_int    1024      &(int)0.653128\ntommath_int    1024      ^(int)0.62285\ntommath_int    1024      gcd  132.299\ntommath_int    1024      +    0.578521\ntommath_int    1024      -    0.552649\ntommath_int    1024      *    0.871648\ntommath_int    1024      /    12.2672\ntommath_int    1024      +    0.568301\ntommath_int    1024      -    0.54931\ntommath_int    1024      *    19.0954\ntommath_int    1024      /    1.21165\ncpp_dec_float  50        +    0.0250949\ncpp_dec_float  50        -    0.0264782\ncpp_dec_float  50        *    0.163403\ncpp_dec_float  50        /    3.9502\ncpp_dec_float  50        str  0.0207318\ncpp_dec_float  50        +(int)0.0441266\ncpp_dec_float  50        -(int)0.0442578\ncpp_dec_float  50        *(int)0.234992\ncpp_dec_float  50        /(int)1.81469\ncpp_dec_float  50        construct0.00925753\ncpp_dec_float  50        construct(unsigned)0.0588752\ncpp_dec_float  50        construct(unsigned long long)0.0587691\ncpp_dec_float  50        +    0.0770875\ncpp_dec_float  50        -    0.0741921\ncpp_dec_float  50        *    0.329282\ncpp_dec_float  50        /    1.9701\ncpp_dec_float  50        +    0.0640148\ncpp_dec_float  50        -    0.0643402\ncpp_dec_float  50        *    0.321363\ncpp_dec_float  50        /    1.97464\ncpp_dec_float  100       +    0.0291508\ncpp_dec_float  100       -    0.0307447\ncpp_dec_float  100       *    0.284182\ncpp_dec_float  100       /    7.68823\ncpp_dec_float  100       str  0.0328218\ncpp_dec_float  100       +(int)0.0558389\ncpp_dec_float  100       -(int)0.0563278\ncpp_dec_float  100       *(int)0.460635\ncpp_dec_float  100       /(int)3.62471\ncpp_dec_float  100       construct0.0263234\ncpp_dec_float  100       construct(unsigned)0.0747853\ncpp_dec_float  100       construct(unsigned long long)0.076338\ncpp_dec_float  100       +    0.0845054\ncpp_dec_float  100       -    0.0844193\ncpp_dec_float  100       *    0.582119\ncpp_dec_float  100       /    3.8773\ncpp_dec_float  100       +    0.0708668\ncpp_dec_float  100       -    0.0730765\ncpp_dec_float  100       *    0.574512\ncpp_dec_float  100       /    3.83437\ncpp_dec_float  500       +    0.0630915\ncpp_dec_float  500       -    0.0651113\ncpp_dec_float  500       *    2.22501\ncpp_dec_float  500       /    50.6121\ncpp_dec_float  500       str  0.131293\ncpp_dec_float  500       +(int)0.0935946\ncpp_dec_float  500       -(int)0.0950432\ncpp_dec_float  500       *(int)4.36195\ncpp_dec_float  500       /(int)24.4855\ncpp_dec_float  500       construct0.0306104\ncpp_dec_float  500       construct(unsigned)0.114772\ncpp_dec_float  500       construct(unsigned long long)0.117075\ncpp_dec_float  500       +    0.12407\ncpp_dec_float  500       -    0.122646\ncpp_dec_float  500       *    4.75508\ncpp_dec_float  500       /    25.1602\ncpp_dec_float  500       +    0.0865073\ncpp_dec_float  500       -    0.0929075\ncpp_dec_float  500       *    4.74128\ncpp_dec_float  500       /    25.1175\nmpfr_float     50        +    0.0624318\nmpfr_float     50        -    0.0764497\nmpfr_float     50        *    0.342248\nmpfr_float     50        /    1.69721\nmpfr_float     50        str  0.0289013\nmpfr_float     50        +(int)0.121683\nmpfr_float     50        -(int)0.149605\nmpfr_float     50        *(int)0.1548\nmpfr_float     50        /(int)0.213367\nmpfr_float     50        construct0.214552\nmpfr_float     50        construct(unsigned)0.293892\nmpfr_float     50        construct(unsigned long long)0.638307\nmpfr_float     50        +    0.553442\nmpfr_float     50        -    0.565687\nmpfr_float     50        *    0.841214\nmpfr_float     50        /    1.26072\nmpfr_float     50        +    0.537349\nmpfr_float     50        -    0.561924\nmpfr_float     50        *    0.833423\nmpfr_float     50        /    1.25318\nmpfr_float     100       +    0.0669494\nmpfr_float     100       -    0.0820912\nmpfr_float     100       *    0.478422\nmpfr_float     100       /    2.33995\nmpfr_float     100       str  0.0390764\nmpfr_float     100       +(int)0.117387\nmpfr_float     100       -(int)0.150557\nmpfr_float     100       *(int)0.166496\nmpfr_float     100       /(int)0.267439\nmpfr_float     100       construct0.222594\nmpfr_float     100       construct(unsigned)0.297568\nmpfr_float     100       construct(unsigned long long)0.643108\nmpfr_float     100       +    0.573918\nmpfr_float     100       -    0.592139\nmpfr_float     100       *    0.978674\nmpfr_float     100       /    1.5879\nmpfr_float     100       +    0.561143\nmpfr_float     100       -    0.580528\nmpfr_float     100       *    0.97887\nmpfr_float     100       /    1.58378\nmpfr_float     500       +    0.0817812\nmpfr_float     500       -    0.0975533\nmpfr_float     500       *    3.8308\nmpfr_float     500       /    13.8283\nmpfr_float     500       str  0.156188\nmpfr_float     500       +(int)0.129266\nmpfr_float     500       -(int)0.16446\nmpfr_float     500       *(int)0.273431\nmpfr_float     500       /(int)0.731526\nmpfr_float     500       construct0.222587\nmpfr_float     500       construct(unsigned)0.311108\nmpfr_float     500       construct(unsigned long long)0.653074\nmpfr_float     500       +    0.667956\nmpfr_float     500       -    0.684152\nmpfr_float     500       *    1.2661\nmpfr_float     500       /    7.46167\nmpfr_float     500       +    0.642822\nmpfr_float     500       -    0.65164\nmpfr_float     500       *    1.25714\nmpfr_float     500       /    7.46171\n[section:float_performance Float Type Perfomance]\n[table Operator *\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][[*1] (0.321363s)][1.0169 (0.574512s)][6.76401 (4.74128s)]]\n[[gmp_float][1.7169 (0.551747s)][[*1] (0.564962s)][[*1] (0.700957s)]]\n[[mpfr_float][2.5934 (0.833423s)][1.73263 (0.97887s)][1.79346 (1.25714s)]]\n]\n[table Operator *(int)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][5.56675 (0.234992s)][9.32996 (0.460635s)][50.8459 (4.36195s)]]\n[[gmp_float][[*1] (0.0422135s)][[*1] (0.0493716s)][[*1] (0.0857876s)]]\n[[mpfr_float][3.66707 (0.1548s)][3.37231 (0.166496s)][3.1873 (0.273431s)]]\n]\n[table Operator +\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][[*1] (0.0640148s)][[*1] (0.0708668s)][[*1] (0.0865073s)]]\n[[gmp_float][7.467 (0.477999s)][6.72671 (0.476701s)][5.67136 (0.490614s)]]\n[[mpfr_float][8.39413 (0.537349s)][7.91828 (0.561143s)][7.43085 (0.642822s)]]\n]\n[table Operator +(int)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][1.33358 (0.0441266s)][1.4433 (0.0558389s)][1.44838 (0.0935946s)]]\n[[gmp_float][[*1] (0.0330888s)][[*1] (0.0386882s)][[*1] (0.0646201s)]]\n[[mpfr_float][3.67747 (0.121683s)][3.03419 (0.117387s)][2.00041 (0.129266s)]]\n]\n[table Operator -\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][[*1] (0.0643402s)][[*1] (0.0730765s)][[*1] (0.0929075s)]]\n[[gmp_float][7.76625 (0.499682s)][6.89067 (0.503546s)][5.89566 (0.547751s)]]\n[[mpfr_float][8.73364 (0.561924s)][7.94411 (0.580528s)][7.01385 (0.65164s)]]\n]\n[table Operator -(int)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][[*1] (0.0442578s)][[*1] (0.0563278s)][[*1] (0.0950432s)]]\n[[gmp_float][3.0379 (0.134451s)][2.39847 (0.1351s)][1.86101 (0.176876s)]]\n[[mpfr_float][3.38031 (0.149605s)][2.67288 (0.150557s)][1.73037 (0.16446s)]]\n]\n[table Operator /\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][2.20938 (1.97464s)][3.71086 (3.83437s)][11.2059 (25.1175s)]]\n[[gmp_float][[*1] (0.893752s)][[*1] (1.03328s)][[*1] (2.24146s)]]\n[[mpfr_float][1.40216 (1.25318s)][1.53276 (1.58378s)][3.32895 (7.46171s)]]\n]\n[table Operator /(int)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][10.0596 (1.81469s)][15.5048 (3.62471s)][34.4767 (24.4855s)]]\n[[gmp_float][[*1] (0.180393s)][[*1] (0.23378s)][[*1] (0.710204s)]]\n[[mpfr_float][1.18279 (0.213367s)][1.14398 (0.267439s)][1.03002 (0.731526s)]]\n]\n[table Operator construct\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][[*1] (0.00925753s)][[*1] (0.0263234s)][[*1] (0.0306104s)]]\n[[gmp_float][21.32 (0.19737s)][7.4686 (0.196599s)][6.73181 (0.206063s)]]\n[[mpfr_float][23.176 (0.214552s)][8.45613 (0.222594s)][7.27162 (0.222587s)]]\n]\n[table Operator construct(unsigned long long)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][[*1] (0.0587691s)][[*1] (0.076338s)][[*1] (0.117075s)]]\n[[gmp_float][8.84863 (0.520025s)][6.80343 (0.51936s)][4.59554 (0.538021s)]]\n[[mpfr_float][10.8613 (0.638307s)][8.42448 (0.643108s)][5.57826 (0.653074s)]]\n]\n[table Operator construct(unsigned)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][[*1] (0.0588752s)][[*1] (0.0747853s)][[*1] (0.114772s)]]\n[[gmp_float][3.53421 (0.208078s)][2.76875 (0.207062s)][1.89088 (0.217019s)]]\n[[mpfr_float][4.99178 (0.293892s)][3.97896 (0.297568s)][2.71067 (0.311108s)]]\n]\n[table Operator str\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_dec_float][1.5616 (0.0207318s)][1.61725 (0.0328218s)][[*1] (0.131293s)]]\n[[gmp_float][[*1] (0.013276s)][[*1] (0.0202949s)][1.07517 (0.141162s)]]\n[[mpfr_float][2.17696 (0.0289013s)][1.92543 (0.0390764s)][1.18962 (0.156188s)]]\n]\n[endsect]\n[section:integer_performance Integer Type Perfomance]\n[table Operator %\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][5.31184 (0.37333s)][1.99944e+236 (0.673748s)][2.08204e+236 (0.701584s)][3.39405e+236 (1.14369s)]]\n[[cpp_int(fixed)][1.10616 (0.0777437s)][5.8492e+235 (0.1971s)][9.91271e+235 (0.334027s)][1.60165e+236 (0.539708s)][-1.#INF (0.94847s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.0702826s)]]\n[[gmp_int][9.12715 (0.64148s)][2.088e+236 (0.703592s)][2.43295e+236 (0.819828s)][3.02578e+236 (1.01959s)]]\n[[tommath_int][44.8434 (3.15171s)][1.21234e+237 (4.08522s)][1.69298e+237 (5.70483s)][3.7643e+237 (12.6845s)]]\n]\n[table Operator %(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][3.51789 (0.104856s)][-1.#INF (0.203012s)][-1.#INF (0.391566s)][-1.#INF (0.768511s)]]\n[[cpp_int(fixed)][1.14548 (0.0341425s)][-1.#INF (0.103684s)][-1.#INF (0.200647s)][-1.#INF (0.377704s)][-1.#INF (0.743202s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.0298064s)]]\n[[gmp_int][1.91945 (0.0572117s)][-1.#INF (0.10258s)][-1.#INF (0.188529s)][-1.#INF (0.355222s)]]\n[[tommath_int][71.0078 (2.11648s)][-1.#INF (2.74052s)][-1.#INF (3.96918s)][-1.#INF (9.09202s)]]\n]\n[table Operator &\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][12.079 (0.031605s)][-1.11772e+007 (0.0455929s)][-1.33961e+007 (0.0546439s)][-2.06875e+007 (0.0843863s)]]\n[[cpp_int(fixed)][4.74538 (0.0124165s)][-8.36978e+006 (0.0341411s)][-1.22854e+007 (0.0501131s)][-1.4424e+007 (0.0588367s)][-1.#INF (0.0774574s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.00261653s)]]\n[[gmp_int][20.5664 (0.0538128s)][-1.59881e+007 (0.0652169s)][-2.25796e+007 (0.092104s)][-3.5403e+007 (0.144412s)]]\n[[tommath_int][58.6685 (0.153508s)][-4.3241e+007 (0.176384s)][-4.47093e+007 (0.182373s)][-1.05347e+008 (0.429721s)]]\n]\n[table Operator &(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][23.3956 (0.0377678s)][-7.85844e+307 (0.0471524s)][-1.07843e+308 (0.0647085s)][-1.68143e+308 (0.10089s)]]\n[[cpp_int(fixed)][6.49083 (0.0104782s)][-6.95612e+307 (0.0417383s)][-8.99012e+307 (0.0539427s)][-1.17371e+308 (0.070425s)][-1.#INF (0.112823s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.00161431s)]]\n[[gmp_int][87.5331 (0.141306s)][-1.#INF (0.139398s)][-1.#INF (0.142498s)][-1.#INF (0.141249s)]]\n[[tommath_int][241.059 (0.389144s)][-1.#INF (0.389768s)][-1.#INF (0.40432s)][-1.#INF (0.653128s)]]\n]\n[table Operator *\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][1715.93 (7.6372s)][-4.15607e+276 (7.7121s)][-4.16472e+276 (7.72815s)][-4.23791e+276 (7.86395s)]]\n[[cpp_int(fixed)][1.27579 (0.00567824s)][-3.62916e+274 (0.0673436s)][-5.78275e+274 (0.107306s)][-9.2595e+274 (0.171821s)][-1.#INF (0.299236s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.00445077s)]]\n[[gmp_int][710.595 (3.1627s)][-1.69816e+276 (3.15114s)][-1.70883e+276 (3.17094s)][-1.7293e+276 (3.20893s)]]\n[[tommath_int][4171.01 (18.5642s)][-1.00365e+277 (18.624s)][-1.01017e+277 (18.745s)][-1.02906e+277 (19.0954s)]]\n]\n[table Operator *(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][9.97316 (0.0235876s)][1.#INF (0.0318939s)][1.#INF (0.0427792s)][1.#INF (0.0668616s)]]\n[[cpp_int(fixed)][2.32007 (0.00548722s)][1.#INF (0.0328109s)][1.#INF (0.049867s)][1.#INF (0.0658566s)][-1.#INF (0.0948565s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.00236511s)]]\n[[gmp_int][9.62157 (0.022756s)][1.#INF (0.0282672s)][1.#INF (0.0361075s)][1.#INF (0.0518882s)]]\n[[tommath_int][103.969 (0.245897s)][1.#INF (0.26894s)][1.#INF (0.31746s)][1.#INF (0.408933s)]]\n]\n[table Operator +\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][9.74543 (0.0196594s)][3.98952e+276 (0.0215291s)][4.2355e+276 (0.0228565s)][4.21393e+276 (0.0227402s)]]\n[[cpp_int(fixed)][2.13187 (0.00430062s)][3.11951e+276 (0.0168342s)][3.15933e+276 (0.0170491s)][3.19893e+276 (0.0172628s)][-1.#INF (0.0181245s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.0020173s)]]\n[[gmp_int][337.759 (0.68136s)][1.27731e+278 (0.68929s)][1.28647e+278 (0.694235s)][1.27865e+278 (0.690013s)]]\n[[tommath_int][253.115 (0.510608s)][9.75089e+277 (0.526199s)][1.00638e+278 (0.543084s)][1.05311e+278 (0.568301s)]]\n]\n[table Operator +(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][9.81588 (0.0159069s)][-5.71737e+244 (0.0218386s)][-8.2882e+244 (0.0316584s)][-1.1265e+245 (0.0430289s)]]\n[[cpp_int(fixed)][3.92617 (0.00636247s)][-7.02443e+244 (0.0268311s)][-1.07535e+245 (0.0410749s)][-1.37293e+245 (0.0524416s)][-1.#INF (0.0728817s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.00162053s)]]\n[[gmp_int][19.2059 (0.0311237s)][-1.12054e+245 (0.0428011s)][-1.74239e+245 (0.0665539s)][-2.83458e+245 (0.108272s)]]\n[[tommath_int][126.815 (0.205506s)][-5.54618e+245 (0.211847s)][-5.95413e+245 (0.227429s)][-6.55751e+245 (0.250477s)]]\n]\n[table Operator -\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][11.0409 (0.0210968s)][3.86227e+276 (0.0213343s)][4.03471e+276 (0.0222868s)][4.24576e+276 (0.0234526s)]]\n[[cpp_int(fixed)][2.02836 (0.00387577s)][3.06763e+276 (0.0169449s)][3.2004e+276 (0.0176783s)][3.27232e+276 (0.0180756s)][-1.#INF (0.0190581s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.00191079s)]]\n[[gmp_int][356.496 (0.681187s)][1.23744e+278 (0.683532s)][1.2536e+278 (0.69246s)][1.25066e+278 (0.690838s)]]\n[[tommath_int][272.651 (0.520979s)][9.54925e+277 (0.527479s)][9.69283e+277 (0.535411s)][9.94446e+277 (0.54931s)]]\n]\n[table Operator -(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][9.24378 (0.0151244s)][-1.01975e-199 (0.017199s)][-1.47092e-199 (0.0248084s)][-1.96387e-199 (0.0331224s)]]\n[[cpp_int(fixed)][4.08494 (0.00668367s)][-1.43394e-199 (0.0241848s)][-2.18373e-199 (0.0368306s)][-2.98469e-199 (0.0503396s)][-1.#INF (0.0621059s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.00163617s)]]\n[[gmp_int][18.693 (0.030585s)][-2.37422e-199 (0.0400434s)][-3.42818e-199 (0.0578194s)][-5.96116e-199 (0.100541s)]]\n[[tommath_int][124.161 (0.203148s)][-1.22425e-198 (0.206481s)][-1.30439e-198 (0.219998s)][-1.40639e-198 (0.2372s)]]\n]\n[table Operator /\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][1.96346 (0.0578293s)][-1.51814e+061 (0.0615507s)][-1.8062e+061 (0.0732298s)][-3.04778e+061 (0.123568s)]]\n[[cpp_int(fixed)][1.08704 (0.0320162s)][-8.07606e+060 (0.0327432s)][-8.40351e+060 (0.0340708s)][-1.09735e+061 (0.0444905s)][-1.#INF (0.106788s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.0294528s)]]\n[[gmp_int][23.2741 (0.685487s)][-1.70068e+062 (0.689516s)][-1.6994e+062 (0.688995s)][-1.74523e+062 (0.707578s)]]\n[[tommath_int][38.4876 (1.13357s)][-2.76443e+062 (1.1208s)][-2.83854e+062 (1.15084s)][-2.98853e+062 (1.21165s)]]\n]\n[table Operator /(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][7.87676 (0.235955s)][1.#INF (0.35212s)][1.#INF (0.568032s)][1.#INF (0.989885s)]]\n[[cpp_int(fixed)][1.21173 (0.0362985s)][1.#INF (0.137619s)][1.#INF (0.253796s)][1.#INF (0.446782s)][-1.#INF (0.84764s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.0299559s)]]\n[[gmp_int][1.87075 (0.0560401s)][1.#INF (0.0982823s)][1.#INF (0.183564s)][1.#INF (0.352238s)]]\n[[tommath_int][69.4504 (2.08045s)][1.#INF (2.7099s)][1.#INF (4.1339s)][1.#INF (9.04346s)]]\n]\n[table Operator <<\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][15.849 (0.0256107s)][-5.85461e+126 (0.0401135s)][-6.36621e+126 (0.0436188s)][-9.17366e+126 (0.0628544s)]]\n[[cpp_int(fixed)][3.19639 (0.00516511s)][-4.68379e+126 (0.0320915s)][-7.40049e+126 (0.0507053s)][-8.72078e+126 (0.0597514s)][-1.#INF (0.0677088s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.00161592s)]]\n[[gmp_int][16.956 (0.0273994s)][-4.66649e+126 (0.031973s)][-6.88464e+126 (0.0471709s)][-1.05374e+127 (0.0721984s)]]\n[[tommath_int][25.259 (0.0408165s)][-1.01897e+127 (0.0698155s)][-1.42104e+127 (0.0973643s)][-2.4416e+127 (0.167289s)]]\n]\n[table Operator >>\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][14.6983 (0.0237523s)][-2.28921e+307 (0.0302534s)][-2.68808e+307 (0.0355247s)][-3.38364e+307 (0.044717s)]]\n[[cpp_int(fixed)][2.47217 (0.00399499s)][-2.21749e+307 (0.0293055s)][-2.9515e+307 (0.039006s)][-3.9023e+307 (0.0515714s)][-1.#INF (0.0626121s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.00161599s)]]\n[[gmp_int][17.8366 (0.0288237s)][-2.3471e+307 (0.0310184s)][-2.55387e+307 (0.0337511s)][-2.9362e+307 (0.0388038s)]]\n[[tommath_int][200.597 (0.324163s)][-1.#INF (0.383757s)][-1.#INF (0.398354s)][-1.#INF (0.570323s)]]\n]\n[table Operator ^\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][7.95372 (0.0318172s)][1.21131 (0.0425243s)][1.02246 (0.0542436s)][1.19877 (0.08333s)]]\n[[cpp_int(fixed)][2.75762 (0.0110313s)][[*1] (0.0351059s)][[*1] (0.0530521s)][[*1] (0.0695132s)][-1.#INF (0.09783s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.0040003s)]]\n[[gmp_int][12.4289 (0.0497194s)][1.79507 (0.0630174s)][1.63955 (0.0869819s)][2.0012 (0.139109s)]]\n[[tommath_int][38.4798 (0.153931s)][4.9051 (0.172198s)][3.45761 (0.183434s)][6.17837 (0.429478s)]]\n]\n[table Operator ^(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][15.3547 (0.0283305s)][-8.92021e+307 (0.0353555s)][-1.05356e+308 (0.041758s)][-1.35819e+308 (0.0538323s)]]\n[[cpp_int(fixed)][5.81005 (0.0107199s)][-7.88073e+307 (0.0312355s)][-1.20328e+308 (0.0476923s)][-1.36485e+308 (0.0540962s)][-1.#INF (0.0806317s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.00184507s)]]\n[[gmp_int][78.0102 (0.143934s)][-1.#INF (0.144825s)][-1.#INF (0.152773s)][-1.#INF (0.161662s)]]\n[[tommath_int][202.867 (0.374303s)][-1.#INF (0.379255s)][-1.#INF (0.390434s)][-1.#INF (0.62285s)]]\n]\n[table Operator construct\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][2.64088 (0.00293927s)][1.47161e+238 (0.00277479s)][1.49039e+238 (0.0028102s)][1.47064e+238 (0.00277298s)]]\n[[cpp_int(fixed)][1.45325 (0.00161745s)][8.73297e+237 (0.00164665s)][1.92709e+238 (0.00363363s)][3.0576e+238 (0.00576526s)][-1.#INF (0.00535599s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.00111299s)]]\n[[gmp_int][176.266 (0.196182s)][1.06706e+240 (0.201199s)][1.04919e+240 (0.19783s)][1.04712e+240 (0.19744s)]]\n[[tommath_int][186.394 (0.207455s)][1.10319e+240 (0.208012s)][1.09052e+240 (0.205622s)][1.09982e+240 (0.207377s)]]\n]\n[table Operator construct(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][3.51152 (0.00719854s)][-2.80497e-148 (0.00725455s)][-2.79893e-148 (0.00723891s)][-2.83336e-148 (0.00732796s)]]\n[[cpp_int(fixed)][[*1] (0.00204998s)][-1.21019e-148 (0.00312994s)][-1.50065e-148 (0.00388115s)][-2.15185e-148 (0.00556537s)][-1.#INF (0.00577713s)]]\n[[cpp_int(unsigned, fixed)][1.17501 (0.00240876s)]]\n[[gmp_int][351.097 (0.719741s)][-2.82056e-146 (0.729487s)][-2.80186e-146 (0.724649s)][-2.79263e-146 (0.722262s)]]\n[[tommath_int][346.109 (0.709516s)][-2.74152e-146 (0.709045s)][-2.72155e-146 (0.703879s)][-2.75662e-146 (0.712949s)]]\n]\n[table Operator construct(unsigned)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][2.44987 (0.00270684s)][1.90974 (0.0030529s)][[*1] (0.00288857s)][[*1] (0.00265201s)]]\n[[cpp_int(fixed)][1.89292 (0.00209147s)][[*1] (0.0015986s)][1.28253 (0.00370466s)][2.19414 (0.0058189s)][-1.#INF (0.00836042s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.00110489s)]]\n[[gmp_int][186.546 (0.206113s)][132.175 (0.211295s)][71.6424 (0.206944s)][81.5339 (0.216229s)]]\n[[tommath_int][432.596 (0.477971s)][294.478 (0.470752s)][164.029 (0.473807s)][179.394 (0.475755s)]]\n]\n[table Operator gcd\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][8.27321 (4.98644s)][-1.#INF (11.1816s)][-1.#INF (27.2257s)][-1.#INF (73.3735s)]]\n[[cpp_int(fixed)][1.0026 (0.604291s)][-1.#INF (4.18006s)][-1.#INF (10.2671s)][-1.#INF (26.2762s)][-1.#INF (76.2849s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.602722s)]]\n[[gmp_int][4.06647 (2.45095s)][-1.#INF (5.89505s)][-1.#INF (13.6993s)][-1.#INF (33.2232s)]]\n[[tommath_int][20.7927 (12.5322s)][-1.#INF (26.1755s)][-1.#INF (56.7747s)][-1.#INF (132.299s)]]\n]\n[table Operator str\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][1.02246 (0.00189808s)][-3.42215e+178 (0.00391656s)][-7.26989e+178 (0.00832019s)][-1.93625e+179 (0.0221599s)]]\n[[cpp_int(fixed)][1.35564 (0.00251659s)][-1.36421e+178 (0.0015613s)][-2.59752e+178 (0.00297279s)][-6.18963e+178 (0.00708386s)][-1.#INF (0.0172514s)]]\n[[cpp_int(unsigned, fixed)][1.38149 (0.00256457s)]]\n[[gmp_int][[*1] (0.00185638s)][-3.01078e+178 (0.00344576s)][-5.40339e+178 (0.00618403s)][-1.26279e+179 (0.0144523s)]]\n[[tommath_int][9.43586 (0.0175165s)][-3.57438e+179 (0.0409078s)][-9.73304e+179 (0.111392s)][-3.02201e+180 (0.345861s)]]\n]\n[table Operator |\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][11.6542 (0.030991s)][-6.48076e+046 (0.0429658s)][-8.11261e+046 (0.0537846s)][-1.24844e+047 (0.0827684s)]]\n[[cpp_int(fixed)][4.09831 (0.0108982s)][-5.73378e+046 (0.0380136s)][-7.98794e+046 (0.0529581s)][-1.02098e+047 (0.0676884s)][-1.#INF (0.100936s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.00265921s)]]\n[[gmp_int][17.8503 (0.0474678s)][-9.32586e+046 (0.0618281s)][-1.29209e+047 (0.0856626s)][-2.0526e+047 (0.136082s)]]\n[[tommath_int][57.6991 (0.153434s)][-2.5656e+047 (0.170093s)][-2.70121e+047 (0.179084s)][-6.58529e+047 (0.436588s)]]\n]\n[table Operator |(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][16.9457 (0.0280516s)][-4.17523e+307 (0.0363929s)][-4.79721e+307 (0.0418143s)][-6.04694e+307 (0.0527075s)]]\n[[cpp_int(fixed)][6.70551 (0.0111002s)][-3.64663e+307 (0.0317854s)][-5.35725e+307 (0.0466958s)][-6.16052e+307 (0.0536974s)][-1.#INF (0.0819107s)]]\n[[cpp_int(unsigned, fixed)][[*1] (0.00165538s)]]\n[[gmp_int][85.2488 (0.141119s)][-1.64044e+308 (0.142987s)][-1.78579e+308 (0.155656s)][-1.#INF (0.163236s)]]\n[[tommath_int][227.544 (0.376671s)][-1.#INF (0.375206s)][-1.#INF (0.381428s)][-1.#INF (0.622404s)]]\n]\n[endsect]\n[section:rational_performance Rational Type Perfomance]\n[table Operator *\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][6.20279 (57.9393s)][6.23608 (59.3172s)][6.25071 (61.8998s)][6.44097 (67.4139s)]]\n[[mpq_rational][[*1] (9.34086s)][[*1] (9.51195s)][[*1] (9.90285s)][[*1] (10.4664s)]]\n]\n[table Operator *(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][2.06502 (2.4377s)][2.38344 (2.91325s)][2.86734 (3.94768s)][3.8554 (5.87507s)]]\n[[mpq_rational][[*1] (1.18047s)][[*1] (1.22229s)][[*1] (1.37678s)][[*1] (1.52386s)]]\n]\n[table Operator +\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.1513 (2.68363s)][1.31207 (3.15142s)][1.61685 (4.05684s)][2.18092 (5.80438s)]]\n[[mpq_rational][[*1] (2.33097s)][[*1] (2.40187s)][[*1] (2.5091s)][[*1] (2.66144s)]]\n]\n[table Operator +(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][3.69962 (2.47739s)][4.12788 (2.92179s)][4.67839 (3.80252s)][6.08526 (5.51612s)]]\n[[mpq_rational][[*1] (0.669634s)][[*1] (0.707818s)][[*1] (0.812783s)][[*1] (0.906471s)]]\n]\n[table Operator -\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.17746 (2.72926s)][1.334 (3.19882s)][1.63017 (4.08474s)][2.21829 (5.86s)]]\n[[mpq_rational][[*1] (2.31793s)][[*1] (2.39792s)][[*1] (2.50572s)][[*1] (2.64168s)]]\n]\n[table Operator -(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][3.71756 (2.47959s)][4.04045 (2.90579s)][4.69474 (3.80714s)][6.07677 (5.51949s)]]\n[[mpq_rational][[*1] (0.666993s)][[*1] (0.719174s)][[*1] (0.810939s)][[*1] (0.908293s)]]\n]\n[table Operator /\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][5.95741 (58.0332s)][6.16582 (59.5431s)][6.19235 (61.9712s)][6.31439 (67.4254s)]]\n[[mpq_rational][[*1] (9.74135s)][[*1] (9.65697s)][[*1] (10.0077s)][[*1] (10.6781s)]]\n]\n[table Operator /(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.75198 (2.50843s)][2.05836 (3.00689s)][2.45339 (4.00588s)][3.31983 (5.92837s)]]\n[[mpq_rational][[*1] (1.43177s)][[*1] (1.46082s)][[*1] (1.6328s)][[*1] (1.78575s)]]\n]\n[table Operator construct\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][[*1] (0.0102665s)][[*1] (0.0101737s)][[*1] (0.0101965s)][[*1] (0.0102909s)]]\n[[mpq_rational][37.3164 (0.383107s)][37.5023 (0.381537s)][37.4005 (0.381355s)][37.2621 (0.383461s)]]\n]\n[table Operator construct(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][[*1] (0.0658436s)][[*1] (0.0665504s)][[*1] (0.0659082s)][[*1] (0.0659089s)]]\n[[mpq_rational][32.3771 (2.13183s)][31.9648 (2.12727s)][32.1342 (2.1179s)][32.2079 (2.12279s)]]\n]\n[table Operator construct(unsigned)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][[*1] (0.0624887s)][[*1] (0.0609531s)][[*1] (0.0613968s)][[*1] (0.062674s)]]\n[[mpq_rational][6.31396 (0.394551s)][6.41455 (0.390987s)][6.38973 (0.392309s)][6.27858 (0.393504s)]]\n]\n[table Operator str\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][5.4954 (0.020339s)][9.02403 (0.0517328s)][9.75685 (0.119248s)][9.80346 (0.286067s)]]\n[[mpq_rational][[*1] (0.0037011s)][[*1] (0.00573278s)][[*1] (0.012222s)][[*1] (0.0291802s)]]\n]\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011-21 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//\n// This is the main entry point for our operator performance test suite.\n// In order to build this program, you must compile and link this file against\n// all the libs/multiprecision/performance/performance_test_files/*.cpp files.\n// \n// The default behaviour is to \"test everything\", which is probably not what you want.\n// In order to restict testing to a specific selection of backends, you will need to\n// define one or more of the following macros when building:\n// \n// TEST_MPF\n// TEST_MPZ\n// TEST_CPP_DEC_FLOAT\n// TEST_MPFR\n// TEST_MPQ\n// TEST_TOMMATH\n// TEST_TOMMATH_BOOST_RATIONAL\n// TEST_MPZ_BOOST_RATIONAL\n// TEST_CPP_INT\n// TEST_CPP_INT_RATIONAL\n// TEST_CPP_BIN_FLOAT\n//\n\n#include \"performance_test.hpp\"\n\n#ifdef TEST_MPZ\n#include <gmp.h>\n#endif\n#ifdef TEST_MPFR\n#include <mpfr.h>\n#endif\n#include <boost/version.hpp>\n\n//\n// Keys in order are:\n// Category\n// Operator\n// Type\n// Precision\n// Time\n//\nstd::map<std::string, std::map<std::string, std::map<std::string, std::map<int, double> > > > result_table;\n\nunsigned bits_wanted; // for integer types\n\nvoid quickbook_results()\n{\n   //\n   // Keys in order are:\n   // Category\n   // Operator\n   // Type\n   // Precision\n   // Time\n   //\n   typedef std::map<std::string, std::map<std::string, std::map<std::string, std::map<int, double> > > >::const_iterator category_iterator;\n   typedef std::map<std::string, std::map<std::string, std::map<int, double> > >::const_iterator                         operator_iterator;\n   typedef std::map<std::string, std::map<int, double> >::const_iterator                                                 type_iterator;\n   typedef std::map<int, double>::const_iterator                                                                         precision_iterator;\n\n   for (category_iterator i = result_table.begin(); i != result_table.end(); ++i)\n   {\n      std::string cat = i->first;\n      cat[0]          = (char)std::toupper((char)cat[0]);\n      std::cout << \"[section:\" << i->first << \"_performance \" << cat << \" Type Perfomance]\" << std::endl;\n\n      for (operator_iterator j = i->second.begin(); j != i->second.end(); ++j)\n      {\n         std::string op = j->first;\n         std::cout << \"[table Operator \" << op << std::endl;\n         std::cout << \"[[Backend]\";\n\n         for (precision_iterator k = j->second.begin()->second.begin(); k != j->second.begin()->second.end(); ++k)\n         {\n            std::cout << \"[\" << k->first << \" Bits]\";\n         }\n         std::cout << \"]\\n\";\n\n         std::vector<double> best_times(j->second.begin()->second.size(), (std::numeric_limits<double>::max)());\n         for (unsigned m = 0; m < j->second.begin()->second.size(); ++m)\n         {\n            for (type_iterator k = j->second.begin(); k != j->second.end(); ++k)\n            {\n               if (m < k->second.size())\n               {\n                  precision_iterator l = k->second.begin();\n                  std::advance(l, m);\n                  if (best_times[m] > l->second)\n                     best_times[m] = l->second ? l->second : best_times[m];\n               }\n            }\n         }\n\n         for (type_iterator k = j->second.begin(); k != j->second.end(); ++k)\n         {\n            std::cout << \"[[\" << k->first << \"]\";\n\n            unsigned m = 0;\n            for (precision_iterator l = k->second.begin(); l != k->second.end(); ++l)\n            {\n               double rel_time = l->second / best_times[m];\n               if (rel_time == 1)\n                  std::cout << \"[[*\" << rel_time << \"]\";\n               else\n                  std::cout << \"[\" << rel_time;\n               std::cout << \" (\" << l->second << \"s)]\";\n               ++m;\n            }\n\n            std::cout << \"]\\n\";\n         }\n\n         std::cout << \"]\\n\";\n      }\n\n      std::cout << \"[endsect]\" << std::endl;\n   }\n}\n\n#if defined(__HAS_INCLUDE)\n#if __has_include(<sys/utsname.h>)\n#define HAS_UTSNAME\n#include <sys/utsname.h>\n#endif\n#endif\n#ifdef _WIN32\n#include <windows.h>\n#endif\n\nvoid quickbook_platform_details()\n{\n   std::cout << \"[table:platform Platform Details\\n[[Platform][\";\n#ifdef HAS_UTSNAME\n   utsname name;\n   uname(&name);\n   std::cout << name.sysname << \" \" << name.release << \", version \" << name.version << \", \" << name.machine << \"]]\\n\";\n#elif defined(_WIN32)\n   std::cout << \"Windows \";\n#ifdef _M_AMD64\n   std::cout << \"x64\";\n#elif defined(_M_IX86)\n   std::cout << \"x86\";\n#endif\n   std::cout << \"]]\\n\";\n#endif\n   std::cout << \"[[Compiler][\" << BOOST_COMPILER << \"]]\\n\";\n#ifdef TEST_MPZ\n   std::cout << \"[[GMP][\" << gmp_version << \"]]\\n\";\n#endif\n#ifdef TEST_MPFR\n   std::cout << \"[[MPFR][\" << MPFR_VERSION << \"]]\\n\";\n#endif\n   std::cout << \"[[Boost][\" << BOOST_VERSION << \"]]\\n\";\n   std::cout << \"[[Run date][\" << __DATE__ << \"]]\\n\";\n   std::cout << \"]\\n\\n\";\n}\n\nint main()\n{\n   quickbook_platform_details();\n\n   test01();\n   test02();\n   test03();\n   test04();\n   test05();\n   test06();\n   test07();\n   test08();\n   test09();\n   test10();\n   test11();\n   test12();\n   test13();\n   test14();\n   test15();\n   test16();\n   test17();\n   test18();\n   test19();\n   test20();\n   test21();\n   test22();\n   test23();\n   test24();\n   test25();\n   test26();\n   test27();\n   test28();\n   test29();\n   test30();\n   test31();\n   test32();\n   test33();\n   test34();\n   test35();\n   test36();\n   test37();\n   test38();\n   test39();\n   test40();\n   test41();\n   test42();\n   test43();\n   test44();\n   test45();\n   test46();\n   test47();\n   test48();\n   test49();\n   test50();\n   test51();\n\n   quickbook_results();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011-9 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#define BOOST_CHRONO_HEADER_ONLY\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#if !defined(TEST_MPF) && !defined(TEST_MPZ) && \\\n    !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPQ) && !defined(TEST_TOMMATH) && \\\n    !defined(TEST_TOMMATH_BOOST_RATIONAL) && !defined(TEST_MPZ_BOOST_RATIONAL) && !defined(TEST_CPP_INT) && \\\n    !defined(TEST_CPP_INT_RATIONAL) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF\n#define TEST_MPZ\n#define TEST_MPQ\n#define TEST_MPFR\n#define TEST_CPP_DEC_FLOAT\n#define TEST_MPQ\n#define TEST_TOMMATH\n#define TEST_CPP_INT\n#define TEST_CPP_INT_RATIONAL\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#include <boost/chrono.hpp>\n#include <vector>\n#include <map>\n#include <string>\n#include <cstring>\n#include <cctype>\n#include <iostream>\n#include <iomanip>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include <boost/multiprecision/number.hpp>\n\ntemplate <class Clock>\nstruct stopwatch\n{\n   typedef typename Clock::duration duration;\n   stopwatch()\n   {\n      m_start = Clock::now();\n   }\n   duration elapsed()\n   {\n      return Clock::now() - m_start;\n   }\n   void reset()\n   {\n      m_start = Clock::now();\n   }\n\n private:\n   typename Clock::time_point m_start;\n};\n\nextern unsigned bits_wanted; // for integer types\n\ntemplate <class T, int Type>\nstruct tester\n{\n   tester()\n   {\n      a.assign(500, 0);\n      for (int i = 0; i < 500; ++i)\n      {\n         b.push_back(generate_random());\n         c.push_back(generate_random());\n         small.push_back(gen());\n      }\n   }\n   double test_add()\n   {\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned j = 0; j < b.size(); ++j)\n            a[j] = b[j] + c[j];\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_subtract()\n   {\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned j = 0; j < b.size(); ++j)\n            a[j] = b[j] - c[j];\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_add_int()\n   {\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned j = 0; j < b.size(); ++j)\n            a[j] = b[j] + 1;\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_subtract_int()\n   {\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned j = 0; j < b.size(); ++j)\n            a[j] = b[j] - 1;\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_multiply()\n   {\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned k = 0; k < b.size(); ++k)\n            a[k] = b[k] * c[k];\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_multiply_int()\n   {\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned j = 0; j < b.size(); ++j)\n            a[j] = b[j] * 3;\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_divide()\n   {\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned j = 0; j < b.size(); ++j)\n            a[j] = b[j] / c[j] + b[j] / small[j];\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_divide_int()\n   {\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned j = 0; j < b.size(); ++j)\n            a[j] = b[j] / 3;\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_str(const std::integral_constant<bool, false>&)\n   {\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < b.size(); ++i)\n         a[i] = boost::lexical_cast<T>(boost::lexical_cast<std::string>(b[i]));\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_str(const std::integral_constant<bool, true>&)\n   {\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < b.size(); ++i)\n         a[i].assign(b[i].str());\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_str()\n   {\n      return test_str(std::is_class<T>());\n   }\n   //\n   // The following tests only work for integer types:\n   //\n   double test_mod()\n   {\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned i = 0; i < b.size(); ++i)\n            a[i] = b[i] % c[i] + b[i] % small[i];\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_mod_int()\n   {\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned i = 0; i < b.size(); ++i)\n            a[i] = b[i] % 254;\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_or()\n   {\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned i = 0; i < b.size(); ++i)\n            a[i] = b[i] | c[i];\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_or_int()\n   {\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned i = 0; i < b.size(); ++i)\n            a[i] = b[i] | 234;\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_and()\n   {\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned i = 0; i < b.size(); ++i)\n            a[i] = b[i] & c[i];\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_and_int()\n   {\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned i = 0; i < b.size(); ++i)\n            a[i] = b[i] & 234;\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_xor()\n   {\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned i = 0; i < b.size(); ++i)\n            a[i] = b[i] ^ c[i];\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_xor_int()\n   {\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned i = 0; i < b.size(); ++i)\n            a[i] = b[i] ^ 234;\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_complement()\n   {\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned i = 0; i < b.size(); ++i)\n            a[i] = ~b[i];\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_left_shift()\n   {\n      int                                             max_shift = std::numeric_limits<T>::is_bounded ? std::numeric_limits<T>::digits : bits_wanted;\n      int                                             shift     = 0;\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned i = 0; i < b.size(); ++i)\n            a[i] = b[i] << (shift++ % max_shift);\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_right_shift()\n   {\n      int                                             max_shift = 2 + std::numeric_limits<T>::is_bounded ? std::numeric_limits<T>::digits : bits_wanted;\n      int                                             shift     = 0;\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned i = 0; i < b.size(); ++i)\n            a[i] = b[i] >> (shift++) % max_shift;\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_gcd()\n   {\n      using boost::integer::gcd;\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned i = 0; i < b.size(); ++i)\n            a[i] = gcd(b[i], c[i]);\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_powm()\n   {\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 25; ++i)\n      {\n         for (unsigned i = 0; i < b.size(); ++i)\n            a[i] = powm(b[i], b[i] / 2, c[i]);\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   double test_construct()\n   {\n      std::allocator<T>                               alloc;\n      T*                                              pt = alloc.allocate(1000);\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned j = 0; j < 1000; ++j)\n            new (pt + j) T();\n         for (unsigned j = 0; j < 1000; ++j)\n            std::allocator_traits<std::allocator<T> >::destroy(alloc, pt + j);\n      }\n      double result = boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n      alloc.deallocate(pt, 1000);\n      return result;\n   }\n   double test_construct_unsigned()\n   {\n      std::allocator<T>                               alloc;\n      T*                                              pt = alloc.allocate(1000);\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned j = 0; j < 1000; ++j)\n            new (pt + j) T(j);\n         for (unsigned j = 0; j < 1000; ++j)\n            std::allocator_traits<std::allocator<T> >::destroy(alloc, pt + j);\n      }\n      double result = boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n      alloc.deallocate(pt, 1000);\n      return result;\n   }\n   double test_construct_unsigned_ll()\n   {\n      std::allocator<T>                               alloc;\n      T*                                              pt = alloc.allocate(1000);\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned long long j = 0; j < 1000; ++j)\n            new (pt + j) T(j);\n         for (unsigned j = 0; j < 1000; ++j)\n            std::allocator_traits<std::allocator<T>  >::destroy(alloc, pt + j);\n      }\n      double result = boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n      alloc.deallocate(pt, 1000);\n      return result;\n   }\n\n   //\n   // Hetero operations:\n   //\n   template <class U>\n   static U get_hetero_test_value(std::integral_constant<bool, false> const&)\n   {\n      return U(2) / 3;\n   }\n   template <class U>\n   static U get_hetero_test_value(std::integral_constant<bool, true> const&)\n   {\n      return (std::numeric_limits<U>::max)() >> 4;\n   }\n   template <class U>\n   static U get_hetero_test_value()\n   {\n      return get_hetero_test_value<U>(boost::multiprecision::detail::is_integral<U>());\n   }\n   template <class U>\n   double test_multiply_hetero()\n   {\n      const std::vector<U>&                           vals = get_hetero_test_vector<U>();\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned j = 0; j < b.size(); ++j)\n            a[j] = b[j] * vals[j];\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   template <class U>\n   double test_inplace_multiply_hetero()\n   {\n      const std::vector<U>&                           vals = get_hetero_test_vector<U>();\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned j = 0; j < b.size(); ++j)\n            a[j] = b[j], a[j] *= vals[j];\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   template <class U>\n   double test_add_hetero()\n   {\n      const std::vector<U>&                           vals = get_hetero_test_vector<U>();\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned j = 0; j < b.size(); ++j)\n            a[j] = b[j] + vals[j];\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   template <class U>\n   double test_inplace_add_hetero()\n   {\n      const std::vector<U>&                           vals = get_hetero_test_vector<U>();\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned j = 0; j < b.size(); ++j)\n            a[j] = b[j], a[j] += vals[j];\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   template <class U>\n   double test_subtract_hetero()\n   {\n      const std::vector<U>&                           vals = get_hetero_test_vector<U>();\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned j = 0; j < b.size(); ++j)\n            a[j] = b[j] - vals[j];\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   template <class U>\n   double test_inplace_subtract_hetero()\n   {\n      const std::vector<U>&                           vals = get_hetero_test_vector<U>();\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned j = 0; j < b.size(); ++j)\n            a[j] = b[j], a[j] -= vals[j];\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   template <class U>\n   double test_divide_hetero()\n   {\n      const std::vector<U>&                           vals = get_hetero_test_vector<U>();\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned j = 0; j < b.size(); ++j)\n            a[j] = b[j] / vals[j];\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n   template <class U>\n   double test_inplace_divide_hetero()\n   {\n      const std::vector<U>&                           vals = get_hetero_test_vector<U>();\n      stopwatch<boost::chrono::high_resolution_clock> w;\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         for (unsigned j = 0; j < b.size(); ++j)\n            a[j] = b[j], a[j] /= vals[j];\n      }\n      return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   }\n\n private:\n   T generate_random()\n   {\n      return generate_random<T>(std::integral_constant<int, Type>());\n   }\n   template <class U>\n   U generate_random(const std::integral_constant<int, boost::multiprecision::number_kind_floating_point>&)\n   {\n      U val      = gen();\n      U prev_val = -1;\n      while (val != prev_val)\n      {\n         val *= (gen.max)();\n         prev_val = val;\n         val += gen();\n      }\n      int e;\n      val = frexp(val, &e);\n\n      typedef typename U::backend_type::exponent_type        e_type;\n      static boost::random::uniform_int_distribution<e_type> ui(-30, 30);\n      return ldexp(val, static_cast<int>(ui(gen)));\n   }\n   template <class U>\n   U generate_random(const std::integral_constant<int, boost::multiprecision::number_kind_integer>&)\n   {\n      typedef boost::random::mt19937::result_type random_type;\n\n      U        max_val;\n      unsigned digits;\n      if (std::numeric_limits<U>::is_bounded)\n      {\n         max_val = (std::numeric_limits<U>::max)();\n         digits  = std::numeric_limits<U>::digits;\n      }\n      else\n      {\n         max_val = U(1) << bits_wanted;\n         digits  = bits_wanted;\n      }\n\n      unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n      while ((random_type(1) << bits_per_r_val) > (gen.max)())\n         --bits_per_r_val;\n\n      unsigned terms_needed = digits / bits_per_r_val + 1;\n\n      U val = 0;\n      for (unsigned i = 0; i < terms_needed; ++i)\n      {\n         val *= (gen.max)();\n         val += gen();\n      }\n      val %= max_val;\n      return val;\n   }\n   template <class U>\n   U generate_random(const std::integral_constant<int, boost::multiprecision::number_kind_rational>&)\n   {\n      typedef boost::random::mt19937::result_type                     random_type;\n      typedef typename boost::multiprecision::component_type<U>::type IntType;\n\n      IntType  max_val;\n      unsigned digits;\n      if (std::numeric_limits<IntType>::is_bounded)\n      {\n         max_val = (std::numeric_limits<IntType>::max)();\n         digits  = std::numeric_limits<IntType>::digits;\n      }\n      else\n      {\n         max_val = IntType(1) << bits_wanted;\n         digits  = bits_wanted;\n      }\n\n      unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n      while ((random_type(1) << bits_per_r_val) > (gen.max)())\n         --bits_per_r_val;\n\n      unsigned terms_needed = digits / bits_per_r_val + 1;\n\n      IntType val   = 0;\n      IntType denom = 0;\n      for (unsigned i = 0; i < terms_needed; ++i)\n      {\n         val *= (gen.max)();\n         val += gen();\n      }\n      for (unsigned i = 0; i < terms_needed; ++i)\n      {\n         denom *= (gen.max)();\n         denom += gen();\n      }\n      if (denom == 0)\n         denom = 1;\n      val %= max_val;\n      denom %= max_val;\n      return U(val, denom);\n   }\n\n   template <class U>\n   const std::vector<U>& get_hetero_test_vector()\n   {\n      static std::vector<U> result;\n      while (result.size() < a.size())\n      {\n         result.push_back(generate_random<U>(std::integral_constant<int, boost::multiprecision::number_category<U>::value>()));\n      }\n      return result;\n   }\n\n   std::vector<T>                a, b, c, small;\n   static boost::random::mt19937 gen;\n};\n\ntemplate <class N, int V>\nboost::random::mt19937 tester<N, V>::gen;\n\ninline const char* category_name(const std::integral_constant<int, boost::multiprecision::number_kind_integer>&)\n{\n   return \"integer\";\n}\ninline const char* category_name(const std::integral_constant<int, boost::multiprecision::number_kind_floating_point>&)\n{\n   return \"float\";\n}\ninline const char* category_name(const std::integral_constant<int, boost::multiprecision::number_kind_rational>&)\n{\n   return \"rational\";\n}\n\n//\n// Keys in order are:\n// Category\n// Operator\n// Type\n// Precision\n// Time\n//\nextern std::map<std::string, std::map<std::string, std::map<std::string, std::map<int, double> > > > result_table;\n\ninline void report_result(const char* cat, const char* type, const char* op, unsigned precision, double time)\n{\n   std::cout << std::left << std::setw(15) << type << std::setw(10) << precision << std::setw(35) << op << time << std::endl;\n   result_table[cat][op][type][precision] = time;\n}\n\ntemplate <class Number, int N>\nvoid test_int_ops(tester<Number, N>& t, const char* type, unsigned precision, const std::integral_constant<int, boost::multiprecision::number_kind_integer>&)\n{\n   const char* cat = \"integer\";\n   report_result(cat, type, \"%\", precision, t.test_mod());\n   report_result(cat, type, \"|\", precision, t.test_or());\n   report_result(cat, type, \"&\", precision, t.test_and());\n   report_result(cat, type, \"^\", precision, t.test_xor());\n   //report_result(cat, type, \"~\", precision, t.test_complement());\n   report_result(cat, type, \"<<\", precision, t.test_left_shift());\n   report_result(cat, type, \">>\", precision, t.test_right_shift());\n   // integer ops:\n   report_result(cat, type, \"%(int)\", precision, t.test_mod_int());\n   report_result(cat, type, \"|(int)\", precision, t.test_or_int());\n   report_result(cat, type, \"&(int)\", precision, t.test_and_int());\n   report_result(cat, type, \"^(int)\", precision, t.test_xor_int());\n   report_result(cat, type, \"gcd\", precision, t.test_gcd());\n   if(precision <= 1024)\n      report_result(cat, type, \"powm\", precision, t.test_powm());\n}\ntemplate <class Number, int N, class U>\nvoid test_int_ops(tester<Number, N>&, const char*, unsigned, const U&)\n{\n}\n\ntemplate <class Number, int N, class U>\nvoid test_related_ops(tester<Number, N>& t, const char* type, unsigned precision, const U&, const char* cat)\n{\n   report_result(cat, type, \"+(value_type)\", precision, t.template test_add_hetero<U>());\n   report_result(cat, type, \"-(value_type)\", precision, t.template test_subtract_hetero<U>());\n   report_result(cat, type, \"*(value_type)\", precision, t.template test_multiply_hetero<U>());\n   report_result(cat, type, \"/(value_type)\", precision, t.template test_divide_hetero<U>());\n   report_result(cat, type, \"+=(value_type)\", precision, t.template test_inplace_add_hetero<U>());\n   report_result(cat, type, \"-=(value_type)\", precision, t.template test_inplace_subtract_hetero<U>());\n   report_result(cat, type, \"*=(value_type)\", precision, t.template test_inplace_multiply_hetero<U>());\n   report_result(cat, type, \"/=(value_type)\", precision, t.template test_inplace_divide_hetero<U>());\n}\ntemplate <class Number, int N>\nvoid test_related_ops(tester<Number, N>& t, const char* type, unsigned precision, const Number&, const char* cat)\n{\n}\n\ntemplate <class Number>\nvoid test(const char* type, unsigned precision)\n{\n   bits_wanted = precision;\n   tester<Number, boost::multiprecision::number_category<Number>::value> t;\n   const char*                                                           cat = category_name(typename boost::multiprecision::number_category<Number>::type());\n   //\n   // call t.test_multiply() first so that the destination operands are\n   // forced to perform whatever memory allocation may be needed.  That way\n   // we measure only algorithm performance, and not memory allocation effects.\n   //\n   t.test_multiply();\n   //\n   // Now the actual tests:\n   //\n#ifndef TEST_MUL_ONLY\n   report_result(cat, type, \"+\", precision, t.test_add());\n   report_result(cat, type, \"-\", precision, t.test_subtract());\n#endif\n   report_result(cat, type, \"*\", precision, t.test_multiply());\n#ifndef TEST_MUL_ONLY\n   report_result(cat, type, \"/\", precision, t.test_divide());\n   report_result(cat, type, \"str\", precision, t.test_str());\n   // integer ops:\n   report_result(cat, type, \"+(int)\", precision, t.test_add_int());\n   report_result(cat, type, \"-(int)\", precision, t.test_subtract_int());\n   report_result(cat, type, \"*(int)\", precision, t.test_multiply_int());\n   report_result(cat, type, \"/(int)\", precision, t.test_divide_int());\n   // construction and destruction:\n   report_result(cat, type, \"construct\", precision, t.test_construct());\n   report_result(cat, type, \"construct(unsigned)\", precision, t.test_construct_unsigned());\n   report_result(cat, type, \"construct(unsigned long long)\", precision, t.test_construct_unsigned_ll());\n   test_int_ops(t, type, precision, typename boost::multiprecision::number_category<Number>::type());\n   test_related_ops(t, type, precision, typename Number::value_type(), cat);\n   // Hetero ops:\n   report_result(cat, type, \"+(unsigned long long)\", precision, t.template test_add_hetero<unsigned long long>());\n   report_result(cat, type, \"-(unsigned long long)\", precision, t.template test_subtract_hetero<unsigned long long>());\n   report_result(cat, type, \"*(unsigned long long)\", precision, t.template test_multiply_hetero<unsigned long long>());\n   report_result(cat, type, \"/(unsigned long long)\", precision, t.template test_divide_hetero<unsigned long long>());\n   report_result(cat, type, \"+=(unsigned long long)\", precision, t.template test_inplace_add_hetero<unsigned long long>());\n   report_result(cat, type, \"-=(unsigned long long)\", precision, t.template test_inplace_subtract_hetero<unsigned long long>());\n   report_result(cat, type, \"*=(unsigned long long)\", precision, t.template test_inplace_multiply_hetero<unsigned long long>());\n   report_result(cat, type, \"/=(unsigned long long)\", precision, t.template test_inplace_divide_hetero<unsigned long long>());\n#endif\n}\n\nvoid test01();\nvoid test02();\nvoid test03();\nvoid test04();\nvoid test05();\nvoid test06();\nvoid test07();\nvoid test08();\nvoid test09();\nvoid test10();\nvoid test11();\nvoid test12();\nvoid test13();\nvoid test14();\nvoid test15();\nvoid test16();\nvoid test17();\nvoid test18();\nvoid test19();\nvoid test20();\nvoid test21();\nvoid test22();\nvoid test23();\nvoid test24();\nvoid test25();\nvoid test26();\nvoid test27();\nvoid test28();\nvoid test29();\nvoid test30();\nvoid test31();\nvoid test32();\nvoid test33();\nvoid test34();\nvoid test35();\nvoid test36();\nvoid test37();\nvoid test38();\nvoid test39();\nvoid test40();\nvoid test41();\nvoid test42();\nvoid test43();\nvoid test44();\nvoid test45();\nvoid test46();\nvoid test47();\nvoid test48();\nvoid test49();\nvoid test50();\nvoid test51();\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test.log",
    "content": "[table:platform Platform Details\n[[Platform][[[Compiler][GNU C++ version 10.3.0]]\n[[GMP][6.2.0]]\n[[MPFR][262146]]\n[[Boost][107800]]\n[[Run date][Sep 30 2021]]\n]\n\ngmp_float      50        +                                  0.0183555\ngmp_float      50        -                                  0.0136532\ngmp_float      50        *                                  0.02086\ngmp_float      50        /                                  0.101766\ngmp_float      50        str                                0.000493989\ngmp_float      50        +(int)                             0.00443909\ngmp_float      50        -(int)                             0.0134294\ngmp_float      50        *(int)                             0.00513201\ngmp_float      50        /(int)                             0.0243611\ngmp_float      50        construct                          0.0232445\ngmp_float      50        construct(unsigned)                0.0299395\ngmp_float      50        construct(unsigned long long)      0.0258903\ngmp_float      50        +(unsigned long long)              0.0051023\ngmp_float      50        -(unsigned long long)              0.0113255\ngmp_float      50        *(unsigned long long)              0.0128361\ngmp_float      50        /(unsigned long long)              0.0179778\ngmp_float      50        +=(unsigned long long)             0.0164496\ngmp_float      50        -=(unsigned long long)             0.0148782\ngmp_float      50        *=(unsigned long long)             0.00765054\ngmp_float      50        /=(unsigned long long)             0.0195279\ngmp_float      100       +                                  0.0130366\ngmp_float      100       -                                  0.0192537\ngmp_float      100       *                                  0.0257348\ngmp_float      100       /                                  0.138938\ngmp_float      100       str                                0.00109572\ngmp_float      100       +(int)                             0.00626549\ngmp_float      100       -(int)                             0.0119272\ngmp_float      100       *(int)                             0.00558264\ngmp_float      100       /(int)                             0.0220741\ngmp_float      100       construct                          0.0242744\ngmp_float      100       construct(unsigned)                0.0252132\ngmp_float      100       construct(unsigned long long)      0.0209379\ngmp_float      100       +(unsigned long long)              0.00778526\ngmp_float      100       -(unsigned long long)              0.0194584\ngmp_float      100       *(unsigned long long)              0.00599344\ngmp_float      100       /(unsigned long long)              0.0233296\ngmp_float      100       +=(unsigned long long)             0.0137783\ngmp_float      100       -=(unsigned long long)             0.0221136\ngmp_float      100       *=(unsigned long long)             0.00979552\ngmp_float      100       /=(unsigned long long)             0.032907\ngmp_float      500       +                                  0.0273382\ngmp_float      500       -                                  0.0260432\ngmp_float      500       *                                  0.292919\ngmp_float      500       /                                  0.430233\ngmp_float      500       str                                0.00345598\ngmp_float      500       +(int)                             0.0120673\ngmp_float      500       -(int)                             0.0272281\ngmp_float      500       *(int)                             0.0211042\ngmp_float      500       /(int)                             0.0784889\ngmp_float      500       construct                          0.0885159\ngmp_float      500       construct(unsigned)                0.0829907\ngmp_float      500       construct(unsigned long long)      0.0914671\ngmp_float      500       +(unsigned long long)              0.0111554\ngmp_float      500       -(unsigned long long)              0.026385\ngmp_float      500       *(unsigned long long)              0.0219284\ngmp_float      500       /(unsigned long long)              0.0704423\ngmp_float      500       +=(unsigned long long)             0.0172751\ngmp_float      500       -=(unsigned long long)             0.0300017\ngmp_float      500       *=(unsigned long long)             0.0296053\ngmp_float      500       /=(unsigned long long)             0.076721\ngmp_int        128       +                                  0.00515104\ngmp_int        128       -                                  0.00664573\ngmp_int        128       *                                  0.00560549\ngmp_int        128       /                                  0.04667\ngmp_int        128       str                                0.000178807\ngmp_int        128       +(int)                             0.00347405\ngmp_int        128       -(int)                             0.00363988\ngmp_int        128       *(int)                             0.00473426\ngmp_int        128       /(int)                             0.0115696\ngmp_int        128       construct                          0.00329962\ngmp_int        128       construct(unsigned)                0.0241048\ngmp_int        128       construct(unsigned long long)      0.0245077\ngmp_int        128       %                                  0.0466966\ngmp_int        128       |                                  0.00437203\ngmp_int        128       &                                  0.00394167\ngmp_int        128       ^                                  0.0048846\ngmp_int        128       <<                                 0.00538874\ngmp_int        128       >>                                 0.00242687\ngmp_int        128       %(int)                             0.0118703\ngmp_int        128       |(int)                             0.010008\ngmp_int        128       &(int)                             0.0148993\ngmp_int        128       ^(int)                             0.0106263\ngmp_int        128       gcd                                0.170154\ngmp_int        128       powm                               0.0381833\ngmp_int        128       +(unsigned long long)              0.00470432\ngmp_int        128       -(unsigned long long)              0.00866778\ngmp_int        128       *(unsigned long long)              0.00371188\ngmp_int        128       /(unsigned long long)              0.00955921\ngmp_int        128       +=(unsigned long long)             0.00987134\ngmp_int        128       -=(unsigned long long)             0.00635455\ngmp_int        128       *=(unsigned long long)             0.00560359\ngmp_int        128       /=(unsigned long long)             0.0134478\ngmp_int        256       +                                  0.00997612\ngmp_int        256       -                                  0.0128659\ngmp_int        256       *                                  0.0134261\ngmp_int        256       /                                  0.0571824\ngmp_int        256       str                                0.000224466\ngmp_int        256       +(int)                             0.0033482\ngmp_int        256       -(int)                             0.00382312\ngmp_int        256       *(int)                             0.0112929\ngmp_int        256       /(int)                             0.0171517\ngmp_int        256       construct                          0.0037155\ngmp_int        256       construct(unsigned)                0.0227529\ngmp_int        256       construct(unsigned long long)      0.020762\ngmp_int        256       %                                  0.0514059\ngmp_int        256       |                                  0.00480677\ngmp_int        256       &                                  0.00417321\ngmp_int        256       ^                                  0.00693092\ngmp_int        256       <<                                 0.00869801\ngmp_int        256       >>                                 0.0022372\ngmp_int        256       %(int)                             0.0148079\ngmp_int        256       |(int)                             0.0103284\ngmp_int        256       &(int)                             0.00947844\ngmp_int        256       ^(int)                             0.0160125\ngmp_int        256       gcd                                0.761472\ngmp_int        256       powm                               0.152912\ngmp_int        256       +(unsigned long long)              0.00509394\ngmp_int        256       -(unsigned long long)              0.0049585\ngmp_int        256       *(unsigned long long)              0.00456418\ngmp_int        256       /(unsigned long long)              0.0152731\ngmp_int        256       +=(unsigned long long)             0.00672804\ngmp_int        256       -=(unsigned long long)             0.00828179\ngmp_int        256       *=(unsigned long long)             0.00858963\ngmp_int        256       /=(unsigned long long)             0.0221032\ngmp_int        512       +                                  0.0130487\ngmp_int        512       -                                  0.0102195\ngmp_int        512       *                                  0.0300231\ngmp_int        512       /                                  0.0796599\ngmp_int        512       str                                0.00061628\ngmp_int        512       +(int)                             0.00425087\ngmp_int        512       -(int)                             0.00424793\ngmp_int        512       *(int)                             0.00578859\ngmp_int        512       /(int)                             0.0232057\ngmp_int        512       construct                          0.00624925\ngmp_int        512       construct(unsigned)                0.0183369\ngmp_int        512       construct(unsigned long long)      0.0202006\ngmp_int        512       %                                  0.0722958\ngmp_int        512       |                                  0.00628228\ngmp_int        512       &                                  0.00524347\ngmp_int        512       ^                                  0.00615531\ngmp_int        512       <<                                 0.00888006\ngmp_int        512       >>                                 0.00238226\ngmp_int        512       %(int)                             0.024264\ngmp_int        512       |(int)                             0.0247852\ngmp_int        512       &(int)                             0.013507\ngmp_int        512       ^(int)                             0.0173321\ngmp_int        512       gcd                                1.62139\ngmp_int        512       powm                               0.766677\ngmp_int        512       +(unsigned long long)              0.00595229\ngmp_int        512       -(unsigned long long)              0.00592785\ngmp_int        512       *(unsigned long long)              0.00637276\ngmp_int        512       /(unsigned long long)              0.0244044\ngmp_int        512       +=(unsigned long long)             0.00868995\ngmp_int        512       -=(unsigned long long)             0.00847054\ngmp_int        512       *=(unsigned long long)             0.00977523\ngmp_int        512       /=(unsigned long long)             0.0334445\ngmp_int        1024      +                                  0.00971031\ngmp_int        1024      -                                  0.0105533\ngmp_int        1024      *                                  0.100546\ngmp_int        1024      /                                  0.0881567\ngmp_int        1024      str                                0.000778966\ngmp_int        1024      +(int)                             0.0064494\ngmp_int        1024      -(int)                             0.00561665\ngmp_int        1024      *(int)                             0.00931559\ngmp_int        1024      /(int)                             0.0422461\ngmp_int        1024      construct                          0.00336255\ngmp_int        1024      construct(unsigned)                0.0181871\ngmp_int        1024      construct(unsigned long long)      0.0188747\ngmp_int        1024      %                                  0.0918952\ngmp_int        1024      |                                  0.00861647\ngmp_int        1024      &                                  0.00800121\ngmp_int        1024      ^                                  0.00963503\ngmp_int        1024      <<                                 0.0193064\ngmp_int        1024      >>                                 0.00454358\ngmp_int        1024      %(int)                             0.0257336\ngmp_int        1024      |(int)                             0.0135159\ngmp_int        1024      &(int)                             0.0102081\ngmp_int        1024      ^(int)                             0.0156309\ngmp_int        1024      gcd                                3.48358\ngmp_int        1024      powm                               5.14976\ngmp_int        1024      +(unsigned long long)              0.00802101\ngmp_int        1024      -(unsigned long long)              0.00806262\ngmp_int        1024      *(unsigned long long)              0.0102277\ngmp_int        1024      /(unsigned long long)              0.042466\ngmp_int        1024      +=(unsigned long long)             0.0154667\ngmp_int        1024      -=(unsigned long long)             0.0106078\ngmp_int        1024      *=(unsigned long long)             0.0134989\ngmp_int        1024      /=(unsigned long long)             0.0405622\ncpp_int(fixed) 128       +                                  0.000877268\ncpp_int(fixed) 128       -                                  0.00192988\ncpp_int(fixed) 128       *                                  0.00116759\ncpp_int(fixed) 128       /                                  0.0273912\ncpp_int(fixed) 128       str                                0.00084634\ncpp_int(fixed) 128       +(int)                             0.000698051\ncpp_int(fixed) 128       -(int)                             0.00113016\ncpp_int(fixed) 128       *(int)                             0.000662467\ncpp_int(fixed) 128       /(int)                             0.0147198\ncpp_int(fixed) 128       construct                          0.000587582\ncpp_int(fixed) 128       construct(unsigned)                0.000872038\ncpp_int(fixed) 128       construct(unsigned long long)      0.000903049\ncpp_int(fixed) 128       %                                  0.0318553\ncpp_int(fixed) 128       |                                  0.0043918\ncpp_int(fixed) 128       &                                  0.00358104\ncpp_int(fixed) 128       ^                                  0.00360758\ncpp_int(fixed) 128       <<                                 0.00116939\ncpp_int(fixed) 128       >>                                 0.000934446\ncpp_int(fixed) 128       %(int)                             0.0172916\ncpp_int(fixed) 128       |(int)                             0.00380628\ncpp_int(fixed) 128       &(int)                             0.0038455\ncpp_int(fixed) 128       ^(int)                             0.00371059\ncpp_int(fixed) 128       gcd                                0.621889\ncpp_int(fixed) 128       powm                               0.35895\ncpp_int(fixed) 128       +(unsigned long long)              0.000900057\ncpp_int(fixed) 128       -(unsigned long long)              0.00114855\ncpp_int(fixed) 128       *(unsigned long long)              0.000745744\ncpp_int(fixed) 128       /(unsigned long long)              0.0169001\ncpp_int(fixed) 128       +=(unsigned long long)             0.000869555\ncpp_int(fixed) 128       -=(unsigned long long)             0.000954108\ncpp_int(fixed) 128       *=(unsigned long long)             0.000832044\ncpp_int(fixed) 128       /=(unsigned long long)             0.0226255\ncpp_int(fixed) 256       +                                  0.00687102\ncpp_int(fixed) 256       -                                  0.010289\ncpp_int(fixed) 256       *                                  0.0237359\ncpp_int(fixed) 256       /                                  0.098585\ncpp_int(fixed) 256       str                                0.000401216\ncpp_int(fixed) 256       +(int)                             0.00578118\ncpp_int(fixed) 256       -(int)                             0.00482789\ncpp_int(fixed) 256       *(int)                             0.00648519\ncpp_int(fixed) 256       /(int)                             0.0744498\ncpp_int(fixed) 256       construct                          0.00243004\ncpp_int(fixed) 256       construct(unsigned)                0.0026667\ncpp_int(fixed) 256       construct(unsigned long long)      0.00253319\ncpp_int(fixed) 256       %                                  0.0663805\ncpp_int(fixed) 256       |                                  0.00661838\ncpp_int(fixed) 256       &                                  0.00641591\ncpp_int(fixed) 256       ^                                  0.00686442\ncpp_int(fixed) 256       <<                                 0.00844969\ncpp_int(fixed) 256       >>                                 0.0146615\ncpp_int(fixed) 256       %(int)                             0.0247468\ncpp_int(fixed) 256       |(int)                             0.00552682\ncpp_int(fixed) 256       &(int)                             0.00630453\ncpp_int(fixed) 256       ^(int)                             0.0073244\ncpp_int(fixed) 256       gcd                                1.35865\ncpp_int(fixed) 256       powm                               1.53516\ncpp_int(fixed) 256       +(unsigned long long)              0.00648945\ncpp_int(fixed) 256       -(unsigned long long)              0.00515424\ncpp_int(fixed) 256       *(unsigned long long)              0.00489332\ncpp_int(fixed) 256       /(unsigned long long)              0.0548884\ncpp_int(fixed) 256       +=(unsigned long long)             0.00906799\ncpp_int(fixed) 256       -=(unsigned long long)             0.00513296\ncpp_int(fixed) 256       *=(unsigned long long)             0.00472864\ncpp_int(fixed) 256       /=(unsigned long long)             0.0691018\ncpp_int(fixed) 512       +                                  0.0237507\ncpp_int(fixed) 512       -                                  0.00921062\ncpp_int(fixed) 512       *                                  0.047591\ncpp_int(fixed) 512       /                                  0.169344\ncpp_int(fixed) 512       str                                0.00103815\ncpp_int(fixed) 512       +(int)                             0.00668085\ncpp_int(fixed) 512       -(int)                             0.00531307\ncpp_int(fixed) 512       *(int)                             0.0088359\ncpp_int(fixed) 512       /(int)                             0.141253\ncpp_int(fixed) 512       construct                          0.00375174\ncpp_int(fixed) 512       construct(unsigned)                0.00400614\ncpp_int(fixed) 512       construct(unsigned long long)      0.00399907\ncpp_int(fixed) 512       %                                  0.0966394\ncpp_int(fixed) 512       |                                  0.00825362\ncpp_int(fixed) 512       &                                  0.0089337\ncpp_int(fixed) 512       ^                                  0.00927498\ncpp_int(fixed) 512       <<                                 0.0173029\ncpp_int(fixed) 512       >>                                 0.0155169\ncpp_int(fixed) 512       %(int)                             0.0688759\ncpp_int(fixed) 512       |(int)                             0.00775532\ncpp_int(fixed) 512       &(int)                             0.00845281\ncpp_int(fixed) 512       ^(int)                             0.00792226\ncpp_int(fixed) 512       gcd                                3.28597\ncpp_int(fixed) 512       powm                               8.07714\ncpp_int(fixed) 512       +(unsigned long long)              0.008261\ncpp_int(fixed) 512       -(unsigned long long)              0.00726552\ncpp_int(fixed) 512       *(unsigned long long)              0.00764018\ncpp_int(fixed) 512       /(unsigned long long)              0.135566\ncpp_int(fixed) 512       +=(unsigned long long)             0.00681593\ncpp_int(fixed) 512       -=(unsigned long long)             0.00597589\ncpp_int(fixed) 512       *=(unsigned long long)             0.00714494\ncpp_int(fixed) 512       /=(unsigned long long)             0.133354\ncpp_int(fixed) 1024      +                                  0.0184876\ncpp_int(fixed) 1024      -                                  0.0162226\ncpp_int(fixed) 1024      *                                  0.153461\ncpp_int(fixed) 1024      /                                  0.327451\ncpp_int(fixed) 1024      str                                0.00335647\ncpp_int(fixed) 1024      +(int)                             0.0123052\ncpp_int(fixed) 1024      -(int)                             0.0190533\ncpp_int(fixed) 1024      *(int)                             0.0211192\ncpp_int(fixed) 1024      /(int)                             0.277366\ncpp_int(fixed) 1024      construct                          0.00893771\ncpp_int(fixed) 1024      construct(unsigned)                0.00981681\ncpp_int(fixed) 1024      construct(unsigned long long)      0.0096748\ncpp_int(fixed) 1024      %                                  0.181883\ncpp_int(fixed) 1024      |                                  0.0148123\ncpp_int(fixed) 1024      &                                  0.019269\ncpp_int(fixed) 1024      ^                                  0.0172541\ncpp_int(fixed) 1024      <<                                 0.0299716\ncpp_int(fixed) 1024      >>                                 0.0222922\ncpp_int(fixed) 1024      %(int)                             0.111133\ncpp_int(fixed) 1024      |(int)                             0.0122062\ncpp_int(fixed) 1024      &(int)                             0.0225444\ncpp_int(fixed) 1024      ^(int)                             0.0160789\ncpp_int(fixed) 1024      gcd                                6.8044\ncpp_int(fixed) 1024      powm                               43.7564\ncpp_int(fixed) 1024      +(unsigned long long)              0.0125768\ncpp_int(fixed) 1024      -(unsigned long long)              0.0126235\ncpp_int(fixed) 1024      *(unsigned long long)              0.0157115\ncpp_int(fixed) 1024      /(unsigned long long)              0.2702\ncpp_int(fixed) 1024      +=(unsigned long long)             0.00638493\ncpp_int(fixed) 1024      -=(unsigned long long)             0.00748462\ncpp_int(fixed) 1024      *=(unsigned long long)             0.0134446\ncpp_int(fixed) 1024      /=(unsigned long long)             0.268888\ncpp_int        128       +                                  0.0086037\ncpp_int        128       -                                  0.00859678\ncpp_int        128       *                                  0.0145016\ncpp_int        128       /                                  0.0878919\ncpp_int        128       str                                0.000264092\ncpp_int        128       +(int)                             0.00534018\ncpp_int        128       -(int)                             0.00347144\ncpp_int        128       *(int)                             0.0072726\ncpp_int        128       /(int)                             0.0520677\ncpp_int        128       construct                          0.00190752\ncpp_int        128       construct(unsigned)                0.00174712\ncpp_int        128       construct(unsigned long long)      0.00192028\ncpp_int        128       %                                  0.0481508\ncpp_int        128       |                                  0.00991773\ncpp_int        128       &                                  0.0101034\ncpp_int        128       ^                                  0.0101384\ncpp_int        128       <<                                 0.0116142\ncpp_int        128       >>                                 0.011709\ncpp_int        128       %(int)                             0.00790481\ncpp_int        128       |(int)                             0.00805945\ncpp_int        128       &(int)                             0.0124861\ncpp_int        128       ^(int)                             0.00991885\ncpp_int        128       gcd                                0.358587\ncpp_int        128       powm                               0.565871\ncpp_int        128       +(unsigned long long)              0.00893714\ncpp_int        128       -(unsigned long long)              0.00807189\ncpp_int        128       *(unsigned long long)              0.00669928\ncpp_int        128       /(unsigned long long)              0.0582351\ncpp_int        128       +=(unsigned long long)             0.0106404\ncpp_int        128       -=(unsigned long long)             0.0103583\ncpp_int        128       *=(unsigned long long)             0.0131299\ncpp_int        128       /=(unsigned long long)             0.0701172\ncpp_int        256       +                                  0.0160922\ncpp_int        256       -                                  0.013219\ncpp_int        256       *                                  0.0246772\ncpp_int        256       /                                  0.181536\ncpp_int        256       str                                0.000644609\ncpp_int        256       +(int)                             0.0063589\ncpp_int        256       -(int)                             0.00531251\ncpp_int        256       *(int)                             0.00991594\ncpp_int        256       /(int)                             0.108097\ncpp_int        256       construct                          0.00258002\ncpp_int        256       construct(unsigned)                0.00225895\ncpp_int        256       construct(unsigned long long)      0.00200418\ncpp_int        256       %                                  0.0825917\ncpp_int        256       |                                  0.00939722\ncpp_int        256       &                                  0.0128886\ncpp_int        256       ^                                  0.0282768\ncpp_int        256       <<                                 0.0147029\ncpp_int        256       >>                                 0.0153366\ncpp_int        256       %(int)                             0.0215141\ncpp_int        256       |(int)                             0.0119795\ncpp_int        256       &(int)                             0.0114113\ncpp_int        256       ^(int)                             0.0115174\ncpp_int        256       gcd                                1.42989\ncpp_int        256       powm                               2.0199\ncpp_int        256       +(unsigned long long)              0.0136811\ncpp_int        256       -(unsigned long long)              0.00922027\ncpp_int        256       *(unsigned long long)              0.00820918\ncpp_int        256       /(unsigned long long)              0.0982056\ncpp_int        256       +=(unsigned long long)             0.00996803\ncpp_int        256       -=(unsigned long long)             0.0102937\ncpp_int        256       *=(unsigned long long)             0.00790233\ncpp_int        256       /=(unsigned long long)             0.105309\ncpp_int        512       +                                  0.0131305\ncpp_int        512       -                                  0.0117779\ncpp_int        512       *                                  0.0631704\ncpp_int        512       /                                  0.250544\ncpp_int        512       str                                0.00141073\ncpp_int        512       +(int)                             0.00666443\ncpp_int        512       -(int)                             0.00548206\ncpp_int        512       *(int)                             0.0194072\ncpp_int        512       /(int)                             0.193637\ncpp_int        512       construct                          0.00248269\ncpp_int        512       construct(unsigned)                0.00241092\ncpp_int        512       construct(unsigned long long)      0.00223886\ncpp_int        512       %                                  0.127209\ncpp_int        512       |                                  0.012635\ncpp_int        512       &                                  0.018172\ncpp_int        512       ^                                  0.0139063\ncpp_int        512       <<                                 0.0238748\ncpp_int        512       >>                                 0.0209131\ncpp_int        512       %(int)                             0.065874\ncpp_int        512       |(int)                             0.012189\ncpp_int        512       &(int)                             0.0179186\ncpp_int        512       ^(int)                             0.0198209\ncpp_int        512       gcd                                3.30534\ncpp_int        512       powm                               9.06469\ncpp_int        512       +(unsigned long long)              0.0102989\ncpp_int        512       -(unsigned long long)              0.00830959\ncpp_int        512       *(unsigned long long)              0.0119122\ncpp_int        512       /(unsigned long long)              0.151642\ncpp_int        512       +=(unsigned long long)             0.0108279\ncpp_int        512       -=(unsigned long long)             0.0103591\ncpp_int        512       *=(unsigned long long)             0.0119079\ncpp_int        512       /=(unsigned long long)             0.171387\ncpp_int        1024      +                                  0.0163002\ncpp_int        1024      -                                  0.0151597\ncpp_int        1024      *                                  0.224062\ncpp_int        1024      /                                  0.365546\ncpp_int        1024      str                                0.00383604\ncpp_int        1024      +(int)                             0.00836612\ncpp_int        1024      -(int)                             0.00759591\ncpp_int        1024      *(int)                             0.0214459\ncpp_int        1024      /(int)                             0.296939\ncpp_int        1024      construct                          0.00191598\ncpp_int        1024      construct(unsigned)                0.00177047\ncpp_int        1024      construct(unsigned long long)      0.00189442\ncpp_int        1024      %                                  0.171986\ncpp_int        1024      |                                  0.0152013\ncpp_int        1024      &                                  0.0204051\ncpp_int        1024      ^                                  0.0187085\ncpp_int        1024      <<                                 0.0394659\ncpp_int        1024      >>                                 0.0146098\ncpp_int        1024      %(int)                             0.1044\ncpp_int        1024      |(int)                             0.0134288\ncpp_int        1024      &(int)                             0.0262296\ncpp_int        1024      ^(int)                             0.0153479\ncpp_int        1024      gcd                                7.01715\ncpp_int        1024      powm                               46.9932\ncpp_int        1024      +(unsigned long long)              0.0115471\ncpp_int        1024      -(unsigned long long)              0.00988039\ncpp_int        1024      *(unsigned long long)              0.0175683\ncpp_int        1024      /(unsigned long long)              0.281298\ncpp_int        1024      +=(unsigned long long)             0.0131949\ncpp_int        1024      -=(unsigned long long)             0.0189898\ncpp_int        1024      *=(unsigned long long)             0.0203561\ncpp_int        1024      /=(unsigned long long)             0.299993\ncpp_rational   128       +                                  0.415006\ncpp_rational   128       -                                  0.471759\ncpp_rational   128       *                                  0.797425\ncpp_rational   128       /                                  2.28881\ncpp_rational   128       str                                0.00168424\ncpp_rational   128       +(int)                             0.0177811\ncpp_rational   128       -(int)                             0.0292894\ncpp_rational   128       *(int)                             0.0637195\ncpp_rational   128       /(int)                             0.035134\ncpp_rational   128       construct                          0.0135822\ncpp_rational   128       construct(unsigned)                0.00672081\ncpp_rational   128       construct(unsigned long long)      0.00806026\ncpp_rational   128       +(value_type)                      0.0265647\ncpp_rational   128       -(value_type)                      0.0408789\ncpp_rational   128       *(value_type)                      0.408791\ncpp_rational   128       /(value_type)                      0.431612\ncpp_rational   128       +=(value_type)                     0.0335896\ncpp_rational   128       -=(value_type)                     0.0421283\ncpp_rational   128       *=(value_type)                     0.40255\ncpp_rational   128       /=(value_type)                     0.40369\ncpp_rational   128       +(unsigned long long)              0.0177151\ncpp_rational   128       -(unsigned long long)              0.0296698\ncpp_rational   128       *(unsigned long long)              0.161844\ncpp_rational   128       /(unsigned long long)              0.170727\ncpp_rational   128       +=(unsigned long long)             0.0565983\ncpp_rational   128       -=(unsigned long long)             0.0366534\ncpp_rational   128       *=(unsigned long long)             0.211848\ncpp_rational   128       /=(unsigned long long)             0.216252\ncpp_rational   256       +                                  1.53458\ncpp_rational   256       -                                  1.52484\ncpp_rational   256       *                                  2.96998\ncpp_rational   256       /                                  6.34454\ncpp_rational   256       str                                0.0033367\ncpp_rational   256       +(int)                             0.0183744\ncpp_rational   256       -(int)                             0.0346718\ncpp_rational   256       *(int)                             0.0917847\ncpp_rational   256       /(int)                             0.0774619\ncpp_rational   256       construct                          0.00935293\ncpp_rational   256       construct(unsigned)                0.0064826\ncpp_rational   256       construct(unsigned long long)      0.00960336\ncpp_rational   256       +(value_type)                      0.0391054\ncpp_rational   256       -(value_type)                      0.0467416\ncpp_rational   256       *(value_type)                      0.600225\ncpp_rational   256       /(value_type)                      0.596248\ncpp_rational   256       +=(value_type)                     0.0422867\ncpp_rational   256       -=(value_type)                     0.0490152\ncpp_rational   256       *=(value_type)                     0.629302\ncpp_rational   256       /=(value_type)                     0.689514\ncpp_rational   256       +(unsigned long long)              0.0241089\ncpp_rational   256       -(unsigned long long)              0.0496956\ncpp_rational   256       *(unsigned long long)              0.240069\ncpp_rational   256       /(unsigned long long)              0.216019\ncpp_rational   256       +=(unsigned long long)             0.0371419\ncpp_rational   256       -=(unsigned long long)             0.0439181\ncpp_rational   256       *=(unsigned long long)             0.226179\ncpp_rational   256       /=(unsigned long long)             0.235781\ncpp_rational   512       +                                  3.41194\ncpp_rational   512       -                                  3.49648\ncpp_rational   512       *                                  6.73224\ncpp_rational   512       /                                  13.2036\ncpp_rational   512       str                                0.00662873\ncpp_rational   512       +(int)                             0.020452\ncpp_rational   512       -(int)                             0.035503\ncpp_rational   512       *(int)                             0.118274\ncpp_rational   512       /(int)                             0.104628\ncpp_rational   512       construct                          0.0083784\ncpp_rational   512       construct(unsigned)                0.00618635\ncpp_rational   512       construct(unsigned long long)      0.00769898\ncpp_rational   512       +(value_type)                      0.044067\ncpp_rational   512       -(value_type)                      0.0548939\ncpp_rational   512       *(value_type)                      0.803009\ncpp_rational   512       /(value_type)                      0.809662\ncpp_rational   512       +=(value_type)                     0.0564267\ncpp_rational   512       -=(value_type)                     0.053198\ncpp_rational   512       *=(value_type)                     0.8029\ncpp_rational   512       /=(value_type)                     0.832288\ncpp_rational   512       +(unsigned long long)              0.0297836\ncpp_rational   512       -(unsigned long long)              0.0461985\ncpp_rational   512       *(unsigned long long)              0.298935\ncpp_rational   512       /(unsigned long long)              0.292536\ncpp_rational   512       +=(unsigned long long)             0.0556987\ncpp_rational   512       -=(unsigned long long)             0.0491612\ncpp_rational   512       *=(unsigned long long)             0.319695\ncpp_rational   512       /=(unsigned long long)             0.314161\ncpp_rational   1024      +                                  8.04044\ncpp_rational   1024      -                                  7.71926\ncpp_rational   1024      *                                  14.4259\ncpp_rational   1024      /                                  29.3236\ncpp_rational   1024      str                                0.0174979\ncpp_rational   1024      +(int)                             0.0449351\ncpp_rational   1024      -(int)                             0.0577029\ncpp_rational   1024      *(int)                             0.218283\ncpp_rational   1024      /(int)                             0.207067\ncpp_rational   1024      construct                          0.00962697\ncpp_rational   1024      construct(unsigned)                0.00923644\ncpp_rational   1024      construct(unsigned long long)      0.0176689\ncpp_rational   1024      +(value_type)                      0.105801\ncpp_rational   1024      -(value_type)                      0.103471\ncpp_rational   1024      *(value_type)                      1.54645\ncpp_rational   1024      /(value_type)                      1.38001\ncpp_rational   1024      +=(value_type)                     0.0840696\ncpp_rational   1024      -=(value_type)                     0.0881228\ncpp_rational   1024      *=(value_type)                     1.37083\ncpp_rational   1024      /=(value_type)                     1.37478\ncpp_rational   1024      +(unsigned long long)              0.046594\ncpp_rational   1024      -(unsigned long long)              0.0581714\ncpp_rational   1024      *(unsigned long long)              0.448194\ncpp_rational   1024      /(unsigned long long)              0.435259\ncpp_rational   1024      +=(unsigned long long)             0.0662456\ncpp_rational   1024      -=(unsigned long long)             0.071761\ncpp_rational   1024      *=(unsigned long long)             0.485819\ncpp_rational   1024      /=(unsigned long long)             0.460033\nmpq_rational   128       +                                  0.188327\nmpq_rational   128       -                                  0.198113\nmpq_rational   128       *                                  0.398662\nmpq_rational   128       /                                  1.12509\nmpq_rational   128       str                                0.000272779\nmpq_rational   128       +(int)                             0.00859669\nmpq_rational   128       -(int)                             0.0119819\nmpq_rational   128       *(int)                             0.0338803\nmpq_rational   128       /(int)                             0.0650149\nmpq_rational   128       construct                          0.0195942\nmpq_rational   128       construct(unsigned)                0.0434929\nmpq_rational   128       construct(unsigned long long)      0.0392716\nmpq_rational   128       +(value_type)                      0.0207456\nmpq_rational   128       -(value_type)                      0.0241541\nmpq_rational   128       *(value_type)                      0.20698\nmpq_rational   128       /(value_type)                      0.236534\nmpq_rational   128       +=(value_type)                     0.0174923\nmpq_rational   128       -=(value_type)                     0.023896\nmpq_rational   128       *=(value_type)                     0.206213\nmpq_rational   128       /=(value_type)                     0.233487\nmpq_rational   128       +(unsigned long long)              0.0085503\nmpq_rational   128       -(unsigned long long)              0.0101037\nmpq_rational   128       *(unsigned long long)              0.100601\nmpq_rational   128       /(unsigned long long)              0.129932\nmpq_rational   128       +=(unsigned long long)             0.00775585\nmpq_rational   128       -=(unsigned long long)             0.00991947\nmpq_rational   128       *=(unsigned long long)             0.107424\nmpq_rational   128       /=(unsigned long long)             0.136121\nmpq_rational   256       +                                  0.776716\nmpq_rational   256       -                                  0.791584\nmpq_rational   256       *                                  1.50207\nmpq_rational   256       /                                  2.82848\nmpq_rational   256       str                                0.000434761\nmpq_rational   256       +(int)                             0.0101891\nmpq_rational   256       -(int)                             0.013618\nmpq_rational   256       *(int)                             0.0475114\nmpq_rational   256       /(int)                             0.0713565\nmpq_rational   256       construct                          0.0204126\nmpq_rational   256       construct(unsigned)                0.0485316\nmpq_rational   256       construct(unsigned long long)      0.0568506\nmpq_rational   256       +(value_type)                      0.0245401\nmpq_rational   256       -(value_type)                      0.030741\nmpq_rational   256       *(value_type)                      0.247956\nmpq_rational   256       /(value_type)                      0.270701\nmpq_rational   256       +=(value_type)                     0.0202988\nmpq_rational   256       -=(value_type)                     0.0240502\nmpq_rational   256       *=(value_type)                     0.241165\nmpq_rational   256       /=(value_type)                     0.269395\nmpq_rational   256       +(unsigned long long)              0.0104799\nmpq_rational   256       -(unsigned long long)              0.0117459\nmpq_rational   256       *(unsigned long long)              0.102844\nmpq_rational   256       /(unsigned long long)              0.131923\nmpq_rational   256       +=(unsigned long long)             0.00984535\nmpq_rational   256       -=(unsigned long long)             0.0117724\nmpq_rational   256       *=(unsigned long long)             0.103523\nmpq_rational   256       /=(unsigned long long)             0.137652\nmpq_rational   512       +                                  1.93921\nmpq_rational   512       -                                  1.98459\nmpq_rational   512       *                                  3.60314\nmpq_rational   512       /                                  6.22726\nmpq_rational   512       str                                0.00103828\nmpq_rational   512       +(int)                             0.014773\nmpq_rational   512       -(int)                             0.0238773\nmpq_rational   512       *(int)                             0.0548556\nmpq_rational   512       /(int)                             0.0961679\nmpq_rational   512       construct                          0.0221797\nmpq_rational   512       construct(unsigned)                0.0513108\nmpq_rational   512       construct(unsigned long long)      0.0695842\nmpq_rational   512       +(value_type)                      0.0348044\nmpq_rational   512       -(value_type)                      0.0417365\nmpq_rational   512       *(value_type)                      0.302865\nmpq_rational   512       /(value_type)                      0.329335\nmpq_rational   512       +=(value_type)                     0.0355556\nmpq_rational   512       -=(value_type)                     0.0287769\nmpq_rational   512       *=(value_type)                     0.282857\nmpq_rational   512       /=(value_type)                     0.333863\nmpq_rational   512       +(unsigned long long)              0.016419\nmpq_rational   512       -(unsigned long long)              0.0274924\nmpq_rational   512       *(unsigned long long)              0.158713\nmpq_rational   512       /(unsigned long long)              0.173528\nmpq_rational   512       +=(unsigned long long)             0.0204678\nmpq_rational   512       -=(unsigned long long)             0.0267879\nmpq_rational   512       *=(unsigned long long)             0.131194\nmpq_rational   512       /=(unsigned long long)             0.176279\nmpq_rational   1024      +                                  3.79923\nmpq_rational   1024      -                                  3.79396\nmpq_rational   1024      *                                  7.3374\nmpq_rational   1024      /                                  12.4178\nmpq_rational   1024      str                                0.00192772\nmpq_rational   1024      +(int)                             0.024704\nmpq_rational   1024      -(int)                             0.0295391\nmpq_rational   1024      *(int)                             0.0900656\nmpq_rational   1024      /(int)                             0.16035\nmpq_rational   1024      construct                          0.0277033\nmpq_rational   1024      construct(unsigned)                0.0533278\nmpq_rational   1024      construct(unsigned long long)      0.0650815\nmpq_rational   1024      +(value_type)                      0.0541719\nmpq_rational   1024      -(value_type)                      0.0478777\nmpq_rational   1024      *(value_type)                      0.332089\nmpq_rational   1024      /(value_type)                      0.355055\nmpq_rational   1024      +=(value_type)                     0.0453556\nmpq_rational   1024      -=(value_type)                     0.041857\nmpq_rational   1024      *=(value_type)                     0.31582\nmpq_rational   1024      /=(value_type)                     0.391409\nmpq_rational   1024      +(unsigned long long)              0.0270577\nmpq_rational   1024      -(unsigned long long)              0.040243\nmpq_rational   1024      *(unsigned long long)              0.16579\nmpq_rational   1024      /(unsigned long long)              0.246334\nmpq_rational   1024      +=(unsigned long long)             0.032877\nmpq_rational   1024      -=(unsigned long long)             0.0384444\nmpq_rational   1024      *=(unsigned long long)             0.179978\nmpq_rational   1024      /=(unsigned long long)             0.231505\ntommath_int    128       +                                  0.0119929\ntommath_int    128       -                                  0.0179911\ntommath_int    128       *                                  0.0198027\ntommath_int    128       /                                  1.11768\ntommath_int    128       str                                0.00299152\ntommath_int    128       +(int)                             0.0889366\ntommath_int    128       -(int)                             0.0917047\ntommath_int    128       *(int)                             0.103447\ntommath_int    128       /(int)                             0.69963\ntommath_int    128       construct                          0.147542\ntommath_int    128       construct(unsigned)                0.180915\ntommath_int    128       construct(unsigned long long)      0.165695\ntommath_int    128       %                                  0.874748\ntommath_int    128       |                                  0.00739324\ntommath_int    128       &                                  0.00780901\ntommath_int    128       ^                                  0.00825059\ntommath_int    128       <<                                 0.0126218\ntommath_int    128       >>                                 0.0959319\ntommath_int    128       %(int)                             0.545134\ntommath_int    128       |(int)                             0.0839291\ntommath_int    128       &(int)                             0.0965583\ntommath_int    128       ^(int)                             0.0968501\ntommath_int    128       gcd                                1.36458\ntommath_int    128       powm                               0.421869\ntommath_int    128       +(unsigned long long)              0.0907784\ntommath_int    128       -(unsigned long long)              0.0828488\ntommath_int    128       *(unsigned long long)              0.107341\ntommath_int    128       /(unsigned long long)              0.604848\ntommath_int    128       +=(unsigned long long)             0.0768906\ntommath_int    128       -=(unsigned long long)             0.0847801\ntommath_int    128       *=(unsigned long long)             0.0959064\ntommath_int    128       /=(unsigned long long)             0.619583\ntommath_int    256       +                                  0.00709542\ntommath_int    256       -                                  0.011194\ntommath_int    256       *                                  0.0326465\ntommath_int    256       /                                  0.989116\ntommath_int    256       str                                0.00597113\ntommath_int    256       +(int)                             0.0832749\ntommath_int    256       -(int)                             0.0820224\ntommath_int    256       *(int)                             0.0942242\ntommath_int    256       /(int)                             0.769191\ntommath_int    256       construct                          0.154596\ntommath_int    256       construct(unsigned)                0.190967\ntommath_int    256       construct(unsigned long long)      0.166489\ntommath_int    256       %                                  1.03711\ntommath_int    256       |                                  0.00891185\ntommath_int    256       &                                  0.00928657\ntommath_int    256       ^                                  0.0113947\ntommath_int    256       <<                                 0.0201243\ntommath_int    256       >>                                 0.0951565\ntommath_int    256       %(int)                             0.807325\ntommath_int    256       |(int)                             0.102949\ntommath_int    256       &(int)                             0.0990734\ntommath_int    256       ^(int)                             0.107261\ntommath_int    256       gcd                                3.38266\ntommath_int    256       powm                               1.29063\ntommath_int    256       +(unsigned long long)              0.0981367\ntommath_int    256       -(unsigned long long)              0.0941371\ntommath_int    256       *(unsigned long long)              0.109883\ntommath_int    256       /(unsigned long long)              0.876321\ntommath_int    256       +=(unsigned long long)             0.0951277\ntommath_int    256       -=(unsigned long long)             0.0957029\ntommath_int    256       *=(unsigned long long)             0.117129\ntommath_int    256       /=(unsigned long long)             0.964961\ntommath_int    512       +                                  0.0133422\ntommath_int    512       -                                  0.017801\ntommath_int    512       *                                  0.0847288\ntommath_int    512       /                                  1.38686\ntommath_int    512       str                                0.0190933\ntommath_int    512       +(int)                             0.0870848\ntommath_int    512       -(int)                             0.0820267\ntommath_int    512       *(int)                             0.0973642\ntommath_int    512       /(int)                             0.938285\ntommath_int    512       construct                          0.13579\ntommath_int    512       construct(unsigned)                0.157218\ntommath_int    512       construct(unsigned long long)      0.155821\ntommath_int    512       %                                  1.29969\ntommath_int    512       |                                  0.0112155\ntommath_int    512       &                                  0.0113032\ntommath_int    512       ^                                  0.0126854\ntommath_int    512       <<                                 0.0215291\ntommath_int    512       >>                                 0.0932504\ntommath_int    512       %(int)                             0.930702\ntommath_int    512       |(int)                             0.0775007\ntommath_int    512       &(int)                             0.0815778\ntommath_int    512       ^(int)                             0.079649\ntommath_int    512       gcd                                7.37824\ntommath_int    512       powm                               3.21051\ntommath_int    512       +(unsigned long long)              0.0860324\ntommath_int    512       -(unsigned long long)              0.0825755\ntommath_int    512       *(unsigned long long)              0.107907\ntommath_int    512       /(unsigned long long)              1.07209\ntommath_int    512       +=(unsigned long long)             0.0792569\ntommath_int    512       -=(unsigned long long)             0.0820388\ntommath_int    512       *=(unsigned long long)             0.114277\ntommath_int    512       /=(unsigned long long)             1.00956\ntommath_int    1024      +                                  0.0143218\ntommath_int    1024      -                                  0.0192393\ntommath_int    1024      *                                  0.168568\ntommath_int    1024      /                                  1.84837\ntommath_int    1024      str                                0.0582251\ntommath_int    1024      +(int)                             0.0809152\ntommath_int    1024      -(int)                             0.0915478\ntommath_int    1024      *(int)                             0.110883\ntommath_int    1024      /(int)                             1.48179\ntommath_int    1024      construct                          0.128148\ntommath_int    1024      construct(unsigned)                0.150237\ntommath_int    1024      construct(unsigned long long)      0.143768\ntommath_int    1024      %                                  1.75398\ntommath_int    1024      |                                  0.0160686\ntommath_int    1024      &                                  0.0244762\ntommath_int    1024      ^                                  0.0195826\ntommath_int    1024      <<                                 0.0361972\ntommath_int    1024      >>                                 0.0955953\ntommath_int    1024      %(int)                             1.36603\ntommath_int    1024      |(int)                             0.0767652\ntommath_int    1024      &(int)                             0.0869813\ntommath_int    1024      ^(int)                             0.0866224\ntommath_int    1024      gcd                                15.4317\ntommath_int    1024      powm                               12.628\ntommath_int    1024      +(unsigned long long)              0.0806864\ntommath_int    1024      -(unsigned long long)              0.0801335\ntommath_int    1024      *(unsigned long long)              0.118102\ntommath_int    1024      /(unsigned long long)              1.69916\ntommath_int    1024      +=(unsigned long long)             0.0929332\ntommath_int    1024      -=(unsigned long long)             0.100611\ntommath_int    1024      *=(unsigned long long)             0.152996\ntommath_int    1024      /=(unsigned long long)             1.68307\ncpp_dec_float  50        +                                  0.0198859\ncpp_dec_float  50        -                                  0.0194363\ncpp_dec_float  50        *                                  0.061884\ncpp_dec_float  50        /                                  0.83092\ncpp_dec_float  50        str                                0.00145276\ncpp_dec_float  50        +(int)                             0.0143136\ncpp_dec_float  50        -(int)                             0.0216737\ncpp_dec_float  50        *(int)                             0.0630393\ncpp_dec_float  50        /(int)                             0.40163\ncpp_dec_float  50        construct                          0.00383901\ncpp_dec_float  50        construct(unsigned)                0.00770653\ncpp_dec_float  50        construct(unsigned long long)      0.00840151\ncpp_dec_float  50        +(unsigned long long)              0.0231609\ncpp_dec_float  50        -(unsigned long long)              0.0248419\ncpp_dec_float  50        *(unsigned long long)              0.0745654\ncpp_dec_float  50        /(unsigned long long)              0.396014\ncpp_dec_float  50        +=(unsigned long long)             0.017568\ncpp_dec_float  50        -=(unsigned long long)             0.0249846\ncpp_dec_float  50        *=(unsigned long long)             0.0706828\ncpp_dec_float  50        /=(unsigned long long)             0.408938\ncpp_dec_float  100       +                                  0.0216812\ncpp_dec_float  100       -                                  0.0313385\ncpp_dec_float  100       *                                  0.130292\ncpp_dec_float  100       /                                  1.73437\ncpp_dec_float  100       str                                0.00180621\ncpp_dec_float  100       +(int)                             0.0169356\ncpp_dec_float  100       -(int)                             0.0263524\ncpp_dec_float  100       *(int)                             0.125171\ncpp_dec_float  100       /(int)                             0.861622\ncpp_dec_float  100       construct                          0.00443324\ncpp_dec_float  100       construct(unsigned)                0.00867913\ncpp_dec_float  100       construct(unsigned long long)      0.00854971\ncpp_dec_float  100       +(unsigned long long)              0.0292658\ncpp_dec_float  100       -(unsigned long long)              0.0287785\ncpp_dec_float  100       *(unsigned long long)              0.147631\ncpp_dec_float  100       /(unsigned long long)              0.991001\ncpp_dec_float  100       +=(unsigned long long)             0.0236933\ncpp_dec_float  100       -=(unsigned long long)             0.0396995\ncpp_dec_float  100       *=(unsigned long long)             0.172634\ncpp_dec_float  100       /=(unsigned long long)             1.27727\ncpp_dec_float  500       +                                  0.207727\ncpp_dec_float  500       -                                  0.21259\ncpp_dec_float  500       *                                  1.6902\ncpp_dec_float  500       /                                  22.744\ncpp_dec_float  500       str                                0.0109211\ncpp_dec_float  500       +(int)                             0.151114\ncpp_dec_float  500       -(int)                             0.14371\ncpp_dec_float  500       *(int)                             2.44271\ncpp_dec_float  500       /(int)                             12.8722\ncpp_dec_float  500       construct                          0.0256013\ncpp_dec_float  500       construct(unsigned)                0.0455813\ncpp_dec_float  500       construct(unsigned long long)      0.0429815\ncpp_dec_float  500       +(unsigned long long)              0.148942\ncpp_dec_float  500       -(unsigned long long)              0.150724\ncpp_dec_float  500       *(unsigned long long)              2.68446\ncpp_dec_float  500       /(unsigned long long)              14.1836\ncpp_dec_float  500       +=(unsigned long long)             0.186187\ncpp_dec_float  500       -=(unsigned long long)             0.199025\ncpp_dec_float  500       *=(unsigned long long)             2.40228\ncpp_dec_float  500       /=(unsigned long long)             10.9233\ncpp_bin_float  50        +                                  0.0479759\ncpp_bin_float  50        -                                  0.0688937\ncpp_bin_float  50        *                                  0.0720574\ncpp_bin_float  50        /                                  0.549759\ncpp_bin_float  50        str                                0.00301165\ncpp_bin_float  50        +(int)                             0.0524679\ncpp_bin_float  50        -(int)                             0.0848243\ncpp_bin_float  50        *(int)                             0.0399504\ncpp_bin_float  50        /(int)                             0.141651\ncpp_bin_float  50        construct                          0.0030982\ncpp_bin_float  50        construct(unsigned)                0.00808983\ncpp_bin_float  50        construct(unsigned long long)      0.0175206\ncpp_bin_float  50        +(unsigned long long)              0.109321\ncpp_bin_float  50        -(unsigned long long)              0.102878\ncpp_bin_float  50        *(unsigned long long)              0.0508387\ncpp_bin_float  50        /(unsigned long long)              0.19558\ncpp_bin_float  50        +=(unsigned long long)             0.109847\ncpp_bin_float  50        -=(unsigned long long)             0.129938\ncpp_bin_float  50        *=(unsigned long long)             0.0500366\ncpp_bin_float  50        /=(unsigned long long)             0.215322\ncpp_bin_float  100       +                                  0.0901201\ncpp_bin_float  100       -                                  0.0896788\ncpp_bin_float  100       *                                  0.111688\ncpp_bin_float  100       /                                  1.39191\ncpp_bin_float  100       str                                0.0051705\ncpp_bin_float  100       +(int)                             0.0871804\ncpp_bin_float  100       -(int)                             0.084402\ncpp_bin_float  100       *(int)                             0.0464923\ncpp_bin_float  100       /(int)                             0.271491\ncpp_bin_float  100       construct                          0.00608929\ncpp_bin_float  100       construct(unsigned)                0.0120486\ncpp_bin_float  100       construct(unsigned long long)      0.0267453\ncpp_bin_float  100       +(unsigned long long)              0.128103\ncpp_bin_float  100       -(unsigned long long)              0.0883961\ncpp_bin_float  100       *(unsigned long long)              0.0540758\ncpp_bin_float  100       /(unsigned long long)              0.244599\ncpp_bin_float  100       +=(unsigned long long)             0.0942496\ncpp_bin_float  100       -=(unsigned long long)             0.101449\ncpp_bin_float  100       *=(unsigned long long)             0.0547429\ncpp_bin_float  100       /=(unsigned long long)             0.256093\ncpp_bin_float  500       +                                  0.219881\ncpp_bin_float  500       -                                  0.196627\ncpp_bin_float  500       *                                  0.850904\ncpp_bin_float  500       /                                  5.32129\ncpp_bin_float  500       str                                0.043165\ncpp_bin_float  500       +(int)                             0.165014\ncpp_bin_float  500       -(int)                             0.181209\ncpp_bin_float  500       *(int)                             0.12206\ncpp_bin_float  500       /(int)                             0.643802\ncpp_bin_float  500       construct                          0.0152335\ncpp_bin_float  500       construct(unsigned)                0.0530205\ncpp_bin_float  500       construct(unsigned long long)      0.0570308\ncpp_bin_float  500       +(unsigned long long)              0.16427\ncpp_bin_float  500       -(unsigned long long)              0.185162\ncpp_bin_float  500       *(unsigned long long)              0.0843974\ncpp_bin_float  500       /(unsigned long long)              0.621615\ncpp_bin_float  500       +=(unsigned long long)             0.157162\ncpp_bin_float  500       -=(unsigned long long)             0.163157\ncpp_bin_float  500       *=(unsigned long long)             0.0987612\ncpp_bin_float  500       /=(unsigned long long)             0.638041\nmpfr_float     50        +                                  0.0106639\nmpfr_float     50        -                                  0.0274747\nmpfr_float     50        *                                  0.026548\nmpfr_float     50        /                                  0.239385\nmpfr_float     50        str                                0.000800609\nmpfr_float     50        +(int)                             0.029943\nmpfr_float     50        -(int)                             0.0662094\nmpfr_float     50        *(int)                             0.022273\nmpfr_float     50        /(int)                             0.0362858\nmpfr_float     50        construct                          0.04809\nmpfr_float     50        construct(unsigned)                0.0751445\nmpfr_float     50        construct(unsigned long long)      0.0787188\nmpfr_float     50        +(unsigned long long)              0.0240813\nmpfr_float     50        -(unsigned long long)              0.0438217\nmpfr_float     50        *(unsigned long long)              0.0207341\nmpfr_float     50        /(unsigned long long)              0.0603899\nmpfr_float     50        +=(unsigned long long)             0.0528778\nmpfr_float     50        -=(unsigned long long)             0.0613088\nmpfr_float     50        *=(unsigned long long)             0.0350654\nmpfr_float     50        /=(unsigned long long)             0.0458197\nmpfr_float     50        +                                  0.0183477\nmpfr_float     50        -                                  0.0241287\nmpfr_float     50        *                                  0.0161758\nmpfr_float     50        /                                  0.169939\nmpfr_float     50        str                                0.00227407\nmpfr_float     50        +(int)                             0.0256829\nmpfr_float     50        -(int)                             0.0692297\nmpfr_float     50        *(int)                             0.0336498\nmpfr_float     50        /(int)                             0.0549347\nmpfr_float     50        construct                          0.0773304\nmpfr_float     50        construct(unsigned)                0.102564\nmpfr_float     50        construct(unsigned long long)      0.08974\nmpfr_float     50        +(unsigned long long)              0.0261189\nmpfr_float     50        -(unsigned long long)              0.0606961\nmpfr_float     50        *(unsigned long long)              0.0276134\nmpfr_float     50        /(unsigned long long)              0.0520857\nmpfr_float     50        +=(unsigned long long)             0.0571878\nmpfr_float     50        -=(unsigned long long)             0.0589902\nmpfr_float     50        *=(unsigned long long)             0.0229147\nmpfr_float     50        /=(unsigned long long)             0.0523141\nmpfr_float     100       +                                  0.0190178\nmpfr_float     100       -                                  0.0395976\nmpfr_float     100       *                                  0.0661794\nmpfr_float     100       /                                  0.300455\nmpfr_float     100       str                                0.00132816\nmpfr_float     100       +(int)                             0.0300081\nmpfr_float     100       -(int)                             0.0654074\nmpfr_float     100       *(int)                             0.0339721\nmpfr_float     100       /(int)                             0.0592293\nmpfr_float     100       construct                          0.0866815\nmpfr_float     100       construct(unsigned)                0.0730204\nmpfr_float     100       construct(unsigned long long)      0.0720298\nmpfr_float     100       +(unsigned long long)              0.0290995\nmpfr_float     100       -(unsigned long long)              0.056868\nmpfr_float     100       *(unsigned long long)              0.0276341\nmpfr_float     100       /(unsigned long long)              0.0628383\nmpfr_float     100       +=(unsigned long long)             0.0502709\nmpfr_float     100       -=(unsigned long long)             0.0731736\nmpfr_float     100       *=(unsigned long long)             0.0348128\nmpfr_float     100       /=(unsigned long long)             0.071302\nmpfr_float     500       +                                  0.0609463\nmpfr_float     500       -                                  0.0646638\nmpfr_float     500       *                                  0.321884\nmpfr_float     500       /                                  1.2162\nmpfr_float     500       str                                0.0048926\nmpfr_float     500       +(int)                             0.062913\nmpfr_float     500       -(int)                             0.0711089\nmpfr_float     500       *(int)                             0.0792629\nmpfr_float     500       /(int)                             0.126251\nmpfr_float     500       construct                          0.0762248\nmpfr_float     500       construct(unsigned)                0.0813206\nmpfr_float     500       construct(unsigned long long)      0.0785786\nmpfr_float     500       +(unsigned long long)              0.0616622\nmpfr_float     500       -(unsigned long long)              0.0905736\nmpfr_float     500       *(unsigned long long)              0.0506668\nmpfr_float     500       /(unsigned long long)              0.117803\nmpfr_float     500       +=(unsigned long long)             0.0787754\nmpfr_float     500       -=(unsigned long long)             0.105476\nmpfr_float     500       *=(unsigned long long)             0.0716736\nmpfr_float     500       /=(unsigned long long)             0.122477\ngmp_int        2048      +                                  0.0179704\ngmp_int        2048      -                                  0.017975\ngmp_int        2048      *                                  0.361988\ngmp_int        2048      /                                  0.149182\ngmp_int        2048      str                                0.00244981\ngmp_int        2048      +(int)                             0.0118266\ngmp_int        2048      -(int)                             0.0117639\ngmp_int        2048      *(int)                             0.0241013\ngmp_int        2048      /(int)                             0.0972941\ngmp_int        2048      construct                          0.00384029\ngmp_int        2048      construct(unsigned)                0.0286091\ngmp_int        2048      construct(unsigned long long)      0.0290565\ngmp_int        2048      %                                  0.142738\ngmp_int        2048      |                                  0.0152602\ngmp_int        2048      &                                  0.015523\ngmp_int        2048      ^                                  0.0244266\ngmp_int        2048      <<                                 0.039948\ngmp_int        2048      >>                                 0.00453774\ngmp_int        2048      %(int)                             0.0436939\ngmp_int        2048      |(int)                             0.0277685\ngmp_int        2048      &(int)                             0.0176239\ngmp_int        2048      ^(int)                             0.0298873\ngmp_int        2048      gcd                                8.18516\ngmp_int        2048      +(unsigned long long)              0.0161988\ngmp_int        2048      -(unsigned long long)              0.0184622\ngmp_int        2048      *(unsigned long long)              0.0209189\ngmp_int        2048      /(unsigned long long)              0.0759658\ngmp_int        2048      +=(unsigned long long)             0.0160693\ngmp_int        2048      -=(unsigned long long)             0.0219074\ngmp_int        2048      *=(unsigned long long)             0.0301309\ngmp_int        2048      /=(unsigned long long)             0.0919138\ngmp_int        4096      +                                  0.0300729\ngmp_int        4096      -                                  0.0321962\ngmp_int        4096      *                                  1.11701\ngmp_int        4096      /                                  0.208719\ngmp_int        4096      str                                0.00486654\ngmp_int        4096      +(int)                             0.0195694\ngmp_int        4096      -(int)                             0.0225873\ngmp_int        4096      *(int)                             0.0477494\ngmp_int        4096      /(int)                             0.156597\ngmp_int        4096      construct                          0.00385483\ngmp_int        4096      construct(unsigned)                0.0220052\ngmp_int        4096      construct(unsigned long long)      0.0244927\ngmp_int        4096      %                                  0.24073\ngmp_int        4096      |                                  0.0365187\ngmp_int        4096      &                                  0.0384586\ngmp_int        4096      ^                                  0.0429561\ngmp_int        4096      <<                                 0.0597248\ngmp_int        4096      >>                                 0.00313265\ngmp_int        4096      %(int)                             0.0571251\ngmp_int        4096      |(int)                             0.0360071\ngmp_int        4096      &(int)                             0.0121449\ngmp_int        4096      ^(int)                             0.0406408\ngmp_int        4096      gcd                                18.7879\ngmp_int        4096      +(unsigned long long)              0.0174726\ngmp_int        4096      -(unsigned long long)              0.0220616\ngmp_int        4096      *(unsigned long long)              0.0321931\ngmp_int        4096      /(unsigned long long)              0.125208\ngmp_int        4096      +=(unsigned long long)             0.0221405\ngmp_int        4096      -=(unsigned long long)             0.0250737\ngmp_int        4096      *=(unsigned long long)             0.0457849\ngmp_int        4096      /=(unsigned long long)             0.14699\ncpp_int        2688      +                                  0.0336398\ncpp_int        2688      -                                  0.037733\ncpp_int        2688      *                                  1.31825\ncpp_int        2688      /                                  1.00586\ncpp_int        2688      str                                0.0237422\ncpp_int        2688      +(int)                             0.024805\ncpp_int        2688      -(int)                             0.032706\ncpp_int        2688      *(int)                             0.0426049\ncpp_int        2688      /(int)                             0.859876\ncpp_int        2688      construct                          0.00240729\ncpp_int        2688      construct(unsigned)                0.00241711\ncpp_int        2688      construct(unsigned long long)      0.00288069\ncpp_int        2688      %                                  0.398213\ncpp_int        2688      |                                  0.0334167\ncpp_int        2688      &                                  0.0366949\ncpp_int        2688      ^                                  0.0475314\ncpp_int        2688      <<                                 0.0753453\ncpp_int        2688      >>                                 0.0183679\ncpp_int        2688      %(int)                             0.301827\ncpp_int        2688      |(int)                             0.0214828\ncpp_int        2688      &(int)                             0.0612567\ncpp_int        2688      ^(int)                             0.0206665\ncpp_int        2688      gcd                                21.9738\ncpp_int        2688      +(unsigned long long)              0.0294774\ncpp_int        2688      -(unsigned long long)              0.0222548\ncpp_int        2688      *(unsigned long long)              0.052584\ncpp_int        2688      /(unsigned long long)              0.832241\ncpp_int        2688      +=(unsigned long long)             0.0201879\ncpp_int        2688      -=(unsigned long long)             0.0277295\ncpp_int        2688      *=(unsigned long long)             0.0527845\ncpp_int        2688      /=(unsigned long long)             0.873081\ncpp_int        2048      +                                  0.033949\ncpp_int        2048      -                                  0.0507822\ncpp_int        2048      *                                  0.918685\ncpp_int        2048      /                                  0.702366\ncpp_int        2048      str                                0.0137593\ncpp_int        2048      +(int)                             0.0204874\ncpp_int        2048      -(int)                             0.0176467\ncpp_int        2048      *(int)                             0.047049\ncpp_int        2048      /(int)                             0.630264\ncpp_int        2048      construct                          0.00273948\ncpp_int        2048      construct(unsigned)                0.00304865\ncpp_int        2048      construct(unsigned long long)      0.00190833\ncpp_int        2048      %                                  0.368469\ncpp_int        2048      |                                  0.0293243\ncpp_int        2048      &                                  0.0461406\ncpp_int        2048      ^                                  0.0405646\ncpp_int        2048      <<                                 0.0859331\ncpp_int        2048      >>                                 0.0183489\ncpp_int        2048      %(int)                             0.288068\ncpp_int        2048      |(int)                             0.0309032\ncpp_int        2048      &(int)                             0.063826\ncpp_int        2048      ^(int)                             0.0264078\ncpp_int        2048      gcd                                17.7583\ncpp_int        2048      +(unsigned long long)              0.0237404\ncpp_int        2048      -(unsigned long long)              0.0235442\ncpp_int        2048      *(unsigned long long)              0.0539343\ncpp_int        2048      /(unsigned long long)              0.706562\ncpp_int        2048      +=(unsigned long long)             0.0186902\ncpp_int        2048      -=(unsigned long long)             0.0265754\ncpp_int        2048      *=(unsigned long long)             0.0373067\ncpp_int        2048      /=(unsigned long long)             0.632889\ntommath_int    2048      +                                  0.0211244\ntommath_int    2048      -                                  0.0279804\ntommath_int    2048      *                                  0.460786\ntommath_int    2048      /                                  3.07934\ntommath_int    2048      str                                0.202054\ntommath_int    2048      +(int)                             0.083639\ntommath_int    2048      -(int)                             0.0851246\ntommath_int    2048      *(int)                             0.135402\ntommath_int    2048      /(int)                             2.60921\ntommath_int    2048      construct                          0.130974\ntommath_int    2048      construct(unsigned)                0.143494\ntommath_int    2048      construct(unsigned long long)      0.163349\ntommath_int    2048      %                                  3.33706\ntommath_int    2048      |                                  0.0267336\ntommath_int    2048      &                                  0.0364387\ntommath_int    2048      ^                                  0.0346198\ntommath_int    2048      <<                                 0.0693055\ntommath_int    2048      >>                                 0.134364\ntommath_int    2048      %(int)                             2.60834\ntommath_int    2048      |(int)                             0.0913086\ntommath_int    2048      &(int)                             0.101302\ntommath_int    2048      ^(int)                             0.102478\ntommath_int    2048      gcd                                42.8729\ntommath_int    2048      +(unsigned long long)              0.0926177\ntommath_int    2048      -(unsigned long long)              0.100113\ntommath_int    2048      *(unsigned long long)              0.169084\ntommath_int    2048      /(unsigned long long)              3.12331\ntommath_int    2048      +=(unsigned long long)             0.110375\ntommath_int    2048      -=(unsigned long long)             0.105886\ntommath_int    2048      *=(unsigned long long)             0.171704\ntommath_int    2048      /=(unsigned long long)             3.0036\ntommath_int    4096      +                                  0.0326177\ntommath_int    4096      -                                  0.0532653\ntommath_int    4096      *                                  1.58255\ntommath_int    4096      /                                  6.59216\ntommath_int    4096      str                                0.754295\ntommath_int    4096      +(int)                             0.0938225\ntommath_int    4096      -(int)                             0.101291\ntommath_int    4096      *(int)                             0.196512\ntommath_int    4096      /(int)                             5.83504\ntommath_int    4096      construct                          0.13198\ntommath_int    4096      construct(unsigned)                0.143689\ntommath_int    4096      construct(unsigned long long)      0.146389\ntommath_int    4096      %                                  6.41658\ntommath_int    4096      |                                  0.0481236\ntommath_int    4096      &                                  0.0552444\ntommath_int    4096      ^                                  0.0568037\ntommath_int    4096      <<                                 0.115375\ntommath_int    4096      >>                                 0.196446\ntommath_int    4096      %(int)                             5.91797\ntommath_int    4096      |(int)                             0.109494\ntommath_int    4096      &(int)                             0.128712\ntommath_int    4096      ^(int)                             0.131519\ntommath_int    4096      gcd                                136.362\ntommath_int    4096      +(unsigned long long)              0.108939\ntommath_int    4096      -(unsigned long long)              0.101139\ntommath_int    4096      *(unsigned long long)              0.220461\ntommath_int    4096      /(unsigned long long)              7.25882\ntommath_int    4096      +=(unsigned long long)             0.11456\ntommath_int    4096      -=(unsigned long long)             0.117418\ntommath_int    4096      *=(unsigned long long)             0.250847\ntommath_int    4096      /=(unsigned long long)             7.09868\ncpp_int        4096      +                                  0.0412289\ncpp_int        4096      -                                  0.0463464\ncpp_int        4096      *                                  2.65154\ncpp_int        4096      /                                  1.18106\ncpp_int        4096      str                                0.0491109\ncpp_int        4096      +(int)                             0.0198385\ncpp_int        4096      -(int)                             0.0209158\ncpp_int        4096      *(int)                             0.0576663\ncpp_int        4096      /(int)                             1.08346\ncpp_int        4096      construct                          0.0017072\ncpp_int        4096      construct(unsigned)                0.0018378\ncpp_int        4096      construct(unsigned long long)      0.00199036\ncpp_int        4096      %                                  0.512768\ncpp_int        4096      |                                  0.0377549\ncpp_int        4096      &                                  0.0440714\ncpp_int        4096      ^                                  0.0369865\ncpp_int        4096      <<                                 0.0889652\ncpp_int        4096      >>                                 0.0219967\ncpp_int        4096      %(int)                             0.429244\ncpp_int        4096      |(int)                             0.0232284\ncpp_int        4096      &(int)                             0.0593859\ncpp_int        4096      ^(int)                             0.0235546\ncpp_int        4096      gcd                                32.2572\ncpp_int        4096      +(unsigned long long)              0.0253811\ncpp_int        4096      -(unsigned long long)              0.0242017\ncpp_int        4096      *(unsigned long long)              0.0432066\ncpp_int        4096      /(unsigned long long)              1.0584\ncpp_int        4096      +=(unsigned long long)             0.0218483\ncpp_int        4096      -=(unsigned long long)             0.0249248\ncpp_int        4096      *=(unsigned long long)             0.0424701\ncpp_int        4096      /=(unsigned long long)             1.05399\ncpp_int        8192      +                                  0.083134\ncpp_int        8192      -                                  0.0813138\ncpp_int        8192      *                                  7.83314\ncpp_int        8192      /                                  2.26453\ncpp_int        8192      str                                0.171316\ncpp_int        8192      +(int)                             0.0338486\ncpp_int        8192      -(int)                             0.0402632\ncpp_int        8192      *(int)                             0.0955853\ncpp_int        8192      /(int)                             2.33772\ncpp_int        8192      construct                          0.00191549\ncpp_int        8192      construct(unsigned)                0.0017583\ncpp_int        8192      construct(unsigned long long)      0.00200998\ncpp_int        8192      %                                  1.03083\ncpp_int        8192      |                                  0.0916779\ncpp_int        8192      &                                  0.0811524\ncpp_int        8192      ^                                  0.0918676\ncpp_int        8192      <<                                 0.190562\ncpp_int        8192      >>                                 0.0537598\ncpp_int        8192      %(int)                             0.851447\ncpp_int        8192      |(int)                             0.042441\ncpp_int        8192      &(int)                             0.102968\ncpp_int        8192      ^(int)                             0.0392727\ncpp_int        8192      gcd                                76.6459\ncpp_int        8192      +(unsigned long long)              0.0350422\ncpp_int        8192      -(unsigned long long)              0.0317445\ncpp_int        8192      *(unsigned long long)              0.0813634\ncpp_int        8192      /(unsigned long long)              2.14867\ncpp_int        8192      +=(unsigned long long)             0.0394761\ncpp_int        8192      -=(unsigned long long)             0.0377524\ncpp_int        8192      *=(unsigned long long)             0.0946934\ncpp_int        8192      /=(unsigned long long)             2.14442\ncpp_int        16384     +                                  0.190174\ncpp_int        16384     -                                  0.191562\ncpp_int        16384     *                                  26.1836\ncpp_int        16384     /                                  4.52755\ncpp_int        16384     str                                0.595522\ncpp_int        16384     +(int)                             0.0760202\ncpp_int        16384     -(int)                             0.0674681\ncpp_int        16384     *(int)                             0.167493\ncpp_int        16384     /(int)                             4.22641\ncpp_int        16384     construct                          0.0016635\ncpp_int        16384     construct(unsigned)                0.00197229\ncpp_int        16384     construct(unsigned long long)      0.00168004\ncpp_int        16384     %                                  1.96988\ncpp_int        16384     |                                  0.152323\ncpp_int        16384     &                                  0.146531\ncpp_int        16384     ^                                  0.150955\ncpp_int        16384     <<                                 0.32803\ncpp_int        16384     >>                                 0.0745484\ncpp_int        16384     %(int)                             1.57951\ncpp_int        16384     |(int)                             0.0711061\ncpp_int        16384     &(int)                             0.168385\ncpp_int        16384     ^(int)                             0.0657809\ncpp_int        16384     gcd                                201.791\ncpp_int        16384     +(unsigned long long)              0.0761856\ncpp_int        16384     -(unsigned long long)              0.0783054\ncpp_int        16384     *(unsigned long long)              0.159452\ncpp_int        16384     /(unsigned long long)              4.2547\ncpp_int        16384     +=(unsigned long long)             0.0783171\ncpp_int        16384     -=(unsigned long long)             0.070851\ncpp_int        16384     *=(unsigned long long)             0.177219\ncpp_int        16384     /=(unsigned long long)             4.37618\ntommath_int    8192      +                                  0.060658\ntommath_int    8192      -                                  0.0884881\ntommath_int    8192      *                                  7.13744\ntommath_int    8192      /                                  17.0525\ntommath_int    8192      str                                2.82013\ntommath_int    8192      +(int)                             0.11778\ntommath_int    8192      -(int)                             0.115431\ntommath_int    8192      *(int)                             0.30587\ntommath_int    8192      /(int)                             15.4756\ntommath_int    8192      construct                          0.126578\ntommath_int    8192      construct(unsigned)                0.144368\ntommath_int    8192      construct(unsigned long long)      0.139445\ntommath_int    8192      %                                  17.1548\ntommath_int    8192      |                                  0.0880424\ntommath_int    8192      &                                  0.10108\ntommath_int    8192      ^                                  0.0996668\ntommath_int    8192      <<                                 0.222116\ntommath_int    8192      >>                                 0.358689\ntommath_int    8192      %(int)                             16.0225\ntommath_int    8192      |(int)                             0.150489\ntommath_int    8192      &(int)                             0.18102\ntommath_int    8192      ^(int)                             0.190136\ntommath_int    8192      gcd                                471.81\ntommath_int    8192      +(unsigned long long)              0.117648\ntommath_int    8192      -(unsigned long long)              0.118991\ntommath_int    8192      *(unsigned long long)              0.361697\ntommath_int    8192      /(unsigned long long)              19.8407\ntommath_int    8192      +=(unsigned long long)             0.159384\ntommath_int    8192      -=(unsigned long long)             0.189292\ntommath_int    8192      *=(unsigned long long)             0.453899\ntommath_int    8192      /=(unsigned long long)             20.7357\ntommath_int    16384     +                                  0.229295\ntommath_int    16384     -                                  0.358805\ntommath_int    16384     *                                  25.8824\ntommath_int    16384     /                                  51.7759\ntommath_int    16384     str                                11.1251\ntommath_int    16384     +(int)                             0.176275\ntommath_int    16384     -(int)                             0.179066\ntommath_int    16384     *(int)                             0.548109\ntommath_int    16384     /(int)                             50.0929\ntommath_int    16384     construct                          0.160796\ntommath_int    16384     construct(unsigned)                0.182018\ntommath_int    16384     construct(unsigned long long)      0.191943\ntommath_int    16384     %                                  51.233\ntommath_int    16384     |                                  0.213797\ntommath_int    16384     &                                  0.245997\ntommath_int    16384     ^                                  0.234837\ntommath_int    16384     <<                                 0.538044\ntommath_int    16384     >>                                 0.899272\ntommath_int    16384     %(int)                             54.083\ntommath_int    16384     |(int)                             0.205729\ntommath_int    16384     &(int)                             0.276527\ntommath_int    16384     ^(int)                             0.314742\ntommath_int    16384     gcd                                1770.72\ntommath_int    16384     +(unsigned long long)              0.175822\ntommath_int    16384     -(unsigned long long)              0.175887\ntommath_int    16384     *(unsigned long long)              0.667264\ntommath_int    16384     /(unsigned long long)              57.2509\ntommath_int    16384     +=(unsigned long long)             0.226317\ntommath_int    16384     -=(unsigned long long)             0.2213\ntommath_int    16384     *=(unsigned long long)             0.690731\ntommath_int    16384     /=(unsigned long long)             67.9296\ngmp_int        8192      +                                  0.0811195\ngmp_int        8192      -                                  0.11812\ngmp_int        8192      *                                  5.52441\ngmp_int        8192      /                                  0.516606\ngmp_int        8192      str                                0.0262254\ngmp_int        8192      +(int)                             0.0700979\ngmp_int        8192      -(int)                             0.0576919\ngmp_int        8192      *(int)                             0.113505\ngmp_int        8192      /(int)                             0.410334\ngmp_int        8192      construct                          0.0081635\ngmp_int        8192      construct(unsigned)                0.0635939\ngmp_int        8192      construct(unsigned long long)      0.0709692\ngmp_int        8192      %                                  0.603534\ngmp_int        8192      |                                  0.0920584\ngmp_int        8192      &                                  0.0887291\ngmp_int        8192      ^                                  0.0805332\ngmp_int        8192      <<                                 0.146992\ngmp_int        8192      >>                                 0.00722919\ngmp_int        8192      %(int)                             0.119886\ngmp_int        8192      |(int)                             0.0874534\ngmp_int        8192      &(int)                             0.0150182\ngmp_int        8192      ^(int)                             0.0788165\ngmp_int        8192      gcd                                58.8129\ngmp_int        8192      +(unsigned long long)              0.0466003\ngmp_int        8192      -(unsigned long long)              0.0435595\ngmp_int        8192      *(unsigned long long)              0.0886586\ngmp_int        8192      /(unsigned long long)              0.288938\ngmp_int        8192      +=(unsigned long long)             0.0570676\ngmp_int        8192      -=(unsigned long long)             0.05295\ngmp_int        8192      *=(unsigned long long)             0.108914\ngmp_int        8192      /=(unsigned long long)             0.319457\ngmp_int        16384     +                                  0.134715\ngmp_int        16384     -                                  0.14931\ngmp_int        16384     *                                  11.3398\ngmp_int        16384     /                                  0.638503\ngmp_int        16384     str                                0.0398493\ngmp_int        16384     +(int)                             0.0772241\ngmp_int        16384     -(int)                             0.0818204\ngmp_int        16384     *(int)                             0.137745\ngmp_int        16384     /(int)                             0.595404\ngmp_int        16384     construct                          0.00397999\ngmp_int        16384     construct(unsigned)                0.0276289\ngmp_int        16384     construct(unsigned long long)      0.0219346\ngmp_int        16384     %                                  0.723753\ngmp_int        16384     |                                  0.111118\ngmp_int        16384     &                                  0.112421\ngmp_int        16384     ^                                  0.124214\ngmp_int        16384     <<                                 0.206887\ngmp_int        16384     >>                                 0.00655899\ngmp_int        16384     %(int)                             0.137682\ngmp_int        16384     |(int)                             0.115602\ngmp_int        16384     &(int)                             0.0212413\ngmp_int        16384     ^(int)                             0.139399\ngmp_int        16384     gcd                                122.14\ngmp_int        16384     +(unsigned long long)              0.0668364\ngmp_int        16384     -(unsigned long long)              0.0661641\ngmp_int        16384     *(unsigned long long)              0.12958\ngmp_int        16384     /(unsigned long long)              0.523737\ngmp_int        16384     +=(unsigned long long)             0.0841208\ngmp_int        16384     -=(unsigned long long)             0.0947863\ngmp_int        16384     *=(unsigned long long)             0.208689\ngmp_int        16384     /=(unsigned long long)             0.607595\n[section:float_performance Float Type Perfomance]\n[table Operator *\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][4.45465 (0.0720574s)][4.33995 (0.111688s)][2.90491 (0.850904s)]]\n[[cpp_dec_float][3.82572 (0.061884s)][5.06288 (0.130292s)][5.77019 (1.6902s)]]\n[[gmp_float][1.28958 (0.02086s)][[*1] (0.0257348s)][[*1] (0.292919s)]]\n[[mpfr_float][[*1] (0.0161758s)][2.57159 (0.0661794s)][1.09888 (0.321884s)]]\n]\n[table Operator *(int)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][7.78457 (0.0399504s)][8.32801 (0.0464923s)][5.78369 (0.12206s)]]\n[[cpp_dec_float][12.2836 (0.0630393s)][22.4215 (0.125171s)][115.745 (2.44271s)]]\n[[gmp_float][[*1] (0.00513201s)][[*1] (0.00558264s)][[*1] (0.0211042s)]]\n[[mpfr_float][6.55686 (0.0336498s)][6.08531 (0.0339721s)][3.75579 (0.0792629s)]]\n]\n[table Operator *(unsigned long long)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][3.96061 (0.0508387s)][9.0225 (0.0540758s)][3.84877 (0.0843974s)]]\n[[cpp_dec_float][5.80905 (0.0745654s)][24.6321 (0.147631s)][122.419 (2.68446s)]]\n[[gmp_float][[*1] (0.0128361s)][[*1] (0.00599344s)][[*1] (0.0219284s)]]\n[[mpfr_float][2.15124 (0.0276134s)][4.61073 (0.0276341s)][2.31056 (0.0506668s)]]\n]\n[table Operator *=(unsigned long long)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][6.54027 (0.0500366s)][5.58857 (0.0547429s)][3.33593 (0.0987612s)]]\n[[cpp_dec_float][9.23894 (0.0706828s)][17.6238 (0.172634s)][81.1437 (2.40228s)]]\n[[gmp_float][[*1] (0.00765054s)][[*1] (0.00979552s)][[*1] (0.0296053s)]]\n[[mpfr_float][2.99517 (0.0229147s)][3.55395 (0.0348128s)][2.42098 (0.0716736s)]]\n]\n[table Operator +\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][2.61482 (0.0479759s)][6.91285 (0.0901201s)][8.04302 (0.219881s)]]\n[[cpp_dec_float][1.08384 (0.0198859s)][1.6631 (0.0216812s)][7.59843 (0.207727s)]]\n[[gmp_float][1.00042 (0.0183555s)][[*1] (0.0130366s)][[*1] (0.0273382s)]]\n[[mpfr_float][[*1] (0.0183477s)][1.4588 (0.0190178s)][2.22935 (0.0609463s)]]\n]\n[table Operator +(int)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][11.8195 (0.0524679s)][13.9144 (0.0871804s)][13.6745 (0.165014s)]]\n[[cpp_dec_float][3.22445 (0.0143136s)][2.703 (0.0169356s)][12.5227 (0.151114s)]]\n[[gmp_float][[*1] (0.00443909s)][[*1] (0.00626549s)][[*1] (0.0120673s)]]\n[[mpfr_float][5.78563 (0.0256829s)][4.78942 (0.0300081s)][5.21353 (0.062913s)]]\n]\n[table Operator +(unsigned long long)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][21.4259 (0.109321s)][16.4546 (0.128103s)][14.7256 (0.16427s)]]\n[[cpp_dec_float][4.53931 (0.0231609s)][3.75913 (0.0292658s)][13.3516 (0.148942s)]]\n[[gmp_float][[*1] (0.0051023s)][[*1] (0.00778526s)][[*1] (0.0111554s)]]\n[[mpfr_float][5.11905 (0.0261189s)][3.73777 (0.0290995s)][5.52758 (0.0616622s)]]\n]\n[table Operator +=(unsigned long long)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][6.6778 (0.109847s)][6.84045 (0.0942496s)][9.09759 (0.157162s)]]\n[[cpp_dec_float][1.06799 (0.017568s)][1.71962 (0.0236933s)][10.7777 (0.186187s)]]\n[[gmp_float][[*1] (0.0164496s)][[*1] (0.0137783s)][[*1] (0.0172751s)]]\n[[mpfr_float][3.47654 (0.0571878s)][3.64857 (0.0502709s)][4.56004 (0.0787754s)]]\n]\n[table Operator -\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][5.04597 (0.0688937s)][4.65775 (0.0896788s)][7.55005 (0.196627s)]]\n[[cpp_dec_float][1.42357 (0.0194363s)][1.62766 (0.0313385s)][8.16298 (0.21259s)]]\n[[gmp_float][[*1] (0.0136532s)][[*1] (0.0192537s)][[*1] (0.0260432s)]]\n[[mpfr_float][1.76726 (0.0241287s)][2.05663 (0.0395976s)][2.48295 (0.0646638s)]]\n]\n[table Operator -(int)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][6.31633 (0.0848243s)][7.07646 (0.084402s)][6.65523 (0.181209s)]]\n[[cpp_dec_float][1.6139 (0.0216737s)][2.20945 (0.0263524s)][5.27802 (0.14371s)]]\n[[gmp_float][[*1] (0.0134294s)][[*1] (0.0119272s)][[*1] (0.0272281s)]]\n[[mpfr_float][5.1551 (0.0692297s)][5.48391 (0.0654074s)][2.6116 (0.0711089s)]]\n]\n[table Operator -(unsigned long long)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][9.08373 (0.102878s)][4.54284 (0.0883961s)][7.01771 (0.185162s)]]\n[[cpp_dec_float][2.19345 (0.0248419s)][1.47898 (0.0287785s)][5.71248 (0.150724s)]]\n[[gmp_float][[*1] (0.0113255s)][[*1] (0.0194584s)][[*1] (0.026385s)]]\n[[mpfr_float][5.35926 (0.0606961s)][2.92255 (0.056868s)][3.43277 (0.0905736s)]]\n]\n[table Operator -=(unsigned long long)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][8.73347 (0.129938s)][4.58762 (0.101449s)][5.43827 (0.163157s)]]\n[[cpp_dec_float][1.67927 (0.0249846s)][1.79526 (0.0396995s)][6.63379 (0.199025s)]]\n[[gmp_float][[*1] (0.0148782s)][[*1] (0.0221136s)][[*1] (0.0300017s)]]\n[[mpfr_float][3.96488 (0.0589902s)][3.30899 (0.0731736s)][3.51566 (0.105476s)]]\n]\n[table Operator /\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][5.40221 (0.549759s)][10.0182 (1.39191s)][12.3684 (5.32129s)]]\n[[cpp_dec_float][8.16505 (0.83092s)][12.483 (1.73437s)][52.8644 (22.744s)]]\n[[gmp_float][[*1] (0.101766s)][[*1] (0.138938s)][[*1] (0.430233s)]]\n[[mpfr_float][1.6699 (0.169939s)][2.16251 (0.300455s)][2.82683 (1.2162s)]]\n]\n[table Operator /(int)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][5.81464 (0.141651s)][12.2991 (0.271491s)][8.20246 (0.643802s)]]\n[[cpp_dec_float][16.4865 (0.40163s)][39.0331 (0.861622s)][164 (12.8722s)]]\n[[gmp_float][[*1] (0.0243611s)][[*1] (0.0220741s)][[*1] (0.0784889s)]]\n[[mpfr_float][2.25501 (0.0549347s)][2.6832 (0.0592293s)][1.60852 (0.126251s)]]\n]\n[table Operator /(unsigned long long)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][10.879 (0.19558s)][10.4845 (0.244599s)][8.82445 (0.621615s)]]\n[[cpp_dec_float][22.028 (0.396014s)][42.4784 (0.991001s)][201.351 (14.1836s)]]\n[[gmp_float][[*1] (0.0179778s)][[*1] (0.0233296s)][[*1] (0.0704423s)]]\n[[mpfr_float][2.89723 (0.0520857s)][2.6935 (0.0628383s)][1.67233 (0.117803s)]]\n]\n[table Operator /=(unsigned long long)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][11.0264 (0.215322s)][7.78235 (0.256093s)][8.31638 (0.638041s)]]\n[[cpp_dec_float][20.9412 (0.408938s)][38.8146 (1.27727s)][142.377 (10.9233s)]]\n[[gmp_float][[*1] (0.0195279s)][[*1] (0.032907s)][[*1] (0.076721s)]]\n[[mpfr_float][2.67894 (0.0523141s)][2.16678 (0.071302s)][1.5964 (0.122477s)]]\n]\n[table Operator construct\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][[*1] (0.0030982s)][1.37355 (0.00608929s)][[*1] (0.0152335s)]]\n[[cpp_dec_float][1.23911 (0.00383901s)][[*1] (0.00443324s)][1.6806 (0.0256013s)]]\n[[gmp_float][7.50258 (0.0232445s)][5.47554 (0.0242744s)][5.81062 (0.0885159s)]]\n[[mpfr_float][24.9598 (0.0773304s)][19.5526 (0.0866815s)][5.00378 (0.0762248s)]]\n]\n[table Operator construct(unsigned long long)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][2.08541 (0.0175206s)][3.12821 (0.0267453s)][1.32687 (0.0570308s)]]\n[[cpp_dec_float][[*1] (0.00840151s)][[*1] (0.00854971s)][[*1] (0.0429815s)]]\n[[gmp_float][3.08163 (0.0258903s)][2.44895 (0.0209379s)][2.12806 (0.0914671s)]]\n[[mpfr_float][10.6814 (0.08974s)][8.42482 (0.0720298s)][1.8282 (0.0785786s)]]\n]\n[table Operator construct(unsigned)\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][1.04974 (0.00808983s)][1.38823 (0.0120486s)][1.16321 (0.0530205s)]]\n[[cpp_dec_float][[*1] (0.00770653s)][[*1] (0.00867913s)][[*1] (0.0455813s)]]\n[[gmp_float][3.88496 (0.0299395s)][2.90503 (0.0252132s)][1.82072 (0.0829907s)]]\n[[mpfr_float][13.3088 (0.102564s)][8.41333 (0.0730204s)][1.78408 (0.0813206s)]]\n]\n[table Operator str\n[[Backend][50 Bits][100 Bits][500 Bits]]\n[[cpp_bin_float][6.09659 (0.00301165s)][4.71882 (0.0051705s)][12.4899 (0.043165s)]]\n[[cpp_dec_float][2.94087 (0.00145276s)][1.64843 (0.00180621s)][3.16004 (0.0109211s)]]\n[[gmp_float][[*1] (0.000493989s)][[*1] (0.00109572s)][[*1] (0.00345598s)]]\n[[mpfr_float][4.60349 (0.00227407s)][1.21213 (0.00132816s)][1.41569 (0.0048926s)]]\n]\n[endsect]\n[section:integer_performance Integer Type Perfomance]\n[table Operator %\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][1.51155 (0.0481508s)][1.60666 (0.0825917s)][1.75956 (0.127209s)][1.87154 (0.171986s)][2.58143 (0.368469s)][1.65419 (0.398213s)][[*1] (0.512768s)][1.42429 (1.03083s)][[*1] (1.96988s)]]\n[[cpp_int(fixed)][[*1] (0.0318553s)][1.2913 (0.0663805s)][1.33672 (0.0966394s)][1.97924 (0.181883s)]]\n[[gmp_int][1.4659 (0.0466966s)][[*1] (0.0514059s)][[*1] (0.0722958s)][[*1] (0.0918952s)][[*1] (0.142738s)][[*1] (0.24073s)][1.17701 (0.603534s)][[*1] (0.723753s)]]\n[[tommath_int][27.46 (0.874748s)][20.1749 (1.03711s)][17.9774 (1.29969s)][19.0867 (1.75398s)][23.3789 (3.33706s)][26.6546 (6.41658s)][33.4553 (17.1548s)][70.788 (51.233s)]]\n]\n[table Operator %(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][[*1] (0.00790481s)][1.45288 (0.0215141s)][2.71488 (0.065874s)][4.05695 (0.1044s)][6.59285 (0.288068s)][5.28362 (0.301827s)][3.58045 (0.429244s)][6.18417 (0.851447s)][[*1] (1.57951s)]]\n[[cpp_int(fixed)][2.18748 (0.0172916s)][1.67119 (0.0247468s)][2.83861 (0.0688759s)][4.3186 (0.111133s)]]\n[[gmp_int][1.50165 (0.0118703s)][[*1] (0.0148079s)][[*1] (0.024264s)][[*1] (0.0257336s)][[*1] (0.0436939s)][[*1] (0.0571251s)][[*1] (0.119886s)][[*1] (0.137682s)]]\n[[tommath_int][68.9623 (0.545134s)][54.52 (0.807325s)][38.3573 (0.930702s)][53.0833 (1.36603s)][59.6958 (2.60834s)][103.597 (5.91797s)][133.648 (16.0225s)][392.812 (54.083s)]]\n]\n[table Operator &\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][2.82137 (0.0101034s)][3.08842 (0.0128886s)][3.46566 (0.018172s)][2.55025 (0.0204051s)][2.97241 (0.0461406s)][[*1] (0.0366949s)][[*1] (0.0440714s)][[*1] (0.0811524s)][[*1] (0.146531s)]]\n[[cpp_int(fixed)][[*1] (0.00358104s)][1.5374 (0.00641591s)][1.70378 (0.0089337s)][2.40825 (0.019269s)]]\n[[gmp_int][1.10071 (0.00394167s)][[*1] (0.00417321s)][[*1] (0.00524347s)][[*1] (0.00800121s)][[*1] (0.015523s)][1.04806 (0.0384586s)][2.0133 (0.0887291s)][1.38531 (0.112421s)]]\n[[tommath_int][2.18066 (0.00780901s)][2.22528 (0.00928657s)][2.15567 (0.0113032s)][3.05906 (0.0244762s)][2.34741 (0.0364387s)][1.50551 (0.0552444s)][2.29355 (0.10108s)][3.0313 (0.245997s)]]\n]\n[table Operator &(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][3.24695 (0.0124861s)][1.81002 (0.0114113s)][2.11984 (0.0179186s)][2.56949 (0.0262296s)][3.62157 (0.063826s)][5.04381 (0.0612567s)][3.95427 (0.0593859s)][4.84754 (0.102968s)][[*1] (0.168385s)]]\n[[cpp_int(fixed)][[*1] (0.0038455s)][[*1] (0.00630453s)][[*1] (0.00845281s)][2.20848 (0.0225444s)]]\n[[gmp_int][3.87448 (0.0148993s)][1.50343 (0.00947844s)][1.59793 (0.013507s)][[*1] (0.0102081s)][[*1] (0.0176239s)][[*1] (0.0121449s)][[*1] (0.0150182s)][[*1] (0.0212413s)]]\n[[tommath_int][25.1094 (0.0965583s)][15.7147 (0.0990734s)][9.65097 (0.0815778s)][8.5208 (0.0869813s)][5.74798 (0.101302s)][10.598 (0.128712s)][12.0534 (0.18102s)][13.0183 (0.276527s)]]\n]\n[table Operator *\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][12.4201 (0.0145016s)][1.838 (0.0246772s)][2.10406 (0.0631704s)][2.22846 (0.224062s)][2.53789 (0.918685s)][1.18016 (1.31825s)][[*1] (2.65154s)][[*1] (7.83314s)][[*1] (26.1836s)]]\n[[cpp_int(fixed)][[*1] (0.00116759s)][1.76789 (0.0237359s)][1.58515 (0.047591s)][1.52628 (0.153461s)]]\n[[gmp_int][4.80091 (0.00560549s)][[*1] (0.0134261s)][[*1] (0.0300231s)][[*1] (0.100546s)][[*1] (0.361988s)][[*1] (1.11701s)][2.08347 (5.52441s)][1.44767 (11.3398s)]]\n[[tommath_int][16.9604 (0.0198027s)][2.43157 (0.0326465s)][2.82213 (0.0847288s)][1.67653 (0.168568s)][1.27293 (0.460786s)][1.41678 (1.58255s)][2.69181 (7.13744s)][3.30421 (25.8824s)]]\n]\n[table Operator *(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][10.9781 (0.0072726s)][1.52901 (0.00991594s)][3.35266 (0.0194072s)][2.30215 (0.0214459s)][1.95214 (0.047049s)][[*1] (0.0426049s)][[*1] (0.0576663s)][[*1] (0.0955853s)][[*1] (0.167493s)]]\n[[cpp_int(fixed)][[*1] (0.000662467s)][[*1] (0.00648519s)][1.52643 (0.0088359s)][2.26708 (0.0211192s)]]\n[[gmp_int][7.14641 (0.00473426s)][1.74133 (0.0112929s)][[*1] (0.00578859s)][[*1] (0.00931559s)][[*1] (0.0241013s)][1.12075 (0.0477494s)][1.96831 (0.113505s)][1.44107 (0.137745s)]]\n[[tommath_int][156.154 (0.103447s)][14.5292 (0.0942242s)][16.82 (0.0973642s)][11.9029 (0.110883s)][5.61803 (0.135402s)][4.61241 (0.196512s)][5.30415 (0.30587s)][5.73424 (0.548109s)]]\n]\n[table Operator *(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][8.98335 (0.00669928s)][1.79861 (0.00820918s)][1.86924 (0.0119122s)][1.71773 (0.0175683s)][2.57826 (0.0539343s)][1.63339 (0.052584s)][[*1] (0.0432066s)][[*1] (0.0813634s)][[*1] (0.159452s)]]\n[[cpp_int(fixed)][[*1] (0.000745744s)][1.07211 (0.00489332s)][1.19888 (0.00764018s)][1.53618 (0.0157115s)]]\n[[gmp_int][4.97741 (0.00371188s)][[*1] (0.00456418s)][[*1] (0.00637276s)][[*1] (0.0102277s)][[*1] (0.0209189s)][[*1] (0.0321931s)][2.05197 (0.0886586s)][1.59261 (0.12958s)]]\n[[tommath_int][143.938 (0.107341s)][24.0751 (0.109883s)][16.9325 (0.107907s)][11.5473 (0.118102s)][8.08283 (0.169084s)][6.84808 (0.220461s)][8.37134 (0.361697s)][8.20104 (0.667264s)]]\n]\n[table Operator *=(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][15.7803 (0.0131299s)][1.67116 (0.00790233s)][1.66661 (0.0119079s)][1.51408 (0.0203561s)][1.23815 (0.0373067s)][1.15288 (0.0527845s)][[*1] (0.0424701s)][[*1] (0.0946934s)][[*1] (0.177219s)]]\n[[cpp_int(fixed)][[*1] (0.000832044s)][[*1] (0.00472864s)][[*1] (0.00714494s)][[*1] (0.0134446s)]]\n[[gmp_int][6.73473 (0.00560359s)][1.81651 (0.00858963s)][1.36813 (0.00977523s)][1.00404 (0.0134989s)][[*1] (0.0301309s)][[*1] (0.0457849s)][2.56449 (0.108914s)][2.20384 (0.208689s)]]\n[[tommath_int][115.266 (0.0959064s)][24.7701 (0.117129s)][15.9941 (0.114277s)][11.3798 (0.152996s)][5.69861 (0.171704s)][5.47882 (0.250847s)][10.6875 (0.453899s)][7.29439 (0.690731s)]]\n]\n[table Operator +\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][9.80738 (0.0086037s)][2.34204 (0.0160922s)][1.00627 (0.0131305s)][1.67865 (0.0163002s)][1.88916 (0.033949s)][1.11861 (0.0336398s)][[*1] (0.0412289s)][[*1] (0.083134s)][[*1] (0.190174s)]]\n[[cpp_int(fixed)][[*1] (0.000877268s)][[*1] (0.00687102s)][1.82016 (0.0237507s)][1.90391 (0.0184876s)]]\n[[gmp_int][5.87168 (0.00515104s)][1.45191 (0.00997612s)][[*1] (0.0130487s)][[*1] (0.00971031s)][[*1] (0.0179704s)][[*1] (0.0300729s)][1.96754 (0.0811195s)][1.62045 (0.134715s)]]\n[[tommath_int][13.6707 (0.0119929s)][1.03266 (0.00709542s)][1.02249 (0.0133422s)][1.4749 (0.0143218s)][1.17551 (0.0211244s)][1.08462 (0.0326177s)][1.47125 (0.060658s)][2.75813 (0.229295s)]]\n]\n[table Operator +(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][7.65014 (0.00534018s)][1.8992 (0.0063589s)][1.56778 (0.00666443s)][1.29719 (0.00836612s)][1.73231 (0.0204874s)][1.26754 (0.024805s)][[*1] (0.0198385s)][[*1] (0.0338486s)][[*1] (0.0760202s)]]\n[[cpp_int(fixed)][[*1] (0.000698051s)][1.72665 (0.00578118s)][1.57164 (0.00668085s)][1.90796 (0.0123052s)]]\n[[gmp_int][4.97679 (0.00347405s)][[*1] (0.0033482s)][[*1] (0.00425087s)][[*1] (0.0064494s)][[*1] (0.0118266s)][[*1] (0.0195694s)][3.53343 (0.0700979s)][2.28146 (0.0772241s)]]\n[[tommath_int][127.407 (0.0889366s)][24.8716 (0.0832749s)][20.4864 (0.0870848s)][12.5462 (0.0809152s)][7.07209 (0.083639s)][4.79434 (0.0938225s)][5.93694 (0.11778s)][5.20775 (0.176275s)]]\n]\n[table Operator +(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][9.92952 (0.00893714s)][2.68575 (0.0136811s)][1.73024 (0.0102989s)][1.43961 (0.0115471s)][1.46556 (0.0237404s)][1.68706 (0.0294774s)][[*1] (0.0253811s)][[*1] (0.0350422s)][[*1] (0.0761856s)]]\n[[cpp_int(fixed)][[*1] (0.000900057s)][1.27396 (0.00648945s)][1.38787 (0.008261s)][1.56798 (0.0125768s)]]\n[[gmp_int][5.22669 (0.00470432s)][[*1] (0.00509394s)][[*1] (0.00595229s)][[*1] (0.00802101s)][[*1] (0.0161988s)][[*1] (0.0174726s)][1.83602 (0.0466003s)][1.90731 (0.0668364s)]]\n[[tommath_int][100.859 (0.0907784s)][19.2654 (0.0981367s)][14.4537 (0.0860324s)][10.0594 (0.0806864s)][5.71755 (0.0926177s)][6.23483 (0.108939s)][4.63528 (0.117648s)][5.01743 (0.175822s)]]\n]\n[table Operator +=(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][12.2366 (0.0106404s)][1.48157 (0.00996803s)][1.58862 (0.0108279s)][2.06658 (0.0131949s)][1.1631 (0.0186902s)][[*1] (0.0201879s)][[*1] (0.0218483s)][[*1] (0.0394761s)][[*1] (0.0783171s)]]\n[[cpp_int(fixed)][[*1] (0.000869555s)][1.34779 (0.00906799s)][[*1] (0.00681593s)][[*1] (0.00638493s)]]\n[[gmp_int][11.3522 (0.00987134s)][[*1] (0.00672804s)][1.27495 (0.00868995s)][2.42237 (0.0154667s)][[*1] (0.0160693s)][1.09672 (0.0221405s)][2.61199 (0.0570676s)][2.13093 (0.0841208s)]]\n[[tommath_int][88.4252 (0.0768906s)][14.139 (0.0951277s)][11.6282 (0.0792569s)][14.5551 (0.0929332s)][6.86867 (0.110375s)][5.67471 (0.11456s)][7.29502 (0.159384s)][5.733 (0.226317s)]]\n]\n[table Operator -\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][4.45457 (0.00859678s)][1.28478 (0.013219s)][1.27873 (0.0117779s)][1.43649 (0.0151597s)][2.82516 (0.0507822s)][1.17197 (0.037733s)][[*1] (0.0463464s)][[*1] (0.0813138s)][[*1] (0.191562s)]]\n[[cpp_int(fixed)][[*1] (0.00192988s)][[*1] (0.010289s)][[*1] (0.00921062s)][1.5372 (0.0162226s)]]\n[[gmp_int][3.4436 (0.00664573s)][1.25045 (0.0128659s)][1.10953 (0.0102195s)][[*1] (0.0105533s)][[*1] (0.017975s)][[*1] (0.0321962s)][2.54862 (0.11812s)][1.83623 (0.14931s)]]\n[[tommath_int][9.3224 (0.0179911s)][1.08796 (0.011194s)][1.93265 (0.017801s)][1.82306 (0.0192393s)][1.55663 (0.0279804s)][1.6544 (0.0532653s)][1.90928 (0.0884881s)][4.41259 (0.358805s)]]\n]\n[table Operator -(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][3.07164 (0.00347144s)][1.38957 (0.00531251s)][1.29053 (0.00548206s)][1.35239 (0.00759591s)][1.50007 (0.0176467s)][1.44798 (0.032706s)][[*1] (0.0209158s)][[*1] (0.0402632s)][[*1] (0.0674681s)]]\n[[cpp_int(fixed)][[*1] (0.00113016s)][1.26281 (0.00482789s)][1.25074 (0.00531307s)][3.3923 (0.0190533s)]]\n[[gmp_int][3.22069 (0.00363988s)][[*1] (0.00382312s)][[*1] (0.00424793s)][[*1] (0.00561665s)][[*1] (0.0117639s)][[*1] (0.0225873s)][2.75829 (0.0576919s)][2.03214 (0.0818204s)]]\n[[tommath_int][81.1433 (0.0917047s)][21.4543 (0.0820224s)][19.3098 (0.0820267s)][16.2994 (0.0915478s)][7.23608 (0.0851246s)][4.48441 (0.101291s)][5.51882 (0.115431s)][4.44737 (0.179066s)]]\n]\n[table Operator -(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][7.02787 (0.00807189s)][1.85949 (0.00922027s)][1.40179 (0.00830959s)][1.22546 (0.00988039s)][1.27526 (0.0235442s)][1.00875 (0.0222548s)][[*1] (0.0242017s)][[*1] (0.0317445s)][[*1] (0.0783054s)]]\n[[cpp_int(fixed)][[*1] (0.00114855s)][1.03947 (0.00515424s)][1.22566 (0.00726552s)][1.56568 (0.0126235s)]]\n[[gmp_int][7.54669 (0.00866778s)][[*1] (0.0049585s)][[*1] (0.00592785s)][[*1] (0.00806262s)][[*1] (0.0184622s)][[*1] (0.0220616s)][1.79985 (0.0435595s)][2.08427 (0.0661641s)]]\n[[tommath_int][72.1332 (0.0828488s)][18.985 (0.0941371s)][13.9301 (0.0825755s)][9.93889 (0.0801335s)][5.42256 (0.100113s)][4.58437 (0.101139s)][4.91664 (0.118991s)][5.5407 (0.175887s)]]\n]\n[table Operator -=(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][10.8565 (0.0103583s)][2.00541 (0.0102937s)][1.73348 (0.0103591s)][2.53718 (0.0189898s)][1.21308 (0.0265754s)][1.10592 (0.0277295s)][[*1] (0.0249248s)][[*1] (0.0377524s)][[*1] (0.070851s)]]\n[[cpp_int(fixed)][[*1] (0.000954108s)][[*1] (0.00513296s)][[*1] (0.00597589s)][[*1] (0.00748462s)]]\n[[gmp_int][6.6602 (0.00635455s)][1.61345 (0.00828179s)][1.41745 (0.00847054s)][1.41728 (0.0106078s)][[*1] (0.0219074s)][[*1] (0.0250737s)][2.12439 (0.05295s)][2.51074 (0.0947863s)]]\n[[tommath_int][88.858 (0.0847801s)][18.6448 (0.0957029s)][13.7283 (0.0820388s)][13.4423 (0.100611s)][4.83335 (0.105886s)][4.6829 (0.117418s)][7.59449 (0.189292s)][5.86189 (0.2213s)]]\n]\n[table Operator /\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][3.20876 (0.0878919s)][3.17469 (0.181536s)][3.14517 (0.250544s)][4.14655 (0.365546s)][4.70812 (0.702366s)][4.81923 (1.00586s)][2.28619 (1.18106s)][3.54663 (2.26453s)][[*1] (4.52755s)]]\n[[cpp_int(fixed)][[*1] (0.0273912s)][1.72404 (0.098585s)][2.12584 (0.169344s)][3.71442 (0.327451s)]]\n[[gmp_int][1.70383 (0.04667s)][[*1] (0.0571824s)][[*1] (0.0796599s)][[*1] (0.0881567s)][[*1] (0.149182s)][[*1] (0.208719s)][[*1] (0.516606s)][[*1] (0.638503s)]]\n[[tommath_int][40.8044 (1.11768s)][17.2975 (0.989116s)][17.4097 (1.38686s)][20.9668 (1.84837s)][20.6415 (3.07934s)][31.5839 (6.59216s)][33.0087 (17.0525s)][81.0894 (51.7759s)]]\n]\n[table Operator /(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][4.50037 (0.0520677s)][6.30243 (0.108097s)][8.34437 (0.193637s)][7.02879 (0.296939s)][6.47793 (0.630264s)][5.49102 (0.859876s)][2.64044 (1.08346s)][3.92627 (2.33772s)][[*1] (4.22641s)]]\n[[cpp_int(fixed)][1.27227 (0.0147198s)][4.34067 (0.0744498s)][6.08699 (0.141253s)][6.56549 (0.277366s)]]\n[[gmp_int][[*1] (0.0115696s)][[*1] (0.0171517s)][[*1] (0.0232057s)][[*1] (0.0422461s)][[*1] (0.0972941s)][[*1] (0.156597s)][[*1] (0.410334s)][[*1] (0.595404s)]]\n[[tommath_int][60.4712 (0.69963s)][44.8464 (0.769191s)][40.4334 (0.938285s)][35.0752 (1.48179s)][26.8178 (2.60921s)][37.2616 (5.83504s)][37.7146 (15.4756s)][84.1326 (50.0929s)]]\n]\n[table Operator /(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][6.09203 (0.0582351s)][6.42997 (0.0982056s)][6.2137 (0.151642s)][6.62408 (0.281298s)][9.30105 (0.706562s)][6.64685 (0.832241s)][3.66307 (1.0584s)][4.10257 (2.14867s)][[*1] (4.2547s)]]\n[[cpp_int(fixed)][1.76794 (0.0169001s)][3.59379 (0.0548884s)][5.55499 (0.135566s)][6.36274 (0.2702s)]]\n[[gmp_int][[*1] (0.00955921s)][[*1] (0.0152731s)][[*1] (0.0244044s)][[*1] (0.042466s)][[*1] (0.0759658s)][[*1] (0.125208s)][[*1] (0.288938s)][[*1] (0.523737s)]]\n[[tommath_int][63.2738 (0.604848s)][57.3767 (0.876321s)][43.9301 (1.07209s)][40.0122 (1.69916s)][41.1147 (3.12331s)][57.9739 (7.25882s)][68.6676 (19.8407s)][109.312 (57.2509s)]]\n]\n[table Operator /=(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][5.21402 (0.0701172s)][4.76442 (0.105309s)][5.1245 (0.171387s)][7.39587 (0.299993s)][6.88568 (0.632889s)][5.93971 (0.873081s)][3.2993 (1.05399s)][3.52936 (2.14442s)][[*1] (4.37618s)]]\n[[cpp_int(fixed)][1.68246 (0.0226255s)][3.12633 (0.0691018s)][3.98733 (0.133354s)][6.62903 (0.268888s)]]\n[[gmp_int][[*1] (0.0134478s)][[*1] (0.0221032s)][[*1] (0.0334445s)][[*1] (0.0405622s)][[*1] (0.0919138s)][[*1] (0.14699s)][[*1] (0.319457s)][[*1] (0.607595s)]]\n[[tommath_int][46.0731 (0.619583s)][43.6571 (0.964961s)][30.1861 (1.00956s)][41.4936 (1.68307s)][32.6785 (3.0036s)][48.2935 (7.09868s)][64.9093 (20.7357s)][111.801 (67.9296s)]]\n]\n[table Operator <<\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][9.93178 (0.0116142s)][1.74005 (0.0147029s)][2.68859 (0.0238748s)][2.04419 (0.0394659s)][2.15112 (0.0859331s)][1.26154 (0.0753453s)][[*1] (0.0889652s)][[*1] (0.190562s)][[*1] (0.32803s)]]\n[[cpp_int(fixed)][[*1] (0.00116939s)][[*1] (0.00844969s)][1.94851 (0.0173029s)][1.55242 (0.0299716s)]]\n[[gmp_int][4.60815 (0.00538874s)][1.02939 (0.00869801s)][[*1] (0.00888006s)][[*1] (0.0193064s)][[*1] (0.039948s)][[*1] (0.0597248s)][1.65224 (0.146992s)][1.08567 (0.206887s)]]\n[[tommath_int][10.7935 (0.0126218s)][2.38166 (0.0201243s)][2.42444 (0.0215291s)][1.87488 (0.0361972s)][1.73489 (0.0693055s)][1.93177 (0.115375s)][2.49667 (0.222116s)][2.82346 (0.538044s)]]\n]\n[table Operator >>\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][12.5304 (0.011709s)][6.85524 (0.0153366s)][8.77866 (0.0209131s)][3.21549 (0.0146098s)][4.04361 (0.0183489s)][5.86336 (0.0183679s)][3.04276 (0.0219967s)][8.19636 (0.0537598s)][[*1] (0.0745484s)]]\n[[cpp_int(fixed)][[*1] (0.000934446s)][6.55349 (0.0146615s)][6.51353 (0.0155169s)][4.90631 (0.0222922s)]]\n[[gmp_int][2.59712 (0.00242687s)][[*1] (0.0022372s)][[*1] (0.00238226s)][[*1] (0.00454358s)][[*1] (0.00453774s)][[*1] (0.00313265s)][[*1] (0.00722919s)][[*1] (0.00655899s)]]\n[[tommath_int][102.662 (0.0959319s)][42.5337 (0.0951565s)][39.1437 (0.0932504s)][21.0397 (0.0955953s)][29.6104 (0.134364s)][62.7092 (0.196446s)][49.6167 (0.358689s)][137.105 (0.899272s)]]\n]\n[table Operator ^\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][2.8103 (0.0101384s)][4.11932 (0.0282768s)][2.25923 (0.0139063s)][1.94172 (0.0187085s)][1.66067 (0.0405646s)][1.10651 (0.0475314s)][[*1] (0.0369865s)][[*1] (0.0918676s)][[*1] (0.150955s)]]\n[[cpp_int(fixed)][[*1] (0.00360758s)][[*1] (0.00686442s)][1.50683 (0.00927498s)][1.79076 (0.0172541s)]]\n[[gmp_int][1.35398 (0.0048846s)][1.00969 (0.00693092s)][[*1] (0.00615531s)][[*1] (0.00963503s)][[*1] (0.0244266s)][[*1] (0.0429561s)][2.17737 (0.0805332s)][1.3521 (0.124214s)]]\n[[tommath_int][2.28701 (0.00825059s)][1.65996 (0.0113947s)][2.06089 (0.0126854s)][2.03244 (0.0195826s)][1.4173 (0.0346198s)][1.32237 (0.0568037s)][2.69468 (0.0996668s)][2.55626 (0.234837s)]]\n]\n[table Operator ^(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][2.67312 (0.00991885s)][1.57246 (0.0115174s)][2.50193 (0.0198209s)][[*1] (0.0153479s)][[*1] (0.0264078s)][[*1] (0.0206665s)][[*1] (0.0235546s)][[*1] (0.0392727s)][[*1] (0.0657809s)]]\n[[cpp_int(fixed)][[*1] (0.00371059s)][[*1] (0.0073244s)][[*1] (0.00792226s)][1.04763 (0.0160789s)]]\n[[gmp_int][2.86377 (0.0106263s)][2.18619 (0.0160125s)][2.18777 (0.0173321s)][1.01844 (0.0156309s)][1.13176 (0.0298873s)][1.9665 (0.0406408s)][3.34613 (0.0788165s)][3.54952 (0.139399s)]]\n[[tommath_int][26.101 (0.0968501s)][14.6444 (0.107261s)][10.0538 (0.079649s)][5.64392 (0.0866224s)][3.8806 (0.102478s)][6.36386 (0.131519s)][8.07216 (0.190136s)][8.01428 (0.314742s)]]\n]\n[table Operator construct\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][3.24638 (0.00190752s)][1.06172 (0.00258002s)][[*1] (0.00248269s)][[*1] (0.00191598s)][[*1] (0.00273948s)][[*1] (0.00240729s)][[*1] (0.0017072s)][[*1] (0.00191549s)][[*1] (0.0016635s)]]\n[[cpp_int(fixed)][[*1] (0.000587582s)][[*1] (0.00243004s)][1.51116 (0.00375174s)][4.66482 (0.00893771s)]]\n[[gmp_int][5.61558 (0.00329962s)][1.52898 (0.0037155s)][2.51713 (0.00624925s)][1.755 (0.00336255s)][1.40183 (0.00384029s)][1.60131 (0.00385483s)][4.7818 (0.0081635s)][2.07779 (0.00397999s)]]\n[[tommath_int][251.1 (0.147542s)][63.6186 (0.154596s)][54.6947 (0.13579s)][66.8839 (0.128148s)][47.8098 (0.130974s)][54.8252 (0.13198s)][74.1436 (0.126578s)][83.945 (0.160796s)]]\n]\n[table Operator construct(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][2.12644 (0.00192028s)][[*1] (0.00200418s)][[*1] (0.00223886s)][[*1] (0.00189442s)][[*1] (0.00190833s)][[*1] (0.00288069s)][[*1] (0.00199036s)][[*1] (0.00200998s)][[*1] (0.00168004s)]]\n[[cpp_int(fixed)][[*1] (0.000903049s)][1.26395 (0.00253319s)][1.78621 (0.00399907s)][5.10701 (0.0096748s)]]\n[[gmp_int][27.1389 (0.0245077s)][10.3593 (0.020762s)][9.02272 (0.0202006s)][9.96334 (0.0188747s)][15.2262 (0.0290565s)][8.50239 (0.0244927s)][35.6564 (0.0709692s)][10.9129 (0.0219346s)]]\n[[tommath_int][183.484 (0.165695s)][83.0709 (0.166489s)][69.5984 (0.155821s)][75.8903 (0.143768s)][85.5979 (0.163349s)][50.8174 (0.146389s)][70.0602 (0.139445s)][95.4952 (0.191943s)]]\n]\n[table Operator construct(unsigned)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][2.00349 (0.00174712s)][[*1] (0.00225895s)][[*1] (0.00241092s)][[*1] (0.00177047s)][[*1] (0.00304865s)][[*1] (0.00241711s)][[*1] (0.0018378s)][[*1] (0.0017583s)][[*1] (0.00197229s)]]\n[[cpp_int(fixed)][[*1] (0.000872038s)][1.1805 (0.0026667s)][1.66167 (0.00400614s)][5.54475 (0.00981681s)]]\n[[gmp_int][27.6419 (0.0241048s)][10.0723 (0.0227529s)][7.60577 (0.0183369s)][10.2725 (0.0181871s)][9.38419 (0.0286091s)][9.10394 (0.0220052s)][34.6032 (0.0635939s)][15.7134 (0.0276289s)]]\n[[tommath_int][207.462 (0.180915s)][84.5379 (0.190967s)][65.2109 (0.157218s)][84.8572 (0.150237s)][47.0682 (0.143494s)][59.4466 (0.143689s)][78.5549 (0.144368s)][103.519 (0.182018s)]]\n]\n[table Operator gcd\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][2.10743 (0.358587s)][1.8778 (1.42989s)][2.03859 (3.30534s)][2.01435 (7.01715s)][2.16957 (17.7583s)][1.16957 (21.9738s)][[*1] (32.2572s)][[*1] (76.6459s)][[*1] (201.791s)]]\n[[cpp_int(fixed)][3.65486 (0.621889s)][1.78424 (1.35865s)][2.02664 (3.28597s)][1.95328 (6.8044s)]]\n[[gmp_int][[*1] (0.170154s)][[*1] (0.761472s)][[*1] (1.62139s)][[*1] (3.48358s)][[*1] (8.18516s)][[*1] (18.7879s)][1.82325 (58.8129s)][1.59356 (122.14s)]]\n[[tommath_int][8.01966 (1.36458s)][4.44226 (3.38266s)][4.55056 (7.37824s)][4.42983 (15.4317s)][5.23788 (42.8729s)][7.25799 (136.362s)][14.6265 (471.81s)][23.1025 (1770.72s)]]\n]\n[table Operator powm\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_int][14.8198 (0.565871s)][13.2096 (2.0199s)][11.8233 (9.06469s)][9.12533 (46.9932s)]]\n[[cpp_int(fixed)][9.40069 (0.35895s)][10.0395 (1.53516s)][10.5353 (8.07714s)][8.49678 (43.7564s)]]\n[[gmp_int][[*1] (0.0381833s)][[*1] (0.152912s)][[*1] (0.766677s)][[*1] (5.14976s)]]\n[[tommath_int][11.0485 (0.421869s)][8.44037 (1.29063s)][4.18756 (3.21051s)][2.45216 (12.628s)]]\n]\n[table Operator str\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][1.47697 (0.000264092s)][2.87174 (0.000644609s)][2.28911 (0.00141073s)][4.92453 (0.00383604s)][5.61647 (0.0137593s)][4.87866 (0.0237422s)][1.87264 (0.0491109s)][4.29909 (0.171316s)][[*1] (0.595522s)]]\n[[cpp_int(fixed)][4.73326 (0.00084634s)][1.78742 (0.000401216s)][1.68455 (0.00103815s)][4.30889 (0.00335647s)]]\n[[gmp_int][[*1] (0.000178807s)][[*1] (0.000224466s)][[*1] (0.00061628s)][[*1] (0.000778966s)][[*1] (0.00244981s)][[*1] (0.00486654s)][[*1] (0.0262254s)][[*1] (0.0398493s)]]\n[[tommath_int][16.7304 (0.00299152s)][26.6015 (0.00597113s)][30.9815 (0.0190933s)][74.7467 (0.0582251s)][82.4773 (0.202054s)][154.996 (0.754295s)][107.534 (2.82013s)][279.178 (11.1251s)]]\n]\n[table Operator |\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][2.26845 (0.00991773s)][1.955 (0.00939722s)][2.01122 (0.012635s)][1.76421 (0.0152013s)][1.92162 (0.0293243s)][[*1] (0.0334167s)][[*1] (0.0377549s)][[*1] (0.0916779s)][[*1] (0.152323s)]]\n[[cpp_int(fixed)][1.00452 (0.0043918s)][1.37689 (0.00661838s)][1.3138 (0.00825362s)][1.71906 (0.0148123s)]]\n[[gmp_int][[*1] (0.00437203s)][[*1] (0.00480677s)][[*1] (0.00628228s)][[*1] (0.00861647s)][[*1] (0.0152602s)][1.09283 (0.0365187s)][2.43832 (0.0920584s)][1.21204 (0.111118s)]]\n[[tommath_int][1.69103 (0.00739324s)][1.85402 (0.00891185s)][1.78526 (0.0112155s)][1.86487 (0.0160686s)][1.75184 (0.0267336s)][1.44011 (0.0481236s)][2.33195 (0.0880424s)][2.33204 (0.213797s)]]\n]\n[table Operator |(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits][2048 Bits][2688 Bits][4096 Bits][8192 Bits][16384 Bits]]\n[[cpp_int][2.11741 (0.00805945s)][2.16753 (0.0119795s)][1.5717 (0.012189s)][1.10016 (0.0134288s)][1.11289 (0.0309032s)][[*1] (0.0214828s)][[*1] (0.0232284s)][[*1] (0.042441s)][[*1] (0.0711061s)]]\n[[cpp_int(fixed)][[*1] (0.00380628s)][[*1] (0.00552682s)][[*1] (0.00775532s)][[*1] (0.0122062s)]]\n[[gmp_int][2.62934 (0.010008s)][1.86878 (0.0103284s)][3.19589 (0.0247852s)][1.1073 (0.0135159s)][[*1] (0.0277685s)][1.67609 (0.0360071s)][3.76493 (0.0874534s)][2.72382 (0.115602s)]]\n[[tommath_int][22.0502 (0.0839291s)][18.6272 (0.102949s)][9.99323 (0.0775007s)][6.28905 (0.0767652s)][3.28821 (0.0913086s)][5.0968 (0.109494s)][6.47865 (0.150489s)][4.8474 (0.205729s)]]\n]\n[endsect]\n[section:rational_performance Rational Type Perfomance]\n[table Operator *\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][2.00025 (0.797425s)][1.97726 (2.96998s)][1.86844 (6.73224s)][1.96608 (14.4259s)]]\n[[mpq_rational][[*1] (0.398662s)][[*1] (1.50207s)][[*1] (3.60314s)][[*1] (7.3374s)]]\n]\n[table Operator *(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.88073 (0.0637195s)][1.93184 (0.0917847s)][2.15609 (0.118274s)][2.4236 (0.218283s)]]\n[[mpq_rational][[*1] (0.0338803s)][[*1] (0.0475114s)][[*1] (0.0548556s)][[*1] (0.0900656s)]]\n]\n[table Operator *(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.60877 (0.161844s)][2.33429 (0.240069s)][1.8835 (0.298935s)][2.70338 (0.448194s)]]\n[[mpq_rational][[*1] (0.100601s)][[*1] (0.102844s)][[*1] (0.158713s)][[*1] (0.16579s)]]\n]\n[table Operator *(value_type)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.97503 (0.408791s)][2.42069 (0.600225s)][2.65138 (0.803009s)][4.65673 (1.54645s)]]\n[[mpq_rational][[*1] (0.20698s)][[*1] (0.247956s)][[*1] (0.302865s)][[*1] (0.332089s)]]\n]\n[table Operator *=(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.97207 (0.211848s)][2.18482 (0.226179s)][2.43682 (0.319695s)][2.69933 (0.485819s)]]\n[[mpq_rational][[*1] (0.107424s)][[*1] (0.103523s)][[*1] (0.131194s)][[*1] (0.179978s)]]\n]\n[table Operator *=(value_type)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.95211 (0.40255s)][2.60942 (0.629302s)][2.83854 (0.8029s)][4.34054 (1.37083s)]]\n[[mpq_rational][[*1] (0.206213s)][[*1] (0.241165s)][[*1] (0.282857s)][[*1] (0.31582s)]]\n]\n[table Operator +\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][2.20364 (0.415006s)][1.97574 (1.53458s)][1.75945 (3.41194s)][2.11634 (8.04044s)]]\n[[mpq_rational][[*1] (0.188327s)][[*1] (0.776716s)][[*1] (1.93921s)][[*1] (3.79923s)]]\n]\n[table Operator +(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][2.06836 (0.0177811s)][1.80334 (0.0183744s)][1.38442 (0.020452s)][1.81894 (0.0449351s)]]\n[[mpq_rational][[*1] (0.00859669s)][[*1] (0.0101891s)][[*1] (0.014773s)][[*1] (0.024704s)]]\n]\n[table Operator +(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][2.07187 (0.0177151s)][2.3005 (0.0241089s)][1.81397 (0.0297836s)][1.72202 (0.046594s)]]\n[[mpq_rational][[*1] (0.0085503s)][[*1] (0.0104799s)][[*1] (0.016419s)][[*1] (0.0270577s)]]\n]\n[table Operator +(value_type)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.2805 (0.0265647s)][1.59353 (0.0391054s)][1.26613 (0.044067s)][1.95307 (0.105801s)]]\n[[mpq_rational][[*1] (0.0207456s)][[*1] (0.0245401s)][[*1] (0.0348044s)][[*1] (0.0541719s)]]\n]\n[table Operator +=(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][7.29749 (0.0565983s)][3.77253 (0.0371419s)][2.72128 (0.0556987s)][2.01495 (0.0662456s)]]\n[[mpq_rational][[*1] (0.00775585s)][[*1] (0.00984535s)][[*1] (0.0204678s)][[*1] (0.032877s)]]\n]\n[table Operator +=(value_type)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.92025 (0.0335896s)][2.08321 (0.0422867s)][1.587 (0.0564267s)][1.85357 (0.0840696s)]]\n[[mpq_rational][[*1] (0.0174923s)][[*1] (0.0202988s)][[*1] (0.0355556s)][[*1] (0.0453556s)]]\n]\n[table Operator -\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][2.38126 (0.471759s)][1.92631 (1.52484s)][1.76181 (3.49648s)][2.03462 (7.71926s)]]\n[[mpq_rational][[*1] (0.198113s)][[*1] (0.791584s)][[*1] (1.98459s)][[*1] (3.79396s)]]\n]\n[table Operator -(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][2.44447 (0.0292894s)][2.54602 (0.0346718s)][1.4869 (0.035503s)][1.95344 (0.0577029s)]]\n[[mpq_rational][[*1] (0.0119819s)][[*1] (0.013618s)][[*1] (0.0238773s)][[*1] (0.0295391s)]]\n]\n[table Operator -(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][2.93654 (0.0296698s)][4.23087 (0.0496956s)][1.68041 (0.0461985s)][1.4455 (0.0581714s)]]\n[[mpq_rational][[*1] (0.0101037s)][[*1] (0.0117459s)][[*1] (0.0274924s)][[*1] (0.040243s)]]\n]\n[table Operator -(value_type)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.69242 (0.0408789s)][1.5205 (0.0467416s)][1.31525 (0.0548939s)][2.16115 (0.103471s)]]\n[[mpq_rational][[*1] (0.0241541s)][[*1] (0.030741s)][[*1] (0.0417365s)][[*1] (0.0478777s)]]\n]\n[table Operator -=(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][3.69509 (0.0366534s)][3.7306 (0.0439181s)][1.8352 (0.0491612s)][1.86662 (0.071761s)]]\n[[mpq_rational][[*1] (0.00991947s)][[*1] (0.0117724s)][[*1] (0.0267879s)][[*1] (0.0384444s)]]\n]\n[table Operator -=(value_type)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.76299 (0.0421283s)][2.03803 (0.0490152s)][1.84864 (0.053198s)][2.10533 (0.0881228s)]]\n[[mpq_rational][[*1] (0.023896s)][[*1] (0.0240502s)][[*1] (0.0287769s)][[*1] (0.041857s)]]\n]\n[table Operator /\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][2.03433 (2.28881s)][2.24309 (6.34454s)][2.1203 (13.2036s)][2.36142 (29.3236s)]]\n[[mpq_rational][[*1] (1.12509s)][[*1] (2.82848s)][[*1] (6.22726s)][[*1] (12.4178s)]]\n]\n[table Operator /(int)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][[*1] (0.035134s)][1.08556 (0.0774619s)][1.08797 (0.104628s)][1.29134 (0.207067s)]]\n[[mpq_rational][1.85049 (0.0650149s)][[*1] (0.0713565s)][[*1] (0.0961679s)][[*1] (0.16035s)]]\n]\n[table Operator /(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.31397 (0.170727s)][1.63747 (0.216019s)][1.68581 (0.292536s)][1.76695 (0.435259s)]]\n[[mpq_rational][[*1] (0.129932s)][[*1] (0.131923s)][[*1] (0.173528s)][[*1] (0.246334s)]]\n]\n[table Operator /(value_type)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.82473 (0.431612s)][2.20261 (0.596248s)][2.45848 (0.809662s)][3.88675 (1.38001s)]]\n[[mpq_rational][[*1] (0.236534s)][[*1] (0.270701s)][[*1] (0.329335s)][[*1] (0.355055s)]]\n]\n[table Operator /=(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.58868 (0.216252s)][1.71288 (0.235781s)][1.78218 (0.314161s)][1.98715 (0.460033s)]]\n[[mpq_rational][[*1] (0.136121s)][[*1] (0.137652s)][[*1] (0.176279s)][[*1] (0.231505s)]]\n]\n[table Operator /=(value_type)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][1.72896 (0.40369s)][2.55949 (0.689514s)][2.4929 (0.832288s)][3.51238 (1.37478s)]]\n[[mpq_rational][[*1] (0.233487s)][[*1] (0.269395s)][[*1] (0.333863s)][[*1] (0.391409s)]]\n]\n[table Operator construct\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][[*1] (0.0135822s)][[*1] (0.00935293s)][[*1] (0.0083784s)][[*1] (0.00962697s)]]\n[[mpq_rational][1.44264 (0.0195942s)][2.18249 (0.0204126s)][2.64725 (0.0221797s)][2.87767 (0.0277033s)]]\n]\n[table Operator construct(unsigned long long)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][[*1] (0.00806026s)][[*1] (0.00960336s)][[*1] (0.00769898s)][[*1] (0.0176689s)]]\n[[mpq_rational][4.87225 (0.0392716s)][5.91987 (0.0568506s)][9.03811 (0.0695842s)][3.68339 (0.0650815s)]]\n]\n[table Operator construct(unsigned)\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][[*1] (0.00672081s)][[*1] (0.0064826s)][[*1] (0.00618635s)][[*1] (0.00923644s)]]\n[[mpq_rational][6.47138 (0.0434929s)][7.48645 (0.0485316s)][8.2942 (0.0513108s)][5.77363 (0.0533278s)]]\n]\n[table Operator str\n[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]]\n[[cpp_rational][6.17439 (0.00168424s)][7.6748 (0.0033367s)][6.38435 (0.00662873s)][9.07696 (0.0174979s)]]\n[[mpq_rational][[*1] (0.000272779s)][[*1] (0.000434761s)][[*1] (0.00103828s)][[*1] (0.00192772s)]]\n]\n[endsect]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test01.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n\nvoid test01()\n{\n#ifdef TEST_INT64\n   test<std::uint64_t>(\"std::uint64_t\", 64);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test02.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_MPF)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n\nvoid test02()\n{\n#ifdef TEST_MPF\n   test<boost::multiprecision::mpf_float_50>(\"gmp_float\", 50);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test03.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_MPF)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n\nvoid test03()\n{\n#ifdef TEST_MPF\n   test<boost::multiprecision::mpf_float_100>(\"gmp_float\", 100);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test04.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_MPF)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n\nvoid test04()\n{\n#ifdef TEST_MPF\n   test<boost::multiprecision::mpf_float_500>(\"gmp_float\", 500);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test05.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_MPZ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n\nvoid test05()\n{\n#ifdef TEST_MPZ\n   test<boost::multiprecision::mpz_int>(\"gmp_int\", 128);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test06.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_MPZ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n\nvoid test06()\n{\n#ifdef TEST_MPZ\n   test<boost::multiprecision::mpz_int>(\"gmp_int\", 256);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test07.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_MPZ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n\nvoid test07()\n{\n#ifdef TEST_MPZ\n   test<boost::multiprecision::mpz_int>(\"gmp_int\", 512);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test08.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_MPZ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n\nvoid test08()\n{\n#ifdef TEST_MPZ\n   test<boost::multiprecision::mpz_int>(\"gmp_int\", 1024);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test09.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_INT)\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n\nvoid test09()\n{\n#ifdef TEST_CPP_INT\n   //test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>, boost::multiprecision::et_off> >(\"cpp_int(unsigned, fixed)\", 64);\n   //test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>, boost::multiprecision::et_off> >(\"cpp_int(fixed)\", 64);\n   test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<128, 128, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>, boost::multiprecision::et_off> >(\"cpp_int(fixed)\", 128);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test10.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_INT)\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n\nvoid test10()\n{\n#ifdef TEST_CPP_INT\n   test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<256, 256, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>, boost::multiprecision::et_off> >(\"cpp_int(fixed)\", 256);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test11.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_INT)\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n\nvoid test11()\n{\n#ifdef TEST_CPP_INT\n   test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<512, 512, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>, boost::multiprecision::et_off> >(\"cpp_int(fixed)\", 512);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test12.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_INT)\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n\nvoid test12()\n{\n#ifdef TEST_CPP_INT\n   test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<1024, 1024, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>, boost::multiprecision::et_off> >(\"cpp_int(fixed)\", 1024);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test13.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_INT)\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n\nvoid test13()\n{\n#ifdef TEST_CPP_INT\n   test<boost::multiprecision::cpp_int>(\"cpp_int\", 128);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test14.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_INT)\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n\nvoid test14()\n{\n#ifdef TEST_CPP_INT\n   test<boost::multiprecision::cpp_int>(\"cpp_int\", 256);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test15.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_INT)\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n\nvoid test15()\n{\n#ifdef TEST_CPP_INT\n   test<boost::multiprecision::cpp_int>(\"cpp_int\", 512);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test16.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_INT)\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n\nvoid test16()\n{\n#ifdef TEST_CPP_INT\n   test<boost::multiprecision::cpp_int>(\"cpp_int\", 1024);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test17.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_INT_RATIONAL)\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n\nvoid test17()\n{\n#ifdef TEST_CPP_INT_RATIONAL\n   test<boost::multiprecision::cpp_rational>(\"cpp_rational\", 128);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test18.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_INT_RATIONAL)\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n\nvoid test18()\n{\n#ifdef TEST_CPP_INT_RATIONAL\n   test<boost::multiprecision::cpp_rational>(\"cpp_rational\", 256);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test19.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_INT_RATIONAL)\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n\nvoid test19()\n{\n#ifdef TEST_CPP_INT_RATIONAL\n   test<boost::multiprecision::cpp_rational>(\"cpp_rational\", 512);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test20.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_INT_RATIONAL)\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n\nvoid test20()\n{\n#ifdef TEST_CPP_INT_RATIONAL\n   test<boost::multiprecision::cpp_rational>(\"cpp_rational\", 1024);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test21.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_MPQ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n\nvoid test21()\n{\n#ifdef TEST_MPQ\n   test<boost::multiprecision::mpq_rational>(\"mpq_rational\", 128);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test22.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_MPQ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n\nvoid test22()\n{\n#ifdef TEST_MPQ\n   test<boost::multiprecision::mpq_rational>(\"mpq_rational\", 256);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test23.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_MPQ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n\nvoid test23()\n{\n#ifdef TEST_MPQ\n   test<boost::multiprecision::mpq_rational>(\"mpq_rational\", 512);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test24.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_MPQ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n\nvoid test24()\n{\n#ifdef TEST_MPQ\n   test<boost::multiprecision::mpq_rational>(\"mpq_rational\", 1024);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test25.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_TOMMATH)\n#include <boost/multiprecision/tommath.hpp>\n#endif\n\nvoid test25()\n{\n#ifdef TEST_TOMMATH\n   test<boost::multiprecision::tom_int>(\"tommath_int\", 128);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test26.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_TOMMATH)\n#include <boost/multiprecision/tommath.hpp>\n#endif\n\nvoid test26()\n{\n#ifdef TEST_TOMMATH\n   test<boost::multiprecision::tom_int>(\"tommath_int\", 256);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test27.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_TOMMATH)\n#include <boost/multiprecision/tommath.hpp>\n#endif\n\nvoid test27()\n{\n#ifdef TEST_TOMMATH\n   test<boost::multiprecision::tom_int>(\"tommath_int\", 512);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test28.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_TOMMATH)\n#include <boost/multiprecision/tommath.hpp>\n#endif\n\nvoid test28()\n{\n#ifdef TEST_TOMMATH\n   test<boost::multiprecision::tom_int>(\"tommath_int\", 1024);\n   /*\n   //\n   // These are actually too slow to test!!!\n   //\n   test<boost::multiprecision::tom_rational>(\"tom_rational\", 128);\n   test<boost::multiprecision::tom_rational>(\"tom_rational\", 256);\n   test<boost::multiprecision::tom_rational>(\"tom_rational\", 512);\n   test<boost::multiprecision::tom_rational>(\"tom_rational\", 1024);\n   */\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test29.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_DEC_FLOAT)\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n\nvoid test29()\n{\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>(\"cpp_dec_float\", 50);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test30.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_DEC_FLOAT)\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n\nvoid test30()\n{\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_100>(\"cpp_dec_float\", 100);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test31.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_DEC_FLOAT)\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n\nvoid test31()\n{\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<500> > >(\"cpp_dec_float\", 500);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test32.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_BIN_FLOAT)\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n\nvoid test32()\n{\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>(\"cpp_bin_float\", 50);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test33.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_BIN_FLOAT)\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n\nvoid test33()\n{\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_100>(\"cpp_bin_float\", 100);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test34.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_BIN_FLOAT)\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n\nvoid test34()\n{\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<500> > >(\"cpp_bin_float\", 500);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test35.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n\nvoid test35()\n{\n#ifdef TEST_MPFR\n   test<boost::multiprecision::mpfr_float_50>(\"mpfr_float\", 50);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test36.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n\nvoid test36()\n{\n#ifdef TEST_MPFR\n   test<boost::multiprecision::mpfr_float_50>(\"mpfr_float\", 50);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test37.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n\nvoid test37()\n{\n#ifdef TEST_MPFR\n   test<boost::multiprecision::mpfr_float_100>(\"mpfr_float\", 100);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test38.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n\nvoid test38()\n{\n#ifdef TEST_MPFR\n   test<boost::multiprecision::mpfr_float_500>(\"mpfr_float\", 500);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test39.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_MPZ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n\nvoid test39()\n{\n#ifdef TEST_MPZ\n   test<boost::multiprecision::mpz_int>(\"gmp_int\", 1024*2);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test40.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_MPZ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n\nvoid test40()\n{\n#ifdef TEST_MPZ\n   test<boost::multiprecision::mpz_int>(\"gmp_int\", 1024*4);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test41.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_INT)\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n\nvoid test41()\n{\n#if defined(TEST_CPP_INT) && defined(TEST_KARATSUBA)\n   test<boost::multiprecision::cpp_int>(\"cpp_int\", (boost::multiprecision::backends::karatsuba_cutoff + 2) * sizeof(boost::multiprecision::limb_type) * CHAR_BIT);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test42.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_INT)\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n\nvoid test42()\n{\n#ifdef TEST_CPP_INT\n   test<boost::multiprecision::cpp_int>(\"cpp_int\", 1024 * 2);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test43.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_TOMMATH)\n#include <boost/multiprecision/tommath.hpp>\n#endif\n\nvoid test43()\n{\n#ifdef TEST_TOMMATH\n   test<boost::multiprecision::tom_int>(\"tommath_int\", 1024*2);\n   /*\n   //\n   // These are actually too slow to test!!!\n   //\n   test<boost::multiprecision::tom_rational>(\"tom_rational\", 128);\n   test<boost::multiprecision::tom_rational>(\"tom_rational\", 256);\n   test<boost::multiprecision::tom_rational>(\"tom_rational\", 512);\n   test<boost::multiprecision::tom_rational>(\"tom_rational\", 1024);\n   */\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test44.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_TOMMATH)\n#include <boost/multiprecision/tommath.hpp>\n#endif\n\nvoid test44()\n{\n#ifdef TEST_TOMMATH\n   test<boost::multiprecision::tom_int>(\"tommath_int\", 1024*4);\n   /*\n   //\n   // These are actually too slow to test!!!\n   //\n   test<boost::multiprecision::tom_rational>(\"tom_rational\", 128);\n   test<boost::multiprecision::tom_rational>(\"tom_rational\", 256);\n   test<boost::multiprecision::tom_rational>(\"tom_rational\", 512);\n   test<boost::multiprecision::tom_rational>(\"tom_rational\", 1024);\n   */\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test45.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_INT)\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n\nvoid test45()\n{\n#ifdef TEST_CPP_INT\n   test<boost::multiprecision::cpp_int>(\"cpp_int\", 1024 * 4);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test46.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_INT)\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n\nvoid test46()\n{\n#ifdef TEST_CPP_INT\n   test<boost::multiprecision::cpp_int>(\"cpp_int\", 1024 * 8);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test47.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_CPP_INT)\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n\nvoid test47()\n{\n#ifdef TEST_CPP_INT\n   test<boost::multiprecision::cpp_int>(\"cpp_int\", 1024 * 16);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test48.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_TOMMATH)\n#include <boost/multiprecision/tommath.hpp>\n#endif\n\nvoid test48()\n{\n#ifdef TEST_TOMMATH\n   test<boost::multiprecision::tom_int>(\"tommath_int\", 1024*8);\n   /*\n   //\n   // These are actually too slow to test!!!\n   //\n   test<boost::multiprecision::tom_rational>(\"tom_rational\", 128);\n   test<boost::multiprecision::tom_rational>(\"tom_rational\", 256);\n   test<boost::multiprecision::tom_rational>(\"tom_rational\", 512);\n   test<boost::multiprecision::tom_rational>(\"tom_rational\", 1024);\n   */\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test49.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_TOMMATH)\n#include <boost/multiprecision/tommath.hpp>\n#endif\n\nvoid test49()\n{\n#ifdef TEST_TOMMATH\n   test<boost::multiprecision::tom_int>(\"tommath_int\", 1024*16);\n   /*\n   //\n   // These are actually too slow to test!!!\n   //\n   test<boost::multiprecision::tom_rational>(\"tom_rational\", 128);\n   test<boost::multiprecision::tom_rational>(\"tom_rational\", 256);\n   test<boost::multiprecision::tom_rational>(\"tom_rational\", 512);\n   test<boost::multiprecision::tom_rational>(\"tom_rational\", 1024);\n   */\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test50.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_MPZ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n\nvoid test50()\n{\n#ifdef TEST_MPZ\n   test<boost::multiprecision::mpz_int>(\"gmp_int\", 1024*8);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/performance_test_files/test51.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../performance_test.hpp\"\n#if defined(TEST_MPZ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n\nvoid test51()\n{\n#ifdef TEST_MPZ\n   test<boost::multiprecision::mpz_int>(\"gmp_int\", 1024*16);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/rational_bernoulli_allocations.cpp",
    "content": "//  Copyright 2020 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <iostream>\n#include <benchmark/benchmark.h>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/gmp.hpp>\n\n#include <gmpxx.h>\n\ntemplate <class Integer>\ninline Integer factorial(unsigned n)\n{\n   Integer result = 1;\n   for (unsigned k = 1; k <= n; ++k)\n      result *= k;\n   return result;\n}\n\ntemplate <class Rational, class Integer = typename Rational::value_type>\ninline Rational binomial(unsigned n, unsigned k)\n{\n   return Rational(factorial<Integer>(n), factorial<Integer>(k) * factorial<Integer>(n - k));\n}\n\ninline mpz_class pow(mpz_class i, unsigned p)\n{\n   mpz_class result;\n   mpz_pow_ui(result.get_mpz_t(), i.get_mpz_t(), p);\n   return result;\n}\n\ntemplate <class Rational, class Integer = typename Rational::value_type>\nRational Bernoulli(unsigned m)\n{\n   Rational result = 0;\n\n   for (unsigned k = 0; k <= m; ++k)\n   {\n      Rational inner = 0;\n      for (unsigned v = 0; v <= k; ++v)\n      {\n         Rational term = binomial<Rational, Integer>(k, v) * Rational(pow(Integer(v), m), k + 1);\n         if (v & 1)\n            term = -term;\n         inner += term;\n      }\n      result += inner;\n   }\n   return result;\n}\n\ntemplate <class Rational, class Integer = typename Rational::value_type>\nstatic void BM_bernoulli(benchmark::State& state)\n{\n   int m = state.range(0);\n   for (auto _ : state)\n   {\n      benchmark::DoNotOptimize(Bernoulli<Rational, Integer>(m));\n   }\n}\n\nunsigned allocation_count = 0;\n\nvoid* (*alloc_func_ptr)(size_t);\nvoid* (*realloc_func_ptr)(void*, size_t, size_t);\nvoid (*free_func_ptr)(void*, size_t);\n\nvoid* alloc_func(size_t n)\n{\n   ++allocation_count;\n   return (*alloc_func_ptr)(n);\n}\n\nvoid free_func(void* p, size_t n)\n{\n   (*free_func_ptr)(p, n);\n}\n\nvoid* realloc_func(void* p, size_t old, size_t n)\n{\n   ++allocation_count;\n   return (*realloc_func_ptr)(p, old, n);\n}\n\nunsigned new_count = 0;\n\nvoid* operator new(std::size_t n) throw(std::bad_alloc)\n{\n   ++new_count;\n   return std::malloc(n);\n}\nvoid operator delete(void* p) throw()\n{\n   std::free(p);\n}\n\nvoid* operator new[](std::size_t n) throw(std::bad_alloc)\n{\n   ++new_count;\n   return std::malloc(n);\n}\nvoid operator delete[](void* p) throw()\n{\n   std::free(p);\n}\n\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n   mp_get_memory_functions(&alloc_func_ptr, &realloc_func_ptr, &free_func_ptr);\n   mp_set_memory_functions(&alloc_func, &realloc_func, &free_func);\n\n   std::cout << \"[table Total Allocation Counts for Bernoulli Number Calculation\\n\"\n      \"[[m][cpp_rational][mpq_rational][number<rational_adaptor<gmp_int>>][mpq_class]]\\n\";\n\n   for (unsigned m = 2; m < 200; m += 2)\n   {\n      std::cout << \"[[\" << m << \"][\";\n      new_count = 0;\n      Bernoulli<cpp_rational>(m);\n      std::cout << new_count << \"][\";\n      allocation_count = 0;\n      Bernoulli<mpq_rational>(m);\n      std::cout << allocation_count << \"][\";\n      allocation_count = 0;\n      Bernoulli<number<rational_adaptor<gmp_int>>>(m);\n      std::cout << allocation_count << \"][\";\n      allocation_count = 0;\n      Bernoulli<mpq_class, mpz_class>(m);\n      std::cout << allocation_count << \"]]\\n\";\n   }\n\n   std::cout << \"]\\n\";\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/rational_bernoulli_allocations.log",
    "content": "[table Total Allocation Counts for Bernoulli Number Calculation\n[[m][cpp_rational][mpq_rational][number<rational_adaptor<gmp_int>>][mpq_class]]\n[[2][0][77][123][101]]\n[[4][0][187][320][252]]\n[[6][0][345][612][471]]\n[[8][0][551][988][758]]\n[[10][0][805][1464][1113]]\n[[12][0][1107][2044][1536]]\n[[14][0][1457][2698][2027]]\n[[16][0][1857][3458][2587]]\n[[18][0][2336][4320][3216]]\n[[20][0][2885][5297][3913]]\n[[22][6][3511][6358][4706]]\n[[24][22][4203][7601][5600]]\n[[26][83][4963][8911][6575]]\n[[28][377][5806][10370][7632]]\n[[30][780][6738][11947][8769]]\n[[32][1454][7771][13644][9988]]\n[[34][2001][9357][15947][11289]]\n[[36][2789][10598][18023][12704]]\n[[38][3669][11948][20185][14252]]\n[[40][4653][13403][22538][15891]]\n[[42][5923][14976][24990][17620]]\n[[44][7379][16622][27596][19449]]\n[[46][8839][18367][30287][21367]]\n[[48][10296][20227][33295][23431]]\n[[50][12045][22857][36898][25646]]\n[[52][13603][25044][40220][27962]]\n[[54][15276][27331][43755][30389]]\n[[56][17239][29749][47410][32919]]\n[[58][19337][32257][51151][35552]]\n[[60][21409][34958][55308][38417]]\n[[62][23694][37800][59426][41396]]\n[[64][27923][39556][62540][44498]]\n[[66][30240][44706][69096][47711]]\n[[68][32566][47934][73872][51042]]\n[[70][35019][51417][78779][54637]]\n[[72][37460][55047][84163][58363]]\n[[74][40282][58777][89439][62211]]\n[[76][42914][62691][95055][66183]]\n[[78][45752][66694][100709][70296]]\n[[80][48681][70905][106834][74620]]\n[[82][51986][77633][115045][79160]]\n[[84][54855][82364][121949][83842]]\n[[86][59032][87239][128670][88659]]\n[[88][63595][92256][135592][93618]]\n[[90][68352][97486][142665][98820]]\n[[92][72446][102974][150380][104256]]\n[[94][76468][108620][158006][109844]]\n[[96][80361][111109][162765][115594]]\n[[98][84783][121460][174932][121486]]\n[[100][89044][127730][183611][127633]]\n[[102][93561][134241][192393][134050]]\n[[104][98452][140919][201349][140616]]\n[[106][103530][147763][210413][147364]]\n[[108][108326][154804][220168][154276]]\n[[110][113891][162184][229824][161562]]\n[[112][119213][169736][239900][169038]]\n[[114][124770][182417][255032][176693]]\n[[116][130624][190589][265966][184519]]\n[[118][137941][198975][276703][192525]]\n[[120][144829][207759][288645][200952]]\n[[122][152045][216736][300007][209561]]\n[[124][158610][225905][311860][218371]]\n[[126][165383][235283][323744][227360]]\n[[128][173971][230678][322303][236670]]\n[[130][181696][248593][342618][246308]]\n[[132][189310][258615][356021][256148]]\n[[134][197708][268800][369164][266192]]\n[[136][205800][279215][382459][276436]]\n[[138][212940][290112][396424][287167]]\n[[140][217502][301235][410903][298101]]\n[[142][223486][312564][425431][309243]]\n[[144][229579][324133][440945][320605]]\n[[146][237213][344671][464320][332333]]\n[[148][248799][357200][479845][344420]]\n[[150][261345][369947][495567][356745]]\n[[152][272741][382909][512422][369279]]\n[[154][283982][396162][528719][382048]]\n[[156][293626][409993][546804][395353]]\n[[158][304036][424022][564050][408907]]\n[[160][313869][427747][571797][422690]]\n[[162][323626][454723][601473][436715]]\n[[164][333294][469863][620894][451304]]\n[[166][343072][485238][639579][466149]]\n[[168][352236][500922][659464][481221]]\n[[170][362793][516840][678534][496561]]\n[[172][372645][533169][698760][512315]]\n[[174][382908][549962][719939][528510]]\n[[176][392507][567018][741432][544947]]\n[[178][404163][597694][775274][561666]]\n[[180][417539][615615][797960][578647]]\n[[182][432009][634079][819557][596234]]\n[[184][444684][652902][842915][614114]]\n[[186][457104][672042][866413][632248]]\n[[188][469331][691451][890093][650654]]\n[[190][481583][711512][913753][669753]]\n[[192][477225][698188][905638][689111]]\n[[194][488955][736905][948365][708760]]\n[[196][499797][757502][973031][728675]]\n[[198][511163][778591][998650][749102]]\n]\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/rational_bernoulli_bench.cpp",
    "content": "//  Copyright 2020 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <iostream>\n#include <benchmark/benchmark.h>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/gmp.hpp>\n\n#include <gmpxx.h>\n\ntemplate <class Integer>\ninline Integer factorial(unsigned n)\n{\n   Integer result = 1;\n   for (unsigned k = 1; k <= n; ++k)\n      result *= k;\n   return result;\n}\n\ntemplate <class Rational, class Integer = typename Rational::value_type>\ninline Rational binomial(unsigned n, unsigned k)\n{\n   return Rational(factorial<Integer>(n), factorial<Integer>(k) * factorial<Integer>(n - k));\n}\n\ninline mpz_class pow(mpz_class i, unsigned p)\n{\n   mpz_class result;\n   mpz_pow_ui(result.get_mpz_t(), i.get_mpz_t(), p);\n   return result;\n}\n\ntemplate <class Rational, class Integer = typename Rational::value_type>\nRational Bernoulli(unsigned m)\n{\n   Rational result = 0;\n\n   for (unsigned k = 0; k <= m; ++k)\n   {\n      Rational inner = 0;\n      for (unsigned v = 0; v <= k; ++v)\n      {\n         Rational term = binomial<Rational, Integer>(k, v) * Rational(pow(Integer(v), m), k + 1);\n         if (v & 1)\n            term = -term;\n         inner += term;\n      }\n      result += inner;\n   }\n   return result;\n}\n\ntemplate <class Rational, class Integer = typename Rational::value_type>\nstatic void BM_bernoulli(benchmark::State& state)\n{\n   int m = state.range(0);\n   for (auto _ : state)\n   {\n      benchmark::DoNotOptimize(Bernoulli<Rational, Integer>(m));\n   }\n}\n\n\nBENCHMARK_TEMPLATE(BM_bernoulli, boost::multiprecision::cpp_rational)->DenseRange(50, 200, 4);\nBENCHMARK_TEMPLATE(BM_bernoulli, boost::multiprecision::mpq_rational)->DenseRange(50, 200, 4);\nBENCHMARK_TEMPLATE(BM_bernoulli, boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >)->DenseRange(50, 200, 4);\nBENCHMARK_TEMPLATE(BM_bernoulli, mpq_class, mpz_class)->DenseRange(50, 200, 4);\n\nBENCHMARK_MAIN();\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/rational_bernoulli_bench.log",
    "content": "--------------------------------------------------------------------------------------------------------------------------------------------------------------------\nBenchmark                                                                                                                          Time             CPU   Iterations\n--------------------------------------------------------------------------------------------------------------------------------------------------------------------\nBM_bernoulli<boost::multiprecision::cpp_rational>/50                                                                         1888495 ns      1888453 ns          354\nBM_bernoulli<boost::multiprecision::cpp_rational>/54                                                                         2250552 ns      2250503 ns          294\nBM_bernoulli<boost::multiprecision::cpp_rational>/58                                                                         2734589 ns      2734527 ns          246\nBM_bernoulli<boost::multiprecision::cpp_rational>/62                                                                         3318196 ns      3318122 ns          206\nBM_bernoulli<boost::multiprecision::cpp_rational>/66                                                                         3887371 ns      3887281 ns          166\nBM_bernoulli<boost::multiprecision::cpp_rational>/70                                                                         4628631 ns      4628535 ns          135\nBM_bernoulli<boost::multiprecision::cpp_rational>/74                                                                         5354148 ns      5354100 ns          131\nBM_bernoulli<boost::multiprecision::cpp_rational>/78                                                                         6321412 ns      6321172 ns          111\nBM_bernoulli<boost::multiprecision::cpp_rational>/82                                                                         7130681 ns      7130520 ns           99\nBM_bernoulli<boost::multiprecision::cpp_rational>/86                                                                         8390270 ns      8390095 ns           77\nBM_bernoulli<boost::multiprecision::cpp_rational>/90                                                                        10621849 ns     10621760 ns           70\nBM_bernoulli<boost::multiprecision::cpp_rational>/94                                                                        11364659 ns     11364409 ns           64\nBM_bernoulli<boost::multiprecision::cpp_rational>/98                                                                        14031215 ns     14030636 ns           53\nBM_bernoulli<boost::multiprecision::cpp_rational>/102                                                                       15269101 ns     15268211 ns           50\nBM_bernoulli<boost::multiprecision::cpp_rational>/106                                                                       15253625 ns     15253028 ns           44\nBM_bernoulli<boost::multiprecision::cpp_rational>/110                                                                       17638148 ns     17637756 ns           42\nBM_bernoulli<boost::multiprecision::cpp_rational>/114                                                                       18335439 ns     18335007 ns           37\nBM_bernoulli<boost::multiprecision::cpp_rational>/118                                                                       21044600 ns     21044146 ns           33\nBM_bernoulli<boost::multiprecision::cpp_rational>/122                                                                       23713449 ns     23712950 ns           29\nBM_bernoulli<boost::multiprecision::cpp_rational>/126                                                                       25994484 ns     25993901 ns           26\nBM_bernoulli<boost::multiprecision::cpp_rational>/130                                                                       30173460 ns     30172780 ns           25\nBM_bernoulli<boost::multiprecision::cpp_rational>/134                                                                       43993250 ns     43992333 ns           15\nBM_bernoulli<boost::multiprecision::cpp_rational>/138                                                                       40704613 ns     40702777 ns           16\nBM_bernoulli<boost::multiprecision::cpp_rational>/142                                                                       47015864 ns     47014950 ns           13\nBM_bernoulli<boost::multiprecision::cpp_rational>/146                                                                       51469463 ns     51468592 ns           10\nBM_bernoulli<boost::multiprecision::cpp_rational>/150                                                                       70737464 ns     70736106 ns            8\nBM_bernoulli<boost::multiprecision::cpp_rational>/154                                                                       74904669 ns     74638691 ns            8\nBM_bernoulli<boost::multiprecision::cpp_rational>/158                                                                       76644012 ns     76642396 ns           10\nBM_bernoulli<boost::multiprecision::cpp_rational>/162                                                                      104915811 ns    104906795 ns            7\nBM_bernoulli<boost::multiprecision::cpp_rational>/166                                                                      108178263 ns    108175914 ns            7\nBM_bernoulli<boost::multiprecision::cpp_rational>/170                                                                      125366340 ns    125363885 ns            5\nBM_bernoulli<boost::multiprecision::cpp_rational>/174                                                                      119816144 ns    119813754 ns            5\nBM_bernoulli<boost::multiprecision::cpp_rational>/178                                                                      130675436 ns    130672631 ns            6\nBM_bernoulli<boost::multiprecision::cpp_rational>/182                                                                      136007472 ns    136002124 ns            6\nBM_bernoulli<boost::multiprecision::cpp_rational>/186                                                                      152172095 ns    152169271 ns            4\nBM_bernoulli<boost::multiprecision::cpp_rational>/190                                                                      149450814 ns    149444035 ns            4\nBM_bernoulli<boost::multiprecision::cpp_rational>/194                                                                      149612169 ns    149609183 ns            4\nBM_bernoulli<boost::multiprecision::cpp_rational>/198                                                                      167597787 ns    167594528 ns            4\nBM_bernoulli<boost::multiprecision::mpq_rational>/50                                                                         3270409 ns      3270343 ns          224\nBM_bernoulli<boost::multiprecision::mpq_rational>/54                                                                         4844123 ns      4842950 ns          188\nBM_bernoulli<boost::multiprecision::mpq_rational>/58                                                                         6032271 ns      6031493 ns          137\nBM_bernoulli<boost::multiprecision::mpq_rational>/62                                                                         8356124 ns      8355959 ns           76\nBM_bernoulli<boost::multiprecision::mpq_rational>/66                                                                         9433065 ns      9431740 ns           74\nBM_bernoulli<boost::multiprecision::mpq_rational>/70                                                                         9144751 ns      9144294 ns           70\nBM_bernoulli<boost::multiprecision::mpq_rational>/74                                                                         9130475 ns      9130309 ns           61\nBM_bernoulli<boost::multiprecision::mpq_rational>/78                                                                        10537362 ns     10537142 ns           66\nBM_bernoulli<boost::multiprecision::mpq_rational>/82                                                                        12613844 ns     12613249 ns           63\nBM_bernoulli<boost::multiprecision::mpq_rational>/86                                                                        13630412 ns     13630144 ns           52\nBM_bernoulli<boost::multiprecision::mpq_rational>/90                                                                        17308942 ns     17307564 ns           40\nBM_bernoulli<boost::multiprecision::mpq_rational>/94                                                                        17941604 ns     17940817 ns           33\nBM_bernoulli<boost::multiprecision::mpq_rational>/98                                                                        17702116 ns     17701739 ns           30\nBM_bernoulli<boost::multiprecision::mpq_rational>/102                                                                       24652890 ns     24651531 ns           27\nBM_bernoulli<boost::multiprecision::mpq_rational>/106                                                                       28959599 ns     28958456 ns           25\nBM_bernoulli<boost::multiprecision::mpq_rational>/110                                                                       32250123 ns     32248791 ns           24\nBM_bernoulli<boost::multiprecision::mpq_rational>/114                                                                       33049744 ns     33036651 ns           18\nBM_bernoulli<boost::multiprecision::mpq_rational>/118                                                                       43063349 ns     43060565 ns           16\nBM_bernoulli<boost::multiprecision::mpq_rational>/122                                                                       47526128 ns     47524442 ns           19\nBM_bernoulli<boost::multiprecision::mpq_rational>/126                                                                       51732892 ns     51732056 ns           10\nBM_bernoulli<boost::multiprecision::mpq_rational>/130                                                                       57019065 ns     57018140 ns           10\nBM_bernoulli<boost::multiprecision::mpq_rational>/134                                                                       53774927 ns     53774090 ns           10\nBM_bernoulli<boost::multiprecision::mpq_rational>/138                                                                       55161523 ns     55157578 ns           11\nBM_bernoulli<boost::multiprecision::mpq_rational>/142                                                                       67521287 ns     67520101 ns            9\nBM_bernoulli<boost::multiprecision::mpq_rational>/146                                                                       73495897 ns     73492888 ns           11\nBM_bernoulli<boost::multiprecision::mpq_rational>/150                                                                       96401524 ns     96399781 ns            6\nBM_bernoulli<boost::multiprecision::mpq_rational>/154                                                                       93370021 ns     93368470 ns            6\nBM_bernoulli<boost::multiprecision::mpq_rational>/158                                                                      102579919 ns    102575818 ns            8\nBM_bernoulli<boost::multiprecision::mpq_rational>/162                                                                      122980914 ns    122978722 ns            6\nBM_bernoulli<boost::multiprecision::mpq_rational>/166                                                                      100311142 ns    100309423 ns            6\nBM_bernoulli<boost::multiprecision::mpq_rational>/170                                                                      101722324 ns    101720320 ns            7\nBM_bernoulli<boost::multiprecision::mpq_rational>/174                                                                      116791305 ns    116789020 ns            6\nBM_bernoulli<boost::multiprecision::mpq_rational>/178                                                                      118186160 ns    118184175 ns            5\nBM_bernoulli<boost::multiprecision::mpq_rational>/182                                                                      113692224 ns    113690229 ns            5\nBM_bernoulli<boost::multiprecision::mpq_rational>/186                                                                      120508668 ns    120506323 ns            6\nBM_bernoulli<boost::multiprecision::mpq_rational>/190                                                                      124836662 ns    124834484 ns            5\nBM_bernoulli<boost::multiprecision::mpq_rational>/194                                                                      133126053 ns    133123581 ns            5\nBM_bernoulli<boost::multiprecision::mpq_rational>/198                                                                      149959513 ns    149954105 ns            5\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/50     3290599 ns      3290466 ns          247\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/54     3829254 ns      3829119 ns          189\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/58     5026638 ns      5026546 ns          144\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/62     6338415 ns      6338287 ns          133\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/66     7401079 ns      7400940 ns          112\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/70     8056058 ns      8055920 ns           76\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/74     8688736 ns      8688407 ns           78\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/78     9168196 ns      9168029 ns           77\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/82    10547763 ns     10547404 ns           72\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/86    12687317 ns     12686717 ns           60\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/90    14583805 ns     14583533 ns           53\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/94    17533114 ns     17532466 ns           45\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/98    17795979 ns     17795666 ns           37\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/102   20905344 ns     20904910 ns           37\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/106   24965679 ns     24965242 ns           27\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/110   26153986 ns     26153512 ns           27\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/114   27283324 ns     27282865 ns           24\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/118   30932112 ns     30931542 ns           21\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/122   31709907 ns     31708366 ns           20\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/126   37541157 ns     37539799 ns           19\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/130   47600868 ns     47599791 ns           17\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/134   56589653 ns     56565174 ns           12\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/138   61844701 ns     61840208 ns            9\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/142   62854330 ns     62836747 ns           11\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/146   65305525 ns     65301664 ns            9\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/150   71840692 ns     71806806 ns            8\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/154   86537227 ns     86535425 ns            6\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/158   84476111 ns     84435425 ns            7\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/162   95187582 ns     95163676 ns            6\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/166  116436468 ns    116426811 ns            5\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/170  130978409 ns    130952717 ns            6\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/174  159328406 ns    159282156 ns            4\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/178  170187772 ns    170133406 ns            3\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/182  184317854 ns    184265450 ns            3\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/186  232363854 ns    232345590 ns            3\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/190  156385849 ns    156352248 ns            5\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/194  250575336 ns    250276632 ns            3\nBM_bernoulli<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> >>/198  234528878 ns    234451241 ns            4\nBM_bernoulli<mpq_class, mpz_class>/50                                                                                        3576313 ns      3575669 ns          166\nBM_bernoulli<mpq_class, mpz_class>/54                                                                                        5617333 ns      5611911 ns          143\nBM_bernoulli<mpq_class, mpz_class>/58                                                                                        5434013 ns      5432617 ns           93\nBM_bernoulli<mpq_class, mpz_class>/62                                                                                        7520189 ns      7519819 ns           84\nBM_bernoulli<mpq_class, mpz_class>/66                                                                                       10063667 ns     10061634 ns           84\nBM_bernoulli<mpq_class, mpz_class>/70                                                                                       11741489 ns     11741278 ns           43\nBM_bernoulli<mpq_class, mpz_class>/74                                                                                       12503901 ns     12499604 ns           48\nBM_bernoulli<mpq_class, mpz_class>/78                                                                                       12891372 ns     12889086 ns           45\nBM_bernoulli<mpq_class, mpz_class>/82                                                                                       14146644 ns     14145407 ns           36\nBM_bernoulli<mpq_class, mpz_class>/86                                                                                       13244909 ns     13244178 ns           46\nBM_bernoulli<mpq_class, mpz_class>/90                                                                                       16761246 ns     16760132 ns           45\nBM_bernoulli<mpq_class, mpz_class>/94                                                                                       17757867 ns     17745522 ns           38\nBM_bernoulli<mpq_class, mpz_class>/98                                                                                       20767614 ns     20764969 ns           34\nBM_bernoulli<mpq_class, mpz_class>/102                                                                                      24630855 ns     24625094 ns           28\nBM_bernoulli<mpq_class, mpz_class>/106                                                                                      27775007 ns     27770111 ns           24\nBM_bernoulli<mpq_class, mpz_class>/110                                                                                      29217021 ns     29207281 ns           23\nBM_bernoulli<mpq_class, mpz_class>/114                                                                                      33637566 ns     33632317 ns           20\nBM_bernoulli<mpq_class, mpz_class>/118                                                                                      38106044 ns     38104497 ns           19\nBM_bernoulli<mpq_class, mpz_class>/122                                                                                      40618000 ns     40614832 ns           17\nBM_bernoulli<mpq_class, mpz_class>/126                                                                                      44129039 ns     44122736 ns           15\nBM_bernoulli<mpq_class, mpz_class>/130                                                                                      49499438 ns     49498465 ns           12\nBM_bernoulli<mpq_class, mpz_class>/134                                                                                      53824996 ns     53815652 ns           11\nBM_bernoulli<mpq_class, mpz_class>/138                                                                                      60739365 ns     60731483 ns           11\nBM_bernoulli<mpq_class, mpz_class>/142                                                                                      65850315 ns     65847652 ns            9\nBM_bernoulli<mpq_class, mpz_class>/146                                                                                      72453391 ns     72427755 ns            9\nBM_bernoulli<mpq_class, mpz_class>/150                                                                                      87085907 ns     87071159 ns            7\nBM_bernoulli<mpq_class, mpz_class>/154                                                                                      95887543 ns     95881314 ns            6\nBM_bernoulli<mpq_class, mpz_class>/158                                                                                      96230949 ns     96228927 ns            7\nBM_bernoulli<mpq_class, mpz_class>/162                                                                                     106197691 ns    106177472 ns            6\nBM_bernoulli<mpq_class, mpz_class>/166                                                                                     134945572 ns    134925799 ns            5\nBM_bernoulli<mpq_class, mpz_class>/170                                                                                     142289415 ns    142283919 ns            4\nBM_bernoulli<mpq_class, mpz_class>/174                                                                                     187878516 ns    187842807 ns            5\nBM_bernoulli<mpq_class, mpz_class>/178                                                                                     210256150 ns    210241919 ns            3\nBM_bernoulli<mpq_class, mpz_class>/182                                                                                     179176686 ns    179169030 ns            3\nBM_bernoulli<mpq_class, mpz_class>/186                                                                                     205849055 ns    205787179 ns            3\nBM_bernoulli<mpq_class, mpz_class>/190                                                                                     217773129 ns    217763972 ns            3\nBM_bernoulli<mpq_class, mpz_class>/194                                                                                     241406118 ns    241358945 ns            3\nBM_bernoulli<mpq_class, mpz_class>/198                                                                                     222322076 ns    222307749 ns            3\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/rational_determinant_bench.cpp",
    "content": "//  Copyright 2020 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <iostream>\n#include <vector>\n#include <benchmark/benchmark.h>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/gmp.hpp>\n\n#include <boost/math/special_functions/prime.hpp>\n#include <boost/math/special_functions/pow.hpp>\n\n#include <gmpxx.h>\n\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n\ntemplate <class T>\nT generate_random(unsigned bits_wanted)\n{\n   static boost::random::mt19937               gen;\n   typedef boost::random::mt19937::result_type random_type;\n\n   T        max_val;\n   unsigned digits;\n   if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits))\n   {\n      max_val = (std::numeric_limits<T>::max)();\n      digits  = std::numeric_limits<T>::digits;\n   }\n   else\n   {\n      max_val = T(1) << bits_wanted;\n      digits  = bits_wanted;\n   }\n\n   unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n   while ((random_type(1) << bits_per_r_val) > (gen.max)())\n      --bits_per_r_val;\n\n   unsigned terms_needed = digits / bits_per_r_val + 1;\n\n   T val = 0;\n   for (unsigned i = 0; i < terms_needed; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   val %= max_val;\n   return val;\n}\n\ntemplate <class T>\nconst std::vector<std::vector<T> >& get_matrix_data(unsigned bits);\n\ntemplate <>\nconst std::vector<std::vector<boost::multiprecision::cpp_rational> >& get_matrix_data(unsigned bits)\n{\n   static std::map<unsigned, std::vector<std::vector<boost::multiprecision::cpp_rational> > > data;\n   if (data[bits].size() == 0)\n   {\n      for (unsigned i = 0; i < 100; ++i)\n      {\n         std::vector<boost::multiprecision::cpp_rational> matrix;\n         for (unsigned j = 0; j < 9; ++j)\n         {\n            boost::multiprecision::cpp_int a(generate_random<boost::multiprecision::cpp_int>(bits)), b(generate_random<boost::multiprecision::cpp_int>(bits));\n            matrix.push_back(boost::multiprecision::cpp_rational(a, b));\n         }\n         data[bits].push_back(matrix);\n      }\n   }\n   return data[bits];\n}\n\ntemplate <class T>\nconst std::vector<std::vector<T> >& get_matrix_data(unsigned bits)\n{\n   static std::map<unsigned, std::vector<std::vector<T> > > data;\n   if (data[bits].empty())\n   {\n      const std::vector<std::vector<boost::multiprecision::cpp_rational> >& d = get_matrix_data<boost::multiprecision::cpp_rational>(bits);\n      for (unsigned i = 0; i < 100; ++i)\n      {\n         std::vector<T> matrix;\n         for (unsigned j = 0; j < 9; ++j)\n         {\n            matrix.push_back(T(d[i][j].str()));\n         }\n         data[bits].push_back(matrix);\n      }\n   }\n   return data[bits];\n}\n\ntemplate <class T>\nT determinant(const std::vector<T>& data)\n{\n   const T m01 = data[0] * data[4] - data[3] * data[1];\n   const T m02 = data[0] * data[7] - data[6] * data[1];\n   const T m12 = data[3] * data[7] - data[6] * data[4];\n   return m01 * data[8] - m02 * data[5] + m12 * data[2];\n}\n\ntemplate <class Rational>\nstatic void BM_determinant(benchmark::State& state)\n{\n   int                         bits = state.range(0);\n   const std::vector<std::vector<Rational> >& data = get_matrix_data<Rational>(bits);\n   for (auto _ : state)\n   {\n      for(unsigned i = 0; i < data.size(); ++i)\n         benchmark::DoNotOptimize(determinant(data[i]));\n   }\n}\n\n\nconstexpr unsigned lower_range = 512;\nconstexpr unsigned upper_range = 1 << 15;\n\nBENCHMARK_TEMPLATE(BM_determinant, boost::multiprecision::cpp_rational)->RangeMultiplier(2)->Range(lower_range, upper_range)->Unit(benchmark::kMillisecond);\nBENCHMARK_TEMPLATE(BM_determinant, boost::multiprecision::mpq_rational)->RangeMultiplier(2)->Range(lower_range, upper_range)->Unit(benchmark::kMillisecond);\nBENCHMARK_TEMPLATE(BM_determinant, mpq_class)->RangeMultiplier(2)->Range(lower_range, upper_range)->Unit(benchmark::kMillisecond);\n\nBENCHMARK_MAIN();\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/rational_determinant_bench.log",
    "content": "----------------------------------------------------------------------------------------------------\nBenchmark                                                          Time             CPU   Iterations\n----------------------------------------------------------------------------------------------------\nBM_determinant<boost::multiprecision::cpp_rational>/512         45.0 ms         45.0 ms           15\nBM_determinant<boost::multiprecision::cpp_rational>/1024         103 ms          103 ms            6\nBM_determinant<boost::multiprecision::cpp_rational>/2048         251 ms          251 ms            3\nBM_determinant<boost::multiprecision::cpp_rational>/4096         667 ms          667 ms            1\nBM_determinant<boost::multiprecision::cpp_rational>/8192        2034 ms         2033 ms            1\nBM_determinant<boost::multiprecision::cpp_rational>/16384       6424 ms         6423 ms            1\nBM_determinant<boost::multiprecision::cpp_rational>/32768      24227 ms        24223 ms            1\nBM_determinant<boost::multiprecision::mpq_rational>/512         14.0 ms         14.0 ms           46\nBM_determinant<boost::multiprecision::mpq_rational>/1024        31.3 ms         31.3 ms           22\nBM_determinant<boost::multiprecision::mpq_rational>/2048        77.5 ms         77.5 ms            9\nBM_determinant<boost::multiprecision::mpq_rational>/4096         199 ms          199 ms            4\nBM_determinant<boost::multiprecision::mpq_rational>/8192         532 ms          532 ms            1\nBM_determinant<boost::multiprecision::mpq_rational>/16384       1515 ms         1515 ms            1\nBM_determinant<boost::multiprecision::mpq_rational>/32768       4544 ms         4544 ms            1\nBM_determinant<mpq_class>/512                                   14.3 ms         14.3 ms           46\nBM_determinant<mpq_class>/1024                                  31.3 ms         31.3 ms           22\nBM_determinant<mpq_class>/2048                                  75.6 ms         75.6 ms            9\nBM_determinant<mpq_class>/4096                                   193 ms          193 ms            4\nBM_determinant<mpq_class>/8192                                   601 ms          601 ms            1\nBM_determinant<mpq_class>/16384                                 1965 ms         1965 ms            1\nBM_determinant<mpq_class>/32768                                 4740 ms         4738 ms            1\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/rational_zeta18_bench.cpp",
    "content": "//  Copyright 2020 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <iostream>\n#include <benchmark/benchmark.h>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/gmp.hpp>\n\n#include <boost/math/special_functions/prime.hpp>\n#include <boost/math/special_functions/pow.hpp>\n\n#include <gmpxx.h>\n\ntemplate <class Rational, class Integer = typename Rational::value_type>\nRational zeta18()\n{\n   Rational result = 1;\n\n   for (unsigned i = 0; i < 10; ++i)\n   {\n      result /= 1 - Rational(1, boost::math::pow<18>(Integer(boost::math::prime(i))));\n   }\n   return result;\n}\n\ntemplate <class Rational, class Integer = typename Rational::value_type>\nstatic void BM_zeta18(benchmark::State& state)\n{\n   for (auto _ : state)\n   {\n      benchmark::DoNotOptimize(zeta18<Rational, Integer>());\n   }\n}\n\n\nBENCHMARK_TEMPLATE(BM_zeta18, boost::multiprecision::cpp_rational);\nBENCHMARK_TEMPLATE(BM_zeta18, boost::multiprecision::mpq_rational);\nBENCHMARK_TEMPLATE(BM_zeta18, boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int>>);\nBENCHMARK_TEMPLATE(BM_zeta18, mpq_class, mpz_class);\n\nBENCHMARK_MAIN();\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance-msvc-10.log",
    "content": "0\n11\n24\n3\n13\n27\nTesting Bessel Functions.....\nTime for mpfr_float_50 = 6.47208 seconds\nTotal allocations for mpfr_float_50 = 2684348\nTime for mpf_float_50 = 11.6627 seconds\nTotal allocations for mpf_float_50 = 2601366\nTime for cpp_float_50 = 20.2855 seconds\nTotal allocations for cpp_float_50 = 0\nTime for mpfr_class (50 digits) = 6.48063 seconds\nTotal allocations for mpfr_class (50 digits) = 3946031\nTime for mpreal (50 digits) = 9.98151 seconds\nTotal allocations for mpreal (50 digits) = 13223017\nTime for mpfr_float_100 = 10.154 seconds\nTotal allocations for mpfr_float_50 = 3671485\nTime for mpf_float_100 = 8.51179 seconds\nTotal allocations for mpf_float_100 = 3593669\nTime for cpp_float_100 = 21.0198 seconds\nTotal allocations for cpp_float_100 = 0\nTime for mpfr_class (100 digits) = 9.80571 seconds\nTotal allocations for mpfr_class (100 digits) = 5447348\nTime for mpreal (100 digits) = 13.7021 seconds\nTotal allocations for mpreal (100 digits) = 16671065\nTesting Polynomial Evaluation.....\nTime for mpfr_float_50 = 0.00823841 seconds\nTotal allocations for mpfr_float_50 = 2996\nTime for mpf_float_50 = 0.00401608 seconds\nTotal allocations for mpf_float_50 = 2996\nTime for cpp_float_50 = 0.00492116 seconds\nTotal allocations for cpp_float_50 = 0\nTime for mpfr_class (50 digits) = 0.00935629 seconds\nTotal allocations for mpfr_class (50 digits) = 12976\nTime for mpreal (50 digits) = 0.0148374 seconds\nTotal allocations for mpreal (50 digits = 27947\nTime for mpfr_float_100 = 0.00948452 seconds\nTotal allocations for mpfr_float_100 = 2996\nTime for mpf_float_100 = 0.00390071 seconds\nTotal allocations for mpf_float_100 = 2996\nTime for cpp_float_100 = 0.00893563 seconds\nTotal allocations for cpp_float_100 = 0\nTime for mpfr_class (100 digits) = 0.0106166 seconds\nTotal allocations for mpfr_class (100 digits) = 12976\nTime for mpreal (100 digits) = 0.0162364 seconds\nTotal allocations for mpreal (100 digits) = 27947\nTesting Non-Central T.....\nTime for mpfr_float_50 = 258.087 seconds\nTotal allocations for mpfr_float_50 = 139149049\nTime for mpf_float_50 = 197.303 seconds\nTotal allocations for mpf_float_50 = 134600354\nTime for cpp_float_50 = 334.503 seconds\nTotal allocations for cpp_float_50 = 0\nTime for mpfr_class (50 digits) = 266.389 seconds\nTotal allocations for mpfr_class (50 digits) = 252401115\nTime for mpreal (50 digits) = 346.641 seconds\nTotal allocations for mpreal (50 digits) = 447009420\nTime for mpfr_float_100 = 516.741 seconds\nTotal allocations for mpfr_float_100 = 220400854\nTime for mpf_float_100 = 397.302 seconds\nTotal allocations for mpf_float_100 = 212307349\nTime for cpp_float_100 = 1064.53 seconds\nTotal allocations for cpp_float_100 = 0\nTime for mpfr_class (100 digits) = 525.74 seconds\nTotal allocations for mpfr_class (100 digits) = 407154781\nTime for mpreal (100 digits) = 649.941 seconds\nTotal allocations for mpreal (100 digits) = 724581024\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"sf_performance.hpp\"\n\n#ifdef __clang__\n#if __has_feature(address_sanitizer) || __has_feature(memory_sanitizer)\n// memory sanitizer is incompatible with this test:\n# define DISABLE_THIS_TEST\n#endif\n#endif\n\nboost::atomic<unsigned>                                                     allocation_count(0);\nstd::map<std::string, std::map<std::string, std::pair<double, unsigned> > > result_table;\n\n#ifndef DISABLE_THIS_TEST\n\nvoid* (*alloc_func_ptr)(size_t);\nvoid* (*realloc_func_ptr)(void*, size_t, size_t);\nvoid (*free_func_ptr)(void*, size_t);\n\nvoid* alloc_func(size_t n)\n{\n   ++allocation_count;\n   return (*alloc_func_ptr)(n);\n}\n\nvoid free_func(void* p, size_t n)\n{\n   (*free_func_ptr)(p, n);\n}\n\nvoid* realloc_func(void* p, size_t old, size_t n)\n{\n   ++allocation_count;\n   return (*realloc_func_ptr)(p, old, n);\n}\n\nvoid* operator new(std::size_t count)\n{\n   ++allocation_count;\n   return std::malloc(count);\n}\n\nvoid* operator new[](std::size_t count)\n{\n   ++allocation_count;\n   return std::malloc(count);\n}\n\nvoid operator delete(void* ptr)noexcept\n{\n   std::free(ptr);\n}\nvoid operator delete[](void* ptr) noexcept\n{\n   std::free(ptr);\n}\n\nvoid print_quickbook_tables()\n{\n   for (auto i = result_table.begin(); i != result_table.end(); ++i)\n   {\n      std::cout << \"[table \" << i->first << \"\\n\";\n      std::cout << \"[[Type][Time][# Allocations]]\\n\";\n      double min_time = (std::numeric_limits<double>::max)();\n      for (auto j = i->second.begin(); j != i->second.end(); ++j)\n      {\n         if (j->second.first < min_time)\n            min_time = j->second.first;\n      }\n      for (auto j = i->second.begin(); j != i->second.end(); ++j)\n      {\n         double t = j->second.first;\n         std::cout << \"[[\" << j->first << \"][\" << t / min_time << \" (\" << t << \"s)][\" << j->second.second << \"]]\\n\";\n      }\n      std::cout << \"]\\n\\n\";\n   }\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n#if defined(TEST_MPFR) || defined(TEST_MPFR_CLASS) || defined(TEST_MPREAL) || defined(TEST_MPF)\n   mp_get_memory_functions(&alloc_func_ptr, &realloc_func_ptr, &free_func_ptr);\n   mp_set_memory_functions(&alloc_func, &realloc_func, &free_func);\n#endif\n\n   basic_tests_1();\n   basic_tests_2();\n   basic_tests_3();\n   basic_tests_4();\n   basic_tests_5();\n   basic_tests_6();\n   basic_tests_7();\n   basic_tests_8();\n   basic_tests_9();\n   bessel_tests();\n   poly_tests();\n   nct_tests();\n\n   print_quickbook_tables();\n}\n\n#else\nint main() { return 0; }\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#define BOOST_MATH_MAX_ROOT_ITERATION_POLICY 750\n#define BOOST_MATH_PROMOTE_DOUBLE_POLICY false\n\n#if !defined(TEST_MPFR) && !defined(TEST_MPREAL) && !defined(TEST_MPF) && !defined(TEST_MPREAL) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_CLASS) && !defined(TEST_FLOAT) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPFR\n#define TEST_MPF\n#define TEST_CPP_DEC_FLOAT\n#define TEST_CPP_BIN_FLOAT\n//#  define TEST_MPFR_CLASS\n//#  define TEST_MPREAL\n#define TEST_FLOAT\n#endif\n\n#if defined(TEST_MPFR) && !defined(TEST_MPFR_CLASS)\n#if defined(__has_include)\n#if __has_include(<gmpfrxx.h>)\n#define TEST_MPFR_CLASS\n#endif\n#endif\n#endif\n\n#ifdef TEST_FLOAT\n#include \"arithmetic_backend.hpp\"\n#endif\n#ifdef TEST_MPFR_CLASS\n#include <boost/math/bindings/mpfr.hpp>\n#endif\n#ifdef TEST_MPFR\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#ifdef TEST_MPREAL\n#include <boost/math/bindings/mpreal.hpp>\n#endif\n#ifdef TEST_MPF\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n#include <boost/math/special_functions/bessel.hpp>\n#include <boost/math/tools/rational.hpp>\n#include <boost/math/distributions/non_central_t.hpp>\n#include <libs/math/test/table_type.hpp>\n#include <boost/chrono.hpp>\n#include <boost/array.hpp>\n#include <boost/thread.hpp>\n#include <boost/atomic.hpp>\n\ntemplate <class Real>\nReal test_bessel();\n\ntemplate <class Clock>\nstruct stopwatch\n{\n   typedef typename Clock::duration duration;\n   stopwatch()\n   {\n      m_start = Clock::now();\n   }\n   duration elapsed()\n   {\n      return Clock::now() - m_start;\n   }\n   void reset()\n   {\n      m_start = Clock::now();\n   }\n\n private:\n   typename Clock::time_point m_start;\n};\n\ntemplate <class Real>\nReal test_bessel()\n{\n   try\n   {\n#define T double\n#define SC_(x) x\n#include \"libs/math/test/bessel_i_int_data.ipp\"\n#include \"libs/math/test/bessel_i_data.ipp\"\n\n      Real r;\n\n      for (unsigned i = 0; i < bessel_i_int_data.size(); ++i)\n      {\n         r += boost::math::cyl_bessel_i(Real(bessel_i_int_data[i][0]), Real(bessel_i_int_data[i][1]));\n      }\n      for (unsigned i = 0; i < bessel_i_data.size(); ++i)\n      {\n         r += boost::math::cyl_bessel_i(Real(bessel_i_data[i][0]), Real(bessel_i_data[i][1]));\n      }\n\n#include \"libs/math/test/bessel_j_int_data.ipp\"\n      for (unsigned i = 0; i < bessel_j_int_data.size(); ++i)\n      {\n         r += boost::math::cyl_bessel_j(Real(bessel_j_int_data[i][0]), Real(bessel_j_int_data[i][1]));\n      }\n\n#include \"libs/math/test/bessel_j_data.ipp\"\n      for (unsigned i = 0; i < bessel_j_data.size(); ++i)\n      {\n         r += boost::math::cyl_bessel_j(Real(bessel_j_data[i][0]), Real(bessel_j_data[i][1]));\n      }\n\n#include \"libs/math/test/bessel_j_large_data.ipp\"\n      for (unsigned i = 0; i < bessel_j_large_data.size(); ++i)\n      {\n         r += boost::math::cyl_bessel_j(Real(bessel_j_large_data[i][0]), Real(bessel_j_large_data[i][1]));\n      }\n\n#include \"libs/math/test/sph_bessel_data.ipp\"\n      for (unsigned i = 0; i < sph_bessel_data.size(); ++i)\n      {\n         r += boost::math::sph_bessel(static_cast<unsigned>(sph_bessel_data[i][0]), Real(sph_bessel_data[i][1]));\n      }\n\n      return r;\n   }\n   catch (const std::exception& e)\n   {\n      std::cout << e.what() << std::endl;\n   }\n   return 0;\n}\n\ntemplate <class Real>\nReal test_polynomial()\n{\n   static const unsigned t[] = {\n       2, 3, 4, 5, 6, 7, 8};\n   Real result = 0;\n   for (Real k = 2; k < 1000; ++k)\n      result += boost::math::tools::evaluate_polynomial(t, k);\n\n   return result;\n}\n\ntemplate <class Real>\nReal test_nct()\n{\n#define T double\n#include \"libs/math/test/nct.ipp\"\n\n   Real result = 0;\n   for (unsigned i = 0; i < nct.size(); ++i)\n   {\n      try\n      {\n         result += quantile(boost::math::non_central_t_distribution<Real>(nct[i][0], nct[i][1]), nct[i][3]);\n         result += cdf(boost::math::non_central_t_distribution<Real>(nct[i][0], nct[i][1]), nct[i][2]);\n      }\n      catch (const std::exception&)\n      {}\n   }\n   return result;\n}\n\nextern boost::atomic<unsigned>                                                     allocation_count;\nextern std::map<std::string, std::map<std::string, std::pair<double, unsigned> > > result_table;\n\ntemplate <class Real>\nvoid basic_allocation_test(const char* name, Real x)\n{\n   static const unsigned a[] = {2, 3, 4, 5, 6, 7, 8};\n   allocation_count          = 0;\n   Real result               = (((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0];\n   std::cout << \"Allocation count for type \" << name << \" = \" << allocation_count << std::endl;\n}\n\ntemplate <class Real>\nvoid poly_allocation_test(const char* name, Real x)\n{\n   static const unsigned a[] = {2, 3, 4, 5, 6, 7, 8};\n   allocation_count          = 0;\n   Real result               = boost::math::tools::evaluate_polynomial(a, x);\n   std::cout << \"Allocation count for type \" << name << \" = \" << allocation_count << std::endl;\n}\n\ntemplate <class Real>\nvoid time_proc(const char* tablename, const char* name, Real (*proc)(), unsigned threads = 1)\n{\n   try\n   {\n      static Real total = 0;\n      allocation_count  = 0;\n      boost::chrono::duration<double>                 time;\n      stopwatch<boost::chrono::high_resolution_clock> c;\n      total += proc();\n      time = c.elapsed();\n      std::cout << \"Time for \" << name << \" = \" << time << std::endl;\n      std::cout << \"Total allocations for \" << name << \" = \" << allocation_count << std::endl;\n\n      result_table[tablename][name] = std::make_pair(time.count(), (unsigned)allocation_count);\n\n      if (threads > 1)\n      {\n         c.reset();\n         boost::thread_group g;\n         for (unsigned i = 0; i < threads; ++i)\n            g.create_thread(proc);\n         g.join_all();\n         time = c.elapsed();\n         std::cout << \"Time for \" << name << \" (\" << (threads) << \" theads) = \" << time << std::endl;\n         std::cout << \"Total allocations for \" << name << \" = \" << allocation_count << std::endl;\n\n         std::ostringstream ss;\n         ss << name << \" (\" << threads << \" concurrent threads)\";\n         result_table[tablename][ss.str()] = std::make_pair(time.count(), (unsigned)allocation_count);\n      }\n   }\n   catch (const std::exception& e)\n   {\n      std::cout << e.what() << std::endl;\n   }\n}\n\nusing namespace boost::multiprecision;\n\nvoid basic_tests_1();\nvoid basic_tests_2();\nvoid basic_tests_3();\nvoid basic_tests_4();\nvoid basic_tests_5();\nvoid basic_tests_6();\nvoid basic_tests_7();\nvoid basic_tests_8();\nvoid basic_tests_9();\nvoid bessel_tests();\nvoid poly_tests();\nvoid nct_tests();\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance.log",
    "content": "Allocation Counts for Horner Evaluation:\nAllocation count for type mpfr_float_50 = 3\nAllocation count for type mpfr_float_50 - no expression templates = 1\nAllocation Counts for boost::math::tools::evaluate_polynomial:\nAllocation count for type mpfr_float_50 = 13\nAllocation count for type mpfr_float_50 - no expression templates = 9\nTime for double = 0.000670234 seconds\nTotal allocations for double = 14\nTime for real_concept = 0.0172589 seconds\nTotal allocations for real_concept = 0\nTime for arithmetic_backend<double> = 0.00172288 seconds\nTotal allocations for arithmetic_backend<double> = 0\nTime for arithmetic_backend<double> - no expression templates = 0.00342056 seconds\nTotal allocations for arithmetic_backend<double> - no expression templates = 0\nTime for double = 0.0573604 seconds\nTotal allocations for double = 0\nTime for real_concept = 0.106877 seconds\nTotal allocations for real_concept = 0\nTime for arithmetic_backend<double> = 0.0958558 seconds\nTotal allocations for arithmetic_backend<double> = 0\nTime for arithmetic_backend<double> - no expression templates = 0.0567841 seconds\nTotal allocations for arithmetic_backend<double> - no expression templates = 0\nTesting Bessel Functions at 50 digits.....\nTime for mpfr_float_50 = 0.115838 seconds\nTotal allocations for mpfr_float_50 = 583054\nTime for mpfr_float_50 (3 theads) = 0.149324 seconds\nTotal allocations for mpfr_float_50 = 2330875\nTime for mpfr_float_50 (no expression templates = 0.132073 seconds\nTotal allocations for mpfr_float_50 (no expression templates = 999594\nTime for mpfr_float_50 (no expression templates (3 theads) = 0.185337 seconds\nTotal allocations for mpfr_float_50 (no expression templates = 4000038\nTime for static_mpfr_float_50 = 0.10957 seconds\nTotal allocations for static_mpfr_float_50 = 22930\nTime for static_mpfr_float_50 (3 theads) = 0.128496 seconds\nTotal allocations for static_mpfr_float_50 = 93139\nTime for static_mpfr_float_50 (no expression templates) = 0.106089 seconds\nTotal allocations for static_mpfr_float_50 (no expression templates) = 46861\nTime for static_mpfr_float_50 (no expression templates) (3 theads) = 0.115288 seconds\nTotal allocations for static_mpfr_float_50 (no expression templates) = 189226\nTime for mpf_float_50 = 0.0959515 seconds\nTotal allocations for mpf_float_50 = 640961\nTime for mpf_float_50 (3 theads) = 0.139268 seconds\nTotal allocations for mpf_float_50 = 2563516\nTime for mpf_float_50 (no expression templates = 0.0925745 seconds\nTotal allocations for mpf_float_50 (no expression templates = 1019039\nTime for mpf_float_50 (no expression templates (3 theads) = 0.141131 seconds\nTotal allocations for mpf_float_50 (no expression templates = 4075841\nTime for cpp_dec_float_50 = 0.422285 seconds\nTotal allocations for cpp_dec_float_50 = 381\nTime for cpp_dec_float_50 (3 theads) = 0.524077 seconds\nTotal allocations for cpp_dec_float_50 = 423\nTime for cpp_bin_float_50 = 0.207745 seconds\nTotal allocations for cpp_bin_float_50 = 399\nTime for cpp_bin_float_50 (3 theads) = 0.266594 seconds\nTotal allocations for cpp_bin_float_50 = 462\nTesting Bessel Functions at 100 digits.....\nTime for mpfr_float_100 = 0.317635 seconds\nTotal allocations for mpfr_float_100 = 1236026\nTime for mpfr_float_100 (no expression templates = 0.338071 seconds\nTotal allocations for mpfr_float_100 (no expression templates = 2119472\nTime for static_mpfr_float_100 = 0.271907 seconds\nTotal allocations for static_mpfr_float_100 = 27969\nTime for mpf_float_100 = 0.246796 seconds\nTotal allocations for mpf_float_100 = 1385589\nTime for mpf_float_100 (no expression templates = 0.264389 seconds\nTotal allocations for mpf_float_100 (no expression templates = 2123705\nTime for cpp_dec_float_100 = 2.13193 seconds\nTotal allocations for cpp_dec_float_100 = 6\nTime for cpp_bin_float_100 = 0.931753 seconds\nTotal allocations for cpp_bin_float_100 = 913\nTesting Polynomial Evaluation at 50 digits.....\nTime for mpfr_float_50 = 0.000770731 seconds\nTotal allocations for mpfr_float_50 = 12976\nTime for mpfr_float_50 (no expression templates = 0.000637226 seconds\nTotal allocations for mpfr_float_50 (no expression templates = 8984\nTime for static_mpfr_float_50 = 0.000645885 seconds\nTotal allocations for static_mpfr_float_50 = 0\nTime for mpf_float_50 = 0.000453308 seconds\nTotal allocations for mpf_float_50 = 12976\nTime for mpf_float_50 (no expression templates = 0.000401807 seconds\nTotal allocations for mpf_float_50 (no expression templates = 8984\nTime for cpp_dec_float_50 = 0.000993151 seconds\nTotal allocations for cpp_dec_float_50 = 0\nTime for cpp_bin_float_50 = 0.000652988 seconds\nTotal allocations for cpp_bin_float_50 = 0\nTesting Polynomial Evaluation at 100 digits.....\nTime for mpfr_float_100 = 0.0011754 seconds\nTotal allocations for mpfr_float_100 = 12976\nTime for mpfr_float_100 (no expression templates = 0.00108413 seconds\nTotal allocations for mpfr_float_100 (no expression templates = 8984\nTime for static_mpfr_float_100 = 0.000728305 seconds\nTotal allocations for static_mpfr_float_100 = 0\nTime for mpf_float_100 = 0.000475054 seconds\nTotal allocations for mpf_float_100 = 12976\nTime for mpf_float_100 (no expression templates = 0.000343519 seconds\nTotal allocations for mpf_float_100 (no expression templates = 8984\nTime for cpp_dec_float_100 = 0.00259039 seconds\nTotal allocations for cpp_dec_float_100 = 0\nTime for cpp_bin_float_100 = 0.00239745 seconds\nTotal allocations for cpp_bin_float_100 = 0\nTesting Non-Central T at 50 digits.....\nTime for mpfr_float_50 = 19.1749 seconds\nTotal allocations for mpfr_float_50 = 118401290\nTime for mpfr_float_50 (no expression templates = 22.0858 seconds\nTotal allocations for mpfr_float_50 (no expression templates = 152816346\nTime for static_mpfr_float_50 = 16.8686 seconds\nTotal allocations for static_mpfr_float_50 = 113395\nTime for mpf_float_50 = 17.2475 seconds\nTotal allocations for mpf_float_50 = 123749688\nTime for mpf_float_50 (no expression templates = 16.1468 seconds\nTotal allocations for mpf_float_50 (no expression templates = 152610085\nTime for cpp_dec_float_50 = 77.9505 seconds\nTotal allocations for cpp_dec_float_50 = 0\nTime for cpp_bin_float_50 = 38.5842 seconds\nTotal allocations for cpp_bin_float_50 = 0\nTime for cpp_bin_float_50 (3 theads) = 56.6 seconds\nTotal allocations for cpp_bin_float_50 = 27\nTesting Non-Central T at 100 digits.....\nTime for mpfr_float_100 = 45.6647 seconds\nTotal allocations for mpfr_float_100 = 184143656\nTime for mpfr_float_100 (no expression templates = 42.8714 seconds\nTotal allocations for mpfr_float_100 (no expression templates = 237898133\nTime for static_mpfr_float_100 = 38.1912 seconds\nTotal allocations for static_mpfr_float_100 = 131292\nTime for mpf_float_100 = 28.4582 seconds\nTotal allocations for mpf_float_100 = 192516784\nTime for mpf_float_100 (no expression templates = 31.2473 seconds\nTotal allocations for mpf_float_100 (no expression templates = 237462794\nTime for cpp_dec_float_100 = 260.738 seconds\nTotal allocations for cpp_dec_float_100 = 0\nTime for cpp_bin_float_100 = 128.675 seconds\nTotal allocations for cpp_bin_float_100 = 0\n\n[table Bessel Functions (100 digit precision)\n[[Type][Time][# Allocations]]\n[[cpp_bin_float_100][3.77539 (0.931753s)][913]]\n[[cpp_dec_float_100][8.63842 (2.13193s)][6]]\n[[mpf_float_100][1 (0.246796s)][1385589]]\n[[mpf_float_100 (no expression templates][1.07128 (0.264389s)][2123705]]\n[[mpfr_float_100][1.28703 (0.317635s)][1236026]]\n[[mpfr_float_100 (no expression templates][1.36984 (0.338071s)][2119472]]\n[[static_mpfr_float_100][1.10175 (0.271907s)][27969]]\n]\n\n[table Bessel Functions (16 digit precision)\n[[Type][Time][# Allocations]]\n[[arithmetic_backend<double>][2.57057 (0.00172288s)][0]]\n[[arithmetic_backend<double> - no expression templates][5.10354 (0.00342056s)][0]]\n[[double][1 (0.000670234s)][14]]\n[[real_concept][25.7506 (0.0172589s)][0]]\n]\n\n[table Bessel Functions (50 digit precision)\n[[Type][Time][# Allocations]]\n[[cpp_bin_float_50][2.24409 (0.207745s)][399]]\n[[cpp_bin_float_50 (3 concurrent threads)][2.87977 (0.266594s)][463]]\n[[cpp_dec_float_50][4.56157 (0.422285s)][381]]\n[[cpp_dec_float_50 (3 concurrent threads)][5.66114 (0.524077s)][424]]\n[[mpf_float_50][1.03648 (0.0959515s)][640961]]\n[[mpf_float_50 (3 concurrent threads)][1.50439 (0.139268s)][2563517]]\n[[mpf_float_50 (no expression templates][1 (0.0925745s)][1019039]]\n[[mpf_float_50 (no expression templates (3 concurrent threads)][1.52451 (0.141131s)][4075842]]\n[[mpfr_float_50][1.2513 (0.115838s)][583054]]\n[[mpfr_float_50 (3 concurrent threads)][1.61301 (0.149324s)][2330876]]\n[[mpfr_float_50 (no expression templates][1.42667 (0.132073s)][999594]]\n[[mpfr_float_50 (no expression templates (3 concurrent threads)][2.00203 (0.185337s)][4000039]]\n[[static_mpfr_float_50][1.18358 (0.10957s)][22930]]\n[[static_mpfr_float_50 (3 concurrent threads)][1.38802 (0.128496s)][93140]]\n[[static_mpfr_float_50 (no expression templates)][1.14598 (0.106089s)][46861]]\n[[static_mpfr_float_50 (no expression templates) (3 concurrent threads)][1.24535 (0.115288s)][189227]]\n]\n\n[table Non-central T (16 digit precision)\n[[Type][Time][# Allocations]]\n[[arithmetic_backend<double>][1.68807 (0.0958558s)][0]]\n[[arithmetic_backend<double> - no expression templates][1 (0.0567841s)][0]]\n[[double][1.01015 (0.0573604s)][0]]\n[[real_concept][1.88216 (0.106877s)][0]]\n]\n\n[table Non-central T Distribution (100 digit precision)\n[[Type][Time][# Allocations]]\n[[cpp_bin_float_100][4.52155 (128.675s)][0]]\n[[cpp_dec_float_100][9.16214 (260.738s)][0]]\n[[mpf_float_100][1 (28.4582s)][192516784]]\n[[mpf_float_100 (no expression templates][1.098 (31.2473s)][237462794]]\n[[mpfr_float_100][1.60462 (45.6647s)][184143656]]\n[[mpfr_float_100 (no expression templates][1.50647 (42.8714s)][237898133]]\n[[static_mpfr_float_100][1.34201 (38.1912s)][131292]]\n]\n\n[table Non-central T Distribution (50 digit precision)\n[[Type][Time][# Allocations]]\n[[cpp_bin_float_50][2.38959 (38.5842s)][0]]\n[[cpp_bin_float_50 (3 concurrent threads)][3.50535 (56.6s)][28]]\n[[cpp_dec_float_50][4.82763 (77.9505s)][0]]\n[[mpf_float_50][1.06817 (17.2475s)][123749688]]\n[[mpf_float_50 (no expression templates][1 (16.1468s)][152610085]]\n[[mpfr_float_50][1.18754 (19.1749s)][118401290]]\n[[mpfr_float_50 (no expression templates][1.36782 (22.0858s)][152816346]]\n[[static_mpfr_float_50][1.04471 (16.8686s)][113395]]\n]\n\n[table Polynomial Evaluation (100 digit precision)\n[[Type][Time][# Allocations]]\n[[cpp_bin_float_100][6.97908 (0.00239745s)][0]]\n[[cpp_dec_float_100][7.54076 (0.00259039s)][0]]\n[[mpf_float_100][1.3829 (0.000475054s)][12976]]\n[[mpf_float_100 (no expression templates][1 (0.000343519s)][8984]]\n[[mpfr_float_100][3.42163 (0.0011754s)][12976]]\n[[static_mpfr_float_100][2.12013 (0.000728305s)][0]]\n]\n\n[table Polynomial Evaluation (50 digit precision)\n[[Type][Time][# Allocations]]\n[[cpp_bin_float_50][1.62513 (0.000652988s)][0]]\n[[cpp_dec_float_50][2.47171 (0.000993151s)][0]]\n[[mpf_float_50][1.12817 (0.000453308s)][12976]]\n[[mpf_float_50 (no expression templates][1 (0.000401807s)][8984]]\n[[mpfr_float_100 (no expression templates][2.69812 (0.00108413s)][8984]]\n[[mpfr_float_50][1.91816 (0.000770731s)][12976]]\n[[mpfr_float_50 (no expression templates][1.5859 (0.000637226s)][8984]]\n[[static_mpfr_float_50][1.60745 (0.000645885s)][0]]\n]\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_basic.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"sf_performance.hpp\"\n\nvoid basic_tests()\n{\n   basic_tests_1();\n   basic_tests_2();\n   basic_tests_3();\n   basic_tests_4();\n   basic_tests_5();\n   basic_tests_6();\n   basic_tests_7();\n   basic_tests_8();\n   basic_tests_9();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_bessel.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"sf_performance.hpp\"\n\nvoid bessel_tests_01();\nvoid bessel_tests_02();\nvoid bessel_tests_03();\nvoid bessel_tests_04();\nvoid bessel_tests_05();\nvoid bessel_tests_06();\nvoid bessel_tests_07();\nvoid bessel_tests_08();\nvoid bessel_tests_09();\nvoid bessel_tests_10();\nvoid bessel_tests_11();\nvoid bessel_tests_12();\nvoid bessel_tests_13();\nvoid bessel_tests_14();\nvoid bessel_tests_15();\nvoid bessel_tests_16();\nvoid bessel_tests_17();\nvoid bessel_tests_18();\nvoid bessel_tests_19();\n\nvoid bessel_tests()\n{\n   //\n   // 50 digits first:\n   //\n   std::cout << \"Testing Bessel Functions at 50 digits.....\" << std::endl;\n#if defined(TEST_MPFR) || defined(TEST_MPFR_CLASS)\n   mpfr_set_default_prec(50 * 1000L / 301L);\n#endif\n#ifdef TEST_MPREAL\n   mpfr::mpreal::set_default_prec(50 * 1000L / 301L);\n#endif\n\n   bessel_tests_01();\n   bessel_tests_02();\n   bessel_tests_03();\n   bessel_tests_04();\n   bessel_tests_05();\n   bessel_tests_06();\n   bessel_tests_07();\n   bessel_tests_08();\n   bessel_tests_09();\n   bessel_tests_10();\n\n   //\n   // Then 100 digits:\n   //\n   std::cout << \"Testing Bessel Functions at 100 digits.....\" << std::endl;\n#if defined(TEST_MPFR) || defined(TEST_MPFR_CLASS)\n   mpfr_set_default_prec(100 * 1000L / 301L);\n#endif\n   bessel_tests_11();\n   bessel_tests_12();\n   bessel_tests_13();\n   bessel_tests_14();\n   bessel_tests_15();\n   bessel_tests_16();\n   bessel_tests_17();\n   bessel_tests_18();\n   bessel_tests_19();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_basic_1.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid basic_tests_1()\n{\n\n   std::cout << \"Allocation Counts for Horner Evaluation:\\n\";\n#ifdef TEST_MPFR\n   basic_allocation_test(\"mpfr_float_50\", mpfr_float_50(2));\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_basic_2.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid basic_tests_2()\n{\n#ifdef TEST_MPFR\n   basic_allocation_test(\"mpfr_float_50 - no expression templates\", number<mpfr_float_backend<50>, et_off>(2));\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_basic_3.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid basic_tests_3()\n{\n#ifdef TEST_MPFR_CLASS\n   basic_allocation_test(\"mpfr_class\", mpfr_class(2));\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_basic_4.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid basic_tests_4()\n{\n#ifdef TEST_MPREAL\n   basic_allocation_test(\"mpfr::mpreal\", mpfr::mpreal(2));\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_basic_5.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid basic_tests_5()\n{\n   std::cout << \"Allocation Counts for boost::math::tools::evaluate_polynomial:\\n\";\n#ifdef TEST_MPFR\n   poly_allocation_test(\"mpfr_float_50\", mpfr_float_50(2));\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_basic_6.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid basic_tests_6()\n{\n#ifdef TEST_MPFR\n   poly_allocation_test(\"mpfr_float_50 - no expression templates\", number<mpfr_float_backend<50>, et_off>(2));\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_basic_7.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid basic_tests_7()\n{\n#ifdef TEST_MPFR_CLASS\n   poly_allocation_test(\"mpfr_class\", mpfr_class(2));\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_basic_8.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid basic_tests_8()\n{\n#ifdef TEST_MPREAL\n   poly_allocation_test(\"mpfr::mpreal\", mpfr::mpreal(2));\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_basic_9.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid basic_tests_9()\n{\n#ifdef TEST_FLOAT\n   time_proc(\"Bessel Functions (16 digit precision)\", \"double\", test_bessel<double>);\n   time_proc(\"Bessel Functions (16 digit precision)\", \"real_concept\", test_bessel<boost::math::concepts::real_concept>);\n   time_proc(\"Bessel Functions (16 digit precision)\", \"arithmetic_backend<double>\", test_bessel<number<arithmetic_backend<double>, et_on> >);\n   time_proc(\"Bessel Functions (16 digit precision)\", \"arithmetic_backend<double> - no expression templates\", test_bessel<number<arithmetic_backend<double>, et_off> >);\n\n   time_proc(\"Non-central T (16 digit precision)\", \"double\", test_nct<double>);\n   time_proc(\"Non-central T (16 digit precision)\", \"real_concept\", test_nct<boost::math::concepts::real_concept>);\n   time_proc(\"Non-central T (16 digit precision)\", \"arithmetic_backend<double>\", test_nct<number<arithmetic_backend<double>, et_on> >);\n   time_proc(\"Non-central T (16 digit precision)\", \"arithmetic_backend<double> - no expression templates\", test_nct<number<arithmetic_backend<double>, et_off> >);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_bessel_01.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid bessel_tests_01()\n{\n#ifdef TEST_MPFR\n#if MPFR_VERSION < MPFR_VERSION_NUM(3, 0, 0)\n   time_proc(\"Bessel Functions (50 digit precision)\", \"mpfr_float_50\", test_bessel<boost::multiprecision::mpfr_float_50>, 1);\n#else\n   time_proc(\"Bessel Functions (50 digit precision)\", \"mpfr_float_50\", test_bessel<boost::multiprecision::mpfr_float_50>, mpfr_buildopt_tls_p() ? 3 : 1);\n#endif\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_bessel_02.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid bessel_tests_02()\n{\n#ifdef TEST_MPFR\n#if MPFR_VERSION < MPFR_VERSION_NUM(3, 0, 0)\n   time_proc(\"Bessel Functions (50 digit precision)\", \"mpfr_float_50 (no expression templates)\", test_bessel<number<mpfr_float_backend<50>, et_off> >, 1);\n#else\n   time_proc(\"Bessel Functions (50 digit precision)\", \"mpfr_float_50 (no expression templates\", test_bessel<number<mpfr_float_backend<50>, et_off> >, mpfr_buildopt_tls_p() ? 3 : 1);\n#endif\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_bessel_03.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid bessel_tests_03()\n{\n#ifdef TEST_MPFR\n#if MPFR_VERSION < MPFR_VERSION_NUM(3, 0, 0)\n   time_proc(\"Bessel Functions (50 digit precision)\", \"static_mpfr_float_50\", test_bessel<number<mpfr_float_backend<50, allocate_stack>, et_on> >, 1);\n#else\n   time_proc(\"Bessel Functions (50 digit precision)\", \"static_mpfr_float_50\", test_bessel<number<mpfr_float_backend<50, allocate_stack>, et_on> >, mpfr_buildopt_tls_p() ? 3 : 1);\n#endif\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_bessel_04.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid bessel_tests_04()\n{\n#ifdef TEST_MPFR\n#if MPFR_VERSION < MPFR_VERSION_NUM(3, 0, 0)\n   time_proc(\"Bessel Functions (50 digit precision)\", \"static_mpfr_float_50 (no expression templates)\", test_bessel<number<mpfr_float_backend<50, allocate_stack>, et_off> >, 1);\n#else\n   time_proc(\"Bessel Functions (50 digit precision)\", \"static_mpfr_float_50 (no expression templates)\", test_bessel<number<mpfr_float_backend<50, allocate_stack>, et_off> >, mpfr_buildopt_tls_p() ? 3 : 1);\n#endif\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_bessel_05.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid bessel_tests_05()\n{\n#ifdef TEST_MPF\n   time_proc(\"Bessel Functions (50 digit precision)\", \"mpf_float_50\", test_bessel<mpf_float_50>, 3);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_bessel_06.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid bessel_tests_06()\n{\n#ifdef TEST_MPF\n   time_proc(\"Bessel Functions (50 digit precision)\", \"mpf_float_50 (no expression templates\", test_bessel<number<gmp_float<50>, et_off> >, 3);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_bessel_07.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid bessel_tests_07()\n{\n#ifdef TEST_CPP_DEC_FLOAT\n   time_proc(\"Bessel Functions (50 digit precision)\", \"cpp_dec_float_50\", test_bessel<cpp_dec_float_50>, 3);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_bessel_08.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid bessel_tests_08()\n{\n#ifdef TEST_CPP_BIN_FLOAT\n   time_proc(\"Bessel Functions (50 digit precision)\", \"cpp_bin_float_50\", test_bessel<cpp_bin_float_50>, 3);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_bessel_09.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid bessel_tests_09()\n{\n#ifdef TEST_MPFR_CLASS\n   time_proc(\"Bessel Functions (50 digit precision)\", \"mpfr_class\", test_bessel<mpfr_class>, mpfr_buildopt_tls_p() ? 3 : 1);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_bessel_10.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid bessel_tests_10()\n{\n#ifdef TEST_MPREAL\n   time_proc(\"Bessel Functions (50 digit precision)\", \"mpfr::mpreal\", test_bessel<mpfr::mpreal>, mpfr_buildopt_tls_p() ? 3 : 1);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_bessel_11.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid bessel_tests_11()\n{\n#ifdef TEST_MPFR\n   time_proc(\"Bessel Functions (100 digit precision)\", \"mpfr_float_100\", test_bessel<mpfr_float_100>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_bessel_12.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid bessel_tests_12()\n{\n#ifdef TEST_MPFR\n   time_proc(\"Bessel Functions (100 digit precision)\", \"mpfr_float_100 (no expression templates\", test_bessel<number<mpfr_float_backend<100>, et_off> >);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_bessel_13.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid bessel_tests_13()\n{\n#ifdef TEST_MPFR\n   time_proc(\"Bessel Functions (100 digit precision)\", \"static_mpfr_float_100\", test_bessel<static_mpfr_float_100>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_bessel_14.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid bessel_tests_14()\n{\n#ifdef TEST_MPF\n   time_proc(\"Bessel Functions (100 digit precision)\", \"mpf_float_100\", test_bessel<mpf_float_100>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_bessel_15.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid bessel_tests_15()\n{\n#ifdef TEST_MPF\n   time_proc(\"Bessel Functions (100 digit precision)\", \"mpf_float_100 (no expression templates\", test_bessel<number<gmp_float<100>, et_off> >);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_bessel_16.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid bessel_tests_16()\n{\n#ifdef TEST_CPP_DEC_FLOAT\n   time_proc(\"Bessel Functions (100 digit precision)\", \"cpp_dec_float_100\", test_bessel<cpp_dec_float_100>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_bessel_17.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid bessel_tests_17()\n{\n#ifdef TEST_CPP_BIN_FLOAT\n   time_proc(\"Bessel Functions (100 digit precision)\", \"cpp_bin_float_100\", test_bessel<cpp_bin_float_100>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_bessel_18.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid bessel_tests_18()\n{\n#ifdef TEST_MPFR_CLASS\n   time_proc(\"Bessel Functions (100 digit precision)\", \"mpfr_class\", test_bessel<mpfr_class>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_bessel_19.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid bessel_tests_19()\n{\n#ifdef TEST_MPREAL\n   time_proc(\"Bessel Functions (100 digit precision)\", \"mpfr::mpreal\", test_bessel<mpfr::mpreal>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_nct_01.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid nct_tests_01()\n{\n#ifdef TEST_MPFR\n   time_proc(\"Non-central T Distribution (50 digit precision)\", \"mpfr_float_50\", test_nct<mpfr_float_50>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_nct_02.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid nct_tests_02()\n{\n#ifdef TEST_MPFR\n   time_proc(\"Non-central T Distribution (50 digit precision)\", \"mpfr_float_50 (no expression templates\", test_nct<number<mpfr_float_backend<50>, et_off> >);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_nct_03.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid nct_tests_03()\n{\n#ifdef TEST_MPFR\n   time_proc(\"Non-central T Distribution (50 digit precision)\", \"static_mpfr_float_50\", test_nct<static_mpfr_float_50>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_nct_04.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid nct_tests_04()\n{\n#ifdef TEST_MPF\n   time_proc(\"Non-central T Distribution (50 digit precision)\", \"mpf_float_50\", test_nct<mpf_float_50>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_nct_05.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid nct_tests_05()\n{\n#ifdef TEST_MPF\n   time_proc(\"Non-central T Distribution (50 digit precision)\", \"mpf_float_50 (no expression templates\", test_nct<number<gmp_float<50>, et_off> >);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_nct_06.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid nct_tests_06()\n{\n#ifdef TEST_MPREAL\n   mpfr::mpreal::set_default_prec(50 * 1000L / 301L);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_nct_07.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid nct_tests_07()\n{\n#ifdef TEST_CPP_DEC_FLOAT\n   time_proc(\"Non-central T Distribution (50 digit precision)\", \"cpp_dec_float_50\", test_nct<cpp_dec_float_50>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_nct_08.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid nct_tests_08()\n{\n#ifdef TEST_CPP_BIN_FLOAT\n   time_proc(\"Non-central T Distribution (50 digit precision)\", \"cpp_bin_float_50\", test_nct<cpp_bin_float_50>, 3);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_nct_09.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid nct_tests_09()\n{\n#ifdef TEST_MPFR_CLASS\n   time_proc(\"Non-central T Distribution (50 digit precision)\", \"mpfr_class\", test_nct<mpfr_class>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_nct_10.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid nct_tests_10()\n{\n#ifdef TEST_MPREAL\n   time_proc(\"Non-central T Distribution (50 digit precision)\", \"mpfr::mpreal\", test_nct<mpfr::mpreal>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_nct_11.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid nct_tests_11()\n{\n#ifdef TEST_MPFR\n   time_proc(\"Non-central T Distribution (100 digit precision)\", \"mpfr_float_100\", test_nct<mpfr_float_100>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_nct_12.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid nct_tests_12()\n{\n#ifdef TEST_MPFR\n   time_proc(\"Non-central T Distribution (100 digit precision)\", \"mpfr_float_100 (no expression templates\", test_nct<number<mpfr_float_backend<100>, et_off> >);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_nct_13.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid nct_tests_13()\n{\n#ifdef TEST_MPFR\n   time_proc(\"Non-central T Distribution (100 digit precision)\", \"static_mpfr_float_100\", test_nct<static_mpfr_float_100>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_nct_14.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid nct_tests_14()\n{\n#ifdef TEST_MPF\n   time_proc(\"Non-central T Distribution (100 digit precision)\", \"mpf_float_100\", test_nct<mpf_float_100>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_nct_15.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid nct_tests_15()\n{\n#ifdef TEST_MPF\n   time_proc(\"Non-central T Distribution (100 digit precision)\", \"mpf_float_100 (no expression templates\", test_nct<number<gmp_float<100>, et_off> >);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_nct_16.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid nct_tests_16()\n{\n#ifdef TEST_MPREAL\n   mpfr::mpreal::set_default_prec(100 * 1000L / 301L);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_nct_17.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid nct_tests_17()\n{\n#ifdef TEST_CPP_DEC_FLOAT\n   time_proc(\"Non-central T Distribution (100 digit precision)\", \"cpp_dec_float_100\", test_nct<cpp_dec_float_100>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_nct_18.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid nct_tests_18()\n{\n#ifdef TEST_CPP_BIN_FLOAT\n   time_proc(\"Non-central T Distribution (100 digit precision)\", \"cpp_bin_float_100\", test_nct<cpp_bin_float_100>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_nct_19.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid nct_tests_19()\n{\n#ifdef TEST_MPFR_CLASS\n   time_proc(\"Non-central T Distribution (100 digit precision)\", \"mpfr_class\", test_nct<mpfr_class>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_nct_20.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid nct_tests_20()\n{\n#ifdef TEST_MPREAL\n   time_proc(\"Non-central T Distribution (100 digit precision)\", \"mpfr::mpreal\", test_nct<mpfr::mpreal>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_poly_01.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid poly_tests_01()\n{\n#ifdef TEST_MPFR\n   time_proc(\"Polynomial Evaluation (50 digit precision)\", \"mpfr_float_50\", test_polynomial<mpfr_float_50>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_poly_02.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid poly_tests_02()\n{\n#ifdef TEST_MPFR\n   time_proc(\"Polynomial Evaluation (50 digit precision)\", \"mpfr_float_50 (no expression templates\", test_polynomial<number<mpfr_float_backend<50>, et_off> >);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_poly_03.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid poly_tests_03()\n{\n#ifdef TEST_MPFR\n   time_proc(\"Polynomial Evaluation (50 digit precision)\", \"static_mpfr_float_50\", test_polynomial<static_mpfr_float_50>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_poly_04.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid poly_tests_04()\n{\n#ifdef TEST_MPF\n   time_proc(\"Polynomial Evaluation (50 digit precision)\", \"mpf_float_50\", test_polynomial<mpf_float_50>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_poly_05.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid poly_tests_05()\n{\n#ifdef TEST_MPF\n   time_proc(\"Polynomial Evaluation (50 digit precision)\", \"mpf_float_50 (no expression templates\", test_polynomial<number<gmp_float<50>, et_off> >);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_poly_06.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid poly_tests_06()\n{\n#ifdef TEST_CPP_DEC_FLOAT\n   time_proc(\"Polynomial Evaluation (50 digit precision)\", \"cpp_dec_float_50\", test_polynomial<cpp_dec_float_50>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_poly_07.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid poly_tests_07()\n{\n#ifdef TEST_CPP_BIN_FLOAT\n   time_proc(\"Polynomial Evaluation (50 digit precision)\", \"cpp_bin_float_50\", test_polynomial<cpp_bin_float_50>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_poly_08.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid poly_tests_08()\n{\n#ifdef TEST_MPFR_CLASS\n   time_proc(\"Polynomial Evaluation (50 digit precision)\", \"mpfr_class\", test_polynomial<mpfr_class>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_poly_09.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid poly_tests_09()\n{\n#ifdef TEST_MPREAL\n   time_proc(\"Polynomial Evaluation (50 digit precision)\", \"mpfr::mpreal\", test_polynomial<mpfr::mpreal>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_poly_10.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid poly_tests_10()\n{\n#ifdef TEST_MPFR\n   time_proc(\"Polynomial Evaluation (100 digit precision)\", \"mpfr_float_100\", test_polynomial<mpfr_float_100>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_poly_11.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid poly_tests_11()\n{\n#ifdef TEST_MPFR\n   time_proc(\"Polynomial Evaluation (50 digit precision)\", \"mpfr_float_100 (no expression templates\", test_polynomial<number<mpfr_float_backend<100>, et_off> >);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_poly_12.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid poly_tests_12()\n{\n#ifdef TEST_MPFR\n   time_proc(\"Polynomial Evaluation (100 digit precision)\", \"static_mpfr_float_100\", test_polynomial<static_mpfr_float_100>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_poly_13.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid poly_tests_13()\n{\n#ifdef TEST_MPF\n   time_proc(\"Polynomial Evaluation (100 digit precision)\", \"mpf_float_100\", test_polynomial<mpf_float_100>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_poly_14.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid poly_tests_14()\n{\n#ifdef TEST_MPF\n   time_proc(\"Polynomial Evaluation (100 digit precision)\", \"mpf_float_100 (no expression templates\", test_polynomial<number<gmp_float<100>, et_off> >);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_poly_15.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid poly_tests_15()\n{\n#ifdef TEST_CPP_DEC_FLOAT\n   time_proc(\"Polynomial Evaluation (100 digit precision)\", \"cpp_dec_float_100\", test_polynomial<cpp_dec_float_100>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_poly_16.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid poly_tests_16()\n{\n#ifdef TEST_CPP_BIN_FLOAT\n   time_proc(\"Polynomial Evaluation (100 digit precision)\", \"cpp_bin_float_100\", test_polynomial<cpp_bin_float_100>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_poly_17.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid poly_tests_17()\n{\n#ifdef TEST_MPFR_CLASS\n   time_proc(\"Polynomial Evaluation (100 digit precision)\", \"mpfr_class\", test_polynomial<mpfr_class>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_files/sf_performance_poly_18.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"../sf_performance.hpp\"\n\nvoid poly_tests_18()\n{\n#ifdef TEST_MPREAL\n   time_proc(\"Polynomial Evaluation (100 digit precision)\", \"mpfr::mpreal\", test_polynomial<mpfr::mpreal>);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_nct.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"sf_performance.hpp\"\n\nvoid nct_tests_01();\nvoid nct_tests_02();\nvoid nct_tests_03();\nvoid nct_tests_04();\nvoid nct_tests_05();\nvoid nct_tests_06();\nvoid nct_tests_07();\nvoid nct_tests_08();\nvoid nct_tests_09();\nvoid nct_tests_10();\nvoid nct_tests_11();\nvoid nct_tests_12();\nvoid nct_tests_13();\nvoid nct_tests_14();\nvoid nct_tests_15();\nvoid nct_tests_16();\nvoid nct_tests_17();\nvoid nct_tests_18();\nvoid nct_tests_19();\nvoid nct_tests_20();\n\nvoid nct_tests()\n{\n   //\n   // 50 digits first:\n   //\n   std::cout << \"Testing Non-Central T at 50 digits.....\" << std::endl;\n#ifdef TEST_MPFR_CLASS\n   mpfr_set_default_prec(50 * 1000L / 301L);\n#endif\n\n   nct_tests_01();\n   nct_tests_02();\n   nct_tests_03();\n   nct_tests_04();\n   nct_tests_05();\n   nct_tests_06();\n   nct_tests_07();\n   nct_tests_08();\n   nct_tests_09();\n   nct_tests_10();\n\n   //\n   // Then 100 digits:\n   //\n   std::cout << \"Testing Non-Central T at 100 digits.....\" << std::endl;\n#ifdef TEST_MPFR_CLASS\n   mpfr_set_default_prec(100 * 1000L / 301L);\n#endif\n   nct_tests_11();\n   nct_tests_12();\n   nct_tests_13();\n   nct_tests_14();\n   nct_tests_15();\n   nct_tests_16();\n   nct_tests_17();\n   nct_tests_18();\n   nct_tests_19();\n   nct_tests_20();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sf_performance_poly.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"sf_performance.hpp\"\n\nvoid poly_tests_01();\nvoid poly_tests_02();\nvoid poly_tests_03();\nvoid poly_tests_04();\nvoid poly_tests_05();\nvoid poly_tests_06();\nvoid poly_tests_07();\nvoid poly_tests_08();\nvoid poly_tests_09();\nvoid poly_tests_10();\nvoid poly_tests_11();\nvoid poly_tests_12();\nvoid poly_tests_13();\nvoid poly_tests_14();\nvoid poly_tests_15();\nvoid poly_tests_16();\nvoid poly_tests_17();\nvoid poly_tests_18();\n\nvoid poly_tests()\n{\n   //\n   // 50 digits first:\n   //\n   std::cout << \"Testing Polynomial Evaluation at 50 digits.....\" << std::endl;\n#if defined(TEST_MPFR) || defined(TEST_MPFR_CLASS)\n   mpfr_set_default_prec(50 * 1000L / 301L);\n#endif\n#ifdef TEST_MPREAL\n   mpfr::mpreal::set_default_prec(50 * 1000L / 301L);\n#endif\n   poly_tests_01();\n   poly_tests_02();\n   poly_tests_03();\n   poly_tests_04();\n   poly_tests_05();\n   poly_tests_06();\n   poly_tests_07();\n   poly_tests_08();\n   poly_tests_09();\n   //\n   // Then 100 digits:\n   //\n   std::cout << \"Testing Polynomial Evaluation at 100 digits.....\" << std::endl;\n#ifdef TEST_MPFR_CLASS\n   mpfr_set_default_prec(100 * 1000L / 301L);\n#endif\n#ifdef TEST_MPREAL\n   mpfr::mpreal::set_default_prec(100 * 1000L / 301L);\n#endif\n   poly_tests_10();\n   poly_tests_11();\n   poly_tests_12();\n   poly_tests_13();\n   poly_tests_14();\n   poly_tests_15();\n   poly_tests_16();\n   poly_tests_17();\n   poly_tests_18();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/sqrt_bench.cpp",
    "content": "//  Copyright 2020 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <iostream>\n#include <benchmark/benchmark.h>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/integer.hpp>\n#include <boost/random.hpp>\n#include <cmath>\n\n#include <immintrin.h>\n\nusing namespace boost::multiprecision;\nusing namespace boost::random;\n\ntemplate <class Integer>\nBOOST_MP_CXX14_CONSTEXPR Integer sqrt_old(const Integer& x, Integer& r)\n{\n   //\n   // This is slow bit-by-bit integer square root, see for example\n   // http://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Binary_numeral_system_.28base_2.29\n   // There are better methods such as http://hal.inria.fr/docs/00/07/28/54/PDF/RR-3805.pdf\n   // and http://hal.inria.fr/docs/00/07/21/13/PDF/RR-4475.pdf which should be implemented\n   // at some point.\n   //\n   Integer s = 0;\n   if (x == 0)\n   {\n      r = 0;\n      return s;\n   }\n   int g = msb(x);\n   if (g == 0)\n   {\n      r = 1;\n      return s;\n   }\n\n   Integer t = 0;\n   r         = x;\n   g /= 2;\n   bit_set(s, g);\n   bit_set(t, 2 * g);\n   r = x - t;\n   --g;\n   do\n   {\n      t = s;\n      t <<= g + 1;\n      bit_set(t, 2 * g);\n      if (t <= r)\n      {\n         bit_set(s, g);\n         r -= t;\n      }\n      --g;\n   } while (g >= 0);\n   return s;\n}\n\ntemplate <class Integer>\nBOOST_MP_CXX14_CONSTEXPR Integer sqrt_old(const Integer& x)\n{\n   Integer r(0);\n   return sqrt_old(x, r);\n}\n\ntemplate <class T>\nstd::tuple<std::vector<T>, std::vector<T> >& get_test_vector(unsigned bits)\n{\n   static std::map<unsigned, std::tuple<std::vector<T>, std::vector<T> > > data;\n\n   std::tuple<std::vector<T>, std::vector<T> >& result = data[bits];\n\n   if (std::get<0>(result).size() == 0)\n   {\n      mt19937                     mt;\n      uniform_int_distribution<T> ui(T(1) << (bits - 1), T(1) << bits);\n\n      std::vector<T>& a = std::get<0>(result);\n      std::vector<T>& b = std::get<1>(result);\n\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         a.push_back(ui(mt));\n         b.push_back(0);\n      }\n   }\n   return result;\n}\n\ntemplate <class T>\nstd::vector<T>& get_test_vector_a(unsigned bits)\n{\n   return std::get<0>(get_test_vector<T>(bits));\n}\ntemplate <class T>\nstd::vector<T>& get_test_vector_b(unsigned bits)\n{\n   return std::get<1>(get_test_vector<T>(bits));\n}\n\ntemplate <typename T>\nstatic void BM_sqrt_old(benchmark::State& state)\n{\n   int                         bits = state.range(0);\n\n   std::vector<T>& a = get_test_vector_a<T>(bits);\n   std::vector<T>& b = get_test_vector_b<T>(bits);\n\n   for (auto _ : state)\n   {\n      for (unsigned i = 0; i < a.size(); ++i)\n         b[i] = sqrt_old(a[i]);\n   }\n   state.SetComplexityN(bits);\n}\n\ntemplate <typename T>\nstatic void BM_sqrt_current(benchmark::State& state)\n{\n   int bits = state.range(0);\n\n   std::vector<T>& a = get_test_vector_a<T>(bits);\n   std::vector<T>& b = get_test_vector_b<T>(bits);\n\n   for (auto _ : state)\n   {\n      for (unsigned i = 0; i < a.size(); ++i)\n         b[i] = sqrt(a[i]);\n   }\n   state.SetComplexityN(bits);\n}\n\nconstexpr unsigned lower_range = 512;\nconstexpr unsigned upper_range = 1 << 15;\n\nBENCHMARK_TEMPLATE(BM_sqrt_old, cpp_int)->RangeMultiplier(2)->Range(lower_range, upper_range)->Unit(benchmark::kMillisecond)->Complexity();\nBENCHMARK_TEMPLATE(BM_sqrt_current, cpp_int)->RangeMultiplier(2)->Range(lower_range, upper_range)->Unit(benchmark::kMillisecond)->Complexity();\nBENCHMARK_TEMPLATE(BM_sqrt_current, mpz_int)->RangeMultiplier(2)->Range(lower_range, upper_range)->Unit(benchmark::kMillisecond)->Complexity();\n\nBENCHMARK_MAIN();\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/veronoi_performance.log",
    "content": "Time for extended_int                   = 0.0366527\nTime for int256_t                       = 0.0270196\nTime for int512_t                       = 0.0291243\nTime for int1024_t                      = 0.0368107\nTime for checked_int256_t               = 0.0326167\nTime for checked_int512_t               = 0.0340095\nTime for checked_int1024_t              = 0.0415328\nTime for cpp_int                        = 0.0487904\nTime for mpz_int                        = 0.103619\nTime for tom_int                        = 1.12504\n[table\n[[Integer Type][Relative Performance (Actual time in parenthesis)]]\n[[checked_int1024_t][1.53714(0.0415328s)]]\n[[checked_int256_t][1.20715(0.0326167s)]]\n[[checked_int512_t][1.2587(0.0340095s)]]\n[[cpp_int][1.80575(0.0487904s)]]\n[[extended_int][1.35652(0.0366527s)]]\n[[int1024_t][1.36237(0.0368107s)]]\n[[int256_t][1(0.0270196s)]]\n[[int512_t][1.0779(0.0291243s)]]\n[[mpz_int][3.83495(0.103619s)]]\n[[tom_int][41.6378(1.12504s)]]\n]\nTime for int64_t                        = 0.0128646\nTime for number<arithmetic_backend<std::int64_t>, et_off> = 0.0129255\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/performance/voronoi_performance.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef _MSC_VER\n#pragma warning(disable : 4244)\n#endif\n\n#include <cstdlib>\n#include <boost/polygon/detail/voronoi_predicates.hpp>\n#include <boost/polygon/detail/voronoi_structures.hpp>\n#include <boost/polygon/detail/voronoi_ctypes.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int_distribution.hpp>\n#include <vector>\n#include <map>\n#include <boost/chrono.hpp>\n#include <boost/multiprecision/cpp_int.hpp>\n\n#ifdef TEST_GMP\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_TOMMATH\n#include <boost/multiprecision/tommath.hpp>\n#endif\n\n#include \"arithmetic_backend.hpp\"\n\ntypedef boost::polygon::detail::point_2d<std::int32_t> i_point;\n\ntemplate <class Clock>\nstruct stopwatch\n{\n   typedef typename Clock::duration duration;\n   stopwatch()\n   {\n      m_start = Clock::now();\n   }\n   duration elapsed()\n   {\n      return Clock::now() - m_start;\n   }\n   void reset()\n   {\n      m_start = Clock::now();\n   }\n\n private:\n   typename Clock::time_point m_start;\n};\n\nstd::vector<i_point>   points;\nboost::random::mt19937 gen;\n\ntemplate <class Big>\nstruct cpp_int_voronoi_traits\n{\n   typedef std::int32_t                                          int_type;\n   typedef std::int64_t                                          int_x2_type;\n   typedef std::uint64_t                                         uint_x2_type;\n   typedef Big                                                     big_int_type;\n   typedef double                                                  fpt_type;\n   typedef boost::polygon::detail::extended_exponent_fpt<fpt_type> efpt_type;\n   typedef boost::polygon::detail::ulp_comparison<fpt_type>        ulp_cmp_type;\n   struct to_fpt_converter_type\n   {\n      template <class B, boost::multiprecision::expression_template_option ET>\n      double operator()(const boost::multiprecision::number<B, ET>& val)\n      {\n         return val.template convert_to<double>();\n      }\n      double operator()(double val)\n      {\n         return val;\n      }\n      double operator()(const efpt_type& that) const\n      {\n         return that.d();\n      }\n      template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\n      double operator()(const boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)\n      {\n         typedef typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type r_t;\n         r_t                                                                                                  r(e);\n         return r.template convert_to<double>();\n      }\n   };\n   struct to_efpt_converter_type\n   {\n      template <class B, boost::multiprecision::expression_template_option ET>\n      efpt_type operator()(const boost::multiprecision::number<B, ET>& val)\n      {\n         return efpt_type(val.template convert_to<double>(), 0);\n      }\n      efpt_type operator()(double val)\n      {\n         return efpt_type(val, 0);\n      }\n      template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\n      efpt_type operator()(const boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)\n      {\n         typedef typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type r_t;\n         r_t                                                                                                  r(e);\n         return efpt_type(r.template convert_to<double>(), 0);\n      }\n   };\n};\n\ntemplate <class Big>\nstruct native_int_voronoi_traits\n{\n   typedef std::int32_t                                          int_type;\n   typedef std::int64_t                                          int_x2_type;\n   typedef std::uint64_t                                         uint_x2_type;\n   typedef Big                                                     big_int_type;\n   typedef double                                                  fpt_type;\n   typedef boost::polygon::detail::extended_exponent_fpt<fpt_type> efpt_type;\n   typedef boost::polygon::detail::ulp_comparison<fpt_type>        ulp_cmp_type;\n   struct to_fpt_converter_type\n   {\n      template <class T>\n      double operator()(const T& val) const\n      {\n         return val;\n      }\n      double operator()(const efpt_type& that) const\n      {\n         return that.d();\n      }\n   };\n   struct to_efpt_converter_type\n   {\n      template <class T>\n      efpt_type operator()(const T& val) const\n      {\n         return efpt_type(val, 0);\n      }\n   };\n};\n\nstd::map<std::string, double> results;\ndouble                        min_time = (std::numeric_limits<double>::max)();\n\ntemplate <class Traits>\ndouble test(const char* name)\n{\n   typedef boost::polygon::detail::voronoi_predicates<Traits>                             preds;\n   typedef boost::polygon::detail::circle_event<std::int32_t>                           circle_event;\n   typedef boost::polygon::detail::site_event<std::int32_t>                             site_event;\n   typedef typename preds::template mp_circle_formation_functor<site_event, circle_event> circle_pred;\n\n   boost::random::uniform_int_distribution<> dist(0, points.size() - 1);\n   circle_pred                               pc;\n   circle_event                              event;\n\n   stopwatch<boost::chrono::high_resolution_clock> w;\n\n   for (unsigned i = 0; i < 10000; ++i)\n   {\n      site_event s1(points[dist(gen)]);\n      site_event s2(points[dist(gen)]);\n      site_event s3(points[dist(gen)]);\n      pc.ppp(s1, s2, s3, event);\n      pc.pps(s1, s2, s3, 0, event);\n      pc.pss(s1, s2, s3, 0, event);\n      pc.sss(s1, s2, s3, event);\n   }\n   double d = boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count();\n   if (d < min_time)\n      min_time = d;\n   results[name] = d;\n   std::cout << \"Time for \" << std::setw(30) << std::left << name << \" = \" << d << std::endl;\n   return d;\n}\n\nvoid generate_quickbook()\n{\n   std::cout << \"[table\\n[[Integer Type][Relative Performance (Actual time in parenthesis)]]\\n\";\n\n   std::map<std::string, double>::const_iterator i(results.begin()), j(results.end());\n\n   while (i != j)\n   {\n      double rel = i->second / min_time;\n      std::cout << \"[[\" << i->first << \"][\" << rel << \"(\" << i->second << \"s)]]\\n\";\n      ++i;\n   }\n\n   std::cout << \"]\\n\";\n}\n\nint main()\n{\n   boost::random::uniform_int_distribution<> dist((std::numeric_limits<std::int32_t>::min)() / 2, (std::numeric_limits<std::int32_t>::max)() / 2);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      points.push_back(i_point(dist(gen), dist(gen)));\n   }\n\n   test<boost::polygon::detail::voronoi_ctype_traits<std::int32_t> >(\"extended_int\");\n\n   test<cpp_int_voronoi_traits<boost::multiprecision::int256_t> >(\"int256_t\");\n   test<cpp_int_voronoi_traits<boost::multiprecision::int512_t> >(\"int512_t\");\n   test<cpp_int_voronoi_traits<boost::multiprecision::int1024_t> >(\"int1024_t\");\n\n   test<cpp_int_voronoi_traits<boost::multiprecision::checked_int256_t> >(\"checked_int256_t\");\n   test<cpp_int_voronoi_traits<boost::multiprecision::checked_int512_t> >(\"checked_int512_t\");\n   test<cpp_int_voronoi_traits<boost::multiprecision::checked_int1024_t> >(\"checked_int1024_t\");\n\n   test<cpp_int_voronoi_traits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<>, boost::multiprecision::et_off> > >(\"cpp_int\");\n\n#ifdef TEST_GMP\n   test<cpp_int_voronoi_traits<boost::multiprecision::number<boost::multiprecision::gmp_int, boost::multiprecision::et_off> > >(\"mpz_int\");\n#endif\n#ifdef TEST_TOMMATH\n   test<cpp_int_voronoi_traits<boost::multiprecision::number<boost::multiprecision::tommath_int, boost::multiprecision::et_off> > >(\"tom_int\");\n#endif\n\n   generate_quickbook();\n\n   test<native_int_voronoi_traits<std::int64_t> >(\"int64_t\");\n   test<cpp_int_voronoi_traits<boost::multiprecision::number<boost::multiprecision::arithmetic_backend<std::int64_t>, boost::multiprecision::et_off> > >(\"number<arithmetic_backend<std::int64_t>, et_off>\");\n   //test<cpp_int_voronoi_traits<boost::multiprecision::number<boost::multiprecision::arithmetic_backend<std::int64_t>, boost::multiprecision::et_on> > >(\"number<arithmetic_backend<std::int64_t>, et_on>\");\n\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/plots/cpp_bin_float_acos_errors.cpp",
    "content": "//  (C) Copyright Nick Thompson 2020.\n//  (C) Copyright John Maddock 2020.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#include <iostream>\n#include <boost/math/tools/ulps_plot.hpp>\n#include <boost/core/demangle.hpp>\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\nusing boost::math::tools::ulps_plot;\n\nint main() \n{\n   using PreciseReal = boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<300> >;\n   using CoarseReal = boost::multiprecision::cpp_bin_float_50;\n\n   typedef boost::math::policies::policy<\n      boost::math::policies::promote_float<false>,\n      boost::math::policies::promote_double<false> >\n      no_promote_policy;\n\n   auto ai_coarse = [](CoarseReal const& x)->CoarseReal {\n      return acos(x);\n   };\n   auto ai_precise = [](PreciseReal const& x)->PreciseReal {\n      return acos(x);\n   };\n\n   std::string filename = \"cpp_bin_float_acos.svg\";\n   int samples = 100000;\n   // How many pixels wide do you want your .svg?\n   int width = 700;\n   // Near a root, we have unbounded relative error. So for functions with roots, we define an ULP clip:\n   PreciseReal clip = 20;\n   // Should we perturb the abscissas?\n   bool perturb_abscissas = false;\n   auto plot              = ulps_plot<decltype(ai_precise), PreciseReal, CoarseReal>(ai_precise, CoarseReal(-1), CoarseReal(1), samples, perturb_abscissas);\n   // Note the argument chaining:\n   plot./*clip(clip).*/width(width);\n   plot.background_color(\"white\").font_color(\"black\");\n   // Sometimes it's useful to set a title, but in many cases it's more useful to just use a caption.\n   std::string title = \"acos ULP plot cpp_bin_float_50\";\n   plot.title(title);\n   plot.vertical_lines(6);\n   plot.add_fn(ai_coarse);\n   // You can write the plot to a stream:\n   //std::cout << plot;\n   // Or to a file:\n   plot.write(filename);\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/plots/cpp_bin_float_asin_errors.cpp",
    "content": "//  (C) Copyright Nick Thompson 2020.\n//  (C) Copyright John Maddock 2020.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#include <iostream>\n#include <boost/math/tools/ulps_plot.hpp>\n#include <boost/core/demangle.hpp>\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\nusing boost::math::tools::ulps_plot;\n\nint main() {\n   using PreciseReal = boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<300> >;\n   using CoarseReal = boost::multiprecision::cpp_bin_float_50;\n\n   typedef boost::math::policies::policy<\n      boost::math::policies::promote_float<false>,\n      boost::math::policies::promote_double<false> >\n      no_promote_policy;\n\n   auto ai_coarse = [](CoarseReal const& x)->CoarseReal {\n      return asin(x);\n   };\n   auto ai_precise = [](PreciseReal const& x)->PreciseReal {\n      return asin(x);\n   };\n\n   std::string filename = \"cpp_bin_float_asin.svg\";\n   int samples = 100000;\n   // How many pixels wide do you want your .svg?\n   int width = 700;\n   // Near a root, we have unbounded relative error. So for functions with roots, we define an ULP clip:\n   PreciseReal clip = 20;\n   // Should we perturb the abscissas?\n   bool perturb_abscissas = false;\n   auto plot = ulps_plot<decltype(ai_precise), PreciseReal, CoarseReal>(ai_precise, CoarseReal(-1), CoarseReal(1), samples, perturb_abscissas);\n   // Note the argument chaining:\n   plot/*.clip(clip)*/.width(width);\n   plot.background_color(\"white\").font_color(\"black\");\n   // Sometimes it's useful to set a title, but in many cases it's more useful to just use a caption.\n   std::string title = \"asin ULP plot with cpp_bin_float_50\";\n   plot.title(title);\n   plot.vertical_lines(6);\n   plot.add_fn(ai_coarse);\n   // You can write the plot to a stream:\n   //std::cout << plot;\n   // Or to a file:\n   plot.write(filename);\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/plots/cpp_bin_float_atan_errors.cpp",
    "content": "\n//  (C) Copyright Nick Thompson 2020.\n//  (C) Copyright John Maddock 2020.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#include <iostream>\n#include <boost/math/tools/ulps_plot.hpp>\n#include <boost/core/demangle.hpp>\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\nusing boost::math::tools::ulps_plot;\n\nint main() {\n   using PreciseReal = boost::multiprecision::mpfr_float_100;\n   using CoarseReal = boost::multiprecision::cpp_bin_float_50;\n\n   typedef boost::math::policies::policy<\n      boost::math::policies::promote_float<false>,\n      boost::math::policies::promote_double<false> >\n      no_promote_policy;\n\n   auto ai_coarse = [](CoarseReal const& x)->CoarseReal {\n      return atan(x);\n   };\n   auto ai_precise = [](PreciseReal const& x)->PreciseReal {\n      return atan(x);\n   };\n\n   std::string filename = \"cpp_bin_float_atan.svg\";\n   int samples = 100000;\n   // How many pixels wide do you want your .svg?\n   int width = 700;\n   // Near a root, we have unbounded relative error. So for functions with roots, we define an ULP clip:\n   PreciseReal clip = 50;\n   // Should we perturb the abscissas?\n   bool perturb_abscissas = false;\n   auto plot = ulps_plot<decltype(ai_precise), PreciseReal, CoarseReal>(ai_precise, CoarseReal(-200), CoarseReal(200), samples, perturb_abscissas);\n   // Note the argument chaining:\n   plot/*.clip(clip)*/.width(width);\n   plot.background_color(\"white\").font_color(\"black\");\n   // Sometimes it's useful to set a title, but in many cases it's more useful to just use a caption.\n   std::string title = \"atan ULP plot with cpp_bin_float_50\";\n   plot.title(title);\n   plot.vertical_lines(6);\n   plot.add_fn(ai_coarse);\n   // You can write the plot to a stream:\n   //std::cout << plot;\n   // Or to a file:\n   plot.write(filename);\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/plots/cpp_bin_float_cos_errors.cpp",
    "content": "\n//  (C) Copyright Nick Thompson 2020.\n//  (C) Copyright John Maddock 2020.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#include <iostream>\n#include <boost/math/tools/ulps_plot.hpp>\n#include <boost/core/demangle.hpp>\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\nusing boost::math::tools::ulps_plot;\n\nint main() {\n   using PreciseReal = boost::multiprecision::mpfr_float_100;\n   using CoarseReal = boost::multiprecision::cpp_bin_float_50;\n\n   typedef boost::math::policies::policy<\n      boost::math::policies::promote_float<false>,\n      boost::math::policies::promote_double<false> >\n      no_promote_policy;\n\n   auto ai_coarse = [](CoarseReal const& x)->CoarseReal {\n      return cos(x);\n   };\n   auto ai_precise = [](PreciseReal const& x)->PreciseReal {\n      return cos(x);\n   };\n\n   std::string filename = \"cpp_bin_float_cos.svg\";\n   int samples = 100000;\n   // How many pixels wide do you want your .svg?\n   int width = 700;\n   // Near a root, we have unbounded relative error. So for functions with roots, we define an ULP clip:\n   PreciseReal clip = 50;\n   // Should we perturb the abscissas?\n   bool perturb_abscissas = false;\n   auto plot = ulps_plot<decltype(ai_precise), PreciseReal, CoarseReal>(ai_precise, CoarseReal(-20), CoarseReal(20), samples, perturb_abscissas);\n   // Note the argument chaining:\n   plot.clip(clip).width(width);\n   plot.background_color(\"white\").font_color(\"black\");\n   // Sometimes it's useful to set a title, but in many cases it's more useful to just use a caption.\n   std::string title = \"cos ULP plot with cpp_bin_float_50\";\n   plot.title(title);\n   plot.vertical_lines(6);\n   plot.add_fn(ai_coarse);\n   // You can write the plot to a stream:\n   //std::cout << plot;\n   // Or to a file:\n   plot.write(filename);\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/plots/cpp_bin_float_erf_errors.cpp",
    "content": "\n//  (C) Copyright Nick Thompson 2020.\n//  (C) Copyright John Maddock 2020.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#include <iostream>\n#include <boost/math/tools/ulps_plot.hpp>\n#include <boost/core/demangle.hpp>\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\nusing boost::math::tools::ulps_plot;\n\nint main() {\n   using PreciseReal = boost::multiprecision::mpfr_float_100;\n   using CoarseReal = boost::multiprecision::cpp_bin_float_50;\n\n   typedef boost::math::policies::policy<\n      boost::math::policies::promote_float<false>,\n      boost::math::policies::promote_double<false> >\n      no_promote_policy;\n\n   auto ai_coarse = [](CoarseReal const& x)->CoarseReal {\n      return erf(x);\n   };\n   auto ai_precise = [](PreciseReal const& x)->PreciseReal {\n      return erf(x);\n   };\n\n   std::string filename = \"cpp_bin_float_erf.svg\";\n   int samples = 100000;\n   // How many pixels wide do you want your .svg?\n   int width = 700;\n   // Near a root, we have unbounded relative error. So for functions with roots, we define an ULP clip:\n   PreciseReal clip = 40;\n   // Should we perturb the abscissas?\n   bool perturb_abscissas = false;\n   auto plot = ulps_plot<decltype(ai_precise), PreciseReal, CoarseReal>(ai_precise, CoarseReal(-10), CoarseReal(10), samples, perturb_abscissas);\n   // Note the argument chaining:\n   plot.clip(clip).width(width);\n   plot.background_color(\"white\").font_color(\"black\");\n   // Sometimes it's useful to set a title, but in many cases it's more useful to just use a caption.\n   //std::string title = \"Airy Ai ULP plot at \" + boost::core::demangle(typeid(CoarseReal).name()) + \" precision\";\n   //plot.title(title);\n   plot.vertical_lines(6);\n   plot.add_fn(ai_coarse);\n   // You can write the plot to a stream:\n   //std::cout << plot;\n   // Or to a file:\n   plot.write(filename);\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/plots/cpp_bin_float_erfc_errors.cpp",
    "content": "\n//  (C) Copyright Nick Thompson 2020.\n//  (C) Copyright John Maddock 2020.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#include <iostream>\n#include <boost/math/tools/ulps_plot.hpp>\n#include <boost/core/demangle.hpp>\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\nusing boost::math::tools::ulps_plot;\n\nint main() {\n   using PreciseReal = boost::multiprecision::mpfr_float_100;\n   using CoarseReal = boost::multiprecision::cpp_bin_float_50;\n\n   typedef boost::math::policies::policy<\n      boost::math::policies::promote_float<false>,\n      boost::math::policies::promote_double<false> >\n      no_promote_policy;\n\n   auto ai_coarse = [](CoarseReal const& x)->CoarseReal {\n      return erfc(x);\n   };\n   auto ai_precise = [](PreciseReal const& x)->PreciseReal {\n      return erfc(x);\n   };\n\n   std::string filename = \"cpp_bin_float_erfc.svg\";\n   int samples = 100000;\n   // How many pixels wide do you want your .svg?\n   int width = 700;\n   // Near a root, we have unbounded relative error. So for functions with roots, we define an ULP clip:\n   PreciseReal clip = 200;\n   // Should we perturb the abscissas?\n   bool perturb_abscissas = false;\n   auto plot = ulps_plot<decltype(ai_precise), PreciseReal, CoarseReal>(ai_precise, CoarseReal(-20), CoarseReal(20), samples, perturb_abscissas);\n   // Note the argument chaining:\n   plot.clip(clip).width(width);\n   plot.background_color(\"white\").font_color(\"black\");\n   // Sometimes it's useful to set a title, but in many cases it's more useful to just use a caption.\n   //std::string title = \"Airy Ai ULP plot at \" + boost::core::demangle(typeid(CoarseReal).name()) + \" precision\";\n   //plot.title(title);\n   plot.vertical_lines(6);\n   plot.add_fn(ai_coarse);\n   // You can write the plot to a stream:\n   //std::cout << plot;\n   // Or to a file:\n   plot.write(filename);\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/plots/cpp_bin_float_exp_errors.cpp",
    "content": "\n//  (C) Copyright Nick Thompson 2020.\n//  (C) Copyright John Maddock 2020.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#include <iostream>\n#include <boost/math/tools/ulps_plot.hpp>\n#include <boost/core/demangle.hpp>\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\nusing boost::math::tools::ulps_plot;\n\nint main() {\n   using PreciseReal = boost::multiprecision::mpfr_float_100;\n   using CoarseReal = boost::multiprecision::cpp_bin_float_50;\n\n   typedef boost::math::policies::policy<\n      boost::math::policies::promote_float<false>,\n      boost::math::policies::promote_double<false> >\n      no_promote_policy;\n\n   auto ai_coarse = [](CoarseReal const& x)->CoarseReal {\n      return exp(x);\n   };\n   auto ai_precise = [](PreciseReal const& x)->PreciseReal {\n      return exp(x);\n   };\n\n   std::string filename = \"cpp_bin_float_exp.svg\";\n   int samples = 100000;\n   // How many pixels wide do you want your .svg?\n   int width = 700;\n   // Near a root, we have unbounded relative error. So for functions with roots, we define an ULP clip:\n   PreciseReal clip = 200;\n   // Should we perturb the abscissas?\n   bool perturb_abscissas = false;\n   auto plot = ulps_plot<decltype(ai_precise), PreciseReal, CoarseReal>(ai_precise, CoarseReal(-100), CoarseReal(100), samples, perturb_abscissas);\n   // Note the argument chaining:\n   plot.clip(clip).width(width);\n   plot.background_color(\"white\").font_color(\"black\");\n   // Sometimes it's useful to set a title, but in many cases it's more useful to just use a caption.\n   //std::string title = \"Airy Ai ULP plot at \" + boost::core::demangle(typeid(CoarseReal).name()) + \" precision\";\n   //plot.title(title);\n   plot.vertical_lines(6);\n   plot.add_fn(ai_coarse);\n   // You can write the plot to a stream:\n   //std::cout << plot;\n   // Or to a file:\n   plot.write(filename);\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/plots/cpp_bin_float_log_errors.cpp",
    "content": "\n//  (C) Copyright Nick Thompson 2020.\n//  (C) Copyright John Maddock 2020.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#include <iostream>\n#include <boost/math/tools/ulps_plot.hpp>\n#include <boost/core/demangle.hpp>\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\nusing boost::math::tools::ulps_plot;\n\nint main() {\n   using PreciseReal = boost::multiprecision::mpfr_float_100;\n   using CoarseReal = boost::multiprecision::cpp_bin_float_50;\n\n   typedef boost::math::policies::policy<\n      boost::math::policies::promote_float<false>,\n      boost::math::policies::promote_double<false> >\n      no_promote_policy;\n\n   auto ai_coarse = [](CoarseReal const& x)->CoarseReal {\n      return log(x);\n   };\n   auto ai_precise = [](PreciseReal const& x)->PreciseReal {\n      return log(x);\n   };\n\n   std::string filename = \"cpp_bin_float_log.svg\";\n   int samples = 100000;\n   // How many pixels wide do you want your .svg?\n   int width = 700;\n   // Near a root, we have unbounded relative error. So for functions with roots, we define an ULP clip:\n   PreciseReal clip = 20;\n   // Should we perturb the abscissas?\n   bool perturb_abscissas = false;\n   auto plot = ulps_plot<decltype(ai_precise), PreciseReal, CoarseReal>(ai_precise, CoarseReal(0), CoarseReal(200), samples, perturb_abscissas);\n   // Note the argument chaining:\n   plot.clip(clip).width(width);\n   plot.background_color(\"white\").font_color(\"black\");\n   // Sometimes it's useful to set a title, but in many cases it's more useful to just use a caption.\n   //std::string title = \"Airy Ai ULP plot at \" + boost::core::demangle(typeid(CoarseReal).name()) + \" precision\";\n   //plot.title(title);\n   plot.vertical_lines(6);\n   plot.add_fn(ai_coarse);\n   // You can write the plot to a stream:\n   //std::cout << plot;\n   // Or to a file:\n   plot.write(filename);\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/plots/cpp_bin_float_sin_errors.cpp",
    "content": "\n//  (C) Copyright Nick Thompson 2020.\n//  (C) Copyright John Maddock 2020.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#include <iostream>\n#include <boost/math/tools/ulps_plot.hpp>\n#include <boost/math/special_functions/relative_difference.hpp>\n#include <boost/core/demangle.hpp>\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\nusing boost::math::tools::ulps_plot;\n\nint main() {\n   using PreciseReal = boost::multiprecision::mpfr_float_100;\n   using CoarseReal = boost::multiprecision::cpp_bin_float_50;\n\n   typedef boost::math::policies::policy<\n      boost::math::policies::promote_float<false>,\n      boost::math::policies::promote_double<false> >\n      no_promote_policy;\n\n   auto ai_coarse = [](CoarseReal const& x)->CoarseReal {\n      return sin(x);\n   };\n   auto ai_precise = [](PreciseReal const& x)->PreciseReal {\n      return sin(x);\n   };\n\n   std::string filename = \"cpp_bin_float_sin.svg\";\n   int samples = 100000;\n   // How many pixels wide do you want your .svg?\n   int width = 700;\n   // Near a root, we have unbounded relative error. So for functions with roots, we define an ULP clip:\n   PreciseReal clip = 50;\n   // Should we perturb the abscissas? \n   bool perturb_abscissas = false;\n   auto plot = ulps_plot<decltype(ai_precise), PreciseReal, CoarseReal>(ai_precise, CoarseReal(-20), CoarseReal(20), samples, perturb_abscissas);\n   // Note the argument chaining:\n   plot./*clip(clip).*/width(width);\n   plot.background_color(\"white\").font_color(\"black\");\n   // Sometimes it's useful to set a title, but in many cases it's more useful to just use a caption.\n   std::string title = \"sin ULP plot with cpp_bin_float_50\";\n   plot.title(title);\n   plot.vertical_lines(6);\n   plot.add_fn(ai_coarse);\n   // You can write the plot to a stream:\n   //std::cout << plot;\n   // Or to a file:\n   plot.write(filename);\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/plots/cpp_bin_float_tan_errors.cpp",
    "content": "\n//  (C) Copyright Nick Thompson 2020.\n//  (C) Copyright John Maddock 2020.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#include <iostream>\n#include <boost/math/tools/ulps_plot.hpp>\n#include <boost/core/demangle.hpp>\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\nusing boost::math::tools::ulps_plot;\n\nint main() {\n   using PreciseReal = boost::multiprecision::mpfr_float_100;\n   using CoarseReal = boost::multiprecision::cpp_bin_float_50;\n\n   typedef boost::math::policies::policy<\n      boost::math::policies::promote_float<false>,\n      boost::math::policies::promote_double<false> >\n      no_promote_policy;\n\n   auto ai_coarse = [](CoarseReal const& x)->CoarseReal {\n      return tan(x);\n   };\n   auto ai_precise = [](PreciseReal const& x)->PreciseReal {\n      return tan(x);\n   };\n\n   std::string filename = \"cpp_bin_float_tan.svg\";\n   int samples = 100000;\n   // How many pixels wide do you want your .svg?\n   int width = 700;\n   // Near a root, we have unbounded relative error. So for functions with roots, we define an ULP clip:\n   PreciseReal clip = 20;\n   // Should we perturb the abscissas?\n   bool perturb_abscissas = false;\n   auto plot = ulps_plot<decltype(ai_precise), PreciseReal, CoarseReal>(ai_precise, CoarseReal(-20), CoarseReal(20), samples, perturb_abscissas);\n   // Note the argument chaining:\n   plot.clip(clip).width(width);\n   plot.background_color(\"white\").font_color(\"black\");\n   // Sometimes it's useful to set a title, but in many cases it's more useful to just use a caption.\n   std::string title = \"tan ULP plot with cpp_bin_float_50\";\n   plot.title(title);\n   plot.vertical_lines(6);\n   plot.add_fn(ai_coarse);\n   // You can write the plot to a stream:\n   //std::cout << plot;\n   // Or to a file:\n   plot.write(filename);\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/plots/cpp_bin_float_tgamma_errors.cpp",
    "content": "\n//  (C) Copyright Nick Thompson 2020.\n//  (C) Copyright John Maddock 2020.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#include <iostream>\n#include <boost/math/tools/ulps_plot.hpp>\n#include <boost/core/demangle.hpp>\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\nusing boost::math::tools::ulps_plot;\n\nint main() {\n   using PreciseReal = boost::multiprecision::mpfr_float_100;\n   using CoarseReal = boost::multiprecision::cpp_bin_float_50;\n\n   typedef boost::math::policies::policy<\n      boost::math::policies::promote_float<false>,\n      boost::math::policies::promote_double<false> >\n      no_promote_policy;\n\n   auto ai_coarse = [](CoarseReal const& x)->CoarseReal {\n      return tgamma(x);\n   };\n   auto ai_precise = [](PreciseReal const& x)->PreciseReal {\n      return tgamma(x);\n   };\n\n   std::string filename = \"cpp_bin_float_tgamma.svg\";\n   int samples = 100000;\n   // How many pixels wide do you want your .svg?\n   int width = 700;\n   // Near a root, we have unbounded relative error. So for functions with roots, we define an ULP clip:\n   PreciseReal clip = 400;\n   // Should we perturb the abscissas? \n   bool perturb_abscissas = false;\n   auto plot = ulps_plot<decltype(ai_precise), PreciseReal, CoarseReal>(ai_precise, CoarseReal(-20), CoarseReal(200), samples, perturb_abscissas);\n   // Note the argument chaining:\n   plot.clip(clip).width(width);\n   plot.background_color(\"white\").font_color(\"black\");\n   // Sometimes it's useful to set a title, but in many cases it's more useful to just use a caption.\n   //std::string title = \"Airy Ai ULP plot at \" + boost::core::demangle(typeid(CoarseReal).name()) + \" precision\";\n   //plot.title(title);\n   plot.vertical_lines(6);\n   plot.add_fn(ai_coarse);\n   // You can write the plot to a stream:\n   //std::cout << plot;\n   // Or to a file:\n   plot.write(filename);\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/Jamfile.v2",
    "content": "# copyright John Maddock 2011\n# Distributed under the Boost Software License, Version 1.0.\n# (See accompanying file LICENSE_1_0.txt or copy at\n# http://www.boost.org/LICENSE_1_0.txt.\n\nimport testing ;\nimport modules ;\nimport path ;\nimport ../../config/checks/config : requires ;\n\nlocal ntl-path = [ modules.peek : NTL_PATH ] ;\nlocal gmp_path = [ modules.peek : GMP_PATH ] ;\nlocal mpfr_path = [ modules.peek : MPFR_PATH ] ;\nlocal mpfi_path = [ modules.peek : MPFI_PATH ] ;\nlocal tommath_path = [ modules.peek : TOMMATH_PATH ] ;\n\n\n#######################################################################################\n#\n#  NOTE: Because these tests take a fair while to build and run, they are split up into\n#        multiple smaller test suites which are:\n#\n#        arithmetic_tests\n#        functions_and_limits\n#        conversions\n#        cpp_int_tests\n#        misc\n#        specfun\n#        compile_fail\n#        concepts\n#        examples\n#        \n#        You can run an individual suite by passing its name to b2 on the command line.\n#        Or you can run all except the \"specfun\" tests (which are very slow) by not specifying anything.\n#\n#        Please make sure that any new tests are added to one of the test suites, and that the\n#        build times for the various suites are reasonably balanced: otherwise the CI builds\n#        will time out if one suite contains too many.\n#\n#######################################################################################################\n\npath-constant here : . ;\n\nproject : requirements\n   <include>$(gmp_path)\n   <include>$(gmp_path)/mpfr\n   <include>$(gmp_path)/gmpfrxx\n   <include>$(mpfr_path)\n   <include>$(mpfi_path)\n   <include>$(mpfi_path)/src\n   <include>$(tommath_path)\n   <include>../include\n   <include>../../..\n   # We set these to make it easier to set up and test GMP and MPFR under Win32:\n   <toolset>msvc:<runtime-link>static\n   <toolset>msvc:<link>static\n   <toolset>msvc:<warnings>all\n   <toolset>msvc:<cxxflags>/fp\\:precise\n   <toolset>intel-win:<runtime-link>static\n   <toolset>intel-win:<link>static\n   <toolset>clang-win:<link>static  # Clang-win does not generate .dlls.\n   <toolset>clang:<link>static # Clang-linux does not generate .dlls.\n   <toolset>clang:<cxxflags>-Wno-unused-variable  # warning: unused variable 'tolerance' [-Wunused-variable]\n   <toolset>clang:<cxxflags>-v\n  \n   # Assembler error \"File too big\" caused by lots of C++ templates, for example, math/floating_point_examples.cpp.\n   # Some projects on some toolsets may require\n   #   <toolset>gcc-mingw:<cxxflags>\\\"-Wa,-mbig-obj\\\"\n   # See https://digitalkarabela.com/mingw-w64-how-to-fix-file-too-big-too-many-sections/\n   # <toolset>gcc-mingw:<cxxflags>-Wa,-mbig-obj # Some projects may overflow assembler and require equivalent of MSVC /bigobj.\n   # Requires version 2.30 of GNU binutils.\n   # Best applied only to projects that require this, see multiprecision/example  run math/floating_point_examples.cpp.\n   \n   # Speed up compiles:\n   <toolset>msvc:<debug-symbols>off\n   <toolset>intel:<debug-symbols>off\n   <toolset>gcc:<cxxflags>-Wall\n   <toolset>gcc:<cxxflags>-Wextra\n   #<toolset>intel:<define>SLOW_COMPILER\n   <toolset>msvc,<optimization>off:<cxxflags>-RTC1\n   # We can't yet enable this - it breaks the STL in some tests...\n   #<toolset>msvc,<optimization>off:<cxxflags>-RTCc\n   #<toolset>msvc,<optimization>off:<define>_ALLOW_RTCc_IN_STL\n   [ requires  \n      cxx11_rvalue_references cxx11_template_aliases cxx11_hdr_array cxx11_allocator cxx11_constexpr cxx11_explicit_conversion_operators cxx11_ref_qualifiers\n      cxx11_hdr_functional cxx11_variadic_templates cxx11_user_defined_literals cxx11_decltype cxx11_static_assert cxx11_defaulted_functions\n      cxx11_noexcept cxx11_ref_qualifiers cxx11_user_defined_literals cxx11_hdr_type_traits\n      ]\n   ;\n\nlocal enable-specfun = [ MATCH (--enable-specfun) : [ modules.peek : ARGV ] ] ;\nlocal disable-concepts = [ MATCH (--disable-concepts) : [ modules.peek : ARGV ] ] ;\n\nlib gmp : : <search>$(gmp_path) ;\nlib mpfr : : <search>$(gmp_path) <search>$(mpfr_path) <search>$(mpfr_path)/build.vc10/lib/Win32/Debug ;\nlib mpfi : : <search>$(gmp_path) <search>$(mpfr_path) <search>$(mpfr_path)/build.vc10/lib/Win32/Debug <search>$(mpfi_path) <search>$(mpfi_path)/src ;\nlib quadmath ;\nlib mpc ;\n\nif $(tommath_path)\n{\n   lib tommath : [ GLOB $(tommath_path) : *.c ] : <visibility>global ;\n   TOMMATH = tommath ;\n}\nelse\n{\n   lib tommath : : <search>$(tommath_path) ;\n   TOMMATH = tommath ;\n}\n\nlib no_eh_support : no_eh_test_support.cpp ;\n\ntest-suite arithmetic_tests :\n\n   [ run test_arithmetic_backend_concept.cpp no_eh_support ]\n   [ compile test_arithmetic_skeleton.cpp ]\n\n   [ run test_arithmetic_cpp_dec_float_1.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_dec_float_2.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_dec_float_3.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_dec_float_3m.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n\n   [ run test_arithmetic_cpp_bin_float_1.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_bin_float_2.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_bin_float_2m.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_bin_float_3.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_bin_float_4.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_bin_float_5.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n\n   [ run test_arithmetic_mpf_50.cpp gmp no_eh_support : : : [ check-target-builds ../config//has_gmp : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_mpf.cpp gmp no_eh_support : : : [ check-target-builds ../config//has_gmp : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_mpz.cpp gmp no_eh_support : : : [ check-target-builds ../config//has_gmp : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_mpz_rat.cpp gmp no_eh_support : : : [ check-target-builds ../config//has_gmp : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_mpz_br.cpp gmp no_eh_support : : : [ check-target-builds ../config//has_gmp : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_mpq.cpp gmp no_eh_support : : : [ check-target-builds ../config//has_gmp : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n\n   [ run test_arithmetic_mpfr.cpp mpfr gmp no_eh_support : : : [ check-target-builds ../config//has_mpfr : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_mpfr_50.cpp mpfr gmp no_eh_support : : : [ check-target-builds ../config//has_mpfr : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_mpfr_50_static.cpp mpfr gmp no_eh_support : : : [ check-target-builds ../config//has_mpfr : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n\n   [ run test_arithmetic_tommath.cpp $(TOMMATH) no_eh_support : : : [ check-target-builds ../config//has_tommath : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_tommath_rat.cpp $(TOMMATH) no_eh_support : : : [ check-target-builds ../config//has_tommath : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_tommath_br.cpp $(TOMMATH) no_eh_support : : : [ check-target-builds ../config//has_tommath : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n\n   [ run test_arithmetic_cpp_int_1.cpp no_eh_support : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_2.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_3.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_4.cpp no_eh_support : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_5.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_6.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_7.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_8.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_9.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_10.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_11.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_12.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_13.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_14.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_15.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_16.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_17.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_18.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_19.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_20.cpp no_eh_support : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_21.cpp no_eh_support : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_22.cpp no_eh_support : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_23.cpp no_eh_support : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_br.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n\n   [ run test_arithmetic_ab_1.cpp no_eh_support : : : [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_ab_2.cpp no_eh_support : : : [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_ab_3.cpp no_eh_support : : : [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n\n   [ run test_cpp_dec_float_round.cpp no_eh_support ]\n\n   [ run test_arithmetic_logged_1.cpp no_eh_support : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_logged_2.cpp no_eh_support : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n\n   [ run test_arithmetic_dbg_adptr1.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_dbg_adptr1m.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_dbg_adptr2.cpp no_eh_support : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n\n   [ run test_arithmetic_cpp_complex_dbg_adptr.cpp : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_dbg_adptr.cpp : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_rat_dbg_adptr.cpp : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_mpf_dbg_adptr.cpp gmp : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_gmp : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_mpc_dbg_adptr.cpp mpc mpfr gmp : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_mpc : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_mpfi_dbg_adptr.cpp mpfi mpfr gmp : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_mpfi : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_mpfr_dbg_adptr.cpp mpfr gmp : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_mpfr : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_mpq_dbg_adptr.cpp gmp : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_gmp : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_mpz_dbg_adptr.cpp gmp : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_gmp : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n\n   [ run test_arithmetic_cpp_complex_logged_adptr.cpp : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_int_logged_adptr.cpp : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_cpp_rat_logged_adptr.cpp : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_mpf_logged_adptr.cpp gmp : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_gmp : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_mpc_logged_adptr.cpp mpc mpfr gmp : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_mpc : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_mpfi_logged_adptr.cpp mpfi mpfr gmp : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_mpfi : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_mpfr_logged_adptr.cpp mpfr gmp : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_mpfr : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_mpq_logged_adptr.cpp gmp : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_gmp : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_mpz_logged_adptr.cpp gmp : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_gmp : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n\n   [ run test_arithmetic_mpfi_50.cpp mpfi mpfr gmp no_eh_support : : : [ check-target-builds ../config//has_mpfi : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n\n   [ run test_arithmetic_float_128.cpp quadmath no_eh_support : : : [ check-target-builds ../config//has_float128 : : <build>no ] ]\n   [ run test_arithmetic_float_128.cpp no_eh_support : : : [ check-target-builds ../config//has_intel_quad : <cxxflags>-Qoption,cpp,--extended_float_type : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] : test_arithmetic_intel_quad ]\n\n   [ run test_arithmetic_mpc.cpp mpc mpfr gmp : : : [ check-target-builds ../config//has_mpc : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_mpfr_mpc_precisions.cpp mpc mpfr gmp : : : [ check-target-builds ../config//has_mpc : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_mpfi_precisions.cpp mpfi mpfr gmp : : : [ check-target-builds ../config//has_mpfi : : <build>no ] ]\n   [ run test_mpf_precisions.cpp gmp : : : [ check-target-builds ../config//has_gmp : : <build>no ] ]\n   [ run test_threaded_precision.cpp mpfr gmp : : : [ check-target-builds ../config//has_mpfr : : <build>no ] <define>TEST_MPF_50 : test_threaded_precision_mpf ]\n   [ run test_complex.cpp : : : [ check-target-builds ../config//has_mpc : <define>TEST_MPC <source>mpc <source>mpfr <source>gmp ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_complex_adaptor.cpp : : : [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_complex_adaptor_2.cpp : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n   [ run test_arithmetic_complex128.cpp : : : [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n\n   [ run test_signed_zero.cpp : : : <define>TEST_CPP_BIN_FLOAT [ requires cxx17_if_constexpr ] : test_signed_zero_cpp_bin_float ]\n   [ run test_signed_zero.cpp mpfr gmp : : : <define>TEST_MPFR [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_mpfr : : <build>no ] : test_signed_zero_mpfr ]\n\n   [ run test_complex_signed_zero.cpp : : : <define>TEST_CPP_BIN_FLOAT [ requires cxx17_if_constexpr ] : test_complex_signed_zero_cpp_bin_float ]\n   [ run test_complex_signed_zero.cpp mpc mpfr gmp : : : <define>TEST_MPC [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_mpc : : <build>no ] : test_complex_signed_zero_mpc ]\n\n   [ run test_preserve_source_precision.cpp gmp : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_gmp : : <build>no ] <define>TEST_MPF : test_preserve_source_precision_gmp ]\n   [ run test_preserve_source_precision.cpp gmp mpfr : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_mpfr : : <build>no ] <define>TEST_MPFR  : test_preserve_source_precision_mpfr ]\n   [ run test_preserve_source_precision.cpp gmp mpfr mpc : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_mpc : : <build>no ] <define>TEST_MPC : test_preserve_source_precision_mpc ]\n   [ run test_preserve_source_precision.cpp gmp mpfr mpfi : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_mpfi : : <build>no ] <define>TEST_MPFI : test_preserve_source_precision_mpfi ]\n   [ run test_preserve_component_precision.cpp gmp : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_gmp : : <build>no ] <define>TEST_MPF : test_preserve_component_precision_gmp ]\n   [ run test_preserve_component_precision.cpp gmp mpfr : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_mpfr : : <build>no ] <define>TEST_MPFR  : test_preserve_component_precision_mpfr ]\n   [ run test_preserve_component_precision.cpp gmp mpfr mpc : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_mpc : : <build>no ] <define>TEST_MPC : test_preserve_component_precision_mpc ]\n   [ run test_preserve_component_precision.cpp gmp mpfr mpfi : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_mpfi : : <build>no ] <define>TEST_MPFI : test_preserve_component_precision_mpfi ]\n   [ run test_preserve_related_precision.cpp gmp : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_gmp : : <build>no ] <define>TEST_MPF : test_preserve_related_precision_gmp ]\n   [ run test_preserve_related_precision.cpp gmp mpfr : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_mpfr : : <build>no ] <define>TEST_MPFR  : test_preserve_related_precision_mpfr ]\n   [ run test_preserve_related_precision.cpp gmp mpfr mpc : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_mpc : : <build>no ] <define>TEST_MPC : test_preserve_related_precision_mpc ]\n   [ run test_preserve_related_precision.cpp gmp mpfr mpfi : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_mpfi : : <build>no ] <define>TEST_MPFI : test_preserve_related_precision_mpfi ]\n   [ run test_preserve_all_precision.cpp gmp : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_gmp : : <build>no ] <define>TEST_MPF : test_preserve_all_precision_gmp ]\n   [ run test_preserve_all_precision.cpp gmp mpfr : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_mpfr : : <build>no ] <define>TEST_MPFR  : test_preserve_all_precision_mpfr ]\n   [ run test_preserve_all_precision.cpp gmp mpfr mpc : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_mpc : : <build>no ] <define>TEST_MPC : test_preserve_all_precision_mpc ]\n   [ run test_preserve_all_precision.cpp gmp mpfr mpfi : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_mpfi : : <build>no ] <define>TEST_MPFI : test_preserve_all_precision_mpfi ]\n   [ run test_preserve_target_precision.cpp gmp : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_gmp : : <build>no ] <define>TEST_MPF : test_preserve_target_precision_gmp ]\n   [ run test_preserve_target_precision.cpp gmp mpfr : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_mpfr : : <build>no ] <define>TEST_MPFR : test_preserve_target_precision_mpfr ]\n   [ run test_preserve_target_precision.cpp gmp mpfr mpc : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_mpc : : <build>no ] <define>TEST_MPC : test_preserve_target_precision_mpc ]\n   [ run test_preserve_target_precision.cpp gmp mpfr mpfi : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_mpfi : : <build>no ] <define>TEST_MPFI : test_preserve_target_precision_mpfi ]\n   [ run test_assume_uniform_precision.cpp gmp : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_gmp : : <build>no ] <define>TEST_MPF : test_assume_uniform_precision_gmp ]\n   [ run test_assume_uniform_precision.cpp gmp mpfr : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_mpfr : : <build>no ] <define>TEST_MPFR : test_assume_uniform_precision_mpfr ]\n   [ run test_assume_uniform_precision.cpp gmp mpfr mpc : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_mpc : : <build>no ] <define>TEST_MPC : test_assume_uniform_precision_mpc ]\n   [ run test_assume_uniform_precision.cpp gmp mpfr mpfi : : : [ requires cxx17_if_constexpr ] [ check-target-builds ../config//has_mpfi : : <build>no ] <define>TEST_MPFI : test_assume_uniform_precision_mpfi ]\n\n;\n\nalias precision_tests : test_preserve_source_precision_gmp test_preserve_source_precision_mpfr test_preserve_source_precision_mpc test_preserve_source_precision_mpfi \n   test_preserve_component_precision_gmp test_preserve_component_precision_mpfr test_preserve_component_precision_mpc test_preserve_component_precision_mpfi \n   test_preserve_related_precision_gmp test_preserve_related_precision_mpfr test_preserve_related_precision_mpc test_preserve_related_precision_mpfi \n   test_preserve_all_precision_gmp test_preserve_all_precision_mpfr test_preserve_all_precision_mpc test_preserve_all_precision_mpfi \n   test_preserve_target_precision_gmp test_preserve_target_precision_mpfr test_preserve_target_precision_mpc test_preserve_target_precision_mpfi \n   test_assume_uniform_precision_gmp test_assume_uniform_precision_mpfr test_assume_uniform_precision_mpc test_assume_uniform_precision_mpfi \n   test_mpfr_mpc_precisions test_mpfi_precisions test_mpf_precisions test_threaded_precision_mpf ;\n\nrule get_function_tests\n{\n   local result ;\n   for local source in test_exp.cpp test_log.cpp test_pow.cpp test_sinh.cpp test_sqrt.cpp test_cosh.cpp test_tanh.cpp test_sin.cpp test_cos.cpp test_tan.cpp test_asin.cpp test_acos.cpp test_atan.cpp test_round.cpp test_fpclassify.cpp test_sf_import_c99.cpp\n   {\n         result += [ run $(source) gmp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n               [ check-target-builds ../config//has_gmp : : <build>no ]\n               <define>TEST_MPF_50\n              : $(source:B)_mpf50 ] ;\n         result += [ run $(source) mpfr gmp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n               [ check-target-builds ../config//has_mpfr : : <build>no ]\n               <define>TEST_MPFR_50\n              : $(source:B)_mpfr50 ] ;\n         result += [ run $(source) mpfi mpfr gmp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n               [ check-target-builds ../config//has_mpfi : : <build>no ]\n               <define>TEST_MPFI_50\n              : $(source:B)_mpfi50 ] ;\n         result += [ run $(source) no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n               <define>TEST_CPP_DEC_FLOAT\n              : $(source:B)_cpp_dec_float ] ;\n         result += [ run $(source) no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n               <define>TEST_CPP_BIN_FLOAT\n              : $(source:B)_cpp_bin_float ] ;\n         result += [ run $(source) quadmath no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n               [ check-target-builds ../config//has_float128 : : <build>no ]\n               <define>TEST_FLOAT128\n              : $(source:B)_float128 ] ;\n         result += [ run $(source) no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n               [ check-target-builds ../config//has_intel_quad : <cxxflags>-Qoption,cpp,--extended_float_type : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ]\n               <define>TEST_FLOAT128\n              : $(source:B)_intel_quad ] ;\n   }\n   return $(result) ;\n}\n\ntest-suite functions_and_limits :\n\n      [ run test_numeric_limits.cpp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_BACKEND\n              : test_numeric_limits_backend_concept ]\n\n      [ run test_numeric_limits.cpp gmp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_MPF_50 <define>PRINT_MAX_DIGITS10\n               [ check-target-builds ../config//has_gmp : : <build>no ]\n              : test_numeric_limits_mpf50 ]\n\n      [ run test_numeric_limits.cpp gmp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_MPF <define>PRINT_MAX_DIGITS10\n               [ check-target-builds ../config//has_gmp : : <build>no ]\n              : test_numeric_limits_mpf ]\n\n      [ run test_numeric_limits.cpp gmp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_MPZ\n               [ check-target-builds ../config//has_gmp : : <build>no ]\n              : test_numeric_limits_mpz ]\n\n      [ run test_numeric_limits.cpp gmp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_MPQ\n               [ check-target-builds ../config//has_gmp : : <build>no ]\n              : test_numeric_limits_mpq ]\n\n      [ run test_numeric_limits.cpp mpfr gmp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_MPFR <define>PRINT_MAX_DIGITS10\n               [ check-target-builds ../config//has_mpfr : : <build>no ]\n              : test_numeric_limits_mpfr ]\n\n      [ run test_numeric_limits.cpp mpfr gmp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_MPFR_50 <define>PRINT_MAX_DIGITS10\n               [ check-target-builds ../config//has_mpfr : : <build>no ]\n              : test_numeric_limits_mpfr_50 ]\n\n      [ run test_numeric_limits.cpp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_CPP_DEC_FLOAT\n              : test_numeric_limits_cpp_dec_float ]\n\n      [ run test_numeric_limits.cpp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_CPP_BIN_FLOAT <define>PRINT_MAX_DIGITS10\n              : test_numeric_limits_cpp_bin_float ]\n\n      [ run test_numeric_limits.cpp $(TOMMATH) no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_TOMMATH\n               [ check-target-builds ../config//has_tommath : : <build>no ]\n              : test_numeric_limits_tommath ]\n\n      [ run test_numeric_limits.cpp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_CPP_INT\n              : test_numeric_limits_cpp_int ]\n\n      [ run test_numeric_limits.cpp mpfi mpfr gmp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_MPFI_50\n               [ check-target-builds ../config//has_mpfi : : <build>no ]\n              : test_numeric_limits_mpfi_50 ]\n\n      [ run test_numeric_limits.cpp quadmath no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_FLOAT128\n               [ check-target-builds ../config//has_float128 : : <build>no ]\n              : test_numeric_limits_float128 ]\n      [ run test_numeric_limits.cpp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_FLOAT128\n               [ check-target-builds ../config//has_intel_quad : <cxxflags>-Qoption,cpp,--extended_float_type : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ]\n              : test_numeric_limits_intel_quad ]\n\n      [ run test_sf_import_c99.cpp : : : <define>TEST_CPP_DEC_FLOAT_2 : test_sf_import_c99_cpp_dec_float_2 ]\n      [ run test_sf_import_c99.cpp : : : <define>TEST_CPP_DEC_FLOAT_3 : test_sf_import_c99_cpp_dec_float_3 ]\n      [ run test_sf_import_c99.cpp : : : <define>TEST_CPP_DEC_FLOAT_4 : test_sf_import_c99_cpp_dec_float_4 ]\n      [ run test_sf_import_c99.cpp : : : <define>TEST_CPP_DEC_FLOAT_5 : test_sf_import_c99_cpp_dec_float_5 ]\n      [ run test_sf_import_c99.cpp : : : <define>TEST_CPP_DEC_FLOAT_6 : test_sf_import_c99_cpp_dec_float_6 ]\n\n      [ run test_sf_import_c99.cpp : : : <define>TEST_CPP_BIN_FLOAT_2 : test_sf_import_c99_cpp_bin_float_2 ]\n      [ run test_sf_import_c99.cpp : : : <define>TEST_CPP_BIN_FLOAT_2 : test_sf_import_c99_cpp_bin_float_3 ]\n\n      [ run test_sf_import_c99.cpp mpfi mpfr gmp : : : <define>TEST_MPFI_DEBUG_ADAPTOR [ check-target-builds ../config//has_mpfi : : <build>no ] : test_sf_import_c99_mpfi_debug_adptr  ]\n      [ run test_sf_import_c99.cpp mpfr gmp : : : <define>TEST_MPFR_DEBUG_ADAPTOR [ check-target-builds ../config//has_mpfr : : <build>no ] : test_sf_import_c99_mpfr_debug_adptr  ]\n\n      [ run test_sf_import_c99.cpp mpfi mpfr gmp : : : <define>TEST_MPFI_LOGGED_ADAPTOR [ check-target-builds ../config//has_mpfi : : <build>no ] : test_sf_import_c99_mpfi_logged_adptr  ]\n      [ run test_sf_import_c99.cpp mpfr gmp : : : <define>TEST_MPFR_LOGGED_ADAPTOR [ check-target-builds ../config//has_mpfr : : <build>no ] : test_sf_import_c99_mpfr_logged_adptr  ]\n\n      [ run test_move.cpp mpfr gmp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_MPFR\n               [ check-target-builds ../config//has_mpfr : : <build>no ]\n              : test_move_mpfr ]\n\n      [ run test_move.cpp mpc mpfr gmp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_MPC\n               [ check-target-builds ../config//has_mpc : : <build>no ]\n              : test_move_mpc ]\n\n      [ run test_move.cpp gmp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_GMP\n               [ check-target-builds ../config//has_gmp : : <build>no ]\n              : test_move_gmp ]\n\n      [ run test_move.cpp $(TOMMATH) no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_TOMMATH\n               [ check-target-builds ../config//has_tommath : : <build>no ]\n              : test_move_tommath ]\n\n      [ run test_move.cpp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_CPP_INT\n              : test_move_cpp_int ]\n\n      [ run test_sin_near_half_pi.cpp mpfr gmp : : : <define>TEST_CPP_BIN_FLOAT release [ check-target-builds ../config//has_float128 : <source>quadmath : ] [ check-target-builds ../config//has_mpfr : : <build>no ] : test_sin_near_half_pi_cpp_bin_float ]\n      [ run test_sin_near_half_pi.cpp mpfr gmp : : : <define>TEST_CPP_DEC_FLOAT release [ check-target-builds ../config//has_mpfr : : <build>no ] : test_sin_near_half_pi_cpp_dec_float ]\n      [ run test_sin_near_half_pi.cpp mpfr gmp : : : <define>TEST_MPF_50 release [ check-target-builds ../config//has_mpfr : : <build>no ] : test_sin_near_half_pi_mpf_50 ]\n      [ run test_sin_near_half_pi.cpp mpfr gmp : : : <define>TEST_MPFR_50 release [ check-target-builds ../config//has_mpfr : : <build>no ] : test_sin_near_half_pi_mpfr_50 ]\n      [ run test_sin_near_half_pi.cpp mpfr gmp quadmath : : : <define>TEST_FLOAT128 release [ check-target-builds ../config//has_mpfr : : <build>no ] [ check-target-builds ../config//has_float128 : : <build>no ] : test_sin_near_half_pi_float128 ]\n      [ run test_cos_near_half_pi.cpp mpfr gmp : : : <define>TEST_CPP_BIN_FLOAT release [ check-target-builds ../config//has_float128 : <source>quadmath : ] [ check-target-builds ../config//has_mpfr : : <build>no ] : test_cos_near_half_pi_cpp_bin_float ]\n      [ run test_cos_near_half_pi.cpp mpfr gmp : : : <define>TEST_CPP_DEC_FLOAT release [ check-target-builds ../config//has_mpfr : : <build>no ] : test_cos_near_half_pi_cpp_dec_float ]\n      [ run test_cos_near_half_pi.cpp mpfr gmp : : : <define>TEST_MPF_50 release [ check-target-builds ../config//has_mpfr : : <build>no ] : test_cos_near_half_pi_mpf_50 ]\n      [ run test_cos_near_half_pi.cpp mpfr gmp : : : <define>TEST_MPFR_50 release [ check-target-builds ../config//has_mpfr : : <build>no ] : test_cos_near_half_pi_mpfr_50 ]\n      [ run test_cos_near_half_pi.cpp mpfr gmp quadmath : : : <define>TEST_FLOAT128 release [ check-target-builds ../config//has_mpfr : : <build>no ] [ check-target-builds ../config//has_float128 : : <build>no ] : test_cos_near_half_pi_float128 ]\n\n      [ run test_cpp_bin_float_tgamma.cpp ]\n      [ run test_cpp_dec_float_tgamma.cpp ]\n\n      [ run test_roots_10k_digits.cpp\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_CPP_DEC_FLOAT\n              : test_roots_10k_digits_cpp_dec_float ]\n\n      [ run test_roots_10k_digits.cpp\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_CPP_BIN_FLOAT\n              : test_roots_10k_digits_cpp_bin_float ]\n\n      [ get_function_tests ]\n;\n\ntest-suite conversions :\n\n   [ run test_gmp_conversions.cpp gmp no_eh_support\n           : # command line\n           : # input files\n           : # requirements\n            [ check-target-builds ../config//has_gmp : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath : ] ]\n\n   [ run test_mpfr_conversions.cpp gmp mpfr no_eh_support\n           : # command line\n           : # input files\n           : # requirements\n            [ check-target-builds ../config//has_mpfr : : <build>no ] ]\n\n   [ run test_mpc_conversions.cpp gmp mpfr mpc no_eh_support\n           : # command line\n           : # input files\n           : # requirements\n            [ check-target-builds ../config//has_mpc : : <build>no ] ]\n\n   [ run test_constants.cpp gmp no_eh_support\n           : # command line\n           : # input files\n           : # requirements\n           <define>TEST_MPF_50\n            [ check-target-builds ../config//has_gmp : : <build>no ]\n           : test_constants_mpf50 ]\n\n   [ run test_constants.cpp mpfr gmp no_eh_support\n           : # command line\n           : # input files\n           : # requirements\n           <define>TEST_MPFR_50\n            [ check-target-builds ../config//has_mpfr : : <build>no ]\n           : test_constants_mpfr_50 ]\n\n   [ run test_constants.cpp no_eh_support\n           : # command line\n           : # input files\n           : # requirements\n           <define>TEST_CPP_DEC_FLOAT\n           : test_constants_cpp_dec_float ]\n\n\n   [ run test_test.cpp ]\n   [ run test_cpp_int_lit.cpp no_eh_support ]\n   [ run test_convert_cpp_int_2_float.cpp no_eh_support ]\n\n      #\n      # Interconversion tests:\n      #\n      [ run test_convert_from_cpp_int.cpp\n              : # command line\n              : # input files\n              : # requirements\n              [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ]\n              [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ]\n              [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ]\n              [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ]\n               [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] \n              ]\n      [ run test_convert_from_mpz_int.cpp\n              : # command line\n              : # input files\n              : # requirements\n              [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ]\n              [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ]\n              [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ]\n              [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ]\n               [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] \n              ]\n      [ run test_convert_from_tom_int.cpp\n              : # command line\n              : # input files\n              : # requirements\n              [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ]\n              [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ]\n              [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ]\n              [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ]\n               [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] \n              ]\n      [ run test_convert_from_cpp_rational.cpp\n              : # command line\n              : # input files\n              : # requirements\n              [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ]\n              [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ]\n              [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ]\n              [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ]\n               [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] \n              ]\n      [ run test_convert_from_gmp_rational.cpp\n              : # command line\n              : # input files\n              : # requirements\n              [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ]\n              [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ]\n              [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ]\n              [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ]\n               [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] \n              ]\n      [ run test_convert_from_tom_rational.cpp\n              : # command line\n              : # input files\n              : # requirements\n              [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ]\n              [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ]\n              [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ]\n              [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ]\n               [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] \n              ]\n      [ run test_convert_from_cpp_bin_float.cpp\n              : # command line\n              : # input files\n              : # requirements\n              [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ]\n              [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ]\n              [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ]\n              [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ]\n               [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] \n              ]\n      [ run test_convert_from_cpp_dec_float.cpp\n              : # command line\n              : # input files\n              : # requirements\n              [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ]\n              [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ]\n              [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ]\n              [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ]\n               [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] \n              ]\n      [ run test_convert_from_mpf_float.cpp\n              : # command line\n              : # input files\n              : # requirements\n              [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ]\n              [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ]\n              [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ]\n              [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ]\n               [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] \n              ]\n      [ run test_convert_from_mpfr_float.cpp\n              : # command line\n              : # input files\n              : # requirements\n              [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ]\n              [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ]\n              [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ]\n              [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ]\n               [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] \n              ]\n      [ run test_convert_from_mpfi_float.cpp\n              : # command line\n              : # input files\n              : # requirements\n              [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ]\n              [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ]\n              [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ]\n              [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ]\n               [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] \n              ]\n      [ run test_convert_from_float128.cpp\n              : # command line\n              : # input files\n              : # requirements\n              [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ]\n              [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ]\n              [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ]\n              [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ]\n               [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] \n              ]\n\n      [ run test_cpp_bin_float_conv.cpp ]\n\n      [ run test_cpp_bin_float_io.cpp no_eh_support /boost/system//boost_system /boost/chrono//boost_chrono\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_CPP_BIN_FLOAT\n               <define>TEST1\n               release # Otherwise [ runtime is slow\n              : test_cpp_bin_float_io_1\n              ]\n\n      [ run test_cpp_bin_float_io.cpp no_eh_support /boost/system//boost_system /boost/chrono//boost_chrono\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_CPP_BIN_FLOAT\n               <define>TEST2\n               release # Otherwise [ runtime is slow\n              : test_cpp_bin_float_io_2\n              ]\n\n      [ run test_cpp_bin_float.cpp no_eh_support mpfr gmp /boost/system//boost_system /boost/chrono//boost_chrono\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_MPFR\n               [ check-target-builds ../config//is_ci_sanitizer_run \"Sanitizer CI run\" : <build>no : ]\n               [ check-target-builds ../config//has_mpfr : : <build>no ]\n               release # Otherwise [ runtime is slow\n              ]\n\n      [ run test_float_io.cpp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_CPP_DEC_FLOAT\n               release # Otherwise [ runtime is slow\n              : test_float_io_cpp_dec_float ]\n\n      [ run test_float_io.cpp gmp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_MPF_50\n               release # Otherwise [ runtime is slow\n               [ check-target-builds ../config//has_gmp : : <build>no ]\n              : test_float_io_mpf ]\n\n      [ run test_float_io.cpp mpfr gmp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_MPFR_50\n               release # Otherwise [ runtime is slow\n               [ check-target-builds ../config//has_mpfr : : <build>no ]\n              : test_float_io_mpfr ]\n\n      [ run test_float_io.cpp mpfi mpfr gmp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_MPFI_50\n               release # Otherwise [ runtime is slow\n               [ check-target-builds ../config//has_mpfi : : <build>no ]\n              : test_float_io_mpfi ]\n\n      [ run test_float_io.cpp quadmath no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_FLOAT128\n               release # Otherwise [ runtime is slow\n               [ check-target-builds ../config//has_float128 : : <build>no ]\n              : test_float_io_float128 ]\n      [ run test_float_io.cpp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_FLOAT128\n               release # Otherwise [ runtime is slow\n               [ check-target-builds ../config//has_intel_quad : <cxxflags>-Qoption,cpp,--extended_float_type : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ]\n              : test_float_io_intel_quad ]\n\n      [ run test_int_io.cpp no_eh_support $(TOMMATH)\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_TOMMATH\n               release # Otherwise [ runtime is slow\n               [ check-target-builds ../config//has_tommath : : <build>no ]\n              : test_int_io_tommath ]\n\n      [ run test_int_io.cpp no_eh_support gmp\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_MPZ\n               release # Otherwise [ runtime is slow\n               [ check-target-builds ../config//has_gmp : : <build>no ]\n              : test_int_io_mpz ]\n\n      [ run test_fixed_zero_precision_io.cpp \n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_BIN_FLOAT\n               release\n              : test_fixed_zero_precision_io_bin_float ]\n      [ run test_fixed_zero_precision_io.cpp \n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_DEC_FLOAT\n               release\n              : test_fixed_zero_precision_io_dec_float ]\n      [ run test_fixed_zero_precision_io.cpp no_eh_support gmp\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_MPF\n               release\n               [ check-target-builds ../config//has_gmp : : <build>no ]\n              : test_fixed_zero_precision_io_mpf_float ]\n      [ run test_fixed_zero_precision_io.cpp no_eh_support mpfr gmp\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_MPFR\n               release\n               [ check-target-builds ../config//has_mpfr : : <build>no ]\n              : test_fixed_zero_precision_io_mpfr_float ]\n      [ run test_fixed_zero_precision_io.cpp no_eh_support quadmath\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_FLOAT128\n               release\n               [ check-target-builds ../config//has_float128 : : <build>no ]\n              : test_fixed_zero_precision_io_float128 ]\n\n      [ run test_trailing_io_delim.cpp no_eh_support \n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_CPP_INT\n              : test_trailing_io_delim_cpp ]\n      [ run test_trailing_io_delim.cpp no_eh_support gmp\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_GMP\n              [ check-target-builds ../config//has_gmp : : <build>no ]\n              : test_trailing_io_delim_gmp ]\n      [ run test_trailing_io_delim.cpp no_eh_support tommath\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_TOMMATH\n              [ check-target-builds ../config//has_tommath : : <build>no ]\n              : test_trailing_io_delim_tommath ]\n      [ run test_trailing_io_delim.cpp no_eh_support quadmath\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_FLOAT128\n              [ check-target-builds ../config//has_float128 : : <build>no ]\n              : test_trailing_io_delim_float128 ]\n      [ run test_trailing_io_delim.cpp no_eh_support mpc mpfr gmp\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_MPC\n              [ check-target-builds ../config//has_mpc : : <build>no ]\n              : test_trailing_io_delim_mpc ]\n      [ run test_trailing_io_delim.cpp no_eh_support mpfi mpfr gmp\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_MPFI\n              [ check-target-builds ../config//has_mpfi : : <build>no ]\n              : test_trailing_io_delim_mpfi ]\n;\n\n\ntest-suite cpp_int_tests :\n\n      [ run test_int_io.cpp no_eh_support\n           : # command line\n           : # input files\n           : # requirements\n           <define>TEST_CPP_INT\n            release # Otherwise    [ runtime is slow\n           : test_int_io_cpp_int ]\n\n      [ run test_cpp_int_left_shift.cpp gmp no_eh_support\n           : # command line\n           : # input files\n           : # requirements\n            [ check-target-builds ../config//has_gmp : : <build>no ]\n            release  # otherwise    [ runtime is too slow!!\n            ]\n\n      [ run test_cpp_int.cpp gmp no_eh_support\n           : # command line\n           : # input files\n           : # requirements\n            [ check-target-builds ../config//has_gmp : : <build>no ]\n            release  # otherwise    [ runtime is too slow!!\n            <define>TEST1\n            : test_cpp_int_1\n            ]\n\n      [ run test_cpp_int.cpp gmp no_eh_support\n           : # command line\n           : # input files\n           : # requirements\n            [ check-target-builds ../config//has_gmp : : <build>no ]\n            release  # otherwise    [ runtime is too slow!!\n            <define>TEST2\n            : test_cpp_int_2\n            ]\n\n      [ run test_cpp_int.cpp gmp no_eh_support\n           : # command line\n           : # input files\n           : # requirements\n            [ check-target-builds ../config//has_gmp : : <build>no ]\n            release  # otherwise    [ runtime is too slow!!\n            <define>TEST3\n            : test_cpp_int_3\n            ]\n\n      [ run test_cpp_int.cpp gmp no_eh_support\n           : # command line\n           : # input files\n           : # requirements\n            [ check-target-builds ../config//has_gmp : : <build>no ]\n            release  # otherwise    [ runtime is too slow!!\n            <define>TEST4\n            : test_cpp_int_4\n            ]\n\n      [ run test_cpp_int.cpp gmp no_eh_support\n           : # command line\n           : # input files\n           : # requirements\n            [ check-target-builds ../config//has_gmp : : <build>no ]\n            release  # otherwise    [ runtime is too slow!!\n            <define>TEST5\n            : test_cpp_int_5\n            ]\n\n      [ run test_cpp_int.cpp gmp no_eh_support\n           : # command line\n           : # input files\n           : # requirements\n            [ check-target-builds ../config//has_gmp : : <build>no ]\n            release  # otherwise    [ runtime is too slow!!\n            <define>TEST6\n            : test_cpp_int_6\n            ]\n\n      [ run test_cpp_rational.cpp gmp no_eh_support\n           : # command line\n           : # input files\n           : # requirements\n            [ check-target-builds ../config//has_gmp : : <build>no ]\n            release  # otherwise    [ runtime is too slow!!\n            ]\n\n      [ run test_cpp_int_karatsuba.cpp gmp no_eh_support\n           : # command line\n           : # input files\n           : # requirements\n            [ check-target-builds ../config//has_gmp : : <build>no ]\n            release  # otherwise    [ runtime is too slow!!\n            <define>TEST=1\n            : test_cpp_int_karatsuba_1\n            ]\n      [ run test_cpp_int_karatsuba.cpp gmp no_eh_support\n           : # command line\n           : # input files\n           : # requirements\n            [ check-target-builds ../config//has_gmp : : <build>no ]\n            release  # otherwise    [ runtime is too slow!!\n            <define>TEST=2\n            : test_cpp_int_karatsuba_2\n            ]\n      [ run test_cpp_int_karatsuba.cpp gmp no_eh_support\n           : # command line\n           : # input files\n           : # requirements\n            [ check-target-builds ../config//has_gmp : : <build>no ]\n            release  # otherwise    [ runtime is too slow!!\n            <define>TEST=3\n            : test_cpp_int_karatsuba_3\n            ]\n      [ run test_cpp_int_karatsuba.cpp gmp no_eh_support\n           : # command line\n           : # input files\n           : # requirements\n            [ check-target-builds ../config//has_gmp : : <build>no ]\n            release  # otherwise    [ runtime is too slow!!\n            <define>TEST=4\n            : test_cpp_int_karatsuba_4\n            ]\n\n      [ run test_int_sqrt.cpp no_eh_support ]\n\n      [ run test_checked_cpp_int.cpp no_eh_support ]\n      [ run test_unchecked_cpp_int.cpp no_eh_support : : : release ]\n\n      [ run test_cpp_int_serial.cpp ../../serialization/build//boost_serialization : : : release <define>TEST1 <toolset>gcc-mingw:<link>static : test_cpp_int_serial_1 ]\n      [ run test_cpp_int_serial.cpp ../../serialization/build//boost_serialization : : : release <define>TEST2 <toolset>gcc-mingw:<link>static : test_cpp_int_serial_2 ]\n      [ run test_cpp_int_serial.cpp ../../serialization/build//boost_serialization : : : release <define>TEST3 <toolset>gcc-mingw:<link>static : test_cpp_int_serial_3 ]\n      [ run test_cpp_int_serial.cpp ../../serialization/build//boost_serialization : : : release <define>TEST4 <toolset>gcc-mingw:<link>static : test_cpp_int_serial_4 ]\n      [ run test_cpp_int_deserial.cpp ../../serialization/build//boost_serialization ../../filesystem/build//boost_filesystem : $(here)/serial_txts : : release <toolset>gcc-mingw:<link>static  ]\n      [ run test_cpp_rat_serial.cpp ../../serialization/build//boost_serialization : : : release <toolset>gcc-mingw:<link>static  ]\n      [ run test_gcd.cpp : : : [ requires cxx11_hdr_random ] ]\n;\n\ntest-suite misc :\n\n      [ compile test_constexpr.cpp : \n         [ check-target-builds ../config//has_float128 : <define>HAVE_FLOAT128 : ] \n         [ check-target-builds ../config//has_intel_quad : <cxxflags>-Qoption,cpp,--extended_float_type <define>HAVE_FLOAT128 : ] \n         [ requires cxx11_constexpr cxx11_user_defined_literals ] ]\n\n      [ compile constexpr_test_arithmetic_backend.cpp : \n         [ requires cxx14_constexpr cxx17_if_constexpr ] ]\n      [ compile constexpr_test_float128.cpp : \n         [ requires cxx14_constexpr cxx17_if_constexpr ] [ check-target-builds ../config//has_float128 : <source>quadmath : <build>no ] ]\n\n      [ run constexpr_test_cpp_int.cpp : : : [ requires cxx14_constexpr cxx17_if_constexpr ] [ check-target-builds ../config//has_is_constant_evaluated : : <build>no ] ]\n      [ run constexpr_test_cpp_int_2.cpp : : : [ requires cxx14_constexpr cxx17_if_constexpr ] [ check-target-builds ../config//has_is_constant_evaluated : : <build>no ] ]\n      [ run constexpr_test_cpp_int_3.cpp : : : [ requires cxx14_constexpr cxx17_if_constexpr ] [ check-target-builds ../config//has_is_constant_evaluated : : <build>no ] ]\n      [ run constexpr_test_cpp_int_4.cpp : : : [ requires cxx14_constexpr cxx17_if_constexpr ] [ check-target-builds ../config//has_is_constant_evaluated : : <build>no ] ]\n      [ run constexpr_test_cpp_int_5.cpp : : : [ requires cxx14_constexpr cxx17_if_constexpr ] [ check-target-builds ../config//has_is_constant_evaluated : : <build>no ] ]\n      [ run constexpr_test_cpp_int_6.cpp : : : [ requires cxx14_constexpr cxx17_if_constexpr ] [ check-target-builds ../config//has_is_constant_evaluated : <toolset>msvc:<cxxflags>-constexpr:steps10000000 <toolset>clang:<cxxflags>-fconstexpr-steps=268435456 : <build>no ] [ check-target-builds ../config//has_constexpr_limits : <cxxflags>-fconstexpr-ops-limit=268435456 ] ]\n      [ run constexpr_test_cpp_int_7.cpp : : : [ requires cxx14_constexpr cxx17_if_constexpr ] [ check-target-builds ../config//has_is_constant_evaluated : <toolset>msvc:<cxxflags>-constexpr:steps10000000 <toolset>clang:<cxxflags>-fconstexpr-steps=268435456 : <build>no ] ]\n\n      [ compile test_nothrow_cpp_int.cpp ]\n      [ compile test_nothrow_cpp_rational.cpp ]\n      [ compile test_nothrow_cpp_bin_float.cpp ]\n      [ compile test_nothrow_cpp_dec_float.cpp ]\n      [ compile test_nothrow_float128.cpp : [ check-target-builds ../config//has_float128 : : <build>no ] ]\n      [ compile test_nothrow_gmp.cpp : [ check-target-builds ../config//has_gmp : : <build>no ] ]\n      [ compile test_nothrow_mpfr.cpp : [ check-target-builds ../config//has_mpfr : : <build>no ] ]\n\n      [ run test_miller_rabin.cpp no_eh_support gmp\n              : # command line\n              : # input files\n              : # requirements\n               [ check-target-builds ../config//has_gmp : : <build>no ]\n               release  # otherwise [ runtime is too slow!!\n               ]\n\n      [ run test_rational_io.cpp $(TOMMATH) no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_TOMMATH\n               [ check-target-builds ../config//has_tommath : : <build>no ]\n               release # Otherwise [ runtime is slow\n              : test_rational_io_tommath ]\n\n      [ run test_rational_io.cpp gmp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_MPQ\n               [ check-target-builds ../config//has_gmp : : <build>no ]\n               release # Otherwise [ runtime is slow\n              : test_rational_io_mpz ]\n\n      [ run test_rational_io.cpp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST_CPP_INT\n               release # Otherwise [ runtime is slow\n              : test_rational_io_cpp_int ]\n\n      [ run test_generic_conv.cpp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n               [ check-target-builds ../config//has_gmp : <define>TEST_GMP <source>gmp :  ]\n               [ check-target-builds ../config//has_tommath : <define>TEST_TOMMATH <source>$(TOMMATH) :  ]\n               [ check-target-builds ../config//has_mpfr : <define>TEST_MPFR <source>mpfr :  ]\n               release # Otherwise [ runtime is slow\n               ]\n\n      [ run test_rat_float_interconv.cpp no_eh_support /boost/system//boost_system /boost/chrono//boost_chrono\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST1\n              release \n              : test_rat_float_interconv_1 ]\n\n      [ run test_rat_float_interconv.cpp no_eh_support /boost/system//boost_system /boost/chrono//boost_chrono\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST2\n              release \n              : test_rat_float_interconv_2 ]\n\n      [ run test_rat_float_interconv.cpp no_eh_support /boost/system//boost_system /boost/chrono//boost_chrono\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST3\n              release \n              : test_rat_float_interconv_3 ]\n\n      [ run test_rat_float_interconv.cpp no_eh_support /boost/system//boost_system /boost/chrono//boost_chrono\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST4\n              release \n              : test_rat_float_interconv_4 ]\n\n      [ run test_rat_float_interconv.cpp no_eh_support /boost/system//boost_system /boost/chrono//boost_chrono mpfr gmp\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST5\n              [ check-target-builds ../config//has_mpfr : : <build>no ]\n              release \n              : test_rat_float_interconv_5 ]\n\n      [ run test_rat_float_interconv.cpp no_eh_support /boost/system//boost_system /boost/chrono//boost_chrono mpfr gmp\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST6\n              [ check-target-builds ../config//has_mpfr : : <build>no ]\n              release \n              : test_rat_float_interconv_6 ]\n\n      [ run test_rat_float_interconv.cpp no_eh_support /boost/system//boost_system /boost/chrono//boost_chrono mpfr gmp\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST7\n              [ check-target-builds ../config//has_mpfr : : <build>no ]\n              release \n              : test_rat_float_interconv_7 ]\n\n      [ run test_rat_float_interconv.cpp no_eh_support /boost/system//boost_system /boost/chrono//boost_chrono mpfr gmp\n              : # command line\n              : # input files\n              : # requirements\n              <define>TEST8\n              [ check-target-builds ../config//has_mpfr : : <build>no ]\n              release \n              : test_rat_float_interconv_8 ]\n\n      [ run test_cpp_int_conv.cpp no_eh_support ]\n      [ run test_cpp_int_import_export.cpp no_eh_support ]\n      [ run test_native_integer.cpp no_eh_support ]\n\n      [ run test_mixed_move_cpp_int.cpp no_eh_support ]\n      [ run test_mixed_cpp_int.cpp no_eh_support ]\n      [ run test_mixed_float.cpp no_eh_support\n              : # command line\n              : # input files\n              : # requirements\n               [ check-target-builds ../config//has_gmp : <define>TEST_GMP <library>gmp : ]\n               [ check-target-builds ../config//has_mpfr : <define>TEST_MPFR <library>mpfr <library>gmp : ] ]\n      [ compile include_test/mpfr_include_test.cpp\n                    : # requirements\n                     [ check-target-builds ../config//has_mpfr : : <build>no ] ]\n      [ compile include_test/gmp_include_test.cpp\n                    : # requirements\n                     [ check-target-builds ../config//has_gmp : : <build>no ] ]\n      [ compile include_test/tommath_include_test.cpp\n                    : # requirements\n                     [ check-target-builds ../config//has_tommath : : <build>no ] ]\n      [ compile include_test/cpp_int_include_test.cpp ]\n      [ compile include_test/cpp_dec_float_include_test.cpp ]\n      [ compile include_test/cpp_bin_float_include_test.cpp ]\n\n      [ run ublas_interop/test1.cpp ublas_interop/test11.cpp ublas_interop/test12.cpp ublas_interop/test13.cpp no_eh_support ]\n      [ run ublas_interop/test2.cpp ublas_interop/test21.cpp ublas_interop/test22.cpp ublas_interop/test23.cpp no_eh_support ]\n      #[ run ublas_interop/test3.cpp ublas_interop/test31.cpp ublas_interop/test32.cpp ublas_interop/test33.cpp ]\n      [ run ublas_interop/test4.cpp ublas_interop/test42.cpp ublas_interop/test43.cpp no_eh_support ]\n      [ run ublas_interop/test5.cpp ublas_interop/test52.cpp ublas_interop/test53.cpp no_eh_support ]\n      [ run ublas_interop/test6.cpp ublas_interop/test62.cpp ublas_interop/test63.cpp no_eh_support ]\n      #[ run ublas_interop/test7.cpp ublas_interop/test71.cpp ublas_interop/test72.cpp ublas_interop/test73.cpp ]\n\n      [ run ublas_interop/test1.cpp ublas_interop/test11.cpp ublas_interop/test12.cpp ublas_interop/test13.cpp no_eh_support : : : <define>TEST_ET=1 : ublas1_et ]\n      [ run ublas_interop/test2.cpp ublas_interop/test21.cpp ublas_interop/test22.cpp ublas_interop/test23.cpp no_eh_support : : : <define>TEST_ET=1 : ublas2_et ]\n      #[ run ublas_interop/test3.cpp ublas_interop/test31.cpp ublas_interop/test32.cpp ublas_interop/test33.cpp : : : <define>TEST_ET=1 : ublas3_et ]\n      [ run ublas_interop/test4.cpp ublas_interop/test42.cpp ublas_interop/test43.cpp no_eh_support : : : <define>TEST_ET=1 : ublas3_et ]\n      [ run ublas_interop/test5.cpp ublas_interop/test52.cpp ublas_interop/test53.cpp no_eh_support : : : <define>TEST_ET=1 : ublas4_et ]\n      [ run ublas_interop/test6.cpp ublas_interop/test62.cpp ublas_interop/test63.cpp no_eh_support : : : <define>TEST_ET=1 : ublas5_et ]\n      #[ run ublas_interop/test7.cpp ublas_interop/test71.cpp ublas_interop/test72.cpp ublas_interop/test73.cpp : : : <define>TEST_ET=1 : ublas6_et ]\n\n      #\n      # Serialization tests, run in release mode so we cycle through more values:\n      #\n      [ run test_adapt_serial.cpp ../../serialization/build//boost_serialization : : : release <toolset>gcc-mingw:<link>static  ]\n      [ run test_cpp_dec_float_serial.cpp ../../serialization/build//boost_serialization : : : release <define>TEST1 <toolset>gcc-mingw:<link>static  : test_cpp_dec_float_serial_1 ]\n      [ run test_cpp_dec_float_serial.cpp ../../serialization/build//boost_serialization : : : release <define>TEST2 <toolset>gcc-mingw:<link>static  : test_cpp_dec_float_serial_2 ]\n      [ run test_float128_serial.cpp ../../serialization/build//boost_serialization quadmath : : : release <toolset>gcc-mingw:<link>static  [ check-target-builds ../config//has_float128 : : <build>no ]  ]\n      [ run test_cpp_bin_float_serial.cpp ../../serialization/build//boost_serialization : : : release <toolset>gcc-mingw:<link>static  <define>TEST1 : test_bin_dec_float_serial_1 ]\n      [ run test_cpp_bin_float_serial.cpp ../../serialization/build//boost_serialization : : : release <define>TEST2 <toolset>gcc-mingw:<link>static  : test_bin_dec_float_serial_2 ]\n\n      #\n      # Mixed mode comparison tests, see: https://svn.boost.org/trac/boost/ticket/11328\n      #\n      [ run test_checked_mixed_cpp_int.cpp no_eh_support ]\n      [ run test_mixed_cpp_bin_float.cpp no_eh_support ]\n      [ run test_mixed_cpp_dec_float.cpp no_eh_support ]\n      [ run test_mixed_mpf_float.cpp gmp no_eh_support : : : [ check-target-builds ../config//has_gmp : : <build>no ] ]\n      [ run test_mixed_mpfr_float.cpp  mpfr gmp no_eh_support : : : [ check-target-builds ../config//has_mpfr : : <build>no ] ]\n      #\n      # Check for narrowing conversions:\n      #\n      [ run test_float_conversions.cpp no_eh_support ]\n      #\n      # specific bug cases:\n      #\n      [ compile bug11922.cpp ]\n      [ run bug12039.cpp no_eh_support ]\n      [ compile git_issue_30.cpp ]\n      [ run git_issue_167.cpp ]\n      [ run git_issue_370.cpp ]\n      [ run git_issue_175.cpp ]\n      [ run git_issue_248.cpp ]\n      [ run git_issue_265.cpp : : : [ check-target-builds ../config//has_mpfr : <source>gmp <source>mpfr : <build>no ] ]\n      [ run git_issue_426.cpp : : : [ check-target-builds ../config//has_mpfr : <source>gmp <source>mpfr <define>TEST_MPFR ] [ check-target-builds ../config//has_float128 : <source>quadmath <define>TEST_FLOAT128 ] ]\n      [ run git_issue_277.cpp ]\n      [ run git_issue_313.cpp ]\n      [ run git_issue_488.cpp ]\n      [ compile git_issue_98.cpp : \n         [ check-target-builds ../config//has_float128 : <define>TEST_FLOAT128 <source>quadmath : ]\n         [ check-target-builds ../config//has_gmp : <define>TEST_GMP <source>gmp : ]\n         [ check-target-builds ../config//has_mpfr : <define>TEST_MPFR <source>gmp <source>mpfr : ]\n         [ check-target-builds ../config//has_mpc : <define>TEST_MPC <source>gmp <source>mpfr <source>mpc : ] ]\n      [ run issue_13301.cpp ]\n      [ run issue_13148.cpp ]\n      [ run test_hash.cpp : : : \n         [ check-target-builds ../config//has_float128 : <define>TEST_FLOAT128 <source>quadmath : ]\n         [ check-target-builds ../config//has_gmp : <define>TEST_GMP <source>gmp : ]\n         [ check-target-builds ../config//has_mpfr : <define>TEST_MPFR <source>gmp <source>mpfr : ]\n         [ check-target-builds ../config//has_mpfi : <define>TEST_MPFI <source>gmp <source>mpfr <source>mpfi : ]\n         [ check-target-builds ../config//has_tommath : <define>TEST_TOMMATH <source>tommath : ]\n          ]\n      [ run test_optional_compat.cpp ]\n      #\n      # Eigen interoperability:\n      #\n      [ run test_eigen_interop_cpp_int.cpp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] ]\n      [ run test_eigen_interop_cpp_dec_float.cpp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] ]\n      [ run test_eigen_interop_cpp_dec_float_2.cpp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] ]\n      [ run test_eigen_interop_cpp_dec_float_3.cpp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] ]\n      [ run test_eigen_interop_cpp_bin_float_1.cpp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] ]\n      [ run test_eigen_interop_cpp_bin_float_2.cpp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] ]\n      [ run test_eigen_interop_cpp_bin_float_3.cpp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] ]\n      [ run test_eigen_interop_mpfr_1.cpp mpfr gmp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] [ check-target-builds ../config//has_mpfr : : <build>no ] ]\n      [ run test_eigen_interop_mpfr_2.cpp mpfr gmp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] [ check-target-builds ../config//has_mpfr : : <build>no ] ]\n      [ run test_eigen_interop_mpfr_3.cpp mpfr gmp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] [ check-target-builds ../config//has_mpfr : : <build>no ] ]\n      [ run test_eigen_interop_mpfr_4.cpp mpfr gmp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] [ check-target-builds ../config//has_mpfr : : <build>no ] ]\n      [ run test_eigen_interop_mpfr_5.cpp mpfr gmp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] [ check-target-builds ../config//has_mpfr : : <build>no ] ]\n      [ run test_eigen_interop_mpfr_6.cpp mpfr gmp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] [ check-target-builds ../config//has_mpfr : : <build>no ] ]\n      [ run test_eigen_interop_gmp.cpp gmp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] [ check-target-builds ../config//has_gmp : : <build>no ] ]\n      [ run test_eigen_interop_gmp_2.cpp gmp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] [ check-target-builds ../config//has_gmp : : <build>no ] ]\n      [ run test_eigen_interop_mpc.cpp mpc mpfr gmp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] [ check-target-builds ../config//has_mpc : : <build>no ] ]\n      [ compile git_issue_393.cpp : release [ check-target-builds ../config//has_eigen : : <build>no ] ]\n;\n\nalias eigen_tests : \n    test_eigen_interop_cpp_int test_eigen_interop_cpp_dec_float test_eigen_interop_cpp_dec_float_2 test_eigen_interop_cpp_dec_float_3\n    test_eigen_interop_cpp_bin_float_1 test_eigen_interop_cpp_bin_float_2 test_eigen_interop_cpp_bin_float_3 test_eigen_interop_mpfr_1\n    test_eigen_interop_mpfr_2 test_eigen_interop_mpfr_3 test_eigen_interop_mpfr_4 test_eigen_interop_mpfr_5 test_eigen_interop_mpfr_6 \n    test_eigen_interop_gmp test_eigen_interop_gmp_2 test_eigen_interop_mpc git_issue_393 ;\n\ntest-suite standalone :\n\n      [ run standalone_constexpr_test_cpp_int.cpp : : : [ requires cxx14_constexpr cxx17_if_constexpr ] [ check-target-builds ../config//has_is_constant_evaluated : : <build>no ] ]\n      [ compile standalone_constexpr_test_float128.cpp : \n         [ requires cxx14_constexpr cxx17_if_constexpr ] [ check-target-builds ../config//has_float128 : <source>quadmath : <build>no ] ]\n      \n      [ run standalone_test_arithmetic_complex128.cpp : : : [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n      [ run standalone_test_arithmetic_cpp_bin_float.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n      [ run standalone_test_arithmetic_cpp_dec_float.cpp no_eh_support  : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n      [ run standalone_test_arithmetic_cpp_int.cpp no_eh_support : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n      [ run standalone_test_arithmetic_int512.cpp no_eh_support : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n      [ run standalone_test_arithmetic_cpp_rational.cpp no_eh_support : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n      [ run standalone_test_arithmetic_tommath.cpp $(TOMMATH) no_eh_support : : : [ check-target-builds ../config//has_tommath : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n      [ run standalone_test_arithmetic_float_128.cpp quadmath no_eh_support : : : [ check-target-builds ../config//has_float128 : : <build>no ] ]\n      [ run standalone_test_arithmetic_gmp.cpp gmp no_eh_support : : : [ check-target-builds ../config//has_gmp : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n      [ run standalone_test_arithmetic_mpf_logged_adptr.cpp gmp : : : <toolset>msvc:<cxxflags>-bigobj [ check-target-builds ../config//has_gmp : : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ]\n\n      [ run standalone_test_miller_rabin.cpp no_eh_support gmp\n                : # command line\n                : # input files\n                : # requirements\n                [ check-target-builds ../config//has_gmp : : <build>no ]\n                release  # otherwise [ runtime is too slow!!\n      ]\n\n      [ run standalone_test_convert_from_tom_int.cpp\n              : # command line\n              : # input files\n              : # requirements\n              [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ]\n              [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ]\n              [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ]\n              [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ]\n               [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] \n              ]\n;\n\n#\n# This take too long to run as a regular part of the tests:\n#\nrun test_cpp_bin_float_round.cpp mpfr gmp ;\nexplicit test_cpp_bin_float_round ;\n\nhigh_precision_points = 35 40 41 50 51 60 61 70 71 80 81 100 101 450 ;\n\nrule get_specfun_tests_mpfr\n{\n   local result ;\n   for local source in [ glob math/*.cpp ]\n   {\n      result += [ run $(source) mpfr gmp \n            /boost/test//boost_unit_test_framework/<link>static \n            math/instances//test_instances_mpfr/<link>static\n           : # command line\n           : # input files\n           : # requirements\n            [ check-target-builds ../config//has_mpfr : : <build>no ]\n            [ check-target-builds ../config//has_float128 : <source>quadmath ]\n            <define>TEST_MPFR_50\n            <optimization>speed\n            <define>BOOST_ALL_NO_LIB\n            <define>BOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE\n            <toolset>msvc:<cxxflags>-bigobj\n            <include>../../math/include_private\n            release\n           : $(source:B)_mpfr ] ;\n   }\n   for local digits in $(high_precision_points)\n   {\n      result += [ run math/high_prec/test_gamma.cpp\n            /boost/test//boost_unit_test_framework/<link>static \n           : # command line\n           : # input files\n           : # requirements\n            <optimization>speed\n            <define>BOOST_ALL_NO_LIB\n            <define>TEST_PRECISION=$(digits)\n            <toolset>msvc:<cxxflags>-bigobj\n            [ check-target-builds ../config//has_mpfr : <define>TEST_MPFR <source>gmp <source>mpfr : <build>no ]\n            [ check-target-builds ../config//has_float128 : <source>quadmath ]\n            <include>../../math/include_private\n            release\n            : test_gamma_mpfr_$(digits) ] ;\n\n   }\n   return $(result) ;\n}\n\nrule get_specfun_tests_gmp\n{\n   local result ;\n   for local source in [ glob math/*.cpp ]\n   {\n      result += [ run $(source) gmp \n            /boost/test//boost_unit_test_framework/<link>static \n            math/instances//test_instances_mpf/<link>static\n           : # command line\n           : # input files\n           : # requirements\n            [ check-target-builds ../config//has_gmp : : <build>no ]\n            [ check-target-builds ../config//has_float128 : <source>quadmath ]\n            <optimization>speed\n            <define>TEST_MPF_50\n            <define>BOOST_ALL_NO_LIB\n            <toolset>msvc:<cxxflags>-bigobj\n            <include>../../math/include_private\n            release\n           : $(source:B)_mpf ] ;\n   }\n   for local digits in $(high_precision_points)\n   {\n      result += [ run math/high_prec/test_gamma.cpp\n            /boost/test//boost_unit_test_framework/<link>static \n           : # command line\n           : # input files\n           : # requirements\n            <optimization>speed\n            <define>BOOST_ALL_NO_LIB\n            <define>TEST_PRECISION=$(digits)\n            <toolset>msvc:<cxxflags>-bigobj\n            [ check-target-builds ../config//has_gmp : <define>TEST_MPF <source>gmp : <build>no ]\n            [ check-target-builds ../config//has_float128 : <source>quadmath ]\n            <include>../../math/include_private\n            release\n            : test_gamma_gmp_$(digits) ] ;\n\n   }\n   return $(result) ;\n}\n\nrule get_specfun_tests_cpp_dec_float\n{\n   local result ;\n   for local source in [ glob math/*.cpp ]\n   {\n      result += [ run $(source) /boost/test//boost_unit_test_framework/<link>static \n               math/instances//test_instances_cpp_dec_float/<link>static\n           : # command line\n           : # input files\n           : # requirements\n            [ check-target-builds ../config//has_float128 : <source>quadmath ]\n            <define>TEST_CPP_DEC_FLOAT\n            <define>BOOST_ALL_NO_LIB\n            <toolset>msvc:<cxxflags>-bigobj\n            <include>../../math/include_private\n            release\n           : $(source:B)_cpp_dec_float ] ;\n   }\n   for local digits in $(high_precision_points)\n   {\n      result += [ run math/high_prec/test_gamma.cpp\n            /boost/test//boost_unit_test_framework/<link>static \n           : # command line\n           : # input files\n           : # requirements\n            <optimization>speed\n            <define>BOOST_ALL_NO_LIB\n            <define>TEST_PRECISION=$(digits)\n            <toolset>msvc:<cxxflags>-bigobj\n            <define>TEST_CPP_DEC_FLOAT\n            <include>../../math/include_private\n            release\n            : test_gamma_cpp_dec_float_$(digits) ] ;\n   }\n   return $(result) ;\n}\n\nrule get_specfun_tests_cpp_bin_float\n{\n   local result ;\n   for local source in [ glob math/*.cpp ]\n   {\n      result += [ run $(source) /boost/test//boost_unit_test_framework/<link>static \n               math/instances//test_instances_cpp_bin_float/<link>static\n           : # command line\n           : # input files\n           : # requirements\n            <define>TEST_CPP_BIN_FLOAT\n            <define>BOOST_ALL_NO_LIB\n            <toolset>msvc:<cxxflags>-bigobj\n            <include>../../math/include_private\n            release\n            [ check-target-builds ../config//has_float128 : <source>quadmath ]\n           : $(source:B)_cpp_bin_float ] ;\n   }\n   for local digits in $(high_precision_points)\n   {\n      result += [ run math/high_prec/test_gamma.cpp\n            /boost/test//boost_unit_test_framework/<link>static \n           : # command line\n           : # input files\n           : # requirements\n            <optimization>speed\n            <define>BOOST_ALL_NO_LIB\n            <define>TEST_PRECISION=$(digits)\n            <toolset>msvc:<cxxflags>-bigobj\n            <define>TEST_CPP_BIN_FLOAT\n            [ check-target-builds ../config//has_float128 : <source>quadmath ]\n            <include>../../math/include_private\n            release\n            : test_gamma_cpp_bin_float_$(digits) ] ;\n\n   }\n   return $(result) ;\n}\n\nrule get_specfun_tests_float128\n{\n   local result ;\n   for local source in [ glob math/*.cpp ]\n   {\n      result += [ run $(source) quadmath \n            /boost/test//boost_unit_test_framework/<link>static \n            math/instances//test_instances_float128/<link>static\n           : # command line\n           : # input files\n           : # requirements\n            [ check-target-builds ../config//has_float128 : : <build>no ]\n            <optimization>speed\n            <define>TEST_FLOAT128\n            <define>BOOST_ALL_NO_LIB\n            <define>BOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE\n            <toolset>msvc:<cxxflags>-bigobj\n            <include>../../math/include_private\n            release\n           : $(source:B)_float128 ] ;\n   }\n   return $(result) ;\n}\n\nrule get_specfun_tests_intel_quad\n{\n   local result ;\n   for local source in [ glob math/*.cpp ]\n   {\n      result += [ run $(source)\n            /boost/test//boost_unit_test_framework/<link>static \n            math/instances//test_instances_intel_quad/<link>static\n           : # command line\n           : # input files\n           : # requirements\n            [ check-target-builds ../config//has_intel_quad : <cxxflags>-Qoption,cpp,--extended_float_type : <build>no ] \n            [ check-target-builds ../config//has_float128 : <source>quadmath ]\n            <optimization>speed\n            <define>TEST_FLOAT128\n            <define>BOOST_ALL_NO_LIB\n            <define>BOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE\n            <toolset>msvc:<cxxflags>-bigobj\n            <include>../../math/include_private\n            release\n           : $(source:B)_intel_quad ] ;\n   }\n   return $(result) ;\n}\n\ntest-suite specfun_mpfr : [ get_specfun_tests_mpfr ] ;\nexplicit specfun_mpfr ;\ntest-suite specfun_gmp : [ get_specfun_tests_gmp ] ;\nexplicit specfun_gmp ;\ntest-suite specfun_cpp_dec_float : [ get_specfun_tests_cpp_dec_float ] ;\nexplicit specfun_cpp_dec_float ;\ntest-suite specfun_cpp_bin_float : [ get_specfun_tests_cpp_bin_float ] ;\nexplicit specfun_cpp_bin_float ;\ntest-suite specfun_float128 : [ get_specfun_tests_float128 ] ;\nexplicit specfun_float128 ;\ntest-suite specfun_intel_quad : [ get_specfun_tests_intel_quad ] ;\nexplicit specfun_intel_quad ;\n\ntest-suite specfun : specfun_mpfr specfun_gmp specfun_cpp_dec_float specfun_cpp_bin_float specfun_float128 specfun_intel_quad ;\nexplicit specfun ;\n\nrule get_compile_fail_tests\n{\n\n   local compile_fail_tests ;\n\n   for local source in [ glob compile_fail/*.cpp ]\n   {\n      compile_fail_tests +=  $(source:B) ;\n      compile-fail $(source)\n      :\n         [ check-target-builds ../config//has_gmp : <define>TEST_GMP <debug-symbols>off : ]\n         [ check-target-builds ../config//has_mpfr : <define>TEST_MPFR <debug-symbols>off : ]\n      ;\n   }\n   return $(compile_fail_tests) ;\n}\n\ntest-suite compile_fail :  [ get_compile_fail_tests ] ;\n\nrule get_concept_checks\n{\n   local result ;\n   for local source in [ glob concepts/*.cpp ]\n   {\n\n      result += [ compile $(source)  mpfr\n              : # requirements\n              <define>TEST_MPFR_50\n               [ check-target-builds ../config//has_mpfr : : <build>no ]\n               <debug-symbols>off\n               <optimization>space\n              : $(source:B)_mpfr_50 ] ;\n\n      result += [ compile $(source)  mpfr\n              : # requirements\n              <define>TEST_MPFR_6\n               [ check-target-builds ../config//has_mpfr : : <build>no ]\n               <debug-symbols>off\n               <optimization>space\n              : $(source:B)_mpfr_6 ] ;\n\n      result += [ compile $(source)  mpfr\n              : # requirements\n              <define>TEST_MPFR_15\n               [ check-target-builds ../config//has_mpfr : : <build>no ]\n               <debug-symbols>off\n               <optimization>space\n              : $(source:B)_mpfr_15 ] ;\n\n      result += [ compile $(source)  mpfr\n              : # requirements\n              <define>TEST_MPFR_17\n               [ check-target-builds ../config//has_mpfr : : <build>no ]\n               <debug-symbols>off\n               <optimization>space\n              : $(source:B)_mpfr_17 ] ;\n\n      result += [ compile $(source)  mpfr\n              : # requirements\n              <define>TEST_MPFR_30\n               [ check-target-builds ../config//has_mpfr : : <build>no ]\n               <debug-symbols>off\n               <optimization>space\n              : $(source:B)_mpfr_30 ] ;\n\n      result += [ compile $(source)  gmp\n              : # requirements\n              <define>TEST_MPF_50\n               [ check-target-builds ../config//has_gmp : : <build>no ]\n               <debug-symbols>off\n               <optimization>space\n              : $(source:B)_mpf50 ] ;\n\n      result += [ compile $(source)\n              : # requirements\n              <define>TEST_CPP_DEC_FLOAT\n               <debug-symbols>off\n               <optimization>space\n              : $(source:B)_cpp_dec_float ] ;\n\n      result += [ compile $(source)\n              : # requirements\n              <define>TEST_CPP_BIN_FLOAT\n               <debug-symbols>off\n               <optimization>space\n              : $(source:B)_cpp_bin_float ] ;\n\n      result += [ compile $(source)\n              : # requirements\n              <define>TEST_CPP_DEC_FLOAT_NO_ET\n               <debug-symbols>off\n               <optimization>space\n              : $(source:B)_cpp_dec_float_no_et ] ;\n\n      result += [ compile $(source)\n              : # requirements\n              <define>TEST_BACKEND\n               <debug-symbols>off\n               <optimization>space\n              : $(source:B)_backend_concept ] ;\n\n      result += [ compile $(source)\n              : # requirements\n              <define>TEST_LOGGED_ADAPTER\n               <debug-symbols>off\n               <optimization>space\n              : $(source:B)_logged_adaptor ] ;\n   }\n   return $(result) ;\n}\n\ntest-suite concepts : [ get_concept_checks ] ;\n\ntest-suite examples : ../example//examples ;\ntest-suite performance : ../performance//performance ;\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/bug11922.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2016 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <memory>\n\n#if defined(__apple_build_version__) && (__clang_major__ < 9)\n//\n// Apples clang fails with:\n// error: no matching function for call to '__implicit_conversion_to'\n// Which is nothing to do with us really...\n//\n#define DISABLE_TEST\n#endif\n\ntypedef boost::multiprecision::cpp_int mp_int;\n\n#if !defined(DISABLE_TEST)\n\nclass Int1\n{\n public:\n   Int1(const mp_int& ) {}\n   Int1(const Int1& ) {}\n};\n\nclass Int2\n{\n public:\n   Int2(const mp_int& ) {}\n   Int2(const Int2& ) = delete;\n};\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n   mp_int i(10);\n   Int1   a(i + 10);\n   Int2   b(i + 20);\n\n   std::shared_ptr<Int1> p1 = std::make_shared<Int1>(i + 10);\n   std::shared_ptr<Int2> p2 = std::make_shared<Int2>(i + 10);\n\n   return 0;\n}\n\n#else\n\nint main()\n{\n   return 0;\n}\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/bug12039.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2016 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\nint main()\n{\n   typedef boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<256> >  ext_float_t;\n   typedef boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<2046> > long_ext_float_t;\n\n   ext_float_t x = 5e15;\n   x += 0.5;\n   ext_float_t x1 = x + 255.0 / (1 << 20); // + 2^-12 - eps\n   ext_float_t x2 = x + 257.0 / (1 << 20); // + 2^-12 + eps\n   double      d1 = x1.convert_to<double>();\n   double      d2 = x2.convert_to<double>();\n\n   std::cout << std::setprecision(18) << d1 << std::endl;\n   std::cout << std::setprecision(18) << d2 << std::endl;\n\n   x        = 1e7 + 0.5;\n   x1       = x + ldexp(255.0, -38); // + 2^-30 - eps\n   x2       = x + ldexp(257.0, -38); // + 2^-30 + eps\n   float f1 = x1.convert_to<float>();\n   float f2 = x2.convert_to<float>();\n\n   std::cout << std::setprecision(9) << f1 << std::endl;\n   std::cout << std::setprecision(9) << f2 << std::endl;\n\n   long_ext_float_t lf(1);\n   lf += std::numeric_limits<long_ext_float_t>::epsilon();\n   lf += std::numeric_limits<float>::epsilon() / 2;\n   BOOST_MP_ASSERT(lf != 1);\n   float f3 = lf.convert_to<float>();\n   std::cout << std::setprecision(9) << f3 << std::endl;\n\n   return (d1 == d2) && (f1 == f2) && (f3 != 1) ? 0 : 1;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_01.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nvoid foo(cpp_int)\n{\n}\n\nint main()\n{\n   foo(2.3); // conversion from float is explicit\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_02.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i = 2;\n   i == 2.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_03.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i = 2;\n   i != 2.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_04.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i = 2;\n   i <= 2.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_05.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i = 2;\n   i >= 2.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_06.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i = 2;\n   i > 2.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_07.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i = 2;\n   i < 2.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_08.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i = 2;\n   i         = 2.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_09.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i = 2;\n   i += 2.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_10.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i = 2;\n   i -= 2.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_11.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i = 2;\n   i *= 2.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_12.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i = 2;\n   i /= 2.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_13.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i = 2;\n   i %= 2.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_14.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i = 2;\n   i |= 2.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_15.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i = 2;\n   i ^= 2.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_16.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i = 2;\n   i &= 2.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_18.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   cpp_int          i(2);\n   i = a;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_20.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   cpp_int          i(3);\n   i = a * b;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_21.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   cpp_int          i(3);\n   i += a * b;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_22.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   cpp_int          i(3);\n   i -= a * b;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_23.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   cpp_int          i(3);\n   i *= a * b;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_24.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   cpp_int          i(3);\n   i /= a * b;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_25.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   cpp_int          i(3);\n   i %= a * b;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_26.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   cpp_int          i(3);\n   i &= a * b;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_27.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   cpp_int          i(3);\n   i |= a * b;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_28.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   cpp_int          i(3);\n   i ^= a * b;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_29.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i(3), j;\n   j = i + 3.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_30.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i(3), j;\n   j = 3.3 + i;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_31.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i(3), j;\n   j = 3.3 - i;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_32.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i(3), j;\n   j = i - 3.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_33.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i(3), j;\n   j = i * 3.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_34.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i(3), j;\n   j = 3.3 * i;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_35.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i(3), j;\n   j = 3.3 / i;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_36.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i(3), j;\n   j = i / 3.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_37.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i(3), j;\n   j = i % 3.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_38.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i(3), j;\n   j = 3.3 % i;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_39.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i(3), j;\n   j = 3.3 & i;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_40.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i(3), j;\n   j = i & 3.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_41.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i(3), j;\n   j = i | 3.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_42.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i(3), j;\n   j = 3.3 | i;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_43.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i(3), j;\n   j = 3.3 ^ i;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_44.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i(3), j;\n   j = i ^ 3.3;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_45.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef TEST_GMP\n\n#include <boost/multiprecision/gmp.hpp>\n\nusing namespace boost::multiprecision;\n\nvoid foo(mpz_int i);\n\nint main()\n{\n   mpf_t f\n       foo(f);\n}\n\n#else\n\n#error \"Nothing to test without GMP!\"\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_46.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef TEST_GMP\n\n#include <boost/multiprecision/gmp.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   mpf_t   f;\n   mpz_int i;\n   i = f;\n}\n\n#else\n\n#error \"Nothing to test without GMP!\"\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_47.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef TEST_GMP\n\n#include <boost/multiprecision/gmp.hpp>\n\nusing namespace boost::multiprecision;\n\nvoid foo(mpf_float_50);\n\nint main()\n{\n   mpf_float_100 f(2);\n   foo(f);\n}\n\n#else\n\n#error \"Nothing to test without GMP!\"\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_48.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef TEST_GMP\n\n#include <boost/multiprecision/gmp.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   mpf_float_100 f(2);\n   mpf_float_50  f2;\n   f2 = f;\n}\n\n#else\n\n#error \"Nothing to test without GMP!\"\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_49.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef TEST_MPFR\n\n#include <boost/multiprecision/mpfr.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   mpfr_float_100 f(2);\n   mpfr_float_50  f2;\n   f2 = f;\n}\n\n#else\n\n#error \"Nothing to test without GMP!\"\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_50.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef TEST_MPFR\n\n#include <boost/multiprecision/mpfr.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   mpfr_float_100 f(2);\n   mpfr_float_50  f2 = f;\n}\n\n#else\n\n#error \"Nothing to test without GMP!\"\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_51.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_100 f(2);\n   cpp_dec_float_50  f2 = f;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_52.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_100 f(2);\n   cpp_dec_float_50  f2;\n   f2 = f;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_53.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   int256_t i = 3;\n   int128_t j = i;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_54.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   int256_t i = 3;\n   int128_t j;\n   j = i;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_55.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   int256_t  i = 3;\n   uint256_t j;\n   j = i;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_56.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   int256_t  i = 3;\n   uint256_t j = i;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_57.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int  i = 3;\n   int256_t j = i;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_58.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int  i = 3;\n   int256_t j;\n   j = i;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/conv_fail_59.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_int i(1), j(3);\n   void*   p = i * j;\n   (void)p; // warning suppression.\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/cpp_int_complement.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   checked_int256_t i;\n   i = ~i;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/cpp_int_negate_1.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   checked_uint256_t i;\n   i = -i;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/cpp_int_negate_2.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   number<cpp_int_backend<32, 32, unsigned_magnitude>, et_on> i;\n   i = -i;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/operator_fail_01.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   number<cpp_dec_float<50>, et_on>  a(2);\n   number<cpp_dec_float<50>, et_off> b(2);\n\n   a = a + b;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/operator_fail_02.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2);\n   cpp_int          b(2);\n\n   a = a + b;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/operator_fail_03.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   auto             x = a + b;\n   ++x;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/operator_fail_04.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   auto             x = a + b;\n   x++;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/operator_fail_05.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   auto             x = a + b;\n   x--;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/operator_fail_06.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   auto             x = a + b;\n   --x;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/operator_fail_07.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   auto             x = a + b;\n   x += a;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/operator_fail_08.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   auto             x = a + b;\n   x -= a;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/operator_fail_09.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   auto             x = a + b;\n   x *= a;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/operator_fail_10.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   auto             x = a + b;\n   x /= a;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/operator_fail_11.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   auto             x = a + b;\n   x %= a;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/operator_fail_12.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   auto             x = a + b;\n   x |= a;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/operator_fail_13.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   auto             x = a + b;\n   x &= a;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/operator_fail_14.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   auto             x = a + b;\n   x ^= a;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/operator_fail_15.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   auto             x = a + b;\n   x >>= 2;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/operator_fail_16.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   auto             x = a + b;\n   x <<= 2;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/operator_fail_17.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   auto             x = a + b;\n   x                  = 2;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/compile_fail/operator_fail_18.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float_50 a(2), b(3);\n   auto             x = a + b;\n   x                  = a;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/concepts/number_concept_check.cpp",
    "content": "//  Copyright John Maddock 2011.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//\n// This tests that cpp_dec_float_50 meets our\n// conceptual requirements.\n//\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#pragma warning(disable : 4800)\n#pragma warning(disable : 4512)\n#pragma warning(disable : 4127)\n#pragma warning(disable : 4512)\n#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated\n#endif\n\n#include <boost/container_hash/hash.hpp>\n#include <libs/math/test/compile_test/poison.hpp>\n\n#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET) && !defined(TEST_LOGGED_ADAPTER) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n#define TEST_BACKEND\n#define TEST_MPZ\n#define TEST_MPFR_50\n#define TEST_MPFR_6\n#define TEST_MPFR_15\n#define TEST_MPFR_17\n#define TEST_MPFR_30\n#define TEST_CPP_DEC_FLOAT\n#define TEST_CPP_DEC_FLOAT_NO_ET\n#define TEST_LOGGED_ADAPTER\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50) || defined(TEST_MPZ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET) || defined(TEST_LOGGED_ADAPTER)\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#if defined(TEST_CPP_BIN_FLOAT)\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#ifdef TEST_LOGGED_ADAPTER\n#include <boost/multiprecision/logged_adaptor.hpp>\n#endif\n\n#include <boost/math/concepts/real_type_concept.hpp>\n\ntemplate <class T>\nvoid test_extra(T)\n{\n   T t = 1;\n   t   = abs(t);\n   t   = abs(t * t);\n\n   t = fabs(t);\n   t = fabs(t * t);\n\n   t = sqrt(t);\n   t = sqrt(t * t);\n\n   t = floor(t);\n   t = floor(t * t);\n\n   t = ceil(t);\n   t = ceil(t * t);\n\n   t = trunc(t);\n   t = trunc(t * t);\n\n   t = round(t);\n   t = round(t * t);\n\n   t = exp(t);\n   t = exp(t * t);\n\n   t = log(t);\n   t = log(t * t);\n\n   t = log10(t);\n   t = log10(t * t);\n\n   t = cos(t);\n   t = cos(t * t);\n\n   t = sin(t);\n   t = sin(t * t);\n\n   t = tan(t);\n   t = tan(t * t);\n\n   t = asin(t);\n   t = asin(t * t);\n\n   t = atan(t);\n   t = atan(t * t);\n\n   t = acos(t);\n   t = acos(t * t);\n\n   t = cosh(t);\n   t = cosh(t * t);\n\n   t = sinh(t);\n   t = sinh(t * t);\n\n   t = tanh(t);\n   t = tanh(t * t);\n\n   double dval = 2;\n   t           = pow(t, t);\n   t           = pow(t, t * t);\n   t           = pow(t, dval);\n   t           = pow(t * t, t);\n   t           = pow(t * t, t * t);\n   t           = pow(t * t, dval);\n   t           = pow(dval, t);\n   t           = pow(dval, t * t);\n\n   t = atan2(t, t);\n   t = atan2(t, t * t);\n   t = atan2(t, dval);\n   t = atan2(t * t, t);\n   t = atan2(t * t, t * t);\n   t = atan2(t * t, dval);\n   t = atan2(dval, t);\n   t = atan2(dval, t * t);\n\n   t = fmod(t, t);\n   t = fmod(t, t * t);\n   t = fmod(t, dval);\n   t = fmod(t * t, t);\n   t = fmod(t * t, t * t);\n   t = fmod(t * t, dval);\n   t = fmod(dval, t);\n   t = fmod(dval, t * t);\n\n   typedef typename T::backend_type             backend_type;\n   typedef typename backend_type::exponent_type exp_type;\n   exp_type                                     e = 0;\n   int                                          i = 0;\n\n   t = ldexp(t, i);\n   t = ldexp(t * t, i);\n   t = ldexp(t, e);\n   t = ldexp(t * t, e);\n\n   t = frexp(t, &i);\n   t = frexp(t * t, &i);\n   t = frexp(t, &e);\n   t = frexp(t * t, &e);\n\n   t = scalbn(t, i);\n   t = scalbn(t * t, i);\n   t = scalbn(t, e);\n   t = scalbn(t * t, e);\n\n   t = logb(t);\n   t = logb(t * t);\n   e = ilogb(t);\n   e = ilogb(t * t);\n}\n\nvoid foo()\n{\n#ifdef TEST_BACKEND\n   test_extra(boost::multiprecision::concepts::mp_number_float_architype());\n#endif\n#ifdef TEST_MPF_50\n   test_extra(boost::multiprecision::mpf_float_50());\n#endif\n#ifdef TEST_MPFR_50\n   test_extra(boost::multiprecision::mpfr_float_50());\n#endif\n#ifdef TEST_MPFR_6\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<6> >());\n#endif\n#ifdef TEST_MPFR_15\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<15> >());\n#endif\n#ifdef TEST_MPFR_17\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<17> >());\n#endif\n#ifdef TEST_MPFR_30\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> >());\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test_extra(boost::multiprecision::cpp_dec_float_50());\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test_extra(boost::multiprecision::cpp_bin_float_50());\n#endif\n#ifdef TEST_CPP_DEC_FLOAT_NO_ET\n   test_extra(boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_off>());\n#endif\n}\n\nint main()\n{\n#ifdef TEST_BACKEND\n   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::concepts::mp_number_float_architype>));\n#endif\n#ifdef TEST_MPF_50\n   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::mpf_float_50>));\n#endif\n#ifdef TEST_MPFR_50\n   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::mpfr_float_50>));\n#endif\n#ifdef TEST_MPFR_6\n   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<6> > >));\n#endif\n#ifdef TEST_MPFR_15\n   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<15> > >));\n#endif\n#ifdef TEST_MPFR_17\n   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<17> > >));\n#endif\n#ifdef TEST_MPFR_30\n   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> > >));\n#endif\n#ifdef TEST_MPFR_50\n   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::mpfr_float_50>));\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::cpp_dec_float_50>));\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::cpp_bin_float_50>));\n#endif\n#ifdef TEST_LOGGED_ADAPTER\n   typedef boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_dec_float<50> > > num_t;\n   test_extra(num_t());\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/concepts/sf_concept_check_basic.cpp",
    "content": "//  Copyright John Maddock 2012.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//\n// This tests that cpp_dec_float_50 meets our\n// conceptual requirements when used with Boost.Math.\n//\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#pragma warning(disable : 4800)\n#pragma warning(disable : 4512)\n#pragma warning(disable : 4127)\n#pragma warning(disable : 4512)\n#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated\n#endif\n\n#include <boost/container_hash/hash.hpp>\n#include <libs/math/test/compile_test/poison.hpp>\n\n#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET) && !defined(TEST_LOGGED_ADAPTER) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n#define TEST_BACKEND\n#define TEST_MPZ\n#define TEST_MPFR_50\n#define TEST_MPFR_6\n#define TEST_MPFR_15\n#define TEST_MPFR_17\n#define TEST_MPFR_30\n#define TEST_CPP_DEC_FLOAT\n#define TEST_CPP_DEC_FLOAT_NO_ET\n#define TEST_LOGGED_ADAPTER\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50) || defined(TEST_MPZ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET) || defined(TEST_LOGGED_ADAPTER)\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#if defined(TEST_CPP_BIN_FLOAT)\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#ifdef TEST_LOGGED_ADAPTER\n#include <boost/multiprecision/logged_adaptor.hpp>\n#endif\n\n#include <boost/math/special_functions.hpp>\n\ntemplate <class T>\nvoid test_extra(T)\n{\n   T   v1, v2, v3;\n   int i;\n   (boost::math::fpclassify)(v1);\n   (boost::math::isfinite)(v1);\n   (boost::math::isnormal)(v1);\n   (boost::math::isnan)(v1);\n   (boost::math::isinf)(v1);\n   (boost::math::signbit)(v1);\n   (boost::math::copysign)(v1, v2);\n   (boost::math::changesign)(v1);\n   (boost::math::sign)(v1);\n   boost::math::log1p(v1);\n   boost::math::expm1(v1);\n   boost::math::cbrt(v1);\n   boost::math::sqrt1pm1(v1);\n   boost::math::powm1(v1, v2);\n   boost::math::hypot(v1, v2);\n   boost::math::sinc_pi(v1);\n   boost::math::sinhc_pi(v1);\n   boost::math::asinh(v1);\n   boost::math::acosh(v1);\n   boost::math::atanh(v1);\n   boost::math::sin_pi(v1);\n   boost::math::cos_pi(v1);\n   boost::math::trunc(v1);\n   boost::math::itrunc(v1);\n   boost::math::ltrunc(v1);\n   boost::math::round(v1);\n   boost::math::iround(v1);\n   boost::math::lround(v1);\n   boost::math::modf(v1, &v1);\n   boost::math::modf(v1, &i);\n   long l;\n   boost::math::modf(v1, &l);\n#ifdef BOOST_HAS_LONG_LONG\n   boost::math::lltrunc(v1);\n   boost::math::llround(v1);\n   long long ll;\n   boost::math::modf(v1, &ll);\n#endif\n   boost::math::pow<2>(v1);\n   boost::math::nextafter(v1, v1);\n   boost::math::float_next(v1);\n   boost::math::float_prior(v1);\n   boost::math::float_distance(v1, v1);\n   // Misc functions that don't fit elsewhere:\n   boost::math::expint(v1);\n   boost::math::expint(i);\n   boost::math::expint(i, v2);\n   boost::math::expint(i, i);\n   boost::math::zeta(v1);\n   boost::math::zeta(i);\n   boost::math::owens_t(v1, v2);\n}\n\nvoid foo()\n{\n#ifdef TEST_BACKEND\n   test_extra(boost::multiprecision::concepts::mp_number_float_architype());\n#endif\n#ifdef TEST_MPF_50\n   test_extra(boost::multiprecision::mpf_float_50());\n#endif\n#ifdef TEST_MPFR_50\n   test_extra(boost::multiprecision::mpfr_float_50());\n#endif\n#ifdef TEST_MPFR_6\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<6> >());\n#endif\n#ifdef TEST_MPFR_15\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<15> >());\n#endif\n#ifdef TEST_MPFR_17\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<17> >());\n#endif\n#ifdef TEST_MPFR_30\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> >());\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test_extra(boost::multiprecision::cpp_dec_float_50());\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test_extra(boost::multiprecision::cpp_bin_float_50());\n#endif\n#ifdef TEST_CPP_DEC_FLOAT_NO_ET\n   test_extra(boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_off>());\n#endif\n#ifdef TEST_LOGGED_ADAPTER\n   typedef boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_dec_float<50> > > num_t;\n   test_extra(num_t());\n#endif\n}\n\nint main()\n{\n   foo();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/concepts/sf_concept_check_bessel.cpp",
    "content": "//  Copyright John Maddock 2012.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//\n// This tests that cpp_dec_float_50 meets our\n// conceptual requirements when used with Boost.Math.\n//\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#pragma warning(disable : 4800)\n#pragma warning(disable : 4512)\n#pragma warning(disable : 4127)\n#pragma warning(disable : 4512)\n#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated\n#endif\n\n#include <boost/container_hash/hash.hpp>\n#include <libs/math/test/compile_test/poison.hpp>\n\n#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET) && !defined(TEST_LOGGED_ADAPTER) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n#define TEST_BACKEND\n#define TEST_MPZ\n#define TEST_MPFR_50\n#define TEST_MPFR_6\n#define TEST_MPFR_15\n#define TEST_MPFR_17\n#define TEST_MPFR_30\n#define TEST_CPP_DEC_FLOAT\n#define TEST_CPP_DEC_FLOAT_NO_ET\n#define TEST_LOGGED_ADAPTER\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50) || defined(TEST_MPZ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET) || defined(TEST_LOGGED_ADAPTER)\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#if defined(TEST_CPP_BIN_FLOAT)\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#ifdef TEST_LOGGED_ADAPTER\n#include <boost/multiprecision/logged_adaptor.hpp>\n#endif\n\n#include <boost/math/special_functions.hpp>\n\ntemplate <class T>\nvoid test_extra(T)\n{\n   T   v1, v2, v3;\n   int i(0);\n   boost::math::cyl_neumann(v1, v2);\n   boost::math::cyl_neumann(i, v2);\n#ifndef SLOW_COMPILER\n   boost::math::cyl_bessel_j(v1, v2);\n   boost::math::cyl_bessel_j(i, v2);\n   boost::math::cyl_bessel_i(v1, v2);\n   boost::math::cyl_bessel_i(i, v2);\n   boost::math::cyl_bessel_k(v1, v2);\n   boost::math::cyl_bessel_k(i, v2);\n   boost::math::sph_bessel(i, v2);\n   boost::math::sph_bessel(i, 1);\n   boost::math::sph_neumann(i, v2);\n   boost::math::sph_neumann(i, i);\n   boost::math::airy_ai(v1);\n   boost::math::airy_bi(v1);\n   boost::math::airy_ai_prime(v1);\n   boost::math::airy_bi_prime(v1);\n#endif\n}\n\nvoid foo()\n{\n#ifdef TEST_BACKEND\n   test_extra(boost::multiprecision::concepts::mp_number_float_architype());\n#endif\n#ifdef TEST_MPF_50\n   test_extra(boost::multiprecision::mpf_float_50());\n#endif\n#ifdef TEST_MPFR_50\n   test_extra(boost::multiprecision::mpfr_float_50());\n#endif\n#ifdef TEST_MPFR_6\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<6> >());\n#endif\n#ifdef TEST_MPFR_15\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<15> >());\n#endif\n#ifdef TEST_MPFR_17\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<17> >());\n#endif\n#ifdef TEST_MPFR_30\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> >());\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test_extra(boost::multiprecision::cpp_dec_float_50());\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test_extra(boost::multiprecision::cpp_bin_float_50());\n#endif\n#ifdef TEST_CPP_DEC_FLOAT_NO_ET\n   test_extra(boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_off>());\n#endif\n#ifdef TEST_LOGGED_ADAPTER\n   typedef boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_dec_float<50> > > num_t;\n   test_extra(num_t());\n#endif\n}\n\nint main()\n{\n   foo();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/concepts/sf_concept_check_beta.cpp",
    "content": "//  Copyright John Maddock 2012.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//\n// This tests that cpp_dec_float_50 meets our\n// conceptual requirements when used with Boost.Math.\n//\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#pragma warning(disable : 4800)\n#pragma warning(disable : 4512)\n#pragma warning(disable : 4127)\n#pragma warning(disable : 4512)\n#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated\n#endif\n\n#include <boost/container_hash/hash.hpp>\n#include <libs/math/test/compile_test/poison.hpp>\n\n#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET) && !defined(TEST_LOGGED_ADAPTER) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n#define TEST_BACKEND\n#define TEST_MPZ\n#define TEST_MPFR_50\n#define TEST_MPFR_6\n#define TEST_MPFR_15\n#define TEST_MPFR_17\n#define TEST_MPFR_30\n#define TEST_CPP_DEC_FLOAT\n#define TEST_CPP_DEC_FLOAT_NO_ET\n#define TEST_LOGGED_ADAPTER\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50) || defined(TEST_MPZ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET) || defined(TEST_LOGGED_ADAPTER)\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_CPP_BIN_FLOAT)\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n#ifdef TEST_LOGGED_ADAPTER\n#include <boost/multiprecision/logged_adaptor.hpp>\n#endif\n\n#include <boost/math/special_functions.hpp>\n\ntemplate <class T>\nvoid test_extra(T)\n{\n   T   v1, v2, v3;\n   boost::math::beta(v1, v2);\n   boost::math::beta(v1, v2, v3);\n   boost::math::betac(v1, v2, v3);\n   boost::math::ibeta(v1, v2, v3);\n   boost::math::ibetac(v1, v2, v3);\n   boost::math::ibeta_derivative(v1, v2, v3);\n}\n\nvoid foo()\n{\n#ifdef TEST_BACKEND\n   test_extra(boost::multiprecision::concepts::mp_number_float_architype());\n#endif\n#ifdef TEST_MPF_50\n   test_extra(boost::multiprecision::mpf_float_50());\n#endif\n#ifdef TEST_MPFR_50\n   test_extra(boost::multiprecision::mpfr_float_50());\n#endif\n#ifdef TEST_MPFR_6\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<6> >());\n#endif\n#ifdef TEST_MPFR_15\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<15> >());\n#endif\n#ifdef TEST_MPFR_17\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<17> >());\n#endif\n#ifdef TEST_MPFR_30\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> >());\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test_extra(boost::multiprecision::cpp_dec_float_50());\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test_extra(boost::multiprecision::cpp_bin_float_50());\n#endif\n#ifdef TEST_CPP_DEC_FLOAT_NO_ET\n   test_extra(boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_off>());\n#endif\n#ifdef TEST_LOGGED_ADAPTER\n   typedef boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_dec_float<50> > > num_t;\n   test_extra(num_t());\n#endif\n}\n\nint main()\n{\n   foo();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/concepts/sf_concept_check_beta_2.cpp",
    "content": "//  Copyright John Maddock 2012.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//\n// This tests that cpp_dec_float_50 meets our\n// conceptual requirements when used with Boost.Math.\n//\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#pragma warning(disable : 4800)\n#pragma warning(disable : 4512)\n#pragma warning(disable : 4127)\n#pragma warning(disable : 4512)\n#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated\n#endif\n\n#include <boost/container_hash/hash.hpp>\n#include <libs/math/test/compile_test/poison.hpp>\n\n#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET) && !defined(TEST_LOGGED_ADAPTER) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n#define TEST_BACKEND\n#define TEST_MPZ\n#define TEST_MPFR_50\n#define TEST_MPFR_6\n#define TEST_MPFR_15\n#define TEST_MPFR_17\n#define TEST_MPFR_30\n#define TEST_CPP_DEC_FLOAT\n#define TEST_CPP_DEC_FLOAT_NO_ET\n#define TEST_LOGGED_ADAPTER\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50) || defined(TEST_MPZ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET) || defined(TEST_LOGGED_ADAPTER)\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_CPP_BIN_FLOAT)\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n#ifdef TEST_LOGGED_ADAPTER\n#include <boost/multiprecision/logged_adaptor.hpp>\n#endif\n\n#include <boost/math/special_functions.hpp>\n\ntemplate <class T>\nvoid test_extra(T)\n{\n   T   v1, v2, v3;\n   boost::math::ibeta_inv(v1, v2, v3);\n   boost::math::ibetac_inv(v1, v2, v3);\n}\n\nvoid foo()\n{\n#ifdef TEST_BACKEND\n   test_extra(boost::multiprecision::concepts::mp_number_float_architype());\n#endif\n#ifdef TEST_MPF_50\n   test_extra(boost::multiprecision::mpf_float_50());\n#endif\n#ifdef TEST_MPFR_50\n   test_extra(boost::multiprecision::mpfr_float_50());\n#endif\n#ifdef TEST_MPFR_6\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<6> >());\n#endif\n#ifdef TEST_MPFR_15\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<15> >());\n#endif\n#ifdef TEST_MPFR_17\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<17> >());\n#endif\n#ifdef TEST_MPFR_30\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> >());\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test_extra(boost::multiprecision::cpp_dec_float_50());\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test_extra(boost::multiprecision::cpp_bin_float_50());\n#endif\n#ifdef TEST_CPP_DEC_FLOAT_NO_ET\n   test_extra(boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_off>());\n#endif\n#ifdef TEST_LOGGED_ADAPTER\n   typedef boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_dec_float<50> > > num_t;\n   test_extra(num_t());\n#endif\n}\n\nint main()\n{\n   foo();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/concepts/sf_concept_check_beta_3.cpp",
    "content": "//  Copyright John Maddock 2012.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//\n// This tests that cpp_dec_float_50 meets our\n// conceptual requirements when used with Boost.Math.\n//\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#pragma warning(disable : 4800)\n#pragma warning(disable : 4512)\n#pragma warning(disable : 4127)\n#pragma warning(disable : 4512)\n#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated\n#endif\n\n#include <boost/container_hash/hash.hpp>\n#include <libs/math/test/compile_test/poison.hpp>\n\n#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET) && !defined(TEST_LOGGED_ADAPTER) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n#define TEST_BACKEND\n#define TEST_MPZ\n#define TEST_MPFR_50\n#define TEST_MPFR_6\n#define TEST_MPFR_15\n#define TEST_MPFR_17\n#define TEST_MPFR_30\n#define TEST_CPP_DEC_FLOAT\n#define TEST_CPP_DEC_FLOAT_NO_ET\n#define TEST_LOGGED_ADAPTER\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50) || defined(TEST_MPZ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET) || defined(TEST_LOGGED_ADAPTER)\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_CPP_BIN_FLOAT)\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n#ifdef TEST_LOGGED_ADAPTER\n#include <boost/multiprecision/logged_adaptor.hpp>\n#endif\n\n#include <boost/math/special_functions.hpp>\n\ntemplate <class T>\nvoid test_extra(T)\n{\n   T   v1, v2, v3;\n   boost::math::ibeta_inva(v1, v2, v3);\n   boost::math::ibetac_inva(v1, v2, v3);\n   boost::math::ibeta_invb(v1, v2, v3);\n   boost::math::ibetac_invb(v1, v2, v3);\n}\n\nvoid foo()\n{\n#ifdef TEST_BACKEND\n   test_extra(boost::multiprecision::concepts::mp_number_float_architype());\n#endif\n#ifdef TEST_MPF_50\n   test_extra(boost::multiprecision::mpf_float_50());\n#endif\n#ifdef TEST_MPFR_50\n   test_extra(boost::multiprecision::mpfr_float_50());\n#endif\n#ifdef TEST_MPFR_6\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<6> >());\n#endif\n#ifdef TEST_MPFR_15\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<15> >());\n#endif\n#ifdef TEST_MPFR_17\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<17> >());\n#endif\n#ifdef TEST_MPFR_30\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> >());\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test_extra(boost::multiprecision::cpp_dec_float_50());\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test_extra(boost::multiprecision::cpp_bin_float_50());\n#endif\n#ifdef TEST_CPP_DEC_FLOAT_NO_ET\n   test_extra(boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_off>());\n#endif\n#ifdef TEST_LOGGED_ADAPTER\n   typedef boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_dec_float<50> > > num_t;\n   test_extra(num_t());\n#endif\n}\n\nint main()\n{\n   foo();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/concepts/sf_concept_check_elliptic.cpp",
    "content": "//  Copyright John Maddock 2012.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//\n// This tests that cpp_dec_float_50 meets our\n// conceptual requirements when used with Boost.Math.\n//\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#pragma warning(disable : 4800)\n#pragma warning(disable : 4512)\n#pragma warning(disable : 4127)\n#pragma warning(disable : 4512)\n#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated\n#endif\n\n#include <boost/container_hash/hash.hpp>\n#include <libs/math/test/compile_test/poison.hpp>\n\n#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET) && !defined(TEST_LOGGED_ADAPTER) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n#define TEST_BACKEND\n#define TEST_MPZ\n#define TEST_MPFR_50\n#define TEST_MPFR_6\n#define TEST_MPFR_15\n#define TEST_MPFR_17\n#define TEST_MPFR_30\n#define TEST_CPP_DEC_FLOAT\n#define TEST_CPP_DEC_FLOAT_NO_ET\n#define TEST_LOGGED_ADAPTER\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50) || defined(TEST_MPZ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET) || defined(TEST_LOGGED_ADAPTER)\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#if defined(TEST_CPP_BIN_FLOAT)\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#ifdef TEST_LOGGED_ADAPTER\n#include <boost/multiprecision/logged_adaptor.hpp>\n#endif\n\n#include <boost/math/special_functions.hpp>\n\ntemplate <class T>\nvoid test_extra(T)\n{\n   T v1, v2, v3;\n   boost::math::ellint_1(v1);\n   boost::math::ellint_1(v1, v2);\n   boost::math::ellint_2(v1);\n   boost::math::ellint_2(v1, v2);\n   boost::math::ellint_3(v1, v2);\n   boost::math::ellint_3(v1, v2, v3);\n   boost::math::ellint_rc(v1, v2);\n   boost::math::ellint_rd(v1, v2, v3);\n   boost::math::ellint_rf(v1, v2, v3);\n   boost::math::ellint_rj(v1, v2, v3, v1);\n   boost::math::jacobi_elliptic(v1, v2, &v1, &v2);\n   boost::math::jacobi_cd(v1, v2);\n   boost::math::jacobi_cn(v1, v2);\n   boost::math::jacobi_cs(v1, v2);\n   boost::math::jacobi_dc(v1, v2);\n   boost::math::jacobi_dn(v1, v2);\n   boost::math::jacobi_ds(v1, v2);\n   boost::math::jacobi_nc(v1, v2);\n   boost::math::jacobi_nd(v1, v2);\n   boost::math::jacobi_ns(v1, v2);\n   boost::math::jacobi_sc(v1, v2);\n   boost::math::jacobi_sd(v1, v2);\n   boost::math::jacobi_sn(v1, v2);\n}\n\nvoid foo()\n{\n#ifdef TEST_BACKEND\n   test_extra(boost::multiprecision::concepts::mp_number_float_architype());\n#endif\n#ifdef TEST_MPF_50\n   test_extra(boost::multiprecision::mpf_float_50());\n#endif\n#ifdef TEST_MPFR_50\n   test_extra(boost::multiprecision::mpfr_float_50());\n#endif\n#ifdef TEST_MPFR_6\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<6> >());\n#endif\n#ifdef TEST_MPFR_15\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<15> >());\n#endif\n#ifdef TEST_MPFR_17\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<17> >());\n#endif\n#ifdef TEST_MPFR_30\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> >());\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test_extra(boost::multiprecision::cpp_dec_float_50());\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test_extra(boost::multiprecision::cpp_bin_float_50());\n#endif\n#ifdef TEST_CPP_DEC_FLOAT_NO_ET\n   test_extra(boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_off>());\n#endif\n#ifdef TEST_LOGGED_ADAPTER\n   typedef boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_dec_float<50> > > num_t;\n   test_extra(num_t());\n#endif\n}\n\nint main()\n{\n   foo();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/concepts/sf_concept_check_gamma.cpp",
    "content": "//  Copyright John Maddock 2012.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//\n// This tests that cpp_dec_float_50 meets our\n// conceptual requirements when used with Boost.Math.\n//\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#pragma warning(disable : 4800)\n#pragma warning(disable : 4512)\n#pragma warning(disable : 4127)\n#pragma warning(disable : 4512)\n#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated\n#endif\n\n#include <boost/container_hash/hash.hpp>\n#include <libs/math/test/compile_test/poison.hpp>\n\n#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET) && !defined(TEST_LOGGED_ADAPTER) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n#define TEST_BACKEND\n#define TEST_MPZ\n#define TEST_MPFR_50\n#define TEST_MPFR_6\n#define TEST_MPFR_15\n#define TEST_MPFR_17\n#define TEST_MPFR_30\n#define TEST_CPP_DEC_FLOAT\n#define TEST_CPP_DEC_FLOAT_NO_ET\n#define TEST_LOGGED_ADAPTER\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50) || defined(TEST_MPZ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET) || defined(TEST_LOGGED_ADAPTER)\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_CPP_BIN_FLOAT)\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n#ifdef TEST_LOGGED_ADAPTER\n#include <boost/multiprecision/logged_adaptor.hpp>\n#endif\n\n#include <boost/math/special_functions.hpp>\n\ntemplate <class T>\nvoid test_extra(T)\n{\n   T   v1, v2, v3;\n   int i;\n   boost::math::tgamma(v1);\n   boost::math::tgamma1pm1(v1);\n   boost::math::lgamma(v1);\n   boost::math::lgamma(v1, &i);\n   boost::math::digamma(v1);\n   boost::math::tgamma_ratio(v1, v2);\n   boost::math::tgamma_delta_ratio(v1, v2);\n   boost::math::factorial<T>(i);\n   boost::math::unchecked_factorial<T>(i);\n   i = boost::math::max_factorial<T>::value;\n   boost::math::double_factorial<T>(i);\n   boost::math::rising_factorial(v1, i);\n   boost::math::falling_factorial(v1, i);\n   boost::math::gamma_p_derivative(v2, v3);\n   boost::math::tgamma(v1, v2);\n   boost::math::tgamma_lower(v1, v2);\n   boost::math::gamma_p(v1, v2);\n   boost::math::gamma_q(v1, v2);\n   boost::math::gamma_p_inv(v1, v2);\n   boost::math::gamma_q_inv(v1, v2);\n   boost::math::gamma_p_inva(v1, v2);\n   boost::math::gamma_q_inva(v1, v2);\n   boost::math::erf(v1);\n   boost::math::erfc(v1);\n   boost::math::erf_inv(v1);\n   boost::math::erfc_inv(v1);\n}\n\nvoid foo()\n{\n#ifdef TEST_BACKEND\n   test_extra(boost::multiprecision::concepts::mp_number_float_architype());\n#endif\n#ifdef TEST_MPF_50\n   test_extra(boost::multiprecision::mpf_float_50());\n#endif\n#ifdef TEST_MPFR_50\n   test_extra(boost::multiprecision::mpfr_float_50());\n#endif\n#ifdef TEST_MPFR_6\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<6> >());\n#endif\n#ifdef TEST_MPFR_15\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<15> >());\n#endif\n#ifdef TEST_MPFR_17\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<17> >());\n#endif\n#ifdef TEST_MPFR_30\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> >());\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test_extra(boost::multiprecision::cpp_dec_float_50());\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test_extra(boost::multiprecision::cpp_bin_float_50());\n#endif\n#ifdef TEST_CPP_DEC_FLOAT_NO_ET\n   test_extra(boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_off>());\n#endif\n#ifdef TEST_LOGGED_ADAPTER\n   typedef boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_dec_float<50> > > num_t;\n   test_extra(num_t());\n#endif\n}\n\nint main()\n{\n   foo();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/concepts/sf_concept_check_poly.cpp",
    "content": "//  Copyright John Maddock 2012.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//\n// This tests that cpp_dec_float_50 meets our\n// conceptual requirements when used with Boost.Math.\n//\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#pragma warning(disable : 4800)\n#pragma warning(disable : 4512)\n#pragma warning(disable : 4127)\n#pragma warning(disable : 4512)\n#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated\n#endif\n\n#include <boost/container_hash/hash.hpp>\n#include <libs/math/test/compile_test/poison.hpp>\n\n#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET) && !defined(TEST_LOGGED_ADAPTER) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n#define TEST_BACKEND\n#define TEST_MPZ\n#define TEST_MPFR_50\n#define TEST_MPFR_6\n#define TEST_MPFR_15\n#define TEST_MPFR_17\n#define TEST_MPFR_30\n#define TEST_CPP_DEC_FLOAT\n#define TEST_CPP_DEC_FLOAT_NO_ET\n#define TEST_LOGGED_ADAPTER\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50) || defined(TEST_MPZ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET) || defined(TEST_LOGGED_ADAPTER)\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#if defined(TEST_CPP_BIN_FLOAT)\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#ifdef TEST_LOGGED_ADAPTER\n#include <boost/multiprecision/logged_adaptor.hpp>\n#endif\n\n#include <boost/math/special_functions.hpp>\n\ntemplate <class T>\nvoid test_extra(T)\n{\n   T v1, v2, v3;\n   boost::math::legendre_p(1, v1);\n   boost::math::legendre_p(1, 0, v1);\n   boost::math::legendre_q(1, v1);\n   boost::math::legendre_next(2, v1, v2, v3);\n   boost::math::legendre_next(2, 2, v1, v2, v3);\n   boost::math::laguerre(1, v1);\n   boost::math::laguerre(2, 1, v1);\n   boost::math::laguerre(2u, 1u, v1);\n   boost::math::laguerre_next(2, v1, v2, v3);\n   boost::math::laguerre_next(2, 1, v1, v2, v3);\n   boost::math::hermite(1, v1);\n   boost::math::hermite_next(2, v1, v2, v3);\n   boost::math::spherical_harmonic_r(2, 1, v1, v2);\n   boost::math::spherical_harmonic_i(2, 1, v1, v2);\n}\n\nvoid foo()\n{\n#ifdef TEST_BACKEND\n   test_extra(boost::multiprecision::concepts::mp_number_float_architype());\n#endif\n#ifdef TEST_MPF_50\n   test_extra(boost::multiprecision::mpf_float_50());\n#endif\n#ifdef TEST_MPFR_50\n   test_extra(boost::multiprecision::mpfr_float_50());\n#endif\n#ifdef TEST_MPFR_6\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<6> >());\n#endif\n#ifdef TEST_MPFR_15\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<15> >());\n#endif\n#ifdef TEST_MPFR_17\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<17> >());\n#endif\n#ifdef TEST_MPFR_30\n   test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> >());\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test_extra(boost::multiprecision::cpp_dec_float_50());\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test_extra(boost::multiprecision::cpp_bin_float_50());\n#endif\n#ifdef TEST_CPP_DEC_FLOAT_NO_ET\n   test_extra(boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_off>());\n#endif\n#ifdef TEST_LOGGED_ADAPTER\n   typedef boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_dec_float<50> > > num_t;\n   test_extra(num_t());\n#endif\n}\n\nint main()\n{\n   foo();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/constexpr_arithmetric_test.hpp",
    "content": "//  (C) Copyright John Maddock 2019.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/config.hpp>\n#include <boost/multiprecision/number.hpp>\n#include <limits>\n\n// clang-format off\n\n#ifdef BOOST_HAS_FLOAT128\n#define OR_IS_FLOAT128 || std::is_same<__float128, U>::value\n#else\n#define OR_IS_FLOAT128\n#endif\n\ntemplate <class T, class U>\nBOOST_CXX14_CONSTEXPR T do_test_constexpr_add_subtract(T a, U b)\n{\n   a = +b;\n   if constexpr((std::numeric_limits<U>::is_signed OR_IS_FLOAT128) && std::numeric_limits<T>::is_signed)\n      b = -b;\n   a += b;\n   a += a;\n   a -= b;\n   a -= a;\n   ++a;\n   --a;\n   T bb(b);\n   a += bb++;\n   a += bb--;\n   a = a + b;\n   a += a - b;\n   if constexpr((std::numeric_limits<U>::is_signed OR_IS_FLOAT128) && std::numeric_limits<T>::is_signed)\n      a -= b - -a;\n   a += b + a;\n   if constexpr(std::numeric_limits<T>::is_signed)\n   {\n      a = -a;\n      if constexpr(std::numeric_limits<U>::is_signed OR_IS_FLOAT128)\n         a -= b;\n   }\n   return a;\n}\n\ntemplate <class T>\nBOOST_CXX14_CONSTEXPR T test_constexpr_add_subtract(T a)\n{\n   a += do_test_constexpr_add_subtract(a, a);\n   a += do_test_constexpr_add_subtract(a, static_cast<unsigned char>(2));\n   a += do_test_constexpr_add_subtract(a, static_cast<signed char>(2));\n   a += do_test_constexpr_add_subtract(a, static_cast<char>(2));\n   a += do_test_constexpr_add_subtract(a, static_cast<short>(2));\n   a += do_test_constexpr_add_subtract(a, static_cast<unsigned short>(2));\n   a += do_test_constexpr_add_subtract(a, static_cast<int>(2));\n   a += do_test_constexpr_add_subtract(a, static_cast<unsigned int>(2));\n   a += do_test_constexpr_add_subtract(a, static_cast<long>(2));\n   a += do_test_constexpr_add_subtract(a, static_cast<unsigned long>(2));\n   a += do_test_constexpr_add_subtract(a, static_cast<long long>(2));\n   a += do_test_constexpr_add_subtract(a, static_cast<unsigned long long>(2));\n#if defined(BOOST_HAS_INT128) && !defined(BOOST_NO_CXX17_IF_CONSTEXPR)\n   if constexpr (std::is_constructible<T, boost::int128_type>::value)\n   {\n      a += do_test_constexpr_add_subtract(a, static_cast<boost::int128_type>(2));\n      a += do_test_constexpr_add_subtract(a, static_cast<boost::uint128_type>(2));\n      a -= do_test_constexpr_add_subtract(a, static_cast<boost::int128_type>(2));\n      a -= do_test_constexpr_add_subtract(a, static_cast<boost::uint128_type>(2));\n   }\n#endif\n\n   if constexpr (boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_floating_point)\n   {\n      a += do_test_constexpr_add_subtract(a, static_cast<float>(2));\n      a += do_test_constexpr_add_subtract(a, static_cast<double>(2));\n      a += do_test_constexpr_add_subtract(a, static_cast<long double>(2));\n#if defined(BOOST_HAS_FLOAT128) && !defined(BOOST_NO_CXX17_IF_CONSTEXPR)\n   if constexpr (std::is_constructible<T, __float128>::value)\n      a += do_test_constexpr_add_subtract(a, static_cast<__float128>(2));\n#endif\n   }\n\n   return a;\n}\n\ntemplate <class T, class U>\nBOOST_CXX14_CONSTEXPR T do_test_constexpr_mul_divide(T a, U b)\n{\n   a *= b;\n   a = a * b;\n   if constexpr(std::numeric_limits<T>::is_signed && std::numeric_limits<U>::is_signed)\n   {\n      a *= -b;\n      a = a * -b;\n   }\n   a /= b;\n   a = a / b;\n   if constexpr(std::numeric_limits<T>::is_signed && std::numeric_limits<U>::is_signed)\n   {\n      a /= -b;\n      a = a / -b;\n   }\n   if constexpr (boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_integer && boost::multiprecision::number_category<U>::value == boost::multiprecision::number_kind_integer)\n   {\n      a %= b;\n      a = a % b;\n   }\n   return a;\n}\n\ntemplate <class T>\nBOOST_CXX14_CONSTEXPR T test_constexpr_mul_divide(T a)\n{\n   a += do_test_constexpr_mul_divide(a, a);\n   a += do_test_constexpr_mul_divide(a, static_cast<unsigned char>(2));\n   a += do_test_constexpr_mul_divide(a, static_cast<signed char>(2));\n   a += do_test_constexpr_mul_divide(a, static_cast<char>(2));\n   a += do_test_constexpr_mul_divide(a, static_cast<short>(2));\n   a += do_test_constexpr_mul_divide(a, static_cast<unsigned short>(2));\n   a += do_test_constexpr_mul_divide(a, static_cast<int>(2));\n   a += do_test_constexpr_mul_divide(a, static_cast<unsigned int>(2));\n   a += do_test_constexpr_mul_divide(a, static_cast<long>(2));\n   a += do_test_constexpr_mul_divide(a, static_cast<unsigned long>(2));\n   a += do_test_constexpr_mul_divide(a, static_cast<long long>(2));\n   a += do_test_constexpr_mul_divide(a, static_cast<unsigned long long>(2));\n#if defined(BOOST_HAS_INT128) && !defined(BOOST_NO_CXX17_IF_CONSTEXPR)\n   if constexpr (std::is_constructible<T, boost::int128_type>::value)\n   {\n      a += do_test_constexpr_mul_divide(a, static_cast<boost::int128_type>(2));\n      a += do_test_constexpr_mul_divide(a, static_cast<boost::uint128_type>(2));\n      a -= do_test_constexpr_mul_divide(a, static_cast<boost::int128_type>(2));\n      a -= do_test_constexpr_mul_divide(a, static_cast<boost::uint128_type>(2));\n   }\n#endif\n\n   if constexpr (boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_floating_point)\n   {\n      a += do_test_constexpr_mul_divide(a, static_cast<float>(2));\n      a += do_test_constexpr_mul_divide(a, static_cast<double>(2));\n      a += do_test_constexpr_mul_divide(a, static_cast<long double>(2));\n#if defined(BOOST_HAS_FLOAT128) && !defined(BOOST_NO_CXX17_IF_CONSTEXPR)\n   if constexpr (std::is_constructible<T, __float128>::value)\n      a += do_test_constexpr_mul_divide(a, static_cast<__float128>(2));\n#endif\n    }\n   return a;\n}\n\ntemplate <class T, class U>\nBOOST_CXX14_CONSTEXPR T do_test_constexpr_bitwise(T a, U b)\n{\n   a |= b;\n   a &= b;\n   a <<= 2;\n   a ^= b;\n   a = a | b;\n   a = a & b;\n   a <<= 2;\n   a = a ^ b;\n   if constexpr (std::numeric_limits<T>::is_signed == false)\n   {\n      a = ~a;\n      a >>= std::numeric_limits<T>::digits - 3;\n   }\n\n   a <<= 5;\n   a = a << 2;\n   a >>= 5;\n   a = a >> 2;\n\n   return a;\n}\n\ntemplate <class T>\nBOOST_CXX14_CONSTEXPR T test_constexpr_bitwise(T a)\n{\n   a += do_test_constexpr_bitwise(a, a);\n   a += do_test_constexpr_bitwise(a, static_cast<unsigned char>(2));\n   a += do_test_constexpr_bitwise(a, static_cast<signed char>(2));\n   a += do_test_constexpr_bitwise(a, static_cast<char>(2));\n   a += do_test_constexpr_bitwise(a, static_cast<short>(2));\n   a += do_test_constexpr_bitwise(a, static_cast<unsigned short>(2));\n   a += do_test_constexpr_bitwise(a, static_cast<int>(2));\n   a += do_test_constexpr_bitwise(a, static_cast<unsigned int>(2));\n   a += do_test_constexpr_bitwise(a, static_cast<long>(2));\n   a += do_test_constexpr_bitwise(a, static_cast<unsigned long>(2));\n   a += do_test_constexpr_bitwise(a, static_cast<long long>(2));\n   a += do_test_constexpr_bitwise(a, static_cast<unsigned long long>(2));\n#if defined(BOOST_HAS_INT128) && !defined(BOOST_NO_CXX17_IF_CONSTEXPR)\n   if constexpr (std::is_constructible<T, boost::int128_type>::value)\n   {\n      a += do_test_constexpr_bitwise(a, static_cast<boost::int128_type>(2));\n      a += do_test_constexpr_bitwise(a, static_cast<boost::uint128_type>(2));\n   }\n#endif\n\n   return a;\n}\n\ntemplate <class T, class U>\nBOOST_CXX14_CONSTEXPR T do_test_constexpr_logical(T a, U b)\n{\n   T result(0);\n   if(a || b)\n      ++result;\n   if(b || a)\n      ++result;\n   if(a && b)\n      ++result;\n   if(b && a)\n      ++result;\n   if(a)\n      ++result;\n   if(!a)\n      ++result;\n   return result;\n}\n\ntemplate <class T>\nBOOST_CXX14_CONSTEXPR T test_constexpr_logical(T a)\n{\n   a += do_test_constexpr_logical(a, a);\n   a += do_test_constexpr_logical(a, static_cast<unsigned char>(2));\n   a += do_test_constexpr_logical(a, static_cast<signed char>(2));\n   a += do_test_constexpr_logical(a, static_cast<char>(2));\n   a += do_test_constexpr_logical(a, static_cast<short>(2));\n   a += do_test_constexpr_logical(a, static_cast<unsigned short>(2));\n   a += do_test_constexpr_logical(a, static_cast<int>(2));\n   a += do_test_constexpr_logical(a, static_cast<unsigned int>(2));\n   a += do_test_constexpr_logical(a, static_cast<long>(2));\n   a += do_test_constexpr_logical(a, static_cast<unsigned long>(2));\n   a += do_test_constexpr_logical(a, static_cast<long long>(2));\n   a += do_test_constexpr_logical(a, static_cast<unsigned long long>(2));\n#if defined(BOOST_HAS_INT128) && !defined(BOOST_NO_CXX17_IF_CONSTEXPR)\n   if constexpr (std::is_constructible<T, boost::int128_type>::value)\n   {\n      a += do_test_constexpr_logical(a, static_cast<boost::int128_type>(2));\n      a += do_test_constexpr_logical(a, static_cast<boost::uint128_type>(2));\n      a -= do_test_constexpr_logical(a, static_cast<boost::int128_type>(2));\n      a -= do_test_constexpr_logical(a, static_cast<boost::uint128_type>(2));\n   }\n#endif\n\n   return a;\n}\n\ntemplate <class T, class U>\nBOOST_CXX14_CONSTEXPR T do_test_constexpr_compare(T a, U b)\n{\n   T result(0);\n   if(a == b)\n      ++result;\n   if(b == a)\n      ++result;\n   if(a != b)\n      ++result;\n   if(b != a)\n      ++result;\n   if(a < b)\n      ++result;\n   if(b < a)\n      ++result;\n   if(a <= b)\n      ++result;\n   if(b <= a)\n      ++result;\n   if(a > b)\n      ++result;\n   if(b > a)\n      ++result;\n   if(a >= b)\n      ++result;\n   if(b >= a)\n      ++result;\n\n   T u(b);\n   if(u == a)\n      ++result;\n\n   return result;\n}\n\ntemplate <class T>\nBOOST_CXX14_CONSTEXPR T test_constexpr_compare(T a)\n{\n   a += do_test_constexpr_compare(a, a);\n   a += do_test_constexpr_compare(a, static_cast<unsigned char>(2));\n   a += do_test_constexpr_compare(a, static_cast<signed char>(2));\n   a += do_test_constexpr_compare(a, static_cast<char>(2));\n   a += do_test_constexpr_compare(a, static_cast<short>(2));\n   a += do_test_constexpr_compare(a, static_cast<unsigned short>(2));\n   a += do_test_constexpr_compare(a, static_cast<int>(2));\n   a += do_test_constexpr_compare(a, static_cast<unsigned int>(2));\n   a += do_test_constexpr_compare(a, static_cast<long>(2));\n   a += do_test_constexpr_compare(a, static_cast<unsigned long>(2));\n   a += do_test_constexpr_compare(a, static_cast<long long>(2));\n   a += do_test_constexpr_compare(a, static_cast<unsigned long long>(2));\n#if defined(BOOST_HAS_INT128) && !defined(BOOST_NO_CXX17_IF_CONSTEXPR)\n   if constexpr (std::is_constructible<T, boost::int128_type>::value)\n   {\n      a += do_test_constexpr_compare(a, static_cast<boost::int128_type>(2));\n      a += do_test_constexpr_compare(a, static_cast<boost::uint128_type>(2));\n      a -= do_test_constexpr_compare(a, static_cast<boost::int128_type>(2));\n      a -= do_test_constexpr_compare(a, static_cast<boost::uint128_type>(2));\n   }\n#endif\n\n   if constexpr (boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_floating_point)\n   {\n      a += do_test_constexpr_compare(a, static_cast<float>(2));\n      a += do_test_constexpr_compare(a, static_cast<double>(2));\n      a += do_test_constexpr_compare(a, static_cast<long double>(2));\n#if defined(BOOST_HAS_FLOAT128) && !defined(BOOST_NO_CXX17_IF_CONSTEXPR)\n   if constexpr (std::is_constructible<T, __float128>::value)\n      a += do_test_constexpr_compare(a, static_cast<__float128>(2));\n#endif\n    }\n   return a;\n}\n\n// clang-format on\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/constexpr_test_arithmetic_backend.cpp",
    "content": "//  (C) Copyright John Maddock 2019.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include \"constexpr_arithmetric_test.hpp\"\n#include \"../performance/arithmetic_backend.hpp\"\n\ntemplate <class T>\nconstexpr int expected_1()\n{\n#ifdef BOOST_HAS_INT128\n   if constexpr (std::is_constructible<T, boost::int128_type>::value)\n      return 230;\n   else\n#endif\n      return 210;\n}\ntemplate <class T>\nconstexpr int expected_2()\n{\n#ifdef BOOST_HAS_INT128\n   if constexpr (std::is_constructible<T, boost::int128_type>::value)\n      return 120;\n   else\n#endif\n      return 106;\n}\n\n\nint main()\n{\n   typedef boost::multiprecision::number<boost::multiprecision::backends::arithmetic_backend<long long>, boost::multiprecision::et_off>          int_backend;\n   typedef boost::multiprecision::number<boost::multiprecision::backends::arithmetic_backend<unsigned long long>, boost::multiprecision::et_off> unsigned_backend;\n\n   typedef boost::multiprecision::number<boost::multiprecision::backends::arithmetic_backend<long long>, boost::multiprecision::et_on>          int_backend_et;\n   typedef boost::multiprecision::number<boost::multiprecision::backends::arithmetic_backend<unsigned long long>, boost::multiprecision::et_on> unsigned_backend_et;\n\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_add_subtract(a);\n      constexpr unsigned_backend d = test_constexpr_add_subtract(c);\n\n      constexpr long long llv = (long long)b;\n\n      static_assert(b == -108);\n      static_assert(llv == -108);\n      static_assert(d == 554);\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_mul_divide(a);\n      constexpr unsigned_backend d = test_constexpr_mul_divide(c);\n      static_assert(b == 22);\n      static_assert(d == 22);\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_bitwise(a);\n      constexpr unsigned_backend d = test_constexpr_bitwise(c);\n\n      static_assert(b == expected_1<int_backend>());\n      static_assert(d == expected_2<unsigned_backend>());\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_logical(a);\n      constexpr unsigned_backend d = test_constexpr_logical(c);\n      static_assert(b == 82);\n      static_assert(d == 82);\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_compare(a);\n      constexpr unsigned_backend d = test_constexpr_compare(c);\n      static_assert(b == 95);\n      static_assert(d == 95);\n   }\n   //\n   // Over again with expression templates turned on:\n   //\n   {\n      constexpr int_backend_et a(22);\n      constexpr unsigned_backend_et c(22);\n      constexpr int_backend_et b      = test_constexpr_add_subtract(a);\n      constexpr unsigned_backend_et d = test_constexpr_add_subtract(c);\n\n      static_assert(b == -108);\n      static_assert(d == 554);\n   }\n   {\n      constexpr int_backend_et a(22);\n      constexpr unsigned_backend_et c(22);\n      constexpr int_backend_et b      = test_constexpr_mul_divide(a);\n      constexpr unsigned_backend_et d = test_constexpr_mul_divide(c);\n      static_assert(b == 22);\n      static_assert(d == 22);\n   }\n   {\n      constexpr int_backend_et a(22);\n      constexpr unsigned_backend_et c(22);\n      constexpr int_backend_et b      = test_constexpr_bitwise(a);\n      constexpr unsigned_backend_et d = test_constexpr_bitwise(c);\n\n      static_assert(b == expected_1<int_backend>());\n      static_assert(d == expected_2<int_backend>());\n   }\n   {\n      constexpr int_backend_et a(22);\n      constexpr unsigned_backend_et c(22);\n      constexpr int_backend_et b      = test_constexpr_logical(a);\n      constexpr unsigned_backend_et d = test_constexpr_logical(c);\n      static_assert(b == 82);\n      static_assert(d == 82);\n   }\n   {\n      constexpr int_backend_et a(22);\n      constexpr unsigned_backend_et c(22);\n      constexpr int_backend_et b      = test_constexpr_compare(a);\n      constexpr unsigned_backend_et d = test_constexpr_compare(c);\n      static_assert(b == 95);\n      static_assert(d == 95);\n   }\n   std::cout << \"Done!\" << std::endl;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/constexpr_test_cpp_int.cpp",
    "content": "//  (C) Copyright John Maddock 2019.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include \"constexpr_arithmetric_test.hpp\"\n#include \"boost/multiprecision/cpp_int.hpp\"\n#include \"test.hpp\"\n\n#if !defined(BOOST_MP_NO_CONSTEXPR_DETECTION) && !defined(DISABLE_TESTS)\n\ntemplate <class F, class V>\ndecltype(std::declval<F>()(std::declval<V>())) non_constexpr_invoke(F f, V v)\n{\n   return f(v);\n}\n\nint main()\n{\n   typedef boost::multiprecision::int256_t  int_backend;\n   typedef boost::multiprecision::uint256_t unsigned_backend;\n\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_add_subtract(a);\n      constexpr unsigned_backend d = test_constexpr_add_subtract(c);\n\n      constexpr long long llv = (long long)b;\n\n      static_assert(b == -108);\n      static_assert(d == 554);\n      static_assert(llv == -108);\n\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_add_subtract<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_add_subtract<unsigned_backend>, c));\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_mul_divide(a);\n      constexpr unsigned_backend d = test_constexpr_mul_divide(c);\n      static_assert(b == 22);\n      static_assert(d == 22);\n\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_mul_divide<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_mul_divide<unsigned_backend>, c));\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_bitwise(a);\n      constexpr unsigned_backend d = test_constexpr_bitwise(c);\n#ifdef BOOST_HAS_INT128\n      static_assert(b == 230);\n      static_assert(d == 120);\n#else\n      static_assert(b == 210);\n      static_assert(d == 106);\n#endif\n\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_bitwise<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_bitwise<unsigned_backend>, c));\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b = test_constexpr_logical(a);\n      constexpr unsigned_backend d = test_constexpr_logical(c);\n#ifdef BOOST_HAS_INT128\n      //static_assert(b == 95);\n      //static_assert(d == 95);\n#else\n      static_assert(b == 82);\n      static_assert(d == 82);\n#endif\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_logical<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_logical<unsigned_backend>, c));\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_compare(a);\n      constexpr unsigned_backend d = test_constexpr_compare(c);\n#ifdef BOOST_HAS_INT128\n      static_assert(b == 95);\n      static_assert(d == 95);\n#else\n      static_assert(b == 95);\n      static_assert(d == 95);\n#endif\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_compare<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_compare<unsigned_backend>, c));\n   }\n   return boost::report_errors();\n}\n#else\nint main() {}\n#endif\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/constexpr_test_cpp_int_2.cpp",
    "content": "//  (C) Copyright John Maddock 2019.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/config.hpp>\n#undef BOOST_HAS_INT128\n#include \"constexpr_arithmetric_test.hpp\"\n#include \"boost/multiprecision/cpp_int.hpp\"\n#include \"test.hpp\"\n\n#if !defined(BOOST_MP_NO_CONSTEXPR_DETECTION) && !defined(DISABLE_TESTS)\n\ntemplate <class F, class V>\ndecltype(std::declval<F>()(std::declval<V>())) non_constexpr_invoke(F f, V v)\n{\n   return f(v);\n}\n\nint main()\n{\n   typedef boost::multiprecision::int128_t  int_backend;\n   typedef boost::multiprecision::uint128_t unsigned_backend;\n\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_add_subtract(a);\n      constexpr unsigned_backend d = test_constexpr_add_subtract(c);\n\n      constexpr long long llv = (long long)b;\n\n      static_assert(b == -108);\n      static_assert(d == 554);\n      static_assert(llv == -108);\n\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_add_subtract<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_add_subtract<unsigned_backend>, c));\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_mul_divide(a);\n      constexpr unsigned_backend d = test_constexpr_mul_divide(c);\n      static_assert(b == 22);\n      static_assert(d == 22);\n\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_mul_divide<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_mul_divide<unsigned_backend>, c));\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_bitwise(a);\n      constexpr unsigned_backend d = test_constexpr_bitwise(c);\n#ifdef BOOST_HAS_INT128\n      static_assert(b == 230);\n      static_assert(d == 120);\n#else\n      static_assert(b == 210);\n      static_assert(d == 106);\n#endif\n\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_bitwise<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_bitwise<unsigned_backend>, c));\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b = test_constexpr_logical(a);\n      constexpr unsigned_backend d = test_constexpr_logical(c);\n#ifdef BOOST_HAS_INT128\n      //static_assert(b == 95);\n      //static_assert(d == 95);\n#else\n      static_assert(b == 82);\n      static_assert(d == 82);\n#endif\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_logical<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_logical<unsigned_backend>, c));\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_compare(a);\n      constexpr unsigned_backend d = test_constexpr_compare(c);\n#ifdef BOOST_HAS_INT128\n      static_assert(b == 95);\n      static_assert(d == 95);\n#else\n      static_assert(b == 95);\n      static_assert(d == 95);\n#endif\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_compare<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_compare<unsigned_backend>, c));\n   }\n   return boost::report_errors();\n}\n#else\nint main(){}\n#endif\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/constexpr_test_cpp_int_3.cpp",
    "content": "//  (C) Copyright John Maddock 2019.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include \"constexpr_arithmetric_test.hpp\"\n#include \"boost/multiprecision/cpp_int.hpp\"\n#include \"test.hpp\"\n\n#if !defined(BOOST_MP_NO_CONSTEXPR_DETECTION) && !defined(DISABLE_TESTS)\n\ntemplate <class F, class V>\ndecltype(std::declval<F>()(std::declval<V>())) non_constexpr_invoke(F f, V v)\n{\n   return f(v);\n}\n\nint main()\n{\n   typedef boost::multiprecision::checked_int256_t  int_backend;\n   typedef boost::multiprecision::checked_uint256_t unsigned_backend;\n\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_add_subtract(a);\n      constexpr unsigned_backend d = test_constexpr_add_subtract(c);\n\n      constexpr long long llv = (long long)b;\n\n      static_assert(b == -108);\n      static_assert(d == 554);\n      static_assert(llv == -108);\n\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_add_subtract<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_add_subtract<unsigned_backend>, c));\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_mul_divide(a);\n      constexpr unsigned_backend d = test_constexpr_mul_divide(c);\n      static_assert(b == 22);\n      static_assert(d == 22);\n\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_mul_divide<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_mul_divide<unsigned_backend>, c));\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_bitwise(a);\n      constexpr unsigned_backend d = test_constexpr_bitwise(c);\n#ifdef BOOST_HAS_INT128\n      static_assert(b == 230);\n      static_assert(d == 120);\n#else\n      static_assert(b == 210);\n      static_assert(d == 106);\n#endif\n\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_bitwise<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_bitwise<unsigned_backend>, c));\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b = test_constexpr_logical(a);\n      constexpr unsigned_backend d = test_constexpr_logical(c);\n#ifdef BOOST_HAS_INT128\n      //static_assert(b == 95);\n      //static_assert(d == 95);\n#else\n      static_assert(b == 82);\n      static_assert(d == 82);\n#endif\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_logical<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_logical<unsigned_backend>, c));\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_compare(a);\n      constexpr unsigned_backend d = test_constexpr_compare(c);\n#ifdef BOOST_HAS_INT128\n      static_assert(b == 95);\n      static_assert(d == 95);\n#else\n      static_assert(b == 95);\n      static_assert(d == 95);\n#endif\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_compare<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_compare<unsigned_backend>, c));\n   }\n   return boost::report_errors();\n}\n#else\nint main(){}\n#endif\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/constexpr_test_cpp_int_4.cpp",
    "content": "//  (C) Copyright John Maddock 2019.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include \"constexpr_arithmetric_test.hpp\"\n#include \"boost/multiprecision/cpp_int.hpp\"\n#include \"test.hpp\"\n\ntemplate <class F, class V>\ndecltype(std::declval<F>()(std::declval<V>())) non_constexpr_invoke(F f, V v)\n{\n   return f(v);\n}\n\nint main()\n{\n   typedef boost::multiprecision::checked_int128_t  int_backend;\n   typedef boost::multiprecision::checked_uint128_t unsigned_backend;\n\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_add_subtract(a);\n      constexpr unsigned_backend d = test_constexpr_add_subtract(c);\n\n      constexpr long long llv = (long long)b;\n\n      static_assert(b == -108);\n      static_assert(d == 554);\n      static_assert(llv == -108);\n\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_add_subtract<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_add_subtract<unsigned_backend>, c));\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_mul_divide(a);\n      constexpr unsigned_backend d = test_constexpr_mul_divide(c);\n      static_assert(b == 22);\n      static_assert(d == 22);\n\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_mul_divide<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_mul_divide<unsigned_backend>, c));\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_bitwise(a);\n      constexpr unsigned_backend d = test_constexpr_bitwise(c);\n#ifdef BOOST_HAS_INT128\n      static_assert(b == 230);\n      static_assert(d == 120);\n#else\n      static_assert(b == 210);\n      static_assert(d == 106);\n#endif\n\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_bitwise<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_bitwise<unsigned_backend>, c));\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b = test_constexpr_logical(a);\n      constexpr unsigned_backend d = test_constexpr_logical(c);\n#ifdef BOOST_HAS_INT128\n      //static_assert(b == 95);\n      //static_assert(d == 95);\n#else\n      static_assert(b == 82);\n      static_assert(d == 82);\n#endif\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_logical<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_logical<unsigned_backend>, c));\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_compare(a);\n      constexpr unsigned_backend d = test_constexpr_compare(c);\n#ifdef BOOST_HAS_INT128\n      static_assert(b == 95);\n      static_assert(d == 95);\n#else\n      static_assert(b == 95);\n      static_assert(d == 95);\n#endif\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_compare<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_compare<unsigned_backend>, c));\n   }\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/constexpr_test_cpp_int_5.cpp",
    "content": "//  (C) Copyright John Maddock 2019.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n// Contains Quickbook markup, using in Boost.Multiprecision.qbk section on Literals and constexpr, penultimate section on factorials.\n\n#include \"constexpr_arithmetric_test.hpp\"\n#include \"boost/multiprecision/cpp_int.hpp\"\n#include \"boost/multiprecision/integer.hpp\"\n#include \"test.hpp\"\n\ntemplate <class F, class V>\ndecltype(std::declval<F>()(std::declval<V>())) non_constexpr_invoke(F f, V v)\n{\n   return f(v);\n}\n\n//[factorial_decl\ntemplate <class T>\nconstexpr T factorial(const T& a)\n{\n   return a ? a * factorial(a - 1) : 1;\n}\n//]\n\ntemplate <class T, class U>\nconstexpr T big_mul(const U& a, const U& b)\n{\n   using boost::multiprecision::multiply;\n   T result = T();\n   multiply(result, a, b);\n   return result;\n}\ntemplate <class T, class U>\nconstexpr T big_add(const U& a, const U& b)\n{\n   using boost::multiprecision::add;\n   T result = T();\n   add(result, a, b);\n   return result;\n}\ntemplate <class T, class U>\nconstexpr T big_sub(const U& a, const U& b)\n{\n   using boost::multiprecision::subtract;\n   T result = T();\n   subtract(result, a, b);\n   return result;\n}\ntemplate <class U>\nconstexpr U div_qr_d(const U& a, const U& b)\n{\n   using boost::multiprecision::divide_qr;\n   U result = U();\n   U r      = U();\n   divide_qr(a, b, result, r);\n   return result;\n}\ntemplate <class U>\nconstexpr U div_qr_r(const U& a, const U& b)\n{\n   using boost::multiprecision::divide_qr;\n   U result = U();\n   U r      = U();\n   divide_qr(a, b, result, r);\n   return r;\n}\ntemplate <class T>\nconstexpr T do_bit_set(T val, unsigned pos)\n{\n   using boost::multiprecision::bit_set;\n   bit_set(val, pos);\n   return val;\n}\ntemplate <class T>\nconstexpr T do_bit_unset(T val, unsigned pos)\n{\n   using boost::multiprecision::bit_unset;\n   bit_unset(val, pos);\n   return val;\n}\ntemplate <class T>\nconstexpr T do_bit_flip(T val, unsigned pos)\n{\n   using boost::multiprecision::bit_flip;\n   bit_flip(val, pos);\n   return val;\n}\ntemplate <class T>\nconstexpr T test_swap(T a, T b)\n{\n   swap(a, b);\n   a.swap(b);\n   return a;\n}\n\nint main()\n{\n   using namespace boost::multiprecision::literals;\n\n   typedef boost::multiprecision::checked_int1024_t  int_backend;\n   typedef boost::multiprecision::checked_int512_t   small_int_backend;\n   typedef boost::multiprecision::checked_uint1024_t unsigned_backend;\n\n   constexpr int_backend f1 = factorial(int_backend(31));\n   static_assert(f1 == 0x1956ad0aae33a4560c5cd2c000000_cppi);\n   constexpr unsigned_backend f2 = factorial(unsigned_backend(31));\n   static_assert(f2 == 0x1956ad0aae33a4560c5cd2c000000_cppui);\n\n   //\n   // Test integer non-member functions:\n   //\n   constexpr small_int_backend si1 = (std::numeric_limits<small_int_backend>::max)();\n   constexpr small_int_backend si2 = 239876;\n   constexpr std::int32_t i        = (std::numeric_limits<int>::max)();\n   constexpr std::int32_t j        = 239876;\n   // Multiply:\n   {\n      constexpr int_backend i1 = big_mul<int_backend>(si1, si2);\n      int_backend           nc;\n      multiply(nc, si1, si2);\n      BOOST_CHECK_EQUAL(nc, i1);\n\n      constexpr std::int64_t k = big_mul<std::int64_t>(i, j);\n      std::int64_t           ii;\n      boost::multiprecision::multiply(ii, i, j);\n      BOOST_CHECK_EQUAL(ii, k);\n   }\n   // Add:\n   {\n      constexpr int_backend i1 = big_add<int_backend>(si1, si2);\n      int_backend           nc;\n      add(nc, si1, si2);\n      BOOST_CHECK_EQUAL(nc, i1);\n\n      constexpr std::int64_t k = big_add<std::int64_t>(i, j);\n      std::int64_t           ii;\n      boost::multiprecision::add(ii, i, j);\n      BOOST_CHECK_EQUAL(ii, k);\n   }\n   // Subtract:\n   {\n      constexpr int_backend i1 = big_sub<int_backend>(si1, -si2);\n      int_backend           nc;\n      subtract(nc, si1, -si2);\n      BOOST_CHECK_EQUAL(nc, i1);\n\n      constexpr std::int64_t k = big_sub<std::int64_t>(i, -j);\n      std::int64_t           ii;\n      boost::multiprecision::subtract(ii, i, -j);\n      BOOST_CHECK_EQUAL(ii, k);\n   }\n   // divide_qr:\n   {\n      constexpr small_int_backend i1 = div_qr_d(si1, si2);\n      small_int_backend           nc, nc2;\n      divide_qr(si1, si2, nc, nc2);\n      BOOST_CHECK_EQUAL(nc, i1);\n\n      constexpr std::int64_t k = div_qr_d(i, j);\n      std::int32_t           ii, ij;\n      boost::multiprecision::divide_qr(i, j, ii, ij);\n      BOOST_CHECK_EQUAL(ii, k);\n   }\n   // divide_qr:\n   {\n      constexpr small_int_backend i1 = div_qr_r(si1, si2);\n      small_int_backend           nc, nc2;\n      divide_qr(si1, si2, nc, nc2);\n      BOOST_CHECK_EQUAL(nc2, i1);\n\n      constexpr std::int64_t k = div_qr_r(i, j);\n      std::int32_t           ii, ij;\n      boost::multiprecision::divide_qr(i, j, ii, ij);\n      BOOST_CHECK_EQUAL(ij, k);\n   }\n   // integer_modulus:\n   {\n      constexpr int     i1 = integer_modulus(si1, 67);\n      small_int_backend nc(si1);\n      int               r = integer_modulus(nc, 67);\n      BOOST_CHECK_EQUAL(r, i1);\n\n      constexpr std::int32_t k = boost::multiprecision::integer_modulus(i, j);\n      std::int32_t           ii(i);\n      r = boost::multiprecision::integer_modulus(ii, j);\n      BOOST_CHECK_EQUAL(r, k);\n   }\n   // powm:\n   {\n      constexpr small_int_backend i1 = powm(si1, si2, si2);\n      small_int_backend           nc(si1);\n      nc = powm(nc, si2, si2);\n      BOOST_CHECK_EQUAL(nc, i1);\n\n      constexpr std::int32_t k = boost::multiprecision::powm(i, j, j);\n      std::int32_t           ii(i);\n      ii = boost::multiprecision::powm(ii, j, j);\n      BOOST_CHECK_EQUAL(ii, k);\n   }\n   // lsb:\n   {\n      constexpr std::size_t i1 = lsb(si1);\n      small_int_backend nc(si1);\n      std::size_t nci = lsb(nc);\n      BOOST_CHECK_EQUAL(nci, i1);\n\n      constexpr std::size_t k = boost::multiprecision::lsb(i);\n      std::size_t ii(i);\n      ii = boost::multiprecision::lsb(ii);\n      BOOST_CHECK_EQUAL(ii, k);\n   }\n   // msb:\n   {\n      constexpr std::size_t i1 = msb(si1);\n      small_int_backend nc(si1);\n      std::size_t nci = msb(nc);\n      BOOST_CHECK_EQUAL(nci, i1);\n\n      constexpr std::size_t k = boost::multiprecision::msb(i);\n      std::size_t ii(i);\n      ii = boost::multiprecision::msb(ii);\n      BOOST_CHECK_EQUAL(ii, k);\n   }\n   // bit_test:\n   {\n      constexpr bool b = bit_test(si1, 1);\n      static_assert(b);\n\n      constexpr bool k = boost::multiprecision::bit_test(i, 1);\n      static_assert(k);\n   }\n   // bit_set:\n   {\n      constexpr int_backend i(0);\n      constexpr int_backend j = do_bit_set(i, 20);\n      static_assert(bit_test(j, 20));\n\n      constexpr int ii(0);\n      constexpr int jj = do_bit_set(ii, 20);\n      static_assert(boost::multiprecision::bit_test(jj, 20));\n   }\n   // bit_unset:\n   {\n      constexpr int_backend r = do_bit_unset(si1, 20);\n      static_assert(bit_test(r, 20) == false);\n\n      constexpr int jj = do_bit_unset(i, 20);\n      static_assert(boost::multiprecision::bit_test(jj, 20) == false);\n   }\n   // bit_unset:\n   {\n      constexpr int_backend r = do_bit_flip(si1, 20);\n      static_assert(bit_test(r, 20) == false);\n\n      constexpr int jj = do_bit_flip(i, 20);\n      static_assert(boost::multiprecision::bit_test(jj, 20) == false);\n   }\n   // sqrt:\n   {\n      constexpr int_backend r = sqrt(si1);\n      small_int_backend     nc(si1);\n      nc = sqrt(nc);\n      BOOST_CHECK_EQUAL(nc, r);\n      constexpr int_backend r2 = sqrt(si1 * 1);\n      BOOST_CHECK_EQUAL(nc, r2);\n\n      constexpr int jj = boost::multiprecision::sqrt(i);\n      int           k  = i;\n      k                = boost::multiprecision::sqrt(k);\n      BOOST_CHECK_EQUAL(jj, k);\n   }\n   {\n      // swap:\n      constexpr small_int_backend r = test_swap(si1, si2);\n      static_assert(si1 == r);\n   }\n   {\n      // gcd:\n      constexpr int_backend i(si1), j(si1 / 3);\n      constexpr int_backend k = gcd(i, j);\n\n      int_backend ii(i), jj(j);\n      BOOST_CHECK_EQUAL(k, gcd(ii, jj));\n\n      constexpr unsigned_backend ui(i), uj(j);\n      constexpr unsigned_backend uk = gcd(ui, uj);\n      unsigned_backend           uii(ui), ujj(uj);\n      BOOST_CHECK_EQUAL(uk, gcd(uii, ujj));\n\n      constexpr int_backend l = lcm(i, j);\n      BOOST_CHECK_EQUAL(l, lcm(ii, jj));\n      constexpr unsigned_backend ul = lcm(ui, uj);\n      BOOST_CHECK_EQUAL(ul, lcm(uii, ujj));\n   }\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/constexpr_test_cpp_int_6.cpp",
    "content": "//  (C) Copyright John Maddock 2019.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include \"boost/multiprecision/cpp_int.hpp\"\n#include \"test.hpp\"\n\ntemplate <class T, unsigned Order>\nstruct const_polynomial\n{\n public:\n   T data[Order + 1];\n\n public:\n   constexpr const_polynomial(T val = 0) : data{val} {}\n   constexpr const_polynomial(const const_polynomial&) = default;\n   constexpr const_polynomial(const std::initializer_list<T>& init) : data{}\n   {\n      if (init.size() > Order + 1)\n         throw std::range_error(\"Too many initializers in list\");\n      for (unsigned i = 0; i < init.size(); ++i)\n         data[i] = init.begin()[i];\n   }\n   constexpr T& operator[](std::size_t N)\n   {\n      return data[N];\n   }\n   constexpr const T& operator[](std::size_t N) const\n   {\n      return data[N];\n   }\n   template <class U>\n   constexpr T operator()(U val) const\n   {\n      T result = data[Order];\n      for (unsigned i = Order; i > 0; --i)\n      {\n         result *= val;\n         result += data[i - 1];\n      }\n      return result;\n   }\n   constexpr const_polynomial<T, Order - 1> derivative() const\n   {\n      const_polynomial<T, Order - 1> result;\n      for (unsigned i = 1; i <= Order; ++i)\n      {\n         result[i - 1] = (*this)[i] * i;\n      }\n      return result;\n   }\n   constexpr const_polynomial operator-()\n   {\n      const_polynomial t(*this);\n      for (unsigned i = 0; i <= Order; ++i)\n         t[i] = -t[i];\n      return t;\n   }\n   template <class U>\n   constexpr const_polynomial& operator*=(U val)\n   {\n      for (unsigned i = 0; i <= Order; ++i)\n         data[i] = data[i] * val;\n      return *this;\n   }\n   template <class U>\n   constexpr const_polynomial& operator/=(U val)\n   {\n      for (unsigned i = 0; i <= Order; ++i)\n         data[i] = data[i] / val;\n      return *this;\n   }\n   template <class U>\n   constexpr const_polynomial& operator+=(U val)\n   {\n      data[0] += val;\n      return *this;\n   }\n   template <class U>\n   constexpr const_polynomial& operator-=(U val)\n   {\n      data[0] -= val;\n      return *this;\n   }\n};\n\ntemplate <class T, unsigned Order1, unsigned Order2>\ninline constexpr const_polynomial<T, (Order1 > Order2 ? Order1 : Order2)> operator+(const const_polynomial<T, Order1>& a, const const_polynomial<T, Order2>& b)\n{\n   if\n      constexpr(Order1 > Order2)\n      {\n         const_polynomial<T, Order1> result(a);\n         for (unsigned i = 0; i <= Order2; ++i)\n            result[i] += b[i];\n         return result;\n      }\n   else\n   {\n      const_polynomial<T, Order2> result(b);\n      for (unsigned i = 0; i <= Order1; ++i)\n         result[i] += a[i];\n      return result;\n   }\n}\ntemplate <class T, unsigned Order1, unsigned Order2>\ninline constexpr const_polynomial<T, (Order1 > Order2 ? Order1 : Order2)> operator-(const const_polynomial<T, Order1>& a, const const_polynomial<T, Order2>& b)\n{\n   if\n      constexpr(Order1 > Order2)\n      {\n         const_polynomial<T, Order1> result(a);\n         for (unsigned i = 0; i <= Order2; ++i)\n            result[i] -= b[i];\n         return result;\n      }\n   else\n   {\n      const_polynomial<T, Order2> result(b);\n      for (unsigned i = 0; i <= Order1; ++i)\n         result[i] = a[i] - b[i];\n      return result;\n   }\n}\ntemplate <class T, unsigned Order1, unsigned Order2>\ninline constexpr const_polynomial<T, Order1 + Order2> operator*(const const_polynomial<T, Order1>& a, const const_polynomial<T, Order2>& b)\n{\n   const_polynomial<T, Order1 + Order2> result;\n   for (unsigned i = 0; i <= Order1; ++i)\n   {\n      for (unsigned j = 0; j <= Order2; ++j)\n      {\n         result[i + j] += a[i] * b[j];\n      }\n   }\n   return result;\n}\ntemplate <class T, unsigned Order, class U>\ninline constexpr const_polynomial<T, Order> operator*(const const_polynomial<T, Order>& a, const U& b)\n{\n   const_polynomial<T, Order> result(a);\n   for (unsigned i = 0; i <= Order; ++i)\n   {\n      result[i] *= b;\n   }\n   return result;\n}\ntemplate <class U, class T, unsigned Order>\ninline constexpr const_polynomial<T, Order> operator*(const U& b, const const_polynomial<T, Order>& a)\n{\n   const_polynomial<T, Order> result(a);\n   for (unsigned i = 0; i <= Order; ++i)\n   {\n      result[i] *= b;\n   }\n   return result;\n}\ntemplate <class T, unsigned Order, class U>\ninline constexpr const_polynomial<T, Order> operator/(const const_polynomial<T, Order>& a, const U& b)\n{\n   const_polynomial<T, Order> result;\n   for (unsigned i = 0; i <= Order; ++i)\n   {\n      result[i] /= b;\n   }\n   return result;\n}\n\ntemplate <class T, unsigned Order>\nclass hermite_polynomial\n{\n   const_polynomial<T, Order> m_data;\n\n public:\n   constexpr hermite_polynomial() : m_data(hermite_polynomial<T, Order - 1>().data() * const_polynomial<T, 1>{0, 2} - hermite_polynomial<T, Order - 1>().data().derivative())\n   {\n   }\n   constexpr const const_polynomial<T, Order>& data() const\n   {\n      return m_data;\n   }\n   constexpr const T& operator[](std::size_t N) const\n   {\n      return m_data[N];\n   }\n   template <class U>\n   constexpr T operator()(U val) const\n   {\n      return m_data(val);\n   }\n};\n\ntemplate <class T>\nclass hermite_polynomial<T, 0>\n{\n   const_polynomial<T, 0> m_data;\n\n public:\n   constexpr       hermite_polynomial() : m_data{1} {}\n   constexpr const const_polynomial<T, 0>& data() const\n   {\n      return m_data;\n   }\n   constexpr const T& operator[](std::size_t N) const\n   {\n      return m_data[N];\n   }\n   template <class U>\n   constexpr T operator()(U val)\n   {\n      return m_data(val);\n   }\n};\n\ntemplate <class T>\nclass hermite_polynomial<T, 1>\n{\n   const_polynomial<T, 1> m_data;\n\n public:\n   constexpr       hermite_polynomial() : m_data{0, 2} {}\n   constexpr const const_polynomial<T, 1>& data() const\n   {\n      return m_data;\n   }\n   constexpr const T& operator[](std::size_t N) const\n   {\n      return m_data[N];\n   }\n   template <class U>\n   constexpr T operator()(U val)\n   {\n      return m_data(val);\n   }\n};\n\n\n\nint main()\n{\n   using namespace boost::multiprecision::literals;\n\n   typedef boost::multiprecision::checked_int1024_t  int_backend;\n\n   // 8192 x^13 - 319488 x^11 + 4392960 x^9 - 26357760 x^7 + 69189120 x^5 - 69189120 x^3 + 17297280 x\n   constexpr hermite_polynomial<int_backend, 13> h;\n\n   static_assert(h[0] == 0);\n   static_assert(h[1] == 17297280);\n   static_assert(h[2] == 0);\n   static_assert(h[3] == -69189120);\n   static_assert(h[4] == 0);\n   static_assert(h[5] == 69189120);\n   static_assert(h[6] == 0);\n   static_assert(h[7] == -26357760);\n   static_assert(h[8] == 0);\n   static_assert(h[9] == 4392960);\n   static_assert(h[10] == 0);\n   static_assert(h[11] == -319488);\n   static_assert(h[12] == 0);\n   static_assert(h[13] == 8192);\n\n   return boost::report_errors();\n}\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/constexpr_test_cpp_int_7.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt).\n\n// Contains Quickbook snippets used by boost/libs/multiprecision/doc/multiprecision.qbk,\n// used in section Literal Types and constexpr Support, last example on constexpr randoms.\n\n// A implementation and demonstration of the Keep It Simple Stupid random number generator algorithm https://en.wikipedia.org/wiki/KISS_(algorithm) for cpp_int integers.\n// b2 --abbreviate-paths toolset=clang-9.0.0 address-model=64 cxxstd=2a release misc > multiprecision_clang_misc.log\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include <iostream>\n\nstruct kiss_rand\n{\n   typedef std::uint64_t result_type;\n\n   constexpr kiss_rand() : x(0x8207ebe160468b32uLL), y(0x2871283e01d45bbduLL), z(0x9c80bfd5db9680c9uLL), c(0x2e2683c2abb878b8uLL) {}\n   constexpr kiss_rand(std::uint64_t seed) : x(seed), y(0x2871283e01d45bbduLL), z(0x9c80bfd5db9680c9uLL), c(0x2e2683c2abb878b8uLL) {}\n   constexpr kiss_rand(std::uint64_t seed_x, std::uint64_t seed_y) : x(seed_x), y(seed_y), z(0x9c80bfd5db9680c9uLL), c(0x2e2683c2abb878b8uLL) {}\n   constexpr kiss_rand(std::uint64_t seed_x, std::uint64_t seed_y, std::uint64_t seed_z) : x(seed_x), y(seed_y), z(seed_z), c(0x2e2683c2abb878b8uLL) {}\n\n   constexpr std::uint64_t operator()()\n   {\n      return MWC() + XSH() + CNG();\n   }\n\n private:\n   constexpr std::uint64_t MWC()\n   {\n      std::uint64_t t = (x << 58) + c;\n      c               = (x >> 6);\n      x += t;\n      c += (x < t);\n      return x;\n   }\n   constexpr std::uint64_t XSH()\n   {\n      y ^= (y << 13);\n      y ^= (y >> 17);\n      return y ^= (y << 43);\n   }\n   constexpr std::uint64_t CNG()\n   {\n      return z = 6906969069LL * z + 1234567;\n   }\n   std::uint64_t x, y, z, c;\n};\n\ninline constexpr void hash_combine(std::uint64_t& h, std::uint64_t k)\n{\n   constexpr const std::uint64_t m = 0xc6a4a7935bd1e995uLL;\n   constexpr const int           r = 47;\n\n   k *= m;\n   k ^= k >> r;\n   k *= m;\n\n   h ^= k;\n   h *= m;\n\n   // Completely arbitrary number, to prevent 0's from hashing to 0.\n   h += 0xe6546b64;\n}\n\ntemplate <std::size_t N>\ninline constexpr std::uint64_t string_to_hash(const char (&s)[N])\n{\n   std::uint64_t hash(0);\n   for (unsigned i = 0; i < N; ++i)\n      hash_combine(hash, s[i]);\n   return hash;\n}\n\ntemplate <class UnsignedInteger>\nstruct multiprecision_generator\n{\n   typedef UnsignedInteger result_type;\n   constexpr               multiprecision_generator(std::uint64_t seed1) : m_gen64(seed1) {}\n   constexpr               multiprecision_generator(std::uint64_t seed1, std::uint64_t seed2) : m_gen64(seed1, seed2) {}\n   constexpr               multiprecision_generator(std::uint64_t seed1, std::uint64_t seed2, std::uint64_t seed3) : m_gen64(seed1, seed2, seed3) {}\n\n   static constexpr result_type (min)()\n   {\n      return 0u;\n   }\n   static constexpr result_type (max)()\n   {\n      return ~result_type(0u);\n   }\n   constexpr result_type operator()()\n   {\n      result_type result(m_gen64());\n      unsigned    digits = 64;\n      while (digits < std::numeric_limits<result_type>::digits)\n      {\n         result <<= 64;\n         result |= m_gen64();\n         digits += 64;\n      }\n      return result;\n   }\n\n private:\n   kiss_rand m_gen64;\n};\n\ntemplate <class UnsignedInteger>\nconstexpr UnsignedInteger nth_random_value(unsigned count = 0)\n{\n   std::uint64_t                             date_hash = string_to_hash(__DATE__);\n   std::uint64_t                             time_hash = string_to_hash(__TIME__);\n   multiprecision_generator<UnsignedInteger> big_gen(date_hash, time_hash);\n   for (unsigned i = 0; i < count; ++i)\n      big_gen();\n   return big_gen();\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n//[random_constexpr_cppint\n   constexpr uint1024_t rand = nth_random_value<uint1024_t>(1000);\n   std::cout << std::hex << rand << std::endl;\n//] [/random_constexpr_cppint]\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/constexpr_test_float128.cpp",
    "content": "//  (C) Copyright John Maddock 2019.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include \"constexpr_arithmetric_test.hpp\"\n#include <boost/multiprecision/float128.hpp>\n#include <iostream>\n\nint main()\n{\n   using boost::multiprecision::float128;\n\n   {\n      constexpr float128 a(22);\n      constexpr float128 b = test_constexpr_add_subtract(a);\n\n      constexpr __float128 f128 = (__float128)b;\n      static_assert(f128 == -108.0f);\n\n      constexpr int i = (int)b;\n      static_assert(i == -108);\n\n      constexpr short s = (short)b;\n      static_assert(s == -108);\n   }\n   {\n      constexpr float128 a(22);\n      constexpr float128 b = test_constexpr_mul_divide(a);\n      static_assert((__float128)b == 0);\n   }\n   {\n      constexpr float128 a(22);\n      constexpr float128 b = test_constexpr_compare(a);\n      static_assert((__float128)b == 119);\n   }\n   {\n      constexpr float128 a(0);\n      static_assert(fpclassify(a) == FP_ZERO);\n      constexpr float128 b(1);\n      static_assert(fpclassify(b) == FP_NORMAL);\n      constexpr float128 c(-1);\n      static_assert(fpclassify(c) == FP_NORMAL);\n      static_assert(abs(c) >= 0);\n      static_assert(fabs(c) >= 0);\n      constexpr float128 d(std::numeric_limits<float128>::epsilon());\n      static_assert(fpclassify(c) == FP_NORMAL);\n      constexpr float128 e((std::numeric_limits<float128>::min)());\n      static_assert(fpclassify(e) == FP_NORMAL);\n      constexpr float128 f((std::numeric_limits<float128>::max)());\n      static_assert(fpclassify(f) == FP_NORMAL);\n      constexpr float128 g(std::numeric_limits<float128>::lowest());\n      static_assert(fpclassify(g) == FP_NORMAL);\n      constexpr float128 h(std::numeric_limits<float128>::round_error());\n      static_assert(fpclassify(h) == FP_NORMAL);\n      constexpr float128 i(std::numeric_limits<float128>::denorm_min());\n      static_assert(fpclassify(i) == FP_SUBNORMAL);\n      constexpr float128 j(-std::numeric_limits<float128>::denorm_min());\n      static_assert(fpclassify(j) == FP_SUBNORMAL);\n      constexpr float128 k(std::numeric_limits<float128>::infinity());\n      static_assert(fpclassify(k) == FP_INFINITE);\n      static_assert(isinf(k));\n      static_assert(!isnan(k));\n      constexpr float128 l(-std::numeric_limits<float128>::infinity());\n      static_assert(fpclassify(l) == FP_INFINITE);\n      static_assert(isinf(l));\n      static_assert(!isnan(l));\n   }\n   std::cout << \"Done!\" << std::endl;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/eigen.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/eigen.hpp>\n#include <iostream>\n#include <Eigen/Dense>\n#include \"test.hpp\"\n\nusing namespace Eigen;\n\ntemplate <class T>\nstruct related_number\n{\n   typedef T type;\n};\n\ntemplate <class Num>\nvoid example1()\n{\n   // expected results first:\n   Matrix<Num, 2, 2> r1, r2;\n   r1 << 3, 5, 4, 8;\n   r2 << -1, -1, 2, 0;\n   Matrix<Num, 3, 1> r3;\n   r3 << -1, -4, -6;\n\n   Matrix<Num, 2, 2> a;\n   a << 1, 2, 3, 4;\n   Matrix<Num, Dynamic, Dynamic> b(2, 2);\n   b << 2, 3, 1, 4;\n   std::cout << \"a + b =\\n\"\n             << a + b << std::endl;\n   BOOST_CHECK_EQUAL(a + b, r1);\n   std::cout << \"a - b =\\n\"\n             << a - b << std::endl;\n   BOOST_CHECK_EQUAL(a - b, r2);\n   std::cout << \"Doing a += b;\" << std::endl;\n   a += b;\n   std::cout << \"Now a =\\n\"\n             << a << std::endl;\n   Matrix<Num, 3, 1> v(1, 2, 3);\n   Matrix<Num, 3, 1> w(1, 0, 0);\n   std::cout << \"-v + w - v =\\n\"\n             << -v + w - v << std::endl;\n   BOOST_CHECK_EQUAL(-v + w - v, r3);\n}\n\ntemplate <class Num>\nvoid example2()\n{\n   Matrix<Num, 2, 2> a;\n   a << 1, 2, 3, 4;\n   Matrix<Num, 3, 1> v(1, 2, 3);\n   std::cout << \"a * 2.5 =\\n\"\n             << a * 2.5 << std::endl;\n   std::cout << \"0.1 * v =\\n\"\n             << 0.1 * v << std::endl;\n   std::cout << \"Doing v *= 2;\" << std::endl;\n   v *= 2;\n   std::cout << \"Now v =\\n\"\n             << v << std::endl;\n   Num n(4);\n   std::cout << \"Doing v *= Num;\" << std::endl;\n   v *= n;\n   std::cout << \"Now v =\\n\"\n             << v << std::endl;\n   typedef typename related_number<Num>::type related_type;\n   related_type                               r(6);\n   std::cout << \"Doing v *= RelatedType;\" << std::endl;\n   v *= r;\n   std::cout << \"Now v =\\n\"\n             << v << std::endl;\n   std::cout << \"RelatedType * v =\\n\"\n             << r * v << std::endl;\n   std::cout << \"Doing v *= RelatedType^2;\" << std::endl;\n   v *= r * r;\n   std::cout << \"Now v =\\n\"\n             << v << std::endl;\n   std::cout << \"RelatedType^2 * v =\\n\"\n             << r * r * v << std::endl;\n}\n\ntemplate <class Num>\nvoid example3()\n{\n   using namespace std;\n   Matrix<Num, Dynamic, Dynamic> a = Matrix<Num, Dynamic, Dynamic>::Random(2, 2);\n   cout << \"Here is the matrix a\\n\"\n        << a << endl;\n   cout << \"Here is the matrix a^T\\n\"\n        << a.transpose() << endl;\n   cout << \"Here is the conjugate of a\\n\"\n        << a.conjugate() << endl;\n   cout << \"Here is the matrix a^*\\n\"\n        << a.adjoint() << endl;\n}\n\ntemplate <class Num>\nvoid example4()\n{\n   Matrix<Num, 2, 2> mat;\n   mat << 1, 2,\n       3, 4;\n   Matrix<Num, 2, 1> u(-1, 1), v(2, 0);\n   std::cout << \"Here is mat*mat:\\n\"\n             << mat * mat << std::endl;\n   std::cout << \"Here is mat*u:\\n\"\n             << mat * u << std::endl;\n   std::cout << \"Here is u^T*mat:\\n\"\n             << u.transpose() * mat << std::endl;\n   std::cout << \"Here is u^T*v:\\n\"\n             << u.transpose() * v << std::endl;\n   std::cout << \"Here is u*v^T:\\n\"\n             << u * v.transpose() << std::endl;\n   std::cout << \"Let's multiply mat by itself\" << std::endl;\n   mat = mat * mat;\n   std::cout << \"Now mat is mat:\\n\"\n             << mat << std::endl;\n}\n\ntemplate <class Num>\nvoid example5()\n{\n   using namespace std;\n   Matrix<Num, 3, 1> v(1, 2, 3);\n   Matrix<Num, 3, 1> w(0, 1, 2);\n   cout << \"Dot product: \" << v.dot(w) << endl;\n   Num dp = v.adjoint() * w; // automatic conversion of the inner product to a scalar\n   cout << \"Dot product via a matrix product: \" << dp << endl;\n   cout << \"Cross product:\\n\"\n        << v.cross(w) << endl;\n}\n\ntemplate <class Num>\nvoid example6()\n{\n   using namespace std;\n   Matrix<Num, 2, 2> mat;\n   mat << 1, 2,\n       3, 4;\n   cout << \"Here is mat.sum():       \" << mat.sum() << endl;\n   cout << \"Here is mat.prod():      \" << mat.prod() << endl;\n   cout << \"Here is mat.mean():      \" << mat.mean() << endl;\n   cout << \"Here is mat.minCoeff():  \" << mat.minCoeff() << endl;\n   cout << \"Here is mat.maxCoeff():  \" << mat.maxCoeff() << endl;\n   cout << \"Here is mat.trace():     \" << mat.trace() << endl;\n}\n\ntemplate <class Num>\nvoid example7()\n{\n   using namespace std;\n\n   Array<Num, Dynamic, Dynamic> m(2, 2);\n\n   // assign some values coefficient by coefficient\n   m(0, 0) = 1.0;\n   m(0, 1) = 2.0;\n   m(1, 0) = 3.0;\n   m(1, 1) = m(0, 1) + m(1, 0);\n\n   // print values to standard output\n   cout << m << endl\n        << endl;\n\n   // using the comma-initializer is also allowed\n   m << 1.0, 2.0,\n       3.0, 4.0;\n\n   // print values to standard output\n   cout << m << endl;\n}\n\ntemplate <class Num>\nvoid example8()\n{\n   using namespace std;\n   Array<Num, Dynamic, Dynamic> a(3, 3);\n   Array<Num, Dynamic, Dynamic> b(3, 3);\n   a << 1, 2, 3,\n       4, 5, 6,\n       7, 8, 9;\n   b << 1, 2, 3,\n       1, 2, 3,\n       1, 2, 3;\n\n   // Adding two arrays\n   cout << \"a + b = \" << endl\n        << a + b << endl\n        << endl;\n   // Subtracting a scalar from an array\n   cout << \"a - 2 = \" << endl\n        << a - 2 << endl;\n}\n\ntemplate <class Num>\nvoid example9()\n{\n   using namespace std;\n   Array<Num, Dynamic, Dynamic> a(2, 2);\n   Array<Num, Dynamic, Dynamic> b(2, 2);\n   a << 1, 2,\n       3, 4;\n   b << 5, 6,\n       7, 8;\n   cout << \"a * b = \" << endl\n        << a * b << endl;\n}\n\ntemplate <class Num>\nvoid example10()\n{\n   using namespace std;\n   Array<Num, Dynamic, 1> a = Array<Num, Dynamic, 1>::Random(5);\n   a *= 2;\n   cout << \"a =\" << endl\n        << a << endl;\n   cout << \"a.abs() =\" << endl\n        << a.abs() << endl;\n   cout << \"a.abs().sqrt() =\" << endl\n        << a.abs().sqrt() << endl;\n   cout << \"a.min(a.abs().sqrt()) =\" << endl\n        << (a.min)(a.abs().sqrt()) << endl;\n}\n\ntemplate <class Num>\nvoid example11()\n{\n   using namespace std;\n   Matrix<Num, Dynamic, Dynamic> m(2, 2);\n   Matrix<Num, Dynamic, Dynamic> n(2, 2);\n   Matrix<Num, Dynamic, Dynamic> result(2, 2);\n   m << 1, 2,\n       3, 4;\n   n << 5, 6,\n       7, 8;\n   result = m * n;\n   cout << \"-- Matrix m*n: --\" << endl\n        << result << endl\n        << endl;\n   result = m.array() * n.array();\n   cout << \"-- Array m*n: --\" << endl\n        << result << endl\n        << endl;\n   result = m.cwiseProduct(n);\n   cout << \"-- With cwiseProduct: --\" << endl\n        << result << endl\n        << endl;\n   result = m.array() + 4;\n   cout << \"-- Array m + 4: --\" << endl\n        << result << endl\n        << endl;\n}\n\ntemplate <class Num>\nvoid example12()\n{\n   using namespace std;\n   Matrix<Num, Dynamic, Dynamic> m(2, 2);\n   Matrix<Num, Dynamic, Dynamic> n(2, 2);\n   Matrix<Num, Dynamic, Dynamic> result(2, 2);\n   m << 1, 2,\n       3, 4;\n   n << 5, 6,\n       7, 8;\n\n   result = (m.array() + 4).matrix() * m;\n   cout << \"-- Combination 1: --\" << endl\n        << result << endl\n        << endl;\n   result = (m.array() * n.array()).matrix() * m;\n   cout << \"-- Combination 2: --\" << endl\n        << result << endl\n        << endl;\n}\n\ntemplate <class Num>\nvoid example13()\n{\n   using namespace std;\n   Matrix<Num, Dynamic, Dynamic> m(4, 4);\n   m << 1, 2, 3, 4,\n       5, 6, 7, 8,\n       9, 10, 11, 12,\n       13, 14, 15, 16;\n   cout << \"Block in the middle\" << endl;\n   cout << m.template block<2, 2>(1, 1) << endl\n        << endl;\n   for (int i = 1; i <= 3; ++i)\n   {\n      cout << \"Block of size \" << i << \"x\" << i << endl;\n      cout << m.block(0, 0, i, i) << endl\n           << endl;\n   }\n}\n\ntemplate <class Num>\nvoid example14()\n{\n   using namespace std;\n   Array<Num, 2, 2> m;\n   m << 1, 2,\n       3, 4;\n   Array<Num, 4, 4> a = Array<Num, 4, 4>::Constant(0.6);\n   cout << \"Here is the array a:\" << endl\n        << a << endl\n        << endl;\n   a.template block<2, 2>(1, 1) = m;\n   cout << \"Here is now a with m copied into its central 2x2 block:\" << endl\n        << a << endl\n        << endl;\n   a.block(0, 0, 2, 3) = a.block(2, 1, 2, 3);\n   cout << \"Here is now a with bottom-right 2x3 block copied into top-left 2x2 block:\" << endl\n        << a << endl\n        << endl;\n}\n\ntemplate <class Num>\nvoid example15()\n{\n   using namespace std;\n   Eigen::Matrix<Num, Dynamic, Dynamic> m(3, 3);\n   m << 1, 2, 3,\n       4, 5, 6,\n       7, 8, 9;\n   cout << \"Here is the matrix m:\" << endl\n        << m << endl;\n   cout << \"2nd Row: \" << m.row(1) << endl;\n   m.col(2) += 3 * m.col(0);\n   cout << \"After adding 3 times the first column into the third column, the matrix m is:\\n\";\n   cout << m << endl;\n}\n\ntemplate <class Num>\nvoid example16()\n{\n   using namespace std;\n   Matrix<Num, 4, 4> m;\n   m << 1, 2, 3, 4,\n       5, 6, 7, 8,\n       9, 10, 11, 12,\n       13, 14, 15, 16;\n   cout << \"m.leftCols(2) =\" << endl\n        << m.leftCols(2) << endl\n        << endl;\n   cout << \"m.bottomRows<2>() =\" << endl\n        << m.template bottomRows<2>() << endl\n        << endl;\n   m.topLeftCorner(1, 3) = m.bottomRightCorner(3, 1).transpose();\n   cout << \"After assignment, m = \" << endl\n        << m << endl;\n}\n\ntemplate <class Num>\nvoid example17()\n{\n   using namespace std;\n   Array<Num, Dynamic, 1> v(6);\n   v << 1, 2, 3, 4, 5, 6;\n   cout << \"v.head(3) =\" << endl\n        << v.head(3) << endl\n        << endl;\n   cout << \"v.tail<3>() = \" << endl\n        << v.template tail<3>() << endl\n        << endl;\n   v.segment(1, 4) *= 2;\n   cout << \"after 'v.segment(1,4) *= 2', v =\" << endl\n        << v << endl;\n}\n\ntemplate <class Num>\nvoid example18()\n{\n   using namespace std;\n   Matrix<Num, 2, 2> mat;\n   mat << 1, 2,\n       3, 4;\n   cout << \"Here is mat.sum():       \" << mat.sum() << endl;\n   cout << \"Here is mat.prod():      \" << mat.prod() << endl;\n   cout << \"Here is mat.mean():      \" << mat.mean() << endl;\n   cout << \"Here is mat.minCoeff():  \" << mat.minCoeff() << endl;\n   cout << \"Here is mat.maxCoeff():  \" << mat.maxCoeff() << endl;\n   cout << \"Here is mat.trace():     \" << mat.trace() << endl;\n\n   BOOST_CHECK_EQUAL(mat.sum(), 10);\n   BOOST_CHECK_EQUAL(mat.prod(), 24);\n   BOOST_CHECK_EQUAL(mat.mean(), Num(5) / 2);\n   BOOST_CHECK_EQUAL(mat.minCoeff(), 1);\n   BOOST_CHECK_EQUAL(mat.maxCoeff(), 4);\n   BOOST_CHECK_EQUAL(mat.trace(), 5);\n}\n\ntemplate <class Num>\nvoid example18a()\n{\n   using namespace std;\n   Matrix<Num, 2, 2> mat;\n   mat << 1, 2,\n       3, 4;\n   cout << \"Here is mat.sum():       \" << mat.sum() << endl;\n   cout << \"Here is mat.prod():      \" << mat.prod() << endl;\n   cout << \"Here is mat.mean():      \" << mat.mean() << endl;\n   //cout << \"Here is mat.minCoeff():  \" << mat.minCoeff() << endl;\n   //cout << \"Here is mat.maxCoeff():  \" << mat.maxCoeff() << endl;\n   cout << \"Here is mat.trace():     \" << mat.trace() << endl;\n}\n\ntemplate <class Num>\nvoid example19()\n{\n   using namespace std;\n   Matrix<Num, Dynamic, 1>       v(2);\n   Matrix<Num, Dynamic, Dynamic> m(2, 2), n(2, 2);\n\n   v << -1,\n       2;\n\n   m << 1, -2,\n       -3, 4;\n   cout << \"v.squaredNorm() = \" << v.squaredNorm() << endl;\n   cout << \"v.norm() = \" << v.norm() << endl;\n   cout << \"v.lpNorm<1>() = \" << v.template lpNorm<1>() << endl;\n   cout << \"v.lpNorm<Infinity>() = \" << v.template lpNorm<Infinity>() << endl;\n   cout << endl;\n   cout << \"m.squaredNorm() = \" << m.squaredNorm() << endl;\n   cout << \"m.norm() = \" << m.norm() << endl;\n   cout << \"m.lpNorm<1>() = \" << m.template lpNorm<1>() << endl;\n   cout << \"m.lpNorm<Infinity>() = \" << m.template lpNorm<Infinity>() << endl;\n}\n\ntemplate <class Num>\nvoid example20()\n{\n   using namespace std;\n   Matrix<Num, 3, 3> A;\n   Matrix<Num, 3, 1> b;\n   A << 1, 2, 3, 4, 5, 6, 7, 8, 10;\n   b << 3, 3, 4;\n   cout << \"Here is the matrix A:\\n\"\n        << A << endl;\n   cout << \"Here is the vector b:\\n\"\n        << b << endl;\n   Matrix<Num, 3, 1> x = A.colPivHouseholderQr().solve(b);\n   cout << \"The solution is:\\n\"\n        << x << endl;\n}\n\ntemplate <class Num>\nvoid example21()\n{\n   using namespace std;\n   Matrix<Num, 2, 2> A, b;\n   A << 2, -1, -1, 3;\n   b << 1, 2, 3, 1;\n   cout << \"Here is the matrix A:\\n\"\n        << A << endl;\n   cout << \"Here is the right hand side b:\\n\"\n        << b << endl;\n   Matrix<Num, 2, 2> x = A.ldlt().solve(b);\n   cout << \"The solution is:\\n\"\n        << x << endl;\n}\n\ntemplate <class Num>\nvoid example22()\n{\n   using namespace std;\n   Matrix<Num, Dynamic, Dynamic> A              = Matrix<Num, Dynamic, Dynamic>::Random(100, 100);\n   Matrix<Num, Dynamic, Dynamic> b              = Matrix<Num, Dynamic, Dynamic>::Random(100, 50);\n   Matrix<Num, Dynamic, Dynamic> x              = A.fullPivLu().solve(b);\n   Matrix<Num, Dynamic, Dynamic> axmb           = A * x - b;\n   double                        relative_error = static_cast<double>(abs(axmb.norm() / b.norm())); // norm() is L2 norm\n   cout << \"norm1 = \" << axmb.norm() << endl;\n   cout << \"norm2 = \" << b.norm() << endl;\n   cout << \"The relative error is:\\n\"\n        << relative_error << endl;\n}\n\ntemplate <class Num>\nvoid example23()\n{\n   using namespace std;\n   Matrix<Num, 2, 2> A;\n   A << 1, 2, 2, 3;\n   cout << \"Here is the matrix A:\\n\"\n        << A << endl;\n   SelfAdjointEigenSolver<Matrix<Num, 2, 2> > eigensolver(A);\n   if (eigensolver.info() != Success)\n   {\n      std::cout << \"Eigenvalue solver failed!\" << endl;\n   }\n   else\n   {\n      cout << \"The eigenvalues of A are:\\n\"\n           << eigensolver.eigenvalues() << endl;\n      cout << \"Here's a matrix whose columns are eigenvectors of A \\n\"\n           << \"corresponding to these eigenvalues:\\n\"\n           << eigensolver.eigenvectors() << endl;\n   }\n}\n\ntemplate <class Num>\nvoid example24()\n{\n   using namespace std;\n   Matrix<Num, 3, 3> A;\n   A << 1, 2, 1,\n       2, 1, 0,\n       -1, 1, 2;\n   cout << \"Here is the matrix A:\\n\"\n        << A << endl;\n   cout << \"The determinant of A is \" << A.determinant() << endl;\n   cout << \"The inverse of A is:\\n\"\n        << A.inverse() << endl;\n}\n\ntemplate <class Num>\nvoid test_integer_type()\n{\n   example1<Num>();\n   //example2<Num>();\n   example18<Num>();\n}\n\ntemplate <class Num>\nvoid test_float_type()\n{\n   std::cout << \"Epsilon    = \" << Eigen::NumTraits<Num>::epsilon() << std::endl;\n   std::cout << \"Dummy Prec = \" << Eigen::NumTraits<Num>::dummy_precision() << std::endl;\n   std::cout << \"Highest    = \" << Eigen::NumTraits<Num>::highest() << std::endl;\n   std::cout << \"Lowest     = \" << Eigen::NumTraits<Num>::lowest() << std::endl;\n   std::cout << \"Digits10   = \" << Eigen::NumTraits<Num>::digits10() << std::endl;\n\n   example1<Num>();\n   example2<Num>();\n   example4<Num>();\n   example5<Num>();\n   example6<Num>();\n   example7<Num>();\n   example8<Num>();\n   example9<Num>();\n   example10<Num>();\n   example11<Num>();\n   example12<Num>();\n   example13<Num>();\n   example14<Num>();\n   example15<Num>();\n   example16<Num>();\n   example17<Num>();\n}\n\ntemplate <class Num>\nvoid test_float_type_2()\n{\n   std::cout << \"Epsilon    = \" << Eigen::NumTraits<Num>::epsilon() << std::endl;\n   std::cout << \"Dummy Prec = \" << Eigen::NumTraits<Num>::dummy_precision() << std::endl;\n   std::cout << \"Highest    = \" << Eigen::NumTraits<Num>::highest() << std::endl;\n   std::cout << \"Lowest     = \" << Eigen::NumTraits<Num>::lowest() << std::endl;\n   std::cout << \"Digits10   = \" << Eigen::NumTraits<Num>::digits10() << std::endl;\n\n   example18<Num>();\n   example19<Num>();\n   example20<Num>();\n#if EIGEN_VERSION_AT_LEAST(3, 4, 0) || (BOOST_CXX_VERSION <= 201703L)\n   example21<Num>();\n#endif\n}\n\ntemplate <class Num>\nvoid test_float_type_3()\n{\n   std::cout << \"Epsilon    = \" << Eigen::NumTraits<Num>::epsilon() << std::endl;\n   std::cout << \"Dummy Prec = \" << Eigen::NumTraits<Num>::dummy_precision() << std::endl;\n   std::cout << \"Highest    = \" << Eigen::NumTraits<Num>::highest() << std::endl;\n   std::cout << \"Lowest     = \" << Eigen::NumTraits<Num>::lowest() << std::endl;\n   std::cout << \"Digits10   = \" << Eigen::NumTraits<Num>::digits10() << std::endl;\n\n   example22<Num>();\n   example23<Num>();\n   example24<Num>();\n}\n\ntemplate <class Num>\nvoid test_complex_type()\n{\n   std::cout << \"Epsilon    = \" << Eigen::NumTraits<Num>::epsilon() << std::endl;\n   std::cout << \"Dummy Prec = \" << Eigen::NumTraits<Num>::dummy_precision() << std::endl;\n   std::cout << \"Highest    = \" << Eigen::NumTraits<Num>::highest() << std::endl;\n   std::cout << \"Lowest     = \" << Eigen::NumTraits<Num>::lowest() << std::endl;\n   std::cout << \"Digits10   = \" << Eigen::NumTraits<Num>::digits10() << std::endl;\n\n   example1<Num>();\n   example2<Num>();\n   example3<Num>();\n   example4<Num>();\n   example5<Num>();\n   example7<Num>();\n   example8<Num>();\n   example9<Num>();\n   example11<Num>();\n   example12<Num>();\n   example13<Num>();\n   example14<Num>();\n   example15<Num>();\n   example16<Num>();\n   example17<Num>();\n   example18a<Num>();\n   example19<Num>();\n   example20<Num>();\n#if EIGEN_VERSION_AT_LEAST(3, 4, 0) || (BOOST_CXX_VERSION <= 201703L)\n   example21<Num>();\n#endif\n   example22<Num>();\n   // example23<Num>();  //requires comparisons.\n   example24<Num>();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/git_issue_167.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include \"test.hpp\"\n\nint main()\n{\n   try{\n      std::locale::global(std::locale(\"en-US\"));\n      boost::multiprecision::cpp_dec_float_50 d(\"1234.56\");\n      std::string s = d.str();\n\n      BOOST_CHECK_EQUAL(s, \"1234.56\");\n   }\n   catch(const std::runtime_error&){}  // No en-US locale\n\n   return boost::report_errors();\n}\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/git_issue_175.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include <boost/multiprecision/cpp_int.hpp>\n#include \"test.hpp\"\n\nusing namespace boost::multiprecision;\n\ntemplate <class B, expression_template_option ET, class T>\nvoid check_type_is_number(const number<B, ET>& v, T t) \n{\n   BOOST_CHECK_EQUAL(v, t);\n}\n\ntemplate <class T, class U>\nvoid check_type_is_number(const T&, U)\n{\n   static_assert(sizeof(T) == 1, \"Oooops we appear to have an expression template when we should not have done so!\");\n}\n\nint main()\n{\n   cpp_dec_float_50 a(1), b(2), c(3);\n   check_type_is_number(-cpp_dec_float_50(3), -3);\n   check_type_is_number(a + cpp_dec_float_50(3), 4);\n   check_type_is_number(a - cpp_dec_float_50(3), -2);\n   check_type_is_number(a * cpp_dec_float_50(3), 3);\n   check_type_is_number(c / cpp_dec_float_50(3), 1);\n\n   check_type_is_number(cpp_dec_float_50(3) + a, 4);\n   check_type_is_number(cpp_dec_float_50(3) - a, 2);\n   check_type_is_number(cpp_dec_float_50(3) * a, 3);\n   check_type_is_number(cpp_dec_float_50(3) / a, 3);\n\n   check_type_is_number(3 + cpp_dec_float_50(3), 6);\n   check_type_is_number(3 - cpp_dec_float_50(3), 0);\n   check_type_is_number(3 * cpp_dec_float_50(3), 9);\n   check_type_is_number(3 / cpp_dec_float_50(3), 1);\n\n   check_type_is_number(cpp_dec_float_50(3) + 3, 6);\n   check_type_is_number(cpp_dec_float_50(3) - 3, 0);\n   check_type_is_number(cpp_dec_float_50(3) * 3, 9);\n   check_type_is_number(cpp_dec_float_50(3) / 3, 1);\n   \n   check_type_is_number(-cpp_int(2), -2);\n   check_type_is_number(~cpp_int(2), -3);\n   check_type_is_number(cpp_int(2) % 3, 2);\n   check_type_is_number(2 % cpp_int(3), 2);\n   check_type_is_number(2 | cpp_int(3), 2|3);\n   check_type_is_number(cpp_int(3)|2, 2|3);\n   check_type_is_number(2 & cpp_int(3), 2&3);\n   check_type_is_number(cpp_int(3)&2, 2&3);\n   check_type_is_number(2 ^ cpp_int(3), 2^3);\n   check_type_is_number(cpp_int(3)^2, 2^3);\n   check_type_is_number(cpp_int(1) << 4, 1 << 4);\n   check_type_is_number(cpp_int(4) >> 1, 2);\n\n   check_type_is_number(asin(cpp_dec_float_50(0)), 0);\n   check_type_is_number(pow(cpp_dec_float_50(2), 2), 4);\n   check_type_is_number(pow(cpp_dec_float_50(2), b), 4);\n   check_type_is_number(pow(2, cpp_dec_float_50(2)), 4);\n   check_type_is_number(pow(b, cpp_dec_float_50(2)), 4);\n   check_type_is_number(pow(cpp_dec_float_50(2), cpp_dec_float_50(2)), 4);\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/git_issue_248.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2020 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include \"test.hpp\"\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   BOOST_CHECK_EQUAL(std::numeric_limits<cpp_bin_float_single>::digits10, 6);\n   BOOST_CHECK_EQUAL(std::numeric_limits<cpp_bin_float_single>::max_digits10, 9);\n\n   BOOST_CHECK_EQUAL(std::numeric_limits<cpp_bin_float_double>::digits10, 15);\n   BOOST_CHECK_EQUAL(std::numeric_limits<cpp_bin_float_double>::max_digits10, 17);\n\n   BOOST_CHECK_EQUAL(std::numeric_limits<cpp_bin_float_double_extended>::digits10, 18);\n   BOOST_CHECK_EQUAL(std::numeric_limits<cpp_bin_float_double_extended>::max_digits10, 21);\n\n   BOOST_CHECK_EQUAL(std::numeric_limits<cpp_bin_float_quad>::digits10, 33);\n   BOOST_CHECK_EQUAL(std::numeric_limits<cpp_bin_float_quad>::max_digits10, 36);\n\n   static_assert(std::numeric_limits<cpp_bin_float_single>::digits10 == 6, \"Error check\");\n   static_assert(std::numeric_limits<cpp_bin_float_single>::max_digits10 == 9, \"Error check\");\n\n   static_assert(std::numeric_limits<cpp_bin_float_double>::digits10 == 15, \"Error check\");\n   static_assert(std::numeric_limits<cpp_bin_float_double>::max_digits10 == 17, \"Error check\");\n\n   static_assert(std::numeric_limits<cpp_bin_float_double_extended>::digits10 == 18, \"Error check\");\n   static_assert(std::numeric_limits<cpp_bin_float_double_extended>::max_digits10 == 21, \"Error check\");\n\n   static_assert(std::numeric_limits<cpp_bin_float_quad>::digits10 == 33, \"Error check\");\n   static_assert(std::numeric_limits<cpp_bin_float_quad>::max_digits10 == 36, \"Error check\");\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/git_issue_265.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2020 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/math/special_functions/next.hpp>\n#include \"test.hpp\"\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   mpfr_float_50 half = 0.5;\n   mpfr_float_50 under_half = boost::math::float_prior(half);\n   BOOST_CHECK_NE(half, under_half);\n   int e1, e2;\n   mpfr_float_50 norm1, norm2;\n   norm1 = frexp(half, &e1);\n   norm2 = frexp(under_half, &e2);\n   BOOST_CHECK_EQUAL(norm1, half);\n   BOOST_CHECK_EQUAL(e1, 0);\n   BOOST_CHECK_GT(1, norm2);\n   BOOST_CHECK_LE(0.5, norm2);\n   BOOST_CHECK_EQUAL(e2, -1);\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/git_issue_277.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include \"test.hpp\"\n\ntemplate <class I>\nvoid test()\n{\n   I val(1);\n   val <<= 512;\n   I t(val);\n   ++t;\n   BOOST_CHECK_EQUAL(t - val, 1);\n   --t;\n   BOOST_CHECK_EQUAL(t, val);\n   --t;\n   BOOST_CHECK_EQUAL(val - t, 1);\n\n   val = -val;\n   t   = val;\n   --t;\n   BOOST_CHECK_EQUAL(t - val, -1);\n   ++t;\n   BOOST_CHECK_EQUAL(t, val);\n   ++t;\n   BOOST_CHECK_EQUAL(val - t, -1);\n}\n\nint main()\n{\n   test<boost::multiprecision::cpp_int>();\n   test<boost::multiprecision::int1024_t>();\n   test<boost::multiprecision::checked_int1024_t>();\n   return boost::report_errors();\n}\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/git_issue_30.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2016 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nstruct E\n{\n   E(boost::multiprecision::cpp_rational const&)\n   {\n   }\n};\n\nvoid g(boost::multiprecision::cpp_rational const& r)\n{\n   std::cout << r << std::endl;\n}\n\nint main()\n{\n#if !BOOST_WORKAROUND(BOOST_MSVC, < 1900) && !(defined(__APPLE_CC__) && defined(CI_SUPPRESS_KNOWN_ISSUES))\n   boost::multiprecision::cpp_int r = 3;\n   g(r);\n   E x1(r); // triggers explicit conversion operator.\n#endif\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/git_issue_313.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2021 Christopher Kormanyos. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <iomanip>\n#include <sstream>\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\n#include \"test.hpp\"\n\nvoid test()\n{\n   using local_decfloat_type = boost::multiprecision::cpp_dec_float_100;\n\n   bool result0_is_ok = false;\n   bool result1_is_ok = false;\n\n   {\n      const local_decfloat_type test = pow(local_decfloat_type{2}, 30) * pow(local_decfloat_type{10}, -3);\n\n      std::stringstream strm;\n\n      strm << std::setprecision(std::numeric_limits<local_decfloat_type>::digits10)\n           << std::fixed\n           << test;\n\n      result0_is_ok =\n         (strm.str() == \"1073741.8240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\");\n   }\n\n   {\n      const local_decfloat_type test(0.625F);\n\n      std::stringstream strm;\n\n      strm << std::setprecision(std::numeric_limits<local_decfloat_type>::digits10)\n           << std::fixed\n           << test;\n\n      result1_is_ok =\n         (strm.str() == \"0.6250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\");\n   }\n\n   const bool result_is_ok = (result0_is_ok && result1_is_ok);\n\n   BOOST_CHECK_EQUAL(result_is_ok, true);\n}\n\nint main()\n{\n   test();\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/git_issue_370.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include \"test.hpp\"\n\nint main()\n{\n   const boost::multiprecision::cpp_int a(\"500000000000000052504760255204421627079393309355027816932345132815919505535709229444276879024105562954502314530690391078574434507015318513443905076213688875017942541908041275407131568575177172639474548726709751235383681696449966404295647940685784470144122251803020020951078103818191513659921807053133698549053838430992170843235673537548059987539601671975279280846041564435631581262016246808786828637048154067265620710396778995313534536353760281048487250661054626168637371167135426013683337484254647996964562455566714879467026196409913165805735073230830136024016362543811769017875638974011487488573436\");\n   const boost::multiprecision::cpp_int b(\"1500000000000000157514280765613264881238179928065083450797035398447758516607127688332830637072316688863506943592071173235723303521045955540331715228641066625053827625724123826221394705725531517918423646180129253706151045089349899212886943822057353410432366755409060062853234311454574540979765421159386595647161515292215193506006556519037965168192736708179557957863203557666055574947146355487693991882510747766220045897624670399027877365714431356466054500731862264092476764347207739651025585146903094168986610767496468412336047796468657032646893153521091155634158263410282629846280069312485301157888001\");\n   const boost::multiprecision::cpp_int r = gcd(a, b);\n\n   if (a % r)\n      return 1;\n   if (b % r)\n      return 1;\n   if (gcd(a / r, b / r) != 1)\n      return 1;\n\n   return 0;\n}\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/git_issue_393.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n\n#include <Eigen/Dense>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/eigen.hpp>\n\ntypedef boost::multiprecision::cpp_rational               NT;\ntypedef Eigen::Matrix<NT, Eigen::Dynamic, Eigen::Dynamic> M;\n\nvoid f(M& m1, M const& m2)\n{\n   m1 = m2 * m2;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/git_issue_426.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2019 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#ifdef TEST_MPFR\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#include \"test.hpp\"\n\ntemplate <class T>\nvoid test()\n{\n   T d = 360;\n   for (int i = 2; i >= -2; --i)\n   {\n      T x = i * d;\n      T y = remainder(x, d);\n      if (y == 0)\n         BOOST_CHECK_EQUAL(signbit(y), signbit(x));\n      if (i == 0)\n      {\n         x = -x;\n         y = remainder(x, d);\n         if (y == 0)\n            BOOST_CHECK_EQUAL(signbit(y), signbit(x));\n      }\n   }\n}\n\nint main()\n{\n   test<boost::multiprecision::cpp_bin_float_50>();\n   // No signed zero:\n   //test<boost::multiprecision::cpp_dec_float_50>();\n   //test<boost::multiprecision::mpf_float_50>();\n#ifdef TEST_MPFR\n   test<boost::multiprecision::mpfr_float_50>();\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n#endif\n   return boost::report_errors();\n}\n\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/git_issue_464.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2022 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n//  See: https://github.com/boostorg/multiprecision/issues/464\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include <locale>\n#include \"test.hpp\"\n\ntemplate <typename T>\nvoid test()\n{\n    auto a = boost::multiprecision::cpp_dec_float_50 {12345};\n\n    auto d1 = a.convert_to<T>();\n\n    std::locale::global(std::locale(\"de_DE\"));\n    auto d2 = a.convert_to<T>();\n\n    BOOST_CHECK_EQUAL(d1, d2);\n}\n\nint main(void)\n{\n    test<double>();\n    test<long double>();\n\n    return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/git_issue_488.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2022 John Maddock. Distributed under the Boost\n//  Copyright 2022 Christopher Kormanyos. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <array>\n#include <cstdint>\n#include <iomanip>\n#include <iostream>\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test.hpp\"\n\nint main()\n{\n   using local_uint265_type = boost::multiprecision::uint256_t;\n\n   std::uint16_t bits[16] = { };\n   std::uint8_t  result_bits[16] = { };\n\n   std::fill(std::begin(bits), std::end(bits), static_cast<std::uint16_t>(UINT16_C(0x5678)));\n   std::fill(std::begin(result_bits), std::end(result_bits), static_cast<std::uint8_t>(bits[0] & 0xFF));\n\n   local_uint265_type u{}, v{};\n\n   const std::array<bool, static_cast<std::size_t>(UINT8_C(2))> msv_values{ true, false };\n\n   const auto flg = std::cout.flags();\n\n   for (const auto msv_first : msv_values)\n   {\n      static_cast<void>(import_bits(u, std::begin(bits), std::end(bits), 8u, msv_first));\n      static_cast<void>(import_bits(v, std::begin(result_bits), std::end(result_bits), 8u, msv_first));\n\n      std::cout << std::hex << std::uppercase << u << std::endl;\n\n      BOOST_CHECK_EQUAL(u, v);\n   }\n\n   std::cout.flags(flg);\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/git_issue_98.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include <boost/multiprecision/cpp_complex.hpp>\n#ifdef BOOST_HAS_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#ifdef TEST_GMP\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_MPFR\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#ifdef TEST_MPC\n#include <boost/multiprecision/mpc.hpp>\n#endif\n\nstruct A\n{\n   virtual void g() = 0;\n};\n\nvoid f(A&);\nvoid f(boost::multiprecision::cpp_bin_float_50);\nvoid f(boost::multiprecision::cpp_int);\nvoid f(boost::multiprecision::cpp_rational);\nvoid f(boost::multiprecision::cpp_dec_float_50);\nvoid f(boost::multiprecision::cpp_complex_100);\n#ifdef TEST_FLOAT128\nvoid f(boost::multiprecision::float128);\n#endif\n#ifdef TEST_GMP\nvoid f(boost::multiprecision::mpz_int);\nvoid f(boost::multiprecision::mpf_float);\nvoid f(boost::multiprecision::mpq_rational);\n#endif\n#ifdef TEST_MPFR\nvoid f(boost::multiprecision::mpfr_float);\n#endif\n#ifdef TEST_MPC\nvoid f(boost::multiprecision::mpc_complex);\n#endif\n\nvoid h(A& a)\n{\n   f(a);\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/include_test/cpp_bin_float_include_test.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_bin_float<50> a;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/include_test/cpp_dec_float_include_test.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   cpp_dec_float<50> a;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/include_test/cpp_int_include_test.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   number<cpp_int_backend<> >                                                 a;\n   number<cpp_int_backend<>, et_off>                                          b;\n   number<cpp_int_backend<64, 64, signed_magnitude, checked, void>, et_off>   c;\n   number<cpp_int_backend<128, 128, signed_magnitude, checked, void>, et_off> d;\n   number<cpp_int_backend<500, 500, signed_magnitude, checked, void>, et_off> e;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/include_test/gmp_include_test.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/gmp.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   mpf_float    a;\n   mpz_int      b;\n   mpq_rational c;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/include_test/mpfr_include_test.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/mpfr.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   mpfr_float a;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/include_test/tommath_include_test.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/tommath.hpp>\n\nusing namespace boost::multiprecision;\n\nint main()\n{\n   tom_int a;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/issue_13148.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2016 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\nboost::multiprecision::cpp_rational rationalfromStr(const char* str)\n{\n   boost::multiprecision::cpp_dec_float_50 d1(str);\n   boost::multiprecision::cpp_rational     result(d1); // <--- eats CPU forever\n   return result;\n}\n\nboost::multiprecision::cpp_rational rationalfromStr2(const char* str)\n{\n   boost::multiprecision::cpp_bin_float_50 d1(str);\n   boost::multiprecision::cpp_rational     result(d1); // <--- eats CPU forever\n   return result;\n}\n\nint main()\n{\n   // This example is OK.\n   {\n      boost::multiprecision::cpp_rational expected = 1;\n      BOOST_MP_ASSERT(expected == rationalfromStr(\"1\"));\n   }\n   // This example is OK.\n   {\n      boost::multiprecision::cpp_rational expected = boost::multiprecision::cpp_rational(25) / boost::multiprecision::cpp_rational(10);\n      BOOST_MP_ASSERT(expected == rationalfromStr(\"2.5\"));\n   }\n   // This example is OK.\n   {\n      boost::multiprecision::cpp_rational expected = boost::multiprecision::cpp_rational(5) / boost::multiprecision::cpp_rational(1000);\n      BOOST_MP_ASSERT(expected == rationalfromStr(\"0.005\"));\n   }\n   // This example is OK.\n   {\n      boost::multiprecision::cpp_rational expected = 0;\n      BOOST_MP_ASSERT(expected == boost::multiprecision::cpp_rational(\"0\")); // direct cpp_rational from str is OK.\n   }\n   // This example fails.\n   {\n      boost::multiprecision::cpp_rational expected = 0;\n      // reachable code\n      BOOST_MP_ASSERT(expected == rationalfromStr(\"0\")); // cpp_rational from cpp_dec_float_50 is not OK.\n            // unreachable code\n   }\n   {\n      boost::multiprecision::cpp_rational expected = 0;\n      // reacheble code\n      BOOST_MP_ASSERT(expected == rationalfromStr2(\"0\")); // cpp_rational from cpp_dec_float_50 is not OK.\n          // unreachable code\n   }\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/issue_13301.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2016 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\nint main()\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<8, boost::multiprecision::backends::digit_base_2> > quarter_float;\n\n   quarter_float qf(256);\n\n   unsigned int ui = qf.convert_to<unsigned int>();\n   if (ui != 256)\n      return 1;\n\n   std::uintmax_t m(1), n;\n   m <<= std::numeric_limits<std::uintmax_t>::digits - 1;\n   qf = m;\n   n  = qf.convert_to<std::uintmax_t>();\n   if (m != n)\n      return 2;\n   qf *= 2;\n   n = qf.convert_to<std::uintmax_t>();\n   m = (std::numeric_limits<std::uintmax_t>::max)();\n   if (m != n)\n      return 3;\n\n   qf     = 256;\n   int si = qf.convert_to<int>();\n   if (si != 256)\n      return 4;\n   std::intmax_t sm(1), sn;\n   sm <<= std::numeric_limits<std::intmax_t>::digits - 1;\n   qf = sm;\n   sn = qf.convert_to<std::intmax_t>();\n   if (sm != sn)\n      return 5;\n   qf *= 2;\n   sn = qf.convert_to<std::intmax_t>();\n   sm = (std::numeric_limits<std::intmax_t>::max)();\n   if (sm != sn)\n      return 6;\n\n   // Again with negative numbers:\n   qf = -256;\n   si = qf.convert_to<int>();\n   if (si != -256)\n      return 7;\n   sm = 1;\n   sm <<= std::numeric_limits<std::intmax_t>::digits - 1;\n   sm = -sm;\n   qf = sm;\n   sn = qf.convert_to<std::intmax_t>();\n   if (sm != sn)\n      return 8;\n   qf *= 2;\n   sn = qf.convert_to<std::intmax_t>();\n   sm = (std::numeric_limits<std::intmax_t>::min)();\n   if (sm != sn)\n      return 9;\n\n   // Now try conversion to cpp_int:\n   qf                               = 256;\n   boost::multiprecision::cpp_int i = qf.convert_to<boost::multiprecision::cpp_int>(), j;\n   if (i != 256)\n      return 10;\n   qf = ldexp(qf, 126);\n   i  = qf.convert_to<boost::multiprecision::cpp_int>();\n   j  = 256;\n   j <<= 126;\n   if (i != j)\n      return 11;\n\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/high_prec/gamma.ipp",
    "content": "\n//  Copyright 2016 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\nstatic const boost::array<boost::array<typename table_type<T>::type, 3>, 500> gamma = {{{SC_(8.45530509948730468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.11676792084632275714192215809847832812560655161416701540037514678588899552795223636051283861515685855053582939146274240113874531527973814210488207830128530900559599074170389066138081891070712920623473461857632254352617595899153121789055651865429663273105801624222067275035146160407682419814612559770937851333313258174693831239060158272144283644033402005812336141640353704703451805075743457651474500575180336149704581761302422616802534269713673320145810616702623379426577267381016596640646036780085640e+00), SC_(1.10438728442867816609665916944098399086765601795314917615577669041382221945245269046345957164829024229823010663264720601624809651655116368339246859099278886577422386896811750937967494940960029250224075543433744666205413027910764506859493838993507216401131983731121529344952082060498119577899781093069658373786189150246027769179901839580061229387653730476486565832292623869480613925012343335744507187985817127088673548820437219886661135524261767270766239756270078148544872782377812888609878714473093021e-01)},\n                                                                                        {SC_(1.39026832580566406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.87837246534584512058304626597150000489120292563756272246130863589440629431328166236343343023478965830481648988944668013833863592688512739847732271129409060356695212103238739655240822053671736250775878014127604440817225103010320322756075484745769185701456653223475749864397685319786785385530182719007531303116138466452735235078861018575437520732342354574967183308070807923233032727588780923086501266291147367564653286869648484915713961300281876539970618140056759819325004245961660980554836491213594461e-01), SC_(-1.18966833717491030777529019926331960352855377707641323046275606078389124027926611789911603150540144713683748681801863772072067302459578683018790819197528173413969356904557087663396842789779718125888832504274452988602707088024742817513733531775897173110489239191365127876847654130551501903438865671258532679739640203442463217240189322306203147786367096739239036281487648421042118138143391813517167916949838797835701356844050619004326570975617904601257077440910867376277877219954044806432791089137635152e-01)},\n                                                                                        {SC_(1.43504619598388671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.85908592055477020544823146996462988920753671462990877927427523793784391636857990149923096368122868020391764231333911220440936193158035215379333873738823239728773696032128851923243880532734156757960723683643045365212843713096041451134263420009087064362953191913886157628325070283143368675406959711653730415068180223485945836948634468821206791379329892575297995361852566312748126836116054701645545213593209611892028096694432232545135202461301088136703343459844999000604508302338782169984763967607501314e-01), SC_(-1.21141502936978554470331924245181844536653300286225422140798757837139525637498346623087068230762388958190805297179369893104223420947821790937027145400844138709085611406641604698885150056395888192847451388558341660380510005326476801210828545697252686002267491495285666799318711798085628503140489815338199728719860874280450505965277773655528536902886328052951994398070322644031431224912585052114632613788261969630244977993915035447500319483308338977079266591371885961850522890584558525442875774358053017e-01)},\n                                                                                        {SC_(2.42817401885986328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.26548780776578840420381427518520449855608041962978420562324571651972061904909219213050500986673056140976438565871543352029900201913847740572555310587852358164122797887781229263011351199466922757394212036282675265716319706112696638181549111225164845253224133071688478880244916384306812998466169110572223013741424946407661202839829092882797566392445456945362691783965322378415320774013882498835505927125822970066960016136071528037620210173970460365408629248314390843812310532824823798560386378408531758e+00), SC_(2.35457666634852101044747755129837867262195483343254983494923132129084740599968117459876158642974817916730545060077157131801833625262395918879296296970891493947670708984616066541861044565554092681572085484952572699514279293900419924199381144525738569464382042666825565090748449951697963176145208698932021640416912747873111038321169415221202446804427993828714087337477405157815350337354930690780319199568346826770338612483088645913829939414504125261936354188139129621440596127411902107048621213505069787e-01)},\n                                                                                        {SC_(3.57062149047851562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(3.59555262870334436745200120641865977981082010640223266050140391459729626943767312409363221404703574210201792392329936976650125743512284944198899260106526015752278902956864105662898272567210147921868074256078713905235180221793465538428466586341769298190208746120283067730378397892254705825257704963837122035302991309312466980646767864250193651830956876235658931110573123437458150313676328781121766284025470150078590315090776590886236623802578555557213388547550022167969734537803949609965981618094724875e+00), SC_(1.27969770083427483263559414629301871307474084102320799462455928302879005205354752125421307226546605400047836370140458006536267143631687873530833586669309191906361501163139082755585388593517415370654307293917178772625291488912516115091663101505703539344031184872454811817406134618932582617064239611554551844783746009143025742360911718166833619539628430237988628690562327369791903400381585434826128475496317596229670997626757602054430015393131562841666713598775620637208642977504313979362509202895607109e+00)},\n                                                                                        {SC_(4.06173896789550781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(6.48731472437243796002214852775228043537971289437086104501487473581409244022420469963455826960525084857707369435964359746591711750992308312134021384929133564129501204286710897020809578552486451934456957768860362014269537717479180144139729241339620855382881397577147860000032919343487135060920390418900375031787607691106910209429859657872451356560041801073390128288706215902201331458057657139826067439256351480798777075962425946562343717935253011331255750532440357025778171100855280846427732600917368427e+00), SC_(1.86984868922060153870312299296985062230442937856531056759619014069475862184353028955695412404454321279039154862003433554749490171187759936732026866110412946881723664011929498452905443575544100221689429429301260523169470423568601285968829370009543627369171932027568492297164723547129769130081972774445920326671338017681314020368749098739160450063373166716481506986205918192305159100153286510376407089509591108263911145163810109598636638395246173348456104955704883803210682048233858516700403662613611101e+00)},\n                                                                                        {SC_(4.62103271484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.37858022875149594619786107410279090175590970152450034841009699269673431346004116478067172178520246853732831755995428799078017457601602619929245113749007303704101480579352988396977510269794581778372002589383281670752713644566761172166567385676042002118864154022560147254396699337453643014632090052598274319291935807114460343942482405484801703954155955722485464313407185661674729088557545190877905944424466140889980199318964713781724109009297813878567602461975916768052038274217796168549609238659912800e+01), SC_(2.62363924281956010702136640841955277162733070564811703055105753296189488826361566652602311409061111092399672290884891722467926760684437721593990663312995512755267781429591466685062354923692239092672056520234671473631058306668809726966855071037418632102365123873577786382809134249130150505178623394283970906330326508036001313708698839654499118129718097194782427944111675244162629125074561075136961120514757170446709158397509674944733810061359837990599512420837675518506637113899833273305688678962765784e+00)},\n                                                                                        {SC_(4.95617485046386718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(2.24718008439809442788209027528859402116653573943432441740659531453629499472973958227907469705875895142256631027950914323449546506579797438670714453791272026575254913719473832861478582258396938106853301770393264870159399799869055007015434958058676797199878997709812870727729689757402018497925646205685684353323505015838079500055817602615533853494694556319446442067489405159190640294404045513497256563510451692946446390653895786899381651426750779600703169258576911088938000280179624657230202494914554453e+01), SC_(3.11226122735527283001436732061482084336251639227376046279662642923418290806738326523996478116609979831948179805587928769153274855556446413175508510433259718452181123790997348386826344699161670878673065209529046397787130480356474953162252901005463887577216685154644547997310645330563385245975795829493688812633389752782939580849857192152477705251876040149405364402545536520601697980677272545641602109841104148780306607027762094861640754264955688050582460828241131111154401178777085333226922469763304802e+00)},\n                                                                                        {SC_(5.33216857910156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(4.00553052022210672861172891969975874467163632878273365599590082567135977861246512342058540785194845011420653067457140609085806825580056355742227407837692060683249358855542773800094606807421366553650993901731609418359571760967157147365961249446904066775876923068467870410926669834554889478280924299804868385789300760220221433734929715355322308163278946871106748327149891409242787740148917181937009887358066189115112391852948848072127151790776708831129634358782375387973685405984021144936522217818263887e+01), SC_(3.69026112921665738447356052157805826006261575754715146030823722328052224219481629888200194228992542456666326715599926038404343629111229712712603676960882556465809932702973923780945184481220774715262397366111250231958769743093585550788457957942102664449774653173349379675999754811893646753690219918461483472316926459116111911304869770192038163555120045323216247334529547388917331185628279325595929211450347309515919824526889077762242709640299863499904979658370855846132644540836771202986689516605307719e+00)},\n                                                                                        {SC_(5.53525352478027343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(5.54085693989980056689828323360533202581167492518911769584949988804497359322368776091779140395452638417269585036316553435037135219086785310992316684430301271806800120535089861233390960140463559245483746277411779351099714760817803251461088125523272968642271161431162315313967100838668611319145908704926154612773615372669849504199366490997719787759920807270196610305978144012121816428514168683064363810139266508908745055811779478349322540193892120037252674767004050526902154688580542341833753952471325027e+01), SC_(4.01473426408354864195493680270670709888838156351643199813406405422986896254574554048671301238364016812565923123175708018422414574326651898972233934077155639420144616008014038365563539926679491360504159807520765365221328661239870485108541575449867980981545393136165252219742866201168516059324361308415876884333514156647228147093027677746525367094610600724933388522700653405326906335784642279271969391106974692408051454996866825096351519387380897644271891521149125368306133131088394686999544511101518839e+00)},\n                                                                                        {SC_(8.76608276367187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(2.45168218533635930619607726245392030762486255761328567765573105304410142150402005341157069836143490261271426854222130497382499323807115021070916489489298478742485634020491842325402560577110358831959602293247200484183054212413532479513045660120433744022721285308357503948919422710448107932657085485948275312721884150067715974091281450199363008662962715355890258330430671461730647408910607363125434042429218606193952080701992994548099674296660794648968213053267218182313689092204527768537711239353651776e+04), SC_(1.01071147671863185327950157842771848355690961582839471529235262209976315476828727800911954615182577061463048910838217130723874185086084459846607683789832726142832119336764584676848615401316033063394103140884481795844812690718880319719415999249412615982273170075510120797100374050563252653874652680187908298681878272779417833833904258535562275198810553332530273476763030738280101705876045770738375074123044968182559538889713229283788787867195197583120537344575175235851164600007251143003173078342333609e+01)},\n                                                                                        {SC_(9.54985427856445312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.33124191564895517786198318510639290524555281956888985019623709579905630894735541649077494627871914408573260648955262263687000687922389445792928188297142800467321281724332423337091736902596942422833231242875215268585640866036266522615474645034218515281333865398887209402026567283141579237158080499743426939983616583610354938189196173205223749820692938362654992436789626030738847465823771087487947240361096515842184486374295691072049728572766139104577726261341789838495401824728814337996569514215672530e+05), SC_(1.17990377426754288264606297368466274228437984450810542718576338503909998685774762341929430182869490356000015066861395002069084429748581801250795379187983074979512796001712324478984009900922203447046990385175865774213093475908924123603675885921802990784925766315829148516934071379020928361215249532812742053156207303049568661090315018584992187158785059549794406558582306711751933404845316792962749621780233564966634413100993442521511005188505728824353480225249328012213643562389033203444688486307902948e+01)},\n                                                                                        {SC_(9.98056793212890625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(3.47351022609890987414462933366655334807141833319973833485251821949760940947774277743644751214737192294292705395291451794427578900001693769046543125025183131602481174315151788533280598536553924629403649863673849420583250744590458701199142358875405761725682245457269733335734933972176546054405142766845620327689012944814485692211235417261699291965304764803083155748787532975237567590477444265639447563674720522368236482299715573776562543955819648355145672683431444493845732956957961329768309749681829985e+05), SC_(1.27580911401497751821060654166800202590984496449712229747428650640526916490109555857587661865937014134922557424041425172181625752089956083590448352036948806676504958753151299078856881837898249233659905040282763080155929482264803438269944110781266460182301983820012339338329983248392343095209177995416838143030575826729498027778841804157021072458776021811820523457953320987753027666066945590262453676053331880351804554644478900495289023610283211137423667420410851307848590104509490230146431500262752007e+01)},\n                                                                                        {SC_(1.02951927185058593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.08612298941736643153732276006220971148644659875558920927931593935920431599528738660802469977290774445824488741549217537449446921507610892464943125096025919672129084867587667593276450909932572372137644264808977599843418764122976594717814108353372457029584218389242429510238722931886606180430128463378160039188017925774025486288889709479511768650943318951092782687590293596990714433871292584636475060962701358649279139597185057212208578482611189796103472554385131334860031392843178420809951208156923205e+05), SC_(1.34710638279404681644246606540609769374801440275032660885401198256118967063141577514087022647397538479355822457739408871059474039830713174834411157800996577575003311438166402418585060431559564293388138836927893978284436415357597898062083173462936431367544773331148767502281557730664161817089644271957806633291453970250267498511964473754051015546891232872019548172225307272336307735201303435433404493851119019530317135541933469566759049768381966972245871852168677664931061501876261076443912299692533597e+01)},\n                                                                                        {SC_(1.03338241577148437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.73986220626843824927920782808904522315975049074439916300919381933777932420492642527484802029254954306553334393810376403407168820887408988932837497169960027734038427684853032090933230195065129695346654952158714462914263685195391164935001537212016209463929695503000587847065615191145442143323988524634373944112251531098789566603760664904054993411039655201562870364683675613858124103659455770298515793225998426718316092021479792672373860638612991767438527054522949865358951955431484811761620729003812382e+05), SC_(1.35593093496056969893535567112872929008143709636940002546329087550711754131154961097197217187455599859178992371199445448253184723282798555078431187938048489946441825776243184601290612049872086792875137747821946976340754196960872289509848440846460379366990183257537708184661560651042893934128712949967929943476493798876208818924397255136148931131306701168208553291581298942881419034795011951056848436534335079031462364949005620152601355133144874348094130199610942718142353840569740996333028520392372556e+01)},\n                                                                                        {SC_(1.07135047912597656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.85721439538838439705306064451879294595570947494672710722016789190114576336023487676613177353802996774898485646539303627310434036056012918512753580667010178877478176833272081798430115689170325758260542022430547407739443230778886561790259780329336075012938809440026955925762010679712962413276914273448632895358656771817332068220175020343563819741374166286834026905759809649949412322517870913703226957295986639927654451683223262755262903967113925053844635980417582441070491472062229124222544924029831654e+06), SC_(1.44345882862223439605716424404599011683811886773747370676003171837626128033041503920384113195787471603683676214899764638312008488583005220488335395789219780613434308649120312121034729352210431866865784472394171554538335954672405161157639621786194857241841889876862506839092638714724364137545606219369672259196484835450223961242251728879195312134729976462122220398692613546962503263752599725385404222086718253046013692763924083452585153651775377988077421839166494678150854383938719506103970152877660484e+01)},\n                                                                                        {SC_(1.09323768615722656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.09592640575239809666846121677771927780752936023924158222634560987255697519482790694905618663865531239972019760869700752710049719590581148223169481122444885785273943932972303081018927714284131922497997127430750960113524416767507128317210990572045260941311586013903134659634029880246927905370185375976258340419589414037729179865857038384049918002627831330701395495031815286029217668797369925413755055132642560604612676671367161537762429344852598381811521248141946161530867133014459723058597428437642298e+06), SC_(1.49455977426574165881859039685195966050036759954579121951129510480837185650712389225508184363631645514043826849142044045040551855302422436604545319679526057379569083519990130330113590282035739010196088875383247254732201194190303019409460033340883098002366906771159957984278579595308398344453039602978600230132604751443572911980490843010703162398503070960907011556740635051049333707402400411399198983397314439988590436484712278449948781729679812491581015270188673991965076859499698834498233560917960844e+01)},\n                                                                                        {SC_(1.21413345336914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.64239751689040135371528638503817996701835072784502236912289045699792089781694820687717658364779020991311296750597862504701825127504810312222159827182159743586084452766637995854336280264240514840579371599354707442049464154449281372330704925798340213382877182134914296548090310931517654388018712040859984515487022805743836777133727700635356020676861026294060728418886449803915821559424461129887396581535139042681015145325091941876084305153799657023785097396446763077777426340282617918626524288619395821e+07), SC_(1.78484047177896642639445392863215588612603563477346865541091120435845320539752039062941627703344836229145165912845742723048104642698908304308667638772267977520902894756788859805097365912048607248507329066498228754882410916966189530240937511360454967870449691910124814867332860502660647255668051145601077719174263919348318346132226844241305817669112243947100811203383986012421488579157948402877689650632629847846451925035467415986612379374365476171911041288360390893986721132229765766169947887290345542e+01)},\n                                                                                        {SC_(1.26162376403808593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.82777774460762820033523820034243728079553256953006439450420968262439443258229978114270959300622199344017589718484337858393249911256829041745903345314343540021091394102881560287779214677084313708562306054370961578828297883697715344793988582246419530881616323476544054179572977852567036054414406650284290159158304002405447887376199358950937031103957302647245972058773317232396195945757609876519304214193127881603995124500024819624489413779759179354940420338115740406968621859707865148350733475845952234e+08), SC_(1.90237816256797246227486669171399919483589830643410829499611169780971203727215705417400879721688136824911355853063650984902731234860248092757443311504792998093607313455433758450408496059290244242681574445768041303125717871774734258258916678641036751240624455054024730673671153289368603688545314472036533629426132929060447459830632651096898621496595339844352016930762821590055173084188243609293665424086528103390756940221127719143780039156761291057797334820481397090824517603472596681788452312169840980e+01)},\n                                                                                        {SC_(1.29071388244628906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.78979711385686127340767130471521612722379599046594038090610466732167125460890560800984410126533342426520606719054063104503899485854375039568888760720567975382288567002034953346831754769783894495550746676294468918343305967613458205336282656145318524932407160094387129343422463229080277186575794507758607320164639659871754591094259369822469703782501303055901719999275366090375714916904397953707312302390870259506790449629046479476191967195743783510726934853174357019092037673410791812913166721722086061e+08), SC_(1.97529932296499248899054969602240355084343277816619556255091621997733876181221840458375733310196135385376238395185401100147169373094887231377881737783120407576462599446938149701246857892596701863463492500388160036922963943049284016497002288337499802270953933638642449541165787258346216476205325085465966266931418111121786445927723544963171253130667638943355007515068244083212372359033804849408937371366530665125994577600484715961413509838873453584307755874929916416402267850814780033556716715227762552e+01)},\n                                                                                        {SC_(1.35178642272949218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.79077380560185807841570990731673158935617629510395723286664787382434734070420593877008246737894206914955382051323852831817642175680990221901969610060683074622704421995675281008392086832771359843513683914881713246638554404384417070742716548305737956113214094245552797225951078125611475598587551455830850591617669298207289396654820780436070659318515035173482574219537805431072651843159786010862043473811995143369242030904717771431696545720568246265152229327411357391069165707328893357622936422285295649e+09), SC_(2.13059136570194254239407391037067150343599098058780133116230659201053633257372017234341370601553301782276116790588041904156794338078073857655337466751556849619829258270710327303032110154928475210007538757757396856518851171282354554599684740830735844823274301963455406614426566730360797546058398185390735765301739067716955024649756045796974198109080635531733693266385265544023263308650055411770824121854510040354730758618787977954637753032683746887026837598494068620361627965127360986086863865184764952e+01)},\n                                                                                        {SC_(1.38514175415039062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.23325137095218598823971508296873948225192100644656374441758763040983693132346484605144687295568219742283016535118774974652008388142683636350053130008764423355018809447400487103279915093742480389910985450980067599008027299644082243337006654575030469262199653819047967799574420944180011273945204186267448102919341312955232949125097106021914351153335517551925258398293551930646836566455578001158894380204272564162401610398812172090461275428017675992538882528626329695230610272518852177524672384928016285e+09), SC_(2.21662361803630197383736953990278887110574274522483085040259559845237723788490205822308182030543596883541881395918821078845085775974446457476054196005815674612301742772034161774111373919630099608884702083164754366541205908960231443997976417378733390798364374463072495586005992104412336471714153044446120371382372201888375362378102351203405905480129381177692493032749613678787997288916943591927641771378065548744049361287040407849471796087174360733780998130688837875865278700496584306157387077295518105e+01)},\n                                                                                        {SC_(1.43832855224609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.69784802869578241859347170270044660362887975172105734174126024565266258464185679860969819855411237159494880208775659644483956130836332702232190530810929795054649744757422772161305573550173240764511358994665056914899731991099146899770847475853729703216656351615055364186019583922630511131963769089890507495016742632213307435586487273302550332698495539906067716345084493618187494962743675749595552332810650864210967199048154977243646054575151056382106763855672206878008442750138657969446338772392977931e+10), SC_(2.35552125136450700909588091745369060423028983139872816520903248095735988926096539408608197096209270376093052063987604229172439260225265802753685264545909375191912435806334754171252744005893682713003301574855225372780111914101629076576865532039773643327758840495625596026543437624197390101438239785844326137114997048983495383674156592651243325855108913317388476131107876404382144566047990082712164794523533480397041648000824123176019495113050076473636073664863555590914648212166240698682112904657612891e+01)},\n                                                                                        {SC_(1.48963279724121093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(6.60935895139790537882629053978367065158097494775553779389162718199800962660976404867451369776960552719236591600432068910267380128788079356527364053960742437279838325192792879200780876443511952756771766081043863962521162104251062512261561306936965054762849927286751693584912828216488502812828560112184399975250481114240534601033379784321671805062685095378497826204531693763778896248141719307161590520638212293837683630156089631247838355678237432158041439105369297598948436211360132325716321014950992967e+10), SC_(2.49143375974668240626505214390533380688347483901923600653194410711886779420898803117624305175150341043802258914439817725968253567447217611716808423940751959127906426790655770430309975977208455470753965004376884277299048155174271626994824768948180598101500479226249068284441503076898274128487586798561957754510391434547445793560602560270702926430292523945864871226551425545008082382964277470607798416267823092545061380983203872604535986283661640712327778671943611430748664004317504626424589546239492000e+01)},\n                                                                                        {SC_(1.53649291992187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.32398807872101770462604880522949845437561627327099970169031926625880177450787091305806943792425166226349760109416361742988524722129994365817234844238217238280776183875198531958136053329307878216615519634840197124976984100478274525072421035701533163566711522102036089012153312827728373125004089091452062656302048171592405945248902229742770091130711022681649993555144430335475329700255829237894423454387315510994513159322878742867851744054629488404979443584886753077599413674731935221399660481631292785e+11), SC_(2.61717207322728943748655952468525991290519456198208118720796690982830007941145343499391768661158582463079187427238318410030877071806806689640550339944814862447936256191385266543955562161363885472431312410894245972233609522570605788757616905274288631653175310899279503906728266948467958956851326816621095525631182949074151124133792081477439296299976706029974164766593650975684320159080549146560042369407008513487199017496956162903888043233189053512653189235110362053698908875636116486463805068025729702e+01)},\n                                                                                        {SC_(1.59457702636718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.12715953502483062538557724081013911658822971839811638302861945974572255693067688962255936258136107927159156397019302467458578812492570380812155193959085864099568927830194891977976197587003543495844952826714426145342302680345261219277889687416267358065688920139224042982062304137579381400020918547309462488468333765784769924476330423965481843915430241826273531524867193316237485463139697249608343870171918262645258569752948674306051499024008349628321871360036489296090979855831343665951404747705820007e+12), SC_(2.77507218982215256456907361110029229287160594943095798751436085766564504848854056383180784211923609266348581824808197706776547521649865250928950387154147803287982062394737447091407237366260446253353498962361092296149900138781573804265098616530053928097718490754142074711308776540737540544940575655663700893805298458558736564909026609952731500867191306772061678923921512976870506621853315858796712939270551000744125644547207963447164060931746695822731105902019293199464525704273081787738905029417478261e+01)},\n                                                                                        {SC_(1.61850357055664062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.17392722860575210882743801148121974761526064642942975611851093967221905620309266419763230958019607719000964328222165770505474606502916318180914198593539748204197180563392900865765447623021484552114088793224264781542092820754404856979476987230596794282235555744748141761312510208561694016754873643072407001696236285213178526503889324998095255469101726657562023259585497407965044819950637365173544139973145694386482527985943557955822398804411240998455445554905356819455967232872943701528948385375416924e+12), SC_(2.84075564305649017910192637580161893383118048529446948578453913521326656332735959875038712393333194906778182926725108659503499356843472051464004490569862771906374142762551592434578842405679502902794587372543569122097856395778041583912094359797049297611712374378720254058067502855335154430899898507999303154087163660771590573370318847901286702302096288936111417508352764313313004247849530921319320099265194394899418464209193302262016659209266350773235272677342977910119493741328205818274708511919664895e+01)},\n                                                                                        {SC_(1.79338607788085937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.94378015972887884516054763336910522189606118466825966602817074458033507748376119333205280093377734568080933812880181397469279239108543720418046546393242253747231118747614435825455274299153710665198721150627177394186314404834695391882245373547307599961727815738420343965876901510326203038625545238547437760286841659242817122054781772597614247162591992302074382664668628852013285031977346808546879744116856146662512084091293248247506035169514171475602206223147110130035231646012874447469928518936288101e+14), SC_(3.33158858259898907905342233247024675861169393707251938469191257033208410100917459972779143360867650229432762775061293525931944909544742308642071992211692350145763818232133352151340411577042857364193387310895562018291498977196157678047600884999805062602410706712089770431715110819479340956053207090126277256504183113502483235445467450928666924159010047323141890303181109020773812171510173380978164764095893619679219250456889910946305970721684560117313859764609917216519924334102644122154693368351826177e+01)},\n                                                                                        {SC_(2.02786102294921875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.78859109957017847350282806920274651443560302946482537725653125558373588979620547457174307951510988004914510354699121792937106881509562013001424269265755625105237218390644714062461417356368115049002169379320461604955950947878703486762597646209323773900580501157767451153175713764274367992499988740605431735689546683299489274110181899056071627310526130380543907317998501513254047217553619093579672465892040589757413955618873138414486248533989782506156014995258049759728528931005608771532253666614776864e+17), SC_(4.01694830669526712285716830720908080882784605592145521661108558578316317527808950051455910908149355285774153589463257476880357990334424535910402395335745791832884031280007396583426939303870758983307128710895934002284078747537321267500943681680075881059064170031571211276699731527486478859823036488211903833218942468550621597608313941585272130442321011122624067155297304145649696594141596950613934123390910581816377733641660900214634788029862302747808523415329729542689300928045459098419353956909660512e+01)},\n                                                                                        {SC_(2.27562866210937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.26972717526065453243497606415341251348549318454328749063345501016789022692738877593139482043483197655452092404409624945435401219712933394751055303990142982542638490626258864903914758776542688825607921286094934655746026741953782617609006929140731656413762147816621347941826019166397620687687617958338526588369802976978492139986030868846810514654286239871261821515071359533295231298352162735118150234734814078164911480645099484217443573112986205065139813455381998998545524503845393344966318045384553643e+20), SC_(4.77136804516938476798186533137278659568953865881033246633845276278658930669490843676898202801665172965195014497394786428050799441324442769697063319265977100562116857211797345235476803678040110610393920650678206124524914628475872696681953068587543500695636587855133335172354100595270626035010678536436625753656761085054662461148396845219288688834873129706103341090689496045171046767844064903536927719224669351215677098391551160145540606820140357781318863155446012873587956509028891262429102384752237783e+01)},\n                                                                                        {SC_(2.27900009155273437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.85098335220656084805303753490068761820757328359109281073754662291972968463434371144214286766024639873517031309922165539968225455173766065339586915138107926116592127888942444414715885558417950943361068757427461766594924751498397917726333322398470362673163297540882067039707423998766149888779324104167300223636316709020288618852558987393457348461154024630406699740543022425870516117498401176476538043477712028469899604089430212225785183179305838104047207860532079130574368373942186221880210190007152526e+20), SC_(4.78183116013926830266939183259939860179077401608681053044395603667528238495675049839336412704201043952154019083949862173611780027988181004560828830103443451954397089056210419243214747839359840199778090722414767193111651430144242363037947410279734322169557386711391485096580518452505090282238086183149731814313987854823078824578754372724074767852358281888048711745936844806125636457727893417650220468092526639171962956440715985639690264187827522903473648954513132769343415198697642180909536890448571370e+01)},\n                                                                                        {SC_(2.32671051025390625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.58604880812110241454443187344936017835854008969901521612448078397011725521182274260449918557110867645491107680639172390431077293986497620091929943773518926625158875779142019678847319857283976396460950914258149177614913206540387945470639191549918779093413871219422081680931454303332602911745577297158040318588167794015942180633957877188108408414511350070549894143107543827204317830609472493471081736807394919923691843857608432586473210000605737670045134417963755562386466190925672412878850646405985887e+21), SC_(4.93044181070299253236362391869236800187815014597272180541031308288681644381707365789003158170467418713749315130448968112655720169833488122960784450610406416247180917673304201957658843133539076388057790707488923355640879455639581251965002019288706112569136442372744159529269447953305171290350588295132657475268242628869310697250145988245409523776241535152519668623579732121296216600629204372942165520109491547688534215654314055296728672031442410394104670473467792491661621391099880487208839854451013164e+01)},\n                                                                                        {SC_(2.34526596069335937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.62194975792841895720749223385860556288827451704690827966867908358586186377510532992856117196302979122682031742504675468607786075384709904759085834558269602839780592168397856053584192386946531537679056796693158685843165754560716769122635655901255012872787428573542960450960109793983675945004952430318551725091155795551025628653468443465024160434232452983803513580832219466805463816175449786449373136370649942608714940833213805408426003631122813929992880369255230264983494510767186840201746783450842382e+21), SC_(4.98851035944665136137672192015001725735574448523513365461276385649832019558648067889044179541346456242532613476455989696732448879451563256006193760059216702387425562105599088225278858290384189947360462270135584506260058165911777571573884965611063658304139334304428754483287036131773544287342207371086479812475077828218358906305532901236624147816345056599647796401492252269211474910191441753003225672987417389814408598457591482775445660906950641840923145254581785944936501393209938814257429135828147670e+01)},\n                                                                                        {SC_(2.43377304077148437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.52671715713697706891160979125509726305938336857375227981739347280081698156098205470753157358393470750460871546434129104796564469110666737796570417551872488487369188073057706502594714426114378400481728758709479982948715130976959130779570582764471731950180408630090081483358852495530725513094749077112560162052669265512824439653875495097130381916363837830846819531583435928645935366793957053876871421785132869570879272293855874083797851986233376775948840120201836281261161838742176319534574897501178287e+22), SC_(5.26753310241112015000557522065224390350586849934355945402173111140887220444172828628317710236715689207521455346719297310453881219153304785874778678385796785828487745332446719392011066902186110879351599887877146447912243725688438833509660397006601972675603832872488107271508427519999279790089693902852256436143910726195407163225441297282809223811266507340119799040506075622206616925202471755069436203816801744865249899061716663635367511603763321855757959797826421739362819278936784467235526333240005423e+01)},\n                                                                                        {SC_(2.51464080810546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(9.91481931939477877200409821527464389427790319314797981010141882262885019600788076048644650040650377535362177964203706602145245768311983616827224624813381373244539635935498182983132360406349699087792646029860366167832523331450326682612483319992522395430103670071900483202700829114060346675708927264287445975661170857236542789818463947863119214258860704868166437681591110751004614832328001369775822848877648740658467576865672192485902213245799314604742998766424238759484022554804825427810329237718912340e+23), SC_(5.52534876777131248526088011136399421247639005261200942662339884519382967508816892218214048321898008927408573543448324823195874404479702411208644428859048494602762423291775256567201245544467201367992361359313525579920316298681194519601969564215992810071603097749504526447365148514435274271195385846780047802038148332510936367474259891938847053684708322750072216689143695444833185320648783070435734567796528700749836875689519053250541378436858107409851809731784721711286317464058683088715442244108225872e+01)},\n                                                                                        {SC_(2.53307495117187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.79121106112468838114091066050696844501804129293613245609247373367728816889376752295492985773345298518680345254160672777414539504784062244034366992927071130241068099215571660785123653342892863707964883249932645030018511623502406446490102199974777274991930181335480495211340080137603634352285453834075031871718395777239743551495314947314361106557691247822941892794875598790154099400695381011643266719344568091225519853749774286383156255603731266332110509289734693913588439967324719134777130623892593179e+24), SC_(5.58449341933998661286597122372310908068026588697772263463044249340345894176388328944725581420298209141152460517528540753526893441781211306768929743670148144017974107618983180476923611386416457648485096243289792960090120596855752984855873603997392677295099339567129282671168990101291687441406306439558829817161464809106382589575255498512347192513308661185569879472434035194625729156771795356097872108174749327142347398543920205622238328863320715757170431227274886985176738777251222302350541069469760158e+01)},\n                                                                                        {SC_(2.56547317504882812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.08185222038264310688484759500453549449343601064644164578226877871835233183599988599849700771875502956914278412964901381416613960210544679350823989995570437369036190734750778318562793404061483974309879014653863257393556814923674671866439781516249984035720382974086561705649167984614024640607429055768235065807548056537920522450166912638945908740103020466720001647701905360891552471313012203374488015308653398882613931193426996660927901125500252723485067627245831870925718793482515777531619053612687460e+24), SC_(5.68877180373048439806916604413364161076870205125629884067172953865884788640557118206524342356674419695257884468542292195573826085853803663075083194084437053651584483581690843123643213703040991328755997152307630162420977755970157738226132226009170471317409024940261640805586477529151547757888099874951697765060606236562111098316847459517577939192610719956677422578169633736070048128858421326896189519142109020020555616416933177181768098595337956671066929651426668945879292365721802750367824630784573999e+01)},\n                                                                                        {SC_(2.69469451904296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.38946145226621904297694624320451302066263074623211393616779873785651027366717911648120891981347459583972771523166906685960614818223537432379830257868186481779524300591340059147240741531278586780245686715266947950598093181762116682854730864826733954340270125961248165415267045490110541647104674953517683504102672070314779850010955167318136591288937266213480474554707223709046826452399185053344741367632997822647833919635890641991088509209448968323023529655570431435255168043168502497343886638000217508e+26), SC_(6.10878834629790988160802927408530013637487637537408024086854879487937538346516092817902884700523912851786680663531728945594087355952290948434712469565483226874890331364554842522170361208548681220518063358284304337845142884753062170082309483382202799671294604562888151796855985913051886219982752646724472534051089361710730038401364058530216782736954910601778240054306252894308364042420468921770314303281112548652243358425470904234578569201244720441942444412712160479229668466116080101258970797763193003e+01)},\n                                                                                        {SC_(2.86065521240234375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.18297535561400529862154201588364124930726316786053177741785127024911984659957345520275127146976325947623851930449300294321327287322540455295178302795770977364632677858658542197868062436973426239080094795366182479671021295104621542595009889405064932729645817668857395088805081325759068124462747875534272079475902645304662223083207008913183208964990676916644116280376693740913044811987470193425546341939265091095248895519540770857586981347068792465579320037618105504314455654476903086548497888600391790e+28), SC_(6.65744384237173842615460580640110866830348471432619027751155697794991693556178792187152050398500030319196838124695595345295036549337326091217666830844852771807996923397693517071067680518019247408431217179931029441945675593036150502785807644274142395991615983425158657556886396005376861112808847592605413421879099833573662691886365132153489527485249192638773347480454987269091802611271643541747113868528167028724782368679415651577580896606709898140508508556601010526085370686307990029623178600021561237e+01)},\n                                                                                        {SC_(2.89363555908203125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.46364169422991361911522707578343379455720401498976706085708772208004310307378137253150372308002784981732170240094025073900289172767739328344138660064293375101443634174935987514315071992162722725383072608509641160645023665173358444455855164226679929391852601054044121137601734835260033769268144202422171248364140069795502358616158799151473495887212541426467037741443982494760074928831400539768195579118314513062832534540055300337488029865295302834134358823392899209355307899399975837372513512615528262e+29), SC_(6.76766083156218277259765307036062635553227023339066248067234884992807148318643296403891585461022484029987169548871600200984229656567414527135292403055378517881471207722154621994051797163447572374473358813303159020377166394396154103712732393989825413389704424065299279408848274531031692626640889901897059424873169831268752195564405077908811735292342504900309993677035536590868613014160891096302448676770957030034583001066480278991292017941290191602708891680676674452826414806539974597961193334063516752e+01)},\n                                                                                        {SC_(2.91395339965820312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.86734729521848082710338701890470644781523979144988928547521261078461371643143804003634544436307379536701089936804033119939526653843615648442229267012609024807113082453171604450219011300824936008035118170099021658680615814976974679835360871193258898622693738894568685412676828664766739487806291253172480406131437510013598190306985820790872533379477435332338651334325566223190849428336741119210959477577377495620582613192165806843439901031017616746525463204501806407089611814441940521988506672497750797e+29), SC_(6.83575167822765613078684054515645393136576932380725334766476664365352993590275062109168114307596103453010108572728218976725262757036021598627832561241938784794755114892484886153522451656847822582362719077906293051861728306450132286688917383098776586452863162933819969125264194211479702244724500335892028324658730280000067192121885937096181331752363056120072640955413598291279300652293302670284003703187827689607921107713327366686226032251376905617946954001970012496577909171241743428353950962394964080e+01)},\n                                                                                        {SC_(2.92621154785156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.34523745563155188256040850939691712650558781254414493284991099149137086775804978560403467599728219475856175016819544619020204249467030945623725845540950345058678326769601337070738476482943736837088975580253665438542042740591916109828199825079851763141821593378584210340486225854165051144199045290135047844682296062829530542554728086498690404716811675041099263451123596611795451479772232958162850444504127494422572533383884316076437492806332042890701380253588643377173905471284161483319427666467625361e+29), SC_(6.87690198348116810755812737868634699468768949217905626771535888361356100725282583209314122253247668616093135958957553107771336225034668220637724665306401194336890593782398203171190925637074066752678780699802538897175854158127889554586448762692453288812540699296363525839207569798672579000882179456645801295452654363970906333003928529475402363082584130085014788661889705740056095052998499027843848922205804376125960585791770656488154392778071834778842343072126162268133953305536914279513720072126961022e+01)},\n                                                                                        {SC_(3.02215423583984375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.87297339346442413223626441881552996749321322868278677388442717804533541719793945413780361025036005578239666197991100518333589788384638801500010329805962773586448566558417273032380150895643250888070791874193065889150921484137985142416411695450300740875263016453355656734191678187675741194964512719726130824949769908095511629218244723723630403258622347581987003968996993057199504979872174846428171029999991758822801819524388081710906001015766599541753063033276293523002868633523464206937949347128472368e+31), SC_(7.20076651008718393001846413394830211369113155296905387227354397003624157955172192372818147723165782354086885513643610166959516337066924865599773015660602163993110463698236133192801490805972757732043844737488363072660380105391287770687977882635109700948168715378611974019099812843028483020620951971385640401828381583612714653451198525471027241404044969339383278643839951906402460060093046138787896253406949282594744469482087285350575317701851773982283579551304384758910839844880960048254488720717351531e+01)},\n                                                                                        {SC_(3.19958267211914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.10529722092897347908375684350487190665386510730995276652694837226076152333891160209381011736663624367269277904203119494159424128154849290145466186191251358876514454753794811668164171088503081783194295000984263660061488617874426296564985345060633416828688738656050177656080448564016966741708683129986866682190353169745781845160526162005405982688031758376601477472002985161237064932920608952502081314817246651441220918323804178243806445392459543046096048748961265026413160455472006160838251124796817586e+33), SC_(7.80778258946240115261517045561166005792687796547024600776968032807657415113574297406466783012067674621855018033737058839515115740858860654069616412947264441341384570632838998094338026850938979006690501945806609196265904893321792150114088608539539741776326911715297018531473204914273174095721894921550227325411988498328959109687266688893801219762969037285120247383013653504865071864740541405778651655191375983172120022638414111231251259362331464540155947096964038949774188789788535095913097967665089985e+01)},\n                                                                                        {SC_(3.24185638427734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.49438161917542816534549417847110972760529902701104654598890087201011890720206561865852952926013434976490024873073435910795715920427118281149452661845289951217891902764247541018950583339572116892564901102645427222988297070750380042289494295927433982082431879908501042110776671962769426274191594098526350490499516762791016191688736257490680490659195962464698070712029836564078042389440069057635876071638944161783898392349333989011139633739055040406159649536024346516120217708186552130193376168867187554e+34), SC_(7.95390495888318212998760521002149494523088095049632835167693899200198082090417159595012046716410467802260264700130964429772344648971739989016371122586195899096394787637702142096084678211476489290836862451591217695503566590775034007077763468945954230266946092732190012837261614121604340229450019002476022441998401781862534130907660183488294438797763449874362792394654275157077174892751537287233687405534258323091423343923021443606445885357115522172366770443711515407865380305091563963432540105037663781e+01)},\n                                                                                        {SC_(3.29585266113281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.27761128930354919701485516775667587490850229398554669934207151381442314632638880588591793769213728389937267758877156797146431055220502649647576202415695404415293690290835812871829309812033783385556845448116306922255075063107579160364093224587629500425003631224353942082977712187414611070893088706021680061826748100814195305872240240281013895126124269098074441195123008020302776033608084468484346891950551401159486446276412149880984130857820108962206580715231553561781131362399471520223258292277658124e+35), SC_(8.14136054684274741964145377939215014807692010292090966149434708384796696984176953862437082883743812556422595798902123120393622328481916071778051151799663129957386718254369476701375784883357238860912730696684301085661489681041613263972448106796350804708520721594200966626630627375617024352994350036701446953170131728026058978104853485950120261498236749505855833440820778208559278867213296060430539496763904209131345097333341183094665414276490139448832082529973477245744065749067843522574988437041848634e+01)},\n                                                                                        {SC_(3.33357543945312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.48300159181761200701204355363695060229791968154368538754064262719097995063035564600374025008951067252483790948590967248724178893972678588775440775549447497293942678266653534753786827947462288065307814703139034747179856597160532948750746902188231563587909018174823911788915768593476118531727242871056689064731971077728987075607744609112629093496420251907631517330062434138506878049509818111073159446603636714880112371770070022582019195746855578498298366073462908413983843045898442239545322487107538287e+35), SC_(8.27285426032651351766507271768183412890756355274009940387465402129137436561575209724804631194218211989913771391949002133767203973838994464541580492006666861174959066106401079823967507815953112500273849939997916717763734452443126349117613296752896480185065537237343706449268677750584685983026546829631494775101667241984395834326209591964078498650831020349540175250722375517632363885845822067443894671624263457755868122233911423047215640037633600146529028518371062907190179673629943284929582240228457933e+01)},\n                                                                                        {SC_(3.33608245849609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(9.25910975788742653205146646366082007340773610996176154798821130540958169768564085960223240057348637196035929960628015222869494448079409889252897937593634818967229880319441221801264922080032552468069216002312576208837467708731971964200629039661948814022629825999101060910619328263555037652878100470180845146148712279665244935657445018110862558457547071725686710241891281196021326790690207821250385916687871554698057461130870747660433547873539611604037601274071252230760029267104222180344524243865665364e+35), SC_(8.28160861603710079118490053139180341967390190183525780661970734769298370225490936552881352084318266572549229847106951262515221025161177591569889171913498625190184460679288204802168171780327141884782319041783323341744977849737124137079856773929397936817750860289617101494377478049120537435300917814010237687503184844519123896060589568190512563668803865162575733154754837230457246786300598905794327235054896571232850622277200782063661993728071438869663986891063212286553580700214568365161762642741449976e+01)},\n                                                                                        {SC_(3.37393493652343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.48031922819823306403456121055533618854815349116051084146233699504748076904249935854937286448179965262152721118856843542120460979737215048811700334413415327659952769299589060285169409827822674705143801238912097877845412052224385841228833750504879006197212007063193332967923414106315429839140702588109049569590790890068717314510166172831649739497878166199567098912310727916539484778388585294038930091526234141318642268922494504101512277533859788856836664268133488842793137383127949202371793208199372652e+36), SC_(8.41401873696057544417316920924880046938250235320124753087311223250489866574699437076387096536169707942889447446804102388757224486826658788938004867333184091912546002317298246728424266932353180419646334522781207966104359297728072535824671094515322040354822991604351531178940114578851898290053775097461417376852674842647500815188669436253178796934787422746875982052670423777598961614364976136407177160333955853407004352977148066120346666204332050285075576875146205115570129251576319589461496209867854095e+01)},\n                                                                                        {SC_(3.39577484130859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.48619298028061209986594333844848533957474181352087908334467421738975887543824669352195537925855435254962699056278972594896552243395516661570162654604207808668441002329965436921613187220878992455054164458716043116563863146011454580903097467081800181534328436201435735200565174945504067082424441373813455174315131792153573341277760856295122752191631892485396891765788245229424967621381462454620224418898356765251078488288810214189182624366940263882437751772551099000045085151783935984545593227937300553e+36), SC_(8.49061237357601677757426820584806409653635968531783207842298956209531777624307597237621381316962998494942150317275507789715941449133943051889962932131394249277725601498149620868390677403670219936860302219377586891581268839739950203958740517866213446058571530484194674956798719844014554494087163357384615608021899824063679303890626979693426040721560448647891115365732436107517123110779205849000803887184538252508823293046458420647545970247437214057700091133222182379355251152683343470428337908248743977e+01)},\n                                                                                        {SC_(3.52252960205078125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(6.56071715152585497023092290905655959502920460034220527312022335847447157154956146842645630131605527008005874505359774339299742273930860461033228954281920264089749626896578868226710868563927042854240358804527652171128934251989148616435512438069075763900427149132989690880480177660180054073738041633796251162327302376422301097941705408765062731669475812705657287562983925078410268640206842398117229936138220828044117537896910765536074516823769915511458415983380113545538145635109478905390510739920050025e+38), SC_(8.93793334526334738411682956961255144453790132511539285738028665409834504718444888464037221580061474593309610175221455653957374652755769082019267799560912280759842580615594011644440759597791065105166102263051244385684737404118153326841745732831937820401128679071393078811998593562915566091676512497508547760871102253963272015067862936340161303105660559596765477645243666783294043576540378593611717496449877183394450670074809802713021946770650132022480046114445191025317965061628660311957807807192746963e+01)},\n                                                                                        {SC_(3.56992950439453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.53689053093554857618544159347188992495443284898295702182825966086324146810862756817904814830792850077597275262900840906884137773903601193086797431603300382282886366275248632332271576233699015109917579568871683861086177595480505648823337658476139211255709306272488775058725681443846528296758964994516545248044490395799486386700760890674575753723174710531471038216033893492356552206670520206684537324374000788465207024929065117767768126198999045992857823887533746905922201915892267316660275240932491649e+39), SC_(9.10640665868190858448532660505908724776333955128402397523296439018923986341125101822015045933309583940961784261950267375844113972950394330335314672511761753499894659082898535243666439383791158489256919862750008378539198210427205060068688218594844978402783702908704355316521120318879716251526598853592425781150901117478569631977765902386804588349601910594652674056748675521414811504462212070930437095416179775298078616861077465917526850161944018776608228044914807483704248490120440411257414585404454543e+01)},\n                                                                                        {SC_(3.58641510009765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(6.36424295432157511535440720990490713142478928850445545882177788146631899583265243156599175619499745407860152595623106429048800824391118470396354418159458891946526901518510468502225964275013364445514500603839105828272246032594586879111881480532434185612132159762451613795842833858892548735482618893000745983825064789554050634942435506397112024172110375299723154354678671706272365214527471172105826515102783386847223543521346016357252788490199361446234119782003104301862373067091039928786671563470091942e+39), SC_(9.16515139128693651595196512708547636324651709683123172234498719549521297558840840169159075720023119839428299786498929100525813570217317085650748538899182704393280910655074778183239450945435128247151520084833379444108879242189647258521809568987184893901906094154668037535011831330451742257699231391514383734240951685863272212864615171585376112089136287668760813342388267415735962675469412313082132336996282245207389344858159858989553753059675271824412086490559176145293682277127850119334630174597027170e+01)},\n                                                                                        {SC_(3.69956817626953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.66259459422706588699222738869782517771013101489628084466644305870430406070798942163490690127991724184561667952578780416627685499790363015334958157277107962880588462998393004757322874708922780685347930191019262345739771673209110527629711456840852047746136361035805476632115828791555934130976955731492222877982759318769041605433626949821770046523696970438061167452953903697439594188383812573031381320960762917804462780349360037016873659307232172834758981537825701637399385060943954402291803761025188656e+41), SC_(9.57041606145408355846377105120823310875286105242288743240649449931243534372494492033165984965615897580866359774857197083580527214825807028474050660229744076817699154124010984704156257051369003061832044509444512636886565464528020771580658305752979819543996593298215761253550380750340318878379006801358477171218731347554516929031213372595059582888328507472127737586391933992553030899119731228858902002898978177293675803817519606691852163068196667587353923848696248145698269407401972926102876192198856403e+01)},\n                                                                                        {SC_(3.75548248291015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.74892943333515253042738100908952443037802362410857001178764229199499845111375247272035285187196798098716219931748693667186931599552210927405756323100223125808217466598800945427146736702619067016437164165956073787698936391766902777295693220076385374900233043835056148278714940830326392134463942329279148370477479770746280321753286950085635627572858440912629457352464345539633215981584384577339680355270522130806324842705563048601979210064025901207358610376736679572198026858224873784671735129803922494e+42), SC_(9.77197854446636261549767992618612153338901331734174669538240849915777728762665304807044964569279468081317072465445392919466603094510230879224662720866001647403529844997948257752306473456879331453240965568476477444279665524301166509246024032003595520346950239876945351260944757676816304846242018005998244715086433298063772518276585730102267193042838546658977872168589228695054959695774148909268194979897704922505548574157071890259226103350432160503061387135033879084934257843059503719574103241324813901e+01)},\n                                                                                        {SC_(3.77689819335937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.96230102874396888499645027742495248912447947437066102094493234389694530402927062586053005763812544416332451548507571624128507918007597186949911423259731332697345887948321691383515686149543224694114422053539249065095491560459129555622893486016029603928552949258140662583746543652350183245380752554459137575155817510605776788743415928620015393908452765207340603246552035088794620482996203019784540524531971739259410827368602035166344872030932413661636795971207162080060617878261642791350386883582954744e+42), SC_(9.84940303909663096910241318409289245212500019975324319490665242340160947312198602634920535331626298288860399479371441659954832274982476753196020766157386868652317205632431548553765514639828150740532472745982635933859447403915457191153481050654421953287290317189592103415626818480295779308359194099684087776250961300213691244090639997986010124824245592443696072734945753336322423458290341388515832355186237545984748745345296644163498644022002138599063586519001741166436802987643212337888398090681552556e+01)},\n                                                                                        {SC_(3.80960388183593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.94966310132054302397003765407203158363486041136357047081300608006350006717205229120710244797692588870835750721429283227140051425723505967609469428044605287187966408282088301594708353782058645924215880213449355758049345549942894658204524680477066959068297785174881565146038159618757197413159523147013373237312323781047617212934678594456598493072554434900688249329779014143005241366335087359096559424072461639852732323393623317543297851215372216617977352868874773093064273882043088007553752439030053374e+43), SC_(9.96788155878398464050970974823848018555124016340239710302064417988281268688475838835239358450786421871399679931398797995835233726341480134191811204238900043548692242681716750073416459676325619327228606567408071791041231548207582968697208109467767013876045530146014314654216878827838721817400523024921837183738330582752480169454610303023596022550679002303388123338606507066113662753266806342456079882031076214547198353221502702511114200315582468949405891307760099327072576116921468452800633334968338123e+01)},\n                                                                                        {SC_(3.89539489746093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.42099252482505175224053491172987287464999395110917309159539664973197176042409395425197153828926115134536219562912529335489935304617549050753694848890326784187104443214648869569501137238672773548427757359572273213897705118085729449223906502037596529602469147874376024285396564985400296213619760577825594742208116824657396999627685210334609177578842262952054514305445759630225916599065166880216435147871714146695241425637568248234770007348891729125230806186695311999312890685043669601127902723920549747e+44), SC_(1.02800108315747176667580757624829155137160586685435413939740338603105579138210801292181451092389926592138418710192414626474950090060776597949734074627296310738607025324151493885220015841053889049529946606110349099977487577341271553333304748516674899399995745728225290763832733902563955246130788629755283822495538598306738794563140063680581754879586565113212214718427262543292536373096680727403567530069559782665899562623362724635818341486292882965759589700454690944614847393328224912276180561566065964e+02)},\n                                                                                        {SC_(3.89718627929687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.71969740749970897730290012846147911686009295785003916412901622093553119195538207033808624095475273429440041234995502918525910378308579137893316016944614824299884881505188300485682346316635475893326590902073416685810355968417714306010036179159455369986745977573646382266585974939814873071165709069115729131193158330432726853181872954032010799755564920125347309967318331099101478259410726026710700865683645570693157050660905015788213110721919051452797761639065826101198888774024165468417198360511986211e+44), SC_(1.02865488780699861093280112199126891329699001554222129308544815672432515028407075944529333679710293149443274036217115425818460906925868653036116530838271231845983723398621926711333323680767611079507871939945224386116305319732929747226426231187768839594051257964947193446101142422220266262855570986577873280585722389225128219470540478608400204575528092251890460091176254511727568693251840571516976921269938059194303054284592498400851945638696563192595531273277999456371365165093683664759202661955453253e+02)},\n                                                                                        {SC_(3.95919799804687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.56094771887852659754339674542850544692401459751758415883425527494896691657591433112864036598563840079475388260010228239613975962598011953360072295567475554942703652000460050230046640009911511053410735581139875607363314195967702151493277296382101296360216341042964206487286690492474027343515140566285280821536541768298788592515741054243967328597974804693646128792971486653117608353240114118421559251016802090607898167429626748932448659899792094485347321058606630943042209155693453189531774741842546225e+45), SC_(1.05133859619751442523240614026983326612739656777413443094256832978622427439856340253648166152679010556697821281893454391166534792755872927350004043092036260784892300492613463717273263792090452502567869782859374087618583257230710949894488889157036516384452562108265394912037257984765405157055684158071284455805768007363253644757106005305345135932486240034601443873038626841783178895988705252616961545535592391173264126938223796906149475573371275187276597618947176255298870317039030185309540989920657883e+02)},\n                                                                                        {SC_(3.98988037109375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.40627593316492444992272825412223262199673436499899274677726470023082915445824866560883298321178664586000020727213649149362741692666250092112899640459218507995683203027836958023404493373619001614106360496422473928381026688562865920584034814624925452283815578341383405590966758597941647998792595251927194506602941990484534536954859045350149803944597373911154560785502492566964912792324178856844111383480846116465140788837075282904017135001794788951305979165560179546941585375123808713637899776357770658e+46), SC_(1.06259859305888378907799738967210580839428887862346589832422646064411864637416651304345889163867424880543696554072713410634078133737343313928341868911506283937450816542628397936908503587683112341752316515252368286680202218031445568313709099582003218980293434823768931289876952350750914371043681284514674653547662409120048898441288382045222987739167127214935250264656780339430988611790989613500898841643685370671893866307781570424733993859701243964579656627126825398781572968795666477881860259909590879e+02)},\n                                                                                        {SC_(4.01209106445312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.18208916857154395368702420922162848388742166024044813062272795566235213609746749799338864763870238526778712988027884513751820183187654812982992902723115157504157903691430537559791337701464306927810443105593740233499397841866595345518575638157812382630916092366746782345952459608920163041236268086753016916702027845839374869326421498055020440558419581789592663923320342627972875884370276143283894930553232704113807619621842185618990407121653376284442190681954184665323900163113646750719325004409065903e+46), SC_(1.07076452230055961349018934745963009530408242685899091904199838913486514387760205596491425780538983791270407761736341587942426767707401182094852188846903951692725216878150525398824647879901311614817395461224548594179988807081033015265253650683792469069589486412803831092929069079995089595050710980032465698300202811465535855146769754426551932930019839824999335677507135381848141539172684033420408805268269916705873041553871757695257600369210361634571992292136556517653138497930604300512241679666923505e+02)},\n                                                                                        {SC_(4.06430969238281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.18082308580047031513981867693577135844953709455788995033927078437485549163341744994659324610448675205268598737314781061892395944903689750754334036944685391608952301161815358037089584556246568491089654734140280148469134598272099686824970323828495736821141447121275150871410273803476560050882524501896961102850106224667959869457944400000142782600575521603363928626040333995457611724197183012279413386055224125252627414715903126580378222565406209200875218927571867836787784546849410912775700152767099491e+47), SC_(1.09001201738556231502109212028821747819744173956937210611145484264719711766529469851601226202101966363674044959771068322529405703004076853427974169568790980436150996312637283223952251608940600902363778319452023869102298665641807940473320405315253276624239835080330467460005112831893908538319723111328787953563154033212840356431710476416136889509518166405292530241843482629331557000897340467712989345938014565837127436715649812066402504490281339082467632965896864817788227698937607171213816703009689475e+02)},\n                                                                                        {SC_(4.08205566406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.20115641331440339467310215647884183473659029888921122709491804851243055826685883831686008341760302325362966434000996094005610893172525461862777958822533083698245624745695683931800910290742279054784103111180548974580560857857998796163113975003594791881891987057953771318195446012956801609200507156275155523646011353122292253918238750951175292540631928616440892348597646166577336605887813437522385049922505785826990842424641728141841630627868589447100238126726740130420110706707049750568248233449196792e+47), SC_(1.09656859194614760424481999745730080743689952003240194837592904982820016761495823384151814047070800938228767295724381370266368325577544870673863719799856491179412459655379074570077143642096179778941173607408388539921704892876303972073935153969731007313339109515516504838047336843452280164504414683517404081658767756776332645522534734617981654176135384648344172056441923584367044372654115811002135162379615965022393207966077402824245957958379472204188883421647250253204160191473856460368539032329410990e+02)},\n                                                                                        {SC_(4.14003906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.59845508598368999690356822122786192315007321315447283315450935378396176720469915594152097905704129591162266777830663415849047027907750838429775541831407696504392052400572121244223497656077607413870009833655228571199174047652016520604380423446828383907772606021709062080986687817756548591328205748985050739484302737720191387375280437378840194735961822813725566987452710076060158391972854275750636578040087619684469317030177741135396923298210480860913790889397509964510394078850965088315821477380776088e+48), SC_(1.11804589074285832381098988403766806882167453395786572096767020977168709412715983641058656609392882765351906530753747748674759546000501253383475774797153523883205963055438064127027071634192397585343592926146251572155586296982850390149169324103514178552519548061443253673605754847105252438455119244896239056965464264638034015785618021431808089844667707221953518060774777061581753081236358805014661389146949376409476029618453753218158016321577730881781246449884935092425611660099548318304231590337873089e+02)},\n                                                                                        {SC_(4.15873260498046875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.20430850488529878836364552230116299589347139302018600134994455219285339709369731597644890276614623827683116140537538396715869823317619972266589012874381591244984977401846711457385911850204936287595687811998227590480489823148356281121021601075546520736955694475027986337379895562659885275955049946488528780140151750253515909768287231178419256423666497593936884971433525548497845269710395217999826831412786980017642018557542666638085883545424574454847755827465747444331168181845032946278548455872510465e+48), SC_(1.12498763714220540438563524043282372771462861555428713271523103445069408737133622132683121385631156666035245178814443182982329791609993821751785565723767774874223089328820219825695895391915295530433626089156327800417687038667437651350019555366647713635319509137297336970765651464651843715112398253676843172558891061738496378388977055210658974573259349134471597651761705973215638004653278207036224383533445539659302602104811301330599416142944383381481264448711734199195374854997388262185607977034033386e+02)},\n                                                                                        {SC_(4.20431518554687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.92880881251103730967749510912480493598843595405471163324545178842772962570010986824734097484061068455093401771772721121531905075903632713457103680305348742610712310874643764232296115355411579409633692937815546374130725635890491394915622412113033710488694412608042964148263407503190063442834332858662083332519073678297422005007330537623373751447891670513197624271083086765042342900506820193007162544510882574550533247086767901068075725892817904636702513614279189463973072045013791188933640113446761420e+49), SC_(1.14195005835502743373307382571057774122368294248710931511975477944474224935395676810003354533563234879263171895376838390229431712878450108220128468846535066479841227481417495748296278603888367872358959348591301458722294073709700839403319205740502995726587431105009713221826249006571718933027393628970732036766349857156430552700157390780713658988715267424292177543833550294196408998572552973896299393525854502939937276559743068770595510048601765523209161655344238224667839406329041480127203972644153661e+02)},\n                                                                                        {SC_(4.25659027099609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.76541747444828339579038017619796984359471286039806019316727048877048257539380358253089339523676320298696081898260684379974048573693162756925809315902370541128833474377931812078634583236915517735326549337250047384463153119151884209825460848162821785228341141203651681096449503478365171880240273602509414989550086203413758399602004230055331417266786182692483906103345380471241262882413062169697340607110713479035900893740354405763128235764347187263956844572265588059922589158433642194681578424386410597e+50), SC_(1.16146446258613362025105869625318571393084872722164662450811852325819135149344676536830510727855931806617837276011625611567469842242910743015303242047386557609659788419300778657225959510400921822756093994824407895633345859742201847602706421538229935465533134042778503324053901507147782681107782285461584115094814278955607068224865608673981699876775906032963995715147420329086417091040813993002158649646890276778769302510589547078761773598472659240756642426717399693291853959152186765572951211196144748e+02)},\n                                                                                        {SC_(4.34864349365234375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.72956656289594422179555435645719665669151490833170931930540394923332882106150775823183828332220383617382510756932983303586915971736098282331585692286768505004181816760462959102656258137386783432201464814268127276757454206286843303172156957352836291888388893119984878538541897998791928690633028009722293016372498432461107862848660944247995493388469064754794464528855028498449553615946195023389978643421041637870937140583011320703704692717358020944793180093220881326254134670415296923074827029778197932e+51), SC_(1.19598555462162467933148026457348534355944193130390148152606330964950606221650592192613479655954671569609330547775869597899466079145779091282799032516775641299076734660916615477683671761556060464003016474451294004767328010445462608326438799050403655130043418389705009651601146153278786675780496717162315309320268991161246457767219490461631831265493559014025530287815822035748847456349829171011845315753981529970028456542663639290669871114712818412020749472624292340800036522128290544206868424173436070e+02)},\n                                                                                        {SC_(4.36616973876953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.68814993652251794863224878981547465786534513650004201127112212499173138764713817937139783355819330391823621919799549392189984387660232298430029730994597271728974002087860459810819914998571269691400620834607400152357489032975871154006275142032822382102291315307408953002930868517119909628230070576512926794992880041033667617964619069842646694788337585073682192514955151687845228629957372784705408183386612377901465234782668096718165488873061596447190452739003526477286481993297697013318925649609156329e+52), SC_(1.20258058052873536606684749211320913841318151774994016424062717103555487530105994837794793472882164536014792368199410342812750725570440917170492422759674508616322478334545463606118065035246344840252935442447026513835003563333039593965539598067163193208964897341963900598735929785806647192749611989499779600275587111896635290788289254445462814510539615286540681330222410686601717760100330615252014854253402490991006888805973485701862169066213877234224767156317774928010126959591214640230596839461830891e+02)},\n                                                                                        {SC_(4.43486938476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.25468791812059674818075802726253273137197118389500421767647560630915719230566372874805755091307271651210328590029349884142749446165098393203525442334507103793135727453765596469246795513053050205478613191355679257965108739878334191098237820732126348132220181848752784559742716149943714927169182566203113208033329469765353694740919325562090320321287992957548867642768909406976086490542910518621169243395437240396518869340617343894813308282912032715520834572908498174785851002365797607975470857365115363e+53), SC_(1.22850021496549589904106719454578947931632038847321962566863177484470988831972373472928283280292886713704642219705797223420020854888945961080804508893510944936553093798879377213844669481321378157164169646064383220886223821127014941079511752768795228450699483966463786047007034222715103412001785676653468851334388436720728303295782673317779798050475460885436853687370151208583485504058104087062550415852325039810218442842861270794195245093707199758807677284186254790202386093743873559636061406926588127e+02)},\n                                                                                        {SC_(4.47341918945312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(9.70051768757705787005643221470781194832110659669260732490569084761259949445373930344602352754134547843607814413559865870653444288084354780008568386496571756770590116919940137054759042323190520830096899456266200917379520710874285797058116513189434882771150673968931300996051810213106882475828122998907839209847395178439543785649629732774647393938811580789297673134309473455986785492853786386676589392766954242379779333402121722590790390721840948655807960929785284246141397812978871417000406569154097752e+53), SC_(1.24309189182622943375037734563801974736052548685045190679047145642944399136878976110953100048370266139467196398387244758623610482609359098186417799117194294840939266874146185433296262149426750483379751307615953537745853268580981343684728567395638480560599565758864428224070365072509754246648958054305875196539342924852749871276537707041372694482750537772405019200044601308756097073098620381025132603017029627009758457770899915858550187083703967813384108647208048033750398229894059929781335876419925270e+02)},\n                                                                                        {SC_(4.47881927490234375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.19037024787675703270175906824802256668177081322569037374198471868314294187129454601713334226158013396153676975596092094045100532798117503704133665203016590433864389581583864000633714389579846243947748106569550907467089547958630535202463362783895123615607549081555441274565969241979835396858131475534300471286406592205619591878302135023399512555867647254188327963666245636949162413520398427502772639464363877586984294087038276975401950153279258436991500098280019827786097195639103068956276315504273530e+54), SC_(1.24513859413079716889471609149241942716494855657922499808839894694292777650624863833898685903676326925038786164757268460095580647000754352776499175721803590494435582033180536808736692606281673139127694932223203775262221520114380284811901136965375921716273693603354819612296765247177033895333364738342530178933237998008574871220342264341590540844843438163019458832092461223509223687642679511898705977569609176084109816510700188357800752241155562857115035298751914915182894875188271900249895635023723271e+02)},\n                                                                                        {SC_(4.57134094238281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.00895985290233668670115700433024083746043210901127969768373352568053703827249253423594342763451352126382377318449657081168034935524493333635557477725982118090998765898303952391564641407905200994222518634479384643334463710034339731549737840578045581764014018294486920638770652996724550267061034708139238146646656924230998620237790675184993271033067273392496695475878552249851339975691034041680399364597040291053269735313150315432017445945415798985208279073996905846439545084621066029644386016432767382e+55), SC_(1.28030711934040369170085309853315597227241145401747153640034732528030582212569910331297382322800356855682037417638163950624408603182347996363131314614965009557147445524418096128223220793705867708483717563206995164971391583728919535379788775190549358067415149827563122933154649794855111962415462311815980167072594373161961801038630838275601277930510440672951033494274773898066936481666055852803363087906658370311631606089216774517991442775368076850394323971774695447095042326288081304896631929106818814e+02)},\n                                                                                        {SC_(4.63315277099609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.24633970510507375036559094674156377099419907568922363303903492850844317662813653019477386735973985177161212739874200979711294338447730474049016228761263271752884456089449825831843270569278309670544869163579920596429350006069074209949900748626912423168029920991458384786198991131770280160077208354816753922904957064286491706095964965292514470849442763410757990865377051954391465148410911370575466485228977574335931993387471519823227077476617228714901522411169999281994184409464650004261241911979274201e+56), SC_(1.30390822573659961338953885492676430504665318415000929930781588727919660473425330004665599213258366743276860977259356309724373064227612999936828017700106088400776000722598615709466144474264636357244405886761721391443398396975162054811810036726395042116626137632154634040479605170823260376657811882616309641898973459451948187097879871916870730849711466430394406473832927502387853125314990621335923390986635297785229547982617274024804834064479825192274186986047795822045408221180842199929067855081710101e+02)},\n                                                                                        {SC_(4.72839202880859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.63821708870461670236425303997171857446030642780412338351173306670769420147013288475535988037410648087799473150752400456568173627908249768063455553049942951523776155895248754336474963088628030133266198919030517445804497569759652017168608526087979704838259502475893736023690377526230499083604699664347661676504249685925344027667270918850991470512026405416304869157971883893321338683873535306925612356247012349279223576584924497035099790542099372214842899830944429445647061766741233489485547108824785872e+58), SC_(1.34043543903090534762118836981051230555585566568719196383506269461388128995869812946092345008605522173013494204003842705732506469940880871502996137876794902558316655804394646347257188110906618332788660273115107153055290361642853427022117840853464302501387721367941642749893103110450462429556839844591187120760400036347174278368681942538682269212945273519985921088228798700698799134555201169279281163880632451610594798285227398823616422503499241630841435993254601481530490830078736679504569142528714243e+02)},\n                                                                                        {SC_(4.74172668457031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.73625544353333265615781749855687672233275458008612417052192696528350181797907711794066393266805605907648891659785659212580380748995033976037597055011340614756467279295328929392709562750982325216429658258074075406921660853023861284568266983181973267710575610686993785571322544755119893993236976569824276682221793147216715122417400178890934718771009766770235731147486984899141231312311950165863618395961023563287555561952201873749013746536845402848476835697894251003725120888188217151015886016512516844e+58), SC_(1.34556525752921341531248264471300762341650218841420667462600236955290462762285912840676523938265773113078123711064711053986400179808182028454108757531005055589184901863123207311642722195665966206977456990345232704234193636114226803754398726597017005098191161913021688454814870817048365254142793415000968698201250929034048276110055429109297691792531542243165635466316019586517494151877464553481293731302774038733399293521435396511900710315629691219341794148881653920974852763841833978027174519521269214e+02)},\n                                                                                        {SC_(4.86546783447265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.25325538407266915987338128054208766591917080521625232032844421606051606716692398018934495896583835190168394578450544655593684941639460458609078491932924683876005138093769628988685898032468113839313519672841054158902627568138818383065501903544435727569688200034282590190525849337393146535954334850871690759709421545986963882893742725261113224768353821553484890973093373366532100337559039997766419927152717363468430531396385149501726769479316851724933345852867587952241741466215585423270199892907944840e+60), SC_(1.39334761731298862804294539283176125542719436431058675147008496329375768272120874433207437459271939792468453525676563654931838065228633597665996854592456445418437480491771651687917346455353598725781373478363207223312979418798095127626210148168237532580925885969940796364602265897149086132306230778377574686988087734968651616593042854070549623519949581173709044613343996738031038884087072158192721688170089096734410995550902737931277134299753629372186581111952604576449382332015708599711385812002727929e+02)},\n                                                                                        {SC_(4.86985473632812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.85605192834029189218382008738179247292631112150377520053854361588702465308236543788152859643955616159717704347800062618153825956926948758269128379908040436439460739519248730865784730020101969228605174442358741738309648260938369518383894853506074652829517475555256853569367065354399148381461160001322676112571630439361796016624499301429175718970541254456863490084321031011506829533833770403337825140862081641063908721929082024238174556656134000812422538966413364709887795809753131069028025245303704612e+60), SC_(1.39504749423193591654786436428893291086751708723890647425720776660306813217983849065409301485801164208541110792857647302169748170165192109645040609190672295254145233711255779044092868648154127012809911646563314549786886632500661524379697745831608982215969810270206463912893191422465892270650284797102021309328842937434353263073188688514655448627946379412277805897064154026444676069848850427370729572762314038766464302486857035527720598909564265778204169823731366702461502569042454590366866462252383308e+02)},\n                                                                                        {SC_(4.87835235595703125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.36035892866928323626003597490688298592375085756767687580221413110290395246119363501254042500161483751096000604731192001474955543954177845351057533404447997454363373648247759245791041482807247733920568308160729224963878297687386572001273988043235573836188152434837448508035574458472108371808169176721812026052119485230621321321887290212166143989977041958322903310001939825724443421609001421308977780470412959500421034470008880264094468021925933219347165639145160097908898804181657671336666324020580857e+60), SC_(1.39834136516787413500007587510694826864396401968853849617697111291158848844054838105490882170287712108401023447992982600168348901295419931547058652315336259524674161908561489574985783144794297757797852248887839090209890498688958249246323290452674141068652938048123555610984820856797509233451931845192133243191526079925354634863247560686566326020005669477315470653309578451268479417275395192731453183344478148664850424200854190633948493894743148373211421781497087971495371828255297385048072836357631041e+02)},\n                                                                                        {SC_(4.88616333007812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.25676402517775076301468278496934692656483126051057917150182178191344337389295682456895134834722163155658017436685311521936985635026182128820450734590168196821488800119072137854226239436945319459336791804472147889086556562163276827272717286292245052201245450202750152430921971312971942793062920469104989094121415606025694182596873705238964298040995046264827257894977852019200307570425098485465822290848065650171735085078091132334101899949959914884493767480321306446032861913394329267741285906711103952e+60), SC_(1.40137039582554296669086379035601909857486506353212457088148813998433361338780193219865913033475110183234265070635911641095928723479322965406468549987886564786421092927422630145370616108794441359965549476717203659758010615719404053449140959679261059542424230988025529277186859295920766064316356915371416710280108171860963364853471914176384067382710684936643955768838392051528115925620120815181805633665843979941904830873787847412819338996882527616461587934247663102092108148772042092241438971390445839e+02)},\n                                                                                        {SC_(4.96946105957031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.84926051435419488511811853980745691886596467533990571070047115255720116282369824411456771076467653111164982159613206766501049189841537324822586271014364389581042302691647366555548159603118608864628163832875165777040744349536109872788458951641450125095608129869448380801609179867060104893607719181097145340673922819404866959063254399533632259195570417957400062003248515558895842302329502301062521977222044431722867167965545645096271129720006691983917625256444131530340709039540437261910682571183129859e+62), SC_(1.43375061602840238196387911284923355888759486677703347734243939633177676980594469572540596647627951945711183677110134004531635998116079359743547196710154174966205304265997127571931089769441782084653674499867407219577029036057998836843043540801353893116712152785856625677177920896429671428856336776949787962164030038320010305538321393785686820222214835038242007614244993161677050533283474490782441167642129200667383925185368224667881315570566275605276821283548240903636414523362833347642677414643623122e+02)},\n                                                                                        {SC_(5.02667388916015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.72359609248419203124278009510985183150244007574292494821063931905291192550361199874577620746648765405775126508129293236688227427346471719162252422650453345352475326215160709168099099325488762829380297106893673243955407060725519552650264510115770619462810338844939975728898103700983305307932912418966347390578099419744232245992772015011779396591256115246555221742020146312599500423864539907811528577739346790592133120230665473591894081245216058989214623669344437495460284751390267766164518674189213402e+63), SC_(1.45607273718315360812077351825961960655360335275523759898423031326599125330681285563961346185235347194447848365591085818579430678126800784165200011806167432152401388929448256893026604697653644245440858771972921457080997743870753230688959517171196148580006810436189017937770375761209803895109732893592165660935605510308168495911111906296905196270497034759766422177237314325587252445463647197616815725300323392577986855382680195617434026290840780964702849787897642616565059952095849864010312060252081938e+02)},\n                                                                                        {SC_(5.06970062255859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(9.27644503160924816142832113419390792965291766778937392868625148313812295073960597236367734058867673715159417145390229408534004058590561681905994413322197072847690081504170463658644289597444428583296688754211124952090816353074693404099089089522805150846599390193061140900157003665853955147172152552991287890472933088712333479727116843837275204812883579703691969894360803743262499013764977020715239580640744754902720015964274589271972396515438127488544650757003287351203634500502482942637661308177291122e+63), SC_(1.47290339253539295464002145624242690865101200698759610546313109459314524573119664887849635992343918037054039970448863432946580921064132657981311964698024477353552127320982967180335656081109421094348022842803378303624637039558575136707903053327940879482691080653896232524430500832118478313562318060480974630816752136336011526404841504140903498989821005535936495309592708879760743479628647174400353504680504476422616510089906998023546490011818143779872437202137302789823443968254533389555814196188140398e+02)},\n                                                                                        {SC_(5.12124023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(6.99927687563654832163120177574826164473492516304373483263720224434975728090156994949225082026115772458036505101589570526516824973432795981988428144914029285497164326398802375171273990641022287224424401732206944003581561112156522275454116816621229223008793908586894194170593136109541189183575424736089418849585627318980032235653127492913398162962134870463407859904734476897546237961538370005461048857120820195515090940047137209178643079618644113912972824144160270923947959220286021609552771102745451890e+64), SC_(1.49311252791857571944426443742989240699293169189104984644328788533525071766062614852651073668833512464197788105537498139220394509186286770568588467534532456111838319290866539755611126101502125037727889023843649090520797315622671809084602100822709946349482175131824617113945666387479044506740241810153417195036975445814082078347448259125312588036700092111250540454173356138964523836583453379889372133114319367547150774128027019566755710894205995742742073109015256513593788534779850640976780823596208118e+02)},\n                                                                                        {SC_(5.13560028076171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.23026192637653829089933206267149964173181878750951137696266425435477766894776959662393783465354622510883166332313096861504304874217242045231455687124373685234765546537380906671149144631151556882423384102699948151576804252589990470079816451923653014079199791860836899051780037952091022656131842521787241251049432588833471535361080041988546532822087692740422650115265516193410139725509602539651590030574971762007831872907261184051820389377156437317770759725191585333705132134581317603939326528788120470e+65), SC_(1.49875258139600638677384317905313051110930801241264726031823123493178787964241545162365061893622252359253420828909574612757026646021507513309437547545277475444768358612137193307312374400012176105129375230060395894921288074531612453050914778782924708171613350467577656066140634079316430886465783766714152321878107968964528462731310279262933101768782533568602487689238832241854772517147076307206021006254224136315719558970885725011297528338864980243200993681035553490026602098042547489545481928320640399e+02)},\n                                                                                        {SC_(5.21595458984375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.90981363532390545321821957580981160389379575340353083725526256797176963279392859769357846541564731609442597893669540874701936055129537935484451190072143044000222738279488869366532435971590546803721041182171177688738154267257066471125241819107721424237495527897378823511727860857970760154399303290489105510632949624545822762708632342233005590846781101245713190716795382609572353369541851158507962047279715422507459867212111957471715401541457172773147951175626054512245232328120485001172045198910443721e+66), SC_(1.53038705173895567049914543155942539529563108424105025798868954839393701782777434849481176175639815531720609524352444839956063026657808950015560763311429110479726455402604523788186886421026505595724516333809087073552716062699773479432983413235305842921735857421175536537380992743676101280137113483114395340363769814615698190132874387690604324261096519258991825073089702866596561150304867906248340763186131591391391787918369957028071021291990784941422501181569793228008259915879084846469200023417336312e+02)},\n                                                                                        {SC_(5.44718933105468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.80173460431759042276531692713781140224690587653067416859419330202555272594989519785776442562413672670314844845499831814456396603542418495392131474699424007810337531388846940463846884535489991705941523480800988009529316999708021842571965686802509207137254401158482624305999707415827714148979174195240510041877334333999469012836629211860992333238496390024839787170544088609050327601905616073272453702431232853641400462326479878566836051665182851779178144685903980102157367712961317755422758532378214935e+70), SC_(1.62211195236494486842137679955399170210821952986639965664170409799102885629436798584179104241517223062978567846790211939285341389185597963171844038546805098393168320539348298180993080511725958212127383019538951139319500426412312663973743171437651265600679423008288688394357920195658536773809676397543581796728439157519560740884067835306939932346578856048493383325511119070524158665272591734958337263086066922987842300651994068789268007151868001817260951294743313380717844919047107129432137234945088316e+02)},\n                                                                                        {SC_(5.45541076660156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.88923093954475296555460010384225108082343518598289742785860838621540066167743233082083037149631143450772288566621466871158873924441131457703196747998028599268995080065238846466216411793416383771276769983993012465337486970399379120945924722620793564589846394211714533987285947129015549885511215640122352742105756827920577188242283366633572586516180526272406089739238082483458311057365615733115202707409705441125056979536148015597812278487353231068666952931126180364642533905090214065855160751150570253e+70), SC_(1.62539167945751436784365061461200949005630300411607114008314187648909852415129401768594670826889962061935904856663650035128421537930667621120193872601440847111405352872571020367561445717633284481417612169617741083612708055944527541391662257911146210363739372586741093027681854255554446655006091132290669608078027957869792605133562698565732501973658345610170317281702751071987392216962406615635572634798673703332621049982782083567199976464591918134442209306173953999317128537923466369577831811990505059e+02)},\n                                                                                        {SC_(5.50533447265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.85730944855171128837952400852020457732681738535776686067033565638595958409944167197144361023729960216161600023159694184489531348717782562536407434426714296769627483724028605749310394264725759155728265167995310344108963472950279318135602602405619976237322233553754966277906532700177676410923166095578127366105347200870494860524374321518146934073189297475897914958501944436895033247992910281617521511740888108212444520135924477737728458215906734304055568108571319399902797584473184704901951618601401224e+71), SC_(1.64533422032369233555064135775082372564903634891929403891212957385782265078635506984317907710713735389157508226127087133347180522811226385654349518357170803522331589646835742411988907955552403694425202656698721669355856890469805183019074507700497641719763363327136524479713989118739444056128582381046066604259279394515710551116967860833091013105018097573175423841933592160766326992151395034082321062661561787350295280940705488051266462611896718603847686645062109996393774788240170135481392777288490570e+02)},\n                                                                                        {SC_(5.51723327636718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.59912571876643112843423672581711050010048297317961607409825899152201568265814939524420270783676418983565192336821959178308980267384169529844813114515861139342326949176632824266265482473183125037840450257459957900212150939142923073681233762674075587052192448025588088282932927107938038749967806775395259684873810981499095151858552234659724816251014527026911090935249406686093634962334581572982993744620288722853674961939196712451509769700523090747951376519438102824496906099852506740240121078438482055e+71), SC_(1.65009407826870653612651933214957347531916913256171357048034416707968507274796838179768517286247353976812021079376446710071709918891506283503353252749845939622475785517947468014113580751946861761977807445698139136003999090928604434264914562129227594145225130236704164978424029429423971788106902840659087081085602478976117497757721020106416920731243987640848390588291719822433054772349194724340191601936560723898339546139749382460638530415300746726876973444199391562140782410955411138156479694530761867e+02)},\n                                                                                        {SC_(5.54448852539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.36963348859129932162725830083885765244565298120707229165880920560014323244220273824004697217390516951031394823135845449317019210615190366107106578822663857637154953631879413783762758791737654221732809493474544825324816456840318661919152960357357555388443966261856466700801561203734123800247936068531733100738427856642639151771290953169330378816709811944085113405163922644421852150582157231830068470226209468036866154060478617724774942146332669428672162944119724143173739570707335535113322498841820437e+72), SC_(1.66100669873044010904501433288458732499812967893510651881848204943272568308438668632802976387744572965702081639784750195299092078626713239781119668835184616238019332450833479935928951025069106212418491420026061659292911620401090108396262046980730549281511096258695057625873055136884628573905936028503115321061043301503194818309842899671082066259686213249217936866681165807345765765864262235205654246463596164138969890804318684364225340323672345829962204119687379612492068585994745111171624256672951720e+02)},\n                                                                                        {SC_(5.60617828369140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.62728406523296111131355808896408220483122212493644530547421409440889381677426598214179515024723875571304139457495625118625370238465377699843404971592441195605019230840968886831456268096329174168019131782115361294034477360839270231255641106839370252937972696173709528605243232234934094126811293362160797978384326890310737756907774144291689575885298983860501089605430193321841929026875631620592449674704579391768483259112420485117912758686374200703034840412187265262286052457833550937813696437999510829e+73), SC_(1.68575624196050997267266028127284627373835439062853280709730250641775691895659080234915944809115351391194349799081170650336129460284583581311182837182434777787020365926067248555954377811444098668933371106314388177858633906779013732328021748296720192733105063123796421239840606117383188280665865626704745056680142896335801095600347583401898777316702764187536635745970202725607621594424872915595196978772906401516245756637987366616577772028231781285735190365681022311742523413918589921589652465404639048e+02)},\n                                                                                        {SC_(5.65145874023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.00532796061027588342555634039840958050072003725524897780153120525098039110972677596923302643017425247011776700456138656970587815343252699971432589970304541137216971653146921253019828921373932258505387424233563536965637072767427539040695829500810356303246421059814881499893139107001150451269597055112993867253825858647093910267606972605767467096492303580321271252736901613460849517094992901230956665411827631262731029008430550242963503955925018314197909669408289089678939618884714603915651885774093117e+74), SC_(1.70396610698802152306545992028045088771637522788687162217040911655994103120991078484591541044681814790234322605912505103279643770594640862031996645079876918340627167621799875799132805688459562663055836041839080964225203965870990530884592024930226824328588293910979352119356940879703753504807864546230692672217401386749251975954569686363045717806665309755015678650005954843235693630661880028625814985348135511544047438477027345440190935907742739453062649940307557554216607174200782135239117705440723125e+02)},\n                                                                                        {SC_(5.66864929199218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.00893463079459638306852377972162212832314281566339974094846403036833933679188303046055230387181667031933042449188201886422958599767084705176877993559428627960437073918886961487109618272999237251180284680777602364352806575884701907864629117084864327798406054087618133419827665763186982313802818804484662379248030769718776783842512416335502226422458514344068771367203490351672278569905316747759436759190325047231031396542725204357314732687817257818939988969471353446714317126638405408286279074800705704e+74), SC_(1.71088901428681912074940442067870210399918955371544005621396360219841515025008273102784409149753294662455477907345342433925316078920639523342844469477264979432830558435811422842728066450696651669699657071024334864037418969229809753531292356478515883546040020790521605315474695373051968354857737158398676456447944828086746246078055573703027656096829984338245632039102648845378550125773172367923607477081418755563573116154024358661756787074602643281274378133464726584156719335260469091519291187320234883e+02)},\n                                                                                        {SC_(5.83486022949218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.66581874590082465496734219192934428465315333521254767418155023566452551364671696043600154602064786390918015735794727953682909582293741899527795433835466229225777782017578053755928795450576702258516311538492179414197412787539060300069046660508877295084686993107797129273447838446631248831643936224431698066040453728941611191917556730641074451575955824045650867440725370691279897877397079313549571165216405585458263738561225559243034873003030010837858599717957007061657127273454442703054197549781535638e+77), SC_(1.77809368902389560556519654747745448286133172277814730190202423572238433139459498749757973337779309761402913422192990146044788403885949227861537332221601596940991035689185054557174332115771043545920552344987525372742450169315871776578854464324264816033096820391038456926902066367740213891366558650708302768798931468897897175393899041471179739295386490478563083906086506690354436492491188848330806379184668481561917447521582179012903931952812528845553214118197733608383457336735789605458597140262568222e+02)},\n                                                                                        {SC_(5.84292755126953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.31111967907968108564453995966284273070652166577412570137755436665123577124838509441936653645447598576576026037074759853571168566602779123395303099783690660924490120450513769954709948709011202016999747959079100427549136730815050629753848445397095734003665257163391679334625280792749112291303920083984170684582246813632656063567466419038283733376599906778545803403574425352630710904790589519407199933474550681175535686868562007253713481702903319248809189782732834090717268736522302713544246016616289193e+77), SC_(1.78136784277199791355980792993301578877401705177001075500315339022921965898320852451122120109942991987872235659312837341982115462584258391166452781567213633529952056867920213872386761172375807748643983194728614291717942731369559504670522696088784050388841124328589714361309478662831427762779233609754195822939445772722611522584916683049270125720102199221013596849873478037351888114024969976004496166291593935489527520236453106735125128078448367001664408677906231281405007287820569237580932655505337116e+02)},\n                                                                                        {SC_(5.89785766601562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.15434273852608175052051007957642130376175355567520986844405556707169579584277006050601431497552351794410079718939397622430842292284069664653775293360690691144451364004675301732538948711177929343415531902649211880657979203798645415145113592481692269065315857656050259143492366733773252421884545554189076127852258046550549044604541757433866428171998298663197078716604101092736549227739434262194055095943034111018376417700479683389120931266108913510501887702995757124007870448387721782901462590044575863e+78), SC_(1.80369122936847833747244620569394042241403568233584693954872045262000138107949636178412482662572222067060256012498246282026848613652111521810028375472949571037943007108229418943905242079480072521774758221319676601855780617550008032128487904542540431362243741808393437284925124052171322198361092511256761756805568840787495249969603080415359347576499135535249451812386160912834561464667861208207405943872521131917824342896068023785679236468172670460985637658921039909878761896734630899508143826458508817e+02)},\n                                                                                        {SC_(5.98653564453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.00132385823406532195342969241575307062220442173885196890428813567099088944230699644113824335346668962868193903487477473257524420549118385296443027202466553272385575239725160345326269538237168306474105845435233094726596350253358535142477920588235087499265949077286638979519744020953413231617901088981004226798455018084713439728199569166897944080677336032949816347254619616891551126954818721258802245261331958655929372783202877550532197146374267293901424907475973903859686473262195736368518574304724290e+79), SC_(1.83983829356798021112695277102918916473354077226552128937050486109009612802197835789738736961915496095990330934870586550492358340881933348554061876390420029246386508770057884901756947512682678410133178882335106137027931123425242262509468851698599678577917986859627502006572635669264212991783791259182455083384598201976527201156604576062694711662752407780348989716944966241981177183352380049513170749345083806975563338443088290155990565362951436323577941305336038226907855799662285201997239942491174813e+02)},\n                                                                                        {SC_(5.99618530273437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.18668722102926537686863939509792177324229461246086173298665244660060212626005303967211923026239764928480666430339370818761178314295116738937328950259822069208094863002206170870796473287216774849356450437446051969409744263120254398739732763046364310264795258893303437793700374326669976157331901934865550261825914359068943169512619064038979210313222455753372124869774505344923318152917450863789512421579479738334432508076125486689930362625524901574853660403217646683635521674487002926598422228858901666e+80), SC_(1.84377973016661553300761083998264163865041999231213658531016469846184962844040216010269828613767503702200271396320439405197315796937770361355914016214453751567338529140029955190627434035790921793172278249561877341251490913832954139497108122400060599323840039514043471997972511225474546435241748986793882562481512955086942096212395141866194720887944537106646237238255359617235172430682472462560851135251878435044590521732878437044695408173963600011371193781768056156302719569901165806818818566873081647e+02)},\n                                                                                        {SC_(6.23226776123046875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.91912456670046432469852028589778466351728144671338027224238548727258605194466678572928419297177448918791979245220722313814355499221027013903704799880617596448233076474701583332203353566959481686926189218031159629624421889569371759574983747270910431395179217232975957379645136744743804228085152542422986726758752459429669982098014666639714849501097444268034200478506951313388425485759765909606913437555419471482645604506503985352870252218852203638516838282424150305484003613426746707079008036610862687e+84), SC_(1.94069016938717002121600868465417170068275722132136830549618739673540558528595721646986474264244223997245366273670281481954381402563333141326592053919264453523185795443198806564053180604379559769938027888770407669907747539473560815410497659889430116583677006755491651924796112845533170563607089203807483875211251378906735074149245804771030420040753961966836276519727633696564992683265102297464748789065038807327540135272530607479359251689316239030159424321824274758007537996660136043615694512713923461e+02)},\n                                                                                        {SC_(6.24204101562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.87204070452368133653844358723219684465183819009686917972438864950303983526648003998000078903116434656906362028654248915812455366066883079692852261024214133379293179572879333758317510445761200423979917977777319858647495824203654635929565314050503868097559911139962937671629145171641481071329414102124252208250217633461118428689666383022894295062276894555947097299092847546251830224087702187626073543130546956809963957622996880721653073905973385612413024120900809097679013486079273744980732653070468486e+84), SC_(1.94472170635469670990129901877781037441234931236216684713262077122035127860610772038408743403779382316925792913510258617846476491211139695534707320363709525445945968639324638064740214239560630493495130726799393135575689124672391884286110335100009167957317042894860507476742519787005926382667001472755932127084995266518174229613287419023814214494746387155814766215779110520219447018454861865608050915048474823759933764583932302677383449086940115653251190200643736920299436772417482218824788254615502032e+02)},\n                                                                                        {SC_(6.30627136230468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.07883809322567587351304757700919210201400372370028014733669087628987589983158274706635048998196074484636986287053637580284941284019292351038519817662734698756805000503791605776404718964179164829752346964420397249229213797900541748569898231526572393623133190548136164426880316375610214932566459240778317683457371797073553184975848305506903222036894019361630611615621088249827934571099891820583768933088571065492922189640245014904782422808773799277443981896105025033510586570306426738661697302847069341e+85), SC_(1.97125545071279985432055206158754163270540648066516758657013378166384538578266055959270557408892575336885482608794000336080223297390417923023114804281023887503320918760718681135095586908775440404505075418483157233375973119353660228493481652445978888497972610501593218423789175261014894766342625067988760426210673357531336816557704135310997621019268260940292968299563365486947135813716127173841000025739979707835004269227483468161153151246727699291670427800414125264412036226352142701587621084843256505e+02)},\n                                                                                        {SC_(6.30905609130859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.57679865750026937130403923658564977522695010429730697956762246223763963254944582095624083570446236139633946216828720775064575249565825108056873168699600737856992778588391840698550523979297625479814939161335851759855722980810086831768127340710930960729019286335431680773329676256863623979576264110485129404743954192093539203153625739684379335089870802004829007562145642119923820657807875466895498912481110055111761241384215082335460167017039523979462575056521850291932064701022425782985118168843548349e+85), SC_(1.97240732675138865404966804720479811590190385318354047554648859340319512572550562926118989787546352461154699317140709430612541875001002602391460101795979044389923331104070975137782943289806651025391656450371895942135634950530237013746064731025064678707401765676305921885664469729627213468465279967518694064279728433332635769201668442507443550642503464029098718510526907763856324902018709089779176595806441529143846106552685370658607660243268315489642814834632633008382960728962777104428378537063900488e+02)},\n                                                                                        {SC_(6.35773010253906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.43413031568444785230583446080523334353678344672827638890428072339897608400118287075075748023575441301152252081381518778105909960253202649716579087577790006138717813293929711234603593342889945612147466568848588310068827187349087762503062501361532456509808803806370919672068134422458480643496217169097363785641909057230701881150030598693049060661775637645655530388973347468061009784075202018600226911603743905594144035721867585123234504154294951857771941049092626495361012512470892419575559684220599104e+86), SC_(1.99256081707899105995238537106332708026334244963919723532514110952603392293425804378689627822409513988073007866856612085968395236548793856786165144179368152868330812796117304609784819548590189391029998601290429925391101535366306045639002309495224031473582463016679597605011525217050180259191810616270062645849536614663707082699976497201935204365325221630524442864415807503299603937528538236291174847569491278382517658996181943173995923450076572037101653211885771916905333999022232021675301162810521983e+02)},\n                                                                                        {SC_(6.41318054199218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.42698519898335022546569319874437414223161000361853491645314507012246930440411849024371126814203890210117420903688773509265950146019646804999322046159830789746426084532755841419833713009469348095814753785276557813342806360547275468512809281273857182746592448980100258242561981413748711829776566203219384363064291338316358626801822999624152821809531297592767666163800955537894771893334785422176052647269926841199742845116784302273434716885975538788388539714047585834048357448183283245905993491094483591e+87), SC_(2.01556584014422414705416034728203732392205944644801811404502168456434376113630315163232898457402016141182911028807363439651328454836614863527616927626599755374990658967127451481932277045225117961544308086635341225409726591288485039940137540880564875688261058269186495982113937086209632615041014780508375528611128332946977437941680417056557805521035777021329897035964936079010863537427455263131990129119080954927720597875082491541518620821296109588951507936968477013760594935907715801177547198838422484e+02)},\n                                                                                        {SC_(6.51713562011718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.59176538800911938350814428766006978735945421889918747449436416176734427252777388352821120714757111560344853866869242754596614235407063187052084519490127367917461657689856477158122827538313663948496743163417391816727552524399420700989108905425941816917039799183267240679248758347210698287716414463976400404936117652776448357880746252798439463824712564801107914120618254084707517725422190286662576461758872999940377255406507185400907527167274291615298548601355364186235814615625035289236954368588135354e+89), SC_(2.05882412536978094604492822987905038263933337923558139097816338191759338923650770311106570155528318679110140524205765896765715783439245284881543589855028997014931969590587891245257589050135016960379801058699133550089355823471261271483420702999297086101179456455422738790343489292132383400900435369796318443279665308348186077844574157190017761709342311710175434225437182344225198416855422822849165263353074825246033175874829300040290034949824528522691849044017704163743277517242304803034340516836073205e+02)},\n                                                                                        {SC_(6.63102111816406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.02042767502802236838052517332070636095415859169105291322614886559121189733678241986292075208016773103947665521996041465641301844729658254655013812226948565114442422547281040480132634202599651244616039520633843921307466447913810731030067065695885450690904548777892319268591263171440880592547970815812433995605132186502349603009727226107723853692642251515143204480281646113214547704739214532918847942892910865647709977877888032239013084740695535189025579840934541409863276417526792192505931529959857981e+91), SC_(2.10640641898066274039032912775682771492148229468233994108303959301748156780453696985967152523444533629282724550139219905281963706053673921436112311017807494239048063400112752991704577927550433643728258578568132056387253315525251876173518206873100174136766538138261863562198346084044445996825023130868924131313576937241312855820375033397304911073941499725560879661034357252668623689396388749398002019488847220513461349610575365395135451608745788625026382151715306395782047438833586733014561981163445820e+02)},\n                                                                                        {SC_(6.65240173339843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.39575122167677575610208270386905265806729379941853186968465262209497100975510972380161552808692742665779438250305547514419290093652214875451605701218704075674462088117785674406527678262530298325164572156064158323693760229616518608304153170438231372807984698086309690520793295480452320535401442063000537533059350350288541391932286503974746178889933960602387029641055958763358111090943791587971557202668425888836069857913931126277006417588153765341610635832007349595746112280707875714069931567289920811e+91), SC_(2.11536149138542881429953686350281053300655756618879611049698159678932781608060947504644554480742151376381461339145780777164563886056584828272014896244304294127461783692773902298599152911376586807152218480938440856918333672768654828848322692993711493512910124245380697103447169245927887156729519911056083251564743753952766433718528529400914505812145000197339639864206343409356733570994638564012049842630578161967664437238116642276612216504343225306849207855887203688608862952346693486753793358417226619e+02)},\n                                                                                        {SC_(6.70259704589843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(6.07038187670595133629430007175837432959290946324944333023736730996362439759386622286470232089193331923584334413950641053543771258225138373425862108125488059451118296745371352622417181207120845004565066108038733562551562401132363377720862326126821923914024246148719899804740883548994873018718782653014005434650987876618543298801582017146827879797323285517205221379267910018340442548423315614973812748071871945567795717366271080107924314832979851285930901109782882648617544440093418815787162720366729316e+92), SC_(2.13641250070687384819721023298141854021674308522169699945863526766372631226582693285959195606567409637003709392029624732096703067979349517331008524414985605987119357701477031607859451802951467613970098779547036798545577512518280150523311197695896483937933016610121921897172597952911336551357300967589197328630945125647322578991469766915109898429859732859211713226663253802217668559098004420396578326155965147156055622763520240103001095622696401445939943714952532596484885727462059067739973900614225589e+02)},\n                                                                                        {SC_(6.71435852050781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(9.94654537945542967401303266491965790751135473718332919421309929007687837274073521038496729732185349496360972407556564901268661671079342273794410552499384881092793967734398463779298365152005655118301245048534032769019823477681162565194438728072292877726040908450241010020686027879375861425121224921153291348822636245749868981305654304622482235625212970405991969804089865390472145451576041211655732473907395508260288375509085670079949991686131665876920159108687012939811203138959286213610108382816911859e+92), SC_(2.14135053848290827980384905957152639408443824026010193681584489110942310126243185979385219220756963214320908219292035061403237189243551069499740711645081582968202936867810735282903902280326311100947540780539614924584882544996605110362005409273401341732635401108637729726695608609691853395730754929969880242143643026047293456110413346231976904980922843961028802475219762261569645554798859653297485445421638385289736580847935992207389649744522270606239292155807389736671409208364902918381623727408885929e+02)},\n                                                                                        {SC_(6.77765197753906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.42329763943920629786424084656741602177180860476122439376656705986831463674502641173192798441368875545663640838622189524635348813597797599658428178363017662961048512050298836108614557492997978056923113761690573574598964007328708512232703783225888329182799049392903679599962725062094493137928907978794362252063902382230328721329785607967811827657503486237002502359505944620656402414340485916600840331870478584879096444165574504087380072906092173084628459970463197911541316728118307647336691208112146320e+94), SC_(2.16795975202020894959331067783611790241560176157791421153126679456220429243228883228918420730853315357353207568803869203688330691136792045010826542419499052259815629750175692876361572434583284891588446275913905962383345754994948038812469663554314080399736094688636379112725908900709351636469025824840213785169018208417640182991911580842706850103389522631573021289780106348322079882478206677282917783743570640057263485251177052349305371022677908707518709713462763284102106606549773598947439659599324084e+02)},\n                                                                                        {SC_(6.82992858886718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.28742728434753828470950476373460937230032048651940555648949326006453882895637418882283825736228591181830700026820424453917638544173629674644723558264007129307065859795981033520492449956951693686957120036443188702573162473328012082936878647736488091582498164371505160579680594612610246164757992856923720952956388260560404273989795199596507365335656143579362306826603961790464250912402365212438307219440061856805177242373633455799268254384021758889527365496892631661843137744874008746911337847621644182e+95), SC_(2.18998229708218472573221124383337319575285443959933652214730444555778968544528871363492835295996330510778846644463129525381504046406834553254285787162473540821992287327195138826382561913503202031608620913208487263375221420207779131355930504270217809136342782183648485925931369193382673398755606007846749454319400029536613121756413080896375333067702367554833212950148397289927961931522491545519692572197670162034618763874158341068695781524700037151022285783627122033713599144787290106762266119419035844e+02)},\n                                                                                        {SC_(6.86930847167968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(6.78194524198764253935293924685960457304186507685341002124795160098720397877248055084547074129421459978314217860635897835210742481364957032335321817600502372035091090721049627357295736936985016617932355533307724475488403022170372901012537447057064407222750371792229474898811793803655895384557679919461705505238331617192249427768904744203739044846861797803931051857381486653754869112682629123778313994659394748686240728046366514815648010511692752805050983119394324243019276569152142835273111131600739305e+95), SC_(2.20659847804083906384907051514872082061230620414541674044042921288843119583551298204632257060496765706867059434541256865718056715357766042999851689620781307975502879660162551314304874688575088583418644818982822427963726538178844288967778976291078192323861012077958372167260468411242670517406288263354005147124463832622774308429881070899793057196386309054065644897572808994660335187044558707052835530972888952967277974508071086506597317741709813213979340438569164933284793186907303388894211408854792992e+02)},\n                                                                                        {SC_(6.90468139648437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.02274133511019485583988469899204776980456774056684066672286969620453688307444228491814508991434754830000820409365066402249512140453233753077127934740479709875672706144369331562365000549295378072233131975358641001193506696992584528857667157933091543789086178697447848031835456706532575059842492635758962253361643070511799598205228352711927090751127148286879531092647429814165348528175265811953037424595680858019938674670963305706080467545069331967872512258184827331019538116894453702243713920673210901e+96), SC_(2.22154333073937963309284270464451305415567713356183916996809028250224446324976629918561880255034594588139465610035548638444479892335980626915207148799415948364392093782126809151718720827813726904213047270727073845012006511768403305403791771252433182022505470552892587913386905125799070732624224012150635775743017726040000023583318144128558407083977660335631622322836590245813033509831928838790173778685268563388558828899739378886330796996037861831987696663717952401004216895270706364036468781635421504e+02)},\n                                                                                        {SC_(6.91464538574218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.60649260710529772233473137984105410544232054261726481804901382352456603736791207353288895878692489945797454994320261720519981568199528074068243600307457024299096270656939240358519093216643966960316998852658905467409459743025668321894542307141623557025880996958371404487147215287026431391504473435758388440094311393508369867761317353700422529638292656142883895250773165627587110507038824743522069804645711709312079958726863572820726828956578534635459474570140307017716422854786215483659376104193538697e+96), SC_(2.22575635672110695115918590577182031381966802318930949156616309616868514484270689147444392774966118458931416771691192119217283518753777221963892104377362200368507925400050176951613839266277524613349776088293713738939903474184705526304759499313018568067983097681361651924611784414420788881822624226463125441429517020372283342751973503754599128184144820600535877488980638508126185420353735890080633115417401716461134997981796942552310592995641498450430406389193343801815830115905801596467675090472416441e+02)},\n                                                                                        {SC_(7.04339599609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.07955168370258431501067303765307041042253511749662108499654172995195919890728621572472265604548157874425594951154488292915690876822306705540706807497155520368115695313979997540753080862207102914364114167949746652315616647011583985106051436261150572485947960668686207997789998067343052714998635702824843686520461266899198993863582597484559559022194974388735364402673541227979847184402063848834687319523585326114498450674922707083475386513114793967781049780967212396264967735570494025081299191102600215e+99), SC_(2.28032470053682814150909693659939401086917190673111549985833216202733442036570175244345294263137322389334082412883205915850819372371153905224137138568851070681942685426002412704795068433740533335020313801587357225658388021327925840302498743460913140248750979805432142282679056431020456697874356644535352384674096157999420250192127556344582057179264673020098873791204751289807990176010774686471374333310634428685169600262753904165502175379975971287196138991380181729373176666849173285889871685443192502e+02)},\n                                                                                        {SC_(7.11850585937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.63350639773014098330391986843573998095148344846438639704280326830561525054532992266151394782624557657729556558678640210625187841674630182373257217648180868976835851508169037646737210618405346034928397410814234450897871401906937806043520003563445652706752649218899032858007417374978845485122177335751403563652773554947671601689033491144144324684814326258879173333280476762089154236210635460147379080147574135092948768026951044779584253185730061594787890924261378815328110413923272130365565592245349050e+100), SC_(2.31226825488706942320221372209052759874582593881790219288020218185543021092397231928378819282290633396851269467760376214835813537601586809929350368068369106408868208462608101592366234623994189052700749994189050838419131640345688000684932907809888196801722858616196932788075245301007454503206331714091483786519540760772557945245114058781412186499228946577913932289437780929138851984933005344343339761935519213236709763065510382791519155409439843482777059517548135082900878411139308805363383410085533831e+02)},\n                                                                                        {SC_(7.18507385253906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.49732330886114956729903492967231099120981689988470614601064338672708151166612212409693570573697532552453303336069988141982860111367711698182206854590245467087429086510932930642838004332475148547653465131896243811450945687151783960665902929229554392946636288454705065990897116487932510488896425121635005727457531756737839020028190140709062395495772982206742132290104264959510934652975963427615519539426105392687228317301810268033563861263131522138185870575767315052749438067728273033861538427160068365e+101), SC_(2.34064576791946060896313606119182488082566529844459748960355933124315417775876694818169147442870367658128072602308015711339409451957631318365734395020638352073825545811417527613101240287387166495001733714730462773451775603992969559210417622967701828034603900976804223721336845723876182097307746315092522887814477094532177768451945462296621415438098797333009453107985658002443597004122700883763626112244440083086420053250212325853266731701488423921240429786666074904542048428895402985062775020780609270e+02)},\n                                                                                        {SC_(7.19748229980468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.63799471891136424534781581037881734270209689591691691081570741626642848063715581515463925408287199445978593847300138730779433961633501177058550310117564525664058272076855042491774645034794591212729305598946520940175098602170881847040428529672184500046688023767346931914653501159766628184918989164050591313897018136001253593550610968679908774841461364253808215884587220575731471838139199944268527092762417993923355816335944505951209359016119144117907046251862182229203833394494471672149610892614669429e+101), SC_(2.34594229489778730713395183268481268533313625049321103875300316143286582678917655079164628572296479114156318367073710880351321060647563247630502264645451992444023031952017156904306798526134821751416899017432876584158140320330851463120804059509775078069199431076511808513669124909294314859261410937564808861779079999863781431595903854446961976571791779814964065183234651321058423766174913297352318301976488510550472104180145775350394475463204546994493226096306737923551596471864643784269614031627401875e+02)},\n                                                                                        {SC_(7.19857482910156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.00270707801080667284049137931007921397071295858533190749182181674533881049617386936830453405939377809182267841513942539726511171736762460427803321822929563423006253553551302220529378391240077466565459187851544672111764831101397708541056852997129266454471645598874823171404589319991748783062461420243374104014114054229392406314737220859305688382677447311497957896298449260797868887844371397774886361677480978196153679381787665490340524747298068806251709718124920062314551977212941639835784458709791310e+101), SC_(2.34640874261590593094127152924672401647639982404939559186941475505215425504035334920198363939078389457481819167880046593190391024230612216202981537917474010637750415091165615994957577277305363583060006173286690346793212661694349941719407081780582350194583204552812083593148042583454042845941903084773893307192833332140901636375439025610597818798045159225257684627844390762342071267673003184928742894850480752496758083244850624302604526313698595834705671677315868214301011365215142174377762024987919291e+02)},\n                                                                                        {SC_(7.20227661132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(9.37303805465152212002933833481069295182808010592267121190344032897885570445603922324812010280450755478774902585298695970671508035354187420144033783169240640838653864920083997632382117139666203979520402870913656694719573287280930814348789662709159554341652970995619762734437041159008417774513513575175997159826455311393615474032080189567347307824752893439818807444114127616338517289998206205732345037054157126317153754271771112658168316678156292870405480742977954214021160941019096116246926351436978164e+101), SC_(2.34798931668183689489811003714947822248687075416433892703360967951861728101603554652920009368534958567518413137244607063745355575358759569756280248655040957334433376108428711420069724040151198409411134694564740958346393856536904924842105919713613062181164174088917032677415822388455660178097338717105926628433933783419222660487149698654081950085336262631094590672129121860761900722620760385227790497260852982842757021734835281954304352709204338967635475836677001274419319261528043022078402221616872309e+02)},\n                                                                                        {SC_(7.25073852539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.43520106836729084085778956456263007366457610660211308356804607795903604205903006861626940571616758431188483708705112541065913612170982868979138374222057745044530838311693207402258346596133020939130766196380325691152564593723037668386878730891740735487495367730021135561331968282946393311387564533951038834032038906087160256673685147382181654337851041727860353702694472391018833498621069942838095743280549222839978177874201310102654927981792274736107415722890492564295715073245406504748411010278457116e+102), SC_(2.36869905108431683936809799701037213902840132962445950159087863767151392537365457829088012233860101415133446664625069179705407273558177815837911402413725567621227251553290403977011004098283213060126615067528770905043526027425714284293642772945512987034649149749940987987282066153578004652877777069205069806361585955091537122404255644671900305284645385248418831413253227335874194856373739115256548574919845614247054282038560824065753222632104305482406642615557915998379231124924466235671891452085471228e+02)},\n                                                                                        {SC_(7.30574951171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.83368904948692821415701462368046695202486612714101765523339198368422240427056106672521727020788297278838134755029853525826240430171775696905992365128734083532239559070717069572014894326939860499578167798833295684570854229896751700580561265945686503512548554188728825057363206984887300823450384333435198218629970990833645722377925579365942064093032376859696969471250241177602826353281251607669250065823723888615059026741805474782258611176825211988273205012026413517684390964185594288523589770185452205e+103), SC_(2.39224698120410479538322942693900100750302371932518498513970196809717285652555406363425567070534620185762039330299531580293666524672539016689119664898814223622248034618742951717581421540067495872362627125366893309516167623038435271704408134175732192131341050335394507347567907240217514740760674515613232222441102582815234411374214121906829085760029636754767176893524536921973066034719634005122069259187062974845953794788953499793268622745250139533192406234834053053126593008530180248729385294424110576e+02)},\n                                                                                        {SC_(7.32414855957031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.72351873906468427927434749243813946718492824644298051464033227651267721874131369030686360453838674597281399653454392712519996838482097315107046317757791590222027589172411232504621489664643848650270625328529794090865340207075554086734771760739189005347247497561092355456867147799893035155774929656399042984297099726370028645869467397024372525417150906070220931522239593143561251296312656675039260494381956881118249845133633386942844663451695203906956726307735499310146186355391329884667423153322820283e+104), SC_(2.40013217650976835621157835233793262249556249983525975778051994370838624089108870584615523205800434868396676458119595830101103363230974997475748135773578471342878612674199773452945355873782988600437154233324008409519071732216320083908700784750442896633871090689414559645936711466290041943618756257745187631302129212076472621111660377092879798381611049325838760290122015763532662852607044508731411589596965193851766890674323066780737296733477691014068044838476213088598919241840640959953310417958070890e+02)},\n                                                                                        {SC_(7.43542785644531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.05057539261721842528885509969765973447368871778403642251340693683832762582599686981915475758777749628249363962669620141299715335451343165630801212919842103593909541427972819750900099159556082957831589787429058178547275551230067634268190277872910180466774262088408710522934303590920264498295736830153661283971355721388880579406568443053300160496066408381694585894458038897108824998578614767961733859040676188324483688946286431897634148725088944123683570990210525326213482732816270511822193032938057778e+106), SC_(2.44792140290461559015608660191683906647538337402235360992803950058276397205841643970107666957090600251577902918891601081931217556177441460385443330358798306259795876776818599203615425018561219763807467394039107536233629358829593264171294184649424927776279069503493001556067798490179396110412631967842755164760965853830835968513373138323962196968498642464328928626116147386543025368199899990416183041916861269940388736111702241880139889967663889428674332508520198705205469187793144595358628515304034126e+02)},\n                                                                                        {SC_(7.53251342773437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.34450173886605871850746175647689853845137789653006693475073046311373226224027841491530308732711009686586842056304257354013893945718172394735140639993167627210518718411216631690896419969571876344561671600388880830098642765589735803154418308628711332909033149022575200265268797452406626511994213601291123000753123661105766161403857816977935150857042024764226795181284878290595587741079595041602434781314700349706197292957258354683643495630988675216599917063436026736324763554545773796709916187725651109e+108), SC_(2.48975213533400885587637691407121384810544183192148335858861452453468279767415393776527155273533576836354512459448312350622908135443050111088976233097955451277405326746182472346034496114600748614371719947507542546467300701612516141702635968086610245143035634860001899594688878405584897710701059457452625844410950210744613604800040262747640680619205824048405143301800770844766969588318895622046783778912109087656103522244258726909926657151419246134983372663728981134772950698713692886267202772290239989e+02)},\n                                                                                        {SC_(7.58867797851562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.52064099241120839241553555175065154800825782614604145472044725679618326874368100714829996224430528944422099953301775491447673521847023758692869380818929370072753340828440188353412171234222451046111156082148590337005097363676186470812736096355739264956973599076774002187509871114514244238270432371453933456401086514329982789654412301889250531378151629276080470889528069665845043022094265532108347096706819057706648218300430313387835745459242829301745686486046199414046908590639218083263199743197595955e+109), SC_(2.51400907087850065913573947414625032904671121383447551970348482268163455985642835731430617808248297652550140604113191015187375045974571150714301822493699595430322794110657302437321260873980014851953656343264038486498436740894972501820645365798347590337834137982813027441633538926570243517443985279225897432905162521435549176598139109497346323391120019990290150009034934628687017185188831652277517092336899156528663579733300039421610455619418045056887614965483270716367739725999067896145673923299273256e+02)},\n                                                                                        {SC_(7.62846374511718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.49922614094816158687439961093661481037234810702887805516931122154637493554212818932955073139417858865556442362239274940666473504207297806766385685660179254296756645324382472145132719416670933652209264214351147717858113551215145625224552303504637643220376444209573042722311431724120473342395806440765185717702904512609122454950044602469120536144869356135738716318579159461251534764894261031872874364617223515229921670219532040826309832424582619620031545239192210739605925994909956967596442929984888754e+109), SC_(2.53121750253461261157926165483338259506280329295050669213959805473005613085786853264918544920351424774759224890919503206082158569005711201804286932818636123198065034824258540195752455187274769227201462726202428280344798809973069251017733585289389080574191285152182058016757534913424799037881047219705041395775580668115715995698157561159537648352763988254360776036505973177141699047221833125099631699656501946106828699155634763374572586547346355388965816585722422683987931689969984006767292244890365688e+02)},\n                                                                                        {SC_(7.65285339355468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.44328233143715865979067125362218230750511545691741833774669401675093822089298916821946021749252994666055618327326639446756594002322692098327061303976382405175725973297465838679821381012919266387290046952061939154345453911454165050224113452847446481526177049450322842349725029204286296504235394215207283967407565742687133377051738810399251865021358404288107379562055972010855458043773100181817459739385583448879867365058483501289268058848398485010733777363308695038824615742826196288630982490737619083e+110), SC_(2.54177702582457404872599490166618690101396619429694510433333174582246355837919426933697108445480960272390662026845326249949216372762237888604462531876530331763138586218132408418266282112006133279665782434076767039342072318958799692295680538293762592852051844924349525576494678256521832924987145984682152496544478562763167898941483491938838964834902734326521933830878319015435622053505214202281673655648142102864872210356314882899338205344297510694121925220450582814976347866533520588982742320766439488e+02)},\n                                                                                        {SC_(7.72524719238281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.63869307336051372959408243660312533363160373438260403644142677514038035500017680411528973659763860595946543595355948939034470985819043891159099267948201467366660281597652900701211516596330385863199386254721860339020957922080099766864203598309704547571894873772947649942164988823440922198664615400569707361018370742266695047806428050897559497924940067587680446013069045998943685434113022629105921541439968982931122191532865303630945552174649927475106238161562965905486263818811438986496825513637014581e+111), SC_(2.57316597636415280125839885539832422327028384008465105290539607418833102861464491225192479961609800598603388977003020277656192421494339452190729124101492463431890165256699199041374479756510159928563896369245691749784052847992085392738924762063155623268080207335467141395162714018568674082778047127838097779641551291941776339847523209381716124106191078166858784799123524766863312212028306342532526489067229074022676360465811189965473674708416255220146449182899327412136084950163226199948137452893680442e+02)},\n                                                                                        {SC_(7.74194030761718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.16396089613489472016995377678658380446923473961245920062030532600259290874052185870763071323324256479433026727236377805170595562642403572323515509706405293503612638534638124581548346108886569907276507031504079347672665740771712883539118519211205906850696296862664443174013717675289484573935053571684852228068285897882661720487640714252756969472629393320568755609971119607547454193719554772166309047227968669585212681948658637840249673648359931543555176934236488679101517981820203875534938182054528036e+112), SC_(2.58041359169692229394146470361757102165171481664924088601840051965221160090493629861255364611644912107425923030168859131035219386259396531102485379780552486978801953153190487248001969894813943359995888684168354367524976902645748180465727249368626912195861924811960911588788400035921242866085423934141173065042123358071932446406617142131624614833689962894262245461566888105904778058762073759481272262928070662967439223048222714778709958246110214128080579870289345281284344445624208510454423495356501333e+02)},\n                                                                                        {SC_(7.74887695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.57318503556727811778535046198574625914763729721329800188881059948624355392224696914387989746465413861123970505464968181390903309008515740780910945865981792858625294044088283319093981345833143509860817185609094808435220499094014905467770825885351007714244936734979151217533584392146957401656086507563928928175770816739721410291117377012227173693774106159236840499739132409784400495436998690624432116376101102365629523652827118641421933684786146996920727761397639054842551147160965304785710365897347221e+112), SC_(2.58342632664765299479261435032591639897367252976699088770326519539616458751460436198267419198929221817391439292446653099231773357359378953909093696958925732441991326719007853975630750664600116022789643028746413824014096475355722522052341236795413172551448202780306300398706230667980974479833198735645461251771059269197235819448033765448433853896655518402335711421785716185757300432929144147828841660031749371859857434653339192478951210484668250481047873215582224562308994807088571889566499812208579266e+02)},\n                                                                                        {SC_(7.79611206054687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.22592881794156458446052462717595126536262539090658937723483697079416119671002260444795643872522105776563001197318927781078731229717855149387116040683142410400288660857353459094132627642437287400100131928719033799002443287445543810490300646052632335621698671153552243167639303608865981129351233813614118131149101613467461610042458138597058419807568525249250630798103454408426222503790875152936389126191608008771920051555513329641652288754274772662938190006918185060994323146861705058362696710330744166e+113), SC_(2.60395814283749057130079935554277584867813599877917620661240914444376387406811844822383436557177931094472429008274043483007263670532295108521433652222694381426330087436463972983665698624623201467334190235491047796740683233227534777329571432018271488637975693352766700581687049143464728836443474208841916151709004417302089301594887700875721776638799017258725766477572363416260427171722136077719566612571650358218332597734123984669843135210714237285262719294895510682502823915696104275394521940544919085e+02)},\n                                                                                        {SC_(7.86635131835937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.61050567305592220456152565164230942148564845008876468783079125218738568867109739531648027886908405561920936404327008113338837668823045462401416814664853080167844534284333759220396595413078747532795418553321714788783912512656022776146260949338158924577520045933863185993029648129748796563225259082682813710331126899403283474477532377595464796028358150441834390887390602333872930828230106771171894718510083301238439996675425133564310770982602045974376029057672235890376329572299897207660789102547476188e+114), SC_(2.63454244548355645406557573404138621150450803835148763287902126807962988944888186782690423821551077565964473228346552243343425023594359629932950671821996960194806057329125965993803317853525313585118175847049038259803134572085080825944549279422931339045215986274550237455342692737666976538056517491589701667225209690441329079917551451728242728647018956436123513148819620671153439928606916027213268680772701127633453892183849889751158464692401042242515527605717337698362059975173305670741190034582345513e+02)},\n                                                                                        {SC_(7.87446594238281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.71837624022682653050662525112014758816867875003265131847902688055964642517176593117496287671116136563264491789852708222849348640239441380785771635209017580907263863687289741192677847138949151131649311369876561874912704943331918988855886232533705013511310935868278254710745534548689545057888076936160205888610699783645733278440630405505887873943782027122090065276384500599678106888523954477191375611451517934837045651078621522364579858561084030976295747171725697367071221913449939276734367948915626281e+114), SC_(2.63807987679752100016175435094436543969868151920491747261488057556253844905264224201473242499982049961008046751556044728136159727267854644919940576112165419414802234138378185979596500527688970168541730602570167372809159118442057938651283236319820022026854148490814115502143927520204879728916437074242250572621439294603499695241505072139606003819854900195753589328738735320410047165217770312930492650858332385736701370183913635591828104119352224598698412801595961685080520596865151065157552096804467251e+02)},\n                                                                                        {SC_(7.88913879394531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.05078178357726410474499063325837303106920910137103134019210104418158882633130228551893986765522818663440917130327860147833061843615538131479644991925275085115368694397206296587077791582003608613030789955656819980122303298903900251318009299018370819489337668916736108240082513671186640654973589456517440546988704885759583400584082572413524186749008182054736492250396198262161257003088599222961663885218760682149801289472257557104489823675144839902973674850172712268025619505445748264626498551225801131e+114), SC_(2.64447839103284956128235684594872838722673490951947089399274815716094892209302547464293885712494797370283683422781177442364743783116820914043603349899664703253477540140367138878150328404445864988238511331734092922313868756906609435883645125621324352909387547291631944141820483150765666108068429269928198949363614471852366168035632259245468001541921511923247124519423964486485058911434025471884809396247264243909679683975547281199015891927901064232110010913948020149398704248939970397857783512416201869e+02)},\n                                                                                        {SC_(7.91408691406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.09408630889928784995366101034741320822207279834027238270453249877880584352669825603178562703284706934951631129471239102447693830793569725967938487137562041240629518418460157493730099318010606043518294809161339258419997179007349381751297235189597986225603736673752801175758389468868908522525458882947950545150550030322078819854648909136701639378272181333812445555534256765672912080535194117216902242324000109327520303102170890466509052343854202275380426325647730946059107590555586681253687814620983684e+115), SC_(2.65536403023153584181009366509944939933636512249483928265309684189563613494760548624391320929669336631354799737976611608913222008521274835382161622182309975779259029765302144876959170847767080160732361049556841935864400648818702093248178882045296280850512931678721234983400481397860250228997304157007006352976939819877862820296819278998885809808276622234696039204137254724104197213765964626523801038106954428152996443899583239076910904674512885475994700472760824262723489540535051774095749851263249929e+02)},\n                                                                                        {SC_(7.97761840820312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.36079199634029091076938651799381162227395151854994589288343070392917661651832778942033252044086374956158961748049622438314469763959461683034382310349408060154074518497763738460082990990829647834192310943330698134017546905950238846166131473096056251978957157805264833546417571995706041453604675019148879806136858368888755272252525296383236157048398929667609392513772845625191397222628185041916430700732817309729016015053983279819231463094079090001106112163736903059352653651668590397732314816765520047e+116), SC_(2.68312047446704936551201646268308565989055995669224270332238971177523275624114106350924550827954832893926360128561841213655745069215375268280053327774384246966880049772271110277211800705320934862873007557937526250918855419370827771874390100701496371022372316379233768522789505608766708182727707608743777576965999789704312554625387227826464806494002725220159991665546408752810364171404216636162283932101127607340416316313963340855647610740487718780190284536361353566264092648153963919226671135448911486e+02)},\n                                                                                        {SC_(8.18258972167968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.69497801715505291341823944466394478653573226015069840233760301344112615036232003853340643491253897084350091966138150705300215882019420164546028377252930702792521589338261508474246880627609446162999468530730121238092726471747329156922095797928479805876451237606446524587852029517769329801343279088501888513954275307497747337763865806806406346467581445157182819019726753590749164267109489952242163494169562783305480340836442791424720704311125592005637989205351675021345658628837029739353259846801475693e+120), SC_(2.77301601206713380033617693878153786830344875545259297416229835015583825907512523049571737167755512875924722446676821999765409491382152022874842176237305706792335228881488212118956848611402510374718226442209228435834294021556287185295412732101171221125002257563707702688402289790980389117777811679193784649416884695842513310123040215065358413741319245326119322458004021327888264601330050922125827878039913706293920225934979437023174398406286148561214942428656926999902319051063278086461970390249047859e+02)},\n                                                                                        {SC_(8.28075256347656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.03355259286154819704219551226654395906504099781980718189010222046388212585372158450768002121529565043941554076356321710498359531557447501064276145807321202398521366659833156357752972507906824738391654526335132932573107398337998291798297386653691663749579403316591054269038802812169004153547651014880281564220416404484856409392749834859784000416182037739572623416447024555101585323087262487565041454643160808490925993113405987429965247852197914385018523039216649953285606019240086795842095595940237530e+122), SC_(2.81625165654526077068925249924073121003016044311700871305387088866293803727317559314224290963119864575313632947917677680669519628303166226702784572771996712364168797470224812933324626509432447937204021470084030660427032168951011823872492136779555076262106191456052996396539130060062732303932743480718984452917269033526737946263143307278506852358007407585518712083349536526597660621880354083566603740686029120834703866962079788033455307212822174973485847830329491718286072881212539315054338676887614104e+02)},\n                                                                                        {SC_(8.30768737792968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(6.67371114734752908061547616501953362888754075123545344701696519965806930080461201134144351921409889131577000496545476418900593918789113203113291903553623430829522236655918744889767943693226589545898620418956144487819505119387848652166385429031636818347206755380790194158017299123963514719805333452005960947638713859594934023751184336332845824811763594963561199189413088144447828985884611507816281472365035371107039655044344477957681971573509626723153289201570272369616087170053842773571123732195148399e+122), SC_(2.82813557444376584828434965542575667785580707101066679231071503820665911776936151156471394971750487716282814977361877634271653128160695426275036808696002806135071055891547537428728895767109593217204318330470768065883592419876896552206699595320213856775213385864681977009237639675750081260230142974936055389669776620023794558780124186887105662746744143136387863932791251282696227816499996110649743686550043725473956807326664285881088122662448072069170162126507907097586775108499996228535395664775430721e+02)},\n                                                                                        {SC_(8.35494689941406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.38087594810824007172317526482395395315515281973323750835943287918036441101522146181320950280907005936536644869459515895630947568893861360978438970984364099029399610364983195697978184477779906525913175411730400106972861856794282812899887472785589696827140820546454454254452546653559671707908916494776611762380091135585066103947092509652659548063168677267386196413563849419530138316458816291678031326659324148655637781459343823674365831836666507888399565257748869028221680258772558892324258985830216952e+123), SC_(2.84900817614821787311354013125196922305347499212422605892549254341126665527540833720877092440986522108374379472367009353725288890020954841214326197685621378601816567939788801160808539787411925765444721012192661714680396001381835054468656070642240272057212425534769467099305112437120256925562311398588675210896965199313735364857636659712200395328346833022585102465227465597221999247665850846990320554146744067996563763776745474329124355234423352968479337161445353341784178484608139997913928508370571956e+02)},\n                                                                                        {SC_(8.44881896972656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.42666833057029522002844137163176487295236913142915957746565021804551354855453463093087070413348894685610837082261892298754492817349750668766296094888752650865034632398047114223732322099618094063966849276886337772747081947435890554455490878510521949227307238529178533803221256978213585297126604921130732879198880933145677343705812949585481044421555113226040199998463630234148442473768452479439746175913886297512229427251823762336285728638121354786435192375488215264066783455853500502632517317397191379e+125), SC_(2.89054725081189490845947420649741511146685538739793217547650555624606175297303059819056692884372884078386830075996318731414936158025276846982001943699867169461703458538011827884171588294993801700915253891568635380810721968776398838118775237059164552862557622592417261801286604016100245025050781126892995385023634381604544996542145189076944911500566104957354877363628943389158576238909259399367640949833599148363947749091718337785962555954463897388654227267906460510958277041230544448075498023250718775e+02)},\n                                                                                        {SC_(8.48019714355468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.37692934320932297620981374050517322995928364822370056283231561336179289500921370929456719470695055723488408828524737123108775932839056147022184960787602221185341428119369781671947613160459178511396173156859877483907121901485026718017763578420717931798182513542147552062432522848865118538541035507673594516917038643758164417956892842566318015890871496409662436465557092347656329424195954333344196368227152968549834610314913943949187093924403634495721405296173700996916826333049876082586793987975639900e+126), SC_(2.90445577623558718471247339061488213888242311002481185557085466364156718241788153628570698399972521875326124272416540356360973483982924299495472732527445855579350412985885474284574788179173000292494530174623026334523333562459396879146333235990015088570248419292901518441428883606347370774550166714396697556794729204594146604214365196382675843836228991246510493222815148738810134784398272967005152613250351795609342442400866153886535045246197053653739010937545045557089427320285807941370008488299231342e+02)},\n                                                                                        {SC_(8.57517089843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(9.33832909826857639512345469794224629431863744746205019570713593413174355413681840734251323662261286343037475743371405368380106210626282544364717088243965802133669782776732738382008496885261218884763219382809969095376871715586408966585332510293058737930813384640468837357162158315784553713430950671671887901645968817163396711406670251520106298690149906371213473021604786054149922929270903602716062423311090876450852576785572572036859023487557696205357013047761812845708272800521434743464252230061623459e+127), SC_(2.94662434149078852864533044683430890751857634692011865421239447493723034471975719502158478358928569225693134671590721633683310220971342015064124134366039686660903743149425635581599837403308236420466274409421883921364526784964902879126070829463180730626981694996688156372167631098166484804873769772557801740883044257753022047460509209568607086637282554678558212689974540373894216164095727717722436815597302622187007814732051809764574347873019922123648322650228948344186602466898431539586997877758835265e+02)},\n                                                                                        {SC_(8.63414916992187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.28780442416473245220993417125843211443922827947715176026304195790252522756485988254317574050560830931766655835187600384518616359693792782766315376195334660370712947697015509483345560675594842551719958111070071113346033949776784099516445593701873985922858303738123261934902146229686136604642874942111538415537933528926963380513072791644764824044448102957590604260889847887609094258686316384912242648224998422816568196552377009590433850216097442453499745344913667602947562258887692660118963302873576680e+129), SC_(2.97286415767791898783137273348885728560402374821784965819753791581931702220185036139846739534002423747332846154884200311239613175043647820938132227917299223856302828493526636466913336383317225296782608199960652994652737854245932777169314282737031524304643218872099503414611159163700671360099767073557121674554179784953493763081417956047400998059429146915818627056653259309380153196074968434469066936204442302320347293458731802718060055214439848310727105052057577070572283537251105403348908202350818273e+02)},\n                                                                                        {SC_(8.88962402343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.16497091538634954176808558126734139383737220151002586863764390216608325311354224623945807833387024682881726665479459285049470005141090454361104648074463928899349832949354678335633489379248100907353042144547088922659153696935259491401491453935889921332339646024077803179260980585115144981597236105432685913954327379590905087313647429348781575292997793558631588353170474662811666116917800187536083681419094153230087707754630865253287717124464223227710268458962380191485579036954798227359751349462251363e+134), SC_(3.08699098582574540874901131606444829079827093151742779994254570119225093746828470772591943962894899861194077510256353570911176148460678141159128649251499460366252572667406638613671771548486374251674647935746903854762624451710412919721911034042884515928480795510065676168065676205440554995458081789247569791487484423535353436040389054764355826862135210266509691969507902762609484577337926933364517673031481416783636479784014250799567230708999670147781779276540235164766801425268672586312525495522925408e+02)},\n                                                                                        {SC_(8.90027465820312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.87780606828579839682486297865207414473915059257037797744519875719664626455476718573609744117214029167978785142314872357628234581222424935700531114713879884267432418261610741511776815059877815129756317302341224239276034805977343452323347378456909427278334973253635538590224095981120699481587755946030574521394259861658122318014234956945530178081130491793013572104343521414300728519011590257888824694899803503988988012904865970868166408394593025635261987537708676505790837434031472486324842830042702493e+134), SC_(3.09176506571632456661296387169922633668592672051072655211196652994040766909440003566891242532352089213045883882170560833941457377382708950526763313018699118120380453698053681452767025054914992997126231495133852442181265968658060914464272207315249192819183080634684126063465876851228795083042228478530126646865482437930517430804028064010426712428251729707819686528889880916047040445248119995350317206960036438745949753331377517382844268845949439741976689581628956251067901790913220675968694083673487767e+02)},\n                                                                                        {SC_(8.91088256835937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.02141237770653771296145159020408881160989590419650870839398196043333840252005325735288677966280345378465299219993301159178503922963933204046292361573954097969187224839371905345548563192140105220315764875768864854417184036541687412890821354212141753891135605827639941760913661912426915299535839242021655832752433343294076763148034591512931393116354813721135709720774782626096642546416987266526920210682051827938993518486923365371794879517158653786326361967520012063105962048816773936536423552751777116e+134), SC_(3.09652126858000418732466228930005261043074491779209335334289775565968084841448943907137967412878070307660884256018325421477534987598584720609289107279261354419541514929763582754168792144055368288970235585293488977201112044387382737255177692549721807160464339051691282827080114501542353004889999789051718622994246873560334278221827736435746212582206773547578069546225067846456243190088267218770093127288806348372196341589640382469134243923012237046136953985881262427736754212363159539850461019015212532e+02)},\n                                                                                        {SC_(8.99494934082031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.31558655781768041503471804823072857551660987893193771300923694866722085437810174718689818184686160543355659918836573435131789037101312727466050676295123393694959558094041971618998566373464656975432193808552085084233941827245486553707076687396813195185672678723677125523966734627106140802401897221851259098606091358250676198000082721515457318154554511901375574094053788420170179929670798848962491431604495643329405322390907180789283893100597844735061218202734895598115127593661000761748877366559387127e+136), SC_(3.13425855264940891377739322679679701437736153823573638382405842870462047253093505527290921595414702562601048150543646554826489940007848079633436803489842171709369467138537164298268952136979863927342727600551602860705692198456751414362549778693316384937321572839532158459656954184100209595837489019219748987079473338463489774192604391414722484649705407731580135667950294425840948003237663213903701146822180319710147233578390478895236810346201770445751100986412992634424999142036287829615247919394118871e+02)},\n                                                                                        {SC_(9.03739013671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.86792769846398073158588185409127746786518317702712458255738775476500152684870175695995359303076769136193610241864674205406202900267195798945109864942852055462148552705513394540607224575512328698207619061607005694145838607754787666580012469862576573548961202438961423960092870203630962408071476306928156592084871044853220452396635064991834653131047835418341620932617272679036446479227435435487997430981426228453395058498001575602632012466601760224395255128828602403730169970645524832506460262769922979e+136), SC_(3.15334013785828495349532035339943156665607307939960487381337115090498107824790216760180318686253963749203757541456225918165272299768010575932572807072640852990782052206587049806078170264820194544725219973399085424751859003502907821494476427727808358908168867699978266761176417875691596682525237264639469902785748762642384210586356867116426877838848316248603954248921190243183633654720939266664415838936601913936386430973862064257478465914198609972828748670649934640702939726267333018813626726609454334e+02)},\n                                                                                        {SC_(9.05481872558593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.94261458224695981141369098133253703867790026761588476125416975351640813358316898519254837574567249935885699486051633712064078624593548009810348066141179943221841646706583752101191904588544454608775434416781644692544877023766579040440447322187741464563615930635828169727556640003402245628046314192028796512950830086356489427205097330722518479146042424090370497276188164843129478617752147158051725479824441211533437609225251604421732365835604215593256934779460210667503156419375982154179739862634423949e+137), SC_(3.16118192528703981418400552726276675687759179303740395416722020128790101184582971472358963500259877654665311620677333946329822781359101955682422429096092123907256975382594705860667116490690402904172004096156672614298752088275735696742123448129137473162400015036946095606068303962089583623495361335018595347294184045421628733381025142172965399120167601720209789608587228023512855514598980256349740228973876344585607589419418869879867146874889122744202917627670004193351717048152115460737505822893451488e+02)},\n                                                                                        {SC_(9.05739135742187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.18107069766063532419245836536254822108034581886312685487124135068440298730035208900320969514016652201174178281679735598938523996065020947571579893563292108033119930166754761376804960651592977130363219599641365682045191400497026766381310222652009526402992027295622685573221910910908248077633982927941624925049581407580258434709382788105487147587609374487313222064190424559820002903700012636149088840939067057770871300337937992979322966291480522183800733167189183718550962254058813914237328281314202052e+137), SC_(3.16233973642128564520032932606887103522789825214982046617415401063507803185459982755439000054699836581126390400649617259579813321911330312947020882712562563725983604870138861006695865498089759121565000116233173255402040196144186341206231273407839332614281226634929116514836134924973870494418933399410938288447188299481752862253218523748103363577520034339390698612761924972864249573829620361774154178407493269703532971305225768634929351668515230243975361330413576077265666511139203265571070996965851636e+02)},\n                                                                                        {SC_(9.10841674804687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.17089665501277517595551491907229733926969412013051104729239208322727072951318423453332457345488055048181460539263686198330703061316372319516650492049625291376040683681859758067121828379387721946617331150152729752363611541139910838851623342515366957959364633894875643012137605026777313017475728823654503490417214077721204466781411604783313610050551137130977111588650236412541939649005511178465633299085498656850775152481958684817849474595139738505147201917724867003003701827781673310025120058637152956e+138), SC_(3.18531883120459976548615729866147634441190179578312525476830885292496876482788328492878473418831237059363988430585051185057339592951272144907044357413502988207447267137688625110010071322221525949923071671571521613355840749305089157474748077261678948397440128206643598140207611964328691008191083631508868839672114731744050729909748981781227060098849159297799612737529871671234603519914901020813641140606586765729072334713248648594326501502908462297493397490043102876133795816567896205915324748575115571e+02)},\n                                                                                        {SC_(9.19048461914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.79755081545306548897379109253071423186894482112400872086145886986301975112745218201844640998153519427596175551962716792273867553295516510225315832502296282361571218587929498644543442644312445406818903988138895185284535095750031741193379456797538008865996889750152568147035918802977319367400899386928293301143849614536172256980163098556365135714921713860881948901793786823981460641176103634977234216076900415820825203690705726681647558421218713699918815274959798235428109180875994004078087916625467814e+139), SC_(3.22233801292493518788961789947859975913990456514312793909579443126199933711446105694104239875773517016004540630259354820993243091605328124329481861339187196332689083458888308284212260237240115982648701006355037449090598696837120879199932468347397459713028503969084184990055184508401341459156444093429071507557479441617462602833480285640053902106974820979175129222432824161961256287329517440511054485890040359613179100497094890900276364013150370494988665992020244449985109624724713529242120122364979802e+02)},\n                                                                                        {SC_(9.24501037597656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.03347783390537019995503033019530819608166604007801391222097581199482642919778844366630918624668009424402059764475017580151422700726983486117050232924614200359384516915589062855863077559206548341192274226656219242158437998625118666163882645225084170519891503827371743578722940996092006964596609494457061444809309058646513250847902584632763211007670082396148129094454199599918632675755285930859883816437928751984279199981070882010422759307631303773361004562273046166390504043129282537152418344467557623e+141), SC_(3.24697427764470095450376166774512991703359589712997497306649401762049000374460787679508683049679146954502998877961987740384542077388737473823517305509985484988988852971606345314782540584923480056377654521924933162777881870819776897530496276653082358832746433247021011492518676539713762283368975340564191433339902907305832447160388983172881179649272177993224057664902289075282221446020049342897769048937232289163945154508432948331388358608171238071308423485980105911638638134646435087810345033453672797e+02)},\n                                                                                        {SC_(9.33306884765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.56163559742893659226156677177183415615362557335830459955572471558565744177992107156024207554426985471898717302110186717801009469009715785804467574873947614452021794699034537593022205783199218855623144954785172443541352762371963971841409175045103636744911478347262427818178642822885762821949102692844133467130594140191577058768672274241329692844448087302575749946551810836961763514438264081274705944074764712006006301467656628284155582794853442402993274559736949774514879090393937800669939634849563033e+142), SC_(3.28682975442356269450804361546353446775558843254411478792369728401699860762124529510889631897131000122723366460873209759442298321848552145472750755150492428806841202335903281774836748820357949322186462461903375376525398853696038655720302809519345764715214843086320812760448812504197113066581913369118760097607632595456891768624200303523556873732191738474213257464469403988760431942133234318675610849865273495733187891293036714164585971922539509751717274889473990366351481095742329281810895159417339621e+02)},\n                                                                                        {SC_(9.33645019531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(6.48245884324047592693378940012945333450224979745418856720209654706125635837956144126715083688340791473619470518428425773625931818233663964590750262499718984011983220430791664799946794905019853484988855659840230414428119993282971449533827793399231610564785213519537138530461802152418285400472181357386639996800791299432222438897290106414967230361477963008007447474679993155355815915254632893949176310973043069033669159455455810718563262746816084461206604787296239673163384054824455148275830637858147254e+142), SC_(3.28836183094662658961822295032749628419239719474009490883816527053315609621861146311931264278595978531924168646428032586966673735242679386468446652243211829021720037890551818831158077264285655764818403466140136311676288139949369930226820606538721191579868075992233332789006736850437132990866630322260318207551070260162047052662890955378320735557477345776481703702937383899591318961756477131142376888760267646781910870095650790562725677733989920486927428741658028463119639185097971191832795958571835833e+02)},\n                                                                                        {SC_(9.37523803710937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.76164954038386323004848445587140326469032220373101116257601133416814412241253225685672163730416426100328136156082409851178292149201362700314445578373394967833719655580153780818803583756322339540564203378453973785823049257208158246228542536868014844546805189024288766267804088495153116155120682173974014496007569213229677178097339807860316609301434481972104823908833512243616107207006116063922983558546779879018687190610539761069583007847793120863839934735950847161274713532225092934253594486397581064e+143), SC_(3.30594525866895214951026132241238206166748567400482469598494155136335192618897080105839026840244107305051632317221620706098034393801456511907262008379417555151588665957193894179579989115568231372256173550497100205568070991730712080877788193212107298668456562017219680363644744047830649103890523566400212254885609965053492863377463403703847255492463017184836005150386313379289484470683059285387441033310602739164348747481112900047334917463926166413763627950805183493664296256643963074213528516986813658e+02)},\n                                                                                        {SC_(9.49651184082031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(9.27838376219628673891092217649851988126764531199798807890290146361590940654850007618702649147926834058003362655285112540263448950656129542206938036094550768131763615084015207813115690276604016966803189068013411593812003921954580658407034547403901581019210265845993202918334650153701246384864371215385225953893283458438032316950625126312477346200390326216764345368804641891671497909447055837014162347249478963586084879790434747521877671493340004289609780578035454590620777455870595392157389612690513392e+145), SC_(3.36102525852210065380668443735774423728976193524082620377015936174646576647285438027205142148854452790085614071836922050574459959922606454296862287333058234054022167631344911718426942450703981307806411492642746516468347897430961194466789112389689739809369673466374040976263657414475658834995507613956104273735496371594417968621857137691549510981454555469005437225190699728493247476272421470502012162453174746447750828983776995565113221375302876169954112170144356666613733946218896083396998695009273101e+02)},\n                                                                                        {SC_(9.51298217773437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.96276747437628698491352460237248259496626684260033707005763227822013370019653342953784232077884190935825645989227161077245116122136934263916315950449044355587721816388549231723743236650269459273141865777655737253552006965141733896779654501922543258025003406101463741888081684328231116460814692958214955556748851267533974424385873830973452925516089784761619003744572571487984030102240163421508616303159507022185205473070031936156375531911971248839059294360815564326009475981758577654219196924254459399e+146), SC_(3.36851779031193908419600146248383629080902012445957782412992132294243572482871977674538504582245516373175991422237922615903665006378579427226267142371150432986512873651136296108959675192147003010518105457487118640943905414430400970973972730175748276752276987821445691530315604382805329868168412943160512162305508314942942981982918029853896405837983025487559033043459552983592659151823279071396895171736819580860744170522245106128382142935325997632157072613927808553020391071460615875612817120823542627e+02)},\n                                                                                        {SC_(9.56334838867187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.94402294466322492664780789471509891684669808277558270060303082798925971886343113857358108473247312587626779535494118409642777698272855883690084352721186322850448584677396485622430792251796208253402039064690946506099908493726120068544064569965928247691033795776280422468396739129221727700957244652587298495565648741262404576582140864092814679846534962677104260968516280525640566429169570052768898388858777011908253884236193338240045360249963351810888908708660609692865672036587639611587752153131410988e+147), SC_(3.39144768178903611154576513932259822435828878296128644191483079168254033693838887927979397184673718377716882172257342546153685018920203286505133111508789747654771949404501595246222035849289436795912582662676925730885507190721625399973610161674490068558375641100068386604660001870298150423765325113018499943138123861909290369909868670216978062261723067381806756231309995941704325749243483157767001239482771598354837777258928962431942028548237854445433411661741077061012420226965779145908688609131798861e+02)},\n                                                                                        {SC_(9.67532043457031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.21169744956312399498639455549630793101638510523115256212991432826587137896748185274765824853263981717541314120462560959899030988978065056350270590964980759984318293166529560431663444907668943073203792179359574376805708445722562619888783394502001954316085106412385599888730885960997473921812491801513821448661862450289562198377543474727080955599661344303695664443585113003190765509666260094630216552777786839743320069847183523581786382266370119362625483879039637503342853952338493384883177979748473711e+149), SC_(3.44251978453975978374745800747879774189361811030869185021040420288142023108381585370203061162295491199587721359027345899087313215634137179026773935575206302599871850716081255115454383423425373728218234804045062121974725293497216937165192678316620041794496639914341221603981972746523105510386899410906294184355454380397370980325094540245905990712376814296156381253545591980294873930514771992888761841851391888241814358528503926333370744886324217933385419830722831133674613612592027573978330001465871304e+02)},\n                                                                                        {SC_(9.74890441894531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(9.27748828991886412538309707599773754507919038322041847048360331703677164554558750140118371249999112923047856520365587882478092326144398321711017275204417078380790006163788219386093013952074269642134046771675198595738077908437389738569523335022286226393241408867469862637418254358817746652142034322749303696419920176808712593265277216991150957940883348509764711360229737460318908377251092199416863576246462746293745214357831877521522520574163902601228419374989812201640714432568431255668739712278198143e+150), SC_(3.47615354800856447336156742602043631636784276935754163017637226242831700077490633569878084429133081451727469860693462347186772127059315985769843439214265602676092826128277472706807516025993082209419921249964774447215026046195821260324775297102302720656604146624172947236747126720144586144965303896599606841641640538342158145882231977847454315344618666911069649256883623971626487922850619963697283794124504861737713804771202256891702804129038385908043657200508229850073636759622636008148176425703091210e+02)},\n                                                                                        {SC_(9.97344665527343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.75212611306447520909858927406858433023122496707177809190073316231201213909552285836588252577681463819793907197633576012254029018017530475940549270670747327875547708149734921788106151648036158235955207982183955863767458078644890985072784784003157657078939847654041154970247192315236124080561972996956826056919766749997692638018042864132793894798768475224229161182646426868561046255948721393550598468635922750973777737790810626367539267239500147871398512741844024844405941448683844846584113373116616584e+155), SC_(3.57913063159066396581073316038608646148770679653962124306743233835262807077597545920350868347013000566526176914739081425845196396586525066488617318862480150671221153881448121348388247107816625173070919595245102453823775236161743405636490832617367473872170698471952246214374847309993080482365037909434794981854043072050647922694348353117006595085077595746987066212532387246587367424722559377450911273762645754169610858342062275803386085396070359095336458652978786511669257538622997396529328362712159203e+02)},\n                                                                                        {SC_(1.01136779785156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.75347730083020939485038162912066221581429168828442196039463827459526861430475699995482981019212730791574136303794770558637632653539966787313265805232908285329023762299185014861422418481465071375177624076746341202484154198136575647412930445794774509044561075216290472866615013219185046317886077929047200074616789305725185556966392977981343942503814374008958810840813123055662448373018471435385626941585862611395432770072626644156391905251833391251776044318450848049340149430633834651573099126602231921e+158), SC_(3.64370045538509487768445421235423359724165918482902493162567594435641438527780707450531003969050124751986459088661597995706808788951592146239311177685403275556816691605701950098832189999694016858167797087116289453374157732684624480988017079231000288334505158201945226692599276945487043383856946148759913833496062922481619161243219041334799839274405494278270804667465556754366581890426570645342309897086504847897108276501084043877611362249341645546845389118917835053899026722978063924256857388180755486e+02)},\n                                                                                        {SC_(1.01315826416015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.00457510991281502769226727004997679262304075469381924599171977187228770022537420994772365328581224262995097856713877243737738916378690255197406841438367198157367222028885739188819221893998874723494511253133823389573653928815922129563859445580146007786792038790844726836014513597109949268484909314677825366551459118028717639223624781670474311535217218824243945045099528383265311230189072692780987851223423192500364210661988512605277297349004271541908259006339755059345435938135279521158674365292894604e+158), SC_(3.65195882178042198649931968011149621283488971146238633105553740987173403757008718100277733785490878156625277039060382059688590867535166931940037968795818220856593816974768959327664263543693451366193941953177034784288904784400121716218959936061685743343972096090999742020173760420863474502571598091487483375402518801564373621465430088239127603159201322793775638351939991008845336720733856574548730516780561727018106577182606384397065860093671233778487263769017285490842275884249314101743662659144772808e+02)},\n                                                                                        {SC_(1.02065887451171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.27801326900345153343880810058385458377628466548919310319356208295001391627711028108964043747715058688010148167891282897721251134516392211229815633735336900159682119149211036994496057477385364371651032335430129210391891032699021075886871436986468388270303685964233997952971494238945883816291938728495688468471763874111752586770041106497240128592171108689645129535717198560117944070009013995125562286608487870236034608620214564008241724858089991811270552418742087333377223955627801273083063706835931394e+160), SC_(3.68658921617580562067411514817835144132866629706014763116035557045564965652500986674593929360163570308689443456931582700224614304705183015314634933020226691177371648521879014819766803156565604404215993318093870166021879012194525067597162546457359170668710956917518936585625659425567139073681368857775138517401175534361146257935927911617665535974359591758903503434806360013917203029465393008200496054786387251147733354953504701878799021807780313234619151600219448162688809231005073094405010463658717590e+02)},\n                                                                                        {SC_(1.02115722656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.60896816319517148534428232121099224472906570928174955627205730308593272095810179245609783698681170668816372103853112217011230591695869860419178941850553612575073503675334345279935542462445816555476534631191068558913617382873813056138931058171084616630332337766283314087190503645051068942875378149790513113094622500955980787327266672560687639557162522929706635433286775216561301409145003020847665542949100467257193220016339170437994903646874584701565461530200931941961289559836505330729535444901834160e+160), SC_(3.68889207960158981723583667551616655516830734599087849468445758096998943085919557111615958075388853500061364091220347702900711300471342607601759599003918524084136225550138478001032313242708109422326492734155678074073630480118105464454933040136288641575391783537716074249697494130114919412515825448403613643656748307302754155472693436900441158560131937501670474182282174058574205247092188856406444219190689086275769410408827865199254939649958746821341426770306076300437929253259079804248817293057357612e+02)},\n                                                                                        {SC_(1.03151855468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.94228835083308640822499028852065613673755865463851531438327058166669144767579740506836323365776221468064491933954523159827868739172089087439476571447114427920831324461169567100875893875784444712930291417219026660402685651505369912395579027564548381277290431987355918726720732918689421442193807912778226301137893083370436981941699729302604799060234688459784051256944786362508416192857240452539630544116665633911680458559146828307310632090438458941753853672353518092049434148009251404963278657426193131e+162), SC_(3.73682651905258726016324716387992183499818534851084298433410462119434560214759364867102585112961493700822216081248742887146719492455762826533973189295420418841342987957444088003076054261871688210676983131129943218370437493592743430770371244025240198136170570468525556710224653368582018246366989546767129729722257332667137633309476018669688145592375344762651638361779174376851220119649663435444291450998820250943389730137090903748676104493980087117773829641533480707556994175120002401746782494457490678e+02)},\n                                                                                        {SC_(1.03178924560546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.20171537110984503746428094029808236968900471595454569801962284884588253557196632314064311459204453401037547137721252899300675605221605850701531766220848178426107307853997571883397237019502185275899323162662253929989135552592369277960721465557378037302534013923856069596458354461160387042584077252216864036273505791483850043082366786730546213958546404008342532072130559596289868522883170995937443132537680477434575640864461406937897986942411334230967925180998172232605542618057362893140400140445826896e+162), SC_(3.73808021835721356724446264394902282290701854468791430816957474104121357346476343358635806510697201871317753385561836211023660949327877603013631398345339633717493827744828981219248357257956092252882039677272319317527100441867500400037527723671076722449747821677450262639970845980491755826511803767753250916930554390222742906323165035718151118786667333899860809495013023183520764835815549229361219355867174863504630209806067234900896411194527257618519084429726183193460574424568568946898172759856223065e+02)},\n                                                                                        {SC_(1.03298370361328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.82872819288012606122385963898328361524996417570678799694588697839190735174600170106720351533370631952004594424240260318156779543743334978103622384814628870820163074161490974171932900138828578654353210801510104125408235246750846394710609418092475390627709768228356388946400329979573725826559253114278336778834777284568651859102449899273147358506438973775986112756427925176585046638494816652143034181522337019700644796616551060074006656209089713982818770293251665711950859025929851173563713461219206884e+162), SC_(3.74361317748560163420326195479254375911567393555110750073620747146220483395013793807665984626248280853130047026174123840945129104152085488651750620885774044742807786443568160709678805304668243081991382409243452732728488756014968718551977463681027566731857857313817370028589856267110564911929005514836552959724444301628121435649598322899197331618582218338230007463827482009711821766574469772696231132570472922552328948998512472526034965401802610875788479029246956411298168633713329249088115783146293828e+02)},\n                                                                                        {SC_(1.03869995117187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.41808227279543671333479039434046626158530188922152731293342661306573119318405563092633134973716965074833789372968028834168586671063089271054131771945825757582712628501547074057648793172598767906983963530048248045469128383694252974808161180554768191225424352766335755702327435659330161865775483738766096509778836487654811038642151241098269833579763630984293257933323924801773786235314368186353578754883559503875701698799907224370192903533452100452108739079966989498051874352278825688032663449334565667e+163), SC_(3.77011112086662963245675580860653273445838266375268938166882906410114995628208781265159991648954543286824698469454566104293241788084417271750687731183944221956896689140884801402020542550881252898680087044980595246072708009401646582838771785004679721221825826352639947747005451212279129556801460350965125343184149109540974126900025713968760305721500405913148311708196503510152872862100655916816216486302262077083994494966967519637823805835378877890290286168019857511375509827417374620490655688713244690e+02)},\n                                                                                        {SC_(1.04995117187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.00678523887863281704315445004350037860113537505562283492519854184776749854976501039747505498206401986883371851847764028733559550284466617856098938842238483952037050298291535951048537185026105154426436130154396602767164120565673550208366259366381260022023273091633469615283569334286640071657511517754084778826488799083437892306566642932709776272954596072694419598606462123813205893259756109628659535751983281630078565414508016709349672242918983953337604798489765842178411006944951758872882478372023226e+166), SC_(3.82235887759759441458200974176916588835183231553065060110938275665761681247044148976503853974040867874294045938826589445275112659911927287757189056270707637343453819762906900535146711866787538123092016166555831579927012757456022795948174490211311393179055868077067837678849001862692893473813415204752098333075191785274078510424264923538488387176952815122989962722692588617583471346613585349912068428187382230147398757659645529871296093351036151672007480156877831337995025225476574745527346807158512968e+02)},\n                                                                                        {SC_(1.05218109130859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.83976634226548322572919174800895706904078782065799096443773537981885185694587486811320986028190855120878999289642598311337692901073887957309137449901201645735680657243697681617222494949638844130220749832373225763896507711466261063162058760477938214785464118394399129254067717894129969752496013723160483839247141974257398086747003573635548210067354653795490286183627182332662761041292473910667668859123430004827439901075874987993414093280641989070969395337540471734658869020146669349679577353694738477e+166), SC_(3.83272847211949837396147225745140765469959845295613313699908764628230030150463473596541716965378611569009511597916333970267521155513934265321685315234895891969446621245232567943644593070652475667579171884451144515803354855337891804564947800457461153269074076789377868905007126549465728836749088552564963936223398281798497975704081603691785971120903388881817641414000874590895163255227705961236388698142750934201258204390506092394191759642714932949354378711173864295679661862382593386315557987799072805e+02)},\n                                                                                        {SC_(1.05285705566406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.88900467122852977430860808679378603739475246531678043835303735217279471293400470130370648772140034717690092903165160234871744765682784827549731664070069315567174235375782928260650442113456405116882860216573420614391827950702876286870267067814697164882316796311045310813235466126083138233688957753026489715271094509332593818528703642543607758021186386446874667512334846224158518227540773901225191259373031925996619779278140509075065215271119230249696085858895953181416251932353757464942105324166755880e+166), SC_(3.83587278693323204678890258871277514297122579999980052845382376239620941482865363779403085682074841362888123392166265551639163741824554153804356554969593568545217636228911896958403439549653223554962021643289594844423916874562457761621160982899462863735444243455143610572630923426116761775450603225902128263476482113946133239847073900427016395029587377166423819829557669486815120023155228912681560989377874894297548582630710711089740997403499152876589237622444767284857349769977956865106013347728272228e+02)},\n                                                                                        {SC_(1.05497833251953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.04350370816229367100337942994885015279526453304169331541405449930047964503121921902865055650340720039463167689349929845708781929475609818050890432868358093439084801254450413723989850649265525551466442998101968299189171128236309030393012630061038516261354168877970899971437602497714061636143465994990186202477380118969487154531802906088826512149158175433112047766910317896476878380545357357485271295125700882753012863548011070030701648140146862221625454249948037342300094075825716659580134996181284283e+167), SC_(3.84574294531115932149375237677159420320457195540146825957123495914414920297717536466610017007678437690910405675946752707021447129327942411269020836249064404337748747238670706269799881082342729228159556123744710580924770007457392898199441780776607607891806663764705100979849989516424656253155864858901648204573820569648064373007896785842420760427289138945103659594745663220485538043333864464089137493410979015162544737932793386917842752543631253260035596795692444801975621684522304127220533656281498487e+02)},\n                                                                                        {SC_(1.05828704833984375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.86935956323451034432291565799477420264574942460752629257797287105180125557334515457334508984544079071767666796613033989403748997881217445422941519799379563116273641327023162631941708376299025410868259586929229394778423337476191581551414019662216362920147345185750316039793792632623575204684065564644397428240912491954400102870524046480730628911687821733279947204985165713648677583149023921958316124707430853691606160653731533104584128854331165869722998686041425859590119586352716477202105857590710998e+167), SC_(3.86114672951929698920136727392816843089699454656769141911396678839135235848727229316681941069390642024780171542748255637922022854918760033993710968586074720223630214088649211602114032519767723479347094792538717501386586907984344495988912231703044551071876758677854971788450576635886599900775564701771153163462777589135590249132185730805789045598754662767748313567978567438568723900971984460828591161471563030548874218738918047647263078674169570979611202710872458752522074463742432423744595354217919401e+02)},\n                                                                                        {SC_(1.05947570800781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.47057964967248252231166620098113781658646191158671537217794950476766464376688211905662156578593513863165040297072873806429364722113126115761718841905680936283098926911470053640195196526527218515368034033163783510136466037445569865348067661306367025365777355260366857280020526593626915940767362350851006614893489309153646581809145049958378384776781900879014799258412902197094178712661179516840945378026341080851015949108183637856891790502608454874633154649210421029466798941800508041123592391193864637e+167), SC_(3.86668309471944568173873408861675785956750190916661831558743523099932149098629806523288989756114953035470141336019959684812949218557337267651631665600615158996271397540668902113775476540860392860108853985273419143830770029749580455603334250552677535524171319220534100409209112510024597889087808166032884868903601521170566559402919312007576674322088668600236012402348072933729370125454847239009825296717738299684165498340245352212710242840034371086411457472259617137813000304057537478445399704488498025e+02)},\n                                                                                        {SC_(1.06391418457031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.70253372553870180616568632006838011262008111599288624112221679342026079198720173779667163682688609926140105963022610965054503934880419416222545629271723490635890185015871309235096787227762240948662532331680510789028326905466753803859471535573334773242801683198889129216185936382265840225801389333989729342025191831962960520494997526165478262494935157207218685085223581167474005602834693600612719550255711040569227673243779565592510107034690926824984016810418471339323297415087891987884553051309611794e+168), SC_(3.88736781245899953940754871507990416578546629339707501918767067261604547151163191578885524717075630505524762529790143874069633507144400490235978616476528866086388209735046595453000867923254174967190450967424770807319302177358552810149630796131430929481175954855450418810197954997556927536545749752054152149864042626530175822752029241825831049068593701734017476681900559812610050851961920439652843025993713411192941779830288417577447789660892810097778074201713425542379357723870000890961920731359472053e+02)},\n                                                                                        {SC_(1.06903533935546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.30700351289897181314450905054985266289488684324535147146260597763649242079004782619877273438168913943532692353615377684351171321122204064108098010571285355518105232404665880447750758276681478809795964634527929015238334015730735095567847214499189485328582323313544185916079967142912088067287634443222907647626161604553446017786277114953090957290426735983431097623085091413872247113446278833527752761880188686692149421721682834608764942022244622605891794717380016765264738644678048674901409072234496451e+169), SC_(3.91125713989560722178790040938057497009401657262916760720576971411333581458641421159616178119162799252382773272694065770554737953272582538120034885447494838801178651348895761514685750468178877403399909978049083194307117902445860237917261352975524424512326526863242969477672410140371776053823367033985438504290530202855527840453592025869406782714598946028221372940777740084055176888077809785889087862118392485817728132743130196943661570923772169747816074472003406570793358969889066679820010617888748059e+02)},\n                                                                                        {SC_(1.08258209228515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.10523563441723981064740219999453918816472405151221426356738600808716133838715299960033690433569133368942619954844287346727777597592291878071099672434078725513928247006865786031356532332235255184614908387965921688554218876519102528055922157730794825502839908312954978533646964247076489581491815711525461012511293783018451464364852741864093985255611963826276485550701285130944198688453437874846595608362202016624464734534199679119447477006060881888640500092737148440161100690107330035937814410794147491e+172), SC_(3.97456899138039707890948570315290488733498513976209565411692258313056522298592145152695582227072825212326333836893020714945122334276123578576097726330488199540062511818312036859542350990047879679407265550936027302443124803145964590805418469726951144986485765622541837619352076240042792150729067920562663214944327090703228239250882201092755142143865892685870733871461597901111448285596377102268529974376493399715131821123420954432137736314556416335446707375069549279793457317288290656669586179599985465e+02)},\n                                                                                        {SC_(1.08388183593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.54290724282979442706558253940482783650481422003372689166299736333701778003516903631467085844425812079793077081450861842771132198977186551743197361861180089877315441155964532837705687391125274154281502265531452429262571876612425191346931039764014171118854205326273022646394270962898584542088492672505493836667204179076535355815522565984938355503985049327598724861244714407243291752160672007328264253782126273656374903425598076114290525946342701022162520689281713164230473921106508024601591456486075128e+172), SC_(3.98065243678652530679562583928563238573445755920325670751636005098772936721865031618083662090873238650434876181387977561300938564143022242628818771049949796031981885843715917621039814722880110180807880353179423547796765769140998851644554792404933677158601794730016844202445021848938402455820099640791660545892630771071666346567473238325811546810791935690126547720493246166910421170649183272861254531655751957034164881374278460334601212695923927365849230430783670359610897776977879741246916172808908689e+02)},\n                                                                                        {SC_(1.08955932617187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.07747256194243113885203040297313895556085428852551611711155419564211506922915030780145423949066335564339806351942173279152603844639865708626284369435509418827818163537081641943682876532495274132971730425754987902942973588471091890601320158071135248015690233223958478940459097987698223131485083572666562847234820616407156581422320897862447915301600030652492731470663247160784592141722318665558938527718107662325117911276078258478060384268244801900818744085850967208922319561309747184331498607713479135e+174), SC_(4.00724424259080899275397538109311439592402143854607985548286901285704407355766243132836246175216995560277650826839672358848994227274861071350129887754145398272622904557852220180298232269336737495643739367146692042439940186771597207990128550589751087652655770640311810676854992879707004269436480161814129573600232710135673526371133699418992323131557549743959446123917203316544463415157076253667623706481841406329700061355408235433086573766983539322418292770466535069398951154474788177787251236088223928e+02)},\n                                                                                        {SC_(1.10545379638671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.87227475922430528066683457501038039731800377829531631191370060541332189739848568983843566292085906872349548097902062736081335470494263317964978823818253886434354651733415974452242957678323044509043223743842732808498552011499352567002948776936717861071895124245454655823104494275748133952764029853040365521072682198808090947230180891885567723886848126500833318953689991957684640565104686277919805635130003428277463962279583900452292688059066883767252042026961752799826211807342433272535661902642560658e+177), SC_(4.08184715600321276911551202135028705535668959246517460085918517033156794276522217495392415983556663961596454834073539466163115140660260910712924882902401214455183282921081456551903227551122184800224747913430902261405850063460406647718031222060424957718291264904187247019707313522536337186251505805557580890102312193468916919434782659948124963980924145472808365004066553751261152367416034561610490221397823106262088537142605217756024887372578075565606914445109442556506858864414839122870155204990670827e+02)},\n                                                                                        {SC_(1.10774017333984375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.48596810472108103911498482391077005591672177348146888585874100412414421115200144529572266177869171188289566660493506751163640303725297195005979828119098281650113045979402683887585427807796758162170390373911804746944804512415197933992017332855632322767000863485395892727404856192927711848105515693614975236127664710992118123612438391254504708081904160476013474011504675576221146011859598408566925427571553285299222843745987831201133272612582580336727182010520178742275653301815798644341813060791736667e+177), SC_(4.09259755038503853019497982483630256442577198063393189935621077915044822542092739433619777570961450797852365979698027171593423652063447497296485180127984842816878295603632760179314273261885697476586961945221346066790028349431090187246646455302684385509854393456940868355146420343571892169692424003914360371046893432692541229106214882216832135180069655684513279847700562743318321610726288825126718897540236765739792248697775458869192865519762083790491292602694372954887693326625339263643490793482334838e+02)},\n                                                                                        {SC_(1.13550109863281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.65706287284339161473648536938631519339023293105137524829337353668507406650913397434694757238066470452515915675294173592661278967776176659404173138943660488565080044984558460065204526764432108876123996922254835104918583047762860904504550802483953629975101092462727722680540253547476697448410123852667247592575723025426680351302180453534360531204814389542188073742591558289987640506810985842081705354090994604111008304801715084677651387804733695975753476363715879237420498346497275997672732022426979799e+183), SC_(4.22350293347503061210907857753154404089749090555816284618619171028808816639726486694741967621468798003637222773846765986683614652789613176635150938480786422268711789477790093734455461853171295566915024047236178166712259914036169441023401526636005529498366231446006034880000983078476456327322188613649370307361386685150088028871847824392752437056572000056026544203619158103091287763011383227379982322109552391220661259085733791648669952943467336955158379629773254647666577176298639938526736802907171602e+02)},\n                                                                                        {SC_(1.13582794189453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.10108526735402953791039146631435277595565662206551241331004276219808208674052659823341551812315094746011518898803597116792210237596426904965313808443513323768162824362993801684712484027959351356509874879083866861136481802056936998618606631917122909886339065825277170238383930682523381383542053429086426528577100238598061074664662171719324239918734496557442508152697613910295792508574304578410047341432410026951738013138207559657356237954009512689081382449079729326306382957245187425063896671331602268e+183), SC_(4.22504824154378805700554761248741137838612335403095564061866846562696448056142283164164983876372066707475090838512513042361061186540149163640088285999423330857650196761700235637105528736165436074717351229838854355019215378585282287195880464623705938056537008553307479838911633227348452874234683972669697126776155473743188764771056778452220553998838745031739070609800144584036111481713682570624111635142010984207622020111453377938775838882778749478995856927714203245407058323183124080698207200648819316e+02)},\n                                                                                        {SC_(1.13825653076171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.77941378671180544420926592611394626126082262254572657339771165686948156653641087051493862138255655066000194932072471732158822591803529196848180119329554177268058395376004128960034067499293883118165545257578247062452100968908253253069115952104286596372195806398690862044722282190648245323573975671379228971127013146056881758136620862355912587346738573824034837965312980444762664158326628623341312238448856715435758390079449381673078998750173842552298414729424709689176654902363831333948257583776768019e+183), SC_(4.23653351560151594165888093993712385438773385054935590225652486221893018742900257540062431658397239750958498597461905765829277977173095756335813401723164039140324101052486525141934884704209020119202305835310841513791818420575739308387773213279373033142532298781187226935729515764776913232525906952787293461313689140288721739721215627507636968964154501462538163813352622766607370225330666396825244981311233504032950971781450249876692755944410545529918334138056528165439059929433074876958616761868591807e+02)},\n                                                                                        {SC_(1.14133728027343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.20128381223634428197091796398616789003843668299989968556949803261896552701605793178360827741974132313709592972887977386657200538762362643339462317815450734570324415802145047648636478704502346354858408114959842149426042695952544633641388774410223061144535611307529312409957126324762778447558442694304245141103506536627024036565717349803769829164443717149587697156631623215844566617148944231569472472860518187160228166666085439611668440288444443630473655937604179957821087283117161427593928897439949940e+184), SC_(4.25111047259066382143620883930275143995665817329529583698980639042108318083301195918813635238683737679007533880814153961402440296555518428398412220088457992794842540545463712953962607656534582828634465858064962620323309600444499568740650656969574855812201762613515614554999691514297179351160299447307374831534802407922184726217246974594531601638887680998261763534891751530229867605259341683914260163228180884603624927038384491395112235360091306834514813430604092216292868418303964625689842660750630515e+02)},\n                                                                                        {SC_(1.14467529296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.04045082832484686610645760220558090416853250826100285492917004659321185791955491919148964014082437989339595003320299344424165419532555701269755569711002137473800445460515985649568538806719901582877620115261947593301192361548423788519072382988981098216887475132191969300597969151487232928775921578843526790468838231802411859180281195261897938414466058376191590065405009015970193360098989276683404067535917028291129928177148037226873370662861577529471516670224930408261557313103931378299928193788821886e+185), SC_(4.26691412981615824154288105659592803753603572241553878232442275497263040983289963012587733051992735262478420570088481183617461288634642827025789213176219751425369327811985669649799788291195032622044705405128386661000384383715807966929792962573104177224099979920925833037813171378376567888039096474303458191177510972411629783089166199836509767373378740300063250542452144019623476599341805708964688793180639261025343058339134833364219384862813076064485266340747011439506311366043277995857458464370333769e+02)},\n                                                                                        {SC_(1.14699859619140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.13312555620426978634469842284764916491461832147785714289728903927768857400726157351397438264381982921791859017488027582094078927099048614316743515338014768397045642974722610101439401184170387881494895224693135612934290294439442620044185530024023926782297514189930195290392788122595942308993536110809354520657934235626290498025774148381048574489862472577143836610812926369902808004984385317721744724116864647034723795723574168746366964082097816142051361582792718537689331756674228416478210220813709206e+185), SC_(4.27791946702565627650213115782565286494068066394598357922664668007996492330186613179530827924578785321849504014052092659264394626596036315010545631234732239172956993367997604611240447365849650230167388400446872225976725574862271485612317063690461006283602043150682205419102299886717033451711911162645749086699338979195203863080649811292617625210381547383845646694925084119850569015047764391372783657471277002804567950638827133054286849646825252237510900353964516376040460413449749625321777536043875243e+02)},\n                                                                                        {SC_(1.15713134765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.49223116856003146494697381966033823617207296668392641196499793635493336241838893278190357907475413974452678593112619317179726987242261251024962055627141948167075285577628052293851440779664356192572239188393328849786147102590598944098334624116694850876149361211327243825982040457541826200103077881736562910307365829556270400698212192314806280184857209497735011566583055678636826459949372776959286993959413843814198080986168109602960227129669955426350558104792812079619980678343714684681596203796329333e+187), SC_(4.32597279029379451078593933581128081511490431848712683743604931167044650674212475464960395190983992861152310130833947982104077931178608746757099659858416768185195633591587544829826035892370886814261968182096544111610546330820347226310635375866709550410797345342869123549502439902598672800258888282098935849422214095877433979441481096147465685950904792537563677141752949715927180120768645869713001649854730393722803695610051421698543411564805843980646099151893890496122211987074355412172028306410679216e+02)},\n                                                                                        {SC_(1.16188751220703125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.17004446608904025608956496086628977574244437313516084332425830381370268660733327551254204098763877744436828404040989229648115760372924431294981835591858573086018437745897551811066877142630871603591270037393643754192024624167794865248821435170928199818097473864571292929817439695850567055069753969199615466994134323867646253188303816298694473024975589996825827415809368625547649267047562109751883464453193750244562028761335603498989727176472516538335043961991364219607176094902622059113221775947762645e+188), SC_(4.34855909339158945823349820733929950349328535737884791689763526651127982915961536377556436811553900147283434122632407015715400745873104541398318617580807610012827585359041446025329306346198773919100509217093170344803198183212312808836417504407367313913817722317035668240152089356999677230898067003666913737488729407587241125069849570821175848493118175186198790443922799441668708084943400954084029984215579320457691442750697630580198755156881925172240404256078771322469263426142721875010754671459082354e+02)},\n                                                                                        {SC_(1.16570922851562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.40887255208281035867750704559793784417499244704236090639115076261045008800969724107997683190847832743574617913246655753127914879904681990364453437162517979351644232747042081332441545262276057551371652404822199613409214559588045052276658580789357800876677593311210082294744849883444811087820486713553890949146749950847472728950517582710277426803043850390694699556629263302186403234708773874470798206961167419791224303617417666633141661501408526909305725836200847602479234229829328153080627125679195420e+189), SC_(4.36672201575523456041454596536294131188781932784084844042490408168204295888706924551771855866027585571339765005757839351190007070373266373376453004038782783894056422405388094024617846764363113495298765208398700982742864644266800600495773664100844143018356916958859846627298641697934002785308101760897033046115657677245398833181741131950133050595525604769040194154654873993658232600817690590371948758209490277164629486699672127013118904784662123805952903357336299953693596564697121878093990337272043475e+02)},\n                                                                                        {SC_(1.16584533691406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.70360160259213753789180100158348972704576720287992989634964787772507443062665327685295219962719775184838085418515144183797538993901223193292151724442713503977617739966945381610589216277095340002048061956346000071155984056559048363069690595122453397441014241313190961619336226478558166739503213597425238986149437410678144516877244390390160916975560304961426108112721780487702273801885677095315908468066058764174620472097535602050048249653091958874775509693099506609607290296447933460161394019457708573e+189), SC_(4.36736911089557776411891347841248347848031265364008572962199032596341167038791183474041518273656653293252565066243195097684826414796556738199006582195423116005275947247616796730413120016738573458918854386521477809350946718964091994654562515406880132659358724778258614488447743477560823172627059605516420932550179863787488699611866406676684342910878712865491152162891033389556607746611613386104264195045516611245935760714254172618778132968104526301772141480125426973789401263825536609971087974024055326e+02)},\n                                                                                        {SC_(1.16921630859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.33707650511407420339720591544677139847583440499240761893390249300527092433935854581275726205669397537372839551295128273819720900014513423017186178051013750954933650355001940598950197368286391976327871972028969333823756465998975685045529505945773065177909421471456427624857355092428334731555249208809965064364094132158226594839371436170466320839391535741577282604860593672817098980913333012234317236890260810093725541689875452569603975430322374926968660245673621708220632501898593222023384564992994520e+190), SC_(4.38340068460352593041853128398360105928372614479246929107888855049925797094356741419067330097691630494725972056058175798328681520652011827206495283369060314023599806310999055941203768025962206745834689469648285266927418537837329482230448961762068277050481488489872845214734927589532384371671272081923742143052477808992121614798966259211745609582920211818864135428827433532143665942603072688628741001149116323277140268100088017582305707744386004256033001097704730732492079105323552143344930440012918125e+02)},\n                                                                                        {SC_(1.17668090820312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.16436490634367457798969750472507392026424479360050514672956925393468088356944227288957960978624833220223536496686540033669491596675368077478252374205070592825601621229386491389781842787218977092839609091242493520304764440464559175242982447426045947268234486064089094903055739181013759335711336667434681266881642385184919113676589299554818928170408258560947548717143223754667038751663902597826194264360479949396124241244939250801810083578549044842207396351436607599688535139268430369966864075179747252e+191), SC_(4.41893531702815812414965384203168023987889398681538063026154693658271608682322807825704700384373771517078125781871648317118079847815449248479221733727535587299881523499896203391756400949355697898659418300868115497212917024361805466777459363263913264631478385706799847221495805691577217940431080121283815839824037273676766871422598696398181609697869212484758219752582625354087099818585762706630822257714667416871662058108819315572299699116966753535175777375871105007396235517510639819261601654532267931e+02)},\n                                                                                        {SC_(1.17696136474609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.33136148515454582979959568081011908772158617918503111930515858506240629365724820844351135672655371911589620910537818155070307809613339141634247479553220025060180143004127204702599976207613436673974531694360420654656839588132297301151502412839329575987910322087029926071019568592116744571082898431333111905504762084466446729849239392561227292913268011656748018852284681386054172970251316146137013559811816033850454465838166204220706130920291379754492894047646055538723838670387033963929895319035115083e+191), SC_(4.42027133691601559056083311696047274623212981995072618213510081027379340363123911787208441948003265779667819818453619654305566790631607024096745298815674034457696160266076574499804523469503682609205909627495942993957741006720611657299173214061894030777223202304802478730149557775485539259387825988630334751560348958237245258765937982026877868576643953417750759966107069542572413459274494064352879445589426784193075431206977621803993989249432778034910997867087755985377589884143012594270881083251472660e+02)},\n                                                                                        {SC_(1.18076934814453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.72865474108149486484131649933421697986107036109869076163957638649793323878283439520907274083593174882530213286554649766086599610548564958475393561154825029636000151810254069838545891177328002608218784675734636331668011385894464531261362321953282270567111851450467493715732844456036654916421903856878879596740523118102004191095518649315568660103864258453270962561375460773293491438638621875417070817219590779057730549958820326485137468696496514038436058982596721528464669693294395717162069725745256981e+192), SC_(4.43841818583339162581867662762709454336726121788332931173651704203372650398720454664477171716866578710861655263311707449625197001412820107802142184875241487388864265356864941579950973863709754182349497752592252541543611466717426169510561909866882015459625465272976349771465429528794301223781309923510600041286382573027526385233354314543935944721705292254115046964467068330460745455746895154715970809904280589133315315700065704348554639443125939821687680355150467743612821134970987973815543512530140762e+02)},\n                                                                                        {SC_(1.18472442626953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.77720291504524648648881731322484100687059774555915739315100656823540818898172993635675263351822116719421666243243708127934606690606424157278441104487199775021190355621642350448908747577517834644993210263718823837841735738428835524425698944664829244100612022121795559088758820964331645610795652278410378739312620371379919873738790286343108171703595146089246289228262428437231030391173269829258204101128620174289969565250721188744138165202298567490410461827663163938071487238394441807977777778037365596e+193), SC_(4.45727906714004952352019411516634447921678793175611636458452338500978153784859963484579886393028747524684591865433631006500528549166522805307435775403368427194508889710146046546106944074915606019670019379280979583046743574889070267555995876312413317157042661588567223578199596081826413419005406805024470244494357125294679650565414524294146189417694990115182198251896822853217018815824485438357711253540724070445305826662354765827560513537279465672718974157490136183898221571737838170582599554417024990e+02)},\n                                                                                        {SC_(1.19621551513671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.12632460072056672164032175554520318162299060799277652876498432740921295061160079105822462145376124849624622687411579760341465101610303982515304207522762552125894404274918264525264226523957336093426490379004219435451621638943531367592280530906177517166803463541441327839626022737421962372018075207024290175482520455052120192929597813052527550002794190174032632544486930740302340939910993070423587926847233015549678110022226517582237033975197392785613541526775321490051921098223435729241747842941146171e+195), SC_(4.51215256184495322034814640378124737829492800625663972702036194627848702086990975750810503559665459574774331742546372774793559664565158405991032727270850460201746748913582497642099176940338919061791599771394490679379745693031400660666285823647673695113946938961762603198282312107140906011957587528723875098555862871256384168973249715201946941321805116062884989338421373287110592051963072961564395544603178229984614661967869363859781597128577214062280228875210736253758397009188202259833643195489272202e+02)},\n                                                                                        {SC_(1.19934783935546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.08077348980552577467799856966874129806077745306757314546694920490194417856677901819475736634867301166901909988147939263955015936935919689267169485903374114723707602998921735669019042728677656713603314725372369403398031451220547520453211776719880376414851795162038306066463287623754670799683004884689855851174370671885606372875464804741979836903994178603002102875553806789997926978261345994295842010408219213896213470634337673891969902678967548285517286858628971297495352901951936750153893953774431428e+196), SC_(4.52712964778115536560754230408068032338466506146945161545262620554748300192994689428291848554819378930240314411464583012351151574447207844853748411074539615824089046068257277315706417665043410755314311935647798326027262205234438658823080124151394620129420221605103927312207324257226542937647783463442091974016434870437350688774760834942488741634052639202981129175045466436484437708603756264783500957174797169707894265058735598260079793491508863643870518850769205134085196507405869611056518147486924823e+02)},\n                                                                                        {SC_(1.20542388916015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.47288637649498397463490584839808929107344610045413957416509965616411662620754492287607910583742178882187088654423261931555880460286694447856866599001736048574131286667946604879506648193686097930960676885340696724883366021956564581528420088383402239724521544830822239308580263633238006859445926301426174510863419037725437725663074973111646011479308820277940927132756596393019987806633529537031946064664529736664092175542734795279360535507481102660263101293210183698325646931639087593132760324077862969e+197), SC_(4.55620544640122560656843437269303075065759606287940202607715986535112373369180268980626533887882325748641574439448944963285240352650449345780550030808331175114982871029059334326943641303732970341254153584628471235170271685421005202709751123245502599148992948726707856226830562659670530825796817830667445375018048671910669419687719660351835068592841089533938210488017554586164286630187441895469010537995053529500125516163125122374632192161521107600865323226487233071977031380091577382690495107251966404e+02)},\n                                                                                        {SC_(1.21173614501953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.53722657705535336598910755611543251746691532306825212306289845173739595441601211505710512047825341157800665236161940268385049544882426969081454686616468509957211832092624454413299258050304111197225197187190443664627667758746226770246015105661635002229798824365375648042846663413319429415266328578827921576207322954591201540697120246016313190834142152905222425638964983155626433835883759265384755132546340074094818770542401996198591013257396485062740168333429750953823469547333066243677389492493564457e+199), SC_(4.58644413374637360842882413286627596832863499457353684912868817120391985305599507283869864214260994818660446133329828451013576840529769639307245397303177103244908030089963629886178768398852530136778090115640663528597306450749472779155402465819224142729387316405886579895055387969162139785526616166638097094888746274359020949306019745431091550215816611639987551751369387900872058510354599922736312447511389768639756548163994906156467435694696045453497864949553337399079562660304412087378134212260733110e+02)},\n                                                                                        {SC_(1.21262542724609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.35432441180218176343831923076856165265118395756366996204625441201239105669269576993661638941379506498174378656574543373382874611165839232650776306884000449853450112297696341788173355032152416931453842827461866840313347597528545828849858021425852678245417948565635534689873746932678010124026651642422953325786760306787737135800797652845269173930743598559869678781520051577027626603211898475806568110368381614142944404399209403983444673817376291361933450954383403082070187806048284861547035093744280182e+199), SC_(4.59070687318157914191312289256104113790017591983647077164852830259422503738220207879411420627809186579434510388947909828016836133662026089031636238529376889590764666508860479892805941188721868324869811209095998124206334784202957565351762618774082417373409488506035230556806557357970542736507765728847754662852921332166714356275159535855081888919895777077090469671053802195518901849564176126196545818556570653046607691804133337133318601405139224802870785218317538354423428299518547257123410617425099304e+02)},\n                                                                                        {SC_(1.21494415283203125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.15659045645647046879789461950797822357842938573838016664309396293843841980604659172259177724374568231319470748072942100536548136368379171440824838855290513648641361050758454333621494309287273243466778051219672076014031640791247407147219190830952819786954646670566105638659341678686213549597165653636848258020869286818297989326907522574233040943848183902377673509100971107310809753002152971066326373338686451106204131448714521581310850297966338441125873250344288579039624357160299342265673072370548297e+199), SC_(4.60182467180139304860122635340092579968601032403558915020927721877159459605903133537738872391954445998320391991440475148229728954027615453810184757157614020122160516902468729438231341075928619332967049460803204971161325803593284141007002713078428540395863524949658701471206176396484172048956382179728957238338848880618925905859877186803479300174390555670148154246499522320673034317988917032459941542102622995467992685376716310001361008388125079128656241028950167243444796002107206758405710818162522365e+02)},\n                                                                                        {SC_(1.22615936279296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.55891707343890861333107528872000125384992069081107343075692250198695335778763764722972116930389768118040284757291345971617866950096348397346497109951267659169682475577409416433777889634622639310763376013335877788979692380859256537584667212808804495473460224553344188816668072382698675833299101831022384552940146020714691250632002644132024347461830447762479310238845499976285814306157714957904442780284713773917878711077207101929047255990870835943667110358440294137462882092311108193751971218457562285e+202), SC_(4.65566180181308601687197214883110710267518162901612389209308337182049787592884988508778265520804774316739377836913985521338311488791870394377733839940584935402195196179079671746821601997600647827253159015330050423400109910092244261447079111113935734112772405809246653266606532893097333263689076071768554831343218620103768759172409660450990819328350346129788218404401533419506904914328984508874434198465948905945973422531515198617482429364905131139829112167523142136913416600664190619507696242221207844e+02)},\n                                                                                        {SC_(1.22619323730468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.58449866440180470070191255291350578276430677120008207396604062633952008424517277064268593796831554301512058536322739058255100951061978536288233652914992687980604849466144619188110648281137162102693237773617084748273740092723387623184680690864908739570319524168152761116810062579619604455411809368453388103958420528285875094359460227675579527718338309980408778644406238202194855287733337804770744976939840357419181751496785514223664953084095349641874496362779033280232517588654095915909796647334946538e+202), SC_(4.65582456842031103982765657592733768436482389802303278459170748014779783413746382141872146073444244659037135875051706529023323727096233443454744148765273214127870255401474510571009246531321472548515566713289733557524897722853217818640869277820642987578998266188799347645977999776519628085762656691335248444257233855005328228172874274722463851122172075368501924792150509246112576538951884713556830171505250189733995837713742274803980588397937960976209690666059177038355125038075881849154482068166278949e+02)},\n                                                                                        {SC_(1.23799957275390625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.63544640277139549137310217513566911082050773760629450920347694631060367127408233147593401766455841201118446415408325154981230715715455491324204261136261388172357523685001500794964663415016270284775184993907652766125760462281193288661163961171640181277213188681876991560803305358808116180156366567258747830621553185324244095962080075838713097874670376549945099108644580190029004807825399023241743390345060602994050322667462629590994560048444053441040307609763036694175761903442048956889503549495771475e+204), SC_(4.71261091476443044174009031550121164087922587248538936531553670128723998271795627945494627931712563525489483471271490199751464148211247080290612401958890319692956635892067105806772287886971447093677261959379313382459502418691195246517599651939336449072101970360321393345997029507482162837462872933987224296207970512090035167652338412089600998866394410347174794312023591105235384454850107047396137050711372465161615320162198503385589320814580402754630303852772582439987536871840249997710619967447849769e+02)},\n                                                                                        {SC_(1.25180114746093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.59164584120759822433729640121908362404382528667366168016211012136262493573796416468934454080722442819592729366199883974592653373814997482285151144183211503181149877896916490249979823147443770241205010083434953609838501059082637860084473488684268662196558549799390015357307833087293487106176398922367044193563778471532663491949066257470709103655086794550502277091853533121528333512273743787909493277348483131594566628676120177624493344214015792039239212666312752007868221875289142232496944883926770983e+207), SC_(4.77913724798800681955430578838170972776147677957335440613483895134458910977979271071998858025956271863451521004480877448444705502394603193543304233173262957178632707280054290322433982514447252840302799604750092243542587286126008195237116029804390008945422461841858714922171644469713848101479824758205483289065080762811556114339695355323157367827915066956513303499241227723078831912676134488999078147639237638181261071999491859319941691836054037447435054688905309468026211939592743544705891962656359890e+02)},\n                                                                                        {SC_(1.26056976318359375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.47944530448670733794842725159133200821775724242209804922675101264218937133297706754867035444908415693516495267595479792500076322036290057140288518643332783148976313998913201844454266658989159411866622584736805756712772527559512449155625283947557356273137882027305711821105315135660313249431474176183751563787419519341798335634374293968251313382364567201428796735363138379588083817115727239764608230881909271719091638818665238673924844519813045932365983949672602461525090884892917696449113427473432611e+209), SC_(4.82148319303369440301086271858092673802618004483239323480692149410434318394191573757344985828781863681651431261736606862501484815698253191362354120841363869041301488984529555616556948242927585724138368323892636782807303984172331318566293299177190965274838781586071345777819043224174873310548927132848686539982081541439382896169634019565835649734472184794447451074315439663907936970503807173589207462375241228602526217220948754246787406212838192192080655949898449917589909210977252841445312992054564017e+02)},\n                                                                                        {SC_(1.26528381347656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.42182663319913496237126334093835825748694886131424002980650014347744295664965549494446481361598225682990330744946648677685520636990135864919476466055236702155334977475359346896462063239402055686737503877208584652625271796936117224137072133094323273608436610195282253939569361186031744098676026263896910237380735503288821386135118854355488827227941496303649637517454456250708426963234851364505960880285882115055099626845148663492195515897643185551754721052128339042608975235122678944659017286496904648e+210), SC_(4.84427391591301650052381022200108849023216628100423803087799853789983959173696199457369094464401636461657272106469921042963581927578733185196179968915269871290038406151649057065311629432268779618446872958199782490908653105319829512103019653489005006190674262042213969375938486355012220489341342510995564500736624365326611243292379195043284007699636871863629074439671812757434360843610488818401522375571442927353714337151485631022366803160047666556979339491290026656136306875038147348360050502176202422e+02)},\n                                                                                        {SC_(1.26626281738281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.88862751617505851662619430168993877955565535588536451326356637770034582102421377462236676184908641703483865628055534914138322841803124912110919782553953667775847732352875682462046577536819224779680333308106095240747838269420296233544831460693531183439436736036087423110649963930611949368753098090117161978908560789271073011777487156058298740462440037996088447500657381730154283922695105844777388900104753928353262900550298794492094099799678328596848951263361298417073922920854984503396179548222543585e+210), SC_(4.84900925800517672664483042191143848726171016934065470589319654686496076573905490053994333767886359716240323248830372926283174229250940872975446642437440897096206643110454391026039459587744414572034553130902512860727364002056544507182565004256836206869711152601033474950214308009016121030357246527302131401609263486366587179672052658852113611361502754374513090629260124033425429279447872908660946050193375032680068311406152851252925764663112571081859290354963944257147508729494158019907160352804666125e+02)},\n                                                                                        {SC_(1.26949523925781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.85799885745998920983430388775490153127925068873532729669169390918617254746915773463320302282739929494601768464003339167247200641328771725088224797614495744050986505072566022621054416322390914801017366050732480683872837438676396055645169732638593856886846981379591598656894739776614514376900990647800507136987971616732989428416199491647911369262925451227656600583757885470261069111532104994288570336088843258755614269718676778177306165450320965497187597215455165997680296244645872016039685454310101952e+211), SC_(4.86464954647205058932700040335704058990587792445438024904196931470213636195389835233501319979826785327943021837296462912390219851476240131715149969896721901709510374365704507847553672845446422867959018705672481025755092005636269531960624664652432950455618523240891670464839373917635419942739122271834834924041749709718190210192003788420149690752796304096785976223784765116091025926398315502702005847182470739762772788908019519409517116141829756065254842122228844599700547916445634875394905531678596620e+02)},\n                                                                                        {SC_(1.27250030517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.95867387692108285179759791034988666848597887114044088866820859997283869387295514402198804184526431310068686660892500949388956183563166078615891548045187842895926680712128022081015852290913773464495476378852524420987500146395106345745045475155014107754152994521610288846662130574437281981938171901343100109693670867998703435000886741585872179739002921326486635158897103002665484547764176300773045064483556955889408865935686707701790080584648015276776444261866776987067679190914221646479689390537878078e+211), SC_(4.87919717009344131514631289579241154775821488134363277172297134078336073472950412943474019517221019752833987994775391483035469035515957773608825266476207689928976238170180329913439429207552604863895925712737510217595966475355941728504981837187112347523484432981760617659246407461153791516262864269255521106517629930470586062091530539793980986796861848687684093248450187925495436801626253667290891726247757586551327927898827284033405955483379928728052724066771109747194932351277083766072025197131496533e+02)},\n                                                                                        {SC_(1.29062194824218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.21590360545550004800273328037111759735823539832501501238942066897011899542988253023772482607570048592073969960105247521194785283035579854537779773548296379315267988533237821307089515058672624892673123328290349821346743603749158035761635826782970509488437368459451106153525850871416146912122735487361690533036361909315075565397530552385016488129812930051233200858550863716538886393933272639841709630461564028484065373426802698523392243504736548141458108188126865314438400525162559955957719668783144295e+215), SC_(4.96707507337624230835834582593585099424292829056671491295715545791576712585483386980998849050758102873179382833261429221300624185796786643099268596081224644718649242360750271883099760637988191962094328437016890001127425992362342595015239645206408019289479399322533043610452336515295295372963558098454188185248371949296115543044058358763000583734120104467379609850823760791330220841372016697126011472003915244721536043248287088048686085570184152114208170082711831868667736655604873979138846244857555504e+02)},\n                                                                                        {SC_(1.29424133300781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.02635767918607903950666819307682499880944197343260958935080874290175957238114807519205991749378714397245455234462488828189263998761591993374250731656398850403654998342002293021283861294300231498797581907209374665981666986913633321341249973849869957542618774974494400113058322106941110881813291254335466566510306827542788588927974700711757307682138211208910182197058437214618351934024970425963238905879640101814733814925404186995847697463910867546097073029931711592903529105940185039158291317208553695e+216), SC_(4.98465739897072943691074716844816005455804262525363218872826392795772484833822830748945444630946018097946539821268771767792779770797404573656853521184140322276370394751712473314374988767734720967763623587742850797176065743114329696060255957832009138469998584629988890137927939070061921054478030517395210480900363472040704944129357146227657528620536829990523249863698565753597657087229610766086571583276695990881406923809046105229072143139278550641783755595716827060026398988355154407299754484782186800e+02)},\n                                                                                        {SC_(1.30573669433593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.11047037112930704613427017755396345874582320279600548545911791156721430660763403861749777389079710057296525391370371745105912549823698755130456815162941916362515793313915165615809709989181259005687120825883272205574689531515756961468600954601723111884113118157764587818186921702290723851808779851977542885044517298186399535323045511040607831764522190868433521573940090638053610732273845854119620294238719238345314171753103940175114885965667184883405140793980515608522435245655397470874175799832355807e+218), SC_(5.04056706138053612227836930773511019745903578081769948489042969445572696905529437229195116592588294463340493654733509712278887972981390782991171166170630641712428688205252527708212949364619634081469924129701596201684932939230739957616882108608304370977642911193102652520219566934599078289847473327558502484550272204555309698138067742627419911106375792189070578053438859727418663988163096021313840652515690583408085348753420825363568538804095479531437589259166639111370167223851459391164324546850328466e+02)},\n                                                                                        {SC_(1.30709594726562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.57198657473474022361078506195683658976042521298148785406897748857331396634152320328053708095932878868850533117608441519872697482457770382738686874629509079054132087268861517725301960152147300248185854688387424228680961066115514445921170527683726157520838569878477926984709891047082110734796837300766043108427983705112962391598568733135510506107054537900306279418705793740509183901597123501585659962324908263296924279890499500285778556771339753879450690940168946993548531857563915771234202837847081901e+219), SC_(5.04718475519421475308021587903598678827185913061229094073537460481591284692845558765667474673048643744759631465391904335287247101873423929736288890690196047120156062961523815762863551801694694310952078650695378167643471825358756323245862588723828845543910649902448106580483748881080017768254156526727494087330413974462259669018702862098649925680097892943790873992309997891961337675649350233071867566329550971552983101718088589057110957989487091892082611974507156291049908237359197522900089005839019441e+02)},\n                                                                                        {SC_(1.30757568359375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.98563686705140334136632420794426063419420819635804629691052815342827217474339676322757056107207821055631757016119174791433473323461048935533766001308854797203996184185053061166415162970932624000354196417460847036009606078854375413399147819888558836693415442600056842328952139079661870627878851376683543858361948322311963261616184567635027401932771810155778205621899995613606606027668494150616534496416237206153201761761040527591641945154832290213681862915035222586103839425746298119088508843620302502e+219), SC_(5.04952075068201452877049402384085667382039712175851309712054733696966375348883144866797666228028441956440415208433075850847372002223974621757009454129945034879526159871514410915165309930581213628753781515588339209486892809780812242425478944786501421965168807767801454281400629080690695002606343716236172309756290935605128043867730565378035993871825892925356453618194750102168085639208980352844768548493214808494473737323824092555994291894318005736307117437416184900158723053880736848642925975684657313e+02)},\n                                                                                        {SC_(1.30835266113281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.89884779338659572340667722627856777950879031841712716039944733865740080403723127724238455822688446890092898714808084039052086275943289859165528633865210355151827064006313537544100159003115195159988934635051028734240337971394218034429756626314745504466543096666716942769105496284698929192456748358076397742633138863541903000820511146383060249820242564286483301649786212731196689928975791326633683177093822391303994311405487828595741176720301420042264863778307503705534200433933511243281215414252329809e+219), SC_(5.05330448711113547740084085728643393088729057540142359716861526592153900166623616172771839263187289188475213653963382206206780656792607292391915440634805523140306540791995474412903174717913885487108082640648389957957627267579671929059416203047208781406829815504908537090233510445576281627930667285757767870170733774400733629969662813491740398249812314185189751521967234574281785209394751043973315949093403987343092713999935938686179092919598408170887392212493275912766983779341242209651461394332425019e+02)},\n                                                                                        {SC_(1.31600036621093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.20430297073324444437220821750693753464613246950635491860869524757996034204318778211038386463755184564532939798221167016228509891432529361310635867471398173227367796445371474893031468325983962612610083622234476617695393089714843405448851735353769152837451722948166372435965195916922392652779024473274058020281308553443569989036574389784227263322141079701444013212972193344569946443291355397983426399775757361741547454542158519531653967093517404865222607047227338674158623715647518511691498640412293904e+221), SC_(5.09057206503737122364979164051658316850633623031344072914243731310808350391269043112269701381715236707083042095898779601737200121748253088388122013559603714273813355308810812702883502878053310086795630782520444428271130378445215951339280458638002178123797543483134850833815286322251157103777905455496112357784075324808828808840502260423427623967588990828312971943416360309107231070254504658347786028595677275135150700040966302169892714539505413325343491586338857506633444582388135424475614550206040523e+02)},\n                                                                                        {SC_(1.31623291015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.34890153554071906149529006475856843643751489002724557180732809872453487567537580013324845735182681364623819603263290560087424642868366952110053204940750673788040254626990523613160924817804239450455915579901953536902789993286423849735969007117782833444492048897066029577542365441137392306949851570478561227799976033254349445806030147073802728868463768528161767069029113992137784684805014331876027002586606955320060364032209948400145502171437322646568432969224281296125331077633162606235130134587377001e+221), SC_(5.09170596135542071635485907939507005816072655383249004647616859331032889824319132710022885781603007135074720366638005731562930984297217884937926718300870954121095461479959619581243107681841414976524250071299102867834392463171886408570759649746718487447920429310226437182653719834942024506857917378738160034880710110849878165330711698800626112257295745469776597348834001244276042481582814210467327983299164470090152686293651312160064867436343391488754391020479490075778582314493149770434063452256141068e+02)},\n                                                                                        {SC_(1.31660949707031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.62080843680019919873850576732273949718248132887610477835752418351373087232255107303429222446767091920867247462884237784576167702378756866685787235723582082194312231685225050220076259431742496269643395666931926989161361245494650469473168200197681613501338828792960004222484214787748680532017999512808760847668203053412185342595402398335751175395526956679304124366562325500718958908066131857708220793387119393581003308929833214831141006329804253792611565281261549823997147097470972678670570753197264921e+221), SC_(5.09354230611513654152529095312610350686660505355384267208484258596926205528732725328825476978975925986320768895807545158809407801219620739849964863592926642717506315967375728028495669860452401275586479241959878160888708620723000916642297309981107745103582534014810105303665195808031508715399216703921652668968868711979325649694202907967900674700074630676585663286896449600740805134040374062365773045491320099146046085609996671401887335881930277977646522083923031915640684425327783098948145569090266835e+02)},\n                                                                                        {SC_(1.32367004394531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.07974731828554602243598676167524954829604432333249686199200513337750808529123357340982668996969696862888447969719988108175036091908061220618035384938734121256991082466576516387811186986231912523022170688565161099100085850104388725471729075526067491977465916622057303317019411406913265546871133783089297807452484318205531517424877673760203009558823102427187524205890103762796000616913276792686635297763247418931989301460494127323302450925275282375748876100888627116605943075436310393738440647082870976e+222), SC_(5.12799152164536461677625508098828962831750569823734125016345352967428738820658510933926540604886371746216477089640439301522969304604479689124091633260606915614563143949634893714138251907868602359172153932413248182308174356343968882434211883450893172968119039149877442419849286186341796732351571516582537288352338118048183842085010326204779953835882065024477537412670008102631597632482607256740792941129696039209781548558122538256573827278333046224430889866265352039675318823746384170099150914814896127e+02)},\n                                                                                        {SC_(1.32803466796875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.28070823491571021525239010673229927401137947201366072881652104355715653758563674368037423427825943179632334768820206990671067682112131868828127813760869517245688619623730353791106389098468093493314257541923738404710042820138015545902708203321078405936598569492447767787524108995822184403855483715577641469263403120941922738628425789926464726143448815667666101785768205827774691372221061087963997751796163326855898297808570953176902345206734136236011898491952894937956307253754479421600833336085761764e+223), SC_(5.14930594209023937095252118022912016782660949860856616535319047187025547160832057314457620561305811068004437607306774351795320211730551561202646716443789266629935182231469766334508684080596627066111062924159810854422801600568899593348352290940161554513014104643039559656004795089721242595064414092021121612389698714881600790477067081696100422845333141984137261163653252618760353608323659593957387383454525558195514189040087115895303172455491261027290336633915147987831744448660710264647965445876368458e+02)},\n                                                                                        {SC_(1.33675842285156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.04487592056823951749370118133346032782665582332320336770393703280563240947568243037471203707679509318737959335708187651456879316231500557939253820253928459853161274686018563956401269481831555723011013866139819838885243914185192310402785776841977135186839219448331005504911009488722399614370734935701947013822011755227568394117465381976156353147368926632238096446199449983178419653533485890194760272906098477670188283919492256089163777064921090111092199141029427173806536853519859936160629847302923680e+225), SC_(5.19195106075410034290860984504733637153218280246717993248425635237416403493495318589567907863597845130750552805426305743614661189702147283741813335142860258509308269781662847293834728595455208727081878775197451813729921978144441269605318592415485793856003553608714984355030531049414976690328771919030328500222259845443398300762464777894624528249791401507146478046353231433105665917182756627015352926874667121048774520118948393190128289917395422974633167351915837084164576054561860970867812507528309584e+02)},\n                                                                                        {SC_(1.34035095214843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.76598204812591379793876223679444078853262430851184176754539163761576104963595030733709073046314624652632727924691401224493533106391708005900869581172982911504735447581738915772003080675668641109785459887130595297204140319103083013549864159762889924606591210223813780057786834462548165187477631205841284653024565678833477403213080316183580107319508037372389034956734737668256753103880241932563617233055230365176675939449771718150718882027105331966170334767838958844427133106900834468556463786935275971e+226), SC_(5.20952937953510311612700996652581835187129670670525219305843861214251304631520267187932335943317776423702990089389840495886950810255579571748485262032805903168965775875734411670750100550222166133984562540778446631872610909260428625472595414222131722611295118606849796262580383861869373865597195159398022742273526431038380628536123929447576022776638903828231378868581144585096060415344645824863351043374712194542900191117931870136066149529632894584675792095636941183422988361538418622753330375645025189e+02)},\n                                                                                        {SC_(1.34275268554687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.72257672426884828691799342524423336714621224328121292332405965713113755032186113138530826219867084086181998285740109655389231920400434217980485240762630362516318515206518608895731337543107667246119736500229194697367417769844278581944659860231356492841519374601754707893016975392475518372240771501381577105305041110485323518528774133871865878090055354523988957242238120540653181509338618549137646650793927327789520566641048772697724056450200705092957427006372334621884940334830557330923184989481075378e+226), SC_(5.22128650196882834780259459282760755407083189900754238934391243922566314403107319212937612503047297572240803299424682178101658988970210123124514168813678117747463815253795630968329750494814497716950751389773842284204492352152745197845477388159371449629926682349918291639471700629500236026075236784401238525544228303087377826813849169893932846792228697576558732868556129223397927663038113673265617059961650735929834996007973766584756833331457422233891977712090671035632865121644430763840525098300531833e+02)},\n                                                                                        {SC_(1.34866821289062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.03758299144100638981185218421401545048858039481957536450374612380269573236280572413492140072301886580231441585024300960761900033108759439986269361149796275039952562150755856406175298652045027556273869273220383518259909901841567808793911274758689689579058306553540568423349241996463204841712225101660223073490905528769727834336511067903286578939532730136204162010869784842499894531704016034480810009720858585593094766121276753436879212423686669486395049415023005120719348180697872547142370502198539619e+228), SC_(5.25026295164316330412148519325657366368341934191738216538835689753718118244637948844029887933590653824478536507726517366715517280707475985040666990300124488759842843675068931885421203762075092808398239500818732566913870839631327080470586159287657640540603782621329907430937887513962909954497139740333551395157204757935707524326186810806941798522726686104974995691572341090784797510421803675247476639268699340282910305104132171213490831314692011881124391726077917804990741090076632485651333706549098088e+02)},\n                                                                                        {SC_(1.35162475585937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.41980376428646991328403638285001046532541402055318879407523787526196609548782003540736420797312273330747025453433773859568195648080910544797809650823656307940556997217802095934416528012621274676805389838875861717386566374813306011804631755376966636171961046158493908287295098146052007262454837398730973136787757242605461232162225787818324467484620214344455285701914485871832461801535652548797585119173068598820943528138136172443348282911091890227275919280750941144920643114850046197721529498834275680e+228), SC_(5.26475496500526181283223415222931159541474564997542783891234224056488099012061586465358246437404585773392755455671466230019611455028822473946472827901176638302255322883082468946520452433719767478326435979014169829059166262878725946001872060728634606060222396400999645731037033449384300160210919895137357153527340054334814098905421275806946610206047604319348201515764380435364861087257454422699435684669676461222307408958852208149679997649800199413405241735896662373831864075082814473750897919380010591e+02)},\n                                                                                        {SC_(1.35277099609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.75330901893496143614480518805021597187220753373090306683623319348243653926755583883821809078252803526660189342177950736963693693418130116521832649223825838146312095865813036730649544678390516412698226308770476471718791195617123322190470103338445472465117667875244772983987288984220754698497563195323971592519002190858693387971198535601156597113239528895027697549041116230589151999239027691989777808200402329520469187931248454991509338333394196096004148435650634439170607672125930211460818875344878619e+228), SC_(5.27037520925066996144123543728795736277209313561233520628514718710667129879712146192231770243356551669952438664771719040493082214047541521130988719545217800317264354623413167385592555762706322082258567717316963570751158300472206989689724105850881671486491348521277463794950583844259767119222102026760477265962584199147543111581892773291923102470529963899022859734152285804769121827324961441111535590535592189163462395036379792298521953571645039332350187185266596748506639369174410682033255965417378528e+02)},\n                                                                                        {SC_(1.36809814453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.43665838167351047881636027667694075448999427774273904740299820753970460953894100809479985551588964957306960928805136469924980953880819810833590058279407962197780122638840505416894074609086563129092943564808390488159277136949221096029113036812220956185572407900765503236591662061061916852854842477810045932391848299911950430896675257899862204466940846948382906025354509618691220425907982492301908575380438135427647444247259871750976886865939605259140731189234797205329218519883224564238500581024595703e+232), SC_(5.34562061423232935236510877152296042596078022530607434214664258529691271359977729440850302313542229637342234080210374018623104298122316086647596436295244701395423805145032376676811315322200754593884339580356984239803557355854450272173588624647335756403674507959004051793289238402811538245865888546753458609705052143578748768671177989989096831031565535509057569105543849401773063950233686232012830592153145958757653871091668532173992683886080217342604942002650012032334072330469444777330514617803964186e+02)},\n                                                                                        {SC_(1.37396728515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.57445931970806583250984507048609472939434344132943111073255083654200899492261863816284964557987973186677399599108698857436440141682472324790876275332614073610885728701014285680660939997127797911824164931280689027600115789770298691618495447837633152318797839464470979545365963361974475998077738567098254810060480017073333408534359527573993333096615594630471279868218917060537792368347184506660224588475026107066059758346687104911799550344066179802636485276455238679107330199981626929311674463083068206e+233), SC_(5.37447966206752035642162949220887667913494247099321037099782266542594292623021717676050787529532715116178887368049118780665173468283257864146805822002244854592284046168039802892090231212639806654404359978154257147248849470858213112883265001894460743735137952859232620515109968476658295957583503989037489853223771096565961197376699581731125653687887089436425254682248503815299994549638506042855321848386908912955900927145521952700624216313900629597683786355911331563926812426498370453980352772244091287e+02)},\n                                                                                        {SC_(1.37549072265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.44739806870853855798698202490950606864695117593043550715097510559295232548813664988316665395531619594176287444749444108798452533131857204642671369527004246152238118820312371656837122966212882675668465946859327741171545570202801585675147673421402231485756658720064030527113574783158036247842455280672211892472301354629451152297962450562231788102097454624845758954245145508782659373286589906093172497711014545585098517359319508684005342264391315711745957599603265739304655736626747812329821100113006264e+233), SC_(5.38197464743701669466920822675248386254972181676740047863698971663268651974554470534078078447169258855611630804254247428232364918849597567871875964441111795503383831166191423768561559012434898026793764689292504509729337326575781027128117943992819289247698978928126382933073763904592714881014934910219688679028640141885433509627429372941863297642735889821423251401065908010409591241126459309471086907469438253362943015748884249078474441075907869239597940269825794172317057667757399080180481679248899443e+02)},\n                                                                                        {SC_(1.37654602050781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.15610850324474368845825869389237559430406874889279829247883587116534495511797873234893805057999315374032893893325802128264373371567625275567338160151235408720587666700266970202844234236259658223533617213882520561768822825151625138229456384983799105486798915709188654367736214901018871450295995512195617083052005584391228662521793810570017633499857746817609313185426721124641493532532740745789683793723837348322202913340405861516351346814135006965059436198684684966069535318213110411909594630632509634e+233), SC_(5.38716747920140037545182738110377392481973607055341550468766460051014501227627619520670697473888082164744968378691388295036889329356043727813740600303617277934445692121712859838392338379682839092199608515884007571902595422688150659151926573365190816934832987925104354270846739169599050068020636673931660890078580947461574828742683524190435130009285480503000814762955133740311881081153877562610742025345655822398732234042548089087632632537478252641951318926836481942421041203574565831352909552782796367e+02)},\n                                                                                        {SC_(1.38742248535156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.94137449285935962923897980881150109167214923436042568057576296930025026633674343917193272859437621196571434178851106361353872539709513063363868747070231790985400509048821056978318710066219644155909699640440830454779830661654766985217725952369183140008441143482827248282311253610020569721896629147790967524890801433810696756626692060910581735656031175688825814405709168176964891456674090351340369813384160376834612425220281506935093571689423172270508239929846781879339155506616628136292925588862609393e+236), SC_(5.44073478170275232544960623750237247802973930421719133513177896493502205239891881569953226928075093059226104060234550276544509721821864387663106084487147418544635302635683849165411433837537721948876332331637692495343785248459016956878988671785418434318670591872540493208251638789808096916956075163558173926897176055610905089961134607376039552934917930006620734130726038566598550633358290330365783195782213973448681712438587824991594267676148213376734117184065384402562995236742493686501297157101274039e+02)},\n                                                                                        {SC_(1.40817138671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.45047783862578016771187352316626250639104856503213692940797510094367811683719859371837611948876052889226978388589671660277053201379812838972368868385689068845270488840863386270822552954623006676716684460977619901273200826351757795518310791697371917769666310875915754336145843903156930139978073188934850126108047782541958567841244346147682484158518251765192667106466135047505965766946639676562432318269581456593507844356926543037322049512536555538390905621026319426551197602354083076580019817187774130e+240), SC_(5.54316125600214799588419962417945394332523267556118090767620331268725402488585878663785109565964379443484283988603046143449079496173647142856427776395165218911751915669336253101281121875785693175978516640099613017768900115795539500296330299124520856269777844541770601480926945988230544167248478263819595774845641516075781269952172308738133777384625547194894635615323561692637434420220048823156913290124747030955807793670736745671154828320011088152941136766376276172566953679137781943222876723814726228e+02)},\n                                                                                        {SC_(1.41276977539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.29769358197437978289305486828405415593744927224137533421831744096268714482072595019488151878713466297195803067325683594867278144259117267669216271022979525455634885071497709052317371327844232599879493249027819117690288351866923957864254062116454398782338873217268971517767278611167863097447738261861974672168330424639605623446447709583953653269238481720372824627698880292174467910038590456941626401333325664483155084954331720654078806281686076427405275619986065880807363339124300916663793340207234637e+241), SC_(5.56590278964195363055269190813350557132353108454816850370504212598847703736686463269019180345382347527146231458086393692201520736331668808189290877706107323025923572215186361662566575032119908704324689096914199614735075665671862846093075373454056027879605986530987528638208952705784056489726487166045924339232284200052452678800617599413718428834646504150666420322421857852133816613033713612096579105911460653813008349255145140537231944689083118545750975574875846546891821496575472134896542283953354856e+02)},\n                                                                                        {SC_(1.41587036132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.45700475084273847824800128949600201193728211676650893383703940376296196707616775460963979387665332250851408505353543405797770371522415314044559061860640290889595020145800442452717688191084580220776684619492249010351273719817504537899153816768661850312452730900022703765789368194538916913263249469249440220255347495396821077127844614725067890479740494432586424591673258511434380055449528918178700376492848806540555098630848479504780748525545422396164312336546370069797912169798077768305656038801516115e+242), SC_(5.58124535531691156358956295727901729015506539956060851209731442013027776110960844689352660619743478047064893828864590892880111411039248744313506509692547593260858956437839183313439859676036277217218579692338253620069842885145918557087647449565059328129795916431330764520212869086559988310558135602601545039694988694691631307700471319706533106459300011127849105994462310176911769253362342042988699831723659352410467715100722497117014805512706273364667515126632483543862981978943369630354581749601486703e+02)},\n                                                                                        {SC_(1.41904479980468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.18277659724864023573058199938725005016703241663239935115555242418220171212135112646305947850063102485913655275051836486796200773434429814327002908164764694313054284416932532967316622256652252154918013084591713511558403037848638293814933171582343066678380244082149243054022052803338986675813327622484944489910631057012470427768696858123413430849751475434908731434292467868829860069291608743431929459951034297456950375548090246519738247005570808538267041289349701357231648624558698147475570190605941087e+243), SC_(5.59696042320462978439568756111200475663886377134996576357804457203011096684033312838694859863093553024713705778263178569957006593076761661734563525640132532452211577248177154109646786029086660157725508435204792532722710493791132947690964846647255357603782995381910697774475267480990322814922974293568357886774487856811576818597888244529153401179186252672809621345169721605047079863312166353473034902596376985804904442412811868887448608869454025892661586972785767049716839190669050496289708916166669722e+02)},\n                                                                                        {SC_(1.41986633300781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.77656396584746773810737763234272186871275885715203351598530417029865248456108801632671238261817957872613456664507949730737630096134874716558337873020333155609917315392199618322278544157455920095366877241879319536413766792151195033497448838611154021880038869795134840079316970040445597134438351706274525046579007549954716008807737920162573001114168187522750910778425694618872313532377610727503249367402529561172729262904340554323137798863284651190187993266313683732031181549860389058468449515394336613e+243), SC_(5.60102858740052815335507252670728605456101064276882282423270628984738677282705266640353715153201846731931501529985375769984154197255945559179553921682570616652499539841726163456472036272006298078657865914422591324537250171736845540199057243018923351822710363405301840808518096772177326287216662701012976439963333566171534662702503881528405544410730999299958281750588785448427750777596333548634424573673251670956704985134981663192922835689964182975431954866582558727959277487365673323689895389978372552e+02)},\n                                                                                        {SC_(1.42427612304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.57870043752239386839726679404420067362103046088107575850638678988832376786939927292949624462590888949034872897552392220471385047650198209385052357152717232361402013151131838254506042599922557021522203836604724366828171398195496260361039842947797321531848898456595509460711058701689033764906979506725961522004603520277924536319487480724263618108020449629489335578962994168936435425940559140677298813409365233961281566701722666960021003137255319724257654134449567368560764349753299806583694895082629591e+244), SC_(5.62287364691243587470418516824702690291803865057369160930517009096543310613885900814270521761820188040079087463496297314973424544697940898240000952686179694874232131262568909826911809714242604935869115516738410465045064829606438287978265035705635104011092898510011508515128175847321762480377743984218712844183082888685354633353033343702368814462795225840254844117082976217461960252923189139447784927849067102167408838543749435085358111309984233582312292772333532391378218839869756553026707212646753024e+02)},\n                                                                                        {SC_(1.42991394042968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.58274727945389219384319561854077301522517933430308853974913721288742414638038643710961668011192950919073982455017959454314982046716644999867729476203086917034953232635323996803108863433145158622027740562634056691346529093065748054619201394049768310190120219008587950787612591530405299265360972075564144649730028390439634124490453657094040064774134115734099148027010660153989223513543358084719105524162221506603189279159826755642066698395026788491560522275176546664549031330030827489366792944209215865e+245), SC_(5.65082201452935579386055464673827161043102786912112989828216405327102864980935234010101817675401404810570397749095343902510171623073877304308522566803776644624933433708936493772646755866787686022780705666226923753962424323139011124440467120038633133573520308696615076067682770635159098067002111585312510570323114742145171374950209137328806719638500202143174441193691577014288589245547536497236184245555194037361207570833946398919633703684652413081144011374359706061953325163751597166544102049853137294e+02)},\n                                                                                        {SC_(1.45612670898437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.16995178190660470435013968675654057356100423526443047915030442290477885930184525474088450947700707439590535065674535106824773220009688537124707117771163514576605288123717067178670320340096436709623760290967152973913655611581905741163004105168615813991373436869440699128068453152449208988794551675140202420862219385425129905917305100554048419060569258957398702547464611372151334417605606083406430554977895372524524122522697297127705608486291636342174641790417051207283201854369808936799623920129087652e+251), SC_(5.78105820877420254749018375118334573088180310531321871850936637497417432028678014727547139459642045723422376250837241723845231522704894837309175381694580815979227625387064870197782835254715872148088476346944444050912188945000544307533987758164909942296309047775799958061128283376784026199068715674052158710042201798342707251799089380226965044256880845033520435804086815865400254156724737804125780474293752006393862736836350364888814107081013595530656940208743443043610026304270263460379054106949356957e+02)},\n                                                                                        {SC_(1.46037475585937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.69930605328247784982117215220054678491661056184636042881894505549034812297590622214457938484959346899003559534563845448573036077005798131699075726666607922394799460051240397075879646761566384034086433198905900908454792647076810658122571127376004507690505928563489776258892148234324694693825237765781497223919271315876177476972843059879606582513749639326798714947885640953493053562372224253994285795790891703503002691869858697528467125048354756867826942396363160571134501900605040701724274511833528359e+251), SC_(5.80220912683556918050796809047612356322971511901138834716315060163991718224752307714005300946768648550179251688727047278024879768584854435765331125546818016132028274118768640446647255958617632633138022820716514764039994897626842474300875086256234584506012124722044989463928198934591444333537172423799209759309634771723494530188279308103341596078070178667937026021872013012533565450344166010882477577545424971058180456400883811447349766507230520901879827691207081331498132925503598987639691357581146707e+02)},\n                                                                                        {SC_(1.46270629882812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.09833808080703326931235501974647441569671295832319519721588610852023346320413283437815113835289088084247445634520575187616176896703878358661268752066563599963112313631480845256454474450059557755162136325216130487396730150025349485159675820857574008820608122842424588512371268744459507483184221425045236998101418458008989238675188688553825206667848231017380725458251129105716305262281243625562854947207889982588869175940821849472906561997424713044310639275973918442426991990997306461733717003965262853e+252), SC_(5.81382309299270564535579676081707966611171658653017094092827483720791290619450931796376715039417461277943213990951541654251641058256672068929863887283386083842584878856037804814013991835121051738643778162387509305336396760941969684817842822617959407571849173442944169183361178744288803625942429124646726715663777722709259287537311638339801749383933175269192971203149450954268678743393795292020521587007890073088982866139201967618214305073267348845300522207706333936760908257989610506416548415479263219e+02)},\n                                                                                        {SC_(1.46582702636718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.46722428839224364933445153534390252870263560016896366027344595127107415532077675312494028252559444975998945508299618570275996537740007563206032175948500220545257858159362956203884753169958377204702816406872361704080431388666118330226598178503070729088243026366043324511078631406641581821378158693607891036049881762736746429770021390242379020806818043213303084346055539373066210176590687746829845279335842016544380454427052545373244239247460904888110059941673582368553717476735230928940752296368902006e+253), SC_(5.82937400904124313771857658654680903536693350856720197044360510436432724146625327236137374195694638060678005070192195002354093373883939348211806470283647138646535187855898367405801269966834927264039465692194765127396019752349703798238500865615926967160799080598816049076671359038340777318838719564116898836145851137469267927590924905339243038208041402245255562471503050204505849726751154277069216880956460420704787838223766273541296860502599440174180577510684058169114331727826317860586971525577739562e+02)},\n                                                                                        {SC_(1.46585266113281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.48609104746852988166550018522647705856260853455374177301715633164282439984896637588038055978596733176310255097343028002745264678816222429336552569748307950057640909586383033935322202461828617942970802476309786698868245576379962838221351509934868694248666667209792725178334132469780164580670388246822408692357015442925701820016667520587984594281813978332857223100226068316157674927623979100994076151380045439611853040289281376795624912904587499703727958806542560624448511327027452622815149022017351978e+253), SC_(5.82950177742079433013113852323287507065521795992990305147571429997518635673349074209971445273450120058169771043190822032926913616385411425235494315265651701047313263489198809839157152895827724195170973899369041631236139905928083503722369681635022517818485372405300692090518030025984650759238211391642117051685100914401060570656246564140506770730511271375283962498582542827223224016319990947595147866915442402996202075580324422047466793044978422841282277400294430549734597411656134369181408603858038016e+02)},\n                                                                                        {SC_(1.46775756835937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.84093479350024209522349037525735200399151710938375792906436280512937352939991230271288779253868690916905180678243427634710216405473907465133213407395299253827011040732436337617031279249861273085543655590262979001746203284896151880852861121105932693354047959815589964574229358103147332960402886162926110737312691716589804750601943575394762647689223408215611376937519384208658146497082212655168476929852303078626676465133482117480364036078901106615139450414686138643561506637150677815761043536708533998e+253), SC_(5.83899744300274859978282451379423423153003139903429419682115526211067217784284204454321960341075305819280505490827110967586029431640699849696412280626068153034782384549707731168609841584742927512660419959069710682265957906615876532549326784199518688629872661985905703316211784089687469299852473035006646465667083047482697426908069123094829154322918776593162934167429171673112572972724119745301364963181498560877517181896682558936500142160350330340530900637773058574094384879091290912117821682712579185e+02)},\n                                                                                        {SC_(1.46929321289062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.25972461618572822230055612922428436288638626870356858399380923603218491353622285046487399928626304488542635010922555058640113039324095555488374606558086963020613198643118314604331095454798679768015009728613046497261954367491947693198652406641730873262582065619232993261055006523338213587231626658028083596400829750002285407860157932492891573013039634907981705410947701442659940919578843369126428422701136963127819556383495292877414459417857088537806034143536743700907393123798126975927264248730099929e+253), SC_(5.84665419775025846018454293347905981660681838116551024833634429221581591042649057686760451311760299022592227952902681244072633816656804158285635847122214924526185861123447212451694330096630740199026114209195974537979150411418232602107009531811786352415832054571303482321770889913203039756668385306087847467191198252379462097592058609771755564381517376889222807439984693933255798084736221051686366665615876620611297807799660411550316488115159185423785886898249882701387614515550055663747246864638134563e+02)},\n                                                                                        {SC_(1.47090454101562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.84483670615936102545753884539513053089700151357430321642648476001264799093797281289636104314979677643557260173226794005817099190456625884360973075235766052040644854663723293806762541728047652177148540154587574909357024795826527797265908403825181199585840091075653718260363939384873215253003436210696043894522919132023328399494539233266095876892342791400063712975033300088402085800545553728014319097104373943091383410109118523472799782073410829681595966515062699967298908460066524617615004730672071434e+254), SC_(5.85469004387916506343071426061154024843026943789425756614569107533609910419658917987674983489943873270431728270039707319467479857211834219922771970924193128292570478900929839859892101432983513223218658821830267297956573492472671082998962549618398660634609274923794451229705644482477414966655953057803119768913288192987981056495152214520800757780427010345884322676779043442601525338199010340209291245316113308826806834747533443924746788689222023532853101215021580220317169713595096984875178176143035440e+02)},\n                                                                                        {SC_(1.47176696777343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.83648028920450890375408717088234753371966435344750941529277703353771836887905043538823309770995894520968992077022784333505695588252812429540902403587143536426134461715372906996871253875377214202591536594401482259295743122139714002423954239526949389062163645976004215458497879102089074861778164766792510764716390746000695895639804042560511762900633439965557987547831252708309216963101367661361822428355393332980931173739539517321653508992083271558006366113171918271212852138989409090798747755632333352e+254), SC_(5.85899177569263106924767300699652497374739484436933183652120993096146245964603836676044792829372195414144408742853762436816780122889934711794856382587847949014684449384104305880256816982826103832996051439169986296760107274839845592361068806859924003412818815560219927854027159903967001985449057858529989742691061079330366875160748795349546962058672577849208549697245675650365061906972821447097300473888185772933805901670502032961608288634525713334961574899167164424470798708606253617869331779988255928e+02)},\n                                                                                        {SC_(1.47259216308593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.28111626837909252696263042706334570150067940548590417532139391797060305604428969091763573841265804254986576605459362666003642615635496092928969207031582498947220761351876404828104238250240183696488891108739699178678661133265321146586192732484736568488518426285664739142989554684468068813905182262127822740297658144899430935476957862868393662440683042929944474700452348297411520682676797379670218760318387140915310464761907001237314828093058310203895564049986922084727721696443734094289785852901837901e+254), SC_(5.86310827406445144203688054657583993102936363273189424952297552413631834722609985053314254378278748310207446818136151242606164682797345826916657255286853012983395893940851250119441549767974392299134505592331689925270770248301527806477518951483009433467007589642002331966035283593134642187675253059005749579849962487556870376008835813981269424316584261707516350709895172640167464935090292269861639386496913842514786877503500565750491455561370311951036303949218184789146422152885424080349997235152416889e+02)},\n                                                                                        {SC_(1.47732543945312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.54362793639373123432094416265996736888137468491714292282000789985508589396613607985844566402319270097276582972640593182541918284330852399871568702239357404001295099544529148712577772268395519116654494859574221748217352009970650792176486975023125084944274086603763835720220573953967212860935235158236595599580448416721335805424740350194045481697092227809938398723229137494469229561947255112949746257768707256033411199390241498757010185223502807698431815195483610943471760938529764541351535351628752948e+255), SC_(5.88672924511353091942424433079318880885850012922573636584339464289461983154784129551304969242447020741717937992853458631872358037604165601546405430052077416475250849039308527554171290877673103039816934590433186563138907391706230487722781725212669046495371394510107989850450062718078475129645196592697849849558006321114398441259570514103139218002749080521484967283524450411138666894772736176590731277705470348047425587848444981223329516677526477565567100330220816196599270891263816986664580503212239250e+02)},\n                                                                                        {SC_(1.47998046875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.71048098317977644828980598766163604643834804239003638424293920757546639295646122133400981437794828004393024873252894735372338383856622283917216982604252196343866010073253702845147668210012421852718140009968737478458712445553945785503910790073763359204541504731421482547056897334089793377437382016230893848793849694894733075162819824653467864393679870843748989771965964001927642393796131406601881107629179058475352634430970295605674474879810203113920036858186773620088307400428187435712823616818004342e+256), SC_(5.89998558414152704736089419182709588911661208437658892788029485564231230229447063180990628408020804967845164120562530985690899501561086625860220709996115117311442547000691258000214603082660863682885157950925951668935955590567805007370689102413570560556998536631933543728540270010027691291985758124452380146865650347613841274699137150345741773432893447513552177489297142928738268132428790181860863691779546263051445114611355655308330760203085861954291276326322150834747000547962230731341289744144121286e+02)},\n                                                                                        {SC_(1.49509216308593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.26492766549459710744176949193928115117754321598438310343119320191045676580968675189420007617661156542939261296099745987225078755863354110839563667043668744425058948609358004260906709325970889925907191088707121105772663315151788575333069973868685525293754663116530280872156297326431128346159111632746661903260947638287785995405943950455077043693360360235781568782919589997589170741415278870763019465302312066371383782843748428496349541592089056506114570093010525938495130879301433987324535394322494613e+259), SC_(5.97552776693421545740946098710740735472253138139586244451967343752698326895427880070452104872348601377630873548506825434017012088315458226888182590589273685874947344783897343493109440960064711914582372948120075689766311683082827805920017997842008105384156337896001006126813987542435527100292777885619211900623305492684919034378077403988460983157846543110456968849529636108500344054712109904309426907680190926820852901530481096908997041327826895250599440998178099699489686559738666854038290723255069067e+02)},\n                                                                                        {SC_(1.49563232421875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.27825223602630873274361627512830742117155119548498076574990571416917010288512787206125597410409756978883789230768419318012509861271900829027701746401255448106722258669292365176045672517781050265877854309300887480494790128083952755995096165863147573750945040358984614668698916603078624780083846786685949787832362901918896495720073819827354752981616406742282512858964235949967185400623626066466309414320198521209778351514414293262092985938911616350371409856216374730191336998574627954737343814605551048e+259), SC_(5.97823083655582873358225236747089728209331301767346327980642759114170987728554227959484379910569262522155546406143337827085106164940148816611368559836978070546163779096071370339702997310635998561710009171394831454594971516618815771915423257751073718119204758567560848974206520953216765524007162624929072219930637334585097265282923974218034213725651988607691916695425401188165449733198195495325916506347537327347259960853512807953803189877500918923040039203799914776737179504234110160844454948611311997e+02)},\n                                                                                        {SC_(1.50956970214843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.60465525387296632302040777223412285801137295434966242566431979827406216982641703452419152730310909466362257007704104578258735024185415723485793634651083057206453115389252734230743196440101353311080955820476991721044635409467613984281813863312752404936168510516706567409395543910887825386860203988192333310270304479242040849459860040455928228289441423289304062534703914943786026693435470652039505916803278936706403318022599675311646917352702002915537372277716830784963948437641693482957378711754304593e+262), SC_(6.04804362167907908711799449340682862988324735174584269347440552490720685120262642282465320593464142378877566183750451189995239367828992100557831861543740978181245519543965960414384418920503509398655384927989321398348345705816946834639388569317096449126775178535667070318627470350588227410035497599175803467870984602299283550620747335692058648613113799898670237715876790665741667924219493347770901735216997962048414104963137010150191689056808625594784062571160348584000324026469279724942240423445596914e+02)},\n                                                                                        {SC_(1.51098815917968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.37740868121943940923782966908598434861040805444391890361217606732282151467151446344178152129278528183562818398181501048547796861513091424510841917186568323060760599248596196444102768202383178532413151920793092429048100592006871124050220353521690572233254000779945066500163887121310572985767468815429794287680121952312212232567484123100591117469133902082335529064838689479643788241744787774835520116617653216737177703142547519614025479197713530663062364763432246838953596196896849927773262321378540392e+262), SC_(6.05515597829293352250331869186282967095714038368933810258159517348952534823903383028761690496742448749008246009604915295982979901952191675913429840684261303208307611147658168871516319712755190354141413776098136283649715917903242377946844124137661530355179451968619270840785385998232315036789060810897170470150717324222695890259368201594254359167673473851511202537080684624719039039211405219131785663636942283787085263364073738714983189926673210950351174624381231376099486883642661372961738191999517403e+02)},\n                                                                                        {SC_(1.51431274414062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.96909890697008352319430956223990533679861037540042697056820743986520614063546931349696576202887450564769554191015324160534353149996433631544761317481796241673928503733185483615855767778468106036648607386465626856497358048410854987136835271215789259183483181758893383060851109239266534980418966242269666667772381167764251891237110061043017446372101096137511855637503933634050738365048474775324107026991113823639696161002109910171882129548037904534819703529117468554973299827624882767407008303963501858e+263), SC_(6.07183117974659900709568910481377550761006130471519431174407355549442313397923882408151812299512903349365057172585295502250869306093719448749660506424057269810461561619496775458900178194330070164902164762869615110209864945536562021956095180200360328476917786617389143147295087680965222311692896643950690064231493658954033605908713183432166313466005434165582816796013619020790117077884427468306833560323003805738127953268606785061048548712152520436001935021736733585844867115048942065844805917752167905e+02)},\n                                                                                        {SC_(1.51649536132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.48556076450714618889441679609748084144405569440503215178135349125970286770304809843729836999236512770499832597161673194436210068911618357323646580301942325618608990512739004747019452361174409273540593191772376414524691766077405980583485713014177944994079155367629078092705631817252765451282041176276121405723187910609243399049495476854825753451412909772939398878113990705289459633430454709733094808340334753356598332546814162504030232058504815703563879778069164666853090310189833985669715581872100078e+264), SC_(6.08278256870599270038041620369942254699806564093373580791795496340915306374908983692560682611826092144539663817736052814832053871268208746537378782233857817097861595993313056246652627918137454239817226737292814972347886316235759350833107679901316473975688396316436046269089394425659980912459504832990337516083013704658381989092161407062008229358948103943028387939668832661718616320092501121653635945650399409457526705352966657410287510301508815880034346346171918512479908455755733184367026447996356354e+02)},\n                                                                                        {SC_(1.51787109375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.96309635149365794201904327560940983178987087583292973957995881805226670134047631066819192679174720736103724585079710826659233358341405683959075767980803597841250764852343519505110306739935884141856358268994355018856132590407433282779506907499609815935973453065289949682627784935518270512041597188346000227681704664812833455020100966056286928541715678725563883620821938615925204483255330142950792854481108517723976599264054524460354301622825426424009562840774759159300971426192646744565111253398303584e+264), SC_(6.08968699336713414602526015493090477822944607018035856632649717622712005718232333523088611967562313890308819921605674758028341423787568807020809895292643673026824314590681840826672040269147920944436937137475957216745232637583959533622246674618661252534585552142236096776224943793077598893061629070168295342149607222918918272486103929209622360145244381839243373138808990053179312362223124980585442928686745384707048208073046291700591208584498431108108438120399799676750797266700331902208849034288672329e+02)},\n                                                                                        {SC_(1.52357482910156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.19414319035371951885126681686728391507451976968617993457141946940047800099128053749741557987649775281529052911964163825284549824613537166467982486762647847691573300589671154870290879078628488146255288491454783153962109865269686037976255517235160004697024222671093489248877838100129107627588525527786912406671937133019820183507090421098718390553280199887567572350927461330085896179514058076806855938641750002120721101671084908269028010397276819524071562016009384006807211584183829835936522443924798817e+265), SC_(6.11832581324698856682421476020089255570418947412117703448713332472659550294230401330014763279275097287369300936961095275127975050900609048980848590046807184669360614810278941664125030147527024332413885084869661385057787713510170325339927027310394996173519769181485618755980901512378172808603838145598528189249493737257041140004336271437647952287962615066747611054118016097751091386761184191614218061761690813813876646244242841601070728057283766120787953214860112185678778531877322640463934025825634788e+02)},\n                                                                                        {SC_(1.52552612304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.38430190827876640272358129386243549342419577805544025076548664607816215859365935416703033772674947799272924727020208412219941454166360694242322301526792588993439354979417192188181881604254728582603471519386495445748060233862793838449088037480017760808293352577454866767305210099818191944871452375690792334726853720842010883848686251995478650482626671938741027088755450219295682032933689561841963371523787489791494559579399853350576714070987553523124588199318436032814962595067254515521870708217762459e+266), SC_(6.12812830711642080483306068086943581324695462016662545022159548353368465932470530397946721931705532853802522864002472247876438347984915242167601518014132995894553106883534759325478952738694474766162640219431835417473541585696375188263222650844035630297593100308284969344189619112951105308300577443461349738245559597737616942289400130428166392524405072755611863262861985827710939861281199744917406663013620531741598218403642819299337286300776430864037591565750179760736128689392750435282252531095629809e+02)},\n                                                                                        {SC_(1.53231445312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.19853650398934345238028262905078467589108413424774000359429266994114735048972543152523759196618219340188040492200313220670718607029602632313753942930122771860148516588697009269795200837958159172129921622913878329429323674793743656179283312503881154092360537038386000665064492339734469086279633540202386117547255283141000345760429844724208865010156888864760631932877276361440687954906983844598023952813414773416352160908689406230851377324978247223823998801818990247016420506271514097280795818558705053e+267), SC_(6.16224955842545105140340908015399544611842948249828336947582842101639995439450096535987873927514663479526950512107911632363178655953524781839782003918719458071690292893812991124023992862607904019678625256428677671844369414300083882332378596310039727338448033959114839571493820725718822281429023129120373115369157231627915138208944956018402374758114969161466317459211510295207658618300820365890643525465589063915499078001156874785150137986933790151122015076819042295672778054912565546410600807491382772e+02)},\n                                                                                        {SC_(1.53974853515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.76780074278093093179077751335003435299029855178154083369947188164903929246860377264245506360661701657191220269765609535133568415534508134809320214874411403245076830726314201689354251430796124512543715793671377500289487591725581197517660102362475269117585055117123468761910117441835612034268246746861427135528337884161240518527546902805713379560668415803421749472588193462392156091540352231555796947096218139708491284640607822699077133680872781774923628508886866937304851093814678777890183600355108500e+269), SC_(6.19965126271215403017510712021366614272196133950748215890193496664440720084702912033342923514042553767072934253741271169857558694435403318461257385656674984037109604838701731443587754931043252848126979346023148766693118380007816446645182060087366433357282876286234748218416545079696738538163778645857508124687377048261860514371396221853975483588314737170836353557877957131440613188955160388281733742758419553655249317836927304648300182213388615657260441211534084095859069539566978134697773348009073455e+02)},\n                                                                                        {SC_(1.58211425781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.41905086239896348381282491839379771897185719615484748594399376183631294638725793604106194253392473963987848511821170227108501056982306001885793439691444747776620790093339471878535894119479886511798977131649565302591757659652732718075522018006511933923056893034884443351517773534686087063318473844268744914880670107786649859044270623361983326455279551639443059834666747119874461905331152767490796684625738973667049066717572444323161163466159373049621887863357343606637860774828438139983364369474308638e+278), SC_(6.41348018839287515937528663300690217292169242641269273833535545067959983954082570279855214455116116521014307599950184244100234451522569719924376426131519773100596582411190833648767363905541836393355641947259296306765202933306100681947532268188660788264960200351945176267693339049070057820630930984255581143861232286985687219013462071288832683929305494241097571465187039070351078821721665679418617191464418051588057890340747874473215810395852331978691212652389338128410666105002877252132258199411921353e+02)},\n                                                                                        {SC_(1.58559936523437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.99550052059179001905047618087052158891167074036043208522944751192304423223317564193409652456384486853823068783196416096497490641765403805103177864034980205448591171368896548590422638014920850095508016829749990514583165564873581430083570845216090897761737464607629650013645123138233009088048981115428639511411446334857499823450886187025825513057708813051174298250771572337371902723390612871397812631222171792840435674388031119227665927029667744947143437810347410590573397998671863822748682487437226558e+279), SC_(6.43112135851728244832151577518868890874261871591736840900492813711272937260981853791854267260487112116153602354115614618177820318012964315081967085814740463618269219806778391839396672709343216729614874555583713388497084529668766755692269511757058637068451834450619935666616296063028337326224338283557634589604213877281681283499206040168565212750958710844300902845564997134647200181353483243386262288881272800910481220148345340443659493078541769922539860141451255636421617534360150002145383974905581059e+02)},\n                                                                                        {SC_(1.58952575683593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.45749575002857957853555787247251392344932317489868128687704808171647281998876655587490414514382493597060521184361960347107322606089761774257236647563624666199800824212854535329921053474971619491015387328608072940992432732659778216706465868820044886565854423311214163048368659265533926012298617795158206008005959480156325280037270250123559326354406112623351079523325882522236465202639425756154464864576555528569692468808578522512373987609323921567870993940411638682280384943829099732932051391051454310e+280), SC_(6.45100545761638686651800600372215700223526769838982972815445926320419354356395772765176500127870343150970450508890173727516863713430148482471146105437101662553982361557321366759916823118467896413909233359221941030341364546143707211261095608443891005474153786364695433194551440267278927778599398365606439848130583071753387964492124722897618375787120211175956720096719351004084319602720898097426811313625564854872572439650792561562152858313184163762448809162845682305559359181219245225506066190024003561e+02)},\n                                                                                        {SC_(1.59239257812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.22862065490396080936595815783721179304422380301723085078529149681564159998066536811074176656788041870497415171879636693215637170087232824230913196548481002247250416413833938409097947116817442129958633244085713487581379189469683330843071796813122560109445757783420558842487562850150352850820965894333597164729877669323266316642445991846445640305103122490315232280140496211168456781321311765115803248241210485010289340270608270479866661132306183063761907880487447838637688815206893677218520782314045730e+280), SC_(6.46552980942911504800358062860590613286828173202450526117877301633603133797016237664034141859633874249237800739784856001401838471480771995026068677889749152033164762682886208156490455299502874925871198127518811445455722526925798015726126131025721652376901377288348790808693416614341874054194319827811647488678295318940120687767685429087744751506794713078897973544728373725890665712804665479535385978369197352567104191410144990476859996576576975677999846498855954439571368927415377103155769710073481309e+02)},\n                                                                                        {SC_(1.59847656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.36078944795212988200837470943450994016744453623275544443952897986894113512338855075770653765588750083936490104513875299565557929898252596341468098881314145442925401665451028653178226026711657341497432935049664621139930599258285308976156506104667658582913014176035682466296325760112333493454219552259425977330780937756030115613998234824822612223971951156678176021163621951279219004764638397132790089457569105681911042575888913818078518962156191651319859940442019856553481232338709766250006814850549716e+282), SC_(6.49637061232092956498094258221476058136375735813875796293253122026914399571916825402878245685099062194308016451724296739317750408361825573713492039502650320495090499699573467389971156860397607748480740460909967892945967884691582095514669067593087819574760057630689967307758453437070155743108310781606333974237530844672790978266133749954683735095152760209721746051853324766997990798684274708342492240879835423221641049015071457235319166863363025758837391903390263313703309326762439109485222439510164453e+02)},\n                                                                                        {SC_(1.60179931640625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.34051939269127885656477276097440383519388042650301111400421307720922606174575032834880357676050213234880125021132471925699879026749982784166155083040564160341800664469719663532357364972922530068220654841904559280350193190760108037990900882897009293078983125865530233915775652251212611613763667450275632645902936919941385606456437646174560452904210036627499809119353944628418602265835586645641908515967631966676157509020418200087925591888423839551077928819901741882787555415029316122386662072468139756e+282), SC_(6.51322405826390839349123876351238751766856783930439539782166157927694856847057771789976515358693150393969093881533992861423028668898500172547555116858488892029306605005922566958026522157427892059969300794963134964300440083707075819173564273950660311025537130138865443821373383678588207628553435071896342684482316735742566498131117896247752334725725160609412421588523776887312295345570651580958974981502125859835842053615865627433950799866759652948414760457191192686201761190235018085076236355296877332e+02)},\n                                                                                        {SC_(1.61502685546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.05980347773323497966120277435004273533423308079724584522499949080037599291941784781378390073550540703631520064318120215243806319691436044917269744837511018194829029707470698219024598988707530554945944461571913270597475449810503261880436144734033510855408574435143972914069315928745574782371689215435224753909753976275872171923320365627701881969359270678598908805690230926245374608157469157377493190427514721842167469661578919066456394542789553635029465456133348501808026896959330234679777355716680788e+285), SC_(6.58038428873441440193931191862428216288248906600451558141839616570483487278596656975092619866222303991604977685095006184955845976669547406922887747723085530669980175407352018983133671014450245458973452154534382329053184761772521858348418079931174301771324627842954897259689514754184085458264470736429903283075388737742864048154140515120136760098909899478564725087157161612725198337716047182139456979976986375080187458770365736474855101470712634985240763744439241165083516980258983097472801187544951936e+02)},\n                                                                                        {SC_(1.62041381835937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.36834079790980282523482269789946012466399090175211485155509917681301771846876137270223862469794148354483021088443602730043485733574312669879939440611745966410063757925437229257718542088128665961243085892707960382398945712906224722521842659401623620350300411825868695076229603803212794272973022859369284750788212315287669911015570703445947931936028560393726038783441305945780191617492485884835651992436881293276681367233750887441626129756693547858477311003338312077200087346626663886240806706983987267e+286), SC_(6.60776672600870771749744775111491723636612850537520033516244586834127031644815658701981414824969516596500895806967961734639291800153470375608125767931920499576924027878384102792529629481525682088113565249702486069125339299927492794554035702928515849261917603289938204036684558636117583655482600565310139502287766754079925683880759839919115309399985454693563036020640024057977545792986085818468509375837845882801549997097616830430626053559953152747759867418786956796408250852846007511093255443619788782e+02)},\n                                                                                        {SC_(1.63141601562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.52862428955550827752854992517641264392307871605868947265519462906275422452853393831195266384771813181749165350184760305534007614175903309510037753423776568709476290716463359311238086626354285761866628705921676383159136074699676469925111833376379739262439856075778774143589364470758852330463332873897494704144625449032285292643254350828001082953176783076531870473141873476305543425977576317669168674332043063041114597546973154040959069857913374610539528380325549846638485824509291951457660702571485979e+289), SC_(6.66374767271059086286696926224725433955320203362325215410435606298042639796472525625629099373686355721812910912633484495198948284779127821989811453968043144827050126116420787803804183178917670779625165370574692094428908481816849939840836378526708581937082642684093884245707991713995884292407223471234934910321992410222257014924372253793365789509842587565048684820887290055695108769548208128275132470150646917840697775504123028786850642045170147400435774695291126069443445938915924595775689217662402254e+02)},\n                                                                                        {SC_(1.63216796875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.70822569800788098348172757651658947438132073835720205680174939719911270003501514460188981098310450300399675570161306415174646499748066146337796717130110062919430219708067477673949754613097782785094224071299867038026962330900922400248575469514462338547286298341402675112630742573072294540024127343807374910025590180171659227190137240380361901439551720008541010189371779629187129269914627029268140541879747266785160307840750581143335032571903286643423248807690093105847599560886807001954009607634948511e+289), SC_(6.66757645388985854239812538608925293971332840436628781049775363156648150720472166849068522873418642176034390588814857419703888524756192213349130234629051116553611107678393420522077947982106951875678566404475344283829734270819377227588950380957849783430909540957429632251259470023007240746813227264809333230599246903600772849635885716026888489271054253985828330029536580579052156835392800233520521248159434806163977183901465784571731805963448375547604779912192496115965581380608839983923364473599781301e+02)},\n                                                                                        {SC_(1.63977539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.78758913570498564436279168274018686505837050427343392283416394388411301663013405873399862331324774594699765776009412231789913405766278147725397313031763537161188054839339216339765472642393648094808975364514371048487920921067518965784053440747021206232341393311070785302346886583845763884137658774141669712692101642945919456052837284888672689105617262480240322054477275178721350876895687595541212753496456486601474224561729308222190835450289469551807087954983239060274280233445290978271300542860286856e+291), SC_(6.70633129921738708952032432126261159523795896373852976026399420289623831411908768280015239148652988330339328617251715315233114505905091947642040817368285846376708671892154966412170314850240206636063239270910362601895697461765861374192280695653878563780008644024544202790907675087103262136203979283389928813051494850137530649564495735509933395054430965306936221399465918252233725823177071957759551702723304774572766065580217416787574262188850851559386017484659135512976397318691947267292750474557991531e+02)},\n                                                                                        {SC_(1.64064453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.78393077860631738846677656531516746557404574688511710538639189286598140966377286942487689253321148783268898209861467131921127832837792364246363497136839470045320345471588890426652320234862484118934181794911440494994603795416436451164910031983966953719007512882068339060719850850740923910293723878151701597392475602805315235694858203655117707608412328529529363192518546910631340580510122153809424869553192555638904409657095667663923949171964870557560094438042791726423992809368105377088993234436638825e+291), SC_(6.71076125939424001220264440822656344510651821955384936028197330360096844979584227373130837182819258405516050411643439977727431007402675913432547592863192725800513717693603434710025088487238404862822027628260824633523646687014451276935543928664469750314910592934513092521007970672453768839007818102281136043321502456159581064101704481833005653393348412872436694008814452921649502779006451343808306822085986219803548863474233478432163495662888009131618941563834350825861759762277674624942475956604093242e+02)},\n                                                                                        {SC_(1.64102661132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.38252519421794678176651620442885198233073188134278302676162690020862476484310056002097750646818235832206012913571856820156184276399424324173864527736358728002033987882192640522024223476121848611401561584657748261838416135330798241957607458064467384146743894504949859477823342196450885326002466084022303172518264776649974750321805975137260446309708652197159275291889730155945862040762858422473009715337720705248086449142078753194758385277685013635073526286148734539756421197148231198289875305068009348e+291), SC_(6.71270884590703823360455528965723416044818889594032147476534185266961291226390638308950292604715886655999523873105777675869434976596775656396124505168253131518189474895853927158203661307930296743032662098934478110684706396833369064515239649393505224957843638623758306164462852953469616055357546704379612002408359336722604911197021252511455224662550728350015216998769528996043251498133911120102812311125469740697737732709152597974989518076461765853904817134723884881242504611196656335370661782971780388e+02)},\n                                                                                        {SC_(1.64164611816406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.63865423673740705997561628278349267384804474286286980915849617283014735406238447141754882435079675732191492867545542551811400246294020759845708148469609580672777397637311443824912861810016311260316860302299544297531657905691694340623642822034087504346832084748014222640613143563402265323922716182076094229662683868104383207214074588444990637044412017108023206354582642762516640671475867295273547320012214869591135305139927403735693161211251790079274589604993790245081351630304207382739053219688833560e+291), SC_(6.71586686350251215368470159030971259431928388514471415506227141631086287093152366877807325802155178189885073231658431160062162054256821720919934462387511036812980890553248234184926945353265444932648435191873951891140930160436331073750977287253483219098916730453918772956178667516990712890317169005974837192436295006958385113712326807982398649559554440941581711468700165822685825881145562652724539360894605301925826774453000678783511546112806694747051230301761302129206360576027367159792900750377151284e+02)},\n                                                                                        {SC_(1.64166137695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.67487747286202967561025535321478821581781018004457129440001698095047325439846717418223057685814856266625671211813801558279298999781112900475455476147131053613031994610549092773772509500091540711815343121528476215945182841973189881647992574210028212166263008910465645328006105030815103011817648744131542259230806915229182845844038332487186467395637692860704632290986210696202215960176890745996807927307012399814246929369315485821553804684539355008568659255565351748445656754365747112709024057267500426e+291), SC_(6.71594465014651012587848619416903939921656751397255713201701958970145777927575287092175502946780463517844846341644105994095149277332289004988636693179161505214866323304810399216194296797565465327796355908846527376690773080583226173695488553659072899492619898504247676092332124208381660956585544737401721175316248648994379758494139280888180046130120978627377202933718813194987793949349820708093735427291989705533144865651985816265759036235786480724600937355567070504364612658417148584349192729857358800e+02)},\n                                                                                        {SC_(1.64917053222656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.15285010329225273373430968083662700292106583636121539745852851956407560390437995242539753790547083830624966812118494373591849670859303409387073845105152598708676882840168805775303220764230926923181665486518553108602859451643507244964981969309237059250560781661622002944369967564967798771529062062212271498313583419728807712037275086342636226337825943145613271067451969491944136093227265664656865253877999607886855125478454456201233392914550682629606614735653765413337884052492846842204330380998673022e+293), SC_(6.75424224840962245567910427632098623323646817736188367285890347805443142240396198667560510058234890622638528769905486842972412696676063282492455396179345924248846254647755032148269705095495749014362020599175684250067999439514980120399341306255478876812371361884313661149916151109251706651270602016268724150379378374662072820935481714626932717282925050007358516463027917025075530589174688238697106746211002191708140689392703826637858170538421241325393001353062077998637540907702322499660406933012947752e+02)},\n                                                                                        {SC_(1.64958007812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.65319536179021890358145049382333830435281976288649716387402807460911116161586947193853408251417236732130649501058184538569567087572565343585706530061843151631008818521354604177536228228131631186793258042933760521081487824203182099906085838307012160654795643509433247392008736741103683927153949100832527823977536185153566278599956693204467645766479809201183815996794101234487805280525848181675655261652411269999797719541166046409442978933408601331341980404519866985562490886037982822078786991834887048e+293), SC_(6.75633196957766261204140164173751202661584030677354174567117193819483440707992236952688539610680617493971098967063610563040828071597417156462348510297346599505597363949635572561375227908713846424647047797680003440943565428730555362884464165983512671446894159736590841896962392420191655220300739643615605790124507690580350235950269888625712308198526545351195383485124912638716197578010187665756702428963564939171234619164715965311187207701242818058180821587008706756117296665807261242835332044513863129e+02)},\n                                                                                        {SC_(1.65046875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.17555580170993216069659701240356378912992532283629508571845705913462522717362476459342299823434647526608301627805222996829392989715278050548254337304191860835447150420890118299352225976520783494090484848994603407906071676197261917423463501919038473176361295741885015206021892279547608481624187132206041509044769921515746997107326694827636397817212916169808494572754962681715428029394912965808485013585570069104453759787805002258078921724715812914407284935740375752682359885419657276365053780793198045e+293), SC_(6.76086679722855771191708397439999450306821281894551407120704622814581498053592540153563322170071612682059242756078717779408763800653590684793866922368478277900521342210603896985247723482522500271075804056980596972990853713823330794276024880372537388022776895901503271856687399446739635714947052425961934459067380033976522538294558903908048066439155733093834269411373011006012463147213117608325370710502108859381836834763324284688603389368790509444037839695744988180958720272205568985303816724234833213e+02)},\n                                                                                        {SC_(1.65864318847656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.71198654144943184750018843290107155214748642382624698949739902161872942842656754449525265374194494942558191960503477935791008918425609285567416055164883442286490159629859851244912527342074022729892870584678810858772377474182282937759818649218059797976025754182392121189373588905783311623583280748873649649772391965738994489851866657747360514652992812136877725128061333112911509271001742187189078497267560018445876104975711941469367516313266602946564650830477759919167347473008896241605905507271841849e+295), SC_(6.80260283840716919832502509042538151574490775130290451318846515468402515885297990587064657182045182259858724602178000810750653645985283235507099795232915061507680911458399022596471009051249905789834764907162074610277620252248807341853026743596597019902474364403109961759022642955574015970537755433250292071638713455231231078444202330696670032761551849112267614292579432405333779451742984097732914316326299139979684964531501377727276350151667009075269493993892737931655189987717172432491652881950659820e+02)},\n                                                                                        {SC_(1.67480590820312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.05272068178205386511784986867129565139431700690883193324843979529127531088991345108621911159549101328405406249868744301171011129891859122816720129988015228742897318195774544753749719887368243690243616438207315103188176672826610305213981133436222369187297684898644446118811311953543109443245571289996684640969823226363692523159158762020317655979723103842784261035470621088900158659557289114888682171989055914834864709928482927363441001218072378755817968930356627770406788571021804899915337196183298026e+299), SC_(6.88524320743717747426305946412873491451063761422306837995230657476633136866429224850195311828901777644305608670799914868630448746408655944250193876646372123836377201358901298141627572502387176123829655220874065932883243511477052497221164013721785179052408696679151905908764966509642956239815070664817904762485357661319686401674204783082355154262851059053657303874634407634102879215830394878250445572973555622012106734928502672355568968367103567336799974156548895007883861218112682583272304941907334137e+02)},\n                                                                                        {SC_(1.68467224121093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.64639293101046850796155190551873968064250642422162086996302297566751525534935637498576953882605384394945355150898760255553686070724462813083449658836608447672312629550769492658813411336918827722880742829195220989227541165777803189015869094762976475431410543264694116917358850066414650639613572124286999278137083928761194725710089214898655908457434767312539797120634831768909275608671729329854748085293822761833755914253907341099835860459403336593325345842938801172650403260798397393915738007403785150e+301), SC_(6.93576699783692238613770969440881236385681388413122458295420580102163065013242721571083893264446621557594646851097320112750340347888497191193974162969015202492180953017035137007382532650311075824141311254133390547666485589060885283776488172835452843645016054403208785610700756800640586885428558743047322527749804102433864061198206054185432548249702189281545304988184833522937021613637662730411102892827307924710395545750912437323629462542751089608291253872668471968622443703701007458124745765608997827e+02)},\n                                                                                        {SC_(1.70346435546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.52784573256719937321087196763126998252072022120717557272934497281653463772182608866741088252761218243919316918934845290049778878130529352011261655117117770126505283054327931050824660018669742968318249435708174504249227255777895369510505125282191626146172621286457835514587036198593990107853152119034404854582337049809970684933897633515835761966471120703639677377344913658188343704863131252767277401285075868948106086062138326274092810458674313633081223773758111431804894112779900549499751299094055769e+305), SC_(7.03215820814096724114069045602758245594300463422780966977131011709797183048832264772841230684748006067721086087305547038329481770580207353734505197134907516427119328044185386106244173057426796725412716922473911942671037043039757994282938137189934979953865989306335438653929026449665946594258891769914798334902696927115545763798472099134253411550343625180228910757618121990170674216143948118762906244758278930708910592816579480588855499343168856249164683179881256711388088797350060516436755525074844177e+02)},\n                                                                                        {SC_(1.70647094726562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.18400407261817092623884721342493221669030070786214468462085156313123368684933696469695484834842677094969164083913320600436134061620158350377100572558717214935445523158591072218749200636722110926232595341196907255920103693913239831409859755751782690079908432490441755790719823383056565482777324898909969365124549273036012932725687040910925680375737952362124935280715981498805113496697333262784068140614880812539257766889387983165080074949006868879802684509211284508721523019151738739990486548840238993e+306), SC_(7.04759940432345170467607826719026371278508013997656560352655901550812712249956154426475589591818200510430864620641235235867404251478898493629948633771209940231688644243185858092179384863637695304876799723407271698619566142850592169787231666644091055427081657096909420277650971912072836361286951502398523428051627869768780125194127805912443580614191229900341326732559470621566301279171497794531779991574584099214900576211623804711965970155568719864215969415616550239480836476751932721276314438194114851e+02)},\n                                                                                        {SC_(1.72126403808593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.37803314419839203240547220202452497324318685752445985744153244189181780588321249805994317106878976746464991206446274587332772511888798973884799787270993655280859324912859408930734386451537107950981522708526430546166612505914533051504045252840419620176064196551239542237091119514195228463974579086346730002255689256052216087401329591747545732037855402711115744828993596545261030009557407696516292870874930812667638001611310499103745573666779723659028715256180754084263341535399397273234441367908635424e+309), SC_(7.12365067471177829581982502006907282449347940834206791393174900515531695591196607951693856418499691375041812455696772456761832442277130647193673176168685995062348895229045453456170865372048384226660132506863193303983837014166504982979843412660035570463010815555299936005108434039809850136863402658886559227940074287120459930170488424961077039754807088218901317099005040834828388878316535125980831265702917270736186224338561052269356846448744982083463217734038565569791005511160484138571955928144989741e+02)},\n                                                                                        {SC_(1.72562561035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.24434005665501469146063990275366040691376852763485433476755278826771360634376495809113495885460294860969620139707799020480328136110372363492141486170814672321253197311977354830033585389340203947785876084891931920959751933276093253110687801836757841171238391469250293438701855014660553145819665089536234199774469520388576040016986671996012196516238924123396926765810885462955790434567214623380897770998870500397860458299147997363127880247609464925501356994006541031300339671229318561724353094947709842e+310), SC_(7.14609790344732373472585165097640858209938953680687459805489878704805990316871532408159997314855863458036139006808306883831108350343721093713845845456692985998026225811659640952842897637632847856292549393020977277961828723808656771371587444335735312713589233789352533489498635629806694197944810456127341501347459698787839346725697268692972100305594682016405357986406882768029397614420878620259410944119346394656246734844139687628304332313024703285038356887603236561495296673953221275340416542469003548e+02)},\n                                                                                        {SC_(1.73557495117187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.77308608567355328977497699062279330067417006934286566791473444637180181976628698496832366290433601556434148275973100898450042146306548933658693829407186181216957259654132290756272977351760427619004554996908540193503079020143313436481742869840489457361191204700986527868858118553812000630716360879297829473971914949440538823393416619408529018915007406730442012630139532311098929616710390873105012637639396901671634915991122696550159731700263144227267235368489345815215154310688082177656433305713806675e+312), SC_(7.19734442271104149199189679382584649129661430050143828014867277788106105456574602593389513247616177764270211053900531751289321611213155464235296929691651945428137990944613932504984458576247916927054706126006157714935290341068498008849478302619970275768710207139076710908360544176864247408346268273175470379732636083073488820403801649872911608162203355845200743684021599833489528031246103873396572125980999508326120552136096446840493379683767532681765622085329644646664825619866496324800124154624129893e+02)},\n                                                                                        {SC_(1.73911376953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.33834663322541729732460545356563441889702196866445659629610481261341009190051957058185310112938975334274567066281071207273244691099958327012341796228793559927971962894578058019612739339935896563181046611995729282412934590809093830084408660988304452683148287437677057677619678681355822149412240240586192258405121999563816809594370622029015669890172512854078592891592989177106248016991009786947215904050276514787509073721049675876042840556462077444246058719039341377896859268060477924367985177569622342e+313), SC_(7.21558578219772119344406462546913599023928412489596302090248584098180083140318421114901339104413526765098732066810143507588252444904808600120912201364826589033647336043323616033452022844533631833758297857294555995275178423275934288103749817343091739261366027185264217687141103098127571939768410334051675141506424225988901225154593260788199587646523255694625627768886038221898450421313010782393550029171639711908221299552745353624881607115604207179645387191798678501370657158374089025175136140182881233e+02)},\n                                                                                        {SC_(1.74286987304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.62220738429536002180169416581458972793679296351576131551209553305146783313610502973203090358709851626002251792730151277210317616253799170105066796960799752836966561862432469718954968368335099347442305875349124967381601142627346806266405065913379615823527252886538759773577855729101880237968922250178896395374512784000769166702618523501106502843665144019841866146984798065498419781768522334287478244278636695425444401001449360282120309090856243389133618524733529808448678449620925885549382277348447418e+314), SC_(7.23495507004799341315262083422579594864912756717973527304991312009739567920612938602136380197664443476572621035995814823490684903304522944282616517507447476994502599741217950170965925652340366824250234374281866241176857989808513281134223867910780649780894754405821647582396309833041428154881311881889801957076083515438466027614881309944630758936098570679479155819410387366751715386155263245845290096204970711091496386104274350544268068839007744255564610396060912302929241251871411531331548143699697409e+02)},\n                                                                                        {SC_(1.75314636230468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.26118375609591224169644622260908248994130744925188982010935189519141771048865789231306446145004375062845340278176602069604493180714835104593826922550988963160326626444544019543134682470074922554983879335657568887579557071574476596602514451756562820265533209236483009386699958977364619107819918575959277263195400388060472968909222360178614223597393609076055566046019185613884387367635442154313801477288660598148250685760655854132329034923362783181472244853350033538937940785952474931874361193981415854e+316), SC_(7.28798979630953466762414521172177621176319746533840701154529949578329104525307183513096524066142937413444387224004744433803667584227546078226621568585369770242212642750827575830560736200453654961573779894041075670468264838735283062966263446614974344114945115331234976125399010861314776853121816865243326706607856301199496434007401149484742006721367828250235151345225243713379780185678075939543812799099558712163937880425393391114415284291920440092562234216236149766540365131326992925715347884128715692e+02)},\n                                                                                        {SC_(1.75579223632812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.27885166818328819447113025922545292562588253621020047775785137521449003003384446694715659457957427895119184602163391052724622215840509661374986020443738941575689800720566088137246340643942397919895120473851967269956242843670785582944836886449400140834406152797917048535992307766360746608539877091664922151992326825879497504057276199238394045694849640293625504191245096488532903891986434217570856921700781509648676231901214586152015523696528650059453165284699657041468165917311577636114077555778439371e+317), SC_(7.30165437020146438420948435914349685173252682421556550250564960189502722430464022726274889643949603075628710058633379021597881289785543650412469304081764517703544941153949826833420597716940984564633434640647099434033344397839793774998088352969448090577569793738439677171615761384407164015458625538854635690099910038692182418590926060153991285355658017711508592444459297609220521740929341652104655958540657621838237819362822235782306337730281045169155800187222790482835941898961864344146276849696035926e+02)},\n                                                                                        {SC_(1.75580322265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.28612940478838613285764710463332317119735977784659402556761765305430124022177847440250963310023783363133733518828871957259941522215671907594138285827899196204118971275960833656968130954879296527594283865196361879217344823543857451976810988633774724185794298875513154826264757434667813298807070594929198830022813725317353376466784326649142999159210350947287487223704445335185738875464598150823052675125268345804486079378477701147592320733258232747006080795302712867920514679667141363562615026018644175e+317), SC_(7.30171111725672926745064343325264521590210602159859072193006656823616585715544235079377133437855586517544623055807696715806056670018049327605401298326837784463566022252056905261917390209465196066309971658905506915382570007098459142912458591209956677955624923819834340592297187370114788270371017444058623742502981616642771211666668765579073509703225731176287597546153169187832926034425152850606162884758531236471896786252353792126653691108896668138262959904720889349343875287758845619452400548080550394e+02)},\n                                                                                        {SC_(1.76113403320312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.02052582059954444145797302575402828775472549858638258652337449838485400922264880102001814521844455168114683708960371667726418703832112346144276637968562598124383686841479497143128873664735985988820590124724286261077096817377876672490213916481451475344891177267327245111630781949950497885823371189324614090262174265890658492814142677633036388723002037813465512552328967495610585969562560071474504756484845549709521032926948580723130242602998492858040486469858058142960971542246944064913466882596468084e+318), SC_(7.32925417356873090126766966505072849653571561691207197830677583053540573453273156018521283364964897580074052206023593753088714514798211305800197017101968057977416334579947937295480183826788590173899986400332774900517429114007492485133074194706917987032098429864860936179566013841800062932162660034495594333770774589039627760147506692102845847611955819886641733597180566790679444038865854563752182451404067133604953777976266362936802468041363729385216814190500918698133834576267922051073229052550925821e+02)},\n                                                                                        {SC_(1.77847106933593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.58696581122280508600807387850237005743376257074412179943433937319007263344403598141115230539884802073681689462575305149087758412391475064495604301808348263271223884315354908696107642637077560202125740242269289984224673549616101557807088463070767797249318699493449990226377560110663908217775503481937102990324949931349055009352204913283444841909374525132390908430445632639993282928324028038125224387486559126265018738936164874835645598242054617954170411069835138779160265076149252382995279152163846018e+322), SC_(7.41894223842372120896971695467778464434331313578387272627690128660440449215113889047238223702217225270557947090642985451098640801240380307959045891016227018945670443378394918589719822433946156998371580853515191912147426719160292211000671895613613862803445071155106185976875019446446785610218985155512414067916832429521477750334205663594205036698758567202054604939201673150111781575427264391874305657184104751242830811012784344407925842826341950378798440166465260713298533266995068427063255465227026153e+02)},\n                                                                                        {SC_(1.78351074218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.15879959525624809082679521792815306888765184498698273782867804692369318651517881541192702071407855740250348027264727398432619543412091687405921105322147580569054408017841028812920951265678160001310970036202890501551977301103372311586946159880311889620316687427939259448349496566621688871543022174739664098462692687350640613201082085141267837524716787298081319950411594071268312373048165182370619115166290887445465788311960551902411784530322509886325707847543266050487191556108734271485692381261483488e+323), SC_(7.44504537361353563790256866979696561169274292979987135806329745308388622247038615109771750895615435667199178051978312738544686478079611372342783320959891416761667479320362463464749942986322801267031097886473061716886669401182112346121285586340493980406953975487653745158766969158510242023482210490058435092738749610751548647277202591688320385157186225546323039226324054576538352749998390355107047106866506799368109060505372381047569115871095389803469845630883890576681472303492255871355434543074666565e+02)},\n                                                                                        {SC_(1.78468811035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.97323090129015304829948670056950672988566620103360069132626705998662293835536886711038452025071627651801563771763546588030112847819556992749418163913209210497610564952666599516069127677852955185029576549295904060045236020947632616677386416176415724245484203451652003913968552102042443192357359181004360958300812496142078474620578952876031709400267524666591864228361642023123714935719318385228306189781016753079919543343577240226564942131538410979287582829807064989009011837262610114084216769765835356e+323), SC_(7.45114564629836903883142880025817532599406578138872604337592075410549354944472192132212648441404449070057481451608836384904734743979541319558484888772177498462069801799490721472281407471300213885149399515249974303546581956898483539540584041550633939581704471730839975216140632264213746582613956062471259638907198389238199065012906441044381052856481738411339494778087328650384450877294643292092137039394922472016400135373405269235588937963012119958064213918352154220651572397570405879668699117408907969e+02)},\n                                                                                        {SC_(1.80594543457031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.44492573802958081383009778440555292032058510782094707151923019543580063401821464124716334785896731053179360123458331378606583993775964000098336401815208295522974825046288945690021705062653504091293275971452833975396618367960024478069309509212413127761425725702401547503489770787474529254219066383550355113096780860939609783039900115962564637139830430287098957985576757675455555982636793820156920269250858351207376085243542485776765040343621160839693800231230472521909769762667442008620515985598284510e+328), SC_(7.56141925251518514505478689688640485796447031730493178069645349326447710013483810686811609186513204997637549237254227850383700627762478810404841601771875597634294163342387192816297942266390129779089956880080490305981215418622694389695990734843318143646996759429284015850651094450456909447407380010252315728731423895937408514482692709030861097258095824752689896174135887774473314084010169013475172927926134853497572921939904600357153526321244028669506193752266382070436803817234272935880029844151591958e+02)},\n                                                                                        {SC_(1.80852905273437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.35581191326195651703952631159009131166202209288184110644773817191871658084956909290526151772354562604893182774372066044894019026774162958496575146840786777221554589041308954974103286676024912475152284802713150403242992111453453965532852125999394869800429637241418660255150089818049606049236213833319573166142416880389589096192682582629845272414315172668935758251844897671074953640839529325025692840860945874824728631174619790619252734467377328565212870241811237982353501373680269895720107402908973993e+328), SC_(7.57483908247238706013191041332363564601908643116613794125755092964353166716497824310092103499993135103169507095149901801628319599303236584682978495826304804330608482550238350627808636334580088728426340266618467763937821057688921688867862910931405787908397495646924450623319568412793396037825337388790320632153923066106474780539753764469398887499551564384021577232927092899143543747409049815891732077908467663209515334893771215585650942228198967976932490033024820881898044076565536017246010995364408584e+02)},\n                                                                                        {SC_(1.81269409179687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.14656489701661666551426150826993742703922081274410062796127543291436741416644043285839056742503182205938143690550766734443196880076092121376940315826438357347225130609638172448389183666605587308926876761496114462796405389916326188916588429464036827906859598543234720421919794910927205272842738201313988559974125729824648074887940641287945470208109479143068884035443262208528622313597969142116946718196958664771847077763157230425357917362298919274465163066462902239081800604016270260980376823982142021e+329), SC_(7.59648091948415383929563715588284797443881076288302786520024431092713365745004664930550660436146448769928908595472831809952371363595290224670598516160488069055990529667027998377177998334784035362027942891905043625791394478679556663143484761342901957151016985586819836736568694434730341614326758350488828166801956142997723502122900228582567347108280898606605440082085072970396016102333986899570083167820363063830295677529090001156223115171747029172473818854569212171572792179196994366136215652618916823e+02)},\n                                                                                        {SC_(1.84813415527343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.41843670877955808033711872827583329780399673915389894157355923034275743375969872064760946768395710760692162722563875075469710924197941789203294602594587774825793719222440584479490308163057779223031655837089151369234174058028491687359332918700985100795602659545238860363893105370455875892468056366421278624267111370458213026852824427061957136527226963814492761464341676200095205112479999345378820006266530346736884330680379147863141692485839654227013136972359266657753669089433872427207379533214800380e+337), SC_(7.78101600485969496738907472044805207525845873494964135362477949625407026491453906826628363589151657958255875736182538790127842629471238109386492432595799361811851512335943586219934808061471996676226650373516302737451767234665411655782440426010602537171013317283442130255563851745571845004194270181154095416823876765996074472789789444039190622178292345613883620337241208649102987263300954055289765962798067581253424838965150554183549653035650696686335579449451123006534321368874144073115836490911334493e+02)},\n                                                                                        {SC_(1.86107971191406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.24588645855805258012942897324879359693551025583791148397292950102701617281686766503814328086357305875341025350135793052815205254026968929994762764327722507205986125049463465663080368068442225184024979846859779497746475247773819492819638571751788423232524988966985285143728729130330078587242791573411171000071289717978997020517689715808903351460826237012874920523845813327702077005195050813047381259174324216957154073715416491177024185354353075454757007413595044508278174657544345970582127120593395902e+340), SC_(7.84859365540791845126304726360573204383626822141157419885521181927814146148987783802258702151711612074539571709289812117715066864769651085625127711673559831522980738557964350467149519101662228352632669493854289808713484634507521558649057190673127264047506073184500896324426534111398334149971277991497487392753689121494358836984096649384282949073706022769719250547696523433025878899487131973471513734072806237716816347280826527526741380896550902533437911597818220723636306622155516315400521166248311628e+02)},\n                                                                                        {SC_(1.86616516113281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.03294541201222121164508235571066373185584783264026365544285628384716465880562626719738736266726777828141495974426409739234588935765141361467433423550667015484917877499377883544804718996516925708468346852692904938784521280325456051636101059721615055421494040481026399205200245425246179018984234929101419835846972996798447542294431461489105063581113226507236521567974054749433549150406332582230737081264009306236517071894593832412593632891448685791692110925076392446969911578962300476703897336493029577e+342), SC_(7.87516516148573383895913008437117610513828966119832440703410801419729919905995203130569560312667200209607419566953988839371249474128781296049846211080506555869688783852307005545043774008109290672119990141932485170760708215195471032725809083717874599366950043078590014101716420380906669405324646737674351386160400988120948057811371921198810450718411266755972013252978417746692239750259384976799876215523190205405078321354150384574306425868958987548166631464855831724406198401639410810595751844254740347e+02)},\n                                                                                        {SC_(1.86742492675781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.99542610617632270083829336594010133748126478527397353695318364326957590586862931371831347138003505744920298624845026059650548698988042330484539186721232265403150046257528675530435325490841419324373755652405896622859988688336193852997036697395398853034296732749465274555614248914342259771848251941031375144479628794105835391662479355925916761305983404615050624475473265364374847969778079357129647184824207889431920748767321883118227971829526615738983739289995284802134298758725660193990717884773544424e+342), SC_(7.88174959418554783749336757544591894036110709774223224824271344579064868592003828026157621498484293875752814384204082165481351097818052748183336645296027303005209209061594852798759520425403411485530519386155931744924285526953828255995900195550163262460071815540048668676259113309591309366995130837147227376210850285979642759356236865812895138347213488570411672545274468806756163328735520628333095309808687054148465878813916308947887628896300352054261806340245645428791616647768003659528869190971855045e+02)},\n                                                                                        {SC_(1.87030639648437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.00013208607038784543835466338998761967010060994582435872245800142579849364899223406398425097394985031400661098740065090318866868822430323441202388005446005608006873623476463388499773064032386800278206464129590252790805569332743452949382936785569119293685857945597715052293722655888762017111811753247728204663184932267529632095037738006541235846891204292490822273127166641168390072085570404761325852826928444859462432633259332523118777273482195055560452197092159658295678083252646033008268848210231458e+342), SC_(7.89681341057422191600443509329763089553014955229013084567685248103703964971131505289867916711312319142589541701440748657916415512501891816981039764710739274708136202310894049973715085007799699497369060904560679424531354387361417798792468365505471179015299281792334433454449717667296646280060976616732761157290503242591829563524923135786799501122866943534438663317498936752830952239842824149481773130008874716222086772414842575181297383717442736189388023221494878471500110380734964401070678112067262623e+02)},\n                                                                                        {SC_(1.87685546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.76616858008137000876699990128362899264750099077808394561524649985692676037977937790592025450514239974054131412512572691660341256409303095675680120482124234080094878326312900487048692083153338257185131707529228934850663620949790977014187946923664796688831909317799395684080913152026808435329557396447446787999313388110221894455392197928559696795374444133560908745392255035333820654489877927948373476790359653354159066270090908817479957743490674951339486235331068871132731338150805519376049202711418414e+344), SC_(7.93106735168582688465169890579339874633837425696831651151136001688467161621416533173038983338184935821627170059467628295716713846320010996273868218302439350332561849478557474482210296891544334948306362007816158321211010014344462659514888708752522589624332235750728579414986288165829749717073581022485744194322481455837006627579646589897632563246039454243989959497997025639911389053284993839308204536905832851427462848870120129599852959160797785476300547461620901300626983784121544915143656949964583236e+02)},\n                                                                                        {SC_(1.88215270996093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.42467714153889694379953380561564379431131421450816428693657626870690330823073434015685793654606026646868840725237891149239958998363729095730382305090229348661731733800887853031821278864445868727022694745206687061552658290371598943415470559861714972611034224402957861143266783742329199970555774575972006229341596017093248611306198067771492985679813925847529192174064672914675848858507171475009161384807053302657245394135850548068431010977818799585654853739013357822104473286990116965721350254660700988e+345), SC_(7.95879054396379679973378482359178964806729550808083202102172398711994144813660203436993954323360923769805304648731981286484173671316822747486687213741902959720838697080277644445253650041162710488291300014115594925829430019586557027606925856616083597487344500082836897264808351757451335070114522039549110269709821986159748855085382156833130765768155867203606377950946038383392551541105485904271194223359993252672237127929923238790959033497968914710044389256683014681708221426327506101622672148085636506e+02)},\n                                                                                        {SC_(1.89707763671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.10061098729146171845103394060763999173039111869217414996316018397184463923997465979877646241802478343165477206965204865000557671637745488443470810084932904929448960248627613329155428358751235612132452149828463378992857879043312157900406444836530275609942120776649576482912290726026289531385806874581786395583285742571765640725099859979760080824985930717122365163222836550887134466056635668889597323406217518903031265688225953725497191634302109076082771855000561686934307076025887960535271896230147427e+349), SC_(8.03698062923517145096601407356238933655052109507208661450767545474757083651126074300735883840980260933649776465218591362090082739406607617830823299294038457394581883065971684983480422665660829314790121754187906870584232700277230872294257937362261857567942645979635322015903634095957576764535650715493948932219173429955955558467876965951375093951186025684359116435210580219133944771499275409227130247273611229423879358118948772126612588646371176596311828580197827889472666708946315117484033375688997705e+02)},\n                                                                                        {SC_(1.89919067382812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.33281206150205146643355244324005183806916710600770049002539606130797266598648508887101464202604273500355664218606794200329997311934044022454918190419379348450843074990032218486726420914860915118079544767976077745142582899761071914741698271203297668481012082730542168912088331717987125035740327757158225679345006449049705029718293267966482166453666335604897523454714256529913015501735844676072631736531130208967443017927115114371729015366934002373254016623559400985672240038275307656801619652676325910e+349), SC_(8.04806013865469625731226447611000679262167245496904460769652369715905835763695986703351601251701757988570727443524524195737627994659580060597599021573044077777978351733520508556802089302268146543969567284533316343869097830310592017030899691608604050193595923658145675861439071686382522253131366884370301553887036168423845773140886619988282982704852197954508298827301251022649079410818467255031031955273197356096071555658682204442003474528731494644459565895341153942754125192947353015610842313374489907e+02)},\n                                                                                        {SC_(1.91928955078125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.27289443453508087332796313496350003682738987247877702104682167531747985776646817177272941355078798302379866337957633139770515724303137232998996065182019972394147390069021355552622655095550061870827136112999189820158297332123301324005137397021001172414485737522270735603972771739612699090178898122468083951398022515171566920316105159101455125487218519301407450437969176328571576165371562627156385126243702713932115976518400610198315644844874991108140646220089109776050146978223928857875353227915229230e+354), SC_(8.15356416309504951703632605332678821036309251950450806744706264953384295749461971762150742627117821781297591356770773034392144630581794397928939363698659120370639099547683959467363822618083228006061483256645067665154706984754979849976268926741454130725463009144956133345132908516372092826696894902228013387927192035071552009986450795885671353053126809139694384541973300327185242511459235969711308606184671751123423347069659907005661315426399022362349158424073363246554129112770787466603651137216967255e+02)},\n                                                                                        {SC_(1.93188293457031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.55889878026328766094254545156130405588317042176810492128458172796468478155842356815117505801707088037047728670423711838583162029118369087264171555276251957441043881320191705079482711288472361395027619329630747426689264957636149302235512356863434311160841952861854804538431864303161165529811626406063806693598450258353735003961302814786852326493110745345260159275838103326746732398298170655254923273382405156979074520081560874755475486268353634381812705834403598984084406506678245260553334473684573814e+356), SC_(8.21977765635959627162277398500133267593301883486685264727756479333262135968695319644233559348715251791924592091370385790355807059872793029080405819671585715805688457536727535203139767056986040905271994053868315155429608568913546474209396572356396955393177416138270423827458478089140014488962991931627499145418490058701846811152489764472359962840683277194310750268803254408016566449876018742044930973743436003375612625493736894351927923702238160859898822663084723609117701120883789753847500845214248469e+02)},\n                                                                                        {SC_(1.93295410156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.67944971215571230381385402915306563585512555925341189618433360925317643914586339063849824950878127104307013236717528606369305013002830865269395228459287083455488726152695484019042634677797564752625403187358632023115166262329291480761126588425506918775135337653840598704951140885230214908854073322452700218815702551486812145166297182418754255982369386423356005578336376840292343516441822924916960935383497081543119473153333071555039616888811122705286740253504233542914725625248259935386522584340786914e+357), SC_(8.22541344386344242196010914041186665024114069648439392079686386509374236995093782195927762500525996080278244596859642782539204903609411934536775255486958210094173365894420274131302499190778323370310139129238118341874739848464194746295318700707267840903671542235639039646093486808559346979742746946680311647738121918480673164670952151788931901931170626500969058896357777838597047895957396247904756825358032505977306778637196016952959821390142664626683015925603705522917454154540020938849190246465753991e+02)},\n                                                                                        {SC_(1.93365173339843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.42430992320999325679716901761938854023772539091622332595739009683583185296453026937618641790078542650510588136420582429206450065309533803404632815354443071354025676672070200124004665167411328304125532406917049457219842210795124059486692276275153480732203812336386422600148261114654394541561078007497308145487109598255499478982975895852651552441528862916255192694217792819101846844204013626833784038081286658695326076316349462736548903860361050866008078993081226997701163281219500204762767794892596876e+357), SC_(8.22908425115018214635612063581608839753092869727377752641769171700126271682157010634919061911194401641974846321342532995136621381223597874473762028259546616779927290488052272662791510845205852053685385181896515373004491784350371134410954170691566805760797284311991129687911851084775531929154515389120642223313112973162938576707970239300848871447062783020049556813912890056887529173933993178266777507443289090428976682711236479015637787419477603505854356179920892139035413965955415729946498477866915695e+02)},\n                                                                                        {SC_(1.93893859863281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.91819189255231346972453640919376279998307983396719139738029327074684903718406648892071035406912232184402454246781460374777342947874726566689788273519347374059981337799673386415870380166268204005087081995314356223242279916619304107820077355589734939140641355991069365137331766135349173014631523417771950432494431741121327321514656936780355001014804014071667361178290389171919523673427736200333219628377521586863539820047681662524056914049746933391647730196298338486438719580698910549416527666870550197e+358), SC_(8.25691093587361426148596146015464335448516746162863480735588908784004458410412322215732597244935302406218793360603341363260365762366967561002732715375638004415248735947845958581888757491890066170880837027901650846382494247398569674556139294199420669658231316358184016068129271475099041211669462789964405981626050981066329500071449503538835947208406338108358608890423336962917529958281023406696516876798696125117237126383133829669122189184734418978403466158942567146769067320497613552863389512499524647e+02)},\n                                                                                        {SC_(1.94323791503906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.76970488962810376929712442822506799150972175518577683878116032296958443013462979383862783705723933319451732313782128964350816582257723045805256908813585734565498933674642438356874957335664076760773465543393587233211955793690629039976559980811635887444090574644228158847603512451821027583991739047996027426376497589047264545707567250497900075677616374072397216443320073160717286311822549091324020863363267285990699612953867495706685176641173823310806130013816684950638847862639432820761867083234102375e+359), SC_(8.27955045104645154343667339772396766012398852624728938891426269247314828825916535991338091709610871917127552152618059111078959418678739813654847782324433429039010860986016354572906951448201401982849779257620256300672083673458788522336148882360032490933140917654256375790405976486227621750097451654002502861015346050197833419724873461666069884066971182335821194088070054899330445318502006040779689281654357901187198743041689050179676003693402625636799037068007429865185453536037619592363781121849239393e+02)},\n                                                                                        {SC_(1.94734619140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.28266491078693236079930505889482845547125001491009809232235625402138987517690582351855054785836060448042403278267915222376926897805477347534963264638197149165940664729313044058079686689562595216239200519439941356636095173846923293128637285688502209436555778780171356993813701298580954984907760437068876535565538630395134017900953276133789505432994858229051305087303614204483595430308393252393687826330879551006222003039667295919054187640462437726280375942789451161245271063078390907316847565839314824e+360), SC_(8.30119289043176032023145415575540825157882404848793759377305457075144300957586366989763766266144808590250488888413557123220202285772294434598407380388732435129545873894291516349267450447185594102826122725546904840257534379265522468101343388191836339735197247640477753997635545264763668117916622255187527053416864645189422056659465731314880919345577920810130440083391940211741342285111847682575427162628827689463093464718063411815127219312548858707951950419445994409706811518582019288596522154579663365e+02)},\n                                                                                        {SC_(1.95590576171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.99057106460726837335254951265469949180685916576201366518330799354603068060628399838542489064097378510079085281408037072910045883121492358198076636459015027497276779671608984401557195042204653074735005161488340297886584764785008674332110456414360320943571473989193828182211205085275930074217211380798304194907541431222367151522162493561287748060709536148037198505832631889595578535060602057144165742122933005877093759125801257905145570971678982661859718663150438418717880358751568903502008356204896542e+362), SC_(8.34631268024518024312544346689613320382750591087057053387033282390229282637137735596168071781685011981870157938686929605629865882581454307581180428574441174752453674660172239991452826982296362269651040153776886234755045958881356017477727650927044861068069375267920642929221008639880607020677782236494414997226184139937170443921952401765508153216046501835997059859183922145529568741476210480409142222925674751756811511184363017080292446209479500016727710625667896500980445948942011818349721058860643504e+02)},\n                                                                                        {SC_(1.96223693847656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.43702195216244192317676186541952916707280677164984247367539335125897646733564643371688025088467054700538084552068298454029647207243130902537417130476881844646448023777021200128825481774554759366020149296557917257391619382631257126596026694580951641418147336801589028646196536138781855540542155286213166573776679373512962877583322900601066141087719663449951754061391451900849479403767415140909921303521326888597157461091024327408642723617425659345878278777631423831868081457536374025602236321680929720e+363), SC_(8.37971018153910645146849876302671100355878564904416318951717625787199549501672396705587516552761922802410218356442207156678453770361108141405713396857271262666830357861273360399171376453263631906584441274908671489520394913910453124951042230924524915186708987401902202237482590481943808082252089807169702360579064304487475062819045711685267280266165519622716900432024136393172012504561691993731410474635522887745994712603442970545006793254302480947110314655556003246095545965534442886579511856764131891e+02)},\n                                                                                        {SC_(1.96529357910156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.23414726746625907416715829443063285923135397751375214247196786835977150147805051398333094509425767588802720603448824250661771073712028894382573028418813647924962558838820236674482914084626131388748080596027314470518145581837598000195509481236116156941383504916079794599291452252308226347555343874962002885311922176274513700554050956675698577966072493017611013450719805180838204308037770887975898160752634753380170589067976564495571187685622124978166758375691766853963371464468158002902770407780660821e+364), SC_(8.39584155804053375527342314852548592073567608519557016287106642711230165566655687717053998009042938360547719401225882983535419584528005800048601958350448310573668435377730089434909243345687233337830049139176062035296650344707700088006827018390690145555342736794903069214927600901587954409530290166291148031911459504898052418814831646552378457779230074298452593752843325946141864017478714236662705888608533264283668477574529443984242441013448105934470619631097589148562165995926859727144858382331478220e+02)},\n                                                                                        {SC_(1.96643371582031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.72923224783066528023999470490508731323871066602976622785745508540096202365386551203784303321602051695271454525393798393663702021330452189152643525364348428491179832354605979734097307438551875553759245401819634420173345118102522332650577040285051755723434219540758402866110654077683693779161776736404709612287605758539823190928772425476186798455690025685939558676812715159791629245093650208032886520127257083232612658307556470384463828890541787560681418149248831066612808778348525971443490467099021645e+364), SC_(8.40185983386390710192076135704248168925348509816019461214950716437392930063583844921188200852070907125874754160452731394430631464143909381175484393050377049143994089896516302461374658193216554660465413071660423551678695680241168931568491899089984666013477801897927803428918057237287299416570116019014163278726638182750233744164815802505579539237403913772926615589113727011366468082795847664443929239086651854547840693271426594036197020338831595646751390203112117358305985921089855500190951968437725493e+02)},\n                                                                                        {SC_(1.96722167968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.17162811815712510039905579380378750968977013363477307164574089945672686217834916896285190643746512384683705292466337425311341098378687575708976991373959046030667770632001217204619539714664370165651664707180686595098102100955000938827975399238685075288710103150084193213363161272046776904672378326819300464241633964472613430867162089247658631038267675808163966731109939642559650197083658534120852141303242102398391010418538136227874086480458366638310586572862462329891594946307476509088866206418732113e+365), SC_(8.40601953278302823715914437001434897326585851451377782359354514510143709016686243390171646070512716911527352890685562128158003076844244060987762076720409802934135114817072570698252972683730666344841130172039600120289262881269496545768851707723811877974915916545908409772521055981201276329797761080478859369338699323312709915881850535299304145924078421899668930260168792437487425790942434771190356780186462366325884970480894071308412938743777497960710040394397614691713396494275690128630923143299145268e+02)},\n                                                                                        {SC_(1.96733947753906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.24680353412302939200987044186417286850293617589893350518753259695986642865759373421287222175982632299577154795441851862631143002139876901717084858364499770158486495252092227254919565386732785327109256215044780609106529634459613462687775593813516048326312320737385426270219126203420114241326337895492874001558548526979886090777954237816043152378834201550716350580646477653398287071852116296228427415539474823987711273104208640332096163005959723672683387762960233431767587584060874792860272003416914396e+365), SC_(8.40664142046288586307098578012950982940920247449411400277826481575501321801418111704348374661856526660437304397102157549566140121053024750062211864903938840218438648122369834739503064495501358892588074060772910518224333146793538667621921225711706091391031039758460516782054917885054942929024053977778388080690944908154284224192422437339038235483093925120598697680748923392729193556534361289598031674492625039905995129099332457813491812192053113409382582404365282925969718342484043766758647802760115956e+02)},\n                                                                                        {SC_(1.98035827636718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.20944618702144819435296995467187386930468724356684581700886145002110052068179595371516095682909198536856567991112384692173130332074878964517612238485811376411574177290248523456198427051263118200164102678815406661467567656506974977501654206587685000986975051917619746085652602655774636443931793431285264833970762057314941793143001674101295340029715164760835449162881448034837306270367044729073839212227407984125064269561365343725931323628942684858873575347992677851552112437064971878939927095370338474e+368), SC_(8.47541476779965877146967331261162470205184650811639496892098953020372961149309349015855337368315515057751894701730812276876556836189845145602599367791449996023449498638627317430955950228073319226682424243409234031059111912399674726336202132089429275328048532277028206481590305886445426026704578735467335483762409481391451847804144090930348202740587590332496209837551411334440093728917031128888721007482363710839178563338178649459997005270530084383360495944436069819269225546530178214790217098076960726e+02)},\n                                                                                        {SC_(1.99081604003906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.05154196611778131368052401382199557096766465926000728428835404154643680644942997276429557481010925489222942138215117809515648254051601495317154853568251230860379869353011771511330847204161161617505553720745004109075949967059004326850925165650178777793787019317352912344759841467942308320150943031895570624614242670943972923281959878003072390706001341200047441157686391221897443065320844906532339478561195763020866424086276245241727980766550667862958920713461433837413986527397831351664226713597241965e+370), SC_(8.53072131433324045135738664115288434528725110990049135093018145682437475672853017129248153128449935545576341010629882140485762370819485469336716214145271708650949434239195726432153512718403315628017431744827403922372218014961101023728565208273255565761476282562651185175632833997020942688452832742021973579044699786396296838444391108919498160726021420370993213463365965357523436031775621817497533473760274140845623774172583660331569796023531177010010402871966199969403496490153557357968971053015210535e+02)},\n                                                                                        {SC_(2.00785522460937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.53038471159972860186924111793349715756121085385852614145376481107328339255980485259779959405018101696655360418689191755947524674657017388250476329778595966331400951317829495575257624387472491518924953792738723609469981049070180796177369199968029593643882570199329343672361584991491269031346325150022217340466726132508732198838832625511102240690996448510956638381866618246882695118686304361068731015207118010591091682776168392299129402985452021724002211070453057481572603019315056376226319100980238753e+374), SC_(8.62095196130873418125016483284525045912485154509044477830735224874607852988001338205640871319027331228596303029271135316155897092769288603729373918059977700494666837436131872233304113502656742361280668423481510626679892941153874337670788441279855253772338766091147270671930907305990963779495199803536426812659375897973408139926629683755551732852800906654397071001114113811621571665099139260312325320803616377742262239469791393991518027606184447445663606181436475760468080061389174559057160775011156343e+02)},\n                                                                                        {SC_(2.03620544433593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.65143321926177336947232467996576791774863489571035733142117938518314228443063319609695068414610027830548060080434930101604835199188658799113650928723242301814025419554451927694078109662141249893930843786460464504069541546299010614406284401816717867690561952611836105745932468701940915338669364306561713413455966982778774144387067156781082643925925011086395730031615235115064861012250293912515164198226271080460239215486604284946181939385689141466805797635994968497078929588417846687389792691577730734e+380), SC_(8.77140060335044127577055494658049070138166721729748863702656782677174727127369991092952837475183854737464978173384893960446682000728272207111125387872039608527919906883536583919943191418013126874991816322836075294538833451487444105140477827412747685262087345488602089706624637013863537722237351280931337789386490284036989902558931239406263531199796638196208724851070764277876570713546076655407206602946148987824269335638195963813210790234661646648909037936970322820094144140138232254395372433963069311e+02)},\n                                                                                        {SC_(2.03855895996093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.02190516077568225352925006625769365538523628156840603558487097060162209263854748755473281975434014844142353875128620627939326967887306014306593567841975974305794673393775625034015256222466339006271631437321916753648305403185715320005442147613108678785138342429363929838778398420532140590256036175166922463382586028314332781200961173923197495568775773587585961994108508539932951639399400263237162689586963349530872504448211520049356871710673258018824927017862546623151939747966842795727006527563387175e+381), SC_(8.78390807911156236890062008968273733740360663293623174807251675415458216401922658468586780495662960342131423688505153117969523401386784563568666607008655615879836550811861510100311871505084981492493286612002043747994798669566839497908664979634082652877580447007256859659711088969505950647552135137503953004816160974936508379329642382457680848803055546205261387408940928932559777105436555542613618571730409097929484613134216940807704668132154778258567706423872979441199450915680868704496734353373289086e+02)},\n                                                                                        {SC_(2.03910766601562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.04519550061459736737696825558626211223691665250321811232308723146433174599050921285969976391716404523777360036570137965100255328108197885749942363104295245545942330621004157488142377888835256713130658130164571550472724669622986351319273702053031825769243786972865591589485416694117143340366299880923018010637468713737647538773350785374916591192931922511230751706952006046325080510157215169536762010623586769684803443313468266042356424821469695707609410385516618238684812406808168846511558277107504019e+381), SC_(8.78682450311499051705542102592143118531464615073289156275066153608370358980222641854492981697674528230101291949307734557180060219454820905694456625689724158172140191643995631874525516525964315497694017087967969027105037882250779700520278683484866631872791334506197300413024318593614287224835750497851676302698486912204695007325920451209278716499735030880447806516573294488944828862942226613073642614916490317760996816663830852551421666590960790381387398019264063659239790743222793037962387391917471807e+02)},\n                                                                                        {SC_(2.03945922851562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.87634721420954868320679653396114437042797966640215747114814071292289514679853882420646854333855197669992927145949226440228009068993307726183454975241035328495990463229458605531815349338574874766725546349252526987364072603433578464644703708086973292823936348527413486888173464373298370552283873612506673258171504812993846323225727635777480955133000542387209144433299517186846646032597009982879026954143521098194295817794343273803342274669737273522964476315749430970397810057312143838352903550803963141e+381), SC_(8.78869316848635865143705643570197031402749418119277577772373571777805369195793831867246853876788118380995747830273464810506001333081217540381068885832190844262238438283495357151351813640671486210362169134855621015167660782116400314538798219104763178489465671624454099440552345100590695406473366022421278064064777579668657428993389295582732632068184617079283710640876524667533433223814282991264379338658963728389786465106889424249508756823593288506817598320716914455174905100482212261967621947480780031e+02)},\n                                                                                        {SC_(2.04086120605468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.02743657195879596579356190191020540408517748360270772233350187132670368236338558148167947525604182688475307188027154317033127421930022710052512496367214724389204196539529278449587030030071334484516910605002720685471497496454225026002000088826887804231343927284827136523745689320502914776168715156276916400103517192211219702918695741499683669398591603530163539160629662306406208651611461245313107509259596231005682295955767659457243885582231566582253548170137735315226168787241756908838842743163884014e+382), SC_(8.79614572458754574487438084636445918791782946842598909064854843208039568073600862520039360823565124413533980668580492765234600905746526338468204183418828691587116410169624716899406947165866336582654910638119433469897081100329916618234408915291410360063773879765417623721979377686242861657844602397296898607881848910938512269919531855497922480486653311811248022415772798189471108662611248217274101824539210415244984642003166779616904774288957798423352212268246728380419647160759388686249794821839653989e+02)},\n                                                                                        {SC_(2.04121948242187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.24300648889160775733156586874062402559880556987666128229130787172756384784591504451441176261124778809418081011389957060502911823758697326486324714485420170234982599627159886305816768959504352423650548150553867255926100740917589751743614355742742796617781398611941865255290481457719969272244034198714901317545133168652235430290963725159487045543230285846840648066637514719963010582145585871619341209078028214449667054492759133440212044242066816817432964032357664607423807704341673445484291179983839334e+382), SC_(8.79805038556587630088052582151663919186057969932038946354936203032542340040647864004571291189699384354853888743320567469513593659764584967248393176840575903449023484713535440893208588715116801335911625550485476748157992061702657729396726975122868327645712946965506515046914095427151197705491743892127434492500407518742269514547233097954118003716030823344006660649172687005451703658129727846843123665183503658207565304927556441448742317093787870842638508179717650449751055242144586848607768594191187785e+02)},\n                                                                                        {SC_(2.04407836914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.68365143880375845489319696652162824419026790969168725995329854655816619705820353945636910161396447037807847037756979314462525154016702465684852901928273210651067121172463361882515619106014927366661810456400762814084404469237973116680959859782414407726318096421007506245996957000966110130380693389724470385756009610930429325363910814020733925930697199275272434532716117892373776833014261671955960474795544134737715622412344108541340921131232780280256722975350906058098810706636246354999685034963041210e+382), SC_(8.81325099408857538719794037035613437585330054911093644104793245532145037979386327754393840465268689839637222786988346357245198697929909954219639641082423160327772397840576132377955217119504442031191931892682663926226123518747306212014000292170698456264499561629303488314450881147875974120370442892524806700056609702761641793604570902194608296577922136353429253927677170144185836055583240855022684942918042987756630226015309720119954418802506551096807114871722371865431716271845514419922818181405815712e+02)},\n                                                                                        {SC_(2.06032592773437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.23368879335110617450934014357551697493657637474750402501378696069424612949874139215426421109377131362806210449292180891107227994521619424226713921190507536619922840775083365490639223115181808038134372928082158899059483109948141228058173117784469588559176802113041862627892225932364914852130808947901721381017612761142108749416421802877905190165205282158232272203222263626744097879711745143341899642657615393256170649098208261844829863453807824232217972322816131557985205787917544846401804813255278063e+386), SC_(8.89971469422588303597539528396622584243324889172625081448644041395296435706027612236208502571830144856012771670106672337663679837867361312253255450766285701723474070953793205635315484023113670266674530208759732278650290931173916353216486938355910583143339377937586940163939654903232983739892854298177296720683838065873111881527094988924866455176404496696390392291939407913753835567327579675847802887023575896004603081072015135418794160903940531376215756221420891521350465939446212626450156221583224751e+02)},\n                                                                                        {SC_(2.06764343261718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.59483281653793315561944849491802753020517966058457834599780385791671309293006610807112421309007905050950708789029138545321974655614863962614239181289168476368664535037569185913694830534730728853128435738757853396683057364465292937222014085357698132392172515202262764185474647295951255624356377355691744757242649686269646903714536328284782282648025847981449792419786729583440047926271659335029157708036514607118390950018053776103450511487946355391507820701395254860917250728802107678105122194718873445e+388), SC_(8.93869784995215228079262806213738653881194522856027295897307425852239282637371470148992469867322294921829416199244009443917810535291845239126405513404505664264493747643656415802763765640860015275765519501138818763052060049394196697019463988785845282941765893749713246179491764073184207605917045290155137796640590841319138893337388811668060775160471777135759511154718236748314424006758454477250378392325844747846932379992953121602403336808218538896786533378978074484136844477003890524066532376562323754e+02)},\n                                                                                        {SC_(2.08448547363281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.26956997938305885861270864992569317634696139234148998025052858279502266314939306211788246505386860720649744516018360473714556008139121829799827022035868102039512241534804171999884878913117696687586248399361631767844908110955487436936381731764811563311551284602425568721570345459759673678971708239163298380331804714768570771197967809270274107792567445801651493571921093538794581945762275991206448239582552434644965640465065190533877901669057295857711633075061271687035424879272346906130060539747433414e+392), SC_(9.02852034697887876184918228950307567210157592557628151025878255337311450794208100108693081194904407586026536627544727891728278559040733771924029921633852777257177574015107284060027121116620982034943842773463671886324211820337774514949846112830989530858641312660736060185766468954284247723301832207041135655922293339773387672759884091687157381626403232630411978395212902188251538779356595094788517395195404838946369098118091514912829187878056761189665514528987389683561188583781930796488958328412937449e+02)},\n                                                                                        {SC_(2.08569824218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.42541719631346857740870277123179694855803129369299265326895905117967064807970012871120517886376749763782710626876870377672885481093313635938710880192105923620214145310044069994382837658433882697811138471623758415092742862226258875051288635177471107853802211075144303628595023516284959320296001584682085142450298713660175675155635096967704984503105572988443502595645997778786490670016943194988355931481999406719595726362875431386156523099995500516289629399041523024905061365248583663524451744477756744e+392), SC_(9.03499360002975113924127787536975190922985805978380321920413767449345974971555113483633012467505182901649928641087356563730045483247025979178309582017111611644841654759797798030326903242899411834831296715164979209026986975291691071332970132134487130379536819919131162781313226791607387767232186193852256361885239373630809541065907197501412901447388849582877366354207566569900259450804692461959120325998443885169459378332602861106681620963700297035545476682004214466892696013597953569975032135397171122e+02)},\n                                                                                        {SC_(2.09722961425781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.14652962119388337892013198073640426716305639367752450241471157249056697505893988153810906568815287379831847592053103240079064792147382117734220104623639114546077700130343551655313649169898489163601042726543497312643959127651877930806732890695009786746063931039887597666210573903294917932796306597253333085308243638049175288306507188385750785364337778307356251935315465638257026383080982013309191395360760465390522476476099715466350718635666319205450199842162724646763547637750632154397143992784357779e+395), SC_(9.09657851391821905248288764942882685538513662571951847769716820430912247756470790243746847239095124383815835596479449815020582004140189922425425031283620580448587760886237528677796437754229866945169284624748190052228864075627322818027343673920476666737417622900906394272502941687757361119603036594805014745950910910766067489773955786771882150998423994134709516232251226515884926278851453839221094787787299099979419856861589551046877849171884303782275573517477294988870970492657537365745908068261007786e+02)},\n                                                                                        {SC_(2.11732238769531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.32488995415917438816245506428540358528324936567957143982831760674606946553953675306132781410037004231238081814752827196659137560785635734654175140548044178318241202722028415001529397684081678940287843275647485327417144964558775590245040343274449146902150499177838113830792660215510801705128411775966433381848395099119531574166093829984257362521690140511511932481075474797419275766050042684668062221317275299543262897442477780881557903915077596028239618806682006388663897431306500641386797547090183402e+399), SC_(9.20403844150120573323313707815163443305546205415320067571623368824100327033250751194469692254021552989334996367488215687821238397209667497882194615770114336746522799261295558491608201716982716372159403627607969448999723588810214131748191646851044970099179978571661008211099865472127499633991481335788001559856818151278413515253321351692025407909474976822663022532537882785669403146380015988041682400534853239853536212974739476804510190882624962978418547837129921262021934860580164989519390697310987195e+02)},\n                                                                                        {SC_(2.11813781738281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.23920584189995024108264108441382174581265804453062813967748668597256409290502974917476137156027471780465593434860013512747119492613173661960754556516160997019902325555815105747419678983913395074928383644967234257838183275035853032575137406106812515112775604805291988413086204754420780480482944199551206347499915580094617570264013697766220815619765354642349849162021960389633159121121537405157741736547422517058981713142157673633132258072330362954492601218997356894597490305064009353895881811467528561e+399), SC_(9.20840356065490710629576533428590541960450394297627230852765543314970889049841936678028766187208171546118935983075741374781610923342056839795507928070462593379515984217461275459087034547009064859148045673345196450051882002584567424351090318723867657323371007389165943407650641784608783008011565278189110651932558434081396504135177794283020561431248025981650863165353138893231401452644608333762367635388942206349013882190654054847660235612322249540146064263351496142260634350041205519501124636723775814e+02)},\n                                                                                        {SC_(2.12196411132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.39177662229322494124400957157877266131759608311298891642771411182793190826802351307904756477752153520542052784335006734247061055811432642361807977517652673301861483775140119806808771082039441626362631376343659659259724670152753868639146792172739645425843863887789097252286610659867762024588898509234394082610149512719267651794857006628731896773297856599527322125493409497626506094744204938092978787264219579269340061828050172923677638031779966934938174431159781840598119005880074140411916588471617699e+400), SC_(9.22889049459021859963844572074804274810255113529432769562876841607210895116188455115957990182798402004805192186945959965271951508181947270887520970853459793601922584925181225502649594599989457877321892851918600713516779891126827964426645459261970900590176714052451499186326997576594703757359296902179990814537930932453088854601105941403417430440813446008398651849554675102641358597989457375238027473273539076645380290336618043735613466626624312870277349273591291273756709478496959113455072539143305755e+02)},\n                                                                                        {SC_(2.12809448242187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.70512269115220480595268166531904352330325624791948180356089462647029563967816377152402283553934239754650685522277228585644625963178763461985634087453147507811114399074328277274871421586591394470785652958672442638959834135704467870560725728677870824130990742889477006591329988329388252117288312122037798898578732201281267232366839955064613395628426573109236844150466518272035619875710123316478993314102668129146726093936227472690943052588213409821894956523229315194926353771521764680619545709887817943e+402), SC_(9.26172844451372937297926641784026202226359104984280333952452698885319219565673961992023323224824423511104995712127009602644669134107563593608952662089744340116726101916009626869561136587812837161535913728799259903703727068947653269625719104535040738855813391398842607276573678116770071684704510986375303525438747263213742506177441195801004222400449169302691102086787469350020060636281148117220895253291232844645330875483628172902837608000610315770524202905690307051891801412619078193501905572034002345e+02)},\n                                                                                        {SC_(2.13211120605468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.46757388372185984470723464446322922520183834526808381421853345527729862197466784520531881476984910825668844631053249610923109221356654860758105186026559709364720075771750848026506049938609344217127328450666317508274299208718967512572523857314530499456913380346599284157285384253800783853573460804014106723636223147893218665477293263747636187504707811864236779539466966344221910542064312863330245248401392068608381940688389800794655272596581525021764637668020427619801544130878801457932266803401126351e+403), SC_(9.28325403094712022905598205400455323055353530786950080627140655188919001736244506717145898286392584993526261227225187308817678445652981064028338940693732605499844328250378404504032801390611492495535948165817111599938819106674036675419413622056749577970342306044846614268964535244852796128757731498526010730421997711673126579581404924185429868241464395745125993928809118163995543079031650433152888784038925239661975011510989611970619998749887105771762365404895381271943917487402653324189249409463846641e+02)},\n                                                                                        {SC_(2.13364746093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.34373636673456515296919127535191349632336915520195642625772798041190709635888287621532647756849280277825279470057062295411472781513494370848467106435282040187692494937120102034139142619940710853591531853439352790300953682922617662188819031965947625065863054332620699152572706061943024843245116280442577774550493173481350989515591331175723347933472804804944111576288065111769983720113685823120396444568406922629079525399967352647863168336447128021465823501879806831619694844779171382781822922998053554e+403), SC_(9.29148881331016017438125891638080018212014292291882679200529590547832304567407184326223596084425686214714986231588578418364950582497062496719725055467621486059207426245249948470330830748203915880625660889547495905324917365284070816415130302032930680680252804195125764041781628393891986449221487360280303514405425381004316480855668602480555837000785595641306828033161731966902155019310529405380690397905678939260016915664078410971970917323430108482202101652422307680513973343390934691531297189839502532e+02)},\n                                                                                        {SC_(2.14830200195312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.67256447103681992846665737465294479491140557774185558872013991039590161112369580714072727841283114508955245900514838567232530868287689391415360537590686186225366934252607935247607692237346114245242774424129283338340912041906662429742425125240009819454762156263777660340458616775163645203995076874546913465866349507299464269295035492256383237480660937794824870054357393117651593429044017691555159483432555695143676377015861696977994120698081180348729405390282086626734066030673935465537077598305453239e+406), SC_(9.37009712289378842213245428465041698856992514328464053226043507751660011378242955958537701246499474225157792429164668281669766339089933519712342433044104352438802390003954164786043052732709712887759343850099543229121919148743349015236565174499458768840714570982081983359924063622231967320469161737290134596059170102423626835685274301055229984712904852868506882233227515878771133801217376494008126432210768898874172265567661444147476568067640099341375806348321302084885963327830251527427616849254350135e+02)},\n                                                                                        {SC_(2.15540954589843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.93991463103998582508864641373133455993632200375224943316978153990730700500580676570675580332397708737392566106200582630296676076963410931095795527671663270455401657747794956074481851286974281894455637980542990782893623962858174859461455913030832156689089788975914341450201015860706012141198241713678732571053326601754180580960420864052353806627676310639654186640023411135528917463407588301019747092967850951436456169284007412270791270032275595170510385886649947458883486800967500632080903173844770573e+408), SC_(9.40825876997397008740718169214925643060875275548222289998742615738079297965310296955213902079748169062362180776611609854642597913581075536671101595288562142531062838748454788405429106350414603053873057156949021832956250130658872272459660462427620450295305163412757457868538197514318433979409599826544160519202163256722145459662877575886036629112345562998069314389977867119630192926097630038593688114768725813003158582062941123230020345569797063986524813578534555280438704685674231877543576332403270414e+02)},\n                                                                                        {SC_(2.16148010253906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.02761164835737043084807688662982235295777402691450027760392125197765084121360363895533987597347665898329212674880045433838292058354372919265719061656496013942233619026372895194066349296316449636901727288893036841080969920325396632762110173782177020121048106259133814286713353927137592191667824123460144201495829975242846828791563849339438304174284054860162700849003726441589259832270740699580715686148930618642761973796145981388202692077394044849938524291558363091884290919708442513674511550926076281e+410), SC_(9.44087125449245711324964718946725681457002336914752574180784239638434433261740800047457412285421527739426007490956073668290440888907971364923388038040450732089944005676999616837820395081350030038496820411175501226325416439012012639956746285359687856473985067886496244826541064809091026376980560986751749414294696656832283119146443798309622104504720249141829018011514452990348444644465660497127844197454738129306900700398593715891507484937243549709163813988358176635278586847951067591864723111535477351e+02)},\n                                                                                        {SC_(2.17751647949218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.71340431902980835164335762423796436589350350994112072792214738778171203445804164385827969148741478094345925443517347585398501485275407615052525430631963625272970012243841764505731807160622434242814926609466029554521200878574772064056066191281139040442996313225215610751861014869425131528374201938817253066289322132814870942103612911565436241843076514450662026381379893050798719891485183818071811866241701550929831958739365446580273602092936503287791306216378458193675383838809219151103509123255372719e+413), SC_(9.52710458455532851639835038314274498315501215972186403352633860676830029596511878259042607143610127654269615956561600687026648259713548317015317491308191242589764804560361554674638220491591125291771773450012254396706789934186147695605406351507279987276034693925307478989988590092811812125547153934467943528044658158593754520696564958600221972799287132297833915406135313395274815580885467254946870813493050228383823536128439205576179147313077810206988166108614044790010236487489930124166546064473549957e+02)},\n                                                                                        {SC_(2.17996276855468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.13129500255707554886187229224041029570439843428214949849750749289110808805580745649778011757392626156241212375807672383606350701411093419389329072918916690387617121971808387005444726650118614438177892597923777144475441198065916783025549180707754824947115518137804797505530079865767199027459482498132114402357141514190576112432658808706859356016385344296231307583552925520220825752250868253480428489603000088048811727519686862608174999989841133390163636881843124682131906236849947330360998589351275932e+414), SC_(9.54026958276930974866786096141207963510282075001695469937993340186571568033819367507207164283465612989883214252153840271538745727411741340941936973021138044583077867913221099816951460103304251072253130282104096476901804295595445398612503617233278249893386418928541879740516087726527713391095610568463469714881207313741822503837317080715513456908612015665137670050918852863930126689754402414644453087641534274015853384313199006755428261671268771821369799195329141474499040909625923167287288193032767468e+02)},\n                                                                                        {SC_(2.18086364746093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.46120886422198941176094565575390812993189258240032436842291399903280612691688652521870878527411710319300698338694421827954188059292239416312662344872700594786171809674906839067133898297628838922466623645844692894938719602118558356459692453197914358007351504121151247775914823469065212526339572116621919216307184829717978344011587528068285933875015100214000034281094016309023687824022775549044837455472135657518561532701164785646073041437250541734988572021839186113899968419781789080825966314766700177e+414), SC_(9.54511846410307733251478184151031185470650344379357342194903088885043748304808102474721353322145851967969909882852629598772106818143242169713973570162748400391527590736783952516021674346424346695243891102949590560370125670826511627581419464773259152047995920975025631442461827775898809830765756159112646326941479379822520206359643932720929005125311846665376636941324258967860355646167667192500862151802186073700285051544222028803022755686276279585674275472612395003821390017772949708340236625234425802e+02)},\n                                                                                        {SC_(2.19099243164062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.09071930058065094245496319664562079255113717209322093772282679444434716466956464796164355537437727770395916936090089222269857365904491254434491886613216692899763966723796954897077521599069572976393753967872106853704538521707960767461481109695537844833766405175885863084650797321337117740541494754684924323503689333664902370956616686323068718959819891317808053871021590598898886639150602749066550286528769125273871409829351057665814458916856560858710544725729239093678663812676906572427729021491622629e+416), SC_(9.59966116324950043746301709963886971173831924283030056135285332150318203910375393754829005925237839246362956635937850997084452898728509824631662233781434620254166767701503446197158574058973097735744336770318186188140114226228467845615371087013275863580849872474235589291638866795385179012628162745789967452025085267379843525230250236013744901475887783526155418739875702778215599395528922818903720738270928962981417436322007321679355490548225012657646778859092051749324834977768226582942177799276045298e+02)},\n                                                                                        {SC_(2.19516723632812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.67216493641861127200347874593268548852871630014439491996415942153041279169939215226786289608201574099535056715694493811607068238231977670634179134346828638451975784269428952823639868956518158969899741178173624038340036622210995694040562605609640541379819676667055398583577325757720629491760060193629917614248605708364923842454874386649419671196031172536225218287227111727331444795912064143719455965084302879758776249864782510178230962921527551419863483412763214285412435238701301451587284214422959027e+417), SC_(9.62215582614357532310365557514395430405854343037631613350602404229592578489000436551166861196041340959495358591462809081116701912519772088841336574357932955630083399041573213058463639369361474426677033552083021945300370663512156930050060513380077707234067794031787103666219708483240598363402453795766043089918862235084819248988939566391713717315237704138262667981769953433014526496440651921710535828221477319464253494644824502787848819415584580250951534583483743174553704596403923369793145884604935673e+02)},\n                                                                                        {SC_(2.19839599609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.37225262707653599653711820353653368292680290042107795549543404450780137995523706257804503588565958265869776422803632286865381333971621580552331042799330399101696279128476684207611968345079835995478386717231086868243199147991189871036918425963831786775382615471035894407844699339741980446582699428550700582217520064182861690291820982938724766185631708141908124286316108280281877499048113512908636162667218747555743344743604076941394277313545374002161667560157713395176545044218642696366437819531115511e+418), SC_(9.63955847223110394389235188267594151754178263699692568317118224904285492248096519957597228717653697302640838284224914466477592933601842476833335001277142296514298191054813024974274015115796967229697533859387415349662239171113229864194230362265528950878253332746404383153621089118565361402590964161957454757890195465653219164433010495228501515210512455114814368619339456463159405016390172376212479239322861777452059833092527450275756275707164090803503172966635432501972444647459835011754132543899603307e+02)},\n                                                                                        {SC_(2.22194152832031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.44032262608550903495313976799133886799784197233300486553579224143139553556903624847272076638683768869182459088497481696864297358176383077206958717371353195626849363634979562388962900196036505994767657151750053872585306731106654031487654476647650490389914137506090547371635054136426031331557935145186181680785227757429381582799637850482743930250676439331282867061521315230528320974946749702544505202089729180048458611922316602433935948057076340296214322219855529445898709037420674549154600925080195186e+424), SC_(9.76660946563861461010555925889706895360385538452085228187365134459129072316048007335210857837073714751949133642119138372463788350876624727611896669144379940278862508740728225845604447214346311748388259690873822504933818638163147527164300015506928962779800561757700302703442709568409699620760279637023257711205079507638886106134958413968769285382076583440779626281186698103523780565709021574174683410071972089151302751651383839417241632895323701238879559639015569483986970278258480871461589314159669816e+02)},\n                                                                                        {SC_(2.22939697265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.08849830973041339619849880512102258659074015280580181393991109576992015581662038243987459065078898344272399234338807738087565779427641206083387416195456743446844871142780652716783168821917540569775408453731306985285441321115385277438949024832826976239397688820496083049738921276781967448246722442890080168118915151920065301832844367889918254972881511288400418949545608225939548707327204644504068161350836494885138311797731928010526811385937592008345913431320343569291455112217156672641566365009515952e+425), SC_(9.80689107613285059372449543550941420674648369472249828292039754905949142785885007770608892965223885788218745303191118820562691049784660812981229074467947219978885790974253085975473979245632650898788050611589900236206312674843146926926150180087286686402864383874423569723340689835577614487709179170935290493976265256414011971563116125012799652588343350374269900762013290925378701590996729109220525818658456551614163163684491861419634548913453936895204775165372577278837736236627731759811990947945526936e+02)},\n                                                                                        {SC_(2.23407836914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.01602641534508128258400950214145374273797050846114242001541284534710542653468207980277399224254098852725750690198614880760636523422915547928831404849495996000800662060445653094965254896675145872932515875338797873448295793020068388660061422362203221153377753128756862647837950009432931683964156189410099104121422217337910185538855320473202311427440306769046317038713811978861575226628070299860658425341993205144141972983264782324488774088125826150530755860120210612244114406558912323853971223086644010e+427), SC_(9.83219734056631214805740645496463436211234524505475410535688867450764188677391013597688715887121794422458254521169369713888832262737552174083801113013767124185581343793696319245352755705382851443269006016905678997236882801656715922216129337829606757125264740764759978132666643390537700039675539669842383538569378954333738842591219063945023136668912312923376846665554737447746308715250063238132804164257172352296735140656470915973499582649443599854482390659748267654064813035319225549619002213427784655e+02)},\n                                                                                        {SC_(2.24445434570312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.78203048568578072314975630454129358346597694541867298893268295779312349054115177672961752672090492075729789657087236710851458584409026307715710927531034401281441924823997316505754573561665960838553695186511836116480885300334679016038360405175553662098718417729786579266610185124858219903683024216696158482042037421212370278799528122475509331400384923037092383967020328871785652646339928895909225242591274145726260123768031085217523259780112767159003400904397427387971098997527816604561062545863704335e+429), SC_(9.88832185946077240684590517478819780451128112923953742197222968510336607120384493918723015029894932108493866736441041810700846073361088322303145991164121421652517067040902640800035159265763957018969027518089773608899386328021870308066455195615844063301159614500153922927325923223988512665683867898919540046161912743964469037869808287195463032769869290415963361601589546267939286944320876254302657257848836043740477654481942655172138948629613157341147387125279557708891527067521340447109438205641733816e+02)},\n                                                                                        {SC_(2.24982299804687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.08570283125744064071408282635378045401241969592156449443996702190835211221986071541294572366818302356541415307755599912973777296065104685126082161106964718360429925262611433859308223046970504685711082907721101589244124275919321272422197307590333345019716462006909782814102785758541341122309780507203078354967106364356788841452814123987602419979869619346935389886649067301781214220457407095330324474516181076545625866257383290602306079211952881872730447864137788597132669824574184100276125868082219937e+430), SC_(9.91738023223958938884009881065376131555309354725573064026172975476434338082532225486389254099218688500604631715941744807852624165530818749931061431911641159805284509729542885397058261027663314979484823063801479848319523581382232395800774141541503586885701947271915541461771489709321299408954375923542489570905202242397918325319450667664823098951604276868695957185084867227098618625300782013524000820771445825352767851760490231492154993825757921566047222920601727369887072890583913275870276765300881030e+02)},\n                                                                                        {SC_(2.25380126953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.38397630910989982662319897199822355262622941453933148710342334376170037992638646776455752933851589205088581764884554455093887374427845996862764155987352260193822834547176833268670139068679454516574156176879380637561952215681621594852800964810550559095376156580039180603265458146069909847122696205550963305048559966181875267238018292624066290913132691198433801575590704690978934726613364622856743753227525638991659655514117533570607962282000337241256209304615437910334310799421201705149490460361728658e+431), SC_(9.93892131226120893153528265293455417907692711084056105978330316980314148928761315406931894573674925248184025226781657554740201804246189163054722625736294660437392216588384258232617470370960400836719517748314210351406062703736702358115503393330157503550095174818446533875843065828393830314607111282496509861162829462009002548666854888549395427924117314763624845814073318211354521205215981882366525078448830967768959248245541473022064203770291966690333874553467437510022252495283474042268962476720672426e+02)},\n                                                                                        {SC_(2.26118713378906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.39614876650223645360231263473938174402863061383726780064920286322497017588994204480739132264037264067830696295448505052236002652817040227065685829006607407498600502402755802165890384784931203281144550189885342738249756625413223643747714766123370215076755139577913640129626581145595398520375687222484506015632658050093276378770995676010787061717176679192524772406173203270747997823823211655490660005386706548628900207447034920309691242233987394832471599241410916931507071430774418976862458606819343979e+433), SC_(9.97893208034272649735921917255308552717947660761572427906739477910025590562822234904801165366667272410617176406496096031979017585449995098746666193751751704798263175479551023650896948478300341855305364337500163511693100633296716081183263040654911725476599269115441947739032989735343050527770531009113636674631594133928375474154120689814396987658381155565472240695156861646528035166405447476890042313942613111801777675893964149206639663651050740370795921499376283922886501627029955337875033089310146943e+02)},\n                                                                                        {SC_(2.26405944824218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.13646636560202198632099891680664160012426117926474512793298011866742557967962503462851801678601440639983785150487411359283183879485770055012521243949999488042088058632091504968760071183881899500499054311870097656885020207776773626582838277407992323550059821879498980927970797870285566527105997224181161537398731430198676368582299493467653124665022798275826974277968868235120389957641081271455676439859708153575229872144232451572457106486921328919966629955489765456656814600779054117312431766562222639e+434), SC_(9.99449854128569500985805506445224310036677709286609573497683142955997164920503198575362404784244157536065579835245612214355555848464975016855355135639594467073790826784810797346580125716082966056623799334363918073005591302070871916300341151412762306056300680129128167620210199680205983088439519866540199283793059342411449554638506634701866889380956798891517235822626677959487715208563502387089202510551655001223006521405112790658935808977694335832575278466549610236022748058733733330424726585197232068e+02)},\n                                                                                        {SC_(2.26736938476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.83592163442986797248261489827130287085214191461912713722871756512942719246912971920116111414598328800132195109536860912151859983913755051117782302428690879733698225536153593512948050079777922978491605603344718815607149738566040626516318819520326219556183342036942846830134480193107978612564899303586610863384541017906185443789857663780749213169459547627352946245307698991614237316373854125626280241550114161410589975426301226433861910160177253027795524092422080333128793772423986098232596794075720037e+434), SC_(1.00124412166094487150595607398578415184286075429840017750669615166514802670126613942281835373480712693905021482183819887959841186834703214515453967087624374969833838207138357757837601033364944274819528877945665683525023273696360579781024258580591977130803459724731797835879337586908909375561106910629402837014768640173780750180259831466071739462689187458769415107681151656878301679976405020325744495319201309535234547402820679715200331411569575355353298139875377051054506410704721362118338961805382021e+03)},\n                                                                                        {SC_(2.27160034179687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.77914060211452242008899666386083052076020460649670826869818173953950212848789384309231914463302618136703805838586907800270236441286674518912496507264566775291438162369972641724026905411157420461870414122134915381812750034680648205729906304181318950476533785406078983075377792445976966054236115099984421563591803655093310255335344650795645446758018267005460249434136721239530111153839530584353444102391832796692819618881695984016557439167054304360445240739814704554363517548086200274977304840926256782e+435), SC_(1.00353836579147773636635420989355151208877209533358027678391798050842251076882091526102297723237485323576782054389490788244017367562953521735552232493327071868269081949601477850110684984476768380792623135825977210171083924553780077721841064428303318039606573944924108276012682456299563494701219941692589092680383521323267997227110599698236865458718055683583909203116080409976568849041895018154553004514259189900384004033906605321463098090087570613086042469005894541726984587197472413799479116601460397e+03)},\n                                                                                        {SC_(2.27251037597656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.11052867640829454453052291025757960658413543076952380042287916481944028497762444930919833577206505780772868134575482029270280362186487431352723467266851681046659447223730372445397889620596241932010006197386489151164784203310997758817817055876031118766037758710082090563667423346596804851090856128402325164481953294532643117595074818777042264904054121835977363273899344512211175338061641165997292239896036240484605727372545714312692538576299824378621263658983340845164815186123901327436453302450869458e+436), SC_(1.00403193673239295480477602366256121497447077097801182886245727507501880605751496118687196108313777798222668608408777849907357167617461301895673631721072702260667937113872649674371034709014227852308008223979686762780850903215454691388012863664666009490326014487795233371894668135247672648098633958365917296030831908135942177892329974801305128955359313699712818720289855093981017725188789621063984596937521427893485891583226885884185091476361258699871312799317001155755187769395027893412340304105745269e+03)},\n                                                                                        {SC_(2.27322021484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.63207709849931145871225054785721944060815270545810286089969977505335444573747764291754041567166168909984072499145929255553424803538289854369237713214437709292943536625316190051590509936147341227297889304702762825425433706691825011136068978815653313674255578440420644981144821240708594519845304995263875525581279668909987253339379751496898564952924913409885321685682484389724063805788629863604220917361441950073224320500683681966042090169252647631221869593021473584674311386142486001635907899170124315e+436), SC_(1.00441695404255749750833880843462991068907929587087287878830426780880302332327714066072448615165393695871343789747137099406763660160104408198664809359011139454093806868551932276540681709449766166108503346103751510689832411644488747795814493189289661475279548402061482242873616752441433094303098293394131241740743619715423845997549566048204364866262963318775358123150746620392638753760626010116854941994154786213978711089846362617537172516298750146205786559079059329703118874760423940968396267966798642e+03)},\n                                                                                        {SC_(2.28519348144531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.08301840514189880876105210433783730639445773641182813223476146240835132021036070768294989734279876868032148176204430975964088580242578610006274265663450361300155589203181147268538497466525568540177608315212855086785138118570465995366767699292934688282954532312338409594488220264594071958730820220669923128699007881170366835399803417557837301229914738094613784511607844164593733785050701172328912361185164073841579818636273938874589893074550582456915009413640915720313394235265549792227627841020848477e+439), SC_(1.01091460778685136004594973927358453027859253753186731137911366590667427721315216232368931551505274753105674204239182489324570562749892472525571235183751396474083708267602945752573711840268943129444049648503759340713860061917873014164073083341241519446029558416362438957682096199098251924631292725493699838897788658879378577003254305027825024933576706871276335595370704597547489230084515007724277840276175819764288903099904535675324716935973817635743016407309828330516258501329064021982787683819888812e+03)},\n                                                                                        {SC_(2.28726379394531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.33311688436756978135668900335799951782243083616744817272925412955790668828317289227333073159665410631743395710535180479105886706961342153682055846567446435932423241258460541837360220120837128133247256439424960526881892320363971573205921128491823460172368940613044457808104439560822060067943968490555424906442156565842835604649144097998443821698985872242788369101897121425359453111909831864464469144725496144503959245794020497640252299205666690229453072788621622430551750598503005751988610263971997854e+439), SC_(1.01203876369191391397537008272298388839527230538744183935448891596555756547106702370936403620577459612149080321626505005366386360474333663515629660404711227146888706650007392058871800825243571188452543934339499169951444698418581119928502493208009552933987567068494616176046415894456738453361351153810609329242330485851335454872873720161453739661096346027323557368554037728986429472462030061075682473358814842217702848228898236042470500021601695060248893896909101571407451236019000869189944883935762699e+03)},\n                                                                                        {SC_(2.28879394531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.65135831041580457776340074210651301162320945447995180897277995994680734216778722114489069796347279351480307803271876171024271448087524642981828536415645430827293276149505557939771406156152035527595413645846904431772492351262479410618119850502260548624885759325692799584044895196359964192470904833213445823262693397368765103870015980883032125896055872150860625736736260444796414464113416970335338021601052071391183889674329406648074533875855540014866492877314882973740174337174058595492036012717678505e+439), SC_(1.01286973901338023465149992260320944767495589451801280341721538674674441760940754891147866157152411375926525316233491535111651170380037233859621103603550695028573602272014224950651686839677320052003641472720756972039317929410042788153661183364726698710636237441430816782807753757609306725639743186114505078794658557227065759866527822826913600964425065939668093305689092805427641579077236082387589576411551620192019239049409819646908724890732828334201726317266119543502185385568991048651259506849007710e+03)},\n                                                                                        {SC_(2.29125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.90465795226708556790017669054239224462354429269807487381265966667017548765980723649772797382681027572603162976838938370170818237436251860652000037925826387023967525363791818075226631289162523946339656863465465820726410948453526025835878642915007697195245134620901070936241116545725978462566856005447431730237110518337994080935190293503851444586655133879016012999954639820851270960695432912124491366367196157476373186099072824237976487832801731815070844012065376523608002168148316258296433811753560174e+440), SC_(1.01420375655626517600958716349442133696717847574624546733629537985043871004732049302197607467630694092273058397712207234971393351833901802132958468701652523758663869773292490943710352570936196911816199608025632640693494045837106848016856502024921906420277735092593879433821241801222686972382213994884914975264111441264758851183858195504386844166071843621593620204626779873388818501911290288524863961605511499951632415876373557694746845507515525976867337733345722471269029243915715912551704102811046404e+03)},\n                                                                                        {SC_(2.29655029296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.17328599445677156474744540820672325827503902812352631148115214513265962946517542218220056919226266740807495223944787036752065838381374165589386700202040486455853880580142280010396819876123508311556392119531308643280503500980721984340724405123823704600058529878829235661139836755072061244752119337251084892224874879871419347360822727614012404366318296169076312194398681835033319653763984038215775766958241930120997208201748781040464994071186937000864444561568396233212623345228013137366118153649313251e+441), SC_(1.01708353408586320663465879346567561866010735047926971925795156991006351710901470860348123425169599299760458061388919004414254993007807681385496615676672852523516793999597100430287717602574910173941843661595774649577160012203239954479676817977334225778909099418980035309822175188813783777412355264521912530281017758596993478482210024846748055051573736813430251129741166161559839975886738148624765554334431976307623445065727959659503883665121342481570996531822289700354917381018516576773110305371468487e+03)},\n                                                                                        {SC_(2.32175109863281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.65028582385747551520996069756490353867743417593138571380490769388198987629714626296717715502866244782857681499028028475966556243813924992217605596798478864360143613600787394349911423257211984469664092217739322955802659803209876171687228289703460196056997651405936184394307129898685842057522879290243672155415398832788162325527224706012592857285492726653693130611300664114986254955950091041390482149622138175561231786819467645864963718337261068245278972211328859600961728760606130535906275048832376807e+447), SC_(1.03079246525354486785673682028102788701570905025091920733312422678260569871283511540662885611428562553382152173385583541472628763740119308880655804360319412568333270266189931465893739996002495397527674848101768381622086371938982695825882518212690735322634868055443393525803981229436585770457381365370767557747687842528234581064046150197526489643411458761621755269420572575103889832653490580441691448344796702085985589530834547695229366221918548114968201850198772489098827165857762773352153090225566242e+03)},\n                                                                                        {SC_(2.32473083496093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.35632196482493355248130028476518084667696749878269651171129987099594161236188668987303893295652773972100940879650315989615357005753818087230776696435556405376646870974208936505050108433686460126934829629832266043277453245618620153658714594999035580638727376349710271139659258631431162309088695421077519683884996781795612158187985021119102710380411466638652939872592904181488713684921194827217543223340998110582417974894678896740301600117909599159858363961332219051654706587914484217666688850895098639e+448), SC_(1.03241522357518101737393444391104667102143933628627242178063950059276131574433741373715815692875410742508921901250325766774810623614541705119801498495850448015805077412141164707534647750526939066262688702273524609882263513152715082933872606914620239186161457724986127994417630566256744226848866841314795309971119412070383482707935638126112511003037623452910434306386212485147768519672214373803566820343635071623058580807115864223399827223937207577555928000842687046934803211548105541783448023956266920e+03)},\n                                                                                        {SC_(2.32713806152343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.74386328860427139708480522709140156717097295238476263352838905519290853840258687894960348430780392594627170267325386390740490356736554197674894265704099376693689575412504395343274323240660516375703433770729029172958494455848327317377274733684576258763684332319067909261279776488142490370393200561272767820315367346887415877595167559105371975031179734689134061166583608754876775899393186872700984916001642565912685865206349436098463417611566800620904270839696975574154553405606752106422399839471109019e+448), SC_(1.03372647377720390505312461302837813352314109798958416942286520193263268408295070236735892983497373290409609004357017411946557572785522222817843942888562928412052126206322203596191617395362584494214019632663234183527699317139696442854387213730216677280623624507835715064537863198524758711783705028814304816908466887716821972886975156198102878057331998713435430259154109378891515830322267984193884445950766698658585746179858080102463878140826893562429018204866535312097414306336382208063617202539585253e+03)},\n                                                                                        {SC_(2.33669311523437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.59652230251173342436961689893479071619890832051987682509430642695276639519037742307108764387197561352113017685797688723166487965840386571091728724735963038772103347150810040789916987763976893849742303987555945731072512633613678628685805045698461098106633571091993892970939086933041705624680677838363464668332065912230077706640741447662546088952351730357285599551928479725877541554519897435934938643911703341693287057929274991084144152156871690324637742054897371502532209347255792736638275100784415339e+451), SC_(1.03893370464301812430270273797465443931621589838138001868725539378103245226106211699547624384358779493645877870879950332808476711355159714356127393403248642378213421767795909018688531166529087150824647243498932574293297756523173218892933728579129063958816615693509083598387560219923842940734042656483848413017749736555970446860201572396326629555598835608823615041170198622695968531218784313159597703450018676131370651500498024234738652202512810860093984188364583869338612575330092237235704879515985780e+03)},\n                                                                                        {SC_(2.33750122070312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.48035542212848748580951456739669118165445155466209970167021107325238198610828827210753611656639746672855622622667573120453801965123116766927533289960343425914807596098189017999233446379611107483123125002084704957184911538582340318168891322148345728809670306031039007532257405968346271664750720477702330999158462667072184270366540303796364834639970791998331915172645614748307729400559386201499163395160431824570064384505391923680439672678391435111828269975380391543551347248276222927047295055329529459e+451), SC_(1.03937427880559721723875271010291664425000712272482747010822303195021385976486936800202960953254150118444336648337138094881785710635932423121552387592325915868032769800362005114311906889861521595924019898210225487486479112793560138223985653696658590301672094662632204539014073516959870013264928770396089685081806702343716357072165714374724696550546140945549149812149654680894376153939404835299018702833912826918021395290784058715404305726774458550537666719274443149307309115195305385504288343493217405e+03)},\n                                                                                        {SC_(2.33906799316406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.82801456973999587757205068171942105132180207403568346005866809810735339470733094874377357719203049772673579622321393451563161678435517446669340532686518850474088637061106219503285743890806502286639271864279715100124758920673787054001880755387713460017747265822416656434785819729290755654738067799648133741584907451376231156918405325219771194528968390017849768174019273636367620581094554885412491341496431636058342972195907296418628288471085357048655824569086171978507955092816797735495096425887045867e+451), SC_(1.04022855332859982408415144993024946041011174818687099670272097532904899371291592732450041149667552397760967946814300639448342297729566374160248868428177893306089505241287932322584962371867294002552574092352499399398200413445291454849585896947462797919655765101601678062637862099177449092271828482862475406588574579284971566927994676631802988559874214856462747454011848999818038586875775249135149599695650058521244907805686249923896277154594123193736501988709962120662283636690634118624488957543817233e+03)},\n                                                                                        {SC_(2.34068176269531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.40508904242176682116449042514135192129185300516161322566680256906472959720494286731283494975892497776007252984366508092626976683330922807310355867436972081605252190723925418279096272760501795732507173163164226107284022502985421438594469900518824723328937339071511396435506323052491106349230840389684572851957126303924608861311893978012477014999461407617992098219307561041406770984279722844805194001040505486287039050952359443948230834932944819759102109332164838256559450378885359575054433390911366005e+452), SC_(1.04110856270947538101194381180739614501940831547553767910940055080764751365700737334039050520215368295438790839219465634568043357435916437266102639570485279489511205375723738730632840611542004733804093586005982880832704926103737948659000585902591150081724989400373774302479939421280720081357450134541122020935778145630254133929893066156597291486410214481515034569493052557427604557399163276974463797716814061123342134677116493289934436571462786251114054111021383881194629007725260193971237581972192174e+03)},\n                                                                                        {SC_(2.34075561523437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.46283464171658205673359342187410672824004419696515224137643249493846938374856642233113123504627716101170415495851268629054747411466819072270070335549797785600841880439114525219359795424265817003049954995965790925720619329988435174252153574355193851582031598361707197363444624391173683034448011338759118721330089135315122899534041971055957544421727740563680746798981962962211569590141183476376982177149866375324652933807007761242518507116163066356104492152803643962684824082870010205524536918328580171e+452), SC_(1.04114883812210734373940955716284135535623863254266114994072198399097755575973112137291926747756853106433221244035373782860063705460590431606919373103448643022775888364716485397546859370263675645459152133303174900268442665963271610916778572102610236059216548063098273915034356448502824687565506462661829466649709679761032614191470441920400028363524714808970146412806337881027809064218517206502148220953690841519561424003781360750298388718689647519476416924274628377934089876068772673154382308558782929e+03)},\n                                                                                        {SC_(2.34572753906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.20287125067750718079139615179556149905970705737477202140352950933804030796805778020319006806841535937503813753291900950161423130809793829384216797437008137559874967689299880219915847099302300568176588815959888493888204101039844802309440835065942104357220354489196452767916876269412368577518051395695112924365267720945507718005081347987857139692854851937255638787567714405483457942262895187880023159499253905348472908693377988626310754506957615323282981674782173709961832035743109581366596396000766294e+453), SC_(1.04386080874969036801593481122975719273903962696565461185917306643059214852434892615191390663512848662213942068030645143498132360982781771748445235081671909769892554624777006591416892897140518753063119446522392570255162598160952720607925871933199089741106434900914023889219286870930878075220379877321240091849202182599462305189382108479682374213663824792934325082794309818350885816900788616869147146420656414455017195270502741847894234589091567320551824439360401139416133453177107485446208463479050486e+03)},\n                                                                                        {SC_(2.37662170410156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.69588476604507350672186752288406627352400913055078408716981871368266246503967469530145974326225125508563872740428116310193834547520347257459038069974561536565731880187322224898653241935568316418632480975662809938034805555067221097564206199023693639788694315721481233294887573640242872312656226893068072414074658464079012129365543673872125822028793450086559970478442297078731733678192698753342197922850083792015244154406863318827061756727188665453791424919024617357701152260593008876378756394918182591e+460), SC_(1.06073582932073893986121819132589284880939121012423411497232498336652819995603546229215616017202919646806970309001181138023501723142882120433469844760382028981120858943613690873484190846929999212626727030228784547105807868110135666964008269575152557091851566554910308685442302810215072724949067920772200007993045157033316185171310625916442647714396076525031888938766630589031942049654503222125110862347322527744114218543156807945012208393754490691843363809339185569868911466295843368629487487889402498e+03)},\n                                                                                        {SC_(2.38079223632812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.59618044933309459771629537051242306454762477378097715480746577819101505814658760309888699851098124052209552820566129110212081322845191298552461829550023703174727923743890160470567654429821301562819348623836912643125949963952210046866434314885865951794015597027784975902536269974801800646224158739856412737924320313251888837608711617918676184826892515703635752955459512440883646941733927187229956342309875581212455839337808308072959797715711242383447998902505463971959849866808546389345361739978148640e+461), SC_(1.06301695349172781050151628847925561848956764577879967408325982564471939300851272454355600376827087190085627857129662149802055163055954305615719876834754528451285422367660868078171385746539282909272333651366917086823990743687477160421950231251969903877847305883867076189241054568971406032066273149639388192117482419647664014896025094675648822702834273747775461229178334364634670554889108199859490580553973780787630501279613967857482286537056883544715806462908099785746924126543990393689028100842174351e+03)},\n                                                                                        {SC_(2.38192504882812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.54168175499587073092180520329596804386627391353583263303094023552062376906891760719594234021057259873797695304492667084786828702680774484454771280201969339152006349027913918717203732359785155603647121841894949902238491358184724862469635770671456804740751709698752857245792952692958167870994067809785211732890734268168709749038686040288695548119573734834741760173346998233828155997415833994468018251961981546305932305862226556095018502477012950304314448062794909916360185543437247645207888756894409452e+461), SC_(1.06363668578548250370401252795936678658214146587153696818905389730130100860689831859941425445709214080634074200123610199460512146443301473506822773406672518644428697261299923967031368142897366971037645480512136567654306928245502642527004354203279461009930460943985372427662669531902550869079353228012359246056102213119930261765576845040554072006843098564543925310860540263267292346640960068014576001822334179811230372937424239438270029449033270833514558013170547162234276094554904595124327979610941509e+03)},\n                                                                                        {SC_(2.38285339355468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.41947397118963617314788755637586490746572454896226633465996020682987607134116483944555498871433225886651689753038477214838858830924218287124058678338088845707104523190503118871654384066197536681461587863450246542829770363263752298596106123095264963271487497185615800319192434155689153810124072113606953587678619118880329327789427979226603186706909941800117908967798427102472909347910366348048511801362295937601258427254711672197893257522736007583671610268498109326859949487563742610128940397491404627e+462), SC_(1.06414459932340718276254844964333733628424778769854642604502015112233072895843496897918274954904315525586616858168575274984910607132443555116623755233506606519200681838174906410790930968684240895745920089002586394197780631346567289638285171542182710036292522114470875839929401810311049350175156819473410738085571871318604415503971285224403504307872198848550092379662069161420116644278008128925165473851538013617353485002911131744330044949423016346344021720680788560292311324809522043915399725265728324e+03)},\n                                                                                        {SC_(2.38449401855468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.48333243944963938460038807628141680728652734242529983503196330107541018884896450269605270390685584045655111474349716665525756455157228888420764079214622095351932293058358702487712129858146589484049191998982061154465391651183192758265896560986975716447245342173644905863227919374482325681486395452150979168995874742224678343035536509001689835933775231898125270451120359615025467375314240659842248179191424322340144486882212653879874824857998197970605647601340495582227310086890254878271533695497507739e+462), SC_(1.06504230239637445500298548527712035599468363901053595843355694420491932752355611922392711324983151830694953190991236781942290030167076003666068983448224125112026026878175583966767564651513079392543162633558750079682061004604189175557534332986159799336667203377326498544563418228880869684058092464801983814894605687842967973700886156083327625053249107724146269370745876324992302075515562943166197597611951013752623883206038944955327246574301159911619035590717538790504354839278215090028669496218534029e+03)},\n                                                                                        {SC_(2.38559936523437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.37808122622815690500382267097878998873202671046685442784653396143337081057678608592570706493795126392154927007242948720112233181282793401430241937762280269319616797793204397897342957969475363038861577365168816366186542910958418588343939458983916773058239394873634780101047648471639661133358367997072954234292874405452406442527742981415599511950363089879771273194175468368996547944675734246440049985436493390523580066715602232978855450894692366833322734647102955879936879358004621519562816859069515295e+462), SC_(1.06564718026713188221300788798449318822386679631115909377592931542906431858443887400466029853170073638998929438697252698045097914305821507053489106299600238825989467141308357331920923828067422437132050446933445112950337443966605895270715896592560696475023878200116408756694204603869619127754904399915317031123993372253026740340221408263993749904164694045691921290237886562504789443179794622354363137328640326923815192768951334256414041600152528128088087812324405144604755280874532774575173403318420753e+03)},\n                                                                                        {SC_(2.39183959960937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.94157018887591895950029163728542793408946464139919208038107596863950722829441714083687636831777205813943883550816030552801676734236213942895231828469129488622190497512267498271372734241655353912289454638756834374374740631824662038440983160832828030547695516846994352199521056353737210131359309268596607489388660329143892165771782457572052944971170530662041681201911170697773201968537217365556169086636229957736037640824751108191430402054974991617792017930927543457126672995400808153693341383139898148e+464), SC_(1.06906298017065378187624790057379699574796094882022841748096997547654221159280120433080931509570527773265455753615325241837047249118641673960630966615848418340752374143544479778090743970295675195405833906591135259210501834917009914510024819940224593740504234476226622913641163692720187046117873687162625839022250044219018455743460108004115584706068872740730671027285122112651489320726745685030709857806650888240277344461191044900007279644812364318130783611173853977564915916670449232336680399309889414e+03)},\n                                                                                        {SC_(2.39209228515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.22965588149176883677863436479347098063601506501294581637058486148016429580333788360596199882034574406089046769560689512266958213931179921606214321680718550951158855557957094326401752253776584557021167933373387712139887740399608783535560620660096719919824306142998877127015458350195419957755176242812438880991357564055101611623996309791634738184143468611268765004238420546231730459736500027048766350921461164883247715400680111387616331134653839260533648842805141528698080347847425781597398144335571563e+464), SC_(1.06920133040956932226651899178831678378140063433170676105014975945535835531405946008301947191931154283279937892805815878840500827407033937362784027376567479936168124084428424328261317700025320702773878722368275520967951607263987933289394925217533657502754403110018320534942256277449623683686242687413845378907563655096714280883155894121127292810659928737508254622349637428782210263617211919915908614228230382968923053572998522118132816608706708627636419368172498179970755512087436811012149223971377463e+03)},\n                                                                                        {SC_(2.39378540039062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.63461988291952864225994067623663602191421327597184383451593828942053451036098732081069702342147329484498920045745203495636876406301906416282879041998359071240498847876047529634489148845103143353711308005345854350554588069697178872742298481923486516611580575893701853113756883215781067314459664603185439939406635958863126359602153526548719951600913660229816848135080377548870406128893804528813003597117460481870901522422075896578188379937723866873740431915974855618157536225920117943597334847302564141e+464), SC_(1.07012841283800635992785085347866970292486590032130157366223234903895565008124948668497341853672145239612551790060801697773393448723730849842221849579781107959912327731829701690060569384960762377536715585087054264030414008181119739550864608854224105461145376575130378766987896347272444288202711970819139827870250265726164033985118120510088470517424190734753160523791757655570320711553538529532632710323455541625836267351628637177586702164245514362606014356078092189507993727668374723826453086374155996e+03)},\n                                                                                        {SC_(2.39431701660156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.53867396055322384129488232914025466188733497440373309517782486252619714850055327886426163035942208648761914295268988414701140621233303500790934211370387150788422923163636573186379979212363616183424959345205487229424384610002076834560948561388655982398490920750422073502897509440493515594482913466768255709119088614235011109277824002899721078891354881570180887656136781796818978947996209377914569460272454332454285370991748870572228060060041931960790276358333034863606274148834677200061164484295656059e+464), SC_(1.07041952944848996153966139952161324243402102800025817767865351094156118687619512914777365124438179958233790277907704609382961053311705648107838598705922738898163544660259876911789437818363539705971834315028801352529692294264318469332665195632021693961971710539840417816448269562414199398721368148461849281061565916133828035768483888489411615317067220311570705191413775042769486971819422724652702511400307292805331026316524511907073492287921935165853618049207613131972229451073764106459363046787272503e+03)},\n                                                                                        {SC_(2.39895935058593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.58440069574079716863433060415505614425792248695001054992436506568573113361125617741080505710931160666409722196210637188289065615828244553129407501359478447712041394737835258206432064680815129181252982191388623689880594520289907379084328244975909228808102020617705819715028591028118727415404627093200583505632221692729880520334396644629277404801609762698874425982020764961452953719532853730335255304997584681802933253940534795961862116737078259312797829485848148571463243429545578162327677104015515565e+465), SC_(1.07296220509155140696716639581772093443397169965248974483583558174561895960246006152036011174855607317424444646458479054017625998172108308784726950437696587884083420633054006725507519193234049878235365252890579007317444947764342402651632392374748434493152421235557911829580866197001662654431022160815169996960631290372264226239871320023503509919344917855854505406637219896990913152625013444888676907600213797217131259342505913976105952930314479063896644806082096327414637850854373415228519407865099881e+03)},\n                                                                                        {SC_(2.40020507812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.89649718823757400947167077951524460612069569170739924724478610986732054323059049262923936813149857907497991855749115111878553506221462619402833669969186745939146292893351855560996206348889234697487247736688065215920183119411587096419492463789431413669866205678827121112834670698528339566703335928736010958579198829210799654271653874426161996240008947274247261840057377563969157907695123562519093760418451461130854445770752457104931476613410969555068176588469297715515682723988571301019697022594755022e+466), SC_(1.07364466193476492876048551186409738209718738939823728933265735592193249748264877423649331159224627769568207469326271675026368568981774365739915670977530786589394179892817758554208471773608660303919743206731677900514557860817700174377917327700708102074241147868175251517696915049733738343976041728213374667557859050052690033795640638198300864515996594190759430675768272167972727147768409289191063817268205945021688787296404871571373323909155379268103635818844505904906792747070913714314112647577333736e+03)},\n                                                                                        {SC_(2.40084106445312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.68706908771978335145497419201912653536187825194632165097535475236043557963394839721753084536758345053166882212041647215258832448890646214678813646720700127049153399120304804010492928609325462753341521395961276075108926892547430670637418756699791756760154525651030946861164426897455385903178144514861564395708716016677570811111393049951411930208514784749684637435303949385791283747922569494190899010361625748543158605603674370587879035558450407372816503889721792634688945585092930934850557005438807571e+466), SC_(1.07399310437637022175109953153717158598200508200904978208154121260195712977818631630399426900935494427055182178831447866580572567666402697210381738873289388801029502443567662530529953826539856260050700863085564336238016716473024729408356315992034242075238725117312587052039295391048223523442893809549368471091203199129016405567321764782914135350134185126956493237959734804979980145189650215070941282217344679667446108200314884374982363709898760314475456934985597330611568458113984623669918181477657987e+03)},\n                                                                                        {SC_(2.40304382324218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.98379988506134624584554293334006336606012627483173202720669294973690522713177572304694168707406459949265446296998524208404118368290574191567674982097225782245774472717772301332839290622449213487957133087081371198820760622009175357226333728469053391393594151723725413393165786757688131591819097892066077471548298873438325286259403547733777757557043157082065170520140890862301741934782938334333655220921264911228452327010059985166234876779995082414050249291987696141757234529516760139908801481820438505e+466), SC_(1.07520007627782088915699782436285610523850329573383010502659256504687146794475230751227924325397645047272966798126089063310217233507974534484903004997977998846583427673313053049155047015927396972049401157366091216975271099104410337759717590406992188545244291039380522665894882052910674838461833212054822745374761053352047785361998416755664325629469623911698927841249593338616032755404386053212921119186176417863756983455435697681313949377015100023267612639725960334287334440649672025282453011894560158e+03)},\n                                                                                        {SC_(2.40633422851562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.45290092042270445706517858930954637018954861402108015335284684055533927622287154200369961358224881777399919496725636111525501793489963554569357513118841555869298121393870373678648941324687066893744420374340782981187062658105519368480418752139670355836763277753264552537051454640625911426204994028440408335864444968153088577987893525530695952106855218936088906142519508504535683925692481951242397994049231261957594013192808172290903678160977523000903153149699180047354975260330636608241188832667886421e+467), SC_(1.07700338617426092420360655683716370212100133442920853289554025092105866912032736305524287446942059072340620021122365533451797645705244497213533406333520330179422087477559452722248664993453801786833333880483084927178665861563694223691008298833686527978073987250036184318995019552859242072556251140856415592470963477089808590333932257259883227893181351600907893750933195213601957847584706772825115751509214042479687855350206986519218828193282538913435834812781923710324558728724992140653135621151349700e+03)},\n                                                                                        {SC_(2.42259277343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.06707965192344925371397162677896126512940865619524129198376053988071802950580636283161794425288502687836199115252604893527108859386980457600123251661302638968303028713365990799614128517496070368248188936690962021477710113555433623851096004137323921602196764658884601624485472038476539713360000969691552206945021805180549572063814803795836062197874173167505741970459775467999898703289143705817813987926303613057191482659889247680992631658979651851183933690304882341055519698514924982134819974861166383e+471), SC_(1.08592050401186205305252227049854467788866453779727410303235344162755799044942609850759917574063726343195369264571026200029028628699209231711416326192355880978026178354859205411431114281881443861063554264800970587426003157325191648520032701335226655222568148716679403189124880924430337315763108072787361940805568429792360106874877423673351221648739934357265010905545355759831504459830408833514863990027273655666672328214627403178141279175713758688160126348434179960959539992578045180669891977474097155e+03)},\n                                                                                        {SC_(2.42452636718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.17534614298037142345039474072794647497696754990376840434889758566740309615393859325760700422185944264975187274276221678251846445901506717347325794617383677193930292635564569314924664137782285504547373926526116494078927577102932296955833885396703315241135402451011484656540839764812005017172176813565178956625429875575085260669148326865639709897615495636453077647582700380316251931590038135524676132572718248271200457090571287293949181387998377665436576329144820250885118600935732031232959452642149807e+472), SC_(1.08698172658717316748670683364759355410957402401936662659520228734125636852140668222612737642782068014805017062077305317831951391560113553721854022432860726259611359359906292713160794218426547014373901499615992684721735679759014068037451034041907856685281054083012362210838300218511138876799438302361544441253724297397128578290636884486825921128550097578187812899573717515082635587161840171367822041407730059414135674469645603756294155347743226731560119296989616471054451874695933662905379767299991278e+03)},\n                                                                                        {SC_(2.42741149902343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.72767261793890033713582342879738701579788077112133450788635402422551267989595542378170119233843767010110473995671833847169382830427385783099874616214043296727968211231578343013439643264137629921650700894044930573728760946872993793594612026302259154677736019700059131669277019225919605809562944681673683582463411714732539335784484883983966721360030448186386720572509467495206966930519809289988603766588768081042987081659937591175153609021009554169878820680715511157952582546047874695525454598657805603e+472), SC_(1.08856547316652507805741328133311108459071413379849228249592173654082545295697648962569966487142171527958950589368489233562193669286348468590263117513686095496315254550373721483327536824243475567704466296992104689471024583820828327453734111665196157826358004691008560351210986980416020349429176617197355798571002516082466312932251349387198659008274783174241418059580857383921848453662545165049756919518456266016867927855881199852957480701581932966977791110600298286554966460647605864227651410324291959e+03)},\n                                                                                        {SC_(2.42920349121093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.53201276888197629808862504497772743113466279857008013211366135982551142754132320426024318488783339179230789763582074283483318893320108455863809781825085033351985687373160142766923789148043804328952119961818216374505385632857959777416808269685640550515878131380792531866838773936470948896622365931502897281576409866141191016577447398976611054378520552816163939047214583399324698369172847280593442589174607157816208779995991618341181033390903049574647052471516421384328750846316829073404497883327774745e+473), SC_(1.08954933139224663191373624402730733457145944547090419866603838467045367751592532574797932835457944954526422011372262948587042044041625211829540148410268875546702876076022960618710917472852631492543810552679545678543697576455903935445619223796616816185312040389352576031358782454105047585102933376404231777600244040789873790304251070769599630294575082652813327430711877253661725951109015906181412435940635688141912670529932073988741035400213624650942964235476048057467785727734292766796878737300553607e+03)},\n                                                                                        {SC_(2.43474121093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.20659830082822807550684162621671242484689725367685698806309531527220651935181788117161449233997312759317999565320419640596565536945722521496265448362031883634996313151572116563625858362959374389422990740551982247108018012316042005491930016052043925455610861097208936363520112103483249651288286282499482846899592608826865439396733597603664674785931212802368771076717041953340816161106811566842209883603837612528826939105638551716536328649996820936321523928280412457356933558946478842255705512594206349e+474), SC_(1.09259054473505185020260148898181799101890053492770093644589558879888631894672765864710016553989091048817273205961860093624982180583460607332174254522806445252745812588451071909896670381103709010753039758448685284652639047827964352787746758304973256731952935723039219875410996554252348640480250159757935783095789835288052595599475246885171573720083904554005862824935045527890974059646530836129165941978331255890016960458670035030354438036004674061852454936042952391002794873772984891769512979230723742e+03)},\n                                                                                        {SC_(2.43562194824218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.20183637105217623172923797464848997174086992491947364813682740457671115761321245990293640391813511085508785054493124146310014499293839817916212886450320040492723585301112824160387170478701680097002704841078425560263552545088813641594542084519290981979693925736114911356847346902189717268209609703306987517691791491389768925204678100663192557651531973987910224878895144347901448931406404192515698957792272620740819719519296494929217582125057338968893888145174107909888842732982393375296080500940605328e+474), SC_(1.09307434579070212390463170535805904113810048378818863213467969045901282272927061149715379325038509499348521298215151652230004887326191872947747837819133020453913140305285129398782057136293135870673974261164857986017688226208069949771184004151260690362139381005028254664081367364022975748746162913157884385625883666077028737790496723786895885118549491248573315557692107378802923376848648798762400722087762024766463029425455803333519381078371644951888278291836624923756053447624827650934011312835071622e+03)},\n                                                                                        {SC_(2.44285400390625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.76686405604412539339661343845758616441052925577958567526210911644354130053974294580554965622254763116679371518596901954851046089478839379935019856089757769537416215481074054367557668496038377323308896774712971360400694072692746824145004924761619270508183207114488008375707213119066484252962447630071449173630135456169285964363547617799892564592692898649897884476943097707995388078440279900796228163496936639058915110372202849596817927782734640853621558576352705315952866622510099846454353115925368207e+476), SC_(1.09704821883431333246878034800913131133004617774237652456133392274541645471697996576787786184156131724914426920347374572715413381334698122293227644961269964509579499308034760939130016407824775142467786384185216359267097020505399225215662449753456672568558196598431193619923958396225496259316083275472599012725017480435935609675108737672060703764757880228784522494341609845875563884048952690812875136063236280669030065004284959365248993460175946184940489450837789168513215809156712485244298278588386575e+03)},\n                                                                                        {SC_(2.44417053222656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.70505217151482707560344872388756399027138308394805187822334736401973955947762854604747319589564276506854793958692441633750729878525989640412125275224671557499322634054306329238710314080299049317858080370092529168411441763450207649492644098019508466278100464924576949969538927841268251040178790097128683008741184533864036465320373454339882500767549299083224233514343147298165748260952699007680765162615835008295312794850052062321144867841211153653444320522488018187419379631158239331564040471524068293e+476), SC_(1.09777185639331348788918272466238590013318629710342735299246723455466040107924845548807198614251893421005737503837907341519497482068397078004361309531020459166273788772568115672919382430358447900648111878161378494300520159444389092845636989094866949686312413357276884174317970774180284693716986800797096187980163127206924591208446213909727230018309417417997329102689857694901644134212533436020983025724887211800814292347427750051419458836234795705936034258217168328031894474730984822253622198423502573e+03)},\n                                                                                        {SC_(2.44730712890625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.19984430794265702185337311741762098081523028079108473148841394181362312227039458196269034918418425270305130877828991235012942340226308355484361800330517854066656481866508614344435151072974063018004352014047903208039592586919540128879448470195191999247855617285204775739238125821232198480472902585944688075608244654414646203243425374981469244192904780712957862108658666171283285380215239244939363534306582969371750000102267330090898441948646706236770972993322153769431130219630190085216838091544767813e+477), SC_(1.09949619151301391950029701805631769611008807262855470222873742389446963187665702698407346027355925707914163363109324845611832638616458910980834281618506832812715189198095906839378587140839475637930705703955932485740864458309356449738226172131360115617487952377927040196173956330961390453788793597922985941602844919957688997866773378935234047882188695886955486341638798418823900473631510128893834881091238844721984521137662584436674499452763698770810319339301618683012370304286131089151905283442836986e+03)},\n                                                                                        {SC_(2.45190979003906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.02106204698474147038524820492550560078017069549293199948065488925151707195680948651883913102800854671181343239118174750115029170987603798349714984004066433280571146164092224677075143391659389593248105031166450906641965645213949744932246348972143365514093614017110204729888998336406629195032134871831856832592925300558920741295636930261794033998450777264441410893875342827318104090915362249664871589326517510791794741813396559204382660378398493018342872803238742888583802615317030001087509362337208003e+478), SC_(1.10202722050968474888880064215995593379112109407763184142677318641969202105631586870170592026305055821546854216260429646876317242972483104894554438605384123147001152414780082340959228810453386924503798742739771505721596804005351916626174551267059789912776142677129102063642815606482970969242657415622402526470898920184601146762751524687985318360061448522235006610740159558828868956004162656297868411448324293072130029498482599821069779766066458967680123115400643566381137300460459884762483914031653984e+03)},\n                                                                                        {SC_(2.45288269042968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.86653972915027720831787156509427502049588713807384140548206034807149055936277513971258726919403475684407026393134105167378727161111256777975926724685784518025558166259097476230351493395673203244939587670021095530405190452611223025617176982378679880717237637319138380855507728364040144584988270825256109859848235931553190263839131489469785119426402499617474922825535381967416304770040184215059668129595048783815231193843315255965980079578631833120339582659051224165256533729464272186344318413587839934e+478), SC_(1.10256233475206431747509830229744348695825520012578348058249577746544275781725989146562524861019186333580363409545874290323216038640277848404846874061351978415170688460061548111738549584200843452963581366737107690051299883448085067024437425360734305824650301990444836621071396666619868718666665828969825040566711951717617737436198630357402086159143736789467227946807362597888350826960054811961623436978477402871717153759169160201862720636297145771214052962801838309044130684014737836400822914960181481e+03)},\n                                                                                        {SC_(2.46252197265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.38096943011736509674673011615919808305961932222319258262583119150669566635487276119860709537195546109799159260431275366100571960498146151994729158182304715370819386303096544903502167517457143859367746226625589241588192512253088199098406829707922453296559754998993121494837876796098473959825022556586909344217868664107878544491461745953331538248314157762611033122329751460588143233529408443774607278731112300662480527316225147489103489133744145868506360022751144635157054197315407725299651124462141661e+481), SC_(1.10786621546826987195007506859825647393814182756004267548660323693123339380447008683339135892488131035784723524332747607481952880840029537587194838745950790700568168513918113699566352208858736370252015625402012289581640775846041470738832537494956502369165928251944421967357231818445502243514277188796986759102814465065806239893983839597046751711777777819172965628841918141498876226822417819086400455329187621480204938433761045454329664806456391712777136426361834019662320047971206703407317271604877759e+03)},\n                                                                                        {SC_(2.46358215332031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.47531195803984385220259373991263863196139132625622584299388720809526944892459644453006399766745346235189577025111791754660811631605881920043368066137720828690018922395679670557747658688812047710101645315314819931114191824798204539054372323646241621100310942748292925974634391273939159223197506546419024299847343820654771498225336589397096171249530724564793746800703862271358630714796681716614284193641124976194678606406255638866888945926440402096879609886186076055300076244980803447673608525623397129e+481), SC_(1.10844979616186625605833253029253504015354946627663325330087282303836015492416428466451053439709913876946656729047064169497269145569680465765151932617704548890478528912275948615890301795787137218810857821013582435672395986815325923089505139732970299202162852732695774336957942305955163689398891030050257603090237299994409039112842935969574919839046736826971210441138256942972125553484752167871577517930334722750911052303381730436460281525338356651909390383677443569763189492497929048212227813458208889e+03)},\n                                                                                        {SC_(2.46373779296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.69673760643584795276021206033535705223188815953273337896454021419631624166583326358966695270250351240035095834418733952817233134677435390604883766984615596611153867054331300437666122626576728397613515354609007712590443749018397601736521690787612358361609603933170074569754443370321961921498137015536480827140800383313532364248611978096086918924314732461789690200115750146814028898033907131724174489068752759467532121110823537148058260538559224656288439428085910830357467392914320088956994609843205720e+481), SC_(1.10853547247865795945628761710077542996121084859000822241768800032208316424503499329143097620992637820232916313097465163950046816998617614602600947085082300024342125823536532903767219924547058423693995923387912473785132428588271542205368801417249704427330743918984619743715945474183650239682783085079081635618694570940600187682735878379496672966389987579537482512660617251110669757738736715933839032694700641225763706175937168613678705451518379268682418215819230946475394437553896147500383286003238504e+03)},\n                                                                                        {SC_(2.46570983886718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.98605890905816935902664972585063135495938774365664149844387132247697634154164084544876510822169487261118083307249496397959782219237737663978689185292457683736699829480956647708042231758148347412189687615573222835051653383871701374844130497177648872832349317575163711161378226127585659032059321239230546660838458364462678372266734827883623887605489685635124875492596874688553130430612623073790244658384024270838282508246832433600607913815684472595276763955986441699443427370557865793836367915242181413e+481), SC_(1.10962112711529101534912562943260228361635607185175722798937658771556845854992072759911213958964564672180452090515445311343017214200478219345671347775174508165692998334247601604093914919662291958003446775403802380630023277225515086469228897386064408468042667754801894314178142102755176878099440170737636064691436824061807192711396651740278591754488382561336256458723458462518947726920208751663599691758024144297984912059552460721498628443010295179950458476177309783144390632287281095548875858926172324e+03)},\n                                                                                        {SC_(2.46781433105468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.54430070676716862693115810390421948931976002394717224886339767037564534120309176521299537203526080523871864027112261973583827525813579609223639673790081115730358923167691062682991145793513240237999993277579696520091961498898991973113384987345827550340957419508605602232295325172334063050970551689327625632593117746477019819405241059003402966379289957151082999690333889975219062338317455943787360949748695609477496225447970228307114621591908511761768499820035158216292752818940308425133880084975943981e+482), SC_(1.11077987066396813375983550556030116010095363730145009449803074825445312063852390560358313774196456800446660470281817384146147551203766155388059311142626331195591887681033823226527201669049461265320781724032422500740720322636163258283977400327908488324013381231482606703243324327173688936022945632266147475242665538452012298788518949061362244248876185646839216950748382604759541499840961090177329034155811895493525769858346071395373195400748894670107987565252515729906142353996963335676634080810431393e+03)},\n                                                                                        {SC_(2.47036621093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.03726697216641365963643583377070861255725839226857137819608236373490116361468665030870506304335667714499350230042144733017895773636837793884654577915209858152075326187319766110671398780490787841461126421773164837214653680613584236558855664435166119999244887247239679329522074528427909659616232716848001691501296415474881129262182123670414079385945766434402522650012935379021133348931497416878234103813435959680042902504145705768202920197061973972115932276009952768960925282718091705337795896965255542e+483), SC_(1.11218518925887846338577082099684373100440129084014869852239046502528659782246144304383897748541818498450034973183658276415327123506136236388676382022743876296087524549286381211212091732033877831656470980749405452135779011348568055155217297691431058355209486124090220868290623085677691510535998882567196745139667930807300190933197510995156237553526751751936307514732732771119749185564433964762101676004967561538612010023100787577408658698862992015520652788974442813172880760711590770657479194250915532e+03)},\n                                                                                        {SC_(2.47037353515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.04145957374018197650720966898854598266645480451376292061458143860151860354411403755636933814860351114878878604647625132507089018959340577083703677850415720131715935951684193280715383746394175701726398236160685348482653456024497916524555662841451913967034278766272625454323977888733836104527269030509781760497656144111087052351278517319942230391791063297690705734767980324491585907080640233385252248891696160751017539301773798881331818655389881137477082721948079694145413563849490352756883317903761505e+483), SC_(1.11218922308166972462283664410940559721964372378649599043806838210135440491265701008417555955702028563810322066423784753339768372134107642268262990062196285127625232125084927509829519803552076366252618657266369187932804353684920293503975836689939181678148657953074208352449137766423886929331657848806495657713901893538231832657027288801610772432412359417530231417257373775771556636617375093290326686619839302577808543897564582461527064584060447481565888679542849865718705937486881679827437348009135866e+03)},\n                                                                                        {SC_(2.47745056152343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.13836625005141097527253563997570355234879426531556936255847022486054354534643507146654064396771235268200006803985544171202521037242927643948038319469811631366458092220310430382029347066068690253478346102410083374014349226688222946344408939757744674854282342139396887819575150466957497794246765592859150840676197246266078542509982472444650071199261973585796033628678323722649878686652006282394597479785982307348210808314881347762951890629364045844344910191388709963828800633534756374339153845771442027e+484), SC_(1.11608792018787555794761597871425769161833702399109093560266737996699317097999466450275890175088587935348969088992516129577325697871066578394780684085582830095056893431071354092821747992470958415688973268603137839171781365825674962296093015271490570819305200074854091868367524921073343049325325162922582577027829620892489911052952976735639113683060019067439306097985139206284658362904900432923869227530515152449676170301181029318868926577271501564963346393087004648815023217791597906770733748643258720e+03)},\n                                                                                        {SC_(2.49248535156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.04561495566920723432260209647631957080999413333797576122207122407499118956399800493049967635372700083459190565775757174038814625946249478359709253575152976557372421788731686697476884579845655840194850232833250041677174205350669758073274529425618616827942406097888052562691387710599994442476905738335356868617474710844779565059857489926659940697801249642493782347425094960895785985883920719175152615025656490821075158608044948449728856201783915133469947560405109683736486457689961041139316807131113309e+488), SC_(1.12437722383720300533732703144576976650220747473127190173801296796953352929238884076703173317343950446261701920731245420014488329122609439902756180874402258206002590923101051526120698243035688178965767382003821300768780606209404145600000183333189285444841853018465689940637292084087799242953540547057571604423804871533766418971394980463330314850661300990984756273857870937193835080327404085295774758740435120394689317047938653705048993815660481680093002460907520326808806036967057815482535649482364239e+03)},\n                                                                                        {SC_(2.49364257812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.87328438615297744465096194646450231246635572941758649458903195214719841901359184702894285761560019123207949256398052042913900644331280456780967348058826841252429315899772532036801576151043477370241624504866680241705786040256854518280908183896382246797701544528348989231856539034662912089209800566609362450311834076414694488283454493481236958096637055222419819277630965593544354332424539295114451772100540679463612553653245221330337072322537887865352516598157006733971225477202153835823147250412839946e+488), SC_(1.12501562820680443368216702171006240543689597069180001812424410061058920018269439059791412119786982151024384145579756090696325922505051249226306174817059675028531145382112635697429404352105807226042425228062259832608249125279629131902237297461226049849486125890806692627269902627646157070460566893863621199099721657347446944107907958726306400580055247316143057433474694133203623188659133980123159234495668259271505321535182973001369810709246450843405036159665030460788754244976426626617648081851801744e+03)},\n                                                                                        {SC_(2.50502563476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.07274708710426480479976309691628020779430124487097720485888334697293065565366058444675559426207689696334219159426908734795423285631204165236249707662088279983336826645930883131590681720259861108637124842224516484063887352372785250144522750132913825577411016201176890878958174595058056045351871163786080741791541971254518293224681558173729276871735946638215653784714368978926486545553845820066592686411503101208530284703276767673195220201625106490763553130345207200320480207536680212451754824233731891e+491), SC_(1.13129815548276061007242799350971956663282969471706439003558893479906950414403629362369362015331119636757232935969902969812126415497430260592802030743862844125148209465495399062169787530128423414073761821003582808807744970238313600717225956185744259518248347831246573614589339623395053881927846409262838468848241417664521706158853425434773273857759955532921647084842627513319137951256056561417527328524705102832473263527516608726622488376179433990348944635143366274694655291646510873085100378581996611e+03)},\n                                                                                        {SC_(2.52215148925781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.66546695735448296343500891436923477885275286729668679318641830878176448747444861821913906606784896435601619283389185833995373629552167510816262130864697199232414556580841338932991414809810824963494478598652928206014135759671267276317584552278374538567811744834928749382434036721942532739577951189104244174983415016109197082136721296547613936068538033809115053815273570413891051598222967349815428435950301666838223301085664138390694335058926239694936196625961314619346643082753169947554871576514959612e+495), SC_(1.14076000029284095538812492213530286143000345941738461623639884345622829192804268698288927367755044061416345935302357382599504512596198391076818435077958094843435332039943092077503179319101603900176049018156176118465935531552091150220922336592025582739697402883872841338787398987528411269235431622671778589411799156577821838627054815627778310059804161448592078457382328473104979925464630069007178939435491847656260258311068361335597487518114941132145122236915830686125812822602795267174683116300530176e+03)},\n                                                                                        {SC_(2.53292602539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.03191071320884033511504800929100209521357788049753836988719007816657743269363153829861284603676755017468540712580287489877338188655492428703214723938332869709046984508497992544082262210436204249654450943888293408668136211905190942561540445707590771665105850280062222928052516783335865449357107558503225321102670597604561532618065868917428757799536044202654413342139803149624340335917343546095880030999511730206185653398500549506702060248496227902462735664113586870211450859828788244444589828221348896e+498), SC_(1.14671878845614271749617955031050864728541082277909688253507208878920627341593726898326342194956549838258753601773814934347563807364987686960388930510753918021704021087094196133032315743201042841699745017727353076753904550315141209388010549755621073497811466145433233388397790421917741924559531569862030665642872200058098773366381238450010361988239879991136194310305490507300629587338498638630308205817672300083055514329767011529814315092086223350656551068120940251592683878547959366124588107167105734e+03)},\n                                                                                        {SC_(2.54540283203125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.03005428558617524389642890285878844718736494312802631482911046128287444469152925203052711854349077933234680608713163711599825083984398163850650115758647278817901873859522949426292118538781511678906635435281968738581011364228313768246077506770271284259942560877286339894717728365071225996165010140284660261508044427454324266917571414242254927125283384760348186411316044173719870677247187469764624829288846306396406325633057145838206687944738792492559477168547196965542361335319378649243834807638613038e+501), SC_(1.15362474309532219855629179325020760915467644291640360588973618407166761132890681342534355802445951253763377987714485380753622963278794590499140846663436405925979926677543648596024842185554719244634327980758885810890403708753567653855226133547431436501937187099166102812595018346975443625229718497891574689669961467796276639910612456949263481368164816247410114206146488773291362640159982137381102399444103022912843266112217179576887961610680037352713171485921893461528599472834088357664738039337882088e+03)},\n                                                                                        {SC_(2.54738769531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.09196180075864530403188183906333091789166563611957397910504118246808674331554103527064172204440255171927959820823856955926732873907899670793820545439159871136458429083040240796590738193503022406711184443444455164915163441143906928799720693284624987892375846891864720725260850423696454131044695480079645082675944262785934839249844685013504382353140264532876676092143431742011579382829524667596451509076288207577022596179958822840908509565631544300384045892449153150046947886464330334138576799443146597e+501), SC_(1.15472393736644797605691250517848268958895310901566935031880346653798199129377083604491862984872508104418000594364925274905660197481151373463523091415460504131469158117407436661270060158254970173747921064652488091181944661775296286005636410325474973905696523224831626056740792161187380762818725182223011180535503959532958509533623242700659610284710155511636044859497322728750861022725217217099532755195977800296327347802414024637639540041460242060325238074278773467372899379908985162705580152090682949e+03)},\n                                                                                        {SC_(2.55909301757812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.02682344686683115607830107282795017666472482431979544614282577772499390761907606813616967762882182180541291523079780858381807103407228385883600131657889196817613245431154057591493045054519416721363462642405710982162249458143285907554731764142705744357489416606981695227914674579929086640030479579922939328776905232036531073026566520246648477736090367808919883388883963769810409171869273129526220123913816591012546473914835288435435456636717001304801970284224777873829887682898692231377394789277618400e+504), SC_(1.16120935663196836147684456052183632471162028503248157526172629450345258906449374768531348114470501427511139957706536967247272184666850539727909509085503115172037279703610155102680080757402088905922399501819992944193388283446387129353348109573343329650403005055995515754783631679191959563782070371163606011272135677568359568291367021150032988135908201750228275259118847650568520783802953630180077282788045798258503733397522539037655333302220464231548669210468078260282082167966080994777712544158413172e+03)},\n                                                                                        {SC_(2.56335205078125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.14892015447846929597320001936383408871375214147460215135246929794255440819993932451177495898957213852828701448765401875627627864497167830577666347436548261744159439146951924013834893635312812132835378623507524565086891484337108765292763791143863051292421436908810607938397016851938224530508922661841878561751356032455589686265729078942318992554715118910378115497136038560986632600371159329183179668739362697001112776460345397004975523207123313873706497511301901771552502809081894487897496242505292535e+505), SC_(1.16357043742423004366388876547397517934923017185696223207230140991950892999681751404777434890527995257306131176871918963498172815283610776154685935213203956920687779270742505157212334566057325315338334595808792743411169275890229071317805069527940036269400858158483627979973809885604651271180430322303210761759282508867472056296337605917830930505848881064672377534806190527764002703313807338123711562799144947895599392700429560372378816923604882635503928104343040556904440453194208759288283461661678358e+03)},\n                                                                                        {SC_(2.56762451171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.29703113090415751643660620425745683904714997582351362061363614062666028044674767711616356746446217976093770417467039358862913584638766769747695246010563287270157495880149188378531039015594425891868323113223472370391197166721096153390523109677750651642580513929840575175477224632012638454912162099534083289200692098320612804122242131898938144374717644476449820085207071224035304839571045148864303450412843950585089734935862000922063944874797130648510362103713734504374686478548618437820442343263142025e+506), SC_(1.16593967453145559369544306100308585693201309282869412003228573749046092235465930976818641582095088784604661496590710556872066977581973505247169754578112925822200494857907731722913134974342725157402655749031345094317040512927226925849278843090529115873222689906177777543269101502573110708297252929287992580647243261790339799263792811001485470689828881958611103286102386435502284827728263259952820841941344530544922616127315771484936616092104044789819215274079370627435537585210189816230603452191395811e+03)},\n                                                                                        {SC_(2.58803344726562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.90790709724804479132556083453909868917919738689504821860823016074637943633666621120172921379923309482747636586327882413175365540729917559878353042643344484745858486573404853536834763233153552760730647864795734072084176699704638875987400879276867531759597191063885876445027943961321753545873221424781519141817001618896421072011195454953414266410455503643937983624981072158134066139721859128817828290084296521427611983218004822564765033604241751045878532798891518548457905811754983202471030014391422152e+511), SC_(1.17726698940062819798313661811942273520790845873333503419335168714286890290988366395454701452158869664784530075683996153711726018285966212794499193689511813836362434409180619002109251930923391128086670327123293742916004443609254051691424405252610542495444742645853335098700474100504548610912679222583691545386259223880631531393531042318494328318467680999402275909159386120548137389295099242482162431108878453172849462368950341510813941902821388175878611540790484083594295642922726698604751529847481327e+03)},\n                                                                                        {SC_(2.60608398437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.33825116486473479768311080579709605596750081119766588078681795108679798073057384558285689635528924722848305590938936286764686322742759286427064890971927056168742244927723155969145580676203640960182842243162812427718549964513366846846155924458163079609730575483891732217625285801636814884310386634592137582231215997479804017305271357401826752101775394739167376194978234876333182127895644748667859796437622142682912901457659370959850969264192820236006454708303991040714929129509871441566541862106493400e+515), SC_(1.18729879420143225026019891855763274986276008788435922588678058013626980061941098074702278661920966764622549536129161431143638765731491034572885689329888972316596903831943562979837896309698499422058702514637450249006751928367223603724456070076394501026520297668761126961002643331092437595389009216572847039947433534367160704429006850102633148790210588206000533799911108269777867051802815023235050725180268628628008402515679296445445617608893371992794240210063369876282338438543866275160426758974865461e+03)},\n                                                                                        {SC_(2.60787597656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.17526369190385711375304023169973528952681457745278357467586004990653921246350085959593509566646565515855934245568024267569767730866850414429559403636636142096970381490652509683543441178751988175989097126015236829094400415707757572003016463654688400294625964188415762942178687066094628160610589258475252111010894981388592209574630069110857205932207628474017828634823399061935483012288393403221248111707188708521846772297762193570515425479358668538827940869783101069606653706771102563806214210048015532e+516), SC_(1.18829540052598717930086868885398749054663698391162067149758431338646843225922411111839066036090981497653653175753375631033750886810077529129171960253170845444390238408261517093583360560676169081386896153240785347947848454192365350123747912935997785681096115251754421457485042201523193260279547620173630972777209581283260011802180279234037764261452055171209905441223407231997070779709687426714853913953891214226688132330622126572736391491813324291715183343651028409055416019073866265182543431335729123e+03)},\n                                                                                        {SC_(2.61056030273437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.23096701917213007735128490668804108982852620840302517375571160994590717852525433034255803455639403957994821422533703004085223148448947302264931845271539637468047169680426351588913396038585496549648709315371377734334547947721815213286416144598174129316831911185263342182081381904180030408480287754859494879931399449055861035314310746662904304773412957434207864949666180505634362575103041986921608601604685363792453360999683461381031992698553062661646058636504681248030570964239290373753061685500691394e+516), SC_(1.18978850414441605835641788515064534349157471586560323215420751870551845588663247409989979345468061473783507752771630419525579802778371574837448607945213037506305818374563067103941101943606088989160780878860090200756158928978337902738499647832788024326301735304468846618229301631350380585225887106766241661496714167204262680844550670300327413571162964909823939719263953078681346292667663328204195105725394903890764955284397055869083551779690350933791012925788640904230617682818533265231741941197168028e+03)},\n                                                                                        {SC_(2.61728637695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.20755685213513123131241483961704942557537414940240899921040535417224148492274154424899960711257276179866709020480788225128645062429183519465818068166331152127388662388293257910161006929863059053166040134708795497441974634831146539096604925223692244286866447289335860848479484227011974567539496451187799314589064082127051792986711551633422015764695240328986957802725727294655147752764794138790643631139600445863319069133107857638025290543106871325915138276665578809600598483931769750171287888945943640e+518), SC_(1.19353096457816161133411987794594608162693115619361136194494148947306339995266854909465498062837771575938309532050716024555980376790223076205498807557015679408775518249589343652402449881580605638038942252728089899063030118227919844039989422762116500169196736977734786819335131866567127722964468221086750612272468969926292040935581739035203779300877278911048436754425883751223852023253065643311364664876272329620642717673556084034031846105193992575066434852221254635758069444868044499540336216532591283e+03)},\n                                                                                        {SC_(2.62782836914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.81368971298539218622754882690340024127781012854681913479661657043400871539334700181257351078143869368666062426621153036862005628707117825809053525337859314997426023187576524458117836543204578848739293156516084609444268198664758675609729046892648412253417849050454404115848517921855416430233811724219896833121110946854168257957585963134629913604611610429254726170641528004512415121076113200634054796976650790064349665711002239298146939745533986707327330589355724939440325767952214168877930441350648029e+520), SC_(1.19940012564363448683774716986330278724667629299805381391233636337363142355027380756923740218700471601707583795493916768702777394674480118291332599791718113690770689526674774327312928415401158361325594164065808191037934794167752227027441204037173542748578455421834369136845147376715495868141430148937984847282693667193491679268725516489510562006978596638005009600431829789832720728550309055569247564910478746664766685211824572156591091851566915825774524898965243789824189903845573625624669035752757601e+03)},\n                                                                                        {SC_(2.63027221679687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.04800843499851140387677209071811733838013921230400090885249481664942895250825989279301907035422376925523767672930810379834293330671252220720319092734675210352815868984391411886622349742272138932310498147521876538701459900552904318727096899607890979878422723979576385190315143792142477981641948305709271570186263763115408315482797905534515470527141372095187840186692877168775705042624008395573226636498690518234552015335274645968146213142028089460352928075599629701051761701294166654531835765279408807e+521), SC_(1.20076132185510633506202420964568193747923257883452445648684096867229218365914648682745485640143436440696003466503416498043039747165853372804246381902852300360413056909530717259915561254894365404651443251195825014343521667727462778167587500962075039619501089461021070567149317862039430779210689521093267908137185534509955078202251428496238784656027547829570303155182984192531246836959154436680983045330533747445032675289906832902909205602824553390685164239876553638543524241869542303323067877296711456e+03)},\n                                                                                        {SC_(2.63209106445312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.39565391406320319649030161233468532492027713515932979738761833734190181801672681401669883181324346751914329920354898589154316739915656175126100059545915776572596780845396958968753013969165881960535384728928279885381999301278748190437409964482275790074056443847264011827538578023430656845799472891571718649651639547309811478155077032326365280627126192480478587104949209485361827003006391116351394502117244859613944074948672203975925892455389181085239001965440542252845359884796393316132651313936075490e+521), SC_(1.20177454763067111384128165687893621854038991777844547399642133707531286081103375763461947980283552905480044499390184195739946567747136179706624426440048971066117013666075999056758797116993955075891828164495685984595226226878877342316331779254566043461736832916971759389417951463366536064020117326785333215991783392947309741932033640187764726469578114048648028132170443961215652682913569014057793000823666456090351086478815271689877100088608353011369804790412753944908195700790346265903341636076397696e+03)},\n                                                                                        {SC_(2.63529174804687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.99501375620045768407985427785584880049111114684917813609328440874357575509719619952479883379277988204757363121820805582858322458072129685643019955082411774920734848489421459178439313006637644456655180338530783030565105775464673787065917169690274704331057106971780787245732784668983226650881474207581878144048749544605119816169141719158567436497024127150067907743980703325568729612763499361957136867363556232153063129447736283782776434639929740368240334724427988886402451256933686729856341630226991497e+522), SC_(1.20355785870898265728618126972507572750309420791619278556132868747777929259659904448332621382340490609970695839471168233644516875213300716945199617771312060831469096357827235850659525480515363001842830363024365782648964378332580517470644747269421651366108409740279049311958916117727361200485980527867894181048287305710334764272100052331929591357976325513836676359873207094141599204244498770619307565533703543909651921453667138272310919600843232196337888565849885740029257340224692905767570297929487581e+03)},\n                                                                                        {SC_(2.65799438476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.57335640474801863058467507788035451075034407359081765462103544193680340997391017343041456025846730123681646527929926444787439014594054513116510073384815602677876440749717057760627159523500990481032179409497590701389941883572618275839418829581367800358826659762827093331419946151300134899096429378041648813617549020265355659696042662297857888288242201079689075888689323393939145692883899153674284266044340562112633868228621986767215520985950810277151201582973655629895731234593753893164743583115695914e+528), SC_(1.21621814027571271717851177961927638993644428343431650529497232306580352123159508789408501386031561472668406881319931960439899523133409380272912554986645499274407497474326268475308272758373223022978270227431022326186829496838886451020515792101309313416416982131188162038524826560663040813242535090021538471375711761776327113805905931028196711072226863720049579377469898667314245307518301201796644159803528739125596390875010768712587584490508727871235282947313066554020121519702097823154753882996342003e+03)},\n                                                                                        {SC_(2.66317749023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.83984797487643691068513869936898285931777336511752862178600811210578100824970088474237568051763114366144226190805369945388778572789683401356529667017684871896630462216089564820545001243366075890410999845683353922649330403586403177792538614976250770602217930704271748587600983585270449955872538579748076770326179077409318906434897372504637212331130315438922644544227549059234619551176521491256025481559743509819899498165871557249430713586534071970451632983405894631409063129611218359530136723319590728e+529), SC_(1.21911126471461741578219431496167109388392112833326721224759910458684698797107414402087762267432276077377381057086558399508218969326418629024709471586086882939874670995370205850298487213523104255872295463836040004543595648504071615083142936876323925152810138819901982039436964280705757748818036165307554228571820779858749719013844666647616118250446690417140867808024505670726443385250598760897064339124536053086450637095118930901907746339345709733202569777460971030581913503097885811904945153154872801e+03)},\n                                                                                        {SC_(2.67270874023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.82060549092804969241038241291472432152182720210680778148011471481742600539140214960007785918417041322069087423648646870943820845954433460849425687639132972291304898048664271550680485785489052653646247346968623305371527205606107277707200095034031122138076268983543546921036921777071728974916375806410481752040461615659403036925635746170015523246140185413298043827569650526614608165403410616799189274503348662548500927991207913732399410867422663584384661798652120160244883562616577140960066303964557212e+531), SC_(1.22443408867241214310503388314995678574010017953485632676462698285766620544932815015658927880921937589036547233310773294748673128681895553087879466619537047265753972190665328366162827933508759187173348808576004582394699499076332892311647104131839352336560128208499219306100374439498407387650168791036309018736586533191248438017882077949866090654282862908910137744103000873539824313465914703707606563642695104916209853178567974610574381433362094339259311117818087093158494589749197216468131248295482045e+03)},\n                                                                                        {SC_(2.70016113281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.70030482760169582852764870022482388345931265938595212715212288396119629498607619124269850869402618720344327479062538146639431117980887854493736685580240369676464490734089346972528469817523862041950269311699569012080038994224660388803374958490654173476496139787936857987348001882149785882254844611306648729763960342116308717814273259706008628044554069619421800362132190958113879693843571921760932962084385011750578818357797168582051706440303849493520560811700024259194948521654134104589906902329600687e+538), SC_(1.23978414469654597550980991436367375336940629385384245684209050855589983968663915762437852682596190419234980492127156530998615233340670285900612772614100306643047367673575209142853728399963555517010885623210954139688194910734637025524375237622991935716892554218818181748183049020420753119709384549350941727520837319781237710722035260144797775415077718520339650547946423009813313395761158987895898048784966748443558920083430155549000720020356669725719031975860430084363466544682498951350310861567970704e+03)},\n                                                                                        {SC_(2.70054931640625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.35556246881482088435201938745499735443422343721422726909167575701155804660269501753454025198385357942729216148058402888082936843037666756431723805620323501277924485095434283087636017157459559447607435958149522997180906655658405804224417556539760418307105120420897787012071320679768264313898846099066487299460291915971555831387616161510990979847666849751425038488602735610815668024003494135422709726200010471222325314888601185136956402932314776075495450512865503095953107580343076836662674857976996835e+538), SC_(1.24000139943808188769161189044102576790632176716846006826446890343815080424906090643968375906580499735003771916399771255513505839517707999638970608315201287275408889481947817805780237318193232931843071926285335241756192960318030948453057411208503566309936023402088802685291522962991586205852685156815682522626395654750456420780222127098948439918385041424681783818036504325145085819717130531476908848760384059860257475127397343293568253686086778784668084783515883463323506080693263777217731790238160702e+03)},\n                                                                                        {SC_(2.70814819335937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.36183310341320543649184780325173400163540526173769930780114378475634825477296160168316685403609175589559337491008470655972669702098565121946848573593679324431338475127598316587277136892238372268878441452108433072226956224262370191120904806707643888230324098418888623515864956316042850045865090772817807884853522763923538749356853158927325167076685014314318358981405561956876505456633511175483460920190474812733643490967704064321411488330540453583230477188118896160424873718909273800833108743049568808e+540), SC_(1.24425538827305118357592555393761738435990654574901945987313499664147937484154335765520736983014932993836606434101338832333202125369819770211206899300939246458561612376864158863582216172454087617727999668806234801260065706293556001994731273026786461243331447544042521470067403051408517657026462539105394122382445318834324458333755525518390132339900600741167200682161289164765341401704110242872841171210872232051130938488229750671788141248978582726200946277705990056945784325034403397562184992838413143e+03)},\n                                                                                        {SC_(2.71464233398437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.97177482381998940535354909763097323015999944458834301573634975511788019780753090619037896503663692109125581228026401826726818967757253432336799304081901564050591039194602193394534389828735752267035638002929194920584088977922524584412143704141726450871318504326228275878221271435821993094593444529758484592683017933971800340296647773611822911322312265445284681378911451787364766178190823150762739346875673293520095107122726261267812965975002330900269774841133314105941446621237561711735416402814685200e+541), SC_(1.24789261882846456869502381133977889113414512802207041950089427681383499351232412630338845192778918152075982048766029158535334182965970101634497444052542503115667587137532245018686132862895470546848612193529361885030004189367863227583075489553950719849565150520983603037596930114194142772543721578803871022143584721472898289816785584334656428166648515113893572441494761575643807538769943605109408829150822345245502393328452815133294840511092409318411992974089640536665579439664513165349645290316517418e+03)},\n                                                                                        {SC_(2.71737548828125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.14849582174126618819556370085380685971394031476430255285356308348322838222805038231590554165174435445253263818561078257865072811420323484216906397051422469604635799018120057442739318600168625181392538122816490258986286647662007201053207570472532819744886135938220547403721968372689107265180708525405955593270350737123666159626384148303312234568491252099307034291475333683386640404039180958845964662589332759767661498648462420142116439652221832021431731899541207169664755851128939481934288943082737996e+542), SC_(1.24942386621872108445411809148685186710218223946095655864592316047665435324333580594825149922369026798820806926292138544612217677339128634961934549707779417285869400518925174314104626146663237608694626441567102506117330741905588733785952324648414576379697701672627581513544973743360261829174199656081910839370335210342632938562960078584213036546913616421838849368772280104016555355278170458069625306893803869641377223442156007242421924692561278917431342975628669679420993564635808170942119050909852690e+03)},\n                                                                                        {SC_(2.72209350585937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.83616543804308945749835435795913226502554811146489035840851026110599412031809233110908083307404755354851132729804363092206423094086100827893576757305263865221271616680493559302178070398876441918566907148919215225474476263330711681222803949476337785631250279029633618728878685886868019285858169329173166473976805440113718307604565691274979851551595670394240965439002608645521600181884867075878561717091454741569575957557991402309016328145595971094122976985531978478182977689408685374542462190414504967e+543), SC_(1.25206777947387392334047792966095971046990541157061039545606552540281699888764576542101216130339216501442542058299952976430503295496405143255957217815700010182399825555071244914636174252786355273419079689003429314765336989610049478376974756694621686420631145086612314401117741894118317768781797183241130188707293806751235290450454953552453874701113919448338517270956763590035939804048058942584965507573299803942623314089629820510289969331451117658084963492930492519286455783229518332396323717750308226e+03)},\n                                                                                        {SC_(2.72530029296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.52188641624817172519121946336514543937098639604573351000695978434404811271218972027152169632418814649084671956957305177285269165126298136037093796721736816145973874733519665294885734270659972619512158146726367202155509165381708414271370400178799222931569384616697238621630578914016701587720661336428620271875288056871770134636609055680298776682379852464978840310937452501621391689252368351766832176706688029267299842500900389890602682673209217767507311771136235156143268587002398986897813192012150398e+544), SC_(1.25386528734852725901069658762502773426737514481429207405636483380893921373393252239120298232623383010203579618337070690160761642497085916791054643525558365336940892354811946207188293965083441661205108154746585849411307243125915449917690096150525184755415511414133733433796674745989078156357226142701424440176408849796497866360823872280735765729140889211950268280975563281120256482234459507085426314710247864337327040418562992242067841678191977765567235135607789591085902683637872058029702168410328781e+03)},\n                                                                                        {SC_(2.73169433593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.27000688056228001165783744708351382443004106267194261654166377111492987297588126340652284657909362589817284734278480220250923687921724658273741222845040725490242716458052595113911397005964358858051409683934082011594080977082227687575765076982261994676358112722561574445593150243454497268640517487219164254590582174732284975023029633682602916383288744284002202685210679793098213814585407447355987570778788517531399935437979893812063549826926918605307432580691076351535093127118694372428667057767677808e+546), SC_(1.25745048309297034215225952220531445391459889261578785962191191269973986900052411717492818974317691759879613764778230129833460704635426001696278239407798187096840776148508738997027824655152850188253412776244667299762684147592733104557697527362405034837859459024028019729857743321602202279638700589971887663830716917136021200477399244700449589835931366044758692844727668608247287709612877989811295228794250549929176633402252250131673226698067627069386143132606288117556752691166133840849164424515936798e+03)},\n                                                                                        {SC_(2.73194213867187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.45935955605812735495156839693638296198462243581441076048340331635409389260547980405158868074685030372197363686625129804156700369258690205283782313345562255012561206270872506981551312256482533584517674261237204317217652082804172442272303237230430304341018311835011345068681913715420708866207782523431052323184802668955974067735417178283154279812075468130686165925458631934147176186790438845925303667238833076783478575591907165841304527615610353531427214472831817011248671438883122006900507491572977160e+546), SC_(1.25758945845399548334513761484836747762009869404428617210550785484947799916825821741590245776157576456556053200179339128015458381688912635377340082871757228362478131294864511122304924465270742894183506533992717423371247861749808083018612364553857081508199836340857536635789070253936265701803394410400202049374679259690925798433922554703148583113097085061173682816006329799063331159232094483431159854380058634539195720053477928210931223877869495278223645264806353214206465283453045735435319231073321061e+03)},\n                                                                                        {SC_(2.73773193359375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.75522187142962618723039696060283752240693051970372647998007177632405178888524559501414961401629390159506570353614341028836747312245870179290809531496336371134149970765075268921209985372664141480034627191088756448867177971946255439924512702480221805741310237363955123795638009160537673520402848726868729811823176646009990142770392882939786392934163723877702015180712562167718085438044482343529946738073746232943024022726669789191486301217254547597742218548037111408823649458949471585947496320465505674e+547), SC_(1.26083719323814551421353305262485405862434567729166180424538391532489349156584827995704606388649105068260046169004592235501004892498165529197035397319477296539811575470165982182262980020109104745816462676795854970280500117694084978970615425104440872789238137786456965583924353661391147605745635855906505631769673033633773005799418253412998114829604828082736983221812590844986007810128205855445726749686113893055406600235659582224834902501547253721021711295799503264764508618467137830159598413887211818e+03)},\n                                                                                        {SC_(2.74001098632812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.34893254008320787144503178120105964194671728299186278281524075300030643207009284068281491580609030408330028307245646169064395328620482827568697063409622255518209761886362109978750063736434634921902131878454124877169053179613895650746834104007447102889153041215532618303989475384161133417389744739612471830051596084327291679923709578735731078510109277219904797142262489006652172664731523563061732982125611513689412785297049223685029009482745198123672726358745250759938159030791625989357769183602468043e+548), SC_(1.26211594452936102710342719135741272183036870602148479587535687512613529652826661637708664494180694865774559333682369819417258657159198774272548187565674868209826350019453898525251480790780933930824013303090286706516081828010609826063540686568568119085564812220058109502952578868894711666038722852673588566039044525927966900765516238991449583986479631623707519364320534242607890649674712816366631757236086264806057425343794131185222098672619086794594983124250351863814742288554823438823348613167218421e+03)},\n                                                                                        {SC_(2.74012695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.43963028638349185823005280656218444541170618455375214591813645015022494840216673267261777309484543728861395860015282180490061252159267693052079844011428719248324910430761055431452144980398539874508822626412639310007284896023095914132808753804800384459425625307349534297866351625124866187487286856240545768466410732030757465412220265572977615469607782289154725215331118055969767718716183569923394970560002393108713505658833644827225479316761909755761220073178896919379329480562059487506612444237184452e+548), SC_(1.26218101729579313896351093736544395956614599758855448252141163466602321052519724057974963603297529568189189743164046821940258618202732549574797548959196440866094521888416631817545554967595337237657232619165997336024184824146112247816592263648606263430262853260752530802996686824782343772861987135845423376006182505877145608575758494725345062753542772879577310956393664431500273455031938384785590340004353170588269930105532612586482416935155504762300763321054220808155610614810265234230191497175059165e+03)},\n                                                                                        {SC_(2.74720581054687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.65156472722469161165253933894090520098810289671675615091603748405246815054424400225681472308631048704885846439700554808282557082572651900194653813339995607802722127367016233953909033386697444709182325963314037904487222310267772208067495020527763476872748958066457362106555635006304594301988301486259335696781593645542338160305910287225269102824966135856190458436438227462369256310585009936974568464708844611153337702463274908801164875432485128519121891089308898451128798468011211076533715663181462280e+549), SC_(1.26615412622016066773428586665042142297687281952025822418360199718251338686504565890728292129670255358725857075704996774875428594281553644585036862953669430162370387022200689480168340965400531245839730373397928642613620048603589983979482163112632265385395129307195649694658168475457632834752337574468191474285680990314398361924863703422165383396417512371003635628367787122049205444527226773279576799466324058411508462096392731146044990369360612521478594051236345101080594003737662281097247638298149229e+03)},\n                                                                                        {SC_(2.75135375976562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.85593806820452363164033497909416525410349365378407834053194707156878784482888985284063098506415033126802337375451300530273567829908216031777484484345257277817928431903186922600706855492799863354279156419896432234629304075872029839818850926918324906928556777501938151525932562856853438482049865798716373739475110622805349816433702247525385831304462678211094333631090366642525356501865624237006769045716607232954971200546442334576110487586979983133867900463532789292652102356842946922082896814804851549e+550), SC_(1.26848307083437102907999300630746202141491375019357280142433722571632992921958110237580061165890254122257814664244660109015268506150881344154195180348306364082240264197721355149004586222817319938014766159818766842054285164014463945573466663365960921671622869517395815648257837208506059370861424041073773595664128482231766478073321582233064529270793394547797093421786613200069804270872196374529966606599064500072225677737363056111122640437455166363606493268714953802554209835604854149801655308732401940e+03)},\n                                                                                        {SC_(2.75158081054687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.92422724331120030091206558783828122322889913743417543863135575352674051781582028060856017751032512454913123474696893197513479270502480065338354159771191825527114847980153319575829430540574611725311374198794312905212772030839926655801367881703644064001378770660612691685990522083544157705774493692998115912535772640090538581050505578661984623264263577654537774685867416714114799874816403581310789053598224498041664209642276002614000770248071309725054153966027376042807889943129905053709009374016349420e+550), SC_(1.26861057088725977297887270608413783036524110042507724286694634172319723337793494068752711463209778522643851097559881831407933989806742419040490165023285089006527652146391939734152036605065127611568500822504775282856867457022089892129838642648727941868099021407850497958930844113526694145037095666718766753002804201408746528281364248933906972919793405338218704872022831728671320263555919292074175071318565586882687602491394505574175325991584934111938186652155947501552771879316088365894413243452978556e+03)},\n                                                                                        {SC_(2.76262329101562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.41128745891919913333173469559771430617891316932726350154899361342963834845484411618462054383990933686083568118326415668440495835330668250110857069332783495242862852089754746059424485421177116293066099426764437299558939787096761118533412760785394166939194624865808283325759243348864254390535973469496856180313093344002743251007822626509752456548095400352126385448621295685627957001297983781743208629694289618628515105096171723496388846434487530078418013897078921392381136291828003628826369189184518512e+553), SC_(1.27481372301335759962280128701923710464323547362928271835697753329563571852836360293641352576422993316593777842989390319238998458994981793740197328538306304016924879242980464210052394470406649460208861986411057813506728447943607011648849192739213642203579410570061338434172386516675591334831637736498514241193016645215647908723422536411191440119054111530341765344073007861534895322762388720683077245798310456478017139675939926160174316233784478261517826049585379846680939308035557512728753523381995712e+03)},\n                                                                                        {SC_(2.77013793945312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.01290896229530449521621768675207501364779280918185316775655308987570806286315225277375344519364841705475074465492326838322861243541879906453840374270600015557657011703896554262881478667590422454630665634559633267929136834368326148172157153505353291490498352388922861012241917132058797918833367022291788698707243910384166447049173045639947013651574887713049004787810201178929601969346786170503464994395032836151091671866117179729944576214672082490539411215308186320465152067446018745562656878232748089e+555), SC_(1.27903763265641700903228790677911034642609737185380154224047441085341591488848375731981035533713741085039154592503440976192533622118213039058299858619741271669206905489616661399074477263742876818175027887944208747055293265004400262102837492446446400077053116741555686094952969892836091321600631269947120249700030062489250818823458072233799039132131740684394207504525313072453087965512842744697375015762177614115711307649424178836198850918745056670006468481172616878881623786208328488422033921675641592e+03)},\n                                                                                        {SC_(2.78247802734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.11372576680750988547931149744006701147047626548900511875343348603356138432798078013648782842377076915546206567185681379774664670413467308733119154763860001605808493578205664080588677634047893591056355879815839278919819427551503369690690693464575945787680549498511845824325791283575449900360326923507589185432897012634350416981921309510087333711604041548114009751580562537766121821126739197363438782145171986640728083962216142031911909647689042696631860667020280503026674691632805578697562722707687072e+558), SC_(1.28597830189560236232596100264571308001432634859744704654093460164480593619800351324976302138560192498860034721676285443559027762467412405622071202836417322702840444276551062467603282750658297968966928815571465811807563183703885782497444963373969400856601488572012516539463327171825467695083911007494104206323441603680320922073784324790846964852222836364282949072314362478880819335231310253197963038528278322852878650705530302794124677011156151843788803423090793399290547472451521864776844706603504264e+03)},\n                                                                                        {SC_(2.78656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.10108193135062361753848626951425722037686523239094630443926419520775419009801671924355050899694021282316527306610045849144473702369959930155759229901990015159828353371104157605555650181662047799796842396198529006374887457315064575023378915718643389022463700245801642852379285927654474914813355651444514363683371107890508148097421612899767633648096586793473262544856626505043057234014390261502171534294053615794865329318965865832255241498165538229353598470272709762551189698794179607083662503529692288e+559), SC_(1.28827681804438587983604204404553949143391861980385851148894532571195865098391316190317521228760034687642324313316744596696307856988996099698773627711598995262586769565659933496711496520308734939026815123343054056230094955826448902369232140185013660051068797000829712235164513490915798374114903233948426214504751604916043424765819069158894164661370188055245852497901675556544360020865969471483685069018315596316656491582826469864947673643631058118068198489945817722079505112919909572781993097801473867e+03)},\n                                                                                        {SC_(2.78779052734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.18999632833259078663491625225121877399613251497095113697647489780359517672959874286285177147380539269570725265951213206375880012508189269900898886535101989569251378955531766296709632828656530805111626750285084747431528024581336396507344513873204254029475490259851922447055953936399755325606190147403553898922378086529575149613287240351302290518356618207746260462803503240496944233178351998410680200062423037902532211429371476022221653413108321269568410122183737633623184073690247625859035515302537459e+559), SC_(1.28896800147720673383546822262528346769636553839353684610721532223090112957274541836283894940664628274990027915523514654088019311707840702147527836808693983396778150929158380817965589432002343569401233667360975966396309727041537312288649704460780731942527205336568947004821242375529186206058214698370942630628996199623816250437763387073725051032878816586047168250489811932418947227748195602026915334221286845272945176812591274535240935168715644310169712531290897326517437075968625234494261947413073489e+03)},\n                                                                                        {SC_(2.78815795898437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.61218618539857076365228227555848748051548775663911736458867566536972264200430088827081530026800447549009017823690041813989472165750258472924046663465130104961109500027169649759148804907355462669329551150071063555206233138310121687352492623754014357614039637684542946892953707868312934514012053163127922723121407814421102679619476350325129089628037204623806894978392340793216185483568288494490052357869289145560450820695828630811931019961170030451724063865118797393882276587768360241935447047810743844e+559), SC_(1.28917481739226487432712060517899736485539445263458769806945903572778299803414922473942450002164197030935581722799464022243117962933502835317194275047322321114589665812824785250110887283661422173405456055784672665901305620932169351555034320183340580645149203649577995105792587544645904290169532332425290368530000946086713419193488832913694353552675816208620800560358936362701010721800423975604266667096261086212576497263363027929807316390043384320778753525829463815714854502847405049958828444961706873e+03)},\n                                                                                        {SC_(2.80197875976562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.82618455077565126915297668370507696463078476429570315823328753531129756626065975130154624060217793215890339836013811263446588219118078599875589163035301520577628694080057695616275453415389787714158135594663642925777779987128063423556624463619768271630105579456056052411747360560267081334957288034432376147087760751976209577848208396914886679629116296335928876162518673743325181336549339826131138825867214201618669219598102312045114606292406531380544658744867412551837602775082984507873207349095157212e+563), SC_(1.29695763620104621424279442424402218353593178257474260149686803148316201209617238436179477956399814120863265567481557661076422924970313811531689045931819691622838417380884939395885518320561327251774634742690919786007564345786486591470887220729225634754606907191382347441021443725097897625200090078281192025584011261014378384158433599194392317180107812475591599783698794327793533852628389947789538392283722124357725724608644217449589690508056697238201842824741728681909373063043298217590577432868805623e+03)},\n                                                                                        {SC_(2.80203125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.88099402405625379582485677844450210763455415897255722481574686227363417937117409053301995625098819927112442980128036027629389920429562396936275555092694840939063887879871001616224205900146030091968873372297432644395229673104244472844448436514482940201158513886134935726727954179547387079295489295060441557356044456351366962160279617987350829832855489038745874756871304707715141091736720928177916850437030194033083088297702808983255474300262335482820131321796542651657027226622402405377089959318882934e+563), SC_(1.29698720772895798025158943453829156875400869238953335731285171195655117119014031237313561614022115651397706270203757272172284305522522291681152323315077036158713625671837608213276560467385934213660215188794313332985721385135925392061228608163276968285986313765936369660118739710069076233587060124527614220741608394530526370275941320513289509119357977474420574587040823322704012094059038801017919801127746545051276411798845783723542508444869281179260133612992430179540201257821284844033899164658744600e+03)},\n                                                                                        {SC_(2.81700439453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.70162686504736644394390314878436412089963433995104255785939808157776005189305281547847855039113714530850217935564178984216281003601743718197016816169596235507155818977497371764608100727303917704199147465495512737408170198318133117869467747225801301013904150159205381726312672339250627334347473452437445406465862685042204597562520187645401450002221687823130946215956037400680556226799109918666091282373855626857838274358350770576572423894583544986294717276393544223628749919441547837435263449631473201e+566), SC_(1.30542667263879128166272571486432274109829921084109963241842140798609567942422795534093608065831934245392551434390802285547078558805235547320977883107357688613652621017240002991702770452930659864097773326764670362972631745729788725791748302786937944287950017696309987680444508345312453436760156098748574994085832913812082521915982159427627033388672758548745388137805516192190063926389048561475177927472836060670052943508834302998743570767395510580792095160540671750885885226698777234960909972299574714e+03)},\n                                                                                        {SC_(2.82022216796875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.34217753589702069131306616868506038282257373319827172738780667091969307019646455312864308287397615481329774411266281815295724298091606000843881239554327824467526967025611195553100876426864392970831586122127527464967794739560542541424380886521415834485763759535376733057777254133300530759799729180849166148511616821677442495386544882899049748630493985276357435635414308064546925525056792785334807959685947586005611678117025070074499538938613069288065541397227003871483385417164303143636840159791545980e+567), SC_(1.30724138107573491685896827426364373193013658810550701865300152069361886797607237073725640963698540156673632914074120538569203831593200254334967198069062658222220928631811532368809115887198775397367646369245050193405872721101875368391409676931422544090278751709465519337511128282304626425681229326796045686837842397962198998872549152568288697097833105075232259049135618885873624935536107557563758482206196742361662407453146976402072407598559998606004884247159407724782121531572299014982848673182507712e+03)},\n                                                                                        {SC_(2.82615112304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.51458783732163405894555521526962015309779922272530158189730224502876518040091381958401083482804747000702592948434706804842575154899981326078750200305557500966537078476491118588033506305516977483227658456244975957908956924900434450285394570457726527047826725906908332988029576094913767554799624182848382751898396668003177281808107969973456878731577451854873807837523480385706974198126441663840712353670090818197900813731896857559274006723614631495235860083811707071938086170961930605687110286319940295e+569), SC_(1.31058606126098658914749980669137752907814114406047377298698542170705452834351382235468034443572103204615156934431482554766795634082238056041497089565811929568504698404362760057939449831205382779380270533452082343098480659616998197083592604072645417645808177718993404212036256514556392706659292762029813225276453075138185574525199272064713417524708281945875429963950917292224048107864710135263220521510477694608226875434250357557277942987261068956401331239003920845690693249365289936462707227721073667e+03)},\n                                                                                        {SC_(2.83436157226562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.55855859415787155083193470210208378361711657010190825266924882127039806081246540316261254469271603852584839833838028915158442164495300298783451422146595109318475173272973235469773243802012118822659568214028455183174646202796115468262518061320628514051619197518613409430128088536388791599960076258092606901879483565868506669185323324927623993840509986953358046598865455601887437743198058974432714936498285279532955043098363830459974567138161539289144424599267729320981318641980183843888366658188879471e+571), SC_(1.31521984951562670782482835206262378008436020285378420546285379263101732820883608949122051631170757207569969358861769005014041362682435194384497463593895032565565074995089647542811142604972111024814957346244370350314824155345964557299689889789136275620641643192836622166752974612956077882034622789825992918310802758209936544891276819168401215829983378362532395170242599025399543486556205575659473596478459784209982144728139189700651481154419757471969688703886902791262574000950576874190220782214559688e+03)},\n                                                                                        {SC_(2.84677490234375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.72689566466928903369179960330682897548652669399393276051386014744186970417602111688859365137119806591088859832663321322407729010227398222215695102957666650134627135155914461176494093254946845109947797743409068713921582654393922007566627403236138483370758934553341824625899253149387175773174177362605215903747870064505117188137039287465190801492415063762775140078423307957143249016089879815130805538651333771471677541967892826094914960669119630992746822126589833180603476895486306392232601025646825215e+574), SC_(1.32223016876171751930127690260362228451276043259080142776611117447635298976971660676277739244247747333941430777895438910603903364415089362478788277431690184319422663659469678578578848717168461859668307713007709293400300773144834887828835740531915123068180321347100496145412025098700180155572567571693915443983163713525244308076842256668577625794774923216939872890130913395498266933038221955137351683909322710506162758145957963091245936593419942473687050256372597219165699935425159945089177350622914096e+03)},\n                                                                                        {SC_(2.85066528320312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.55568482360742948178753116447520884506333782707306236545302483382325926362166084203731171797423588082049753343360341823584604001171834314603381134468045601439167627038340683184109907021569287545728777442875651246709845779774709664705864947825953633312531316846756314737720236116818811210815571964220628751566305374162580922891567901030838489391041424097996446585903280298110043217953454271541003270009577929585042697537856830277490571046556295670110615936761205150685944850347747034901156930884704441e+575), SC_(1.32442834432129311020270401230040348757600194967804417411227993297073014371790990846367592283835149736497235335186397373158162058317510538606749879791206757657932690826284904297131052423557484805453670552512398295173126339157782769777536005702817283667830229401111439636352865461538809823298496358462581458296535197586798441690867505747540931768033354539435076941034258127236042998395398619386143844516720567482048995549927600273781698769845551334916514431162430514635136061657393692622426744518401753e+03)},\n                                                                                        {SC_(2.86482910156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.67209451393488423647199154835085093626261421778388491758395920651729703075118017085136759283009860995120438245740674900924586133972958469888946144913857894080608167262957035021157949891129883305679378840897014842254727111679019908897771315819131280807540919616131402473292648623536641470203487859280265291071455955908845350748609006177134130302155504053800467229706750960138377058701943393860456198675362051432045232708887993066598492254285598962798227823381877440404684498937240963164738139003676775e+578), SC_(1.33243579122574590984926319328585741226431992976092303142686174774654086734221912050969042358695985194274150239716049202901885309852989554520340477404074130428600506536236702077688238199655525742941193655594162114387542290714158400945853608839737264475177181943991627056464409798943099464512348669426468245342830019675941783095082205207562407358049161151187902485056973380397931585693852275309556091706992133402058673687359431588861810125438604344423923096226075975166061175731874132590146104371235081e+03)},\n                                                                                        {SC_(2.86505249023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.30131802710867055802416285405627004944443605305986263864220016184017472240645872115140983470407904672852212946917148540078482946500339207463265403567520374908135573477644464642099544185822754364662518871798355046306149602073380596685748727332010789651405550596757267402346736977673751744188152044313189403529609820760649887511875179928686549497942279718317761533128781879068042442032415413072418875923443795899631304581303173776883445512104657576502172490865494518739857115438253356870867490896677514e+578), SC_(1.33256213922455977812897109845813395173411322007265383882993796689050065344892046472775278678171245623266610779129718446610510847313619006451562400733456071361566843613133299723512877153567582901137929364068682109402160542808037795140991967432369933374079139541609225824607441961330926809954339086860823364451539236061251866540239253822841662056994139018484561055498469801015336435760075931649933637925944530123606696093702091641199180015507732503503040834718390412797954535075284822281239540293937836e+03)},\n                                                                                        {SC_(2.86840332031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.52824176750358164076496059131959812500739113559202367289078195570160918639734830618115385785162075449318541138205767026948094148150925380637640534588880247019836297374103359293587348776792862744423037028443442341739444584376146685372640751241126724536643200202594566638152802905830655801709868901425768475610663616352513776004689802989586450583270754102902968325420768131021058225175702285650229687808615313082741556969466351500112049822288399570954833372013589953205376803853225516137432124569222452e+579), SC_(1.33445756850755300886310852366747116373314568156330265929319022765025679605091832760006042634427097972425123990224057714373558214332987821397493655971662158199108983919037889223963127098202330136136304633778191633740186013948492412508899341220977549020099785225073412219228723700367957957766855893202571654848753962304297077793543149474041199571899861685565751348528770358717632425747661550893912005896139963996406692414907483797187577784911543450435275554396157567812421677650523995011467755600814137e+03)},\n                                                                                        {SC_(2.87150024414062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.03473996536835749844202230526429008906119041929085596339406306381317263063421363014078546769917249668117684990137811293444537056470273926075360164846312867358742270378020980764225417941673979648725203691862834444807280388402827217076217614875045095619032222224689284984869423339603735989032512003759542368506726476221451220878506625835480860209009536185383283299116072926866925042717482533885968333476709477077317932944663303337428332507026889453387064258608267285223334458864787880893263737675861374e+580), SC_(1.33620972196613057862545018474458683508774246429303078928896604644347843596054727019959159727639180583190207966863834316676279406887323600951026914176870661699641609986904094132247549023546751473416822857842431005653467518202034775579764333672215375560261672962691627243289534807356727849454769254909379982435085844253764478068377569207329781055236843240642891614812135450045500490647261251364538458703549087549771761205156461270664993004990880127287398073324604746729776681174734849962572923360447112e+03)},\n                                                                                        {SC_(2.87251953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.62235931368603576744760805973395587210314168683271950713378720952911252196567865355147186057204710095440832034764605460312213725715497048431667726847778327039443061644587527224034248083714553060272185788579571402827986763936335282410900845534727294544319096050890981973359890483671963969083505166305907771042803709137302847083381936425260670606366311098392200245522774051318804059317275427643860440080916850991104769586189508338397170009462336793670429119848844618508684034406012112344661507533868289e+580), SC_(1.33678647949420338257381511183287844313320567831386055535257365475328554305496519960920771030293980187387578864013337221427261284579477331631327370836195986850986581429374989724715718586245126673988663046325581190105459603730601228769927714877805521773064648967141406570859841427717979239688554411762637240681521607016361187193242718598487509174044220184815718059584494651460108260902193436437318293997784314930666732730269053214473092504955520888121967389030757818751397977083873154631473164056671016e+03)},\n                                                                                        {SC_(2.87787353515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.49822487376928593129496991619456807779571724900433890379016922727179188822817432232391038253946481782904202162602152838368852785921526947231533980514604816364664118194409700938666731824534215020170138929963996312545450362432993246182839764004297289618971955810426335741604446550929541921686956699211067433464486824974358064263080873961207543888113027514374829198159012636739801730156715023126639943081444416910170732607243982442087381161459051088358123684532334791232059683601332093922259371292884508e+581), SC_(1.33981660533857141926925380643566819272260171584725198634232654228134827180197337039287759863210818857870527822246113664420042673194167479981904995496726680432320132048846228792005515980585370574675380564601800250316443183159395144153371117985702044124796126435895171646113569474021227567642338387958328031624320043773312234684942560216098500310809828880827340935714150083392053952689331486262202315295456408573437125156466724639958071186200478992889785094972701513151571600988355148526641362547833068e+03)},\n                                                                                        {SC_(2.87847656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.05488333142385484475172231086394675997513598555597927149880029602336592055157215686944121898079547454120473162403818969784561780587409829646247504392438937333878527081074729746707055807781106119400587389122460380472798540673783756469393597940336198328358765912391012719893796119938691127824492393390024337162695503763365189158346405308487182330286763732886461924685718989878827547742759749172444382918249208907202795905711165250423993743454148817205211384215410228405451755126541161105940267179417786e+582), SC_(1.34015795429701939942574215884873268171829288382888259321946097631111617705856662268630326933296580052321731566208579030576247439487978876214455592691116488996075798205203434081869502896527521310827175861845932374667585320301486324405673936118015718696526683793997302764133847612944974467146840256219323504629417706791770176592906004328833751304210817492355088454830780250303083097890307333413326840022932241452011360024877985974082037233006902679105689616851317419865646462378346046207873620661305058e+03)},\n                                                                                        {SC_(2.87923095703125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.61684979609188826557433785440773960148555792324374067678067834299861637368561450106307525352671585573317867164429408368840880522152937413462007909841896465904377450707318547717135578445169164662798065627783140430551912686608583002804571332263659013417669912496006462805471741068963217116556314786383894369387772034685007293610869961471282286948420396155589385700260825498201238850550110498224894271051040877266872421912258435469297969201321900601286747279169221597757038086685692437637136225209143506e+582), SC_(1.34058500380833376294160862615122068848333040278064690214068451080901959705990853634557062938270962751717159291653068462794816644510986319168200062866703705462037244373394257571865160181401419644160859261897972796948215330656254270416551336873357979648067859339304940383975005645243666175426992692972991225022622372254699271228283799777421629954043892261138987364435140375335941747556293997376921219156934051083559138278975404970391878774938430492037198178935947232494412932088773898615808568060875528e+03)},\n                                                                                        {SC_(2.88569335937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.27741314089775276511662713730952852885550809492562065175360622922536441326404367039128777413795090721022687150934638106628044085536081655315565411956276941995535311165878475675560210707191190941944139340354775975538872413921188374762500573473008692159211048416506508286650565395048219704920208731057283266429575656706558797306599764260726777060658654274541773537319106390479236547469858462458615781476042654947282967222646330746160526064130527966019089586365372152408709894353252495219303939603925911e+583), SC_(1.34424406719090708283852098449092651192912931837151030334253769170706457371212899336088630689782681161596126592790226138758892991724817294626866326137374819653365275485198027843272426021845574546974020258425671147145124463062447922403216960551913842768213917736156663567898484068184653980953644017738392003844971368045836990248784629112811882601436186180470639258326211954852039109234766639251154066833651535312785555213779024424415503778104636556624356299490075804415075445824369005752080160909590418e+03)},\n                                                                                        {SC_(2.89466552734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.01178709497846633575165533850964793116822976500009300460736484473906170654242473212160750081881335619578631480862662045163056219988351387754652065630298571387779333809261319746397588721052457496790954620979653820354502309519248134279375683394749297528557515237334478119352835566833184270885227059153740462954718070282552097217238130663545041619512190536745623409307049755143899396219233654553047903976192302718046823190984233338148151019490057620084073666415333004114164650667291546000971693948968025e+586), SC_(1.34932658266278691125859195957356839411956915699838787964270475180585781337904192843463069811989682751105935175120186948864564892651741184747232183683168217893787273582731706152927840688445099541626365323387592592041451846704444548113336365976534758003932783295797338006880559885771565077791261519464921959795073918357492033133764272360975900011607333798512551165276702158609418085774985022998054688888774296419108809744097027098104006421214236914004741214732590966674674694137924684249925480058631236e+03)},\n                                                                                        {SC_(2.89489868164062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.15468963660064415115584928103612267588077614837764974596676794408194592122185565793366081442594962402231039476916282301481556320279102010770389758954453247008452073441989922664993547819970643883248670436781951311258914960269324244050041217630215108215185133895912128085457556094388818808134157121883961858147812512976161910464056272865818289179486083989079475337016803144989786737740357104787360356449862060721738771491736407919346112388326738341541162845086084757313997223473584824259279211478804411e+586), SC_(1.34945869608947487230347117231108718546669480068803317382610585033887701772499533330299929944260993663552522728552398357556711034867195034208278794084259708811695816233862643367643062820601016048591685465106412204058293624776401577561087203181177900125125258123672283921830786496097423338541135965015952382557422338835010198858944846902564944793337215652278621428765504515905791790356949439200150223236234190140334977483438030495696668322005718859526062624691051817763036420840472519347075855357492120e+03)},\n                                                                                        {SC_(2.90308471679687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.19524147385219244470132948164768645952387402659176644248232649451332495743225411640806568136577825821777152429787665981081834982965099165131101583405324558957832981364701487772474908186677859521942227871761177456864386077274238636801172587366265694365060499384529511627538568144917639423801710131654895866193991508864772356680744834944104931010934233992516879850234885949044906537343760076941305434841384706369864894114423618730043116321097945958350135127872220329620305258329256908546446817698251246e+588), SC_(1.35409838291563810816734756587973452552312498779625060316470814688864881373868034527316477758088674167091953141712021911254039190874338424718456903461041158566566995442766215323510346525251570992128655213783112880604963189741218176389237558401685191050423694189828428853338979384514574558920844441337526170157218977419725134868817733466328638260429425757730703990119756802378165954215271111925226146883389726423674228332542752122313142235886856916954004866568682712083092292621624945180865855907762336e+03)},\n                                                                                        {SC_(2.90592041015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.96616348070008064874616373287210585056507562010636620999589287370494994638712981237978044380341428082759476234800084979754154002254920793570629961443320536090682866102046046605575909343417965965786863402052114762451003234336963160321553061028955902745093007093806222194156890643879106073816537034619581310858126533043798203665861839587148380330784779496490854756078878399132529809488407011884977108694900450342769614999426587923937468534874115245202200752981449160856047469289211964379361040937933363e+588), SC_(1.35570613876827768573077212979918905825378195719256462745557460203157514868421975740484674201729181654869722967493198246560872283580334178114340293621977943603602674782963512789971087589677970295984233970171523356396353278946306310362716981717481409595008106739028777907840661397201950135049887277277864573168266510836965789963844289183363238578955127422486638618731886638218793161544590084681455424256159437152248367727430465133782606865132096602171707784451542766396026631027325589191849782149383204e+03)},\n                                                                                        {SC_(2.90660278320312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.78487236270559134372523056104521703363019577190355948641112828564566288084234508187456635264973625453609105185408834058802436811939053506425603401091142444688274416257771964890378696256189219702739844815243612702841684872668060505942578914671744054920303915520554542317257099862559900332239128013567708139174454799160800799479359760388823074434936809008038301402078792504784232356560038883331003424937824700805016404899595550493738893677568049586982862458730300726426227556043240232968934551456121231e+588), SC_(1.35609306587302902812608982250575970013655426141478852856735216493382332135628059973769783658467619298850029115736641365842250969915119354961287889178459023534224929246747384311345963439486525054390823839661530981177867422381755670042005241994627896444983033866940424048264962218653661730132248367451464387574438560953281658326212605514731096599341987987954847800804242707347529099158826463446857630154506916573407975685526655366112977283388320309871700245022364864208623837308437148184117729373307138e+03)},\n                                                                                        {SC_(2.91177734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.65288544172897875410770232714425601825349427018691148029711608937312937110686432284009751145904244201679369890051895293597053443763047327488339669082164625782135160805589639800451672460273927756145545818554587823518713303746905567633417949183694304856777883735871611818181366535964619214875574773302753339939177908635890491874410909484630978002726242333092288199064599231824493483133047779107704498836164868091080313847473536278000636310060789953287199874170218094292264929075176343559218201978952107e+590), SC_(1.35902772737967500290740961714306170488896006477572595442680354958201757864757179384628434523781484152603766693581406070106863469929795747305410914816479507021518947006516764660803698195357271682898832241808649413478488026150607720256908884879384931441726651471512468750875240490014666611569828987242597178730792611073319550629526091003900086837626632934430727458829037055800608764129229909092363132011276878495404850882563836435689845740109981738759761066122048318825494125511548330815838220808734178e+03)},\n                                                                                        {SC_(2.93100585937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.07348913872552172438060537336170695465982561385886208512743693117832018077732199717190905087803442769798857774104262030358670872208312136858881211410007479555674339961299252020339682381441400147609402774950129163689293445870814413514269880409238879689669427063972157678850536572019976833369618099902132209169949898022422684069830381857850223500047547437065129388742129657954201361385942970743137393521891326992141234907520915338245404861689565251029578475667289010283668986078095947652654070110147402e+594), SC_(1.36994090211866285156780417655232681730177445549993872158956285643436193188785726991369168977180113887308121341003284593858747631687052712775116809792901903101954218175854827123344938870960635945662719476714050496919288772019479564922849963750897435183204879948753862050909808470755427353099908579773139831785069425719334923580159855697436929336266308377470879117992764845234475018441789422522336437432447449357161002266355972425539397318564426604501700562220380876996017331818203139894455896402617874e+03)},\n                                                                                        {SC_(2.93924438476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.77518107286160192975090619348685174723133376553628978514345946773524629460259957306538236431218247589719771312904897231994673364468832936192930648763261752675406554510421585015960517353170251556580035420434104455460987866698271669391429345869792903624251090234888718896512101057543668173614915937208335613310325271905764376677121123085953021174362707398232948259813861064687908746718001238533382117006339455793895982425669115368795569623477820919153916207594666818615923030608437427654845589323915978e+596), SC_(1.37462056205422900177131768888032652216284107554571360819616514988229042546200969659939005358764415303560171951617706762255367766104958031804213014382297422319688298813058708235551668193649903340288755189361107742227218535513218626025724511923454804888841699955879956560431857964054712383407202631291071279632670492761422872806694902505618351331177643874679503332041813298770798197598924991078718392181492357382522981006972272024242659399685114078336370345259455625989793711497515795188040163459176258e+03)},\n                                                                                        {SC_(2.93977661132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.32267646091032057264117479996725962524063346984656353737999020878114540714569282911520863318541695168857271164281834054963142403874455537714944794610094817847454389534340638997220111815960372365297777509351400167068848566151722017140369087718396312056664653998858312885922892976462087886956556649717842241242014839711124245453776366990487019310493671290294468619045840033136895236436448767316750131915201026320220829933252188274405549187295208028245090252555079871847589810273006546970939284455610907e+597), SC_(1.37492295782309449109513125899561559012571158869805461774571128862623508327145154344308277303363560712007750147659962343399773292693388940576621127958504002159547486877127912389989264297400117647989214449419964322617476628970597202261690056630970927254789905580122873272954213658268918564331212372900137987854833084079076994612249515996791251235528274811463971874437483786205972286614118579382608006610450261782073705056773556763556901941104471584469923293484169254077441965363686099895150541876731096e+03)},\n                                                                                        {SC_(2.94332885742187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.95612658759241235812465447721400579291058507058997368439216719564834536617474972374272572743444878958103051493850804833730870744379004716092343451340808448900651563697297156202048777752869166430548783815369375498220508152458737361758440629525376251935383827962247422168872441382301877187549916802482417911130921502426517266682801257699745449609311421877941760615746101613079091796208143355026398173271348541763163751403139719101046525115040043357542232174700518755249666544791105896825235042772545175e+597), SC_(1.37694148861657372633221996636644233713118716362968775446059082421308752990492542112655016520127497825665984296675173284223392313052342248632938493608819811335501981095114726508649312723116398159369267648990864758183952369369770445747903784567043640961953376098996368833449404655587344899951792926546929552656878941202317332213546833149925267669280727273985344675937684787347730438104026654247170240234408656098467412331224560588064323246340067066697094595718870646857370782631751254388800755295550947e+03)},\n                                                                                        {SC_(2.94516845703125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.83235121645327978963100817691926829574774836418387041252367869003738880090715463590796702022923992217196258528447889299651554001166831682305134686392526769799710803338014777454610533469989652589439509433566027978504843926482018342141188460069390234236110984820182938829956147486561100168203492916619577077303831865784265002705832286267366697360431897838814586852773697832092310576413056123995483314720897488786618951766492245980069150290100881986063379460507766715485056297792098067046256423617545148e+598), SC_(1.37798699279569051539268484261116926029249691596018107627105712272865541497115761053413890113564648869745670969157330919268443233145801337544812367387678593100800097721720770745161522650305518636162761571191979553292900507064486484516999930986293880641437193952931866232710654194575975952948419442840279178032436129355270244808305285140265522939295089250885428468721564173451421499662803310780563761890258732979833512086663368327034867928424960488053958458358767844025973365083982396983240716839739453e+03)},\n                                                                                        {SC_(2.94708129882812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.40107220401845648858321104921071972573843068904574581393733823764249546522923011085269873691590304481547442413231466634293352372853447729039818860387039885562468765763029502515714810352804578440883191056457307887255387835951907496031875719157728495199161142225637130071543332928278068351689075504017772418057823100405861764373978896467017120010559182064013052751961745831965825831898048413917283981900769888374650265549295777335765364301044297505547526992362172175418096483649733236850451843545679352e+598), SC_(1.37907424495147840011273728574087035423995148549659305757124254071347258874590468030259998751169547830863350597609563279895276081581854639206865023478141526629575485808136675655986575500400042238539109670504550946591340944369138810818152137953023879474665080231350201114946254983398873840455552474315302795866740788207662569448783820137343972988100297969962440394649585435235913624950263561619116962468992081029657152257586899630418991424608046084216708981450979535245502060097857018787637261038447371e+03)},\n                                                                                        {SC_(2.96237792968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.03812531361052497663902185982298310308174947039421642629383054705158980857570000458751162587598999442550969501344877806292995852725250408981631253697860552855127163779760351868802023611365392677631530032588967742210532444954526900204915603366790139056994017643045361160119941439202100034220334699283274680423864899468223399998488863722189803540528163347927832513506417644347437949876996312168002483041770887790441736368040946838609461428279363030994693956970178860973336803161860812605096805474454889e+602), SC_(1.38777326003371869620392442881659394314184212654519691976144430327762778605149231100358508014213222334062848724474495456377030199975247208148834458623282063601232042599945536939628832663453797158288206962000090542124297705754102560953238816317304253227969932378536387535488664440792357469006990375734638029351740072641073613441843630319110670684134528780043708170928531783433707135360642324541558133958904574236578128175824492672273103186878977416365615410335993463758678593509405604377846659869155365e+03)},\n                                                                                        {SC_(2.96513793945312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.42268882268952074762792640032759328684967651571243577207098863132733263996320938386643715579579017435978989743411936374344068146932966097272344712291511398694978342948608590458791621485919292779350971700628179667679496540992018470687014109130452657520265421986902521354903018585115809735769773228190274125898973941140028523715291640760179162562465935017483316456021894276548188748672753964780236343206673327046312655684711562528109787810072079323133569680198034562869753881982512229652220972629440068e+603), SC_(1.38934368908253741931372532546702657934556843402551609189277573514421266149793760035791925112950510679579471877063730809126997864933380968782048493657543835986069494201763329457384890314492279549032110236711683011641117230487222872313803153286427155320725106717071421980538293897275039298230191800669234084056995408670362718824696655215389113392924262079402147150679681476538294228185954406608139408498867983511990563329762366594282942222249422166763420544819861986452074220220324342192498318092885746e+03)},\n                                                                                        {SC_(2.96556396484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.08733061572599544893095738566467122339497124976043359311145114037421107382597535543204831452129395887668572437569163689906023244155552696896433330258453010207813264506542214005957636106390199106891767284964638774356885208041408420667674945789610791509007783885145825791117492078793459984449939239069745839444108063354220391076063653936902128053840086474638033185257395909515727788319705878477916754725675853953182813578309468305653020879049779288986773955413261955830503222456148390770119607850061279e+603), SC_(1.38958611791455538539140025024903036538031954018499820241928788807916920697641911243330441981244344101704951338126434370919427459996053120718181215471398554261097292911510258611322258727819892217553084395333462783927901967145172807897271893648569891446024935790847528674105478865069966576665239532737860234449110568683312347691756466158270802883819994063820227934716748200182565368696233038948342327904478924568114816183798706309654091991387545998978688522428533958731343703051205510768373092342362693e+03)},\n                                                                                        {SC_(2.97032958984375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.65065488914485337721074521730378317515528229628211789543577343397595391938174832606127820734515276226340187602714937163390715058743098859068633184935898641707783987761133325136500650196760517011958526604789366334946247482909510255060404724687386577726279625168337690865854633129433528501591646453749002858311142169683755867562660678042345855110053262989058121630574544176603053777318271589497620317692160998865399367406053254067650471361244321591961589295685879444782367679684369199464630864478489261e+604), SC_(1.39229840421446158414059401187132308465849144532326911036850400577521133278416325647276549435266209313251580715048230645844396792187212931762819805221020008127577424752135079336787156443980414454085239925046645933754290102904357952168852201296278316339038023098146632704584529640698621272640939910683838008414574922690407592662197907916145616287751826886906546495409842041562181368365116016838774036741578085349625325880779969917664787935921372614468570811677294061895714270986400486024846188318150488e+03)},\n                                                                                        {SC_(2.97864379882812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.28875127758585664775772369274874818401612555425274337362533582990582452925126420407366036043790662099943119495044383901218555398621115723235238928105653588409977146642363663511822358973533155725179276190312086270135178126404634590785344074034531234013198254897678155721810803017572426750846395839994134507626212773021647810222310111491792540190659531837723333160099836715085173957624813875616612821165865440901899376346278715166145438811148949341025193888325761385753016316823036695320702455814532570e+606), SC_(1.39703214851901049022730852986132689400344353670883777626738203137218619923608207548281549143051031906814767390400440706239659220631609341726070691070420176759632763659935375169277291735366323249824862378629001071349370181059513276997413810375233807216152871265647861415532162245231919110084386980394699462489980738391925491112096295812580701854781624576489660871399540669284901636240871074836671380946186021208235418266668230761474074744982036539036786575812798817601971755281530416514867655522337504e+03)},\n                                                                                        {SC_(2.98060424804687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.61531408834500580532772107043602867378318404792385225424543370217147879407674321500374911123927570357277562524697982438259637553584359745286933795118383404986552639498340920075760638753755502412453774497591004259173728022454736997493074277223895857096584808764955869835419159070254683890288630184887315794922759550515510816638669108715630198832675023654497491609554019113095252440785879594593167667228731692821379267364932925196667801205297985835969866854522482571646694590676945179339543887228204610e+607), SC_(1.39814868086709855977134600387840438343583009672475568261584953393775752729727738937123850138906948368004636032605291156804222574014398500926173351016908140186665959288084045641853830719487264577348797044673186837903257068882131154301224780038356563500545676816291258687767861560304780331302852986780045909398150637259749617748094043327095465488708977742593706777925410210923555828599996570675244242281042710938814482064622965171204431371102148950469779634005498541620629267498792772123502257932713979e+03)},\n                                                                                        {SC_(2.98220458984375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.01913203092977523280798922135732173498586921666201538424869820403397021600598336952297001121393103996753700542498707650326540611849768481692179717994242893806885476998794194069177402969333682804304077419313651329920582994303065174179218201467701455641283135646814953713752441619485507729197595816610567605231679569858816613945496013444813775087311062863524331036489035253800580130826760243342656894102452530853716104597137635561147441993697282252144814718162145119113329588056001316458991522462383674e+607), SC_(1.39906021741400012029338130541586138333662179441839083641847107911711505118695512786481488377805235221735334811404941246813329213578760870463419267543931597716815993356185010958460750220171890471303894087628503066112397751519332692654209127386583618306686241745141251761759667795464413846509226397693885965049803383803654466698341256620598200487751924572966951860386083834483840696255431542474166307319787972505783717380451523714267226550702752068744046987297754855271129593224919642276008709133005615e+03)},\n                                                                                        {SC_(2.98840332031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.37359841993752752389528450284952588719032553998539093362923427163165276024392153451598136188470553429960467300945028533480912447612482726879636453056079900519350243066627735778877019724228054785376733281199049657751266188715082124548224606743572715963969774355758677695418580597446243619358673177073028020912302484099213566739309206579083967639513232216832100329448238402774060440556297715019456445133475901481261857483140680673267723791756112901783745647254025067495399407661967818140243125299861096e+609), SC_(1.40259175551366672281814595130199410206726729048793535427543493341189776121812450027289243449216527426177690440806453297479911126820442254294041871764078115750415836544057504032671813463168789593968411175040793172851484985271562547310812254585311571787144326593913276030237458872331063762566380120718695914932132664401415837970084609712825212122574426747001629920494310178881410323419257000590706416337038146645031003353012865121499434464278050773933392813060464002111764387049713996501739204866162870e+03)},\n                                                                                        {SC_(2.98938354492187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.40128745781682226203298236348882106711204113071066790067117306638783919196024362048227271234435781132783597852292146590334481038234871609134432585632142383860946595598143957411326129473992169530502153830116859068966251380887313781290116922728446436656897956438795664875165432901199002549538528328347418191193679032353167804422277652497487087572561212728720626116567371242871992837438704365399851502289431526275160228324414200994435018638728055777754033817606169040369089679889121782617702940071870648e+609), SC_(1.40315032666765182414481479399344070753898190684807352041095511052632440751219673443203450724260245162755643217096319709443495890300349565793981782778265089445631678243647078286176671824093508710391601904934585748839861643245004319166749889346213348676303548594053569453927749612822683747646552949406957321033730622162997905829908280484876755402806887983564631942961328692424552970134733664909306834103499207367683550933062248358174018199947934705320477995318133774631674009326510358690314737737744998e+03)}}};\n//#undef SC_\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/high_prec/gamma_0.ipp",
    "content": "//  Copyright 2016 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\nstatic const boost::array<boost::array<typename table_type<T>::type, 3>, 101> gamma_0 = {{{SC_(1.43156441636360688183664865448643158739330056363229723426222506077465368434786796569824218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-30), SC_(6.98536502143685108617882284090181520784225065279944459321343460310063824042105596746205061501871754388692206421700826292338586923926227628460021980992867287987375102820871203483062060697666614954318393354992686094982543110966849877446263308176165064356911280715433887048666237697473022869255273999217684089964991492221986910024913642477585922789463545534969256995761341961043378489622694491092689099559034124245255841747358458264103951568451574298386270253381902108950381976482928860300454676297330631e+29), SC_(6.87187849460716195307241085972306257332085866067179593404732520056618176287191986920381800623266452019036583359883694184875415202170061110761480957915606961682069515921066423464205321804055901215315467103669400564886703708251292818882278221076111306170866005908677608207802396451776607673326647945821489765973119269856654977100758235960633379767322574933089743488018675093572248899118887185116534963011794036363538903828089102456817460307090409752243309227015705466471210473582150215759294410478127318e+01)},\n                                                                                          {SC_(1.79146693234808763489644628257161121326585477954787539722758538118796423077583312988281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-30), SC_(5.58201763003960861567789539135859580193439485454005702914698335930268444742331582630745213615777247085201364155083693868300803234678816291383457578463565723759685983298265642045770249117431149944641399014596592494299731209900651334858910291525879151363330828856538879949073338110312308363596227316892822743368020808448586000291704754174750156554217552056937856371791137981786534012294619836443861840926728414921766784846846305707429974243911452854519547303013841568504048941438592827646572038542434135e+29), SC_(6.84945179903097403861349744215875103992060757962123025404796608423978602225846553619170965077356955755357802672163974219562277828210284327971512344158362567867847738326049609853308815256769082679556958330239424646993080494046302980172303736275513780193302833410723002758066285468945113082751363817936859921002909109039191137803314698577973722031573009127625727285778678734025455705063199556191858178447008447936782744160858096688591534358039500459582424936993394926936663017800067374964851005923319757e+01)},\n                                                                                          {SC_(6.01361845021915553684662812684153866129482788357822620195491936101461760699748992919921875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-30), SC_(1.66289233059599382108622045278925250222879368299965805063800397354768670022530740489524286087023172081743657291575193949292317670513431375657893264047630789615214924106176337174346019293635258374337002078109120613262494521256415816444259140590129490551962102684902275473895987026116781659018530303429482685495372173326818893646289757008674753758860465244922365484215329043013694653249383965600156071526093224196543564395256619974579165365709216420397501003922915691506013990491427372931318956493080999e+29), SC_(6.72835261508627487441809388914618718039806766838076765738449388127304650638500226155393279449547157554874214601262165687120232963516589317117744273330309623400314525833549943284641956342219602925993192470847874648719472012633435814459477730435577468888682456785797630097073380249832077254791664762750315685378649126380990575187276250739357550980693771790622800409807477947479455730830600697505092486997466317766437101841783321172164072094610651193846740792964214770153922331926924938123871030133738925e+01)},\n                                                                                          {SC_(1.15805324961653822428570241697281798757994191687720197947442102304194122552871704101562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-29), SC_(8.63518150250108277194016891306233647484350850467664211488828521671098276856027646738832798460638738889745235576927151073499175108377545838358386482265787302310436375999567002230935819513356910576887220572360144418394608202135272298033654003052182297572299115574956232437725263892943148991293370552472446011183244210703600281122859489582978101451793967074375924992378742386032880290147673310487052110730167491270221379145909984226467052326276061760313245928809376103054222364829784917100855808316020815e+28), SC_(6.66282273346089416734535625179362666621182077643990467879063832625680227791050206585733185502957596233314540660483901760430911805270185678987126994680068402992221525616904588488441229909153800950377006070324398572799927651884646302955793101599665239041508783676953386426252223745918060631306977940834262621283653711331967519129060500243592868823804992668473953470906948420875648942763002156556099370463527314476558063517916220321125974741423139110495117826462394235672451732466307699999303905633370100e+01)},\n                                                                                          {SC_(1.42245694944417038241730866879301796566459337427951181709318007051479071378707885742187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-29), SC_(7.03008973586689712434453706188967052189544377452251027190548933242786882782597583872281928283881475602762471967697312305884958111647827996819565671460034196076646349776435256364489761767965592316774008837231548263375054937427862888061428112304485964913506427137973546426799224557859735091281967123454997149655374130493654203587146086260828222294410435287918229997913562020320493066804583330730837073698808542435953750233088861767005232084367280435329039878489987209426255343649661690999646366391423086e+28), SC_(6.64225820742780683535257712261924121209227913749076443473890372060519527816598227736042607832909087984911015926106929130360483186660465408894557878927354666930836674850262877191875658008191764865453073508984311388701881734517396030408218265504769496117527926393550877643119833107884441914845938545843378909648403549025956978676004449802550052939417816321088510807702282974630203123683236264607529541476291560195226774671285268000217027114645279781317099602573341146438849056594216426188392209461223262e+01)},\n                                                                                          {SC_(4.97012101832753915362870547787643979509599986062878818060539742873515933752059936523437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-29), SC_(2.01202344231147724230810353716656887566130414385907540860402251559475890073645391277780480020189554969458171902799377776861135178157011979373269790864340211440027520775401007836782123067346497601513358857239897301150526329963708751115670484000483500722297344616098324545158500747555859233886573924190763930230809498621227122379869747916191366861272145295954082819043984946331634617739137084318984472461083170724165845505521971897573240355846211686074477671195963638013441293957127903234462875211715646e+28), SC_(6.51715235072511457864378388754998157435356973715673258412791513444778374479836727125230109590192077325601920795178505423399615183618242933697838040985779154418085424257031245674733493517221878558879698506150447439006049190511649430013973295257187798595008470757450564951138158522942211934575884784926138442646487836912254893171857625559424638068958366192061382628054238930763500818744359069789679612002531155109612303921215254254747694195676813610575246106335880547522974750286496268913709809509252474e+01)},\n                                                                                          {SC_(9.66007941505749759175817416441747844432341024711874410968448501080274581909179687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-29), SC_(1.03518817706743243919823284998017787128647257621455912634163869070166059872671230538431901891097497439179354992612162157669426027906636292231895643723927703757223460655854516477901321769519052303126616273995428548985832279710011127934672239520409848031206199996350739655807535213912727774552045467776829721969059974045525292499046126524249705366001360881203124736372820107025125261106918354118101667092609216938740138156696613533257159162712186798710277184296626585528266265769960723307483161365376229e+28), SC_(6.45069658276162457259303572398885329683158361494024827181717336146058546986400295243949312741758251226140035714229464147482260893374857925924565517856610305565502975329832388352253205506611318819270307820107725007303695608214479732517695140757758354226761553744330994156337100540242975402121772398848516182993789845650062348186821501621405335217798478394612071716443631914367377297227176427909617300917373609884768866750477406306294818746619910517952227127526727803071073422415549147408253665298301300e+01)},\n                                                                                          {SC_(1.23292931325318213137633109542739196875415141549381381480543495854362845420837402343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-28), SC_(8.11076506374416877382537129208031545752074797419842750844528587451643362386982055323101915507674024859960406340146989444652626245160911354305121401560514918118286169465374662239310666900739378375958129364148653331105246827262534402832707407165597662287434176607244865340061287749891730809236349890319758864866554723496495254063628105477907236700688483571320960538771287714513893495299885765536699744850957588500735883090986629317497556750278199990341833620560130060637909786621313289257460639001650831e+27), SC_(6.42629897103672909988458723024910870404416821898215222127400022516539410704531383405982899412381871048426582739992646976069868034841151137810871632844074572909965313276374324555176087210170807432149288863515134794938111522097235775211996947623050218416749855639680453817148045797399149820883035794559402140834591578682886608367287283427546427869980860693429982414804171599334229599589490584031942607532254985111818673092821904070864890840147766974757375588542457697599486106018224639916097437571599819e+01)},\n                                                                                          {SC_(3.29652280413527321597289728537034730709403803142198974285292933927848935127258300781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-28), SC_(3.03349941564355360012064150184228595706904820067783154892030109296391762822472881195726613182210189442955174212546738337284886561017336690039432370715941439412719089329892531356865265081975064636232370994677816511211572902921257370348330352994628809490300819077932611462301055106584074350770615111880273573943059035962668811432859854690471774370491309454815309809006764621402491823519351139477097886747251831199460054088808790491284984413259166462592982630156453579922162794986104508307975648736654540e+27), SC_(6.32795143866050323716760133418296904749863732946975200928947118578322607994583477068450164307701602413609648444048639207929029056223035086133893270694677420843751377393407833586002432242261752314708430347057295480453578837209532569699006883030625680960140262219134646858202581750831824382271631031980228590555215920432590868320228606184600039560993755754788437087523337075244902961115198620434131953515679906038170612236824559118585723278727600502113865815188191107710031491713156376132212151995325781e+01)},\n                                                                                          {SC_(5.28364435768055252017009628713605422886039151425530135952612909022718667984008789062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-28), SC_(1.89263306215217388065301450837422131624429762500909613738277870523089267798630746568964190871771157247405784615737404532079180608133788878517212154426651108760035114597438980870405792535468966738754609913368846304859794971254949645193988742238635877174034183157545953026521100953857513511469947369943288857923008731164449119832620087394383402735741445779931513137986706278546522549426676715586900797211295600476831080380451856593421444600033324608401914174483790915085395318359941917879811363209587464e+27), SC_(6.28077665249491897691049827940636540970398543994861233169099871356964217589347125478155697980887940866179062958974044155963995941441194575820156444577833257789890482265650964581797191647152323111036866463941206128044651251402305746085176458414290497006593109264627423072684766714099596688313036477988560744962758440194036696643717238708853234985639383334272562979038431089236482058749177876773587848544135873987589282606791220573117136189470910455726053001892397518963850274607542910338241721343457177e+01)},\n                                                                                          {SC_(8.86586057273120049620324386849842094685003081322438589495504857040941715240478515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-28), SC_(1.12792209148394250283821637021946106530198113703610911095488337733749683357735288766824599638075655918840636782440721083365515523554739468482924768722301671735596891690745164252007005619188503105228533256226946150583868513360183143203542320141069898108879458118152610755855595193019270900648744728405474759634285607695917755572614881162868983190243597181686385780385043194947192656483297254721171554847487312358317557282161067168244426453811265351416570323053082026986937719013776178742039427104942286e+27), SC_(6.22901745936964236807423188366699491237395082581362863038475204196764335339422677682424533021060737567932462267191280241127353523262734638192900266136858588339878538342860483208191254394637373839754873788419222515574108790388057884237928241734260216993505146375338473328907938233508277422196718935311128911439714419720575361379606654030425058941565427488999592176540230675586731103811757799195001504320404652187910673241283381657595695105566385412255027821045966205549848464433924669316746507256885131e+01)},\n                                                                                          {SC_(2.49966909705205994304740110602803937055616662066270805553358513861894607543945312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-27), SC_(4.00052951480390792753792297612547756446636308354112378451456968304268692528633775519125653540337556139742594352743621941853552757231088824292247450739114201180697920406873694369842101729381223009665109087920683089903813373384379869972135737762953748899884850561862020898979033509177864717063968439364396918776475551700928193992691475593786044265808700917232151033008792097742668057139762411818451641133325103860432283894810997209741497147809418396090524305457199005071908197450896512609552069520382170e+26), SC_(6.12536391489047683456791920395172307654373024181199187144911145425432965478592302886538061658534635912284286031438597728058141651972777704999971671030797848009724431879789343164823041816910201631030249867326068929534579895965669649438343390853080251794078983618181753609923762928472591231131609267962196214873011951877052947425588001178855301901711271913497699503029013954248204210958479220752097373121722687614004482162043568710684966204871567240274381394573742635156718926230757319557118639628439420e+01)},\n                                                                                          {SC_(4.13105039723262296431436267163873604088076066376267192481464007869362831115722656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-27), SC_(2.42069184309612078735610309396289531456075006005701452319232308780898469481899786562711660638975498443576891437412380505348319376012700732093473068914701828605341797891307189106243524744582901965865091960195620144901563293848963647400347796236403212162016330881728652090676262972985324378411000114398851717735569482703793791472186452067039116212437053446977932154280424530245898016181405959157039069608327504217006545118390787849039405560427420843900632344217146363244036322483055152244720350520312732e+26), SC_(6.07512658027331975479577088722915968953877892639195256368947344929252315379014575284754474798075879668931747060129256164633934573369599205358256458706635358062235593480105093770678843815652602539307431543115040519794608689731244425228894620530188188065811225372150482460249371284136442858221115772490874167846093958384149302455707825340823690871444826129737661538243254629158931922087992517687225059329004092487025701375624298827988692231490866885497114885255366053276979415146569639295467508175390497e+01)},\n                                                                                          {SC_(7.67973655713747804159297628821628769124011532065665619484207127243280410766601562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-27), SC_(1.30212799952181823165140121882528410353551267300487990139386626525325211291024568030230970848519462523321250316113910391542233495172804953518059438162757195427412584355171613764849732449793589808648756002181462999052595392577807540209762006753250735181780410531193269824922742158457533297763018004418385433117806616100977526675610500618779766320207731845672476138902627160544984413741977497354820351022582824220122963569820651479542153114314134607530615386140027703759180101932525568349064975126058165e+26), SC_(6.01312122667240529166843994063021266541288260960290414568544325404195544575095829794041035120469854123574649673981547316854462290304396763545774453073567613797603142297644704020352034632426024680109753030361110840049738676836013357598960559784241302812865391854524389664056261621870677748278809719438623073587488273527342019260350532258454443364272867066135071843918273298351325211729169344200131324037636430369715829612165506521055551942816236666920875284797438923786575101586645401435561328322074817e+01)},\n                                                                                          {SC_(1.99929709006070097053663358872093457378141950764316447930468712002038955688476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-26), SC_(5.00175789266836197992253524274830985249917406243586481928958356437141598411984138722862492208659648540426313645171261046500070366734305739654716860293908480183345282315525066342879659673808912526681216851816527758086674670902923821816912492981456459220446807092272059870287398917856957814911955087942529906020699544749520437288684229226072743323074045476154958594811061595567355441543116054826269870495160775013279838715048442052026193416237173077956430343800236803747119123474588037106300229115319493e+25), SC_(5.91744167540296642932633105438455466640616516641281944106250379983760813618537924832488310046560748278519239110324535565544143210026284763893696541922381258765648942880722642974790705056266372562023064784175361677559270801762988065916285030771581562373334272877335535222265668349615364410562602776765986836342337156864942547577113767363493593568061040388382331590689156231846893431183969526225066656037250767253219801811525307324434690649574834704255754342306560284967752740251238298561968659075731801e+01)},\n                                                                                          {SC_(5.15147741524697845975412980082616359162571428864652034462778829038143157958984375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-26), SC_(1.94119069034500808603652466533066021838567012298869439701340945032173827546064073709628358298435505063869761045803662384531648487567393382773594440075435175724183604412243156694194932492028878970941961283821446471330266254909674918925098980942551328647919533502012637100674140444753442826674029392350808309173674621706803567435055313380241398358750606063235436398329157810706396769069082270097287993911924029918948917243632827735362569726563281278358132173640383259378355790298494643627193841009125610e+25), SC_(5.82279288675638227521744581984472667501463857487542260681762460523386320409989607920181437766464159215936294441689087772286732842238926045596412700160862731390874584038617859265714534550615456175097106413483539149755980595702034247039218440752863612649821537138773308438672246983171497554091758620898857991717016801958594108321529888222047270727588727745793441847528628771717744394905353164071527110746942189167167910378796313989630478491619937958186173400443704421577577652506214296565647827659664193e+01)},\n                                                                                          {SC_(1.01200722207604382263949018037021122481435020379336719997809268534183502197265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-25), SC_(9.88135240723468294587520823096149819619540476689712710623997817993083189475816383577084956312949922972156866572877356452911798009387999009526605954163888106149571728467821461881641485221579135727239840228161933168563012454259847186432292992881836215442485054048489450902048271065397568687760395141387333368815582691028472081451393202540812412060789893208592124641855931693833129410253652436457888009028232812205367434613971048802458771917161720241635834784826416484240215260071905616525517892376198493e+24), SC_(5.75526916175725540760017008791674277403750658183657019667573395043965482862223161211434510621020178646998074509782225975726388192488504530392658732934512207024506529591122416739406187792824292457201619483969139331538455509702323358241424076304580592500270106222576434714589313899240402996303681999603577990188285524562004708292069045649249373724332501528425003869718292101485821916461949819884935827385813682080426761085178755516591092075170285475651907581965934227857501471685138069598110050036387246e+01)},\n                                                                                          {SC_(2.06429269589654098179854645662305491103302723665535722830099985003471374511718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-25), SC_(4.84427427364262875842177793582518195279767597643060376319794648994297827081054097195940382072797039218621065892526441246106534412586907979155363395093623504721783967370117346993663134634720015066493921311731770109109810916776708584865494093815063529130112517199074056968525199230121554514145114301260244921843558589363080736372954820248471209753932824991565235931747363147022272578757977659537120808256136053752131562400463651066011428784940346704179494919962842998228211078697496029314646389388898709e+24), SC_(5.68398396772585233454081243163015719457273127694317564671579909124104470082415630897415329078724340316758032857229084552171453692626527967609074784678664906070359314921191268418039853212010471717205985371362797477808024589535717680159846557085388955229865201914116328556336605417711822202289369410146331697923086998315821256230168984504108244541247998403612502502907727077479891826525225618196587293524636550350625327996139236466781075913080290453906357687119354962653760957324187035168960795482516167e+01)},\n                                                                                          {SC_(4.06329433289633339525743443387977341628436445120087228133343160152435302734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-25), SC_(2.46105725569527169415983887680710324054112250788475703843400058327137510398066264739078011647200558087326350808351871985106152690049359086642413238317408836089468987877838079876187296081669103803784535166355608455966760897587389088115522647388304688901396509685347705021509288980827182717349153930357355160998461433103157942190593059970182220422601313102141445390082271181048288342624754879410555438595064913555566952651043246646544339420386855070326440604309211163343582298939299136028028873165480769e+24), SC_(5.61626332682108543103894914638265205739494039591792063561869770530274312850585567765343945280850219080051628164852842207643000297697060102013357499398606383713775784855806022728186354069091978795877261624547818135305576719244903321101517119309704129792662326041351319265014075608624116830962662681594177248456643562788865593950429324530694066762617857478074607527695679287002457200156179042326635089136412749258440888089649819236202364351423255552506804629320072380909487742338753291737755545443775797e+01)},\n                                                                                          {SC_(8.13819478186073092670198892427626982497279595207828606362454593181610107421875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-25), SC_(1.22877373521325115162328151196138471976141512712124850581584744704992399909168261635541263516328487781554443968352277192925529436530024421006633112093621416957359244265549900396322231619231727354042398710426402533917291689560431212331314867942163998562472153269908152702292325979049258401011838074535270886141399120216251602299571716343713366066427282233107466768238863223341638688213559918551782217436488107168907078748350405159172588636795924752838173975951774548164437216663669472739716812900706291e+24), SC_(5.54680589407017581449312663260900718532236752643429778887916074462724851849598244854808478563726062042713449609513298516922138485589080042918533500047818941095475305997544950753739499731683843803755248795132093107433712169375661072287744142881205356719090133730530388524199409758849195774801927230016968519619337069603229936339950959945894614972178336489693903099001770377373594374895517334732896865347661491160409693023609464135192154062110190404782725103313309390020123729907971058891945976423107090e+01)},\n                                                                                          {SC_(9.57554865497999074939999660325683650957673265224912029225379228591918945312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-25), SC_(1.04432658224751051534314719319653764492076403254903353940705501087203904226108528788809371267534452777143739782207618775861320582874754248864333937039501094101917228222578478024350733644382871829557399595988827405718915208248754996663898673158999141554101618210328270114242596449908503778350906723150268970162028603276526593042556952793500072272667839653724623032562627561836490475514812167562140191244558846393493937542533932600626398969074932846968713462462457715092757436435680895751950017915638130e+24), SC_(5.53054144906448593874035705960252565327725371930035233374475045868754601997131177506417834643641068577542592682508927413603952599228162183490902725675527826513870330578615340807530339380960658869221743008220977723760935754238139593711178583463897078717435139016330627214829940443565604990205981580028836645095112579577358064065119684256270078779601982060604318757793537509382142428577689380707350625620009954407756292439931086645123086101261977511377525026818121340639711064353707057249378932596923274e+01)},\n                                                                                          {SC_(2.85516056186804819386971813584199120922280101808610197622328996658325195312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-24), SC_(3.50242999765214323664192679073178441988316976402121689738366828010343200142127297877801696998138244162201391895289627133288966388269820082791501666523174699265748272305684918310912716715770179390342333881476222257119067917382383828097056575473305941584001441668576626536239604665841289353700793779427804962841854234138298713674382597487122053790601814569968031027493158660860778248283756870286152743158063320918616278309751952166743130766591170707371648727380827196137739711391014068466505661904440217e+23), SC_(5.42129141514975251800903561369021896767530710266420752809382078867957345755941405132689457634465145272252196685234760413494992978952209599519173817340434015117011005940702842923245114745048817216891242529483752482359028631069418216006995563505772451582472582577624264823737226327430602918404820892619934026026679795159577460335018994519482732498954471793682959200041271002531143558773649050588603615579031798187421758140576055031223887773975801539821645805264411679468976240805660854787612427720085525e+01)},\n                                                                                          {SC_(6.52014364093064091884456528840346284381368491267494391649961471557617187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-24), SC_(1.53370854243521973586893102813914310939965427847284394727942326816923530158483359322277635535490460600254860546777471016072796682814782921636329959096588533379368302049694060279320304899005746782369004567388608876800597722684498185816580726353948738996684213751763514979183260672977613294821391044699592421424071378526056882956988747680636997296772179269782489944802968406726338812277631440999738435783684003696158536718815313665608295411332733865266716369836200650975268023336258804965762457776544875e+23), SC_(5.33871458253436267660312480785009601729216078741234807903756510475077269603543815841324029033223878574917502908041974473136581597194818255013348773687457538072821039582681999557815447099340143448346969967803777016864105080422428146552078395204345173179644042513512657540372581522428813903397886613502554964587865832987725841749146742934838411775381167966256392170311556144245615596487835602499722904753756187542702952227808014818824336277067590912165157720497569824343819810963150406333187486453320164e+01)},\n                                                                                          {SC_(1.31098837463635003832097749177504342199540587898809462785720825195312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-23), SC_(7.62783270505648920867640128917029682085014404223298750921210449188883287957637267346963792923947398577101641982313673140522903767065871959681776941420786346990663932279594126922699186822003592857543574397975415727821273939141093361267052683898474890607767272618049135227041257172444582130532397303361510817394714073504522661387391945133312715542154642780804313417668739292346961368873149467702801677937149054720393235576921825090293378239947540846276937347389762949029484045230989398597611258299015322e+22), SC_(5.26886758016750764532724250391453133579168931661122683861881724102784766335119510458343279795727755360417828961523650183250788076928558998266697318508102942356639306550934079657348019990471331356616671440992693851502497540967879695178087358316196135449214724222581033520195801247039827371115321875006799826166266808354064309683485881431194829649247848425203894402917390733452728328994293143443163498889486622254544214583416155521738672267888911298790423121376809223944061169250554139218709440516067540e+01)},\n                                                                                          {SC_(2.59028852225433412082328801177410343425933092476043384522199630737304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-23), SC_(3.86057379866586319878799465520462508773374309731222147451540412289649626604311610271505156892543734630828629717871661915627739337921111016296975526068036546011996321933999439105025263806297456366301563262085095498328808608921907606929694250705204329001618943812913711507301443230672701441796481501946959406058733878796305518832400784536950370251240917339676666211604312502114193270809313318899693038913600801258981405147278842314317813074821654637246696524927484395930153180957204116226311041051575070e+22), SC_(5.20076878708021655204184517590029484781779325945365320134692951662097251746010442303228973955429295220624205734359293984540010475530401054700767967040031802383111862364495871155708008415805050150046955904324684920911708716591437325331213161883361059635649619622139582737775763756910681490313609300987084497727073273136118042184330561290773528921435330943144151579989347270239667075286213199707738173963359766442692057049676746685889195318181733518343155600767669257087994297941841427762786592820580199e+01)},\n                                                                                          {SC_(2.93777859556056893705993279786690963728545966660021804273128509521484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-23), SC_(3.40393248664535973451643561545599015646480163251746595187335545294157661290070259654556490228897046833198768473283011025314766585326825660311638945820356275028504108010061473219261760927138383081243874282257741552861246265341571115130840175610661210996672096930564509064007280059700812172651108467231185451280522308365237196553586846212890788781209593678169565625983002898914954626594158457302304321444438490738130358193686145378731322940962556530139169746200404495578798523354146116661641285345779468e+22), SC_(5.18818034228480048495984841998696565418571058823007515216304504326186316117799223812592599800053866943330882932209733319774993987429860654967791070950192182720563465084761871021801510083705614519767136322047619989872914050805017533441004404032584098212597431832228764483076722028111823178273253323659440621758510792485130604460981055521765707306470062276856877280447173587180991702485468042648886026757392434693933943855302891392288442139215967429109453656283435937137806905507213701777697785708916602e+01)},\n                                                                                          {SC_(7.86351191582705469613519475556052962250674909228109754621982574462890625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-23), SC_(1.27169642610610039353264616927599175234779914344881805733869580633167446969597085449508303449649856295673996772851928970484478455725869106340434214033522429436281717957271664490947874357052247959982209769067209733807145329602247519581626721334004570445050566096313562487889013608558003318113736293222661115116237175842533338824845777635499715409458146778160438857783694339290802398515134559787128147139201279684177329341813791723791645732119236379285735920408460318017210905600269751682346961660174051e+22), SC_(5.08972238235817915756710145375177450823509597274772735688967008797016311927179066425401316234841495457645680749356303387011726052153995399350107102311415173522242349706194436150181002293398019846980279232678924816759224648575930356637357223960768881058525455547490594553426412812113145828448959563668690340567112115668860640488282014428626692311646693602244887490659454290033238900625854342402063608843879097706509412062070869795895634470749766615375813006168918399107358410251103233338070834608171218e+01)},\n                                                                                          {SC_(1.90381848086964392834489130147419128080699124438979197293519973754882812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-22), SC_(5.25260160066946451216401888059962516778732901049570780683024351572719151667787646855463099146585407964053825766930472772728698256660716949502801050859969127596546505976843647978026708358679238991719723994756553212701512367961114046483288579383813550637161150736903854808004565774707190980542096793989969411975096086259679433124457082433968122358310884166563878035988158013841190648076433223713075923687946218147161294236941276929535940783322870621803800934875095257103638684763412873109654240236089051e+21), SC_(5.00130104497222740728056396948021842053725671133632273915590421086540995885813788156178684793591659855727077330324357543560582420708812233670466083001362821798690316015631303321842998721923280159860116612739436828240078595075021023635482180195173811443143861016540316132682754359770001807411742030056445805013793074054109764814553533227232453792365752365826883614935008145498752931608573064596345947693694716816510723270897599891592664901791763900806485055510666392856983244898302151747117597853439027e+01)},\n                                                                                          {SC_(3.81224138507088185839560978023822512827933906010002829134464263916015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-22), SC_(2.62312875547728931624265607213756815229837180169602095107327334620073176917117693941741379801758213948691714295468078460965756685506546144383314549488869924636549335223264787835030053818578531165584930072928904954024349836757669531292599781334847779073929930462134987001491872682250658594585821377388524745624403856725561382616752243818539754229843502888914770520037420032497262912077979169509544962261229110346059316603824642058929794962625900432712959225107275250144027312303800204614559719130614088e+21), SC_(4.93186547396602967807569716447834137730489798578208909181956823619940195091783373690286003795378305170062448815938262002666855919185740745808868834518988746793180050929189726528174841883797281208589583375771652408457949764152811572462780673549541833300927262733221435417215931929623799861721052593168258224331928041117341615950018916874018539855668865299897540452645987293103073809492246918894060636522018825311579944256307429299926433463157773358234415239424681932122613637285458521080913054880393190e+01)},\n                                                                                          {SC_(5.49313358014133027717803441948574150188733256072737276554107666015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-22), SC_(1.82045454640895782737597987629015253196424399819770711984867168537754339866104500301965169548440597151564783591998096204750642251097138511714139431677230119316032123096723638435315702956082607856781221770795262706437219993962584257438868249993742164284339577414043879202101786168615719873186715666650725127913925044433708513784715492777075613064868451994980205253786155564432613892877191420027887520647436384687185562679132018990435662701316643628299136576381271167422303030261887730404064469821661616e+21), SC_(4.89533731735552832041589301430161251020130076163841042575523208601949953816095170371768447691586445244814754879873655432782452790720310931894083872122785341863455879689084514113729905769521595789846313097484306889731804610702066651582493944283543411813419736212048892954255421551910526337589242688284096162070571743478755325100547875689720992357527643607016139503743185301042251704701530808508066708422044540174423444837331714045278436889408090514469447622243967937763842767800209868922707391107115056e+01)},\n                                                                                          {SC_(9.67215262454222827277166131629965173388541188614908605813980102539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-22), SC_(1.03389600931501929871097748597108012503603240764947686389435163117375649258678792903056071607754243833593207370623936419856377159806444481248117223998829490194577017841692422535813595410446015676576831805051126599707021576420891181154412175525551678059867804876476222326414755412781154745397066502491812883871947516897588521853430063495325076052198574002590913096133461052863926525420514129463693265405456836877870291872408610362015129227970482483273273845790259359266596054256231926761044565464033080e+21), SC_(4.83876211526414979604635716263705953424666129250468312064929767779865870430085106549754942840632302924184467393105280221031089458453346711488164184273691108029712931250317685626244951629221689589424633173262031509079949942052033836097273287253793763926645896482582399059720693766548808207758164347982593877689742387604381713327862363173160844314328159732166305198258012076073150997611295564230600179954076979830331378330132787416576665241470078232795284322184660642563132648624641834323472973518630605e+01)},\n                                                                                          {SC_(1.70216887177863917482281209177935599186071158328559249639511108398437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-21), SC_(5.87485775694555373167830190810947978074136007912954035211349619261705336638409363420065882452461996702314667318377905295556382085566956103363904724888053444999238638638047322550676699560353465463822389438155518513284160800035024841145198763981778295086704772143892266059585666296705036968955960094559165454125738827162309721849410190497768549790407976026865987343414380830766635337193966062235485294062197370443236409650307028525323119441263966385207051043615749087468096830868638236989811223697512846e+20), SC_(4.78223837080342956793684677947106154961522152824515734094452704401576955395734057320806187417084580015495705104032785915022776196524911035311341716253866023844008453954146289524334796068740032756280072158706992888389727754165739635731112302444977854489414440643254915015070323265306535814024253673397347468234679060454970156387012906763493040337094509367197022134455190670828956855467931764615143248858050259521769945653420149568573354187997851604834498374939753381150748940039401972150105022390568142e+01)},\n                                                                                          {SC_(4.81711376218383283936066573301115756322587913018651306629180908203125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-21), SC_(2.07593187408273119152469340787584993890199570636061024535034187514866784687246050811341044476827375433480122929541167222047975713155197480798124497902130577079489261717652034359642106356416547649168312264735412183148465876725562907070038342803242173535250774119973305228029222184206457390221388120526840827119402382489085565296916043218667855465146608182737262945596180604152319863495913770032065685967941222160843715367489927722217409213962422170874267170019204004892033424089148243078905283228037205e+20), SC_(4.67821120086936591155861343624377850408269305810050469109688472737615468051095256528958901042725900832184701847084075487537053023539942576971128033660153998945676607285872594089641174041605333823436914379532594652603569351790857962248245167080191475771720972177837880349399147575537558363282997470664643874116717082159563251158697158617110481785942129499655204492946736783592575692219959790344322588335340149192743106478058297032949955331719952339817796143077569677432793189592681892060865012873193475e+01)},\n                                                                                          {SC_(7.53835218496289623698718975960963994964458834147080779075622558593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-21), SC_(1.32654985527838137100932148001816998202531058674126548560649347649621723628346782156486921309260567626575505247724488705138662753142944879073548888865365873854899374953797004778789748638581143372102322151991790136819332204708988722277664693837174949456397321602470382326078211353728562381264101144823679289452835745057195794802022960930042459359943364735905222631946467121359896176823730763057059644290401154571759016166486610674803826665802666272410848457505223641701711941719977501447883034136159953e+20), SC_(4.63342833378474888230149349666744582083410493325092779782325990451750115439726645419432244279477421063064027863192770563073507505859141449350699461178579618829859155282280329464471157435721507507621366940722327450189318592513979948532139573299619587090909747514578389070859627428039581931779660251967891631196240115897628890456050781081363826940234999078862646972605461455399964225335297811563651185144751675814309192435649749296000702432933328264772882595395455332123984715360567248273515423621218181e+01)},\n                                                                                          {SC_(2.59630539283257292986818211277810775072794058360159397125244140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-20), SC_(3.85162701876530232468016912812562115373016774249503275226081603451011972263884092116338217726073095315378831950037360909099536077599495060933119624377088198449654129198262640605955970599568081504230936190952678753636882742353834162910291504268867570124117933635673759417794194750694611151724251936494514678735433147379446557816715174471231316403411149395136087982745338487971867500234281286818420446085777843840510364259879208876519674749555766856827657168205200716024970765971906489858958552410340209e+19), SC_(4.50976124281920705382894731131297213130572717493742609284798877986990697571350693999371678487948632519864994037977278991511171422997687213322493057461733626999725433941144937352468234189905071478290922464427713382759016633848292380102094051047990921816293731510106932513291229018355894945898305007359239076376113280775919897826671201334146282266277827196326947730939522373694958320901000146985783812074526877946883639947205073390942506470008867088564871610508691951675410364770185985961728739523981618e+01)},\n                                                                                          {SC_(4.44458748032432159103292338558910401502544118557125329971313476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-20), SC_(2.24992759041617511461621764486439635331268181524943714185422655502011940305830955842049995629795499038379372105174122525659372487742336448447414773844185770557560669635298671132635822489541669693773055967965532505432053161714602453342903646974643879994358520105467411119547515122875898507996505993250138824454260200092114888103323809959405846895518855899975499562260312288474932728168479107206688794805002289162783128162902120231213764618237747182467147917636833518130802203155531015258002908630659505e+19), SC_(4.45600148005480883843221099327436102666507286396321419246469079708178654036796335564537748997950297615591540727977401329305621673590499008495012173174392772256892507453002392058153845853189319966166580698136193800825737803950908645504563702087417217271483342543855867136519298690260888636782412764723517798316454633414606328262091535579645033263025779535288322669191010012877722363484688404092994821819255479622047806371600580845074877980334211973902257995372110831043126958395107296424305717728039778e+01)},\n                                                                                          {SC_(9.71557492149857393706909557129502985617364174686372280120849609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-20), SC_(1.02927516701786239327088559412658766939139020160726492118279488473065998991185050649522612566598502492850845923928935444094096535636546140592813025897441044117222322919932658956040882346732304391680061902209382086302404668689151737674617016917845957206762618188322104946471590369266478660595098732069281192644117382544988957154567918982755878771131501810034492564665202549534237745127922812286537989714258529959375056247550200531755397160082332872499569497564890372601849391656798155826066504423590993e+19), SC_(4.37779716000584398698990777213961810795783081592017743708184220804927904372994901189967649515009735172880623955419740420012315986576189119126543575566904578046919431809875380432523353206754900523923781714480384673715724050123132008911344423077801177226414264244221939888532288642522215169036955971731289164143691078284671577290431144790881842027973573671404137841858557411863925709522264346872510355435006440809714471312012017359301321832215804656521781996390042520886865485354409134425576656515292926e+01)},\n                                                                                          {SC_(2.03659828423951236444711457296286027940368512645363807678222656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-19), SC_(4.91014849486338795473190760759441444466067332010736115448451018358708701249483729445665603792278275962824915533363252447208992321271997558403209359068593642512124051171201458814565348168725868138337357097501234373545916690198371201406334166588453088443536369069022785451336023963788649872427573525422434996888534953599038755123121918868508030352785585630353270762249702292785344287764591129078367625041276697406774722135731348618936205273074423355634920869234376105907879152417604078132666329384170075e+18), SC_(4.30378358585949627123043266249905967962887816014864580030065149334627360311264625084269369929010885338331708629099405372167695832844306064622709950330533203706114565842728252858428991981732670460958718014399250740467134868328348527925344194855324451370921408502953554014065116467018777966799168200158046526847454556567370263163616973309536526429423014979421181142030669729325491143297954511079372608224911716501489196081860212695795268550473745083593808696175606006373300488827315794661965705208608074e+01)},\n                                                                                          {SC_(4.24897141467077741851980990372972257773653836920857429504394531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-19), SC_(2.35351077333026230535011839474240622219483000391146763132183509793076592234927888232167018165059965341889704087890201558410868910455786613836598080957397030633632176587127990393846747320588225351631383496860587423029556133907670877877103353918512797316094631873557226661613318816657601526325447094347483360340956738001270992373069448262826936645820092382649354305920636802353742283580922610354426889294090123859577447266696482951980426047140310287263459070317723770875069575962886935550805237786695897e+18), SC_(4.23024398333195918158408107850347603783326689000823856751331542763754852295008148151040641858229359628078469346471651904183328738913698501012488411862344210217630892036531716673830832847274975771154382165559196133886158282803537992484348196540541778850787109396622290227802667263982437869403228137310193502583531468534595730634902358307597504479659454456104333192503021970905139088727531342322319258852396765871179050698860655091930182032950808135395012770057668306527411218055974698533878804694897876e+01)},\n                                                                                          {SC_(6.52109697062557611797143503062912373025028500705957412719726562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-19), SC_(1.53348432710711382412002595519912645825566648563457431696666953405839323663436385415540577078371909268498986232218717729843902408307671822735810898376099999002890492643837786599645083719969138547771263335859855947307816324679806209991631345545056461506588633853780283094320592719021248371654162004605737603691227969348135209903536561923025330689942523293801939078260739547166454712431551868620292198550625950525062132279655944219731109300227921932835486424569827867231613062088487239727349654985918115e+18), SC_(4.18740741580717877834749717580480872663444883214839906712612229928671353630872016793683491013573267754990828537497837278806841156933537456470785351876763297827295195430920851033552990997091396033417305252831735464754273359090537968713199905598504642031010880493394683204614779223808652364642055436096918311854372211100470681108894123216199490765448486492648497952880318710041148392364754006599729496266016887671960468648728381863442366793411335781696166403861745903446537097238299743376393803857573148e+01)},\n                                                                                          {SC_(1.43612616409619005828149362891110740747535601258277893066406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-18), SC_(6.96317653003236534270279684056230493480974635294387864151869876012762532284596734951082527306944183471677369290174280413996466386927811922535961306689638808619571896542664757715749540445967495026030505751974090250891098156207641193344218297448568461129691361732130086054347427579303927112472352548506572728853835019753327122688017454392580665395920292338033791221187069780092498336554008503930308658152705336554580268216215995514521220060257848935007955158452333523773525415852441445066559674435759662e+17), SC_(4.10845823491203750269417544215072791519132546542332718178996273127574536831489212657835589746442090649387167240256729528753922301781366890181149045548306041011402050938687552735678160032267437349278570868601663400661323803208330594908106678976157884754069206007117314370496433949931110672961261612716138604168632915180563247416747360388044256592175912181596271822746593829008506529828578871060187771282714872573721122505387176962208757179811399463372209857716091891885223526650002477848497475476979043e+01)},\n                                                                                          {SC_(3.11890848786895488590521774430186496829264797270298004150390625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-18), SC_(3.20624989123443732306466173906761681520397454797743411967171013836766623066090680547883575948261116875373758903768745835189573992875216085613141902692685511200847100457475304187579768628665984916839183891132515815084322285924840767805505007345562218865321739461777396150138788712581196262279033992571354092841083584810694368680835024576873243622929377079471785915486205112652151458409005461347986973352151531724888021213681531813870835307532278204228758832097427330025813162846791315218221029824619746e+17), SC_(4.03090485769127361541044518516749793558620098090648641127887094855827700200790074148846586717769702602507584916035694807696947856797493490000517122913319060871005295342371073736921330336059216945323871412710866077897955936403693279226005005938096644598230886353655584378890229552843787958464746461009779666997703222136831645152267985521755750444319743715297346010531544876992967622344263445129450448900510104730168827827208165554824488326702348994212535336245330092400863992833297810181409567228297843e+01)},\n                                                                                          {SC_(3.59334537282425688607678804231682079262100160121917724609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-18), SC_(2.78292203015829599261962546957895404990081417377702462561540550534248787923941627519770252374132972956048659251893293996353753189857684586454930049807693801282519389517382281037655102888634397511227508026612893186882009903794224845367685465254686600207247735925185218914216633415917812638411226987452749991767060400949519492513420696456926364234344734374551036206649868606958533670717760397382911283500570331443689754506095339881662222313057843468236763118633209815395160066394239858074758994028666204e+17), SC_(4.01674480465780156756373233991409013436821533054168506258895292628279818069729361806787595136076424384006316279954726598012824241067989855404179824808341722733810737973220122456049123599114093743744591167641745949850999579256815048452990723593892588637365211655957582808948217026490586121983724517543864781645178437196162666472151019598645107712434762601053469666360788143574729074809760313574145036322494425208379260483457212057388135008101922347976288102119321928476946075419079715204273847836843414e+01)},\n                                                                                          {SC_(9.44587319976354210931956956187605101149529218673706054687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-18), SC_(1.05866337484292391877893553128199112698939570289224932065176817862141085135514836951586667720844659406770612439774968221124632789370844307001432545672057723464869417971709395799424259898055623912235791403741122929999123344770195973794864712554455288234558866684027599817096207096080284146412184004873522071048450897003367401937804000169854687400292647731549224669081176646068486188198521486876180228698061143311696077549270110157042874108852125353259990832498202645937700555218735068731041170828303378e+17), SC_(3.92009537262054234501302376900562352494457658036527151870180025479603504754753461578489644244060365462256407622755712594087048043074770735971508367302683895802466764533029159135853094442397091072625565603081572124195271332301215264596440920186443496183795483255217338464274566920054827464817577632394600445251335490560113043160121251415961773020418811680125283359994707443679440487631092951378592813529930845985123785509843786473207457924902332048362844352195749950987077358017799628118071730249025862e+01)},\n                                                                                          {SC_(2.56618226665795902841776809921725543972570449113845825195312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-17), SC_(3.89683933597725175319881448875156329550959272329681834568395064472849695620233075370398121094999407832801079152543061082854904293375770342032999568194809723919167029207972483181872792071870253942805732212213696866676682551256652819376616818109748330084069432861352227832513280730680509108965375769828468563041117914052232128632742067003958206273566240057625865861463363448156974487157530828513033287570098452135060842470250942593681513427150841818546592619926264067908663369379108875730639326268033636e+16), SC_(3.82015272857946013868972828269190565241603203009525306048316289669090329472938769874388002268858503344601957377991550737380331618410528604493034595400009144511968159360478428151102928583235292537366903749091753601878616080067370420318789469929376398084229926120334276674083850290518652741873258037928908447880487108384710647297029037281429246371294923692866791630607779476698503708578625544511474622147702976005586821125679388687458018308507924009603884965657863077894756124074217763436492364278673196e+01)},\n                                                                                          {SC_(3.36376503340485928823799799403104771045036613941192626953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-17), SC_(2.97285925166949974807457128035170450066477816399282150074283633548132630228050480206101334146278178930908294908408020515338238795065654546119508961075437640461050424638007401351047794124504871288463863754584673855954961126297232599340503171861121561195226942325267400079715661257042576124244835504300757726324585566034800400383463784278686607598194278053396410834529186953102975415973744957865023871122361396135152717126955846865152882110803343610508752652208729776608990800704842038078247817331994336e+16), SC_(3.79308856886101391007069400688611715241306412481945391925641124503755302287114347811486474630031114965526460388140834253480812330063540612899960732864833037424012896192727400080411399823034435528040797825742848919090423377514889994050050630539014368288480412226524143513889592088827662068166527198378253824506638864160188289159987241034610535720713030553745641299836235130444127236622529535246872710565897403446713078126446643276414792539312938432098757656839684732673029434047131943526266196279957187e+01)},\n                                                                                          {SC_(1.07358170281591559259981583096532631316222250461578369140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-16), SC_(9.31461478317936154583885573605068314152782065589549609469914565023926800351906893630628413577057329177994311163956620701142336185063877418787239256892852873445087920365235403253490262027044753883469508398410847328265673193194742911647138928314816775890233439455542433156942108387193099894695833914145431402964584546919313488937598696841459038400110037727145266204533694824059513121510339268845269654240403127274651877792927116000049616797253148390354717608718094465314742868903581139626551889300905460e+15), SC_(3.67703610436463545495026752764732073257799710462679383878926040687745483770759737595879677884882603573698864133418997486425012617679062865326383978427075714145698038560113831222027110705069239786335016603569169352428328537042962202684139397465453620032063627325258874434348407817356371726695939425687202245573310859195697100566991928320499898224427193219018938684548326483374310145227660772699544688722421474069378038779652620437195668034097533124429018646466024438627728567972649112787843740899791573e+01)},\n                                                                                          {SC_(1.86668379762073861211080227917591400910168886184692382812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-16), SC_(5.35709369350391592768923477986863641641041386670021657907817556703006517389988705389283232109982968543641719672782632683446951123770688487043526051583297000240895361108843806299619059970226545428273207896350988541869699991627107327834801493033331216553070688928465855987579410298857315865277432779893119738942981339000319483447360246902762847090996239733181691824983861438010137642268593931536986215723688557791478609307628514091675490387977196067334917940938095685385256768892170730058270859880636462e+15), SC_(3.62171980015770238529644276256304909762841122755715670454530535932119577983920286373688488828352754734406931597030396464476356557398010697414611460815730595598795724461987357764438028481679345185347219185863071734495762170385287950687445842789959555195963125019478348258106691677467080954410031938373216500393153641016722276609946656713555540444591568662264332738289295169018430812414467670389834383152578763719731976746966496898676584798648716600235148412802550386858248891110592564164992629404214083e+01)},\n                                                                                          {SC_(3.72754000856436763788881449954715208150446414947509765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-16), SC_(2.68273445141408911283723006239656257697803268441537091833578995823631479637870109372542433045823942500493538309772882061158620811239346747126416414725632220522897904212689367685374427993307715937071521329955922919964121115209128646024026140952716125111524982773348304152867310039303794124441877617403751368109200025144399966053076218345391645919809571229742549148501577352386134954357696287153144345459858333574657639646117466158790728579741367905998417341437163124394832747783463050305056098538914629e+15), SC_(3.55256129869549746469129190589446112611374971235422325441661743173441106581270111685559740007254639646094495493656624168305177527459509052071035691146800720852814665759057328973021867643432657506024722624096544711014523774399719873932689274731995051138325881077303537458836774065049783694018259907349665329693554519542391840301112676185833713188657051332369184515962004392542293913181461136174541586330573388317276739077974633782704129881107851360100845571979416524943258965369577672126496148058574581e+01)},\n                                                                                          {SC_(6.21164623847126305677956992212784825824201107025146484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-16), SC_(1.60987918759215724473296955164050711825489618287045866202801823414693239227582877689612642201828742154418687355121973966292505959901391806799139653809838745188340881684515162988792007848468674612998319858187092531693899932814139414825926557323551114672169822158423992839458703436196401791797911936673436838394240815852947047828174796753313307757136143684480285017719542768808602568057397749873573409112484432828327014784464583830481102656394268086123846746418699465072883104433293290933010401885509252e+15), SC_(3.50149355323288728364329861732880324176031638041336862139807052588032519007018091239566004053112678380594715791614694015553568082314922840573501903934526205826219301106252291108123590770428192799388536288175283950076110976661476116388877098281744244826032674245791119891143171701318333066266192173031544331503256176982628055047348808467609466555103556740155332807731035093879658546200419663988682878676527720256158920797662450751878684463077317141864229153842444817407043542613272320106476743924054420e+01)},\n                                                                                          {SC_(1.56118675387513505814496284074266441166400909423828125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-15), SC_(6.40538358090616930572199615451805628548811466548124866767301580454193836914688527258945904249400930128393597483821093345931465125659040391786350941651021513731158934861793952123651760083410251936794620985570172329548344492841407057052025958565132036658866728905612768400532182293158835054332981413662202889397861806043910747692211323788804394256779409295771295572821408075298471507736651155422104110473872767486593110874188436686541654282655355161458124621196612875076129336425440541282095043450040255e+14), SC_(3.40933301232014391150868421636533958473440302585740860260848018138238167947147035645125756954671750855391887535317009444065956767921064677968618219945959053639513910191608207857335901642663150813785332414376802057893921745648267995098117737459621623133122851171303514865520860577135966638142992592890484973123904068963085394166183181897269113986078489578835681632904743027489067147409257807141797115092583680460450147123180586018335936955745723770866230963621347586888357455203043177396972833240851176e+01)},\n                                                                                          {SC_(3.09201076472299246633568259312596637755632400512695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-15), SC_(3.23414139242036684276083130604740555332102742732209059379463888241652420546423273086068775293720523823200670849046209509059992046513896037709874652313295779648822248664308086223556376242106158616999836997344265976872160860155284371645823226486628544951807381517275685383124474248733832833490965510634823019355780090367489336590037228205353144842183317855983909606680484114170019756574079014702848036194935144988337541633047521822526159654693197431239667075331189787015556708335276605238049315835810949e+14), SC_(3.34099547827158268511113993446903871609732924567423972328264466707266472778778891404558763137098605651259421135963813833515578889335972791280638276638644224502835075692963388704588416382084250235467716489647590712743538560386421899270208473311755340209188808173381086345830251825944994715547816456415714427114514915312552192521665876486824893423925556696142108780583640085356427710300777015891910118866224225325727148526583301327987132946111378409333344173151219474323631718818017607572968466884244881e+01)},\n                                                                                          {SC_(6.19284930682226925080513524335401598364114761352539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-15), SC_(1.61476559569818671077849756616782395312094395613347467750921722608840205796460277758977185598066368612152647586355409621867085587660898402276437610012628993258471020827684469653607635220589425130797599931290173046110225841248699388265771294084712117371892010203190259471067461983539407831393871011826817832470708029300694095843415136560615706146315580504139342457709693423001976894072748271524278429319146224988993773668626131510931741784139122901762820252013439990701483599226194926428639331692995557e+14), SC_(3.27153811060745956545208526189697911818865513720855207755872098602864684374322696355123670952633924436258610666907170222209394190047290120323927472415081513666370900738289979879690186626743145600004271927253949261836286290740269610628605968254208476768024418971702204779288095032341257084062060344264304671198009573892376055095018771428144517163652189210316706374200046878577151824403617693596267098982951994663722671034852406566911866665007273958508147641802996795125455444652177198364896323298304893e+01)},\n                                                                                          {SC_(1.04787902801498772342725374073779676109552383422851562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-14), SC_(9.54308630352406516205359046743618128166013090307817797340778789274961654822225673440177258174542900560867351268330833966280245668620838918829357035489275755644143090680060808839976435761676367940523185523095340333253908768554277364428691654262043043572182784073217355994150549491589487440011307430494117507959296987864631992522761541545646638217243232172299176577840404366061062966572185707442372468239516417574982507870328724871909524033211780972857372209413324807897530256218888609923492076544192109e+13), SC_(3.21894231539638950907826379599187842092021268441575923627069258871771854433853115415782489861480221176798825589829782195888976062477106413518596068053420790907345073056114458972152822792634568125668736336221600151997074169590195016728096593357645536460894160204159094589833050074995328566868137793424194031239361538971519366809470194032401330140171321878243915169056979387038234600397250254904913143463342791005518801681322155705188385276179554739337515081187784957575036642842343229436475007253920317e+01)},\n                                                                                          {SC_(1.97847313076864039782520876542548649013042449951171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-14), SC_(5.05440273334157824610291274505331299112537682918356644294065782874967080760819218369358842344722889119059120852563533630957034017900977677765645163762768638444925755118980175905552516718603988596151136262505942788287639943511325025291684945629253287336400993651018048078421763736114277036323128197654243217402405771923455474402297884519301843406468653715197789031889941921922213353229037615872818479641755520825402977352044532728989288131318994792635273076684794348019858198888846251883682434856709647e+13), SC_(3.15538659007727107880083686193998563292533754784239638473546230158371409841656726541189075805403753304475273768163410631304837122301201804069146565821080380728613439679856624459579438773909638520997068262009983521806344833780047975686836856408178527940530668908592418922849294084163218999836168907185916907686225093493625442584462427634364163510373475305542575946640596319788825084236461508223200924347550008190319412896325544644970319132017408695512459624713558941710455539829411743008273160922182276e+01)},\n                                                                                          {SC_(4.04181625234673047586397842678707093000411987304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-14), SC_(2.47413523417687237626963417481472433633575119288276766917889956829706449387149542182869256245700252809127224187392299344118680726955621980608527311106641981758457137155249257019959311787800175161249767547732906304767784662313938188488954622233749014151216322402541870100691842879966764316542106877672313850010047940125563794655250325383293007679879162113741747550152520179452876634080967834990748405544440060405645105251924641229465383899510724315835256818990916050429842286719722149892359257192546334e+13), SC_(3.08394971435561524360142991538131117539701549235963414268474100167564253338933446140757694701064289726364423973157455283907856938737731484242330760047331965651566581163412758979346661233941073287719334494551282734269681696866274532457888490449760451692621607033690773687251984208887286450445309681513684821963475136058108812225796383611583847994569380161340863673936288863658102647041572372692358955984131110815821568036946097843162296614207222964877061568985465748411171374575442815448828159106229063e+01)},\n                                                                                          {SC_(9.41030023002276116983466636156663298606872558593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-14), SC_(1.06266535132378760631643358293084561511832251368430794866564956367470040705018915409688083875482366263429632275039193240775766717077873313852950906600022896494221965573665971241663302310175858585575545771211409213274114706303571146331076743944647262144373083858176045960978072697190078745416271470663047735107459899716848754352570868678111151112812595107266326009187517941163620835723085933282061532789859285423369697118361841235177506549712822803071392540857286208956514811198187808084053916061721078e+13), SC_(2.99943864434060791143172217492896937207257949517184549417827064206979752588254776175589324103489335524950979308405249931740158481930226889556381324738413768244210883195345624061540768169879851570810583307354423589854007192927945909045754243680609798014063800551099760224902076469760607675735491720932918729762150703739803896371534094356260646920621664361156701208773746212016161641743802207607892411338748745704600883232903687017902944301007840250864179183844517526006505109173025929076962406537777920e+01)},\n                                                                                          {SC_(1.33452981738307885350991455197799950838088989257812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-13), SC_(7.49327581125803664353332686794462735456476172634230287246141345112050937168008380331979244951518303168542851471161625212402617638944763054689499203513298470645263374349226143689692949458761027910602397479322818253915367494622615901121203986244743934212301062374794036609817418728998513819624985002827010279122684636930340188704487616825826188496239163860134394337564212301369114736279077734733982238018672531979578933946521870429264290190811162244158436887004878920183732188673299621097892176296159380e+12), SC_(2.96450271758229288403252112889839343046264919348997051677770807143229064321698759490104407092173470549790770910195143510892421208124871524048537452270859140340894574198474275240976869613246364719079574395550342755224793264452868148741241005212364301594685738976292681945703335226563931912049610406775300176036592141685864992725787902308843717762037673700674556235606932116716568288702687427879873000484350347814943416258390061621054988463397497969887685774955472977153237799356556556812974507905534520e+01)},\n                                                                                          {SC_(2.66296967116330662861400924157351255416870117187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-13), SC_(3.75520611754846112229083118399808749001360022124058715474727790108499144051750552773043606887072948591733873717619240063080087438143083644198452449978587541745540668164534368081538836999426749485182722608937514052626546048690634099712339264714521629742112776070046990915446381417847222407042913672916714141265208789710907662269976047802795103569149539665396634565491541483384838198541813267661606162894493363675144867700571511618283433250754834401268934080145757542080423149459099357971487063044420798e+12), SC_(2.89541642911290985674935632628817900504134143476583578690835555153792464486843214230770681727568219370418454410176940082705556788379939494096559518415200599813788233053457422119145514230226273454974164747119856647988194000419844395517976877127785947700998789158949025802776791456070546132318867880519233401001419907844937725860998778948766916982532697956516048925274592479471863457959002692582148207882530569385026392064968869404325018522967272680481727974672171879554684614564347484171235619314903696e+01)},\n                                                                                          {SC_(5.92041389871345025142090889858081936836242675781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-13), SC_(1.68907109723691052070486525865106261806854966699127027205669176277569218965909678349600366028971380180385906687809738819931361084816519280585711566815674289584306704539214723315643204060952677418896085153747819431781526018839209148072775102167053932355256696250635369168809087728146494200909522760193515069230982932008136433426818311186461001454876401671432451216807114751593214297322118984996051173573813270457915363615668883625006270008577595200337542985666436051094151406486548468223963306159654578e+12), SC_(2.81551998471470821921826157320225318779020697755817987877133780395168679457427671788226434299866659405041732712114375208646597948004797119550767305131975984686358907282376546079646237181336488345676458337148909817110936069601773500181081630094896836955048561619175391708439600263872860209454397931673667257880817059574772661504631368432527966353704558439825785368252610502124484964110156251032299215447175710893508980200682712137982588485989277355873023709479206867181641268659311575364569507471812106e+01)},\n                                                                                          {SC_(1.55163989296047688526414276566356420516967773437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-12), SC_(6.44479434007808281945668171737631984460126338755716050528259636607558935755206412545315633066199139062007451090068421786440803136845169038776735288556927740762250530813003376363047126561006457621447061946747652004313806111815894201357327059916054202470401783612662229031472185476081051007630444791825977198318692478573405964267879544376662236850355227144275165845837654094265233204518939903809979157878239002505955765874635670880773744972151920549504126507544870672637337239076996374024550050298288969e+11), SC_(2.71917087488208757956302942278577362295215807788263157065483843364066663844154423713634751254760580365655956711675975357428722671276630188824680533146797115053517339275254913516196328098442855098750314098697115490375504499318013291671780934170480957119848910233193628612157277168981731443947541882834369189186964256514844948997973976691949465374841958954223300229207473839330998856617233994716915993252606356782819485709994926845524965543217686418000523044509663205570777926153154778574864020540675905e+01)},\n                                                                                          {SC_(3.26923297461201300961874949280172586441040039062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-12), SC_(3.05882146596417234835994602981634843704750827288294119670156575398858570365036581738681250292878619132939544196249745147762777975788702902641322452264655661985803387949475536433707633244000288147225470160054689577928543581745112442814412566861665723976043265302978007164309180647034560028702203990421924922013355345598647705169919067111687823219992429534585941737923695475857355829185398287550483537377689480938908547889512997031717082903798346740384480735275300567744061225303803147502571461670451282e+11), SC_(2.64464657228708503007839379797814889383468623408632356045883940239707796706335741648601257561033703735027993923522266991510795865405348473785708794241059879719326704776023245036986519209326809690606573999809271632372481993912245549990143970731534224585709349233224063569517537604626541649377460349869609607539997644367673174479433895486942986943532920284602864941975113981089301869678030658716662693056171364402660992019175343646111063211321804943853171822947415008191403169872733872982066844706145490e+01)},\n                                                                                          {SC_(3.75378547690097263966890750452876091003417968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-12), SC_(2.66397748659682909756214887858083229415894420716762742064573472682474490462580859011373564363428084801314649404922305948134943734902447416261381967458044712729517464413747608514517893451473086812036842641949289328614680708631437977491656865094490800485832412388703509802032685663024816128140980278111665016584380476090092190662589280675294498094956505172465951855876751666393436168631795516138382681944895276698624547918025170510095147475386547606289130297220119860631615057432119740644819489077420394e+11), SC_(2.63082563245997692641649751900943291907691027144583704549442551016776634450412688273893462505301287777070668295183514819852524997814713408510699214857155819476853930204939748762743648482032606225357989833787868484607162940507880034914693458466251230146443827109590823773695084631603391774312246852917983179238312233575917758149911819562050473544307597831316353986629032971639235492193044250270704422734560896220909594598818102479338461828126613160467017936891031331993774585288966541820231566991439324e+01)},\n                                                                                          {SC_(9.57916385102564049702777992933988571166992187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-12), SC_(1.04393245125189169486027570038996582173487482590748586089822808469387431328301377618370442742826265541497232306444964659164242474807185782150761610210632289940820474500560688335407912085585699972502466458135697942977731536099335360050363930102587739596997254053324420001037812190352819577308953150566568369925711308080252617427664868786203872471901268803117970363715521670230414288279696940737544931751291247921012323221444842194521436843824624549899340782748610804764503134909942955283466392480149356e+11), SC_(2.53714308084356893528465928314436682427710311763825598345994023050258622398573852312837852231659309845437520988033941711696041489046002537658504340143627120828392418786708213179671375739089890154011798708971619878833013355845921783147827319762987629911070090390377141442166911300222465040042045659314267308680084418840737558155857306825315728369486845594480625849530184371295514707954989360252541560432094681464308036399339395096989260992294394578271133139088324006323139537103026881509515892094815868e+01)},\n                                                                                          {SC_(1.85816709241670707797311479225754737854003906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-11), SC_(5.38164734522710681215600336061308853120702404775145741709026396178823245553137666800524126297374217114724680251167541929241182261687949418995565335029486872157125343290612171119880530101193916858921432756965877000509299499604733026401192518432472807166016347864511370369708185703119315683513347311705471142373926510862090059777086621231383651397623524522666406326397488408425070093854590097402718270173248647652565267172176040569249429679757503140285383909390206192507646517253731439123746131624249013e+10), SC_(2.47088454552427137429056329064109142188843906165891475774275743679190025685194554734484595319669509903930259457820499849598199214676908400721919316015322380864769811197623330485316164544963476410844338145101962702064276881579255860088713997116411562209654938575284162991827148200313426345555058188280286970644756612598695826995893568264874467159345854674115312282747039761533926261402464939091487342073450254851176994505068182111978970672752958497500861843350592146405041615401662481907234472878121134e+01)},\n                                                                                          {SC_(5.44948530745159587240777909755706787109375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-11), SC_(1.83503568419782742444110740345485123635192662508026305449822064127200895495506522518300606061885236080150004638907060784485796894919202236803140073697331043211992951972609347054589798075100998594256645375390103519596787348845827032192905773076186985280977236935203223950666348048814013595501435907216666387351197442286860869056417192384391638213785809676518670680508710566800590437787611079311407075165452999495406849472529410938337431736830657048795062807787119744804484928614047453144586034805245789e+10), SC_(2.36329148576872448249942821605627674186499356266069319715954487992643662294411738158241119885349703763796404853789880585762925019414200620292460678339262214588413946187958058256382025002391673480147145270388456894043662461018854194828668215962270960439151474188647474425625494775601112078253792726530286137717752752768842949012627953324732331371323991302860241330919243809216358651674628647197448697291367713884619010229075199219840636262767574903350571262368220355179436844196791555671752462351869046e+01)},\n                                                                                          {SC_(6.08951777891775236639659851789474487304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-11), SC_(1.64216615546621064803013134062087811673092748693572885955291086615453038443965746918527089670359832467884627804869657509889650026751673783619206954153041104516844408513248895106916772556394041551875119284869088037479657980868966602129588687470062451815693221099315162782276653334393329494895424621430603591057616248637305903296178334745144236325653690117993496869421243789046117391168563934190450243201956497156633468278725255215744464020504309074023652187498470935365081369407764705200742909320431349e+10), SC_(2.35218671267563612353348723043202312786307472491656736789362170809010927853268720372089773533365322636476747355137070858356044677376510322713056628921780389307345874508065375269999253671352912911300789233090646288480277336399214203824400746311370034317659741344301244189548926906452691866457683693618594716563727782265819613630587556878361391532959913004915741915512858017425295944874612540863724007947904388532017360454437916475157224516660170429346394565018134649549162182163834378038354896787534841e+01)},\n                                                                                          {SC_(1.33774435973066374572226777672767639160156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-10), SC_(7.47526979014226168376384951063540791218306464061986362930576004822937035170826747587219778713265013490356876945166420253260555381329073438163483115746514774479474424515084780051629598601133421867960470830504667887885069909772744114866067292970878487141283092292728452415775921280918070442774133326301037901061816917727478717520084018487350667522549017129986542118147485610067262541496627719604571748937052892434485040545825983818735788800698893594461092076293536724104072562332257956291083818308956413e+09), SC_(2.27348660478985728986052090691869895050374367468815674115675413846437487991638874436688243456130558073290283141742095678859644590259358965534318423720133246933305572030632400606313806383078380531211317966778435095299543494045005476053336526881142479116347292899023673200509584071082808986065746925389076777580052558272824153282309889654575678844049352349892755868036262512082925318962285347555701091174821628709528237217604386997327214614368590642701672876321992143952181847423729490477577346381853522e+01)},\n                                                                                          {SC_(2.55445886665484067634679377079010009765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-10), SC_(3.91472343871439978910477041965245474686465180195914637204067931155807421046773613195218014343443213281482963786749317221809432998053890797111065514873743303968835421350089217250012183258566393346818055392099509447667423810046789872014606508233744159464480197460174056765333167633380035505451716049617734818251233366973419386831337618966097682993067804646577065386307800044732627324473412332158334409508167829825644048453099756316314804390039245419754866540656073700840066868100898153281112806338309714e+09), SC_(2.20880105224416920895025375311224309333191291243380788898883223848745359017136539357506857766099404650529030796456169266293876522646879739438348110747941991215095622332304227939069152729572485470267183483067041403067149639760009599374303521571969473311055242104395748819301709770976566775902041342531942700926010496460878831692942101086740124837297933734304244538829304784415560885582162795113502131933398817811477963855514503427658668565459402914411004137540469053418634046916829095623083037368147796e+01)},\n                                                                                          {SC_(9.28560339730211126152426004409790039062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-10), SC_(1.07693593693067459739313196967983697014168456746735348950919376991901134647895921249473783820425440748624729046805302065147100445478576472841997876556348031552956847123213018659344562570860704628256642731968975802662512832765217693879980226435177749884163278536128229784803704747100947313765909472695150172294912887298258373307813501549625979139710091181006478520754982671108876330020574992387977252845102120807513897028338524143351916484881826006078361700760820994355807138708960301667204359286421020e+09), SC_(2.07973857504644610716889395527737992585186849324495128250619250061479886870375850394426233184821495976670242716899017325165163154088869376465418506805353926143256480084118576294761652581847352892907919904429997475140686105674530141840068766707330442895114253613073589774120006201302061827279282589546526093188104157655815622515958409221402489609226382619746450223058090686879130896414033263620750912064412230268748715901437966406012423491677890763788052175548531716952413812038430090387475416035911166e+01)},\n                                                                                          {SC_(1.69822733653290924848988652229309082031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-09), SC_(5.88849312166503329222804086517709611102504992551929827158983260288274819355761666131361350403874753215463840071495318131961262300000765445973666229487031598720857498492987143522791355463828265864402139432350575863919550830036469565606199591470156705446960446045999559624084043933730929837654285300895855904989248038146101301631557036491570331704774925320131536014567404874489691389486251736352515404220755516488822817333832143329345542864773188420965679770154373216348702981384689050349014346637868895e+08), SC_(2.01936808721548656388079701232333621990292234406195324994727476802362692900192163204786445631523775797240087658142441617001290954758379696663986806394767773157322284307849876524904682586819191449092688119556710946373436273820321044371035628264815659393916459198676972087410240894826301225696379803232794401251838170344674786562306664018746217590477957014229341960304890117884805982875916303367067026067301211977791816334606548169972461693412588611268696560770810948724317758861874065303224659055768486e+01)},\n                                                                                          {SC_(3.39355921141759608872234821319580078125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-09), SC_(2.94675865585811635298905545790724556951261971511817324192800337091966952557433897238486040563146326422690127775802629136506732120683355613677456114065442582606140614028294138747202403264952788642284199088873893000648208374234647107722407968127897446593386208233249293959770393729136064523101800224883878867516495924927666979551417108620059324211868720429514373406034762486902686884221653802832710722135064601777922572822590724018314669731551707502644268987523794807797201345037498713836837200106117859e+08), SC_(1.95013865494979315748313424975857460473634359955171433398912789707630274299619009224156325830001463741355320932191136639198272143513408963597746842884554261062767061011794862873805897207009188860568189846504131852234332017714959090717508237726771666011207787732265446873884001434343930063513478218717017119608818828926407280580928774522312004033748177516159660878382197007027146156778530958492741043073137226561947610796232234756201323918090842542134154240717765908943925443129110964257210652469765459e+01)},\n                                                                                          {SC_(6.31372820691922242986038327217102050781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-09), SC_(1.58385024439239560678029793644762724145694760750936270448787476917426742365312993416495445258066935770102073399067933673940787592468244489319355965681748597844017136875830896374444946819887498943387605128932905916683614722179628126645099686007619813917603450327015203485661027618036158569766302078449406310364340890783600576522072882996092981719203190666518838669113707153191547698768060884224247649696478290695897698814564809558453790895608263410530264953882534568878304886285345294246575653964394933e+08), SC_(1.88805394901935901312944434284350951219368630628612582497798500377213575430066187911538214347407247506592302835814578379074942968724063304830478545485499104982891564902834873083552388009367885301931886283108030732695152751848460305522542720948518365374089606446212603641365595987395773574687901369258435992285754676676444454303083046616673187875296372440378443356862117485368511965690403951383780793178907009178840322578791980487361471021699988380686049660994558986894513487250480575078814977194988926e+01)},\n                                                                                          {SC_(8.38326386087828723248094320297241210937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-09), SC_(1.19285282171266658145508408138097534262559562256796179239060845011847752757742744827549809320449524476525678489254530873060639064343374370418109877624082104111867971537796336728658937487311009651740723155108598523574089439636001946998412481579157288344084972946019075804904453746381170904188301113624111553121632985948929138222683651820769143181173655246038790436308561376021389687302205902619878055292692238813786176438899128455354260304627671521514620334784061653162359203841812596820283636012413155e+08), SC_(1.85970285112369275360019811510798597407616819997535534540861800006130065438481930599974368466408856952940619414764119222982234819668925719824207934180803628792362844837237434872443976991587061436543189016693448298778560625710296335004224090879870402508253963121606317871340026351185428422401899631577649568952634738322641017608299843257260519480390161519206689676784551329384425137071265909687534307017746909409303177372383274507940067443301831530926380849233752290042798372825621637792458149510367158e+01)},\n                                                                                          {SC_(1.96263059137891104910522699356079101562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-08), SC_(5.09520229157747964001427996680084687728519220880694851417761451758485922028137797926986558108081161647424335273935443009450702693139660492793598652472042922321455560347329476289740970225980232132484721944368298424652675989140325777048780846103353145589579610596228532659731472516752040401388614999099106605361023985232754174754462689599358275454662950394291313192314924154309854807338240568480536882437606662081858664976471783856993462009295129472122922430204094632485111706729685334953903001928515306e+07), SC_(1.77463950207854514067971232064740260529105197804463559048243833216868226570768682518176721601656061733151204368405143742619830734756623431664082017620746152360142944331261018871625099695179564716131664620296596142717865215783930311250469461067216865839155669595131410277575494071155624571181890018520530487012085131270472606584209551187422858235247484254934923176063127943828270477251954203313710078679176167435792694591424828856084830989589146231865386331847539580708042557229489148910726228436273224e+01)},\n                                                                                          {SC_(5.25638483850343618541955947875976562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-08), SC_(1.90244816615071042976912611629696763144346541035766078085764029503997602581877792049646577520911176605141052583156884910047229341218903573541592559499518194959491983325368765455962448031602893719065828910665027882587968020448370625205459497212847547686522514510967372971354497619542701997056077016761039101147586700231467014866991293439747219121625945505887139948909731139184864350248915445653527417884819966623498522753330295654416087777162453609622667919905235926258921853904509270133969132116091634e+07), SC_(1.67612372162164061692861843009343434771981611053111621976184895674270615702556422861104711239670932942032636331270126587785220494849967705136661812539736970981197905984513517678832773229865521494702028014410160745047515210657408196793002836449416485413273544305012535544219297954738314917704098327165656062964601614781986549238030592926364895039476594734612878189916934277091367272748422762481586851408931992506671596123378100473697510918014617091780151806715692586329303065621890707562029937748330347e+01)},\n                                                                                          {SC_(1.16242290459922514855861663818359375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-07), SC_(8.60272048104487229772270370408991565622146793420283748432283683850487109590703567341512208842888206543920002357186841608997218745333833023455975206855307233940669287790010316749659645433998894151744284846749708391642403854115820092354766734491127892363620549380243024276736218478701060023730673432191670156499018218581472049008969127266351163613795232939963359099049229223643932353224706265523448130695355903869011220522517153184148351405100515798526771128492374949302429712428995265054565616102236743e+06), SC_(1.59675890462055852493050785354007861019565072353741022812627104322063156529086182292122548245675963093183064733327338722657905893984234890223568744516553902070973717709098500393275533107035456906906513737015232252328472020431774422782634447132083994791646502267731048214337727523605199382839002174372325259458602525164508779404945196242777027746479829450292065967587035499960957349740151867689420397814665735654733186029950552962743110042418202174503847771730953250698037145722977227920266313544340773e+01)},\n                                                                                          {SC_(1.77692015768116107210516929626464843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-07), SC_(5.62771429605701866811138968820040581688116632816625983330513767541698354176855994730746674759831971880240445767320154220938966723002674804699555553392464572752062447887107572218019828318385760764849719115812290395527218248512835468451576239683644796014696087840260231260544768733299352553787968817182380161518794267110224517746786086312897558884287582163631755473909091469973820008996113444080900207916568204012349110621060594004089234828356435145317529589017309777517404825895108564229825972606783182e+06), SC_(1.55432139311902849557388986039946494987126573050313531526481779205905405668433477095198392052135320177727361621658987782230848885023817861314864082631463951648319984960611870632532168113895900910854247521399554895529781550582806849790523833389893084518536060834832685622097231090397585685502199395551134545521290924266861842592714224402073494637426674029193910125176587896815977374475577011900752678646424642579248726361363336678870110288587035477510896039630197401429009658705999914443878600811574386e+01)},\n                                                                                          {SC_(2.46631088884896598756313323974609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-07), SC_(4.05463829463703525078122574940316185372614216769109157708814571443486612751575690613250765783963915311892809190311521636840848682833365271859823541200911649626456985869205183744879031447905297712068866428485718280809470026817621417084457752394310317819688996380906775828413109847499866410583703740515922882544138759737755727432557079831161548511524423498124090291597806689974390433799904149419080022622021024787189417104421660109962432297064272955004064700460013960135399781819403593602459160459413744e+06), SC_(1.52153720417102064745346523708311080286908527069304380979659806362345202173276520946568894036685196482196087450838867175344344468238318814384356738850916294525418838439245756796795747454256238522398060373267581786207971837564233417365834530177830732568954115312718140425486929049831566682146227958628349055286920128285911779848078583664754564964840731594796819254368142311552040020238959735263159278838020281187709608149004880883080370901523357618622591286058941009526205756711994702121770949864546654e+01)},\n                                                                                          {SC_(7.93268782217637635767459869384765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-07), SC_(1.26060619619731797608818932503181830260823421781213048732665695327420696362898453758226660591820476065756957020975520019667707610555894768703507485484222106076869765708337512029685375685746413643372605490449629888194538976635668689248136807099122488332322328884163089485410632245588395068264245821725494222737390864654038651030533750522546976123471768082838483346923830312776214845895208472603705758787692650064498899060550013054720470762070785663552346599987591854146837595704246331651813008524383209e+06), SC_(1.40471032713253781161105456090844398310531699761588801858703943827256004083339187938282688922859386138059958746496554270966644869917724313173459469024731217872312313939028706531208267916779711847875755923115508248648357114981186732018707140167984280398904591328254471708347734049112217021783628832842204199345747439816740684385414946326168177179946882060522211697405823017982624446938981152321786117064296988318870088712395225819402305299983569779003430897690524415945397318576782524369949353588329616e+01)},\n                                                                                          {SC_(1.37209326567244715988636016845703125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-06), SC_(7.28812853343498664144152447838008783938567673932162819960961771256950384002603126229351335533069556913916892568138616531409143041501189818980704581213281032710490015194970354870756213476299773879811898004568190420013714451336012132400839252929052511244586664386695283946540013669687700896185000308463082744375107020456438967956604931415578634631979274913179204735917911437772705149748195582640430894253267806733655964881188471383295076887111769104559648198985229120804501321038598800302786397869897490e+05), SC_(1.34991722610834251544478254617081208033887846401310469427406095478843346196811171297685073308928006301987164377413398299284980888737753603655332120887310757344649691900092227409561455158414895169100825749492101027579480515522441587439428668126217470515921622120380597586481272803721815179676865176168002630196740690339996435287953994766447951272834237454248437077301244123733043940406921792054573656410299063798548540972124521498460570764799509713656084726107747894221393929095901305152701667831232883e+01)},\n                                                                                          {SC_(2.14747706195339560508728027343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-06), SC_(4.65662138219785513456021194162659715040199784495451432714692244736381873142785567562103911931072664389018733512973345980123097086105957143181830422993307222537024789466998094044967709540947345569548881850284232773624903802613550469100983177752083220734207267969462805084427281822878812239074581148461697210298236933264855944662677760069483003826859992395504506972326467470916808301997979437414794764181083226857845955214583704416618979717374942753521670200061935257869925639843860532949699488119920342e+05), SC_(1.30512156248704163419310858052987283807885073935136057758898979845218818037254859855534477451394234492262573113912574193529039772507620648887073103288733240844530015624769737072016655692043999870453260213995786982745953810791105720212177103030589518066961157830316056921435994370920505014296960653565850275264051276660243817416894060431159237063418800675904538400890810373846318565995207426410477915174816465069935340231044180571276528013572674914197376905082237182062279095158542604714638986206139428e+01)},\n                                                                                          {SC_(5.27022712049074470996856689453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-06), SC_(1.89744566051396948131191467613435700133438193946287587593391216386661306606335409546369520065981423905125657400592597211211243004697254375450734895459592300815375383152751165081305823627983584181411284526182204207394660389795419887200792166308617327974051439608467092227533174890458055752767205733534348342642249333065058210492219904013467166773249090089125094303714125962392590340230759838587590812261282901800275368686907652321958606428003570401793590415297039558116943719793472143796722363193257473e+05), SC_(1.21534340574375251331797866321470805050072336943670368507800133643376730773790413820040384632351349786576361785072435541887797662530053082201097185957785332034829965887731383605989153147309401665061094744509328906214042555919268939030387813798149437192066156894881989347180491920144816757302805182042339614005936728867964872372329336770418426254156892181076908397406972043893748829677877785432144800417604037445100468162760543750235752313608369165085076555511055641440400557644122506521106201156828000e+01)},\n                                                                                          {SC_(9.23316110856831073760986328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-06), SC_(1.08304692055151174435645853312702433563445401245428008062158172231455734708917727233248309622995416103476130730859783426082812474016241501932511000475901840984624284970956268938241100845148302704104227692202374326021995429710412190789499517501742831968214505026085727217377064048749586381949765702833484753838333062317642259075801944397863616645673756838251985742411639158567796696629295388664024665052813892150438181549706074897778508926078559131307287669070666914378154990685310194791830936012072137e+05), SC_(1.15927037566595656608676333962593457748246358442149722307760213653329691390266732585232312633218072213780520674080290918004260905060501441987250389989879522599564165926295894900973356709358185982833184287889198682185728270473692925487109895376481633969407425746209783983216649854424136095892698254944537841867507179483097032287978923877995255955010604613196178590571391372314231476100820183230223610979878398116965034513157331357185817159093437732287357107176531525209785815749703666087413492601638367e+01)},\n                                                                                          {SC_(2.69396477960981428623199462890625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-05), SC_(3.71194329747660700872822240489096533346970414462319130943332437727673026086395871555354923534426796329307758684090756605125926441079955027284505526484660084516570689496028558153640491596899194314856682287855875398764204347089952167700379787578451809878965118618325856981967306344605010950402177172875745453986482790033650570205353879618538529832262937125092859324209602202715647865832427287280809938499032165592488069349477641753571240221659642079940920995507104949485325593819265961739532385927724001e+04), SC_(1.05218959113191896554438255983392789165506636604484179691160873065455025312686246355084294414971498650330801965012760611510148977404541413264372006775938011586906419749948493205342928656222439747335580984568333324076988203103506297440002347920779866410520674190113274847777131783052870610390167794377546520034787355528411508314922975386358933134353197222922919703716998581882764082601589614612452860504022521256961901296746671426803571353232525264162049239730237299766785596779287518475633276054504511e+01)},\n                                                                                          {SC_(3.20805702358484268188476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-05), SC_(3.11709385543515572081573476743918797729420381355450382111209778511181152310932055956563749014637508036076666934504020805229942252077588670358362288265495735084797052807569608353528679336352612738901337701163849825424516929631780124984065988054242480080427910793718686499912898841019187210679705723175454260477745636077694212098776697591722777186050104731968499613418884068268352388977472866805105290135328421979342194632200989741338926428484922875461512185439530419888158628103661380037688089459246622e+04), SC_(1.03472414831310176380983520126166183229500641071994253195046291587080019387137512979227110645263077621786969120878177843284129518960337795398690432074360786303100938249647682482133908324719023468000441189614849101558514019884444875606114225203976467536402967505115161687406889548187118481920055496926584251660690334337239079454029278564608943116880634267663164371010715252754735624250229428238157024613942707533924518433208364222285625505553939009603522382189325666940210790483815089523032160326727186e+01)},\n                                                                                          {SC_(1.09570304630324244499206542968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-04), SC_(9.12598326298792575871376208892941821597249145712355235734553245112275791184424920173192390958809327836147088440453600847272070731838167459383457734633274396531286746571484131371295317801711910499009978655927962435202345802991303378916715764960222274468063689080593822570418178751973369105720490378352700618930760845476121115398840126230586994459640874070111920630086235547729480577307390280974311106356863825358553687848655142111054663297488417064528607271372924608147255338609518866735822561855075808e+03), SC_(9.11888092749354750131942804760198365932951387446607940153090806005643231331865994203153064090907668937081238831422255569214073300853117391260189906213547756795578339461193047601491906417607295384073771562974969006175586199307941274383550444330451406419535665500372152406327606813356895490483840883903495107538235046324827393471368712595702254706807119781085992818405020677615041495700125639064504392716280328536528527483253025798036974151336021910553259995244874029242300562997202783539503321465074836e+00)},\n                                                                                          {SC_(1.26518658362329006195068359375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-04), SC_(7.90339543765010940777148884430598859351624539666986011225276345158776246884141569590179807044935540608336020073420198831987509235879831098864207174778508378299183243304945942399124179383363140239127129852788889394591268763142954004803973096640508764838455634334250452217575170092021719528520780979702520546195516521766092522673675677114507991883621135632426293262864552958004567105759441872777690805227017885582718414531016665919775279511441635073252680404200996526347257159690831721716257307386634020e+03), SC_(8.97504774835078092356190417460687731975039635483901022943615671319109149737911055314981699026784930674690670230372344603892513366502197739637264654321535008940079734351022352120615821558964314283413690614455978052538154196046662526310741944191671468287266268233426532630706431678673817316378735628183210777142361433016716451904550644715844194615744623549079746505429283121123624192521206839116751685248416746623025501661583164546510521555172172770363313019918383836960358393888517833715726142629204114e+00)},\n                                                                                          {SC_(2.89763789623975753784179687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-04), SC_(3.45050990712494949775484002402506388638080961096441424786111616212629018401813163185537287870628332365611975002748252281954445942791824089759407952360045363041729854235263163931426111990963272192916849625697623347007557637621285946168372199998129262208030995630954149379608985182807987421083472125798154110350638801183057973882308932482367706263206585063709642030346439272821014392389727598715876907984410099739266841331289003132310293615533755248496236332102731721832627511713932767473667701783430362e+03), SC_(8.14627729827083672260241473795882251685177893472958167349605915118977814410015333417694750657030461729339257490528025119250178359084774998230863794007053582161693347623694527222996422723379100574685447013068079638620883177928422256598825247182208799316990898594977407941592694581625618281858646634334423979133024372486968759491378328948502691422577116400902205623065242117642679484587995259074059369354113787583549754706589392229130887348557036144422650603292395363687531902954386667400975083172345586e+00)},\n                                                                                          {SC_(6.87856925651431083679199218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-04), SC_(1.45321416213776341402172643653824290406246448625953718991061156275374559371473926240159189562530897642663657874824554509667432592596502028111498876987731731419103181077902550647076830258178738399692656235388664685636163262176946409182939329754572681632034342895691385894677553479890654931971482605617255828759487638944296672758417176666979192400085893856817992255670426756593975946191143479418145211492672337177829308430717007395722848329062849814785306945348487702248579633088084778151184300309266488e+03), SC_(7.28153304578384526584740309475807940366672770326761440940762897710596740030873024930437245041126693802972723766820782336184883357255905701949197956259485841269939774864827721578724722429879285781856120681590534300373112907042521537083714436074932198957147919504117058586652251820950663673303273139893930539087144915014830401325006614936376974832764368207617357592682985463417492708094036271644356036769127411668259712404556319653473155967703044648299583649315831983842605529260138729644416212347308063e+00)},\n                                                                                          {SC_(1.45484786480665206909179687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-03), SC_(6.86781314954593160454464618092638855307877715120008177395736462810782174656198499987155564941616352195397978189958626591964468149122014404578158273793351109200213113242205214101044790656181720304965625629108123017569222776687767520209813381764274910480897470251188192687862750700740524066029998775711155906709369717589842957496547022861611550070495006016302488665795132883296840140179617961235225362018556687105202197899534545930741979641738181687774160395997039192122337171298869606024764194152572205e+02), SC_(6.53201592270476536860947401963790763923758464656367263306060046607497918271178641252338567185849747672002776634506076650648391589820323978592182449435073300185043423125573525602447945355905816656067022917255389590808978616355532501271604376496797233681175875074422547652589334792206541712331187984801333409296389423652916811105854094159227253078778899017652515577545872921594094374282044642163199705253838209075554053916667166971670921667204169860545673190811176573623732640765103804713524763978549642e+00)},\n                                                                                          {SC_(2.84763518720865249633789062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-03), SC_(3.50594171696151285909745151539060148090670100756598276592118180115987704129717344737175536146838467429650509880933261757536214809892173281876006961922839017349368918016715871059899525030941759609599269441898890931160728866049789584876193014773218548509654645319159561127258379771324092719966908675957131318483541799312767747733138961436119057779331859641695772856381662725815794379091863942494612270061680368205577445870953007609987741104005991805804886967384188275707554716979388087267636532946282078e+02), SC_(5.85962934855018738649587312234013861000302129002387515656848684744945876545003674583879202077964721098762835565299861962310916008066036172236976819930438289116464091969366411037592261252848982404206750088667969180754458945474285474601066663817491557087065960821804732948417813401515198784400105833419751461696325694087766748324802786184900101367488656974546138080516802723177843393752642666700380479419135279302308967786036757719890914724222867842139605213115580195304952037597706912460432334234902066e+00)},\n                                                                                          {SC_(5.64682111144065856933593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-03), SC_(1.76519128540056304742831997519877820920857036914650901573270747956845477500889430697791487592196803258689553507495813881022776480777925700182036665576971280072328890974816214386062388950744611023401725987258039815422475168276086738701705000544747226989884474035058273612828243108186586517112777510088124111564539998697510264649032558567739799755678748844961531931104024399830344324164790517360715481533255431541118846660346844535860168147964486866047359898493337601385827325615954944742621429321977581e+02), SC_(5.17342924749847509395382677345036844101386697468349132677587382453025545597250597832024586312263039851038054560204026648849897213226041789143731646890157430242670947732858306884595312712256217331938275330011909939145523867716578226550295227412107943048043687400262298491544402458520241247144003660180386212975533604735504214749965015720884534279252951041120761999648196048357797420424505106730015081309075580772224806827744896280719587243764810430249896719753220866678503719199010381856204558124856374e+00)},\n                                                                                          {SC_(1.16216316819190979003906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(8.54805948781229923149687641890635273041975417474905882859150516565590298743474220866223427847397219829369000787365484657820972691183108360605393331283145369982954735683172978957406283752717555211684709068397614268169647182606579192285035162851360588278393626951222557182654523459375034429014293356095258118240324502965413852124342360304922331374659768398497859177287801543512494826720289510820485846755824343228251545178145676407581591245429045649416349044250416913523846071033825128926490142637555209e+01), SC_(4.44828938969349535148810997617139307954227933026998994112515594555692200779333843464356653807921936992867624497189566489714896857491962316363828135293928928346656864064617647335878702422430142925101126291391714324130882393175364831612313548374438381832325779808261417954388871727651255253232705020856911750794487479982819966152311932156460627180969788906322678826909888730809759061812987798687444590362138599953149339329603462078768122099122835718866740346965377935783016681741937074820082041620821229e+00)},\n                                                                                          {SC_(2.57236361503601074218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(3.83223951967113693849122890317251581426967564682796089915964456835265948178547033943047557579841168870426481105111239555909984888566219617456297725026211199966229821867396896637673047846203677720619527001090874122989539262164276823985235279052457210386157561812538654504918195664295917949283586772716395811634553989103419541323834554767430044867416405158430381076975887538013410973782203585237740277871442626129687031933867672020721719964459784999936157127453790515452253439903564787419239743591953735e+01), SC_(3.64603445628268180815228446194149337645492864618317199432418684416543018270226503511460400594569703029802101239399103310482691389005692181097074338257638671907992807691192922059620682440896513659224462009722394389581858799601911686718694851673895425167333370010580684144797968600958815062396012803331103402562839775473490687537808011575400396372112998895944651405677171661590755009935769417687641381092691734206386019166963834756183746889477962328743513839292774321043859834004242466174346299715639715e+00)},\n                                                                                          {SC_(5.60617148876190185546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(1.73130292072055181332528155290397626567590041507263494389423293518332512065213706248091156839903121576423171826799183870730052420390377795841699975327731506894205043429718237598549528618024309783147598930694013249097703503193128875785371460887670941110426110649033031522216424367225466117889459621951853207485923846568405880011044669040489333426682118087888525374235517821551139711223601978742628388427488194084278925710136997272334148684152483989197734051109512385005918855581117719442233374533422244e+01), SC_(2.85145935140559624069624461061073352033685732756820805957005838077186103003354080673737557189099925222021795696661665853518636804085091657285841456607737476426645592333146127781631727888953940992284927928306043552361916447918323282469427741999878319265371284600734940623454427339491501614225992065340251283593925141296480332996912477863604005197249766568111289688786686315245507596213806311552005867021049188904470043625006815633642348871266026153738589428518712450395800127807049373655934687568417331e+00)},\n                                                                                          {SC_(1.06835305690765380859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(8.87937594300137280222785178504237281981439562279757747352051112017636683902262772265882567787341933727313653229652916122291506572903276244906764087817565322262562231578119198439889397172690818865294208195973086367244330613132729788244977350056887782304089958939338325229445338626076593013444094664859749521861056733116710043733177675852597199662862200321171291806334222056142568553511466136167881100235172294895254202442503636358257078278759840849425123630124694068082847314610010282369584001586261853e+00), SC_(2.18373127784552189022885498465497378725174602502279874257568947818012110655570669710383812275007248898023855011570363491375778330408026208369307534619406033795714421333845585977938683598593439353594844370348254064282219915588151065915494297324923171198525509198152675095787497882326067723426000070832410772860559971251231892379783042570498001965458465779101525970184734775905368402518886395167646368847252388395330389342197997105657677203248240392695509386526846047757896615797092836470002490643633298e+00)},\n                                                                                          {SC_(2.40109324455261230468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.78368178711231748572573525384921992043324039087841552984182765916536616511007182819817947529256026069114281603423250421784805149083154700929567018507486497721146897268173695523381988008996518312445075106405346666217454765991551115606292938365849946881660425346595554991194890984373406939193890782449870111966141693907909130927359458596551510644771454460052235072482166749519660613764899466155251273563930908045243468567615852308986288038858920350451375815061357930111117157254756816152463843436327128e+00), SC_(1.33069755333858002682528355594543980693815080830370533083954040140260195653398211600745407909514068964724602269394591033304236792153229295793542951189322400050827513942267588200591266599249018149995398100320469707929205615364581942070307474177593988947465298790510611575030618715531455462387945757223905207989659084961839714183952763698696758176669305915307247150797661417783641740176782212774158911335502133645542871042818603699326206692704757081405565700275666335072274515905630940653959113015557377e+00)},\n                                                                                          {SC_(4.38671588897705078125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.01934827098895240866291564717148470275669350790670181518067930385460960037293047713749104474976545378311550134726627432493246281473486566445456021631400427110536255673815460084692784908956829653495993998690913162566451452325878295142067599750666467140637626487570692754761019581563191008018345327025821296654609413196999811589162106157757140856559879383490075416647663882482288743311346454343684899228300598158351924220896203043721869605613557353107864698167995101951259722097491579350956902970931209e+00), SC_(7.02774821229955033201098872522145702309892877930122696222989524936496725944203147163698086529296544937631736479740341375762633221927065058166212697662139823190263516531129117388895917944769456807118372772711996458078531822620766199003175648806790195767357047125727581511679389676806235768985317112567081989787111582319607295781808387339568984936622732251106484870203126608862728541660239102098528893658125927049289362506476736744933084082880129995438327280953236300426644368771292926944860776376107631e-01)},\n                                                                                          {SC_(9.03765439987182617187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.06560979056544150631486646775654894531497351725167706096010663906438214437064541280383121734941160110013742022603852718722974043716489921274151432075110987277321452784597219287693334742039128758201596461554834254278304725176897557872665236905185284924160764990132078376209152960730546416782338895816056903193589945923357184438008243261009964597638527688093732813264760840562843021362962398437652711368023143234727399617697596268517882044297733794559710970166806228215768323696486824556471166719059683e+00), SC_(6.35472086047240242476850173653964968094401254249645125812894399696989269072611985147350175386979540001317320432048487161687158377836798760540253238342535989944288732501843277339124525960211590046211344621131449288110335040489171975921179119993706307712533585084502959793358884082738581504049157966802149956240785900918636177358262658800443458403672205227617798438927337432399221706666884340845929646445623501901592486353757974256947960849040821025145345264978638085227457220184701989027155986122840831e-02)},\n                                                                                          {SC_(1.27602481842041015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.01414888950966447256741553037802701136914837769904660661341552878720993180981144638082955030623611082112991817736220467858881713541188940021200281798722356747839343824757865378792288085582653852666354963604237824428091058309940381345419447968927454656100213071087794811710211906454576989399445912084143541816722735712338070767965545035059458937634367561872704858664652199384243134873698614575689341524672508628895265595278960478185603597994851716518887234426980755563401446357574835173394489257258389e-01), SC_(-1.03789651277172193944086098338852746711453874554494751358201389145763256548191333008529778141620308270050982442005582738919672606157209775679357946534464297204946198894138476752722800806070647736840953123760641090828638676777046197081472678594658653029924350948826762779384389037531016067478554113108266601116041196944329962447909678357418268110606803095785064013479379529072212712584934963239795181858596438347804510477316820666489360204187718259096876068752105120502150744520502695973277633725886243e-01)}}};\n//#undef SC_\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/high_prec/gamma_1_2.ipp",
    "content": "//  Copyright 2016 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\nstatic const boost::array<boost::array<typename table_type<T>::type, 3>, 42> gamma_1_2 = {{{SC_(1.00000143051147460937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99999174288391999092757871949960760944599692334161113632612001448234829888352099654097074654344285708898686038400924243326257000995473599459860412189476206535957778861551088462375468578938240500307167618043731787467573306745319965463132052615688418631316435531309275145303892395341676733095522386701856522207240447267708668301329563326443831046210450368179263405643106444973478994275343456845976754204700528622443064906871609264433329448562184863557194334628845647631027980086626707202034219860132039e-01), SC_(-8.25711948900924692597299306183832574130326734078524848537366321722804959189414089321374321487571322916700881394838168937675017756067526027059906924659380618507813551107141661082752510377407448366888067712646753094821383103251070103298799663269077425948810538745741157050557462080083874347930605957984000258314264095908394093097201357665227991167061298266665567091332898437498972810629979744483195488186797207794753595348181654435055140261537588799716884603608921499148980999953580901141143177940912987e-07)},\n                                                                                           {SC_(1.00000190734863281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99998899052088870556298015139749114669312651159953142848295392815303317500016029969635974482718991700497816055817263571292901954688370348906253549005287861083171410201406647883485474421222649893000205148346129113166971062186410799748091336730057656052509954292585979817626028277775407407112537788176094920236533009104994139384430523864665582176691381647483160502797293814016280767994802120063648051546796192887146643586658388925305855542153022171696856252158767172309183370455258068376853535216362470e-01), SC_(-1.10094851717304002712268894099127595921487972573933586334689334527229248323934919014638550108524145553527405840273344353639000207218741487766297554573091476469480049905558271838458052416000410785954618163762239772914309942293307957081996934083616872743593791436745000684254951241300456576383726667911197040993317728453157236842228209877681100498209542136619826560930165076125847234456840374995616717759747291279589613997037378064178672114262185168274084948288257929977168303768505416039428474173888808e-06)},\n                                                                                           {SC_(1.00000715255737304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99995871482439030123562974470516145713394424812766636877383802416011979320279049083203112581733456099995683282738209665836532102308697025612534875128891666457345958520964130243018916433692201391748875528601051438277602513487355536872792386028259758535373151611332556663150738220804194424251848920431250539383936484964316068698893034940814586752406503829065074575875145977149630424770495659102034695665964258237898580634499483188073724936730054003089085359012125236558137262535083336056587140852800456e-01), SC_(-4.12852608332195851691203735959218082583309360270436920767851544796916430110170536266576060329474456009336058048427569309546294249770163912414335808655484082224000396074276450271816190829739395101572464054265620776265007334847480163917450671956548131916218767194273440313568874946498741895154818277265159531908173961864655218297464043731661102093299016819229971909322404880656592327408588191219928932127624518196151869557514361114934732089059682453199895851884381325844177861206907545771018319777526395e-06)},\n                                                                                           {SC_(1.00001382827758789062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99992018290683797846000226935056171185859936503128820835471750919976663152444739936675800355406606711512157240239127384452319098942674657017897817468120805836926848121657068423652761200611382709254842088377275403963217241357409925817025690122325186353402737193791739281574809393066322820848698863824029214072384456058169355314312772713088236719681578106869264305967664276510843791749709913005299240434221449190581606080546735845029507633743966156522363875224608869485434247381577247694136841387337506e-01), SC_(-7.98174117021345792583197715106148864099769997469814968659586924923411082051309399423820083379003398574828706106026847702771900443355053076333928564661934959347977543844422372354610528704694194514369673005031394800075820697954595056265037686466809758696282814462959586452027325510485481129596043614869818722579861830854885232173045580402917981131629803571485201158990471407846736365894690896340575434314344665619486163529114866521238533471912104264466874277993839991170047144881087379199096956344930374e-06)},\n                                                                                           {SC_(1.00001716613769531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99990091727863163325242222177264151557699017886575216984231288977651535626638346381310234072695038675659981791249420691007156006802164340387989178169488325851634552002703894997675940814211199538881805758913622490627980631399097588920415763179341948229307099650348008989816592713813726915109074989891788978965796994913538811183413860908256492363372407238104866387595665466503765367010396538799223340678265221385147175632220501459281016668716802117533163355282958056372905167080533658897792045054410079e-01), SC_(-9.90832122408929040408559547336655735086172539547473819642814546268213452104179698046816192544343649213516276050992499286077179633065711247130052986266586612792198019407011580703718749973206816410430099598884696898621732263753199017370635170322352068229418089019905571698341346767171969043521773124763386169098538786284978144876183616053588253360709161373130687567240750392131068350600396793696828309634567406848106245558829741030294161625454805367042624975175240236006902139797188269658688359388850604e-06)},\n                                                                                           {SC_(1.00006008148193359375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99965323597539602107075328547761587261019813359390369760751109252264732839906671037031518875134968012136696641174447037803904262082887969976109296285684390252157866836780186592932702237009167943025982890755934376143300721600433843080584322613515975251145176495194038059333781579482810573482380992838639055654464946705171224947543458455875016762570976299577906723146773198425090625559656009265422616400519050536628957500842705209930585910280037352659669895054043861427070231539351464283935980884908931e-01), SC_(-3.46770037007409655757667178857746223190711811787178225776104706289662004501688838200316229177747817138199803885280303413474034927454764780105040241282675413678168958627420206298519414644689489796825217807297340862467260672318740929958999360584422503219415448595860007050952381087378585257254009183598634422465183290108846220184440918709834134414756286915640039850168914802758353098152897222212865686814139570252607648258247174783738621351343846323154823824135361645528936757373238593936453258830559626e-05)},\n                                                                                           {SC_(1.00011682510375976562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99932580217349322111022028953617401331744333751403970060804097152155125562795257245209990189244390955065622803586974115564775452579165277800679992202499294033532574731584142945934294435673450155960678373595954883991435191422966953073303251361033522456325375489064785213746192226948204738894305982149533115149748405385850564842587242123139516721576059297438931817529512643270863422808208534475683331512001048644854819051058927620674300198483640232556173168539289960682363209643255386743487137951435608e-01), SC_(-6.74220554663799556877310402772443112760157761571902023463311635516217433897770295691084680383277023834238210219871774978089885153707718168224025213708002539939323526485458159206065857983075309830686070983216968357999309570523171700990741684698946763301064392077432210536224126429808942160450023453639044757019826692163047432599057748754815292572362647469482812022241942671262055942485364235176211540596083535537009938706493439634976520904423708619194103147768525477352233702757523202626115873106021273e-05)},\n                                                                                           {SC_(1.00014877319335937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99914147670522157119990095816051182525869285752191570299986635498915136588896493248365257759438213001482731183963093196649233881218040818957792374396660936598196305684819148527571896894670840843075654286835564773000594859074473690225403830688350354252139596396883469105131902182804954743787255215002586550458745855022390733700033552487189754708762505434494766042941772545691183075216127229908050031032252997777058211897547918467712668931901682746348165792889219319764070713850889628242784768424868130e-01), SC_(-8.58560150000232182840017338970199207015444462387386607649752923794156356753324749863484023674482826368894211048585691962413851546114269579480065761062341760434702534740992077291531596054368583871596159082563812571726762650773153069310637429285445540476388286200085615639301380104059851185751956992083481298692217441089203287067778907940777696367340030092049574459913524572177529000648022805010658269187678613395820117311947653348295570171839424515238720298923295035866057993641637438770886487510361427e-05)},\n                                                                                           {SC_(1.00039815902709960937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99770333110831492808746107899166135280142203963707103455559351498353730379622819894763111240763432539056047936359580766442659319921652358936987966214938950939435663301222127947502411131332209082447717639899925306161185533504539560696196046757852273728024849898337683541947420067193081937907625447769106391972105734465495304033409391663299515305873457058683377675271966433428080840182451133769485259668772279477913835172938605800816170644204743795319739336290349933820409636830617776722200662226423410e-01), SC_(-2.29693266647263659905267506634368150483626461773464138564883162577609178712280408452312056570476352591647966867985753773286072034838577415545063255615155600715276129983764450847384254995243544335451212874166249277514712689608517250431900213708104149683916395785770433269863454207362975420101202621074988088246180747303492773111501326915687144736749558273211568644678725198708337441028102186739131006289732732451411357227579446820937346539059417079097069904499656657749370706773592719032343614925133271e-04)},\n                                                                                           {SC_(1.00063848495483398437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99631859447795538102193086350466626797653070729794205440800520055636280763885061673862015030796869853893789243475736071832934110880676018608126876844999256516872278028164486551902037327521458584687257382213309438429801326762332746780555937892390377489762791671064874927604230957617846733925263989858598196284959978561705689127705026814246454264077811405090206416845460825762177518652427086599576814868159221508338773364149774888148314871107526895227752545125757315695610947566263171638714842858738272e-01), SC_(-3.68208332573195956331210081624594239749394416803950908768685933543093626633451555793231113756331335425963182990684777112954271367958172970283738601921956301734980965046021109384234366447704543598220974149455699644080458292345192792596261425685403086325921370880394538207189224801004010561669507034655239854624541613368723129243328830529900319847443342058489559670277958326928917863667680577628031005468470452675568722782294683578292536699572826364160501920571986429433940804663506127245264105983664301e-04)},\n                                                                                           {SC_(1.00107145309448242187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99382674822601667403239575382618951458893199251301947146215993352196283762341237298698231312941265613694903447679790369281559605314211409159830913156190622044924254885952656386521417492543976139615818498174187287133742132249380106828717540300112779917059538337849851096305151233791188029858916028445980753589436609863762082166374840070247490176396648225666182221677814131865874707658977935654371728304366144253753158711600380365080650129423678311958337349802342329016782920332415801360758065052764693e-01), SC_(-6.17515801040877325131151232919778004462797029509263756439665376295049986314719517615619416044020139941656219729463770419342221308377598718445537314327839397064675755119235423378203363475348607407689849591829201234719170773126477412940229835868424119423489707620954508876185462076594438172323119672045609009061662915362180538360149343723949200326445809001654182581777638480231628275052706847821672195497723988024572921599072175197242142212195116944762930191378376328084045634116582617540525060723552551e-04)},\n                                                                                           {SC_(1.00302171707153320312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.98264823461931536749416512755660281120989924865707625229833257960645264035500100250336898184907448998921042036230368188091708046504522273427794078979113111960829807534456665305177251159579747032678402428834297225115471239166750815621846487365110340243197886307308000837905364975250652215207125797086578339200177075082274308974522430592585814094736901318362632618659922741288815306432900856791717414156527945120488582581537806945315376665198216838443054961618230007143995001406730984367520071959292714e-01), SC_(-1.73668370059196286526539979196054130140895376467504060472269120641199689896392717833308713991174930707390895685228964418616313569936348016118980224344687827465558226448493405115419933128303920683280943663247672453726972961437611838482173177548854889388730797437720783444466661451141517724151590371105457213113919681710114442333257409145438562709571297072489258507270738823389529512161726965101165499837215710030502282466952003769887407843034316530688055949633407900696533642354006548208448645662316917e-03)},\n                                                                                           {SC_(1.00499391555786132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.97141987555054340304313176463811884706264975589409907711234106560058609393271957307055082872891129410102083699500728283618347812653629468281551207846668700643470399586576624117253612700605418076832930868289087002572928070786756405137053359765443944765968271908912062956518242691227870162853819197340367908118996679846253679049356114011183750259927716203480089987629318935061831663652778532993830636783378403442682358220843386678860533265544542528384278621171051277427390347574579492853577100128619407e-01), SC_(-2.86210436087086001219787203735569562421372152373863548640068045829675888249714024869717239721994061219165785957749026372538378678509251738859065487118286167323424304865392614274250231752411862994497835172325480685039413276552426722185380374001250774890081771218253381634489468447683838615323458562556132390816770034833055105238636360789783990787873918822664133911201583322251908688863597569845687382260426660773087641598696053109034352095877056488917071635782120160167491767030736813586543030924751972e-03)},\n                                                                                           {SC_(1.00928401947021484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.94725649294890404479691100544964299212951704478613530903971822806017329877156708018465369324189948798034254635780503202894085998084733850371417658768318005687261606936611555053869547658745148804444802910439708812910773154353420286199364712053375318222724588767021914345493933709903167527793547413249855259854089366858866896664154070656991436736886582807429735741274943744190439486793177574882112810679231693943021915551996830675255244876341153517755183653646041518858296397522796201891082052630011680e-01), SC_(-5.28830919574000394857298213309555217277552558169501942679144421480630307191430194474561267421233056506945756642955882873960771251210761377932729055199230933294031635221988391115425824318672303823777879654381369427266345995275947337336618588685415927144581932003652590401257458835032565848265828024191566846037511249492915676767412627621261275712261144003161259984311425096376028822716363239133708904326402490271273591177695515131973061269294472455115171077929366425109455097808718265759636660823511773e-03)},\n                                                                                           {SC_(1.02416992187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.86614048062602117123406311118908657526377765145590897833523630975503363209176138538389943023236553603567032030295329814866052858161398959719488439602760043127493599629647790910368650401083097710387444443112945732297448026376057799816375936299971289892260452026548899140129220485002888583419955984239574912694509374491745016651528016606029396150839935179771239942510295480902170767514068781705260053508993213902538634255145495226403542335065511017877104815179205392647102946016289317357707173178319778e-01), SC_(-1.34763514204995372109520288412048333775377813106008243000148150918296004262962726414132914028794577353429614250975299694173700835973336120904901398475019010957711015087496744076484212085372674226997687893794106127390983166014459284671204531469581065659308636723155764096816681418792159648003075197102825097837643825841085478699904544782275291790410274144152650577672862729352423481593131480537858719681819399045310180592496365519546516973520373011933766484977458014591739445077700073769103597250567667e-02)},\n                                                                                           {SC_(1.06227731704711914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.67683284737636217813685234156898327768051602711302285901829303009936564635927633847791905521633600182260778451883080067109265151115529992925211612926715722203426431025001128565716170432011945340670439807499803976561841973814640123513684707855300283766826345586152363103902831064307590922557520983011890727883861293257299222429489009382052966333548186633019471937742818976913809802674997409468133243009640443196713199007760299064535991343883139271256226294904557987948005599961383926203112142304751891e-01), SC_(-3.28504304307040642219585079239267415655387519327605107558648615710409468862569859227455978653146395616102834823083140570843368962391564290326611187884817002376245922067354288141538130729190429210727139841839276253448391616940778575204647813069308428390814330462539441519296405032309130029624726521666062066510420118474939973861641972779471516623719555431865569868101377367606319715633947259100590108593611531959008242872074641637498065015954588974509068119809908143583335322131919999217251753951186048e-02)},\n                                                                                           {SC_(1.12234401702880859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.42719540443721868609002739661970901317374072285768379447466866954674796223379001999201565264677947553367307391082852503202607769289913522567688887058955685132616165787742839855998640874824219137049123198709821760747886535404924436193564823937315970827009692703009325365564932429177420389197235892443670127598813072041078050012898789236697316107241881629714345634175264626532960435557492555881063944965513891366901261370042103809394595612230568364837051250994297966981292812529454999511053648268266764e-01), SC_(-5.89864526271249351144556212579822618917436335049065095559579674127451726947716815647990915471041353567929075619948343725717548053442557223884779131419367919157584133387553223567375506176942960614314964694763936598785587324632686320182733715386907383114749720665798633555874573366724394801004742262541189978425319883592782254726978670759080718710838718774274176068877873338044184550009341943947599806101348846632287258040041525848381664958987160401558865553412301389282414760154376012162803848258086080e-02)},\n                                                                                           {SC_(1.24955749511718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.06493816701717652070796129681189279368155581078682075820670134311300664131805878872586560909347774849547077856785642913530318887990663829885598997306430503539463747760384445798729628986584285556511189918203631381512642237968267976800749340764140551780790213440489556072013302545763169764814551474864925015186841329299201026352946069132722200522135595378262960918915145172163243476478068099324456198209609874843860356636542021486098870105783313973496928190246231924822313645766881423162228482926452743e-01), SC_(-9.81710698786497220376429335539270291577202696321668505055577023289661137227566055993679749549766918458699591847594920910105255828822634290141131935936546209147240316032812525952523382179180640249028818445846744545617651819215028796677831516376847157547306218459444490819966549093798582410582121073841724280247709105859157726125972512495037490263556773941212263105105345816502885995240534301400324958919560073963596185728670816181963867297997989630900958703732881856633201726987832993395543288655355655e-02)},\n                                                                                           {SC_(1.49122190475463867187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.85975092788991742528041047924561577192733154188411771443460511494016648390575001890695683272836236515321056943442804539359597265274910084710921603660396269156598507728775879061867953195401830327778287272821941688982147004473011352892866957493463356307424660232522691594801771101120466915823926551028340522696126815833575982012695964065305355745762363170848885276046624884963565926602220756773747996380869706730672003309814235399043910590132770511920234964269726502103389367669862235505150898557966263e-01), SC_(-1.21066440748512404475024426968054339220139475801816468185017851452260119203818813132939295220966959576860336864073002283446059920152906043012149024456589573987061299654713751597706989918988719559690035557918832819457973675159107009641096292984585286590294204090882255710857113184702854471283701290417226824298947728969222795981705252849942735333352549341821313583386938754136637061655567217513693143381971281132686015952311886746414259153818520215140430872206179626007079632596580406780773162650910071e-01)},\n                                                                                           {SC_(1.98384714126586914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.93277940863746060094197659735027757230706286917741917762496289768909973927152319136925826790987137836060306879047113080832050742214997883337058606749529722735374603438145977294427160833784267011312076909076550541477208463886596934763667375400780519791449104728834334555489059974684968690493160617288828111978728838786866301310864555490911074901146366512699766804528603943358823947495513863982273895087758009700096077066283343694119497087163296220588369077116759749556165607389286281631813045097817428e-01), SC_(-6.74475393680727792069762024270330812537700489703053013284255062343350182439674474578730149516053038676811013704009948324320350047574120923780989626605300836004879573275984536698779115493092794651554687907372115587742289911340235342079018983733618420038276859524379547071361323963477361912857826074181438032171394433343549277630241247535256024056315554535944762558500606719649195939605908602554320144187923405070267451743300647279690038646110638038235596246122379284569329673191480466839566772904937236e-03)},\n                                                                                           {SC_(2.00000095367431640625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00000040319893632897083396218235250442687645120641744558071205705190318147242371991332042156751805833852697631957330509506196708584945266641045457660989815172203541816266426236940069173585211589763128871697578680808418618594108833421417980995744773022193915847912330485683365230207586357094671604272787550530903600224806658987408719323099820976084511227529072261830260642708557524072773978716369615012122132057589880483944058104433222796365791263393617076632690550955298233611068528870707089364095396e+00), SC_(4.03198855044301554816172072614225033788691505795611432584438613689610292824028384688095043674471559124897800612350231064864096087718457160639337450525089464591496773979407785076356708014174129536539640532615095723967138046302232419186403372347709059543748470408896810291291180015648613156670374402027509167511951650054983758492567575324143010258003034809361205157135224850913835714293416750775594448006015222943082316111780423579293934013166760093499975251633169677773646504254854198727344120013504365e-07)},\n                                                                                           {SC_(2.00000190734863281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00000080639862179156320749294205460277721263993072638189466465607403289991143399112081618390192080963070354362886119327646176199516603660937826302901159928779494258019082124712407057933583908441496121322063683259318008058781175829274964725273678817450354460034581300882836023853249853243649983467946063352515390711748246817082161654458328562433974332388415775058145731044093471875681157457108697886142238279184839101146584613813640533770816777389788965810315717293167650115988276824457403595566759389e+00), SC_(8.06398296652369388346753570212806293434617232720966725801587802276808064585926804588184187043135604602686396171466242066554348032404711308797270594130241494161534533864038783147874657175104558077883552634080070849598914179245766012967264457383839298001666035383180768607693646745391307544328709128695266429891189065277448225084990453870685304089249021637700855765025758836941010684469612390178013299005220982859478280091515998345131481699299506763765052696832472588629108234998520472751599705762862356e-07)},\n                                                                                           {SC_(2.00000667572021484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00000282240828612370720432797341957422445599590783120191598452050016192718431252156475433521025107815241299689727688190713762804692078252171442580070457989886811171740362147708150897847246521021353648087384510766114323922511042794780794963611368596831842470145084109206592297151053427050373627219979831633894688588291555439270912595000568295516884494034186513041322990336045552200687704404122041643387206167556427413751475495475766262400293533115355573835729416036577460770575506761724680166442542205e+00), SC_(2.82240430313693482259741002317161344692584090816350421570061439040390205793534184180679012494641343828056263558002807243971560338327014657463162594242259880851334402250020991610342925766542062329630756367550321323211687945637272726042075205149190416983911272664024992320980212857811481896974987286244636574782770763547904245074167747630014211411345847779432353677900379896876560812240587252030790328354166673314806061716097732347525218908223708776924400221206951936181129323023407095316462578683205523e-06)},\n                                                                                           {SC_(2.00001335144042968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00000564485327991968668594609717588743187620334387669560320925683608138323706505379186671848228233776630265493443006782405469373155950681711638198173774648872464328767774535861493087995322216857536320454566762040450313550698727293463258463329821616727965930447601219959984721044168618580561296210950745646574464740623985999575897298077649444083254875738139464502197343599936704712558359823411346914202036213419554769879303409746624911821501582952260886957328885985322110392828234082593263639947413253e+00), SC_(5.64483734779536708386785894934199777725964876845433467264447717112994234556972534192218656188108493669337126323346525968019986211081211701648787471584545174938623855070199540574827647819065018548603418529971801560701167562341186495748315805711171811817613909853725214174720409287402657526024192981129576773427177060556261477821785713896316233730786535929598718603282821984633658641971448620591249698834069603542821378964494629888597814475264502798958300823972230397309547512496385402948011659018612308e-06)},\n                                                                                           {SC_(2.00001716613769531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00000725769547171200167564651655781339501747509170098598324110434935716090095444696937906607363088739878177923814143661505313658313437339243393242291780132442290199415466622168654728458608339173247740576549746614640956566066866430011407322576072587095409588704181386960856222173704985729295910394663867051373449414642750484101682727247737150988891422843497594286426018641870789465070238089390338211030500873713792516468514692736358005370399134292567498197113950550095013629986729155685259947938135536e+00), SC_(7.25766913476765189195943994441059059063931591396766321180095950635741905767289274108973144158196620893048522962182368196336453133307209215602635345230143943859407773807168277575281927389367146545537872394784276831689726825577222687305283368915549011001823219543451522711095115473870948208010149514574062931974517483036146556187182145659391171551431216570623340783643192270760300569668149898941633206468627648411118821538870638769588745778143031469232973340074226512043471253590740081694584319298530296e-06)},\n                                                                                           {SC_(2.00006008148193359375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00002540299606354791065346284198395071392875295770431323580196614759982793856324349365396015329614421966458647642567726829113804005273586077478149065754298525775201160607751664030681223021989523182566039331380106760457489528499350049417578075515249135149538682436349952364131677792289256760214855379993211811298605656429676833893492196246177835739676095563228276086226377489403591966271602430351591781580342925613408409569377283919944732510580834336822851093251943664838933995360754027866586976925851e+00), SC_(2.54026734129075920683292497513548989135470818393407385853298137294395173713099726839012404342665592243399085416582332060628801690208097983739002406025934607527022791719818585971188300777024910785735796519500643466487320162076429378768121348997496169212590642570240123161578934167744566979249172495862343250947755453958462282871032707952094614466497359897253881671158104674131343402296124478766617373684005972841762744006880609634714505140811507944847363892081962397928329908133631675224301028449247209e-05)},\n                                                                                           {SC_(2.00011634826660156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00004919579971274987085172264051528477688620257556098733179199797634993006055608473993509011423580085655400431431748032522949606654990020016568322885459038549486931421278268572942503971061688380325649937281598614721987287749832098883394446271542552887155227649358981358083752285904573279825696370210973258395291081843521899210367510309139360759318429085870041933795710719739751402675370645882893834096485696907489845929951714564265042472412399767903286958066978690375487334358793398429830456561541246e+00), SC_(4.91945896390820475195370970645602094808037804377590418877034537519903014145963070050094790711325337883992554088808760086026030902259009588513453547405813184039270067427528313371078524967343062809805890477343634441228005677940570227333130604677886144106807165848097649545352137718974323948752964644308680893166137837610910555163484988859334163045674658729040392892717423042002979632823737182738830808717162341432139261825185824243512121766256143995598535133134723195587750262495436621336439795174387835e-05)},\n                                                                                           {SC_(2.00014877319335937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00006290809135631836010117832694910884162897852465378752121504232411219503893527713522395467812648391482447399141309991293749270126109922804569579351974393592882118993134665992128136689581102395919839579729236175109716400885285467347857304588838104602389799424028052742153471950528851108394765447248467693160600801279958904164762839085292385657809249863560539720701829052485256749042278246123879349245502162062142354267095491755531429549626456789964981518584088969769936886585070722733145919395422821e+00), SC_(6.29061127253201440487758474836373805783136286628744476010931129298030354555338078339617930326707541807536724443762505067268693291418747671368044733699672217831004599282343529717810773460926922006823045900978640697730593796486796292597553994448182322203424673613673826679553245785071474823905571747970217285633939851724732886368648977212490174113663820136503886232944614523399811332727124466745548877384069974675038479667681516039717424797860050660126927295087191793263665124491531011381265079322510497e-05)},\n                                                                                           {SC_(2.00039863586425781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00016860244976056265274104250042339264795490885298408767683185991260848173515982048063530097499917171148194931029349352640670782785724424106239359449491337847227802622585196405678868931956700176591838250468804948749651418462210706999940223229935053155558688743886448270973803464416218977188135288871521807292536522613240793899596571718868959233786678163988748880988951672966050324443415049581691737548496916730217092347107982502603129665491416261845625192330758149843287258281523770384959803934715742e+00), SC_(1.68588237964936617725573866192084801300187025488573449723958905292528558677560307939136401071488780012664616755906250008647359831845341046315862971508236868311850624153598433932470170707220423511352555441028287147256686322654153696151693628355062766009121440388562309459578300783864351215367098079641124426125653492611009828966768679542829405019789539978282261729619815161598550862768014752088779305148355628992689441225448919902699678811993936710593983239834116001627961033784077675665187451904779153e-04)},\n                                                                                           {SC_(2.00063800811767578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00026990750041852421765366910628431973474865306478493810159708621323870871973118744454114814939325483626647062327232431721609165735997428833979053416183622439983621245874940645789317173396881439394408015656296494647112371565895925809887772690783846745411149877139730876519000006744104903586271269698152110744658555649922874109964207178521955852588404483178141111968812445948355284551749269795546643581115097967186393797452722030686805063649653415569480391265099835897962993260240130068971271304727487e+00), SC_(2.69871081942065723897833099470995487800158997999008998347813401241773943654131765184972285158614214641749498196406392645505184508075530625363890023930226819460655785021303840797155528371522530911358371088155260193772440453024087940353600470087063993834537412713544819005646799581180031366714889866852653659503836096784982086654775806436187485934147132190078275537650223336741258760920441829149880313735373118931133566363904035798043218143706480154098407247747391184674434380504850962356703140842776482e-04)},\n                                                                                           {SC_(2.00107192993164062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00045366850244676328437925811291073214721976041570836260525501664695528715250408575145931378349350227688837316676868254719113597414318217870885844613229100808084497215923555968306851384139377823756137707740468543389970979577970623128733809962698992633941000918916641725087330663136277097326315490132382010503633074057199260098276330149620295467434128041592429716319985644497132929559777710003514847010029779221896564946779046395621309674719671941599041158491221996485551059405243097093577110261783446e+00), SC_(4.53565626005065278926467940737642886605249081041802313480807335050258790272115953359716522668419818080599307266053631904431521057302273515725629853746800638510488383571198722159231860540917028344994514956013946808052183595119710018510329469789737703176433796292351366450813161229871010564403903786056927568689158871830933860651600507487702193264045530383700007441066684051740039536729108634765214756819077820262508689114004651424406631533658945395417870161936749479421943272531385382088836918042945083e-04)},\n                                                                                           {SC_(2.00302124023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00128109453382675805173992936811235013623574400347864620287586318438309294296665771775467445713658191501098042317502832687005143325478326763307131985706554101553485442510186534211913551363194311510651662998641180078528045675828899947117843797072061127185592558360128674206812796658575963285754372198258684165702376177309610909388042634428491075001412861942564107042409560615729123629146679339990196142809886924437774615022430018387187232103447017447004392918496134872896723476265006537164632595098140e+00), SC_(1.28027463239724483573557591805281156031783786455407331932724556092523281693077215723336812242738030575971419315597244134798471470509239217931886729204522846233287533744777134652447761428596469288172600899533917013300359587696649805109934740082670700437170661671201465552822434017620867488841178011239797068554314139917114166483646378072990776989847016014395621598620280894638628718729791912651882959514839837935385891368255358441348171707916587078365790333842092452342852422428006539026507499595286123e-03)},\n                                                                                           {SC_(2.00499343872070312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00212142687656938141755270267953218765354768440933747494815728726712151222070491619095448970333895393102444381708475627275738580419453523195048052196379247915358684398503757315017141406139047336197575310525733968756298578987992499076885165365084990221306522699178292450185978338864665272953117267614937180452725496381985816195572219564378217691076292404788320272952577105820443381455242824711291502490670740124425205103598528630778954594116895950873773335330424825150256890064566932046528756803850377e+00), SC_(2.11917982797806522188180583003778103974751450356379656023292543359724208118117325946572388778921904109959311356271811647949638546545148491244584564070484155125952798837608461639766227062066344856863585936876232794773824375120613111140413086769458486596098060127417623954442102532030333552359584958516332878683424121585275505850970921650425493840174528373209639623509936585019571702003296293023302489480387225826279840718692043287032926120545307827287470013099533025763093667172429225118318113870786208e-03)},\n                                                                                           {SC_(2.00928401947021484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00396070159046626935511242705234690901218236095282169771624882103505993499719962388966570231900481119384425168785810482517055802032380367843668498408199062053383972024792891639768193707683013646734312421126399867391625714088146455431741320398132294311867702699910710257806208656164296257925674148222338444701332204049088886668733363978488089027829282411338212114532892893682282276507146315808397645071291768383839937827086383616329198213608310939839268318908099732004589321018099591371493619747249631e+00), SC_(3.95287866131048848362949332955482809813076597121930182265468445712788358294143596058339399774748227605315495370143056461809371109597058293347314059761260952541527829461615326949940335043617147241318395774085607956500413456369858807011840974780701301554326183297359957043339930077882451930283804249507686065739672454172144114535956579235090987261573105806998672929894099870037590014574603650514557889886665766715585784345883317933151789624097968432728774013964196082834709374955951419821387012151249400e-03)},\n                                                                                           {SC_(2.02416992187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.01046043252505270540348864139253462361405144648089692783487100389214760953674167508997700463439388241380949691579319056966872356933278042871661474710292440940425675059725890695043859580872646359743050035128388851244819200943544005620842213202597157253369936431918277145821339842153005800963054574069458416961754561181466561153641602286677082930975916212869637489229264881405874178948279261212245261827886389949246815690926156066278390139052729949218614616691327310111196212366658537263564003698316686e+00), SC_(1.04061007614633015888506552864890187300424291776713882118559537231037896435738358627458345297202553217351350725032661791909644351751312758522401030616953479527240248501544067448116919217029247318494741938200819289498451100715539693480677760858450468487286554749460935161181430847180062573510341370004226635188701720062386639582275639420676796347377428587899902624464686139266483219004395187251433297865892676882328269889806653848707748007936999905330214536016979834048012739320965030439429057045382243e-02)},\n                                                                                           {SC_(2.06227684020996093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.02794777691629049193504390235516903904685488713247685582519603512105260522463735818554622361453962807292107231999993865443863636016422482468073136921333975898098163990514820931936483699455271677262446764306240533746033838338608816064501896947661274923124993994172638131485369377970739578593544353021087099305294127230319375266951896578913720592622847270176439826888386290790930789539393963150979413129440604185373077854075465693083153485136923946684182484672155068069363826098702103238635420489190320e+00), SC_(2.75643650774888061670685649048190767794082581488473953554589507676339470495854150371718710075080407758280379482617006492575884521367017539656756513515621826253686899723946040513136318257344014516389163303047441444416452076515352022257721695414093144578314213761291012013465662826539298879963192579050341577937021219782512691210616431141692894047421455586943199613536641000412200192791271919535732465144076608722082755046949411524847483821817449723308031951964499163351930528842227963221257503313906453e-02)},\n                                                                                           {SC_(2.12234401702880859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.05805563595315918870620421524696928104121094020123122438591403908241219015868614428499827547272175158643580386943048386142399843901618528166730694455229164550039869186159172224183094834887338162067894198894809433633712767764687117266852119387945316827334128187517324798364147479381468438290770208748715873468048281517169879643662462978121501305190754179038096804244270749490304891307019935778794914003748853181431342998479066888373904416656160676722262062683000801879454155276475143345792496648973201e+00), SC_(5.64329180205833189457202528539405980451202615961305194101203405759309850646470129298871261850384869366086721140086742612879750402334731484485411214841852903126716872739314918112243534983931682696927881636448720345394093622904476579243712320772347374338360965150249665935072437073635189766843122322561564241771470220052390739248148539657800012921462649571509627481171784835330155295559197243566391110694212531989990104509951797406602267883991910533467933935868541283958081404580151382316102798202818663e-02)},\n                                                                                           {SC_(2.15761280059814453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.07723244020951674736879024409015567278674737427280181790958191485280131080304291237276361807466338094341891840492656978367711727637106416679804070829852978008261215431888758036898775633940482292123134601737585845696200859486998264872046143555878009818620345847733547045237356831681855942609725505498410349738410778577001739079204840229118046714852909334644202624686546361760524439047857738766396297664386891608925813105226195741601654256704110771917895237804372499638318366040599062738662549672075233e+00), SC_(7.43951968096078567450169038225671190608692238403345259369787919244023060889967195591743644105668461468324843850667686453041016494846928923754334711387649093526562013857192333261291836182288952913133602463831698851059598556266445835039363674561701274012167017363825904055449988055678519606988903967580415182626339877700624724471311093486364881415001248271337139615419880940596287705173710534987910042007765327377593821618312773836917297573770845920102032310648380234431643136775836112724418122395944148e-02)},\n                                                                                           {SC_(2.24955749511718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.13271614293701721566359811181216844599514203933890310472153469801157718942898125040824868865093076523138824085647633489733751440515813372334536113721345367989120827892830875626989392162079427686322414937731343959752581459822783558484176886389947866708191972913902481439656435178795000816666303153729497641630043980861878770826826639629131704289181832948488360798051269765157501482440590629153105228466160831086484632057682895937375064959461519416204280008586813626946447886299889658545193561852005221e+00), SC_(1.24618414855135508767735862376307617769086138922393052111180412177914174153912067255243690888418634491489827308484772844885839836965633854624454396599801250844003229947321063187141240211496575790700669319652484948080298117038544086335592701606904389673878974576502676541776966818151447737115996064285788233106715666059725339111146196422616638378704568975707438135210898185649605602870819709122240260077954056652903506653003017718439923455933787418857732758136503190158208436673133318059105277181156412e-01)},\n                                                                                           {SC_(2.49122142791748046875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.32118502516972019933515927336103098702121708295751105812488772605156911772365536897112612268098693177769841152502858397420026350114877465933729535497144281541135352932345376700618048099509451546579901663817269885709441847417283354768740949858195062449544534092668839707066796039624277249009376670869597887289998728613927141880549915613031747586675073174707758681855414360545031137199348021318900766417674431763100410455529404359261909164635053011626589643775277596465694320978005200845792741119134923e+00), SC_(2.78529080205747320956767680429427836727030590567393648909624132802498276501643152789574992070355469843620486053404278844738924735963376178005736900575827387449444173046088740850247064273970170875025909159212947254188496477090539228691270466260135938060766950587422809929080227478886503787218528163783429861153888831422036541043806448191088131552215464050108120064521772377215109248113444727286949161594653754349157193957064235785340374457082073732189833403792835120283596916983131946632783704229344885e-01)},\n                                                                                           {SC_(2.98384761810302734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.97051246451251004874297221651138180345200782932645719112022459091787403373578707385755420465767533219748291242620211816297976513805852385613057268665258624866786329786770605380611756547438670824706673187364215059858745216541250405466404493859927324923837716320256664591098922123313952256060988714854976076730317786737382453301647556986241140930376187251202917157565110807687607281314119017889615728891326998507934487463676042713528408643485678529499707961566325046935529271977875583020481735625488347e+00), SC_(6.78293643191154116848661827621536468687319156088981302335984034354394098918670578514850294622645014725444282962568987918377119334481020922962448682614893199281184250591877900628340274535241952010329002672245246619180248418868815716112830856589649442068135409054374901175591316255625024021080534714749685122924217144697864262275559713954426478414234946523413370091910838172379349297462696560662622315457938241067416843354716162216438293199111251634403925999902117392283474387998693379008921611473955473e-01)},\n                                                                                           {SC_(3.15761280059814453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(2.32425050221562870893368319780797394502817705273594528358155653513258895338852991948442481762704658601512028960856664174705178007652730881053103452425905994757107112196568675848578038090243587386920465763852835375409931606980737782869414814138253290988781796906638316383011766510477539256606138027072161714425587703780135013131440824352265816084541543950839110895486794382401092016139119485089882925184402328205831095706309275623235851502520342823708778821762663111690734745040834591026561416904111976e+00), SC_(8.43397622430231011639234819630572061422916186592913090140786438989872494587211928954110495101933895495925703033051008272776118939841084357793355479541145156028164488321529335753503026225753481617089830803055726056893347536445132561599214506486246671154145383768011338983825577386537992051530467922693326426358214921270214143368096532528712261953843791787651479311894578525584043960413997661258765749538291326432123667367635267757124285917821294505087615185252902658005357658301585065221283038946577912e-01)}}};\n//#undef SC_\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/high_prec/gamma_neg.ipp",
    "content": "//  Copyright 2016 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\nstatic const boost::array<boost::array<typename table_type<T>::type, 3>, 37> gamma_neg = {{{SC_(-1.99999923706054687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.38759967029644469616560016595808625878165115132471799422204595092834392971724800295938555800538579100535589193822651301525500332693249993444773179507605929981356967101597471714913951503842754010685235605590797063810809157738833492835143542871035345598564520502417261905785944669205716043072390494373490322257034881967960644010974493437512042261352756680026670684484992045553462469360277775982744564680091587106757967345008672070319207656022615608926133979854875552214891487061214012912806431933345947e-14), SC_(-3.05520913463708585014455473559668296916495608452525817143535406097314334283489713736687704477991497991743275712369308074041840740834063476031830765479882984731724892451179592298597321676916458283977757781247413334326383052593649852562076019260959425621178055912343813003433354826966649421695320908213626776555336215272482327946648668250227228003910957432402159538084527454011770143934418513330640797665570919946502860682207966694798401992754387345165102379010439953671041677549784758078058910327404016e+01)},\n                                                                                           {SC_(-1.99999847412109375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.69386191462138420561447561038626224725117398415048907272463757295904788742894427112020961644079599036497975583044564125160703746233180407160915929733564532906838635276687410781434210968261046929963453818364947812836593421630201317463294954608503146564867836821695405794382366118304227852763276692341615826262038036617817133464411475558985554970017557556048465581312483241407482874644374899521475569917118996299966475968950890235428728201297431223495619259559376314387803604742172470399752300894010086e-14), SC_(-3.12452154818785908505194845842029487392648620731103347207456198557211206269365761877112968634636619292832400844203780475198066901590319174974134489763347121929467737468999532787760555110439805900327811331337512388862249634034030061740800094556846919604832510099987981577497784616554033244322463034054231121064946938163159446958559684540678853656682058592193991149452718861454400627271395975031543423753488544502623725092389101829686729006797143129176563509552320320921307398500613227697762154498835511e+01)},\n                                                                                           {SC_(-1.99999389648437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(6.73558608044741627613413161420894656660058244124013446415180740530561515977792519827786858298784888263741224694297801215204067458618582387642758104711087267937066115855571693609659647797364715279501851796768712301165273782031584039675949865273825182234792801200308929645339256017900697087444360181691659499183064954028133244891427139092630423281589186925295403769367835997750592932795632852612041064703694287432540499377174363368787259684826128422805916075141721701587432972834880653382078107215883569e-15), SC_(-3.26313715687234132229989418098489729669001773722991796067366352789851953766781785355780461541281354995935763718291948133987534108182481755843147601008349939129025054962326064655846767144347454369030917012611615739585725945726636841524124521503115786360787497866575048827515382394272660988449740261822693490509884264357425735902873622582534393835987530480698916877954377750564674591032227255165999311213894591898118964168841058394282558238633558154941771511534821685892908044060408931199226908086343943e+01)},\n                                                                                           {SC_(-1.99998855590820312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.59289216564568867632702480652600850125829511549703922062266320158421424945544656850160568897182121831684617893475524325850864891292297653913606807975675975259957804287451864251597624292500430910033064835076068306145275196971245113751174694351289752436653598202952240666859873317646170787625375676127677093291213853982061950730506074442529379206213215500763520379868910898060124741913721352876983505985493576120693388339647532467182999015385778276273816304969530871418809352985232191692793886546790925e-15), SC_(-3.32598188995743285208683140963089026685291890297515664542182571526269358171760131460685426882247943951266520599997842598239034632786604956930951026409905645612178203533000816237119225706763979794277386461267856071615237308870990401079821797917297401362178969714385727645391303737983992056296555425202777558250602185647615246086261095852465123851993283123459088339560080939847486920372910054110601643702914129947575674545524987272553810415588957364532956825624756792802124871830851169286718730345076044e+01)},\n                                                                                           {SC_(-1.99998550415039062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.83675532880791262845798274405227695235033818177720368767405099886788298502720505506737073601491437069052878767318115279839599543294975971086469127221299768974331834475248890837021523371368669625126416159480047062370540379650501227130334801934061779388454285066925574880229903013006356948564197074783512804183686582041834740914665869149472027830410017522882553274815242510011488283003509522030509719207159703981174448399923693748764711596103978889294945567655009609890761231551879773894045537823223462e-15), SC_(-3.34961154857329925541635513497050400332662351138593933473844965073376184380974825540094827220199831836256601695304595681236351737563191092937057976123211083578736440989629133694878674815811112503347936133530329173329879480671346713361169216781015612727459739168481942328351139199093627019073630639474288952641525920120137291224330266952104831972482144790213202830122960682344010877454347229224834877045631606844170259520138732358563629137082590241957714093961736983665819824994290029280116463796880875e+01)},\n                                                                                           {SC_(-1.99996032714843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.03729552375196358164740823460318662026973060198107914419372487099372162041568590539256488351737294708523272012421089326748220291729909853186126389486113602638037464798917737352578675188372501828555604004282598929675982180626022680345741303618408192247021657568663913526028145211755475939928912712220082787359546364322306724776665922707491021987748181730488961439404139976335171257397123062907938178893465064874123590923110807357554574554643393980484325533171785555026546386123991644766170357635345163e-15), SC_(-3.45021595267521522639899367590843824281454294119481346405490171556502599486260615042880032833991036355745335331680454463826120830401167139969159200447111666769627258035766487364251085432525590308678370165837088127339748301089081077402924517920562849507307652504302081878680928064486340213487200592331694635202674901052848664744765324810044662367009830275349486690000382804760826758049268567991748597475549641935103602495852342532731294563801468186295906896930304103397585963644636392968366808491056441e+01)},\n                                                                                           {SC_(-1.99993667602539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(6.50336577581735374471539264511018136719038458490199957731403809327992936679603463170316969907154025316626545553077722739733428346351928958003365080018329659007527067598438140087551150592925781388041096628034671302288112794755460098741102335498879716538819752808264418019802651491433352739354961564539598747849748848117392060902676118393565211519914525721009406620287609767915697521527717887383428629878372324308027451918296365023086525610451863304311902094773107178133171972202267956223000573838315409e-16), SC_(-3.49690416333571289161141805470911904438937037541235254693432508247352990157294679615675082059562226915476749521015549982260241269072669817183369963155899076472793137757186516087976809566510969597392117692900885107874333937105112403653596700299504956687509734290164995796117059729520144653593975744039317354321263755199656661265000435813191510872148915404528536453962323659146004419193306903056331043177656069646402815420399785981092446542074041177156746147470483132801996220688719111352348233653928675e+01)},\n                                                                                           {SC_(-1.99989318847656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.86063929638686016500929938628120959904067448411287969196392885063559322770495366475727319122352450102372852768514367925813022215988708482806225319665665321959515984729363297544833258326504479048316249972543983343692720159781733035015676131873586475183939930321798151919207267354975040689004986327902522486381765817411164156193416250909025739418186991916936533719895706334810544577545675978353778516293280116029537817342097826395833368093844428397016931704389447997220570933235918212908707219681481974e-16), SC_(-3.54905286973159947948750002420348464584768884030695883466932404080114006756721010835426851676572950604843679049664249591827700119156571903610687481690319310894243129467281993060943865782714232253365668805576757241352750911798706606877038236096410062796907424004941101804850412041415612888889142024699971409528765711806754586271162013403266475016725698526855443238047897496154800538159403234101936140209280775009365332436270880758824408358848375439036589335337097474868865637374358575703628226606450184e+01)},\n                                                                                           {SC_(-1.99969787597656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.37296605913515361209346540202645177501313411989850196817831068108372375868698241625156022771492511583367533337112524747137376096188024626936865639985676068925111095711404844373506733964319467852524083811984784373381226532512835075887454516237755489043135364608775170190200412813090698924043357984126479176586376756159697557036152924657642856869840911463747408646106382428964892168730182978444090514519785431129789029809068157041005541390960262548429023375641881292147792481840988867797477893326322641e-16), SC_(-3.65243880816464760868506252402030899768537444817173639067626077224643410635383857951770206143048299455767678092911959462194958237349255784440281069736923951115195900525720970672659685445864634967211738574969728491522452441232876494313586792230920291557195541800208355430057608697033133628867008170699978894609223080268842824992876510398676587888102517619145854012111900360196844437532665850195258458365957831131118671029406298076244722381387187475421481983813869442681219469329754750417755896370948969e+01)},\n                                                                                           {SC_(-1.99950103759765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.36316098020149180336594485727979876737128531049589362065952907061128596733355987994139338062282819185131032168871304103838446925611937887286709237542280460889870514607319873770051359260602656881815374243469950002986395095763327646299989180128548271795696996616366271013899283537815894308994710220989138890689498075406940349870190603536266322693466386629525658624153938658038587233321888072480206909717393660016512978949214008003450101524012340915085779176171569261451020905517736412363755791242890699e-17), SC_(-3.70201101175872571127612018877735829289966222633530480008790833909574728125746598013668396826018331577307207372571982536533375670475766159667463037138088770336085182557008789072830655187964737898150055547782089485266963996311464860472366058905616323822767606450565779266186426287478141325974133538136797321588449900712817576885367547610257758543776619302254787853687553904258173810544999430721010167498949352803124945816205122693480879826249820387852287044996010468333861760347726199104230160743408478e+01)},\n                                                                                           {SC_(-1.99907150268554687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.55339584071212341970474422785353660335901128887742233122439875862920707194709937014271143578039223357371625602683087493114976678579159611028025254056758984409396564016410385502091566184046478439774591236752200564488173276514562388115552233268886746457616005677169443947968693409313673715975716502229752528058290122345523747766183736578870392873680550485661565438774444289782054502237465714943954936280012187025428899218172715554379144501923864512768311526035511226614602973765215151761547340902268370e-17), SC_(-3.76280732876900368843995872688914724614766154503743721290613036628252140382589938365197204680237191190001881516350171816957619447557143555943272967301450033805129891032664320382026387520989511492279683113722987258147580642668261454744731897953576935131567781599631138897409307262073904306157094335890447418596502741921164480836998465436241085557109219685455546928104579025472976271631871646590293559539692930387307698947995638166323978942065107209641441448364860473477127717748096251490511457991615810e+01)},\n                                                                                           {SC_(-1.99758300781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.83112246049503080122237146768131561239165952861593764069083980656816133071712600960126755835070573344294099663480500749234277531625134201523458774258146034706967637818193536687702316522518109967144083177724938390732877090353677111923631003890839246683408350813534760772908633353691555931803914631321008476959514080214886540068969482875815279211161969636081606072812897989696761978145941506005215530706064321986891160384968334289256503133484325711859503334368481471089648442036399714132070514073271488e-17), SC_(-3.85390174356869999540631662416944424563343017686448585510542768258924935140650334849245812809797936619220558584447129061161041883006839073990822052685785409771053711522282916161209407932769517709141272339612700282656114462228083301569573087217876966524822852660405655108177399957462906307133994832931312250720150198781043931995519887737824647670514087352012661228211226654083530423287061165013493196255071502175665757791125308633317577890200630453290697760723342257941341060738612939219142306627366078e+01)},\n                                                                                           {SC_(-1.99377288818359375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.01693535144367134273026553716785218082557806877438069452199116781270088995242302917025486913792901625954351735018669523044519100879209643963924846343671760259128187972279606679894790449933954614431176061448363551333157736564270069025829703781191430082548068512059881337098970687760711178849491103179947661198372103494820622922005592888312013696994032759249871346260932504701246018860440581729582268067100718234234048848838644129619402845961461869654578671179269984398862736189203756380345464201767839e-18), SC_(-3.93649754507982034381210646062863889826566407396586975519455023065492015354853815571908666749309967422373602978936644556653681367138699578243570034459145777728357737438098138773965351146277352775387753534175672639907881178942069832564535372795578198481177342329606823641171271987457158600793352179440621485289920354571261729043734932851097530391769255629080894457549056652983860155757537030310811891415672594623748985942179579702560080484257706177836201715188778902120252813872548170570887000653852548e+01)},\n                                                                                           {SC_(-1.98776550292968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.98159560642572769471679705760108836819553955845800653128274010665601005987113492561900144703140593263012810898767831966112217178821909223692669428149071863352847858293401245228236222196431038944392838651399436151035061048674526100274807374332221465652597940640163828271896168262085854120463603484811367456030167748780453221643535013315782836700239386693513547142120678068170315881364584464800999707226761493522115272499655210215888713274077764088440307774404249258692132112421830220308351144796995272e-18), SC_(-3.98407814312775750632655948505759119176224779884004606328890064673378552554757525193686835579511255181447342618200748378512699382992907049291693727164093761074261774488881410349964002706401261019405532796610313343889643193242858329740583589555489079186864603705090245097892687910273553815861117241007098888369393865117288758351588015571301443677764852078943272158047284630193828321764955315198313162218460948366246394905166119336122793138255072000587630491211601554256892640021898219920359539490157396e+01)},\n                                                                                           {SC_(-1.97504425048828125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.88017517014452933045956819481950900807442551001110048857097121388844647225043963352097526055371187772211576037491223350763235789821957483113201097090187557142479511185822625644332601233189362904562543687030267056348820314236473401764915276126764508190793356448802422301055179132213830892895126747969022229207179654266700452361663827823698960959744143211716265805526259617770857043895851450506769945022455533546585246809998963177901672080828114457141550881049970982949788268111495485160913989116636720e-18), SC_(-4.00906513743322665419511458996323201349225723259180576722869519970546509690314650847321858066902702770000558036920171548448588183887422509784019051198560190291912395148953616433361398321514302827291262158546114298443380391432156907120792226017162472101359939072979047805376875854177883215361737326229238270663527682112094510414417814556366321261289112288963812063166466882072152697607360930495102462227364399384308239732395749233273524462963918739611835992415189220703065178811224998580501294593845387e+01)},\n                                                                                           {SC_(-1.95087814331054687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.66230758491304665147102795245257419168217425592069799711487549608018624231364246953680468305752531986636297376301769325469502322471851593437159783231444403919853087066138399456497488977163427187775150730353446247259557640310543636216009045448281263625535378734382579698241218759759321642473879630568556532741823005839076245488105531230805809097403229237856626425257554186031699591598706644445689476274304227074824189207132578864764869307517588437106652581485851204451182521307598680869063344876248827e-18), SC_(-3.97127001642503306431018368868510822813077871040576980406279757790165788671386554429152492910562270875591570029751557166531867479172532187313780163974363901193188247687564696358109292582669997918861573399693339019987764495770565847958538474202672366615977739249614693866637380917451450693278590366704600806358477108821780498846825219688755857579333418703501660820620185048127256366395207162761266299559089783037567994540506596565789573094137658844891091983842233401459345063120752104143501754444023158e+01)},\n                                                                                           {SC_(-1.90161590576171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.85094648700543313219398847352478326318965185964013459447512351308953428156330384712645652203197410950029142959888065828019087576686061648451263295485805361576784764261272652852562003088603485865016423910075013225407371024651921073341767205327719612880437487232429260544546978675694647337189003765337117000483128461838798268376650578166160655894616540371072755498153305326101649796044091099125863886705708174964952292493207651779512080603498273845117371411314850322040626713326460161210144724561957487e-16), SC_(-3.52621876500351226734458234233118143948269880088724578239971352285058450102495101628806600063576867220760570143096935930387888839883871325947380486391444764415658337923993597824917478464190608223034931307344415287605970181326241463624079727938746083914284903273883746077127195587651357194104990693139512263661207224321519387943330426769205283325696095926588091655231810133980594401096500720257700076361998811811146688344672735928725322254167146864192016693678802172165337148496655031068154755053397560e+01)},\n                                                                                           {SC_(-1.99999856948852539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(3.49525794726840724332770531742533210760949030939150064838849016603929268240158079420646351018919870494992130816864538525681906800880110432809969608373357971562835031734463223617852856504288206717678633312929264358647621602816062958926953223434105587532619209946310434142604470287978627247076447003701407698280595109919257213101058520954002976857547124960200649769434010243812418865367203197435757976365462214320598427713582886554278342144196536549039933080774089051881208606675782058795172014506845303e+05), SC_(1.27643326425873384881093285872508179452498455083997386123791846098069683786954557724381755242107237737456425334403752138877081887262366450587882895441315426542862717610214957783062806011631463216155577579618174650591505415429230334239897241979183736600447839459322334682781809803931591656670137078437915218993972869573877667878499135915127684776967501369254905929674054441263057139938370034060614992097975121503535832913846498802397038787145978975145932851219785278838191467481268690078676805417976721e+01)},\n                                                                                           {SC_(-1.99999809265136718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(2.62144461393954005576677083959081224922682116942680784382663786554477354091505652256089930582387034905082987123783686147384272776233357697778646519293202177088216260442953567427598742176128969392234701519966700913406593927278601397437655998843292257685500339055591109815077998948276221540695712670281137196054397511966305435012680590384519239723484669607888029902896624532963675465522555566371306498097745971066287647001776895938202191310694024225146378391339368362904975412072348405920930457524036247e+05), SC_(1.24766510101557213545766721136410453138493641946701292802442833827425797129904704540382723544412893379170946550873814658598452156889382215401141401793226256683432769439816435341614070628592950211106046360463620980685141352456520751056501335577860424890706166122786273183690252206928481409437290040107105400612762800109051739183939915165333256045614229952868762702587943061762211192907487015355715364832639902186783136127312606318416615322477883301125855361137217733810005631030743897129203961853211027e+01)},\n                                                                                           {SC_(-1.99999284744262695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(6.99055280655334542175930436122069761290133983548532006796388549146348861014908087320598296301346411160370998401799938159888581866029751709088497185296824652466348119973211092989927709171600849203078010491110192497753213703526766239773066725748253740735453992439234492136465118555665575916337934823367953504368600730298086700097339519387123179747593007744532120692065230765100349251170948099553510882642363863764989129016733554206631919332143211983726526321979280034119468474152360465290561460889421071e+04), SC_(1.11549000104386469310318581217378978404108798637142623264790614654551465860165613766525338763896231086889849040052677873804922746038702465326123925324974167767546597691474395687144765863502639894309407960627926456751853434942337376342500635127429736502870706249417725219963966572260543383329779151091348926626121712222870254056682569389363695658167304526644142491795103808689641219761812209725779841832246666770063334779395069189440602891823050244930124977284293529931332541390700588598213343893338842e+01)},\n                                                                                           {SC_(-1.99998617172241210937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(3.61582545085677523556564265061789275558420085423109560412225366655176897025562182547560897903508146991920512133842894068247188574004266983236166092320549776589666149301791876532193556310533756455744076037828943414924970515395338284159141116848403267093343282623079098773385537741681300833604756206687517267176183543188779918320955585390478066609031999902486182302841138297064961474034093076746888050514577947727440163188133886399891285573031624715880708476160240564600719219019397480953999125929120509e+04), SC_(1.04956605420071580634032606781744741643474075940276116906157128451763874787833226406335746586932167180819392693617547623661699198379679879472241104399115810710557215037397886139363442663864810170688720344252581932587162490590864881208800226527734817497087958248051970771681187067072798822926758914302554781620566550310313780069405270970525254314192982629980655282219306257104525199495277176758155346742765033720532454849549319731995469240561404515682193542797042174160374339788351958917688789360771947e+01)},\n                                                                                           {SC_(-1.99998283386230468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(2.91275725193569561590016689655794168420228620966571368298273980157450738791800185120799393755360245105069027560472999937324445108650485939272745440145190606819951995859593113790682980972371233653642538147083802660603411711601177697879434359991996803571036009274557243778779042479466989793965641132673409423494548458675468354610730403558385953326702507473607969684599828544980277541551562751143225934516347787042819331835666113193607653180381361180597983599271660349253323506245247421653025229085236314e+04), SC_(1.02794405138122896402314881940604738282900129600289077017952090146533317079696982995762083502539714627487177044864707417428225158512882028105664966645423607544687065459887843793363464574058076111354667801476050818320352369918049033162304956069323775352811046342871920615690769829844887402721730480175673536482624050186765972164860620055019128295545319689415291206842391403816794856743485445184092820235173998625164635470678238711809067512302214434889317749801451335300035481668507468143889828201299775e+01)},\n                                                                                           {SC_(-1.99993991851806640625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.32249319447518855598944610753617854039292256296476311990145714296558036998458656918821506365009251364959904572811137153770442631195626341569236149478584546737152245266768341432912467447854655346609375771648779530400158279627455200777370366845760135645185689952161850401675559394594343764985201521321411485981589624799291023082308588711466604815036184548423850387050145798777986608977987885716993412252737556898589674064937119199668191811649392150573408930676461291127997714867381873466120503286044037e+03), SC_(9.02671715172282446918804818996023162518571481778646046484772732956317384828370353304559181558297863222891421673682259823646868763561090354017312583652702865410886724466141311870458212107420735691179628014825875988413082971512446430075718596153929353099382259317366492027748573322899645753821024940590770562279794986846425203365367429895656694890464472785718353612966631247824841684093739368884029310135508998603813321714361278534324740132357271577747825991014287136486456695451934992266661402277777663e+00)},\n                                                                                           {SC_(-1.99988317489624023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(4.28036354241400130058705381882725999046241639116013619551075255606826877452636644604651341982568405913848090528825454016811852979966987414441609765953883845437810285948143114055346163368138808620153511140821913074294970274338981459461780195745846293255296962943905772921194262962996046024179304101202489373713805917724003109833450915814218273799360011692079574105261349340456724888786747274634828459793848677285899074058389948313476620716037763888535835434918698233782953812196563303570201525502018082e+03), SC_(8.36179322478501597977292274589283139518886305065425844964868164614874617907207649168636165810357009938065944927926474292133794500748914040902098872429767836976820558374914415660195744428422875053172805157494295734822572067475458679220611073040292089429138135583549225532487580813118021701211972393905414957119675165616825504727370662519623020660471291479495592691629449894598588052845768596631451491242905371300688736178966934044620811224456695685298401168269691120168797520928268746534849598073563811e+00)},\n                                                                                           {SC_(-1.99985122680664062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(3.36128204434740291283107770354586378346283439595679593594949210524489234356178902618762378562267535666175904129785120747651662911412143665104975016955458793784393118196269263025523335076889406349897444787005159277370437761470788599663401819981999218853086656741435415793526095051182679856992784435195588655487630156922150016378044927741531191682364126255096178922384753868717405690697258379485738398999670904341069842876887589302579704145040802034099243873580319117957884661068510923385025291814370594e+03), SC_(8.12007774099911224077674031582939293407072268410283120160248139177467352236787950741709327449661204101627452104848400096463204118967596688892445723941631704314577678297562783209606807172475052038356749473705814057932311825150329963969840788980156891988724759699083494912402524105501158989635979848925608920814051135828808581751025198832642962437007614912625066655215144555621135720046502168379860877317008493966281141249674566270190908231807924116067930262174250983880414789548679270954647569186496750e+00)},\n                                                                                           {SC_(-1.99960184097290039062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.25624140592261575267278271940484289518480075580483297157581531914241110338376984136137853209559376401394082718883689331623249516193255900664815163812238640876028719844395892650957249605235281921292365169610839189461985220288383617439943753120747512365782707225814583627987391209031475228703173867481353781649110067039019107568342750599488417067674630339554122732514191362032832650736326962969325600194583793133488118555116227453949453195477751278597776714609414190745942394922450934781953398450326125e+03), SC_(7.13587953072736147036355816528887639826802159553598947589664831543550103506708350908036736344560077734555208589346657689427289222767237531129789832460866479029748071799264780934688947071994838969349226996016594353993409065278399027492505780692124331908601902223025677408337501345388598227277841303952412480274312085114055529429662028907729170169955023222056216936933071019581969634258689455594667577889504726170140818995305538107515921870405332546135662650561723462419727826606351956874268372077877037e+00)},\n                                                                                           {SC_(-1.99936151504516601562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(7.83565799289483280163155191361710148301806473769761421399736971707242043580137349085685963832290398889029922835758280315794977396758526824072817586429369366819702994429539223254414178932724794214207553405219491444239189835949198854269913836625506190203997818880282941522759814620371563416612371995530706016140699823029408579568047443293909880799984307203726160291494410696322200124464725600048565966565754337103788411893096012339982460843838115831744031219115508893136183317751243764313795428254149897e+02), SC_(6.66385503949446161490964353057404700759932498170314993855319685951519772420415762755612421329517512507401754140021735737698406265001504947108209652508027151273513300798240944398325824766620559433751144975606238110713670040924420573411292751049952618117581043972629261655204241979398389497786642517477127879747879911916212390205737871315629451177077435383637605445069483064166519416309498119797004666497875239844370204211268529236996878715800888282012049095445736065307218750923128759227529173184642168e+00)},\n                                                                                           {SC_(-1.99892854690551757812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(4.67118382295204743401937254501573767480943199671434360254938823190850915833403801934586371844867967744091651336925376675907730238237282784349607890778234013193475547292318213052077228166933141756756427422908924797442949317616023112830726410939123632261991571101547351409931185486745127483145748880375700113736466217793925966792127947533799373560028173512435035840471258751889735357702600083584858668192495922189397869660685532274994141154462611707405745124099969669821149028958221777027109971294922745e+02), SC_(6.14658272082320896011483535569679739810604213770036400800091715689086571577772544734146180493197362913239895242960038327988879986011628251613934969785754160387923144866290327766088039955675828649148829131779854684483641828507579815539643578858903851037091320577884007201080127451064224748179877998328836094513147205379315186158274591836586471728654183660074243464409077906266941964012223839770573446137342312495426534839819825875176576557071861399281398737582929236303062411601392244029488439456818833e+00)},\n                                                                                           {SC_(-1.99697828292846679687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.65933062799030026499031857286439573057825979180067481887402769956172122065685585045807000188347841407446707061639560625027426711596987076073907063407152889853367716469339236825757603750989741418798526629185714446971058613215430702718134769670033959677353759278619689100985901866594875380700877023837639752859867845590036857634241490796985154991724793857881301211565140606814321931538215083761281490341050122521686748462324199594599613474854498378317283969209955088313651411879706436345504630018044507e+02), SC_(5.11158447088456327285300991228539833660960693481988131847235078680072149045886373239208411487942182624090802533750571463998951400823698957276812111506615598974444394407002484070136921088302169422280429906757027574361223644628984594464458979582031307353205737054490228551750014379346366992651980878945818669148232194215084018810484639556344683423385036117630305071212095451395510462976995162898640449446072737496747538413155936339856232998187919840618112609672401660774998188565640799563785241420846260e+00)},\n                                                                                           {SC_(-1.99500608444213867187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00587924761262775169663795112260658037813947243467846497585581476114421955317726749299731893226976937786324525582979731451343618075158212147675841143631582133466673077443893912530929063915059519648906249109279163465361129828794671469604941649949503326733151583929465567177496741612440164389015649600945687108836677050341799638872055874936125676513217903248696451648905457756723999758260862431168673835335778352509374833228745218167089341287526408377545911888789543737719512886725946916517409332708090e+02), SC_(4.61103221826699148685639421692714907149023874354715583149540785712901180479986015308857435216493645251391475968763231392296253595822154704197625561993779495939587815270692703284985173572898009432860996066960256782260922905962033845140459253829997088395227562256155357408928027795042056851131597625916921613972564329947415717361332777224365352001281348486892227555044666198023818913069027420599174805373709297093151673659228558391608953421210854147088652563286506485526491116085429363408683935355806458e+00)},\n                                                                                           {SC_(-1.99071598052978515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(5.43261342855207683321471367667634298993130164657395652940698347263805738244409299534274904253386808889723658245910828689572671872488701248351438198079823607168177338643148221671730425380866440723755055782205029208883973464213226966927488613575887327563514670858991324649773947981306614998043425095910306427769091089568418431383074642514512607267342885724246706884212512928162866598488111182269355360471107723126753986315318461572934230251910391906053447975979536562592026495313363254270083774897227910e+01), SC_(3.99500540554754084783116320755550040070795432896218051460244050016027307080516706025452328930707372122940539374531280006067457432152053795595498975958414099013978454227666236747637245745994127339007567514632056680017225765921602312064993984668132176623992913227625767485150934657465772535770444759472966423694768064411036564532278372406920442580119572879366391149796455805306682150702485604169317571816315397840571826029052197640137590412415034348881647261441103457141167021267904530044433362633611162e+00)},\n                                                                                           {SC_(-1.97583007812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(2.11713355568508717186749430619455765829944389572953926593387890142986425079118903228956466586034785656323975993009534744183681179572261067731704233666473752088214892713750726737578557299700556027748703489229191099881534356383060180175679305951211955138626254129859879913269047628471637484062282241878647186202424197930824531409890981709923645213793111935481046064792058678430210190296837963826587771101718103456760424093803975964255040042094700470767798212710711395227541566115973718114167151353452363e+01), SC_(3.05264817039591626862655099057939465179986667409005989715731859835690744704141548649122835851318344963701626601849114047531501048253619307346542776757184996977322377721381903566522822193104272396856042012430952816660726199339620731273536703263596123187839602228525400866664014760527003573811641632152035485360466326099946891663139486579902585522603531845013464113857010883947455000566195208734139820203755841940384563874720751791136755270346532812155352274399187564800218881502549907841988304120114349e+00)},\n                                                                                           {SC_(-1.93772268295288085937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.55140154989742563031795592761223740222933037369091117707548701719417324436043594149148839366125866753441846926747757961691743831816447266296249525417689639205635396869873026915817137619485725479365301425493165818599553310689074177762635654066147134250624424695555873412452228602918989020578249224991765324833399206904878229623160267226643725994540540538379700800744103037352863243040436490709462020440501244109441318942868408148457761252155085028567393589233216009163593304138395619387918531501329911e+00), SC_(2.14609519347921503734928390248919269700812373570607862587046702400866080506820226775324131591047922770564148385412775051426850391054709262710094222461322018730704436853657999982086234982157335335068267734765087205570600956372991002414990208544840151216306267557887490905482009859533035497930769422922408290206507773022866238259045914192630771754449840812003788665755318698278462898424482576176640522119386371054173657148616621611488616395440426423349037282231697273048104290956235560812518904511850199e+00)},\n                                                                                           {SC_(-1.87765598297119140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(4.67583771863249529055109655612510730374992827217946078088186977344497390855781646691754105222138655257893095020731116355227986362966515780707698772485437094967536468214023834308178727836619801089569663047174119105167664428805441275112046007267349102582601522528843355129981789218535438305077043911372259440397637216382121093112527069891468207241109974792875017384778909045872929763491293848256218126413836287410323590383274638262206213949333260073094188650218883981854689988805258114662583813833446691e+00), SC_(1.54240833783916950711674299830094269420860989032914842380787685725906602802135415488922671751862561471742098321629469719633973418191421678612807986946832211852615654801599794257019902991588352013561017386475372562025192264722784055215705770996735617454145764311884033826035333514369114597097399498198288990985692089872458755227609611715846210608700162484829844243005353297597437263446897165946773288544966416662536713250022257470084584378142797370192831228494237130188132449079088561127554388813866227e+00)},\n                                                                                           {SC_(-1.75044250488281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(2.76521531383342777536096826241083426988946791885237328153143902257712477146935957758546160579910756476446412711524400835410428680030114368815367047441732692355740342646344258723284625720868992172797296604448481954562244959416221336611138303608751397924213759395368298472950576084573813186054133277598316804445815058268350200019426078774535372726241320430678110500166163408536083013133803069777977592233712273587393272238129354441223170323562228826009632634564393605136023563596897017566916161568373558e+00), SC_(1.01711850312999107612643679883702069406371231132721256058245671646048087783154950748443714431866884713764648019078645174991892339907448517840206497874509210723364252694864538940590777681188468426542254545822716725767597072139557232884783690928384523253232018333698447015173227162147433007643510931963840890536915692608769823429517486692530853117073535699778387722764300165446366925590821938117578815481931433033378039640398390812437572623525032416583644099198377439870409387433496490925947152048515148e+00)},\n                                                                                           {SC_(-1.50877809524536132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(2.34957878792805622220208627908796604209022753669777984013397021521718672847364045384997126602247009262704209508441637059874646258845906595804811471172246490386367479387582395386750422304786391974080908751447734295954413870878215699818713260911166524456609372522274214548306662348939976667197188998712694834713732786481840430018084860503372392470155335279086088777016531440557532208724574181694106222640898095734633283023280509442132397047312680409203121903723018562056868440028789425492262012646158458e+00), SC_(8.54236072911255595134717828491113927004144370403410251865930440928741075566141261658507132665592617412770458712290479329578412453713534343230061302053867333849975384386984877754318709543893927568366266399879554366360287159464342728205089795418872839137202008820491949662117655143235966641935511312425859340479786978199551078742416307594623543083605438644209653394275575880139888266125377643794668219915008503333812637400462494313054948847229967539105158899413449126349909264243755409897303557758406009e-01)},\n                                                                                           {SC_(-1.01615285873413085937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(6.15084416829118046468452991400544498224185271615854347433260694549800043224355246574675466376373859960529333306270890955207636581369067853640476864447701152058770453365710243687329890852220965032159894431838134171173269029343559984826337258962443251204686313483188492817659715061679938111171826115917411885607899751127343441029695150225474485591386587193176839356863531438827218409852706526496642971237672335817246193209499962435510622872455796720812217398126074771344905297363577965377107684959317397e+01), SC_(4.11917442852952711543741507530337656290736016465506639741742101611014731373074855727222493539896474697110498858504643770565949929474195415135105179617700802945752394424643368615173443852328593935472829240359653696116395379824510508393155403134258111311673599669939241747207061523079182632547737365431783702760141194142731371171480274286029170854076168498596924110170468837240766315428782766656743993971526078852137464960957958084824518999844115962290565276220206898969535823972967013864671556923956906e+00)}}};\n//#undef SC_\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/high_prec/readme.txt",
    "content": "These tests are designed to test Boost.Math's code at really rather high precision - 500 decimal digits or so.\n\nAs such they use their own test data, and take rather a long time to run.\n\n//  Copyright 2016 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/high_prec/test_gamma.cpp",
    "content": "//  (C) Copyright John Maddock 2006, 2021.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include \"test_gamma.hpp\"\n#ifdef TEST_MPFR\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#ifdef TEST_MPF\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",                                          // compiler\n       \".*\",                                          // stdlib\n       \".*\",                                          // platform\n       \".*\",                                          // test type(s)\n       \".*near 1.*\",                                  // test data group\n       \".*lgamma.*\", 100000000000LL, 100000000000LL); // test function\n   add_expected_result(\n       \".*\",                          // compiler\n       \".*\",                          // stdlib\n       \".*\",                          // platform\n       \".*\",                          // test type(s)\n       \".*near 0.*\",                  // test data group\n       \".*lgamma.*\", 300000, 100000); // test function\n   add_expected_result(\n       \".*\",                 // compiler\n       \".*\",                 // stdlib\n       \".*\",                 // platform\n       \".*\",                 // test type(s)\n       \".*\",                 // test data group\n       \".*\", 110000, 50000); // test function\n\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\n#ifndef TEST_PRECISION\n#define TEST_PRECISION 450\n#endif\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   expected_results();\n   BOOST_MATH_CONTROL_FP;\n\n#ifdef TEST_MPFR\n   typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<TEST_PRECISION> > mp_type;\n   const char*                                                                            name = \"number<mpfr_float_backend<\" BOOST_STRINGIZE(TEST_PRECISION) \"> >\";\n#endif\n#ifdef TEST_MPF\n   typedef boost::multiprecision::number<boost::multiprecision::gmp_float<TEST_PRECISION> > mp_type;\n   const char*                                                                              name = \"number<gmp_float<\" BOOST_STRINGIZE(TEST_PRECISION) \"> >\";\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<TEST_PRECISION> > mp_type;\n   const char*                                                                                  name = \"number<cpp_bin_float<\" BOOST_STRINGIZE(TEST_PRECISION) \"> >\";\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<TEST_PRECISION> > mp_type;\n   const char*                                                                                  name = \"number<cpp_dec_float<\" BOOST_STRINGIZE(TEST_PRECISION) \"> >\";\n#endif\n\n   test_gamma(mp_type(0), name);\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/high_prec/test_gamma.hpp",
    "content": "// Copyright John Maddock 2006.\n// Copyright Paul A. Bristow 2007, 2009\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#define BOOST_MATH_OVERFLOW_ERROR_POLICY ignore_error\n\n#include <boost/math/special_functions/gamma.hpp>\n#define BOOST_TEST_MAIN\n#include <boost/test/unit_test.hpp>\n#include <boost/test/tools/floating_point_comparison.hpp>\n#include <boost/math/tools/stats.hpp>\n#include <boost/math/tools/test.hpp>\n#include <boost/math/constants/constants.hpp>\n#include <boost/array.hpp>\n#include \"libs/math/test/functor.hpp\"\n\n#include \"libs/math/test/handle_test_result.hpp\"\n#include \"../table_type.hpp\"\n\n#ifndef SC_\n#define SC_(x) static_cast<typename table_type<T>::type>(BOOST_JOIN(x, L))\n#endif\n\ntemplate <class Real, class T>\nvoid do_test_gamma(const T& data, const char* type_name, const char* test_name)\n{\n   typedef typename T::value_type row_type;\n   typedef Real                   value_type;\n\n   typedef value_type (*pg)(value_type);\n#if defined(BOOST_MATH_NO_DEDUCED_FUNCTION_POINTERS)\n   pg funcp = boost::math::tgamma<value_type>;\n#else\n   pg funcp = boost::math::tgamma;\n#endif\n\n   boost::math::tools::test_result<value_type> result;\n\n   std::cout << \"Testing \" << test_name << \" with type \" << type_name\n             << \"\\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\n\";\n\n   //\n   // test tgamma against data:\n   //\n   result = boost::math::tools::test_hetero<Real>(\n       data,\n       bind_func<Real>(funcp, 0),\n       extract_result<Real>(1));\n   handle_test_result(result, data[result.worst()], result.worst(), type_name, \"boost::math::tgamma\", test_name);\n\n   //\n   // test lgamma against data:\n   //\n#if defined(BOOST_MATH_NO_DEDUCED_FUNCTION_POINTERS)\n   funcp = boost::math::lgamma<value_type>;\n#else\n   funcp    = boost::math::lgamma;\n#endif\n   result = boost::math::tools::test_hetero<Real>(\n       data,\n       bind_func<Real>(funcp, 0),\n       extract_result<Real>(2));\n   handle_test_result(result, data[result.worst()], result.worst(), type_name, \"boost::math::lgamma\", test_name);\n\n   std::cout << std::endl;\n}\n\ntemplate <class T>\nvoid test_gamma(T, const char* name)\n{\n#include \"gamma.ipp\"\n\n   do_test_gamma<T>(gamma, name, \"random values\");\n\n#include \"gamma_1_2.ipp\"\n\n   do_test_gamma<T>(gamma_1_2, name, \"Values near 1 and 2\");\n\n#include \"gamma_0.ipp\"\n\n   do_test_gamma<T>(gamma_0, name, \"Values near 0\");\n\n#include \"gamma_neg.ipp\"\n\n   do_test_gamma<T>(gamma_neg, name, \"Negative arguments\");\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/instances/Jamfile.v2",
    "content": "# copyright John Maddock 2013\n# Distributed under the Boost Software License, Version 1.0.\n# (See accompanying file LICENSE_1_0.txt or copy at\n# http://www.boost.org/LICENSE_1_0.txt.\n\nimport modules ;\nimport path ;\n\nlocal ntl-path = [ modules.peek : NTL_PATH ] ;\nlocal gmp_path = [ modules.peek : GMP_PATH ] ;\nlocal mpfr_path = [ modules.peek : MPFR_PATH ] ;\nlocal mpfi_path = [ modules.peek : MPFI_PATH ] ;\nlocal tommath_path = [ modules.peek : TOMMATH_PATH ] ;\n\nproject : requirements\n   <include>$(gmp_path)\n   <include>$(gmp_path)/mpfr\n   <include>$(gmp_path)/gmpfrxx\n   <include>$(mpfr_path)\n   <include>$(mpfi_path)\n   <include>$(mpfi_path)/src\n   <include>$(tommath_path)\n   <include>../../..\n   # We set these to make it easier to set up and test GMP and MPFR under Win32:\n   #<toolset>msvc:<runtime-link>static\n   #<toolset>msvc:<link>static\n   #<toolset>msvc:<warnings>all\n   #<toolset>intel-win:<runtime-link>static\n   #<toolset>intel-win:<link>static\n   # Speed up compiles:\n   #<toolset>msvc:<debug-symbols>off\n   #<toolset>intel:<debug-symbols>off\n   <toolset>gcc:<cxxflags>-Wall\n   <toolset>gcc:<cxxflags>-Wextra\n   <toolset>intel:<define>SLOW_COMPILER\n   <define>BOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE\n   ;\n\nlib gmp : : <search>$(gmp_path) ;\nlib mpfr : : <search>$(gmp_path) <search>$(mpfr_path) <search>$(mpfr_path)/build.vc10/lib/Win32/Debug ;\nlib mpfi : : <search>$(gmp_path) <search>$(mpfr_path) <search>$(mpfr_path)/build.vc10/lib/Win32/Debug <search>$(mpfi_path) <search>$(mpfi_path)/src ;\nlib quadmath ;\n\nrule generate_objs ( suffix : variant_count : build_opts * )\n{\n   local result ;\n   switch $(variant_count)\n   {\n   case \"1\" : variant_list = 1 ;\n   case \"2\" : variant_list = 1 2 ;\n   case \"3\" : variant_list = 1 2 3 ;\n   case \"4\" : variant_list = 1 2 3 4 ;\n   case \"5\" : variant_list = 1 2 3 4 5 ;\n   case \"6\" : variant_list = 1 2 3 4 5 6 ;\n   }\n\n   for group_id in 1 2 3 4 5 6 7 8 9 10\n   {\n      for variant_id in $(variant_list)\n      {\n         name = \"test_instances$(suffix)_$(group_id)_$(variant_id)\" ;\n         obj $(name) : instances.cpp : release <define>BOOST_MATH_TEST_TYPE=test_type_$(variant_id) <define>TEST_GROUP_$(group_id) $(build_opts) ;\n         result += $(name) ;\n      }\n   }\n   return $(result) ;\n}\n\nlib test_instances_mpf : [ generate_objs \"_mpf\" : 5 : <define>TEST_MPF_50 ] : [ check-target-builds ../../../config//has_gmp : : <build>no ] ;\nlib test_instances_mpfr : [ generate_objs \"_mpfr\" : 4 : <define>TEST_MPFR_50 ] : [ check-target-builds ../../../config//has_mpfr : : <build>no ] ;\nlib test_instances_cpp_dec_float : [ generate_objs \"_cpp_dec_float\" : 3 : <define>TEST_CPP_DEC_FLOAT ] : ;\nlib test_instances_cpp_bin_float : [ generate_objs \"_cpp_bin_float\" : 1 : <define>TEST_CPP_BIN_FLOAT ] : ;\nlib test_instances_float128 : [ generate_objs \"_float128\" : 1 : <define>TEST_FLOAT128 ] : [ check-target-builds ../../../config//has_float128 : : <build>no ] ;\nlib test_instances_intel_quad : [ generate_objs \"_intel_quad\" : 1 : <define>TEST_FLOAT128 <cxxflags>-Qoption,cpp,--extended_float_type ] : [ check-target-builds ../../../config//has_intel_quad : <cxxflags>-Qoption,cpp,--extended_float_type : <build>no ] ;\n\nexplicit test_instances_mpf ;\nexplicit test_instances_mpfr ;\nexplicit test_instances_cpp_dec_float ;\nexplicit test_instances_cpp_bin_float ;\nexplicit test_instances_float128 ;\nexplicit test_instances_intel_quad ;\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/instances/instances.cpp",
    "content": "// Copyright John Maddock 2013.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#define BOOST_MATH_OVERFLOW_ERROR_POLICY ignore_error\n\n#include \"../setup.hpp\"\n#include <boost/math/special_functions.hpp>\n\n//#define BOOST_MATH_TEST_TYPE double\n//#define TEST_GROUP_1\n#include \"../../../../math/test/test_instances/test_instances.hpp\"\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/log1p_expm1_test.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#include \"setup.hpp\"\n//#include <boost/math/special_functions/log1p.hpp>\n//#include <boost/math/special_functions/expm1.hpp>\n#define BOOST_TEST_MAIN\n#include <boost/test/unit_test.hpp>\n#include <boost/test/tools/floating_point_comparison.hpp>\n#include <boost/math/special_functions/math_fwd.hpp>\n\n#include \"table_type.hpp\"\n\n#include \"libs/math/test/log1p_expm1_test.hpp\"\n\n//\n// DESCRIPTION:\n// ~~~~~~~~~~~~\n//\n// This file tests the functions log1p and expm1.  The accuracy tests\n// use values generated with NTL::RR at 1000-bit precision\n// and our generic versions of these functions.\n//\n// Note that when this file is first run on a new platform many of\n// these tests will fail: the default accuracy is 1 epsilon which\n// is too tight for most platforms.  In this situation you will\n// need to cast a human eye over the error rates reported and make\n// a judgement as to whether they are acceptable.  Either way please\n// report the results to the Boost mailing list.  Acceptable rates of\n// error are marked up below as a series of regular expressions that\n// identify the compiler/stdlib/platform/data-type/test-data/test-function\n// along with the maximum expected peek and RMS mean errors for that\n// test.\n//\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n\n   //\n   // Catch all cases come last:\n   //\n   add_expected_result(\n       \".*\",                // compiler\n       \".*\",                // stdlib\n       \".*\",                // platform\n       \".*gmp_float<18>.*\", // test type(s)\n       \".*\",                // test data group\n       \".*\",                // test function\n       500,                 // Max Peek error\n       100);                // Max mean error\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*mpfr_float_backend<18>.*\", // test type(s)\n       \".*\",                         // test data group\n       \".*\",                         // test function\n       500,                          // Max Peek error\n       100);                         // Max mean error\n   add_expected_result(\n       \".*\", // compiler\n       \".*\", // stdlib\n       \".*\", // platform\n       \".*\", // test type(s)\n       \".*\", // test data group\n       \".*\", // test function\n       8,    // Max Peek error\n       5);   // Max mean error\n\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/powm1_sqrtp1m1_test.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#include \"setup.hpp\"\n#define BOOST_TEST_MAIN\n#include <boost/test/unit_test.hpp>\n#include <boost/test/tools/floating_point_comparison.hpp>\n#include <boost/math/special_functions/math_fwd.hpp>\n\n#include \"table_type.hpp\"\n\n#include \"libs/math/test/powm1_sqrtp1m1_test.hpp\"\n\n//\n// DESCRIPTION:\n// ~~~~~~~~~~~~\n//\n// This file tests the functions log1p and expm1.  The accuracy tests\n// use values generated with NTL::RR at 1000-bit precision\n// and our generic versions of these functions.\n//\n// Note that when this file is first run on a new platform many of\n// these tests will fail: the default accuracy is 1 epsilon which\n// is too tight for most platforms.  In this situation you will\n// need to cast a human eye over the error rates reported and make\n// a judgement as to whether they are acceptable.  Either way please\n// report the results to the Boost mailing list.  Acceptable rates of\n// error are marked up below as a series of regular expressions that\n// identify the compiler/stdlib/platform/data-type/test-data/test-function\n// along with the maximum expected peek and RMS mean errors for that\n// test.\n//\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n\n   //\n   // Catch all cases come last:\n   //\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*mpfr_float_backend<18>.*\", // test type(s)\n       \".*\",                         // test data group\n       \".*\",                         // test function\n       300,                          // Max Peek error\n       50);                          // Max mean error\n   add_expected_result(\n       \".*\", // compiler\n       \".*\", // stdlib\n       \".*\", // platform\n       \".*\", // test type(s)\n       \".*\", // test data group\n       \".*\", // test function\n       15,   // Max Peek error\n       5);   // Max mean error\n\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_powm1_sqrtp1m1(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // We test two different precisions:\n   // 18 decimal digits triggers Boost.Math's 64-bit long double support.\n   // 30 decimal digits triggers Boost.Math's 128-bit long double support.\n   // 35 decimal digits triggers true arbitrary precision support.\n   //\n   ALL_SMALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/readme.txt",
    "content": "These tests verify that the multiprecision types can interoperate with Boost.Math.\n\nWe use Boost.Math's own test data for these and test at various precisions which trigger\ndifferent code inside the Math lib.  We don't test at very high precision here as\nBoost.Math's test data doesn't go much beyond 35 digits (for good reason, some compilers\nchoke when attempting to parse higher precision numbers as double's).\n\n\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/setup.hpp",
    "content": "//  Copyright 2013 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_MATH_SETUP_HPP\n#define BOOST_MP_MATH_SETUP_HPP\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#define BOOST_MATH_OVERFLOW_ERROR_POLICY ignore_error\n#undef BOOST_MATH_SMALL_CONSTANT\n#define BOOST_MATH_SMALL_CONSTANT(x) x\n\n#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n#define TEST_MPFR_50\n#define TEST_CPP_DEC_FLOAT\n#define TEST_FLOAT128\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/debug_adaptor.hpp>\n\n#define MPF_TESTS /*test(number<gmp_float<18> >(), \"number<gmp_float<18> >\");*/ \\\n   mpf_float::default_precision(20);                                            \\\n   test(mpf_float(), \"number<gmp_float<0> > (20 digit precision)\");             \\\n   mpf_float::default_precision(35);                                            \\\n   test(mpf_float(), \"number<gmp_float<0> > (35 digit precision)\");             \\\n   test(number<gmp_float<30> >(), \"number<gmp_float<30> >\");                    \\\n   test(number<gmp_float<35> >(), \"number<gmp_float<35> >\");                    \\\n   /* there should be at least one test with expression templates off: */       \\\n   test(number<gmp_float<35>, et_off>(), \"number<gmp_float<35>, et_off>\");\n#define MPF_SMALL_TESTS /*test(number<gmp_float<18> >(), \"number<gmp_float<18> >\");*/ \\\n   test(number<gmp_float<30> >(), \"number<gmp_float<30> >\");                          \\\n   test(number<gmp_float<35> >(), \"number<gmp_float<35> >\");                          \\\n   /* there should be at least one test with expression templates off: */             \\\n   test(number<gmp_float<35>, et_off>(), \"number<gmp_float<35>, et_off>\");            \\\n   mpf_float::default_precision(20);                                                  \\\n   test(mpf_float(), \"number<gmp_float<0> > (20 digit precision)\");                   \\\n   mpf_float::default_precision(35);                                                  \\\n   test(mpf_float(), \"number<gmp_float<0> > (35 digit precision)\");\n\ntypedef boost::multiprecision::number<boost::multiprecision::gmp_float<18> >                               test_type_1;\ntypedef boost::multiprecision::number<boost::multiprecision::gmp_float<30> >                               test_type_2;\ntypedef boost::multiprecision::number<boost::multiprecision::gmp_float<35> >                               test_type_3;\ntypedef boost::multiprecision::number<boost::multiprecision::gmp_float<35>, boost::multiprecision::et_off> test_type_4;\ntypedef boost::multiprecision::mpf_float                                                                   test_type_5;\n\n#else\n\n#define MPF_TESTS\n#define MPF_SMALL_TESTS\n\n#endif\n\n#if defined(TEST_MPFR_50)\n#include <boost/multiprecision/mpfr.hpp>\n\n#define MPFR_TESTS                                                                                                     \\\n   test(number<mpfr_float_backend<18> >(), \"number<mpfr_float_backend<18> >\");                                         \\\n   test(number<mpfr_float_backend<30> >(), \"number<mpfr_float_backend<30> >\");                                         \\\n   test(number<mpfr_float_backend<35> >(), \"number<mpfr_float_backend<35> >\");                                         \\\n   /* Test variable precision at 2 different precisions - checks our ability to handle dynamic changes in precision */ \\\n   mpfr_float::default_precision(20);                                                                                  \\\n   test(mpfr_float(), \"number<mpfr_float_backend<0> > (20-digit precision)\");                                          \\\n   mpfr_float::default_precision(35);                                                                                  \\\n   test(mpfr_float(), \"number<mpfr_float_backend<0> > (35-digit precision)\");\n\ntypedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<18> > test_type_1;\ntypedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> > test_type_2;\ntypedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<35> > test_type_3;\ntypedef boost::multiprecision::mpfr_float                                             test_type_4;\n\n#else\n\n#define MPFR_TESTS\n\n#endif\n\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\n#define CPP_DEC_FLOAT_TESTS                                          \\\n   test(number<cpp_dec_float<18> >(), \"number<cpp_dec_float<18> >\"); \\\n   test(number<cpp_dec_float<30> >(), \"number<cpp_dec_float<30> >\"); \\\n   test(number<cpp_dec_float<35, long long, std::allocator<char> > >(), \"number<cpp_dec_float<35, long long, std::allocator<char> > >\");\n\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> >                                   test_type_1;\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<30> >                                   test_type_2;\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<35, long long, std::allocator<char> > > test_type_3;\n\n#else\n\n#define CPP_DEC_FLOAT_TESTS\n\n#endif\n\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/debug_adaptor.hpp>\n\n//#define CPP_BIN_FLOAT_TESTS test(number<debug_adaptor<cpp_bin_float_quad::backend_type>, et_off>(), \"cpp_bin_float_quad\");\n#define CPP_BIN_FLOAT_TESTS test(cpp_bin_float_quad(), \"cpp_bin_float_quad\");\n\n//typedef boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::cpp_bin_float_quad::backend_type>, boost::multiprecision::et_off> test_type_1;\ntypedef boost::multiprecision::cpp_bin_float_quad test_type_1;\n\n#else\n\n#define CPP_BIN_FLOAT_TESTS\n\n#endif\n\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n\n#define FLOAT128_TESTS test(float128(), \"float128\");\n\ntypedef boost::multiprecision::float128 test_type_1;\n\n#else\n\n#define FLOAT128_TESTS\n\n#endif\n\n#ifndef BOOST_MATH_TEST_TYPE\n#define BOOST_TEST_MAIN\n#include <boost/test/unit_test.hpp>\n#include <boost/test/floating_point_comparison.hpp>\n#endif\n\n#define ALL_TESTS      \\\n   MPF_TESTS           \\\n   MPFR_TESTS          \\\n   CPP_DEC_FLOAT_TESTS \\\n   FLOAT128_TESTS      \\\n   CPP_BIN_FLOAT_TESTS\n\n#define ALL_SMALL_TESTS \\\n   MPF_SMALL_TESTS      \\\n   MPFR_TESTS           \\\n   CPP_DEC_FLOAT_TESTS  \\\n   FLOAT128_TESTS       \\\n   CPP_BIN_FLOAT_TESTS\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/table_type.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_TABLE_TYPE\n#define BOOST_MP_TABLE_TYPE\n\n#include <libs/math/test/table_type.hpp>\n#include <boost/multiprecision/number.hpp>\n\nstruct string_table_entry\n{\n private:\n   const char* m_data;\n\n public:\n   string_table_entry(const char* p) : m_data(p) {}\n\n   template <class T>\n   operator T() const\n   {\n      return static_cast<T>(m_data);\n   }\n};\n\ninline std::ostream& operator<<(std::ostream& os, string_table_entry const& what)\n{\n   return os << static_cast<const char*>(what);\n}\n\ntemplate <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct table_type<boost::multiprecision::number<Backend, ExpressionTemplates> >\n{\n   typedef string_table_entry type;\n};\n\n#define SC_(x) string_table_entry(BOOST_STRINGIZE(x))\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_bessel_i.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_bessel_i.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n\n   //\n   // Catch all cases come last:\n   //\n   add_expected_result(\n       \".*\", // compiler\n       \".*\", // stdlib\n       \".*\", // platform\n       \".*\", // test type(s)\n       \".*\", // test data group\n       \".*\", // test function\n       500,  // Max Peek error\n       200); // Max mean error\n\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_bessel(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   //  9 decimal digits: tests the least wide arbitrary precision code\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_SMALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_bessel_j.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_bessel_j.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n\n   add_expected_result(\n       \".*\",                             // compiler\n       \".*\",                             // stdlib\n       \".*\",                             // platform\n       \".*mpfr_float_backend<18>.*\",     // test type(s)\n       \".*J0.*Tricky.*\",                 // test data group\n       \".*\", 10000000000L, 5000000000L); // test function\n   add_expected_result(\n       \".*\",                        // compiler\n       \".*\",                        // stdlib\n       \".*\",                        // platform\n       \".*\",                        // test type(s)\n       \".*J0.*Tricky.*\",            // test data group\n       \".*\", 400000000, 400000000); // test function\n   add_expected_result(\n       \".*\",                           // compiler\n       \".*\",                           // stdlib\n       \".*\",                           // platform\n       \".*mpfr_float_backend<18>.*\",   // test type(s)\n       \".*J1.*Tricky.*\",               // test data group\n       \".*\", 1000000000L, 500000000L); // test function\n   add_expected_result(\n       \".*\",                     // compiler\n       \".*\",                     // stdlib\n       \".*\",                     // platform\n       \".*\",                     // test type(s)\n       \".*J1.*Tricky.*\",         // test data group\n       \".*\", 10000000, 5000000); // test function\n   add_expected_result(\n       \".*\",                  // compiler\n       \".*\",                  // stdlib\n       \".*\",                  // platform\n       \".*cpp_bin_float.*\",   // test type(s)\n       \".*JN.*Integer.*\",     // test data group\n       \".*\", 500000, 150000); // test function\n   add_expected_result(\n       \".*\",                // compiler\n       \".*\",                // stdlib\n       \".*\",                // platform\n       \".*\",                // test type(s)\n       \".*JN.*Integer.*\",   // test data group\n       \".*\", 50000, 15000); // test function\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*mpfr_float_backend<18>.*\", // test type(s)\n       \".*(JN|j).*|.*Tricky.*\",      // test data group\n       \".*\", 70000, 7000);           // test function\n   add_expected_result(\n       \".*\",                    // compiler\n       \".*\",                    // stdlib\n       \".*\",                    // platform\n       \".*cpp_bin_float.*\",     // test type(s)\n       \".*(JN|j).*|.*Tricky.*\", // test data group\n       \".*\", 500000, 200000);   // test function\n   add_expected_result(\n       \".*\",                    // compiler\n       \".*\",                    // stdlib\n       \".*\",                    // platform\n       \".*\",                    // test type(s)\n       \".*(JN|j).*|.*Tricky.*\", // test data group\n       \".*\", 7000, 3000);       // test function\n   add_expected_result(\n       \".*\",          // compiler\n       \".*\",          // stdlib\n       \".*\",          // platform\n       \".*\",          // test type(s)\n       \".*\",          // test data group\n       \".*\", 40, 20); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_bessel(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_bessel_k.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_bessel_k.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",              // compiler\n       \".*\",              // stdlib\n       \".*\",              // platform\n       \".*gmp.*\",         // test type(s)\n       \".*\",              // test data group\n       \".*\", 2000, 1500); // test function\n#ifdef BOOST_INTEL\n   add_expected_result(\n       \".*\",            // compiler\n       \".*\",            // stdlib\n       \".*\",            // platform\n       \".*float128.*\",  // test type(s)\n       \".*\",            // test data group\n       \".*\", 300, 100); // test function\n#endif\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*mpfr_float_backend<18>.*\", // test type(s)\n       \".*\",                         // test data group\n       \".*\", 3000, 1000);            // test function\n   add_expected_result(\n       \".*\",                        // compiler\n       \".*\",                        // stdlib\n       \".*\",                        // platform\n       \".*mpfr_float_backend<0>.*\", // test type(s)\n       \".*\",                        // test data group\n       \".*\", 300, 150);             // test function\n   add_expected_result(\n       \".*\",          // compiler\n       \".*\",          // stdlib\n       \".*\",          // platform\n       \".*\",          // test type(s)\n       \".*large.*\",   // test data group\n       \".*\", 80, 50); // test function\n   add_expected_result(\n       \".*\",                // compiler\n       \".*\",                // stdlib\n       \".*\",                // platform\n       \".*cpp_bin_float.*\", // test type(s)\n       \".*\",                // test data group\n       \".*\", 300, 150);     // test function\n   add_expected_result(\n       \".*\",          // compiler\n       \".*\",          // stdlib\n       \".*\",          // platform\n       \".*\",          // test type(s)\n       \".*\",          // test data group\n       \".*\", 50, 15); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_bessel(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_bessel_y.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_bessel_y.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*mpfr_float_backend<18>.*\", // test type(s)\n       \".*(Y[nv]|y).*Random.*\",      // test data group\n       \".*\", 200000, 10000);         // test function\n   add_expected_result(\n       \".*\",                    // compiler\n       \".*\",                    // stdlib\n       \".*\",                    // platform\n       \".*cpp_bin_float.*\",     // test type(s)\n       \".*(Y[nv]|y).*Random.*\", // test data group\n       \".*\", 2000000, 1000000); // test function\n   add_expected_result(\n       \".*\",                        // compiler\n       \".*\",                        // stdlib\n       \".*\",                        // platform\n       \".*mpfr_float_backend<0>.*\", // test type(s)\n       \".*(Y[nv]|y).*Random.*\",     // test data group\n       \".*\", 150000, 15000);        // test function\n   add_expected_result(\n       \".*\",                    // compiler\n       \".*\",                    // stdlib\n       \".*\",                    // platform\n       \".*\",                    // test type(s)\n       \".*(Y[nv]|y).*Random.*\", // test data group\n       \".*\", 70000, 4000);      // test function\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*mpfr_float_backend<18>.*\", // test type(s)\n       \".*Y0.*\",                     // test data group\n       \".*\", 3000, 2000);            // test function\n   add_expected_result(\n       \".*\",                // compiler\n       \".*\",                // stdlib\n       \".*\",                // platform\n       \".*cpp_bin_float.*\", // test type(s)\n       \".*Y0.*\",            // test data group\n       \".*\", 40000, 20000); // test function\n   add_expected_result(\n       \".*\",            // compiler\n       \".*\",            // stdlib\n       \".*\",            // platform\n       \".*\",            // test type(s)\n       \".*Y0.*\",        // test data group\n       \".*\", 800, 400); // test function\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*mpfr_float_backend<18>.*\", // test type(s)\n       \".*Yn.*\",                     // test data group\n       \".*\", 400000, 70000);         // test function\n   add_expected_result(\n       \".*\",                  // compiler\n       \".*\",                  // stdlib\n       \".*\",                  // platform\n       \".*cpp_bin_float.*\",   // test type(s)\n       \".*Yn.*\",              // test data group\n       \".*\", 400000, 200000); // test function\n   add_expected_result(\n       \".*\",             // compiler\n       \".*\",             // stdlib\n       \".*\",             // platform\n       \".*\",             // test type(s)\n       \".*Yn.*\",         // test data group\n       \".*\", 1700, 600); // test function\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*mpfr_float_backend<18>.*\", // test type(s)\n       \".*\",                         // test data group\n       \".*\", 15000, 4000);           // test function\n   add_expected_result(\n       \".*\",                // compiler\n       \".*\",                // stdlib\n       \".*\",                // platform\n       \".*cpp_bin_float.*\", // test type(s)\n       \".*\",                // test data group\n       \".*\", 50000, 20000); // test function\n   add_expected_result(\n       \".*\",           // compiler\n       \".*\",           // stdlib\n       \".*\",           // platform\n       \".*\",           // test type(s)\n       \".*\",           // test data group\n       \".*\", 150, 60); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_bessel(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_SMALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_beta.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_beta.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",                      // compiler\n       \".*\",                      // stdlib\n       \".*\",                      // platform\n       \".*gmp.*\",                 // test type(s)\n       \"Beta Function: Medium.*\", // test data group\n       \"beta\", 2300, 1000);       // test function\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*gmp.*\",                    // test type(s)\n       \"Beta Function: Divergent.*\", // test data group\n       \"beta\", 2200, 1000);          // test function\n   add_expected_result(\n       \".*\",                             // compiler\n       \".*\",                             // stdlib\n       \".*\",                             // platform\n       \".*mpfr_float_backend\\\\<18\\\\>.*\", // test type(s)\n       \"Beta Function: Small.*\",         // test data group\n       \"beta\", 1000, 750);               // test function\n   add_expected_result(\n       \".*\",                     // compiler\n       \".*\",                     // stdlib\n       \".*\",                     // platform\n       \".*\",                     // test type(s)\n       \"Beta Function: Small.*\", // test data group\n       \"beta\", 12, 8);            // test function\n   add_expected_result(\n       \".*\",                      // compiler\n       \".*\",                      // stdlib\n       \".*\",                      // platform\n       \".*\",                      // test type(s)\n       \"Beta Function: Medium.*\", // test data group\n       \"beta\", 1000, 750);        // test function\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*\",                         // test type(s)\n       \"Beta Function: Divergent.*\", // test data group\n       \"beta\", 1000, 700);           // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_beta(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_binomial_coeff.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_binomial_coeff.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",              // compiler\n       \".*\",              // stdlib\n       \".*\",              // platform\n       \".*gmp.*\",         // test type(s)\n       \".*\",              // test data group\n       \".*\", 3000, 1500); // test function\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*mpfr_float_backend<18>.*\", // test type(s)\n       \".*\",                         // test data group\n       \".*\", 750, 150);              // test function\n   add_expected_result(\n       \".*\",                        // compiler\n       \".*\",                        // stdlib\n       \".*\",                        // platform\n       \".*mpfr_float_backend<0>.*\", // test type(s)\n       \".*\",                        // test data group\n       \".*\", 150, 100);             // test function\n   add_expected_result(\n       \".*\",                        // compiler\n       \".*\",                        // stdlib\n       \".*\",                        // platform\n       \".*mpfr_float_backend.*\", // test type(s)\n       \".*\",                        // test data group\n       \".*\", 150, 100);             // test function\n   add_expected_result(\n       \".*\",           // compiler\n       \".*\",           // stdlib\n       \".*\",           // platform\n       \".*\",           // test type(s)\n       \".*\",           // test data group\n       \".*\", 100, 20); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_binomial(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_carlson_1.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n#define TEST1\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include <boost/math/special_functions/ellint_rf.hpp>\n#include \"libs/math/test/test_carlson.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",               // compiler\n       \".*\",               // stdlib\n       \".*\",               // platform\n       \".*gmp_float<0>.*\", // test type(s)\n       \".*RJ.*\",           // test data group\n       \".*\", 40000, 4000); // test function\n   add_expected_result(\n       \".*\",             // compiler\n       \".*\",             // stdlib\n       \".*\",             // platform\n       \".*\",             // test type(s)\n       \".*RJ.*\",         // test data group\n       \".*\", 2700, 250); // test function\n   add_expected_result(\n       \".*\",               // compiler\n       \".*\",               // stdlib\n       \".*\",               // platform\n       \".*gmp_float<0>.*\", // test type(s)\n       \".*RC.*\",           // test data group\n       \".*\", 7000, 1000);  // test function\n   add_expected_result(\n       \".*\",               // compiler\n       \".*\",               // stdlib\n       \".*\",               // platform\n       \".*gmp_float<0>.*\", // test type(s)\n       \".*RF.*\",           // test data group\n       \".*\", 20000, 800);  // test function\n   add_expected_result(\n       \".*\",          // compiler\n       \".*\",          // stdlib\n       \".*\",          // platform\n       \".*\",          // test type(s)\n       \".*\",          // test data group\n       \".*\", 40, 20); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_spots(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_carlson_2.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n#define TEST2\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_carlson.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",               // compiler\n       \".*\",               // stdlib\n       \".*\",               // platform\n       \".*gmp_float<0>.*\", // test type(s)\n       \".*RJ.*\",           // test data group\n       \".*\", 40000, 4000); // test function\n   add_expected_result(\n       \".*\",               // compiler\n       \".*\",               // stdlib\n       \".*\",               // platform\n       \".*gmp_float<0>.*\", // test type(s)\n       \".*RC.*\",           // test data group\n       \".*\", 7000, 1000);  // test function\n   add_expected_result(\n       \".*\",             // compiler\n       \".*\",             // stdlib\n       \".*\",             // platform\n       \".*\",             // test type(s)\n       \".*RJ.*\",         // test data group\n       \".*\", 2700, 250); // test function\n   add_expected_result(\n       \".*\",          // compiler\n       \".*\",          // stdlib\n       \".*\",          // platform\n       \".*\",          // test type(s)\n       \".*\",          // test data group\n       \".*\", 40, 20); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_spots(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_carlson_3.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n#define TEST3\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_carlson.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",             // compiler\n       \".*\",             // stdlib\n       \".*\",             // platform\n       \".*\",             // test type(s)\n       \".*RJ.*\",         // test data group\n       \".*\", 2700, 250); // test function\n   add_expected_result(\n       \".*\",           // compiler\n       \".*\",           // stdlib\n       \".*\",           // platform\n       \".*\",           // test type(s)\n       \".*RD: y = z\",  // test data group\n       \".*\", 120, 30); // test function\n   add_expected_result(\n       \".*\",          // compiler\n       \".*\",          // stdlib\n       \".*\",          // platform\n       \".*\",          // test type(s)\n       \".*\",          // test data group\n       \".*\", 40, 20); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_spots(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_carlson_4.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n#define TEST4\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_carlson.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",                      // compiler\n       \".*\",                      // stdlib\n       \".*\",                      // platform\n       \".*\",                      // test type(s)\n       \"RG: two values the same\", // test data group\n       \".*\", 10000, 700);         // test function\n   add_expected_result(\n       \".*\",             // compiler\n       \".*\",             // stdlib\n       \".*\",             // platform\n       \".*\",             // test type(s)\n       \".*RJ.*\",         // test data group\n       \".*\", 2700, 250); // test function\n   add_expected_result(\n       \".*\",          // compiler\n       \".*\",          // stdlib\n       \".*\",          // platform\n       \".*\",          // test type(s)\n       \".*\",          // test data group\n       \".*\", 40, 20); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_spots(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_cbrt.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_cbrt.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",        // compiler\n       \".*\",        // stdlib\n       \".*\",        // platform\n       \".*\",        // test type(s)\n       \".*\",        // test data group\n       \".*\", 5, 3); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_cbrt(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_digamma.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_digamma.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*mpfr_float_backend<18>.*\", // test type(s)\n       \".*Negative.*\",               // test data group\n       \".*\", 20000, 2000);           // test function\n   add_expected_result(\n       \".*\",           // compiler\n       \".*\",           // stdlib\n       \".*\",           // platform\n       \".*\",           // test type(s)\n       \".*Negative.*\", // test data group\n       \".*\", 550, 40); // test function\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*cpp_dec_float.*\",          // test type(s)\n       \".*Near the Positive Root.*\", // test data group\n       \".*\", 2500, 200);             // test function\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*mpfr_float_backend<0>.*\",  // test type(s)\n       \".*Near the Positive Root.*\", // test data group\n       \".*\", 30000, 2000);           // test function\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*\",                         // test type(s)\n       \".*Near the Positive Root.*\", // test data group\n       \".*\", 6000, 1000);            // test function\n   add_expected_result(\n       \".*\",          // compiler\n       \".*\",          // stdlib\n       \".*\",          // platform\n       \".*\",          // test type(s)\n       \".*\",          // test data group\n       \".*\", 80, 30); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_digamma(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_ellint_1.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_ellint_1.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*mpfr_float_backend<18>.*\", // test type(s)\n       \".*\",                         // test data group\n       \".*\", 1000, 200);             // test function\n   add_expected_result(\n       \".*\",          // compiler\n       \".*\",          // stdlib\n       \".*\",          // platform\n       \".*\",          // test type(s)\n       \".*\",          // test data group\n       \".*\", 70, 20); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_spots(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_ellint_2.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_ellint_2.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",            // compiler\n       \".*\",            // stdlib\n       \".*\",            // platform\n       \".*\",            // test type(s)\n       \".*\",            // test data group\n       \".*\", 300, 200); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_spots(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_ellint_3.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_ellint_3.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",                // compiler\n       \".*\",                // stdlib\n       \".*\",                // platform\n       \".*gmp_float<18>.*\", // test type(s)\n       \".*\",                // test data group\n       \".*\", 3000, 500);    // test function\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*mpfr_float_backend<18>.*\", // test type(s)\n       \".*\",                         // test data group\n       \".*\", 10000, 3000);           // test function\n   add_expected_result(\n       \".*\",                        // compiler\n       \".*\",                        // stdlib\n       \".*\",                        // platform\n       \".*mpfr_float_backend<0>.*\", // test type(s)\n       \".*Mathworld.*\",             // test data group\n       \".*\", 10000, 3000);          // test function\n   add_expected_result(\n       \".*\",               // compiler\n       \".*\",               // stdlib\n       \".*\",               // platform\n       \".*gmp_float<0>.*\", // test type(s)\n       \".*\",               // test data group\n       \".*\", 12000, 1300); // test function\n   add_expected_result(\n       \".*\",          // compiler\n       \".*\",          // stdlib\n       \".*\",          // platform\n       \".*\",          // test type(s)\n       \".*Large.*\",   // test data group\n       \".*\", 75, 40); // test function\n   add_expected_result(\n       \".*\",                     // compiler\n       \".*\",                     // stdlib\n       \".*\",                     // platform\n       \".*cpp_bin_float_quad.*\", // test type(s)\n       \".*Mathworld.*\",          // test data group\n       \".*\", 500, 100);          // test function\n#ifdef BOOST_INTEL\n   add_expected_result(\n       \".*\",           // compiler\n       \".*\",           // stdlib\n       \".*\",           // platform\n       \".*float128.*\", // test type(s)\n       \".*\",           // test data group\n       \".*\", 200, 30); // test function\n#endif\n   add_expected_result(\n       \".*\",            // compiler\n       \".*\",            // stdlib\n       \".*\",            // platform\n       \".*\",            // test type(s)\n       \".*Mathworld.*\", // test data group\n       \".*\", 600, 300); // test function\n   add_expected_result(\n       \".*\",          // compiler\n       \".*\",          // stdlib\n       \".*\",          // platform\n       \".*\",          // test type(s)\n       \".*\",          // test data group\n       \".*\", 60, 30); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_spots(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_erf.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_erf.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",                 // compiler\n       \".*\",                 // stdlib\n       \".*\",                 // platform\n       \".*gmp_float<18>.*\",  // test type(s)\n       \"Erf Function:.*\",    // test data group\n       \"erfc?\", 2200, 1500); // test function\n   add_expected_result(\n       \".*\",                     // compiler\n       \".*\",                     // stdlib\n       \".*\",                     // platform\n       \".*gmp_float<18>.*\",      // test type(s)\n       \"Inverse Erf.*\",          // test data group\n       \"erfc?_inv\", 2200, 1500); // test function\n#ifdef BOOST_INTEL\n   add_expected_result(\n       \".*\",                  // compiler\n       \".*\",                  // stdlib\n       \".*\",                  // platform\n       \"float128\",            // test type(s)\n       \"Erf Function:.*\",     // test data group\n       \"erfc?\", 15000, 1000); // test function\n#endif\n   add_expected_result(\n       \".*\",                 // compiler\n       \".*\",                 // stdlib\n       \".*\",                 // platform\n       \".*cpp_bin_float.*\",  // test type(s)\n       \"Erf Function:.*\",    // test data group\n       \"erfc?\", 3000, 1000); // test function\n   add_expected_result(\n       \".*\",                        // compiler\n       \".*\",                        // stdlib\n       \".*\",                        // platform\n       \".*mpfr_float_backend<0>.*\", // test type(s)\n       \".*\",                        // test data group\n       \".*\", 600, 100);             // test function\n   add_expected_result(\n       \".*\",               // compiler\n       \".*\",               // stdlib\n       \".*\",               // platform\n       \".*\",               // test type(s)\n       \"Erf Function:.*\",  // test data group\n       \"erfc?\", 300, 200); // test function\n   add_expected_result(\n       \".*\",                 // compiler\n       \".*\",                 // stdlib\n       \".*\",                 // platform\n       \".*\",                 // test type(s)\n       \"Inverse Erf.*\",      // test data group\n       \"erfc?_inv\", 60, 20); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_erf(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_expint.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_expint.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",                // compiler\n       \".*\",                // stdlib\n       \".*\",                // platform\n       \".*gmp_float<18>.*\", // test type(s)\n       \".*\",                // test data group\n       \".*\", 2500, 1500);   // test function\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*mpfr_float_backend<18>.*\", // test type(s)\n       \".*\",                         // test data group\n       \".*\", 1000, 500);             // test function\n   add_expected_result(\n       \".*\",            // compiler\n       \".*\",            // stdlib\n       \".*\",            // platform\n       \".*gmp_float.*\", // test type(s)\n       \".*\",            // test data group\n       \".*\", 250, 100); // test function\n#ifdef BOOST_INTEL\n   add_expected_result(\n       \".*\",              // compiler\n       \".*\",              // stdlib\n       \".*\",              // platform\n       \"float128\",        // test type(s)\n       \".*\",              // test data group\n       \".*\", 4500, 1000); // test function\n#endif\n   add_expected_result(\n       \".*\",                // compiler\n       \".*\",                // stdlib\n       \".*\",                // platform\n       \".*cpp_bin_float.*\", // test type(s)\n       \".*\",                // test data group\n       \".*\", 5000, 2000);   // test function\n   add_expected_result(\n       \".*\",           // compiler\n       \".*\",           // stdlib\n       \".*\",           // platform\n       \".*\",           // test type(s)\n       \".*\",           // test data group\n       \".*\", 250, 50); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_expint(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_gamma.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_gamma.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",                  // compiler\n       \".*\",                  // stdlib\n       \".*\",                  // platform\n       \".*gmp_float<18>.*\",   // test type(s)\n       \".*\",                  // test data group\n       \"tgamma\", 4000, 2500); // test function\n   add_expected_result(\n       \".*\",                        // compiler\n       \".*\",                        // stdlib\n       \".*\",                        // platform\n       \".*mpfr_float_backend<0>.*\", // test type(s)\n       \"factorials\",                // test data group\n       \"tgamma\", 400, 100);         // test function\n   add_expected_result(\n       \".*\",               // compiler\n       \".*\",               // stdlib\n       \".*\",               // platform\n       \".*\",               // test type(s)\n       \"factorials\",       // test data group\n       \"tgamma\", 170, 70); // test function\n   add_expected_result(\n       \".*\",                // compiler\n       \".*\",                // stdlib\n       \".*\",                // platform\n       \".*\",                // test type(s)\n       \"factorials\",        // test data group\n       \"lgamma\", 750, 100); // test function\n#ifdef BOOST_INTEL\n   add_expected_result(\n       \".*\",                   // compiler\n       \".*\",                   // stdlib\n       \".*\",                   // platform\n       \"float128\",             // test type(s)\n       \".*near -.*\",           // test data group\n       \".*\", 150000L, 30000L); // test function\n#endif\n   add_expected_result(\n       \".*\",                // compiler\n       \".*\",                // stdlib\n       \".*\",                // platform\n       \".*\",                // test type(s)\n       \"near.*\",            // test data group\n       \"tgamma\", 250, 120); // test function\n   add_expected_result(\n       \".*\",                 // compiler\n       \".*\",                 // stdlib\n       \".*\",                 // platform\n       \".*\",                 // test type(s)\n       \"near.*\",             // test data group\n       \"lgamma\", 1400, 250); // test function\n   add_expected_result(\n       \".*\",                     // compiler\n       \".*\",                     // stdlib\n       \".*\",                     // platform\n       \".*\",                     // test type(s)\n       \"tgamma1pm1.*\",           // test data group\n       \"tgamma1pm1\", 1500, 400); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_gamma(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_hermite.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_hermite.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n#ifdef BOOST_INTEL\n   add_expected_result(\n       \".*\",               // compiler\n       \".*\",               // stdlib\n       \".*\",               // platform\n       \"float128\",         // test type(s)\n       \".*\",               // test data group\n       \"hermite\", 70, 25); // test function\n#endif\n   add_expected_result(\n       \".*\",              // compiler\n       \".*\",              // stdlib\n       \".*\",              // platform\n       \".*\",              // test type(s)\n       \".*\",              // test data group\n       \"hermite\", 10, 5); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_hermite(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_ibeta.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#define TEST_DATA 1\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_ibeta.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \"[^|]*\",             // compiler\n       \"[^|]*\",             // stdlib\n       \"[^|]*\",             // platform\n       \".*gmp_float<18>.*\", // test type(s)\n       \"(?i).*small.*\",     // test data group\n       \".*\", 3000, 1000);   // test function\n   add_expected_result(\n       \"[^|]*\",                      // compiler\n       \"[^|]*\",                      // stdlib\n       \"[^|]*\",                      // platform\n       \".*mpfr_float_backend<18>.*\", // test type(s)\n       \"(?i).*small.*\",              // test data group\n       \".*\", 2000, 500);             // test function\n   add_expected_result(\n       \"[^|]*\",                     // compiler\n       \"[^|]*\",                     // stdlib\n       \"[^|]*\",                     // platform\n       \".*mpfr_float_backend<0>.*\", // test type(s)\n       \"(?i).*small.*\",             // test data group\n       \".*\", 1000, 100);            // test function\n#ifdef BOOST_INTEL\n   add_expected_result(\n       \"[^|]*\",         // compiler\n       \"[^|]*\",         // stdlib\n       \"[^|]*\",         // platform\n       \"float128\",      // test type(s)\n       \"(?i).*small.*\", // test data group\n       \".*\", 500, 100); // test function\n#endif\n   add_expected_result(\n       \"[^|]*\",         // compiler\n       \"[^|]*\",         // stdlib\n       \"[^|]*\",         // platform\n       \".*\",            // test type(s)\n       \"(?i).*small.*\", // test data group\n       \".*\", 90, 25);   // test function\n   add_expected_result(\n       \"[^|]*\",          // compiler\n       \"[^|]*\",          // stdlib\n       \"[^|]*\",          // platform\n       \".*\",             // test type(s)\n       \"(?i).*medium.*\", // test data group\n       \".*\", 150, 50);   // test function\n   add_expected_result(\n       \"[^|]*\",          // compiler\n       \"[^|]*\",          // stdlib\n       \"[^|]*\",          // platform\n       \".*\",             // test type(s)\n       \"(?i).*large.*\",  // test data group\n       \".*\", 5000, 500); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_beta(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_ibeta_2.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#define TEST_DATA 2\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_ibeta.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \"[^|]*\",             // compiler\n       \"[^|]*\",             // stdlib\n       \"[^|]*\",             // platform\n       \".*gmp_float<18>.*\", // test type(s)\n       \"(?i).*medium.*\",    // test data group\n       \".*\", 4000, 1000);   // test function\n   add_expected_result(\n       \"[^|]*\",                      // compiler\n       \"[^|]*\",                      // stdlib\n       \"[^|]*\",                      // platform\n       \".*mpfr_float_backend<18>.*\", // test type(s)\n       \"(?i).*medium.*\",             // test data group\n       \".*\", 20000, 1000);           // test function\n   add_expected_result(\n       \"[^|]*\",                     // compiler\n       \"[^|]*\",                     // stdlib\n       \"[^|]*\",                     // platform\n       \".*mpfr_float_backend<0>.*\", // test type(s)\n       \"(?i).*medium.*\",            // test data group\n       \".*\", 400, 100);             // test function\n   add_expected_result(\n       \"[^|]*\",         // compiler\n       \"[^|]*\",         // stdlib\n       \"[^|]*\",         // platform\n       \".*\",            // test type(s)\n       \"(?i).*small.*\", // test data group\n       \".*\", 90, 25);   // test function\n#ifdef BOOST_INTEL\n   add_expected_result(\n       \"[^|]*\",          // compiler\n       \"[^|]*\",          // stdlib\n       \"[^|]*\",          // platform\n       \"float128\",       // test type(s)\n       \"(?i).*medium.*\", // test data group\n       \".*\", 5000, 500); // test function\n#endif\n   add_expected_result(\n       \"[^|]*\",          // compiler\n       \"[^|]*\",          // stdlib\n       \"[^|]*\",          // platform\n       \".*\",             // test type(s)\n       \"(?i).*medium.*\", // test data group\n       \".*\", 220, 50);   // test function\n   add_expected_result(\n       \"[^|]*\",          // compiler\n       \"[^|]*\",          // stdlib\n       \"[^|]*\",          // platform\n       \".*\",             // test type(s)\n       \"(?i).*large.*\",  // test data group\n       \".*\", 5000, 500); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_beta(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_ibeta_3.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#define TEST_DATA 3\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_ibeta.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \"[^|]*\",         // compiler\n       \"[^|]*\",         // stdlib\n       \"[^|]*\",         // platform\n       \".*\",            // test type(s)\n       \"(?i).*small.*\", // test data group\n       \".*\", 90, 25);   // test function\n   add_expected_result(\n       \"[^|]*\",          // compiler\n       \"[^|]*\",          // stdlib\n       \"[^|]*\",          // platform\n       \".*\",             // test type(s)\n       \"(?i).*medium.*\", // test data group\n       \".*\", 200, 50);   // test function\n   add_expected_result(\n       \"[^|]*\",                // compiler\n       \"[^|]*\",                // stdlib\n       \"[^|]*\",                // platform\n       \".*\",                   // test type(s)\n       \"(?i).*large.*\",        // test data group\n       \".*\", 6000000, 500000); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_beta(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_ibeta_4.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#define TEST_DATA 4\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_ibeta.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \"[^|]*\",           // compiler\n       \"[^|]*\",           // stdlib\n       \"[^|]*\",           // platform\n       \".*\",              // test type(s)\n       \"(?i).*small.*\",   // test data group\n       \".*\", 4000, 1000); // test function\n   add_expected_result(\n       \"[^|]*\",         // compiler\n       \"[^|]*\",         // stdlib\n       \"[^|]*\",         // platform\n       \".*\",            // test type(s)\n       \"(?i).*small.*\", // test data group\n       \".*\", 90, 25);   // test function\n   add_expected_result(\n       \"[^|]*\",          // compiler\n       \"[^|]*\",          // stdlib\n       \"[^|]*\",          // platform\n       \".*\",             // test type(s)\n       \"(?i).*medium.*\", // test data group\n       \".*\", 200, 50);   // test function\n   add_expected_result(\n       \"[^|]*\",          // compiler\n       \"[^|]*\",          // stdlib\n       \"[^|]*\",          // platform\n       \".*\",             // test type(s)\n       \"(?i).*large.*\",  // test data group\n       \".*\", 5000, 500); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_beta(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_ibeta_inv_1.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#define TEST_DATA 4\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_ibeta_inv.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",                        // compiler\n       \".*\",                        // stdlib\n       \".*\",                        // platform\n       \".*mpfr_float_backend<0>.*\", // test type(s)\n       \".*\",                        // test data group\n       \".*\", 20000000, 1000000);    // test function\n   add_expected_result(\n       \".*\",                     // compiler\n       \".*\",                     // stdlib\n       \".*\",                     // platform\n       \".*gmp_float<0>.*\",       // test type(s)\n       \".*\",                     // test data group\n       \".*\", 20000000, 1000000); // test function\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*mpfr_float_backend<18>.*\", // test type(s)\n       \".*\",                         // test data group\n       \".*\", 50000000, 7000000);     // test function\n   add_expected_result(\n       \".*\",                   // compiler\n       \".*\",                   // stdlib\n       \".*\",                   // platform\n       \".*\",                   // test type(s)\n       \".*\",                   // test data group\n       \".*\", 1000000, 100000); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_beta(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_SMALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_ibeta_inv_ab_4.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#define TEST_DATA 4\n#define FULL_TEST\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_ibeta_inv_ab.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",               // compiler\n       \".*\",               // stdlib\n       \".*\",               // platform\n       \".*\",               // test type(s)\n       \".*\",               // test data group\n       \".*\", 10000, 1000); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_beta(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_igamma.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_igamma.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",                       // compiler\n       \".*\",                       // stdlib\n       \".*\",                       // platform\n       \".*\",                       // test type(s)\n       \".*large.*\",                // test data group\n       \".*\", 20000000L, 1000000L); // test function\n   add_expected_result(\n       \".*\",              // compiler\n       \".*\",              // stdlib\n       \".*\",              // platform\n       \".*\",              // test type(s)\n       \".*\",              // test data group\n       \".*\", 7000, 2000); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_gamma(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_igamma_inv.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef TEST_MPF_50\n#define BOOST_MATH_MAX_ROOT_ITERATION_POLICY 250\n#endif\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_igamma_inv.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",                           // compiler\n       \".*\",                           // stdlib\n       \".*\",                           // platform\n       \".*gmp_float<18>.*\",            // test type(s)\n       \".*small.*\",                    // test data group\n       \".*\", 2000000000L, 300000000L); // test function\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*mpfr_float_backend<18>.*\", // test type(s)\n       \".*small.*\",                  // test data group\n       \".*\", 30000000L, 20000000L);  // test function\n   add_expected_result(\n       \".*\",                       // compiler\n       \".*\",                       // stdlib\n       \".*\",                       // platform\n       \".*\",                       // test type(s)\n       \".*small.*\",                // test data group\n       \".*\", 10000000L, 2500000L); // test function\n   add_expected_result(\n       \".*\",              // compiler\n       \".*\",              // stdlib\n       \".*\",              // platform\n       \".*\",              // test type(s)\n       \".*\",              // test data group\n       \".*\", 7000, 2000); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_gamma(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_igamma_inva.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_igamma_inva.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",              // compiler\n       \".*\",              // stdlib\n       \".*\",              // platform\n       \".*\",              // test type(s)\n       \".*\",              // test data group\n       \".*\", 7000, 2000); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_gamma(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_laguerre.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_laguerre.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",             // compiler\n       \".*\",             // stdlib\n       \".*\",             // platform\n       \".*\",             // test type(s)\n       \".*\",             // test data group\n       \".*\", 7500, 500); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_laguerre(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_legendre.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_legendre.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",             // compiler\n       \".*\",             // stdlib\n       \".*\",             // platform\n       \".*\",             // test type(s)\n       \".*\",             // test data group\n       \".*\", 6000, 500); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_legendre_p(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_tgamma_ratio.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_tgamma_ratio.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",                // compiler\n       \".*\",                // stdlib\n       \".*\",                // platform\n       \".*gmp_float<18>.*\", // test type(s)\n       \".*\",                // test data group\n       \".*\", 4000, 2000);   // test function\n   add_expected_result(\n       \".*\",                         // compiler\n       \".*\",                         // stdlib\n       \".*\",                         // platform\n       \".*mpfr_float_backend<18>.*\", // test type(s)\n       \".*\",                         // test data group\n       \".*\", 20000, 7000);           // test function\n   add_expected_result(\n       \".*\",             // compiler\n       \".*\",             // stdlib\n       \".*\",             // platform\n       \".*\",             // test type(s)\n       \".*\",             // test data group\n       \".*\", 2000, 500); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_tgamma_ratio(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/math/test_zeta.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include \"setup.hpp\"\n#include \"table_type.hpp\"\n#define TEST_UDT\n\n#include <boost/math/special_functions/math_fwd.hpp>\n#include \"libs/math/test/test_zeta.hpp\"\n\nvoid expected_results()\n{\n   //\n   // Define the max and mean errors expected for\n   // various compilers and platforms.\n   //\n   add_expected_result(\n       \".*\",                          // compiler\n       \".*\",                          // stdlib\n       \".*\",                          // platform\n       \".*\",                          // test type(s)\n       \".*Random values less than 1\", // test data group\n       \".*\", 6000, 3000);             // test function\n#ifdef BOOST_INTEL\n   add_expected_result(\n       \".*\",                           // compiler\n       \".*\",                           // stdlib\n       \".*\",                           // platform\n       \"float128\",                     // test type(s)\n       \".*close to and less than 1.*\", // test data group\n       \".*\", 10000000L, 2000000L);     // test function\n#endif\n   add_expected_result(\n       \".*\",             // compiler\n       \".*\",             // stdlib\n       \".*\",             // platform\n       \".*\",             // test type(s)\n       \".*\",             // test data group\n       \".*\", 1000, 200); // test function\n   //\n   // Finish off by printing out the compiler/stdlib/platform names,\n   // we do this to make it easier to mark up expected error rates.\n   //\n   std::cout << \"Tests run with \" << BOOST_COMPILER << \", \"\n             << BOOST_STDLIB << \", \" << BOOST_PLATFORM << std::endl;\n}\n\ntemplate <class T>\nvoid test(T t, const char* p)\n{\n   test_zeta(t, p);\n}\n\nBOOST_AUTO_TEST_CASE(test_main)\n{\n   using namespace boost::multiprecision;\n   expected_results();\n   //\n   // Test at:\n   //  9 decimal digits: tests the least wide arbitrary precision code\n   // 18 decimal digits: tests 80-bit long double approximations\n   // 30 decimal digits: tests 128-bit long double approximations\n   // 35 decimal digits: tests arbitrary precision code\n   //\n   ALL_TESTS\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/no_eh_test_support.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2016 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/throw_exception.hpp>\n#include <boost/config.hpp>\n\n#ifdef BOOST_NO_EXCEPTIONS\n\n#include <iostream>\n#include <iomanip>\n\nnamespace boost {\n\nvoid throw_exception(std::exception const& e)\n{\n   std::cerr << \"Terminating with exception: \" << e.what() << std::endl;\n}\n\n} // namespace boost\n\n#else\n\nnamespace boost { namespace detail {\nvoid dummy_proc() {}\n}} // namespace boost::detail\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/serial_txts/boost-no-inspect",
    "content": ""
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/serial_txts/cpp_int1024_serial32.txt",
    "content": "22 serialization::archive 10 0 0 0 0 0 108 240 216 207 212 25 178 183 244 196 236 95 147 174 198 156 135 30 192 249 71 150 58 81 90 83 157 31 192 97 218 61 242 6 92 59 181 100 93 130 250 188 246 144 44 168 35 244 193 47 12 158 190 153 204 174 128 206 100 236 32 18 126 89 123 194 22 35 211 231 76 148 27 235 109 5 183 33 227 88 207 58 215 251 252 155 139 128 94 102 109 67 113 84 50 31 117 129 72 215 77 164 152 225 243 6 0 0 0 1 108 240 216 207 212 25 178 183 244 196 236 95 147 174 198 156 135 30 192 249 71 150 58 81 90 83 157 31 192 97 218 61 242 6 92 59 181 100 93 130 250 188 246 144 44 168 35 244 193 47 12 158 190 153 204 174 128 206 100 236 32 18 126 89 123 194 22 35 211 231 76 148 27 235 109 5 183 33 227 88 207 58 215 251 252 155 139 128 94 102 109 67 113 84 50 31 117 129 72 215 77 164 152 225 243 6 0 0 0 0 20 233 110 98 40 22 77 153 193 59 146 80 175 250 132 156 155 86 10 0 0 1 20 233 110 98 40 22 77 153 193 59 146 80 175 250 132 156 155 86 10 0 0 0 116 195 197 234 211 167 46 136 167 128 33 88 13 108 237 91 62 12 92 69 154 204 29 67 225 108 76 250 33 86 106 195 35 211 56 231 162 75 128 234 92 136 184 82 7 210 243 108 153 53 77 201 114 146 101 203 238 16 127 62 157 89 147 7 159 33 49 73 121 45 71 184 101 48 57 231 136 53 32 117 91 72 53 49 149 132 120 220 38 202 141 199 61 152 225 162 88 241 96 97 235 194 95 106 102 77 171 141 79 25 171 118 0 150 152 162 225 1 116 195 197 234 211 167 46 136 167 128 33 88 13 108 237 91 62 12 92 69 154 204 29 67 225 108 76 250 33 86 106 195 35 211 56 231 162 75 128 234 92 136 184 82 7 210 243 108 153 53 77 201 114 146 101 203 238 16 127 62 157 89 147 7 159 33 49 73 121 45 71 184 101 48 57 231 136 53 32 117 91 72 53 49 149 132 120 220 38 202 141 199 61 152 225 162 88 241 96 97 235 194 95 106 102 77 171 141 79 25 171 118 0 150 152 162 225 0 108 52 251 142 48 154 38 230 245 135 197 116 187 16 93 121 73 166 67 73 14 108 247 153 173 155 1 1 27 39 117 50 208 104 14 143 42 205 185 79 111 156 236 127 179 134 12 211 3 186 248 224 18 111 115 8 241 120 193 95 162 144 223 81 125 100 15 75 159 151 135 167 7 105 70 42 112 187 150 50 81 238 10 88 7 185 247 8 238 5 251 173 132 245 18 238 209 93 5 153 183 17 250 77 56 125 31 2 0 1 108 52 251 142 48 154 38 230 245 135 197 116 187 16 93 121 73 166 67 73 14 108 247 153 173 155 1 1 27 39 117 50 208 104 14 143 42 205 185 79 111 156 236 127 179 134 12 211 3 186 248 224 18 111 115 8 241 120 193 95 162 144 223 81 125 100 15 75 159 151 135 167 7 105 70 42 112 187 150 50 81 238 10 88 7 185 247 8 238 5 251 173 132 245 18 238 209 93 5 153 183 17 250 77 56 125 31 2 0 0 20 197 207 215 162 39 250 228 2 55 205 156 2 210 250 185 127 9 0 0 0 1 20 197 207 215 162 39 250 228 2 55 205 156 2 210 250 185 127 9 0 0 0 0 124 24 227 82 233 197 174 88 134 19 71 12 155 49 99 207 184 189 139 213 148 142 65 83 22 86 59 113 20 118 242 15 207 165 34 25 223 113 59 30 140 39 47 19 17 91 233 70 193 187 55 81 125 94 114 235 6 80 26 251 206 129 223 96 50 3 188 107 248 74 130 151 7 40 68 162 241 8 76 185 168 192 189 109 17 104 12 100 42 186 31 15 28 113 72 249 213 10 120 161 189 54 95 145 140 93 52 223 83 153 80 25 250 68 102 71 63 122 51 3 222 201 139 253 189 1 124 24 227 82 233 197 174 88 134 19 71 12 155 49 99 207 184 189 139 213 148 142 65 83 22 86 59 113 20 118 242 15 207 165 34 25 223 113 59 30 140 39 47 19 17 91 233 70 193 187 55 81 125 94 114 235 6 80 26 251 206 129 223 96 50 3 188 107 248 74 130 151 7 40 68 162 241 8 76 185 168 192 189 109 17 104 12 100 42 186 31 15 28 113 72 249 213 10 120 161 189 54 95 145 140 93 52 223 83 153 80 25 250 68 102 71 63 122 51 3 222 201 139 253 189 0 120 84 215 85 155 83 224 217 17 152 203 112 82 122 193 196 197 212 174 168 135 168 249 185 103 45 35 64 229 91 250 210 186 58 210 182 98 118 15 126 35 18 69 254 92 98 253 202 81 186 80 212 23 15 9 32 39 1 22 16 116 63 86 191 203 58 113 189 250 81 8 87 78 224 55 184 247 69 246 57 99 3 71 4 32 58 206 214 203 112 60 52 83 234 29 3 197 37 251 251 84 166 130 63 190 142 0 143 110 160 134 104 117 192 171 252 58 243 0 0 0 1 120 84 215 85 155 83 224 217 17 152 203 112 82 122 193 196 197 212 174 168 135 168 249 185 103 45 35 64 229 91 250 210 186 58 210 182 98 118 15 126 35 18 69 254 92 98 253 202 81 186 80 212 23 15 9 32 39 1 22 16 116 63 86 191 203 58 113 189 250 81 8 87 78 224 55 184 247 69 246 57 99 3 71 4 32 58 206 214 203 112 60 52 83 234 29 3 197 37 251 251 84 166 130 63 190 142 0 143 110 160 134 104 117 192 171 252 58 243 0 0 0 0 32 75 106 211 223 67 33 39 159 137 42 62 13 132 4 148 172 13 129 231 52 23 5 189 177 132 71 127 112 12 0 0 0 1 32 75 106 211 223 67 33 39 159 137 42 62 13 132 4 148 172 13 129 231 52 23 5 189 177 132 71 127 112 12 0 0 0 0 84 71 66 188 102 218 45 89 79 100 203 161 190 29 126 44 173 44 86 244 243 53 45 157 176 5 233 73 112 206 44 106 109 159 71 109 87 77 104 184 44 147 80 22 206 180 74 221 169 143 209 179 215 195 26 222 89 28 178 48 206 169 22 229 44 34 14 33 215 159 185 161 56 150 95 20 128 199 66 223 66 113 0 0 0 1 84 71 66 188 102 218 45 89 79 100 203 161 190 29 126 44 173 44 86 244 243 53 45 157 176 5 233 73 112 206 44 106 109 159 71 109 87 77 104 184 44 147 80 22 206 180 74 221 169 143 209 179 215 195 26 222 89 28 178 48 206 169 22 229 44 34 14 33 215 159 185 161 56 150 95 20 128 199 66 223 66 113 0 0 0 0 40 74 104 149 210 252 235 123 239 168 56 124 239 105 91 87 48 183 253 146 69 244 5 94 42 167 100 207 53 34 116 207 197 97 199 198 121 102 204 246 31 1 40 74 104 149 210 252 235 123 239 168 56 124 239 105 91 87 48 183 253 146 69 244 5 94 42 167 100 207 53 34 116 207 197 97 199 198 121 102 204 246 31 0 16 127 135 241 163 116 139 210 196 195 216 24 255 21 0 0 0 1 16 127 135 241 163 116 139 210 196 195 216 24 255 21 0 0 0 0 72 150 29 179 100 132 144 156 216 95 57 162 101 198 179 215 51 244 149 122 162 171 105 83 53 56 158 83 10 80 190 228 125 131 48 41 93 2 177 156 179 17 217 253 155 46 30 105 35 223 134 100 76 170 35 206 233 252 210 117 27 160 154 210 45 234 95 74 76 159 147 2 0 1 72 150 29 179 100 132 144 156 216 95 57 162 101 198 179 215 51 244 149 122 162 171 105 83 53 56 158 83 10 80 190 228 125 131 48 41 93 2 177 156 179 17 217 253 155 46 30 105 35 223 134 100 76 170 35 206 233 252 210 117 27 160 154 210 45 234 95 74 76 159 147 2 0 0 36 220 123 216 188 130 233 64 162 111 163 35 146 32 32 192 228 163 205 248 224 147 90 97 37 29 2 241 105 156 63 40 242 105 209 126 40 1 36 220 123 216 188 130 233 64 162 111 163 35 146 32 32 192 228 163 205 248 224 147 90 97 37 29 2 241 105 156 63 40 242 105 209 126 40 0 28 230 134 234 52 30 2 41 143 232 97 74 82 171 119 128 41 82 147 155 86 202 151 8 81 3 0 0 0 1 28 230 134 234 52 30 2 41 143 232 97 74 82 171 119 128 41 82 147 155 86 202 151 8 81 3 0 0 0 0 72 15 249 15 27 178 199 148 79 23 3 197 198 33 75 3 164 156 4 165 168 224 178 69 133 25 107 103 207 249 91 170 31 103 38 157 136 237 182 137 145 28 255 143 214 212 22 229 64 150 206 235 209 33 197 227 224 182 51 28 205 88 80 228 111 77 96 3 34 184 34 1 0 1 72 15 249 15 27 178 199 148 79 23 3 197 198 33 75 3 164 156 4 165 168 224 178 69 133 25 107 103 207 249 91 170 31 103 38 157 136 237 182 137 145 28 255 143 214 212 22 229 64 150 206 235 209 33 197 227 224 182 51 28 205 88 80 228 111 77 96 3 34 184 34 1 0 0 128 218 44 245 9 8 123 94 221 100 47 84 11 243 15 172 179 239 47 175 194 3 71 55 191 38 122 159 236 92 247 18 47 19 56 134 218 188 171 164 240 122 46 184 162 129 134 174 138 64 233 80 170 255 199 102 146 231 63 160 16 196 95 226 19 153 123 117 200 46 233 120 129 83 125 132 105 126 85 36 229 17 65 127 187 245 154 8 240 255 6 80 120 99 170 69 125 132 67 244 85 139 199 7 155 182 253 26 132 174 228 45 164 121 122 120 13 138 138 103 108 205 110 58 205 79 100 212 0 1 128 218 44 245 9 8 123 94 221 100 47 84 11 243 15 172 179 239 47 175 194 3 71 55 191 38 122 159 236 92 247 18 47 19 56 134 218 188 171 164 240 122 46 184 162 129 134 174 138 64 233 80 170 255 199 102 146 231 63 160 16 196 95 226 19 153 123 117 200 46 233 120 129 83 125 132 105 126 85 36 229 17 65 127 187 245 154 8 240 255 6 80 120 99 170 69 125 132 67 244 85 139 199 7 155 182 253 26 132 174 228 45 164 121 122 120 13 138 138 103 108 205 110 58 205 79 100 212 0 0 124 42 11 175 85 234 29 127 39 168 190 213 6 131 53 241 65 78 99 129 50 177 192 60 169 254 225 53 185 10 30 128 144 147 118 226 21 168 226 101 136 76 35 162 12 195 5 204 132 123 33 134 136 228 63 232 165 209 64 49 61 69 88 217 222 49 226 15 38 80 170 183 154 76 90 32 162 103 214 88 163 4 232 2 248 216 110 84 43 233 82 171 178 169 49 99 13 2 111 187 145 184 169 169 143 134 196 5 58 127 58 229 193 147 117 193 58 158 31 111 94 152 222 23 0 1 124 42 11 175 85 234 29 127 39 168 190 213 6 131 53 241 65 78 99 129 50 177 192 60 169 254 225 53 185 10 30 128 144 147 118 226 21 168 226 101 136 76 35 162 12 195 5 204 132 123 33 134 136 228 63 232 165 209 64 49 61 69 88 217 222 49 226 15 38 80 170 183 154 76 90 32 162 103 214 88 163 4 232 2 248 216 110 84 43 233 82 171 178 169 49 99 13 2 111 187 145 184 169 169 143 134 196 5 58 127 58 229 193 147 117 193 58 158 31 111 94 152 222 23 0 0 128 117 32 231 128 78 121 139 240 228 103 68 36 169 251 164 16 50 57 142 227 5 246 77 80 110 198 12 68 1 149 50 69 54 143 139 95 198 108 21 41 162 236 219 40 173 104 226 58 15 180 5 40 31 118 13 168 210 43 211 239 7 182 203 237 162 68 33 8 250 179 25 22 162 85 109 252 238 129 170 97 47 77 76 109 6 111 254 168 196 19 35 76 81 88 241 48 255 104 111 142 75 147 180 52 99 76 255 134 237 245 122 252 21 255 187 122 115 41 176 130 69 131 13 23 37 127 20 3 1 128 117 32 231 128 78 121 139 240 228 103 68 36 169 251 164 16 50 57 142 227 5 246 77 80 110 198 12 68 1 149 50 69 54 143 139 95 198 108 21 41 162 236 219 40 173 104 226 58 15 180 5 40 31 118 13 168 210 43 211 239 7 182 203 237 162 68 33 8 250 179 25 22 162 85 109 252 238 129 170 97 47 77 76 109 6 111 254 168 196 19 35 76 81 88 241 48 255 104 111 142 75 147 180 52 99 76 255 134 237 245 122 252 21 255 187 122 115 41 176 130 69 131 13 23 37 127 20 3 0 124 225 196 245 38 129 95 130 255 14 194 101 192 198 28 5 135 65 33 59 109 254 232 229 27 245 239 185 134 58 127 181 232 77 234 159 110 69 82 234 174 133 243 107 210 244 202 250 155 41 109 253 34 38 165 23 103 75 242 126 154 90 16 155 40 180 198 123 44 56 133 74 228 20 41 104 110 42 251 181 50 43 108 181 28 98 126 48 202 202 240 10 236 228 75 105 111 132 35 221 75 171 251 197 139 242 114 49 206 195 33 149 113 119 94 226 71 220 139 93 218 202 156 199 9 1 124 225 196 245 38 129 95 130 255 14 194 101 192 198 28 5 135 65 33 59 109 254 232 229 27 245 239 185 134 58 127 181 232 77 234 159 110 69 82 234 174 133 243 107 210 244 202 250 155 41 109 253 34 38 165 23 103 75 242 126 154 90 16 155 40 180 198 123 44 56 133 74 228 20 41 104 110 42 251 181 50 43 108 181 28 98 126 48 202 202 240 10 236 228 75 105 111 132 35 221 75 171 251 197 139 242 114 49 206 195 33 149 113 119 94 226 71 220 139 93 218 202 156 199 9 0 124 130 190 211 115 201 224 67 206 209 66 76 220 164 193 3 192 104 19 174 139 21 103 49 247 223 227 161 141 190 242 11 120 201 238 152 120 157 159 206 140 138 29 151 173 117 118 102 209 136 234 50 127 131 161 166 19 148 165 245 82 205 11 104 226 229 91 148 136 10 234 81 120 171 169 131 54 235 207 59 211 127 77 24 204 157 197 253 233 237 199 174 3 72 33 142 5 218 73 26 111 135 205 112 166 233 98 13 15 33 27 131 103 119 191 23 179 123 179 24 99 136 111 206 103 1 124 130 190 211 115 201 224 67 206 209 66 76 220 164 193 3 192 104 19 174 139 21 103 49 247 223 227 161 141 190 242 11 120 201 238 152 120 157 159 206 140 138 29 151 173 117 118 102 209 136 234 50 127 131 161 166 19 148 165 245 82 205 11 104 226 229 91 148 136 10 234 81 120 171 169 131 54 235 207 59 211 127 77 24 204 157 197 253 233 237 199 174 3 72 33 142 5 218 73 26 111 135 205 112 166 233 98 13 15 33 27 131 103 119 191 23 179 123 179 24 99 136 111 206 103 0 24 236 146 150 122 80 138 70 55 218 171 50 71 53 136 214 55 85 125 93 128 4 0 0 0 1 24 236 146 150 122 80 138 70 55 218 171 50 71 53 136 214 55 85 125 93 128 4 0 0 0 0 96 168 120 24 52 192 139 221 73 242 242 97 74 214 206 178 206 134 205 255 80 249 81 103 62 255 235 105 87 255 215 122 234 6 85 194 142 4 80 39 228 210 83 78 57 126 13 175 79 207 117 247 77 43 53 164 8 185 89 108 206 201 3 63 111 26 179 169 0 252 20 51 5 213 56 133 204 63 19 45 245 58 168 12 87 82 182 175 2 1 111 83 252 59 0 0 0 1 96 168 120 24 52 192 139 221 73 242 242 97 74 214 206 178 206 134 205 255 80 249 81 103 62 255 235 105 87 255 215 122 234 6 85 194 142 4 80 39 228 210 83 78 57 126 13 175 79 207 117 247 77 43 53 164 8 185 89 108 206 201 3 63 111 26 179 169 0 252 20 51 5 213 56 133 204 63 19 45 245 58 168 12 87 82 182 175 2 1 111 83 252 59 0 0 0 0 128 185 132 187 44 241 228 100 105 22 119 238 94 124 126 113 117 10 214 51 133 149 172 201 211 213 121 160 34 164 142 116 97 112 84 155 255 6 108 94 78 4 233 188 142 66 190 97 40 135 40 45 103 104 89 35 225 9 229 254 125 210 134 186 83 219 39 156 96 79 116 202 44 226 193 33 197 237 19 205 187 104 142 222 208 110 38 156 236 173 194 237 92 12 94 102 228 230 145 128 127 23 155 108 123 159 28 189 122 77 188 51 141 193 44 74 135 72 161 176 196 25 238 215 249 1 0 0 0 1 128 185 132 187 44 241 228 100 105 22 119 238 94 124 126 113 117 10 214 51 133 149 172 201 211 213 121 160 34 164 142 116 97 112 84 155 255 6 108 94 78 4 233 188 142 66 190 97 40 135 40 45 103 104 89 35 225 9 229 254 125 210 134 186 83 219 39 156 96 79 116 202 44 226 193 33 197 237 19 205 187 104 142 222 208 110 38 156 236 173 194 237 92 12 94 102 228 230 145 128 127 23 155 108 123 159 28 189 122 77 188 51 141 193 44 74 135 72 161 176 196 25 238 215 249 1 0 0 0 0 128 196 189 1 242 155 244 232 152 101 227 3 217 39 244 236 150 9 178 16 175 212 22 120 54 105 227 225 242 229 156 121 86 139 227 54 127 184 190 41 133 3 17 52 18 138 148 221 246 233 48 84 88 59 192 24 21 252 227 123 179 109 113 77 255 247 152 43 152 181 143 190 106 157 133 109 3 97 155 223 142 24 220 123 209 115 48 134 39 181 47 225 199 64 0 47 19 50 112 64 18 160 79 199 188 82 123 15 244 22 146 43 21 149 157 118 9 188 127 178 30 174 37 125 174 1 17 0 0 1 128 196 189 1 242 155 244 232 152 101 227 3 217 39 244 236 150 9 178 16 175 212 22 120 54 105 227 225 242 229 156 121 86 139 227 54 127 184 190 41 133 3 17 52 18 138 148 221 246 233 48 84 88 59 192 24 21 252 227 123 179 109 113 77 255 247 152 43 152 181 143 190 106 157 133 109 3 97 155 223 142 24 220 123 209 115 48 134 39 181 47 225 199 64 0 47 19 50 112 64 18 160 79 199 188 82 123 15 244 22 146 43 21 149 157 118 9 188 127 178 30 174 37 125 174 1 17 0 0 0 124 125 72 103 215 83 251 97 191 63 231 211 75 247 3 48 39 242 99 75 38 207 10 64 114 118 90 122 122 77 183 190 7 147 103 181 244 49 65 243 162 67 68 8 208 134 116 48 95 95 233 35 252 112 16 102 203 11 124 40 193 161 239 28 210 11 139 204 89 203 38 245 182 150 96 26 18 46 113 77 175 20 177 91 174 135 42 135 219 19 174 215 57 19 213 152 24 76 23 175 160 29 5 177 176 24 219 163 255 97 214 199 54 191 77 15 45 73 191 156 156 85 231 7 0 1 124 125 72 103 215 83 251 97 191 63 231 211 75 247 3 48 39 242 99 75 38 207 10 64 114 118 90 122 122 77 183 190 7 147 103 181 244 49 65 243 162 67 68 8 208 134 116 48 95 95 233 35 252 112 16 102 203 11 124 40 193 161 239 28 210 11 139 204 89 203 38 245 182 150 96 26 18 46 113 77 175 20 177 91 174 135 42 135 219 19 174 215 57 19 213 152 24 76 23 175 160 29 5 177 176 24 219 163 255 97 214 199 54 191 77 15 45 73 191 156 156 85 231 7 0 0 16 252 17 170 79 122 224 151 223 165 53 141 155 37 87 4 0 1 16 252 17 170 79 122 224 151 223 165 53 141 155 37 87 4 0 0 64 137 35 96 204 136 177 189 143 1 212 169 28 91 106 152 238 147 179 84 155 35 195 77 99 22 143 175 243 178 108 188 125 52 89 146 208 125 21 94 228 98 194 201 165 96 57 144 208 56 103 133 48 45 120 4 182 247 48 112 89 188 153 1 0 1 64 137 35 96 204 136 177 189 143 1 212 169 28 91 106 152 238 147 179 84 155 35 195 77 99 22 143 175 243 178 108 188 125 52 89 146 208 125 21 94 228 98 194 201 165 96 57 144 208 56 103 133 48 45 120 4 182 247 48 112 89 188 153 1 0 0 104 243 59 23 181 19 206 54 217 4 43 183 169 25 245 43 129 181 198 110 56 213 123 240 160 71 185 170 96 174 21 188 158 209 73 67 245 248 18 139 233 181 53 185 30 209 172 198 74 139 145 21 133 168 4 186 236 48 15 19 25 234 227 177 154 240 64 215 74 77 178 193 160 155 223 234 55 201 144 185 140 71 87 18 218 192 168 98 86 67 205 126 50 211 88 59 69 53 208 210 119 1 82 1 0 1 104 243 59 23 181 19 206 54 217 4 43 183 169 25 245 43 129 181 198 110 56 213 123 240 160 71 185 170 96 174 21 188 158 209 73 67 245 248 18 139 233 181 53 185 30 209 172 198 74 139 145 21 133 168 4 186 236 48 15 19 25 234 227 177 154 240 64 215 74 77 178 193 160 155 223 234 55 201 144 185 140 71 87 18 218 192 168 98 86 67 205 126 50 211 88 59 69 53 208 210 119 1 82 1 0 0 104 30 237 199 208 43 126 134 188 221 77 44 64 109 31 47 206 70 172 101 140 66 232 0 138 101 218 81 243 45 157 119 221 30 64 253 209 50 12 45 150 152 200 9 167 220 210 114 70 151 149 141 34 162 151 188 82 189 246 149 204 99 143 240 240 11 119 55 107 27 196 176 61 52 227 44 160 102 215 226 28 36 252 136 5 162 100 95 194 183 2 28 199 117 193 177 41 170 115 62 93 181 186 1 0 1 104 30 237 199 208 43 126 134 188 221 77 44 64 109 31 47 206 70 172 101 140 66 232 0 138 101 218 81 243 45 157 119 221 30 64 253 209 50 12 45 150 152 200 9 167 220 210 114 70 151 149 141 34 162 151 188 82 189 246 149 204 99 143 240 240 11 119 55 107 27 196 176 61 52 227 44 160 102 215 226 28 36 252 136 5 162 100 95 194 183 2 28 199 117 193 177 41 170 115 62 93 181 186 1 0 0 40 53 120 130 161 159 72 98 85 190 182 236 225 240 60 214 46 141 103 182 195 63 222 96 51 133 198 58 90 110 132 208 137 203 153 172 98 79 220 0 0 1 40 53 120 130 161 159 72 98 85 190 182 236 225 240 60 214 46 141 103 182 195 63 222 96 51 133 198 58 90 110 132 208 137 203 153 172 98 79 220 0 0 0 20 118 29 12 161 58 173 221 244 97 16 129 132 213 223 100 52 220 195 7 0 1 20 118 29 12 161 58 173 221 244 97 16 129 132 213 223 100 52 220 195 7 0 0 4 48 0 0 0 1 4 48 0 0 0 0 56 231 92 254 163 124 164 150 140 111 46 208 48 245 131 79 191 167 93 72 251 225 197 183 198 127 122 236 47 16 214 74 14 201 193 171 20 118 155 238 33 155 90 192 58 99 154 59 127 53 8 120 227 43 170 1 0 1 56 231 92 254 163 124 164 150 140 111 46 208 48 245 131 79 191 167 93 72 251 225 197 183 198 127 122 236 47 16 214 74 14 201 193 171 20 118 155 238 33 155 90 192 58 99 154 59 127 53 8 120 227 43 170 1 0 0 16 251 177 154 124 124 51 12 184 170 246 21 206 136 0 6 0 1 16 251 177 154 124 124 51 12 184 170 246 21 206 136 0 6 0 0 120 135 228 154 97 97 37 218 64 185 90 19 175 246 80 210 161 113 157 100 67 139 11 67 170 100 55 10 137 62 200 98 216 164 1 43 71 31 156 64 144 57 219 81 105 211 65 2 203 127 45 87 116 177 120 38 220 221 127 219 9 89 68 112 249 96 102 183 83 157 239 104 243 95 199 142 2 33 66 225 186 67 111 177 72 133 48 17 239 26 98 202 8 125 61 65 118 6 55 147 154 167 90 0 162 128 74 17 187 146 174 37 228 190 12 117 100 32 3 0 0 1 120 135 228 154 97 97 37 218 64 185 90 19 175 246 80 210 161 113 157 100 67 139 11 67 170 100 55 10 137 62 200 98 216 164 1 43 71 31 156 64 144 57 219 81 105 211 65 2 203 127 45 87 116 177 120 38 220 221 127 219 9 89 68 112 249 96 102 183 83 157 239 104 243 95 199 142 2 33 66 225 186 67 111 177 72 133 48 17 239 26 98 202 8 125 61 65 118 6 55 147 154 167 90 0 162 128 74 17 187 146 174 37 228 190 12 117 100 32 3 0 0 0 84 26 161 163 242 118 221 0 66 192 252 133 199 57 227 98 231 11 157 63 23 214 37 26 128 100 49 131 94 235 250 249 147 154 51 50 25 98 235 243 5 108 187 118 252 12 79 151 103 7 110 124 8 167 181 214 104 91 65 119 78 66 98 82 217 239 238 114 229 245 1 243 155 98 149 133 248 106 172 101 16 223 244 0 0 1 84 26 161 163 242 118 221 0 66 192 252 133 199 57 227 98 231 11 157 63 23 214 37 26 128 100 49 131 94 235 250 249 147 154 51 50 25 98 235 243 5 108 187 118 252 12 79 151 103 7 110 124 8 167 181 214 104 91 65 119 78 66 98 82 217 239 238 114 229 245 1 243 155 98 149 133 248 106 172 101 16 223 244 0 0 0 104 51 242 193 71 40 33 244 183 39 87 209 231 123 23 102 244 164 169 195 247 118 193 238 212 202 61 62 28 173 71 226 3 123 32 247 24 21 127 54 196 17 12 180 107 10 66 175 208 88 113 145 18 93 77 231 82 5 172 142 122 173 202 80 213 151 67 189 246 154 57 40 60 62 225 173 49 197 99 197 109 106 160 126 116 179 205 235 122 139 21 129 249 231 216 211 119 4 117 66 52 193 10 0 0 1 104 51 242 193 71 40 33 244 183 39 87 209 231 123 23 102 244 164 169 195 247 118 193 238 212 202 61 62 28 173 71 226 3 123 32 247 24 21 127 54 196 17 12 180 107 10 66 175 208 88 113 145 18 93 77 231 82 5 172 142 122 173 202 80 213 151 67 189 246 154 57 40 60 62 225 173 49 197 99 197 109 106 160 126 116 179 205 235 122 139 21 129 249 231 216 211 119 4 117 66 52 193 10 0 0 0 116 117 133 12 7 22 147 126 60 222 126 15 234 208 110 144 185 13 98 7 11 209 57 121 79 194 58 253 148 206 85 251 165 5 213 112 244 92 244 25 196 40 68 91 10 147 74 13 72 165 3 119 45 32 170 129 46 133 146 166 13 69 50 36 228 124 251 190 233 4 155 225 95 178 231 135 226 223 143 88 24 162 178 240 101 140 125 124 184 151 110 254 193 242 30 230 88 55 219 178 42 54 111 9 248 91 46 181 248 183 164 152 211 7 0 0 0 1 116 117 133 12 7 22 147 126 60 222 126 15 234 208 110 144 185 13 98 7 11 209 57 121 79 194 58 253 148 206 85 251 165 5 213 112 244 92 244 25 196 40 68 91 10 147 74 13 72 165 3 119 45 32 170 129 46 133 146 166 13 69 50 36 228 124 251 190 233 4 155 225 95 178 231 135 226 223 143 88 24 162 178 240 101 140 125 124 184 151 110 254 193 242 30 230 88 55 219 178 42 54 111 9 248 91 46 181 248 183 164 152 211 7 0 0 0 0 124 63 77 192 16 39 116 41 118 84 43 197 253 236 106 62 1 183 234 241 28 170 49 21 191 231 212 161 33 61 235 39 160 228 125 57 52 78 189 69 47 1 79 177 75 103 238 153 2 38 182 148 88 116 210 38 64 96 188 136 248 75 74 182 169 213 110 205 104 170 28 203 171 146 250 72 188 184 135 129 123 246 18 94 241 239 179 131 133 192 152 204 226 228 3 166 119 222 138 54 116 129 186 64 160 210 30 139 163 195 186 2 85 155 194 170 83 132 36 74 216 27 254 85 0 1 124 63 77 192 16 39 116 41 118 84 43 197 253 236 106 62 1 183 234 241 28 170 49 21 191 231 212 161 33 61 235 39 160 228 125 57 52 78 189 69 47 1 79 177 75 103 238 153 2 38 182 148 88 116 210 38 64 96 188 136 248 75 74 182 169 213 110 205 104 170 28 203 171 146 250 72 188 184 135 129 123 246 18 94 241 239 179 131 133 192 152 204 226 228 3 166 119 222 138 54 116 129 186 64 160 210 30 139 163 195 186 2 85 155 194 170 83 132 36 74 216 27 254 85 0 0 68 216 172 85 194 158 216 82 110 65 133 85 128 49 103 72 173 54 61 199 26 210 206 103 163 37 220 221 193 233 238 254 54 206 213 124 6 203 165 26 21 241 141 165 246 128 184 43 72 242 66 159 97 79 134 33 147 97 136 247 186 217 103 81 199 29 0 0 0 1 68 216 172 85 194 158 216 82 110 65 133 85 128 49 103 72 173 54 61 199 26 210 206 103 163 37 220 221 193 233 238 254 54 206 213 124 6 203 165 26 21 241 141 165 246 128 184 43 72 242 66 159 97 79 134 33 147 97 136 247 186 217 103 81 199 29 0 0 0 0 88 198 204 237 247 146 195 97 49 165 23 187 22 34 150 126 136 183 220 165 82 194 13 172 190 161 249 20 192 177 147 243 49 113 56 111 194 238 6 98 97 129 35 110 42 246 44 179 219 221 190 182 94 40 254 25 246 171 109 11 181 1 138 90 3 209 233 133 179 57 67 179 0 223 103 18 74 138 136 231 35 199 161 29 157 1 0 0 0 1 88 198 204 237 247 146 195 97 49 165 23 187 22 34 150 126 136 183 220 165 82 194 13 172 190 161 249 20 192 177 147 243 49 113 56 111 194 238 6 98 97 129 35 110 42 246 44 179 219 221 190 182 94 40 254 25 246 171 109 11 181 1 138 90 3 209 233 133 179 57 67 179 0 223 103 18 74 138 136 231 35 199 161 29 157 1 0 0 0 0 104 200 111 223 113 76 183 17 189 185 203 122 115 218 100 205 191 105 223 132 140 147 126 199 180 195 206 12 73 110 39 71 147 85 229 115 193 236 45 39 98 81 104 24 231 243 122 80 84 171 200 163 28 188 108 159 81 0 102 179 40 112 195 41 169 248 78 181 155 111 130 188 233 129 78 9 71 59 223 40 71 154 214 88 94 144 232 156 144 221 110 76 114 52 34 145 84 178 218 142 15 103 173 3 0 1 104 200 111 223 113 76 183 17 189 185 203 122 115 218 100 205 191 105 223 132 140 147 126 199 180 195 206 12 73 110 39 71 147 85 229 115 193 236 45 39 98 81 104 24 231 243 122 80 84 171 200 163 28 188 108 159 81 0 102 179 40 112 195 41 169 248 78 181 155 111 130 188 233 129 78 9 71 59 223 40 71 154 214 88 94 144 232 156 144 221 110 76 114 52 34 145 84 178 218 142 15 103 173 3 0 0 8 177 137 11 132 66 0 0 0 1 8 177 137 11 132 66 0 0 0 0 48 33 167 44 60 43 5 212 10 233 199 142 141 206 188 38 153 75 245 28 138 78 90 196 228 196 226 63 171 99 123 61 129 93 169 246 14 54 98 199 66 102 119 74 122 163 104 13 0 1 48 33 167 44 60 43 5 212 10 233 199 142 141 206 188 38 153 75 245 28 138 78 90 196 228 196 226 63 171 99 123 61 129 93 169 246 14 54 98 199 66 102 119 74 122 163 104 13 0 0 112 13 142 178 152 223 193 158 172 255 203 197 100 76 79 42 99 97 196 198 42 60 211 249 142 174 154 123 158 254 134 251 235 151 207 55 209 178 137 7 234 137 81 211 255 191 135 78 179 11 30 121 13 152 88 34 61 56 32 249 153 111 6 135 83 62 197 83 191 163 251 20 161 116 248 36 161 123 44 251 45 216 82 212 120 237 125 134 142 89 7 182 228 191 54 121 104 50 110 8 142 248 42 214 76 253 13 190 143 50 0 0 0 1 112 13 142 178 152 223 193 158 172 255 203 197 100 76 79 42 99 97 196 198 42 60 211 249 142 174 154 123 158 254 134 251 235 151 207 55 209 178 137 7 234 137 81 211 255 191 135 78 179 11 30 121 13 152 88 34 61 56 32 249 153 111 6 135 83 62 197 83 191 163 251 20 161 116 248 36 161 123 44 251 45 216 82 212 120 237 125 134 142 89 7 182 228 191 54 121 104 50 110 8 142 248 42 214 76 253 13 190 143 50 0 0 0 0 28 135 115 67 224 57 26 67 50 161 116 97 239 175 143 9 168 232 95 142 29 48 16 121 194 48 241 158 6 1 28 135 115 67 224 57 26 67 50 161 116 97 239 175 143 9 168 232 95 142 29 48 16 121 194 48 241 158 6 0 120 179 69 194 42 93 120 64 237 75 176 251 199 63 49 12 217 68 117 60 17 14 70 160 57 29 60 226 156 164 120 98 6 241 147 20 139 159 7 106 210 46 18 44 209 147 45 254 121 230 97 80 19 35 222 34 109 179 236 84 205 123 213 217 33 100 118 217 223 98 205 210 213 162 16 151 66 225 173 235 73 110 112 76 172 232 124 30 64 29 119 3 178 184 119 33 176 53 248 40 157 126 127 125 242 209 202 221 233 124 59 53 81 231 151 52 49 122 224 122 27 1 120 179 69 194 42 93 120 64 237 75 176 251 199 63 49 12 217 68 117 60 17 14 70 160 57 29 60 226 156 164 120 98 6 241 147 20 139 159 7 106 210 46 18 44 209 147 45 254 121 230 97 80 19 35 222 34 109 179 236 84 205 123 213 217 33 100 118 217 223 98 205 210 213 162 16 151 66 225 173 235 73 110 112 76 172 232 124 30 64 29 119 3 178 184 119 33 176 53 248 40 157 126 127 125 242 209 202 221 233 124 59 53 81 231 151 52 49 122 224 122 27 0 88 202 249 247 72 190 100 43 14 53 119 130 14 137 197 240 200 81 190 103 225 158 134 179 33 43 177 147 126 191 141 162 245 224 193 132 144 147 134 16 189 234 157 212 246 176 172 112 191 110 66 141 195 94 234 133 171 20 190 248 55 25 132 147 148 135 183 201 74 89 229 183 214 200 16 91 233 10 37 163 27 133 153 134 93 213 152 142 7 1 88 202 249 247 72 190 100 43 14 53 119 130 14 137 197 240 200 81 190 103 225 158 134 179 33 43 177 147 126 191 141 162 245 224 193 132 144 147 134 16 189 234 157 212 246 176 172 112 191 110 66 141 195 94 234 133 171 20 190 248 55 25 132 147 148 135 183 201 74 89 229 183 214 200 16 91 233 10 37 163 27 133 153 134 93 213 152 142 7 0 88 77 103 16 15 148 98 115 149 166 118 218 10 199 232 124 175 175 165 211 217 182 127 122 39 230 51 107 111 80 51 18 145 177 162 46 2 119 80 163 33 253 187 253 121 34 222 134 85 8 230 102 107 120 117 240 151 81 89 38 47 90 107 129 149 16 144 78 38 26 58 78 61 163 182 119 241 129 192 139 249 183 46 39 109 17 15 240 0 1 88 77 103 16 15 148 98 115 149 166 118 218 10 199 232 124 175 175 165 211 217 182 127 122 39 230 51 107 111 80 51 18 145 177 162 46 2 119 80 163 33 253 187 253 121 34 222 134 85 8 230 102 107 120 117 240 151 81 89 38 47 90 107 129 149 16 144 78 38 26 58 78 61 163 182 119 241 129 192 139 249 183 46 39 109 17 15 240 0 0 52 234 213 76 110 121 53 109 162 71 58 96 120 32 67 142 4 161 13 37 85 104 226 206 115 224 160 35 117 179 108 202 225 198 59 157 91 182 20 254 20 5 196 54 221 64 27 198 127 155 96 99 2 1 52 234 213 76 110 121 53 109 162 71 58 96 120 32 67 142 4 161 13 37 85 104 226 206 115 224 160 35 117 179 108 202 225 198 59 157 91 182 20 254 20 5 196 54 221 64 27 198 127 155 96 99 2 0 100 130 27 80 132 149 206 104 74 186 108 76 162 61 90 101 136 56 238 26 128 103 13 215 175 217 2 94 203 185 103 235 57 73 179 67 251 148 153 157 188 175 176 9 190 11 144 240 204 176 77 140 59 173 23 41 195 49 211 129 99 226 89 41 61 117 216 244 229 187 66 250 141 7 162 242 64 30 74 137 170 157 234 46 180 106 67 91 184 254 133 132 150 83 202 121 109 229 1 0 0 1 100 130 27 80 132 149 206 104 74 186 108 76 162 61 90 101 136 56 238 26 128 103 13 215 175 217 2 94 203 185 103 235 57 73 179 67 251 148 153 157 188 175 176 9 190 11 144 240 204 176 77 140 59 173 23 41 195 49 211 129 99 226 89 41 61 117 216 244 229 187 66 250 141 7 162 242 64 30 74 137 170 157 234 46 180 106 67 91 184 254 133 132 150 83 202 121 109 229 1 0 0 0 96 180 177 20 52 197 85 168 138 255 101 101 71 208 219 45 169 123 61 167 239 15 8 52 226 172 233 153 47 28 118 122 247 246 33 225 192 78 230 61 188 196 197 48 3 32 37 12 172 242 129 25 220 16 26 252 131 142 114 105 69 201 34 95 85 12 39 146 145 217 235 38 66 245 145 202 77 22 159 59 0 129 139 201 197 42 198 93 48 54 136 29 220 157 47 43 0 1 96 180 177 20 52 197 85 168 138 255 101 101 71 208 219 45 169 123 61 167 239 15 8 52 226 172 233 153 47 28 118 122 247 246 33 225 192 78 230 61 188 196 197 48 3 32 37 12 172 242 129 25 220 16 26 252 131 142 114 105 69 201 34 95 85 12 39 146 145 217 235 38 66 245 145 202 77 22 159 59 0 129 139 201 197 42 198 93 48 54 136 29 220 157 47 43 0 0 96 228 177 197 157 201 233 218 33 173 105 143 149 114 247 135 47 252 136 226 112 224 250 62 15 148 29 202 26 68 127 193 62 109 233 165 67 21 221 99 246 160 113 232 255 240 215 55 219 168 67 172 220 239 70 18 44 75 90 190 126 188 2 138 148 81 54 76 45 139 27 198 140 152 73 84 62 77 207 250 184 202 70 93 74 35 192 212 68 254 66 167 55 43 72 51 1 1 96 228 177 197 157 201 233 218 33 173 105 143 149 114 247 135 47 252 136 226 112 224 250 62 15 148 29 202 26 68 127 193 62 109 233 165 67 21 221 99 246 160 113 232 255 240 215 55 219 168 67 172 220 239 70 18 44 75 90 190 126 188 2 138 148 81 54 76 45 139 27 198 140 152 73 84 62 77 207 250 184 202 70 93 74 35 192 212 68 254 66 167 55 43 72 51 1 0 64 214 194 164 243 67 99 159 221 32 79 138 118 10 246 26 53 220 63 121 128 209 86 55 147 46 21 147 111 73 114 48 231 199 129 181 226 153 2 49 119 72 168 113 113 77 187 140 153 22 15 24 250 59 186 131 64 170 188 226 4 136 0 0 0 1 64 214 194 164 243 67 99 159 221 32 79 138 118 10 246 26 53 220 63 121 128 209 86 55 147 46 21 147 111 73 114 48 231 199 129 181 226 153 2 49 119 72 168 113 113 77 187 140 153 22 15 24 250 59 186 131 64 170 188 226 4 136 0 0 0 0 52 137 1 85 110 191 240 53 229 183 92 119 252 131 102 74 251 188 32 178 3 182 241 244 250 87 89 25 222 123 231 114 153 55 41 42 92 80 171 133 162 143 161 81 69 72 198 206 202 152 186 2 0 1 52 137 1 85 110 191 240 53 229 183 92 119 252 131 102 74 251 188 32 178 3 182 241 244 250 87 89 25 222 123 231 114 153 55 41 42 92 80 171 133 162 143 161 81 69 72 198 206 202 152 186 2 0 0 56 211 76 143 162 185 129 219 122 124 64 67 106 130 145 59 54 198 182 118 11 1 159 173 227 145 183 65 74 210 107 97 244 37 234 225 245 194 126 48 168 194 239 99 117 113 246 7 68 90 122 30 120 121 204 1 0 1 56 211 76 143 162 185 129 219 122 124 64 67 106 130 145 59 54 198 182 118 11 1 159 173 227 145 183 65 74 210 107 97 244 37 234 225 245 194 126 48 168 194 239 99 117 113 246 7 68 90 122 30 120 121 204 1 0 0 84 105 73 115 54 214 7 115 255 61 66 95 124 249 26 243 37 155 74 9 85 217 163 49 217 173 61 95 67 196 72 63 156 172 27 80 167 165 134 208 52 201 202 92 55 128 155 17 60 176 105 63 30 206 211 19 235 211 182 152 83 135 179 180 37 195 226 138 134 144 171 149 80 65 145 226 242 243 230 43 132 178 250 39 215 1 84 105 73 115 54 214 7 115 255 61 66 95 124 249 26 243 37 155 74 9 85 217 163 49 217 173 61 95 67 196 72 63 156 172 27 80 167 165 134 208 52 201 202 92 55 128 155 17 60 176 105 63 30 206 211 19 235 211 182 152 83 135 179 180 37 195 226 138 134 144 171 149 80 65 145 226 242 243 230 43 132 178 250 39 215 0 24 238 147 112 201 202 57 233 73 216 169 141 254 73 1 28 115 92 180 201 139 174 21 11 0 1 24 238 147 112 201 202 57 233 73 216 169 141 254 73 1 28 115 92 180 201 139 174 21 11 0 0 24 11 98 186 29 212 176 86 13 53 40 93 147 195 178 153 54 152 222 244 40 193 19 0 0 1 24 11 98 186 29 212 176 86 13 53 40 93 147 195 178 153 54 152 222 244 40 193 19 0 0 0 40 247 180 251 141 141 62 11 228 178 124 25 179 207 78 30 191 6 166 89 240 173 89 181 244 213 201 90 164 248 113 18 220 53 196 159 235 161 36 114 0 1 40 247 180 251 141 141 62 11 228 178 124 25 179 207 78 30 191 6 166 89 240 173 89 181 244 213 201 90 164 248 113 18 220 53 196 159 235 161 36 114 0 0 92 197 219 246 150 141 204 249 197 122 42 147 254 26 80 88 29 210 60 108 233 49 53 58 229 228 74 204 32 164 150 72 227 75 126 222 254 223 216 61 51 43 121 144 51 162 181 207 169 112 177 75 201 49 79 92 41 7 31 62 225 233 82 103 28 12 148 8 127 39 116 68 202 216 227 213 140 255 16 22 227 223 27 82 6 151 211 143 89 62 252 11 0 1 92 197 219 246 150 141 204 249 197 122 42 147 254 26 80 88 29 210 60 108 233 49 53 58 229 228 74 204 32 164 150 72 227 75 126 222 254 223 216 61 51 43 121 144 51 162 181 207 169 112 177 75 201 49 79 92 41 7 31 62 225 233 82 103 28 12 148 8 127 39 116 68 202 216 227 213 140 255 16 22 227 223 27 82 6 151 211 143 89 62 252 11 0 0 104 84 85 201 229 80 220 110 27 89 135 96 8 25 169 247 170 52 98 214 179 116 102 103 90 190 212 155 200 5 237 5 33 189 15 223 142 50 1 136 100 122 203 43 219 41 31 201 158 108 205 137 41 171 131 15 69 19 41 170 64 244 118 157 0 134 78 207 249 103 223 37 193 0 163 144 187 16 102 223 27 90 215 43 229 11 42 66 58 117 150 42 248 101 141 189 6 240 7 0 242 197 127 1 0 1 104 84 85 201 229 80 220 110 27 89 135 96 8 25 169 247 170 52 98 214 179 116 102 103 90 190 212 155 200 5 237 5 33 189 15 223 142 50 1 136 100 122 203 43 219 41 31 201 158 108 205 137 41 171 131 15 69 19 41 170 64 244 118 157 0 134 78 207 249 103 223 37 193 0 163 144 187 16 102 223 27 90 215 43 229 11 42 66 58 117 150 42 248 101 141 189 6 240 7 0 242 197 127 1 0 0 8 185 243 251 131 7 0 0 0 1 8 185 243 251 131 7 0 0 0 0 44 188 64 12 102 153 116 180 169 232 182 207 120 2 241 87 106 199 3 100 211 214 177 149 40 69 55 14 15 24 136 141 41 198 26 255 238 213 146 192 182 42 0 0 0 1 44 188 64 12 102 153 116 180 169 232 182 207 120 2 241 87 106 199 3 100 211 214 177 149 40 69 55 14 15 24 136 141 41 198 26 255 238 213 146 192 182 42 0 0 0 0 36 60 69 243 184 98 7 253 248 147 154 234 108 139 170 83 33 71 50 181 137 96 0 97 65 238 127 238 220 145 220 30 197 164 169 50 39 1 36 60 69 243 184 98 7 253 248 147 154 234 108 139 170 83 33 71 50 181 137 96 0 97 65 238 127 238 220 145 220 30 197 164 169 50 39 0 112 226 167 90 98 229 230 91 40 155 26 167 140 217 74 204 150 223 188 123 34 82 92 87 7 182 125 184 131 72 19 168 23 168 126 18 67 33 218 228 80 219 32 115 52 91 153 74 185 188 251 88 141 206 245 147 186 188 9 11 227 190 147 53 27 159 175 207 126 95 65 244 167 190 77 129 82 251 142 246 254 93 98 112 160 141 225 214 75 62 208 202 45 97 98 146 177 111 133 60 28 249 233 207 10 171 89 174 70 14 94 129 40 1 112 226 167 90 98 229 230 91 40 155 26 167 140 217 74 204 150 223 188 123 34 82 92 87 7 182 125 184 131 72 19 168 23 168 126 18 67 33 218 228 80 219 32 115 52 91 153 74 185 188 251 88 141 206 245 147 186 188 9 11 227 190 147 53 27 159 175 207 126 95 65 244 167 190 77 129 82 251 142 246 254 93 98 112 160 141 225 214 75 62 208 202 45 97 98 146 177 111 133 60 28 249 233 207 10 171 89 174 70 14 94 129 40 0 8 109 138 127 241 182 108 3 0 1 8 109 138 127 241 182 108 3 0 0 20 253 248 186 235 248 125 194 176 203 231 91 182 41 233 0 226 122 118 84 2 1 20 253 248 186 235 248 125 194 176 203 231 91 182 41 233 0 226 122 118 84 2 0 16 230 16 7 220 125 232 51 204 126 74 73 232 59 0 0 0 1 16 230 16 7 220 125 232 51 204 126 74 73 232 59 0 0 0 0 128 96 188 53 88 57 212 250 97 99 241 119 39 211 59 47 120 144 156 173 166 143 114 227 10 41 16 55 214 158 53 92 82 10 117 44 252 226 154 161 113 202 150 106 200 19 38 79 40 100 2 216 168 103 49 218 150 159 173 218 238 0 59 105 125 25 202 77 232 122 113 96 184 174 146 91 150 158 119 220 235 41 130 173 153 183 164 219 127 2 22 89 184 116 175 152 236 46 180 242 142 205 40 40 121 115 78 145 79 246 133 130 224 161 140 56 114 143 192 138 82 110 74 44 22 99 135 217 2 1 128 96 188 53 88 57 212 250 97 99 241 119 39 211 59 47 120 144 156 173 166 143 114 227 10 41 16 55 214 158 53 92 82 10 117 44 252 226 154 161 113 202 150 106 200 19 38 79 40 100 2 216 168 103 49 218 150 159 173 218 238 0 59 105 125 25 202 77 232 122 113 96 184 174 146 91 150 158 119 220 235 41 130 173 153 183 164 219 127 2 22 89 184 116 175 152 236 46 180 242 142 205 40 40 121 115 78 145 79 246 133 130 224 161 140 56 114 143 192 138 82 110 74 44 22 99 135 217 2 0 108 183 215 158 47 73 44 220 50 163 229 15 148 225 154 78 50 189 136 15 137 135 196 30 145 70 78 206 57 19 181 129 163 193 193 234 155 1 250 142 170 197 218 122 99 180 214 31 196 167 42 38 254 90 90 60 16 232 180 119 19 88 155 128 27 128 25 230 39 205 154 156 158 153 88 120 44 1 136 211 209 30 179 28 159 46 164 62 97 233 105 33 20 253 209 183 59 98 45 110 88 170 73 103 237 172 14 0 0 1 108 183 215 158 47 73 44 220 50 163 229 15 148 225 154 78 50 189 136 15 137 135 196 30 145 70 78 206 57 19 181 129 163 193 193 234 155 1 250 142 170 197 218 122 99 180 214 31 196 167 42 38 254 90 90 60 16 232 180 119 19 88 155 128 27 128 25 230 39 205 154 156 158 153 88 120 44 1 136 211 209 30 179 28 159 46 164 62 97 233 105 33 20 253 209 183 59 98 45 110 88 170 73 103 237 172 14 0 0 0 108 109 39 198 116 134 109 137 3 154 63 133 155 109 82 108 240 13 83 246 109 126 71 168 5 252 39 139 51 83 180 93 45 15 158 50 208 87 19 218 21 230 235 83 238 84 254 144 65 87 7 55 39 65 75 33 1 137 221 191 101 104 101 15 201 217 163 216 64 237 92 24 199 180 178 166 245 190 146 159 89 122 28 142 102 176 245 112 28 239 140 93 48 144 224 181 154 244 92 174 112 189 17 186 11 61 0 0 0 1 108 109 39 198 116 134 109 137 3 154 63 133 155 109 82 108 240 13 83 246 109 126 71 168 5 252 39 139 51 83 180 93 45 15 158 50 208 87 19 218 21 230 235 83 238 84 254 144 65 87 7 55 39 65 75 33 1 137 221 191 101 104 101 15 201 217 163 216 64 237 92 24 199 180 178 166 245 190 146 159 89 122 28 142 102 176 245 112 28 239 140 93 48 144 224 181 154 244 92 174 112 189 17 186 11 61 0 0 0 0 92 115 25 74 181 122 105 117 16 23 160 104 186 173 148 142 130 124 69 176 164 120 37 35 164 26 5 203 211 81 114 102 172 157 224 92 119 72 40 156 152 170 218 239 244 122 119 68 255 223 165 182 239 221 222 170 86 17 177 252 123 251 137 160 2 17 88 15 181 45 222 85 1 145 242 26 221 26 143 50 5 231 126 165 15 88 139 246 42 136 0 0 0 1 92 115 25 74 181 122 105 117 16 23 160 104 186 173 148 142 130 124 69 176 164 120 37 35 164 26 5 203 211 81 114 102 172 157 224 92 119 72 40 156 152 170 218 239 244 122 119 68 255 223 165 182 239 221 222 170 86 17 177 252 123 251 137 160 2 17 88 15 181 45 222 85 1 145 242 26 221 26 143 50 5 231 126 165 15 88 139 246 42 136 0 0 0 0 20 11 96 10 112 174 90 0 74 17 97 66 74 95 235 134 176 1 0 0 0 1 20 11 96 10 112 174 90 0 74 17 97 66 74 95 235 134 176 1 0 0 0 0 44 154 185 66 152 86 30 237 20 211 200 92 232 231 159 111 104 239 215 186 246 153 131 145 191 158 17 100 149 87 115 114 80 153 175 127 213 20 30 55 123 56 0 0 0 1 44 154 185 66 152 86 30 237 20 211 200 92 232 231 159 111 104 239 215 186 246 153 131 145 191 158 17 100 149 87 115 114 80 153 175 127 213 20 30 55 123 56 0 0 0 0 100 200 46 197 117 247 255 182 227 22 29 184 198 24 211 143 87 190 175 196 153 250 144 95 50 47 199 87 38 91 196 72 184 66 112 224 205 213 241 213 215 217 50 114 236 249 135 67 151 218 231 131 138 171 95 70 223 55 110 156 24 86 4 116 64 213 4 169 211 115 62 175 39 13 169 242 237 56 166 5 99 183 238 116 46 114 188 183 203 8 57 40 83 132 247 182 225 184 108 0 0 1 100 200 46 197 117 247 255 182 227 22 29 184 198 24 211 143 87 190 175 196 153 250 144 95 50 47 199 87 38 91 196 72 184 66 112 224 205 213 241 213 215 217 50 114 236 249 135 67 151 218 231 131 138 171 95 70 223 55 110 156 24 86 4 116 64 213 4 169 211 115 62 175 39 13 169 242 237 56 166 5 99 183 238 116 46 114 188 183 203 8 57 40 83 132 247 182 225 184 108 0 0 0 124 94 235 124 73 23 127 111 55 10 111 84 126 170 16 77 106 181 163 73 165 249 170 40 170 90 228 108 176 252 39 45 191 204 225 251 145 26 45 5 233 1 112 57 57 75 136 241 126 114 242 43 156 144 93 196 214 225 123 243 163 118 208 74 233 52 78 129 73 101 32 94 180 49 175 158 209 26 110 42 125 133 11 133 252 19 105 165 220 63 81 214 85 35 166 157 95 220 199 190 78 235 205 161 109 38 86 178 173 75 16 150 107 115 202 87 90 44 122 250 44 242 3 0 0 1 124 94 235 124 73 23 127 111 55 10 111 84 126 170 16 77 106 181 163 73 165 249 170 40 170 90 228 108 176 252 39 45 191 204 225 251 145 26 45 5 233 1 112 57 57 75 136 241 126 114 242 43 156 144 93 196 214 225 123 243 163 118 208 74 233 52 78 129 73 101 32 94 180 49 175 158 209 26 110 42 125 133 11 133 252 19 105 165 220 63 81 214 85 35 166 157 95 220 199 190 78 235 205 161 109 38 86 178 173 75 16 150 107 115 202 87 90 44 122 250 44 242 3 0 0 0 64 33 38 244 173 112 88 99 122 250 156 144 15 79 132 196 15 41 75 133 177 70 36 29 76 228 221 155 246 69 197 87 207 178 221 150 150 163 43 125 211 170 119 162 199 18 140 88 14 141 156 131 55 86 105 131 87 183 202 138 193 250 146 7 0 1 64 33 38 244 173 112 88 99 122 250 156 144 15 79 132 196 15 41 75 133 177 70 36 29 76 228 221 155 246 69 197 87 207 178 221 150 150 163 43 125 211 170 119 162 199 18 140 88 14 141 156 131 55 86 105 131 87 183 202 138 193 250 146 7 0 0 8 193 65 150 116 8 0 0 0 1 8 193 65 150 116 8 0 0 0 0 88 222 76 87 0 39 117 3 50 43 76 65 78 229 242 96 28 45 68 9 84 77 32 141 102 105 143 7 223 208 38 17 171 1 5 64 101 80 4 202 47 105 247 32 207 194 242 83 135 163 54 216 178 26 17 93 139 73 169 226 217 99 11 82 47 3 157 215 215 153 31 216 121 218 217 197 70 198 39 255 50 228 150 229 67 199 1 0 0 1 88 222 76 87 0 39 117 3 50 43 76 65 78 229 242 96 28 45 68 9 84 77 32 141 102 105 143 7 223 208 38 17 171 1 5 64 101 80 4 202 47 105 247 32 207 194 242 83 135 163 54 216 178 26 17 93 139 73 169 226 217 99 11 82 47 3 157 215 215 153 31 216 121 218 217 197 70 198 39 255 50 228 150 229 67 199 1 0 0 0 60 132 11 227 148 45 72 132 90 43 39 166 76 172 224 159 49 82 126 46 147 149 229 112 96 19 103 129 209 180 204 78 161 218 161 137 155 40 142 2 48 80 224 51 94 209 169 119 94 212 151 125 134 39 145 109 231 4 0 0 0 1 60 132 11 227 148 45 72 132 90 43 39 166 76 172 224 159 49 82 126 46 147 149 229 112 96 19 103 129 209 180 204 78 161 218 161 137 155 40 142 2 48 80 224 51 94 209 169 119 94 212 151 125 134 39 145 109 231 4 0 0 0 0 20 123 47 118 34 191 206 207 171 213 67 79 77 219 89 68 92 2 0 0 0 1 20 123 47 118 34 191 206 207 171 213 67 79 77 219 89 68 92 2 0 0 0 0 52 181 219 18 61 30 154 15 167 192 14 196 148 216 66 206 1 98 115 173 137 197 47 49 228 38 188 178 148 202 18 96 2 103 255 202 246 177 221 107 35 180 27 33 72 172 31 69 128 123 0 0 0 1 52 181 219 18 61 30 154 15 167 192 14 196 148 216 66 206 1 98 115 173 137 197 47 49 228 38 188 178 148 202 18 96 2 103 255 202 246 177 221 107 35 180 27 33 72 172 31 69 128 123 0 0 0 0 28 7 82 250 163 171 151 193 242 222 208 224 252 8 145 119 231 240 219 237 115 112 17 84 150 54 234 247 1 1 28 7 82 250 163 171 151 193 242 222 208 224 252 8 145 119 231 240 219 237 115 112 17 84 150 54 234 247 1 0 100 106 128 3 1 188 158 131 102 30 13 165 34 56 140 67 110 15 41 20 34 218 85 212 56 208 97 6 198 121 86 231 16 60 41 116 51 112 68 146 225 249 153 79 173 152 178 167 118 161 49 82 252 223 181 39 89 10 249 163 146 32 111 19 91 56 141 207 248 45 150 31 199 164 135 69 61 48 86 28 152 157 46 95 110 240 67 68 230 61 162 195 46 59 109 223 151 104 231 1 0 1 100 106 128 3 1 188 158 131 102 30 13 165 34 56 140 67 110 15 41 20 34 218 85 212 56 208 97 6 198 121 86 231 16 60 41 116 51 112 68 146 225 249 153 79 173 152 178 167 118 161 49 82 252 223 181 39 89 10 249 163 146 32 111 19 91 56 141 207 248 45 150 31 199 164 135 69 61 48 86 28 152 157 46 95 110 240 67 68 230 61 162 195 46 59 109 223 151 104 231 1 0 0 8 71 170 230 149 60 169 8 0 1 8 71 170 230 149 60 169 8 0 0 104 197 60 13 194 96 169 102 36 193 199 30 151 61 112 84 43 43 191 194 1 161 56 139 53 115 136 32 148 17 113 135 55 123 181 224 91 143 170 42 70 154 95 146 126 90 132 159 105 180 251 18 41 35 80 231 44 31 43 32 145 245 182 101 28 236 119 33 66 1 225 23 219 129 219 214 243 191 203 150 13 208 77 171 34 153 52 224 233 94 147 246 3 95 62 22 212 102 7 164 241 174 21 0 0 1 104 197 60 13 194 96 169 102 36 193 199 30 151 61 112 84 43 43 191 194 1 161 56 139 53 115 136 32 148 17 113 135 55 123 181 224 91 143 170 42 70 154 95 146 126 90 132 159 105 180 251 18 41 35 80 231 44 31 43 32 145 245 182 101 28 236 119 33 66 1 225 23 219 129 219 214 243 191 203 150 13 208 77 171 34 153 52 224 233 94 147 246 3 95 62 22 212 102 7 164 241 174 21 0 0 0 8 255 177 136 137 82 0 0 0 1 8 255 177 136 137 82 0 0 0 0 28 244 28 97 243 182 228 22 188 140 208 197 48 85 163 246 9 179 58 95 58 150 166 115 224 1 0 0 0 1 28 244 28 97 243 182 228 22 188 140 208 197 48 85 163 246 9 179 58 95 58 150 166 115 224 1 0 0 0 0 56 18 166 152 245 55 183 20 61 65 95 235 22 101 208 144 158 244 134 73 6 107 252 90 131 187 46 111 218 192 193 204 157 69 78 249 68 158 131 231 84 169 155 246 223 255 125 237 56 39 124 83 222 2 0 0 0 1 56 18 166 152 245 55 183 20 61 65 95 235 22 101 208 144 158 244 134 73 6 107 252 90 131 187 46 111 218 192 193 204 157 69 78 249 68 158 131 231 84 169 155 246 223 255 125 237 56 39 124 83 222 2 0 0 0 0 64 125 215 194 190 138 172 44 82 18 4 12 27 37 152 98 142 28 176 36 149 113 6 134 186 247 114 113 24 143 28 126 9 132 211 32 84 48 255 229 143 210 55 139 145 108 151 47 228 54 230 198 125 130 0 191 218 241 25 250 223 160 158 116 0 1 64 125 215 194 190 138 172 44 82 18 4 12 27 37 152 98 142 28 176 36 149 113 6 134 186 247 114 113 24 143 28 126 9 132 211 32 84 48 255 229 143 210 55 139 145 108 151 47 228 54 230 198 125 130 0 191 218 241 25 250 223 160 158 116 0 0 60 3 57 187 171 211 24 69 12 134 135 186 26 223 242 182 51 228 122 123 228 34 89 39 47 189 254 2 149 226 207 2 67 99 42 86 56 191 230 17 56 161 156 156 78 118 244 228 6 251 250 232 155 46 194 10 138 122 135 43 0 1 60 3 57 187 171 211 24 69 12 134 135 186 26 223 242 182 51 228 122 123 228 34 89 39 47 189 254 2 149 226 207 2 67 99 42 86 56 191 230 17 56 161 156 156 78 118 244 228 6 251 250 232 155 46 194 10 138 122 135 43 0 0 60 172 126 95 38 172 16 35 220 31 69 231 168 50 246 181 132 163 59 105 107 11 195 114 20 55 43 40 50 235 159 196 170 131 133 34 254 126 123 149 223 8 155 192 190 96 9 65 243 130 152 203 23 54 157 5 6 21 0 0 0 1 60 172 126 95 38 172 16 35 220 31 69 231 168 50 246 181 132 163 59 105 107 11 195 114 20 55 43 40 50 235 159 196 170 131 133 34 254 126 123 149 223 8 155 192 190 96 9 65 243 130 152 203 23 54 157 5 6 21 0 0 0 0 64 2 111 152 136 184 111 221 198 128 165 251 127 213 81 172 8 106 234 51 14 82 18 6 231 152 0 230 43 112 55 155 160 105 77 184 34 204 159 232 23 202 84 150 215 63 252 216 202 135 94 254 143 56 128 190 119 156 93 36 146 106 50 31 0 1 64 2 111 152 136 184 111 221 198 128 165 251 127 213 81 172 8 106 234 51 14 82 18 6 231 152 0 230 43 112 55 155 160 105 77 184 34 204 159 232 23 202 84 150 215 63 252 216 202 135 94 254 143 56 128 190 119 156 93 36 146 106 50 31 0 0 84 67 179 87 45 0 244 146 0 251 216 55 206 169 143 153 155 204 98 242 127 58 228 9 185 140 50 24 85 71 140 103 173 214 208 88 197 18 88 42 237 5 249 171 151 55 8 19 64 247 14 51 205 117 38 200 199 107 98 33 41 209 251 142 166 190 178 246 165 231 178 156 209 134 137 201 40 51 114 105 214 176 192 40 0 1 84 67 179 87 45 0 244 146 0 251 216 55 206 169 143 153 155 204 98 242 127 58 228 9 185 140 50 24 85 71 140 103 173 214 208 88 197 18 88 42 237 5 249 171 151 55 8 19 64 247 14 51 205 117 38 200 199 107 98 33 41 209 251 142 166 190 178 246 165 231 178 156 209 134 137 201 40 51 114 105 214 176 192 40 0 0 104 210 223 181 52 158 133 105 60 206 60 97 88 35 84 39 241 68 117 46 200 25 178 180 2 135 170 228 237 78 95 141 220 192 61 243 38 81 141 157 147 134 105 20 141 231 139 98 217 141 233 206 38 63 88 41 115 146 165 44 212 80 120 9 35 155 237 10 49 241 130 64 144 5 183 157 196 6 21 107 70 41 197 111 109 215 116 229 241 167 89 202 52 203 220 160 217 246 30 235 144 235 19 0 0 1 104 210 223 181 52 158 133 105 60 206 60 97 88 35 84 39 241 68 117 46 200 25 178 180 2 135 170 228 237 78 95 141 220 192 61 243 38 81 141 157 147 134 105 20 141 231 139 98 217 141 233 206 38 63 88 41 115 146 165 44 212 80 120 9 35 155 237 10 49 241 130 64 144 5 183 157 196 6 21 107 70 41 197 111 109 215 116 229 241 167 89 202 52 203 220 160 217 246 30 235 144 235 19 0 0 0 92 152 150 20 214 127 232 198 173 9 79 27 3 184 211 18 63 222 243 206 88 162 250 92 190 84 152 234 94 69 155 44 142 240 190 37 73 181 195 210 164 18 87 93 129 136 94 136 136 217 218 51 29 223 183 84 208 218 2 84 239 77 91 212 169 82 20 75 248 125 91 121 11 45 39 139 41 225 254 195 35 239 16 190 22 173 227 229 119 204 69 22 0 1 92 152 150 20 214 127 232 198 173 9 79 27 3 184 211 18 63 222 243 206 88 162 250 92 190 84 152 234 94 69 155 44 142 240 190 37 73 181 195 210 164 18 87 93 129 136 94 136 136 217 218 51 29 223 183 84 208 218 2 84 239 77 91 212 169 82 20 75 248 125 91 121 11 45 39 139 41 225 254 195 35 239 16 190 22 173 227 229 119 204 69 22 0 0 120 44 138 21 104 121 166 168 12 110 50 53 151 231 148 52 129 170 198 240 95 34 68 28 124 55 201 57 159 127 63 21 5 63 2 162 178 197 92 197 192 93 104 136 44 43 255 49 242 182 132 190 94 80 205 87 26 3 171 184 215 205 47 219 227 179 185 205 230 127 65 231 66 123 92 125 163 244 195 94 188 196 160 223 181 5 166 64 111 85 190 120 122 41 201 0 186 192 106 199 252 164 20 92 37 80 149 48 19 150 123 103 189 229 79 223 27 244 74 0 0 1 120 44 138 21 104 121 166 168 12 110 50 53 151 231 148 52 129 170 198 240 95 34 68 28 124 55 201 57 159 127 63 21 5 63 2 162 178 197 92 197 192 93 104 136 44 43 255 49 242 182 132 190 94 80 205 87 26 3 171 184 215 205 47 219 227 179 185 205 230 127 65 231 66 123 92 125 163 244 195 94 188 196 160 223 181 5 166 64 111 85 190 120 122 41 201 0 186 192 106 199 252 164 20 92 37 80 149 48 19 150 123 103 189 229 79 223 27 244 74 0 0 0 100 245 181 98 66 108 43 27 238 39 17 236 216 168 31 46 226 159 160 142 67 146 30 10 164 14 213 242 136 234 225 199 106 255 33 115 237 228 171 8 216 45 122 202 182 141 16 25 154 11 32 53 253 203 2 153 173 247 193 28 139 204 11 42 191 71 206 216 60 1 99 141 204 17 235 245 239 210 176 83 155 175 144 26 254 215 45 202 84 103 74 45 94 174 24 228 158 37 0 0 0 1 100 245 181 98 66 108 43 27 238 39 17 236 216 168 31 46 226 159 160 142 67 146 30 10 164 14 213 242 136 234 225 199 106 255 33 115 237 228 171 8 216 45 122 202 182 141 16 25 154 11 32 53 253 203 2 153 173 247 193 28 139 204 11 42 191 71 206 216 60 1 99 141 204 17 235 245 239 210 176 83 155 175 144 26 254 215 45 202 84 103 74 45 94 174 24 228 158 37 0 0 0 0 104 57 246 11 97 62 119 196 46 75 16 79 108 49 113 219 104 188 179 248 78 58 245 127 216 140 166 196 171 132 59 25 253 51 249 216 140 222 121 230 30 172 32 207 74 205 85 44 90 36 173 79 87 194 82 25 79 135 112 132 221 164 76 173 137 126 195 194 92 248 173 9 87 209 223 59 125 95 65 85 163 122 135 111 167 236 33 52 80 27 61 178 237 205 251 204 39 240 191 179 209 167 168 143 7 1 104 57 246 11 97 62 119 196 46 75 16 79 108 49 113 219 104 188 179 248 78 58 245 127 216 140 166 196 171 132 59 25 253 51 249 216 140 222 121 230 30 172 32 207 74 205 85 44 90 36 173 79 87 194 82 25 79 135 112 132 221 164 76 173 137 126 195 194 92 248 173 9 87 209 223 59 125 95 65 85 163 122 135 111 167 236 33 52 80 27 61 178 237 205 251 204 39 240 191 179 209 167 168 143 7 0 36 163 89 48 170 102 43 220 156 66 109 77 113 21 188 67 203 215 226 3 205 170 236 98 121 244 145 200 70 209 174 177 8 139 184 149 27 1 36 163 89 48 170 102 43 220 156 66 109 77 113 21 188 67 203 215 226 3 205 170 236 98 121 244 145 200 70 209 174 177 8 139 184 149 27 0 92 53 9 22 111 90 93 185 232 66 232 61 190 77 71 90 216 56 212 22 125 84 142 129 138 224 63 243 92 90 116 216 187 231 68 78 132 78 241 87 154 62 85 115 206 103 51 246 75 206 191 127 30 122 123 36 8 228 202 50 139 177 122 8 243 137 70 204 22 54 249 70 184 115 203 134 211 234 65 106 138 66 20 24 187 65 57 199 142 254 18 13 0 1 92 53 9 22 111 90 93 185 232 66 232 61 190 77 71 90 216 56 212 22 125 84 142 129 138 224 63 243 92 90 116 216 187 231 68 78 132 78 241 87 154 62 85 115 206 103 51 246 75 206 191 127 30 122 123 36 8 228 202 50 139 177 122 8 243 137 70 204 22 54 249 70 184 115 203 134 211 234 65 106 138 66 20 24 187 65 57 199 142 254 18 13 0 0 88 149 88 176 69 223 36 37 144 73 234 120 8 99 221 137 178 30 189 44 46 85 157 48 42 245 113 38 233 244 178 224 211 47 14 147 125 42 18 227 2 75 4 61 200 33 227 150 10 58 244 38 21 49 115 166 218 124 93 108 5 73 235 24 7 87 152 177 21 225 23 170 204 54 120 154 213 94 174 62 0 72 37 253 148 145 218 243 1 1 88 149 88 176 69 223 36 37 144 73 234 120 8 99 221 137 178 30 189 44 46 85 157 48 42 245 113 38 233 244 178 224 211 47 14 147 125 42 18 227 2 75 4 61 200 33 227 150 10 58 244 38 21 49 115 166 218 124 93 108 5 73 235 24 7 87 152 177 21 225 23 170 204 54 120 154 213 94 174 62 0 72 37 253 148 145 218 243 1 0 4 30 0 0 0 1 4 30 0 0 0 0 84 155 231 228 201 142 243 71 208 249 176 228 44 166 218 152 155 74 36 194 74 148 67 125 239 134 32 23 215 211 53 175 202 69 44 53 118 45 165 95 123 12 108 231 154 213 28 20 163 249 156 33 65 206 61 154 174 104 60 98 109 32 78 242 212 129 149 248 201 134 148 123 181 199 217 155 194 96 140 22 149 241 60 138 83 1 84 155 231 228 201 142 243 71 208 249 176 228 44 166 218 152 155 74 36 194 74 148 67 125 239 134 32 23 215 211 53 175 202 69 44 53 118 45 165 95 123 12 108 231 154 213 28 20 163 249 156 33 65 206 61 154 174 104 60 98 109 32 78 242 212 129 149 248 201 134 148 123 181 199 217 155 194 96 140 22 149 241 60 138 83 0 92 144 67 10 47 192 191 82 221 35 118 53 159 135 152 112 38 73 15 23 69 58 219 225 247 78 102 170 227 6 163 149 12 249 225 137 246 239 39 40 234 163 207 114 112 115 115 194 219 16 202 159 189 202 35 212 109 38 217 132 76 179 231 7 209 218 188 27 208 113 230 164 84 51 101 32 180 123 194 122 68 150 119 65 252 204 137 177 46 234 227 67 1 1 92 144 67 10 47 192 191 82 221 35 118 53 159 135 152 112 38 73 15 23 69 58 219 225 247 78 102 170 227 6 163 149 12 249 225 137 246 239 39 40 234 163 207 114 112 115 115 194 219 16 202 159 189 202 35 212 109 38 217 132 76 179 231 7 209 218 188 27 208 113 230 164 84 51 101 32 180 123 194 122 68 150 119 65 252 204 137 177 46 234 227 67 1 0 24 72 56 22 141 170 58 90 163 187 180 242 135 44 169 146 74 211 248 249 78 94 0 0 0 1 24 72 56 22 141 170 58 90 163 187 180 242 135 44 169 146 74 211 248 249 78 94 0 0 0 0 84 212 210 42 73 12 25 196 31 47 75 120 243 73 247 127 147 72 96 165 96 14 69 196 39 172 6 5 194 11 134 119 124 92 255 174 158 25 36 41 88 174 179 156 60 218 178 156 41 175 187 120 209 98 0 19 182 231 198 178 95 52 119 23 97 47 127 143 101 176 216 52 159 106 61 182 27 146 186 142 96 231 29 27 0 1 84 212 210 42 73 12 25 196 31 47 75 120 243 73 247 127 147 72 96 165 96 14 69 196 39 172 6 5 194 11 134 119 124 92 255 174 158 25 36 41 88 174 179 156 60 218 178 156 41 175 187 120 209 98 0 19 182 231 198 178 95 52 119 23 97 47 127 143 101 176 216 52 159 106 61 182 27 146 186 142 96 231 29 27 0 0 16 202 192 8 50 72 83 78 188 175 88 50 125 131 102 195 3 1 16 202 192 8 50 72 83 78 188 175 88 50 125 131 102 195 3 0 60 129 235 99 25 168 162 143 14 181 191 24 1 54 4 85 204 63 111 78 71 241 253 45 225 56 177 121 166 226 7 163 1 182 155 9 74 40 35 9 9 175 144 171 35 224 162 163 133 97 35 188 126 220 236 73 96 97 129 14 0 1 60 129 235 99 25 168 162 143 14 181 191 24 1 54 4 85 204 63 111 78 71 241 253 45 225 56 177 121 166 226 7 163 1 182 155 9 74 40 35 9 9 175 144 171 35 224 162 163 133 97 35 188 126 220 236 73 96 97 129 14 0 0 64 108 92 234 131 231 188 232 51 18 198 215 40 15 157 152 141 79 144 203 196 249 187 115 41 230 177 33 50 91 32 10 169 73 162 155 234 98 212 245 92 106 18 104 75 83 194 149 253 23 63 13 64 214 243 154 201 132 100 31 187 255 119 206 203 1 64 108 92 234 131 231 188 232 51 18 198 215 40 15 157 152 141 79 144 203 196 249 187 115 41 230 177 33 50 91 32 10 169 73 162 155 234 98 212 245 92 106 18 104 75 83 194 149 253 23 63 13 64 214 243 154 201 132 100 31 187 255 119 206 203 0 100 234 116 169 65 23 182 136 224 163 211 105 192 204 31 82 240 175 46 102 159 95 158 50 9 145 106 22 60 50 33 177 26 225 82 114 86 212 7 154 44 212 126 161 171 72 116 119 246 52 229 38 173 55 41 107 40 184 253 98 215 24 91 66 142 30 173 123 90 125 69 86 227 60 60 95 206 124 147 44 60 155 141 241 90 83 7 53 206 71 46 134 127 122 180 31 53 82 214 176 0 1 100 234 116 169 65 23 182 136 224 163 211 105 192 204 31 82 240 175 46 102 159 95 158 50 9 145 106 22 60 50 33 177 26 225 82 114 86 212 7 154 44 212 126 161 171 72 116 119 246 52 229 38 173 55 41 107 40 184 253 98 215 24 91 66 142 30 173 123 90 125 69 86 227 60 60 95 206 124 147 44 60 155 141 241 90 83 7 53 206 71 46 134 127 122 180 31 53 82 214 176 0 0 124 246 224 179 231 248 85 24 201 210 110 165 232 153 136 96 155 10 189 255 115 232 19 11 61 42 152 98 194 221 200 42 3 215 220 12 102 106 69 77 69 216 253 146 196 230 240 63 118 205 224 76 129 107 174 183 121 74 199 99 224 180 49 180 47 34 35 35 224 247 193 61 42 51 142 16 105 58 239 223 3 189 5 85 19 221 249 251 255 86 9 113 209 31 184 51 28 17 30 9 254 164 62 237 123 73 56 8 110 166 164 217 88 106 22 85 183 98 156 139 221 73 253 52 0 1 124 246 224 179 231 248 85 24 201 210 110 165 232 153 136 96 155 10 189 255 115 232 19 11 61 42 152 98 194 221 200 42 3 215 220 12 102 106 69 77 69 216 253 146 196 230 240 63 118 205 224 76 129 107 174 183 121 74 199 99 224 180 49 180 47 34 35 35 224 247 193 61 42 51 142 16 105 58 239 223 3 189 5 85 19 221 249 251 255 86 9 113 209 31 184 51 28 17 30 9 254 164 62 237 123 73 56 8 110 166 164 217 88 106 22 85 183 98 156 139 221 73 253 52 0 0 76 114 71 65 89 237 36 19 196 155 136 82 8 202 243 70 78 29 120 129 104 2 108 32 185 184 120 36 214 143 191 219 217 92 173 243 221 253 134 71 240 107 182 126 78 197 54 130 17 174 97 201 95 84 153 156 87 239 78 186 103 226 240 168 109 214 167 102 253 22 173 79 216 165 16 0 0 1 76 114 71 65 89 237 36 19 196 155 136 82 8 202 243 70 78 29 120 129 104 2 108 32 185 184 120 36 214 143 191 219 217 92 173 243 221 253 134 71 240 107 182 126 78 197 54 130 17 174 97 201 95 84 153 156 87 239 78 186 103 226 240 168 109 214 167 102 253 22 173 79 216 165 16 0 0 0 44 205 174 153 159 175 148 18 158 235 107 21 147 172 130 150 6 109 216 1 3 85 18 35 218 2 59 66 219 110 2 146 243 32 186 68 69 178 58 234 207 205 114 206 3 1 44 205 174 153 159 175 148 18 158 235 107 21 147 172 130 150 6 109 216 1 3 85 18 35 218 2 59 66 219 110 2 146 243 32 186 68 69 178 58 234 207 205 114 206 3 0 116 6 227 111 143 56 164 39 218 18 125 60 7 225 195 8 232 184 177 163 16 21 29 165 72 172 201 28 230 132 0 86 23 246 125 104 127 83 109 13 113 149 216 245 166 173 128 120 168 110 19 178 216 69 212 66 94 179 133 240 181 66 121 14 166 89 77 60 143 152 41 85 140 62 121 51 44 123 188 123 173 52 74 2 31 233 7 229 187 139 234 225 45 79 247 235 210 113 240 84 200 66 137 125 254 189 83 79 17 221 213 32 54 4 0 0 0 1 116 6 227 111 143 56 164 39 218 18 125 60 7 225 195 8 232 184 177 163 16 21 29 165 72 172 201 28 230 132 0 86 23 246 125 104 127 83 109 13 113 149 216 245 166 173 128 120 168 110 19 178 216 69 212 66 94 179 133 240 181 66 121 14 166 89 77 60 143 152 41 85 140 62 121 51 44 123 188 123 173 52 74 2 31 233 7 229 187 139 234 225 45 79 247 235 210 113 240 84 200 66 137 125 254 189 83 79 17 221 213 32 54 4 0 0 0 0 76 180 196 94 156 54 195 58 2 39 205 18 27 183 204 87 155 155 103 140 143 118 225 162 141 198 191 103 246 251 35 33 200 114 204 108 157 138 202 183 109 135 225 247 167 85 247 149 166 13 150 140 115 191 119 88 74 150 209 45 234 64 143 177 65 18 230 195 62 134 19 33 86 117 177 249 0 1 76 180 196 94 156 54 195 58 2 39 205 18 27 183 204 87 155 155 103 140 143 118 225 162 141 198 191 103 246 251 35 33 200 114 204 108 157 138 202 183 109 135 225 247 167 85 247 149 166 13 150 140 115 191 119 88 74 150 209 45 234 64 143 177 65 18 230 195 62 134 19 33 86 117 177 249 0 0 104 77 194 158 250 209 247 60 209 53 237 237 50 69 209 78 167 168 156 255 102 176 89 29 124 236 2 92 64 171 213 222 61 154 151 17 221 163 26 188 48 218 181 25 207 24 78 174 96 77 4 92 36 81 77 82 53 226 55 109 24 229 73 137 228 213 186 236 231 140 148 101 63 106 130 255 94 160 246 229 63 254 107 254 48 15 56 43 131 180 38 166 178 234 233 86 61 2 85 154 172 81 81 66 9 1 104 77 194 158 250 209 247 60 209 53 237 237 50 69 209 78 167 168 156 255 102 176 89 29 124 236 2 92 64 171 213 222 61 154 151 17 221 163 26 188 48 218 181 25 207 24 78 174 96 77 4 92 36 81 77 82 53 226 55 109 24 229 73 137 228 213 186 236 231 140 148 101 63 106 130 255 94 160 246 229 63 254 107 254 48 15 56 43 131 180 38 166 178 234 233 86 61 2 85 154 172 81 81 66 9 0 32 159 255 244 214 47 170 4 34 47 46 170 236 221 0 119 135 29 199 192 21 169 211 135 216 147 25 112 187 63 0 0 0 1 32 159 255 244 214 47 170 4 34 47 46 170 236 221 0 119 135 29 199 192 21 169 211 135 216 147 25 112 187 63 0 0 0 0 4 136 102 2 0 1 4 136 102 2 0 0 100 182 114 42 214 204 210 88 197 7 199 39 124 27 200 142 13 162 188 42 112 118 92 202 215 78 160 112 52 72 100 65 30 205 199 86 182 35 211 245 70 139 86 183 94 139 115 30 32 188 225 10 237 169 169 192 188 84 209 158 78 210 48 148 84 141 6 11 247 62 239 52 100 249 186 173 138 163 134 212 20 243 14 250 162 155 177 89 175 243 3 44 202 80 198 163 43 3 0 0 0 1 100 182 114 42 214 204 210 88 197 7 199 39 124 27 200 142 13 162 188 42 112 118 92 202 215 78 160 112 52 72 100 65 30 205 199 86 182 35 211 245 70 139 86 183 94 139 115 30 32 188 225 10 237 169 169 192 188 84 209 158 78 210 48 148 84 141 6 11 247 62 239 52 100 249 186 173 138 163 134 212 20 243 14 250 162 155 177 89 175 243 3 44 202 80 198 163 43 3 0 0 0 0 108 99 120 242 101 168 63 63 168 132 177 224 65 190 4 179 252 98 42 247 140 190 31 23 0 117 179 116 199 98 202 211 102 139 65 63 177 51 13 22 232 149 208 247 101 128 25 173 165 160 191 102 145 173 51 230 242 244 7 170 233 242 115 73 120 62 67 64 36 3 41 74 159 24 59 71 166 190 104 193 40 86 159 53 253 65 67 111 21 48 43 46 214 182 41 210 212 59 110 156 33 239 225 212 27 107 0 0 0 1 108 99 120 242 101 168 63 63 168 132 177 224 65 190 4 179 252 98 42 247 140 190 31 23 0 117 179 116 199 98 202 211 102 139 65 63 177 51 13 22 232 149 208 247 101 128 25 173 165 160 191 102 145 173 51 230 242 244 7 170 233 242 115 73 120 62 67 64 36 3 41 74 159 24 59 71 166 190 104 193 40 86 159 53 253 65 67 111 21 48 43 46 214 182 41 210 212 59 110 156 33 239 225 212 27 107 0 0 0 0 36 182 35 41 118 252 144 79 94 31 128 26 169 129 98 79 185 77 204 158 170 99 105 83 166 57 204 35 71 231 68 17 161 7 0 0 0 1 36 182 35 41 118 252 144 79 94 31 128 26 169 129 98 79 185 77 204 158 170 99 105 83 166 57 204 35 71 231 68 17 161 7 0 0 0 0 108 19 121 68 172 165 141 93 53 202 225 143 125 21 127 168 150 223 142 78 163 244 135 194 197 17 161 238 159 225 207 232 231 141 188 186 185 170 238 141 145 164 234 7 144 31 97 144 227 0 100 164 181 137 33 28 59 136 10 218 56 168 254 166 106 145 203 39 49 163 15 174 143 31 5 178 130 153 84 87 87 61 221 163 29 252 65 53 122 68 235 160 127 229 67 219 215 172 22 9 124 37 73 237 104 38 0 0 0 1 108 19 121 68 172 165 141 93 53 202 225 143 125 21 127 168 150 223 142 78 163 244 135 194 197 17 161 238 159 225 207 232 231 141 188 186 185 170 238 141 145 164 234 7 144 31 97 144 227 0 100 164 181 137 33 28 59 136 10 218 56 168 254 166 106 145 203 39 49 163 15 174 143 31 5 178 130 153 84 87 87 61 221 163 29 252 65 53 122 68 235 160 127 229 67 219 215 172 22 9 124 37 73 237 104 38 0 0 0 0 68 131 157 197 45 185 223 236 53 246 15 184 5 182 184 23 147 3 15 46 179 218 118 209 114 37 235 220 187 201 154 47 207 166 122 35 26 91 3 127 154 179 249 232 233 237 129 34 68 202 138 161 0 13 77 112 252 203 92 187 188 230 39 55 132 247 0 0 0 1 68 131 157 197 45 185 223 236 53 246 15 184 5 182 184 23 147 3 15 46 179 218 118 209 114 37 235 220 187 201 154 47 207 166 122 35 26 91 3 127 154 179 249 232 233 237 129 34 68 202 138 161 0 13 77 112 252 203 92 187 188 230 39 55 132 247 0 0 0 0 124 215 194 0 199 219 223 102 242 204 248 124 17 112 73 119 161 49 131 84 207 207 67 43 12 67 150 210 126 148 3 13 241 16 225 134 108 33 87 2 157 76 211 58 133 210 144 225 220 56 131 147 199 231 84 32 218 43 221 252 165 30 119 252 165 229 211 167 197 150 182 197 108 234 8 252 127 239 35 237 26 80 187 183 139 105 103 168 55 42 221 202 112 37 234 50 199 248 234 249 61 133 62 20 172 135 114 63 241 161 127 1 136 155 71 88 83 222 156 240 240 1 0 0 0 1 124 215 194 0 199 219 223 102 242 204 248 124 17 112 73 119 161 49 131 84 207 207 67 43 12 67 150 210 126 148 3 13 241 16 225 134 108 33 87 2 157 76 211 58 133 210 144 225 220 56 131 147 199 231 84 32 218 43 221 252 165 30 119 252 165 229 211 167 197 150 182 197 108 234 8 252 127 239 35 237 26 80 187 183 139 105 103 168 55 42 221 202 112 37 234 50 199 248 234 249 61 133 62 20 172 135 114 63 241 161 127 1 136 155 71 88 83 222 156 240 240 1 0 0 0 0 92 77 228 31 76 241 138 249 4 98 9 115 184 112 82 183 229 236 138 162 82 102 251 28 188 12 113 181 158 79 211 194 251 196 166 73 83 83 80 42 120 93 243 152 162 232 39 205 85 189 126 54 242 156 193 86 191 44 44 252 55 14 21 27 116 194 191 250 7 74 203 105 99 89 106 178 14 2 236 178 68 170 192 252 120 41 130 72 87 206 11 0 0 1 92 77 228 31 76 241 138 249 4 98 9 115 184 112 82 183 229 236 138 162 82 102 251 28 188 12 113 181 158 79 211 194 251 196 166 73 83 83 80 42 120 93 243 152 162 232 39 205 85 189 126 54 242 156 193 86 191 44 44 252 55 14 21 27 116 194 191 250 7 74 203 105 99 89 106 178 14 2 236 178 68 170 192 252 120 41 130 72 87 206 11 0 0 0 56 134 225 44 69 119 64 234 84 89 109 244 85 126 103 94 170 253 103 245 228 230 48 38 166 108 164 43 22 74 31 25 224 196 60 126 145 211 177 41 97 248 197 232 65 242 142 255 87 64 104 166 218 221 0 0 0 1 56 134 225 44 69 119 64 234 84 89 109 244 85 126 103 94 170 253 103 245 228 230 48 38 166 108 164 43 22 74 31 25 224 196 60 126 145 211 177 41 97 248 197 232 65 242 142 255 87 64 104 166 218 221 0 0 0 0 116 229 172 191 36 121 40 254 104 25 228 24 190 128 20 169 193 240 145 60 136 35 241 68 254 62 193 45 112 102 236 245 29 64 94 62 47 36 42 252 13 28 27 219 9 245 94 181 136 19 177 1 212 5 30 243 157 117 94 95 128 151 156 4 203 11 190 27 0 62 198 137 167 143 73 204 232 2 248 129 253 159 82 186 78 87 59 101 197 100 160 249 30 152 93 125 199 107 24 125 64 176 236 44 0 171 123 140 55 132 181 2 66 228 115 0 0 1 116 229 172 191 36 121 40 254 104 25 228 24 190 128 20 169 193 240 145 60 136 35 241 68 254 62 193 45 112 102 236 245 29 64 94 62 47 36 42 252 13 28 27 219 9 245 94 181 136 19 177 1 212 5 30 243 157 117 94 95 128 151 156 4 203 11 190 27 0 62 198 137 167 143 73 204 232 2 248 129 253 159 82 186 78 87 59 101 197 100 160 249 30 152 93 125 199 107 24 125 64 176 236 44 0 171 123 140 55 132 181 2 66 228 115 0 0 0 56 242 178 209 149 127 105 215 100 20 77 91 129 188 44 67 89 61 245 2 145 100 176 98 45 200 226 215 226 171 178 81 56 196 210 25 211 24 236 80 114 182 153 187 70 254 227 193 36 163 1 237 117 87 122 2 0 1 56 242 178 209 149 127 105 215 100 20 77 91 129 188 44 67 89 61 245 2 145 100 176 98 45 200 226 215 226 171 178 81 56 196 210 25 211 24 236 80 114 182 153 187 70 254 227 193 36 163 1 237 117 87 122 2 0 0 124 134 51 146 212 174 146 101 32 54 80 14 156 174 236 212 195 81 90 58 116 149 201 205 7 130 14 255 190 241 205 207 249 221 121 67 167 233 3 91 49 79 77 255 115 246 112 74 5 197 106 119 29 238 202 62 53 27 223 236 152 234 237 36 19 234 248 83 103 87 80 106 110 27 202 134 182 123 143 10 59 147 105 206 20 112 193 190 220 192 38 172 241 167 90 129 71 185 246 137 86 12 195 102 17 186 107 173 97 103 140 196 114 119 155 196 217 44 13 55 170 195 147 93 0 1 124 134 51 146 212 174 146 101 32 54 80 14 156 174 236 212 195 81 90 58 116 149 201 205 7 130 14 255 190 241 205 207 249 221 121 67 167 233 3 91 49 79 77 255 115 246 112 74 5 197 106 119 29 238 202 62 53 27 223 236 152 234 237 36 19 234 248 83 103 87 80 106 110 27 202 134 182 123 143 10 59 147 105 206 20 112 193 190 220 192 38 172 241 167 90 129 71 185 246 137 86 12 195 102 17 186 107 173 97 103 140 196 114 119 155 196 217 44 13 55 170 195 147 93 0 0 76 252 151 248 45 49 178 79 128 161 10 102 252 132 63 0 196 234 37 213 196 19 233 200 48 79 135 72 224 67 120 56 21 130 243 118 44 119 71 20 190 181 163 216 126 133 133 98 134 74 16 85 129 28 141 49 184 195 10 187 170 152 61 100 174 129 141 139 49 17 137 166 184 197 148 14 0 1 76 252 151 248 45 49 178 79 128 161 10 102 252 132 63 0 196 234 37 213 196 19 233 200 48 79 135 72 224 67 120 56 21 130 243 118 44 119 71 20 190 181 163 216 126 133 133 98 134 74 16 85 129 28 141 49 184 195 10 187 170 152 61 100 174 129 141 139 49 17 137 166 184 197 148 14 0 0 72 201 189 132 146 184 73 235 58 191 160 218 55 99 221 69 240 85 82 95 206 66 232 212 65 234 63 77 180 226 245 185 90 39 91 117 118 212 95 63 202 231 49 115 110 103 125 28 251 84 217 64 21 37 74 176 91 16 243 99 51 19 229 146 28 76 167 138 98 3 86 2 0 1 72 201 189 132 146 184 73 235 58 191 160 218 55 99 221 69 240 85 82 95 206 66 232 212 65 234 63 77 180 226 245 185 90 39 91 117 118 212 95 63 202 231 49 115 110 103 125 28 251 84 217 64 21 37 74 176 91 16 243 99 51 19 229 146 28 76 167 138 98 3 86 2 0 0 24 4 127 113 119 170 147 209 114 124 184 151 70 216 77 57 33 8 170 193 201 10 0 0 0 1 24 4 127 113 119 170 147 209 114 124 184 151 70 216 77 57 33 8 170 193 201 10 0 0 0 0 20 221 119 146 70 38 139 89 31 158 39 212 71 222 63 236 44 183 75 0 0 1 20 221 119 146 70 38 139 89 31 158 39 212 71 222 63 236 44 183 75 0 0 0 100 15 190 40 142 118 234 227 167 165 244 200 26 49 57 37 9 217 227 141 192 139 18 100 130 160 53 103 125 170 120 113 53 121 232 23 248 218 111 12 114 85 152 168 69 138 153 228 55 175 99 6 29 234 191 118 238 18 250 139 127 248 148 96 36 236 164 252 127 71 230 13 95 200 86 106 201 201 168 74 148 207 42 56 34 173 114 89 220 58 197 209 56 194 93 253 36 57 2 0 0 1 100 15 190 40 142 118 234 227 167 165 244 200 26 49 57 37 9 217 227 141 192 139 18 100 130 160 53 103 125 170 120 113 53 121 232 23 248 218 111 12 114 85 152 168 69 138 153 228 55 175 99 6 29 234 191 118 238 18 250 139 127 248 148 96 36 236 164 252 127 71 230 13 95 200 86 106 201 201 168 74 148 207 42 56 34 173 114 89 220 58 197 209 56 194 93 253 36 57 2 0 0 0 20 241 138 87 82 7 150 25 154 252 91 216 29 106 84 123 71 145 238 230 5 1 20 241 138 87 82 7 150 25 154 252 91 216 29 106 84 123 71 145 238 230 5 0 32 151 63 193 99 4 229 248 206 122 164 94 141 132 110 0 199 239 244 9 150 62 180 68 138 132 112 26 31 217 46 0 0 1 32 151 63 193 99 4 229 248 206 122 164 94 141 132 110 0 199 239 244 9 150 62 180 68 138 132 112 26 31 217 46 0 0 0 36 151 219 5 222 229 79 21 136 176 12 133 59 166 175 203 218 102 58 176 141 26 127 152 21 81 49 214 17 132 22 14 243 177 3 0 0 1 36 151 219 5 222 229 79 21 136 176 12 133 59 166 175 203 218 102 58 176 141 26 127 152 21 81 49 214 17 132 22 14 243 177 3 0 0 0 104 6 168 179 178 70 132 236 140 85 20 22 237 179 132 40 18 248 209 250 75 115 245 45 67 206 107 231 237 102 198 61 0 53 181 149 233 167 119 49 80 107 58 194 191 82 80 182 33 90 50 185 65 82 236 47 123 143 42 21 75 76 220 97 26 140 95 213 177 133 178 200 249 254 187 252 127 168 64 33 103 133 36 183 203 53 160 28 249 121 153 43 163 187 30 115 14 218 222 176 173 69 117 99 12 1 104 6 168 179 178 70 132 236 140 85 20 22 237 179 132 40 18 248 209 250 75 115 245 45 67 206 107 231 237 102 198 61 0 53 181 149 233 167 119 49 80 107 58 194 191 82 80 182 33 90 50 185 65 82 236 47 123 143 42 21 75 76 220 97 26 140 95 213 177 133 178 200 249 254 187 252 127 168 64 33 103 133 36 183 203 53 160 28 249 121 153 43 163 187 30 115 14 218 222 176 173 69 117 99 12 0 108 2 212 34 173 196 82 79 56 112 170 220 63 200 109 239 119 47 163 110 174 76 171 32 84 196 96 74 147 73 116 212 7 81 2 123 170 250 193 70 154 132 132 185 57 39 161 95 139 69 234 233 243 142 195 223 169 214 193 142 130 202 53 250 215 1 232 72 89 42 138 164 214 96 81 207 117 204 208 64 159 221 205 19 127 120 90 20 23 72 45 155 78 40 43 86 112 83 186 201 240 77 86 191 92 249 160 247 61 1 108 2 212 34 173 196 82 79 56 112 170 220 63 200 109 239 119 47 163 110 174 76 171 32 84 196 96 74 147 73 116 212 7 81 2 123 170 250 193 70 154 132 132 185 57 39 161 95 139 69 234 233 243 142 195 223 169 214 193 142 130 202 53 250 215 1 232 72 89 42 138 164 214 96 81 207 117 204 208 64 159 221 205 19 127 120 90 20 23 72 45 155 78 40 43 86 112 83 186 201 240 77 86 191 92 249 160 247 61 0 128 102 251 156 92 43 108 29 62 40 215 42 15 198 118 248 50 157 25 129 219 206 70 124 249 193 82 122 51 209 211 166 198 129 204 78 210 123 124 106 191 69 198 115 9 187 105 170 16 189 25 66 30 61 214 177 166 27 0 66 226 174 106 52 23 197 236 68 43 88 169 245 109 62 252 144 219 129 154 127 116 74 210 197 53 171 56 209 150 200 215 71 80 187 84 179 235 71 14 27 0 159 145 132 91 170 69 4 77 60 185 156 0 93 72 67 68 185 235 189 29 178 144 42 227 35 59 27 0 1 128 102 251 156 92 43 108 29 62 40 215 42 15 198 118 248 50 157 25 129 219 206 70 124 249 193 82 122 51 209 211 166 198 129 204 78 210 123 124 106 191 69 198 115 9 187 105 170 16 189 25 66 30 61 214 177 166 27 0 66 226 174 106 52 23 197 236 68 43 88 169 245 109 62 252 144 219 129 154 127 116 74 210 197 53 171 56 209 150 200 215 71 80 187 84 179 235 71 14 27 0 159 145 132 91 170 69 4 77 60 185 156 0 93 72 67 68 185 235 189 29 178 144 42 227 35 59 27 0 0 36 22 179 130 104 210 45 171 95 5 140 87 49 187 173 206 147 141 26 50 138 30 228 117 173 59 57 138 187 138 30 79 102 10 0 0 0 1 36 22 179 130 104 210 45 171 95 5 140 87 49 187 173 206 147 141 26 50 138 30 228 117 173 59 57 138 187 138 30 79 102 10 0 0 0 0 44 245 222 165 23 160 186 7 2 211 238 67 132 133 157 254 89 199 178 45 73 151 206 197 254 6 172 31 88 199 204 161 72 65 160 25 246 142 223 123 52 172 12 6 0 1 44 245 222 165 23 160 186 7 2 211 238 67 132 133 157 254 89 199 178 45 73 151 206 197 254 6 172 31 88 199 204 161 72 65 160 25 246 142 223 123 52 172 12 6 0 0 108 222 47 68 13 28 124 145 191 235 84 137 87 165 230 34 132 42 90 242 140 248 118 51 137 4 68 91 156 194 220 89 46 217 200 72 50 124 24 209 194 179 150 236 12 223 90 150 72 220 112 234 137 123 179 108 65 16 250 73 68 13 219 174 119 68 216 117 5 143 105 238 147 162 128 99 201 30 204 31 130 46 147 73 191 185 192 73 212 83 18 90 106 146 126 18 59 63 194 86 25 42 52 82 92 6 0 0 0 1 108 222 47 68 13 28 124 145 191 235 84 137 87 165 230 34 132 42 90 242 140 248 118 51 137 4 68 91 156 194 220 89 46 217 200 72 50 124 24 209 194 179 150 236 12 223 90 150 72 220 112 234 137 123 179 108 65 16 250 73 68 13 219 174 119 68 216 117 5 143 105 238 147 162 128 99 201 30 204 31 130 46 147 73 191 185 192 73 212 83 18 90 106 146 126 18 59 63 194 86 25 42 52 82 92 6 0 0 0 0 40 74 204 182 19 172 57 74 106 161 11 250 172 174 63 33 117 146 108 133 108 20 20 28 215 14 216 35 120 250 72 181 31 75 237 185 64 125 38 30 0 1 40 74 204 182 19 172 57 74 106 161 11 250 172 174 63 33 117 146 108 133 108 20 20 28 215 14 216 35 120 250 72 181 31 75 237 185 64 125 38 30 0 0 32 39 90 158 132 213 173 24 145 199 200 240 251 85 122 152 148 224 56 26 234 37 58 180 82 137 37 60 8 144 85 118 5 1 32 39 90 158 132 213 173 24 145 199 200 240 251 85 122 152 148 224 56 26 234 37 58 180 82 137 37 60 8 144 85 118 5 0 4 138 84 0 0 1 4 138 84 0 0 0 120 6 116 242 108 248 14 140 127 243 249 231 147 68 151 120 38 231 8 34 6 106 4 211 91 3 66 139 242 76 75 130 178 43 63 174 27 78 5 184 165 84 187 23 158 140 41 71 59 22 178 59 239 6 145 6 103 216 172 37 75 231 145 41 56 213 208 27 181 52 16 183 237 193 209 238 106 47 104 214 15 82 217 35 168 104 64 76 104 111 95 151 127 241 27 86 63 95 186 251 237 14 164 119 230 211 234 83 245 143 10 244 120 135 32 125 144 92 8 189 0 1 120 6 116 242 108 248 14 140 127 243 249 231 147 68 151 120 38 231 8 34 6 106 4 211 91 3 66 139 242 76 75 130 178 43 63 174 27 78 5 184 165 84 187 23 158 140 41 71 59 22 178 59 239 6 145 6 103 216 172 37 75 231 145 41 56 213 208 27 181 52 16 183 237 193 209 238 106 47 104 214 15 82 217 35 168 104 64 76 104 111 95 151 127 241 27 86 63 95 186 251 237 14 164 119 230 211 234 83 245 143 10 244 120 135 32 125 144 92 8 189 0 0 28 169 164 216 5 23 138 199 97 227 119 26 63 15 87 131 107 175 132 108 223 46 17 101 176 195 214 100 232 1 28 169 164 216 5 23 138 199 97 227 119 26 63 15 87 131 107 175 132 108 223 46 17 101 176 195 214 100 232 0 48 8 170 244 92 198 184 32 64 24 118 241 85 66 189 103 28 33 244 60 230 74 7 243 100 2 1 93 74 149 165 150 65 102 220 228 186 83 101 123 141 123 109 182 122 105 0 0 0 1 48 8 170 244 92 198 184 32 64 24 118 241 85 66 189 103 28 33 244 60 230 74 7 243 100 2 1 93 74 149 165 150 65 102 220 228 186 83 101 123 141 123 109 182 122 105 0 0 0 0 120 12 158 20 122 77 167 176 86 158 51 230 99 136 241 101 17 244 121 59 87 103 26 111 205 53 244 235 242 229 169 15 224 95 241 248 47 71 217 197 177 238 46 133 175 43 178 246 61 15 216 239 68 140 164 169 9 17 109 185 231 2 170 188 140 250 123 194 232 88 232 26 60 214 152 106 181 39 234 136 137 58 62 209 190 251 104 89 19 70 178 56 124 109 18 185 167 142 60 123 228 26 54 187 187 148 203 130 114 248 49 111 198 191 107 86 222 3 0 0 0 1 120 12 158 20 122 77 167 176 86 158 51 230 99 136 241 101 17 244 121 59 87 103 26 111 205 53 244 235 242 229 169 15 224 95 241 248 47 71 217 197 177 238 46 133 175 43 178 246 61 15 216 239 68 140 164 169 9 17 109 185 231 2 170 188 140 250 123 194 232 88 232 26 60 214 152 106 181 39 234 136 137 58 62 209 190 251 104 89 19 70 178 56 124 109 18 185 167 142 60 123 228 26 54 187 187 148 203 130 114 248 49 111 198 191 107 86 222 3 0 0 0 0 28 105 179 233 126 169 174 183 251 227 117 195 127 211 122 235 34 108 161 29 184 19 156 152 225 139 6 0 0 1 28 105 179 233 126 169 174 183 251 227 117 195 127 211 122 235 34 108 161 29 184 19 156 152 225 139 6 0 0 0 112 107 214 160 47 12 148 181 229 136 85 57 117 58 49 175 91 20 92 201 244 247 222 130 215 158 98 242 146 190 210 201 180 77 219 243 130 159 138 227 73 54 255 186 170 144 106 170 66 197 143 127 162 210 122 37 99 171 90 242 115 145 250 57 97 176 167 16 225 132 49 247 59 22 25 236 36 64 252 125 139 145 215 22 92 228 240 79 244 183 178 12 93 194 169 217 159 169 69 179 171 96 5 35 137 33 198 85 237 12 0 0 0 1 112 107 214 160 47 12 148 181 229 136 85 57 117 58 49 175 91 20 92 201 244 247 222 130 215 158 98 242 146 190 210 201 180 77 219 243 130 159 138 227 73 54 255 186 170 144 106 170 66 197 143 127 162 210 122 37 99 171 90 242 115 145 250 57 97 176 167 16 225 132 49 247 59 22 25 236 36 64 252 125 139 145 215 22 92 228 240 79 244 183 178 12 93 194 169 217 159 169 69 179 171 96 5 35 137 33 198 85 237 12 0 0 0 0 36 151 236 140 234 49 95 40 136 48 181 242 198 107 168 119 133 33 148 222 230 48 187 177 235 54 92 147 200 220 8 9 80 3 0 0 0 1 36 151 236 140 234 49 95 40 136 48 181 242 198 107 168 119 133 33 148 222 230 48 187 177 235 54 92 147 200 220 8 9 80 3 0 0 0 0 124 86 110 24 37 97 222 163 92 216 221 199 229 79 95 24 16 74 176 194 98 40 169 140 19 1 205 231 70 185 36 255 18 60 202 214 208 120 214 232 112 172 228 176 230 94 127 136 74 11 44 237 249 68 118 244 151 238 132 77 38 186 252 14 206 146 197 57 245 192 244 29 199 74 59 195 148 69 151 165 29 107 182 98 147 191 148 189 200 184 33 221 44 102 236 230 236 155 131 213 212 11 163 71 97 118 61 218 110 71 189 129 17 181 221 250 137 80 48 231 83 123 104 6 0 1 124 86 110 24 37 97 222 163 92 216 221 199 229 79 95 24 16 74 176 194 98 40 169 140 19 1 205 231 70 185 36 255 18 60 202 214 208 120 214 232 112 172 228 176 230 94 127 136 74 11 44 237 249 68 118 244 151 238 132 77 38 186 252 14 206 146 197 57 245 192 244 29 199 74 59 195 148 69 151 165 29 107 182 98 147 191 148 189 200 184 33 221 44 102 236 230 236 155 131 213 212 11 163 71 97 118 61 218 110 71 189 129 17 181 221 250 137 80 48 231 83 123 104 6 0 0 80 243 176 186 126 186 98 210 179 162 140 92 40 240 184 134 105 0 157 103 36 223 108 115 65 73 109 222 11 169 151 183 215 249 45 86 167 172 26 95 222 130 112 5 193 174 61 230 154 13 242 26 53 125 184 23 119 6 116 85 81 153 220 146 138 224 238 242 57 50 24 89 106 223 20 181 86 96 139 192 0 1 80 243 176 186 126 186 98 210 179 162 140 92 40 240 184 134 105 0 157 103 36 223 108 115 65 73 109 222 11 169 151 183 215 249 45 86 167 172 26 95 222 130 112 5 193 174 61 230 154 13 242 26 53 125 184 23 119 6 116 85 81 153 220 146 138 224 238 242 57 50 24 89 106 223 20 181 86 96 139 192 0 0 100 118 189 65 124 187 124 164 181 40 78 215 14 181 239 248 104 169 212 147 203 95 26 103 54 4 23 49 26 46 240 31 57 71 166 134 221 134 146 219 246 49 7 96 225 138 247 198 120 76 183 208 201 100 120 240 147 60 217 93 237 131 48 5 244 23 233 221 83 229 102 159 120 118 222 134 200 86 131 193 55 124 183 137 148 160 79 166 91 219 240 18 236 83 72 210 216 101 108 113 68 1 100 118 189 65 124 187 124 164 181 40 78 215 14 181 239 248 104 169 212 147 203 95 26 103 54 4 23 49 26 46 240 31 57 71 166 134 221 134 146 219 246 49 7 96 225 138 247 198 120 76 183 208 201 100 120 240 147 60 217 93 237 131 48 5 244 23 233 221 83 229 102 159 120 118 222 134 200 86 131 193 55 124 183 137 148 160 79 166 91 219 240 18 236 83 72 210 216 101 108 113 68 0 64 6 22 71 2 163 86 17 242 164 39 109 95 160 109 98 241 37 105 112 221 113 19 63 140 96 143 87 147 41 36 27 242 55 158 16 197 226 52 235 172 133 128 179 181 251 150 32 196 95 149 76 252 69 10 230 30 27 76 224 226 22 0 0 0 1 64 6 22 71 2 163 86 17 242 164 39 109 95 160 109 98 241 37 105 112 221 113 19 63 140 96 143 87 147 41 36 27 242 55 158 16 197 226 52 235 172 133 128 179 181 251 150 32 196 95 149 76 252 69 10 230 30 27 76 224 226 22 0 0 0 0 128 30 130 103 205 32 243 152 123 79 104 19 33 177 209 230 129 178 23 223 13 94 146 223 35 144 45 101 240 232 191 92 122 248 142 90 70 70 227 195 145 191 197 239 106 26 240 233 128 67 75 182 93 107 72 57 103 203 190 221 242 163 253 180 159 146 253 103 81 208 252 1 223 226 217 70 222 240 174 35 247 131 232 230 20 50 149 109 33 236 254 14 141 202 198 2 116 168 2 254 234 211 168 142 232 27 76 165 171 140 74 161 29 242 180 17 221 182 28 140 165 153 167 81 47 103 223 10 0 1 128 30 130 103 205 32 243 152 123 79 104 19 33 177 209 230 129 178 23 223 13 94 146 223 35 144 45 101 240 232 191 92 122 248 142 90 70 70 227 195 145 191 197 239 106 26 240 233 128 67 75 182 93 107 72 57 103 203 190 221 242 163 253 180 159 146 253 103 81 208 252 1 223 226 217 70 222 240 174 35 247 131 232 230 20 50 149 109 33 236 254 14 141 202 198 2 116 168 2 254 234 211 168 142 232 27 76 165 171 140 74 161 29 242 180 17 221 182 28 140 165 153 167 81 47 103 223 10 0 0 48 150 89 14 218 228 227 23 162 153 39 113 34 98 183 194 25 93 68 57 205 28 17 6 69 82 191 227 207 100 5 188 188 211 209 220 205 0 146 180 251 104 31 119 91 104 1 0 0 1 48 150 89 14 218 228 227 23 162 153 39 113 34 98 183 194 25 93 68 57 205 28 17 6 69 82 191 227 207 100 5 188 188 211 209 220 205 0 146 180 251 104 31 119 91 104 1 0 0 0 12 3 75 50 16 21 240 211 149 188 0 0 0 1 12 3 75 50 16 21 240 211 149 188 0 0 0 0 108 9 115 108 68 232 102 178 176 69 243 217 106 209 14 224 172 167 195 216 60 119 98 115 232 110 47 157 119 32 78 224 248 168 59 100 46 75 172 15 39 92 41 128 82 192 201 101 82 196 22 185 109 161 212 23 243 181 215 188 245 6 226 125 224 129 249 88 9 231 215 83 203 0 1 5 225 190 75 41 64 109 105 106 37 227 156 251 13 180 250 104 241 34 187 224 79 84 147 11 127 35 64 121 111 143 12 0 0 1 108 9 115 108 68 232 102 178 176 69 243 217 106 209 14 224 172 167 195 216 60 119 98 115 232 110 47 157 119 32 78 224 248 168 59 100 46 75 172 15 39 92 41 128 82 192 201 101 82 196 22 185 109 161 212 23 243 181 215 188 245 6 226 125 224 129 249 88 9 231 215 83 203 0 1 5 225 190 75 41 64 109 105 106 37 227 156 251 13 180 250 104 241 34 187 224 79 84 147 11 127 35 64 121 111 143 12 0 0 0 104 240 35 102 147 107 156 95 120 67 253 248 209 46 242 211 131 200 126 89 191 255 206 143 125 130 26 163 12 32 199 40 52 166 9 162 113 48 113 189 72 74 18 54 6 99 229 23 115 221 174 124 195 235 108 45 255 154 244 4 181 164 158 200 138 77 6 47 98 56 178 18 75 69 235 225 139 243 201 174 122 249 136 131 59 94 43 192 187 209 135 159 123 162 213 155 59 184 180 92 174 163 38 0 0 1 104 240 35 102 147 107 156 95 120 67 253 248 209 46 242 211 131 200 126 89 191 255 206 143 125 130 26 163 12 32 199 40 52 166 9 162 113 48 113 189 72 74 18 54 6 99 229 23 115 221 174 124 195 235 108 45 255 154 244 4 181 164 158 200 138 77 6 47 98 56 178 18 75 69 235 225 139 243 201 174 122 249 136 131 59 94 43 192 187 209 135 159 123 162 213 155 59 184 180 92 174 163 38 0 0 0 76 34 44 18 251 194 132 188 93 116 144 0 196 15 253 248 161 78 252 35 178 201 70 179 45 245 2 116 179 119 55 186 117 38 191 38 14 139 33 131 60 35 40 0 31 70 182 70 55 167 178 147 137 65 30 203 93 63 183 214 107 14 138 249 141 189 54 170 164 36 100 151 195 142 247 0 1 1 76 34 44 18 251 194 132 188 93 116 144 0 196 15 253 248 161 78 252 35 178 201 70 179 45 245 2 116 179 119 55 186 117 38 191 38 14 139 33 131 60 35 40 0 31 70 182 70 55 167 178 147 137 65 30 203 93 63 183 214 107 14 138 249 141 189 54 170 164 36 100 151 195 142 247 0 1 0 76 79 161 242 148 36 174 71 109 70 137 27 172 124 50 231 16 178 199 67 3 78 176 12 53 168 39 253 247 13 21 191 128 38 67 12 15 248 234 73 154 95 171 123 99 52 42 32 229 121 208 121 181 151 154 103 80 7 41 152 206 129 106 69 208 252 39 163 130 241 51 69 244 247 1 5 121 1 76 79 161 242 148 36 174 71 109 70 137 27 172 124 50 231 16 178 199 67 3 78 176 12 53 168 39 253 247 13 21 191 128 38 67 12 15 248 234 73 154 95 171 123 99 52 42 32 229 121 208 121 181 151 154 103 80 7 41 152 206 129 106 69 208 252 39 163 130 241 51 69 244 247 1 5 121 0 72 100 73 185 231 4 112 172 84 227 126 234 51 137 221 166 192 16 157 41 74 141 121 176 14 135 245 170 38 223 239 224 207 235 164 137 197 183 43 64 0 12 216 240 6 61 23 238 237 201 225 110 75 253 193 88 168 185 218 43 229 167 97 130 102 214 215 134 90 204 214 6 0 1 72 100 73 185 231 4 112 172 84 227 126 234 51 137 221 166 192 16 157 41 74 141 121 176 14 135 245 170 38 223 239 224 207 235 164 137 197 183 43 64 0 12 216 240 6 61 23 238 237 201 225 110 75 253 193 88 168 185 218 43 229 167 97 130 102 214 215 134 90 204 214 6 0 0 96 219 203 221 208 224 159 230 219 11 100 135 13 4 127 208 103 80 48 213 73 245 143 157 122 152 178 240 239 253 126 244 30 239 102 14 87 67 14 70 171 224 149 9 84 107 219 85 124 178 61 180 47 218 225 163 193 116 189 130 11 146 64 142 109 98 176 49 26 100 226 15 127 68 213 132 163 70 52 46 10 247 185 6 76 76 180 190 205 124 250 143 171 106 50 0 0 1 96 219 203 221 208 224 159 230 219 11 100 135 13 4 127 208 103 80 48 213 73 245 143 157 122 152 178 240 239 253 126 244 30 239 102 14 87 67 14 70 171 224 149 9 84 107 219 85 124 178 61 180 47 218 225 163 193 116 189 130 11 146 64 142 109 98 176 49 26 100 226 15 127 68 213 132 163 70 52 46 10 247 185 6 76 76 180 190 205 124 250 143 171 106 50 0 0 0 120 217 116 20 196 181 6 137 250 178 207 36 29 215 183 251 28 156 129 254 149 110 35 250 145 188 199 148 182 206 23 143 174 147 1 195 119 32 158 253 47 241 245 160 161 23 172 143 224 166 48 241 224 180 60 40 55 163 113 65 217 210 254 250 75 125 222 20 146 22 127 207 180 19 232 245 117 4 55 117 208 11 134 81 103 44 211 65 174 30 21 186 123 156 224 41 168 144 253 5 228 247 219 192 43 85 242 13 199 36 248 50 226 239 233 47 12 212 3 0 0 1 120 217 116 20 196 181 6 137 250 178 207 36 29 215 183 251 28 156 129 254 149 110 35 250 145 188 199 148 182 206 23 143 174 147 1 195 119 32 158 253 47 241 245 160 161 23 172 143 224 166 48 241 224 180 60 40 55 163 113 65 217 210 254 250 75 125 222 20 146 22 127 207 180 19 232 245 117 4 55 117 208 11 134 81 103 44 211 65 174 30 21 186 123 156 224 41 168 144 253 5 228 247 219 192 43 85 242 13 199 36 248 50 226 239 233 47 12 212 3 0 0 0 92 94 102 6 123 33 254 222 92 46 211 170 116 91 71 221 6 87 3 144 77 231 38 4 248 202 135 81 159 100 30 21 111 114 225 52 100 98 124 212 26 0 192 179 224 123 152 186 35 198 14 32 169 2 28 91 12 93 226 2 56 176 203 77 155 47 63 21 131 158 27 252 110 108 46 2 205 114 62 224 151 97 97 251 197 34 255 29 36 247 1 0 0 1 92 94 102 6 123 33 254 222 92 46 211 170 116 91 71 221 6 87 3 144 77 231 38 4 248 202 135 81 159 100 30 21 111 114 225 52 100 98 124 212 26 0 192 179 224 123 152 186 35 198 14 32 169 2 28 91 12 93 226 2 56 176 203 77 155 47 63 21 131 158 27 252 110 108 46 2 205 114 62 224 151 97 97 251 197 34 255 29 36 247 1 0 0 0 40 213 155 45 217 157 63 158 214 179 178 45 31 167 171 88 99 135 205 98 19 102 250 247 155 144 144 184 108 185 216 134 183 188 174 39 244 81 0 0 0 1 40 213 155 45 217 157 63 158 214 179 178 45 31 167 171 88 99 135 205 98 19 102 250 247 155 144 144 184 108 185 216 134 183 188 174 39 244 81 0 0 0 0 88 143 221 144 99 71 55 91 51 132 189 170 46 209 246 137 32 255 61 37 105 68 54 129 75 74 69 209 169 194 207 43 51 79 37 156 64 84 31 147 49 63 100 147 137 157 156 108 126 196 246 233 144 88 124 237 160 146 162 62 111 128 118 225 95 72 29 227 189 100 72 148 6 238 216 74 124 168 129 102 216 225 99 39 71 85 27 125 1 1 88 143 221 144 99 71 55 91 51 132 189 170 46 209 246 137 32 255 61 37 105 68 54 129 75 74 69 209 169 194 207 43 51 79 37 156 64 84 31 147 49 63 100 147 137 157 156 108 126 196 246 233 144 88 124 237 160 146 162 62 111 128 118 225 95 72 29 227 189 100 72 148 6 238 216 74 124 168 129 102 216 225 99 39 71 85 27 125 1 0 100 154 59 8 214 250 135 152 185 224 10 174 79 58 146 203 236 143 30 28 53 247 75 23 46 61 14 153 250 130 43 106 99 3 114 97 134 236 14 79 134 253 241 239 191 59 197 179 112 33 255 64 2 35 190 107 61 57 182 11 43 73 118 122 234 246 107 208 63 148 121 113 255 201 200 66 134 64 61 39 183 76 142 5 123 90 113 163 171 46 238 92 52 235 152 239 73 131 0 0 0 1 100 154 59 8 214 250 135 152 185 224 10 174 79 58 146 203 236 143 30 28 53 247 75 23 46 61 14 153 250 130 43 106 99 3 114 97 134 236 14 79 134 253 241 239 191 59 197 179 112 33 255 64 2 35 190 107 61 57 182 11 43 73 118 122 234 246 107 208 63 148 121 113 255 201 200 66 134 64 61 39 183 76 142 5 123 90 113 163 171 46 238 92 52 235 152 239 73 131 0 0 0 0 52 1 38 134 41 29 170 88 160 233 145 132 85 205 36 47 50 209 38 92 196 100 126 18 43 149 60 250 154 84 98 23 80 203 61 86 37 43 121 198 250 148 214 237 218 106 31 30 52 22 223 4 0 1 52 1 38 134 41 29 170 88 160 233 145 132 85 205 36 47 50 209 38 92 196 100 126 18 43 149 60 250 154 84 98 23 80 203 61 86 37 43 121 198 250 148 214 237 218 106 31 30 52 22 223 4 0 0 100 215 110 214 250 112 196 210 135 44 106 41 81 231 208 226 187 180 124 169 6 101 223 131 248 7 59 123 141 245 45 155 111 191 45 243 237 47 248 47 233 222 27 53 116 18 174 176 121 70 241 49 29 54 248 100 119 186 7 84 242 46 154 182 14 231 49 213 37 52 160 79 242 253 165 71 241 87 50 98 158 58 249 163 206 75 138 146 172 232 178 183 137 30 153 204 59 17 0 0 0 1 100 215 110 214 250 112 196 210 135 44 106 41 81 231 208 226 187 180 124 169 6 101 223 131 248 7 59 123 141 245 45 155 111 191 45 243 237 47 248 47 233 222 27 53 116 18 174 176 121 70 241 49 29 54 248 100 119 186 7 84 242 46 154 182 14 231 49 213 37 52 160 79 242 253 165 71 241 87 50 98 158 58 249 163 206 75 138 146 172 232 178 183 137 30 153 204 59 17 0 0 0 0 72 226 229 244 239 100 207 243 201 63 193 44 114 73 253 9 63 199 34 184 12 34 181 93 167 70 38 119 43 136 85 61 200 200 27 101 128 179 178 146 168 152 45 163 217 123 227 167 40 116 43 26 248 220 216 17 126 35 228 188 102 203 130 134 149 10 8 144 5 253 158 4 186 1 72 226 229 244 239 100 207 243 201 63 193 44 114 73 253 9 63 199 34 184 12 34 181 93 167 70 38 119 43 136 85 61 200 200 27 101 128 179 178 146 168 152 45 163 217 123 227 167 40 116 43 26 248 220 216 17 126 35 228 188 102 203 130 134 149 10 8 144 5 253 158 4 186 0 52 94 1 134 237 212 63 41 32 13 66 189 152 40 150 138 20 124 116 62 140 23 229 83 230 85 61 202 206 29 102 39 28 182 37 173 34 29 120 65 193 196 145 186 204 173 159 132 183 115 0 0 0 1 52 94 1 134 237 212 63 41 32 13 66 189 152 40 150 138 20 124 116 62 140 23 229 83 230 85 61 202 206 29 102 39 28 182 37 173 34 29 120 65 193 196 145 186 204 173 159 132 183 115 0 0 0 0 28 172 92 233 22 126 43 253 105 39 155 94 185 44 226 60 168 170 203 19 17 108 152 224 242 209 228 43 0 1 28 172 92 233 22 126 43 253 105 39 155 94 185 44 226 60 168 170 203 19 17 108 152 224 242 209 228 43 0 0 76 76 207 112 0 53 15 20 52 176 51 179 204 201 221 199 215 198 47 180 117 63 178 218 237 224 7 238 83 244 101 132 225 169 14 209 41 140 228 33 125 131 46 213 26 149 30 9 194 107 82 49 220 69 57 63 176 58 107 164 112 122 14 78 212 162 39 156 86 247 229 146 165 114 0 0 0 1 76 76 207 112 0 53 15 20 52 176 51 179 204 201 221 199 215 198 47 180 117 63 178 218 237 224 7 238 83 244 101 132 225 169 14 209 41 140 228 33 125 131 46 213 26 149 30 9 194 107 82 49 220 69 57 63 176 58 107 164 112 122 14 78 212 162 39 156 86 247 229 146 165 114 0 0 0 0 68 251 218 113 128 106 254 150 82 225 107 92 157 216 88 77 244 99 157 1 98 151 72 130 185 194 141 147 195 242 231 156 213 157 138 94 239 99 178 106 231 226 192 202 146 27 248 176 225 209 153 7 186 7 50 120 183 212 126 50 190 105 134 94 43 155 64 125 6 1 68 251 218 113 128 106 254 150 82 225 107 92 157 216 88 77 244 99 157 1 98 151 72 130 185 194 141 147 195 242 231 156 213 157 138 94 239 99 178 106 231 226 192 202 146 27 248 176 225 209 153 7 186 7 50 120 183 212 126 50 190 105 134 94 43 155 64 125 6 0 12 209 108 141 185 23 199 10 211 38 178 0 0 1 12 209 108 141 185 23 199 10 211 38 178 0 0 0 52 154 210 229 202 23 25 195 186 179 6 6 199 170 59 41 215 172 79 12 201 40 201 127 61 38 143 15 80 87 105 227 146 32 219 224 101 136 180 226 214 34 112 110 89 114 34 177 212 74 212 106 6 1 52 154 210 229 202 23 25 195 186 179 6 6 199 170 59 41 215 172 79 12 201 40 201 127 61 38 143 15 80 87 105 227 146 32 219 224 101 136 180 226 214 34 112 110 89 114 34 177 212 74 212 106 6 0 8 100 135 7 25 201 86 188 2 1 8 100 135 7 25 201 86 188 2 0 48 109 14 55 6 23 219 83 134 16 29 117 179 205 24 254 117 81 245 228 115 29 245 23 120 19 143 171 136 217 234 105 176 54 200 15 132 252 117 219 34 127 228 168 111 203 2 0 0 1 48 109 14 55 6 23 219 83 134 16 29 117 179 205 24 254 117 81 245 228 115 29 245 23 120 19 143 171 136 217 234 105 176 54 200 15 132 252 117 219 34 127 228 168 111 203 2 0 0 0 68 189 190 26 27 18 245 206 184 37 205 141 131 212 0 127 17 122 35 32 152 79 200 69 20 74 161 75 208 251 152 129 241 33 169 49 200 168 98 138 154 1 201 2 137 248 97 109 91 51 92 185 150 229 58 56 137 252 73 190 235 237 144 130 251 152 190 194 0 1 68 189 190 26 27 18 245 206 184 37 205 141 131 212 0 127 17 122 35 32 152 79 200 69 20 74 161 75 208 251 152 129 241 33 169 49 200 168 98 138 154 1 201 2 137 248 97 109 91 51 92 185 150 229 58 56 137 252 73 190 235 237 144 130 251 152 190 194 0 0 76 207 251 128 22 249 241 160 213 177 156 81 63 226 211 104 180 224 253 194 155 185 4 55 89 47 114 245 7 150 248 180 92 51 125 222 246 36 165 153 246 217 229 236 207 71 52 111 220 127 235 87 138 209 205 186 72 20 6 162 209 199 59 28 143 29 40 129 110 196 31 138 191 210 255 29 45 1 76 207 251 128 22 249 241 160 213 177 156 81 63 226 211 104 180 224 253 194 155 185 4 55 89 47 114 245 7 150 248 180 92 51 125 222 246 36 165 153 246 217 229 236 207 71 52 111 220 127 235 87 138 209 205 186 72 20 6 162 209 199 59 28 143 29 40 129 110 196 31 138 191 210 255 29 45 0 100 34 105 251 242 196 29 25 191 13 57 197 24 56 214 71 179 84 16 80 235 205 101 211 115 134 253 214 216 165 198 158 63 242 99 11 173 46 16 134 146 11 55 237 102 192 144 220 243 114 208 229 213 0 218 193 226 110 51 184 76 183 51 12 136 3 140 173 50 245 19 16 15 166 7 51 67 86 66 36 164 78 174 152 214 177 106 255 43 110 199 185 127 79 12 140 96 198 60 160 102 1 100 34 105 251 242 196 29 25 191 13 57 197 24 56 214 71 179 84 16 80 235 205 101 211 115 134 253 214 216 165 198 158 63 242 99 11 173 46 16 134 146 11 55 237 102 192 144 220 243 114 208 229 213 0 218 193 226 110 51 184 76 183 51 12 136 3 140 173 50 245 19 16 15 166 7 51 67 86 66 36 164 78 174 152 214 177 106 255 43 110 199 185 127 79 12 140 96 198 60 160 102 0 48 151 50 240 113 2 240 195 92 196 249 19 127 144 80 105 89 196 158 41 252 36 228 125 87 223 38 175 180 160 171 217 8 107 79 15 49 18 96 89 233 92 36 110 25 144 127 0 0 1 48 151 50 240 113 2 240 195 92 196 249 19 127 144 80 105 89 196 158 41 252 36 228 125 87 223 38 175 180 160 171 217 8 107 79 15 49 18 96 89 233 92 36 110 25 144 127 0 0 0 120 220 111 204 84 44 130 217 213 198 206 117 146 194 10 147 26 202 239 193 244 37 205 135 142 56 32 249 87 168 225 194 69 224 42 44 177 94 77 94 53 91 119 184 126 54 91 178 96 62 34 235 141 251 16 10 187 157 41 198 141 167 60 123 73 194 190 232 21 131 122 95 94 19 80 131 0 80 156 191 71 14 30 148 74 123 179 226 24 229 233 126 54 51 237 55 92 191 74 239 104 108 155 8 161 36 74 77 55 133 160 139 207 243 154 53 85 221 49 167 10 1 120 220 111 204 84 44 130 217 213 198 206 117 146 194 10 147 26 202 239 193 244 37 205 135 142 56 32 249 87 168 225 194 69 224 42 44 177 94 77 94 53 91 119 184 126 54 91 178 96 62 34 235 141 251 16 10 187 157 41 198 141 167 60 123 73 194 190 232 21 131 122 95 94 19 80 131 0 80 156 191 71 14 30 148 74 123 179 226 24 229 233 126 54 51 237 55 92 191 74 239 104 108 155 8 161 36 74 77 55 133 160 139 207 243 154 53 85 221 49 167 10 0 124 66 181 48 69 164 115 164 70 89 243 215 101 175 87 235 67 90 105 180 75 47 179 125 207 87 227 224 42 29 17 96 44 75 24 133 40 113 24 135 93 121 59 20 187 166 95 86 53 166 161 86 99 27 119 194 156 39 207 117 76 162 208 78 38 249 64 104 247 119 216 98 220 191 85 93 88 71 67 153 91 210 137 198 13 84 67 129 197 58 103 183 253 111 51 7 9 158 89 134 12 78 19 173 133 159 221 103 18 198 238 156 111 121 141 61 104 245 244 206 7 118 23 61 26 1 124 66 181 48 69 164 115 164 70 89 243 215 101 175 87 235 67 90 105 180 75 47 179 125 207 87 227 224 42 29 17 96 44 75 24 133 40 113 24 135 93 121 59 20 187 166 95 86 53 166 161 86 99 27 119 194 156 39 207 117 76 162 208 78 38 249 64 104 247 119 216 98 220 191 85 93 88 71 67 153 91 210 137 198 13 84 67 129 197 58 103 183 253 111 51 7 9 158 89 134 12 78 19 173 133 159 221 103 18 198 238 156 111 121 141 61 104 245 244 206 7 118 23 61 26 0 20 53 158 199 70 207 47 204 168 124 200 230 150 58 31 240 105 24 0 0 0 1 20 53 158 199 70 207 47 204 168 124 200 230 150 58 31 240 105 24 0 0 0 0 20 44 216 57 222 28 184 85 185 207 83 175 57 221 190 218 247 150 5 9 117 1 20 44 216 57 222 28 184 85 185 207 83 175 57 221 190 218 247 150 5 9 117 0 76 175 96 135 121 157 156 226 243 56 243 161 244 255 180 122 46 138 241 238 214 239 108 19 34 52 247 13 21 71 51 38 3 155 181 28 151 11 194 1 127 89 168 237 141 215 157 75 68 132 79 117 113 7 76 199 243 237 109 44 236 225 116 106 60 77 216 199 25 21 97 116 178 189 0 0 0 1 76 175 96 135 121 157 156 226 243 56 243 161 244 255 180 122 46 138 241 238 214 239 108 19 34 52 247 13 21 71 51 38 3 155 181 28 151 11 194 1 127 89 168 237 141 215 157 75 68 132 79 117 113 7 76 199 243 237 109 44 236 225 116 106 60 77 216 199 25 21 97 116 178 189 0 0 0 0 52 202 229 137 148 154 5 233 137 136 40 13 16 169 117 12 152 29 203 90 68 73 225 131 236 45 230 124 112 148 9 55 131 227 132 115 213 238 10 238 61 255 35 176 204 139 43 31 180 151 38 28 0 1 52 202 229 137 148 154 5 233 137 136 40 13 16 169 117 12 152 29 203 90 68 73 225 131 236 45 230 124 112 148 9 55 131 227 132 115 213 238 10 238 61 255 35 176 204 139 43 31 180 151 38 28 0 0 60 235 98 102 1 125 196 43 138 213 140 187 232 56 154 133 53 67 83 164 240 80 16 61 51 160 252 62 34 180 200 255 184 169 84 36 69 72 6 78 7 150 152 1 13 250 97 34 132 97 157 173 219 115 157 86 128 104 9 243 111 1 60 235 98 102 1 125 196 43 138 213 140 187 232 56 154 133 53 67 83 164 240 80 16 61 51 160 252 62 34 180 200 255 184 169 84 36 69 72 6 78 7 150 152 1 13 250 97 34 132 97 157 173 219 115 157 86 128 104 9 243 111 0 52 110 238 199 119 170 141 33 211 193 225 211 65 71 230 113 169 249 100 145 146 90 130 63 193 239 121 202 133 82 133 133 53 185 111 84 99 172 253 212 36 243 170 231 244 134 94 195 226 84 11 0 0 1 52 110 238 199 119 170 141 33 211 193 225 211 65 71 230 113 169 249 100 145 146 90 130 63 193 239 121 202 133 82 133 133 53 185 111 84 99 172 253 212 36 243 170 231 244 134 94 195 226 84 11 0 0 0 4 106 26 0 0 1 4 106 26 0 0 0 96 55 152 73 157 134 83 107 104 157 196 53 164 2 160 29 214 41 144 154 185 26 161 178 109 113 19 105 96 157 167 54 34 103 42 200 114 164 164 104 227 67 103 2 210 8 116 188 135 174 40 62 91 190 166 226 195 250 41 221 152 30 57 61 233 241 101 130 10 63 191 169 19 148 16 188 139 65 132 105 232 99 49 96 137 153 204 114 212 66 194 182 129 146 0 0 0 1 96 55 152 73 157 134 83 107 104 157 196 53 164 2 160 29 214 41 144 154 185 26 161 178 109 113 19 105 96 157 167 54 34 103 42 200 114 164 164 104 227 67 103 2 210 8 116 188 135 174 40 62 91 190 166 226 195 250 41 221 152 30 57 61 233 241 101 130 10 63 191 169 19 148 16 188 139 65 132 105 232 99 49 96 137 153 204 114 212 66 194 182 129 146 0 0 0 0 44 215 234 168 32 222 91 186 69 25 72 240 30 59 198 171 46 112 186 148 235 6 205 150 234 108 20 173 83 144 129 239 167 253 152 161 53 229 15 251 248 211 51 238 4 1 44 215 234 168 32 222 91 186 69 25 72 240 30 59 198 171 46 112 186 148 235 6 205 150 234 108 20 173 83 144 129 239 167 253 152 161 53 229 15 251 248 211 51 238 4 0 52 189 135 39 96 175 218 106 164 199 43 5 248 111 65 179 200 109 31 254 255 126 80 190 92 65 237 178 43 23 153 58 10 9 97 226 246 198 243 117 174 24 218 33 231 128 164 157 128 151 190 0 0 1 52 189 135 39 96 175 218 106 164 199 43 5 248 111 65 179 200 109 31 254 255 126 80 190 92 65 237 178 43 23 153 58 10 9 97 226 246 198 243 117 174 24 218 33 231 128 164 157 128 151 190 0 0 0 24 239 56 183 78 45 154 165 142 40 239 207 3 167 77 151 86 239 3 11 209 79 0 0 0 1 24 239 56 183 78 45 154 165 142 40 239 207 3 167 77 151 86 239 3 11 209 79 0 0 0 0 120 130 184 128 68 207 249 83 80 33 163 142 32 202 202 145 151 232 83 195 182 58 116 163 243 175 189 47 35 208 19 5 175 59 26 2 94 105 183 66 152 203 200 32 2 26 199 8 181 211 38 92 194 207 149 100 136 89 145 224 231 176 230 123 222 97 24 81 114 242 42 179 218 87 154 251 235 53 36 114 72 81 186 89 13 87 192 22 111 97 8 245 31 80 244 208 101 196 210 93 76 175 182 133 13 74 7 144 34 186 229 253 42 25 120 196 253 145 203 34 0 1 120 130 184 128 68 207 249 83 80 33 163 142 32 202 202 145 151 232 83 195 182 58 116 163 243 175 189 47 35 208 19 5 175 59 26 2 94 105 183 66 152 203 200 32 2 26 199 8 181 211 38 92 194 207 149 100 136 89 145 224 231 176 230 123 222 97 24 81 114 242 42 179 218 87 154 251 235 53 36 114 72 81 186 89 13 87 192 22 111 97 8 245 31 80 244 208 101 196 210 93 76 175 182 133 13 74 7 144 34 186 229 253 42 25 120 196 253 145 203 34 0 0 104 177 43 20 0 140 140 47 23 231 84 40 77 91 102 55 158 233 117 153 218 25 252 97 80 128 163 220 227 30 148 92 31 92 123 175 218 18 184 223 122 242 27 52 233 221 142 227 84 175 165 149 51 30 52 3 112 242 251 194 123 45 37 79 48 197 65 154 217 117 129 115 239 202 140 4 219 13 126 27 135 146 152 96 151 82 124 223 118 24 195 194 175 191 121 134 29 81 56 114 151 40 33 0 0 1 104 177 43 20 0 140 140 47 23 231 84 40 77 91 102 55 158 233 117 153 218 25 252 97 80 128 163 220 227 30 148 92 31 92 123 175 218 18 184 223 122 242 27 52 233 221 142 227 84 175 165 149 51 30 52 3 112 242 251 194 123 45 37 79 48 197 65 154 217 117 129 115 239 202 140 4 219 13 126 27 135 146 152 96 151 82 124 223 118 24 195 194 175 191 121 134 29 81 56 114 151 40 33 0 0 0 56 226 202 173 6 149 116 30 177 236 7 160 65 73 122 165 121 36 223 128 217 110 236 2 31 124 183 89 207 252 6 59 84 137 76 50 38 76 184 223 208 6 130 201 233 242 76 37 234 218 223 126 70 103 75 198 17 1 56 226 202 173 6 149 116 30 177 236 7 160 65 73 122 165 121 36 223 128 217 110 236 2 31 124 183 89 207 252 6 59 84 137 76 50 38 76 184 223 208 6 130 201 233 242 76 37 234 218 223 126 70 103 75 198 17 0 40 143 226 94 34 87 62 30 33 239 85 79 57 245 111 192 126 163 234 125 86 103 149 210 150 242 12 158 215 135 158 29 55 151 47 136 29 80 31 37 252 1 40 143 226 94 34 87 62 30 33 239 85 79 57 245 111 192 126 163 234 125 86 103 149 210 150 242 12 158 215 135 158 29 55 151 47 136 29 80 31 37 252 0 112 181 27 23 157 82 76 57 33 149 24 89 155 221 152 127 94 66 164 208 210 148 182 78 234 184 210 234 72 255 16 100 229 47 58 156 105 247 59 66 253 245 169 65 48 79 130 122 51 190 191 81 1 34 200 63 2 65 127 95 41 111 129 132 49 253 173 167 197 104 55 130 14 224 162 119 109 66 142 188 11 186 58 39 173 207 179 212 181 61 158 3 218 40 241 226 184 47 0 88 220 135 180 224 61 164 169 34 189 151 91 0 0 1 112 181 27 23 157 82 76 57 33 149 24 89 155 221 152 127 94 66 164 208 210 148 182 78 234 184 210 234 72 255 16 100 229 47 58 156 105 247 59 66 253 245 169 65 48 79 130 122 51 190 191 81 1 34 200 63 2 65 127 95 41 111 129 132 49 253 173 167 197 104 55 130 14 224 162 119 109 66 142 188 11 186 58 39 173 207 179 212 181 61 158 3 218 40 241 226 184 47 0 88 220 135 180 224 61 164 169 34 189 151 91 0 0 0 68 245 37 28 124 5 215 158 136 244 187 142 156 141 44 84 13 112 140 11 136 159 80 12 232 82 107 30 135 75 126 13 223 106 21 218 151 253 45 223 202 227 61 206 171 121 209 68 8 191 131 100 178 102 54 84 51 65 145 226 154 248 80 115 68 154 209 63 76 1 68 245 37 28 124 5 215 158 136 244 187 142 156 141 44 84 13 112 140 11 136 159 80 12 232 82 107 30 135 75 126 13 223 106 21 218 151 253 45 223 202 227 61 206 171 121 209 68 8 191 131 100 178 102 54 84 51 65 145 226 154 248 80 115 68 154 209 63 76 0 80 135 137 38 34 14 3 46 79 186 179 131 28 57 25 247 29 19 45 197 193 203 121 109 165 119 101 172 185 115 171 154 177 182 27 155 85 37 5 182 213 87 183 42 234 134 15 60 0 46 192 218 165 41 22 150 148 218 236 133 178 67 163 140 233 134 213 210 71 193 23 166 26 63 204 170 123 79 127 246 26 1 80 135 137 38 34 14 3 46 79 186 179 131 28 57 25 247 29 19 45 197 193 203 121 109 165 119 101 172 185 115 171 154 177 182 27 155 85 37 5 182 213 87 183 42 234 134 15 60 0 46 192 218 165 41 22 150 148 218 236 133 178 67 163 140 233 134 213 210 71 193 23 166 26 63 204 170 123 79 127 246 26 0 24 161 11 98 151 34 241 111 106 193 28 3 100 220 97 185 34 185 14 129 244 209 10 0 0 1 24 161 11 98 151 34 241 111 106 193 28 3 100 220 97 185 34 185 14 129 244 209 10 0 0 0 16 130 229 241 126 185 171 21 95 192 161 17 185 7 19 79 20 1 16 130 229 241 126 185 171 21 95 192 161 17 185 7 19 79 20 0 80 9 13 228 66 211 156 80 135 182 180 214 181 47 183 227 46 41 12 246 131 232 90 158 5 19 60 63 252 117 169 61 164 189 193 27 141 183 254 18 152 59 130 30 176 181 167 165 190 60 186 198 100 145 152 47 75 69 203 253 237 35 74 191 49 205 55 93 241 175 147 35 169 57 234 147 255 216 2 0 0 1 80 9 13 228 66 211 156 80 135 182 180 214 181 47 183 227 46 41 12 246 131 232 90 158 5 19 60 63 252 117 169 61 164 189 193 27 141 183 254 18 152 59 130 30 176 181 167 165 190 60 186 198 100 145 152 47 75 69 203 253 237 35 74 191 49 205 55 93 241 175 147 35 169 57 234 147 255 216 2 0 0 0 64 141 139 202 76 43 47 180 136 161 170 209 0 136 207 136 36 208 145 71 130 83 221 226 101 19 151 187 159 109 224 255 62 88 129 165 22 98 27 176 90 80 16 65 129 69 250 183 187 147 190 130 199 5 11 138 101 83 65 161 2 6 0 0 0 1 64 141 139 202 76 43 47 180 136 161 170 209 0 136 207 136 36 208 145 71 130 83 221 226 101 19 151 187 159 109 224 255 62 88 129 165 22 98 27 176 90 80 16 65 129 69 250 183 187 147 190 130 199 5 11 138 101 83 65 161 2 6 0 0 0 0 36 187 72 171 67 22 57 200 41 156 125 20 118 214 230 17 121 132 100 6 245 170 66 142 117 245 148 173 113 251 22 92 19 155 30 0 0 1 36 187 72 171 67 22 57 200 41 156 125 20 118 214 230 17 121 132 100 6 245 170 66 142 117 245 148 173 113 251 22 92 19 155 30 0 0 0 44 101 58 72 216 138 4 45 140 222 69 239 13 13 50 235 67 209 36 214 49 165 77 35 96 140 27 164 215 181 180 73 146 42 130 29 96 159 153 232 94 77 175 255 20 1 44 101 58 72 216 138 4 45 140 222 69 239 13 13 50 235 67 209 36 214 49 165 77 35 96 140 27 164 215 181 180 73 146 42 130 29 96 159 153 232 94 77 175 255 20 0 84 219 224 155 211 221 151 19 144 234 158 11 45 122 35 132 149 62 141 108 208 26 84 49 255 193 206 21 192 119 23 25 107 230 224 23 255 211 84 131 200 163 22 3 191 95 246 22 164 37 9 116 62 212 138 8 160 64 31 218 139 106 242 89 216 218 255 147 91 71 129 205 194 18 209 161 119 85 170 226 225 162 83 212 20 1 84 219 224 155 211 221 151 19 144 234 158 11 45 122 35 132 149 62 141 108 208 26 84 49 255 193 206 21 192 119 23 25 107 230 224 23 255 211 84 131 200 163 22 3 191 95 246 22 164 37 9 116 62 212 138 8 160 64 31 218 139 106 242 89 216 218 255 147 91 71 129 205 194 18 209 161 119 85 170 226 225 162 83 212 20 0 68 14 156 116 249 212 16 111 35 17 9 212 224 210 14 154 158 72 254 112 138 10 30 123 27 209 114 67 151 154 58 185 70 230 39 91 161 175 96 144 42 108 176 175 129 131 222 206 150 81 39 184 66 31 183 226 159 121 73 128 206 177 92 204 53 155 0 167 103 1 68 14 156 116 249 212 16 111 35 17 9 212 224 210 14 154 158 72 254 112 138 10 30 123 27 209 114 67 151 154 58 185 70 230 39 91 161 175 96 144 42 108 176 175 129 131 222 206 150 81 39 184 66 31 183 226 159 121 73 128 206 177 92 204 53 155 0 167 103 0 92 24 127 183 77 135 143 95 88 89 95 188 40 117 29 239 121 158 197 98 117 88 96 129 197 2 191 220 182 209 38 73 53 151 197 255 5 2 62 107 10 40 43 253 32 105 98 219 212 155 202 52 7 137 199 16 43 208 83 186 41 89 60 249 93 40 107 182 175 147 127 53 185 207 74 51 82 246 167 59 57 221 250 206 122 32 222 85 116 2 0 0 0 1 92 24 127 183 77 135 143 95 88 89 95 188 40 117 29 239 121 158 197 98 117 88 96 129 197 2 191 220 182 209 38 73 53 151 197 255 5 2 62 107 10 40 43 253 32 105 98 219 212 155 202 52 7 137 199 16 43 208 83 186 41 89 60 249 93 40 107 182 175 147 127 53 185 207 74 51 82 246 167 59 57 221 250 206 122 32 222 85 116 2 0 0 0 0 92 147 237 31 71 216 196 26 132 246 73 163 25 96 43 245 7 209 8 5 54 169 7 250 78 177 89 40 0 243 40 2 158 24 11 198 234 171 172 170 64 188 187 101 123 162 237 222 202 89 40 19 173 38 211 166 45 226 3 80 235 195 110 200 92 16 163 19 117 163 211 172 5 18 87 238 191 193 83 143 189 110 113 70 107 147 246 94 49 35 15 198 45 1 92 147 237 31 71 216 196 26 132 246 73 163 25 96 43 245 7 209 8 5 54 169 7 250 78 177 89 40 0 243 40 2 158 24 11 198 234 171 172 170 64 188 187 101 123 162 237 222 202 89 40 19 173 38 211 166 45 226 3 80 235 195 110 200 92 16 163 19 117 163 211 172 5 18 87 238 191 193 83 143 189 110 113 70 107 147 246 94 49 35 15 198 45 0 96 64 61 164 44 87 227 172 18 31 65 156 146 28 18 93 184 64 206 182 188 247 38 246 148 197 40 179 134 87 253 99 200 144 207 105 35 236 191 211 141 2 166 22 69 97 111 181 148 114 108 196 62 4 205 40 5 94 207 78 159 83 52 193 205 124 45 112 37 168 234 114 146 238 213 231 94 67 171 153 42 253 122 194 188 137 165 213 50 253 178 210 172 158 19 49 97 1 96 64 61 164 44 87 227 172 18 31 65 156 146 28 18 93 184 64 206 182 188 247 38 246 148 197 40 179 134 87 253 99 200 144 207 105 35 236 191 211 141 2 166 22 69 97 111 181 148 114 108 196 62 4 205 40 5 94 207 78 159 83 52 193 205 124 45 112 37 168 234 114 146 238 213 231 94 67 171 153 42 253 122 194 188 137 165 213 50 253 178 210 172 158 19 49 97 0 128 18 25 43 69 203 163 208 25 129 70 179 87 12 27 80 85 159 26 23 217 250 145 72 121 50 16 37 139 240 158 153 146 201 8 164 249 47 152 57 202 235 15 58 45 34 201 248 69 113 190 138 170 65 10 208 146 132 110 25 228 113 14 229 109 123 49 220 88 192 96 240 71 116 139 193 10 198 27 240 251 107 253 255 213 42 221 24 113 228 220 232 119 71 248 233 220 92 90 99 190 197 160 163 32 110 191 182 102 164 156 66 22 63 71 173 246 104 8 68 245 41 178 81 182 144 193 28 0 1 128 18 25 43 69 203 163 208 25 129 70 179 87 12 27 80 85 159 26 23 217 250 145 72 121 50 16 37 139 240 158 153 146 201 8 164 249 47 152 57 202 235 15 58 45 34 201 248 69 113 190 138 170 65 10 208 146 132 110 25 228 113 14 229 109 123 49 220 88 192 96 240 71 116 139 193 10 198 27 240 251 107 253 255 213 42 221 24 113 228 220 232 119 71 248 233 220 92 90 99 190 197 160 163 32 110 191 182 102 164 156 66 22 63 71 173 246 104 8 68 245 41 178 81 182 144 193 28 0 0 60 106 111 228 235 51 226 122 218 7 64 133 195 240 189 43 175 243 131 132 104 152 3 70 2 1 203 253 95 8 193 163 40 223 43 68 152 88 4 207 245 179 156 172 179 217 24 72 255 34 91 50 116 117 25 16 159 79 126 0 0 1 60 106 111 228 235 51 226 122 218 7 64 133 195 240 189 43 175 243 131 132 104 152 3 70 2 1 203 253 95 8 193 163 40 223 43 68 152 88 4 207 245 179 156 172 179 217 24 72 255 34 91 50 116 117 25 16 159 79 126 0 0 0 96 242 78 165 200 211 109 6 120 204 217 25 19 113 152 179 73 130 49 149 173 66 167 106 162 150 87 123 191 217 234 1 44 116 181 9 66 210 127 251 186 48 185 108 188 94 122 96 63 201 235 22 186 67 42 225 10 180 91 176 96 61 82 61 81 28 92 254 57 197 179 147 78 166 147 71 129 176 7 57 241 168 104 58 31 131 207 114 100 228 122 222 33 1 0 0 0 1 96 242 78 165 200 211 109 6 120 204 217 25 19 113 152 179 73 130 49 149 173 66 167 106 162 150 87 123 191 217 234 1 44 116 181 9 66 210 127 251 186 48 185 108 188 94 122 96 63 201 235 22 186 67 42 225 10 180 91 176 96 61 82 61 81 28 92 254 57 197 179 147 78 166 147 71 129 176 7 57 241 168 104 58 31 131 207 114 100 228 122 222 33 1 0 0 0 0 12 97 77 106 250 36 19 39 116 255 76 19 0 1 12 97 77 106 250 36 19 39 116 255 76 19 0 0 120 111 83 184 168 71 100 200 47 99 200 7 122 64 223 9 88 127 36 176 17 86 69 21 128 134 171 205 233 96 184 231 129 34 199 145 56 105 1 143 43 41 220 152 215 178 124 68 220 20 206 108 104 17 70 117 37 42 80 169 70 134 89 10 29 153 175 13 143 30 175 166 31 179 51 111 40 201 178 167 176 195 238 36 55 237 111 116 105 132 211 219 6 26 164 101 240 113 151 131 108 247 150 189 114 192 163 218 28 145 0 191 98 2 111 27 49 39 0 0 0 1 120 111 83 184 168 71 100 200 47 99 200 7 122 64 223 9 88 127 36 176 17 86 69 21 128 134 171 205 233 96 184 231 129 34 199 145 56 105 1 143 43 41 220 152 215 178 124 68 220 20 206 108 104 17 70 117 37 42 80 169 70 134 89 10 29 153 175 13 143 30 175 166 31 179 51 111 40 201 178 167 176 195 238 36 55 237 111 116 105 132 211 219 6 26 164 101 240 113 151 131 108 247 150 189 114 192 163 218 28 145 0 191 98 2 111 27 49 39 0 0 0 0 32 81 112 148 108 23 32 68 197 136 108 75 125 74 153 138 193 143 46 240 12 147 141 114 195 168 154 52 204 254 27 0 0 1 32 81 112 148 108 23 32 68 197 136 108 75 125 74 153 138 193 143 46 240 12 147 141 114 195 168 154 52 204 254 27 0 0 0 68 229 45 84 95 24 25 32 216 165 111 25 116 164 115 152 232 97 207 181 82 250 83 172 4 143 100 89 243 176 103 143 89 97 174 71 138 98 227 83 33 167 157 210 208 119 156 79 89 223 158 79 207 126 107 230 151 179 67 137 75 82 190 93 51 33 0 0 0 1 68 229 45 84 95 24 25 32 216 165 111 25 116 164 115 152 232 97 207 181 82 250 83 172 4 143 100 89 243 176 103 143 89 97 174 71 138 98 227 83 33 167 157 210 208 119 156 79 89 223 158 79 207 126 107 230 151 179 67 137 75 82 190 93 51 33 0 0 0 0 120 221 101 250 13 148 219 147 8 203 24 156 18 193 222 45 207 235 157 11 245 111 54 46 193 242 190 64 24 32 5 137 205 125 176 100 17 201 24 239 205 106 167 230 189 153 124 31 64 237 182 168 183 7 51 170 88 147 80 176 116 117 47 23 224 52 179 41 43 139 109 178 28 245 173 29 90 7 170 105 16 115 2 213 39 87 247 94 160 195 0 33 49 96 68 43 87 69 180 255 100 174 99 176 29 24 104 158 236 125 224 97 89 243 65 242 94 178 0 0 0 1 120 221 101 250 13 148 219 147 8 203 24 156 18 193 222 45 207 235 157 11 245 111 54 46 193 242 190 64 24 32 5 137 205 125 176 100 17 201 24 239 205 106 167 230 189 153 124 31 64 237 182 168 183 7 51 170 88 147 80 176 116 117 47 23 224 52 179 41 43 139 109 178 28 245 173 29 90 7 170 105 16 115 2 213 39 87 247 94 160 195 0 33 49 96 68 43 87 69 180 255 100 174 99 176 29 24 104 158 236 125 224 97 89 243 65 242 94 178 0 0 0 0 72 184 253 189 224 206 45 217 58 19 82 204 156 74 148 217 108 38 0 212 209 189 122 237 87 236 106 6 235 35 39 176 243 21 191 101 210 52 159 254 224 228 116 193 110 127 138 238 156 91 101 182 243 43 212 2 192 249 29 46 143 26 92 106 122 73 98 4 82 141 13 112 16 1 72 184 253 189 224 206 45 217 58 19 82 204 156 74 148 217 108 38 0 212 209 189 122 237 87 236 106 6 235 35 39 176 243 21 191 101 210 52 159 254 224 228 116 193 110 127 138 238 156 91 101 182 243 43 212 2 192 249 29 46 143 26 92 106 122 73 98 4 82 141 13 112 16 0 20 141 65 210 229 224 235 23 20 177 164 60 252 191 64 31 44 84 216 95 0 1 20 141 65 210 229 224 235 23 20 177 164 60 252 191 64 31 44 84 216 95 0 0 68 48 154 41 124 74 158 181 70 130 132 240 230 198 88 167 2 237 114 242 9 139 158 87 188 104 154 110 210 176 38 252 92 77 243 54 213 93 179 111 60 173 65 242 154 5 78 138 79 93 20 212 247 205 148 243 182 244 13 15 150 159 207 103 38 24 0 0 0 1 68 48 154 41 124 74 158 181 70 130 132 240 230 198 88 167 2 237 114 242 9 139 158 87 188 104 154 110 210 176 38 252 92 77 243 54 213 93 179 111 60 173 65 242 154 5 78 138 79 93 20 212 247 205 148 243 182 244 13 15 150 159 207 103 38 24 0 0 0 0 108 78 251 44 163 60 65 61 73 160 130 160 8 28 61 196 90 12 152 7 115 142 7 114 17 198 170 252 19 236 254 162 201 32 45 18 43 189 44 46 90 207 184 59 237 162 203 126 224 42 136 170 154 0 222 28 154 135 82 229 44 204 68 59 154 17 125 179 36 205 42 28 134 10 215 115 12 32 14 56 173 76 9 183 175 169 7 152 168 55 94 109 58 166 129 180 156 71 14 106 140 11 108 205 121 170 23 0 0 1 108 78 251 44 163 60 65 61 73 160 130 160 8 28 61 196 90 12 152 7 115 142 7 114 17 198 170 252 19 236 254 162 201 32 45 18 43 189 44 46 90 207 184 59 237 162 203 126 224 42 136 170 154 0 222 28 154 135 82 229 44 204 68 59 154 17 125 179 36 205 42 28 134 10 215 115 12 32 14 56 173 76 9 183 175 169 7 152 168 55 94 109 58 166 129 180 156 71 14 106 140 11 108 205 121 170 23 0 0 0 60 99 133 203 247 192 63 4 144 228 175 21 211 17 186 191 58 203 241 243 89 132 220 36 39 238 217 164 218 253 0 222 143 219 114 227 127 56 66 234 167 126 143 213 130 213 113 84 86 215 204 56 188 57 9 152 64 225 239 108 6 1 60 99 133 203 247 192 63 4 144 228 175 21 211 17 186 191 58 203 241 243 89 132 220 36 39 238 217 164 218 253 0 222 143 219 114 227 127 56 66 234 167 126 143 213 130 213 113 84 86 215 204 56 188 57 9 152 64 225 239 108 6 0 72 77 228 188 235 97 138 100 91 238 49 139 79 56 188 11 184 173 83 39 221 20 245 96 38 125 60 181 72 3 128 43 118 106 90 15 200 8 233 181 34 5 7 174 190 71 134 170 210 207 164 152 232 51 89 112 82 165 188 21 114 191 123 230 238 197 193 95 140 244 0 0 0 1 72 77 228 188 235 97 138 100 91 238 49 139 79 56 188 11 184 173 83 39 221 20 245 96 38 125 60 181 72 3 128 43 118 106 90 15 200 8 233 181 34 5 7 174 190 71 134 170 210 207 164 152 232 51 89 112 82 165 188 21 114 191 123 230 238 197 193 95 140 244 0 0 0 0 72 200 145 197 200 104 129 137 228 214 164 61 15 232 3 217 235 218 189 116 152 154 227 248 233 253 158 5 97 255 64 215 227 139 23 14 251 106 37 121 16 114 173 198 111 218 117 222 246 94 169 123 172 250 61 68 19 205 181 67 85 17 104 14 254 137 136 84 247 78 166 0 0 1 72 200 145 197 200 104 129 137 228 214 164 61 15 232 3 217 235 218 189 116 152 154 227 248 233 253 158 5 97 255 64 215 227 139 23 14 251 106 37 121 16 114 173 198 111 218 117 222 246 94 169 123 172 250 61 68 19 205 181 67 85 17 104 14 254 137 136 84 247 78 166 0 0 0 128 191 181 108 55 139 94 198 152 77 78 82 43 3 109 236 227 118 234 47 173 167 61 164 86 55 233 192 147 235 37 168 97 183 33 155 177 136 201 235 222 168 48 190 137 110 204 183 228 175 147 199 33 208 144 139 202 91 20 77 67 243 128 152 254 108 127 176 61 57 40 166 158 31 208 193 11 83 26 80 21 170 235 14 210 177 151 96 197 239 137 246 114 65 165 208 148 237 25 245 124 152 104 92 83 194 136 203 136 100 251 64 2 205 220 145 219 198 171 222 38 134 250 16 34 65 224 146 28 1 128 191 181 108 55 139 94 198 152 77 78 82 43 3 109 236 227 118 234 47 173 167 61 164 86 55 233 192 147 235 37 168 97 183 33 155 177 136 201 235 222 168 48 190 137 110 204 183 228 175 147 199 33 208 144 139 202 91 20 77 67 243 128 152 254 108 127 176 61 57 40 166 158 31 208 193 11 83 26 80 21 170 235 14 210 177 151 96 197 239 137 246 114 65 165 208 148 237 25 245 124 152 104 92 83 194 136 203 136 100 251 64 2 205 220 145 219 198 171 222 38 134 250 16 34 65 224 146 28 0 60 63 224 19 125 187 26 164 208 55 163 27 59 187 247 242 95 30 57 122 111 64 134 84 248 151 190 15 136 136 161 61 28 228 22 27 68 11 3 140 252 156 29 4 41 11 48 15 96 244 213 20 233 6 76 130 58 119 15 0 0 1 60 63 224 19 125 187 26 164 208 55 163 27 59 187 247 242 95 30 57 122 111 64 134 84 248 151 190 15 136 136 161 61 28 228 22 27 68 11 3 140 252 156 29 4 41 11 48 15 96 244 213 20 233 6 76 130 58 119 15 0 0 0 12 199 42 98 80 178 185 90 221 165 35 3 0 1 12 199 42 98 80 178 185 90 221 165 35 3 0 0 112 211 92 224 84 192 161 220 29 37 84 220 160 179 136 96 15 250 25 26 167 119 216 78 12 23 28 94 80 65 148 105 37 226 205 178 88 179 130 190 233 252 123 197 227 186 157 58 116 47 213 216 8 19 202 72 179 134 248 62 205 139 137 198 65 155 154 205 249 99 56 187 14 119 158 233 203 37 34 208 100 56 19 122 70 223 132 177 96 84 56 150 254 49 2 204 7 119 253 28 226 37 130 47 153 193 3 66 88 188 3 0 0 1 112 211 92 224 84 192 161 220 29 37 84 220 160 179 136 96 15 250 25 26 167 119 216 78 12 23 28 94 80 65 148 105 37 226 205 178 88 179 130 190 233 252 123 197 227 186 157 58 116 47 213 216 8 19 202 72 179 134 248 62 205 139 137 198 65 155 154 205 249 99 56 187 14 119 158 233 203 37 34 208 100 56 19 122 70 223 132 177 96 84 56 150 254 49 2 204 7 119 253 28 226 37 130 47 153 193 3 66 88 188 3 0 0 0 60 140 122 119 39 180 83 252 77 149 191 129 134 12 141 62 96 133 98 170 229 37 197 136 97 68 58 105 144 236 92 39 65 44 221 243 133 48 202 183 51 237 155 98 163 154 52 14 169 35 49 67 177 150 145 49 75 8 0 0 0 1 60 140 122 119 39 180 83 252 77 149 191 129 134 12 141 62 96 133 98 170 229 37 197 136 97 68 58 105 144 236 92 39 65 44 221 243 133 48 202 183 51 237 155 98 163 154 52 14 169 35 49 67 177 150 145 49 75 8 0 0 0 0 80 9 61 184 172 233 13 43 45 30 119 185 68 107 159 107 243 178 49 80 0 96 120 155 240 156 53 48 213 202 121 253 151 95 14 88 52 193 70 56 174 121 49 216 9 237 188 33 131 0 202 142 97 27 187 215 252 182 119 74 239 189 124 236 151 198 110 105 243 51 188 18 131 2 91 205 73 28 4 0 0 1 80 9 61 184 172 233 13 43 45 30 119 185 68 107 159 107 243 178 49 80 0 96 120 155 240 156 53 48 213 202 121 253 151 95 14 88 52 193 70 56 174 121 49 216 9 237 188 33 131 0 202 142 97 27 187 215 252 182 119 74 239 189 124 236 151 198 110 105 243 51 188 18 131 2 91 205 73 28 4 0 0 0 16 137 77 210 245 248 194 39 160 111 226 179 107 25 44 0 0 1 16 137 77 210 245 248 194 39 160 111 226 179 107 25 44 0 0 0 64 90 160 7 65 4 255 208 168 205 179 4 240 248 31 206 47 175 22 191 41 103 114 135 198 218 147 111 186 210 117 127 71 122 113 161 142 45 56 90 182 5 196 124 208 246 99 179 100 179 27 123 2 247 71 97 127 214 218 135 188 45 50 128 224 1 64 90 160 7 65 4 255 208 168 205 179 4 240 248 31 206 47 175 22 191 41 103 114 135 198 218 147 111 186 210 117 127 71 122 113 161 142 45 56 90 182 5 196 124 208 246 99 179 100 179 27 123 2 247 71 97 127 214 218 135 188 45 50 128 224 0 124 32 154 212 74 8 112 124 62 201 195 129 67 76 87 211 0 54 149 15 2 59 137 176 18 143 114 152 101 173 81 166 31 220 98 29 15 12 143 193 186 10 214 32 46 186 56 227 96 71 41 12 224 186 32 190 104 219 81 226 245 30 187 162 67 12 238 66 40 214 182 170 73 67 29 245 229 231 140 16 172 204 90 196 85 159 37 247 5 72 91 26 80 132 221 105 222 230 137 161 192 217 213 175 8 134 107 130 255 104 27 119 215 213 254 251 29 13 165 7 158 123 144 75 0 1 124 32 154 212 74 8 112 124 62 201 195 129 67 76 87 211 0 54 149 15 2 59 137 176 18 143 114 152 101 173 81 166 31 220 98 29 15 12 143 193 186 10 214 32 46 186 56 227 96 71 41 12 224 186 32 190 104 219 81 226 245 30 187 162 67 12 238 66 40 214 182 170 73 67 29 245 229 231 140 16 172 204 90 196 85 159 37 247 5 72 91 26 80 132 221 105 222 230 137 161 192 217 213 175 8 134 107 130 255 104 27 119 215 213 254 251 29 13 165 7 158 123 144 75 0 0 128 239 164 224 84 239 190 177 240 167 255 153 207 198 235 157 218 101 209 117 110 57 158 113 160 68 242 223 109 247 33 237 229 57 186 145 95 59 2 2 106 153 109 194 24 239 241 188 61 245 211 125 238 32 54 37 170 29 197 209 243 122 188 213 28 57 75 147 38 170 70 103 138 223 146 28 2 3 91 146 155 55 185 226 218 164 234 79 158 254 61 31 183 119 148 157 226 56 110 177 236 227 71 43 83 82 161 247 161 196 1 164 120 80 136 191 208 140 164 14 207 160 41 164 244 119 14 0 0 1 128 239 164 224 84 239 190 177 240 167 255 153 207 198 235 157 218 101 209 117 110 57 158 113 160 68 242 223 109 247 33 237 229 57 186 145 95 59 2 2 106 153 109 194 24 239 241 188 61 245 211 125 238 32 54 37 170 29 197 209 243 122 188 213 28 57 75 147 38 170 70 103 138 223 146 28 2 3 91 146 155 55 185 226 218 164 234 79 158 254 61 31 183 119 148 157 226 56 110 177 236 227 71 43 83 82 161 247 161 196 1 164 120 80 136 191 208 140 164 14 207 160 41 164 244 119 14 0 0 0 4 117 0 0 0 1 4 117 0 0 0 0 8 167 54 193 64 7 0 0 0 1 8 167 54 193 64 7 0 0 0 0 100 163 255 64 83 203 87 36 149 94 156 52 123 63 158 204 53 182 225 176 27 17 88 255 208 169 246 109 207 8 64 136 93 175 10 180 61 49 204 55 239 115 146 100 212 148 94 230 159 166 203 181 245 53 40 149 146 56 136 42 224 170 147 35 157 91 64 177 60 196 240 153 231 11 78 17 76 195 177 43 46 180 131 25 83 109 63 119 225 27 57 57 188 91 199 152 23 5 174 91 1 1 100 163 255 64 83 203 87 36 149 94 156 52 123 63 158 204 53 182 225 176 27 17 88 255 208 169 246 109 207 8 64 136 93 175 10 180 61 49 204 55 239 115 146 100 212 148 94 230 159 166 203 181 245 53 40 149 146 56 136 42 224 170 147 35 157 91 64 177 60 196 240 153 231 11 78 17 76 195 177 43 46 180 131 25 83 109 63 119 225 27 57 57 188 91 199 152 23 5 174 91 1 0 128 208 138 109 225 227 64 152 153 2 96 34 145 164 157 131 115 155 183 104 200 193 145 244 83 249 93 179 164 174 212 200 81 147 54 91 88 194 241 160 176 132 66 20 118 17 178 241 133 189 166 164 150 50 53 47 1 210 38 252 20 112 90 129 36 107 137 165 239 174 138 211 103 99 134 246 76 212 170 81 144 177 228 153 120 20 106 60 41 27 26 142 218 209 123 220 154 21 104 181 204 11 114 252 113 18 117 199 212 53 240 129 51 13 132 82 236 158 244 158 200 100 104 97 216 25 1 0 0 1 128 208 138 109 225 227 64 152 153 2 96 34 145 164 157 131 115 155 183 104 200 193 145 244 83 249 93 179 164 174 212 200 81 147 54 91 88 194 241 160 176 132 66 20 118 17 178 241 133 189 166 164 150 50 53 47 1 210 38 252 20 112 90 129 36 107 137 165 239 174 138 211 103 99 134 246 76 212 170 81 144 177 228 153 120 20 106 60 41 27 26 142 218 209 123 220 154 21 104 181 204 11 114 252 113 18 117 199 212 53 240 129 51 13 132 82 236 158 244 158 200 100 104 97 216 25 1 0 0 0 108 88 85 211 200 39 154 110 112 105 110 167 223 36 85 108 22 191 129 29 63 186 205 74 174 242 107 26 190 218 113 172 16 57 224 133 51 114 134 142 127 13 144 200 97 128 128 218 245 64 148 11 69 93 180 151 220 172 202 66 76 33 187 244 229 35 36 242 82 235 185 65 36 190 117 245 110 49 206 180 71 37 57 255 79 12 219 105 17 123 252 191 204 128 157 112 79 129 176 184 68 206 60 102 245 5 0 0 0 1 108 88 85 211 200 39 154 110 112 105 110 167 223 36 85 108 22 191 129 29 63 186 205 74 174 242 107 26 190 218 113 172 16 57 224 133 51 114 134 142 127 13 144 200 97 128 128 218 245 64 148 11 69 93 180 151 220 172 202 66 76 33 187 244 229 35 36 242 82 235 185 65 36 190 117 245 110 49 206 180 71 37 57 255 79 12 219 105 17 123 252 191 204 128 157 112 79 129 176 184 68 206 60 102 245 5 0 0 0 0 48 148 74 37 131 247 53 39 99 216 223 47 18 9 18 136 179 193 37 55 33 91 7 244 148 62 42 57 238 215 181 93 98 8 101 69 225 214 132 204 75 52 125 56 24 213 200 8 0 1 48 148 74 37 131 247 53 39 99 216 223 47 18 9 18 136 179 193 37 55 33 91 7 244 148 62 42 57 238 215 181 93 98 8 101 69 225 214 132 204 75 52 125 56 24 213 200 8 0 0 112 64 220 239 97 7 93 87 27 105 63 207 167 21 133 15 227 58 185 168 161 239 33 193 128 172 161 15 59 239 186 103 81 115 178 232 138 149 139 198 145 252 165 58 125 110 48 134 211 40 242 174 206 78 255 94 75 31 44 237 250 204 57 72 109 14 12 198 119 229 200 254 145 184 208 143 78 161 97 105 128 146 153 84 125 239 129 93 98 110 23 17 170 158 50 181 141 42 47 152 191 196 3 192 174 110 71 240 178 232 63 60 2 1 112 64 220 239 97 7 93 87 27 105 63 207 167 21 133 15 227 58 185 168 161 239 33 193 128 172 161 15 59 239 186 103 81 115 178 232 138 149 139 198 145 252 165 58 125 110 48 134 211 40 242 174 206 78 255 94 75 31 44 237 250 204 57 72 109 14 12 198 119 229 200 254 145 184 208 143 78 161 97 105 128 146 153 84 125 239 129 93 98 110 23 17 170 158 50 181 141 42 47 152 191 196 3 192 174 110 71 240 178 232 63 60 2 0 88 246 113 176 137 13 123 106 26 224 128 91 228 193 243 252 242 15 62 220 212 178 30 202 11 111 66 230 161 177 241 60 253 100 208 201 117 225 216 68 197 128 174 145 95 149 128 91 24 175 176 25 111 104 124 66 50 242 232 64 14 195 239 251 14 206 116 190 242 168 216 235 100 161 227 42 119 101 187 234 141 57 76 100 11 246 212 179 0 1 88 246 113 176 137 13 123 106 26 224 128 91 228 193 243 252 242 15 62 220 212 178 30 202 11 111 66 230 161 177 241 60 253 100 208 201 117 225 216 68 197 128 174 145 95 149 128 91 24 175 176 25 111 104 124 66 50 242 232 64 14 195 239 251 14 206 116 190 242 168 216 235 100 161 227 42 119 101 187 234 141 57 76 100 11 246 212 179 0 0 12 55 56 172 187 58 164 70 156 120 82 181 1 1 12 55 56 172 187 58 164 70 156 120 82 181 1 0 48 220 172 17 9 205 156 24 242 134 168 180 223 153 206 236 236 90 205 11 224 120 98 214 90 123 243 129 201 165 220 225 6 36 19 55 134 83 178 129 164 32 109 15 112 3 0 0 0 1 48 220 172 17 9 205 156 24 242 134 168 180 223 153 206 236 236 90 205 11 224 120 98 214 90 123 243 129 201 165 220 225 6 36 19 55 134 83 178 129 164 32 109 15 112 3 0 0 0 0 52 193 141 127 34 209 21 199 67 68 204 143 241 45 80 225 214 45 100 21 48 33 106 113 2 148 20 23 159 40 68 202 237 170 200 232 238 164 242 236 171 136 93 52 242 83 251 122 237 48 94 107 2 1 52 193 141 127 34 209 21 199 67 68 204 143 241 45 80 225 214 45 100 21 48 33 106 113 2 148 20 23 159 40 68 202 237 170 200 232 238 164 242 236 171 136 93 52 242 83 251 122 237 48 94 107 2 0 112 207 93 175 32 64 88 139 55 246 244 132 171 62 72 184 11 242 187 171 224 39 148 96 224 166 191 87 37 46 103 39 90 112 54 172 23 47 108 13 198 12 169 216 111 103 124 235 201 195 16 145 148 127 191 56 185 218 102 131 173 6 53 96 126 92 36 77 124 130 17 196 69 227 95 129 211 148 22 209 224 108 6 158 123 117 167 143 244 183 183 224 114 73 162 213 215 117 83 229 22 1 63 246 155 62 220 132 1 179 0 0 0 1 112 207 93 175 32 64 88 139 55 246 244 132 171 62 72 184 11 242 187 171 224 39 148 96 224 166 191 87 37 46 103 39 90 112 54 172 23 47 108 13 198 12 169 216 111 103 124 235 201 195 16 145 148 127 191 56 185 218 102 131 173 6 53 96 126 92 36 77 124 130 17 196 69 227 95 129 211 148 22 209 224 108 6 158 123 117 167 143 244 183 183 224 114 73 162 213 215 117 83 229 22 1 63 246 155 62 220 132 1 179 0 0 0 0 36 28 191 13 194 165 182 248 57 186 139 244 112 207 96 200 175 106 69 10 84 43 142 147 3 182 157 30 118 79 126 104 103 178 4 0 0 1 36 28 191 13 194 165 182 248 57 186 139 244 112 207 96 200 175 106 69 10 84 43 142 147 3 182 157 30 118 79 126 104 103 178 4 0 0 0 8 212 78 222 60 176 142 1 0 1 8 212 78 222 60 176 142 1 0 0 104 145 100 67 42 119 254 160 245 196 55 20 64 100 33 63 183 247 83 171 250 148 186 67 236 130 147 92 200 183 110 211 65 19 126 207 82 103 84 16 52 82 16 73 99 33 53 16 184 44 239 234 154 184 25 81 99 110 127 146 231 156 136 36 208 247 98 178 87 0 213 166 40 147 186 233 193 12 80 213 75 67 53 102 157 20 22 155 226 99 40 237 217 91 216 187 183 209 192 42 100 71 58 1 0 1 104 145 100 67 42 119 254 160 245 196 55 20 64 100 33 63 183 247 83 171 250 148 186 67 236 130 147 92 200 183 110 211 65 19 126 207 82 103 84 16 52 82 16 73 99 33 53 16 184 44 239 234 154 184 25 81 99 110 127 146 231 156 136 36 208 247 98 178 87 0 213 166 40 147 186 233 193 12 80 213 75 67 53 102 157 20 22 155 226 99 40 237 217 91 216 187 183 209 192 42 100 71 58 1 0 0 88 125 231 30 134 199 198 64 150 204 149 136 212 55 251 17 236 75 172 60 103 13 112 161 248 228 121 4 183 230 238 235 81 68 11 65 213 88 3 234 7 110 178 57 19 166 16 98 54 80 226 89 131 81 212 59 162 55 8 27 204 124 98 217 79 46 181 86 195 56 99 31 161 60 165 222 210 115 82 149 178 121 38 60 117 25 0 0 0 1 88 125 231 30 134 199 198 64 150 204 149 136 212 55 251 17 236 75 172 60 103 13 112 161 248 228 121 4 183 230 238 235 81 68 11 65 213 88 3 234 7 110 178 57 19 166 16 98 54 80 226 89 131 81 212 59 162 55 8 27 204 124 98 217 79 46 181 86 195 56 99 31 161 60 165 222 210 115 82 149 178 121 38 60 117 25 0 0 0 0 56 55 79 115 254 18 45 144 84 54 237 229 99 113 73 136 188 244 213 254 183 151 168 225 91 201 252 214 57 183 27 164 26 210 240 237 171 92 108 203 191 175 120 3 12 116 19 67 245 233 249 115 5 240 214 35 0 1 56 55 79 115 254 18 45 144 84 54 237 229 99 113 73 136 188 244 213 254 183 151 168 225 91 201 252 214 57 183 27 164 26 210 240 237 171 92 108 203 191 175 120 3 12 116 19 67 245 233 249 115 5 240 214 35 0 0 96 149 115 162 199 81 74 3 202 108 176 213 7 202 56 50 54 238 173 104 162 72 222 19 198 247 157 194 69 205 163 168 225 51 180 210 187 109 152 138 75 137 178 226 20 227 183 17 221 228 33 75 27 234 181 159 148 112 168 204 13 44 22 165 143 41 73 80 229 106 191 38 16 134 93 174 157 141 69 61 203 130 122 44 39 131 2 164 80 62 160 63 47 120 166 28 140 1 96 149 115 162 199 81 74 3 202 108 176 213 7 202 56 50 54 238 173 104 162 72 222 19 198 247 157 194 69 205 163 168 225 51 180 210 187 109 152 138 75 137 178 226 20 227 183 17 221 228 33 75 27 234 181 159 148 112 168 204 13 44 22 165 143 41 73 80 229 106 191 38 16 134 93 174 157 141 69 61 203 130 122 44 39 131 2 164 80 62 160 63 47 120 166 28 140 0 120 177 73 66 225 183 251 124 47 179 14 57 160 213 173 196 252 133 171 44 98 102 65 108 221 64 128 144 3 168 15 10 125 144 93 198 204 237 212 228 129 58 93 188 102 216 32 20 56 110 5 186 118 149 188 145 246 98 31 144 172 117 122 179 94 110 54 137 100 169 159 233 64 176 40 159 107 80 248 222 131 122 156 155 179 205 124 225 233 168 165 4 29 207 254 20 155 7 94 221 210 178 187 38 94 68 88 18 166 136 0 118 237 105 249 139 19 14 0 0 0 1 120 177 73 66 225 183 251 124 47 179 14 57 160 213 173 196 252 133 171 44 98 102 65 108 221 64 128 144 3 168 15 10 125 144 93 198 204 237 212 228 129 58 93 188 102 216 32 20 56 110 5 186 118 149 188 145 246 98 31 144 172 117 122 179 94 110 54 137 100 169 159 233 64 176 40 159 107 80 248 222 131 122 156 155 179 205 124 225 233 168 165 4 29 207 254 20 155 7 94 221 210 178 187 38 94 68 88 18 166 136 0 118 237 105 249 139 19 14 0 0 0 0 20 144 98 85 217 149 150 223 122 8 206 59 47 131 103 65 155 173 0 0 0 1 20 144 98 85 217 149 150 223 122 8 206 59 47 131 103 65 155 173 0 0 0 0 24 220 124 42 149 85 78 138 33 185 250 196 15 48 72 171 163 134 2 88 6 85 142 130 2 1 24 220 124 42 149 85 78 138 33 185 250 196 15 48 72 171 163 134 2 88 6 85 142 130 2 0 128 212 122 169 156 54 138 107 16 121 38 59 69 203 193 117 75 63 180 179 47 63 118 224 1 181 147 133 85 37 60 119 246 102 174 58 174 167 181 225 245 128 208 200 176 210 149 71 173 107 114 230 170 178 95 214 144 188 159 164 164 189 64 23 6 49 14 195 137 72 104 1 156 208 120 58 123 105 78 15 149 254 83 83 82 154 175 59 38 12 161 82 182 68 227 130 172 160 38 178 36 70 164 50 135 65 11 243 87 239 25 151 184 247 104 210 135 241 219 1 53 174 119 60 149 230 43 0 0 1 128 212 122 169 156 54 138 107 16 121 38 59 69 203 193 117 75 63 180 179 47 63 118 224 1 181 147 133 85 37 60 119 246 102 174 58 174 167 181 225 245 128 208 200 176 210 149 71 173 107 114 230 170 178 95 214 144 188 159 164 164 189 64 23 6 49 14 195 137 72 104 1 156 208 120 58 123 105 78 15 149 254 83 83 82 154 175 59 38 12 161 82 182 68 227 130 172 160 38 178 36 70 164 50 135 65 11 243 87 239 25 151 184 247 104 210 135 241 219 1 53 174 119 60 149 230 43 0 0 0 36 100 188 84 92 121 120 255 45 117 214 25 143 9 160 32 125 250 37 133 240 255 252 20 126 29 171 3 237 205 240 235 36 208 143 0 0 1 36 100 188 84 92 121 120 255 45 117 214 25 143 9 160 32 125 250 37 133 240 255 252 20 126 29 171 3 237 205 240 235 36 208 143 0 0 0 16 204 130 239 246 187 158 93 86 47 108 73 1 13 0 0 0 1 16 204 130 239 246 187 158 93 86 47 108 73 1 13 0 0 0 0 20 202 131 231 76 126 186 127 132 23 187 208 204 73 5 178 40 150 139 35 0 1 20 202 131 231 76 126 186 127 132 23 187 208 204 73 5 178 40 150 139 35 0 0 40 107 133 121 0 139 12 135 132 162 235 102 36 43 184 250 87 59 67 137 202 96 199 100 109 243 118 70 114 158 224 173 101 40 37 48 74 1 0 0 0 1 40 107 133 121 0 139 12 135 132 162 235 102 36 43 184 250 87 59 67 137 202 96 199 100 109 243 118 70 114 158 224 173 101 40 37 48 74 1 0 0 0 0 20 102 233 199 173 120 192 172 230 96 54 194 151 124 92 161 206 20 63 0 0 1 20 102 233 199 173 120 192 172 230 96 54 194 151 124 92 161 206 20 63 0 0 0 104 100 11 95 76 33 185 232 209 233 63 34 185 176 109 189 253 110 207 211 238 172 100 29 184 164 214 167 6 238 105 2 20 159 93 77 69 163 157 21 207 95 133 129 211 104 170 34 230 70 233 190 110 110 143 167 140 190 151 103 146 32 227 27 255 248 240 157 241 20 32 236 100 44 139 162 28 213 191 101 140 119 176 40 84 199 138 241 56 14 243 128 9 9 244 235 30 65 225 224 112 146 250 26 0 1 104 100 11 95 76 33 185 232 209 233 63 34 185 176 109 189 253 110 207 211 238 172 100 29 184 164 214 167 6 238 105 2 20 159 93 77 69 163 157 21 207 95 133 129 211 104 170 34 230 70 233 190 110 110 143 167 140 190 151 103 146 32 227 27 255 248 240 157 241 20 32 236 100 44 139 162 28 213 191 101 140 119 176 40 84 199 138 241 56 14 243 128 9 9 244 235 30 65 225 224 112 146 250 26 0 0 112 182 231 30 134 177 100 37 122 104 11 71 195 133 25 28 169 0 181 147 130 44 177 101 57 112 42 199 21 101 103 140 223 42 216 201 189 53 195 100 237 238 71 248 113 40 44 240 38 199 64 195 184 81 25 41 68 92 218 4 53 122 241 204 51 58 42 144 93 242 88 103 109 196 188 0 52 79 84 246 121 89 177 54 12 27 96 80 73 210 243 157 157 69 16 99 156 41 206 86 47 228 138 204 240 83 60 157 254 252 73 192 5 1 112 182 231 30 134 177 100 37 122 104 11 71 195 133 25 28 169 0 181 147 130 44 177 101 57 112 42 199 21 101 103 140 223 42 216 201 189 53 195 100 237 238 71 248 113 40 44 240 38 199 64 195 184 81 25 41 68 92 218 4 53 122 241 204 51 58 42 144 93 242 88 103 109 196 188 0 52 79 84 246 121 89 177 54 12 27 96 80 73 210 243 157 157 69 16 99 156 41 206 86 47 228 138 204 240 83 60 157 254 252 73 192 5 0 12 197 213 123 115 98 52 254 70 238 15 1 0 1 12 197 213 123 115 98 52 254 70 238 15 1 0 0 76 210 145 122 99 89 37 131 47 52 147 113 130 64 191 58 127 124 89 27 75 1 37 219 223 7 191 140 168 223 254 58 21 31 33 247 253 167 137 36 155 41 0 231 239 197 12 2 35 195 249 194 240 216 58 92 5 213 221 245 127 195 161 21 118 66 85 175 221 8 222 64 201 103 150 0 0 1 76 210 145 122 99 89 37 131 47 52 147 113 130 64 191 58 127 124 89 27 75 1 37 219 223 7 191 140 168 223 254 58 21 31 33 247 253 167 137 36 155 41 0 231 239 197 12 2 35 195 249 194 240 216 58 92 5 213 221 245 127 195 161 21 118 66 85 175 221 8 222 64 201 103 150 0 0 0 84 102 17 96 82 154 52 112 87 18 167 167 218 54 218 124 208 194 201 83 97 231 176 221 100 220 46 62 248 6 192 115 8 87 141 125 98 123 239 88 101 67 173 98 197 3 232 107 94 225 39 234 38 220 115 81 68 201 24 107 126 207 211 147 102 232 111 120 175 151 194 198 220 102 170 182 69 63 31 181 226 6 0 0 0 1 84 102 17 96 82 154 52 112 87 18 167 167 218 54 218 124 208 194 201 83 97 231 176 221 100 220 46 62 248 6 192 115 8 87 141 125 98 123 239 88 101 67 173 98 197 3 232 107 94 225 39 234 38 220 115 81 68 201 24 107 126 207 211 147 102 232 111 120 175 151 194 198 220 102 170 182 69 63 31 181 226 6 0 0 0 0 72 145 142 130 152 168 95 187 252 167 72 111 60 173 234 4 233 25 77 201 212 221 165 137 12 169 149 226 137 232 12 31 136 171 31 255 243 138 160 179 185 30 246 120 97 97 100 77 175 51 130 43 32 46 143 163 120 150 96 104 169 233 159 139 198 126 120 21 227 79 54 10 0 1 72 145 142 130 152 168 95 187 252 167 72 111 60 173 234 4 233 25 77 201 212 221 165 137 12 169 149 226 137 232 12 31 136 171 31 255 243 138 160 179 185 30 246 120 97 97 100 77 175 51 130 43 32 46 143 163 120 150 96 104 169 233 159 139 198 126 120 21 227 79 54 10 0 0 4 209 5 0 0 1 4 209 5 0 0 0 20 69 29 214 123 179 196 196 154 251 96 42 73 71 146 179 99 47 210 101 0 1 20 69 29 214 123 179 196 196 154 251 96 42 73 71 146 179 99 47 210 101 0 0 88 205 231 92 64 63 136 90 54 204 92 82 240 111 88 87 211 205 64 177 174 111 246 250 90 188 132 108 77 132 226 209 192 221 34 204 124 101 65 183 13 73 28 188 123 178 61 12 115 7 113 85 201 249 122 39 164 5 195 152 12 24 213 221 225 91 183 40 236 164 234 105 15 207 109 160 192 144 206 42 56 17 71 51 153 182 149 229 1 1 88 205 231 92 64 63 136 90 54 204 92 82 240 111 88 87 211 205 64 177 174 111 246 250 90 188 132 108 77 132 226 209 192 221 34 204 124 101 65 183 13 73 28 188 123 178 61 12 115 7 113 85 201 249 122 39 164 5 195 152 12 24 213 221 225 91 183 40 236 164 234 105 15 207 109 160 192 144 206 42 56 17 71 51 153 182 149 229 1 0 112 75 185 2 45 158 234 42 220 77 129 40 207 111 250 118 209 102 233 123 133 227 197 44 57 196 23 50 237 189 56 114 42 117 188 70 201 140 176 85 119 26 80 196 78 38 152 73 81 60 72 29 44 30 96 127 77 209 43 84 19 238 161 199 121 222 254 69 226 80 194 175 85 135 165 209 175 199 237 223 219 141 82 63 115 118 194 96 58 8 45 138 219 118 118 250 164 228 179 178 255 210 12 129 255 206 164 214 156 233 1 0 0 1 112 75 185 2 45 158 234 42 220 77 129 40 207 111 250 118 209 102 233 123 133 227 197 44 57 196 23 50 237 189 56 114 42 117 188 70 201 140 176 85 119 26 80 196 78 38 152 73 81 60 72 29 44 30 96 127 77 209 43 84 19 238 161 199 121 222 254 69 226 80 194 175 85 135 165 209 175 199 237 223 219 141 82 63 115 118 194 96 58 8 45 138 219 118 118 250 164 228 179 178 255 210 12 129 255 206 164 214 156 233 1 0 0 0 72 170 113 192 138 104 174 124 39 73 93 28 193 169 216 164 220 91 84 152 21 86 210 138 141 248 203 166 85 144 162 254 201 183 85 193 224 116 40 113 190 178 244 129 164 250 249 19 14 209 96 142 161 190 213 129 69 159 67 19 1 205 41 215 144 51 30 49 29 6 0 0 0 1 72 170 113 192 138 104 174 124 39 73 93 28 193 169 216 164 220 91 84 152 21 86 210 138 141 248 203 166 85 144 162 254 201 183 85 193 224 116 40 113 190 178 244 129 164 250 249 19 14 209 96 142 161 190 213 129 69 159 67 19 1 205 41 215 144 51 30 49 29 6 0 0 0 0 80 187 125 249 0 237 185 92 151 185 34 111 175 129 204 191 155 242 60 103 220 201 34 29 144 204 63 230 124 192 11 86 89 46 248 84 65 216 118 216 186 101 34 52 12 183 171 200 31 196 236 206 37 26 50 4 49 58 103 122 211 219 34 244 124 191 195 111 184 185 248 253 224 239 127 121 202 148 98 106 14 1 80 187 125 249 0 237 185 92 151 185 34 111 175 129 204 191 155 242 60 103 220 201 34 29 144 204 63 230 124 192 11 86 89 46 248 84 65 216 118 216 186 101 34 52 12 183 171 200 31 196 236 206 37 26 50 4 49 58 103 122 211 219 34 244 124 191 195 111 184 185 248 253 224 239 127 121 202 148 98 106 14 0 60 139 102 172 114 149 72 104 165 114 58 106 15 225 235 97 205 254 36 224 45 49 116 146 137 86 251 107 88 136 139 83 17 137 15 7 72 222 67 112 165 159 252 189 213 77 46 142 192 37 63 205 124 221 187 30 104 5 0 0 0 1 60 139 102 172 114 149 72 104 165 114 58 106 15 225 235 97 205 254 36 224 45 49 116 146 137 86 251 107 88 136 139 83 17 137 15 7 72 222 67 112 165 159 252 189 213 77 46 142 192 37 63 205 124 221 187 30 104 5 0 0 0 0 48 193 117 186 128 69 247 91 107 62 131 175 40 131 137 103 76 253 5 75 34 122 71 127 130 217 242 2 7 156 145 247 63 191 243 59 172 98 22 239 18 159 250 155 96 146 0 0 0 1 48 193 117 186 128 69 247 91 107 62 131 175 40 131 137 103 76 253 5 75 34 122 71 127 130 217 242 2 7 156 145 247 63 191 243 59 172 98 22 239 18 159 250 155 96 146 0 0 0 0 28 47 51 76 163 249 78 98 148 84 63 232 105 55 224 47 211 142 180 28 84 89 211 77 14 249 46 0 0 1 28 47 51 76 163 249 78 98 148 84 63 232 105 55 224 47 211 142 180 28 84 89 211 77 14 249 46 0 0 0 68 201 214 155 246 50 22 166 239 223 78 244 233 195 105 89 119 99 157 184 116 51 233 12 83 167 255 76 111 102 220 89 20 93 143 234 73 99 250 59 120 26 217 181 201 39 66 23 209 115 214 70 225 241 60 167 247 136 252 1 227 55 151 13 131 195 45 0 0 1 68 201 214 155 246 50 22 166 239 223 78 244 233 195 105 89 119 99 157 184 116 51 233 12 83 167 255 76 111 102 220 89 20 93 143 234 73 99 250 59 120 26 217 181 201 39 66 23 209 115 214 70 225 241 60 167 247 136 252 1 227 55 151 13 131 195 45 0 0 0 20 23 30 33 8 157 238 224 164 246 31 43 191 176 252 7 205 45 242 0 0 1 20 23 30 33 8 157 238 224 164 246 31 43 191 176 252 7 205 45 242 0 0 0 52 54 228 32 91 115 93 129 151 246 253 217 44 135 61 82 191 178 138 66 53 138 127 124 132 49 110 155 83 6 68 149 49 137 123 196 184 39 167 125 47 74 249 193 203 43 79 83 101 134 133 9 11 1 52 54 228 32 91 115 93 129 151 246 253 217 44 135 61 82 191 178 138 66 53 138 127 124 132 49 110 155 83 6 68 149 49 137 123 196 184 39 167 125 47 74 249 193 203 43 79 83 101 134 133 9 11 0 52 77 188 100 119 111 50 9 100 13 63 121 125 142 166 34 201 103 64 166 45 83 205 159 233 137 246 116 27 220 206 160 89 216 10 52 203 22 78 211 51 23 240 179 183 83 170 242 111 240 0 0 0 1 52 77 188 100 119 111 50 9 100 13 63 121 125 142 166 34 201 103 64 166 45 83 205 159 233 137 246 116 27 220 206 160 89 216 10 52 203 22 78 211 51 23 240 179 183 83 170 242 111 240 0 0 0 0 12 183 62 167 189 129 14 105 162 209 89 0 0 1 12 183 62 167 189 129 14 105 162 209 89 0 0 0 100 118 204 239 47 128 120 188 223 1 55 39 227 110 234 226 46 9 49 105 96 118 213 142 45 148 25 46 222 99 148 85 221 31 128 11 140 49 253 179 116 86 166 9 89 85 77 43 213 244 104 94 141 180 94 152 53 231 238 203 17 49 2 219 158 139 90 32 173 163 68 117 8 23 52 205 75 107 41 4 131 110 118 52 89 83 200 125 45 226 180 48 90 244 16 175 35 209 5 0 0 1 100 118 204 239 47 128 120 188 223 1 55 39 227 110 234 226 46 9 49 105 96 118 213 142 45 148 25 46 222 99 148 85 221 31 128 11 140 49 253 179 116 86 166 9 89 85 77 43 213 244 104 94 141 180 94 152 53 231 238 203 17 49 2 219 158 139 90 32 173 163 68 117 8 23 52 205 75 107 41 4 131 110 118 52 89 83 200 125 45 226 180 48 90 244 16 175 35 209 5 0 0 0 32 141 129 3 16 248 10 239 222 142 76 62 151 42 178 39 242 64 15 167 154 168 11 249 175 85 5 12 3 103 49 42 0 1 32 141 129 3 16 248 10 239 222 142 76 62 151 42 178 39 242 64 15 167 154 168 11 249 175 85 5 12 3 103 49 42 0 0 8 123 78 196 123 153 10 0 0 1 8 123 78 196 123 153 10 0 0 0 16 144 212 195 123 171 191 34 243 189 164 67 38 150 212 224 39 1 16 144 212 195 123 171 191 34 243 189 164 67 38 150 212 224 39 0 32 187 134 178 60 106 197 246 170 105 173 38 215 230 126 251 232 114 84 137 220 128 251 54 111 198 172 1 114 19 30 189 175 1 32 187 134 178 60 106 197 246 170 105 173 38 215 230 126 251 232 114 84 137 220 128 251 54 111 198 172 1 114 19 30 189 175 0 24 143 215 216 189 149 84 197 67 202 64 106 120 162 162 86 42 64 51 134 144 124 43 171 16 1 24 143 215 216 189 149 84 197 67 202 64 106 120 162 162 86 42 64 51 134 144 124 43 171 16 0 68 139 212 65 201 234 213 89 222 141 127 253 158 87 57 57 116 99 73 197 165 146 10 238 243 162 67 87 231 145 147 216 148 210 201 209 126 220 255 168 121 230 233 9 201 51 185 90 86 120 23 45 86 96 77 163 130 157 206 192 50 201 33 37 54 59 0 0 0 1 68 139 212 65 201 234 213 89 222 141 127 253 158 87 57 57 116 99 73 197 165 146 10 238 243 162 67 87 231 145 147 216 148 210 201 209 126 220 255 168 121 230 233 9 201 51 185 90 86 120 23 45 86 96 77 163 130 157 206 192 50 201 33 37 54 59 0 0 0 0 32 23 231 42 113 193 81 226 51 220 131 214 166 146 8 75 191 48 0 176 34 36 39 225 46 186 62 45 29 56 240 98 0 1 32 23 231 42 113 193 81 226 51 220 131 214 166 146 8 75 191 48 0 176 34 36 39 225 46 186 62 45 29 56 240 98 0 0 108 227 163 90 90 118 151 96 241 208 91 153 230 68 148 109 36 156 59 108 3 56 117 211 213 19 39 240 123 158 82 0 37 126 14 223 103 223 22 131 216 204 69 250 101 220 238 12 18 77 151 114 103 62 43 207 60 13 44 63 145 155 196 15 104 68 124 226 214 9 255 2 209 143 177 56 5 128 66 245 24 171 251 123 103 175 179 158 169 79 76 238 144 42 92 164 86 181 59 182 45 185 118 125 221 29 2 0 0 1 108 227 163 90 90 118 151 96 241 208 91 153 230 68 148 109 36 156 59 108 3 56 117 211 213 19 39 240 123 158 82 0 37 126 14 223 103 223 22 131 216 204 69 250 101 220 238 12 18 77 151 114 103 62 43 207 60 13 44 63 145 155 196 15 104 68 124 226 214 9 255 2 209 143 177 56 5 128 66 245 24 171 251 123 103 175 179 158 169 79 76 238 144 42 92 164 86 181 59 182 45 185 118 125 221 29 2 0 0 0 56 21 205 7 125 176 60 227 180 194 177 238 254 236 214 253 45 120 92 88 238 119 13 43 164 250 120 212 254 127 151 28 105 87 83 93 136 139 49 151 198 102 118 229 122 40 245 156 201 162 113 68 119 67 16 0 0 1 56 21 205 7 125 176 60 227 180 194 177 238 254 236 214 253 45 120 92 88 238 119 13 43 164 250 120 212 254 127 151 28 105 87 83 93 136 139 49 151 198 102 118 229 122 40 245 156 201 162 113 68 119 67 16 0 0 0 128 109 98 40 183 212 31 133 44 220 177 117 246 95 158 65 148 190 211 252 136 162 225 177 247 115 56 178 10 194 128 11 57 161 119 91 128 227 125 160 201 170 74 199 20 117 57 205 164 167 39 140 51 104 152 111 244 236 125 79 209 50 96 221 6 70 174 222 210 141 0 0 38 91 25 23 175 171 151 185 223 189 29 181 4 186 136 186 187 211 92 240 132 239 86 157 142 233 42 105 221 144 98 224 139 152 138 40 2 75 65 232 64 78 37 25 85 43 247 17 170 71 235 54 68 95 61 0 0 1 128 109 98 40 183 212 31 133 44 220 177 117 246 95 158 65 148 190 211 252 136 162 225 177 247 115 56 178 10 194 128 11 57 161 119 91 128 227 125 160 201 170 74 199 20 117 57 205 164 167 39 140 51 104 152 111 244 236 125 79 209 50 96 221 6 70 174 222 210 141 0 0 38 91 25 23 175 171 151 185 223 189 29 181 4 186 136 186 187 211 92 240 132 239 86 157 142 233 42 105 221 144 98 224 139 152 138 40 2 75 65 232 64 78 37 25 85 43 247 17 170 71 235 54 68 95 61 0 0 0 8 84 104 15 69 62 160 26 0 1 8 84 104 15 69 62 160 26 0 0 108 219 65 187 13 190 48 46 122 32 188 62 55 54 62 116 201 244 243 89 151 14 43 21 29 19 142 33 75 56 94 48 19 170 145 179 161 25 76 133 125 215 133 4 159 74 89 201 157 226 92 172 10 213 88 179 123 109 36 223 242 66 12 21 230 200 219 144 151 19 8 235 54 85 254 74 95 63 248 92 164 209 97 251 119 65 142 10 170 247 216 222 98 38 21 72 54 73 122 224 248 221 198 101 236 254 0 0 0 1 108 219 65 187 13 190 48 46 122 32 188 62 55 54 62 116 201 244 243 89 151 14 43 21 29 19 142 33 75 56 94 48 19 170 145 179 161 25 76 133 125 215 133 4 159 74 89 201 157 226 92 172 10 213 88 179 123 109 36 223 242 66 12 21 230 200 219 144 151 19 8 235 54 85 254 74 95 63 248 92 164 209 97 251 119 65 142 10 170 247 216 222 98 38 21 72 54 73 122 224 248 221 198 101 236 254 0 0 0 0 116 173 131 100 228 57 121 99 67 36 188 26 116 195 11 33 238 99 149 244 192 69 122 152 142 206 32 93 57 158 59 204 109 129 133 85 46 84 246 35 199 170 91 5 153 166 135 136 100 219 159 177 96 71 252 20 164 194 225 242 95 219 102 176 247 177 135 49 219 166 200 159 163 69 215 174 34 15 87 114 111 202 124 88 204 39 19 12 146 233 34 22 85 241 111 63 103 250 222 19 62 55 235 240 190 151 122 115 229 120 69 13 175 97 196 211 28 1 116 173 131 100 228 57 121 99 67 36 188 26 116 195 11 33 238 99 149 244 192 69 122 152 142 206 32 93 57 158 59 204 109 129 133 85 46 84 246 35 199 170 91 5 153 166 135 136 100 219 159 177 96 71 252 20 164 194 225 242 95 219 102 176 247 177 135 49 219 166 200 159 163 69 215 174 34 15 87 114 111 202 124 88 204 39 19 12 146 233 34 22 85 241 111 63 103 250 222 19 62 55 235 240 190 151 122 115 229 120 69 13 175 97 196 211 28 0 40 243 42 248 54 150 57 118 223 89 213 123 0 145 11 121 246 65 78 171 9 235 26 93 69 20 253 245 14 109 46 33 35 29 254 140 52 122 13 60 0 1 40 243 42 248 54 150 57 118 223 89 213 123 0 145 11 121 246 65 78 171 9 235 26 93 69 20 253 245 14 109 46 33 35 29 254 140 52 122 13 60 0 0 124 203 79 238 32 121 29 119 220 119 105 16 43 194 81 73 221 217 2 148 227 212 111 94 30 4 186 210 125 205 136 245 32 214 39 108 83 11 185 216 199 221 176 13 218 150 42 152 40 224 210 120 250 254 120 131 79 250 21 126 178 2 237 252 78 209 43 98 114 190 99 82 138 216 142 31 167 59 58 104 199 119 105 205 151 40 188 42 120 215 171 111 159 24 71 230 74 3 175 149 59 28 47 26 232 212 124 173 155 1 51 182 82 59 115 81 68 151 198 197 107 41 0 0 0 1 124 203 79 238 32 121 29 119 220 119 105 16 43 194 81 73 221 217 2 148 227 212 111 94 30 4 186 210 125 205 136 245 32 214 39 108 83 11 185 216 199 221 176 13 218 150 42 152 40 224 210 120 250 254 120 131 79 250 21 126 178 2 237 252 78 209 43 98 114 190 99 82 138 216 142 31 167 59 58 104 199 119 105 205 151 40 188 42 120 215 171 111 159 24 71 230 74 3 175 149 59 28 47 26 232 212 124 173 155 1 51 182 82 59 115 81 68 151 198 197 107 41 0 0 0 0 8 70 47 94 78 85 213 4 0 1 8 70 47 94 78 85 213 4 0 0 64 168 239 3 109 249 109 253 64 147 102 173 10 159 193 47 134 235 24 116 111 234 17 218 47 133 118 130 4 234 130 216 79 86 7 158 19 179 226 92 28 11 213 95 197 165 161 196 126 158 172 83 45 60 0 243 82 11 125 51 88 204 253 201 0 1 64 168 239 3 109 249 109 253 64 147 102 173 10 159 193 47 134 235 24 116 111 234 17 218 47 133 118 130 4 234 130 216 79 86 7 158 19 179 226 92 28 11 213 95 197 165 161 196 126 158 172 83 45 60 0 243 82 11 125 51 88 204 253 201 0 0 32 91 8 155 0 244 185 150 213 21 51 193 238 33 114 252 243 203 63 197 56 17 152 0 158 202 81 224 155 176 168 48 8 1 32 91 8 155 0 244 185 150 213 21 51 193 238 33 114 252 243 203 63 197 56 17 152 0 158 202 81 224 155 176 168 48 8 0 64 237 110 141 244 234 81 71 9 84 235 128 228 166 210 171 84 207 172 13 18 245 134 71 141 15 168 153 177 38 185 201 244 241 170 222 1 133 147 146 102 43 229 200 175 199 75 172 190 162 84 189 67 156 147 154 31 13 207 129 50 200 231 74 0 1 64 237 110 141 244 234 81 71 9 84 235 128 228 166 210 171 84 207 172 13 18 245 134 71 141 15 168 153 177 38 185 201 244 241 170 222 1 133 147 146 102 43 229 200 175 199 75 172 190 162 84 189 67 156 147 154 31 13 207 129 50 200 231 74 0 0 72 87 52 91 18 47 239 64 167 1 198 52 25 230 164 41 73 76 171 61 96 213 30 252 201 4 21 212 155 40 229 150 154 204 69 5 231 234 118 236 96 115 165 148 146 43 62 108 172 9 72 82 112 145 170 221 58 127 30 73 27 88 182 208 159 212 102 122 105 69 67 0 0 1 72 87 52 91 18 47 239 64 167 1 198 52 25 230 164 41 73 76 171 61 96 213 30 252 201 4 21 212 155 40 229 150 154 204 69 5 231 234 118 236 96 115 165 148 146 43 62 108 172 9 72 82 112 145 170 221 58 127 30 73 27 88 182 208 159 212 102 122 105 69 67 0 0 0 44 64 172 114 48 214 193 164 216 67 60 29 158 200 157 119 130 148 115 28 173 33 19 100 127 6 67 27 159 246 211 0 250 103 226 195 106 155 248 97 202 123 209 221 13 1 44 64 172 114 48 214 193 164 216 67 60 29 158 200 157 119 130 148 115 28 173 33 19 100 127 6 67 27 159 246 211 0 250 103 226 195 106 155 248 97 202 123 209 221 13 0 116 81 252 110 197 13 166 231 72 130 41 106 65 232 254 107 124 243 255 107 207 47 194 183 40 150 50 4 210 204 224 43 196 247 122 120 215 166 135 245 209 137 61 188 138 187 74 103 184 183 141 129 116 149 165 53 145 106 74 23 238 142 63 216 57 144 68 13 165 129 66 25 38 206 230 110 91 93 226 41 154 75 235 92 163 186 140 230 191 218 201 127 59 108 139 3 252 44 100 3 234 46 162 34 110 218 167 38 61 218 67 214 231 20 40 0 0 1 116 81 252 110 197 13 166 231 72 130 41 106 65 232 254 107 124 243 255 107 207 47 194 183 40 150 50 4 210 204 224 43 196 247 122 120 215 166 135 245 209 137 61 188 138 187 74 103 184 183 141 129 116 149 165 53 145 106 74 23 238 142 63 216 57 144 68 13 165 129 66 25 38 206 230 110 91 93 226 41 154 75 235 92 163 186 140 230 191 218 201 127 59 108 139 3 252 44 100 3 234 46 162 34 110 218 167 38 61 218 67 214 231 20 40 0 0 0 116 243 247 18 11 29 244 71 100 171 9 7 235 135 165 185 174 82 125 144 46 101 141 39 25 219 161 166 142 138 73 193 151 231 217 184 5 47 234 106 36 39 20 133 77 81 241 34 12 59 55 212 158 163 139 77 54 232 111 133 109 11 226 82 170 77 232 17 218 114 50 113 152 83 202 219 168 218 132 34 241 173 58 247 200 6 151 173 6 185 4 118 166 131 92 255 162 247 111 148 166 68 56 169 253 254 48 168 30 109 251 179 213 140 46 219 3 1 116 243 247 18 11 29 244 71 100 171 9 7 235 135 165 185 174 82 125 144 46 101 141 39 25 219 161 166 142 138 73 193 151 231 217 184 5 47 234 106 36 39 20 133 77 81 241 34 12 59 55 212 158 163 139 77 54 232 111 133 109 11 226 82 170 77 232 17 218 114 50 113 152 83 202 219 168 218 132 34 241 173 58 247 200 6 151 173 6 185 4 118 166 131 92 255 162 247 111 148 166 68 56 169 253 254 48 168 30 109 251 179 213 140 46 219 3 0 48 170 134 196 251 187 25 104 34 95 69 85 184 199 0 89 253 150 101 212 7 202 243 18 178 248 98 105 134 18 215 189 22 99 238 235 78 124 3 142 134 188 8 188 178 2 0 0 0 1 48 170 134 196 251 187 25 104 34 95 69 85 184 199 0 89 253 150 101 212 7 202 243 18 178 248 98 105 134 18 215 189 22 99 238 235 78 124 3 142 134 188 8 188 178 2 0 0 0 0 48 200 105 57 90 124 53 229 14 158 143 66 34 150 228 210 143 188 213 175 175 21 92 123 213 52 223 97 128 64 234 169 31 165 1 230 126 33 17 32 28 25 238 131 159 125 84 120 8 1 48 200 105 57 90 124 53 229 14 158 143 66 34 150 228 210 143 188 213 175 175 21 92 123 213 52 223 97 128 64 234 169 31 165 1 230 126 33 17 32 28 25 238 131 159 125 84 120 8 0 8 236 26 245 49 19 0 0 0 1 8 236 26 245 49 19 0 0 0 0 16 134 207 199 26 175 188 103 160 76 140 48 55 30 189 7 0 1 16 134 207 199 26 175 188 103 160 76 140 48 55 30 189 7 0 0 24 7 216 8 30 195 251 90 24 198 179 171 59 27 243 102 163 205 126 247 84 4 0 0 0 1 24 7 216 8 30 195 251 90 24 198 179 171 59 27 243 102 163 205 126 247 84 4 0 0 0 0 100 89 190 73 217 127 252 160 134 16 114 94 182 255 223 176 58 217 71 107 33 21 118 140 226 166 128 254 219 248 19 33 93 9 225 89 44 103 188 91 203 146 155 17 20 40 125 153 23 87 125 86 166 25 181 17 220 165 143 13 245 94 144 64 231 41 17 165 224 79 44 34 246 169 187 130 155 57 121 213 161 21 178 163 44 75 169 37 6 67 200 63 171 50 214 213 230 10 148 179 25 1 100 89 190 73 217 127 252 160 134 16 114 94 182 255 223 176 58 217 71 107 33 21 118 140 226 166 128 254 219 248 19 33 93 9 225 89 44 103 188 91 203 146 155 17 20 40 125 153 23 87 125 86 166 25 181 17 220 165 143 13 245 94 144 64 231 41 17 165 224 79 44 34 246 169 187 130 155 57 121 213 161 21 178 163 44 75 169 37 6 67 200 63 171 50 214 213 230 10 148 179 25 0 116 239 141 241 165 45 224 229 17 155 67 37 181 127 150 115 133 137 72 239 12 3 103 142 204 53 108 13 4 11 96 213 15 192 155 67 147 30 66 19 222 160 17 202 156 77 143 151 241 100 236 128 33 207 105 116 196 68 142 109 237 94 29 86 196 190 96 158 51 78 107 53 2 158 62 195 101 125 181 245 191 185 105 37 77 113 109 85 110 93 152 188 115 136 136 93 10 235 225 51 77 110 7 74 32 118 44 157 117 193 127 80 54 2 0 0 0 1 116 239 141 241 165 45 224 229 17 155 67 37 181 127 150 115 133 137 72 239 12 3 103 142 204 53 108 13 4 11 96 213 15 192 155 67 147 30 66 19 222 160 17 202 156 77 143 151 241 100 236 128 33 207 105 116 196 68 142 109 237 94 29 86 196 190 96 158 51 78 107 53 2 158 62 195 101 125 181 245 191 185 105 37 77 113 109 85 110 93 152 188 115 136 136 93 10 235 225 51 77 110 7 74 32 118 44 157 117 193 127 80 54 2 0 0 0 0 52 161 103 132 41 228 199 245 93 101 166 142 168 205 96 95 52 143 127 100 173 175 132 102 181 237 4 42 52 30 10 219 202 27 68 79 23 201 116 89 53 50 85 239 183 254 11 165 100 129 247 0 0 1 52 161 103 132 41 228 199 245 93 101 166 142 168 205 96 95 52 143 127 100 173 175 132 102 181 237 4 42 52 30 10 219 202 27 68 79 23 201 116 89 53 50 85 239 183 254 11 165 100 129 247 0 0 0 28 255 251 221 115 146 46 163 229 176 14 203 138 27 28 41 62 22 109 49 16 185 119 54 172 191 85 184 0 1 28 255 251 221 115 146 46 163 229 176 14 203 138 27 28 41 62 22 109 49 16 185 119 54 172 191 85 184 0 0 32 247 33 196 253 43 205 187 127 110 212 213 12 214 143 22 252 209 96 90 89 50 103 47 68 146 216 72 215 61 226 134 3 1 32 247 33 196 253 43 205 187 127 110 212 213 12 214 143 22 252 209 96 90 89 50 103 47 68 146 216 72 215 61 226 134 3 0 36 59 97 19 31 78 83 69 133 60 42 103 67 71 156 83 145 176 67 103 93 114 176 15 117 43 90 82 152 45 121 12 17 76 244 53 1 1 36 59 97 19 31 78 83 69 133 60 42 103 67 71 156 83 145 176 67 103 93 114 176 15 117 43 90 82 152 45 121 12 17 76 244 53 1 0 52 219 241 133 51 75 86 155 36 83 56 69 111 93 54 193 19 54 88 242 30 144 132 66 61 131 189 217 126 87 64 134 162 139 199 3 85 234 160 230 114 164 25 154 94 87 76 241 251 243 147 109 83 1 52 219 241 133 51 75 86 155 36 83 56 69 111 93 54 193 19 54 88 242 30 144 132 66 61 131 189 217 126 87 64 134 162 139 199 3 85 234 160 230 114 164 25 154 94 87 76 241 251 243 147 109 83 0 64 43 137 16 132 202 104 91 201 107 180 196 200 93 138 129 13 78 33 73 134 236 116 150 83 184 197 132 23 82 3 247 20 140 181 22 152 27 60 63 98 254 172 152 20 58 101 176 236 139 225 217 61 37 39 22 240 147 101 158 189 117 172 129 3 1 64 43 137 16 132 202 104 91 201 107 180 196 200 93 138 129 13 78 33 73 134 236 116 150 83 184 197 132 23 82 3 247 20 140 181 22 152 27 60 63 98 254 172 152 20 58 101 176 236 139 225 217 61 37 39 22 240 147 101 158 189 117 172 129 3 0 16 174 250 80 27 225 76 117 105 139 6 48 23 21 0 0 0 1 16 174 250 80 27 225 76 117 105 139 6 48 23 21 0 0 0 0 32 79 208 51 133 78 86 8 203 246 180 251 28 21 185 125 159 144 112 64 104 31 37 123 126 115 170 223 1 66 0 0 0 1 32 79 208 51 133 78 86 8 203 246 180 251 28 21 185 125 159 144 112 64 104 31 37 123 126 115 170 223 1 66 0 0 0 0 20 59 170 196 192 162 161 183 242 120 40 171 157 254 236 242 64 223 1 0 0 1 20 59 170 196 192 162 161 183 242 120 40 171 157 254 236 242 64 223 1 0 0 0 64 158 138 13 99 212 72 79 220 230 16 119 150 64 148 121 100 5 104 182 189 57 158 100 143 129 122 146 11 169 192 52 74 169 74 4 0 229 160 168 226 62 202 182 250 171 51 251 90 159 122 13 111 16 28 141 139 1 41 229 97 17 73 120 0 1 64 158 138 13 99 212 72 79 220 230 16 119 150 64 148 121 100 5 104 182 189 57 158 100 143 129 122 146 11 169 192 52 74 169 74 4 0 229 160 168 226 62 202 182 250 171 51 251 90 159 122 13 111 16 28 141 139 1 41 229 97 17 73 120 0 0 124 54 211 84 85 147 162 152 160 127 96 156 128 144 183 140 26 170 242 255 112 211 16 24 233 93 177 189 62 26 230 8 18 162 102 53 79 255 93 127 37 173 116 119 61 21 221 30 71 51 18 217 197 225 89 208 228 54 16 14 158 40 254 222 6 144 144 95 30 116 51 208 187 221 207 73 40 215 178 180 184 67 243 230 235 85 174 4 118 231 32 148 73 211 37 140 151 196 184 12 41 14 98 78 190 103 107 141 66 52 100 222 58 141 135 84 85 90 76 97 21 18 0 0 0 1 124 54 211 84 85 147 162 152 160 127 96 156 128 144 183 140 26 170 242 255 112 211 16 24 233 93 177 189 62 26 230 8 18 162 102 53 79 255 93 127 37 173 116 119 61 21 221 30 71 51 18 217 197 225 89 208 228 54 16 14 158 40 254 222 6 144 144 95 30 116 51 208 187 221 207 73 40 215 178 180 184 67 243 230 235 85 174 4 118 231 32 148 73 211 37 140 151 196 184 12 41 14 98 78 190 103 107 141 66 52 100 222 58 141 135 84 85 90 76 97 21 18 0 0 0 0 124 94 236 109 194 205 86 41 192 155 21 79 52 203 207 37 42 40 126 224 32 228 152 22 204 190 205 68 99 253 159 127 249 241 8 5 27 151 203 115 75 236 216 195 28 184 201 166 85 152 106 8 201 248 148 93 54 156 87 135 56 251 121 202 96 173 198 190 134 110 223 180 127 230 136 159 180 9 44 207 255 43 80 213 238 43 117 135 78 121 149 22 24 198 179 157 59 238 245 168 85 45 36 70 88 161 109 52 49 133 96 74 209 106 244 99 200 247 185 127 197 240 97 2 0 1 124 94 236 109 194 205 86 41 192 155 21 79 52 203 207 37 42 40 126 224 32 228 152 22 204 190 205 68 99 253 159 127 249 241 8 5 27 151 203 115 75 236 216 195 28 184 201 166 85 152 106 8 201 248 148 93 54 156 87 135 56 251 121 202 96 173 198 190 134 110 223 180 127 230 136 159 180 9 44 207 255 43 80 213 238 43 117 135 78 121 149 22 24 198 179 157 59 238 245 168 85 45 36 70 88 161 109 52 49 133 96 74 209 106 244 99 200 247 185 127 197 240 97 2 0 0 124 14 202 151 114 198 177 79 116 173 42 198 179 37 189 161 34 90 109 151 134 15 53 12 218 203 186 227 104 124 114 146 230 193 76 40 120 134 85 85 179 206 122 201 169 68 255 199 58 19 184 117 183 58 105 131 49 120 224 207 113 249 249 52 245 213 117 133 240 15 235 167 111 253 250 71 98 115 41 241 120 23 72 80 150 152 182 145 130 4 69 103 219 252 177 172 87 76 137 67 198 105 98 131 12 8 87 204 104 138 42 101 155 161 225 254 112 96 164 148 113 139 130 6 0 1 124 14 202 151 114 198 177 79 116 173 42 198 179 37 189 161 34 90 109 151 134 15 53 12 218 203 186 227 104 124 114 146 230 193 76 40 120 134 85 85 179 206 122 201 169 68 255 199 58 19 184 117 183 58 105 131 49 120 224 207 113 249 249 52 245 213 117 133 240 15 235 167 111 253 250 71 98 115 41 241 120 23 72 80 150 152 182 145 130 4 69 103 219 252 177 172 87 76 137 67 198 105 98 131 12 8 87 204 104 138 42 101 155 161 225 254 112 96 164 148 113 139 130 6 0 0 84 222 236 36 90 191 241 183 85 110 108 88 240 111 232 78 103 27 70 144 224 71 76 230 109 75 89 21 251 126 142 18 121 105 170 253 72 64 73 2 238 74 157 109 22 80 12 236 206 45 90 23 64 23 14 190 116 110 37 81 228 238 254 84 202 140 111 243 20 88 246 161 13 249 31 162 155 221 13 64 215 171 161 29 14 1 84 222 236 36 90 191 241 183 85 110 108 88 240 111 232 78 103 27 70 144 224 71 76 230 109 75 89 21 251 126 142 18 121 105 170 253 72 64 73 2 238 74 157 109 22 80 12 236 206 45 90 23 64 23 14 190 116 110 37 81 228 238 254 84 202 140 111 243 20 88 246 161 13 249 31 162 155 221 13 64 215 171 161 29 14 0 76 69 2 96 19 137 241 75 149 54 240 119 4 53 193 106 38 190 90 56 134 205 201 129 251 62 99 112 152 118 97 184 216 164 110 226 53 156 74 62 42 32 199 114 107 27 36 188 14 59 253 131 97 129 87 74 48 164 130 23 116 217 134 169 80 29 241 90 26 86 7 137 144 117 50 0 0 1 76 69 2 96 19 137 241 75 149 54 240 119 4 53 193 106 38 190 90 56 134 205 201 129 251 62 99 112 152 118 97 184 216 164 110 226 53 156 74 62 42 32 199 114 107 27 36 188 14 59 253 131 97 129 87 74 48 164 130 23 116 217 134 169 80 29 241 90 26 86 7 137 144 117 50 0 0 0 100 60 2 183 139 129 88 99 244 170 89 0 177 28 40 203 18 239 70 82 138 113 96 148 242 156 70 22 152 221 31 149 38 127 107 45 254 28 166 210 227 215 191 161 12 230 95 230 64 209 16 253 82 63 212 15 119 73 178 25 88 182 249 227 148 207 62 209 192 72 37 56 62 203 161 110 196 250 228 14 19 181 87 35 11 15 255 155 107 206 61 54 223 191 92 51 188 42 0 0 0 1 100 60 2 183 139 129 88 99 244 170 89 0 177 28 40 203 18 239 70 82 138 113 96 148 242 156 70 22 152 221 31 149 38 127 107 45 254 28 166 210 227 215 191 161 12 230 95 230 64 209 16 253 82 63 212 15 119 73 178 25 88 182 249 227 148 207 62 209 192 72 37 56 62 203 161 110 196 250 228 14 19 181 87 35 11 15 255 155 107 206 61 54 223 191 92 51 188 42 0 0 0 0 8 161 145 84 161 51 102 34 163 1 8 161 145 84 161 51 102 34 163 0 56 160 51 60 244 243 228 49 105 198 184 5 130 241 114 177 248 245 101 241 141 249 87 160 252 119 173 82 11 10 104 49 95 69 254 101 134 79 46 129 192 118 64 243 147 3 51 61 70 176 159 167 235 86 145 44 55 1 56 160 51 60 244 243 228 49 105 198 184 5 130 241 114 177 248 245 101 241 141 249 87 160 252 119 173 82 11 10 104 49 95 69 254 101 134 79 46 129 192 118 64 243 147 3 51 61 70 176 159 167 235 86 145 44 55 0 32 180 181 48 71 211 35 86 174 153 231 246 211 154 205 97 74 237 0 199 183 8 131 127 228 121 26 229 18 39 183 3 0 1 32 180 181 48 71 211 35 86 174 153 231 246 211 154 205 97 74 237 0 199 183 8 131 127 228 121 26 229 18 39 183 3 0 0 72 235 208 249 69 198 27 28 175 48 201 165 210 55 86 150 90 198 36 230 165 54 20 213 19 85 189 110 233 79 254 190 153 19 131 115 116 152 36 49 241 5 53 57 191 108 36 43 245 224 105 242 219 194 163 217 52 122 224 205 161 21 47 142 100 254 80 178 115 134 181 158 0 1 72 235 208 249 69 198 27 28 175 48 201 165 210 55 86 150 90 198 36 230 165 54 20 213 19 85 189 110 233 79 254 190 153 19 131 115 116 152 36 49 241 5 53 57 191 108 36 43 245 224 105 242 219 194 163 217 52 122 224 205 161 21 47 142 100 254 80 178 115 134 181 158 0 0 48 24 216 31 31 121 32 6 35 230 132 116 1 93 231 239 114 29 239 68 226 187 220 209 191 89 111 162 77 90 222 196 5 16 190 98 88 179 228 211 83 191 201 156 101 38 6 0 0 1 48 24 216 31 31 121 32 6 35 230 132 116 1 93 231 239 114 29 239 68 226 187 220 209 191 89 111 162 77 90 222 196 5 16 190 98 88 179 228 211 83 191 201 156 101 38 6 0 0 0 8 120 9 155 198 227 119 139 0 1 8 120 9 155 198 227 119 139 0 0 108 67 233 173 239 2 147 31 164 67 28 157 14 181 143 121 205 94 47 18 212 89 86 192 240 97 248 17 119 22 163 109 127 226 138 109 233 234 45 230 169 33 186 2 126 255 20 183 106 178 83 140 195 205 223 184 177 109 237 177 147 165 5 252 192 192 124 61 142 140 69 133 239 214 170 94 162 222 231 95 68 100 116 183 60 109 34 233 105 48 238 47 153 181 219 232 176 110 180 54 190 173 160 203 79 0 3 0 0 1 108 67 233 173 239 2 147 31 164 67 28 157 14 181 143 121 205 94 47 18 212 89 86 192 240 97 248 17 119 22 163 109 127 226 138 109 233 234 45 230 169 33 186 2 126 255 20 183 106 178 83 140 195 205 223 184 177 109 237 177 147 165 5 252 192 192 124 61 142 140 69 133 239 214 170 94 162 222 231 95 68 100 116 183 60 109 34 233 105 48 238 47 153 181 219 232 176 110 180 54 190 173 160 203 79 0 3 0 0 0 44 113 179 208 89 229 97 41 83 34 181 248 69 45 117 67 182 227 176 114 161 166 167 142 142 47 25 191 4 182 213 77 37 61 119 165 249 59 176 118 228 161 1 0 0 1 44 113 179 208 89 229 97 41 83 34 181 248 69 45 117 67 182 227 176 114 161 166 167 142 142 47 25 191 4 182 213 77 37 61 119 165 249 59 176 118 228 161 1 0 0 0 4 205 230 1 0 1 4 205 230 1 0 0 52 77 166 237 60 159 113 214 225 225 196 126 16 105 189 104 42 252 167 15 186 63 111 11 23 250 53 128 208 225 81 238 136 75 225 4 178 227 11 107 243 121 83 238 164 31 105 2 177 163 135 105 60 1 52 77 166 237 60 159 113 214 225 225 196 126 16 105 189 104 42 252 167 15 186 63 111 11 23 250 53 128 208 225 81 238 136 75 225 4 178 227 11 107 243 121 83 238 164 31 105 2 177 163 135 105 60 0 8 7 177 200 9 87 48 0 0 1 8 7 177 200 9 87 48 0 0 0 120 95 0 17 198 196 3 168 29 232 224 109 67 23 135 235 50 52 214 192 80 146 255 65 119 139 83 153 210 130 123 45 5 148 58 19 42 240 226 164 159 61 91 236 215 59 183 160 255 155 79 104 47 81 69 79 205 46 250 193 179 14 221 169 205 128 237 109 128 36 7 21 98 118 172 243 166 158 151 127 232 156 225 22 108 82 127 8 238 182 238 200 235 199 229 34 2 128 5 166 74 164 159 85 41 32 254 62 100 188 86 40 138 142 240 122 56 2 0 0 0 1 120 95 0 17 198 196 3 168 29 232 224 109 67 23 135 235 50 52 214 192 80 146 255 65 119 139 83 153 210 130 123 45 5 148 58 19 42 240 226 164 159 61 91 236 215 59 183 160 255 155 79 104 47 81 69 79 205 46 250 193 179 14 221 169 205 128 237 109 128 36 7 21 98 118 172 243 166 158 151 127 232 156 225 22 108 82 127 8 238 182 238 200 235 199 229 34 2 128 5 166 74 164 159 85 41 32 254 62 100 188 86 40 138 142 240 122 56 2 0 0 0 0 24 52 171 120 247 245 238 38 189 200 10 21 246 79 73 111 224 107 101 199 80 238 49 0 0 1 24 52 171 120 247 245 238 38 189 200 10 21 246 79 73 111 224 107 101 199 80 238 49 0 0 0 104 57 158 161 115 39 26 101 249 18 39 40 1 93 199 25 128 79 244 212 44 60 231 196 18 52 157 210 236 197 32 195 30 224 115 47 62 183 108 27 196 234 161 196 225 103 21 202 150 178 236 60 175 217 66 254 151 71 126 230 34 45 143 24 111 88 165 51 57 138 241 251 139 79 160 192 71 182 96 28 48 193 182 46 229 150 230 46 13 249 26 35 98 104 138 125 230 36 173 131 138 29 153 37 15 1 104 57 158 161 115 39 26 101 249 18 39 40 1 93 199 25 128 79 244 212 44 60 231 196 18 52 157 210 236 197 32 195 30 224 115 47 62 183 108 27 196 234 161 196 225 103 21 202 150 178 236 60 175 217 66 254 151 71 126 230 34 45 143 24 111 88 165 51 57 138 241 251 139 79 160 192 71 182 96 28 48 193 182 46 229 150 230 46 13 249 26 35 98 104 138 125 230 36 173 131 138 29 153 37 15 0 84 201 67 176 170 12 214 223 113 151 240 121 127 115 67 246 173 119 207 202 219 102 176 87 124 64 46 160 253 231 56 131 2 167 194 119 80 227 152 34 209 118 189 9 5 175 115 207 20 15 201 85 82 139 3 122 200 232 151 18 106 251 0 202 255 146 176 226 219 69 250 238 111 233 251 3 57 189 253 30 108 224 253 116 0 1 84 201 67 176 170 12 214 223 113 151 240 121 127 115 67 246 173 119 207 202 219 102 176 87 124 64 46 160 253 231 56 131 2 167 194 119 80 227 152 34 209 118 189 9 5 175 115 207 20 15 201 85 82 139 3 122 200 232 151 18 106 251 0 202 255 146 176 226 219 69 250 238 111 233 251 3 57 189 253 30 108 224 253 116 0 0 36 216 207 22 26 220 111 75 102 80 113 167 57 132 171 148 110 197 33 103 213 177 123 206 218 242 178 9 228 125 117 218 221 76 2 0 0 1 36 216 207 22 26 220 111 75 102 80 113 167 57 132 171 148 110 197 33 103 213 177 123 206 218 242 178 9 228 125 117 218 221 76 2 0 0 0 96 209 38 226 122 66 37 110 32 0 244 215 135 36 169 50 93 130 191 147 142 209 240 154 14 39 115 83 99 104 166 126 171 89 95 133 0 168 235 114 121 112 237 201 242 105 25 68 88 53 63 4 70 8 16 14 139 78 16 28 216 131 240 108 136 129 244 99 100 247 236 64 222 120 6 100 242 25 164 196 251 190 21 202 16 243 72 23 21 27 253 232 129 65 12 0 0 1 96 209 38 226 122 66 37 110 32 0 244 215 135 36 169 50 93 130 191 147 142 209 240 154 14 39 115 83 99 104 166 126 171 89 95 133 0 168 235 114 121 112 237 201 242 105 25 68 88 53 63 4 70 8 16 14 139 78 16 28 216 131 240 108 136 129 244 99 100 247 236 64 222 120 6 100 242 25 164 196 251 190 21 202 16 243 72 23 21 27 253 232 129 65 12 0 0 0 20 137 7 71 104 123 1 230 162 84 85 84 78 76 1 146 149 3 0 0 0 1 20 137 7 71 104 123 1 230 162 84 85 84 78 76 1 146 149 3 0 0 0 0 84 17 135 189 91 189 22 119 161 7 236 246 162 42 137 207 149 58 10 147 68 241 83 242 92 176 9 168 195 250 98 204 19 131 82 40 2 115 30 134 119 85 234 171 51 248 6 232 13 126 100 100 208 191 92 68 52 56 79 102 83 41 100 249 214 204 9 147 69 246 254 24 120 21 121 111 194 137 125 190 39 201 58 31 0 1 84 17 135 189 91 189 22 119 161 7 236 246 162 42 137 207 149 58 10 147 68 241 83 242 92 176 9 168 195 250 98 204 19 131 82 40 2 115 30 134 119 85 234 171 51 248 6 232 13 126 100 100 208 191 92 68 52 56 79 102 83 41 100 249 214 204 9 147 69 246 254 24 120 21 121 111 194 137 125 190 39 201 58 31 0 0 64 174 140 149 163 3 107 111 4 34 250 106 21 208 102 247 217 125 106 201 189 50 165 180 247 173 193 91 219 22 221 135 48 75 167 217 77 123 120 130 238 30 6 129 157 63 162 58 79 199 175 93 130 164 195 209 241 206 111 166 90 218 65 223 2 1 64 174 140 149 163 3 107 111 4 34 250 106 21 208 102 247 217 125 106 201 189 50 165 180 247 173 193 91 219 22 221 135 48 75 167 217 77 123 120 130 238 30 6 129 157 63 162 58 79 199 175 93 130 164 195 209 241 206 111 166 90 218 65 223 2 0 60 94 39 245 99 17 252 182 140 162 112 156 230 137 46 180 2 25 35 78 204 212 30 138 67 63 147 188 132 251 223 228 122 221 52 247 47 60 130 213 221 67 57 251 17 236 100 5 136 157 85 85 137 180 82 210 206 141 57 0 0 1 60 94 39 245 99 17 252 182 140 162 112 156 230 137 46 180 2 25 35 78 204 212 30 138 67 63 147 188 132 251 223 228 122 221 52 247 47 60 130 213 221 67 57 251 17 236 100 5 136 157 85 85 137 180 82 210 206 141 57 0 0 0 52 130 153 165 204 195 100 32 242 200 177 22 23 48 222 90 173 238 62 11 195 207 31 94 106 111 19 23 102 123 154 11 25 69 140 143 38 27 47 211 73 199 58 157 241 52 98 114 254 14 0 0 0 1 52 130 153 165 204 195 100 32 242 200 177 22 23 48 222 90 173 238 62 11 195 207 31 94 106 111 19 23 102 123 154 11 25 69 140 143 38 27 47 211 73 199 58 157 241 52 98 114 254 14 0 0 0 0 72 242 139 53 248 243 242 47 139 119 188 176 74 227 81 33 108 130 169 69 136 245 21 31 87 103 135 189 216 110 191 185 187 15 111 235 113 59 97 210 163 3 82 39 248 57 165 173 26 7 64 153 147 109 165 237 85 23 91 144 96 82 212 163 110 172 233 196 20 189 194 1 0 1 72 242 139 53 248 243 242 47 139 119 188 176 74 227 81 33 108 130 169 69 136 245 21 31 87 103 135 189 216 110 191 185 187 15 111 235 113 59 97 210 163 3 82 39 248 57 165 173 26 7 64 153 147 109 165 237 85 23 91 144 96 82 212 163 110 172 233 196 20 189 194 1 0 0 92 63 196 195 103 33 69 53 0 35 106 115 86 145 225 79 206 13 41 97 138 221 49 15 101 120 43 207 2 164 87 76 203 63 18 204 117 208 102 150 11 45 65 74 88 87 11 31 221 40 244 204 108 35 1 221 236 192 33 114 34 255 16 27 102 160 251 229 204 178 67 44 210 45 249 116 212 232 9 246 165 134 232 228 248 94 170 234 243 13 232 1 125 1 92 63 196 195 103 33 69 53 0 35 106 115 86 145 225 79 206 13 41 97 138 221 49 15 101 120 43 207 2 164 87 76 203 63 18 204 117 208 102 150 11 45 65 74 88 87 11 31 221 40 244 204 108 35 1 221 236 192 33 114 34 255 16 27 102 160 251 229 204 178 67 44 210 45 249 116 212 232 9 246 165 134 232 228 248 94 170 234 243 13 232 1 125 0 40 179 181 131 162 149 183 138 252 30 154 1 146 137 121 52 190 246 1 224 28 36 102 79 202 159 212 210 252 214 150 156 61 194 235 164 133 239 142 0 0 1 40 179 181 131 162 149 183 138 252 30 154 1 146 137 121 52 190 246 1 224 28 36 102 79 202 159 212 210 252 214 150 156 61 194 235 164 133 239 142 0 0 0 40 60 58 79 249 6 113 81 42 62 163 64 45 148 17 196 92 207 75 88 80 225 216 133 32 64 220 110 107 147 131 21 223 245 83 192 232 107 0 0 0 1 40 60 58 79 249 6 113 81 42 62 163 64 45 148 17 196 92 207 75 88 80 225 216 133 32 64 220 110 107 147 131 21 223 245 83 192 232 107 0 0 0 0 96 12 165 17 255 148 106 77 76 190 146 244 60 246 21 69 4 108 6 135 121 71 44 77 148 210 123 228 244 192 7 178 234 75 27 35 56 139 157 89 246 205 166 104 142 71 22 111 74 215 198 253 47 185 250 203 223 186 72 48 140 56 78 5 248 174 81 223 135 55 86 65 183 39 125 199 89 36 113 114 101 100 241 34 118 182 139 64 184 93 41 222 250 83 8 126 2 1 96 12 165 17 255 148 106 77 76 190 146 244 60 246 21 69 4 108 6 135 121 71 44 77 148 210 123 228 244 192 7 178 234 75 27 35 56 139 157 89 246 205 166 104 142 71 22 111 74 215 198 253 47 185 250 203 223 186 72 48 140 56 78 5 248 174 81 223 135 55 86 65 183 39 125 199 89 36 113 114 101 100 241 34 118 182 139 64 184 93 41 222 250 83 8 126 2 0 80 194 39 168 144 47 63 164 168 230 144 217 13 24 96 155 100 12 59 177 151 216 92 228 192 145 88 206 81 45 221 226 39 93 88 12 250 68 153 137 36 20 58 0 113 35 195 22 121 71 66 8 241 39 201 196 133 230 128 125 7 217 82 221 87 57 93 151 146 24 13 11 157 51 151 229 8 102 193 170 254 1 80 194 39 168 144 47 63 164 168 230 144 217 13 24 96 155 100 12 59 177 151 216 92 228 192 145 88 206 81 45 221 226 39 93 88 12 250 68 153 137 36 20 58 0 113 35 195 22 121 71 66 8 241 39 201 196 133 230 128 125 7 217 82 221 87 57 93 151 146 24 13 11 157 51 151 229 8 102 193 170 254 0 28 115 165 0 181 114 222 7 59 3 124 183 26 196 172 167 125 136 168 200 232 107 92 130 217 10 0 0 0 1 28 115 165 0 181 114 222 7 59 3 124 183 26 196 172 167 125 136 168 200 232 107 92 130 217 10 0 0 0 0 104 236 68 87 125 155 29 32 62 230 30 136 150 217 197 37 30 35 255 242 108 93 176 111 33 250 237 114 238 160 77 113 171 147 43 61 144 12 84 87 115 160 128 222 109 180 248 55 195 181 75 255 203 79 219 130 244 94 36 238 156 212 175 171 162 174 87 117 209 113 175 106 193 36 21 66 244 243 166 248 81 121 94 110 189 10 52 188 102 198 136 150 183 191 180 96 29 51 207 65 251 163 177 216 188 1 104 236 68 87 125 155 29 32 62 230 30 136 150 217 197 37 30 35 255 242 108 93 176 111 33 250 237 114 238 160 77 113 171 147 43 61 144 12 84 87 115 160 128 222 109 180 248 55 195 181 75 255 203 79 219 130 244 94 36 238 156 212 175 171 162 174 87 117 209 113 175 106 193 36 21 66 244 243 166 248 81 121 94 110 189 10 52 188 102 198 136 150 183 191 180 96 29 51 207 65 251 163 177 216 188 0 88 199 62 219 38 224 64 98 122 250 132 90 246 191 177 175 129 238 74 103 140 144 205 156 27 249 53 223 251 192 95 121 104 139 113 181 72 177 157 33 140 244 253 143 104 230 164 205 233 17 33 203 84 40 89 149 26 16 144 238 213 168 166 242 186 189 255 169 165 234 16 127 90 100 62 217 16 139 41 102 89 93 97 62 95 147 122 238 237 1 88 199 62 219 38 224 64 98 122 250 132 90 246 191 177 175 129 238 74 103 140 144 205 156 27 249 53 223 251 192 95 121 104 139 113 181 72 177 157 33 140 244 253 143 104 230 164 205 233 17 33 203 84 40 89 149 26 16 144 238 213 168 166 242 186 189 255 169 165 234 16 127 90 100 62 217 16 139 41 102 89 93 97 62 95 147 122 238 237 0 44 45 84 26 33 30 184 117 77 114 45 211 193 64 207 224 237 136 114 3 145 150 20 213 238 240 36 201 64 122 69 244 22 129 142 201 1 185 151 174 233 1 0 0 0 1 44 45 84 26 33 30 184 117 77 114 45 211 193 64 207 224 237 136 114 3 145 150 20 213 238 240 36 201 64 122 69 244 22 129 142 201 1 185 151 174 233 1 0 0 0 0 24 118 96 110 163 151 234 7 30 202 198 169 47 210 145 198 195 223 20 211 133 162 187 75 48 1 24 118 96 110 163 151 234 7 30 202 198 169 47 210 145 198 195 223 20 211 133 162 187 75 48 0 52 166 132 83 15 114 76 5 198 105 107 64 21 201 37 152 38 123 234 29 114 185 178 23 194 54 124 93 52 128 139 153 108 32 85 243 44 247 113 25 108 194 143 136 29 222 174 212 74 73 19 0 0 1 52 166 132 83 15 114 76 5 198 105 107 64 21 201 37 152 38 123 234 29 114 185 178 23 194 54 124 93 52 128 139 153 108 32 85 243 44 247 113 25 108 194 143 136 29 222 174 212 74 73 19 0 0 0 48 123 248 179 54 119 191 224 218 82 168 17 9 213 235 78 184 70 111 32 105 157 160 212 123 240 230 248 188 30 46 115 251 167 248 212 75 179 20 91 203 47 80 142 34 152 174 246 1 1 48 123 248 179 54 119 191 224 218 82 168 17 9 213 235 78 184 70 111 32 105 157 160 212 123 240 230 248 188 30 46 115 251 167 248 212 75 179 20 91 203 47 80 142 34 152 174 246 1 0 48 156 96 100 244 230 81 145 6 56 18 242 19 211 56 11 208 136 192 193 247 21 84 210 245 251 22 164 190 142 62 191 235 148 86 107 108 228 229 161 113 8 169 132 37 3 0 0 0 1 48 156 96 100 244 230 81 145 6 56 18 242 19 211 56 11 208 136 192 193 247 21 84 210 245 251 22 164 190 142 62 191 235 148 86 107 108 228 229 161 113 8 169 132 37 3 0 0 0 0 84 253 53 33 48 131 189 25 65 204 174 99 186 204 72 230 129 192 106 8 141 23 186 143 8 176 75 97 190 2 190 127 52 92 22 252 200 15 45 98 21 11 157 128 28 145 217 54 150 99 213 145 99 58 65 64 149 218 156 253 58 0 9 210 203 145 96 237 185 130 70 116 6 209 240 157 58 59 8 33 55 1 0 0 0 1 84 253 53 33 48 131 189 25 65 204 174 99 186 204 72 230 129 192 106 8 141 23 186 143 8 176 75 97 190 2 190 127 52 92 22 252 200 15 45 98 21 11 157 128 28 145 217 54 150 99 213 145 99 58 65 64 149 218 156 253 58 0 9 210 203 145 96 237 185 130 70 116 6 209 240 157 58 59 8 33 55 1 0 0 0 0 108 140 139 49 207 205 64 240 199 59 87 85 34 45 23 247 226 20 175 76 118 24 188 97 163 249 238 130 105 219 76 167 90 29 31 159 229 181 73 152 183 74 134 209 139 34 200 210 113 231 227 99 224 196 220 80 243 62 167 195 5 201 123 178 100 95 190 235 171 32 64 54 178 111 83 175 134 22 73 175 164 79 39 170 74 102 74 233 210 216 226 3 131 100 81 201 127 195 224 208 29 109 171 156 77 11 0 0 0 1 108 140 139 49 207 205 64 240 199 59 87 85 34 45 23 247 226 20 175 76 118 24 188 97 163 249 238 130 105 219 76 167 90 29 31 159 229 181 73 152 183 74 134 209 139 34 200 210 113 231 227 99 224 196 220 80 243 62 167 195 5 201 123 178 100 95 190 235 171 32 64 54 178 111 83 175 134 22 73 175 164 79 39 170 74 102 74 233 210 216 226 3 131 100 81 201 127 195 224 208 29 109 171 156 77 11 0 0 0 0 100 222 231 217 128 82 99 10 214 110 228 128 78 114 45 119 81 180 185 243 203 206 92 162 40 82 46 54 187 93 28 152 69 4 123 103 77 208 204 181 235 42 147 170 143 2 139 154 218 144 51 223 215 163 89 75 72 123 205 0 240 64 100 207 207 158 197 65 249 187 175 80 167 154 152 209 32 55 42 171 219 232 238 66 244 61 205 209 141 94 43 111 8 205 151 59 230 205 24 205 241 1 100 222 231 217 128 82 99 10 214 110 228 128 78 114 45 119 81 180 185 243 203 206 92 162 40 82 46 54 187 93 28 152 69 4 123 103 77 208 204 181 235 42 147 170 143 2 139 154 218 144 51 223 215 163 89 75 72 123 205 0 240 64 100 207 207 158 197 65 249 187 175 80 167 154 152 209 32 55 42 171 219 232 238 66 244 61 205 209 141 94 43 111 8 205 151 59 230 205 24 205 241 0 88 207 251 142 39 144 108 252 57 106 73 11 186 19 131 187 69 26 149 177 211 238 136 251 62 89 7 238 7 115 168 92 155 211 100 253 171 162 138 116 33 152 91 134 33 55 71 164 201 152 4 49 26 55 186 161 250 57 85 28 39 171 17 196 138 245 10 0 73 155 144 183 97 4 3 242 240 169 248 22 116 210 225 61 191 6 115 0 0 1 88 207 251 142 39 144 108 252 57 106 73 11 186 19 131 187 69 26 149 177 211 238 136 251 62 89 7 238 7 115 168 92 155 211 100 253 171 162 138 116 33 152 91 134 33 55 71 164 201 152 4 49 26 55 186 161 250 57 85 28 39 171 17 196 138 245 10 0 73 155 144 183 97 4 3 242 240 169 248 22 116 210 225 61 191 6 115 0 0 0 12 137 130 140 24 236 12 214 199 10 105 31 0 1 12 137 130 140 24 236 12 214 199 10 105 31 0 0 52 108 175 196 156 55 213 72 113 207 244 180 56 88 213 35 165 75 248 211 20 212 57 60 188 217 211 48 37 134 141 243 246 161 245 39 195 123 248 138 183 15 28 111 146 50 155 93 170 4 0 0 0 1 52 108 175 196 156 55 213 72 113 207 244 180 56 88 213 35 165 75 248 211 20 212 57 60 188 217 211 48 37 134 141 243 246 161 245 39 195 123 248 138 183 15 28 111 146 50 155 93 170 4 0 0 0 0 120 112 113 30 136 233 190 54 137 121 169 50 162 49 32 173 179 18 162 50 40 203 206 65 185 66 186 230 219 176 80 103 123 27 250 226 122 23 191 77 80 214 47 76 55 89 65 20 139 103 231 246 32 248 93 179 33 222 25 246 60 212 174 114 116 72 105 47 23 51 143 138 172 27 39 246 135 133 254 162 107 108 22 2 166 141 243 6 251 77 176 135 206 2 231 124 148 132 69 84 79 111 64 235 234 76 164 46 49 159 31 188 209 182 60 173 197 202 76 16 0 1 120 112 113 30 136 233 190 54 137 121 169 50 162 49 32 173 179 18 162 50 40 203 206 65 185 66 186 230 219 176 80 103 123 27 250 226 122 23 191 77 80 214 47 76 55 89 65 20 139 103 231 246 32 248 93 179 33 222 25 246 60 212 174 114 116 72 105 47 23 51 143 138 172 27 39 246 135 133 254 162 107 108 22 2 166 141 243 6 251 77 176 135 206 2 231 124 148 132 69 84 79 111 64 235 234 76 164 46 49 159 31 188 209 182 60 173 197 202 76 16 0 0 60 47 160 84 82 9 238 207 219 151 156 134 131 89 62 11 68 11 147 237 99 121 15 73 200 84 95 87 214 232 187 96 240 53 52 195 55 200 190 88 28 76 29 80 151 156 97 63 20 181 127 200 147 98 254 76 151 61 118 77 0 1 60 47 160 84 82 9 238 207 219 151 156 134 131 89 62 11 68 11 147 237 99 121 15 73 200 84 95 87 214 232 187 96 240 53 52 195 55 200 190 88 28 76 29 80 151 156 97 63 20 181 127 200 147 98 254 76 151 61 118 77 0 0 100 238 56 196 120 62 80 239 58 25 190 123 255 60 22 240 193 64 200 155 205 65 125 162 46 114 82 168 130 71 226 104 252 45 143 77 84 254 194 132 208 96 195 7 173 173 156 202 242 175 234 16 37 97 18 174 179 230 94 208 69 94 78 160 223 97 151 58 36 237 203 214 110 180 89 134 104 29 12 23 140 193 36 70 29 183 50 17 167 28 12 196 65 172 236 156 91 251 73 127 1 1 100 238 56 196 120 62 80 239 58 25 190 123 255 60 22 240 193 64 200 155 205 65 125 162 46 114 82 168 130 71 226 104 252 45 143 77 84 254 194 132 208 96 195 7 173 173 156 202 242 175 234 16 37 97 18 174 179 230 94 208 69 94 78 160 223 97 151 58 36 237 203 214 110 180 89 134 104 29 12 23 140 193 36 70 29 183 50 17 167 28 12 196 65 172 236 156 91 251 73 127 1 0 40 149 114 1 116 102 17 2 174 6 173 97 185 176 52 172 147 84 122 233 135 57 32 185 232 151 166 16 42 84 99 130 237 14 101 51 119 173 115 53 0 1 40 149 114 1 116 102 17 2 174 6 173 97 185 176 52 172 147 84 122 233 135 57 32 185 232 151 166 16 42 84 99 130 237 14 101 51 119 173 115 53 0 0 64 242 217 97 202 37 38 150 206 207 10 52 100 102 27 105 39 214 77 170 228 242 244 122 45 230 139 116 113 248 171 76 193 78 80 198 37 181 97 228 185 29 21 241 62 210 131 193 6 1 89 93 123 149 252 254 234 21 49 121 54 70 123 12 0 1 64 242 217 97 202 37 38 150 206 207 10 52 100 102 27 105 39 214 77 170 228 242 244 122 45 230 139 116 113 248 171 76 193 78 80 198 37 181 97 228 185 29 21 241 62 210 131 193 6 1 89 93 123 149 252 254 234 21 49 121 54 70 123 12 0 0 120 126 216 172 15 25 129 241 98 17 2 168 135 214 24 154 85 56 125 146 150 225 161 82 46 26 201 64 204 132 245 111 192 88 211 123 3 119 58 58 245 118 104 138 91 147 19 185 226 101 33 139 62 235 15 91 204 29 220 53 8 11 61 142 142 93 77 162 71 38 142 116 213 43 79 225 85 174 86 234 214 249 189 86 69 229 181 99 122 154 144 192 66 13 218 96 118 124 80 14 168 5 230 111 79 37 76 42 49 185 18 80 157 188 50 80 199 22 0 0 0 1 120 126 216 172 15 25 129 241 98 17 2 168 135 214 24 154 85 56 125 146 150 225 161 82 46 26 201 64 204 132 245 111 192 88 211 123 3 119 58 58 245 118 104 138 91 147 19 185 226 101 33 139 62 235 15 91 204 29 220 53 8 11 61 142 142 93 77 162 71 38 142 116 213 43 79 225 85 174 86 234 214 249 189 86 69 229 181 99 122 154 144 192 66 13 218 96 118 124 80 14 168 5 230 111 79 37 76 42 49 185 18 80 157 188 50 80 199 22 0 0 0 0 56 243 53 196 121 165 92 144 118 3 3 222 84 206 144 5 157 57 16 134 139 198 69 129 221 11 133 183 218 71 108 13 56 83 246 113 103 6 198 202 227 68 93 146 59 161 12 248 177 166 51 150 47 96 161 239 236 1 56 243 53 196 121 165 92 144 118 3 3 222 84 206 144 5 157 57 16 134 139 198 69 129 221 11 133 183 218 71 108 13 56 83 246 113 103 6 198 202 227 68 93 146 59 161 12 248 177 166 51 150 47 96 161 239 236 0 64 153 28 132 11 210 222 158 84 204 251 210 22 227 11 36 206 23 140 161 60 159 143 123 206 191 31 7 46 144 178 243 58 169 39 112 174 47 119 109 7 130 69 51 2 125 253 241 144 64 234 96 3 245 113 8 190 14 182 65 46 222 249 3 0 1 64 153 28 132 11 210 222 158 84 204 251 210 22 227 11 36 206 23 140 161 60 159 143 123 206 191 31 7 46 144 178 243 58 169 39 112 174 47 119 109 7 130 69 51 2 125 253 241 144 64 234 96 3 245 113 8 190 14 182 65 46 222 249 3 0 0 60 98 185 79 194 105 170 12 86 252 124 124 192 23 205 211 77 162 50 205 89 40 158 46 179 237 22 171 26 56 121 32 6 69 111 60 114 251 180 204 199 96 135 46 64 144 243 102 201 99 166 113 208 152 168 179 161 1 6 0 0 1 60 98 185 79 194 105 170 12 86 252 124 124 192 23 205 211 77 162 50 205 89 40 158 46 179 237 22 171 26 56 121 32 6 69 111 60 114 251 180 204 199 96 135 46 64 144 243 102 201 99 166 113 208 152 168 179 161 1 6 0 0 0 100 142 26 227 150 238 69 151 6 3 30 46 190 46 96 134 217 131 85 161 92 34 208 158 197 175 196 117 64 216 114 195 81 101 252 52 106 185 71 47 193 32 27 53 120 25 14 193 3 5 106 149 116 208 152 66 126 218 195 178 209 4 241 87 44 185 217 57 224 49 139 77 191 217 218 19 215 78 14 143 87 180 5 177 20 62 54 52 235 79 31 44 20 98 23 221 250 34 0 0 0 1 100 142 26 227 150 238 69 151 6 3 30 46 190 46 96 134 217 131 85 161 92 34 208 158 197 175 196 117 64 216 114 195 81 101 252 52 106 185 71 47 193 32 27 53 120 25 14 193 3 5 106 149 116 208 152 66 126 218 195 178 209 4 241 87 44 185 217 57 224 49 139 77 191 217 218 19 215 78 14 143 87 180 5 177 20 62 54 52 235 79 31 44 20 98 23 221 250 34 0 0 0 0 40 32 168 235 44 56 166 243 210 154 91 226 40 229 249 145 209 125 211 169 133 252 161 224 125 81 253 117 254 153 178 166 34 26 180 249 135 33 222 152 13 1 40 32 168 235 44 56 166 243 210 154 91 226 40 229 249 145 209 125 211 169 133 252 161 224 125 81 253 117 254 153 178 166 34 26 180 249 135 33 222 152 13 0 16 114 51 72 217 92 64 168 124 50 132 58 208 128 106 1 0 1 16 114 51 72 217 92 64 168 124 50 132 58 208 128 106 1 0 0 68 69 4 0 153 42 90 20 74 230 90 168 97 72 101 100 19 28 241 147 219 3 93 60 246 145 183 55 230 232 224 115 211 143 158 209 214 247 84 89 209 186 139 133 34 124 5 207 184 125 115 201 88 222 241 97 109 108 6 13 211 125 187 117 94 222 2 0 0 1 68 69 4 0 153 42 90 20 74 230 90 168 97 72 101 100 19 28 241 147 219 3 93 60 246 145 183 55 230 232 224 115 211 143 158 209 214 247 84 89 209 186 139 133 34 124 5 207 184 125 115 201 88 222 241 97 109 108 6 13 211 125 187 117 94 222 2 0 0 0 52 153 84 205 104 19 159 225 153 148 74 194 235 72 23 144 76 152 243 229 1 90 189 92 32 175 52 88 183 242 20 84 239 175 56 99 222 31 211 114 93 122 135 65 160 226 51 48 207 12 116 28 0 1 52 153 84 205 104 19 159 225 153 148 74 194 235 72 23 144 76 152 243 229 1 90 189 92 32 175 52 88 183 242 20 84 239 175 56 99 222 31 211 114 93 122 135 65 160 226 51 48 207 12 116 28 0 0 68 245 53 109 105 191 82 1 66 103 122 80 160 241 193 52 254 117 182 127 138 99 142 106 221 128 239 15 222 14 129 176 110 43 113 122 176 232 88 250 58 0 161 215 14 126 59 139 23 140 13 122 239 14 189 40 72 35 18 82 213 254 53 121 213 234 12 0 0 1 68 245 53 109 105 191 82 1 66 103 122 80 160 241 193 52 254 117 182 127 138 99 142 106 221 128 239 15 222 14 129 176 110 43 113 122 176 232 88 250 58 0 161 215 14 126 59 139 23 140 13 122 239 14 189 40 72 35 18 82 213 254 53 121 213 234 12 0 0 0 112 159 8 16 9 71 195 199 198 21 242 159 80 249 120 17 254 76 140 121 166 78 213 92 89 178 160 20 177 8 14 182 122 65 115 133 119 121 16 112 118 105 211 205 62 12 236 55 80 1 131 163 0 83 205 178 80 88 102 233 133 195 61 239 174 246 227 234 216 85 176 76 5 36 121 112 51 212 181 246 245 241 105 195 137 147 72 56 237 179 190 73 134 142 177 146 141 8 159 112 222 16 234 231 234 198 20 89 52 189 194 119 1 1 112 159 8 16 9 71 195 199 198 21 242 159 80 249 120 17 254 76 140 121 166 78 213 92 89 178 160 20 177 8 14 182 122 65 115 133 119 121 16 112 118 105 211 205 62 12 236 55 80 1 131 163 0 83 205 178 80 88 102 233 133 195 61 239 174 246 227 234 216 85 176 76 5 36 121 112 51 212 181 246 245 241 105 195 137 147 72 56 237 179 190 73 134 142 177 146 141 8 159 112 222 16 234 231 234 198 20 89 52 189 194 119 1 0 108 80 214 13 177 215 159 125 169 151 12 42 72 121 18 76 208 238 240 149 68 234 73 20 164 91 171 220 52 255 98 21 228 111 4 175 56 163 222 123 128 30 97 59 67 228 49 187 237 223 220 86 109 144 229 187 251 70 7 146 195 116 106 122 232 185 78 78 58 225 39 134 160 118 235 208 242 69 148 226 101 73 25 136 159 25 99 137 101 248 54 26 247 229 7 34 61 19 28 201 190 36 74 102 133 25 0 0 0 1 108 80 214 13 177 215 159 125 169 151 12 42 72 121 18 76 208 238 240 149 68 234 73 20 164 91 171 220 52 255 98 21 228 111 4 175 56 163 222 123 128 30 97 59 67 228 49 187 237 223 220 86 109 144 229 187 251 70 7 146 195 116 106 122 232 185 78 78 58 225 39 134 160 118 235 208 242 69 148 226 101 73 25 136 159 25 99 137 101 248 54 26 247 229 7 34 61 19 28 201 190 36 74 102 133 25 0 0 0 0 48 214 54 94 179 164 240 155 40 191 186 107 180 206 48 82 137 213 91 241 62 39 183 229 184 237 121 223 179 199 117 185 240 244 56 38 125 32 5 140 166 122 78 243 77 252 116 1 0 1 48 214 54 94 179 164 240 155 40 191 186 107 180 206 48 82 137 213 91 241 62 39 183 229 184 237 121 223 179 199 117 185 240 244 56 38 125 32 5 140 166 122 78 243 77 252 116 1 0 0 104 54 55 200 109 82 156 202 152 175 66 36 193 252 78 5 135 125 117 139 57 40 153 71 77 232 6 37 188 28 77 2 71 137 173 143 223 127 105 125 144 234 178 168 38 38 22 213 12 86 146 58 86 128 124 44 36 53 34 45 2 168 71 121 160 250 8 153 10 51 71 123 250 225 95 140 177 159 103 47 148 120 154 141 97 250 155 186 25 61 104 158 48 167 246 20 132 6 84 93 66 112 47 0 0 1 104 54 55 200 109 82 156 202 152 175 66 36 193 252 78 5 135 125 117 139 57 40 153 71 77 232 6 37 188 28 77 2 71 137 173 143 223 127 105 125 144 234 178 168 38 38 22 213 12 86 146 58 86 128 124 44 36 53 34 45 2 168 71 121 160 250 8 153 10 51 71 123 250 225 95 140 177 159 103 47 148 120 154 141 97 250 155 186 25 61 104 158 48 167 246 20 132 6 84 93 66 112 47 0 0 0 120 6 90 182 206 193 58 216 170 220 9 22 52 156 242 120 157 30 209 26 98 51 196 178 88 228 65 154 229 210 70 170 198 64 16 247 102 16 21 58 87 235 200 244 76 203 136 132 209 76 195 94 143 2 113 149 235 158 1 227 205 1 208 16 81 131 189 40 241 92 36 170 156 224 56 199 188 154 79 125 102 121 78 97 150 233 11 79 62 109 25 212 226 161 220 35 23 232 13 90 56 183 223 124 31 159 158 14 223 62 85 83 193 110 187 158 93 203 8 0 0 1 120 6 90 182 206 193 58 216 170 220 9 22 52 156 242 120 157 30 209 26 98 51 196 178 88 228 65 154 229 210 70 170 198 64 16 247 102 16 21 58 87 235 200 244 76 203 136 132 209 76 195 94 143 2 113 149 235 158 1 227 205 1 208 16 81 131 189 40 241 92 36 170 156 224 56 199 188 154 79 125 102 121 78 97 150 233 11 79 62 109 25 212 226 161 220 35 23 232 13 90 56 183 223 124 31 159 158 14 223 62 85 83 193 110 187 158 93 203 8 0 0 0 84 47 45 238 181 215 239 242 99 34 179 237 146 38 184 178 32 39 156 91 232 37 68 223 154 247 174 99 147 112 220 68 13 168 71 188 111 58 166 58 109 244 156 76 173 12 217 7 247 229 168 222 84 82 81 171 9 74 74 20 144 71 106 164 117 234 163 235 12 58 184 167 68 145 254 103 0 233 175 219 91 115 45 23 0 1 84 47 45 238 181 215 239 242 99 34 179 237 146 38 184 178 32 39 156 91 232 37 68 223 154 247 174 99 147 112 220 68 13 168 71 188 111 58 166 58 109 244 156 76 173 12 217 7 247 229 168 222 84 82 81 171 9 74 74 20 144 71 106 164 117 234 163 235 12 58 184 167 68 145 254 103 0 233 175 219 91 115 45 23 0 0 72 40 180 241 104 90 252 242 234 235 240 236 39 250 255 76 167 29 116 156 87 88 207 205 175 125 89 77 12 21 97 61 253 152 65 25 101 5 139 108 225 153 138 24 18 112 100 115 211 39 249 92 242 104 78 15 126 214 21 35 238 183 248 195 174 170 41 249 203 160 8 0 0 1 72 40 180 241 104 90 252 242 234 235 240 236 39 250 255 76 167 29 116 156 87 88 207 205 175 125 89 77 12 21 97 61 253 152 65 25 101 5 139 108 225 153 138 24 18 112 100 115 211 39 249 92 242 104 78 15 126 214 21 35 238 183 248 195 174 170 41 249 203 160 8 0 0 0 52 22 27 151 194 115 92 119 11 236 51 137 144 137 103 129 95 89 105 130 240 243 170 243 35 191 215 206 102 95 172 26 80 149 177 248 238 54 111 45 244 22 23 22 224 158 95 94 118 19 0 0 0 1 52 22 27 151 194 115 92 119 11 236 51 137 144 137 103 129 95 89 105 130 240 243 170 243 35 191 215 206 102 95 172 26 80 149 177 248 238 54 111 45 244 22 23 22 224 158 95 94 118 19 0 0 0 0 20 156 43 16 56 55 4 61 155 177 58 74 163 225 4 11 131 179 24 1 0 1 20 156 43 16 56 55 4 61 155 177 58 74 163 225 4 11 131 179 24 1 0 0 104 73 76 101 151 31 35 209 56 36 69 31 173 147 81 94 123 172 22 210 79 45 203 20 140 58 218 46 34 183 138 96 94 97 161 218 71 10 21 254 228 117 64 245 83 14 74 129 103 121 90 57 125 205 210 39 213 162 107 185 36 194 249 86 241 82 226 200 210 202 80 195 105 63 67 249 109 65 100 248 77 32 184 210 162 76 62 215 70 139 167 97 35 196 73 132 172 243 85 144 160 14 20 22 193 1 104 73 76 101 151 31 35 209 56 36 69 31 173 147 81 94 123 172 22 210 79 45 203 20 140 58 218 46 34 183 138 96 94 97 161 218 71 10 21 254 228 117 64 245 83 14 74 129 103 121 90 57 125 205 210 39 213 162 107 185 36 194 249 86 241 82 226 200 210 202 80 195 105 63 67 249 109 65 100 248 77 32 184 210 162 76 62 215 70 139 167 97 35 196 73 132 172 243 85 144 160 14 20 22 193 0 28 126 1 30 104 79 113 99 127 177 76 179 201 53 24 182 29 192 54 96 132 91 248 133 211 86 2 0 0 1 28 126 1 30 104 79 113 99 127 177 76 179 201 53 24 182 29 192 54 96 132 91 248 133 211 86 2 0 0 0 72 92 159 45 128 70 93 245 63 92 118 241 226 212 23 182 127 131 42 229 253 64 210 240 253 132 150 70 236 28 94 44 2 105 246 1 151 224 138 233 135 254 20 25 124 118 13 182 172 20 197 252 20 174 143 186 57 51 58 222 119 36 51 0 104 163 78 183 107 2 0 0 0 1 72 92 159 45 128 70 93 245 63 92 118 241 226 212 23 182 127 131 42 229 253 64 210 240 253 132 150 70 236 28 94 44 2 105 246 1 151 224 138 233 135 254 20 25 124 118 13 182 172 20 197 252 20 174 143 186 57 51 58 222 119 36 51 0 104 163 78 183 107 2 0 0 0 0 124 74 103 198 93 113 70 83 77 90 199 193 206 145 183 35 249 192 236 161 64 7 17 137 53 0 187 116 255 249 232 191 215 71 6 51 192 57 52 156 221 118 241 145 238 148 141 72 31 162 90 235 117 210 45 34 240 215 118 239 161 128 10 59 244 108 240 132 108 62 94 40 142 165 219 48 78 211 95 143 5 181 44 128 205 117 175 172 46 236 144 98 44 44 86 152 86 44 46 101 89 209 229 168 49 93 54 154 211 126 167 37 43 164 36 251 17 187 90 218 47 68 10 0 0 1 124 74 103 198 93 113 70 83 77 90 199 193 206 145 183 35 249 192 236 161 64 7 17 137 53 0 187 116 255 249 232 191 215 71 6 51 192 57 52 156 221 118 241 145 238 148 141 72 31 162 90 235 117 210 45 34 240 215 118 239 161 128 10 59 244 108 240 132 108 62 94 40 142 165 219 48 78 211 95 143 5 181 44 128 205 117 175 172 46 236 144 98 44 44 86 152 86 44 46 101 89 209 229 168 49 93 54 154 211 126 167 37 43 164 36 251 17 187 90 218 47 68 10 0 0 0 48 5 35 182 112 113 188 253 125 124 37 72 205 161 238 42 235 141 207 222 101 115 216 55 107 133 114 20 89 39 233 135 120 225 238 214 101 146 108 76 33 35 58 202 67 65 1 0 0 1 48 5 35 182 112 113 188 253 125 124 37 72 205 161 238 42 235 141 207 222 101 115 216 55 107 133 114 20 89 39 233 135 120 225 238 214 101 146 108 76 33 35 58 202 67 65 1 0 0 0 128 104 135 234 221 147 43 69 249 95 82 22 184 215 149 229 138 106 92 255 169 236 121 106 240 235 221 243 154 22 155 148 218 188 88 136 234 72 234 250 14 92 227 117 188 12 118 41 224 174 244 46 222 46 196 200 235 191 13 185 217 77 182 148 203 3 127 173 173 34 254 84 187 72 234 176 92 208 9 125 82 232 207 39 192 114 153 168 166 210 148 43 5 225 117 107 205 99 179 177 46 90 12 119 11 225 27 124 151 136 98 153 156 122 129 197 79 159 225 89 237 180 211 34 198 224 232 1 0 1 128 104 135 234 221 147 43 69 249 95 82 22 184 215 149 229 138 106 92 255 169 236 121 106 240 235 221 243 154 22 155 148 218 188 88 136 234 72 234 250 14 92 227 117 188 12 118 41 224 174 244 46 222 46 196 200 235 191 13 185 217 77 182 148 203 3 127 173 173 34 254 84 187 72 234 176 92 208 9 125 82 232 207 39 192 114 153 168 166 210 148 43 5 225 117 107 205 99 179 177 46 90 12 119 11 225 27 124 151 136 98 153 156 122 129 197 79 159 225 89 237 180 211 34 198 224 232 1 0 0 124 30 16 152 189 248 187 194 106 86 218 107 172 24 210 165 36 4 181 124 54 238 59 132 56 110 109 236 68 95 102 145 133 240 159 128 36 169 4 207 140 229 186 242 94 18 174 89 159 26 138 112 65 245 118 85 137 113 110 126 144 76 37 227 235 138 77 233 26 84 155 51 80 31 201 113 46 222 200 95 96 232 140 13 80 38 36 30 104 180 121 216 89 15 185 161 136 55 32 42 160 149 50 168 225 1 104 50 30 10 3 96 136 60 23 224 146 203 81 219 70 1 0 0 0 1 124 30 16 152 189 248 187 194 106 86 218 107 172 24 210 165 36 4 181 124 54 238 59 132 56 110 109 236 68 95 102 145 133 240 159 128 36 169 4 207 140 229 186 242 94 18 174 89 159 26 138 112 65 245 118 85 137 113 110 126 144 76 37 227 235 138 77 233 26 84 155 51 80 31 201 113 46 222 200 95 96 232 140 13 80 38 36 30 104 180 121 216 89 15 185 161 136 55 32 42 160 149 50 168 225 1 104 50 30 10 3 96 136 60 23 224 146 203 81 219 70 1 0 0 0 0 32 31 3 148 175 154 99 152 211 246 153 40 92 93 24 93 5 168 109 224 21 185 107 37 219 63 153 164 130 241 93 111 0 1 32 31 3 148 175 154 99 152 211 246 153 40 92 93 24 93 5 168 109 224 21 185 107 37 219 63 153 164 130 241 93 111 0 0 112 73 246 239 200 138 198 5 244 5 61 186 215 203 39 176 220 88 141 123 23 70 239 91 228 24 9 208 86 173 30 190 190 160 205 169 222 186 254 3 42 110 229 120 37 181 245 217 107 172 221 147 223 37 33 9 82 153 101 228 62 236 28 113 251 178 124 157 88 255 13 110 233 60 45 129 160 39 244 17 113 220 114 236 12 12 23 203 127 173 99 182 203 235 40 81 17 163 180 158 157 229 232 88 42 248 234 216 11 207 20 25 51 1 112 73 246 239 200 138 198 5 244 5 61 186 215 203 39 176 220 88 141 123 23 70 239 91 228 24 9 208 86 173 30 190 190 160 205 169 222 186 254 3 42 110 229 120 37 181 245 217 107 172 221 147 223 37 33 9 82 153 101 228 62 236 28 113 251 178 124 157 88 255 13 110 233 60 45 129 160 39 244 17 113 220 114 236 12 12 23 203 127 173 99 182 203 235 40 81 17 163 180 158 157 229 232 88 42 248 234 216 11 207 20 25 51 0 4 39 132 6 0 1 4 39 132 6 0 0 72 220 180 23 131 143 83 213 131 208 206 205 120 25 87 192 44 119 67 69 124 227 114 112 253 61 85 176 134 4 56 189 104 188 137 70 0 24 85 129 75 88 245 68 129 51 145 7 213 104 238 115 223 7 147 12 4 53 239 245 119 158 197 135 154 106 50 38 170 151 176 21 0 1 72 220 180 23 131 143 83 213 131 208 206 205 120 25 87 192 44 119 67 69 124 227 114 112 253 61 85 176 134 4 56 189 104 188 137 70 0 24 85 129 75 88 245 68 129 51 145 7 213 104 238 115 223 7 147 12 4 53 239 245 119 158 197 135 154 106 50 38 170 151 176 21 0 0 52 53 186 59 167 241 59 136 87 128 215 201 225 137 253 171 55 175 94 153 156 167 180 232 139 32 51 246 11 119 98 59 201 174 243 8 69 82 213 30 147 100 60 26 207 249 44 53 34 200 114 0 0 1 52 53 186 59 167 241 59 136 87 128 215 201 225 137 253 171 55 175 94 153 156 167 180 232 139 32 51 246 11 119 98 59 201 174 243 8 69 82 213 30 147 100 60 26 207 249 44 53 34 200 114 0 0 0 80 174 62 24 34 239 200 187 235 239 204 93 34 151 115 205 129 228 152 167 94 171 72 91 21 73 128 43 106 226 191 23 128 76 125 32 132 209 72 252 64 195 197 154 199 15 13 192 133 198 108 88 181 61 227 187 44 34 215 108 151 40 54 253 218 203 218 197 100 1 207 108 14 183 168 181 1 75 68 203 52 1 80 174 62 24 34 239 200 187 235 239 204 93 34 151 115 205 129 228 152 167 94 171 72 91 21 73 128 43 106 226 191 23 128 76 125 32 132 209 72 252 64 195 197 154 199 15 13 192 133 198 108 88 181 61 227 187 44 34 215 108 151 40 54 253 218 203 218 197 100 1 207 108 14 183 168 181 1 75 68 203 52 0 100 178 153 248 14 228 148 99 29 41 180 54 4 212 37 168 181 45 110 40 79 241 192 17 133 242 242 158 27 85 230 33 102 187 163 67 188 94 83 9 227 224 31 154 239 89 44 152 114 79 160 147 226 52 244 38 46 88 71 34 217 114 156 13 83 85 223 134 253 133 126 56 188 90 85 65 29 106 94 50 165 88 56 132 55 180 80 212 40 199 4 162 37 213 90 184 228 101 203 7 49 1 100 178 153 248 14 228 148 99 29 41 180 54 4 212 37 168 181 45 110 40 79 241 192 17 133 242 242 158 27 85 230 33 102 187 163 67 188 94 83 9 227 224 31 154 239 89 44 152 114 79 160 147 226 52 244 38 46 88 71 34 217 114 156 13 83 85 223 134 253 133 126 56 188 90 85 65 29 106 94 50 165 88 56 132 55 180 80 212 40 199 4 162 37 213 90 184 228 101 203 7 49 0 76 38 182 96 145 194 1 121 109 64 49 154 66 199 208 229 235 239 165 41 198 204 230 234 178 15 29 203 140 160 143 49 211 78 57 102 214 114 58 133 221 75 184 224 8 199 190 6 247 208 197 161 3 41 23 120 225 80 183 58 134 227 154 146 238 63 175 177 103 131 253 150 250 82 57 2 3 1 76 38 182 96 145 194 1 121 109 64 49 154 66 199 208 229 235 239 165 41 198 204 230 234 178 15 29 203 140 160 143 49 211 78 57 102 214 114 58 133 221 75 184 224 8 199 190 6 247 208 197 161 3 41 23 120 225 80 183 58 134 227 154 146 238 63 175 177 103 131 253 150 250 82 57 2 3 0 64 248 119 27 143 213 236 116 221 199 155 29 196 80 96 187 63 97 42 122 209 144 117 56 28 149 170 177 209 56 44 150 204 131 187 222 85 190 214 23 67 242 17 199 67 116 180 19 62 92 46 154 222 244 151 104 165 83 192 191 210 45 2 0 0 1 64 248 119 27 143 213 236 116 221 199 155 29 196 80 96 187 63 97 42 122 209 144 117 56 28 149 170 177 209 56 44 150 204 131 187 222 85 190 214 23 67 242 17 199 67 116 180 19 62 92 46 154 222 244 151 104 165 83 192 191 210 45 2 0 0 0 28 75 182 65 120 225 60 231 204 95 201 188 204 81 75 120 231 176 122 123 44 181 212 75 241 199 197 22 0 1 28 75 182 65 120 225 60 231 204 95 201 188 204 81 75 120 231 176 122 123 44 181 212 75 241 199 197 22 0 0 72 223 250 238 211 74 58 16 147 125 7 190 218 142 15 49 69 24 56 233 70 213 49 22 223 242 236 38 167 130 195 39 254 92 251 3 205 152 4 121 107 79 85 199 20 69 53 93 242 156 125 37 228 96 255 30 188 96 67 150 203 206 75 217 143 153 171 129 99 51 5 0 0 1 72 223 250 238 211 74 58 16 147 125 7 190 218 142 15 49 69 24 56 233 70 213 49 22 223 242 236 38 167 130 195 39 254 92 251 3 205 152 4 121 107 79 85 199 20 69 53 93 242 156 125 37 228 96 255 30 188 96 67 150 203 206 75 217 143 153 171 129 99 51 5 0 0 0 40 108 135 124 124 29 149 22 174 63 189 26 9 249 247 17 17 89 247 0 255 90 36 201 133 122 164 9 110 235 211 222 139 25 132 124 219 40 148 57 0 1 40 108 135 124 124 29 149 22 174 63 189 26 9 249 247 17 17 89 247 0 255 90 36 201 133 122 164 9 110 235 211 222 139 25 132 124 219 40 148 57 0 0 4 221 214 2 0 1 4 221 214 2 0 0 64 147 243 38 63 33 71 153 12 98 251 245 150 131 176 144 216 39 46 89 50 223 16 34 113 69 13 67 16 135 235 91 48 79 129 250 166 204 227 58 148 218 46 57 182 34 191 165 85 34 220 7 11 186 11 50 182 83 77 72 179 7 0 0 0 1 64 147 243 38 63 33 71 153 12 98 251 245 150 131 176 144 216 39 46 89 50 223 16 34 113 69 13 67 16 135 235 91 48 79 129 250 166 204 227 58 148 218 46 57 182 34 191 165 85 34 220 7 11 186 11 50 182 83 77 72 179 7 0 0 0 0 116 233 246 77 131 243 68 158 180 136 87 207 157 192 121 128 83 72 237 157 134 56 179 201 1 58 190 146 20 153 238 215 88 195 223 67 97 118 17 130 145 223 169 2 15 100 207 216 142 60 64 52 15 48 69 172 151 212 137 218 247 204 232 97 61 38 179 246 161 46 207 132 202 4 168 89 164 121 208 120 93 104 32 129 66 68 235 47 162 233 166 150 103 24 240 136 140 27 137 9 61 79 35 201 200 190 255 32 23 133 194 43 148 11 47 84 2 1 116 233 246 77 131 243 68 158 180 136 87 207 157 192 121 128 83 72 237 157 134 56 179 201 1 58 190 146 20 153 238 215 88 195 223 67 97 118 17 130 145 223 169 2 15 100 207 216 142 60 64 52 15 48 69 172 151 212 137 218 247 204 232 97 61 38 179 246 161 46 207 132 202 4 168 89 164 121 208 120 93 104 32 129 66 68 235 47 162 233 166 150 103 24 240 136 140 27 137 9 61 79 35 201 200 190 255 32 23 133 194 43 148 11 47 84 2 0 32 158 132 247 73 243 86 76 181 117 114 74 0 73 167 54 232 186 178 119 62 251 36 87 106 243 46 78 254 30 13 0 0 1 32 158 132 247 73 243 86 76 181 117 114 74 0 73 167 54 232 186 178 119 62 251 36 87 106 243 46 78 254 30 13 0 0 0 28 187 109 237 12 177 145 13 138 110 36 103 212 219 254 32 2 199 207 206 58 33 91 157 82 142 0 0 0 1 28 187 109 237 12 177 145 13 138 110 36 103 212 219 254 32 2 199 207 206 58 33 91 157 82 142 0 0 0 0 108 191 156 137 40 227 120 81 180 191 249 128 101 54 189 222 126 135 44 172 229 198 254 122 200 254 68 241 155 189 52 134 12 32 127 165 213 33 74 112 219 180 120 124 62 203 145 126 182 239 201 194 229 70 199 78 71 165 89 3 82 85 207 202 83 229 239 95 208 222 39 184 4 206 170 105 230 130 175 81 36 41 97 157 125 234 216 239 63 206 58 107 124 78 26 131 144 70 157 163 62 27 234 177 215 202 140 179 217 1 108 191 156 137 40 227 120 81 180 191 249 128 101 54 189 222 126 135 44 172 229 198 254 122 200 254 68 241 155 189 52 134 12 32 127 165 213 33 74 112 219 180 120 124 62 203 145 126 182 239 201 194 229 70 199 78 71 165 89 3 82 85 207 202 83 229 239 95 208 222 39 184 4 206 170 105 230 130 175 81 36 41 97 157 125 234 216 239 63 206 58 107 124 78 26 131 144 70 157 163 62 27 234 177 215 202 140 179 217 0 116 255 98 44 67 145 156 67 69 207 144 154 245 114 32 23 127 211 123 148 182 146 150 170 172 74 232 254 188 127 136 34 39 122 230 35 121 2 76 118 160 187 17 37 250 134 176 133 100 139 227 15 230 54 106 167 246 167 233 207 141 247 103 135 96 18 251 188 166 202 113 88 34 38 81 212 236 236 142 153 242 1 12 51 124 236 57 28 83 109 124 63 127 190 114 111 5 105 32 46 141 46 195 82 228 121 27 143 106 94 116 99 98 35 8 0 0 1 116 255 98 44 67 145 156 67 69 207 144 154 245 114 32 23 127 211 123 148 182 146 150 170 172 74 232 254 188 127 136 34 39 122 230 35 121 2 76 118 160 187 17 37 250 134 176 133 100 139 227 15 230 54 106 167 246 167 233 207 141 247 103 135 96 18 251 188 166 202 113 88 34 38 81 212 236 236 142 153 242 1 12 51 124 236 57 28 83 109 124 63 127 190 114 111 5 105 32 46 141 46 195 82 228 121 27 143 106 94 116 99 98 35 8 0 0 0 28 232 106 75 132 234 67 145 119 175 2 68 218 133 30 27 34 7 172 120 42 19 45 118 178 216 1 0 0 1 28 232 106 75 132 234 67 145 119 175 2 68 218 133 30 27 34 7 172 120 42 19 45 118 178 216 1 0 0 0 60 129 215 181 185 15 177 200 177 68 80 119 183 36 206 190 141 54 145 230 111 190 97 150 77 141 67 185 87 206 214 237 78 15 79 202 150 147 74 113 9 154 9 23 173 146 190 131 137 247 142 224 174 235 35 57 206 3 0 0 0 1 60 129 215 181 185 15 177 200 177 68 80 119 183 36 206 190 141 54 145 230 111 190 97 150 77 141 67 185 87 206 214 237 78 15 79 202 150 147 74 113 9 154 9 23 173 146 190 131 137 247 142 224 174 235 35 57 206 3 0 0 0 0 32 115 158 93 203 145 117 229 203 77 183 195 60 46 1 188 230 187 238 14 154 176 183 66 57 250 253 70 58 37 0 0 0 1 32 115 158 93 203 145 117 229 203 77 183 195 60 46 1 188 230 187 238 14 154 176 183 66 57 250 253 70 58 37 0 0 0 0 20 81 129 71 67 43 121 89 51 236 18 78 211 96 141 172 26 113 13 214 3 1 20 81 129 71 67 43 121 89 51 236 18 78 211 96 141 172 26 113 13 214 3 0 24 184 13 246 1 153 149 55 198 59 23 173 215 119 87 65 163 114 196 32 40 213 121 0 0 1 24 184 13 246 1 153 149 55 198 59 23 173 215 119 87 65 163 114 196 32 40 213 121 0 0 0 32 56 51 141 41 47 230 78 216 176 139 28 23 160 170 28 45 110 124 64 37 171 195 108 121 74 182 76 40 76 153 115 0 1 32 56 51 141 41 47 230 78 216 176 139 28 23 160 170 28 45 110 124 64 37 171 195 108 121 74 182 76 40 76 153 115 0 0 32 206 242 236 149 72 96 46 45 248 108 12 136 166 194 52 138 152 63 46 130 98 126 192 209 228 24 24 197 243 7 0 0 1 32 206 242 236 149 72 96 46 45 248 108 12 136 166 194 52 138 152 63 46 130 98 126 192 209 228 24 24 197 243 7 0 0 0 104 163 224 244 5 84 160 193 30 20 248 69 99 186 48 205 24 55 21 110 164 203 99 211 59 80 177 211 86 41 161 229 184 106 19 96 95 57 76 140 135 150 249 39 235 242 249 52 35 6 105 190 17 117 228 226 214 214 171 123 84 78 178 176 91 241 160 229 1 232 67 196 8 201 235 118 130 80 124 105 29 101 75 30 179 181 153 56 118 147 86 245 65 10 214 206 110 133 122 248 252 15 53 12 0 1 104 163 224 244 5 84 160 193 30 20 248 69 99 186 48 205 24 55 21 110 164 203 99 211 59 80 177 211 86 41 161 229 184 106 19 96 95 57 76 140 135 150 249 39 235 242 249 52 35 6 105 190 17 117 228 226 214 214 171 123 84 78 178 176 91 241 160 229 1 232 67 196 8 201 235 118 130 80 124 105 29 101 75 30 179 181 153 56 118 147 86 245 65 10 214 206 110 133 122 248 252 15 53 12 0 0 56 255 163 247 43 209 230 164 208 61 194 65 9 8 102 145 97 240 236 201 123 138 71 245 15 204 218 185 57 76 20 213 174 59 153 22 62 121 255 64 38 76 67 69 50 49 114 127 89 242 171 78 13 84 189 144 206 1 56 255 163 247 43 209 230 164 208 61 194 65 9 8 102 145 97 240 236 201 123 138 71 245 15 204 218 185 57 76 20 213 174 59 153 22 62 121 255 64 38 76 67 69 50 49 114 127 89 242 171 78 13 84 189 144 206 0 64 119 123 244 71 66 212 59 231 215 217 150 174 254 235 5 68 31 31 6 176 61 197 15 162 18 140 92 194 120 2 15 65 53 175 46 99 56 24 73 7 37 185 106 245 175 110 29 253 204 28 202 76 47 79 71 204 251 4 48 167 1 0 0 0 1 64 119 123 244 71 66 212 59 231 215 217 150 174 254 235 5 68 31 31 6 176 61 197 15 162 18 140 92 194 120 2 15 65 53 175 46 99 56 24 73 7 37 185 106 245 175 110 29 253 204 28 202 76 47 79 71 204 251 4 48 167 1 0 0 0 0 40 75 92 25 115 221 208 198 30 142 204 73 223 50 228 83 175 70 246 95 204 121 169 116 174 231 117 55 245 122 146 164 239 74 119 247 71 4 100 3 243 1 40 75 92 25 115 221 208 198 30 142 204 73 223 50 228 83 175 70 246 95 204 121 169 116 174 231 117 55 245 122 146 164 239 74 119 247 71 4 100 3 243 0 12 34 19 120 45 63 194 247 76 181 223 195 16 1 12 34 19 120 45 63 194 247 76 181 223 195 16 0 120 11 156 157 89 152 7 19 248 49 41 66 116 237 10 201 152 231 23 143 156 186 202 203 178 43 1 204 30 223 30 82 205 180 255 123 84 194 132 200 55 172 127 23 130 112 165 163 165 42 122 249 39 165 158 69 42 153 176 150 166 240 46 132 80 211 8 120 35 97 238 127 32 91 232 38 236 223 213 67 53 103 162 194 187 151 60 152 119 172 25 69 23 189 153 199 219 236 157 195 152 26 202 31 27 199 10 79 34 126 168 67 114 24 246 235 163 169 176 2 0 1 120 11 156 157 89 152 7 19 248 49 41 66 116 237 10 201 152 231 23 143 156 186 202 203 178 43 1 204 30 223 30 82 205 180 255 123 84 194 132 200 55 172 127 23 130 112 165 163 165 42 122 249 39 165 158 69 42 153 176 150 166 240 46 132 80 211 8 120 35 97 238 127 32 91 232 38 236 223 213 67 53 103 162 194 187 151 60 152 119 172 25 69 23 189 153 199 219 236 157 195 152 26 202 31 27 199 10 79 34 126 168 67 114 24 246 235 163 169 176 2 0 0 84 85 223 220 13 86 122 92 125 254 224 25 165 190 213 4 132 224 45 245 246 242 4 21 101 215 192 193 89 76 244 92 59 156 26 236 182 254 202 196 35 75 32 109 229 252 167 15 126 64 249 191 76 96 115 179 17 42 165 113 135 249 231 21 159 208 162 179 200 212 213 61 123 49 118 34 59 181 1 182 39 112 251 16 0 1 84 85 223 220 13 86 122 92 125 254 224 25 165 190 213 4 132 224 45 245 246 242 4 21 101 215 192 193 89 76 244 92 59 156 26 236 182 254 202 196 35 75 32 109 229 252 167 15 126 64 249 191 76 96 115 179 17 42 165 113 135 249 231 21 159 208 162 179 200 212 213 61 123 49 118 34 59 181 1 182 39 112 251 16 0 0 56 241 153 124 222 255 91 80 137 188 25 206 200 154 27 122 16 125 75 240 248 246 78 65 142 23 205 193 163 87 157 134 225 91 123 69 215 210 244 123 101 159 224 170 194 255 111 207 183 177 8 44 102 228 238 181 2 1 56 241 153 124 222 255 91 80 137 188 25 206 200 154 27 122 16 125 75 240 248 246 78 65 142 23 205 193 163 87 157 134 225 91 123 69 215 210 244 123 101 159 224 170 194 255 111 207 183 177 8 44 102 228 238 181 2 0 84 108 208 238 121 156 133 32 223 68 75 136 121 125 29 189 121 101 228 164 37 65 109 220 250 136 48 233 198 101 96 135 47 117 233 2 196 191 211 238 100 182 234 243 0 91 97 184 199 182 220 252 38 146 252 212 245 32 52 172 255 55 60 67 104 138 139 119 31 23 22 151 0 79 220 46 31 165 72 73 119 91 0 0 0 1 84 108 208 238 121 156 133 32 223 68 75 136 121 125 29 189 121 101 228 164 37 65 109 220 250 136 48 233 198 101 96 135 47 117 233 2 196 191 211 238 100 182 234 243 0 91 97 184 199 182 220 252 38 146 252 212 245 32 52 172 255 55 60 67 104 138 139 119 31 23 22 151 0 79 220 46 31 165 72 73 119 91 0 0 0 0 24 213 179 45 133 224 12 22 86 217 206 37 101 183 225 74 147 210 205 0 173 128 31 240 53 1 24 213 179 45 133 224 12 22 86 217 206 37 101 183 225 74 147 210 205 0 173 128 31 240 53 0 76 90 55 247 101 97 91 255 60 228 172 4 69 150 197 105 130 9 216 50 222 145 121 93 91 122 8 47 193 246 47 193 9 162 74 30 3 151 221 91 204 206 19 231 186 13 155 24 132 70 140 134 148 236 198 3 189 248 97 75 45 121 50 215 87 150 150 229 138 138 91 126 104 37 101 138 0 1 76 90 55 247 101 97 91 255 60 228 172 4 69 150 197 105 130 9 216 50 222 145 121 93 91 122 8 47 193 246 47 193 9 162 74 30 3 151 221 91 204 206 19 231 186 13 155 24 132 70 140 134 148 236 198 3 189 248 97 75 45 121 50 215 87 150 150 229 138 138 91 126 104 37 101 138 0 0 116 115 168 21 247 112 94 184 201 248 149 252 240 29 141 154 150 50 97 41 31 56 85 247 163 55 145 23 152 45 131 53 22 104 104 156 123 120 164 40 242 48 192 145 28 44 4 132 15 113 134 148 171 248 224 123 182 163 113 254 55 6 161 136 98 198 188 165 53 144 141 184 125 14 170 160 0 214 41 35 209 54 31 123 30 107 49 216 97 58 154 19 33 192 193 123 112 203 64 156 187 211 15 178 212 189 77 250 84 218 228 148 93 53 115 124 112 1 116 115 168 21 247 112 94 184 201 248 149 252 240 29 141 154 150 50 97 41 31 56 85 247 163 55 145 23 152 45 131 53 22 104 104 156 123 120 164 40 242 48 192 145 28 44 4 132 15 113 134 148 171 248 224 123 182 163 113 254 55 6 161 136 98 198 188 165 53 144 141 184 125 14 170 160 0 214 41 35 209 54 31 123 30 107 49 216 97 58 154 19 33 192 193 123 112 203 64 156 187 211 15 178 212 189 77 250 84 218 228 148 93 53 115 124 112 0 96 124 82 249 217 103 152 210 105 101 179 152 26 43 32 241 184 13 170 187 237 6 89 158 142 202 72 9 130 229 186 22 231 141 253 32 147 157 150 169 239 239 208 239 192 162 97 2 190 76 255 147 85 133 38 206 102 92 234 167 23 138 70 25 133 14 226 134 237 118 29 40 218 196 187 239 239 178 225 158 55 21 189 63 14 233 211 32 249 204 188 227 125 20 0 0 0 1 96 124 82 249 217 103 152 210 105 101 179 152 26 43 32 241 184 13 170 187 237 6 89 158 142 202 72 9 130 229 186 22 231 141 253 32 147 157 150 169 239 239 208 239 192 162 97 2 190 76 255 147 85 133 38 206 102 92 234 167 23 138 70 25 133 14 226 134 237 118 29 40 218 196 187 239 239 178 225 158 55 21 189 63 14 233 211 32 249 204 188 227 125 20 0 0 0 0 128 177 60 161 102 138 146 247 69 176 188 18 92 242 96 135 152 103 107 37 160 86 206 146 191 253 129 245 98 150 12 55 16 198 207 141 173 254 8 189 100 126 62 201 64 132 146 143 251 54 46 248 170 236 238 107 85 4 232 188 238 154 172 221 156 205 139 30 154 186 201 53 77 80 85 0 164 126 169 125 95 209 214 94 114 253 109 143 69 147 26 150 229 49 67 202 41 185 188 58 222 135 170 143 147 169 56 199 253 208 108 79 241 186 223 39 47 118 166 2 119 183 150 198 249 52 6 0 0 1 128 177 60 161 102 138 146 247 69 176 188 18 92 242 96 135 152 103 107 37 160 86 206 146 191 253 129 245 98 150 12 55 16 198 207 141 173 254 8 189 100 126 62 201 64 132 146 143 251 54 46 248 170 236 238 107 85 4 232 188 238 154 172 221 156 205 139 30 154 186 201 53 77 80 85 0 164 126 169 125 95 209 214 94 114 253 109 143 69 147 26 150 229 49 67 202 41 185 188 58 222 135 170 143 147 169 56 199 253 208 108 79 241 186 223 39 47 118 166 2 119 183 150 198 249 52 6 0 0 0 48 121 50 208 121 198 113 59 191 8 122 194 42 131 235 44 67 197 194 251 149 183 60 30 84 243 193 92 233 207 81 221 84 214 60 215 107 83 0 178 5 171 252 181 246 155 13 0 0 1 48 121 50 208 121 198 113 59 191 8 122 194 42 131 235 44 67 197 194 251 149 183 60 30 84 243 193 92 233 207 81 221 84 214 60 215 107 83 0 178 5 171 252 181 246 155 13 0 0 0 56 166 53 117 196 161 229 248 189 4 118 22 159 55 250 249 52 240 65 18 192 100 153 107 30 88 36 106 130 0 220 222 225 150 0 193 132 255 124 153 51 146 110 36 253 172 218 35 80 8 122 3 16 206 124 33 42 1 56 166 53 117 196 161 229 248 189 4 118 22 159 55 250 249 52 240 65 18 192 100 153 107 30 88 36 106 130 0 220 222 225 150 0 193 132 255 124 153 51 146 110 36 253 172 218 35 80 8 122 3 16 206 124 33 42 0 88 106 68 182 59 178 196 127 243 157 52 191 25 43 145 111 238 141 79 101 131 239 1 63 142 28 0 132 32 245 126 60 32 214 17 147 90 227 5 98 15 248 217 212 142 124 197 131 140 236 233 147 37 78 121 156 176 23 194 249 199 210 9 238 29 123 193 74 93 96 82 46 195 174 189 189 138 161 169 130 51 227 225 203 252 54 230 59 1 1 88 106 68 182 59 178 196 127 243 157 52 191 25 43 145 111 238 141 79 101 131 239 1 63 142 28 0 132 32 245 126 60 32 214 17 147 90 227 5 98 15 248 217 212 142 124 197 131 140 236 233 147 37 78 121 156 176 23 194 249 199 210 9 238 29 123 193 74 93 96 82 46 195 174 189 189 138 161 169 130 51 227 225 203 252 54 230 59 1 0 16 91 51 80 52 153 106 15 96 178 33 98 180 208 107 15 0 1 16 91 51 80 52 153 106 15 96 178 33 98 180 208 107 15 0 0 92 146 234 254 250 136 181 23 108 220 189 235 39 183 250 50 211 23 108 166 159 135 169 94 214 225 32 1 13 78 240 181 132 87 93 98 20 18 115 26 247 31 145 41 94 224 210 84 160 74 211 209 64 225 64 180 241 208 245 103 182 102 43 178 61 140 91 159 243 48 233 2 13 121 164 43 215 31 105 2 197 114 135 82 116 240 53 2 223 62 194 1 0 1 92 146 234 254 250 136 181 23 108 220 189 235 39 183 250 50 211 23 108 166 159 135 169 94 214 225 32 1 13 78 240 181 132 87 93 98 20 18 115 26 247 31 145 41 94 224 210 84 160 74 211 209 64 225 64 180 241 208 245 103 182 102 43 178 61 140 91 159 243 48 233 2 13 121 164 43 215 31 105 2 197 114 135 82 116 240 53 2 223 62 194 1 0 0 36 185 152 217 29 34 198 116 253 71 146 190 251 229 82 88 248 120 47 21 213 170 170 112 236 72 88 154 181 235 239 69 222 48 2 0 0 1 36 185 152 217 29 34 198 116 253 71 146 190 251 229 82 88 248 120 47 21 213 170 170 112 236 72 88 154 181 235 239 69 222 48 2 0 0 0 24 29 136 104 174 70 11 214 125 207 165 237 74 237 199 33 28 122 6 213 243 25 0 0 0 1 24 29 136 104 174 70 11 214 125 207 165 237 74 237 199 33 28 122 6 213 243 25 0 0 0 0 56 208 160 113 38 148 89 13 191 95 94 203 140 7 30 57 94 69 180 223 237 240 172 171 247 162 165 245 245 5 100 24 96 24 245 62 100 128 18 89 116 205 89 200 251 14 195 113 223 134 107 202 24 7 0 0 0 1 56 208 160 113 38 148 89 13 191 95 94 203 140 7 30 57 94 69 180 223 237 240 172 171 247 162 165 245 245 5 100 24 96 24 245 62 100 128 18 89 116 205 89 200 251 14 195 113 223 134 107 202 24 7 0 0 0 0 20 164 26 119 125 80 143 88 12 173 143 157 18 207 147 18 133 102 5 0 0 1 20 164 26 119 125 80 143 88 12 173 143 157 18 207 147 18 133 102 5 0 0 0 80 240 91 93 80 200 2 55 132 40 130 206 143 31 138 22 6 196 227 42 127 4 69 60 97 99 42 199 161 115 16 243 173 96 104 227 89 184 61 55 91 197 16 30 116 69 157 9 62 186 27 47 108 196 231 54 53 86 238 78 204 233 137 113 247 34 18 212 144 7 152 39 169 110 99 156 198 1 0 0 0 1 80 240 91 93 80 200 2 55 132 40 130 206 143 31 138 22 6 196 227 42 127 4 69 60 97 99 42 199 161 115 16 243 173 96 104 227 89 184 61 55 91 197 16 30 116 69 157 9 62 186 27 47 108 196 231 54 53 86 238 78 204 233 137 113 247 34 18 212 144 7 152 39 169 110 99 156 198 1 0 0 0 0 60 164 36 243 234 38 238 24 36 226 207 250 29 63 195 44 89 189 228 110 154 71 14 125 43 159 59 53 176 232 184 148 203 158 152 210 156 44 195 201 57 165 81 190 91 35 122 171 243 195 109 195 142 67 89 184 14 18 25 0 0 1 60 164 36 243 234 38 238 24 36 226 207 250 29 63 195 44 89 189 228 110 154 71 14 125 43 159 59 53 176 232 184 148 203 158 152 210 156 44 195 201 57 165 81 190 91 35 122 171 243 195 109 195 142 67 89 184 14 18 25 0 0 0 36 168 114 107 133 10 23 139 104 205 120 166 131 193 1 223 63 29 201 98 120 19 62 117 38 159 115 66 105 171 210 74 142 248 0 0 0 1 36 168 114 107 133 10 23 139 104 205 120 166 131 193 1 223 63 29 201 98 120 19 62 117 38 159 115 66 105 171 210 74 142 248 0 0 0 0 8 188 118 208 125 103 29 0 0 1 8 188 118 208 125 103 29 0 0 0 80 93 36 106 167 48 129 182 121 19 12 119 143 58 46 98 169 218 191 211 74 102 51 142 112 70 65 240 134 104 65 202 183 210 160 25 144 232 17 193 129 249 86 192 216 157 46 31 9 89 42 0 255 32 223 228 36 241 177 228 240 221 30 38 173 183 42 128 15 55 48 187 131 109 78 5 178 203 7 0 0 1 80 93 36 106 167 48 129 182 121 19 12 119 143 58 46 98 169 218 191 211 74 102 51 142 112 70 65 240 134 104 65 202 183 210 160 25 144 232 17 193 129 249 86 192 216 157 46 31 9 89 42 0 255 32 223 228 36 241 177 228 240 221 30 38 173 183 42 128 15 55 48 187 131 109 78 5 178 203 7 0 0 0 104 209 253 145 149 140 101 72 59 80 61 95 87 223 103 111 142 120 156 200 160 119 178 162 183 243 3 59 250 14 151 250 48 55 97 183 44 47 166 154 9 238 68 13 148 84 67 106 86 157 132 235 187 35 17 121 154 165 226 136 96 27 177 250 145 13 38 0 109 173 58 16 189 45 0 156 64 166 8 87 150 211 191 66 117 148 187 227 116 144 40 22 160 105 172 245 89 17 98 157 251 122 154 0 0 1 104 209 253 145 149 140 101 72 59 80 61 95 87 223 103 111 142 120 156 200 160 119 178 162 183 243 3 59 250 14 151 250 48 55 97 183 44 47 166 154 9 238 68 13 148 84 67 106 86 157 132 235 187 35 17 121 154 165 226 136 96 27 177 250 145 13 38 0 109 173 58 16 189 45 0 156 64 166 8 87 150 211 191 66 117 148 187 227 116 144 40 22 160 105 172 245 89 17 98 157 251 122 154 0 0 0 92 48 216 197 206 211 163 26 178 30 38 25 126 254 218 154 197 147 60 114 177 112 98 153 149 94 247 85 223 187 252 210 64 20 63 98 66 201 175 4 146 53 51 161 164 120 186 172 160 189 77 68 186 110 221 45 4 254 96 67 66 66 64 145 122 236 241 192 130 240 110 229 191 58 172 70 147 64 128 67 77 37 143 90 168 105 183 130 40 128 162 204 0 1 92 48 216 197 206 211 163 26 178 30 38 25 126 254 218 154 197 147 60 114 177 112 98 153 149 94 247 85 223 187 252 210 64 20 63 98 66 201 175 4 146 53 51 161 164 120 186 172 160 189 77 68 186 110 221 45 4 254 96 67 66 66 64 145 122 236 241 192 130 240 110 229 191 58 172 70 147 64 128 67 77 37 143 90 168 105 183 130 40 128 162 204 0 0 24 176 183 71 106 140 200 146 60 201 141 49 175 206 219 24 51 141 203 213 202 124 18 0 0 1 24 176 183 71 106 140 200 146 60 201 141 49 175 206 219 24 51 141 203 213 202 124 18 0 0 0 32 97 221 208 156 227 180 222 58 51 5 156 2 70 25 102 197 16 16 222 115 157 90 121 207 16 211 217 208 2 0 0 0 1 32 97 221 208 156 227 180 222 58 51 5 156 2 70 25 102 197 16 16 222 115 157 90 121 207 16 211 217 208 2 0 0 0 0 108 178 156 236 219 98 243 32 106 184 211 76 115 58 138 184 11 243 158 111 214 180 249 75 209 228 102 1 198 201 169 202 134 82 247 29 60 251 130 101 5 79 254 236 4 3 154 24 213 80 110 237 105 114 57 175 148 37 189 215 96 26 164 159 215 189 91 213 117 182 250 78 196 91 184 197 122 91 11 110 49 145 65 35 242 27 150 116 151 97 138 84 129 122 101 163 101 143 206 236 240 17 99 91 63 34 187 4 0 1 108 178 156 236 219 98 243 32 106 184 211 76 115 58 138 184 11 243 158 111 214 180 249 75 209 228 102 1 198 201 169 202 134 82 247 29 60 251 130 101 5 79 254 236 4 3 154 24 213 80 110 237 105 114 57 175 148 37 189 215 96 26 164 159 215 189 91 213 117 182 250 78 196 91 184 197 122 91 11 110 49 145 65 35 242 27 150 116 151 97 138 84 129 122 101 163 101 143 206 236 240 17 99 91 63 34 187 4 0 0 16 191 50 248 33 176 205 97 154 211 182 118 170 186 32 76 1 1 16 191 50 248 33 176 205 97 154 211 182 118 170 186 32 76 1 0 44 234 193 100 178 9 208 13 92 237 227 179 241 244 131 30 214 22 128 221 109 129 32 221 92 143 17 196 16 142 53 151 122 200 63 163 198 197 112 127 42 47 2 0 0 1 44 234 193 100 178 9 208 13 92 237 227 179 241 244 131 30 214 22 128 221 109 129 32 221 92 143 17 196 16 142 53 151 122 200 63 163 198 197 112 127 42 47 2 0 0 0 40 165 3 177 221 137 96 40 2 95 239 12 147 159 69 92 8 226 226 89 13 220 87 111 111 4 46 185 191 135 108 64 28 98 137 121 69 157 147 3 0 1 40 165 3 177 221 137 96 40 2 95 239 12 147 159 69 92 8 226 226 89 13 220 87 111 111 4 46 185 191 135 108 64 28 98 137 121 69 157 147 3 0 0 88 117 70 136 141 37 22 10 38 199 136 67 121 78 100 165 189 58 199 68 147 53 35 88 254 145 48 3 64 111 49 252 79 215 24 85 125 88 7 197 53 75 129 196 177 222 97 246 145 156 189 140 144 166 41 155 175 68 115 133 179 126 64 86 56 38 73 200 37 103 6 154 47 83 59 156 31 165 8 192 161 64 77 224 85 1 0 0 0 1 88 117 70 136 141 37 22 10 38 199 136 67 121 78 100 165 189 58 199 68 147 53 35 88 254 145 48 3 64 111 49 252 79 215 24 85 125 88 7 197 53 75 129 196 177 222 97 246 145 156 189 140 144 166 41 155 175 68 115 133 179 126 64 86 56 38 73 200 37 103 6 154 47 83 59 156 31 165 8 192 161 64 77 224 85 1 0 0 0 0 44 217 185 213 61 101 246 30 87 9 40 115 28 155 141 207 255 17 194 181 7 208 69 15 189 18 161 29 215 47 247 4 172 133 64 239 27 206 90 55 197 113 0 0 0 1 44 217 185 213 61 101 246 30 87 9 40 115 28 155 141 207 255 17 194 181 7 208 69 15 189 18 161 29 215 47 247 4 172 133 64 239 27 206 90 55 197 113 0 0 0 0 56 148 182 61 42 123 22 99 146 228 21 87 117 190 75 48 0 97 189 188 28 85 193 232 154 144 129 19 107 255 92 192 179 73 21 211 208 243 243 72 10 53 231 255 190 241 19 69 17 2 153 53 8 39 246 0 0 1 56 148 182 61 42 123 22 99 146 228 21 87 117 190 75 48 0 97 189 188 28 85 193 232 154 144 129 19 107 255 92 192 179 73 21 211 208 243 243 72 10 53 231 255 190 241 19 69 17 2 153 53 8 39 246 0 0 0 56 211 66 149 196 5 244 108 154 21 75 148 133 24 12 252 29 159 127 240 191 48 35 202 86 177 34 52 193 54 229 170 58 106 119 182 50 240 221 151 21 237 110 249 225 73 237 49 54 255 10 114 182 126 107 8 0 1 56 211 66 149 196 5 244 108 154 21 75 148 133 24 12 252 29 159 127 240 191 48 35 202 86 177 34 52 193 54 229 170 58 106 119 182 50 240 221 151 21 237 110 249 225 73 237 49 54 255 10 114 182 126 107 8 0 0 104 225 214 120 250 248 166 189 72 25 10 51 38 36 179 73 86 127 210 96 225 42 108 183 54 154 102 128 235 61 79 169 19 33 27 197 27 140 126 108 68 180 57 222 96 50 135 137 200 40 109 22 3 187 139 78 175 226 173 222 38 56 155 201 55 29 54 110 130 125 243 53 89 135 235 66 91 26 131 150 14 181 180 220 56 68 157 222 65 169 237 15 194 167 35 49 59 236 93 240 247 1 0 0 0 1 104 225 214 120 250 248 166 189 72 25 10 51 38 36 179 73 86 127 210 96 225 42 108 183 54 154 102 128 235 61 79 169 19 33 27 197 27 140 126 108 68 180 57 222 96 50 135 137 200 40 109 22 3 187 139 78 175 226 173 222 38 56 155 201 55 29 54 110 130 125 243 53 89 135 235 66 91 26 131 150 14 181 180 220 56 68 157 222 65 169 237 15 194 167 35 49 59 236 93 240 247 1 0 0 0 0 68 250 13 100 76 198 39 97 190 132 34 30 132 205 55 142 174 37 28 5 136 138 69 4 127 203 225 200 100 221 206 243 94 81 111 236 255 188 143 231 143 35 187 81 173 188 250 232 196 70 175 70 188 195 241 113 46 158 102 170 214 243 177 164 189 186 2 0 0 1 68 250 13 100 76 198 39 97 190 132 34 30 132 205 55 142 174 37 28 5 136 138 69 4 127 203 225 200 100 221 206 243 94 81 111 236 255 188 143 231 143 35 187 81 173 188 250 232 196 70 175 70 188 195 241 113 46 158 102 170 214 243 177 164 189 186 2 0 0 0 16 252 62 17 105 107 27 138 254 209 166 253 232 14 173 53 0 1 16 252 62 17 105 107 27 138 254 209 166 253 232 14 173 53 0 0 12 248 20 114 16 45 167 199 205 247 93 60 1 1 12 248 20 114 16 45 167 199 205 247 93 60 1 0 128 68 85 139 65 128 103 40 178 143 96 39 160 16 180 192 162 49 134 53 77 80 87 249 241 72 43 118 116 184 230 72 29 217 203 233 243 99 73 223 120 79 37 252 19 42 245 193 177 160 241 111 129 21 196 151 106 142 158 95 161 24 140 154 174 72 129 49 87 117 19 229 253 93 146 82 164 63 11 89 51 145 182 224 167 87 85 133 130 24 56 22 86 126 37 63 50 11 25 59 22 7 198 60 94 176 166 72 203 118 45 191 236 253 8 4 237 208 247 95 191 61 131 45 100 233 41 140 1 1 128 68 85 139 65 128 103 40 178 143 96 39 160 16 180 192 162 49 134 53 77 80 87 249 241 72 43 118 116 184 230 72 29 217 203 233 243 99 73 223 120 79 37 252 19 42 245 193 177 160 241 111 129 21 196 151 106 142 158 95 161 24 140 154 174 72 129 49 87 117 19 229 253 93 146 82 164 63 11 89 51 145 182 224 167 87 85 133 130 24 56 22 86 126 37 63 50 11 25 59 22 7 198 60 94 176 166 72 203 118 45 191 236 253 8 4 237 208 247 95 191 61 131 45 100 233 41 140 1 0 36 171 175 7 24 85 197 52 53 222 109 116 70 7 33 47 129 85 73 230 121 23 188 153 132 54 221 247 177 60 250 118 199 113 48 0 0 1 36 171 175 7 24 85 197 52 53 222 109 116 70 7 33 47 129 85 73 230 121 23 188 153 132 54 221 247 177 60 250 118 199 113 48 0 0 0 24 93 217 212 50 244 177 120 129 193 148 208 62 51 48 197 29 12 127 5 133 232 174 163 14 1 24 93 217 212 50 244 177 120 129 193 148 208 62 51 48 197 29 12 127 5 133 232 174 163 14 0 104 61 140 155 145 23 121 180 150 193 253 181 78 221 177 28 155 147 231 109 135 40 213 10 176 7 92 102 36 228 91 74 59 128 90 66 174 228 143 117 219 65 92 198 227 147 31 210 199 101 130 185 96 20 234 102 37 117 134 38 231 28 208 231 74 69 32 133 140 236 129 186 142 89 0 72 223 168 63 132 85 4 58 183 202 56 212 86 111 8 7 182 11 108 42 143 34 30 250 94 6 24 226 5 0 1 104 61 140 155 145 23 121 180 150 193 253 181 78 221 177 28 155 147 231 109 135 40 213 10 176 7 92 102 36 228 91 74 59 128 90 66 174 228 143 117 219 65 92 198 227 147 31 210 199 101 130 185 96 20 234 102 37 117 134 38 231 28 208 231 74 69 32 133 140 236 129 186 142 89 0 72 223 168 63 132 85 4 58 183 202 56 212 86 111 8 7 182 11 108 42 143 34 30 250 94 6 24 226 5 0 0 100 69 203 211 226 232 194 190 174 38 42 219 202 126 170 213 67 251 214 240 5 57 56 204 220 229 22 83 177 58 244 203 158 220 19 118 48 28 104 202 235 222 18 48 27 53 30 213 133 250 43 151 110 53 51 81 104 66 224 80 32 48 197 127 8 196 143 211 86 42 231 40 1 196 225 20 87 198 99 207 33 242 133 186 174 87 131 82 161 85 98 41 79 235 6 54 208 79 63 0 0 1 100 69 203 211 226 232 194 190 174 38 42 219 202 126 170 213 67 251 214 240 5 57 56 204 220 229 22 83 177 58 244 203 158 220 19 118 48 28 104 202 235 222 18 48 27 53 30 213 133 250 43 151 110 53 51 81 104 66 224 80 32 48 197 127 8 196 143 211 86 42 231 40 1 196 225 20 87 198 99 207 33 242 133 186 174 87 131 82 161 85 98 41 79 235 6 54 208 79 63 0 0 0 4 106 133 253 254 1 4 106 133 253 254 0 36 52 160 46 168 248 117 14 87 213 169 244 54 52 54 90 204 139 227 70 129 237 255 102 107 43 17 92 104 188 166 27 224 59 206 1 0 1 36 52 160 46 168 248 117 14 87 213 169 244 54 52 54 90 204 139 227 70 129 237 255 102 107 43 17 92 104 188 166 27 224 59 206 1 0 0 120 181 140 78 163 1 144 166 35 223 120 26 62 194 182 189 188 203 150 222 242 105 153 199 190 59 209 251 150 143 51 233 52 50 171 137 94 76 60 155 162 163 194 72 102 39 206 211 44 149 8 71 7 3 14 238 150 49 199 209 147 173 71 223 95 145 84 45 137 227 252 43 100 85 213 9 217 99 70 100 168 88 110 229 244 46 8 112 7 141 228 169 214 105 143 254 11 226 135 101 6 67 255 70 224 194 81 96 193 178 170 189 80 169 153 245 174 120 167 5 0 1 120 181 140 78 163 1 144 166 35 223 120 26 62 194 182 189 188 203 150 222 242 105 153 199 190 59 209 251 150 143 51 233 52 50 171 137 94 76 60 155 162 163 194 72 102 39 206 211 44 149 8 71 7 3 14 238 150 49 199 209 147 173 71 223 95 145 84 45 137 227 252 43 100 85 213 9 217 99 70 100 168 88 110 229 244 46 8 112 7 141 228 169 214 105 143 254 11 226 135 101 6 67 255 70 224 194 81 96 193 178 170 189 80 169 153 245 174 120 167 5 0 0 32 19 169 230 106 158 164 68 252 228 52 75 229 81 25 134 88 61 171 29 148 225 103 206 90 122 156 116 158 229 80 62 7 1 32 19 169 230 106 158 164 68 252 228 52 75 229 81 25 134 88 61 171 29 148 225 103 206 90 122 156 116 158 229 80 62 7 0 96 44 24 45 150 1 57 124 51 120 88 192 53 82 3 14 197 181 78 62 96 149 139 236 70 23 91 206 58 4 12 63 75 51 192 197 2 242 185 178 73 152 109 161 60 142 161 171 63 201 195 243 198 2 124 119 14 189 184 21 26 90 196 117 3 207 78 196 78 191 210 218 232 185 4 72 102 10 124 94 142 17 14 238 243 191 213 250 160 226 11 56 213 156 15 0 0 1 96 44 24 45 150 1 57 124 51 120 88 192 53 82 3 14 197 181 78 62 96 149 139 236 70 23 91 206 58 4 12 63 75 51 192 197 2 242 185 178 73 152 109 161 60 142 161 171 63 201 195 243 198 2 124 119 14 189 184 21 26 90 196 117 3 207 78 196 78 191 210 218 232 185 4 72 102 10 124 94 142 17 14 238 243 191 213 250 160 226 11 56 213 156 15 0 0 0 16 5 128 98 100 111 201 242 99 239 114 208 3 48 1 0 0 1 16 5 128 98 100 111 201 242 99 239 114 208 3 48 1 0 0 0 64 55 164 28 11 235 113 86 122 52 237 225 241 179 197 83 95 114 107 69 13 182 58 173 152 229 230 108 171 135 2 108 102 81 246 165 202 47 238 229 240 109 119 151 6 36 92 18 67 160 204 138 149 79 36 130 164 116 48 77 57 61 42 21 0 1 64 55 164 28 11 235 113 86 122 52 237 225 241 179 197 83 95 114 107 69 13 182 58 173 152 229 230 108 171 135 2 108 102 81 246 165 202 47 238 229 240 109 119 151 6 36 92 18 67 160 204 138 149 79 36 130 164 116 48 77 57 61 42 21 0 0 48 94 61 43 8 236 81 175 216 38 46 240 164 24 125 150 38 110 153 168 221 238 46 195 146 161 141 191 230 139 251 175 57 243 39 106 55 170 158 83 212 72 98 28 253 2 0 0 0 1 48 94 61 43 8 236 81 175 216 38 46 240 164 24 125 150 38 110 153 168 221 238 46 195 146 161 141 191 230 139 251 175 57 243 39 106 55 170 158 83 212 72 98 28 253 2 0 0 0 0 76 48 94 140 165 180 105 31 16 145 182 147 88 246 146 184 137 158 100 218 254 225 130 175 24 164 19 172 15 135 152 163 48 137 131 182 181 101 168 51 195 131 251 4 29 231 230 96 29 58 177 144 95 60 187 109 242 143 92 252 239 108 72 4 59 210 46 232 34 139 28 238 105 211 76 0 0 1 76 48 94 140 165 180 105 31 16 145 182 147 88 246 146 184 137 158 100 218 254 225 130 175 24 164 19 172 15 135 152 163 48 137 131 182 181 101 168 51 195 131 251 4 29 231 230 96 29 58 177 144 95 60 187 109 242 143 92 252 239 108 72 4 59 210 46 232 34 139 28 238 105 211 76 0 0 0 40 234 82 61 126 225 47 95 67 86 217 19 160 166 207 107 2 63 101 138 71 14 205 171 155 149 191 239 138 12 202 149 100 120 202 78 69 3 0 0 0 1 40 234 82 61 126 225 47 95 67 86 217 19 160 166 207 107 2 63 101 138 71 14 205 171 155 149 191 239 138 12 202 149 100 120 202 78 69 3 0 0 0 0 32 254 34 44 189 14 4 206 100 120 172 67 182 70 62 43 236 232 71 120 86 45 165 252 19 123 77 145 98 252 22 8 0 1 32 254 34 44 189 14 4 206 100 120 172 67 182 70 62 43 236 232 71 120 86 45 165 252 19 123 77 145 98 252 22 8 0 0 124 133 133 183 97 16 40 176 80 73 78 7 25 246 204 110 33 191 19 111 253 42 125 217 152 191 133 9 231 196 126 215 115 228 86 114 230 179 150 254 155 22 188 36 125 187 206 19 227 235 11 176 130 143 111 209 43 29 89 113 147 102 119 48 191 43 79 47 89 120 0 227 25 169 53 18 37 83 52 60 241 101 240 255 139 61 119 189 13 92 89 30 29 252 1 22 209 105 170 119 94 158 16 175 58 110 238 74 117 112 41 56 246 67 154 141 63 25 112 206 160 3 84 134 50 1 124 133 133 183 97 16 40 176 80 73 78 7 25 246 204 110 33 191 19 111 253 42 125 217 152 191 133 9 231 196 126 215 115 228 86 114 230 179 150 254 155 22 188 36 125 187 206 19 227 235 11 176 130 143 111 209 43 29 89 113 147 102 119 48 191 43 79 47 89 120 0 227 25 169 53 18 37 83 52 60 241 101 240 255 139 61 119 189 13 92 89 30 29 252 1 22 209 105 170 119 94 158 16 175 58 110 238 74 117 112 41 56 246 67 154 141 63 25 112 206 160 3 84 134 50 0 60 242 208 163 166 217 157 45 88 172 11 229 109 23 46 229 250 139 217 234 229 172 253 211 253 11 8 225 163 20 87 100 148 249 249 188 166 122 64 131 225 233 55 241 36 232 11 174 172 83 153 87 165 3 39 84 162 67 204 110 0 1 60 242 208 163 166 217 157 45 88 172 11 229 109 23 46 229 250 139 217 234 229 172 253 211 253 11 8 225 163 20 87 100 148 249 249 188 166 122 64 131 225 233 55 241 36 232 11 174 172 83 153 87 165 3 39 84 162 67 204 110 0 0 28 62 99 60 181 249 169 105 74 220 130 197 142 213 226 245 78 96 45 105 171 176 157 17 155 32 93 59 15 1 28 62 99 60 181 249 169 105 74 220 130 197 142 213 226 245 78 96 45 105 171 176 157 17 155 32 93 59 15\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/serial_txts/cpp_int1024_serial64.txt",
    "content": "22 serialization::archive 10 0 0 0 0 0 112 240 216 207 212 25 178 183 244 196 236 95 147 174 198 156 135 30 192 249 71 150 58 81 90 83 157 31 192 97 218 61 242 6 92 59 181 100 93 130 250 188 246 144 44 168 35 244 193 47 12 158 190 153 204 174 128 206 100 236 32 18 126 89 123 194 22 35 211 231 76 148 27 235 109 5 183 33 227 88 207 58 215 251 252 155 139 128 94 102 109 67 113 84 50 31 117 129 72 215 77 164 152 225 243 6 0 0 0 0 0 0 0 1 112 240 216 207 212 25 178 183 244 196 236 95 147 174 198 156 135 30 192 249 71 150 58 81 90 83 157 31 192 97 218 61 242 6 92 59 181 100 93 130 250 188 246 144 44 168 35 244 193 47 12 158 190 153 204 174 128 206 100 236 32 18 126 89 123 194 22 35 211 231 76 148 27 235 109 5 183 33 227 88 207 58 215 251 252 155 139 128 94 102 109 67 113 84 50 31 117 129 72 215 77 164 152 225 243 6 0 0 0 0 0 0 0 0 24 233 110 98 40 22 77 153 193 59 146 80 175 250 132 156 155 86 10 0 0 0 0 0 0 1 24 233 110 98 40 22 77 153 193 59 146 80 175 250 132 156 155 86 10 0 0 0 0 0 0 0 120 195 197 234 211 167 46 136 167 128 33 88 13 108 237 91 62 12 92 69 154 204 29 67 225 108 76 250 33 86 106 195 35 211 56 231 162 75 128 234 92 136 184 82 7 210 243 108 153 53 77 201 114 146 101 203 238 16 127 62 157 89 147 7 159 33 49 73 121 45 71 184 101 48 57 231 136 53 32 117 91 72 53 49 149 132 120 220 38 202 141 199 61 152 225 162 88 241 96 97 235 194 95 106 102 77 171 141 79 25 171 118 0 150 152 162 225 0 0 0 0 1 120 195 197 234 211 167 46 136 167 128 33 88 13 108 237 91 62 12 92 69 154 204 29 67 225 108 76 250 33 86 106 195 35 211 56 231 162 75 128 234 92 136 184 82 7 210 243 108 153 53 77 201 114 146 101 203 238 16 127 62 157 89 147 7 159 33 49 73 121 45 71 184 101 48 57 231 136 53 32 117 91 72 53 49 149 132 120 220 38 202 141 199 61 152 225 162 88 241 96 97 235 194 95 106 102 77 171 141 79 25 171 118 0 150 152 162 225 0 0 0 0 0 112 52 251 142 48 154 38 230 245 135 197 116 187 16 93 121 73 166 67 73 14 108 247 153 173 155 1 1 27 39 117 50 208 104 14 143 42 205 185 79 111 156 236 127 179 134 12 211 3 186 248 224 18 111 115 8 241 120 193 95 162 144 223 81 125 100 15 75 159 151 135 167 7 105 70 42 112 187 150 50 81 238 10 88 7 185 247 8 238 5 251 173 132 245 18 238 209 93 5 153 183 17 250 77 56 125 31 2 0 0 0 0 0 1 112 52 251 142 48 154 38 230 245 135 197 116 187 16 93 121 73 166 67 73 14 108 247 153 173 155 1 1 27 39 117 50 208 104 14 143 42 205 185 79 111 156 236 127 179 134 12 211 3 186 248 224 18 111 115 8 241 120 193 95 162 144 223 81 125 100 15 75 159 151 135 167 7 105 70 42 112 187 150 50 81 238 10 88 7 185 247 8 238 5 251 173 132 245 18 238 209 93 5 153 183 17 250 77 56 125 31 2 0 0 0 0 0 0 24 197 207 215 162 39 250 228 2 55 205 156 2 210 250 185 127 9 0 0 0 0 0 0 0 1 24 197 207 215 162 39 250 228 2 55 205 156 2 210 250 185 127 9 0 0 0 0 0 0 0 0 128 24 227 82 233 197 174 88 134 19 71 12 155 49 99 207 184 189 139 213 148 142 65 83 22 86 59 113 20 118 242 15 207 165 34 25 223 113 59 30 140 39 47 19 17 91 233 70 193 187 55 81 125 94 114 235 6 80 26 251 206 129 223 96 50 3 188 107 248 74 130 151 7 40 68 162 241 8 76 185 168 192 189 109 17 104 12 100 42 186 31 15 28 113 72 249 213 10 120 161 189 54 95 145 140 93 52 223 83 153 80 25 250 68 102 71 63 122 51 3 222 201 139 253 189 0 0 0 0 1 128 24 227 82 233 197 174 88 134 19 71 12 155 49 99 207 184 189 139 213 148 142 65 83 22 86 59 113 20 118 242 15 207 165 34 25 223 113 59 30 140 39 47 19 17 91 233 70 193 187 55 81 125 94 114 235 6 80 26 251 206 129 223 96 50 3 188 107 248 74 130 151 7 40 68 162 241 8 76 185 168 192 189 109 17 104 12 100 42 186 31 15 28 113 72 249 213 10 120 161 189 54 95 145 140 93 52 223 83 153 80 25 250 68 102 71 63 122 51 3 222 201 139 253 189 0 0 0 0 0 120 84 215 85 155 83 224 217 17 152 203 112 82 122 193 196 197 212 174 168 135 168 249 185 103 45 35 64 229 91 250 210 186 58 210 182 98 118 15 126 35 18 69 254 92 98 253 202 81 186 80 212 23 15 9 32 39 1 22 16 116 63 86 191 203 58 113 189 250 81 8 87 78 224 55 184 247 69 246 57 99 3 71 4 32 58 206 214 203 112 60 52 83 234 29 3 197 37 251 251 84 166 130 63 190 142 0 143 110 160 134 104 117 192 171 252 58 243 0 0 0 1 120 84 215 85 155 83 224 217 17 152 203 112 82 122 193 196 197 212 174 168 135 168 249 185 103 45 35 64 229 91 250 210 186 58 210 182 98 118 15 126 35 18 69 254 92 98 253 202 81 186 80 212 23 15 9 32 39 1 22 16 116 63 86 191 203 58 113 189 250 81 8 87 78 224 55 184 247 69 246 57 99 3 71 4 32 58 206 214 203 112 60 52 83 234 29 3 197 37 251 251 84 166 130 63 190 142 0 143 110 160 134 104 117 192 171 252 58 243 0 0 0 0 32 75 106 211 223 67 33 39 159 137 42 62 13 132 4 148 172 13 129 231 52 23 5 189 177 132 71 127 112 12 0 0 0 1 32 75 106 211 223 67 33 39 159 137 42 62 13 132 4 148 172 13 129 231 52 23 5 189 177 132 71 127 112 12 0 0 0 0 88 71 66 188 102 218 45 89 79 100 203 161 190 29 126 44 173 44 86 244 243 53 45 157 176 5 233 73 112 206 44 106 109 159 71 109 87 77 104 184 44 147 80 22 206 180 74 221 169 143 209 179 215 195 26 222 89 28 178 48 206 169 22 229 44 34 14 33 215 159 185 161 56 150 95 20 128 199 66 223 66 113 0 0 0 0 0 0 0 1 88 71 66 188 102 218 45 89 79 100 203 161 190 29 126 44 173 44 86 244 243 53 45 157 176 5 233 73 112 206 44 106 109 159 71 109 87 77 104 184 44 147 80 22 206 180 74 221 169 143 209 179 215 195 26 222 89 28 178 48 206 169 22 229 44 34 14 33 215 159 185 161 56 150 95 20 128 199 66 223 66 113 0 0 0 0 0 0 0 0 40 74 104 149 210 252 235 123 239 168 56 124 239 105 91 87 48 183 253 146 69 244 5 94 42 167 100 207 53 34 116 207 197 97 199 198 121 102 204 246 31 1 40 74 104 149 210 252 235 123 239 168 56 124 239 105 91 87 48 183 253 146 69 244 5 94 42 167 100 207 53 34 116 207 197 97 199 198 121 102 204 246 31 0 16 127 135 241 163 116 139 210 196 195 216 24 255 21 0 0 0 1 16 127 135 241 163 116 139 210 196 195 216 24 255 21 0 0 0 0 72 150 29 179 100 132 144 156 216 95 57 162 101 198 179 215 51 244 149 122 162 171 105 83 53 56 158 83 10 80 190 228 125 131 48 41 93 2 177 156 179 17 217 253 155 46 30 105 35 223 134 100 76 170 35 206 233 252 210 117 27 160 154 210 45 234 95 74 76 159 147 2 0 1 72 150 29 179 100 132 144 156 216 95 57 162 101 198 179 215 51 244 149 122 162 171 105 83 53 56 158 83 10 80 190 228 125 131 48 41 93 2 177 156 179 17 217 253 155 46 30 105 35 223 134 100 76 170 35 206 233 252 210 117 27 160 154 210 45 234 95 74 76 159 147 2 0 0 40 220 123 216 188 130 233 64 162 111 163 35 146 32 32 192 228 163 205 248 224 147 90 97 37 29 2 241 105 156 63 40 242 105 209 126 40 0 0 0 0 1 40 220 123 216 188 130 233 64 162 111 163 35 146 32 32 192 228 163 205 248 224 147 90 97 37 29 2 241 105 156 63 40 242 105 209 126 40 0 0 0 0 0 32 230 134 234 52 30 2 41 143 232 97 74 82 171 119 128 41 82 147 155 86 202 151 8 81 3 0 0 0 0 0 0 0 1 32 230 134 234 52 30 2 41 143 232 97 74 82 171 119 128 41 82 147 155 86 202 151 8 81 3 0 0 0 0 0 0 0 0 72 15 249 15 27 178 199 148 79 23 3 197 198 33 75 3 164 156 4 165 168 224 178 69 133 25 107 103 207 249 91 170 31 103 38 157 136 237 182 137 145 28 255 143 214 212 22 229 64 150 206 235 209 33 197 227 224 182 51 28 205 88 80 228 111 77 96 3 34 184 34 1 0 1 72 15 249 15 27 178 199 148 79 23 3 197 198 33 75 3 164 156 4 165 168 224 178 69 133 25 107 103 207 249 91 170 31 103 38 157 136 237 182 137 145 28 255 143 214 212 22 229 64 150 206 235 209 33 197 227 224 182 51 28 205 88 80 228 111 77 96 3 34 184 34 1 0 0 128 218 44 245 9 8 123 94 221 100 47 84 11 243 15 172 179 239 47 175 194 3 71 55 191 38 122 159 236 92 247 18 47 19 56 134 218 188 171 164 240 122 46 184 162 129 134 174 138 64 233 80 170 255 199 102 146 231 63 160 16 196 95 226 19 153 123 117 200 46 233 120 129 83 125 132 105 126 85 36 229 17 65 127 187 245 154 8 240 255 6 80 120 99 170 69 125 132 67 244 85 139 199 7 155 182 253 26 132 174 228 45 164 121 122 120 13 138 138 103 108 205 110 58 205 79 100 212 0 1 128 218 44 245 9 8 123 94 221 100 47 84 11 243 15 172 179 239 47 175 194 3 71 55 191 38 122 159 236 92 247 18 47 19 56 134 218 188 171 164 240 122 46 184 162 129 134 174 138 64 233 80 170 255 199 102 146 231 63 160 16 196 95 226 19 153 123 117 200 46 233 120 129 83 125 132 105 126 85 36 229 17 65 127 187 245 154 8 240 255 6 80 120 99 170 69 125 132 67 244 85 139 199 7 155 182 253 26 132 174 228 45 164 121 122 120 13 138 138 103 108 205 110 58 205 79 100 212 0 0 128 42 11 175 85 234 29 127 39 168 190 213 6 131 53 241 65 78 99 129 50 177 192 60 169 254 225 53 185 10 30 128 144 147 118 226 21 168 226 101 136 76 35 162 12 195 5 204 132 123 33 134 136 228 63 232 165 209 64 49 61 69 88 217 222 49 226 15 38 80 170 183 154 76 90 32 162 103 214 88 163 4 232 2 248 216 110 84 43 233 82 171 178 169 49 99 13 2 111 187 145 184 169 169 143 134 196 5 58 127 58 229 193 147 117 193 58 158 31 111 94 152 222 23 0 0 0 0 0 1 128 42 11 175 85 234 29 127 39 168 190 213 6 131 53 241 65 78 99 129 50 177 192 60 169 254 225 53 185 10 30 128 144 147 118 226 21 168 226 101 136 76 35 162 12 195 5 204 132 123 33 134 136 228 63 232 165 209 64 49 61 69 88 217 222 49 226 15 38 80 170 183 154 76 90 32 162 103 214 88 163 4 232 2 248 216 110 84 43 233 82 171 178 169 49 99 13 2 111 187 145 184 169 169 143 134 196 5 58 127 58 229 193 147 117 193 58 158 31 111 94 152 222 23 0 0 0 0 0 0 128 117 32 231 128 78 121 139 240 228 103 68 36 169 251 164 16 50 57 142 227 5 246 77 80 110 198 12 68 1 149 50 69 54 143 139 95 198 108 21 41 162 236 219 40 173 104 226 58 15 180 5 40 31 118 13 168 210 43 211 239 7 182 203 237 162 68 33 8 250 179 25 22 162 85 109 252 238 129 170 97 47 77 76 109 6 111 254 168 196 19 35 76 81 88 241 48 255 104 111 142 75 147 180 52 99 76 255 134 237 245 122 252 21 255 187 122 115 41 176 130 69 131 13 23 37 127 20 3 1 128 117 32 231 128 78 121 139 240 228 103 68 36 169 251 164 16 50 57 142 227 5 246 77 80 110 198 12 68 1 149 50 69 54 143 139 95 198 108 21 41 162 236 219 40 173 104 226 58 15 180 5 40 31 118 13 168 210 43 211 239 7 182 203 237 162 68 33 8 250 179 25 22 162 85 109 252 238 129 170 97 47 77 76 109 6 111 254 168 196 19 35 76 81 88 241 48 255 104 111 142 75 147 180 52 99 76 255 134 237 245 122 252 21 255 187 122 115 41 176 130 69 131 13 23 37 127 20 3 0 128 225 196 245 38 129 95 130 255 14 194 101 192 198 28 5 135 65 33 59 109 254 232 229 27 245 239 185 134 58 127 181 232 77 234 159 110 69 82 234 174 133 243 107 210 244 202 250 155 41 109 253 34 38 165 23 103 75 242 126 154 90 16 155 40 180 198 123 44 56 133 74 228 20 41 104 110 42 251 181 50 43 108 181 28 98 126 48 202 202 240 10 236 228 75 105 111 132 35 221 75 171 251 197 139 242 114 49 206 195 33 149 113 119 94 226 71 220 139 93 218 202 156 199 9 0 0 0 0 1 128 225 196 245 38 129 95 130 255 14 194 101 192 198 28 5 135 65 33 59 109 254 232 229 27 245 239 185 134 58 127 181 232 77 234 159 110 69 82 234 174 133 243 107 210 244 202 250 155 41 109 253 34 38 165 23 103 75 242 126 154 90 16 155 40 180 198 123 44 56 133 74 228 20 41 104 110 42 251 181 50 43 108 181 28 98 126 48 202 202 240 10 236 228 75 105 111 132 35 221 75 171 251 197 139 242 114 49 206 195 33 149 113 119 94 226 71 220 139 93 218 202 156 199 9 0 0 0 0 0 128 130 190 211 115 201 224 67 206 209 66 76 220 164 193 3 192 104 19 174 139 21 103 49 247 223 227 161 141 190 242 11 120 201 238 152 120 157 159 206 140 138 29 151 173 117 118 102 209 136 234 50 127 131 161 166 19 148 165 245 82 205 11 104 226 229 91 148 136 10 234 81 120 171 169 131 54 235 207 59 211 127 77 24 204 157 197 253 233 237 199 174 3 72 33 142 5 218 73 26 111 135 205 112 166 233 98 13 15 33 27 131 103 119 191 23 179 123 179 24 99 136 111 206 103 0 0 0 0 1 128 130 190 211 115 201 224 67 206 209 66 76 220 164 193 3 192 104 19 174 139 21 103 49 247 223 227 161 141 190 242 11 120 201 238 152 120 157 159 206 140 138 29 151 173 117 118 102 209 136 234 50 127 131 161 166 19 148 165 245 82 205 11 104 226 229 91 148 136 10 234 81 120 171 169 131 54 235 207 59 211 127 77 24 204 157 197 253 233 237 199 174 3 72 33 142 5 218 73 26 111 135 205 112 166 233 98 13 15 33 27 131 103 119 191 23 179 123 179 24 99 136 111 206 103 0 0 0 0 0 24 236 146 150 122 80 138 70 55 218 171 50 71 53 136 214 55 85 125 93 128 4 0 0 0 1 24 236 146 150 122 80 138 70 55 218 171 50 71 53 136 214 55 85 125 93 128 4 0 0 0 0 96 168 120 24 52 192 139 221 73 242 242 97 74 214 206 178 206 134 205 255 80 249 81 103 62 255 235 105 87 255 215 122 234 6 85 194 142 4 80 39 228 210 83 78 57 126 13 175 79 207 117 247 77 43 53 164 8 185 89 108 206 201 3 63 111 26 179 169 0 252 20 51 5 213 56 133 204 63 19 45 245 58 168 12 87 82 182 175 2 1 111 83 252 59 0 0 0 1 96 168 120 24 52 192 139 221 73 242 242 97 74 214 206 178 206 134 205 255 80 249 81 103 62 255 235 105 87 255 215 122 234 6 85 194 142 4 80 39 228 210 83 78 57 126 13 175 79 207 117 247 77 43 53 164 8 185 89 108 206 201 3 63 111 26 179 169 0 252 20 51 5 213 56 133 204 63 19 45 245 58 168 12 87 82 182 175 2 1 111 83 252 59 0 0 0 0 128 185 132 187 44 241 228 100 105 22 119 238 94 124 126 113 117 10 214 51 133 149 172 201 211 213 121 160 34 164 142 116 97 112 84 155 255 6 108 94 78 4 233 188 142 66 190 97 40 135 40 45 103 104 89 35 225 9 229 254 125 210 134 186 83 219 39 156 96 79 116 202 44 226 193 33 197 237 19 205 187 104 142 222 208 110 38 156 236 173 194 237 92 12 94 102 228 230 145 128 127 23 155 108 123 159 28 189 122 77 188 51 141 193 44 74 135 72 161 176 196 25 238 215 249 1 0 0 0 1 128 185 132 187 44 241 228 100 105 22 119 238 94 124 126 113 117 10 214 51 133 149 172 201 211 213 121 160 34 164 142 116 97 112 84 155 255 6 108 94 78 4 233 188 142 66 190 97 40 135 40 45 103 104 89 35 225 9 229 254 125 210 134 186 83 219 39 156 96 79 116 202 44 226 193 33 197 237 19 205 187 104 142 222 208 110 38 156 236 173 194 237 92 12 94 102 228 230 145 128 127 23 155 108 123 159 28 189 122 77 188 51 141 193 44 74 135 72 161 176 196 25 238 215 249 1 0 0 0 0 128 196 189 1 242 155 244 232 152 101 227 3 217 39 244 236 150 9 178 16 175 212 22 120 54 105 227 225 242 229 156 121 86 139 227 54 127 184 190 41 133 3 17 52 18 138 148 221 246 233 48 84 88 59 192 24 21 252 227 123 179 109 113 77 255 247 152 43 152 181 143 190 106 157 133 109 3 97 155 223 142 24 220 123 209 115 48 134 39 181 47 225 199 64 0 47 19 50 112 64 18 160 79 199 188 82 123 15 244 22 146 43 21 149 157 118 9 188 127 178 30 174 37 125 174 1 17 0 0 1 128 196 189 1 242 155 244 232 152 101 227 3 217 39 244 236 150 9 178 16 175 212 22 120 54 105 227 225 242 229 156 121 86 139 227 54 127 184 190 41 133 3 17 52 18 138 148 221 246 233 48 84 88 59 192 24 21 252 227 123 179 109 113 77 255 247 152 43 152 181 143 190 106 157 133 109 3 97 155 223 142 24 220 123 209 115 48 134 39 181 47 225 199 64 0 47 19 50 112 64 18 160 79 199 188 82 123 15 244 22 146 43 21 149 157 118 9 188 127 178 30 174 37 125 174 1 17 0 0 0 128 125 72 103 215 83 251 97 191 63 231 211 75 247 3 48 39 242 99 75 38 207 10 64 114 118 90 122 122 77 183 190 7 147 103 181 244 49 65 243 162 67 68 8 208 134 116 48 95 95 233 35 252 112 16 102 203 11 124 40 193 161 239 28 210 11 139 204 89 203 38 245 182 150 96 26 18 46 113 77 175 20 177 91 174 135 42 135 219 19 174 215 57 19 213 152 24 76 23 175 160 29 5 177 176 24 219 163 255 97 214 199 54 191 77 15 45 73 191 156 156 85 231 7 0 0 0 0 0 1 128 125 72 103 215 83 251 97 191 63 231 211 75 247 3 48 39 242 99 75 38 207 10 64 114 118 90 122 122 77 183 190 7 147 103 181 244 49 65 243 162 67 68 8 208 134 116 48 95 95 233 35 252 112 16 102 203 11 124 40 193 161 239 28 210 11 139 204 89 203 38 245 182 150 96 26 18 46 113 77 175 20 177 91 174 135 42 135 219 19 174 215 57 19 213 152 24 76 23 175 160 29 5 177 176 24 219 163 255 97 214 199 54 191 77 15 45 73 191 156 156 85 231 7 0 0 0 0 0 0 16 252 17 170 79 122 224 151 223 165 53 141 155 37 87 4 0 1 16 252 17 170 79 122 224 151 223 165 53 141 155 37 87 4 0 0 64 137 35 96 204 136 177 189 143 1 212 169 28 91 106 152 238 147 179 84 155 35 195 77 99 22 143 175 243 178 108 188 125 52 89 146 208 125 21 94 228 98 194 201 165 96 57 144 208 56 103 133 48 45 120 4 182 247 48 112 89 188 153 1 0 1 64 137 35 96 204 136 177 189 143 1 212 169 28 91 106 152 238 147 179 84 155 35 195 77 99 22 143 175 243 178 108 188 125 52 89 146 208 125 21 94 228 98 194 201 165 96 57 144 208 56 103 133 48 45 120 4 182 247 48 112 89 188 153 1 0 0 104 243 59 23 181 19 206 54 217 4 43 183 169 25 245 43 129 181 198 110 56 213 123 240 160 71 185 170 96 174 21 188 158 209 73 67 245 248 18 139 233 181 53 185 30 209 172 198 74 139 145 21 133 168 4 186 236 48 15 19 25 234 227 177 154 240 64 215 74 77 178 193 160 155 223 234 55 201 144 185 140 71 87 18 218 192 168 98 86 67 205 126 50 211 88 59 69 53 208 210 119 1 82 1 0 1 104 243 59 23 181 19 206 54 217 4 43 183 169 25 245 43 129 181 198 110 56 213 123 240 160 71 185 170 96 174 21 188 158 209 73 67 245 248 18 139 233 181 53 185 30 209 172 198 74 139 145 21 133 168 4 186 236 48 15 19 25 234 227 177 154 240 64 215 74 77 178 193 160 155 223 234 55 201 144 185 140 71 87 18 218 192 168 98 86 67 205 126 50 211 88 59 69 53 208 210 119 1 82 1 0 0 104 30 237 199 208 43 126 134 188 221 77 44 64 109 31 47 206 70 172 101 140 66 232 0 138 101 218 81 243 45 157 119 221 30 64 253 209 50 12 45 150 152 200 9 167 220 210 114 70 151 149 141 34 162 151 188 82 189 246 149 204 99 143 240 240 11 119 55 107 27 196 176 61 52 227 44 160 102 215 226 28 36 252 136 5 162 100 95 194 183 2 28 199 117 193 177 41 170 115 62 93 181 186 1 0 1 104 30 237 199 208 43 126 134 188 221 77 44 64 109 31 47 206 70 172 101 140 66 232 0 138 101 218 81 243 45 157 119 221 30 64 253 209 50 12 45 150 152 200 9 167 220 210 114 70 151 149 141 34 162 151 188 82 189 246 149 204 99 143 240 240 11 119 55 107 27 196 176 61 52 227 44 160 102 215 226 28 36 252 136 5 162 100 95 194 183 2 28 199 117 193 177 41 170 115 62 93 181 186 1 0 0 40 53 120 130 161 159 72 98 85 190 182 236 225 240 60 214 46 141 103 182 195 63 222 96 51 133 198 58 90 110 132 208 137 203 153 172 98 79 220 0 0 1 40 53 120 130 161 159 72 98 85 190 182 236 225 240 60 214 46 141 103 182 195 63 222 96 51 133 198 58 90 110 132 208 137 203 153 172 98 79 220 0 0 0 24 118 29 12 161 58 173 221 244 97 16 129 132 213 223 100 52 220 195 7 0 0 0 0 0 1 24 118 29 12 161 58 173 221 244 97 16 129 132 213 223 100 52 220 195 7 0 0 0 0 0 0 8 48 0 0 0 0 0 0 0 1 8 48 0 0 0 0 0 0 0 0 56 231 92 254 163 124 164 150 140 111 46 208 48 245 131 79 191 167 93 72 251 225 197 183 198 127 122 236 47 16 214 74 14 201 193 171 20 118 155 238 33 155 90 192 58 99 154 59 127 53 8 120 227 43 170 1 0 1 56 231 92 254 163 124 164 150 140 111 46 208 48 245 131 79 191 167 93 72 251 225 197 183 198 127 122 236 47 16 214 74 14 201 193 171 20 118 155 238 33 155 90 192 58 99 154 59 127 53 8 120 227 43 170 1 0 0 16 251 177 154 124 124 51 12 184 170 246 21 206 136 0 6 0 1 16 251 177 154 124 124 51 12 184 170 246 21 206 136 0 6 0 0 120 135 228 154 97 97 37 218 64 185 90 19 175 246 80 210 161 113 157 100 67 139 11 67 170 100 55 10 137 62 200 98 216 164 1 43 71 31 156 64 144 57 219 81 105 211 65 2 203 127 45 87 116 177 120 38 220 221 127 219 9 89 68 112 249 96 102 183 83 157 239 104 243 95 199 142 2 33 66 225 186 67 111 177 72 133 48 17 239 26 98 202 8 125 61 65 118 6 55 147 154 167 90 0 162 128 74 17 187 146 174 37 228 190 12 117 100 32 3 0 0 1 120 135 228 154 97 97 37 218 64 185 90 19 175 246 80 210 161 113 157 100 67 139 11 67 170 100 55 10 137 62 200 98 216 164 1 43 71 31 156 64 144 57 219 81 105 211 65 2 203 127 45 87 116 177 120 38 220 221 127 219 9 89 68 112 249 96 102 183 83 157 239 104 243 95 199 142 2 33 66 225 186 67 111 177 72 133 48 17 239 26 98 202 8 125 61 65 118 6 55 147 154 167 90 0 162 128 74 17 187 146 174 37 228 190 12 117 100 32 3 0 0 0 88 26 161 163 242 118 221 0 66 192 252 133 199 57 227 98 231 11 157 63 23 214 37 26 128 100 49 131 94 235 250 249 147 154 51 50 25 98 235 243 5 108 187 118 252 12 79 151 103 7 110 124 8 167 181 214 104 91 65 119 78 66 98 82 217 239 238 114 229 245 1 243 155 98 149 133 248 106 172 101 16 223 244 0 0 0 0 0 0 1 88 26 161 163 242 118 221 0 66 192 252 133 199 57 227 98 231 11 157 63 23 214 37 26 128 100 49 131 94 235 250 249 147 154 51 50 25 98 235 243 5 108 187 118 252 12 79 151 103 7 110 124 8 167 181 214 104 91 65 119 78 66 98 82 217 239 238 114 229 245 1 243 155 98 149 133 248 106 172 101 16 223 244 0 0 0 0 0 0 0 104 51 242 193 71 40 33 244 183 39 87 209 231 123 23 102 244 164 169 195 247 118 193 238 212 202 61 62 28 173 71 226 3 123 32 247 24 21 127 54 196 17 12 180 107 10 66 175 208 88 113 145 18 93 77 231 82 5 172 142 122 173 202 80 213 151 67 189 246 154 57 40 60 62 225 173 49 197 99 197 109 106 160 126 116 179 205 235 122 139 21 129 249 231 216 211 119 4 117 66 52 193 10 0 0 1 104 51 242 193 71 40 33 244 183 39 87 209 231 123 23 102 244 164 169 195 247 118 193 238 212 202 61 62 28 173 71 226 3 123 32 247 24 21 127 54 196 17 12 180 107 10 66 175 208 88 113 145 18 93 77 231 82 5 172 142 122 173 202 80 213 151 67 189 246 154 57 40 60 62 225 173 49 197 99 197 109 106 160 126 116 179 205 235 122 139 21 129 249 231 216 211 119 4 117 66 52 193 10 0 0 0 120 117 133 12 7 22 147 126 60 222 126 15 234 208 110 144 185 13 98 7 11 209 57 121 79 194 58 253 148 206 85 251 165 5 213 112 244 92 244 25 196 40 68 91 10 147 74 13 72 165 3 119 45 32 170 129 46 133 146 166 13 69 50 36 228 124 251 190 233 4 155 225 95 178 231 135 226 223 143 88 24 162 178 240 101 140 125 124 184 151 110 254 193 242 30 230 88 55 219 178 42 54 111 9 248 91 46 181 248 183 164 152 211 7 0 0 0 0 0 0 0 1 120 117 133 12 7 22 147 126 60 222 126 15 234 208 110 144 185 13 98 7 11 209 57 121 79 194 58 253 148 206 85 251 165 5 213 112 244 92 244 25 196 40 68 91 10 147 74 13 72 165 3 119 45 32 170 129 46 133 146 166 13 69 50 36 228 124 251 190 233 4 155 225 95 178 231 135 226 223 143 88 24 162 178 240 101 140 125 124 184 151 110 254 193 242 30 230 88 55 219 178 42 54 111 9 248 91 46 181 248 183 164 152 211 7 0 0 0 0 0 0 0 0 128 63 77 192 16 39 116 41 118 84 43 197 253 236 106 62 1 183 234 241 28 170 49 21 191 231 212 161 33 61 235 39 160 228 125 57 52 78 189 69 47 1 79 177 75 103 238 153 2 38 182 148 88 116 210 38 64 96 188 136 248 75 74 182 169 213 110 205 104 170 28 203 171 146 250 72 188 184 135 129 123 246 18 94 241 239 179 131 133 192 152 204 226 228 3 166 119 222 138 54 116 129 186 64 160 210 30 139 163 195 186 2 85 155 194 170 83 132 36 74 216 27 254 85 0 0 0 0 0 1 128 63 77 192 16 39 116 41 118 84 43 197 253 236 106 62 1 183 234 241 28 170 49 21 191 231 212 161 33 61 235 39 160 228 125 57 52 78 189 69 47 1 79 177 75 103 238 153 2 38 182 148 88 116 210 38 64 96 188 136 248 75 74 182 169 213 110 205 104 170 28 203 171 146 250 72 188 184 135 129 123 246 18 94 241 239 179 131 133 192 152 204 226 228 3 166 119 222 138 54 116 129 186 64 160 210 30 139 163 195 186 2 85 155 194 170 83 132 36 74 216 27 254 85 0 0 0 0 0 0 72 216 172 85 194 158 216 82 110 65 133 85 128 49 103 72 173 54 61 199 26 210 206 103 163 37 220 221 193 233 238 254 54 206 213 124 6 203 165 26 21 241 141 165 246 128 184 43 72 242 66 159 97 79 134 33 147 97 136 247 186 217 103 81 199 29 0 0 0 0 0 0 0 1 72 216 172 85 194 158 216 82 110 65 133 85 128 49 103 72 173 54 61 199 26 210 206 103 163 37 220 221 193 233 238 254 54 206 213 124 6 203 165 26 21 241 141 165 246 128 184 43 72 242 66 159 97 79 134 33 147 97 136 247 186 217 103 81 199 29 0 0 0 0 0 0 0 0 88 198 204 237 247 146 195 97 49 165 23 187 22 34 150 126 136 183 220 165 82 194 13 172 190 161 249 20 192 177 147 243 49 113 56 111 194 238 6 98 97 129 35 110 42 246 44 179 219 221 190 182 94 40 254 25 246 171 109 11 181 1 138 90 3 209 233 133 179 57 67 179 0 223 103 18 74 138 136 231 35 199 161 29 157 1 0 0 0 1 88 198 204 237 247 146 195 97 49 165 23 187 22 34 150 126 136 183 220 165 82 194 13 172 190 161 249 20 192 177 147 243 49 113 56 111 194 238 6 98 97 129 35 110 42 246 44 179 219 221 190 182 94 40 254 25 246 171 109 11 181 1 138 90 3 209 233 133 179 57 67 179 0 223 103 18 74 138 136 231 35 199 161 29 157 1 0 0 0 0 104 200 111 223 113 76 183 17 189 185 203 122 115 218 100 205 191 105 223 132 140 147 126 199 180 195 206 12 73 110 39 71 147 85 229 115 193 236 45 39 98 81 104 24 231 243 122 80 84 171 200 163 28 188 108 159 81 0 102 179 40 112 195 41 169 248 78 181 155 111 130 188 233 129 78 9 71 59 223 40 71 154 214 88 94 144 232 156 144 221 110 76 114 52 34 145 84 178 218 142 15 103 173 3 0 1 104 200 111 223 113 76 183 17 189 185 203 122 115 218 100 205 191 105 223 132 140 147 126 199 180 195 206 12 73 110 39 71 147 85 229 115 193 236 45 39 98 81 104 24 231 243 122 80 84 171 200 163 28 188 108 159 81 0 102 179 40 112 195 41 169 248 78 181 155 111 130 188 233 129 78 9 71 59 223 40 71 154 214 88 94 144 232 156 144 221 110 76 114 52 34 145 84 178 218 142 15 103 173 3 0 0 8 177 137 11 132 66 0 0 0 1 8 177 137 11 132 66 0 0 0 0 48 33 167 44 60 43 5 212 10 233 199 142 141 206 188 38 153 75 245 28 138 78 90 196 228 196 226 63 171 99 123 61 129 93 169 246 14 54 98 199 66 102 119 74 122 163 104 13 0 1 48 33 167 44 60 43 5 212 10 233 199 142 141 206 188 38 153 75 245 28 138 78 90 196 228 196 226 63 171 99 123 61 129 93 169 246 14 54 98 199 66 102 119 74 122 163 104 13 0 0 112 13 142 178 152 223 193 158 172 255 203 197 100 76 79 42 99 97 196 198 42 60 211 249 142 174 154 123 158 254 134 251 235 151 207 55 209 178 137 7 234 137 81 211 255 191 135 78 179 11 30 121 13 152 88 34 61 56 32 249 153 111 6 135 83 62 197 83 191 163 251 20 161 116 248 36 161 123 44 251 45 216 82 212 120 237 125 134 142 89 7 182 228 191 54 121 104 50 110 8 142 248 42 214 76 253 13 190 143 50 0 0 0 1 112 13 142 178 152 223 193 158 172 255 203 197 100 76 79 42 99 97 196 198 42 60 211 249 142 174 154 123 158 254 134 251 235 151 207 55 209 178 137 7 234 137 81 211 255 191 135 78 179 11 30 121 13 152 88 34 61 56 32 249 153 111 6 135 83 62 197 83 191 163 251 20 161 116 248 36 161 123 44 251 45 216 82 212 120 237 125 134 142 89 7 182 228 191 54 121 104 50 110 8 142 248 42 214 76 253 13 190 143 50 0 0 0 0 32 135 115 67 224 57 26 67 50 161 116 97 239 175 143 9 168 232 95 142 29 48 16 121 194 48 241 158 6 0 0 0 0 1 32 135 115 67 224 57 26 67 50 161 116 97 239 175 143 9 168 232 95 142 29 48 16 121 194 48 241 158 6 0 0 0 0 0 120 179 69 194 42 93 120 64 237 75 176 251 199 63 49 12 217 68 117 60 17 14 70 160 57 29 60 226 156 164 120 98 6 241 147 20 139 159 7 106 210 46 18 44 209 147 45 254 121 230 97 80 19 35 222 34 109 179 236 84 205 123 213 217 33 100 118 217 223 98 205 210 213 162 16 151 66 225 173 235 73 110 112 76 172 232 124 30 64 29 119 3 178 184 119 33 176 53 248 40 157 126 127 125 242 209 202 221 233 124 59 53 81 231 151 52 49 122 224 122 27 1 120 179 69 194 42 93 120 64 237 75 176 251 199 63 49 12 217 68 117 60 17 14 70 160 57 29 60 226 156 164 120 98 6 241 147 20 139 159 7 106 210 46 18 44 209 147 45 254 121 230 97 80 19 35 222 34 109 179 236 84 205 123 213 217 33 100 118 217 223 98 205 210 213 162 16 151 66 225 173 235 73 110 112 76 172 232 124 30 64 29 119 3 178 184 119 33 176 53 248 40 157 126 127 125 242 209 202 221 233 124 59 53 81 231 151 52 49 122 224 122 27 0 88 202 249 247 72 190 100 43 14 53 119 130 14 137 197 240 200 81 190 103 225 158 134 179 33 43 177 147 126 191 141 162 245 224 193 132 144 147 134 16 189 234 157 212 246 176 172 112 191 110 66 141 195 94 234 133 171 20 190 248 55 25 132 147 148 135 183 201 74 89 229 183 214 200 16 91 233 10 37 163 27 133 153 134 93 213 152 142 7 1 88 202 249 247 72 190 100 43 14 53 119 130 14 137 197 240 200 81 190 103 225 158 134 179 33 43 177 147 126 191 141 162 245 224 193 132 144 147 134 16 189 234 157 212 246 176 172 112 191 110 66 141 195 94 234 133 171 20 190 248 55 25 132 147 148 135 183 201 74 89 229 183 214 200 16 91 233 10 37 163 27 133 153 134 93 213 152 142 7 0 88 77 103 16 15 148 98 115 149 166 118 218 10 199 232 124 175 175 165 211 217 182 127 122 39 230 51 107 111 80 51 18 145 177 162 46 2 119 80 163 33 253 187 253 121 34 222 134 85 8 230 102 107 120 117 240 151 81 89 38 47 90 107 129 149 16 144 78 38 26 58 78 61 163 182 119 241 129 192 139 249 183 46 39 109 17 15 240 0 1 88 77 103 16 15 148 98 115 149 166 118 218 10 199 232 124 175 175 165 211 217 182 127 122 39 230 51 107 111 80 51 18 145 177 162 46 2 119 80 163 33 253 187 253 121 34 222 134 85 8 230 102 107 120 117 240 151 81 89 38 47 90 107 129 149 16 144 78 38 26 58 78 61 163 182 119 241 129 192 139 249 183 46 39 109 17 15 240 0 0 56 234 213 76 110 121 53 109 162 71 58 96 120 32 67 142 4 161 13 37 85 104 226 206 115 224 160 35 117 179 108 202 225 198 59 157 91 182 20 254 20 5 196 54 221 64 27 198 127 155 96 99 2 0 0 0 0 1 56 234 213 76 110 121 53 109 162 71 58 96 120 32 67 142 4 161 13 37 85 104 226 206 115 224 160 35 117 179 108 202 225 198 59 157 91 182 20 254 20 5 196 54 221 64 27 198 127 155 96 99 2 0 0 0 0 0 104 130 27 80 132 149 206 104 74 186 108 76 162 61 90 101 136 56 238 26 128 103 13 215 175 217 2 94 203 185 103 235 57 73 179 67 251 148 153 157 188 175 176 9 190 11 144 240 204 176 77 140 59 173 23 41 195 49 211 129 99 226 89 41 61 117 216 244 229 187 66 250 141 7 162 242 64 30 74 137 170 157 234 46 180 106 67 91 184 254 133 132 150 83 202 121 109 229 1 0 0 0 0 0 0 1 104 130 27 80 132 149 206 104 74 186 108 76 162 61 90 101 136 56 238 26 128 103 13 215 175 217 2 94 203 185 103 235 57 73 179 67 251 148 153 157 188 175 176 9 190 11 144 240 204 176 77 140 59 173 23 41 195 49 211 129 99 226 89 41 61 117 216 244 229 187 66 250 141 7 162 242 64 30 74 137 170 157 234 46 180 106 67 91 184 254 133 132 150 83 202 121 109 229 1 0 0 0 0 0 0 0 96 180 177 20 52 197 85 168 138 255 101 101 71 208 219 45 169 123 61 167 239 15 8 52 226 172 233 153 47 28 118 122 247 246 33 225 192 78 230 61 188 196 197 48 3 32 37 12 172 242 129 25 220 16 26 252 131 142 114 105 69 201 34 95 85 12 39 146 145 217 235 38 66 245 145 202 77 22 159 59 0 129 139 201 197 42 198 93 48 54 136 29 220 157 47 43 0 1 96 180 177 20 52 197 85 168 138 255 101 101 71 208 219 45 169 123 61 167 239 15 8 52 226 172 233 153 47 28 118 122 247 246 33 225 192 78 230 61 188 196 197 48 3 32 37 12 172 242 129 25 220 16 26 252 131 142 114 105 69 201 34 95 85 12 39 146 145 217 235 38 66 245 145 202 77 22 159 59 0 129 139 201 197 42 198 93 48 54 136 29 220 157 47 43 0 0 96 228 177 197 157 201 233 218 33 173 105 143 149 114 247 135 47 252 136 226 112 224 250 62 15 148 29 202 26 68 127 193 62 109 233 165 67 21 221 99 246 160 113 232 255 240 215 55 219 168 67 172 220 239 70 18 44 75 90 190 126 188 2 138 148 81 54 76 45 139 27 198 140 152 73 84 62 77 207 250 184 202 70 93 74 35 192 212 68 254 66 167 55 43 72 51 1 1 96 228 177 197 157 201 233 218 33 173 105 143 149 114 247 135 47 252 136 226 112 224 250 62 15 148 29 202 26 68 127 193 62 109 233 165 67 21 221 99 246 160 113 232 255 240 215 55 219 168 67 172 220 239 70 18 44 75 90 190 126 188 2 138 148 81 54 76 45 139 27 198 140 152 73 84 62 77 207 250 184 202 70 93 74 35 192 212 68 254 66 167 55 43 72 51 1 0 64 214 194 164 243 67 99 159 221 32 79 138 118 10 246 26 53 220 63 121 128 209 86 55 147 46 21 147 111 73 114 48 231 199 129 181 226 153 2 49 119 72 168 113 113 77 187 140 153 22 15 24 250 59 186 131 64 170 188 226 4 136 0 0 0 1 64 214 194 164 243 67 99 159 221 32 79 138 118 10 246 26 53 220 63 121 128 209 86 55 147 46 21 147 111 73 114 48 231 199 129 181 226 153 2 49 119 72 168 113 113 77 187 140 153 22 15 24 250 59 186 131 64 170 188 226 4 136 0 0 0 0 56 137 1 85 110 191 240 53 229 183 92 119 252 131 102 74 251 188 32 178 3 182 241 244 250 87 89 25 222 123 231 114 153 55 41 42 92 80 171 133 162 143 161 81 69 72 198 206 202 152 186 2 0 0 0 0 0 1 56 137 1 85 110 191 240 53 229 183 92 119 252 131 102 74 251 188 32 178 3 182 241 244 250 87 89 25 222 123 231 114 153 55 41 42 92 80 171 133 162 143 161 81 69 72 198 206 202 152 186 2 0 0 0 0 0 0 56 211 76 143 162 185 129 219 122 124 64 67 106 130 145 59 54 198 182 118 11 1 159 173 227 145 183 65 74 210 107 97 244 37 234 225 245 194 126 48 168 194 239 99 117 113 246 7 68 90 122 30 120 121 204 1 0 1 56 211 76 143 162 185 129 219 122 124 64 67 106 130 145 59 54 198 182 118 11 1 159 173 227 145 183 65 74 210 107 97 244 37 234 225 245 194 126 48 168 194 239 99 117 113 246 7 68 90 122 30 120 121 204 1 0 0 88 105 73 115 54 214 7 115 255 61 66 95 124 249 26 243 37 155 74 9 85 217 163 49 217 173 61 95 67 196 72 63 156 172 27 80 167 165 134 208 52 201 202 92 55 128 155 17 60 176 105 63 30 206 211 19 235 211 182 152 83 135 179 180 37 195 226 138 134 144 171 149 80 65 145 226 242 243 230 43 132 178 250 39 215 0 0 0 0 1 88 105 73 115 54 214 7 115 255 61 66 95 124 249 26 243 37 155 74 9 85 217 163 49 217 173 61 95 67 196 72 63 156 172 27 80 167 165 134 208 52 201 202 92 55 128 155 17 60 176 105 63 30 206 211 19 235 211 182 152 83 135 179 180 37 195 226 138 134 144 171 149 80 65 145 226 242 243 230 43 132 178 250 39 215 0 0 0 0 0 24 238 147 112 201 202 57 233 73 216 169 141 254 73 1 28 115 92 180 201 139 174 21 11 0 1 24 238 147 112 201 202 57 233 73 216 169 141 254 73 1 28 115 92 180 201 139 174 21 11 0 0 24 11 98 186 29 212 176 86 13 53 40 93 147 195 178 153 54 152 222 244 40 193 19 0 0 1 24 11 98 186 29 212 176 86 13 53 40 93 147 195 178 153 54 152 222 244 40 193 19 0 0 0 40 247 180 251 141 141 62 11 228 178 124 25 179 207 78 30 191 6 166 89 240 173 89 181 244 213 201 90 164 248 113 18 220 53 196 159 235 161 36 114 0 1 40 247 180 251 141 141 62 11 228 178 124 25 179 207 78 30 191 6 166 89 240 173 89 181 244 213 201 90 164 248 113 18 220 53 196 159 235 161 36 114 0 0 96 197 219 246 150 141 204 249 197 122 42 147 254 26 80 88 29 210 60 108 233 49 53 58 229 228 74 204 32 164 150 72 227 75 126 222 254 223 216 61 51 43 121 144 51 162 181 207 169 112 177 75 201 49 79 92 41 7 31 62 225 233 82 103 28 12 148 8 127 39 116 68 202 216 227 213 140 255 16 22 227 223 27 82 6 151 211 143 89 62 252 11 0 0 0 0 0 1 96 197 219 246 150 141 204 249 197 122 42 147 254 26 80 88 29 210 60 108 233 49 53 58 229 228 74 204 32 164 150 72 227 75 126 222 254 223 216 61 51 43 121 144 51 162 181 207 169 112 177 75 201 49 79 92 41 7 31 62 225 233 82 103 28 12 148 8 127 39 116 68 202 216 227 213 140 255 16 22 227 223 27 82 6 151 211 143 89 62 252 11 0 0 0 0 0 0 104 84 85 201 229 80 220 110 27 89 135 96 8 25 169 247 170 52 98 214 179 116 102 103 90 190 212 155 200 5 237 5 33 189 15 223 142 50 1 136 100 122 203 43 219 41 31 201 158 108 205 137 41 171 131 15 69 19 41 170 64 244 118 157 0 134 78 207 249 103 223 37 193 0 163 144 187 16 102 223 27 90 215 43 229 11 42 66 58 117 150 42 248 101 141 189 6 240 7 0 242 197 127 1 0 1 104 84 85 201 229 80 220 110 27 89 135 96 8 25 169 247 170 52 98 214 179 116 102 103 90 190 212 155 200 5 237 5 33 189 15 223 142 50 1 136 100 122 203 43 219 41 31 201 158 108 205 137 41 171 131 15 69 19 41 170 64 244 118 157 0 134 78 207 249 103 223 37 193 0 163 144 187 16 102 223 27 90 215 43 229 11 42 66 58 117 150 42 248 101 141 189 6 240 7 0 242 197 127 1 0 0 8 185 243 251 131 7 0 0 0 1 8 185 243 251 131 7 0 0 0 0 48 188 64 12 102 153 116 180 169 232 182 207 120 2 241 87 106 199 3 100 211 214 177 149 40 69 55 14 15 24 136 141 41 198 26 255 238 213 146 192 182 42 0 0 0 0 0 0 0 1 48 188 64 12 102 153 116 180 169 232 182 207 120 2 241 87 106 199 3 100 211 214 177 149 40 69 55 14 15 24 136 141 41 198 26 255 238 213 146 192 182 42 0 0 0 0 0 0 0 0 40 60 69 243 184 98 7 253 248 147 154 234 108 139 170 83 33 71 50 181 137 96 0 97 65 238 127 238 220 145 220 30 197 164 169 50 39 0 0 0 0 1 40 60 69 243 184 98 7 253 248 147 154 234 108 139 170 83 33 71 50 181 137 96 0 97 65 238 127 238 220 145 220 30 197 164 169 50 39 0 0 0 0 0 112 226 167 90 98 229 230 91 40 155 26 167 140 217 74 204 150 223 188 123 34 82 92 87 7 182 125 184 131 72 19 168 23 168 126 18 67 33 218 228 80 219 32 115 52 91 153 74 185 188 251 88 141 206 245 147 186 188 9 11 227 190 147 53 27 159 175 207 126 95 65 244 167 190 77 129 82 251 142 246 254 93 98 112 160 141 225 214 75 62 208 202 45 97 98 146 177 111 133 60 28 249 233 207 10 171 89 174 70 14 94 129 40 1 112 226 167 90 98 229 230 91 40 155 26 167 140 217 74 204 150 223 188 123 34 82 92 87 7 182 125 184 131 72 19 168 23 168 126 18 67 33 218 228 80 219 32 115 52 91 153 74 185 188 251 88 141 206 245 147 186 188 9 11 227 190 147 53 27 159 175 207 126 95 65 244 167 190 77 129 82 251 142 246 254 93 98 112 160 141 225 214 75 62 208 202 45 97 98 146 177 111 133 60 28 249 233 207 10 171 89 174 70 14 94 129 40 0 8 109 138 127 241 182 108 3 0 1 8 109 138 127 241 182 108 3 0 0 24 253 248 186 235 248 125 194 176 203 231 91 182 41 233 0 226 122 118 84 2 0 0 0 0 1 24 253 248 186 235 248 125 194 176 203 231 91 182 41 233 0 226 122 118 84 2 0 0 0 0 0 16 230 16 7 220 125 232 51 204 126 74 73 232 59 0 0 0 1 16 230 16 7 220 125 232 51 204 126 74 73 232 59 0 0 0 0 128 96 188 53 88 57 212 250 97 99 241 119 39 211 59 47 120 144 156 173 166 143 114 227 10 41 16 55 214 158 53 92 82 10 117 44 252 226 154 161 113 202 150 106 200 19 38 79 40 100 2 216 168 103 49 218 150 159 173 218 238 0 59 105 125 25 202 77 232 122 113 96 184 174 146 91 150 158 119 220 235 41 130 173 153 183 164 219 127 2 22 89 184 116 175 152 236 46 180 242 142 205 40 40 121 115 78 145 79 246 133 130 224 161 140 56 114 143 192 138 82 110 74 44 22 99 135 217 2 1 128 96 188 53 88 57 212 250 97 99 241 119 39 211 59 47 120 144 156 173 166 143 114 227 10 41 16 55 214 158 53 92 82 10 117 44 252 226 154 161 113 202 150 106 200 19 38 79 40 100 2 216 168 103 49 218 150 159 173 218 238 0 59 105 125 25 202 77 232 122 113 96 184 174 146 91 150 158 119 220 235 41 130 173 153 183 164 219 127 2 22 89 184 116 175 152 236 46 180 242 142 205 40 40 121 115 78 145 79 246 133 130 224 161 140 56 114 143 192 138 82 110 74 44 22 99 135 217 2 0 112 183 215 158 47 73 44 220 50 163 229 15 148 225 154 78 50 189 136 15 137 135 196 30 145 70 78 206 57 19 181 129 163 193 193 234 155 1 250 142 170 197 218 122 99 180 214 31 196 167 42 38 254 90 90 60 16 232 180 119 19 88 155 128 27 128 25 230 39 205 154 156 158 153 88 120 44 1 136 211 209 30 179 28 159 46 164 62 97 233 105 33 20 253 209 183 59 98 45 110 88 170 73 103 237 172 14 0 0 0 0 0 0 1 112 183 215 158 47 73 44 220 50 163 229 15 148 225 154 78 50 189 136 15 137 135 196 30 145 70 78 206 57 19 181 129 163 193 193 234 155 1 250 142 170 197 218 122 99 180 214 31 196 167 42 38 254 90 90 60 16 232 180 119 19 88 155 128 27 128 25 230 39 205 154 156 158 153 88 120 44 1 136 211 209 30 179 28 159 46 164 62 97 233 105 33 20 253 209 183 59 98 45 110 88 170 73 103 237 172 14 0 0 0 0 0 0 0 112 109 39 198 116 134 109 137 3 154 63 133 155 109 82 108 240 13 83 246 109 126 71 168 5 252 39 139 51 83 180 93 45 15 158 50 208 87 19 218 21 230 235 83 238 84 254 144 65 87 7 55 39 65 75 33 1 137 221 191 101 104 101 15 201 217 163 216 64 237 92 24 199 180 178 166 245 190 146 159 89 122 28 142 102 176 245 112 28 239 140 93 48 144 224 181 154 244 92 174 112 189 17 186 11 61 0 0 0 0 0 0 0 1 112 109 39 198 116 134 109 137 3 154 63 133 155 109 82 108 240 13 83 246 109 126 71 168 5 252 39 139 51 83 180 93 45 15 158 50 208 87 19 218 21 230 235 83 238 84 254 144 65 87 7 55 39 65 75 33 1 137 221 191 101 104 101 15 201 217 163 216 64 237 92 24 199 180 178 166 245 190 146 159 89 122 28 142 102 176 245 112 28 239 140 93 48 144 224 181 154 244 92 174 112 189 17 186 11 61 0 0 0 0 0 0 0 0 96 115 25 74 181 122 105 117 16 23 160 104 186 173 148 142 130 124 69 176 164 120 37 35 164 26 5 203 211 81 114 102 172 157 224 92 119 72 40 156 152 170 218 239 244 122 119 68 255 223 165 182 239 221 222 170 86 17 177 252 123 251 137 160 2 17 88 15 181 45 222 85 1 145 242 26 221 26 143 50 5 231 126 165 15 88 139 246 42 136 0 0 0 0 0 0 0 1 96 115 25 74 181 122 105 117 16 23 160 104 186 173 148 142 130 124 69 176 164 120 37 35 164 26 5 203 211 81 114 102 172 157 224 92 119 72 40 156 152 170 218 239 244 122 119 68 255 223 165 182 239 221 222 170 86 17 177 252 123 251 137 160 2 17 88 15 181 45 222 85 1 145 242 26 221 26 143 50 5 231 126 165 15 88 139 246 42 136 0 0 0 0 0 0 0 0 24 11 96 10 112 174 90 0 74 17 97 66 74 95 235 134 176 1 0 0 0 0 0 0 0 1 24 11 96 10 112 174 90 0 74 17 97 66 74 95 235 134 176 1 0 0 0 0 0 0 0 0 48 154 185 66 152 86 30 237 20 211 200 92 232 231 159 111 104 239 215 186 246 153 131 145 191 158 17 100 149 87 115 114 80 153 175 127 213 20 30 55 123 56 0 0 0 0 0 0 0 1 48 154 185 66 152 86 30 237 20 211 200 92 232 231 159 111 104 239 215 186 246 153 131 145 191 158 17 100 149 87 115 114 80 153 175 127 213 20 30 55 123 56 0 0 0 0 0 0 0 0 104 200 46 197 117 247 255 182 227 22 29 184 198 24 211 143 87 190 175 196 153 250 144 95 50 47 199 87 38 91 196 72 184 66 112 224 205 213 241 213 215 217 50 114 236 249 135 67 151 218 231 131 138 171 95 70 223 55 110 156 24 86 4 116 64 213 4 169 211 115 62 175 39 13 169 242 237 56 166 5 99 183 238 116 46 114 188 183 203 8 57 40 83 132 247 182 225 184 108 0 0 0 0 0 0 1 104 200 46 197 117 247 255 182 227 22 29 184 198 24 211 143 87 190 175 196 153 250 144 95 50 47 199 87 38 91 196 72 184 66 112 224 205 213 241 213 215 217 50 114 236 249 135 67 151 218 231 131 138 171 95 70 223 55 110 156 24 86 4 116 64 213 4 169 211 115 62 175 39 13 169 242 237 56 166 5 99 183 238 116 46 114 188 183 203 8 57 40 83 132 247 182 225 184 108 0 0 0 0 0 0 0 128 94 235 124 73 23 127 111 55 10 111 84 126 170 16 77 106 181 163 73 165 249 170 40 170 90 228 108 176 252 39 45 191 204 225 251 145 26 45 5 233 1 112 57 57 75 136 241 126 114 242 43 156 144 93 196 214 225 123 243 163 118 208 74 233 52 78 129 73 101 32 94 180 49 175 158 209 26 110 42 125 133 11 133 252 19 105 165 220 63 81 214 85 35 166 157 95 220 199 190 78 235 205 161 109 38 86 178 173 75 16 150 107 115 202 87 90 44 122 250 44 242 3 0 0 0 0 0 0 1 128 94 235 124 73 23 127 111 55 10 111 84 126 170 16 77 106 181 163 73 165 249 170 40 170 90 228 108 176 252 39 45 191 204 225 251 145 26 45 5 233 1 112 57 57 75 136 241 126 114 242 43 156 144 93 196 214 225 123 243 163 118 208 74 233 52 78 129 73 101 32 94 180 49 175 158 209 26 110 42 125 133 11 133 252 19 105 165 220 63 81 214 85 35 166 157 95 220 199 190 78 235 205 161 109 38 86 178 173 75 16 150 107 115 202 87 90 44 122 250 44 242 3 0 0 0 0 0 0 0 64 33 38 244 173 112 88 99 122 250 156 144 15 79 132 196 15 41 75 133 177 70 36 29 76 228 221 155 246 69 197 87 207 178 221 150 150 163 43 125 211 170 119 162 199 18 140 88 14 141 156 131 55 86 105 131 87 183 202 138 193 250 146 7 0 1 64 33 38 244 173 112 88 99 122 250 156 144 15 79 132 196 15 41 75 133 177 70 36 29 76 228 221 155 246 69 197 87 207 178 221 150 150 163 43 125 211 170 119 162 199 18 140 88 14 141 156 131 55 86 105 131 87 183 202 138 193 250 146 7 0 0 8 193 65 150 116 8 0 0 0 1 8 193 65 150 116 8 0 0 0 0 88 222 76 87 0 39 117 3 50 43 76 65 78 229 242 96 28 45 68 9 84 77 32 141 102 105 143 7 223 208 38 17 171 1 5 64 101 80 4 202 47 105 247 32 207 194 242 83 135 163 54 216 178 26 17 93 139 73 169 226 217 99 11 82 47 3 157 215 215 153 31 216 121 218 217 197 70 198 39 255 50 228 150 229 67 199 1 0 0 1 88 222 76 87 0 39 117 3 50 43 76 65 78 229 242 96 28 45 68 9 84 77 32 141 102 105 143 7 223 208 38 17 171 1 5 64 101 80 4 202 47 105 247 32 207 194 242 83 135 163 54 216 178 26 17 93 139 73 169 226 217 99 11 82 47 3 157 215 215 153 31 216 121 218 217 197 70 198 39 255 50 228 150 229 67 199 1 0 0 0 64 132 11 227 148 45 72 132 90 43 39 166 76 172 224 159 49 82 126 46 147 149 229 112 96 19 103 129 209 180 204 78 161 218 161 137 155 40 142 2 48 80 224 51 94 209 169 119 94 212 151 125 134 39 145 109 231 4 0 0 0 0 0 0 0 1 64 132 11 227 148 45 72 132 90 43 39 166 76 172 224 159 49 82 126 46 147 149 229 112 96 19 103 129 209 180 204 78 161 218 161 137 155 40 142 2 48 80 224 51 94 209 169 119 94 212 151 125 134 39 145 109 231 4 0 0 0 0 0 0 0 0 24 123 47 118 34 191 206 207 171 213 67 79 77 219 89 68 92 2 0 0 0 0 0 0 0 1 24 123 47 118 34 191 206 207 171 213 67 79 77 219 89 68 92 2 0 0 0 0 0 0 0 0 56 181 219 18 61 30 154 15 167 192 14 196 148 216 66 206 1 98 115 173 137 197 47 49 228 38 188 178 148 202 18 96 2 103 255 202 246 177 221 107 35 180 27 33 72 172 31 69 128 123 0 0 0 0 0 0 0 1 56 181 219 18 61 30 154 15 167 192 14 196 148 216 66 206 1 98 115 173 137 197 47 49 228 38 188 178 148 202 18 96 2 103 255 202 246 177 221 107 35 180 27 33 72 172 31 69 128 123 0 0 0 0 0 0 0 0 32 7 82 250 163 171 151 193 242 222 208 224 252 8 145 119 231 240 219 237 115 112 17 84 150 54 234 247 1 0 0 0 0 1 32 7 82 250 163 171 151 193 242 222 208 224 252 8 145 119 231 240 219 237 115 112 17 84 150 54 234 247 1 0 0 0 0 0 104 106 128 3 1 188 158 131 102 30 13 165 34 56 140 67 110 15 41 20 34 218 85 212 56 208 97 6 198 121 86 231 16 60 41 116 51 112 68 146 225 249 153 79 173 152 178 167 118 161 49 82 252 223 181 39 89 10 249 163 146 32 111 19 91 56 141 207 248 45 150 31 199 164 135 69 61 48 86 28 152 157 46 95 110 240 67 68 230 61 162 195 46 59 109 223 151 104 231 1 0 0 0 0 0 1 104 106 128 3 1 188 158 131 102 30 13 165 34 56 140 67 110 15 41 20 34 218 85 212 56 208 97 6 198 121 86 231 16 60 41 116 51 112 68 146 225 249 153 79 173 152 178 167 118 161 49 82 252 223 181 39 89 10 249 163 146 32 111 19 91 56 141 207 248 45 150 31 199 164 135 69 61 48 86 28 152 157 46 95 110 240 67 68 230 61 162 195 46 59 109 223 151 104 231 1 0 0 0 0 0 0 8 71 170 230 149 60 169 8 0 1 8 71 170 230 149 60 169 8 0 0 104 197 60 13 194 96 169 102 36 193 199 30 151 61 112 84 43 43 191 194 1 161 56 139 53 115 136 32 148 17 113 135 55 123 181 224 91 143 170 42 70 154 95 146 126 90 132 159 105 180 251 18 41 35 80 231 44 31 43 32 145 245 182 101 28 236 119 33 66 1 225 23 219 129 219 214 243 191 203 150 13 208 77 171 34 153 52 224 233 94 147 246 3 95 62 22 212 102 7 164 241 174 21 0 0 1 104 197 60 13 194 96 169 102 36 193 199 30 151 61 112 84 43 43 191 194 1 161 56 139 53 115 136 32 148 17 113 135 55 123 181 224 91 143 170 42 70 154 95 146 126 90 132 159 105 180 251 18 41 35 80 231 44 31 43 32 145 245 182 101 28 236 119 33 66 1 225 23 219 129 219 214 243 191 203 150 13 208 77 171 34 153 52 224 233 94 147 246 3 95 62 22 212 102 7 164 241 174 21 0 0 0 8 255 177 136 137 82 0 0 0 1 8 255 177 136 137 82 0 0 0 0 32 244 28 97 243 182 228 22 188 140 208 197 48 85 163 246 9 179 58 95 58 150 166 115 224 1 0 0 0 0 0 0 0 1 32 244 28 97 243 182 228 22 188 140 208 197 48 85 163 246 9 179 58 95 58 150 166 115 224 1 0 0 0 0 0 0 0 0 56 18 166 152 245 55 183 20 61 65 95 235 22 101 208 144 158 244 134 73 6 107 252 90 131 187 46 111 218 192 193 204 157 69 78 249 68 158 131 231 84 169 155 246 223 255 125 237 56 39 124 83 222 2 0 0 0 1 56 18 166 152 245 55 183 20 61 65 95 235 22 101 208 144 158 244 134 73 6 107 252 90 131 187 46 111 218 192 193 204 157 69 78 249 68 158 131 231 84 169 155 246 223 255 125 237 56 39 124 83 222 2 0 0 0 0 64 125 215 194 190 138 172 44 82 18 4 12 27 37 152 98 142 28 176 36 149 113 6 134 186 247 114 113 24 143 28 126 9 132 211 32 84 48 255 229 143 210 55 139 145 108 151 47 228 54 230 198 125 130 0 191 218 241 25 250 223 160 158 116 0 1 64 125 215 194 190 138 172 44 82 18 4 12 27 37 152 98 142 28 176 36 149 113 6 134 186 247 114 113 24 143 28 126 9 132 211 32 84 48 255 229 143 210 55 139 145 108 151 47 228 54 230 198 125 130 0 191 218 241 25 250 223 160 158 116 0 0 64 3 57 187 171 211 24 69 12 134 135 186 26 223 242 182 51 228 122 123 228 34 89 39 47 189 254 2 149 226 207 2 67 99 42 86 56 191 230 17 56 161 156 156 78 118 244 228 6 251 250 232 155 46 194 10 138 122 135 43 0 0 0 0 0 1 64 3 57 187 171 211 24 69 12 134 135 186 26 223 242 182 51 228 122 123 228 34 89 39 47 189 254 2 149 226 207 2 67 99 42 86 56 191 230 17 56 161 156 156 78 118 244 228 6 251 250 232 155 46 194 10 138 122 135 43 0 0 0 0 0 0 64 172 126 95 38 172 16 35 220 31 69 231 168 50 246 181 132 163 59 105 107 11 195 114 20 55 43 40 50 235 159 196 170 131 133 34 254 126 123 149 223 8 155 192 190 96 9 65 243 130 152 203 23 54 157 5 6 21 0 0 0 0 0 0 0 1 64 172 126 95 38 172 16 35 220 31 69 231 168 50 246 181 132 163 59 105 107 11 195 114 20 55 43 40 50 235 159 196 170 131 133 34 254 126 123 149 223 8 155 192 190 96 9 65 243 130 152 203 23 54 157 5 6 21 0 0 0 0 0 0 0 0 64 2 111 152 136 184 111 221 198 128 165 251 127 213 81 172 8 106 234 51 14 82 18 6 231 152 0 230 43 112 55 155 160 105 77 184 34 204 159 232 23 202 84 150 215 63 252 216 202 135 94 254 143 56 128 190 119 156 93 36 146 106 50 31 0 1 64 2 111 152 136 184 111 221 198 128 165 251 127 213 81 172 8 106 234 51 14 82 18 6 231 152 0 230 43 112 55 155 160 105 77 184 34 204 159 232 23 202 84 150 215 63 252 216 202 135 94 254 143 56 128 190 119 156 93 36 146 106 50 31 0 0 88 67 179 87 45 0 244 146 0 251 216 55 206 169 143 153 155 204 98 242 127 58 228 9 185 140 50 24 85 71 140 103 173 214 208 88 197 18 88 42 237 5 249 171 151 55 8 19 64 247 14 51 205 117 38 200 199 107 98 33 41 209 251 142 166 190 178 246 165 231 178 156 209 134 137 201 40 51 114 105 214 176 192 40 0 0 0 0 0 1 88 67 179 87 45 0 244 146 0 251 216 55 206 169 143 153 155 204 98 242 127 58 228 9 185 140 50 24 85 71 140 103 173 214 208 88 197 18 88 42 237 5 249 171 151 55 8 19 64 247 14 51 205 117 38 200 199 107 98 33 41 209 251 142 166 190 178 246 165 231 178 156 209 134 137 201 40 51 114 105 214 176 192 40 0 0 0 0 0 0 104 210 223 181 52 158 133 105 60 206 60 97 88 35 84 39 241 68 117 46 200 25 178 180 2 135 170 228 237 78 95 141 220 192 61 243 38 81 141 157 147 134 105 20 141 231 139 98 217 141 233 206 38 63 88 41 115 146 165 44 212 80 120 9 35 155 237 10 49 241 130 64 144 5 183 157 196 6 21 107 70 41 197 111 109 215 116 229 241 167 89 202 52 203 220 160 217 246 30 235 144 235 19 0 0 1 104 210 223 181 52 158 133 105 60 206 60 97 88 35 84 39 241 68 117 46 200 25 178 180 2 135 170 228 237 78 95 141 220 192 61 243 38 81 141 157 147 134 105 20 141 231 139 98 217 141 233 206 38 63 88 41 115 146 165 44 212 80 120 9 35 155 237 10 49 241 130 64 144 5 183 157 196 6 21 107 70 41 197 111 109 215 116 229 241 167 89 202 52 203 220 160 217 246 30 235 144 235 19 0 0 0 96 152 150 20 214 127 232 198 173 9 79 27 3 184 211 18 63 222 243 206 88 162 250 92 190 84 152 234 94 69 155 44 142 240 190 37 73 181 195 210 164 18 87 93 129 136 94 136 136 217 218 51 29 223 183 84 208 218 2 84 239 77 91 212 169 82 20 75 248 125 91 121 11 45 39 139 41 225 254 195 35 239 16 190 22 173 227 229 119 204 69 22 0 0 0 0 0 1 96 152 150 20 214 127 232 198 173 9 79 27 3 184 211 18 63 222 243 206 88 162 250 92 190 84 152 234 94 69 155 44 142 240 190 37 73 181 195 210 164 18 87 93 129 136 94 136 136 217 218 51 29 223 183 84 208 218 2 84 239 77 91 212 169 82 20 75 248 125 91 121 11 45 39 139 41 225 254 195 35 239 16 190 22 173 227 229 119 204 69 22 0 0 0 0 0 0 120 44 138 21 104 121 166 168 12 110 50 53 151 231 148 52 129 170 198 240 95 34 68 28 124 55 201 57 159 127 63 21 5 63 2 162 178 197 92 197 192 93 104 136 44 43 255 49 242 182 132 190 94 80 205 87 26 3 171 184 215 205 47 219 227 179 185 205 230 127 65 231 66 123 92 125 163 244 195 94 188 196 160 223 181 5 166 64 111 85 190 120 122 41 201 0 186 192 106 199 252 164 20 92 37 80 149 48 19 150 123 103 189 229 79 223 27 244 74 0 0 1 120 44 138 21 104 121 166 168 12 110 50 53 151 231 148 52 129 170 198 240 95 34 68 28 124 55 201 57 159 127 63 21 5 63 2 162 178 197 92 197 192 93 104 136 44 43 255 49 242 182 132 190 94 80 205 87 26 3 171 184 215 205 47 219 227 179 185 205 230 127 65 231 66 123 92 125 163 244 195 94 188 196 160 223 181 5 166 64 111 85 190 120 122 41 201 0 186 192 106 199 252 164 20 92 37 80 149 48 19 150 123 103 189 229 79 223 27 244 74 0 0 0 104 245 181 98 66 108 43 27 238 39 17 236 216 168 31 46 226 159 160 142 67 146 30 10 164 14 213 242 136 234 225 199 106 255 33 115 237 228 171 8 216 45 122 202 182 141 16 25 154 11 32 53 253 203 2 153 173 247 193 28 139 204 11 42 191 71 206 216 60 1 99 141 204 17 235 245 239 210 176 83 155 175 144 26 254 215 45 202 84 103 74 45 94 174 24 228 158 37 0 0 0 0 0 0 0 1 104 245 181 98 66 108 43 27 238 39 17 236 216 168 31 46 226 159 160 142 67 146 30 10 164 14 213 242 136 234 225 199 106 255 33 115 237 228 171 8 216 45 122 202 182 141 16 25 154 11 32 53 253 203 2 153 173 247 193 28 139 204 11 42 191 71 206 216 60 1 99 141 204 17 235 245 239 210 176 83 155 175 144 26 254 215 45 202 84 103 74 45 94 174 24 228 158 37 0 0 0 0 0 0 0 0 104 57 246 11 97 62 119 196 46 75 16 79 108 49 113 219 104 188 179 248 78 58 245 127 216 140 166 196 171 132 59 25 253 51 249 216 140 222 121 230 30 172 32 207 74 205 85 44 90 36 173 79 87 194 82 25 79 135 112 132 221 164 76 173 137 126 195 194 92 248 173 9 87 209 223 59 125 95 65 85 163 122 135 111 167 236 33 52 80 27 61 178 237 205 251 204 39 240 191 179 209 167 168 143 7 1 104 57 246 11 97 62 119 196 46 75 16 79 108 49 113 219 104 188 179 248 78 58 245 127 216 140 166 196 171 132 59 25 253 51 249 216 140 222 121 230 30 172 32 207 74 205 85 44 90 36 173 79 87 194 82 25 79 135 112 132 221 164 76 173 137 126 195 194 92 248 173 9 87 209 223 59 125 95 65 85 163 122 135 111 167 236 33 52 80 27 61 178 237 205 251 204 39 240 191 179 209 167 168 143 7 0 40 163 89 48 170 102 43 220 156 66 109 77 113 21 188 67 203 215 226 3 205 170 236 98 121 244 145 200 70 209 174 177 8 139 184 149 27 0 0 0 0 1 40 163 89 48 170 102 43 220 156 66 109 77 113 21 188 67 203 215 226 3 205 170 236 98 121 244 145 200 70 209 174 177 8 139 184 149 27 0 0 0 0 0 96 53 9 22 111 90 93 185 232 66 232 61 190 77 71 90 216 56 212 22 125 84 142 129 138 224 63 243 92 90 116 216 187 231 68 78 132 78 241 87 154 62 85 115 206 103 51 246 75 206 191 127 30 122 123 36 8 228 202 50 139 177 122 8 243 137 70 204 22 54 249 70 184 115 203 134 211 234 65 106 138 66 20 24 187 65 57 199 142 254 18 13 0 0 0 0 0 1 96 53 9 22 111 90 93 185 232 66 232 61 190 77 71 90 216 56 212 22 125 84 142 129 138 224 63 243 92 90 116 216 187 231 68 78 132 78 241 87 154 62 85 115 206 103 51 246 75 206 191 127 30 122 123 36 8 228 202 50 139 177 122 8 243 137 70 204 22 54 249 70 184 115 203 134 211 234 65 106 138 66 20 24 187 65 57 199 142 254 18 13 0 0 0 0 0 0 88 149 88 176 69 223 36 37 144 73 234 120 8 99 221 137 178 30 189 44 46 85 157 48 42 245 113 38 233 244 178 224 211 47 14 147 125 42 18 227 2 75 4 61 200 33 227 150 10 58 244 38 21 49 115 166 218 124 93 108 5 73 235 24 7 87 152 177 21 225 23 170 204 54 120 154 213 94 174 62 0 72 37 253 148 145 218 243 1 1 88 149 88 176 69 223 36 37 144 73 234 120 8 99 221 137 178 30 189 44 46 85 157 48 42 245 113 38 233 244 178 224 211 47 14 147 125 42 18 227 2 75 4 61 200 33 227 150 10 58 244 38 21 49 115 166 218 124 93 108 5 73 235 24 7 87 152 177 21 225 23 170 204 54 120 154 213 94 174 62 0 72 37 253 148 145 218 243 1 0 8 30 0 0 0 0 0 0 0 1 8 30 0 0 0 0 0 0 0 0 88 155 231 228 201 142 243 71 208 249 176 228 44 166 218 152 155 74 36 194 74 148 67 125 239 134 32 23 215 211 53 175 202 69 44 53 118 45 165 95 123 12 108 231 154 213 28 20 163 249 156 33 65 206 61 154 174 104 60 98 109 32 78 242 212 129 149 248 201 134 148 123 181 199 217 155 194 96 140 22 149 241 60 138 83 0 0 0 0 1 88 155 231 228 201 142 243 71 208 249 176 228 44 166 218 152 155 74 36 194 74 148 67 125 239 134 32 23 215 211 53 175 202 69 44 53 118 45 165 95 123 12 108 231 154 213 28 20 163 249 156 33 65 206 61 154 174 104 60 98 109 32 78 242 212 129 149 248 201 134 148 123 181 199 217 155 194 96 140 22 149 241 60 138 83 0 0 0 0 0 96 144 67 10 47 192 191 82 221 35 118 53 159 135 152 112 38 73 15 23 69 58 219 225 247 78 102 170 227 6 163 149 12 249 225 137 246 239 39 40 234 163 207 114 112 115 115 194 219 16 202 159 189 202 35 212 109 38 217 132 76 179 231 7 209 218 188 27 208 113 230 164 84 51 101 32 180 123 194 122 68 150 119 65 252 204 137 177 46 234 227 67 1 0 0 0 0 1 96 144 67 10 47 192 191 82 221 35 118 53 159 135 152 112 38 73 15 23 69 58 219 225 247 78 102 170 227 6 163 149 12 249 225 137 246 239 39 40 234 163 207 114 112 115 115 194 219 16 202 159 189 202 35 212 109 38 217 132 76 179 231 7 209 218 188 27 208 113 230 164 84 51 101 32 180 123 194 122 68 150 119 65 252 204 137 177 46 234 227 67 1 0 0 0 0 0 24 72 56 22 141 170 58 90 163 187 180 242 135 44 169 146 74 211 248 249 78 94 0 0 0 1 24 72 56 22 141 170 58 90 163 187 180 242 135 44 169 146 74 211 248 249 78 94 0 0 0 0 88 212 210 42 73 12 25 196 31 47 75 120 243 73 247 127 147 72 96 165 96 14 69 196 39 172 6 5 194 11 134 119 124 92 255 174 158 25 36 41 88 174 179 156 60 218 178 156 41 175 187 120 209 98 0 19 182 231 198 178 95 52 119 23 97 47 127 143 101 176 216 52 159 106 61 182 27 146 186 142 96 231 29 27 0 0 0 0 0 1 88 212 210 42 73 12 25 196 31 47 75 120 243 73 247 127 147 72 96 165 96 14 69 196 39 172 6 5 194 11 134 119 124 92 255 174 158 25 36 41 88 174 179 156 60 218 178 156 41 175 187 120 209 98 0 19 182 231 198 178 95 52 119 23 97 47 127 143 101 176 216 52 159 106 61 182 27 146 186 142 96 231 29 27 0 0 0 0 0 0 16 202 192 8 50 72 83 78 188 175 88 50 125 131 102 195 3 1 16 202 192 8 50 72 83 78 188 175 88 50 125 131 102 195 3 0 64 129 235 99 25 168 162 143 14 181 191 24 1 54 4 85 204 63 111 78 71 241 253 45 225 56 177 121 166 226 7 163 1 182 155 9 74 40 35 9 9 175 144 171 35 224 162 163 133 97 35 188 126 220 236 73 96 97 129 14 0 0 0 0 0 1 64 129 235 99 25 168 162 143 14 181 191 24 1 54 4 85 204 63 111 78 71 241 253 45 225 56 177 121 166 226 7 163 1 182 155 9 74 40 35 9 9 175 144 171 35 224 162 163 133 97 35 188 126 220 236 73 96 97 129 14 0 0 0 0 0 0 64 108 92 234 131 231 188 232 51 18 198 215 40 15 157 152 141 79 144 203 196 249 187 115 41 230 177 33 50 91 32 10 169 73 162 155 234 98 212 245 92 106 18 104 75 83 194 149 253 23 63 13 64 214 243 154 201 132 100 31 187 255 119 206 203 1 64 108 92 234 131 231 188 232 51 18 198 215 40 15 157 152 141 79 144 203 196 249 187 115 41 230 177 33 50 91 32 10 169 73 162 155 234 98 212 245 92 106 18 104 75 83 194 149 253 23 63 13 64 214 243 154 201 132 100 31 187 255 119 206 203 0 104 234 116 169 65 23 182 136 224 163 211 105 192 204 31 82 240 175 46 102 159 95 158 50 9 145 106 22 60 50 33 177 26 225 82 114 86 212 7 154 44 212 126 161 171 72 116 119 246 52 229 38 173 55 41 107 40 184 253 98 215 24 91 66 142 30 173 123 90 125 69 86 227 60 60 95 206 124 147 44 60 155 141 241 90 83 7 53 206 71 46 134 127 122 180 31 53 82 214 176 0 0 0 0 0 1 104 234 116 169 65 23 182 136 224 163 211 105 192 204 31 82 240 175 46 102 159 95 158 50 9 145 106 22 60 50 33 177 26 225 82 114 86 212 7 154 44 212 126 161 171 72 116 119 246 52 229 38 173 55 41 107 40 184 253 98 215 24 91 66 142 30 173 123 90 125 69 86 227 60 60 95 206 124 147 44 60 155 141 241 90 83 7 53 206 71 46 134 127 122 180 31 53 82 214 176 0 0 0 0 0 0 128 246 224 179 231 248 85 24 201 210 110 165 232 153 136 96 155 10 189 255 115 232 19 11 61 42 152 98 194 221 200 42 3 215 220 12 102 106 69 77 69 216 253 146 196 230 240 63 118 205 224 76 129 107 174 183 121 74 199 99 224 180 49 180 47 34 35 35 224 247 193 61 42 51 142 16 105 58 239 223 3 189 5 85 19 221 249 251 255 86 9 113 209 31 184 51 28 17 30 9 254 164 62 237 123 73 56 8 110 166 164 217 88 106 22 85 183 98 156 139 221 73 253 52 0 0 0 0 0 1 128 246 224 179 231 248 85 24 201 210 110 165 232 153 136 96 155 10 189 255 115 232 19 11 61 42 152 98 194 221 200 42 3 215 220 12 102 106 69 77 69 216 253 146 196 230 240 63 118 205 224 76 129 107 174 183 121 74 199 99 224 180 49 180 47 34 35 35 224 247 193 61 42 51 142 16 105 58 239 223 3 189 5 85 19 221 249 251 255 86 9 113 209 31 184 51 28 17 30 9 254 164 62 237 123 73 56 8 110 166 164 217 88 106 22 85 183 98 156 139 221 73 253 52 0 0 0 0 0 0 80 114 71 65 89 237 36 19 196 155 136 82 8 202 243 70 78 29 120 129 104 2 108 32 185 184 120 36 214 143 191 219 217 92 173 243 221 253 134 71 240 107 182 126 78 197 54 130 17 174 97 201 95 84 153 156 87 239 78 186 103 226 240 168 109 214 167 102 253 22 173 79 216 165 16 0 0 0 0 0 0 1 80 114 71 65 89 237 36 19 196 155 136 82 8 202 243 70 78 29 120 129 104 2 108 32 185 184 120 36 214 143 191 219 217 92 173 243 221 253 134 71 240 107 182 126 78 197 54 130 17 174 97 201 95 84 153 156 87 239 78 186 103 226 240 168 109 214 167 102 253 22 173 79 216 165 16 0 0 0 0 0 0 0 48 205 174 153 159 175 148 18 158 235 107 21 147 172 130 150 6 109 216 1 3 85 18 35 218 2 59 66 219 110 2 146 243 32 186 68 69 178 58 234 207 205 114 206 3 0 0 0 0 1 48 205 174 153 159 175 148 18 158 235 107 21 147 172 130 150 6 109 216 1 3 85 18 35 218 2 59 66 219 110 2 146 243 32 186 68 69 178 58 234 207 205 114 206 3 0 0 0 0 0 120 6 227 111 143 56 164 39 218 18 125 60 7 225 195 8 232 184 177 163 16 21 29 165 72 172 201 28 230 132 0 86 23 246 125 104 127 83 109 13 113 149 216 245 166 173 128 120 168 110 19 178 216 69 212 66 94 179 133 240 181 66 121 14 166 89 77 60 143 152 41 85 140 62 121 51 44 123 188 123 173 52 74 2 31 233 7 229 187 139 234 225 45 79 247 235 210 113 240 84 200 66 137 125 254 189 83 79 17 221 213 32 54 4 0 0 0 0 0 0 0 1 120 6 227 111 143 56 164 39 218 18 125 60 7 225 195 8 232 184 177 163 16 21 29 165 72 172 201 28 230 132 0 86 23 246 125 104 127 83 109 13 113 149 216 245 166 173 128 120 168 110 19 178 216 69 212 66 94 179 133 240 181 66 121 14 166 89 77 60 143 152 41 85 140 62 121 51 44 123 188 123 173 52 74 2 31 233 7 229 187 139 234 225 45 79 247 235 210 113 240 84 200 66 137 125 254 189 83 79 17 221 213 32 54 4 0 0 0 0 0 0 0 0 80 180 196 94 156 54 195 58 2 39 205 18 27 183 204 87 155 155 103 140 143 118 225 162 141 198 191 103 246 251 35 33 200 114 204 108 157 138 202 183 109 135 225 247 167 85 247 149 166 13 150 140 115 191 119 88 74 150 209 45 234 64 143 177 65 18 230 195 62 134 19 33 86 117 177 249 0 0 0 0 0 1 80 180 196 94 156 54 195 58 2 39 205 18 27 183 204 87 155 155 103 140 143 118 225 162 141 198 191 103 246 251 35 33 200 114 204 108 157 138 202 183 109 135 225 247 167 85 247 149 166 13 150 140 115 191 119 88 74 150 209 45 234 64 143 177 65 18 230 195 62 134 19 33 86 117 177 249 0 0 0 0 0 0 104 77 194 158 250 209 247 60 209 53 237 237 50 69 209 78 167 168 156 255 102 176 89 29 124 236 2 92 64 171 213 222 61 154 151 17 221 163 26 188 48 218 181 25 207 24 78 174 96 77 4 92 36 81 77 82 53 226 55 109 24 229 73 137 228 213 186 236 231 140 148 101 63 106 130 255 94 160 246 229 63 254 107 254 48 15 56 43 131 180 38 166 178 234 233 86 61 2 85 154 172 81 81 66 9 1 104 77 194 158 250 209 247 60 209 53 237 237 50 69 209 78 167 168 156 255 102 176 89 29 124 236 2 92 64 171 213 222 61 154 151 17 221 163 26 188 48 218 181 25 207 24 78 174 96 77 4 92 36 81 77 82 53 226 55 109 24 229 73 137 228 213 186 236 231 140 148 101 63 106 130 255 94 160 246 229 63 254 107 254 48 15 56 43 131 180 38 166 178 234 233 86 61 2 85 154 172 81 81 66 9 0 32 159 255 244 214 47 170 4 34 47 46 170 236 221 0 119 135 29 199 192 21 169 211 135 216 147 25 112 187 63 0 0 0 1 32 159 255 244 214 47 170 4 34 47 46 170 236 221 0 119 135 29 199 192 21 169 211 135 216 147 25 112 187 63 0 0 0 0 8 136 102 2 0 0 0 0 0 1 8 136 102 2 0 0 0 0 0 0 104 182 114 42 214 204 210 88 197 7 199 39 124 27 200 142 13 162 188 42 112 118 92 202 215 78 160 112 52 72 100 65 30 205 199 86 182 35 211 245 70 139 86 183 94 139 115 30 32 188 225 10 237 169 169 192 188 84 209 158 78 210 48 148 84 141 6 11 247 62 239 52 100 249 186 173 138 163 134 212 20 243 14 250 162 155 177 89 175 243 3 44 202 80 198 163 43 3 0 0 0 0 0 0 0 1 104 182 114 42 214 204 210 88 197 7 199 39 124 27 200 142 13 162 188 42 112 118 92 202 215 78 160 112 52 72 100 65 30 205 199 86 182 35 211 245 70 139 86 183 94 139 115 30 32 188 225 10 237 169 169 192 188 84 209 158 78 210 48 148 84 141 6 11 247 62 239 52 100 249 186 173 138 163 134 212 20 243 14 250 162 155 177 89 175 243 3 44 202 80 198 163 43 3 0 0 0 0 0 0 0 0 112 99 120 242 101 168 63 63 168 132 177 224 65 190 4 179 252 98 42 247 140 190 31 23 0 117 179 116 199 98 202 211 102 139 65 63 177 51 13 22 232 149 208 247 101 128 25 173 165 160 191 102 145 173 51 230 242 244 7 170 233 242 115 73 120 62 67 64 36 3 41 74 159 24 59 71 166 190 104 193 40 86 159 53 253 65 67 111 21 48 43 46 214 182 41 210 212 59 110 156 33 239 225 212 27 107 0 0 0 0 0 0 0 1 112 99 120 242 101 168 63 63 168 132 177 224 65 190 4 179 252 98 42 247 140 190 31 23 0 117 179 116 199 98 202 211 102 139 65 63 177 51 13 22 232 149 208 247 101 128 25 173 165 160 191 102 145 173 51 230 242 244 7 170 233 242 115 73 120 62 67 64 36 3 41 74 159 24 59 71 166 190 104 193 40 86 159 53 253 65 67 111 21 48 43 46 214 182 41 210 212 59 110 156 33 239 225 212 27 107 0 0 0 0 0 0 0 0 40 182 35 41 118 252 144 79 94 31 128 26 169 129 98 79 185 77 204 158 170 99 105 83 166 57 204 35 71 231 68 17 161 7 0 0 0 0 0 0 0 1 40 182 35 41 118 252 144 79 94 31 128 26 169 129 98 79 185 77 204 158 170 99 105 83 166 57 204 35 71 231 68 17 161 7 0 0 0 0 0 0 0 0 112 19 121 68 172 165 141 93 53 202 225 143 125 21 127 168 150 223 142 78 163 244 135 194 197 17 161 238 159 225 207 232 231 141 188 186 185 170 238 141 145 164 234 7 144 31 97 144 227 0 100 164 181 137 33 28 59 136 10 218 56 168 254 166 106 145 203 39 49 163 15 174 143 31 5 178 130 153 84 87 87 61 221 163 29 252 65 53 122 68 235 160 127 229 67 219 215 172 22 9 124 37 73 237 104 38 0 0 0 0 0 0 0 1 112 19 121 68 172 165 141 93 53 202 225 143 125 21 127 168 150 223 142 78 163 244 135 194 197 17 161 238 159 225 207 232 231 141 188 186 185 170 238 141 145 164 234 7 144 31 97 144 227 0 100 164 181 137 33 28 59 136 10 218 56 168 254 166 106 145 203 39 49 163 15 174 143 31 5 178 130 153 84 87 87 61 221 163 29 252 65 53 122 68 235 160 127 229 67 219 215 172 22 9 124 37 73 237 104 38 0 0 0 0 0 0 0 0 72 131 157 197 45 185 223 236 53 246 15 184 5 182 184 23 147 3 15 46 179 218 118 209 114 37 235 220 187 201 154 47 207 166 122 35 26 91 3 127 154 179 249 232 233 237 129 34 68 202 138 161 0 13 77 112 252 203 92 187 188 230 39 55 132 247 0 0 0 0 0 0 0 1 72 131 157 197 45 185 223 236 53 246 15 184 5 182 184 23 147 3 15 46 179 218 118 209 114 37 235 220 187 201 154 47 207 166 122 35 26 91 3 127 154 179 249 232 233 237 129 34 68 202 138 161 0 13 77 112 252 203 92 187 188 230 39 55 132 247 0 0 0 0 0 0 0 0 128 215 194 0 199 219 223 102 242 204 248 124 17 112 73 119 161 49 131 84 207 207 67 43 12 67 150 210 126 148 3 13 241 16 225 134 108 33 87 2 157 76 211 58 133 210 144 225 220 56 131 147 199 231 84 32 218 43 221 252 165 30 119 252 165 229 211 167 197 150 182 197 108 234 8 252 127 239 35 237 26 80 187 183 139 105 103 168 55 42 221 202 112 37 234 50 199 248 234 249 61 133 62 20 172 135 114 63 241 161 127 1 136 155 71 88 83 222 156 240 240 1 0 0 0 0 0 0 0 1 128 215 194 0 199 219 223 102 242 204 248 124 17 112 73 119 161 49 131 84 207 207 67 43 12 67 150 210 126 148 3 13 241 16 225 134 108 33 87 2 157 76 211 58 133 210 144 225 220 56 131 147 199 231 84 32 218 43 221 252 165 30 119 252 165 229 211 167 197 150 182 197 108 234 8 252 127 239 35 237 26 80 187 183 139 105 103 168 55 42 221 202 112 37 234 50 199 248 234 249 61 133 62 20 172 135 114 63 241 161 127 1 136 155 71 88 83 222 156 240 240 1 0 0 0 0 0 0 0 0 96 77 228 31 76 241 138 249 4 98 9 115 184 112 82 183 229 236 138 162 82 102 251 28 188 12 113 181 158 79 211 194 251 196 166 73 83 83 80 42 120 93 243 152 162 232 39 205 85 189 126 54 242 156 193 86 191 44 44 252 55 14 21 27 116 194 191 250 7 74 203 105 99 89 106 178 14 2 236 178 68 170 192 252 120 41 130 72 87 206 11 0 0 0 0 0 0 1 96 77 228 31 76 241 138 249 4 98 9 115 184 112 82 183 229 236 138 162 82 102 251 28 188 12 113 181 158 79 211 194 251 196 166 73 83 83 80 42 120 93 243 152 162 232 39 205 85 189 126 54 242 156 193 86 191 44 44 252 55 14 21 27 116 194 191 250 7 74 203 105 99 89 106 178 14 2 236 178 68 170 192 252 120 41 130 72 87 206 11 0 0 0 0 0 0 0 56 134 225 44 69 119 64 234 84 89 109 244 85 126 103 94 170 253 103 245 228 230 48 38 166 108 164 43 22 74 31 25 224 196 60 126 145 211 177 41 97 248 197 232 65 242 142 255 87 64 104 166 218 221 0 0 0 1 56 134 225 44 69 119 64 234 84 89 109 244 85 126 103 94 170 253 103 245 228 230 48 38 166 108 164 43 22 74 31 25 224 196 60 126 145 211 177 41 97 248 197 232 65 242 142 255 87 64 104 166 218 221 0 0 0 0 120 229 172 191 36 121 40 254 104 25 228 24 190 128 20 169 193 240 145 60 136 35 241 68 254 62 193 45 112 102 236 245 29 64 94 62 47 36 42 252 13 28 27 219 9 245 94 181 136 19 177 1 212 5 30 243 157 117 94 95 128 151 156 4 203 11 190 27 0 62 198 137 167 143 73 204 232 2 248 129 253 159 82 186 78 87 59 101 197 100 160 249 30 152 93 125 199 107 24 125 64 176 236 44 0 171 123 140 55 132 181 2 66 228 115 0 0 0 0 0 0 1 120 229 172 191 36 121 40 254 104 25 228 24 190 128 20 169 193 240 145 60 136 35 241 68 254 62 193 45 112 102 236 245 29 64 94 62 47 36 42 252 13 28 27 219 9 245 94 181 136 19 177 1 212 5 30 243 157 117 94 95 128 151 156 4 203 11 190 27 0 62 198 137 167 143 73 204 232 2 248 129 253 159 82 186 78 87 59 101 197 100 160 249 30 152 93 125 199 107 24 125 64 176 236 44 0 171 123 140 55 132 181 2 66 228 115 0 0 0 0 0 0 0 56 242 178 209 149 127 105 215 100 20 77 91 129 188 44 67 89 61 245 2 145 100 176 98 45 200 226 215 226 171 178 81 56 196 210 25 211 24 236 80 114 182 153 187 70 254 227 193 36 163 1 237 117 87 122 2 0 1 56 242 178 209 149 127 105 215 100 20 77 91 129 188 44 67 89 61 245 2 145 100 176 98 45 200 226 215 226 171 178 81 56 196 210 25 211 24 236 80 114 182 153 187 70 254 227 193 36 163 1 237 117 87 122 2 0 0 128 134 51 146 212 174 146 101 32 54 80 14 156 174 236 212 195 81 90 58 116 149 201 205 7 130 14 255 190 241 205 207 249 221 121 67 167 233 3 91 49 79 77 255 115 246 112 74 5 197 106 119 29 238 202 62 53 27 223 236 152 234 237 36 19 234 248 83 103 87 80 106 110 27 202 134 182 123 143 10 59 147 105 206 20 112 193 190 220 192 38 172 241 167 90 129 71 185 246 137 86 12 195 102 17 186 107 173 97 103 140 196 114 119 155 196 217 44 13 55 170 195 147 93 0 0 0 0 0 1 128 134 51 146 212 174 146 101 32 54 80 14 156 174 236 212 195 81 90 58 116 149 201 205 7 130 14 255 190 241 205 207 249 221 121 67 167 233 3 91 49 79 77 255 115 246 112 74 5 197 106 119 29 238 202 62 53 27 223 236 152 234 237 36 19 234 248 83 103 87 80 106 110 27 202 134 182 123 143 10 59 147 105 206 20 112 193 190 220 192 38 172 241 167 90 129 71 185 246 137 86 12 195 102 17 186 107 173 97 103 140 196 114 119 155 196 217 44 13 55 170 195 147 93 0 0 0 0 0 0 80 252 151 248 45 49 178 79 128 161 10 102 252 132 63 0 196 234 37 213 196 19 233 200 48 79 135 72 224 67 120 56 21 130 243 118 44 119 71 20 190 181 163 216 126 133 133 98 134 74 16 85 129 28 141 49 184 195 10 187 170 152 61 100 174 129 141 139 49 17 137 166 184 197 148 14 0 0 0 0 0 1 80 252 151 248 45 49 178 79 128 161 10 102 252 132 63 0 196 234 37 213 196 19 233 200 48 79 135 72 224 67 120 56 21 130 243 118 44 119 71 20 190 181 163 216 126 133 133 98 134 74 16 85 129 28 141 49 184 195 10 187 170 152 61 100 174 129 141 139 49 17 137 166 184 197 148 14 0 0 0 0 0 0 72 201 189 132 146 184 73 235 58 191 160 218 55 99 221 69 240 85 82 95 206 66 232 212 65 234 63 77 180 226 245 185 90 39 91 117 118 212 95 63 202 231 49 115 110 103 125 28 251 84 217 64 21 37 74 176 91 16 243 99 51 19 229 146 28 76 167 138 98 3 86 2 0 1 72 201 189 132 146 184 73 235 58 191 160 218 55 99 221 69 240 85 82 95 206 66 232 212 65 234 63 77 180 226 245 185 90 39 91 117 118 212 95 63 202 231 49 115 110 103 125 28 251 84 217 64 21 37 74 176 91 16 243 99 51 19 229 146 28 76 167 138 98 3 86 2 0 0 24 4 127 113 119 170 147 209 114 124 184 151 70 216 77 57 33 8 170 193 201 10 0 0 0 1 24 4 127 113 119 170 147 209 114 124 184 151 70 216 77 57 33 8 170 193 201 10 0 0 0 0 24 221 119 146 70 38 139 89 31 158 39 212 71 222 63 236 44 183 75 0 0 0 0 0 0 1 24 221 119 146 70 38 139 89 31 158 39 212 71 222 63 236 44 183 75 0 0 0 0 0 0 0 104 15 190 40 142 118 234 227 167 165 244 200 26 49 57 37 9 217 227 141 192 139 18 100 130 160 53 103 125 170 120 113 53 121 232 23 248 218 111 12 114 85 152 168 69 138 153 228 55 175 99 6 29 234 191 118 238 18 250 139 127 248 148 96 36 236 164 252 127 71 230 13 95 200 86 106 201 201 168 74 148 207 42 56 34 173 114 89 220 58 197 209 56 194 93 253 36 57 2 0 0 0 0 0 0 1 104 15 190 40 142 118 234 227 167 165 244 200 26 49 57 37 9 217 227 141 192 139 18 100 130 160 53 103 125 170 120 113 53 121 232 23 248 218 111 12 114 85 152 168 69 138 153 228 55 175 99 6 29 234 191 118 238 18 250 139 127 248 148 96 36 236 164 252 127 71 230 13 95 200 86 106 201 201 168 74 148 207 42 56 34 173 114 89 220 58 197 209 56 194 93 253 36 57 2 0 0 0 0 0 0 0 24 241 138 87 82 7 150 25 154 252 91 216 29 106 84 123 71 145 238 230 5 0 0 0 0 1 24 241 138 87 82 7 150 25 154 252 91 216 29 106 84 123 71 145 238 230 5 0 0 0 0 0 32 151 63 193 99 4 229 248 206 122 164 94 141 132 110 0 199 239 244 9 150 62 180 68 138 132 112 26 31 217 46 0 0 1 32 151 63 193 99 4 229 248 206 122 164 94 141 132 110 0 199 239 244 9 150 62 180 68 138 132 112 26 31 217 46 0 0 0 40 151 219 5 222 229 79 21 136 176 12 133 59 166 175 203 218 102 58 176 141 26 127 152 21 81 49 214 17 132 22 14 243 177 3 0 0 0 0 0 0 1 40 151 219 5 222 229 79 21 136 176 12 133 59 166 175 203 218 102 58 176 141 26 127 152 21 81 49 214 17 132 22 14 243 177 3 0 0 0 0 0 0 0 104 6 168 179 178 70 132 236 140 85 20 22 237 179 132 40 18 248 209 250 75 115 245 45 67 206 107 231 237 102 198 61 0 53 181 149 233 167 119 49 80 107 58 194 191 82 80 182 33 90 50 185 65 82 236 47 123 143 42 21 75 76 220 97 26 140 95 213 177 133 178 200 249 254 187 252 127 168 64 33 103 133 36 183 203 53 160 28 249 121 153 43 163 187 30 115 14 218 222 176 173 69 117 99 12 1 104 6 168 179 178 70 132 236 140 85 20 22 237 179 132 40 18 248 209 250 75 115 245 45 67 206 107 231 237 102 198 61 0 53 181 149 233 167 119 49 80 107 58 194 191 82 80 182 33 90 50 185 65 82 236 47 123 143 42 21 75 76 220 97 26 140 95 213 177 133 178 200 249 254 187 252 127 168 64 33 103 133 36 183 203 53 160 28 249 121 153 43 163 187 30 115 14 218 222 176 173 69 117 99 12 0 112 2 212 34 173 196 82 79 56 112 170 220 63 200 109 239 119 47 163 110 174 76 171 32 84 196 96 74 147 73 116 212 7 81 2 123 170 250 193 70 154 132 132 185 57 39 161 95 139 69 234 233 243 142 195 223 169 214 193 142 130 202 53 250 215 1 232 72 89 42 138 164 214 96 81 207 117 204 208 64 159 221 205 19 127 120 90 20 23 72 45 155 78 40 43 86 112 83 186 201 240 77 86 191 92 249 160 247 61 0 0 0 0 1 112 2 212 34 173 196 82 79 56 112 170 220 63 200 109 239 119 47 163 110 174 76 171 32 84 196 96 74 147 73 116 212 7 81 2 123 170 250 193 70 154 132 132 185 57 39 161 95 139 69 234 233 243 142 195 223 169 214 193 142 130 202 53 250 215 1 232 72 89 42 138 164 214 96 81 207 117 204 208 64 159 221 205 19 127 120 90 20 23 72 45 155 78 40 43 86 112 83 186 201 240 77 86 191 92 249 160 247 61 0 0 0 0 0 128 102 251 156 92 43 108 29 62 40 215 42 15 198 118 248 50 157 25 129 219 206 70 124 249 193 82 122 51 209 211 166 198 129 204 78 210 123 124 106 191 69 198 115 9 187 105 170 16 189 25 66 30 61 214 177 166 27 0 66 226 174 106 52 23 197 236 68 43 88 169 245 109 62 252 144 219 129 154 127 116 74 210 197 53 171 56 209 150 200 215 71 80 187 84 179 235 71 14 27 0 159 145 132 91 170 69 4 77 60 185 156 0 93 72 67 68 185 235 189 29 178 144 42 227 35 59 27 0 1 128 102 251 156 92 43 108 29 62 40 215 42 15 198 118 248 50 157 25 129 219 206 70 124 249 193 82 122 51 209 211 166 198 129 204 78 210 123 124 106 191 69 198 115 9 187 105 170 16 189 25 66 30 61 214 177 166 27 0 66 226 174 106 52 23 197 236 68 43 88 169 245 109 62 252 144 219 129 154 127 116 74 210 197 53 171 56 209 150 200 215 71 80 187 84 179 235 71 14 27 0 159 145 132 91 170 69 4 77 60 185 156 0 93 72 67 68 185 235 189 29 178 144 42 227 35 59 27 0 0 40 22 179 130 104 210 45 171 95 5 140 87 49 187 173 206 147 141 26 50 138 30 228 117 173 59 57 138 187 138 30 79 102 10 0 0 0 0 0 0 0 1 40 22 179 130 104 210 45 171 95 5 140 87 49 187 173 206 147 141 26 50 138 30 228 117 173 59 57 138 187 138 30 79 102 10 0 0 0 0 0 0 0 0 48 245 222 165 23 160 186 7 2 211 238 67 132 133 157 254 89 199 178 45 73 151 206 197 254 6 172 31 88 199 204 161 72 65 160 25 246 142 223 123 52 172 12 6 0 0 0 0 0 1 48 245 222 165 23 160 186 7 2 211 238 67 132 133 157 254 89 199 178 45 73 151 206 197 254 6 172 31 88 199 204 161 72 65 160 25 246 142 223 123 52 172 12 6 0 0 0 0 0 0 112 222 47 68 13 28 124 145 191 235 84 137 87 165 230 34 132 42 90 242 140 248 118 51 137 4 68 91 156 194 220 89 46 217 200 72 50 124 24 209 194 179 150 236 12 223 90 150 72 220 112 234 137 123 179 108 65 16 250 73 68 13 219 174 119 68 216 117 5 143 105 238 147 162 128 99 201 30 204 31 130 46 147 73 191 185 192 73 212 83 18 90 106 146 126 18 59 63 194 86 25 42 52 82 92 6 0 0 0 0 0 0 0 1 112 222 47 68 13 28 124 145 191 235 84 137 87 165 230 34 132 42 90 242 140 248 118 51 137 4 68 91 156 194 220 89 46 217 200 72 50 124 24 209 194 179 150 236 12 223 90 150 72 220 112 234 137 123 179 108 65 16 250 73 68 13 219 174 119 68 216 117 5 143 105 238 147 162 128 99 201 30 204 31 130 46 147 73 191 185 192 73 212 83 18 90 106 146 126 18 59 63 194 86 25 42 52 82 92 6 0 0 0 0 0 0 0 0 40 74 204 182 19 172 57 74 106 161 11 250 172 174 63 33 117 146 108 133 108 20 20 28 215 14 216 35 120 250 72 181 31 75 237 185 64 125 38 30 0 1 40 74 204 182 19 172 57 74 106 161 11 250 172 174 63 33 117 146 108 133 108 20 20 28 215 14 216 35 120 250 72 181 31 75 237 185 64 125 38 30 0 0 32 39 90 158 132 213 173 24 145 199 200 240 251 85 122 152 148 224 56 26 234 37 58 180 82 137 37 60 8 144 85 118 5 1 32 39 90 158 132 213 173 24 145 199 200 240 251 85 122 152 148 224 56 26 234 37 58 180 82 137 37 60 8 144 85 118 5 0 8 138 84 0 0 0 0 0 0 1 8 138 84 0 0 0 0 0 0 0 120 6 116 242 108 248 14 140 127 243 249 231 147 68 151 120 38 231 8 34 6 106 4 211 91 3 66 139 242 76 75 130 178 43 63 174 27 78 5 184 165 84 187 23 158 140 41 71 59 22 178 59 239 6 145 6 103 216 172 37 75 231 145 41 56 213 208 27 181 52 16 183 237 193 209 238 106 47 104 214 15 82 217 35 168 104 64 76 104 111 95 151 127 241 27 86 63 95 186 251 237 14 164 119 230 211 234 83 245 143 10 244 120 135 32 125 144 92 8 189 0 1 120 6 116 242 108 248 14 140 127 243 249 231 147 68 151 120 38 231 8 34 6 106 4 211 91 3 66 139 242 76 75 130 178 43 63 174 27 78 5 184 165 84 187 23 158 140 41 71 59 22 178 59 239 6 145 6 103 216 172 37 75 231 145 41 56 213 208 27 181 52 16 183 237 193 209 238 106 47 104 214 15 82 217 35 168 104 64 76 104 111 95 151 127 241 27 86 63 95 186 251 237 14 164 119 230 211 234 83 245 143 10 244 120 135 32 125 144 92 8 189 0 0 32 169 164 216 5 23 138 199 97 227 119 26 63 15 87 131 107 175 132 108 223 46 17 101 176 195 214 100 232 0 0 0 0 1 32 169 164 216 5 23 138 199 97 227 119 26 63 15 87 131 107 175 132 108 223 46 17 101 176 195 214 100 232 0 0 0 0 0 48 8 170 244 92 198 184 32 64 24 118 241 85 66 189 103 28 33 244 60 230 74 7 243 100 2 1 93 74 149 165 150 65 102 220 228 186 83 101 123 141 123 109 182 122 105 0 0 0 1 48 8 170 244 92 198 184 32 64 24 118 241 85 66 189 103 28 33 244 60 230 74 7 243 100 2 1 93 74 149 165 150 65 102 220 228 186 83 101 123 141 123 109 182 122 105 0 0 0 0 120 12 158 20 122 77 167 176 86 158 51 230 99 136 241 101 17 244 121 59 87 103 26 111 205 53 244 235 242 229 169 15 224 95 241 248 47 71 217 197 177 238 46 133 175 43 178 246 61 15 216 239 68 140 164 169 9 17 109 185 231 2 170 188 140 250 123 194 232 88 232 26 60 214 152 106 181 39 234 136 137 58 62 209 190 251 104 89 19 70 178 56 124 109 18 185 167 142 60 123 228 26 54 187 187 148 203 130 114 248 49 111 198 191 107 86 222 3 0 0 0 1 120 12 158 20 122 77 167 176 86 158 51 230 99 136 241 101 17 244 121 59 87 103 26 111 205 53 244 235 242 229 169 15 224 95 241 248 47 71 217 197 177 238 46 133 175 43 178 246 61 15 216 239 68 140 164 169 9 17 109 185 231 2 170 188 140 250 123 194 232 88 232 26 60 214 152 106 181 39 234 136 137 58 62 209 190 251 104 89 19 70 178 56 124 109 18 185 167 142 60 123 228 26 54 187 187 148 203 130 114 248 49 111 198 191 107 86 222 3 0 0 0 0 32 105 179 233 126 169 174 183 251 227 117 195 127 211 122 235 34 108 161 29 184 19 156 152 225 139 6 0 0 0 0 0 0 1 32 105 179 233 126 169 174 183 251 227 117 195 127 211 122 235 34 108 161 29 184 19 156 152 225 139 6 0 0 0 0 0 0 0 112 107 214 160 47 12 148 181 229 136 85 57 117 58 49 175 91 20 92 201 244 247 222 130 215 158 98 242 146 190 210 201 180 77 219 243 130 159 138 227 73 54 255 186 170 144 106 170 66 197 143 127 162 210 122 37 99 171 90 242 115 145 250 57 97 176 167 16 225 132 49 247 59 22 25 236 36 64 252 125 139 145 215 22 92 228 240 79 244 183 178 12 93 194 169 217 159 169 69 179 171 96 5 35 137 33 198 85 237 12 0 0 0 1 112 107 214 160 47 12 148 181 229 136 85 57 117 58 49 175 91 20 92 201 244 247 222 130 215 158 98 242 146 190 210 201 180 77 219 243 130 159 138 227 73 54 255 186 170 144 106 170 66 197 143 127 162 210 122 37 99 171 90 242 115 145 250 57 97 176 167 16 225 132 49 247 59 22 25 236 36 64 252 125 139 145 215 22 92 228 240 79 244 183 178 12 93 194 169 217 159 169 69 179 171 96 5 35 137 33 198 85 237 12 0 0 0 0 40 151 236 140 234 49 95 40 136 48 181 242 198 107 168 119 133 33 148 222 230 48 187 177 235 54 92 147 200 220 8 9 80 3 0 0 0 0 0 0 0 1 40 151 236 140 234 49 95 40 136 48 181 242 198 107 168 119 133 33 148 222 230 48 187 177 235 54 92 147 200 220 8 9 80 3 0 0 0 0 0 0 0 0 128 86 110 24 37 97 222 163 92 216 221 199 229 79 95 24 16 74 176 194 98 40 169 140 19 1 205 231 70 185 36 255 18 60 202 214 208 120 214 232 112 172 228 176 230 94 127 136 74 11 44 237 249 68 118 244 151 238 132 77 38 186 252 14 206 146 197 57 245 192 244 29 199 74 59 195 148 69 151 165 29 107 182 98 147 191 148 189 200 184 33 221 44 102 236 230 236 155 131 213 212 11 163 71 97 118 61 218 110 71 189 129 17 181 221 250 137 80 48 231 83 123 104 6 0 0 0 0 0 1 128 86 110 24 37 97 222 163 92 216 221 199 229 79 95 24 16 74 176 194 98 40 169 140 19 1 205 231 70 185 36 255 18 60 202 214 208 120 214 232 112 172 228 176 230 94 127 136 74 11 44 237 249 68 118 244 151 238 132 77 38 186 252 14 206 146 197 57 245 192 244 29 199 74 59 195 148 69 151 165 29 107 182 98 147 191 148 189 200 184 33 221 44 102 236 230 236 155 131 213 212 11 163 71 97 118 61 218 110 71 189 129 17 181 221 250 137 80 48 231 83 123 104 6 0 0 0 0 0 0 80 243 176 186 126 186 98 210 179 162 140 92 40 240 184 134 105 0 157 103 36 223 108 115 65 73 109 222 11 169 151 183 215 249 45 86 167 172 26 95 222 130 112 5 193 174 61 230 154 13 242 26 53 125 184 23 119 6 116 85 81 153 220 146 138 224 238 242 57 50 24 89 106 223 20 181 86 96 139 192 0 1 80 243 176 186 126 186 98 210 179 162 140 92 40 240 184 134 105 0 157 103 36 223 108 115 65 73 109 222 11 169 151 183 215 249 45 86 167 172 26 95 222 130 112 5 193 174 61 230 154 13 242 26 53 125 184 23 119 6 116 85 81 153 220 146 138 224 238 242 57 50 24 89 106 223 20 181 86 96 139 192 0 0 104 118 189 65 124 187 124 164 181 40 78 215 14 181 239 248 104 169 212 147 203 95 26 103 54 4 23 49 26 46 240 31 57 71 166 134 221 134 146 219 246 49 7 96 225 138 247 198 120 76 183 208 201 100 120 240 147 60 217 93 237 131 48 5 244 23 233 221 83 229 102 159 120 118 222 134 200 86 131 193 55 124 183 137 148 160 79 166 91 219 240 18 236 83 72 210 216 101 108 113 68 0 0 0 0 1 104 118 189 65 124 187 124 164 181 40 78 215 14 181 239 248 104 169 212 147 203 95 26 103 54 4 23 49 26 46 240 31 57 71 166 134 221 134 146 219 246 49 7 96 225 138 247 198 120 76 183 208 201 100 120 240 147 60 217 93 237 131 48 5 244 23 233 221 83 229 102 159 120 118 222 134 200 86 131 193 55 124 183 137 148 160 79 166 91 219 240 18 236 83 72 210 216 101 108 113 68 0 0 0 0 0 64 6 22 71 2 163 86 17 242 164 39 109 95 160 109 98 241 37 105 112 221 113 19 63 140 96 143 87 147 41 36 27 242 55 158 16 197 226 52 235 172 133 128 179 181 251 150 32 196 95 149 76 252 69 10 230 30 27 76 224 226 22 0 0 0 1 64 6 22 71 2 163 86 17 242 164 39 109 95 160 109 98 241 37 105 112 221 113 19 63 140 96 143 87 147 41 36 27 242 55 158 16 197 226 52 235 172 133 128 179 181 251 150 32 196 95 149 76 252 69 10 230 30 27 76 224 226 22 0 0 0 0 128 30 130 103 205 32 243 152 123 79 104 19 33 177 209 230 129 178 23 223 13 94 146 223 35 144 45 101 240 232 191 92 122 248 142 90 70 70 227 195 145 191 197 239 106 26 240 233 128 67 75 182 93 107 72 57 103 203 190 221 242 163 253 180 159 146 253 103 81 208 252 1 223 226 217 70 222 240 174 35 247 131 232 230 20 50 149 109 33 236 254 14 141 202 198 2 116 168 2 254 234 211 168 142 232 27 76 165 171 140 74 161 29 242 180 17 221 182 28 140 165 153 167 81 47 103 223 10 0 1 128 30 130 103 205 32 243 152 123 79 104 19 33 177 209 230 129 178 23 223 13 94 146 223 35 144 45 101 240 232 191 92 122 248 142 90 70 70 227 195 145 191 197 239 106 26 240 233 128 67 75 182 93 107 72 57 103 203 190 221 242 163 253 180 159 146 253 103 81 208 252 1 223 226 217 70 222 240 174 35 247 131 232 230 20 50 149 109 33 236 254 14 141 202 198 2 116 168 2 254 234 211 168 142 232 27 76 165 171 140 74 161 29 242 180 17 221 182 28 140 165 153 167 81 47 103 223 10 0 0 48 150 89 14 218 228 227 23 162 153 39 113 34 98 183 194 25 93 68 57 205 28 17 6 69 82 191 227 207 100 5 188 188 211 209 220 205 0 146 180 251 104 31 119 91 104 1 0 0 1 48 150 89 14 218 228 227 23 162 153 39 113 34 98 183 194 25 93 68 57 205 28 17 6 69 82 191 227 207 100 5 188 188 211 209 220 205 0 146 180 251 104 31 119 91 104 1 0 0 0 16 3 75 50 16 21 240 211 149 188 0 0 0 0 0 0 0 1 16 3 75 50 16 21 240 211 149 188 0 0 0 0 0 0 0 0 112 9 115 108 68 232 102 178 176 69 243 217 106 209 14 224 172 167 195 216 60 119 98 115 232 110 47 157 119 32 78 224 248 168 59 100 46 75 172 15 39 92 41 128 82 192 201 101 82 196 22 185 109 161 212 23 243 181 215 188 245 6 226 125 224 129 249 88 9 231 215 83 203 0 1 5 225 190 75 41 64 109 105 106 37 227 156 251 13 180 250 104 241 34 187 224 79 84 147 11 127 35 64 121 111 143 12 0 0 0 0 0 0 1 112 9 115 108 68 232 102 178 176 69 243 217 106 209 14 224 172 167 195 216 60 119 98 115 232 110 47 157 119 32 78 224 248 168 59 100 46 75 172 15 39 92 41 128 82 192 201 101 82 196 22 185 109 161 212 23 243 181 215 188 245 6 226 125 224 129 249 88 9 231 215 83 203 0 1 5 225 190 75 41 64 109 105 106 37 227 156 251 13 180 250 104 241 34 187 224 79 84 147 11 127 35 64 121 111 143 12 0 0 0 0 0 0 0 104 240 35 102 147 107 156 95 120 67 253 248 209 46 242 211 131 200 126 89 191 255 206 143 125 130 26 163 12 32 199 40 52 166 9 162 113 48 113 189 72 74 18 54 6 99 229 23 115 221 174 124 195 235 108 45 255 154 244 4 181 164 158 200 138 77 6 47 98 56 178 18 75 69 235 225 139 243 201 174 122 249 136 131 59 94 43 192 187 209 135 159 123 162 213 155 59 184 180 92 174 163 38 0 0 1 104 240 35 102 147 107 156 95 120 67 253 248 209 46 242 211 131 200 126 89 191 255 206 143 125 130 26 163 12 32 199 40 52 166 9 162 113 48 113 189 72 74 18 54 6 99 229 23 115 221 174 124 195 235 108 45 255 154 244 4 181 164 158 200 138 77 6 47 98 56 178 18 75 69 235 225 139 243 201 174 122 249 136 131 59 94 43 192 187 209 135 159 123 162 213 155 59 184 180 92 174 163 38 0 0 0 80 34 44 18 251 194 132 188 93 116 144 0 196 15 253 248 161 78 252 35 178 201 70 179 45 245 2 116 179 119 55 186 117 38 191 38 14 139 33 131 60 35 40 0 31 70 182 70 55 167 178 147 137 65 30 203 93 63 183 214 107 14 138 249 141 189 54 170 164 36 100 151 195 142 247 0 1 0 0 0 0 1 80 34 44 18 251 194 132 188 93 116 144 0 196 15 253 248 161 78 252 35 178 201 70 179 45 245 2 116 179 119 55 186 117 38 191 38 14 139 33 131 60 35 40 0 31 70 182 70 55 167 178 147 137 65 30 203 93 63 183 214 107 14 138 249 141 189 54 170 164 36 100 151 195 142 247 0 1 0 0 0 0 0 80 79 161 242 148 36 174 71 109 70 137 27 172 124 50 231 16 178 199 67 3 78 176 12 53 168 39 253 247 13 21 191 128 38 67 12 15 248 234 73 154 95 171 123 99 52 42 32 229 121 208 121 181 151 154 103 80 7 41 152 206 129 106 69 208 252 39 163 130 241 51 69 244 247 1 5 121 0 0 0 0 1 80 79 161 242 148 36 174 71 109 70 137 27 172 124 50 231 16 178 199 67 3 78 176 12 53 168 39 253 247 13 21 191 128 38 67 12 15 248 234 73 154 95 171 123 99 52 42 32 229 121 208 121 181 151 154 103 80 7 41 152 206 129 106 69 208 252 39 163 130 241 51 69 244 247 1 5 121 0 0 0 0 0 72 100 73 185 231 4 112 172 84 227 126 234 51 137 221 166 192 16 157 41 74 141 121 176 14 135 245 170 38 223 239 224 207 235 164 137 197 183 43 64 0 12 216 240 6 61 23 238 237 201 225 110 75 253 193 88 168 185 218 43 229 167 97 130 102 214 215 134 90 204 214 6 0 1 72 100 73 185 231 4 112 172 84 227 126 234 51 137 221 166 192 16 157 41 74 141 121 176 14 135 245 170 38 223 239 224 207 235 164 137 197 183 43 64 0 12 216 240 6 61 23 238 237 201 225 110 75 253 193 88 168 185 218 43 229 167 97 130 102 214 215 134 90 204 214 6 0 0 96 219 203 221 208 224 159 230 219 11 100 135 13 4 127 208 103 80 48 213 73 245 143 157 122 152 178 240 239 253 126 244 30 239 102 14 87 67 14 70 171 224 149 9 84 107 219 85 124 178 61 180 47 218 225 163 193 116 189 130 11 146 64 142 109 98 176 49 26 100 226 15 127 68 213 132 163 70 52 46 10 247 185 6 76 76 180 190 205 124 250 143 171 106 50 0 0 1 96 219 203 221 208 224 159 230 219 11 100 135 13 4 127 208 103 80 48 213 73 245 143 157 122 152 178 240 239 253 126 244 30 239 102 14 87 67 14 70 171 224 149 9 84 107 219 85 124 178 61 180 47 218 225 163 193 116 189 130 11 146 64 142 109 98 176 49 26 100 226 15 127 68 213 132 163 70 52 46 10 247 185 6 76 76 180 190 205 124 250 143 171 106 50 0 0 0 120 217 116 20 196 181 6 137 250 178 207 36 29 215 183 251 28 156 129 254 149 110 35 250 145 188 199 148 182 206 23 143 174 147 1 195 119 32 158 253 47 241 245 160 161 23 172 143 224 166 48 241 224 180 60 40 55 163 113 65 217 210 254 250 75 125 222 20 146 22 127 207 180 19 232 245 117 4 55 117 208 11 134 81 103 44 211 65 174 30 21 186 123 156 224 41 168 144 253 5 228 247 219 192 43 85 242 13 199 36 248 50 226 239 233 47 12 212 3 0 0 1 120 217 116 20 196 181 6 137 250 178 207 36 29 215 183 251 28 156 129 254 149 110 35 250 145 188 199 148 182 206 23 143 174 147 1 195 119 32 158 253 47 241 245 160 161 23 172 143 224 166 48 241 224 180 60 40 55 163 113 65 217 210 254 250 75 125 222 20 146 22 127 207 180 19 232 245 117 4 55 117 208 11 134 81 103 44 211 65 174 30 21 186 123 156 224 41 168 144 253 5 228 247 219 192 43 85 242 13 199 36 248 50 226 239 233 47 12 212 3 0 0 0 96 94 102 6 123 33 254 222 92 46 211 170 116 91 71 221 6 87 3 144 77 231 38 4 248 202 135 81 159 100 30 21 111 114 225 52 100 98 124 212 26 0 192 179 224 123 152 186 35 198 14 32 169 2 28 91 12 93 226 2 56 176 203 77 155 47 63 21 131 158 27 252 110 108 46 2 205 114 62 224 151 97 97 251 197 34 255 29 36 247 1 0 0 0 0 0 0 1 96 94 102 6 123 33 254 222 92 46 211 170 116 91 71 221 6 87 3 144 77 231 38 4 248 202 135 81 159 100 30 21 111 114 225 52 100 98 124 212 26 0 192 179 224 123 152 186 35 198 14 32 169 2 28 91 12 93 226 2 56 176 203 77 155 47 63 21 131 158 27 252 110 108 46 2 205 114 62 224 151 97 97 251 197 34 255 29 36 247 1 0 0 0 0 0 0 0 40 213 155 45 217 157 63 158 214 179 178 45 31 167 171 88 99 135 205 98 19 102 250 247 155 144 144 184 108 185 216 134 183 188 174 39 244 81 0 0 0 1 40 213 155 45 217 157 63 158 214 179 178 45 31 167 171 88 99 135 205 98 19 102 250 247 155 144 144 184 108 185 216 134 183 188 174 39 244 81 0 0 0 0 88 143 221 144 99 71 55 91 51 132 189 170 46 209 246 137 32 255 61 37 105 68 54 129 75 74 69 209 169 194 207 43 51 79 37 156 64 84 31 147 49 63 100 147 137 157 156 108 126 196 246 233 144 88 124 237 160 146 162 62 111 128 118 225 95 72 29 227 189 100 72 148 6 238 216 74 124 168 129 102 216 225 99 39 71 85 27 125 1 1 88 143 221 144 99 71 55 91 51 132 189 170 46 209 246 137 32 255 61 37 105 68 54 129 75 74 69 209 169 194 207 43 51 79 37 156 64 84 31 147 49 63 100 147 137 157 156 108 126 196 246 233 144 88 124 237 160 146 162 62 111 128 118 225 95 72 29 227 189 100 72 148 6 238 216 74 124 168 129 102 216 225 99 39 71 85 27 125 1 0 104 154 59 8 214 250 135 152 185 224 10 174 79 58 146 203 236 143 30 28 53 247 75 23 46 61 14 153 250 130 43 106 99 3 114 97 134 236 14 79 134 253 241 239 191 59 197 179 112 33 255 64 2 35 190 107 61 57 182 11 43 73 118 122 234 246 107 208 63 148 121 113 255 201 200 66 134 64 61 39 183 76 142 5 123 90 113 163 171 46 238 92 52 235 152 239 73 131 0 0 0 0 0 0 0 1 104 154 59 8 214 250 135 152 185 224 10 174 79 58 146 203 236 143 30 28 53 247 75 23 46 61 14 153 250 130 43 106 99 3 114 97 134 236 14 79 134 253 241 239 191 59 197 179 112 33 255 64 2 35 190 107 61 57 182 11 43 73 118 122 234 246 107 208 63 148 121 113 255 201 200 66 134 64 61 39 183 76 142 5 123 90 113 163 171 46 238 92 52 235 152 239 73 131 0 0 0 0 0 0 0 0 56 1 38 134 41 29 170 88 160 233 145 132 85 205 36 47 50 209 38 92 196 100 126 18 43 149 60 250 154 84 98 23 80 203 61 86 37 43 121 198 250 148 214 237 218 106 31 30 52 22 223 4 0 0 0 0 0 1 56 1 38 134 41 29 170 88 160 233 145 132 85 205 36 47 50 209 38 92 196 100 126 18 43 149 60 250 154 84 98 23 80 203 61 86 37 43 121 198 250 148 214 237 218 106 31 30 52 22 223 4 0 0 0 0 0 0 104 215 110 214 250 112 196 210 135 44 106 41 81 231 208 226 187 180 124 169 6 101 223 131 248 7 59 123 141 245 45 155 111 191 45 243 237 47 248 47 233 222 27 53 116 18 174 176 121 70 241 49 29 54 248 100 119 186 7 84 242 46 154 182 14 231 49 213 37 52 160 79 242 253 165 71 241 87 50 98 158 58 249 163 206 75 138 146 172 232 178 183 137 30 153 204 59 17 0 0 0 0 0 0 0 1 104 215 110 214 250 112 196 210 135 44 106 41 81 231 208 226 187 180 124 169 6 101 223 131 248 7 59 123 141 245 45 155 111 191 45 243 237 47 248 47 233 222 27 53 116 18 174 176 121 70 241 49 29 54 248 100 119 186 7 84 242 46 154 182 14 231 49 213 37 52 160 79 242 253 165 71 241 87 50 98 158 58 249 163 206 75 138 146 172 232 178 183 137 30 153 204 59 17 0 0 0 0 0 0 0 0 72 226 229 244 239 100 207 243 201 63 193 44 114 73 253 9 63 199 34 184 12 34 181 93 167 70 38 119 43 136 85 61 200 200 27 101 128 179 178 146 168 152 45 163 217 123 227 167 40 116 43 26 248 220 216 17 126 35 228 188 102 203 130 134 149 10 8 144 5 253 158 4 186 1 72 226 229 244 239 100 207 243 201 63 193 44 114 73 253 9 63 199 34 184 12 34 181 93 167 70 38 119 43 136 85 61 200 200 27 101 128 179 178 146 168 152 45 163 217 123 227 167 40 116 43 26 248 220 216 17 126 35 228 188 102 203 130 134 149 10 8 144 5 253 158 4 186 0 56 94 1 134 237 212 63 41 32 13 66 189 152 40 150 138 20 124 116 62 140 23 229 83 230 85 61 202 206 29 102 39 28 182 37 173 34 29 120 65 193 196 145 186 204 173 159 132 183 115 0 0 0 0 0 0 0 1 56 94 1 134 237 212 63 41 32 13 66 189 152 40 150 138 20 124 116 62 140 23 229 83 230 85 61 202 206 29 102 39 28 182 37 173 34 29 120 65 193 196 145 186 204 173 159 132 183 115 0 0 0 0 0 0 0 0 32 172 92 233 22 126 43 253 105 39 155 94 185 44 226 60 168 170 203 19 17 108 152 224 242 209 228 43 0 0 0 0 0 1 32 172 92 233 22 126 43 253 105 39 155 94 185 44 226 60 168 170 203 19 17 108 152 224 242 209 228 43 0 0 0 0 0 0 80 76 207 112 0 53 15 20 52 176 51 179 204 201 221 199 215 198 47 180 117 63 178 218 237 224 7 238 83 244 101 132 225 169 14 209 41 140 228 33 125 131 46 213 26 149 30 9 194 107 82 49 220 69 57 63 176 58 107 164 112 122 14 78 212 162 39 156 86 247 229 146 165 114 0 0 0 0 0 0 0 1 80 76 207 112 0 53 15 20 52 176 51 179 204 201 221 199 215 198 47 180 117 63 178 218 237 224 7 238 83 244 101 132 225 169 14 209 41 140 228 33 125 131 46 213 26 149 30 9 194 107 82 49 220 69 57 63 176 58 107 164 112 122 14 78 212 162 39 156 86 247 229 146 165 114 0 0 0 0 0 0 0 0 72 251 218 113 128 106 254 150 82 225 107 92 157 216 88 77 244 99 157 1 98 151 72 130 185 194 141 147 195 242 231 156 213 157 138 94 239 99 178 106 231 226 192 202 146 27 248 176 225 209 153 7 186 7 50 120 183 212 126 50 190 105 134 94 43 155 64 125 6 0 0 0 0 1 72 251 218 113 128 106 254 150 82 225 107 92 157 216 88 77 244 99 157 1 98 151 72 130 185 194 141 147 195 242 231 156 213 157 138 94 239 99 178 106 231 226 192 202 146 27 248 176 225 209 153 7 186 7 50 120 183 212 126 50 190 105 134 94 43 155 64 125 6 0 0 0 0 0 16 209 108 141 185 23 199 10 211 38 178 0 0 0 0 0 0 1 16 209 108 141 185 23 199 10 211 38 178 0 0 0 0 0 0 0 56 154 210 229 202 23 25 195 186 179 6 6 199 170 59 41 215 172 79 12 201 40 201 127 61 38 143 15 80 87 105 227 146 32 219 224 101 136 180 226 214 34 112 110 89 114 34 177 212 74 212 106 6 0 0 0 0 1 56 154 210 229 202 23 25 195 186 179 6 6 199 170 59 41 215 172 79 12 201 40 201 127 61 38 143 15 80 87 105 227 146 32 219 224 101 136 180 226 214 34 112 110 89 114 34 177 212 74 212 106 6 0 0 0 0 0 8 100 135 7 25 201 86 188 2 1 8 100 135 7 25 201 86 188 2 0 48 109 14 55 6 23 219 83 134 16 29 117 179 205 24 254 117 81 245 228 115 29 245 23 120 19 143 171 136 217 234 105 176 54 200 15 132 252 117 219 34 127 228 168 111 203 2 0 0 1 48 109 14 55 6 23 219 83 134 16 29 117 179 205 24 254 117 81 245 228 115 29 245 23 120 19 143 171 136 217 234 105 176 54 200 15 132 252 117 219 34 127 228 168 111 203 2 0 0 0 72 189 190 26 27 18 245 206 184 37 205 141 131 212 0 127 17 122 35 32 152 79 200 69 20 74 161 75 208 251 152 129 241 33 169 49 200 168 98 138 154 1 201 2 137 248 97 109 91 51 92 185 150 229 58 56 137 252 73 190 235 237 144 130 251 152 190 194 0 0 0 0 0 1 72 189 190 26 27 18 245 206 184 37 205 141 131 212 0 127 17 122 35 32 152 79 200 69 20 74 161 75 208 251 152 129 241 33 169 49 200 168 98 138 154 1 201 2 137 248 97 109 91 51 92 185 150 229 58 56 137 252 73 190 235 237 144 130 251 152 190 194 0 0 0 0 0 0 80 207 251 128 22 249 241 160 213 177 156 81 63 226 211 104 180 224 253 194 155 185 4 55 89 47 114 245 7 150 248 180 92 51 125 222 246 36 165 153 246 217 229 236 207 71 52 111 220 127 235 87 138 209 205 186 72 20 6 162 209 199 59 28 143 29 40 129 110 196 31 138 191 210 255 29 45 0 0 0 0 1 80 207 251 128 22 249 241 160 213 177 156 81 63 226 211 104 180 224 253 194 155 185 4 55 89 47 114 245 7 150 248 180 92 51 125 222 246 36 165 153 246 217 229 236 207 71 52 111 220 127 235 87 138 209 205 186 72 20 6 162 209 199 59 28 143 29 40 129 110 196 31 138 191 210 255 29 45 0 0 0 0 0 104 34 105 251 242 196 29 25 191 13 57 197 24 56 214 71 179 84 16 80 235 205 101 211 115 134 253 214 216 165 198 158 63 242 99 11 173 46 16 134 146 11 55 237 102 192 144 220 243 114 208 229 213 0 218 193 226 110 51 184 76 183 51 12 136 3 140 173 50 245 19 16 15 166 7 51 67 86 66 36 164 78 174 152 214 177 106 255 43 110 199 185 127 79 12 140 96 198 60 160 102 0 0 0 0 1 104 34 105 251 242 196 29 25 191 13 57 197 24 56 214 71 179 84 16 80 235 205 101 211 115 134 253 214 216 165 198 158 63 242 99 11 173 46 16 134 146 11 55 237 102 192 144 220 243 114 208 229 213 0 218 193 226 110 51 184 76 183 51 12 136 3 140 173 50 245 19 16 15 166 7 51 67 86 66 36 164 78 174 152 214 177 106 255 43 110 199 185 127 79 12 140 96 198 60 160 102 0 0 0 0 0 48 151 50 240 113 2 240 195 92 196 249 19 127 144 80 105 89 196 158 41 252 36 228 125 87 223 38 175 180 160 171 217 8 107 79 15 49 18 96 89 233 92 36 110 25 144 127 0 0 1 48 151 50 240 113 2 240 195 92 196 249 19 127 144 80 105 89 196 158 41 252 36 228 125 87 223 38 175 180 160 171 217 8 107 79 15 49 18 96 89 233 92 36 110 25 144 127 0 0 0 120 220 111 204 84 44 130 217 213 198 206 117 146 194 10 147 26 202 239 193 244 37 205 135 142 56 32 249 87 168 225 194 69 224 42 44 177 94 77 94 53 91 119 184 126 54 91 178 96 62 34 235 141 251 16 10 187 157 41 198 141 167 60 123 73 194 190 232 21 131 122 95 94 19 80 131 0 80 156 191 71 14 30 148 74 123 179 226 24 229 233 126 54 51 237 55 92 191 74 239 104 108 155 8 161 36 74 77 55 133 160 139 207 243 154 53 85 221 49 167 10 1 120 220 111 204 84 44 130 217 213 198 206 117 146 194 10 147 26 202 239 193 244 37 205 135 142 56 32 249 87 168 225 194 69 224 42 44 177 94 77 94 53 91 119 184 126 54 91 178 96 62 34 235 141 251 16 10 187 157 41 198 141 167 60 123 73 194 190 232 21 131 122 95 94 19 80 131 0 80 156 191 71 14 30 148 74 123 179 226 24 229 233 126 54 51 237 55 92 191 74 239 104 108 155 8 161 36 74 77 55 133 160 139 207 243 154 53 85 221 49 167 10 0 128 66 181 48 69 164 115 164 70 89 243 215 101 175 87 235 67 90 105 180 75 47 179 125 207 87 227 224 42 29 17 96 44 75 24 133 40 113 24 135 93 121 59 20 187 166 95 86 53 166 161 86 99 27 119 194 156 39 207 117 76 162 208 78 38 249 64 104 247 119 216 98 220 191 85 93 88 71 67 153 91 210 137 198 13 84 67 129 197 58 103 183 253 111 51 7 9 158 89 134 12 78 19 173 133 159 221 103 18 198 238 156 111 121 141 61 104 245 244 206 7 118 23 61 26 0 0 0 0 1 128 66 181 48 69 164 115 164 70 89 243 215 101 175 87 235 67 90 105 180 75 47 179 125 207 87 227 224 42 29 17 96 44 75 24 133 40 113 24 135 93 121 59 20 187 166 95 86 53 166 161 86 99 27 119 194 156 39 207 117 76 162 208 78 38 249 64 104 247 119 216 98 220 191 85 93 88 71 67 153 91 210 137 198 13 84 67 129 197 58 103 183 253 111 51 7 9 158 89 134 12 78 19 173 133 159 221 103 18 198 238 156 111 121 141 61 104 245 244 206 7 118 23 61 26 0 0 0 0 0 24 53 158 199 70 207 47 204 168 124 200 230 150 58 31 240 105 24 0 0 0 0 0 0 0 1 24 53 158 199 70 207 47 204 168 124 200 230 150 58 31 240 105 24 0 0 0 0 0 0 0 0 24 44 216 57 222 28 184 85 185 207 83 175 57 221 190 218 247 150 5 9 117 0 0 0 0 1 24 44 216 57 222 28 184 85 185 207 83 175 57 221 190 218 247 150 5 9 117 0 0 0 0 0 80 175 96 135 121 157 156 226 243 56 243 161 244 255 180 122 46 138 241 238 214 239 108 19 34 52 247 13 21 71 51 38 3 155 181 28 151 11 194 1 127 89 168 237 141 215 157 75 68 132 79 117 113 7 76 199 243 237 109 44 236 225 116 106 60 77 216 199 25 21 97 116 178 189 0 0 0 0 0 0 0 1 80 175 96 135 121 157 156 226 243 56 243 161 244 255 180 122 46 138 241 238 214 239 108 19 34 52 247 13 21 71 51 38 3 155 181 28 151 11 194 1 127 89 168 237 141 215 157 75 68 132 79 117 113 7 76 199 243 237 109 44 236 225 116 106 60 77 216 199 25 21 97 116 178 189 0 0 0 0 0 0 0 0 56 202 229 137 148 154 5 233 137 136 40 13 16 169 117 12 152 29 203 90 68 73 225 131 236 45 230 124 112 148 9 55 131 227 132 115 213 238 10 238 61 255 35 176 204 139 43 31 180 151 38 28 0 0 0 0 0 1 56 202 229 137 148 154 5 233 137 136 40 13 16 169 117 12 152 29 203 90 68 73 225 131 236 45 230 124 112 148 9 55 131 227 132 115 213 238 10 238 61 255 35 176 204 139 43 31 180 151 38 28 0 0 0 0 0 0 64 235 98 102 1 125 196 43 138 213 140 187 232 56 154 133 53 67 83 164 240 80 16 61 51 160 252 62 34 180 200 255 184 169 84 36 69 72 6 78 7 150 152 1 13 250 97 34 132 97 157 173 219 115 157 86 128 104 9 243 111 0 0 0 0 1 64 235 98 102 1 125 196 43 138 213 140 187 232 56 154 133 53 67 83 164 240 80 16 61 51 160 252 62 34 180 200 255 184 169 84 36 69 72 6 78 7 150 152 1 13 250 97 34 132 97 157 173 219 115 157 86 128 104 9 243 111 0 0 0 0 0 56 110 238 199 119 170 141 33 211 193 225 211 65 71 230 113 169 249 100 145 146 90 130 63 193 239 121 202 133 82 133 133 53 185 111 84 99 172 253 212 36 243 170 231 244 134 94 195 226 84 11 0 0 0 0 0 0 1 56 110 238 199 119 170 141 33 211 193 225 211 65 71 230 113 169 249 100 145 146 90 130 63 193 239 121 202 133 82 133 133 53 185 111 84 99 172 253 212 36 243 170 231 244 134 94 195 226 84 11 0 0 0 0 0 0 0 8 106 26 0 0 0 0 0 0 1 8 106 26 0 0 0 0 0 0 0 96 55 152 73 157 134 83 107 104 157 196 53 164 2 160 29 214 41 144 154 185 26 161 178 109 113 19 105 96 157 167 54 34 103 42 200 114 164 164 104 227 67 103 2 210 8 116 188 135 174 40 62 91 190 166 226 195 250 41 221 152 30 57 61 233 241 101 130 10 63 191 169 19 148 16 188 139 65 132 105 232 99 49 96 137 153 204 114 212 66 194 182 129 146 0 0 0 1 96 55 152 73 157 134 83 107 104 157 196 53 164 2 160 29 214 41 144 154 185 26 161 178 109 113 19 105 96 157 167 54 34 103 42 200 114 164 164 104 227 67 103 2 210 8 116 188 135 174 40 62 91 190 166 226 195 250 41 221 152 30 57 61 233 241 101 130 10 63 191 169 19 148 16 188 139 65 132 105 232 99 49 96 137 153 204 114 212 66 194 182 129 146 0 0 0 0 48 215 234 168 32 222 91 186 69 25 72 240 30 59 198 171 46 112 186 148 235 6 205 150 234 108 20 173 83 144 129 239 167 253 152 161 53 229 15 251 248 211 51 238 4 0 0 0 0 1 48 215 234 168 32 222 91 186 69 25 72 240 30 59 198 171 46 112 186 148 235 6 205 150 234 108 20 173 83 144 129 239 167 253 152 161 53 229 15 251 248 211 51 238 4 0 0 0 0 0 56 189 135 39 96 175 218 106 164 199 43 5 248 111 65 179 200 109 31 254 255 126 80 190 92 65 237 178 43 23 153 58 10 9 97 226 246 198 243 117 174 24 218 33 231 128 164 157 128 151 190 0 0 0 0 0 0 1 56 189 135 39 96 175 218 106 164 199 43 5 248 111 65 179 200 109 31 254 255 126 80 190 92 65 237 178 43 23 153 58 10 9 97 226 246 198 243 117 174 24 218 33 231 128 164 157 128 151 190 0 0 0 0 0 0 0 24 239 56 183 78 45 154 165 142 40 239 207 3 167 77 151 86 239 3 11 209 79 0 0 0 1 24 239 56 183 78 45 154 165 142 40 239 207 3 167 77 151 86 239 3 11 209 79 0 0 0 0 120 130 184 128 68 207 249 83 80 33 163 142 32 202 202 145 151 232 83 195 182 58 116 163 243 175 189 47 35 208 19 5 175 59 26 2 94 105 183 66 152 203 200 32 2 26 199 8 181 211 38 92 194 207 149 100 136 89 145 224 231 176 230 123 222 97 24 81 114 242 42 179 218 87 154 251 235 53 36 114 72 81 186 89 13 87 192 22 111 97 8 245 31 80 244 208 101 196 210 93 76 175 182 133 13 74 7 144 34 186 229 253 42 25 120 196 253 145 203 34 0 1 120 130 184 128 68 207 249 83 80 33 163 142 32 202 202 145 151 232 83 195 182 58 116 163 243 175 189 47 35 208 19 5 175 59 26 2 94 105 183 66 152 203 200 32 2 26 199 8 181 211 38 92 194 207 149 100 136 89 145 224 231 176 230 123 222 97 24 81 114 242 42 179 218 87 154 251 235 53 36 114 72 81 186 89 13 87 192 22 111 97 8 245 31 80 244 208 101 196 210 93 76 175 182 133 13 74 7 144 34 186 229 253 42 25 120 196 253 145 203 34 0 0 104 177 43 20 0 140 140 47 23 231 84 40 77 91 102 55 158 233 117 153 218 25 252 97 80 128 163 220 227 30 148 92 31 92 123 175 218 18 184 223 122 242 27 52 233 221 142 227 84 175 165 149 51 30 52 3 112 242 251 194 123 45 37 79 48 197 65 154 217 117 129 115 239 202 140 4 219 13 126 27 135 146 152 96 151 82 124 223 118 24 195 194 175 191 121 134 29 81 56 114 151 40 33 0 0 1 104 177 43 20 0 140 140 47 23 231 84 40 77 91 102 55 158 233 117 153 218 25 252 97 80 128 163 220 227 30 148 92 31 92 123 175 218 18 184 223 122 242 27 52 233 221 142 227 84 175 165 149 51 30 52 3 112 242 251 194 123 45 37 79 48 197 65 154 217 117 129 115 239 202 140 4 219 13 126 27 135 146 152 96 151 82 124 223 118 24 195 194 175 191 121 134 29 81 56 114 151 40 33 0 0 0 56 226 202 173 6 149 116 30 177 236 7 160 65 73 122 165 121 36 223 128 217 110 236 2 31 124 183 89 207 252 6 59 84 137 76 50 38 76 184 223 208 6 130 201 233 242 76 37 234 218 223 126 70 103 75 198 17 1 56 226 202 173 6 149 116 30 177 236 7 160 65 73 122 165 121 36 223 128 217 110 236 2 31 124 183 89 207 252 6 59 84 137 76 50 38 76 184 223 208 6 130 201 233 242 76 37 234 218 223 126 70 103 75 198 17 0 40 143 226 94 34 87 62 30 33 239 85 79 57 245 111 192 126 163 234 125 86 103 149 210 150 242 12 158 215 135 158 29 55 151 47 136 29 80 31 37 252 1 40 143 226 94 34 87 62 30 33 239 85 79 57 245 111 192 126 163 234 125 86 103 149 210 150 242 12 158 215 135 158 29 55 151 47 136 29 80 31 37 252 0 112 181 27 23 157 82 76 57 33 149 24 89 155 221 152 127 94 66 164 208 210 148 182 78 234 184 210 234 72 255 16 100 229 47 58 156 105 247 59 66 253 245 169 65 48 79 130 122 51 190 191 81 1 34 200 63 2 65 127 95 41 111 129 132 49 253 173 167 197 104 55 130 14 224 162 119 109 66 142 188 11 186 58 39 173 207 179 212 181 61 158 3 218 40 241 226 184 47 0 88 220 135 180 224 61 164 169 34 189 151 91 0 0 1 112 181 27 23 157 82 76 57 33 149 24 89 155 221 152 127 94 66 164 208 210 148 182 78 234 184 210 234 72 255 16 100 229 47 58 156 105 247 59 66 253 245 169 65 48 79 130 122 51 190 191 81 1 34 200 63 2 65 127 95 41 111 129 132 49 253 173 167 197 104 55 130 14 224 162 119 109 66 142 188 11 186 58 39 173 207 179 212 181 61 158 3 218 40 241 226 184 47 0 88 220 135 180 224 61 164 169 34 189 151 91 0 0 0 72 245 37 28 124 5 215 158 136 244 187 142 156 141 44 84 13 112 140 11 136 159 80 12 232 82 107 30 135 75 126 13 223 106 21 218 151 253 45 223 202 227 61 206 171 121 209 68 8 191 131 100 178 102 54 84 51 65 145 226 154 248 80 115 68 154 209 63 76 0 0 0 0 1 72 245 37 28 124 5 215 158 136 244 187 142 156 141 44 84 13 112 140 11 136 159 80 12 232 82 107 30 135 75 126 13 223 106 21 218 151 253 45 223 202 227 61 206 171 121 209 68 8 191 131 100 178 102 54 84 51 65 145 226 154 248 80 115 68 154 209 63 76 0 0 0 0 0 80 135 137 38 34 14 3 46 79 186 179 131 28 57 25 247 29 19 45 197 193 203 121 109 165 119 101 172 185 115 171 154 177 182 27 155 85 37 5 182 213 87 183 42 234 134 15 60 0 46 192 218 165 41 22 150 148 218 236 133 178 67 163 140 233 134 213 210 71 193 23 166 26 63 204 170 123 79 127 246 26 1 80 135 137 38 34 14 3 46 79 186 179 131 28 57 25 247 29 19 45 197 193 203 121 109 165 119 101 172 185 115 171 154 177 182 27 155 85 37 5 182 213 87 183 42 234 134 15 60 0 46 192 218 165 41 22 150 148 218 236 133 178 67 163 140 233 134 213 210 71 193 23 166 26 63 204 170 123 79 127 246 26 0 24 161 11 98 151 34 241 111 106 193 28 3 100 220 97 185 34 185 14 129 244 209 10 0 0 1 24 161 11 98 151 34 241 111 106 193 28 3 100 220 97 185 34 185 14 129 244 209 10 0 0 0 16 130 229 241 126 185 171 21 95 192 161 17 185 7 19 79 20 1 16 130 229 241 126 185 171 21 95 192 161 17 185 7 19 79 20 0 80 9 13 228 66 211 156 80 135 182 180 214 181 47 183 227 46 41 12 246 131 232 90 158 5 19 60 63 252 117 169 61 164 189 193 27 141 183 254 18 152 59 130 30 176 181 167 165 190 60 186 198 100 145 152 47 75 69 203 253 237 35 74 191 49 205 55 93 241 175 147 35 169 57 234 147 255 216 2 0 0 1 80 9 13 228 66 211 156 80 135 182 180 214 181 47 183 227 46 41 12 246 131 232 90 158 5 19 60 63 252 117 169 61 164 189 193 27 141 183 254 18 152 59 130 30 176 181 167 165 190 60 186 198 100 145 152 47 75 69 203 253 237 35 74 191 49 205 55 93 241 175 147 35 169 57 234 147 255 216 2 0 0 0 64 141 139 202 76 43 47 180 136 161 170 209 0 136 207 136 36 208 145 71 130 83 221 226 101 19 151 187 159 109 224 255 62 88 129 165 22 98 27 176 90 80 16 65 129 69 250 183 187 147 190 130 199 5 11 138 101 83 65 161 2 6 0 0 0 1 64 141 139 202 76 43 47 180 136 161 170 209 0 136 207 136 36 208 145 71 130 83 221 226 101 19 151 187 159 109 224 255 62 88 129 165 22 98 27 176 90 80 16 65 129 69 250 183 187 147 190 130 199 5 11 138 101 83 65 161 2 6 0 0 0 0 40 187 72 171 67 22 57 200 41 156 125 20 118 214 230 17 121 132 100 6 245 170 66 142 117 245 148 173 113 251 22 92 19 155 30 0 0 0 0 0 0 1 40 187 72 171 67 22 57 200 41 156 125 20 118 214 230 17 121 132 100 6 245 170 66 142 117 245 148 173 113 251 22 92 19 155 30 0 0 0 0 0 0 0 48 101 58 72 216 138 4 45 140 222 69 239 13 13 50 235 67 209 36 214 49 165 77 35 96 140 27 164 215 181 180 73 146 42 130 29 96 159 153 232 94 77 175 255 20 0 0 0 0 1 48 101 58 72 216 138 4 45 140 222 69 239 13 13 50 235 67 209 36 214 49 165 77 35 96 140 27 164 215 181 180 73 146 42 130 29 96 159 153 232 94 77 175 255 20 0 0 0 0 0 88 219 224 155 211 221 151 19 144 234 158 11 45 122 35 132 149 62 141 108 208 26 84 49 255 193 206 21 192 119 23 25 107 230 224 23 255 211 84 131 200 163 22 3 191 95 246 22 164 37 9 116 62 212 138 8 160 64 31 218 139 106 242 89 216 218 255 147 91 71 129 205 194 18 209 161 119 85 170 226 225 162 83 212 20 0 0 0 0 1 88 219 224 155 211 221 151 19 144 234 158 11 45 122 35 132 149 62 141 108 208 26 84 49 255 193 206 21 192 119 23 25 107 230 224 23 255 211 84 131 200 163 22 3 191 95 246 22 164 37 9 116 62 212 138 8 160 64 31 218 139 106 242 89 216 218 255 147 91 71 129 205 194 18 209 161 119 85 170 226 225 162 83 212 20 0 0 0 0 0 72 14 156 116 249 212 16 111 35 17 9 212 224 210 14 154 158 72 254 112 138 10 30 123 27 209 114 67 151 154 58 185 70 230 39 91 161 175 96 144 42 108 176 175 129 131 222 206 150 81 39 184 66 31 183 226 159 121 73 128 206 177 92 204 53 155 0 167 103 0 0 0 0 1 72 14 156 116 249 212 16 111 35 17 9 212 224 210 14 154 158 72 254 112 138 10 30 123 27 209 114 67 151 154 58 185 70 230 39 91 161 175 96 144 42 108 176 175 129 131 222 206 150 81 39 184 66 31 183 226 159 121 73 128 206 177 92 204 53 155 0 167 103 0 0 0 0 0 96 24 127 183 77 135 143 95 88 89 95 188 40 117 29 239 121 158 197 98 117 88 96 129 197 2 191 220 182 209 38 73 53 151 197 255 5 2 62 107 10 40 43 253 32 105 98 219 212 155 202 52 7 137 199 16 43 208 83 186 41 89 60 249 93 40 107 182 175 147 127 53 185 207 74 51 82 246 167 59 57 221 250 206 122 32 222 85 116 2 0 0 0 0 0 0 0 1 96 24 127 183 77 135 143 95 88 89 95 188 40 117 29 239 121 158 197 98 117 88 96 129 197 2 191 220 182 209 38 73 53 151 197 255 5 2 62 107 10 40 43 253 32 105 98 219 212 155 202 52 7 137 199 16 43 208 83 186 41 89 60 249 93 40 107 182 175 147 127 53 185 207 74 51 82 246 167 59 57 221 250 206 122 32 222 85 116 2 0 0 0 0 0 0 0 0 96 147 237 31 71 216 196 26 132 246 73 163 25 96 43 245 7 209 8 5 54 169 7 250 78 177 89 40 0 243 40 2 158 24 11 198 234 171 172 170 64 188 187 101 123 162 237 222 202 89 40 19 173 38 211 166 45 226 3 80 235 195 110 200 92 16 163 19 117 163 211 172 5 18 87 238 191 193 83 143 189 110 113 70 107 147 246 94 49 35 15 198 45 0 0 0 0 1 96 147 237 31 71 216 196 26 132 246 73 163 25 96 43 245 7 209 8 5 54 169 7 250 78 177 89 40 0 243 40 2 158 24 11 198 234 171 172 170 64 188 187 101 123 162 237 222 202 89 40 19 173 38 211 166 45 226 3 80 235 195 110 200 92 16 163 19 117 163 211 172 5 18 87 238 191 193 83 143 189 110 113 70 107 147 246 94 49 35 15 198 45 0 0 0 0 0 96 64 61 164 44 87 227 172 18 31 65 156 146 28 18 93 184 64 206 182 188 247 38 246 148 197 40 179 134 87 253 99 200 144 207 105 35 236 191 211 141 2 166 22 69 97 111 181 148 114 108 196 62 4 205 40 5 94 207 78 159 83 52 193 205 124 45 112 37 168 234 114 146 238 213 231 94 67 171 153 42 253 122 194 188 137 165 213 50 253 178 210 172 158 19 49 97 1 96 64 61 164 44 87 227 172 18 31 65 156 146 28 18 93 184 64 206 182 188 247 38 246 148 197 40 179 134 87 253 99 200 144 207 105 35 236 191 211 141 2 166 22 69 97 111 181 148 114 108 196 62 4 205 40 5 94 207 78 159 83 52 193 205 124 45 112 37 168 234 114 146 238 213 231 94 67 171 153 42 253 122 194 188 137 165 213 50 253 178 210 172 158 19 49 97 0 128 18 25 43 69 203 163 208 25 129 70 179 87 12 27 80 85 159 26 23 217 250 145 72 121 50 16 37 139 240 158 153 146 201 8 164 249 47 152 57 202 235 15 58 45 34 201 248 69 113 190 138 170 65 10 208 146 132 110 25 228 113 14 229 109 123 49 220 88 192 96 240 71 116 139 193 10 198 27 240 251 107 253 255 213 42 221 24 113 228 220 232 119 71 248 233 220 92 90 99 190 197 160 163 32 110 191 182 102 164 156 66 22 63 71 173 246 104 8 68 245 41 178 81 182 144 193 28 0 1 128 18 25 43 69 203 163 208 25 129 70 179 87 12 27 80 85 159 26 23 217 250 145 72 121 50 16 37 139 240 158 153 146 201 8 164 249 47 152 57 202 235 15 58 45 34 201 248 69 113 190 138 170 65 10 208 146 132 110 25 228 113 14 229 109 123 49 220 88 192 96 240 71 116 139 193 10 198 27 240 251 107 253 255 213 42 221 24 113 228 220 232 119 71 248 233 220 92 90 99 190 197 160 163 32 110 191 182 102 164 156 66 22 63 71 173 246 104 8 68 245 41 178 81 182 144 193 28 0 0 64 106 111 228 235 51 226 122 218 7 64 133 195 240 189 43 175 243 131 132 104 152 3 70 2 1 203 253 95 8 193 163 40 223 43 68 152 88 4 207 245 179 156 172 179 217 24 72 255 34 91 50 116 117 25 16 159 79 126 0 0 0 0 0 0 1 64 106 111 228 235 51 226 122 218 7 64 133 195 240 189 43 175 243 131 132 104 152 3 70 2 1 203 253 95 8 193 163 40 223 43 68 152 88 4 207 245 179 156 172 179 217 24 72 255 34 91 50 116 117 25 16 159 79 126 0 0 0 0 0 0 0 96 242 78 165 200 211 109 6 120 204 217 25 19 113 152 179 73 130 49 149 173 66 167 106 162 150 87 123 191 217 234 1 44 116 181 9 66 210 127 251 186 48 185 108 188 94 122 96 63 201 235 22 186 67 42 225 10 180 91 176 96 61 82 61 81 28 92 254 57 197 179 147 78 166 147 71 129 176 7 57 241 168 104 58 31 131 207 114 100 228 122 222 33 1 0 0 0 1 96 242 78 165 200 211 109 6 120 204 217 25 19 113 152 179 73 130 49 149 173 66 167 106 162 150 87 123 191 217 234 1 44 116 181 9 66 210 127 251 186 48 185 108 188 94 122 96 63 201 235 22 186 67 42 225 10 180 91 176 96 61 82 61 81 28 92 254 57 197 179 147 78 166 147 71 129 176 7 57 241 168 104 58 31 131 207 114 100 228 122 222 33 1 0 0 0 0 16 97 77 106 250 36 19 39 116 255 76 19 0 0 0 0 0 1 16 97 77 106 250 36 19 39 116 255 76 19 0 0 0 0 0 0 120 111 83 184 168 71 100 200 47 99 200 7 122 64 223 9 88 127 36 176 17 86 69 21 128 134 171 205 233 96 184 231 129 34 199 145 56 105 1 143 43 41 220 152 215 178 124 68 220 20 206 108 104 17 70 117 37 42 80 169 70 134 89 10 29 153 175 13 143 30 175 166 31 179 51 111 40 201 178 167 176 195 238 36 55 237 111 116 105 132 211 219 6 26 164 101 240 113 151 131 108 247 150 189 114 192 163 218 28 145 0 191 98 2 111 27 49 39 0 0 0 1 120 111 83 184 168 71 100 200 47 99 200 7 122 64 223 9 88 127 36 176 17 86 69 21 128 134 171 205 233 96 184 231 129 34 199 145 56 105 1 143 43 41 220 152 215 178 124 68 220 20 206 108 104 17 70 117 37 42 80 169 70 134 89 10 29 153 175 13 143 30 175 166 31 179 51 111 40 201 178 167 176 195 238 36 55 237 111 116 105 132 211 219 6 26 164 101 240 113 151 131 108 247 150 189 114 192 163 218 28 145 0 191 98 2 111 27 49 39 0 0 0 0 32 81 112 148 108 23 32 68 197 136 108 75 125 74 153 138 193 143 46 240 12 147 141 114 195 168 154 52 204 254 27 0 0 1 32 81 112 148 108 23 32 68 197 136 108 75 125 74 153 138 193 143 46 240 12 147 141 114 195 168 154 52 204 254 27 0 0 0 72 229 45 84 95 24 25 32 216 165 111 25 116 164 115 152 232 97 207 181 82 250 83 172 4 143 100 89 243 176 103 143 89 97 174 71 138 98 227 83 33 167 157 210 208 119 156 79 89 223 158 79 207 126 107 230 151 179 67 137 75 82 190 93 51 33 0 0 0 0 0 0 0 1 72 229 45 84 95 24 25 32 216 165 111 25 116 164 115 152 232 97 207 181 82 250 83 172 4 143 100 89 243 176 103 143 89 97 174 71 138 98 227 83 33 167 157 210 208 119 156 79 89 223 158 79 207 126 107 230 151 179 67 137 75 82 190 93 51 33 0 0 0 0 0 0 0 0 120 221 101 250 13 148 219 147 8 203 24 156 18 193 222 45 207 235 157 11 245 111 54 46 193 242 190 64 24 32 5 137 205 125 176 100 17 201 24 239 205 106 167 230 189 153 124 31 64 237 182 168 183 7 51 170 88 147 80 176 116 117 47 23 224 52 179 41 43 139 109 178 28 245 173 29 90 7 170 105 16 115 2 213 39 87 247 94 160 195 0 33 49 96 68 43 87 69 180 255 100 174 99 176 29 24 104 158 236 125 224 97 89 243 65 242 94 178 0 0 0 1 120 221 101 250 13 148 219 147 8 203 24 156 18 193 222 45 207 235 157 11 245 111 54 46 193 242 190 64 24 32 5 137 205 125 176 100 17 201 24 239 205 106 167 230 189 153 124 31 64 237 182 168 183 7 51 170 88 147 80 176 116 117 47 23 224 52 179 41 43 139 109 178 28 245 173 29 90 7 170 105 16 115 2 213 39 87 247 94 160 195 0 33 49 96 68 43 87 69 180 255 100 174 99 176 29 24 104 158 236 125 224 97 89 243 65 242 94 178 0 0 0 0 72 184 253 189 224 206 45 217 58 19 82 204 156 74 148 217 108 38 0 212 209 189 122 237 87 236 106 6 235 35 39 176 243 21 191 101 210 52 159 254 224 228 116 193 110 127 138 238 156 91 101 182 243 43 212 2 192 249 29 46 143 26 92 106 122 73 98 4 82 141 13 112 16 1 72 184 253 189 224 206 45 217 58 19 82 204 156 74 148 217 108 38 0 212 209 189 122 237 87 236 106 6 235 35 39 176 243 21 191 101 210 52 159 254 224 228 116 193 110 127 138 238 156 91 101 182 243 43 212 2 192 249 29 46 143 26 92 106 122 73 98 4 82 141 13 112 16 0 24 141 65 210 229 224 235 23 20 177 164 60 252 191 64 31 44 84 216 95 0 0 0 0 0 1 24 141 65 210 229 224 235 23 20 177 164 60 252 191 64 31 44 84 216 95 0 0 0 0 0 0 72 48 154 41 124 74 158 181 70 130 132 240 230 198 88 167 2 237 114 242 9 139 158 87 188 104 154 110 210 176 38 252 92 77 243 54 213 93 179 111 60 173 65 242 154 5 78 138 79 93 20 212 247 205 148 243 182 244 13 15 150 159 207 103 38 24 0 0 0 0 0 0 0 1 72 48 154 41 124 74 158 181 70 130 132 240 230 198 88 167 2 237 114 242 9 139 158 87 188 104 154 110 210 176 38 252 92 77 243 54 213 93 179 111 60 173 65 242 154 5 78 138 79 93 20 212 247 205 148 243 182 244 13 15 150 159 207 103 38 24 0 0 0 0 0 0 0 0 112 78 251 44 163 60 65 61 73 160 130 160 8 28 61 196 90 12 152 7 115 142 7 114 17 198 170 252 19 236 254 162 201 32 45 18 43 189 44 46 90 207 184 59 237 162 203 126 224 42 136 170 154 0 222 28 154 135 82 229 44 204 68 59 154 17 125 179 36 205 42 28 134 10 215 115 12 32 14 56 173 76 9 183 175 169 7 152 168 55 94 109 58 166 129 180 156 71 14 106 140 11 108 205 121 170 23 0 0 0 0 0 0 1 112 78 251 44 163 60 65 61 73 160 130 160 8 28 61 196 90 12 152 7 115 142 7 114 17 198 170 252 19 236 254 162 201 32 45 18 43 189 44 46 90 207 184 59 237 162 203 126 224 42 136 170 154 0 222 28 154 135 82 229 44 204 68 59 154 17 125 179 36 205 42 28 134 10 215 115 12 32 14 56 173 76 9 183 175 169 7 152 168 55 94 109 58 166 129 180 156 71 14 106 140 11 108 205 121 170 23 0 0 0 0 0 0 0 64 99 133 203 247 192 63 4 144 228 175 21 211 17 186 191 58 203 241 243 89 132 220 36 39 238 217 164 218 253 0 222 143 219 114 227 127 56 66 234 167 126 143 213 130 213 113 84 86 215 204 56 188 57 9 152 64 225 239 108 6 0 0 0 0 1 64 99 133 203 247 192 63 4 144 228 175 21 211 17 186 191 58 203 241 243 89 132 220 36 39 238 217 164 218 253 0 222 143 219 114 227 127 56 66 234 167 126 143 213 130 213 113 84 86 215 204 56 188 57 9 152 64 225 239 108 6 0 0 0 0 0 72 77 228 188 235 97 138 100 91 238 49 139 79 56 188 11 184 173 83 39 221 20 245 96 38 125 60 181 72 3 128 43 118 106 90 15 200 8 233 181 34 5 7 174 190 71 134 170 210 207 164 152 232 51 89 112 82 165 188 21 114 191 123 230 238 197 193 95 140 244 0 0 0 1 72 77 228 188 235 97 138 100 91 238 49 139 79 56 188 11 184 173 83 39 221 20 245 96 38 125 60 181 72 3 128 43 118 106 90 15 200 8 233 181 34 5 7 174 190 71 134 170 210 207 164 152 232 51 89 112 82 165 188 21 114 191 123 230 238 197 193 95 140 244 0 0 0 0 72 200 145 197 200 104 129 137 228 214 164 61 15 232 3 217 235 218 189 116 152 154 227 248 233 253 158 5 97 255 64 215 227 139 23 14 251 106 37 121 16 114 173 198 111 218 117 222 246 94 169 123 172 250 61 68 19 205 181 67 85 17 104 14 254 137 136 84 247 78 166 0 0 1 72 200 145 197 200 104 129 137 228 214 164 61 15 232 3 217 235 218 189 116 152 154 227 248 233 253 158 5 97 255 64 215 227 139 23 14 251 106 37 121 16 114 173 198 111 218 117 222 246 94 169 123 172 250 61 68 19 205 181 67 85 17 104 14 254 137 136 84 247 78 166 0 0 0 128 191 181 108 55 139 94 198 152 77 78 82 43 3 109 236 227 118 234 47 173 167 61 164 86 55 233 192 147 235 37 168 97 183 33 155 177 136 201 235 222 168 48 190 137 110 204 183 228 175 147 199 33 208 144 139 202 91 20 77 67 243 128 152 254 108 127 176 61 57 40 166 158 31 208 193 11 83 26 80 21 170 235 14 210 177 151 96 197 239 137 246 114 65 165 208 148 237 25 245 124 152 104 92 83 194 136 203 136 100 251 64 2 205 220 145 219 198 171 222 38 134 250 16 34 65 224 146 28 1 128 191 181 108 55 139 94 198 152 77 78 82 43 3 109 236 227 118 234 47 173 167 61 164 86 55 233 192 147 235 37 168 97 183 33 155 177 136 201 235 222 168 48 190 137 110 204 183 228 175 147 199 33 208 144 139 202 91 20 77 67 243 128 152 254 108 127 176 61 57 40 166 158 31 208 193 11 83 26 80 21 170 235 14 210 177 151 96 197 239 137 246 114 65 165 208 148 237 25 245 124 152 104 92 83 194 136 203 136 100 251 64 2 205 220 145 219 198 171 222 38 134 250 16 34 65 224 146 28 0 64 63 224 19 125 187 26 164 208 55 163 27 59 187 247 242 95 30 57 122 111 64 134 84 248 151 190 15 136 136 161 61 28 228 22 27 68 11 3 140 252 156 29 4 41 11 48 15 96 244 213 20 233 6 76 130 58 119 15 0 0 0 0 0 0 1 64 63 224 19 125 187 26 164 208 55 163 27 59 187 247 242 95 30 57 122 111 64 134 84 248 151 190 15 136 136 161 61 28 228 22 27 68 11 3 140 252 156 29 4 41 11 48 15 96 244 213 20 233 6 76 130 58 119 15 0 0 0 0 0 0 0 16 199 42 98 80 178 185 90 221 165 35 3 0 0 0 0 0 1 16 199 42 98 80 178 185 90 221 165 35 3 0 0 0 0 0 0 112 211 92 224 84 192 161 220 29 37 84 220 160 179 136 96 15 250 25 26 167 119 216 78 12 23 28 94 80 65 148 105 37 226 205 178 88 179 130 190 233 252 123 197 227 186 157 58 116 47 213 216 8 19 202 72 179 134 248 62 205 139 137 198 65 155 154 205 249 99 56 187 14 119 158 233 203 37 34 208 100 56 19 122 70 223 132 177 96 84 56 150 254 49 2 204 7 119 253 28 226 37 130 47 153 193 3 66 88 188 3 0 0 1 112 211 92 224 84 192 161 220 29 37 84 220 160 179 136 96 15 250 25 26 167 119 216 78 12 23 28 94 80 65 148 105 37 226 205 178 88 179 130 190 233 252 123 197 227 186 157 58 116 47 213 216 8 19 202 72 179 134 248 62 205 139 137 198 65 155 154 205 249 99 56 187 14 119 158 233 203 37 34 208 100 56 19 122 70 223 132 177 96 84 56 150 254 49 2 204 7 119 253 28 226 37 130 47 153 193 3 66 88 188 3 0 0 0 64 140 122 119 39 180 83 252 77 149 191 129 134 12 141 62 96 133 98 170 229 37 197 136 97 68 58 105 144 236 92 39 65 44 221 243 133 48 202 183 51 237 155 98 163 154 52 14 169 35 49 67 177 150 145 49 75 8 0 0 0 0 0 0 0 1 64 140 122 119 39 180 83 252 77 149 191 129 134 12 141 62 96 133 98 170 229 37 197 136 97 68 58 105 144 236 92 39 65 44 221 243 133 48 202 183 51 237 155 98 163 154 52 14 169 35 49 67 177 150 145 49 75 8 0 0 0 0 0 0 0 0 80 9 61 184 172 233 13 43 45 30 119 185 68 107 159 107 243 178 49 80 0 96 120 155 240 156 53 48 213 202 121 253 151 95 14 88 52 193 70 56 174 121 49 216 9 237 188 33 131 0 202 142 97 27 187 215 252 182 119 74 239 189 124 236 151 198 110 105 243 51 188 18 131 2 91 205 73 28 4 0 0 1 80 9 61 184 172 233 13 43 45 30 119 185 68 107 159 107 243 178 49 80 0 96 120 155 240 156 53 48 213 202 121 253 151 95 14 88 52 193 70 56 174 121 49 216 9 237 188 33 131 0 202 142 97 27 187 215 252 182 119 74 239 189 124 236 151 198 110 105 243 51 188 18 131 2 91 205 73 28 4 0 0 0 16 137 77 210 245 248 194 39 160 111 226 179 107 25 44 0 0 1 16 137 77 210 245 248 194 39 160 111 226 179 107 25 44 0 0 0 64 90 160 7 65 4 255 208 168 205 179 4 240 248 31 206 47 175 22 191 41 103 114 135 198 218 147 111 186 210 117 127 71 122 113 161 142 45 56 90 182 5 196 124 208 246 99 179 100 179 27 123 2 247 71 97 127 214 218 135 188 45 50 128 224 1 64 90 160 7 65 4 255 208 168 205 179 4 240 248 31 206 47 175 22 191 41 103 114 135 198 218 147 111 186 210 117 127 71 122 113 161 142 45 56 90 182 5 196 124 208 246 99 179 100 179 27 123 2 247 71 97 127 214 218 135 188 45 50 128 224 0 128 32 154 212 74 8 112 124 62 201 195 129 67 76 87 211 0 54 149 15 2 59 137 176 18 143 114 152 101 173 81 166 31 220 98 29 15 12 143 193 186 10 214 32 46 186 56 227 96 71 41 12 224 186 32 190 104 219 81 226 245 30 187 162 67 12 238 66 40 214 182 170 73 67 29 245 229 231 140 16 172 204 90 196 85 159 37 247 5 72 91 26 80 132 221 105 222 230 137 161 192 217 213 175 8 134 107 130 255 104 27 119 215 213 254 251 29 13 165 7 158 123 144 75 0 0 0 0 0 1 128 32 154 212 74 8 112 124 62 201 195 129 67 76 87 211 0 54 149 15 2 59 137 176 18 143 114 152 101 173 81 166 31 220 98 29 15 12 143 193 186 10 214 32 46 186 56 227 96 71 41 12 224 186 32 190 104 219 81 226 245 30 187 162 67 12 238 66 40 214 182 170 73 67 29 245 229 231 140 16 172 204 90 196 85 159 37 247 5 72 91 26 80 132 221 105 222 230 137 161 192 217 213 175 8 134 107 130 255 104 27 119 215 213 254 251 29 13 165 7 158 123 144 75 0 0 0 0 0 0 128 239 164 224 84 239 190 177 240 167 255 153 207 198 235 157 218 101 209 117 110 57 158 113 160 68 242 223 109 247 33 237 229 57 186 145 95 59 2 2 106 153 109 194 24 239 241 188 61 245 211 125 238 32 54 37 170 29 197 209 243 122 188 213 28 57 75 147 38 170 70 103 138 223 146 28 2 3 91 146 155 55 185 226 218 164 234 79 158 254 61 31 183 119 148 157 226 56 110 177 236 227 71 43 83 82 161 247 161 196 1 164 120 80 136 191 208 140 164 14 207 160 41 164 244 119 14 0 0 1 128 239 164 224 84 239 190 177 240 167 255 153 207 198 235 157 218 101 209 117 110 57 158 113 160 68 242 223 109 247 33 237 229 57 186 145 95 59 2 2 106 153 109 194 24 239 241 188 61 245 211 125 238 32 54 37 170 29 197 209 243 122 188 213 28 57 75 147 38 170 70 103 138 223 146 28 2 3 91 146 155 55 185 226 218 164 234 79 158 254 61 31 183 119 148 157 226 56 110 177 236 227 71 43 83 82 161 247 161 196 1 164 120 80 136 191 208 140 164 14 207 160 41 164 244 119 14 0 0 0 8 117 0 0 0 0 0 0 0 1 8 117 0 0 0 0 0 0 0 0 8 167 54 193 64 7 0 0 0 1 8 167 54 193 64 7 0 0 0 0 104 163 255 64 83 203 87 36 149 94 156 52 123 63 158 204 53 182 225 176 27 17 88 255 208 169 246 109 207 8 64 136 93 175 10 180 61 49 204 55 239 115 146 100 212 148 94 230 159 166 203 181 245 53 40 149 146 56 136 42 224 170 147 35 157 91 64 177 60 196 240 153 231 11 78 17 76 195 177 43 46 180 131 25 83 109 63 119 225 27 57 57 188 91 199 152 23 5 174 91 1 0 0 0 0 1 104 163 255 64 83 203 87 36 149 94 156 52 123 63 158 204 53 182 225 176 27 17 88 255 208 169 246 109 207 8 64 136 93 175 10 180 61 49 204 55 239 115 146 100 212 148 94 230 159 166 203 181 245 53 40 149 146 56 136 42 224 170 147 35 157 91 64 177 60 196 240 153 231 11 78 17 76 195 177 43 46 180 131 25 83 109 63 119 225 27 57 57 188 91 199 152 23 5 174 91 1 0 0 0 0 0 128 208 138 109 225 227 64 152 153 2 96 34 145 164 157 131 115 155 183 104 200 193 145 244 83 249 93 179 164 174 212 200 81 147 54 91 88 194 241 160 176 132 66 20 118 17 178 241 133 189 166 164 150 50 53 47 1 210 38 252 20 112 90 129 36 107 137 165 239 174 138 211 103 99 134 246 76 212 170 81 144 177 228 153 120 20 106 60 41 27 26 142 218 209 123 220 154 21 104 181 204 11 114 252 113 18 117 199 212 53 240 129 51 13 132 82 236 158 244 158 200 100 104 97 216 25 1 0 0 1 128 208 138 109 225 227 64 152 153 2 96 34 145 164 157 131 115 155 183 104 200 193 145 244 83 249 93 179 164 174 212 200 81 147 54 91 88 194 241 160 176 132 66 20 118 17 178 241 133 189 166 164 150 50 53 47 1 210 38 252 20 112 90 129 36 107 137 165 239 174 138 211 103 99 134 246 76 212 170 81 144 177 228 153 120 20 106 60 41 27 26 142 218 209 123 220 154 21 104 181 204 11 114 252 113 18 117 199 212 53 240 129 51 13 132 82 236 158 244 158 200 100 104 97 216 25 1 0 0 0 112 88 85 211 200 39 154 110 112 105 110 167 223 36 85 108 22 191 129 29 63 186 205 74 174 242 107 26 190 218 113 172 16 57 224 133 51 114 134 142 127 13 144 200 97 128 128 218 245 64 148 11 69 93 180 151 220 172 202 66 76 33 187 244 229 35 36 242 82 235 185 65 36 190 117 245 110 49 206 180 71 37 57 255 79 12 219 105 17 123 252 191 204 128 157 112 79 129 176 184 68 206 60 102 245 5 0 0 0 0 0 0 0 1 112 88 85 211 200 39 154 110 112 105 110 167 223 36 85 108 22 191 129 29 63 186 205 74 174 242 107 26 190 218 113 172 16 57 224 133 51 114 134 142 127 13 144 200 97 128 128 218 245 64 148 11 69 93 180 151 220 172 202 66 76 33 187 244 229 35 36 242 82 235 185 65 36 190 117 245 110 49 206 180 71 37 57 255 79 12 219 105 17 123 252 191 204 128 157 112 79 129 176 184 68 206 60 102 245 5 0 0 0 0 0 0 0 0 48 148 74 37 131 247 53 39 99 216 223 47 18 9 18 136 179 193 37 55 33 91 7 244 148 62 42 57 238 215 181 93 98 8 101 69 225 214 132 204 75 52 125 56 24 213 200 8 0 1 48 148 74 37 131 247 53 39 99 216 223 47 18 9 18 136 179 193 37 55 33 91 7 244 148 62 42 57 238 215 181 93 98 8 101 69 225 214 132 204 75 52 125 56 24 213 200 8 0 0 112 64 220 239 97 7 93 87 27 105 63 207 167 21 133 15 227 58 185 168 161 239 33 193 128 172 161 15 59 239 186 103 81 115 178 232 138 149 139 198 145 252 165 58 125 110 48 134 211 40 242 174 206 78 255 94 75 31 44 237 250 204 57 72 109 14 12 198 119 229 200 254 145 184 208 143 78 161 97 105 128 146 153 84 125 239 129 93 98 110 23 17 170 158 50 181 141 42 47 152 191 196 3 192 174 110 71 240 178 232 63 60 2 1 112 64 220 239 97 7 93 87 27 105 63 207 167 21 133 15 227 58 185 168 161 239 33 193 128 172 161 15 59 239 186 103 81 115 178 232 138 149 139 198 145 252 165 58 125 110 48 134 211 40 242 174 206 78 255 94 75 31 44 237 250 204 57 72 109 14 12 198 119 229 200 254 145 184 208 143 78 161 97 105 128 146 153 84 125 239 129 93 98 110 23 17 170 158 50 181 141 42 47 152 191 196 3 192 174 110 71 240 178 232 63 60 2 0 88 246 113 176 137 13 123 106 26 224 128 91 228 193 243 252 242 15 62 220 212 178 30 202 11 111 66 230 161 177 241 60 253 100 208 201 117 225 216 68 197 128 174 145 95 149 128 91 24 175 176 25 111 104 124 66 50 242 232 64 14 195 239 251 14 206 116 190 242 168 216 235 100 161 227 42 119 101 187 234 141 57 76 100 11 246 212 179 0 1 88 246 113 176 137 13 123 106 26 224 128 91 228 193 243 252 242 15 62 220 212 178 30 202 11 111 66 230 161 177 241 60 253 100 208 201 117 225 216 68 197 128 174 145 95 149 128 91 24 175 176 25 111 104 124 66 50 242 232 64 14 195 239 251 14 206 116 190 242 168 216 235 100 161 227 42 119 101 187 234 141 57 76 100 11 246 212 179 0 0 16 55 56 172 187 58 164 70 156 120 82 181 1 0 0 0 0 1 16 55 56 172 187 58 164 70 156 120 82 181 1 0 0 0 0 0 48 220 172 17 9 205 156 24 242 134 168 180 223 153 206 236 236 90 205 11 224 120 98 214 90 123 243 129 201 165 220 225 6 36 19 55 134 83 178 129 164 32 109 15 112 3 0 0 0 1 48 220 172 17 9 205 156 24 242 134 168 180 223 153 206 236 236 90 205 11 224 120 98 214 90 123 243 129 201 165 220 225 6 36 19 55 134 83 178 129 164 32 109 15 112 3 0 0 0 0 56 193 141 127 34 209 21 199 67 68 204 143 241 45 80 225 214 45 100 21 48 33 106 113 2 148 20 23 159 40 68 202 237 170 200 232 238 164 242 236 171 136 93 52 242 83 251 122 237 48 94 107 2 0 0 0 0 1 56 193 141 127 34 209 21 199 67 68 204 143 241 45 80 225 214 45 100 21 48 33 106 113 2 148 20 23 159 40 68 202 237 170 200 232 238 164 242 236 171 136 93 52 242 83 251 122 237 48 94 107 2 0 0 0 0 0 112 207 93 175 32 64 88 139 55 246 244 132 171 62 72 184 11 242 187 171 224 39 148 96 224 166 191 87 37 46 103 39 90 112 54 172 23 47 108 13 198 12 169 216 111 103 124 235 201 195 16 145 148 127 191 56 185 218 102 131 173 6 53 96 126 92 36 77 124 130 17 196 69 227 95 129 211 148 22 209 224 108 6 158 123 117 167 143 244 183 183 224 114 73 162 213 215 117 83 229 22 1 63 246 155 62 220 132 1 179 0 0 0 1 112 207 93 175 32 64 88 139 55 246 244 132 171 62 72 184 11 242 187 171 224 39 148 96 224 166 191 87 37 46 103 39 90 112 54 172 23 47 108 13 198 12 169 216 111 103 124 235 201 195 16 145 148 127 191 56 185 218 102 131 173 6 53 96 126 92 36 77 124 130 17 196 69 227 95 129 211 148 22 209 224 108 6 158 123 117 167 143 244 183 183 224 114 73 162 213 215 117 83 229 22 1 63 246 155 62 220 132 1 179 0 0 0 0 40 28 191 13 194 165 182 248 57 186 139 244 112 207 96 200 175 106 69 10 84 43 142 147 3 182 157 30 118 79 126 104 103 178 4 0 0 0 0 0 0 1 40 28 191 13 194 165 182 248 57 186 139 244 112 207 96 200 175 106 69 10 84 43 142 147 3 182 157 30 118 79 126 104 103 178 4 0 0 0 0 0 0 0 8 212 78 222 60 176 142 1 0 1 8 212 78 222 60 176 142 1 0 0 104 145 100 67 42 119 254 160 245 196 55 20 64 100 33 63 183 247 83 171 250 148 186 67 236 130 147 92 200 183 110 211 65 19 126 207 82 103 84 16 52 82 16 73 99 33 53 16 184 44 239 234 154 184 25 81 99 110 127 146 231 156 136 36 208 247 98 178 87 0 213 166 40 147 186 233 193 12 80 213 75 67 53 102 157 20 22 155 226 99 40 237 217 91 216 187 183 209 192 42 100 71 58 1 0 1 104 145 100 67 42 119 254 160 245 196 55 20 64 100 33 63 183 247 83 171 250 148 186 67 236 130 147 92 200 183 110 211 65 19 126 207 82 103 84 16 52 82 16 73 99 33 53 16 184 44 239 234 154 184 25 81 99 110 127 146 231 156 136 36 208 247 98 178 87 0 213 166 40 147 186 233 193 12 80 213 75 67 53 102 157 20 22 155 226 99 40 237 217 91 216 187 183 209 192 42 100 71 58 1 0 0 88 125 231 30 134 199 198 64 150 204 149 136 212 55 251 17 236 75 172 60 103 13 112 161 248 228 121 4 183 230 238 235 81 68 11 65 213 88 3 234 7 110 178 57 19 166 16 98 54 80 226 89 131 81 212 59 162 55 8 27 204 124 98 217 79 46 181 86 195 56 99 31 161 60 165 222 210 115 82 149 178 121 38 60 117 25 0 0 0 1 88 125 231 30 134 199 198 64 150 204 149 136 212 55 251 17 236 75 172 60 103 13 112 161 248 228 121 4 183 230 238 235 81 68 11 65 213 88 3 234 7 110 178 57 19 166 16 98 54 80 226 89 131 81 212 59 162 55 8 27 204 124 98 217 79 46 181 86 195 56 99 31 161 60 165 222 210 115 82 149 178 121 38 60 117 25 0 0 0 0 56 55 79 115 254 18 45 144 84 54 237 229 99 113 73 136 188 244 213 254 183 151 168 225 91 201 252 214 57 183 27 164 26 210 240 237 171 92 108 203 191 175 120 3 12 116 19 67 245 233 249 115 5 240 214 35 0 1 56 55 79 115 254 18 45 144 84 54 237 229 99 113 73 136 188 244 213 254 183 151 168 225 91 201 252 214 57 183 27 164 26 210 240 237 171 92 108 203 191 175 120 3 12 116 19 67 245 233 249 115 5 240 214 35 0 0 96 149 115 162 199 81 74 3 202 108 176 213 7 202 56 50 54 238 173 104 162 72 222 19 198 247 157 194 69 205 163 168 225 51 180 210 187 109 152 138 75 137 178 226 20 227 183 17 221 228 33 75 27 234 181 159 148 112 168 204 13 44 22 165 143 41 73 80 229 106 191 38 16 134 93 174 157 141 69 61 203 130 122 44 39 131 2 164 80 62 160 63 47 120 166 28 140 1 96 149 115 162 199 81 74 3 202 108 176 213 7 202 56 50 54 238 173 104 162 72 222 19 198 247 157 194 69 205 163 168 225 51 180 210 187 109 152 138 75 137 178 226 20 227 183 17 221 228 33 75 27 234 181 159 148 112 168 204 13 44 22 165 143 41 73 80 229 106 191 38 16 134 93 174 157 141 69 61 203 130 122 44 39 131 2 164 80 62 160 63 47 120 166 28 140 0 120 177 73 66 225 183 251 124 47 179 14 57 160 213 173 196 252 133 171 44 98 102 65 108 221 64 128 144 3 168 15 10 125 144 93 198 204 237 212 228 129 58 93 188 102 216 32 20 56 110 5 186 118 149 188 145 246 98 31 144 172 117 122 179 94 110 54 137 100 169 159 233 64 176 40 159 107 80 248 222 131 122 156 155 179 205 124 225 233 168 165 4 29 207 254 20 155 7 94 221 210 178 187 38 94 68 88 18 166 136 0 118 237 105 249 139 19 14 0 0 0 1 120 177 73 66 225 183 251 124 47 179 14 57 160 213 173 196 252 133 171 44 98 102 65 108 221 64 128 144 3 168 15 10 125 144 93 198 204 237 212 228 129 58 93 188 102 216 32 20 56 110 5 186 118 149 188 145 246 98 31 144 172 117 122 179 94 110 54 137 100 169 159 233 64 176 40 159 107 80 248 222 131 122 156 155 179 205 124 225 233 168 165 4 29 207 254 20 155 7 94 221 210 178 187 38 94 68 88 18 166 136 0 118 237 105 249 139 19 14 0 0 0 0 24 144 98 85 217 149 150 223 122 8 206 59 47 131 103 65 155 173 0 0 0 0 0 0 0 1 24 144 98 85 217 149 150 223 122 8 206 59 47 131 103 65 155 173 0 0 0 0 0 0 0 0 24 220 124 42 149 85 78 138 33 185 250 196 15 48 72 171 163 134 2 88 6 85 142 130 2 1 24 220 124 42 149 85 78 138 33 185 250 196 15 48 72 171 163 134 2 88 6 85 142 130 2 0 128 212 122 169 156 54 138 107 16 121 38 59 69 203 193 117 75 63 180 179 47 63 118 224 1 181 147 133 85 37 60 119 246 102 174 58 174 167 181 225 245 128 208 200 176 210 149 71 173 107 114 230 170 178 95 214 144 188 159 164 164 189 64 23 6 49 14 195 137 72 104 1 156 208 120 58 123 105 78 15 149 254 83 83 82 154 175 59 38 12 161 82 182 68 227 130 172 160 38 178 36 70 164 50 135 65 11 243 87 239 25 151 184 247 104 210 135 241 219 1 53 174 119 60 149 230 43 0 0 1 128 212 122 169 156 54 138 107 16 121 38 59 69 203 193 117 75 63 180 179 47 63 118 224 1 181 147 133 85 37 60 119 246 102 174 58 174 167 181 225 245 128 208 200 176 210 149 71 173 107 114 230 170 178 95 214 144 188 159 164 164 189 64 23 6 49 14 195 137 72 104 1 156 208 120 58 123 105 78 15 149 254 83 83 82 154 175 59 38 12 161 82 182 68 227 130 172 160 38 178 36 70 164 50 135 65 11 243 87 239 25 151 184 247 104 210 135 241 219 1 53 174 119 60 149 230 43 0 0 0 40 100 188 84 92 121 120 255 45 117 214 25 143 9 160 32 125 250 37 133 240 255 252 20 126 29 171 3 237 205 240 235 36 208 143 0 0 0 0 0 0 1 40 100 188 84 92 121 120 255 45 117 214 25 143 9 160 32 125 250 37 133 240 255 252 20 126 29 171 3 237 205 240 235 36 208 143 0 0 0 0 0 0 0 16 204 130 239 246 187 158 93 86 47 108 73 1 13 0 0 0 1 16 204 130 239 246 187 158 93 86 47 108 73 1 13 0 0 0 0 24 202 131 231 76 126 186 127 132 23 187 208 204 73 5 178 40 150 139 35 0 0 0 0 0 1 24 202 131 231 76 126 186 127 132 23 187 208 204 73 5 178 40 150 139 35 0 0 0 0 0 0 40 107 133 121 0 139 12 135 132 162 235 102 36 43 184 250 87 59 67 137 202 96 199 100 109 243 118 70 114 158 224 173 101 40 37 48 74 1 0 0 0 1 40 107 133 121 0 139 12 135 132 162 235 102 36 43 184 250 87 59 67 137 202 96 199 100 109 243 118 70 114 158 224 173 101 40 37 48 74 1 0 0 0 0 24 102 233 199 173 120 192 172 230 96 54 194 151 124 92 161 206 20 63 0 0 0 0 0 0 1 24 102 233 199 173 120 192 172 230 96 54 194 151 124 92 161 206 20 63 0 0 0 0 0 0 0 104 100 11 95 76 33 185 232 209 233 63 34 185 176 109 189 253 110 207 211 238 172 100 29 184 164 214 167 6 238 105 2 20 159 93 77 69 163 157 21 207 95 133 129 211 104 170 34 230 70 233 190 110 110 143 167 140 190 151 103 146 32 227 27 255 248 240 157 241 20 32 236 100 44 139 162 28 213 191 101 140 119 176 40 84 199 138 241 56 14 243 128 9 9 244 235 30 65 225 224 112 146 250 26 0 1 104 100 11 95 76 33 185 232 209 233 63 34 185 176 109 189 253 110 207 211 238 172 100 29 184 164 214 167 6 238 105 2 20 159 93 77 69 163 157 21 207 95 133 129 211 104 170 34 230 70 233 190 110 110 143 167 140 190 151 103 146 32 227 27 255 248 240 157 241 20 32 236 100 44 139 162 28 213 191 101 140 119 176 40 84 199 138 241 56 14 243 128 9 9 244 235 30 65 225 224 112 146 250 26 0 0 112 182 231 30 134 177 100 37 122 104 11 71 195 133 25 28 169 0 181 147 130 44 177 101 57 112 42 199 21 101 103 140 223 42 216 201 189 53 195 100 237 238 71 248 113 40 44 240 38 199 64 195 184 81 25 41 68 92 218 4 53 122 241 204 51 58 42 144 93 242 88 103 109 196 188 0 52 79 84 246 121 89 177 54 12 27 96 80 73 210 243 157 157 69 16 99 156 41 206 86 47 228 138 204 240 83 60 157 254 252 73 192 5 1 112 182 231 30 134 177 100 37 122 104 11 71 195 133 25 28 169 0 181 147 130 44 177 101 57 112 42 199 21 101 103 140 223 42 216 201 189 53 195 100 237 238 71 248 113 40 44 240 38 199 64 195 184 81 25 41 68 92 218 4 53 122 241 204 51 58 42 144 93 242 88 103 109 196 188 0 52 79 84 246 121 89 177 54 12 27 96 80 73 210 243 157 157 69 16 99 156 41 206 86 47 228 138 204 240 83 60 157 254 252 73 192 5 0 16 197 213 123 115 98 52 254 70 238 15 1 0 0 0 0 0 1 16 197 213 123 115 98 52 254 70 238 15 1 0 0 0 0 0 0 80 210 145 122 99 89 37 131 47 52 147 113 130 64 191 58 127 124 89 27 75 1 37 219 223 7 191 140 168 223 254 58 21 31 33 247 253 167 137 36 155 41 0 231 239 197 12 2 35 195 249 194 240 216 58 92 5 213 221 245 127 195 161 21 118 66 85 175 221 8 222 64 201 103 150 0 0 0 0 0 0 1 80 210 145 122 99 89 37 131 47 52 147 113 130 64 191 58 127 124 89 27 75 1 37 219 223 7 191 140 168 223 254 58 21 31 33 247 253 167 137 36 155 41 0 231 239 197 12 2 35 195 249 194 240 216 58 92 5 213 221 245 127 195 161 21 118 66 85 175 221 8 222 64 201 103 150 0 0 0 0 0 0 0 88 102 17 96 82 154 52 112 87 18 167 167 218 54 218 124 208 194 201 83 97 231 176 221 100 220 46 62 248 6 192 115 8 87 141 125 98 123 239 88 101 67 173 98 197 3 232 107 94 225 39 234 38 220 115 81 68 201 24 107 126 207 211 147 102 232 111 120 175 151 194 198 220 102 170 182 69 63 31 181 226 6 0 0 0 0 0 0 0 1 88 102 17 96 82 154 52 112 87 18 167 167 218 54 218 124 208 194 201 83 97 231 176 221 100 220 46 62 248 6 192 115 8 87 141 125 98 123 239 88 101 67 173 98 197 3 232 107 94 225 39 234 38 220 115 81 68 201 24 107 126 207 211 147 102 232 111 120 175 151 194 198 220 102 170 182 69 63 31 181 226 6 0 0 0 0 0 0 0 0 72 145 142 130 152 168 95 187 252 167 72 111 60 173 234 4 233 25 77 201 212 221 165 137 12 169 149 226 137 232 12 31 136 171 31 255 243 138 160 179 185 30 246 120 97 97 100 77 175 51 130 43 32 46 143 163 120 150 96 104 169 233 159 139 198 126 120 21 227 79 54 10 0 1 72 145 142 130 152 168 95 187 252 167 72 111 60 173 234 4 233 25 77 201 212 221 165 137 12 169 149 226 137 232 12 31 136 171 31 255 243 138 160 179 185 30 246 120 97 97 100 77 175 51 130 43 32 46 143 163 120 150 96 104 169 233 159 139 198 126 120 21 227 79 54 10 0 0 8 209 5 0 0 0 0 0 0 1 8 209 5 0 0 0 0 0 0 0 24 69 29 214 123 179 196 196 154 251 96 42 73 71 146 179 99 47 210 101 0 0 0 0 0 1 24 69 29 214 123 179 196 196 154 251 96 42 73 71 146 179 99 47 210 101 0 0 0 0 0 0 88 205 231 92 64 63 136 90 54 204 92 82 240 111 88 87 211 205 64 177 174 111 246 250 90 188 132 108 77 132 226 209 192 221 34 204 124 101 65 183 13 73 28 188 123 178 61 12 115 7 113 85 201 249 122 39 164 5 195 152 12 24 213 221 225 91 183 40 236 164 234 105 15 207 109 160 192 144 206 42 56 17 71 51 153 182 149 229 1 1 88 205 231 92 64 63 136 90 54 204 92 82 240 111 88 87 211 205 64 177 174 111 246 250 90 188 132 108 77 132 226 209 192 221 34 204 124 101 65 183 13 73 28 188 123 178 61 12 115 7 113 85 201 249 122 39 164 5 195 152 12 24 213 221 225 91 183 40 236 164 234 105 15 207 109 160 192 144 206 42 56 17 71 51 153 182 149 229 1 0 112 75 185 2 45 158 234 42 220 77 129 40 207 111 250 118 209 102 233 123 133 227 197 44 57 196 23 50 237 189 56 114 42 117 188 70 201 140 176 85 119 26 80 196 78 38 152 73 81 60 72 29 44 30 96 127 77 209 43 84 19 238 161 199 121 222 254 69 226 80 194 175 85 135 165 209 175 199 237 223 219 141 82 63 115 118 194 96 58 8 45 138 219 118 118 250 164 228 179 178 255 210 12 129 255 206 164 214 156 233 1 0 0 1 112 75 185 2 45 158 234 42 220 77 129 40 207 111 250 118 209 102 233 123 133 227 197 44 57 196 23 50 237 189 56 114 42 117 188 70 201 140 176 85 119 26 80 196 78 38 152 73 81 60 72 29 44 30 96 127 77 209 43 84 19 238 161 199 121 222 254 69 226 80 194 175 85 135 165 209 175 199 237 223 219 141 82 63 115 118 194 96 58 8 45 138 219 118 118 250 164 228 179 178 255 210 12 129 255 206 164 214 156 233 1 0 0 0 72 170 113 192 138 104 174 124 39 73 93 28 193 169 216 164 220 91 84 152 21 86 210 138 141 248 203 166 85 144 162 254 201 183 85 193 224 116 40 113 190 178 244 129 164 250 249 19 14 209 96 142 161 190 213 129 69 159 67 19 1 205 41 215 144 51 30 49 29 6 0 0 0 1 72 170 113 192 138 104 174 124 39 73 93 28 193 169 216 164 220 91 84 152 21 86 210 138 141 248 203 166 85 144 162 254 201 183 85 193 224 116 40 113 190 178 244 129 164 250 249 19 14 209 96 142 161 190 213 129 69 159 67 19 1 205 41 215 144 51 30 49 29 6 0 0 0 0 80 187 125 249 0 237 185 92 151 185 34 111 175 129 204 191 155 242 60 103 220 201 34 29 144 204 63 230 124 192 11 86 89 46 248 84 65 216 118 216 186 101 34 52 12 183 171 200 31 196 236 206 37 26 50 4 49 58 103 122 211 219 34 244 124 191 195 111 184 185 248 253 224 239 127 121 202 148 98 106 14 1 80 187 125 249 0 237 185 92 151 185 34 111 175 129 204 191 155 242 60 103 220 201 34 29 144 204 63 230 124 192 11 86 89 46 248 84 65 216 118 216 186 101 34 52 12 183 171 200 31 196 236 206 37 26 50 4 49 58 103 122 211 219 34 244 124 191 195 111 184 185 248 253 224 239 127 121 202 148 98 106 14 0 64 139 102 172 114 149 72 104 165 114 58 106 15 225 235 97 205 254 36 224 45 49 116 146 137 86 251 107 88 136 139 83 17 137 15 7 72 222 67 112 165 159 252 189 213 77 46 142 192 37 63 205 124 221 187 30 104 5 0 0 0 0 0 0 0 1 64 139 102 172 114 149 72 104 165 114 58 106 15 225 235 97 205 254 36 224 45 49 116 146 137 86 251 107 88 136 139 83 17 137 15 7 72 222 67 112 165 159 252 189 213 77 46 142 192 37 63 205 124 221 187 30 104 5 0 0 0 0 0 0 0 0 48 193 117 186 128 69 247 91 107 62 131 175 40 131 137 103 76 253 5 75 34 122 71 127 130 217 242 2 7 156 145 247 63 191 243 59 172 98 22 239 18 159 250 155 96 146 0 0 0 1 48 193 117 186 128 69 247 91 107 62 131 175 40 131 137 103 76 253 5 75 34 122 71 127 130 217 242 2 7 156 145 247 63 191 243 59 172 98 22 239 18 159 250 155 96 146 0 0 0 0 32 47 51 76 163 249 78 98 148 84 63 232 105 55 224 47 211 142 180 28 84 89 211 77 14 249 46 0 0 0 0 0 0 1 32 47 51 76 163 249 78 98 148 84 63 232 105 55 224 47 211 142 180 28 84 89 211 77 14 249 46 0 0 0 0 0 0 0 72 201 214 155 246 50 22 166 239 223 78 244 233 195 105 89 119 99 157 184 116 51 233 12 83 167 255 76 111 102 220 89 20 93 143 234 73 99 250 59 120 26 217 181 201 39 66 23 209 115 214 70 225 241 60 167 247 136 252 1 227 55 151 13 131 195 45 0 0 0 0 0 0 1 72 201 214 155 246 50 22 166 239 223 78 244 233 195 105 89 119 99 157 184 116 51 233 12 83 167 255 76 111 102 220 89 20 93 143 234 73 99 250 59 120 26 217 181 201 39 66 23 209 115 214 70 225 241 60 167 247 136 252 1 227 55 151 13 131 195 45 0 0 0 0 0 0 0 24 23 30 33 8 157 238 224 164 246 31 43 191 176 252 7 205 45 242 0 0 0 0 0 0 1 24 23 30 33 8 157 238 224 164 246 31 43 191 176 252 7 205 45 242 0 0 0 0 0 0 0 56 54 228 32 91 115 93 129 151 246 253 217 44 135 61 82 191 178 138 66 53 138 127 124 132 49 110 155 83 6 68 149 49 137 123 196 184 39 167 125 47 74 249 193 203 43 79 83 101 134 133 9 11 0 0 0 0 1 56 54 228 32 91 115 93 129 151 246 253 217 44 135 61 82 191 178 138 66 53 138 127 124 132 49 110 155 83 6 68 149 49 137 123 196 184 39 167 125 47 74 249 193 203 43 79 83 101 134 133 9 11 0 0 0 0 0 56 77 188 100 119 111 50 9 100 13 63 121 125 142 166 34 201 103 64 166 45 83 205 159 233 137 246 116 27 220 206 160 89 216 10 52 203 22 78 211 51 23 240 179 183 83 170 242 111 240 0 0 0 0 0 0 0 1 56 77 188 100 119 111 50 9 100 13 63 121 125 142 166 34 201 103 64 166 45 83 205 159 233 137 246 116 27 220 206 160 89 216 10 52 203 22 78 211 51 23 240 179 183 83 170 242 111 240 0 0 0 0 0 0 0 0 16 183 62 167 189 129 14 105 162 209 89 0 0 0 0 0 0 1 16 183 62 167 189 129 14 105 162 209 89 0 0 0 0 0 0 0 104 118 204 239 47 128 120 188 223 1 55 39 227 110 234 226 46 9 49 105 96 118 213 142 45 148 25 46 222 99 148 85 221 31 128 11 140 49 253 179 116 86 166 9 89 85 77 43 213 244 104 94 141 180 94 152 53 231 238 203 17 49 2 219 158 139 90 32 173 163 68 117 8 23 52 205 75 107 41 4 131 110 118 52 89 83 200 125 45 226 180 48 90 244 16 175 35 209 5 0 0 0 0 0 0 1 104 118 204 239 47 128 120 188 223 1 55 39 227 110 234 226 46 9 49 105 96 118 213 142 45 148 25 46 222 99 148 85 221 31 128 11 140 49 253 179 116 86 166 9 89 85 77 43 213 244 104 94 141 180 94 152 53 231 238 203 17 49 2 219 158 139 90 32 173 163 68 117 8 23 52 205 75 107 41 4 131 110 118 52 89 83 200 125 45 226 180 48 90 244 16 175 35 209 5 0 0 0 0 0 0 0 32 141 129 3 16 248 10 239 222 142 76 62 151 42 178 39 242 64 15 167 154 168 11 249 175 85 5 12 3 103 49 42 0 1 32 141 129 3 16 248 10 239 222 142 76 62 151 42 178 39 242 64 15 167 154 168 11 249 175 85 5 12 3 103 49 42 0 0 8 123 78 196 123 153 10 0 0 1 8 123 78 196 123 153 10 0 0 0 16 144 212 195 123 171 191 34 243 189 164 67 38 150 212 224 39 1 16 144 212 195 123 171 191 34 243 189 164 67 38 150 212 224 39 0 32 187 134 178 60 106 197 246 170 105 173 38 215 230 126 251 232 114 84 137 220 128 251 54 111 198 172 1 114 19 30 189 175 1 32 187 134 178 60 106 197 246 170 105 173 38 215 230 126 251 232 114 84 137 220 128 251 54 111 198 172 1 114 19 30 189 175 0 24 143 215 216 189 149 84 197 67 202 64 106 120 162 162 86 42 64 51 134 144 124 43 171 16 1 24 143 215 216 189 149 84 197 67 202 64 106 120 162 162 86 42 64 51 134 144 124 43 171 16 0 72 139 212 65 201 234 213 89 222 141 127 253 158 87 57 57 116 99 73 197 165 146 10 238 243 162 67 87 231 145 147 216 148 210 201 209 126 220 255 168 121 230 233 9 201 51 185 90 86 120 23 45 86 96 77 163 130 157 206 192 50 201 33 37 54 59 0 0 0 0 0 0 0 1 72 139 212 65 201 234 213 89 222 141 127 253 158 87 57 57 116 99 73 197 165 146 10 238 243 162 67 87 231 145 147 216 148 210 201 209 126 220 255 168 121 230 233 9 201 51 185 90 86 120 23 45 86 96 77 163 130 157 206 192 50 201 33 37 54 59 0 0 0 0 0 0 0 0 32 23 231 42 113 193 81 226 51 220 131 214 166 146 8 75 191 48 0 176 34 36 39 225 46 186 62 45 29 56 240 98 0 1 32 23 231 42 113 193 81 226 51 220 131 214 166 146 8 75 191 48 0 176 34 36 39 225 46 186 62 45 29 56 240 98 0 0 112 227 163 90 90 118 151 96 241 208 91 153 230 68 148 109 36 156 59 108 3 56 117 211 213 19 39 240 123 158 82 0 37 126 14 223 103 223 22 131 216 204 69 250 101 220 238 12 18 77 151 114 103 62 43 207 60 13 44 63 145 155 196 15 104 68 124 226 214 9 255 2 209 143 177 56 5 128 66 245 24 171 251 123 103 175 179 158 169 79 76 238 144 42 92 164 86 181 59 182 45 185 118 125 221 29 2 0 0 0 0 0 0 1 112 227 163 90 90 118 151 96 241 208 91 153 230 68 148 109 36 156 59 108 3 56 117 211 213 19 39 240 123 158 82 0 37 126 14 223 103 223 22 131 216 204 69 250 101 220 238 12 18 77 151 114 103 62 43 207 60 13 44 63 145 155 196 15 104 68 124 226 214 9 255 2 209 143 177 56 5 128 66 245 24 171 251 123 103 175 179 158 169 79 76 238 144 42 92 164 86 181 59 182 45 185 118 125 221 29 2 0 0 0 0 0 0 0 56 21 205 7 125 176 60 227 180 194 177 238 254 236 214 253 45 120 92 88 238 119 13 43 164 250 120 212 254 127 151 28 105 87 83 93 136 139 49 151 198 102 118 229 122 40 245 156 201 162 113 68 119 67 16 0 0 1 56 21 205 7 125 176 60 227 180 194 177 238 254 236 214 253 45 120 92 88 238 119 13 43 164 250 120 212 254 127 151 28 105 87 83 93 136 139 49 151 198 102 118 229 122 40 245 156 201 162 113 68 119 67 16 0 0 0 128 109 98 40 183 212 31 133 44 220 177 117 246 95 158 65 148 190 211 252 136 162 225 177 247 115 56 178 10 194 128 11 57 161 119 91 128 227 125 160 201 170 74 199 20 117 57 205 164 167 39 140 51 104 152 111 244 236 125 79 209 50 96 221 6 70 174 222 210 141 0 0 38 91 25 23 175 171 151 185 223 189 29 181 4 186 136 186 187 211 92 240 132 239 86 157 142 233 42 105 221 144 98 224 139 152 138 40 2 75 65 232 64 78 37 25 85 43 247 17 170 71 235 54 68 95 61 0 0 1 128 109 98 40 183 212 31 133 44 220 177 117 246 95 158 65 148 190 211 252 136 162 225 177 247 115 56 178 10 194 128 11 57 161 119 91 128 227 125 160 201 170 74 199 20 117 57 205 164 167 39 140 51 104 152 111 244 236 125 79 209 50 96 221 6 70 174 222 210 141 0 0 38 91 25 23 175 171 151 185 223 189 29 181 4 186 136 186 187 211 92 240 132 239 86 157 142 233 42 105 221 144 98 224 139 152 138 40 2 75 65 232 64 78 37 25 85 43 247 17 170 71 235 54 68 95 61 0 0 0 8 84 104 15 69 62 160 26 0 1 8 84 104 15 69 62 160 26 0 0 112 219 65 187 13 190 48 46 122 32 188 62 55 54 62 116 201 244 243 89 151 14 43 21 29 19 142 33 75 56 94 48 19 170 145 179 161 25 76 133 125 215 133 4 159 74 89 201 157 226 92 172 10 213 88 179 123 109 36 223 242 66 12 21 230 200 219 144 151 19 8 235 54 85 254 74 95 63 248 92 164 209 97 251 119 65 142 10 170 247 216 222 98 38 21 72 54 73 122 224 248 221 198 101 236 254 0 0 0 0 0 0 0 1 112 219 65 187 13 190 48 46 122 32 188 62 55 54 62 116 201 244 243 89 151 14 43 21 29 19 142 33 75 56 94 48 19 170 145 179 161 25 76 133 125 215 133 4 159 74 89 201 157 226 92 172 10 213 88 179 123 109 36 223 242 66 12 21 230 200 219 144 151 19 8 235 54 85 254 74 95 63 248 92 164 209 97 251 119 65 142 10 170 247 216 222 98 38 21 72 54 73 122 224 248 221 198 101 236 254 0 0 0 0 0 0 0 0 120 173 131 100 228 57 121 99 67 36 188 26 116 195 11 33 238 99 149 244 192 69 122 152 142 206 32 93 57 158 59 204 109 129 133 85 46 84 246 35 199 170 91 5 153 166 135 136 100 219 159 177 96 71 252 20 164 194 225 242 95 219 102 176 247 177 135 49 219 166 200 159 163 69 215 174 34 15 87 114 111 202 124 88 204 39 19 12 146 233 34 22 85 241 111 63 103 250 222 19 62 55 235 240 190 151 122 115 229 120 69 13 175 97 196 211 28 0 0 0 0 1 120 173 131 100 228 57 121 99 67 36 188 26 116 195 11 33 238 99 149 244 192 69 122 152 142 206 32 93 57 158 59 204 109 129 133 85 46 84 246 35 199 170 91 5 153 166 135 136 100 219 159 177 96 71 252 20 164 194 225 242 95 219 102 176 247 177 135 49 219 166 200 159 163 69 215 174 34 15 87 114 111 202 124 88 204 39 19 12 146 233 34 22 85 241 111 63 103 250 222 19 62 55 235 240 190 151 122 115 229 120 69 13 175 97 196 211 28 0 0 0 0 0 40 243 42 248 54 150 57 118 223 89 213 123 0 145 11 121 246 65 78 171 9 235 26 93 69 20 253 245 14 109 46 33 35 29 254 140 52 122 13 60 0 1 40 243 42 248 54 150 57 118 223 89 213 123 0 145 11 121 246 65 78 171 9 235 26 93 69 20 253 245 14 109 46 33 35 29 254 140 52 122 13 60 0 0 128 203 79 238 32 121 29 119 220 119 105 16 43 194 81 73 221 217 2 148 227 212 111 94 30 4 186 210 125 205 136 245 32 214 39 108 83 11 185 216 199 221 176 13 218 150 42 152 40 224 210 120 250 254 120 131 79 250 21 126 178 2 237 252 78 209 43 98 114 190 99 82 138 216 142 31 167 59 58 104 199 119 105 205 151 40 188 42 120 215 171 111 159 24 71 230 74 3 175 149 59 28 47 26 232 212 124 173 155 1 51 182 82 59 115 81 68 151 198 197 107 41 0 0 0 0 0 0 0 1 128 203 79 238 32 121 29 119 220 119 105 16 43 194 81 73 221 217 2 148 227 212 111 94 30 4 186 210 125 205 136 245 32 214 39 108 83 11 185 216 199 221 176 13 218 150 42 152 40 224 210 120 250 254 120 131 79 250 21 126 178 2 237 252 78 209 43 98 114 190 99 82 138 216 142 31 167 59 58 104 199 119 105 205 151 40 188 42 120 215 171 111 159 24 71 230 74 3 175 149 59 28 47 26 232 212 124 173 155 1 51 182 82 59 115 81 68 151 198 197 107 41 0 0 0 0 0 0 0 0 8 70 47 94 78 85 213 4 0 1 8 70 47 94 78 85 213 4 0 0 64 168 239 3 109 249 109 253 64 147 102 173 10 159 193 47 134 235 24 116 111 234 17 218 47 133 118 130 4 234 130 216 79 86 7 158 19 179 226 92 28 11 213 95 197 165 161 196 126 158 172 83 45 60 0 243 82 11 125 51 88 204 253 201 0 1 64 168 239 3 109 249 109 253 64 147 102 173 10 159 193 47 134 235 24 116 111 234 17 218 47 133 118 130 4 234 130 216 79 86 7 158 19 179 226 92 28 11 213 95 197 165 161 196 126 158 172 83 45 60 0 243 82 11 125 51 88 204 253 201 0 0 32 91 8 155 0 244 185 150 213 21 51 193 238 33 114 252 243 203 63 197 56 17 152 0 158 202 81 224 155 176 168 48 8 1 32 91 8 155 0 244 185 150 213 21 51 193 238 33 114 252 243 203 63 197 56 17 152 0 158 202 81 224 155 176 168 48 8 0 64 237 110 141 244 234 81 71 9 84 235 128 228 166 210 171 84 207 172 13 18 245 134 71 141 15 168 153 177 38 185 201 244 241 170 222 1 133 147 146 102 43 229 200 175 199 75 172 190 162 84 189 67 156 147 154 31 13 207 129 50 200 231 74 0 1 64 237 110 141 244 234 81 71 9 84 235 128 228 166 210 171 84 207 172 13 18 245 134 71 141 15 168 153 177 38 185 201 244 241 170 222 1 133 147 146 102 43 229 200 175 199 75 172 190 162 84 189 67 156 147 154 31 13 207 129 50 200 231 74 0 0 72 87 52 91 18 47 239 64 167 1 198 52 25 230 164 41 73 76 171 61 96 213 30 252 201 4 21 212 155 40 229 150 154 204 69 5 231 234 118 236 96 115 165 148 146 43 62 108 172 9 72 82 112 145 170 221 58 127 30 73 27 88 182 208 159 212 102 122 105 69 67 0 0 1 72 87 52 91 18 47 239 64 167 1 198 52 25 230 164 41 73 76 171 61 96 213 30 252 201 4 21 212 155 40 229 150 154 204 69 5 231 234 118 236 96 115 165 148 146 43 62 108 172 9 72 82 112 145 170 221 58 127 30 73 27 88 182 208 159 212 102 122 105 69 67 0 0 0 48 64 172 114 48 214 193 164 216 67 60 29 158 200 157 119 130 148 115 28 173 33 19 100 127 6 67 27 159 246 211 0 250 103 226 195 106 155 248 97 202 123 209 221 13 0 0 0 0 1 48 64 172 114 48 214 193 164 216 67 60 29 158 200 157 119 130 148 115 28 173 33 19 100 127 6 67 27 159 246 211 0 250 103 226 195 106 155 248 97 202 123 209 221 13 0 0 0 0 0 120 81 252 110 197 13 166 231 72 130 41 106 65 232 254 107 124 243 255 107 207 47 194 183 40 150 50 4 210 204 224 43 196 247 122 120 215 166 135 245 209 137 61 188 138 187 74 103 184 183 141 129 116 149 165 53 145 106 74 23 238 142 63 216 57 144 68 13 165 129 66 25 38 206 230 110 91 93 226 41 154 75 235 92 163 186 140 230 191 218 201 127 59 108 139 3 252 44 100 3 234 46 162 34 110 218 167 38 61 218 67 214 231 20 40 0 0 0 0 0 0 1 120 81 252 110 197 13 166 231 72 130 41 106 65 232 254 107 124 243 255 107 207 47 194 183 40 150 50 4 210 204 224 43 196 247 122 120 215 166 135 245 209 137 61 188 138 187 74 103 184 183 141 129 116 149 165 53 145 106 74 23 238 142 63 216 57 144 68 13 165 129 66 25 38 206 230 110 91 93 226 41 154 75 235 92 163 186 140 230 191 218 201 127 59 108 139 3 252 44 100 3 234 46 162 34 110 218 167 38 61 218 67 214 231 20 40 0 0 0 0 0 0 0 120 243 247 18 11 29 244 71 100 171 9 7 235 135 165 185 174 82 125 144 46 101 141 39 25 219 161 166 142 138 73 193 151 231 217 184 5 47 234 106 36 39 20 133 77 81 241 34 12 59 55 212 158 163 139 77 54 232 111 133 109 11 226 82 170 77 232 17 218 114 50 113 152 83 202 219 168 218 132 34 241 173 58 247 200 6 151 173 6 185 4 118 166 131 92 255 162 247 111 148 166 68 56 169 253 254 48 168 30 109 251 179 213 140 46 219 3 0 0 0 0 1 120 243 247 18 11 29 244 71 100 171 9 7 235 135 165 185 174 82 125 144 46 101 141 39 25 219 161 166 142 138 73 193 151 231 217 184 5 47 234 106 36 39 20 133 77 81 241 34 12 59 55 212 158 163 139 77 54 232 111 133 109 11 226 82 170 77 232 17 218 114 50 113 152 83 202 219 168 218 132 34 241 173 58 247 200 6 151 173 6 185 4 118 166 131 92 255 162 247 111 148 166 68 56 169 253 254 48 168 30 109 251 179 213 140 46 219 3 0 0 0 0 0 48 170 134 196 251 187 25 104 34 95 69 85 184 199 0 89 253 150 101 212 7 202 243 18 178 248 98 105 134 18 215 189 22 99 238 235 78 124 3 142 134 188 8 188 178 2 0 0 0 1 48 170 134 196 251 187 25 104 34 95 69 85 184 199 0 89 253 150 101 212 7 202 243 18 178 248 98 105 134 18 215 189 22 99 238 235 78 124 3 142 134 188 8 188 178 2 0 0 0 0 48 200 105 57 90 124 53 229 14 158 143 66 34 150 228 210 143 188 213 175 175 21 92 123 213 52 223 97 128 64 234 169 31 165 1 230 126 33 17 32 28 25 238 131 159 125 84 120 8 1 48 200 105 57 90 124 53 229 14 158 143 66 34 150 228 210 143 188 213 175 175 21 92 123 213 52 223 97 128 64 234 169 31 165 1 230 126 33 17 32 28 25 238 131 159 125 84 120 8 0 8 236 26 245 49 19 0 0 0 1 8 236 26 245 49 19 0 0 0 0 16 134 207 199 26 175 188 103 160 76 140 48 55 30 189 7 0 1 16 134 207 199 26 175 188 103 160 76 140 48 55 30 189 7 0 0 24 7 216 8 30 195 251 90 24 198 179 171 59 27 243 102 163 205 126 247 84 4 0 0 0 1 24 7 216 8 30 195 251 90 24 198 179 171 59 27 243 102 163 205 126 247 84 4 0 0 0 0 104 89 190 73 217 127 252 160 134 16 114 94 182 255 223 176 58 217 71 107 33 21 118 140 226 166 128 254 219 248 19 33 93 9 225 89 44 103 188 91 203 146 155 17 20 40 125 153 23 87 125 86 166 25 181 17 220 165 143 13 245 94 144 64 231 41 17 165 224 79 44 34 246 169 187 130 155 57 121 213 161 21 178 163 44 75 169 37 6 67 200 63 171 50 214 213 230 10 148 179 25 0 0 0 0 1 104 89 190 73 217 127 252 160 134 16 114 94 182 255 223 176 58 217 71 107 33 21 118 140 226 166 128 254 219 248 19 33 93 9 225 89 44 103 188 91 203 146 155 17 20 40 125 153 23 87 125 86 166 25 181 17 220 165 143 13 245 94 144 64 231 41 17 165 224 79 44 34 246 169 187 130 155 57 121 213 161 21 178 163 44 75 169 37 6 67 200 63 171 50 214 213 230 10 148 179 25 0 0 0 0 0 120 239 141 241 165 45 224 229 17 155 67 37 181 127 150 115 133 137 72 239 12 3 103 142 204 53 108 13 4 11 96 213 15 192 155 67 147 30 66 19 222 160 17 202 156 77 143 151 241 100 236 128 33 207 105 116 196 68 142 109 237 94 29 86 196 190 96 158 51 78 107 53 2 158 62 195 101 125 181 245 191 185 105 37 77 113 109 85 110 93 152 188 115 136 136 93 10 235 225 51 77 110 7 74 32 118 44 157 117 193 127 80 54 2 0 0 0 0 0 0 0 1 120 239 141 241 165 45 224 229 17 155 67 37 181 127 150 115 133 137 72 239 12 3 103 142 204 53 108 13 4 11 96 213 15 192 155 67 147 30 66 19 222 160 17 202 156 77 143 151 241 100 236 128 33 207 105 116 196 68 142 109 237 94 29 86 196 190 96 158 51 78 107 53 2 158 62 195 101 125 181 245 191 185 105 37 77 113 109 85 110 93 152 188 115 136 136 93 10 235 225 51 77 110 7 74 32 118 44 157 117 193 127 80 54 2 0 0 0 0 0 0 0 0 56 161 103 132 41 228 199 245 93 101 166 142 168 205 96 95 52 143 127 100 173 175 132 102 181 237 4 42 52 30 10 219 202 27 68 79 23 201 116 89 53 50 85 239 183 254 11 165 100 129 247 0 0 0 0 0 0 1 56 161 103 132 41 228 199 245 93 101 166 142 168 205 96 95 52 143 127 100 173 175 132 102 181 237 4 42 52 30 10 219 202 27 68 79 23 201 116 89 53 50 85 239 183 254 11 165 100 129 247 0 0 0 0 0 0 0 32 255 251 221 115 146 46 163 229 176 14 203 138 27 28 41 62 22 109 49 16 185 119 54 172 191 85 184 0 0 0 0 0 1 32 255 251 221 115 146 46 163 229 176 14 203 138 27 28 41 62 22 109 49 16 185 119 54 172 191 85 184 0 0 0 0 0 0 32 247 33 196 253 43 205 187 127 110 212 213 12 214 143 22 252 209 96 90 89 50 103 47 68 146 216 72 215 61 226 134 3 1 32 247 33 196 253 43 205 187 127 110 212 213 12 214 143 22 252 209 96 90 89 50 103 47 68 146 216 72 215 61 226 134 3 0 40 59 97 19 31 78 83 69 133 60 42 103 67 71 156 83 145 176 67 103 93 114 176 15 117 43 90 82 152 45 121 12 17 76 244 53 1 0 0 0 0 1 40 59 97 19 31 78 83 69 133 60 42 103 67 71 156 83 145 176 67 103 93 114 176 15 117 43 90 82 152 45 121 12 17 76 244 53 1 0 0 0 0 0 56 219 241 133 51 75 86 155 36 83 56 69 111 93 54 193 19 54 88 242 30 144 132 66 61 131 189 217 126 87 64 134 162 139 199 3 85 234 160 230 114 164 25 154 94 87 76 241 251 243 147 109 83 0 0 0 0 1 56 219 241 133 51 75 86 155 36 83 56 69 111 93 54 193 19 54 88 242 30 144 132 66 61 131 189 217 126 87 64 134 162 139 199 3 85 234 160 230 114 164 25 154 94 87 76 241 251 243 147 109 83 0 0 0 0 0 64 43 137 16 132 202 104 91 201 107 180 196 200 93 138 129 13 78 33 73 134 236 116 150 83 184 197 132 23 82 3 247 20 140 181 22 152 27 60 63 98 254 172 152 20 58 101 176 236 139 225 217 61 37 39 22 240 147 101 158 189 117 172 129 3 1 64 43 137 16 132 202 104 91 201 107 180 196 200 93 138 129 13 78 33 73 134 236 116 150 83 184 197 132 23 82 3 247 20 140 181 22 152 27 60 63 98 254 172 152 20 58 101 176 236 139 225 217 61 37 39 22 240 147 101 158 189 117 172 129 3 0 16 174 250 80 27 225 76 117 105 139 6 48 23 21 0 0 0 1 16 174 250 80 27 225 76 117 105 139 6 48 23 21 0 0 0 0 32 79 208 51 133 78 86 8 203 246 180 251 28 21 185 125 159 144 112 64 104 31 37 123 126 115 170 223 1 66 0 0 0 1 32 79 208 51 133 78 86 8 203 246 180 251 28 21 185 125 159 144 112 64 104 31 37 123 126 115 170 223 1 66 0 0 0 0 24 59 170 196 192 162 161 183 242 120 40 171 157 254 236 242 64 223 1 0 0 0 0 0 0 1 24 59 170 196 192 162 161 183 242 120 40 171 157 254 236 242 64 223 1 0 0 0 0 0 0 0 64 158 138 13 99 212 72 79 220 230 16 119 150 64 148 121 100 5 104 182 189 57 158 100 143 129 122 146 11 169 192 52 74 169 74 4 0 229 160 168 226 62 202 182 250 171 51 251 90 159 122 13 111 16 28 141 139 1 41 229 97 17 73 120 0 1 64 158 138 13 99 212 72 79 220 230 16 119 150 64 148 121 100 5 104 182 189 57 158 100 143 129 122 146 11 169 192 52 74 169 74 4 0 229 160 168 226 62 202 182 250 171 51 251 90 159 122 13 111 16 28 141 139 1 41 229 97 17 73 120 0 0 128 54 211 84 85 147 162 152 160 127 96 156 128 144 183 140 26 170 242 255 112 211 16 24 233 93 177 189 62 26 230 8 18 162 102 53 79 255 93 127 37 173 116 119 61 21 221 30 71 51 18 217 197 225 89 208 228 54 16 14 158 40 254 222 6 144 144 95 30 116 51 208 187 221 207 73 40 215 178 180 184 67 243 230 235 85 174 4 118 231 32 148 73 211 37 140 151 196 184 12 41 14 98 78 190 103 107 141 66 52 100 222 58 141 135 84 85 90 76 97 21 18 0 0 0 0 0 0 0 1 128 54 211 84 85 147 162 152 160 127 96 156 128 144 183 140 26 170 242 255 112 211 16 24 233 93 177 189 62 26 230 8 18 162 102 53 79 255 93 127 37 173 116 119 61 21 221 30 71 51 18 217 197 225 89 208 228 54 16 14 158 40 254 222 6 144 144 95 30 116 51 208 187 221 207 73 40 215 178 180 184 67 243 230 235 85 174 4 118 231 32 148 73 211 37 140 151 196 184 12 41 14 98 78 190 103 107 141 66 52 100 222 58 141 135 84 85 90 76 97 21 18 0 0 0 0 0 0 0 0 128 94 236 109 194 205 86 41 192 155 21 79 52 203 207 37 42 40 126 224 32 228 152 22 204 190 205 68 99 253 159 127 249 241 8 5 27 151 203 115 75 236 216 195 28 184 201 166 85 152 106 8 201 248 148 93 54 156 87 135 56 251 121 202 96 173 198 190 134 110 223 180 127 230 136 159 180 9 44 207 255 43 80 213 238 43 117 135 78 121 149 22 24 198 179 157 59 238 245 168 85 45 36 70 88 161 109 52 49 133 96 74 209 106 244 99 200 247 185 127 197 240 97 2 0 0 0 0 0 1 128 94 236 109 194 205 86 41 192 155 21 79 52 203 207 37 42 40 126 224 32 228 152 22 204 190 205 68 99 253 159 127 249 241 8 5 27 151 203 115 75 236 216 195 28 184 201 166 85 152 106 8 201 248 148 93 54 156 87 135 56 251 121 202 96 173 198 190 134 110 223 180 127 230 136 159 180 9 44 207 255 43 80 213 238 43 117 135 78 121 149 22 24 198 179 157 59 238 245 168 85 45 36 70 88 161 109 52 49 133 96 74 209 106 244 99 200 247 185 127 197 240 97 2 0 0 0 0 0 0 128 14 202 151 114 198 177 79 116 173 42 198 179 37 189 161 34 90 109 151 134 15 53 12 218 203 186 227 104 124 114 146 230 193 76 40 120 134 85 85 179 206 122 201 169 68 255 199 58 19 184 117 183 58 105 131 49 120 224 207 113 249 249 52 245 213 117 133 240 15 235 167 111 253 250 71 98 115 41 241 120 23 72 80 150 152 182 145 130 4 69 103 219 252 177 172 87 76 137 67 198 105 98 131 12 8 87 204 104 138 42 101 155 161 225 254 112 96 164 148 113 139 130 6 0 0 0 0 0 1 128 14 202 151 114 198 177 79 116 173 42 198 179 37 189 161 34 90 109 151 134 15 53 12 218 203 186 227 104 124 114 146 230 193 76 40 120 134 85 85 179 206 122 201 169 68 255 199 58 19 184 117 183 58 105 131 49 120 224 207 113 249 249 52 245 213 117 133 240 15 235 167 111 253 250 71 98 115 41 241 120 23 72 80 150 152 182 145 130 4 69 103 219 252 177 172 87 76 137 67 198 105 98 131 12 8 87 204 104 138 42 101 155 161 225 254 112 96 164 148 113 139 130 6 0 0 0 0 0 0 88 222 236 36 90 191 241 183 85 110 108 88 240 111 232 78 103 27 70 144 224 71 76 230 109 75 89 21 251 126 142 18 121 105 170 253 72 64 73 2 238 74 157 109 22 80 12 236 206 45 90 23 64 23 14 190 116 110 37 81 228 238 254 84 202 140 111 243 20 88 246 161 13 249 31 162 155 221 13 64 215 171 161 29 14 0 0 0 0 1 88 222 236 36 90 191 241 183 85 110 108 88 240 111 232 78 103 27 70 144 224 71 76 230 109 75 89 21 251 126 142 18 121 105 170 253 72 64 73 2 238 74 157 109 22 80 12 236 206 45 90 23 64 23 14 190 116 110 37 81 228 238 254 84 202 140 111 243 20 88 246 161 13 249 31 162 155 221 13 64 215 171 161 29 14 0 0 0 0 0 80 69 2 96 19 137 241 75 149 54 240 119 4 53 193 106 38 190 90 56 134 205 201 129 251 62 99 112 152 118 97 184 216 164 110 226 53 156 74 62 42 32 199 114 107 27 36 188 14 59 253 131 97 129 87 74 48 164 130 23 116 217 134 169 80 29 241 90 26 86 7 137 144 117 50 0 0 0 0 0 0 1 80 69 2 96 19 137 241 75 149 54 240 119 4 53 193 106 38 190 90 56 134 205 201 129 251 62 99 112 152 118 97 184 216 164 110 226 53 156 74 62 42 32 199 114 107 27 36 188 14 59 253 131 97 129 87 74 48 164 130 23 116 217 134 169 80 29 241 90 26 86 7 137 144 117 50 0 0 0 0 0 0 0 104 60 2 183 139 129 88 99 244 170 89 0 177 28 40 203 18 239 70 82 138 113 96 148 242 156 70 22 152 221 31 149 38 127 107 45 254 28 166 210 227 215 191 161 12 230 95 230 64 209 16 253 82 63 212 15 119 73 178 25 88 182 249 227 148 207 62 209 192 72 37 56 62 203 161 110 196 250 228 14 19 181 87 35 11 15 255 155 107 206 61 54 223 191 92 51 188 42 0 0 0 0 0 0 0 1 104 60 2 183 139 129 88 99 244 170 89 0 177 28 40 203 18 239 70 82 138 113 96 148 242 156 70 22 152 221 31 149 38 127 107 45 254 28 166 210 227 215 191 161 12 230 95 230 64 209 16 253 82 63 212 15 119 73 178 25 88 182 249 227 148 207 62 209 192 72 37 56 62 203 161 110 196 250 228 14 19 181 87 35 11 15 255 155 107 206 61 54 223 191 92 51 188 42 0 0 0 0 0 0 0 0 8 161 145 84 161 51 102 34 163 1 8 161 145 84 161 51 102 34 163 0 56 160 51 60 244 243 228 49 105 198 184 5 130 241 114 177 248 245 101 241 141 249 87 160 252 119 173 82 11 10 104 49 95 69 254 101 134 79 46 129 192 118 64 243 147 3 51 61 70 176 159 167 235 86 145 44 55 1 56 160 51 60 244 243 228 49 105 198 184 5 130 241 114 177 248 245 101 241 141 249 87 160 252 119 173 82 11 10 104 49 95 69 254 101 134 79 46 129 192 118 64 243 147 3 51 61 70 176 159 167 235 86 145 44 55 0 32 180 181 48 71 211 35 86 174 153 231 246 211 154 205 97 74 237 0 199 183 8 131 127 228 121 26 229 18 39 183 3 0 1 32 180 181 48 71 211 35 86 174 153 231 246 211 154 205 97 74 237 0 199 183 8 131 127 228 121 26 229 18 39 183 3 0 0 72 235 208 249 69 198 27 28 175 48 201 165 210 55 86 150 90 198 36 230 165 54 20 213 19 85 189 110 233 79 254 190 153 19 131 115 116 152 36 49 241 5 53 57 191 108 36 43 245 224 105 242 219 194 163 217 52 122 224 205 161 21 47 142 100 254 80 178 115 134 181 158 0 1 72 235 208 249 69 198 27 28 175 48 201 165 210 55 86 150 90 198 36 230 165 54 20 213 19 85 189 110 233 79 254 190 153 19 131 115 116 152 36 49 241 5 53 57 191 108 36 43 245 224 105 242 219 194 163 217 52 122 224 205 161 21 47 142 100 254 80 178 115 134 181 158 0 0 48 24 216 31 31 121 32 6 35 230 132 116 1 93 231 239 114 29 239 68 226 187 220 209 191 89 111 162 77 90 222 196 5 16 190 98 88 179 228 211 83 191 201 156 101 38 6 0 0 1 48 24 216 31 31 121 32 6 35 230 132 116 1 93 231 239 114 29 239 68 226 187 220 209 191 89 111 162 77 90 222 196 5 16 190 98 88 179 228 211 83 191 201 156 101 38 6 0 0 0 8 120 9 155 198 227 119 139 0 1 8 120 9 155 198 227 119 139 0 0 112 67 233 173 239 2 147 31 164 67 28 157 14 181 143 121 205 94 47 18 212 89 86 192 240 97 248 17 119 22 163 109 127 226 138 109 233 234 45 230 169 33 186 2 126 255 20 183 106 178 83 140 195 205 223 184 177 109 237 177 147 165 5 252 192 192 124 61 142 140 69 133 239 214 170 94 162 222 231 95 68 100 116 183 60 109 34 233 105 48 238 47 153 181 219 232 176 110 180 54 190 173 160 203 79 0 3 0 0 0 0 0 0 1 112 67 233 173 239 2 147 31 164 67 28 157 14 181 143 121 205 94 47 18 212 89 86 192 240 97 248 17 119 22 163 109 127 226 138 109 233 234 45 230 169 33 186 2 126 255 20 183 106 178 83 140 195 205 223 184 177 109 237 177 147 165 5 252 192 192 124 61 142 140 69 133 239 214 170 94 162 222 231 95 68 100 116 183 60 109 34 233 105 48 238 47 153 181 219 232 176 110 180 54 190 173 160 203 79 0 3 0 0 0 0 0 0 0 48 113 179 208 89 229 97 41 83 34 181 248 69 45 117 67 182 227 176 114 161 166 167 142 142 47 25 191 4 182 213 77 37 61 119 165 249 59 176 118 228 161 1 0 0 0 0 0 0 1 48 113 179 208 89 229 97 41 83 34 181 248 69 45 117 67 182 227 176 114 161 166 167 142 142 47 25 191 4 182 213 77 37 61 119 165 249 59 176 118 228 161 1 0 0 0 0 0 0 0 8 205 230 1 0 0 0 0 0 1 8 205 230 1 0 0 0 0 0 0 56 77 166 237 60 159 113 214 225 225 196 126 16 105 189 104 42 252 167 15 186 63 111 11 23 250 53 128 208 225 81 238 136 75 225 4 178 227 11 107 243 121 83 238 164 31 105 2 177 163 135 105 60 0 0 0 0 1 56 77 166 237 60 159 113 214 225 225 196 126 16 105 189 104 42 252 167 15 186 63 111 11 23 250 53 128 208 225 81 238 136 75 225 4 178 227 11 107 243 121 83 238 164 31 105 2 177 163 135 105 60 0 0 0 0 0 8 7 177 200 9 87 48 0 0 1 8 7 177 200 9 87 48 0 0 0 120 95 0 17 198 196 3 168 29 232 224 109 67 23 135 235 50 52 214 192 80 146 255 65 119 139 83 153 210 130 123 45 5 148 58 19 42 240 226 164 159 61 91 236 215 59 183 160 255 155 79 104 47 81 69 79 205 46 250 193 179 14 221 169 205 128 237 109 128 36 7 21 98 118 172 243 166 158 151 127 232 156 225 22 108 82 127 8 238 182 238 200 235 199 229 34 2 128 5 166 74 164 159 85 41 32 254 62 100 188 86 40 138 142 240 122 56 2 0 0 0 1 120 95 0 17 198 196 3 168 29 232 224 109 67 23 135 235 50 52 214 192 80 146 255 65 119 139 83 153 210 130 123 45 5 148 58 19 42 240 226 164 159 61 91 236 215 59 183 160 255 155 79 104 47 81 69 79 205 46 250 193 179 14 221 169 205 128 237 109 128 36 7 21 98 118 172 243 166 158 151 127 232 156 225 22 108 82 127 8 238 182 238 200 235 199 229 34 2 128 5 166 74 164 159 85 41 32 254 62 100 188 86 40 138 142 240 122 56 2 0 0 0 0 24 52 171 120 247 245 238 38 189 200 10 21 246 79 73 111 224 107 101 199 80 238 49 0 0 1 24 52 171 120 247 245 238 38 189 200 10 21 246 79 73 111 224 107 101 199 80 238 49 0 0 0 104 57 158 161 115 39 26 101 249 18 39 40 1 93 199 25 128 79 244 212 44 60 231 196 18 52 157 210 236 197 32 195 30 224 115 47 62 183 108 27 196 234 161 196 225 103 21 202 150 178 236 60 175 217 66 254 151 71 126 230 34 45 143 24 111 88 165 51 57 138 241 251 139 79 160 192 71 182 96 28 48 193 182 46 229 150 230 46 13 249 26 35 98 104 138 125 230 36 173 131 138 29 153 37 15 1 104 57 158 161 115 39 26 101 249 18 39 40 1 93 199 25 128 79 244 212 44 60 231 196 18 52 157 210 236 197 32 195 30 224 115 47 62 183 108 27 196 234 161 196 225 103 21 202 150 178 236 60 175 217 66 254 151 71 126 230 34 45 143 24 111 88 165 51 57 138 241 251 139 79 160 192 71 182 96 28 48 193 182 46 229 150 230 46 13 249 26 35 98 104 138 125 230 36 173 131 138 29 153 37 15 0 88 201 67 176 170 12 214 223 113 151 240 121 127 115 67 246 173 119 207 202 219 102 176 87 124 64 46 160 253 231 56 131 2 167 194 119 80 227 152 34 209 118 189 9 5 175 115 207 20 15 201 85 82 139 3 122 200 232 151 18 106 251 0 202 255 146 176 226 219 69 250 238 111 233 251 3 57 189 253 30 108 224 253 116 0 0 0 0 0 1 88 201 67 176 170 12 214 223 113 151 240 121 127 115 67 246 173 119 207 202 219 102 176 87 124 64 46 160 253 231 56 131 2 167 194 119 80 227 152 34 209 118 189 9 5 175 115 207 20 15 201 85 82 139 3 122 200 232 151 18 106 251 0 202 255 146 176 226 219 69 250 238 111 233 251 3 57 189 253 30 108 224 253 116 0 0 0 0 0 0 40 216 207 22 26 220 111 75 102 80 113 167 57 132 171 148 110 197 33 103 213 177 123 206 218 242 178 9 228 125 117 218 221 76 2 0 0 0 0 0 0 1 40 216 207 22 26 220 111 75 102 80 113 167 57 132 171 148 110 197 33 103 213 177 123 206 218 242 178 9 228 125 117 218 221 76 2 0 0 0 0 0 0 0 96 209 38 226 122 66 37 110 32 0 244 215 135 36 169 50 93 130 191 147 142 209 240 154 14 39 115 83 99 104 166 126 171 89 95 133 0 168 235 114 121 112 237 201 242 105 25 68 88 53 63 4 70 8 16 14 139 78 16 28 216 131 240 108 136 129 244 99 100 247 236 64 222 120 6 100 242 25 164 196 251 190 21 202 16 243 72 23 21 27 253 232 129 65 12 0 0 1 96 209 38 226 122 66 37 110 32 0 244 215 135 36 169 50 93 130 191 147 142 209 240 154 14 39 115 83 99 104 166 126 171 89 95 133 0 168 235 114 121 112 237 201 242 105 25 68 88 53 63 4 70 8 16 14 139 78 16 28 216 131 240 108 136 129 244 99 100 247 236 64 222 120 6 100 242 25 164 196 251 190 21 202 16 243 72 23 21 27 253 232 129 65 12 0 0 0 24 137 7 71 104 123 1 230 162 84 85 84 78 76 1 146 149 3 0 0 0 0 0 0 0 1 24 137 7 71 104 123 1 230 162 84 85 84 78 76 1 146 149 3 0 0 0 0 0 0 0 0 88 17 135 189 91 189 22 119 161 7 236 246 162 42 137 207 149 58 10 147 68 241 83 242 92 176 9 168 195 250 98 204 19 131 82 40 2 115 30 134 119 85 234 171 51 248 6 232 13 126 100 100 208 191 92 68 52 56 79 102 83 41 100 249 214 204 9 147 69 246 254 24 120 21 121 111 194 137 125 190 39 201 58 31 0 0 0 0 0 1 88 17 135 189 91 189 22 119 161 7 236 246 162 42 137 207 149 58 10 147 68 241 83 242 92 176 9 168 195 250 98 204 19 131 82 40 2 115 30 134 119 85 234 171 51 248 6 232 13 126 100 100 208 191 92 68 52 56 79 102 83 41 100 249 214 204 9 147 69 246 254 24 120 21 121 111 194 137 125 190 39 201 58 31 0 0 0 0 0 0 64 174 140 149 163 3 107 111 4 34 250 106 21 208 102 247 217 125 106 201 189 50 165 180 247 173 193 91 219 22 221 135 48 75 167 217 77 123 120 130 238 30 6 129 157 63 162 58 79 199 175 93 130 164 195 209 241 206 111 166 90 218 65 223 2 1 64 174 140 149 163 3 107 111 4 34 250 106 21 208 102 247 217 125 106 201 189 50 165 180 247 173 193 91 219 22 221 135 48 75 167 217 77 123 120 130 238 30 6 129 157 63 162 58 79 199 175 93 130 164 195 209 241 206 111 166 90 218 65 223 2 0 64 94 39 245 99 17 252 182 140 162 112 156 230 137 46 180 2 25 35 78 204 212 30 138 67 63 147 188 132 251 223 228 122 221 52 247 47 60 130 213 221 67 57 251 17 236 100 5 136 157 85 85 137 180 82 210 206 141 57 0 0 0 0 0 0 1 64 94 39 245 99 17 252 182 140 162 112 156 230 137 46 180 2 25 35 78 204 212 30 138 67 63 147 188 132 251 223 228 122 221 52 247 47 60 130 213 221 67 57 251 17 236 100 5 136 157 85 85 137 180 82 210 206 141 57 0 0 0 0 0 0 0 56 130 153 165 204 195 100 32 242 200 177 22 23 48 222 90 173 238 62 11 195 207 31 94 106 111 19 23 102 123 154 11 25 69 140 143 38 27 47 211 73 199 58 157 241 52 98 114 254 14 0 0 0 0 0 0 0 1 56 130 153 165 204 195 100 32 242 200 177 22 23 48 222 90 173 238 62 11 195 207 31 94 106 111 19 23 102 123 154 11 25 69 140 143 38 27 47 211 73 199 58 157 241 52 98 114 254 14 0 0 0 0 0 0 0 0 72 242 139 53 248 243 242 47 139 119 188 176 74 227 81 33 108 130 169 69 136 245 21 31 87 103 135 189 216 110 191 185 187 15 111 235 113 59 97 210 163 3 82 39 248 57 165 173 26 7 64 153 147 109 165 237 85 23 91 144 96 82 212 163 110 172 233 196 20 189 194 1 0 1 72 242 139 53 248 243 242 47 139 119 188 176 74 227 81 33 108 130 169 69 136 245 21 31 87 103 135 189 216 110 191 185 187 15 111 235 113 59 97 210 163 3 82 39 248 57 165 173 26 7 64 153 147 109 165 237 85 23 91 144 96 82 212 163 110 172 233 196 20 189 194 1 0 0 96 63 196 195 103 33 69 53 0 35 106 115 86 145 225 79 206 13 41 97 138 221 49 15 101 120 43 207 2 164 87 76 203 63 18 204 117 208 102 150 11 45 65 74 88 87 11 31 221 40 244 204 108 35 1 221 236 192 33 114 34 255 16 27 102 160 251 229 204 178 67 44 210 45 249 116 212 232 9 246 165 134 232 228 248 94 170 234 243 13 232 1 125 0 0 0 0 1 96 63 196 195 103 33 69 53 0 35 106 115 86 145 225 79 206 13 41 97 138 221 49 15 101 120 43 207 2 164 87 76 203 63 18 204 117 208 102 150 11 45 65 74 88 87 11 31 221 40 244 204 108 35 1 221 236 192 33 114 34 255 16 27 102 160 251 229 204 178 67 44 210 45 249 116 212 232 9 246 165 134 232 228 248 94 170 234 243 13 232 1 125 0 0 0 0 0 40 179 181 131 162 149 183 138 252 30 154 1 146 137 121 52 190 246 1 224 28 36 102 79 202 159 212 210 252 214 150 156 61 194 235 164 133 239 142 0 0 1 40 179 181 131 162 149 183 138 252 30 154 1 146 137 121 52 190 246 1 224 28 36 102 79 202 159 212 210 252 214 150 156 61 194 235 164 133 239 142 0 0 0 40 60 58 79 249 6 113 81 42 62 163 64 45 148 17 196 92 207 75 88 80 225 216 133 32 64 220 110 107 147 131 21 223 245 83 192 232 107 0 0 0 1 40 60 58 79 249 6 113 81 42 62 163 64 45 148 17 196 92 207 75 88 80 225 216 133 32 64 220 110 107 147 131 21 223 245 83 192 232 107 0 0 0 0 96 12 165 17 255 148 106 77 76 190 146 244 60 246 21 69 4 108 6 135 121 71 44 77 148 210 123 228 244 192 7 178 234 75 27 35 56 139 157 89 246 205 166 104 142 71 22 111 74 215 198 253 47 185 250 203 223 186 72 48 140 56 78 5 248 174 81 223 135 55 86 65 183 39 125 199 89 36 113 114 101 100 241 34 118 182 139 64 184 93 41 222 250 83 8 126 2 1 96 12 165 17 255 148 106 77 76 190 146 244 60 246 21 69 4 108 6 135 121 71 44 77 148 210 123 228 244 192 7 178 234 75 27 35 56 139 157 89 246 205 166 104 142 71 22 111 74 215 198 253 47 185 250 203 223 186 72 48 140 56 78 5 248 174 81 223 135 55 86 65 183 39 125 199 89 36 113 114 101 100 241 34 118 182 139 64 184 93 41 222 250 83 8 126 2 0 80 194 39 168 144 47 63 164 168 230 144 217 13 24 96 155 100 12 59 177 151 216 92 228 192 145 88 206 81 45 221 226 39 93 88 12 250 68 153 137 36 20 58 0 113 35 195 22 121 71 66 8 241 39 201 196 133 230 128 125 7 217 82 221 87 57 93 151 146 24 13 11 157 51 151 229 8 102 193 170 254 1 80 194 39 168 144 47 63 164 168 230 144 217 13 24 96 155 100 12 59 177 151 216 92 228 192 145 88 206 81 45 221 226 39 93 88 12 250 68 153 137 36 20 58 0 113 35 195 22 121 71 66 8 241 39 201 196 133 230 128 125 7 217 82 221 87 57 93 151 146 24 13 11 157 51 151 229 8 102 193 170 254 0 32 115 165 0 181 114 222 7 59 3 124 183 26 196 172 167 125 136 168 200 232 107 92 130 217 10 0 0 0 0 0 0 0 1 32 115 165 0 181 114 222 7 59 3 124 183 26 196 172 167 125 136 168 200 232 107 92 130 217 10 0 0 0 0 0 0 0 0 104 236 68 87 125 155 29 32 62 230 30 136 150 217 197 37 30 35 255 242 108 93 176 111 33 250 237 114 238 160 77 113 171 147 43 61 144 12 84 87 115 160 128 222 109 180 248 55 195 181 75 255 203 79 219 130 244 94 36 238 156 212 175 171 162 174 87 117 209 113 175 106 193 36 21 66 244 243 166 248 81 121 94 110 189 10 52 188 102 198 136 150 183 191 180 96 29 51 207 65 251 163 177 216 188 1 104 236 68 87 125 155 29 32 62 230 30 136 150 217 197 37 30 35 255 242 108 93 176 111 33 250 237 114 238 160 77 113 171 147 43 61 144 12 84 87 115 160 128 222 109 180 248 55 195 181 75 255 203 79 219 130 244 94 36 238 156 212 175 171 162 174 87 117 209 113 175 106 193 36 21 66 244 243 166 248 81 121 94 110 189 10 52 188 102 198 136 150 183 191 180 96 29 51 207 65 251 163 177 216 188 0 88 199 62 219 38 224 64 98 122 250 132 90 246 191 177 175 129 238 74 103 140 144 205 156 27 249 53 223 251 192 95 121 104 139 113 181 72 177 157 33 140 244 253 143 104 230 164 205 233 17 33 203 84 40 89 149 26 16 144 238 213 168 166 242 186 189 255 169 165 234 16 127 90 100 62 217 16 139 41 102 89 93 97 62 95 147 122 238 237 1 88 199 62 219 38 224 64 98 122 250 132 90 246 191 177 175 129 238 74 103 140 144 205 156 27 249 53 223 251 192 95 121 104 139 113 181 72 177 157 33 140 244 253 143 104 230 164 205 233 17 33 203 84 40 89 149 26 16 144 238 213 168 166 242 186 189 255 169 165 234 16 127 90 100 62 217 16 139 41 102 89 93 97 62 95 147 122 238 237 0 48 45 84 26 33 30 184 117 77 114 45 211 193 64 207 224 237 136 114 3 145 150 20 213 238 240 36 201 64 122 69 244 22 129 142 201 1 185 151 174 233 1 0 0 0 0 0 0 0 1 48 45 84 26 33 30 184 117 77 114 45 211 193 64 207 224 237 136 114 3 145 150 20 213 238 240 36 201 64 122 69 244 22 129 142 201 1 185 151 174 233 1 0 0 0 0 0 0 0 0 24 118 96 110 163 151 234 7 30 202 198 169 47 210 145 198 195 223 20 211 133 162 187 75 48 1 24 118 96 110 163 151 234 7 30 202 198 169 47 210 145 198 195 223 20 211 133 162 187 75 48 0 56 166 132 83 15 114 76 5 198 105 107 64 21 201 37 152 38 123 234 29 114 185 178 23 194 54 124 93 52 128 139 153 108 32 85 243 44 247 113 25 108 194 143 136 29 222 174 212 74 73 19 0 0 0 0 0 0 1 56 166 132 83 15 114 76 5 198 105 107 64 21 201 37 152 38 123 234 29 114 185 178 23 194 54 124 93 52 128 139 153 108 32 85 243 44 247 113 25 108 194 143 136 29 222 174 212 74 73 19 0 0 0 0 0 0 0 48 123 248 179 54 119 191 224 218 82 168 17 9 213 235 78 184 70 111 32 105 157 160 212 123 240 230 248 188 30 46 115 251 167 248 212 75 179 20 91 203 47 80 142 34 152 174 246 1 1 48 123 248 179 54 119 191 224 218 82 168 17 9 213 235 78 184 70 111 32 105 157 160 212 123 240 230 248 188 30 46 115 251 167 248 212 75 179 20 91 203 47 80 142 34 152 174 246 1 0 48 156 96 100 244 230 81 145 6 56 18 242 19 211 56 11 208 136 192 193 247 21 84 210 245 251 22 164 190 142 62 191 235 148 86 107 108 228 229 161 113 8 169 132 37 3 0 0 0 1 48 156 96 100 244 230 81 145 6 56 18 242 19 211 56 11 208 136 192 193 247 21 84 210 245 251 22 164 190 142 62 191 235 148 86 107 108 228 229 161 113 8 169 132 37 3 0 0 0 0 88 253 53 33 48 131 189 25 65 204 174 99 186 204 72 230 129 192 106 8 141 23 186 143 8 176 75 97 190 2 190 127 52 92 22 252 200 15 45 98 21 11 157 128 28 145 217 54 150 99 213 145 99 58 65 64 149 218 156 253 58 0 9 210 203 145 96 237 185 130 70 116 6 209 240 157 58 59 8 33 55 1 0 0 0 0 0 0 0 1 88 253 53 33 48 131 189 25 65 204 174 99 186 204 72 230 129 192 106 8 141 23 186 143 8 176 75 97 190 2 190 127 52 92 22 252 200 15 45 98 21 11 157 128 28 145 217 54 150 99 213 145 99 58 65 64 149 218 156 253 58 0 9 210 203 145 96 237 185 130 70 116 6 209 240 157 58 59 8 33 55 1 0 0 0 0 0 0 0 0 112 140 139 49 207 205 64 240 199 59 87 85 34 45 23 247 226 20 175 76 118 24 188 97 163 249 238 130 105 219 76 167 90 29 31 159 229 181 73 152 183 74 134 209 139 34 200 210 113 231 227 99 224 196 220 80 243 62 167 195 5 201 123 178 100 95 190 235 171 32 64 54 178 111 83 175 134 22 73 175 164 79 39 170 74 102 74 233 210 216 226 3 131 100 81 201 127 195 224 208 29 109 171 156 77 11 0 0 0 0 0 0 0 1 112 140 139 49 207 205 64 240 199 59 87 85 34 45 23 247 226 20 175 76 118 24 188 97 163 249 238 130 105 219 76 167 90 29 31 159 229 181 73 152 183 74 134 209 139 34 200 210 113 231 227 99 224 196 220 80 243 62 167 195 5 201 123 178 100 95 190 235 171 32 64 54 178 111 83 175 134 22 73 175 164 79 39 170 74 102 74 233 210 216 226 3 131 100 81 201 127 195 224 208 29 109 171 156 77 11 0 0 0 0 0 0 0 0 104 222 231 217 128 82 99 10 214 110 228 128 78 114 45 119 81 180 185 243 203 206 92 162 40 82 46 54 187 93 28 152 69 4 123 103 77 208 204 181 235 42 147 170 143 2 139 154 218 144 51 223 215 163 89 75 72 123 205 0 240 64 100 207 207 158 197 65 249 187 175 80 167 154 152 209 32 55 42 171 219 232 238 66 244 61 205 209 141 94 43 111 8 205 151 59 230 205 24 205 241 0 0 0 0 1 104 222 231 217 128 82 99 10 214 110 228 128 78 114 45 119 81 180 185 243 203 206 92 162 40 82 46 54 187 93 28 152 69 4 123 103 77 208 204 181 235 42 147 170 143 2 139 154 218 144 51 223 215 163 89 75 72 123 205 0 240 64 100 207 207 158 197 65 249 187 175 80 167 154 152 209 32 55 42 171 219 232 238 66 244 61 205 209 141 94 43 111 8 205 151 59 230 205 24 205 241 0 0 0 0 0 88 207 251 142 39 144 108 252 57 106 73 11 186 19 131 187 69 26 149 177 211 238 136 251 62 89 7 238 7 115 168 92 155 211 100 253 171 162 138 116 33 152 91 134 33 55 71 164 201 152 4 49 26 55 186 161 250 57 85 28 39 171 17 196 138 245 10 0 73 155 144 183 97 4 3 242 240 169 248 22 116 210 225 61 191 6 115 0 0 1 88 207 251 142 39 144 108 252 57 106 73 11 186 19 131 187 69 26 149 177 211 238 136 251 62 89 7 238 7 115 168 92 155 211 100 253 171 162 138 116 33 152 91 134 33 55 71 164 201 152 4 49 26 55 186 161 250 57 85 28 39 171 17 196 138 245 10 0 73 155 144 183 97 4 3 242 240 169 248 22 116 210 225 61 191 6 115 0 0 0 16 137 130 140 24 236 12 214 199 10 105 31 0 0 0 0 0 1 16 137 130 140 24 236 12 214 199 10 105 31 0 0 0 0 0 0 56 108 175 196 156 55 213 72 113 207 244 180 56 88 213 35 165 75 248 211 20 212 57 60 188 217 211 48 37 134 141 243 246 161 245 39 195 123 248 138 183 15 28 111 146 50 155 93 170 4 0 0 0 0 0 0 0 1 56 108 175 196 156 55 213 72 113 207 244 180 56 88 213 35 165 75 248 211 20 212 57 60 188 217 211 48 37 134 141 243 246 161 245 39 195 123 248 138 183 15 28 111 146 50 155 93 170 4 0 0 0 0 0 0 0 0 120 112 113 30 136 233 190 54 137 121 169 50 162 49 32 173 179 18 162 50 40 203 206 65 185 66 186 230 219 176 80 103 123 27 250 226 122 23 191 77 80 214 47 76 55 89 65 20 139 103 231 246 32 248 93 179 33 222 25 246 60 212 174 114 116 72 105 47 23 51 143 138 172 27 39 246 135 133 254 162 107 108 22 2 166 141 243 6 251 77 176 135 206 2 231 124 148 132 69 84 79 111 64 235 234 76 164 46 49 159 31 188 209 182 60 173 197 202 76 16 0 1 120 112 113 30 136 233 190 54 137 121 169 50 162 49 32 173 179 18 162 50 40 203 206 65 185 66 186 230 219 176 80 103 123 27 250 226 122 23 191 77 80 214 47 76 55 89 65 20 139 103 231 246 32 248 93 179 33 222 25 246 60 212 174 114 116 72 105 47 23 51 143 138 172 27 39 246 135 133 254 162 107 108 22 2 166 141 243 6 251 77 176 135 206 2 231 124 148 132 69 84 79 111 64 235 234 76 164 46 49 159 31 188 209 182 60 173 197 202 76 16 0 0 64 47 160 84 82 9 238 207 219 151 156 134 131 89 62 11 68 11 147 237 99 121 15 73 200 84 95 87 214 232 187 96 240 53 52 195 55 200 190 88 28 76 29 80 151 156 97 63 20 181 127 200 147 98 254 76 151 61 118 77 0 0 0 0 0 1 64 47 160 84 82 9 238 207 219 151 156 134 131 89 62 11 68 11 147 237 99 121 15 73 200 84 95 87 214 232 187 96 240 53 52 195 55 200 190 88 28 76 29 80 151 156 97 63 20 181 127 200 147 98 254 76 151 61 118 77 0 0 0 0 0 0 104 238 56 196 120 62 80 239 58 25 190 123 255 60 22 240 193 64 200 155 205 65 125 162 46 114 82 168 130 71 226 104 252 45 143 77 84 254 194 132 208 96 195 7 173 173 156 202 242 175 234 16 37 97 18 174 179 230 94 208 69 94 78 160 223 97 151 58 36 237 203 214 110 180 89 134 104 29 12 23 140 193 36 70 29 183 50 17 167 28 12 196 65 172 236 156 91 251 73 127 1 0 0 0 0 1 104 238 56 196 120 62 80 239 58 25 190 123 255 60 22 240 193 64 200 155 205 65 125 162 46 114 82 168 130 71 226 104 252 45 143 77 84 254 194 132 208 96 195 7 173 173 156 202 242 175 234 16 37 97 18 174 179 230 94 208 69 94 78 160 223 97 151 58 36 237 203 214 110 180 89 134 104 29 12 23 140 193 36 70 29 183 50 17 167 28 12 196 65 172 236 156 91 251 73 127 1 0 0 0 0 0 40 149 114 1 116 102 17 2 174 6 173 97 185 176 52 172 147 84 122 233 135 57 32 185 232 151 166 16 42 84 99 130 237 14 101 51 119 173 115 53 0 1 40 149 114 1 116 102 17 2 174 6 173 97 185 176 52 172 147 84 122 233 135 57 32 185 232 151 166 16 42 84 99 130 237 14 101 51 119 173 115 53 0 0 64 242 217 97 202 37 38 150 206 207 10 52 100 102 27 105 39 214 77 170 228 242 244 122 45 230 139 116 113 248 171 76 193 78 80 198 37 181 97 228 185 29 21 241 62 210 131 193 6 1 89 93 123 149 252 254 234 21 49 121 54 70 123 12 0 1 64 242 217 97 202 37 38 150 206 207 10 52 100 102 27 105 39 214 77 170 228 242 244 122 45 230 139 116 113 248 171 76 193 78 80 198 37 181 97 228 185 29 21 241 62 210 131 193 6 1 89 93 123 149 252 254 234 21 49 121 54 70 123 12 0 0 120 126 216 172 15 25 129 241 98 17 2 168 135 214 24 154 85 56 125 146 150 225 161 82 46 26 201 64 204 132 245 111 192 88 211 123 3 119 58 58 245 118 104 138 91 147 19 185 226 101 33 139 62 235 15 91 204 29 220 53 8 11 61 142 142 93 77 162 71 38 142 116 213 43 79 225 85 174 86 234 214 249 189 86 69 229 181 99 122 154 144 192 66 13 218 96 118 124 80 14 168 5 230 111 79 37 76 42 49 185 18 80 157 188 50 80 199 22 0 0 0 1 120 126 216 172 15 25 129 241 98 17 2 168 135 214 24 154 85 56 125 146 150 225 161 82 46 26 201 64 204 132 245 111 192 88 211 123 3 119 58 58 245 118 104 138 91 147 19 185 226 101 33 139 62 235 15 91 204 29 220 53 8 11 61 142 142 93 77 162 71 38 142 116 213 43 79 225 85 174 86 234 214 249 189 86 69 229 181 99 122 154 144 192 66 13 218 96 118 124 80 14 168 5 230 111 79 37 76 42 49 185 18 80 157 188 50 80 199 22 0 0 0 0 56 243 53 196 121 165 92 144 118 3 3 222 84 206 144 5 157 57 16 134 139 198 69 129 221 11 133 183 218 71 108 13 56 83 246 113 103 6 198 202 227 68 93 146 59 161 12 248 177 166 51 150 47 96 161 239 236 1 56 243 53 196 121 165 92 144 118 3 3 222 84 206 144 5 157 57 16 134 139 198 69 129 221 11 133 183 218 71 108 13 56 83 246 113 103 6 198 202 227 68 93 146 59 161 12 248 177 166 51 150 47 96 161 239 236 0 64 153 28 132 11 210 222 158 84 204 251 210 22 227 11 36 206 23 140 161 60 159 143 123 206 191 31 7 46 144 178 243 58 169 39 112 174 47 119 109 7 130 69 51 2 125 253 241 144 64 234 96 3 245 113 8 190 14 182 65 46 222 249 3 0 1 64 153 28 132 11 210 222 158 84 204 251 210 22 227 11 36 206 23 140 161 60 159 143 123 206 191 31 7 46 144 178 243 58 169 39 112 174 47 119 109 7 130 69 51 2 125 253 241 144 64 234 96 3 245 113 8 190 14 182 65 46 222 249 3 0 0 64 98 185 79 194 105 170 12 86 252 124 124 192 23 205 211 77 162 50 205 89 40 158 46 179 237 22 171 26 56 121 32 6 69 111 60 114 251 180 204 199 96 135 46 64 144 243 102 201 99 166 113 208 152 168 179 161 1 6 0 0 0 0 0 0 1 64 98 185 79 194 105 170 12 86 252 124 124 192 23 205 211 77 162 50 205 89 40 158 46 179 237 22 171 26 56 121 32 6 69 111 60 114 251 180 204 199 96 135 46 64 144 243 102 201 99 166 113 208 152 168 179 161 1 6 0 0 0 0 0 0 0 104 142 26 227 150 238 69 151 6 3 30 46 190 46 96 134 217 131 85 161 92 34 208 158 197 175 196 117 64 216 114 195 81 101 252 52 106 185 71 47 193 32 27 53 120 25 14 193 3 5 106 149 116 208 152 66 126 218 195 178 209 4 241 87 44 185 217 57 224 49 139 77 191 217 218 19 215 78 14 143 87 180 5 177 20 62 54 52 235 79 31 44 20 98 23 221 250 34 0 0 0 0 0 0 0 1 104 142 26 227 150 238 69 151 6 3 30 46 190 46 96 134 217 131 85 161 92 34 208 158 197 175 196 117 64 216 114 195 81 101 252 52 106 185 71 47 193 32 27 53 120 25 14 193 3 5 106 149 116 208 152 66 126 218 195 178 209 4 241 87 44 185 217 57 224 49 139 77 191 217 218 19 215 78 14 143 87 180 5 177 20 62 54 52 235 79 31 44 20 98 23 221 250 34 0 0 0 0 0 0 0 0 40 32 168 235 44 56 166 243 210 154 91 226 40 229 249 145 209 125 211 169 133 252 161 224 125 81 253 117 254 153 178 166 34 26 180 249 135 33 222 152 13 1 40 32 168 235 44 56 166 243 210 154 91 226 40 229 249 145 209 125 211 169 133 252 161 224 125 81 253 117 254 153 178 166 34 26 180 249 135 33 222 152 13 0 16 114 51 72 217 92 64 168 124 50 132 58 208 128 106 1 0 1 16 114 51 72 217 92 64 168 124 50 132 58 208 128 106 1 0 0 72 69 4 0 153 42 90 20 74 230 90 168 97 72 101 100 19 28 241 147 219 3 93 60 246 145 183 55 230 232 224 115 211 143 158 209 214 247 84 89 209 186 139 133 34 124 5 207 184 125 115 201 88 222 241 97 109 108 6 13 211 125 187 117 94 222 2 0 0 0 0 0 0 1 72 69 4 0 153 42 90 20 74 230 90 168 97 72 101 100 19 28 241 147 219 3 93 60 246 145 183 55 230 232 224 115 211 143 158 209 214 247 84 89 209 186 139 133 34 124 5 207 184 125 115 201 88 222 241 97 109 108 6 13 211 125 187 117 94 222 2 0 0 0 0 0 0 0 56 153 84 205 104 19 159 225 153 148 74 194 235 72 23 144 76 152 243 229 1 90 189 92 32 175 52 88 183 242 20 84 239 175 56 99 222 31 211 114 93 122 135 65 160 226 51 48 207 12 116 28 0 0 0 0 0 1 56 153 84 205 104 19 159 225 153 148 74 194 235 72 23 144 76 152 243 229 1 90 189 92 32 175 52 88 183 242 20 84 239 175 56 99 222 31 211 114 93 122 135 65 160 226 51 48 207 12 116 28 0 0 0 0 0 0 72 245 53 109 105 191 82 1 66 103 122 80 160 241 193 52 254 117 182 127 138 99 142 106 221 128 239 15 222 14 129 176 110 43 113 122 176 232 88 250 58 0 161 215 14 126 59 139 23 140 13 122 239 14 189 40 72 35 18 82 213 254 53 121 213 234 12 0 0 0 0 0 0 1 72 245 53 109 105 191 82 1 66 103 122 80 160 241 193 52 254 117 182 127 138 99 142 106 221 128 239 15 222 14 129 176 110 43 113 122 176 232 88 250 58 0 161 215 14 126 59 139 23 140 13 122 239 14 189 40 72 35 18 82 213 254 53 121 213 234 12 0 0 0 0 0 0 0 112 159 8 16 9 71 195 199 198 21 242 159 80 249 120 17 254 76 140 121 166 78 213 92 89 178 160 20 177 8 14 182 122 65 115 133 119 121 16 112 118 105 211 205 62 12 236 55 80 1 131 163 0 83 205 178 80 88 102 233 133 195 61 239 174 246 227 234 216 85 176 76 5 36 121 112 51 212 181 246 245 241 105 195 137 147 72 56 237 179 190 73 134 142 177 146 141 8 159 112 222 16 234 231 234 198 20 89 52 189 194 119 1 1 112 159 8 16 9 71 195 199 198 21 242 159 80 249 120 17 254 76 140 121 166 78 213 92 89 178 160 20 177 8 14 182 122 65 115 133 119 121 16 112 118 105 211 205 62 12 236 55 80 1 131 163 0 83 205 178 80 88 102 233 133 195 61 239 174 246 227 234 216 85 176 76 5 36 121 112 51 212 181 246 245 241 105 195 137 147 72 56 237 179 190 73 134 142 177 146 141 8 159 112 222 16 234 231 234 198 20 89 52 189 194 119 1 0 112 80 214 13 177 215 159 125 169 151 12 42 72 121 18 76 208 238 240 149 68 234 73 20 164 91 171 220 52 255 98 21 228 111 4 175 56 163 222 123 128 30 97 59 67 228 49 187 237 223 220 86 109 144 229 187 251 70 7 146 195 116 106 122 232 185 78 78 58 225 39 134 160 118 235 208 242 69 148 226 101 73 25 136 159 25 99 137 101 248 54 26 247 229 7 34 61 19 28 201 190 36 74 102 133 25 0 0 0 0 0 0 0 1 112 80 214 13 177 215 159 125 169 151 12 42 72 121 18 76 208 238 240 149 68 234 73 20 164 91 171 220 52 255 98 21 228 111 4 175 56 163 222 123 128 30 97 59 67 228 49 187 237 223 220 86 109 144 229 187 251 70 7 146 195 116 106 122 232 185 78 78 58 225 39 134 160 118 235 208 242 69 148 226 101 73 25 136 159 25 99 137 101 248 54 26 247 229 7 34 61 19 28 201 190 36 74 102 133 25 0 0 0 0 0 0 0 0 48 214 54 94 179 164 240 155 40 191 186 107 180 206 48 82 137 213 91 241 62 39 183 229 184 237 121 223 179 199 117 185 240 244 56 38 125 32 5 140 166 122 78 243 77 252 116 1 0 1 48 214 54 94 179 164 240 155 40 191 186 107 180 206 48 82 137 213 91 241 62 39 183 229 184 237 121 223 179 199 117 185 240 244 56 38 125 32 5 140 166 122 78 243 77 252 116 1 0 0 104 54 55 200 109 82 156 202 152 175 66 36 193 252 78 5 135 125 117 139 57 40 153 71 77 232 6 37 188 28 77 2 71 137 173 143 223 127 105 125 144 234 178 168 38 38 22 213 12 86 146 58 86 128 124 44 36 53 34 45 2 168 71 121 160 250 8 153 10 51 71 123 250 225 95 140 177 159 103 47 148 120 154 141 97 250 155 186 25 61 104 158 48 167 246 20 132 6 84 93 66 112 47 0 0 1 104 54 55 200 109 82 156 202 152 175 66 36 193 252 78 5 135 125 117 139 57 40 153 71 77 232 6 37 188 28 77 2 71 137 173 143 223 127 105 125 144 234 178 168 38 38 22 213 12 86 146 58 86 128 124 44 36 53 34 45 2 168 71 121 160 250 8 153 10 51 71 123 250 225 95 140 177 159 103 47 148 120 154 141 97 250 155 186 25 61 104 158 48 167 246 20 132 6 84 93 66 112 47 0 0 0 120 6 90 182 206 193 58 216 170 220 9 22 52 156 242 120 157 30 209 26 98 51 196 178 88 228 65 154 229 210 70 170 198 64 16 247 102 16 21 58 87 235 200 244 76 203 136 132 209 76 195 94 143 2 113 149 235 158 1 227 205 1 208 16 81 131 189 40 241 92 36 170 156 224 56 199 188 154 79 125 102 121 78 97 150 233 11 79 62 109 25 212 226 161 220 35 23 232 13 90 56 183 223 124 31 159 158 14 223 62 85 83 193 110 187 158 93 203 8 0 0 1 120 6 90 182 206 193 58 216 170 220 9 22 52 156 242 120 157 30 209 26 98 51 196 178 88 228 65 154 229 210 70 170 198 64 16 247 102 16 21 58 87 235 200 244 76 203 136 132 209 76 195 94 143 2 113 149 235 158 1 227 205 1 208 16 81 131 189 40 241 92 36 170 156 224 56 199 188 154 79 125 102 121 78 97 150 233 11 79 62 109 25 212 226 161 220 35 23 232 13 90 56 183 223 124 31 159 158 14 223 62 85 83 193 110 187 158 93 203 8 0 0 0 88 47 45 238 181 215 239 242 99 34 179 237 146 38 184 178 32 39 156 91 232 37 68 223 154 247 174 99 147 112 220 68 13 168 71 188 111 58 166 58 109 244 156 76 173 12 217 7 247 229 168 222 84 82 81 171 9 74 74 20 144 71 106 164 117 234 163 235 12 58 184 167 68 145 254 103 0 233 175 219 91 115 45 23 0 0 0 0 0 1 88 47 45 238 181 215 239 242 99 34 179 237 146 38 184 178 32 39 156 91 232 37 68 223 154 247 174 99 147 112 220 68 13 168 71 188 111 58 166 58 109 244 156 76 173 12 217 7 247 229 168 222 84 82 81 171 9 74 74 20 144 71 106 164 117 234 163 235 12 58 184 167 68 145 254 103 0 233 175 219 91 115 45 23 0 0 0 0 0 0 72 40 180 241 104 90 252 242 234 235 240 236 39 250 255 76 167 29 116 156 87 88 207 205 175 125 89 77 12 21 97 61 253 152 65 25 101 5 139 108 225 153 138 24 18 112 100 115 211 39 249 92 242 104 78 15 126 214 21 35 238 183 248 195 174 170 41 249 203 160 8 0 0 1 72 40 180 241 104 90 252 242 234 235 240 236 39 250 255 76 167 29 116 156 87 88 207 205 175 125 89 77 12 21 97 61 253 152 65 25 101 5 139 108 225 153 138 24 18 112 100 115 211 39 249 92 242 104 78 15 126 214 21 35 238 183 248 195 174 170 41 249 203 160 8 0 0 0 56 22 27 151 194 115 92 119 11 236 51 137 144 137 103 129 95 89 105 130 240 243 170 243 35 191 215 206 102 95 172 26 80 149 177 248 238 54 111 45 244 22 23 22 224 158 95 94 118 19 0 0 0 0 0 0 0 1 56 22 27 151 194 115 92 119 11 236 51 137 144 137 103 129 95 89 105 130 240 243 170 243 35 191 215 206 102 95 172 26 80 149 177 248 238 54 111 45 244 22 23 22 224 158 95 94 118 19 0 0 0 0 0 0 0 0 24 156 43 16 56 55 4 61 155 177 58 74 163 225 4 11 131 179 24 1 0 0 0 0 0 1 24 156 43 16 56 55 4 61 155 177 58 74 163 225 4 11 131 179 24 1 0 0 0 0 0 0 104 73 76 101 151 31 35 209 56 36 69 31 173 147 81 94 123 172 22 210 79 45 203 20 140 58 218 46 34 183 138 96 94 97 161 218 71 10 21 254 228 117 64 245 83 14 74 129 103 121 90 57 125 205 210 39 213 162 107 185 36 194 249 86 241 82 226 200 210 202 80 195 105 63 67 249 109 65 100 248 77 32 184 210 162 76 62 215 70 139 167 97 35 196 73 132 172 243 85 144 160 14 20 22 193 1 104 73 76 101 151 31 35 209 56 36 69 31 173 147 81 94 123 172 22 210 79 45 203 20 140 58 218 46 34 183 138 96 94 97 161 218 71 10 21 254 228 117 64 245 83 14 74 129 103 121 90 57 125 205 210 39 213 162 107 185 36 194 249 86 241 82 226 200 210 202 80 195 105 63 67 249 109 65 100 248 77 32 184 210 162 76 62 215 70 139 167 97 35 196 73 132 172 243 85 144 160 14 20 22 193 0 32 126 1 30 104 79 113 99 127 177 76 179 201 53 24 182 29 192 54 96 132 91 248 133 211 86 2 0 0 0 0 0 0 1 32 126 1 30 104 79 113 99 127 177 76 179 201 53 24 182 29 192 54 96 132 91 248 133 211 86 2 0 0 0 0 0 0 0 72 92 159 45 128 70 93 245 63 92 118 241 226 212 23 182 127 131 42 229 253 64 210 240 253 132 150 70 236 28 94 44 2 105 246 1 151 224 138 233 135 254 20 25 124 118 13 182 172 20 197 252 20 174 143 186 57 51 58 222 119 36 51 0 104 163 78 183 107 2 0 0 0 1 72 92 159 45 128 70 93 245 63 92 118 241 226 212 23 182 127 131 42 229 253 64 210 240 253 132 150 70 236 28 94 44 2 105 246 1 151 224 138 233 135 254 20 25 124 118 13 182 172 20 197 252 20 174 143 186 57 51 58 222 119 36 51 0 104 163 78 183 107 2 0 0 0 0 128 74 103 198 93 113 70 83 77 90 199 193 206 145 183 35 249 192 236 161 64 7 17 137 53 0 187 116 255 249 232 191 215 71 6 51 192 57 52 156 221 118 241 145 238 148 141 72 31 162 90 235 117 210 45 34 240 215 118 239 161 128 10 59 244 108 240 132 108 62 94 40 142 165 219 48 78 211 95 143 5 181 44 128 205 117 175 172 46 236 144 98 44 44 86 152 86 44 46 101 89 209 229 168 49 93 54 154 211 126 167 37 43 164 36 251 17 187 90 218 47 68 10 0 0 0 0 0 0 1 128 74 103 198 93 113 70 83 77 90 199 193 206 145 183 35 249 192 236 161 64 7 17 137 53 0 187 116 255 249 232 191 215 71 6 51 192 57 52 156 221 118 241 145 238 148 141 72 31 162 90 235 117 210 45 34 240 215 118 239 161 128 10 59 244 108 240 132 108 62 94 40 142 165 219 48 78 211 95 143 5 181 44 128 205 117 175 172 46 236 144 98 44 44 86 152 86 44 46 101 89 209 229 168 49 93 54 154 211 126 167 37 43 164 36 251 17 187 90 218 47 68 10 0 0 0 0 0 0 0 48 5 35 182 112 113 188 253 125 124 37 72 205 161 238 42 235 141 207 222 101 115 216 55 107 133 114 20 89 39 233 135 120 225 238 214 101 146 108 76 33 35 58 202 67 65 1 0 0 1 48 5 35 182 112 113 188 253 125 124 37 72 205 161 238 42 235 141 207 222 101 115 216 55 107 133 114 20 89 39 233 135 120 225 238 214 101 146 108 76 33 35 58 202 67 65 1 0 0 0 128 104 135 234 221 147 43 69 249 95 82 22 184 215 149 229 138 106 92 255 169 236 121 106 240 235 221 243 154 22 155 148 218 188 88 136 234 72 234 250 14 92 227 117 188 12 118 41 224 174 244 46 222 46 196 200 235 191 13 185 217 77 182 148 203 3 127 173 173 34 254 84 187 72 234 176 92 208 9 125 82 232 207 39 192 114 153 168 166 210 148 43 5 225 117 107 205 99 179 177 46 90 12 119 11 225 27 124 151 136 98 153 156 122 129 197 79 159 225 89 237 180 211 34 198 224 232 1 0 1 128 104 135 234 221 147 43 69 249 95 82 22 184 215 149 229 138 106 92 255 169 236 121 106 240 235 221 243 154 22 155 148 218 188 88 136 234 72 234 250 14 92 227 117 188 12 118 41 224 174 244 46 222 46 196 200 235 191 13 185 217 77 182 148 203 3 127 173 173 34 254 84 187 72 234 176 92 208 9 125 82 232 207 39 192 114 153 168 166 210 148 43 5 225 117 107 205 99 179 177 46 90 12 119 11 225 27 124 151 136 98 153 156 122 129 197 79 159 225 89 237 180 211 34 198 224 232 1 0 0 128 30 16 152 189 248 187 194 106 86 218 107 172 24 210 165 36 4 181 124 54 238 59 132 56 110 109 236 68 95 102 145 133 240 159 128 36 169 4 207 140 229 186 242 94 18 174 89 159 26 138 112 65 245 118 85 137 113 110 126 144 76 37 227 235 138 77 233 26 84 155 51 80 31 201 113 46 222 200 95 96 232 140 13 80 38 36 30 104 180 121 216 89 15 185 161 136 55 32 42 160 149 50 168 225 1 104 50 30 10 3 96 136 60 23 224 146 203 81 219 70 1 0 0 0 0 0 0 0 1 128 30 16 152 189 248 187 194 106 86 218 107 172 24 210 165 36 4 181 124 54 238 59 132 56 110 109 236 68 95 102 145 133 240 159 128 36 169 4 207 140 229 186 242 94 18 174 89 159 26 138 112 65 245 118 85 137 113 110 126 144 76 37 227 235 138 77 233 26 84 155 51 80 31 201 113 46 222 200 95 96 232 140 13 80 38 36 30 104 180 121 216 89 15 185 161 136 55 32 42 160 149 50 168 225 1 104 50 30 10 3 96 136 60 23 224 146 203 81 219 70 1 0 0 0 0 0 0 0 0 32 31 3 148 175 154 99 152 211 246 153 40 92 93 24 93 5 168 109 224 21 185 107 37 219 63 153 164 130 241 93 111 0 1 32 31 3 148 175 154 99 152 211 246 153 40 92 93 24 93 5 168 109 224 21 185 107 37 219 63 153 164 130 241 93 111 0 0 112 73 246 239 200 138 198 5 244 5 61 186 215 203 39 176 220 88 141 123 23 70 239 91 228 24 9 208 86 173 30 190 190 160 205 169 222 186 254 3 42 110 229 120 37 181 245 217 107 172 221 147 223 37 33 9 82 153 101 228 62 236 28 113 251 178 124 157 88 255 13 110 233 60 45 129 160 39 244 17 113 220 114 236 12 12 23 203 127 173 99 182 203 235 40 81 17 163 180 158 157 229 232 88 42 248 234 216 11 207 20 25 51 1 112 73 246 239 200 138 198 5 244 5 61 186 215 203 39 176 220 88 141 123 23 70 239 91 228 24 9 208 86 173 30 190 190 160 205 169 222 186 254 3 42 110 229 120 37 181 245 217 107 172 221 147 223 37 33 9 82 153 101 228 62 236 28 113 251 178 124 157 88 255 13 110 233 60 45 129 160 39 244 17 113 220 114 236 12 12 23 203 127 173 99 182 203 235 40 81 17 163 180 158 157 229 232 88 42 248 234 216 11 207 20 25 51 0 8 39 132 6 0 0 0 0 0 1 8 39 132 6 0 0 0 0 0 0 72 220 180 23 131 143 83 213 131 208 206 205 120 25 87 192 44 119 67 69 124 227 114 112 253 61 85 176 134 4 56 189 104 188 137 70 0 24 85 129 75 88 245 68 129 51 145 7 213 104 238 115 223 7 147 12 4 53 239 245 119 158 197 135 154 106 50 38 170 151 176 21 0 1 72 220 180 23 131 143 83 213 131 208 206 205 120 25 87 192 44 119 67 69 124 227 114 112 253 61 85 176 134 4 56 189 104 188 137 70 0 24 85 129 75 88 245 68 129 51 145 7 213 104 238 115 223 7 147 12 4 53 239 245 119 158 197 135 154 106 50 38 170 151 176 21 0 0 56 53 186 59 167 241 59 136 87 128 215 201 225 137 253 171 55 175 94 153 156 167 180 232 139 32 51 246 11 119 98 59 201 174 243 8 69 82 213 30 147 100 60 26 207 249 44 53 34 200 114 0 0 0 0 0 0 1 56 53 186 59 167 241 59 136 87 128 215 201 225 137 253 171 55 175 94 153 156 167 180 232 139 32 51 246 11 119 98 59 201 174 243 8 69 82 213 30 147 100 60 26 207 249 44 53 34 200 114 0 0 0 0 0 0 0 80 174 62 24 34 239 200 187 235 239 204 93 34 151 115 205 129 228 152 167 94 171 72 91 21 73 128 43 106 226 191 23 128 76 125 32 132 209 72 252 64 195 197 154 199 15 13 192 133 198 108 88 181 61 227 187 44 34 215 108 151 40 54 253 218 203 218 197 100 1 207 108 14 183 168 181 1 75 68 203 52 1 80 174 62 24 34 239 200 187 235 239 204 93 34 151 115 205 129 228 152 167 94 171 72 91 21 73 128 43 106 226 191 23 128 76 125 32 132 209 72 252 64 195 197 154 199 15 13 192 133 198 108 88 181 61 227 187 44 34 215 108 151 40 54 253 218 203 218 197 100 1 207 108 14 183 168 181 1 75 68 203 52 0 104 178 153 248 14 228 148 99 29 41 180 54 4 212 37 168 181 45 110 40 79 241 192 17 133 242 242 158 27 85 230 33 102 187 163 67 188 94 83 9 227 224 31 154 239 89 44 152 114 79 160 147 226 52 244 38 46 88 71 34 217 114 156 13 83 85 223 134 253 133 126 56 188 90 85 65 29 106 94 50 165 88 56 132 55 180 80 212 40 199 4 162 37 213 90 184 228 101 203 7 49 0 0 0 0 1 104 178 153 248 14 228 148 99 29 41 180 54 4 212 37 168 181 45 110 40 79 241 192 17 133 242 242 158 27 85 230 33 102 187 163 67 188 94 83 9 227 224 31 154 239 89 44 152 114 79 160 147 226 52 244 38 46 88 71 34 217 114 156 13 83 85 223 134 253 133 126 56 188 90 85 65 29 106 94 50 165 88 56 132 55 180 80 212 40 199 4 162 37 213 90 184 228 101 203 7 49 0 0 0 0 0 80 38 182 96 145 194 1 121 109 64 49 154 66 199 208 229 235 239 165 41 198 204 230 234 178 15 29 203 140 160 143 49 211 78 57 102 214 114 58 133 221 75 184 224 8 199 190 6 247 208 197 161 3 41 23 120 225 80 183 58 134 227 154 146 238 63 175 177 103 131 253 150 250 82 57 2 3 0 0 0 0 1 80 38 182 96 145 194 1 121 109 64 49 154 66 199 208 229 235 239 165 41 198 204 230 234 178 15 29 203 140 160 143 49 211 78 57 102 214 114 58 133 221 75 184 224 8 199 190 6 247 208 197 161 3 41 23 120 225 80 183 58 134 227 154 146 238 63 175 177 103 131 253 150 250 82 57 2 3 0 0 0 0 0 64 248 119 27 143 213 236 116 221 199 155 29 196 80 96 187 63 97 42 122 209 144 117 56 28 149 170 177 209 56 44 150 204 131 187 222 85 190 214 23 67 242 17 199 67 116 180 19 62 92 46 154 222 244 151 104 165 83 192 191 210 45 2 0 0 1 64 248 119 27 143 213 236 116 221 199 155 29 196 80 96 187 63 97 42 122 209 144 117 56 28 149 170 177 209 56 44 150 204 131 187 222 85 190 214 23 67 242 17 199 67 116 180 19 62 92 46 154 222 244 151 104 165 83 192 191 210 45 2 0 0 0 32 75 182 65 120 225 60 231 204 95 201 188 204 81 75 120 231 176 122 123 44 181 212 75 241 199 197 22 0 0 0 0 0 1 32 75 182 65 120 225 60 231 204 95 201 188 204 81 75 120 231 176 122 123 44 181 212 75 241 199 197 22 0 0 0 0 0 0 72 223 250 238 211 74 58 16 147 125 7 190 218 142 15 49 69 24 56 233 70 213 49 22 223 242 236 38 167 130 195 39 254 92 251 3 205 152 4 121 107 79 85 199 20 69 53 93 242 156 125 37 228 96 255 30 188 96 67 150 203 206 75 217 143 153 171 129 99 51 5 0 0 1 72 223 250 238 211 74 58 16 147 125 7 190 218 142 15 49 69 24 56 233 70 213 49 22 223 242 236 38 167 130 195 39 254 92 251 3 205 152 4 121 107 79 85 199 20 69 53 93 242 156 125 37 228 96 255 30 188 96 67 150 203 206 75 217 143 153 171 129 99 51 5 0 0 0 40 108 135 124 124 29 149 22 174 63 189 26 9 249 247 17 17 89 247 0 255 90 36 201 133 122 164 9 110 235 211 222 139 25 132 124 219 40 148 57 0 1 40 108 135 124 124 29 149 22 174 63 189 26 9 249 247 17 17 89 247 0 255 90 36 201 133 122 164 9 110 235 211 222 139 25 132 124 219 40 148 57 0 0 8 221 214 2 0 0 0 0 0 1 8 221 214 2 0 0 0 0 0 0 64 147 243 38 63 33 71 153 12 98 251 245 150 131 176 144 216 39 46 89 50 223 16 34 113 69 13 67 16 135 235 91 48 79 129 250 166 204 227 58 148 218 46 57 182 34 191 165 85 34 220 7 11 186 11 50 182 83 77 72 179 7 0 0 0 1 64 147 243 38 63 33 71 153 12 98 251 245 150 131 176 144 216 39 46 89 50 223 16 34 113 69 13 67 16 135 235 91 48 79 129 250 166 204 227 58 148 218 46 57 182 34 191 165 85 34 220 7 11 186 11 50 182 83 77 72 179 7 0 0 0 0 120 233 246 77 131 243 68 158 180 136 87 207 157 192 121 128 83 72 237 157 134 56 179 201 1 58 190 146 20 153 238 215 88 195 223 67 97 118 17 130 145 223 169 2 15 100 207 216 142 60 64 52 15 48 69 172 151 212 137 218 247 204 232 97 61 38 179 246 161 46 207 132 202 4 168 89 164 121 208 120 93 104 32 129 66 68 235 47 162 233 166 150 103 24 240 136 140 27 137 9 61 79 35 201 200 190 255 32 23 133 194 43 148 11 47 84 2 0 0 0 0 1 120 233 246 77 131 243 68 158 180 136 87 207 157 192 121 128 83 72 237 157 134 56 179 201 1 58 190 146 20 153 238 215 88 195 223 67 97 118 17 130 145 223 169 2 15 100 207 216 142 60 64 52 15 48 69 172 151 212 137 218 247 204 232 97 61 38 179 246 161 46 207 132 202 4 168 89 164 121 208 120 93 104 32 129 66 68 235 47 162 233 166 150 103 24 240 136 140 27 137 9 61 79 35 201 200 190 255 32 23 133 194 43 148 11 47 84 2 0 0 0 0 0 32 158 132 247 73 243 86 76 181 117 114 74 0 73 167 54 232 186 178 119 62 251 36 87 106 243 46 78 254 30 13 0 0 1 32 158 132 247 73 243 86 76 181 117 114 74 0 73 167 54 232 186 178 119 62 251 36 87 106 243 46 78 254 30 13 0 0 0 32 187 109 237 12 177 145 13 138 110 36 103 212 219 254 32 2 199 207 206 58 33 91 157 82 142 0 0 0 0 0 0 0 1 32 187 109 237 12 177 145 13 138 110 36 103 212 219 254 32 2 199 207 206 58 33 91 157 82 142 0 0 0 0 0 0 0 0 112 191 156 137 40 227 120 81 180 191 249 128 101 54 189 222 126 135 44 172 229 198 254 122 200 254 68 241 155 189 52 134 12 32 127 165 213 33 74 112 219 180 120 124 62 203 145 126 182 239 201 194 229 70 199 78 71 165 89 3 82 85 207 202 83 229 239 95 208 222 39 184 4 206 170 105 230 130 175 81 36 41 97 157 125 234 216 239 63 206 58 107 124 78 26 131 144 70 157 163 62 27 234 177 215 202 140 179 217 0 0 0 0 1 112 191 156 137 40 227 120 81 180 191 249 128 101 54 189 222 126 135 44 172 229 198 254 122 200 254 68 241 155 189 52 134 12 32 127 165 213 33 74 112 219 180 120 124 62 203 145 126 182 239 201 194 229 70 199 78 71 165 89 3 82 85 207 202 83 229 239 95 208 222 39 184 4 206 170 105 230 130 175 81 36 41 97 157 125 234 216 239 63 206 58 107 124 78 26 131 144 70 157 163 62 27 234 177 215 202 140 179 217 0 0 0 0 0 120 255 98 44 67 145 156 67 69 207 144 154 245 114 32 23 127 211 123 148 182 146 150 170 172 74 232 254 188 127 136 34 39 122 230 35 121 2 76 118 160 187 17 37 250 134 176 133 100 139 227 15 230 54 106 167 246 167 233 207 141 247 103 135 96 18 251 188 166 202 113 88 34 38 81 212 236 236 142 153 242 1 12 51 124 236 57 28 83 109 124 63 127 190 114 111 5 105 32 46 141 46 195 82 228 121 27 143 106 94 116 99 98 35 8 0 0 0 0 0 0 1 120 255 98 44 67 145 156 67 69 207 144 154 245 114 32 23 127 211 123 148 182 146 150 170 172 74 232 254 188 127 136 34 39 122 230 35 121 2 76 118 160 187 17 37 250 134 176 133 100 139 227 15 230 54 106 167 246 167 233 207 141 247 103 135 96 18 251 188 166 202 113 88 34 38 81 212 236 236 142 153 242 1 12 51 124 236 57 28 83 109 124 63 127 190 114 111 5 105 32 46 141 46 195 82 228 121 27 143 106 94 116 99 98 35 8 0 0 0 0 0 0 0 32 232 106 75 132 234 67 145 119 175 2 68 218 133 30 27 34 7 172 120 42 19 45 118 178 216 1 0 0 0 0 0 0 1 32 232 106 75 132 234 67 145 119 175 2 68 218 133 30 27 34 7 172 120 42 19 45 118 178 216 1 0 0 0 0 0 0 0 64 129 215 181 185 15 177 200 177 68 80 119 183 36 206 190 141 54 145 230 111 190 97 150 77 141 67 185 87 206 214 237 78 15 79 202 150 147 74 113 9 154 9 23 173 146 190 131 137 247 142 224 174 235 35 57 206 3 0 0 0 0 0 0 0 1 64 129 215 181 185 15 177 200 177 68 80 119 183 36 206 190 141 54 145 230 111 190 97 150 77 141 67 185 87 206 214 237 78 15 79 202 150 147 74 113 9 154 9 23 173 146 190 131 137 247 142 224 174 235 35 57 206 3 0 0 0 0 0 0 0 0 32 115 158 93 203 145 117 229 203 77 183 195 60 46 1 188 230 187 238 14 154 176 183 66 57 250 253 70 58 37 0 0 0 1 32 115 158 93 203 145 117 229 203 77 183 195 60 46 1 188 230 187 238 14 154 176 183 66 57 250 253 70 58 37 0 0 0 0 24 81 129 71 67 43 121 89 51 236 18 78 211 96 141 172 26 113 13 214 3 0 0 0 0 1 24 81 129 71 67 43 121 89 51 236 18 78 211 96 141 172 26 113 13 214 3 0 0 0 0 0 24 184 13 246 1 153 149 55 198 59 23 173 215 119 87 65 163 114 196 32 40 213 121 0 0 1 24 184 13 246 1 153 149 55 198 59 23 173 215 119 87 65 163 114 196 32 40 213 121 0 0 0 32 56 51 141 41 47 230 78 216 176 139 28 23 160 170 28 45 110 124 64 37 171 195 108 121 74 182 76 40 76 153 115 0 1 32 56 51 141 41 47 230 78 216 176 139 28 23 160 170 28 45 110 124 64 37 171 195 108 121 74 182 76 40 76 153 115 0 0 32 206 242 236 149 72 96 46 45 248 108 12 136 166 194 52 138 152 63 46 130 98 126 192 209 228 24 24 197 243 7 0 0 1 32 206 242 236 149 72 96 46 45 248 108 12 136 166 194 52 138 152 63 46 130 98 126 192 209 228 24 24 197 243 7 0 0 0 104 163 224 244 5 84 160 193 30 20 248 69 99 186 48 205 24 55 21 110 164 203 99 211 59 80 177 211 86 41 161 229 184 106 19 96 95 57 76 140 135 150 249 39 235 242 249 52 35 6 105 190 17 117 228 226 214 214 171 123 84 78 178 176 91 241 160 229 1 232 67 196 8 201 235 118 130 80 124 105 29 101 75 30 179 181 153 56 118 147 86 245 65 10 214 206 110 133 122 248 252 15 53 12 0 1 104 163 224 244 5 84 160 193 30 20 248 69 99 186 48 205 24 55 21 110 164 203 99 211 59 80 177 211 86 41 161 229 184 106 19 96 95 57 76 140 135 150 249 39 235 242 249 52 35 6 105 190 17 117 228 226 214 214 171 123 84 78 178 176 91 241 160 229 1 232 67 196 8 201 235 118 130 80 124 105 29 101 75 30 179 181 153 56 118 147 86 245 65 10 214 206 110 133 122 248 252 15 53 12 0 0 56 255 163 247 43 209 230 164 208 61 194 65 9 8 102 145 97 240 236 201 123 138 71 245 15 204 218 185 57 76 20 213 174 59 153 22 62 121 255 64 38 76 67 69 50 49 114 127 89 242 171 78 13 84 189 144 206 1 56 255 163 247 43 209 230 164 208 61 194 65 9 8 102 145 97 240 236 201 123 138 71 245 15 204 218 185 57 76 20 213 174 59 153 22 62 121 255 64 38 76 67 69 50 49 114 127 89 242 171 78 13 84 189 144 206 0 64 119 123 244 71 66 212 59 231 215 217 150 174 254 235 5 68 31 31 6 176 61 197 15 162 18 140 92 194 120 2 15 65 53 175 46 99 56 24 73 7 37 185 106 245 175 110 29 253 204 28 202 76 47 79 71 204 251 4 48 167 1 0 0 0 1 64 119 123 244 71 66 212 59 231 215 217 150 174 254 235 5 68 31 31 6 176 61 197 15 162 18 140 92 194 120 2 15 65 53 175 46 99 56 24 73 7 37 185 106 245 175 110 29 253 204 28 202 76 47 79 71 204 251 4 48 167 1 0 0 0 0 40 75 92 25 115 221 208 198 30 142 204 73 223 50 228 83 175 70 246 95 204 121 169 116 174 231 117 55 245 122 146 164 239 74 119 247 71 4 100 3 243 1 40 75 92 25 115 221 208 198 30 142 204 73 223 50 228 83 175 70 246 95 204 121 169 116 174 231 117 55 245 122 146 164 239 74 119 247 71 4 100 3 243 0 16 34 19 120 45 63 194 247 76 181 223 195 16 0 0 0 0 1 16 34 19 120 45 63 194 247 76 181 223 195 16 0 0 0 0 0 120 11 156 157 89 152 7 19 248 49 41 66 116 237 10 201 152 231 23 143 156 186 202 203 178 43 1 204 30 223 30 82 205 180 255 123 84 194 132 200 55 172 127 23 130 112 165 163 165 42 122 249 39 165 158 69 42 153 176 150 166 240 46 132 80 211 8 120 35 97 238 127 32 91 232 38 236 223 213 67 53 103 162 194 187 151 60 152 119 172 25 69 23 189 153 199 219 236 157 195 152 26 202 31 27 199 10 79 34 126 168 67 114 24 246 235 163 169 176 2 0 1 120 11 156 157 89 152 7 19 248 49 41 66 116 237 10 201 152 231 23 143 156 186 202 203 178 43 1 204 30 223 30 82 205 180 255 123 84 194 132 200 55 172 127 23 130 112 165 163 165 42 122 249 39 165 158 69 42 153 176 150 166 240 46 132 80 211 8 120 35 97 238 127 32 91 232 38 236 223 213 67 53 103 162 194 187 151 60 152 119 172 25 69 23 189 153 199 219 236 157 195 152 26 202 31 27 199 10 79 34 126 168 67 114 24 246 235 163 169 176 2 0 0 88 85 223 220 13 86 122 92 125 254 224 25 165 190 213 4 132 224 45 245 246 242 4 21 101 215 192 193 89 76 244 92 59 156 26 236 182 254 202 196 35 75 32 109 229 252 167 15 126 64 249 191 76 96 115 179 17 42 165 113 135 249 231 21 159 208 162 179 200 212 213 61 123 49 118 34 59 181 1 182 39 112 251 16 0 0 0 0 0 1 88 85 223 220 13 86 122 92 125 254 224 25 165 190 213 4 132 224 45 245 246 242 4 21 101 215 192 193 89 76 244 92 59 156 26 236 182 254 202 196 35 75 32 109 229 252 167 15 126 64 249 191 76 96 115 179 17 42 165 113 135 249 231 21 159 208 162 179 200 212 213 61 123 49 118 34 59 181 1 182 39 112 251 16 0 0 0 0 0 0 56 241 153 124 222 255 91 80 137 188 25 206 200 154 27 122 16 125 75 240 248 246 78 65 142 23 205 193 163 87 157 134 225 91 123 69 215 210 244 123 101 159 224 170 194 255 111 207 183 177 8 44 102 228 238 181 2 1 56 241 153 124 222 255 91 80 137 188 25 206 200 154 27 122 16 125 75 240 248 246 78 65 142 23 205 193 163 87 157 134 225 91 123 69 215 210 244 123 101 159 224 170 194 255 111 207 183 177 8 44 102 228 238 181 2 0 88 108 208 238 121 156 133 32 223 68 75 136 121 125 29 189 121 101 228 164 37 65 109 220 250 136 48 233 198 101 96 135 47 117 233 2 196 191 211 238 100 182 234 243 0 91 97 184 199 182 220 252 38 146 252 212 245 32 52 172 255 55 60 67 104 138 139 119 31 23 22 151 0 79 220 46 31 165 72 73 119 91 0 0 0 0 0 0 0 1 88 108 208 238 121 156 133 32 223 68 75 136 121 125 29 189 121 101 228 164 37 65 109 220 250 136 48 233 198 101 96 135 47 117 233 2 196 191 211 238 100 182 234 243 0 91 97 184 199 182 220 252 38 146 252 212 245 32 52 172 255 55 60 67 104 138 139 119 31 23 22 151 0 79 220 46 31 165 72 73 119 91 0 0 0 0 0 0 0 0 24 213 179 45 133 224 12 22 86 217 206 37 101 183 225 74 147 210 205 0 173 128 31 240 53 1 24 213 179 45 133 224 12 22 86 217 206 37 101 183 225 74 147 210 205 0 173 128 31 240 53 0 80 90 55 247 101 97 91 255 60 228 172 4 69 150 197 105 130 9 216 50 222 145 121 93 91 122 8 47 193 246 47 193 9 162 74 30 3 151 221 91 204 206 19 231 186 13 155 24 132 70 140 134 148 236 198 3 189 248 97 75 45 121 50 215 87 150 150 229 138 138 91 126 104 37 101 138 0 0 0 0 0 1 80 90 55 247 101 97 91 255 60 228 172 4 69 150 197 105 130 9 216 50 222 145 121 93 91 122 8 47 193 246 47 193 9 162 74 30 3 151 221 91 204 206 19 231 186 13 155 24 132 70 140 134 148 236 198 3 189 248 97 75 45 121 50 215 87 150 150 229 138 138 91 126 104 37 101 138 0 0 0 0 0 0 120 115 168 21 247 112 94 184 201 248 149 252 240 29 141 154 150 50 97 41 31 56 85 247 163 55 145 23 152 45 131 53 22 104 104 156 123 120 164 40 242 48 192 145 28 44 4 132 15 113 134 148 171 248 224 123 182 163 113 254 55 6 161 136 98 198 188 165 53 144 141 184 125 14 170 160 0 214 41 35 209 54 31 123 30 107 49 216 97 58 154 19 33 192 193 123 112 203 64 156 187 211 15 178 212 189 77 250 84 218 228 148 93 53 115 124 112 0 0 0 0 1 120 115 168 21 247 112 94 184 201 248 149 252 240 29 141 154 150 50 97 41 31 56 85 247 163 55 145 23 152 45 131 53 22 104 104 156 123 120 164 40 242 48 192 145 28 44 4 132 15 113 134 148 171 248 224 123 182 163 113 254 55 6 161 136 98 198 188 165 53 144 141 184 125 14 170 160 0 214 41 35 209 54 31 123 30 107 49 216 97 58 154 19 33 192 193 123 112 203 64 156 187 211 15 178 212 189 77 250 84 218 228 148 93 53 115 124 112 0 0 0 0 0 96 124 82 249 217 103 152 210 105 101 179 152 26 43 32 241 184 13 170 187 237 6 89 158 142 202 72 9 130 229 186 22 231 141 253 32 147 157 150 169 239 239 208 239 192 162 97 2 190 76 255 147 85 133 38 206 102 92 234 167 23 138 70 25 133 14 226 134 237 118 29 40 218 196 187 239 239 178 225 158 55 21 189 63 14 233 211 32 249 204 188 227 125 20 0 0 0 1 96 124 82 249 217 103 152 210 105 101 179 152 26 43 32 241 184 13 170 187 237 6 89 158 142 202 72 9 130 229 186 22 231 141 253 32 147 157 150 169 239 239 208 239 192 162 97 2 190 76 255 147 85 133 38 206 102 92 234 167 23 138 70 25 133 14 226 134 237 118 29 40 218 196 187 239 239 178 225 158 55 21 189 63 14 233 211 32 249 204 188 227 125 20 0 0 0 0 128 177 60 161 102 138 146 247 69 176 188 18 92 242 96 135 152 103 107 37 160 86 206 146 191 253 129 245 98 150 12 55 16 198 207 141 173 254 8 189 100 126 62 201 64 132 146 143 251 54 46 248 170 236 238 107 85 4 232 188 238 154 172 221 156 205 139 30 154 186 201 53 77 80 85 0 164 126 169 125 95 209 214 94 114 253 109 143 69 147 26 150 229 49 67 202 41 185 188 58 222 135 170 143 147 169 56 199 253 208 108 79 241 186 223 39 47 118 166 2 119 183 150 198 249 52 6 0 0 1 128 177 60 161 102 138 146 247 69 176 188 18 92 242 96 135 152 103 107 37 160 86 206 146 191 253 129 245 98 150 12 55 16 198 207 141 173 254 8 189 100 126 62 201 64 132 146 143 251 54 46 248 170 236 238 107 85 4 232 188 238 154 172 221 156 205 139 30 154 186 201 53 77 80 85 0 164 126 169 125 95 209 214 94 114 253 109 143 69 147 26 150 229 49 67 202 41 185 188 58 222 135 170 143 147 169 56 199 253 208 108 79 241 186 223 39 47 118 166 2 119 183 150 198 249 52 6 0 0 0 48 121 50 208 121 198 113 59 191 8 122 194 42 131 235 44 67 197 194 251 149 183 60 30 84 243 193 92 233 207 81 221 84 214 60 215 107 83 0 178 5 171 252 181 246 155 13 0 0 1 48 121 50 208 121 198 113 59 191 8 122 194 42 131 235 44 67 197 194 251 149 183 60 30 84 243 193 92 233 207 81 221 84 214 60 215 107 83 0 178 5 171 252 181 246 155 13 0 0 0 56 166 53 117 196 161 229 248 189 4 118 22 159 55 250 249 52 240 65 18 192 100 153 107 30 88 36 106 130 0 220 222 225 150 0 193 132 255 124 153 51 146 110 36 253 172 218 35 80 8 122 3 16 206 124 33 42 1 56 166 53 117 196 161 229 248 189 4 118 22 159 55 250 249 52 240 65 18 192 100 153 107 30 88 36 106 130 0 220 222 225 150 0 193 132 255 124 153 51 146 110 36 253 172 218 35 80 8 122 3 16 206 124 33 42 0 88 106 68 182 59 178 196 127 243 157 52 191 25 43 145 111 238 141 79 101 131 239 1 63 142 28 0 132 32 245 126 60 32 214 17 147 90 227 5 98 15 248 217 212 142 124 197 131 140 236 233 147 37 78 121 156 176 23 194 249 199 210 9 238 29 123 193 74 93 96 82 46 195 174 189 189 138 161 169 130 51 227 225 203 252 54 230 59 1 1 88 106 68 182 59 178 196 127 243 157 52 191 25 43 145 111 238 141 79 101 131 239 1 63 142 28 0 132 32 245 126 60 32 214 17 147 90 227 5 98 15 248 217 212 142 124 197 131 140 236 233 147 37 78 121 156 176 23 194 249 199 210 9 238 29 123 193 74 93 96 82 46 195 174 189 189 138 161 169 130 51 227 225 203 252 54 230 59 1 0 16 91 51 80 52 153 106 15 96 178 33 98 180 208 107 15 0 1 16 91 51 80 52 153 106 15 96 178 33 98 180 208 107 15 0 0 96 146 234 254 250 136 181 23 108 220 189 235 39 183 250 50 211 23 108 166 159 135 169 94 214 225 32 1 13 78 240 181 132 87 93 98 20 18 115 26 247 31 145 41 94 224 210 84 160 74 211 209 64 225 64 180 241 208 245 103 182 102 43 178 61 140 91 159 243 48 233 2 13 121 164 43 215 31 105 2 197 114 135 82 116 240 53 2 223 62 194 1 0 0 0 0 0 1 96 146 234 254 250 136 181 23 108 220 189 235 39 183 250 50 211 23 108 166 159 135 169 94 214 225 32 1 13 78 240 181 132 87 93 98 20 18 115 26 247 31 145 41 94 224 210 84 160 74 211 209 64 225 64 180 241 208 245 103 182 102 43 178 61 140 91 159 243 48 233 2 13 121 164 43 215 31 105 2 197 114 135 82 116 240 53 2 223 62 194 1 0 0 0 0 0 0 40 185 152 217 29 34 198 116 253 71 146 190 251 229 82 88 248 120 47 21 213 170 170 112 236 72 88 154 181 235 239 69 222 48 2 0 0 0 0 0 0 1 40 185 152 217 29 34 198 116 253 71 146 190 251 229 82 88 248 120 47 21 213 170 170 112 236 72 88 154 181 235 239 69 222 48 2 0 0 0 0 0 0 0 24 29 136 104 174 70 11 214 125 207 165 237 74 237 199 33 28 122 6 213 243 25 0 0 0 1 24 29 136 104 174 70 11 214 125 207 165 237 74 237 199 33 28 122 6 213 243 25 0 0 0 0 56 208 160 113 38 148 89 13 191 95 94 203 140 7 30 57 94 69 180 223 237 240 172 171 247 162 165 245 245 5 100 24 96 24 245 62 100 128 18 89 116 205 89 200 251 14 195 113 223 134 107 202 24 7 0 0 0 1 56 208 160 113 38 148 89 13 191 95 94 203 140 7 30 57 94 69 180 223 237 240 172 171 247 162 165 245 245 5 100 24 96 24 245 62 100 128 18 89 116 205 89 200 251 14 195 113 223 134 107 202 24 7 0 0 0 0 24 164 26 119 125 80 143 88 12 173 143 157 18 207 147 18 133 102 5 0 0 0 0 0 0 1 24 164 26 119 125 80 143 88 12 173 143 157 18 207 147 18 133 102 5 0 0 0 0 0 0 0 80 240 91 93 80 200 2 55 132 40 130 206 143 31 138 22 6 196 227 42 127 4 69 60 97 99 42 199 161 115 16 243 173 96 104 227 89 184 61 55 91 197 16 30 116 69 157 9 62 186 27 47 108 196 231 54 53 86 238 78 204 233 137 113 247 34 18 212 144 7 152 39 169 110 99 156 198 1 0 0 0 1 80 240 91 93 80 200 2 55 132 40 130 206 143 31 138 22 6 196 227 42 127 4 69 60 97 99 42 199 161 115 16 243 173 96 104 227 89 184 61 55 91 197 16 30 116 69 157 9 62 186 27 47 108 196 231 54 53 86 238 78 204 233 137 113 247 34 18 212 144 7 152 39 169 110 99 156 198 1 0 0 0 0 64 164 36 243 234 38 238 24 36 226 207 250 29 63 195 44 89 189 228 110 154 71 14 125 43 159 59 53 176 232 184 148 203 158 152 210 156 44 195 201 57 165 81 190 91 35 122 171 243 195 109 195 142 67 89 184 14 18 25 0 0 0 0 0 0 1 64 164 36 243 234 38 238 24 36 226 207 250 29 63 195 44 89 189 228 110 154 71 14 125 43 159 59 53 176 232 184 148 203 158 152 210 156 44 195 201 57 165 81 190 91 35 122 171 243 195 109 195 142 67 89 184 14 18 25 0 0 0 0 0 0 0 40 168 114 107 133 10 23 139 104 205 120 166 131 193 1 223 63 29 201 98 120 19 62 117 38 159 115 66 105 171 210 74 142 248 0 0 0 0 0 0 0 1 40 168 114 107 133 10 23 139 104 205 120 166 131 193 1 223 63 29 201 98 120 19 62 117 38 159 115 66 105 171 210 74 142 248 0 0 0 0 0 0 0 0 8 188 118 208 125 103 29 0 0 1 8 188 118 208 125 103 29 0 0 0 80 93 36 106 167 48 129 182 121 19 12 119 143 58 46 98 169 218 191 211 74 102 51 142 112 70 65 240 134 104 65 202 183 210 160 25 144 232 17 193 129 249 86 192 216 157 46 31 9 89 42 0 255 32 223 228 36 241 177 228 240 221 30 38 173 183 42 128 15 55 48 187 131 109 78 5 178 203 7 0 0 1 80 93 36 106 167 48 129 182 121 19 12 119 143 58 46 98 169 218 191 211 74 102 51 142 112 70 65 240 134 104 65 202 183 210 160 25 144 232 17 193 129 249 86 192 216 157 46 31 9 89 42 0 255 32 223 228 36 241 177 228 240 221 30 38 173 183 42 128 15 55 48 187 131 109 78 5 178 203 7 0 0 0 104 209 253 145 149 140 101 72 59 80 61 95 87 223 103 111 142 120 156 200 160 119 178 162 183 243 3 59 250 14 151 250 48 55 97 183 44 47 166 154 9 238 68 13 148 84 67 106 86 157 132 235 187 35 17 121 154 165 226 136 96 27 177 250 145 13 38 0 109 173 58 16 189 45 0 156 64 166 8 87 150 211 191 66 117 148 187 227 116 144 40 22 160 105 172 245 89 17 98 157 251 122 154 0 0 1 104 209 253 145 149 140 101 72 59 80 61 95 87 223 103 111 142 120 156 200 160 119 178 162 183 243 3 59 250 14 151 250 48 55 97 183 44 47 166 154 9 238 68 13 148 84 67 106 86 157 132 235 187 35 17 121 154 165 226 136 96 27 177 250 145 13 38 0 109 173 58 16 189 45 0 156 64 166 8 87 150 211 191 66 117 148 187 227 116 144 40 22 160 105 172 245 89 17 98 157 251 122 154 0 0 0 96 48 216 197 206 211 163 26 178 30 38 25 126 254 218 154 197 147 60 114 177 112 98 153 149 94 247 85 223 187 252 210 64 20 63 98 66 201 175 4 146 53 51 161 164 120 186 172 160 189 77 68 186 110 221 45 4 254 96 67 66 66 64 145 122 236 241 192 130 240 110 229 191 58 172 70 147 64 128 67 77 37 143 90 168 105 183 130 40 128 162 204 0 0 0 0 0 1 96 48 216 197 206 211 163 26 178 30 38 25 126 254 218 154 197 147 60 114 177 112 98 153 149 94 247 85 223 187 252 210 64 20 63 98 66 201 175 4 146 53 51 161 164 120 186 172 160 189 77 68 186 110 221 45 4 254 96 67 66 66 64 145 122 236 241 192 130 240 110 229 191 58 172 70 147 64 128 67 77 37 143 90 168 105 183 130 40 128 162 204 0 0 0 0 0 0 24 176 183 71 106 140 200 146 60 201 141 49 175 206 219 24 51 141 203 213 202 124 18 0 0 1 24 176 183 71 106 140 200 146 60 201 141 49 175 206 219 24 51 141 203 213 202 124 18 0 0 0 32 97 221 208 156 227 180 222 58 51 5 156 2 70 25 102 197 16 16 222 115 157 90 121 207 16 211 217 208 2 0 0 0 1 32 97 221 208 156 227 180 222 58 51 5 156 2 70 25 102 197 16 16 222 115 157 90 121 207 16 211 217 208 2 0 0 0 0 112 178 156 236 219 98 243 32 106 184 211 76 115 58 138 184 11 243 158 111 214 180 249 75 209 228 102 1 198 201 169 202 134 82 247 29 60 251 130 101 5 79 254 236 4 3 154 24 213 80 110 237 105 114 57 175 148 37 189 215 96 26 164 159 215 189 91 213 117 182 250 78 196 91 184 197 122 91 11 110 49 145 65 35 242 27 150 116 151 97 138 84 129 122 101 163 101 143 206 236 240 17 99 91 63 34 187 4 0 0 0 0 0 1 112 178 156 236 219 98 243 32 106 184 211 76 115 58 138 184 11 243 158 111 214 180 249 75 209 228 102 1 198 201 169 202 134 82 247 29 60 251 130 101 5 79 254 236 4 3 154 24 213 80 110 237 105 114 57 175 148 37 189 215 96 26 164 159 215 189 91 213 117 182 250 78 196 91 184 197 122 91 11 110 49 145 65 35 242 27 150 116 151 97 138 84 129 122 101 163 101 143 206 236 240 17 99 91 63 34 187 4 0 0 0 0 0 0 16 191 50 248 33 176 205 97 154 211 182 118 170 186 32 76 1 1 16 191 50 248 33 176 205 97 154 211 182 118 170 186 32 76 1 0 48 234 193 100 178 9 208 13 92 237 227 179 241 244 131 30 214 22 128 221 109 129 32 221 92 143 17 196 16 142 53 151 122 200 63 163 198 197 112 127 42 47 2 0 0 0 0 0 0 1 48 234 193 100 178 9 208 13 92 237 227 179 241 244 131 30 214 22 128 221 109 129 32 221 92 143 17 196 16 142 53 151 122 200 63 163 198 197 112 127 42 47 2 0 0 0 0 0 0 0 40 165 3 177 221 137 96 40 2 95 239 12 147 159 69 92 8 226 226 89 13 220 87 111 111 4 46 185 191 135 108 64 28 98 137 121 69 157 147 3 0 1 40 165 3 177 221 137 96 40 2 95 239 12 147 159 69 92 8 226 226 89 13 220 87 111 111 4 46 185 191 135 108 64 28 98 137 121 69 157 147 3 0 0 88 117 70 136 141 37 22 10 38 199 136 67 121 78 100 165 189 58 199 68 147 53 35 88 254 145 48 3 64 111 49 252 79 215 24 85 125 88 7 197 53 75 129 196 177 222 97 246 145 156 189 140 144 166 41 155 175 68 115 133 179 126 64 86 56 38 73 200 37 103 6 154 47 83 59 156 31 165 8 192 161 64 77 224 85 1 0 0 0 1 88 117 70 136 141 37 22 10 38 199 136 67 121 78 100 165 189 58 199 68 147 53 35 88 254 145 48 3 64 111 49 252 79 215 24 85 125 88 7 197 53 75 129 196 177 222 97 246 145 156 189 140 144 166 41 155 175 68 115 133 179 126 64 86 56 38 73 200 37 103 6 154 47 83 59 156 31 165 8 192 161 64 77 224 85 1 0 0 0 0 48 217 185 213 61 101 246 30 87 9 40 115 28 155 141 207 255 17 194 181 7 208 69 15 189 18 161 29 215 47 247 4 172 133 64 239 27 206 90 55 197 113 0 0 0 0 0 0 0 1 48 217 185 213 61 101 246 30 87 9 40 115 28 155 141 207 255 17 194 181 7 208 69 15 189 18 161 29 215 47 247 4 172 133 64 239 27 206 90 55 197 113 0 0 0 0 0 0 0 0 56 148 182 61 42 123 22 99 146 228 21 87 117 190 75 48 0 97 189 188 28 85 193 232 154 144 129 19 107 255 92 192 179 73 21 211 208 243 243 72 10 53 231 255 190 241 19 69 17 2 153 53 8 39 246 0 0 1 56 148 182 61 42 123 22 99 146 228 21 87 117 190 75 48 0 97 189 188 28 85 193 232 154 144 129 19 107 255 92 192 179 73 21 211 208 243 243 72 10 53 231 255 190 241 19 69 17 2 153 53 8 39 246 0 0 0 56 211 66 149 196 5 244 108 154 21 75 148 133 24 12 252 29 159 127 240 191 48 35 202 86 177 34 52 193 54 229 170 58 106 119 182 50 240 221 151 21 237 110 249 225 73 237 49 54 255 10 114 182 126 107 8 0 1 56 211 66 149 196 5 244 108 154 21 75 148 133 24 12 252 29 159 127 240 191 48 35 202 86 177 34 52 193 54 229 170 58 106 119 182 50 240 221 151 21 237 110 249 225 73 237 49 54 255 10 114 182 126 107 8 0 0 104 225 214 120 250 248 166 189 72 25 10 51 38 36 179 73 86 127 210 96 225 42 108 183 54 154 102 128 235 61 79 169 19 33 27 197 27 140 126 108 68 180 57 222 96 50 135 137 200 40 109 22 3 187 139 78 175 226 173 222 38 56 155 201 55 29 54 110 130 125 243 53 89 135 235 66 91 26 131 150 14 181 180 220 56 68 157 222 65 169 237 15 194 167 35 49 59 236 93 240 247 1 0 0 0 1 104 225 214 120 250 248 166 189 72 25 10 51 38 36 179 73 86 127 210 96 225 42 108 183 54 154 102 128 235 61 79 169 19 33 27 197 27 140 126 108 68 180 57 222 96 50 135 137 200 40 109 22 3 187 139 78 175 226 173 222 38 56 155 201 55 29 54 110 130 125 243 53 89 135 235 66 91 26 131 150 14 181 180 220 56 68 157 222 65 169 237 15 194 167 35 49 59 236 93 240 247 1 0 0 0 0 72 250 13 100 76 198 39 97 190 132 34 30 132 205 55 142 174 37 28 5 136 138 69 4 127 203 225 200 100 221 206 243 94 81 111 236 255 188 143 231 143 35 187 81 173 188 250 232 196 70 175 70 188 195 241 113 46 158 102 170 214 243 177 164 189 186 2 0 0 0 0 0 0 1 72 250 13 100 76 198 39 97 190 132 34 30 132 205 55 142 174 37 28 5 136 138 69 4 127 203 225 200 100 221 206 243 94 81 111 236 255 188 143 231 143 35 187 81 173 188 250 232 196 70 175 70 188 195 241 113 46 158 102 170 214 243 177 164 189 186 2 0 0 0 0 0 0 0 16 252 62 17 105 107 27 138 254 209 166 253 232 14 173 53 0 1 16 252 62 17 105 107 27 138 254 209 166 253 232 14 173 53 0 0 16 248 20 114 16 45 167 199 205 247 93 60 1 0 0 0 0 1 16 248 20 114 16 45 167 199 205 247 93 60 1 0 0 0 0 0 128 68 85 139 65 128 103 40 178 143 96 39 160 16 180 192 162 49 134 53 77 80 87 249 241 72 43 118 116 184 230 72 29 217 203 233 243 99 73 223 120 79 37 252 19 42 245 193 177 160 241 111 129 21 196 151 106 142 158 95 161 24 140 154 174 72 129 49 87 117 19 229 253 93 146 82 164 63 11 89 51 145 182 224 167 87 85 133 130 24 56 22 86 126 37 63 50 11 25 59 22 7 198 60 94 176 166 72 203 118 45 191 236 253 8 4 237 208 247 95 191 61 131 45 100 233 41 140 1 1 128 68 85 139 65 128 103 40 178 143 96 39 160 16 180 192 162 49 134 53 77 80 87 249 241 72 43 118 116 184 230 72 29 217 203 233 243 99 73 223 120 79 37 252 19 42 245 193 177 160 241 111 129 21 196 151 106 142 158 95 161 24 140 154 174 72 129 49 87 117 19 229 253 93 146 82 164 63 11 89 51 145 182 224 167 87 85 133 130 24 56 22 86 126 37 63 50 11 25 59 22 7 198 60 94 176 166 72 203 118 45 191 236 253 8 4 237 208 247 95 191 61 131 45 100 233 41 140 1 0 40 171 175 7 24 85 197 52 53 222 109 116 70 7 33 47 129 85 73 230 121 23 188 153 132 54 221 247 177 60 250 118 199 113 48 0 0 0 0 0 0 1 40 171 175 7 24 85 197 52 53 222 109 116 70 7 33 47 129 85 73 230 121 23 188 153 132 54 221 247 177 60 250 118 199 113 48 0 0 0 0 0 0 0 24 93 217 212 50 244 177 120 129 193 148 208 62 51 48 197 29 12 127 5 133 232 174 163 14 1 24 93 217 212 50 244 177 120 129 193 148 208 62 51 48 197 29 12 127 5 133 232 174 163 14 0 104 61 140 155 145 23 121 180 150 193 253 181 78 221 177 28 155 147 231 109 135 40 213 10 176 7 92 102 36 228 91 74 59 128 90 66 174 228 143 117 219 65 92 198 227 147 31 210 199 101 130 185 96 20 234 102 37 117 134 38 231 28 208 231 74 69 32 133 140 236 129 186 142 89 0 72 223 168 63 132 85 4 58 183 202 56 212 86 111 8 7 182 11 108 42 143 34 30 250 94 6 24 226 5 0 1 104 61 140 155 145 23 121 180 150 193 253 181 78 221 177 28 155 147 231 109 135 40 213 10 176 7 92 102 36 228 91 74 59 128 90 66 174 228 143 117 219 65 92 198 227 147 31 210 199 101 130 185 96 20 234 102 37 117 134 38 231 28 208 231 74 69 32 133 140 236 129 186 142 89 0 72 223 168 63 132 85 4 58 183 202 56 212 86 111 8 7 182 11 108 42 143 34 30 250 94 6 24 226 5 0 0 104 69 203 211 226 232 194 190 174 38 42 219 202 126 170 213 67 251 214 240 5 57 56 204 220 229 22 83 177 58 244 203 158 220 19 118 48 28 104 202 235 222 18 48 27 53 30 213 133 250 43 151 110 53 51 81 104 66 224 80 32 48 197 127 8 196 143 211 86 42 231 40 1 196 225 20 87 198 99 207 33 242 133 186 174 87 131 82 161 85 98 41 79 235 6 54 208 79 63 0 0 0 0 0 0 1 104 69 203 211 226 232 194 190 174 38 42 219 202 126 170 213 67 251 214 240 5 57 56 204 220 229 22 83 177 58 244 203 158 220 19 118 48 28 104 202 235 222 18 48 27 53 30 213 133 250 43 151 110 53 51 81 104 66 224 80 32 48 197 127 8 196 143 211 86 42 231 40 1 196 225 20 87 198 99 207 33 242 133 186 174 87 131 82 161 85 98 41 79 235 6 54 208 79 63 0 0 0 0 0 0 0 8 106 133 253 254 0 0 0 0 1 8 106 133 253 254 0 0 0 0 0 40 52 160 46 168 248 117 14 87 213 169 244 54 52 54 90 204 139 227 70 129 237 255 102 107 43 17 92 104 188 166 27 224 59 206 1 0 0 0 0 0 1 40 52 160 46 168 248 117 14 87 213 169 244 54 52 54 90 204 139 227 70 129 237 255 102 107 43 17 92 104 188 166 27 224 59 206 1 0 0 0 0 0 0 120 181 140 78 163 1 144 166 35 223 120 26 62 194 182 189 188 203 150 222 242 105 153 199 190 59 209 251 150 143 51 233 52 50 171 137 94 76 60 155 162 163 194 72 102 39 206 211 44 149 8 71 7 3 14 238 150 49 199 209 147 173 71 223 95 145 84 45 137 227 252 43 100 85 213 9 217 99 70 100 168 88 110 229 244 46 8 112 7 141 228 169 214 105 143 254 11 226 135 101 6 67 255 70 224 194 81 96 193 178 170 189 80 169 153 245 174 120 167 5 0 1 120 181 140 78 163 1 144 166 35 223 120 26 62 194 182 189 188 203 150 222 242 105 153 199 190 59 209 251 150 143 51 233 52 50 171 137 94 76 60 155 162 163 194 72 102 39 206 211 44 149 8 71 7 3 14 238 150 49 199 209 147 173 71 223 95 145 84 45 137 227 252 43 100 85 213 9 217 99 70 100 168 88 110 229 244 46 8 112 7 141 228 169 214 105 143 254 11 226 135 101 6 67 255 70 224 194 81 96 193 178 170 189 80 169 153 245 174 120 167 5 0 0 32 19 169 230 106 158 164 68 252 228 52 75 229 81 25 134 88 61 171 29 148 225 103 206 90 122 156 116 158 229 80 62 7 1 32 19 169 230 106 158 164 68 252 228 52 75 229 81 25 134 88 61 171 29 148 225 103 206 90 122 156 116 158 229 80 62 7 0 96 44 24 45 150 1 57 124 51 120 88 192 53 82 3 14 197 181 78 62 96 149 139 236 70 23 91 206 58 4 12 63 75 51 192 197 2 242 185 178 73 152 109 161 60 142 161 171 63 201 195 243 198 2 124 119 14 189 184 21 26 90 196 117 3 207 78 196 78 191 210 218 232 185 4 72 102 10 124 94 142 17 14 238 243 191 213 250 160 226 11 56 213 156 15 0 0 1 96 44 24 45 150 1 57 124 51 120 88 192 53 82 3 14 197 181 78 62 96 149 139 236 70 23 91 206 58 4 12 63 75 51 192 197 2 242 185 178 73 152 109 161 60 142 161 171 63 201 195 243 198 2 124 119 14 189 184 21 26 90 196 117 3 207 78 196 78 191 210 218 232 185 4 72 102 10 124 94 142 17 14 238 243 191 213 250 160 226 11 56 213 156 15 0 0 0 16 5 128 98 100 111 201 242 99 239 114 208 3 48 1 0 0 1 16 5 128 98 100 111 201 242 99 239 114 208 3 48 1 0 0 0 64 55 164 28 11 235 113 86 122 52 237 225 241 179 197 83 95 114 107 69 13 182 58 173 152 229 230 108 171 135 2 108 102 81 246 165 202 47 238 229 240 109 119 151 6 36 92 18 67 160 204 138 149 79 36 130 164 116 48 77 57 61 42 21 0 1 64 55 164 28 11 235 113 86 122 52 237 225 241 179 197 83 95 114 107 69 13 182 58 173 152 229 230 108 171 135 2 108 102 81 246 165 202 47 238 229 240 109 119 151 6 36 92 18 67 160 204 138 149 79 36 130 164 116 48 77 57 61 42 21 0 0 48 94 61 43 8 236 81 175 216 38 46 240 164 24 125 150 38 110 153 168 221 238 46 195 146 161 141 191 230 139 251 175 57 243 39 106 55 170 158 83 212 72 98 28 253 2 0 0 0 1 48 94 61 43 8 236 81 175 216 38 46 240 164 24 125 150 38 110 153 168 221 238 46 195 146 161 141 191 230 139 251 175 57 243 39 106 55 170 158 83 212 72 98 28 253 2 0 0 0 0 80 48 94 140 165 180 105 31 16 145 182 147 88 246 146 184 137 158 100 218 254 225 130 175 24 164 19 172 15 135 152 163 48 137 131 182 181 101 168 51 195 131 251 4 29 231 230 96 29 58 177 144 95 60 187 109 242 143 92 252 239 108 72 4 59 210 46 232 34 139 28 238 105 211 76 0 0 0 0 0 0 1 80 48 94 140 165 180 105 31 16 145 182 147 88 246 146 184 137 158 100 218 254 225 130 175 24 164 19 172 15 135 152 163 48 137 131 182 181 101 168 51 195 131 251 4 29 231 230 96 29 58 177 144 95 60 187 109 242 143 92 252 239 108 72 4 59 210 46 232 34 139 28 238 105 211 76 0 0 0 0 0 0 0 40 234 82 61 126 225 47 95 67 86 217 19 160 166 207 107 2 63 101 138 71 14 205 171 155 149 191 239 138 12 202 149 100 120 202 78 69 3 0 0 0 1 40 234 82 61 126 225 47 95 67 86 217 19 160 166 207 107 2 63 101 138 71 14 205 171 155 149 191 239 138 12 202 149 100 120 202 78 69 3 0 0 0 0 32 254 34 44 189 14 4 206 100 120 172 67 182 70 62 43 236 232 71 120 86 45 165 252 19 123 77 145 98 252 22 8 0 1 32 254 34 44 189 14 4 206 100 120 172 67 182 70 62 43 236 232 71 120 86 45 165 252 19 123 77 145 98 252 22 8 0 0 128 133 133 183 97 16 40 176 80 73 78 7 25 246 204 110 33 191 19 111 253 42 125 217 152 191 133 9 231 196 126 215 115 228 86 114 230 179 150 254 155 22 188 36 125 187 206 19 227 235 11 176 130 143 111 209 43 29 89 113 147 102 119 48 191 43 79 47 89 120 0 227 25 169 53 18 37 83 52 60 241 101 240 255 139 61 119 189 13 92 89 30 29 252 1 22 209 105 170 119 94 158 16 175 58 110 238 74 117 112 41 56 246 67 154 141 63 25 112 206 160 3 84 134 50 0 0 0 0 1 128 133 133 183 97 16 40 176 80 73 78 7 25 246 204 110 33 191 19 111 253 42 125 217 152 191 133 9 231 196 126 215 115 228 86 114 230 179 150 254 155 22 188 36 125 187 206 19 227 235 11 176 130 143 111 209 43 29 89 113 147 102 119 48 191 43 79 47 89 120 0 227 25 169 53 18 37 83 52 60 241 101 240 255 139 61 119 189 13 92 89 30 29 252 1 22 209 105 170 119 94 158 16 175 58 110 238 74 117 112 41 56 246 67 154 141 63 25 112 206 160 3 84 134 50 0 0 0 0 0 64 242 208 163 166 217 157 45 88 172 11 229 109 23 46 229 250 139 217 234 229 172 253 211 253 11 8 225 163 20 87 100 148 249 249 188 166 122 64 131 225 233 55 241 36 232 11 174 172 83 153 87 165 3 39 84 162 67 204 110 0 0 0 0 0 1 64 242 208 163 166 217 157 45 88 172 11 229 109 23 46 229 250 139 217 234 229 172 253 211 253 11 8 225 163 20 87 100 148 249 249 188 166 122 64 131 225 233 55 241 36 232 11 174 172 83 153 87 165 3 39 84 162 67 204 110 0 0 0 0 0 0 32 62 99 60 181 249 169 105 74 220 130 197 142 213 226 245 78 96 45 105 171 176 157 17 155 32 93 59 15 0 0 0 0 1 32 62 99 60 181 249 169 105 74 220 130 197 142 213 226 245 78 96 45 105 171 176 157 17 155 32 93 59 15 0 0 0 0\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/serial_txts/cpp_int128_serial32.txt",
    "content": "22 serialization::archive 10 0 0 0 0 0 16 37 8 254 63 21 239 57 20 229 108 249 176 89 1 0 0 1 16 37 8 254 63 21 239 57 20 229 108 249 176 89 1 0 0 0 4 44 53 2 0 1 4 44 53 2 0 0 16 255 227 23 91 116 215 6 77 105 216 187 1 221 183 7 0 1 16 255 227 23 91 116 215 6 77 105 216 187 1 221 183 7 0 0 16 215 97 73 133 223 240 209 70 227 76 76 44 42 9 0 0 1 16 215 97 73 133 223 240 209 70 227 76 76 44 42 9 0 0 0 4 26 205 1 0 1 4 26 205 1 0 0 16 171 248 220 122 202 115 96 223 240 82 153 66 149 194 43 14 1 16 171 248 220 122 202 115 96 223 240 82 153 66 149 194 43 14 0 16 73 169 70 111 188 124 78 80 182 195 40 65 247 218 58 0 1 16 73 169 70 111 188 124 78 80 182 195 40 65 247 218 58 0 0 4 55 1 42 59 1 4 55 1 42 59 0 12 112 146 42 85 255 28 14 50 168 228 0 0 1 12 112 146 42 85 255 28 14 50 168 228 0 0 0 8 3 132 142 0 89 0 0 0 1 8 3 132 142 0 89 0 0 0 0 4 59 31 0 0 1 4 59 31 0 0 0 12 128 184 17 143 213 41 148 184 91 0 0 0 1 12 128 184 17 143 213 41 148 184 91 0 0 0 0 8 52 43 163 205 58 0 0 0 1 8 52 43 163 205 58 0 0 0 0 4 7 136 199 3 1 4 7 136 199 3 0 12 103 144 142 223 219 161 68 75 104 0 0 0 1 12 103 144 142 223 219 161 68 75 104 0 0 0 0 16 231 211 175 248 223 4 118 100 4 104 73 218 45 121 30 164 1 16 231 211 175 248 223 4 118 100 4 104 73 218 45 121 30 164 0 16 64 136 51 28 35 115 186 14 0 15 31 170 194 137 96 1 1 16 64 136 51 28 35 115 186 14 0 15 31 170 194 137 96 1 0 16 6 253 75 10 176 96 217 180 15 153 73 162 221 96 13 175 1 16 6 253 75 10 176 96 217 180 15 153 73 162 221 96 13 175 0 16 9 195 227 5 98 90 197 22 123 173 13 24 184 217 65 14 1 16 9 195 227 5 98 90 197 22 123 173 13 24 184 217 65 14 0 16 36 207 83 207 252 162 46 155 216 62 210 211 118 157 254 13 1 16 36 207 83 207 252 162 46 155 216 62 210 211 118 157 254 13 0 4 48 115 9 0 1 4 48 115 9 0 0 12 18 132 205 178 240 43 208 33 177 56 170 10 1 12 18 132 205 178 240 43 208 33 177 56 170 10 0 16 0 134 168 204 110 75 199 196 245 20 142 108 179 194 4 27 1 16 0 134 168 204 110 75 199 196 245 20 142 108 179 194 4 27 0 16 137 40 185 28 226 228 143 223 62 177 68 144 87 133 253 16 1 16 137 40 185 28 226 228 143 223 62 177 68 144 87 133 253 16 0 16 241 205 249 80 146 210 1 55 43 173 109 143 84 117 209 0 1 16 241 205 249 80 146 210 1 55 43 173 109 143 84 117 209 0 0 4 171 208 0 0 1 4 171 208 0 0 0 8 131 223 243 126 121 98 88 88 1 8 131 223 243 126 121 98 88 88 0 16 34 183 141 118 51 30 229 127 23 141 157 166 11 0 0 0 1 16 34 183 141 118 51 30 229 127 23 141 157 166 11 0 0 0 0 16 58 245 156 2 19 251 183 255 219 45 27 253 9 0 0 0 1 16 58 245 156 2 19 251 183 255 219 45 27 253 9 0 0 0 0 8 153 44 205 37 255 0 0 0 1 8 153 44 205 37 255 0 0 0 0 4 246 238 8 0 1 4 246 238 8 0 0 4 7 0 0 0 1 4 7 0 0 0 0 8 8 53 135 13 104 37 51 0 1 8 8 53 135 13 104 37 51 0 0 4 89 148 1 0 1 4 89 148 1 0 0 16 220 42 79 160 82 149 191 194 119 33 248 143 15 159 45 0 1 16 220 42 79 160 82 149 191 194 119 33 248 143 15 159 45 0 0 12 85 100 42 49 80 139 191 189 106 176 0 0 1 12 85 100 42 49 80 139 191 189 106 176 0 0 0 16 244 148 210 156 57 140 123 241 227 171 90 25 5 0 0 0 1 16 244 148 210 156 57 140 123 241 227 171 90 25 5 0 0 0 0 16 11 118 127 38 199 175 117 18 23 63 204 177 158 199 1 0 1 16 11 118 127 38 199 175 117 18 23 63 204 177 158 199 1 0 0 16 133 146 81 4 4 226 254 92 139 68 104 13 103 27 212 5 1 16 133 146 81 4 4 226 254 92 139 68 104 13 103 27 212 5 0 12 32 198 99 47 231 25 151 81 1 0 0 0 1 12 32 198 99 47 231 25 151 81 1 0 0 0 0 12 137 233 68 65 94 40 65 221 33 159 2 0 1 12 137 233 68 65 94 40 65 221 33 159 2 0 0 16 83 34 240 62 72 73 173 41 206 111 192 80 37 0 0 0 1 16 83 34 240 62 72 73 173 41 206 111 192 80 37 0 0 0 0 4 97 0 0 0 1 4 97 0 0 0 0 8 138 189 92 247 169 147 0 0 1 8 138 189 92 247 169 147 0 0 0 16 161 190 61 94 114 107 106 245 122 129 25 170 59 22 0 0 1 16 161 190 61 94 114 107 106 245 122 129 25 170 59 22 0 0 0 4 2 130 235 26 1 4 2 130 235 26 0 16 109 53 53 179 152 230 103 254 224 148 134 9 132 15 236 0 1 16 109 53 53 179 152 230 103 254 224 148 134 9 132 15 236 0 0 12 213 70 114 188 144 14 234 210 9 163 24 0 1 12 213 70 114 188 144 14 234 210 9 163 24 0 0 12 33 107 225 17 111 28 212 164 73 197 193 0 1 12 33 107 225 17 111 28 212 164 73 197 193 0 0 8 146 173 184 73 148 56 4 0 1 8 146 173 184 73 148 56 4 0 0 12 44 163 145 53 213 144 139 110 48 114 127 219 1 12 44 163 145 53 213 144 139 110 48 114 127 219 0 12 173 188 229 221 105 34 146 117 254 239 166 51 1 12 173 188 229 221 105 34 146 117 254 239 166 51 0 12 4 69 232 58 38 108 238 203 253 199 77 145 1 12 4 69 232 58 38 108 238 203 253 199 77 145 0 8 107 215 91 159 76 215 198 33 1 8 107 215 91 159 76 215 198 33 0 8 11 77 137 244 167 98 1 0 1 8 11 77 137 244 167 98 1 0 0 8 186 129 52 47 127 178 152 0 1 8 186 129 52 47 127 178 152 0 0 12 201 180 214 22 110 46 55 229 64 200 26 0 1 12 201 180 214 22 110 46 55 229 64 200 26 0 0 4 208 223 215 0 1 4 208 223 215 0 0 4 64 29 111 0 1 4 64 29 111 0 0 8 189 214 205 206 195 1 0 0 1 8 189 214 205 206 195 1 0 0 0 12 186 181 125 189 118 38 122 114 34 230 100 1 1 12 186 181 125 189 118 38 122 114 34 230 100 1 0 16 48 214 190 50 128 72 169 213 65 189 101 126 93 0 0 0 1 16 48 214 190 50 128 72 169 213 65 189 101 126 93 0 0 0 0 4 30 0 0 0 1 4 30 0 0 0 0 8 13 245 224 15 53 1 0 0 1 8 13 245 224 15 53 1 0 0 0 8 202 238 193 147 15 0 0 0 1 8 202 238 193 147 15 0 0 0 0 16 128 116 52 14 187 110 131 0 144 16 182 41 228 82 0 0 1 16 128 116 52 14 187 110 131 0 144 16 182 41 228 82 0 0 0 4 100 0 0 0 1 4 100 0 0 0 0 4 89 180 24 0 1 4 89 180 24 0 0 4 34 124 0 0 1 4 34 124 0 0 0 16 250 39 95 39 67 1 167 94 233 155 216 3 100 183 116 118 1 16 250 39 95 39 67 1 167 94 233 155 216 3 100 183 116 118 0 16 128 143 58 104 102 58 4 109 40 213 225 112 135 3 0 0 1 16 128 143 58 104 102 58 4 109 40 213 225 112 135 3 0 0 0 16 182 167 174 164 204 91 160 188 128 28 213 237 236 1 0 0 1 16 182 167 174 164 204 91 160 188 128 28 213 237 236 1 0 0 0 12 198 204 232 165 163 187 202 201 158 244 103 2 1 12 198 204 232 165 163 187 202 201 158 244 103 2 0 4 52 41 2 0 1 4 52 41 2 0 0 8 95 141 198 19 2 2 0 0 1 8 95 141 198 19 2 2 0 0 0 16 254 2 20 231 85 24 126 151 177 138 78 145 2 0 0 0 1 16 254 2 20 231 85 24 126 151 177 138 78 145 2 0 0 0 0 16 127 34 155 130 248 106 222 183 31 216 113 190 213 220 134 3 1 16 127 34 155 130 248 106 222 183 31 216 113 190 213 220 134 3 0 8 185 223 116 102 248 10 180 190 1 8 185 223 116 102 248 10 180 190 0 4 28 0 0 0 1 4 28 0 0 0 0 12 152 5 232 129 30 191 73 187 48 122 16 0 1 12 152 5 232 129 30 191 73 187 48 122 16 0 0 8 22 174 151 82 172 15 209 0 1 8 22 174 151 82 172 15 209 0 0 4 167 181 0 0 1 4 167 181 0 0 0 8 34 164 28 2 70 207 0 0 1 8 34 164 28 2 70 207 0 0 0 4 73 175 2 31 1 4 73 175 2 31 0 16 191 123 4 56 221 89 117 10 45 163 68 188 6 0 0 0 1 16 191 123 4 56 221 89 117 10 45 163 68 188 6 0 0 0 0 4 32 0 0 0 1 4 32 0 0 0 0 16 153 114 240 104 169 142 230 72 169 205 183 45 29 0 0 0 1 16 153 114 240 104 169 142 230 72 169 205 183 45 29 0 0 0 0 4 104 0 0 0 1 4 104 0 0 0 0 4 250 4 201 0 1 4 250 4 201 0 0 8 235 69 188 51 63 136 32 0 1 8 235 69 188 51 63 136 32 0 0 8 194 197 163 82 68 56 132 186 1 8 194 197 163 82 68 56 132 186 0 8 209 149 168 103 172 0 245 13 1 8 209 149 168 103 172 0 245 13 0 8 95 103 181 13 108 192 162 0 1 8 95 103 181 13 108 192 162 0 0 8 203 201 28 164 225 153 81 140 1 8 203 201 28 164 225 153 81 140 0 12 61 213 68 146 15 4 91 15 163 73 1 0 1 12 61 213 68 146 15 4 91 15 163 73 1 0 0 16 94 145 165 53 103 5 192 143 85 206 43 169 47 0 0 0 1 16 94 145 165 53 103 5 192 143 85 206 43 169 47 0 0 0 0 12 50 151 92 208 203 159 144 76 92 251 123 11 1 12 50 151 92 208 203 159 144 76 92 251 123 11 0 16 190 5 157 205 191 246 224 1 231 37 151 216 251 10 66 0 1 16 190 5 157 205 191 246 224 1 231 37 151 216 251 10 66 0 0 12 77 149 133 65 141 196 79 8 138 249 60 120 1 12 77 149 133 65 141 196 79 8 138 249 60 120 0 16 220 86 90 254 157 201 65 199 11 135 199 91 106 0 0 0 1 16 220 86 90 254 157 201 65 199 11 135 199 91 106 0 0 0 0 8 204 151 79 174 7 0 0 0 1 8 204 151 79 174 7 0 0 0 0 12 24 141 202 136 150 117 206 49 76 1 63 7 1 12 24 141 202 136 150 117 206 49 76 1 63 7 0 12 119 133 5 211 186 190 56 29 220 201 21 0 1 12 119 133 5 211 186 190 56 29 220 201 21 0 0 4 7 0 0 0 1 4 7 0 0 0 0 12 72 15 156 17 9 105 177 79 67 146 0 0 1 12 72 15 156 17 9 105 177 79 67 146 0 0 0 12 249 168 160 82 66 6 134 143 40 37 107 13 1 12 249 168 160 82 66 6 134 143 40 37 107 13 0 4 4 185 65 0 1 4 4 185 65 0 0 12 12 112 73 235 143 130 15 35 185 148 4 0 1 12 12 112 73 235 143 130 15 35 185 148 4 0 0 4 245 60 0 0 1 4 245 60 0 0 0 8 42 49 128 144 182 3 210 10 1 8 42 49 128 144 182 3 210 10 0 12 213 148 0 33 85 171 97 185 1 0 0 0 1 12 213 148 0 33 85 171 97 185 1 0 0 0 0 16 54 54 252 21 199 151 88 16 3 233 15 10 1 0 0 0 1 16 54 54 252 21 199 151 88 16 3 233 15 10 1 0 0 0 0 16 34 61 250 8 165 194 32 79 231 214 230 190 194 240 114 7 1 16 34 61 250 8 165 194 32 79 231 214 230 190 194 240 114 7 0 12 104 245 221 84 173 227 229 31 19 5 0 0 1 12 104 245 221 84 173 227 229 31 19 5 0 0 0 8 240 84 253 169 3 21 0 0 1 8 240 84 253 169 3 21 0 0 0 16 178 134 22 38 169 249 193 201 236 162 74 212 159 200 1 0 1 16 178 134 22 38 169 249 193 201 236 162 74 212 159 200 1 0 0 12 188 15 207 107 111 126 74 110 184 12 0 0 1 12 188 15 207 107 111 126 74 110 184 12 0 0 0 16 135 53 52 188 239 136 188 128 108 91 237 149 155 0 0 0 1 16 135 53 52 188 239 136 188 128 108 91 237 149 155 0 0 0 0 4 214 243 150 104 1 4 214 243 150 104 0 4 28 0 0 0 1 4 28 0 0 0 0 16 176 32 111 181 139 147 85 223 223 124 248 32 1 0 0 0 1 16 176 32 111 181 139 147 85 223 223 124 248 32 1 0 0 0 0 16 220 111 201 142 140 206 56 69 169 37 41 8 209 2 0 0 1 16 220 111 201 142 140 206 56 69 169 37 41 8 209 2 0 0 0 8 49 22 111 81 3 0 0 0 1 8 49 22 111 81 3 0 0 0 0 16 12 25 137 51 170 194 60 198 250 154 97 254 184 1 0 0 1 16 12 25 137 51 170 194 60 198 250 154 97 254 184 1 0 0 0 12 69 58 72 167 111 230 201 95 3 0 0 0 1 12 69 58 72 167 111 230 201 95 3 0 0 0 0 16 125 163 188 25 216 18 75 50 70 157 149 113 247 26 143 0 1 16 125 163 188 25 216 18 75 50 70 157 149 113 247 26 143 0 0 12 178 36 11 168 110 204 18 55 17 174 31 2 1 12 178 36 11 168 110 204 18 55 17 174 31 2 0 8 54 253 119 216 234 173 18 0 1 8 54 253 119 216 234 173 18 0 0 16 58 138 90 25 198 44 141 36 21 50 150 6 116 188 7 0 1 16 58 138 90 25 198 44 141 36 21 50 150 6 116 188 7 0 0 8 48 232 209 253 50 174 219 0 1 8 48 232 209 253 50 174 219 0 0 16 98 231 108 128 132 248 24 45 51 233 172 99 10 48 164 6 1 16 98 231 108 128 132 248 24 45 51 233 172 99 10 48 164 6 0 12 63 148 202 142 42 126 95 240 217 3 0 0 1 12 63 148 202 142 42 126 95 240 217 3 0 0 0 12 211 178 116 92 43 40 217 152 60 0 0 0 1 12 211 178 116 92 43 40 217 152 60 0 0 0 0 4 173 137 40 0 1 4 173 137 40 0 0 4 205 61 6 0 1 4 205 61 6 0 0 16 88 56 246 47 152 18 79 21 156 80 31 84 2 0 0 0 1 16 88 56 246 47 152 18 79 21 156 80 31 84 2 0 0 0 0 4 47 61 12 0 1 4 47 61 12 0 0 4 160 13 53 81 1 4 160 13 53 81 0 8 32 187 228 46 5 0 0 0 1 8 32 187 228 46 5 0 0 0 0 16 182 2 196 123 7 142 61 89 72 17 68 180 113 1 0 0 1 16 182 2 196 123 7 142 61 89 72 17 68 180 113 1 0 0 0 16 120 38 117 243 129 114 66 195 74 148 250 9 85 2 0 0 1 16 120 38 117 243 129 114 66 195 74 148 250 9 85 2 0 0 0 16 233 65 214 75 155 124 3 9 180 156 12 179 244 180 184 111 1 16 233 65 214 75 155 124 3 9 180 156 12 179 244 180 184 111 0 8 23 43 78 31 7 0 0 0 1 8 23 43 78 31 7 0 0 0 0 8 229 205 68 230 125 8 0 0 1 8 229 205 68 230 125 8 0 0 0 16 141 13 91 38 76 112 200 170 250 212 26 1 124 1 0 0 1 16 141 13 91 38 76 112 200 170 250 212 26 1 124 1 0 0 0 8 41 127 133 106 252 0 0 0 1 8 41 127 133 106 252 0 0 0 0 8 60 152 174 163 1 0 0 0 1 8 60 152 174 163 1 0 0 0 0 4 15 0 0 0 1 4 15 0 0 0 0 16 24 134 100 43 20 248 31 252 145 239 220 39 16 158 117 0 1 16 24 134 100 43 20 248 31 252 145 239 220 39 16 158 117 0 0 4 175 72 124 35 1 4 175 72 124 35 0 8 244 49 63 40 249 6 0 0 1 8 244 49 63 40 249 6 0 0 0 16 200 70 212 56 217 96 254 3 156 68 43 183 192 143 8 0 1 16 200 70 212 56 217 96 254 3 156 68 43 183 192 143 8 0 0 4 219 122 30 5 1 4 219 122 30 5 0 16 152 26 100 200 15 32 129 3 69 217 98 106 201 17 0 0 1 16 152 26 100 200 15 32 129 3 69 217 98 106 201 17 0 0 0 4 220 43 90 166 1 4 220 43 90 166 0 16 1 74 237 23 159 49 174 181 39 193 105 137 206 197 208 2 1 16 1 74 237 23 159 49 174 181 39 193 105 137 206 197 208 2 0 12 2 162 116 55 83 71 3 224 58 31 0 0 1 12 2 162 116 55 83 71 3 224 58 31 0 0 0 16 219 109 251 155 10 110 246 132 227 114 221 29 13 0 0 0 1 16 219 109 251 155 10 110 246 132 227 114 221 29 13 0 0 0 0 8 142 91 8 37 228 217 181 55 1 8 142 91 8 37 228 217 181 55 0 16 189 154 57 63 85 92 144 161 46 212 177 53 47 4 29 90 1 16 189 154 57 63 85 92 144 161 46 212 177 53 47 4 29 90 0 8 14 190 95 210 115 71 0 0 1 8 14 190 95 210 115 71 0 0 0 4 47 2 0 0 1 4 47 2 0 0 0 16 174 101 211 131 68 66 216 221 166 22 253 95 142 0 0 0 1 16 174 101 211 131 68 66 216 221 166 22 253 95 142 0 0 0 0 16 198 1 17 204 40 96 166 196 65 117 215 34 58 0 0 0 1 16 198 1 17 204 40 96 166 196 65 117 215 34 58 0 0 0 0 12 155 139 7 253 130 3 210 83 54 12 0 0 1 12 155 139 7 253 130 3 210 83 54 12 0 0 0 12 164 44 176 210 229 112 131 132 31 15 0 0 1 12 164 44 176 210 229 112 131 132 31 15 0 0 0 12 197 192 242 64 16 33 210 29 215 0 0 0 1 12 197 192 242 64 16 33 210 29 215 0 0 0 0 12 247 202 39 209 87 88 199 30 93 71 125 42 1 12 247 202 39 209 87 88 199 30 93 71 125 42 0 16 4 91 228 117 233 235 177 229 123 87 8 196 42 243 50 0 1 16 4 91 228 117 233 235 177 229 123 87 8 196 42 243 50 0 0 12 177 254 109 38 43 208 254 238 71 49 150 0 1 12 177 254 109 38 43 208 254 238 71 49 150 0 0 8 66 45 234 248 31 0 0 0 1 8 66 45 234 248 31 0 0 0 0 12 105 210 161 233 29 116 129 70 143 74 88 0 1 12 105 210 161 233 29 116 129 70 143 74 88 0 0 16 43 147 216 50 132 234 9 232 69 151 33 92 3 0 0 0 1 16 43 147 216 50 132 234 9 232 69 151 33 92 3 0 0 0 0 8 205 117 182 80 150 98 9 0 1 8 205 117 182 80 150 98 9 0 0 16 58 110 227 57 169 95 102 122 66 27 229 232 1 0 0 0 1 16 58 110 227 57 169 95 102 122 66 27 229 232 1 0 0 0 0 12 230 26 192 136 251 74 228 31 223 1 0 0 1 12 230 26 192 136 251 74 228 31 223 1 0 0 0 8 27 77 126 125 205 208 0 0 1 8 27 77 126 125 205 208 0 0 0 4 105 207 185 22 1 4 105 207 185 22 0 12 177 81 106 231 133 43 4 174 118 0 0 0 1 12 177 81 106 231 133 43 4 174 118 0 0 0 0 12 151 193 51 229 154 159 106 17 13 0 0 0 1 12 151 193 51 229 154 159 106 17 13 0 0 0 0 4 9 5 0 0 1 4 9 5 0 0 0 8 154 3 91 22 110 99 13 0 1 8 154 3 91 22 110 99 13 0 0 4 46 0 0 0 1 4 46 0 0 0 0 8 165 178 204 139 226 102 0 0 1 8 165 178 204 139 226 102 0 0 0 12 255 166 141 198 137 1 215 240 13 0 0 0 1 12 255 166 141 198 137 1 215 240 13 0 0 0 0 12 240 214 172 107 207 30 49 24 165 26 0 0 1 12 240 214 172 107 207 30 49 24 165 26 0 0 0 16 169 62 163 160 84 45 148 118 196 244 39 206 4 0 0 0 1 16 169 62 163 160 84 45 148 118 196 244 39 206 4 0 0 0 0 8 51 45 245 18 221 94 0 0 1 8 51 45 245 18 221 94 0 0 0 16 56 138 53 228 133 56 250 127 145 126 56 71 96 42 205 0 1 16 56 138 53 228 133 56 250 127 145 126 56 71 96 42 205 0 0 16 96 10 238 153 254 99 179 181 215 150 183 141 204 183 59 15 1 16 96 10 238 153 254 99 179 181 215 150 183 141 204 183 59 15 0 4 234 122 2 0 1 4 234 122 2 0 0 4 171 166 2 0 1 4 171 166 2 0 0 12 70 249 164 0 38 67 121 141 34 1 0 0 1 12 70 249 164 0 38 67 121 141 34 1 0 0 0 8 114 2 113 130 156 93 2 0 1 8 114 2 113 130 156 93 2 0 0 8 128 254 47 66 253 230 215 9 1 8 128 254 47 66 253 230 215 9 0 8 128 118 25 126 97 184 0 0 1 8 128 118 25 126 97 184 0 0 0 4 6 0 0 0 1 4 6 0 0 0 0 12 98 121 37 228 245 254 160 122 192 239 13 51 1 12 98 121 37 228 245 254 160 122 192 239 13 51 0 8 32 22 37 123 21 27 0 0 1 8 32 22 37 123 21 27 0 0 0 8 128 162 228 118 64 127 3 0 1 8 128 162 228 118 64 127 3 0 0 4 166 181 11 0 1 4 166 181 11 0 0 16 28 166 115 28 45 10 239 211 13 246 240 137 229 3 80 0 1 16 28 166 115 28 45 10 239 211 13 246 240 137 229 3 80 0 0 16 234 15 55 214 194 155 139 231 81 180 44 125 14 0 0 0 1 16 234 15 55 214 194 155 139 231 81 180 44 125 14 0 0 0 0 8 177 167 106 207 184 208 150 0 1 8 177 167 106 207 184 208 150 0 0 8 13 195 217 57 88 2 0 0 1 8 13 195 217 57 88 2 0 0 0 16 54 96 61 217 136 240 218 168 74 235 61 179 94 124 0 0 1 16 54 96 61 217 136 240 218 168 74 235 61 179 94 124 0 0 0 8 133 19 3 202 163 74 201 191 1 8 133 19 3 202 163 74 201 191 0 12 76 246 211 13 154 46 92 228 43 105 0 0 1 12 76 246 211 13 154 46 92 228 43 105 0 0 0 4 238 231 7 0 1 4 238 231 7 0 0 4 121 5 0 0 1 4 121 5 0 0 0 12 254 32 157 147 246 229 100 39 232 13 0 0 1 12 254 32 157 147 246 229 100 39 232 13 0 0 0 8 148 204 30 203 96 118 103 26 1 8 148 204 30 203 96 118 103 26 0 8 86 94 188 134 7 0 0 0 1 8 86 94 188 134 7 0 0 0 0 8 190 236 210 228 178 0 0 0 1 8 190 236 210 228 178 0 0 0 0 12 159 29 240 26 162 129 48 140 42 98 6 0 1 12 159 29 240 26 162 129 48 140 42 98 6 0 0 12 201 94 127 117 141 245 104 70 17 0 0 0 1 12 201 94 127 117 141 245 104 70 17 0 0 0 0 12 186 185 167 145 50 174 180 1 50 29 53 1 1 12 186 185 167 145 50 174 180 1 50 29 53 1 0 12 104 112 112 189 66 154 31 214 228 234 171 7 1 12 104 112 112 189 66 154 31 214 228 234 171 7 0 12 165 159 159 174 251 240 214 4 220 88 34 125 1 12 165 159 159 174 251 240 214 4 220 88 34 125 0 16 231 72 142 22 2 169 79 36 221 251 129 37 230 30 25 38 1 16 231 72 142 22 2 169 79 36 221 251 129 37 230 30 25 38 0 8 95 25 73 135 187 21 41 2 1 8 95 25 73 135 187 21 41 2 0 12 203 77 25 62 42 39 26 203 12 34 248 30 1 12 203 77 25 62 42 39 26 203 12 34 248 30 0 4 19 6 0 0 1 4 19 6 0 0 0 16 68 151 207 206 205 132 15 184 12 208 217 190 252 148 29 0 1 16 68 151 207 206 205 132 15 184 12 208 217 190 252 148 29 0 0 4 172 170 222 106 1 4 172 170 222 106 0 12 255 209 208 122 18 160 62 50 2 0 0 0 1 12 255 209 208 122 18 160 62 50 2 0 0 0 0 16 71 17 98 35 48 147 54 205 13 239 235 222 162 130 39 0 1 16 71 17 98 35 48 147 54 205 13 239 235 222 162 130 39 0 0 12 123 91 181 63 20 138 251 142 208 1 0 0 1 12 123 91 181 63 20 138 251 142 208 1 0 0 0 4 223 195 7 0 1 4 223 195 7 0 0 12 46 37 83 84 120 104 86 18 1 0 0 0 1 12 46 37 83 84 120 104 86 18 1 0 0 0 0 16 11 123 221 123 22 39 126 107 97 71 79 173 196 6 0 0 1 16 11 123 221 123 22 39 126 107 97 71 79 173 196 6 0 0 0 8 53 164 236 57 255 127 20 4 1 8 53 164 236 57 255 127 20 4 0 12 35 197 22 114 86 55 189 134 3 0 0 0 1 12 35 197 22 114 86 55 189 134 3 0 0 0 0 12 77 141 58 157 14 215 57 68 1 0 0 0 1 12 77 141 58 157 14 215 57 68 1 0 0 0 0 16 102 255 109 147 11 143 27 213 47 176 30 89 64 94 213 66 1 16 102 255 109 147 11 143 27 213 47 176 30 89 64 94 213 66 0 8 190 247 33 10 138 0 6 6 1 8 190 247 33 10 138 0 6 6 0 4 110 2 0 0 1 4 110 2 0 0 0 16 223 83 113 107 137 221 86 37 48 2 144 161 169 28 0 0 1 16 223 83 113 107 137 221 86 37 48 2 144 161 169 28 0 0 0 8 189 254 123 237 246 176 128 2 1 8 189 254 123 237 246 176 128 2 0 12 243 132 245 46 238 29 255 200 206 118 0 0 1 12 243 132 245 46 238 29 255 200 206 118 0 0 0 4 239 125 0 0 1 4 239 125 0 0 0 12 127 161 236 25 121 208 120 214 1 0 0 0 1 12 127 161 236 25 121 208 120 214 1 0 0 0 0 16 228 98 93 251 246 45 27 244 12 210 234 8 62 105 184 6 1 16 228 98 93 251 246 45 27 244 12 210 234 8 62 105 184 6 0 16 113 250 216 245 216 14 84 151 148 66 63 170 143 150 213 62 1 16 113 250 216 245 216 14 84 151 148 66 63 170 143 150 213 62 0 4 7 0 0 0 1 4 7 0 0 0 0 4 97 0 0 0 1 4 97 0 0 0 0 16 82 196 148 115 94 248 196 4 103 173 17 224 1 0 0 0 1 16 82 196 148 115 94 248 196 4 103 173 17 224 1 0 0 0 0 16 185 187 181 2 210 30 161 158 53 90 42 42 63 15 50 26 1 16 185 187 181 2 210 30 161 158 53 90 42 42 63 15 50 26 0 16 92 251 45 61 79 154 189 99 62 231 106 244 104 0 0 0 1 16 92 251 45 61 79 154 189 99 62 231 106 244 104 0 0 0 0 8 200 11 39 38 1 71 0 0 1 8 200 11 39 38 1 71 0 0 0 16 78 168 146 148 101 102 80 36 225 226 239 154 140 83 0 0 1 16 78 168 146 148 101 102 80 36 225 226 239 154 140 83 0 0 0 12 245 138 45 63 143 110 236 183 77 53 123 0 1 12 245 138 45 63 143 110 236 183 77 53 123 0 0 4 243 27 0 0 1 4 243 27 0 0 0 8 2 242 30 180 34 49 0 0 1 8 2 242 30 180 34 49 0 0 0 8 153 218 239 31 13 11 23 0 1 8 153 218 239 31 13 11 23 0 0 16 114 73 75 167 80 26 136 206 243 161 150 47 210 18 0 0 1 16 114 73 75 167 80 26 136 206 243 161 150 47 210 18 0 0 0 8 152 52 243 192 4 0 0 0 1 8 152 52 243 192 4 0 0 0 0 4 129 0 0 0 1 4 129 0 0 0 0 16 18 75 75 202 113 21 113 107 89 238 2 38 55 0 0 0 1 16 18 75 75 202 113 21 113 107 89 238 2 38 55 0 0 0 0 12 248 15 6 162 79 31 165 111 116 213 2 0 1 12 248 15 6 162 79 31 165 111 116 213 2 0 0 8 131 38 69 53 220 0 194 1 1 8 131 38 69 53 220 0 194 1 0 16 74 116 239 154 166 169 107 46 39 173 51 0 1 0 0 0 1 16 74 116 239 154 166 169 107 46 39 173 51 0 1 0 0 0 0 16 216 204 156 85 182 172 130 76 251 193 13 135 156 80 17 0 1 16 216 204 156 85 182 172 130 76 251 193 13 135 156 80 17 0 0 4 230 159 4 0 1 4 230 159 4 0 0 4 240 94 116 1 1 4 240 94 116 1 0 16 186 26 109 17 247 224 109 236 131 235 91 201 8 59 206 53 1 16 186 26 109 17 247 224 109 236 131 235 91 201 8 59 206 53 0 8 213 56 129 36 10 0 0 0 1 8 213 56 129 36 10 0 0 0 0 4 150 105 0 0 1 4 150 105 0 0 0 4 24 96 0 0 1 4 24 96 0 0 0 8 125 198 15 213 57 0 0 0 1 8 125 198 15 213 57 0 0 0 0 4 72 171 5 0 1 4 72 171 5 0 0 16 125 217 106 251 35 137 192 207 157 60 119 110 60 0 0 0 1 16 125 217 106 251 35 137 192 207 157 60 119 110 60 0 0 0 0 16 40 33 166 229 75 32 114 134 8 182 91 119 101 246 0 0 1 16 40 33 166 229 75 32 114 134 8 182 91 119 101 246 0 0 0 4 50 6 0 0 1 4 50 6 0 0 0 12 46 7 188 46 21 139 235 139 174 6 0 0 1 12 46 7 188 46 21 139 235 139 174 6 0 0 0 12 122 184 52 227 177 59 175 38 160 93 2 0 1 12 122 184 52 227 177 59 175 38 160 93 2 0 0 12 51 236 9 239 42 71 1 118 244 0 0 0 1 12 51 236 9 239 42 71 1 118 244 0 0 0 0 4 9 0 0 0 1 4 9 0 0 0 0 4 112 253 24 0 1 4 112 253 24 0 0 12 170 155 98 70 194 229 34 226 165 82 10 0 1 12 170 155 98 70 194 229 34 226 165 82 10 0 0 16 141 162 219 102 243 250 189 2 52 69 45 8 37 48 0 0 1 16 141 162 219 102 243 250 189 2 52 69 45 8 37 48 0 0 0 12 114 76 220 134 106 96 50 45 46 0 0 0 1 12 114 76 220 134 106 96 50 45 46 0 0 0 0 12 83 216 166 163 69 55 198 40 4 192 0 0 1 12 83 216 166 163 69 55 198 40 4 192 0 0 0 8 33 162 20 8 117 90 28 1 1 8 33 162 20 8 117 90 28 1 0 8 196 49 182 125 208 15 0 0 1 8 196 49 182 125 208 15 0 0 0 4 133 3 165 3 1 4 133 3 165 3 0 12 35 198 36 50 11 227 67 35 5 0 0 0 1 12 35 198 36 50 11 227 67 35 5 0 0 0 0 4 217 58 6 0 1 4 217 58 6 0 0 8 27 199 198 6 169 98 3 0 1 8 27 199 198 6 169 98 3 0 0 8 208 172 62 88 120 203 5 0 1 8 208 172 62 88 120 203 5 0 0 4 90 8 0 0 1 4 90 8 0 0 0 16 72 150 61 92 250 232 245 163 67 167 172 175 2 0 0 0 1 16 72 150 61 92 250 232 245 163 67 167 172 175 2 0 0 0 0 4 109 255 102 254 1 4 109 255 102 254 0 4 36 0 0 0 1 4 36 0 0 0 0 4 235 105 3 0 1 4 235 105 3 0 0 8 157 43 115 210 3 0 0 0 1 8 157 43 115 210 3 0 0 0 0 4 227 128 137 1 1 4 227 128 137 1 0 12 21 49 26 107 236 12 129 206 3 0 0 0 1 12 21 49 26 107 236 12 129 206 3 0 0 0 0 8 129 32 189 16 1 0 0 0 1 8 129 32 189 16 1 0 0 0 0 16 146 130 114 247 111 207 165 146 3 137 7 108 202 3 0 0 1 16 146 130 114 247 111 207 165 146 3 137 7 108 202 3 0 0 0 8 39 239 53 138 178 87 103 0 1 8 39 239 53 138 178 87 103 0 0 16 93 101 243 102 175 163 130 167 97 174 190 36 53 183 138 34 1 16 93 101 243 102 175 163 130 167 97 174 190 36 53 183 138 34 0 4 248 0 0 0 1 4 248 0 0 0 0 16 62 103 144 183 253 247 47 175 131 2 146 108 70 0 0 0 1 16 62 103 144 183 253 247 47 175 131 2 146 108 70 0 0 0 0 16 242 249 139 183 120 173 114 251 225 239 132 139 200 207 5 0 1 16 242 249 139 183 120 173 114 251 225 239 132 139 200 207 5 0 0 8 155 82 241 50 32 1 0 0 1 8 155 82 241 50 32 1 0 0 0 16 60 134 203 255 253 239 75 71 228 52 78 20 210 216 164 3 1 16 60 134 203 255 253 239 75 71 228 52 78 20 210 216 164 3 0 4 240 0 0 0 1 4 240 0 0 0 0 8 74 91 152 79 191 112 95 219 1 8 74 91 152 79 191 112 95 219 0 4 225 143 234 246 1 4 225 143 234 246 0 8 59 117 218 172 152 176 204 177 1 8 59 117 218 172 152 176 204 177 0 12 24 92 218 89 248 53 68 137 80 0 0 0 1 12 24 92 218 89 248 53 68 137 80 0 0 0 0 8 135 175 3 193 49 7 0 0 1 8 135 175 3 193 49 7 0 0 0 16 84 36 200 56 126 134 172 99 144 135 104 167 75 161 1 0 1 16 84 36 200 56 126 134 172 99 144 135 104 167 75 161 1 0 0 16 32 97 136 27 224 36 111 146 219 92 164 16 135 119 12 0 1 16 32 97 136 27 224 36 111 146 219 92 164 16 135 119 12 0 0 8 150 186 205 101 122 21 0 0 1 8 150 186 205 101 122 21 0 0 0 8 61 0 74 249 72 64 1 0 1 8 61 0 74 249 72 64 1 0 0 4 5 0 0 0 1 4 5 0 0 0 0 4 85 231 0 0 1 4 85 231 0 0 0 4 7 53 39 0 1 4 7 53 39 0 0 16 184 113 56 241 136 99 250 169 41 38 17 218 6 0 0 0 1 16 184 113 56 241 136 99 250 169 41 38 17 218 6 0 0 0 0 16 76 17 162 144 32 230 52 94 118 23 68 114 229 89 0 0 1 16 76 17 162 144 32 230 52 94 118 23 68 114 229 89 0 0 0 8 89 183 34 241 180 158 11 0 1 8 89 183 34 241 180 158 11 0 0 4 71 186 244 17 1 4 71 186 244 17 0 4 63 193 206 147 1 4 63 193 206 147 0 8 65 67 174 89 21 0 0 0 1 8 65 67 174 89 21 0 0 0 0 8 24 124 240 73 208 51 10 0 1 8 24 124 240 73 208 51 10 0 0 8 127 149 228 141 130 187 206 212 1 8 127 149 228 141 130 187 206 212 0 4 150 21 0 0 1 4 150 21 0 0 0 4 36 148 234 13 1 4 36 148 234 13 0 4 22 10 2 0 1 4 22 10 2 0 0 8 112 48 196 1 161 60 78 227 1 8 112 48 196 1 161 60 78 227 0 16 141 191 62 222 54 255 93 191 23 154 244 121 104 127 150 0 1 16 141 191 62 222 54 255 93 191 23 154 244 121 104 127 150 0 0 16 1 239 62 155 92 171 183 88 243 250 73 64 154 209 61 6 1 16 1 239 62 155 92 171 183 88 243 250 73 64 154 209 61 6 0 16 226 241 36 137 89 204 106 60 252 68 23 9 46 14 188 7 1 16 226 241 36 137 89 204 106 60 252 68 23 9 46 14 188 7 0 12 168 243 51 12 205 84 127 124 104 103 17 0 1 12 168 243 51 12 205 84 127 124 104 103 17 0 0 12 199 246 222 200 216 155 75 134 115 5 0 0 1 12 199 246 222 200 216 155 75 134 115 5 0 0 0 12 205 246 227 212 19 202 146 146 12 32 222 104 1 12 205 246 227 212 19 202 146 146 12 32 222 104 0 4 231 2 0 0 1 4 231 2 0 0 0 8 112 223 182 198 202 220 170 0 1 8 112 223 182 198 202 220 170 0 0 4 0 212 75 197 1 4 0 212 75 197 0 12 138 108 72 105 190 154 118 34 30 0 0 0 1 12 138 108 72 105 190 154 118 34 30 0 0 0 0 8 48 85 228 16 168 11 0 0 1 8 48 85 228 16 168 11 0 0 0 4 62 1 0 0 1 4 62 1 0 0 0 16 6 102 249 196 237 58 2 184 77 192 3 21 141 0 0 0 1 16 6 102 249 196 237 58 2 184 77 192 3 21 141 0 0 0 0 8 8 78 34 173 18 4 0 0 1 8 8 78 34 173 18 4 0 0 0 4 7 0 0 0 1 4 7 0 0 0 0 8 239 135 16 50 170 2 57 0 1 8 239 135 16 50 170 2 57 0 0 4 183 0 0 0 1 4 183 0 0 0 0 16 177 22 53 249 155 145 101 251 26 74 122 154 45 100 11 0 1 16 177 22 53 249 155 145 101 251 26 74 122 154 45 100 11 0 0 4 80 56 225 0 1 4 80 56 225 0 0 16 76 235 10 21 204 158 27 14 68 131 188 49 79 0 0 0 1 16 76 235 10 21 204 158 27 14 68 131 188 49 79 0 0 0 0 12 251 170 198 48 126 70 130 132 60 154 11 0 1 12 251 170 198 48 126 70 130 132 60 154 11 0 0 8 191 30 191 254 3 0 0 0 1 8 191 30 191 254 3 0 0 0 0 12 54 216 58 148 106 237 238 143 196 75 61 50 1 12 54 216 58 148 106 237 238 143 196 75 61 50 0 4 179 134 5 0 1 4 179 134 5 0 0 12 241 40 126 116 35 208 214 118 64 224 2 0 1 12 241 40 126 116 35 208 214 118 64 224 2 0 0 8 192 249 163 87 76 23 44 169 1 8 192 249 163 87 76 23 44 169 0 8 20 54 151 190 175 212 60 7 1 8 20 54 151 190 175 212 60 7 0 8 216 96 161 160 23 138 1 0 1 8 216 96 161 160 23 138 1 0 0 12 229 209 203 219 86 233 187 99 117 0 0 0 1 12 229 209 203 219 86 233 187 99 117 0 0 0 0 12 245 229 198 81 226 138 11 41 33 213 8 22 1 12 245 229 198 81 226 138 11 41 33 213 8 22 0 8 123 178 141 23 108 0 0 0 1 8 123 178 141 23 108 0 0 0 0 8 209 241 222 253 33 0 0 0 1 8 209 241 222 253 33 0 0 0 0 12 220 85 110 10 15 95 4 6 252 132 103 77 1 12 220 85 110 10 15 95 4 6 252 132 103 77 0 12 189 132 98 150 159 168 163 157 176 8 1 0 1 12 189 132 98 150 159 168 163 157 176 8 1 0 0 4 226 130 140 1 1 4 226 130 140 1 0 16 143 231 15 168 10 112 155 62 246 19 188 101 111 0 0 0 1 16 143 231 15 168 10 112 155 62 246 19 188 101 111 0 0 0 0 12 90 83 73 223 21 149 198 225 16 118 121 1 1 12 90 83 73 223 21 149 198 225 16 118 121 1 0 8 250 107 147 104 78 3 0 0 1 8 250 107 147 104 78 3 0 0 0 4 112 132 221 2 1 4 112 132 221 2 0 8 233 38 129 60 112 9 2 0 1 8 233 38 129 60 112 9 2 0 0 8 31 200 44 22 247 29 0 0 1 8 31 200 44 22 247 29 0 0 0 8 64 140 226 178 63 3 0 0 1 8 64 140 226 178 63 3 0 0 0 12 102 203 87 33 78 209 7 212 252 71 0 0 1 12 102 203 87 33 78 209 7 212 252 71 0 0 0 16 124 235 50 2 230 251 163 236 12 65 16 16 124 0 0 0 1 16 124 235 50 2 230 251 163 236 12 65 16 16 124 0 0 0 0 16 150 159 188 85 64 141 109 45 11 90 81 64 1 0 0 0 1 16 150 159 188 85 64 141 109 45 11 90 81 64 1 0 0 0 0 12 167 59 70 31 206 169 7 64 31 128 72 0 1 12 167 59 70 31 206 169 7 64 31 128 72 0 0 4 44 3 0 0 1 4 44 3 0 0 0 8 245 254 182 131 34 27 3 0 1 8 245 254 182 131 34 27 3 0 0 16 127 105 58 125 131 87 50 215 211 128 179 128 247 65 82 0 1 16 127 105 58 125 131 87 50 215 211 128 179 128 247 65 82 0 0 8 201 118 45 227 189 189 136 2 1 8 201 118 45 227 189 189 136 2 0 16 73 205 21 184 2 160 55 216 156 146 207 246 12 0 0 0 1 16 73 205 21 184 2 160 55 216 156 146 207 246 12 0 0 0 0 8 88 131 129 83 59 1 0 0 1 8 88 131 129 83 59 1 0 0 0 8 118 58 124 202 93 158 94 84 1 8 118 58 124 202 93 158 94 84 0 16 114 144 11 78 137 113 34 58 211 201 128 28 24 49 27 0 1 16 114 144 11 78 137 113 34 58 211 201 128 28 24 49 27 0 0 8 227 62 145 88 15 34 21 0 1 8 227 62 145 88 15 34 21 0 0 8 144 79 175 34 58 184 155 52 1 8 144 79 175 34 58 184 155 52 0 8 169 92 48 156 119 52 152 6 1 8 169 92 48 156 119 52 152 6 0 16 64 241 66 116 157 84 90 13 43 150 240 179 1 0 0 0 1 16 64 241 66 116 157 84 90 13 43 150 240 179 1 0 0 0 0 8 249 36 108 106 67 0 0 0 1 8 249 36 108 106 67 0 0 0 0 4 24 219 0 0 1 4 24 219 0 0 0 12 132 220 144 75 157 31 158 221 3 0 0 0 1 12 132 220 144 75 157 31 158 221 3 0 0 0 0 8 22 51 150 54 80 88 15 0 1 8 22 51 150 54 80 88 15 0 0 12 254 143 211 239 187 165 87 122 3 0 0 0 1 12 254 143 211 239 187 165 87 122 3 0 0 0 0 16 90 132 24 254 5 211 89 38 55 116 158 144 100 66 0 0 1 16 90 132 24 254 5 211 89 38 55 116 158 144 100 66 0 0 0 16 119 186 36 149 246 36 59 35 232 254 155 141 203 2 0 0 1 16 119 186 36 149 246 36 59 35 232 254 155 141 203 2 0 0 0 8 203 46 49 133 154 163 0 0 1 8 203 46 49 133 154 163 0 0 0 16 173 84 223 120 95 131 253 29 244 109 99 100 18 0 0 0 1 16 173 84 223 120 95 131 253 29 244 109 99 100 18 0 0 0 0 16 163 90 76 225 185 170 229 28 217 73 104 176 75 142 57 0 1 16 163 90 76 225 185 170 229 28 217 73 104 176 75 142 57 0 0 12 253 112 155 58 247 162 195 140 168 20 3 0 1 12 253 112 155 58 247 162 195 140 168 20 3 0 0 12 249 122 124 0 146 109 174 30 4 0 0 0 1 12 249 122 124 0 146 109 174 30 4 0 0 0 0 8 144 2 45 119 93 56 2 0 1 8 144 2 45 119 93 56 2 0 0 4 45 33 10 0 1 4 45 33 10 0 0 16 186 27 85 177 145 135 52 106 165 148 53 70 246 1 0 0 1 16 186 27 85 177 145 135 52 106 165 148 53 70 246 1 0 0 0 4 68 52 17 4 1 4 68 52 17 4 0 12 241 159 13 20 11 64 214 104 47 0 0 0 1 12 241 159 13 20 11 64 214 104 47 0 0 0 0 16 32 95 224 178 8 58 144 200 201 145 83 22 116 60 79 2 1 16 32 95 224 178 8 58 144 200 201 145 83 22 116 60 79 2 0 8 215 108 179 124 111 116 0 0 1 8 215 108 179 124 111 116 0 0 0 16 72 135 153 119 46 195 147 13 252 2 59 0 117 125 64 77 1 16 72 135 153 119 46 195 147 13 252 2 59 0 117 125 64 77 0 16 93 46 81 15 142 242 250 221 79 61 178 228 143 87 244 0 1 16 93 46 81 15 142 242 250 221 79 61 178 228 143 87 244 0 0 4 139 93 95 57 1 4 139 93 95 57 0 16 76 36 152 198 40 178 106 21 207 164 31 24 28 10 1 0 1 16 76 36 152 198 40 178 106 21 207 164 31 24 28 10 1 0 0 4 19 0 0 0 1 4 19 0 0 0 0 12 9 25 202 138 170 88 179 0 75 0 0 0 1 12 9 25 202 138 170 88 179 0 75 0 0 0 0 8 169 231 136 224 45 30 2 0 1 8 169 231 136 224 45 30 2 0 0 12 54 251 180 193 77 7 254 217 190 81 0 0 1 12 54 251 180 193 77 7 254 217 190 81 0 0 0 16 167 75 62 7 42 70 13 12 21 5 163 135 11 0 0 0 1 16 167 75 62 7 42 70 13 12 21 5 163 135 11 0 0 0 0 12 138 166 227 194 104 244 199 0 232 12 0 0 1 12 138 166 227 194 104 244 199 0 232 12 0 0 0 8 203 27 84 77 12 139 18 28 1 8 203 27 84 77 12 139 18 28 0 4 159 124 135 1 1 4 159 124 135 1 0 12 211 117 92 112 68 205 243 46 127 0 0 0 1 12 211 117 92 112 68 205 243 46 127 0 0 0 0 8 173 148 132 161 87 0 0 0 1 8 173 148 132 161 87 0 0 0 0 4 9 0 0 0 1 4 9 0 0 0 0 8 133 26 216 191 172 89 213 40 1 8 133 26 216 191 172 89 213 40 0 16 211 26 153 111 42 16 37 94 105 14 57 163 225 193 0 0 1 16 211 26 153 111 42 16 37 94 105 14 57 163 225 193 0 0 0 4 128 164 207 191 1 4 128 164 207 191 0 4 133 171 31 6 1 4 133 171 31 6 0 16 58 142 105 140 176 184 239 208 55 131 225 185 144 11 0 0 1 16 58 142 105 140 176 184 239 208 55 131 225 185 144 11 0 0 0 16 69 153 92 71 249 203 122 156 39 73 222 95 210 32 1 0 1 16 69 153 92 71 249 203 122 156 39 73 222 95 210 32 1 0 0 4 230 66 104 5 1 4 230 66 104 5 0 8 161 45 37 11 195 19 140 0 1 8 161 45 37 11 195 19 140 0 0 4 234 74 122 82 1 4 234 74 122 82 0 4 177 246 13 0 1 4 177 246 13 0 0 4 49 224 136 0 1 4 49 224 136 0 0 8 125 71 166 1 1 0 0 0 1 8 125 71 166 1 1 0 0 0 0 4 141 121 130 15 1 4 141 121 130 15 0 16 86 207 74 133 184 161 240 207 34 130 144 107 83 0 0 0 1 16 86 207 74 133 184 161 240 207 34 130 144 107 83 0 0 0 0 8 35 48 213 98 222 69 132 0 1 8 35 48 213 98 222 69 132 0 0 8 182 209 82 82 113 25 178 59 1 8 182 209 82 82 113 25 178 59 0 8 180 86 59 54 31 2 0 0 1 8 180 86 59 54 31 2 0 0 0 4 45 45 0 0 1 4 45 45 0 0 0 16 21 185 217 174 9 133 26 231 15 65 115 190 75 64 49 0 1 16 21 185 217 174 9 133 26 231 15 65 115 190 75 64 49 0 0 12 165 110 209 80 73 74 135 193 159 99 14 0 1 12 165 110 209 80 73 74 135 193 159 99 14 0 0 8 212 39 10 198 84 40 188 1 1 8 212 39 10 198 84 40 188 1 0 12 229 117 144 57 201 122 60 120 207 235 3 0 1 12 229 117 144 57 201 122 60 120 207 235 3 0 0 4 219 123 115 0 1 4 219 123 115 0 0 12 191 142 53 119 168 100 219 47 160 3 0 0 1 12 191 142 53 119 168 100 219 47 160 3 0 0 0 16 227 12 18 159 53 213 206 140 179 189 209 125 126 174 21 0 1 16 227 12 18 159 53 213 206 140 179 189 209 125 126 174 21 0 0 12 108 182 247 254 150 50 85 5 140 125 196 22 1 12 108 182 247 254 150 50 85 5 140 125 196 22 0 16 92 126 28 210 248 52 158 233 246 129 152 227 129 228 4 25 1 16 92 126 28 210 248 52 158 233 246 129 152 227 129 228 4 25 0 8 211 136 158 83 43 95 0 0 1 8 211 136 158 83 43 95 0 0 0 8 83 253 195 70 35 14 7 1 1 8 83 253 195 70 35 14 7 1 0 12 105 111 185 175 206 124 63 83 199 79 41 0 1 12 105 111 185 175 206 124 63 83 199 79 41 0 0 4 6 50 0 0 1 4 6 50 0 0 0 12 183 89 151 17 18 108 172 173 36 98 141 13 1 12 183 89 151 17 18 108 172 173 36 98 141 13 0 8 218 149 242 52 5 0 0 0 1 8 218 149 242 52 5 0 0 0 0 4 84 210 0 0 1 4 84 210 0 0 0 8 227 16 100 125 154 10 22 0 1 8 227 16 100 125 154 10 22 0 0 4 99 11 2 0 1 4 99 11 2 0 0 12 59 200 146 111 178 201 210 58 7 10 0 0 1 12 59 200 146 111 178 201 210 58 7 10 0 0 0 8 245 98 135 241 52 234 83 2 1 8 245 98 135 241 52 234 83 2 0 8 111 24 151 152 13 0 0 0 1 8 111 24 151 152 13 0 0 0 0 4 214 0 0 0 1 4 214 0 0 0 0 12 107 171 142 230 68 214 222 6 143 20 0 0 1 12 107 171 142 230 68 214 222 6 143 20 0 0 0 16 31 138 93 248 13 219 151 196 232 112 179 55 114 0 0 0 1 16 31 138 93 248 13 219 151 196 232 112 179 55 114 0 0 0 0 12 126 160 35 63 198 30 3 106 28 63 3 6 1 12 126 160 35 63 198 30 3 106 28 63 3 6 0 4 104 8 59 0 1 4 104 8 59 0 0 4 211 64 154 42 1 4 211 64 154 42 0 16 190 175 183 140 51 33 188 44 220 15 129 79 197 5 0 0 1 16 190 175 183 140 51 33 188 44 220 15 129 79 197 5 0 0 0 4 58 149 0 0 1 4 58 149 0 0 0 8 168 78 159 61 141 1 0 0 1 8 168 78 159 61 141 1 0 0 0 8 50 34 114 75 132 0 0 0 1 8 50 34 114 75 132 0 0 0 0 12 228 96 210 155 189 131 157 123 187 84 8 0 1 12 228 96 210 155 189 131 157 123 187 84 8 0 0 8 105 43 140 252 152 3 0 0 1 8 105 43 140 252 152 3 0 0 0 8 93 153 83 251 251 19 6 0 1 8 93 153 83 251 251 19 6 0 0 8 59 202 65 95 133 34 100 0 1 8 59 202 65 95 133 34 100 0 0 16 175 130 225 146 216 107 99 14 39 177 93 74 28 0 0 0 1 16 175 130 225 146 216 107 99 14 39 177 93 74 28 0 0 0 0 12 60 102 67 81 214 180 246 82 1 0 0 0 1 12 60 102 67 81 214 180 246 82 1 0 0 0 0 4 29 156 0 0 1 4 29 156 0 0 0 4 144 22 0 0 1 4 144 22 0 0 0 16 126 85 237 254 119 29 6 190 202 60 208 130 101 7 221 121 1 16 126 85 237 254 119 29 6 190 202 60 208 130 101 7 221 121 0 8 109 138 127 241 6 0 0 0 1 8 109 138 127 241 6 0 0 0 0 4 104 29 47 0 1 4 104 29 47 0 0 16 105 197 115 163 120 218 156 57 157 204 105 245 2 0 0 0 1 16 105 197 115 163 120 218 156 57 157 204 105 245 2 0 0 0 0 16 43 62 73 147 228 196 140 60 148 83 16 164 4 0 0 0 1 16 43 62 73 147 228 196 140 60 148 83 16 164 4 0 0 0 0 4 31 0 0 0 1 4 31 0 0 0 0 8 241 157 192 68 3 0 0 0 1 8 241 157 192 68 3 0 0 0 0 16 108 147 5 178 33 167 30 134 205 25 105 66 48 22 245 0 1 16 108 147 5 178 33 167 30 134 205 25 105 66 48 22 245 0 0 8 129 42 147 65 1 0 0 0 1 8 129 42 147 65 1 0 0 0 0 12 246 130 162 45 151 113 85 86 26 158 229 111 1 12 246 130 162 45 151 113 85 86 26 158 229 111 0 4 169 64 0 0 1 4 169 64 0 0 0 8 239 189 219 253 42 82 213 153 1 8 239 189 219 253 42 82 213 153 0 8 3 41 244 12 23 4 0 0 1 8 3 41 244 12 23 4 0 0 0 12 45 29 75 228 251 90 142 140 229 6 0 0 1 12 45 29 75 228 251 90 142 140 229 6 0 0 0 8 46 253 114 12 61 0 0 0 1 8 46 253 114 12 61 0 0 0 0 4 182 105 196 214 1 4 182 105 196 214 0 16 85 197 138 192 105 13 137 11 199 237 60 146 247 3 63 24 1 16 85 197 138 192 105 13 137 11 199 237 60 146 247 3 63 24 0 8 62 83 233 195 226 186 158 9 1 8 62 83 233 195 226 186 158 9 0 4 255 213 102 22 1 4 255 213 102 22\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/serial_txts/cpp_int128_serial64.txt",
    "content": "22 serialization::archive 10 0 0 0 0 0 16 37 8 254 63 21 239 57 20 229 108 249 176 89 1 0 0 1 16 37 8 254 63 21 239 57 20 229 108 249 176 89 1 0 0 0 8 44 53 2 0 0 0 0 0 1 8 44 53 2 0 0 0 0 0 0 16 255 227 23 91 116 215 6 77 105 216 187 1 221 183 7 0 1 16 255 227 23 91 116 215 6 77 105 216 187 1 221 183 7 0 0 16 215 97 73 133 223 240 209 70 227 76 76 44 42 9 0 0 1 16 215 97 73 133 223 240 209 70 227 76 76 44 42 9 0 0 0 8 26 205 1 0 0 0 0 0 1 8 26 205 1 0 0 0 0 0 0 16 171 248 220 122 202 115 96 223 240 82 153 66 149 194 43 14 1 16 171 248 220 122 202 115 96 223 240 82 153 66 149 194 43 14 0 16 73 169 70 111 188 124 78 80 182 195 40 65 247 218 58 0 1 16 73 169 70 111 188 124 78 80 182 195 40 65 247 218 58 0 0 8 55 1 42 59 0 0 0 0 1 8 55 1 42 59 0 0 0 0 0 16 112 146 42 85 255 28 14 50 168 228 0 0 0 0 0 0 1 16 112 146 42 85 255 28 14 50 168 228 0 0 0 0 0 0 0 8 3 132 142 0 89 0 0 0 1 8 3 132 142 0 89 0 0 0 0 8 59 31 0 0 0 0 0 0 1 8 59 31 0 0 0 0 0 0 0 16 128 184 17 143 213 41 148 184 91 0 0 0 0 0 0 0 1 16 128 184 17 143 213 41 148 184 91 0 0 0 0 0 0 0 0 8 52 43 163 205 58 0 0 0 1 8 52 43 163 205 58 0 0 0 0 8 7 136 199 3 0 0 0 0 1 8 7 136 199 3 0 0 0 0 0 16 103 144 142 223 219 161 68 75 104 0 0 0 0 0 0 0 1 16 103 144 142 223 219 161 68 75 104 0 0 0 0 0 0 0 0 16 231 211 175 248 223 4 118 100 4 104 73 218 45 121 30 164 1 16 231 211 175 248 223 4 118 100 4 104 73 218 45 121 30 164 0 16 64 136 51 28 35 115 186 14 0 15 31 170 194 137 96 1 1 16 64 136 51 28 35 115 186 14 0 15 31 170 194 137 96 1 0 16 6 253 75 10 176 96 217 180 15 153 73 162 221 96 13 175 1 16 6 253 75 10 176 96 217 180 15 153 73 162 221 96 13 175 0 16 9 195 227 5 98 90 197 22 123 173 13 24 184 217 65 14 1 16 9 195 227 5 98 90 197 22 123 173 13 24 184 217 65 14 0 16 36 207 83 207 252 162 46 155 216 62 210 211 118 157 254 13 1 16 36 207 83 207 252 162 46 155 216 62 210 211 118 157 254 13 0 8 48 115 9 0 0 0 0 0 1 8 48 115 9 0 0 0 0 0 0 16 18 132 205 178 240 43 208 33 177 56 170 10 0 0 0 0 1 16 18 132 205 178 240 43 208 33 177 56 170 10 0 0 0 0 0 16 0 134 168 204 110 75 199 196 245 20 142 108 179 194 4 27 1 16 0 134 168 204 110 75 199 196 245 20 142 108 179 194 4 27 0 16 137 40 185 28 226 228 143 223 62 177 68 144 87 133 253 16 1 16 137 40 185 28 226 228 143 223 62 177 68 144 87 133 253 16 0 16 241 205 249 80 146 210 1 55 43 173 109 143 84 117 209 0 1 16 241 205 249 80 146 210 1 55 43 173 109 143 84 117 209 0 0 8 171 208 0 0 0 0 0 0 1 8 171 208 0 0 0 0 0 0 0 8 131 223 243 126 121 98 88 88 1 8 131 223 243 126 121 98 88 88 0 16 34 183 141 118 51 30 229 127 23 141 157 166 11 0 0 0 1 16 34 183 141 118 51 30 229 127 23 141 157 166 11 0 0 0 0 16 58 245 156 2 19 251 183 255 219 45 27 253 9 0 0 0 1 16 58 245 156 2 19 251 183 255 219 45 27 253 9 0 0 0 0 8 153 44 205 37 255 0 0 0 1 8 153 44 205 37 255 0 0 0 0 8 246 238 8 0 0 0 0 0 1 8 246 238 8 0 0 0 0 0 0 8 7 0 0 0 0 0 0 0 1 8 7 0 0 0 0 0 0 0 0 8 8 53 135 13 104 37 51 0 1 8 8 53 135 13 104 37 51 0 0 8 89 148 1 0 0 0 0 0 1 8 89 148 1 0 0 0 0 0 0 16 220 42 79 160 82 149 191 194 119 33 248 143 15 159 45 0 1 16 220 42 79 160 82 149 191 194 119 33 248 143 15 159 45 0 0 16 85 100 42 49 80 139 191 189 106 176 0 0 0 0 0 0 1 16 85 100 42 49 80 139 191 189 106 176 0 0 0 0 0 0 0 16 244 148 210 156 57 140 123 241 227 171 90 25 5 0 0 0 1 16 244 148 210 156 57 140 123 241 227 171 90 25 5 0 0 0 0 16 11 118 127 38 199 175 117 18 23 63 204 177 158 199 1 0 1 16 11 118 127 38 199 175 117 18 23 63 204 177 158 199 1 0 0 16 133 146 81 4 4 226 254 92 139 68 104 13 103 27 212 5 1 16 133 146 81 4 4 226 254 92 139 68 104 13 103 27 212 5 0 16 32 198 99 47 231 25 151 81 1 0 0 0 0 0 0 0 1 16 32 198 99 47 231 25 151 81 1 0 0 0 0 0 0 0 0 16 137 233 68 65 94 40 65 221 33 159 2 0 0 0 0 0 1 16 137 233 68 65 94 40 65 221 33 159 2 0 0 0 0 0 0 16 83 34 240 62 72 73 173 41 206 111 192 80 37 0 0 0 1 16 83 34 240 62 72 73 173 41 206 111 192 80 37 0 0 0 0 8 97 0 0 0 0 0 0 0 1 8 97 0 0 0 0 0 0 0 0 8 138 189 92 247 169 147 0 0 1 8 138 189 92 247 169 147 0 0 0 16 161 190 61 94 114 107 106 245 122 129 25 170 59 22 0 0 1 16 161 190 61 94 114 107 106 245 122 129 25 170 59 22 0 0 0 8 2 130 235 26 0 0 0 0 1 8 2 130 235 26 0 0 0 0 0 16 109 53 53 179 152 230 103 254 224 148 134 9 132 15 236 0 1 16 109 53 53 179 152 230 103 254 224 148 134 9 132 15 236 0 0 16 213 70 114 188 144 14 234 210 9 163 24 0 0 0 0 0 1 16 213 70 114 188 144 14 234 210 9 163 24 0 0 0 0 0 0 16 33 107 225 17 111 28 212 164 73 197 193 0 0 0 0 0 1 16 33 107 225 17 111 28 212 164 73 197 193 0 0 0 0 0 0 8 146 173 184 73 148 56 4 0 1 8 146 173 184 73 148 56 4 0 0 16 44 163 145 53 213 144 139 110 48 114 127 219 0 0 0 0 1 16 44 163 145 53 213 144 139 110 48 114 127 219 0 0 0 0 0 16 173 188 229 221 105 34 146 117 254 239 166 51 0 0 0 0 1 16 173 188 229 221 105 34 146 117 254 239 166 51 0 0 0 0 0 16 4 69 232 58 38 108 238 203 253 199 77 145 0 0 0 0 1 16 4 69 232 58 38 108 238 203 253 199 77 145 0 0 0 0 0 8 107 215 91 159 76 215 198 33 1 8 107 215 91 159 76 215 198 33 0 8 11 77 137 244 167 98 1 0 1 8 11 77 137 244 167 98 1 0 0 8 186 129 52 47 127 178 152 0 1 8 186 129 52 47 127 178 152 0 0 16 201 180 214 22 110 46 55 229 64 200 26 0 0 0 0 0 1 16 201 180 214 22 110 46 55 229 64 200 26 0 0 0 0 0 0 8 208 223 215 0 0 0 0 0 1 8 208 223 215 0 0 0 0 0 0 8 64 29 111 0 0 0 0 0 1 8 64 29 111 0 0 0 0 0 0 8 189 214 205 206 195 1 0 0 1 8 189 214 205 206 195 1 0 0 0 16 186 181 125 189 118 38 122 114 34 230 100 1 0 0 0 0 1 16 186 181 125 189 118 38 122 114 34 230 100 1 0 0 0 0 0 16 48 214 190 50 128 72 169 213 65 189 101 126 93 0 0 0 1 16 48 214 190 50 128 72 169 213 65 189 101 126 93 0 0 0 0 8 30 0 0 0 0 0 0 0 1 8 30 0 0 0 0 0 0 0 0 8 13 245 224 15 53 1 0 0 1 8 13 245 224 15 53 1 0 0 0 8 202 238 193 147 15 0 0 0 1 8 202 238 193 147 15 0 0 0 0 16 128 116 52 14 187 110 131 0 144 16 182 41 228 82 0 0 1 16 128 116 52 14 187 110 131 0 144 16 182 41 228 82 0 0 0 8 100 0 0 0 0 0 0 0 1 8 100 0 0 0 0 0 0 0 0 8 89 180 24 0 0 0 0 0 1 8 89 180 24 0 0 0 0 0 0 8 34 124 0 0 0 0 0 0 1 8 34 124 0 0 0 0 0 0 0 16 250 39 95 39 67 1 167 94 233 155 216 3 100 183 116 118 1 16 250 39 95 39 67 1 167 94 233 155 216 3 100 183 116 118 0 16 128 143 58 104 102 58 4 109 40 213 225 112 135 3 0 0 1 16 128 143 58 104 102 58 4 109 40 213 225 112 135 3 0 0 0 16 182 167 174 164 204 91 160 188 128 28 213 237 236 1 0 0 1 16 182 167 174 164 204 91 160 188 128 28 213 237 236 1 0 0 0 16 198 204 232 165 163 187 202 201 158 244 103 2 0 0 0 0 1 16 198 204 232 165 163 187 202 201 158 244 103 2 0 0 0 0 0 8 52 41 2 0 0 0 0 0 1 8 52 41 2 0 0 0 0 0 0 8 95 141 198 19 2 2 0 0 1 8 95 141 198 19 2 2 0 0 0 16 254 2 20 231 85 24 126 151 177 138 78 145 2 0 0 0 1 16 254 2 20 231 85 24 126 151 177 138 78 145 2 0 0 0 0 16 127 34 155 130 248 106 222 183 31 216 113 190 213 220 134 3 1 16 127 34 155 130 248 106 222 183 31 216 113 190 213 220 134 3 0 8 185 223 116 102 248 10 180 190 1 8 185 223 116 102 248 10 180 190 0 8 28 0 0 0 0 0 0 0 1 8 28 0 0 0 0 0 0 0 0 16 152 5 232 129 30 191 73 187 48 122 16 0 0 0 0 0 1 16 152 5 232 129 30 191 73 187 48 122 16 0 0 0 0 0 0 8 22 174 151 82 172 15 209 0 1 8 22 174 151 82 172 15 209 0 0 8 167 181 0 0 0 0 0 0 1 8 167 181 0 0 0 0 0 0 0 8 34 164 28 2 70 207 0 0 1 8 34 164 28 2 70 207 0 0 0 8 73 175 2 31 0 0 0 0 1 8 73 175 2 31 0 0 0 0 0 16 191 123 4 56 221 89 117 10 45 163 68 188 6 0 0 0 1 16 191 123 4 56 221 89 117 10 45 163 68 188 6 0 0 0 0 8 32 0 0 0 0 0 0 0 1 8 32 0 0 0 0 0 0 0 0 16 153 114 240 104 169 142 230 72 169 205 183 45 29 0 0 0 1 16 153 114 240 104 169 142 230 72 169 205 183 45 29 0 0 0 0 8 104 0 0 0 0 0 0 0 1 8 104 0 0 0 0 0 0 0 0 8 250 4 201 0 0 0 0 0 1 8 250 4 201 0 0 0 0 0 0 8 235 69 188 51 63 136 32 0 1 8 235 69 188 51 63 136 32 0 0 8 194 197 163 82 68 56 132 186 1 8 194 197 163 82 68 56 132 186 0 8 209 149 168 103 172 0 245 13 1 8 209 149 168 103 172 0 245 13 0 8 95 103 181 13 108 192 162 0 1 8 95 103 181 13 108 192 162 0 0 8 203 201 28 164 225 153 81 140 1 8 203 201 28 164 225 153 81 140 0 16 61 213 68 146 15 4 91 15 163 73 1 0 0 0 0 0 1 16 61 213 68 146 15 4 91 15 163 73 1 0 0 0 0 0 0 16 94 145 165 53 103 5 192 143 85 206 43 169 47 0 0 0 1 16 94 145 165 53 103 5 192 143 85 206 43 169 47 0 0 0 0 16 50 151 92 208 203 159 144 76 92 251 123 11 0 0 0 0 1 16 50 151 92 208 203 159 144 76 92 251 123 11 0 0 0 0 0 16 190 5 157 205 191 246 224 1 231 37 151 216 251 10 66 0 1 16 190 5 157 205 191 246 224 1 231 37 151 216 251 10 66 0 0 16 77 149 133 65 141 196 79 8 138 249 60 120 0 0 0 0 1 16 77 149 133 65 141 196 79 8 138 249 60 120 0 0 0 0 0 16 220 86 90 254 157 201 65 199 11 135 199 91 106 0 0 0 1 16 220 86 90 254 157 201 65 199 11 135 199 91 106 0 0 0 0 8 204 151 79 174 7 0 0 0 1 8 204 151 79 174 7 0 0 0 0 16 24 141 202 136 150 117 206 49 76 1 63 7 0 0 0 0 1 16 24 141 202 136 150 117 206 49 76 1 63 7 0 0 0 0 0 16 119 133 5 211 186 190 56 29 220 201 21 0 0 0 0 0 1 16 119 133 5 211 186 190 56 29 220 201 21 0 0 0 0 0 0 8 7 0 0 0 0 0 0 0 1 8 7 0 0 0 0 0 0 0 0 16 72 15 156 17 9 105 177 79 67 146 0 0 0 0 0 0 1 16 72 15 156 17 9 105 177 79 67 146 0 0 0 0 0 0 0 16 249 168 160 82 66 6 134 143 40 37 107 13 0 0 0 0 1 16 249 168 160 82 66 6 134 143 40 37 107 13 0 0 0 0 0 8 4 185 65 0 0 0 0 0 1 8 4 185 65 0 0 0 0 0 0 16 12 112 73 235 143 130 15 35 185 148 4 0 0 0 0 0 1 16 12 112 73 235 143 130 15 35 185 148 4 0 0 0 0 0 0 8 245 60 0 0 0 0 0 0 1 8 245 60 0 0 0 0 0 0 0 8 42 49 128 144 182 3 210 10 1 8 42 49 128 144 182 3 210 10 0 16 213 148 0 33 85 171 97 185 1 0 0 0 0 0 0 0 1 16 213 148 0 33 85 171 97 185 1 0 0 0 0 0 0 0 0 16 54 54 252 21 199 151 88 16 3 233 15 10 1 0 0 0 1 16 54 54 252 21 199 151 88 16 3 233 15 10 1 0 0 0 0 16 34 61 250 8 165 194 32 79 231 214 230 190 194 240 114 7 1 16 34 61 250 8 165 194 32 79 231 214 230 190 194 240 114 7 0 16 104 245 221 84 173 227 229 31 19 5 0 0 0 0 0 0 1 16 104 245 221 84 173 227 229 31 19 5 0 0 0 0 0 0 0 8 240 84 253 169 3 21 0 0 1 8 240 84 253 169 3 21 0 0 0 16 178 134 22 38 169 249 193 201 236 162 74 212 159 200 1 0 1 16 178 134 22 38 169 249 193 201 236 162 74 212 159 200 1 0 0 16 188 15 207 107 111 126 74 110 184 12 0 0 0 0 0 0 1 16 188 15 207 107 111 126 74 110 184 12 0 0 0 0 0 0 0 16 135 53 52 188 239 136 188 128 108 91 237 149 155 0 0 0 1 16 135 53 52 188 239 136 188 128 108 91 237 149 155 0 0 0 0 8 214 243 150 104 0 0 0 0 1 8 214 243 150 104 0 0 0 0 0 8 28 0 0 0 0 0 0 0 1 8 28 0 0 0 0 0 0 0 0 16 176 32 111 181 139 147 85 223 223 124 248 32 1 0 0 0 1 16 176 32 111 181 139 147 85 223 223 124 248 32 1 0 0 0 0 16 220 111 201 142 140 206 56 69 169 37 41 8 209 2 0 0 1 16 220 111 201 142 140 206 56 69 169 37 41 8 209 2 0 0 0 8 49 22 111 81 3 0 0 0 1 8 49 22 111 81 3 0 0 0 0 16 12 25 137 51 170 194 60 198 250 154 97 254 184 1 0 0 1 16 12 25 137 51 170 194 60 198 250 154 97 254 184 1 0 0 0 16 69 58 72 167 111 230 201 95 3 0 0 0 0 0 0 0 1 16 69 58 72 167 111 230 201 95 3 0 0 0 0 0 0 0 0 16 125 163 188 25 216 18 75 50 70 157 149 113 247 26 143 0 1 16 125 163 188 25 216 18 75 50 70 157 149 113 247 26 143 0 0 16 178 36 11 168 110 204 18 55 17 174 31 2 0 0 0 0 1 16 178 36 11 168 110 204 18 55 17 174 31 2 0 0 0 0 0 8 54 253 119 216 234 173 18 0 1 8 54 253 119 216 234 173 18 0 0 16 58 138 90 25 198 44 141 36 21 50 150 6 116 188 7 0 1 16 58 138 90 25 198 44 141 36 21 50 150 6 116 188 7 0 0 8 48 232 209 253 50 174 219 0 1 8 48 232 209 253 50 174 219 0 0 16 98 231 108 128 132 248 24 45 51 233 172 99 10 48 164 6 1 16 98 231 108 128 132 248 24 45 51 233 172 99 10 48 164 6 0 16 63 148 202 142 42 126 95 240 217 3 0 0 0 0 0 0 1 16 63 148 202 142 42 126 95 240 217 3 0 0 0 0 0 0 0 16 211 178 116 92 43 40 217 152 60 0 0 0 0 0 0 0 1 16 211 178 116 92 43 40 217 152 60 0 0 0 0 0 0 0 0 8 173 137 40 0 0 0 0 0 1 8 173 137 40 0 0 0 0 0 0 8 205 61 6 0 0 0 0 0 1 8 205 61 6 0 0 0 0 0 0 16 88 56 246 47 152 18 79 21 156 80 31 84 2 0 0 0 1 16 88 56 246 47 152 18 79 21 156 80 31 84 2 0 0 0 0 8 47 61 12 0 0 0 0 0 1 8 47 61 12 0 0 0 0 0 0 8 160 13 53 81 0 0 0 0 1 8 160 13 53 81 0 0 0 0 0 8 32 187 228 46 5 0 0 0 1 8 32 187 228 46 5 0 0 0 0 16 182 2 196 123 7 142 61 89 72 17 68 180 113 1 0 0 1 16 182 2 196 123 7 142 61 89 72 17 68 180 113 1 0 0 0 16 120 38 117 243 129 114 66 195 74 148 250 9 85 2 0 0 1 16 120 38 117 243 129 114 66 195 74 148 250 9 85 2 0 0 0 16 233 65 214 75 155 124 3 9 180 156 12 179 244 180 184 111 1 16 233 65 214 75 155 124 3 9 180 156 12 179 244 180 184 111 0 8 23 43 78 31 7 0 0 0 1 8 23 43 78 31 7 0 0 0 0 8 229 205 68 230 125 8 0 0 1 8 229 205 68 230 125 8 0 0 0 16 141 13 91 38 76 112 200 170 250 212 26 1 124 1 0 0 1 16 141 13 91 38 76 112 200 170 250 212 26 1 124 1 0 0 0 8 41 127 133 106 252 0 0 0 1 8 41 127 133 106 252 0 0 0 0 8 60 152 174 163 1 0 0 0 1 8 60 152 174 163 1 0 0 0 0 8 15 0 0 0 0 0 0 0 1 8 15 0 0 0 0 0 0 0 0 16 24 134 100 43 20 248 31 252 145 239 220 39 16 158 117 0 1 16 24 134 100 43 20 248 31 252 145 239 220 39 16 158 117 0 0 8 175 72 124 35 0 0 0 0 1 8 175 72 124 35 0 0 0 0 0 8 244 49 63 40 249 6 0 0 1 8 244 49 63 40 249 6 0 0 0 16 200 70 212 56 217 96 254 3 156 68 43 183 192 143 8 0 1 16 200 70 212 56 217 96 254 3 156 68 43 183 192 143 8 0 0 8 219 122 30 5 0 0 0 0 1 8 219 122 30 5 0 0 0 0 0 16 152 26 100 200 15 32 129 3 69 217 98 106 201 17 0 0 1 16 152 26 100 200 15 32 129 3 69 217 98 106 201 17 0 0 0 8 220 43 90 166 0 0 0 0 1 8 220 43 90 166 0 0 0 0 0 16 1 74 237 23 159 49 174 181 39 193 105 137 206 197 208 2 1 16 1 74 237 23 159 49 174 181 39 193 105 137 206 197 208 2 0 16 2 162 116 55 83 71 3 224 58 31 0 0 0 0 0 0 1 16 2 162 116 55 83 71 3 224 58 31 0 0 0 0 0 0 0 16 219 109 251 155 10 110 246 132 227 114 221 29 13 0 0 0 1 16 219 109 251 155 10 110 246 132 227 114 221 29 13 0 0 0 0 8 142 91 8 37 228 217 181 55 1 8 142 91 8 37 228 217 181 55 0 16 189 154 57 63 85 92 144 161 46 212 177 53 47 4 29 90 1 16 189 154 57 63 85 92 144 161 46 212 177 53 47 4 29 90 0 8 14 190 95 210 115 71 0 0 1 8 14 190 95 210 115 71 0 0 0 8 47 2 0 0 0 0 0 0 1 8 47 2 0 0 0 0 0 0 0 16 174 101 211 131 68 66 216 221 166 22 253 95 142 0 0 0 1 16 174 101 211 131 68 66 216 221 166 22 253 95 142 0 0 0 0 16 198 1 17 204 40 96 166 196 65 117 215 34 58 0 0 0 1 16 198 1 17 204 40 96 166 196 65 117 215 34 58 0 0 0 0 16 155 139 7 253 130 3 210 83 54 12 0 0 0 0 0 0 1 16 155 139 7 253 130 3 210 83 54 12 0 0 0 0 0 0 0 16 164 44 176 210 229 112 131 132 31 15 0 0 0 0 0 0 1 16 164 44 176 210 229 112 131 132 31 15 0 0 0 0 0 0 0 16 197 192 242 64 16 33 210 29 215 0 0 0 0 0 0 0 1 16 197 192 242 64 16 33 210 29 215 0 0 0 0 0 0 0 0 16 247 202 39 209 87 88 199 30 93 71 125 42 0 0 0 0 1 16 247 202 39 209 87 88 199 30 93 71 125 42 0 0 0 0 0 16 4 91 228 117 233 235 177 229 123 87 8 196 42 243 50 0 1 16 4 91 228 117 233 235 177 229 123 87 8 196 42 243 50 0 0 16 177 254 109 38 43 208 254 238 71 49 150 0 0 0 0 0 1 16 177 254 109 38 43 208 254 238 71 49 150 0 0 0 0 0 0 8 66 45 234 248 31 0 0 0 1 8 66 45 234 248 31 0 0 0 0 16 105 210 161 233 29 116 129 70 143 74 88 0 0 0 0 0 1 16 105 210 161 233 29 116 129 70 143 74 88 0 0 0 0 0 0 16 43 147 216 50 132 234 9 232 69 151 33 92 3 0 0 0 1 16 43 147 216 50 132 234 9 232 69 151 33 92 3 0 0 0 0 8 205 117 182 80 150 98 9 0 1 8 205 117 182 80 150 98 9 0 0 16 58 110 227 57 169 95 102 122 66 27 229 232 1 0 0 0 1 16 58 110 227 57 169 95 102 122 66 27 229 232 1 0 0 0 0 16 230 26 192 136 251 74 228 31 223 1 0 0 0 0 0 0 1 16 230 26 192 136 251 74 228 31 223 1 0 0 0 0 0 0 0 8 27 77 126 125 205 208 0 0 1 8 27 77 126 125 205 208 0 0 0 8 105 207 185 22 0 0 0 0 1 8 105 207 185 22 0 0 0 0 0 16 177 81 106 231 133 43 4 174 118 0 0 0 0 0 0 0 1 16 177 81 106 231 133 43 4 174 118 0 0 0 0 0 0 0 0 16 151 193 51 229 154 159 106 17 13 0 0 0 0 0 0 0 1 16 151 193 51 229 154 159 106 17 13 0 0 0 0 0 0 0 0 8 9 5 0 0 0 0 0 0 1 8 9 5 0 0 0 0 0 0 0 8 154 3 91 22 110 99 13 0 1 8 154 3 91 22 110 99 13 0 0 8 46 0 0 0 0 0 0 0 1 8 46 0 0 0 0 0 0 0 0 8 165 178 204 139 226 102 0 0 1 8 165 178 204 139 226 102 0 0 0 16 255 166 141 198 137 1 215 240 13 0 0 0 0 0 0 0 1 16 255 166 141 198 137 1 215 240 13 0 0 0 0 0 0 0 0 16 240 214 172 107 207 30 49 24 165 26 0 0 0 0 0 0 1 16 240 214 172 107 207 30 49 24 165 26 0 0 0 0 0 0 0 16 169 62 163 160 84 45 148 118 196 244 39 206 4 0 0 0 1 16 169 62 163 160 84 45 148 118 196 244 39 206 4 0 0 0 0 8 51 45 245 18 221 94 0 0 1 8 51 45 245 18 221 94 0 0 0 16 56 138 53 228 133 56 250 127 145 126 56 71 96 42 205 0 1 16 56 138 53 228 133 56 250 127 145 126 56 71 96 42 205 0 0 16 96 10 238 153 254 99 179 181 215 150 183 141 204 183 59 15 1 16 96 10 238 153 254 99 179 181 215 150 183 141 204 183 59 15 0 8 234 122 2 0 0 0 0 0 1 8 234 122 2 0 0 0 0 0 0 8 171 166 2 0 0 0 0 0 1 8 171 166 2 0 0 0 0 0 0 16 70 249 164 0 38 67 121 141 34 1 0 0 0 0 0 0 1 16 70 249 164 0 38 67 121 141 34 1 0 0 0 0 0 0 0 8 114 2 113 130 156 93 2 0 1 8 114 2 113 130 156 93 2 0 0 8 128 254 47 66 253 230 215 9 1 8 128 254 47 66 253 230 215 9 0 8 128 118 25 126 97 184 0 0 1 8 128 118 25 126 97 184 0 0 0 8 6 0 0 0 0 0 0 0 1 8 6 0 0 0 0 0 0 0 0 16 98 121 37 228 245 254 160 122 192 239 13 51 0 0 0 0 1 16 98 121 37 228 245 254 160 122 192 239 13 51 0 0 0 0 0 8 32 22 37 123 21 27 0 0 1 8 32 22 37 123 21 27 0 0 0 8 128 162 228 118 64 127 3 0 1 8 128 162 228 118 64 127 3 0 0 8 166 181 11 0 0 0 0 0 1 8 166 181 11 0 0 0 0 0 0 16 28 166 115 28 45 10 239 211 13 246 240 137 229 3 80 0 1 16 28 166 115 28 45 10 239 211 13 246 240 137 229 3 80 0 0 16 234 15 55 214 194 155 139 231 81 180 44 125 14 0 0 0 1 16 234 15 55 214 194 155 139 231 81 180 44 125 14 0 0 0 0 8 177 167 106 207 184 208 150 0 1 8 177 167 106 207 184 208 150 0 0 8 13 195 217 57 88 2 0 0 1 8 13 195 217 57 88 2 0 0 0 16 54 96 61 217 136 240 218 168 74 235 61 179 94 124 0 0 1 16 54 96 61 217 136 240 218 168 74 235 61 179 94 124 0 0 0 8 133 19 3 202 163 74 201 191 1 8 133 19 3 202 163 74 201 191 0 16 76 246 211 13 154 46 92 228 43 105 0 0 0 0 0 0 1 16 76 246 211 13 154 46 92 228 43 105 0 0 0 0 0 0 0 8 238 231 7 0 0 0 0 0 1 8 238 231 7 0 0 0 0 0 0 8 121 5 0 0 0 0 0 0 1 8 121 5 0 0 0 0 0 0 0 16 254 32 157 147 246 229 100 39 232 13 0 0 0 0 0 0 1 16 254 32 157 147 246 229 100 39 232 13 0 0 0 0 0 0 0 8 148 204 30 203 96 118 103 26 1 8 148 204 30 203 96 118 103 26 0 8 86 94 188 134 7 0 0 0 1 8 86 94 188 134 7 0 0 0 0 8 190 236 210 228 178 0 0 0 1 8 190 236 210 228 178 0 0 0 0 16 159 29 240 26 162 129 48 140 42 98 6 0 0 0 0 0 1 16 159 29 240 26 162 129 48 140 42 98 6 0 0 0 0 0 0 16 201 94 127 117 141 245 104 70 17 0 0 0 0 0 0 0 1 16 201 94 127 117 141 245 104 70 17 0 0 0 0 0 0 0 0 16 186 185 167 145 50 174 180 1 50 29 53 1 0 0 0 0 1 16 186 185 167 145 50 174 180 1 50 29 53 1 0 0 0 0 0 16 104 112 112 189 66 154 31 214 228 234 171 7 0 0 0 0 1 16 104 112 112 189 66 154 31 214 228 234 171 7 0 0 0 0 0 16 165 159 159 174 251 240 214 4 220 88 34 125 0 0 0 0 1 16 165 159 159 174 251 240 214 4 220 88 34 125 0 0 0 0 0 16 231 72 142 22 2 169 79 36 221 251 129 37 230 30 25 38 1 16 231 72 142 22 2 169 79 36 221 251 129 37 230 30 25 38 0 8 95 25 73 135 187 21 41 2 1 8 95 25 73 135 187 21 41 2 0 16 203 77 25 62 42 39 26 203 12 34 248 30 0 0 0 0 1 16 203 77 25 62 42 39 26 203 12 34 248 30 0 0 0 0 0 8 19 6 0 0 0 0 0 0 1 8 19 6 0 0 0 0 0 0 0 16 68 151 207 206 205 132 15 184 12 208 217 190 252 148 29 0 1 16 68 151 207 206 205 132 15 184 12 208 217 190 252 148 29 0 0 8 172 170 222 106 0 0 0 0 1 8 172 170 222 106 0 0 0 0 0 16 255 209 208 122 18 160 62 50 2 0 0 0 0 0 0 0 1 16 255 209 208 122 18 160 62 50 2 0 0 0 0 0 0 0 0 16 71 17 98 35 48 147 54 205 13 239 235 222 162 130 39 0 1 16 71 17 98 35 48 147 54 205 13 239 235 222 162 130 39 0 0 16 123 91 181 63 20 138 251 142 208 1 0 0 0 0 0 0 1 16 123 91 181 63 20 138 251 142 208 1 0 0 0 0 0 0 0 8 223 195 7 0 0 0 0 0 1 8 223 195 7 0 0 0 0 0 0 16 46 37 83 84 120 104 86 18 1 0 0 0 0 0 0 0 1 16 46 37 83 84 120 104 86 18 1 0 0 0 0 0 0 0 0 16 11 123 221 123 22 39 126 107 97 71 79 173 196 6 0 0 1 16 11 123 221 123 22 39 126 107 97 71 79 173 196 6 0 0 0 8 53 164 236 57 255 127 20 4 1 8 53 164 236 57 255 127 20 4 0 16 35 197 22 114 86 55 189 134 3 0 0 0 0 0 0 0 1 16 35 197 22 114 86 55 189 134 3 0 0 0 0 0 0 0 0 16 77 141 58 157 14 215 57 68 1 0 0 0 0 0 0 0 1 16 77 141 58 157 14 215 57 68 1 0 0 0 0 0 0 0 0 16 102 255 109 147 11 143 27 213 47 176 30 89 64 94 213 66 1 16 102 255 109 147 11 143 27 213 47 176 30 89 64 94 213 66 0 8 190 247 33 10 138 0 6 6 1 8 190 247 33 10 138 0 6 6 0 8 110 2 0 0 0 0 0 0 1 8 110 2 0 0 0 0 0 0 0 16 223 83 113 107 137 221 86 37 48 2 144 161 169 28 0 0 1 16 223 83 113 107 137 221 86 37 48 2 144 161 169 28 0 0 0 8 189 254 123 237 246 176 128 2 1 8 189 254 123 237 246 176 128 2 0 16 243 132 245 46 238 29 255 200 206 118 0 0 0 0 0 0 1 16 243 132 245 46 238 29 255 200 206 118 0 0 0 0 0 0 0 8 239 125 0 0 0 0 0 0 1 8 239 125 0 0 0 0 0 0 0 16 127 161 236 25 121 208 120 214 1 0 0 0 0 0 0 0 1 16 127 161 236 25 121 208 120 214 1 0 0 0 0 0 0 0 0 16 228 98 93 251 246 45 27 244 12 210 234 8 62 105 184 6 1 16 228 98 93 251 246 45 27 244 12 210 234 8 62 105 184 6 0 16 113 250 216 245 216 14 84 151 148 66 63 170 143 150 213 62 1 16 113 250 216 245 216 14 84 151 148 66 63 170 143 150 213 62 0 8 7 0 0 0 0 0 0 0 1 8 7 0 0 0 0 0 0 0 0 8 97 0 0 0 0 0 0 0 1 8 97 0 0 0 0 0 0 0 0 16 82 196 148 115 94 248 196 4 103 173 17 224 1 0 0 0 1 16 82 196 148 115 94 248 196 4 103 173 17 224 1 0 0 0 0 16 185 187 181 2 210 30 161 158 53 90 42 42 63 15 50 26 1 16 185 187 181 2 210 30 161 158 53 90 42 42 63 15 50 26 0 16 92 251 45 61 79 154 189 99 62 231 106 244 104 0 0 0 1 16 92 251 45 61 79 154 189 99 62 231 106 244 104 0 0 0 0 8 200 11 39 38 1 71 0 0 1 8 200 11 39 38 1 71 0 0 0 16 78 168 146 148 101 102 80 36 225 226 239 154 140 83 0 0 1 16 78 168 146 148 101 102 80 36 225 226 239 154 140 83 0 0 0 16 245 138 45 63 143 110 236 183 77 53 123 0 0 0 0 0 1 16 245 138 45 63 143 110 236 183 77 53 123 0 0 0 0 0 0 8 243 27 0 0 0 0 0 0 1 8 243 27 0 0 0 0 0 0 0 8 2 242 30 180 34 49 0 0 1 8 2 242 30 180 34 49 0 0 0 8 153 218 239 31 13 11 23 0 1 8 153 218 239 31 13 11 23 0 0 16 114 73 75 167 80 26 136 206 243 161 150 47 210 18 0 0 1 16 114 73 75 167 80 26 136 206 243 161 150 47 210 18 0 0 0 8 152 52 243 192 4 0 0 0 1 8 152 52 243 192 4 0 0 0 0 8 129 0 0 0 0 0 0 0 1 8 129 0 0 0 0 0 0 0 0 16 18 75 75 202 113 21 113 107 89 238 2 38 55 0 0 0 1 16 18 75 75 202 113 21 113 107 89 238 2 38 55 0 0 0 0 16 248 15 6 162 79 31 165 111 116 213 2 0 0 0 0 0 1 16 248 15 6 162 79 31 165 111 116 213 2 0 0 0 0 0 0 8 131 38 69 53 220 0 194 1 1 8 131 38 69 53 220 0 194 1 0 16 74 116 239 154 166 169 107 46 39 173 51 0 1 0 0 0 1 16 74 116 239 154 166 169 107 46 39 173 51 0 1 0 0 0 0 16 216 204 156 85 182 172 130 76 251 193 13 135 156 80 17 0 1 16 216 204 156 85 182 172 130 76 251 193 13 135 156 80 17 0 0 8 230 159 4 0 0 0 0 0 1 8 230 159 4 0 0 0 0 0 0 8 240 94 116 1 0 0 0 0 1 8 240 94 116 1 0 0 0 0 0 16 186 26 109 17 247 224 109 236 131 235 91 201 8 59 206 53 1 16 186 26 109 17 247 224 109 236 131 235 91 201 8 59 206 53 0 8 213 56 129 36 10 0 0 0 1 8 213 56 129 36 10 0 0 0 0 8 150 105 0 0 0 0 0 0 1 8 150 105 0 0 0 0 0 0 0 8 24 96 0 0 0 0 0 0 1 8 24 96 0 0 0 0 0 0 0 8 125 198 15 213 57 0 0 0 1 8 125 198 15 213 57 0 0 0 0 8 72 171 5 0 0 0 0 0 1 8 72 171 5 0 0 0 0 0 0 16 125 217 106 251 35 137 192 207 157 60 119 110 60 0 0 0 1 16 125 217 106 251 35 137 192 207 157 60 119 110 60 0 0 0 0 16 40 33 166 229 75 32 114 134 8 182 91 119 101 246 0 0 1 16 40 33 166 229 75 32 114 134 8 182 91 119 101 246 0 0 0 8 50 6 0 0 0 0 0 0 1 8 50 6 0 0 0 0 0 0 0 16 46 7 188 46 21 139 235 139 174 6 0 0 0 0 0 0 1 16 46 7 188 46 21 139 235 139 174 6 0 0 0 0 0 0 0 16 122 184 52 227 177 59 175 38 160 93 2 0 0 0 0 0 1 16 122 184 52 227 177 59 175 38 160 93 2 0 0 0 0 0 0 16 51 236 9 239 42 71 1 118 244 0 0 0 0 0 0 0 1 16 51 236 9 239 42 71 1 118 244 0 0 0 0 0 0 0 0 8 9 0 0 0 0 0 0 0 1 8 9 0 0 0 0 0 0 0 0 8 112 253 24 0 0 0 0 0 1 8 112 253 24 0 0 0 0 0 0 16 170 155 98 70 194 229 34 226 165 82 10 0 0 0 0 0 1 16 170 155 98 70 194 229 34 226 165 82 10 0 0 0 0 0 0 16 141 162 219 102 243 250 189 2 52 69 45 8 37 48 0 0 1 16 141 162 219 102 243 250 189 2 52 69 45 8 37 48 0 0 0 16 114 76 220 134 106 96 50 45 46 0 0 0 0 0 0 0 1 16 114 76 220 134 106 96 50 45 46 0 0 0 0 0 0 0 0 16 83 216 166 163 69 55 198 40 4 192 0 0 0 0 0 0 1 16 83 216 166 163 69 55 198 40 4 192 0 0 0 0 0 0 0 8 33 162 20 8 117 90 28 1 1 8 33 162 20 8 117 90 28 1 0 8 196 49 182 125 208 15 0 0 1 8 196 49 182 125 208 15 0 0 0 8 133 3 165 3 0 0 0 0 1 8 133 3 165 3 0 0 0 0 0 16 35 198 36 50 11 227 67 35 5 0 0 0 0 0 0 0 1 16 35 198 36 50 11 227 67 35 5 0 0 0 0 0 0 0 0 8 217 58 6 0 0 0 0 0 1 8 217 58 6 0 0 0 0 0 0 8 27 199 198 6 169 98 3 0 1 8 27 199 198 6 169 98 3 0 0 8 208 172 62 88 120 203 5 0 1 8 208 172 62 88 120 203 5 0 0 8 90 8 0 0 0 0 0 0 1 8 90 8 0 0 0 0 0 0 0 16 72 150 61 92 250 232 245 163 67 167 172 175 2 0 0 0 1 16 72 150 61 92 250 232 245 163 67 167 172 175 2 0 0 0 0 8 109 255 102 254 0 0 0 0 1 8 109 255 102 254 0 0 0 0 0 8 36 0 0 0 0 0 0 0 1 8 36 0 0 0 0 0 0 0 0 8 235 105 3 0 0 0 0 0 1 8 235 105 3 0 0 0 0 0 0 8 157 43 115 210 3 0 0 0 1 8 157 43 115 210 3 0 0 0 0 8 227 128 137 1 0 0 0 0 1 8 227 128 137 1 0 0 0 0 0 16 21 49 26 107 236 12 129 206 3 0 0 0 0 0 0 0 1 16 21 49 26 107 236 12 129 206 3 0 0 0 0 0 0 0 0 8 129 32 189 16 1 0 0 0 1 8 129 32 189 16 1 0 0 0 0 16 146 130 114 247 111 207 165 146 3 137 7 108 202 3 0 0 1 16 146 130 114 247 111 207 165 146 3 137 7 108 202 3 0 0 0 8 39 239 53 138 178 87 103 0 1 8 39 239 53 138 178 87 103 0 0 16 93 101 243 102 175 163 130 167 97 174 190 36 53 183 138 34 1 16 93 101 243 102 175 163 130 167 97 174 190 36 53 183 138 34 0 8 248 0 0 0 0 0 0 0 1 8 248 0 0 0 0 0 0 0 0 16 62 103 144 183 253 247 47 175 131 2 146 108 70 0 0 0 1 16 62 103 144 183 253 247 47 175 131 2 146 108 70 0 0 0 0 16 242 249 139 183 120 173 114 251 225 239 132 139 200 207 5 0 1 16 242 249 139 183 120 173 114 251 225 239 132 139 200 207 5 0 0 8 155 82 241 50 32 1 0 0 1 8 155 82 241 50 32 1 0 0 0 16 60 134 203 255 253 239 75 71 228 52 78 20 210 216 164 3 1 16 60 134 203 255 253 239 75 71 228 52 78 20 210 216 164 3 0 8 240 0 0 0 0 0 0 0 1 8 240 0 0 0 0 0 0 0 0 8 74 91 152 79 191 112 95 219 1 8 74 91 152 79 191 112 95 219 0 8 225 143 234 246 0 0 0 0 1 8 225 143 234 246 0 0 0 0 0 8 59 117 218 172 152 176 204 177 1 8 59 117 218 172 152 176 204 177 0 16 24 92 218 89 248 53 68 137 80 0 0 0 0 0 0 0 1 16 24 92 218 89 248 53 68 137 80 0 0 0 0 0 0 0 0 8 135 175 3 193 49 7 0 0 1 8 135 175 3 193 49 7 0 0 0 16 84 36 200 56 126 134 172 99 144 135 104 167 75 161 1 0 1 16 84 36 200 56 126 134 172 99 144 135 104 167 75 161 1 0 0 16 32 97 136 27 224 36 111 146 219 92 164 16 135 119 12 0 1 16 32 97 136 27 224 36 111 146 219 92 164 16 135 119 12 0 0 8 150 186 205 101 122 21 0 0 1 8 150 186 205 101 122 21 0 0 0 8 61 0 74 249 72 64 1 0 1 8 61 0 74 249 72 64 1 0 0 8 5 0 0 0 0 0 0 0 1 8 5 0 0 0 0 0 0 0 0 8 85 231 0 0 0 0 0 0 1 8 85 231 0 0 0 0 0 0 0 8 7 53 39 0 0 0 0 0 1 8 7 53 39 0 0 0 0 0 0 16 184 113 56 241 136 99 250 169 41 38 17 218 6 0 0 0 1 16 184 113 56 241 136 99 250 169 41 38 17 218 6 0 0 0 0 16 76 17 162 144 32 230 52 94 118 23 68 114 229 89 0 0 1 16 76 17 162 144 32 230 52 94 118 23 68 114 229 89 0 0 0 8 89 183 34 241 180 158 11 0 1 8 89 183 34 241 180 158 11 0 0 8 71 186 244 17 0 0 0 0 1 8 71 186 244 17 0 0 0 0 0 8 63 193 206 147 0 0 0 0 1 8 63 193 206 147 0 0 0 0 0 8 65 67 174 89 21 0 0 0 1 8 65 67 174 89 21 0 0 0 0 8 24 124 240 73 208 51 10 0 1 8 24 124 240 73 208 51 10 0 0 8 127 149 228 141 130 187 206 212 1 8 127 149 228 141 130 187 206 212 0 8 150 21 0 0 0 0 0 0 1 8 150 21 0 0 0 0 0 0 0 8 36 148 234 13 0 0 0 0 1 8 36 148 234 13 0 0 0 0 0 8 22 10 2 0 0 0 0 0 1 8 22 10 2 0 0 0 0 0 0 8 112 48 196 1 161 60 78 227 1 8 112 48 196 1 161 60 78 227 0 16 141 191 62 222 54 255 93 191 23 154 244 121 104 127 150 0 1 16 141 191 62 222 54 255 93 191 23 154 244 121 104 127 150 0 0 16 1 239 62 155 92 171 183 88 243 250 73 64 154 209 61 6 1 16 1 239 62 155 92 171 183 88 243 250 73 64 154 209 61 6 0 16 226 241 36 137 89 204 106 60 252 68 23 9 46 14 188 7 1 16 226 241 36 137 89 204 106 60 252 68 23 9 46 14 188 7 0 16 168 243 51 12 205 84 127 124 104 103 17 0 0 0 0 0 1 16 168 243 51 12 205 84 127 124 104 103 17 0 0 0 0 0 0 16 199 246 222 200 216 155 75 134 115 5 0 0 0 0 0 0 1 16 199 246 222 200 216 155 75 134 115 5 0 0 0 0 0 0 0 16 205 246 227 212 19 202 146 146 12 32 222 104 0 0 0 0 1 16 205 246 227 212 19 202 146 146 12 32 222 104 0 0 0 0 0 8 231 2 0 0 0 0 0 0 1 8 231 2 0 0 0 0 0 0 0 8 112 223 182 198 202 220 170 0 1 8 112 223 182 198 202 220 170 0 0 8 0 212 75 197 0 0 0 0 1 8 0 212 75 197 0 0 0 0 0 16 138 108 72 105 190 154 118 34 30 0 0 0 0 0 0 0 1 16 138 108 72 105 190 154 118 34 30 0 0 0 0 0 0 0 0 8 48 85 228 16 168 11 0 0 1 8 48 85 228 16 168 11 0 0 0 8 62 1 0 0 0 0 0 0 1 8 62 1 0 0 0 0 0 0 0 16 6 102 249 196 237 58 2 184 77 192 3 21 141 0 0 0 1 16 6 102 249 196 237 58 2 184 77 192 3 21 141 0 0 0 0 8 8 78 34 173 18 4 0 0 1 8 8 78 34 173 18 4 0 0 0 8 7 0 0 0 0 0 0 0 1 8 7 0 0 0 0 0 0 0 0 8 239 135 16 50 170 2 57 0 1 8 239 135 16 50 170 2 57 0 0 8 183 0 0 0 0 0 0 0 1 8 183 0 0 0 0 0 0 0 0 16 177 22 53 249 155 145 101 251 26 74 122 154 45 100 11 0 1 16 177 22 53 249 155 145 101 251 26 74 122 154 45 100 11 0 0 8 80 56 225 0 0 0 0 0 1 8 80 56 225 0 0 0 0 0 0 16 76 235 10 21 204 158 27 14 68 131 188 49 79 0 0 0 1 16 76 235 10 21 204 158 27 14 68 131 188 49 79 0 0 0 0 16 251 170 198 48 126 70 130 132 60 154 11 0 0 0 0 0 1 16 251 170 198 48 126 70 130 132 60 154 11 0 0 0 0 0 0 8 191 30 191 254 3 0 0 0 1 8 191 30 191 254 3 0 0 0 0 16 54 216 58 148 106 237 238 143 196 75 61 50 0 0 0 0 1 16 54 216 58 148 106 237 238 143 196 75 61 50 0 0 0 0 0 8 179 134 5 0 0 0 0 0 1 8 179 134 5 0 0 0 0 0 0 16 241 40 126 116 35 208 214 118 64 224 2 0 0 0 0 0 1 16 241 40 126 116 35 208 214 118 64 224 2 0 0 0 0 0 0 8 192 249 163 87 76 23 44 169 1 8 192 249 163 87 76 23 44 169 0 8 20 54 151 190 175 212 60 7 1 8 20 54 151 190 175 212 60 7 0 8 216 96 161 160 23 138 1 0 1 8 216 96 161 160 23 138 1 0 0 16 229 209 203 219 86 233 187 99 117 0 0 0 0 0 0 0 1 16 229 209 203 219 86 233 187 99 117 0 0 0 0 0 0 0 0 16 245 229 198 81 226 138 11 41 33 213 8 22 0 0 0 0 1 16 245 229 198 81 226 138 11 41 33 213 8 22 0 0 0 0 0 8 123 178 141 23 108 0 0 0 1 8 123 178 141 23 108 0 0 0 0 8 209 241 222 253 33 0 0 0 1 8 209 241 222 253 33 0 0 0 0 16 220 85 110 10 15 95 4 6 252 132 103 77 0 0 0 0 1 16 220 85 110 10 15 95 4 6 252 132 103 77 0 0 0 0 0 16 189 132 98 150 159 168 163 157 176 8 1 0 0 0 0 0 1 16 189 132 98 150 159 168 163 157 176 8 1 0 0 0 0 0 0 8 226 130 140 1 0 0 0 0 1 8 226 130 140 1 0 0 0 0 0 16 143 231 15 168 10 112 155 62 246 19 188 101 111 0 0 0 1 16 143 231 15 168 10 112 155 62 246 19 188 101 111 0 0 0 0 16 90 83 73 223 21 149 198 225 16 118 121 1 0 0 0 0 1 16 90 83 73 223 21 149 198 225 16 118 121 1 0 0 0 0 0 8 250 107 147 104 78 3 0 0 1 8 250 107 147 104 78 3 0 0 0 8 112 132 221 2 0 0 0 0 1 8 112 132 221 2 0 0 0 0 0 8 233 38 129 60 112 9 2 0 1 8 233 38 129 60 112 9 2 0 0 8 31 200 44 22 247 29 0 0 1 8 31 200 44 22 247 29 0 0 0 8 64 140 226 178 63 3 0 0 1 8 64 140 226 178 63 3 0 0 0 16 102 203 87 33 78 209 7 212 252 71 0 0 0 0 0 0 1 16 102 203 87 33 78 209 7 212 252 71 0 0 0 0 0 0 0 16 124 235 50 2 230 251 163 236 12 65 16 16 124 0 0 0 1 16 124 235 50 2 230 251 163 236 12 65 16 16 124 0 0 0 0 16 150 159 188 85 64 141 109 45 11 90 81 64 1 0 0 0 1 16 150 159 188 85 64 141 109 45 11 90 81 64 1 0 0 0 0 16 167 59 70 31 206 169 7 64 31 128 72 0 0 0 0 0 1 16 167 59 70 31 206 169 7 64 31 128 72 0 0 0 0 0 0 8 44 3 0 0 0 0 0 0 1 8 44 3 0 0 0 0 0 0 0 8 245 254 182 131 34 27 3 0 1 8 245 254 182 131 34 27 3 0 0 16 127 105 58 125 131 87 50 215 211 128 179 128 247 65 82 0 1 16 127 105 58 125 131 87 50 215 211 128 179 128 247 65 82 0 0 8 201 118 45 227 189 189 136 2 1 8 201 118 45 227 189 189 136 2 0 16 73 205 21 184 2 160 55 216 156 146 207 246 12 0 0 0 1 16 73 205 21 184 2 160 55 216 156 146 207 246 12 0 0 0 0 8 88 131 129 83 59 1 0 0 1 8 88 131 129 83 59 1 0 0 0 8 118 58 124 202 93 158 94 84 1 8 118 58 124 202 93 158 94 84 0 16 114 144 11 78 137 113 34 58 211 201 128 28 24 49 27 0 1 16 114 144 11 78 137 113 34 58 211 201 128 28 24 49 27 0 0 8 227 62 145 88 15 34 21 0 1 8 227 62 145 88 15 34 21 0 0 8 144 79 175 34 58 184 155 52 1 8 144 79 175 34 58 184 155 52 0 8 169 92 48 156 119 52 152 6 1 8 169 92 48 156 119 52 152 6 0 16 64 241 66 116 157 84 90 13 43 150 240 179 1 0 0 0 1 16 64 241 66 116 157 84 90 13 43 150 240 179 1 0 0 0 0 8 249 36 108 106 67 0 0 0 1 8 249 36 108 106 67 0 0 0 0 8 24 219 0 0 0 0 0 0 1 8 24 219 0 0 0 0 0 0 0 16 132 220 144 75 157 31 158 221 3 0 0 0 0 0 0 0 1 16 132 220 144 75 157 31 158 221 3 0 0 0 0 0 0 0 0 8 22 51 150 54 80 88 15 0 1 8 22 51 150 54 80 88 15 0 0 16 254 143 211 239 187 165 87 122 3 0 0 0 0 0 0 0 1 16 254 143 211 239 187 165 87 122 3 0 0 0 0 0 0 0 0 16 90 132 24 254 5 211 89 38 55 116 158 144 100 66 0 0 1 16 90 132 24 254 5 211 89 38 55 116 158 144 100 66 0 0 0 16 119 186 36 149 246 36 59 35 232 254 155 141 203 2 0 0 1 16 119 186 36 149 246 36 59 35 232 254 155 141 203 2 0 0 0 8 203 46 49 133 154 163 0 0 1 8 203 46 49 133 154 163 0 0 0 16 173 84 223 120 95 131 253 29 244 109 99 100 18 0 0 0 1 16 173 84 223 120 95 131 253 29 244 109 99 100 18 0 0 0 0 16 163 90 76 225 185 170 229 28 217 73 104 176 75 142 57 0 1 16 163 90 76 225 185 170 229 28 217 73 104 176 75 142 57 0 0 16 253 112 155 58 247 162 195 140 168 20 3 0 0 0 0 0 1 16 253 112 155 58 247 162 195 140 168 20 3 0 0 0 0 0 0 16 249 122 124 0 146 109 174 30 4 0 0 0 0 0 0 0 1 16 249 122 124 0 146 109 174 30 4 0 0 0 0 0 0 0 0 8 144 2 45 119 93 56 2 0 1 8 144 2 45 119 93 56 2 0 0 8 45 33 10 0 0 0 0 0 1 8 45 33 10 0 0 0 0 0 0 16 186 27 85 177 145 135 52 106 165 148 53 70 246 1 0 0 1 16 186 27 85 177 145 135 52 106 165 148 53 70 246 1 0 0 0 8 68 52 17 4 0 0 0 0 1 8 68 52 17 4 0 0 0 0 0 16 241 159 13 20 11 64 214 104 47 0 0 0 0 0 0 0 1 16 241 159 13 20 11 64 214 104 47 0 0 0 0 0 0 0 0 16 32 95 224 178 8 58 144 200 201 145 83 22 116 60 79 2 1 16 32 95 224 178 8 58 144 200 201 145 83 22 116 60 79 2 0 8 215 108 179 124 111 116 0 0 1 8 215 108 179 124 111 116 0 0 0 16 72 135 153 119 46 195 147 13 252 2 59 0 117 125 64 77 1 16 72 135 153 119 46 195 147 13 252 2 59 0 117 125 64 77 0 16 93 46 81 15 142 242 250 221 79 61 178 228 143 87 244 0 1 16 93 46 81 15 142 242 250 221 79 61 178 228 143 87 244 0 0 8 139 93 95 57 0 0 0 0 1 8 139 93 95 57 0 0 0 0 0 16 76 36 152 198 40 178 106 21 207 164 31 24 28 10 1 0 1 16 76 36 152 198 40 178 106 21 207 164 31 24 28 10 1 0 0 8 19 0 0 0 0 0 0 0 1 8 19 0 0 0 0 0 0 0 0 16 9 25 202 138 170 88 179 0 75 0 0 0 0 0 0 0 1 16 9 25 202 138 170 88 179 0 75 0 0 0 0 0 0 0 0 8 169 231 136 224 45 30 2 0 1 8 169 231 136 224 45 30 2 0 0 16 54 251 180 193 77 7 254 217 190 81 0 0 0 0 0 0 1 16 54 251 180 193 77 7 254 217 190 81 0 0 0 0 0 0 0 16 167 75 62 7 42 70 13 12 21 5 163 135 11 0 0 0 1 16 167 75 62 7 42 70 13 12 21 5 163 135 11 0 0 0 0 16 138 166 227 194 104 244 199 0 232 12 0 0 0 0 0 0 1 16 138 166 227 194 104 244 199 0 232 12 0 0 0 0 0 0 0 8 203 27 84 77 12 139 18 28 1 8 203 27 84 77 12 139 18 28 0 8 159 124 135 1 0 0 0 0 1 8 159 124 135 1 0 0 0 0 0 16 211 117 92 112 68 205 243 46 127 0 0 0 0 0 0 0 1 16 211 117 92 112 68 205 243 46 127 0 0 0 0 0 0 0 0 8 173 148 132 161 87 0 0 0 1 8 173 148 132 161 87 0 0 0 0 8 9 0 0 0 0 0 0 0 1 8 9 0 0 0 0 0 0 0 0 8 133 26 216 191 172 89 213 40 1 8 133 26 216 191 172 89 213 40 0 16 211 26 153 111 42 16 37 94 105 14 57 163 225 193 0 0 1 16 211 26 153 111 42 16 37 94 105 14 57 163 225 193 0 0 0 8 128 164 207 191 0 0 0 0 1 8 128 164 207 191 0 0 0 0 0 8 133 171 31 6 0 0 0 0 1 8 133 171 31 6 0 0 0 0 0 16 58 142 105 140 176 184 239 208 55 131 225 185 144 11 0 0 1 16 58 142 105 140 176 184 239 208 55 131 225 185 144 11 0 0 0 16 69 153 92 71 249 203 122 156 39 73 222 95 210 32 1 0 1 16 69 153 92 71 249 203 122 156 39 73 222 95 210 32 1 0 0 8 230 66 104 5 0 0 0 0 1 8 230 66 104 5 0 0 0 0 0 8 161 45 37 11 195 19 140 0 1 8 161 45 37 11 195 19 140 0 0 8 234 74 122 82 0 0 0 0 1 8 234 74 122 82 0 0 0 0 0 8 177 246 13 0 0 0 0 0 1 8 177 246 13 0 0 0 0 0 0 8 49 224 136 0 0 0 0 0 1 8 49 224 136 0 0 0 0 0 0 8 125 71 166 1 1 0 0 0 1 8 125 71 166 1 1 0 0 0 0 8 141 121 130 15 0 0 0 0 1 8 141 121 130 15 0 0 0 0 0 16 86 207 74 133 184 161 240 207 34 130 144 107 83 0 0 0 1 16 86 207 74 133 184 161 240 207 34 130 144 107 83 0 0 0 0 8 35 48 213 98 222 69 132 0 1 8 35 48 213 98 222 69 132 0 0 8 182 209 82 82 113 25 178 59 1 8 182 209 82 82 113 25 178 59 0 8 180 86 59 54 31 2 0 0 1 8 180 86 59 54 31 2 0 0 0 8 45 45 0 0 0 0 0 0 1 8 45 45 0 0 0 0 0 0 0 16 21 185 217 174 9 133 26 231 15 65 115 190 75 64 49 0 1 16 21 185 217 174 9 133 26 231 15 65 115 190 75 64 49 0 0 16 165 110 209 80 73 74 135 193 159 99 14 0 0 0 0 0 1 16 165 110 209 80 73 74 135 193 159 99 14 0 0 0 0 0 0 8 212 39 10 198 84 40 188 1 1 8 212 39 10 198 84 40 188 1 0 16 229 117 144 57 201 122 60 120 207 235 3 0 0 0 0 0 1 16 229 117 144 57 201 122 60 120 207 235 3 0 0 0 0 0 0 8 219 123 115 0 0 0 0 0 1 8 219 123 115 0 0 0 0 0 0 16 191 142 53 119 168 100 219 47 160 3 0 0 0 0 0 0 1 16 191 142 53 119 168 100 219 47 160 3 0 0 0 0 0 0 0 16 227 12 18 159 53 213 206 140 179 189 209 125 126 174 21 0 1 16 227 12 18 159 53 213 206 140 179 189 209 125 126 174 21 0 0 16 108 182 247 254 150 50 85 5 140 125 196 22 0 0 0 0 1 16 108 182 247 254 150 50 85 5 140 125 196 22 0 0 0 0 0 16 92 126 28 210 248 52 158 233 246 129 152 227 129 228 4 25 1 16 92 126 28 210 248 52 158 233 246 129 152 227 129 228 4 25 0 8 211 136 158 83 43 95 0 0 1 8 211 136 158 83 43 95 0 0 0 8 83 253 195 70 35 14 7 1 1 8 83 253 195 70 35 14 7 1 0 16 105 111 185 175 206 124 63 83 199 79 41 0 0 0 0 0 1 16 105 111 185 175 206 124 63 83 199 79 41 0 0 0 0 0 0 8 6 50 0 0 0 0 0 0 1 8 6 50 0 0 0 0 0 0 0 16 183 89 151 17 18 108 172 173 36 98 141 13 0 0 0 0 1 16 183 89 151 17 18 108 172 173 36 98 141 13 0 0 0 0 0 8 218 149 242 52 5 0 0 0 1 8 218 149 242 52 5 0 0 0 0 8 84 210 0 0 0 0 0 0 1 8 84 210 0 0 0 0 0 0 0 8 227 16 100 125 154 10 22 0 1 8 227 16 100 125 154 10 22 0 0 8 99 11 2 0 0 0 0 0 1 8 99 11 2 0 0 0 0 0 0 16 59 200 146 111 178 201 210 58 7 10 0 0 0 0 0 0 1 16 59 200 146 111 178 201 210 58 7 10 0 0 0 0 0 0 0 8 245 98 135 241 52 234 83 2 1 8 245 98 135 241 52 234 83 2 0 8 111 24 151 152 13 0 0 0 1 8 111 24 151 152 13 0 0 0 0 8 214 0 0 0 0 0 0 0 1 8 214 0 0 0 0 0 0 0 0 16 107 171 142 230 68 214 222 6 143 20 0 0 0 0 0 0 1 16 107 171 142 230 68 214 222 6 143 20 0 0 0 0 0 0 0 16 31 138 93 248 13 219 151 196 232 112 179 55 114 0 0 0 1 16 31 138 93 248 13 219 151 196 232 112 179 55 114 0 0 0 0 16 126 160 35 63 198 30 3 106 28 63 3 6 0 0 0 0 1 16 126 160 35 63 198 30 3 106 28 63 3 6 0 0 0 0 0 8 104 8 59 0 0 0 0 0 1 8 104 8 59 0 0 0 0 0 0 8 211 64 154 42 0 0 0 0 1 8 211 64 154 42 0 0 0 0 0 16 190 175 183 140 51 33 188 44 220 15 129 79 197 5 0 0 1 16 190 175 183 140 51 33 188 44 220 15 129 79 197 5 0 0 0 8 58 149 0 0 0 0 0 0 1 8 58 149 0 0 0 0 0 0 0 8 168 78 159 61 141 1 0 0 1 8 168 78 159 61 141 1 0 0 0 8 50 34 114 75 132 0 0 0 1 8 50 34 114 75 132 0 0 0 0 16 228 96 210 155 189 131 157 123 187 84 8 0 0 0 0 0 1 16 228 96 210 155 189 131 157 123 187 84 8 0 0 0 0 0 0 8 105 43 140 252 152 3 0 0 1 8 105 43 140 252 152 3 0 0 0 8 93 153 83 251 251 19 6 0 1 8 93 153 83 251 251 19 6 0 0 8 59 202 65 95 133 34 100 0 1 8 59 202 65 95 133 34 100 0 0 16 175 130 225 146 216 107 99 14 39 177 93 74 28 0 0 0 1 16 175 130 225 146 216 107 99 14 39 177 93 74 28 0 0 0 0 16 60 102 67 81 214 180 246 82 1 0 0 0 0 0 0 0 1 16 60 102 67 81 214 180 246 82 1 0 0 0 0 0 0 0 0 8 29 156 0 0 0 0 0 0 1 8 29 156 0 0 0 0 0 0 0 8 144 22 0 0 0 0 0 0 1 8 144 22 0 0 0 0 0 0 0 16 126 85 237 254 119 29 6 190 202 60 208 130 101 7 221 121 1 16 126 85 237 254 119 29 6 190 202 60 208 130 101 7 221 121 0 8 109 138 127 241 6 0 0 0 1 8 109 138 127 241 6 0 0 0 0 8 104 29 47 0 0 0 0 0 1 8 104 29 47 0 0 0 0 0 0 16 105 197 115 163 120 218 156 57 157 204 105 245 2 0 0 0 1 16 105 197 115 163 120 218 156 57 157 204 105 245 2 0 0 0 0 16 43 62 73 147 228 196 140 60 148 83 16 164 4 0 0 0 1 16 43 62 73 147 228 196 140 60 148 83 16 164 4 0 0 0 0 8 31 0 0 0 0 0 0 0 1 8 31 0 0 0 0 0 0 0 0 8 241 157 192 68 3 0 0 0 1 8 241 157 192 68 3 0 0 0 0 16 108 147 5 178 33 167 30 134 205 25 105 66 48 22 245 0 1 16 108 147 5 178 33 167 30 134 205 25 105 66 48 22 245 0 0 8 129 42 147 65 1 0 0 0 1 8 129 42 147 65 1 0 0 0 0 16 246 130 162 45 151 113 85 86 26 158 229 111 0 0 0 0 1 16 246 130 162 45 151 113 85 86 26 158 229 111 0 0 0 0 0 8 169 64 0 0 0 0 0 0 1 8 169 64 0 0 0 0 0 0 0 8 239 189 219 253 42 82 213 153 1 8 239 189 219 253 42 82 213 153 0 8 3 41 244 12 23 4 0 0 1 8 3 41 244 12 23 4 0 0 0 16 45 29 75 228 251 90 142 140 229 6 0 0 0 0 0 0 1 16 45 29 75 228 251 90 142 140 229 6 0 0 0 0 0 0 0 8 46 253 114 12 61 0 0 0 1 8 46 253 114 12 61 0 0 0 0 8 182 105 196 214 0 0 0 0 1 8 182 105 196 214 0 0 0 0 0 16 85 197 138 192 105 13 137 11 199 237 60 146 247 3 63 24 1 16 85 197 138 192 105 13 137 11 199 237 60 146 247 3 63 24 0 8 62 83 233 195 226 186 158 9 1 8 62 83 233 195 226 186 158 9 0 8 255 213 102 22 0 0 0 0 1 8 255 213 102 22 0 0 0 0\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/serial_txts/cpp_int64_serial32.txt",
    "content": "22 serialization::archive 10 0 0 0 0 0 8 154 227 28 82 91 187 17 0 1 8 154 227 28 82 91 187 17 0 0 4 238 2 0 0 1 4 238 2 0 0 0 8 179 21 191 74 120 31 195 5 1 8 179 21 191 74 120 31 195 5 0 8 38 72 203 241 222 183 7 0 1 8 38 72 203 241 222 183 7 0 0 4 225 3 0 0 1 4 225 3 0 0 0 8 242 170 246 107 183 113 31 11 1 8 242 170 246 107 183 113 31 11 0 8 159 2 53 187 36 166 22 4 1 8 159 2 53 187 36 166 22 4 0 4 26 205 0 0 1 4 26 205 0 0 0 8 177 10 45 114 95 1 0 0 1 8 177 10 45 114 95 1 0 0 0 4 231 42 31 0 1 4 231 42 31 0 0 4 228 0 0 0 1 4 228 0 0 0 0 8 161 235 183 0 9 0 0 0 1 8 161 235 183 0 9 0 0 0 0 4 161 84 9 0 1 4 161 84 9 0 0 4 17 21 0 0 1 4 17 21 0 0 0 8 132 60 177 2 3 0 0 0 1 8 132 60 177 2 3 0 0 0 0 8 112 146 42 85 255 28 14 50 1 8 112 146 42 85 255 28 14 50 0 8 56 155 123 75 170 217 61 52 1 8 56 155 123 75 170 217 61 52 0 8 128 184 17 143 213 41 148 184 1 8 128 184 17 143 213 41 148 184 0 8 211 92 36 214 185 177 216 48 1 8 211 92 36 214 185 177 216 48 0 8 103 144 142 223 219 161 68 11 1 8 103 144 142 223 219 161 68 11 0 4 136 9 0 0 1 4 136 9 0 0 0 8 110 109 102 36 76 159 0 0 1 8 110 109 102 36 76 159 0 0 0 8 212 44 7 134 98 246 52 74 1 8 212 44 7 134 98 246 52 74 0 8 5 18 148 245 212 213 152 2 1 8 5 18 148 245 212 213 152 2 0 8 215 29 169 9 145 141 144 10 1 8 215 29 169 9 145 141 144 10 0 4 205 0 0 0 1 4 205 0 0 0 0 8 242 218 75 187 1 0 0 0 1 8 242 218 75 187 1 0 0 0 0 8 196 242 164 7 110 253 8 0 1 8 196 242 164 7 110 253 8 0 0 8 87 7 181 132 51 102 13 0 1 8 87 7 181 132 51 102 13 0 0 4 18 228 18 0 1 4 18 228 18 0 0 4 190 5 0 0 1 4 190 5 0 0 0 4 7 0 0 0 1 4 7 0 0 0 0 4 89 137 26 12 1 4 89 137 26 12 0 4 130 0 0 0 1 4 130 0 0 0 0 8 128 249 218 245 47 115 9 1 1 8 128 249 218 245 47 115 9 1 0 8 162 100 122 44 193 2 0 0 1 8 162 100 122 44 193 2 0 0 0 8 101 75 177 242 99 85 12 0 1 8 101 75 177 242 99 85 12 0 0 8 240 219 82 212 216 69 123 0 1 8 240 219 82 212 216 69 123 0 0 8 0 241 147 64 173 200 15 13 1 8 0 241 147 64 173 200 15 13 0 8 123 176 87 114 3 0 0 0 1 8 123 176 87 114 3 0 0 0 0 8 199 125 85 138 128 0 0 0 1 8 199 125 85 138 128 0 0 0 0 8 212 151 16 161 84 117 1 0 1 8 212 151 16 161 84 117 1 0 0 4 6 0 0 0 1 4 6 0 0 0 0 4 3 195 58 0 1 4 3 195 58 0 0 8 97 114 34 212 170 208 45 0 1 8 97 114 34 212 170 208 45 0 0 4 146 232 0 0 1 4 146 232 0 0 0 8 133 179 117 190 9 133 28 13 1 8 133 179 117 190 9 133 28 13 0 8 73 171 130 38 191 22 0 0 1 8 73 171 130 38 191 22 0 0 0 8 18 152 190 20 249 26 0 0 1 8 18 152 190 20 249 26 0 0 0 4 252 198 62 5 1 4 252 198 62 5 0 8 73 97 191 10 234 239 1 0 1 8 73 97 191 10 234 239 1 0 0 8 153 44 205 37 255 196 0 0 1 8 153 44 205 37 255 196 0 0 0 8 81 132 37 54 246 238 0 0 1 8 81 132 37 54 246 238 0 0 0 4 8 53 135 13 1 4 8 53 135 13 0 4 89 148 169 6 1 4 89 148 169 6 0 4 17 159 173 20 1 4 17 159 173 20 0 8 201 182 183 82 169 6 0 0 1 8 201 182 183 82 169 6 0 0 0 4 182 0 0 0 1 4 182 0 0 0 0 4 108 16 0 0 1 4 108 16 0 0 0 4 39 236 0 0 1 4 39 236 0 0 0 8 181 1 156 121 15 32 0 0 1 8 181 1 156 121 15 32 0 0 0 8 29 56 214 10 51 145 14 0 1 8 29 56 214 10 51 145 14 0 0 4 6 0 0 0 1 4 6 0 0 0 0 4 161 199 49 0 1 4 161 199 49 0 0 4 248 149 1 0 1 4 248 149 1 0 0 8 180 167 79 137 212 132 35 1 1 8 180 167 79 137 212 132 35 1 0 4 8 0 0 0 1 4 8 0 0 0 0 4 195 6 0 0 1 4 195 6 0 0 0 4 82 1 0 0 1 4 82 1 0 0 0 8 33 248 118 22 198 96 57 183 1 8 33 248 118 22 198 96 57 183 0 8 94 181 212 144 197 233 13 0 1 8 94 181 212 144 197 233 13 0 0 8 102 74 34 111 163 102 6 0 1 8 102 74 34 111 163 102 6 0 0 8 26 210 173 182 38 49 0 0 1 8 26 210 173 182 38 49 0 0 0 4 86 0 0 0 1 4 86 0 0 0 0 4 143 140 20 0 1 4 143 140 20 0 0 8 73 116 37 159 96 31 0 0 1 8 73 116 37 159 96 31 0 0 0 8 8 37 96 156 51 81 22 12 1 8 8 37 96 156 51 81 22 12 0 4 237 236 131 159 1 4 237 236 131 159 0 4 10 0 0 0 1 4 10 0 0 0 0 8 130 141 0 7 2 2 0 0 1 8 130 141 0 7 2 2 0 0 0 4 109 195 74 15 1 4 109 195 74 15 0 4 230 2 0 0 1 4 230 2 0 0 0 4 106 192 15 1 1 4 106 192 15 1 0 4 10 163 0 0 1 4 10 163 0 0 0 8 203 163 89 123 164 84 3 0 1 8 203 163 89 123 164 84 3 0 0 4 10 0 0 0 1 4 10 0 0 0 0 8 215 165 31 197 2 167 7 0 1 8 215 165 31 197 2 167 7 0 0 4 21 0 0 0 1 4 21 0 0 0 0 4 39 38 0 0 1 4 39 38 0 0 0 4 57 137 152 9 1 4 57 137 152 9 0 8 5 3 11 74 1 0 0 0 1 8 5 3 11 74 1 0 0 0 0 4 160 216 17 103 1 4 160 216 17 103 0 4 29 8 124 52 1 4 29 8 124 52 0 8 154 188 176 41 1 0 0 0 1 8 154 188 176 41 1 0 0 0 0 8 76 178 160 131 39 5 0 0 1 8 76 178 160 131 39 5 0 0 0 8 184 146 71 183 150 91 6 0 1 8 184 146 71 183 150 91 6 0 0 8 171 6 120 246 94 47 0 0 1 8 171 6 120 246 94 47 0 0 0 8 146 132 93 2 22 222 211 5 1 8 146 132 93 2 22 222 211 5 0 8 204 2 222 46 179 175 0 0 1 8 204 2 222 46 179 175 0 0 0 8 9 148 45 199 56 52 13 0 1 8 9 148 45 199 56 52 13 0 0 4 241 190 12 0 1 4 241 190 12 0 0 8 88 52 207 19 120 43 0 0 1 8 88 52 207 19 120 43 0 0 0 8 132 70 133 92 64 29 0 0 1 8 132 70 133 92 64 29 0 0 0 4 1 0 0 0 1 4 1 0 0 0 0 8 153 12 223 211 34 6 0 0 1 8 153 12 223 211 34 6 0 0 0 8 140 14 165 245 82 66 0 0 1 8 140 14 165 245 82 66 0 0 0 4 221 15 0 0 1 4 221 15 0 0 0 8 50 119 85 166 157 1 0 0 1 8 50 119 85 166 157 1 0 0 0 4 30 3 0 0 1 4 30 3 0 0 0 4 13 245 224 15 1 4 13 245 224 15 0 8 202 238 193 147 1 0 0 0 1 8 202 238 193 147 1 0 0 0 0 8 91 182 236 7 230 82 3 0 1 8 91 182 236 7 230 82 3 0 0 8 63 175 86 139 154 53 6 37 1 8 63 175 86 139 154 53 6 37 0 8 201 71 17 19 25 0 0 0 1 8 201 71 17 19 25 0 0 0 0 4 14 211 37 0 1 4 14 211 37 0 0 8 202 176 13 183 153 3 12 1 1 8 202 176 13 183 153 3 12 1 0 8 34 164 43 13 117 0 0 0 1 8 34 164 43 13 117 0 0 0 0 8 55 100 235 195 135 199 4 0 1 8 55 100 235 195 135 199 4 0 0 4 77 59 0 0 1 4 77 59 0 0 0 4 6 0 0 0 1 4 6 0 0 0 0 8 91 176 44 141 237 201 1 0 1 8 91 176 44 141 237 201 1 0 0 8 91 247 129 23 149 242 13 0 1 8 91 247 129 23 149 242 13 0 0 4 159 244 3 0 1 4 159 244 3 0 0 8 39 216 128 123 225 164 26 0 1 8 39 216 128 123 225 164 26 0 0 8 206 236 127 202 3 0 0 0 1 8 206 236 127 202 3 0 0 0 0 8 227 22 89 80 97 163 24 23 1 8 227 22 89 80 97 163 24 23 0 8 6 163 204 40 124 57 0 0 1 8 6 163 204 40 124 57 0 0 0 4 72 96 82 7 1 4 72 96 82 7 0 8 205 145 127 61 215 220 134 3 1 8 205 145 127 61 215 220 134 3 0 4 187 177 86 19 1 4 187 177 86 19 0 8 195 158 155 140 132 204 144 36 1 8 195 158 155 140 132 204 144 36 0 8 141 29 202 70 15 0 0 0 1 8 141 29 202 70 15 0 0 0 0 8 80 57 26 165 1 0 0 0 1 8 80 57 26 165 1 0 0 0 0 4 232 14 0 0 1 4 232 14 0 0 0 4 172 7 0 0 1 4 172 7 0 0 0 8 229 247 251 162 193 189 0 0 1 8 229 247 251 162 193 189 0 0 0 4 70 15 0 0 1 4 70 15 0 0 0 4 104 115 1 0 1 4 104 115 1 0 0 4 73 175 2 0 1 4 73 175 2 0 0 8 139 107 110 161 47 228 20 0 1 8 139 107 110 161 47 228 20 0 0 8 52 16 150 150 195 76 61 0 1 8 52 16 150 150 195 76 61 0 0 8 3 233 1 255 93 196 239 229 1 8 3 233 1 255 93 196 239 229 0 4 210 243 2 0 1 4 210 243 2 0 0 4 136 103 92 0 1 4 136 103 92 0 0 8 146 79 153 7 104 181 15 0 1 8 146 79 153 7 104 181 15 0 0 4 63 136 0 0 1 4 63 136 0 0 0 4 42 206 0 0 1 4 42 206 0 0 0 4 0 0 0 0 0 4 0 0 0 0 0 8 10 253 104 129 179 201 249 12 1 8 10 253 104 129 179 201 249 12 0 4 173 0 0 0 1 4 173 0 0 0 0 4 126 150 157 0 1 4 126 150 157 0 0 8 95 103 181 13 108 192 162 0 1 8 95 103 181 13 108 192 162 0 0 4 8 34 0 0 1 4 8 34 0 0 0 8 195 39 2 201 240 221 6 0 1 8 195 39 2 201 240 221 6 0 0 4 164 73 1 0 1 4 164 73 1 0 0 8 24 150 136 250 66 244 117 28 1 8 24 150 136 250 66 244 117 28 0 8 188 211 235 56 103 1 0 0 1 8 188 211 235 56 103 1 0 0 0 8 147 116 238 204 203 134 5 0 1 8 147 116 238 204 203 134 5 0 0 4 212 155 224 212 1 4 212 155 224 212 0 8 162 39 186 255 226 48 217 253 1 8 162 39 186 255 226 48 217 253 0 4 96 45 87 0 1 4 96 45 87 0 0 4 43 0 0 0 1 4 43 0 0 0 0 8 21 190 140 128 8 199 26 0 1 8 21 190 140 128 8 199 26 0 0 8 223 96 39 236 140 66 12 0 1 8 223 96 39 236 140 66 12 0 0 8 168 80 9 35 78 0 0 0 1 8 168 80 9 35 78 0 0 0 0 8 88 244 56 44 112 0 0 0 1 8 88 244 56 44 112 0 0 0 0 8 57 42 143 22 20 0 0 0 1 8 57 42 143 22 20 0 0 0 0 8 203 139 139 233 47 120 0 0 1 8 203 139 139 233 47 120 0 0 0 8 151 136 78 80 220 201 21 3 1 8 151 136 78 80 220 201 21 3 0 8 41 214 136 67 14 14 0 0 1 8 41 214 136 67 14 14 0 0 0 4 68 146 0 0 1 4 68 146 0 0 0 8 4 125 187 175 144 13 0 0 1 8 4 125 187 175 144 13 0 0 0 8 107 43 241 204 40 37 1 0 1 8 107 43 241 204 40 37 1 0 0 4 100 212 145 7 1 4 100 212 145 7 0 8 181 219 82 238 3 185 1 0 1 8 181 219 82 238 3 185 1 0 0 8 83 219 52 188 1 0 0 0 1 8 83 219 52 188 1 0 0 0 0 4 245 60 150 2 1 4 245 60 150 2 0 4 182 3 0 0 1 4 182 3 0 0 0 8 35 242 99 17 31 0 0 0 1 8 35 242 99 17 31 0 0 0 0 8 210 109 74 20 3 0 0 0 1 8 210 109 74 20 3 0 0 0 0 4 113 0 0 0 1 4 113 0 0 0 0 4 215 146 221 1 1 4 215 146 221 1 0 4 33 0 0 0 1 4 33 0 0 0 0 4 241 68 169 0 1 4 241 68 169 0 0 8 109 184 204 61 3 0 0 0 1 8 109 184 204 61 3 0 0 0 0 8 181 132 45 203 59 0 0 0 1 8 181 132 45 203 59 0 0 0 0 8 193 232 39 3 20 5 2 0 1 8 193 232 39 3 20 5 2 0 0 4 41 222 5 0 1 4 41 222 5 0 0 8 240 84 253 169 3 245 134 14 1 8 240 84 253 169 3 245 134 14 0 8 53 101 132 186 140 107 194 48 1 8 53 101 132 186 140 107 194 48 0 4 231 3 0 0 1 4 231 3 0 0 0 4 185 12 0 0 1 4 185 12 0 0 0 8 3 35 9 8 33 0 0 0 1 8 3 35 9 8 33 0 0 0 0 4 156 36 211 5 1 4 156 36 211 5 0 4 92 228 169 22 1 4 92 228 169 22 0 4 127 62 177 0 1 4 127 62 177 0 0 4 2 0 0 0 1 4 2 0 0 0 0 8 164 101 187 91 120 0 0 0 1 8 164 101 187 91 120 0 0 0 0 4 33 58 42 0 1 4 33 58 42 0 0 4 65 43 119 4 1 4 65 43 119 4 0 4 171 27 0 0 1 4 171 27 0 0 0 8 151 115 89 236 58 107 231 6 1 8 151 115 89 236 58 107 231 6 0 8 53 244 97 77 30 194 11 0 1 8 53 244 97 77 30 194 11 0 0 4 227 66 108 47 1 4 227 66 108 47 0 4 67 137 26 0 1 4 67 137 26 0 0 8 70 250 222 204 115 159 137 0 1 8 70 250 222 204 115 159 137 0 0 8 164 93 158 196 7 0 0 0 1 8 164 93 158 196 7 0 0 0 0 8 113 106 97 177 105 0 0 0 1 8 113 106 97 177 105 0 0 0 0 4 38 28 0 0 1 4 38 28 0 0 0 4 144 3 0 0 1 4 144 3 0 0 0 8 55 211 179 66 249 0 0 0 1 8 55 211 179 66 249 0 0 0 0 4 70 208 8 215 1 4 70 208 8 215 0 4 17 174 7 0 1 4 17 174 7 0 0 4 145 40 82 0 1 4 145 40 82 0 0 8 185 14 149 132 50 7 0 0 1 8 185 14 149 132 50 7 0 0 0 4 84 17 37 245 1 4 84 17 37 245 0 8 218 94 35 43 115 7 0 0 1 8 218 94 35 43 115 7 0 0 0 8 170 8 238 147 136 37 0 0 1 8 170 8 238 147 136 37 0 0 0 8 169 153 246 116 99 150 1 0 1 8 169 153 246 116 99 150 1 0 0 8 110 23 17 63 97 104 44 241 1 8 110 23 17 63 97 104 44 241 0 4 219 131 208 47 1 4 219 131 208 47 0 8 100 16 250 222 223 5 0 0 1 8 100 16 250 222 223 5 0 0 0 4 189 0 0 0 1 4 189 0 0 0 0 8 22 198 182 249 164 1 85 6 1 8 22 198 182 249 164 1 85 6 0 4 173 137 0 0 1 4 173 137 0 0 0 4 111 190 230 246 1 4 111 190 230 246 0 8 51 99 110 105 78 69 86 3 1 8 51 99 110 105 78 69 86 3 0 8 104 165 202 140 7 0 0 0 1 8 104 165 202 140 7 0 0 0 0 4 136 13 0 0 1 4 136 13 0 0 0 8 5 138 36 135 3 0 0 0 1 8 5 138 36 135 3 0 0 0 0 8 39 105 124 108 77 96 30 0 1 8 39 105 124 108 77 96 30 0 0 4 78 159 129 13 1 4 78 159 129 13 0 8 223 6 27 79 8 0 0 0 1 8 223 6 27 79 8 0 0 0 0 8 203 6 61 205 13 0 0 0 1 8 203 6 61 205 13 0 0 0 0 8 111 62 45 160 194 14 103 96 1 8 111 62 45 160 194 14 103 96 0 4 82 143 196 30 1 4 82 143 196 30 0 4 54 0 0 0 1 4 54 0 0 0 0 8 37 180 24 111 34 94 97 0 1 8 37 180 24 111 34 94 97 0 0 4 94 61 200 42 1 4 94 61 200 42 0 8 229 205 68 230 125 0 0 0 1 8 229 205 68 230 125 0 0 0 0 4 125 1 0 0 1 4 125 1 0 0 0 4 70 69 227 171 1 4 70 69 227 171 0 8 121 93 176 157 92 133 17 34 1 8 121 93 176 157 92 133 17 34 0 8 211 207 179 76 229 87 229 73 1 8 211 207 179 76 229 87 229 73 0 4 0 0 0 0 0 4 0 0 0 0 0 4 3 0 0 0 1 4 3 0 0 0 0 8 101 90 156 136 105 177 2 0 1 8 101 90 156 136 105 177 2 0 0 8 163 122 187 139 155 245 97 88 1 8 163 122 187 139 155 245 97 88 0 8 31 100 188 227 193 143 8 0 1 8 31 100 188 227 193 143 8 0 0 4 85 153 46 1 1 4 85 153 46 1 0 8 221 254 215 194 253 123 70 0 1 8 221 254 215 194 253 123 70 0 0 8 215 60 213 115 201 17 0 0 1 8 215 60 213 115 201 17 0 0 0 4 245 0 0 0 1 4 245 0 0 0 0 4 182 69 1 0 1 4 182 69 1 0 0 4 16 115 202 1 1 4 16 115 202 1 0 8 229 38 172 10 236 158 36 0 1 8 229 38 172 10 236 158 36 0 0 4 152 18 4 0 1 4 152 18 4 0 0 4 29 0 0 0 1 4 29 0 0 0 0 8 164 28 2 236 150 2 6 0 1 8 164 28 2 236 150 2 6 0 0 8 199 130 156 17 201 5 0 0 1 8 199 130 156 17 201 5 0 0 0 4 13 53 72 26 1 4 13 53 72 26 0 8 238 224 211 162 10 18 0 0 1 8 238 224 211 162 10 18 0 0 0 8 120 226 140 214 213 131 23 1 1 8 120 226 140 214 213 131 23 1 0 4 127 6 0 0 1 4 127 6 0 0 0 4 191 27 0 0 1 4 191 27 0 0 0 8 27 167 239 216 56 139 31 36 1 8 27 167 239 216 56 139 31 36 0 4 82 31 0 0 1 4 82 31 0 0 0 4 244 0 0 0 1 4 244 0 0 0 0 4 116 7 0 0 1 4 116 7 0 0 0 4 130 5 6 0 1 4 130 5 6 0 0 4 47 2 0 0 1 4 47 2 0 0 0 8 196 55 144 21 143 144 9 0 1 8 196 55 144 21 143 144 9 0 0 8 234 45 67 110 61 33 47 0 1 8 234 45 67 110 61 33 47 0 0 4 124 0 0 0 1 4 124 0 0 0 0 8 105 213 125 231 51 0 0 0 1 8 105 213 125 231 51 0 0 0 0 8 11 175 154 185 42 1 0 0 1 8 11 175 154 185 42 1 0 0 0 8 101 255 202 218 14 0 0 0 1 8 101 255 202 218 14 0 0 0 0 4 0 0 0 0 0 4 0 0 0 0 0 4 37 7 0 0 1 4 37 7 0 0 0 8 47 33 204 49 169 12 0 0 1 8 47 33 204 49 169 12 0 0 0 8 237 178 210 116 191 60 18 0 1 8 237 178 210 116 191 60 18 0 0 8 226 16 6 156 2 0 0 0 1 8 226 16 6 156 2 0 0 0 0 8 21 186 33 53 89 1 0 0 1 8 21 186 33 53 89 1 0 0 0 4 43 243 242 11 1 4 43 243 242 11 0 4 253 48 225 0 1 4 253 48 225 0 0 4 98 116 0 0 1 4 98 116 0 0 0 4 180 159 4 1 1 4 180 159 4 1 0 4 187 2 0 0 1 4 187 2 0 0 0 4 36 0 3 2 1 4 36 0 3 2 0 4 160 47 250 0 1 4 160 47 250 0 0 4 98 0 0 0 1 4 98 0 0 0 0 8 174 190 217 68 144 74 0 0 1 8 174 190 217 68 144 74 0 0 0 4 23 145 1 0 1 4 23 145 1 0 0 4 13 0 0 0 1 4 13 0 0 0 0 4 44 1 0 0 1 4 44 1 0 0 0 4 245 250 2 0 1 4 245 250 2 0 0 4 65 32 0 0 1 4 65 32 0 0 0 8 205 117 182 80 2 0 0 0 1 8 205 117 182 80 2 0 0 0 0 4 186 246 0 0 1 4 186 246 0 0 0 8 234 122 75 99 110 255 9 0 1 8 234 122 75 99 110 255 9 0 0 4 222 223 37 8 1 4 222 223 37 8 0 8 230 26 192 136 251 74 228 31 1 8 230 26 192 136 251 74 228 31 0 4 14 0 0 0 1 4 14 0 0 0 0 8 128 177 66 193 232 29 55 0 1 8 128 177 66 193 232 29 55 0 0 8 253 35 145 164 119 248 140 2 1 8 253 35 145 164 119 248 140 2 0 4 174 117 27 0 1 4 174 117 27 0 0 8 8 228 105 75 109 68 255 25 1 8 8 228 105 75 109 68 255 25 0 4 31 0 0 0 1 4 31 0 0 0 0 8 101 158 131 43 1 0 0 0 1 8 101 158 131 43 1 0 0 0 0 4 8 103 0 0 1 4 8 103 0 0 0 4 181 252 244 53 1 4 181 252 244 53 0 8 39 186 76 130 8 0 0 0 1 8 39 186 76 130 8 0 0 0 0 4 231 168 14 0 1 4 231 168 14 0 0 8 111 30 175 61 55 124 64 1 1 8 111 30 175 61 55 124 64 1 0 8 74 60 189 200 26 84 16 2 1 8 74 60 189 200 26 84 16 2 0 4 103 99 236 0 1 4 103 99 236 0 0 4 248 30 237 0 1 4 248 30 237 0 0 4 15 0 0 0 1 4 15 0 0 0 0 4 39 0 0 0 1 4 39 0 0 0 0 4 221 30 0 0 1 4 221 30 0 0 0 8 83 158 61 244 15 140 7 0 1 8 83 158 61 244 15 140 7 0 0 8 21 183 50 199 183 253 159 0 1 8 21 183 50 199 183 253 159 0 0 4 176 107 53 5 1 4 176 107 53 5 0 4 53 53 0 0 1 4 53 53 0 0 0 4 162 140 0 0 1 4 162 140 0 0 0 4 126 253 1 0 1 4 126 253 1 0 0 4 233 141 234 3 1 4 233 141 234 3 0 8 178 136 48 203 1 0 0 0 1 8 178 136 48 203 1 0 0 0 0 4 171 0 0 0 1 4 171 0 0 0 0 4 35 241 0 0 1 4 35 241 0 0 0 4 107 5 0 0 1 4 107 5 0 0 0 8 15 48 198 223 1 0 0 0 1 8 15 48 198 223 1 0 0 0 0 8 203 94 65 224 14 96 19 27 1 8 203 94 65 224 14 96 19 27 0 8 187 120 141 217 244 218 89 38 1 8 187 120 141 217 244 218 89 38 0 8 185 95 188 66 117 96 49 6 1 8 185 95 188 66 117 96 49 6 0 8 181 238 174 109 232 4 0 0 1 8 181 238 174 109 232 4 0 0 0 8 241 227 21 206 37 0 0 0 1 8 241 227 21 206 37 0 0 0 0 8 11 46 148 129 54 81 1 0 1 8 11 46 148 129 54 81 1 0 0 4 1 0 0 0 1 4 1 0 0 0 0 4 166 181 139 21 1 4 166 181 139 21 0 4 231 3 0 0 1 4 231 3 0 0 0 8 58 0 224 93 1 0 0 0 1 8 58 0 224 93 1 0 0 0 0 4 61 170 163 0 1 4 61 170 163 0 0 4 16 0 0 0 1 4 16 0 0 0 0 8 19 80 184 100 0 136 17 0 1 8 19 80 184 100 0 136 17 0 0 4 141 166 59 0 1 4 141 166 59 0 0 4 1 0 0 0 1 4 1 0 0 0 0 4 106 120 1 0 1 4 106 120 1 0 0 4 24 0 0 0 1 4 24 0 0 0 0 8 250 206 237 235 100 45 220 2 1 8 250 206 237 235 100 45 220 2 0 4 104 0 0 0 1 4 104 0 0 0 0 8 45 124 107 88 59 188 20 0 1 8 45 124 107 88 59 188 20 0 0 8 133 86 244 174 225 3 0 0 1 8 133 86 244 174 225 3 0 0 0 4 10 106 7 0 1 4 10 106 7 0 0 8 198 151 96 192 44 105 0 0 1 8 198 151 96 192 44 105 0 0 0 4 18 6 0 0 1 4 18 6 0 0 0 8 139 29 156 22 238 7 0 0 1 8 139 29 156 22 238 7 0 0 0 4 223 115 28 171 1 4 223 115 28 171 0 4 221 148 185 62 1 4 221 148 185 62 0 4 61 47 108 1 1 4 61 47 108 1 0 8 87 157 178 141 10 0 0 0 1 8 87 157 178 141 10 0 0 0 0 8 86 94 188 134 23 82 0 0 1 8 86 94 188 134 23 82 0 0 0 4 179 64 23 0 1 4 179 64 23 0 0 4 113 45 10 0 1 4 113 45 10 0 0 8 204 227 150 219 42 98 0 0 1 8 204 227 150 219 42 98 0 0 0 8 72 207 3 4 107 1 0 0 1 8 72 207 3 4 107 1 0 0 0 4 242 22 0 0 1 4 242 22 0 0 0 8 43 248 193 8 8 37 19 0 1 8 43 248 193 8 8 37 19 0 0 8 135 156 114 210 151 8 0 0 1 8 135 156 114 210 151 8 0 0 0 4 126 63 25 0 1 4 126 63 25 0 0 4 94 41 0 0 1 4 94 41 0 0 0 4 132 46 67 3 1 4 132 46 67 3 0 4 12 53 213 1 1 4 12 53 213 1 0 4 224 181 149 0 1 4 224 181 149 0 0 8 214 73 249 129 122 0 0 0 1 8 214 73 249 129 122 0 0 0 0 8 141 160 27 51 90 159 14 0 1 8 141 160 27 51 90 159 14 0 0 8 123 185 72 150 135 30 2 0 1 8 123 185 72 150 135 30 2 0 0 8 132 79 251 109 16 13 0 0 1 8 132 79 251 109 16 13 0 0 0 4 187 0 0 0 1 4 187 0 0 0 0 4 26 47 114 1 1 4 26 47 114 1 0 8 36 142 132 192 11 54 198 0 1 8 36 142 132 192 11 54 198 0 0 4 167 191 148 125 1 4 167 191 148 125 0 8 234 206 244 113 18 198 0 0 1 8 234 206 244 113 18 198 0 0 0 4 3 143 18 0 1 4 3 143 18 0 0 4 62 157 58 195 1 4 62 157 58 195 0 8 172 170 222 106 83 163 194 4 1 8 172 170 222 106 83 163 194 4 0 4 88 220 20 57 1 4 88 220 20 57 0 8 167 245 187 129 1 0 0 0 1 8 167 245 187 129 1 0 0 0 0 4 164 130 167 36 1 4 164 130 167 36 0 8 61 130 34 172 248 118 0 0 1 8 61 130 34 172 248 118 0 0 0 4 40 22 12 0 1 4 40 22 12 0 0 4 209 1 0 0 1 4 209 1 0 0 0 8 170 133 218 207 1 0 0 0 1 8 170 133 218 207 1 0 0 0 0 4 223 195 71 3 1 4 223 195 71 3 0 8 197 87 218 147 1 0 0 0 1 8 197 87 218 147 1 0 0 0 0 8 210 1 234 57 242 124 45 0 1 8 210 1 234 57 242 124 45 0 0 8 119 110 205 24 176 195 21 0 1 8 119 110 205 24 176 195 21 0 0 4 71 104 194 0 1 4 71 104 194 0 0 8 53 164 236 57 255 127 4 0 1 8 53 164 236 57 255 127 4 0 0 8 218 132 146 91 132 77 213 4 1 8 218 132 146 91 132 77 213 4 0 8 133 79 247 151 252 1 0 0 1 8 133 79 247 151 252 1 0 0 0 8 203 243 153 55 2 0 0 0 1 8 203 243 153 55 2 0 0 0 0 4 197 193 53 2 1 4 197 193 53 2 0 4 84 5 0 0 1 4 84 5 0 0 0 8 177 187 206 97 141 85 1 0 1 8 177 187 206 97 141 85 1 0 0 4 166 94 0 0 1 4 166 94 0 0 0 8 190 247 33 10 10 0 0 0 1 8 190 247 33 10 10 0 0 0 0 8 61 186 120 114 110 34 74 14 1 8 61 186 120 114 110 34 74 14 0 4 48 152 216 0 1 4 48 152 216 0 0 8 157 24 37 230 113 32 156 61 1 8 157 24 37 230 113 32 156 61 0 8 26 71 250 167 179 175 252 27 1 8 26 71 250 167 179 175 252 27 0 4 138 11 1 0 1 4 138 11 1 0 0 8 64 228 47 79 174 153 235 1 1 8 64 228 47 79 174 153 235 1 0 4 12 0 0 0 1 4 12 0 0 0 0 8 227 20 33 239 16 0 0 0 1 8 227 20 33 239 16 0 0 0 0 4 89 117 39 6 1 4 89 117 39 6 0 8 56 143 170 210 159 0 0 0 1 8 56 143 170 210 159 0 0 0 0 8 83 94 139 170 42 227 7 0 1 8 83 94 139 170 42 227 7 0 0 8 158 24 234 182 90 0 0 0 1 8 158 24 234 182 90 0 0 0 0 4 184 250 218 70 1 4 184 250 218 70 0 4 199 13 0 0 1 4 199 13 0 0 0 8 162 245 210 10 15 0 0 0 1 8 162 245 210 10 15 0 0 0 0 4 163 218 24 0 1 4 163 218 24 0 0 4 14 0 0 0 1 4 14 0 0 0 0 4 167 97 145 202 1 4 167 97 145 202 0 8 207 69 56 26 219 188 172 2 1 8 207 69 56 26 219 188 172 2 0 4 19 245 0 0 1 4 19 245 0 0 0 4 101 116 0 0 1 4 101 116 0 0 0 8 144 67 225 251 217 0 96 0 1 8 144 67 225 251 217 0 96 0 0 8 141 129 40 88 123 180 46 1 1 8 141 129 40 88 123 180 46 1 0 4 83 65 0 0 1 4 83 65 0 0 0 4 1 71 241 42 1 4 1 71 241 42 0 4 201 82 0 0 1 4 201 82 0 0 0 4 143 3 0 0 1 4 143 3 0 0 0 4 140 29 0 0 1 4 140 29 0 0 0 4 209 38 0 0 1 4 209 38 0 0 0 4 34 69 0 0 1 4 34 69 0 0 0 8 221 163 103 107 78 53 11 0 1 8 221 163 103 107 78 53 11 0 0 4 210 46 149 42 1 4 210 46 149 42 0 4 48 85 36 205 1 4 48 85 36 205 0 4 37 35 35 0 1 4 37 35 35 0 0 4 13 0 0 0 1 4 13 0 0 0 0 8 46 173 250 215 165 229 166 2 1 8 46 173 250 215 165 229 166 2 0 8 67 188 30 254 109 2 0 0 1 8 67 188 30 254 109 2 0 0 0 4 137 152 11 16 1 4 137 152 11 16 0 8 152 52 243 192 36 1 0 0 1 8 152 52 243 192 36 1 0 0 0 4 129 59 0 0 1 4 129 59 0 0 0 8 201 94 53 127 56 0 0 0 1 8 201 94 53 127 56 0 0 0 0 8 73 236 21 75 203 154 66 5 1 8 73 236 21 75 203 154 66 5 0 8 196 244 167 127 116 213 0 0 1 8 196 244 167 127 116 213 0 0 0 8 63 43 243 86 100 247 101 30 1 8 63 43 243 86 100 247 101 30 0 4 179 18 79 0 1 4 179 18 79 0 0 4 62 229 32 2 1 4 62 229 32 2 0 8 191 161 29 68 10 28 0 0 1 8 191 161 29 68 10 28 0 0 0 4 157 0 0 0 1 4 157 0 0 0 0 8 177 110 144 211 209 51 0 0 1 8 177 110 144 211 209 51 0 0 0 4 38 140 6 0 1 4 38 140 6 0 0 4 230 31 0 0 1 4 230 31 0 0 0 4 240 94 116 15 1 4 240 94 116 15 0 4 182 7 0 0 1 4 182 7 0 0 0 8 1 177 12 133 96 0 0 0 1 8 1 177 12 133 96 0 0 0 0 4 240 7 185 0 1 4 240 7 185 0 0 4 243 73 7 0 1 4 243 73 7 0 0 4 26 0 0 0 1 4 26 0 0 0 0 8 103 9 1 204 46 0 0 0 1 8 103 9 1 204 46 0 0 0 0 8 98 214 177 103 24 96 0 0 1 8 98 214 177 103 24 96 0 0 0 8 81 174 115 76 247 124 0 0 1 8 81 174 115 76 247 124 0 0 0 4 61 12 0 0 1 4 61 12 0 0 0 4 85 161 0 0 1 4 85 161 0 0 0 8 101 4 40 150 22 103 32 0 1 8 101 4 40 150 22 103 32 0 0 4 103 2 0 0 1 4 103 2 0 0 0 4 60 153 25 0 1 4 60 153 25 0 0 4 143 111 7 0 1 4 143 111 7 0 0 8 80 120 24 232 225 5 0 0 1 8 80 120 24 232 225 5 0 0 0 4 174 134 41 0 1 4 174 134 41 0 0 4 113 152 62 21 1 4 113 152 62 21 0 4 241 24 81 31 1 4 241 24 81 31 0 8 82 153 37 103 160 93 6 0 1 8 82 153 37 103 160 93 6 0 0 8 40 224 161 201 3 0 0 0 1 8 40 224 161 201 3 0 0 0 0 4 19 3 0 0 1 4 19 3 0 0 0 4 82 0 0 0 1 4 82 0 0 0 0 8 64 200 218 23 94 23 70 119 1 8 64 200 218 23 94 23 70 119 0 4 15 139 7 0 1 4 15 139 7 0 0 4 18 20 0 0 1 4 18 20 0 0 0 8 128 37 176 212 38 112 1 0 1 8 128 37 176 212 38 112 1 0 0 8 13 125 43 146 204 213 0 0 1 8 13 125 43 146 204 213 0 0 0 4 14 0 0 0 1 4 14 0 0 0 0 4 70 145 5 0 1 4 70 145 5 0 0 8 186 122 94 51 73 69 56 8 1 8 186 122 94 51 73 69 56 8 0 4 77 183 3 0 1 4 77 183 3 0 0 8 217 138 24 241 155 207 0 0 1 8 217 138 24 241 155 207 0 0 0 4 150 0 0 0 1 4 150 0 0 0 0 4 196 49 182 125 1 4 196 49 182 125 0 4 133 3 165 0 1 4 133 3 165 0 0 8 0 245 2 102 53 0 0 0 1 8 0 245 2 102 53 0 0 0 0 4 35 187 7 0 1 4 35 187 7 0 0 4 217 58 0 0 1 4 217 58 0 0 0 8 93 4 23 102 114 100 3 1 1 8 93 4 23 102 114 100 3 1 0 4 18 224 241 10 1 4 18 224 241 10 0 4 100 120 0 0 1 4 100 120 0 0\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/serial_txts/cpp_int64_serial64.txt",
    "content": "22 serialization::archive 10 0 0 0 0 0 8 154 227 28 82 91 187 17 0 1 8 154 227 28 82 91 187 17 0 0 8 238 2 0 0 0 0 0 0 1 8 238 2 0 0 0 0 0 0 0 8 179 21 191 74 120 31 195 5 1 8 179 21 191 74 120 31 195 5 0 8 38 72 203 241 222 183 7 0 1 8 38 72 203 241 222 183 7 0 0 8 225 3 0 0 0 0 0 0 1 8 225 3 0 0 0 0 0 0 0 8 242 170 246 107 183 113 31 11 1 8 242 170 246 107 183 113 31 11 0 8 159 2 53 187 36 166 22 4 1 8 159 2 53 187 36 166 22 4 0 8 26 205 0 0 0 0 0 0 1 8 26 205 0 0 0 0 0 0 0 8 177 10 45 114 95 1 0 0 1 8 177 10 45 114 95 1 0 0 0 8 231 42 31 0 0 0 0 0 1 8 231 42 31 0 0 0 0 0 0 8 228 0 0 0 0 0 0 0 1 8 228 0 0 0 0 0 0 0 0 8 161 235 183 0 9 0 0 0 1 8 161 235 183 0 9 0 0 0 0 8 161 84 9 0 0 0 0 0 1 8 161 84 9 0 0 0 0 0 0 8 17 21 0 0 0 0 0 0 1 8 17 21 0 0 0 0 0 0 0 8 132 60 177 2 3 0 0 0 1 8 132 60 177 2 3 0 0 0 0 8 112 146 42 85 255 28 14 50 1 8 112 146 42 85 255 28 14 50 0 8 56 155 123 75 170 217 61 52 1 8 56 155 123 75 170 217 61 52 0 8 128 184 17 143 213 41 148 184 1 8 128 184 17 143 213 41 148 184 0 8 211 92 36 214 185 177 216 48 1 8 211 92 36 214 185 177 216 48 0 8 103 144 142 223 219 161 68 11 1 8 103 144 142 223 219 161 68 11 0 8 136 9 0 0 0 0 0 0 1 8 136 9 0 0 0 0 0 0 0 8 110 109 102 36 76 159 0 0 1 8 110 109 102 36 76 159 0 0 0 8 212 44 7 134 98 246 52 74 1 8 212 44 7 134 98 246 52 74 0 8 5 18 148 245 212 213 152 2 1 8 5 18 148 245 212 213 152 2 0 8 215 29 169 9 145 141 144 10 1 8 215 29 169 9 145 141 144 10 0 8 205 0 0 0 0 0 0 0 1 8 205 0 0 0 0 0 0 0 0 8 242 218 75 187 1 0 0 0 1 8 242 218 75 187 1 0 0 0 0 8 196 242 164 7 110 253 8 0 1 8 196 242 164 7 110 253 8 0 0 8 87 7 181 132 51 102 13 0 1 8 87 7 181 132 51 102 13 0 0 8 18 228 18 0 0 0 0 0 1 8 18 228 18 0 0 0 0 0 0 8 190 5 0 0 0 0 0 0 1 8 190 5 0 0 0 0 0 0 0 8 7 0 0 0 0 0 0 0 1 8 7 0 0 0 0 0 0 0 0 8 89 137 26 12 0 0 0 0 1 8 89 137 26 12 0 0 0 0 0 8 130 0 0 0 0 0 0 0 1 8 130 0 0 0 0 0 0 0 0 8 128 249 218 245 47 115 9 1 1 8 128 249 218 245 47 115 9 1 0 8 162 100 122 44 193 2 0 0 1 8 162 100 122 44 193 2 0 0 0 8 101 75 177 242 99 85 12 0 1 8 101 75 177 242 99 85 12 0 0 8 240 219 82 212 216 69 123 0 1 8 240 219 82 212 216 69 123 0 0 8 0 241 147 64 173 200 15 13 1 8 0 241 147 64 173 200 15 13 0 8 123 176 87 114 3 0 0 0 1 8 123 176 87 114 3 0 0 0 0 8 199 125 85 138 128 0 0 0 1 8 199 125 85 138 128 0 0 0 0 8 212 151 16 161 84 117 1 0 1 8 212 151 16 161 84 117 1 0 0 8 6 0 0 0 0 0 0 0 1 8 6 0 0 0 0 0 0 0 0 8 3 195 58 0 0 0 0 0 1 8 3 195 58 0 0 0 0 0 0 8 97 114 34 212 170 208 45 0 1 8 97 114 34 212 170 208 45 0 0 8 146 232 0 0 0 0 0 0 1 8 146 232 0 0 0 0 0 0 0 8 133 179 117 190 9 133 28 13 1 8 133 179 117 190 9 133 28 13 0 8 73 171 130 38 191 22 0 0 1 8 73 171 130 38 191 22 0 0 0 8 18 152 190 20 249 26 0 0 1 8 18 152 190 20 249 26 0 0 0 8 252 198 62 5 0 0 0 0 1 8 252 198 62 5 0 0 0 0 0 8 73 97 191 10 234 239 1 0 1 8 73 97 191 10 234 239 1 0 0 8 153 44 205 37 255 196 0 0 1 8 153 44 205 37 255 196 0 0 0 8 81 132 37 54 246 238 0 0 1 8 81 132 37 54 246 238 0 0 0 8 8 53 135 13 0 0 0 0 1 8 8 53 135 13 0 0 0 0 0 8 89 148 169 6 0 0 0 0 1 8 89 148 169 6 0 0 0 0 0 8 17 159 173 20 0 0 0 0 1 8 17 159 173 20 0 0 0 0 0 8 201 182 183 82 169 6 0 0 1 8 201 182 183 82 169 6 0 0 0 8 182 0 0 0 0 0 0 0 1 8 182 0 0 0 0 0 0 0 0 8 108 16 0 0 0 0 0 0 1 8 108 16 0 0 0 0 0 0 0 8 39 236 0 0 0 0 0 0 1 8 39 236 0 0 0 0 0 0 0 8 181 1 156 121 15 32 0 0 1 8 181 1 156 121 15 32 0 0 0 8 29 56 214 10 51 145 14 0 1 8 29 56 214 10 51 145 14 0 0 8 6 0 0 0 0 0 0 0 1 8 6 0 0 0 0 0 0 0 0 8 161 199 49 0 0 0 0 0 1 8 161 199 49 0 0 0 0 0 0 8 248 149 1 0 0 0 0 0 1 8 248 149 1 0 0 0 0 0 0 8 180 167 79 137 212 132 35 1 1 8 180 167 79 137 212 132 35 1 0 8 8 0 0 0 0 0 0 0 1 8 8 0 0 0 0 0 0 0 0 8 195 6 0 0 0 0 0 0 1 8 195 6 0 0 0 0 0 0 0 8 82 1 0 0 0 0 0 0 1 8 82 1 0 0 0 0 0 0 0 8 33 248 118 22 198 96 57 183 1 8 33 248 118 22 198 96 57 183 0 8 94 181 212 144 197 233 13 0 1 8 94 181 212 144 197 233 13 0 0 8 102 74 34 111 163 102 6 0 1 8 102 74 34 111 163 102 6 0 0 8 26 210 173 182 38 49 0 0 1 8 26 210 173 182 38 49 0 0 0 8 86 0 0 0 0 0 0 0 1 8 86 0 0 0 0 0 0 0 0 8 143 140 20 0 0 0 0 0 1 8 143 140 20 0 0 0 0 0 0 8 73 116 37 159 96 31 0 0 1 8 73 116 37 159 96 31 0 0 0 8 8 37 96 156 51 81 22 12 1 8 8 37 96 156 51 81 22 12 0 8 237 236 131 159 0 0 0 0 1 8 237 236 131 159 0 0 0 0 0 8 10 0 0 0 0 0 0 0 1 8 10 0 0 0 0 0 0 0 0 8 130 141 0 7 2 2 0 0 1 8 130 141 0 7 2 2 0 0 0 8 109 195 74 15 0 0 0 0 1 8 109 195 74 15 0 0 0 0 0 8 230 2 0 0 0 0 0 0 1 8 230 2 0 0 0 0 0 0 0 8 106 192 15 1 0 0 0 0 1 8 106 192 15 1 0 0 0 0 0 8 10 163 0 0 0 0 0 0 1 8 10 163 0 0 0 0 0 0 0 8 203 163 89 123 164 84 3 0 1 8 203 163 89 123 164 84 3 0 0 8 10 0 0 0 0 0 0 0 1 8 10 0 0 0 0 0 0 0 0 8 215 165 31 197 2 167 7 0 1 8 215 165 31 197 2 167 7 0 0 8 21 0 0 0 0 0 0 0 1 8 21 0 0 0 0 0 0 0 0 8 39 38 0 0 0 0 0 0 1 8 39 38 0 0 0 0 0 0 0 8 57 137 152 9 0 0 0 0 1 8 57 137 152 9 0 0 0 0 0 8 5 3 11 74 1 0 0 0 1 8 5 3 11 74 1 0 0 0 0 8 160 216 17 103 0 0 0 0 1 8 160 216 17 103 0 0 0 0 0 8 29 8 124 52 0 0 0 0 1 8 29 8 124 52 0 0 0 0 0 8 154 188 176 41 1 0 0 0 1 8 154 188 176 41 1 0 0 0 0 8 76 178 160 131 39 5 0 0 1 8 76 178 160 131 39 5 0 0 0 8 184 146 71 183 150 91 6 0 1 8 184 146 71 183 150 91 6 0 0 8 171 6 120 246 94 47 0 0 1 8 171 6 120 246 94 47 0 0 0 8 146 132 93 2 22 222 211 5 1 8 146 132 93 2 22 222 211 5 0 8 204 2 222 46 179 175 0 0 1 8 204 2 222 46 179 175 0 0 0 8 9 148 45 199 56 52 13 0 1 8 9 148 45 199 56 52 13 0 0 8 241 190 12 0 0 0 0 0 1 8 241 190 12 0 0 0 0 0 0 8 88 52 207 19 120 43 0 0 1 8 88 52 207 19 120 43 0 0 0 8 132 70 133 92 64 29 0 0 1 8 132 70 133 92 64 29 0 0 0 8 1 0 0 0 0 0 0 0 1 8 1 0 0 0 0 0 0 0 0 8 153 12 223 211 34 6 0 0 1 8 153 12 223 211 34 6 0 0 0 8 140 14 165 245 82 66 0 0 1 8 140 14 165 245 82 66 0 0 0 8 221 15 0 0 0 0 0 0 1 8 221 15 0 0 0 0 0 0 0 8 50 119 85 166 157 1 0 0 1 8 50 119 85 166 157 1 0 0 0 8 30 3 0 0 0 0 0 0 1 8 30 3 0 0 0 0 0 0 0 8 13 245 224 15 0 0 0 0 1 8 13 245 224 15 0 0 0 0 0 8 202 238 193 147 1 0 0 0 1 8 202 238 193 147 1 0 0 0 0 8 91 182 236 7 230 82 3 0 1 8 91 182 236 7 230 82 3 0 0 8 63 175 86 139 154 53 6 37 1 8 63 175 86 139 154 53 6 37 0 8 201 71 17 19 25 0 0 0 1 8 201 71 17 19 25 0 0 0 0 8 14 211 37 0 0 0 0 0 1 8 14 211 37 0 0 0 0 0 0 8 202 176 13 183 153 3 12 1 1 8 202 176 13 183 153 3 12 1 0 8 34 164 43 13 117 0 0 0 1 8 34 164 43 13 117 0 0 0 0 8 55 100 235 195 135 199 4 0 1 8 55 100 235 195 135 199 4 0 0 8 77 59 0 0 0 0 0 0 1 8 77 59 0 0 0 0 0 0 0 8 6 0 0 0 0 0 0 0 1 8 6 0 0 0 0 0 0 0 0 8 91 176 44 141 237 201 1 0 1 8 91 176 44 141 237 201 1 0 0 8 91 247 129 23 149 242 13 0 1 8 91 247 129 23 149 242 13 0 0 8 159 244 3 0 0 0 0 0 1 8 159 244 3 0 0 0 0 0 0 8 39 216 128 123 225 164 26 0 1 8 39 216 128 123 225 164 26 0 0 8 206 236 127 202 3 0 0 0 1 8 206 236 127 202 3 0 0 0 0 8 227 22 89 80 97 163 24 23 1 8 227 22 89 80 97 163 24 23 0 8 6 163 204 40 124 57 0 0 1 8 6 163 204 40 124 57 0 0 0 8 72 96 82 7 0 0 0 0 1 8 72 96 82 7 0 0 0 0 0 8 205 145 127 61 215 220 134 3 1 8 205 145 127 61 215 220 134 3 0 8 187 177 86 19 0 0 0 0 1 8 187 177 86 19 0 0 0 0 0 8 195 158 155 140 132 204 144 36 1 8 195 158 155 140 132 204 144 36 0 8 141 29 202 70 15 0 0 0 1 8 141 29 202 70 15 0 0 0 0 8 80 57 26 165 1 0 0 0 1 8 80 57 26 165 1 0 0 0 0 8 232 14 0 0 0 0 0 0 1 8 232 14 0 0 0 0 0 0 0 8 172 7 0 0 0 0 0 0 1 8 172 7 0 0 0 0 0 0 0 8 229 247 251 162 193 189 0 0 1 8 229 247 251 162 193 189 0 0 0 8 70 15 0 0 0 0 0 0 1 8 70 15 0 0 0 0 0 0 0 8 104 115 1 0 0 0 0 0 1 8 104 115 1 0 0 0 0 0 0 8 73 175 2 0 0 0 0 0 1 8 73 175 2 0 0 0 0 0 0 8 139 107 110 161 47 228 20 0 1 8 139 107 110 161 47 228 20 0 0 8 52 16 150 150 195 76 61 0 1 8 52 16 150 150 195 76 61 0 0 8 3 233 1 255 93 196 239 229 1 8 3 233 1 255 93 196 239 229 0 8 210 243 2 0 0 0 0 0 1 8 210 243 2 0 0 0 0 0 0 8 136 103 92 0 0 0 0 0 1 8 136 103 92 0 0 0 0 0 0 8 146 79 153 7 104 181 15 0 1 8 146 79 153 7 104 181 15 0 0 8 63 136 0 0 0 0 0 0 1 8 63 136 0 0 0 0 0 0 0 8 42 206 0 0 0 0 0 0 1 8 42 206 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 8 10 253 104 129 179 201 249 12 1 8 10 253 104 129 179 201 249 12 0 8 173 0 0 0 0 0 0 0 1 8 173 0 0 0 0 0 0 0 0 8 126 150 157 0 0 0 0 0 1 8 126 150 157 0 0 0 0 0 0 8 95 103 181 13 108 192 162 0 1 8 95 103 181 13 108 192 162 0 0 8 8 34 0 0 0 0 0 0 1 8 8 34 0 0 0 0 0 0 0 8 195 39 2 201 240 221 6 0 1 8 195 39 2 201 240 221 6 0 0 8 164 73 1 0 0 0 0 0 1 8 164 73 1 0 0 0 0 0 0 8 24 150 136 250 66 244 117 28 1 8 24 150 136 250 66 244 117 28 0 8 188 211 235 56 103 1 0 0 1 8 188 211 235 56 103 1 0 0 0 8 147 116 238 204 203 134 5 0 1 8 147 116 238 204 203 134 5 0 0 8 212 155 224 212 0 0 0 0 1 8 212 155 224 212 0 0 0 0 0 8 162 39 186 255 226 48 217 253 1 8 162 39 186 255 226 48 217 253 0 8 96 45 87 0 0 0 0 0 1 8 96 45 87 0 0 0 0 0 0 8 43 0 0 0 0 0 0 0 1 8 43 0 0 0 0 0 0 0 0 8 21 190 140 128 8 199 26 0 1 8 21 190 140 128 8 199 26 0 0 8 223 96 39 236 140 66 12 0 1 8 223 96 39 236 140 66 12 0 0 8 168 80 9 35 78 0 0 0 1 8 168 80 9 35 78 0 0 0 0 8 88 244 56 44 112 0 0 0 1 8 88 244 56 44 112 0 0 0 0 8 57 42 143 22 20 0 0 0 1 8 57 42 143 22 20 0 0 0 0 8 203 139 139 233 47 120 0 0 1 8 203 139 139 233 47 120 0 0 0 8 151 136 78 80 220 201 21 3 1 8 151 136 78 80 220 201 21 3 0 8 41 214 136 67 14 14 0 0 1 8 41 214 136 67 14 14 0 0 0 8 68 146 0 0 0 0 0 0 1 8 68 146 0 0 0 0 0 0 0 8 4 125 187 175 144 13 0 0 1 8 4 125 187 175 144 13 0 0 0 8 107 43 241 204 40 37 1 0 1 8 107 43 241 204 40 37 1 0 0 8 100 212 145 7 0 0 0 0 1 8 100 212 145 7 0 0 0 0 0 8 181 219 82 238 3 185 1 0 1 8 181 219 82 238 3 185 1 0 0 8 83 219 52 188 1 0 0 0 1 8 83 219 52 188 1 0 0 0 0 8 245 60 150 2 0 0 0 0 1 8 245 60 150 2 0 0 0 0 0 8 182 3 0 0 0 0 0 0 1 8 182 3 0 0 0 0 0 0 0 8 35 242 99 17 31 0 0 0 1 8 35 242 99 17 31 0 0 0 0 8 210 109 74 20 3 0 0 0 1 8 210 109 74 20 3 0 0 0 0 8 113 0 0 0 0 0 0 0 1 8 113 0 0 0 0 0 0 0 0 8 215 146 221 1 0 0 0 0 1 8 215 146 221 1 0 0 0 0 0 8 33 0 0 0 0 0 0 0 1 8 33 0 0 0 0 0 0 0 0 8 241 68 169 0 0 0 0 0 1 8 241 68 169 0 0 0 0 0 0 8 109 184 204 61 3 0 0 0 1 8 109 184 204 61 3 0 0 0 0 8 181 132 45 203 59 0 0 0 1 8 181 132 45 203 59 0 0 0 0 8 193 232 39 3 20 5 2 0 1 8 193 232 39 3 20 5 2 0 0 8 41 222 5 0 0 0 0 0 1 8 41 222 5 0 0 0 0 0 0 8 240 84 253 169 3 245 134 14 1 8 240 84 253 169 3 245 134 14 0 8 53 101 132 186 140 107 194 48 1 8 53 101 132 186 140 107 194 48 0 8 231 3 0 0 0 0 0 0 1 8 231 3 0 0 0 0 0 0 0 8 185 12 0 0 0 0 0 0 1 8 185 12 0 0 0 0 0 0 0 8 3 35 9 8 33 0 0 0 1 8 3 35 9 8 33 0 0 0 0 8 156 36 211 5 0 0 0 0 1 8 156 36 211 5 0 0 0 0 0 8 92 228 169 22 0 0 0 0 1 8 92 228 169 22 0 0 0 0 0 8 127 62 177 0 0 0 0 0 1 8 127 62 177 0 0 0 0 0 0 8 2 0 0 0 0 0 0 0 1 8 2 0 0 0 0 0 0 0 0 8 164 101 187 91 120 0 0 0 1 8 164 101 187 91 120 0 0 0 0 8 33 58 42 0 0 0 0 0 1 8 33 58 42 0 0 0 0 0 0 8 65 43 119 4 0 0 0 0 1 8 65 43 119 4 0 0 0 0 0 8 171 27 0 0 0 0 0 0 1 8 171 27 0 0 0 0 0 0 0 8 151 115 89 236 58 107 231 6 1 8 151 115 89 236 58 107 231 6 0 8 53 244 97 77 30 194 11 0 1 8 53 244 97 77 30 194 11 0 0 8 227 66 108 47 0 0 0 0 1 8 227 66 108 47 0 0 0 0 0 8 67 137 26 0 0 0 0 0 1 8 67 137 26 0 0 0 0 0 0 8 70 250 222 204 115 159 137 0 1 8 70 250 222 204 115 159 137 0 0 8 164 93 158 196 7 0 0 0 1 8 164 93 158 196 7 0 0 0 0 8 113 106 97 177 105 0 0 0 1 8 113 106 97 177 105 0 0 0 0 8 38 28 0 0 0 0 0 0 1 8 38 28 0 0 0 0 0 0 0 8 144 3 0 0 0 0 0 0 1 8 144 3 0 0 0 0 0 0 0 8 55 211 179 66 249 0 0 0 1 8 55 211 179 66 249 0 0 0 0 8 70 208 8 215 0 0 0 0 1 8 70 208 8 215 0 0 0 0 0 8 17 174 7 0 0 0 0 0 1 8 17 174 7 0 0 0 0 0 0 8 145 40 82 0 0 0 0 0 1 8 145 40 82 0 0 0 0 0 0 8 185 14 149 132 50 7 0 0 1 8 185 14 149 132 50 7 0 0 0 8 84 17 37 245 0 0 0 0 1 8 84 17 37 245 0 0 0 0 0 8 218 94 35 43 115 7 0 0 1 8 218 94 35 43 115 7 0 0 0 8 170 8 238 147 136 37 0 0 1 8 170 8 238 147 136 37 0 0 0 8 169 153 246 116 99 150 1 0 1 8 169 153 246 116 99 150 1 0 0 8 110 23 17 63 97 104 44 241 1 8 110 23 17 63 97 104 44 241 0 8 219 131 208 47 0 0 0 0 1 8 219 131 208 47 0 0 0 0 0 8 100 16 250 222 223 5 0 0 1 8 100 16 250 222 223 5 0 0 0 8 189 0 0 0 0 0 0 0 1 8 189 0 0 0 0 0 0 0 0 8 22 198 182 249 164 1 85 6 1 8 22 198 182 249 164 1 85 6 0 8 173 137 0 0 0 0 0 0 1 8 173 137 0 0 0 0 0 0 0 8 111 190 230 246 0 0 0 0 1 8 111 190 230 246 0 0 0 0 0 8 51 99 110 105 78 69 86 3 1 8 51 99 110 105 78 69 86 3 0 8 104 165 202 140 7 0 0 0 1 8 104 165 202 140 7 0 0 0 0 8 136 13 0 0 0 0 0 0 1 8 136 13 0 0 0 0 0 0 0 8 5 138 36 135 3 0 0 0 1 8 5 138 36 135 3 0 0 0 0 8 39 105 124 108 77 96 30 0 1 8 39 105 124 108 77 96 30 0 0 8 78 159 129 13 0 0 0 0 1 8 78 159 129 13 0 0 0 0 0 8 223 6 27 79 8 0 0 0 1 8 223 6 27 79 8 0 0 0 0 8 203 6 61 205 13 0 0 0 1 8 203 6 61 205 13 0 0 0 0 8 111 62 45 160 194 14 103 96 1 8 111 62 45 160 194 14 103 96 0 8 82 143 196 30 0 0 0 0 1 8 82 143 196 30 0 0 0 0 0 8 54 0 0 0 0 0 0 0 1 8 54 0 0 0 0 0 0 0 0 8 37 180 24 111 34 94 97 0 1 8 37 180 24 111 34 94 97 0 0 8 94 61 200 42 0 0 0 0 1 8 94 61 200 42 0 0 0 0 0 8 229 205 68 230 125 0 0 0 1 8 229 205 68 230 125 0 0 0 0 8 125 1 0 0 0 0 0 0 1 8 125 1 0 0 0 0 0 0 0 8 70 69 227 171 0 0 0 0 1 8 70 69 227 171 0 0 0 0 0 8 121 93 176 157 92 133 17 34 1 8 121 93 176 157 92 133 17 34 0 8 211 207 179 76 229 87 229 73 1 8 211 207 179 76 229 87 229 73 0 8 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 8 3 0 0 0 0 0 0 0 1 8 3 0 0 0 0 0 0 0 0 8 101 90 156 136 105 177 2 0 1 8 101 90 156 136 105 177 2 0 0 8 163 122 187 139 155 245 97 88 1 8 163 122 187 139 155 245 97 88 0 8 31 100 188 227 193 143 8 0 1 8 31 100 188 227 193 143 8 0 0 8 85 153 46 1 0 0 0 0 1 8 85 153 46 1 0 0 0 0 0 8 221 254 215 194 253 123 70 0 1 8 221 254 215 194 253 123 70 0 0 8 215 60 213 115 201 17 0 0 1 8 215 60 213 115 201 17 0 0 0 8 245 0 0 0 0 0 0 0 1 8 245 0 0 0 0 0 0 0 0 8 182 69 1 0 0 0 0 0 1 8 182 69 1 0 0 0 0 0 0 8 16 115 202 1 0 0 0 0 1 8 16 115 202 1 0 0 0 0 0 8 229 38 172 10 236 158 36 0 1 8 229 38 172 10 236 158 36 0 0 8 152 18 4 0 0 0 0 0 1 8 152 18 4 0 0 0 0 0 0 8 29 0 0 0 0 0 0 0 1 8 29 0 0 0 0 0 0 0 0 8 164 28 2 236 150 2 6 0 1 8 164 28 2 236 150 2 6 0 0 8 199 130 156 17 201 5 0 0 1 8 199 130 156 17 201 5 0 0 0 8 13 53 72 26 0 0 0 0 1 8 13 53 72 26 0 0 0 0 0 8 238 224 211 162 10 18 0 0 1 8 238 224 211 162 10 18 0 0 0 8 120 226 140 214 213 131 23 1 1 8 120 226 140 214 213 131 23 1 0 8 127 6 0 0 0 0 0 0 1 8 127 6 0 0 0 0 0 0 0 8 191 27 0 0 0 0 0 0 1 8 191 27 0 0 0 0 0 0 0 8 27 167 239 216 56 139 31 36 1 8 27 167 239 216 56 139 31 36 0 8 82 31 0 0 0 0 0 0 1 8 82 31 0 0 0 0 0 0 0 8 244 0 0 0 0 0 0 0 1 8 244 0 0 0 0 0 0 0 0 8 116 7 0 0 0 0 0 0 1 8 116 7 0 0 0 0 0 0 0 8 130 5 6 0 0 0 0 0 1 8 130 5 6 0 0 0 0 0 0 8 47 2 0 0 0 0 0 0 1 8 47 2 0 0 0 0 0 0 0 8 196 55 144 21 143 144 9 0 1 8 196 55 144 21 143 144 9 0 0 8 234 45 67 110 61 33 47 0 1 8 234 45 67 110 61 33 47 0 0 8 124 0 0 0 0 0 0 0 1 8 124 0 0 0 0 0 0 0 0 8 105 213 125 231 51 0 0 0 1 8 105 213 125 231 51 0 0 0 0 8 11 175 154 185 42 1 0 0 1 8 11 175 154 185 42 1 0 0 0 8 101 255 202 218 14 0 0 0 1 8 101 255 202 218 14 0 0 0 0 8 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 8 37 7 0 0 0 0 0 0 1 8 37 7 0 0 0 0 0 0 0 8 47 33 204 49 169 12 0 0 1 8 47 33 204 49 169 12 0 0 0 8 237 178 210 116 191 60 18 0 1 8 237 178 210 116 191 60 18 0 0 8 226 16 6 156 2 0 0 0 1 8 226 16 6 156 2 0 0 0 0 8 21 186 33 53 89 1 0 0 1 8 21 186 33 53 89 1 0 0 0 8 43 243 242 11 0 0 0 0 1 8 43 243 242 11 0 0 0 0 0 8 253 48 225 0 0 0 0 0 1 8 253 48 225 0 0 0 0 0 0 8 98 116 0 0 0 0 0 0 1 8 98 116 0 0 0 0 0 0 0 8 180 159 4 1 0 0 0 0 1 8 180 159 4 1 0 0 0 0 0 8 187 2 0 0 0 0 0 0 1 8 187 2 0 0 0 0 0 0 0 8 36 0 3 2 0 0 0 0 1 8 36 0 3 2 0 0 0 0 0 8 160 47 250 0 0 0 0 0 1 8 160 47 250 0 0 0 0 0 0 8 98 0 0 0 0 0 0 0 1 8 98 0 0 0 0 0 0 0 0 8 174 190 217 68 144 74 0 0 1 8 174 190 217 68 144 74 0 0 0 8 23 145 1 0 0 0 0 0 1 8 23 145 1 0 0 0 0 0 0 8 13 0 0 0 0 0 0 0 1 8 13 0 0 0 0 0 0 0 0 8 44 1 0 0 0 0 0 0 1 8 44 1 0 0 0 0 0 0 0 8 245 250 2 0 0 0 0 0 1 8 245 250 2 0 0 0 0 0 0 8 65 32 0 0 0 0 0 0 1 8 65 32 0 0 0 0 0 0 0 8 205 117 182 80 2 0 0 0 1 8 205 117 182 80 2 0 0 0 0 8 186 246 0 0 0 0 0 0 1 8 186 246 0 0 0 0 0 0 0 8 234 122 75 99 110 255 9 0 1 8 234 122 75 99 110 255 9 0 0 8 222 223 37 8 0 0 0 0 1 8 222 223 37 8 0 0 0 0 0 8 230 26 192 136 251 74 228 31 1 8 230 26 192 136 251 74 228 31 0 8 14 0 0 0 0 0 0 0 1 8 14 0 0 0 0 0 0 0 0 8 128 177 66 193 232 29 55 0 1 8 128 177 66 193 232 29 55 0 0 8 253 35 145 164 119 248 140 2 1 8 253 35 145 164 119 248 140 2 0 8 174 117 27 0 0 0 0 0 1 8 174 117 27 0 0 0 0 0 0 8 8 228 105 75 109 68 255 25 1 8 8 228 105 75 109 68 255 25 0 8 31 0 0 0 0 0 0 0 1 8 31 0 0 0 0 0 0 0 0 8 101 158 131 43 1 0 0 0 1 8 101 158 131 43 1 0 0 0 0 8 8 103 0 0 0 0 0 0 1 8 8 103 0 0 0 0 0 0 0 8 181 252 244 53 0 0 0 0 1 8 181 252 244 53 0 0 0 0 0 8 39 186 76 130 8 0 0 0 1 8 39 186 76 130 8 0 0 0 0 8 231 168 14 0 0 0 0 0 1 8 231 168 14 0 0 0 0 0 0 8 111 30 175 61 55 124 64 1 1 8 111 30 175 61 55 124 64 1 0 8 74 60 189 200 26 84 16 2 1 8 74 60 189 200 26 84 16 2 0 8 103 99 236 0 0 0 0 0 1 8 103 99 236 0 0 0 0 0 0 8 248 30 237 0 0 0 0 0 1 8 248 30 237 0 0 0 0 0 0 8 15 0 0 0 0 0 0 0 1 8 15 0 0 0 0 0 0 0 0 8 39 0 0 0 0 0 0 0 1 8 39 0 0 0 0 0 0 0 0 8 221 30 0 0 0 0 0 0 1 8 221 30 0 0 0 0 0 0 0 8 83 158 61 244 15 140 7 0 1 8 83 158 61 244 15 140 7 0 0 8 21 183 50 199 183 253 159 0 1 8 21 183 50 199 183 253 159 0 0 8 176 107 53 5 0 0 0 0 1 8 176 107 53 5 0 0 0 0 0 8 53 53 0 0 0 0 0 0 1 8 53 53 0 0 0 0 0 0 0 8 162 140 0 0 0 0 0 0 1 8 162 140 0 0 0 0 0 0 0 8 126 253 1 0 0 0 0 0 1 8 126 253 1 0 0 0 0 0 0 8 233 141 234 3 0 0 0 0 1 8 233 141 234 3 0 0 0 0 0 8 178 136 48 203 1 0 0 0 1 8 178 136 48 203 1 0 0 0 0 8 171 0 0 0 0 0 0 0 1 8 171 0 0 0 0 0 0 0 0 8 35 241 0 0 0 0 0 0 1 8 35 241 0 0 0 0 0 0 0 8 107 5 0 0 0 0 0 0 1 8 107 5 0 0 0 0 0 0 0 8 15 48 198 223 1 0 0 0 1 8 15 48 198 223 1 0 0 0 0 8 203 94 65 224 14 96 19 27 1 8 203 94 65 224 14 96 19 27 0 8 187 120 141 217 244 218 89 38 1 8 187 120 141 217 244 218 89 38 0 8 185 95 188 66 117 96 49 6 1 8 185 95 188 66 117 96 49 6 0 8 181 238 174 109 232 4 0 0 1 8 181 238 174 109 232 4 0 0 0 8 241 227 21 206 37 0 0 0 1 8 241 227 21 206 37 0 0 0 0 8 11 46 148 129 54 81 1 0 1 8 11 46 148 129 54 81 1 0 0 8 1 0 0 0 0 0 0 0 1 8 1 0 0 0 0 0 0 0 0 8 166 181 139 21 0 0 0 0 1 8 166 181 139 21 0 0 0 0 0 8 231 3 0 0 0 0 0 0 1 8 231 3 0 0 0 0 0 0 0 8 58 0 224 93 1 0 0 0 1 8 58 0 224 93 1 0 0 0 0 8 61 170 163 0 0 0 0 0 1 8 61 170 163 0 0 0 0 0 0 8 16 0 0 0 0 0 0 0 1 8 16 0 0 0 0 0 0 0 0 8 19 80 184 100 0 136 17 0 1 8 19 80 184 100 0 136 17 0 0 8 141 166 59 0 0 0 0 0 1 8 141 166 59 0 0 0 0 0 0 8 1 0 0 0 0 0 0 0 1 8 1 0 0 0 0 0 0 0 0 8 106 120 1 0 0 0 0 0 1 8 106 120 1 0 0 0 0 0 0 8 24 0 0 0 0 0 0 0 1 8 24 0 0 0 0 0 0 0 0 8 250 206 237 235 100 45 220 2 1 8 250 206 237 235 100 45 220 2 0 8 104 0 0 0 0 0 0 0 1 8 104 0 0 0 0 0 0 0 0 8 45 124 107 88 59 188 20 0 1 8 45 124 107 88 59 188 20 0 0 8 133 86 244 174 225 3 0 0 1 8 133 86 244 174 225 3 0 0 0 8 10 106 7 0 0 0 0 0 1 8 10 106 7 0 0 0 0 0 0 8 198 151 96 192 44 105 0 0 1 8 198 151 96 192 44 105 0 0 0 8 18 6 0 0 0 0 0 0 1 8 18 6 0 0 0 0 0 0 0 8 139 29 156 22 238 7 0 0 1 8 139 29 156 22 238 7 0 0 0 8 223 115 28 171 0 0 0 0 1 8 223 115 28 171 0 0 0 0 0 8 221 148 185 62 0 0 0 0 1 8 221 148 185 62 0 0 0 0 0 8 61 47 108 1 0 0 0 0 1 8 61 47 108 1 0 0 0 0 0 8 87 157 178 141 10 0 0 0 1 8 87 157 178 141 10 0 0 0 0 8 86 94 188 134 23 82 0 0 1 8 86 94 188 134 23 82 0 0 0 8 179 64 23 0 0 0 0 0 1 8 179 64 23 0 0 0 0 0 0 8 113 45 10 0 0 0 0 0 1 8 113 45 10 0 0 0 0 0 0 8 204 227 150 219 42 98 0 0 1 8 204 227 150 219 42 98 0 0 0 8 72 207 3 4 107 1 0 0 1 8 72 207 3 4 107 1 0 0 0 8 242 22 0 0 0 0 0 0 1 8 242 22 0 0 0 0 0 0 0 8 43 248 193 8 8 37 19 0 1 8 43 248 193 8 8 37 19 0 0 8 135 156 114 210 151 8 0 0 1 8 135 156 114 210 151 8 0 0 0 8 126 63 25 0 0 0 0 0 1 8 126 63 25 0 0 0 0 0 0 8 94 41 0 0 0 0 0 0 1 8 94 41 0 0 0 0 0 0 0 8 132 46 67 3 0 0 0 0 1 8 132 46 67 3 0 0 0 0 0 8 12 53 213 1 0 0 0 0 1 8 12 53 213 1 0 0 0 0 0 8 224 181 149 0 0 0 0 0 1 8 224 181 149 0 0 0 0 0 0 8 214 73 249 129 122 0 0 0 1 8 214 73 249 129 122 0 0 0 0 8 141 160 27 51 90 159 14 0 1 8 141 160 27 51 90 159 14 0 0 8 123 185 72 150 135 30 2 0 1 8 123 185 72 150 135 30 2 0 0 8 132 79 251 109 16 13 0 0 1 8 132 79 251 109 16 13 0 0 0 8 187 0 0 0 0 0 0 0 1 8 187 0 0 0 0 0 0 0 0 8 26 47 114 1 0 0 0 0 1 8 26 47 114 1 0 0 0 0 0 8 36 142 132 192 11 54 198 0 1 8 36 142 132 192 11 54 198 0 0 8 167 191 148 125 0 0 0 0 1 8 167 191 148 125 0 0 0 0 0 8 234 206 244 113 18 198 0 0 1 8 234 206 244 113 18 198 0 0 0 8 3 143 18 0 0 0 0 0 1 8 3 143 18 0 0 0 0 0 0 8 62 157 58 195 0 0 0 0 1 8 62 157 58 195 0 0 0 0 0 8 172 170 222 106 83 163 194 4 1 8 172 170 222 106 83 163 194 4 0 8 88 220 20 57 0 0 0 0 1 8 88 220 20 57 0 0 0 0 0 8 167 245 187 129 1 0 0 0 1 8 167 245 187 129 1 0 0 0 0 8 164 130 167 36 0 0 0 0 1 8 164 130 167 36 0 0 0 0 0 8 61 130 34 172 248 118 0 0 1 8 61 130 34 172 248 118 0 0 0 8 40 22 12 0 0 0 0 0 1 8 40 22 12 0 0 0 0 0 0 8 209 1 0 0 0 0 0 0 1 8 209 1 0 0 0 0 0 0 0 8 170 133 218 207 1 0 0 0 1 8 170 133 218 207 1 0 0 0 0 8 223 195 71 3 0 0 0 0 1 8 223 195 71 3 0 0 0 0 0 8 197 87 218 147 1 0 0 0 1 8 197 87 218 147 1 0 0 0 0 8 210 1 234 57 242 124 45 0 1 8 210 1 234 57 242 124 45 0 0 8 119 110 205 24 176 195 21 0 1 8 119 110 205 24 176 195 21 0 0 8 71 104 194 0 0 0 0 0 1 8 71 104 194 0 0 0 0 0 0 8 53 164 236 57 255 127 4 0 1 8 53 164 236 57 255 127 4 0 0 8 218 132 146 91 132 77 213 4 1 8 218 132 146 91 132 77 213 4 0 8 133 79 247 151 252 1 0 0 1 8 133 79 247 151 252 1 0 0 0 8 203 243 153 55 2 0 0 0 1 8 203 243 153 55 2 0 0 0 0 8 197 193 53 2 0 0 0 0 1 8 197 193 53 2 0 0 0 0 0 8 84 5 0 0 0 0 0 0 1 8 84 5 0 0 0 0 0 0 0 8 177 187 206 97 141 85 1 0 1 8 177 187 206 97 141 85 1 0 0 8 166 94 0 0 0 0 0 0 1 8 166 94 0 0 0 0 0 0 0 8 190 247 33 10 10 0 0 0 1 8 190 247 33 10 10 0 0 0 0 8 61 186 120 114 110 34 74 14 1 8 61 186 120 114 110 34 74 14 0 8 48 152 216 0 0 0 0 0 1 8 48 152 216 0 0 0 0 0 0 8 157 24 37 230 113 32 156 61 1 8 157 24 37 230 113 32 156 61 0 8 26 71 250 167 179 175 252 27 1 8 26 71 250 167 179 175 252 27 0 8 138 11 1 0 0 0 0 0 1 8 138 11 1 0 0 0 0 0 0 8 64 228 47 79 174 153 235 1 1 8 64 228 47 79 174 153 235 1 0 8 12 0 0 0 0 0 0 0 1 8 12 0 0 0 0 0 0 0 0 8 227 20 33 239 16 0 0 0 1 8 227 20 33 239 16 0 0 0 0 8 89 117 39 6 0 0 0 0 1 8 89 117 39 6 0 0 0 0 0 8 56 143 170 210 159 0 0 0 1 8 56 143 170 210 159 0 0 0 0 8 83 94 139 170 42 227 7 0 1 8 83 94 139 170 42 227 7 0 0 8 158 24 234 182 90 0 0 0 1 8 158 24 234 182 90 0 0 0 0 8 184 250 218 70 0 0 0 0 1 8 184 250 218 70 0 0 0 0 0 8 199 13 0 0 0 0 0 0 1 8 199 13 0 0 0 0 0 0 0 8 162 245 210 10 15 0 0 0 1 8 162 245 210 10 15 0 0 0 0 8 163 218 24 0 0 0 0 0 1 8 163 218 24 0 0 0 0 0 0 8 14 0 0 0 0 0 0 0 1 8 14 0 0 0 0 0 0 0 0 8 167 97 145 202 0 0 0 0 1 8 167 97 145 202 0 0 0 0 0 8 207 69 56 26 219 188 172 2 1 8 207 69 56 26 219 188 172 2 0 8 19 245 0 0 0 0 0 0 1 8 19 245 0 0 0 0 0 0 0 8 101 116 0 0 0 0 0 0 1 8 101 116 0 0 0 0 0 0 0 8 144 67 225 251 217 0 96 0 1 8 144 67 225 251 217 0 96 0 0 8 141 129 40 88 123 180 46 1 1 8 141 129 40 88 123 180 46 1 0 8 83 65 0 0 0 0 0 0 1 8 83 65 0 0 0 0 0 0 0 8 1 71 241 42 0 0 0 0 1 8 1 71 241 42 0 0 0 0 0 8 201 82 0 0 0 0 0 0 1 8 201 82 0 0 0 0 0 0 0 8 143 3 0 0 0 0 0 0 1 8 143 3 0 0 0 0 0 0 0 8 140 29 0 0 0 0 0 0 1 8 140 29 0 0 0 0 0 0 0 8 209 38 0 0 0 0 0 0 1 8 209 38 0 0 0 0 0 0 0 8 34 69 0 0 0 0 0 0 1 8 34 69 0 0 0 0 0 0 0 8 221 163 103 107 78 53 11 0 1 8 221 163 103 107 78 53 11 0 0 8 210 46 149 42 0 0 0 0 1 8 210 46 149 42 0 0 0 0 0 8 48 85 36 205 0 0 0 0 1 8 48 85 36 205 0 0 0 0 0 8 37 35 35 0 0 0 0 0 1 8 37 35 35 0 0 0 0 0 0 8 13 0 0 0 0 0 0 0 1 8 13 0 0 0 0 0 0 0 0 8 46 173 250 215 165 229 166 2 1 8 46 173 250 215 165 229 166 2 0 8 67 188 30 254 109 2 0 0 1 8 67 188 30 254 109 2 0 0 0 8 137 152 11 16 0 0 0 0 1 8 137 152 11 16 0 0 0 0 0 8 152 52 243 192 36 1 0 0 1 8 152 52 243 192 36 1 0 0 0 8 129 59 0 0 0 0 0 0 1 8 129 59 0 0 0 0 0 0 0 8 201 94 53 127 56 0 0 0 1 8 201 94 53 127 56 0 0 0 0 8 73 236 21 75 203 154 66 5 1 8 73 236 21 75 203 154 66 5 0 8 196 244 167 127 116 213 0 0 1 8 196 244 167 127 116 213 0 0 0 8 63 43 243 86 100 247 101 30 1 8 63 43 243 86 100 247 101 30 0 8 179 18 79 0 0 0 0 0 1 8 179 18 79 0 0 0 0 0 0 8 62 229 32 2 0 0 0 0 1 8 62 229 32 2 0 0 0 0 0 8 191 161 29 68 10 28 0 0 1 8 191 161 29 68 10 28 0 0 0 8 157 0 0 0 0 0 0 0 1 8 157 0 0 0 0 0 0 0 0 8 177 110 144 211 209 51 0 0 1 8 177 110 144 211 209 51 0 0 0 8 38 140 6 0 0 0 0 0 1 8 38 140 6 0 0 0 0 0 0 8 230 31 0 0 0 0 0 0 1 8 230 31 0 0 0 0 0 0 0 8 240 94 116 15 0 0 0 0 1 8 240 94 116 15 0 0 0 0 0 8 182 7 0 0 0 0 0 0 1 8 182 7 0 0 0 0 0 0 0 8 1 177 12 133 96 0 0 0 1 8 1 177 12 133 96 0 0 0 0 8 240 7 185 0 0 0 0 0 1 8 240 7 185 0 0 0 0 0 0 8 243 73 7 0 0 0 0 0 1 8 243 73 7 0 0 0 0 0 0 8 26 0 0 0 0 0 0 0 1 8 26 0 0 0 0 0 0 0 0 8 103 9 1 204 46 0 0 0 1 8 103 9 1 204 46 0 0 0 0 8 98 214 177 103 24 96 0 0 1 8 98 214 177 103 24 96 0 0 0 8 81 174 115 76 247 124 0 0 1 8 81 174 115 76 247 124 0 0 0 8 61 12 0 0 0 0 0 0 1 8 61 12 0 0 0 0 0 0 0 8 85 161 0 0 0 0 0 0 1 8 85 161 0 0 0 0 0 0 0 8 101 4 40 150 22 103 32 0 1 8 101 4 40 150 22 103 32 0 0 8 103 2 0 0 0 0 0 0 1 8 103 2 0 0 0 0 0 0 0 8 60 153 25 0 0 0 0 0 1 8 60 153 25 0 0 0 0 0 0 8 143 111 7 0 0 0 0 0 1 8 143 111 7 0 0 0 0 0 0 8 80 120 24 232 225 5 0 0 1 8 80 120 24 232 225 5 0 0 0 8 174 134 41 0 0 0 0 0 1 8 174 134 41 0 0 0 0 0 0 8 113 152 62 21 0 0 0 0 1 8 113 152 62 21 0 0 0 0 0 8 241 24 81 31 0 0 0 0 1 8 241 24 81 31 0 0 0 0 0 8 82 153 37 103 160 93 6 0 1 8 82 153 37 103 160 93 6 0 0 8 40 224 161 201 3 0 0 0 1 8 40 224 161 201 3 0 0 0 0 8 19 3 0 0 0 0 0 0 1 8 19 3 0 0 0 0 0 0 0 8 82 0 0 0 0 0 0 0 1 8 82 0 0 0 0 0 0 0 0 8 64 200 218 23 94 23 70 119 1 8 64 200 218 23 94 23 70 119 0 8 15 139 7 0 0 0 0 0 1 8 15 139 7 0 0 0 0 0 0 8 18 20 0 0 0 0 0 0 1 8 18 20 0 0 0 0 0 0 0 8 128 37 176 212 38 112 1 0 1 8 128 37 176 212 38 112 1 0 0 8 13 125 43 146 204 213 0 0 1 8 13 125 43 146 204 213 0 0 0 8 14 0 0 0 0 0 0 0 1 8 14 0 0 0 0 0 0 0 0 8 70 145 5 0 0 0 0 0 1 8 70 145 5 0 0 0 0 0 0 8 186 122 94 51 73 69 56 8 1 8 186 122 94 51 73 69 56 8 0 8 77 183 3 0 0 0 0 0 1 8 77 183 3 0 0 0 0 0 0 8 217 138 24 241 155 207 0 0 1 8 217 138 24 241 155 207 0 0 0 8 150 0 0 0 0 0 0 0 1 8 150 0 0 0 0 0 0 0 0 8 196 49 182 125 0 0 0 0 1 8 196 49 182 125 0 0 0 0 0 8 133 3 165 0 0 0 0 0 1 8 133 3 165 0 0 0 0 0 0 8 0 245 2 102 53 0 0 0 1 8 0 245 2 102 53 0 0 0 0 8 35 187 7 0 0 0 0 0 1 8 35 187 7 0 0 0 0 0 0 8 217 58 0 0 0 0 0 0 1 8 217 58 0 0 0 0 0 0 0 8 93 4 23 102 114 100 3 1 1 8 93 4 23 102 114 100 3 1 0 8 18 224 241 10 0 0 0 0 1 8 18 224 241 10 0 0 0 0 0 8 100 120 0 0 0 0 0 0 1 8 100 120 0 0 0 0 0 0\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/sincos.ipp",
    "content": "// Copyright John Maddock 2006.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef SC_\n#define SC_(x) static_cast<T>(BOOST_STRINGIZE(x))\n#endif\nstatic const boost::array<boost::array<T, 3>, 351> sincos = {{{{SC_(0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00)}},\n                                                              {{SC_(1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-45), SC_(1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818790351457308800340787773674912766449462132584452348391040651604302709449379239880726512478831381302725264182410989377719891632824721505923538954718756787336781717738534589892517841597367279244325993758027159471887458619888927468693858915842127431596637785499217667152866164893680003868553832956009253404298979008131545708840033018263781326433505544641583562700173344804674499926293464492880691980275690339365803e-45), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999018181306940454689380845609002744871404956897500110086977690176562578949055656828707980423353194933884755560203023626611533678706648719853431695157198205786802969097792096779337651473648106366274410397508094269252694850980143248502445340096430658555215811691593841493933838124949891785030283170868447315870535323338409489664710335241993056422950940322493204196544853978533985277190092235175175166662055024795932e-01)}},\n                                                              {{SC_(2.80259692864963414184745916657983226256052388375303154351413656777958216537172120297327637672424316406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-45), SC_(2.80259692864963414184745916657983226256052388375303154351413656777958216537172120297327637305538709251652726302189399302131595697060675618787128325212834421675595033919045812099830759114965997778797780834590216037028749734324604341671062262121984141170908506261795217328399995070051694207174852643747661007471491085388153950316454056337188894731416167834304541739657820299760902499844561410566938370733275087498466575935335388483418932214377317214724719142755203142240541630547874210971000852044930167e-45), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999996072725227761818757523382436010979485619827590000440347910760706250315796222627314831921695340715627621329535004694534216141863971398843021645158093032804874254958679377217097895883419963322632791960267614868367018464110751226843336329749526804502021446103686642277447920958483566966767779163022051468729743460838565621454431717928897730690691764161059400654765666575293764292473950159219386917758286295006197205e-01)}},\n                                                              {{SC_(4.20389539297445121277118874986974839384078582562954731527120485166937324805758180445991456508636474609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-45), SC_(4.20389539297445121277118874986974839384078582562954731527120485166937324805758180445991455270397550462609201269889222644694135477579780213406558097593316173155133239476779615836929419876071343120971532989314549209781635141154879822077216303667702093239942499810993653083491071372581441825986232094472955340205971243975796884028319908471468409203092484306028848922723223269266129671649514061121265458553966701648599990935430386904212713721653207641489661037980396865125821447766865757966623202011002481e-45), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999991163631762464092204427610481024703842644612077500990782799211589063210541500911458371823821746369757456643806982812806123846003228662260328395521200223742443485215609381850897310524629291344568956530530262684105635460612822223837210330705593721872335387821404502143865865987389605653700871033897311375196441706482504472066650591798878127657289137553615069304296604544940870015086975449211081356049236357710750027e-01)}},\n                                                              {{SC_(8.40779078594890242554237749973949678768157165125909463054240970333874649611516360891982913017272949218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-45), SC_(8.40779078594890242554237749973949678768157165125909463054240970333874649611516360891982903111361556044623610159113781157553083820638241707252464780746529385241065915814236926695461618692810291645026043369651421342028007962602533874712596930401059391166595777353132351354736336704190050078910834200567500725387522401892079463643692576146069143395731578179123995246777807445028382991342302004768477178958229712964263884786053770003966369485261014589712284700049082525146041017974355650133493523666604208e-45), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999964654527049856368817710441924098815370578448310003963131196846356252842166003645833487295443148286288493466057531853473865963093643770093554970659404333489664430527782442632013409169209372509621725822822280428683194964710409099655027231809772830542963187159283687376144462766563252564386045904505129129380699890638470353691133935782709516334660181819672442049363705097682342862579067086527667395708957625728010687e-01)}},\n                                                              {{SC_(1.54142831075729877801610254161890774440828813606416734893277511227877019095444666163530200719833374023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-44), SC_(1.54142831075729877801610254161890774440828813606416734893277511227877019095444666163530194615774084988825358852676130889214423409846990607570847510728532690627712376828124698811004373805554947945445940658982587165803101327925691022042340834793945730630651714551646267709027625314258120286618611628110979879120205714434111724186618983889316034414274293110435526057786113651996476163163956546218796793849755436659001175560988905437079489045957123605234732369555892588189553152777884400882221479823702315e-44), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999881199938139795017415082318689332129439999784597513320524300511364072052835734476273665633558539016419647248757611892421704225588717291067846471845751360789925288829565527986759623768975753575997773800645970067273825398960965781570222907333052180870307750101932061092875046215001474627990763755720004253005726220961181931360340566888859898469699692960128833946501406695399631850637468380933106599429434314849425374e-01)}},\n                                                              {{SC_(3.22298646794707926312457804156680710194460246631598627504125705294651949017747938341926783323287963867187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-44), SC_(3.22298646794707926312457804156680710194460246631598627504125705294651949017747938341926727524573185742374636484230266362939060576715503172287379160806955106587059721162879947735886748511328881312314826032585123373233873715409532159887503072282395082993219295587670117698205854346930405798097420936363731431238400620602531307113293335307369886473931872251669066838685519427524997065747532725008631793788181680132189938777240459148366970187452325085041054979389568689596347966804174842938247660756550437e-44), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999480617911371500530682467327162452036973222198777558236011198103401604264050442462386521688828475944132820270974357744852187719530274229740373520595807665539873553993080745823439955253622478543514458940785554677862703585578090996659264673716399020742597191730642633179383457364996748943881349656994930909983016269956721448068004898707766137974729184023442461006739874323489203375832554602730784179556189605934184419e-01)}},\n                                                              {{SC_(7.42688186092153047589576679143655549578538829194553359031246190461589273823506118787918239831924438476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-44), SC_(7.42688186092153047589576679143655549578538829194553359031246190461589273823506118787917557071567734039333546138139998793069657391277551227141295908889377447469523309572292100019331359631334318174561609698634784357031155321301439148398735485598083156201912789699437880499952454662251467269128292323182720318781277898618615138713234960798201648044045228024517817220298333488925242202864692124191272173879533829613886485347072065635916938540096866697115628808888824427591990485826501618370545748403779575e-44), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999997242071291195737222470795315688710343776523925077809234320331705964284267897340031840718276442954050335356685171447220544117279261490357334686649206295189130909786729091199045220985992676527516309991379539048035055704301070927384372207584878961173246105601002640718234285492270478202155019800902822073363446671078460482683530262882597940421207717144002253386046652555081637431410126935539589794505731025710676379063e-01)}},\n                                                              {{SC_(1.05097384824361280319279718746743709846019645640738682881780121291734331201439545111497864127159118652343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-43), SC_(1.05097384824361280319279718746743709846019645640738682881780121291734331201439545111497670652327220720187698420191038233458668371840658344774702748955652055489568668246814974626901822859305738995281066066448198114020751344649620709960208002064198384905117235274182583546441284941429826369890146228651398698659788539187660433894685192269471013358968568537625675802567571975922807099858605616052408037138909868535400231927588666795931021281563837169514777440278854726220318571799562403632573245982136141e-43), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999994477269851540057627767256550640439901652882548438119239249507243164506588438069661482394963882717005084354341383831108371223875714348110550375875361891735468092383465608580594392203699927961133554924574448443357107180124203598756077136385300580115685171857809418195803009471462689144883556767944584573067238540300397625512326425856193876988499074312589335443468863296988797494008557816054949653946346405265614466521e-01)}},\n                                                              {{SC_(2.10194769648722560638559437493487419692039291281477365763560242583468662402879090222995728254318237304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-43), SC_(2.10194769648722560638559437493487419692039291281477365763560242583468662402879090222994180455663053847439087361528305867669346974725266758197621991645216443916549345974519799579636871892676112526648444061630875432364581411034670256488408102709411987031842685229809521678287117433846120945714500267214729465233728758289015332663555356907038138247888801679347356008669703897840194824797666053047570787305557626392462396479147321595075220703366096193472213477456408514532068165552987454832784517598469370e-43), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999977909079406160230511069026202561759606611530193752476956998028972658026353752278645929640856627453437091647678270578093867348912670303473993915455915738774094895059219945425455712948260097287167402615818858938341377297396988942875681514508702249864150447882439620069730994781383325744667145025187907937825146056513256418433787478833229590937485750976313958959995857469736815601150524811999423397557967975094145663405e-01)}},\n                                                              {{SC_(4.66632388620164084617601951235542071716327226644879751995103738535300430534391580295050516724586486816406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-43), SC_(4.66632388620164084617601951235542071716327226644879751995103738535300430534391580295033582185205789161845419398674547856851973379123930414244575696445912083280274388675828051112459855219307669660923033393959195552402701380143007212075019536866539095886456124694103812914692592186813095161949784665763547067799123307190932094852262291743854239589467068246000091236672783966432440796514865312222994728751652343905850683285452371439099763686518414140487338867024165200326852923049841093249444705198793873e-43), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999891127106945320080050752588736705376045224265406889707434869085988847817081832730078601216698537208723978870828429426132354223033640845300085418977379720396588632501949070635779461038749299328050727369251003094322938028991998378771012224015911587313333701442922100083787345533568931010184906661307603865664516617509537152983462675147192472775815030334087089321785263057861128893065942146589055914769708614295112037282e-01)}},\n                                                              {{SC_(1.22333355935556530291641592621209678260766867525819826874392061183578761518475630509783513844013214111328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-42), SC_(1.22333355935556530291641592621209678260766867525819826874392061183578761518475630509753000948705533479418866027375467625129135687610161180897162329185595954402814970753825051091958713527722375174828431644619848284971925661141095511345836491236689334826010659371679330787292070314641713965540731707275304824222335038176768345388241694945900470602965316849261159010127304761857501611899200514651777047976437164422797344832678448893012684055590664977502888862432076111336870979449510638233456440392092154e-42), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999251727501277221791963134483143652946098988395334861400478220036573461731864838683206477730569359918994418110092459071692590420954258112913054863293511313821049032279840033133091972315123462424997068552908251488888835340014765762041910447767748264144555345710012367897821701950047391724289924099438289720106542049969731533631374438421776311556603444490337372131933655486205390154608413468747459621886432625215014782084e-01)}},\n                                                              {{SC_(2.57838917435766341049966243325344568155568197305278902003300564235721559214198350673541426658630371093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-42), SC_(2.57838917435766341049966243325344568155568197305278902003300564235721559214198350673255737238966372051888799258963778247990152783376242111381303331610145725745772353945427357361145486695541184381321338742142669770269495102860756614147260496795107861458914054023077958024860025506704682782268721894529111699275425956795744932455234081018984532485402586765516884392364011034682787867594623024532922588091056836292782026784274713857015966608080506950980879305590087445073079381675098230575099138827876112e-42), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999996675954632777603396367790893839693036628622072176372710471667861770267289922831759275580067027867234722228430080471552582226415723987626237690981128512381741567675223648396297701756050725932395149173824330771267008371869876795254391227451236964243860781777838348733979424414018273387935180620881558052018364492093238348499691354984306857440378153948514582513764076650823260920930404915003875414931338093385440488610425e-01)}},\n                                                              {{SC_(2.96094365511833847086184060949159278539519348318507782572268528385912855771522345094126649200916290283203125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-42), SC_(2.96094365511833847086184060949159278539519348318507782572268528385912855771522345093693996739342932663804846651085820195898433848681112306343912274946090956703290365385602078892224342391181399780345406462574604119522592402659502072571781680123040917209154609109171457264508074993793451528626299861129351462001440897361404823166962990209615925574365137246754984870857324607933605053121269918918153614170251284286175857951281402587778087901842648839202937674178237986130813368757321932975610351978531701e-42), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999995616406335607226943052228668861576216757838002294669012925294791921129051796275883456903694979322501329971375447753971251773961247808436603020996111873404733070017197845470310705625912309526290295374073656496025387323329294558782671483807734805753414994834876374099993858561755751805408888198323439213097646998312370490782535190924653242809107848005183955596913373155062584166537545022162737405001739308072239264970136e-01)}},\n                                                              {{SC_(7.55720261810373846349167364268251769599445265254004955708586925501764330892484622381743974983692169189453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-42), SC_(7.55720261810373846349167364268251769599445265254004955708586925501764330892484622374550612448373730191413193303431049794041304644123408793084820745811028793562333348916456519265465336696463122961996291323668438209924140273844864059538944318277976227762678517671975595479579453080897835805446525198108109753026208669175956600936390166668134897501291587095007074691843131333212682512579039986401027805480348350886360241751644496932510052072285282083099768297529183165722660597082513542981408056777981617e-42), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999971444344294463000450108045691914274072389027232540179319088194078035322752282849196194896756803855580175797043645074196213887410097135181896784101900962704236324186319009789568789941181425532234149392153366432424993544410950289613464726947532233749725913910743043679099530150918947846596008589510245917814356607023762433721080260938839286761529865612309642958368349089189032058662245374996383379270059613802426143510423e-01)}},\n                                                              {{SC_(1.46589832353019113789331351707958126493228201739702314883506913177711045159767877521517220884561538696289062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-41), SC_(1.46589832353019113789331351707958126493228201739702314883506913177711045159767877516267208908427393861721504907325171929472720865773006275638632426304933510409951261954656218026260776426755670372542025774879490868328477422522654282360896480461898264393728557122541481302896883438232050290492523787110495425540325854976498628867329722408191317623181418915019006160748335621352766125413675429734653791931135071630025587791482079495664566178902236522056278966690016735464045305629073387162733493980906882e-41), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999892557105253568753545217864104950667197665245189775644595497906778178128656691096078303466467187938459594167417463818916417117358473643785540714442073012942743717914732037748071998704147219159170063017358513712449206088197946521436940697640711296900126660913421258179104561251733958995998165062617805307831291519562109920870718679948001278826555255838735691382758937227438223290700605918762038729941060805254738926364578e-01)}},\n                                                              {{SC_(4.29890342885567381017981761561680470754158758528877508459633408131710108346368315324070863425731658935546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-41), SC_(4.29890342885567381017981761561680470754158758528877508459633408131710108346368315191660548910487698640593276555287590068274126080495796600691159804102586379685177760662635437114892933360460302490297861538787485499296789402780765824215676091815381268645071433103144568224470731467136203368744072106184460077740479824007144285177878600537935639122698858220342265906528947489376413420658288715001310209384236877493329408364270388530486494392325150006115430411152539355170867002025305337772612859827428934e-41), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999075971465468646533180207192109630863406681770546873997223395847820009758339292966324975612532967466820309355879235997759431321194583616980614121361748306696010139554876844921925965078471560618240863429559876295366367257626963436982144381690256088162065634034183526734308381551083435025308855773105012914069158476743241978619938658527251068183076619854877720409206737387349288732114126976152205371577160652967630617123599e-01)}},\n                                                              {{SC_(4.80379126555190540083363738447616148964186596294688371716040578400259281055539872795634437352418899536132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-41), SC_(4.80379126555190540083363738447616148964186596294688371716040578400259281055539872610877338501347601219175270676662869099033699415241762387976667404536927935589076831672632599089820124680009011322734319715118623320805661025510875584717953950495972701008862867740843426026356222430890016125676658201558709582791616384491466268886310743277365390744757660647471861857386539703251775817308401899230677444627869562185725283076582085060518200835494958195542251512378077909637116291984512266293918513338503809e-41), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999998846179473850361154371674922854129986084727096709142870280757393394130581463291168610112704406499060352403499469291720728306994847837600250563158304798680794177527403425268942921796278460653093888122873284053643989868791585401086238273954075339473301544992488839606468292179655865318731156652793808004127813501461466101819147627941309038766551940761100509140381914523658200325453837791357981873672885699155514487958255331e-01)}},\n                                                              {{SC_(1.05528984751373323977124227458397004014453966318836649739481298323172386854906790176755748689174652099609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-40), SC_(1.05528984751373323977124227458397004014453966318836649739481298323172386854906789980887504771187332364132636109487217929208679431907543158803628082268875678333496411512923906603472445334327299722485190443927742726521958136503063744853505202494039957387234555933593281644632395449538000337461647675827932577828286596180344814422872806232066066010815495542783741497903180129364783147090148024196900445602757951656729695080517991132336449993528257155261985896406981415684240794679489860063828342392027328e-40), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999994431816688672208233710305042314219151101272516933748775711167580922607168373864227965541361289251010654534999802989928735915119413129451470140853636658987643574157298081896981245127358297596889192754078582247331884307559147751318090642104769338421104440133007218078588778511425272289353063257890140890461661561004041429851910440417566678968240145321910415990690683553710637026739594965677666802372650596926643292041996638e-01)}},\n                                                              {{SC_(2.01510923065301669250045085265839809426495508027668597525981690428203627063474812075583031401038169860839843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-40), SC_(2.01510923065301669250045085265839809426495508027668597525981690428203627063474810711802373032594699969810619116841404970861472887256166386048754834748113391268197763832955073628906392784795381155976046065612198436366710288821444973028946646023484366577270255382565430666890873219733228088428497141478307604678164851586001801533760898750558581710818483297283897358606526238189016006778424780680200657251336858863806486367993844372954164133250632883143114958449643914391396931717830204115391769145546484e-40), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999979696673942685035853850543073045777707954868946997951599446982788522244825490912223945146237649836813044005513754448276849194256842083656687070132896763547132020424839753567770743006368670904848300067578350340653279036966460909408461382429991769872604279825699445913799875847014991026905964403318089265513005878651764666517348099896382056900530127079726632856823997344435810758823451691867992445903154064288120383150987671e-01)}},\n                                                              {{SC_(7.32504950151904601935173936261887729052525165662936718917887575242562162025627969796914840117096900939941406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-40), SC_(7.32504950151904601935173936261887729052525165662936718917887575242562162025627904291011292837720144593431126597367515998989153198457015902750071695137835990685604892263621831515557060246307131984841519212710373547750063546014290419636943710720132280288244343650374997981943021052969538830344386792052372151384906422960252069039716388381803899141518571399834733857022053723510925721401160619649691446479064067028054989737014742554510760352969761538081403146605616293590611767277714260566785874599515793e-40), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999731718249001477877143168008532640917534029873632032252120957303589649904151885305973799269888934534909136198437925454757554860783321503630302312105520970158621889109299625562988285780953907400410390020639968947017260622162867366315832821549484018469877658751307945502656509972585482311806680315543936811858642849279465528279655411048214732456565842865876212846439566194454456637005298750822183817695104506210394947373953085e-01)}},\n                                                              {{SC_(1.33966515396841864169329118502807575007816218088696097856787714955946640149608839465145138092339038848876953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-39), SC_(1.33966515396841864169329118502807575007816218088696097856787714955946640149608799393466769935160071827043264942041685242847448108284494427393761948492846509916986077875292923082077469184325721717857533402797270511306605163459987343262256569264007349244333444115764051413257529668304213835300075569972339881302618317393221832794373332099017592930269066115891486986577472025784928127713471885695681145572611164474622978513975703266720143131891946646092594745882505672457515555881327346483090258133109813e-39), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999102648637621386587238987552746272043013454101628689499407841187184948605476876334955279870868767750800059575163137784626164589056798852834142555490085645186899015547757002677276114759208540303733026521153564543719479878946956818853456708417790933960103537105155253735839010002786196075719602911681185910630157610492301675225607916036307950416287870173505934149096254870905146725805112841309456550280335897354832252188484699e-01)}},\n                                                              {{SC_(2.67704619143998783156097669083538893686233753480866323642779027781619244352739883652247954159975051879882812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-39), SC_(2.67704619143998783156097669083538893686233753480866323642779027781619244352739563897984299105902128855302251894710143801990277685086036288881537114672707533483727518555424527302608356036356217986356197792739366250414583736898340317558602513631529933174608625249495997042977955438961972134324708577539931088346231802431204407452780232261732489676314940425767518677852657613399447450394975134408614300034765724426388230494398863554338885318201348491063100048984565134316337355192798205904718373408055959e-39), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999996416711844448328010836543119598472240469572030882370560576310418964309618728328179940611074428491474999154941510527197897854270875982495690413621119770434170978547360806493132985478957649761646330066648315631863124058757356730994348799421077276380735378148156663760085371571182147899917776000626572381366357642100541978640426148495871453988769629317000167837866856830562597160012881170553619814677812429087684105533480604824e-01)}},\n                                                              {{SC_(4.98065334862973353780613406637193167431914166341694440226118064331717501247442925205177743919193744659423828125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-39), SC_(4.98065334862973353780613406637193167431914166341694440226118064331717501247440865961706082185262300907349748068968430289329142149112388324350697105735066444850117781308977214384632246495516203852364550923245875264911126054830285447794666051901956355872882436639418664467404450121285880935039406673241090924270460939631836024048762290640271473049067456927214532714526797251300223483202814869269567316784928514501511005074814011991880011042729877301864770711496955945630526292405050391715830741638832339e-39), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999987596546110391710994379711623068869451337606096342108625478131918320009488445778250750401876191182731266979269973303293901478710089771515180173918644613342792395295337150147962833559157614103818968508131256797025993480612649131131295014985392720460404345935117219910238516012744511524766168411644949909022868757584567938463480609599435179942543723898381721040096255576605436773910863929161497154264218514163673674788342460421e-01)}},\n                                                              {{SC_(6.61322911799904004220047059873593201348655443749046971956789426212155666440217771651077782735228538513183593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-39), SC_(6.61322911799904004220047059873593201348655443749046971956789426212155666440212951180267037989278011390446684321888716336223066517279132166898428654774534689211293208975697927510796390180089112434958835354241993947050884854802882807109910568964641743255696216900096606365458624787210152018106794407805871136753532283305154054797825092007339353096964641783328787428804217368758985796365133796747731180160659350716972790789978702678899730892531705668567399746853894977141121012996122009020944132722807189e-39), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999978132600316424819458871898582377151976877276609840945795779220166843198812911241921361184270437776491458291901247500946988256003349588053268643044761577809440194145005106845400574711621718945974528696979467351650861357365416040731658845738292066488483990916744859113297684359767658520832922218399521682790249135386599957375066859000568645217385839964246827971397420685997824501311319875532430117958365665071740834286896688200e-01)}},\n                                                              {{SC_(1.54824254492961749846859045383652994857147779383512446982767538392966946703133146456821123138070106506347656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-38), SC_(1.54824254492961749846859045383652994857147779383512446982767538392966946703126961085988845194765016677224573150759279990907005138172280344305822762129830974739861817563548607584336183614347338206829196446854499415600946091562886397948974153134147914359866606123722979808726587858809602661796413993286599443541318127541811836618562120619935933142937927283356718969340037803418384915663635421018050240390063399173057203977102865070796348392652096890020237829272597410682790525617612157766125616287252744e-38), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999880147251103493067079197906492851642489951807612675096101071372809763052176814238098234757914806141252740340867410432612444896212338592468868178773649165288944334267569037833785705287027561088840334981533388491347173126442412363399111551633509256874317164512773006907444197207798073824215723487854515014273420120927829877512313201892373536931918844370906211898732256730679347491689855151383360496535317453280786049708294692770e-01)}},\n                                                              {{SC_(4.14655650189182261793630321328885828961460755538706729231614042880185722061980868602404370903968811035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-38), SC_(4.14655650189182261793630321328885828961460755538706729231614042880185722061862042592989753985866613511536161784732505728534611917389621675815565806216456733797635229753667377166650970990553431464073848921448167545536686761492234778689910956124468888048028352079425119895491432133576643928937349140475648209132764234915780601666168316129135579051679358350888091833066751395602947699623976228467139520969584938853923527081219369788343445865866087636551945529117194090170963755429299772957394707033664947e-38), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999140303458830932562495970891609851434141169762625227468703921261555172214042553364993994634622966419016883421920787233269568087911528717371496834529990991021120129680362470105835559303793013244274628533900046317008176792327455914771957236528289495804030764115202483608113943926547285214664218148302982221883326127385930775038463435090571400891500003663643560192259356160907398291267541063405411124424549800043463320847909557477e-01)}},\n                                                              {{SC_(9.16989984771782597788130033192388394290674988675850299695759145456042116251182960695587098598480224609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-38), SC_(9.16989984771782597788130033192388394290674988675850299695759145456042116249897844115270071964291065187070451428162205117773893965556440691457216154310897806331075177813107720146501971323479067623584326457128542356781061897017124711295344504641604649164572504676902618542136026936516116875011868845410581154011041055005068165526312569371383835954064173376238455385938643029758029883725569938873704091787777011093003754252650660888047134772339268203354903543272132734204180304904382006508458834331093434e-38), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999995795646839141229597049600163486950487961160605966971207927639433117443286573917272952598730352586395213231378556612129809781665455673803791882078391445491798305436834690788293112765270306893834416062496422378540679879435567787167675258265803526815917323453636547446953905378952509733862550508155185660036566272965610345657669309817400942905631053083173596575938300954384335741012857888893148639864847391669179906074771423380675e-01)}},\n                                                              {{SC_(1.40174284409382375691326091641536902948381353854352365243860788538397821323400194160058163106441497802734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-37), SC_(1.40174284409382375691326091641536902948381353854352365243860788538397821322941150712376691297505221433850032159236497718292753220163294157274980746057268308682402443770033257716345829685049988934416666205697588973059884017465980900504040551091151637072348559801709457371522176034711208838536663456112005139845564302752800851586255173206233829429750479632089286711032500609176606849490519569468727094188589180524908936230012972908141632433602684418792195948582158744208296995186130664849282559534747283e-37), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999990175584995158790521452395330292149934987246293181315818289498140837852990983340598997291574198506644414638962922288593792275112076522551276639205559930026303787875160133236787445628969231440689003816906777605687862518569148148349736607073003542934036846197242745708929670399344795068969975702827824659694309674652879251454493737996840612211561985346098039062629674466776090326736274135796172249813160074647258847047218550681667e-01)}},\n                                                              {{SC_(1.94557624033383353951438702124371913986437597061599651205892247320811128119544264336582273244857788085937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-37), SC_(1.94557624033383353951438702124371913986437597061599651205892247320811128118316843443667798911811276260782979573655043471811433560953937347381596636250270351757320824484922352524345495092588725917950183456096195479396095297149816723715887520239499660954344948495823620417694122747792675711464880383881647242003709193872670297166532991944589140423445905575281550707206772623747725383628200116441780614927532794556312983397464198282523328334749316987456840895529998261299646887219234662348063597570361594e-37), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999981073665465242325973499850572514928918968773433476252290727706213747142412896890402940728348529719295299594618859825128431836531924921078163936256958737028704143307321875801616577679750689234365062786505605378356205461533046996279728442748616071759347859462543457969102284480550870641847873336874142813399784209309858808036665885184827443870158113940056434388089580250524388193858351108489442281034092467002540157658438751846360e-01)}},\n                                                              {{SC_(6.25778729623775298048262176417037819653492494267247379139395559947273151024660364782903343439102172851562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-37), SC_(6.25778729623775298048262176417037819653492494267247379139395559947273150983817975401690962877507381485954149692981033327650991617834865104519184119130061428188738093774975277921899654100143262904731856281487753604601557753455546117850172891385055603321634400101181307965562370267510834301717555763528082516451060689486995693578669148903908270920118745103309628202998328094040623530190880768011165490634231906351433112453170352587798690643432435729816389805275266302654200777080302116699928186436416280e-37), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999804200490775226966111214503355373143794475289458519970663519021821882302293192082627747880642626873706396542685764556638857367505201946491497647523599633143848708648597649676052358311232218277829371003261111576758376332700582495048660141665559358151192500767632875806022243667932552701370660858833078445158658650315371959830990489689133490741796408732580215105542936306741728965736925282835297914658845693947125055548101972328355e-01)}},\n                                                              {{SC_(1.08239073560602090995217585692806369173691892430234761217807120271122700572163921606261283159255981445312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-36), SC_(1.08239073560602090995217585692806369173691892430234761217807120271122700551028985034672156536838775060537851211158634395935548306255588517499841223461589544558196181625229089645208230094515808394044610446532031934838322012297783463544971778652121566632444020332699464984967424106583836820627443079249218431496439763226943699593605710951086552042194684093571682506350566713599585362101737015819290889457768321375371619193837339682475558478823722791771452951524569087148988620542200906995110022069839836e-36), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999414215147737128469167864887720746679277344361554323001931299657738560350385993270574167093724891580864281120375306410266364949815767159380406106349373771695612577895176379716706515330135955237783460936144953034420281108932351416421393064032426483755702763946710102993202761795407302174421831510588548964721554672431413244801666849243141372241714766821101374200896460046332817068614637339045853629713469603736177193274739125474695e-01)}},\n                                                              {{SC_(1.69406069903391450739476895874772531773020353068657868999386494068826181091935723088681697845458984375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-36), SC_(1.69406069903391450739476895874772531773020353068657868999386494068826181010907623836633953419580256640864513774823628873707949104515727247109331100403413891290300709523854457848706858116029524709018232091056506435291372700659313907652389536318026768678059554060588900632671169691115979901437413522298032403609565133598996394311329293506372714835392975912718206936295166137569549996347175694398582596884916164647798625653170932974980454711118715400166890733722244368752314502042796902887081917869423252e-36), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999998565079173994362465396001931894411364393220606475206715927476216753773288096464547196783798237465369184337707326956679899579250402430116331781856535753325581983852597538161877588948904446302891805591165493406298635982122739131855419006169860034975915041849599506141381562127259826196852690691935014842448052582785680360758805244541197319297101970723393414590425744716094952004261652430364851834943964098519682976590628698821905236e-01)}},\n                                                              {{SC_(4.15747613699065532685928122715139996054660257193228334398574664448888782430913124699145555496215820312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-36), SC_(4.15747613699065532685928122715139996054660257193228334398574664448888781233240714882509337727250115653085990578082365934763746608796598027817817403401461047679675712170611380828783971391822261067802809536400457345024480713629655636200059306305344565998169640785290567657819069495209506513879092612549199675733793897404446425995581237641738804282966499303539895482161907154840024757495882276282239646780995340616670801737107926048021853177442090405674446382967308057029828089451182423912906080446301645e-36), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999991357696085176628871090559479687924742457625998376218971921267372616718383844949588137456909796500905937687155045180713696605882356605141845708585115529311992066558444828324343695453901931401333937064875027623092193879640543740281736662900057499119419568523976952025817917330364180443654367979292006373325784480983727857210671247058000389980104063249629948415515037996578331323999224928160405646611251354255937726429113087375434086e-01)}},\n                                                              {{SC_(7.28367983015663846905417378314883240316980135196070300998300722783440619423345196992158889770507812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-36), SC_(7.28367983015663846905417378314883240316980135196070300998300722783440612983116478321067269269552308077493978289889202693267062792028217262679594799658402831534524488850105100944772764063369876205824531656366687705105223061889202677601008770250436737657307404663067598694505137070363243354865573283915190217134660161868686059432339437177299032222560991940423832159892424897426322085372898507971392663686985246163580637451954849520995735087906076886949281806248923115176051266427223525387444974822188331e-36), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999973474004065884681092335767433370237858027851321456659743937462071520016274972595345712838831068927056324434283196754695183381625754321780334336941984724512744537129286325405215594299982932720024848636604144040397744749234633858822500707447887371424947606546560076781166070773896632315222333445267419206441770719310077458761071140435155108660069240335296609374518753267631061279679348531496176734798021898607900054696705595585834697e-01)}},\n                                                              {{SC_(2.12516349467652166437607482766014955572619379291278811395257773014799695943111146334558725357055664062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-35), SC_(2.12516349467652166437607482766014955572619379291278811395257773014799679946580917405606737529904973622759508384432023182892335044923493007532938776076021675357752206257108287956169574764984778204026048822274447050733368944371230550045017655124033941820725414467102677098724735986282971546316360184957916240826596403661388999867239776163371097109947879294702830424203436319213220983022808349976076039486046869137974826650175930349065434734116373586647276765562985583562832443119253244361340883240441062e-35), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999774184006044713683773900470805922150932250054980379582662128503096057808845185235527786487472856932618201965360896707252655627980442148963128043654276596608302237896826278499952875156492510369808863542269935941777674888168571205797103443085578125711094779798379963949265068579368931957701357361326476145671210315141516694776450386623526577296405590662971296035440956921410316901837494666387892421775940274748625097808888274273886927e-01)}},\n                                                              {{SC_(2.53071076762576381696050568408073626122257552718503248673567740389955815771827474236488342285156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-35), SC_(2.53071076762576381696050568408073626122257552718503248673567740389955788758611653831292769789020166483010759970222136556385108151865059794457635671929591006389256386912362204985190361367849653914692349249660353344507347124549418382882966230813006834337598876272906754108025215894180395623651246082863891038037258220096650540393960954745608563649602644462517562149795780631117951814592950632076254125100378944378612616648449108475867033852063670662261449078443752015576717559948578847287912367450188387e-35), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999679775150531150862612324087422368961581536597039422383152126708901047347940304146276116283666506430133777448923147529348926857835369585229245501288249005852911543348998007660604853568806160045133561007206980521854122283010742632980337999371272670810643167591287325720576566145125174718484145644918457200064131979165887596637731687390351612705444505957008226887752046771682765148512429504692651191887187474974604465117914715417737883e-01)}},\n                                                              {{SC_(8.64357296960196048049463886033217008510050159920791504997812301769322118616400985047221183776855468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-35), SC_(8.64357296960196048049463886033217008510050159920791504997812301769321042328005655004380652466252000805353736975177627305689102897263689458460558483905184538823511276614613879037974542294557763642845332403887710155638310471047995839486930032353911469131857519161973191263919662124863592037455099841121434453263204523757117696307125405556392707606083229317021124606853797280595140779847922679683860621633533580470006084570869328567023511427290495777006546862741888593675678753734706727091765908497226790e-35), SC_(9.99999999999999999999999999999999999999999999999999999999999999999996264432315958317318170910958737722004540033486380110083998546410044791571639359001045000390165257415777237093860585996520548881515148587137444154873492144978975716761135704715068314007809110467706034696558926322998865776056244797839299023107292117589896179835013332775610172777676182558538012867578344415855072459321045720088178567198565080237600962243652912204402124151596300356253263256122139223449122695528077428547738849446992392e-01)}},\n                                                              {{SC_(9.98056233630547948377202558654806807390245378474739594717134172352501764180487953126430511474609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-35), SC_(9.98056233630547948377202558654806807390245378474739594717134172352500107213774235211520366087753993326665312083888782751842897484262816852301203303461018681653919301907168238595958554638307471117620123755538957953333151205635414773328841023242129782657905930623401544810100924035706284091402411873695041620447824159545092622198222137489682714360461036541587882003436623206649000290867227071217854957074912804962012941175988955433888661010676438557159248028493582668925712339840773429543419954418016701e-35), SC_(9.99999999999999999999999999999999999999999999999999999999999999999995019418772556025452179753936296723190620561787496251708691401075923962934222261393282794216532984558739824698172829691185955595995089041577202174812312947856501006713170529287477350411350868128826538380042853030454395774427817996996972615435833753547763126950693322514112229274794236400050824445172812668516611850872983573938547300630346487402262543251741159012770284460576903327602326016046183371595735415925160127128817835623068688e-01)}},\n                                                              {{SC_(2.28583325383040341115984344956726956942648839173021717936437613438727112225024029612541198730468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-34), SC_(2.28583325383040341115984344956726956942648839173021717936437613438725121632406983133997779856371235469800960484094688446211707494308823723702511129954566803322521144774271849538557931309348505755177198991392479394688991152239758824965009950771960366476022856124052233499690226825352494698918049373160506861871032682154872340811445877852985420557422813230494867182881063793147826094622998366088820877495792124626334108720159346279352639830014634233819658689195810426400524416487075106577081762959804327e-34), SC_(9.99999999999999999999999999999999999999999999999999999999999999999973874831678415552645214136320719547515304986065715399671015948522117357521386822474945821385174233689548253591575756766508400490826265582618706311906049075954729995626366958081761228787732882417823878421236061267588485487036165146284349698162478575358442590632990892375447104360565217621089582310412890703562600854348719569212910573217175396813750336931826089876644954945470721952677819309500120155038935270482632452051218728106534190e-01)}},\n                                                              {{SC_(5.42623437031930140219487755133755705879730231824934987938484354241808205188135616481304168701171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-34), SC_(5.42623437031930140219487755133755705879730231824934987938484354241781576829753192001504542670578168514322574346362411838697558294055698060256643491044626864706023229351509292462926224529701979980092636352965151156855735493539697229126183525244673254444594932743813340713277981673283478626960530386752618274460408012086120450381392347958398326330449608398379219370083483268351133688476999510593296289238728648271061550800714334372631288774732378360955680765670890145329863879353773268761484500941680668e-34), SC_(9.99999999999999999999999999999999999999999999999999999999999999999852779902791827473069699853002689009383385697232980632967935862458237014302008822313290073227392761021824999598806655046675355022913174279103879824846548509249049870612992964381556241095616833742905956965264034731825567461408179336671461735669309570725949353784032168729737514901374614918492020733323657326776972378228052939461852740662884848942182183850537408756939752311876936201545716136909239650842326963967558877840074472028373156e-01)}},\n                                                              {{SC_(1.14767260359023175444419398476720241433534365304121115753874238230025639495579525828361511230468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-33), SC_(1.14767260359023175444419398476720241433534365304121115753874238230000445166746063656515559841089289105607686539825978861594544159895336596964422134771640137572553567078243138888530843580152233779636754650662243824370534098475025420547383932421683776941031164647482102775065775891998610842166179191292338275465136314733106299902048187444411004404558040659067390216180114189607920889347076280704914251579487942983549927641405688544915035199870167862655069055588251673922237588302101782819511491910735654e-33), SC_(9.99999999999999999999999999999999999999999999999999999999999999999341423797484209381329588309288146803267822324076796870775252179426174205035478581780473549580911343948996844459479379323793574583702208105912195692041827294007298447777379983852214659915146476246650306684196241377878426909383663765219628801085832023184448671086794319720603937760883119648546708413620967469776165374332966612650640592032647489688329087738368543536541785457409887376144297548884705846677582389852083943727803618460003560e-01)}},\n                                                              {{SC_(2.24638807152062302597056753414010558790018579564078381747074808494346598308766260743141174316406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-33), SC_(2.24638807152062302597056753414010558790018579564078381747074808494157667361269882569441673060651915437664267383350810846419364777111420950445674141352657892653029864814464928712480345882096155199766282054160037261290793618209567223822474205025102444332810773106250060132178243200876493509840693909890022305266515863453984042974449133489686322410570709426572392159303858270564017974265942192514778239674771168343975398653578155273192682439379656676210238904588026596239307200791791903087670175397447691e-33), SC_(9.99999999999999999999999999999999999999999999999999999999999999997476870316064928124336269726622406446098767475833498791397615072417963776006183762747986076321718823234433302205664070428488474365161284533503805124055838617058588428710575226216649561390342676237713905134207296393773422163114041458550176660590328481590273828588141315198970622646050350164026489967133824488059763316031263167042511671805434119993909381688766722661327619081391469360750198917897989810671842667975179843263514510070805364e-01)}},\n                                                              {{SC_(4.45455641359219790147891656069310138539319495403506917428904099409692207700572907924652099609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-33), SC_(4.45455641359219790147891656069310138539319495403506917428904099408219006244020355341019923416458691646791783382968221703942437110847236298490017165119347209547953248371396373134888130108963826910897009132512935868074403092848118118664348760003373801795767345559897877338293545883678173435890964691395009506069309003543166240667253840198108859444636305560559966548986023314855939971070573945498737110851520499021749551723015354411711372545551098465273329330533003046029281429836758805400309819773473594e-33), SC_(9.99999999999999999999999999999999999999999999999999999999999999990078463579062307755526600873014625216226284609280745739844840338725476993691131021921643887307732286631053281933853188844559271647726836118909431359129252865878843629812349803224098882677865802701318090937633055526915899392674220081478796481818247514342288829051175946144134849997283314619395790196378587070000606077549331566177326361432397781171544675801887712953061428639817708889966799537670086563002303589097210837017109439496973892e-01)}},\n                                                              {{SC_(9.16785088874388950633683172059419126693105638377124253293737332626278657699003815650939941406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-33), SC_(9.16785088874388950633683172059419126693105638377124253293737332613436104518246704921369229928400760527355642289946851996779146737350255733633661964290512225435043234556399487444290802165698462256421277014798059769310983640659437713092187875796959432270158150107717786562565837537819205647372788133354445767003351222939549690095319817221458619710368607102404725417014793188796707925380868001635367674953089171550791669153185795146352256358389658293075151223426432691016855045414346008882486947094640909e-33), SC_(9.99999999999999999999999999999999999999999999999999999999999999957975255040878937656479309884424948105529598925238666019539098203884358858925757483714325117607223046140184112647307315076184737530446206798662621567798660251616524997044561301533332545638798527755946852445727867891941468188937777228366606532547501859733408033893918556168750942201731744749872794943260463802390118755564820664666033161746287816363441616184896748936552044324961750117806166223424101518916285648897331999217064683807662234e-01)}},\n                                                              {{SC_(2.02923708991490176840630238442216715768751725200674633498021393052113126032054424285888671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-32), SC_(2.02923708991490176840630238442216715768751725200674633498021393038186461172686811541995622938699502131970339437751250339238625815957020497240862068215740583517496640248330164143489558982862806234162766064849533848215436080242913357931665996587857021941752158058508684563520436602915924175811991614599975795835696422654161032468437709940060988366827698300610082819892290092277729920515375436926078407908932472437573715334908580131664447785618965945457668393933348454041625387066589186615396751622114360e-32), SC_(9.99999999999999999999999999999999999999999999999999999999999999794109841645685043783972015726491288792978131514713708274780330025533629205662944646785839549634108447687840508965230119113963615379532190188313923611545568771941825154090178302130626216188195315323190824517446123383168919123080013332622969893566616492877927920852006877324669233583154264978656000830597138317838869261407433049633324695624794836488665265011978772645136673545407262195618625203203879355393108059137267873193617971618206698e-01)}},\n                                                              {{SC_(4.42248951544894130940528341232594713442514066697910501274604300192549999337643384933471679687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-32), SC_(4.42248951544894130940528341232594713442514066697910501274604300048388534828291368248000655277014127617817653398762581638618471290886802883726483863468949945059593381263242533391933794414525027070259790107407224559765775467901539274939302993231312884256750489422970198786159487386816526747486926456510926612894986997421618922394129244673415939823811066890368994392267277208762239811855012666341819077599352572997378141194070253849874766309784441344604549424903684138514279694274951881061702927451533603e-32), SC_(9.99999999999999999999999999999999999999999999999999999999999999022079324287209415370398907373981182933279508453789790467938655245533487930528343294733428329788530035987276746814790251459059570475803121922243235079973116073514685919176080150643624530110566284954847483072464101496311828806947357045503519156870663380634223091627304382316385761985476332723633210730619607992350388299054957290493063137783934349241860638349612314464275086378115025201466548731296891098091234203131949150016181066415051698e-01)}},\n                                                              {{SC_(8.42781959567806922798262160232246372270599330117093160585906019832691526971757411956787109375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-32), SC_(8.42781959567806922798262160232246372270599330117093160585906018835004232676551216143003605835844772147804482341293060488809656855003982170735014827047357433688375956609359388189092785186417532268577724207998474793422062770690091917194630921025260130856747865767201476228381150045632490922495973100197965054663802088799118777412336195112563548331738071270545429477078683972801812259741537598080482468263547598192155653292206810106055756883930340550445588346208476969664176558588870371296008188404710029e-32), SC_(9.99999999999999999999999999999999999999999999999999999999999996448592843135237286091165040150796849379871624458670791989980554559338381716042829887191705426916341372304104795261882687098993621618405551393901151195570801163017101515947641613510338321872649883018859071285949307351409094849353881167676920664229923088157852833707315319923101074787754717513588395159959367332602241142957127421028949816954472640924253155665536273295336649713952163746432483241108913079712957120243617036879037622622538037e-01)}},\n                                                              {{SC_(1.89412859041783001573039493180153157286866659770869884826804963040558504872024059295654296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-31), SC_(1.89412859041783001573039493180153157286866659770869884826804961907957016457841277954170997663148947571036531047064431642805896330034930759416956199694978572815071058666731651254768105525868477310032596108285663712491486474491896466539021451298126209786462442787863272306809927492774070601577999434654525757637079097488311727900888155525874031426502421362589400618004106762210198078372938517086882765433014405633112910490353995497880955390232007103552263077517753158222400047231218622431738026725272418e-31), SC_(9.99999999999999999999999999999999999999999999999999999999999982061384414808821713576182666609878039644939897865544835638329686226491649739125933554321013717333433543099378073396608435514337600944379023047880002410158175418957761934774609458632133813775338538191876152234049430980809741103774734281423982888311235989789454329730656135971743728618766288067162172679182963181306945338676336790805660620388426574235413302344008441196805499833894731982742214073379793623068582638800144759140434822835913240e-01)}},\n                                                              {{SC_(3.46050866712583180197896586726244593923755962967554050679908073107071686536073684692382812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-31), SC_(3.46050866712583180197896586726244593923755962967554050679908066200403792541583724962851495560867343528889054708442883895437380069508042546263121005899818228653002696895607035375445728524805997740154069184308371395573413789830700635471324814652145015259054050169279264095836039055979403561200832628862682451061731921571819799737972148041901006837971648529611564412861696678853896181077926408637564058833153119920148214522871342104651385797073097865150211968077592727269349107621909741517960544590382880e-31), SC_(9.99999999999999999999999999999999999999999999999999999999999940124398823734995141596440434464974244751219327466265222844766372889104327611054096738756247812175767192010639298145667851662065738236651240834717361592738914549129079886068280561353392857420537536300576737568342768883135775136819101106849626431205672726699464031722219512428433261205505914094665663811986532588686230507896059311487599466477815387106085624087151762903302249300390003946296093093177327727085105725378839624124939177394646318e-01)}},\n                                                              {{SC_(7.12945223095754899355092259734822137087975601614812590223202448669326258823275566101074218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-31), SC_(7.12945223095754899355092259734822137087975601614812590223202388272065795852880530528435299296317544556995760601773638283325379911939903571836900644291057434079192040898145963464340595581666825670240485504766212435730089156718952356796619997620039045659579302729635035567455305579146178793297109327080700792525691652378010535659270634655634013027160489309630069697235358853454120303144972828027427254757612960692804314735367184926239135471939473377997839560418095284241361294625201102079699096990572732e-31), SC_(9.99999999999999999999999999999999999999999999999999999999999745854554432472137421356692322531386578841747106553826521261980051976928390485982266924922342534221178591468128649396587806039752619666583832562943361036177992729075795731069740929600978682292406399805423201293360461699738011150346793081043613496064788228338205920715197760196407916778244101828803632524670630307241142534473468033170125491021690127096505836902793573414646811153356864292269712182133970687352333716996429072607598331767709150e-01)}},\n                                                              {{SC_(1.00660609334360197519983437147660781896478392508868099364249815153016243129968643188476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-30), SC_(1.00660609334360197519983437147660781896478392508868099364249798153858080936425448600591621973115560627855028065799333409897140200148885265679992467534852739850747222248848665862299107073399715300687099710849976158206422869350105977308451559506740322700159209742272248262592820712485642826574623775858899478336761127748047538148686933386140802062852176507997090596741478401266909560861459265729175839805366572371876499841116246530566431597941796152044187875578150097604630566317951712723436689304568110e-30), SC_(9.99999999999999999999999999999999999999999999999999999999999493372086421765833637980670400207365226394547668810490027357326776425074585947177784858615439332893124808170043124363608559227850238712400015608276209944227241371157871528353635158551830209899099887818354190139598879685295083420474600602830379027159206760470992231414350386011266309174227316415267053139521691420556930484870500945966743591236097202666761572417847833809770025888795274828592890925562550291716301144729756151134542208118283223e-01)}},\n                                                              {{SC_(2.69123732824149938499603597762300694489537414332350206969124428724171593785285949707031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-30), SC_(2.69123732824149938499603597762300694489537414332350206969124103857810767495828489737054207251410808681122731739619467712601906527210049295464295960467277692977312706695955670199037202229435671253476370879184247206949097764210253125222013745966690247740273959101002078101052320702153894889859044028323293872207281921255575141740576311042337948417604760956103213467396410826888372613668017898457988437785165324322263668128076427321715842253774774380207618971473886124995752335661990322188081682637137051e-30), SC_(9.99999999999999999999999999999999999999999999999999999999996378620821539778048380463868513259194760492255182104854568796688266675419704926830251200252632342648903096548444973065272476104135551570767481529019631860487682694750175649684483265805174607079594632937085836760739509644610706339030789270993126743782828796190161346910749433340546847615059025085175720807259788804205543021767204242455348546537131091713872864499858332506952229596524693375212327814887803800604671074080458111672965192708371657e-01)}},\n                                                              {{SC_(5.30020735520228274850637769744228460379981918842995369800519256386905908584594726562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-30), SC_(5.30020735520228274850637769744228460379981918842995369800516774812330799508872620617326099181025241896326476412624958350438975815287228970877366059626972050598486044218179842460188871993307555735477910166154701843990230147811148075605205091149734124143879074762687642121485251530463684000397680784373909121287180220939449768835664018563015958901955939555918594959423810252278527245000330437175671279082182637911185388106902742727326345838543927260707806207862430587227020039893101942369841931004649392e-30), SC_(9.99999999999999999999999999999999999999999999999999999999985953900995929811476056422508436791230644190302525234876496203862361441479979240671670817582863831522397601477746273094063148971169325819181895476334047231053156486905486717389993270360728698723956084136276022973880242228876164041350147859316688277903051550256604857765735403446100822161708518544520756766090021113367159495627025122118690418451701542634453971356787032615030419972024177419316747536463094706047989637284849247688069026501348549e-01)}},\n                                                              {{SC_(6.32867200109829532437439231857584752559277676327992301352765025512780994176864624023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-30), SC_(6.32867200109829532437439231857584752559277676327992301352760800903845619423737196357325304747879745252873925358692900533140087584092061056776880998418078436771366792172130615694441224553869516110696285113308449364458806503815478080022339617731335765279640230991043561567239417391539877766804593198543949855172745230422656638678997874589593384074934687600773210894288303473880880254886959958423405253748955161866378820004589056363559043842961556034121326086780978328676846776257244124423169029634234790e-30), SC_(9.99999999999999999999999999999999999999999999999999999999979973955351257249132297739506642628067608253815179906562758766893326508515403412089617957779132649053803366485188789846458854195389563078655816683639618659725133411639581407050701846126217909940232813138092643766517480225563453507972750436168378046481952469724013530977441367994976024552595817659400560646993221229292530320553163338423431159999401088147155330538375065693349415455291381281036874541221154864146711221686283124563061261693337961e-01)}},\n                                                              {{SC_(2.08902732172766892127202343465273188850850078629450834455383301246911287307739257812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-29), SC_(2.08902732172766892127202343465273188850850078629450834455368106932472518003442533444738013732972172524170504867713481295574699984488179497595556954982281159191426600611772457907280094472444446526906097767318461694106205023057515992153019190053074846913307319672878369674337703391926853006361756591941459322392837227726860734677796478409587068863467227336540796851320837042413120494689218187960655610792406908260360300781784460111226939154153768203634470611331753015040253727623101116831042856283118737e-29), SC_(9.99999999999999999999999999999999999999999999999999999999781798242453766122205539394256558981790035011916738210146764717850083017498869117986917334140105874547601883683652419246819349707324007233935785604229116661629866992858972496907635417802504686787088280017984569335880144104083641246079269870478846963689107325438580421100904625789353960763259740089364026058421956654839479843921798486264811522911491001083265611400386002109215984073917186677818137057726212767013088500337178286110333927786429660e-01)}},\n                                                              {{SC_(4.31842364003957104364921550167833797346950293859213498848248491412959992885589599609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-29), SC_(4.31842364003957104364921550167833797346950293859213498848114269172593077298696397899384798838469892604707488011054598848283893536902678591236546102866040861584529410483678727842807847433276833855057760891318416503206022097303343679891225538057159244788369859928195264108640659876740964493397865972409304816791167231373348176915544777281551742557768615955019905703834857959520663077576140020595051789049976167763123526754999503968171424626064916365589309758779241063972711828380772013755486183258900870e-29), SC_(9.99999999999999999999999999999999999999999999999999999999067560863257369066964497297635006156021568522300783335967250349740344844534901319880357791301580333260447029645502188247052834316118747766647184283669573773641111448016551204104749489651931198788083105585218464325948673207669756192754134996490766498322067651248143532506188091467780057358394263396564140986264242252659898448085877812703282546394684396353711386913629178399462666156391453909336437084126881865332207056585053550245704827076211059e-01)}},\n                                                              {{SC_(5.86968798787057500194131613525764999377749863741782210269093411625362932682037353515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-29), SC_(5.86968798787057500194131613525764999377749863741782210268756362039026093347106681700963005204298316540799263712160813295023896788923210038131231729359910124024765152092781848816743835790982793322692254018995150489459244698543524531669960364412839353464649104249374340424306627305738083722440141133394562858285415561309401781003468538863799032963287355962286330816653282615903419003646871305120817164223024587131178361020150902537655163124117909209753651581353015255478297486067561986868484183383569950e-29), SC_(9.99999999999999999999999999999999999999999999999999999998277338146252394028444360458490634338533730868520104582523076964233154042946023028494376942979900160655182099281740037312428247080456080860951235873560774799992734471072154703739778110386566354490103567627438668795477210527514123549952245254446118613994019388628262616959375892007364702781185996020488769149346311118578328013836346363736051454653074172300840059947623326863459329086865473983250909431232338050346477348291583646141405082621767203e-01)}},\n                                                              {{SC_(1.65997635243685806687162489251543212019385665351167702397106040734797716140747070312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-28), SC_(1.65997635243685806687162489251543212019385665351167702396343690649279406622208185685772371642042635555657583382378567496299367580435665007816699412063990899032379692904556199031912037097150817151154762330970404285436867965385550288164480644118405526519591867746797880459162436006007266307611893562468623609119099257581069356747154476895543024656480280895695912472010571599599251032231654652201571896290995321311302562791814134762167132281252046632937215018876055369435169910753443600501786404783549568e-28), SC_(9.99999999999999999999999999999999999999999999999999999986222392546752119877172455733144343422153617716843213233849865061714702604533008336989045404338076431604109019139656871515896458952331043568257115104563145716224299069433954165917783579195574952398453239275963477090613342763588712548617716508144008331395635254149169622982507056455120676580525624478841644805727152863309836112876912207670086636480279108601885879827013844946332071421481944537385339435290404473361071594632126459317753099739416686e-01)}},\n                                                              {{SC_(2.25979760396654073712664394284379480891595572134011860043756314553320407867431640625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-28), SC_(2.25979760396654073712664394284379480891595572134011860041832968719355876869835044365217455203766587679052924363945885330138781175699004356886326461315878508574607801535429369621662329867639012659170124626841944542706693024456895004571467368859613474653967637621966840269279943579469768147537831957760369296897132611902967456488220425778743950737821192336748172296951691608578178031434568917471992763881726196647605940577327234678663760031433853057319001482300725159609161191240732209972248840097545236e-28), SC_(9.99999999999999999999999999999999999999999999999999999974466573945535407540722564122644653730270335778455508418466529045718513922718886100912534895818253373538618832955035269339985226660671223323808402289012470979235802920473617365901795722590739424739236939849121464098738027239360011902586924503160858852829389284193017042389742359089925155636590521137424815290123425666004266451656277708781560088189215777182758042202386192993769288859261071925760207238131324480206028779549590623894468388349431566e-01)}},\n                                                              {{SC_(5.88086945564520119649519587919781243555710122106194859270544839091598987579345703125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-28), SC_(5.88086945564520119649519587919781243555710122106194859236646894415357551059141397023458417833062577359029564844162033204609590305835423056545498867121176126632793246793268385945281614118548944015360500160615375605964890179073630375449490595805026103275679829933163846946616206245364280259248011174962758311505159562522228739210437400034854052649377248021474372845818354013318994192752570529497471637831883781636591363767499659621054484652363632372161010655718223400880672351441357302327184778736180752e-28), SC_(9.99999999999999999999999999999999999999999999999999999827076872228296574784938072078042987632777779373212220013320421186320701890213115370714655904269996795936752835087158978849132030314481520851372148162220392252024392951130066198535869599322556283299011074244533964223971169725705069975036856966893929235747080621358676048032547928046779776545537078204166025672077226387013907373034921452470080143973339745452949777298353904218157467268717719840861266286404603250029803805345314117460010988128655782e-01)}},\n                                                              {{SC_(1.21036877729163561187004806421015787165206423897645393594757479149848222732543945312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-27), SC_(1.21036877729163561187004806421015787165206423897645393565204457912911701264816571244794535317959218134225014169958552523736788409114122297436868181226815279034412881321169642223875674097709647855827604375031824358241944144366445573929416470439005395503117973503734219418534728301453626181057303958103351724877851168203264142250990894413861772049242226503921506225025537467821476224063452800660679037557087017705664155277109587372310479616565458246051267877346509591647754710506255296568393163396173146e-27), SC_(9.99999999999999999999999999999999999999999999999999999267503711478775496588677576535325086227779597221002886707252402490327884747951115784517104936932808165900808724915631123641727203222861050150147651933871354484108448566090657978758580039215062735042774308027967501555759664924302333070164047939619478223553520745268511199171340924464150362396855520866386718959618607407989478385259566952042271426836234189920618059223328393025465752381963814589296901671905473668692059934918608470334521245869322388e-01)}},\n                                                              {{SC_(2.86591780197233630096266787463117576092606550441921342553541762754321098327636718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-27), SC_(2.86591780197233630096266787463117576092606550441921342161222222068580800966682544137566943916529202244565026849165917689115339968634607993403360769926559200369755774662937525267563059791287293737522918628091563802893224163219102022651770299219230186791956803248299632691991093629314199684333347897102830548237298315010311044730195485193084923892424338781964874235326160341226843298953815233839005737913847063012077767968705624320802625055333001429140528531401876618817093286023128173313511518783122757e-27), SC_(9.99999999999999999999999999999999999999999999999999995893257576169026285539877760558795157391162603540944407935916752527193049445428999402129117183211740466656201917911860186104101449147091696064423853526679157666560883407610819215488170224094967395802687764835506335828313831539244774700666124123869631956899323558688233804969117908091547146856294231360568401947557943242277643217697037895388293183516766769220683181080990896035663431905961308406527737489186974575173159921544827293300371415469682081e-01)}},\n                                                              {{SC_(6.33227430861452581999484454611910693827255339205528628099273191764950752258300781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-27), SC_(6.33227430861452581999484454611910693827255339205528623867446152256841631469412291633417546931889160651496054333610986284102110667946485950432616582676312411355058576717839739682518159345923185634501417664843880718577905491906539705931182725375625919372975202996361570514461776634408433338966339797977448297118474782218211957190056184522273280748144857873967637259418048395430304299989325085162205248868175909572286327797137877060354856008237080835087356877357082257080856918051114008265455655019487099e-27), SC_(9.99999999999999999999999999999999999999999999999999979951151040230214506255192196435889986395782955668070169865274515021265153938340100074828753410630959573723255540421525879853083440370617587321442949822080689241095717596747689845651905140383728830851240780714315821784210013927509314368353073945711513577750238180546786612592987994333639727450312140879771130424423234759366739932350666350848077167008448715281548827725389679678867019894421671713832098020861648755429255119400453235121566672119643836e-01)}},\n                                                              {{SC_(1.01701488645048351742362491418610868671324604095573818085540551692247390747070312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-26), SC_(1.01701488645048351742362491418610868671324604095573816332343711105452574091957492464881609874155310766863692744462832576724333201541154072346766765699382330455449328670000824693475330729476850648504622116357428393638924348684334202734614590150864624972747190059777114682884495479107547683836964389876682263545801218406797696755174002666675010845868456246670653754593640444430031302545894854186512936706715445970111851394306952403843392018334017630380881701135995898449745556206987272254860458827723014e-26), SC_(9.99999999999999999999999999999999999999999999999999948284036036905505878106539445707420537760789527302038597212359467142829365208706753583480314769727080472930841251769546963351409456940449361362239231140121358175313406601933249214221483709738384955034161941181642229311966635264585411192939606100913693988068970849472839854304825457917976633971331888622416264553414786998678093087237386348505398600997287141943187035373529035889477280544420651863692708964270806259470409468261873182906215372422322967e-01)}},\n                                                              {{SC_(1.73240757319454876321712945561046080415745773706248655798844993114471435546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-26), SC_(1.73240757319454876321712945561046080415745773706248647133238368517372669601990330799556402527637951741269169384293128872046197615617540226667834356423933205107188427326680610133548185919626864593914565621395409502576131328917183920809007874826137124733497023570796764712055352074351571474372289601075075459499674205118343075830673541226595909902574436976139978649084117906201588021595106776245227150460713535970276671005189606139692578545494385608927634920188540193618266875767223076936884045301799348e-26), SC_(9.99999999999999999999999999999999999999999999999999849938200016908708476593647714441301333449917232983935589882430679475416544954876348553925397810778869587095531333583024361182841302517003625488202943023609471017988004115329958801794805283413883069329219120736694877350703706015755371121018859116819175362600531729848030448359027909259268091751758805481267322816409703379926304051989443909674842437962170262660244896591208386339631691590295468623127273625017019234604902092688257738783189975410798798e-01)}},\n                                                              {{SC_(4.85130351485873938948550752347723088770022059623698851282824762165546417236328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-26), SC_(4.85130351485873938948550752347723088770022059623698660989265579405845396658976637442438125095176181951006434441217066488647145239434103050209020997217669861406942499104808384488564017630082119257664238877191868992490954837514807928987158262879297403583333129860768534505794967430677313206771592868244951747851027162098997296373643704928156139018724130712676417846050295071919943533977576706542066029275753906933389163939680811922115873915597763149085735550761292088164447226954970021899306732669714194e-26), SC_(9.99999999999999999999999999999999999999999999999998823242710335962048381002602975450120082698125730821275809015238732858397978522600912421317625034506185283381041247245315231181192704687177080652677909957736806277323440788586701520356870644612503456121454600655994784709816767064317307696249210126595367499329958169688760532631401384290402120831004217069063591636817019515117344034470106663201743497588043798600260081810421172904526658043913027664092737590681657820960431067605822773898751239148465316e-01)}},\n                                                              {{SC_(8.19564111209312229576920614539122222344177948194499094825005158782005310058593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-26), SC_(8.19564111209312229576920614539122222344177948194498177343017748383200491809918243048394658985146309801342070172798129317060732100471869081924638003843624841659291147365005979573125412883269496938888583134207844882906967296703010454542313998295672651631067077118755715916679489586784469054418026434594124039687091670610435199200304712425457430048065297796755899235763622284756849628419660523825486359434729527454908615511257896148281635239454700199639016349821193759549082236859911041071907943324237564e-26), SC_(9.99999999999999999999999999999999999999999999999996641573338088450481234573457024398606724972860597787690528561595250368010475731147865565852358362282402377731027222818029922533458270416761219423731258201786579933778187649172980926082987949990044126602969665006020738715662221823288423516963711294782279533044098884502137714956876894483635745762291452505629096708868676483888239131082349750859024725134237454070937690955419743758388472674956943081664624739705487388292808532654231504313310874444108604e-01)}},\n                                                              {{SC_(1.86960971309704747834098596399691609741197662053480144095374271273612976074218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-25), SC_(1.86960971309704747834098596399691609741197662053479054910462327167331615239418817962503081932931890340451634960464660216606441811761316234081177905303605337200742387367688910565800341036275956637563852160531953554325135475392833468257948608563494113749585234371551757071694130223915334283493584239200027621276364767514754042741892585251741381911793055254059951345608157552222810997419824596284086600442530807235414227929183812497937283829173203837683555094044436168127344942265592102254286969191292399e-25), SC_(9.99999999999999999999999999999999999999999999999982522797603465879073668264091885252923350791268663373238222024647977933941949502217305685050899028063005846531020583588854912080275336499194509169417049847433982967267356038709929706560291564375320329012735750986169796551989634393672397269192191279813362016633847875037003261985025832287816083936612617230687954205533933721331308570516151542799667874668414065625948662726592275792037922673887795272658210791962804009894010101881541472393674935408472853e-01)}},\n                                                              {{SC_(2.53078312700865749726688023205126403924331013328696826647501438856124877929687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-25), SC_(2.53078312700865749726688023205126403924331013328694125094200048076230080016126218639853303928255377939259690268714396613122787433650320374366030227782619269823933735767013246863110450196910284239084879826785393682811763209776116521693720560912939421095526746825545988905306566110534284089078542855109778438346269505715388785102546321876470210562584375169773147320543891026884940507054819007154856530305963667169008200395231091814305437937091075813019418756767568761605780308796701014080661492368159784e-25), SC_(9.99999999999999999999999999999999999999999999999967975683820241406874948934166653533511172092156534116443975462625617239327288391590664122021589352522847665373016292962519418353924774489444379168931261935483162281553621603433472072728977349555072109712109824679883539871447602535796929172730022419399714416003150322948950527704596047738139301910101594105207474101086184045874651597158224030689372875979961705537903665460088130392611988152756381550782800594641836041649779034851910713684757134469554580e-01)}},\n                                                              {{SC_(4.20941306621815835944433538670569070264115829616002883994951844215393066406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-25), SC_(4.20941306621815835944433538670569070264115829615990452785496578506081955278927818933546242324234408087507662277600473802576457412134611750078738527194410669419929668722322908268897559932584917418004310810500892339693081122324922113982951012729749899983238419472551739293314611185990890280330838588407393840465717473935700337993507898010621074737807869345998925750153486451144321089261659824774170196857387514016640452953177352954598344864951502174653356419210290498586955274100732171430477016287905719e-25), SC_(9.99999999999999999999999999999999999999999999999911404208189759211732740935886171809403395266911806078856652711466436054573598817523340373110699177394159623578955057382297355014218133635413780957701638933946157411062927243877093033139217823648280095519300316420682551404000074847744014121081615342707317521112431516941533674300297570189514239618931688209087596074231043314980205424667058883669569048269145955246279078436197081567963182117436875444286563920537464570946709214553473195719248157805826855e-01)}},\n                                                              {{SC_(1.44861407368038454520845469252141317524629204882558042299933731555938720703125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-24), SC_(1.44861407368038454520845469252141317524629204882507377439558379548241143060497886024742974552920942134169066357766969543557906176014900674357628857983142696780673746415247742955494485041233510432503498990662670897583220950378641223845696741332846886381559562313740385981778631874554601554942505433775616570972824832253816067914468693529837886615045250367325077108821183878776735677428964476732317113820955012707665146207822278999507004827271272406590842128507252382490865908958483246235481037761488907e-24), SC_(9.99999999999999999999999999999999999999999999998950758632767560708027866249151335156844582811589392427860365058124782731991642089310632824187653159631590934407076009545286555100782968710117672092259681922314774131655526310297215642116091062577441465725300669936944717371937199769171206287422313565977915692312983930643989022024956769092957221565563347010333758283732976918733369635806586213023769317382137590042397624049523931052552394023183946141838267360143101307042809763499173544335923553929609545e-01)}},\n                                                              {{SC_(3.01299821836738389893191302236946692641450518124202062608674168586730957031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-24), SC_(3.01299821836738389893191302236946692641450518123746188030755122968582984350853696020509762314198657323081151588680108336846788546232411715077963117750110231668656877141980560982390492028458072325781199487427547774731142002830348058895360123183367536673133622884929051386045183595019288409884649664003307670889826073917169193783491732886154383548786467650171746923041854625144214891691798636889671240986472559884025759608696658369677102207417841369481807012979833164166774827934061044684944062744673202e-24), SC_(9.99999999999999999999999999999999999999999999995460920868057485205128768495672594971913871863330321340890939584043333958542050402215331205051475347664198466408074500213177974669224638083289662049237142284601195838742716676332740373469330245058121848911657687577461695268645535074585543539333588005818218743916760513910839394682596564857909507975555965083387737997577009316309396894895609075395636625325378660457230047137085278175267168516376809105349281309907762284048847679978876273402954417505488514e-01)}},\n                                                              {{SC_(4.15276102030971139663869209978990740955717697602267435286194086074829101562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-24), SC_(4.15276102030971139663869209978990740955717697601073833203741542064934510510526957950581204331883394005715948630901471997927439830104941785824048551884364735290037184153144384976775028148587726371183017979938291113875193364207150284386535169050781429892659177118027944006608871228821244248916843584207889779509611438747449459759079063415836045186956388107365399108205187418470142097577403806506074170019542654504392938836798968994724336717205552118408671854359307226530571092950101315722654561248196480e-24), SC_(9.99999999999999999999999999999999999999999999991377287954098122384541119849606577690137712663052237626484886226624201275179099557875928787292869332016691331690451970323191229894147818897508450900230579748333236740459401315242524613097017574548920324066573787146553420482969984795794990966084403222750515621558455241429579692068429292194601611839618597431386451583256294712361622373650212144590915969048413769735033165732778792781611903036592449421019558254266016509793355137641614746928246864257491767e-01)}},\n                                                              {{SC_(1.20493139018354050396364738592701673636220505159144522622227668762207031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-23), SC_(1.20493139018354050396364738592701673636220505156228870501377072546140795785448934637384040780928123818418711832097125695859823774786298584802644665761440524674007808622689693328364348533020413848466175206888319008516841831958103380116912523837504422147239730460369364452006526848629731486262997785608581521207131727962356854878661708837843815080362453410963071299076782169063239102687079062367604358347170690882963033237329507516340046341643171849692271577906500225569305343548250042626451511137175974e-23), SC_(9.99999999999999999999999999999999999999999999927407017247518023542093828750747845440983680844635722123270981180494686023648655779582416049950013567041075891205074926299102616026352240680612367089833234497949938042589987204061624971059683439238296677903567701771646424710727595867914797338473188745190462628716359293458300735139756066056975915457284798104540693807472391874216930264612444057558096322941234802484276390976287104651130487501202428300210798836385845155461653897798462137129023634158590048e-01)}},\n                                                              {{SC_(1.99311766155840730007938784094077312725179496055716299451887607574462890625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-23), SC_(1.99311766155840730007938784094077312725179496042520139764883300439646816368720456092676944471103322025451567911795284173614337721246228874587063409912507756393062952430611259118958267626461375511088224904898160946614122052834853089132640900055314485320719145583388248429835054532103183976418847870032408144871456509905573547188366856627559148136421454622564586651099490169128108968885059694779125622376422565777874605339289879857280154803293613940677047193724163580178692359761986787333499982011811429e-23), SC_(9.99999999999999999999999999999999999999999999801374099359197308752453603576131047516452927368262379188764120720199355009182464606310796438364009611630012891309259500469404587018398076111559503245120051103061305045948094247341241375812558792771202649745420669737550570148968618631069359581952924771812453743995708795765361659351053384477330821156187950952631834801216235080165212423381265856687853670463014423100331979948561859656233260381056967971933208534465447750912285880093439696195128696304586474e-01)}},\n                                                              {{SC_(5.13533303169498441896371390810640406021647663692419882863759994506835937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-23), SC_(5.13533303169498441896371390810640406021647663466707913784420626786848577539948342073166036025847669329695284322217298918716071238698651343415598538250431670607803501970517843218886621847266716883178140747653725502209568774513395235783269558998316168037717740076267726591747242174767979952117276381002699472649174616077021164949081299164057659469591297012095580504483012733964983651613576630595686881098039543282200671710571050264000758620846664833057717433853732634155777995430743343236699023074748072e-23), SC_(9.99999999999999999999999999999999999999999998681417732679120007652379550596591905492960756265988856401363474370065856842250691051795682600125230378048035765792891449165989441598706811070177528273711549839200259564336326789936789663320974251530646924695649992972236365657484978287531578871981209060244121480491480455181587957340654196842168225043432465945367410684908910349873995251736646698623346087505106038789446124069111779751785632824564972863033165113004579223400794734193596445597759923144733830e-01)}},\n                                                              {{SC_(8.99483690375495720736892890190099236757959033639053814113140106201171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-23), SC_(8.99483690375495720736892890190099236757959032426143668731447440639681167212721719527797171146780064711290139936822813266107297096694010903437273253094169778604003578411890116254167896394141888066597915323804162041623834369780877656788545758984751109328238605945538232424708584063182474390962559554571796521681751272081700883661854119875893085070506261886828332864936080100484756483393062273557319802835697341546617168723437273949322628005639380524256721160529017905511793830342834237004895799326242479e-23), SC_(9.99999999999999999999999999999999999999999995954645453742396734618715458511854104184495562420188515421533916537429226097460026264036467110741766607883632933956617708518701079643688565847361956144214137931960590472723950498992697567682863075293755919249786604882766977536693359519182877477328890563527188345220444160685396409938384931861947484586479429357220482338242240751400752299436874559164364125531924378724032958139179940023509176370945771016673914300929823722007356528898870479147557517389880506e-01)}},\n                                                              {{SC_(1.49571864649346833307485258625357804618261070572771131992340087890625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-22), SC_(1.49571864649346833307485258625357804618261070015073920275828586139803697397329298876247049292767823930721928664646280396175986573307948574603167029053759708351340408089861830842252368692479328806151926456552410054517442049843084891325733155703329349183805644836512051216479326535756519496287734545419385841272613869470168116766771158038584407332321007611244158281808509334596772913678187565743057031292080255305715499421711913564786019743391589274653289046523695017001553101130979725615147741949041976e-22), SC_(9.99999999999999999999999999999999999999999988814128652658735548876489751653632066463267199996838874546485861024170068076642439321865577096911069193054009247807397756338385789586245178053759530459206338181619982472545153142325507508933237793989645350340818618149342431112261373507784681306094710396664115931177436350260577400393592421996537588766274656159350651739114480607092171421786422551162853697491835876809865771806493320077450117619067382134770625366483400794642466254424303591567538322745697378e-01)}},\n                                                              {{SC_(4.00414284431856607422728851794317683765456195033038966357707977294921875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-22), SC_(4.00414284431856607422728851794317683765456184333195206973700974720833412827561349111534903317556817980656128133092602553419958729122900514959804969013869789265787235423095621762770597973981276641935386442897542439663060611413606555088682296544134840138357497567048333704772308885787535702653546815581320437704238908588978564235210861558437389754925738927476835434441948940351078398962913317672503714060148888943703109003041746013446735945490894076945108816272231149038872655535603285151831784811543159e-22), SC_(9.99999999999999999999999999999999999999999919834200411462117654908876795301697180266696942853917756660287008811612236377008009142526634798790119600335365087275113255748079314394274449251893378218614737201859271607325227251618933738225971941576528112220435253954268170625581637995387933236258130147349469103017765108522242360528131339039562505036202933980339528694872687238244385449943371413059087702123057738972040998513745694679298693657755065316883784332064415470726309308364222995539698254590438048e-01)}},\n                                                              {{SC_(6.02733756338251593561397041623819981204235318728024140000343322753906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-22), SC_(6.02733756338251593561397041623819981204235282233702566913401486791426775103687110889263957618410039087048941273101200938463614468150120827800477838018770842674180469716485597405584815675135794066416744168771828736855620073291330239928662617195730049089107104830809640584583111672877743068233572354141431173358317923356008888890653111138300825081984365317849191686467019463412431488925669936662236278811783071074301446313585328727814832562767268810726343613563857416015442117253317601957010597175231649e-22), SC_(9.99999999999999999999999999999999999999999818356009485190578482546674221374375368594114174739562163693168458498108577433869958984955063014426674897062191529113188079524114052399013805667164356230849740333628262774905524309526854466619324671312571709022034295074629727972637948818437287458343367815594474164798876904156995774092308942455185318540096020442411397041128497181895394926057420958628716609903020544774920207736406633265904254545071924231990748168185969288263033548644250093223918969099078529e-01)}},\n                                                              {{SC_(1.65958441830993022957262063472871904679095678147859871387481689453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-21), SC_(1.65958441830993022957262063472871904679095601966837716399153948392276724593103434089562172080458838515273187060992126227997153192115202457915692129454356735235073605400638134357917784912674110778169847461470040894546633501732110449696587200201476723266357619796046417510134449764621599988613996516194544816998146347299996219407734259110701663299055122630130899519332113285313562567033295883655605951290101055589376890732579582152046564923167765874119374947074868067671814401094675259499614273388721205e-21), SC_(9.99999999999999999999999999999999999999998622889779251445258286087621577479547730371095511636431074447800273010019756467107497424395835806730657399701787227830411590271458867465739237101448115269271934522847684554002785566502858274779864682062462477972492848515295469837308173201281626304797879259332255094869310728677490420013760396455577678362901935667125091682248666889454008184912936448873641174478629627505364119977753174642851612726858065476553313586172210586359118094844336594068254853430507605e-01)}},\n                                                              {{SC_(2.67824441797191267011934057325206470778766743023879826068878173828125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-21), SC_(2.67824441797191267011934057325206470778766422840064870362843454282670987808803755436755298645156076250838104729082319930570856455235081015866539151471601249584165034579417886690930391378085994351144416093816921745155989539888869178642665734024688215770730792957971897714485926300053104010312217702497787762000600178131123822923068207178324331870556717556692047768757211314761404695899857873185399678411750902389980370316784652673933225122309449058964813115616837222131094170241529694767641836586628848e-21), SC_(9.99999999999999999999999999999999999999996413503418801145372469006266796825097449079547965742050312045236434812687615811480409477306286249752257313861368005502632923824453712494844206966792030996008614656490931107917279164562515860009828987762299164627454998237092918265924072060166259081213225845889343552482167314807271969366924784558616790588874124263514421653083849971429085957566186712099445800428991117097329072977627279324265465922751250506427025739354053214371066179711645306025175538222679648e-01)}},\n                                                              {{SC_(5.24216989034958268735996849210789783057862223358824849128723144531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-21), SC_(5.24216989034958268735996849210789783057859822414858675259055095569448734151215398339726766096146349230311025214806431942041459877604214955154666281316195630230528893276830669442194807933628997209391753590753098673586783891123345377730826919565725420391992871094492091262542401201132150073945320046259477580799694273254959986871822615719799353804620716184323201856322354973907153381511764701918797819267745133531796918951528706196881213538080733436799921765950225419130205065909600439051039676665358438e-21), SC_(9.99999999999999999999999999999999999999986259827420356122112195185551672366624073250839599194457507453628742642408825539587574321988663070531346665091210332453377213607635910430558804237795524086420616498779687994004617113416213076016284649087888750760030455121073468191914791665942367281561547327106767288655797810569336941648083751909818487275941957413272284668887599357964225376383967099007378119631322072540336535338653135115635982689717806180965476057119726371592548750686453644217463638771365051e-01)}},\n                                                              {{SC_(7.84730091257718428828730593965756767715902242343872785568237304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-21), SC_(7.84730091257718428828730593965756767715894188380156124455910983891034423640868297767263887550182849297147132094175148945302076002226638259291036091716141789071639833073009348733004619542248113421569210924255758451199583877546268516634378160445786592474784984436341844165522203578314841448712063415108370957352428729953649018180131244898775199678867336912535166488038811707208498065945628369299057350240961931251506328297565689454548369226193613688346870644768191552015883873931768088354532679931063997e-21), SC_(9.99999999999999999999999999999999999999969209934193732645335964382330379290253067743257178776587771145954358465579435678655286836941465589087619806854778963332640469273241540043384000734386835119884823229777143085980583844451626007518535647962371164606341778086677564382803208102585069159214424081238283097552554678548608898040886644227817986624770310493880047109975878179083799382082128737216670025250465946842362679942603966581060757152365990866172573014876004863001409841826665676884523747998078108e-01)}},\n                                                              {{SC_(1.54312352729357272495300072712165473376444424502551555633544921875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-20), SC_(1.54312352729357272495300072712165473376438300281922995823465878950244844409842644794531288751261732596721610642491316018434358307548274540483643794160847070741795459748461895642004476272062795755403849847880564677825579599934784750161452649688717239208196143024661915646344740414093963827975105765370910223327211058618438109286320788031834316649009892069350043756814202077019809570433098648537089622715106088352747705828628681809819934794959540948429448184341283146097311426691570520373285761288995802e-20), SC_(9.99999999999999999999999999999999999999880938488975652115669643213631230248126799838296779591231609801204436699360836757494663576140036341768217196428279881453755452963024766965773560507122795822076000780692881366245754195533398857596255693285795829751852318699096142023830350334754364808624892439333710684341795169466561692893207551567117843822386554921700320723066779416814835120422295083102698726676136546837592879162164887645156563225574180182790368161855975114174502212139974273411738602866251571e-01)}},\n                                                              {{SC_(4.77518184435850312824695974855959690330564626492559909820556640625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-20), SC_(4.77518184435850312824695974855959690330383150786986950012496836930074878631240804035124319738780013645083375077544616898561908312065941430347802463107453041858495671583762741096029923257079257302968047790550769792307128713580082994690133797370824117510373959841609896448673241459037898046030086145115469025705353364577688588250562688270970666695785406307428035312168024680392843053488776735857595501213628466833516667726158422967395113793626911252805964855127321974455583739901636298003420464827010385e-20), SC_(9.99999999999999999999999999999999999998859881917665446220291365201399797968099921727881847815426248931197078614981311072035724421911759715979094472457981523507074663281668078107427532373671551387866380649320442592003200200431377322948753077746077574202454027025945646595207601239042527395341917368022264491271985293624469146381728776687435996883164233298131425702484520495446810290560085866721990974101137184112839486463835447743589853836128729569230456404847333286069284701906153131312047203315148300e-01)}},\n                                                              {{SC_(6.23033471350706135997738616127961108759336639195680618286132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-20), SC_(6.23033471350706135997738616127961108758933566957847999289308558170784132778968965056317879231412769917679771449539438348439187932432493322547267013194531309417671787810003677479319468323294595854503684255557491537731045988638721316770431599974491396281662487780560416719890123465165060033082902143555001286051776247690298863659447671949751100979523780429285085076607036433377399469725034990238965854157158763546494845113581705197635768323514084271939558504928218466777087816118281922669032194856920486e-20), SC_(9.99999999999999999999999999999999999998059146467883444182268334649298276434564976929585548792314224542993928933951083639699574277795394564312994424625369164959037371172773384747232025021592402636011483717441355967233675768383537538357257986806020531720706435789906784405523339574569102482506955066894177094965148419682062923055222829644783438538549051815255067258408435937976971922027519308509543595916785909437447704234765230356260327291111447155186396159452978437353554256394464351228571434927304711e-01)}},\n                                                              {{SC_(1.33373774787437629268591066100668740546097978949546813964843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-19), SC_(1.33373774787437629268591066100668740545702557632514609637109354894670795671905012891418174238222956443457378985272098537652333132013350163148619347266169535428935790271959785854155452128955268040415297439974798617332131470285817296376813372025095563270334709839436920485315163295216999970532915024196623990234556546750213339892672121031667423931247372788485766146488884304258726675821256736326005518351249552597350782054581090216636090655004539684401347254213062238979175599528628149953908411989598459e-19), SC_(9.99999999999999999999999999999999999991105718099474933284806139857400813352589827517564927043682648978728764758259157548540521229982370103779386138188937766605887502378218907747175575340569525702100714564339935788891685749871866514578306868104810273210249836494289529105147374405359061719026715925340956119852852492996601324880989891212817101225911122299495377327270035416555776310547611050503379101499527525151298272309849046993736994837320252913021267626530928647167494021867650980452641151659034895e-01)}},\n                                                              {{SC_(2.72678641362033605222928850375652132242976222187280654907226562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-19), SC_(2.72678641362033605222928850375652132239597113865233767282496812811434547903471145444426860140849165730840154443142045026389042524606225536996273431225195010565142182031866043832827369044609848704703782132802561090043295900410238999861579888039814092986414773412351284654281044246052360633441869568298727826155909328956857265054324941267888898815042029695822947856553640688900715106569954380462969592595043533559140576168918044774278564716729030098230376601726176338392887493576556803716314240985244825e-19), SC_(9.99999999999999999999999999999999999962823179272477727965947093384519089206611732778459619581048522840843983255738245207282856356470053984205037855894718532833271990791091133588186765379675456288234980220490650098675151780551707568969447539905274856216620993281787677779454733403694016219238223636757761450274748937793228503165450442613649588268034562597918498086592965280705305942919433851691464387890013808565426437488525566307607542416920601654752739157313437038398177564522256160039491363191017743e-01)}},\n                                                              {{SC_(7.84847163163788824526839738027206294646020978689193725585937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-19), SC_(7.84847163163788824526839738027206294565445289627706367397044516728216502661445392300478006248633939386640842420482995279705186836498615499704063686315382015944481417124956438069937893001716889658824383315836128859850145896671561869807159580264109008218390919771400485087005083932708363507903306384325767738641480522946290564444209005855639377332161802587036895543893713301102591999134123077217638518756971205307741607894644129433547698592923260994621866931698355071283092718360372159939763148236356081e-19), SC_(9.99999999999999999999999999999999999692007465236876521225591624733741973580413992094514864951948409477638354994860924045902686945655537440822272877755997184065488715073530826515341419594655069460256313924726013950095489865778611313502990595501567365333328403336978055022497339264912331540809314218388716961805500397317409139244048139568851551974274994613766476680949014369225330326153094075670488566570809659965208296833269543942839437306713455429886097267390826909886913799325068151515675401821307784e-01)}},\n                                                              {{SC_(1.59656777006820041215490180164238154247868806123733520507812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-18), SC_(1.59656777006820041215490180164238154180040523146025537688153328547760359499813760904753192863253468773626712297698660124388326296138121710134471432406051440808915749048856231483953159574219728203962113030610855651177879388716588720129915042261664035793682631272244330593879603534062436307902756624026615456937074668685614020808807209201572426546153680945500170264414397099342062973442361578952380032313799737733204426677060914568817376985131352291265491571136049590994403151805024530900585006882465838e-18), SC_(9.99999999999999999999999999999999998725485677789726970050441887873791324802821873863599682065675369351546184000866507009103149360549935240237154588525165432757567980472696826283523224052289490749011903664848152710996398754070605570284221534583084155424171763973302026291361113216315086799683804698865388858367703071408534692832158042217078221374921429321228108536764324255608445406900297031772562838405852406675264021549234730524961286458631341099514706834735141229319185038708420515965497634457920545e-01)}},\n                                                              {{SC_(3.44953506024823770663434441274830533075146377086639404296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-18), SC_(3.44953506024823770663434441274830532391029287068934228996677746001591898296589668811859099135418230183368869090360366169316970324064915891904038980287950101288861517367153994714618453877419868135863495400888589151982726942060284747289611794798919706164618774056608179851652058360068165608781457601308274531931492985898183893679408914979686066252487633256264623427099975969033776016116820081774952167052659583745697715204840936711313869898247097390719918108455249924815936377403504970454933340960681185e-18), SC_(9.99999999999999999999999999999999994050353934059093527720023368612070391851891406718440574162266209027406523980686123351044050966467299673133404524778194021524254214740402040008906435126427498618501963733597360987556318089420367195395956628391426699039046618616479253844852188916292966502183910384510396500722228980724697185501358054419824202059485672658948142353306536149886006393532789623679836881982922548558194712986003534069955762666111663959634870672560092573427252698709721428977646938742506195e-01)}},\n                                                              {{SC_(4.35166485374347011307050170358934337855316698551177978515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-18), SC_(4.35166485374347011307050170358934336481859685873216140703808138876914884948876331316739925647147193023892864511114548238457128487754654556216343738493227753816508527036822424078877053377450262892442522287960679598399216373675467067420960306212074773556400362052082955699418548571551788254097519705082720856063393741663277035047125589079587783198416413169663797774698575716466933356398467157205064339327846149216696847465253262085226226554946659832296405255702874805050585475448565274780032487961906445e-18), SC_(9.99999999999999999999999999999999990531506500346911434918787920899098195107223890450668484205227829549023183287220398482022387187471783874651026967044131244719811336026254678190222733416033489289005400050123232478835262944811994584478096472240564710057918847691506763403668556132046747246126505680179175030370996427156273193469951062786344533187975157358909776771548110773203090274293899180349800394539287346096992143426016937645719411397808886142140406571702228451300533351648334028048315509115370507e-01)}},\n                                                              {{SC_(9.24571534386041068466488557220372968004085123538970947265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-18), SC_(9.24571534386041068466488557220372954831521512026783180405754354097886633909666420259426993221137091279535065321898200088264236523724424960040430570024492732801486261174800152674655450605909216450153664375989066460839592611461245370445914423958469134702623836585450775145273632179167068159633632516565206133697650089607101943944658893386809234746268745218644974101782367190994926519199092662771524309633358926212213660561746092502239714663634109325449891669735443584060620900381198034818129697477437067e-18), SC_(9.99999999999999999999999999999999957258373890152083906642579378593893901713675765098318926413104745110870584186071073407804185704163908348012520912780573078297733751798245590050762285702888909088013591367509411470242468260490885859347433147346225932292893244796521699179017915375269683211891843022671906243123097650437828622789131762134264796168556176234658033104766744814914904339713894114835117307900457700205766539066206181496361808280227525595233858167413695522317781531300493715242483817542972307e-01)}},\n                                                              {{SC_(2.51782594979259907296692544420579906727652996778488159179687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-17), SC_(2.51782594979259907296692544420579880124943902261708085063966052958947147187189514241614449776830904431946870970159260360455691937092075466222889953840855771868704636118588224163624330062909301674972199987289150997146172863151668928438934140556411036253155163667282032912833405760303498275742772716593021336311752096063104868665845591806232654630920833411198402563942100933397822310625608203804916226388547452865994565194163622537436968388997541774348017060507709506033121197774674300740105857149675366e-17), SC_(9.99999999999999999999999999999999683027624327549818611642405259627277734545779576176956905635223388012474302610177483603851865686459231081769991335822870837867041940841659622753593655014713940872093638971093240790482102143812831175709620648245763558424105881217295782262911565235585052686966682126499325038194102297320702415146289036055973821432912093687266500152913802057369103672457993874673452831732722685075424587280286221673083152862430730343082806366094609467948165260813432090271885255078181302e-01)}},\n                                                              {{SC_(3.60775684432840075543946767311354051344096660614013671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-17), SC_(3.60775684432840075543946767311353973080369334858269134898134738756735710959677046218904765558906885492364334061087292000344970193513481403662883440148912074435103556813083982898635787234571361755716055018572586190298430906370378661560335191704015720371244055660846998368129007455709209071804971663274582300937117518716033394923135198118931181280814242888345084797455361388619932190727294536114690351832821038660288193236381399279391092707971406328888496938832156195246642052265826811660109189638402499e-17), SC_(9.99999999999999999999999999999999349204527610078975893456674652126360120817771889688340590968406061460125038582488754724017627375833001324771430239571028894899497567383218424464834879205022318861495316028975968435726716609929616209942133436466398134427112551311140669580095176152342696145945467540112296016461483911736978651291905258534879989907261687437286731511535258583610086316346495465395414349916862854388934045881989849797218994179829942041721541151900222125391260679662481266724801598694735986e-01)}},\n                                                              {{SC_(6.90295059018608417669704557795284927124157547950744628906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-17), SC_(6.90295059018608417669704557795284378906469154946034628615057275758767580827917168872394030586141560531872074234809560204671436693044343425840391457010301504740137412171139792833213101802925834324490824649737298051601026361059699458213672597472671940024151452085874111882881940096147836064982443543053856840493763963733305482754535226167817708959873515901950734304015397820960143176206034587501435625778875628979453297551205219863495406983015780361797852016321617748926259009982380223123180180635317112e-17), SC_(9.99999999999999999999999999999997617463657472479607266215131600498895145019962619817073610305785121833967037170438681582573928284612137780747419863832305571281883014950124752373550795955181129976650681557447404026625564572824730218895963758905602539829994766072456089977592244417787627088492524928818145775370505461217658955536144756735086815718595245350443425602386634810449310841322556872457206827318110637949603603506259040330724057028251216694224515414944270384104053076948461167522911334233852695e-01)}},\n                                                              {{SC_(1.12525415366977613387811096856694348389282822608947753906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-16), SC_(1.12525415366977613387811096856694110923727366543178991248424063936367102797106855871236693745998067792183896492313740966698000926384509124609429426947250949336737827454663845525972326893699060730973692704401099534341951883068691454285910587103533107303005237227528372401263431557132330403274340519948918314428351859975268429373327658293293126940989855765542949901183195688709343608094809310090493938946747815402871007789220671491796635682024533321624753650618068739379453108842797651045201761667915069e-16), SC_(9.99999999999999999999999999999993669015448244579190490716020688404404988716129435608800138080386131101191985387656303059757501675622372081366205214275299789803844591657957023425966901002289779390222862063087950428709151159887731980350511804536405521204092863537711731089301980213111230626506493072162164721222427263528034471459447079943925573395807997966484588698625396806888099131723626070423844207983223693719453345905264650308583103241187401206619743563779615806788459652582739288156225108227298238e-01)}},\n                                                              {{SC_(4.28382572030007718194566379565912939142435789108276367187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-16), SC_(4.28382572030007718194566379565899836945234420371503713724232371619461518506013953070308907657022223120432356779587799651917208455464125023945619250322620734440739272636606036542794988782854081250549762246318356169949227702350611711099210997039015438674073645627935319092938030223129482110154686819363861357190498576723741502657507450107991097688652505486877417543163721810816380539353617200530000879082221365523977016071919655819686183525162967504230324883441039688604036630737533267004970821556250520e-16), SC_(9.99999999999999999999999999999908244185990477624499510226321205119721095058075021258431213944274724107301289007609545750918897774273978402826099822688602645967625721552721825145710869947821878494892043502042886386779524528742129041553615891060311231387090458943405060106557011131937219960743403970810197762094709961812604268256488146909044474591554749049806787202591299579515547894789910550353470898790744771998924472207450437412320226664359385981163518398216312240317301698499316137407872077789696500e-01)}},\n                                                              {{SC_(5.40562027377591153287639258451235946267843246459960937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-16), SC_(5.40562027377591153287639258451209620238935816537673386849100638573507598699570776586306494386496157492458850686285616875867925541474335159799779780220955316889931213510702441069443159194380992809790714268610391273861815905903687389829176851624715712613059046143861758161875814504643502656660200767189812949905736607262048197843805032721613684327373616908312542190461280141634492118337843627241511563352346923911175072722072966072193177907657314017778251100684093567096339022512256463459212982758053313e-16), SC_(9.99999999999999999999999999999853896347278714196230278468886281830155045973395275720923575499461975468393288308375635985943289405969943879734175052611227437313547948709681018548507712575189908929527549469183969349762222426533435169077447468058380028005061025510296067919339408665667471629938407525632912450465661014944423084708195510683442318106580092132004438775938913243626094924308943984839739704805512183838281324880895887413435530914721449115971797745548216512359146565268873966691648325262937751e-01)}},\n                                                              {{SC_(1.19902638233177101512172413322332431562244892120361328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-15), SC_(1.19902638233177101512172413322303701605856504819416313943283595900895124055620076170199817791086158982821414571245272957941067225878881094777635192202973211099821708998113732307880722055342305354709198635269006039158481945297350819140843635049214167947460796264522687764348740281409248135258544749282489911854318186620606384911450658827884693894389423867972448049092242216854615433791135706385760735336705625212816403060778777341209622092144231524514644426177053425586224941858192290734691115813095637e-15), SC_(9.99999999999999999999999999999281167867236192838031095819701787916028865373804359002593710111142773221681390652606310884830906788286803616120473194438083063522759231894313363861617725958310805741867501842807266210988030666684760768277264807533625085500984705089723638296262863615123643927659844348026277776487148412530668062202507750370540981950803485371381729535175337385633187123449179301997596140088990341420027197666179279421047422739289730401845124093351489448033951720102033987005033127759823277e-01)}},\n                                                              {{SC_(3.38815974110446074818447925736109027639031410217285156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-15), SC_(3.38815974110446074818447925735460780837077250405121624908912811375492279012837756694433825794177369571316423181623747722330627012456802421253043560253125336775562990091975356520362422074333107111588703197523535255218079359281180279158607447962967751462269796380368108394244242041512896847324483778833671068785773032575465047510854277006905770126219090406640414242106898982323451003943735814733493683579617533872767857670925391333276393152162297673266479295833057475252401519711564655129713657767572827e-15), SC_(9.99999999999999999999999999994260186784379476757981152515209436341728036663980357387443440104175124376831511468547287382319416060748994665608544177190490182579191009837162920485796578048138194041887008869736016572866833834735218013371717851707589665383762610511843580510574079870970128972241540922984155443035750300251011010520308198519163161300610750853200215747579653236184803757849345278234749183060179873847789020021279061575836422283909676225842553638445293397586781889264388759259817414925829082e-01)}},\n                                                              {{SC_(4.25116010644745190294457870550104416906833648681640625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-15), SC_(4.25116010644745190294457870548823941816346457251046944865032376488142333896402551791579276032444896639851938619033815895833657540967584273977907877502009276953580855032699870807772322822936877320097590315344887937786915492201615767133292963150490357076868487302662214735366771516923521663480453249471739343125382720393628673678394339909114917543444697211149317158220603255176901419974392387577177162511580101616906659855126508349098308950139220756875144978090282917331368796288438131844298023787069363e-15), SC_(9.99999999999999999999999999990963818874674844702748116475486084707856461295907339275469937291571802782088108504905557783890708671134426482936133958851489468696392146303515035649204741944920865406162487979478067491792560183921011153079063283495854040944848891001128521367934055151737110438100017484244794529588617295000506752734482974861081634028579480845943553032127333374137833767657979137594352600945447012794293469082855519756029637064798338827033317993968438364908937482910493816043402620465161846e-01)}},\n                                                              {{SC_(1.31341538664973833672178216147585771977901458740234375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-14), SC_(1.31341538664973833672178216143809571448147914551861945315022842811990408652297041461885743682766018864667058821901627898580410140220884869293241356915777926528623138687971777326704302793043310182526965205603774385653311969321173331212835547392587296845221807206335638843928749849510457947938612432868241044749076353621407488410073206207551248333799609881930000055823209165036193354244804208920991065276559411758752154294001775378226648844516156477334427467299485263229160154290869729898721568604402964e-14), SC_(9.99999999999999999999999999913747001105585917346448255468667731418020687259389117642182162355936270894492609327035751577975781905511260534442528906521602550843864551447652777416530770961671413078170413492886975664947160713180489434110163702311286988054098578657891174616776498835271527908985423746559334439292604676555187684744172862013311889242392247626156810700173294404002606146758360658265157997396113740487595634539444440222461918086708882309162207691177052462629678972670037494736536100439792893e-01)}},\n                                                              {{SC_(1.77789708411153768441437250658054836094379425048828125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-14), SC_(1.77789708411153768441437250648688524478645580912315036422418839735129736561800912560835961982067194327873729369871016834742639611520196204396728785664128662482147177652003174719147456642995536688761494047602027150333731314226281909251891742919393899761767420368792123139583925661503462304784697391744091122115805322210363460646928593577702071795280277818846269272559540733486786538784857222816733384344097244591858184250197335472047542795560179495424920330227962994053357077457931707468603426251460959e-14), SC_(9.99999999999999999999999999841954097915384594811735454538004302545016037022517780490173741435795675944555929465406170133641921828986499358904005969797819484344239424979764763194041013420519497310559183944490160788417032999948756260634473243130077692082484694343666135596322405044585526223426948443120980873050098596571808877217666689185784054062839744405474537113202401718707617992954377641581966966545840927315700676622358215732909299904758018931589113524600079145027881524323334695454152651376769920e-01)}},\n                                                              {{SC_(5.55649412115402641099137781566241756081581115722656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-14), SC_(5.55649412115402641099137781280317284473213695030346303590402303931988046396190338269482149660999168475038150256800723829505660449059395231364201161042275163348508537606449304494069682810716375693279805579082802414158216642122510822165563995802863552100344122494366921663968851214429922913820743999886335738338311045421972245807345175726774597818626362833446973328909358428881598965762081042586774106378896781546245534530618913971744589459335901893304147242918115216617276790851847223349497418927973733e-14), SC_(9.99999999999999999999999998456268654079037183233581732191235680025315867467018181588237226553648078402104412568966357460261758140705807969848157060264373212772583437857468570864009272459824286929152662453086520176402045732499654604160968831934723473454758968594200776188249690085254846050117019853832573195081897863789261857952979012801346898762681231872848791491800971643317036237879893584845809194076325524610955276649279179513732336594657763035295367706519084046186378639813891200730024664881194352e-01)}},\n                                                              {{SC_(9.18614956237767676938688055088277906179428100585937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-14), SC_(9.18614956237767676938688053796317258083557235212189163208541269091999669666251862949510205364812241435932602713540901656517151026883360600451742706846201757354337788307438543330054149104803715768067518620042425775420550383928117557120515122638131395055608328341320860695875103112009754385279107344430056107313863250016820433118759295567727218114604325934665604906406791475823429379313212052101226211800542137836625027013187029262562420815009289990239523883555061206469585943421229829445523451696682896e-14), SC_(9.99999999999999999999999995780732810881420878824781237756494428642216774906860674262521495747901019476422529053067054804076342588867228309892313842590968737438559958533351462306136561566035343161310449667786137339299678900922238922396965259978293416064425654849017060386290453490593319953991014716853265314390480621748175217352424683886712175702607549061234175218581612412946946694618730133735506473462495392167916885413468468240891287057630611654063369552363308029777319668075166154464106813717530309e-01)}},\n                                                              {{SC_(2.02237261225785003304622478026431053876876831054687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-13), SC_(2.02237261225785003304622476647850095873909180892287918519663670291105892549106786498699240038550543980803346111571520530796485649985741199932123859242106953735865135143891664110901496277566279720106785214896873432294102853816490874908943796259151346566606797734844804871424841376931757109413046850801530240143016207449719658356785167896334666388493819143310669816981411875825762085981881153178256115280842466820922870399927388430970328517846034743061348720046367396642901249562006592204193360151806314e-13), SC_(9.99999999999999999999999979550045085946798831307767615967815728269180214484619036252790909403641537946797064418773421399496826527484740300031970118682423523800911121951712600720523023938618836373759218286510508286981245064681398402091026119540125145271144222176557855414254314889883573284827385379124690381427040558491108917124358629047794540691235512374459271544852802999945917447080468309969091217719526175112209317700651086548969987910493118357567850475532204275002096398789155408595057632731154652e-01)}},\n                                                              {{SC_(3.34987029435018790479716699337586760520935058593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-13), SC_(3.34987029435018790479716693072418709836017910929437771667989352195765848457801327380537239173197201180176080218346985650892495774035295932905608250406042601982574423542358371694291944969185689340470978450488775476762384924785167574380484450959985723643696985669647726067536240145655995029501448315267496689967102955915125920689511406179578883297420325275705419734245616104771318170311735879077910111632963840985257248968295796101579049149898595541297275950413245232396232327962777768734503394067078556e-13), SC_(9.99999999999999999999999943891845055150927223405544616685223412194532018312352112927452321976910999098948049508814822499116849784098962082807247240354662341685818269245714571156296285694028218930934948908556886283919439083377260618552964932511197054219874122814829581002165311372499459672863965236873628437256914247926307351641680837638533400251705920788307072678111781083295027335002395879798438407459058176503673480726665421302397190962673216184108932938297777524721561087126288972933983518946155179e-01)}},\n                                                              {{SC_(9.03792015186088981693046662257984280586242675781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-13), SC_(9.03792015186088981693046539215738321788986007042365699492396320316279543704656553385920212950890969400392613697102194394333089009302293356880420539828722393281429459440756798252690496493026357977966088511646078696519216849028481527689534601133226590775882871940037713146444153208116387342034744131483842449184313713683684639667347361681889679947544099071968736411359531118781695435946215982692488955315854459642225183570337034144595721581924901891009381696599056233108436380627927215964786584791618908e-13), SC_(9.99999999999999999999999591579996642934151749028718876204266336384518057312270158991179501722094007867269513312491970576830983231405458466598365896114293073967915021543855661308978854719200666851617736145918857326995797691540025815161748308738637322261149646675082385639820462296143823539613814818378533729566185263398193570914921475394320955027638215702854032556452121005120074292215838023871081463612153498469043881103912304300914513522689206406089987405856445764613561621916375162684097661929892747e-01)}},\n                                                              {{SC_(1.22932697008137914451708638807758688926696777343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-12), SC_(1.22932697008137914451708607844192184591614021773791940328070305907562272284382223300433745269608192105599620144790494124731585172304253064904889570512798966856390838847723038950322727570967216489506463988189696586088552862576676302458507583018378239538011152581276602465391085652348792218000095574348738110188831812197308238926987928796802995971775221419386158715740692175212354148929975079049190330152422027211799955068768549451248468523076997234543234379586454572701565848445729465086417448959545618e-12), SC_(9.99999999999999999999999244377600315267972846306889896038052955037247802621151442469870443181687549662547384392242168552551586198987635666377667288491218214785084557964246070182324401939504153389732646676456576169283311877256893335438670498971513103206528391739503987826941965462689634528631382329044690235509449552819606620554284030388025785016998747768833817596505441782759764113304742100788573487452340669666205903502531701419783346606301970952783643261289551845395097138033771960548299748561183193e-01)}},\n                                                              {{SC_(1.94194400143787859747135371435433626174926757812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-12), SC_(1.94194400143787859747135249379511403083044871897362511037050124806754061275336835830905725762621394550968235318798300478790638972487568362561464077501190661717588852425709719253847163292958680062291156470483595542128963560564633973633700109207198638475983195243424201811540606422066782547498014390464716148059784336885812875071003684709344804730966630672604654294265898013648377879784197004207883524124056780017570061779067586269124313028463274433436853556491404974636268026606448413073206266966668134e-12), SC_(9.99999999999999999999998114426747639720283878342644563204203169790716021521459251173383061511822722138542525896575482448295370211190274140784860421332669802522548665773047007513535501337737342769293246553594052155484863347990751330806127168505703238439677398058671991000759955784841064858343931841972679048717309792670368465654719670193574986504622561882465200813531019263380321051541831568937340898838311445737284611598359421546001386821750750668783594967103468706500099741033123754869005438685314915e-01)}},\n                                                              {{SC_(6.66051588882332623597903875634074211120605468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-12), SC_(6.66051588882332623597898951018257669190239027988790280537744366770877869050933103459259476608886777756579915690814859257345475034216099104871689275489156456302753285073620213598586781180228060589887702362312976118884573130740471011229159680210967244895704144448701015278817840314429220158019791909505966927759104498603516304729831106483512971261087799947245393962528955678079281745145306463990785840496109060362063486482136257417186274670623641839580128843624512912347189142131567768430005910784229570e-12), SC_(9.99999999999999999999977818764047366008251915524084203751590909615251086260955508748261875866517202782687029477624871890438384002334203109091463704378174221182722376822335534340374142555193102169681841196257200130319439394836735580276154595560504229580621565183026575699906092001065134615587575775622899658383438321484961911921543293368782124716382447335465893719947339645128446390223095375192808481543364390062737788287402811325613827202640885016945267219061070038152413660953412231060479866988215583e-01)}},\n                                                              {{SC_(1.30501373596381142760947113856673240661621093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-11), SC_(1.30501373596381142760943409660333560692039710197239032057112513034203903698344616901524225376776673636415296454266367127536474789531939842197697151398931051954620168734015505409490467508115402882079987820789347094140079821190591257048602505229613017427675926583289549059019839863887788014562137726446278719219792278561923255388743792279408327291728896923250516571971257379108941833199023548584100079722864916841543005155359097839080114754493639235506419010170504574954807431988824330519664424575231670e-11), SC_(9.99999999999999999999914846957447288773605522779915678255591462117418280286605417598269089175755617808165165915602683165476414345458269433948306260363854177529036902285732309503596434344904848730286616536266179648232912749254260921122177909333891770273234400774813916276696399105771617638759781892253016980274639868069042438911086857998849593859350294868259456585846305237089203682687313371760123762847165326247352229463880572729131913191062641677831432439574962099265732575505785164506006988730385090e-01)}},\n                                                              {{SC_(2.30686234004018331233965000137686729431152343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-11), SC_(2.30686234004018331233944539753366059849572649087610511654342255381136041764843262848250444528344180274751100392168733968453303717207105441182806117417443233943716010264058015378484280588583802181389162890492955868058516684358307750210024654293194277914609668768527570567723841110762132081932253661492542191753298326334321162262780851843772980019848390872856649462749403323629021847818806351420968299819163556526351045832094245083900470441925991571680931787416162265425757570563755456357840904233300722e-11), SC_(9.99999999999999999999733919307205216483006651477197259401080960096043483966257192343615939983066359058015411234573217891951462139195543298683130104275658252397201222054956161090902681981646889634021219639651905330486172099952446497605963028200398919937976311851278164684080724300523198038402357061425303530776059374244813248811828979039869539865200596606550574563921484875225783175485587493630243707736284879141253824075634607287034007852277416184589479502402414449884296567587929029951662730558004216e-01)}},\n                                                              {{SC_(4.64061566951556869753403589129447937011718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-11), SC_(4.64061566951556869753237027271728267095397991615419284758180707686003398529938108907558659049805544522166142089343687183618822183674180398802623140208567072402203228303956147191175622432634317287818984037751722759314830706093834121136985601634172326524194261532142165832914113607429591085129772083038510981278068584029585870749896926379359591566067146763734165664345664227381459809244090427239355076319156218271945168418909110785694512816165916715703898907302335334394861643407127627549255668241455228e-11), SC_(9.99999999999999999998923234310392328504314665821502918105582647737643019746695356200341919771774449617719049429392209231285890370146966327702937705005002184280017353077487902270647087318848825953575460945669274016393435239996905422988310852251085179190521532751217700605669335225363776810282826832168168254965685159520325099422292341939640480539562839299127143241281660562761636134317866645828326358737604399820142244271880315035259321648287816929497132547280897354649873459775364006169123128552913124e-01)}},\n                                                              {{SC_(9.02057872842476626829011365771293640136718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-11), SC_(9.02057872842476626827788012314974142790926916207393567000799536747528665852957940046104517610928340118743826314162253680048717597622179343740006335264696415656819212856065002452706323285773197002877181170513609645226653106034257353908933673379666374178326643605624295953803936894098093825390857002684872623073784374057517550449125474465431745573184934610421148035203590941470464984042723048840309084189771384579997243914014773511588312133450507254488274889474764456105591061347125528289764395734121383e-11), SC_(9.99999999999999999995931457970214531344382763500560740979521450298825780214945541896202189854474216844275983986675930662009739900611201068149959653449557497416940647881320682912193115325791819947936258729341672087252057416024263812703049224805890246943526656060900271910628931812153202546207245286088184201636723675366258575793036560652857802740273426903311938076552797325985907156430651556662087903430650963838535614862310585721428952766908680195035699158214593729978819602348438663666578546511487638e-01)}},\n                                                              {{SC_(2.01724303927619530441006645560264587402343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-10), SC_(2.01724303927619530439638527971518402895378308593167368933938083097895914105097853220949809226355195616763949665976607147482734150177406396672952859214765226945452347977564327048328471633932359706066181475253090365189727333367351575060582769461913412620214498488588122674367266769995222789306232098144726082974899810430205404009158930892774244308055687571333194471156431420346649010206696858212297365763691018084631483817683537177298301222874090599257812256350856270478846129594126378216518526591643988e-10), SC_(9.99999999999999999979653652602458691842430650820260993559156474358290259195311093915253527357327361693441729958969689754741626190671808226283208321176357071049612666759270261537258301510936970338807161008051696492329011151441024206711798673439297093922746120664076403362950701801472249600616977394476695828826008527819050665336968791102783867687569984985171685557174424584367761174767539614359167513379500439820659122737961073226213712482343940968286210986638068482869101288889181592269909589057079909e-01)}},\n                                                              {{SC_(4.46381376306703714362811297178268432617187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-10), SC_(4.46381376306703714347987244476099027009902224539880005072561623010099356540803184148103036001396078252044944026422080138240224768254417146931017323334565624451815099945627590607391027983942120417773378104950239985323999117684804060836017845745179632044457016676450796401932538561014818518845565777874909934983679133832686623486576188630071071148938083208938499085183977246795190669480369085393999940011770378838807632321077683437611646390289967229138020819814603314833128646684632972758168720689991635e-10), SC_(9.99999999999999999900371833443266485913038040997156521730870275068640693475214820902318135015361433760915624397597203846840940746657939286081364605200713758595178692424520434822206960393490736772166491137163017541233795275517139247267410699507649970089369444931075965017855747225029199138401668188234063259525010428970267417033114000305412910864715637928080786514254241357289574781729733996541742322741084600110673688819799600144608849647324443184768061684805422295932405956450624750023427143250924393e-01)}},\n                                                              {{SC_(7.89404319689879230281803756952285766601562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-10), SC_(7.89404319689879230199816332201782739529240876597684471272919980002777979484632363432465884931581298754425539385458462115986883181108643392276139302735348983421293058202757716484062137411039264846920281186219775313627007944254474745735092011358327265824752737392551192886602710943611890515757652974814780630277463419954569206290620286570655977415225582763091478596449757175244395774820571912306590264730883843056758929601320981726777511322879727946707924970966013671019646025854312852174453387563435502e-10), SC_(9.99999999999999999688420410027479475305362157778906332143894166082169936942731331015607326922677730904125008992719151667796893832292596525226080125485663687387254462074817179973188165868637583981505405306392273710095595133094657390308796486677320683162477145982344545246447461503948259405992813915821707874476148435145178882368552160954920286669801651923953245324424846942116744922945358896352588428998382245435357510599957693421002169153027160299186706875542049015760799819878960550724185779068785498e-01)}},\n                                                              {{SC_(1.19753096328167885076254606246948242187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-09), SC_(1.19753096328167885047632011372988366839572495166042379119878396866921535579541590222533938771802127489633885286823687436829092513169438926309539112468485901612826556554647131355737095301585331266627432715950786269002497531271856275268976492286772142534422181109956360070777230825864534228868599188286080749992690194349465150189374099100496968514528603190277672577719059890396520617292399022494599881257249461553031630617968764612470212007400625184399122708879017220672145741500373239998829273594129387e-09), SC_(9.99999999999999999282959795990827170135614551023194240930093260762829569325129878206690247961179210344290146583519020530140477449064663472153477122196148449723990947674581478397862389652720572814459349933259175702680962896596786112183582392780523594102607808197088334429511356009699288389060708476939825983150618719140382258928526048553918913632413879435283278548406386086586092090685080850137974728621832392962549756584863779090254093942057791784312747925080865351451451980136949655068387207234963197e-01)}},\n                                                              {{SC_(3.12890779952113007311709225177764892578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-09), SC_(3.12890779952113006801172430787239899843014121180020028987887830642136016563460269227648455367884353405820594949780478791250435270727158941605153451515613224900471744038506348092656973671581305148881839609084002562834453936791618968140360445438617378508144751389050414302328039146499148686500822713769253502370230875150664323494512343222329717689617673865658363215948765288460608585507671188522539091504719171739787225791322428333826762895704700179325887091436326383419834154611514564672051705672679729e-09), SC_(9.99999999999999995104967991047919853288257931434502650824735772704901382256708715021400393451254864039132676058501649583756462483532603552799348051856624202071636323687874357588478927990651820778386282265459606160788426873464937091160667643766602768082383907777101778047612835332747498483430187110019957772023312922681975084585702702709221851139804864228687947667854639696398886738326057666662346670866634585482424442770349811280971220063596816378250127941112472200556139543776950887869805152051636464e-01)}},\n                                                              {{SC_(6.54608101058329339139163494110107421875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-09), SC_(6.54608101058329334464042270717554606519400676020573764995976115778693340979388130080022974423866935284325224591960497690969536588939452672365750379157106213853159115223232557801762788904356215610406895778680268668011973801486872457234995334787076786196667120204171752334345220791146072452816721140739938381457912498306668372885313541251070938296534995649585503668002513271906453156430650046287837268495454161895286850464882200938396384912569859073295724940016743865987946354209215048147814054560547411e-09), SC_(9.99999999999999978574411701440404233691911105547524791228756909319836684728278557912715521020318385009945375240636666743026580394412900791259090936132285225037596739865993433693958701211417830265319761760818827268301975142733786084305836633688005769082569801814452087685765102517906826744994947215969543741061484041836019692751063794459856496528591823807106900483324218512086593607216213529777612655991996245466300172132394213898662211942653694107956279418132602626108011683019257953461179914335417569e-01)}},\n                                                              {{SC_(1.03735935397253342671319842338562011718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-08), SC_(1.03735935397253340810790893751025841403787815856505363100476894912737720704301244348578436008313475030686333192772334627176325130192577834575419942038167479241334017482987492858923177101199753404916939468489116939860242362829280075273559017235394780006839615093480333418803996300935520495415063145607760188117015493031522213277247229248056357387542181122622768572015076371502931740140691049999730628263261329673265670764049208272952521834722647922384989326854349198917760704695926154462049679427169055e-08), SC_(9.99999999999999946194278536284405354610570430372345844458835181493008418475677210409811435500978199000936738380347156217172881551605742010246289295475642679026543821035644853655390677531816640177832243794051207478874195355431282643488079197260679386719149446309958513855351476668434360361836809340787797843883968024921763591812095900362002068091186310802402564913000326899027361620529514471492425167201427430668102330868055716754719034039207556779437459710875339678788681820457468797439539816776604272e-01)}},\n                                                              {{SC_(2.61325965311698382720351219177246093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-08), SC_(2.61325965311698352976552085794674873948977136797189716587867829599558705866806962643405885733038039478988642364563704357082502093947827944797367772608225883166215523823555298418758318630457963482420232556107317667605517036573551347481182888243640081567986906925549623281756915886475451174605904832849770710597096935848251100601457675358153761388535145261895383377176682130933568074601365026003928958385110319127880786379945331696265445429638709206271414191927076865306342505962011449784687607233615452e-08), SC_(9.99999999999999658543699269545087412937067564529648844277884576114957046482837719543260440895585699908131861178001643432695184748185712205336322075891023812779806400255307285635209660964682222600661763324276256706481766722094270367164876479959205752956664985241064867292918583916329838581852654001919326649998662347558813007474950774388834590480461253782550965790984460939938335780491393830813803651547817812540355485622875414796710271358731969408980506856043610689479845560715880583092274528220974819e-01)}},\n                                                              {{SC_(4.65380338710019714199006557464599609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-08), SC_(4.65380338710019546213101449129115033161848051306517504163852496999266647986927435990977890722124470233716535035990445228653000823387146271818720426084568211949650343484184758290087581824628001771507825912267378927562049889381022044816039337591261522072635747352493136871116429720337851950673898424910098529686862263347207701376800524528418048828250587804897579251153864192781131793938839620359474075175276829198081705127544868279759961683164164202368688955879018962498808663268299079979752869609245111e-08), SC_(9.99999999999998917105701710736827116732862038891301894759899293767055928392225272595948117206501678573317153059878167175491018649556936748464550872544907856954522933464150470681110854065542390219844974968670264625826027885525059842104573562044746263899791837945122572103192121273049517060613765582028914775681100285591918055756290567968423433583223448698871995491519052440989343536966227231794085271655176660154985346506937216237832680674055765810058625222813752209386455645318051700424429635825604558e-01)}},\n                                                              {{SC_(8.22809624878573231399059295654296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-08), SC_(8.22809624878572302974031454935391361372051682957068440610320436801540761922332609590542871910636824146618989600960676006105552258407007206307536028311773758371384227498119341523374370443380937572494475012853690439239638281798715153078626511309309040418220071090995999456749591226290293812387279580872835304139321819307678449632135824464227576504967749390956982614137103459123505807303434260206228565147222591135435434070689816927846520472271632967415936426640676428703540971888279567964898575910715123e-08), SC_(9.99999999999996614921606035909924093917868987200475849137228921444966119154931547433131311747286721713859993964713899333566061563563544320069396737088155497880063790400169176996226259767364154679636076351504706293403513289841547482443607379100708634166577212868961703960806666990381162806668658969679112306754390205132297815473144631413825060452445785272573811906319333663841292964458685149139890735787210705223580744560561707667329507023265309675234477115176492742999823352033168878910390869069602146e-01)}},\n                                                              {{SC_(1.44012915370694827288389205932617187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-07), SC_(1.44012915370694329490470632120488821960831420625097208452760967773899621810591454782318687404722250729109496920322278038980055717492831906815698784428939225099587980269878692724152957317801702412412993718131255597355895454512166790913978083465076143342113847865164382371389644607523752931911069238459892398036303216120203753683695430935556070669486987607684338788351666960681655650102436765917243152996502890151550049144015760341535686810061218536126158179008438752649028139652964238696677459061310317e-07), SC_(9.99999999999989630140103216562700402577129540528603374109265955230536308597494067119686820392828740053320454263283957034972289792638690212984598029233291446961997991969126997116029008314129347403292717442507305281117023966514614990281472312184568218292849743703025193325667661349717298061440359197461007084458252138139784938458360221184396180949292384861603688190523134947836462720740001267066751287510670926330528553505087996619339798329208819107563086094981065297536727314006650691009272319462255730e-01)}},\n                                                              {{SC_(3.73797774955164641141891479492187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-07), SC_(3.73797774955155936340127351088274306966945499304687351262224327036485003195399876134404030898541569452698698785128297775253846740013651700738117739570712980936632597600460893639731587793211760397741272305599435232590671004667375647855341661506518793260072662904540036197343969280257117154710542629945909475065608111305917119485608749363342549197465035729619138390679809197242810869893983371298887552954017963591067229750619536979210184968032123026629350132118672624718293514388725210602289794113281992e-07), SC_(9.99999999999930137611719284858340365115221610379236961291415554500435872388131334398788410009604492364643595965830967680631112341724704163694720399722612295634691371226329624623908442837416395690299608196223118613825405185261111911951537848971636572392818714982018974612977857238412841244788826676293170497835913653497769763927232690492490945784008368787039023716182343873542256800681402456564241935627923628431291698833219433246493125751712345703002417251750058512609170411880034738680935556902505563e-01)}},\n                                                              {{SC_(7.28307441022479906678199768066406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-07), SC_(7.28307441022415520449044890666796158134075453197296260624638167119898104724468797620569591993934165154251894245847724657348679804318367468423664871917651373448389334331503882422006453094389677135962962131469634391849918422883493755583387914729253820958027791152034299949176207111497843039802381391080335874944849745658182004855872129588827842894857367834326716640912301040886396931562001152712265979590735678629914058813142332537079465290202671615290625230647393466634240383500876112800156132201974042e-07), SC_(9.99999999999734784135675655199435477062371271904158802490932787360232684194206055502603613593047275332698707464520011088631566295631082659933586705030333526358496612387620984644750063897599725203398934908527060541521854556685436158796714198252960674419809228990516232542677961431420440764986615825562613851043943570711111775961182791307437967727617534370632679575032475835782635221622680183128935771393540477464095097827358860337546655974513824038524754934769834274209792801776761029464963487681454638e-01)}},\n                                                              {{SC_(1.02601461549056693911552429199218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-06), SC_(1.02601461549038692382672664367980909129797678870667768849146921712212318648724429914717031817788290760089726336692234200973914773135228261464696094871714327427696538664377177507837044850603843659343822132883729646354999890909512098529406876550302701462857600464801392168260146985374253754203891556843366488152159129130730566352444244537417884234639163162077937574407637561014227372724382633431402179130482335521222619551445219770431699554800298663104276019009351056140042392344367285483613919360270842e-06), SC_(9.99999999999473647004399918212790658478585875953442964686116107604076344236801122474185649272934613995743945730939569552300021365101719323998149781972994755931612189643480767690316499261003148488594493744111104485195102515931162213304165502158643932709516860360378708209085284952295320543183629161025237715099530969074626286839526867763366850481056477689318071063989591265436161763207215219865838561800778868728374531420305187030797150900783726793452464152222676753653006247167516863553168502906926078e-01)}},\n                                                              {{SC_(2.67831455857958644628524780273437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-06), SC_(2.67831455857638435657005412213610982128276604639866069595480496471537739536401609653955476091173984298018333992862711537987312713316036415483747683882706275541677384782394839207289648307083009870715553463423558163889818178051780340013240706740963214040859738404485649136995119403224901763227367017966025598531866420695841491386351905041601360740252046371060654593691975685823280716565708139718098769413838914699445951082858703077317900076440435161320338733864823055555572257326477201841180943482872309e-06), SC_(9.99999999996413315562652461552002296120358356472133278078314440392542844209646953698240203500798998633549867504425862619825808196127841261566653158765476564276301681397741407108125586006528685692276874904550104105313883720338983664992978010697540996668822432388675633251819366000519391363331431034508455570735042351871115290237627556585117202107938696024469549112905592522041283932404634914222293377504740759899590438485366489707037641986399526791217155900620551904585509940641934181648230634413259265e-01)}},\n                                                              {{SC_(4.02049954573158174753189086914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-06), SC_(4.02049954572075024260087118468826429814663153315077991718901582426759064739078052407110165549578932460376560288440104449973094159762702982705468081682224630114850462597062111224598235409091240576849433101102274161969329875425199265191158999339698045252297020474662563333717095860445116915074136815808082848855273281504987601523720992152761270084812423792786748728905718724925236891423461782473311868144673066624924040595777536217052283197112160037036137391999739146035325998017752148720000605119897683e-06), SC_(9.99999999991917791701396959419313813401265180623673059179911547500949908302190117148933168329908690893202837285420822052885466203283802841353637437714044074266653743183772093591630593925853924527974309329870487833794885494542924974682749486064402670967310507687630404555758440772082780068787018846191231498609660679588396035862441583962343363796596673788481921721284934251655364564300464315956781078329012607834367762424242617511122928763782421412214474185216401731965589463411912546191521776651138922e-01)}},\n                                                              {{SC_(1.03207567008212208747863769531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-05), SC_(1.03207567006379964486059135317923765178884637901450818590057242469689597001143337677447826397179538167736031048422475631735874873560436656704544669504022530773567828579863580427738546306049255238803108540550172893695386461067609240342223514481537877261996343209535310475116468606103856887738630617770362994732691906313027170715951153121602930976853364057496740031527741044543252742005164654126014924982764255443579086080334090651228364872564641844143122049086203141303222959691381228360964775537428520e-05), SC_(9.99999999946740990561699687835096311656569291167275749312185252030381383219899994380821659170492794982620386768812474172028293398252431135066349066538792647839668698102255251061620041845986018822889924627257362980746160722257168566939728109073250489334405824801674286788645760845367307942971073221727371765467748461807566364605758791097966471498518756887318016848413147180370466183250281458021428954703658743849818753824375557456108425203304608071735244045207645448919381735548782239335207831536854561e-01)}},\n                                                              {{SC_(2.33581158681772649288177490234375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-05), SC_(2.33581158660532274536503743158240337737646213456952132594369654562065216097877971320195527157730193358300929564031798828711595676076842939009562163723943297244285734194006007223556382374047257979318721500414262285245856557018249968979311552508909534303598154907496279169019026232123477133854368562792522099489668676299693279861365831493384781972611843978211229882541656295508764994514877851663096566718391379871772045083068385054238623504509574501724078123943242318442223144503041840263886374089552234e-05), SC_(9.99999999727199211556806106904766880124422922887658969070618357584897186718873889930706733533737414920883255973805088255784903870503201137916841892176156804261940743581740668610287436174400116137484876377141991877409180757654824575875337907433838981829262228635400536890633592785954176621124567961998085107372061003574500599157091043708082332975297815142693186921586918415547768897948908381471877202194378061551462589503407388052810183783734976447440624694286163063940147901602691211823597158892680245e-01)}},\n                                                              {{SC_(4.86091157654300332069396972656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-05), SC_(4.86091157462873896531559848284582637784557632474682176085172337595134155904033586070379315035888134734726032766408540784812958598806994566663326780124710770377187107108833873767030923227727011909837793256232391518542423335743456454652126193064084872761224599187295590933776831599753105253666406548766772599334972756691975278667198025557000529670435088027588227931051871991509667076507311250562204649129417687068848055773179752252762878812337264258619348030050901842648799759954611402159498056590639155e-05), SC_(9.99999998818576932484137442598201473525328287104259159863210153066825931991341897043829111475228349045483285498413995323186917285933143000076937430579794115233182095826446006806557434845683429950622114857801966123846319338055787024498273217621081374284059134966187810875651505392521771289854146929405808060886179474334346367549605047691775074583245613018760263934687689325536147399232974306541392134063454728398424522096828357018128412581868706236434263323391431032449702295638869342133483754974197517e-01)}},\n                                                              {{SC_(1.08591746538877487182617187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-04), SC_(1.08591746325455478104821136819967057961442551278838752348343355566286218686113929505011769085392722880098614840019465066786627028957464813242084556927966028282629178723699648064575453887218658547931264605554358563986502073409516676818032454066518754329792331835726580758311211146649657048162622184720605255283044527192625257797088007777099678809069788187552437063489110706836509997536602585770349259033122327371763031488856712166353836833237805897511019879417937250092100019381559125979139968316714978e-04), SC_(9.99999994103916297612061821589739247612479612887786329210914478898502255396074979076847380789538147269506577481185329419865050666328661434508868431416044477700542172646387026146164224487845332693392736684598893846596257736456069469932831303309379700235636614876092375485047676007220108087938935195867325054226395462569755020081184471649585143960785879580745133870280816789767884448864548351682712557998756420520254199770987894208326002729195396286471764230750762925411446123482196587212878858449600175e-01)}},\n                                                              {{SC_(1.65569479577243328094482421875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-04), SC_(1.65569478820777002278499230035423603846508955528717361183138764363130759934146907994995145252564658286590588043330672733736568088625032438281790665274851888610402105671884799890946873289097350132844056442855760778504889546783747804632166360961473335056677009872583516249083776988899488413878415770540869751761917785545042821020637486175722597418790478332983352386892602088522806462238312763565226884340025562855038735507337739183687799030444108160429127483514013497187305409079224093423840656368500111e-04), SC_(9.99999986293373747572336229637016911015215548939030428628815886701051084032403634304387592163823574064764141161745510371323667165490842320379672149455810787341804779685538532337126177529898307424160287639638228578303059367219675887486179384440818508994233187183235425117869203130395479376427352212373583179094983956677855049181936352501675476518166852524409114024864211976654505328129329141275749256228504839199221229471272083720991903424231132100498001886103604278094475959343911266474062340673953856e-01)}},\n                                                              {{SC_(4.72170533612370491027832031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-04), SC_(4.72170516067693075676085308284046548368287941901283849283802268407085001323603380117712993012887418320098470197820438430800375400461013742422252145872788157889745624950674378630308331446848389037105550082483516085665582028196070194038315998455738351257405359430069565974850464666742859881265494476240853811215470922001980390784076319007787055901806119150667756505054118980239535903669464580996153901994796184051966736242100731906816925205360327063389707705971734665764585696567561507749437887229461456e-04), SC_(9.99999888527495665124586181695612446896055759076554914046210391986508076349569320784929587149658215798725165235431650500548420438784030227751958358265628970993501643962381317805243477469130674237304889359122911251912706271419560285910770631706849781369467753261971106878784188494585647101027739471383693003980737319512703901979613054654768752954440845304999284188711132746818638758530113359491822833435683803246988867483208003823651051032814261010407735099449745359158953284399378090005712210474581903e-01)}},\n                                                              {{SC_(9.59456199780106544494628906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-04), SC_(9.59456052574554543206855339368821738303292144129224643533250613815319054198172995757500293034201494560266361040990132903799826087882524386271334883058570222574369362764548554621322985293459036681036350936792370263478263637436635785459960302052069887902457445187820098082690964284699226936748715963376583385063569355193783639233905746245528110402738779975078022638401708272956028719655548309901166652903956254394607665326795020988537856449664481578241990439621439369798643363472829333476806722444683316e-04), SC_(9.99999539721935661078558358877631095592475113333838978294776138905920499993032330139337421241902110329995510935282225042250995091483713765893804389358404607462625442239227727503856365590616276283533013690912228413610654893588156280765066256573917595651391760595965856427674956693283638835311400506664007482874607000520400464981164369338168028152504872866005567199753620315631853218147483048084578609267463623678894563773075053269450532221366890374338890064467167184494935898119563677811132238676494558e-01)}},\n                                                              {{SC_(1.10342400148510932922363281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-03), SC_(1.10342377757381395572780813465347362173848474850723949280118058196604746697019572341413318215944145126695958128785386403768383539056318668913049580511267222668786396512987355606357832079330824071633509714763000228154703805420380841226809762285320859255338411857700840437097392670248917342530077492683819354527846578272478059817224126037006797924447420234585794971684867137695895352065956771102354676254811894365161560870498206118533861539197244201894588423238917868029352924008553204725898125797159845e-03), SC_(9.99999391227798240570355499022960361310528390499881018197266455182809171966708398936554453665968911045993870299118374953720723952637206472112388139335340004035264857609225769117609578581537811200358127352219484431189085457465511011367152198078790212367556345107155050267755673291854354611601028709748042046865897310493248610005403267618655965229352763040418269822894976453122559521873062039563482824923611739885583070016982058054313658269935174171343198190502958661221270818484040408653750173203230643e-01)}},\n                                                              {{SC_(2.25476175546646118164062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-03), SC_(2.25475984495072670616699492058592318073731947935815704559772827343957028999833639178303301437534887758577187984590048560049309194362578427803068644654064353829312571273881404656974876959933956881749270257978577085791157039068158591410681018436713818579999705850717033396103629973591002115994971570790017014579064418272908019539035645369810874787478707942360991938657434252507502080409901856172541073238790283858388760869397761626405870660463300506949260102988070042807416992646493834806872323726803835e-03), SC_(9.99997458025789982445234678521350046147570566747269097297006799068277234530960383891126934577579240030196329864154371255579971284092149965664359210957736971529173205042093081250449736372699216695844500361817207467277119512515305472466332827851429424250625947451636368646391696099091010507514309786281538269045925530297104928415277439273287729077747597056412777599320325937253062039121168242112708605401359148662225387594303232749296186979313529662443155110087020374951036032548173900426505478925101146e-01)}},\n                                                              {{SC_(4.22764755785465240478515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-03), SC_(4.22763496440571037285398946467322152879438013077166851167820322096781411803101602967274080802806089831791310107085441630457942728083218628874481058836415036218079015608106582663616413342942237592877795451725218582690701538322377534768805672823178514496056562910114186529938444688600571794798707451517027196106959482213808413198379234771333495250671145504358644814838320906361026604251041524455314777424351345824775387198748093231006179859065418633089177670013556478508726004901466555382091322541680881e-03), SC_(9.99991063511373452677789560050715373145149428952096904697886367712876086292035745304311300137665075775273598372499767812075771242786145874855260095826032408084979781582498496550763382567267778984462635680866130352737905116567138144457106898289831285799702043487961078500270822380587722117890745799126097012166609016750935133471076497871995927122341989914848865983119754151725078374043588790005160728009669720033867672541115407013710341252692207454447790955386571269789604798208580025842831790721417345e-01)}},\n                                                              {{SC_(6.12821616232395172119140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-03), SC_(6.12817780483560382808213557329119466062200876361634502126654101855994873417503462171920965026316613028274177950775049233440669665302666581845868636766440489877186411773482813665253370273946003944605695383754736936873840106381068326241720149322296111362109427697762615253610223173961747328543942833277670703533635146996505994275092106592137357930186405512884836781314222643145720639318114729066271317143669053008940304917313235596240875802807154598766141454795653291599739378818168929230008696171347580e-03), SC_(9.99981222542099697541143847070072546971828712330332098329770865072257185985031260314852113919032198468189307863786664906732595418738355515847783722029517753608046646105120123876154838707339506523033413632583032210663688541682592679914200175407756374745025341137154609317405534874067938923193059980542578882066469704789720739170867326643959200096981737568594315302314431892923592597361251855561253029981966969356407795627317125366633329796621808980454701786643444907402366202716161170312320402120775433e-01)}},\n                                                              {{SC_(7.17522576451301574707031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-03), SC_(7.17516419661267582836034142174681465204546939240119108133248205295339734270417930084308859916380512773163931881507840068416345388390221086830455795381118700976633134766870842626243909834567744533155267945294716455117405920717282899684428800209181185252677870139843050740709460388726089385203283189938165953927393351322007154426959879457092338736053974861861644896156794783787260212117683134116318158048696031746003526637450133982920320145132406951950929463951376414554776872928379361757042284269550869e-03), SC_(9.99974258178055125266307198014100123003566845596771527056984119690792340007476181043717952620624133322304853462699177805133923671700194459571450679112952110115183754067736732754526085407259235156594925752725123490577463983114254313088597337232878237130488068840714630832409931261169972643381940574573574251462173875076615043890492664417739484346470106699266972677891219384324959207370519061992691189768840015505197742750976116894509011762334997906198598219245703947633571105806140038697463949630336210e-01)}},\n                                                              {{SC_(1.08977183699607849121093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(1.08975026685868225082099747945941996671381818418315536870193669678296106532928807799250909718485024339364885037800450270269491539718476844275823176938926046293973622562776303659992189903112282273804688777592450861967790592563558839055840320743745743517124801776837401121113421270015723410236272602511202037511553596347924893762020894206394739312687863922968952922066268886484510171475010251450006622524798965971270954932230608474913019167203244840780765530916268329460323782785258474769888609110757044e-02), SC_(9.99940620454828879176449810090714022793966325036551863037524364956170680998552985230627257441664425512623325862947910848780903454899838812983927846862074783892122375682062446356128198011466542914409856704675107268613669808806223468999915731471549560119508428919853126572110247471699299141816274992236135198359087865880841983233018975591367702314503088337980462078592624863043456548876665098346359209814481626968880920471651405777824085084498961422127406379393002743019949466056574181916058099651689932e-01)}},\n                                                              {{SC_(1.78531035780906677246093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(1.78521551967464525812118193536998457864178736944932839508966062490920983977913731452860386330129428988643959146499238519533510439272212211988348296443064807083049612254960715004778700987731749155310876701221314643204230414499688327215921624508990886906725847368865040147551794223030969339112865851425188756335235867433293871733996891222497034543953097408857990064751695677356390131257556267672627210868961098841308101435582396237613538685321484883810914108667403775738742025077232461429195116913304281e-02), SC_(9.99840637579225061689220616432075985634795177684838328799799378097519517291013941215385055849958064136044025335614398935312278776881615250387809724005390098759965632553311813973103549298175120350139482524465729389908312417807587194665842630539253758936784938132701160252206934489824287775250794380842975790174460246991944385024354743401221003796973051809502576452212229636093005330964395681987883595479541881975506947710338355137649374464671012035562176747997429673069797136234426619034789230719427497e-01)}},\n                                                              {{SC_(2.03086882829666137695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(2.03072922829785412764841050885782924234816249136965856784583938017611790081018736188223687999876856101493286192891127224653907316634100288250902277997512484886751200221909624555006302408389544784101560093067868425111920727574110886210515003659002049664300850730141800851166512616080332122075080697842576939296258415122768607418798187858959383049671689481354903539156410201084805224067944662577370176530609953627594786848538340329423858423683103538089020644057268289846646276221970072536489769025643200e-02), SC_(9.99793785677893519174812779480838655924731734932423234294294069992449425216385970005461481038863544081690554334303539704684132073109604649614262579053784312170241598442533216766228590091484634176673005320023682039710851136366207849186480817732574508774099889801516500622987309336021622394250832627784750051628496869920836260929136480639941940830972794464084948098223215601031017843124234960140768044637617707391949948127367933673498635487224027515795724693469515440840875190922863554670250380512890187e-01)}},\n                                                              {{SC_(2.29592248797416687011718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(2.29572078654806901956773962128873725317258199243322324833026864813543563298791582759067345370927013211131751436485373135926303545824205672100408388119836608013942723742698253158825504611525346094396821412403622255927493921481889928668837905973603383651805682086702397751093728776912507758571185200632272001319729003355651579071960733495090546994746963852360611508210301194267977533797137231602723726016493487285942976883227358425348490878104264990630653588736390691329691673892319586298997892103355891e-02), SC_(9.99736448573833438551901374069916160082285485161657935970098520489678155282193702973150207036885608526804424111064981121646464459825539846765219169457812958666384096707176259278198827616355298087054529952352895771688201169993256457977842748577431116383131563229150919282988665267307314378159810855110884585840543438664714574577985254814341262596212481955968518620628040275972941893015178582124863257398330562940280357682968567499337875321971067674002549590662525412105546099814520291879786638677849755e-01)}},\n                                                              {{SC_(2.66608446836471557617187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(2.66576863716550940523643834663602903343412691027273852843135941288217001883358922665531133518750112173938256664285346400960504583060978937807117359041113160326475215921376215686647943718380783767854304202922439633733916721749843129015530644519528290494433930248285283911310398738720138221726525289062335677459212027783675235985721420722586719469315045658602049763170408429747316938170763162477214635052925244540302524248462164057897716244401861039283114010655031575267508920532761222634789689538511757e-02), SC_(9.99644620731442977071074952503756513594379179610965927674853010103238383122624249337790075531392503903192894317965358160816337306507873045677143717869693639520801697528499751699845748033476777032067833843164251267038735509848519717356813147914406232186302906853746387101025616449658340377064049192334098838427810354558514702289969721445128620523303760656579431646500448912155533543139906061180895870794100250533118584128980041772272673997087854201826597188558589194919728518908452007643217258987134441e-01)}},\n                                                              {{SC_(4.33529913425445556640625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(4.33394124252182473430409877221967910797867622226492251867897610304826237176234205087236591492775301187860990482272397390755639330607447336901965105997233088160319014424029346223644238916843456763981709289162131537218519445453237404967311695686259903340466092692225153320582089587252645635191955910645798631988546760161387767229889141907691633440411944042639714942724664881391497750867101083989306287989019965318777179382753475304491095052075043277502755738012378861349287761686817900063465721264064751e-02), SC_(9.99060406247108182433110591563949184008590550285525910681138166422995597546698572115332083802970332128616627121897628062691197069398078335651999531708939350394021171461022811848765537950565221073815507985663387023414130658678517161835653671716651889105148592561400980999844972491569135768885981972484556339777089910598305278254049157000511662638183390385938716919090639856781430202246719809307852115859635342924078122187579416517698884917122716280159598299212052892821404132658413827277993111120708503e-01)}},\n                                                              {{SC_(4.77492660284042358398437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(4.77311234361182370553346707381159993522127668228423471698794041916914462592971898735317849465740734845328633088053944012173225744522673856105790002415848172408214069917931220805129043473864993265296014536251765599619235474270638309161980840862577294567887230574710596674786583672806261330613179024636609581486126381444805459823476722923620864804227936605524668224800326195728143182612430137862837785368173385669325151174313653767933525960762817591648188359244076692216655226984222876231471974326328940e-02), SC_(9.98860220378970765416666292064830637521544621232664286948273469114279815643994118299261220464425608197046745838168231112925313418673671418209258128341850371322883422387259027817868426171842847565005445057442801891309920668960507045036275491752451469501935202560886734381086026356191953555384486093207040581077635167409982151341587820821452812951152750188497181793364081579598815492232851725904672864062658468093007372919440011978305101459486087741869001923855853317522336571059851757312553762759660218e-01)}},\n                                                              {{SC_(5.16691207885742187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(5.16461336987755230869002002933674117113628450460422043485783336784426247557022356731909397461110296707780131841951583578912090434140144989808173826842170096882942749374641049049281256365429658426702580621050221660498897060467282826111146984504858071976776010862044802440626983001384950620260121297069950332695775013404688865827055306077429454209895399918940351395258935654650406962823095146186230791842645841873960270123869669412376104542452754845295352322884283271557570532941474399861951518394012477e-02), SC_(9.98665447922360135213521266796851531835766163012102217203454689231482046185392838489821970734399552125784174598237931177178099063321027279880123829101090102291996800001170395479384503634523326119052750469669124649924813326825830131301210568512199084926242430541410903632134473488254399271424441248952830602871668311874043567869499006057808372210726562783173297018290349493718182960580142111841000744070620479569810216657779987098922352077088309252329258306000595216296566049509627139117579193448663272e-01)}},\n                                                              {{SC_(5.35675138235092163085937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(5.35418990269726278953677792861679455376590654675816169848288105945573655682296899898869189937986681565688296738399075385825415191313522118358129631489596746430113341211856136081029311923254306994352803590375421622780891367234256434768007178556481730242780532291413026293701001237059312098409866323782729969789632460239666058895869272654313586973220036641750017933187081733418154997011863506155998863196409535077692811025064845163939795073047119520932989194866829270668217258257742446996467296239119175e-02), SC_(9.98565603778031935652835648513686708834550710265717769750310667576425570795156384080269125053377701778322103408050072703031273382230423580101177233233637046691140883620617512339519592385040904452381281257315749593686899133043996685159638851121619705365155446292409398769831758909586549766267584554212254610789481269394405823437544863448131217831503558412097043985486772933184380606483570614071708902118307606358672960875898690760212848810279332764698105509738345245083749332937066279013972721999860951e-01)}},\n                                                              {{SC_(5.46618700027465820312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(5.46346531864185652266299265989588209830477972038596340046745896270965748111117915407412844957783278731133588174240048037524044875999928967753425125705682555219277190276660395984393739754427791927609984222737114058002449717593767347380412781416718720139763763560831069900217749569616097183501956486846275878732672863046892658675036070608869773474008125672567991097462136933844468402615456658577751136172272644508197808001817946107058777720287520148449437408040153565904831296703427837337651292795982606e-02), SC_(9.98506411932942854108042459383510836576611626853085805857841828589727024599578729102555269651786073170459620653723435360146680969297857326420874817490649789865110476564950683767869711247167921681531780596807917980825034133974022054580775539485597880316923766328630105414714347920762036457437458978017894386560496656019128174531675104091105815589303265933653087805554087457116460752142693192884431966173438902253445039424420104100800153312932924952674504484086634204703161803242375829959949079328371875e-01)}},\n                                                              {{SC_(6.32438659667968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(6.32017140698571553308044713212277127305580363675994643659056175266603461157186436972772935697186775584447574120250300482955852737095239398524047402605320085802360502734438527396117034710342713540059428441862943107393468247351552313105817924671750521572193181871359324500531838441102862859431500100485751200567575889152186067903542912689055820492041485586215746117964026201886764474679347399259605259899390116183549116857291416283292113855783627598795204602258349944011558929310877634929059670251343108e-02), SC_(9.98000773215447974930857087008764150802722713855075131190757826889154050945553921220661121452365560389264145143901439511281161342450172975749282079997770447047962785911737177061850743521158087304394889557567640376240963884213622716828950326306607973087843641309155595671290107453886169528964221217684412490926872530448945494986971864760658616100419196710271977256795134280916032136610315122731856424655612669204766978915937480231411079284123625076175877311308405119710061909174916588652383642106075950e-01)}},\n                                                              {{SC_(6.92570805549621582031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(6.92017280684475612902603902770438207229823809705471271479828689022445623726238799386938809349344091646528512687247043332181204378221893753409890952132644020057841217740487449401462724977326326240588555873845938412452043950543296812754149801196579464929877851745061494558924117827686964993369769544684901144441194229164891237169979061294758072061727145767674440485650023105765507606408329089425013899299577165073264823196330995405816916856144211104913426885632286552108251986044868955272626643196292768e-02), SC_(9.97602686861027172603564582943332105673127986071266218353266069809274511253146184206845366224173756081058509215281054336469951237433524652820574411529939841191369181516825328759338555257162658220329035742673409660923162322070338772130378093565233782382859190969874936467078560818088676989913102487523016799437156795510688393525166046823170397107091522702108912971248346576465497475646757504529354235293789719140147756309348702788375506713736572756372750138970931785579136687784786155541123581503410624e-01)}},\n                                                              {{SC_(7.68246352672576904296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(7.67490874173009135069880523412697822508457585502890722795865696772047729876064075442195819127967415252174730960637180479582147474309291939932982065599344583920928985188488533311881202528894182053880415621488280876401150191961474589923356376146456592619669462859281190965749024420664637455818648545745030269593390316639260811403394610404759688632573916754271685582926522678938892974475043221360555516845248432643113640807434458674577935765032643325568519227175900369858636214019202303533964419422257850e-02), SC_(9.97050438834772040838901364158313289434451716031250064153596345308272018821197676129084180229236664005399614878677876975471250325523150960303590418697802419593875967006452331656192889917521490087559820130552413382203751563210591862975073872269071197791671987098499838808586255207819747398217977453730543524500812800441363575651210847109655415586570890200280733024493168949243199540216485504542435209304533986390812843525686313059881265579087409955174014924808295795997240217218146624971087121410183716e-01)}},\n                                                              {{SC_(8.09251666069030761718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(8.08368672891704041856401399565977462633145541207784105195635281766371350041715608644123439493672541993789745715282339750465069529433973679063356554636481676969838531641729712415794020457592886899793165051838868222012601738089693486666663383926935917522627219438621364751646584726391558914371888319525238524046669167174017862265555593626706190460862728323563184295785235714399851325267663766041999660466314577095673142555868764898118503537742829338293948772872287161730013924554420829079124806859650838e-02), SC_(9.96727345309073504356335470880926838901535446591427240450997135536600995694562006339829380366181693066021072124078607773475760189943037842585673090508596377006890419990768006320611612165829317461737791908612725831462207730332953868156044465579321433828199753603772645372217436238602125419724170481393494192174338226617942337887718845813995926557696166708043078610521363485223670975974379541202944258805434600100105554638957533334813937130562560651036711336483875166644356875980418013651512472303074208e-01)}},\n                                                              {{SC_(1.01393043994903564453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.01219403908943933199608683876827266822331896657015119348435515995873251362892581898523969110413473057175484874945707988194700827394492484991666081694502360714551805379172398977994444953795788193400170674845605172617176911610981540681123148867173832535769953275410424339906182339005138130601396483778642126418902955006537169862336104812922619101165500080507365921158621143838037659291114217732698524358330821295373816025579728381376436689358518738815604135961883722908286779990249376227775979659081520e-01), SC_(9.94864127543212840320288377821634845647085414624812202931183041261168843158195990345771004501686363057363117868426992237675460528773854521201920483305361363360248147058939179651726098593741851629897985101915713322985077003831521906997798395547116734574812939319828244003602124162864904183647670159780723265956499501655186584470976880921550426566136335393136640881134844219644797108944868300338025473599742848702293332135126250466031987636207455199516403656090507615110967455528204674521869347233184283e-01)}},\n                                                              {{SC_(1.13781422376632690429687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.13536074842449533573056314560680541888587073396780471734416954452266370815229214023167805970244196892487614906848712576035545051060440640696937578458753351149286198659859230491031913382949861842131574007393962925506301352740569195139817573460190730933124402796432541139111274714968331991159010328143533636587905459810458085734253711085152213069238726912858320015971192029698392132381284060402446909062105834221574702578371713280266538027801135387833807187710401803421253961741020954081638053867325880e-01), SC_(9.93533874464967449063569644542184589167411915145555830925800925048382916374957718228156373711609029097586917146755989532376282173266030804470640098835579196241275798250895989878704696330453367858309552789068201155211873250074943597130122033727796915843325644852705268264420421834017375881556371386266487723607694010828247880528072888290694751350895959530491979302529696561595066224369723425657904124135240815273639834011392138971431371570459667652548016159381399021194622625664031635527048346353172978e-01)}},\n                                                              {{SC_(1.45697653293609619140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.45182726545119910896301503065513554089811635181347002919360968238106525239849127106083723447884661619491476318996100888058149769236740617553657423543246126224805640578506008942954719919879771041763841262575849284095401812024452055715104953842593111698915775744793562621776046814833194051220589433393977077573901754840253776854446283075046240949980380729523982026872467677407277506741271915544833128497503377061431926327294908631808827940530456038838245220782204713528747800140098835534702697426926175e-01), SC_(9.89404859454877012674104360255215697445250382526116686234430435111636180480363210039694164084560087713657579140601666008513347848135681345012895495404482313374018887800206381904740118067209223511554356762905416336552796599320637752873442358116522801991236920325855007630644300246736916456519031036406469453087853685796047621522776532546594623313211992046640425909727951781150478344661351442954782469918430949839815203310019596602225454055470344982907764565783793045739939149621215477845195650414185624e-01)}},\n                                                              {{SC_(1.46310567855834960937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.45789119883467940942452666599838103341359960449718828761719210957523413508589636439490441998945000690046439423719795496860975068959608833118482126752973685992497281683536728240268587587996557081304567902946969692888006023433259944486597453738216622984795412987238720174132836036097378879575428714062852373236946181672074574586946077158989655378857849435203064073233248254743027223599966958610307889622372063348070359540031851175872778387328989367308344217063459104308008467995496716837575470375139856e-01), SC_(9.89315689011148661602733208421699488607704021068618550402008672427204988986372856602489837286757458629350642286967590178573609349566514100296374300421069016400647354574847125419309106253968630534855968665549713372062563646883184246277672032915339186942154941352874559377354486407977863425325175458300408087571803444300804433696034967764795880754888144181773120850915128858590327910126025450201565492100046247582395277159945474527040466390117883445528272059409080559643218070128411416452778883832850860e-01)}},\n                                                              {{SC_(1.64792597293853759765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.64047741622927076939215271236654594127897011750093105907421204884321017294953058710221397042344470958585047103860977693513220373332344673343758494866765737962583701512149928490660206619098121564968746371244119245299480844406136712899775942646822323057929571303890179803170552756084664071910161392856844372737036778217074263519383318878308282686738767677049481400503597999505931480065837516222420967161921750298185638735643161192547265245244900149693758408851479162365892639074870266742575198789041130e-01), SC_(9.86452400508213756079085881807272936135605003947860908459482770413651759106178422243846316436626721487369742516524557342814943387245800871775776486342542756619267901007984402634148564481396767251299084570255625415724967480494452602327750220935561537677562719487800489429908078112186638391572916817894043484848106365987479384651955220754065637423636048081167989226482466763849124771027198972951029669062947310139511886934376746339774134623284767012226001205043028480105389214119654265467805704996894917e-01)}},\n                                                              {{SC_(1.68696761131286621093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.67897753381640777196490976482953588467508831683372714558795951689672127553712898036662970055721497467147460442678821010944786665039665291723031055582489572136347698523359833632507727947120936709230382289481829907710145607418756967621108259349346466686730159813704577895106354119168392929747217498250651261920149217884008242721599405476228265647737002662434987399937591531877704904771111015714073021213635766515555210055971877789318074905744443808130938693092802702033774758042610910893914411986093307e-01), SC_(9.85804414886339273471656447974713083827165382741323834224259676470752447152375593455603668369541005720264056620625978392433528478869903852378131490186154661428713627385705999552117875818397456421062795844691099250197140896284553382461330648118896559620824983015387112024605313724313404676635578899408594831199173075967069948429971307857666478428419348687818365697811430472301400125955439683148729027958378246677795263283167676059509815153284641866483046913274472527809361657130996884935738437688390849e-01)}},\n                                                              {{SC_(1.78496479988098144531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.77550142947830555217390492492207436163564856376397691603471700758805620505094698945847003802998214813652148033430104346445883849635826609851792442417372917393077225504169766027761171289816204119015355122870296588370885941402084021320650235068717288615664162092993878080601955739098755934530077051921941503847930336545118455807353704448177612457787143073152152474912906128361372592953146702018572591695826734837888565690378918416926761365428056068697441293452285112838098535915209651376327087033569747e-01), SC_(9.84111755208322331601783376284031457134510436574988472806865188081776835817350548686113681409314838853209555871734190921300414611852299784524298797341600773458233613284112776255935237880953315784741791795731746499567321404790697016686075710158398361815849761549871491374222001546515259044955559094074496617496483018774261036037936237441724292540322806453448653765063482075390934100259487001653040960036047517057244093701162162170265301510994152643519555751491036603128207767303628421845067766132528336e-01)}},\n                                                              {{SC_(1.87774121761322021484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.86672607070509018200769158467157136756113545054809133514599006798341838147428337915964255447040875993446601094948338007788867131495492683573549252266794504395930828257199806193163317944026329930030276018177467799947302689747186012618665496659752413411604967342391934340345214204527433151759729624702175254292451837535550647514340490554770316288949909792125071156560813410066946473274599946447062966296654108025847480349640941090560137303957768362702065204305022159912119527935408421499721086175643635e-01), SC_(9.82422178989002337815610061337143809470232196191426172141227152440284416089850158360549098995569868789283179124826053849882848723627305374894506652402723568360198439729964565008020548646418669353974087094974102981683934246429517284904279436821871136249465341395739281782779316039327149652772606504080824861909307024955484203942865858838215635646193223373227875069545714813048165491415661891289071426040111977674591777031031991473152177396063672370564663369651796710946807883420881870357844328037459019e-01)}},\n                                                              {{SC_(1.88844919204711914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.87724475007002131192192907909575574869468107940416726140262504902012686677137623390390440018094087947975695782954301767385993337096992265831822959983588134109865279453818899378809773125976208984682808324883167608808274828949288633727230553400197642565185759119997079741072491457720275500904428836491322659017614746144708698514497655273321270625201156908314994126688002285337649091106243420898018671107461537753842230681275281559140984628635324537359567946033168059091609203607550845641421309987051017e-01), SC_(9.82221727250698436817021350854404602400242591298039572591014001362833626919487015527681343503737629906656769473041944230032084140575629753880323082381394405508949229495961813072980287617641885223163912931175425781095733566247409734381851802008224421103956525409424631620202344202770947172844441311566015165775590081462279294150426616367490190370747077080364066702877391332809076163131938938563303607706965846945894566447961844220594229365249133061197350601224127232615735975265049548774049804588028913e-01)}},\n                                                              {{SC_(1.90480232238769531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.89330463273083171501356047975738454519834711328775668799269418262542693675230211169484065483867752411796711944188561819164685584819239151595903268311841262796101414713826819050365386774822672846563612883606074822171787843588864652239834264812845660497544748008612180548384351041957557898905180261997435462673216754339482806193427627037707093816679505008419641782078097220844921334245843967537368455528797062366592333764784686568744055047958612982535677498760226067950696358916937565635392744576096899e-01), SC_(9.81913425754429586682013889768017532600113847811291666387725000947456131091217295251884688576304598996117091444449076993919438338637549621415126694566727540442457041137575867954992620512786069817600004167654500318167894032291062929699694909648414253182150669496148723694315542902771679739586190635289986724110105904070094436041592234600515389991658872221604551947008209955001901499595025153606756488036807775907625811360112539768038550121486610887551305042579936830908885733477436299200628358975660870e-01)}},\n                                                              {{SC_(1.94859266281127929687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.93628466557083175937744864244790830668053598910620087560855663628326397918747917496701804712300389916375529322287795071844972897988282823779113733963560377794242008202198109920596762933935555585424489154825370240638238205749913867006539156012553835311920193678258151553765976847035445513869442729110946964494746309715218534610352446566786039322618340026036341364523438132919833221181717413668583176811261681042404934548226514142822649044118616453915688888690801607706237459440680955231700292236811361e-01), SC_(9.81074929319240387502184662874193366494892376995268422080911994896932188938843218100678702648454595788195800459189480677724548072115284301366906218387046613476243458332542611925311671611202355995756808329738252593319348185404315688233584739120945457255900313939696248899018740177998528759646883140416866189013968416544572880129678451134992718322404596854003353515915190671579319691512530656126775340885106148417889476553076706646054806482802741567572180944742654675167468422482141054087377709351667607e-01)}},\n                                                              {{SC_(2.03215479850769042968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.01819682646920095923757718257761476769301989665491185429289158205603248364522455384939136294409419950738281505041126361431633176654744047644395695093833382944676718163092824428861071634027022690056323106012491255936447757470753147279575163352864381221318443333004723142721489343022119668959646121865064655890154871570932168528973909882911830449156165155241550354768340210585682803959840545783404416670702497182916990422425025622036736615873006366902267886516071073081904058012469598959221005905865613e-01), SC_(9.79422695109877704279630115016162779341438729197653622653511871860857427665621496308005256225301647590150890183023870213973551366446778827045639583831856224791984674969152761667061884727276778725391290362457018194029231238622882731367668907983050807609897703313170541946017503082428616641673224025500577727237921678771503953427745799384234510120079570656146847344758019012266371807613472779375992191550902090841424078371482339253787081150785495461758875501897023881237849778458350386303488036080606616e-01)}},\n                                                              {{SC_(2.07936644554138183593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.06441432111765598898622696628034638008185695872547628186034653306091137842792921910271809676733557669103553974294053328911326243602782740588214297154717533970165522331160663449357525617459935928199881831844976092566068029955259730825952855266608700751730681501576772094736417834693837749663027914778438343298984135440812456259434671197055417724040905908168521650742559047974895842842429141632802570279876313914803674312694054572490044105458254539298356949176720439807787731898038453066126598813031210e-01), SC_(9.78458959337407914880017857366240707691566796770579819059463425270298886098360523692900979968885125117268896174792597043925346271994102038730825752617956702096517615173232766171688879761539440408643776852196199211523030996935750277368506862219703970756235309064425023141236695239770048877371573690168695503939188151919945120866996252845385595169432390250574335809999951819900409720087947226987798251572790175287245792567131272039006656437435690023152451503423135850418689659516050248598574324279754693e-01)}},\n                                                              {{SC_(2.12829470634460449218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.11226371452014391278874870071073310255372702463777968786843878133124112097140473459644588680440461706449482294123265808698739331752009084647828193442025974033968649542432348123746207023993629961625392580147265129400199313735837841793972839204732752322634442996742998985161049855446603805134233954899877102074734231966641527718799921704505666685238290172987528235112149856899544215597311460808399136987719564373629445617240952996587119331927421670252293311525292408359167374526921754803210077087692532e-01), SC_(9.77437169337863700915956028138184587880119521309718402773143822868653160875229416631075342793838257456807094385135358010247340775654046653152968486378214625824585383995774198214703672411773216530432708000905914410924076763688720643025445894500247986983994857940703526076436401941590579776244250215552581924626810062975652107309232328773982583693249830181955081354965661172527831758216391460026530511489630646442106088711356971367646510599128382728363593410702655779358342814182142737020940630712872361e-01)}},\n                                                              {{SC_(2.15869307518005371093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.14196640505365112786980685694428344657244963366876302714289501728318645735513153812127852740864750088035328907097365685728621293352830777003662293698178407244178434333281299242679553774479025546337174728441787336469271585023342163534779593199490313523522509388806059835583629329411911994168179200754968369466465053277189853243691400027013334899114643882547886884557705155995062509092370819402521209651344335312028605152197178040025081548811752240491682214361328002239129021416396548559625427548307079e-01), SC_(9.76790560558513680337105210359946000639131660265038803465419549929502333210272302004423538883524995851695890751897479645727458798428416719156047191385293536035128459622583740134790612138039228883962636358032372726838818091247096202590945439186853892215507835182481988301876992478308045540062442385616914635141454198946321492170688154415464432037046812112157612157921692137918708124553009612313024458692547550071702227895302886545623596270022503303566442880581687999337288455147084218206433678719726348e-01)}},\n                                                              {{SC_(2.23670959472656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.21810624597241132842120335214517834339392143595694143128274453434000897522756707261372395934316603499717542829693748282161138714986831310993664331890086521601864106048610503690287656926479843414514538641298186870853247769165125831749677090898816822399854510209571926905148166670105459035975836926248520839912108203719166947500998176906261366299289408429302405966781907431722890616467807693626704698773283853361405226169691717078175076647095721409493977986059074455050738153382636134995510720710671481e-01), SC_(9.75089763465795884741527131038743144799709001486249188041326805783918794629379695544082151093155092077802612594232019135110813148686802535895584065956564082709443629066755383612577269625034627767644996066171592038545406563485710108199711112941937879356362448421804832671387840559048718713150354052800343295008040554106973215286388458315674666252648980563396332758055989177687609577120292484105909678934546857037299176307632935036447727717180599996592072426254255769122423991437040773975082976170615027e-01)}},\n                                                              {{SC_(2.23940968513488769531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.22073899560262365694286717947505519111283644170664206771039359926910630331073658742969412774825969687561966895608228668933631484783875397376737627105822734327244074926245206170293122854697640440913645377376408795641981619695565686182046225697863421164239415487132576368407789678491873903413263920057530744320682668616303876581465600307577735903297039997271274233170932990376623624909612289532920770987498809066596075937444420611813712211792472789626062389304386432536592499629126767217589494642390982e-01), SC_(9.75029837048127723940822139588475843177309010241646824834890251549637760943126873479985410594784222688808386101184513250743227375486680081269879083496987587993892050541293998127521838902835032687085618894862339570796558908797414825586693093266928416593647501074052462459315194898583715110932923738805350182790175717405384839937757189467422189694843791570712808954321923019264560496148035150316447485360041658090233265738607692675797783748168822650033028609970920677845305526624179703136420672529771980e-01)}},\n                                                              {{SC_(2.31657624244689941406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.29591182609749077127085238730170106706857736813427802366752664527336057726814890516348780149683921473939966330426614880926920513363391834821219987707185070310628905127220506682979261182544755412644963119149140529134513151273713405482176072789374585351910363421231659904446435482736921672058606578269611158940183557290963996010971436645314363561578915471036636427166369046120643121839806076708837377175313829976908135486291158992783623234671513494993196428199914265882626510236826919461730552972391764e-01), SC_(9.73287156428079478716002235261840740084659684284952238317074702351111144046965256073574026272435872923902375480127932863055570218099850498058845991144115236244780808787578236004823706045777816872726031536853820091469953621293211418659119493664242846692836341723477399946935585891718727826727210269898806213165073098754356297556028189303673469342497995341189516686033293401960600894424313593735029754214488412768090121108833953441556711975775178389200877887553119192408194268363451687882704343063502236e-01)}},\n                                                              {{SC_(2.36419618129730224609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.34223349413056397535012002649904436414830305844190028305435023159273725915625176126070536513473503773761443813896860179566226215030054698884364739340175429059896502302795731430829268126913758185127914230290081466116918621292797533041072984612393204017063572807293439427376418097279461665464082135412905032217137478665683141093696829006176517072236564399362165513731516388562375669839784466484294380256956425812467551879325915966779927314593002321921021618774333412509953834406188378943630420645257043e-01), SC_(9.72182813358541786002433931175590541460042986543364086630592342885383343147001536864805980731828619596937794265961718654901510514211526139141566031421543677149169475559185660751374091780739745412205256535077926002018568915189369879576144325949910721880001449576228384354311343808510925877039105192748773741470732514283534463934140640280674768143828127412493203855945797591134707019619827976778153234830092252653180994683559102578078078112922678991500372142077874616293332485901302909710329044805275133e-01)}},\n                                                              {{SC_(2.37086355686187744140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.34871488097739499325182931413505351694220593578761046285919402900396314038981468317698513784728753707678904087823880679901353228605506493220315256494105744645692747607812240920726257071852161205469905087486866758169738695197038438740564489385546672183892154520431462186791739263484418481646858664838898624946550338296059888986041536124862767319780937491163906732148464236988371556330822489239660766950561247285175680759472814930515821542521752960722919969604212826825858521092183886310338748881065702e-01), SC_(9.72026431779894251196781770060370781942232099197921106135120661810632188271447767998922653780711101087245102808499149689925215265153567962454784863549632555036609694179109787570991771070663299652723230727682947164732542496676768999691153749799756038153217247976912922241000804288378011338863184388596886818250778639888527560620930279032479989201300352288270935683655631157863204440552655928070032781156882878658304467502917435388924019356549251639438049985256013104098155541508692246870574344519742925e-01)}},\n                                                              {{SC_(2.43917584419250488281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.41506091145277088258055644639441358569817962482007100168326311125875063836098620622959651436734701882471449140478713900715909279878500129381183514118262024999806448408272050800309873272930533810785473686208836539208518972638810893445205260384153052201544122370711332024875386229654633135116430009940820660271175620311240007363471390893208722112919297060548435968682520385755428340093566044201493651538792843899162713805017257089805610227242722362452752755712664407437715881745250028492688314820749267e-01), SC_(9.70399303348744740629281777996064222428263418261615513535874548301569309382617106182778792029170310698906217117798672892846704087363302115493606289878448928850470701791100588123422811681772912832747047311027507693577117550759576184158586663998125715627678041983984746242143715742993728038685477261982457848406983044715860265386172457355491196156817728778006847646901469415351803533371713662907224869572879545133363858740762107694657156648981963196682114252505711326234507610327782656200028589799542508e-01)}},\n                                                              {{SC_(2.56780028343200683593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.53967476197974948300470152348630856437778853649046907694498691134499701923143127504469744324018390842560373525607438987081112551226067812998235100935619020567790557343921036803399849329868217689750950833215794053798842332077966448743655775706289028308203291243933883217329742193753836170798816464800183920334186820141625424226651537454752528987557134635465607564214599658805078608562467124353038044016403220286947830566599498009540891072458280195284478680372582276803344509618865939427433243186835188e-01), SC_(9.67212758928267564909913781023042850649210074113110150779555204117688346768013381733678013082194846590955208239649965969631661476988930023126634900965028238708450802408191612909963009729559467638514828430744779946263855525266081909443245556093474249189026431060834809707402911975224217225893793806041927048869332697822498929087665975883008669509854597503249122523872773752290855879726093009296214739100119212703964980457607123946633959558534528977914687915954938045274688207897907901409739771736928444e-01)}},\n                                                              {{SC_(2.60797739028930664062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.57851397011684381653215493513429137796568027542563688065682683181925805410498887334830107315497716941069126625883444139803709878524172956770808697806028611481752384474693564304778209137714825262189628252311617579879431939465205565896109133223548776955538905705145912571038082487099819804976109268792901846106723571853632186612320550153956924085148492263001817363502564890939924812502952221465569860263998509729178129210248318839719688265189638258894020460309734694369100144115339691339084345644936187e-01), SC_(9.66184587467178925054039264094455111955839447116830926670726695111056480734643576588829589093151750938173095092013885475613504226596420519468505671990665350017874837095070411073494200828261854901406233203038856164661310773504995966871525893796073964171780940959271419513681242667294030646037129134794487249645323271597514346135643239350470405850128978217907312787357546601749225176561132483998559247022954834588628902720040609501476406971711684162585915398239747400812327533943923544201497396858592127e-01)}},\n                                                              {{SC_(2.80308842658996582031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.76652450296482007185109133379664986610558754140681586207688902695753779035115936420467935545647816866342460857251769261384109822160070822065813412470021999090276003650217199311308412474031531959235881402933414328774518297808848844446010593758203002690435296417019422446348869688663492867691085846932064019691350818883217102844458071500953410615967446227001405852516815294644032584384232982816378360038056258865349197065218045342401352567566701966410085468889024864179205506936222190409656968011900042e-01), SC_(9.60970042064242787586616146107116426197837340865418091095527345944895322898303059643272818932380762260288437483034417861243469274929582394086567541874872298007787708205027386061888638647875009556202948648007162736259944552779661019144892638210622883831588324760346381909877348578780965122436104866880945115333116909739647331839907523858068914185740875256136194033491002352245919072705583433053970894735852186581105174794397321295820740029624593397555262163670489560045281417159094407435052568544583826e-01)}},\n                                                              {{SC_(2.82572865486145019531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.78827397517083501471330268973793982020956043056485002311128625203480909125454608266708548153980451085052473210601286247173130026031229525696322745955073475919151565202896009717230846962853493839247625955407998823036775750704244213916449208714368364119934116691972792082838205032077422066968600200507619855517581347340368705484048290481249715689825146802325327892978911844770343056488391346810580610465544218157636626264496716159139173077724718154881144994010887526795536631047147615072038166218903597e-01), SC_(9.60341232267911267381183747437916412664206145164440808035842262775205190353599826199664529625608027776265256698881777090330134881882621301243080560629047040706379584629760415449833531862131285447677178430450969795503445162404785990634547384830535281646944622238215968178098765324782398030728384865653375265992828298473324897027995908029167111445460569023719561109308443466971207024803868610011124698023157985663134329675540970828039088533857954500329172829898440732546662708726879160639308567661975472e-01)}},\n                                                              {{SC_(2.94892787933349609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.90637267717841491949561104535364579480516629619465233961662088429726507862432828707755088894634084811614033440036389382302935785798227412292625877543660982096842193549591017682122950990682866966335040743620085528472443575918955519317567547115188821596525197289422532447233271171624471539630699450236545660114361779939258247443407627749697559018581819196742844858102033694745403183397812269091094587500437089812851864223611210570999251990567044704396204865960223230481030875348590845729075010947570529e-01), SC_(9.56833307642197273737587591887788902883665572636978591492719689000054294005116111584930889939634837715671167147624840625565369350659889484795889431524480465624414463011497751732807591607039510326250228891745651691444695736686228212611256519708123525260472804829095732402311433573156680016224942389308080982389958686607782516409251583788265789714265801240259587125208043655617146669163064294419760829759381222936837853395161186480505868322168426789639562818842156041662627171754918917363217994882867932e-01)}},\n                                                              {{SC_(3.12102079391479492187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.07059841753405999831874709749253165600072848512992844635835215773540826519074442226231634868055680476383181767927905664549163235763421873187566026682056186067295416245364237011824046633465852367385333102571562124547765118946951955979688673963059577571404554960876833646916051947025162143308838685134878667283759479195753638922242852116176090313158946224342073520204197762440935994303058357749693323128948419047343584057635944717911926030922197584857079144392533616441138045686008248146167555714269123e-01), SC_(9.51690208829729037576840431988604462673713730884139839166679534444816195557573539853339641864393360660504275727368557568823262838299991557009265270390565138215230359107809334255713836733104929918340210504480125985259471413876980637442771471105254330498206205878359629897338212290265053486914375204242144872790154864198319326981914100262103960665203670552921064019141135434898985176613523157296876279526400987298715110843171312881802185002847789634535539274790806820388986630862009819666177780928476240e-01)}},\n                                                              {{SC_(3.15313577651977539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.10114604486452371602244148218816881223891635019324529166287448596151639111642932716934998031321887758081822105206398127173805917178421889838267708823608322091462547482629887325714398579152373118391661733631956935670424908070096598288890186299966082187457854379359428008012221981487666435201267688526933831111640545952633383495730237567915622726814523104107288235805511234197870540243163367745558344313156824938835437324606528773827062481267605862954451462115351447898439272364530965442052891672758788e-01), SC_(9.50699180647701628487396566148787086923240127099513645066330648238578006503678248562865690654153023205128969226084861843000896121071452674247004201594177477295365880682146363659658132961000098514414933707666096881539616427931595066196727129449358218571438918172767600483899976768586022179968871687915301710377855566927304861652670623702239418492743070118830570825034432808087497781397107161393707647233534139257467088129639462402890402094063987132136815195270053434040240225055479367979728606616266096e-01)}},\n                                                              {{SC_(3.17886471748352050781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.12559623651764165322212807870515013629324029147733283136368157446606778188930564445609204886499961778113105740877974322135198114141812803765994002806460822966254911867494481580789265715208254959317709157241611034313201797819867973863308003889863252875768021308953698342014871650514004286660121299147145333979151295417317040523136489794647687655750518369731036588972462596472475088750359571516960658510285090228124769299218077291363452482650542774467825115316859673619565065980798986374309452485170930e-01), SC_(9.49898142783039421065638698949823517999068885390741197315225792223882369515799723390096969334365360799651944990990126008736260456275912352502979942152551441391703277100848388597129862238754948539625430194167651244865488557343514835741689946133613892883144839999896471282632969671310466844604095590514416359901407768042119424637583642405348701870119240322957130956609821641725423853445963795969550741785845954269196961410704228281960935161638393923018793106680802489022846850256426254909441722034633798e-01)}},\n                                                              {{SC_(3.25856685638427734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.20120507353269781855753495379878039066037854006666100431875056421838413804434799538536796131401377586084756848199762002155463765917890690463278250414769080484724898769887576443647712277040855636736860793283673505250629213435263243010952510656350940830571318488977600380399190797841811306256449264920800681050590486560731400712511724653545521079473607389857426102523810827917591200372568412968363871519210398075893782835325802414254408155013444580413932023311974315726620968068870995641605931014140420e-01), SC_(9.47376831451922908762838282957157442145992857786296235784212495393301704460104847354739924979541258506937517027115869803548217365292294994683305525441088520786504133711569381042592814747227046691642156766413306928961886122517550515083018577582754286916121647946117367658688563677805002026853118734799467123603953437571908546773590375255669559554195262563484850221119526769206964645745371200283122087981568125996313543979605856609804588391661451911736704107832279674007979966459328784100364931584175637e-01)}},\n                                                              {{SC_(3.31551074981689453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.25510020620429986937042364685995969898965460442426061833759213271618775572332502534089976614218129638667760054701539234024827232341487900744015042229086883340942475886670748218967768455382802470563754576394285926348980977435867907849404743916110773490924826531389495227209664054616287863263783122017536567084703743906774484377495915058868396046672143731061243453772643054096975342187985727367782927328631174431309715560975124132906098483254874892901622307738985680021770864791926680949697814898232436e-01), SC_(9.45538590685587641765146475422348939326429323171424621391898923841241370861109699620118035342769801759409482544912117998047100210926071569675065306266069361724656534365587037037868110606988888827981568032856808887256355100408672863943230307292336810456098125754092279702826073831888005340499510809313153503087612891627341062875052751636176617417058464678078249954552097871951771955835877730404553836456812938118844431736505209097446001441186653820938292010753906907384093172264239077979415805009120406e-01)}},\n                                                              {{SC_(3.34280610084533691406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.28089685607080709228217073013829244980086878681949079724399520487633027638394190434541814538400934905081532180164816420388055285420665732864262317815475564039316355408118701761716444027112107825164951281390900576158191601679471853089452996750018086395127843764080783337257824990676149886920563849748965785244823891473305743274155685943018629644086807243531846369123999673290765390381103557636778684428308305943242684044162534423213607060046023289485555906833555493391103695531498716169793021646257608e-01), SC_(9.44646578461091414178776104696863057321576035366318900946928701896304565272753568134499944857053310401296727371998536245581622116253817033069387105765921559789265574277799055105587127575674744417653448482768341621979927800216571038767329703960510700455029704060654386415669464439544055800082527669571331791333036873476255791772619645842425077726695598719804374966376814363540378984520539528376950546852227736557661595457652530058530010384807128844351046874339155347485472200170675059489215428103783219e-01)}},\n                                                              {{SC_(3.35717916488647460937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.29447092824512814936909857333978391523033617107845224299960052310075505573523247423806894791454173014988340319577201412086373605467361183369713001711732687942338004705092653189077698811297143742952310132467187968195376507525259359760053099658177296477700127870263226898313059209834688876407522087440889041166353266203804392232463726842268818252672072718758696114963418808736803405270840450891988650029268928068267593406313414900302848492608154325818062755380535403696499569100684167144016534622448204e-01), SC_(9.44174037468451489365267088035088591308914231862690972249200442949837785950407535409027599648599285502776226478256147933109443887177193380043180048082903797204441059665700123928027068350881895026828260257751054653259489839515100869333027571748111448461762198635703731207762633225551171516871297042884419072089644553053235367393558819799679458992088965895165907796551275946174973771996164630689803536114225907566862466732519042785081005181299097377872608409782965170572073375788770099631685964443078209e-01)}},\n                                                              {{SC_(3.45234036445617675781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.38416913937733709520966757813075385353964521900390094265192777781629180976759543154906543836722578297225206900391344879893757491801180228412619362904008080592164773731715770901812124465081132683256968992983463490691796826575296603858671986156353981116073706044250214430461363924565609842848686311030235843992906274408601427805012593167720487267919576241994420803073155263941036332062580595356544207542092603981843801789150431453028466293952942033458196009466273835759200514863565639305138731359336054e-01), SC_(9.40996276486182773958200681776617930878019625164650782459989674721685786733581681932601940668534891638624819666126614999639608538389019139033792924807887873658144072477439537153459888339322514858220157931802931480799204440924867456798681215615902875232401509200568538258491816834661886375031648651053695695008518747665629066305896997139102057691144830863318193139443798505854893484971824361515308653303166230586156475304484860728890612192233269198727803441963654040189339709235023467037077230210136452e-01)}},\n                                                              {{SC_(3.65287423133850097656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.57217768507894662568204947843255675807937935600700729302012587696524783357810607397048811065814498967938226837184635262008597624722131769201971396723630579715381213329596400181363335657577351531699109052437321287680445033826034637398775827065362847680483693681794005685257771393744322277497734213843627872895529910124192773346772853342732564856818563872653596038077001555882493740980096900501269614510507341673697089464726073205061497129282810973902529861673474624188173849172105673056093274773828338e-01), SC_(9.34021127096298705697968078480829135151809558383637730911362229182562918575674304188846684078772850195185983871489264274885680433213531999184880930953027049908681630726745658816468630368765358193438388444550380824018487174292352049577694523697545985202828138906216082567906790013271192556165028307746636921068023709736571214708295379075646659675734920359518901568485358630990354123359427090885536764271109786114632830747506518916681775364286220930917538283026948726952104248202947677212055723332125159e-01)}},\n                                                              {{SC_(3.76625776290893554687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.67784841593578700750674588555290009506833785198348319721510313441501546058321463219147968315752577898440423256713691448443581574192691647704995440505255700751654076648229558941889912601977821037648184590226948590561121481406700523514552066740175676313066736046455083685677333444270219582696300014573394994875787124404609023528711412221065511192883282687720036086778754443433513428817391919934679127030005160315851412786694335867458231606781752083185163741537531916116786797423415811680704425913470479e-01), SC_(9.29910915246178956526127762996390085290835200613356307328386220167870557042453483854688920463534735704848107614579700250713670021607230520617663103835363172580954471811001208312362172610537525644872697074572921104882182234857955896468720884006442649267334904910635015379373768510723551974327520256221002373202064028482209593021722744220780901469462072704535345501354165333323228964404508546659907713114416707717373662856960688517308985925955799243302609395864738074576882921050328851524967663617819963e-01)}},\n                                                              {{SC_(3.81423234939575195312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.72241801255514780141645255986938706876112807774978209509387148729169318290725606760700653681913332402962543956038634844559249660919958569216458990534120382717908857425855493941999728044814288058920926074711487206514766810508241197785036696492456712063744278868653038662478625419883184188761197478075666687066372036201467246772272514710952851151273578267666562536774184425760572090907481461965187195084739783731922123489291901533461093513997345050166140627717868911685869010459883198045391385926459228e-01), SC_(9.28135788232546194521132038364809995469390110444963627733003823836878564741627652253894760903734146992929661240763368047921077487071511504258052886480661022417869838293793674031109329225882528098987875042539736745335504700923216449394354443076336899632696517389138146947845556614246814361499391989253510866187677919616513098995303183374067848140596880185394397200828384737411722734422037179383107166780417945465829318245357854600550219827881612091297993125943808294920703332405152597090926176383075193e-01)}},\n                                                              {{SC_(3.82642626762390136718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.73373285419486584743972658295685803190680477862822134739166666187839123230941197490101744569617457178315335266166130750832991878909867576156780303116056310420466140082721299101200920702587341679821454021314334846514284242173605432831549954909671972671604204676424139437229520093260765713230589032508436314799966796028238874135487653755383689513250270278030424284694964092242438945526030368678720080221231287652171512279965394603632848669343837316862349798845015377578075793534194003618831109022953953e-01), SC_(9.27681189706387550241935391516788441140986263214363275884321094395171137913622380067740793234692019438631673928581985674669506916341156375623168665333737228363700115091027793798720619125927596016451913658533598902824347300282112219023964174055808582619361609375580562926630694475951148344747973622432995121921328491332370352018238045259859104891643718529474561294212242144058064169023705465099799598255743376952428127753351863671878368910927582778614322123906693275823239648107835571442216049845322932e-01)}},\n                                                              {{SC_(3.86262297630310058593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.76728732695111995209787047749548789524801202873801147414647946480127764915716334061985047622063956465372047461169513840471796315532115359173336743873445306005316281253589057706496674703637936040009863228061656133466646243287601606843215898479726999791238624900548309438738434809614670759249615353685532441359840957459574816765343647633245421595235656600614508712872485696566736853933569217131361140361224346898137318046381744922966597856864444242287465346902114484239349231535780595166779044827033795e-01), SC_(9.26323627012684403552362441816766844353860232235455582510490392971499945546238943437785773235217661433283894687038938985447511929341894290408129096863458949295692036268832967955731447440343561805616333244588222790288419597665737236923593354868829890705441309176814435749719667609906194049295915307431333453326042332981889559360874887602964847967422924588792838807113367272643542930126342757662817756798637736653902160534644351581798443570915292325167093110317648605200947026727695940938373926472433313e-01)}},\n                                                              {{SC_(4.14037585258483886718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.02309022358804334757455041997461333566140505078691743879158537946197564687528817873499495932056914664975872822876541937159526309012964625414972273125477031300099908935396987856592915608056201697241267655473404418171750547283488188116580865118519309071287054397095416522184857129278271466239596660565476766442047439665102232580947339905130546605943299522702167491665865861076373670504643374092808500589913972673958794539143899968006744027676954924675483526113359150297838140830328866816034327650573685e-01), SC_(9.15503932557748805795905106327040154624309109701469277166353323330495047580465013025792659440882401238426239102234866148304120914512259428508256188143971352721134308110915372071940331370587398302755815933308805154767044792918730422938424084182623711157576329336501323833302695423872291003776628955935696475315999936581807634223263656320757954433352571965156768392318835020186996543923793469596505462054756265809715842422711159634535912628317197753269865492968844280778333139750719502353805594952751573e-01)}},\n                                                              {{SC_(4.15384411811828613281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.03541682109578222980709967440528517225985048739181053234151269824226530297613648513864625533998909524118788668236538749776089110757004324146429534716651136448541877388486900985147623171694083216557078569832275804610942289353672351183249955641829618726108926348664457812212186737762600307260074435150664091951860119867223657528500247305269729397446717578634530181642697357377164502826308277017576726140565738798396384850379134564652651902037517959442379535178746452390200652275134723487656738588814040e-01), SC_(9.14961261912312938531757251963975606171056514942473409705633306647449354976379445925883627419334645798319079684226691906378008685660573351264008078882588903388240223429432390727582752229567332000937331874060395961329538558312773141574847698110453487234957120645662388905771842480604587202066148916563834063955601294103619888302125700623333672970104702059659671918785799250960251049309415162312990259195375210720989849071824171027512824769600511128542169208024958188843927510126581850114332992578859756e-01)}},\n                                                              {{SC_(4.17747259140014648437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.05702467375339262830292961509995901497692400867284402738762532834250477363835078085965934594517062125768598757766526851922833631754674647828222320869834909184759233249381727184636148778919865878136269359838089231384756518279665084042168764638527443222169694429102756136038221869866520348923978295435720362171281132579960723316488821997782812137875635001430867252792096344762654563157443481314180207819454673446288993477360064344949498458150462068431701395898113402567554058677908621209917529511274949e-01), SC_(9.14005201279271594646377346252649494298094855187886202187175311561295118776486501235354805261697066551835374680825865131418933539899994837700018314030655871117929178075445220795873239047434025597938694394502337464256413558388215077611141956094182176309111001038031202569691323194114312105868329503689334322876507456971856138524924216804206474505999929378281865606690640041390901257392444895055519693226371911181192458524126880247545501940273866502248870119369368065587202123602049180417713932024067610e-01)}},\n                                                              {{SC_(4.28758502006530761718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.15742002299706000420350747592552687972223045741113120302870426713056348785134333968622790831264865107728759354826226457922147645004178978906890466302133894988997910046095558992072339508109922275893059300684403843403469208547491053713557851579495826754053336803498111074934352037413097450601064007516266973130955034354985639275464069104775602331875698543320889524438624926558219777388682431329523910340231167389669640360911599413959164117296479251134912579386628245181559149830695067791965265989825212e-01), SC_(9.09482593304473997538693396104501021330804905259321616290965777176758565932026915430359578499551755453855018104008343574872469655100484191283971052910960684234579468489756593689367139584789587966575411667359624750619523168195322985712252979133849950930553365725100676073949846542207245503600835471380015446062680593988976586976478740651122179506841813035927991211507985430856749772714779898018916484970646645074598872686609284387685242249795194138385627188402736027247052002783295346662465818309068700e-01)}},\n                                                              {{SC_(4.45544123649597167968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.30948948363146300723121092898082664509638352166588140034727822877235815161424352108919540042044112538762724321500621101449739714554194593913009804814082214319683236683235378672131292239439017243450275920171408813452754685876072458057289815611669924772864816375713651966864094479591019632462077369132936038735863542405984367874267619758481899414566965131924850013983459072412954571431179625787390548119791714022129981306939522139524756766141242804301974521747526987847195165237002774828120929063067044e-01), SC_(9.02376309476649693441524341643113425775341759303426903412911273366445409015974195367557714002958404562092936423592261308595113855232080165919809274780820143580092975184546098062572003695941781094812237267584142325544572854177059090387904225847548546592604087162701961190008072455837295803252923772102729014511396836934627011018807054959294568326023254994571985005643935955842579796563403396030474028550374274698865457770359922325670148823411893173811002205405063320700662280071632096466284915759116824e-01)}},\n                                                              {{SC_(4.49747562408447265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.34738213556773642926680214435395136165212079597736426483577114464574954760942735244406621691382502626047930455107796986703456539799434205636585457310894775674965419564259809763663316804513179985632601467299117182000653051524824513608156808552962216189357948272785772516989094473515847766720617268987918246630121096935720033107216651369640459371086215249538380063034041248614589579006572327908496498138487884900261661990149804231843631572049720496487316635858861663215229112020031694962813171109404925e-01), SC_(9.00556875312972708386219971645514750726407028236990166826545850690241517101112402708386772819738278247821223039253372151806624483240868170703439164500972016802825899173423975206096499267656188494467490343061966750639625116172486836412318757879291167804312026689814805881985161435878128369258978791474612039898718575491126104848948833513149233754819803905446108254996077234113802957319405644663301288887608570332657255734673102012379728597740044611750650505636559769166038774171113885058050685760522703e-01)}},\n                                                              {{SC_(4.52869653701782226562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.37547710974994897584705187753064697109279998870352465729791285811775949783450984369414186976030231997903936542730772259184602150876951845237393810162537878680147493102334921792973422725128642580343784196916482216571759314951546223891751601357730521264862292717459596414748032496113998107987677978514908760965351653539082846202141162068066229715005699057270713171635519654203034142538854077714450937335807216193587516840434812114463380335247298814001603054089595274484793803913196348729067932487448869e-01), SC_(8.99195196061757399361053971564480269499531017554558188806333532790012165395566350778235469914291403214368025663247285422108383319133726403092839105467674583216419489996730319770017782834530964004420191763527478616501382056309331494135424274941738292844744198027230566152257675219107464838859525235403944781216731525975237957756110906785551166391061485422062979524846055589057024469448090864935182011774817757038151966849853878680226230008627334013666482561987510034815801678655762497740517344098508436e-01)}},\n                                                              {{SC_(4.62250471115112304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.45963521312847654864328865321710153834950250932578074080324986865345001347757477980380037307625324316996140869018244797349374314464797111971273640399940359453625448104401592160237931091521134609576373756124867133666878568292268216685175056070883653017465501384214652347965224862323686499134477315926437827890962697836714416129583317366024114625719308608134932258724707861838402087026685949036796896658072984061548484922337651296656540856877253462004253362254138979753923381025363013468060276015659293e-01), SC_(8.95051136895677751924617384872825864034823165128075186190186597441499402594610028026215446231506707482496405049193560314497720776949998204342602626498576594729080138214268311850150450912069884690009285781631057732878261831293268241590115039762894904299669089563069911684151632786373315966907384512964784420116764033039210775638548338742350110429036452439780448368390817796260243838052068698870453925512851854018094826029153391333450112576463179849305395825697902104526169507205246156780703291651512347e-01)}},\n                                                              {{SC_(4.74825620651245117187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.57183365940682599975989520970592586820486164181686091846497267559877931718112664415849754810563402264421555205308368211389019514311727090114799160111233458181110518886927325494153150458455801368383321159237832190181397017179788788565348034671792474074784951689636545848238112091715561617887192620879235113630727198916655136944495368600608371090443370159079467076296209058342329613809933283306711620704002298838140270847129213918736992399234035900728679054869995037571067012754502573122858410648385207e-01), SC_(8.89372458482467232515984882706268766316392175186312413450500984156418092064222973341734033663013416063605391090026250094816551319611263513570756366575940855133970988017874843537293831076015304335361026846863787886532344841888477575519000815281674674387373130886802697452616125647564031430432280728588072646726366057290517226076579554292387459886530913543780265990513411010099135364163024190628978406074455036483606737916437326240976630201256303072037744603889453782870568782425202552340165074002154219e-01)}},\n                                                              {{SC_(4.75649237632751464843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.57915713053557019712710571041157624420787445280707553767877608145773274376823349750814872550223275249292408134487143378104524868096954725883300351468974464179235940736798953299937073264153740357562860979284897004173565825491677916037847354653853155697330499983418051656375578206854603319061745926619692052275536816848374432279273225818616759602890929640567133790022595885478921907728424755506810023816964299739366390511572287460730643931920759167017258310322725947076324143381556431536551482912904556e-01), SC_(8.88995612890554386936750536483695852513476134588276854940621936209484798254166731221556577381797747107009996077607638797281282169756881823806605504914655485098662478733008167757208013537007605205995390767969085354280041451305854109862952210025061158261775701522354478989910552534967567504369494925409880197034305655329641794883644933639429106847302092581964216122603833735671572473609141321663618765145993837213168005923374608817688486956543652958560596935007260687185222881835947991213367235624530633e-01)}},\n                                                              {{SC_(4.98672366142272949218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.78260008103898513541770539979545252964823085593186147977805482371936090051789194883298976044663165847231099537581272151268640403450342975211569193068993143884689281956002319593954584670463486438521537593822985913643621122287101931914945599854160679995190456369532992685427878582889478807139605978076391142750636244370938945332122662246707951249901241678461593975209892588164366223696745448816630911122129541960760185263002196493023080164412082738356264476994025730867735243022611054082301179912362960e-01), SC_(8.78218289862183938423134673320051739785499965734206019255453944263680156104999722243484431478559982894433211165939525740927677802481620209787987469668196432753183348602917650360351196761705324639570894678343806174504972464616029398441977168964174542305616645585564890203491919072688843982057716214127237367286250524167686496351943954136209482432227787458499924910595283308987464828136067964950498523525151712485885751332694062133562868735135666502557385948862113323459244344865735722400659905954097980e-01)}},\n                                                              {{SC_(5.05683898925781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.84405858017577105986267760267483916585338576749856882759172895626687414023600023273330690992932111166705419294046737645663748536483800337813273369788242501381982115588238995601497093664158009612529499219498997691419631936695751958404275519240089912385757776444311694253366794224413925157246424719597851079869724407808712512352837701427411197808439056422135011271874004431323584925233546760901701318303123610840709380726059202286895071249175118205548698394421602866816959285749061736352965182903328770e-01), SC_(8.74843394395965551309879575006994293780170209819355112069780111612973176064466490116143405110208953320912424509429632141945615508727433835671823209591595840027117758435836418746698473625487160353463202211263804287657238763845717958427514637781076681465849283293563449319792496466343071382848353682561994442500049737084819031517295595081500622131788600851578430131514229865791059536905654539814085000247420280886316611742047606970990845403989012375369636742595073827358323462326594252382348796306577237e-01)}},\n                                                              {{SC_(5.10578632354736328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.88682163339641268740830993903499713333103251236996499716006988777878015736524923456957058032463916399381796036990599132100356276535658883546305343337696754464061676188567185777127466524069532800341427586153710719912664955598618474630711138614946373765273877760472582085430071576921952645961698653272413608503453153197806113172393198844347178330076429745969698136022573102889522545090495121172637471356210616480434202516259895560003549541729134784090264648450886179847814571572888679828103974661136166e-01), SC_(8.72461886407474060714407841408344103310566393107946054900278740601639720374550511441120502252902388979754468889400577378186176037091714805093039021955101337802634805647926475922612749821549415482888476878706213592331467661841014901258491776322643364592301082694865914465905995266182295642416483243655610737136004298484481805105164211720159011364859704660695558074043648664464886946042750820472298682202778339382014672269839699188939702066594156121240103071280379589772983226226437628463900506596443992e-01)}},\n                                                              {{SC_(5.24975538253784179687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.01191837189188332694214140970173583272072418982091171099990217528322355908701601074843574220620926568587427100106185208424141794463468318550749865198918222933452753894983168862879395093972863777587162854161341623838683267634514499273793634809539888243351153777357711863648802112720860674910650236088326557687244625352269331347752591187431084268052625047310691014416304761150712344502076944589767381122718623738029559779248541968413215734845216817629335238040083726559240958493572045375949676422640901e-01), SC_(8.65336201909365476282264952965879813708728978060751127967654913609217370202756737977950828334691199199976926417238532043794926355532947481142954461407252044813719568757784382743516894146761032400992386509481533113010581110801833850543938490300413179047145173264679839208757360189966101065499739619788796308134610685979722462447024950122740160145465326704016943161732826708923981690332630029591524534742203726563441280505345615124076805639821503843825847147963259968095571638786355692009671769162227729e-01)}},\n                                                              {{SC_(5.27489185333251953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.03365401345449383408860333424913780207988550100204590028868870029082008815431504758423586705415291104049317650359215675999850793031199068663273702222642153320423789127546017526321083163725048619710917303499008938706160379552195898338647888596408687619633428569339435377627846917599043895430679468876428984172711517157785079613456068832181981407178101377847554189494406405298668146314781890996229730542960457346820729615088234861697107177030173183731100838582070578677194620296888474892159954565273594e-01), SC_(8.64073650060187094044260451547211688700438767712561600570577794828378726394909204189762941771991578220730402396676955636744871614391751352329593543084586941879928932358923438955814670349084472219097888970353931097795949207204991643980011491931912057515838687636408011057380021854018301724623343646746214428802010107396186526576456932281434816548797579780532292096032569488952258398391121041148784934172900458255768654111061811230940022903378642763134546338073627936701731193377581008095280554682508859e-01)}},\n                                                              {{SC_(5.29143571853637695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.04794223638559654714052859357090717999622260784855409808634989078887486144940014927685708982597532834080469457507632961361574662347134140277434796217695714501665325492161428047990334644102887653883512211880498181056340765678114100867222775547658592234983367280978413240569780775952453371822485892673013027626427801396787248830744260539502204944014104375516044504428492436280713415468738598119114927622247476993647376152875728729101947432829638976206820212333445472631237675433182564095978329615664320e-01), SC_(8.63239707022993597136893322506765820034361346112663538463972414791073370154305164478378003111211836597802305631320518420581136473884404652772091008668276365589888289444996661499277415993805087615581532633652799512767943967396863329599519961592029296231874682822172954305207266939493791501493068017981697650940168348078699710912960970725464127937645010065872291814436415764998136905354545811245853507327765948785155015610075015341632933686909091119377821270677144528894661672118438512863633219124320223e-01)}},\n                                                              {{SC_(5.34517526626586914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.09425923396651827601926822928735155064088252856426082786526190845964204988316925419044872254542709621420571540784006603826411811003448639408384047769534128208911369114785800703498443321159790230667967132978923969686304217145245447891299325303801607122440580539861470662063751394859981212814864251307909808543755875881980444282277876104151040347175759486733148808186549450553664854348136500863053904875153607921232269445247407180353728071225524914373935912046274984168277951004602019741469779806341241e-01), SC_(8.60514513864506892008571077192207221249060554026029914290576312340240258880637028036909369321348861974704776026746365068619441047096898112000033846266863807610452759734582914614646277049293267980030326298443752183971203489738755455196461434851228175258681960086135023742465121275230985955002403734817537433921953870100053610664908725632388126059875337258857523149249629888488047691276578125376557074285503537637244758876151932277452200896536592707368519003989964434924497304420869045947916636586185059e-01)}},\n                                                              {{SC_(5.41940927505493164062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.15799772553089175322429546804626528729984402971095986838191671437559838091400764456186303627799843763884537162041166087814106014538813389286133552707573620685136964249044596156941771605153568829089706663067154626220611610688573741181955647188194844164474728375527074823727245043102213030247601723739382886465900641274005163769190452602531242975852118536822257500909949021778880648088059230266333056383840262532179419129696109838728004168475695024970146221363032255275220888680046617773531409243514538e-01), SC_(8.56709165723223411014335237353370281255069331993132041369453793661319800459427331933541840549977376297771348346737288581359391451133900500291090244022962821184927791851021143294497495159928725343129789287753994061178720219940683024896165695812422117725701849685285221767838000418978261631909106043845565174640775546510270806417747477826212960857379830622034161031711153431645404985440073536073344356127003444050336984235043061917702296234719814367574435512053911951724834398066173178051050112431061131e-01)}},\n                                                              {{SC_(5.70668697357177734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.40194904999217521625501804690859171039067247880710746234208426075198607183471611383408202308291614394771378315161022120939361683341863245328239311080525400231914759172133604894627749585360351572238809861901598552562064229601453100001108907323135635709408318063048590299037584475217997696082682643246277303267205386540634807765892444596945715402510723540439660292036601740905303050564714747573350134003426478908063404417845734148975182487931433252466861406507785899684486691296993422451783426280298401e-01), SC_(8.41539936433730016393560004906422624915938938115325194490676417499454277363257513351717803741102759502698131899495817149812454909175331973883700436174253569027354446001310497645728117157402769598212946681008744824515769796806799794169428154993163962915010793856563617839979899789147308534322116774551895925642603030657985033808960856990336366381026392080924808370232298262132280338670172394908359719237017432710995566031980474531261480441546418187451593636619852940900815738161505085936768543613021562e-01)}},\n                                                              {{SC_(5.72337627410888671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.41598623328850393437633038062021323062155738168341351833436028051969259019802500119843827650904770820919729374704351821359078594634887244323485747368770264507358749265565856367907429518697764687039946840362229092312343189528022703643914914433562134342001022778527431759309937446852858562197449128236170264433346711673981647198294649587638318617209546521551647034779793514294203444340604570797513762817006497651085453358051967836529579122058034836273502520814068448980054745761558457956910656478888369e-01), SC_(8.40637217358530962617166869970573153775954370007516064477940281451417234267504782461385855075871355157179288974185941910150256426691364101853486231269256472771425076245123147503280465557373884684173386719681462663766345749724735744081185615292127240794974750109376937292899249194855048353532646675177599991950894912833572228079283360178968590319455475444665383695538491207634412121327239846638502720531644839511030834497680853242745850920233520996468882127230891627624467473374628176256541247234848953e-01)}},\n                                                              {{SC_(5.80943822860717773437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.48813165155509844192454069897378255222059800318848971214181522712559752371392694439688950488008279295033778330851407407538523566795739799654146239460178355402348023334155625459433534500603056681526233824629667872588475660174360717409290346777163781004021237411856260793132118482661903922892916677044810015653072554145111411250594554349346047088432220346892733029194947849380035748205871877674526988365095539652382297318895709019317770178368606577779278083479508492404153089849803687769215965281310732e-01), SC_(8.35945039911112263677095616391004433124413495567336752167508906438259743069245990282913973214554571969177304385557106963604907643376708364394277256629360667941308687198759712832908130207745510426514303099747739695715739450579154667857648740171678725754478281782329679391568802376848420455165726573253805090116019404447208067037349934527135867262568590898932612843028746601037322593214456836565075844042126797907841397369397266754100931894716926234857663254549747660361282112980225408873527817007427990e-01)}},\n                                                              {{SC_(5.82854509353637695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.50409391298168491596150482570353186473225165074869249579230018842157715680613771764649128192314700378992368535474742002485011421875906957385285657324300726277958078036298364933603213485725269218826700648644800418611737606433714230535321683504247685363594238155126069310747013818822879985570627906886508978408394982831547956257956536544590409045853086713179410800861138484380067373798502293727454801649155059590149624917718627938217373033323795237305120621762948047394416264859542618264254192433551073e-01), SC_(8.34894904745968397122337143288036538697236885805361244093975311074767740052020907304944995451086032530150791095893934644176994383991691599271559032684425891447484026866957350929544470806453316870804998160772266105931932446680136021999620883072198820874483568703347245846148122134149561292328463469229261516928882818387894901878049370770830895114699946795594153739461667478785018799954247645045229378473876480527746725169467194980012963031723208736422455186147677872207396000474362366949139854735598959e-01)}},\n                                                              {{SC_(5.88340520858764648437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.54981328748038594389409222118296493361406722204316601039080045097561746367256420457135064548526427768164560764497538972461049133429788803032011714631332435608878919210217380233636379382769112156998945046969620193348706178392702708810399735183425378496361615421991110404840318568945206401436743158511187018101434033771663853525624649878863128943966755740362299129646209442115612058642089207004232090022736843462658328519333427718454217482740286302870932210190437836952038240934544486327443980179039611e-01), SC_(8.31862804037457555573106159931804242284656404384485071335994653733473005054884858296577229285204654906976630312250918448628259671755231029989458048999183555644405516193443670517849772686240891945946039525999988429248534398424025093271276531490728880513255793488192330389893779683789326076963100529203447817457355637888154612527551686629330928079288557304750909983330349509528372839396456227835571961111453638045659531283279746393377633392525795321762710545335320001100575629727024680780347585595575401e-01)}},\n                                                              {{SC_(5.88480710983276367187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.55097942244132061495531571165679871262724499795417513173083413485055019772427361468552500656487265250806213156009035760042477803381019482502820928713219477595502474314187126251062789023921328177960662028807827415938348104614614375028942563055067804906294650682269671995277955728374031283398921302129002652523268955506602620674798387968196126816730022488639662515652349431661679239799288485652945302886443757790689209020541656411027584022229840977377299248051528161147723320595369228691342415811208773e-01), SC_(8.31784992961720983534359232391305188584063751853626211735857810341353297240324549055333935647771867957433112311280525051166735373970035761464744610858062803351708601490642216194702218471579830292132620536272778346971800827572537398578189594660242145927783320871528142664463408523731435595615813644112256518861511592562839704037855278536568685836654817502765844816585425626008475692953552493348690999667725721103065091643783290643380737951921116821247273152701349225223838419791660101143482872112798004e-01)}},\n                                                              {{SC_(5.92362165451049804687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.58322288253439051744557534267506286885060444861732597553964794301319966217038367928168951903535702321312327402000330303180259309249997384870049569392286402372655538202926605727312480426025714746316833966374166956030639926161547076571832803358539092894342194537261846646241645995470185118744157796984447771024032092880613250533078792521101538396462947988540549649727418090597597042369359700302976217046151525960360893745433255209441737159975029418199167071462611499945258530939279452145306487229413816e-01), SC_(8.29624145284745020516215455724407888077213673743160788252677680220684699002053633204757665277322687553558235918282689862240807444306321340921280927942735138774702365689856787083484164468516551522355741319231716986119476001913931681490030833762017164619862117967111307933862130716575515431340977126892141889221627007181268431489962360421173167336434798315226930647680073783873124528566080722281638117951478967706088693998991575443387902213162302286315711337900394259691186938803878903789406657834635069e-01)}},\n                                                              {{SC_(5.98107814788818359375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.63079775669406341164390113803457426876218890714643705918420902570219293533895083351987901536166942345184372663706747350140651014744113421153546396462631796031006217208526759117477953688062277202759268233614725401418898666007993416469703642358102740447434080477006785791875740627440576182794001744019355766499403487919514669225812073408286318205970784355082471973998831868467854363704446997087804272211009212208588585247986200104642732141375695026387981342821975523123173641969953803066131974996648408e-01), SC_(8.26402544909011658241432585065175399903821756918495896750301886981808712362149771940549292790542650045147545087131705570423534902313068039653779493898450768666898915232115053623498506902881479053281044503339148499487375815668198415204385288141684801981955764702648853853788870503645633524763713779262558003952462666882738272366662792158419831973039867973436791725975558771042770624392035686827655124184929447826740277132618212118727354263466185605275377022580858818482725012031583671742511286356968707e-01)}},\n                                                              {{SC_(6.06312751770019531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.69841326954622286372776223794751375442564387527024987387600763171257473846563231383256042951126744237939173335621133174126564140203783722168940160693903369738874220238990420957962570709306595253925042184973848951481282707435821990405340612615847714760791702548764815132941836944307996329168183043964971707047310773157459458933734373488265390996753682505088988425040804909331792833393036337801209481443096681293307113983919326697774171463311972401915096644602844245006893698721334381447170355033646130e-01), SC_(8.21754745708593558893877997210453421259931832482362161541788802678473040052084610746608123448789164569464037819997816728512707321503932270814997135283224942751431111955279774528079707816282945989997447671912075562165513682745655357171785464101630243159881468499507267100858619865385365378153126523299388132186668506319523531631609433771914896664530437720612542897542396620962675976882751729608935582973299418407696895956465945687660264361883010261463103102557157947538917975921761520492381028453930485e-01)}},\n                                                              {{SC_(6.13096714019775390625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.75402924758358231334650295925458267187997174384331476102790740464035059881669019648945917495330357832199117443396061757906648148143864565486655997217444390326266423656372581729412495134230605632775775658476278080199106041530764431654018917606633061332458253725936672170985855414138958779244233609811429392906129724813200490019305469102882138282187987758848707647084287856167057475384628960636610699989646566839615230658291641180186325980960769949839830931757500819770067681359981531260310739391528533e-01), SC_(8.17870083925024815995359911687699926394910179663053145399361592982175638714351229731592822367031107979190069836208751007928500526343506812250399499321292994038539333622880839450312630804560038815300432575283087889439566134289676657146439855404820384685674238529876396699346001212546362146669165127918149018730694797820327381382869648762338833184522726914408835689355455865656334360248829227226282107950259754120637101606226726958719637090515583876970735442819938536217801085805639066391598625734381401e-01)}},\n                                                              {{SC_(6.18999719619750976562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.80220763340469067252319354348809525508566786663639706547474531609835093810520638777589378050103692705699084463851477753313324811311532142563670009162918655521549754866820982915345992530355351938172236029963335866781105855187839277567473661203089423531017328580776713279646844758775417526897324987212907470655814963274474648397065129785999643316638914124658962640072449392408594369804885547288085537425585383679063570894092676237315239702551170852776102535717628402664327422929792503986746762679984372e-01), SC_(8.14459247469511753057400936713432968553335008699570079517618820900093799983757685955255000345600952230461680637343901677229590811516546365848604073614715769779803264305390559219038249596549722583488785915653953746125687426557192475272851289635121215421678870884842323812552055139391315679645514791432234634867654564749569105902510236521494312939601544245500760676880839934466297825827186225790770259383958886091365471907625416746368992933084207679548025720343035493993024080822460847793935966129878775e-01)}},\n                                                              {{SC_(6.32641792297363281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.91277340467781572501372257135126124830312635097266844526637989610697084071956468123140510670966119034398211587971327145083152065850053928352251643344115891560584207422020080491324364553802811726723984253955887539864120462372467968010685410707352060877347028135620212231883891826722468377361823617389583423755792541719634023245230960594991594343071526963547302594773264903765030123757196797987522666861964544622436149688806334825780946673830774577772569410218147060834770459214518300816091633699325159e-01), SC_(8.06468292401720597243607373643076850834340099346187496135107605436527121943597944556982323079565414212179242634055279668924865287777492580167307947076770033365812533884726110826320880591592785941005328200888816051713221955488838557889813329320366811437654737145172121579310229169878585583506116077567673630546054503550524440060601659762352169904975997908131574019740393377568381882944867982968248139190044503341642391989065718049393007583854820241850044293966116050194422903385301862216349966179580820e-01)}},\n                                                              {{SC_(6.33131504058837890625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.91672206560683861698540323502801662910962736425356518288149873999685630240964750179568794247108357160690946288481169713940570547424947615546778155106801267043363321492217167599527333952918788752215773564356918443371916686724984099928777803084887684542012414845624911080183652414153605252840275567461856370803877535932898839635003969989430608143290403589515438067716518748385434785173915278527980007671148142994730359776314173753830353587565828451836432010916756952104014001139911897290974597936505947e-01), SC_(8.06178640242726505993242967926694062895717233265734674638169215030194480752243897660577492537544366232156759749837560312908253286224387082540538400275543585442286943985552382663607758918581064299617916349453746809306887843201069591375384341794492842128432850981297373891467581358275207844126709085873133207125511792634497429296621277890733121173684425000350842660734392317571807218231702881414377327633225177841877645449690103409480881383280862010633511049174847649468719070167967064564429876144436423e-01)}},\n                                                              {{SC_(6.34747505187988281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.92974219022706010108992855867183734966583628307882658321095701243900911417197558520889489349140573836663955174824380113169379533261839946161834656524007580200253067087554456971500650127473047120600495452949972788383451786221139777272831295410107709155445038220377172969485227970155197636388634511381949187072449999444268403796704613250710106085854068057822684526341487684193917169435620792297081433473836123012367408071501519994617388901764025552905992036717787425425258583171549106370962485524713660e-01), SC_(8.05221445053726746419815971651888518671645149916391855552948789936704566336934637270876559849890401158717510479582527189926061647034445841426220869339477187180352878239905783188709671871951560328539881083404045467288507567247387366383779542043359249431790499020266939594575410939230015987101843244838403909034273579593668568094414648076559519075205679025774159395184845727898759689983721106347949365458892435974166757049922971026861665764014954983365451676686431477740484946958024140265760598858990745e-01)}},\n                                                              {{SC_(6.58116579055786132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.11627877491971613071587044772912068167383316357396771437061427662844502897427620466609259658621123319126645682492753359863400100008935248827153601001426080169982697412239718329624276398900680993889862668591190467393604988686920649867296487377076766197467386553383366994250727747880545993652542366387060248701021839633518153831885758282009991740386520264990613788985281594829350408970333117550653195156920397388678526234922066237547328598780847807509003389905942436432182574100702994762454278779126657e-01), SC_(7.91145586775699434706682325152449132619505292885241407040398261444638165675241801795441015121394868129782183647525514379878310240059764779307080503506048518850465060777594888337287672252521112896981531471145120562580244467829046974149957705801022065945453350900334077892966242546656406133204748800658419775649709440059128375286344767464588124626908555642921898233852706827999777042876474714967504251148166304922393615026590743022270142067866633081636388432547812265438968963733102573956969507972985056e-01)}},\n                                                              {{SC_(6.68379306793212890625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.19714837588306842543058718138740246054926714910382239485238502970856970097538661113589982165067187132619066720539640268281160439445562932670528298393556312197693972629332318849922700175319101493247268865659591171932951208250809708474317514861424683826798638953226526386055915255029526789214936438984393136364358891272530680010418976217414151997197701807740467294311501247213013330492290365626594001647614860954112844174704251515352162101891298939671842185917196856654362819933010462684597327427126850e-01), SC_(7.84827063799980379211779203074982361728059891779214152842305280398556004966511746571802372837688959219310907474890329036726089422113991718114500383303663007778344198446438007989934781619010896796633674747003624402106368817595803358545678907629281002244851037896204259330272863561367660123874616721196035359424902912316359766328561961112087692177004024520170858826342186686483560937099248883139544325049777616232022358653962294978208855164667855551374367419008803669675437191041878513041619215093977207e-01)}},\n                                                              {{SC_(6.84049129486083984375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.31936353372929666377534172858021669016330116548927716436870689842767426969839532417161302597045406330054939921641169232029932391615578373403572026279946125317776120510795978090743324577846359989163695367113214738203419801342136118452677670008707025764333970967546198963531058683258802446493328460499592380459692702978891403432765465115433277962954729226399518070155783579346510048953263158414792673476160659020329400278821557190918419587562973276289817258986258653326467450495799750000672275655561574e-01), SC_(7.75020287015587588914578411771195074192222224624281637676262362599907293785961779059986129977211025177830784348442168786682183450667953136365155001785832551965132555642589664593887400121769662552071171946634504133253856348488980396076654712434606013146460571880041761226638371907081882080141542409394003245437988920143100898825137908543687996968163501342562315851663970885479616359018385950082689104218686603061204210645171977533827915317644911647373597167897649132335989478522271207287702127764972518e-01)}},\n                                                              {{SC_(6.86983585357666015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.34207892130906185138217995521070060980771134595814223028401424268550028414802642147887935516716437745780743991663524914640101336980226910760315195318804657377246841453310597941350572874724965315733117460066200156678788109903386746756862845060984064517563908979315608178603088957964531685560982456412273287353648076897631728915407427856053044019768395890995445141933769258230908993320288843265454369317690853165669480148178407097303779349415564481663937376368058473755523881122097622561160134717532533e-01), SC_(7.73162563474766841048483415887815113128270668467243021121425122543440004967601932517340170925412923140648469189427391493032322424298025129846960002538396012061927491269154650119691626990617439396114342524616971770389759352447109606952151184472001811010660213708603024649577978842970502993544673075017954455152924365371723225635025754836264482382777266251590714034776765873194178131181718759634161918136432931648140234489835301481526824895759034614583345030384106065853342198571446960029902288705166826e-01)}},\n                                                              {{SC_(6.94284915924072265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.39836052877330415849557324484442485246960415097675587817729130947796598088679398211918418430782716761499904608212690457611529828373751516280960985062072450410659960845465774665370459640245023079149008857282599337994588698772961300102932470670455964033692741822804798894372704901582184812003971294366565124048223850858405484483918946765658340154449257921292765659570238517273545585244602216656601192100295568929395484656008714082018969371732663016880302660592574145128291454881820236795996282547497677e-01), SC_(7.68511434813014370464071069339832221311083583138535155987163342906384134901657393354802549369389890372582861852791541558171094773595275468892230556500115368424467831259833594084903054252311484213541678484269411902594249145222403876708128400697928924522816288182254355192372916075954493920965124086228091558841373752049897442849725930050350651938100137683579995803849252482883931876266606935457585636549131596716992112380751040967416114021919373289953352841490346808526597399414353552864896082644783968e-01)}},\n                                                              {{SC_(7.04085826873779296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.47337314034375267311253727881438908324914118655596903539009237679025823609807063414519572776218793579216891876342705736585205189677473150287545285885407465163607235072015934997648155039523284701130740438070319174804288419720689962870453835500841745307067839463534671761104917869376632808602691603261461941161338330182919616033742212613058331738146514456978322077962906477328825044854350200058603333916688049190257182038575346210285536253744404448592449041637901255073270427164340439531631907267607749e-01), SC_(7.62203648547263658124556003919108631375059729455752347315416115221615289769809363766341996100406708571842804474615990281624544657474722340968058460824215775408209176056732637981834602157220055699450856816394920036523737063558780069515171775820548685613535497845720729171156701201157483359755580485996949045344633845078270826538922382725667656783623857614425595386019791584646719482830027977561461206521773127678313382573998766556014080907045322829632444997663307108065388896464215295338370168272490364e-01)}},\n                                                              {{SC_(7.09933280944824218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.51783172382929841429151101014983203627578328333573592510980632952108143767795039762068083754176504537476052511691864448014303053397482545651822053832287705058499414996079783090399120862253899390521463138924593245394562793681032248632866266766895509930032123199410475544972713589449479893108999097158598859942660268342636814309052963446861245270616519908709276995009050713056849385235425190399279180745720917292866069759567084841827333335964523406079209272268782749630319370918462231083124713647708027e-01), SC_(7.58405364035911841501543520471024032415280607540389078760632519463303840329020571045544960761585578507657880881719158444633178745177097217632381274410178922552576393958541137449644629859679438925409830143968442835575512375287556654397959631087638498982572638282648212386560157945725763904932732228614132924703510889158885743657357850286206983294111169997088528262884477065796101760395290581798087463364077999452179153508035671219845061724275612416469431248397257676448236556699979541960793793234354297e-01)}},\n                                                              {{SC_(7.12137937545776367187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.53453610421558887191770037954012677520047542608253781911414475633135762082648944605151127271372005391447599439490226146358614114988444338767607370529972443432762056723355412014818413359758533894010829816380996931409136716572396990538773275750459085751647799299686743029739389324120791907775424334541966372901562358441229790779983815872877577111708548355032397661700832814240256454741065353652618317355244351437327924856434997949990497272086397007826557763113495785992334434996013212106563351821012639e-01), SC_(7.56966564008628816064935109195378426911911472438595933112354357748505074207024354053911829385588364448207071677852917245130645012968655730226513657764473316710014319131523151887741595944009634322876870833038475238389767311902965604104789419520464629484339752652742222247350707958785496125375295437037990398818672449792045553554805101541785038921513194543317116169605636216403146997656048107702306109440921721516258305004378318430714899908536008728011634964756998246216104383496283612208246712707809890e-01)}},\n                                                              {{SC_(7.28063344955444335937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.65425239549281551387975096958780375858851892612581018364517691550986625053067200927521434055711311934858303843505620795647699094991167962072952782940273782031412754829044154523685627551088516306144183410064210956927323855949328679639013060157012524469106990066776143600831038975143469374685791501211129515334810687858924199124184919832544720039523738772834549979678896244138923880641120598453180075472233453229563256798121518710091633983273444804638251096554147694798885058914196854535864381045701914e-01), SC_(7.46464500542913469550304482427483604981998295473097001834850867024888391361681154549551085476420379252215393733043723887519290343750467446615492574133174914266424284911131646002469252866740075071221424899571812395871594617919523849326962762794240599720695713605778048623064419305383185861913597186339664175665315128235844322682700305036708590451177189730578210863235483538381358838871934839801769986818109659779590737181465381969746699020808152545779451579969426999507214595377575535319512818498620621e-01)}},\n                                                              {{SC_(7.31353282928466796875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.67877455849328415313685511252407361475290664944847974694748374470430525820546311711633036068027917655119375109669456363780879204022992271472046839476884364877059886387610485425570541910060468422158698050147164337450261912118083547208431050535457571356039548539993621937778735874494935537604478209586817246415426357876117341987602497257974902619453111772426625634362317200865655014604545340689911403283456936384775676107431194675840774229025714882598541659398348276336357516196404102890789080014278310e-01), SC_(7.44271256981101194346209628134504606702099618005331278155702255569736794611306017252420167649556829316737944208883220062940525982827062319833178706198085721874692819642620284994022263051778498810953118700480764998742939090561601606284588646002048877898161498445470978169991315741359253391616577330147012226863384211221768778133768652882840183361127105099183092604737447476797351760900482923533200976293883182732697626771002910636171758241902951875407238841238780899997688911332446119841029304425479636e-01)}},\n                                                              {{SC_(7.34646558761596679687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.70324920178083436441069471678009876567531608055824879276071736344347039103770036213432254310241283901574175309710833116509980678094724076935940860412925232677469144438445914009770303026253831951547428328761003164748593055572657816784981748333393830149829036752582048673452037841744030077018127966629362072622320459806895246918774521500257936723572715328716560257228806009962495784185008529474473181791809299845667764302386566655812206124328554962989512463916225593807471830263098536186790040787445839e-01), SC_(7.42067720217128208561458295260588188538883703614529506403332866542499686401570844168065379119686678412121172275197281466837025752106843152727749804130330019398565607006458973651927655708121078756327411774608433581084836662172963084466807457891491110306028947765023619026441420363688723939400112648843886687616294780578466440795163986186190618677996846555348224767261142760875403983928512707788875476531712495126954048108942578212434188855740383855884084742323564540464861291379994368969288540451950217e-01)}},\n                                                              {{SC_(7.35883474349975585937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.71242282289650784432824894888486151838207425243821064872578816539245485349169907081030400639140122480003746277774671981965140905966502055045096267484016861019863714535857263392580875083896637853022773890639463141139601546619280185776793076302947369731239294025987092087696578758868930952282914246773195675160183965633100755161279046846470580227563479309239991478236819173709358267985579481202693451305809572478116921859856167569426408004912947211637308584527298655605280783744732163905380489214924919e-01), SC_(7.41238017418548742413842257768684553615834706641899661393734845623817313321543239084972374770481917354445618824230060053347683515049801885699977994522189688560444826046327608254570779006944178830055126966799122232990289767677705366215827296184520130230453169104436487644749130788789590578134797523361818202371818815713878405573658388136437453814494911814556871777282812555049415325042882677170454923162907543967764711047796723580024692887761925274834178826463996678615559173056991061779677528918102368e-01)}},\n                                                              {{SC_(7.47545957565307617187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.79841113768607340695944112185623754809736842484299646727916304809581417691228956969140207251779386697691577741546714860663854566118219588035062264502499883762054739905424569936729908546433662571248273931646831354089850605147738721655208493575116647047591590318581469421315162634504195730838974528986962257992624940001258430180986204021942332453689279121755873712801504797017002558955812865200707831055953451811123671205439221790845442267042379316447624253844858919397067431005597259087018747582178424e-01), SC_(7.33359434404344109336395962586828145328170625700473318543788063807067543247262286190805164830755305055267618419943813198649946951834556772016494519206476727461835185579311139486423232373044374013136769637717868251379282837922690752383578796965266903327115596677790452452974648347092046946474286910607295726282964624682284028852420742519914706578260046372907466723896662431770421690941601880002968886771614517398489952077636798547497165680848712519474408905758365283290126582236138958173021236321161885e-01)}},\n                                                              {{SC_(7.55493879318237304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.85648263319370343052834907809005875626191651889287119446755435146659758692147853953563788614131230147518332897413407029130680747659427336204146141672902830333767903465293143774579343702237822978154183397763786037274035612370601549591566046393421688340945541811271244446471992893685816844422290107339474582031600707672053506093570991627232277511247616242319229764885571613405065990151195420213966833530643133441081048453151568306471387731353145348084761549276605935431818127669747470731171948853979945e-01), SC_(7.27933004477150623008809972442600651954692477743538333356621001503195937504667719700541942845670031454624830343728389907907347912403665447373766506340758222717919268080026986771138260024517905388101442952981872598882504479570588596424852623521866672390156090453185231458894061499369931924249576747238446542346316663662331729519738390267757834504744290361928534954604379267936758410254241823802609817231482104502777287124391370444319867894433306323868979969521772048460043626033860564960537038095938656e-01)}},\n                                                              {{SC_(7.58935451507568359375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.88149431809074292039011479636345409272821159878239199063155901100467548853254258110502008140002376113188676528706129709315448525290898431272202561536901596271344648580137727722677193046008709171376549247548169720757097475212932378765873167576807240071876899865667566027161620638408264083007728986171521870542890063333655118712811809103286225117916161550631677504773924185458526354318750799710662777478042439728309044909159664046364148985809812258610769136628334650773734441115032126818377546249320163e-01), SC_(7.25568990173124895338125876594655020996196799336506719347548207108773241573013361988843912380042967173319980848965347758554096264013024360802944654983722000331612085095493975827321189492026812256223514482673900792147489176478762598983238564011300475061164502341735461598546965603251492600505243119182301013494029540587474258886399189520179110749622455444080841081454890362686228212962087454598613627230870475322625762519069603723940374929932243553431361246951367793348636809564558449766920116867744525e-01)}},\n                                                              {{SC_(7.91057109832763671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.11096917179776834302812515833728935272468647127939295351299971149188833687056624942448454512139136992529960373902017326874914774749603887673330321423898880605971457130146157359406951110300162856514767402201313562337065970349644312236506562094236677034639384877728912352270003473603967918428645637947206690444105732593825279836711281992638418344858231107764502007142454975430695021477350271536707626622731305396784131486382334375539297869210070416933438023276579520520390765443097807298713622715115891e-01), SC_(7.03094001096167514247452987566287284250780249387962704875473628545617541774686956469062454651828607591249279271245274397135059565688145447752251614500578532608639894834789582982265370817785925338408376851087909205953300730678570975044663837957505742441580929432734796231676920571015992517126640510826168319087313544058187812809896079863947088018101287123002496421080180476087162715986713471824224540590420685566491565864250397615116860667256579933004489120091376491629218063464801507664268777067724241e-01)}},\n                                                              {{SC_(7.96196222305297851562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.14700790241734210718720054373475547331770418031912502525123458538003032746062328257741114689875158887248192521669534885392619195512740041442251588903822310441251190280244808295176115039576094740370089122366345937461478223639891454003139173543796840935464808976223093898587054390970330087960689894004259716945839339645236791663447552549659390532864608528110443354882079183588236749335885717305759587003809538258581826336560351673467159629498055049188564719726195933822175304136939283243967908242494550e-01), SC_(6.99430325642119007199077599804338282359678696992845283199385067785523316357497003279755601846574384248393159269985358143471633926612287125404225155548044445499184262453697237728665071432512161845503412031823157453310693426644414151689312780774754757744034146765706240859362206302826721474463009388112171549014346332567224941063583183938496276118915668883695302262651276382992275711085438741067375802053372839441984732848254301369814425503989712195275586467060144295441465488922768796892003329447608649e-01)}},\n                                                              {{SC_(8.20322275161743164062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.31365654704142739846905019584696358036047306428180059429371468748059482991110982535801827867051266821311376439714397817455993576620879096008137068230869436717130513368495882562650856370559340685959779025910012852712707473599834793447097591460733637138441028399795427998853135945798003850175043219913393539806928792759611776050133706181971114194824150248235517135756254418435225438771834830422404958975726823719539265915396582983003903333187901189190376044100155608302909472752013179273050165726134671e-01), SC_(6.81985541722975717095534445767819481908864976076961739056180221697736132141265585566999326647245602003551277294117508416627907538030876733016883885497005656713622185232867964646776021117768267034928283519921750560161271484197621123938042103057877171133153181306536200901947837955079582005567762647046471690332827928980954613232524604877387625737395340351244820721198289997787185454105134445968462217536369610202581676650929417732788588715743220458135214003687206783391270487189498386364945123860360356e-01)}},\n                                                              {{SC_(8.20823192596435546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.31707181381410700775852413944623256358279362863429082318176094644074345198934818511604497924306255057761372148290611474872724768056233841633053057759269625564484451756172360890862732976965251435126007770329830159323039601468508914547084883261046412490538012690073602709905862777673769760539824714203891758844099506177024515786538294725856183082907027976942601097128886158840072184464238575694374237570771730277620705978363177030311651969394642265696664888395046181793221822925825553797830022216861812e-01), SC_(6.81619102369403480554305225830589669749496286393568170235405441280278381355502071404131720011170133029142899451867504224912313601433029599167624590909710073729960213379239331488260793038841494500357027141640185106376120026704091104273895547141376917874461252188333037699289790582218493452933614232800683564196166644334061074582102278060215612103232488660156166325779181387963741004387571863137929241835769518810981154518776634995901657416266901576969346164884723744461577404233270130572283559282001269e-01)}},\n                                                              {{SC_(8.20830821990966796875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.31712381701167181235940405073972015213017639680082667356112029205671139034521852374354906548574117997188054771119114790417352101300580820315150401962599864229711663045499725615624769701732815805881838686006938070145575222297658526345767913189362679305898973467899416346980968752255458435026841646196804679932576337820885098573186877489399993520726005939470747793237899520526853009339508138223853067623106893392596935713790281374384104322060460403415407546619022310768214665068143293181570925173506030e-01), SC_(6.81613519866797700233561078830285348868909728015824467996873436863083948946792713662365645207291667275891590707518243675662095426503292274413226380893079787669115620493220926707096054723242308983595288942728615386528125187163599085233693989737313878754308845546547871603235046915011224509231019712012001921675566002620394997684099906522793791517970792998530561520243658709327233522695971109704887254996024093751518624146215852953903992457981183041783974253387011361571840065767392160436127405910006494e-01)}},\n                                                              {{SC_(8.24585437774658203125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.34266415048580601601171614328189945485523348339167684552882817358872463794947236136970813327323639342718055615553899792751868468349220589184493975245756465487196821811241807511777442736289719722639891858859935335651084759033715948897509352669673287794523647621937969176476233408092160097961004199695909264152719287052279829589065558997590492898837638209347034503953069034794972138475844603380815379547139569854568998577295466205187088165937309792617517840630419328308859176681506271893863528789248027e-01), SC_(6.78861423069322423142287792579947877264054945218311760117309756513802596452752265941644672458371639416650177013219274176072434763072510338862834134080437379766218972620884833863128184168443684900967637836984797742269511801017789421153124594757787251028286436667001509092732247658107436228355788096082272539774666132684178084465292359871687041227303291674144130444761955366487836773097705032915931079300488532047764679474318554807323227573756378123678236220609152577882604414124351048800037673338910072e-01)}},\n                                                              {{SC_(8.42336177825927734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.46200398377393459649680826081175427868749016777479391656946615357401168769244488163885501440054564764625884632208092536154327477843944291217071640186792695307439200754180218113370133302122271947648219228033925537331803886856486078614193043394452297264214446820642087443784861194790324615980733184632898468451644948907519394191384802169154937632223335637190099490677170800235666162943855162453645700761176168292376053760435303585758309036258034104340588553649940846104238991034056185825466741067882072e-01), SC_(6.65721387264536737199053622485047036959155178470601890364581116448749188037417941827507890537685995449185191055999932249913339748939836149314270084339122677529396816057499007557737481859203418779490782222223935147785268990135438875913775527887167257753754804880001533585490387945085868364708189831954961379748257097179336872008456812624559823103794451262576155877557164818892518890148246723174790434123610728214709486034014405859537649796728092585200795147670242992510582392423063209695060045435639049e-01)}},\n                                                              {{SC_(8.51732254028320312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.52422535846828634329763573162467783775835226181279002075499246862952798511615086223852170067031422097672291727362551514602515232858650334266117329374278299553738913137263989569552544670658051509333142548737955765721640897185016235302271826229961834507496959699946522065996334471687240277709484606165787709519654824887215013969427685512023892851687430587576049452204426229183023498749375591705872255297982552737172334378319347460973591687233240652609574815157682893428262843430032255662299652114089879e-01), SC_(6.58680747820845207658025673099654398208410800146063243277102180468596975359125822183693199476973064425685212001483520724112988866317082004563755687487431948863912142895176713746527538414153195153195902886992468372105263034943619928953111637060748803014031715925157205650185348194095196433146735511127968345957898334184182275252020868195423853786179773905957452209444524740405316126300170571443431668967442839329584782366429851699443487772336859741150158436052721645009323345331192414931319025563193732e-01)}},\n                                                              {{SC_(8.53235483169555664062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.53411833445184158836140163572064590294752166376711614137854911687483379705773538984310687352928737777394594541765815710911439334046554940997735934546678121569321606032983208295786707007964249587180529897328468589036869105558173786011112106628817264554495698575451649354701607098355116981968314044614012968784188544167980927924327829203173902544581781617093304811705073341251715042320605762563751570423820183200736572716105436344306462925279390306546438823958050135189736037104122213194340265159200889e-01), SC_(6.57548940554819907573257528419300834282085959566971485261554488964967201945618235849231884529358874985523899727532768461452843522892545956567443976145556104320240537755297697336571583884606812992554738345823881726286988930443989691129940518355496639636521178039189177831792417756204567633195849709348605779519669211602867459041809898937701383112387501471360860974137298579481666185065773825441102462503880766351019703882097283156754140486193325603364399157977161246057275078823715656758124740769286135e-01)}},\n                                                              {{SC_(8.60631942749023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.58254714672202734054245631300777236683159096097036356652865208302350109743073684152410962467600654933745740571894780398991815718735737674465828290725494858194989836534553160399551271476918168363229478652799066322950631488733954033725999111904414202705936578537002784526606704859598219316245631357166193113310254529311587598217265788825906764456617882297267525625811076294767454761426589134159107671204802876644719093564206549129870218372256457669807937656025972129347553750818546756113960841751027002e-01), SC_(6.51958424807423145724681352366893044913213138350124776252984208258289594390333618059154128345089870962156493775277533940863780236374174323722886635230257339343144735789204877774178934520266472338942566719658189212879424410842064912899039411532389426668819500380572357870722896319650296336689216304697183340394099481481510010815179251484525103064808750250346301956674840478464617935466799014788108180458727627901714888446114618457583761783239371051182986228026484951181476347027474567524391889783918188e-01)}},\n                                                              {{SC_(8.71434926986694335937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.65253428839936597894596123688310569090389685861623807747906998309584979498111611756491021760688758158177280261057414612992774369589196951533402853137262845408946611167107061628964817744786033131644642061511740789926408393663344035662239704331526547276660565514311115240209165188348550085117827815853949524900086802577414033834083707418722164713516489527969642212160278115195142344168107122012981297994117386544179420772588506796664759651956790125837907264670178332084628624287193563546028447376088112e-01), SC_(6.43729127544124799494617385424141789231958756626700658813041071428586618072421618554123624352683471102337219690582915815457570760436788158308993420812005608224926825196281977060682929608339080881610829922835036163838266204844465833776530324738412004194818792577411893967126443956831812385983415880848530409188330707192180880606478355189200581927593129330039998521115777958744436380095343335367391348225109459340647897714560715485246371205710624833126032500096010272581171199733945341054993950174852275e-01)}},\n                                                              {{SC_(8.77896070480346679687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.69396652942502806680163137716408274193626505179261027990589455104514099654445891686820536957953425257143644049015207376709302919117653628962899300992652165756263697434031175190503438476983170969534318764637916846678576909260931266642525950222240920446950471376533409258600518379609175823729377664566681171424703748226617477150106440828466552604008804711774039970531971579418161768254301575392735582891812001284274165621905938490443628338710303566279299515235154679302470794188934092169362981251949139e-01), SC_(6.38771313101076798184916637234037591631630476518693506025388154191480127015986530208615984654102066160223638744973935483082365448593055470002327507056651767849014396832146717236805375433305757070883314307096701064579347870155982807280470443786167533770758312379604707343782359552342226011090633160077523578145167810262263830014035520208938934257324947353709830917635397437518132188605070760628344358879794443634580776390332446040995026564847535658561531518738815456137767206748819904544534640439838368e-01)}},\n                                                              {{SC_(8.77901554107666015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.69400155714758174751463956320581356413411030184997329885336980347356484417649575163611155974682960990074706177152082869084220135289675660713031854544651588961152487309343341711683624026191125452489208799790205351785787809081119847466237333627648354936014479460242198409063587836547650641254553229247595634761404167667528762434341974636313629726961805413262922094769725972157142384658932879933860014161454297080776720852052747460337256898405341811175351699528039330897784979131765307939727592470639742e-01), SC_(6.38767094006967357656721511247182362249968335273513367163289737234015746407858671691537030222365046724074960371995585209481034408116108478891455599216861380391587550923462076145935873889833750036290480159091501120762411644650573651648384896795839250531931008594162378543229267022201252857767447467217098240469413303271704255149771366309687473842534080354893076656855938206360596197074473714118186747774946181365116197433273399245150535866789495922270957506694650891577421983522076341204063582668149071e-01)}},\n                                                              {{SC_(8.89235734939575195312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.76590483008918075828123704043379132878468331801967725591605673654298358001840206326684419987926629893734512865726422938146342620014396972255648966508116762790571194859893171810810344158133433256238149661062529161655687364822434788153154601343256287361124721577752182527927513604966699736996393440773466561767934321328287581238024121937064696839131096415250977881879528957788874895432846673943989658776895612535263832944224934599638742571023523788882394130859758332145929080625534666910077534518151665e-01), SC_(6.30005731481845588273036576846426690914673384479600856701742059324050612829369196434797628379175419804925394509968380629103231661724961641777260194329213816053275791498400614982137324243094565751574074781317228207243051532251035366786012453342678640581014349843567477661892513532630021150492274687780375569033734871201459611566752431721742424256015626449576318661533280124185966359039977200045726794752617623916091606371771736962437251873603911510569433817985133372013360763397076481029831695401715002e-01)}},\n                                                              {{SC_(8.91755342483520507812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.78175383462325163583674655043042202728281242225366935117157325225181476656067514837038925992809175658530368266776381307490548251307103630774046387484632672266242289311664765547821562848972071577684296851290420415760629271943958285077554346928275950835563328463912933949018430611596894649981846914368661843356689295600898585202254923488212519552327802028131150621466419842782435111397756440608545404660325234025515092577789467351085455750696722955121922226534931082782879468607373923807792631205949763e-01), SC_(6.28047030542508964660984155843210515427976913195341299397416880066259097497362083346900049795444015853644951521277472704361379055931891605371832291636618616517177726378221958317024446964676152999346744441923607521882244531629771088311460630752446686692856778162970446447509534204791120267039919827654922453565156209163873599425863243716981444860656074593325137604592825588655286932687854692292092466450735118048208393976096856497466171234771756357427282306123858046816566008416672777532403900088297464e-01)}},\n                                                              {{SC_(9.24067020416259765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.98058916312735347801439586114492791247504356700035350372617300035491325642498738425410757498463680839749405041855752082386106968476536443619420502774520054342166910929880836624789313581722880090984918986108537736057001903701343412875769073471137982084510071548308674144125832580017798601321260141766392193897611981849608390621570191349383770802898779074210023525381294056774082554327936599442711681328763257690606803631608191012883656486022173621194670860849528550383855769646670248938050891350939424e-01), SC_(6.02579427207519654945448773493218643267792147248371754581363473609795758074173708675888611453910760118715338469247983915920902988424878326449772922846334087438143568846425397712506600724800259903626436144750040497543988786284363660844256167811788822919038705711937971087151329191225800553441192050916599960240802588789035166708012627077407281815309268388481235738834736964636229043914244433488779816191329214444784311750898666557245872423964610573173614007380193002623880636557775872455442732077202276e-01)}},\n                                                              {{SC_(9.48538780212402343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(8.12564669864108740704526484207757833147196145725851301659425236068573275909234403133443871501638477787527174514236271369871077558250470471388812341752831884260599506119037378762442877644976065538329194428099200524865474042001514134742196903704060954707513545904884464229614830486230226988888294221877802021182915074325369718722295726897572934557026431305430687003882383920835240558050143374898263910116302593489183653819757258655043164740050711216449209244822863602113590113477874407887852238592732150e-01), SC_(5.82871046877979668715013686472506038570335511014029685667146599013044671091360805600736750567377723257295386279133021341229729624564952052341881681745532136732380301253980032056794607614053910168194823631388805229025653111289051579838992739177878645806958792467024000124031374521011702353300856519556067014730143575223461653982478513321149281707480959361188721812110134045643590586089099302264567372058785685184102186595081293450343022216284635973331409511742034734523393411078859037050754025652927233e-01)}},\n                                                              {{SC_(9.59645032882690429687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(8.18987935959352073875614350221457438487323685041914389690448592513530220519239651037978269508161267490945154670166534406063138841144746365313742048742546862828773094010795667607517794334441680608184241612401077775499508697509903758691830768580413170834939208002045427587221365787355404791692261389870945221206227169987866104028291835384398330045112454088191868853133231019091108422846986286460028278842813913496964587302041301009065202916611122849688878484886520224028920980574386384102219209722855994e-01), SC_(5.73810736003641035253230826727130176962684890290455248696750116766827303422983360120185965011205954543173332229412154060647120027510300901757548306117034351503130130202085092968416847247811715273727937511806279023862537563748813367037827626060355844175390548989122146048668943889392616278176867772582425831898960286338108240256596607770829334879298832455356563498708453483619048063771908372595407532180041349800539325399287092471638125266915313546537055155682234714560615363056319665309958777686371598e-01)}},\n                                                              {{SC_(9.65941429138183593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(8.22584617683364992207229334003659891480399795460992886887186049774917024807741696479772302621685034469544288146545476789343680790813545029298766875601266418608150059915090250070496220181822089491578848816421876519641947266567872130828556654782426700108153109976120084697153230120698732412766844108655477561974029439822155046861812169807144463116359326576613037164120983818549053652688252257188181444212785010666711648974487686167965608784209332436955384462327442388935187075011633997680936530506621554e-01), SC_(5.68642723290039340463788908562022024375903444433579040809686968815987000773842985996083775322299516895433513241758088005769979020979884462820837775199929822542884367476097461845417648807912438092370123891315698660843301159976154405357298789332468698532196213669597486274889313498220406935743400370789951032049095520369775978550650161707155538699612971113574623040689344171208145873292268193066088579319566948787164894940602613163719118941837781698170157843766742315044243719982001719645953102362474957e-01)}},\n                                                              {{SC_(9.69469547271728515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(8.24585732620709848369504663267842802945713140931526055303694584350216444781433131159335710298075509928061921295637330893161700738598008958933088727135651320082618894171378062680988313516773413479819875937871239017735048917366136188501496487009707095259269151030532083054070871581776644960270094028919341405032530725113303670443168536633275168354421263536701825456258624838606154540730225508037857427911887076941147694286382203323300676505455315912478482796722391610090650659648499187906577186157737056e-01), SC_(5.65737014484970044778411229540371735847367473436622430603910050048311316724172043446931327368976907852993925629246318655379949415439703717508354184841540236193001008856676979113360314219485181368297328528332958098894637359296941591426628297169297310200339047343894978498011481344298400110679380143795548248514001432340911565558270373397329312435370958143775911560520015023284874302778208115584385775213841761140000781186422079463643822755044052498499982835998207187441782548557791825513942412399991580e-01)}},\n                                                              {{SC_(9.82646942138671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(8.31968865865227323980817588534012145072956918174739347526060110784347496214243249811021514168456208338095803368211236101872863267851708520299886585558448598513907571648992356284386513455055507433219573905646545209558087301617308485028877164795043620893577991875789384432613469220875874237363555058119846748704662987579870821230396167878044611649792961253689446672029168473841797727920174931715223197252628290994681792926108830975273333625101578331152586580555117601990196126397627574074208787189349152e-01), SC_(5.54822319514029090084729982333587114741858196394685335721946904277279159971925853766398940004554450358130664133950870452817706012609815744578631545675150846874896545586299851385016742044321351006651189895571335493578725988267159464590787613441298510791278188261138742850430318264030952823330623956793112834295928275420379877586093404930828104809080519247793234083735911543819805565871096192190064772523384701149841800290179816133071704715005293923596635924030624539013903890347671661902299554760202174e-01)}},\n                                                              {{SC_(9.83216762542724609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(8.32284879858217969591237255043980110006686133815776202922271852776856771350332101339010324703843517116138866856908257614411748552627016061940281028219127825108284681787939022381958904898149444831010716290354011402876628197127433048291019572067903577899308097770420413212420988463826311822629338611686362193199071281878095764288618770356886283660840885566136277968760899908196602739182766462957125144855460241264414889900241225376090029495445808532222733058272682759974286930523604972591541938462082738e-01), SC_(5.54348156630282013522625791463277163031019039811554196308380824695427495715350261849345006396636896908970353963418749516078472471112962527026429006539719950884742421763042926231859443073464873027715096369578135064095865745463520613858465435926855006544338822632391199100108760066906871869656435735978048783045865402206282833748844644409629233161318525829336270222617930815810267936525385743714996362448897523286654136619104074977496801222450463284538962297449469961368377755944588348099574260345963541e-01)}},\n                                                              {{SC_(9.83610868453979492187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(8.32503287102961641288101560354377842367104556567230972911622477903374953912355915245242240712849108712975196498653679010031326983813457851132151662065430308536699354126045252973333911068809938765074862248868066248950183496391766060621564702255421080483036262188122479946139341381880799016446714332666959121998488663346116132867751565190150997298130863357142937821950846814913958715497586314656834866185822964252264867773407658286314197967136187153405146257556907174702384339683351878110201477329379447e-01), SC_(5.54020105197242658130588336922487025506504893915583522168469404039255366646111382241684933345969643188484322454205747301489360618730048950013527222210645916151377608244930275389952630297948885962678803933526584267017432976830694495613544874392202201421177634556433257628036811829533377199654511854934046963490441917900799491948518218492351408077283977664676923257870328730978442918374816705738155924294226672938193936714425640217827125527711078010078149888140743747761531647128525612808314747478972570e-01)}},\n                                                              {{SC_(9.95408296585083007812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(8.38981214920497704717899373418671446928483890855060284799740971304882745920908935736943939704589267941989830244373551895255783588073679113590173973114584988190155699825108410121360686195883747719007007893468921218727274807297991363217466038664657137367654723084973463290946256650626836794264683004278211513899268551920312342756266515826259259726512189757872712853305609667619002475912833361518495511938047440818339505567676937465864214207573785916885844608123312547589207580716363920365861285143764375e-01), SC_(5.44160381698746642203232743195166366078139632851608169818655383956057684555190540842709659974600662215781778550742641804821634170960591630073806891722462368887780189280469596950221091518334725610368627400853243854101015413430763147562200343691917920252378433090596199174851325731237602783897610447664865875066758800548339826233645876541728305686639074840192077219628286646161024241998090709536557554219707070398247151276149197837163311776708081751732490183361938952600699049554602049842531852153831782e-01)}},\n                                                              {{SC_(1.01810264587402343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.51113478224340112819769419406668343296997137852125085026627601033695221027221680739759228450519239906763483813641409205221569907017649544939651124070200567253311923725255685394557115288147651330781854842724082858086345305489388659275201553064204666324384134840442724180538877542570522337742275387903182943487865040150306562753008760418606812138537167402919354824803373463154562471658910999723607611347855634475155110992237162274694333736177499745794536149613151318943582648699966229652005358496444489e-01), SC_(5.24981758906788806720321221493041546046536853101112224546068011604066251428211928527397002568495685344162019857040043384725024419519787535508177503109959734124106406089378362511958029320766868127672972643210490560131971265057069410667058521515850110288642291074881668261518014868103948599442592327439087184092477973618634763995106587135252254198900232994974891591691575540357713853493587106149036294617662585229941327315258402172912132653620060621681600736287201723171700062195198507667762376876900942e-01)}},\n                                                              {{SC_(1.01955366134643554687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.51874338625406898751796376082414397227826831688945988367360783686017719569653498679495095886999187714603428524281489702697040739076723012974936631879646188087684388206213784841749240905322462492964708867774769042085311978421900563215780430747642719614466282351813971497903235599082563973431089320745714074712238730503082382330756857672861429927076360205779930674044202676173396435454508624742394250617203698465375200572249600589644541811730973102448523982739402019880822845906443454298948632220496623e-01), SC_(5.23746227854220998683713255684654580420349623900629957727586767135312869229549505909978296996917115078905829360331882501779993750493598375098975060336863081613594923694881885705251788938200175364653283701562862904858617940803729599936402634714305971022089877816493348526312968794620717565655039815357858048838314590763290686976255039108541835565430327578529839018553312044777610181376111606345346520328973885384006538597494774490276543810336811350585911692458465560280443001411399885568556041662167070e-01)}},\n                                                              {{SC_(1.01972961425781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.51966480111774361399069328701995935071372020219143309997787113638393919403968136915121861175835538754600834423963514889305138630433731608710603652954069400606286560468407767107107087190487293833952663977007675506578323630239713581324373245904026958212213991969335770230236066364556367455390182358766586599976713221737360674982019306470673766163584861978662023566581366437871005356906184711866434214164772764320131703274870131106914060711534591606757951979026327161823156723675231577861333842318394569e-01), SC_(5.23596329977544420065144742862516506591535240888055421546339421107981141699964339304232991065563646931999786376875813624393033637311422887716774299128151274880500637675282113944004049643846577609752770470220724898109324739773136018960486589825495016797038063092491896424124930201343699338944844182394014862004848223072687172743460980013255184854002963549706263053554276115375457613032065224733557244235021560239945266210789382637676232772997067729369831317445346394982926087240786066756007065976865199e-01)}},\n                                                              {{SC_(1.02203893661499023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.53173359993275510769201141067594417476315071144690812595653997191597262071373310668427274018706715816875602616981734686623449274232164965016889022072766227485090158582077532768757553401295445893372500614520712981163822507310326564305951524928590439452755277457928064464061417996375315127154980021397765697409923057256186808780046527978929918652502064643686968787899776711539456339228100446563066687648856212511031491366882500584309071946065416129844562857212623798449390581588562607486228411763200912e-01), SC_(5.21627470325120732269813404010316165592480428238754867261218888469888255657619814460908558032950507230122405786726087773136456927684474035194236890972080578053974577567271612823522403564086609541956175796055431451651302515819459184551928562294838939499804848508446524019874020648005304158480870967982703639307838393841009588105053700130042111134661167777802421383209221609204503819802214845033946879099849476229349151407266021771468544538449977330323950620579696088984722405789899241692475022421773349e-01)}},\n                                                              {{SC_(1.04224300384521484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.63537510869255626006639649621175598735538216049096047128314622918130121205771750109554598476295766551959430732465946275217523612600471370041572597995781971371139574821411627966947779135063872049262142250252738667498080540864312933810890040892588107753549143469963815055751855843122150785220518063256317064976725772586961349152769650156149724984037410207678280018005860017259990329083346957046556900359716959229695808387355551627553590335378265769145941947762744207681462479232274858383582258321146682e-01), SC_(5.04284609443645644137677327061934533419774433045359305110392458573885056024777806215829688978846281239767920668722056849722240308192065029841912755982623384774057517123723890362492952826228273224806621806848022766917062904511082784603260842696460679290869901569222629711739587027262051175653556877760863288406690317492056664849858221206006338415521392424645862165044887535133202678928311297187596359205254783280406914115226610484936105009423715924949584882457354022994692793854393523665552395861099271e-01)}},\n                                                              {{SC_(1.04284906387329101562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.63842979002663238449435204701296774479655826106967229981922424457731096065820930075780015601998055141776673434896407704894969355059239868184948033405937550873032643388663428811900936276062506481301207786612350255430669990490729215226235121222349700973545475451464817766888760629083810292716211070263259927244982625803510694487567162546304875630668045246698992365147563968339464619497746621408196495203376801750617431925118103653718805521676962134971750239373249604163366941443887767002203983420837004e-01), SC_(5.03761161293528383227164965192425790682824545017807701791943125349294184971304713651260221666354091350373720273671239823498548250306546674281103764298601227442025581335391701007457061014636915234497930895368532401260152887354212476227233684348573925252957161208187722137191234610043021535983693195925363819124150968863527869550047518806715597667180909668244768170869617482829743029747976901530078386044099961964993287601498583919304961877326655570710119819762322404343568305105919239287745118584466384e-01)}},\n                                                              {{SC_(1.04861497879028320312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.66733247377868951447252165296997103275902323306825603286025420811951433197464955740899002646743162306607094455479834727516163691620584323734800820553232230642057166947959008797122645834292278918957085530137883249125718201191981410765862667238291809157525861398511128998302707821659666786785287395993637713049198043239268120875487982735366514430906588661471270367651330814997354583032200750284247290948390741087239847195715009409917156323220163532420782083677592580985013545912022698903528995514045046e-01), SC_(4.98771969831719617656313296373814635897071682918217378300535179362133842502217650129347096266351936125121723618551438325664026121428000063243627791654072553877437816025406826832329511867150127042335149389897303965017841207076047913283061462035024660008951807614818673627574045268003412329001964254784115734537224971653343491403923664649208156711189624863323988440483604190657287900352131068098389460854483492037204020251328926921040829359333356258262691810836937317931035145533664735541511268437477996e-01)}},\n                                                              {{SC_(1.05866098403930664062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.71700092969493626279546693696551397493991446149794302485855185071559252304129808957656534322985619215530703595370148231144605038244762601499558086066253298201721452458139800924319525215992700207631408178644067538811094757639672162883610186864783317216938583320140927245396624100839223782524205485345890430722933364461184266302104566922918644561789891784216336399824110016096325069780392799828712360498692723629518772477904562878551087979153180016119660661629714428171152595134549244921669357637378530e-01), SC_(4.90039741160832963536753160205593132037374376582430495044622014080102593330940543147968970516476557812862892251484558355747279918010270824195900052852345758671435269294213984729937106474238759954744443173560342611126375754001378758626835355417533327367416358134292679789559890041569110407731964541608547658013533427986766123173276022255728761713441308385331757886687513503928228738633573577685286548823375042623755093322781458210089213265443292059658113438004651530124637994621070590528663737218059825e-01)}},\n                                                              {{SC_(1.05906915664672851562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.71900041148086937973555321604330213985140886896008582336879680485951801838536757137680147227689999055281146908629782633626208197037156626351590838519938227644843232798799151269867730701592257371390578792620045627497869615806106292625144081738038149002249083747141778533295159439332365548240034531265935825458152081675135035228276014616438214653329840956584196924947186240548057375341023247779001645921678513017568431415395475877280675923689817306500303008012021121811240038724856466165513133102993682e-01), SC_(4.89683896249370553462585077764343079070425471970774934269762429179697954755140596970515332881771953730866664093747597682883770922465296585756705379891189164474550828309710536478687378551749125798283750925804320256316131484501216766671168200003672179899082617391804064193590636351604598132301058797388847653654852045763239641614760898092478871627214104974166613633239197560113865348299157056473943881709690798686908910527770066800305622871129681295792885174909899848762633358144516547914334749398063424e-01)}},\n                                                              {{SC_(1.06404685974121093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.74326730386322818165403183829980231220704758664528761387420793318199623988188287228562182015131457264237017227064746614998591399611548349871711291795824419164529165313313021083410212942383334148070717204428133348646343376310245442559551132343333788773189360881220499349668657349467625660011112074882591775033745941184779921679182973842931373979727864745558701879046424084626658938114080386064766769338228176043903994613285122403749373739641206790074751532744011064257881235735911936010463427099612510e-01), SC_(4.85337788073381287161887688374158104787121431696676269420939153194208236780343659176489818915243470660478303445022418521038772374464737790940191013779627823755948639551012033500994958158596241638089706174311771559123609136179569130774973500169818848750983070485708416951959646979887204315285378894267769462886898693434976876822042800157209311826110363162979732940360749999711522340809800368388340892598573711896105070909259272401472483472934643092264455000104919075952371469577743222764107855405023035e-01)}},\n                                                              {{SC_(1.06605577468872070312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.75299967790800326957579466517206035726317102716369270128391908288135911852195765828650872928533486235396733613840588300344811474626458612175989430336995298154686296235044268747799901895709710805420255341939263059476701352744184930828290106559184325681355173874783483292064401232914578814995682806788689043618503855229338630525795134718154627642954761554611143112771548418565760470236546269560167412033082374631027328722837121253712518795218699823558584473298010514761381916663250079831145927637145512e-01), SC_(4.83580361869073329096825498101204074277486615445135909310168681314825584186657157743805083975295683484952524011405934900340956505003827546459728857790961378812777211919246155282298673275109441911741584594258370232586494882599141950379291167180634978982484743769885908842514792665575851154827558487433305869590301423981877540440377311878647101784216763854546447711696835968416389178865142487352325329510548680565244359142338882708937974756485549426742727485384836573096307146944816997897987974865088132e-01)}},\n                                                              {{SC_(1.08875846862792968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.86052041181556804420157853003809295509020381003159632678330031926155613313697651928224454553461236532769947500220261165833194050244017463159967219713343190888940872924004769898668054614960612067768163625708922335854525564217293571956099993449125025760275399724646641465279235965514468163044857266824825421011134068746859211431142030482654092389788984448661655175218265916522966248599635107890290516032595136634978232855673202716459245381925484723476080448943336886986452613547709008515545495817569844e-01), SC_(4.63585785284662028256719823759376681906286982074268964315510196265728231707894853818039426659059071662329061671114028654510223558493226539111242214193138182512619106471156301700943201023981145277827931214941828831485183952462840898818541019222917041622101466393157750959830184099117253138133262959308462031622066276723882938564922305305898089637006609621812072121630293042477785161605023273181599435075615845484386493659177045916992081830224540648958182405308981792762102370113493840942771604418998517e-01)}},\n                                                              {{SC_(1.09043169021606445312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.86826482236921672447449179706708485375043355553691440273593327420168239477132277214344720793711699844640227035419019043695996177843752980965659507636733114075792621556684339379870175681850993461559212924371482017360541975449665834411762915368590952833725617100522956368600899475337046764478577981743840414752227942784520893184527669100141833554190941821310082665045546591131096732242366404075879568232822588962816549825770535262047406532220397884349718398351351345631146467329904338988277781412388604e-01), SC_(4.62102575629358345358193278220239912943762914155557091630440688880915027260681567495686384307691236098241669002192609522100608971538797481822468296643338310413267745080338888521763724449703721181525711685961754882823506150496638839603163061168716786433832063182624298206059756860545859311345810189175501383844100673642551575982167724888306813123033872261489745668071968509975782852008866634876883678069222670357529286372112832471386556313264785227932452858751012982478420628900495737432680259485050530e-01)}},\n                                                              {{SC_(1.09919786453247070312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.90843227852636417754078023670181836726969888550715979569761582421788842009811166075357104409373200529353797356296194747329117633898284595748884928377534387104217962809520596709461075749050442194320744109543038360303571206655530254972549509191577835061385645662404364751070825063866314122891742192255538291420008446512683265515675475498267033791336724727715086534695038766636105394307515824333179209863613528055367464822768969790970366968860100398720098161704801349229024135958102907283928389323224690e-01), SC_(4.54310844454648379873120607006670548106504273936308344713803781953816202878153053648467912295067031642609621240314406106159323935686078031887375872538432773046877998973015349829044676649690256098999812181013898252995101567265319895403366026693535145332532873655206578590173815426496998031760122181314810388522458497891773842101978471976657558938033312291904330254393742169054653345552739972745892889286687291515486452550371590537891653627022141132791592981991782894148906882988273880648621145756781087e-01)}},\n                                                              {{SC_(1.11097049713134765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.96129806525277931549746940258054038497901485655442462001193167615553899642423376679625380957006925609116439219224858033789799075021311265199475814709599907351541682459655081479100637148446800988291544390650139527246523980147599760194178750523378433869006158214829518372397604307862131909717684083204284241198398231089136180930422436840921141120636985652941816392179823567868504597525864700725317377642228825193551884085524027677622962577073184463809485907517350000538374062310077315366255920874398518e-01), SC_(4.43792034467686161435066158920582937499712557756861035727252976848950110688968604315912228708353790253735179591661368667429164980481829903835715257840075598064072824002764782072845168539256496422996300665292347918368805696122560306744840297116277600434841582751477611680800989873578927424627380500046081155735784608784217047984558403352197070648965620223868221536453713383650286042124390749422283505134734861735393518918432668799277981357022864234465981498457298557827308215729393447123815324719923535e-01)}},\n                                                              {{SC_(1.11469841003417968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.97777993844069867883061833880911622006887326593247884434663254193661888734281508879280574938201245602083449732573669531783925291848639988968125196704553953589366990918944695638753782313321323890118010922221573802474698070006163298230204972483445936716816168920988970067182809681992444702281259138298123085231327090324810628911830766277370721641182158714867679521918526123129893316247010190359472609851512168378609591714336295574522133017233668001470928320744807364031893909492535780311537114396397383e-01), SC_(4.40448264577483885910375157946717295915588861882827699636627088893229732284307726315707187475199224348391643359726102261524390968202594593840733279233687652418354013586574979551135946054471473954056758870692267774395976316275443998231016071492822598582945261015440379122802477725712247192982519270953451354709602577554144286980143085436853223623449058582287231933171646155624518683292834351505770838921143886420194465409487151334011900040856783736776989060019468666458059591569074292685623764135347602e-01)}},\n                                                              {{SC_(1.12690067291259765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.03085489385391432138253648320136584881972783327890236915413986443801167844516547603415075150516829537723847711483356329411026561303437978341538137836146631530839907060578165484607455219737967202426787288065430192025756314405129316124792600634387383385213813622327788968426536841277494211116731173272141847162651617309944529541815581022123818705107038152033099618846122887043326857140151945222693743782852899700635161577334205006395214456985256802054905416422768196408511772953988605995576812240623264e-01), SC_(4.29460823430435921006266197584528037733748764494732686246717505687114122156436032393588509554223958375815536774890597205754201803789763800242662124185976046398574571942282147255557615032964621564822171042288133276038438233227333630273947706974237786924602656504453943651543681466245760446369633159753930120725421033471338114511183990802815831071292367895473665758738680222262438292573638438829073833666408315924246288193759142668342008705805569331144834511547498169751495542450410208917334083742163910e-01)}},\n                                                              {{SC_(1.13059329986572265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.04665167392049319620345534586690601564567126821677157288179146201232502224038422158590894129258427636693774374991718538331797402862317721599358645680187066039483561196211510383540514756783626943025645617696737318571080217935639578670283051167364957232392205621360119928029038386868026301033816567702186916413945026858945898884444539133885745012029762371205009252452353561358454635292174982169882365306944417833571913181192416199936541473351685186213596148125902968967370404530630558777459028074348239e-01), SC_(4.26123145237987963991613880409153775051796291409747115768848883186503992232882078065961622999098345555682662519292123005912710960263209200406429824415675430100909189286037738185934817050387012187711110624651352320496017247435142334638833769478198107500195021860665003684853075795687835166282633358049322641609672922147273478139866808881821932563138904972039419343160457702042396592530159562619762244687437043963692192588118989577505084607997788618215259359936094268526404135820006637208410406899687037e-01)}},\n                                                              {{SC_(1.13203001022338867187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.05276449041733672010394121707986473647650308154796820988450667995371427742162893489759701441144972742607911598724960388654184134870687320510532723658273849388688349217111452962357294546426666306484813458191847624209008230503933128657901248687587385339974502942770548704446490212953058721298608200351499874587139421433041834508501966339870189580806151431280630166068971566970973089984628295633880739897314610369766087638070821803684483176989819772942985455660825311309235876553237536013668065305000950e-01), SC_(4.24822964080791397836406140553655164285290555828753133654215241349128224504862552665142530358947448313244621905569067742835864871849030965039778594300582077897713292134045831590878909923650003553010034665210041549470686252200567670421755471525246662755775220033654481207248039696872143349607384217082384877921659747747396282196454772408193679787802467785949018949574031801864194180099340272507112889456095629725679569306278784200415308809374685045388176886359807464124186606204017335800042421388130291e-01)}},\n                                                              {{SC_(1.13580036163330078125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.06871742614826080426544902188552969097848459806253841312178726501739938755516444211826915772979090536127855767525899082662224114622182815815612343465831726391255607929734082143238153402639236649734531393050939975703605497311019419494134459261321131507417008707207443899646798810350452119841213643499629620414211030084093961027440802732600831753935826276420335421569830325731475827414663734255422792908765523351937064535216247075985814083775165914030572741504380395913744298728644899410010274648288436e-01), SC_(4.21406742289143540056935238939259708541056211496750699572410089673639210208041539522174047279155199117564705822879329351588563719453367242375358674638504791410169798932363623003826047711618787025951475619627355652425326365677533816876071542203043388625599667790949286920973946005101230035741719273016087443767907768947724151049369977302480232422549185276584371407614838897669352323162936830603087635485697835568603231651771815134621466815124052893383759994838547910992828230478070297904246533640163446e-01)}},\n                                                              {{SC_(1.13661003112792968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.07212645505078336592546993342034347346036166526424106862079138801101414155005079700969208442578490897700209424599475522246377249297244777909388623975719805155716971165782231768203899326560121668452919809859133801211211307056050647136579966629695848877926282267609793465571254118252280752501521262130777941983150143901874832113135335072344383270934369371992512277950310350747740418237558480525688444233353187647739164143786205662610152386867031750885707697735306042808487292463725715483452131810554418e-01), SC_(4.20672337854151122457419922618285571400958915669271978123671381721041860797076368560676678098491061900075566981882144330319995537031854242613255071424533255100142882239789654494110694602824957866149242812165087773509386357927168585463500271966119408996321033682473168219447765947440866337522704235078470443456337386648514305992195750299860401351353849013577922401633224537989546041958482707453618435788414778552015740127056056170683492826198507074529366220355468791722411059343918696159230187827135461e-01)}},\n                                                              {{SC_(1.14259672164916992187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.09714808146786766049489801864942071290026582230688936968489304005176787639966209570341529348132301981885321475662528144306433593266804841044918666299859575282004116334525253416639794749732738787181737628768536940208576836168894664020460269602393048737409067475417277994778388667822250928151297675111015356641185595052735384019315307485456414477227270612916643720272064123936491452009884098169679777105872945543297292672597846182275840226359997441848714050871056195110241872729791036625621656486350379e-01), SC_(4.15233630428045828571165282003422139712498001317957511686008534131679635859864183538546177185653594374218335784773172740834926166657981604452038659779134984969519272193556311849431489541170367150843629073886554832945321793115321801590597547238379687982261245564993552355427076728293723743931166369926846082988125088930254643258317503216425767257590624560371522928955957185570513735646894542449058513305304736526991548661282952311223031495252853637632912517195447976026206965381611747994754319121271858e-01)}},\n                                                              {{SC_(1.14562463760375976562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.10967928505449442477081422038075435262620844535733183630539949040639580246047111782396326632112072770317601862316282853591194195128025559773450972473683112248038698411251861789551926493885241718374958549513870960222836015685629450659124563614658835942746664146199112693866059530862118589459649124320556609092325828809814480862988576538019654266897227975463670711733609274726111254449385800639664475604251535601588720621597744311853100014972643463460221171955634192568653477510794182842549976291195423e-01), SC_(4.12477191168784935397589542884325027388357689085498131947537129681766142724657274514830840400491483690289714355599661512898778855332753696947337182311118846864698871919209941904729470689913124105484612422836802503073421988240018713959679754944896616022088589357690960812847247905388912400965711338977743333908776275515778687477194087747920739357278304117980029841210676526164619193233342273088978741163549949119443274091275889686142390637733620167209522300374444339487273724884402412259930353569845255e-01)}},\n                                                              {{SC_(1.14827489852905273437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.12057900143872218067970982922192214668187795116948511672998654720440343998088259815687165872732371544982085414715899103659438900521194591600181946583254530683253869914773758817729876505766650911981273294394246385317544914009845972530946264882254929676362709065143411714714374056356926303562018956394533704359647326639327814904124978641240051251497949310161132673465026917592081480819229359101746014566898516905814766805157596467983977225181854087666156217397312415244373301335833103871561007079773134e-01), SC_(4.10061442695055656241592053545077071469873703766913194109513704590498736621005492180749270920350467016099189629802475477376987392515014862532685086320893762312509118905916882348513232369480296518941886810485931101681991846575827285414850722852677268262077026358236462435033082529712139434835674072710092042900091838274521865048762682145068651151230083599431929738579885687009093402528423886269652027467895932317073488434254279724863916498024223536756341449912881006114760096653887317577800794879031173e-01)}},\n                                                              {{SC_(1.16087532043457031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.17152307556783010082604234062507416168862222322805868126512908874350444391624031476519790127724286350630918661654825182157230692102809969014735976181937839485822838860652846031092583424633641391644860770801491068731915330548036706668019531194768932514193867386550118051090351625465136521387253167298769484099254783855080887282648257670532689477740287568441339407697982292779708547695743644950283477211098450598616887397228591108140780640496617665200172077741439182065274301575092569036291761425872831e-01), SC_(3.98536880029023294278086460148693023952159542068516426102352744170696664558788735125994072124366919705847446617560472546619823569017866513210849521064383900291761216761561162785231326739724126611432626880545467591218595745274715036559709822417247333109223675317648292898183991722665201709066965713530805920987744018060213090984936415190464295866173245814907161799185414469513053299582009503693771539080362564920256173007163387568260952162357027452986740446686993641840055667439013164437546688199957800e-01)}},\n                                                              {{SC_(1.16834640502929687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.20104186328135298496957248515380925598682445083418972994271507128899677334354024738351143080520758708488667415355312255775785270232662089553577967970873736421981804100263026490020568371888346518033676923936168299859080948491538582930383269106320961933704101394993022866629525312057629214437325611043108130115817888749357539683062625350003630331806028055668105891089090457634237162817066604589680759760697303496357583924370788467666847648455530619909598563666998753300878386929067426913186736757889555e-01), SC_(3.91673698761405321464513321854133469209236441434776579154828431768579035949142740619365697318411018051757099441576277596809431746185297594423424182048115058393371137639111683011078346738805323243265590930585823423972969974096869859395067920268358674806993929141535131498160046100298751958510732699978972390385447219959583475405359231842797831501966566056834990709022102530031667881663532298096407254848006625574985191288563471602091514320519928910561533915950755452343557100085313807737796666507723692e-01)}},\n                                                              {{SC_(1.16875076293945312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.20262487461150275570854849780709403747997606590129256273406002091397926362725679700314769011519619363170611596478988430829966031422891691220439160070374308583783549778149771561058934629067954429785992714463951215361015537223308002891453548856025459451393659632361923622571301382221566318474633889106056646792104013701242038510237198194757991668351095063614184302113070108687939723485895001025253995763922338162059728474300489054051672986171154008325483425037217675490894835207039218324736935888548623e-01), SC_(3.91301615345268197670216410259475825479249814948784542097263382780490667222684759025749178892955351123015057685619256664176699053210800289407983698386813767660647021867504064472580409883400638687828026689981725185305365366518569508764730815075227525401705234916938878520111673256164342830245867994075805093498516476012702512020012631774741281921364755873559668935956266229855973637764179253709544696893649654956630131135234060288014322494402701900781641804665327126095941387136867878734833794824793014e-01)}},\n                                                              {{SC_(1.18831062316894531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.27739769191142907630112261054672408433827074235085526421482402528633827895944923714163948862685153260396240262340145527560063155405527940607146981993573266564290150967731878595488727269617050804601144969687367169963627158725306967711203122929341189833054178990422555120382808115008410479562507472567225958915506070205471388127086879938312382037849559206758820928332307712139310928957998804194412914452576847112033346093713837229781543082521999039397303555891581773141822238740680677363969056621960270e-01), SC_(3.73227706181045574613892029421809688445117154458049890104744406554689644882750279997054135059574163615307509496387105911854259028657360416931236569295709228060537679801566224951288390179021321788619702625697075265845040508785342707672119147499611162773659507482557860755116539100333611957562095234456233834164399613991535254524932170807619064048654686289232544975838193264702607218242419552506465332505750536654755302782459301575073829888035473070859898459854288592606628531015905515215328965859623271e-01)}},\n                                                              {{SC_(1.19039630889892578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.28516186454902422464142063253245617835831993322076364693117226547496030344560233063981553692632197906206457496888066502992250708601341632026473576675604009580382753778104608967714567825230081216174626717466594925097943661283821261104432382946816906642439643088433343511790123173750311956101253560175744184353523795540070855594196730896187778475843109146032220509648721592227300000668194085625224264770046743164904530985803854668382032903091457367068937360346739058382131029700969766599027553880587035e-01), SC_(3.71291922200369017368204717159193337291160314265581751304430097275815657042961764795772603591106890014199979261611780010990427181966397890965023529008555433311859263133002971046765531291467046041422198778207159128153061796218688191455896913293767037947336850496541997112417482121395773838067935117340279113670753379915713771543247146237271051406985023946047916102811069959567507384501135518817887548474039934107670070502429665488964979540037453791016826388783962172031111105650673657315136169550774260e-01)}},\n                                                              {{SC_(1.19096231460571289062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.28726191059670008805902334584454239548550218003865918387783274515713982271365456721907937011819322308247639769464524642436387203203810279099134490238994363363782132621188175076050990311114605791787695124584795868845460986309932894230042170346685242336929156221469507049469718315497437836489677855006366723074385513946845372946221747502328157358391353990910345204305499847252456480752480911497808889323910234417398714462949933866979576468447248893856074487655468996673069831674808380773383597169728443e-01), SC_(3.70766317294056957066417833495763491113348627015635672702274459845001395617942727417604473158835895034446078418116146503438699088887013640040997993396866348083748879658746047274170403869051444308176371618684989522258324871577825963013946350547476759792863601524048307707490592682701522755101838488421372094179515294608847143712947490367777105233444576897531662349328883091349236022669451957605736146691710067849435432231268480058722914653984610289840504861644546434752499763108252506066044223619930146e-01)}},\n                                                              {{SC_(1.19279956817626953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.29405814959228531972281872115577848744241330476539424322207732928371094987223836641781173065764693421962834615341501910662796428871653547176129657230584464001961420818793097252905233960596169032065469878813696966372914938789591824236632930918109243800393676264317247373859532812738037382380071974856343972472688501422232135472880038578042720155517847610051178510453262581202097816409643920956443406712243536414770069769104615562719796933834376565411943382368723980627719029012450807053347412219704017e-01), SC_(3.69059386982599663479268899014918242058146304796244059493852041445394639969033313487963675689101031682048803705239313832756670076420320497105412508794711632075221423978497396573301682338629221725782129504408874038643623931958659624156623372278817482189559731742170140152759634226143222489507613263475147517846822391485630459802157747193534639725043070387657299498871201980115247626547063665279931867790323452576604332369833960637356251333916740127183701321319256002780080402637694714766766303212334787e-01)}},\n                                                              {{SC_(1.19591951370239257812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.30552734832125840052974015459491503538231284518030644709405832601114655819786012336846100936680207777126596479633402462155688943661893846904345931371744036668113498108437433881236484618382378315472957245446601780294109805337925926459035813330580701717675021695222169203288405159988537677776806482266518848385138258917056294589703550831979726470477115328896554634634025613709309896598964607474308036025472101068437690489908562630928075259302077592097964344717678590374147915076540975888821010858519035e-01), SC_(3.66157899950897266341204379353537798419054654796604975177391472417424105792604912894740645390003868771294538477949014951205228558913570580253857432999788735617990786196602185473100952466926540228987836275968822023067591944084939010810167083511169035277797744091307218205228104199829296100195491260033447590647463764333346476157327673006815488595244083055259415907488611696454882856572283242204473890087698344001008271889415271602016935370350130295114514382937056980246894560606589697741512051296983056e-01)}},\n                                                              {{SC_(1.19689273834228515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.30908647972181035306415717863675078910016730211025242842074951415346666558517182530606465652617602590503103135667675401127384688452760685047951125160893347618897936414760230294770147124404072822817308689665138567492587093786105929151601743217783170480962687630249977962066929583403767936082548393140331559208424623662293131882909285270562319002202662931897538475959477582192591513214623911397240402575108754598773509233723284574310101952889917315026274370157180256653172508219677050914615205659980002e-01), SC_(3.65252089837424373938727945032862259240929210684074233581248975290379302867642149838224468303772701597352111309102217895680362856214434627802079638333831135765550971400956355746825337558988814224935287422777362046821445133407585196406260734897665635734430246512236439325599322156781662484035732365087377434537435860795506489448259273991060211231949210335294264543504144693688588523172409424441977492672322754209085937265193527550849457330550424215617614405156231791817612582999509373290207256377986403e-01)}},\n                                                              {{SC_(1.19715881347656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.31005799517589437870242196814333217476995807649499693529011070735117435783018891960654522070935542030690361671439020630259187276793080845112359698698329519869008736053654931150687543898355294413242013599585226095076607506277217378010263042670261524175168832644995554677688260009151311954304087058469724641996779642466187883365404506690773461791353735112562733576254065327574996637781135584728439660654962080740806431927665418870924715565205976970614881780948820952724574977216025534368393095717906537e-01), SC_(3.65004385267648616527954865992296715275029468728197283298369369930031821727862070318709641875550598883423006447077958239050946694834283128158044911447498221867204751900599261516784488761688784555629755762916704867361218920515635517453763245342455078305608967286538908919851124430404639267094726214081305999445008172503091250993696611411571069568706856976299567635700760301194898486438742662857713008686781080202029537398830440958546777053699027918966553421725537665837567022045705930444634954470244354e-01)}},\n                                                              {{SC_(1.20042037963867187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.32191331430111339261449895086549029541470003741228205646821040804686851621146871816651400894443737177018463008240204638830453840674110125623289812708169644095629325065149010200905012268466419912209994111447231809810189231643566978559554114551916902520362624563910880568441884854356628502594736765571672265089892468311580935293611112366583177210281808378715470173722388206625207952034210304617334678964865106150827253512547516634051558951374863846101108535417490465431614432426061074316072852256048091e-01), SC_(3.61965912216269772828200120428024811920456259669546381965248128788391743437600116259321455141954281630073977684422263911816649717453219170684896869008765512815585782466216706979121600952302690882562786945071216712298460527846953632063971663355824055031885453974118933514177156551266644969344183771388988187700954591832948468792829626512593460301367220285789086705214738415671060717347435359215246280542287945602204254892492098886152245370062298214430839126574533251827355360921125829063528873727247319e-01)}},\n                                                              {{SC_(1.21129655838012695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.36072925273237052589741354103374154582179542921990534420565853190994871061359180376574053467333730868088721976674265695000194820004662799610349094846048824061780209573454597704080611299528119256577646763302585376602803450230153550952519196349901875966598992633061265243075394277854693043396843989237317378406228134060736859005383861136196908476811762891497452579890884383358628813653439329111984377402837232792697651409263740599186857664307725963774301386350428715153756030172114179091681771359927544e-01), SC_(3.51806024067816042923452710343957815012239304381787658203322727361903081924558982395548437902680194552661545970996952914544963432766599983263188021061667602696823019854633628005351974297646059178922893378662728758461925073548375986644842575266392632793345025076736067246775258211147285299896097131511715201194597912854700786474397178696076586495453199254850554056748961865026453531107999621927404659841430395128647175395965884488845322038120983810672480041843000599942586757533592915075486458021630309e-01)}},\n                                                              {{SC_(1.21226310729980468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.36412525705292113005181122991624028179942861503165469987226035896376047466885319902303883839379741451140394259347926363975217804886369110016553611927193486731484198489088957178930815051931109152472621108575791931072217293637835723737313994641590019638899944999808902113847285921266332195762292416864655779343136099559172332963707123208361372838218978908059128893432339110061768503598206594598946807980130546308223430908284488119931468633860015472526279070073415117353762389835727974307845340200613643e-01), SC_(3.50901099602488617933961662609194577832551303168379986695120681175473236287005062080455575167049970587669429800258767273667243277503972476292879911386422017336420102780155154909666335311881195241771041240308554984076113094352112043029341814955976936909466185721106124354719414139265857104084452167918558350056175176101945356049631972945089068579910004816914095211003946675102731776786465580977726763772219149762094975256571732700846263127621206586182138024859732939097232892050622642147713701363141822e-01)}},\n                                                              {{SC_(1.21460151672363281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.37230515170665959085324305435816580824334060759925311235095988583363681210882971361015639915500438790623872866050950396566896332921324713253658675617981474109530663758689150181212482116443395967805522361320173948366777777549194083587765101013923132282405066334922427013881735709518698558177470965263274689926317431180375953081525097608464790961485003864050369654033804129195503199592098281100081388796893319774893910509480688105560424395937634005187859987536277387268150181832415882844731264499687596e-01), SC_(3.48710426332405618132227540555903517056786716385788196839483490850475902035868776849242484073475814113679351593802158471206518252887259870568005759089726021896451567470580888732652672079444087984700684961404157116233065933905865181127124685548895000573634425733126645685362196697441178043026624272299059779697880380488364435795548619600267324209181423660077472428253880775703087620032376724562736076779072125401913269088489020843657385728969803849312555076792481699941332776210312751607467030287676880e-01)}},\n                                                              {{SC_(1.22142696380615234375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.39588770085819691865847010275003682328490704428234580843509362105491428163438448710042684284109797054096472724012751496536528244522738064907879573912386102664587700021103931492196502634778712822226419769182878104076466423635618060502830320299773502938148601794567184867686070187290681996430307341965745352810807762976757865055833978860122338848801972274049557920720539604317776324957070543307660085092806429545140437522026377782954574391713807786920755303595104855319858899110269382668643762661454669e-01), SC_(3.42305336108884902887927320575279559613447444606461224929617092896182369164661070824620337813821007909772304866662213350426972631574890823317729042350306113005691776633881243301450523125297179600210819849955453532967854941727134365115369864028598198604524465184765997818343891127520544365161238551649752264818554220850963710321530446994420439978205574105707505176591332458227716523834711613291351686308332571358688396721775880721873257679162552336092352441386034121556519027449256660873800382080061980e-01)}},\n                                                              {{SC_(1.22208547592163085937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.39813978559762047755322455989924734422740736531083873105168806262703082104006400399243451104269319997589950335686316330935313067840719316152982821117636452214516953937745633986997164220794471996103513775628249098109014694914685001253018949349415846758651766091317887446106708184940528230682632778052559685259330436735642221324661352012902839478691454369461241349713438471782232386917837439816471075185081605028486721931552758494782311573639335087551525116851545075348233789520484671443269682756137400e-01), SC_(3.41686531346600084300401784614799893004757161767735513566812293919164675411857921077427802420771871729690257003944133859117661387568350609422772611494688750011640503072888589321701691855742721189777588064092740430186592868077940180336134880261857041689621936378609096903010378220341856304235083749800120130002770246847233159418787899794883146762692009200694121724147112767760692147537325878164475152361287321256285655447786743373896368939341494404532390842764544084149054784203820907870728211517025269e-01)}},\n                                                              {{SC_(1.23126077651977539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.42909451828498508606474709375264723308842078821339777686217320508975455062300122709369552657428197799104481963400540519817121209533671060192044819654074230269737951307056021548224854806022284259103862348124304810034465177910057295938738114519751420463405272341889617811534402988525056538384348037656428758340675621634449278436308125862620745919116602430281338222697346377191632713614962700759746388254996582791040894490980209916664531339155045033869279801435861516973847175864623025517486143969820319e-01), SC_(3.33049194042682605175241363784040240910285245708277205252748368685755534290141711394993998500991014686784430027546221468679903420140548619407963172914406334035263949612686570761312298281247646711316376182219248163711930542803235076769721715931348363633226871451602492708928131518862713071147775206684552059843068760118425994684230685879647854670292765541806378318880699327264466824963254196260044211725225547447464973750115240147306146083186263336647077159866504141860017716353241263363657015139726553e-01)}},\n                                                              {{SC_(1.23186874389648437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.43111760599709541035588926901094997566502718811144427478325174481620111845861591297173944398313017102652417632855534696066465013105557184226146279067590494633440907772328572170475398014172118282965409195033028893604787232003194956847056575653399955047984495654919094634481779204010157424719276038743419254660219469258610283432010853914432281178805639955141819568197338491600326973895231948028123781044473735801311915011507832384237593541506995096256938240840412181938542889141117184710113419161088416e-01), SC_(3.32475874340554457877202447234475014625989155433126288392599830437752954563599902656557040540286535124631296551395636307213098940140603482531580069603155304081711132781783110299772832553357145878218145112077910478105454877237161308232045592413393717909447388261991731950085718673812733427205738145139181209503016951452142299343473400624768159762695213151270652676435125559371142019981631428959629983259386047734915266850184479686836227393801237648335275044395133503637188941980982471598895745239031016e-01)}},\n                                                              {{SC_(1.23285484313964843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.43439156217638164611436012930228382689755438982293909056748709765218557125176035116803710034077451195147383026645041830589413044047646236397156773656436176560487896613910491818283697348760063758826608457400150535252854890989562986838851695706325895734051254961720112330923499814106800806774483808233423741414105583491907454466356027291514010057864404870966322389372113571153221924917442689876389650652168380703427394113468793521455108081660048558837404953698699159745637539714086892947033196599689263e-01), SC_(3.31545711049548839257000706395881987887544852335637955820041950634792349777877146091793726646581794280066231025664093730708988019858153187826134750956235714639167905729537868470957660612761971312259990996222427866783399658798385953978906208383850722176584774703718987266959132557807629489026453894218196169262461930928017614227977721723176068755996006303058069652596783549031021267218301715854961427011462057088981815919420755933964243770657110629374546019598030758679903822363458102609871773705474429e-01)}},\n                                                              {{SC_(1.23518657684326171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.44209667096123697921582138669326176918529476690320250447678223598946323362005245879411974799045920762058832832985133487447485408509583010708288946546618259451679406538212487653483826636128540529638916310113140319036693842701353614311952050475953080822080569346027859301545516626493224857004408304854843429296425792156637522761688106782567403043835154816696955555753046698752637657160792857902429886164915472067084443361250512545205817736097253824127751766134380610996601846700392801742914543911037926e-01), SC_(3.29344962861476388149406913998441912009230904653412583399999352256824561235741071049429170589583463558327490064123206934737081606018173969087932126027338556221875098517159871251691922634325098784219711062126107609916963680928323227478737529546256658245101678834691028532302311092045323468689356548157944765823909411811533495497374371282141490365239488023630772933241701929407601305723704383237378697819408791569514437882779120717260032221738642842405948248710800015826687135545568410720727074739930280e-01)}},\n                                                              {{SC_(1.24624252319335937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.47793106505864155710372335631845478492346645144628703595395965467239858524618751432955399079998713862118814340871316979430436352804054698096345310731993977194557526214858749942483204958723187668936619789545938232937082744239886585206968488048066729179235203027526167144649855034638305660874263285668201906999849721073117980803930530336641270842753565877517211243948658335212510450677017982023517654094004127185898571544639567951870938504467089485132320187321443995300412459166829074977205069854128167e-01), SC_(3.18885915744116307991824460697936149035981956507037394874207203343766845897008716157201515632181715607046169386224158869719338499493357779326841073732915200544938143073386213701049092950004898330773411106540232117579844388237617549128045386552657145803158607454717496911937874697588703219813472297898156220846861451173907218251333262291730714466252844502243144054267530253758685787092879456557743676371047799961459103016257328082697210759446844885660824574319820570419954670583966584126272686255168088e-01)}},\n                                                              {{SC_(1.25251245498657226562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.49773856565935007970549344512699526547923968348365818675525781601959843817621732366867203995655385937951745643136104129868291132508462687598553162794100451077120644951475808579961073311184381003686892179651005302578996007940600397705098474530493933204289689666095106701306420249614061152905549589374731140175838517402015869865999694639591169784678467636104934359422200801913233216502687786281067467908895843320108471480144038611249749161387634157417449327368632565706141541919713135041484839611347573e-01), SC_(3.12937088539966310827617816863542443537540805689998483350331382819275180168620190928606558064685917571580731924251185390060638335515562473056747532029126629589310820045526353157641807788806385485857586135006880770118838965302001129873513923219007500039161812961582202391858173636142000187506046696434678802335539416687869723789979833360079132724807635630965800159606622528573160421322491440022849488963828968641231754471167254476401435600251010890399418114639079564829480566160639228869800176144301207e-01)}},\n                                                              {{SC_(1.26107549667358398437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.52418695956686480941850006541690930239761325232741626838515846936884406383023802081370469754681074804545915353145563398074640428884079797524360775772596192826878326965373666553059294324922147137549306798969863433593411183534403373204507899175938685742339242571442474706314723892564187399965843300144380287591834727003669115250840682958587379968031653433460770442328081770634773759114952115757110000204146434560295139713438946949932003331265057495416454532719341146715168794305719687927911827605620710e-01), SC_(3.04792761712224384443187440326485521277019541458374687178938884329401562377594129973298941372783852531469542452088127625467352152764900393544352757876910877738043333639268176601041834046867143684929017539126542262643786563076751353073667362561187662421509245109958895360976584080168450328548225498844675255271705276714092191942776847386252873452858675899976559091285901770662612613531069332059711175867315451004429558937196248454798368082613262854234614462702461791856600415426502994212521285961939653e-01)}},\n                                                              {{SC_(1.27270126342773437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.55897702698394019729304962915783339726149744494967774619631929617070997603359304132004967665208808726981185438434988592804380773810408457710481407880665329100751305932132573383322495994314169335167702811247724242084676106663770075572223167737313811281221336916721200692951939588598623738309294942523017778375982939758937559540634496752120663904522086416198205632120656934830706622226108996378750114163976746954239093448542669711432898214610113927075962020141106214972505729115311860914979288804790829e-01), SC_(2.93699816097887127043847639571997202640909304251711570871621466393972194728942985403745669049952639981112592351372429654141213093184117782687405526804809341776471067929090431550971880375019669575265668215408329474561215692609890091928351019813993747087345436206926066191226700264499898302760789705916368784748646787652939680945907860790073813947944118519002614505565558758391723561571904176502747834651484436309420341412474883573808977804315917279383947293912390846411905449890347664818172102427869171e-01)}},\n                                                              {{SC_(1.27369403839111328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.56188809407302140382519114161585931061089096133538031388986746812799011766912214432553468991963837135206882860816542245983053233993094277539431446743357262977008827009374763284827895016421564230457917470211305717579021833893032138958039974074703001877337239390215038737106172458129186974741460670394259661415574457285603388199508619494741444619649181349790189072222296731305345037121134600074660767206690937687887307524014164116679464591387661354610259197146582254580550754314222778854512940941975451e-01), SC_(2.92750680211414746770844834430161658350022817838677528204616418770016411973049638712003593524209894044712330474774636787107110946674545326257267713468777492693895483352299710997078212274344324361670663764821113729265765705273387211601224326658092724978157805173109712835197097971977685009294324466709071461279772808181639695341825295953726444706286165065694230687880410120205268008012484510459176080990941425970128533715782135699234119402304189387675442401836055216754433030476408800736483624398815316e-01)}},\n                                                              {{SC_(1.30864286422729492187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.65834124448968758372373106440044548226231466537435973276539535442152788754757669023365222845168257027951609639462431742264781036338666497665199597024074054375228032559150094452571866604853409863786616373043000523609661967136561191379693746836366992799858653529442457581064828032990400456134462903027511889608735806202396605802508740621722399330444196254992207913243456966683022884751737196688975606995192636674990845283225951184164377590119512424796579386202619458608939451290244931218394255282524872e-01), SC_(2.59161038834725172326566408046635655484407996683812930425596593331321052560858900104499556422763595724745722744888885012081379301273496392545730800427206859277815623633316107868525096561220315385068440356778513672994616088760741224012707881466960081026623434606955678671397521489157762162852500111882453963438629697190599563321621932651961872959107980463673537799267563006925080070818207097906067384521865616370172042193402833078119193467872189984306913742687629125585377205706386812697845482831875212e-01)}},\n                                                              {{SC_(1.31513595581054687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.67496509157828201912503630642992815986208380087219453489786887511179651968481635751257483296845739295085326766167034119259758101256282104848357585266183737568700627901779263861176788050184045731923724812808611848830295658768104434977347403943462075868578161953644447327877542025293961158175558534004721039058111728107455651102584979006718701806015009635716357761745543071562343687493685180873927341511807385763241403614761872459414672368709060179385863095127929719194061127988356635866834884782068660e-01), SC_(2.52884370350198689836509793238736044053809213320990655336570043176388019869051847476197344301598145790010542007186953761020434865510582748749159053480789974879901690784775151251388330020872601298672488507661166060231571603598086759786500882133991853156299415642748708141774922447253154306852506112676846419230056649032959277813296664662686618019664034010059955597878723714332427869130132431251976307122761466400368086425708093504776300178852667386689097710596288656596635943810817886346084363546615387e-01)}},\n                                                              {{SC_(1.31764602661132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.68128218332560022849151062862300290002816382002147406561122634954071252385092499593221939459869865873066337189640214979139161323980903390581209894104049320132006144228121983278855133934081123751398423334417586315867558772265879539165555345783090329019848075276239846426043655137159253374607313204375273679398119955419857249062342836994545408747733385348346736928923198076278906695111754630162410275969412267739639630188845066288458590745754843970182123421421688608657347772943092724923457373537413777e-01), SC_(2.50455091519863080006567737617454851596080837568745079926261175080989570659578673726466242881105045890267567542084835065570433112497594501436101662253622732503676986129627532303613101872288751267994782026817808674381109734346995384829715512131218462764261510046662595323365526025933703952987521614147369983649867368067869287418530494000899105489059330421493859551233237215950932397638169156132750140846519250994070230478406360849077447064427738507497094901597123294713837766393265188840396610325242108e-01)}},\n                                                              {{SC_(1.33635473251342773437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.72644210557293654073542060086406625986306398124088406711769491620100790420760540376060363403161717387226272332636849641619930464925339803944531929266603507465706542065108113136867046044362596304173454484263029807116355953708147595143804202867331365545502212705865645907773286493184357361549950316863558913715091890954079746952857204650313515355050936769164887155762123877636283908302073199934412972530605773747022445848422608312918511410963171951321236003915112872694863002674706748808090242394674013e-01), SC_(2.32299891668892105578430805968784557325686629203513649173751412362396164213323697012298385908705298284670606095798077758105179389153786963623253782758621229155164273749408854178705238465846547675503227965043919867632856632606716985862406879880250070563911690782986211180882566400301852287461686831670836491595633263904306560640539575748724784015673555715408431433094224299347067526371844509941381534872980427669628158743417929463652365941992113826691670812353814751524843826719411056502918081890211682e-01)}},\n                                                              {{SC_(1.35868787765502929687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.77589214007614615935359180562771861203166061718965339152265847612694400557778882424825354726559526679131378190463366614157230082908624532353686825552961134847897731092392578220212878039351536459454543880630234224638675041433017159708614328391485993736084563916512754386563384570120566452752959876512351316136595224175505892099231154074614562104731051732156166147422341586213471542961144619498740979806752418525675494902597419595759347605843233173004190642974259705891490524545835711058060322698924180e-01), SC_(2.10521563399035850846293344058639880547734577421953544992592199451531878600608929560334781406775399358068856520818402473362854370439100435712010515124940674627273883774342975022165663149085933054914512215716969149912131601383737072603210633382998215613080762106302730395977878722923513835555432768182548632737981806045024087070109825978918059855411453037534752326280434726068704208466819871376329820900372129902093122395293491407971401671172806094740549791747150107306999208279058576893941933708045083e-01)}},\n                                                              {{SC_(1.36104679107666015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.78083095805601987454573074803943470621757804524696784103098140449005639638284361358083062934010737831830783063312546836042296335609289925732230060233333451407917686529015877187030416793493427654808030710998148092926731919176988787289326234540198018431288569972368827591092955147419949536865952244750483357798197466999667993829746941833181764203465732330156288972592614004040835500793593364074829607037302415716045363105826526873673616003512747621072743109454493646420480930668081089526755822913748283e-01), SC_(2.08214931499471487580527212737500656418746457639132995511351210615068938343848506033358245359661394041703442281266292810884445455040891225931387155913258751438141035226449517065251786763225847298217846143225641509156212605618483988613037250889126356687450506812452058374859588919863830693505452777076935690791833854447391737572849335367943607136147722227750905412690739098366592762468180904934634565064553997996536850602898143403118093286692072145247502224184666689326027284268178665916305253016113414e-01)}},\n                                                              {{SC_(1.37006378173828125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.79920780655323574325048032290553442923802914302042449959517032217948051940150581020868536605314435386459203898708604722427631202543713090326644807022874911720884509405045011880194820377740065707611794602426514158781758693026900421398037712389268280235218067448311153013979648678838706874169795220643677990190870933642180225407599463343126098376439581164242726050065349453834012003763877617586777474403726187072521595310016909539569424640310905288009934114205082383526315485778184708537009526195176275e-01), SC_(1.99387220352411812643706162721391972243201742242193475787958496815486029474907430687983391246649586894127152003306028679128609931296024818616213480432671358196302228903498401651517092937484268824835198862075776807808683194099912324765269446453036769957409467627861694009583964690786001732389779565429776808515515017736450229078368649763370096373452237377053728657912280976882682351106748213592796547048629363878065867407923229520949463360810455413121016679444030724292708102255182692318351645333863659e-01)}},\n                                                              {{SC_(1.37360334396362304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.80620384192341085280818940390688592996930713605209325865795280353167597318617674789286503206624638647024427810492949762186006468639432931548924921990375287718613180115266058663420054121130510011093500432590233907644752304593295495326263164317713133789687740999996186308542015177315380533224932052581739319510053805587922178754568124801554813628698943853009281775953423476421434190241967808449688959898443562854457700532916910942532208670140823364856647585716850899032174120857753436343560437861952422e-01), SC_(1.95917488005704498796109337839462311020563464533356224712944059814078278920561867832819886450214797187489939587085888526835962063802556392807082653670784036934320396748454552006182311130900790213674388500137041259099662844726092679222947491447396027724230508542332716957208884897294938245847990852513593101461664259719909071166581138742150607442617905593170491086391650790888740658301124572273285141285519435831995534059396058973595699379902139733254076628925801545908839520914611947748889644366689804e-01)}},\n                                                              {{SC_(1.37579011917114257812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.81046466700929950246668718727336319603422607523486257737752177468390505792022504803078733499622336237569514186945730764657819229620157949505190809705402556212976287179933461585472651303039684488150298524723737283620337889897920345569054449457671306492176333362444469978214852108745968215759045161643806570983234462686298094463645317631449549682235915973343298000368089574358566062623971987254220397400720855377779653358609132128526401680980996939106354687468832044201823937757703711290958140670326488e-01), SC_(1.93772624933505873954526307542792857908119793419071306140786180506660673347469214081509951677829702334822528190190251019855050074377834646317392219744580866160361489259089532138847887047287371437920827424743971700527942058451956937430528654494731672514873731486172998987543330286127627257355443896756851760672491599793182135160951137115300143519605652789579329580837860650478529356618782397844974277048622432233205547812026760264071970210071830565819625688558008931106124303619620049393235119593562032e-01)}},\n                                                              {{SC_(1.38131189346313476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.82101473951433113616030058028945882827700529777659399626299791888315472122893848203122995186993249918138656191198348734122598050722371471038505795184682249083561762735866757721714072734782810762657563932528073571155752961737106346405934750501112839406941959325824904467073234302652189813381035175894782823019339402643440169650165761026339375821668333766483902789516971596613319142475601840957903445030084283730515297138803998334696043029278369165801886898644339520146169940327705952108934099184965051e-01), SC_(1.88352581247039312796004784885792696475588661060726147078352536060782866764818512994083123827030945328076367388613370055013885867405072819276681817228272086206013317353664827033343035360983767879057064569076498155542057096622655089221516370992457224624603085336876933342215313240050182855613227752921675497848476243136725589964476896553566468837178670329761618580278911807843375144698871715377420530960628384366594660855642419370115116659211832265632273031077713314597591180856207916233946464612619948e-01)}},\n                                                              {{SC_(1.39389514923095703125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.84393748984697599494255913228519356500443797238149851639494732303698059390316473854670305205991023687197405840363981298453269251894181637148434103534542073081782734924644439718021321689020417889028131238320809491247476894902458941394325539956411459525912507857369660076279292066105700446665056353874479050722766877388177176029874265985210046842349030812087425559726948928409641894759402387263491889699421786524411665629018248250590827981422167551410817277634443200384399289098727342057754944559471253e-01), SC_(1.75979961813418330463246015346785922996793666199283524740663794915720273003795539409709892289424553224094002289191965889297876634196707865043091465457965056322032412992884309526153698834410862154379415726686609410706343428724975862198717229665810504104156779671263630038970686942846971450207400214891909970201246410306632949413399102387736446279872852586166870223903033833049605211179096732670493723266210161088674326547975842093333122402384746965183213793318184772815360336300118983377180563926983678e-01)}},\n                                                              {{SC_(1.40098953247070312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.85617435504275879052838351473422384140194868085037483863671989201067225619425571115767482271215770496859292537044150740107974152029149839011472238269874887036032939699625000971850206897702187973275492769390535345807412515353236530010768540682551390483886603019487960710475971398347149061935832649656222349711037952773450481944849281665638872163332303576583218021159726525048956435930017186229181305861378734868720812113308950238852844213779810697871054524548057515433074620560538926975013561664615709e-01), SC_(1.68991925339569339604661496424208240093498383477146418615565299727998626345325844611994811159257205982575484035326636993024412027870667349093871119983265587745698136494573535119564056284191038785903655082458002571428229328620639699045804331852797555083547720368648689121007274958950735582630052300967992220928569101056869705451681433318191980600098912075548588729718304540582582836247993674752298538944618403645465934491911133294241205561058621342699438071895927728838513098621388908181305166539103073e-01)}},\n                                                              {{SC_(1.40101575851440429687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.85621867154937990161355741456501379427686529270485157224862649254966022362110443495973438200525536463242664277447890348935691893273536099906456638207162825126576843366652617955303374416503841499587078828970436237045163374727430933757606723294288110511877325710820014268639975529400467350328864739151245994094157058478899664410923370270816718688905971514087797141858843595803287066985538914148795677452085190268952123648657706491750188162484814691673998674800424899515850946008080603852145559474897554e-01), SC_(1.68966076435519353962481075898958477545026123896902065690890676310569504798562202400982815531169410784648901144018478477101528696727403731035179515876213449880962005156426103688847976760828487626389281701587312839145657572681155558686983505422848380769701057226774703457564482651992554580738823901756265324815389555165826073908210955723185833731466146611384227971387719800158982983339977621693099935688345979958646148525722384424484338569211001385904777013357253104499183168338276670653879474853213746e-01)}},\n                                                              {{SC_(1.41011095046997070312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.87117858586820775624965696236564943727361512341866183156650482788896380417914897793279124473515322346483600167082027894761850185430736258876861651247601475778439302962028949350765397163734219392424137650555626708780329712724024737895212969230465645942701271933175672679085979373625902742228817342906406414815750958280697847446219322689649467627772417102771255292832906277996968684852203671520607993434988730178276813572827981795425969341197977862776742515868746300221678580739692370360137716379880437e-01), SC_(1.59994791349497692096310940926922433291994198883744468744005470409078245893996153539802601598737060687483733389757045235896095957400266180075500992364021539221917108997307230046574125251952304461637030186471062562619523234193692618585774925525419040975961516212188872188853608468781398148788251249659314242448691451141375364682157224189761502490697285106725955016342688708103583146450318454637473677756848148946111691551396903396081866701675441083001752543398185132497315372365608059051895513314949579e-01)}},\n                                                              {{SC_(1.42533302307128906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.89438855795183886998786581200513329076368840639634376361595786937211016205369393880525718435864806301335301282401183701106479251675469255403508578069217193848364943684508111845954935570776509998533134936283124529539828304501881046070786528700113675273503484680453633403668330643191207048485739965410736246347483019206275407836155671132435908585093633309518491565179092602495042637961696521026914991832196243209106071985665397845319941148355665755209958322775690891457420342651185239844150245596327947e-01), SC_(1.44950855957173654196257134824365513134133201450079523719697853158105525996193537681649106974620513605006455769791009116959886538550266029282692875824056064287247623191024923923550064333536271085049062725464192365631526069063550184078248236006479591026443959058514786355465785459602357875413912538891346259989738066918341767850367928358981037418135328507988540823626368932440669322691107028465730644797892733370773348508342557416764628129238249741504704236947393363136868043895800163017362575013961290e-01)}},\n                                                              {{SC_(1.43252611160278320312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.90455894212278646682286952361698360750484925762077663955915415425200092204173679261660060857165366316201501332320971411870372367383031067911179925113944816094496441312871796921361407697738122633941915991825088653087265030078891572812182705223138859284267087996754061967690677246219005138926423479120522417515704205304515586665318577648865337189846259000229102696099755825093328193052696327092303622758297319344389570129955773532709225183232222424041153368966111478547808896921857325177982548718771158e-01), SC_(1.37830046144356675250872410437156137418445970379445568874986063770412578264945685021936472202077012022182697513678356960442192390943674941380077529122281760664567764993131196070130465793335691254056246930897428264833632852315773233778709341455031931560142964240737564638602823711734409767185825071947764997918950296406844128918029320519728667997040516955426962206122258344354400413540432792749979019261016751931226200374985412506207323213643522455191228802651442335019461635933485240885233775534028203e-01)}},\n                                                              {{SC_(1.43575048446655273437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.90895160230121997702288446855581405901760081230384889585645562104421752177021923047531084568450326893227703184655477128300485696702546084083636117118819135371141893757016403129691943032247687888381242423926955796509656359721022387715707166150977984559307365089946156361069068208284576434164645941608103890018860366873703274312413864716472668931881280938821103122161489441182439131879713935704611483556687225869596341238675045956872266915280113063921753191332747400724156543076912116754374874750054973e-01), SC_(1.34635736090091818094528204085818356101807997017845390670155478403606606771620855953189545331098032529074637876125914631803457218671363025531396769111554517612885738927295369006431968049166339715409645435369564404672125253442906034702151099344922917418994177825002810347017671706373141382337224796583178154615455960082217078332717493653904158690181583515356788176235405991881547549149452753027065371587653125663516719462714534171084475796198006533859917606833628107186105787809101967470779035305450920e-01)}},\n                                                              {{SC_(1.43626022338867187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.90963660568134094400971901498988905319554266361075315281949278115893947953256979043383147606632955045753627672782128846852191033978891970221149746867578886482678747387800642996493640522219736150214876489388752111581525484145661461989583738801301682758872224572425127995699599203450570258361503179471293916821074295053494693378034402025673654196231274987906991244583192913828304407994756526024395389425156962038699675288302931357316631745952940420722432935854198084810119889611812838202854327047087633e-01), SC_(1.34130620789601643297435177545524001954141391748474759563452684046937170171124919131936400073282912787645653259241880684313416126416211409025645824655684246053734081280628162746192535860988794701161895027084056830536993050641113632462258021194830151178607327486814897660784369677235245490434876385754524750500204601522349690543772219788636263128283700192373357633279535557585911804179534914355347076739942876595712160644569672695775037899587969833017668537631078189945084691339552998027255384326844140e-01)}},\n                                                              {{SC_(1.43893671035766601562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.91319109575353827009524291495439092992609811853229821159166159151103901148532756099292375393658980856687146260362406220995470141661061317103167670220098478568248794744003136334741272352694999145446914008031920389605991216195136102162640563302102813627231858860137114375389133133397415527784515231042189322930600081954067068979704162550063898754530920501246869992971165629667699438110645545498170415962658239563515234890345521891246987256466209364284808469885035281015898704958784193974691004150021440e-01), SC_(1.31477842204409608143481604778289471096989432741883764052857915784986484318032634024067139351793577350976858922540277282623045875976061356613691647950469635616570216317069615463470059393814873032370292336786402935014974684094100738552918070641543653862350399204902298268031885011842932620245754790505398283832018177439959836755940979102516771954166434909998171784510426184975048758424286402781599100148540714546447711769856438806916702480649813828940835784901933444901276957152379932153447509228696137e-01)}},\n                                                              {{SC_(1.43923854827880859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.91358749415694718375338446318520938245933399170216515550162277117477391720337296530042486538615494659392608853197762294151718033779623260069710976312896628717586901774481690096841376459649622902116531379807543817349138434425583628639937086422980602415256616704269488506418530308517347564085682123911519216119823363516075742620608973853091856105663492745369073548016404817781648983470056148620342542897508768583078218568602415975758720531150787539258203631976055122050762021258847803225815586413983594e-01), SC_(1.31178618520511210932639613646562667970910211143447525041763259377225077944033963198139901656474403253313311900854623885170093549689579895346253603161951404971637347127491269985682548787839965097189544180076866803717837988248791973444620625374673968739089275753356956276391050058192244847228373681483681343061322393838820468731882412707831450554284369063204798723878265096994905601911657910504170961317716023507473626505888920988030515505601969581368230219763312001217408116589019985350643427759453027e-01)}},\n                                                              {{SC_(1.43961572647094726562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.91408156611675707296664656058223080152485128775574649173021236987320160261145962178762573763867204348773339812210608561100661146497081024184848594028960145235706699880715910562953861200253810695797510258001811213168246891397479444794767683027181509397456942656840768865307567123173491515632186886152415447993081560133963732169955082791633660308902637129969728163244325298495434764536351360777449422859214749223257906073184866030661311732376603554906787343524537507972606605117568102379976898997387556e-01), SC_(1.30804690297554290504989423846664214343871971288892730248455107330480322598111478527291294656586536354347060079501463191824637278899579789830724823242348033342333742371700916702509134210059650531852817443296827350488198919145626370767974551816464494406170646945206485942489762762056106891367852891043967425985347102892606683294114815073381752131566806564187749932742216915803605939012920924230774615714791230728265624437944193225253025470901610417643068522722728430878240416873384568643829313305535027e-01)}},\n                                                              {{SC_(1.44733238220214843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.92388003924177313140090027971915918584257628279020219474834338435924744461556664826937218895846315344351959435620232974461413412660625327718605557450020435740353207685195892183491583378240589992265493490175020140561282535656023176931718779705642570303800362770035646009247080796429678251537352734587121374533778369237837973021704239350832647444669642055605296497584322482667084736622674001731471182384738548849145026540595340207684378319043448448375976983562094694763759141523233441297963867807173230e-01), SC_(1.23150516309867875989569500091859949538209314932271743672937839136536501764869171434751888595099441665884508703820137465595390996452770295560950163144838266096299820229745872851223264952301951583171652940286501789832523596307854150203819900567360148429999324024127583351335571985879527474760460123624195719269010080647337703374150788251690634185963743503086320018503677388753932389411896123706087229183305362380691808334014583261378865654194061555906317934047697173152604178316357472971054644931431007e-01)}},\n                                                              {{SC_(1.44744920730590820312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.92402384223882789932261167425343450246956345459586286370336167352566852171621116458593647705802173528121507646228587446217386261770854494486472079130461840033751569077191235116879649490897128782846926355137884452312288880211033422612152460072911482530288128569393084939527997746297498300862428618077679314338568003724382747131398401869970818675030832582905678960788419233415037831678397997028491476723422057386731673921794812002654045501668179874746043063590611649424932881749747850199999649458980332e-01), SC_(1.23034579638217625029872282272402437662093252013182327996821295956822978452419259217048913138605637521619464291253863182650817791682056273134695984571528196607840573470807701589977902167891230627949542905867599039057826790021360258199521140849548290900785404111420099350972186162756949436658730757354190824081339428667944721803530652607059601295242664233649552435918280060710052841718723858516493198074231988111624685499136821860174842545366428551676343529394855788994773464430657466696951765655081137e-01)}},\n                                                              {{SC_(1.45154237747192382812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.92897670924410531455308403067195670028166438299545559217547024316039582474703048515572995385737263658775525140179896272492682727904755237837950242303032893320399392340524679763156054755798499200503708258833780300903783645433313620255464751916379090634079587697883676031786033937972412617753201880865592252516901165029948342610525988212251655766536877387133775131843264659894018569911003548054019687818715867363301061741589797231839706403520055095055989644698443913520699876764791371583654897816260752e-01), SC_(1.18971488487288304308425699210614719866878259676804804262846896571022601257545817282175995659728561527339387857587830788109332577117011986425932901344366978967352649545020809657624889841948708848929261420409010627364470837074847218316673600693253526576654165766705835056357817622597952581949808041989979706804283927703846598812892491431255024889245682296352331155850394323676087358406346137369111543419082047067595620398532071247556766820276593583587556123889897153525352863626314107635487884572998426e-01)}},\n                                                              {{SC_(1.45330142974853515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.93105411740343505979941692065212954734817555914074650281588114038233678075276394011281531825927323565721676809068049180242769051762192574807268658746464170597014860395374014702172519273733548176632886082595693891351425720343131787988496468579795432317171238483180139422234210372749213206588283534233831908394582654231750575686783875745511809042593129988278841999995524050769441525637738892576778838033277871692659550467516595634343802643379683228631743812937611330519329616827468576341825528132052336e-01), SC_(1.17224746414922113394680459621138654141515011468565470547501509905431672693738276955358228769564509462137569555299014927161641678112156176912374444048091919642849459540872135016797222796525448414106745029017241368167842038210883973473987358596838846975718240227122399101468532167473154373896203436806908913091121947162452896071564092737961908660984482393247148789843287711178022307994232547371668339453767902590820307947458700379454535785143261333718503831510741892113212862974188905351819040231571308e-01)}},\n                                                              {{SC_(1.45588922500610351562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.93405439789757141275202601364355779502679848734651978182155130072168276482638826307412791668860025733070999061755033321901886773799227371917222595289420747085427784871438532344797731199223428339013161791677570085265437560296083277340845904465956638418345392999864987861028929290148714050330685270670948455026609008733297837390643273232248915759554146794901132364794027334453505635161634851655441841286677285556554929761224110017992819251284010541747937525942378738773667656679523684139733660561250454e-01), SC_(1.14654403300175083648655241424713554876591410670899082802706257994408600890374804156744972009245333224858858840058865138728143319116190374735741716940083629338564479621306357085959924901450353848857626798452776676039763227965830495379918013430493486371677347432381790712020223595336542260879737099747022574632060518401383064409905884124848180841992448644395615313940886011062062975865185967646280984788987330078321682531189251440331206378939892631509660362968636990584420084242504975617656278628117103e-01)}},\n                                                              {{SC_(1.47166442871093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.95090455929404666006154823168144087189140053255522339316806520598490841109867383633977530535018659423876097071858161130203706649002027525940404478895698367390354260462433431675488818940998152329248038804193093807009906773861589081969360477762624353775906996639062265252175967961550873009581733911335420867297760020697540822045266366770530036973389680212375467050585559942092343814379574239413774425890235854531425676118483749702011351971360190721833433641572164265515387155347107711295271352712743920e-01), SC_(9.89696141156948746533779105739509719701859485070413706167484933115112066336174440361597142496460529005477561627345324008350535949128391226579786599207708363053074301827988346459788334279429737675780235245888898300686596905930790877873637403683928778470682731019204053504784430768910655143803501705308467894729067255148499639765331390047487792750517217890381326189053380138858456505067986074977471820348175139209916889960977991394445595370464003745273811411030937898173471905892363724061478289793119348e-02)}},\n                                                              {{SC_(1.48118925094604492187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.95987971581469849835212192761387433880948032799743403113405841762301737272660663272771126085311509092947080459948251558013435279217583393463811660766402644800234944489251699740786371879736855583038422681603128446143622034878159613520219538075200024898473039195144740678733899601210689307500632218154184430050627947647985952105033868309795151096435214211084770689499068527480958647335117598393401054903120640089430217860460804499994297927249386845726766898814799195449319720578659538420256997308211025e-01), SC_(8.94872083877310745992995729453189430370374216494843644464203198739023378590658969785214597002302119076433271051158949450602535037208901054605904460051131565768944344714994340047575313236362345896146244898245040780545731961335279415963661509788420847604974741441811091560365159585870007428861114817117469981394171402847618853548699252957873293345224676542413493010857730777156556972874471318434497632251719969283577188808589709859828953081848004422162716626512357272747440738023351312980295536798316922e-02)}},\n                                                              {{SC_(1.48278236389160156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.96129270838430119300051168101128018381711663975084689464093791562764752253731121972874715487882382751179770152493027118683467727036964708520634542103501485669757146226438488081878080926649554606187846378195600014774584360969390987124603322695895627803222154125777080064227842041901715773894330691637378759131986041012989252185848914840073182305921568081447589877312031877944980532384362610432698158884417534261275444275397015596380868316425733585342742440883714085896222445321624407650811982586296636e-01), SC_(8.79003741681315821251280686027308782114586877469765715995387548225892541129646634622181193716483073221684877664769071763743258458728042536681305436365814040903460426066931360249824421763839424383563759428429066149167258244393099606620797760427563923085307430292326673397490669016001630596625436022406452453276617767081117940821836317631747493227941287539612890181193545073004560915169680617098938412078376539261936819313380292445951887013297284686257609312633392205252300434267806647195017089621710655e-02)}},\n                                                              {{SC_(1.48932170867919921875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.96682778918135881536275990842605733339523038813167252150321614421595525838928211021490885982758765990951313520268744178158346030034831122597669741414660123131649499595170494000918804089933602318505074023337014767210419674606196522230870351450346722685462669386186899171200820043924773724372012377225749522475547961748742969344987224598725348359245989549214445144233239343849591742100654576204916431612729728023490540829084798820588062343315674262313864097725179428828982666540343368732780105039454552e-01), SC_(8.13845084031492640613386104575625537797314524719600723400961398682265346258342553800702435865044529994514493269349360241716452021150170976184564475930349320327294213744778471680231255567737036617811154621323506663548592662785646800499829866106486293702489790533055529549635178889628268927391706714202367178496631902276183977618547547514283224465880040875138298723442763757980830113435205370560834162520016704500157651115626101042762031082967251945734212875798186029500136459910061696644610683824984172e-02)}},\n                                                              {{SC_(1.49110269546508789062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.96826142879974523863831045963884109600409432642463162064145662688965036053042311506387703651817442121009205293172616437818555258112251730073632334612968938357736365937318953971797778938245108123188897428261195201653763029717278994009284610609918683798387178776970008741366601835926335083641809206050796411321487406184056687220549994528554465293966740994858430339601520279341278775826310640952951225475713531037110335618328239225533137083081585843611982466861028545104133721132301207113669094208158152e-01), SC_(7.96093014102787857311853897169714896003178997833084509746261920212282904923245728708338229611953838785802609515963050682205601178649541846223606669995712553087046533525243208438038611435636700879519384389078441175165514979582616566905525683674375742838422423588917802839236707296641241280017877960271241566981191179744385341858916524101345194801390243168621344421220012275921118083354308199733352187061121123492182523906644632947523518443805234926530481306985017526225224799204564632165926385889633624e-02)}},\n                                                              {{SC_(1.49469184875488281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.97105451691637836980566977886191495470310625478984302514468734081978317004712365179572388160094873766545892259684126612171730371334431713402903857531243843855031719141960805464286066705907297221591074259625271788178601626673326754719816154765918422856170761025895221537060495081964634143881365727528637573199554544101393148199185537988251924073321046398397270592899501388280072694753480150196648362062195285790390273399747995245778399713979670854796624214784952767383795902013605892666997263955330095e-01), SC_(7.60310344978606994311454252807960986535803469428379193529425796476644344334413001865738243975566508261589698713562091901145249736705485695273728137391377751615494502695150924195446763383201607951069471691560757133118887684442353070862022248337360915742210326532477359739395822627983312298986859616214217003217070111399151039551118513567199164797534425187953687276545896053419230138261452230491054544837629498576689887971671483487696900902095055042924520918068327882892863731988941436799798706418513466e-02)}}}};\n//#undef SC_\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/skeleton_backend.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2020 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MATH_SKELETON_BACKEND_HPP\n#define BOOST_MATH_SKELETON_BACKEND_HPP\n\n#include <boost/multiprecision/number.hpp>\n#include <boost/container_hash/hash.hpp>\n\nnamespace boost {\nnamespace multiprecision {\nnamespace backends {\n\n/*\nThis header defines one type - skeleton_backend - which declares the minimal\ninterface to qualify as a backend for class number.  In addition you'll find\noptional interfaces declared commented out - you can enable these or not as\nneeded.\n\nThe process of writing a new backend for class number then reduces to a search\nand replace to change the name of this class to something meaningful, followed\nby \"filling in the blanks\" of each of the methods.\n\nNOTE: all of the methods shown below are simple declarations, be sure to make them\ninline, constexpr and/or noexcept as appropriate - as these annotations propogate\nupwards to operations on number<>'s.\n\nIf the backend is to be itself a template, thn you will have rather more editing to\ndo to add all the \"template<...>\" prefixes to the functions.\n\n*/\n\n\nstruct skeleton_backend\n{\n   //\n   // Each backend need to declare 3 type lists which declare the types\n   // with which this can interoperate.  These lists must at least contain\n   // the widest type in each category - so \"long long\" must be the final\n   // type in the signed_types list for example.  Any narrower types if not\n   // present in the list will get promoted to the next wider type that is\n   // in the list whenever mixed arithmetic involving that type is encountered.\n   //\n   typedef std::tuple</*signed char, short, int, long,*/ long long>                                     signed_types;\n   typedef std::tuple</* unsigned char, unsigned short, unsigned, unsigned long,*/ unsigned long long>  unsigned_types;\n   typedef std::tuple</*float, double,*/ long double>                                                   float_types;\n   //\n   // This typedef is only required if this is a floating point type, it is the type\n   // which holds the exponent:\n   //\n   typedef int                                                         exponent_type;\n\n   // We must have a default constructor:\n   skeleton_backend();\n   skeleton_backend(const skeleton_backend& o);\n   skeleton_backend(skeleton_backend&& o);\n\n   // Optional constructors, we can make this type slightly more efficient\n   // by providing constructors from any type we can handle natively.\n   // These will also cause number<> to be implicitly constructible\n   // from these types unless we make such constructors explicit.\n   //\n   // skeleton_backend(int o);  // If there's an efficient initialisation from int for example.\n\n   //\n   // In the absense of converting constructors, operator= takes the strain.\n   // In addition to the usual suspects, there must be one operator= for each type\n   // listed in signed_types, unsigned_types, and float_types plus a string constructor.\n   //\n   skeleton_backend& operator=(const skeleton_backend& o);\n   skeleton_backend& operator=(skeleton_backend&& o);\n   skeleton_backend& operator=(unsigned long long i);\n   skeleton_backend& operator=(long long i);\n   skeleton_backend& operator=(long double i);\n   skeleton_backend& operator=(const char* s);\n\n   void swap(skeleton_backend& o);\n   std::string str(std::streamsize digits, std::ios_base::fmtflags f) const;\n   void        negate();\n   int         compare(const skeleton_backend& o) const;\n   //\n   // Comparison with arithmetic types, default just constructs a temporary:\n   //\n   template <class A>\n   typename std::enable_if<boost::multiprecision::detail::is_arithmetic<A>::value, int>::type compare(A i) const\n   {\n      skeleton_backend t;\n      t = i;  //  Note: construct directly from i if supported.\n      return compare(t);\n   }\n};\n\n//\n// Required non-members:\n//\nvoid eval_add(skeleton_backend& a, const skeleton_backend& b);\nvoid eval_subtract(skeleton_backend& a, const skeleton_backend& b);\nvoid eval_multiply(skeleton_backend& a, const skeleton_backend& b);\nvoid eval_divide(skeleton_backend& a, const skeleton_backend& b);\n//\n// Required only for integer types:\n//\nvoid eval_modulus(skeleton_backend& a, const skeleton_backend& b);\nvoid eval_bitwise_and(skeleton_backend& a, const skeleton_backend& b);\nvoid eval_bitwise_or(skeleton_backend& a, const skeleton_backend& b);\nvoid eval_bitwise_xor(skeleton_backend& a, const skeleton_backend& b);\nvoid eval_complement(skeleton_backend& a, const skeleton_backend& b);\nvoid eval_left_shift(skeleton_backend& a, unsigned shift);\nvoid eval_right_shift(skeleton_backend& a, unsigned shift);\n//\n// Conversions: must include at least unsigned long long, long long and long double.\n// Everything else is entirely optional:\n//\nvoid eval_convert_to(unsigned long long* result, const skeleton_backend& backend);\nvoid eval_convert_to(long long* result, const skeleton_backend& backend);\nvoid eval_convert_to(long double* result, const skeleton_backend& backend);\n\n//void eval_convert_to(unsigned long* result, const skeleton_backend& backend);\n//void eval_convert_to(unsigned* result, const skeleton_backend& backend);\n//void eval_convert_to(unsigned short* result, const skeleton_backend& backend);\n//void eval_convert_to(unsigned char* result, const skeleton_backend& backend);\n\n//void eval_convert_to(char* result, const skeleton_backend& backend);\n\n//void eval_convert_to(long* result, const skeleton_backend& backend);\n//void eval_convert_to(int* result, const skeleton_backend& backend);\n//void eval_convert_to(short* result, const skeleton_backend& backend);\n//void eval_convert_to(signed char* result, const skeleton_backend& backend);\n\n//void eval_convert_to(double* result, const skeleton_backend& backend);\n//void eval_convert_to(float* result, const skeleton_backend& backend);\n\n//\n// Operations which are required *only* if we have a floating point type:\n//\nvoid eval_frexp(skeleton_backend& result, const skeleton_backend& arg, skeleton_backend::exponent_type* p_exponent);\nvoid eval_frexp(skeleton_backend& result, const skeleton_backend& arg, int* p_exponent);  // throws a runtime_error if the exponent is too large for an int\nvoid eval_ldexp(skeleton_backend& result, const skeleton_backend& arg, skeleton_backend::exponent_type exponent);\nvoid eval_ldexp(skeleton_backend& result, const skeleton_backend& arg, int exponent);\nvoid eval_floor(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_ceil(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_sqrt(skeleton_backend& result, const skeleton_backend& arg);\n//\n// Operations defined *only* if we have a complex number type, type\n// skeleton_real_type is assumed to be the real number type matching\n// this type.\n//\nvoid eval_conj(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_proj(skeleton_backend& result, const skeleton_backend& arg);\n//void eval_real(skeleton_real_type& result, const skeleton_backend& arg);\n//void eval_set_real(skeleton_real_type& result, const skeleton_backend& arg);\n//void eval_imag(skeleton_real_type& result, const skeleton_backend& arg);\n//void eval_set_real(skeleton_type& result, const skeleton_real_type& arg);\n//void eval_set_imag(skeleton_type& result, const skeleton_real_type& arg);\n\n//\n// Hashing support, not strictly required, but it is used in our tests:\n//\nstd::size_t hash_value(const skeleton_backend& arg);\n//\n// We're now into strictly optional requirements, everything that follows is\n// nice to have, but can be synthesised from the operators above if required.\n// Typically these operations are here to improve performance and reduce the\n// number of temporaries created.\n//\n// assign_components: required number types with 2 seperate components (rationals and complex numbers).\n// Type skeleton_component_type is whatever the corresponding backend type for the components is:\n//\n//void assign_conponents(skeleton_backend& result, skeleton_component_type const& a, skeleton_component_type const& b);\n//\n// Again for arithmetic types, overload for whatever arithmetic types are directly supported:\n//\n//void assign_conponents(skeleton_backend& result, double a, double b);\n//\n// Optional comparison operators:\n//\n#if 0\n\nbool eval_is_zero(const skeleton_backend& arg);\nint eval_get_sign(const skeleton_backend& arg);\n\nbool eval_eq(const skeleton_backend& a, const skeleton_backend& b);\nbool eval_eq(const skeleton_backend& a, unsigned long long b);\nbool eval_eq(const skeleton_backend& a, unsigned long b);\nbool eval_eq(const skeleton_backend& a, unsigned b);\nbool eval_eq(const skeleton_backend& a, unsigned short b);\nbool eval_eq(const skeleton_backend& a, unsigned char b);\nbool eval_eq(const skeleton_backend& a, long long b);\nbool eval_eq(const skeleton_backend& a, long b);\nbool eval_eq(const skeleton_backend& a, int b);\nbool eval_eq(const skeleton_backend& a, short b);\nbool eval_eq(const skeleton_backend& a, signed char b);\nbool eval_eq(const skeleton_backend& a, char b);\nbool eval_eq(const skeleton_backend& a, long double b);\nbool eval_eq(const skeleton_backend& a, double b);\nbool eval_eq(const skeleton_backend& a, float b);\n\nbool eval_eq(unsigned long long a, const skeleton_backend& b);\nbool eval_eq(unsigned long a, const skeleton_backend& b);\nbool eval_eq(unsigned a, const skeleton_backend& b);\nbool eval_eq(unsigned short a, const skeleton_backend& b);\nbool eval_eq(unsigned char a, const skeleton_backend& b);\nbool eval_eq(long long a, const skeleton_backend& b);\nbool eval_eq(long a, const skeleton_backend& b);\nbool eval_eq(int a, const skeleton_backend& b);\nbool eval_eq(short a, const skeleton_backend& b);\nbool eval_eq(signed char a, const skeleton_backend& b);\nbool eval_eq(char a, const skeleton_backend& b);\nbool eval_eq(long double a, const skeleton_backend& b);\nbool eval_eq(double a, const skeleton_backend& b);\nbool eval_eq(float a, const skeleton_backend& b);\n\nbool eval_lt(const skeleton_backend& a, const skeleton_backend& b);\nbool eval_lt(const skeleton_backend& a, unsigned long long b);\nbool eval_lt(const skeleton_backend& a, unsigned long b);\nbool eval_lt(const skeleton_backend& a, unsigned b);\nbool eval_lt(const skeleton_backend& a, unsigned short b);\nbool eval_lt(const skeleton_backend& a, unsigned char b);\nbool eval_lt(const skeleton_backend& a, long long b);\nbool eval_lt(const skeleton_backend& a, long b);\nbool eval_lt(const skeleton_backend& a, int b);\nbool eval_lt(const skeleton_backend& a, short b);\nbool eval_lt(const skeleton_backend& a, signed char b);\nbool eval_lt(const skeleton_backend& a, char b);\nbool eval_lt(const skeleton_backend& a, long double b);\nbool eval_lt(const skeleton_backend& a, double b);\nbool eval_lt(const skeleton_backend& a, float b);\n\nbool eval_lt(unsigned long long a, const skeleton_backend& b);\nbool eval_lt(unsigned long a, const skeleton_backend& b);\nbool eval_lt(unsigned a, const skeleton_backend& b);\nbool eval_lt(unsigned short a, const skeleton_backend& b);\nbool eval_lt(unsigned char a, const skeleton_backend& b);\nbool eval_lt(long long a, const skeleton_backend& b);\nbool eval_lt(long a, const skeleton_backend& b);\nbool eval_lt(int a, const skeleton_backend& b);\nbool eval_lt(short a, const skeleton_backend& b);\nbool eval_lt(signed char a, const skeleton_backend& b);\nbool eval_lt(char a, const skeleton_backend& b);\nbool eval_lt(long double a, const skeleton_backend& b);\nbool eval_lt(double a, const skeleton_backend& b);\nbool eval_lt(float a, const skeleton_backend& b);\n\nbool eval_gt(const skeleton_backend& a, const skeleton_backend& b);\nbool eval_gt(const skeleton_backend& a, unsigned long long b);\nbool eval_gt(const skeleton_backend& a, unsigned long b);\nbool eval_gt(const skeleton_backend& a, unsigned b);\nbool eval_gt(const skeleton_backend& a, unsigned short b);\nbool eval_gt(const skeleton_backend& a, unsigned char b);\nbool eval_gt(const skeleton_backend& a, long long b);\nbool eval_gt(const skeleton_backend& a, long b);\nbool eval_gt(const skeleton_backend& a, int b);\nbool eval_gt(const skeleton_backend& a, short b);\nbool eval_gt(const skeleton_backend& a, signed char b);\nbool eval_gt(const skeleton_backend& a, char b);\nbool eval_gt(const skeleton_backend& a, long double b);\nbool eval_gt(const skeleton_backend& a, double b);\nbool eval_gt(const skeleton_backend& a, float b);\n\nbool eval_gt(unsigned long long a, const skeleton_backend& b);\nbool eval_gt(unsigned long a, const skeleton_backend& b);\nbool eval_gt(unsigned a, const skeleton_backend& b);\nbool eval_gt(unsigned short a, const skeleton_backend& b);\nbool eval_gt(unsigned char a, const skeleton_backend& b);\nbool eval_gt(long long a, const skeleton_backend& b);\nbool eval_gt(long a, const skeleton_backend& b);\nbool eval_gt(int a, const skeleton_backend& b);\nbool eval_gt(short a, const skeleton_backend& b);\nbool eval_gt(signed char a, const skeleton_backend& b);\nbool eval_gt(char a, const skeleton_backend& b);\nbool eval_gt(long double a, const skeleton_backend& b);\nbool eval_gt(double a, const skeleton_backend& b);\nbool eval_gt(float a, const skeleton_backend& b);\n#endif\n\n//\n// Arithmetic operations, starting with addition:\n//\n#if 0\nvoid eval_add(skeleton_backend& result, unsigned long long arg);\nvoid eval_add(skeleton_backend& result, unsigned long arg);\nvoid eval_add(skeleton_backend& result, unsigned arg);\nvoid eval_add(skeleton_backend& result, unsigned short arg);\nvoid eval_add(skeleton_backend& result, unsigned char arg);\nvoid eval_add(skeleton_backend& result, char arg);\nvoid eval_add(skeleton_backend& result, long long arg);\nvoid eval_add(skeleton_backend& result, long arg);\nvoid eval_add(skeleton_backend& result, int arg);\nvoid eval_add(skeleton_backend& result, short arg);\nvoid eval_add(skeleton_backend& result, signed char arg);\nvoid eval_add(skeleton_backend& result, long double arg);\nvoid eval_add(skeleton_backend& result, double arg);\nvoid eval_add(skeleton_backend& result, float arg);\n\nvoid eval_add(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_add(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);\nvoid eval_add(skeleton_backend& result, const skeleton_backend& a, unsigned long b);\nvoid eval_add(skeleton_backend& result, const skeleton_backend& a, unsigned b);\nvoid eval_add(skeleton_backend& result, const skeleton_backend& a, unsigned short b);\nvoid eval_add(skeleton_backend& result, const skeleton_backend& a, unsigned char b);\nvoid eval_add(skeleton_backend& result, const skeleton_backend& a, long long b);\nvoid eval_add(skeleton_backend& result, const skeleton_backend& a, long b);\nvoid eval_add(skeleton_backend& result, const skeleton_backend& a, int b);\nvoid eval_add(skeleton_backend& result, const skeleton_backend& a, short b);\nvoid eval_add(skeleton_backend& result, const skeleton_backend& a, signed char b);\nvoid eval_add(skeleton_backend& result, const skeleton_backend& a, char b);\nvoid eval_add(skeleton_backend& result, const skeleton_backend& a, long double b);\nvoid eval_add(skeleton_backend& result, const skeleton_backend& a, double b);\nvoid eval_add(skeleton_backend& result, const skeleton_backend& a, float b);\n\nvoid eval_add(skeleton_backend& result, unsigned long long b, const skeleton_backend& a);\nvoid eval_add(skeleton_backend& result, unsigned long b, const skeleton_backend& a);\nvoid eval_add(skeleton_backend& result, unsigned b, const skeleton_backend& a);\nvoid eval_add(skeleton_backend& result, unsigned short b, const skeleton_backend& a);\nvoid eval_add(skeleton_backend& result, unsigned char b, const skeleton_backend& a);\nvoid eval_add(skeleton_backend& result, long long b, const skeleton_backend& a);\nvoid eval_add(skeleton_backend& result, long b, const skeleton_backend& a);\nvoid eval_add(skeleton_backend& result, int b, const skeleton_backend& a);\nvoid eval_add(skeleton_backend& result, short b, const skeleton_backend& a);\nvoid eval_add(skeleton_backend& result, signed char b, const skeleton_backend& a);\nvoid eval_add(skeleton_backend& result, char b, const skeleton_backend& a);\nvoid eval_add(skeleton_backend& result, long double b, const skeleton_backend& a);\nvoid eval_add(skeleton_backend& result, double b, const skeleton_backend& a);\nvoid eval_add(skeleton_backend& result, float b, const skeleton_backend& a);\n#endif\n\n//\n// Subtraction:\n//\n#if 0\nvoid eval_subtract(skeleton_backend& result, unsigned long long arg);\nvoid eval_subtract(skeleton_backend& result, unsigned long arg);\nvoid eval_subtract(skeleton_backend& result, unsigned arg);\nvoid eval_subtract(skeleton_backend& result, unsigned short arg);\nvoid eval_subtract(skeleton_backend& result, unsigned char arg);\nvoid eval_subtract(skeleton_backend& result, char arg);\nvoid eval_subtract(skeleton_backend& result, long long arg);\nvoid eval_subtract(skeleton_backend& result, long arg);\nvoid eval_subtract(skeleton_backend& result, int arg);\nvoid eval_subtract(skeleton_backend& result, short arg);\nvoid eval_subtract(skeleton_backend& result, signed char arg);\nvoid eval_subtract(skeleton_backend& result, long double arg);\nvoid eval_subtract(skeleton_backend& result, double arg);\nvoid eval_subtract(skeleton_backend& result, float arg);\n\nvoid eval_subtract(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);\nvoid eval_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned long b);\nvoid eval_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned b);\nvoid eval_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned short b);\nvoid eval_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned char b);\nvoid eval_subtract(skeleton_backend& result, const skeleton_backend& a, long long b);\nvoid eval_subtract(skeleton_backend& result, const skeleton_backend& a, long b);\nvoid eval_subtract(skeleton_backend& result, const skeleton_backend& a, int b);\nvoid eval_subtract(skeleton_backend& result, const skeleton_backend& a, short b);\nvoid eval_subtract(skeleton_backend& result, const skeleton_backend& a, signed char b);\nvoid eval_subtract(skeleton_backend& result, const skeleton_backend& a, char b);\nvoid eval_subtract(skeleton_backend& result, const skeleton_backend& a, long double b);\nvoid eval_subtract(skeleton_backend& result, const skeleton_backend& a, double b);\nvoid eval_subtract(skeleton_backend& result, const skeleton_backend& a, float b);\n\nvoid eval_subtract(skeleton_backend& result, unsigned long long b, const skeleton_backend& a);\nvoid eval_subtract(skeleton_backend& result, unsigned long b, const skeleton_backend& a);\nvoid eval_subtract(skeleton_backend& result, unsigned b, const skeleton_backend& a);\nvoid eval_subtract(skeleton_backend& result, unsigned short b, const skeleton_backend& a);\nvoid eval_subtract(skeleton_backend& result, unsigned char b, const skeleton_backend& a);\nvoid eval_subtract(skeleton_backend& result, long long b, const skeleton_backend& a);\nvoid eval_subtract(skeleton_backend& result, long b, const skeleton_backend& a);\nvoid eval_subtract(skeleton_backend& result, int b, const skeleton_backend& a);\nvoid eval_subtract(skeleton_backend& result, short b, const skeleton_backend& a);\nvoid eval_subtract(skeleton_backend& result, signed char b, const skeleton_backend& a);\nvoid eval_subtract(skeleton_backend& result, char b, const skeleton_backend& a);\nvoid eval_subtract(skeleton_backend& result, long double b, const skeleton_backend& a);\nvoid eval_subtract(skeleton_backend& result, double b, const skeleton_backend& a);\nvoid eval_subtract(skeleton_backend& result, float b, const skeleton_backend& a);\n#endif\n\n//\n// Multiplication:\n//\n#if 0\nvoid eval_multiply(skeleton_backend& result, unsigned long long arg);\nvoid eval_multiply(skeleton_backend& result, unsigned long arg);\nvoid eval_multiply(skeleton_backend& result, unsigned arg);\nvoid eval_multiply(skeleton_backend& result, unsigned short arg);\nvoid eval_multiply(skeleton_backend& result, unsigned char arg);\nvoid eval_multiply(skeleton_backend& result, char arg);\nvoid eval_multiply(skeleton_backend& result, long long arg);\nvoid eval_multiply(skeleton_backend& result, long arg);\nvoid eval_multiply(skeleton_backend& result, int arg);\nvoid eval_multiply(skeleton_backend& result, short arg);\nvoid eval_multiply(skeleton_backend& result, signed char arg);\nvoid eval_multiply(skeleton_backend& result, long double arg);\nvoid eval_multiply(skeleton_backend& result, double arg);\nvoid eval_multiply(skeleton_backend& result, float arg);\n\nvoid eval_multiply(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_multiply(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);\nvoid eval_multiply(skeleton_backend& result, const skeleton_backend& a, unsigned long b);\nvoid eval_multiply(skeleton_backend& result, const skeleton_backend& a, unsigned b);\nvoid eval_multiply(skeleton_backend& result, const skeleton_backend& a, unsigned short b);\nvoid eval_multiply(skeleton_backend& result, const skeleton_backend& a, unsigned char b);\nvoid eval_multiply(skeleton_backend& result, const skeleton_backend& a, long long b);\nvoid eval_multiply(skeleton_backend& result, const skeleton_backend& a, long b);\nvoid eval_multiply(skeleton_backend& result, const skeleton_backend& a, int b);\nvoid eval_multiply(skeleton_backend& result, const skeleton_backend& a, short b);\nvoid eval_multiply(skeleton_backend& result, const skeleton_backend& a, signed char b);\nvoid eval_multiply(skeleton_backend& result, const skeleton_backend& a, char b);\nvoid eval_multiply(skeleton_backend& result, const skeleton_backend& a, long double b);\nvoid eval_multiply(skeleton_backend& result, const skeleton_backend& a, double b);\nvoid eval_multiply(skeleton_backend& result, const skeleton_backend& a, float b);\n\nvoid eval_multiply(skeleton_backend& result, unsigned long long b, const skeleton_backend& a);\nvoid eval_multiply(skeleton_backend& result, unsigned long b, const skeleton_backend& a);\nvoid eval_multiply(skeleton_backend& result, unsigned b, const skeleton_backend& a);\nvoid eval_multiply(skeleton_backend& result, unsigned short b, const skeleton_backend& a);\nvoid eval_multiply(skeleton_backend& result, unsigned char b, const skeleton_backend& a);\nvoid eval_multiply(skeleton_backend& result, long long b, const skeleton_backend& a);\nvoid eval_multiply(skeleton_backend& result, long b, const skeleton_backend& a);\nvoid eval_multiply(skeleton_backend& result, int b, const skeleton_backend& a);\nvoid eval_multiply(skeleton_backend& result, short b, const skeleton_backend& a);\nvoid eval_multiply(skeleton_backend& result, signed char b, const skeleton_backend& a);\nvoid eval_multiply(skeleton_backend& result, char b, const skeleton_backend& a);\nvoid eval_multiply(skeleton_backend& result, long double b, const skeleton_backend& a);\nvoid eval_multiply(skeleton_backend& result, double b, const skeleton_backend& a);\nvoid eval_multiply(skeleton_backend& result, float b, const skeleton_backend& a);\n#endif\n\n//\n// Division:\n//\n#if 0\nvoid eval_divide(skeleton_backend& result, unsigned long long arg);\nvoid eval_divide(skeleton_backend& result, unsigned long arg);\nvoid eval_divide(skeleton_backend& result, unsigned arg);\nvoid eval_divide(skeleton_backend& result, unsigned short arg);\nvoid eval_divide(skeleton_backend& result, unsigned char arg);\nvoid eval_divide(skeleton_backend& result, char arg);\nvoid eval_divide(skeleton_backend& result, long long arg);\nvoid eval_divide(skeleton_backend& result, long arg);\nvoid eval_divide(skeleton_backend& result, int arg);\nvoid eval_divide(skeleton_backend& result, short arg);\nvoid eval_divide(skeleton_backend& result, signed char arg);\nvoid eval_divide(skeleton_backend& result, long double arg);\nvoid eval_divide(skeleton_backend& result, double arg);\nvoid eval_divide(skeleton_backend& result, float arg);\n\nvoid eval_divide(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_divide(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);\nvoid eval_divide(skeleton_backend& result, const skeleton_backend& a, unsigned long b);\nvoid eval_divide(skeleton_backend& result, const skeleton_backend& a, unsigned b);\nvoid eval_divide(skeleton_backend& result, const skeleton_backend& a, unsigned short b);\nvoid eval_divide(skeleton_backend& result, const skeleton_backend& a, unsigned char b);\nvoid eval_divide(skeleton_backend& result, const skeleton_backend& a, long long b);\nvoid eval_divide(skeleton_backend& result, const skeleton_backend& a, long b);\nvoid eval_divide(skeleton_backend& result, const skeleton_backend& a, int b);\nvoid eval_divide(skeleton_backend& result, const skeleton_backend& a, short b);\nvoid eval_divide(skeleton_backend& result, const skeleton_backend& a, signed char b);\nvoid eval_divide(skeleton_backend& result, const skeleton_backend& a, char b);\nvoid eval_divide(skeleton_backend& result, const skeleton_backend& a, long double b);\nvoid eval_divide(skeleton_backend& result, const skeleton_backend& a, double b);\nvoid eval_divide(skeleton_backend& result, const skeleton_backend& a, float b);\n\nvoid eval_divide(skeleton_backend& result, unsigned long long b, const skeleton_backend& a);\nvoid eval_divide(skeleton_backend& result, unsigned long b, const skeleton_backend& a);\nvoid eval_divide(skeleton_backend& result, unsigned b, const skeleton_backend& a);\nvoid eval_divide(skeleton_backend& result, unsigned short b, const skeleton_backend& a);\nvoid eval_divide(skeleton_backend& result, unsigned char b, const skeleton_backend& a);\nvoid eval_divide(skeleton_backend& result, long long b, const skeleton_backend& a);\nvoid eval_divide(skeleton_backend& result, long b, const skeleton_backend& a);\nvoid eval_divide(skeleton_backend& result, int b, const skeleton_backend& a);\nvoid eval_divide(skeleton_backend& result, short b, const skeleton_backend& a);\nvoid eval_divide(skeleton_backend& result, signed char b, const skeleton_backend& a);\nvoid eval_divide(skeleton_backend& result, char b, const skeleton_backend& a);\nvoid eval_divide(skeleton_backend& result, long double b, const skeleton_backend& a);\nvoid eval_divide(skeleton_backend& result, double b, const skeleton_backend& a);\nvoid eval_divide(skeleton_backend& result, float b, const skeleton_backend& a);\n#endif\n//\n// Multiply and add/subtract as one:\n//\n#if 0\nvoid eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);\nvoid eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, unsigned long b);\nvoid eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, unsigned b);\nvoid eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, unsigned short b);\nvoid eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, unsigned char b);\nvoid eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, long long b);\nvoid eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, long b);\nvoid eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, int b);\nvoid eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, short b);\nvoid eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, signed char b);\nvoid eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, char b);\nvoid eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, long double b);\nvoid eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, double b);\nvoid eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, float b);\n\nvoid eval_multiply_add(skeleton_backend& result, unsigned long long b, const skeleton_backend& a);\nvoid eval_multiply_add(skeleton_backend& result, unsigned long b, const skeleton_backend& a);\nvoid eval_multiply_add(skeleton_backend& result, unsigned b, const skeleton_backend& a);\nvoid eval_multiply_add(skeleton_backend& result, unsigned short b, const skeleton_backend& a);\nvoid eval_multiply_add(skeleton_backend& result, unsigned char b, const skeleton_backend& a);\nvoid eval_multiply_add(skeleton_backend& result, long long b, const skeleton_backend& a);\nvoid eval_multiply_add(skeleton_backend& result, long b, const skeleton_backend& a);\nvoid eval_multiply_add(skeleton_backend& result, int b, const skeleton_backend& a);\nvoid eval_multiply_add(skeleton_backend& result, short b, const skeleton_backend& a);\nvoid eval_multiply_add(skeleton_backend& result, signed char b, const skeleton_backend& a);\nvoid eval_multiply_add(skeleton_backend& result, char b, const skeleton_backend& a);\nvoid eval_multiply_add(skeleton_backend& result, long double b, const skeleton_backend& a);\nvoid eval_multiply_add(skeleton_backend& result, double b, const skeleton_backend& a);\nvoid eval_multiply_add(skeleton_backend& result, float b, const skeleton_backend& a);\n\nvoid eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);\nvoid eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned long b);\nvoid eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned b);\nvoid eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned short b);\nvoid eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned char b);\nvoid eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, long long b);\nvoid eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, long b);\nvoid eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, int b);\nvoid eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, short b);\nvoid eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, signed char b);\nvoid eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, char b);\nvoid eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, long double b);\nvoid eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, double b);\nvoid eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, float b);\n\nvoid eval_multiply_subtract(skeleton_backend& result, unsigned long long b, const skeleton_backend& a);\nvoid eval_multiply_subtract(skeleton_backend& result, unsigned long b, const skeleton_backend& a);\nvoid eval_multiply_subtract(skeleton_backend& result, unsigned b, const skeleton_backend& a);\nvoid eval_multiply_subtract(skeleton_backend& result, unsigned short b, const skeleton_backend& a);\nvoid eval_multiply_subtract(skeleton_backend& result, unsigned char b, const skeleton_backend& a);\nvoid eval_multiply_subtract(skeleton_backend& result, long long b, const skeleton_backend& a);\nvoid eval_multiply_subtract(skeleton_backend& result, long b, const skeleton_backend& a);\nvoid eval_multiply_subtract(skeleton_backend& result, int b, const skeleton_backend& a);\nvoid eval_multiply_subtract(skeleton_backend& result, short b, const skeleton_backend& a);\nvoid eval_multiply_subtract(skeleton_backend& result, signed char b, const skeleton_backend& a);\nvoid eval_multiply_subtract(skeleton_backend& result, char b, const skeleton_backend& a);\nvoid eval_multiply_subtract(skeleton_backend& result, long double b, const skeleton_backend& a);\nvoid eval_multiply_subtract(skeleton_backend& result, double b, const skeleton_backend& a);\nvoid eval_multiply_subtract(skeleton_backend& result, float b, const skeleton_backend& a);\n#endif\n//\n// Increment and decrement:\n//\n//void eval_increment(skeleton_backend& arg);\n//void eval_decrement(skeleton_backend& arg);\n//\n// abs/fabs:\n//\n// void eval_abs(skeleton_backend& result, const skeleton_backend& arg);\n// void eval_fabs(skeleton_backend& result, const skeleton_backend& arg);\n//\n\n\n//\n// Now operations on Integer types, starting with modulus:\n//\n#if 0\nvoid eval_modulus(skeleton_backend& result, unsigned long long arg);\nvoid eval_modulus(skeleton_backend& result, unsigned long arg);\nvoid eval_modulus(skeleton_backend& result, unsigned arg);\nvoid eval_modulus(skeleton_backend& result, unsigned short arg);\nvoid eval_modulus(skeleton_backend& result, unsigned char arg);\nvoid eval_modulus(skeleton_backend& result, char arg);\nvoid eval_modulus(skeleton_backend& result, long long arg);\nvoid eval_modulus(skeleton_backend& result, long arg);\nvoid eval_modulus(skeleton_backend& result, int arg);\nvoid eval_modulus(skeleton_backend& result, short arg);\nvoid eval_modulus(skeleton_backend& result, signed char arg);\nvoid eval_modulus(skeleton_backend& result, long double arg);\nvoid eval_modulus(skeleton_backend& result, double arg);\nvoid eval_modulus(skeleton_backend& result, float arg);\n\nvoid eval_modulus(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_modulus(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);\nvoid eval_modulus(skeleton_backend& result, const skeleton_backend& a, unsigned long b);\nvoid eval_modulus(skeleton_backend& result, const skeleton_backend& a, unsigned b);\nvoid eval_modulus(skeleton_backend& result, const skeleton_backend& a, unsigned short b);\nvoid eval_modulus(skeleton_backend& result, const skeleton_backend& a, unsigned char b);\nvoid eval_modulus(skeleton_backend& result, const skeleton_backend& a, long long b);\nvoid eval_modulus(skeleton_backend& result, const skeleton_backend& a, long b);\nvoid eval_modulus(skeleton_backend& result, const skeleton_backend& a, int b);\nvoid eval_modulus(skeleton_backend& result, const skeleton_backend& a, short b);\nvoid eval_modulus(skeleton_backend& result, const skeleton_backend& a, signed char b);\nvoid eval_modulus(skeleton_backend& result, const skeleton_backend& a, char b);\nvoid eval_modulus(skeleton_backend& result, const skeleton_backend& a, long double b);\nvoid eval_modulus(skeleton_backend& result, const skeleton_backend& a, double b);\nvoid eval_modulus(skeleton_backend& result, const skeleton_backend& a, float b);\n\nvoid eval_modulus(skeleton_backend& result, unsigned long long b, const skeleton_backend& a);\nvoid eval_modulus(skeleton_backend& result, unsigned long b, const skeleton_backend& a);\nvoid eval_modulus(skeleton_backend& result, unsigned b, const skeleton_backend& a);\nvoid eval_modulus(skeleton_backend& result, unsigned short b, const skeleton_backend& a);\nvoid eval_modulus(skeleton_backend& result, unsigned char b, const skeleton_backend& a);\nvoid eval_modulus(skeleton_backend& result, long long b, const skeleton_backend& a);\nvoid eval_modulus(skeleton_backend& result, long b, const skeleton_backend& a);\nvoid eval_modulus(skeleton_backend& result, int b, const skeleton_backend& a);\nvoid eval_modulus(skeleton_backend& result, short b, const skeleton_backend& a);\nvoid eval_modulus(skeleton_backend& result, signed char b, const skeleton_backend& a);\nvoid eval_modulus(skeleton_backend& result, char b, const skeleton_backend& a);\nvoid eval_modulus(skeleton_backend& result, long double b, const skeleton_backend& a);\nvoid eval_modulus(skeleton_backend& result, double b, const skeleton_backend& a);\nvoid eval_modulus(skeleton_backend& result, float b, const skeleton_backend& a);\n#endif\n//\n// bitwise AND:\n//\n#if 0\nvoid eval_bitwise_and(skeleton_backend& result, unsigned long long arg);\nvoid eval_bitwise_and(skeleton_backend& result, unsigned long arg);\nvoid eval_bitwise_and(skeleton_backend& result, unsigned arg);\nvoid eval_bitwise_and(skeleton_backend& result, unsigned short arg);\nvoid eval_bitwise_and(skeleton_backend& result, unsigned char arg);\nvoid eval_bitwise_and(skeleton_backend& result, char arg);\nvoid eval_bitwise_and(skeleton_backend& result, long long arg);\nvoid eval_bitwise_and(skeleton_backend& result, long arg);\nvoid eval_bitwise_and(skeleton_backend& result, int arg);\nvoid eval_bitwise_and(skeleton_backend& result, short arg);\nvoid eval_bitwise_and(skeleton_backend& result, signed char arg);\nvoid eval_bitwise_and(skeleton_backend& result, long double arg);\nvoid eval_bitwise_and(skeleton_backend& result, double arg);\nvoid eval_bitwise_and(skeleton_backend& result, float arg);\n\nvoid eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);\nvoid eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, unsigned long b);\nvoid eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, unsigned b);\nvoid eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, unsigned short b);\nvoid eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, unsigned char b);\nvoid eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, long long b);\nvoid eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, long b);\nvoid eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, int b);\nvoid eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, short b);\nvoid eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, signed char b);\nvoid eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, char b);\nvoid eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, long double b);\nvoid eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, double b);\nvoid eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, float b);\n\nvoid eval_bitwise_and(skeleton_backend& result, unsigned long long b, const skeleton_backend& a);\nvoid eval_bitwise_and(skeleton_backend& result, unsigned long b, const skeleton_backend& a);\nvoid eval_bitwise_and(skeleton_backend& result, unsigned b, const skeleton_backend& a);\nvoid eval_bitwise_and(skeleton_backend& result, unsigned short b, const skeleton_backend& a);\nvoid eval_bitwise_and(skeleton_backend& result, unsigned char b, const skeleton_backend& a);\nvoid eval_bitwise_and(skeleton_backend& result, long long b, const skeleton_backend& a);\nvoid eval_bitwise_and(skeleton_backend& result, long b, const skeleton_backend& a);\nvoid eval_bitwise_and(skeleton_backend& result, int b, const skeleton_backend& a);\nvoid eval_bitwise_and(skeleton_backend& result, short b, const skeleton_backend& a);\nvoid eval_bitwise_and(skeleton_backend& result, signed char b, const skeleton_backend& a);\nvoid eval_bitwise_and(skeleton_backend& result, char b, const skeleton_backend& a);\nvoid eval_bitwise_and(skeleton_backend& result, long double b, const skeleton_backend& a);\nvoid eval_bitwise_and(skeleton_backend& result, double b, const skeleton_backend& a);\nvoid eval_bitwise_and(skeleton_backend& result, float b, const skeleton_backend& a);\n#endif\n//\n// bitwise OR:\n//\n#if 0\nvoid eval_bitwise_or(skeleton_backend& result, unsigned long long arg);\nvoid eval_bitwise_or(skeleton_backend& result, unsigned long arg);\nvoid eval_bitwise_or(skeleton_backend& result, unsigned arg);\nvoid eval_bitwise_or(skeleton_backend& result, unsigned short arg);\nvoid eval_bitwise_or(skeleton_backend& result, unsigned char arg);\nvoid eval_bitwise_or(skeleton_backend& result, char arg);\nvoid eval_bitwise_or(skeleton_backend& result, long long arg);\nvoid eval_bitwise_or(skeleton_backend& result, long arg);\nvoid eval_bitwise_or(skeleton_backend& result, int arg);\nvoid eval_bitwise_or(skeleton_backend& result, short arg);\nvoid eval_bitwise_or(skeleton_backend& result, signed char arg);\nvoid eval_bitwise_or(skeleton_backend& result, long double arg);\nvoid eval_bitwise_or(skeleton_backend& result, double arg);\nvoid eval_bitwise_or(skeleton_backend& result, float arg);\n\nvoid eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);\nvoid eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, unsigned long b);\nvoid eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, unsigned b);\nvoid eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, unsigned short b);\nvoid eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, unsigned char b);\nvoid eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, long long b);\nvoid eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, long b);\nvoid eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, int b);\nvoid eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, short b);\nvoid eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, signed char b);\nvoid eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, char b);\nvoid eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, long double b);\nvoid eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, double b);\nvoid eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, float b);\n\nvoid eval_bitwise_or(skeleton_backend& result, unsigned long long b, const skeleton_backend& a);\nvoid eval_bitwise_or(skeleton_backend& result, unsigned long b, const skeleton_backend& a);\nvoid eval_bitwise_or(skeleton_backend& result, unsigned b, const skeleton_backend& a);\nvoid eval_bitwise_or(skeleton_backend& result, unsigned short b, const skeleton_backend& a);\nvoid eval_bitwise_or(skeleton_backend& result, unsigned char b, const skeleton_backend& a);\nvoid eval_bitwise_or(skeleton_backend& result, long long b, const skeleton_backend& a);\nvoid eval_bitwise_or(skeleton_backend& result, long b, const skeleton_backend& a);\nvoid eval_bitwise_or(skeleton_backend& result, int b, const skeleton_backend& a);\nvoid eval_bitwise_or(skeleton_backend& result, short b, const skeleton_backend& a);\nvoid eval_bitwise_or(skeleton_backend& result, signed char b, const skeleton_backend& a);\nvoid eval_bitwise_or(skeleton_backend& result, char b, const skeleton_backend& a);\nvoid eval_bitwise_or(skeleton_backend& result, long double b, const skeleton_backend& a);\nvoid eval_bitwise_or(skeleton_backend& result, double b, const skeleton_backend& a);\nvoid eval_bitwise_or(skeleton_backend& result, float b, const skeleton_backend& a);\n#endif\n//\n// bitwise XOR:\n//\n#if 0\nvoid eval_bitwise_xor(skeleton_backend& result, unsigned long long arg);\nvoid eval_bitwise_xor(skeleton_backend& result, unsigned long arg);\nvoid eval_bitwise_xor(skeleton_backend& result, unsigned arg);\nvoid eval_bitwise_xor(skeleton_backend& result, unsigned short arg);\nvoid eval_bitwise_xor(skeleton_backend& result, unsigned char arg);\nvoid eval_bitwise_xor(skeleton_backend& result, char arg);\nvoid eval_bitwise_xor(skeleton_backend& result, long long arg);\nvoid eval_bitwise_xor(skeleton_backend& result, long arg);\nvoid eval_bitwise_xor(skeleton_backend& result, int arg);\nvoid eval_bitwise_xor(skeleton_backend& result, short arg);\nvoid eval_bitwise_xor(skeleton_backend& result, signed char arg);\nvoid eval_bitwise_xor(skeleton_backend& result, long double arg);\nvoid eval_bitwise_xor(skeleton_backend& result, double arg);\nvoid eval_bitwise_xor(skeleton_backend& result, float arg);\n\nvoid eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);\nvoid eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, unsigned long b);\nvoid eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, unsigned b);\nvoid eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, unsigned short b);\nvoid eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, unsigned char b);\nvoid eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, long long b);\nvoid eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, long b);\nvoid eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, int b);\nvoid eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, short b);\nvoid eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, signed char b);\nvoid eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, char b);\nvoid eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, long double b);\nvoid eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, double b);\nvoid eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, float b);\n\nvoid eval_bitwise_xor(skeleton_backend& result, unsigned long long b, const skeleton_backend& a);\nvoid eval_bitwise_xor(skeleton_backend& result, unsigned long b, const skeleton_backend& a);\nvoid eval_bitwise_xor(skeleton_backend& result, unsigned b, const skeleton_backend& a);\nvoid eval_bitwise_xor(skeleton_backend& result, unsigned short b, const skeleton_backend& a);\nvoid eval_bitwise_xor(skeleton_backend& result, unsigned char b, const skeleton_backend& a);\nvoid eval_bitwise_xor(skeleton_backend& result, long long b, const skeleton_backend& a);\nvoid eval_bitwise_xor(skeleton_backend& result, long b, const skeleton_backend& a);\nvoid eval_bitwise_xor(skeleton_backend& result, int b, const skeleton_backend& a);\nvoid eval_bitwise_xor(skeleton_backend& result, short b, const skeleton_backend& a);\nvoid eval_bitwise_xor(skeleton_backend& result, signed char b, const skeleton_backend& a);\nvoid eval_bitwise_xor(skeleton_backend& result, char b, const skeleton_backend& a);\nvoid eval_bitwise_xor(skeleton_backend& result, long double b, const skeleton_backend& a);\nvoid eval_bitwise_xor(skeleton_backend& result, double b, const skeleton_backend& a);\nvoid eval_bitwise_xor(skeleton_backend& result, float b, const skeleton_backend& a);\n#endif\n//\n// left and right shift:\n//\n//void eval_left_shift(skeleton_backend& result, const skeleton_backend& arg, std::size_t shift);\n//void eval_right_shift(skeleton_backend& result, const skeleton_backend& arg, std::size_t shift);\n//\n// Quotient and remainder:\n//\n// void eval_qr(const skeleton_backend& numerator, const skeleton_backend& denominator, skeleton_backend& quotient, skeleteon_backend& remainder);\n//\n// Misc integer ops:\n//\n// unsigned long long eval_integer_modulus(const skeleton_backend& arg, unsigned long long modulus);\n// unsigned long eval_integer_modulus(const skeleton_backend& arg, unsigned long modulus);\n// unsigned eval_integer_modulus(const skeleton_backend& arg, unsigned modulus);\n// unsigned short eval_integer_modulus(const skeleton_backend& arg, unsigned short modulus);\n// unsigned char eval_integer_modulus(const skeleton_backend& arg, unsigned char modulus);\n//\n// std::size_t  eval_lsb(const skeleton_backend& arg);\n// std::size_t  eval_msb(const skeleton_backend& arg);\n// bool  eval_bit_test(const skeleton_backend& arg, std::size_t bit);\n// void  eval_bit_set(const skeleton_backend& arg, std::size_t bit);\n// void  eval_bit_unset(const skeleton_backend& arg, std::size_t bit);\n// void  eval_bit_flip(const skeleton_backend& arg, std::size_t bit);\n//\n// GCD/LCD:\n//\n#if 0\nvoid eval_gcd(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_gcd(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);\nvoid eval_gcd(skeleton_backend& result, const skeleton_backend& a, unsigned long b);\nvoid eval_gcd(skeleton_backend& result, const skeleton_backend& a, unsigned b);\nvoid eval_gcd(skeleton_backend& result, const skeleton_backend& a, unsigned short b);\nvoid eval_gcd(skeleton_backend& result, const skeleton_backend& a, unsigned char b);\nvoid eval_gcd(skeleton_backend& result, const skeleton_backend& a, long long b);\nvoid eval_gcd(skeleton_backend& result, const skeleton_backend& a, long b);\nvoid eval_gcd(skeleton_backend& result, const skeleton_backend& a, int b);\nvoid eval_gcd(skeleton_backend& result, const skeleton_backend& a, short b);\nvoid eval_gcd(skeleton_backend& result, const skeleton_backend& a, signed char b);\nvoid eval_gcd(skeleton_backend& result, const skeleton_backend& a, char b);\nvoid eval_gcd(skeleton_backend& result, unsigned long long a, const skeleton_backend& b);\nvoid eval_gcd(skeleton_backend& result, unsigned long a, const skeleton_backend& b);\nvoid eval_gcd(skeleton_backend& result, unsigned a, const skeleton_backend& b);\nvoid eval_gcd(skeleton_backend& result, unsigned short a, const skeleton_backend& b);\nvoid eval_gcd(skeleton_backend& result, unsigned char a, const skeleton_backend& b);\nvoid eval_gcd(skeleton_backend& result, long long a, const skeleton_backend& b);\nvoid eval_gcd(skeleton_backend& result, long a, const skeleton_backend& b);\nvoid eval_gcd(skeleton_backend& result, int a, const skeleton_backend& b);\nvoid eval_gcd(skeleton_backend& result, short a, const skeleton_backend& b);\nvoid eval_gcd(skeleton_backend& result, signed char a, const skeleton_backend& b);\nvoid eval_gcd(skeleton_backend& result, char a, const skeleton_backend& b);\n\nvoid eval_lcm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_lcm(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);\nvoid eval_lcm(skeleton_backend& result, const skeleton_backend& a, unsigned long b);\nvoid eval_lcm(skeleton_backend& result, const skeleton_backend& a, unsigned b);\nvoid eval_lcm(skeleton_backend& result, const skeleton_backend& a, unsigned short b);\nvoid eval_lcm(skeleton_backend& result, const skeleton_backend& a, unsigned char b);\nvoid eval_lcm(skeleton_backend& result, const skeleton_backend& a, long long b);\nvoid eval_lcm(skeleton_backend& result, const skeleton_backend& a, long b);\nvoid eval_lcm(skeleton_backend& result, const skeleton_backend& a, int b);\nvoid eval_lcm(skeleton_backend& result, const skeleton_backend& a, short b);\nvoid eval_lcm(skeleton_backend& result, const skeleton_backend& a, signed char b);\nvoid eval_lcm(skeleton_backend& result, const skeleton_backend& a, char b);\nvoid eval_lcm(skeleton_backend& result, unsigned long long a, const skeleton_backend& b);\nvoid eval_lcm(skeleton_backend& result, unsigned long a, const skeleton_backend& b);\nvoid eval_lcm(skeleton_backend& result, unsigned a, const skeleton_backend& b);\nvoid eval_lcm(skeleton_backend& result, unsigned short a, const skeleton_backend& b);\nvoid eval_lcm(skeleton_backend& result, unsigned char a, const skeleton_backend& b);\nvoid eval_lcm(skeleton_backend& result, long long a, const skeleton_backend& b);\nvoid eval_lcm(skeleton_backend& result, long a, const skeleton_backend& b);\nvoid eval_lcm(skeleton_backend& result, int a, const skeleton_backend& b);\nvoid eval_lcm(skeleton_backend& result, short a, const skeleton_backend& b);\nvoid eval_lcm(skeleton_backend& result, signed char a, const skeleton_backend& b);\nvoid eval_lcm(skeleton_backend& result, char a, const skeleton_backend& b);\n#endif\n//\n// Modular exponentiation:\n//\n#if 0\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, const skeleton_backend& c);  // a^b % c\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, unsigned long long c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, unsigned long c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, unsigned c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, unsigned short c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, unsigned char c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, long long c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, long c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, int c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, short c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, signed char c);\n\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned long long b, const skeleton_backend& c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned long b, const skeleton_backend& c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned b, const skeleton_backend& c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned short b, const skeleton_backend& c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned char b, const skeleton_backend& c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, long long b, const skeleton_backend& c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, long b, const skeleton_backend& c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, int b, const skeleton_backend& c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, short b, const skeleton_backend& c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, signed char b, const skeleton_backend& c);\n\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned long long b, unsigned long long c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned long b, unsigned long c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned b, unsigned c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned short b, unsigned short c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned char b, unsigned char c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, long long b, long long c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, long b, long c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, int b, int c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, short b, short c);\nvoid eval_powm(skeleton_backend& result, const skeleton_backend& a, signed char b, signed char c);\n#endif\n//\n// Integer sqrt:\n//\n// void eval_integer_sqrt(skeleton_backend& result, const skeleton_backend& arg, skeleton_backend& remainder);\n\n/*********************************************************************************************\n\n     FLOATING POINT FUNCTIONS\n\n***********************************************************************************************/\n\n#if 0\n\nint eval_fpclassify(const skeleton_backend& arg);\nvoid eval_trunc(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_round(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_exp(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_exp2(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_log(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_log10(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_sin(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_cos(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_tan(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_asin(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_acos(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_atan(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_sinh(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_cosh(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_tanh(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_asinh(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_acosh(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_atanh(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_fmod(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_modf(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_pow(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_atan2(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_scalbn(skeleton_backend& result, const skeleton_backend& arg, skeleton_backend::exponent_type e);\nvoid eval_scalbln(skeleton_backend& result, const skeleton_backend& arg, skeleton_backend::exponent_type e);\nskeleton_type::exponent_type eval_ilogb(const skeleton_backend& arg);\n\nvoid eval_remquo(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, const skeleton_backend& a, unsigned long long b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, const skeleton_backend& a, unsigned long b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, const skeleton_backend& a, unsigned b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, const skeleton_backend& a, unsigned short b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, const skeleton_backend& a, unsigned char b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, const skeleton_backend& a, long long b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, const skeleton_backend& a, long b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, const skeleton_backend& a, int b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, const skeleton_backend& a, short b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, const skeleton_backend& a, signed char b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, const skeleton_backend& a, long double b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, const skeleton_backend& a, double b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, const skeleton_backend& a, float b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, unsigned long long a, const skeleton_backend& b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, unsigned long a, const skeleton_backend& b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, unsigned a, const skeleton_backend& b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, unsigned short a, const skeleton_backend& b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, unsigned char a, const skeleton_backend& b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, long long a, const skeleton_backend& b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, long a, const skeleton_backend& b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, int a, const skeleton_backend& b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, short a, const skeleton_backend& b, int* p_n);\nvoid eval_remquo(skeleton_backend& result, signed char a, const skeleton_backend& b, int* p_n);\n\nvoid eval_remainder(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_remainder(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);\nvoid eval_remainder(skeleton_backend& result, const skeleton_backend& a, unsigned long b);\nvoid eval_remainder(skeleton_backend& result, const skeleton_backend& a, unsigned b);\nvoid eval_remainder(skeleton_backend& result, const skeleton_backend& a, unsigned short b);\nvoid eval_remainder(skeleton_backend& result, const skeleton_backend& a, unsigned char b);\nvoid eval_remainder(skeleton_backend& result, const skeleton_backend& a, long long b);\nvoid eval_remainder(skeleton_backend& result, const skeleton_backend& a, long b);\nvoid eval_remainder(skeleton_backend& result, const skeleton_backend& a, int b);\nvoid eval_remainder(skeleton_backend& result, const skeleton_backend& a, short b);\nvoid eval_remainder(skeleton_backend& result, const skeleton_backend& a, signed char b);\nvoid eval_remainder(skeleton_backend& result, const skeleton_backend& a, long double b);\nvoid eval_remainder(skeleton_backend& result, const skeleton_backend& a, double b);\nvoid eval_remainder(skeleton_backend& result, const skeleton_backend& a, float b);\nvoid eval_remainder(skeleton_backend& result, unsigned long long a, const skeleton_backend& b);\nvoid eval_remainder(skeleton_backend& result, unsigned long a, const skeleton_backend& b);\nvoid eval_remainder(skeleton_backend& result, unsigned a, const skeleton_backend& b);\nvoid eval_remainder(skeleton_backend& result, unsigned short a, const skeleton_backend& b);\nvoid eval_remainder(skeleton_backend& result, unsigned char a, const skeleton_backend& b);\nvoid eval_remainder(skeleton_backend& result, long long a, const skeleton_backend& b);\nvoid eval_remainder(skeleton_backend& result, long a, const skeleton_backend& b);\nvoid eval_remainder(skeleton_backend& result, int a, const skeleton_backend& b);\nvoid eval_remainder(skeleton_backend& result, short a, const skeleton_backend& b);\nvoid eval_remainder(skeleton_backend& result, signed char a, const skeleton_backend& b);\n\nvoid eval_fdim(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_fdim(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);\nvoid eval_fdim(skeleton_backend& result, const skeleton_backend& a, unsigned long b);\nvoid eval_fdim(skeleton_backend& result, const skeleton_backend& a, unsigned b);\nvoid eval_fdim(skeleton_backend& result, const skeleton_backend& a, unsigned short b);\nvoid eval_fdim(skeleton_backend& result, const skeleton_backend& a, unsigned char b);\nvoid eval_fdim(skeleton_backend& result, const skeleton_backend& a, long long b);\nvoid eval_fdim(skeleton_backend& result, const skeleton_backend& a, long b);\nvoid eval_fdim(skeleton_backend& result, const skeleton_backend& a, int b);\nvoid eval_fdim(skeleton_backend& result, const skeleton_backend& a, short b);\nvoid eval_fdim(skeleton_backend& result, const skeleton_backend& a, signed char b);\nvoid eval_fdim(skeleton_backend& result, const skeleton_backend& a, long double b);\nvoid eval_fdim(skeleton_backend& result, const skeleton_backend& a, double b);\nvoid eval_fdim(skeleton_backend& result, const skeleton_backend& a, float b);\nvoid eval_fdim(skeleton_backend& result, unsigned long long a, const skeleton_backend& b);\nvoid eval_fdim(skeleton_backend& result, unsigned long a, const skeleton_backend& b);\nvoid eval_fdim(skeleton_backend& result, unsigned a, const skeleton_backend& b);\nvoid eval_fdim(skeleton_backend& result, unsigned short a, const skeleton_backend& b);\nvoid eval_fdim(skeleton_backend& result, unsigned char a, const skeleton_backend& b);\nvoid eval_fdim(skeleton_backend& result, long long a, const skeleton_backend& b);\nvoid eval_fdim(skeleton_backend& result, long a, const skeleton_backend& b);\nvoid eval_fdim(skeleton_backend& result, int a, const skeleton_backend& b);\nvoid eval_fdim(skeleton_backend& result, short a, const skeleton_backend& b);\nvoid eval_fdim(skeleton_backend& result, signed char a, const skeleton_backend& b);\n\nvoid eval_fmax(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_fmax(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);\nvoid eval_fmax(skeleton_backend& result, const skeleton_backend& a, unsigned long b);\nvoid eval_fmax(skeleton_backend& result, const skeleton_backend& a, unsigned b);\nvoid eval_fmax(skeleton_backend& result, const skeleton_backend& a, unsigned short b);\nvoid eval_fmax(skeleton_backend& result, const skeleton_backend& a, unsigned char b);\nvoid eval_fmax(skeleton_backend& result, const skeleton_backend& a, long long b);\nvoid eval_fmax(skeleton_backend& result, const skeleton_backend& a, long b);\nvoid eval_fmax(skeleton_backend& result, const skeleton_backend& a, int b);\nvoid eval_fmax(skeleton_backend& result, const skeleton_backend& a, short b);\nvoid eval_fmax(skeleton_backend& result, const skeleton_backend& a, signed char b);\nvoid eval_fmax(skeleton_backend& result, const skeleton_backend& a, long double b);\nvoid eval_fmax(skeleton_backend& result, const skeleton_backend& a, double b);\nvoid eval_fmax(skeleton_backend& result, const skeleton_backend& a, float b);\nvoid eval_fmax(skeleton_backend& result, unsigned long long a, const skeleton_backend& b);\nvoid eval_fmax(skeleton_backend& result, unsigned long a, const skeleton_backend& b);\nvoid eval_fmax(skeleton_backend& result, unsigned a, const skeleton_backend& b);\nvoid eval_fmax(skeleton_backend& result, unsigned short a, const skeleton_backend& b);\nvoid eval_fmax(skeleton_backend& result, unsigned char a, const skeleton_backend& b);\nvoid eval_fmax(skeleton_backend& result, long long a, const skeleton_backend& b);\nvoid eval_fmax(skeleton_backend& result, long a, const skeleton_backend& b);\nvoid eval_fmax(skeleton_backend& result, int a, const skeleton_backend& b);\nvoid eval_fmax(skeleton_backend& result, short a, const skeleton_backend& b);\nvoid eval_fmax(skeleton_backend& result, signed char a, const skeleton_backend& b);\n\nvoid eval_fmin(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_fmin(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);\nvoid eval_fmin(skeleton_backend& result, const skeleton_backend& a, unsigned long b);\nvoid eval_fmin(skeleton_backend& result, const skeleton_backend& a, unsigned b);\nvoid eval_fmin(skeleton_backend& result, const skeleton_backend& a, unsigned short b);\nvoid eval_fmin(skeleton_backend& result, const skeleton_backend& a, unsigned char b);\nvoid eval_fmin(skeleton_backend& result, const skeleton_backend& a, long long b);\nvoid eval_fmin(skeleton_backend& result, const skeleton_backend& a, long b);\nvoid eval_fmin(skeleton_backend& result, const skeleton_backend& a, int b);\nvoid eval_fmin(skeleton_backend& result, const skeleton_backend& a, short b);\nvoid eval_fmin(skeleton_backend& result, const skeleton_backend& a, signed char b);\nvoid eval_fmin(skeleton_backend& result, const skeleton_backend& a, long double b);\nvoid eval_fmin(skeleton_backend& result, const skeleton_backend& a, double b);\nvoid eval_fmin(skeleton_backend& result, const skeleton_backend& a, float b);\nvoid eval_fmin(skeleton_backend& result, unsigned long long a, const skeleton_backend& b);\nvoid eval_fmin(skeleton_backend& result, unsigned long a, const skeleton_backend& b);\nvoid eval_fmin(skeleton_backend& result, unsigned a, const skeleton_backend& b);\nvoid eval_fmin(skeleton_backend& result, unsigned short a, const skeleton_backend& b);\nvoid eval_fmin(skeleton_backend& result, unsigned char a, const skeleton_backend& b);\nvoid eval_fmin(skeleton_backend& result, long long a, const skeleton_backend& b);\nvoid eval_fmin(skeleton_backend& result, long a, const skeleton_backend& b);\nvoid eval_fmin(skeleton_backend& result, int a, const skeleton_backend& b);\nvoid eval_fmin(skeleton_backend& result, short a, const skeleton_backend& b);\nvoid eval_fmin(skeleton_backend& result, signed char a, const skeleton_backend& b);\n\nvoid eval_hypot(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);\nvoid eval_hypot(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);\nvoid eval_hypot(skeleton_backend& result, const skeleton_backend& a, unsigned long b);\nvoid eval_hypot(skeleton_backend& result, const skeleton_backend& a, unsigned b);\nvoid eval_hypot(skeleton_backend& result, const skeleton_backend& a, unsigned short b);\nvoid eval_hypot(skeleton_backend& result, const skeleton_backend& a, unsigned char b);\nvoid eval_hypot(skeleton_backend& result, const skeleton_backend& a, long long b);\nvoid eval_hypot(skeleton_backend& result, const skeleton_backend& a, long b);\nvoid eval_hypot(skeleton_backend& result, const skeleton_backend& a, int b);\nvoid eval_hypot(skeleton_backend& result, const skeleton_backend& a, short b);\nvoid eval_hypot(skeleton_backend& result, const skeleton_backend& a, signed char b);\nvoid eval_hypot(skeleton_backend& result, const skeleton_backend& a, long double b);\nvoid eval_hypot(skeleton_backend& result, const skeleton_backend& a, double b);\nvoid eval_hypot(skeleton_backend& result, const skeleton_backend& a, float b);\nvoid eval_hypot(skeleton_backend& result, unsigned long long a, const skeleton_backend& b);\nvoid eval_hypot(skeleton_backend& result, unsigned long a, const skeleton_backend& b);\nvoid eval_hypot(skeleton_backend& result, unsigned a, const skeleton_backend& b);\nvoid eval_hypot(skeleton_backend& result, unsigned short a, const skeleton_backend& b);\nvoid eval_hypot(skeleton_backend& result, unsigned char a, const skeleton_backend& b);\nvoid eval_hypot(skeleton_backend& result, long long a, const skeleton_backend& b);\nvoid eval_hypot(skeleton_backend& result, long a, const skeleton_backend& b);\nvoid eval_hypot(skeleton_backend& result, int a, const skeleton_backend& b);\nvoid eval_hypot(skeleton_backend& result, short a, const skeleton_backend& b);\nvoid eval_hypot(skeleton_backend& result, signed char a, const skeleton_backend& b);\n\nvoid eval_logb(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_nearbtint(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_rint(skeleton_backend& result, const skeleton_backend& arg);\nvoid eval_log2(skeleton_backend& result, const skeleton_backend& arg);\n#endif\n\n\n} // namespace backends\n\n//\n// Import the backend into this namespace:\n//\nusing boost::multiprecision::backends::skeleton_backend;\n//\n// Typedef whatever number's make use of this backend:\n//\ntypedef number<skeleton_backend, et_off> skeleton_number;\n//\n// Define a category for this number type, one of:\n// \n//    number_kind_integer\n//    number_kind_floating_point\n//    number_kind_rational\n//    number_kind_fixed_point\n//    number_kind_complex\n//\ntemplate<>\nstruct number_category<skeleton_backend > : public std::integral_constant<int, number_kind_floating_point>\n{};\n\n//\n// These 2 traits classes are required for complex types only:\n//\n/*\ntemplate <expression_template_option ExpressionTemplates>\nstruct component_type<number<skeleton_backend, ExpressionTemplates> >\n{\n   typedef number<skeleton_real_type, ExpressionTemplates> type;\n};\n\ntemplate <expression_template_option ExpressionTemplates>\nstruct complex_result_from_scalar<number<skeleton_real_type, ExpressionTemplates> >\n{\n   typedef number<skeleton_backend, ExpressionTemplates> type;\n};\n*/\n\n/**************************************************************\n\nOVERLOADABLE FUNCTIONS - FLOATING POINT TYPES ONLY\n\n****************************************************************/\n\n#if 0\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nint sign(const number<skeleton_backend, ExpressionTemplates>& arg);\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nint signbit(const number<skeleton_backend, ExpressionTemplates>& arg);\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nnumber<skeleton_backend, ExpressionTemplates> changesign(const number<skeleton_backend, ExpressionTemplates>& arg);\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nnumber<skeleton_backend, ExpressionTemplates> copysign(const number<skeleton_backend, ExpressionTemplates>& a, const number<skeleton_backend, ExpressionTemplates>& b);\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nnumber<skeleton_backend, ExpressionTemplates> cbrt(const number<skeleton_backend, ExpressionTemplates>& arg);\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nnumber<skeleton_backend, ExpressionTemplates> erf(const number<skeleton_backend, ExpressionTemplates>& arg);\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nnumber<skeleton_backend, ExpressionTemplates> erfc(const number<skeleton_backend, ExpressionTemplates>& arg);\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nnumber<skeleton_backend, ExpressionTemplates> expm1(const number<skeleton_backend, ExpressionTemplates>& arg);\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nnumber<skeleton_backend, ExpressionTemplates> log1p(const number<skeleton_backend, ExpressionTemplates>& arg);\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nnumber<skeleton_backend, ExpressionTemplates> tgamma(const number<skeleton_backend, ExpressionTemplates>& arg);\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nnumber<skeleton_backend, ExpressionTemplates> lgamma(const number<skeleton_backend, ExpressionTemplates>& arg);\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nlong lrint(const number<skeleton_backend, ExpressionTemplates>& arg);\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nlong long llrint(const number<skeleton_backend, ExpressionTemplates>& arg);\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nnumber<skeleton_backend, ExpressionTemplates> nextafter(const number<skeleton_backend, ExpressionTemplates>& a, const number<skeleton_backend, ExpressionTemplates>& b);\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nnumber<skeleton_backend, ExpressionTemplates> nexttoward(const number<skeleton_backend, ExpressionTemplates>& a, const number<skeleton_backend, ExpressionTemplates>& b);\n\n#endif\n\n}} // namespace boost::multiprecision\n\n/**********************************************************************************\n\nFLOATING POINT ONLY\nNice to have stuff for better integration with Boost.Math.\n\n***********************************************************************************/\n\nnamespace boost {\nnamespace math {\nnamespace tools {\n\n#if 0\n\ntemplate <>\nint digits<boost::multiprecision::number<boost::multiprecision::skeleton_number> >();\n\ntemplate <>\nboost::multiprecision::mpfr_float max_value<boost::multiprecision::skeleton_number>();\n\ntemplate <>\nboost::multiprecision::mpfr_float min_value<boost::multiprecision::skeleton_number>();\n\n#endif\n\n} // namespace tools\n\nnamespace constants {\nnamespace detail {\n\n#if 0\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct constant_pi<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> result_type;\n   //\n   // Fixed N-digit precision, return reference to internal/cached object:\n   //\n   template <int N>\n   static inline const result_type& get(const std::integral_constant<int, N>&);\n   //\n   // Variable precision, returns fresh result each time (unless precision is unchanged from last call):\n   //\n   static inline const result_type  get(const std::integral_constant<int, 0>&);\n};\n//\n// Plus any other constants supported natively by this type....\n//\n#endif\n\n} // namespace detail\n} // namespace constants\n\n}} // namespace boost::math\n\n\nnamespace std {\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nclass numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> number_type;\n\n public:\n   static constexpr bool is_specialized = true;\n   static number_type(min)();\n   static number_type(max)();\n   static number_type lowest();\n   static constexpr int                digits       = 0;\n   static constexpr int                digits10     = 0;\n   static constexpr int                max_digits10 = 0;\n   static constexpr bool               is_signed    = false;\n   static constexpr bool               is_integer   = false;\n   static constexpr bool               is_exact     = false;\n   static constexpr int                radix        = 2;\n   static number_type                        epsilon();\n   static number_type                        round_error();\n   static constexpr int                min_exponent      = 0;\n   static constexpr int                min_exponent10    = 0;\n   static constexpr int                max_exponent      = 0;\n   static constexpr int                max_exponent10    = 0;\n   static constexpr bool               has_infinity      = false;\n   static constexpr bool               has_quiet_NaN     = false;\n   static constexpr bool               has_signaling_NaN = false;\n   static constexpr float_denorm_style has_denorm        = denorm_absent;\n   static constexpr bool               has_denorm_loss   = false;\n   static number_type                        infinity();\n   static number_type                        quiet_NaN();\n   static number_type                        signaling_NaN();\n   static number_type                        denorm_min();\n   static constexpr bool               is_iec559       = false;\n   static constexpr bool               is_bounded      = false;\n   static constexpr bool               is_modulo       = false;\n   static constexpr bool               traps           = false;\n   static constexpr bool               tinyness_before = false;\n   static constexpr float_round_style  round_style     = round_toward_zero;\n};\n\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::digits;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::digits10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::max_digits10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::is_signed;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::is_integer;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::is_exact;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::radix;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::min_exponent;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::min_exponent10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::max_exponent;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::max_exponent10;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::has_infinity;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::has_quiet_NaN;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::has_signaling_NaN;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_denorm_style numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::has_denorm;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::has_denorm_loss;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::is_iec559;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::is_bounded;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::is_modulo;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::traps;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::tinyness_before;\ntemplate <boost::multiprecision::expression_template_option ExpressionTemplates>\nconstexpr float_round_style numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::round_style;\n\n} // namespace std\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/standalone_constexpr_test_cpp_int.cpp",
    "content": "//  (C) Copyright John Maddock 2019 - 2021.\n//  (C) Copyright Matt Borland 2021.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#define BOOST_MP_STANDALONE\n\n#include \"test.hpp\"\n#include \"constexpr_arithmetric_test.hpp\"\n#include \"boost/multiprecision/cpp_int.hpp\"\n\n#if !defined(BOOST_MP_NO_CONSTEXPR_DETECTION) && !defined(DISABLE_TESTS)\n\ntemplate <class F, class V>\ndecltype(std::declval<F>()(std::declval<V>())) non_constexpr_invoke(F f, V v)\n{\n   return f(v);\n}\n\nint main()\n{\n   typedef boost::multiprecision::int256_t  int_backend;\n   typedef boost::multiprecision::uint256_t unsigned_backend;\n\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_add_subtract(a);\n      constexpr unsigned_backend d = test_constexpr_add_subtract(c);\n\n      constexpr long long llv = (long long)b;\n\n      static_assert(b == -108);\n      static_assert(d == 554);\n      static_assert(llv == -108);\n\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_add_subtract<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_add_subtract<unsigned_backend>, c));\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_mul_divide(a);\n      constexpr unsigned_backend d = test_constexpr_mul_divide(c);\n      static_assert(b == 22);\n      static_assert(d == 22);\n\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_mul_divide<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_mul_divide<unsigned_backend>, c));\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_bitwise(a);\n      constexpr unsigned_backend d = test_constexpr_bitwise(c);\n#ifdef BOOST_HAS_INT128\n      static_assert(b == 230);\n      static_assert(d == 120);\n#else\n      static_assert(b == 210);\n      static_assert(d == 106);\n#endif\n\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_bitwise<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_bitwise<unsigned_backend>, c));\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b = test_constexpr_logical(a);\n      constexpr unsigned_backend d = test_constexpr_logical(c);\n#ifdef BOOST_HAS_INT128\n      //static_assert(b == 95);\n      //static_assert(d == 95);\n#else\n      static_assert(b == 82);\n      static_assert(d == 82);\n#endif\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_logical<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_logical<unsigned_backend>, c));\n   }\n   {\n      constexpr int_backend a(22);\n      constexpr unsigned_backend c(22);\n      constexpr int_backend b      = test_constexpr_compare(a);\n      constexpr unsigned_backend d = test_constexpr_compare(c);\n#ifdef BOOST_HAS_INT128\n      static_assert(b == 95);\n      static_assert(d == 95);\n#else\n      static_assert(b == 95);\n      static_assert(d == 95);\n#endif\n      BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_compare<int_backend>, a));\n      BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_compare<unsigned_backend>, c));\n   }\n   return boost::report_errors();\n}\n#else\nint main() {}\n#endif\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/standalone_constexpr_test_float128.cpp",
    "content": "//  (C) Copyright John Maddock 2019 - 2021.\n//  (C) Copyright Matt Borland 2021.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#define BOOST_MP_STANDALONE\n\n#include \"constexpr_arithmetric_test.hpp\"\n#include <boost/multiprecision/float128.hpp>\n#include <iostream>\n\nint main()\n{\n   using boost::multiprecision::float128;\n\n   {\n      constexpr float128 a(22);\n      constexpr float128 b = test_constexpr_add_subtract(a);\n\n      constexpr __float128 f128 = (__float128)b;\n      static_assert(f128 == -108.0f);\n\n      constexpr int i = (int)b;\n      static_assert(i == -108);\n\n      constexpr short s = (short)b;\n      static_assert(s == -108);\n   }\n   {\n      constexpr float128 a(22);\n      constexpr float128 b = test_constexpr_mul_divide(a);\n      static_assert((__float128)b == 0);\n   }\n   {\n      constexpr float128 a(22);\n      constexpr float128 b = test_constexpr_compare(a);\n      static_assert((__float128)b == 119);\n   }\n   {\n      constexpr float128 a(0);\n      static_assert(fpclassify(a) == FP_ZERO);\n      constexpr float128 b(1);\n      static_assert(fpclassify(b) == FP_NORMAL);\n      constexpr float128 c(-1);\n      static_assert(fpclassify(c) == FP_NORMAL);\n      static_assert(abs(c) >= 0);\n      static_assert(fabs(c) >= 0);\n      constexpr float128 d(std::numeric_limits<float128>::epsilon());\n      static_assert(fpclassify(c) == FP_NORMAL);\n      constexpr float128 e((std::numeric_limits<float128>::min)());\n      static_assert(fpclassify(e) == FP_NORMAL);\n      constexpr float128 f((std::numeric_limits<float128>::max)());\n      static_assert(fpclassify(f) == FP_NORMAL);\n      constexpr float128 g(std::numeric_limits<float128>::lowest());\n      static_assert(fpclassify(g) == FP_NORMAL);\n      constexpr float128 h(std::numeric_limits<float128>::round_error());\n      static_assert(fpclassify(h) == FP_NORMAL);\n      constexpr float128 i(std::numeric_limits<float128>::denorm_min());\n      static_assert(fpclassify(i) == FP_SUBNORMAL);\n      constexpr float128 j(-std::numeric_limits<float128>::denorm_min());\n      static_assert(fpclassify(j) == FP_SUBNORMAL);\n      constexpr float128 k(std::numeric_limits<float128>::infinity());\n      static_assert(fpclassify(k) == FP_INFINITE);\n      static_assert(isinf(k));\n      static_assert(!isnan(k));\n      constexpr float128 l(-std::numeric_limits<float128>::infinity());\n      static_assert(fpclassify(l) == FP_INFINITE);\n      static_assert(isinf(l));\n      static_assert(!isnan(l));\n   }\n   std::cout << \"Done!\" << std::endl;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/standalone_test_arithmetic_complex128.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012-2021 John Maddock. \n//  Copyright 2021 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#define BOOST_MP_STANDALONE\n\n#include <boost/config.hpp>\n\n#ifdef BOOST_HAS_FLOAT128\n#include <boost/multiprecision/complex128.hpp>\n#endif\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n#ifdef BOOST_HAS_FLOAT128\n   test<boost::multiprecision::complex128>();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/standalone_test_arithmetic_cpp_bin_float.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 - 2021 John Maddock. \n//  Copyright 2021 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#define BOOST_MP_STANDALONE\n\n#include \"test_arithmetic.hpp\"\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinExponent, Exponent MaxExponent, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> >\n{\n   using number_type = boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET>;\n   using type = boost::multiprecision::number<boost::multiprecision::cpp_bin_float<((std::numeric_limits<number_type>::digits / 2) > std::numeric_limits<long double>::digits ? Digits / 2 : Digits), DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET>;\n};\n\nint main()\n{\n   test<boost::multiprecision::cpp_bin_float_50>();\n   //test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<21>>>();\n   //test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<1000, boost::multiprecision::digit_base_10, std::allocator<char>>>>();\n   //test<boost::multiprecision::cpp_bin_float_quad>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/standalone_test_arithmetic_cpp_dec_float.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 - 2021 John Maddock.\n//  Copyright 2021 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#define BOOST_MP_STANDALONE\n\n#include \"test_arithmetic.hpp\"\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\ntemplate <unsigned D>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D>>>\n{\n   using type = boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D / 2>>;\n};\n\nint main()\n{\n   test<boost::multiprecision::cpp_dec_float_50>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/standalone_test_arithmetic_cpp_int.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 - 2021 John Maddock. \n//  Copyright 2021 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#define BOOST_MP_STANDALONE\n\n#include \"test_arithmetic.hpp\"\n#include <boost/multiprecision/cpp_int.hpp>\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   using type = boost::multiprecision::int256_t;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   using type = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET>;\n};\n\nint main()\n{\n   test<boost::multiprecision::cpp_int>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/standalone_test_arithmetic_cpp_rational.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 - 2021 John Maddock. \n//  Copyright 2021 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#define BOOST_MP_STANDALONE\n\n#include \"test_arithmetic.hpp\"\n#include <boost/multiprecision/cpp_int.hpp>\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   using type = boost::multiprecision::int256_t;\n};\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_rational>\n{\n   using type = boost::multiprecision::cpp_int;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   using type = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET>;\n};\n\nint main()\n{\n   test<boost::multiprecision::cpp_rational>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/standalone_test_arithmetic_float_128.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 - 2021 John Maddock. \n//  Copyright 2021 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#define BOOST_MP_STANDALONE\n\n#include \"test_arithmetic.hpp\"\n#include <boost/multiprecision/float128.hpp>\n\nint main()\n{\n   test<boost::multiprecision::float128>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/standalone_test_arithmetic_gmp.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. \n//  Copyright 2021 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#define BOOST_MP_STANDALONE\n\n#include \"test_arithmetic.hpp\"\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/rational_adaptor.hpp>\n\nint main()\n{\n   test<boost::multiprecision::mpz_int>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/standalone_test_arithmetic_int512.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 - 2021 John Maddock. \n//  Copyright 2021 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#define BOOST_MP_STANDALONE\n\n#include \"test_arithmetic.hpp\"\n#include <boost/multiprecision/cpp_int.hpp>\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   using type = boost::multiprecision::int256_t;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   using type = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET>;\n};\n\nint main()\n{\n   test<boost::multiprecision::int512_t>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/standalone_test_arithmetic_mpf_logged_adptr.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. \n//  Copyright 2021 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#define BOOST_MP_STANDALONE\n\n#include \"test_arithmetic.hpp\"\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/logged_adaptor.hpp>\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::logged_adaptor<typename boost::multiprecision::mpf_float::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/standalone_test_arithmetic_mpz_rat.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock.\n//  Copyright 2021 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#define BOOST_MP_STANDALONE\n\n#include \"test_arithmetic.hpp\"\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/rational_adaptor.hpp>\n\ntemplate <>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> > >\n{\n   typedef boost::multiprecision::mpz_int type;\n};\n\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/standalone_test_arithmetic_tommath.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. \n//  Copyright 2021 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#define BOOST_MP_STANDALONE\n\n#include \"test_arithmetic.hpp\"\n#include <boost/multiprecision/tommath.hpp>\n\ntemplate <>\nstruct is_twos_complement_integer<boost::multiprecision::tom_int> : public std::integral_constant<bool, false>\n{};\n\nint main()\n{\n   test<boost::multiprecision::tom_int>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/standalone_test_convert_from_tom_int.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. \n//  Copyright 2021 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#define BOOST_MP_STANDALONE\n\n#ifdef HAS_TOMMATH\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/multiprecision/tommath.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include \"test.hpp\"\n\n#if defined(HAS_GMP)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(HAS_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(HAS_MPFI)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef HAS_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n\nusing namespace boost::multiprecision;\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\ntemplate <class T>\nT generate_random(unsigned bits_wanted)\n{\n   static boost::random::mt19937               gen;\n   typedef boost::random::mt19937::result_type random_type;\n\n   T        max_val;\n   unsigned digits;\n   if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits))\n   {\n      max_val = (std::numeric_limits<T>::max)();\n      digits  = std::numeric_limits<T>::digits;\n   }\n   else\n   {\n      max_val = T(1) << bits_wanted;\n      digits  = bits_wanted;\n   }\n\n   unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n   while ((random_type(1) << bits_per_r_val) > (gen.max)())\n      --bits_per_r_val;\n\n   unsigned terms_needed = digits / bits_per_r_val + 1;\n\n   T val = 0;\n   for (unsigned i = 0; i < terms_needed; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   val %= max_val;\n   return val;\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_int(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(from.str(), t3.str());\n   BOOST_CHECK_EQUAL(from.str(), t4.str());\n}\ntemplate <class From, class To>\nvoid test_convert_neg_int(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_integer> const&, std::integral_constant<int, number_kind_integer> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>(bits_wanted);\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(from.str(), t1.str());\n      BOOST_CHECK_EQUAL(from.str(), t2.str());\n      test_convert_neg_int<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_rat(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(from.str(), numerator(t3).str());\n   BOOST_CHECK_EQUAL(from.str(), numerator(t4).str());\n}\ntemplate <class From, class To>\nvoid test_convert_neg_rat(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_integer> const&, std::integral_constant<int, number_kind_rational> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>(bits_wanted);\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(from.str(), numerator(t1).str());\n      BOOST_CHECK_EQUAL(from.str(), numerator(t2).str());\n      test_convert_neg_rat<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_float(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   To check(from.str() + \".0\");\n   BOOST_CHECK_EQUAL(t3, check);\n   BOOST_CHECK_EQUAL(t4, check);\n}\ntemplate <class From, class To>\nvoid test_convert_neg_float(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_integer> const&, std::integral_constant<int, number_kind_floating_point> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>(bits_wanted);\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      To   check(from.str() + \".0\");\n      BOOST_CHECK_EQUAL(t1, check);\n      BOOST_CHECK_EQUAL(t2, check);\n      test_convert_neg_float<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert()\n{\n   test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type());\n}\n\ntemplate <typename From, typename To>\nvoid test_convert_to_builtin()\n{\n   const int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n   \n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>(bits_wanted);\n      To t1 = from;\n      To t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(t1, t2);\n   }\n}\n\nint main()\n{\n   test_convert_to_builtin<tom_int, unsigned long long>();\n   test_convert_to_builtin<tom_int, long long>();\n   test_convert_to_builtin<tom_int, long>();\n   test_convert_to_builtin<tom_int, unsigned>();\n\n   #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS\n   test_convert_to_builtin<tom_int, long double>();\n   #endif\n   test_convert_to_builtin<tom_int, double>();\n   test_convert_to_builtin<tom_int, float>();\n\n   return boost::report_errors();\n}\n\n#else\n\nint main() { return 0; }\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/standalone_test_miller_rabin.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012-2021 John Maddock.\n//  Copyright 2021 Matt Borland. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/math/special_functions/prime.hpp>\n#include <boost/random.hpp>\n#include <random>\n#include <iostream>\n#include <iomanip>\n#include \"test.hpp\"\n\n#define BOOST_MP_STANDALONE\n#include <boost/multiprecision/miller_rabin.hpp>\n\ntemplate <class I>\nvoid test()\n{\n   //\n   // Very simple test program to verify that the GMP's Miller-Rabin\n   // implementation and this one agree on whether some random numbers\n   // are prime or not.  Of course these are probabilistic tests so there's\n   // no reason why they should actually agree - except the probability of\n   // disagreement for 25 trials is almost infinitely small.\n   //\n   using namespace boost::random;\n   using namespace boost::multiprecision;\n\n   typedef I test_type;\n\n   static const unsigned test_bits =\n      std::numeric_limits<test_type>::digits && (std::numeric_limits<test_type>::digits <= 256)\n         ? std::numeric_limits<test_type>::digits\n         : 128;\n\n   independent_bits_engine<mt11213b, test_bits, test_type> gen;\n   //\n   // We must use a different generator for the tests and number generation, otherwise\n   // we get false positives.  Further we use the same random number engine for the\n   // Miller Rabin test as GMP uses internally:\n   //\n   mt19937 gen2;\n\n   //\n   // Begin by testing the primes in our table as all these should return true:\n   //\n   for (unsigned i = 1; i < boost::math::max_prime; ++i)\n   {\n      BOOST_TEST(miller_rabin_test(test_type(boost::math::prime(i)), 25, gen));\n      BOOST_TEST(mpz_probab_prime_p(mpz_int(boost::math::prime(i)).backend().data(), 25));\n   }\n   //\n   // Now test some random values and compare GMP's native routine with ours.\n   //\n   for (unsigned i = 0; i < 10000; ++i)\n   {\n      test_type n              = gen();\n      bool      is_prime_boost = miller_rabin_test(n, 25, gen2);\n      bool      is_gmp_prime   = mpz_probab_prime_p(mpz_int(n).backend().data(), 25) ? true : false;\n      if (is_prime_boost && is_gmp_prime)\n      {\n         std::cout << \"We have a prime: \" << std::hex << std::showbase << n << std::endl;\n      }\n      if (is_prime_boost != is_gmp_prime)\n         std::cout << std::hex << std::showbase << \"n = \" << n << std::endl;\n      BOOST_CHECK_EQUAL(is_prime_boost, is_gmp_prime);\n   }\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n   test<mpz_int>();\n   test<number<gmp_int, et_off> >();\n   test<std::uint64_t>();\n   test<std::uint32_t>();\n\n   test<cpp_int>();\n   test<number<cpp_int_backend<64, 64, unsigned_magnitude, checked, void>, et_off> >();\n   test<checked_uint128_t>();\n   test<checked_uint1024_t>();\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/string_data.ipp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n{{\n    \"1e+08\",\n    \"1.e+08\",\n    \"+1e+08\",\n    \"1.2e+08\",\n    \"+1.2e+08\",\n    \"1.2e+08\",\n    \"123456789.0\",\n    \"123456789.0\",\n    \"+123456789.0\",\n    \"1.2e+08\",\n    \"1.2e+08\",\n    \"+1.2e+08\",\n    \"1.23e+08\",\n    \"+1.23e+08\",\n    \"1.23e+08\",\n    \"123456789.00\",\n    \"123456789.00\",\n    \"+123456789.00\",\n    \"1.23e+08\",\n    \"1.23e+08\",\n    \"+1.23e+08\",\n    \"1.235e+08\",\n    \"+1.235e+08\",\n    \"1.235e+08\",\n    \"123456789.000\",\n    \"123456789.000\",\n    \"+123456789.000\",\n    \"1.235e+08\",\n    \"1.235e+08\",\n    \"+1.235e+08\",\n    \"1.2346e+08\",\n    \"+1.2346e+08\",\n    \"1.2346e+08\",\n    \"123456789.0000\",\n    \"123456789.0000\",\n    \"+123456789.0000\",\n    \"1.2346e+08\",\n    \"1.2346e+08\",\n    \"+1.2346e+08\",\n    \"1.23457e+08\",\n    \"+1.23457e+08\",\n    \"1.23457e+08\",\n    \"123456789.00000\",\n    \"123456789.00000\",\n    \"+123456789.00000\",\n    \"1.23457e+08\",\n    \"1.23457e+08\",\n    \"+1.23457e+08\",\n    \"1.234568e+08\",\n    \"+1.234568e+08\",\n    \"1.234568e+08\",\n    \"123456789.000000\",\n    \"123456789.000000\",\n    \"+123456789.000000\",\n    \"1.234568e+08\",\n    \"1.234568e+08\",\n    \"+1.234568e+08\",\n    \"1.2345679e+08\",\n    \"+1.2345679e+08\",\n    \"1.2345679e+08\",\n    \"123456789.0000000\",\n    \"123456789.0000000\",\n    \"+123456789.0000000\",\n    \"1.2345679e+08\",\n    \"1.2345679e+08\",\n    \"+1.2345679e+08\",\n    \"1.23456789e+08\",\n    \"+1.23456789e+08\",\n    \"1.23456789e+08\",\n    \"123456789.00000000\",\n    \"123456789.00000000\",\n    \"+123456789.00000000\",\n    \"123456789\",\n    \"123456789.\",\n    \"+123456789\",\n    \"1.234567890e+08\",\n    \"+1.234567890e+08\",\n    \"1.234567890e+08\",\n    \"123456789.000000000\",\n    \"123456789.000000000\",\n    \"+123456789.000000000\",\n    \"123456789\",\n    \"123456789.0\",\n    \"+123456789\",\n    \"1.2345678900e+08\",\n    \"+1.2345678900e+08\",\n    \"1.2345678900e+08\",\n    \"123456789.0000000000\",\n    \"123456789.0000000000\",\n    \"+123456789.0000000000\",\n    \"123456789\",\n    \"123456789.00\",\n    \"+123456789\",\n    \"1.23456789000e+08\",\n    \"+1.23456789000e+08\",\n    \"1.23456789000e+08\",\n    \"123456789.00000000000\",\n    \"123456789.00000000000\",\n    \"+123456789.00000000000\",\n    \"123456789\",\n    \"123456789.000\",\n    \"+123456789\",\n    \"1.234567890000e+08\",\n    \"+1.234567890000e+08\",\n    \"1.234567890000e+08\",\n    \"123456789.000000000000\",\n    \"123456789.000000000000\",\n    \"+123456789.000000000000\",\n    \"123456789\",\n    \"123456789.0000\",\n    \"+123456789\",\n    \"1.2345678900000e+08\",\n    \"+1.2345678900000e+08\",\n    \"1.2345678900000e+08\",\n    \"123456789.0000000000000\",\n    \"123456789.0000000000000\",\n    \"+123456789.0000000000000\",\n}},\n    {{\n        \"-1e+08\",\n        \"-1.e+08\",\n        \"-1e+08\",\n        \"-1.2e+08\",\n        \"-1.2e+08\",\n        \"-1.2e+08\",\n        \"-123456789.0\",\n        \"-123456789.0\",\n        \"-123456789.0\",\n        \"-1.2e+08\",\n        \"-1.2e+08\",\n        \"-1.2e+08\",\n        \"-1.23e+08\",\n        \"-1.23e+08\",\n        \"-1.23e+08\",\n        \"-123456789.00\",\n        \"-123456789.00\",\n        \"-123456789.00\",\n        \"-1.23e+08\",\n        \"-1.23e+08\",\n        \"-1.23e+08\",\n        \"-1.235e+08\",\n        \"-1.235e+08\",\n        \"-1.235e+08\",\n        \"-123456789.000\",\n        \"-123456789.000\",\n        \"-123456789.000\",\n        \"-1.235e+08\",\n        \"-1.235e+08\",\n        \"-1.235e+08\",\n        \"-1.2346e+08\",\n        \"-1.2346e+08\",\n        \"-1.2346e+08\",\n        \"-123456789.0000\",\n        \"-123456789.0000\",\n        \"-123456789.0000\",\n        \"-1.2346e+08\",\n        \"-1.2346e+08\",\n        \"-1.2346e+08\",\n        \"-1.23457e+08\",\n        \"-1.23457e+08\",\n        \"-1.23457e+08\",\n        \"-123456789.00000\",\n        \"-123456789.00000\",\n        \"-123456789.00000\",\n        \"-1.23457e+08\",\n        \"-1.23457e+08\",\n        \"-1.23457e+08\",\n        \"-1.234568e+08\",\n        \"-1.234568e+08\",\n        \"-1.234568e+08\",\n        \"-123456789.000000\",\n        \"-123456789.000000\",\n        \"-123456789.000000\",\n        \"-1.234568e+08\",\n        \"-1.234568e+08\",\n        \"-1.234568e+08\",\n        \"-1.2345679e+08\",\n        \"-1.2345679e+08\",\n        \"-1.2345679e+08\",\n        \"-123456789.0000000\",\n        \"-123456789.0000000\",\n        \"-123456789.0000000\",\n        \"-1.2345679e+08\",\n        \"-1.2345679e+08\",\n        \"-1.2345679e+08\",\n        \"-1.23456789e+08\",\n        \"-1.23456789e+08\",\n        \"-1.23456789e+08\",\n        \"-123456789.00000000\",\n        \"-123456789.00000000\",\n        \"-123456789.00000000\",\n        \"-123456789\",\n        \"-123456789.\",\n        \"-123456789\",\n        \"-1.234567890e+08\",\n        \"-1.234567890e+08\",\n        \"-1.234567890e+08\",\n        \"-123456789.000000000\",\n        \"-123456789.000000000\",\n        \"-123456789.000000000\",\n        \"-123456789\",\n        \"-123456789.0\",\n        \"-123456789\",\n        \"-1.2345678900e+08\",\n        \"-1.2345678900e+08\",\n        \"-1.2345678900e+08\",\n        \"-123456789.0000000000\",\n        \"-123456789.0000000000\",\n        \"-123456789.0000000000\",\n        \"-123456789\",\n        \"-123456789.00\",\n        \"-123456789\",\n        \"-1.23456789000e+08\",\n        \"-1.23456789000e+08\",\n        \"-1.23456789000e+08\",\n        \"-123456789.00000000000\",\n        \"-123456789.00000000000\",\n        \"-123456789.00000000000\",\n        \"-123456789\",\n        \"-123456789.000\",\n        \"-123456789\",\n        \"-1.234567890000e+08\",\n        \"-1.234567890000e+08\",\n        \"-1.234567890000e+08\",\n        \"-123456789.000000000000\",\n        \"-123456789.000000000000\",\n        \"-123456789.000000000000\",\n        \"-123456789\",\n        \"-123456789.0000\",\n        \"-123456789\",\n        \"-1.2345678900000e+08\",\n        \"-1.2345678900000e+08\",\n        \"-1.2345678900000e+08\",\n        \"-123456789.0000000000000\",\n        \"-123456789.0000000000000\",\n        \"-123456789.0000000000000\",\n    }},\n    {{\n        \"2e+07\",\n        \"2.e+07\",\n        \"+2e+07\",\n        \"1.5e+07\",\n        \"+1.5e+07\",\n        \"1.5e+07\",\n        \"15432098.6\",\n        \"15432098.6\",\n        \"+15432098.6\",\n        \"1.5e+07\",\n        \"1.5e+07\",\n        \"+1.5e+07\",\n        \"1.54e+07\",\n        \"+1.54e+07\",\n        \"1.54e+07\",\n        \"15432098.62\",\n        \"15432098.62\",\n        \"+15432098.62\",\n        \"1.54e+07\",\n        \"1.54e+07\",\n        \"+1.54e+07\",\n        \"1.543e+07\",\n        \"+1.543e+07\",\n        \"1.543e+07\",\n        \"15432098.625\",\n        \"15432098.625\",\n        \"+15432098.625\",\n        \"1.543e+07\",\n        \"1.543e+07\",\n        \"+1.543e+07\",\n        \"1.5432e+07\",\n        \"+1.5432e+07\",\n        \"1.5432e+07\",\n        \"15432098.6250\",\n        \"15432098.6250\",\n        \"+15432098.6250\",\n        \"1.5432e+07\",\n        \"1.5432e+07\",\n        \"+1.5432e+07\",\n        \"1.54321e+07\",\n        \"+1.54321e+07\",\n        \"1.54321e+07\",\n        \"15432098.62500\",\n        \"15432098.62500\",\n        \"+15432098.62500\",\n        \"1.54321e+07\",\n        \"1.54321e+07\",\n        \"+1.54321e+07\",\n        \"1.543210e+07\",\n        \"+1.543210e+07\",\n        \"1.543210e+07\",\n        \"15432098.625000\",\n        \"15432098.625000\",\n        \"+15432098.625000\",\n        \"1.54321e+07\",\n        \"1.543210e+07\",\n        \"+1.54321e+07\",\n        \"1.5432099e+07\",\n        \"+1.5432099e+07\",\n        \"1.5432099e+07\",\n        \"15432098.6250000\",\n        \"15432098.6250000\",\n        \"+15432098.6250000\",\n        \"15432099\",\n        \"15432099.\",\n        \"+15432099\",\n        \"1.54320986e+07\",\n        \"+1.54320986e+07\",\n        \"1.54320986e+07\",\n        \"15432098.62500000\",\n        \"15432098.62500000\",\n        \"+15432098.62500000\",\n        \"15432098.6\",\n        \"15432098.6\",\n        \"+15432098.6\",\n        \"1.543209862e+07\",\n        \"+1.543209862e+07\",\n        \"1.543209862e+07\",\n        \"15432098.625000000\",\n        \"15432098.625000000\",\n        \"+15432098.625000000\",\n        \"15432098.62\",\n        \"15432098.62\",\n        \"+15432098.62\",\n        \"1.5432098625e+07\",\n        \"+1.5432098625e+07\",\n        \"1.5432098625e+07\",\n        \"15432098.6250000000\",\n        \"15432098.6250000000\",\n        \"+15432098.6250000000\",\n        \"15432098.625\",\n        \"15432098.625\",\n        \"+15432098.625\",\n        \"1.54320986250e+07\",\n        \"+1.54320986250e+07\",\n        \"1.54320986250e+07\",\n        \"15432098.62500000000\",\n        \"15432098.62500000000\",\n        \"+15432098.62500000000\",\n        \"15432098.625\",\n        \"15432098.6250\",\n        \"+15432098.625\",\n        \"1.543209862500e+07\",\n        \"+1.543209862500e+07\",\n        \"1.543209862500e+07\",\n        \"15432098.625000000000\",\n        \"15432098.625000000000\",\n        \"+15432098.625000000000\",\n        \"15432098.625\",\n        \"15432098.62500\",\n        \"+15432098.625\",\n        \"1.5432098625000e+07\",\n        \"+1.5432098625000e+07\",\n        \"1.5432098625000e+07\",\n        \"15432098.6250000000000\",\n        \"15432098.6250000000000\",\n        \"+15432098.6250000000000\",\n    }},\n    {{\n        \"-2e+07\",\n        \"-2.e+07\",\n        \"-2e+07\",\n        \"-1.5e+07\",\n        \"-1.5e+07\",\n        \"-1.5e+07\",\n        \"-15432098.6\",\n        \"-15432098.6\",\n        \"-15432098.6\",\n        \"-1.5e+07\",\n        \"-1.5e+07\",\n        \"-1.5e+07\",\n        \"-1.54e+07\",\n        \"-1.54e+07\",\n        \"-1.54e+07\",\n        \"-15432098.62\",\n        \"-15432098.62\",\n        \"-15432098.62\",\n        \"-1.54e+07\",\n        \"-1.54e+07\",\n        \"-1.54e+07\",\n        \"-1.543e+07\",\n        \"-1.543e+07\",\n        \"-1.543e+07\",\n        \"-15432098.625\",\n        \"-15432098.625\",\n        \"-15432098.625\",\n        \"-1.543e+07\",\n        \"-1.543e+07\",\n        \"-1.543e+07\",\n        \"-1.5432e+07\",\n        \"-1.5432e+07\",\n        \"-1.5432e+07\",\n        \"-15432098.6250\",\n        \"-15432098.6250\",\n        \"-15432098.6250\",\n        \"-1.5432e+07\",\n        \"-1.5432e+07\",\n        \"-1.5432e+07\",\n        \"-1.54321e+07\",\n        \"-1.54321e+07\",\n        \"-1.54321e+07\",\n        \"-15432098.62500\",\n        \"-15432098.62500\",\n        \"-15432098.62500\",\n        \"-1.54321e+07\",\n        \"-1.54321e+07\",\n        \"-1.54321e+07\",\n        \"-1.543210e+07\",\n        \"-1.543210e+07\",\n        \"-1.543210e+07\",\n        \"-15432098.625000\",\n        \"-15432098.625000\",\n        \"-15432098.625000\",\n        \"-1.54321e+07\",\n        \"-1.543210e+07\",\n        \"-1.54321e+07\",\n        \"-1.5432099e+07\",\n        \"-1.5432099e+07\",\n        \"-1.5432099e+07\",\n        \"-15432098.6250000\",\n        \"-15432098.6250000\",\n        \"-15432098.6250000\",\n        \"-15432099\",\n        \"-15432099.\",\n        \"-15432099\",\n        \"-1.54320986e+07\",\n        \"-1.54320986e+07\",\n        \"-1.54320986e+07\",\n        \"-15432098.62500000\",\n        \"-15432098.62500000\",\n        \"-15432098.62500000\",\n        \"-15432098.6\",\n        \"-15432098.6\",\n        \"-15432098.6\",\n        \"-1.543209862e+07\",\n        \"-1.543209862e+07\",\n        \"-1.543209862e+07\",\n        \"-15432098.625000000\",\n        \"-15432098.625000000\",\n        \"-15432098.625000000\",\n        \"-15432098.62\",\n        \"-15432098.62\",\n        \"-15432098.62\",\n        \"-1.5432098625e+07\",\n        \"-1.5432098625e+07\",\n        \"-1.5432098625e+07\",\n        \"-15432098.6250000000\",\n        \"-15432098.6250000000\",\n        \"-15432098.6250000000\",\n        \"-15432098.625\",\n        \"-15432098.625\",\n        \"-15432098.625\",\n        \"-1.54320986250e+07\",\n        \"-1.54320986250e+07\",\n        \"-1.54320986250e+07\",\n        \"-15432098.62500000000\",\n        \"-15432098.62500000000\",\n        \"-15432098.62500000000\",\n        \"-15432098.625\",\n        \"-15432098.6250\",\n        \"-15432098.625\",\n        \"-1.543209862500e+07\",\n        \"-1.543209862500e+07\",\n        \"-1.543209862500e+07\",\n        \"-15432098.625000000000\",\n        \"-15432098.625000000000\",\n        \"-15432098.625000000000\",\n        \"-15432098.625\",\n        \"-15432098.62500\",\n        \"-15432098.625\",\n        \"-1.5432098625000e+07\",\n        \"-1.5432098625000e+07\",\n        \"-1.5432098625000e+07\",\n        \"-15432098.6250000000000\",\n        \"-15432098.6250000000000\",\n        \"-15432098.6250000000000\",\n    }},\n    {{\n        \"2e+06\",\n        \"2.e+06\",\n        \"+2e+06\",\n        \"1.9e+06\",\n        \"+1.9e+06\",\n        \"1.9e+06\",\n        \"1929012.3\",\n        \"1929012.3\",\n        \"+1929012.3\",\n        \"1.9e+06\",\n        \"1.9e+06\",\n        \"+1.9e+06\",\n        \"1.93e+06\",\n        \"+1.93e+06\",\n        \"1.93e+06\",\n        \"1929012.33\",\n        \"1929012.33\",\n        \"+1929012.33\",\n        \"1.93e+06\",\n        \"1.93e+06\",\n        \"+1.93e+06\",\n        \"1.929e+06\",\n        \"+1.929e+06\",\n        \"1.929e+06\",\n        \"1929012.328\",\n        \"1929012.328\",\n        \"+1929012.328\",\n        \"1.929e+06\",\n        \"1.929e+06\",\n        \"+1.929e+06\",\n        \"1.9290e+06\",\n        \"+1.9290e+06\",\n        \"1.9290e+06\",\n        \"1929012.3281\",\n        \"1929012.3281\",\n        \"+1929012.3281\",\n        \"1.929e+06\",\n        \"1.9290e+06\",\n        \"+1.929e+06\",\n        \"1.92901e+06\",\n        \"+1.92901e+06\",\n        \"1.92901e+06\",\n        \"1929012.32812\",\n        \"1929012.32812\",\n        \"+1929012.32812\",\n        \"1.92901e+06\",\n        \"1.92901e+06\",\n        \"+1.92901e+06\",\n        \"1.929012e+06\",\n        \"+1.929012e+06\",\n        \"1.929012e+06\",\n        \"1929012.328125\",\n        \"1929012.328125\",\n        \"+1929012.328125\",\n        \"1929012\",\n        \"1929012.\",\n        \"+1929012\",\n        \"1.9290123e+06\",\n        \"+1.9290123e+06\",\n        \"1.9290123e+06\",\n        \"1929012.3281250\",\n        \"1929012.3281250\",\n        \"+1929012.3281250\",\n        \"1929012.3\",\n        \"1929012.3\",\n        \"+1929012.3\",\n        \"1.92901233e+06\",\n        \"+1.92901233e+06\",\n        \"1.92901233e+06\",\n        \"1929012.32812500\",\n        \"1929012.32812500\",\n        \"+1929012.32812500\",\n        \"1929012.33\",\n        \"1929012.33\",\n        \"+1929012.33\",\n        \"1.929012328e+06\",\n        \"+1.929012328e+06\",\n        \"1.929012328e+06\",\n        \"1929012.328125000\",\n        \"1929012.328125000\",\n        \"+1929012.328125000\",\n        \"1929012.328\",\n        \"1929012.328\",\n        \"+1929012.328\",\n        \"1.9290123281e+06\",\n        \"+1.9290123281e+06\",\n        \"1.9290123281e+06\",\n        \"1929012.3281250000\",\n        \"1929012.3281250000\",\n        \"+1929012.3281250000\",\n        \"1929012.3281\",\n        \"1929012.3281\",\n        \"+1929012.3281\",\n        \"1.92901232812e+06\",\n        \"+1.92901232812e+06\",\n        \"1.92901232812e+06\",\n        \"1929012.32812500000\",\n        \"1929012.32812500000\",\n        \"+1929012.32812500000\",\n        \"1929012.32812\",\n        \"1929012.32812\",\n        \"+1929012.32812\",\n        \"1.929012328125e+06\",\n        \"+1.929012328125e+06\",\n        \"1.929012328125e+06\",\n        \"1929012.328125000000\",\n        \"1929012.328125000000\",\n        \"+1929012.328125000000\",\n        \"1929012.328125\",\n        \"1929012.328125\",\n        \"+1929012.328125\",\n        \"1.9290123281250e+06\",\n        \"+1.9290123281250e+06\",\n        \"1.9290123281250e+06\",\n        \"1929012.3281250000000\",\n        \"1929012.3281250000000\",\n        \"+1929012.3281250000000\",\n    }},\n    {{\n        \"-2e+06\",\n        \"-2.e+06\",\n        \"-2e+06\",\n        \"-1.9e+06\",\n        \"-1.9e+06\",\n        \"-1.9e+06\",\n        \"-1929012.3\",\n        \"-1929012.3\",\n        \"-1929012.3\",\n        \"-1.9e+06\",\n        \"-1.9e+06\",\n        \"-1.9e+06\",\n        \"-1.93e+06\",\n        \"-1.93e+06\",\n        \"-1.93e+06\",\n        \"-1929012.33\",\n        \"-1929012.33\",\n        \"-1929012.33\",\n        \"-1.93e+06\",\n        \"-1.93e+06\",\n        \"-1.93e+06\",\n        \"-1.929e+06\",\n        \"-1.929e+06\",\n        \"-1.929e+06\",\n        \"-1929012.328\",\n        \"-1929012.328\",\n        \"-1929012.328\",\n        \"-1.929e+06\",\n        \"-1.929e+06\",\n        \"-1.929e+06\",\n        \"-1.9290e+06\",\n        \"-1.9290e+06\",\n        \"-1.9290e+06\",\n        \"-1929012.3281\",\n        \"-1929012.3281\",\n        \"-1929012.3281\",\n        \"-1.929e+06\",\n        \"-1.9290e+06\",\n        \"-1.929e+06\",\n        \"-1.92901e+06\",\n        \"-1.92901e+06\",\n        \"-1.92901e+06\",\n        \"-1929012.32812\",\n        \"-1929012.32812\",\n        \"-1929012.32812\",\n        \"-1.92901e+06\",\n        \"-1.92901e+06\",\n        \"-1.92901e+06\",\n        \"-1.929012e+06\",\n        \"-1.929012e+06\",\n        \"-1.929012e+06\",\n        \"-1929012.328125\",\n        \"-1929012.328125\",\n        \"-1929012.328125\",\n        \"-1929012\",\n        \"-1929012.\",\n        \"-1929012\",\n        \"-1.9290123e+06\",\n        \"-1.9290123e+06\",\n        \"-1.9290123e+06\",\n        \"-1929012.3281250\",\n        \"-1929012.3281250\",\n        \"-1929012.3281250\",\n        \"-1929012.3\",\n        \"-1929012.3\",\n        \"-1929012.3\",\n        \"-1.92901233e+06\",\n        \"-1.92901233e+06\",\n        \"-1.92901233e+06\",\n        \"-1929012.32812500\",\n        \"-1929012.32812500\",\n        \"-1929012.32812500\",\n        \"-1929012.33\",\n        \"-1929012.33\",\n        \"-1929012.33\",\n        \"-1.929012328e+06\",\n        \"-1.929012328e+06\",\n        \"-1.929012328e+06\",\n        \"-1929012.328125000\",\n        \"-1929012.328125000\",\n        \"-1929012.328125000\",\n        \"-1929012.328\",\n        \"-1929012.328\",\n        \"-1929012.328\",\n        \"-1.9290123281e+06\",\n        \"-1.9290123281e+06\",\n        \"-1.9290123281e+06\",\n        \"-1929012.3281250000\",\n        \"-1929012.3281250000\",\n        \"-1929012.3281250000\",\n        \"-1929012.3281\",\n        \"-1929012.3281\",\n        \"-1929012.3281\",\n        \"-1.92901232812e+06\",\n        \"-1.92901232812e+06\",\n        \"-1.92901232812e+06\",\n        \"-1929012.32812500000\",\n        \"-1929012.32812500000\",\n        \"-1929012.32812500000\",\n        \"-1929012.32812\",\n        \"-1929012.32812\",\n        \"-1929012.32812\",\n        \"-1.929012328125e+06\",\n        \"-1.929012328125e+06\",\n        \"-1.929012328125e+06\",\n        \"-1929012.328125000000\",\n        \"-1929012.328125000000\",\n        \"-1929012.328125000000\",\n        \"-1929012.328125\",\n        \"-1929012.328125\",\n        \"-1929012.328125\",\n        \"-1.9290123281250e+06\",\n        \"-1.9290123281250e+06\",\n        \"-1.9290123281250e+06\",\n        \"-1929012.3281250000000\",\n        \"-1929012.3281250000000\",\n        \"-1929012.3281250000000\",\n    }},\n    {{\n        \"2e+05\",\n        \"2.e+05\",\n        \"+2e+05\",\n        \"2.4e+05\",\n        \"+2.4e+05\",\n        \"2.4e+05\",\n        \"241126.5\",\n        \"241126.5\",\n        \"+241126.5\",\n        \"2.4e+05\",\n        \"2.4e+05\",\n        \"+2.4e+05\",\n        \"2.41e+05\",\n        \"+2.41e+05\",\n        \"2.41e+05\",\n        \"241126.54\",\n        \"241126.54\",\n        \"+241126.54\",\n        \"2.41e+05\",\n        \"2.41e+05\",\n        \"+2.41e+05\",\n        \"2.411e+05\",\n        \"+2.411e+05\",\n        \"2.411e+05\",\n        \"241126.541\",\n        \"241126.541\",\n        \"+241126.541\",\n        \"2.411e+05\",\n        \"2.411e+05\",\n        \"+2.411e+05\",\n        \"2.4113e+05\",\n        \"+2.4113e+05\",\n        \"2.4113e+05\",\n        \"241126.5410\",\n        \"241126.5410\",\n        \"+241126.5410\",\n        \"2.4113e+05\",\n        \"2.4113e+05\",\n        \"+2.4113e+05\",\n        \"2.41127e+05\",\n        \"+2.41127e+05\",\n        \"2.41127e+05\",\n        \"241126.54102\",\n        \"241126.54102\",\n        \"+241126.54102\",\n        \"241127\",\n        \"241127.\",\n        \"+241127\",\n        \"2.411265e+05\",\n        \"+2.411265e+05\",\n        \"2.411265e+05\",\n        \"241126.541016\",\n        \"241126.541016\",\n        \"+241126.541016\",\n        \"241126.5\",\n        \"241126.5\",\n        \"+241126.5\",\n        \"2.4112654e+05\",\n        \"+2.4112654e+05\",\n        \"2.4112654e+05\",\n        \"241126.5410156\",\n        \"241126.5410156\",\n        \"+241126.5410156\",\n        \"241126.54\",\n        \"241126.54\",\n        \"+241126.54\",\n        \"2.41126541e+05\",\n        \"+2.41126541e+05\",\n        \"2.41126541e+05\",\n        \"241126.54101562\",\n        \"241126.54101562\",\n        \"+241126.54101562\",\n        \"241126.541\",\n        \"241126.541\",\n        \"+241126.541\",\n        \"2.411265410e+05\",\n        \"+2.411265410e+05\",\n        \"2.411265410e+05\",\n        \"241126.541015625\",\n        \"241126.541015625\",\n        \"+241126.541015625\",\n        \"241126.541\",\n        \"241126.5410\",\n        \"+241126.541\",\n        \"2.4112654102e+05\",\n        \"+2.4112654102e+05\",\n        \"2.4112654102e+05\",\n        \"241126.5410156250\",\n        \"241126.5410156250\",\n        \"+241126.5410156250\",\n        \"241126.54102\",\n        \"241126.54102\",\n        \"+241126.54102\",\n        \"2.41126541016e+05\",\n        \"+2.41126541016e+05\",\n        \"2.41126541016e+05\",\n        \"241126.54101562500\",\n        \"241126.54101562500\",\n        \"+241126.54101562500\",\n        \"241126.541016\",\n        \"241126.541016\",\n        \"+241126.541016\",\n        \"2.411265410156e+05\",\n        \"+2.411265410156e+05\",\n        \"2.411265410156e+05\",\n        \"241126.541015625000\",\n        \"241126.541015625000\",\n        \"+241126.541015625000\",\n        \"241126.5410156\",\n        \"241126.5410156\",\n        \"+241126.5410156\",\n        \"2.4112654101562e+05\",\n        \"+2.4112654101562e+05\",\n        \"2.4112654101562e+05\",\n        \"241126.5410156250000\",\n        \"241126.5410156250000\",\n        \"+241126.5410156250000\",\n    }},\n    {{\n        \"-2e+05\",\n        \"-2.e+05\",\n        \"-2e+05\",\n        \"-2.4e+05\",\n        \"-2.4e+05\",\n        \"-2.4e+05\",\n        \"-241126.5\",\n        \"-241126.5\",\n        \"-241126.5\",\n        \"-2.4e+05\",\n        \"-2.4e+05\",\n        \"-2.4e+05\",\n        \"-2.41e+05\",\n        \"-2.41e+05\",\n        \"-2.41e+05\",\n        \"-241126.54\",\n        \"-241126.54\",\n        \"-241126.54\",\n        \"-2.41e+05\",\n        \"-2.41e+05\",\n        \"-2.41e+05\",\n        \"-2.411e+05\",\n        \"-2.411e+05\",\n        \"-2.411e+05\",\n        \"-241126.541\",\n        \"-241126.541\",\n        \"-241126.541\",\n        \"-2.411e+05\",\n        \"-2.411e+05\",\n        \"-2.411e+05\",\n        \"-2.4113e+05\",\n        \"-2.4113e+05\",\n        \"-2.4113e+05\",\n        \"-241126.5410\",\n        \"-241126.5410\",\n        \"-241126.5410\",\n        \"-2.4113e+05\",\n        \"-2.4113e+05\",\n        \"-2.4113e+05\",\n        \"-2.41127e+05\",\n        \"-2.41127e+05\",\n        \"-2.41127e+05\",\n        \"-241126.54102\",\n        \"-241126.54102\",\n        \"-241126.54102\",\n        \"-241127\",\n        \"-241127.\",\n        \"-241127\",\n        \"-2.411265e+05\",\n        \"-2.411265e+05\",\n        \"-2.411265e+05\",\n        \"-241126.541016\",\n        \"-241126.541016\",\n        \"-241126.541016\",\n        \"-241126.5\",\n        \"-241126.5\",\n        \"-241126.5\",\n        \"-2.4112654e+05\",\n        \"-2.4112654e+05\",\n        \"-2.4112654e+05\",\n        \"-241126.5410156\",\n        \"-241126.5410156\",\n        \"-241126.5410156\",\n        \"-241126.54\",\n        \"-241126.54\",\n        \"-241126.54\",\n        \"-2.41126541e+05\",\n        \"-2.41126541e+05\",\n        \"-2.41126541e+05\",\n        \"-241126.54101562\",\n        \"-241126.54101562\",\n        \"-241126.54101562\",\n        \"-241126.541\",\n        \"-241126.541\",\n        \"-241126.541\",\n        \"-2.411265410e+05\",\n        \"-2.411265410e+05\",\n        \"-2.411265410e+05\",\n        \"-241126.541015625\",\n        \"-241126.541015625\",\n        \"-241126.541015625\",\n        \"-241126.541\",\n        \"-241126.5410\",\n        \"-241126.541\",\n        \"-2.4112654102e+05\",\n        \"-2.4112654102e+05\",\n        \"-2.4112654102e+05\",\n        \"-241126.5410156250\",\n        \"-241126.5410156250\",\n        \"-241126.5410156250\",\n        \"-241126.54102\",\n        \"-241126.54102\",\n        \"-241126.54102\",\n        \"-2.41126541016e+05\",\n        \"-2.41126541016e+05\",\n        \"-2.41126541016e+05\",\n        \"-241126.54101562500\",\n        \"-241126.54101562500\",\n        \"-241126.54101562500\",\n        \"-241126.541016\",\n        \"-241126.541016\",\n        \"-241126.541016\",\n        \"-2.411265410156e+05\",\n        \"-2.411265410156e+05\",\n        \"-2.411265410156e+05\",\n        \"-241126.541015625000\",\n        \"-241126.541015625000\",\n        \"-241126.541015625000\",\n        \"-241126.5410156\",\n        \"-241126.5410156\",\n        \"-241126.5410156\",\n        \"-2.4112654101562e+05\",\n        \"-2.4112654101562e+05\",\n        \"-2.4112654101562e+05\",\n        \"-241126.5410156250000\",\n        \"-241126.5410156250000\",\n        \"-241126.5410156250000\",\n    }},\n    {{\n        \"3e+04\",\n        \"3.e+04\",\n        \"+3e+04\",\n        \"3.0e+04\",\n        \"+3.0e+04\",\n        \"3.0e+04\",\n        \"30140.8\",\n        \"30140.8\",\n        \"+30140.8\",\n        \"3e+04\",\n        \"3.0e+04\",\n        \"+3e+04\",\n        \"3.01e+04\",\n        \"+3.01e+04\",\n        \"3.01e+04\",\n        \"30140.82\",\n        \"30140.82\",\n        \"+30140.82\",\n        \"3.01e+04\",\n        \"3.01e+04\",\n        \"+3.01e+04\",\n        \"3.014e+04\",\n        \"+3.014e+04\",\n        \"3.014e+04\",\n        \"30140.818\",\n        \"30140.818\",\n        \"+30140.818\",\n        \"3.014e+04\",\n        \"3.014e+04\",\n        \"+3.014e+04\",\n        \"3.0141e+04\",\n        \"+3.0141e+04\",\n        \"3.0141e+04\",\n        \"30140.8176\",\n        \"30140.8176\",\n        \"+30140.8176\",\n        \"30141\",\n        \"30141.\",\n        \"+30141\",\n        \"3.01408e+04\",\n        \"+3.01408e+04\",\n        \"3.01408e+04\",\n        \"30140.81763\",\n        \"30140.81763\",\n        \"+30140.81763\",\n        \"30140.8\",\n        \"30140.8\",\n        \"+30140.8\",\n        \"3.014082e+04\",\n        \"+3.014082e+04\",\n        \"3.014082e+04\",\n        \"30140.817627\",\n        \"30140.817627\",\n        \"+30140.817627\",\n        \"30140.82\",\n        \"30140.82\",\n        \"+30140.82\",\n        \"3.0140818e+04\",\n        \"+3.0140818e+04\",\n        \"3.0140818e+04\",\n        \"30140.8176270\",\n        \"30140.8176270\",\n        \"+30140.8176270\",\n        \"30140.818\",\n        \"30140.818\",\n        \"+30140.818\",\n        \"3.01408176e+04\",\n        \"+3.01408176e+04\",\n        \"3.01408176e+04\",\n        \"30140.81762695\",\n        \"30140.81762695\",\n        \"+30140.81762695\",\n        \"30140.8176\",\n        \"30140.8176\",\n        \"+30140.8176\",\n        \"3.014081763e+04\",\n        \"+3.014081763e+04\",\n        \"3.014081763e+04\",\n        \"30140.817626953\",\n        \"30140.817626953\",\n        \"+30140.817626953\",\n        \"30140.81763\",\n        \"30140.81763\",\n        \"+30140.81763\",\n        \"3.0140817627e+04\",\n        \"+3.0140817627e+04\",\n        \"3.0140817627e+04\",\n        \"30140.8176269531\",\n        \"30140.8176269531\",\n        \"+30140.8176269531\",\n        \"30140.817627\",\n        \"30140.817627\",\n        \"+30140.817627\",\n        \"3.01408176270e+04\",\n        \"+3.01408176270e+04\",\n        \"3.01408176270e+04\",\n        \"30140.81762695312\",\n        \"30140.81762695312\",\n        \"+30140.81762695312\",\n        \"30140.817627\",\n        \"30140.8176270\",\n        \"+30140.817627\",\n        \"3.014081762695e+04\",\n        \"+3.014081762695e+04\",\n        \"3.014081762695e+04\",\n        \"30140.817626953125\",\n        \"30140.817626953125\",\n        \"+30140.817626953125\",\n        \"30140.81762695\",\n        \"30140.81762695\",\n        \"+30140.81762695\",\n        \"3.0140817626953e+04\",\n        \"+3.0140817626953e+04\",\n        \"3.0140817626953e+04\",\n        \"30140.8176269531250\",\n        \"30140.8176269531250\",\n        \"+30140.8176269531250\",\n    }},\n    {{\n        \"-3e+04\",\n        \"-3.e+04\",\n        \"-3e+04\",\n        \"-3.0e+04\",\n        \"-3.0e+04\",\n        \"-3.0e+04\",\n        \"-30140.8\",\n        \"-30140.8\",\n        \"-30140.8\",\n        \"-3e+04\",\n        \"-3.0e+04\",\n        \"-3e+04\",\n        \"-3.01e+04\",\n        \"-3.01e+04\",\n        \"-3.01e+04\",\n        \"-30140.82\",\n        \"-30140.82\",\n        \"-30140.82\",\n        \"-3.01e+04\",\n        \"-3.01e+04\",\n        \"-3.01e+04\",\n        \"-3.014e+04\",\n        \"-3.014e+04\",\n        \"-3.014e+04\",\n        \"-30140.818\",\n        \"-30140.818\",\n        \"-30140.818\",\n        \"-3.014e+04\",\n        \"-3.014e+04\",\n        \"-3.014e+04\",\n        \"-3.0141e+04\",\n        \"-3.0141e+04\",\n        \"-3.0141e+04\",\n        \"-30140.8176\",\n        \"-30140.8176\",\n        \"-30140.8176\",\n        \"-30141\",\n        \"-30141.\",\n        \"-30141\",\n        \"-3.01408e+04\",\n        \"-3.01408e+04\",\n        \"-3.01408e+04\",\n        \"-30140.81763\",\n        \"-30140.81763\",\n        \"-30140.81763\",\n        \"-30140.8\",\n        \"-30140.8\",\n        \"-30140.8\",\n        \"-3.014082e+04\",\n        \"-3.014082e+04\",\n        \"-3.014082e+04\",\n        \"-30140.817627\",\n        \"-30140.817627\",\n        \"-30140.817627\",\n        \"-30140.82\",\n        \"-30140.82\",\n        \"-30140.82\",\n        \"-3.0140818e+04\",\n        \"-3.0140818e+04\",\n        \"-3.0140818e+04\",\n        \"-30140.8176270\",\n        \"-30140.8176270\",\n        \"-30140.8176270\",\n        \"-30140.818\",\n        \"-30140.818\",\n        \"-30140.818\",\n        \"-3.01408176e+04\",\n        \"-3.01408176e+04\",\n        \"-3.01408176e+04\",\n        \"-30140.81762695\",\n        \"-30140.81762695\",\n        \"-30140.81762695\",\n        \"-30140.8176\",\n        \"-30140.8176\",\n        \"-30140.8176\",\n        \"-3.014081763e+04\",\n        \"-3.014081763e+04\",\n        \"-3.014081763e+04\",\n        \"-30140.817626953\",\n        \"-30140.817626953\",\n        \"-30140.817626953\",\n        \"-30140.81763\",\n        \"-30140.81763\",\n        \"-30140.81763\",\n        \"-3.0140817627e+04\",\n        \"-3.0140817627e+04\",\n        \"-3.0140817627e+04\",\n        \"-30140.8176269531\",\n        \"-30140.8176269531\",\n        \"-30140.8176269531\",\n        \"-30140.817627\",\n        \"-30140.817627\",\n        \"-30140.817627\",\n        \"-3.01408176270e+04\",\n        \"-3.01408176270e+04\",\n        \"-3.01408176270e+04\",\n        \"-30140.81762695312\",\n        \"-30140.81762695312\",\n        \"-30140.81762695312\",\n        \"-30140.817627\",\n        \"-30140.8176270\",\n        \"-30140.817627\",\n        \"-3.014081762695e+04\",\n        \"-3.014081762695e+04\",\n        \"-3.014081762695e+04\",\n        \"-30140.817626953125\",\n        \"-30140.817626953125\",\n        \"-30140.817626953125\",\n        \"-30140.81762695\",\n        \"-30140.81762695\",\n        \"-30140.81762695\",\n        \"-3.0140817626953e+04\",\n        \"-3.0140817626953e+04\",\n        \"-3.0140817626953e+04\",\n        \"-30140.8176269531250\",\n        \"-30140.8176269531250\",\n        \"-30140.8176269531250\",\n    }},\n    {{\n        \"4e+03\",\n        \"4.e+03\",\n        \"+4e+03\",\n        \"3.8e+03\",\n        \"+3.8e+03\",\n        \"3.8e+03\",\n        \"3767.6\",\n        \"3767.6\",\n        \"+3767.6\",\n        \"3.8e+03\",\n        \"3.8e+03\",\n        \"+3.8e+03\",\n        \"3.77e+03\",\n        \"+3.77e+03\",\n        \"3.77e+03\",\n        \"3767.60\",\n        \"3767.60\",\n        \"+3767.60\",\n        \"3.77e+03\",\n        \"3.77e+03\",\n        \"+3.77e+03\",\n        \"3.768e+03\",\n        \"+3.768e+03\",\n        \"3.768e+03\",\n        \"3767.602\",\n        \"3767.602\",\n        \"+3767.602\",\n        \"3768\",\n        \"3768.\",\n        \"+3768\",\n        \"3.7676e+03\",\n        \"+3.7676e+03\",\n        \"3.7676e+03\",\n        \"3767.6022\",\n        \"3767.6022\",\n        \"+3767.6022\",\n        \"3767.6\",\n        \"3767.6\",\n        \"+3767.6\",\n        \"3.76760e+03\",\n        \"+3.76760e+03\",\n        \"3.76760e+03\",\n        \"3767.60220\",\n        \"3767.60220\",\n        \"+3767.60220\",\n        \"3767.6\",\n        \"3767.60\",\n        \"+3767.6\",\n        \"3.767602e+03\",\n        \"+3.767602e+03\",\n        \"3.767602e+03\",\n        \"3767.602203\",\n        \"3767.602203\",\n        \"+3767.602203\",\n        \"3767.602\",\n        \"3767.602\",\n        \"+3767.602\",\n        \"3.7676022e+03\",\n        \"+3.7676022e+03\",\n        \"3.7676022e+03\",\n        \"3767.6022034\",\n        \"3767.6022034\",\n        \"+3767.6022034\",\n        \"3767.6022\",\n        \"3767.6022\",\n        \"+3767.6022\",\n        \"3.76760220e+03\",\n        \"+3.76760220e+03\",\n        \"3.76760220e+03\",\n        \"3767.60220337\",\n        \"3767.60220337\",\n        \"+3767.60220337\",\n        \"3767.6022\",\n        \"3767.60220\",\n        \"+3767.6022\",\n        \"3.767602203e+03\",\n        \"+3.767602203e+03\",\n        \"3.767602203e+03\",\n        \"3767.602203369\",\n        \"3767.602203369\",\n        \"+3767.602203369\",\n        \"3767.602203\",\n        \"3767.602203\",\n        \"+3767.602203\",\n        \"3.7676022034e+03\",\n        \"+3.7676022034e+03\",\n        \"3.7676022034e+03\",\n        \"3767.6022033691\",\n        \"3767.6022033691\",\n        \"+3767.6022033691\",\n        \"3767.6022034\",\n        \"3767.6022034\",\n        \"+3767.6022034\",\n        \"3.76760220337e+03\",\n        \"+3.76760220337e+03\",\n        \"3.76760220337e+03\",\n        \"3767.60220336914\",\n        \"3767.60220336914\",\n        \"+3767.60220336914\",\n        \"3767.60220337\",\n        \"3767.60220337\",\n        \"+3767.60220337\",\n        \"3.767602203369e+03\",\n        \"+3.767602203369e+03\",\n        \"3.767602203369e+03\",\n        \"3767.602203369141\",\n        \"3767.602203369141\",\n        \"+3767.602203369141\",\n        \"3767.602203369\",\n        \"3767.602203369\",\n        \"+3767.602203369\",\n        \"3.7676022033691e+03\",\n        \"+3.7676022033691e+03\",\n        \"3.7676022033691e+03\",\n        \"3767.6022033691406\",\n        \"3767.6022033691406\",\n        \"+3767.6022033691406\",\n    }},\n    {{\n        \"-4e+03\",\n        \"-4.e+03\",\n        \"-4e+03\",\n        \"-3.8e+03\",\n        \"-3.8e+03\",\n        \"-3.8e+03\",\n        \"-3767.6\",\n        \"-3767.6\",\n        \"-3767.6\",\n        \"-3.8e+03\",\n        \"-3.8e+03\",\n        \"-3.8e+03\",\n        \"-3.77e+03\",\n        \"-3.77e+03\",\n        \"-3.77e+03\",\n        \"-3767.60\",\n        \"-3767.60\",\n        \"-3767.60\",\n        \"-3.77e+03\",\n        \"-3.77e+03\",\n        \"-3.77e+03\",\n        \"-3.768e+03\",\n        \"-3.768e+03\",\n        \"-3.768e+03\",\n        \"-3767.602\",\n        \"-3767.602\",\n        \"-3767.602\",\n        \"-3768\",\n        \"-3768.\",\n        \"-3768\",\n        \"-3.7676e+03\",\n        \"-3.7676e+03\",\n        \"-3.7676e+03\",\n        \"-3767.6022\",\n        \"-3767.6022\",\n        \"-3767.6022\",\n        \"-3767.6\",\n        \"-3767.6\",\n        \"-3767.6\",\n        \"-3.76760e+03\",\n        \"-3.76760e+03\",\n        \"-3.76760e+03\",\n        \"-3767.60220\",\n        \"-3767.60220\",\n        \"-3767.60220\",\n        \"-3767.6\",\n        \"-3767.60\",\n        \"-3767.6\",\n        \"-3.767602e+03\",\n        \"-3.767602e+03\",\n        \"-3.767602e+03\",\n        \"-3767.602203\",\n        \"-3767.602203\",\n        \"-3767.602203\",\n        \"-3767.602\",\n        \"-3767.602\",\n        \"-3767.602\",\n        \"-3.7676022e+03\",\n        \"-3.7676022e+03\",\n        \"-3.7676022e+03\",\n        \"-3767.6022034\",\n        \"-3767.6022034\",\n        \"-3767.6022034\",\n        \"-3767.6022\",\n        \"-3767.6022\",\n        \"-3767.6022\",\n        \"-3.76760220e+03\",\n        \"-3.76760220e+03\",\n        \"-3.76760220e+03\",\n        \"-3767.60220337\",\n        \"-3767.60220337\",\n        \"-3767.60220337\",\n        \"-3767.6022\",\n        \"-3767.60220\",\n        \"-3767.6022\",\n        \"-3.767602203e+03\",\n        \"-3.767602203e+03\",\n        \"-3.767602203e+03\",\n        \"-3767.602203369\",\n        \"-3767.602203369\",\n        \"-3767.602203369\",\n        \"-3767.602203\",\n        \"-3767.602203\",\n        \"-3767.602203\",\n        \"-3.7676022034e+03\",\n        \"-3.7676022034e+03\",\n        \"-3.7676022034e+03\",\n        \"-3767.6022033691\",\n        \"-3767.6022033691\",\n        \"-3767.6022033691\",\n        \"-3767.6022034\",\n        \"-3767.6022034\",\n        \"-3767.6022034\",\n        \"-3.76760220337e+03\",\n        \"-3.76760220337e+03\",\n        \"-3.76760220337e+03\",\n        \"-3767.60220336914\",\n        \"-3767.60220336914\",\n        \"-3767.60220336914\",\n        \"-3767.60220337\",\n        \"-3767.60220337\",\n        \"-3767.60220337\",\n        \"-3.767602203369e+03\",\n        \"-3.767602203369e+03\",\n        \"-3.767602203369e+03\",\n        \"-3767.602203369141\",\n        \"-3767.602203369141\",\n        \"-3767.602203369141\",\n        \"-3767.602203369\",\n        \"-3767.602203369\",\n        \"-3767.602203369\",\n        \"-3.7676022033691e+03\",\n        \"-3.7676022033691e+03\",\n        \"-3.7676022033691e+03\",\n        \"-3767.6022033691406\",\n        \"-3767.6022033691406\",\n        \"-3767.6022033691406\",\n    }},\n    {{\n        \"5e+02\",\n        \"5.e+02\",\n        \"+5e+02\",\n        \"4.7e+02\",\n        \"+4.7e+02\",\n        \"4.7e+02\",\n        \"471.0\",\n        \"471.0\",\n        \"+471.0\",\n        \"4.7e+02\",\n        \"4.7e+02\",\n        \"+4.7e+02\",\n        \"4.71e+02\",\n        \"+4.71e+02\",\n        \"4.71e+02\",\n        \"470.95\",\n        \"470.95\",\n        \"+470.95\",\n        \"471\",\n        \"471.\",\n        \"+471\",\n        \"4.710e+02\",\n        \"+4.710e+02\",\n        \"4.710e+02\",\n        \"470.950\",\n        \"470.950\",\n        \"+470.950\",\n        \"471\",\n        \"471.0\",\n        \"+471\",\n        \"4.7095e+02\",\n        \"+4.7095e+02\",\n        \"4.7095e+02\",\n        \"470.9503\",\n        \"470.9503\",\n        \"+470.9503\",\n        \"470.95\",\n        \"470.95\",\n        \"+470.95\",\n        \"4.70950e+02\",\n        \"+4.70950e+02\",\n        \"4.70950e+02\",\n        \"470.95028\",\n        \"470.95028\",\n        \"+470.95028\",\n        \"470.95\",\n        \"470.950\",\n        \"+470.95\",\n        \"4.709503e+02\",\n        \"+4.709503e+02\",\n        \"4.709503e+02\",\n        \"470.950275\",\n        \"470.950275\",\n        \"+470.950275\",\n        \"470.9503\",\n        \"470.9503\",\n        \"+470.9503\",\n        \"4.7095028e+02\",\n        \"+4.7095028e+02\",\n        \"4.7095028e+02\",\n        \"470.9502754\",\n        \"470.9502754\",\n        \"+470.9502754\",\n        \"470.95028\",\n        \"470.95028\",\n        \"+470.95028\",\n        \"4.70950275e+02\",\n        \"+4.70950275e+02\",\n        \"4.70950275e+02\",\n        \"470.95027542\",\n        \"470.95027542\",\n        \"+470.95027542\",\n        \"470.950275\",\n        \"470.950275\",\n        \"+470.950275\",\n        \"4.709502754e+02\",\n        \"+4.709502754e+02\",\n        \"4.709502754e+02\",\n        \"470.950275421\",\n        \"470.950275421\",\n        \"+470.950275421\",\n        \"470.9502754\",\n        \"470.9502754\",\n        \"+470.9502754\",\n        \"4.7095027542e+02\",\n        \"+4.7095027542e+02\",\n        \"4.7095027542e+02\",\n        \"470.9502754211\",\n        \"470.9502754211\",\n        \"+470.9502754211\",\n        \"470.95027542\",\n        \"470.95027542\",\n        \"+470.95027542\",\n        \"4.70950275421e+02\",\n        \"+4.70950275421e+02\",\n        \"4.70950275421e+02\",\n        \"470.95027542114\",\n        \"470.95027542114\",\n        \"+470.95027542114\",\n        \"470.950275421\",\n        \"470.950275421\",\n        \"+470.950275421\",\n        \"4.709502754211e+02\",\n        \"+4.709502754211e+02\",\n        \"4.709502754211e+02\",\n        \"470.950275421143\",\n        \"470.950275421143\",\n        \"+470.950275421143\",\n        \"470.9502754211\",\n        \"470.9502754211\",\n        \"+470.9502754211\",\n        \"4.7095027542114e+02\",\n        \"+4.7095027542114e+02\",\n        \"4.7095027542114e+02\",\n        \"470.9502754211426\",\n        \"470.9502754211426\",\n        \"+470.9502754211426\",\n    }},\n    {{\n        \"-5e+02\",\n        \"-5.e+02\",\n        \"-5e+02\",\n        \"-4.7e+02\",\n        \"-4.7e+02\",\n        \"-4.7e+02\",\n        \"-471.0\",\n        \"-471.0\",\n        \"-471.0\",\n        \"-4.7e+02\",\n        \"-4.7e+02\",\n        \"-4.7e+02\",\n        \"-4.71e+02\",\n        \"-4.71e+02\",\n        \"-4.71e+02\",\n        \"-470.95\",\n        \"-470.95\",\n        \"-470.95\",\n        \"-471\",\n        \"-471.\",\n        \"-471\",\n        \"-4.710e+02\",\n        \"-4.710e+02\",\n        \"-4.710e+02\",\n        \"-470.950\",\n        \"-470.950\",\n        \"-470.950\",\n        \"-471\",\n        \"-471.0\",\n        \"-471\",\n        \"-4.7095e+02\",\n        \"-4.7095e+02\",\n        \"-4.7095e+02\",\n        \"-470.9503\",\n        \"-470.9503\",\n        \"-470.9503\",\n        \"-470.95\",\n        \"-470.95\",\n        \"-470.95\",\n        \"-4.70950e+02\",\n        \"-4.70950e+02\",\n        \"-4.70950e+02\",\n        \"-470.95028\",\n        \"-470.95028\",\n        \"-470.95028\",\n        \"-470.95\",\n        \"-470.950\",\n        \"-470.95\",\n        \"-4.709503e+02\",\n        \"-4.709503e+02\",\n        \"-4.709503e+02\",\n        \"-470.950275\",\n        \"-470.950275\",\n        \"-470.950275\",\n        \"-470.9503\",\n        \"-470.9503\",\n        \"-470.9503\",\n        \"-4.7095028e+02\",\n        \"-4.7095028e+02\",\n        \"-4.7095028e+02\",\n        \"-470.9502754\",\n        \"-470.9502754\",\n        \"-470.9502754\",\n        \"-470.95028\",\n        \"-470.95028\",\n        \"-470.95028\",\n        \"-4.70950275e+02\",\n        \"-4.70950275e+02\",\n        \"-4.70950275e+02\",\n        \"-470.95027542\",\n        \"-470.95027542\",\n        \"-470.95027542\",\n        \"-470.950275\",\n        \"-470.950275\",\n        \"-470.950275\",\n        \"-4.709502754e+02\",\n        \"-4.709502754e+02\",\n        \"-4.709502754e+02\",\n        \"-470.950275421\",\n        \"-470.950275421\",\n        \"-470.950275421\",\n        \"-470.9502754\",\n        \"-470.9502754\",\n        \"-470.9502754\",\n        \"-4.7095027542e+02\",\n        \"-4.7095027542e+02\",\n        \"-4.7095027542e+02\",\n        \"-470.9502754211\",\n        \"-470.9502754211\",\n        \"-470.9502754211\",\n        \"-470.95027542\",\n        \"-470.95027542\",\n        \"-470.95027542\",\n        \"-4.70950275421e+02\",\n        \"-4.70950275421e+02\",\n        \"-4.70950275421e+02\",\n        \"-470.95027542114\",\n        \"-470.95027542114\",\n        \"-470.95027542114\",\n        \"-470.950275421\",\n        \"-470.950275421\",\n        \"-470.950275421\",\n        \"-4.709502754211e+02\",\n        \"-4.709502754211e+02\",\n        \"-4.709502754211e+02\",\n        \"-470.950275421143\",\n        \"-470.950275421143\",\n        \"-470.950275421143\",\n        \"-470.9502754211\",\n        \"-470.9502754211\",\n        \"-470.9502754211\",\n        \"-4.7095027542114e+02\",\n        \"-4.7095027542114e+02\",\n        \"-4.7095027542114e+02\",\n        \"-470.9502754211426\",\n        \"-470.9502754211426\",\n        \"-470.9502754211426\",\n    }},\n    {{\n        \"6e+01\",\n        \"6.e+01\",\n        \"+6e+01\",\n        \"5.9e+01\",\n        \"+5.9e+01\",\n        \"5.9e+01\",\n        \"58.9\",\n        \"58.9\",\n        \"+58.9\",\n        \"59\",\n        \"59.\",\n        \"+59\",\n        \"5.89e+01\",\n        \"+5.89e+01\",\n        \"5.89e+01\",\n        \"58.87\",\n        \"58.87\",\n        \"+58.87\",\n        \"58.9\",\n        \"58.9\",\n        \"+58.9\",\n        \"5.887e+01\",\n        \"+5.887e+01\",\n        \"5.887e+01\",\n        \"58.869\",\n        \"58.869\",\n        \"+58.869\",\n        \"58.87\",\n        \"58.87\",\n        \"+58.87\",\n        \"5.8869e+01\",\n        \"+5.8869e+01\",\n        \"5.8869e+01\",\n        \"58.8688\",\n        \"58.8688\",\n        \"+58.8688\",\n        \"58.869\",\n        \"58.869\",\n        \"+58.869\",\n        \"5.88688e+01\",\n        \"+5.88688e+01\",\n        \"5.88688e+01\",\n        \"58.86878\",\n        \"58.86878\",\n        \"+58.86878\",\n        \"58.8688\",\n        \"58.8688\",\n        \"+58.8688\",\n        \"5.886878e+01\",\n        \"+5.886878e+01\",\n        \"5.886878e+01\",\n        \"58.868784\",\n        \"58.868784\",\n        \"+58.868784\",\n        \"58.86878\",\n        \"58.86878\",\n        \"+58.86878\",\n        \"5.8868784e+01\",\n        \"+5.8868784e+01\",\n        \"5.8868784e+01\",\n        \"58.8687844\",\n        \"58.8687844\",\n        \"+58.8687844\",\n        \"58.868784\",\n        \"58.868784\",\n        \"+58.868784\",\n        \"5.88687844e+01\",\n        \"+5.88687844e+01\",\n        \"5.88687844e+01\",\n        \"58.86878443\",\n        \"58.86878443\",\n        \"+58.86878443\",\n        \"58.8687844\",\n        \"58.8687844\",\n        \"+58.8687844\",\n        \"5.886878443e+01\",\n        \"+5.886878443e+01\",\n        \"5.886878443e+01\",\n        \"58.868784428\",\n        \"58.868784428\",\n        \"+58.868784428\",\n        \"58.86878443\",\n        \"58.86878443\",\n        \"+58.86878443\",\n        \"5.8868784428e+01\",\n        \"+5.8868784428e+01\",\n        \"5.8868784428e+01\",\n        \"58.8687844276\",\n        \"58.8687844276\",\n        \"+58.8687844276\",\n        \"58.868784428\",\n        \"58.868784428\",\n        \"+58.868784428\",\n        \"5.88687844276e+01\",\n        \"+5.88687844276e+01\",\n        \"5.88687844276e+01\",\n        \"58.86878442764\",\n        \"58.86878442764\",\n        \"+58.86878442764\",\n        \"58.8687844276\",\n        \"58.8687844276\",\n        \"+58.8687844276\",\n        \"5.886878442764e+01\",\n        \"+5.886878442764e+01\",\n        \"5.886878442764e+01\",\n        \"58.868784427643\",\n        \"58.868784427643\",\n        \"+58.868784427643\",\n        \"58.86878442764\",\n        \"58.86878442764\",\n        \"+58.86878442764\",\n        \"5.8868784427643e+01\",\n        \"+5.8868784427643e+01\",\n        \"5.8868784427643e+01\",\n        \"58.8687844276428\",\n        \"58.8687844276428\",\n        \"+58.8687844276428\",\n    }},\n    {{\n        \"-6e+01\",\n        \"-6.e+01\",\n        \"-6e+01\",\n        \"-5.9e+01\",\n        \"-5.9e+01\",\n        \"-5.9e+01\",\n        \"-58.9\",\n        \"-58.9\",\n        \"-58.9\",\n        \"-59\",\n        \"-59.\",\n        \"-59\",\n        \"-5.89e+01\",\n        \"-5.89e+01\",\n        \"-5.89e+01\",\n        \"-58.87\",\n        \"-58.87\",\n        \"-58.87\",\n        \"-58.9\",\n        \"-58.9\",\n        \"-58.9\",\n        \"-5.887e+01\",\n        \"-5.887e+01\",\n        \"-5.887e+01\",\n        \"-58.869\",\n        \"-58.869\",\n        \"-58.869\",\n        \"-58.87\",\n        \"-58.87\",\n        \"-58.87\",\n        \"-5.8869e+01\",\n        \"-5.8869e+01\",\n        \"-5.8869e+01\",\n        \"-58.8688\",\n        \"-58.8688\",\n        \"-58.8688\",\n        \"-58.869\",\n        \"-58.869\",\n        \"-58.869\",\n        \"-5.88688e+01\",\n        \"-5.88688e+01\",\n        \"-5.88688e+01\",\n        \"-58.86878\",\n        \"-58.86878\",\n        \"-58.86878\",\n        \"-58.8688\",\n        \"-58.8688\",\n        \"-58.8688\",\n        \"-5.886878e+01\",\n        \"-5.886878e+01\",\n        \"-5.886878e+01\",\n        \"-58.868784\",\n        \"-58.868784\",\n        \"-58.868784\",\n        \"-58.86878\",\n        \"-58.86878\",\n        \"-58.86878\",\n        \"-5.8868784e+01\",\n        \"-5.8868784e+01\",\n        \"-5.8868784e+01\",\n        \"-58.8687844\",\n        \"-58.8687844\",\n        \"-58.8687844\",\n        \"-58.868784\",\n        \"-58.868784\",\n        \"-58.868784\",\n        \"-5.88687844e+01\",\n        \"-5.88687844e+01\",\n        \"-5.88687844e+01\",\n        \"-58.86878443\",\n        \"-58.86878443\",\n        \"-58.86878443\",\n        \"-58.8687844\",\n        \"-58.8687844\",\n        \"-58.8687844\",\n        \"-5.886878443e+01\",\n        \"-5.886878443e+01\",\n        \"-5.886878443e+01\",\n        \"-58.868784428\",\n        \"-58.868784428\",\n        \"-58.868784428\",\n        \"-58.86878443\",\n        \"-58.86878443\",\n        \"-58.86878443\",\n        \"-5.8868784428e+01\",\n        \"-5.8868784428e+01\",\n        \"-5.8868784428e+01\",\n        \"-58.8687844276\",\n        \"-58.8687844276\",\n        \"-58.8687844276\",\n        \"-58.868784428\",\n        \"-58.868784428\",\n        \"-58.868784428\",\n        \"-5.88687844276e+01\",\n        \"-5.88687844276e+01\",\n        \"-5.88687844276e+01\",\n        \"-58.86878442764\",\n        \"-58.86878442764\",\n        \"-58.86878442764\",\n        \"-58.8687844276\",\n        \"-58.8687844276\",\n        \"-58.8687844276\",\n        \"-5.886878442764e+01\",\n        \"-5.886878442764e+01\",\n        \"-5.886878442764e+01\",\n        \"-58.868784427643\",\n        \"-58.868784427643\",\n        \"-58.868784427643\",\n        \"-58.86878442764\",\n        \"-58.86878442764\",\n        \"-58.86878442764\",\n        \"-5.8868784427643e+01\",\n        \"-5.8868784427643e+01\",\n        \"-5.8868784427643e+01\",\n        \"-58.8687844276428\",\n        \"-58.8687844276428\",\n        \"-58.8687844276428\",\n    }},\n    {{\n        \"7\",\n        \"7.\",\n        \"+7\",\n        \"7.4e+00\",\n        \"+7.4e+00\",\n        \"7.4e+00\",\n        \"7.4\",\n        \"7.4\",\n        \"+7.4\",\n        \"7.4\",\n        \"7.4\",\n        \"+7.4\",\n        \"7.36e+00\",\n        \"+7.36e+00\",\n        \"7.36e+00\",\n        \"7.36\",\n        \"7.36\",\n        \"+7.36\",\n        \"7.36\",\n        \"7.36\",\n        \"+7.36\",\n        \"7.359e+00\",\n        \"+7.359e+00\",\n        \"7.359e+00\",\n        \"7.359\",\n        \"7.359\",\n        \"+7.359\",\n        \"7.359\",\n        \"7.359\",\n        \"+7.359\",\n        \"7.3586e+00\",\n        \"+7.3586e+00\",\n        \"7.3586e+00\",\n        \"7.3586\",\n        \"7.3586\",\n        \"+7.3586\",\n        \"7.3586\",\n        \"7.3586\",\n        \"+7.3586\",\n        \"7.35860e+00\",\n        \"+7.35860e+00\",\n        \"7.35860e+00\",\n        \"7.35860\",\n        \"7.35860\",\n        \"+7.35860\",\n        \"7.3586\",\n        \"7.35860\",\n        \"+7.3586\",\n        \"7.358598e+00\",\n        \"+7.358598e+00\",\n        \"7.358598e+00\",\n        \"7.358598\",\n        \"7.358598\",\n        \"+7.358598\",\n        \"7.358598\",\n        \"7.358598\",\n        \"+7.358598\",\n        \"7.3585981e+00\",\n        \"+7.3585981e+00\",\n        \"7.3585981e+00\",\n        \"7.3585981\",\n        \"7.3585981\",\n        \"+7.3585981\",\n        \"7.3585981\",\n        \"7.3585981\",\n        \"+7.3585981\",\n        \"7.35859805e+00\",\n        \"+7.35859805e+00\",\n        \"7.35859805e+00\",\n        \"7.35859805\",\n        \"7.35859805\",\n        \"+7.35859805\",\n        \"7.35859805\",\n        \"7.35859805\",\n        \"+7.35859805\",\n        \"7.358598053e+00\",\n        \"+7.358598053e+00\",\n        \"7.358598053e+00\",\n        \"7.358598053\",\n        \"7.358598053\",\n        \"+7.358598053\",\n        \"7.358598053\",\n        \"7.358598053\",\n        \"+7.358598053\",\n        \"7.3585980535e+00\",\n        \"+7.3585980535e+00\",\n        \"7.3585980535e+00\",\n        \"7.3585980535\",\n        \"7.3585980535\",\n        \"+7.3585980535\",\n        \"7.3585980535\",\n        \"7.3585980535\",\n        \"+7.3585980535\",\n        \"7.35859805346e+00\",\n        \"+7.35859805346e+00\",\n        \"7.35859805346e+00\",\n        \"7.35859805346\",\n        \"7.35859805346\",\n        \"+7.35859805346\",\n        \"7.35859805346\",\n        \"7.35859805346\",\n        \"+7.35859805346\",\n        \"7.358598053455e+00\",\n        \"+7.358598053455e+00\",\n        \"7.358598053455e+00\",\n        \"7.358598053455\",\n        \"7.358598053455\",\n        \"+7.358598053455\",\n        \"7.358598053455\",\n        \"7.358598053455\",\n        \"+7.358598053455\",\n        \"7.3585980534554e+00\",\n        \"+7.3585980534554e+00\",\n        \"7.3585980534554e+00\",\n        \"7.3585980534554\",\n        \"7.3585980534554\",\n        \"+7.3585980534554\",\n    }},\n    {{\n        \"-7\",\n        \"-7.\",\n        \"-7\",\n        \"-7.4e+00\",\n        \"-7.4e+00\",\n        \"-7.4e+00\",\n        \"-7.4\",\n        \"-7.4\",\n        \"-7.4\",\n        \"-7.4\",\n        \"-7.4\",\n        \"-7.4\",\n        \"-7.36e+00\",\n        \"-7.36e+00\",\n        \"-7.36e+00\",\n        \"-7.36\",\n        \"-7.36\",\n        \"-7.36\",\n        \"-7.36\",\n        \"-7.36\",\n        \"-7.36\",\n        \"-7.359e+00\",\n        \"-7.359e+00\",\n        \"-7.359e+00\",\n        \"-7.359\",\n        \"-7.359\",\n        \"-7.359\",\n        \"-7.359\",\n        \"-7.359\",\n        \"-7.359\",\n        \"-7.3586e+00\",\n        \"-7.3586e+00\",\n        \"-7.3586e+00\",\n        \"-7.3586\",\n        \"-7.3586\",\n        \"-7.3586\",\n        \"-7.3586\",\n        \"-7.3586\",\n        \"-7.3586\",\n        \"-7.35860e+00\",\n        \"-7.35860e+00\",\n        \"-7.35860e+00\",\n        \"-7.35860\",\n        \"-7.35860\",\n        \"-7.35860\",\n        \"-7.3586\",\n        \"-7.35860\",\n        \"-7.3586\",\n        \"-7.358598e+00\",\n        \"-7.358598e+00\",\n        \"-7.358598e+00\",\n        \"-7.358598\",\n        \"-7.358598\",\n        \"-7.358598\",\n        \"-7.358598\",\n        \"-7.358598\",\n        \"-7.358598\",\n        \"-7.3585981e+00\",\n        \"-7.3585981e+00\",\n        \"-7.3585981e+00\",\n        \"-7.3585981\",\n        \"-7.3585981\",\n        \"-7.3585981\",\n        \"-7.3585981\",\n        \"-7.3585981\",\n        \"-7.3585981\",\n        \"-7.35859805e+00\",\n        \"-7.35859805e+00\",\n        \"-7.35859805e+00\",\n        \"-7.35859805\",\n        \"-7.35859805\",\n        \"-7.35859805\",\n        \"-7.35859805\",\n        \"-7.35859805\",\n        \"-7.35859805\",\n        \"-7.358598053e+00\",\n        \"-7.358598053e+00\",\n        \"-7.358598053e+00\",\n        \"-7.358598053\",\n        \"-7.358598053\",\n        \"-7.358598053\",\n        \"-7.358598053\",\n        \"-7.358598053\",\n        \"-7.358598053\",\n        \"-7.3585980535e+00\",\n        \"-7.3585980535e+00\",\n        \"-7.3585980535e+00\",\n        \"-7.3585980535\",\n        \"-7.3585980535\",\n        \"-7.3585980535\",\n        \"-7.3585980535\",\n        \"-7.3585980535\",\n        \"-7.3585980535\",\n        \"-7.35859805346e+00\",\n        \"-7.35859805346e+00\",\n        \"-7.35859805346e+00\",\n        \"-7.35859805346\",\n        \"-7.35859805346\",\n        \"-7.35859805346\",\n        \"-7.35859805346\",\n        \"-7.35859805346\",\n        \"-7.35859805346\",\n        \"-7.358598053455e+00\",\n        \"-7.358598053455e+00\",\n        \"-7.358598053455e+00\",\n        \"-7.358598053455\",\n        \"-7.358598053455\",\n        \"-7.358598053455\",\n        \"-7.358598053455\",\n        \"-7.358598053455\",\n        \"-7.358598053455\",\n        \"-7.3585980534554e+00\",\n        \"-7.3585980534554e+00\",\n        \"-7.3585980534554e+00\",\n        \"-7.3585980534554\",\n        \"-7.3585980534554\",\n        \"-7.3585980534554\",\n    }},\n    {{\n        \"0.9\",\n        \"0.9\",\n        \"+0.9\",\n        \"9.2e-01\",\n        \"+9.2e-01\",\n        \"9.2e-01\",\n        \"0.9\",\n        \"0.9\",\n        \"+0.9\",\n        \"0.92\",\n        \"0.92\",\n        \"+0.92\",\n        \"9.20e-01\",\n        \"+9.20e-01\",\n        \"9.20e-01\",\n        \"0.92\",\n        \"0.92\",\n        \"+0.92\",\n        \"0.92\",\n        \"0.920\",\n        \"+0.92\",\n        \"9.198e-01\",\n        \"+9.198e-01\",\n        \"9.198e-01\",\n        \"0.920\",\n        \"0.920\",\n        \"+0.920\",\n        \"0.9198\",\n        \"0.9198\",\n        \"+0.9198\",\n        \"9.1982e-01\",\n        \"+9.1982e-01\",\n        \"9.1982e-01\",\n        \"0.9198\",\n        \"0.9198\",\n        \"+0.9198\",\n        \"0.91982\",\n        \"0.91982\",\n        \"+0.91982\",\n        \"9.19825e-01\",\n        \"+9.19825e-01\",\n        \"9.19825e-01\",\n        \"0.91982\",\n        \"0.91982\",\n        \"+0.91982\",\n        \"0.919825\",\n        \"0.919825\",\n        \"+0.919825\",\n        \"9.198248e-01\",\n        \"+9.198248e-01\",\n        \"9.198248e-01\",\n        \"0.919825\",\n        \"0.919825\",\n        \"+0.919825\",\n        \"0.9198248\",\n        \"0.9198248\",\n        \"+0.9198248\",\n        \"9.1982476e-01\",\n        \"+9.1982476e-01\",\n        \"9.1982476e-01\",\n        \"0.9198248\",\n        \"0.9198248\",\n        \"+0.9198248\",\n        \"0.91982476\",\n        \"0.91982476\",\n        \"+0.91982476\",\n        \"9.19824757e-01\",\n        \"+9.19824757e-01\",\n        \"9.19824757e-01\",\n        \"0.91982476\",\n        \"0.91982476\",\n        \"+0.91982476\",\n        \"0.919824757\",\n        \"0.919824757\",\n        \"+0.919824757\",\n        \"9.198247567e-01\",\n        \"+9.198247567e-01\",\n        \"9.198247567e-01\",\n        \"0.919824757\",\n        \"0.919824757\",\n        \"+0.919824757\",\n        \"0.9198247567\",\n        \"0.9198247567\",\n        \"+0.9198247567\",\n        \"9.1982475668e-01\",\n        \"+9.1982475668e-01\",\n        \"9.1982475668e-01\",\n        \"0.9198247567\",\n        \"0.9198247567\",\n        \"+0.9198247567\",\n        \"0.91982475668\",\n        \"0.91982475668\",\n        \"+0.91982475668\",\n        \"9.19824756682e-01\",\n        \"+9.19824756682e-01\",\n        \"9.19824756682e-01\",\n        \"0.91982475668\",\n        \"0.91982475668\",\n        \"+0.91982475668\",\n        \"0.919824756682\",\n        \"0.919824756682\",\n        \"+0.919824756682\",\n        \"9.198247566819e-01\",\n        \"+9.198247566819e-01\",\n        \"9.198247566819e-01\",\n        \"0.919824756682\",\n        \"0.919824756682\",\n        \"+0.919824756682\",\n        \"0.9198247566819\",\n        \"0.9198247566819\",\n        \"+0.9198247566819\",\n        \"9.1982475668192e-01\",\n        \"+9.1982475668192e-01\",\n        \"9.1982475668192e-01\",\n        \"0.9198247566819\",\n        \"0.9198247566819\",\n        \"+0.9198247566819\",\n    }},\n    {{\n        \"-0.9\",\n        \"-0.9\",\n        \"-0.9\",\n        \"-9.2e-01\",\n        \"-9.2e-01\",\n        \"-9.2e-01\",\n        \"-0.9\",\n        \"-0.9\",\n        \"-0.9\",\n        \"-0.92\",\n        \"-0.92\",\n        \"-0.92\",\n        \"-9.20e-01\",\n        \"-9.20e-01\",\n        \"-9.20e-01\",\n        \"-0.92\",\n        \"-0.92\",\n        \"-0.92\",\n        \"-0.92\",\n        \"-0.920\",\n        \"-0.92\",\n        \"-9.198e-01\",\n        \"-9.198e-01\",\n        \"-9.198e-01\",\n        \"-0.920\",\n        \"-0.920\",\n        \"-0.920\",\n        \"-0.9198\",\n        \"-0.9198\",\n        \"-0.9198\",\n        \"-9.1982e-01\",\n        \"-9.1982e-01\",\n        \"-9.1982e-01\",\n        \"-0.9198\",\n        \"-0.9198\",\n        \"-0.9198\",\n        \"-0.91982\",\n        \"-0.91982\",\n        \"-0.91982\",\n        \"-9.19825e-01\",\n        \"-9.19825e-01\",\n        \"-9.19825e-01\",\n        \"-0.91982\",\n        \"-0.91982\",\n        \"-0.91982\",\n        \"-0.919825\",\n        \"-0.919825\",\n        \"-0.919825\",\n        \"-9.198248e-01\",\n        \"-9.198248e-01\",\n        \"-9.198248e-01\",\n        \"-0.919825\",\n        \"-0.919825\",\n        \"-0.919825\",\n        \"-0.9198248\",\n        \"-0.9198248\",\n        \"-0.9198248\",\n        \"-9.1982476e-01\",\n        \"-9.1982476e-01\",\n        \"-9.1982476e-01\",\n        \"-0.9198248\",\n        \"-0.9198248\",\n        \"-0.9198248\",\n        \"-0.91982476\",\n        \"-0.91982476\",\n        \"-0.91982476\",\n        \"-9.19824757e-01\",\n        \"-9.19824757e-01\",\n        \"-9.19824757e-01\",\n        \"-0.91982476\",\n        \"-0.91982476\",\n        \"-0.91982476\",\n        \"-0.919824757\",\n        \"-0.919824757\",\n        \"-0.919824757\",\n        \"-9.198247567e-01\",\n        \"-9.198247567e-01\",\n        \"-9.198247567e-01\",\n        \"-0.919824757\",\n        \"-0.919824757\",\n        \"-0.919824757\",\n        \"-0.9198247567\",\n        \"-0.9198247567\",\n        \"-0.9198247567\",\n        \"-9.1982475668e-01\",\n        \"-9.1982475668e-01\",\n        \"-9.1982475668e-01\",\n        \"-0.9198247567\",\n        \"-0.9198247567\",\n        \"-0.9198247567\",\n        \"-0.91982475668\",\n        \"-0.91982475668\",\n        \"-0.91982475668\",\n        \"-9.19824756682e-01\",\n        \"-9.19824756682e-01\",\n        \"-9.19824756682e-01\",\n        \"-0.91982475668\",\n        \"-0.91982475668\",\n        \"-0.91982475668\",\n        \"-0.919824756682\",\n        \"-0.919824756682\",\n        \"-0.919824756682\",\n        \"-9.198247566819e-01\",\n        \"-9.198247566819e-01\",\n        \"-9.198247566819e-01\",\n        \"-0.919824756682\",\n        \"-0.919824756682\",\n        \"-0.919824756682\",\n        \"-0.9198247566819\",\n        \"-0.9198247566819\",\n        \"-0.9198247566819\",\n        \"-9.1982475668192e-01\",\n        \"-9.1982475668192e-01\",\n        \"-9.1982475668192e-01\",\n        \"-0.9198247566819\",\n        \"-0.9198247566819\",\n        \"-0.9198247566819\",\n    }},\n    {{\n        \"0.1\",\n        \"0.1\",\n        \"+0.1\",\n        \"1.1e-01\",\n        \"+1.1e-01\",\n        \"1.1e-01\",\n        \"0.1\",\n        \"0.1\",\n        \"+0.1\",\n        \"0.11\",\n        \"0.11\",\n        \"+0.11\",\n        \"1.15e-01\",\n        \"+1.15e-01\",\n        \"1.15e-01\",\n        \"0.11\",\n        \"0.11\",\n        \"+0.11\",\n        \"0.115\",\n        \"0.115\",\n        \"+0.115\",\n        \"1.150e-01\",\n        \"+1.150e-01\",\n        \"1.150e-01\",\n        \"0.115\",\n        \"0.115\",\n        \"+0.115\",\n        \"0.115\",\n        \"0.1150\",\n        \"+0.115\",\n        \"1.1498e-01\",\n        \"+1.1498e-01\",\n        \"1.1498e-01\",\n        \"0.1150\",\n        \"0.1150\",\n        \"+0.1150\",\n        \"0.11498\",\n        \"0.11498\",\n        \"+0.11498\",\n        \"1.14978e-01\",\n        \"+1.14978e-01\",\n        \"1.14978e-01\",\n        \"0.11498\",\n        \"0.11498\",\n        \"+0.11498\",\n        \"0.114978\",\n        \"0.114978\",\n        \"+0.114978\",\n        \"1.149781e-01\",\n        \"+1.149781e-01\",\n        \"1.149781e-01\",\n        \"0.114978\",\n        \"0.114978\",\n        \"+0.114978\",\n        \"0.1149781\",\n        \"0.1149781\",\n        \"+0.1149781\",\n        \"1.1497809e-01\",\n        \"+1.1497809e-01\",\n        \"1.1497809e-01\",\n        \"0.1149781\",\n        \"0.1149781\",\n        \"+0.1149781\",\n        \"0.11497809\",\n        \"0.11497809\",\n        \"+0.11497809\",\n        \"1.14978095e-01\",\n        \"+1.14978095e-01\",\n        \"1.14978095e-01\",\n        \"0.11497809\",\n        \"0.11497809\",\n        \"+0.11497809\",\n        \"0.114978095\",\n        \"0.114978095\",\n        \"+0.114978095\",\n        \"1.149780946e-01\",\n        \"+1.149780946e-01\",\n        \"1.149780946e-01\",\n        \"0.114978095\",\n        \"0.114978095\",\n        \"+0.114978095\",\n        \"0.1149780946\",\n        \"0.1149780946\",\n        \"+0.1149780946\",\n        \"1.1497809459e-01\",\n        \"+1.1497809459e-01\",\n        \"1.1497809459e-01\",\n        \"0.1149780946\",\n        \"0.1149780946\",\n        \"+0.1149780946\",\n        \"0.11497809459\",\n        \"0.11497809459\",\n        \"+0.11497809459\",\n        \"1.14978094585e-01\",\n        \"+1.14978094585e-01\",\n        \"1.14978094585e-01\",\n        \"0.11497809459\",\n        \"0.11497809459\",\n        \"+0.11497809459\",\n        \"0.114978094585\",\n        \"0.114978094585\",\n        \"+0.114978094585\",\n        \"1.149780945852e-01\",\n        \"+1.149780945852e-01\",\n        \"1.149780945852e-01\",\n        \"0.114978094585\",\n        \"0.114978094585\",\n        \"+0.114978094585\",\n        \"0.1149780945852\",\n        \"0.1149780945852\",\n        \"+0.1149780945852\",\n        \"1.1497809458524e-01\",\n        \"+1.1497809458524e-01\",\n        \"1.1497809458524e-01\",\n        \"0.1149780945852\",\n        \"0.1149780945852\",\n        \"+0.1149780945852\",\n    }},\n    {{\n        \"-0.1\",\n        \"-0.1\",\n        \"-0.1\",\n        \"-1.1e-01\",\n        \"-1.1e-01\",\n        \"-1.1e-01\",\n        \"-0.1\",\n        \"-0.1\",\n        \"-0.1\",\n        \"-0.11\",\n        \"-0.11\",\n        \"-0.11\",\n        \"-1.15e-01\",\n        \"-1.15e-01\",\n        \"-1.15e-01\",\n        \"-0.11\",\n        \"-0.11\",\n        \"-0.11\",\n        \"-0.115\",\n        \"-0.115\",\n        \"-0.115\",\n        \"-1.150e-01\",\n        \"-1.150e-01\",\n        \"-1.150e-01\",\n        \"-0.115\",\n        \"-0.115\",\n        \"-0.115\",\n        \"-0.115\",\n        \"-0.1150\",\n        \"-0.115\",\n        \"-1.1498e-01\",\n        \"-1.1498e-01\",\n        \"-1.1498e-01\",\n        \"-0.1150\",\n        \"-0.1150\",\n        \"-0.1150\",\n        \"-0.11498\",\n        \"-0.11498\",\n        \"-0.11498\",\n        \"-1.14978e-01\",\n        \"-1.14978e-01\",\n        \"-1.14978e-01\",\n        \"-0.11498\",\n        \"-0.11498\",\n        \"-0.11498\",\n        \"-0.114978\",\n        \"-0.114978\",\n        \"-0.114978\",\n        \"-1.149781e-01\",\n        \"-1.149781e-01\",\n        \"-1.149781e-01\",\n        \"-0.114978\",\n        \"-0.114978\",\n        \"-0.114978\",\n        \"-0.1149781\",\n        \"-0.1149781\",\n        \"-0.1149781\",\n        \"-1.1497809e-01\",\n        \"-1.1497809e-01\",\n        \"-1.1497809e-01\",\n        \"-0.1149781\",\n        \"-0.1149781\",\n        \"-0.1149781\",\n        \"-0.11497809\",\n        \"-0.11497809\",\n        \"-0.11497809\",\n        \"-1.14978095e-01\",\n        \"-1.14978095e-01\",\n        \"-1.14978095e-01\",\n        \"-0.11497809\",\n        \"-0.11497809\",\n        \"-0.11497809\",\n        \"-0.114978095\",\n        \"-0.114978095\",\n        \"-0.114978095\",\n        \"-1.149780946e-01\",\n        \"-1.149780946e-01\",\n        \"-1.149780946e-01\",\n        \"-0.114978095\",\n        \"-0.114978095\",\n        \"-0.114978095\",\n        \"-0.1149780946\",\n        \"-0.1149780946\",\n        \"-0.1149780946\",\n        \"-1.1497809459e-01\",\n        \"-1.1497809459e-01\",\n        \"-1.1497809459e-01\",\n        \"-0.1149780946\",\n        \"-0.1149780946\",\n        \"-0.1149780946\",\n        \"-0.11497809459\",\n        \"-0.11497809459\",\n        \"-0.11497809459\",\n        \"-1.14978094585e-01\",\n        \"-1.14978094585e-01\",\n        \"-1.14978094585e-01\",\n        \"-0.11497809459\",\n        \"-0.11497809459\",\n        \"-0.11497809459\",\n        \"-0.114978094585\",\n        \"-0.114978094585\",\n        \"-0.114978094585\",\n        \"-1.149780945852e-01\",\n        \"-1.149780945852e-01\",\n        \"-1.149780945852e-01\",\n        \"-0.114978094585\",\n        \"-0.114978094585\",\n        \"-0.114978094585\",\n        \"-0.1149780945852\",\n        \"-0.1149780945852\",\n        \"-0.1149780945852\",\n        \"-1.1497809458524e-01\",\n        \"-1.1497809458524e-01\",\n        \"-1.1497809458524e-01\",\n        \"-0.1149780945852\",\n        \"-0.1149780945852\",\n        \"-0.1149780945852\",\n    }},\n    {{\n        \"0.01\",\n        \"0.01\",\n        \"+0.01\",\n        \"1.4e-02\",\n        \"+1.4e-02\",\n        \"1.4e-02\",\n        \"0.0\",\n        \"0.0\",\n        \"+0.0\",\n        \"0.014\",\n        \"0.014\",\n        \"+0.014\",\n        \"1.44e-02\",\n        \"+1.44e-02\",\n        \"1.44e-02\",\n        \"0.01\",\n        \"0.01\",\n        \"+0.01\",\n        \"0.0144\",\n        \"0.0144\",\n        \"+0.0144\",\n        \"1.437e-02\",\n        \"+1.437e-02\",\n        \"1.437e-02\",\n        \"0.014\",\n        \"0.014\",\n        \"+0.014\",\n        \"0.01437\",\n        \"0.01437\",\n        \"+0.01437\",\n        \"1.4372e-02\",\n        \"+1.4372e-02\",\n        \"1.4372e-02\",\n        \"0.0144\",\n        \"0.0144\",\n        \"+0.0144\",\n        \"0.014372\",\n        \"0.014372\",\n        \"+0.014372\",\n        \"1.43723e-02\",\n        \"+1.43723e-02\",\n        \"1.43723e-02\",\n        \"0.01437\",\n        \"0.01437\",\n        \"+0.01437\",\n        \"0.0143723\",\n        \"0.0143723\",\n        \"+0.0143723\",\n        \"1.437226e-02\",\n        \"+1.437226e-02\",\n        \"1.437226e-02\",\n        \"0.014372\",\n        \"0.014372\",\n        \"+0.014372\",\n        \"0.01437226\",\n        \"0.01437226\",\n        \"+0.01437226\",\n        \"1.4372262e-02\",\n        \"+1.4372262e-02\",\n        \"1.4372262e-02\",\n        \"0.0143723\",\n        \"0.0143723\",\n        \"+0.0143723\",\n        \"0.014372262\",\n        \"0.014372262\",\n        \"+0.014372262\",\n        \"1.43722618e-02\",\n        \"+1.43722618e-02\",\n        \"1.43722618e-02\",\n        \"0.01437226\",\n        \"0.01437226\",\n        \"+0.01437226\",\n        \"0.0143722618\",\n        \"0.0143722618\",\n        \"+0.0143722618\",\n        \"1.437226182e-02\",\n        \"+1.437226182e-02\",\n        \"1.437226182e-02\",\n        \"0.014372262\",\n        \"0.014372262\",\n        \"+0.014372262\",\n        \"0.01437226182\",\n        \"0.01437226182\",\n        \"+0.01437226182\",\n        \"1.4372261823e-02\",\n        \"+1.4372261823e-02\",\n        \"1.4372261823e-02\",\n        \"0.0143722618\",\n        \"0.0143722618\",\n        \"+0.0143722618\",\n        \"0.014372261823\",\n        \"0.014372261823\",\n        \"+0.014372261823\",\n        \"1.43722618232e-02\",\n        \"+1.43722618232e-02\",\n        \"1.43722618232e-02\",\n        \"0.01437226182\",\n        \"0.01437226182\",\n        \"+0.01437226182\",\n        \"0.0143722618232\",\n        \"0.0143722618232\",\n        \"+0.0143722618232\",\n        \"1.437226182315e-02\",\n        \"+1.437226182315e-02\",\n        \"1.437226182315e-02\",\n        \"0.014372261823\",\n        \"0.014372261823\",\n        \"+0.014372261823\",\n        \"0.01437226182315\",\n        \"0.01437226182315\",\n        \"+0.01437226182315\",\n        \"1.4372261823155e-02\",\n        \"+1.4372261823155e-02\",\n        \"1.4372261823155e-02\",\n        \"0.0143722618232\",\n        \"0.0143722618232\",\n        \"+0.0143722618232\",\n    }},\n    {{\n        \"-0.01\",\n        \"-0.01\",\n        \"-0.01\",\n        \"-1.4e-02\",\n        \"-1.4e-02\",\n        \"-1.4e-02\",\n        \"-0.0\",\n        \"-0.0\",\n        \"-0.0\",\n        \"-0.014\",\n        \"-0.014\",\n        \"-0.014\",\n        \"-1.44e-02\",\n        \"-1.44e-02\",\n        \"-1.44e-02\",\n        \"-0.01\",\n        \"-0.01\",\n        \"-0.01\",\n        \"-0.0144\",\n        \"-0.0144\",\n        \"-0.0144\",\n        \"-1.437e-02\",\n        \"-1.437e-02\",\n        \"-1.437e-02\",\n        \"-0.014\",\n        \"-0.014\",\n        \"-0.014\",\n        \"-0.01437\",\n        \"-0.01437\",\n        \"-0.01437\",\n        \"-1.4372e-02\",\n        \"-1.4372e-02\",\n        \"-1.4372e-02\",\n        \"-0.0144\",\n        \"-0.0144\",\n        \"-0.0144\",\n        \"-0.014372\",\n        \"-0.014372\",\n        \"-0.014372\",\n        \"-1.43723e-02\",\n        \"-1.43723e-02\",\n        \"-1.43723e-02\",\n        \"-0.01437\",\n        \"-0.01437\",\n        \"-0.01437\",\n        \"-0.0143723\",\n        \"-0.0143723\",\n        \"-0.0143723\",\n        \"-1.437226e-02\",\n        \"-1.437226e-02\",\n        \"-1.437226e-02\",\n        \"-0.014372\",\n        \"-0.014372\",\n        \"-0.014372\",\n        \"-0.01437226\",\n        \"-0.01437226\",\n        \"-0.01437226\",\n        \"-1.4372262e-02\",\n        \"-1.4372262e-02\",\n        \"-1.4372262e-02\",\n        \"-0.0143723\",\n        \"-0.0143723\",\n        \"-0.0143723\",\n        \"-0.014372262\",\n        \"-0.014372262\",\n        \"-0.014372262\",\n        \"-1.43722618e-02\",\n        \"-1.43722618e-02\",\n        \"-1.43722618e-02\",\n        \"-0.01437226\",\n        \"-0.01437226\",\n        \"-0.01437226\",\n        \"-0.0143722618\",\n        \"-0.0143722618\",\n        \"-0.0143722618\",\n        \"-1.437226182e-02\",\n        \"-1.437226182e-02\",\n        \"-1.437226182e-02\",\n        \"-0.014372262\",\n        \"-0.014372262\",\n        \"-0.014372262\",\n        \"-0.01437226182\",\n        \"-0.01437226182\",\n        \"-0.01437226182\",\n        \"-1.4372261823e-02\",\n        \"-1.4372261823e-02\",\n        \"-1.4372261823e-02\",\n        \"-0.0143722618\",\n        \"-0.0143722618\",\n        \"-0.0143722618\",\n        \"-0.014372261823\",\n        \"-0.014372261823\",\n        \"-0.014372261823\",\n        \"-1.43722618232e-02\",\n        \"-1.43722618232e-02\",\n        \"-1.43722618232e-02\",\n        \"-0.01437226182\",\n        \"-0.01437226182\",\n        \"-0.01437226182\",\n        \"-0.0143722618232\",\n        \"-0.0143722618232\",\n        \"-0.0143722618232\",\n        \"-1.437226182315e-02\",\n        \"-1.437226182315e-02\",\n        \"-1.437226182315e-02\",\n        \"-0.014372261823\",\n        \"-0.014372261823\",\n        \"-0.014372261823\",\n        \"-0.01437226182315\",\n        \"-0.01437226182315\",\n        \"-0.01437226182315\",\n        \"-1.4372261823155e-02\",\n        \"-1.4372261823155e-02\",\n        \"-1.4372261823155e-02\",\n        \"-0.0143722618232\",\n        \"-0.0143722618232\",\n        \"-0.0143722618232\",\n    }},\n    {{\n        \"0.002\",\n        \"0.002\",\n        \"+0.002\",\n        \"1.8e-03\",\n        \"+1.8e-03\",\n        \"1.8e-03\",\n        \"0.0\",\n        \"0.0\",\n        \"+0.0\",\n        \"0.0018\",\n        \"0.0018\",\n        \"+0.0018\",\n        \"1.80e-03\",\n        \"+1.80e-03\",\n        \"1.80e-03\",\n        \"0.00\",\n        \"0.00\",\n        \"+0.00\",\n        \"0.0018\",\n        \"0.00180\",\n        \"+0.0018\",\n        \"1.797e-03\",\n        \"+1.797e-03\",\n        \"1.797e-03\",\n        \"0.002\",\n        \"0.002\",\n        \"+0.002\",\n        \"0.001797\",\n        \"0.001797\",\n        \"+0.001797\",\n        \"1.7965e-03\",\n        \"+1.7965e-03\",\n        \"1.7965e-03\",\n        \"0.0018\",\n        \"0.0018\",\n        \"+0.0018\",\n        \"0.0017965\",\n        \"0.0017965\",\n        \"+0.0017965\",\n        \"1.79653e-03\",\n        \"+1.79653e-03\",\n        \"1.79653e-03\",\n        \"0.00180\",\n        \"0.00180\",\n        \"+0.00180\",\n        \"0.00179653\",\n        \"0.00179653\",\n        \"+0.00179653\",\n        \"1.796533e-03\",\n        \"+1.796533e-03\",\n        \"1.796533e-03\",\n        \"0.001797\",\n        \"0.001797\",\n        \"+0.001797\",\n        \"0.001796533\",\n        \"0.001796533\",\n        \"+0.001796533\",\n        \"1.7965327e-03\",\n        \"+1.7965327e-03\",\n        \"1.7965327e-03\",\n        \"0.0017965\",\n        \"0.0017965\",\n        \"+0.0017965\",\n        \"0.0017965327\",\n        \"0.0017965327\",\n        \"+0.0017965327\",\n        \"1.79653273e-03\",\n        \"+1.79653273e-03\",\n        \"1.79653273e-03\",\n        \"0.00179653\",\n        \"0.00179653\",\n        \"+0.00179653\",\n        \"0.00179653273\",\n        \"0.00179653273\",\n        \"+0.00179653273\",\n        \"1.796532728e-03\",\n        \"+1.796532728e-03\",\n        \"1.796532728e-03\",\n        \"0.001796533\",\n        \"0.001796533\",\n        \"+0.001796533\",\n        \"0.001796532728\",\n        \"0.001796532728\",\n        \"+0.001796532728\",\n        \"1.7965327279e-03\",\n        \"+1.7965327279e-03\",\n        \"1.7965327279e-03\",\n        \"0.0017965327\",\n        \"0.0017965327\",\n        \"+0.0017965327\",\n        \"0.0017965327279\",\n        \"0.0017965327279\",\n        \"+0.0017965327279\",\n        \"1.79653272789e-03\",\n        \"+1.79653272789e-03\",\n        \"1.79653272789e-03\",\n        \"0.00179653273\",\n        \"0.00179653273\",\n        \"+0.00179653273\",\n        \"0.00179653272789\",\n        \"0.00179653272789\",\n        \"+0.00179653272789\",\n        \"1.796532727894e-03\",\n        \"+1.796532727894e-03\",\n        \"1.796532727894e-03\",\n        \"0.001796532728\",\n        \"0.001796532728\",\n        \"+0.001796532728\",\n        \"0.001796532727894\",\n        \"0.001796532727894\",\n        \"+0.001796532727894\",\n        \"1.7965327278944e-03\",\n        \"+1.7965327278944e-03\",\n        \"1.7965327278944e-03\",\n        \"0.0017965327279\",\n        \"0.0017965327279\",\n        \"+0.0017965327279\",\n    }},\n    {{\n        \"-0.002\",\n        \"-0.002\",\n        \"-0.002\",\n        \"-1.8e-03\",\n        \"-1.8e-03\",\n        \"-1.8e-03\",\n        \"-0.0\",\n        \"-0.0\",\n        \"-0.0\",\n        \"-0.0018\",\n        \"-0.0018\",\n        \"-0.0018\",\n        \"-1.80e-03\",\n        \"-1.80e-03\",\n        \"-1.80e-03\",\n        \"-0.00\",\n        \"-0.00\",\n        \"-0.00\",\n        \"-0.0018\",\n        \"-0.00180\",\n        \"-0.0018\",\n        \"-1.797e-03\",\n        \"-1.797e-03\",\n        \"-1.797e-03\",\n        \"-0.002\",\n        \"-0.002\",\n        \"-0.002\",\n        \"-0.001797\",\n        \"-0.001797\",\n        \"-0.001797\",\n        \"-1.7965e-03\",\n        \"-1.7965e-03\",\n        \"-1.7965e-03\",\n        \"-0.0018\",\n        \"-0.0018\",\n        \"-0.0018\",\n        \"-0.0017965\",\n        \"-0.0017965\",\n        \"-0.0017965\",\n        \"-1.79653e-03\",\n        \"-1.79653e-03\",\n        \"-1.79653e-03\",\n        \"-0.00180\",\n        \"-0.00180\",\n        \"-0.00180\",\n        \"-0.00179653\",\n        \"-0.00179653\",\n        \"-0.00179653\",\n        \"-1.796533e-03\",\n        \"-1.796533e-03\",\n        \"-1.796533e-03\",\n        \"-0.001797\",\n        \"-0.001797\",\n        \"-0.001797\",\n        \"-0.001796533\",\n        \"-0.001796533\",\n        \"-0.001796533\",\n        \"-1.7965327e-03\",\n        \"-1.7965327e-03\",\n        \"-1.7965327e-03\",\n        \"-0.0017965\",\n        \"-0.0017965\",\n        \"-0.0017965\",\n        \"-0.0017965327\",\n        \"-0.0017965327\",\n        \"-0.0017965327\",\n        \"-1.79653273e-03\",\n        \"-1.79653273e-03\",\n        \"-1.79653273e-03\",\n        \"-0.00179653\",\n        \"-0.00179653\",\n        \"-0.00179653\",\n        \"-0.00179653273\",\n        \"-0.00179653273\",\n        \"-0.00179653273\",\n        \"-1.796532728e-03\",\n        \"-1.796532728e-03\",\n        \"-1.796532728e-03\",\n        \"-0.001796533\",\n        \"-0.001796533\",\n        \"-0.001796533\",\n        \"-0.001796532728\",\n        \"-0.001796532728\",\n        \"-0.001796532728\",\n        \"-1.7965327279e-03\",\n        \"-1.7965327279e-03\",\n        \"-1.7965327279e-03\",\n        \"-0.0017965327\",\n        \"-0.0017965327\",\n        \"-0.0017965327\",\n        \"-0.0017965327279\",\n        \"-0.0017965327279\",\n        \"-0.0017965327279\",\n        \"-1.79653272789e-03\",\n        \"-1.79653272789e-03\",\n        \"-1.79653272789e-03\",\n        \"-0.00179653273\",\n        \"-0.00179653273\",\n        \"-0.00179653273\",\n        \"-0.00179653272789\",\n        \"-0.00179653272789\",\n        \"-0.00179653272789\",\n        \"-1.796532727894e-03\",\n        \"-1.796532727894e-03\",\n        \"-1.796532727894e-03\",\n        \"-0.001796532728\",\n        \"-0.001796532728\",\n        \"-0.001796532728\",\n        \"-0.001796532727894\",\n        \"-0.001796532727894\",\n        \"-0.001796532727894\",\n        \"-1.7965327278944e-03\",\n        \"-1.7965327278944e-03\",\n        \"-1.7965327278944e-03\",\n        \"-0.0017965327279\",\n        \"-0.0017965327279\",\n        \"-0.0017965327279\",\n    }},\n    {{\n        \"0.0002\",\n        \"0.0002\",\n        \"+0.0002\",\n        \"2.2e-04\",\n        \"+2.2e-04\",\n        \"2.2e-04\",\n        \"0.0\",\n        \"0.0\",\n        \"+0.0\",\n        \"0.00022\",\n        \"0.00022\",\n        \"+0.00022\",\n        \"2.25e-04\",\n        \"+2.25e-04\",\n        \"2.25e-04\",\n        \"0.00\",\n        \"0.00\",\n        \"+0.00\",\n        \"0.000225\",\n        \"0.000225\",\n        \"+0.000225\",\n        \"2.246e-04\",\n        \"+2.246e-04\",\n        \"2.246e-04\",\n        \"0.000\",\n        \"0.000\",\n        \"+0.000\",\n        \"0.0002246\",\n        \"0.0002246\",\n        \"+0.0002246\",\n        \"2.2457e-04\",\n        \"+2.2457e-04\",\n        \"2.2457e-04\",\n        \"0.0002\",\n        \"0.0002\",\n        \"+0.0002\",\n        \"0.00022457\",\n        \"0.00022457\",\n        \"+0.00022457\",\n        \"2.24567e-04\",\n        \"+2.24567e-04\",\n        \"2.24567e-04\",\n        \"0.00022\",\n        \"0.00022\",\n        \"+0.00022\",\n        \"0.000224567\",\n        \"0.000224567\",\n        \"+0.000224567\",\n        \"2.245666e-04\",\n        \"+2.245666e-04\",\n        \"2.245666e-04\",\n        \"0.000225\",\n        \"0.000225\",\n        \"+0.000225\",\n        \"0.0002245666\",\n        \"0.0002245666\",\n        \"+0.0002245666\",\n        \"2.2456659e-04\",\n        \"+2.2456659e-04\",\n        \"2.2456659e-04\",\n        \"0.0002246\",\n        \"0.0002246\",\n        \"+0.0002246\",\n        \"0.00022456659\",\n        \"0.00022456659\",\n        \"+0.00022456659\",\n        \"2.24566591e-04\",\n        \"+2.24566591e-04\",\n        \"2.24566591e-04\",\n        \"0.00022457\",\n        \"0.00022457\",\n        \"+0.00022457\",\n        \"0.000224566591\",\n        \"0.000224566591\",\n        \"+0.000224566591\",\n        \"2.245665910e-04\",\n        \"+2.245665910e-04\",\n        \"2.245665910e-04\",\n        \"0.000224567\",\n        \"0.000224567\",\n        \"+0.000224567\",\n        \"0.000224566591\",\n        \"0.0002245665910\",\n        \"+0.000224566591\",\n        \"2.2456659099e-04\",\n        \"+2.2456659099e-04\",\n        \"2.2456659099e-04\",\n        \"0.0002245666\",\n        \"0.0002245666\",\n        \"+0.0002245666\",\n        \"0.00022456659099\",\n        \"0.00022456659099\",\n        \"+0.00022456659099\",\n        \"2.24566590987e-04\",\n        \"+2.24566590987e-04\",\n        \"2.24566590987e-04\",\n        \"0.00022456659\",\n        \"0.00022456659\",\n        \"+0.00022456659\",\n        \"0.000224566590987\",\n        \"0.000224566590987\",\n        \"+0.000224566590987\",\n        \"2.245665909868e-04\",\n        \"+2.245665909868e-04\",\n        \"2.245665909868e-04\",\n        \"0.000224566591\",\n        \"0.000224566591\",\n        \"+0.000224566591\",\n        \"0.0002245665909868\",\n        \"0.0002245665909868\",\n        \"+0.0002245665909868\",\n        \"2.2456659098680e-04\",\n        \"+2.2456659098680e-04\",\n        \"2.2456659098680e-04\",\n        \"0.0002245665910\",\n        \"0.0002245665910\",\n        \"+0.0002245665910\",\n    }},\n    {{\n        \"-0.0002\",\n        \"-0.0002\",\n        \"-0.0002\",\n        \"-2.2e-04\",\n        \"-2.2e-04\",\n        \"-2.2e-04\",\n        \"-0.0\",\n        \"-0.0\",\n        \"-0.0\",\n        \"-0.00022\",\n        \"-0.00022\",\n        \"-0.00022\",\n        \"-2.25e-04\",\n        \"-2.25e-04\",\n        \"-2.25e-04\",\n        \"-0.00\",\n        \"-0.00\",\n        \"-0.00\",\n        \"-0.000225\",\n        \"-0.000225\",\n        \"-0.000225\",\n        \"-2.246e-04\",\n        \"-2.246e-04\",\n        \"-2.246e-04\",\n        \"-0.000\",\n        \"-0.000\",\n        \"-0.000\",\n        \"-0.0002246\",\n        \"-0.0002246\",\n        \"-0.0002246\",\n        \"-2.2457e-04\",\n        \"-2.2457e-04\",\n        \"-2.2457e-04\",\n        \"-0.0002\",\n        \"-0.0002\",\n        \"-0.0002\",\n        \"-0.00022457\",\n        \"-0.00022457\",\n        \"-0.00022457\",\n        \"-2.24567e-04\",\n        \"-2.24567e-04\",\n        \"-2.24567e-04\",\n        \"-0.00022\",\n        \"-0.00022\",\n        \"-0.00022\",\n        \"-0.000224567\",\n        \"-0.000224567\",\n        \"-0.000224567\",\n        \"-2.245666e-04\",\n        \"-2.245666e-04\",\n        \"-2.245666e-04\",\n        \"-0.000225\",\n        \"-0.000225\",\n        \"-0.000225\",\n        \"-0.0002245666\",\n        \"-0.0002245666\",\n        \"-0.0002245666\",\n        \"-2.2456659e-04\",\n        \"-2.2456659e-04\",\n        \"-2.2456659e-04\",\n        \"-0.0002246\",\n        \"-0.0002246\",\n        \"-0.0002246\",\n        \"-0.00022456659\",\n        \"-0.00022456659\",\n        \"-0.00022456659\",\n        \"-2.24566591e-04\",\n        \"-2.24566591e-04\",\n        \"-2.24566591e-04\",\n        \"-0.00022457\",\n        \"-0.00022457\",\n        \"-0.00022457\",\n        \"-0.000224566591\",\n        \"-0.000224566591\",\n        \"-0.000224566591\",\n        \"-2.245665910e-04\",\n        \"-2.245665910e-04\",\n        \"-2.245665910e-04\",\n        \"-0.000224567\",\n        \"-0.000224567\",\n        \"-0.000224567\",\n        \"-0.000224566591\",\n        \"-0.0002245665910\",\n        \"-0.000224566591\",\n        \"-2.2456659099e-04\",\n        \"-2.2456659099e-04\",\n        \"-2.2456659099e-04\",\n        \"-0.0002245666\",\n        \"-0.0002245666\",\n        \"-0.0002245666\",\n        \"-0.00022456659099\",\n        \"-0.00022456659099\",\n        \"-0.00022456659099\",\n        \"-2.24566590987e-04\",\n        \"-2.24566590987e-04\",\n        \"-2.24566590987e-04\",\n        \"-0.00022456659\",\n        \"-0.00022456659\",\n        \"-0.00022456659\",\n        \"-0.000224566590987\",\n        \"-0.000224566590987\",\n        \"-0.000224566590987\",\n        \"-2.245665909868e-04\",\n        \"-2.245665909868e-04\",\n        \"-2.245665909868e-04\",\n        \"-0.000224566591\",\n        \"-0.000224566591\",\n        \"-0.000224566591\",\n        \"-0.0002245665909868\",\n        \"-0.0002245665909868\",\n        \"-0.0002245665909868\",\n        \"-2.2456659098680e-04\",\n        \"-2.2456659098680e-04\",\n        \"-2.2456659098680e-04\",\n        \"-0.0002245665910\",\n        \"-0.0002245665910\",\n        \"-0.0002245665910\",\n    }},\n    {{\n        \"3e-05\",\n        \"3.e-05\",\n        \"+3e-05\",\n        \"2.8e-05\",\n        \"+2.8e-05\",\n        \"2.8e-05\",\n        \"0.0\",\n        \"0.0\",\n        \"+0.0\",\n        \"2.8e-05\",\n        \"2.8e-05\",\n        \"+2.8e-05\",\n        \"2.81e-05\",\n        \"+2.81e-05\",\n        \"2.81e-05\",\n        \"0.00\",\n        \"0.00\",\n        \"+0.00\",\n        \"2.81e-05\",\n        \"2.81e-05\",\n        \"+2.81e-05\",\n        \"2.807e-05\",\n        \"+2.807e-05\",\n        \"2.807e-05\",\n        \"0.000\",\n        \"0.000\",\n        \"+0.000\",\n        \"2.807e-05\",\n        \"2.807e-05\",\n        \"+2.807e-05\",\n        \"2.8071e-05\",\n        \"+2.8071e-05\",\n        \"2.8071e-05\",\n        \"0.0000\",\n        \"0.0000\",\n        \"+0.0000\",\n        \"2.8071e-05\",\n        \"2.8071e-05\",\n        \"+2.8071e-05\",\n        \"2.80708e-05\",\n        \"+2.80708e-05\",\n        \"2.80708e-05\",\n        \"0.00003\",\n        \"0.00003\",\n        \"+0.00003\",\n        \"2.80708e-05\",\n        \"2.80708e-05\",\n        \"+2.80708e-05\",\n        \"2.807082e-05\",\n        \"+2.807082e-05\",\n        \"2.807082e-05\",\n        \"0.000028\",\n        \"0.000028\",\n        \"+0.000028\",\n        \"2.807082e-05\",\n        \"2.807082e-05\",\n        \"+2.807082e-05\",\n        \"2.8070824e-05\",\n        \"+2.8070824e-05\",\n        \"2.8070824e-05\",\n        \"0.0000281\",\n        \"0.0000281\",\n        \"+0.0000281\",\n        \"2.8070824e-05\",\n        \"2.8070824e-05\",\n        \"+2.8070824e-05\",\n        \"2.80708239e-05\",\n        \"+2.80708239e-05\",\n        \"2.80708239e-05\",\n        \"0.00002807\",\n        \"0.00002807\",\n        \"+0.00002807\",\n        \"2.80708239e-05\",\n        \"2.80708239e-05\",\n        \"+2.80708239e-05\",\n        \"2.807082387e-05\",\n        \"+2.807082387e-05\",\n        \"2.807082387e-05\",\n        \"0.000028071\",\n        \"0.000028071\",\n        \"+0.000028071\",\n        \"2.807082387e-05\",\n        \"2.807082387e-05\",\n        \"+2.807082387e-05\",\n        \"2.8070823873e-05\",\n        \"+2.8070823873e-05\",\n        \"2.8070823873e-05\",\n        \"0.0000280708\",\n        \"0.0000280708\",\n        \"+0.0000280708\",\n        \"2.8070823873e-05\",\n        \"2.8070823873e-05\",\n        \"+2.8070823873e-05\",\n        \"2.80708238733e-05\",\n        \"+2.80708238733e-05\",\n        \"2.80708238733e-05\",\n        \"0.00002807082\",\n        \"0.00002807082\",\n        \"+0.00002807082\",\n        \"2.80708238733e-05\",\n        \"2.80708238733e-05\",\n        \"+2.80708238733e-05\",\n        \"2.807082387335e-05\",\n        \"+2.807082387335e-05\",\n        \"2.807082387335e-05\",\n        \"0.000028070824\",\n        \"0.000028070824\",\n        \"+0.000028070824\",\n        \"2.807082387335e-05\",\n        \"2.807082387335e-05\",\n        \"+2.807082387335e-05\",\n        \"2.8070823873350e-05\",\n        \"+2.8070823873350e-05\",\n        \"2.8070823873350e-05\",\n        \"0.0000280708239\",\n        \"0.0000280708239\",\n        \"+0.0000280708239\",\n    }},\n    {{\n        \"-3e-05\",\n        \"-3.e-05\",\n        \"-3e-05\",\n        \"-2.8e-05\",\n        \"-2.8e-05\",\n        \"-2.8e-05\",\n        \"-0.0\",\n        \"-0.0\",\n        \"-0.0\",\n        \"-2.8e-05\",\n        \"-2.8e-05\",\n        \"-2.8e-05\",\n        \"-2.81e-05\",\n        \"-2.81e-05\",\n        \"-2.81e-05\",\n        \"-0.00\",\n        \"-0.00\",\n        \"-0.00\",\n        \"-2.81e-05\",\n        \"-2.81e-05\",\n        \"-2.81e-05\",\n        \"-2.807e-05\",\n        \"-2.807e-05\",\n        \"-2.807e-05\",\n        \"-0.000\",\n        \"-0.000\",\n        \"-0.000\",\n        \"-2.807e-05\",\n        \"-2.807e-05\",\n        \"-2.807e-05\",\n        \"-2.8071e-05\",\n        \"-2.8071e-05\",\n        \"-2.8071e-05\",\n        \"-0.0000\",\n        \"-0.0000\",\n        \"-0.0000\",\n        \"-2.8071e-05\",\n        \"-2.8071e-05\",\n        \"-2.8071e-05\",\n        \"-2.80708e-05\",\n        \"-2.80708e-05\",\n        \"-2.80708e-05\",\n        \"-0.00003\",\n        \"-0.00003\",\n        \"-0.00003\",\n        \"-2.80708e-05\",\n        \"-2.80708e-05\",\n        \"-2.80708e-05\",\n        \"-2.807082e-05\",\n        \"-2.807082e-05\",\n        \"-2.807082e-05\",\n        \"-0.000028\",\n        \"-0.000028\",\n        \"-0.000028\",\n        \"-2.807082e-05\",\n        \"-2.807082e-05\",\n        \"-2.807082e-05\",\n        \"-2.8070824e-05\",\n        \"-2.8070824e-05\",\n        \"-2.8070824e-05\",\n        \"-0.0000281\",\n        \"-0.0000281\",\n        \"-0.0000281\",\n        \"-2.8070824e-05\",\n        \"-2.8070824e-05\",\n        \"-2.8070824e-05\",\n        \"-2.80708239e-05\",\n        \"-2.80708239e-05\",\n        \"-2.80708239e-05\",\n        \"-0.00002807\",\n        \"-0.00002807\",\n        \"-0.00002807\",\n        \"-2.80708239e-05\",\n        \"-2.80708239e-05\",\n        \"-2.80708239e-05\",\n        \"-2.807082387e-05\",\n        \"-2.807082387e-05\",\n        \"-2.807082387e-05\",\n        \"-0.000028071\",\n        \"-0.000028071\",\n        \"-0.000028071\",\n        \"-2.807082387e-05\",\n        \"-2.807082387e-05\",\n        \"-2.807082387e-05\",\n        \"-2.8070823873e-05\",\n        \"-2.8070823873e-05\",\n        \"-2.8070823873e-05\",\n        \"-0.0000280708\",\n        \"-0.0000280708\",\n        \"-0.0000280708\",\n        \"-2.8070823873e-05\",\n        \"-2.8070823873e-05\",\n        \"-2.8070823873e-05\",\n        \"-2.80708238733e-05\",\n        \"-2.80708238733e-05\",\n        \"-2.80708238733e-05\",\n        \"-0.00002807082\",\n        \"-0.00002807082\",\n        \"-0.00002807082\",\n        \"-2.80708238733e-05\",\n        \"-2.80708238733e-05\",\n        \"-2.80708238733e-05\",\n        \"-2.807082387335e-05\",\n        \"-2.807082387335e-05\",\n        \"-2.807082387335e-05\",\n        \"-0.000028070824\",\n        \"-0.000028070824\",\n        \"-0.000028070824\",\n        \"-2.807082387335e-05\",\n        \"-2.807082387335e-05\",\n        \"-2.807082387335e-05\",\n        \"-2.8070823873350e-05\",\n        \"-2.8070823873350e-05\",\n        \"-2.8070823873350e-05\",\n        \"-0.0000280708239\",\n        \"-0.0000280708239\",\n        \"-0.0000280708239\",\n    }},\n    {{\n        \"4e-06\",\n        \"4.e-06\",\n        \"+4e-06\",\n        \"3.5e-06\",\n        \"+3.5e-06\",\n        \"3.5e-06\",\n        \"0.0\",\n        \"0.0\",\n        \"+0.0\",\n        \"3.5e-06\",\n        \"3.5e-06\",\n        \"+3.5e-06\",\n        \"3.51e-06\",\n        \"+3.51e-06\",\n        \"3.51e-06\",\n        \"0.00\",\n        \"0.00\",\n        \"+0.00\",\n        \"3.51e-06\",\n        \"3.51e-06\",\n        \"+3.51e-06\",\n        \"3.509e-06\",\n        \"+3.509e-06\",\n        \"3.509e-06\",\n        \"0.000\",\n        \"0.000\",\n        \"+0.000\",\n        \"3.509e-06\",\n        \"3.509e-06\",\n        \"+3.509e-06\",\n        \"3.5089e-06\",\n        \"+3.5089e-06\",\n        \"3.5089e-06\",\n        \"0.0000\",\n        \"0.0000\",\n        \"+0.0000\",\n        \"3.5089e-06\",\n        \"3.5089e-06\",\n        \"+3.5089e-06\",\n        \"3.50885e-06\",\n        \"+3.50885e-06\",\n        \"3.50885e-06\",\n        \"0.00000\",\n        \"0.00000\",\n        \"+0.00000\",\n        \"3.50885e-06\",\n        \"3.50885e-06\",\n        \"+3.50885e-06\",\n        \"3.508853e-06\",\n        \"+3.508853e-06\",\n        \"3.508853e-06\",\n        \"0.000004\",\n        \"0.000004\",\n        \"+0.000004\",\n        \"3.508853e-06\",\n        \"3.508853e-06\",\n        \"+3.508853e-06\",\n        \"3.5088530e-06\",\n        \"+3.5088530e-06\",\n        \"3.5088530e-06\",\n        \"0.0000035\",\n        \"0.0000035\",\n        \"+0.0000035\",\n        \"3.508853e-06\",\n        \"3.5088530e-06\",\n        \"+3.508853e-06\",\n        \"3.50885298e-06\",\n        \"+3.50885298e-06\",\n        \"3.50885298e-06\",\n        \"0.00000351\",\n        \"0.00000351\",\n        \"+0.00000351\",\n        \"3.50885298e-06\",\n        \"3.50885298e-06\",\n        \"+3.50885298e-06\",\n        \"3.508852984e-06\",\n        \"+3.508852984e-06\",\n        \"3.508852984e-06\",\n        \"0.000003509\",\n        \"0.000003509\",\n        \"+0.000003509\",\n        \"3.508852984e-06\",\n        \"3.508852984e-06\",\n        \"+3.508852984e-06\",\n        \"3.5088529842e-06\",\n        \"+3.5088529842e-06\",\n        \"3.5088529842e-06\",\n        \"0.0000035089\",\n        \"0.0000035089\",\n        \"+0.0000035089\",\n        \"3.5088529842e-06\",\n        \"3.5088529842e-06\",\n        \"+3.5088529842e-06\",\n        \"3.50885298417e-06\",\n        \"+3.50885298417e-06\",\n        \"3.50885298417e-06\",\n        \"0.00000350885\",\n        \"0.00000350885\",\n        \"+0.00000350885\",\n        \"3.50885298417e-06\",\n        \"3.50885298417e-06\",\n        \"+3.50885298417e-06\",\n        \"3.508852984169e-06\",\n        \"+3.508852984169e-06\",\n        \"3.508852984169e-06\",\n        \"0.000003508853\",\n        \"0.000003508853\",\n        \"+0.000003508853\",\n        \"3.508852984169e-06\",\n        \"3.508852984169e-06\",\n        \"+3.508852984169e-06\",\n        \"3.5088529841687e-06\",\n        \"+3.5088529841687e-06\",\n        \"3.5088529841687e-06\",\n        \"0.0000035088530\",\n        \"0.0000035088530\",\n        \"+0.0000035088530\",\n    }},\n    {{\n        \"-4e-06\",\n        \"-4.e-06\",\n        \"-4e-06\",\n        \"-3.5e-06\",\n        \"-3.5e-06\",\n        \"-3.5e-06\",\n        \"-0.0\",\n        \"-0.0\",\n        \"-0.0\",\n        \"-3.5e-06\",\n        \"-3.5e-06\",\n        \"-3.5e-06\",\n        \"-3.51e-06\",\n        \"-3.51e-06\",\n        \"-3.51e-06\",\n        \"-0.00\",\n        \"-0.00\",\n        \"-0.00\",\n        \"-3.51e-06\",\n        \"-3.51e-06\",\n        \"-3.51e-06\",\n        \"-3.509e-06\",\n        \"-3.509e-06\",\n        \"-3.509e-06\",\n        \"-0.000\",\n        \"-0.000\",\n        \"-0.000\",\n        \"-3.509e-06\",\n        \"-3.509e-06\",\n        \"-3.509e-06\",\n        \"-3.5089e-06\",\n        \"-3.5089e-06\",\n        \"-3.5089e-06\",\n        \"-0.0000\",\n        \"-0.0000\",\n        \"-0.0000\",\n        \"-3.5089e-06\",\n        \"-3.5089e-06\",\n        \"-3.5089e-06\",\n        \"-3.50885e-06\",\n        \"-3.50885e-06\",\n        \"-3.50885e-06\",\n        \"-0.00000\",\n        \"-0.00000\",\n        \"-0.00000\",\n        \"-3.50885e-06\",\n        \"-3.50885e-06\",\n        \"-3.50885e-06\",\n        \"-3.508853e-06\",\n        \"-3.508853e-06\",\n        \"-3.508853e-06\",\n        \"-0.000004\",\n        \"-0.000004\",\n        \"-0.000004\",\n        \"-3.508853e-06\",\n        \"-3.508853e-06\",\n        \"-3.508853e-06\",\n        \"-3.5088530e-06\",\n        \"-3.5088530e-06\",\n        \"-3.5088530e-06\",\n        \"-0.0000035\",\n        \"-0.0000035\",\n        \"-0.0000035\",\n        \"-3.508853e-06\",\n        \"-3.5088530e-06\",\n        \"-3.508853e-06\",\n        \"-3.50885298e-06\",\n        \"-3.50885298e-06\",\n        \"-3.50885298e-06\",\n        \"-0.00000351\",\n        \"-0.00000351\",\n        \"-0.00000351\",\n        \"-3.50885298e-06\",\n        \"-3.50885298e-06\",\n        \"-3.50885298e-06\",\n        \"-3.508852984e-06\",\n        \"-3.508852984e-06\",\n        \"-3.508852984e-06\",\n        \"-0.000003509\",\n        \"-0.000003509\",\n        \"-0.000003509\",\n        \"-3.508852984e-06\",\n        \"-3.508852984e-06\",\n        \"-3.508852984e-06\",\n        \"-3.5088529842e-06\",\n        \"-3.5088529842e-06\",\n        \"-3.5088529842e-06\",\n        \"-0.0000035089\",\n        \"-0.0000035089\",\n        \"-0.0000035089\",\n        \"-3.5088529842e-06\",\n        \"-3.5088529842e-06\",\n        \"-3.5088529842e-06\",\n        \"-3.50885298417e-06\",\n        \"-3.50885298417e-06\",\n        \"-3.50885298417e-06\",\n        \"-0.00000350885\",\n        \"-0.00000350885\",\n        \"-0.00000350885\",\n        \"-3.50885298417e-06\",\n        \"-3.50885298417e-06\",\n        \"-3.50885298417e-06\",\n        \"-3.508852984169e-06\",\n        \"-3.508852984169e-06\",\n        \"-3.508852984169e-06\",\n        \"-0.000003508853\",\n        \"-0.000003508853\",\n        \"-0.000003508853\",\n        \"-3.508852984169e-06\",\n        \"-3.508852984169e-06\",\n        \"-3.508852984169e-06\",\n        \"-3.5088529841687e-06\",\n        \"-3.5088529841687e-06\",\n        \"-3.5088529841687e-06\",\n        \"-0.0000035088530\",\n        \"-0.0000035088530\",\n        \"-0.0000035088530\",\n    }},\n    {{\n        \"4e-07\",\n        \"4.e-07\",\n        \"+4e-07\",\n        \"4.4e-07\",\n        \"+4.4e-07\",\n        \"4.4e-07\",\n        \"0.0\",\n        \"0.0\",\n        \"+0.0\",\n        \"4.4e-07\",\n        \"4.4e-07\",\n        \"+4.4e-07\",\n        \"4.39e-07\",\n        \"+4.39e-07\",\n        \"4.39e-07\",\n        \"0.00\",\n        \"0.00\",\n        \"+0.00\",\n        \"4.39e-07\",\n        \"4.39e-07\",\n        \"+4.39e-07\",\n        \"4.386e-07\",\n        \"+4.386e-07\",\n        \"4.386e-07\",\n        \"0.000\",\n        \"0.000\",\n        \"+0.000\",\n        \"4.386e-07\",\n        \"4.386e-07\",\n        \"+4.386e-07\",\n        \"4.3861e-07\",\n        \"+4.3861e-07\",\n        \"4.3861e-07\",\n        \"0.0000\",\n        \"0.0000\",\n        \"+0.0000\",\n        \"4.3861e-07\",\n        \"4.3861e-07\",\n        \"+4.3861e-07\",\n        \"4.38607e-07\",\n        \"+4.38607e-07\",\n        \"4.38607e-07\",\n        \"0.00000\",\n        \"0.00000\",\n        \"+0.00000\",\n        \"4.38607e-07\",\n        \"4.38607e-07\",\n        \"+4.38607e-07\",\n        \"4.386066e-07\",\n        \"+4.386066e-07\",\n        \"4.386066e-07\",\n        \"0.000000\",\n        \"0.000000\",\n        \"+0.000000\",\n        \"4.386066e-07\",\n        \"4.386066e-07\",\n        \"+4.386066e-07\",\n        \"4.3860662e-07\",\n        \"+4.3860662e-07\",\n        \"4.3860662e-07\",\n        \"0.0000004\",\n        \"0.0000004\",\n        \"+0.0000004\",\n        \"4.3860662e-07\",\n        \"4.3860662e-07\",\n        \"+4.3860662e-07\",\n        \"4.38606623e-07\",\n        \"+4.38606623e-07\",\n        \"4.38606623e-07\",\n        \"0.00000044\",\n        \"0.00000044\",\n        \"+0.00000044\",\n        \"4.38606623e-07\",\n        \"4.38606623e-07\",\n        \"+4.38606623e-07\",\n        \"4.386066230e-07\",\n        \"+4.386066230e-07\",\n        \"4.386066230e-07\",\n        \"0.000000439\",\n        \"0.000000439\",\n        \"+0.000000439\",\n        \"4.38606623e-07\",\n        \"4.386066230e-07\",\n        \"+4.38606623e-07\",\n        \"4.3860662302e-07\",\n        \"+4.3860662302e-07\",\n        \"4.3860662302e-07\",\n        \"0.0000004386\",\n        \"0.0000004386\",\n        \"+0.0000004386\",\n        \"4.3860662302e-07\",\n        \"4.3860662302e-07\",\n        \"+4.3860662302e-07\",\n        \"4.38606623021e-07\",\n        \"+4.38606623021e-07\",\n        \"4.38606623021e-07\",\n        \"0.00000043861\",\n        \"0.00000043861\",\n        \"+0.00000043861\",\n        \"4.38606623021e-07\",\n        \"4.38606623021e-07\",\n        \"+4.38606623021e-07\",\n        \"4.386066230211e-07\",\n        \"+4.386066230211e-07\",\n        \"4.386066230211e-07\",\n        \"0.000000438607\",\n        \"0.000000438607\",\n        \"+0.000000438607\",\n        \"4.386066230211e-07\",\n        \"4.386066230211e-07\",\n        \"+4.386066230211e-07\",\n        \"4.3860662302109e-07\",\n        \"+4.3860662302109e-07\",\n        \"4.3860662302109e-07\",\n        \"0.0000004386066\",\n        \"0.0000004386066\",\n        \"+0.0000004386066\",\n    }},\n    {{\n        \"-4e-07\",\n        \"-4.e-07\",\n        \"-4e-07\",\n        \"-4.4e-07\",\n        \"-4.4e-07\",\n        \"-4.4e-07\",\n        \"-0.0\",\n        \"-0.0\",\n        \"-0.0\",\n        \"-4.4e-07\",\n        \"-4.4e-07\",\n        \"-4.4e-07\",\n        \"-4.39e-07\",\n        \"-4.39e-07\",\n        \"-4.39e-07\",\n        \"-0.00\",\n        \"-0.00\",\n        \"-0.00\",\n        \"-4.39e-07\",\n        \"-4.39e-07\",\n        \"-4.39e-07\",\n        \"-4.386e-07\",\n        \"-4.386e-07\",\n        \"-4.386e-07\",\n        \"-0.000\",\n        \"-0.000\",\n        \"-0.000\",\n        \"-4.386e-07\",\n        \"-4.386e-07\",\n        \"-4.386e-07\",\n        \"-4.3861e-07\",\n        \"-4.3861e-07\",\n        \"-4.3861e-07\",\n        \"-0.0000\",\n        \"-0.0000\",\n        \"-0.0000\",\n        \"-4.3861e-07\",\n        \"-4.3861e-07\",\n        \"-4.3861e-07\",\n        \"-4.38607e-07\",\n        \"-4.38607e-07\",\n        \"-4.38607e-07\",\n        \"-0.00000\",\n        \"-0.00000\",\n        \"-0.00000\",\n        \"-4.38607e-07\",\n        \"-4.38607e-07\",\n        \"-4.38607e-07\",\n        \"-4.386066e-07\",\n        \"-4.386066e-07\",\n        \"-4.386066e-07\",\n        \"-0.000000\",\n        \"-0.000000\",\n        \"-0.000000\",\n        \"-4.386066e-07\",\n        \"-4.386066e-07\",\n        \"-4.386066e-07\",\n        \"-4.3860662e-07\",\n        \"-4.3860662e-07\",\n        \"-4.3860662e-07\",\n        \"-0.0000004\",\n        \"-0.0000004\",\n        \"-0.0000004\",\n        \"-4.3860662e-07\",\n        \"-4.3860662e-07\",\n        \"-4.3860662e-07\",\n        \"-4.38606623e-07\",\n        \"-4.38606623e-07\",\n        \"-4.38606623e-07\",\n        \"-0.00000044\",\n        \"-0.00000044\",\n        \"-0.00000044\",\n        \"-4.38606623e-07\",\n        \"-4.38606623e-07\",\n        \"-4.38606623e-07\",\n        \"-4.386066230e-07\",\n        \"-4.386066230e-07\",\n        \"-4.386066230e-07\",\n        \"-0.000000439\",\n        \"-0.000000439\",\n        \"-0.000000439\",\n        \"-4.38606623e-07\",\n        \"-4.386066230e-07\",\n        \"-4.38606623e-07\",\n        \"-4.3860662302e-07\",\n        \"-4.3860662302e-07\",\n        \"-4.3860662302e-07\",\n        \"-0.0000004386\",\n        \"-0.0000004386\",\n        \"-0.0000004386\",\n        \"-4.3860662302e-07\",\n        \"-4.3860662302e-07\",\n        \"-4.3860662302e-07\",\n        \"-4.38606623021e-07\",\n        \"-4.38606623021e-07\",\n        \"-4.38606623021e-07\",\n        \"-0.00000043861\",\n        \"-0.00000043861\",\n        \"-0.00000043861\",\n        \"-4.38606623021e-07\",\n        \"-4.38606623021e-07\",\n        \"-4.38606623021e-07\",\n        \"-4.386066230211e-07\",\n        \"-4.386066230211e-07\",\n        \"-4.386066230211e-07\",\n        \"-0.000000438607\",\n        \"-0.000000438607\",\n        \"-0.000000438607\",\n        \"-4.386066230211e-07\",\n        \"-4.386066230211e-07\",\n        \"-4.386066230211e-07\",\n        \"-4.3860662302109e-07\",\n        \"-4.3860662302109e-07\",\n        \"-4.3860662302109e-07\",\n        \"-0.0000004386066\",\n        \"-0.0000004386066\",\n        \"-0.0000004386066\",\n    }},\n    {{\n        \"5e-08\",\n        \"5.e-08\",\n        \"+5e-08\",\n        \"5.5e-08\",\n        \"+5.5e-08\",\n        \"5.5e-08\",\n        \"0.0\",\n        \"0.0\",\n        \"+0.0\",\n        \"5.5e-08\",\n        \"5.5e-08\",\n        \"+5.5e-08\",\n        \"5.48e-08\",\n        \"+5.48e-08\",\n        \"5.48e-08\",\n        \"0.00\",\n        \"0.00\",\n        \"+0.00\",\n        \"5.48e-08\",\n        \"5.48e-08\",\n        \"+5.48e-08\",\n        \"5.483e-08\",\n        \"+5.483e-08\",\n        \"5.483e-08\",\n        \"0.000\",\n        \"0.000\",\n        \"+0.000\",\n        \"5.483e-08\",\n        \"5.483e-08\",\n        \"+5.483e-08\",\n        \"5.4826e-08\",\n        \"+5.4826e-08\",\n        \"5.4826e-08\",\n        \"0.0000\",\n        \"0.0000\",\n        \"+0.0000\",\n        \"5.4826e-08\",\n        \"5.4826e-08\",\n        \"+5.4826e-08\",\n        \"5.48258e-08\",\n        \"+5.48258e-08\",\n        \"5.48258e-08\",\n        \"0.00000\",\n        \"0.00000\",\n        \"+0.00000\",\n        \"5.48258e-08\",\n        \"5.48258e-08\",\n        \"+5.48258e-08\",\n        \"5.482583e-08\",\n        \"+5.482583e-08\",\n        \"5.482583e-08\",\n        \"0.000000\",\n        \"0.000000\",\n        \"+0.000000\",\n        \"5.482583e-08\",\n        \"5.482583e-08\",\n        \"+5.482583e-08\",\n        \"5.4825828e-08\",\n        \"+5.4825828e-08\",\n        \"5.4825828e-08\",\n        \"0.0000001\",\n        \"0.0000001\",\n        \"+0.0000001\",\n        \"5.4825828e-08\",\n        \"5.4825828e-08\",\n        \"+5.4825828e-08\",\n        \"5.48258279e-08\",\n        \"+5.48258279e-08\",\n        \"5.48258279e-08\",\n        \"0.00000005\",\n        \"0.00000005\",\n        \"+0.00000005\",\n        \"5.48258279e-08\",\n        \"5.48258279e-08\",\n        \"+5.48258279e-08\",\n        \"5.482582788e-08\",\n        \"+5.482582788e-08\",\n        \"5.482582788e-08\",\n        \"0.000000055\",\n        \"0.000000055\",\n        \"+0.000000055\",\n        \"5.482582788e-08\",\n        \"5.482582788e-08\",\n        \"+5.482582788e-08\",\n        \"5.4825827878e-08\",\n        \"+5.4825827878e-08\",\n        \"5.4825827878e-08\",\n        \"0.0000000548\",\n        \"0.0000000548\",\n        \"+0.0000000548\",\n        \"5.4825827878e-08\",\n        \"5.4825827878e-08\",\n        \"+5.4825827878e-08\",\n        \"5.48258278776e-08\",\n        \"+5.48258278776e-08\",\n        \"5.48258278776e-08\",\n        \"0.00000005483\",\n        \"0.00000005483\",\n        \"+0.00000005483\",\n        \"5.48258278776e-08\",\n        \"5.48258278776e-08\",\n        \"+5.48258278776e-08\",\n        \"5.482582787764e-08\",\n        \"+5.482582787764e-08\",\n        \"5.482582787764e-08\",\n        \"0.000000054826\",\n        \"0.000000054826\",\n        \"+0.000000054826\",\n        \"5.482582787764e-08\",\n        \"5.482582787764e-08\",\n        \"+5.482582787764e-08\",\n        \"5.4825827877636e-08\",\n        \"+5.4825827877636e-08\",\n        \"5.4825827877636e-08\",\n        \"0.0000000548258\",\n        \"0.0000000548258\",\n        \"+0.0000000548258\",\n    }},\n    {{\n        \"-5e-08\",\n        \"-5.e-08\",\n        \"-5e-08\",\n        \"-5.5e-08\",\n        \"-5.5e-08\",\n        \"-5.5e-08\",\n        \"-0.0\",\n        \"-0.0\",\n        \"-0.0\",\n        \"-5.5e-08\",\n        \"-5.5e-08\",\n        \"-5.5e-08\",\n        \"-5.48e-08\",\n        \"-5.48e-08\",\n        \"-5.48e-08\",\n        \"-0.00\",\n        \"-0.00\",\n        \"-0.00\",\n        \"-5.48e-08\",\n        \"-5.48e-08\",\n        \"-5.48e-08\",\n        \"-5.483e-08\",\n        \"-5.483e-08\",\n        \"-5.483e-08\",\n        \"-0.000\",\n        \"-0.000\",\n        \"-0.000\",\n        \"-5.483e-08\",\n        \"-5.483e-08\",\n        \"-5.483e-08\",\n        \"-5.4826e-08\",\n        \"-5.4826e-08\",\n        \"-5.4826e-08\",\n        \"-0.0000\",\n        \"-0.0000\",\n        \"-0.0000\",\n        \"-5.4826e-08\",\n        \"-5.4826e-08\",\n        \"-5.4826e-08\",\n        \"-5.48258e-08\",\n        \"-5.48258e-08\",\n        \"-5.48258e-08\",\n        \"-0.00000\",\n        \"-0.00000\",\n        \"-0.00000\",\n        \"-5.48258e-08\",\n        \"-5.48258e-08\",\n        \"-5.48258e-08\",\n        \"-5.482583e-08\",\n        \"-5.482583e-08\",\n        \"-5.482583e-08\",\n        \"-0.000000\",\n        \"-0.000000\",\n        \"-0.000000\",\n        \"-5.482583e-08\",\n        \"-5.482583e-08\",\n        \"-5.482583e-08\",\n        \"-5.4825828e-08\",\n        \"-5.4825828e-08\",\n        \"-5.4825828e-08\",\n        \"-0.0000001\",\n        \"-0.0000001\",\n        \"-0.0000001\",\n        \"-5.4825828e-08\",\n        \"-5.4825828e-08\",\n        \"-5.4825828e-08\",\n        \"-5.48258279e-08\",\n        \"-5.48258279e-08\",\n        \"-5.48258279e-08\",\n        \"-0.00000005\",\n        \"-0.00000005\",\n        \"-0.00000005\",\n        \"-5.48258279e-08\",\n        \"-5.48258279e-08\",\n        \"-5.48258279e-08\",\n        \"-5.482582788e-08\",\n        \"-5.482582788e-08\",\n        \"-5.482582788e-08\",\n        \"-0.000000055\",\n        \"-0.000000055\",\n        \"-0.000000055\",\n        \"-5.482582788e-08\",\n        \"-5.482582788e-08\",\n        \"-5.482582788e-08\",\n        \"-5.4825827878e-08\",\n        \"-5.4825827878e-08\",\n        \"-5.4825827878e-08\",\n        \"-0.0000000548\",\n        \"-0.0000000548\",\n        \"-0.0000000548\",\n        \"-5.4825827878e-08\",\n        \"-5.4825827878e-08\",\n        \"-5.4825827878e-08\",\n        \"-5.48258278776e-08\",\n        \"-5.48258278776e-08\",\n        \"-5.48258278776e-08\",\n        \"-0.00000005483\",\n        \"-0.00000005483\",\n        \"-0.00000005483\",\n        \"-5.48258278776e-08\",\n        \"-5.48258278776e-08\",\n        \"-5.48258278776e-08\",\n        \"-5.482582787764e-08\",\n        \"-5.482582787764e-08\",\n        \"-5.482582787764e-08\",\n        \"-0.000000054826\",\n        \"-0.000000054826\",\n        \"-0.000000054826\",\n        \"-5.482582787764e-08\",\n        \"-5.482582787764e-08\",\n        \"-5.482582787764e-08\",\n        \"-5.4825827877636e-08\",\n        \"-5.4825827877636e-08\",\n        \"-5.4825827877636e-08\",\n        \"-0.0000000548258\",\n        \"-0.0000000548258\",\n        \"-0.0000000548258\",\n    }},\n    {{\n        \"7e-09\",\n        \"7.e-09\",\n        \"+7e-09\",\n        \"6.9e-09\",\n        \"+6.9e-09\",\n        \"6.9e-09\",\n        \"0.0\",\n        \"0.0\",\n        \"+0.0\",\n        \"6.9e-09\",\n        \"6.9e-09\",\n        \"+6.9e-09\",\n        \"6.85e-09\",\n        \"+6.85e-09\",\n        \"6.85e-09\",\n        \"0.00\",\n        \"0.00\",\n        \"+0.00\",\n        \"6.85e-09\",\n        \"6.85e-09\",\n        \"+6.85e-09\",\n        \"6.853e-09\",\n        \"+6.853e-09\",\n        \"6.853e-09\",\n        \"0.000\",\n        \"0.000\",\n        \"+0.000\",\n        \"6.853e-09\",\n        \"6.853e-09\",\n        \"+6.853e-09\",\n        \"6.8532e-09\",\n        \"+6.8532e-09\",\n        \"6.8532e-09\",\n        \"0.0000\",\n        \"0.0000\",\n        \"+0.0000\",\n        \"6.8532e-09\",\n        \"6.8532e-09\",\n        \"+6.8532e-09\",\n        \"6.85323e-09\",\n        \"+6.85323e-09\",\n        \"6.85323e-09\",\n        \"0.00000\",\n        \"0.00000\",\n        \"+0.00000\",\n        \"6.85323e-09\",\n        \"6.85323e-09\",\n        \"+6.85323e-09\",\n        \"6.853228e-09\",\n        \"+6.853228e-09\",\n        \"6.853228e-09\",\n        \"0.000000\",\n        \"0.000000\",\n        \"+0.000000\",\n        \"6.853228e-09\",\n        \"6.853228e-09\",\n        \"+6.853228e-09\",\n        \"6.8532285e-09\",\n        \"+6.8532285e-09\",\n        \"6.8532285e-09\",\n        \"0.0000000\",\n        \"0.0000000\",\n        \"+0.0000000\",\n        \"6.8532285e-09\",\n        \"6.8532285e-09\",\n        \"+6.8532285e-09\",\n        \"6.85322848e-09\",\n        \"+6.85322848e-09\",\n        \"6.85322848e-09\",\n        \"0.00000001\",\n        \"0.00000001\",\n        \"+0.00000001\",\n        \"6.85322848e-09\",\n        \"6.85322848e-09\",\n        \"+6.85322848e-09\",\n        \"6.853228485e-09\",\n        \"+6.853228485e-09\",\n        \"6.853228485e-09\",\n        \"0.000000007\",\n        \"0.000000007\",\n        \"+0.000000007\",\n        \"6.853228485e-09\",\n        \"6.853228485e-09\",\n        \"+6.853228485e-09\",\n        \"6.8532284847e-09\",\n        \"+6.8532284847e-09\",\n        \"6.8532284847e-09\",\n        \"0.0000000069\",\n        \"0.0000000069\",\n        \"+0.0000000069\",\n        \"6.8532284847e-09\",\n        \"6.8532284847e-09\",\n        \"+6.8532284847e-09\",\n        \"6.85322848470e-09\",\n        \"+6.85322848470e-09\",\n        \"6.85322848470e-09\",\n        \"0.00000000685\",\n        \"0.00000000685\",\n        \"+0.00000000685\",\n        \"6.8532284847e-09\",\n        \"6.85322848470e-09\",\n        \"+6.8532284847e-09\",\n        \"6.853228484704e-09\",\n        \"+6.853228484704e-09\",\n        \"6.853228484704e-09\",\n        \"0.000000006853\",\n        \"0.000000006853\",\n        \"+0.000000006853\",\n        \"6.853228484704e-09\",\n        \"6.853228484704e-09\",\n        \"+6.853228484704e-09\",\n        \"6.8532284847045e-09\",\n        \"+6.8532284847045e-09\",\n        \"6.8532284847045e-09\",\n        \"0.0000000068532\",\n        \"0.0000000068532\",\n        \"+0.0000000068532\",\n    }},\n    {{\n        \"-7e-09\",\n        \"-7.e-09\",\n        \"-7e-09\",\n        \"-6.9e-09\",\n        \"-6.9e-09\",\n        \"-6.9e-09\",\n        \"-0.0\",\n        \"-0.0\",\n        \"-0.0\",\n        \"-6.9e-09\",\n        \"-6.9e-09\",\n        \"-6.9e-09\",\n        \"-6.85e-09\",\n        \"-6.85e-09\",\n        \"-6.85e-09\",\n        \"-0.00\",\n        \"-0.00\",\n        \"-0.00\",\n        \"-6.85e-09\",\n        \"-6.85e-09\",\n        \"-6.85e-09\",\n        \"-6.853e-09\",\n        \"-6.853e-09\",\n        \"-6.853e-09\",\n        \"-0.000\",\n        \"-0.000\",\n        \"-0.000\",\n        \"-6.853e-09\",\n        \"-6.853e-09\",\n        \"-6.853e-09\",\n        \"-6.8532e-09\",\n        \"-6.8532e-09\",\n        \"-6.8532e-09\",\n        \"-0.0000\",\n        \"-0.0000\",\n        \"-0.0000\",\n        \"-6.8532e-09\",\n        \"-6.8532e-09\",\n        \"-6.8532e-09\",\n        \"-6.85323e-09\",\n        \"-6.85323e-09\",\n        \"-6.85323e-09\",\n        \"-0.00000\",\n        \"-0.00000\",\n        \"-0.00000\",\n        \"-6.85323e-09\",\n        \"-6.85323e-09\",\n        \"-6.85323e-09\",\n        \"-6.853228e-09\",\n        \"-6.853228e-09\",\n        \"-6.853228e-09\",\n        \"-0.000000\",\n        \"-0.000000\",\n        \"-0.000000\",\n        \"-6.853228e-09\",\n        \"-6.853228e-09\",\n        \"-6.853228e-09\",\n        \"-6.8532285e-09\",\n        \"-6.8532285e-09\",\n        \"-6.8532285e-09\",\n        \"-0.0000000\",\n        \"-0.0000000\",\n        \"-0.0000000\",\n        \"-6.8532285e-09\",\n        \"-6.8532285e-09\",\n        \"-6.8532285e-09\",\n        \"-6.85322848e-09\",\n        \"-6.85322848e-09\",\n        \"-6.85322848e-09\",\n        \"-0.00000001\",\n        \"-0.00000001\",\n        \"-0.00000001\",\n        \"-6.85322848e-09\",\n        \"-6.85322848e-09\",\n        \"-6.85322848e-09\",\n        \"-6.853228485e-09\",\n        \"-6.853228485e-09\",\n        \"-6.853228485e-09\",\n        \"-0.000000007\",\n        \"-0.000000007\",\n        \"-0.000000007\",\n        \"-6.853228485e-09\",\n        \"-6.853228485e-09\",\n        \"-6.853228485e-09\",\n        \"-6.8532284847e-09\",\n        \"-6.8532284847e-09\",\n        \"-6.8532284847e-09\",\n        \"-0.0000000069\",\n        \"-0.0000000069\",\n        \"-0.0000000069\",\n        \"-6.8532284847e-09\",\n        \"-6.8532284847e-09\",\n        \"-6.8532284847e-09\",\n        \"-6.85322848470e-09\",\n        \"-6.85322848470e-09\",\n        \"-6.85322848470e-09\",\n        \"-0.00000000685\",\n        \"-0.00000000685\",\n        \"-0.00000000685\",\n        \"-6.8532284847e-09\",\n        \"-6.85322848470e-09\",\n        \"-6.8532284847e-09\",\n        \"-6.853228484704e-09\",\n        \"-6.853228484704e-09\",\n        \"-6.853228484704e-09\",\n        \"-0.000000006853\",\n        \"-0.000000006853\",\n        \"-0.000000006853\",\n        \"-6.853228484704e-09\",\n        \"-6.853228484704e-09\",\n        \"-6.853228484704e-09\",\n        \"-6.8532284847045e-09\",\n        \"-6.8532284847045e-09\",\n        \"-6.8532284847045e-09\",\n        \"-0.0000000068532\",\n        \"-0.0000000068532\",\n        \"-0.0000000068532\",\n    }},\n    {{\n        \"9e-10\",\n        \"9.e-10\",\n        \"+9e-10\",\n        \"8.6e-10\",\n        \"+8.6e-10\",\n        \"8.6e-10\",\n        \"0.0\",\n        \"0.0\",\n        \"+0.0\",\n        \"8.6e-10\",\n        \"8.6e-10\",\n        \"+8.6e-10\",\n        \"8.57e-10\",\n        \"+8.57e-10\",\n        \"8.57e-10\",\n        \"0.00\",\n        \"0.00\",\n        \"+0.00\",\n        \"8.57e-10\",\n        \"8.57e-10\",\n        \"+8.57e-10\",\n        \"8.567e-10\",\n        \"+8.567e-10\",\n        \"8.567e-10\",\n        \"0.000\",\n        \"0.000\",\n        \"+0.000\",\n        \"8.567e-10\",\n        \"8.567e-10\",\n        \"+8.567e-10\",\n        \"8.5665e-10\",\n        \"+8.5665e-10\",\n        \"8.5665e-10\",\n        \"0.0000\",\n        \"0.0000\",\n        \"+0.0000\",\n        \"8.5665e-10\",\n        \"8.5665e-10\",\n        \"+8.5665e-10\",\n        \"8.56654e-10\",\n        \"+8.56654e-10\",\n        \"8.56654e-10\",\n        \"0.00000\",\n        \"0.00000\",\n        \"+0.00000\",\n        \"8.56654e-10\",\n        \"8.56654e-10\",\n        \"+8.56654e-10\",\n        \"8.566536e-10\",\n        \"+8.566536e-10\",\n        \"8.566536e-10\",\n        \"0.000000\",\n        \"0.000000\",\n        \"+0.000000\",\n        \"8.566536e-10\",\n        \"8.566536e-10\",\n        \"+8.566536e-10\",\n        \"8.5665356e-10\",\n        \"+8.5665356e-10\",\n        \"8.5665356e-10\",\n        \"0.0000000\",\n        \"0.0000000\",\n        \"+0.0000000\",\n        \"8.5665356e-10\",\n        \"8.5665356e-10\",\n        \"+8.5665356e-10\",\n        \"8.56653561e-10\",\n        \"+8.56653561e-10\",\n        \"8.56653561e-10\",\n        \"0.00000000\",\n        \"0.00000000\",\n        \"+0.00000000\",\n        \"8.56653561e-10\",\n        \"8.56653561e-10\",\n        \"+8.56653561e-10\",\n        \"8.566535606e-10\",\n        \"+8.566535606e-10\",\n        \"8.566535606e-10\",\n        \"0.000000001\",\n        \"0.000000001\",\n        \"+0.000000001\",\n        \"8.566535606e-10\",\n        \"8.566535606e-10\",\n        \"+8.566535606e-10\",\n        \"8.5665356059e-10\",\n        \"+8.5665356059e-10\",\n        \"8.5665356059e-10\",\n        \"0.0000000009\",\n        \"0.0000000009\",\n        \"+0.0000000009\",\n        \"8.5665356059e-10\",\n        \"8.5665356059e-10\",\n        \"+8.5665356059e-10\",\n        \"8.56653560588e-10\",\n        \"+8.56653560588e-10\",\n        \"8.56653560588e-10\",\n        \"0.00000000086\",\n        \"0.00000000086\",\n        \"+0.00000000086\",\n        \"8.56653560588e-10\",\n        \"8.56653560588e-10\",\n        \"+8.56653560588e-10\",\n        \"8.566535605881e-10\",\n        \"+8.566535605881e-10\",\n        \"8.566535605881e-10\",\n        \"0.000000000857\",\n        \"0.000000000857\",\n        \"+0.000000000857\",\n        \"8.566535605881e-10\",\n        \"8.566535605881e-10\",\n        \"+8.566535605881e-10\",\n        \"8.5665356058806e-10\",\n        \"+8.5665356058806e-10\",\n        \"8.5665356058806e-10\",\n        \"0.0000000008567\",\n        \"0.0000000008567\",\n        \"+0.0000000008567\",\n    }},\n    {{\n        \"-9e-10\",\n        \"-9.e-10\",\n        \"-9e-10\",\n        \"-8.6e-10\",\n        \"-8.6e-10\",\n        \"-8.6e-10\",\n        \"-0.0\",\n        \"-0.0\",\n        \"-0.0\",\n        \"-8.6e-10\",\n        \"-8.6e-10\",\n        \"-8.6e-10\",\n        \"-8.57e-10\",\n        \"-8.57e-10\",\n        \"-8.57e-10\",\n        \"-0.00\",\n        \"-0.00\",\n        \"-0.00\",\n        \"-8.57e-10\",\n        \"-8.57e-10\",\n        \"-8.57e-10\",\n        \"-8.567e-10\",\n        \"-8.567e-10\",\n        \"-8.567e-10\",\n        \"-0.000\",\n        \"-0.000\",\n        \"-0.000\",\n        \"-8.567e-10\",\n        \"-8.567e-10\",\n        \"-8.567e-10\",\n        \"-8.5665e-10\",\n        \"-8.5665e-10\",\n        \"-8.5665e-10\",\n        \"-0.0000\",\n        \"-0.0000\",\n        \"-0.0000\",\n        \"-8.5665e-10\",\n        \"-8.5665e-10\",\n        \"-8.5665e-10\",\n        \"-8.56654e-10\",\n        \"-8.56654e-10\",\n        \"-8.56654e-10\",\n        \"-0.00000\",\n        \"-0.00000\",\n        \"-0.00000\",\n        \"-8.56654e-10\",\n        \"-8.56654e-10\",\n        \"-8.56654e-10\",\n        \"-8.566536e-10\",\n        \"-8.566536e-10\",\n        \"-8.566536e-10\",\n        \"-0.000000\",\n        \"-0.000000\",\n        \"-0.000000\",\n        \"-8.566536e-10\",\n        \"-8.566536e-10\",\n        \"-8.566536e-10\",\n        \"-8.5665356e-10\",\n        \"-8.5665356e-10\",\n        \"-8.5665356e-10\",\n        \"-0.0000000\",\n        \"-0.0000000\",\n        \"-0.0000000\",\n        \"-8.5665356e-10\",\n        \"-8.5665356e-10\",\n        \"-8.5665356e-10\",\n        \"-8.56653561e-10\",\n        \"-8.56653561e-10\",\n        \"-8.56653561e-10\",\n        \"-0.00000000\",\n        \"-0.00000000\",\n        \"-0.00000000\",\n        \"-8.56653561e-10\",\n        \"-8.56653561e-10\",\n        \"-8.56653561e-10\",\n        \"-8.566535606e-10\",\n        \"-8.566535606e-10\",\n        \"-8.566535606e-10\",\n        \"-0.000000001\",\n        \"-0.000000001\",\n        \"-0.000000001\",\n        \"-8.566535606e-10\",\n        \"-8.566535606e-10\",\n        \"-8.566535606e-10\",\n        \"-8.5665356059e-10\",\n        \"-8.5665356059e-10\",\n        \"-8.5665356059e-10\",\n        \"-0.0000000009\",\n        \"-0.0000000009\",\n        \"-0.0000000009\",\n        \"-8.5665356059e-10\",\n        \"-8.5665356059e-10\",\n        \"-8.5665356059e-10\",\n        \"-8.56653560588e-10\",\n        \"-8.56653560588e-10\",\n        \"-8.56653560588e-10\",\n        \"-0.00000000086\",\n        \"-0.00000000086\",\n        \"-0.00000000086\",\n        \"-8.56653560588e-10\",\n        \"-8.56653560588e-10\",\n        \"-8.56653560588e-10\",\n        \"-8.566535605881e-10\",\n        \"-8.566535605881e-10\",\n        \"-8.566535605881e-10\",\n        \"-0.000000000857\",\n        \"-0.000000000857\",\n        \"-0.000000000857\",\n        \"-8.566535605881e-10\",\n        \"-8.566535605881e-10\",\n        \"-8.566535605881e-10\",\n        \"-8.5665356058806e-10\",\n        \"-8.5665356058806e-10\",\n        \"-8.5665356058806e-10\",\n        \"-0.0000000008567\",\n        \"-0.0000000008567\",\n        \"-0.0000000008567\",\n    }},\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n\n#ifndef BOOST_MULTIPRECISION_TEST_HPP\n#define BOOST_MULTIPRECISION_TEST_HPP\n\n#include <limits>\n#include <cmath>\n#include <typeinfo>\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/current_function.hpp>\n#include <boost/multiprecision/number.hpp>\n#include <boost/multiprecision/detail/standalone_config.hpp>\n\nnamespace detail {\n\ntemplate <class T>\ninline typename std::enable_if<!(boost::multiprecision::detail::is_unsigned<T>::value || boost::multiprecision::is_unsigned_number<T>::value), T>::type\nabs(const T& a)\n{\n   return a < 0 ? -a : a;\n}\n\ntemplate <class T>\ninline typename std::enable_if<boost::multiprecision::detail::is_unsigned<T>::value || boost::multiprecision::is_unsigned_number<T>::value, T>::type\nabs(const T& a)\n{\n   return a;\n}\n\n} // namespace detail\n\ntemplate <class T>\ntypename std::enable_if<boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_integer, T>::type relative_error(T a, T b)\n{\n   return a > b ? a - b : b - a;\n}\n\ntemplate <class T>\ntypename std::enable_if<!((boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_integer) || boost::multiprecision::is_interval_number<T>::value), T>::type relative_error(T a, T b)\n{\n   using ::detail::abs;\n   using std::abs;\n\n   T min_val = (std::numeric_limits<T>::min)();\n   T max_val = (std::numeric_limits<T>::max)();\n\n   if ((a != 0) && (b != 0))\n   {\n      if (a == b)\n         return 0;\n\n      // TODO: use isfinite:\n      if (abs(b) >= max_val)\n      {\n         if (abs(a) >= max_val)\n            return 0; // one infinity is as good as another!\n      }\n      // If the result is denormalised, treat all denorms as equivalent:\n      if ((a < min_val) && (a > 0))\n         a = min_val;\n      else if ((a > -min_val) && (a < 0))\n         a = -min_val;\n      if ((b < min_val) && (b > 0))\n         b = min_val;\n      else if ((b > -min_val) && (b < 0))\n         b = -min_val;\n\n      return (std::max)(abs(T((a - b) / a)), abs(T((a - b) / b))) / std::numeric_limits<T>::epsilon();\n   }\n\n   // Handle special case where one or both are zero:\n   if (min_val == 0)\n      return abs(T(a - b));\n   if (abs(a) < min_val)\n      a = min_val;\n   if (abs(b) < min_val)\n      b = min_val;\n\n   return (std::max)(abs(T((a - b) / a)), abs(T((a - b) / b))) / std::numeric_limits<T>::epsilon();\n}\n\ntemplate <class T>\ntypename std::enable_if<boost::multiprecision::is_interval_number<T>::value, T>::type relative_error(T a, T b)\n{\n   typename boost::multiprecision::component_type<T>::type am = median(a);\n   typename boost::multiprecision::component_type<T>::type bm = median(b);\n   return relative_error<typename boost::multiprecision::component_type<T>::type>(am, bm);\n}\n\ntemplate <class T, class U>\ntypename std::conditional<std::is_convertible<T, U>::value, U, T>::type\nrelative_error(T a, U b)\n{\n   typedef typename std::conditional<std::is_convertible<T, U>::value, U, T>::type cast_type;\n   return relative_error<cast_type>(static_cast<cast_type>(a), static_cast<cast_type>(b));\n}\n\nenum\n{\n   warn_on_fail,\n   error_on_fail,\n   abort_on_fail\n};\n\ntemplate <class T>\ninline T epsilon_of(const T&)\n{\n   static_assert(std::numeric_limits<T>::is_specialized, \"No numeric_limits support\");\n   return std::numeric_limits<T>::is_integer ? static_cast<T>(1) : std::numeric_limits<T>::epsilon();\n}\n\ntemplate <class T>\ninline int digits_of(const T&)\n{\n   return std::numeric_limits<T>::is_specialized ? std::numeric_limits<T>::digits10 + 3 : std::numeric_limits<long double>::digits10 + 3;\n}\n\ninline std::ostream& report_where(const char* file, int line, const char* function)\n{\n   if (function)\n      BOOST_LIGHTWEIGHT_TEST_OSTREAM << \"In function: \" << function << std::endl;\n   BOOST_LIGHTWEIGHT_TEST_OSTREAM << file << \":\" << line;\n   return BOOST_LIGHTWEIGHT_TEST_OSTREAM;\n}\n\n#define BOOST_MP_REPORT_WHERE report_where(__FILE__, __LINE__, BOOST_CURRENT_FUNCTION)\n\ninline void report_severity(int severity)\n{\n   if (severity == error_on_fail)\n      ++boost::detail::test_errors();\n   else if (severity == abort_on_fail)\n   {\n      ++boost::detail::test_errors();\n      abort();\n   }\n}\n\n#define BOOST_MP_REPORT_SEVERITY(severity) report_severity(severity)\n\ntemplate <class E>\nvoid report_unexpected_exception(const E& e, int severity, const char* file, int line, const char* function)\n{\n   report_where(file, line, function) << \" Unexpected exception of type \" << typeid(e).name() << std::endl;\n   BOOST_LIGHTWEIGHT_TEST_OSTREAM << \"Errot message was: \" << e.what() << std::endl;\n   BOOST_MP_REPORT_SEVERITY(severity);\n}\n\n#ifdef BOOST_HAS_INT128\n\nstd::ostream& operator<<(std::ostream& os, boost::int128_type val)\n{\n   std::stringstream ss;\n   ss << std::hex << \"0x\" << static_cast<std::uint64_t>(static_cast<boost::uint128_type>(val) >> 64) << static_cast<std::uint64_t>(val);\n   return os << ss.str();\n}\n\nstd::ostream& operator<<(std::ostream& os, boost::uint128_type val)\n{\n   std::stringstream ss;\n   ss << std::hex << \"0x\" << static_cast<std::uint64_t>(val >> 64) << static_cast<std::uint64_t>(val);\n   return os << ss.str();\n}\n\n#endif\n#if defined(BOOST_HAS_FLOAT128) && !defined(BOOST_MP_HAVE_CSTDFLOAT)\nstd::ostream& operator<<(std::ostream& os, __float128 f)\n{\n   return os << static_cast<long double>(f);\n}\n#endif\n\n#ifndef BOOST_NO_EXCEPTIONS\n#define BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity)                                       \\\n   catch (const std::exception& e)                                                          \\\n   {                                                                                        \\\n      report_unexpected_exception(e, severity, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION); \\\n   }                                                                                        \\\n   catch (...)                                                                              \\\n   {                                                                                        \\\n      std::cout << \"Exception of unknown type was thrown\" << std::endl;                     \\\n      report_severity(severity);                                                            \\\n   }\n#define BOOST_MP_TEST_TRY try\n#else\n#define BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity)\n#define BOOST_MP_TEST_TRY\n#endif\n\n#define BOOST_CHECK_IMP(x, severity)                                                        \\\n   BOOST_MP_TEST_TRY                                                                             \\\n   {                                                                                        \\\n      if (x)                                                                                \\\n      {                                                                                     \\\n      }                                                                                     \\\n      else                                                                                  \\\n      {                                                                                     \\\n         BOOST_MP_REPORT_WHERE << \" Failed predicate: \" << BOOST_STRINGIZE(x) << std::endl; \\\n         BOOST_MP_REPORT_SEVERITY(severity);                                                \\\n      }                                                                                     \\\n   }                                                                                        \\\n   BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity)\n\n#define BOOST_CHECK(x) BOOST_CHECK_IMP(x, error_on_fail)\n#define BOOST_WARN(x) BOOST_CHECK_IMP(x, warn_on_fail)\n#define BOOST_REQUIRE(x) BOOST_CHECK_IMP(x, abort_on_fail)\n\n#define BOOST_CLOSE_IMP(x, y, tol, severity)                                                \\\n   BOOST_MP_TEST_TRY                                                                             \\\n   {                                                                                        \\\n      if (relative_error(x, y) > tol)                                                       \\\n      {                                                                                     \\\n         BOOST_MP_REPORT_WHERE << \" Failed check for closeness: \\n\"                         \\\n                               << std::setprecision(digits_of(x)) << std::scientific        \\\n                               << \"Value of LHS was: \" << x << \"\\n\"                         \\\n                               << \"Value of RHS was: \" << y << \"\\n\"                         \\\n                               << std::setprecision(5) << std::fixed                        \\\n                               << \"Relative error was: \" << relative_error(x, y) << \"eps\\n\" \\\n                               << \"Tolerance was: \" << tol << \"eps\" << std::endl;           \\\n         BOOST_MP_REPORT_SEVERITY(severity);                                                \\\n      }                                                                                     \\\n   }                                                                                        \\\n   BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity)\n\n#define BOOST_EQUAL_IMP(x, y, severity)                                              \\\n   BOOST_MP_TEST_TRY                                                                      \\\n   {                                                                                 \\\n      if (!((x) == (y)))                                                             \\\n      {                                                                              \\\n         BOOST_MP_REPORT_WHERE << \" Failed check for equality: \\n\"                   \\\n                               << std::setprecision(digits_of(x)) << std::scientific \\\n                               << \"Value of LHS was: \" << (x) << \"\\n\"                \\\n                               << \"Value of RHS was: \" << (y) << \"\\n\"                \\\n                               << std::setprecision(3) << std::endl;                 \\\n         BOOST_MP_REPORT_SEVERITY(severity);                                         \\\n      }                                                                              \\\n   }                                                                                 \\\n   BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity)\n\n#define BOOST_NE_IMP(x, y, severity)                                                 \\\n   BOOST_MP_TEST_TRY                                                                      \\\n   {                                                                                 \\\n      if (!(x != y))                                                                 \\\n      {                                                                              \\\n         BOOST_MP_REPORT_WHERE << \" Failed check for non-equality: \\n\"               \\\n                               << std::setprecision(digits_of(x)) << std::scientific \\\n                               << \"Value of LHS was: \" << x << \"\\n\"                  \\\n                               << \"Value of RHS was: \" << y << \"\\n\"                  \\\n                               << std::setprecision(3) << std::endl;                 \\\n         BOOST_MP_REPORT_SEVERITY(severity);                                         \\\n      }                                                                              \\\n   }                                                                                 \\\n   BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity)\n\n#define BOOST_LT_IMP(x, y, severity)                                                 \\\n   BOOST_MP_TEST_TRY                                                                      \\\n   {                                                                                 \\\n      if (!(x < y))                                                                  \\\n      {                                                                              \\\n         BOOST_MP_REPORT_WHERE << \" Failed check for less than: \\n\"                  \\\n                               << std::setprecision(digits_of(x)) << std::scientific \\\n                               << \"Value of LHS was: \" << x << \"\\n\"                  \\\n                               << \"Value of RHS was: \" << y << \"\\n\"                  \\\n                               << std::setprecision(3) << std::endl;                 \\\n         BOOST_MP_REPORT_SEVERITY(severity);                                         \\\n      }                                                                              \\\n   }                                                                                 \\\n   BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity)\n\n#define BOOST_GT_IMP(x, y, severity)                                                 \\\n   BOOST_MP_TEST_TRY                                                                      \\\n   {                                                                                 \\\n      if (!(x > y))                                                                  \\\n      {                                                                              \\\n         BOOST_MP_REPORT_WHERE << \" Failed check for greater than: \\n\"               \\\n                               << std::setprecision(digits_of(x)) << std::scientific \\\n                               << \"Value of LHS was: \" << x << \"\\n\"                  \\\n                               << \"Value of RHS was: \" << y << \"\\n\"                  \\\n                               << std::setprecision(3) << std::endl;                 \\\n         BOOST_MP_REPORT_SEVERITY(severity);                                         \\\n      }                                                                              \\\n   }                                                                                 \\\n   BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity)\n\n#define BOOST_LE_IMP(x, y, severity)                                                 \\\n   BOOST_MP_TEST_TRY                                                                      \\\n   {                                                                                 \\\n      if (!(x <= y))                                                                 \\\n      {                                                                              \\\n         BOOST_MP_REPORT_WHERE << \" Failed check for less-than-equal-to: \\n\"         \\\n                               << std::setprecision(digits_of(x)) << std::scientific \\\n                               << \"Value of LHS was: \" << x << \"\\n\"                  \\\n                               << \"Value of RHS was: \" << y << \"\\n\"                  \\\n                               << std::setprecision(3) << std::endl;                 \\\n         BOOST_MP_REPORT_SEVERITY(severity);                                         \\\n      }                                                                              \\\n   }                                                                                 \\\n   BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity)\n\n#define BOOST_GE_IMP(x, y, severity)                                                 \\\n   BOOST_MP_TEST_TRY                                                                      \\\n   {                                                                                 \\\n      if (!(x >= y))                                                                 \\\n      {                                                                              \\\n         BOOST_MP_REPORT_WHERE << \" Failed check for greater-than-equal-to \\n\"       \\\n                               << std::setprecision(digits_of(x)) << std::scientific \\\n                               << \"Value of LHS was: \" << x << \"\\n\"                  \\\n                               << \"Value of RHS was: \" << y << \"\\n\"                  \\\n                               << std::setprecision(3) << std::endl;                 \\\n         BOOST_MP_REPORT_SEVERITY(severity);                                         \\\n      }                                                                              \\\n   }                                                                                 \\\n   BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity)\n\n#ifndef BOOST_NO_EXCEPTIONS\n#define BOOST_MT_CHECK_THROW_IMP(x, E, severity)                                                                   \\\n   BOOST_MP_TEST_TRY                                                                                                    \\\n   {                                                                                                               \\\n      x;                                                                                                           \\\n      BOOST_MP_REPORT_WHERE << \" Expected exception not thrown in expression \" << BOOST_STRINGIZE(x) << std::endl; \\\n      BOOST_MP_REPORT_SEVERITY(severity);                                                                          \\\n   }                                                                                                               \\\n   catch (const E&) {}                                                                                             \\\n   BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity)\n#else\n#define BOOST_MT_CHECK_THROW_IMP(x, E, severity)\n#endif\n\n#define BOOST_CHECK_CLOSE(x, y, tol) BOOST_CLOSE_IMP(x, y, ((tol / (100 * epsilon_of(x)))), error_on_fail)\n#define BOOST_WARN_CLOSE(x, y, tol) BOOST_CLOSE_IMP(x, y, (tol / (100 * epsilon_of(x))), warn_on_fail)\n#define BOOST_REQUIRE_CLOSE(x, y, tol) BOOST_CLOSE_IMP(x, y, (tol / (100 * epsilon_of(x))), abort_on_fail)\n\n#define BOOST_CHECK_CLOSE_FRACTION(x, y, tol) BOOST_CLOSE_IMP(x, y, ((tol / (epsilon_of(x)))), error_on_fail)\n#define BOOST_WARN_CLOSE_FRACTION(x, y, tol) BOOST_CLOSE_IMP(x, y, (tol / (epsilon_of(x))), warn_on_fail)\n#define BOOST_REQUIRE_CLOSE_FRACTION(x, y, tol) BOOST_CLOSE_IMP(x, y, (tol / (epsilon_of(x))), abort_on_fail)\n\n#define BOOST_CHECK_EQUAL(x, y) BOOST_EQUAL_IMP(x, y, error_on_fail)\n#define BOOST_WARN_EQUAL(x, y) BOOST_EQUAL_IMP(x, y, warn_on_fail)\n#define BOOST_REQUIRE_EQUAL(x, y) BOOST_EQUAL_IMP(x, y, abort_on_fail)\n\n#define BOOST_CHECK_NE(x, y) BOOST_NE_IMP(x, y, error_on_fail)\n#define BOOST_WARN_NE(x, y) BOOST_NE_IMP(x, y, warn_on_fail)\n#define BOOST_REQUIRE_NE(x, y) BOOST_NE_IMP(x, y, abort_on_fail)\n\n#define BOOST_CHECK_LT(x, y) BOOST_LT_IMP(x, y, error_on_fail)\n#define BOOST_WARN_LT(x, y) BOOST_LT_IMP(x, y, warn_on_fail)\n#define BOOST_REQUIRE_LT(x, y) BOOST_LT_IMP(x, y, abort_on_fail)\n\n#define BOOST_CHECK_GT(x, y) BOOST_GT_IMP(x, y, error_on_fail)\n#define BOOST_WARN_GT(x, y) BOOST_GT_IMP(x, y, warn_on_fail)\n#define BOOST_REQUIRE_GT(x, y) BOOST_GT_IMP(x, y, abort_on_fail)\n\n#define BOOST_CHECK_LE(x, y) BOOST_LE_IMP(x, y, error_on_fail)\n#define BOOST_WARN_LE(x, y) BOOST_LE_IMP(x, y, warn_on_fail)\n#define BOOST_REQUIRE_LE(x, y) BOOST_LE_IMP(x, y, abort_on_fail)\n\n#define BOOST_CHECK_GE(x, y) BOOST_GE_IMP(x, y, error_on_fail)\n#define BOOST_WARN_GE(x, y) BOOST_GE_IMP(x, y, warn_on_fail)\n#define BOOST_REQUIRE_GE(x, y) BOOST_GE_IMP(x, y, abort_on_fail)\n\n#define BOOST_CHECK_THROW(x, E) BOOST_MT_CHECK_THROW_IMP(x, E, error_on_fail)\n#define BOOST_WARN_THROW(x, E) BOOST_MT_CHECK_THROW_IMP(x, E, warn_on_fail)\n#define BOOST_REQUIRE_THROW(x, E) BOOST_MT_CHECK_THROW_IMP(x, E, abort_on_fail)\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_acos.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n//#  define TEST_MPF\n#define TEST_BACKEND\n#define TEST_CPP_DEC_FLOAT\n#define TEST_MPFI_50\n#define TEST_FLOAT128\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(TEST_MPFR_50)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_MPFI_50)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n\ntemplate <class T>\nvoid test()\n{\n   std::cout << \"Testing type: \" << typeid(T).name() << std::endl;\n   //\n   // Test with some exact binary values as input - this tests our code\n   // rather than the test data:\n   //\n   static const boost::array<boost::array<T, 2>, 13> exact_data =\n       {{\n           {{0.5, static_cast<T>(\"1.04719755119659774615421446109316762806572313312503527365831486410260546876206966620934494178070568932738269550442743555\")}},\n           {{0.25, static_cast<T>(\"1.31811607165281796574566425464604046984639096659071471685354851741333314266208327690226867044304393238598144034722708676\")}},\n           {{0.75, static_cast<T>(\"0.722734247813415611178377352641333362025218486424440267626754132583707381914630264964827610939101303690078815991333621490\")}},\n           {{1 - std::ldexp(1.0, -20), static_cast<T>(\"0.00138106804176241718210883847756746694048570648553426714212025111150044290934710742282266738617709904634187850607042604204\")}},\n           {{std::ldexp(1.0, -20), static_cast<T>(\"1.57079537312058021283676140197495835299636605165647561806789944133748780804448843729970624018104090863783682329820313127\")}},\n           {{1, static_cast<T>(\"0\")}},\n\n           {{0, static_cast<T>(\"1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332\")}},\n\n           {{-0.5, static_cast<T>(\"2.09439510239319549230842892218633525613144626625007054731662972820521093752413933241868988356141137865476539100885487110\")}},\n           {{-0.25, static_cast<T>(\"1.82347658193697527271697912863346241435077843278439110412139607489448326362412572172576615489907313559616664616605521989\")}},\n           {{-0.75, static_cast<T>(\"2.41885840577637762728426603063816952217195091295066555334819045972410902437157873366320721440301576429206927052194868516\")}},\n           {{-1 + std::ldexp(1.0, -20), static_cast<T>(\"3.14021158554803082128053454480193541725668369288957155383282434119631596337686189120521215795593996893580620800721188061\")}},\n           {{-std::ldexp(1.0, -20), static_cast<T>(\"1.57079728046921302562588198130454453120080334771863020290704515097032859824172056132832858516107615934431126321507917538\")}},\n           {{-1, static_cast<T>(\"3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230665\")}},\n       }};\n   unsigned max_err = 0;\n   for (unsigned k = 0; k < exact_data.size(); k++)\n   {\n      T        val = acos(exact_data[k][0]);\n      T        e   = relative_error(val, exact_data[k][1]);\n      unsigned err = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         max_err = err;\n      }\n   }\n   std::cout << \"Max error was: \" << max_err << std::endl;\n#ifdef TEST_CPP_BIN_FLOAT\n   BOOST_TEST(max_err < 320);\n#else\n   BOOST_TEST(max_err < 60);\n#endif\n   BOOST_TEST(asin(T(0)) == 0);\n}\n\nint main()\n{\n#ifdef TEST_BACKEND\n   test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();\n#endif\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::mpf_float_50>();\n   test<boost::multiprecision::mpf_float_100>();\n#endif\n#ifdef TEST_MPFR_50\n   test<boost::multiprecision::mpfr_float_50>();\n   test<boost::multiprecision::mpfr_float_100>();\n#endif\n#ifdef TEST_MPFI_50\n   test<boost::multiprecision::mpfi_float_50>();\n   test<boost::multiprecision::mpfi_float_100>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>();\n   test<boost::multiprecision::cpp_dec_float_100>();\n#ifndef SLOW_COMPLER\n   // Some \"peculiar\" digit counts which stress our code:\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();\n#endif\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_adapt_serial.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//\n// Compare arithmetic results using fixed_int to GMP results.\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/logged_adaptor.hpp>\n#include <boost/multiprecision/debug_adaptor.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include \"timer.hpp\"\n#include \"test.hpp\"\n\n#include <iostream>\n#include <iomanip>\n#include <sstream>\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/archive/binary_iarchive.hpp>\n#include <boost/archive/binary_oarchive.hpp>\n#include <boost/archive/xml_iarchive.hpp>\n#include <boost/archive/xml_oarchive.hpp>\n#include <boost/exception/all.hpp>\n\ntemplate <class T>\nT generate_random(unsigned bits_wanted)\n{\n   static boost::random::mt19937               gen;\n   typedef boost::random::mt19937::result_type random_type;\n\n   T        max_val;\n   unsigned digits;\n   if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits))\n   {\n      max_val = (std::numeric_limits<T>::max)();\n      digits  = std::numeric_limits<T>::digits;\n   }\n   else\n   {\n      max_val = T(1) << bits_wanted;\n      digits  = bits_wanted;\n   }\n\n   unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n   while ((random_type(1) << bits_per_r_val) > (gen.max)())\n      --bits_per_r_val;\n\n   unsigned terms_needed = digits / bits_per_r_val + 1;\n\n   T val = 0;\n   for (unsigned i = 0; i < terms_needed; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   val %= max_val;\n   return val;\n}\n\ntemplate <class T>\nvoid test_neg(const T& x, const std::integral_constant<bool, true>&)\n{\n   T val = -x;\n#ifndef BOOST_NO_EXCEPTIONS\n   try\n   {\n#endif\n      T val2;\n      {\n         std::stringstream             ss;\n         boost::archive::text_oarchive oa(ss);\n         oa << static_cast<const T&>(val);\n         boost::archive::text_iarchive ia(ss);\n         ia >> val2;\n         BOOST_CHECK_EQUAL(val, val2);\n      }\n      {\n         std::stringstream ss;\n         {\n            boost::archive::xml_oarchive oa(ss);\n            oa << boost::serialization::make_nvp(\"value\", static_cast<const T&>(val));\n         }\n         boost::archive::xml_iarchive ia(ss);\n         ia >> boost::serialization::make_nvp(\"value\", val2);\n         BOOST_CHECK_EQUAL(val, val2);\n      }\n      {\n         std::stringstream               ss;\n         boost::archive::binary_oarchive ob(ss);\n         ob << static_cast<const T&>(val);\n         boost::archive::binary_iarchive ib(ss);\n         ib >> val2;\n         BOOST_CHECK_EQUAL(val, val2);\n      }\n#ifndef BOOST_NO_EXCEPTIONS\n   }\n   catch (const boost::exception& e)\n   {\n      std::cout << \"Caught boost::exception with:\\n\";\n      std::cout << diagnostic_information(e);\n   }\n   catch (const std::exception& e)\n   {\n      std::cout << \"Caught std::exception with:\\n\";\n      std::cout << e.what() << std::endl;\n   }\n#endif\n}\ntemplate <class T>\nvoid test_neg(const T&, const std::integral_constant<bool, false>&) {}\n\ntemplate <class T>\nvoid test()\n{\n   using namespace boost::multiprecision;\n\n   boost::random::mt19937 gen;\n   boost::uniform_int<>   d(3, std::numeric_limits<T>::is_bounded ? std::numeric_limits<T>::digits : 3000);\n   timer                  tim;\n\n   while (true)\n   {\n      T val = generate_random<T>(d(gen));\n#ifndef BOOST_NO_EXCEPTIONS\n      try\n      {\n#endif\n         T val2;\n         {\n            std::stringstream             ss;\n            boost::archive::text_oarchive oa(ss);\n            oa << static_cast<const T&>(val);\n            boost::archive::text_iarchive ia(ss);\n            ia >> val2;\n            BOOST_CHECK_EQUAL(val, val2);\n         }\n         {\n            std::stringstream ss;\n            {\n               boost::archive::xml_oarchive oa(ss);\n               oa << boost::serialization::make_nvp(\"value\", static_cast<const T&>(val));\n            }\n            boost::archive::xml_iarchive ia(ss);\n            ia >> boost::serialization::make_nvp(\"value\", val2);\n            BOOST_CHECK_EQUAL(val, val2);\n         }\n         {\n            std::stringstream               ss;\n            boost::archive::binary_oarchive ob(ss);\n            ob << static_cast<const T&>(val);\n            boost::archive::binary_iarchive ib(ss);\n            ib >> val2;\n            BOOST_CHECK_EQUAL(val, val2);\n         }\n#ifndef BOOST_NO_EXCEPTIONS\n      }\n      catch (const boost::exception& e)\n      {\n         std::cout << \"Caught boost::exception with:\\n\";\n         std::cout << diagnostic_information(e);\n      }\n      catch (const std::exception& e)\n      {\n         std::cout << \"Caught std::exception with:\\n\";\n         std::cout << e.what() << std::endl;\n      }\n#endif\n      test_neg(val, std::integral_constant<bool, std::numeric_limits<T>::is_signed>());\n      //\n      // Check to see if test is taking too long.\n      // Tests run on the compiler farm time out after 300 seconds,\n      // so don't get too close to that:\n      //\n#ifndef CI_SUPPRESS_KNOWN_ISSUES\n      if (tim.elapsed() > 30)\n#else\n      if (tim.elapsed() > 10)\n#endif\n      {\n         std::cout << \"Timeout reached, aborting tests now....\\n\";\n         break;\n      }\n   }\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n   test<number<logged_adaptor<cpp_int_backend<> > > >();\n   test<number<debug_adaptor<cpp_int_backend<> > > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef TEST_VLD\n#include <vld.h>\n#endif\n\n#include <functional>\n#include <numeric>\n#include <type_traits>\n#include <typeinfo>\n#include <iostream>\n#include <iomanip>\n#include \"test.hpp\"\n#include <boost/multiprecision/detail/standalone_config.hpp>\n\n#ifndef BOOST_MP_STANDALONE\n#include <boost/integer/common_factor_rt.hpp>\n#include <boost/lexical_cast.hpp>\n#endif\n\n#ifdef BOOST_MP_MATH_AVAILABLE\n#include <boost/math/special_functions/pow.hpp>\n#endif\n\ntemplate <class T>\nstruct is_boost_rational : public std::integral_constant<bool, false>\n{};\ntemplate <class T>\nstruct is_checked_cpp_int : public std::integral_constant<bool, false>\n{};\n\n#ifdef BOOST_MSVC\n// warning C4127: conditional expression is constant\n#pragma warning(disable : 4127)\n#endif\n\n//\n// This works around some platforms which have missing typeinfo\n// for boost::int128_type and/or __float128:\n//\ntemplate <class T>\ninline const char* name_of()\n{\n   return typeid(T).name();\n}\n#ifdef BOOST_HAS_INT128\ntemplate <>\ninline const char* name_of<boost::int128_type>()\n{\n   return \"boost::int128_type\";\n}\ntemplate <>\ninline const char* name_of<boost::uint128_type>()\n{\n   return \"boost::uint128_type\";\n}\n#endif\n#ifdef BOOST_HAS_FLOAT128\ntemplate <>\ninline const char* name_of<__float128>()\n{\n   return \"__float128\";\n}\n#endif\n\n#ifndef BOOST_MP_STANDALONE\ntemplate <class Target, class Source>\nTarget checked_lexical_cast(const Source& val)\n{\n#ifndef BOOST_NO_EXCEPTIONS\n   try\n   {\n#endif\n      return boost::lexical_cast<Target>(val);\n#ifndef BOOST_NO_EXCEPTIONS\n   }\n   catch (...)\n   {\n      std::cerr << \"Error in lexical cast\\nSource type = \" << name_of<Source>() << \" \\\"\" << val << \"\\\"\\n\";\n      std::cerr << \"Target type = \" << name_of<Target>() << std::endl;\n      throw;\n   }\n#endif\n}\n#endif\n\nbool isfloat(float) { return true; }\nbool isfloat(double) { return true; }\nbool isfloat(long double) { return true; }\ntemplate <class T>\nbool isfloat(T) { return false; }\n\nnamespace detail {\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4>\ntypename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type\nabs(boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4> const& v)\n{\n   typedef typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type result_type;\n   return v < 0 ? result_type(-v) : result_type(v);\n}\n\n} // namespace detail\n\ntemplate <class T>\nstruct is_twos_complement_integer : public std::integral_constant<bool, true>\n{};\n\ntemplate <class T>\nstruct related_type\n{\n   typedef T type;\n};\n\ntemplate <class Real, class Val>\nvoid test_comparisons(Val, Val, const std::integral_constant<bool, false>&)\n{}\n\nint normalize_compare_result(int r)\n{\n   return r > 0 ? 1 : r < 0 ? -1 : 0;\n}\n\nenum unscoped_enum\n{\n   one = 1,\n   two = 2,\n   three = 3,\n};\n\nenum struct scoped_enum\n{\n   four = 4,\n   five = 5,\n   six = 6,\n};\n\ntemplate <class Real>\ntypename std::enable_if<boost::multiprecision::is_number<Real>::value>::type test_enum_conversions()\n{\n   Real r1(one);\n   BOOST_CHECK_EQUAL(r1, 1);\n   Real r2(scoped_enum::four);\n   BOOST_CHECK_EQUAL(r2, 4);\n   r1 = two;\n   BOOST_CHECK_EQUAL(r1, 2);\n   r1.assign(scoped_enum::five);\n   BOOST_CHECK_EQUAL(r1, 5);\n\n   r1.assign(two);\n\n   BOOST_CHECK_EQUAL(static_cast<unscoped_enum>(r1), two);\n   BOOST_CHECK(static_cast<scoped_enum>(r2) == scoped_enum::four);\n}\n\ntemplate <class Real>\ntypename std::enable_if<!boost::multiprecision::is_number<Real>::value>::type test_enum_conversions()\n{}\n\ntemplate <class Real, class Val>\ntypename std::enable_if<boost::multiprecision::number_category<Real>::value != boost::multiprecision::number_kind_complex>::type\ntest_comparisons(Val a, Val b, const std::integral_constant<bool, true>&)\n{\n   Real r1(a);\n   Real r2(b);\n   Real z(1);\n\n   int cr = a < b ? -1 : a > b ? 1 : 0;\n\n   BOOST_CHECK_EQUAL(r1 == r2, a == b);\n   BOOST_CHECK_EQUAL(r1 != r2, a != b);\n   BOOST_CHECK_EQUAL(r1 <= r2, a <= b);\n   BOOST_CHECK_EQUAL(r1 < r2, a < b);\n   BOOST_CHECK_EQUAL(r1 >= r2, a >= b);\n   BOOST_CHECK_EQUAL(r1 > r2, a > b);\n\n   BOOST_CHECK_EQUAL(r1 == b, a == b);\n   BOOST_CHECK_EQUAL(r1 != b, a != b);\n   BOOST_CHECK_EQUAL(r1 <= b, a <= b);\n   BOOST_CHECK_EQUAL(r1 < b, a < b);\n   BOOST_CHECK_EQUAL(r1 >= b, a >= b);\n   BOOST_CHECK_EQUAL(r1 > b, a > b);\n\n   BOOST_CHECK_EQUAL(a == r2, a == b);\n   BOOST_CHECK_EQUAL(a != r2, a != b);\n   BOOST_CHECK_EQUAL(a <= r2, a <= b);\n   BOOST_CHECK_EQUAL(a < r2, a < b);\n   BOOST_CHECK_EQUAL(a >= r2, a >= b);\n   BOOST_CHECK_EQUAL(a > r2, a > b);\n\n   BOOST_CHECK_EQUAL(r1 * z == r2, a == b);\n   BOOST_CHECK_EQUAL(r1 * z != r2, a != b);\n   BOOST_CHECK_EQUAL(r1 * z <= r2, a <= b);\n   BOOST_CHECK_EQUAL(r1 * z < r2, a < b);\n   BOOST_CHECK_EQUAL(r1 * z >= r2, a >= b);\n   BOOST_CHECK_EQUAL(r1 * z > r2, a > b);\n\n   BOOST_CHECK_EQUAL(r1 == r2 * z, a == b);\n   BOOST_CHECK_EQUAL(r1 != r2 * z, a != b);\n   BOOST_CHECK_EQUAL(r1 <= r2 * z, a <= b);\n   BOOST_CHECK_EQUAL(r1 < r2 * z, a < b);\n   BOOST_CHECK_EQUAL(r1 >= r2 * z, a >= b);\n   BOOST_CHECK_EQUAL(r1 > r2 * z, a > b);\n\n   BOOST_CHECK_EQUAL(r1 * z == r2 * z, a == b);\n   BOOST_CHECK_EQUAL(r1 * z != r2 * z, a != b);\n   BOOST_CHECK_EQUAL(r1 * z <= r2 * z, a <= b);\n   BOOST_CHECK_EQUAL(r1 * z < r2 * z, a < b);\n   BOOST_CHECK_EQUAL(r1 * z >= r2 * z, a >= b);\n   BOOST_CHECK_EQUAL(r1 * z > r2 * z, a > b);\n\n   BOOST_CHECK_EQUAL(r1 * z == b, a == b);\n   BOOST_CHECK_EQUAL(r1 * z != b, a != b);\n   BOOST_CHECK_EQUAL(r1 * z <= b, a <= b);\n   BOOST_CHECK_EQUAL(r1 * z < b, a < b);\n   BOOST_CHECK_EQUAL(r1 * z >= b, a >= b);\n   BOOST_CHECK_EQUAL(r1 * z > b, a > b);\n\n   BOOST_CHECK_EQUAL(a == r2 * z, a == b);\n   BOOST_CHECK_EQUAL(a != r2 * z, a != b);\n   BOOST_CHECK_EQUAL(a <= r2 * z, a <= b);\n   BOOST_CHECK_EQUAL(a < r2 * z, a < b);\n   BOOST_CHECK_EQUAL(a >= r2 * z, a >= b);\n   BOOST_CHECK_EQUAL(a > r2 * z, a > b);\n\n   BOOST_CHECK_EQUAL(normalize_compare_result(r1.compare(r2)), cr);\n   BOOST_CHECK_EQUAL(normalize_compare_result(r2.compare(r1)), -cr);\n   BOOST_CHECK_EQUAL(normalize_compare_result(r1.compare(b)), cr);\n   BOOST_CHECK_EQUAL(normalize_compare_result(r2.compare(a)), -cr);\n}\n\ntemplate <class Real, class Val>\ntypename std::enable_if<boost::multiprecision::number_category<Real>::value == boost::multiprecision::number_kind_complex>::type\ntest_comparisons(Val a, Val b, const std::integral_constant<bool, true>&)\n{\n   Real r1(a);\n   Real r2(b);\n   Real z(1);\n\n   int cr = a < b ? -1 : a > b ? 1 : 0;\n   (void)cr;\n\n   BOOST_CHECK_EQUAL(r1 == r2, a == b);\n   BOOST_CHECK_EQUAL(r1 != r2, a != b);\n\n   BOOST_CHECK_EQUAL(r1 == b, a == b);\n   BOOST_CHECK_EQUAL(r1 != b, a != b);\n\n   BOOST_CHECK_EQUAL(a == r2, a == b);\n   BOOST_CHECK_EQUAL(a != r2, a != b);\n\n   BOOST_CHECK_EQUAL(r1 * z == r2, a == b);\n   BOOST_CHECK_EQUAL(r1 * z != r2, a != b);\n\n   BOOST_CHECK_EQUAL(r1 == r2 * z, a == b);\n   BOOST_CHECK_EQUAL(r1 != r2 * z, a != b);\n\n   BOOST_CHECK_EQUAL(r1 * z == r2 * z, a == b);\n   BOOST_CHECK_EQUAL(r1 * z != r2 * z, a != b);\n\n   BOOST_CHECK_EQUAL(r1 * z == b, a == b);\n   BOOST_CHECK_EQUAL(r1 * z != b, a != b);\n\n   BOOST_CHECK_EQUAL(a == r2 * z, a == b);\n   BOOST_CHECK_EQUAL(a != r2 * z, a != b);\n\n   if (r1 == r2)\n   {\n      BOOST_CHECK_EQUAL(normalize_compare_result(r1.compare(r2)), 0);\n      BOOST_CHECK_EQUAL(normalize_compare_result(r2.compare(r1)), 0);\n      BOOST_CHECK_EQUAL(normalize_compare_result(r1.compare(b)), 0);\n      BOOST_CHECK_EQUAL(normalize_compare_result(r2.compare(a)), 0);\n   }\n   else\n   {\n      BOOST_CHECK_NE(normalize_compare_result(r1.compare(r2)), 0);\n      BOOST_CHECK_NE(normalize_compare_result(r2.compare(r1)), 0);\n      BOOST_CHECK_NE(normalize_compare_result(r1.compare(b)), 0);\n      BOOST_CHECK_NE(normalize_compare_result(r2.compare(a)), 0);\n   }\n}\n\ntemplate <class Real, class Exp>\nvoid test_conditional(Real v, Exp e)\n{\n   //\n   // Verify that Exp is usable in Boolean contexts, and has the same value as v:\n   //\n   if (e)\n   {\n      BOOST_CHECK(v);\n   }\n   else\n   {\n      BOOST_CHECK(!v);\n   }\n   if (!e)\n   {\n      BOOST_CHECK(!v);\n   }\n   else\n   {\n      BOOST_CHECK(v);\n   }\n}\n\ntemplate <class Real>\nvoid test_complement(Real a, Real b, Real c, const std::integral_constant<bool, true>&)\n{\n   int i         = 1020304;\n   int j         = 56789123;\n   int sign_mask = ~0;\n   BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::is_signed)\n   {\n      BOOST_CHECK_EQUAL(~a, (~i & sign_mask));\n      c = a & ~b;\n      BOOST_CHECK_EQUAL(c, (i & (~j & sign_mask)));\n      c = ~(a | b);\n      BOOST_CHECK_EQUAL(c, (~(i | j) & sign_mask));\n   }\n   else\n   {\n      BOOST_CHECK_EQUAL((~a & a), 0);\n   }\n}\n\ntemplate <class Real>\nvoid test_complement(Real, Real, Real, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class Real, class T>\nvoid test_integer_ops(const T&) {}\n\ntemplate <class Real>\nvoid test_rational(const std::integral_constant<bool, true>&)\n{\n   Real a(2);\n   a /= 3;\n   BOOST_CHECK_EQUAL(numerator(a), 2);\n   BOOST_CHECK_EQUAL(denominator(a), 3);\n   Real b(4);\n   b /= 6;\n   BOOST_CHECK_EQUAL(a, b);\n\n   //\n   // Check IO code:\n   //\n   std::stringstream ss;\n   ss << a;\n   ss >> b;\n   BOOST_CHECK_EQUAL(a, b);\n}\ntemplate <class Real>\nvoid test_rational_signed(const std::integral_constant<bool, true>&)\n{\n   Real three = -3;\n   BOOST_CHECK_EQUAL(static_cast<std::int16_t>(three), -3);\n   BOOST_CHECK_EQUAL(static_cast<std::int32_t>(three), -3);\n   BOOST_CHECK_EQUAL(static_cast<std::int64_t>(three), -3);\n}\ntemplate <class Real>\nvoid test_rational_signed(const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class Real>\nvoid test_rational(const std::integral_constant<bool, false>&)\n{\n   typedef typename Real::value_type value_type;\n   Real a(2);\n   a /= 3;\n   BOOST_CHECK_EQUAL(numerator(a), 2);\n   BOOST_CHECK_EQUAL(denominator(a), 3);\n   Real b(4);\n   b /= 6;\n   BOOST_CHECK_EQUAL(a, b);\n\n#ifndef BOOST_NO_EXCEPTIONS\n   BOOST_CHECK_THROW(Real(a / 0), std::overflow_error);\n   BOOST_CHECK_THROW(Real(\"3.14\"), std::runtime_error);\n   //\n   // Check construction/assignment from zero denominator:\n   //\n   BOOST_CHECK_THROW(Real(5, 0), std::overflow_error);\n   BOOST_CHECK_THROW(Real(value_type(5), value_type(0)), std::overflow_error);\n   BOOST_CHECK_THROW(Real(\"5\", \"0\"), std::overflow_error);\n   BOOST_CHECK_THROW(Real(1).assign(5, 0), std::overflow_error);\n   BOOST_CHECK_THROW(Real(1).assign(value_type(5), value_type(0)), std::overflow_error);\n   BOOST_CHECK_THROW(Real(1).assign(\"5\", \"0\"), std::overflow_error);\n#endif\n   b = Real(\"2/3\");\n   BOOST_CHECK_EQUAL(a, b);\n   //\n   // Check IO code:\n   //\n   std::stringstream ss;\n   ss << a;\n   ss >> b;\n   BOOST_CHECK_EQUAL(a, b);\n   //\n   // Conversion to integer, see https://github.com/boostorg/multiprecision/issues/342.\n   //\n   Real three(10, 3);\n   BOOST_CHECK_EQUAL(static_cast<std::uint16_t>(three), 3);\n   BOOST_CHECK_EQUAL(static_cast<std::uint32_t>(three), 3);\n   BOOST_CHECK_EQUAL(static_cast<std::uint64_t>(three), 3);\n   test_rational_signed<Real>(std::integral_constant<bool, std::numeric_limits<Real>::is_signed>());\n   //\n   // Verify normalization:\n   //\n   {\n      Real c(20, 6);\n      BOOST_CHECK_EQUAL(numerator(c), 10);\n      BOOST_CHECK_EQUAL(denominator(c), 3);\n      c.assign(15, 6);\n      BOOST_CHECK_EQUAL(numerator(c), 5);\n      BOOST_CHECK_EQUAL(denominator(c), 2);\n   }\n   {\n      typename Real::value_type v1(20), v2(6);\n      Real                      c(v1, v2);\n      BOOST_CHECK_EQUAL(numerator(c), 10);\n      BOOST_CHECK_EQUAL(denominator(c), 3);\n      v1 = 15;\n      v2 = 6;\n      c.assign(v1, v2);\n      BOOST_CHECK_EQUAL(numerator(c), 5);\n      BOOST_CHECK_EQUAL(denominator(c), 2);\n   }\n   {\n      Real c(\"20\", \"6\");\n      BOOST_CHECK_EQUAL(numerator(c), 10);\n      BOOST_CHECK_EQUAL(denominator(c), 3);\n      c.assign(\"15\", \"6\");\n      BOOST_CHECK_EQUAL(numerator(c), 5);\n      BOOST_CHECK_EQUAL(denominator(c), 2);\n   }\n   //\n   // Verify normalization of negative denominator:\n   //\n   BOOST_IF_CONSTEXPR(std::numeric_limits<value_type>::is_signed)\n   {\n      {\n         Real c(20, -6);\n         BOOST_CHECK_EQUAL(numerator(c), -10);\n         BOOST_CHECK_EQUAL(denominator(c), 3);\n         c.assign(15, -6);\n         BOOST_CHECK_EQUAL(numerator(c), -5);\n         BOOST_CHECK_EQUAL(denominator(c), 2);\n      }\n      {\n         typename Real::value_type v1(20), v2(-6);\n         Real                      c(v1, v2);\n         BOOST_CHECK_EQUAL(numerator(c), -10);\n         BOOST_CHECK_EQUAL(denominator(c), 3);\n         v1 = 15;\n         v2 = -6;\n         c.assign(v1, v2);\n         BOOST_CHECK_EQUAL(numerator(c), -5);\n         BOOST_CHECK_EQUAL(denominator(c), 2);\n      }\n      {\n         Real c(\"20\", \"-6\");\n         BOOST_CHECK_EQUAL(numerator(c), -10);\n         BOOST_CHECK_EQUAL(denominator(c), 3);\n         c.assign(\"15\", \"-6\");\n         BOOST_CHECK_EQUAL(numerator(c), -5);\n         BOOST_CHECK_EQUAL(denominator(c), 2);\n      }\n   }\n}\n\ntemplate <class Real>\nvoid test_integer_ops(const std::integral_constant<int, boost::multiprecision::number_kind_rational>&)\n{\n   test_rational<Real>(is_boost_rational<Real>());\n}\n\ntemplate <class Real>\nvoid test_signed_integer_ops(const std::integral_constant<bool, true>&)\n{\n   Real a(20);\n   Real b(7);\n   Real c(5);\n   BOOST_CHECK_EQUAL(-a % c, 0);\n   BOOST_CHECK_EQUAL(-a % b, -20 % 7);\n   BOOST_CHECK_EQUAL(-a % -b, -20 % -7);\n   BOOST_CHECK_EQUAL(a % -b, 20 % -7);\n   BOOST_CHECK_EQUAL(-a % 7, -20 % 7);\n   BOOST_CHECK_EQUAL(-a % -7, -20 % -7);\n   BOOST_CHECK_EQUAL(a % -7, 20 % -7);\n   BOOST_CHECK_EQUAL(-a % 7u, -20 % 7);\n   BOOST_CHECK_EQUAL(-a % a, 0);\n   BOOST_CHECK_EQUAL(-a % 5, 0);\n   BOOST_CHECK_EQUAL(-a % -5, 0);\n   BOOST_CHECK_EQUAL(a % -5, 0);\n\n   b = -b;\n   BOOST_CHECK_EQUAL(a % b, 20 % -7);\n   a = -a;\n   BOOST_CHECK_EQUAL(a % b, -20 % -7);\n   BOOST_CHECK_EQUAL(a % -7, -20 % -7);\n   b = 7;\n   BOOST_CHECK_EQUAL(a % b, -20 % 7);\n   BOOST_CHECK_EQUAL(a % 7, -20 % 7);\n   BOOST_CHECK_EQUAL(a % 7u, -20 % 7);\n\n   a = 20;\n   a %= b;\n   BOOST_CHECK_EQUAL(a, 20 % 7);\n   a = -20;\n   a %= b;\n   BOOST_CHECK_EQUAL(a, -20 % 7);\n   a = 20;\n   a %= -b;\n   BOOST_CHECK_EQUAL(a, 20 % -7);\n   a = -20;\n   a %= -b;\n   BOOST_CHECK_EQUAL(a, -20 % -7);\n   a = 5;\n   a %= b - a;\n   BOOST_CHECK_EQUAL(a, 5 % (7 - 5));\n   a = -20;\n   a %= 7;\n   BOOST_CHECK_EQUAL(a, -20 % 7);\n   a = 20;\n   a %= -7;\n   BOOST_CHECK_EQUAL(a, 20 % -7);\n   a = -20;\n   a %= -7;\n   BOOST_CHECK_EQUAL(a, -20 % -7);\n#ifndef BOOST_NO_LONG_LONG\n   a = -20;\n   a %= 7uLL;\n   BOOST_CHECK_EQUAL(a, -20 % 7);\n   a = 20;\n   a %= -7LL;\n   BOOST_CHECK_EQUAL(a, 20 % -7);\n   a = -20;\n   a %= -7LL;\n   BOOST_CHECK_EQUAL(a, -20 % -7);\n#endif\n   a = 400;\n   b = 45;\n   #ifndef BOOST_MP_STANDALONE\n   BOOST_CHECK_EQUAL(gcd(a, -45), boost::integer::gcd(400, 45));\n   BOOST_CHECK_EQUAL(lcm(a, -45), boost::integer::lcm(400, 45));\n   BOOST_CHECK_EQUAL(gcd(-400, b), boost::integer::gcd(400, 45));\n   BOOST_CHECK_EQUAL(lcm(-400, b), boost::integer::lcm(400, 45));\n   #elif __cpp_lib_gcd_lcm >= 201606L\n   BOOST_CHECK_EQUAL(gcd(a, -45), std::gcd(400, 45));\n   BOOST_CHECK_EQUAL(lcm(a, -45), std::lcm(400, 45));\n   BOOST_CHECK_EQUAL(gcd(-400, b), std::gcd(400, 45));\n   BOOST_CHECK_EQUAL(lcm(-400, b), std::lcm(400, 45));\n   #endif\n\n   a = -20;\n   BOOST_CHECK_EQUAL(abs(a), 20);\n   BOOST_CHECK_EQUAL(abs(-a), 20);\n   BOOST_CHECK_EQUAL(abs(+a), 20);\n   a = 20;\n   BOOST_CHECK_EQUAL(abs(a), 20);\n   BOOST_CHECK_EQUAL(abs(-a), 20);\n   BOOST_CHECK_EQUAL(abs(+a), 20);\n   a = -400;\n   b = 45;\n   #ifndef BOOST_MP_STANDALONE\n   BOOST_CHECK_EQUAL(gcd(a, b), boost::integer::gcd(-400, 45));\n   BOOST_CHECK_EQUAL(lcm(a, b), boost::integer::lcm(-400, 45));\n   BOOST_CHECK_EQUAL(gcd(a, 45), boost::integer::gcd(-400, 45));\n   BOOST_CHECK_EQUAL(lcm(a, 45), boost::integer::lcm(-400, 45));\n   BOOST_CHECK_EQUAL(gcd(-400, b), boost::integer::gcd(-400, 45));\n   BOOST_CHECK_EQUAL(lcm(-400, b), boost::integer::lcm(-400, 45));\n   #elif __cpp_lib_gcd_lcm >= 201606L\n   BOOST_CHECK_EQUAL(gcd(a, b), std::gcd(-400, 45));\n   BOOST_CHECK_EQUAL(lcm(a, b), std::lcm(-400, 45));\n   BOOST_CHECK_EQUAL(gcd(a, 45), std::gcd(-400, 45));\n   BOOST_CHECK_EQUAL(lcm(a, 45), std::lcm(-400, 45));\n   BOOST_CHECK_EQUAL(gcd(-400, b), std::gcd(-400, 45));\n   BOOST_CHECK_EQUAL(lcm(-400, b), std::lcm(-400, 45));\n   #endif\n\n   Real r;\n   divide_qr(a, b, c, r);\n   BOOST_CHECK_EQUAL(c, a / b);\n   BOOST_CHECK_EQUAL(r, a % b);\n   BOOST_CHECK_EQUAL(integer_modulus(a, 57), abs(a % 57));\n   b = -57;\n   divide_qr(a, b, c, r);\n   BOOST_CHECK_EQUAL(c, a / b);\n   BOOST_CHECK_EQUAL(r, a % b);\n   BOOST_CHECK_EQUAL(integer_modulus(a, -57), abs(a % -57));\n   a = 458;\n   divide_qr(a, b, c, r);\n   BOOST_CHECK_EQUAL(c, a / b);\n   BOOST_CHECK_EQUAL(r, a % b);\n   BOOST_CHECK_EQUAL(integer_modulus(a, -57), abs(a % -57));\n#ifndef TEST_CHECKED_INT\n   if (is_checked_cpp_int<Real>::value)\n   {\n      a = -1;\n#ifndef BOOST_NO_EXCEPTIONS\n      BOOST_CHECK_THROW(a << 2, std::range_error);\n      BOOST_CHECK_THROW(a >> 2, std::range_error);\n      BOOST_CHECK_THROW(a <<= 2, std::range_error);\n      BOOST_CHECK_THROW(a >>= 2, std::range_error);\n#endif\n   }\n   else\n   {\n      a = -1;\n      BOOST_CHECK_EQUAL(a << 10, -1024);\n      a = -23;\n      BOOST_CHECK_EQUAL(a << 10, -23552);\n      a = -23456;\n      BOOST_CHECK_EQUAL(a >> 10, -23);\n      a = -3;\n      BOOST_CHECK_EQUAL(a >> 10, -1);\n   }\n#endif\n}\ntemplate <class Real>\nvoid test_signed_integer_ops(const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class Real>\ninline Real negate_if_signed(Real r, const std::integral_constant<bool, true>&)\n{\n   return -r;\n}\ntemplate <class Real>\ninline Real negate_if_signed(Real r, const std::integral_constant<bool, false>&)\n{\n   return r;\n}\n\ntemplate <class Real, class Int>\nvoid test_integer_overflow()\n{\n   BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::digits > std::numeric_limits<Int>::digits)\n   {\n      Real m((std::numeric_limits<Int>::max)());\n      Int  r;\n      ++m;\n      if (is_checked_cpp_int<Real>::value)\n      {\n         BOOST_CHECK_THROW(m.template convert_to<Int>(), std::overflow_error);\n      }\n      else if (boost::multiprecision::detail::is_signed<Int>::value)\n      {\n         r = m.template convert_to<Int>();\n         BOOST_CHECK_EQUAL(r, (std::numeric_limits<Int>::max)());\n      }\n      else\n      {\n         r = m.template convert_to<Int>();\n         BOOST_CHECK_EQUAL(r, 0);\n      }\n      // Again with much larger value:\n      m = 1u;\n      m <<= (std::min)(std::numeric_limits<Real>::digits - 1, 1000);\n      if (is_checked_cpp_int<Real>::value)\n      {\n         BOOST_CHECK_THROW(m.template convert_to<Int>(), std::overflow_error);\n      }\n      else if (boost::multiprecision::detail::is_signed<Int>::value && boost::multiprecision::detail::is_integral<Int>::value)\n      {\n         r = m.template convert_to<Int>();\n         BOOST_CHECK_EQUAL(r, (std::numeric_limits<Int>::max)());\n      }\n      else\n      {\n         r = m.template convert_to<Int>();\n         BOOST_CHECK_EQUAL(r, 0);\n      }\n\n      BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::is_signed && (boost::multiprecision::detail::is_signed<Int>::value))\n      {\n         m = (std::numeric_limits<Int>::min)();\n         --m;\n         if (is_checked_cpp_int<Real>::value)\n         {\n            BOOST_CHECK_THROW(m.template convert_to<Int>(), std::overflow_error);\n         }\n         else\n         {\n            r = m.template convert_to<Int>();\n            BOOST_CHECK_EQUAL(r, (std::numeric_limits<Int>::min)());\n         }\n         // Again with much larger value:\n         m = 2u;\n         m = pow(m, (std::min)(std::numeric_limits<Real>::digits - 1, 1000));\n         ++m;\n         m = negate_if_signed(m, std::integral_constant<bool, std::numeric_limits<Real>::is_signed>());\n         if (is_checked_cpp_int<Real>::value)\n         {\n            BOOST_CHECK_THROW(m.template convert_to<Int>(), std::overflow_error);\n         }\n         else\n         {\n            r = m.template convert_to<Int>();\n            BOOST_CHECK_EQUAL(r, (std::numeric_limits<Int>::min)());\n         }\n      }\n      else BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::is_signed && !boost::multiprecision::detail::is_signed<Int>::value)\n      {\n         // signed to unsigned converison with overflow, it's really not clear what should happen here!\n         #if 0\n         m = (std::numeric_limits<Int>::max)();\n         ++m;\n         m = negate_if_signed(m, std::integral_constant<bool, std::numeric_limits<Real>::is_signed>());\n         BOOST_CHECK_THROW(m.template convert_to<Int>(), std::range_error);\n         // Again with much larger value:\n         m = 2u;\n         m = pow(m, (std::min)(std::numeric_limits<Real>::digits - 1, 1000));\n         m = negate_if_signed(m, std::integral_constant<bool, std::numeric_limits<Real>::is_signed>());\n         BOOST_CHECK_THROW(m.template convert_to<Int>(), std::range_error);\n         #endif\n      }\n   }\n}\n\ntemplate <class Real, class Int>\nvoid test_integer_round_trip()\n{\n   BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::digits >= std::numeric_limits<Int>::digits)\n   {\n      Real m((std::numeric_limits<Int>::max)());\n      Int  r = m.template convert_to<Int>();\n      BOOST_CHECK_EQUAL(m, r);\n      BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::is_signed && (std::numeric_limits<Real>::digits > std::numeric_limits<Int>::digits))\n      {\n         m = (std::numeric_limits<Int>::min)();\n         r = m.template convert_to<Int>();\n         BOOST_CHECK_EQUAL(m, r);\n      }\n   }\n   test_integer_overflow<Real, Int>();\n}\n\ntemplate <class Real>\nvoid test_integer_ops(const std::integral_constant<int, boost::multiprecision::number_kind_integer>&)\n{\n   test_signed_integer_ops<Real>(std::integral_constant<bool, std::numeric_limits<Real>::is_signed>());\n\n   Real a(20);\n   Real b(7);\n   Real c(5);\n   BOOST_CHECK_EQUAL(a % b, 20 % 7);\n   BOOST_CHECK_EQUAL(a % 7, 20 % 7);\n   BOOST_CHECK_EQUAL(a % 7u, 20 % 7);\n   BOOST_CHECK_EQUAL(a % a, 0);\n   BOOST_CHECK_EQUAL(a % c, 0);\n   BOOST_CHECK_EQUAL(a % 5, 0);\n   a = a % (b + 0);\n   BOOST_CHECK_EQUAL(a, 20 % 7);\n   a = 20;\n   c = (a + 2) % (a - 1);\n   BOOST_CHECK_EQUAL(c, 22 % 19);\n   c = 5;\n   a = b % (a - 15);\n   BOOST_CHECK_EQUAL(a, 7 % 5);\n   a = 20;\n\n   a = 20;\n   a %= 7;\n   BOOST_CHECK_EQUAL(a, 20 % 7);\n#ifndef BOOST_NO_LONG_LONG\n   a = 20;\n   a %= 7uLL;\n   BOOST_CHECK_EQUAL(a, 20 % 7);\n#endif\n   a = 20;\n   ++a;\n   BOOST_CHECK_EQUAL(a, 21);\n   --a;\n   BOOST_CHECK_EQUAL(a, 20);\n   BOOST_CHECK_EQUAL(a++, 20);\n   BOOST_CHECK_EQUAL(a, 21);\n   BOOST_CHECK_EQUAL(a--, 21);\n   BOOST_CHECK_EQUAL(a, 20);\n   a = 2000;\n   a <<= 20;\n   BOOST_CHECK_EQUAL(a, 2000L << 20);\n   a >>= 20;\n   BOOST_CHECK_EQUAL(a, 2000);\n   a <<= 20u;\n   BOOST_CHECK_EQUAL(a, 2000L << 20);\n   a >>= 20u;\n   BOOST_CHECK_EQUAL(a, 2000);\n#ifndef BOOST_NO_EXCEPTIONS\n   BOOST_CHECK_THROW(a <<= -20, std::out_of_range);\n   BOOST_CHECK_THROW(a >>= -20, std::out_of_range);\n   BOOST_CHECK_THROW(Real(a << -20), std::out_of_range);\n   BOOST_CHECK_THROW(Real(a >> -20), std::out_of_range);\n#endif\n#ifndef BOOST_NO_LONG_LONG\n   if (sizeof(long long) > sizeof(std::size_t))\n   {\n      // extreme values should trigger an exception:\n#ifndef BOOST_NO_EXCEPTIONS\n      BOOST_CHECK_THROW(a >>= (1uLL << (sizeof(long long) * CHAR_BIT - 2)), std::out_of_range);\n      BOOST_CHECK_THROW(a <<= (1uLL << (sizeof(long long) * CHAR_BIT - 2)), std::out_of_range);\n      BOOST_CHECK_THROW(a >>= -(1LL << (sizeof(long long) * CHAR_BIT - 2)), std::out_of_range);\n      BOOST_CHECK_THROW(a <<= -(1LL << (sizeof(long long) * CHAR_BIT - 2)), std::out_of_range);\n      BOOST_CHECK_THROW(a >>= (1LL << (sizeof(long long) * CHAR_BIT - 2)), std::out_of_range);\n      BOOST_CHECK_THROW(a <<= (1LL << (sizeof(long long) * CHAR_BIT - 2)), std::out_of_range);\n#endif\n      // Unless they fit within range:\n      a = 2000L;\n      a <<= 20uLL;\n      BOOST_CHECK_EQUAL(a, (2000L << 20));\n      a = 2000;\n      a <<= 20LL;\n      BOOST_CHECK_EQUAL(a, (2000L << 20));\n\n#ifndef BOOST_NO_EXCEPTIONS\n      BOOST_CHECK_THROW(Real(a >> (1uLL << (sizeof(long long) * CHAR_BIT - 2))), std::out_of_range);\n      BOOST_CHECK_THROW(Real(a <<= (1uLL << (sizeof(long long) * CHAR_BIT - 2))), std::out_of_range);\n      BOOST_CHECK_THROW(Real(a >>= -(1LL << (sizeof(long long) * CHAR_BIT - 2))), std::out_of_range);\n      BOOST_CHECK_THROW(Real(a <<= -(1LL << (sizeof(long long) * CHAR_BIT - 2))), std::out_of_range);\n      BOOST_CHECK_THROW(Real(a >>= (1LL << (sizeof(long long) * CHAR_BIT - 2))), std::out_of_range);\n      BOOST_CHECK_THROW(Real(a <<= (1LL << (sizeof(long long) * CHAR_BIT - 2))), std::out_of_range);\n#endif\n      // Unless they fit within range:\n      a = 2000L;\n      BOOST_CHECK_EQUAL(Real(a << 20uLL), (2000L << 20));\n      a = 2000;\n      BOOST_CHECK_EQUAL(Real(a << 20LL), (2000L << 20));\n   }\n#endif\n   a = 20;\n   b = a << 20;\n   BOOST_CHECK_EQUAL(b, (20 << 20));\n   b = a >> 2;\n   BOOST_CHECK_EQUAL(b, (20 >> 2));\n   b = (a + 2) << 10;\n   BOOST_CHECK_EQUAL(b, (22 << 10));\n   b = (a + 3) >> 3;\n   BOOST_CHECK_EQUAL(b, (23 >> 3));\n   //\n   // Bit fiddling:\n   //\n   int i = 1020304;\n   int j = 56789123;\n   int k = 4523187;\n   a     = i;\n   b     = j;\n   c     = a;\n   c &= b;\n   BOOST_CHECK_EQUAL(c, (i & j));\n   c = a;\n   c &= j;\n   BOOST_CHECK_EQUAL(c, (i & j));\n   c = a;\n   c &= a + b;\n   BOOST_CHECK_EQUAL(c, (i & (i + j)));\n   BOOST_CHECK_EQUAL((a & b), (i & j));\n   c = k;\n   a = a & (b + k);\n   BOOST_CHECK_EQUAL(a, (i & (j + k)));\n   a = i;\n   a = (b + k) & a;\n   BOOST_CHECK_EQUAL(a, (i & (j + k)));\n   a = i;\n   c = a & b & k;\n   BOOST_CHECK_EQUAL(c, (i & j & k));\n   c = a;\n   c &= (c + b);\n   BOOST_CHECK_EQUAL(c, (i & (i + j)));\n   c = a & (b | 1);\n   BOOST_CHECK_EQUAL(c, (i & (j | 1)));\n\n   test_complement<Real>(a, b, c, typename is_twos_complement_integer<Real>::type());\n\n   a = i;\n   b = j;\n   c = a;\n   c |= b;\n   BOOST_CHECK_EQUAL(c, (i | j));\n   c = a;\n   c |= j;\n   BOOST_CHECK_EQUAL(c, (i | j));\n   c = a;\n   c |= a + b;\n   BOOST_CHECK_EQUAL(c, (i | (i + j)));\n   BOOST_CHECK_EQUAL((a | b), (i | j));\n   c = k;\n   a = a | (b + k);\n   BOOST_CHECK_EQUAL(a, (i | (j + k)));\n   a = i;\n   a = (b + k) | a;\n   BOOST_CHECK_EQUAL(a, (i | (j + k)));\n   a = i;\n   c = a | b | k;\n   BOOST_CHECK_EQUAL(c, (i | j | k));\n   c = a;\n   c |= (c + b);\n   BOOST_CHECK_EQUAL(c, (i | (i + j)));\n   c = a | (b | 1);\n   BOOST_CHECK_EQUAL(c, (i | (j | 1)));\n\n   a = i;\n   b = j;\n   c = a;\n   c ^= b;\n   BOOST_CHECK_EQUAL(c, (i ^ j));\n   c = a;\n   c ^= j;\n   BOOST_CHECK_EQUAL(c, (i ^ j));\n   c = a;\n   c ^= a + b;\n   BOOST_CHECK_EQUAL(c, (i ^ (i + j)));\n   BOOST_CHECK_EQUAL((a ^ b), (i ^ j));\n   c = k;\n   a = a ^ (b + k);\n   BOOST_CHECK_EQUAL(a, (i ^ (j + k)));\n   a = i;\n   a = (b + k) ^ a;\n   BOOST_CHECK_EQUAL(a, (i ^ (j + k)));\n   a = i;\n   c = a ^ b ^ k;\n   BOOST_CHECK_EQUAL(c, (i ^ j ^ k));\n   c = a;\n   c ^= (c + b);\n   BOOST_CHECK_EQUAL(c, (i ^ (i + j)));\n   c = a ^ (b | 1);\n   BOOST_CHECK_EQUAL(c, (i ^ (j | 1)));\n\n   a = i;\n   b = j;\n   c = k;\n   //\n   // Non-member functions:\n   //\n   a = 400;\n   b = 45;\n   #ifndef BOOST_MP_STANDALONE\n   BOOST_CHECK_EQUAL(gcd(a, b), boost::integer::gcd(400, 45));\n   BOOST_CHECK_EQUAL(lcm(a, b), boost::integer::lcm(400, 45));\n   BOOST_CHECK_EQUAL(gcd(a, 45), boost::integer::gcd(400, 45));\n   BOOST_CHECK_EQUAL(lcm(a, 45), boost::integer::lcm(400, 45));\n   BOOST_CHECK_EQUAL(gcd(a, 45u), boost::integer::gcd(400, 45));\n   BOOST_CHECK_EQUAL(lcm(a, 45u), boost::integer::lcm(400, 45));\n   BOOST_CHECK_EQUAL(gcd(400, b), boost::integer::gcd(400, 45));\n   BOOST_CHECK_EQUAL(lcm(400, b), boost::integer::lcm(400, 45));\n   BOOST_CHECK_EQUAL(gcd(400u, b), boost::integer::gcd(400, 45));\n   BOOST_CHECK_EQUAL(lcm(400u, b), boost::integer::lcm(400, 45));\n   #elif __cpp_lib_gcd_lcm >= 201606L\n   BOOST_CHECK_EQUAL(gcd(a, b), std::gcd(400, 45));\n   BOOST_CHECK_EQUAL(lcm(a, b), std::lcm(400, 45));\n   BOOST_CHECK_EQUAL(gcd(a, 45), std::gcd(400, 45));\n   BOOST_CHECK_EQUAL(lcm(a, 45), std::lcm(400, 45));\n   BOOST_CHECK_EQUAL(gcd(a, 45u), std::gcd(400, 45));\n   BOOST_CHECK_EQUAL(lcm(a, 45u), std::lcm(400, 45));\n   BOOST_CHECK_EQUAL(gcd(400, b), std::gcd(400, 45));\n   BOOST_CHECK_EQUAL(lcm(400, b), std::lcm(400, 45));\n   BOOST_CHECK_EQUAL(gcd(400u, b), std::gcd(400, 45));\n   BOOST_CHECK_EQUAL(lcm(400u, b), std::lcm(400, 45));\n   #endif\n\n   BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::is_bounded)\n   {\n      // Fixed precision integer:\n      a = (std::numeric_limits<Real>::max)() - 1;\n      b = (std::numeric_limits<Real>::max)() / 35;\n      Real div = gcd(a, b);\n      BOOST_CHECK_EQUAL(a % div, 0);\n      BOOST_CHECK_EQUAL(b % div, 0);\n   }\n\n   //\n   // Conditionals involving 2 arg functions:\n   //\n   test_conditional(Real(gcd(a, b)), gcd(a, b));\n\n   Real r;\n   divide_qr(a, b, c, r);\n   BOOST_CHECK_EQUAL(c, a / b);\n   BOOST_CHECK_EQUAL(r, a % b);\n   divide_qr(a + 0, b, c, r);\n   BOOST_CHECK_EQUAL(c, a / b);\n   BOOST_CHECK_EQUAL(r, a % b);\n   divide_qr(a, b + 0, c, r);\n   BOOST_CHECK_EQUAL(c, a / b);\n   BOOST_CHECK_EQUAL(r, a % b);\n   divide_qr(a + 0, b + 0, c, r);\n   BOOST_CHECK_EQUAL(c, a / b);\n   BOOST_CHECK_EQUAL(r, a % b);\n   BOOST_CHECK_EQUAL(integer_modulus(a, 57), a % 57);\n   for (i = 0; i < 20; ++i)\n   {\n      if (std::numeric_limits<Real>::is_specialized && (!std::numeric_limits<Real>::is_bounded || ((int)i * 17 < std::numeric_limits<Real>::digits)))\n      {\n         BOOST_CHECK_EQUAL(lsb(Real(1) << (i * 17)), static_cast<unsigned>(i * 17));\n         BOOST_CHECK_EQUAL(msb(Real(1) << (i * 17)), static_cast<unsigned>(i * 17));\n         BOOST_CHECK(bit_test(Real(1) << (i * 17), i * 17));\n         BOOST_CHECK(!bit_test(Real(1) << (i * 17), i * 17 + 1));\n         if (i)\n         {\n            BOOST_CHECK(!bit_test(Real(1) << (i * 17), i * 17 - 1));\n         }\n         Real zero(0);\n         BOOST_CHECK(bit_test(bit_set(zero, i * 17), i * 17));\n         zero = 0;\n         BOOST_CHECK_EQUAL(bit_flip(zero, i * 17), Real(1) << i * 17);\n         zero = Real(1) << i * 17;\n         BOOST_CHECK_EQUAL(bit_flip(zero, i * 17), 0);\n         zero = Real(1) << i * 17;\n         BOOST_CHECK_EQUAL(bit_unset(zero, i * 17), 0);\n      }\n   }\n   //\n   // pow, powm:\n   //\n   BOOST_CHECK_EQUAL(pow(Real(3), 4u), 81);\n   BOOST_CHECK_EQUAL(pow(Real(3) + Real(0), 4u), 81);\n   BOOST_CHECK_EQUAL(powm(Real(3), Real(4), Real(13)), 81 % 13);\n   BOOST_CHECK_EQUAL(powm(Real(3), Real(4), 13), 81 % 13);\n   BOOST_CHECK_EQUAL(powm(Real(3), Real(4), Real(13) + 0), 81 % 13);\n   BOOST_CHECK_EQUAL(powm(Real(3), Real(4) + 0, Real(13)), 81 % 13);\n   BOOST_CHECK_EQUAL(powm(Real(3), Real(4) + 0, 13), 81 % 13);\n   BOOST_CHECK_EQUAL(powm(Real(3), Real(4) + 0, Real(13) + 0), 81 % 13);\n   BOOST_CHECK_EQUAL(powm(Real(3), 4 + 0, Real(13)), 81 % 13);\n   BOOST_CHECK_EQUAL(powm(Real(3), 4 + 0, 13), 81 % 13);\n   BOOST_CHECK_EQUAL(powm(Real(3), 4 + 0, Real(13) + 0), 81 % 13);\n   BOOST_CHECK_EQUAL(powm(Real(3) + 0, Real(4), Real(13)), 81 % 13);\n   BOOST_CHECK_EQUAL(powm(Real(3) + 0, Real(4), 13), 81 % 13);\n   BOOST_CHECK_EQUAL(powm(Real(3) + 0, Real(4), Real(13) + 0), 81 % 13);\n   BOOST_CHECK_EQUAL(powm(Real(3) + 0, Real(4) + 0, Real(13)), 81 % 13);\n   BOOST_CHECK_EQUAL(powm(Real(3) + 0, Real(4) + 0, 13), 81 % 13);\n   BOOST_CHECK_EQUAL(powm(Real(3) + 0, Real(4) + 0, Real(13) + 0), 81 % 13);\n   BOOST_CHECK_EQUAL(powm(Real(3) + 0, 4 + 0, Real(13)), 81 % 13);\n   BOOST_CHECK_EQUAL(powm(Real(3) + 0, 4 + 0, 13), 81 % 13);\n   BOOST_CHECK_EQUAL(powm(Real(3) + 0, 4 + 0, Real(13) + 0), 81 % 13);\n   //\n   // Conditionals involving 3 arg functions:\n   //\n   test_conditional(Real(powm(Real(3), Real(4), Real(13))), powm(Real(3), Real(4), Real(13)));\n\n#ifndef BOOST_NO_EXCEPTIONS\n   //\n   // Things that are expected errors:\n   //\n   BOOST_CHECK_THROW(Real(\"3.14\"), std::runtime_error);\n   BOOST_CHECK_THROW(Real(\"3L\"), std::runtime_error);\n   BOOST_CHECK_THROW(Real(Real(20) / 0u), std::overflow_error);\n#endif\n   //\n   // Extra tests added for full coverage:\n   //\n   a = 20;\n   b = 7;\n   c = 20 % b;\n   BOOST_CHECK_EQUAL(c, (20 % 7));\n   c = 20 % (b + 0);\n   BOOST_CHECK_EQUAL(c, (20 % 7));\n   c = a & 10;\n   BOOST_CHECK_EQUAL(c, (20 & 10));\n   c = 10 & a;\n   BOOST_CHECK_EQUAL(c, (20 & 10));\n   c = (a + 0) & (b + 0);\n   BOOST_CHECK_EQUAL(c, (20 & 7));\n   c = 10 & (a + 0);\n   BOOST_CHECK_EQUAL(c, (20 & 10));\n   c = 10 | a;\n   BOOST_CHECK_EQUAL(c, (20 | 10));\n   c = (a + 0) | (b + 0);\n   BOOST_CHECK(c == (20 | 7))\n   c = 20 | (b + 0);\n   BOOST_CHECK_EQUAL(c, (20 | 7));\n   c = a ^ 7;\n   BOOST_CHECK_EQUAL(c, (20 ^ 7));\n   c = 20 ^ b;\n   BOOST_CHECK_EQUAL(c, (20 ^ 7));\n   c = (a + 0) ^ (b + 0);\n   BOOST_CHECK_EQUAL(c, (20 ^ 7));\n   c = 20 ^ (b + 0);\n   BOOST_CHECK_EQUAL(c, (20 ^ 7));\n   //\n   // RValue ref tests:\n   //\n   c = Real(20) % b;\n   BOOST_CHECK_EQUAL(c, (20 % 7));\n   c = a % Real(7);\n   BOOST_CHECK_EQUAL(c, (20 % 7));\n   c = Real(20) % Real(7);\n   BOOST_CHECK_EQUAL(c, (20 % 7));\n   c = Real(20) % 7;\n   BOOST_CHECK_EQUAL(c, (20 % 7));\n   c = 20 % Real(7);\n   BOOST_CHECK_EQUAL(c, (20 % 7));\n   c = Real(20) % (b * 1);\n   BOOST_CHECK_EQUAL(c, (20 % 7));\n   c = (a * 1 + 0) % Real(7);\n   BOOST_CHECK_EQUAL(c, (20 % 7));\n   c = Real(20) >> 2;\n   BOOST_CHECK_EQUAL(c, (20 >> 2));\n   c = Real(20) & b;\n   BOOST_CHECK_EQUAL(c, (20 & 7));\n   c = a & Real(7);\n   BOOST_CHECK_EQUAL(c, (20 & 7));\n   c = Real(20) & Real(7);\n   BOOST_CHECK_EQUAL(c, (20 & 7));\n   c = Real(20) & 7;\n   BOOST_CHECK_EQUAL(c, (20 & 7));\n   c = 20 & Real(7);\n   BOOST_CHECK_EQUAL(c, (20 & 7));\n   c = Real(20) & (b * 1 + 0);\n   BOOST_CHECK_EQUAL(c, (20 & 7));\n   c = (a * 1 + 0) & Real(7);\n   BOOST_CHECK_EQUAL(c, (20 & 7));\n   c = Real(20) | b;\n   BOOST_CHECK_EQUAL(c, (20 | 7));\n   c = a | Real(7);\n   BOOST_CHECK_EQUAL(c, (20 | 7));\n   c = Real(20) | Real(7);\n   BOOST_CHECK_EQUAL(c, (20 | 7));\n   c = Real(20) | 7;\n   BOOST_CHECK_EQUAL(c, (20 | 7));\n   c = 20 | Real(7);\n   BOOST_CHECK_EQUAL(c, (20 | 7));\n   c = Real(20) | (b * 1 + 0);\n   BOOST_CHECK_EQUAL(c, (20 | 7));\n   c = (a * 1 + 0) | Real(7);\n   BOOST_CHECK_EQUAL(c, (20 | 7));\n   c = Real(20) ^ b;\n   BOOST_CHECK_EQUAL(c, (20 ^ 7));\n   c = a ^ Real(7);\n   BOOST_CHECK_EQUAL(c, (20 ^ 7));\n   c = Real(20) ^ Real(7);\n   BOOST_CHECK_EQUAL(c, (20 ^ 7));\n   c = Real(20) ^ 7;\n   BOOST_CHECK_EQUAL(c, (20 ^ 7));\n   c = 20 ^ Real(7);\n   BOOST_CHECK_EQUAL(c, (20 ^ 7));\n   c = Real(20) ^ (b * 1 + 0);\n   BOOST_CHECK_EQUAL(c, (20 ^ 7));\n   c = (a * 1 + 0) ^ Real(7);\n   BOOST_CHECK_EQUAL(c, (20 ^ 7));\n\n   //\n   // Round tripping of built in integers:\n   //\n   test_integer_round_trip<Real, short>();\n   test_integer_round_trip<Real, unsigned short>();\n   test_integer_round_trip<Real, int>();\n   test_integer_round_trip<Real, unsigned int>();\n   test_integer_round_trip<Real, long>();\n   test_integer_round_trip<Real, unsigned long>();\n#ifndef BOOST_NO_LONG_LONG\n   test_integer_round_trip<Real, long long>();\n   test_integer_round_trip<Real, unsigned long long>();\n#endif\n}\n\ntemplate <class Real, class T>\nvoid test_float_funcs(const T&) {}\n\ntemplate <class Real>\nvoid test_float_funcs(const std::integral_constant<bool, true>&)\n{\n   if (boost::multiprecision::is_interval_number<Real>::value)\n      return;\n   //\n   // Test variable reuse in function calls, see https://svn.boost.org/trac/boost/ticket/8326\n   //\n   Real a(2), b(10), c, d;\n   a = pow(a, b);\n   BOOST_CHECK_EQUAL(a, 1024);\n   a = 2;\n   b = pow(a, b);\n   BOOST_CHECK_EQUAL(b, 1024);\n   b = 10;\n   a = pow(a, 10);\n   BOOST_CHECK_EQUAL(a, 1024);\n   a = -2;\n   a = abs(a);\n   BOOST_CHECK_EQUAL(a, 2);\n   a = -2;\n   a = fabs(a);\n   BOOST_CHECK_EQUAL(a, 2);\n   a = 2.5;\n   a = floor(a);\n   BOOST_CHECK_EQUAL(a, 2);\n   a = 2.5;\n   a = ceil(a);\n   BOOST_CHECK_EQUAL(a, 3);\n   a = 2.5;\n   a = trunc(a);\n   BOOST_CHECK_EQUAL(a, 2);\n   a = 2.25;\n   a = round(a);\n   BOOST_CHECK_EQUAL(a, 2);\n   a = 2;\n   a = ldexp(a, 1);\n   BOOST_CHECK_EQUAL(a, 4);\n   int i;\n   a = frexp(a, &i);\n   BOOST_CHECK_EQUAL(a, 0.5);\n\n   Real tol = std::numeric_limits<Real>::epsilon() * 3;\n   a        = 4;\n   a        = sqrt(a);\n   BOOST_CHECK_CLOSE_FRACTION(a, 2, tol);\n   a = 3;\n   a = exp(a);\n   BOOST_CHECK_CLOSE_FRACTION(a, Real(exp(Real(3))), tol);\n   a = 3;\n   a = log(a);\n   BOOST_CHECK_CLOSE_FRACTION(a, Real(log(Real(3))), tol);\n   a = 3;\n   a = log10(a);\n   BOOST_CHECK_CLOSE_FRACTION(a, Real(log10(Real(3))), tol);\n\n   a = 0.5;\n   a = sin(a);\n   BOOST_CHECK_CLOSE_FRACTION(a, Real(sin(Real(0.5))), tol);\n   a = 0.5;\n   a = cos(a);\n   BOOST_CHECK_CLOSE_FRACTION(a, Real(cos(Real(0.5))), tol);\n   a = 0.5;\n   a = tan(a);\n   BOOST_CHECK_CLOSE_FRACTION(a, Real(tan(Real(0.5))), tol);\n   a = 0.5;\n   a = asin(a);\n   BOOST_CHECK_CLOSE_FRACTION(a, Real(asin(Real(0.5))), tol);\n   a = 0.5;\n   a = acos(a);\n   BOOST_CHECK_CLOSE_FRACTION(a, Real(acos(Real(0.5))), tol);\n   a = 0.5;\n   a = atan(a);\n   BOOST_CHECK_CLOSE_FRACTION(a, Real(atan(Real(0.5))), tol);\n   a = 0.5;\n   a = sinh(a);\n   BOOST_CHECK_CLOSE_FRACTION(a, Real(sinh(Real(0.5))), tol);\n   a = 0.5;\n   a = cosh(a);\n   BOOST_CHECK_CLOSE_FRACTION(a, Real(cosh(Real(0.5))), tol);\n   a = 0.5;\n   a = tanh(a);\n   BOOST_CHECK_CLOSE_FRACTION(a, Real(tanh(Real(0.5))), tol);\n   // fmod, need to check all the sign permutations:\n   a = 4;\n   b = 2;\n   a = fmod(a, b);\n   BOOST_CHECK_CLOSE_FRACTION(a, Real(fmod(Real(4), Real(2))), tol);\n   a = 4;\n   b = fmod(a, b);\n   BOOST_CHECK_CLOSE_FRACTION(b, Real(fmod(Real(4), Real(2))), tol);\n   a = 4;\n   b = 2;\n   a = fmod(-a, b);\n   BOOST_CHECK_CLOSE_FRACTION(a, Real(fmod(-Real(4), Real(2))), tol);\n   a = 4;\n   b = fmod(-a, b);\n   BOOST_CHECK_CLOSE_FRACTION(b, Real(-fmod(Real(4), Real(2))), tol);\n   a = 4;\n   b = 2;\n   a = fmod(a, -b);\n   BOOST_CHECK_CLOSE_FRACTION(a, Real(fmod(Real(4), -Real(2))), tol);\n   a = 4;\n   b = fmod(a, -b);\n   BOOST_CHECK_CLOSE_FRACTION(b, Real(fmod(Real(4), -Real(2))), tol);\n   a = 4;\n   b = 2;\n   a = fmod(-a, -b);\n   BOOST_CHECK_CLOSE_FRACTION(a, Real(fmod(-Real(4), -Real(2))), tol);\n   a = 4;\n   b = fmod(-a, -b);\n   BOOST_CHECK_CLOSE_FRACTION(b, Real(fmod(-Real(4), -Real(2))), tol);\n   // modf:\n   a = 5;\n   a /= 2;\n   b = modf(a, &c);\n   BOOST_CHECK_EQUAL(b + c, a);\n   BOOST_CHECK_EQUAL(b > 0, a > 0);\n   BOOST_CHECK_EQUAL(c > 0, a > 0);\n   a = -a;\n   b = modf(a, &c);\n   BOOST_CHECK_EQUAL(b + c, a);\n   BOOST_CHECK_EQUAL(b > 0, a > 0);\n   BOOST_CHECK_EQUAL(c > 0, a > 0);\n   b = modf(a, &c);\n   c = 0;\n   modf(a, &c);\n   BOOST_CHECK_EQUAL(b + c, a);\n   BOOST_CHECK_EQUAL(b > 0, a > 0);\n   BOOST_CHECK_EQUAL(c > 0, a > 0);\n   a = -a;\n   b = modf(a, &c);\n   c = 0;\n   modf(a, &c);\n   BOOST_CHECK_EQUAL(b + c, a);\n   BOOST_CHECK_EQUAL(b > 0, a > 0);\n   BOOST_CHECK_EQUAL(c > 0, a > 0);\n\n   BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::has_infinity)\n   {\n      a = std::numeric_limits<Real>::infinity();\n      b = modf(a, &c);\n      BOOST_CHECK_EQUAL(a, c);\n      BOOST_CHECK_EQUAL(b, 0);\n      a = -std::numeric_limits<Real>::infinity();\n      b = modf(a, &c);\n      BOOST_CHECK_EQUAL(a, c);\n      BOOST_CHECK_EQUAL(b, 0);\n   }\n   BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::has_quiet_NaN)\n   {\n      a = std::numeric_limits<Real>::quiet_NaN();\n      b = modf(a, &c);\n      #ifndef BOOST_MP_STANDALONE\n      BOOST_CHECK((boost::math::isnan)(b));\n      BOOST_CHECK((boost::math::isnan)(c));\n      #endif\n   }\n\n   a = 4;\n   b = 2;\n   a = atan2(a, b);\n   BOOST_CHECK_CLOSE_FRACTION(a, Real(atan2(Real(4), Real(2))), tol);\n   a = 4;\n   b = atan2(a, b);\n   BOOST_CHECK_CLOSE_FRACTION(b, Real(atan2(Real(4), Real(2))), tol);\n\n   // fma:\n   a = 2;\n   b = 4;\n   c = 6;\n   BOOST_CHECK_EQUAL(fma(a, b, c), 14);\n   BOOST_CHECK_EQUAL(fma(a, 4, c), 14);\n   BOOST_CHECK_EQUAL(fma(a, b, 6), 14);\n   BOOST_CHECK_EQUAL(fma(a, 4, 6), 14);\n   BOOST_CHECK_EQUAL(fma(a + 0, b, c), 14);\n   BOOST_CHECK_EQUAL(fma(a - 0, 4, c), 14);\n   BOOST_CHECK_EQUAL(fma(a * 1, b, 6), 14);\n   BOOST_CHECK_EQUAL(fma(a / 1, 4, 6), 14);\n   BOOST_CHECK_EQUAL(fma(2, b, c), 14);\n   BOOST_CHECK_EQUAL(fma(2, b, 6), 14);\n   BOOST_CHECK_EQUAL(fma(2, b * 1, c), 14);\n   BOOST_CHECK_EQUAL(fma(2, b + 0, 6), 14);\n   BOOST_CHECK_EQUAL(fma(2, 4, c), 14);\n   BOOST_CHECK_EQUAL(fma(2, 4, c + 0), 14);\n\n   // Default construct, for consistency with native floats, default constructed values are zero:\n   Real zero;\n   BOOST_CHECK_EQUAL(zero, 0);\n\n   //\n   // Complex number functions on scalars:\n   //\n   #ifdef BOOST_MP_MATH_AVAILABLE\n   a = 40;\n   BOOST_CHECK_EQUAL(Real(arg(a)), 0);\n   BOOST_CHECK_EQUAL(Real(arg(a + 0)), 0);\n   a - 20;\n   BOOST_CHECK_EQUAL(Real(arg(a)), 0);\n   BOOST_CHECK_EQUAL(Real(arg(a - 20)), 0);\n   #endif\n}\n\ntemplate <class T, class U>\nvoid compare_NaNs(const T& a, const U& b)\n{\n   BOOST_CHECK_EQUAL(a == b, false);\n   BOOST_CHECK_EQUAL(a != b, true);\n   BOOST_CHECK_EQUAL(a <= b, false);\n   BOOST_CHECK_EQUAL(a >= b, false);\n   BOOST_CHECK_EQUAL(a > b, false);\n   BOOST_CHECK_EQUAL(a < b, false);\n   //\n   // Again where LHS may be an expression template:\n   //\n   BOOST_CHECK_EQUAL(1 * a == b, false);\n   BOOST_CHECK_EQUAL(1 * a != b, true);\n   BOOST_CHECK_EQUAL(1 * a <= b, false);\n   BOOST_CHECK_EQUAL(1 * a >= b, false);\n   BOOST_CHECK_EQUAL(1 * a > b, false);\n   BOOST_CHECK_EQUAL(1 * a < b, false);\n   //\n   // Again where RHS may be an expression template:\n   //\n   BOOST_CHECK_EQUAL(a == b * 1, false);\n   BOOST_CHECK_EQUAL(a != b * 1, true);\n   BOOST_CHECK_EQUAL(a <= b * 1, false);\n   BOOST_CHECK_EQUAL(a >= b * 1, false);\n   BOOST_CHECK_EQUAL(a > b * 1, false);\n   BOOST_CHECK_EQUAL(a < b * 1, false);\n   //\n   // Again where LHS and RHS may be an expression templates:\n   //\n   BOOST_CHECK_EQUAL(1 * a == b * 1, false);\n   BOOST_CHECK_EQUAL(1 * a != b * 1, true);\n   BOOST_CHECK_EQUAL(1 * a <= b * 1, false);\n   BOOST_CHECK_EQUAL(1 * a >= b * 1, false);\n   BOOST_CHECK_EQUAL(1 * a > b * 1, false);\n   BOOST_CHECK_EQUAL(1 * a < b * 1, false);\n}\n\ntemplate <class Real, class T>\nvoid test_float_ops(const T&) {}\n\ntemplate <class Real>\nvoid test_float_ops(const std::integral_constant<int, boost::multiprecision::number_kind_floating_point>&)\n{\n   BOOST_CHECK_EQUAL(abs(Real(2)), 2);\n   BOOST_CHECK_EQUAL(abs(Real(-2)), 2);\n   BOOST_CHECK_EQUAL(fabs(Real(2)), 2);\n   BOOST_CHECK_EQUAL(fabs(Real(-2)), 2);\n   BOOST_CHECK_EQUAL(floor(Real(5) / 2), 2);\n   BOOST_CHECK_EQUAL(ceil(Real(5) / 2), 3);\n   BOOST_CHECK_EQUAL(floor(Real(-5) / 2), -3);\n   BOOST_CHECK_EQUAL(ceil(Real(-5) / 2), -2);\n   BOOST_CHECK_EQUAL(trunc(Real(5) / 2), 2);\n   BOOST_CHECK_EQUAL(trunc(Real(-5) / 2), -2);\n   //\n   // ldexp and frexp, these pretty much have to be implemented by each backend:\n   //\n   typedef typename Real::backend_type::exponent_type e_type;\n   BOOST_CHECK_EQUAL(ldexp(Real(2), 5), 64);\n   BOOST_CHECK_EQUAL(ldexp(Real(2), -5), Real(2) / 32);\n   Real   v(512);\n   e_type exponent;\n   Real   r = frexp(v, &exponent);\n   BOOST_CHECK_EQUAL(r, 0.5);\n   BOOST_CHECK_EQUAL(exponent, 10);\n   BOOST_CHECK_EQUAL(v, 512);\n   v = 1 / v;\n   r = frexp(v, &exponent);\n   BOOST_CHECK_EQUAL(r, 0.5);\n   BOOST_CHECK_EQUAL(exponent, -8);\n   BOOST_CHECK_EQUAL(ldexp(Real(2), e_type(5)), 64);\n   BOOST_CHECK_EQUAL(ldexp(Real(2), e_type(-5)), Real(2) / 32);\n   v = 512;\n   e_type exp2;\n   r = frexp(v, &exp2);\n   BOOST_CHECK_EQUAL(r, 0.5);\n   BOOST_CHECK_EQUAL(exp2, 10);\n   BOOST_CHECK_EQUAL(v, 512);\n   v = 1 / v;\n   r = frexp(v, &exp2);\n   BOOST_CHECK_EQUAL(r, 0.5);\n   BOOST_CHECK_EQUAL(exp2, -8);\n   //\n   // scalbn and logb, these are the same as ldexp and frexp unless the radix is\n   // something other than 2:\n   //\n   BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::is_specialized && std::numeric_limits<Real>::radix)\n   {\n      BOOST_CHECK_EQUAL(scalbn(Real(2), 5), 2 * pow(double(std::numeric_limits<Real>::radix), 5));\n      BOOST_CHECK_EQUAL(scalbn(Real(2), -5), Real(2) / pow(double(std::numeric_limits<Real>::radix), 5));\n      v        = 512;\n      exponent = ilogb(v);\n      r        = scalbn(v, -exponent);\n      BOOST_CHECK(r >= 1);\n      BOOST_CHECK(r < std::numeric_limits<Real>::radix);\n      BOOST_CHECK_EQUAL(exponent, logb(v));\n      BOOST_CHECK_EQUAL(v, scalbn(r, exponent));\n      v        = 1 / v;\n      exponent = ilogb(v);\n      r        = scalbn(v, -exponent);\n      BOOST_CHECK(r >= 1);\n      BOOST_CHECK(r < std::numeric_limits<Real>::radix);\n      BOOST_CHECK_EQUAL(exponent, logb(v));\n      BOOST_CHECK_EQUAL(v, scalbn(r, exponent));\n   }\n   //\n   // pow and exponent:\n   //\n   #ifndef BOOST_MP_STANDALONE\n   v = 3.25;\n   r = pow(v, 0);\n   BOOST_CHECK_EQUAL(r, 1);\n   r = pow(v, 1);\n   BOOST_CHECK_EQUAL(r, 3.25);\n   r = pow(v, 2);\n   BOOST_CHECK_EQUAL(r, boost::math::pow<2>(3.25));\n   r = pow(v, 3);\n   BOOST_CHECK_EQUAL(r, boost::math::pow<3>(3.25));\n   r = pow(v, 4);\n   BOOST_CHECK_EQUAL(r, boost::math::pow<4>(3.25));\n   r = pow(v, 5);\n   BOOST_CHECK_EQUAL(r, boost::math::pow<5>(3.25));\n   r = pow(v, 6);\n   BOOST_CHECK_EQUAL(r, boost::math::pow<6>(3.25));\n   r = pow(v, 25);\n   BOOST_CHECK_EQUAL(r, boost::math::pow<25>(Real(3.25)));\n   #endif\n\n#ifndef BOOST_NO_EXCEPTIONS\n   //\n   // Things that are expected errors:\n   //\n   BOOST_CHECK_THROW(Real(\"3.14L\"), std::runtime_error);\n   BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::is_specialized)\n   {\n      BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::has_infinity)\n      {\n         #ifndef BOOST_MP_STANDALONE\n         BOOST_CHECK((boost::math::isinf)(Real(20) / 0u));\n         #endif\n      }\n      else\n      {\n         BOOST_CHECK_THROW(r = Real(Real(20) / 0u), std::overflow_error);\n      }\n   }\n#endif\n   //\n   // Comparisons of NaN's should always fail:\n   //\n   BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::has_quiet_NaN)\n   {\n      r = v = std::numeric_limits<Real>::quiet_NaN();\n      compare_NaNs(r, v);\n      v = 0;\n      compare_NaNs(r, v);\n      r.swap(v);\n      compare_NaNs(r, v);\n      //\n      // Conmpare NaN to int:\n      //\n      compare_NaNs(v, 0);\n      compare_NaNs(0, v);\n      //\n      // Compare to floats:\n      //\n      compare_NaNs(v, 0.5);\n      compare_NaNs(0.5, v);\n      BOOST_IF_CONSTEXPR (std::numeric_limits<double>::has_quiet_NaN)\n      {\n         compare_NaNs(r, std::numeric_limits<double>::quiet_NaN());\n         compare_NaNs(std::numeric_limits<double>::quiet_NaN(), r);\n      }\n   }\n\n   //\n   // Operations involving NaN's as one argument:\n   //\n   BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::has_quiet_NaN)\n   {\n      #ifndef BOOST_MP_STANDALONE\n      v = 20.25;\n      r = std::numeric_limits<Real>::quiet_NaN();\n      BOOST_CHECK((boost::math::isnan)(v + r));\n      BOOST_CHECK((boost::math::isnan)(r + v));\n      BOOST_CHECK((boost::math::isnan)(r - v));\n      BOOST_CHECK((boost::math::isnan)(v - r));\n      BOOST_CHECK((boost::math::isnan)(r * v));\n      BOOST_CHECK((boost::math::isnan)(v * r));\n      BOOST_CHECK((boost::math::isnan)(r / v));\n      BOOST_CHECK((boost::math::isnan)(v / r));\n      Real t = v;\n      BOOST_CHECK((boost::math::isnan)(t += r));\n      t = r;\n      BOOST_CHECK((boost::math::isnan)(t += v));\n      t = r;\n      BOOST_CHECK((boost::math::isnan)(t -= v));\n      t = v;\n      BOOST_CHECK((boost::math::isnan)(t -= r));\n      t = r;\n      BOOST_CHECK((boost::math::isnan)(t *= v));\n      t = v;\n      BOOST_CHECK((boost::math::isnan)(t *= r));\n      t = r;\n      BOOST_CHECK((boost::math::isnan)(t /= v));\n      t = v;\n      BOOST_CHECK((boost::math::isnan)(t /= r));\n      #endif\n   }\n   //\n   // Operations involving infinities as one argument:\n   //\n   BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::has_infinity)\n   {\n      v = 20.25;\n      r = std::numeric_limits<Real>::infinity();\n\n      #ifndef BOOST_MP_STANDALONE\n      BOOST_CHECK((boost::math::isinf)(v + r));\n      BOOST_CHECK((boost::math::isinf)(r + v));\n      BOOST_CHECK((boost::math::isinf)(r - v));\n      BOOST_CHECK((boost::math::isinf)(v - r));\n      BOOST_CHECK((boost::math::isinf)(r * v));\n      BOOST_CHECK((boost::math::isinf)(v * r));\n      BOOST_CHECK((boost::math::isinf)(r / v));\n      #endif\n\n      BOOST_CHECK_LT(v - r, 0);\n      BOOST_CHECK_EQUAL(v / r, 0);\n      #ifndef BOOST_MP_STANDALONE\n      Real t = v;\n      BOOST_CHECK((boost::math::isinf)(t += r));\n      t = r;\n      BOOST_CHECK((boost::math::isinf)(t += v));\n      t = r;\n      BOOST_CHECK((boost::math::isinf)(t -= v));\n      t = v;\n      BOOST_CHECK((boost::math::isinf)(t -= r));\n      t = v;\n      BOOST_CHECK(t -= r < 0);\n      t = r;\n      BOOST_CHECK((boost::math::isinf)(t *= v));\n      t = v;\n      BOOST_CHECK((boost::math::isinf)(t *= r));\n      t = r;\n      BOOST_CHECK((boost::math::isinf)(t /= v));\n      t = v;\n      BOOST_CHECK((t /= r) == 0);\n      #endif\n   }\n   //\n   // Operations that should produce NaN as a result:\n   //\n   BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::has_quiet_NaN)\n   {\n      v = r  = 0;\n      Real t = v / r;\n\n      #ifndef BOOST_MP_STANDALONE\n      BOOST_CHECK((boost::math::isnan)(t));\n      v /= r;\n      BOOST_CHECK((boost::math::isnan)(v));\n      t = v / 0;\n      BOOST_CHECK((boost::math::isnan)(v));\n      #endif\n\n      BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::has_infinity)\n      {\n         #ifndef BOOST_MP_STANDALONE\n         v = 0;\n         r = std::numeric_limits<Real>::infinity();\n         t = v * r;\n         if (!boost::multiprecision::is_interval_number<Real>::value)\n         {\n            BOOST_CHECK((boost::math::isnan)(t));\n            t = r * 0;\n            BOOST_CHECK((boost::math::isnan)(t));\n         }\n         v = r;\n         t = r / v;\n         BOOST_CHECK((boost::math::isnan)(t));\n         #endif\n      }\n   }\n\n   test_float_funcs<Real>(std::integral_constant<bool, std::numeric_limits<Real>::is_specialized>());\n}\n\ntemplate <class T>\nstruct lexical_cast_target_type\n{\n   typedef typename std::conditional<\n       boost::multiprecision::detail::is_signed<T>::value && boost::multiprecision::detail::is_integral<T>::value,\n       std::intmax_t,\n       typename std::conditional<\n           boost::multiprecision::detail::is_unsigned<T>::value,\n           std::uintmax_t,\n           T>::type>::type type;\n};\n\ntemplate <class Real, class Num>\nvoid test_negative_mixed_minmax(std::integral_constant<bool, true> const&)\n{\n   if (!std::numeric_limits<Real>::is_bounded || (std::numeric_limits<Real>::digits >= std::numeric_limits<Num>::digits))\n   {\n      Real mx1((std::numeric_limits<Num>::max)() - 1);\n      ++mx1;\n      Real mx2((std::numeric_limits<Num>::max)());\n      BOOST_CHECK_EQUAL(mx1, mx2);\n      mx1 = (std::numeric_limits<Num>::max)() - 1;\n      ++mx1;\n      mx2 = (std::numeric_limits<Num>::max)();\n      BOOST_CHECK_EQUAL(mx1, mx2);\n\n      if (!std::numeric_limits<Real>::is_bounded || (std::numeric_limits<Real>::digits > std::numeric_limits<Num>::digits))\n      {\n         Real mx3((std::numeric_limits<Num>::min)() + 1);\n         --mx3;\n         Real mx4((std::numeric_limits<Num>::min)());\n         BOOST_CHECK_EQUAL(mx3, mx4);\n         mx3 = (std::numeric_limits<Num>::min)() + 1;\n         --mx3;\n         mx4 = (std::numeric_limits<Num>::min)();\n         BOOST_CHECK_EQUAL(mx3, mx4);\n      }\n   }\n}\ntemplate <class Real, class Num>\nvoid test_negative_mixed_minmax(std::integral_constant<bool, false> const&)\n{\n}\n\ntemplate <class Real, class Num>\nvoid test_negative_mixed_numeric_limits(std::integral_constant<bool, true> const&)\n{\n   #ifndef BOOST_MP_STANDALONE\n   typedef typename lexical_cast_target_type<Num>::type target_type;\n#if defined(TEST_MPFR)\n   Num tol = 10 * std::numeric_limits<Num>::epsilon();\n#else\n   Num tol = 0;\n#endif\n   static const int        left_shift      = std::numeric_limits<Num>::digits - 1;\n   Num                     n1              = -static_cast<Num>(1uLL << ((left_shift < 63) && (left_shift > 0) ? left_shift : 10));\n   Num                     n2              = -1;\n   Num                     n3              = 0;\n   Num                     n4              = -20;\n   std::ios_base::fmtflags f               = std::is_floating_point<Num>::value ? std::ios_base::scientific : std::ios_base::fmtflags(0);\n   int                     digits_to_print = std::is_floating_point<Num>::value && std::numeric_limits<Num>::is_specialized\n                             ? std::numeric_limits<Num>::digits10 + 5\n                             : 0;\n   BOOST_IF_CONSTEXPR (std::numeric_limits<target_type>::digits <= std::numeric_limits<Real>::digits)\n   {\n      BOOST_CHECK_CLOSE(n1, checked_lexical_cast<target_type>(Real(n1).str(digits_to_print, f)), tol);\n   }\n   BOOST_CHECK_CLOSE(n2, checked_lexical_cast<target_type>(Real(n2).str(digits_to_print, f)), 0);\n   BOOST_CHECK_CLOSE(n3, checked_lexical_cast<target_type>(Real(n3).str(digits_to_print, f)), 0);\n   BOOST_CHECK_CLOSE(n4, checked_lexical_cast<target_type>(Real(n4).str(digits_to_print, f)), 0);\n   #endif\n}\n\ntemplate <class Real, class Num>\nvoid test_negative_mixed_numeric_limits(std::integral_constant<bool, false> const&) {}\n\ntemplate <class Real, class Num>\nvoid test_negative_mixed(std::integral_constant<bool, true> const&)\n{\n   typedef typename std::conditional<\n       std::is_convertible<Num, Real>::value,\n       typename std::conditional<boost::multiprecision::detail::is_integral<Num>::value && (sizeof(Num) < sizeof(int)), int, Num>::type,\n       Real>::type cast_type;\n   typedef typename std::conditional<\n       std::is_convertible<Num, Real>::value,\n       Num,\n       Real>::type simple_cast_type;\n   std::cout << \"Testing mixed arithmetic with type: \" << name_of<Real>() << \" and \" << name_of<Num>() << std::endl;\n   static const int left_shift = std::numeric_limits<Num>::digits - 1;\n   Num              n1         = -static_cast<Num>(1uLL << ((left_shift < 63) && (left_shift > 0) ? left_shift : 10));\n   Num              n2         = -1;\n   Num              n3         = 0;\n   Num              n4         = -20;\n   Num              n5         = -8;\n\n   test_comparisons<Real>(n1, n2, std::is_convertible<Num, Real>());\n   test_comparisons<Real>(n1, n3, std::is_convertible<Num, Real>());\n   test_comparisons<Real>(n3, n1, std::is_convertible<Num, Real>());\n   test_comparisons<Real>(n2, n1, std::is_convertible<Num, Real>());\n   test_comparisons<Real>(n1, n1, std::is_convertible<Num, Real>());\n   test_comparisons<Real>(n3, n3, std::is_convertible<Num, Real>());\n\n   // Default construct:\n   BOOST_CHECK_EQUAL(Real(n1), static_cast<cast_type>(n1));\n   BOOST_CHECK_EQUAL(Real(n2), static_cast<cast_type>(n2));\n   BOOST_CHECK_EQUAL(Real(n3), static_cast<cast_type>(n3));\n   BOOST_CHECK_EQUAL(Real(n4), static_cast<cast_type>(n4));\n   BOOST_CHECK_EQUAL(static_cast<cast_type>(n1), Real(n1));\n   BOOST_CHECK_EQUAL(static_cast<cast_type>(n2), Real(n2));\n   BOOST_CHECK_EQUAL(static_cast<cast_type>(n3), Real(n3));\n   BOOST_CHECK_EQUAL(static_cast<cast_type>(n4), Real(n4));\n   BOOST_CHECK_EQUAL(Real(n1).template convert_to<Num>(), n1);\n   BOOST_CHECK_EQUAL(Real(n2).template convert_to<Num>(), n2);\n   BOOST_CHECK_EQUAL(Real(n3).template convert_to<Num>(), n3);\n   BOOST_CHECK_EQUAL(Real(n4).template convert_to<Num>(), n4);\n   BOOST_CHECK_EQUAL(static_cast<Num>(Real(n1)), n1);\n   BOOST_CHECK_EQUAL(static_cast<Num>(Real(n2)), n2);\n   BOOST_CHECK_EQUAL(static_cast<Num>(Real(n3)), n3);\n   BOOST_CHECK_EQUAL(static_cast<Num>(Real(n4)), n4);\n   // Conversions when source is an expression template:\n   BOOST_CHECK_EQUAL((Real(n1) + 0).template convert_to<Num>(), n1);\n   BOOST_CHECK_EQUAL((Real(n2) + 0).template convert_to<Num>(), n2);\n   BOOST_CHECK_EQUAL((Real(n3) + 0).template convert_to<Num>(), n3);\n   BOOST_CHECK_EQUAL((Real(n4) + 0).template convert_to<Num>(), n4);\n   BOOST_CHECK_EQUAL(static_cast<Num>((Real(n1) + 0)), n1);\n   BOOST_CHECK_EQUAL(static_cast<Num>((Real(n2) + 0)), n2);\n   BOOST_CHECK_EQUAL(static_cast<Num>((Real(n3) + 0)), n3);\n   BOOST_CHECK_EQUAL(static_cast<Num>((Real(n4) + 0)), n4);\n   test_negative_mixed_numeric_limits<Real, Num>(std::integral_constant<bool, std::numeric_limits<Real>::is_specialized && std::numeric_limits<Num>::is_specialized>());\n   // Assignment:\n   Real r(0);\n   BOOST_CHECK(r != static_cast<cast_type>(n1));\n   r = static_cast<simple_cast_type>(n1);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n1));\n   r = static_cast<simple_cast_type>(n2);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n2));\n   r = static_cast<simple_cast_type>(n3);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n3));\n   r = static_cast<simple_cast_type>(n4);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4));\n   // Addition:\n   r = static_cast<simple_cast_type>(n2);\n   BOOST_CHECK_EQUAL(r + static_cast<simple_cast_type>(n4), static_cast<cast_type>(n2 + n4));\n   BOOST_CHECK_EQUAL(Real(r + static_cast<simple_cast_type>(n4)), static_cast<cast_type>(n2 + n4));\n   r += static_cast<simple_cast_type>(n4);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n2 + n4));\n   // subtraction:\n   r = static_cast<simple_cast_type>(n4);\n   BOOST_CHECK_EQUAL(r - static_cast<simple_cast_type>(n5), static_cast<cast_type>(n4 - n5));\n   BOOST_CHECK_EQUAL(Real(r - static_cast<simple_cast_type>(n5)), static_cast<cast_type>(n4 - n5));\n   r -= static_cast<simple_cast_type>(n5);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4 - n5));\n   // Multiplication:\n   r = static_cast<simple_cast_type>(n2);\n   BOOST_CHECK_EQUAL(r * static_cast<simple_cast_type>(n4), static_cast<cast_type>(n2 * n4));\n   BOOST_CHECK_EQUAL(Real(r * static_cast<simple_cast_type>(n4)), static_cast<cast_type>(n2 * n4));\n   r *= static_cast<simple_cast_type>(n4);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n2 * n4));\n   // Division:\n   r = static_cast<simple_cast_type>(n1);\n   BOOST_CHECK_EQUAL(r / static_cast<simple_cast_type>(n5), static_cast<cast_type>(n1 / n5));\n   BOOST_CHECK_EQUAL(Real(r / static_cast<simple_cast_type>(n5)), static_cast<cast_type>(n1 / n5));\n   r /= static_cast<simple_cast_type>(n5);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n1 / n5));\n   //\n   // Extra cases for full coverage:\n   //\n   r = Real(n4) + static_cast<simple_cast_type>(n5);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4 + n5));\n   r = static_cast<simple_cast_type>(n4) + Real(n5);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4 + n5));\n   r = Real(n4) - static_cast<simple_cast_type>(n5);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4 - n5));\n   r = static_cast<simple_cast_type>(n4) - Real(n5);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4 - n5));\n   r = static_cast<simple_cast_type>(n4) * Real(n5);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4 * n5));\n   r = static_cast<cast_type>(Num(4) * n4) / Real(4);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4));\n\n   Real a, b, c;\n   a = 20;\n   b = 30;\n   c = -a + b;\n   BOOST_CHECK_EQUAL(c, 10);\n   c = b + -a;\n   BOOST_CHECK_EQUAL(c, 10);\n   n4 = 30;\n   c  = -a + static_cast<cast_type>(n4);\n   BOOST_CHECK_EQUAL(c, 10);\n   c = static_cast<cast_type>(n4) + -a;\n   BOOST_CHECK_EQUAL(c, 10);\n   c = -a + -b;\n   BOOST_CHECK_EQUAL(c, -50);\n   n4 = 4;\n   c  = -(a + b) + static_cast<cast_type>(n4);\n   BOOST_CHECK_EQUAL(c, -50 + 4);\n   n4 = 50;\n   c  = (a + b) - static_cast<cast_type>(n4);\n   BOOST_CHECK_EQUAL(c, 0);\n   c = (a + b) - static_cast<cast_type>(n4);\n   BOOST_CHECK_EQUAL(c, 0);\n   c = a - -(b + static_cast<cast_type>(n4));\n   BOOST_CHECK_EQUAL(c, 20 - -(30 + 50));\n   c = -(b + static_cast<cast_type>(n4)) - a;\n   BOOST_CHECK_EQUAL(c, -(30 + 50) - 20);\n   c = a - -b;\n   BOOST_CHECK_EQUAL(c, 50);\n   c = -a - b;\n   BOOST_CHECK_EQUAL(c, -50);\n   c = -a - static_cast<cast_type>(n4);\n   BOOST_CHECK_EQUAL(c, -20 - 50);\n   c = static_cast<cast_type>(n4) - -a;\n   BOOST_CHECK_EQUAL(c, 50 + 20);\n   c = -(a + b) - Real(n4);\n   BOOST_CHECK_EQUAL(c, -(20 + 30) - 50);\n   c = static_cast<cast_type>(n4) - (a + b);\n   BOOST_CHECK_EQUAL(c, 0);\n   c = (a + b) * static_cast<cast_type>(n4);\n   BOOST_CHECK_EQUAL(c, 50 * 50);\n   c = static_cast<cast_type>(n4) * (a + b);\n   BOOST_CHECK_EQUAL(c, 50 * 50);\n   c = a * -(b + static_cast<cast_type>(n4));\n   BOOST_CHECK_EQUAL(c, 20 * -(30 + 50));\n   c = -(b + static_cast<cast_type>(n4)) * a;\n   BOOST_CHECK_EQUAL(c, 20 * -(30 + 50));\n   c = a * -b;\n   BOOST_CHECK_EQUAL(c, 20 * -30);\n   c = -a * b;\n   BOOST_CHECK_EQUAL(c, 20 * -30);\n   c = -a * static_cast<cast_type>(n4);\n   BOOST_CHECK_EQUAL(c, -20 * 50);\n   c = static_cast<cast_type>(n4) * -a;\n   BOOST_CHECK_EQUAL(c, -20 * 50);\n   c = -(a + b) + a;\n   BOOST_CHECK(-50 + 20);\n   c = static_cast<cast_type>(n4) - (a + b);\n   BOOST_CHECK_EQUAL(c, 0);\n   Real d = 10;\n   c      = (a + b) / d;\n   BOOST_CHECK_EQUAL(c, 5);\n   c = (a + b) / (d + 0);\n   BOOST_CHECK_EQUAL(c, 5);\n   c = (a + b) / static_cast<cast_type>(n4);\n   BOOST_CHECK_EQUAL(c, 1);\n   c = static_cast<cast_type>(n4) / (a + b);\n   BOOST_CHECK_EQUAL(c, 1);\n   d = 50;\n   c = d / -(a + b);\n   BOOST_CHECK_EQUAL(c, -1);\n   c = -(a + b) / d;\n   BOOST_CHECK_EQUAL(c, -1);\n   d = 2;\n   c = a / -d;\n   BOOST_CHECK_EQUAL(c, 20 / -2);\n   c = -a / d;\n   BOOST_CHECK_EQUAL(c, 20 / -2);\n   d = 50;\n   c = -d / static_cast<cast_type>(n4);\n   BOOST_CHECK_EQUAL(c, -1);\n   c = static_cast<cast_type>(n4) / -d;\n   BOOST_CHECK_EQUAL(c, -1);\n   c = static_cast<cast_type>(n4) + a;\n   BOOST_CHECK_EQUAL(c, 70);\n   c = static_cast<cast_type>(n4) - a;\n   BOOST_CHECK_EQUAL(c, 30);\n   c = static_cast<cast_type>(n4) * a;\n   BOOST_CHECK_EQUAL(c, 50 * 20);\n\n   n1 = -2;\n   n2 = -3;\n   n3 = -4;\n   a  = static_cast<cast_type>(n1);\n   b  = static_cast<cast_type>(n2);\n   c  = static_cast<cast_type>(n3);\n   d  = a + b * c;\n   BOOST_CHECK_EQUAL(d, -2 + -3 * -4);\n   d = static_cast<cast_type>(n1) + b * c;\n   BOOST_CHECK_EQUAL(d, -2 + -3 * -4);\n   d = a + static_cast<cast_type>(n2) * c;\n   BOOST_CHECK_EQUAL(d, -2 + -3 * -4);\n   d = a + b * static_cast<cast_type>(n3);\n   BOOST_CHECK_EQUAL(d, -2 + -3 * -4);\n   d = static_cast<cast_type>(n1) + static_cast<cast_type>(n2) * c;\n   BOOST_CHECK_EQUAL(d, -2 + -3 * -4);\n   d = static_cast<cast_type>(n1) + b * static_cast<cast_type>(n3);\n   BOOST_CHECK_EQUAL(d, -2 + -3 * -4);\n   a += static_cast<cast_type>(n2) * c;\n   BOOST_CHECK_EQUAL(a, -2 + -3 * -4);\n   a = static_cast<cast_type>(n1);\n   a += b * static_cast<cast_type>(n3);\n   BOOST_CHECK_EQUAL(a, -2 + -3 * -4);\n   a = static_cast<cast_type>(n1);\n\n   d = b * c + a;\n   BOOST_CHECK_EQUAL(d, -2 + -3 * -4);\n   d = b * c + static_cast<cast_type>(n1);\n   BOOST_CHECK_EQUAL(d, -2 + -3 * -4);\n   d = static_cast<cast_type>(n2) * c + a;\n   BOOST_CHECK_EQUAL(d, -2 + -3 * -4);\n   d = b * static_cast<cast_type>(n3) + a;\n   BOOST_CHECK_EQUAL(d, -2 + -3 * -4);\n   d = static_cast<cast_type>(n2) * c + static_cast<cast_type>(n1);\n   BOOST_CHECK_EQUAL(d, -2 + -3 * -4);\n   d = b * static_cast<cast_type>(n3) + static_cast<cast_type>(n1);\n   BOOST_CHECK_EQUAL(d, -2 + -3 * -4);\n\n   a = -20;\n   d = a - b * c;\n   BOOST_CHECK_EQUAL(d, -20 - -3 * -4);\n   n1 = -20;\n   d  = static_cast<cast_type>(n1) - b * c;\n   BOOST_CHECK_EQUAL(d, -20 - -3 * -4);\n   d = a - static_cast<cast_type>(n2) * c;\n   BOOST_CHECK_EQUAL(d, -20 - -3 * -4);\n   d = a - b * static_cast<cast_type>(n3);\n   BOOST_CHECK_EQUAL(d, -20 - -3 * -4);\n   d = static_cast<cast_type>(n1) - static_cast<cast_type>(n2) * c;\n   BOOST_CHECK_EQUAL(d, -20 - -3 * -4);\n   d = static_cast<cast_type>(n1) - b * static_cast<cast_type>(n3);\n   BOOST_CHECK_EQUAL(d, -20 - -3 * -4);\n   a -= static_cast<cast_type>(n2) * c;\n   BOOST_CHECK_EQUAL(a, -20 - -3 * -4);\n   a = static_cast<cast_type>(n1);\n   a -= b * static_cast<cast_type>(n3);\n   BOOST_CHECK_EQUAL(a, -20 - -3 * -4);\n\n   a = -2;\n   d = b * c - a;\n   BOOST_CHECK_EQUAL(d, -3 * -4 - -2);\n   n1 = -2;\n   d  = b * c - static_cast<cast_type>(n1);\n   BOOST_CHECK_EQUAL(d, -3 * -4 - -2);\n   d = static_cast<cast_type>(n2) * c - a;\n   BOOST_CHECK_EQUAL(d, -3 * -4 - -2);\n   d = b * static_cast<cast_type>(n3) - a;\n   BOOST_CHECK_EQUAL(d, -3 * -4 - -2);\n   d = static_cast<cast_type>(n2) * c - static_cast<cast_type>(n1);\n   BOOST_CHECK_EQUAL(d, -3 * -4 - -2);\n   d = b * static_cast<cast_type>(n3) - static_cast<cast_type>(n1);\n   BOOST_CHECK_EQUAL(d, -3 * -4 - -2);\n   //\n   // Conversion from min and max values:\n   //\n   test_negative_mixed_minmax<Real, Num>(std::integral_constant<bool, std::numeric_limits<Real>::is_integer && std::numeric_limits<Num>::is_integer > ());\n   //\n   // RValue ref overloads:\n   //\n   a  = 2;\n   n1 = 3;\n   d  = -a + static_cast<cast_type>(n1);\n   BOOST_CHECK_EQUAL(d, 1);\n   d = static_cast<cast_type>(n1) + -a;\n   BOOST_CHECK_EQUAL(d, 1);\n   d = -a - static_cast<cast_type>(n1);\n   BOOST_CHECK_EQUAL(d, -5);\n   d = static_cast<cast_type>(n1) - -a;\n   BOOST_CHECK_EQUAL(d, 5);\n   d = -a * static_cast<cast_type>(n1);\n   BOOST_CHECK_EQUAL(d, -6);\n   d = static_cast<cast_type>(n1) * -a;\n   BOOST_CHECK_EQUAL(d, -6);\n   n1 = 4;\n   d  = -static_cast<cast_type>(n1) / a;\n   BOOST_CHECK_EQUAL(d, -2);\n   d = static_cast<cast_type>(n1) / -a;\n   BOOST_CHECK_EQUAL(d, -2);\n}\n\ntemplate <class Real, class Num>\nvoid test_negative_mixed(std::integral_constant<bool, false> const&)\n{\n}\n\ntemplate <class Real, class Num>\nvoid test_mixed(const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class Real>\ninline bool check_is_nan(const Real& val, const std::integral_constant<bool, true>&)\n{\n   #ifndef BOOST_MP_STANDALONE\n   return (boost::math::isnan)(val);\n   #else\n   return true; // Avoids warnings. This functionality is never used in standalone mode\n   #endif\n}\ntemplate <class Real>\ninline bool check_is_nan(const Real&, const std::integral_constant<bool, false>&)\n{\n   return false;\n}\ntemplate <class Real>\ninline Real negate_value(const Real& val, const std::integral_constant<bool, true>&)\n{\n   return -val;\n}\ntemplate <class Real>\ninline Real negate_value(const Real& val, const std::integral_constant<bool, false>&)\n{\n   return val;\n}\n\ntemplate <class Real, class Num>\nvoid test_mixed_numeric_limits(const std::integral_constant<bool, true>&)\n{\n   #ifndef BOOST_MP_STANDALONE\n   typedef typename lexical_cast_target_type<Num>::type target_type;\n#if defined(TEST_MPFR)\n   Num tol = 10 * std::numeric_limits<Num>::epsilon();\n#else\n   Num tol = 0;\n#endif\n\n   Real d;\n   BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::has_infinity && std::numeric_limits<Num>::has_infinity)\n   {\n      d = static_cast<Real>(std::numeric_limits<Num>::infinity());\n      BOOST_CHECK_GT(d, (std::numeric_limits<Real>::max)());\n      d = static_cast<Real>(negate_value(std::numeric_limits<Num>::infinity(), std::integral_constant<bool, std::numeric_limits<Num>::is_signed>()));\n      BOOST_CHECK_LT(d, negate_value((std::numeric_limits<Real>::max)(), std::integral_constant<bool, std::numeric_limits<Real>::is_signed>()));\n   }\n   BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::has_quiet_NaN && std::numeric_limits<Num>::has_quiet_NaN)\n   {\n      #ifndef BOOST_MP_STANDALONE\n      d = static_cast<Real>(std::numeric_limits<Num>::quiet_NaN());\n      BOOST_CHECK(check_is_nan(d, std::integral_constant<bool, std::numeric_limits<Real>::has_quiet_NaN>()));\n      d = static_cast<Real>(negate_value(std::numeric_limits<Num>::quiet_NaN(), std::integral_constant<bool, std::numeric_limits<Num>::is_signed>()));\n      BOOST_CHECK(check_is_nan(d, std::integral_constant<bool, std::numeric_limits<Real>::has_quiet_NaN>()));\n      #endif\n   }\n\n   static const int left_shift = std::numeric_limits<Num>::digits - 1;\n   Num              n1         = static_cast<Num>(1uLL << ((left_shift < 63) && (left_shift > 0) ? left_shift : 10));\n   Num              n2         = 1;\n   Num              n3         = 0;\n   Num              n4         = 20;\n\n   std::ios_base::fmtflags f               = std::is_floating_point<Num>::value ? std::ios_base::scientific : std::ios_base::fmtflags(0);\n   int                     digits_to_print = std::is_floating_point<Num>::value && std::numeric_limits<Num>::is_specialized\n                             ? std::numeric_limits<Num>::digits10 + 5\n                             : 0;\n   BOOST_IF_CONSTEXPR (std::numeric_limits<target_type>::digits <= std::numeric_limits<Real>::digits)\n   {\n      BOOST_CHECK_CLOSE(n1, checked_lexical_cast<target_type>(Real(n1).str(digits_to_print, f)), tol);\n   }\n   BOOST_CHECK_CLOSE(n2, checked_lexical_cast<target_type>(Real(n2).str(digits_to_print, f)), 0);\n   BOOST_CHECK_CLOSE(n3, checked_lexical_cast<target_type>(Real(n3).str(digits_to_print, f)), 0);\n   BOOST_CHECK_CLOSE(n4, checked_lexical_cast<target_type>(Real(n4).str(digits_to_print, f)), 0);\n   #endif // BOOST_MP_STANDALONE\n}\ntemplate <class Real, class Num>\nvoid test_mixed_numeric_limits(const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class Num>\nstruct is_definitely_unsigned_int\n    : public std::integral_constant<bool, std::numeric_limits<Num>::is_specialized && !std::numeric_limits<Num>::is_signed>\n{};\n#ifdef BOOST_HAS_INT128\ntemplate <>\nstruct is_definitely_unsigned_int<boost::uint128_type>\n    : public std::true_type\n{};\n#endif\n\ntemplate <class Real, class Num>\nvoid test_mixed_rational(const std::true_type&)\n{\n   Real rat(2, 3);\n   Num  zero(0);\n   BOOST_CHECK_EQUAL(rat * zero, zero);\n   rat *= zero;\n   BOOST_CHECK_EQUAL(rat, zero);\n   rat = Real(2, 3);\n#ifndef BOOST_NO_CXX17_IF_CONSTEXPR\n   BOOST_IF_CONSTEXPR(std::is_floating_point<Num>::value)\n   {\n      Real rat2;\n      Num  f = 0.5f;\n      rat2   = rat * f;\n      BOOST_CHECK_EQUAL(rat2, rat * Real(1, 2));\n      rat2   = f * rat;\n      BOOST_CHECK_EQUAL(rat2, rat * Real(1, 2));\n      rat2   = rat / f;\n      BOOST_CHECK_EQUAL(rat2, rat / Real(1, 2));\n      rat2   = f / rat;\n      BOOST_CHECK_EQUAL(rat2, Real(1, 2) / rat);\n      rat2 = rat + f;\n      BOOST_CHECK_EQUAL(rat2, rat + Real(1, 2));\n      rat2 = f + rat;\n      BOOST_CHECK_EQUAL(rat2, rat + Real(1, 2));\n      rat2 = rat - f;\n      BOOST_CHECK_EQUAL(rat2, rat - Real(1, 2));\n      f    = 1.5f;\n      rat2 = f - rat;\n      BOOST_CHECK_EQUAL(rat2, Real(3, 2) - rat);\n   }\n#endif\n}\ntemplate <class Real, class Num>\nvoid test_mixed_rational(const std::false_type&)\n{\n}\n\ntemplate <class Real, class Num>\nvoid test_mixed(const std::integral_constant<bool, true>&)\n{\n   typedef typename std::conditional<\n       std::is_convertible<Num, Real>::value,\n       typename std::conditional<boost::multiprecision::detail::is_integral<Num>::value && (sizeof(Num) < sizeof(int)), int, Num>::type,\n       Real>::type cast_type;\n   typedef typename std::conditional<\n       std::is_convertible<Num, Real>::value,\n       Num,\n       Real>::type simple_cast_type;\n\n   BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::is_specialized && std::numeric_limits<Real>::is_bounded && std::numeric_limits<Real>::digits < std::numeric_limits<Num>::digits)\n      return;\n\n   std::cout << \"Testing mixed arithmetic with type: \" << name_of<Real>() << \" and \" << name_of<Num>() << std::endl;\n   static const int left_shift = std::numeric_limits<Num>::digits - 1;\n   Num              n1         = static_cast<Num>(1uLL << ((left_shift < 63) && (left_shift > 0) ? left_shift : 10));\n   Num              n2         = 1;\n   Num              n3         = 0;\n   Num              n4         = 20;\n   Num              n5         = 8;\n\n   test_comparisons<Real>(n1, n2, std::is_convertible<Num, Real>());\n   test_comparisons<Real>(n1, n3, std::is_convertible<Num, Real>());\n   test_comparisons<Real>(n1, n1, std::is_convertible<Num, Real>());\n   test_comparisons<Real>(n3, n1, std::is_convertible<Num, Real>());\n   test_comparisons<Real>(n2, n1, std::is_convertible<Num, Real>());\n   test_comparisons<Real>(n3, n3, std::is_convertible<Num, Real>());\n\n   // Default construct:\n   BOOST_CHECK_EQUAL(Real(n1), static_cast<cast_type>(n1));\n   BOOST_CHECK_EQUAL(Real(n2), static_cast<cast_type>(n2));\n   BOOST_CHECK_EQUAL(Real(n3), static_cast<cast_type>(n3));\n   BOOST_CHECK_EQUAL(Real(n4), static_cast<cast_type>(n4));\n   BOOST_CHECK_EQUAL(Real(n1).template convert_to<Num>(), n1);\n   BOOST_CHECK_EQUAL(Real(n2).template convert_to<Num>(), n2);\n   BOOST_CHECK_EQUAL(Real(n3).template convert_to<Num>(), n3);\n   BOOST_CHECK_EQUAL(Real(n4).template convert_to<Num>(), n4);\n   BOOST_CHECK_EQUAL(static_cast<Num>(Real(n1)), n1);\n   BOOST_CHECK_EQUAL(static_cast<Num>(Real(n2)), n2);\n   BOOST_CHECK_EQUAL(static_cast<Num>(Real(n3)), n3);\n   BOOST_CHECK_EQUAL(static_cast<Num>(Real(n4)), n4);\n   // Again with expression templates:\n   BOOST_CHECK_EQUAL((Real(n1) + 0).template convert_to<Num>(), n1);\n   BOOST_CHECK_EQUAL((Real(n2) + 0).template convert_to<Num>(), n2);\n   BOOST_CHECK_EQUAL((Real(n3) + 0).template convert_to<Num>(), n3);\n   BOOST_CHECK_EQUAL((Real(n4) + 0).template convert_to<Num>(), n4);\n   BOOST_CHECK_EQUAL(static_cast<Num>(Real(n1) + 0), n1);\n   BOOST_CHECK_EQUAL(static_cast<Num>(Real(n2) + 0), n2);\n   BOOST_CHECK_EQUAL(static_cast<Num>(Real(n3) + 0), n3);\n   BOOST_CHECK_EQUAL(static_cast<Num>(Real(n4) + 0), n4);\n   BOOST_CHECK_EQUAL(static_cast<cast_type>(n1), Real(n1));\n   BOOST_CHECK_EQUAL(static_cast<cast_type>(n2), Real(n2));\n   BOOST_CHECK_EQUAL(static_cast<cast_type>(n3), Real(n3));\n   BOOST_CHECK_EQUAL(static_cast<cast_type>(n4), Real(n4));\n   // Assignment:\n   Real r(0);\n   BOOST_CHECK(r != static_cast<cast_type>(n1));\n   r = static_cast<simple_cast_type>(n1);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n1));\n   r = static_cast<simple_cast_type>(n2);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n2));\n   r = static_cast<simple_cast_type>(n3);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n3));\n   r = static_cast<simple_cast_type>(n4);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4));\n   // Addition:\n   r = static_cast<simple_cast_type>(n2);\n   BOOST_CHECK_EQUAL(r + static_cast<simple_cast_type>(n4), static_cast<cast_type>(n2 + n4));\n   BOOST_CHECK_EQUAL(Real(r + static_cast<simple_cast_type>(n4)), static_cast<cast_type>(n2 + n4));\n   r += static_cast<simple_cast_type>(n4);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n2 + n4));\n   // subtraction:\n   r = static_cast<simple_cast_type>(n4);\n   BOOST_CHECK_EQUAL(r - static_cast<simple_cast_type>(n5), static_cast<cast_type>(n4 - n5));\n   BOOST_CHECK_EQUAL(Real(r - static_cast<simple_cast_type>(n5)), static_cast<cast_type>(n4 - n5));\n   r -= static_cast<simple_cast_type>(n5);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4 - n5));\n   // Multiplication:\n   r = static_cast<simple_cast_type>(n2);\n   BOOST_CHECK_EQUAL(r * static_cast<simple_cast_type>(n4), static_cast<cast_type>(n2 * n4));\n   BOOST_CHECK_EQUAL(Real(r * static_cast<simple_cast_type>(n4)), static_cast<cast_type>(n2 * n4));\n   r *= static_cast<simple_cast_type>(n4);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n2 * n4));\n   // Division:\n   r = static_cast<simple_cast_type>(n1);\n   BOOST_CHECK_EQUAL(r / static_cast<simple_cast_type>(n5), static_cast<cast_type>(n1 / n5));\n   BOOST_CHECK_EQUAL(Real(r / static_cast<simple_cast_type>(n5)), static_cast<cast_type>(n1 / n5));\n   r /= static_cast<simple_cast_type>(n5);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n1 / n5));\n   //\n   // special cases for full coverage:\n   //\n   r = static_cast<simple_cast_type>(n5) + Real(n4);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4 + n5));\n   r = static_cast<simple_cast_type>(n4) - Real(n5);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4 - n5));\n   r = static_cast<simple_cast_type>(n4) * Real(n5);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4 * n5));\n   r = static_cast<cast_type>(Num(4) * n4) / Real(4);\n   BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4));\n\n   typedef std::integral_constant<bool,\n       (!std::numeric_limits<Num>::is_specialized || std::numeric_limits<Num>::is_signed)\n      && (!std::numeric_limits<Real>::is_specialized || std::numeric_limits<Real>::is_signed)\n      && !is_definitely_unsigned_int<Num>::value>\n       signed_tag;\n\n   test_negative_mixed<Real, Num>(signed_tag());\n\n   n1 = 2;\n   n2 = 3;\n   n3 = 4;\n   Real a(n1), b(n2), c(n3), d;\n   d = a + b * c;\n   BOOST_CHECK_EQUAL(d, 2 + 3 * 4);\n   d = static_cast<cast_type>(n1) + b * c;\n   BOOST_CHECK_EQUAL(d, 2 + 3 * 4);\n   d = a + static_cast<cast_type>(n2) * c;\n   BOOST_CHECK_EQUAL(d, 2 + 3 * 4);\n   d = a + b * static_cast<cast_type>(n3);\n   BOOST_CHECK_EQUAL(d, 2 + 3 * 4);\n   d = static_cast<cast_type>(n1) + static_cast<cast_type>(n2) * c;\n   BOOST_CHECK_EQUAL(d, 2 + 3 * 4);\n   d = static_cast<cast_type>(n1) + b * static_cast<cast_type>(n3);\n   BOOST_CHECK_EQUAL(d, 2 + 3 * 4);\n   a += static_cast<cast_type>(n2) * c;\n   BOOST_CHECK_EQUAL(a, 2 + 3 * 4);\n   a = static_cast<cast_type>(n1);\n   a += b * static_cast<cast_type>(n3);\n   BOOST_CHECK_EQUAL(a, 2 + 3 * 4);\n   a = static_cast<cast_type>(n1);\n\n   d = b * c + a;\n   BOOST_CHECK_EQUAL(d, 2 + 3 * 4);\n   d = b * c + static_cast<cast_type>(n1);\n   BOOST_CHECK_EQUAL(d, 2 + 3 * 4);\n   d = static_cast<cast_type>(n2) * c + a;\n   BOOST_CHECK_EQUAL(d, 2 + 3 * 4);\n   d = b * static_cast<cast_type>(n3) + a;\n   BOOST_CHECK_EQUAL(d, 2 + 3 * 4);\n   d = static_cast<cast_type>(n2) * c + static_cast<cast_type>(n1);\n   BOOST_CHECK_EQUAL(d, 2 + 3 * 4);\n   d = b * static_cast<cast_type>(n3) + static_cast<cast_type>(n1);\n   BOOST_CHECK_EQUAL(d, 2 + 3 * 4);\n\n   a = 20;\n   d = a - b * c;\n   BOOST_CHECK_EQUAL(d, 20 - 3 * 4);\n   n1 = 20;\n   d  = static_cast<cast_type>(n1) - b * c;\n   BOOST_CHECK_EQUAL(d, 20 - 3 * 4);\n   d = a - static_cast<cast_type>(n2) * c;\n   BOOST_CHECK_EQUAL(d, 20 - 3 * 4);\n   d = a - b * static_cast<cast_type>(n3);\n   BOOST_CHECK_EQUAL(d, 20 - 3 * 4);\n   d = static_cast<cast_type>(n1) - static_cast<cast_type>(n2) * c;\n   BOOST_CHECK_EQUAL(d, 20 - 3 * 4);\n   d = static_cast<cast_type>(n1) - b * static_cast<cast_type>(n3);\n   BOOST_CHECK_EQUAL(d, 20 - 3 * 4);\n   a -= static_cast<cast_type>(n2) * c;\n   BOOST_CHECK_EQUAL(a, 20 - 3 * 4);\n   a = static_cast<cast_type>(n1);\n   a -= b * static_cast<cast_type>(n3);\n   BOOST_CHECK_EQUAL(a, 20 - 3 * 4);\n\n   a = 2;\n   d = b * c - a;\n   BOOST_CHECK_EQUAL(d, 3 * 4 - 2);\n   n1 = 2;\n   d  = b * c - static_cast<cast_type>(n1);\n   BOOST_CHECK_EQUAL(d, 3 * 4 - 2);\n   d = static_cast<cast_type>(n2) * c - a;\n   BOOST_CHECK_EQUAL(d, 3 * 4 - 2);\n   d = b * static_cast<cast_type>(n3) - a;\n   BOOST_CHECK_EQUAL(d, 3 * 4 - a);\n   d = static_cast<cast_type>(n2) * c - static_cast<cast_type>(n1);\n   BOOST_CHECK_EQUAL(d, 3 * 4 - 2);\n   d = b * static_cast<cast_type>(n3) - static_cast<cast_type>(n1);\n   BOOST_CHECK_EQUAL(d, 3 * 4 - 2);\n\n   test_mixed_numeric_limits<Real, Num>(std::integral_constant < bool, std::numeric_limits<Real>::is_specialized && std::numeric_limits<Num>::is_specialized > ());\n   test_mixed_rational<Real, Num>(std::integral_constant<bool, boost::multiprecision::number_category<Real>::value == boost::multiprecision::number_kind_rational>());\n}\n\ntemplate <class Real>\ntypename std::enable_if<boost::multiprecision::number_category<Real>::value == boost::multiprecision::number_kind_complex>::type test_members(Real)\n{\n   //\n   // Test sign and zero functions:\n   //\n   Real a = 20;\n   Real b = 30;\n   BOOST_CHECK(!a.is_zero());\n   a = -20;\n   BOOST_CHECK(!a.is_zero());\n   a = 0;\n   BOOST_CHECK(a.is_zero());\n\n   a = 20;\n   b = 30;\n   a.swap(b);\n   BOOST_CHECK_EQUAL(a, 30);\n   BOOST_CHECK_EQUAL(b, 20);\n\n   Real c(2, 3);\n\n   BOOST_CHECK_EQUAL(a.real(), 30);\n   BOOST_CHECK_EQUAL(a.imag(), 0);\n   BOOST_CHECK_EQUAL(c.real(), 2);\n   BOOST_CHECK_EQUAL(c.imag(), 3);\n\n   //\n   // try some more 2-argument constructors:\n   //\n   {\n      Real d(40.5, 2);\n      BOOST_CHECK_EQUAL(d.real(), 40.5);\n      BOOST_CHECK_EQUAL(d.imag(), 2);\n   }\n   {\n      Real d(\"40.5\", \"2\");\n      BOOST_CHECK_EQUAL(d.real(), 40.5);\n      BOOST_CHECK_EQUAL(d.imag(), 2);\n   }\n   {\n      Real d(\"40.5\", std::string(\"2\"));\n      BOOST_CHECK_EQUAL(d.real(), 40.5);\n      BOOST_CHECK_EQUAL(d.imag(), 2);\n   }\n#ifndef BOOST_NO_CXX17_HDR_STRING_VIEW\n   {\n      std::string      sx(\"40.550\"), sy(\"222\");\n      std::string_view vx(sx.c_str(), 4), vy(sy.c_str(), 1);\n      Real             d(vx, vy);\n      BOOST_CHECK_EQUAL(d.real(), 40.5);\n      BOOST_CHECK_EQUAL(d.imag(), 2);\n   }\n#endif\n   {\n      typename Real::value_type x(40.5), y(2);\n      Real                      d(x, y);\n      BOOST_CHECK_EQUAL(d.real(), 40.5);\n      BOOST_CHECK_EQUAL(d.imag(), 2);\n   }\n#ifdef TEST_MPC\n   {\n      typename Real::value_type x(40.5), y(2);\n      Real                      d(x.backend().data(), y.backend().data());\n      BOOST_CHECK_EQUAL(d.real(), 40.5);\n      BOOST_CHECK_EQUAL(d.imag(), 2);\n   }\n#endif\n   {\n      typename Real::value_type x(40.5);\n      Real                      d(x, 2);\n      BOOST_CHECK_EQUAL(d.real(), 40.5);\n      BOOST_CHECK_EQUAL(d.imag(), 2);\n   }\n   {\n      typename Real::value_type x(40.5);\n      Real                      d(2, x);\n      BOOST_CHECK_EQUAL(d.imag(), 40.5);\n      BOOST_CHECK_EQUAL(d.real(), 2);\n   }\n   {\n      typename Real::value_type x(real(a) * real(b) + imag(a) * imag(b)), y(imag(a) * real(b) - real(a) * imag(b));\n      Real                      d(real(a) * real(b) + imag(a) * imag(b), imag(a) * real(b) - real(a) * imag(b));\n      Real                      e(x, y);\n      BOOST_CHECK_EQUAL(d, e);\n   }\n   //\n   // real and imag setters:\n   //\n   c.real(4);\n   BOOST_CHECK_EQUAL(real(c), 4);\n   c.imag(-55);\n   BOOST_CHECK_EQUAL(imag(c), -55);\n   typename Real::value_type z(20);\n   c.real(z);\n   BOOST_CHECK_EQUAL(real(c), 20);\n   c.real(21L);\n   BOOST_CHECK_EQUAL(real(c), 21);\n   c.real(22L);\n   BOOST_CHECK_EQUAL(real(c), 22);\n   c.real(23UL);\n   BOOST_CHECK_EQUAL(real(c), 23);\n   c.real(24U);\n   BOOST_CHECK_EQUAL(real(c), 24);\n   c.real(25.0f);\n   BOOST_CHECK_EQUAL(real(c), 25);\n   c.real(26.0);\n   BOOST_CHECK_EQUAL(real(c), 26);\n   c.real(27.0L);\n   BOOST_CHECK_EQUAL(real(c), 27);\n#if defined(BOOST_HAS_LONG_LONG)\n   c.real(28LL);\n   BOOST_CHECK_EQUAL(real(c), 28);\n   c.real(29ULL);\n   BOOST_CHECK_EQUAL(real(c), 29);\n#endif\n   c.imag(z);\n   BOOST_CHECK_EQUAL(imag(c), 20);\n   c.imag(21L);\n   BOOST_CHECK_EQUAL(imag(c), 21);\n   c.imag(22L);\n   BOOST_CHECK_EQUAL(imag(c), 22);\n   c.imag(23UL);\n   BOOST_CHECK_EQUAL(imag(c), 23);\n   c.imag(24U);\n   BOOST_CHECK_EQUAL(imag(c), 24);\n   c.imag(25.0f);\n   BOOST_CHECK_EQUAL(imag(c), 25);\n   c.imag(26.0);\n   BOOST_CHECK_EQUAL(imag(c), 26);\n   c.imag(27.0L);\n   BOOST_CHECK_EQUAL(imag(c), 27);\n#if defined(BOOST_HAS_LONG_LONG)\n   c.imag(28LL);\n   BOOST_CHECK_EQUAL(imag(c), 28);\n   c.imag(29ULL);\n   BOOST_CHECK_EQUAL(imag(c), 29);\n#endif\n\n   c.real(2).imag(3);\n\n   BOOST_CHECK_EQUAL(real(a), 30);\n   BOOST_CHECK_EQUAL(imag(a), 0);\n   BOOST_CHECK_EQUAL(real(c), 2);\n   BOOST_CHECK_EQUAL(imag(c), 3);\n   BOOST_CHECK_EQUAL(real(a + 0), 30);\n   BOOST_CHECK_EQUAL(imag(a + 0), 0);\n   BOOST_CHECK_EQUAL(real(c + 0), 2);\n   BOOST_CHECK_EQUAL(imag(c + 0), 3);\n\n   // string construction:\n   a = Real(\"2\");\n   BOOST_CHECK_EQUAL(real(a), 2);\n   BOOST_CHECK_EQUAL(imag(a), 0);\n   a = Real(\"(2)\");\n   BOOST_CHECK_EQUAL(real(a), 2);\n   BOOST_CHECK_EQUAL(imag(a), 0);\n   a = Real(\"(,2)\");\n   BOOST_CHECK_EQUAL(real(a), 0);\n   BOOST_CHECK_EQUAL(imag(a), 2);\n   a = Real(\"(2,3)\");\n   BOOST_CHECK_EQUAL(real(a), 2);\n   BOOST_CHECK_EQUAL(imag(a), 3);\n\n   typedef typename boost::multiprecision::component_type<Real>::type real_type;\n\n   real_type r(3);\n   real_type tol = std::numeric_limits<real_type>::epsilon() * 30;\n\n   a = r;\n   BOOST_CHECK_EQUAL(real(a), 3);\n   BOOST_CHECK_EQUAL(imag(a), 0);\n\n   a += r;\n   BOOST_CHECK_EQUAL(real(a), 6);\n   BOOST_CHECK_EQUAL(imag(a), 0);\n\n   a *= r;\n   BOOST_CHECK_EQUAL(real(a), 18);\n   BOOST_CHECK_EQUAL(imag(a), 0);\n\n   a = a / r;\n   BOOST_CHECK_EQUAL(real(a), 6);\n   BOOST_CHECK_EQUAL(imag(a), 0);\n   a = a - r;\n   BOOST_CHECK_EQUAL(real(a), 3);\n   BOOST_CHECK_EQUAL(imag(a), 0);\n   a = r + a;\n   BOOST_CHECK_EQUAL(real(a), 6);\n   BOOST_CHECK_EQUAL(imag(a), 0);\n\n   r = abs(c);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"3.60555127546398929311922126747049594625129657384524621271045305622716694829301044520461908201849071767351418202406\"), r, tol);\n   r = arg(c);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.98279372324732906798571061101466601449687745363162855676142508831798807154979603538970653437281731110816513970201\"), r, tol);\n   r = norm(c);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(13), r, tol);\n   a = conj(c);\n   BOOST_CHECK_EQUAL(real(a), 2);\n   BOOST_CHECK_EQUAL(imag(a), -3);\n   a = proj(c);\n   BOOST_CHECK_EQUAL(real(a), 2);\n   BOOST_CHECK_EQUAL(imag(a), 3);\n   a = polar(real_type(3), real_type(-10));\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-2.517214587229357356776591843472194503559790495399505640507861193146377760598812305202801138281266416782353163216\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.63206333266810944021424298555413184505092903874867167472255203785027162892148027712122702168494964847488147271478\"), imag(a), tol);\n   a = polar(real_type(3) + 0, real_type(-10));\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-2.517214587229357356776591843472194503559790495399505640507861193146377760598812305202801138281266416782353163216\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.63206333266810944021424298555413184505092903874867167472255203785027162892148027712122702168494964847488147271478\"), imag(a), tol);\n   a = polar(real_type(3), real_type(-10) + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-2.517214587229357356776591843472194503559790495399505640507861193146377760598812305202801138281266416782353163216\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.63206333266810944021424298555413184505092903874867167472255203785027162892148027712122702168494964847488147271478\"), imag(a), tol);\n   a = polar(real_type(3) + 0, real_type(-10) + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-2.517214587229357356776591843472194503559790495399505640507861193146377760598812305202801138281266416782353163216\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.63206333266810944021424298555413184505092903874867167472255203785027162892148027712122702168494964847488147271478\"), imag(a), tol);\n   a = polar(3, real_type(-10));\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-2.517214587229357356776591843472194503559790495399505640507861193146377760598812305202801138281266416782353163216\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.63206333266810944021424298555413184505092903874867167472255203785027162892148027712122702168494964847488147271478\"), imag(a), tol);\n   a = polar(3.0, real_type(-10) + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-2.517214587229357356776591843472194503559790495399505640507861193146377760598812305202801138281266416782353163216\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.63206333266810944021424298555413184505092903874867167472255203785027162892148027712122702168494964847488147271478\"), imag(a), tol);\n\n   a = polar(real_type(3));\n   BOOST_CHECK_EQUAL(3, real(a));\n   BOOST_CHECK_EQUAL(0, imag(a));\n   a = polar(real_type(3) + 0);\n   BOOST_CHECK_EQUAL(3, real(a));\n   BOOST_CHECK_EQUAL(0, imag(a));\n\n   r = abs(c + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"3.60555127546398929311922126747049594625129657384524621271045305622716694829301044520461908201849071767351418202406\"), r, tol);\n   r = arg(c + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.98279372324732906798571061101466601449687745363162855676142508831798807154979603538970653437281731110816513970201\"), r, tol);\n   r = norm(c + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(13), r, tol);\n   a = conj(c + 0);\n   BOOST_CHECK_EQUAL(real(a), 2);\n   BOOST_CHECK_EQUAL(imag(a), -3);\n   a = proj(c + 0);\n   BOOST_CHECK_EQUAL(real(a), 2);\n   BOOST_CHECK_EQUAL(imag(a), 3);\n\n   a = exp(c);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-7.3151100949011025174865361510507893218698794489446322367845159660828327860599907104337742108443234172141249777\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.0427436562359044141015039404625521939183300604422348975424523449538886779880818796291971422701951470533151185\"), imag(a), tol);\n\n   a = log(c);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.282474678730768368026743720782659302402633972380103558209522755331732333662205089699787331720244744384629096046\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.9827937232473290679857106110146660144968774536316285567614250883179880715497960353897065343728173111081651397020\"), imag(a), tol);\n\n   a = log10(c);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.556971676153418384603252578971164215414864594193534135900595487498776545815097120403823727129449829836488977743\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.426821890855466638944275673291166123449562356934437957244904971730668088711719757900679614536803436424488603794\"), imag(a), tol);\n\n   a = exp(c + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-7.3151100949011025174865361510507893218698794489446322367845159660828327860599907104337742108443234172141249777\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.0427436562359044141015039404625521939183300604422348975424523449538886779880818796291971422701951470533151185\"), imag(a), tol);\n\n   a = log(c + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.282474678730768368026743720782659302402633972380103558209522755331732333662205089699787331720244744384629096046\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.9827937232473290679857106110146660144968774536316285567614250883179880715497960353897065343728173111081651397020\"), imag(a), tol);\n\n   a = log10(c + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.556971676153418384603252578971164215414864594193534135900595487498776545815097120403823727129449829836488977743\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.426821890855466638944275673291166123449562356934437957244904971730668088711719757900679614536803436424488603794\"), imag(a), tol);\n\n   // Powers where one arg is an integer.\n   b = Real(5, -2);\n   a = pow(c, b);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-3053.8558566606567369633610140423321260211388217942246293871310470377722279440084474789529228008638668934381183\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"3097.9975862915005132449772136982559285192410496951232473245540634244845290672745578327467396750607773968246915\"), imag(a), tol);\n   a = pow(c, 3);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(-46), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(9), imag(a), tol);\n   a = pow(3, c);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-8.8931513442797186948734782808862447235385767991868219480917324534839621090167050538805196124711247247992169338\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-1.3826999557878897572499699021550296885662132089951379549068064961882821777067532977546360861176011175070188118\"), imag(a), tol * 3);\n   a = pow(c + 0, b);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-3053.8558566606567369633610140423321260211388217942246293871310470377722279440084474789529228008638668934381183\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"3097.9975862915005132449772136982559285192410496951232473245540634244845290672745578327467396750607773968246915\"), imag(a), tol);\n   a = pow(c + 0, 3);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(-46), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(9), imag(a), tol);\n   a = pow(3, c + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-8.8931513442797186948734782808862447235385767991868219480917324534839621090167050538805196124711247247992169338\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-1.3826999557878897572499699021550296885662132089951379549068064961882821777067532977546360861176011175070188118\"), imag(a), tol * 3);\n\n   r = 3;\n   // Powers where one arg is a real_type.\n   a = pow(c, r);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(-46), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(9), imag(a), tol);\n   a = pow(r, c);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-8.8931513442797186948734782808862447235385767991868219480917324534839621090167050538805196124711247247992169338\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-1.3826999557878897572499699021550296885662132089951379549068064961882821777067532977546360861176011175070188118\"), imag(a), tol * 3);\n   a = pow(c + 0, r);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(-46), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(9), imag(a), tol);\n   a = pow(r, c + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-8.8931513442797186948734782808862447235385767991868219480917324534839621090167050538805196124711247247992169338\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-1.3826999557878897572499699021550296885662132089951379549068064961882821777067532977546360861176011175070188118\"), imag(a), tol * 3);\n   a = pow(c, r + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(-46), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(9), imag(a), tol);\n   a = pow(r + 0, c);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-8.8931513442797186948734782808862447235385767991868219480917324534839621090167050538805196124711247247992169338\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-1.3826999557878897572499699021550296885662132089951379549068064961882821777067532977546360861176011175070188118\"), imag(a), tol * 3);\n\n   // Powers where one arg is an float.\n   a = pow(c, 3.0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(-46), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(9), imag(a), tol);\n   a = pow(3.0, c);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-8.8931513442797186948734782808862447235385767991868219480917324534839621090167050538805196124711247247992169338\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-1.3826999557878897572499699021550296885662132089951379549068064961882821777067532977546360861176011175070188118\"), imag(a), tol * 3);\n   a = pow(c + 0, 3.0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(-46), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(9), imag(a), tol);\n   a = pow(3.0, c + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-8.8931513442797186948734782808862447235385767991868219480917324534839621090167050538805196124711247247992169338\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-1.3826999557878897572499699021550296885662132089951379549068064961882821777067532977546360861176011175070188118\"), imag(a), tol * 3);\n\n   a = c;\n   a = sqrt(a);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.674149228035540040448039300849051821674708677883920366727287836003399240343274891876712629708287692163156802065\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.8959774761298381247157337552900434410433241995549314932449006989874470582160955817053273057885402621549320588976\"), imag(a), tol);\n   a = c;\n   a = sin(a);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"9.154499146911429573467299544609832559158860568765182977899828142590020335321896403936690014669532606510294425039\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-4.168906959966564350754813058853754843573565604758055889965478710592666260138453299795649308385497563475115931624\"), imag(a), tol);\n   a = c;\n   a = cos(a);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-4.1896256909688072301325550196159737286219454041279210357407905058369727912162626993926269783331491034500484583\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-9.1092278937553365979791972627788621213326202389201695649104967309554222940748568716960841549279996556547993373\"), imag(a), tol);\n   a = c;\n   a = tan(a);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-0.0037640256415042482927512211303226908396306202016580864328644932511249097100916559688254811519914564480500042311\"), real(a), tol * 5);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.0032386273536098014463585978219272598077897241071003399272426939850671219193120708438426543945017427085738411\"), imag(a), tol);\n   a = c;\n   a = asin(a);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.5706527843210994007102838796856696501828032450960401365302732598209740064262509342420347149436326252483895113827\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.983387029916535432347076902894039565014248302909345356125267430944752731616095111727103650117987412058949254132\"), imag(a), tol);\n   a = c;\n   a = acos(a);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.000143542473797218521037811954081791915781454591512773957199036332934196716853565071982697727425908742684531873\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-1.983387029916535432347076902894039565014248302909345356125267430944752731616095111727103650117987412058949254132\"), imag(a), tol);\n   a = c;\n   a = atan(a);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.409921049596575522530619384460420782588207051908724814771070766475530084440199227135813201495737846771570458568\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.2290726829685387662958818029420027678625253049770656169479919704951963414344907622560676377741902308144912055002\"), imag(a), tol);\n   a = c;\n   a = sqrt(a + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.674149228035540040448039300849051821674708677883920366727287836003399240343274891876712629708287692163156802065\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.8959774761298381247157337552900434410433241995549314932449006989874470582160955817053273057885402621549320588976\"), imag(a), tol);\n   a = c;\n   a = sin(a + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"9.154499146911429573467299544609832559158860568765182977899828142590020335321896403936690014669532606510294425039\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-4.168906959966564350754813058853754843573565604758055889965478710592666260138453299795649308385497563475115931624\"), imag(a), tol);\n   a = c;\n   a = cos(a + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-4.1896256909688072301325550196159737286219454041279210357407905058369727912162626993926269783331491034500484583\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-9.1092278937553365979791972627788621213326202389201695649104967309554222940748568716960841549279996556547993373\"), imag(a), tol);\n   a = c;\n   a = tan(a + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-0.0037640256415042482927512211303226908396306202016580864328644932511249097100916559688254811519914564480500042311\"), real(a), tol * 5);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.0032386273536098014463585978219272598077897241071003399272426939850671219193120708438426543945017427085738411\"), imag(a), tol);\n   a = c;\n   a = asin(a + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.5706527843210994007102838796856696501828032450960401365302732598209740064262509342420347149436326252483895113827\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.983387029916535432347076902894039565014248302909345356125267430944752731616095111727103650117987412058949254132\"), imag(a), tol);\n   a = c;\n   a = acos(a + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.000143542473797218521037811954081791915781454591512773957199036332934196716853565071982697727425908742684531873\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-1.983387029916535432347076902894039565014248302909345356125267430944752731616095111727103650117987412058949254132\"), imag(a), tol);\n   a = c;\n   a = atan(a + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.409921049596575522530619384460420782588207051908724814771070766475530084440199227135813201495737846771570458568\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.2290726829685387662958818029420027678625253049770656169479919704951963414344907622560676377741902308144912055002\"), imag(a), tol);\n\n   a = c;\n   a = sinh(a);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-3.5905645899857799520125654477948167931949136757293015099986213974178826801534614215227593814301490087307920223\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.53092108624851980526704009066067655967277345095149103008706855371803528753067068552935673000832252607835087747\"), imag(a), tol);\n   a = c;\n   a = cosh(a);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-3.7245455049153225654739707032559725286749657732153307267858945686649501059065292889110148294141744084833329553\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.51182256998738460883446384980187563424555660949074386745538379123585339045741119409984041226187262097496424111\"), imag(a), tol);\n   a = c;\n   a = tanh(a);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.965385879022133124278480269394560685879729650005757773636908240066639772853967550095754361348005358178253777920\"), real(a), tol * 5);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-0.00988437503832249372031403430350121097961813353467039031861010606115560355679254344335582852193041894874685555114\"), imag(a), tol);\n   a = c;\n   a = asinh(a);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.968637925793096291788665095245498189520731012682010573842811017352748255492485345887875752070076230641308014923\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.9646585044076027920454110594995323555197773725073316527132580297155508786089335572049608301897631767195194427315\"), imag(a), tol);\n   a = c;\n   a = acosh(a);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.983387029916535432347076902894039565014248302909345356125267430944752731616095111727103650117987412058949254132\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.000143542473797218521037811954081791915781454591512773957199036332934196716853565071982697727425908742684531873\"), imag(a), tol);\n   a = c;\n   a = atanh(a);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.1469466662255297520474327851547159424423449403442452953891851939502023996823900422792744078835711416939934387775\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.338972522294493561124193575909144241084316172544492778582005751793809271060233646663717270678614587712809117131\"), imag(a), tol);\n   a = c;\n   a = sinh(a + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-3.5905645899857799520125654477948167931949136757293015099986213974178826801534614215227593814301490087307920223\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.53092108624851980526704009066067655967277345095149103008706855371803528753067068552935673000832252607835087747\"), imag(a), tol);\n   a = c;\n   a = cosh(a + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-3.7245455049153225654739707032559725286749657732153307267858945686649501059065292889110148294141744084833329553\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.51182256998738460883446384980187563424555660949074386745538379123585339045741119409984041226187262097496424111\"), imag(a), tol);\n   a = c;\n   a = tanh(a + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.965385879022133124278480269394560685879729650005757773636908240066639772853967550095754361348005358178253777920\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"-0.00988437503832249372031403430350121097961813353467039031861010606115560355679254344335582852193041894874685555114\"), imag(a), tol);\n   a = c;\n   a = asinh(a + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.968637925793096291788665095245498189520731012682010573842811017352748255492485345887875752070076230641308014923\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.9646585044076027920454110594995323555197773725073316527132580297155508786089335572049608301897631767195194427315\"), imag(a), tol);\n   a = c;\n   a = acosh(a + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.983387029916535432347076902894039565014248302909345356125267430944752731616095111727103650117987412058949254132\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.000143542473797218521037811954081791915781454591512773957199036332934196716853565071982697727425908742684531873\"), imag(a), tol);\n   a = c;\n   a = atanh(a + 0);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"0.1469466662255297520474327851547159424423449403442452953891851939502023996823900422792744078835711416939934387775\"), real(a), tol);\n   BOOST_CHECK_CLOSE_FRACTION(real_type(\"1.338972522294493561124193575909144241084316172544492778582005751793809271060233646663717270678614587712809117131\"), imag(a), tol);\n}\n\ntemplate <class Real>\ntypename std::enable_if<boost::multiprecision::number_category<Real>::value != boost::multiprecision::number_kind_complex>::type test_members(Real)\n{\n   //\n   // Test sign and zero functions:\n   //\n   Real a = 20;\n   Real b = 30;\n   BOOST_CHECK(a.sign() > 0);\n   BOOST_CHECK(!a.is_zero());\n   BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::is_signed)\n   {\n      a = -20;\n      BOOST_CHECK(a.sign() < 0);\n      BOOST_CHECK(!a.is_zero());\n   }\n   a = 0;\n   BOOST_CHECK_EQUAL(a.sign(), 0);\n   BOOST_CHECK(a.is_zero());\n\n   a = 20;\n   b = 30;\n   a.swap(b);\n   BOOST_CHECK_EQUAL(a, 30);\n   BOOST_CHECK_EQUAL(b, 20);\n   //\n   // Test complex number functions which are also overloaded for scalar type:\n   //\n   BOOST_CHECK_EQUAL(real(a), a);\n   BOOST_CHECK_EQUAL(imag(a), 0);\n   BOOST_CHECK_EQUAL(real(a + 0), a);\n   BOOST_CHECK_EQUAL(imag(a + 2), 0);\n   BOOST_CHECK_EQUAL(norm(a), a * a);\n   BOOST_CHECK_EQUAL(norm(a * 1), a * a);\n   BOOST_CHECK_EQUAL(conj(a), a);\n   BOOST_CHECK_EQUAL(conj(a * 1), a);\n   BOOST_CHECK_EQUAL(proj(a), a);\n   BOOST_CHECK_EQUAL(proj(a * 1), a);\n   BOOST_CHECK_EQUAL(a.real(), a);\n   BOOST_CHECK_EQUAL(a.imag(), 0);\n   a.real(55);\n   BOOST_CHECK_EQUAL(a, 55);\n}\n\ntemplate <class Real>\nvoid test_members(boost::rational<Real>)\n{\n}\n\ntemplate <class Real>\nvoid test_signed_ops(const std::integral_constant<bool, true>&)\n{\n   Real a(8);\n   Real b(64);\n   Real c(500);\n   Real d(1024);\n   Real ac;\n   BOOST_CHECK_EQUAL(-a, -8);\n   ac = a;\n   ac = ac - b;\n   BOOST_CHECK_EQUAL(ac, 8 - 64);\n   ac = a;\n   ac -= a + b;\n   BOOST_CHECK_EQUAL(ac, -64);\n   ac = a;\n   ac -= b - a;\n   BOOST_CHECK_EQUAL(ac, 16 - 64);\n   ac = -a;\n   BOOST_CHECK_EQUAL(ac, -8);\n   ac = a;\n   ac -= -a;\n   BOOST_CHECK_EQUAL(ac, 16);\n   ac = a;\n   ac += -a;\n   BOOST_CHECK_EQUAL(ac, 0);\n   ac = b;\n   ac /= -a;\n   BOOST_CHECK_EQUAL(ac, -8);\n   ac = a;\n   ac *= -a;\n   BOOST_CHECK_EQUAL(ac, -64);\n   ac = a + -b;\n   BOOST_CHECK_EQUAL(ac, 8 - 64);\n   ac = -a + b;\n   BOOST_CHECK_EQUAL(ac, -8 + 64);\n   ac = -a + -b;\n   BOOST_CHECK_EQUAL(ac, -72);\n   ac = a + -+-b; // lots of unary operators!!\n   BOOST_CHECK_EQUAL(ac, 72);\n   test_conditional(Real(-a), -a);\n\n   //\n   // RValue ref tests:\n   //\n   a = 3;\n   b = 4;\n   c = Real(20) + -(a + b);\n   BOOST_CHECK_EQUAL(c, 13);\n   c = Real(20) + -a;\n   BOOST_CHECK_EQUAL(c, 17);\n   c = -a + Real(20);\n   BOOST_CHECK_EQUAL(c, 17);\n   c = -a + b;\n   BOOST_CHECK_EQUAL(c, 1);\n   c = b + -a;\n   BOOST_CHECK_EQUAL(c, 1);\n   a = 2;\n   b = 3;\n   c = Real(10) - a;\n   BOOST_CHECK_EQUAL(c, 8);\n   c = a - Real(2);\n   BOOST_CHECK_EQUAL(c, 0);\n   c = Real(3) - Real(2);\n   BOOST_CHECK_EQUAL(c, 1);\n   a = 20;\n   c = a - (a + b);\n   BOOST_CHECK_EQUAL(c, -3);\n   a = 2;\n   c = (a * b) - (a + b);\n   BOOST_CHECK_EQUAL(c, 1);\n   c = Real(20) - -(a + b);\n   BOOST_CHECK_EQUAL(c, 25);\n   c = Real(20) - (-a);\n   BOOST_CHECK_EQUAL(c, 22);\n   c = (-b) - Real(-5);\n   BOOST_CHECK_EQUAL(c, 2);\n   c = (-b) - a;\n   BOOST_CHECK_EQUAL(c, -5);\n   c = b - (-a);\n   BOOST_CHECK_EQUAL(c, 5);\n   c = Real(3) * -(a + b);\n   BOOST_CHECK_EQUAL(c, -15);\n   c = -(a + b) * Real(3);\n   BOOST_CHECK_EQUAL(c, -15);\n   c = Real(2) * -a;\n   BOOST_CHECK_EQUAL(c, -4);\n   c = -a * Real(2);\n   BOOST_CHECK_EQUAL(c, -4);\n   c = -a * b;\n   BOOST_CHECK_EQUAL(c, -6);\n   a = 2;\n   b = 4;\n   c = Real(4) / -a;\n   BOOST_CHECK_EQUAL(c, -2);\n   c = -b / Real(2);\n   BOOST_CHECK_EQUAL(c, -2);\n   c = Real(4) / -(2 * a);\n   BOOST_CHECK_EQUAL(c, -1);\n   c = b / -(2 * a);\n   BOOST_CHECK_EQUAL(c, -1);\n   c = -(2 * a) / Real(2);\n   BOOST_CHECK_EQUAL(c, -2);\n}\ntemplate <class Real>\nvoid test_signed_ops(const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class Real>\nvoid test_basic_conditionals(Real a, Real b)\n{\n   if (a)\n   {\n      BOOST_ERROR(\"Unexpected non-zero result\");\n   }\n   if (!a)\n   {\n   }\n   else\n   {\n      BOOST_ERROR(\"Unexpected zero result\");\n   }\n   b = 2;\n   if (!b)\n   {\n      BOOST_ERROR(\"Unexpected zero result\");\n   }\n   if (b)\n   {\n   }\n   else\n   {\n      BOOST_ERROR(\"Unexpected non-zero result\");\n   }\n   if (a && b)\n   {\n      BOOST_ERROR(\"Unexpected zero result\");\n   }\n   if (!(a || b))\n   {\n      BOOST_ERROR(\"Unexpected zero result\");\n   }\n   if (a + b)\n   {\n   }\n   else\n   {\n      BOOST_ERROR(\"Unexpected zero result\");\n   }\n   if (b - 2)\n   {\n      BOOST_ERROR(\"Unexpected non-zero result\");\n   }\n}\n\ntemplate <class T>\ntypename std::enable_if<boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_complex>::type\ntest_relationals(T a, T b)\n{\n   BOOST_CHECK_EQUAL((a == b), false);\n   BOOST_CHECK_EQUAL((a != b), true);\n\n   BOOST_CHECK_EQUAL((a + b == b), false);\n   BOOST_CHECK_EQUAL((a + b != b), true);\n\n   BOOST_CHECK_EQUAL((a == b + a), false);\n   BOOST_CHECK_EQUAL((a != b + a), true);\n\n   BOOST_CHECK_EQUAL((a + b == b + a), true);\n   BOOST_CHECK_EQUAL((a + b != b + a), false);\n\n   BOOST_CHECK_EQUAL((8 == b + a), false);\n   BOOST_CHECK_EQUAL((8 != b + a), true);\n   BOOST_CHECK_EQUAL((800 == b + a), false);\n   BOOST_CHECK_EQUAL((800 != b + a), true);\n   BOOST_CHECK_EQUAL((72 == b + a), true);\n   BOOST_CHECK_EQUAL((72 != b + a), false);\n\n   BOOST_CHECK_EQUAL((b + a == 8), false);\n   BOOST_CHECK_EQUAL((b + a != 8), true);\n   BOOST_CHECK_EQUAL((b + a == 800), false);\n   BOOST_CHECK_EQUAL((b + a != 800), true);\n   BOOST_CHECK_EQUAL((b + a == 72), true);\n   BOOST_CHECK_EQUAL((b + a != 72), false);\n}\n\ntemplate <class T>\ntypename std::enable_if<boost::multiprecision::number_category<T>::value != boost::multiprecision::number_kind_complex>::type\ntest_relationals(T a, T b)\n{\n   BOOST_CHECK_EQUAL((a == b), false);\n   BOOST_CHECK_EQUAL((a != b), true);\n   BOOST_CHECK_EQUAL((a <= b), true);\n   BOOST_CHECK_EQUAL((a < b), true);\n   BOOST_CHECK_EQUAL((a >= b), false);\n   BOOST_CHECK_EQUAL((a > b), false);\n\n   BOOST_CHECK_EQUAL((a + b == b), false);\n   BOOST_CHECK_EQUAL((a + b != b), true);\n   BOOST_CHECK_EQUAL((a + b >= b), true);\n   BOOST_CHECK_EQUAL((a + b > b), true);\n   BOOST_CHECK_EQUAL((a + b <= b), false);\n   BOOST_CHECK_EQUAL((a + b < b), false);\n\n   BOOST_CHECK_EQUAL((a == b + a), false);\n   BOOST_CHECK_EQUAL((a != b + a), true);\n   BOOST_CHECK_EQUAL((a <= b + a), true);\n   BOOST_CHECK_EQUAL((a < b + a), true);\n   BOOST_CHECK_EQUAL((a >= b + a), false);\n   BOOST_CHECK_EQUAL((a > b + a), false);\n\n   BOOST_CHECK_EQUAL((a + b == b + a), true);\n   BOOST_CHECK_EQUAL((a + b != b + a), false);\n   BOOST_CHECK_EQUAL((a + b <= b + a), true);\n   BOOST_CHECK_EQUAL((a + b < b + a), false);\n   BOOST_CHECK_EQUAL((a + b >= b + a), true);\n   BOOST_CHECK_EQUAL((a + b > b + a), false);\n\n   BOOST_CHECK_EQUAL((8 == b + a), false);\n   BOOST_CHECK_EQUAL((8 != b + a), true);\n   BOOST_CHECK_EQUAL((8 <= b + a), true);\n   BOOST_CHECK_EQUAL((8 < b + a), true);\n   BOOST_CHECK_EQUAL((8 >= b + a), false);\n   BOOST_CHECK_EQUAL((8 > b + a), false);\n   BOOST_CHECK_EQUAL((800 == b + a), false);\n   BOOST_CHECK_EQUAL((800 != b + a), true);\n   BOOST_CHECK_EQUAL((800 >= b + a), true);\n   BOOST_CHECK_EQUAL((800 > b + a), true);\n   BOOST_CHECK_EQUAL((800 <= b + a), false);\n   BOOST_CHECK_EQUAL((800 < b + a), false);\n   BOOST_CHECK_EQUAL((72 == b + a), true);\n   BOOST_CHECK_EQUAL((72 != b + a), false);\n   BOOST_CHECK_EQUAL((72 <= b + a), true);\n   BOOST_CHECK_EQUAL((72 < b + a), false);\n   BOOST_CHECK_EQUAL((72 >= b + a), true);\n   BOOST_CHECK_EQUAL((72 > b + a), false);\n\n   BOOST_CHECK_EQUAL((b + a == 8), false);\n   BOOST_CHECK_EQUAL((b + a != 8), true);\n   BOOST_CHECK_EQUAL((b + a >= 8), true);\n   BOOST_CHECK_EQUAL((b + a > 8), true);\n   BOOST_CHECK_EQUAL((b + a <= 8), false);\n   BOOST_CHECK_EQUAL((b + a < 8), false);\n   BOOST_CHECK_EQUAL((b + a == 800), false);\n   BOOST_CHECK_EQUAL((b + a != 800), true);\n   BOOST_CHECK_EQUAL((b + a <= 800), true);\n   BOOST_CHECK_EQUAL((b + a < 800), true);\n   BOOST_CHECK_EQUAL((b + a >= 800), false);\n   BOOST_CHECK_EQUAL((b + a > 800), false);\n   BOOST_CHECK_EQUAL((b + a == 72), true);\n   BOOST_CHECK_EQUAL((b + a != 72), false);\n   BOOST_CHECK_EQUAL((b + a >= 72), true);\n   BOOST_CHECK_EQUAL((b + a > 72), false);\n   BOOST_CHECK_EQUAL((b + a <= 72), true);\n   BOOST_CHECK_EQUAL((b + a < 72), false);\n\n   T c;\n   //\n   // min and max overloads:\n   //\n#if !defined(min) && !defined(max)\n   //   using std::max;\n   //   using std::min;\n   // This works, but still causes complaints from inspect.exe, so use brackets to prevent macrosubstitution,\n   // and to explicitly specify type T seems necessary, for reasons unclear.\n   a = 2;\n   b = 5;\n   c = 6;\n   BOOST_CHECK_EQUAL((std::min<T>)(a, b), a);\n   BOOST_CHECK_EQUAL((std::min<T>)(b, a), a);\n   BOOST_CHECK_EQUAL((std::max<T>)(a, b), b);\n   BOOST_CHECK_EQUAL((std::max<T>)(b, a), b);\n   BOOST_CHECK_EQUAL((std::min<T>)(a, b + c), a);\n   BOOST_CHECK_EQUAL((std::min<T>)(b + c, a), a);\n   BOOST_CHECK_EQUAL((std::min<T>)(a, c - b), 1);\n   BOOST_CHECK_EQUAL((std::min<T>)(c - b, a), 1);\n   BOOST_CHECK_EQUAL((std::max<T>)(a, b + c), 11);\n   BOOST_CHECK_EQUAL((std::max<T>)(b + c, a), 11);\n   BOOST_CHECK_EQUAL((std::max<T>)(a, c - b), a);\n   BOOST_CHECK_EQUAL((std::max<T>)(c - b, a), a);\n   BOOST_CHECK_EQUAL((std::min<T>)(a + b, b + c), 7);\n   BOOST_CHECK_EQUAL((std::min<T>)(b + c, a + b), 7);\n   BOOST_CHECK_EQUAL((std::max<T>)(a + b, b + c), 11);\n   BOOST_CHECK_EQUAL((std::max<T>)(b + c, a + b), 11);\n   BOOST_CHECK_EQUAL((std::min<T>)(a + b, c - a), 4);\n   BOOST_CHECK_EQUAL((std::min<T>)(c - a, a + b), 4);\n   BOOST_CHECK_EQUAL((std::max<T>)(a + b, c - a), 7);\n   BOOST_CHECK_EQUAL((std::max<T>)(c - a, a + b), 7);\n\n   long l1(2), l2(3), l3;\n   l3 = (std::min)(l1, l2) + (std::max)(l1, l2) + (std::max<long>)(l1, l2) + (std::min<long>)(l1, l2);\n   BOOST_CHECK_EQUAL(l3, 10);\n\n#endif\n}\n\ntemplate <class T>\nconst T& self(const T& a) { return a; }\n\ntemplate <class Real>\nvoid test()\n{\n#if !defined(NO_MIXED_OPS) && !defined(SLOW_COMPILER)\n   boost::multiprecision::is_number<Real> tag;\n   test_mixed<Real, unsigned char>(tag);\n   test_mixed<Real, signed char>(tag);\n   test_mixed<Real, char>(tag);\n   test_mixed<Real, short>(tag);\n   test_mixed<Real, unsigned short>(tag);\n   test_mixed<Real, int>(tag);\n   test_mixed<Real, unsigned int>(tag);\n   test_mixed<Real, long>(tag);\n   test_mixed<Real, unsigned long>(tag);\n#ifdef BOOST_HAS_LONG_LONG\n   test_mixed<Real, long long>(tag);\n   test_mixed<Real, unsigned long long>(tag);\n#endif\n#if defined(BOOST_HAS_INT128) && !defined(BOOST_NO_CXX17_IF_CONSTEXPR)\n   if constexpr (std::is_constructible<Real, boost::int128_type>::value)\n   {\n      test_mixed<Real, boost::int128_type>(tag);\n      test_mixed<Real, boost::uint128_type>(tag);\n   }\n#endif\n   test_mixed<Real, float>(tag);\n   test_mixed<Real, double>(tag);\n   test_mixed<Real, long double>(tag);\n#if defined(BOOST_HAS_FLOAT128) && !defined(BOOST_NO_CXX17_IF_CONSTEXPR)\n   if constexpr (std::is_constructible<Real, __float128>::value)\n      test_mixed<Real, __float128>(tag);\n#endif\n\n   typedef typename related_type<Real>::type                                                                      related_type;\n   std::integral_constant<bool, boost::multiprecision::is_number<Real>::value && !std::is_same<related_type, Real>::value> tag2;\n\n   test_mixed<Real, related_type>(tag2);\n\n   std::integral_constant<bool, boost::multiprecision::is_number<Real>::value && (boost::multiprecision::number_category<Real>::value == boost::multiprecision::number_kind_complex)> complex_tag;\n   test_mixed<Real, std::complex<float> >(complex_tag);\n   test_mixed<Real, std::complex<double> >(complex_tag);\n   test_mixed<Real, std::complex<long double> >(complex_tag);\n\n   test_enum_conversions<Real>();\n\n#endif\n#ifndef MIXED_OPS_ONLY\n   //\n   // Integer only functions:\n   //\n   test_integer_ops<Real>(typename boost::multiprecision::number_category<Real>::type());\n   //\n   // Real number only functions:\n   //\n   test_float_ops<Real>(typename boost::multiprecision::number_category<Real>::type());\n   //\n   // Test basic arithmetic:\n   //\n   Real a(8);\n   Real b(64);\n   Real c(500);\n   Real d(1024);\n   BOOST_CHECK_EQUAL(a + b, 72);\n   a += b;\n   BOOST_CHECK_EQUAL(a, 72);\n   BOOST_CHECK_EQUAL(a - b, 8);\n   a -= b;\n   BOOST_CHECK_EQUAL(a, 8);\n   BOOST_CHECK_EQUAL(a * b, 8 * 64L);\n   a *= b;\n   BOOST_CHECK_EQUAL(a, 8 * 64L);\n   BOOST_CHECK_EQUAL(a / b, 8);\n   a /= b;\n   BOOST_CHECK_EQUAL(a, 8);\n   Real ac(a);\n   BOOST_CHECK_EQUAL(ac, a);\n   ac = a * c;\n   BOOST_CHECK_EQUAL(ac, 8 * 500L);\n   ac = 8 * 500L;\n   ac = ac + b + c;\n   BOOST_CHECK_EQUAL(ac, 8 * 500L + 64 + 500);\n   ac = a;\n   ac = b + c + ac;\n   BOOST_CHECK_EQUAL(ac, 8 + 64 + 500);\n   ac = ac - b + c;\n   BOOST_CHECK_EQUAL(ac, 8 + 64 + 500 - 64 + 500);\n   ac = a;\n   ac = b + c - ac;\n   BOOST_CHECK_EQUAL(ac, -8 + 64 + 500);\n   ac = a;\n   ac = ac * b;\n   BOOST_CHECK_EQUAL(ac, 8 * 64);\n   ac = a;\n   ac *= b * ac;\n   BOOST_CHECK_EQUAL(ac, 8 * 8 * 64);\n   ac = b;\n   ac = ac / a;\n   BOOST_CHECK_EQUAL(ac, 64 / 8);\n   ac = b;\n   ac /= ac / a;\n   BOOST_CHECK_EQUAL(ac, 64 / (64 / 8));\n   ac = a;\n   ac = b + ac * a;\n   BOOST_CHECK_EQUAL(ac, 64 * 2);\n   ac = a;\n   ac = b - ac * a;\n   BOOST_CHECK_EQUAL(ac, 0);\n   ac = a;\n   ac = b * (ac + a);\n   BOOST_CHECK_EQUAL(ac, 64 * (16));\n   ac = a;\n   ac = b / (ac * 1);\n   BOOST_CHECK_EQUAL(ac, 64 / 8);\n   ac = a;\n   ac = ac + b;\n   BOOST_CHECK_EQUAL(ac, 8 + 64);\n   ac = a;\n   ac = a + ac;\n   BOOST_CHECK_EQUAL(ac, 16);\n   ac = a;\n   ac = a - ac;\n   BOOST_CHECK_EQUAL(ac, 0);\n   ac = a;\n   ac += a + b;\n   BOOST_CHECK_EQUAL(ac, 80);\n   ac = a;\n   ac += b + a;\n   BOOST_CHECK_EQUAL(ac, 80);\n   ac = +a;\n   BOOST_CHECK_EQUAL(ac, 8);\n   ac = 8;\n   ac = a * ac;\n   BOOST_CHECK_EQUAL(ac, 8 * 8);\n   ac = a;\n   ac = a;\n   ac += +a;\n   BOOST_CHECK_EQUAL(ac, 16);\n   ac = a;\n   ac += b - a;\n   BOOST_CHECK_EQUAL(ac, 8 + 64 - 8);\n   ac = a;\n   ac += b * c;\n   BOOST_CHECK_EQUAL(ac, 8 + 64 * 500);\n   ac = a;\n   ac = a;\n   ac -= +a;\n   BOOST_CHECK_EQUAL(ac, 0);\n   ac = a;\n   BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::is_signed || is_twos_complement_integer<Real>::value)\n   {\n      ac = a;\n      ac -= c - b;\n      BOOST_CHECK_EQUAL(ac, 8 - (500 - 64));\n      ac = a;\n      ac -= b * c;\n      BOOST_CHECK_EQUAL(ac, 8 - 500 * 64);\n   }\n   ac = a;\n   ac += ac * b;\n   BOOST_CHECK_EQUAL(ac, 8 + 8 * 64);\n   BOOST_IF_CONSTEXPR (std::numeric_limits<Real>::is_signed || is_twos_complement_integer<Real>::value)\n   {\n      ac = a;\n      ac -= ac * b;\n      BOOST_CHECK_EQUAL(ac, 8 - 8 * 64);\n   }\n   ac = a * 8;\n   ac *= +a;\n   BOOST_CHECK_EQUAL(ac, 64 * 8);\n   ac = a;\n   ac *= b * c;\n   BOOST_CHECK_EQUAL(ac, 8 * 64 * 500);\n   ac = a;\n   ac *= b / a;\n   BOOST_CHECK_EQUAL(ac, 8 * 64 / 8);\n   ac = a;\n   ac *= b + c;\n   BOOST_CHECK_EQUAL(ac, 8 * (64 + 500));\n   ac = b;\n   ac /= +a;\n   BOOST_CHECK_EQUAL(ac, 8);\n   ac = b;\n   ac /= b / a;\n   BOOST_CHECK_EQUAL(ac, 64 / (64 / 8));\n   ac = b;\n   ac /= a + Real(0);\n   BOOST_CHECK_EQUAL(ac, 8);\n   //\n   // simple tests with immediate values, these calls can be optimised in many backends:\n   //\n   ac = a + b;\n   BOOST_CHECK_EQUAL(ac, 72);\n   ac = a + +b;\n   BOOST_CHECK_EQUAL(ac, 72);\n   ac = +a + b;\n   BOOST_CHECK_EQUAL(ac, 72);\n   ac = +a + +b;\n   BOOST_CHECK_EQUAL(ac, 72);\n   ac = a;\n   ac = b / ac;\n   BOOST_CHECK_EQUAL(ac, b / a);\n   //\n   // Comparisons:\n   //\n   test_relationals(a, b);\n   test_members(a);\n   //\n   // Use in Boolean context:\n   //\n   a = 0;\n   b = 2;\n   test_basic_conditionals(a, b);\n   //\n   // Test iostreams:\n   //\n   std::stringstream ss;\n   a = 20;\n   b = 2;\n   ss << a;\n   ss >> c;\n   BOOST_CHECK_EQUAL(a, c);\n   ss.clear();\n   ss << a + b;\n   ss >> c;\n   BOOST_CHECK_EQUAL(c, 22);\n   BOOST_CHECK_EQUAL(c, a + b);\n   //\n   // More cases for complete code coverage:\n   //\n   a = 20;\n   b = 30;\n   swap(a, b);\n   BOOST_CHECK_EQUAL(a, 30);\n   BOOST_CHECK_EQUAL(b, 20);\n   a = 20;\n   b = 30;\n   std::swap(a, b);\n   BOOST_CHECK_EQUAL(a, 30);\n   BOOST_CHECK_EQUAL(b, 20);\n   a = 20;\n   b = 30;\n   a = a + b * 2;\n   BOOST_CHECK_EQUAL(a, 20 + 30 * 2);\n   a = 100;\n   a = a - b * 2;\n   BOOST_CHECK_EQUAL(a, 100 - 30 * 2);\n   a = 20;\n   a = a * (b + 2);\n   BOOST_CHECK_EQUAL(a, 20 * (32));\n   a = 20;\n   a = (b + 2) * a;\n   BOOST_CHECK_EQUAL(a, 20 * (32));\n   a = 90;\n   b = 2;\n   a = a / (b + 0);\n   BOOST_CHECK_EQUAL(a, 45);\n   a = 20;\n   b = 30;\n   c = (a * b) + 22;\n   BOOST_CHECK_EQUAL(c, 20 * 30 + 22);\n   c = 22 + (a * b);\n   BOOST_CHECK_EQUAL(c, 20 * 30 + 22);\n   c  = 10;\n   ac = a + b * c;\n   BOOST_CHECK_EQUAL(ac, 20 + 30 * 10);\n   ac = b * c + a;\n   BOOST_CHECK_EQUAL(ac, 20 + 30 * 10);\n   a = a + b * c;\n   BOOST_CHECK_EQUAL(a, 20 + 30 * 10);\n   a = 20;\n   b = a + b * c;\n   BOOST_CHECK_EQUAL(b, 20 + 30 * 10);\n   b = 30;\n   c = a + b * c;\n   BOOST_CHECK_EQUAL(c, 20 + 30 * 10);\n   c = 10;\n   c = a + b / c;\n   BOOST_CHECK_EQUAL(c, 20 + 30 / 10);\n   //\n   // Additional tests for rvalue ref overloads:\n   //\n   a = 3;\n   b = 4;\n   c = Real(2) + a;\n   BOOST_CHECK_EQUAL(c, 5);\n   c = a + Real(2);\n   BOOST_CHECK_EQUAL(c, 5);\n   c = Real(3) + Real(2);\n   BOOST_CHECK_EQUAL(c, 5);\n   c = Real(2) + (a + b);\n   BOOST_CHECK_EQUAL(c, 9);\n   c = (a + b) + Real(2);\n   BOOST_CHECK_EQUAL(c, 9);\n   c = (a + b) + (a + b);\n   BOOST_CHECK_EQUAL(c, 14);\n   c = a * Real(4);\n   BOOST_CHECK_EQUAL(c, 12);\n   c = Real(3) * Real(4);\n   BOOST_CHECK_EQUAL(c, 12);\n   c = (a + b) * (a + b);\n   BOOST_CHECK_EQUAL(c, 49);\n   a = 2;\n   c = b / Real(2);\n   BOOST_CHECK_EQUAL(c, 2);\n   c = Real(4) / a;\n   BOOST_CHECK_EQUAL(c, 2);\n   c = Real(4) / Real(2);\n   BOOST_CHECK_EQUAL(c, 2);\n   //\n   // Test conditionals:\n   //\n   a = 20;\n   test_conditional(a, +a);\n   test_conditional(a, (a + 0));\n\n   test_signed_ops<Real>(std::integral_constant<bool, std::numeric_limits<Real>::is_signed>());\n   //\n   // Test hashing:\n   //\n   std::hash<Real> hasher;\n   std::size_t       s = hasher(a);\n   BOOST_CHECK_NE(s, 0);\n   std::hash<Real> hasher2;\n   s = hasher2(a);\n   BOOST_CHECK_NE(s, 0);\n\n   //\n   // Test move:\n   //\n   Real m(static_cast<Real&&>(a));\n   BOOST_CHECK_EQUAL(m, 20);\n   // Move from already moved from object:\n   Real m2(static_cast<Real&&>(a));\n   // assign from moved from object\n   // (may result in \"a\" being left in valid state as implementation artifact):\n   c = static_cast<Real&&>(a);\n   // assignment to moved-from objects:\n   c = static_cast<Real&&>(m);\n   BOOST_CHECK_EQUAL(c, 20);\n   m2 = c;\n   BOOST_CHECK_EQUAL(c, 20);\n   // Destructor of \"a\" checks destruction of moved-from-object...\n   Real m3(static_cast<Real&&>(a));\n#ifndef BOOST_MP_NOT_TESTING_NUMBER\n   //\n   // string and string_view:\n   //\n   {\n      std::string s1(\"2\");\n      Real        x(s1);\n      BOOST_CHECK_EQUAL(x, 2);\n      s1 = \"3\";\n      x.assign(s1);\n      BOOST_CHECK_EQUAL(x, 3);\n#ifndef BOOST_NO_CXX17_HDR_STRING_VIEW\n      s1 = \"20\";\n      std::string_view v(s1.c_str(), 1);\n      Real             y(v);\n      BOOST_CHECK_EQUAL(y, 2);\n      std::string_view v2(s1.c_str(), 2);\n      y.assign(v2);\n      BOOST_CHECK_EQUAL(y, 20);\n#endif\n   }\n#endif\n   //\n   // Bug cases, self assignment first:\n   //\n   a = 20;\n   a = self(a);\n   BOOST_CHECK_EQUAL(a, 20);\n\n   a = 2;\n   a = a * a * a;\n   BOOST_CHECK_EQUAL(a, 8);\n   a = 2;\n   a = a + a + a;\n   BOOST_CHECK_EQUAL(a, 6);\n   a = 2;\n   a = a - a + a;\n   BOOST_CHECK_EQUAL(a, 2);\n   a = 2;\n   a = a + a - a;\n   BOOST_CHECK_EQUAL(a, 2);\n   a = 2;\n   a = a * a - a;\n   BOOST_CHECK_EQUAL(a, 2);\n   a = 2;\n   a = a + a * a;\n   BOOST_CHECK_EQUAL(a, 6);\n   a = 2;\n   a = (a + a) * a;\n   BOOST_CHECK_EQUAL(a, 8);\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_ab_1.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include \"../performance/arithmetic_backend.hpp\"\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::arithmetic_backend<double> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_ab_2.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include \"../performance/arithmetic_backend.hpp\"\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::arithmetic_backend<int> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_ab_3.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include \"../performance/arithmetic_backend.hpp\"\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::arithmetic_backend<unsigned int> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_backend_concept.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   //\n   // Orininal Mingw32 has issues with long double that break this, mingw64 is fine (and supported):\n   //\n#if !(defined(CI_SUPPRESS_KNOWN_ISSUES) && defined(__MINGW32__) && !defined(_WIN64) && BOOST_WORKAROUND(BOOST_GCC, <= 50300))\n   test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_complex128.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/config.hpp>\n#ifdef BOOST_HAS_FLOAT128\n#include <boost/multiprecision/complex128.hpp>\n#endif\n\n#include \"libs/multiprecision/test/test_arithmetic.hpp\"\n\nint main()\n{\n#ifdef BOOST_HAS_FLOAT128\n   test<boost::multiprecision::complex128>();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_complex_adaptor.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#define NO_MIXED_OPS\n\n#include <boost/multiprecision/cpp_complex.hpp>\n\n#include \"libs/multiprecision/test/test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::cpp_complex_50>();\n   test<boost::multiprecision::number<boost::multiprecision::complex_adaptor<boost::multiprecision::cpp_bin_float<50> >, boost::multiprecision::et_on> >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_complex_adaptor_2.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#define MIXED_OPS_ONLY\n\n#include <boost/multiprecision/cpp_complex.hpp>\n\n#include \"libs/multiprecision/test/test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::cpp_complex_50>();\n   test<boost::multiprecision::number<boost::multiprecision::complex_adaptor<boost::multiprecision::cpp_bin_float<50> >, boost::multiprecision::et_on> >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_bin_float_1.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\n#include \"libs/multiprecision/test/test_arithmetic.hpp\"\n\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinExponent, Exponent MaxExponent, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET>                                                                                                            number_type;\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<((std::numeric_limits<number_type>::digits / 2) > std::numeric_limits<long double>::digits ? Digits / 2 : Digits), DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> type;\n};\n\nint main()\n{\n   test<boost::multiprecision::cpp_bin_float_50>();\n   //test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<21> > >();\n   //test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<1000, boost::multiprecision::digit_base_10, std::allocator<char> > > >();\n   //test<boost::multiprecision::cpp_bin_float_quad>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_bin_float_2.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#define NO_MIXED_OPS\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\n#include \"libs/multiprecision/test/test_arithmetic.hpp\"\n\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinExponent, Exponent MaxExponent, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET>                                                                                                            number_type;\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<((std::numeric_limits<number_type>::digits / 2) > std::numeric_limits<long double>::digits ? Digits / 2 : Digits), DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> type;\n};\n\nint main()\n{\n   //test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<1000, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();\n   //test<boost::multiprecision::cpp_bin_float_quad>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_bin_float_2m.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#define MIXED_OPS_ONLY\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\n#include \"libs/multiprecision/test/test_arithmetic.hpp\"\n\n#ifndef _WIN64 // object file too large\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinExponent, Exponent MaxExponent, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET>                                                                                                            number_type;\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<((std::numeric_limits<number_type>::digits / 2) > std::numeric_limits<long double>::digits ? Digits / 2 : Digits), DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> type;\n};\n#endif\n\nint main()\n{\n   //test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<1000, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();\n   //test<boost::multiprecision::cpp_bin_float_quad>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_bin_float_3.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\n#include \"libs/multiprecision/test/test_arithmetic.hpp\"\n\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinExponent, Exponent MaxExponent, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET>                                                                                                            number_type;\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<((std::numeric_limits<number_type>::digits / 2) > std::numeric_limits<long double>::digits ? Digits / 2 : Digits), DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> type;\n};\n\nint main()\n{\n   //test<boost::multiprecision::cpp_bin_float_50>();\n   //test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<1000, boost::multiprecision::digit_base_10, std::allocator<char> > > >();\n   test<boost::multiprecision::cpp_bin_float_quad>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_bin_float_4.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#if defined(__GNUC__) && defined(_WIN32)\n//\n// Without this, our object files get to big!\n//\n#define SLOW_COMPILER\n#endif\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\n#include \"libs/multiprecision/test/test_arithmetic.hpp\"\n\nusing namespace boost::multiprecision;\n\ntypedef number<cpp_bin_float<500>, et_on> cpp_bin_float_500_et_s;\n\ntemplate <>\nstruct related_type<cpp_bin_float_500_et_s>\n{\n   typedef number<cpp_bin_float<500, digit_base_10, std::allocator<char> >, et_on> type;\n};\n\nint main()\n{\n   test<cpp_bin_float_500_et_s>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_bin_float_5.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\n#include \"libs/multiprecision/test/test_arithmetic.hpp\"\n\nusing namespace boost::multiprecision;\n\ntypedef number<cpp_bin_float<500>, et_off> cpp_bin_float_500_et_s;\n\ntemplate <>\nstruct related_type<cpp_bin_float_500_et_s>\n{\n   typedef number<cpp_bin_float<500, digit_base_10, std::allocator<char> >, et_off> type;\n};\n\nint main()\n{\n   test<cpp_bin_float_500_et_s>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_complex_dbg_adptr.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_complex.hpp>\n#include <boost/multiprecision/debug_adaptor.hpp>\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::debug_adaptor<typename boost::multiprecision::cpp_complex_50::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_complex_logged_adptr.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_complex.hpp>\n#include <boost/multiprecision/logged_adaptor.hpp>\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::logged_adaptor<typename boost::multiprecision::cpp_complex_50::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_dec_float_1.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <unsigned D>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D> > >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D / 2> > type;\n};\n\nint main()\n{\n   test<boost::multiprecision::cpp_dec_float_50>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_dec_float_2.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <unsigned D>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D> > >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D / 2> > type;\n};\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100, long long>, boost::multiprecision::et_off> >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_dec_float_3.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#define NO_MIXED_OPS\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <unsigned D>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D> > >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D / 2> > type;\n};\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100, long long, std::allocator<char> >, boost::multiprecision::et_on> >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_dec_float_3m.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#define MIXED_OPS_ONLY\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <unsigned D>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D> > >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D / 2> > type;\n};\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100, long long, std::allocator<char> >, boost::multiprecision::et_on> >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_1.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   typedef boost::multiprecision::int256_t type;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;\n};\n\nint main()\n{\n   test<boost::multiprecision::cpp_int>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_10.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   typedef boost::multiprecision::int256_t type;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;\n};\n\nint main()\n{\n   test<boost::multiprecision::checked_cpp_rational>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_11.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public std::integral_constant<bool, true>\n{};\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   typedef boost::multiprecision::int256_t type;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;\n};\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<0, 0, boost::multiprecision::signed_magnitude, boost::multiprecision::checked>, boost::multiprecision::et_off> >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_12.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public std::integral_constant<bool, true>\n{};\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   typedef boost::multiprecision::int256_t type;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;\n};\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<500, 500, boost::multiprecision::signed_magnitude, boost::multiprecision::checked, void> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_13.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public std::integral_constant<bool, true>\n{};\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   typedef boost::multiprecision::int256_t type;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;\n};\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_14.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   typedef boost::multiprecision::int256_t type;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;\n};\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_15.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public std::integral_constant<bool, true>\n{};\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   typedef boost::multiprecision::int256_t type;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;\n};\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<31, 31, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_16.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public std::integral_constant<bool, true>\n{};\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   typedef boost::multiprecision::int256_t type;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;\n};\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::signed_magnitude, boost::multiprecision::checked, void> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_17.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   typedef boost::multiprecision::int256_t type;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;\n};\n\ntemplate <>\nstruct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::unsigned_magnitude, boost::multiprecision::checked, void> > > : public std::integral_constant<bool, true>\n{};\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::unsigned_magnitude, boost::multiprecision::checked, void> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_18.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public std::integral_constant<bool, true>\n{};\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   typedef boost::multiprecision::int256_t type;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;\n};\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<31, 31, boost::multiprecision::signed_magnitude, boost::multiprecision::checked, void> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_19.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::int128_t::backend_type> > >\n{\n   typedef boost::multiprecision::int128_t type;\n};\n\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::int128_t::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_2.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   typedef boost::multiprecision::int256_t type;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;\n};\n\nint main()\n{\n   test<boost::multiprecision::int512_t>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_20.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<4096> > type;\n};\n\nint main()\n{\n   test<boost::multiprecision::cpp_int>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_21.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::uint128_t::backend_type> > >\n{\n   typedef boost::multiprecision::uint128_t type;\n};\n\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::uint128_t::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_22.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::checked_uint256_t::backend_type> > >\n{\n   typedef boost::multiprecision::checked_uint256_t type;\n};\n\ntemplate <>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::checked_uint256_t::backend_type> > > : public std::false_type\n{};\n\ntemplate <>\nstruct is_checked_cpp_int<boost::multiprecision::checked_uint256_t> : public std::integral_constant<bool, true>\n{};\ntemplate <>\nstruct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::checked_uint256_t::backend_type> > > : public std::integral_constant<bool, true>\n{};\n\n\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::checked_uint256_t::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_23.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::checked_int256_t::backend_type> > >\n{\n   typedef boost::multiprecision::checked_int256_t type;\n};\n\ntemplate <>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::checked_int256_t::backend_type> > > : public std::false_type\n{};\n\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::checked_int256_t::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_3.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   typedef boost::multiprecision::int256_t type;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;\n};\n\nint main()\n{\n   test<boost::multiprecision::uint1024_t>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_4.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#define TEST_CHECKED_INT\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   typedef boost::multiprecision::int256_t type;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;\n};\n\ntemplate <>\nstruct is_checked_cpp_int<boost::multiprecision::checked_cpp_int> : public std::integral_constant<bool, true>\n{};\n\nint main()\n{\n   test<boost::multiprecision::checked_cpp_int>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_5.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public std::integral_constant<bool, true>\n{};\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   typedef boost::multiprecision::int256_t type;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;\n};\n\nint main()\n{\n   test<boost::multiprecision::checked_int512_t>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_6.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   typedef boost::multiprecision::int256_t type;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;\n};\n\ntemplate <>\nstruct is_checked_cpp_int<boost::multiprecision::checked_uint1024_t> : public std::integral_constant<bool, true>\n{};\n\nint main()\n{\n   test<boost::multiprecision::checked_uint1024_t>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_7.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   typedef boost::multiprecision::int256_t type;\n};\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_rational>\n{\n   typedef boost::multiprecision::cpp_int type;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;\n};\n\nint main()\n{\n   test<boost::multiprecision::cpp_rational>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_8.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   typedef boost::multiprecision::int256_t type;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;\n};\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<>, boost::multiprecision::et_off> >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_9.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   typedef boost::multiprecision::int256_t type;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;\n};\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<500, 500, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_br.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#define BOOST_MP_NOT_TESTING_NUMBER\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/rational.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::cpp_int>\n{\n   typedef boost::multiprecision::int256_t type;\n};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;\n};\n\nint main()\n{\n   test<boost::rational<boost::multiprecision::cpp_int> >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_dbg_adptr.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/debug_adaptor.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::debug_adaptor<typename boost::multiprecision::cpp_int::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_int_logged_adptr.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/logged_adaptor.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>\n{};\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::logged_adaptor<typename boost::multiprecision::cpp_int::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_rat_dbg_adptr.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/debug_adaptor.hpp>\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::debug_adaptor<typename boost::multiprecision::cpp_rational::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_cpp_rat_logged_adptr.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/logged_adaptor.hpp>\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::logged_adaptor<typename boost::multiprecision::cpp_rational::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_dbg_adptr1.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#define NO_MIXED_OPS\n\n#include <boost/multiprecision/debug_adaptor.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::cpp_dec_float<50> > > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_dbg_adptr1m.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#define MIXED_OPS_ONLY\n\n#include <boost/multiprecision/debug_adaptor.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::cpp_dec_float<50> > > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_dbg_adptr2.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/debug_adaptor.hpp>\n#include <boost/multiprecision/cpp_int.hpp>\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::cpp_int_backend<> > > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_float_128.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/float128.hpp>\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::float128>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_logged_1.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/logged_adaptor.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_dec_float<50> > > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_logged_2.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/logged_adaptor.hpp>\n#include <boost/multiprecision/cpp_int.hpp>\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_int_backend<> > > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpc.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/mpc.hpp>\n#define TEST_MPC\n\n#include \"libs/multiprecision/test/test_arithmetic.hpp\"\n\ntemplate <unsigned D>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::mpc_complex_backend<D> > >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D> > type;\n};\n\nint main()\n{\n   test<boost::multiprecision::mpc_complex_50>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpc_dbg_adptr.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/mpc.hpp>\n#include <boost/multiprecision/debug_adaptor.hpp>\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::debug_adaptor<typename boost::multiprecision::mpc_complex_50::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpc_logged_adptr.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/mpc.hpp>\n#include <boost/multiprecision/logged_adaptor.hpp>\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::logged_adaptor<typename boost::multiprecision::mpc_complex_50::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpf.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/gmp.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <unsigned D>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::gmp_float<D> > >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::gmp_float<D / 2> > type;\n};\ntemplate <>\nstruct related_type<boost::multiprecision::mpf_float>\n{\n   typedef boost::multiprecision::mpz_int type;\n};\n\nint main()\n{\n   boost::multiprecision::mpf_float::default_precision(1000);\n   BOOST_CHECK_EQUAL(boost::multiprecision::mpf_float::default_precision(), 1000);\n   test<boost::multiprecision::mpf_float>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpf_50.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/gmp.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <unsigned D>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::gmp_float<D> > >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::gmp_float<D / 2> > type;\n};\ntemplate <>\nstruct related_type<boost::multiprecision::mpf_float>\n{\n   typedef boost::multiprecision::mpz_int type;\n};\n\nint main()\n{\n   test<boost::multiprecision::mpf_float_50>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpf_dbg_adptr.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/debug_adaptor.hpp>\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::debug_adaptor<typename boost::multiprecision::mpf_float::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpf_logged_adptr.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/logged_adaptor.hpp>\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::logged_adaptor<typename boost::multiprecision::mpf_float::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpfi_50.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/mpfi.hpp>\n#define TEST_MPFR\n#include \"test_arithmetic.hpp\"\n\ntemplate <unsigned D>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<D> > >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<D / 2> > type;\n};\n\nint main()\n{\n   test<boost::multiprecision::mpfi_float_50>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpfi_dbg_adptr.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/mpfi.hpp>\n#include <boost/multiprecision/debug_adaptor.hpp>\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::debug_adaptor<typename boost::multiprecision::mpfi_float_50::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpfi_logged_adptr.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/mpfi.hpp>\n#include <boost/multiprecision/logged_adaptor.hpp>\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::logged_adaptor<typename boost::multiprecision::mpfi_float_50::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpfr.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/mpfr.hpp>\n#define TEST_MPFR\n#include \"test_arithmetic.hpp\"\n\ntemplate <unsigned D>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D> > >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D / 2> > type;\n};\n\nint main()\n{\n   test<boost::multiprecision::mpfr_float>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpfr_50.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/mpfr.hpp>\n#define TEST_MPFR\n#include \"test_arithmetic.hpp\"\n\ntemplate <unsigned D>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D> > >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D / 2> > type;\n};\n\nint main()\n{\n   test<boost::multiprecision::mpfr_float_50>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpfr_50_mixed.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/mpfr.hpp>\n#define TEST_MPFR\n#include \"test_arithmetic.hpp\"\n\ntemplate <>\nstruct related_type<boost::multiprecision::static_mpfr_float_50>\n{\n   typedef boost::multiprecision::mpfr_float_50 type;\n};\n\nint main()\n{\n   test<boost::multiprecision::static_mpfr_float_50>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpfr_50_static.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/mpfr.hpp>\n#define TEST_MPFR\n#include \"test_arithmetic.hpp\"\n\ntemplate <unsigned D>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D> > >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D / 2> > type;\n};\n\nint main()\n{\n   test<boost::multiprecision::static_mpfr_float_50>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpfr_dbg_adptr.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/multiprecision/debug_adaptor.hpp>\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::debug_adaptor<typename boost::multiprecision::mpfr_float::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpfr_logged_adptr.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/multiprecision/logged_adaptor.hpp>\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::logged_adaptor<typename boost::multiprecision::mpfr_float::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpq.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/gmp.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <>\nstruct related_type<boost::multiprecision::mpq_rational>\n{\n   typedef boost::multiprecision::mpz_int type;\n};\n\nint main()\n{\n   test<boost::multiprecision::mpq_rational>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpq_dbg_adptr.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/debug_adaptor.hpp>\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::debug_adaptor<typename boost::multiprecision::mpq_rational::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpq_logged_adptr.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/logged_adaptor.hpp>\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::logged_adaptor<typename boost::multiprecision::mpq_rational::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpz.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/rational_adaptor.hpp>\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::mpz_int>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpz_br.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/gmp.hpp>\n\n#define NO_MIXED_OPS\n#define BOOST_MP_NOT_TESTING_NUMBER\n\n#include \"test_arithmetic.hpp\"\n#include <boost/rational.hpp>\n\ntemplate <class T>\nstruct is_boost_rational<boost::rational<T> > : public std::integral_constant<bool, true>\n{};\n\nnamespace boost { namespace multiprecision {\n\ntemplate <>\nstruct number_category<rational<mpz_int> > : public std::integral_constant<int, number_kind_rational>\n{};\n\n}} // namespace boost::multiprecision\n\nint main()\n{\n   test<boost::rational<boost::multiprecision::mpz_int> >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpz_dbg_adptr.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/debug_adaptor.hpp>\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::debug_adaptor<typename boost::multiprecision::mpz_int::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpz_logged_adptr.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/logged_adaptor.hpp>\n\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::logged_adaptor<typename boost::multiprecision::mpz_int::backend_type> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_mpz_rat.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/rational_adaptor.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> > >\n{\n   typedef boost::multiprecision::mpz_int type;\n};\n\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_skeleton.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include \"skeleton_backend.hpp\"\n#include \"test_arithmetic.hpp\"\n\nint main()\n{\n   test<boost::multiprecision::skeleton_number>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_tommath.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/tommath.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <>\nstruct is_twos_complement_integer<boost::multiprecision::tom_int> : public std::integral_constant<bool, false>\n{};\n\nint main()\n{\n   test<boost::multiprecision::tom_int>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_tommath_br.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/tommath.hpp>\n\n#define NO_MIXED_OPS\n#define BOOST_MP_NOT_TESTING_NUMBER\n\n#include \"test_arithmetic.hpp\"\n\n#include <boost/rational.hpp>\n\ntemplate <class T>\nstruct is_boost_rational<boost::rational<T> > : public std::integral_constant<bool, true>\n{};\n\nnamespace boost { namespace multiprecision {\n\ntemplate <>\nstruct number_category<rational<tom_int> > : public std::integral_constant<int, number_kind_rational>\n{};\n\n}} // namespace boost::multiprecision\n\nint main()\n{\n   test<boost::rational<boost::multiprecision::tom_int> >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_arithmetic_tommath_rat.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/tommath.hpp>\n\n#include \"test_arithmetic.hpp\"\n\ntemplate <>\nstruct is_twos_complement_integer<boost::multiprecision::tom_int> : public std::integral_constant<bool, false>\n{};\n\ntemplate <>\nstruct related_type<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::tommath_int> > >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::tommath_int> type;\n};\n\n\nint main()\n{\n   test<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::tommath_int> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_asin.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n//#  define TEST_MPF\n#define TEST_BACKEND\n#define TEST_CPP_DEC_FLOAT\n#define TEST_MPFI_50\n#define TEST_FLOAT128\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(TEST_MPFR_50)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_MPFI_50)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n\ntemplate <class T>\nvoid test()\n{\n   std::cout << \"Testing type: \" << typeid(T).name() << std::endl;\n   //\n   // Test with some exact binary values as input - this tests our code\n   // rather than the test data:\n   //\n   static const boost::array<boost::array<T, 2>, 6> exact_data =\n       {{\n           {{0.5, static_cast<T>(\"0.523598775598298873077107230546583814032861566562517636829157432051302734381034833104672470890352844663691347752213717775\")}},\n           {{0.25, static_cast<T>(\"0.252680255142078653485657436993710972252193733096838193633923778740575060481021222411748742228014601605092602909414066566\")}},\n           {{0.75, static_cast<T>(\"0.848062078981481008052944338998418080073366213263112642860718163570200821228474234349189801731957230300995227265307531834\")}},\n           {{std::ldexp(1.0, -20), static_cast<T>(\"9.53674316406394560289664793089102218648031077292419572854816420395098616062014311172490017625353237219958438022056661501e-7\")}},\n           {{1 - std::ldexp(1.0, -20), static_cast<T>(\"1.56941525875313420204921285316218397515809899320201864334535204504240776023375739189119474528488143494473216475057072728\")}},\n           {{1, static_cast<T>(\"1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332354692230477529111586267970406424055872514205135096926055277982231147447746519098221440548783296672306423782411689339158263560095457282428346173017430522716332410669680363012457064\")}},\n       }};\n   unsigned max_err = 0;\n   for (unsigned k = 0; k < exact_data.size(); k++)\n   {\n      T        val = asin(exact_data[k][0]);\n      T        e   = relative_error(val, exact_data[k][1]);\n      unsigned err = e.template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n      val = asin(-exact_data[k][0]);\n      e   = relative_error(val, T(-exact_data[k][1]));\n      err = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         max_err = err;\n      }\n   }\n   std::cout << \"Max error was: \" << max_err << std::endl;\n   BOOST_TEST(max_err < 20);\n   BOOST_TEST(asin(T(0)) == 0);\n}\n\nint main()\n{\n#ifdef TEST_BACKEND\n   test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();\n#endif\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::mpf_float_50>();\n   test<boost::multiprecision::mpf_float_100>();\n#endif\n#ifdef TEST_MPFR_50\n   test<boost::multiprecision::mpfr_float_50>();\n   test<boost::multiprecision::mpfr_float_100>();\n#endif\n#ifdef TEST_MPFI_50\n   test<boost::multiprecision::mpfi_float_50>();\n   test<boost::multiprecision::mpfi_float_100>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>();\n   test<boost::multiprecision::cpp_dec_float_100>();\n#ifndef SLOW_COMPLER\n   // Some \"peculiar\" digit counts which stress our code:\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();\n   // Check low multiprecision digit counts.\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >();\n#endif\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_assume_uniform_precision.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <thread>\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include <boost/math/special_functions/relative_difference.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#include <boost/math/quadrature/tanh_sinh.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF) && !defined(TEST_MPFR) && !defined(TEST_MPFI) && !defined(TEST_MPC)\n#define TEST_MPF\n#define TEST_MPFR\n#define TEST_MPFI\n#define TEST_MPC\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\n#if defined(TEST_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_MPFI)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#if defined(TEST_MPC)\n#include <boost/multiprecision/mpc.hpp>\n#endif\n\ntemplate <class T>\nT new_value()\n{\n   return T(\"0.1\");\n}\n\ntemplate <class Other>\nOther make_other_big_value()\n{\n   if constexpr (std::numeric_limits<Other>::is_integer && !std::numeric_limits<Other>::is_bounded)\n      return (Other(1) << 1000) + 1;\n   else if constexpr (!std::numeric_limits<Other>::is_integer && std::numeric_limits<Other>::is_exact && (std::numeric_limits<Other>::max_exponent == std::numeric_limits<Other>::min_exponent))\n   {\n      using value_type = typename Other::value_type;\n      return Other(1) / ((value_type(1) << 1000) + 1);\n   }\n   else\n      return (std::numeric_limits<Other>::max)();\n}\n\ntemplate <class T, class Other>\nvoid test_mixed()\n{\n   T::thread_default_precision(10);\n   T::thread_default_variable_precision_options(boost::multiprecision::variable_precision_options::assume_uniform_precision);\n   Other big_a(make_other_big_value<Other>()), big_b(make_other_big_value<Other>()), big_c(make_other_big_value<Other>()), big_d(make_other_big_value<Other>());\n\n   T a(big_a);\n   BOOST_CHECK_EQUAL(a.precision(), 10);\n   T b(std::move(big_d));\n   BOOST_CHECK_EQUAL(a.precision(), 10);\n   if constexpr (std::is_assignable_v<T, Other>)\n   {\n      a = big_b;\n      BOOST_CHECK_EQUAL(a.precision(), 10);\n      b = std::move(big_c);\n      BOOST_CHECK_EQUAL(a.precision(), 10);\n\n      if constexpr (!std::is_assignable_v<Other, T>)\n      {\n         a = b + big_a;\n         BOOST_CHECK_EQUAL(a.precision(), 10);\n         a = b * big_a;\n         BOOST_CHECK_EQUAL(a.precision(), 10);\n         a = b - big_a;\n         BOOST_CHECK_EQUAL(a.precision(), 10);\n         a = b / big_a;\n         BOOST_CHECK_EQUAL(a.precision(), 10);\n         a += big_a;\n         BOOST_CHECK_EQUAL(a.precision(), 10);\n         a -= big_a;\n         BOOST_CHECK_EQUAL(a.precision(), 10);\n         a *= big_a;\n         BOOST_CHECK_EQUAL(a.precision(), 10);\n         a /= big_a;\n         BOOST_CHECK_EQUAL(a.precision(), 10);\n      }\n   }\n   if constexpr (!std::is_same_v<T, typename T::value_type>)\n   {\n      T cc(big_a, big_b);\n      BOOST_CHECK_EQUAL(cc.precision(), 10);\n      T dd(big_a, big_b, 55);\n      BOOST_CHECK_EQUAL(dd.precision(), 55);\n      T aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 10);\n      aa.assign(big_a);\n      BOOST_CHECK_EQUAL(aa.precision(), 10);\n      aa.assign(big_a, big_b);\n      BOOST_CHECK_EQUAL(aa.precision(), 10);\n      if constexpr (0 && std::is_constructible_v<T, Other, Other, int>)\n      {\n         aa.assign(big_a, big_b, 55);\n         BOOST_CHECK_EQUAL(aa.precision(), 55);\n      }\n   }\n   else\n   {\n      if constexpr (std::is_constructible_v<T, Other, int>)\n      {\n         T aa(big_a, 55);\n         BOOST_CHECK_EQUAL(aa.precision(), 55);\n         aa.precision(10);\n         BOOST_CHECK_EQUAL(aa.precision(), 10);\n         aa.assign(big_a);\n         BOOST_CHECK_EQUAL(aa.precision(), 10);\n         aa.assign(big_a, 55);\n         BOOST_CHECK_EQUAL(aa.precision(), 55);\n      }\n      else\n      {\n         T aa;\n         BOOST_CHECK_EQUAL(aa.precision(), 10);\n         aa.assign(big_a);\n         BOOST_CHECK_EQUAL(aa.precision(), 10);\n      }\n   }\n}\n\ntemplate <class T>\nvoid test()\n{\n   T::thread_default_precision(100);\n   T::thread_default_variable_precision_options(boost::multiprecision::variable_precision_options::assume_uniform_precision);\n\n   T hp1(\"0.1\"), hp2(\"0.3\"), hp3(\"0.11\"), hp4(\"0.1231\");\n\n   BOOST_CHECK_EQUAL(hp1.precision(), 100);\n   BOOST_CHECK_EQUAL(hp2.precision(), 100);\n\n   T::thread_default_precision(35);\n\n   T a(hp1);\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a = hp1;\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a = std::move(hp1);\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   T b(std::move(hp2));\n   BOOST_CHECK_EQUAL(b.precision(), 100);\n\n   a = b + hp3;\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a = hp3 * b;\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a += hp3;\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a *= hp4;\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a -= b * hp3;\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n\n   if constexpr (!std::is_same_v<T, typename T::value_type>)\n   {\n      //\n      // If we have a component type: ie we are an interval or a complex number, then\n      // operations involving the component type should match those of T:\n      //\n      using component_t = typename T::value_type;\n      component_t::thread_default_precision(100);\n      component_t::thread_default_variable_precision_options(boost::multiprecision::variable_precision_options::preserve_source_precision);\n\n      component_t cp1(\"0.1\"), cp2(\"0.3\"), cp3(\"0.11\"), cp4(\"0.1231\");\n\n      BOOST_CHECK_EQUAL(cp1.precision(), 100);\n      BOOST_CHECK_EQUAL(cp2.precision(), 100);\n\n      T::thread_default_precision(35);\n\n      T aa(cp1);\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      T cc(cp1, cp2);\n      BOOST_CHECK_EQUAL(cc.precision(), 35);\n      T dd(cp1, cp2, 20);\n      BOOST_CHECK_EQUAL(dd.precision(), 20);\n      aa = cp1;\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa = std::move(cp1);\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      T bb(std::move(cp2));\n      BOOST_CHECK_EQUAL(bb.precision(), 35);\n\n      aa = bb + cp3;\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa = cp3 * bb;\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa += cp3;\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa -= cp3;\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa *= cp4;\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa /= cp4;\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa -= bb * cp3;\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      \n      aa.assign(cp1);\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(cp1, cp2);\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(cp1, cp2, 20);\n      BOOST_CHECK_EQUAL(aa.precision(), 20);\n   }\n   else\n   {\n      T aa(hp4, 20);\n      BOOST_CHECK_EQUAL(aa.precision(), 20);\n      aa.precision(35);\n      aa.assign(hp4);\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(hp4, 20);\n      BOOST_CHECK_EQUAL(aa.precision(), 20);\n   }\n\n   test_mixed<T, char>();\n   test_mixed<T, unsigned char>();\n   test_mixed<T, signed char>();\n   test_mixed<T, short>();\n   test_mixed<T, unsigned short>();\n   test_mixed<T, int>();\n   test_mixed<T, unsigned int>();\n   test_mixed<T, long>();\n   test_mixed<T, unsigned long>();\n   test_mixed<T, long long>();\n   test_mixed<T, unsigned long long>();\n   test_mixed<T, float>();\n   test_mixed<T, double>();\n   test_mixed<T, long double>();\n   //\n   // Test with other compatible multiprecision types:\n   //\n   test_mixed<T, boost::multiprecision::mpz_int>();\n   test_mixed<T, boost::multiprecision::cpp_int>();\n   test_mixed<T, boost::multiprecision::mpq_rational>();\n   test_mixed<T, boost::multiprecision::cpp_rational>();\n   test_mixed<T, boost::multiprecision::cpp_bin_float_100>();\n   test_mixed<T, boost::multiprecision::cpp_dec_float_100>();\n   test_mixed<T, boost::multiprecision::mpf_float_100>();\n#if defined(TEST_MPFR) || defined(TEST_MPC) || defined(TEST_MPFI)\n   test_mixed<T, boost::multiprecision::mpfr_float_100>();\n#endif\n}\n\nint main()\n{\n#ifdef TEST_MPF\n   test<boost::multiprecision::mpf_float>();\n   test<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, boost::multiprecision::et_off>>();\n#endif\n#ifdef TEST_MPFR\n   test<boost::multiprecision::mpfr_float>();\n   test<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off> >();\n#endif\n#ifdef TEST_MPFI\n   test<boost::multiprecision::mpfi_float>();\n   test<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, boost::multiprecision::et_off> >();\n#endif\n#ifdef TEST_MPC\n   test<boost::multiprecision::mpc_complex>();\n   test<boost::multiprecision::number<boost::multiprecision::mpc_complex_backend<0>, boost::multiprecision::et_off> >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_atan.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n//#  define TEST_MPF\n#define TEST_BACKEND\n#define TEST_CPP_DEC_FLOAT\n#define TEST_MPFI_50\n#define TEST_FLOAT128\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(TEST_MPFR_50)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_MPFI_50)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\ntemplate <class T>\nT atan2_def(T y, T x)\n{\n   T t;\n   t.backend() = boost::multiprecision::default_ops::get_constant_pi<typename T::backend_type>();\n   T t2;\n   if (x)\n      t2 = atan(y / x);\n   else\n      t2 = y.sign() * t / 2;\n   return t2 + (t / 2) * (1 - x.sign()) * T(y.sign() + 0.5).sign();\n}\n\ntemplate <class T>\nstruct is_mpfr_type : public std::integral_constant<bool, false>\n{};\n\n#ifdef TEST_MPFR_50\ntemplate <unsigned Digits10>\nstruct is_mpfr_type<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10> > > : public std::integral_constant<bool, true>\n{};\n#endif\n\ntemplate <class T>\nvoid test()\n{\n   std::cout << \"Testing type: \" << typeid(T).name() << std::endl;\n   static const boost::array<const char*, 51u> data =\n       {{\n           \"9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999966666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667e-101\",\n           \"9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999996666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666668666666666666667e-97\",\n           \"9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666686666666666666666666666666666667e-93\",\n           \"9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999966666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666866666666666666666666666666666666666666666666667e-89\",\n           \"9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999996666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666668666666666666666666666666666666666666666666666666666666666666667e-85\",\n           \"9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666686666666666666666666666666666666666666666666666666666666666666666666666666666667e-81\",\n           \"9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999966666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667e-77\",\n           \"9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999996666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666668666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667e-73\",\n           \"9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666686666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667e-69\",\n           \"9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999966666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666665238095238095238e-65\",\n           \"9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999996666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666668666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666665238095238095238095238095238095238095238e-61\",\n           \"9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666686666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666665238095238095238095238095238095238095238095238095238095238095238e-57\",\n           \"9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999966666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666665238095238095238095238095238095238095238095238095238095238095238095238095238095238095238e-53\",\n           \"9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999996666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666668666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666665238095238095238095238095238095238095238095238095238095238095238095238095238095238095238095238096349206349206349e-49\",\n           \"9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999666666666666666666666666666666666666666666666666666666666666666666666666666666666666666686666666666666666666666666666666666666666666666666666666666666666666666666666666666666665238095238095238095238095238095238095238095238095238095238095238095238095238095238095238206349206349206349206349206349206349206349206349e-45\",\n           \"9.999999999999999999999999999999999999999999999999999999999999999999999999999999966666666666666666666666666666666666666666666666666666666666666666666666666666666866666666666666666666666666666666666666666666666666666666666666666666666666666665238095238095238095238095238095238095238095238095238095238095238095238095238095249206349206349206349206349206349206349206349206349206349206349206349206349206349e-41\",\n           \"9.99999999999999999999999999999999999999999999999999999999999999999999999666666666666666666666666666666666666666666666666666666666666666666666666866666666666666666666666666666666666666666666666666666666666666666666666523809523809523809523809523809523809523809523809523809523809523809523809634920634920634920634920634920634920634920634920634920634920634920634920544011544011544011544011544011544011544e-37\",\n           \"9.999999999999999999999999999999999999999999999999999999999999999666666666666666666666666666666666666666666666666666666666666666686666666666666666666666666666666666666666666666666666666666666665238095238095238095238095238095238095238095238095238095238095238206349206349206349206349206349206349206349206349206349206349206340115440115440115440115440115440115440115440115440115440115440116209346209346209e-33\",\n           \"9.999999999999999999999999999999999999999999999999999999966666666666666666666666666666666666666666666666666666666866666666666666666666666666666666666666666666666666666665238095238095238095238095238095238095238095238095238095249206349206349206349206349206349206349206349206349206349115440115440115440115440115440115440115440115440115440116209346209346209346209346209346209346209346209346209346202679543e-29\",\n           \"9.99999999999999999999999999999999999999999999999666666666666666666666666666666666666666666666666866666666666666666666666666666666666666666666666523809523809523809523809523809523809523809523809634920634920634920634920634920634920634920634920544011544011544011544011544011544011544011544011620934620934620934620934620934620934620934620934554267954267954267954267954267954267954267954268013091483679719e-25\",\n           \"9.999999999999999999999999999999999999999666666666666666666666666666666666666666686666666666666666666666666666666666666665238095238095238095238095238095238095238206349206349206349206349206349206349206340115440115440115440115440115440115440116209346209346209346209346209346209346209279542679542679542679542679542679542679548561895620719150130914836797189738366208428128459088211410192834341441152586663e-21\",\n           \"9.999999999999999999999999999999966666666666666666666666666666666866666666666666666666666666666665238095238095238095238095238095249206349206349206349206349206349115440115440115440115440115440116209346209346209346209346209346202679542679542679542679542679542738366208954444248561895620719149604599047323505527839893164970569113274066834438351466215243304983108499463325146458811824271509689681318218133e-17\",\n           \"9.999999999999999999999996666666666666666666666668666666666666666666666665238095238095238095238096349206349206349206349205440115440115440115440116209346209346209346209345542679542679542679542680130914836797189738366208428128459088211410192834817631628777139613052925311641589740930163598087002528653948764327011735444703713649735994600714288656350334489593033695272837185114343249547095046272603174268e-13\",\n           \"9.999999999999999666666666666666686666666666666665238095238095238206349206349206340115440115440116209346209346209279542679542679548561895620719149604599047323505575458940784018179051162265592202726621494746410579611835097095566286199717626418813764642659343446728207455753397291482030056516178836684094391777365260695851470017381944166954115569576329193296454393446430574957840819236721213626802085619e-9\",\n           \"0.00009999999966666666866666665238095249206349115440116209346202679542738366208428128463850116128619335776637836253560167434464812879197215298894881707269927081030999737549925482008672363799937606915962379247584324159094536421375755997513179578610677454920512897850953612762990732913046921088456079984429888220262137400213929962691532176198436788640624698990926490105259050461938357510947570244880435664081\",\n           \"0.78539816339744830961566084581987572104929234984377645524373614807695410157155224965700870633552926699553702162832057666177346115238764555793133985203212027936257102567548463027638991115573723873259549110720274391648336153211891205844669579131780047728641214173086508715261358166205334840181506228531843114675165157889704372038023024070731352292884109197314759000283263263720511663034603673798537790236\",\n           \"1.5706963267952299525626550249873704896065212085331517483940102693584808194810202180293789115097723406333076648941055516492022741759833189628737308869915412879148320539754700057326930986734751013960313584219296445913757777000240665569182597868494941800236191544832206381775972559949762275927455637707925634113006817837919481411335451596526426779712759369563859151046126747697908496855825977735219514481\",\n           \"1.5707963167948966192313220249730847754318980330208862438222342009158129649367552929648110725556184185509578339104318071142673796252326115673007840833450909541260947278453938016119958041324233151995987794877839930865561434524027270213271053829179745357590596408023867275770197075707094053216000680544580256094089113804288267449089904640326828789035666143699659867092108718279796583028512542392495421779\",\n           \"1.5707963267938966192313216916397514424319180330208862438208054294872415364764378326474936031472490101815502336217205184029120016698547471043186681600526965471042074304163483259318452680435202095109230279463923963492870040904012032740805456738144599352893425202988524603439218707929425378295371082108281620406379082813613862672159901100496534463976107550806601465567059619048829495421806391510160463001\",\n           \"1.5707963267948965192313216916397514420985846996878862438208056294872415364764378306473507460043918673244073765899887723711659699238229101634817272120007484952330785592874771970616254211570733230640365810600043257395046296021443620234312981206088055277773974880349347475097997796620171523611445056144296707974573126845590321623615288317089359131170138395627805178532322154433252386274406088878525130896\",\n           \"1.5707963267948966192213216916397514420985846996875529104874726294872415364764378326473507460043918673044073765899744866568802556381086244491974416088261453206299039561128740224575416159622681282588417758651991386266175167241223840014532761425201608391327088433455208280958809539778973505942839152244275827508237604782514078980809178018719474972957865632271450490908284680846718670522639450168825443945\",\n           \"1.5707963267948966192313206916397514420985846996875529104874722961539082034764378326473507460043918673244073765899744866566802556381086244491960130373975738920584753846844454510289702985019506679413814584048816783091570881436029034819727566620006803196521893628268096302936831517800951527920861130266253182819592915368594665061395258604800061112367475630116742454513973110064559653064241192080164878504\",\n           \"1.5707963267948966192313216915397514420985846996875529104874722961539082031431044993143507460043918673244073765899744866568802556381086244491940130373975738920584753846843025938861131556448078107985386012620245354520143421118568717359410106302546485736203322199696666822417350998320432047401380610785733702300121487566396862863593060802602258914565277827918940256045031718123167711672299800138772937113\",\n           \"1.5707963267948966192313216916397414420985846996875529104874722961539082031431044993140174126710588673244073765899744866568802556381086244491960130373975738920584553846843025938861131556448078107985243155477388211663000563975725860216552963445403628593347290453664920790671319252288686015654237753642876559442969539514448810915541112750654206966513329776061797398902251498342947931452519580358553156893\",\n           \"1.5707963267948966192313216916397514410985846996875529104874722961539082031431044993140174126710585339910740435899744866568802556381086244491960130373975738920584753846843025938861129556448078107985243155477388211663000563975711574502267249159689342879063004739379206504957033538002971729941063150468273384839794936339845636311255398464939921252227615490256602593707446303537753126257714385553358352607\",\n           \"1.5707963267948966192313216916397514420984846996875529104874722961539082031431044993140174126710585339910740432566411533238802556381086244491960130373975738920584753846843025938861131556448078107985243135477388211663000563975711574502267249159689342879061576167950635076385604966574543158512491721896844813411223507768417064883795081004622460934767298029939142275136017732109181697686285814124786923127\",\n           \"1.5707963267948966192313216916397514420985846896875529104874722961539082031431044993140174126710585339910740432566411533235469223047756244491960130373975738920584753846843025938861131556448078107985243155477388211663000563775711574502267249159689342879061576167950635076385604966574400301369634579039701956268380650625559922026652223861765318077624440887081999419104271700363149951654539782378755175984\",\n           \"1.5707963267948966192313216916397514420985846996865529104874722961539082031431044993140174126710585339910740432566411533235469223047752911158626800373975738920584753846843025938861131556448078107985243155477388211663000563975711574502267249157689342879061576167950635076385604966574400301369634579039701956268366364911274207740937938147481032363338726601367713704818557414648864237368825496664469462809\",\n           \"1.5707963267948966192313216916397514420985846996875528104874722961539082031431044993140174126710585339910740432566411533235469223047752911158626797040642405590584753846843025938861131556448078107985243155477388211663000563975711574502267249159689342879061576167930635076385604966574400301369634579039701956268366364911274207740937938147479603791910155172796285133390128843220292808797396925235898034238\",\n           \"1.5707963267948966192313216916397514420985846996875529104774722961539082031431044993140174126710585339910740432566411533235469223047752911158626797040642405587251420513513025938861131556448078107985243155477388211663000563975711574502267249159689342879061576167950635076385604966574200301369634579039701956268366364911274207740937938147479603791910155172796285133389985986077435665940254068093055177095\",\n           \"1.570796326794896619231321691639751442098584699687552910487471296153908203143104499314017412671058533991074043256641153323546922304775291115862679704064240558725142051350969260552780155644807810798524315547738821166300056397571157450226724915968934287906157616795063507638560496657440030136963457903969995626836636491127420774093793814747960379191015517279628513338998598607743566594025406809304089138\",\n           \"1.570796326794896619231321691639751442098584699687552910487472296053908203143104499314017412671058533991074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477798524315547738821166300056397571157450226724915968934287906157616795063507638560496657440030136963457903970195626836636491127418774093793814747960379191015517279628513338998598607743566594025406809304089138\",\n           \"1.570796326794896619231321691639751442098584699687552910487472296153898203143104499314017412671058533991074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477465190982214738821166300056397571157450226724915968934287906157616795063507638560496657440030136963457903970195626836636491127420774093793814747960359191015517279628513338998598607743566594025406809304089138\",\n           \"1.570796326794896619231321691639751442098584699687552910487472296153908202143104499314017412671058533991074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477465190982214405487832967056397571157450226724915968934287906157616795063507638560496657440030136963457903970195626836636491127420774093793814747960379191015517279628513138998598607743566594025406809304089138\",\n           \"1.570796326794896619231321691639751442098584699687552910487472296153908203143004499314017412671058533991074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477465190982214405487832966723064237824450226724915968934287906157616795063507638560496657440030136963457903970195626836636491127420774093793814747960379191015517279628513338998598607743566592025406809304089138\",\n           \"1.570796326794896619231321691639751442098584699687552910487472296153908203143104489314017412671058533991074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477465190982214405487832966723064237824116893391582968934287906157616795063507638560496657440030136963457903970195626836636491127420774093793814747960379191015517279628513338998598607743566594025406809304089138\",\n           \"1.570796326794896619231321691639751442098584699687552910487472296153908203143104499313017412671058533991074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477465190982214405487832966723064237824116893391582635600954573157616795063507638560496657440030136963457903970195626836636491127420774093793814747960379191015517279628513338998598607743566594025406809304089138\",\n           \"1.570796326794896619231321691639751442098584699687552910487472296153908203143104499314017312671058533991074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477465190982214405487832966723064237824116893391582635600954572824283461730507638560496657440030136963457903970195626836636491127420774093793814747960379191015517279628513338998598607743566594025406809304089138\",\n           \"1.570796326794896619231321691639751442098584699687552910487472296153908203143104499314017412661058533991074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477465190982214405487832966723064237824116893391582635600954572824283461730174305227163657440030136963457903970195626836636491127420774093793814747960379191015517279628513338998598607743566594025406809304089138\",\n           \"1.570796326794896619231321691639751442098584699687552910487472296153908203143104499314017412671057533991074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477465190982214405487832966723064237824116893391582635600954572824283461730174305227163324106696803963457903970195626836636491127420774093793814747960379191015517279628513338998598607743566594025406809304089138\",\n           \"1.570796326794896619231321691639751442098584699687552910487472296153908203143104499314017412671058533891074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477465190982214405487832966723064237824116893391582635600954572824283461730174305227163324106696803630124570637195626836636491127420774093793814747960379191015517279628513338998598607743566594025406809304089138\",\n       }};\n\n   T arg = static_cast<T>(\"1e-100\");\n\n   unsigned max_err = 0;\n   for (unsigned k = 0; k < data.size(); k++)\n   {\n      T        val = atan(arg);\n      T        e   = relative_error(val, T(data[k]));\n      unsigned err = e.template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n      val = atan(-arg);\n      e   = relative_error(val, T(-T(data[k])));\n      err = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         max_err = err;\n      }\n      arg *= 10000;\n   }\n   std::cout << \"Max error was: \" << max_err << std::endl;\n   BOOST_TEST(max_err < 10);\n   BOOST_TEST(atan(T(0)) == 0);\n\n   //\n   // And again, but test all the phases of atan2:\n   //\n   arg = static_cast<T>(\"1e-100\");\n   unsigned err;\n   for (unsigned k = 0; k < data.size(); k++)\n   {\n      T val = atan2(arg, 1);\n      T e   = relative_error(val, atan2_def(arg, T(1)));\n      err   = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         max_err = err;\n      }\n      val = atan2(-arg, 1);\n      e   = relative_error(val, atan2_def(T(-arg), T(1)));\n      err = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         max_err = err;\n      }\n      val = atan2(arg, -1);\n      e   = relative_error(val, atan2_def(arg, T(-1)));\n      err = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         max_err = err;\n      }\n      val = atan2(-arg, -1);\n      e   = relative_error(val, atan2_def(T(-arg), T(-1)));\n      err = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         max_err = err;\n      }\n      arg *= 10000;\n   }\n   //\n   // special cases:\n   //\n   err = relative_error(T(atan2(T(0), T(1))), atan2_def(T(0), T(1))).template convert_to<unsigned>();\n   if (err > max_err)\n      max_err = err;\n   if (!boost::multiprecision::is_interval_number<T>::value)\n   {\n      // We don't test this with intervals as [-0,0] leads to strange behaviour in atan2...\n      err = relative_error(T(atan2(T(0), T(-1))), atan2_def(T(0), T(-1))).template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n   }\n\n   T pi;\n   pi.backend() = boost::multiprecision::default_ops::get_constant_pi<typename T::backend_type>();\n\n   err = relative_error(T(atan2(T(1), T(0))), T(pi / 2)).template convert_to<unsigned>();\n   if (err > max_err)\n      max_err = err;\n\n   err = relative_error(T(atan2(T(-1), T(0))), T(pi / -2)).template convert_to<unsigned>();\n   if (err > max_err)\n      max_err = err;\n\n   T mv = (std::numeric_limits<T>::max)();\n   err  = relative_error(T(atan2(mv, T(1))), T(pi / 2)).template convert_to<unsigned>();\n   if (err > max_err)\n      max_err = err;\n   err = relative_error(T(atan2(-mv, T(1))), T(pi / -2)).template convert_to<unsigned>();\n   if (err > max_err)\n      max_err = err;\n\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      mv  = (std::numeric_limits<T>::infinity)();\n      err = relative_error(T(atan2(mv, T(1))), T(pi / 2)).template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n      err = relative_error(T(atan2(-mv, T(1))), T(pi / -2)).template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n   }\n\n   std::cout << \"Max error was: \" << max_err << std::endl;\n   BOOST_TEST(max_err < 2000);\n}\n\nint main()\n{\n#ifdef TEST_BACKEND\n   test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();\n#endif\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::mpf_float_50>();\n   test<boost::multiprecision::mpf_float_100>();\n#endif\n#ifdef TEST_MPFR_50\n   test<boost::multiprecision::mpfr_float_50>();\n   test<boost::multiprecision::mpfr_float_100>();\n#endif\n#ifdef TEST_MPFI_50\n   test<boost::multiprecision::mpfi_float_50>();\n   test<boost::multiprecision::mpfi_float_100>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>();\n   test<boost::multiprecision::cpp_dec_float_100>();\n#ifndef SLOW_COMPLER\n   // Some \"peculiar\" digit counts which stress our code:\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();\n   // Check low multiprecision digit counts.\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >();\n#endif\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_checked_cpp_int.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//\n// Compare arithmetic results using fixed_int to GMP results.\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include \"test.hpp\"\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n\ntemplate <class T>\nT generate_random(unsigned bits_wanted)\n{\n   static boost::random::mt19937               gen;\n   typedef boost::random::mt19937::result_type random_type;\n\n   T        max_val;\n   unsigned digits;\n   if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits))\n   {\n      max_val = (std::numeric_limits<T>::max)();\n      digits  = std::numeric_limits<T>::digits;\n   }\n   else\n   {\n      max_val = T(1) << bits_wanted;\n      digits  = bits_wanted;\n   }\n\n   unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n   while ((random_type(1) << bits_per_r_val) > (gen.max)())\n      --bits_per_r_val;\n\n   unsigned terms_needed = digits / bits_per_r_val + 1;\n\n   T val = 0;\n   for (unsigned i = 0; i < terms_needed; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   val %= max_val;\n   return val;\n}\n\ntemplate <class Number>\nvoid test_signed_overflow(Number a, Number b, const std::integral_constant<bool, true>&)\n{\n   a = -a;\n   BOOST_CHECK_THROW(Number(a * b), std::overflow_error);\n   ++a;\n   BOOST_CHECK(Number(a * b) >= (std::numeric_limits<Number>::min)());\n}\ntemplate <class Number>\nvoid test_signed_overflow(Number, Number, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class Number>\nvoid test()\n{\n   using namespace boost::multiprecision;\n   typedef Number test_type;\n\n   if (std::numeric_limits<test_type>::is_bounded)\n   {\n      test_type val = (std::numeric_limits<test_type>::max)();\n#ifndef BOOST_NO_EXCEPTIONS\n      BOOST_CHECK_THROW(++val, std::overflow_error);\n      val = (std::numeric_limits<test_type>::max)();\n      BOOST_CHECK_THROW(test_type(1 + val), std::overflow_error);\n      BOOST_CHECK_THROW(test_type(val + 1), std::overflow_error);\n      BOOST_CHECK_THROW(test_type(2 * val), std::overflow_error);\n      val /= 2;\n      val += 1;\n      BOOST_CHECK_THROW(test_type(2 * val), std::overflow_error);\n\n      if (std::numeric_limits<test_type>::is_signed)\n      {\n         val = (std::numeric_limits<test_type>::min)();\n         BOOST_CHECK_THROW(--val, std::overflow_error);\n         val = (std::numeric_limits<test_type>::min)();\n         BOOST_CHECK_THROW(test_type(val - 1), std::overflow_error);\n         BOOST_CHECK_THROW(test_type(2 * val), std::overflow_error);\n         val /= 2;\n         val -= 1;\n         BOOST_CHECK_THROW(test_type(2 * val), std::overflow_error);\n      }\n      else\n      {\n         val = (std::numeric_limits<test_type>::min)();\n         BOOST_CHECK_THROW(--val, std::range_error);\n         val = (std::numeric_limits<test_type>::min)();\n         BOOST_CHECK_THROW(test_type(val - 1), std::range_error);\n      }\n#endif\n      //\n      // Test overflow in random values:\n      //\n      for (unsigned bits = 30; bits < std::numeric_limits<test_type>::digits; bits += 30)\n      {\n         for (unsigned i = 0; i < 100; ++i)\n         {\n            val            = static_cast<test_type>(generate_random<cpp_int>(bits));\n            test_type val2 = 1 + (std::numeric_limits<test_type>::max)() / val;\n            BOOST_CHECK_THROW(test_type(val2 * val), std::overflow_error);\n            test_signed_overflow(val2, val, std::integral_constant<bool, std::numeric_limits<test_type>::is_signed>());\n            --val2;\n            BOOST_CHECK(cpp_int(val2) * cpp_int(val) <= cpp_int((std::numeric_limits<test_type>::max)()));\n            BOOST_CHECK(val2 * val <= (std::numeric_limits<test_type>::max)());\n            val2 = (std::numeric_limits<test_type>::max)() - val;\n            ++val2;\n            BOOST_CHECK_THROW(test_type(val2 + val), std::overflow_error);\n            BOOST_CHECK((val2 - 1) + val == (std::numeric_limits<test_type>::max)());\n            if (std::numeric_limits<test_type>::is_signed)\n            {\n               val2 = (std::numeric_limits<test_type>::min)() + val;\n               --val2;\n               BOOST_CHECK_THROW(test_type(val2 - val), std::overflow_error);\n               ++val2;\n               BOOST_CHECK(val2 - val == (std::numeric_limits<test_type>::min)());\n            }\n            unsigned shift = std::numeric_limits<test_type>::digits - msb(val);\n            BOOST_CHECK_THROW((val << shift) > 0, std::overflow_error);\n         }\n      }\n   }\n\n#ifndef BOOST_NO_EXCEPTIONS\n   if (std::numeric_limits<test_type>::is_signed)\n   {\n      test_type a = -1;\n      test_type b = 1;\n      BOOST_CHECK_THROW(test_type(a | b), std::range_error);\n      BOOST_CHECK_THROW(test_type(a & b), std::range_error);\n      BOOST_CHECK_THROW(test_type(a ^ b), std::range_error);\n   }\n   else\n   {\n      // Constructing from a negative value is not allowed:\n      BOOST_CHECK_THROW(test_type(-2), std::range_error);\n      BOOST_CHECK_THROW(test_type(\"-2\"), std::range_error);\n   }\n   if (std::numeric_limits<test_type>::digits < std::numeric_limits<long long>::digits)\n   {\n      long long llm = (std::numeric_limits<long long>::max)();\n      test_type t;\n      BOOST_CHECK_THROW(t = llm, std::range_error);\n      BOOST_CHECK_THROW(t = static_cast<test_type>(llm), std::range_error);\n      unsigned long long ullm = (std::numeric_limits<unsigned long long>::max)();\n      BOOST_CHECK_THROW(t = ullm, std::range_error);\n      BOOST_CHECK_THROW(t = static_cast<test_type>(ullm), std::range_error);\n\n      static const checked_uint512_t big = (std::numeric_limits<checked_uint512_t>::max)();\n      BOOST_CHECK_THROW(t = static_cast<test_type>(big), std::range_error);\n   }\n   //\n   // String errors:\n   //\n   BOOST_CHECK_THROW(test_type(\"12A\"), std::runtime_error);\n   BOOST_CHECK_THROW(test_type(\"0658\"), std::runtime_error);\n\n   if (std::numeric_limits<test_type>::is_signed)\n   {\n      BOOST_CHECK_THROW(test_type(-2).str(0, std::ios_base::hex), std::runtime_error);\n      BOOST_CHECK_THROW(test_type(-2).str(0, std::ios_base::oct), std::runtime_error);\n   }\n#endif\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n   test<number<cpp_int_backend<0, 0, signed_magnitude, checked> > >();\n   test<checked_int512_t>();\n   test<checked_uint512_t>();\n   test<number<cpp_int_backend<32, 32, signed_magnitude, checked, void> > >();\n   test<number<cpp_int_backend<32, 32, unsigned_magnitude, checked, void> > >();\n\n   //\n   // We also need to test type with \"odd\" bit counts in order to ensure full code coverage:\n   //\n   test<number<cpp_int_backend<528, 528, signed_magnitude, checked, void> > >();\n   test<number<cpp_int_backend<528, 528, unsigned_magnitude, checked, void> > >();\n   test<number<cpp_int_backend<48, 48, signed_magnitude, checked, void> > >();\n   test<number<cpp_int_backend<48, 48, unsigned_magnitude, checked, void> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_checked_mixed_cpp_int.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include \"test.hpp\"\n\ntemplate <class T, class U>\nvoid check_result_type(const T&, const U&)\n{\n   BOOST_CHECK(0);\n}\n\nvoid check_result_type(const boost::multiprecision::checked_int1024_t&, const boost::multiprecision::checked_int1024_t&) {}\n\nint main()\n{\n#ifndef BOOST_NO_EXCEPTIONS\n   try\n   {\n#endif\n      typedef boost::multiprecision::checked_int1024_t                                                                                                                                                    big_type;\n      typedef boost::multiprecision::checked_int512_t                                                                                                                                                     small_type;\n      typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<32, 32, boost::multiprecision::signed_magnitude, boost::multiprecision::checked, void>, boost::multiprecision::et_off> little_type;\n\n      big_type    big_val    = (big_type(1) << 1000) + 1;\n      small_type  small_val  = 1;\n      little_type little_val = 1;\n\n      check_result_type(big_val, big_val + small_val);\n      check_result_type(big_val, big_val - small_val);\n      check_result_type(big_val, big_val * small_val);\n      check_result_type(big_val, big_val / small_val);\n      check_result_type(big_val, big_val | small_val);\n      check_result_type(big_val, big_val & small_val);\n      check_result_type(big_val, big_val ^ small_val);\n      check_result_type(big_val, small_val + big_val);\n      check_result_type(big_val, small_val - big_val);\n      check_result_type(big_val, small_val * big_val);\n      check_result_type(big_val, small_val / big_val);\n      check_result_type(big_val, small_val | big_val);\n      check_result_type(big_val, small_val & big_val);\n      check_result_type(big_val, small_val ^ big_val);\n\n      check_result_type(big_val, big_val + little_val);\n      check_result_type(big_val, big_val - little_val);\n      check_result_type(big_val, big_val * little_val);\n      check_result_type(big_val, big_val / little_val);\n      check_result_type(big_val, big_val | little_val);\n      check_result_type(big_val, big_val & little_val);\n      check_result_type(big_val, big_val ^ little_val);\n      check_result_type(big_val, little_val + big_val);\n      check_result_type(big_val, little_val - big_val);\n      check_result_type(big_val, little_val * big_val);\n      check_result_type(big_val, little_val / big_val);\n      check_result_type(big_val, little_val | big_val);\n      check_result_type(big_val, little_val & big_val);\n      check_result_type(big_val, little_val ^ big_val);\n\n      BOOST_CHECK_EQUAL(big_val == small_val, false);\n      BOOST_CHECK_EQUAL(big_val <= small_val, false);\n      BOOST_CHECK_EQUAL(big_val >= small_val, true);\n      BOOST_CHECK_EQUAL(big_val < small_val, false);\n      BOOST_CHECK_EQUAL(big_val > small_val, true);\n      BOOST_CHECK_EQUAL(big_val != small_val, true);\n      BOOST_CHECK_EQUAL(small_val == big_val, false);\n      BOOST_CHECK_EQUAL(small_val <= big_val, true);\n      BOOST_CHECK_EQUAL(small_val >= big_val, false);\n      BOOST_CHECK_EQUAL(small_val < big_val, true);\n      BOOST_CHECK_EQUAL(small_val > big_val, false);\n      BOOST_CHECK_EQUAL(small_val != big_val, true);\n\n      BOOST_CHECK_EQUAL(big_val == little_val, false);\n      BOOST_CHECK_EQUAL(big_val <= little_val, false);\n      BOOST_CHECK_EQUAL(big_val >= little_val, true);\n      BOOST_CHECK_EQUAL(big_val < little_val, false);\n      BOOST_CHECK_EQUAL(big_val > little_val, true);\n      BOOST_CHECK_EQUAL(big_val != little_val, true);\n      BOOST_CHECK_EQUAL(little_val == big_val, false);\n      BOOST_CHECK_EQUAL(little_val <= big_val, true);\n      BOOST_CHECK_EQUAL(little_val >= big_val, false);\n      BOOST_CHECK_EQUAL(little_val < big_val, true);\n      BOOST_CHECK_EQUAL(little_val > big_val, false);\n      BOOST_CHECK_EQUAL(little_val != big_val, true);\n#ifndef BOOST_NO_EXCEPTIONS\n   }\n   catch (const std::exception& e)\n   {\n      std::cout << \"Failed with unexpected exception: \" << e.what() << std::endl;\n      return 1;\n   }\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_complex.cpp",
    "content": "\n///////////////////////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2016.\n//  Distributed under the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt\n//  or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n\n#include <cmath>\n#include <iomanip>\n#include <iostream>\n#include <limits>\n#include <string>\n\n#include <boost/lexical_cast.hpp>\n#ifdef TEST_MPC\n#include <boost/multiprecision/mpc.hpp>\n#endif\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/complex_adaptor.hpp>\n#ifdef BOOST_HAS_FLOAT128\n#include <boost/multiprecision/complex128.hpp>\n#endif\n\n#include \"test.hpp\"\n\nnamespace local {\ntemplate <typename complex_type>\nvoid test()\n{\n\n   typedef typename complex_type::value_type float_type;\n\n   const std::string str_tol(\"0.\" + std::string(std::size_t(std::numeric_limits<float_type>::digits10 - 2), char('0')) + std::string(std::size_t(2U), char('9')));\n\n   const float_type tol = boost::lexical_cast<float_type>(str_tol.c_str());\n\n   std::cout << \"Testing with tolerance: \" << tol << std::endl;\n\n   const complex_type z1(float_type(12U) / 10U, float_type(34U) / 10U);\n   const complex_type z2(float_type(56U) / 10U, float_type(78U) / 10U);\n   const complex_type i(float_type(0U), float_type(1U));\n\n   // See also, for example, numerical evaluation at Wolfram's Alpha.\n\n   const complex_type result_01 = z1 / z2;                      // N[((12/10) + ((34 I)/10)) / ((56/10) + ((78 I)/10)), 100]\n   const complex_type result_02 = complex_type(z1) /= z2;       // Same as above.\n   const complex_type result_03 = z1 / (i * z2);                // N[((12/10) + ((34 I)/10)) / ((-78/10) + ((56 I)/10)), 100]\n   const complex_type result_04 = complex_type(z1) /= (i * z2); // Same as above.\n   const complex_type result_05 = z1.real() / z2;               // N[((12/10) / ((56/10) + ((78 I)/10)), 100]\n   const complex_type result_06 = z1.real() / (i * z2);         // N[((12/10) / ((-78/10) + ((56 I)/10)), 100]\n   const complex_type result_07 = sqrt(z1);                     // N[Sqrt[(12/10) + ((34 I)/10)], 100]\n   const complex_type result_08 = sqrt(-z1);                    // N[Sqrt[(-12/10) - ((34 I)/10)], 100]\n   const complex_type result_09 = sin(z1);                      // N[Sin[(12/10) + ((34 I)/10)], 100]\n   const complex_type result_10 = sinh(z1);                     // N[Sinh[(12/10) + ((34 I)/10)], 100]\n   const complex_type result_11 = cosh(z1);                     // N[Cosh[(12/10) + ((34 I)/10)], 100]\n   const complex_type result_12 = log(z1);                      // N[Log[(12/10) + ((34 I)/10)], 100]\n   const complex_type result_13 = asin(z1);                     // N[ArcSin[(12/10) + ((34 I)/10)], 100]\n   const complex_type result_14 = acos(z1);                     // N[ArcCos[(12/10) + ((34 I)/10)], 100]\n   const complex_type result_15 = atan(z1);                     // N[ArcTan[(12/10) + ((34 I)/10)], 100]\n   const complex_type result_16 = acosh(z1);                    // N[ArcCosh[(12/10) + ((34 I)/10)], 100]\n   const complex_type result_17 = atanh(z1);                    // N[ArcTanh[(12/10) + ((34 I)/10)], 100]\n   const complex_type result_18 = exp(z1);                      // N[Exp[(12/10) + ((34 I)/10)], 100]\n   const complex_type result_19 = pow(z1, 5);                   // N[((12/10) + ((34 I)/10)) ^ 5, 100]\n   const complex_type result_20 = pow(z1, z2);                  // N[((12/10) + ((34 I)/10)) ^ ((56/10) + ((78 I)/10)), 100]\n   const complex_type result_21 = pow(z1.real(), z2);           // N[(12/10)^((56/10) + ((78 I)/10)), 100]\n   const complex_type result_22 = cos(z1);\n   const complex_type result_23 = asinh(z1);\n   const complex_type result_24 = tanh(z1);\n   const complex_type result_25 = log10(z1);\n   const complex_type result_26 = tan(z1);\n\n   const complex_type control_01(boost::lexical_cast<float_type>(\"+0.3605206073752711496746203904555314533622559652928416485900216919739696312364425162689804772234273319\"), boost::lexical_cast<float_type>(\"+0.1049891540130151843817787418655097613882863340563991323210412147505422993492407809110629067245119306\"));\n   const complex_type control_02(boost::lexical_cast<float_type>(\"+0.3605206073752711496746203904555314533622559652928416485900216919739696312364425162689804772234273319\"), boost::lexical_cast<float_type>(\"+0.1049891540130151843817787418655097613882863340563991323210412147505422993492407809110629067245119306\"));\n   const complex_type control_03(boost::lexical_cast<float_type>(\"+0.1049891540130151843817787418655097613882863340563991323210412147505422993492407809110629067245119306\"), boost::lexical_cast<float_type>(\"-0.3605206073752711496746203904555314533622559652928416485900216919739696312364425162689804772234273319\"));\n   const complex_type control_04(boost::lexical_cast<float_type>(\"+0.1049891540130151843817787418655097613882863340563991323210412147505422993492407809110629067245119306\"), boost::lexical_cast<float_type>(\"-0.3605206073752711496746203904555314533622559652928416485900216919739696312364425162689804772234273319\"));\n   const complex_type control_05(boost::lexical_cast<float_type>(\"+0.07288503253796095444685466377440347071583514099783080260303687635574837310195227765726681127982646421\"), boost::lexical_cast<float_type>(\"-0.10151843817787418655097613882863340563991323210412147505422993492407809110629067245119305856832971800\"));\n   const complex_type control_06(boost::lexical_cast<float_type>(\"-0.10151843817787418655097613882863340563991323210412147505422993492407809110629067245119305856832971800\"), boost::lexical_cast<float_type>(\"-0.07288503253796095444685466377440347071583514099783080260303687635574837310195227765726681127982646421\"));\n   const complex_type control_07(boost::lexical_cast<float_type>(\"+1.5500889128472581416161256546038815669761567486848749301860666965618993040312647033986371788677357208\"), boost::lexical_cast<float_type>(\"+1.096711282759503047577277387056220643003106823143745046422869808875853261131777962620301480493467395\"));\n   const complex_type control_08(boost::lexical_cast<float_type>(\"+1.096711282759503047577277387056220643003106823143745046422869808875853261131777962620301480493467395\"), boost::lexical_cast<float_type>(\"-1.550088912847258141616125654603881566976156748684874930186066696561899304031264703398637178867735721\"));\n   const complex_type control_09(boost::lexical_cast<float_type>(\"+13.97940880601799793712580492576613541257396172944193599059708688128463118206190268215536541838594224\"), boost::lexical_cast<float_type>(\"+5.42281547246340124509840716106599160358961329374827042575715571177243361237429170135167564889390308\"));\n   const complex_type control_10(boost::lexical_cast<float_type>(\"-1.459344510181031985739679928789446132188487461323488604725673812272622166868694452733557505015403343\"), boost::lexical_cast<float_type>(\"-0.462696919065088203665190427736980818788403809123239459086853242811288735966522197819049006036217659\"));\n   const complex_type control_11(boost::lexical_cast<float_type>(\"-1.750538529873144139045226521462954860931070703406867443705575327698120127693949444003491179539803540\"), boost::lexical_cast<float_type>(\"-0.385729418228941114585783287542904778761684113049496885765699906882071623161614865310950661528173196\"));\n   const complex_type control_12(boost::lexical_cast<float_type>(\"+1.282474678730768368026743720782659302402633972380103558209522755331732333662205089699787331720244744\"), boost::lexical_cast<float_type>(\"+1.231503712340851938048420309342408065643217837171236736591653326549432606404929552637127722999523972\"));\n   const complex_type control_13(boost::lexical_cast<float_type>(\"+0.327743052014525194927829972510958755346463574500092232271394201982853487105798907461836716106793827\"), boost::lexical_cast<float_type>(\"+1.990465064891068704855135027843677587369707826516050430927052768488360486375325411568355926052994795\"));\n   const complex_type control_14(boost::lexical_cast<float_type>(\"+1.243053274780371424303491719128792686752121125187460678216078094171054716037305591852180696564264707\"), boost::lexical_cast<float_type>(\"-1.990465064891068704855135027843677587369707826516050430927052768488360486375325411568355926052994795\"));\n   const complex_type control_15(boost::lexical_cast<float_type>(\"+1.472098546869956240046296809042356295374792147793626859728627826033391218153982606447668498652414512\"), boost::lexical_cast<float_type>(\"+0.265217990171315665670057272294610940896446740868740866767584213220467425714221740314551620202361000\"));\n   const complex_type control_16(boost::lexical_cast<float_type>(\"+1.990465064891068704855135027843677587369707826516050430927052768488360486375325411568355926052994795\"), boost::lexical_cast<float_type>(\"+1.243053274780371424303491719128792686752121125187460678216078094171054716037305591852180696564264707\"));\n   const complex_type control_17(boost::lexical_cast<float_type>(\"+0.0865690591794584441708728351688739957204743888691393886743981396542994588169512931672375066385325971\"), boost::lexical_cast<float_type>(\"+1.3130218230654070842957152910299990808349983340931830855923498117237087784015805687823303378344863815\"));\n   const complex_type control_18(boost::lexical_cast<float_type>(\"-3.209883040054176124784906450252400993119558164730356048431249139970742294562643896737048684555206883\"), boost::lexical_cast<float_type>(\"-0.848426337294029318250973715279885597550087922172736344852553149693360359128137063129999667564390855\"));\n   const complex_type control_19(boost::lexical_cast<float_type>(\"+604.5331200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\"), boost::lexical_cast<float_type>(\"-76.3721600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\"));\n   const complex_type control_20(boost::lexical_cast<float_type>(\"-0.03277613870122620601990858385164868868755535963372013573012556184586155243067581560513902047571175876\"), boost::lexical_cast<float_type>(\"-0.08229096285844296094766104540456274850393339107196281307901532754610012233461478959682645571793968423\"));\n   const complex_type control_21(boost::lexical_cast<float_type>(\"+0.411234943477464115466545795217592784968613499972731227382657362718492707513495252941835813107553442\"), boost::lexical_cast<float_type>(\"+2.745341999926603737618437066482640101524732307796305942046035072295581269096378050886721641340275877\"));\n   const complex_type control_22(boost::lexical_cast<float_type>(\"+5.434908535625768828356755041961059164496984604872689362797531800548498933607521437636349622508613554091586385714\"), boost::lexical_cast<float_type>(\"-13.94830361398843812562310928749334812612948167559995042721295554487075295893311479161719058895913730856339351903\"));\n   const complex_type control_23(boost::lexical_cast<float_type>(\"1.960545624274756532757863147926614306606344023611895252748744677291286163242757958621205801565261867742512464966\"), boost::lexical_cast<float_type>(\"1.218868916639890129907167289780557894460959308403278313426586722860313100564201336738382323265397208095855244598\"));\n   const complex_type control_24(boost::lexical_cast<float_type>(\"0.850596957549373767077286649475619401136709177565015571227494818854489310955671601843121766190907188858336389856\"), boost::lexical_cast<float_type>(\"0.0768887100657045933256083080177585250084258780189064853743639639730289473609169028321092839605973770873615254969\"));\n   const complex_type control_25(boost::lexical_cast<float_type>(\"0.556971676153418384603252578971164215414864594193534135900595487498776545815097120403823727129449829836488977743\"), boost::lexical_cast<float_type>(\"0.534835266713001566463607491752731752251883431441322590506193641481222966948925488019132991641807563958917938106\"));\n   const complex_type control_26(boost::lexical_cast<float_type>(\"0.001507101875805783093387404217890750536099188330196632424994845319829605048223792684300657269522163036773069001022\"), boost::lexical_cast<float_type>(\"1.001642796989141044331404504473463720289288872859072985897399123485040632782581390249339681901758734269277005380\"));\n\n   BOOST_CHECK_CLOSE_FRACTION(result_01.real(), control_01.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_01.imag(), control_01.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_02.real(), control_02.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_02.imag(), control_02.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_03.real(), control_03.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_03.imag(), control_03.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_04.real(), control_04.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_04.imag(), control_04.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_05.real(), control_05.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_05.imag(), control_05.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_06.real(), control_06.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_06.imag(), control_06.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_07.real(), control_07.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_07.imag(), control_07.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_08.real(), control_08.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_08.imag(), control_08.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_09.real(), control_09.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_09.imag(), control_09.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_10.real(), control_10.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_10.imag(), control_10.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_11.real(), control_11.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_11.imag(), control_11.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_12.real(), control_12.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_12.imag(), control_12.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_13.real(), control_13.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_13.imag(), control_13.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_14.real(), control_14.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_14.imag(), control_14.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_15.real(), control_15.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_15.imag(), control_15.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_16.real(), control_16.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_16.imag(), control_16.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_17.real(), control_17.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_17.imag(), control_17.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_18.real(), control_18.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_18.imag(), control_18.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_19.real(), control_19.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_19.imag(), control_19.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_20.real(), control_20.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_20.imag(), control_20.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_21.real(), control_21.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_21.imag(), control_21.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_22.real(), control_22.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_22.imag(), control_22.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_23.real(), control_23.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_23.imag(), control_23.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_24.real(), control_24.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_24.imag(), control_24.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_25.real(), control_25.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_25.imag(), control_25.imag(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_26.real(), control_26.real(), tol);\n   BOOST_CHECK_CLOSE_FRACTION(result_26.imag(), control_26.imag(), tol);\n\n   BOOST_CHECK_CLOSE_FRACTION(abs(z1), boost::lexical_cast<float_type>(\"3.60555127546398929311922126747049594625129657384524621271045305622716694829301044520461908201849071767351418202406\"), tol)\n}\n} // namespace local\n\nint main()\n{\n   //local::test<std::complex<double> >();\n#ifdef TEST_MPC\n   local::test<boost::multiprecision::mpc_complex_50>();\n   local::test<boost::multiprecision::mpc_complex_100>();\n#endif\n   local::test<boost::multiprecision::number<boost::multiprecision::complex_adaptor<boost::multiprecision::cpp_bin_float<50> >, boost::multiprecision::et_on> >();\n   local::test<boost::multiprecision::number<boost::multiprecision::complex_adaptor<boost::multiprecision::cpp_bin_float<50> >, boost::multiprecision::et_off> >();\n#ifdef BOOST_HAS_FLOAT128\n   local::test<boost::multiprecision::complex128>();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_complex_signed_zero.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/math/special_functions/sign.hpp>\n#include <complex>\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#if !defined(TEST_CPP_BIN_FLOAT) && !defined(TEST_DOUBLE) && !defined(TEST_MPC)\n#define TEST_CPP_BIN_FLOAT\n#define TEST_DOUBLE\n#define TEST_MPC\n#endif\n\n\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_complex.hpp>\n#endif\n#ifdef TEST_MPC\n#include <boost/multiprecision/mpc.hpp>\n#endif\n\ntemplate <class T>\nvoid test()\n{\n   using std::real;\n   using std::imag;\n   using std::signbit;\n   using std::isnan;\n\n   using value_type = typename T::value_type;\n\n   T result;\n   //\n   // Muliply the permutations which give at least one zero:\n   //\n   static constexpr std::array<std::array<double, 6>, 256> mul_data = \n   { {\n      {{+0.000, +0.000, +0.000, +0.000, +0.000, +0.000}},\n      {{+0.000, +0.000, +0.000, -0.000, +0.000, +0.000}},\n      {{+0.000, +0.000, +0.000, +2.000, +0.000, +0.000}},\n      {{+0.000, +0.000, +0.000, -2.000, +0.000, +0.000}},\n      {{+0.000, +0.000, -0.000, +0.000, -0.000, +0.000}},\n      {{+0.000, +0.000, -0.000, -0.000, +0.000, -0.000}},\n      {{+0.000, +0.000, -0.000, +2.000, -0.000, +0.000}},\n      {{+0.000, +0.000, -0.000, -2.000, +0.000, -0.000}},\n      {{+0.000, +0.000, +2.000, +0.000, +0.000, +0.000}},\n      {{+0.000, +0.000, +2.000, -0.000, +0.000, +0.000}},\n      {{+0.000, +0.000, +2.000, +2.000, +0.000, +0.000}},\n      {{+0.000, +0.000, +2.000, -2.000, +0.000, +0.000}},\n      {{+0.000, +0.000, -2.000, +0.000, -0.000, +0.000}},\n      {{+0.000, +0.000, -2.000, -0.000, +0.000, -0.000}},\n      {{+0.000, +0.000, -2.000, +2.000, -0.000, +0.000}},\n      {{+0.000, +0.000, -2.000, -2.000, +0.000, -0.000}},\n      {{+0.000, -0.000, +0.000, +0.000, +0.000, +0.000}},\n      {{+0.000, -0.000, +0.000, -0.000, +0.000, -0.000}},\n      {{+0.000, -0.000, +0.000, +2.000, +0.000, +0.000}},\n      {{+0.000, -0.000, +0.000, -2.000, +0.000, -0.000}},\n      {{+0.000, -0.000, -0.000, +0.000, +0.000, +0.000}},\n      {{+0.000, -0.000, -0.000, -0.000, -0.000, +0.000}},\n      {{+0.000, -0.000, -0.000, +2.000, +0.000, +0.000}},\n      {{+0.000, -0.000, -0.000, -2.000, -0.000, +0.000}},\n      {{+0.000, -0.000, +2.000, +0.000, +0.000, +0.000}},\n      {{+0.000, -0.000, +2.000, -0.000, +0.000, -0.000}},\n      {{+0.000, -0.000, +2.000, +2.000, +0.000, +0.000}},\n      {{+0.000, -0.000, +2.000, -2.000, +0.000, -0.000}},\n      {{+0.000, -0.000, -2.000, +0.000, +0.000, +0.000}},\n      {{+0.000, -0.000, -2.000, -0.000, -0.000, +0.000}},\n      {{+0.000, -0.000, -2.000, +2.000, +0.000, +0.000}},\n      {{+0.000, -0.000, -2.000, -2.000, -0.000, +0.000}},\n      {{+0.000, +2.000, +0.000, +0.000, +0.000, +0.000}},\n      {{+0.000, +2.000, +0.000, -0.000, +0.000, +0.000}},\n      {{+0.000, +2.000, +0.000, +2.000, -4.000, +0.000}},\n      {{+0.000, +2.000, +0.000, -2.000, +4.000, +0.000}},\n      {{+0.000, +2.000, -0.000, +0.000, -0.000, +0.000}},\n      {{+0.000, +2.000, -0.000, -0.000, +0.000, -0.000}},\n      {{+0.000, +2.000, -0.000, +2.000, -4.000, +0.000}},\n      {{+0.000, +2.000, -0.000, -2.000, +4.000, -0.000}},\n      {{+0.000, +2.000, +2.000, +0.000, +0.000, +4.000}},\n      {{+0.000, +2.000, +2.000, -0.000, +0.000, +4.000}},\n      {{+0.000, +2.000, +2.000, +2.000, -4.000, +4.000}},\n      {{+0.000, +2.000, +2.000, -2.000, +4.000, +4.000}},\n      {{+0.000, +2.000, -2.000, +0.000, -0.000, -4.000}},\n      {{+0.000, +2.000, -2.000, -0.000, +0.000, -4.000}},\n      {{+0.000, +2.000, -2.000, +2.000, -4.000, -4.000}},\n      {{+0.000, +2.000, -2.000, -2.000, +4.000, -4.000}},\n      {{+0.000, -2.000, +0.000, +0.000, +0.000, +0.000}},\n      {{+0.000, -2.000, +0.000, -0.000, +0.000, -0.000}},\n      {{+0.000, -2.000, +0.000, +2.000, +4.000, +0.000}},\n      {{+0.000, -2.000, +0.000, -2.000, -4.000, -0.000}},\n      {{+0.000, -2.000, -0.000, +0.000, +0.000, +0.000}},\n      {{+0.000, -2.000, -0.000, -0.000, -0.000, +0.000}},\n      {{+0.000, -2.000, -0.000, +2.000, +4.000, +0.000}},\n      {{+0.000, -2.000, -0.000, -2.000, -4.000, +0.000}},\n      {{+0.000, -2.000, +2.000, +0.000, +0.000, -4.000}},\n      {{+0.000, -2.000, +2.000, -0.000, +0.000, -4.000}},\n      {{+0.000, -2.000, +2.000, +2.000, +4.000, -4.000}},\n      {{+0.000, -2.000, +2.000, -2.000, -4.000, -4.000}},\n      {{+0.000, -2.000, -2.000, +0.000, +0.000, +4.000}},\n      {{+0.000, -2.000, -2.000, -0.000, -0.000, +4.000}},\n      {{+0.000, -2.000, -2.000, +2.000, +4.000, +4.000}},\n      {{+0.000, -2.000, -2.000, -2.000, -4.000, +4.000}},\n      {{-0.000, +0.000, +0.000, +0.000, -0.000, +0.000}},\n      {{-0.000, +0.000, +0.000, -0.000, +0.000, +0.000}},\n      {{-0.000, +0.000, +0.000, +2.000, -0.000, +0.000}},\n      {{-0.000, +0.000, +0.000, -2.000, +0.000, +0.000}},\n      {{-0.000, +0.000, -0.000, +0.000, +0.000, -0.000}},\n      {{-0.000, +0.000, -0.000, -0.000, +0.000, +0.000}},\n      {{-0.000, +0.000, -0.000, +2.000, +0.000, -0.000}},\n      {{-0.000, +0.000, -0.000, -2.000, +0.000, +0.000}},\n      {{-0.000, +0.000, +2.000, +0.000, -0.000, +0.000}},\n      {{-0.000, +0.000, +2.000, -0.000, +0.000, +0.000}},\n      {{-0.000, +0.000, +2.000, +2.000, -0.000, +0.000}},\n      {{-0.000, +0.000, +2.000, -2.000, +0.000, +0.000}},\n      {{-0.000, +0.000, -2.000, +0.000, +0.000, -0.000}},\n      {{-0.000, +0.000, -2.000, -0.000, +0.000, +0.000}},\n      {{-0.000, +0.000, -2.000, +2.000, +0.000, -0.000}},\n      {{-0.000, +0.000, -2.000, -2.000, +0.000, +0.000}},\n      {{-0.000, -0.000, +0.000, +0.000, +0.000, -0.000}},\n      {{-0.000, -0.000, +0.000, -0.000, -0.000, +0.000}},\n      {{-0.000, -0.000, +0.000, +2.000, +0.000, -0.000}},\n      {{-0.000, -0.000, +0.000, -2.000, -0.000, +0.000}},\n      {{-0.000, -0.000, -0.000, +0.000, +0.000, +0.000}},\n      {{-0.000, -0.000, -0.000, -0.000, +0.000, +0.000}},\n      {{-0.000, -0.000, -0.000, +2.000, +0.000, +0.000}},\n      {{-0.000, -0.000, -0.000, -2.000, +0.000, +0.000}},\n      {{-0.000, -0.000, +2.000, +0.000, +0.000, -0.000}},\n      {{-0.000, -0.000, +2.000, -0.000, -0.000, +0.000}},\n      {{-0.000, -0.000, +2.000, +2.000, +0.000, -0.000}},\n      {{-0.000, -0.000, +2.000, -2.000, -0.000, +0.000}},\n      {{-0.000, -0.000, -2.000, +0.000, +0.000, +0.000}},\n      {{-0.000, -0.000, -2.000, -0.000, +0.000, +0.000}},\n      {{-0.000, -0.000, -2.000, +2.000, +0.000, +0.000}},\n      {{-0.000, -0.000, -2.000, -2.000, +0.000, +0.000}},\n      {{-0.000, +2.000, +0.000, +0.000, -0.000, +0.000}},\n      {{-0.000, +2.000, +0.000, -0.000, +0.000, +0.000}},\n      {{-0.000, +2.000, +0.000, +2.000, -4.000, +0.000}},\n      {{-0.000, +2.000, +0.000, -2.000, +4.000, +0.000}},\n      {{-0.000, +2.000, -0.000, +0.000, +0.000, -0.000}},\n      {{-0.000, +2.000, -0.000, -0.000, +0.000, +0.000}},\n      {{-0.000, +2.000, -0.000, +2.000, -4.000, -0.000}},\n      {{-0.000, +2.000, -0.000, -2.000, +4.000, +0.000}},\n      {{-0.000, +2.000, +2.000, +0.000, -0.000, +4.000}},\n      {{-0.000, +2.000, +2.000, -0.000, +0.000, +4.000}},\n      {{-0.000, +2.000, +2.000, +2.000, -4.000, +4.000}},\n      {{-0.000, +2.000, +2.000, -2.000, +4.000, +4.000}},\n      {{-0.000, +2.000, -2.000, +0.000, +0.000, -4.000}},\n      {{-0.000, +2.000, -2.000, -0.000, +0.000, -4.000}},\n      {{-0.000, +2.000, -2.000, +2.000, -4.000, -4.000}},\n      {{-0.000, +2.000, -2.000, -2.000, +4.000, -4.000}},\n      {{-0.000, -2.000, +0.000, +0.000, +0.000, -0.000}},\n      {{-0.000, -2.000, +0.000, -0.000, -0.000, +0.000}},\n      {{-0.000, -2.000, +0.000, +2.000, +4.000, -0.000}},\n      {{-0.000, -2.000, +0.000, -2.000, -4.000, +0.000}},\n      {{-0.000, -2.000, -0.000, +0.000, +0.000, +0.000}},\n      {{-0.000, -2.000, -0.000, -0.000, +0.000, +0.000}},\n      {{-0.000, -2.000, -0.000, +2.000, +4.000, +0.000}},\n      {{-0.000, -2.000, -0.000, -2.000, -4.000, +0.000}},\n      {{-0.000, -2.000, +2.000, +0.000, +0.000, -4.000}},\n      {{-0.000, -2.000, +2.000, -0.000, -0.000, -4.000}},\n      {{-0.000, -2.000, +2.000, +2.000, +4.000, -4.000}},\n      {{-0.000, -2.000, +2.000, -2.000, -4.000, -4.000}},\n      {{-0.000, -2.000, -2.000, +0.000, +0.000, +4.000}},\n      {{-0.000, -2.000, -2.000, -0.000, +0.000, +4.000}},\n      {{-0.000, -2.000, -2.000, +2.000, +4.000, +4.000}},\n      {{-0.000, -2.000, -2.000, -2.000, -4.000, +4.000}},\n      {{+2.000, +0.000, +0.000, +0.000, +0.000, +0.000}},\n      {{+2.000, +0.000, +0.000, -0.000, +0.000, +0.000}},\n      {{+2.000, +0.000, +0.000, +2.000, +0.000, +4.000}},\n      {{+2.000, +0.000, +0.000, -2.000, +0.000, -4.000}},\n      {{+2.000, +0.000, -0.000, +0.000, -0.000, +0.000}},\n      {{+2.000, +0.000, -0.000, -0.000, +0.000, -0.000}},\n      {{+2.000, +0.000, -0.000, +2.000, -0.000, +4.000}},\n      {{+2.000, +0.000, -0.000, -2.000, +0.000, -4.000}},\n      {{+2.000, +0.000, +2.000, +0.000, +4.000, +0.000}},\n      {{+2.000, +0.000, +2.000, -0.000, +4.000, +0.000}},\n      {{+2.000, +0.000, +2.000, +2.000, +4.000, +4.000}},\n      {{+2.000, +0.000, +2.000, -2.000, +4.000, -4.000}},\n      {{+2.000, +0.000, -2.000, +0.000, -4.000, +0.000}},\n      {{+2.000, +0.000, -2.000, -0.000, -4.000, -0.000}},\n      {{+2.000, +0.000, -2.000, +2.000, -4.000, +4.000}},\n      {{+2.000, +0.000, -2.000, -2.000, -4.000, -4.000}},\n      {{+2.000, -0.000, +0.000, +0.000, +0.000, +0.000}},\n      {{+2.000, -0.000, +0.000, -0.000, +0.000, -0.000}},\n      {{+2.000, -0.000, +0.000, +2.000, +0.000, +4.000}},\n      {{+2.000, -0.000, +0.000, -2.000, +0.000, -4.000}},\n      {{+2.000, -0.000, -0.000, +0.000, +0.000, +0.000}},\n      {{+2.000, -0.000, -0.000, -0.000, -0.000, +0.000}},\n      {{+2.000, -0.000, -0.000, +2.000, +0.000, +4.000}},\n      {{+2.000, -0.000, -0.000, -2.000, -0.000, -4.000}},\n      {{+2.000, -0.000, +2.000, +0.000, +4.000, +0.000}},\n      {{+2.000, -0.000, +2.000, -0.000, +4.000, -0.000}},\n      {{+2.000, -0.000, +2.000, +2.000, +4.000, +4.000}},\n      {{+2.000, -0.000, +2.000, -2.000, +4.000, -4.000}},\n      {{+2.000, -0.000, -2.000, +0.000, -4.000, +0.000}},\n      {{+2.000, -0.000, -2.000, -0.000, -4.000, +0.000}},\n      {{+2.000, -0.000, -2.000, +2.000, -4.000, +4.000}},\n      {{+2.000, -0.000, -2.000, -2.000, -4.000, -4.000}},\n      {{+2.000, +2.000, +0.000, +0.000, +0.000, +0.000}},\n      {{+2.000, +2.000, +0.000, -0.000, +0.000, +0.000}},\n      {{+2.000, +2.000, +0.000, +2.000, -4.000, +4.000}},\n      {{+2.000, +2.000, +0.000, -2.000, +4.000, -4.000}},\n      {{+2.000, +2.000, -0.000, +0.000, -0.000, +0.000}},\n      {{+2.000, +2.000, -0.000, -0.000, +0.000, -0.000}},\n      {{+2.000, +2.000, -0.000, +2.000, -4.000, +4.000}},\n      {{+2.000, +2.000, -0.000, -2.000, +4.000, -4.000}},\n      {{+2.000, +2.000, +2.000, +0.000, +4.000, +4.000}},\n      {{+2.000, +2.000, +2.000, -0.000, +4.000, +4.000}},\n      {{+2.000, +2.000, +2.000, +2.000, +0.000, +8.000}},\n      {{+2.000, +2.000, +2.000, -2.000, +8.000, +0.000}},\n      {{+2.000, +2.000, -2.000, +0.000, -4.000, -4.000}},\n      {{+2.000, +2.000, -2.000, -0.000, -4.000, -4.000}},\n      {{+2.000, +2.000, -2.000, +2.000, -8.000, +0.000}},\n      {{+2.000, +2.000, -2.000, -2.000, +0.000, -8.000}},\n      {{+2.000, -2.000, +0.000, +0.000, +0.000, +0.000}},\n      {{+2.000, -2.000, +0.000, -0.000, +0.000, -0.000}},\n      {{+2.000, -2.000, +0.000, +2.000, +4.000, +4.000}},\n      {{+2.000, -2.000, +0.000, -2.000, -4.000, -4.000}},\n      {{+2.000, -2.000, -0.000, +0.000, +0.000, +0.000}},\n      {{+2.000, -2.000, -0.000, -0.000, -0.000, +0.000}},\n      {{+2.000, -2.000, -0.000, +2.000, +4.000, +4.000}},\n      {{+2.000, -2.000, -0.000, -2.000, -4.000, -4.000}},\n      {{+2.000, -2.000, +2.000, +0.000, +4.000, -4.000}},\n      {{+2.000, -2.000, +2.000, -0.000, +4.000, -4.000}},\n      {{+2.000, -2.000, +2.000, +2.000, +8.000, +0.000}},\n      {{+2.000, -2.000, +2.000, -2.000, +0.000, -8.000}},\n      {{+2.000, -2.000, -2.000, +0.000, -4.000, +4.000}},\n      {{+2.000, -2.000, -2.000, -0.000, -4.000, +4.000}},\n      {{+2.000, -2.000, -2.000, +2.000, +0.000, +8.000}},\n      {{+2.000, -2.000, -2.000, -2.000, -8.000, +0.000}},\n      {{-2.000, +0.000, +0.000, +0.000, -0.000, +0.000}},\n      {{-2.000, +0.000, +0.000, -0.000, +0.000, +0.000}},\n      {{-2.000, +0.000, +0.000, +2.000, -0.000, -4.000}},\n      {{-2.000, +0.000, +0.000, -2.000, +0.000, +4.000}},\n      {{-2.000, +0.000, -0.000, +0.000, +0.000, -0.000}},\n      {{-2.000, +0.000, -0.000, -0.000, +0.000, +0.000}},\n      {{-2.000, +0.000, -0.000, +2.000, +0.000, -4.000}},\n      {{-2.000, +0.000, -0.000, -2.000, +0.000, +4.000}},\n      {{-2.000, +0.000, +2.000, +0.000, -4.000, +0.000}},\n      {{-2.000, +0.000, +2.000, -0.000, -4.000, +0.000}},\n      {{-2.000, +0.000, +2.000, +2.000, -4.000, -4.000}},\n      {{-2.000, +0.000, +2.000, -2.000, -4.000, +4.000}},\n      {{-2.000, +0.000, -2.000, +0.000, +4.000, -0.000}},\n      {{-2.000, +0.000, -2.000, -0.000, +4.000, +0.000}},\n      {{-2.000, +0.000, -2.000, +2.000, +4.000, -4.000}},\n      {{-2.000, +0.000, -2.000, -2.000, +4.000, +4.000}},\n      {{-2.000, -0.000, +0.000, +0.000, +0.000, -0.000}},\n      {{-2.000, -0.000, +0.000, -0.000, -0.000, +0.000}},\n      {{-2.000, -0.000, +0.000, +2.000, +0.000, -4.000}},\n      {{-2.000, -0.000, +0.000, -2.000, -0.000, +4.000}},\n      {{-2.000, -0.000, -0.000, +0.000, +0.000, +0.000}},\n      {{-2.000, -0.000, -0.000, -0.000, +0.000, +0.000}},\n      {{-2.000, -0.000, -0.000, +2.000, +0.000, -4.000}},\n      {{-2.000, -0.000, -0.000, -2.000, +0.000, +4.000}},\n      {{-2.000, -0.000, +2.000, +0.000, -4.000, -0.000}},\n      {{-2.000, -0.000, +2.000, -0.000, -4.000, +0.000}},\n      {{-2.000, -0.000, +2.000, +2.000, -4.000, -4.000}},\n      {{-2.000, -0.000, +2.000, -2.000, -4.000, +4.000}},\n      {{-2.000, -0.000, -2.000, +0.000, +4.000, +0.000}},\n      {{-2.000, -0.000, -2.000, -0.000, +4.000, +0.000}},\n      {{-2.000, -0.000, -2.000, +2.000, +4.000, -4.000}},\n      {{-2.000, -0.000, -2.000, -2.000, +4.000, +4.000}},\n      {{-2.000, +2.000, +0.000, +0.000, -0.000, +0.000}},\n      {{-2.000, +2.000, +0.000, -0.000, +0.000, +0.000}},\n      {{-2.000, +2.000, +0.000, +2.000, -4.000, -4.000}},\n      {{-2.000, +2.000, +0.000, -2.000, +4.000, +4.000}},\n      {{-2.000, +2.000, -0.000, +0.000, +0.000, -0.000}},\n      {{-2.000, +2.000, -0.000, -0.000, +0.000, +0.000}},\n      {{-2.000, +2.000, -0.000, +2.000, -4.000, -4.000}},\n      {{-2.000, +2.000, -0.000, -2.000, +4.000, +4.000}},\n      {{-2.000, +2.000, +2.000, +0.000, -4.000, +4.000}},\n      {{-2.000, +2.000, +2.000, -0.000, -4.000, +4.000}},\n      {{-2.000, +2.000, +2.000, +2.000, -8.000, +0.000}},\n      {{-2.000, +2.000, +2.000, -2.000, +0.000, +8.000}},\n      {{-2.000, +2.000, -2.000, +0.000, +4.000, -4.000}},\n      {{-2.000, +2.000, -2.000, -0.000, +4.000, -4.000}},\n      {{-2.000, +2.000, -2.000, +2.000, +0.000, -8.000}},\n      {{-2.000, +2.000, -2.000, -2.000, +8.000, +0.000}},\n      {{-2.000, -2.000, +0.000, +0.000, +0.000, -0.000}},\n      {{-2.000, -2.000, +0.000, -0.000, -0.000, +0.000}},\n      {{-2.000, -2.000, +0.000, +2.000, +4.000, -4.000}},\n      {{-2.000, -2.000, +0.000, -2.000, -4.000, +4.000}},\n      {{-2.000, -2.000, -0.000, +0.000, +0.000, +0.000}},\n      {{-2.000, -2.000, -0.000, -0.000, +0.000, +0.000}},\n      {{-2.000, -2.000, -0.000, +2.000, +4.000, -4.000}},\n      {{-2.000, -2.000, -0.000, -2.000, -4.000, +4.000}},\n      {{-2.000, -2.000, +2.000, +0.000, -4.000, -4.000}},\n      {{-2.000, -2.000, +2.000, -0.000, -4.000, -4.000}},\n      {{-2.000, -2.000, +2.000, +2.000, +0.000, -8.000}},\n      {{-2.000, -2.000, +2.000, -2.000, -8.000, +0.000}},\n      {{-2.000, -2.000, -2.000, +0.000, +4.000, +4.000}},\n      {{-2.000, -2.000, -2.000, -0.000, +4.000, +4.000}},\n      {{-2.000, -2.000, -2.000, +2.000, +8.000, +0.000}},\n      {{-2.000, -2.000, -2.000, -2.000, +0.000, +8.000}},\n   }};\n\n   for (unsigned i = 0; i < mul_data.size(); ++i)\n   {\n      result = T(mul_data[i][0], mul_data[i][1]) * T(mul_data[i][2], mul_data[i][3]);\n      BOOST_TEST(result.real() == mul_data[i][4]);\n      BOOST_TEST(result.imag() == mul_data[i][5]);\n      BOOST_TEST((bool)signbit(result.real()) == signbit(mul_data[i][4]));\n      BOOST_TEST((bool)signbit(result.imag()) == signbit(mul_data[i][5]));\n   }\n\n   //\n   // Divide the permutations which give at least one zero:\n   //\n   static constexpr std::array<std::array<double, 6>, 256> div_data = \n   { {\n      {{ +0.000, +0.000, +0.000, +0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ +0.000, +0.000, +0.000, -0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ +0.000, +0.000, +0.000, +2.000, +0.000, +0.000 }},\n      {{ +0.000, +0.000, +0.000, -2.000, +0.000, +0.000 }},\n      {{ +0.000, +0.000, -0.000, +0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ +0.000, +0.000, -0.000, -0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ +0.000, +0.000, -0.000, +2.000, +0.000, -0.000 }},\n      {{ +0.000, +0.000, -0.000, -2.000, -0.000, +0.000 }},\n      {{ +0.000, +0.000, +2.000, +0.000, +0.000, +0.000 }},\n      {{ +0.000, +0.000, +2.000, -0.000, +0.000, +0.000 }},\n      {{ +0.000, +0.000, +2.000, +2.000, +0.000, +0.000 }},\n      {{ +0.000, +0.000, +2.000, -2.000, +0.000, +0.000 }},\n      {{ +0.000, +0.000, -2.000, +0.000, +0.000, -0.000 }},\n      {{ +0.000, +0.000, -2.000, -0.000, -0.000, +0.000 }},\n      {{ +0.000, +0.000, -2.000, +2.000, +0.000, -0.000 }},\n      {{ +0.000, +0.000, -2.000, -2.000, -0.000, +0.000 }},\n      {{ +0.000, -0.000, +0.000, +0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ +0.000, -0.000, +0.000, -0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ +0.000, -0.000, +0.000, +2.000, +0.000, -0.000 }},\n      {{ +0.000, -0.000, +0.000, -2.000, +0.000, +0.000 }},\n      {{ +0.000, -0.000, -0.000, +0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ +0.000, -0.000, -0.000, -0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ +0.000, -0.000, -0.000, +2.000, -0.000, +0.000 }},\n      {{ +0.000, -0.000, -0.000, -2.000, +0.000, +0.000 }},\n      {{ +0.000, -0.000, +2.000, +0.000, +0.000, -0.000 }},\n      {{ +0.000, -0.000, +2.000, -0.000, +0.000, +0.000 }},\n      {{ +0.000, -0.000, +2.000, +2.000, +0.000, -0.000 }},\n      {{ +0.000, -0.000, +2.000, -2.000, +0.000, +0.000 }},\n      {{ +0.000, -0.000, -2.000, +0.000, -0.000, +0.000 }},\n      {{ +0.000, -0.000, -2.000, -0.000, +0.000, +0.000 }},\n      {{ +0.000, -0.000, -2.000, +2.000, -0.000, +0.000 }},\n      {{ +0.000, -0.000, -2.000, -2.000, +0.000, +0.000 }},\n      {{ +0.000, +2.000, +0.000, +0.000, std::numeric_limits<double>::quiet_NaN(), +std::numeric_limits<double>::infinity() }},\n      {{ +0.000, +2.000, +0.000, -0.000, std::numeric_limits<double>::quiet_NaN(), +std::numeric_limits<double>::infinity() }},\n      {{ +0.000, +2.000, +0.000, +2.000, +1.000, +0.000 }},\n      {{ +0.000, +2.000, +0.000, -2.000, -1.000, +0.000 }},\n      {{ +0.000, +2.000, -0.000, +0.000, std::numeric_limits<double>::quiet_NaN(), -std::numeric_limits<double>::infinity() }},\n      {{ +0.000, +2.000, -0.000, -0.000, std::numeric_limits<double>::quiet_NaN(), -std::numeric_limits<double>::infinity() }},\n      {{ +0.000, +2.000, -0.000, +2.000, +1.000, -0.000 }},\n      {{ +0.000, +2.000, -0.000, -2.000, -1.000, +0.000 }},\n      {{ +0.000, +2.000, +2.000, +0.000, +0.000, +1.000 }},\n      {{ +0.000, +2.000, +2.000, -0.000, +0.000, +1.000 }},\n      {{ +0.000, +2.000, +2.000, +2.000, +0.500, +0.500 }},\n      {{ +0.000, +2.000, +2.000, -2.000, -0.500, +0.500 }},\n      {{ +0.000, +2.000, -2.000, +0.000, +0.000, -1.000 }},\n      {{ +0.000, +2.000, -2.000, -0.000, -0.000, -1.000 }},\n      {{ +0.000, +2.000, -2.000, +2.000, +0.500, -0.500 }},\n      {{ +0.000, +2.000, -2.000, -2.000, -0.500, -0.500 }},\n      {{ +0.000, -2.000, +0.000, +0.000, std::numeric_limits<double>::quiet_NaN(), -std::numeric_limits<double>::infinity() }},\n      {{ +0.000, -2.000, +0.000, -0.000, std::numeric_limits<double>::quiet_NaN(), -std::numeric_limits<double>::infinity() }},\n      {{ +0.000, -2.000, +0.000, +2.000, -1.000, -0.000 }},\n      {{ +0.000, -2.000, +0.000, -2.000, +1.000, +0.000 }},\n      {{ +0.000, -2.000, -0.000, +0.000, std::numeric_limits<double>::quiet_NaN(), +std::numeric_limits<double>::infinity() }},\n      {{ +0.000, -2.000, -0.000, -0.000, std::numeric_limits<double>::quiet_NaN(), +std::numeric_limits<double>::infinity() }},\n      {{ +0.000, -2.000, -0.000, +2.000, -1.000, +0.000 }},\n      {{ +0.000, -2.000, -0.000, -2.000, +1.000, +0.000 }},\n      {{ +0.000, -2.000, +2.000, +0.000, +0.000, -1.000 }},\n      {{ +0.000, -2.000, +2.000, -0.000, +0.000, -1.000 }},\n      {{ +0.000, -2.000, +2.000, +2.000, -0.500, -0.500 }},\n      {{ +0.000, -2.000, +2.000, -2.000, +0.500, -0.500 }},\n      {{ +0.000, -2.000, -2.000, +0.000, -0.000, +1.000 }},\n      {{ +0.000, -2.000, -2.000, -0.000, +0.000, +1.000 }},\n      {{ +0.000, -2.000, -2.000, +2.000, -0.500, +0.500 }},\n      {{ +0.000, -2.000, -2.000, -2.000, +0.500, +0.500 }},\n      {{ -0.000, +0.000, +0.000, +0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ -0.000, +0.000, +0.000, -0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ -0.000, +0.000, +0.000, +2.000, +0.000, +0.000 }},\n      {{ -0.000, +0.000, +0.000, -2.000, -0.000, +0.000 }},\n      {{ -0.000, +0.000, -0.000, +0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ -0.000, +0.000, -0.000, -0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ -0.000, +0.000, -0.000, +2.000, +0.000, +0.000 }},\n      {{ -0.000, +0.000, -0.000, -2.000, +0.000, -0.000 }},\n      {{ -0.000, +0.000, +2.000, +0.000, +0.000, +0.000 }},\n      {{ -0.000, +0.000, +2.000, -0.000, -0.000, +0.000 }},\n      {{ -0.000, +0.000, +2.000, +2.000, +0.000, +0.000 }},\n      {{ -0.000, +0.000, +2.000, -2.000, -0.000, +0.000 }},\n      {{ -0.000, +0.000, -2.000, +0.000, +0.000, +0.000 }},\n      {{ -0.000, +0.000, -2.000, -0.000, +0.000, -0.000 }},\n      {{ -0.000, +0.000, -2.000, +2.000, +0.000, +0.000 }},\n      {{ -0.000, +0.000, -2.000, -2.000, +0.000, -0.000 }},\n      {{ -0.000, -0.000, +0.000, +0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ -0.000, -0.000, +0.000, -0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ -0.000, -0.000, +0.000, +2.000, -0.000, +0.000 }},\n      {{ -0.000, -0.000, +0.000, -2.000, +0.000, -0.000 }},\n      {{ -0.000, -0.000, -0.000, +0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ -0.000, -0.000, -0.000, -0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ -0.000, -0.000, -0.000, +2.000, +0.000, +0.000 }},\n      {{ -0.000, -0.000, -0.000, -2.000, +0.000, +0.000 }},\n      {{ -0.000, -0.000, +2.000, +0.000, -0.000, +0.000 }},\n      {{ -0.000, -0.000, +2.000, -0.000, +0.000, -0.000 }},\n      {{ -0.000, -0.000, +2.000, +2.000, -0.000, +0.000 }},\n      {{ -0.000, -0.000, +2.000, -2.000, +0.000, -0.000 }},\n      {{ -0.000, -0.000, -2.000, +0.000, +0.000, +0.000 }},\n      {{ -0.000, -0.000, -2.000, -0.000, +0.000, +0.000 }},\n      {{ -0.000, -0.000, -2.000, +2.000, +0.000, +0.000 }},\n      {{ -0.000, -0.000, -2.000, -2.000, +0.000, +0.000 }},\n      {{ -0.000, +2.000, +0.000, +0.000, std::numeric_limits<double>::quiet_NaN(), +std::numeric_limits<double>::infinity() }},\n      {{ -0.000, +2.000, +0.000, -0.000, std::numeric_limits<double>::quiet_NaN(), +std::numeric_limits<double>::infinity() }},\n      {{ -0.000, +2.000, +0.000, +2.000, +1.000, +0.000 }},\n      {{ -0.000, +2.000, +0.000, -2.000, -1.000, +0.000 }},\n      {{ -0.000, +2.000, -0.000, +0.000, std::numeric_limits<double>::quiet_NaN(), -std::numeric_limits<double>::infinity() }},\n      {{ -0.000, +2.000, -0.000, -0.000, std::numeric_limits<double>::quiet_NaN(), -std::numeric_limits<double>::infinity() }},\n      {{ -0.000, +2.000, -0.000, +2.000, +1.000, +0.000 }},\n      {{ -0.000, +2.000, -0.000, -2.000, -1.000, -0.000 }},\n      {{ -0.000, +2.000, +2.000, +0.000, +0.000, +1.000 }},\n      {{ -0.000, +2.000, +2.000, -0.000, -0.000, +1.000 }},\n      {{ -0.000, +2.000, +2.000, +2.000, +0.500, +0.500 }},\n      {{ -0.000, +2.000, +2.000, -2.000, -0.500, +0.500 }},\n      {{ -0.000, +2.000, -2.000, +0.000, +0.000, -1.000 }},\n      {{ -0.000, +2.000, -2.000, -0.000, +0.000, -1.000 }},\n      {{ -0.000, +2.000, -2.000, +2.000, +0.500, -0.500 }},\n      {{ -0.000, +2.000, -2.000, -2.000, -0.500, -0.500 }},\n      {{ -0.000, -2.000, +0.000, +0.000, std::numeric_limits<double>::quiet_NaN(), -std::numeric_limits<double>::infinity() }},\n      {{ -0.000, -2.000, +0.000, -0.000, std::numeric_limits<double>::quiet_NaN(), -std::numeric_limits<double>::infinity() }},\n      {{ -0.000, -2.000, +0.000, +2.000, -1.000, +0.000 }},\n      {{ -0.000, -2.000, +0.000, -2.000, +1.000, -0.000 }},\n      {{ -0.000, -2.000, -0.000, +0.000, std::numeric_limits<double>::quiet_NaN(), +std::numeric_limits<double>::infinity() }},\n      {{ -0.000, -2.000, -0.000, -0.000, std::numeric_limits<double>::quiet_NaN(), +std::numeric_limits<double>::infinity() }},\n      {{ -0.000, -2.000, -0.000, +2.000, -1.000, +0.000 }},\n      {{ -0.000, -2.000, -0.000, -2.000, +1.000, +0.000 }},\n      {{ -0.000, -2.000, +2.000, +0.000, -0.000, -1.000 }},\n      {{ -0.000, -2.000, +2.000, -0.000, +0.000, -1.000 }},\n      {{ -0.000, -2.000, +2.000, +2.000, -0.500, -0.500 }},\n      {{ -0.000, -2.000, +2.000, -2.000, +0.500, -0.500 }},\n      {{ -0.000, -2.000, -2.000, +0.000, +0.000, +1.000 }},\n      {{ -0.000, -2.000, -2.000, -0.000, +0.000, +1.000 }},\n      {{ -0.000, -2.000, -2.000, +2.000, -0.500, +0.500 }},\n      {{ -0.000, -2.000, -2.000, -2.000, +0.500, +0.500 }},\n      {{ +2.000, +0.000, +0.000, +0.000, +std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ +2.000, +0.000, +0.000, -0.000, +std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ +2.000, +0.000, +0.000, +2.000, +0.000, -1.000 }},\n      {{ +2.000, +0.000, +0.000, -2.000, +0.000, +1.000 }},\n      {{ +2.000, +0.000, -0.000, +0.000, -std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ +2.000, +0.000, -0.000, -0.000, -std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ +2.000, +0.000, -0.000, +2.000, +0.000, -1.000 }},\n      {{ +2.000, +0.000, -0.000, -2.000, -0.000, +1.000 }},\n      {{ +2.000, +0.000, +2.000, +0.000, +1.000, +0.000 }},\n      {{ +2.000, +0.000, +2.000, -0.000, +1.000, +0.000 }},\n      {{ +2.000, +0.000, +2.000, +2.000, +0.500, -0.500 }},\n      {{ +2.000, +0.000, +2.000, -2.000, +0.500, +0.500 }},\n      {{ +2.000, +0.000, -2.000, +0.000, -1.000, -0.000 }},\n      {{ +2.000, +0.000, -2.000, -0.000, -1.000, +0.000 }},\n      {{ +2.000, +0.000, -2.000, +2.000, -0.500, -0.500 }},\n      {{ +2.000, +0.000, -2.000, -2.000, -0.500, +0.500 }},\n      {{ +2.000, -0.000, +0.000, +0.000, +std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ +2.000, -0.000, +0.000, -0.000, +std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ +2.000, -0.000, +0.000, +2.000, +0.000, -1.000 }},\n      {{ +2.000, -0.000, +0.000, -2.000, +0.000, +1.000 }},\n      {{ +2.000, -0.000, -0.000, +0.000, -std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ +2.000, -0.000, -0.000, -0.000, -std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ +2.000, -0.000, -0.000, +2.000, -0.000, -1.000 }},\n      {{ +2.000, -0.000, -0.000, -2.000, +0.000, +1.000 }},\n      {{ +2.000, -0.000, +2.000, +0.000, +1.000, -0.000 }},\n      {{ +2.000, -0.000, +2.000, -0.000, +1.000, +0.000 }},\n      {{ +2.000, -0.000, +2.000, +2.000, +0.500, -0.500 }},\n      {{ +2.000, -0.000, +2.000, -2.000, +0.500, +0.500 }},\n      {{ +2.000, -0.000, -2.000, +0.000, -1.000, +0.000 }},\n      {{ +2.000, -0.000, -2.000, -0.000, -1.000, +0.000 }},\n      {{ +2.000, -0.000, -2.000, +2.000, -0.500, -0.500 }},\n      {{ +2.000, -0.000, -2.000, -2.000, -0.500, +0.500 }},\n      {{ +2.000, +2.000, +0.000, +0.000, +std::numeric_limits<double>::infinity(), +std::numeric_limits<double>::infinity() }},\n      {{ +2.000, +2.000, +0.000, -0.000, +std::numeric_limits<double>::infinity(), +std::numeric_limits<double>::infinity() }},\n      {{ +2.000, +2.000, +0.000, +2.000, +1.000, -1.000 }},\n      {{ +2.000, +2.000, +0.000, -2.000, -1.000, +1.000 }},\n      {{ +2.000, +2.000, -0.000, +0.000, -std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity() }},\n      {{ +2.000, +2.000, -0.000, -0.000, -std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity() }},\n      {{ +2.000, +2.000, -0.000, +2.000, +1.000, -1.000 }},\n      {{ +2.000, +2.000, -0.000, -2.000, -1.000, +1.000 }},\n      {{ +2.000, +2.000, +2.000, +0.000, +1.000, +1.000 }},\n      {{ +2.000, +2.000, +2.000, -0.000, +1.000, +1.000 }},\n      {{ +2.000, +2.000, +2.000, +2.000, +1.000, +0.000 }},\n      {{ +2.000, +2.000, +2.000, -2.000, +0.000, +1.000 }},\n      {{ +2.000, +2.000, -2.000, +0.000, -1.000, -1.000 }},\n      {{ +2.000, +2.000, -2.000, -0.000, -1.000, -1.000 }},\n      {{ +2.000, +2.000, -2.000, +2.000, +0.000, -1.000 }},\n      {{ +2.000, +2.000, -2.000, -2.000, -1.000, +0.000 }},\n      {{ +2.000, -2.000, +0.000, +0.000, +std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity() }},\n      {{ +2.000, -2.000, +0.000, -0.000, +std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity() }},\n      {{ +2.000, -2.000, +0.000, +2.000, -1.000, -1.000 }},\n      {{ +2.000, -2.000, +0.000, -2.000, +1.000, +1.000 }},\n      {{ +2.000, -2.000, -0.000, +0.000, -std::numeric_limits<double>::infinity(), +std::numeric_limits<double>::infinity() }},\n      {{ +2.000, -2.000, -0.000, -0.000, -std::numeric_limits<double>::infinity(), +std::numeric_limits<double>::infinity() }},\n      {{ +2.000, -2.000, -0.000, +2.000, -1.000, -1.000 }},\n      {{ +2.000, -2.000, -0.000, -2.000, +1.000, +1.000 }},\n      {{ +2.000, -2.000, +2.000, +0.000, +1.000, -1.000 }},\n      {{ +2.000, -2.000, +2.000, -0.000, +1.000, -1.000 }},\n      {{ +2.000, -2.000, +2.000, +2.000, +0.000, -1.000 }},\n      {{ +2.000, -2.000, +2.000, -2.000, +1.000, +0.000 }},\n      {{ +2.000, -2.000, -2.000, +0.000, -1.000, +1.000 }},\n      {{ +2.000, -2.000, -2.000, -0.000, -1.000, +1.000 }},\n      {{ +2.000, -2.000, -2.000, +2.000, -1.000, +0.000 }},\n      {{ +2.000, -2.000, -2.000, -2.000, +0.000, +1.000 }},\n      {{ -2.000, +0.000, +0.000, +0.000, -std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ -2.000, +0.000, +0.000, -0.000, -std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ -2.000, +0.000, +0.000, +2.000, +0.000, +1.000 }},\n      {{ -2.000, +0.000, +0.000, -2.000, -0.000, -1.000 }},\n      {{ -2.000, +0.000, -0.000, +0.000, +std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ -2.000, +0.000, -0.000, -0.000, +std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ -2.000, +0.000, -0.000, +2.000, +0.000, +1.000 }},\n      {{ -2.000, +0.000, -0.000, -2.000, +0.000, -1.000 }},\n      {{ -2.000, +0.000, +2.000, +0.000, -1.000, +0.000 }},\n      {{ -2.000, +0.000, +2.000, -0.000, -1.000, +0.000 }},\n      {{ -2.000, +0.000, +2.000, +2.000, -0.500, +0.500 }},\n      {{ -2.000, +0.000, +2.000, -2.000, -0.500, -0.500 }},\n      {{ -2.000, +0.000, -2.000, +0.000, +1.000, +0.000 }},\n      {{ -2.000, +0.000, -2.000, -0.000, +1.000, -0.000 }},\n      {{ -2.000, +0.000, -2.000, +2.000, +0.500, +0.500 }},\n      {{ -2.000, +0.000, -2.000, -2.000, +0.500, -0.500 }},\n      {{ -2.000, -0.000, +0.000, +0.000, -std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ -2.000, -0.000, +0.000, -0.000, -std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ -2.000, -0.000, +0.000, +2.000, -0.000, +1.000 }},\n      {{ -2.000, -0.000, +0.000, -2.000, +0.000, -1.000 }},\n      {{ -2.000, -0.000, -0.000, +0.000, +std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ -2.000, -0.000, -0.000, -0.000, +std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN() }},\n      {{ -2.000, -0.000, -0.000, +2.000, +0.000, +1.000 }},\n      {{ -2.000, -0.000, -0.000, -2.000, +0.000, -1.000 }},\n      {{ -2.000, -0.000, +2.000, +0.000, -1.000, +0.000 }},\n      {{ -2.000, -0.000, +2.000, -0.000, -1.000, -0.000 }},\n      {{ -2.000, -0.000, +2.000, +2.000, -0.500, +0.500 }},\n      {{ -2.000, -0.000, +2.000, -2.000, -0.500, -0.500 }},\n      {{ -2.000, -0.000, -2.000, +0.000, +1.000, +0.000 }},\n      {{ -2.000, -0.000, -2.000, -0.000, +1.000, +0.000 }},\n      {{ -2.000, -0.000, -2.000, +2.000, +0.500, +0.500 }},\n      {{ -2.000, -0.000, -2.000, -2.000, +0.500, -0.500 }},\n      {{ -2.000, +2.000, +0.000, +0.000, -std::numeric_limits<double>::infinity(), +std::numeric_limits<double>::infinity() }},\n      {{ -2.000, +2.000, +0.000, -0.000, -std::numeric_limits<double>::infinity(), +std::numeric_limits<double>::infinity() }},\n      {{ -2.000, +2.000, +0.000, +2.000, +1.000, +1.000 }},\n      {{ -2.000, +2.000, +0.000, -2.000, -1.000, -1.000 }},\n      {{ -2.000, +2.000, -0.000, +0.000, +std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity() }},\n      {{ -2.000, +2.000, -0.000, -0.000, +std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity() }},\n      {{ -2.000, +2.000, -0.000, +2.000, +1.000, +1.000 }},\n      {{ -2.000, +2.000, -0.000, -2.000, -1.000, -1.000 }},\n      {{ -2.000, +2.000, +2.000, +0.000, -1.000, +1.000 }},\n      {{ -2.000, +2.000, +2.000, -0.000, -1.000, +1.000 }},\n      {{ -2.000, +2.000, +2.000, +2.000, +0.000, +1.000 }},\n      {{ -2.000, +2.000, +2.000, -2.000, -1.000, +0.000 }},\n      {{ -2.000, +2.000, -2.000, +0.000, +1.000, -1.000 }},\n      {{ -2.000, +2.000, -2.000, -0.000, +1.000, -1.000 }},\n      {{ -2.000, +2.000, -2.000, +2.000, +1.000, +0.000 }},\n      {{ -2.000, +2.000, -2.000, -2.000, +0.000, -1.000 }},\n      {{ -2.000, -2.000, +0.000, +0.000, -std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity() }},\n      {{ -2.000, -2.000, +0.000, -0.000, -std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity() }},\n      {{ -2.000, -2.000, +0.000, +2.000, -1.000, +1.000 }},\n      {{ -2.000, -2.000, +0.000, -2.000, +1.000, -1.000 }},\n      {{ -2.000, -2.000, -0.000, +0.000, +std::numeric_limits<double>::infinity(), +std::numeric_limits<double>::infinity() }},\n      {{ -2.000, -2.000, -0.000, -0.000, +std::numeric_limits<double>::infinity(), +std::numeric_limits<double>::infinity() }},\n      {{ -2.000, -2.000, -0.000, +2.000, -1.000, +1.000 }},\n      {{ -2.000, -2.000, -0.000, -2.000, +1.000, -1.000 }},\n      {{ -2.000, -2.000, +2.000, +0.000, -1.000, -1.000 }},\n      {{ -2.000, -2.000, +2.000, -0.000, -1.000, -1.000 }},\n      {{ -2.000, -2.000, +2.000, +2.000, -1.000, +0.000 }},\n      {{ -2.000, -2.000, +2.000, -2.000, +0.000, -1.000 }},\n      {{ -2.000, -2.000, -2.000, +0.000, +1.000, +1.000 }},\n      {{ -2.000, -2.000, -2.000, -0.000, +1.000, +1.000 }},\n      {{ -2.000, -2.000, -2.000, +2.000, +0.000, +1.000 }},\n      {{ -2.000, -2.000, -2.000, -2.000, +1.000, +0.000 }},   \n   }};\n\n   for (unsigned i = 0; i < div_data.size(); ++i)\n   {\n      if (!(isnan)(div_data[i][4]) && !(isnan)(div_data[i][5]))\n      {\n         result = T(div_data[i][0], div_data[i][1]) / T(div_data[i][2], div_data[i][3]);\n         BOOST_TEST(result.real() == div_data[i][4]);\n         BOOST_TEST(result.imag() == div_data[i][5]);\n         BOOST_TEST((bool)signbit(result.real()) == signbit(div_data[i][4]));\n         BOOST_TEST((bool)signbit(result.imag()) == signbit(div_data[i][5]));\n      }\n   }\n\n\n   //\n   // Add the permutations:\n   //\n   static constexpr std::array<std::array<double, 6>, 256> add_data =\n   { {\n       {{+0.000, +0.000, +0.000, +0.000, +0.000, +0.000}},\n       {{+0.000, +0.000, +0.000, -0.000, +0.000, +0.000}},\n       {{+0.000, +0.000, +0.000, +2.000, +0.000, +2.000}},\n       {{+0.000, +0.000, +0.000, -2.000, +0.000, -2.000}},\n       {{+0.000, +0.000, -0.000, +0.000, +0.000, +0.000}},\n       {{+0.000, +0.000, -0.000, -0.000, +0.000, +0.000}},\n       {{+0.000, +0.000, -0.000, +2.000, +0.000, +2.000}},\n       {{+0.000, +0.000, -0.000, -2.000, +0.000, -2.000}},\n       {{+0.000, +0.000, +2.000, +0.000, +2.000, +0.000}},\n       {{+0.000, +0.000, +2.000, -0.000, +2.000, +0.000}},\n       {{+0.000, +0.000, +2.000, +2.000, +2.000, +2.000}},\n       {{+0.000, +0.000, +2.000, -2.000, +2.000, -2.000}},\n       {{+0.000, +0.000, -2.000, +0.000, -2.000, +0.000}},\n       {{+0.000, +0.000, -2.000, -0.000, -2.000, +0.000}},\n       {{+0.000, +0.000, -2.000, +2.000, -2.000, +2.000}},\n       {{+0.000, +0.000, -2.000, -2.000, -2.000, -2.000}},\n       {{+0.000, -0.000, +0.000, +0.000, +0.000, +0.000}},\n       {{+0.000, -0.000, +0.000, -0.000, +0.000, -0.000}},\n       {{+0.000, -0.000, +0.000, +2.000, +0.000, +2.000}},\n       {{+0.000, -0.000, +0.000, -2.000, +0.000, -2.000}},\n       {{+0.000, -0.000, -0.000, +0.000, +0.000, +0.000}},\n       {{+0.000, -0.000, -0.000, -0.000, +0.000, -0.000}},\n       {{+0.000, -0.000, -0.000, +2.000, +0.000, +2.000}},\n       {{+0.000, -0.000, -0.000, -2.000, +0.000, -2.000}},\n       {{+0.000, -0.000, +2.000, +0.000, +2.000, +0.000}},\n       {{+0.000, -0.000, +2.000, -0.000, +2.000, -0.000}},\n       {{+0.000, -0.000, +2.000, +2.000, +2.000, +2.000}},\n       {{+0.000, -0.000, +2.000, -2.000, +2.000, -2.000}},\n       {{+0.000, -0.000, -2.000, +0.000, -2.000, +0.000}},\n       {{+0.000, -0.000, -2.000, -0.000, -2.000, -0.000}},\n       {{+0.000, -0.000, -2.000, +2.000, -2.000, +2.000}},\n       {{+0.000, -0.000, -2.000, -2.000, -2.000, -2.000}},\n       {{+0.000, +2.000, +0.000, +0.000, +0.000, +2.000}},\n       {{+0.000, +2.000, +0.000, -0.000, +0.000, +2.000}},\n       {{+0.000, +2.000, +0.000, +2.000, +0.000, +4.000}},\n       {{+0.000, +2.000, +0.000, -2.000, +0.000, +0.000}},\n       {{+0.000, +2.000, -0.000, +0.000, +0.000, +2.000}},\n       {{+0.000, +2.000, -0.000, -0.000, +0.000, +2.000}},\n       {{+0.000, +2.000, -0.000, +2.000, +0.000, +4.000}},\n       {{+0.000, +2.000, -0.000, -2.000, +0.000, +0.000}},\n       {{+0.000, +2.000, +2.000, +0.000, +2.000, +2.000}},\n       {{+0.000, +2.000, +2.000, -0.000, +2.000, +2.000}},\n       {{+0.000, +2.000, +2.000, +2.000, +2.000, +4.000}},\n       {{+0.000, +2.000, +2.000, -2.000, +2.000, +0.000}},\n       {{+0.000, +2.000, -2.000, +0.000, -2.000, +2.000}},\n       {{+0.000, +2.000, -2.000, -0.000, -2.000, +2.000}},\n       {{+0.000, +2.000, -2.000, +2.000, -2.000, +4.000}},\n       {{+0.000, +2.000, -2.000, -2.000, -2.000, +0.000}},\n       {{+0.000, -2.000, +0.000, +0.000, +0.000, -2.000}},\n       {{+0.000, -2.000, +0.000, -0.000, +0.000, -2.000}},\n       {{+0.000, -2.000, +0.000, +2.000, +0.000, +0.000}},\n       {{+0.000, -2.000, +0.000, -2.000, +0.000, -4.000}},\n       {{+0.000, -2.000, -0.000, +0.000, +0.000, -2.000}},\n       {{+0.000, -2.000, -0.000, -0.000, +0.000, -2.000}},\n       {{+0.000, -2.000, -0.000, +2.000, +0.000, +0.000}},\n       {{+0.000, -2.000, -0.000, -2.000, +0.000, -4.000}},\n       {{+0.000, -2.000, +2.000, +0.000, +2.000, -2.000}},\n       {{+0.000, -2.000, +2.000, -0.000, +2.000, -2.000}},\n       {{+0.000, -2.000, +2.000, +2.000, +2.000, +0.000}},\n       {{+0.000, -2.000, +2.000, -2.000, +2.000, -4.000}},\n       {{+0.000, -2.000, -2.000, +0.000, -2.000, -2.000}},\n       {{+0.000, -2.000, -2.000, -0.000, -2.000, -2.000}},\n       {{+0.000, -2.000, -2.000, +2.000, -2.000, +0.000}},\n       {{+0.000, -2.000, -2.000, -2.000, -2.000, -4.000}},\n       {{-0.000, +0.000, +0.000, +0.000, +0.000, +0.000}},\n       {{-0.000, +0.000, +0.000, -0.000, +0.000, +0.000}},\n       {{-0.000, +0.000, +0.000, +2.000, +0.000, +2.000}},\n       {{-0.000, +0.000, +0.000, -2.000, +0.000, -2.000}},\n       {{-0.000, +0.000, -0.000, +0.000, -0.000, +0.000}},\n       {{-0.000, +0.000, -0.000, -0.000, -0.000, +0.000}},\n       {{-0.000, +0.000, -0.000, +2.000, -0.000, +2.000}},\n       {{-0.000, +0.000, -0.000, -2.000, -0.000, -2.000}},\n       {{-0.000, +0.000, +2.000, +0.000, +2.000, +0.000}},\n       {{-0.000, +0.000, +2.000, -0.000, +2.000, +0.000}},\n       {{-0.000, +0.000, +2.000, +2.000, +2.000, +2.000}},\n       {{-0.000, +0.000, +2.000, -2.000, +2.000, -2.000}},\n       {{-0.000, +0.000, -2.000, +0.000, -2.000, +0.000}},\n       {{-0.000, +0.000, -2.000, -0.000, -2.000, +0.000}},\n       {{-0.000, +0.000, -2.000, +2.000, -2.000, +2.000}},\n       {{-0.000, +0.000, -2.000, -2.000, -2.000, -2.000}},\n       {{-0.000, -0.000, +0.000, +0.000, +0.000, +0.000}},\n       {{-0.000, -0.000, +0.000, -0.000, +0.000, -0.000}},\n       {{-0.000, -0.000, +0.000, +2.000, +0.000, +2.000}},\n       {{-0.000, -0.000, +0.000, -2.000, +0.000, -2.000}},\n       {{-0.000, -0.000, -0.000, +0.000, -0.000, +0.000}},\n       {{-0.000, -0.000, -0.000, -0.000, -0.000, -0.000}},\n       {{-0.000, -0.000, -0.000, +2.000, -0.000, +2.000}},\n       {{-0.000, -0.000, -0.000, -2.000, -0.000, -2.000}},\n       {{-0.000, -0.000, +2.000, +0.000, +2.000, +0.000}},\n       {{-0.000, -0.000, +2.000, -0.000, +2.000, -0.000}},\n       {{-0.000, -0.000, +2.000, +2.000, +2.000, +2.000}},\n       {{-0.000, -0.000, +2.000, -2.000, +2.000, -2.000}},\n       {{-0.000, -0.000, -2.000, +0.000, -2.000, +0.000}},\n       {{-0.000, -0.000, -2.000, -0.000, -2.000, -0.000}},\n       {{-0.000, -0.000, -2.000, +2.000, -2.000, +2.000}},\n       {{-0.000, -0.000, -2.000, -2.000, -2.000, -2.000}},\n       {{-0.000, +2.000, +0.000, +0.000, +0.000, +2.000}},\n       {{-0.000, +2.000, +0.000, -0.000, +0.000, +2.000}},\n       {{-0.000, +2.000, +0.000, +2.000, +0.000, +4.000}},\n       {{-0.000, +2.000, +0.000, -2.000, +0.000, +0.000}},\n       {{-0.000, +2.000, -0.000, +0.000, -0.000, +2.000}},\n       {{-0.000, +2.000, -0.000, -0.000, -0.000, +2.000}},\n       {{-0.000, +2.000, -0.000, +2.000, -0.000, +4.000}},\n       {{-0.000, +2.000, -0.000, -2.000, -0.000, +0.000}},\n       {{-0.000, +2.000, +2.000, +0.000, +2.000, +2.000}},\n       {{-0.000, +2.000, +2.000, -0.000, +2.000, +2.000}},\n       {{-0.000, +2.000, +2.000, +2.000, +2.000, +4.000}},\n       {{-0.000, +2.000, +2.000, -2.000, +2.000, +0.000}},\n       {{-0.000, +2.000, -2.000, +0.000, -2.000, +2.000}},\n       {{-0.000, +2.000, -2.000, -0.000, -2.000, +2.000}},\n       {{-0.000, +2.000, -2.000, +2.000, -2.000, +4.000}},\n       {{-0.000, +2.000, -2.000, -2.000, -2.000, +0.000}},\n       {{-0.000, -2.000, +0.000, +0.000, +0.000, -2.000}},\n       {{-0.000, -2.000, +0.000, -0.000, +0.000, -2.000}},\n       {{-0.000, -2.000, +0.000, +2.000, +0.000, +0.000}},\n       {{-0.000, -2.000, +0.000, -2.000, +0.000, -4.000}},\n       {{-0.000, -2.000, -0.000, +0.000, -0.000, -2.000}},\n       {{-0.000, -2.000, -0.000, -0.000, -0.000, -2.000}},\n       {{-0.000, -2.000, -0.000, +2.000, -0.000, +0.000}},\n       {{-0.000, -2.000, -0.000, -2.000, -0.000, -4.000}},\n       {{-0.000, -2.000, +2.000, +0.000, +2.000, -2.000}},\n       {{-0.000, -2.000, +2.000, -0.000, +2.000, -2.000}},\n       {{-0.000, -2.000, +2.000, +2.000, +2.000, +0.000}},\n       {{-0.000, -2.000, +2.000, -2.000, +2.000, -4.000}},\n       {{-0.000, -2.000, -2.000, +0.000, -2.000, -2.000}},\n       {{-0.000, -2.000, -2.000, -0.000, -2.000, -2.000}},\n       {{-0.000, -2.000, -2.000, +2.000, -2.000, +0.000}},\n       {{-0.000, -2.000, -2.000, -2.000, -2.000, -4.000}},\n       {{+2.000, +0.000, +0.000, +0.000, +2.000, +0.000}},\n       {{+2.000, +0.000, +0.000, -0.000, +2.000, +0.000}},\n       {{+2.000, +0.000, +0.000, +2.000, +2.000, +2.000}},\n       {{+2.000, +0.000, +0.000, -2.000, +2.000, -2.000}},\n       {{+2.000, +0.000, -0.000, +0.000, +2.000, +0.000}},\n       {{+2.000, +0.000, -0.000, -0.000, +2.000, +0.000}},\n       {{+2.000, +0.000, -0.000, +2.000, +2.000, +2.000}},\n       {{+2.000, +0.000, -0.000, -2.000, +2.000, -2.000}},\n       {{+2.000, +0.000, +2.000, +0.000, +4.000, +0.000}},\n       {{+2.000, +0.000, +2.000, -0.000, +4.000, +0.000}},\n       {{+2.000, +0.000, +2.000, +2.000, +4.000, +2.000}},\n       {{+2.000, +0.000, +2.000, -2.000, +4.000, -2.000}},\n       {{+2.000, +0.000, -2.000, +0.000, +0.000, +0.000}},\n       {{+2.000, +0.000, -2.000, -0.000, +0.000, +0.000}},\n       {{+2.000, +0.000, -2.000, +2.000, +0.000, +2.000}},\n       {{+2.000, +0.000, -2.000, -2.000, +0.000, -2.000}},\n       {{+2.000, -0.000, +0.000, +0.000, +2.000, +0.000}},\n       {{+2.000, -0.000, +0.000, -0.000, +2.000, -0.000}},\n       {{+2.000, -0.000, +0.000, +2.000, +2.000, +2.000}},\n       {{+2.000, -0.000, +0.000, -2.000, +2.000, -2.000}},\n       {{+2.000, -0.000, -0.000, +0.000, +2.000, +0.000}},\n       {{+2.000, -0.000, -0.000, -0.000, +2.000, -0.000}},\n       {{+2.000, -0.000, -0.000, +2.000, +2.000, +2.000}},\n       {{+2.000, -0.000, -0.000, -2.000, +2.000, -2.000}},\n       {{+2.000, -0.000, +2.000, +0.000, +4.000, +0.000}},\n       {{+2.000, -0.000, +2.000, -0.000, +4.000, -0.000}},\n       {{+2.000, -0.000, +2.000, +2.000, +4.000, +2.000}},\n       {{+2.000, -0.000, +2.000, -2.000, +4.000, -2.000}},\n       {{+2.000, -0.000, -2.000, +0.000, +0.000, +0.000}},\n       {{+2.000, -0.000, -2.000, -0.000, +0.000, -0.000}},\n       {{+2.000, -0.000, -2.000, +2.000, +0.000, +2.000}},\n       {{+2.000, -0.000, -2.000, -2.000, +0.000, -2.000}},\n       {{+2.000, +2.000, +0.000, +0.000, +2.000, +2.000}},\n       {{+2.000, +2.000, +0.000, -0.000, +2.000, +2.000}},\n       {{+2.000, +2.000, +0.000, +2.000, +2.000, +4.000}},\n       {{+2.000, +2.000, +0.000, -2.000, +2.000, +0.000}},\n       {{+2.000, +2.000, -0.000, +0.000, +2.000, +2.000}},\n       {{+2.000, +2.000, -0.000, -0.000, +2.000, +2.000}},\n       {{+2.000, +2.000, -0.000, +2.000, +2.000, +4.000}},\n       {{+2.000, +2.000, -0.000, -2.000, +2.000, +0.000}},\n       {{+2.000, +2.000, +2.000, +0.000, +4.000, +2.000}},\n       {{+2.000, +2.000, +2.000, -0.000, +4.000, +2.000}},\n       {{+2.000, +2.000, +2.000, +2.000, +4.000, +4.000}},\n       {{+2.000, +2.000, +2.000, -2.000, +4.000, +0.000}},\n       {{+2.000, +2.000, -2.000, +0.000, +0.000, +2.000}},\n       {{+2.000, +2.000, -2.000, -0.000, +0.000, +2.000}},\n       {{+2.000, +2.000, -2.000, +2.000, +0.000, +4.000}},\n       {{+2.000, +2.000, -2.000, -2.000, +0.000, +0.000}},\n       {{+2.000, -2.000, +0.000, +0.000, +2.000, -2.000}},\n       {{+2.000, -2.000, +0.000, -0.000, +2.000, -2.000}},\n       {{+2.000, -2.000, +0.000, +2.000, +2.000, +0.000}},\n       {{+2.000, -2.000, +0.000, -2.000, +2.000, -4.000}},\n       {{+2.000, -2.000, -0.000, +0.000, +2.000, -2.000}},\n       {{+2.000, -2.000, -0.000, -0.000, +2.000, -2.000}},\n       {{+2.000, -2.000, -0.000, +2.000, +2.000, +0.000}},\n       {{+2.000, -2.000, -0.000, -2.000, +2.000, -4.000}},\n       {{+2.000, -2.000, +2.000, +0.000, +4.000, -2.000}},\n       {{+2.000, -2.000, +2.000, -0.000, +4.000, -2.000}},\n       {{+2.000, -2.000, +2.000, +2.000, +4.000, +0.000}},\n       {{+2.000, -2.000, +2.000, -2.000, +4.000, -4.000}},\n       {{+2.000, -2.000, -2.000, +0.000, +0.000, -2.000}},\n       {{+2.000, -2.000, -2.000, -0.000, +0.000, -2.000}},\n       {{+2.000, -2.000, -2.000, +2.000, +0.000, +0.000}},\n       {{+2.000, -2.000, -2.000, -2.000, +0.000, -4.000}},\n       {{-2.000, +0.000, +0.000, +0.000, -2.000, +0.000}},\n       {{-2.000, +0.000, +0.000, -0.000, -2.000, +0.000}},\n       {{-2.000, +0.000, +0.000, +2.000, -2.000, +2.000}},\n       {{-2.000, +0.000, +0.000, -2.000, -2.000, -2.000}},\n       {{-2.000, +0.000, -0.000, +0.000, -2.000, +0.000}},\n       {{-2.000, +0.000, -0.000, -0.000, -2.000, +0.000}},\n       {{-2.000, +0.000, -0.000, +2.000, -2.000, +2.000}},\n       {{-2.000, +0.000, -0.000, -2.000, -2.000, -2.000}},\n       {{-2.000, +0.000, +2.000, +0.000, +0.000, +0.000}},\n       {{-2.000, +0.000, +2.000, -0.000, +0.000, +0.000}},\n       {{-2.000, +0.000, +2.000, +2.000, +0.000, +2.000}},\n       {{-2.000, +0.000, +2.000, -2.000, +0.000, -2.000}},\n       {{-2.000, +0.000, -2.000, +0.000, -4.000, +0.000}},\n       {{-2.000, +0.000, -2.000, -0.000, -4.000, +0.000}},\n       {{-2.000, +0.000, -2.000, +2.000, -4.000, +2.000}},\n       {{-2.000, +0.000, -2.000, -2.000, -4.000, -2.000}},\n       {{-2.000, -0.000, +0.000, +0.000, -2.000, +0.000}},\n       {{-2.000, -0.000, +0.000, -0.000, -2.000, -0.000}},\n       {{-2.000, -0.000, +0.000, +2.000, -2.000, +2.000}},\n       {{-2.000, -0.000, +0.000, -2.000, -2.000, -2.000}},\n       {{-2.000, -0.000, -0.000, +0.000, -2.000, +0.000}},\n       {{-2.000, -0.000, -0.000, -0.000, -2.000, -0.000}},\n       {{-2.000, -0.000, -0.000, +2.000, -2.000, +2.000}},\n       {{-2.000, -0.000, -0.000, -2.000, -2.000, -2.000}},\n       {{-2.000, -0.000, +2.000, +0.000, +0.000, +0.000}},\n       {{-2.000, -0.000, +2.000, -0.000, +0.000, -0.000}},\n       {{-2.000, -0.000, +2.000, +2.000, +0.000, +2.000}},\n       {{-2.000, -0.000, +2.000, -2.000, +0.000, -2.000}},\n       {{-2.000, -0.000, -2.000, +0.000, -4.000, +0.000}},\n       {{-2.000, -0.000, -2.000, -0.000, -4.000, -0.000}},\n       {{-2.000, -0.000, -2.000, +2.000, -4.000, +2.000}},\n       {{-2.000, -0.000, -2.000, -2.000, -4.000, -2.000}},\n       {{-2.000, +2.000, +0.000, +0.000, -2.000, +2.000}},\n       {{-2.000, +2.000, +0.000, -0.000, -2.000, +2.000}},\n       {{-2.000, +2.000, +0.000, +2.000, -2.000, +4.000}},\n       {{-2.000, +2.000, +0.000, -2.000, -2.000, +0.000}},\n       {{-2.000, +2.000, -0.000, +0.000, -2.000, +2.000}},\n       {{-2.000, +2.000, -0.000, -0.000, -2.000, +2.000}},\n       {{-2.000, +2.000, -0.000, +2.000, -2.000, +4.000}},\n       {{-2.000, +2.000, -0.000, -2.000, -2.000, +0.000}},\n       {{-2.000, +2.000, +2.000, +0.000, +0.000, +2.000}},\n       {{-2.000, +2.000, +2.000, -0.000, +0.000, +2.000}},\n       {{-2.000, +2.000, +2.000, +2.000, +0.000, +4.000}},\n       {{-2.000, +2.000, +2.000, -2.000, +0.000, +0.000}},\n       {{-2.000, +2.000, -2.000, +0.000, -4.000, +2.000}},\n       {{-2.000, +2.000, -2.000, -0.000, -4.000, +2.000}},\n       {{-2.000, +2.000, -2.000, +2.000, -4.000, +4.000}},\n       {{-2.000, +2.000, -2.000, -2.000, -4.000, +0.000}},\n       {{-2.000, -2.000, +0.000, +0.000, -2.000, -2.000}},\n       {{-2.000, -2.000, +0.000, -0.000, -2.000, -2.000}},\n       {{-2.000, -2.000, +0.000, +2.000, -2.000, +0.000}},\n       {{-2.000, -2.000, +0.000, -2.000, -2.000, -4.000}},\n       {{-2.000, -2.000, -0.000, +0.000, -2.000, -2.000}},\n       {{-2.000, -2.000, -0.000, -0.000, -2.000, -2.000}},\n       {{-2.000, -2.000, -0.000, +2.000, -2.000, +0.000}},\n       {{-2.000, -2.000, -0.000, -2.000, -2.000, -4.000}},\n       {{-2.000, -2.000, +2.000, +0.000, +0.000, -2.000}},\n       {{-2.000, -2.000, +2.000, -0.000, +0.000, -2.000}},\n       {{-2.000, -2.000, +2.000, +2.000, +0.000, +0.000}},\n       {{-2.000, -2.000, +2.000, -2.000, +0.000, -4.000}},\n       {{-2.000, -2.000, -2.000, +0.000, -4.000, -2.000}},\n       {{-2.000, -2.000, -2.000, -0.000, -4.000, -2.000}},\n       {{-2.000, -2.000, -2.000, +2.000, -4.000, +0.000}},\n       {{-2.000, -2.000, -2.000, -2.000, -4.000, -4.000}},\n    }};\n   for (unsigned i = 0; i < add_data.size(); ++i)\n   {\n      if (!(isnan)(add_data[i][4]) && !(isnan)(add_data[i][5]))\n      {\n         result = T(add_data[i][0], add_data[i][1]) + T(add_data[i][2], add_data[i][3]);\n         BOOST_TEST(result.real() == add_data[i][4]);\n         BOOST_TEST(result.imag() == add_data[i][5]);\n         BOOST_TEST((bool)signbit(result.real()) == signbit(add_data[i][4]));\n         BOOST_TEST((bool)signbit(result.imag()) == signbit(add_data[i][5]));\n      }\n   }\n\n   //\n   // Subtract the permutations:\n   //\n   static constexpr std::array<std::array<double, 6>, 256> sub_data =\n   { {\n       {{+0.000, +0.000, +0.000, +0.000, +0.000, +0.000}},\n       {{+0.000, +0.000, +0.000, -0.000, +0.000, +0.000}},\n       {{+0.000, +0.000, +0.000, +2.000, +0.000, -2.000}},\n       {{+0.000, +0.000, +0.000, -2.000, +0.000, +2.000}},\n       {{+0.000, +0.000, -0.000, +0.000, +0.000, +0.000}},\n       {{+0.000, +0.000, -0.000, -0.000, +0.000, +0.000}},\n       {{+0.000, +0.000, -0.000, +2.000, +0.000, -2.000}},\n       {{+0.000, +0.000, -0.000, -2.000, +0.000, +2.000}},\n       {{+0.000, +0.000, +2.000, +0.000, -2.000, +0.000}},\n       {{+0.000, +0.000, +2.000, -0.000, -2.000, +0.000}},\n       {{+0.000, +0.000, +2.000, +2.000, -2.000, -2.000}},\n       {{+0.000, +0.000, +2.000, -2.000, -2.000, +2.000}},\n       {{+0.000, +0.000, -2.000, +0.000, +2.000, +0.000}},\n       {{+0.000, +0.000, -2.000, -0.000, +2.000, +0.000}},\n       {{+0.000, +0.000, -2.000, +2.000, +2.000, -2.000}},\n       {{+0.000, +0.000, -2.000, -2.000, +2.000, +2.000}},\n       {{+0.000, -0.000, +0.000, +0.000, +0.000, -0.000}},\n       {{+0.000, -0.000, +0.000, -0.000, +0.000, +0.000}},\n       {{+0.000, -0.000, +0.000, +2.000, +0.000, -2.000}},\n       {{+0.000, -0.000, +0.000, -2.000, +0.000, +2.000}},\n       {{+0.000, -0.000, -0.000, +0.000, +0.000, -0.000}},\n       {{+0.000, -0.000, -0.000, -0.000, +0.000, +0.000}},\n       {{+0.000, -0.000, -0.000, +2.000, +0.000, -2.000}},\n       {{+0.000, -0.000, -0.000, -2.000, +0.000, +2.000}},\n       {{+0.000, -0.000, +2.000, +0.000, -2.000, -0.000}},\n       {{+0.000, -0.000, +2.000, -0.000, -2.000, +0.000}},\n       {{+0.000, -0.000, +2.000, +2.000, -2.000, -2.000}},\n       {{+0.000, -0.000, +2.000, -2.000, -2.000, +2.000}},\n       {{+0.000, -0.000, -2.000, +0.000, +2.000, -0.000}},\n       {{+0.000, -0.000, -2.000, -0.000, +2.000, +0.000}},\n       {{+0.000, -0.000, -2.000, +2.000, +2.000, -2.000}},\n       {{+0.000, -0.000, -2.000, -2.000, +2.000, +2.000}},\n       {{+0.000, +2.000, +0.000, +0.000, +0.000, +2.000}},\n       {{+0.000, +2.000, +0.000, -0.000, +0.000, +2.000}},\n       {{+0.000, +2.000, +0.000, +2.000, +0.000, +0.000}},\n       {{+0.000, +2.000, +0.000, -2.000, +0.000, +4.000}},\n       {{+0.000, +2.000, -0.000, +0.000, +0.000, +2.000}},\n       {{+0.000, +2.000, -0.000, -0.000, +0.000, +2.000}},\n       {{+0.000, +2.000, -0.000, +2.000, +0.000, +0.000}},\n       {{+0.000, +2.000, -0.000, -2.000, +0.000, +4.000}},\n       {{+0.000, +2.000, +2.000, +0.000, -2.000, +2.000}},\n       {{+0.000, +2.000, +2.000, -0.000, -2.000, +2.000}},\n       {{+0.000, +2.000, +2.000, +2.000, -2.000, +0.000}},\n       {{+0.000, +2.000, +2.000, -2.000, -2.000, +4.000}},\n       {{+0.000, +2.000, -2.000, +0.000, +2.000, +2.000}},\n       {{+0.000, +2.000, -2.000, -0.000, +2.000, +2.000}},\n       {{+0.000, +2.000, -2.000, +2.000, +2.000, +0.000}},\n       {{+0.000, +2.000, -2.000, -2.000, +2.000, +4.000}},\n       {{+0.000, -2.000, +0.000, +0.000, +0.000, -2.000}},\n       {{+0.000, -2.000, +0.000, -0.000, +0.000, -2.000}},\n       {{+0.000, -2.000, +0.000, +2.000, +0.000, -4.000}},\n       {{+0.000, -2.000, +0.000, -2.000, +0.000, +0.000}},\n       {{+0.000, -2.000, -0.000, +0.000, +0.000, -2.000}},\n       {{+0.000, -2.000, -0.000, -0.000, +0.000, -2.000}},\n       {{+0.000, -2.000, -0.000, +2.000, +0.000, -4.000}},\n       {{+0.000, -2.000, -0.000, -2.000, +0.000, +0.000}},\n       {{+0.000, -2.000, +2.000, +0.000, -2.000, -2.000}},\n       {{+0.000, -2.000, +2.000, -0.000, -2.000, -2.000}},\n       {{+0.000, -2.000, +2.000, +2.000, -2.000, -4.000}},\n       {{+0.000, -2.000, +2.000, -2.000, -2.000, +0.000}},\n       {{+0.000, -2.000, -2.000, +0.000, +2.000, -2.000}},\n       {{+0.000, -2.000, -2.000, -0.000, +2.000, -2.000}},\n       {{+0.000, -2.000, -2.000, +2.000, +2.000, -4.000}},\n       {{+0.000, -2.000, -2.000, -2.000, +2.000, +0.000}},\n       {{-0.000, +0.000, +0.000, +0.000, -0.000, +0.000}},\n       {{-0.000, +0.000, +0.000, -0.000, -0.000, +0.000}},\n       {{-0.000, +0.000, +0.000, +2.000, -0.000, -2.000}},\n       {{-0.000, +0.000, +0.000, -2.000, -0.000, +2.000}},\n       {{-0.000, +0.000, -0.000, +0.000, +0.000, +0.000}},\n       {{-0.000, +0.000, -0.000, -0.000, +0.000, +0.000}},\n       {{-0.000, +0.000, -0.000, +2.000, +0.000, -2.000}},\n       {{-0.000, +0.000, -0.000, -2.000, +0.000, +2.000}},\n       {{-0.000, +0.000, +2.000, +0.000, -2.000, +0.000}},\n       {{-0.000, +0.000, +2.000, -0.000, -2.000, +0.000}},\n       {{-0.000, +0.000, +2.000, +2.000, -2.000, -2.000}},\n       {{-0.000, +0.000, +2.000, -2.000, -2.000, +2.000}},\n       {{-0.000, +0.000, -2.000, +0.000, +2.000, +0.000}},\n       {{-0.000, +0.000, -2.000, -0.000, +2.000, +0.000}},\n       {{-0.000, +0.000, -2.000, +2.000, +2.000, -2.000}},\n       {{-0.000, +0.000, -2.000, -2.000, +2.000, +2.000}},\n       {{-0.000, -0.000, +0.000, +0.000, -0.000, -0.000}},\n       {{-0.000, -0.000, +0.000, -0.000, -0.000, +0.000}},\n       {{-0.000, -0.000, +0.000, +2.000, -0.000, -2.000}},\n       {{-0.000, -0.000, +0.000, -2.000, -0.000, +2.000}},\n       {{-0.000, -0.000, -0.000, +0.000, +0.000, -0.000}},\n       {{-0.000, -0.000, -0.000, -0.000, +0.000, +0.000}},\n       {{-0.000, -0.000, -0.000, +2.000, +0.000, -2.000}},\n       {{-0.000, -0.000, -0.000, -2.000, +0.000, +2.000}},\n       {{-0.000, -0.000, +2.000, +0.000, -2.000, -0.000}},\n       {{-0.000, -0.000, +2.000, -0.000, -2.000, +0.000}},\n       {{-0.000, -0.000, +2.000, +2.000, -2.000, -2.000}},\n       {{-0.000, -0.000, +2.000, -2.000, -2.000, +2.000}},\n       {{-0.000, -0.000, -2.000, +0.000, +2.000, -0.000}},\n       {{-0.000, -0.000, -2.000, -0.000, +2.000, +0.000}},\n       {{-0.000, -0.000, -2.000, +2.000, +2.000, -2.000}},\n       {{-0.000, -0.000, -2.000, -2.000, +2.000, +2.000}},\n       {{-0.000, +2.000, +0.000, +0.000, -0.000, +2.000}},\n       {{-0.000, +2.000, +0.000, -0.000, -0.000, +2.000}},\n       {{-0.000, +2.000, +0.000, +2.000, -0.000, +0.000}},\n       {{-0.000, +2.000, +0.000, -2.000, -0.000, +4.000}},\n       {{-0.000, +2.000, -0.000, +0.000, +0.000, +2.000}},\n       {{-0.000, +2.000, -0.000, -0.000, +0.000, +2.000}},\n       {{-0.000, +2.000, -0.000, +2.000, +0.000, +0.000}},\n       {{-0.000, +2.000, -0.000, -2.000, +0.000, +4.000}},\n       {{-0.000, +2.000, +2.000, +0.000, -2.000, +2.000}},\n       {{-0.000, +2.000, +2.000, -0.000, -2.000, +2.000}},\n       {{-0.000, +2.000, +2.000, +2.000, -2.000, +0.000}},\n       {{-0.000, +2.000, +2.000, -2.000, -2.000, +4.000}},\n       {{-0.000, +2.000, -2.000, +0.000, +2.000, +2.000}},\n       {{-0.000, +2.000, -2.000, -0.000, +2.000, +2.000}},\n       {{-0.000, +2.000, -2.000, +2.000, +2.000, +0.000}},\n       {{-0.000, +2.000, -2.000, -2.000, +2.000, +4.000}},\n       {{-0.000, -2.000, +0.000, +0.000, -0.000, -2.000}},\n       {{-0.000, -2.000, +0.000, -0.000, -0.000, -2.000}},\n       {{-0.000, -2.000, +0.000, +2.000, -0.000, -4.000}},\n       {{-0.000, -2.000, +0.000, -2.000, -0.000, +0.000}},\n       {{-0.000, -2.000, -0.000, +0.000, +0.000, -2.000}},\n       {{-0.000, -2.000, -0.000, -0.000, +0.000, -2.000}},\n       {{-0.000, -2.000, -0.000, +2.000, +0.000, -4.000}},\n       {{-0.000, -2.000, -0.000, -2.000, +0.000, +0.000}},\n       {{-0.000, -2.000, +2.000, +0.000, -2.000, -2.000}},\n       {{-0.000, -2.000, +2.000, -0.000, -2.000, -2.000}},\n       {{-0.000, -2.000, +2.000, +2.000, -2.000, -4.000}},\n       {{-0.000, -2.000, +2.000, -2.000, -2.000, +0.000}},\n       {{-0.000, -2.000, -2.000, +0.000, +2.000, -2.000}},\n       {{-0.000, -2.000, -2.000, -0.000, +2.000, -2.000}},\n       {{-0.000, -2.000, -2.000, +2.000, +2.000, -4.000}},\n       {{-0.000, -2.000, -2.000, -2.000, +2.000, +0.000}},\n       {{+2.000, +0.000, +0.000, +0.000, +2.000, +0.000}},\n       {{+2.000, +0.000, +0.000, -0.000, +2.000, +0.000}},\n       {{+2.000, +0.000, +0.000, +2.000, +2.000, -2.000}},\n       {{+2.000, +0.000, +0.000, -2.000, +2.000, +2.000}},\n       {{+2.000, +0.000, -0.000, +0.000, +2.000, +0.000}},\n       {{+2.000, +0.000, -0.000, -0.000, +2.000, +0.000}},\n       {{+2.000, +0.000, -0.000, +2.000, +2.000, -2.000}},\n       {{+2.000, +0.000, -0.000, -2.000, +2.000, +2.000}},\n       {{+2.000, +0.000, +2.000, +0.000, +0.000, +0.000}},\n       {{+2.000, +0.000, +2.000, -0.000, +0.000, +0.000}},\n       {{+2.000, +0.000, +2.000, +2.000, +0.000, -2.000}},\n       {{+2.000, +0.000, +2.000, -2.000, +0.000, +2.000}},\n       {{+2.000, +0.000, -2.000, +0.000, +4.000, +0.000}},\n       {{+2.000, +0.000, -2.000, -0.000, +4.000, +0.000}},\n       {{+2.000, +0.000, -2.000, +2.000, +4.000, -2.000}},\n       {{+2.000, +0.000, -2.000, -2.000, +4.000, +2.000}},\n       {{+2.000, -0.000, +0.000, +0.000, +2.000, -0.000}},\n       {{+2.000, -0.000, +0.000, -0.000, +2.000, +0.000}},\n       {{+2.000, -0.000, +0.000, +2.000, +2.000, -2.000}},\n       {{+2.000, -0.000, +0.000, -2.000, +2.000, +2.000}},\n       {{+2.000, -0.000, -0.000, +0.000, +2.000, -0.000}},\n       {{+2.000, -0.000, -0.000, -0.000, +2.000, +0.000}},\n       {{+2.000, -0.000, -0.000, +2.000, +2.000, -2.000}},\n       {{+2.000, -0.000, -0.000, -2.000, +2.000, +2.000}},\n       {{+2.000, -0.000, +2.000, +0.000, +0.000, -0.000}},\n       {{+2.000, -0.000, +2.000, -0.000, +0.000, +0.000}},\n       {{+2.000, -0.000, +2.000, +2.000, +0.000, -2.000}},\n       {{+2.000, -0.000, +2.000, -2.000, +0.000, +2.000}},\n       {{+2.000, -0.000, -2.000, +0.000, +4.000, -0.000}},\n       {{+2.000, -0.000, -2.000, -0.000, +4.000, +0.000}},\n       {{+2.000, -0.000, -2.000, +2.000, +4.000, -2.000}},\n       {{+2.000, -0.000, -2.000, -2.000, +4.000, +2.000}},\n       {{+2.000, +2.000, +0.000, +0.000, +2.000, +2.000}},\n       {{+2.000, +2.000, +0.000, -0.000, +2.000, +2.000}},\n       {{+2.000, +2.000, +0.000, +2.000, +2.000, +0.000}},\n       {{+2.000, +2.000, +0.000, -2.000, +2.000, +4.000}},\n       {{+2.000, +2.000, -0.000, +0.000, +2.000, +2.000}},\n       {{+2.000, +2.000, -0.000, -0.000, +2.000, +2.000}},\n       {{+2.000, +2.000, -0.000, +2.000, +2.000, +0.000}},\n       {{+2.000, +2.000, -0.000, -2.000, +2.000, +4.000}},\n       {{+2.000, +2.000, +2.000, +0.000, +0.000, +2.000}},\n       {{+2.000, +2.000, +2.000, -0.000, +0.000, +2.000}},\n       {{+2.000, +2.000, +2.000, +2.000, +0.000, +0.000}},\n       {{+2.000, +2.000, +2.000, -2.000, +0.000, +4.000}},\n       {{+2.000, +2.000, -2.000, +0.000, +4.000, +2.000}},\n       {{+2.000, +2.000, -2.000, -0.000, +4.000, +2.000}},\n       {{+2.000, +2.000, -2.000, +2.000, +4.000, +0.000}},\n       {{+2.000, +2.000, -2.000, -2.000, +4.000, +4.000}},\n       {{+2.000, -2.000, +0.000, +0.000, +2.000, -2.000}},\n       {{+2.000, -2.000, +0.000, -0.000, +2.000, -2.000}},\n       {{+2.000, -2.000, +0.000, +2.000, +2.000, -4.000}},\n       {{+2.000, -2.000, +0.000, -2.000, +2.000, +0.000}},\n       {{+2.000, -2.000, -0.000, +0.000, +2.000, -2.000}},\n       {{+2.000, -2.000, -0.000, -0.000, +2.000, -2.000}},\n       {{+2.000, -2.000, -0.000, +2.000, +2.000, -4.000}},\n       {{+2.000, -2.000, -0.000, -2.000, +2.000, +0.000}},\n       {{+2.000, -2.000, +2.000, +0.000, +0.000, -2.000}},\n       {{+2.000, -2.000, +2.000, -0.000, +0.000, -2.000}},\n       {{+2.000, -2.000, +2.000, +2.000, +0.000, -4.000}},\n       {{+2.000, -2.000, +2.000, -2.000, +0.000, +0.000}},\n       {{+2.000, -2.000, -2.000, +0.000, +4.000, -2.000}},\n       {{+2.000, -2.000, -2.000, -0.000, +4.000, -2.000}},\n       {{+2.000, -2.000, -2.000, +2.000, +4.000, -4.000}},\n       {{+2.000, -2.000, -2.000, -2.000, +4.000, +0.000}},\n       {{-2.000, +0.000, +0.000, +0.000, -2.000, +0.000}},\n       {{-2.000, +0.000, +0.000, -0.000, -2.000, +0.000}},\n       {{-2.000, +0.000, +0.000, +2.000, -2.000, -2.000}},\n       {{-2.000, +0.000, +0.000, -2.000, -2.000, +2.000}},\n       {{-2.000, +0.000, -0.000, +0.000, -2.000, +0.000}},\n       {{-2.000, +0.000, -0.000, -0.000, -2.000, +0.000}},\n       {{-2.000, +0.000, -0.000, +2.000, -2.000, -2.000}},\n       {{-2.000, +0.000, -0.000, -2.000, -2.000, +2.000}},\n       {{-2.000, +0.000, +2.000, +0.000, -4.000, +0.000}},\n       {{-2.000, +0.000, +2.000, -0.000, -4.000, +0.000}},\n       {{-2.000, +0.000, +2.000, +2.000, -4.000, -2.000}},\n       {{-2.000, +0.000, +2.000, -2.000, -4.000, +2.000}},\n       {{-2.000, +0.000, -2.000, +0.000, +0.000, +0.000}},\n       {{-2.000, +0.000, -2.000, -0.000, +0.000, +0.000}},\n       {{-2.000, +0.000, -2.000, +2.000, +0.000, -2.000}},\n       {{-2.000, +0.000, -2.000, -2.000, +0.000, +2.000}},\n       {{-2.000, -0.000, +0.000, +0.000, -2.000, -0.000}},\n       {{-2.000, -0.000, +0.000, -0.000, -2.000, +0.000}},\n       {{-2.000, -0.000, +0.000, +2.000, -2.000, -2.000}},\n       {{-2.000, -0.000, +0.000, -2.000, -2.000, +2.000}},\n       {{-2.000, -0.000, -0.000, +0.000, -2.000, -0.000}},\n       {{-2.000, -0.000, -0.000, -0.000, -2.000, +0.000}},\n       {{-2.000, -0.000, -0.000, +2.000, -2.000, -2.000}},\n       {{-2.000, -0.000, -0.000, -2.000, -2.000, +2.000}},\n       {{-2.000, -0.000, +2.000, +0.000, -4.000, -0.000}},\n       {{-2.000, -0.000, +2.000, -0.000, -4.000, +0.000}},\n       {{-2.000, -0.000, +2.000, +2.000, -4.000, -2.000}},\n       {{-2.000, -0.000, +2.000, -2.000, -4.000, +2.000}},\n       {{-2.000, -0.000, -2.000, +0.000, +0.000, -0.000}},\n       {{-2.000, -0.000, -2.000, -0.000, +0.000, +0.000}},\n       {{-2.000, -0.000, -2.000, +2.000, +0.000, -2.000}},\n       {{-2.000, -0.000, -2.000, -2.000, +0.000, +2.000}},\n       {{-2.000, +2.000, +0.000, +0.000, -2.000, +2.000}},\n       {{-2.000, +2.000, +0.000, -0.000, -2.000, +2.000}},\n       {{-2.000, +2.000, +0.000, +2.000, -2.000, +0.000}},\n       {{-2.000, +2.000, +0.000, -2.000, -2.000, +4.000}},\n       {{-2.000, +2.000, -0.000, +0.000, -2.000, +2.000}},\n       {{-2.000, +2.000, -0.000, -0.000, -2.000, +2.000}},\n       {{-2.000, +2.000, -0.000, +2.000, -2.000, +0.000}},\n       {{-2.000, +2.000, -0.000, -2.000, -2.000, +4.000}},\n       {{-2.000, +2.000, +2.000, +0.000, -4.000, +2.000}},\n       {{-2.000, +2.000, +2.000, -0.000, -4.000, +2.000}},\n       {{-2.000, +2.000, +2.000, +2.000, -4.000, +0.000}},\n       {{-2.000, +2.000, +2.000, -2.000, -4.000, +4.000}},\n       {{-2.000, +2.000, -2.000, +0.000, +0.000, +2.000}},\n       {{-2.000, +2.000, -2.000, -0.000, +0.000, +2.000}},\n       {{-2.000, +2.000, -2.000, +2.000, +0.000, +0.000}},\n       {{-2.000, +2.000, -2.000, -2.000, +0.000, +4.000}},\n       {{-2.000, -2.000, +0.000, +0.000, -2.000, -2.000}},\n       {{-2.000, -2.000, +0.000, -0.000, -2.000, -2.000}},\n       {{-2.000, -2.000, +0.000, +2.000, -2.000, -4.000}},\n       {{-2.000, -2.000, +0.000, -2.000, -2.000, +0.000}},\n       {{-2.000, -2.000, -0.000, +0.000, -2.000, -2.000}},\n       {{-2.000, -2.000, -0.000, -0.000, -2.000, -2.000}},\n       {{-2.000, -2.000, -0.000, +2.000, -2.000, -4.000}},\n       {{-2.000, -2.000, -0.000, -2.000, -2.000, +0.000}},\n       {{-2.000, -2.000, +2.000, +0.000, -4.000, -2.000}},\n       {{-2.000, -2.000, +2.000, -0.000, -4.000, -2.000}},\n       {{-2.000, -2.000, +2.000, +2.000, -4.000, -4.000}},\n       {{-2.000, -2.000, +2.000, -2.000, -4.000, +0.000}},\n       {{-2.000, -2.000, -2.000, +0.000, +0.000, -2.000}},\n       {{-2.000, -2.000, -2.000, -0.000, +0.000, -2.000}},\n       {{-2.000, -2.000, -2.000, +2.000, +0.000, -4.000}},\n       {{-2.000, -2.000, -2.000, -2.000, +0.000, +0.000}},\n   }};\n   for (unsigned i = 0; i < sub_data.size(); ++i)\n   {\n      if (!(isnan)(sub_data[i][4]) && !(isnan)(sub_data[i][5]))\n      {\n         result = T(sub_data[i][0], sub_data[i][1]) - T(sub_data[i][2], sub_data[i][3]);\n         BOOST_TEST(result.real() == sub_data[i][4]);\n         BOOST_TEST(result.imag() == sub_data[i][5]);\n         BOOST_TEST((bool)signbit(result.real()) == signbit(sub_data[i][4]));\n         BOOST_TEST((bool)signbit(result.imag()) == signbit(sub_data[i][5]));\n      }\n   }\n\n   //\n   // Multiplication by scalar:\n   //\n   static constexpr std::array<std::array<double, 5>, 64> scalar_mul_data =\n       {{\n           {{+0.000, +0.000, +0.000, +0.000, +0.000}},\n           {{+0.000, +0.000, -0.000, -0.000, -0.000}},\n           {{+0.000, +0.000, +2.000, +0.000, +0.000}},\n           {{+0.000, +0.000, -2.000, -0.000, -0.000}},\n           {{+0.000, -0.000, +0.000, +0.000, -0.000}},\n           {{+0.000, -0.000, -0.000, -0.000, +0.000}},\n           {{+0.000, -0.000, +2.000, +0.000, -0.000}},\n           {{+0.000, -0.000, -2.000, -0.000, +0.000}},\n           {{+0.000, +2.000, +0.000, +0.000, +0.000}},\n           {{+0.000, +2.000, -0.000, -0.000, -0.000}},\n           {{+0.000, +2.000, +2.000, +0.000, +4.000}},\n           {{+0.000, +2.000, -2.000, -0.000, -4.000}},\n           {{+0.000, -2.000, +0.000, +0.000, -0.000}},\n           {{+0.000, -2.000, -0.000, -0.000, +0.000}},\n           {{+0.000, -2.000, +2.000, +0.000, -4.000}},\n           {{+0.000, -2.000, -2.000, -0.000, +4.000}},\n           {{-0.000, +0.000, +0.000, -0.000, +0.000}},\n           {{-0.000, +0.000, -0.000, +0.000, -0.000}},\n           {{-0.000, +0.000, +2.000, -0.000, +0.000}},\n           {{-0.000, +0.000, -2.000, +0.000, -0.000}},\n           {{-0.000, -0.000, +0.000, -0.000, -0.000}},\n           {{-0.000, -0.000, -0.000, +0.000, +0.000}},\n           {{-0.000, -0.000, +2.000, -0.000, -0.000}},\n           {{-0.000, -0.000, -2.000, +0.000, +0.000}},\n           {{-0.000, +2.000, +0.000, -0.000, +0.000}},\n           {{-0.000, +2.000, -0.000, +0.000, -0.000}},\n           {{-0.000, +2.000, +2.000, -0.000, +4.000}},\n           {{-0.000, +2.000, -2.000, +0.000, -4.000}},\n           {{-0.000, -2.000, +0.000, -0.000, -0.000}},\n           {{-0.000, -2.000, -0.000, +0.000, +0.000}},\n           {{-0.000, -2.000, +2.000, -0.000, -4.000}},\n           {{-0.000, -2.000, -2.000, +0.000, +4.000}},\n           {{+2.000, +0.000, +0.000, +0.000, +0.000}},\n           {{+2.000, +0.000, -0.000, -0.000, -0.000}},\n           {{+2.000, +0.000, +2.000, +4.000, +0.000}},\n           {{+2.000, +0.000, -2.000, -4.000, -0.000}},\n           {{+2.000, -0.000, +0.000, +0.000, -0.000}},\n           {{+2.000, -0.000, -0.000, -0.000, +0.000}},\n           {{+2.000, -0.000, +2.000, +4.000, -0.000}},\n           {{+2.000, -0.000, -2.000, -4.000, +0.000}},\n           {{+2.000, +2.000, +0.000, +0.000, +0.000}},\n           {{+2.000, +2.000, -0.000, -0.000, -0.000}},\n           {{+2.000, +2.000, +2.000, +4.000, +4.000}},\n           {{+2.000, +2.000, -2.000, -4.000, -4.000}},\n           {{+2.000, -2.000, +0.000, +0.000, -0.000}},\n           {{+2.000, -2.000, -0.000, -0.000, +0.000}},\n           {{+2.000, -2.000, +2.000, +4.000, -4.000}},\n           {{+2.000, -2.000, -2.000, -4.000, +4.000}},\n           {{-2.000, +0.000, +0.000, -0.000, +0.000}},\n           {{-2.000, +0.000, -0.000, +0.000, -0.000}},\n           {{-2.000, +0.000, +2.000, -4.000, +0.000}},\n           {{-2.000, +0.000, -2.000, +4.000, -0.000}},\n           {{-2.000, -0.000, +0.000, -0.000, -0.000}},\n           {{-2.000, -0.000, -0.000, +0.000, +0.000}},\n           {{-2.000, -0.000, +2.000, -4.000, -0.000}},\n           {{-2.000, -0.000, -2.000, +4.000, +0.000}},\n           {{-2.000, +2.000, +0.000, -0.000, +0.000}},\n           {{-2.000, +2.000, -0.000, +0.000, -0.000}},\n           {{-2.000, +2.000, +2.000, -4.000, +4.000}},\n           {{-2.000, +2.000, -2.000, +4.000, -4.000}},\n           {{-2.000, -2.000, +0.000, -0.000, -0.000}},\n           {{-2.000, -2.000, -0.000, +0.000, +0.000}},\n           {{-2.000, -2.000, +2.000, -4.000, -4.000}},\n           {{-2.000, -2.000, -2.000, +4.000, +4.000}},\n       }};\n   for (unsigned i = 0; i < scalar_mul_data.size(); ++i)\n   {\n      if (!(isnan)(scalar_mul_data[i][3]) && !(isnan)(scalar_mul_data[i][4]))\n      {\n         result = T(scalar_mul_data[i][0], scalar_mul_data[i][1]) * value_type(scalar_mul_data[i][2]);\n         BOOST_TEST(result.real() == scalar_mul_data[i][3]);\n         BOOST_TEST(result.imag() == scalar_mul_data[i][4]);\n         BOOST_TEST((bool)signbit(result.real()) == signbit(scalar_mul_data[i][3]));\n         BOOST_TEST((bool)signbit(result.imag()) == signbit(scalar_mul_data[i][4]));\n      }\n   }\n   //\n   // Division by scalar:\n   //\n   static constexpr std::array<std::array<double, 5>, 64> scalar_div_data =\n       {{\n           {{+0.000, +0.000, +0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN()}},\n           {{+0.000, +0.000, -0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN()}},\n           {{+0.000, +0.000, +2.000, +0.000, +0.000}},\n           {{+0.000, +0.000, -2.000, -0.000, -0.000}},\n           {{+0.000, -0.000, +0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN()}},\n           {{+0.000, -0.000, -0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN()}},\n           {{+0.000, -0.000, +2.000, +0.000, -0.000}},\n           {{+0.000, -0.000, -2.000, -0.000, +0.000}},\n           {{+0.000, +2.000, +0.000, std::numeric_limits<double>::quiet_NaN(), +std::numeric_limits<double>::infinity()}},\n           {{+0.000, +2.000, -0.000, std::numeric_limits<double>::quiet_NaN(), -std::numeric_limits<double>::infinity()}},\n           {{+0.000, +2.000, +2.000, +0.000, +1.000}},\n           {{+0.000, +2.000, -2.000, -0.000, -1.000}},\n           {{+0.000, -2.000, +0.000, std::numeric_limits<double>::quiet_NaN(), -std::numeric_limits<double>::infinity()}},\n           {{+0.000, -2.000, -0.000, std::numeric_limits<double>::quiet_NaN(), +std::numeric_limits<double>::infinity()}},\n           {{+0.000, -2.000, +2.000, +0.000, -1.000}},\n           {{+0.000, -2.000, -2.000, -0.000, +1.000}},\n           {{-0.000, +0.000, +0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN()}},\n           {{-0.000, +0.000, -0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN()}},\n           {{-0.000, +0.000, +2.000, -0.000, +0.000}},\n           {{-0.000, +0.000, -2.000, +0.000, -0.000}},\n           {{-0.000, -0.000, +0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN()}},\n           {{-0.000, -0.000, -0.000, std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN()}},\n           {{-0.000, -0.000, +2.000, -0.000, -0.000}},\n           {{-0.000, -0.000, -2.000, +0.000, +0.000}},\n           {{-0.000, +2.000, +0.000, std::numeric_limits<double>::quiet_NaN(), +std::numeric_limits<double>::infinity()}},\n           {{-0.000, +2.000, -0.000, std::numeric_limits<double>::quiet_NaN(), -std::numeric_limits<double>::infinity()}},\n           {{-0.000, +2.000, +2.000, -0.000, +1.000}},\n           {{-0.000, +2.000, -2.000, +0.000, -1.000}},\n           {{-0.000, -2.000, +0.000, std::numeric_limits<double>::quiet_NaN(), -std::numeric_limits<double>::infinity()}},\n           {{-0.000, -2.000, -0.000, std::numeric_limits<double>::quiet_NaN(), +std::numeric_limits<double>::infinity()}},\n           {{-0.000, -2.000, +2.000, -0.000, -1.000}},\n           {{-0.000, -2.000, -2.000, +0.000, +1.000}},\n           {{+2.000, +0.000, +0.000, +std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN()}},\n           {{+2.000, +0.000, -0.000, -std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN()}},\n           {{+2.000, +0.000, +2.000, +1.000, +0.000}},\n           {{+2.000, +0.000, -2.000, -1.000, -0.000}},\n           {{+2.000, -0.000, +0.000, +std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN()}},\n           {{+2.000, -0.000, -0.000, -std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN()}},\n           {{+2.000, -0.000, +2.000, +1.000, -0.000}},\n           {{+2.000, -0.000, -2.000, -1.000, +0.000}},\n           {{+2.000, +2.000, +0.000, +std::numeric_limits<double>::infinity(), +std::numeric_limits<double>::infinity()}},\n           {{+2.000, +2.000, -0.000, -std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity()}},\n           {{+2.000, +2.000, +2.000, +1.000, +1.000}},\n           {{+2.000, +2.000, -2.000, -1.000, -1.000}},\n           {{+2.000, -2.000, +0.000, +std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity()}},\n           {{+2.000, -2.000, -0.000, -std::numeric_limits<double>::infinity(), +std::numeric_limits<double>::infinity()}},\n           {{+2.000, -2.000, +2.000, +1.000, -1.000}},\n           {{+2.000, -2.000, -2.000, -1.000, +1.000}},\n           {{-2.000, +0.000, +0.000, -std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN()}},\n           {{-2.000, +0.000, -0.000, +std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN()}},\n           {{-2.000, +0.000, +2.000, -1.000, +0.000}},\n           {{-2.000, +0.000, -2.000, +1.000, -0.000}},\n           {{-2.000, -0.000, +0.000, -std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN()}},\n           {{-2.000, -0.000, -0.000, +std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN()}},\n           {{-2.000, -0.000, +2.000, -1.000, -0.000}},\n           {{-2.000, -0.000, -2.000, +1.000, +0.000}},\n           {{-2.000, +2.000, +0.000, -std::numeric_limits<double>::infinity(), +std::numeric_limits<double>::infinity()}},\n           {{-2.000, +2.000, -0.000, +std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity()}},\n           {{-2.000, +2.000, +2.000, -1.000, +1.000}},\n           {{-2.000, +2.000, -2.000, +1.000, -1.000}},\n           {{-2.000, -2.000, +0.000, -std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity()}},\n           {{-2.000, -2.000, -0.000, +std::numeric_limits<double>::infinity(), +std::numeric_limits<double>::infinity()}},\n           {{-2.000, -2.000, +2.000, -1.000, -1.000}},\n           {{-2.000, -2.000, -2.000, +1.000, +1.000}},\n       }};\n   for (unsigned i = 0; i < scalar_div_data.size(); ++i)\n   {\n      if (!(isnan)(scalar_div_data[i][3]) && !(isnan)(scalar_div_data[i][4]))\n      {\n         result = T(scalar_div_data[i][0], scalar_div_data[i][1]) / value_type(scalar_div_data[i][2]);\n         BOOST_TEST(result.real() == scalar_div_data[i][3]);\n         BOOST_TEST(result.imag() == scalar_div_data[i][4]);\n         BOOST_TEST((bool)signbit(result.real()) == signbit(scalar_div_data[i][3]));\n         BOOST_TEST((bool)signbit(result.imag()) == signbit(scalar_div_data[i][4]));\n      }\n   }\n\n\n   //\n   // Addition of scalar:\n   //\n   static constexpr std::array<std::array<double, 5>, 64> scalar_add_data =\n   {{\n           {{+0.000, +0.000, +0.000, +0.000, +0.000}},\n           {{+0.000, +0.000, -0.000, +0.000, +0.000}},\n           {{+0.000, +0.000, +2.000, +2.000, +0.000}},\n           {{+0.000, +0.000, -2.000, -2.000, +0.000}},\n           {{+0.000, -0.000, +0.000, +0.000, -0.000}},\n           {{+0.000, -0.000, -0.000, +0.000, -0.000}},\n           {{+0.000, -0.000, +2.000, +2.000, -0.000}},\n           {{+0.000, -0.000, -2.000, -2.000, -0.000}},\n           {{+0.000, +2.000, +0.000, +0.000, +2.000}},\n           {{+0.000, +2.000, -0.000, +0.000, +2.000}},\n           {{+0.000, +2.000, +2.000, +2.000, +2.000}},\n           {{+0.000, +2.000, -2.000, -2.000, +2.000}},\n           {{+0.000, -2.000, +0.000, +0.000, -2.000}},\n           {{+0.000, -2.000, -0.000, +0.000, -2.000}},\n           {{+0.000, -2.000, +2.000, +2.000, -2.000}},\n           {{+0.000, -2.000, -2.000, -2.000, -2.000}},\n           {{-0.000, +0.000, +0.000, +0.000, +0.000}},\n           {{-0.000, +0.000, -0.000, -0.000, +0.000}},\n           {{-0.000, +0.000, +2.000, +2.000, +0.000}},\n           {{-0.000, +0.000, -2.000, -2.000, +0.000}},\n           {{-0.000, -0.000, +0.000, +0.000, -0.000}},\n           {{-0.000, -0.000, -0.000, -0.000, -0.000}},\n           {{-0.000, -0.000, +2.000, +2.000, -0.000}},\n           {{-0.000, -0.000, -2.000, -2.000, -0.000}},\n           {{-0.000, +2.000, +0.000, +0.000, +2.000}},\n           {{-0.000, +2.000, -0.000, -0.000, +2.000}},\n           {{-0.000, +2.000, +2.000, +2.000, +2.000}},\n           {{-0.000, +2.000, -2.000, -2.000, +2.000}},\n           {{-0.000, -2.000, +0.000, +0.000, -2.000}},\n           {{-0.000, -2.000, -0.000, -0.000, -2.000}},\n           {{-0.000, -2.000, +2.000, +2.000, -2.000}},\n           {{-0.000, -2.000, -2.000, -2.000, -2.000}},\n           {{+2.000, +0.000, +0.000, +2.000, +0.000}},\n           {{+2.000, +0.000, -0.000, +2.000, +0.000}},\n           {{+2.000, +0.000, +2.000, +4.000, +0.000}},\n           {{+2.000, +0.000, -2.000, +0.000, +0.000}},\n           {{+2.000, -0.000, +0.000, +2.000, -0.000}},\n           {{+2.000, -0.000, -0.000, +2.000, -0.000}},\n           {{+2.000, -0.000, +2.000, +4.000, -0.000}},\n           {{+2.000, -0.000, -2.000, +0.000, -0.000}},\n           {{+2.000, +2.000, +0.000, +2.000, +2.000}},\n           {{+2.000, +2.000, -0.000, +2.000, +2.000}},\n           {{+2.000, +2.000, +2.000, +4.000, +2.000}},\n           {{+2.000, +2.000, -2.000, +0.000, +2.000}},\n           {{+2.000, -2.000, +0.000, +2.000, -2.000}},\n           {{+2.000, -2.000, -0.000, +2.000, -2.000}},\n           {{+2.000, -2.000, +2.000, +4.000, -2.000}},\n           {{+2.000, -2.000, -2.000, +0.000, -2.000}},\n           {{-2.000, +0.000, +0.000, -2.000, +0.000}},\n           {{-2.000, +0.000, -0.000, -2.000, +0.000}},\n           {{-2.000, +0.000, +2.000, +0.000, +0.000}},\n           {{-2.000, +0.000, -2.000, -4.000, +0.000}},\n           {{-2.000, -0.000, +0.000, -2.000, -0.000}},\n           {{-2.000, -0.000, -0.000, -2.000, -0.000}},\n           {{-2.000, -0.000, +2.000, +0.000, -0.000}},\n           {{-2.000, -0.000, -2.000, -4.000, -0.000}},\n           {{-2.000, +2.000, +0.000, -2.000, +2.000}},\n           {{-2.000, +2.000, -0.000, -2.000, +2.000}},\n           {{-2.000, +2.000, +2.000, +0.000, +2.000}},\n           {{-2.000, +2.000, -2.000, -4.000, +2.000}},\n           {{-2.000, -2.000, +0.000, -2.000, -2.000}},\n           {{-2.000, -2.000, -0.000, -2.000, -2.000}},\n           {{-2.000, -2.000, +2.000, +0.000, -2.000}},\n           {{-2.000, -2.000, -2.000, -4.000, -2.000}},\n       }};\n   for (unsigned i = 0; i < scalar_add_data.size(); ++i)\n   {\n      if (!(isnan)(scalar_add_data[i][3]) && !(isnan)(scalar_add_data[i][4]))\n      {\n         result = T(scalar_add_data[i][0], scalar_add_data[i][1]) + value_type(scalar_add_data[i][2]);\n         BOOST_TEST(result.real() == scalar_add_data[i][3]);\n         BOOST_TEST(result.imag() == scalar_add_data[i][4]);\n         BOOST_TEST((bool)signbit(result.real()) == signbit(scalar_add_data[i][3]));\n         BOOST_TEST((bool)signbit(result.imag()) == signbit(scalar_add_data[i][4]));\n      }\n   }\n   //\n   // Subtraction of scalar:\n   //\n   static constexpr std::array<std::array<double, 5>, 64> scalar_sub_data =\n   {{\n           {{+0.000, +0.000, +0.000, +0.000, +0.000}},\n           {{+0.000, +0.000, -0.000, +0.000, +0.000}},\n           {{+0.000, +0.000, +2.000, -2.000, +0.000}},\n           {{+0.000, +0.000, -2.000, +2.000, +0.000}},\n           {{+0.000, -0.000, +0.000, +0.000, -0.000}},\n           {{+0.000, -0.000, -0.000, +0.000, -0.000}},\n           {{+0.000, -0.000, +2.000, -2.000, -0.000}},\n           {{+0.000, -0.000, -2.000, +2.000, -0.000}},\n           {{+0.000, +2.000, +0.000, +0.000, +2.000}},\n           {{+0.000, +2.000, -0.000, +0.000, +2.000}},\n           {{+0.000, +2.000, +2.000, -2.000, +2.000}},\n           {{+0.000, +2.000, -2.000, +2.000, +2.000}},\n           {{+0.000, -2.000, +0.000, +0.000, -2.000}},\n           {{+0.000, -2.000, -0.000, +0.000, -2.000}},\n           {{+0.000, -2.000, +2.000, -2.000, -2.000}},\n           {{+0.000, -2.000, -2.000, +2.000, -2.000}},\n           {{-0.000, +0.000, +0.000, -0.000, +0.000}},\n           {{-0.000, +0.000, -0.000, +0.000, +0.000}},\n           {{-0.000, +0.000, +2.000, -2.000, +0.000}},\n           {{-0.000, +0.000, -2.000, +2.000, +0.000}},\n           {{-0.000, -0.000, +0.000, -0.000, -0.000}},\n           {{-0.000, -0.000, -0.000, +0.000, -0.000}},\n           {{-0.000, -0.000, +2.000, -2.000, -0.000}},\n           {{-0.000, -0.000, -2.000, +2.000, -0.000}},\n           {{-0.000, +2.000, +0.000, -0.000, +2.000}},\n           {{-0.000, +2.000, -0.000, +0.000, +2.000}},\n           {{-0.000, +2.000, +2.000, -2.000, +2.000}},\n           {{-0.000, +2.000, -2.000, +2.000, +2.000}},\n           {{-0.000, -2.000, +0.000, -0.000, -2.000}},\n           {{-0.000, -2.000, -0.000, +0.000, -2.000}},\n           {{-0.000, -2.000, +2.000, -2.000, -2.000}},\n           {{-0.000, -2.000, -2.000, +2.000, -2.000}},\n           {{+2.000, +0.000, +0.000, +2.000, +0.000}},\n           {{+2.000, +0.000, -0.000, +2.000, +0.000}},\n           {{+2.000, +0.000, +2.000, +0.000, +0.000}},\n           {{+2.000, +0.000, -2.000, +4.000, +0.000}},\n           {{+2.000, -0.000, +0.000, +2.000, -0.000}},\n           {{+2.000, -0.000, -0.000, +2.000, -0.000}},\n           {{+2.000, -0.000, +2.000, +0.000, -0.000}},\n           {{+2.000, -0.000, -2.000, +4.000, -0.000}},\n           {{+2.000, +2.000, +0.000, +2.000, +2.000}},\n           {{+2.000, +2.000, -0.000, +2.000, +2.000}},\n           {{+2.000, +2.000, +2.000, +0.000, +2.000}},\n           {{+2.000, +2.000, -2.000, +4.000, +2.000}},\n           {{+2.000, -2.000, +0.000, +2.000, -2.000}},\n           {{+2.000, -2.000, -0.000, +2.000, -2.000}},\n           {{+2.000, -2.000, +2.000, +0.000, -2.000}},\n           {{+2.000, -2.000, -2.000, +4.000, -2.000}},\n           {{-2.000, +0.000, +0.000, -2.000, +0.000}},\n           {{-2.000, +0.000, -0.000, -2.000, +0.000}},\n           {{-2.000, +0.000, +2.000, -4.000, +0.000}},\n           {{-2.000, +0.000, -2.000, +0.000, +0.000}},\n           {{-2.000, -0.000, +0.000, -2.000, -0.000}},\n           {{-2.000, -0.000, -0.000, -2.000, -0.000}},\n           {{-2.000, -0.000, +2.000, -4.000, -0.000}},\n           {{-2.000, -0.000, -2.000, +0.000, -0.000}},\n           {{-2.000, +2.000, +0.000, -2.000, +2.000}},\n           {{-2.000, +2.000, -0.000, -2.000, +2.000}},\n           {{-2.000, +2.000, +2.000, -4.000, +2.000}},\n           {{-2.000, +2.000, -2.000, +0.000, +2.000}},\n           {{-2.000, -2.000, +0.000, -2.000, -2.000}},\n           {{-2.000, -2.000, -0.000, -2.000, -2.000}},\n           {{-2.000, -2.000, +2.000, -4.000, -2.000}},\n           {{-2.000, -2.000, -2.000, +0.000, -2.000}},\n       }};\n   for (unsigned i = 0; i < scalar_sub_data.size(); ++i)\n   {\n      if (!(isnan)(scalar_sub_data[i][3]) && !(isnan)(scalar_sub_data[i][4]))\n      {\n         result = T(scalar_sub_data[i][0], scalar_sub_data[i][1]) - value_type(scalar_sub_data[i][2]);\n         BOOST_TEST(result.real() == scalar_sub_data[i][3]);\n         BOOST_TEST(result.imag() == scalar_sub_data[i][4]);\n         BOOST_TEST((bool)signbit(result.real()) == signbit(scalar_sub_data[i][3]));\n         BOOST_TEST((bool)signbit(result.imag()) == signbit(scalar_sub_data[i][4]));\n      }\n   }\n}\n\nint main()\n{\n#ifdef TEST_DOUBLE\n   //\n   // This does not actually pass these tests:\n   // \n   //test<std::complex<double>>();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_complex_50>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_complex_50::backend_type, boost::multiprecision::et_on> >();\n#endif\n#ifdef TEST_MPC\n   test<boost::multiprecision::mpc_complex_50>();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_constants.cpp",
    "content": "// Copyright John Maddock 2012.\n\n// Use, modification and distribution are subject to the\n// Boost Software License, Version 1.0.\n// (See accompanying file LICENSE_1_0.txt\n// or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#if !defined(TEST_MPF_50) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50)\n#define TEST_MPF_50\n#define TEST_CPP_DEC_FLOAT\n#define TEST_MPFR_50\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(TEST_MPFR_50)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n\n#include \"test.hpp\"\n\nstatic const char* ln2 =\n    \"0.693147180559945309417232121458176568075500134360255254120680009493393621969694\"\n    \"71560586332699641868754200148102057068573368552023575813055703267075163507596193\"\n    \"07275708283714351903070386238916734711233501153644979552391204751726815749320651\"\n    \"55524734139525882950453007095326366642654104239157814952043740430385500801944170\"\n    \"64167151864471283996817178454695702627163106454615025720740248163777338963855069\"\n    \"52606683411372738737229289564935470257626520988596932019650585547647033067936544\"\n    \"32547632744951250406069438147104689946506220167720424524529612687946546193165174\"\n    \"68139267250410380254625965686914419287160829380317271436778265487756648508567407\"\n    \"76484514644399404614226031930967354025744460703080960850474866385231381816767514\"\n    \"38667476647890881437141985494231519973548803751658612753529166100071053558249879\"\n    \"41472950929311389715599820565439287170007218085761025236889213244971389320378439\"\n    \"35308877482597017155910708823683627589842589185353024363421436706118923678919237\"\n    \"23146723217205340164925687274778234453534764811494186423867767744060695626573796\"\n    \"00867076257199184734022651462837904883062033061144630073719489002743643965002580\"\n    \"93651944304119115060809487930678651588709006052034684297361938412896525565396860\"\n    \"22194122924207574321757489097706752687115817051137009158942665478595964890653058\"\n    \"46025866838294002283300538207400567705304678700184162404418833232798386349001563\"\n    \"12188956065055315127219939833203075140842609147900126516824344389357247278820548\"\n    \"62715527418772430024897945401961872339808608316648114909306675193393128904316413\"\n    \"70681397776498176974868903887789991296503619270710889264105230924783917373501229\"\n    \"84242049956893599220660220465494151061391878857442455775102068370308666194808964\"\n    \"12186807790208181588580001688115973056186676199187395200766719214592236720602539\"\n    \"59543654165531129517598994005600036651356756905124592682574394648316833262490180\"\n    \"38242408242314523061409638057007025513877026817851630690255137032340538021450190\"\n    \"15374029509942262995779647427138157363801729873940704242179972266962979939312706\"\n    \"93574724049338653087975872169964512944649188377115670167859880498183889678413493\"\n    \"83140140731664727653276359192335112333893387095132090592721854713289754707978913\"\n    \"84445466676192702885533423429899321803769154973340267546758873236778342916191810\"\n    \"43011609169526554785973289176354555674286387746398710191243175425588830120677921\"\n    \"02803412068797591430812833072303008834947057924965910058600123415617574132724659\"\n    \"43068435465211135021544341539955381856522750221424566440006276183303206472725721\"\n    \"97515290827856842132079598863896727711955221881904660395700977470651261950527893\"\n    \"22960889314056254334425523920620303439417773579455921259019925591148440242390125\"\n    \"54259003129537051922061506434583787873002035414421785758013236451660709914383145\"\n    \"00498589668857722214865288216941812704886075897220321666312837832915676307498729\"\n    \"85746389282693735098407780493950049339987626475507031622161390348452994249172483\"\n    \"73406136622638349368111684167056925214751383930638455371862687797328895558871634\"\n    \"429756244755392366369488877823890174981027\";\nstatic const char* pi =\n    \"3.141592653589793238462643383279502884197169399375105820974944592307816406286208\"\n    \"99862803482534211706798214808651328230664709384460955058223172535940812848111745\"\n    \"02841027019385211055596446229489549303819644288109756659334461284756482337867831\"\n    \"65271201909145648566923460348610454326648213393607260249141273724587006606315588\"\n    \"17488152092096282925409171536436789259036001133053054882046652138414695194151160\"\n    \"94330572703657595919530921861173819326117931051185480744623799627495673518857527\"\n    \"24891227938183011949129833673362440656643086021394946395224737190702179860943702\"\n    \"77053921717629317675238467481846766940513200056812714526356082778577134275778960\"\n    \"91736371787214684409012249534301465495853710507922796892589235420199561121290219\"\n    \"60864034418159813629774771309960518707211349999998372978049951059731732816096318\"\n    \"59502445945534690830264252230825334468503526193118817101000313783875288658753320\"\n    \"83814206171776691473035982534904287554687311595628638823537875937519577818577805\"\n    \"32171226806613001927876611195909216420198938095257201065485863278865936153381827\"\n    \"96823030195203530185296899577362259941389124972177528347913151557485724245415069\"\n    \"59508295331168617278558890750983817546374649393192550604009277016711390098488240\"\n    \"12858361603563707660104710181942955596198946767837449448255379774726847104047534\"\n    \"64620804668425906949129331367702898915210475216205696602405803815019351125338243\"\n    \"00355876402474964732639141992726042699227967823547816360093417216412199245863150\"\n    \"30286182974555706749838505494588586926995690927210797509302955321165344987202755\"\n    \"96023648066549911988183479775356636980742654252786255181841757467289097777279380\"\n    \"00816470600161452491921732172147723501414419735685481613611573525521334757418494\"\n    \"68438523323907394143334547762416862518983569485562099219222184272550254256887671\"\n    \"79049460165346680498862723279178608578438382796797668145410095388378636095068006\"\n    \"42251252051173929848960841284886269456042419652850222106611863067442786220391949\"\n    \"45047123713786960956364371917287467764657573962413890865832645995813390478027590\"\n    \"09946576407895126946839835259570982582262052248940772671947826848260147699090264\"\n    \"01363944374553050682034962524517493996514314298091906592509372216964615157098583\"\n    \"87410597885959772975498930161753928468138268683868942774155991855925245953959431\"\n    \"04997252468084598727364469584865383673622262609912460805124388439045124413654976\"\n    \"27807977156914359977001296160894416948685558484063534220722258284886481584560285\"\n    \"06016842739452267467678895252138522549954666727823986456596116354886230577456498\"\n    \"03559363456817432411251507606947945109659609402522887971089314566913686722874894\"\n    \"05601015033086179286809208747609178249385890097149096759852613655497818931297848\"\n    \"21682998948722658804857564014270477555132379641451523746234364542858444795265867\"\n    \"82105114135473573952311342716610213596953623144295248493718711014576540359027993\"\n    \"44037420073105785390621983874478084784896833214457138687519435064302184531910484\"\n    \"81005370614680674919278191197939952061419663428754440643745123718192179998391015\"\n    \"91956181467514269123974894090718649423196\";\nstatic const char* e =\n    \"2.718281828459045235360287471352662497757247093699959574966967627724076630353547\"\n    \"59457138217852516642742746639193200305992181741359662904357290033429526059563073\"\n    \"81323286279434907632338298807531952510190115738341879307021540891499348841675092\"\n    \"44761460668082264800168477411853742345442437107539077744992069551702761838606261\"\n    \"33138458300075204493382656029760673711320070932870912744374704723069697720931014\"\n    \"16928368190255151086574637721112523897844250569536967707854499699679468644549059\"\n    \"87931636889230098793127736178215424999229576351482208269895193668033182528869398\"\n    \"49646510582093923982948879332036250944311730123819706841614039701983767932068328\"\n    \"23764648042953118023287825098194558153017567173613320698112509961818815930416903\"\n    \"51598888519345807273866738589422879228499892086805825749279610484198444363463244\"\n    \"96848756023362482704197862320900216099023530436994184914631409343173814364054625\"\n    \"31520961836908887070167683964243781405927145635490613031072085103837505101157477\"\n    \"04171898610687396965521267154688957035035402123407849819334321068170121005627880\"\n    \"23519303322474501585390473041995777709350366041699732972508868769664035557071622\"\n    \"68447162560798826517871341951246652010305921236677194325278675398558944896970964\"\n    \"09754591856956380236370162112047742722836489613422516445078182442352948636372141\"\n    \"74023889344124796357437026375529444833799801612549227850925778256209262264832627\"\n    \"79333865664816277251640191059004916449982893150566047258027786318641551956532442\"\n    \"58698294695930801915298721172556347546396447910145904090586298496791287406870504\"\n    \"89585867174798546677575732056812884592054133405392200011378630094556068816674001\"\n    \"69842055804033637953764520304024322566135278369511778838638744396625322498506549\"\n    \"95886234281899707733276171783928034946501434558897071942586398772754710962953741\"\n    \"52111513683506275260232648472870392076431005958411661205452970302364725492966693\"\n    \"81151373227536450988890313602057248176585118063036442812314965507047510254465011\"\n    \"72721155519486685080036853228183152196003735625279449515828418829478761085263981\"\n    \"39559900673764829224437528718462457803619298197139914756448826260390338144182326\"\n    \"25150974827987779964373089970388867782271383605772978824125611907176639465070633\"\n    \"04527954661855096666185664709711344474016070462621568071748187784437143698821855\"\n    \"96709591025968620023537185887485696522000503117343920732113908032936344797273559\"\n    \"55277349071783793421637012050054513263835440001863239914907054797780566978533580\"\n    \"48966906295119432473099587655236812859041383241160722602998330535370876138939639\"\n    \"17795745401613722361878936526053815584158718692553860616477983402543512843961294\"\n    \"60352913325942794904337299085731580290958631382683291477116396337092400316894586\"\n    \"36060645845925126994655724839186564209752685082307544254599376917041977780085362\"\n    \"73094171016343490769642372229435236612557250881477922315197477806056967253801718\"\n    \"07763603462459278778465850656050780844211529697521890874019660906651803516501792\"\n    \"50461950136658543663271254963990854914420001457476081930221206602433009641270489\"\n    \"43903971771951806990869986066365832322787\";\n\ntemplate <class T>\ninline bool is_mpfr(const T&)\n{\n   return false;\n}\n#if defined(TEST_MPFR_50)\ntemplate <unsigned N, boost::multiprecision::expression_template_option ET>\ninline bool is_mpfr(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<N>, ET>&)\n{\n   return true;\n}\n#endif\n\ntemplate <class T>\nvoid test()\n{\n   typedef typename T::backend_type backend_type;\n   T                                num, expect;\n   num.backend() = boost::multiprecision::default_ops::get_constant_pi<backend_type>();\n   expect        = static_cast<T>(pi);\n   BOOST_CHECK_CLOSE_FRACTION(num, expect, std::numeric_limits<T>::epsilon() * (is_mpfr(num) ? 1200 : 2));\n   num.backend() = boost::multiprecision::default_ops::get_constant_ln2<backend_type>();\n   expect        = static_cast<T>(ln2);\n   BOOST_CHECK_CLOSE_FRACTION(num, expect, std::numeric_limits<T>::epsilon() * (is_mpfr(num) ? 30 : 1));\n   num.backend() = boost::multiprecision::default_ops::get_constant_e<backend_type>();\n   expect        = static_cast<T>(e);\n   BOOST_CHECK_CLOSE_FRACTION(num, expect, std::numeric_limits<T>::epsilon() * (is_mpfr(num) ? 2 : 1));\n}\n\nint main()\n{\n#ifdef TEST_MPFR_50\n   test<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<2000> > >();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<2000> > >();\n#endif\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::number<boost::multiprecision::gmp_float<2000> > >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_constexpr.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#if defined(HAVE_FLOAT128)\n#include <boost/multiprecision/float128.hpp>\n#endif\n\ntemplate <class T>\nvoid silence_unused(const T&) {}\n\ntemplate <class T>\nvoid test1()\n{\n   constexpr T i1 = 2u;\n   constexpr T i2;\n   constexpr T i3 = -3;\n   constexpr T i4(i1);\n\n   silence_unused(i1);\n   silence_unused(i2);\n   silence_unused(i3);\n   silence_unused(i4);\n}\ntemplate <class T>\nvoid test2()\n{\n   constexpr T i1 = 2u;\n   constexpr T i2;\n   constexpr T i3 = -3;\n\n   silence_unused(i1);\n   silence_unused(i2);\n   silence_unused(i3);\n}\ntemplate <class T>\nvoid test3()\n{\n   constexpr T i1 = 2u;\n   constexpr T i2;\n\n   silence_unused(i1);\n   silence_unused(i2);\n}\n\nusing namespace boost::multiprecision;\n\ntemplate void test1<number<cpp_int_backend<64, 64, unsigned_magnitude, unchecked, void>, et_off> >();\ntemplate void test1<number<cpp_int_backend<64, 64, signed_magnitude, unchecked, void>, et_off> >();\ntemplate void test3<number<cpp_int_backend<2048, 2048, unsigned_magnitude, unchecked, void>, et_off> >();\ntemplate void test2<number<cpp_int_backend<2048, 2048, signed_magnitude, unchecked, void>, et_off> >();\n\n#if defined(HAVE_FLOAT128)\ntemplate void test1<float128>();\n#endif\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_convert_cpp_int_2_float.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// Simple test that cpp_int -> double conversion has less than 0.5ulp error\n// and rounds to even in case of ties.\n// See https://github.com/boostorg/multiprecision/issues/360.\n//\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include \"test.hpp\"\n\nusing namespace boost::multiprecision;\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\ntemplate <class T>\nT generate_random(unsigned bits_wanted)\n{\n   static boost::random::mt19937               gen;\n   typedef boost::random::mt19937::result_type random_type;\n\n   T        max_val;\n   unsigned digits;\n   if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits))\n   {\n      max_val = (std::numeric_limits<T>::max)();\n      digits  = std::numeric_limits<T>::digits;\n   }\n   else\n   {\n      max_val = T(1) << bits_wanted;\n      digits  = bits_wanted;\n   }\n\n   unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n   while ((random_type(1) << bits_per_r_val) > (gen.max)())\n      --bits_per_r_val;\n\n   unsigned terms_needed = digits / bits_per_r_val + 1;\n\n   T val = 0;\n   for (unsigned i = 0; i < terms_needed; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   val %= max_val;\n   return val;\n}\n\ntemplate <class From, class To>\nvoid test_convert()\n{\n   boost::random::mt19937 gen;\n   boost::random::uniform_int_distribution<> d(20, (std::min)(200, std::numeric_limits<To>::max_exponent - 2));\n\n   for (unsigned i = 0; i < 10000; ++i)\n   {\n      int  bits = d(gen);\n      From from = generate_random<From>(bits);\n      To   t1(from);\n      From b(t1);\n      std::size_t m = msb(from);\n      if (m >= std::numeric_limits<To>::digits)\n      {\n         // For error <= 1ulp\n         // Note msb(from) returns one less than the number of bits in from:\n         From max_error = (From(1) << (m - std::numeric_limits<To>::digits));\n         BOOST_TEST_GE(max_error, abs(b - from));\n         if (max_error < abs(b - from))\n            // debugging help:\n            std::cout << from << std::endl\n                      << b << std::endl\n                      << abs(b - from) << std::endl;\n         if (max_error == abs(b - from))\n         {\n            // Check we rounded to even in case of tie:\n            BOOST_TEST_GT(lsb(b), (1 + msb(from) - std::numeric_limits<To>::digits));\n            if (lsb(b) <= (1 + msb(from) - std::numeric_limits<To>::digits))\n            {\n               // debugging help:\n               std::cout << from << std::endl\n                         << b << std::endl\n                         << abs(b - from) << std::endl;\n            }\n         }\n      }\n      else\n      {\n         BOOST_TEST_EQ(b, from);\n      }\n   }\n}\n\nint main()\n{\n   test_convert<cpp_int, float>();\n   test_convert<cpp_int, double>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_convert_from_cpp_bin_float.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include \"test.hpp\"\n\n#if defined(HAS_GMP)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(HAS_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(HAS_MPFI)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef HAS_TOMMATH\n#include <boost/multiprecision/tommath.hpp>\n#endif\n#ifdef HAS_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\ntemplate <class T>\nT generate_random()\n{\n   //\n   // Our aim is to fill up the mantissa of T with random bits,\n   // the main loop simply multiplies by the largest random value\n   // we produce and then adds the next random value.  It stops\n   // when the next random value is too small to change the result,\n   // and so \"val\" and \"prev_val\" end up with the same value.\n   //\n   // We start with an arbitrary value in \"prev_val\" - anything you\n   // like as long as it's a value that our generator can not produce.\n   //\n   // At the end we ditch the current exponent, and replace with our own\n   // randomly generated one.\n   //\n   typedef int                   e_type;\n   static boost::random::mt19937 gen;\n   T                             val      = gen();\n   T                             prev_val = -1;\n   while (val != prev_val)\n   {\n      val *= (gen.max)();\n      prev_val = val;\n      val += gen();\n   }\n   e_type e;\n   val = frexp(val, &e);\n\n   static boost::random::uniform_int_distribution<e_type> ui(-20, 20);\n   return ldexp(val, ui(gen));\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_int(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(From(trunc(from)), From(t3));\n   BOOST_CHECK_EQUAL(From(trunc(from)), From(t4));\n}\ntemplate <class From, class To>\nvoid test_convert_neg_int(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_floating_point> const&, std::integral_constant<int, number_kind_integer> const&)\n{\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>();\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(From(trunc(from)), From(t1));\n      BOOST_CHECK_EQUAL(From(trunc(from)), From(t2));\n      test_convert_neg_int<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_rat(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(From(t3), from);\n   BOOST_CHECK_EQUAL(From(t4), from);\n}\ntemplate <class From, class To>\nvoid test_convert_rat_int(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_floating_point> const&, std::integral_constant<int, number_kind_rational> const&)\n{\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>();\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(From(t1), from);\n      BOOST_CHECK_EQUAL(From(t2), from);\n      test_convert_neg_rat<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_float(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   To answer(from.str());\n   To tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2;\n   BOOST_CHECK_CLOSE_FRACTION(t3, answer, tol);\n   BOOST_CHECK_CLOSE_FRACTION(t4, answer, tol);\n}\ntemplate <class From, class To>\nvoid test_convert_neg_float(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_floating_point> const&, std::integral_constant<int, number_kind_floating_point> const&)\n{\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>();\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      To   answer(from.str());\n      To   tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2;\n      BOOST_CHECK_CLOSE_FRACTION(t1, answer, tol);\n      BOOST_CHECK_CLOSE_FRACTION(t2, answer, tol);\n      test_convert_neg_float<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert()\n{\n   test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type());\n}\n\nint main()\n{\n   test_convert<cpp_bin_float_50, cpp_int>();\n   test_convert<cpp_bin_float_50, int128_t>();\n   test_convert<cpp_bin_float_50, uint128_t>();\n   test_convert<cpp_bin_float_quad, checked_int1024_t>();\n   test_convert<cpp_bin_float_quad, checked_uint1024_t>();\n\n   test_convert<cpp_bin_float_50, cpp_rational>();\n\n   test_convert<cpp_bin_float_50, cpp_dec_float_50>();\n\n#if defined(HAS_GMP)\n   test_convert<cpp_bin_float_50, mpz_int>();\n   test_convert<cpp_bin_float_50, mpq_rational>();\n   test_convert<cpp_bin_float_50, mpf_float_50>();\n#endif\n#if defined(HAS_MPFR)\n   test_convert<cpp_bin_float_50, mpfr_float_50>();\n#endif\n#if defined(HAS_MPFI)\n   test_convert<cpp_bin_float_50, mpfi_float_50>();\n#endif\n#ifdef HAS_TOMMATH\n   test_convert<cpp_bin_float_50, tom_int>();\n   test_convert<cpp_bin_float_50, tom_rational>();\n#endif\n#ifdef HAS_FLOAT128\n   test_convert<cpp_bin_float_50, float128>();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_convert_from_cpp_dec_float.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include \"test.hpp\"\n\n#if defined(HAS_GMP)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(HAS_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(HAS_MPFI)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef HAS_TOMMATH\n#include <boost/multiprecision/tommath.hpp>\n#endif\n#ifdef HAS_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\ntemplate <class T>\nT generate_random()\n{\n   typedef int                   e_type;\n   static boost::random::mt19937 gen;\n   T                             val      = gen();\n   T                             prev_val = -1;\n   while (val != prev_val)\n   {\n      val *= (gen.max)();\n      prev_val = val;\n      val += gen();\n   }\n   e_type e;\n   val = frexp(val, &e);\n\n   static boost::random::uniform_int_distribution<e_type> ui(-20, 20);\n   return ldexp(val, ui(gen));\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_int(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(From(trunc(from)), From(t3));\n   BOOST_CHECK_EQUAL(From(trunc(from)), From(t4));\n}\ntemplate <class From, class To>\nvoid test_convert_neg_int(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_floating_point> const&, std::integral_constant<int, number_kind_integer> const&)\n{\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>();\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(From(trunc(from)), From(t1));\n      BOOST_CHECK_EQUAL(From(trunc(from)), From(t2));\n      test_convert_neg_int<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_rat(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To   t3(from);\n   To   t4  = from.template convert_to<To>();\n   From tol = std::numeric_limits<From>::epsilon();\n   BOOST_CHECK_CLOSE_FRACTION(From(t3), from, tol);\n   BOOST_CHECK_CLOSE_FRACTION(From(t4), from, tol);\n}\ntemplate <class From, class To>\nvoid test_convert_rat_int(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_floating_point> const&, std::integral_constant<int, number_kind_rational> const&)\n{\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>();\n      To   t1(from);\n      To   t2  = from.template convert_to<To>();\n      From tol = std::numeric_limits<From>::epsilon();\n      BOOST_CHECK_CLOSE_FRACTION(From(t1), from, tol);\n      BOOST_CHECK_CLOSE_FRACTION(From(t2), from, tol);\n      test_convert_neg_rat<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_float(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   To answer(from.str());\n   To tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2;\n   BOOST_CHECK_CLOSE_FRACTION(t3, answer, tol);\n   BOOST_CHECK_CLOSE_FRACTION(t4, answer, tol);\n}\ntemplate <class From, class To>\nvoid test_convert_neg_float(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_floating_point> const&, std::integral_constant<int, number_kind_floating_point> const&)\n{\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>();\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      To   answer(from.str());\n      To   tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2;\n      BOOST_CHECK_CLOSE_FRACTION(t1, answer, tol);\n      BOOST_CHECK_CLOSE_FRACTION(t2, answer, tol);\n      test_convert_neg_float<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert()\n{\n   test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type());\n}\n\nint main()\n{\n   test_convert<cpp_dec_float_50, cpp_int>();\n   test_convert<cpp_dec_float_50, int128_t>();\n   test_convert<cpp_dec_float_50, uint128_t>();\n\n   test_convert<cpp_dec_float_50, cpp_rational>();\n\n   test_convert<cpp_dec_float_50, cpp_bin_float_50>();\n\n#if defined(HAS_GMP)\n   test_convert<cpp_dec_float_50, mpz_int>();\n   test_convert<cpp_dec_float_50, mpq_rational>();\n   test_convert<cpp_dec_float_50, mpf_float_50>();\n#endif\n#if defined(HAS_MPFR)\n   test_convert<cpp_dec_float_50, mpfr_float_50>();\n#endif\n#if defined(HAS_MPFI)\n   test_convert<cpp_dec_float_50, mpfi_float_50>();\n#endif\n#ifdef HAS_TOMMATH\n   test_convert<cpp_dec_float_50, tom_int>();\n   test_convert<cpp_dec_float_50, tom_rational>();\n#endif\n#ifdef HAS_FLOAT128\n   test_convert<cpp_dec_float_50, float128>();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_convert_from_cpp_int.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include \"test.hpp\"\n\n#if defined(HAS_GMP)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(HAS_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(HAS_MPFI)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef HAS_TOMMATH\n#include <boost/multiprecision/tommath.hpp>\n#endif\n#ifdef HAS_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\ntemplate <class T>\nT generate_random(unsigned bits_wanted)\n{\n   static boost::random::mt19937               gen;\n   typedef boost::random::mt19937::result_type random_type;\n\n   T        max_val;\n   unsigned digits;\n   if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits))\n   {\n      max_val = (std::numeric_limits<T>::max)();\n      digits  = std::numeric_limits<T>::digits;\n   }\n   else\n   {\n      max_val = T(1) << bits_wanted;\n      digits  = bits_wanted;\n   }\n\n   unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n   while ((random_type(1) << bits_per_r_val) > (gen.max)())\n      --bits_per_r_val;\n\n   unsigned terms_needed = digits / bits_per_r_val + 1;\n\n   T val = 0;\n   for (unsigned i = 0; i < terms_needed; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   val %= max_val;\n   return val;\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_int(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(from.str(), t3.str());\n   BOOST_CHECK_EQUAL(from.str(), t4.str());\n}\ntemplate <class From, class To>\nvoid test_convert_neg_int(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_integer> const&, std::integral_constant<int, number_kind_integer> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>(bits_wanted);\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(from.str(), t1.str());\n      BOOST_CHECK_EQUAL(from.str(), t2.str());\n      test_convert_neg_int<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_rat(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(from.str(), numerator(t3).str());\n   BOOST_CHECK_EQUAL(from.str(), numerator(t4).str());\n}\ntemplate <class From, class To>\nvoid test_convert_neg_rat(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_integer> const&, std::integral_constant<int, number_kind_rational> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>(bits_wanted);\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(from.str(), numerator(t1).str());\n      BOOST_CHECK_EQUAL(from.str(), numerator(t2).str());\n      test_convert_neg_rat<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_float(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   To check(from.str() + \".0\");\n   BOOST_CHECK_EQUAL(t3, check);\n   BOOST_CHECK_EQUAL(t4, check);\n}\ntemplate <class From, class To>\nvoid test_convert_neg_float(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_integer> const&, std::integral_constant<int, number_kind_floating_point> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>(bits_wanted);\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      To   check(from.str() + \".0\");\n      BOOST_CHECK_EQUAL(t1, check);\n      BOOST_CHECK_EQUAL(t2, check);\n      test_convert_neg_float<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert()\n{\n   test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type());\n}\n\nint main()\n{\n   test_convert<cpp_int, int128_t>();\n   test_convert<int128_t, cpp_int>();\n\n   test_convert<cpp_int, cpp_rational>();\n   test_convert<int128_t, cpp_rational>();\n   test_convert<uint128_t, cpp_rational>();\n\n   test_convert<cpp_int, cpp_bin_float_50>();\n   test_convert<int128_t, cpp_bin_float_50>();\n   test_convert<uint128_t, cpp_bin_float_50>();\n\n   test_convert<cpp_int, cpp_dec_float_50>();\n   test_convert<int128_t, cpp_dec_float_50>();\n   test_convert<uint128_t, cpp_dec_float_50>();\n\n#if defined(HAS_GMP)\n   test_convert<cpp_int, mpz_int>();\n   test_convert<int128_t, mpz_int>();\n   test_convert<uint128_t, mpz_int>();\n\n   test_convert<cpp_int, mpq_rational>();\n   test_convert<int128_t, mpq_rational>();\n   test_convert<uint128_t, mpq_rational>();\n\n   test_convert<cpp_int, mpf_float_50>();\n   test_convert<int128_t, mpf_float_50>();\n   test_convert<uint128_t, mpf_float_50>();\n#endif\n#if defined(HAS_MPFR)\n   test_convert<cpp_int, mpfr_float_50>();\n   test_convert<int128_t, mpfr_float_50>();\n   test_convert<uint128_t, mpfr_float_50>();\n#endif\n#if defined(HAS_MPFI)\n   test_convert<cpp_int, mpfi_float_50>();\n   test_convert<int128_t, mpfi_float_50>();\n   test_convert<uint128_t, mpfi_float_50>();\n#endif\n#ifdef HAS_TOMMATH\n   test_convert<cpp_int, tom_int>();\n   test_convert<int128_t, tom_int>();\n   test_convert<uint128_t, tom_int>();\n\n   test_convert<cpp_int, tom_rational>();\n   test_convert<int128_t, tom_rational>();\n   test_convert<uint128_t, tom_rational>();\n#endif\n#ifdef HAS_FLOAT128\n   test_convert<cpp_int, float128>();\n   test_convert<int128_t, float128>();\n   test_convert<uint128_t, float128>();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_convert_from_cpp_rational.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include \"test.hpp\"\n\n#if defined(HAS_GMP)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(HAS_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(HAS_MPFI)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef HAS_TOMMATH\n#include <boost/multiprecision/tommath.hpp>\n#endif\n#ifdef HAS_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\ntemplate <class T>\nT generate_random_int(unsigned bits_wanted)\n{\n   static boost::random::mt19937               gen;\n   typedef boost::random::mt19937::result_type random_type;\n\n   T        max_val;\n   unsigned digits;\n   if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits))\n   {\n      max_val = (std::numeric_limits<T>::max)();\n      digits  = std::numeric_limits<T>::digits;\n   }\n   else\n   {\n      max_val = T(1) << bits_wanted;\n      digits  = bits_wanted;\n   }\n\n   unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n   while ((random_type(1) << bits_per_r_val) > (gen.max)())\n      --bits_per_r_val;\n\n   unsigned terms_needed = digits / bits_per_r_val + 1;\n\n   T val = 0;\n   for (unsigned i = 0; i < terms_needed; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   val %= max_val;\n   return val;\n}\n\ntemplate <class T>\nT generate_random(unsigned bits_wanted)\n{\n   typedef typename component_type<T>::type int_type;\n   T                                        val(generate_random_int<int_type>(bits_wanted), generate_random_int<int_type>(bits_wanted));\n   return val;\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_val(From from, const std::integral_constant<bool, true>&)\n{\n   from                                       = -from;\n   typename component_type<From>::type answer = numerator(from) / denominator(from);\n   To                                  t3(from);\n   To                                  t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(answer.str(), t3.str());\n   BOOST_CHECK_EQUAL(answer.str(), t4.str());\n}\ntemplate <class From, class To>\nvoid test_convert_neg_val(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_rational> const&, std::integral_constant<int, number_kind_integer> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From                                from   = generate_random<From>(bits_wanted);\n      typename component_type<From>::type answer = numerator(from) / denominator(from);\n      To                                  t1(from);\n      To                                  t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(answer.str(), t1.str());\n      BOOST_CHECK_EQUAL(answer.str(), t2.str());\n      test_convert_neg_val<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_float_val(From from, To const& tol, const std::integral_constant<bool, true>&)\n{\n   from      = -from;\n   To answer = To(numerator(from)) / To(denominator(from));\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_CLOSE_FRACTION(answer, t3, tol);\n   BOOST_CHECK_CLOSE_FRACTION(answer, t4, tol);\n}\ntemplate <class From, class To>\nvoid test_convert_neg_float_val(From const&, To const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_rational> const&, std::integral_constant<int, number_kind_floating_point> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from   = generate_random<From>(bits_wanted);\n      To   answer = To(numerator(from)) / To(denominator(from));\n      To   t1(from);\n      To   t2  = from.template convert_to<To>();\n      To   tol = std::numeric_limits<To>::is_specialized ? std::numeric_limits<To>::epsilon() : ldexp(To(1), 1 - bits_wanted);\n      tol *= 2;\n      BOOST_CHECK_CLOSE_FRACTION(answer, t1, tol);\n      BOOST_CHECK_CLOSE_FRACTION(answer, t2, tol);\n      test_convert_neg_float_val<From, To>(from, tol, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_rat_val(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(from.str(), t3.str());\n   BOOST_CHECK_EQUAL(from.str(), t4.str());\n}\ntemplate <class From, class To>\nvoid test_convert_neg_rat_val(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_rational> const&, std::integral_constant<int, number_kind_rational> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>(bits_wanted);\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(from.str(), t1.str());\n      BOOST_CHECK_EQUAL(from.str(), t2.str());\n      test_convert_neg_rat_val<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert()\n{\n   test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type());\n}\n\nint main()\n{\n   test_convert<cpp_rational, cpp_int>();\n   test_convert<cpp_rational, int128_t>();\n   test_convert<cpp_rational, uint128_t>();\n\n   test_convert<cpp_rational, cpp_bin_float_50>();\n\n   test_convert<cpp_rational, cpp_dec_float_50>();\n\n#if defined(HAS_GMP)\n   test_convert<cpp_rational, mpz_int>();\n   test_convert<cpp_rational, mpq_rational>();\n   test_convert<cpp_rational, mpf_float_50>();\n#endif\n#if defined(HAS_MPFR)\n   test_convert<cpp_rational, mpfr_float_50>();\n#endif\n#if defined(HAS_MPFI)\n   test_convert<cpp_rational, mpfi_float_50>();\n#endif\n#ifdef HAS_TOMMATH\n   test_convert<cpp_rational, tom_int>();\n   test_convert<cpp_rational, tom_rational>();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_convert_from_float128.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#ifdef HAS_FLOAT128\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include \"test.hpp\"\n\n#if defined(HAS_GMP)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(HAS_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(HAS_MPFI)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef HAS_TOMMATH\n#include <boost/multiprecision/tommath.hpp>\n#endif\n#ifdef HAS_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\ntemplate <class T>\nT generate_random()\n{\n   typedef int                   e_type;\n   static boost::random::mt19937 gen;\n   T                             val      = gen();\n   T                             prev_val = -1;\n   while (val != prev_val)\n   {\n      val *= (gen.max)();\n      prev_val = val;\n      val += gen();\n   }\n   e_type e;\n   val = frexp(val, &e);\n\n   static boost::random::uniform_int_distribution<e_type> ui(-20, 20);\n   return ldexp(val, ui(gen));\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_int(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(From(trunc(from)), From(t3));\n   BOOST_CHECK_EQUAL(From(trunc(from)), From(t4));\n}\ntemplate <class From, class To>\nvoid test_convert_neg_int(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_floating_point> const&, std::integral_constant<int, number_kind_integer> const&)\n{\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>();\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(From(trunc(from)), From(t1));\n      BOOST_CHECK_EQUAL(From(trunc(from)), From(t2));\n      test_convert_neg_int<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_rat(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(From(t3), from);\n   BOOST_CHECK_EQUAL(From(t4), from);\n}\ntemplate <class From, class To>\nvoid test_convert_rat_int(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_floating_point> const&, std::integral_constant<int, number_kind_rational> const&)\n{\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>();\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(From(t1), from);\n      BOOST_CHECK_EQUAL(From(t2), from);\n      test_convert_neg_rat<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_float(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   To answer(from.str());\n   To tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2;\n   BOOST_CHECK_CLOSE_FRACTION(t3, answer, tol);\n   BOOST_CHECK_CLOSE_FRACTION(t4, answer, tol);\n}\ntemplate <class From, class To>\nvoid test_convert_neg_float(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_floating_point> const&, std::integral_constant<int, number_kind_floating_point> const&)\n{\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>();\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      To   answer(from.str());\n      To   tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2;\n      BOOST_CHECK_CLOSE_FRACTION(t1, answer, tol);\n      BOOST_CHECK_CLOSE_FRACTION(t2, answer, tol);\n      test_convert_neg_float<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert()\n{\n   test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type());\n}\n\nint main()\n{\n   //\n   // Some basic sanity checks first:\n   //\n   BOOST_CHECK_EQUAL(std::numeric_limits<float128>::epsilon(), float128(\"1.92592994438723585305597794258492732e-34\"));\n   BOOST_CHECK_EQUAL((std::numeric_limits<float128>::min)(), float128(\"3.36210314311209350626267781732175260e-4932\"));\n   BOOST_CHECK_EQUAL((std::numeric_limits<float128>::max)(), float128(\"1.18973149535723176508575932662800702e4932\"));\n   BOOST_CHECK_EQUAL((std::numeric_limits<float128>::denorm_min)(), float128(\"6.475175119438025110924438958227646552e-4966\"));\n   BOOST_CHECK((boost::math::isinf)((std::numeric_limits<float128>::infinity)()));\n   BOOST_CHECK((std::numeric_limits<float128>::infinity)() > 0);\n   BOOST_CHECK((boost::math::isnan)((std::numeric_limits<float128>::quiet_NaN)()));\n\n   test_convert<float128, cpp_int>();\n   test_convert<float128, int128_t>();\n   test_convert<float128, uint128_t>();\n\n   test_convert<float128, cpp_rational>();\n\n   test_convert<float128, cpp_dec_float_50>();\n\n#if defined(HAS_GMP)\n   test_convert<float128, mpz_int>();\n   test_convert<float128, mpq_rational>();\n   test_convert<float128, mpf_float_50>();\n#endif\n#if defined(HAS_MPFR)\n   test_convert<float128, mpfr_float_50>();\n#endif\n#if defined(HAS_MPFI)\n   test_convert<float128, mpfi_float_50>();\n#endif\n#ifdef HAS_TOMMATH\n   test_convert<float128, tom_int>();\n   test_convert<float128, tom_rational>();\n#endif\n   return boost::report_errors();\n}\n\n#else\n\nint main() { return 0; }\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_convert_from_gmp_rational.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#if defined(HAS_GMP)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include \"test.hpp\"\n#include <boost/multiprecision/gmp.hpp>\n\n#if defined(HAS_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(HAS_MPFI)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef HAS_TOMMATH\n#include <boost/multiprecision/tommath.hpp>\n#endif\n#ifdef HAS_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\ntemplate <class T>\nT generate_random_int(unsigned bits_wanted)\n{\n   static boost::random::mt19937               gen;\n   typedef boost::random::mt19937::result_type random_type;\n\n   T        max_val;\n   unsigned digits;\n   if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits))\n   {\n      max_val = (std::numeric_limits<T>::max)();\n      digits  = std::numeric_limits<T>::digits;\n   }\n   else\n   {\n      max_val = T(1) << bits_wanted;\n      digits  = bits_wanted;\n   }\n\n   unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n   while ((random_type(1) << bits_per_r_val) > (gen.max)())\n      --bits_per_r_val;\n\n   unsigned terms_needed = digits / bits_per_r_val + 1;\n\n   T val = 0;\n   for (unsigned i = 0; i < terms_needed; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   val %= max_val;\n   return val;\n}\n\ntemplate <class T>\nT generate_random(unsigned bits_wanted)\n{\n   typedef typename component_type<T>::type int_type;\n   T                                        val(generate_random_int<int_type>(bits_wanted), generate_random_int<int_type>(bits_wanted));\n   return val;\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_val(From from, const std::integral_constant<bool, true>&)\n{\n   from                                       = -from;\n   typename component_type<From>::type answer = numerator(from) / denominator(from);\n   To                                  t3(from);\n   To                                  t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(answer.str(), t3.str());\n   BOOST_CHECK_EQUAL(answer.str(), t4.str());\n}\ntemplate <class From, class To>\nvoid test_convert_neg_val(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_rational> const&, std::integral_constant<int, number_kind_integer> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From                                from   = generate_random<From>(bits_wanted);\n      typename component_type<From>::type answer = numerator(from) / denominator(from);\n      To                                  t1(from);\n      To                                  t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(answer.str(), t1.str());\n      BOOST_CHECK_EQUAL(answer.str(), t2.str());\n      test_convert_neg_val<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_float_val(From from, To const& tol, const std::integral_constant<bool, true>&)\n{\n   from      = -from;\n   To answer = To(numerator(from)) / To(denominator(from));\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_CLOSE_FRACTION(answer, t3, tol);\n   BOOST_CHECK_CLOSE_FRACTION(answer, t4, tol);\n}\ntemplate <class From, class To>\nvoid test_convert_neg_float_val(From const&, To const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_rational> const&, std::integral_constant<int, number_kind_floating_point> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from   = generate_random<From>(bits_wanted);\n      To   answer = To(numerator(from)) / To(denominator(from));\n      To   t1(from);\n      To   t2  = from.template convert_to<To>();\n      To   tol = std::numeric_limits<To>::is_specialized ? std::numeric_limits<To>::epsilon() : ldexp(To(1), 1 - bits_wanted);\n      tol *= 2;\n      BOOST_CHECK_CLOSE_FRACTION(answer, t1, tol);\n      BOOST_CHECK_CLOSE_FRACTION(answer, t2, tol);\n      test_convert_neg_float_val<From, To>(from, tol, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_rat_val(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(from.str(), t3.str());\n   BOOST_CHECK_EQUAL(from.str(), t4.str());\n}\ntemplate <class From, class To>\nvoid test_convert_neg_rat_val(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_rational> const&, std::integral_constant<int, number_kind_rational> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>(bits_wanted);\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(from.str(), t1.str());\n      BOOST_CHECK_EQUAL(from.str(), t2.str());\n      test_convert_neg_rat_val<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert()\n{\n   test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type());\n}\n\nint main()\n{\n   test_convert<mpq_rational, cpp_int>();\n   test_convert<mpq_rational, int128_t>();\n   test_convert<mpq_rational, uint128_t>();\n   test_convert<mpq_rational, cpp_rational>();\n\n   test_convert<mpq_rational, cpp_bin_float_50>();\n\n   test_convert<mpq_rational, cpp_dec_float_50>();\n\n   test_convert<mpq_rational, mpz_int>();\n   test_convert<mpq_rational, mpf_float_50>();\n#if defined(HAS_MPFR)\n   test_convert<mpq_rational, mpfr_float_50>();\n#endif\n#if defined(HAS_MPFI)\n   test_convert<mpq_rational, mpfi_float_50>();\n#endif\n#ifdef HAS_TOMMATH\n   test_convert<mpq_rational, tom_int>();\n   test_convert<mpq_rational, tom_rational>();\n#endif\n   return boost::report_errors();\n}\n\n#else\n\nint main() { return 0; }\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_convert_from_mpf_float.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#if defined(HAS_GMP)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include \"test.hpp\"\n\n#if defined(HAS_GMP)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(HAS_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(HAS_MPFI)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef HAS_TOMMATH\n#include <boost/multiprecision/tommath.hpp>\n#endif\n#ifdef HAS_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\ntemplate <class T>\nT generate_random()\n{\n   typedef int                   e_type;\n   static boost::random::mt19937 gen;\n   T                             val      = gen();\n   T                             prev_val = -1;\n   while (val != prev_val)\n   {\n      val *= (gen.max)();\n      prev_val = val;\n      val += gen();\n   }\n   e_type e;\n   val = frexp(val, &e);\n\n   static boost::random::uniform_int_distribution<e_type> ui(-20, 20);\n   return ldexp(val, ui(gen));\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_int(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(From(trunc(from)), From(t3));\n   BOOST_CHECK_EQUAL(From(trunc(from)), From(t4));\n}\ntemplate <class From, class To>\nvoid test_convert_neg_int(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_floating_point> const&, std::integral_constant<int, number_kind_integer> const&)\n{\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>();\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(From(trunc(from)), From(t1));\n      BOOST_CHECK_EQUAL(From(trunc(from)), From(t2));\n      test_convert_neg_int<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_rat(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To   t3(from);\n   To   t4  = from.template convert_to<To>();\n   From tol = std::numeric_limits<From>::epsilon();\n   BOOST_CHECK_CLOSE_FRACTION(From(t3), from, tol);\n   BOOST_CHECK_CLOSE_FRACTION(From(t4), from, tol);\n}\ntemplate <class From, class To>\nvoid test_convert_rat_int(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_floating_point> const&, std::integral_constant<int, number_kind_rational> const&)\n{\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>();\n      To   t1(from);\n      To   t2  = from.template convert_to<To>();\n      From tol = std::numeric_limits<From>::epsilon();\n      BOOST_CHECK_CLOSE_FRACTION(From(t1), from, tol);\n      BOOST_CHECK_CLOSE_FRACTION(From(t2), from, tol);\n      test_convert_neg_rat<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_float(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   To answer(from.str());\n   To tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2;\n   BOOST_CHECK_CLOSE_FRACTION(t3, answer, tol);\n   BOOST_CHECK_CLOSE_FRACTION(t4, answer, tol);\n}\ntemplate <class From, class To>\nvoid test_convert_neg_float(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_floating_point> const&, std::integral_constant<int, number_kind_floating_point> const&)\n{\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>();\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      To   answer(from.str());\n      To   tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2;\n      BOOST_CHECK_CLOSE_FRACTION(t1, answer, tol);\n      BOOST_CHECK_CLOSE_FRACTION(t2, answer, tol);\n      test_convert_neg_float<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert()\n{\n   test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type());\n}\n\nint main()\n{\n   test_convert<mpf_float_50, cpp_int>();\n   test_convert<mpf_float_50, int128_t>();\n   test_convert<mpf_float_50, uint128_t>();\n\n   test_convert<mpf_float_50, cpp_rational>();\n\n   test_convert<mpf_float_50, cpp_dec_float_50>();\n\n   test_convert<mpf_float_50, mpz_int>();\n   test_convert<mpf_float_50, mpq_rational>();\n#if defined(HAS_MPFR)\n   test_convert<mpf_float_50, mpfr_float_50>();\n#endif\n#if defined(HAS_MPFI)\n   test_convert<mpf_float_50, mpfi_float_50>();\n#endif\n#ifdef HAS_TOMMATH\n   test_convert<mpf_float_50, tom_int>();\n   test_convert<mpf_float_50, tom_rational>();\n#endif\n#ifdef HAS_FLOAT128\n   test_convert<mpf_float_50, float128>();\n#endif\n   return boost::report_errors();\n}\n\n#else\n\nint main() { return 0; }\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_convert_from_mpfi_float.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#if defined(HAS_MPFI)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include \"test.hpp\"\n\n#if defined(HAS_GMP)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(HAS_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(HAS_MPFI)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef HAS_TOMMATH\n#include <boost/multiprecision/tommath.hpp>\n#endif\n#ifdef HAS_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\ntemplate <class T>\nT generate_random()\n{\n   typedef int                   e_type;\n   static boost::random::mt19937 gen;\n   T                             val           = gen();\n   T                             prev_val      = -1;\n   int                           digits_so_far = 0;\n   while (digits_so_far < std::numeric_limits<T>::digits)\n   {\n      val *= (gen.max)();\n      prev_val = val;\n      val += gen();\n      digits_so_far += std::numeric_limits<boost::random::mt19937::result_type>::digits;\n   }\n   e_type e;\n   val = frexp(val, &e);\n\n   static boost::random::uniform_int_distribution<e_type> ui(-20, 20);\n   return ldexp(val, ui(gen));\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_int(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(From(trunc(from)), From(t3));\n   BOOST_CHECK_EQUAL(From(trunc(from)), From(t4));\n}\ntemplate <class From, class To>\nvoid test_convert_neg_int(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_floating_point> const&, std::integral_constant<int, number_kind_integer> const&)\n{\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>();\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(From(trunc(from)), From(t1));\n      BOOST_CHECK_EQUAL(From(trunc(from)), From(t2));\n      test_convert_neg_int<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_rat(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(From(t3), median(from));\n   BOOST_CHECK_EQUAL(From(t4), median(from));\n}\ntemplate <class From, class To>\nvoid test_convert_rat_int(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_floating_point> const&, std::integral_constant<int, number_kind_rational> const&)\n{\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>();\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(From(t1), median(from));\n      BOOST_CHECK_EQUAL(From(t2), median(from));\n      test_convert_neg_rat<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_float(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   To answer(median(from).str());\n   To tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2;\n   BOOST_CHECK_CLOSE_FRACTION(t3, answer, tol);\n   BOOST_CHECK_CLOSE_FRACTION(t4, answer, tol);\n}\ntemplate <class From, class To>\nvoid test_convert_neg_float(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_floating_point> const&, std::integral_constant<int, number_kind_floating_point> const&)\n{\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>();\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      To   answer(median(from).str());\n      To   tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2;\n      BOOST_CHECK_CLOSE_FRACTION(t1, answer, tol);\n      BOOST_CHECK_CLOSE_FRACTION(t2, answer, tol);\n      test_convert_neg_float<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert()\n{\n   test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type());\n}\n\nint main()\n{\n   try\n   {\n      test_convert<mpfi_float_50, cpp_int>();\n      test_convert<mpfi_float_50, int128_t>();\n      test_convert<mpfi_float_50, uint128_t>();\n\n      test_convert<mpfi_float_50, cpp_rational>();\n\n      test_convert<mpfi_float_50, cpp_dec_float_50>();\n\n#if defined(HAS_GMP)\n      test_convert<mpfi_float_50, mpz_int>();\n      test_convert<mpfi_float_50, mpq_rational>();\n      test_convert<mpfi_float_50, mpf_float_50>();\n#endif\n#if defined(HAS_MPFR)\n      test_convert<mpfi_float_50, mpfr_float_50>();\n#endif\n#ifdef HAS_TOMMATH\n      test_convert<mpfi_float_50, tom_int>();\n      test_convert<mpfi_float_50, tom_rational>();\n#endif\n#ifdef HAS_FLOAT128\n      test_convert<mpfi_float_50, float128>();\n#endif\n   }\n   catch (...)\n   {\n      return 1;\n   }\n   return boost::report_errors();\n}\n\n#else\n\nint main() { return 0; }\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_convert_from_mpfr_float.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#if defined(HAS_MPFR)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include \"test.hpp\"\n\n#if defined(HAS_GMP)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(HAS_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(HAS_MPFI)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef HAS_TOMMATH\n#include <boost/multiprecision/tommath.hpp>\n#endif\n#ifdef HAS_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\ntemplate <class T>\nT generate_random()\n{\n   typedef int                   e_type;\n   static boost::random::mt19937 gen;\n   T                             val      = gen();\n   T                             prev_val = -1;\n   while (val != prev_val)\n   {\n      val *= (gen.max)();\n      prev_val = val;\n      val += gen();\n   }\n   e_type e;\n   val = frexp(val, &e);\n\n   static boost::random::uniform_int_distribution<e_type> ui(-20, 20);\n   return ldexp(val, ui(gen));\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_int(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(From(trunc(from)), From(t3));\n   BOOST_CHECK_EQUAL(From(trunc(from)), From(t4));\n}\ntemplate <class From, class To>\nvoid test_convert_neg_int(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_floating_point> const&, std::integral_constant<int, number_kind_integer> const&)\n{\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>();\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(From(trunc(from)), From(t1));\n      BOOST_CHECK_EQUAL(From(trunc(from)), From(t2));\n      test_convert_neg_int<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_rat(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(From(t3), from);\n   BOOST_CHECK_EQUAL(From(t4), from);\n}\ntemplate <class From, class To>\nvoid test_convert_rat_int(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_floating_point> const&, std::integral_constant<int, number_kind_rational> const&)\n{\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>();\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(From(t1), from);\n      BOOST_CHECK_EQUAL(From(t2), from);\n      test_convert_neg_rat<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_float(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   To answer(from.str());\n   To tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2;\n   BOOST_CHECK_CLOSE_FRACTION(t3, answer, tol);\n   BOOST_CHECK_CLOSE_FRACTION(t4, answer, tol);\n}\ntemplate <class From, class To>\nvoid test_convert_neg_float(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_floating_point> const&, std::integral_constant<int, number_kind_floating_point> const&)\n{\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>();\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      To   answer(from.str());\n      To   tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2;\n      BOOST_CHECK_CLOSE_FRACTION(t1, answer, tol);\n      BOOST_CHECK_CLOSE_FRACTION(t2, answer, tol);\n      test_convert_neg_float<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert()\n{\n   test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type());\n}\n\nint main()\n{\n   test_convert<mpfr_float_50, cpp_int>();\n   test_convert<mpfr_float_50, int128_t>();\n   test_convert<mpfr_float_50, uint128_t>();\n\n   test_convert<mpfr_float_50, cpp_rational>();\n\n   test_convert<mpfr_float_50, cpp_dec_float_50>();\n\n#if defined(HAS_GMP)\n   test_convert<mpfr_float_50, mpz_int>();\n   test_convert<mpfr_float_50, mpq_rational>();\n   test_convert<mpfr_float_50, mpf_float_50>();\n#endif\n#if defined(HAS_MPFI)\n   test_convert<mpfr_float_50, mpfi_float_50>();\n#endif\n#ifdef HAS_TOMMATH\n   test_convert<mpfr_float_50, tom_int>();\n   test_convert<mpfr_float_50, tom_rational>();\n#endif\n#ifdef HAS_FLOAT128\n   test_convert<mpfr_float_50, float128>();\n#endif\n   return boost::report_errors();\n}\n\n#else\n\nint main() { return 0; }\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_convert_from_mpz_int.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#if defined(HAS_GMP)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/multiprecision/gmp.hpp>\n#include \"test.hpp\"\n\n#if defined(HAS_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(HAS_MPFI)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef HAS_TOMMATH\n#include <boost/multiprecision/tommath.hpp>\n#endif\n#ifdef HAS_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\ntemplate <class T>\nT generate_random(unsigned bits_wanted)\n{\n   static boost::random::mt19937               gen;\n   typedef boost::random::mt19937::result_type random_type;\n\n   T        max_val;\n   unsigned digits;\n   if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits))\n   {\n      max_val = (std::numeric_limits<T>::max)();\n      digits  = std::numeric_limits<T>::digits;\n   }\n   else\n   {\n      max_val = T(1) << bits_wanted;\n      digits  = bits_wanted;\n   }\n\n   unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n   while ((random_type(1) << bits_per_r_val) > (gen.max)())\n      --bits_per_r_val;\n\n   unsigned terms_needed = digits / bits_per_r_val + 1;\n\n   T val = 0;\n   for (unsigned i = 0; i < terms_needed; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   val %= max_val;\n   return val;\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_int(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(from.str(), t3.str());\n   BOOST_CHECK_EQUAL(from.str(), t4.str());\n}\ntemplate <class From, class To>\nvoid test_convert_neg_int(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_integer> const&, std::integral_constant<int, number_kind_integer> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>(bits_wanted);\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(from.str(), t1.str());\n      BOOST_CHECK_EQUAL(from.str(), t2.str());\n      test_convert_neg_int<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_rat(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(from.str(), numerator(t3).str());\n   BOOST_CHECK_EQUAL(from.str(), numerator(t4).str());\n}\ntemplate <class From, class To>\nvoid test_convert_neg_rat(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_integer> const&, std::integral_constant<int, number_kind_rational> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>(bits_wanted);\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(from.str(), numerator(t1).str());\n      BOOST_CHECK_EQUAL(from.str(), numerator(t2).str());\n      test_convert_neg_rat<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_float(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   To check(from.str() + \".0\");\n   BOOST_CHECK_EQUAL(t3, check);\n   BOOST_CHECK_EQUAL(t4, check);\n}\ntemplate <class From, class To>\nvoid test_convert_neg_float(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_integer> const&, std::integral_constant<int, number_kind_floating_point> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>(bits_wanted);\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      To   check(from.str() + \".0\");\n      BOOST_CHECK_EQUAL(t1, check);\n      BOOST_CHECK_EQUAL(t2, check);\n      test_convert_neg_float<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert()\n{\n   test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type());\n}\n\nint main()\n{\n\n   test_convert<mpz_int, cpp_int>();\n   test_convert<mpz_int, int128_t>();\n   test_convert<mpz_int, uint128_t>();\n   test_convert<mpz_int, cpp_rational>();\n\n   test_convert<mpz_int, cpp_dec_float_50>();\n   test_convert<mpz_int, cpp_bin_float_50>();\n   test_convert<mpz_int, mpq_rational>();\n   test_convert<mpz_int, mpf_float_50>();\n\n#if defined(HAS_MPFR)\n   test_convert<mpz_int, mpfr_float_50>();\n#endif\n#if defined(HAS_MPFI)\n   test_convert<mpz_int, mpfi_float_50>();\n#endif\n#ifdef HAS_TOMMATH\n   test_convert<mpz_int, tom_int>();\n\n   test_convert<mpz_int, tom_rational>();\n#endif\n#ifdef HAS_FLOAT128\n   test_convert<mpz_int, float128>();\n#endif\n   return boost::report_errors();\n}\n\n#else\n\nint main() { return 0; }\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_convert_from_tom_int.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#ifdef HAS_TOMMATH\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/multiprecision/tommath.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include \"test.hpp\"\n\n#if defined(HAS_GMP)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(HAS_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(HAS_MPFI)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef HAS_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n\nusing namespace boost::multiprecision;\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\ntemplate <class T>\nT generate_random(unsigned bits_wanted)\n{\n   static boost::random::mt19937               gen;\n   typedef boost::random::mt19937::result_type random_type;\n\n   T        max_val;\n   unsigned digits;\n   if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits))\n   {\n      max_val = (std::numeric_limits<T>::max)();\n      digits  = std::numeric_limits<T>::digits;\n   }\n   else\n   {\n      max_val = T(1) << bits_wanted;\n      digits  = bits_wanted;\n   }\n\n   unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n   while ((random_type(1) << bits_per_r_val) > (gen.max)())\n      --bits_per_r_val;\n\n   unsigned terms_needed = digits / bits_per_r_val + 1;\n\n   T val = 0;\n   for (unsigned i = 0; i < terms_needed; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   val %= max_val;\n   return val;\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_int(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(from.str(), t3.str());\n   BOOST_CHECK_EQUAL(from.str(), t4.str());\n}\ntemplate <class From, class To>\nvoid test_convert_neg_int(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_integer> const&, std::integral_constant<int, number_kind_integer> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>(bits_wanted);\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(from.str(), t1.str());\n      BOOST_CHECK_EQUAL(from.str(), t2.str());\n      test_convert_neg_int<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_rat(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(from.str(), numerator(t3).str());\n   BOOST_CHECK_EQUAL(from.str(), numerator(t4).str());\n}\ntemplate <class From, class To>\nvoid test_convert_neg_rat(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_integer> const&, std::integral_constant<int, number_kind_rational> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>(bits_wanted);\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(from.str(), numerator(t1).str());\n      BOOST_CHECK_EQUAL(from.str(), numerator(t2).str());\n      test_convert_neg_rat<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_float(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   To check(from.str() + \".0\");\n   BOOST_CHECK_EQUAL(t3, check);\n   BOOST_CHECK_EQUAL(t4, check);\n}\ntemplate <class From, class To>\nvoid test_convert_neg_float(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_integer> const&, std::integral_constant<int, number_kind_floating_point> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>(bits_wanted);\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      To   check(from.str() + \".0\");\n      BOOST_CHECK_EQUAL(t1, check);\n      BOOST_CHECK_EQUAL(t2, check);\n      test_convert_neg_float<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert()\n{\n   test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type());\n}\n\nint main()\n{\n   test_convert<tom_int, cpp_int>();\n   test_convert<tom_int, int128_t>();\n   test_convert<tom_int, uint128_t>();\n\n   test_convert<tom_int, cpp_dec_float_50>();\n\n   test_convert<tom_int, cpp_rational>();\n\n   test_convert<tom_int, cpp_bin_float_50>();\n\n#if defined(HAS_GMP)\n   test_convert<tom_int, mpz_int>();\n\n   test_convert<tom_int, mpq_rational>();\n\n   test_convert<tom_int, mpf_float_50>();\n#endif\n#if defined(HAS_MPFR)\n   test_convert<tom_int, mpfr_float_50>();\n#endif\n#if defined(HAS_MPFI)\n   test_convert<tom_int, mpfi_float_50>();\n#endif\n#ifdef HAS_TOMMATH\n   test_convert<tom_int, tom_int>();\n\n   test_convert<tom_int, tom_rational>();\n#endif\n#ifdef HAS_FLOAT128\n   test_convert<tom_int, float128>();\n#endif\n   return boost::report_errors();\n}\n\n#else\n\nint main() { return 0; }\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_convert_from_tom_rational.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#ifdef HAS_TOMMATH\n#include <boost/multiprecision/tommath.hpp>\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include \"test.hpp\"\n\n#if defined(HAS_GMP)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(HAS_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(HAS_MPFI)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef HAS_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nusing namespace boost::multiprecision;\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\ntemplate <class T>\nT generate_random_int(unsigned bits_wanted)\n{\n   static boost::random::mt19937               gen;\n   typedef boost::random::mt19937::result_type random_type;\n\n   T        max_val;\n   unsigned digits;\n   if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits))\n   {\n      max_val = (std::numeric_limits<T>::max)();\n      digits  = std::numeric_limits<T>::digits;\n   }\n   else\n   {\n      max_val = T(1) << bits_wanted;\n      digits  = bits_wanted;\n   }\n\n   unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n   while ((random_type(1) << bits_per_r_val) > (gen.max)())\n      --bits_per_r_val;\n\n   unsigned terms_needed = digits / bits_per_r_val + 1;\n\n   T val = 0;\n   for (unsigned i = 0; i < terms_needed; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   val %= max_val;\n   return val;\n}\n\ntemplate <class T>\nT generate_random(unsigned bits_wanted)\n{\n   typedef typename component_type<T>::type int_type;\n   T                                        val(generate_random_int<int_type>(bits_wanted), generate_random_int<int_type>(bits_wanted));\n   return val;\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_val(From from, const std::integral_constant<bool, true>&)\n{\n   from                                       = -from;\n   typename component_type<From>::type answer = numerator(from) / denominator(from);\n   To                                  t3(from);\n   To                                  t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(answer.str(), t3.str());\n   BOOST_CHECK_EQUAL(answer.str(), t4.str());\n}\ntemplate <class From, class To>\nvoid test_convert_neg_val(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_rational> const&, std::integral_constant<int, number_kind_integer> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From                                from   = generate_random<From>(bits_wanted);\n      typename component_type<From>::type answer = numerator(from) / denominator(from);\n      To                                  t1(from);\n      To                                  t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(answer.str(), t1.str());\n      BOOST_CHECK_EQUAL(answer.str(), t2.str());\n      test_convert_neg_val<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_float_val(From from, To const& tol, const std::integral_constant<bool, true>&)\n{\n   from      = -from;\n   To answer = To(numerator(from)) / To(denominator(from));\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_CLOSE_FRACTION(answer, t3, tol);\n   BOOST_CHECK_CLOSE_FRACTION(answer, t4, tol);\n}\ntemplate <class From, class To>\nvoid test_convert_neg_float_val(From const&, To const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_rational> const&, std::integral_constant<int, number_kind_floating_point> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from   = generate_random<From>(bits_wanted);\n      To   answer = To(numerator(from)) / To(denominator(from));\n      To   t1(from);\n      To   t2  = from.template convert_to<To>();\n      To   tol = std::numeric_limits<To>::is_specialized ? std::numeric_limits<To>::epsilon() : ldexp(To(1), 1 - bits_wanted);\n      tol *= 2;\n      BOOST_CHECK_CLOSE_FRACTION(answer, t1, tol);\n      BOOST_CHECK_CLOSE_FRACTION(answer, t2, tol);\n      test_convert_neg_float_val<From, To>(from, tol, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert_neg_rat_val(From from, const std::integral_constant<bool, true>&)\n{\n   from = -from;\n   To t3(from);\n   To t4 = from.template convert_to<To>();\n   BOOST_CHECK_EQUAL(from.str(), t3.str());\n   BOOST_CHECK_EQUAL(from.str(), t4.str());\n}\ntemplate <class From, class To>\nvoid test_convert_neg_rat_val(From const&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class From, class To>\nvoid test_convert_imp(std::integral_constant<int, number_kind_rational> const&, std::integral_constant<int, number_kind_rational> const&)\n{\n   int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000);\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      From from = generate_random<From>(bits_wanted);\n      To   t1(from);\n      To   t2 = from.template convert_to<To>();\n      BOOST_CHECK_EQUAL(from.str(), t1.str());\n      BOOST_CHECK_EQUAL(from.str(), t2.str());\n      test_convert_neg_rat_val<From, To>(from, std::integral_constant<bool, std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ());\n   }\n}\n\ntemplate <class From, class To>\nvoid test_convert()\n{\n   test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type());\n}\n\nint main()\n{\n   test_convert<tom_rational, cpp_int>();\n   test_convert<tom_rational, int128_t>();\n   test_convert<tom_rational, uint128_t>();\n   test_convert<tom_rational, cpp_rational>();\n\n   test_convert<tom_rational, cpp_bin_float_50>();\n\n   test_convert<tom_rational, cpp_dec_float_50>();\n\n#if defined(HAS_GMP)\n   test_convert<tom_rational, mpz_int>();\n   test_convert<tom_rational, mpq_rational>();\n   test_convert<tom_rational, mpf_float_50>();\n#endif\n#if defined(HAS_MPFR)\n   test_convert<tom_rational, mpfr_float_50>();\n#endif\n#if defined(HAS_MPFI)\n   test_convert<tom_rational, mpfi_float_50>();\n#endif\n   test_convert<tom_rational, tom_int>();\n   return boost::report_errors();\n}\n\n#else\n\nint main() { return 0; }\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cos.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n//#  define TEST_MPF\n#define TEST_BACKEND\n#define TEST_CPP_DEC_FLOAT\n#define TEST_MPFI_50\n#define TEST_FLOAT128\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(TEST_MPFR_50)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_MPFI_50)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n\ntemplate <class T>\nstruct has_poor_large_value_support\n{\n   static const bool value = false;\n};\n#ifdef TEST_CPP_DEC_FLOAT\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct has_poor_large_value_support<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >\n{\n   static const bool value = true;\n};\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct has_poor_large_value_support<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >\n{\n   static const bool value = true;\n};\n#endif\n\ntemplate <class T>\nvoid test()\n{\n   std::cout << \"Testing type \" << typeid(T).name() << std::endl;\n   static const boost::array<const char*, 101u> data =\n       {{\n           \"-2.37609908807915949996042688873953402912174184373388399043229539427530802169622688886435380890546981798452174137747437590e-1\",\n           \"8.03406366226813589517543567844755380935198206635917017883860879215939165740799963435747185200486086864198723786516760875e-1\",\n           \"8.60219386510802105228997694366289682807721120146423711696179175800635220710279361583231346318224971127450760223168489952e-1\",\n           \"-1.36768951513839774357595871594675554406872039078811749027554673949684004409484639336417431285061889554892096426752261915e-1\",\n           \"-9.66210139195431691033548069227792927999642647449593184440815029076272297050360196975341458076547426373476590671462150981e-1\",\n           \"-6.12007278553856790723803948280976098970972124581361775428331444376106018942231526074915731012122426588769327127413045994e-1\",\n           \"4.91927698740873688392439262912409276430264703350691359723802294639643655296838880236042651349290074585311025856549893171e-1\",\n           \"9.93232596718899824059271235487971663771012607519717340071654721877802691370866768064059943491135925674950430467047724563e-1\",\n           \"2.77789911520199551017947550534057049374212876971194676010301098598339529915403722848373365985645657342475739669568931563e-1\",\n           \"-7.77955945956221239101360662190442739163791527953499629555756394261998892874934847131138921705713935365505245406994428077e-1\",\n           \"-8.80676278306736581575818642341143682410874043182925227659938804267878718513212454821032629378618345485453587099696563832e-1\",\n           \"9.54652155963865007116798560589970996367213754762169439269792747771200843006278637115722685610960738675814993576019945344e-2\",\n           \"9.54658201427917718824191302196929158303422390793460018465335986921801519149657723689322277773550748806000948225466432438e-1\",\n           \"6.44358700620889799575033272322899136331490664925359198096632560532437137894857803619177106562399406351419810452110265174e-1\",\n           \"-4.55304635273050571206400777159475409897339683148730716647371922365967582339285347105376503917296765204188604297021364549e-1\",\n           \"-9.97202532932553753622481171186283382950122646390227670693679248197349800205205290898290539070732778341271049474946533154e-1\",\n           \"-3.17489525058325500707686194437148362752290391406825231198381521862930317513649081353670386166519524315810546189268634469e-1\",\n           \"7.51160186640147504067744846462384089742696250681200524524912647858645140367792164416711871535116761744380912486921554617e-1\",\n           \"8.99610194168373157174515848193119670768490559799348397680196213249921436405001710937402190319584272526657508442591319630e-1\",\n           \"-5.39963892484342940823660554048696208293700871414984387094529796385334086703752106515008832585578915389731907422242902573e-2\",\n           \"-9.41455348900839346761557896365239742769987576963330061702397697388879776230596944312519157729410022380228287314835345969e-1\",\n           \"-6.75595816763857390859268297670835380459024839344154743310231115864242050771191159334664874097564054770066166961642073448e-1\",\n           \"4.17894201894880415042381733708896725748531223743344790054523182948440843948904650988733732381978194392219295696279423635e-1\",\n           \"9.99447981389824371458566861195586395552622718284098766856978062347139060489410032781030191080200904443096549587568037683e-1\",\n           \"3.56640095868759075150409032448421838265699043643228482503057299699740924345262819242042067863780263400092250418388628640e-1\",\n           \"-7.23065426868134142613141384486526262450487633432466529798821958977732347646832059032382447792655111641456570392189752211e-1\",\n           \"-9.16988391192434436877664999042786024703848714036221388727578305299843547352325574309860356272561772723624753484063972217e-1\",\n           \"1.24341855683226931265962750806821531283439413068694552738675989282017066737438591268502070364982899342633928417210588531e-2\",\n           \"9.26624413643579136646620112107410908114766812511471130116341925013001661546817531064974089666536893346764523464250445838e-1\",\n           \"7.05664607841658050248613256866289182754229289446384595719719495272020558391145537620968819401219414243210529013148958366e-1\",\n           \"-3.79761093422301890838671114556341706055562482358183402807224298533060188038450560241345615647754569347252101282386222173e-1\",\n           \"-9.99965058979463689113370264378210962384824970050865061898892508056811665771886385589295806419278045318841717598003331419e-1\",\n           \"-3.95173919871548266286836251448043149039940610894391718791244019288314418437411707835924620250473697245151743147215758686e-1\",\n           \"6.93720251624319621941983929806434090162802383400620564454074825718151625795576680427510026452063593762417421561201654156e-1\",\n           \"9.32780816819880202610269817418700102084277332259524791943833699964920012022753227823298655560837271746316929623378078695e-1\",\n           \"2.91495208658083070508005579692813621670878962971611104453227900103973434149303469066898102622556226584993895360896300290e-2\",\n           \"-9.10191043170480685360743788297835112117551819731152897291272407935139876953384666161532187572493791297095784055525159185e-1\",\n           \"-7.34513075127503122343910106816656237074878218180284276449954797048122379869002663646507706411949095015624141821039453971e-1\",\n           \"3.40971254411713599427147477626159847871020791931107106418841144080445813896332252160005593096670674809345703079384115052e-1\",\n           \"9.98752871506016936810666998588493462933191829230756181478046320353377054175122206889047094521687205093218701141334147081e-1\",\n           \"4.33024359542714849537532946954507232835434973891665238942502273464321666207117525270650546741831354943253652514490075246e-1\",\n           \"-6.63175408268187738636594884921931867786416057472876635147295424128144233911929585327601381618059327766986981109409782838e-1\",\n           \"-9.46960160806563725719808910991708075372282242401645009270517113290439792088443109178772446465191984149998211903724560065e-1\",\n           \"-7.06828182905581345108929510344440443421290640066613022421187316650733628538705972455891575947230299102119854983197703150e-2\",\n           \"8.92183656127948379886438402777950080111433733329436790239129260607557296960582455582584117031260710927499215646838011844e-1\",\n           \"7.62091330231640362984555508176991632755732840163230620595759320390970951235395195394649584713540498911356433919369698423e-1\",\n           \"-3.01591765120371930643555588643712101466544136366607065361801475091335195383846047491935017919396438040414024941341524187e-1\",\n           \"-9.95813515236177554177387795413035497724212540625760091518605741283184405719984044075159457509720410668598540884613985023e-1\",\n           \"-4.70125959152223022135690700550251564040118601846181392455764893020377582359429013073566263451488554529709131439092909247e-1\",\n           \"6.31483718775865440843182928017874708719203714677143270278178885379757350754752477512514449375355491054871712891789652146e-1\",\n           \"1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n           \"3.87481045630097871028201331640164477694000480353342897357083794605539506785023570062767753819472037935010414476627195076e-1\",\n           \"-6.99716878554812023132822640034166338740077082416915046841339368979161296335086955803240899441098534898926193252558848693e-1\",\n           \"-9.29735101124991407032113033015438177585645722877060262785796302722011806301680288369763295777635760805579255008366302180e-1\",\n           \"-2.07925797310208845709174899248298159909010721767168338004516304026594885686024530923209628704670627250569637267490913462e-2\",\n           \"9.13621640053945104047985280883096238900189007462190433514805702721127019097915088259906184736442916334750420359005079959e-1\",\n           \"7.28814716527795995795780587639833705107995825167970668466246348938821997240383021826681253777014938636567626203524137506e-1\",\n           \"-3.48817863192357573536083313907744269588018702862402502601699983054718835012048372083235768555953613790431700360695537918e-1\",\n           \"-9.99135337256258278958854200595331742602280601557283993231562055717063052179292021052372510863057206152466386086657442382e-1\",\n           \"-4.25474147219713305654097901385832164424798803616095278869643928816776198489330071073326518019520590535564717523756486665e-1\",\n           \"6.69409002349720857726983952566596052122726437391092096671257338244059819036586172017092390651026654050631669646310910927e-1\",\n           \"9.44240747589054266930136705015787520728797286842746645573763175559132491628984502333043316023599487896169049499868916865e-1\",\n           \"6.23417820549832676844933182722733277887833220127638406914080428946880981800946578131712749910941183940944526141109771339e-2\",\n           \"-8.95928229794837090592434136137683839101829890460754766346170956577979909285084363961363023377587044303560652568203578379e-1\",\n           \"-7.56652196635835430995109388017590459596111729342964992503572530290981857981790620732129221157071082788019187787999930361e-1\",\n           \"3.09551461133309219674309651201007026752336319933918953736299690287371505733386433918863300129026763968979930342098019300e-1\",\n           \"9.96542844308353945757715814452637400116215448012622700698887257177706625278927018059066920597035660000571997275705962011e-1\",\n           \"4.62731465522276407764000677957978862104808823938378826581864482071733508960062598574638347814740748458034065235894523010e-1\",\n           \"-6.37943500095315456672541800050589670140910744260281868746767523730582697622604545933849801882909439609368258115114388202e-1\",\n           \"-9.57113494461990955768932962010819183910065445494138937651443249061391692258872250121438832853873660881630205561168895590e-1\",\n           \"-1.03783175146302830356973378710923690121182237844646430783773333188328606275124873219756415071202025673009660963930966273e-1\",\n           \"8.76685468012988943166112725030293740012198666616661362437433807594683780986916439696374569274720383546275206733493672834e-1\",\n           \"7.83181178815072182812568575402104911406191663934571600092749188502783771503475038116599065276589122015600004250624262132e-1\",\n           \"-2.69749743842835294071354429049113807280228918034124159074991560056663623624511602063409428877143567459307323934051784210e-1\",\n           \"-9.92227004420417932443416371636723983768124774541445787394585828303853075015733744933294181104002649816119116502663362907e-1\",\n           \"-4.99188570507651271652464431008309802023236218596632956064119419694573621896525872847587264755853127438644874992889777436e-1\",\n           \"6.05374785886620830935500306718810628353011877048386199574451402773468315797082901705593423724389976967865835641164117478e-1\",\n           \"9.68331080574540181354402420018944004334504868848934676984951546671476956051983469715128604348963016773169794077158289730e-1\",\n           \"1.45045093347669933436797325432376656017480150281100519869038554695618054318368975927557872948037203212941966706926758604e-1\",\n           \"-8.55926631706799584065153976496431313099942493164544290051315786450857575707615522517293656706329757352795226750189755758e-1\",\n           \"-8.08355785820466703104647317116964786017731181599256098405978700298563758509572188640629418770593008092680980412866065299e-1\",\n           \"2.29481541445091823694157468006983283649885473964756916206813927875661041834620526229807744443043682778028709792615798955e-1\",\n           \"9.86195281084368344446227722442335005500018635181693920385626820970119467136148305491035657795704047666385553672680209923e-1\",\n           \"5.34782415974986828906369231191245075731384342252264783019973387059318216570499447505623911253042567598873910043381675873e-1\",\n           \"-5.71759181631212640256161075896307515511612057247572886814941945052483422285718810088660759708176904381865453799197101481e-1\",\n           \"-9.77874107069129472007009478090869879295520839405452365411822873037906082086100232576241983901051327761231156641104065497e-1\",\n           \"-1.86056181372276495846711248156316208757691570931906856005697361080864028851991674077024223201008430626166447144444086146e-1\",\n           \"8.33687619660983803179149188531271900120055171980951416163724579833511897001564116810390933587615557717585362295882429826e-1\",\n           \"8.32132482562487183916482822112362004641509381783438374175226355792137053285527706239574867923387554339582561002247202518e-1\",\n           \"-1.88816490768820368180947188938258919466912959009058295775702554895970560887437777994365295452696990115940651570073217522e-1\",\n           \"-9.78458105113103660973458641126689066610890753079836635611789969774219913050456840122278188955139015473252491612410972950e-1\",\n           \"-5.69451448580118869157805059117807250106203230622762838051154208713065707949727035884250775206017528612930773233017928006e-1\",\n           \"5.37154819650306918873973169624898539483418364490295996462663218848771864764982600193558748568095521886456306061269765631e-1\",\n           \"9.85726070946814004698231423834505649751779161578718404221294527194525251740198034173542003704080544827976936213857653517e-1\",\n           \"2.26745517700332138489400566746499809209783385009289423848083137846668382711005704387134606000570923556980021574851618566e-1\",\n           \"-8.10006890365888881023982873786181048364505748637138923322482323010218991062084191379116946709356002103893071903481540337e-1\",\n           \"-8.54470151393449484710948210543666267680196067632693416660536443330720708402601669617638569732848938319544250428600991723e-1\",\n           \"1.47824914922605209542648603104533928946885824995208478684499907657728115943168395067575842431291755277452367320596435067e-1\",\n           \"9.69028856602232134498324179654622883463820270279077886397861028881882684131282848087869087883519707948141915733221980948e-1\",\n           \"6.03135714281336943093251136556365407562473924416812270469171432809743173719168209727199952532489544254928975940518615351e-1\",\n           \"-5.01621542149055350065079347615664213658089623368745676779267390227688581807037821041573344917735076902116221444127518632e-1\",\n       }};\n\n   std::uintmax_t max_err = 0;\n   for (unsigned k = 0; k < data.size(); k++)\n   {\n      static const T euler_gamma = static_cast<T>(\"5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1\");\n      T              val         = cos(euler_gamma * ((100 * k) - 5000));\n      T              e           = relative_error(val, T(data[k]));\n      unsigned       err         = e.template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n      val = cos(-euler_gamma * ((100 * k) - 5000));\n      e   = relative_error(val, T(data[k]));\n      err = e.template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n   }\n   std::cout << \"Max error was: \" << max_err << std::endl;\n   BOOST_TEST(max_err < 5000000000ULL);\n\n   static const boost::array<const char*, 51u> near_one =\n       {{\n           \"0.001103662615143147017601393734232421549156847219973314118949247990939859507971857976111288683988415478257878902917354105871236439563170045857810738102729287303674642020538722348587741395785016549139854168605590336633274890874911975139498047488076101124170425114828336211817830671418321600962996502656221412102902998671173649312277667706874059520046508702908872747388744526457997404065469953155187340837\",\n           \"0.0030157041572432190019717764776322147049224887913331212054173669461673516770769148735558540290915754514269097799280330158745508542936966046640795712691698490758472574837678659161855207596563250546269614348515005196657786359646020537231301121492728577410212550350070502426482802490452572415879214994201864402901595309726458026672888041860289772080407882673424767232857435141510615538430445535588448032261\",\n           \"0.0049277346741750694119109616231402901360500185022482787362616412856233338679208830974124749830793778323997684640684587346403570647040211088376986993615001420565608501262335822815041623056442245053684626079448221530207757672939048030945164948521320401574074802966260975904478775314730002799895049652983052125151436511589335123254582883803928373794668948878049089088843407672795237410750365571990834236348\",\n           \"0.0068397471757112108044544339281399968563253858411528016363900245610068161564091499398024110635089866212789583403491711476788985949178019078796740862827299289838108117219486357027460681238178010067475221327133396780718266880540272936860185783976937569903778160170225166328920201699827472893824363838439627437187765159770262282930293057633886299749088561182830982345936603553661004526800797082995898813903\",\n           \"0.008751734671690018552720976028788304981263251327799787402847843531098338033456389098956160956160597460869666211569183483587979772678557230743050583975270977754518475970489741156524119378847305446845331098526962579804361960647344836744631465315238254178161716870409320747176674142306881908614436607977326507761331050644035013756409444911127742401762647885817361924274132830920030936589562922803846509607\",\n           \"0.010663690172041286306192948782895990881227033104763005629047563262531418373465237876680529005058533981010793759446966868628480908709812402179047774888094761104238131843239037167212206469894485599085717216855637620318723457013401360290343196462723174177342294339229792213396006286331141933952648238459364417067676760977202812721209681621184724443514062993874571816382775241753902032787099435678672474841\",\n           \"0.012575606686811781116778815864446643746718166744927923785139233710240017201737625088406861185781739628293213436323314376708933534933748436720721568462267317026688561438144113855290140925120435317506169856461386623828941531577425811393721991195661429557079268566156800689149725770186985872449679872155877537432897653904213375816262709009448220490217917537801655330411526526290708967440087145630462068976\",\n           \"0.014487477226190798137230457835664944872810802211308342685055637400305474021552028493778559102552025380880477103065187688337931713540557562373991431880251553620947836940726544553647739994157300967262941976933375115946629204615918888689039777423610894099269527633757403818072000860056651445780074486612843419789636984117740884711882675016016919064788076097669389652323393864660933705259163296837955978748\",\n           \"0.016399294800535714798489384358524900105286836154421890562438917862501411947245037986455919696365301666112414890097246479762149456962809638588245466988584093380263545543023411087203351948681559905336010066900667101787138862856447778428938265451537422367650992162004154495705878092019403922006152498705687706013973674800621422751806347308220226407830977673540994341535381202679482907460136241543505771361\",\n           \"0.018311052420397544372537858201001145083914223029622271478159852925692124442640247100336262041440360412392318902558295108452513123454103504516607498763863728284797202978975409264141138861738184468257576157204552383675442780049333490201800526935793000727771598103735596829143729912656158790924063286176336412427525710457367751437348230246446466833498557166002214984255422115833828533909144072330080184872\",\n           \"0.020222743096546488827333191237246591760639730704704148795009602627175281013458865557238240830203973690492882935553111519759474835556686812553430134442713057622274348510526931333124437928482001301214776111358848026164688447150395879262705323533149853785508106018564787140458587165768350143018847840661371060583295055600185059031740386698369796694993301139380463919242175430688496936048982929502368583755\",\n           \"0.022134359839997490880406060727014362125793630864951833270601574861700025448109186301755833862830343973100181180995751924514611578149687732808840212399134735559355116816700346196685057916461444889179117142807858883574426062415931319905031345377305247124198345242221848293630112578508459623098934259229893301963120289071135120089672338617200639338087265986570094025605269870532431816151660553037324591448\",\n           \"0.024045895662035785157706623778569329505432699504171659064296747761761946910295074291838826981712792368282349553905175996858645967280135417577488810651594776626562252686758463813820791031580579721782251705600570838044158357396828391251385978824608388341556751951593319015721256942139947235672567093309227673005475237474351604086627391812539914665025071874865132198040631867741985556198082915821590691115\",\n           \"0.025957343574242448364285479040344211549214421772336408904791690210449825580868841229728937909141136116652894475476991471494524501035809956288247010861464302066154254736425460468024350571584780489213056428098560686376999562953811729945811217829999284678155635497607933780499844559793793320393174691097636750027421158473345884329284455326733063073401001936304522649050748641723222539485352644237494855455\",\n           \"0.027868696588519948373400137317728007608587427701668964330844960393232962659347088604492706251530487148805683505883152882204177723404307465324383408418716579280515871949790204586171885981761699066301009410176801635003961167315448162116236938093263170474354430610732127054993766008385425707409224417795873645410443727472246508894027549288331903202127478347028519320691939639175445464091747341289465807076\",\n           \"0.029779947717117692140641616959423088975059158964671307393654571763491553590582559015283533532986018614029995854278748039155177088839414450454409571267110720713374288363670804692289394770804051182510495900322915294613479146430103948686457060129295537542317247965142780968717375277053102667416124807987527429828758851341378395347636356414345553353015296944031211364374602764176767114282660874356057979248\",\n           \"0.03169108997265757234968007548831539092664261419258315028339932724609641378752993073240305448323210275610250474048387518003293691429670190316839718892647475151605557113852966925288722557261748981001717642661075734993748510506277165730472207647763678204813714194082852502621623007244214605646094787730992510318924772328958129857640953691466395972638014259980360897599169526022683004620965496473543834477\",\n           \"0.033602116368159512696233026049065446239504816931754722314316906991719894135599777826750609185018647633748023602662568553364455253741994701511752478506175671449029859193583332380924298164350627023797218098539441228986492601142199774579432202424360114528105854714450548265654769162069979862894518829365029262734944196495563243510942310738160350648115273816371164862001848102516957052031698646996790510953\",\n           \"0.035513019917067011716864665791693591701266221069066142988726516832036728613300457006403299601385922973285573124147669717618486570986860008564309641657943172757912451506572783449830586163814477502720341010870119231030511664725149033496023356743601581035789746158436049009960920433265660001864258067191594425969638702851317416487965304378219676062220223886417078628342731900948906319081697480745936074075\",\n           \"0.037423793633272685069230163289099410548201460485083250584815890545695501760634737348027106921155349564805321222282824709072582234185849564440670000847571561359324629877368620222775856068569278590582843550096096627510109210574429458414697641703261368397349100700647508781941466979105505468662952228018391181441110331804231754679360190526351574820397399161022517352576803713854137820941977691824804918229\",\n           \"0.039334430531143806170384413477273936914540782490679532559795199052084263353981243128408259086619593938946158294175465792633584421592350011455198124846778194417281005620258982615227234871780679327289232072858751285307955384102986030326321993554199425677956531006546270705693578070953933490084008156062047268010604414954653769711129551190023978078265436680151306319349753427763894284339669614362603225399\",\n           \"0.041244923625547845099780771389235760645292527949481044094490883777921290140650504322516472637184803214130714431279474404434513167088543202171922178874118967991301744186858054508473413647148744260057423931033177973119110921967581379650616945061418716237102199971097086754171168500651650526166023618723542873290120298640370217463634503988257867984189842393302366909916756244585593509804376197012137137735\",\n           \"0.043155265931878005673591620105503250213648422568500347993529171942176855000247082147052189275394127432389966427668413127665366489709229602926384588361071126297040547180622989395253518259197742053810419372452372506534313264090033740095357809571640645325965973975968081307185286025492280541542290934505383760407808393490207181258819590768103829347539943429968533891105456889889207923129412409325200337396\",\n           \"0.045065450466078760596989313842010956972889269629840996618541471076456145341576346037140737554087089598232657340541865108389258265511462307708855932308284610805209084413460614598570062354088931179587984702006847566162492414964136182928014974554852612762940578089297583097434972291633301329615187665009664697057933900728259220674217919826618275818024987757805509580781060051826778978395144370327934582031\",\n           \"0.046975470244671384601033063916347240271496301008030038885300525267985292259051299166038486168462131096926077920611254966322965395673221324506213593415263189667393727124978454125104192236004303056348320706091018781990803164595039969574510002737990997634364247271320535459089400357647302806652831431190979518269432197656547265417669309719787317687585776029758282182901563328846367691507505917911626458378\",\n           \"0.048885318284779485470814703449342779874157141188272539012461507790598796169844054420701400747288103863351008593834375336008952419161297787680355981672505884405645257094616683497040471721980241679616912483788844007649447969703512155758482444019770785766752697959554691538291379700303132353876869628124563105576278585509058450081192711918856522653293896204836307264696289474219755720645459588331890558889\",\n           \"0.050794987604154532871523976044438688478988546522275702591135165295075684834775069782087540212155311599924632216878717363279038406203747968637573994688146329296755023729170505930935028107359530042909822369245609091696704070694133386183688825674952803613566914142157159664703170379754943610785780639205752343103591085978554489192416588288410803225066825839880971435465232206429722600557780654218330146221\",\n           \"0.052704471221201384879102044313723519214541830844294339002006150295000261803629777930668202713875629368914012613840180174156598399096984605842000917709330893871365961242812860633022132663435078869433262371062200555333508565564704972551921154864927879748108180002977668648111714062992755985320189721615088748697314805428967770533095416911693326757965362169171309026356339280576158225848771071227224373815\",\n           \"0.054613762155003812122160305957618147686113745063989650607179163157398820817715079449268802189362998719256947035541552524839497119721884536865240705017403409053301625152685151644761334409897199810093505097528650897729279062117617766845257388412635800174656504897022571125534403010151970450307624961920347280823962725005822339087173498538012712497715370388872960900453285934131578336748483622553313648565\",\n           \"0.056522853425350019441850338124226420404372628229474954730316461224029279793449121148941830155705856364290655296696008865349058650396297667951745639266344993911111272076019522476315254920931469406381088740392436352997178777214659473302034620137440843681809428909274912969436139312159105442160243076856936138443854294531618433726198293972487505166088883354213979143973990964298454127970039847456893860203\",\n           \"0.058431738052758164976379864942430396555977098734986011309321413104802080798824039565461521608355122102022725461220269967251619843394860641070621951433765763369761658916816880868188275032453137184211673934079277285593935159478757148621410070196500221526968060556586710920750728824112282461003224923995158937905479480579208549847478185757177039153501786271361921802927586114942206193581554801605680183774\",\n           \"0.060340409058501876576879058406717550375449897922866349024612531373677724965692896763451690034750214807393086060232183962741893455630800282528706094634312497867863194252914455062127544671909424505367559503649890477570116767021509485710626043408265846213906257952113003324887350087083283630715857354116849013376841533857321740197047217435805280085872071354373524395263864933170034771001607559366437835689\",\n           \"0.06224885946463576546133123915706193746686049729742751789281333411875145041642253752249398319274836506892916659694331849766284472811963607782488993959669913942440995816339529777656740297867471191540909520680122909159182411803441391065468297111274482089347737322313334144161837035757661055283810143238846811496286086926075008068489724098160672664550444107807861952850135669761489736449089327971794824585\",\n           \"0.064157082294020937013292141108273585068933185681722806586173136512969086561151000586083228827704474922133659368208499428517560937267711287558275856325851735527047525549135602809953924346232393575354505341516408877034795144989051337120442048812961016500803766780090428411925756071299228254760633032932651170483895163866111455935100454818941073761804284777739005007991141161823471943803047351369535073521\",\n           \"0.066065070570350498632132342303164932774411476452581548988386145454309844170784631219900687545375669726062411278210148833761887075889382631711319762066717518842787273543143969874177059386003262516941215168234997245420735913778365997498382320917159517052861653706668051150014889560865161606396037665048820655743861710636504450723955435275019348223982732095398949832565423361714391500479155224225613768011\",\n           \"0.067972817318175064541548243754498015429928588516517183822313264446879635682093113384264993280408482780193047687370305892309106748875519486540879020142902362307237689684697063792225838111742241714789823601251998299331254097504567214769822096812914869886418586879378868131071702869283011709161582762527864014863950459121468893761825841337802563429112718615110803469902519051203360473993644451463303576859\",\n           \"0.069880315562928257463098098362562671709183706398122146969098129179472379455539984270317889382725678551314678030902515782188203802362460214070192378666311369730755912670660970378408284876465192356340335277225457776091515934608751710356445501169982098020701963512215973413220903547301855847279762573955110834619967590588317288171580291576756417265600792610005176888567344924086299458709493921684370833814\",\n           \"0.071787558330952207061531053207739391124226218288071373402959685303573894071937999096931283415397385296306228484128726125223568292760110763075739612174182840148193517540379302896938375357744754831885570482299802985278525692833941172622048860945698352794727105726197891701070706523197225463566498764869186174536278875440544967870368440256565084805804998877012238900798874720340885805165811704445925369809\",\n           \"0.07369453864952304506868897057861922170414313661538863465614770246556638808351254050794164760581857499175318127117745597595046399453737415234966090460819383278338184265518294393589316067434296307320873514873375534499000895507092920123162793722742278902956263178675873980121089525814840115300730124457959632013360479776554262210801798434607194598511786777350540581826836696200671400628870250659962729555\",\n           \"0.075601249546876396992772935963040077834759122887264324876826746597298507042570795315940378957369646666545616927930046677179646722187557860442506025110541968257406052679604681892086517951648112201767029044637142334937786145563391280677987040697732028896674786378870229133792190093646530752257521390201161387698590619925316803401938362974478273195688740273778224688121208296858072701246429755713258468481\",\n           \"0.077507684052232870319778844857360483087988665809157375994805235390695227945273826842335916971262245322463861698987988491433092759415620685754813456247989287157909601376742141647886684380473379403067343977633347655683745871434202230624968375294472571053679501320680048739346844244553807193670436672857163839591129928936603341033670518982144557944158002407590669543043048232580344768659176122645763500513\",\n           \"0.079413835195823539113919284592789131508074280056913456617148863190077260584186476150168101766032692499585019572300009477107342325731806003539645749720998260074894005503243715777788187754550286488316966320623707403846973934258796072434720381188302956748572794547906591019552569722211941807674118070825610462581312695693650893380241875873254675082431417454526920871842555422162216221640850141209989864308\",\n           \"0.081319696008915424923862092389736899811819511475112310887916890436246797704730704673729056088324784096921353721791055102563812592375189346816348952621603248827528923433998597558478366712658235656924601774921095079356565867874041683517103417362062033545480747089630436317004907748679995334911923789802669273406449877710501792905734235548100216242648355048174292232350538531258791292074224222773259366265\",\n           \"0.083225259523836973901629476483826882570495097409722948211156651871411915926347698443317606324912095013846386144848076019334983060323996364575622231284156371311209803383868297666027142776492604713451401116304951916037351315288808149328656282592946622481248077426878390562084748274992526750980236994304445617883874613002677387890383751048690275480465558930319669630406765794141303531112767626885032234711\",\n           \"0.085130518774003530041015433371012162123590338565297712899451572274044870858132401685294989726432756808251618198809497117031428754224182463768189333992610411750324249283786647605964593556580841488686189374310703328490638378071341189999989736919850819640255203388192531225871093915262442913255553964348789674386732423763999398384843950222967487918049677831350991752153610543052586794779289758903475438463\",\n           \"0.087035466793942804442393380943589773874807384137701777807755858606555806090045313793349743667697666495784828540247587627381581545620918795107877715086227932192756144780086856515641298195558204484728115519445514732755572178929839231921546119143469647706999890259163924570037168105911942268212237224359201159897493303064534985539474450028748960081579369980283792804593122976296597796047722827878891322393\",\n           \"0.088940096619320340510800454481897179643787714504988904779549430422905882044782054375828906100456879992313640144934242418129400679706865644316664458061953684856607341811667576418163339843372041295322709797007871604740491453013916791024918954258557372755707588171502529270934617054742841996068375532958173787119651672031238405892943090742861150287144368470297356054911834742041692715934237148148936307154\",\n           \"0.090844401286964974994199780075024285173534240616972938308566124002318176156233343333797652771250228033597767340846476094210813299723066344955542455246897302945908336756464582189829335315055318509171623072382573656172991307091055717376996812421994002305994837615827430425975713541786272473174908117299253875064746541808768776888139494200307162476704515967971265236163183394620211890252072718610942571965\",\n           \"0.092748373834894294768837248013614869545920040757666771889792264347367335922283987944081370356939214799510822558638935486112190359701790662792925773186897671244831971450474952036618937833706899006048469791213129922302798462311426294239282200248625552430083292818594731518350634587677158329361662244008606299358410273467156168469937529868888478684257396004386633746334360279683178784117372066095688934486\",\n           \"0.094652007302340089278624856973167138217258137565762699413364163993950641989798336903224059425798872308451866930780842878435503832366316245159154044350517727312654980455290163514021860802028251981954724580292247887851185639950862672925642859475325430465650514258094310141033116303195908372018392349011340787373492402788283020594141795669947097771918542864972570255253465754192708165241608041715996375567\",\n           \"0.09655529472977379853549858833033074225823562054271495313739665642376685099661084023094270272485976247900824483810911634635819558334630910267353320029261330296977292720266655308513559530586843550229208517388789783011887450865488554143475302590353915732321663418057567573042594801866258948380684000769091353165879953111046260532796891917772727185993569684246844052518121013717183610828519193371796413317\",\n       }};\n\n   T half_pi = static_cast<T>(\"1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332354692230477529111586267970406424055872514205135096926055277982231147447746519098221440548783296672306423782411689339158263560095457282428346173017430522716332410669680363012457064\");\n\n   max_err = 0;\n   for (unsigned k = 0; k < near_one.size(); k++)\n   {\n      static const T euler_gamma = static_cast<T>(\"5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1\");\n      T              val         = cos(half_pi - (euler_gamma + k) / 523);\n      T              e           = relative_error(val, T(near_one[k]));\n      unsigned       err         = e.template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n      val = cos(-half_pi + (euler_gamma + k) / 523);\n      e   = relative_error(val, T(near_one[k]));\n      err = e.template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n   }\n   std::cout << \"Max error was: \" << max_err << std::endl;\n#if defined(BOOST_INTEL) && defined(TEST_FLOAT128)\n   BOOST_TEST(max_err < 8000);\n#else\n   BOOST_TEST(max_err < 750);\n#endif\n\n   //\n   // Test with some exact binary values as input - this tests our code\n   // rather than the test data:\n   //\n   static const boost::array<boost::array<T, 2>, 8> exact_data =\n       {{{{0.5, static_cast<T>(\"0.877582561890372716116281582603829651991645197109744052997610868315950763274213947405794184084682258355478400593109053993\")}},\n         {{0.25, static_cast<T>(\"0.968912421710644784144595449494189199804134190287442831148128124288942561184523327264655202799685025510352709626116202617\")}},\n         {{0.75, static_cast<T>(\"0.731688868873820886311838753000084543840541276050772482507683220220750082501569499540967562610201174960122884908227300721\")}},\n         {{std::ldexp(1.0, -20), static_cast<T>(\"0.99999999999954525264911357034690133684385823577463126432241468890539365027135494672267164697779879113636143901797362388\")}},\n         {{2, static_cast<T>(\"-0.416146836547142386997568229500762189766000771075544890755149973781964936124079169074531777860169140367366791365215728559\")}},\n         {{5, static_cast<T>(\"0.283662185463226264466639171513557308334422592252215944930359066586151456767382702286176981668344573238827368717546699737\")}},\n         {{10, static_cast<T>(\"-0.839071529076452452258863947824064834519930165133168546835953731048792586866270768400933712760422138927451054405350243624\")}},\n         {{8.5, static_cast<T>(\"-0.60201190268482361534842652295699870029606776360435523539636606145572515876770619546025351418378467287262574566665150299\")}}}};\n   max_err = 0;\n   for (unsigned k = 0; k < exact_data.size(); k++)\n   {\n      T        val = cos(exact_data[k][0]);\n      T        e   = relative_error(val, exact_data[k][1]);\n      unsigned err = e.template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n      val = cos(-exact_data[k][0]);\n      e   = relative_error(val, exact_data[k][1]);\n      err = e.template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n   }\n   std::cout << \"Max error was: \" << max_err << std::endl;\n   BOOST_TEST(max_err < 20);\n\n   BOOST_TEST(cos(T(0)) == 1);\n#if defined(BOOST_INTEL) && defined(TEST_FLOAT128)\n   BOOST_TEST(fabs(cos(half_pi)) < 4 * std::numeric_limits<T>::epsilon());\n#else\n   BOOST_TEST(fabs(cos(half_pi)) < std::numeric_limits<T>::epsilon());\n#endif\n\n#include \"sincos.ipp\"\n   max_err = 0;\n   for (unsigned k = 0; k < sincos.size(); k++)\n   {\n      T        val = cos(sincos[k][0]);\n      T        e   = relative_error(val, sincos[k][2]);\n      unsigned err = e.template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n   }\n   std::cout << \"Max error was: \" << max_err << std::endl;\n   BOOST_TEST(max_err < 20);\n\n   if (has_poor_large_value_support<T>::value)\n   {\n      T bug_value = 12 / std::numeric_limits<T>::epsilon();\n      for (unsigned i = 0; i < 20; ++i, bug_value *= 1.1)\n      {\n         BOOST_TEST(cos(bug_value) == 1);\n      }\n   }\n}\n\nint main()\n{\n#ifdef TEST_BACKEND\n   test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();\n#endif\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::mpf_float_50>();\n   test<boost::multiprecision::mpf_float_100>();\n#endif\n#ifdef TEST_MPFR_50\n   test<boost::multiprecision::mpfr_float_50>();\n   test<boost::multiprecision::mpfr_float_100>();\n#endif\n#ifdef TEST_MPFI_50\n   test<boost::multiprecision::mpfi_float_50>();\n   test<boost::multiprecision::mpfi_float_100>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>();\n   test<boost::multiprecision::cpp_dec_float_100>();\n#ifndef SLOW_COMPLER\n   // Some \"peculiar\" digit counts which stress our code:\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();\n#endif\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cos_near_half_pi.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include <boost/math/special_functions/relative_difference.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) && !defined(TEST_MPFR_50)\n#define TEST_MPF_50\n#define TEST_CPP_DEC_FLOAT\n#define TEST_FLOAT128\n#define TEST_CPP_BIN_FLOAT\n#define TEST_MPFR_50\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#include <boost/multiprecision/mpfr.hpp>\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n\ntemplate <class T>\nvoid test()\n{\n   typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<1000> > mpfr_float_1000;\n\n   for (int n = -20; n <= 20; ++n)\n   {\n      std::cout << \"Testing n = \" << n << std::endl;\n      T boundary = boost::math::constants::half_pi<T>() * n;\n      T val      = boundary;\n      for (unsigned i = 0; i < 200; ++i)\n      {\n         mpfr_float_1000 comparison(val);\n         comparison = cos(comparison);\n         T found = cos(val);\n         T expected = T(comparison);\n         BOOST_CHECK_LE(boost::math::epsilon_difference(found, expected), 20);\n         //std::cout << std::setprecision(10) << val << std::endl;\n         //std::cout << std::setprecision(50) << found << std::endl;\n         //std::cout << std::setprecision(50) << comparison << std::endl;\n         //std::cout << std::setprecision(50) << expected << std::endl;\n         val = boost::math::float_next(val);\n      }\n      val = boundary;\n      for (unsigned i = 0; i < 200; ++i)\n      {\n         val = boost::math::float_prior(val);\n         mpfr_float_1000 comparison(val);\n         comparison = cos(comparison);\n         T found = cos(val);\n         T expected = T(comparison);\n         BOOST_CHECK_LE(boost::math::epsilon_difference(found, expected), 20);\n      }\n   }\n}\n\nint main()\n{\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::mpf_float_50>();\n   test<boost::multiprecision::mpf_float_100>();\n   boost::multiprecision::mpf_float::default_precision(50);\n   test<boost::multiprecision::mpf_float>();\n   boost::multiprecision::mpf_float::default_precision(100);\n   test<boost::multiprecision::mpf_float>();\n#endif\n#ifdef TEST_MPFR_50\n   boost::multiprecision::mpfr_float::default_precision(50);\n   test<boost::multiprecision::mpfr_float>();\n   boost::multiprecision::mpfr_float::default_precision(100);\n   test<boost::multiprecision::mpfr_float>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>();\n   test<boost::multiprecision::cpp_dec_float_100>();\n#ifndef SLOW_COMPLER\n   // Some \"peculiar\" digit counts which stress our code:\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();\n   // Check low multiprecision digit counts.\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >();\n#endif\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::cpp_bin_float_quad>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cosh.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n//#  define TEST_MPF\n#define TEST_BACKEND\n#define TEST_CPP_DEC_FLOAT\n#define TEST_MPFI_50\n#define TEST_FLOAT128\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(TEST_MPFR_50)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_MPFI_50)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n\ntemplate <class T>\nvoid test()\n{\n   std::cout << \"Testing type: \" << typeid(T).name() << std::endl;\n   static const boost::array<const char*, 51u> data =\n       {{\n           \"1.0560191127459844751259038114395241283965590525302917878166464679729562764239266483419824023679041866569431842053263976225991679105269492268050148624443706785607467750929028856273183654547152707568642275917435773104050171284580773949313906303074811586096214771879801872225500237540725592288167903987152007171391207680034517664218965133028298959753155835975555361514087618679892905973726581183754237665\",\n           \"6.0577917650974496023981039346694689204850927958941226507775366589415588030232830758139222010716099059155799853188868489737439396141346120898610181630988217093945337280471788812956307352429914669334599644412036010014302812555700905490062030666482387008384856645533100266205122930455496234252478878949675888122615795451076521244771554025667181070733415815608287241160724578541982548132473721865287585003\",\n           \"383.32956577005424506758441449272199796616394738942294350035763341369127219359132618750028176886177362785452836065735889720098699937365992620246167965376788963171659530350198190156275836547285437366012371175910490835823389352716981464503672749829183569550509561579181434088407652213421105693358960196044447948190823567291153397039759820680087749250557665869797605969680417240900163183563482342795870741\",\n           \"180470.88335034971169904627554690213669106779370247753503772451628313223853228134148123711258586005038324156900626143047383382773083164188515409766952843294484598668304799186411411329575367546332731190431166613267871177008493921416649792646568096789971466064344922873643120446759328638447781504932928745974584136039698220604099816877847080168890581112550484205291341188894903342677757367415636409890558\",\n           \"6.2781497954189513287619297175142770025826052476955600323495790530946900406209789437212923381830889846578651793922971071825731424267985994598149826652782605981764572599129753631344305259620294513472869937699509893247230674850025066547664563263958672029867981296029855675095947587305949634130736118694040608573981560192569935477462121110619100122692626135788198431038121227062383110684489973794745342204e8\",\n           \"1.613783114750852113223226710244634574082654363427931747177970610142560035434819323665197978270795707611590961019502906079030261920109649748962125930850198625621792763842224096823299250338750953491004408731082880660125641628213970297576817341593254767125933119462446651783267917469179893016103516988279473907996009458208097272806046395206212403180775656514566222835047724943633607736647735739948551096e13\",\n           \"3.0651210048650948869531196671342477415226643123350617715268971834881834615138925908518703584506447138436613632341330640449725016173384960626760387649747643297918807083363913015806893683786389067836005832038060734248371426886808175554210317756018846109627572546314172492701544345965940408777570519312837860014177872754358662463423939942202520475422342889660750666147940146262635303938752019875745307992e18\",\n           \"4.3016893602106215864771434464025735547192956887050537014696231526954713331351791376069506688795159316625154458115179050297716224800318064110052445970764898870599885508391064218065806885129697936678362276766771902589638957537168339190488273555753876162633237990462617955892238424402124353124736879474651977422350856642986446591941163073842974714357745162365700428610167249762162775568692443158879770006e24\",\n           \"4.4608685929681360001024935791890661655506049487122331222491789277138083092507844933483858468341107613657448783043064935174812965310544903547535217357996429824403225005261842368679242972243707736489629610256554995236901040773902962370130989883960298987808008001651650799892267761089302132749037069497452309074389846493140222931714618697738906019885122076310868220596765753447232222740129365498326869428e31\",\n           \"3.4181315955816806472569357441100390029536003312981931954091744304974491527743601285017456624487264929971022746516079644284683284072159616291298593217459064246713801084801182706805865477209408120733740982340972570739267039630582468876075574706187115643861449939429503730606743466086010115127464706315791765264572070452800816054590653675962889901898843712936126341807733200610910325052666512334161414655e39\",\n           \"1.935294628272790810141453021278524976364077691905248015888165919062516673344977091262644262832934899971824373171672037249361491844419302323587942915162859665992916625636813244576210109931852761921719987632855596663907494303248513195744818730879742963301327852160193919379798462926667740594397712731448572837824802330973561570848397758210619453310032286208701226098998940360395267237151018055781640126e48\",\n           \"8.0964449511890098565841496436016431651692307764702784234901741408135381374668439020986470675941110923614446905696411023621632714191313583360826598468217983223558130595633054971338824192327248896500337050246640453410159732184419096917171044075711156867804851018388576371530520943696439917673720450911725466781235347212700849702742625663288687644090935756560022610000629006347244369388824818661974220426e57\",\n           \"2.5028257092625174549175008952222569141816383637904981644379473858250736896174216539673733521627607209322019413420937570273676341726636307131078699799472622998437404149614292337267153201903296102921815263736653035269935857816159086496594269187082442244280898258397047045746728729079796167987895368614037770286371191530575814695859433478185016171380286325273493350193132538052551497175771289873181595171e68\",\n           \"5.7168370213792649967466315312864179662895170192695050789061362839510836418124645968032989149068311018994324517420345278843446068634292140996241291031113395887832891095928020095581695527354104986223411349657526888924224926675682032043363279774947976053895819671003276400297758359779703605970507328706064692923481168676751999124073697599262277247814864401196929320497117521176016017349797292609303756215e79\",\n           \"9.6487261169670031207955841899729386502708125098394777808615183927342163909284025992243201020435915122698808649711566042372911206942311277943247994427354130507790526857797833309691667380623792736661655695464087154725768656507603378053220212067894914686147301550764045337512361478831034999674296837635744344039906734109560908793921568633128400104314078575159786136202769893309913175064586488844295321363e91\",\n           \"1.2032977660238608232537005158851668311089986235965463249220377778638489972355974848209035082333822309902237165042868213438627625544096344578102199846440476859557339736747791529782018329078191477783605471526120466881600981869890379917878811691555316448842731085218988710571211956972016424649758226606500603194972966032036214213759991156778846329137084961334557845326183588274571457361004704490747798678e105\",\n           \"1.1088306081278288754492401130897590262404571813281460605683836139669281218442501421935533170636990866165181664561596333701204545493730707210930818738817252706131805203538144119244917164949716209095542194899833868499263375700313934257155601275526921302332118009966650991624878227108265079219497366770219141098050965023005919495048022616553249266192057652205987267068584616625670961423579715954410508985e119\",\n           \"7.5499880591625965663868042832675300901799245732418501707646792135512053284835138294796976048691668315442427834949618514094329533376442442492757936744857569785450769927581802961191319878260712808001736830227501518832554201816224207300614310712430470538022948957433004829725273067921443635526965673971412049693552004259820173389681647135125678701502084190660111860351299407405357314966388044340723077086e133\",\n           \"3.7985363580067976240250330165300706958269826851549371732460220923459822809007918495780412109700378352703982899561570150646963751463572075768540297484136809462018052149545042828665345287117150392150513078663739946623681053685054650372595872914400423446635806806461783139586204378680585507446218544068845246753010850565341852111017728985713047360191412931479535524815646071456825031827933342626130249175e149\",\n           \"1.4121319341572581270215359848706630542776633675711529687593487346259283960708095601494823112486631023721124235640943167173029348028743563902367757599140008654691320430919753414890689949599421028277624880392344132646738394546195638261279687543208503932172926275294218429086816560213399180179494004109164546844899632385177835442946174689070525154077366030192931540897742543089509897490703511310531249977e166\",\n           \"3.8790307719997974510664339744260233373881096199933152202662556556779783775106563986911859526413282055258612522499767709123313205863879946518297779104337686883587019222829967005608205535314284003183828513113021722123872387036435113517356676447376715595408179555267871947671679098986651665719279348025058713817796876795915844151719103197410787508530261619841035613531488383930867055908047961915279983259e183\",\n           \"7.8733605373835840397434523264038598405672829925651165847065668324385430746087633348848905637835428739401439679896923081980364912472282573695612463537585283007941057172128277340402716645674443632827653710173742423648839359547777694778576675604645880219833375227941998426325886558435214355022240854563558864080627758653439429917072753785194675103766900514602432580639079224631229479607396935864512990879e201\",\n           \"1.1808262995038900942517891457926200063018079695348469762725520377876370005771518954251015338402886097689762895044056273430051256244413916763438966705458118354189107806216991150264176024521937328179762640422127608560103802431672144866013216405157197709788484197720057702118788168789816074560208078260433548283881535909071116553897893659656781376448427981358955547508806938614921874867135186509274509121e221\",\n           \"1.3085817499987842655130548827168955655838432140245228169691892267707778790498773914833199368916114043966197329562444577848635313938483757629541576533880917215885485474416704968999200090496252044959849927443732134176975867869986011315975625868009065373046224716063168977788103866885720471095547385342868632018951910603936835789387464412366605713487321530237148912677199033012777178113821791621549557963e241\",\n           \"1.0715308148006899161903881353829644069217121138682658034413051575604561649576261428568888094218620444635013220705511245290719605273316790249367622122178650529000528086055415007045458486410501636380119413632657994999412652188430063128470336817401482172580366374079331295129200936246446347832380606353293858222758687479612927181530236387227215663399410099251455256898414199913458340065553949424990477448e262\",\n           \"6.483319651006309502237640505955012384293570932602353784849377890534620180296272226076424490097577093511886503973590409376477611667988893542117173598716788837179265384921201772013611631892729250835822804494742316330406688475091973437669111728949960922002370308207819760146543720499389938855072810566961589413895110830251224194598788696990065693705615156654866578134664648091752361824241438921952031149e283\",\n           \"2.8985391304542768293172709775230767981477721528885408305355619530690119426207269563049756824939397157221877775531212262059946098575425050827283362457005503261796116156917077778477251551070762614233325253060283603452216492681531839154649232080928787066338399915850327381614672456102374248950210248266796072457623370079195574322846594267768883120374288952014885152055438195794090975578878933873824774214e306\",\n           \"9.57524433627083921372674145950563946532138741951042299439035158875449060589509856903496678820625880407684156184675763001790613289835869844325821965070261880894138207436003366195024403902162467929095155787852409710735775347490909311196315332711680552044467458169615366116872469435840608534489425322247278926672059747911266981024366989976214521515026692183039600169984107883592297128416659318858313127e329\",\n           \"2.3372734503362369375381009524197350830316472034721759761797536237738670471009423543542251572488229045699598160834162677357730620072441755506075897500940629883044875771104686291523502165266242030847074909362622098365719455332359938746138629161304717385265309980898079489959955157644566232440805137701071311495653330606071611331941246434767948905863368638163788562679785940566685500460815077065003612487e354\",\n           \"4.2155879126937199240969909448599186868484717887298729605150033299123534992857332918168135230843738695925698383815575417820480732378749635394939513838137876524333991937836847074991505476867647762082587225838063325020413513077128321581439429001485977751765798011101092072613053687422983352140468569171564773941232256057064161142341661775359191159220450305300322654184921617310753474842253496677498824723e379\",\n           \"5.6181811613375701248970224378256740494692066242437602652469740512738297599235414593999616891945156186827736326184687322137498447792007445397397290336810468925670064733464757082986791232916898141597610692740388799796632396708149027243436859752526805112778790645096555770227809873695589969805678601106157556386974221647669590827712353133603091803570183764883405340587430017053183637835511899658145649708e405\",\n           \"5.532511069282205350923830187073466127274584467195468607886763750877294392993663821432158885753563495238131394373865428654052604326264330104646257659760161386620716716703631608643312613245804625511813964275109451513736558514977338129201153666764317441936156609643185133981728847167450887861106642311329612564652645663234240748195490808151911497393974690166034839217817023634217121406163178148652748479e432\",\n           \"4.0256666306761331240653217136731531623017017695713942917027851762705346357330788586411431378972009980532310757689380174461664677676028378924382554201434975574729861177781849023768222381429947872325368088023224591306630434887529215459580760863075907686248521168590309636468448648513752893851767315693469638980874648457114335557202115472595647478331668869318302753802858726588719006447471192697846325955e460\",\n           \"2.1644237346681663424601781769159797919834245365230735589058796985974745594485988855971413936820871935714602237643458356241187573307428309041919648027960168541647193436225977495680484218384107820095589356463058222584008532497069179993678533431131233629312850771528970443634604290143149079209513868130585713006080733488491160321145735562062411305931183571279530201672366980412430529846635995189699318073e489\",\n           \"8.5987580981195983662047247216936066485731760315371506386077056691409579856014763032619539539935299716110411688793466397984311640631361934500807639285587334983206556915704635831992012926186843826981296831658998834850783404713050829093753126189556625095994621605300047199962332098857236359801681157419606676412198783092816364336047306243999363335004760439115355072350465422891365411868472688286678516314e518\",\n           \"2.5241673163187127276134610716954724162270290228773641734420864618245211926017624829840685860130579257772126398622324109858115624706486522844752512951837805396709793171502497523431473021570806024043139443284538862368635312799539108264084028032731295487282188616820261689634926427135060887942797635147693849950058672753458576476491733064455826768562371858057444914175251596852571637211466017938478085247e549\",\n           \"5.475067911823387661325942057081957044927796274441278042805014835144678321092623034147031518807063234976073102574257079170283458172046752719724152941316842521196069804425876507927418423409523739261726681120662097159943049401039490818332686968135012747332468921142470970507219403290422458185430415836291605355383658657658638112408092789126678938878667507151950931633694006471359998448912249374833586727e580\",\n           \"8.7750549689950256776639468724574158629603320014390275681028674550826357080136422399476213432791376656222763800628593282303459051561266270006921840049305819767639184391149913915312831894296821356222752594264134130151457242713539248421883837353442181724530706933220158507240760325182068001553294949268596178418634164323874971937997072367419479635154591248667559627811893588163238012665671798461211917208e612\",\n           \"1.0392000158337773273751156576416024664653679689973856373456304843339302977923254238376497044027728158058903302390909588333829463843362779584402914847447592731182614369968957680281500946805571235013941407979569788567794900810257154433592958167545186687137810101848000107335074486050959387974516414654638879740966175786016492797845169374594168995878543584318334800124941205910589727264397237600733483158e646\",\n           \"9.0936326753636727240574546678839170665019169110943878894933093211555976995701468041449327370073681898690638466136204694745206283652338526673125958055131610409923286526192661778126811265116493171283319361595267283588121098349703951929669281966675596890266483864217591555707552765565756842701056144290075867893520379419521775913047964393758374891516340929062076304350159966063972713118995033247759001609e679\",\n           \"5.8798281636930489964162009429009257867906792508058801627042121953599912951265315933723440185825519080102988056836911095299854840387008575164090793635997912930561430335216151607097220208013034399895832350235280120270626904356196935166701773768680311063264380891331021514518757839220818506905997847228783439015252768055166165941582030353226255576433910936297965207260585437762430381969160714956727596198e714\",\n           \"2.8091881292911108404345975896815558958477835260737794579417284512413473388968057587088555041266297486841923628702282019643659456724373332519583025947015025975126598748630623031951723754960589046233996595466021913942587558326660593063197905288573353559106884645285531497626940379800500474282446929237914568534665868703742731713632349090897884403966643055728471509474896855575286123275564417626861566706e750\",\n           \"9.917129372597671132067673866739246238179742417231064062960232866725337575281938597212073697168000155027158148165861617400080837699968785505107579831803685516054837447325150388867488754170677228096524224392410232206238263933144338637103531441623303187445874039234973380151391274490746625993568552049954630793219419614845431626975962881182662815760423226111647056071831411664335144052772436215105801395e786\",\n           \"2.5869027163543111121878679987081647715187872826677398475096738640583659800068967379551376322170347537454918190603891312949716382621902484616361664158953484778255247083652726854621059785392022847887382779010079407502679229021085320675903109573769331277413372272363218896397965662581357886739691376204316908974081821980432178065394228926767529685562155837452626029223937027004015040825450642409597700449e824\",\n           \"4.9861251931207080923785686798881789193813879610842675205361210155894774686328710893906543682447029206928934967525495260314937837003448878215156341411477636831113484416124080974502217578408248150338565305116223944900839866528622960352723938548713319425798453345402992146078868053263606234074443024155243450623634720912438841022969909473424559262711669905282193529250216454066716533180418518228387188393e862\",\n           \"7.1012569014339068241101751233953234216522840280342406520909288232012799547871960723719836516359548198842749536961644100550279020276709043358260853581760590386456213180291689322352732545965831405519844109680619067101311180959399339922706596098526969148981173519865139508665631317310424178378833370605922449094745510812618563813537347841030916512147874232760564378443782164868016244561788356251308121716e901\",\n           \"7.4730215360486642135431754747074885377840195683583018254892502245011973712084221116813364423492802080799768174534590613188275471080608467087354983850284805514875889145266688973752185071777341375422809910165581997555433091939959406569831183459872344778707098094941193489061532160249775856426569696127193453339548371679229676272663084782830276508737129506676031759345288056484158647796152349867328841634e941\",\n           \"5.8109375364209112227579654658730977030869454388607076903639465992296616832002964138000947668837140543325908222688655359602408511410663722770167244801973012245657865182739637159804595049180263175014778215232564251739259624759589953677661356104554831551073263668188283861123521688445132164147762321111597028523130093864153999974376790494383016372210442340324038686843345053322425194077414241243050491297e982\",\n           \"3.33875955701899627718146291382268063073604182131575843695486667154496711979350813988644889979275310892951143249901398447859083674739840084454465850475774696325142148671937407108540250845900941142800157345665761403930889797424808979569550325271558518404559007551625637761142662107757913763221912282957681784053564387104062317729788737215450574233690655931888608424916152893688106181220341997128198692e1024\",\n           \"1.4174672877823334709610117319768830739080734407353905145632612088824955720198734996604261250019291955883620333545750761619015467840567122066622229379056280064206319780047687015558007624774062399477328822231085767309831266032616053065858739373818651687128093335640388513396191118537181280334430292439188737524362269789272308905723812818882228503013875816702686587035844437102478263525616196832018321602e1067\",\n           \"4.4466189016791091516801723880812533528438597080549410911235655611382010503145789286158745555771483577943662768773465284793798720178177605712848440200402906836390133865748188969184005230383247111166918721449908133920663776952786683837038180436264738937354101153867171804315769471050303182129269442292354388037298125177941217926845803005587166270803697433886463469168814941555804311717400657004050157245e1110\",\n       }};\n\n   T eg = static_cast<T>(\"5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1\");\n\n   unsigned max_err = 0;\n   for (unsigned k = 0; k < data.size(); k++)\n   {\n      const T  x   = eg + k;\n      T        val = boost::multiprecision::cosh(x * x);\n      T        e   = relative_error(val, T(data[k]));\n      unsigned err = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         std::cout << x * x << std::endl;\n         max_err = err;\n      }\n      val = boost::multiprecision::cosh(-x * x);\n      e   = relative_error(val, T(data[k]));\n      err = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         std::cout << x * x << std::endl;\n         max_err = err;\n      }\n   }\n   std::cout << \"Max error was: \" << max_err << std::endl;\n   BOOST_TEST(max_err < 2000);\n}\n\nint main()\n{\n#ifdef TEST_BACKEND\n   test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();\n#endif\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::mpf_float_50>();\n   test<boost::multiprecision::mpf_float_100>();\n#endif\n#ifdef TEST_MPFR_50\n   test<boost::multiprecision::mpfr_float_50>();\n   test<boost::multiprecision::mpfr_float_100>();\n#endif\n#ifdef TEST_MPFI_50\n   test<boost::multiprecision::mpfi_float_50>();\n   test<boost::multiprecision::mpfi_float_100>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>();\n   test<boost::multiprecision::cpp_dec_float_100>();\n#ifndef SLOW_COMPLER\n   // Some \"peculiar\" digit counts which stress our code:\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();\n#endif\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cpp_bin_float.cpp",
    "content": "// Copyright John Maddock 2013.\n\n// Use, modification and distribution are subject to the\n// Boost Software License, Version 1.0.\n// (See accompanying file LICENSE_1_0.txt\n// or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#ifdef TEST_MPFR\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include \"libs/multiprecision/test/test.hpp\"\n#include <iostream>\n#include <iomanip>\n\ntemplate <class T>\nT generate_random()\n{\n   typedef int                   e_type;\n   static boost::random::mt19937 gen;\n   T                             val      = gen();\n   T                             prev_val = -1;\n   while (val != prev_val)\n   {\n      val *= (gen.max)();\n      prev_val = val;\n      val += gen();\n   }\n   e_type e;\n   val = frexp(val, &e);\n\n   static boost::random::uniform_int_distribution<e_type> ui(-20, 20);\n   return ldexp(val, ui(gen));\n}\n\nusing namespace boost::multiprecision;\n#ifdef TEST_MPFR\ntypedef number<mpfr_float_backend<35> > good_type;\n#else\ntypedef double good_type;\n#endif\ntypedef number<cpp_bin_float<std::numeric_limits<good_type>::digits, digit_base_2>, et_off> test_type;\n\nvoid test_special_cases()\n{\n#if !defined(BOOST_CI_ASAN_BUILD) && !defined(BOOST_CI_USAN_BUID)\n   test_type max_val     = (std::numeric_limits<test_type>::max)();\n   test_type min_val     = (std::numeric_limits<test_type>::min)();\n   test_type eps         = std::numeric_limits<test_type>::epsilon();\n   test_type inf_val     = (std::numeric_limits<test_type>::infinity)();\n   test_type nan_val     = (std::numeric_limits<test_type>::quiet_NaN)();\n   test_type half        = 0.5;\n   test_type one_point_5 = 1.5;\n\n   BOOST_CHECK((boost::math::isnormal)(max_val));\n   BOOST_CHECK((boost::math::isnormal)(-max_val));\n   BOOST_CHECK((boost::math::isnormal)(min_val));\n   BOOST_CHECK((boost::math::isnormal)(-min_val));\n   BOOST_CHECK((boost::math::isinf)(inf_val));\n   BOOST_CHECK((boost::math::isinf)(-inf_val));\n   BOOST_CHECK((boost::math::isnan)(nan_val));\n   BOOST_CHECK((boost::math::isnan)(-nan_val));\n\n   if (std::numeric_limits<test_type>::has_denorm)\n      min_val = std::numeric_limits<test_type>::denorm_min();\n\n   // Adding epsilon will increment 1.0:\n   BOOST_CHECK(test_type(1) + eps != test_type(1));\n   BOOST_CHECK(test_type(1) + eps / 2 == test_type(1));\n   // But it's not the smallest value that will do that:\n   test_type small = 1 + eps;\n   small           = ldexp(small, -std::numeric_limits<test_type>::digits);\n   BOOST_CHECK(test_type(1) + small != test_type(1));\n   // And if we increment 1.0 first, then an even smaller\n   // addition will round up:\n   test_type one_next = test_type(1) + eps;\n   BOOST_CHECK(one_next + eps / 2 != one_next);\n\n   // Overflow:\n   BOOST_CHECK_EQUAL(max_val + max_val * eps, inf_val);\n   BOOST_CHECK_EQUAL(-max_val - max_val * eps, -inf_val);\n   BOOST_CHECK_EQUAL(max_val * 2, inf_val);\n   BOOST_CHECK_EQUAL(max_val * -2, -inf_val);\n   BOOST_CHECK_EQUAL(max_val / half, inf_val);\n   BOOST_CHECK_EQUAL(max_val / -half, -inf_val);\n   BOOST_CHECK_EQUAL(max_val / min_val, inf_val);\n   BOOST_CHECK_EQUAL(max_val / -min_val, -inf_val);\n   // Underflow:\n   BOOST_CHECK_EQUAL(min_val * 2 - one_point_5 * min_val, 0);\n   BOOST_CHECK_EQUAL(-min_val * 2 + one_point_5 * min_val, 0);\n   BOOST_CHECK_EQUAL(min_val / 2, 0);\n   BOOST_CHECK_EQUAL(min_val / max_val, 0);\n   BOOST_CHECK_EQUAL(min_val * half, 0);\n   BOOST_CHECK_EQUAL(min_val - min_val, 0);\n   BOOST_CHECK_EQUAL(max_val - max_val, 0);\n   BOOST_CHECK_EQUAL(-min_val + min_val, 0);\n   BOOST_CHECK_EQUAL(-max_val + max_val, 0);\n   // Things which should not over/underflow:\n   BOOST_CHECK_EQUAL((min_val * 2) / 2, min_val);\n   BOOST_CHECK_EQUAL((max_val / 2) * 2, max_val);\n   BOOST_CHECK_GE((min_val * 2.0000001) / 1.9999999999999999, min_val);\n   BOOST_CHECK_LE((max_val / 2.0000001) * 1.9999999999999999, max_val);\n   BOOST_CHECK_EQUAL(min_val * 2 - min_val, min_val);\n   BOOST_CHECK_EQUAL(max_val / 2 + max_val / 2, max_val);\n   // Things involving zero:\n   BOOST_CHECK_EQUAL(max_val + 0, max_val);\n   BOOST_CHECK_EQUAL(max_val - 0, max_val);\n   BOOST_CHECK_EQUAL(0 + max_val, max_val);\n   BOOST_CHECK_EQUAL(0 - max_val, -max_val);\n   BOOST_CHECK_EQUAL(max_val * 0, 0);\n   BOOST_CHECK_EQUAL(0 * max_val, 0);\n   BOOST_CHECK_EQUAL(max_val / 0, inf_val);\n   BOOST_CHECK_EQUAL(0 / max_val, 0);\n   BOOST_CHECK_EQUAL(-max_val / 0, -inf_val);\n   BOOST_CHECK_EQUAL(0 / -max_val, 0);\n   // Things involving infinity:\n   BOOST_CHECK_EQUAL(inf_val + 2, inf_val);\n   BOOST_CHECK_EQUAL(inf_val - 2, inf_val);\n   BOOST_CHECK_EQUAL(inf_val + -2, inf_val);\n   BOOST_CHECK_EQUAL(inf_val - -2, inf_val);\n   BOOST_CHECK_EQUAL(-inf_val + 2, -inf_val);\n   BOOST_CHECK_EQUAL(-inf_val - 2, -inf_val);\n   BOOST_CHECK_EQUAL(-inf_val + -2, -inf_val);\n   BOOST_CHECK_EQUAL(-inf_val - -2, -inf_val);\n\n   BOOST_CHECK_EQUAL(2 + inf_val, inf_val);\n   BOOST_CHECK_EQUAL(2 - inf_val, -inf_val);\n   BOOST_CHECK_EQUAL(-2 + inf_val, inf_val);\n   BOOST_CHECK_EQUAL(-2 - inf_val, -inf_val);\n   BOOST_CHECK_EQUAL(2 + (-inf_val), -inf_val);\n   BOOST_CHECK_EQUAL(2 - (-inf_val), inf_val);\n   BOOST_CHECK_EQUAL(-2 + (-inf_val), -inf_val);\n   BOOST_CHECK_EQUAL(-2 - (-inf_val), inf_val);\n\n   BOOST_CHECK_EQUAL(sqrt(inf_val), inf_val);\n   BOOST_CHECK(boost::math::isnan(sqrt(-inf_val)));\n\n   BOOST_CHECK_EQUAL(inf_val + test_type(2), inf_val);\n   BOOST_CHECK_EQUAL(inf_val - test_type(2), inf_val);\n   BOOST_CHECK_EQUAL(inf_val + test_type(-2), inf_val);\n   BOOST_CHECK_EQUAL(inf_val - test_type(-2), inf_val);\n   BOOST_CHECK_EQUAL(-inf_val + test_type(2), -inf_val);\n   BOOST_CHECK_EQUAL(-inf_val - test_type(2), -inf_val);\n   BOOST_CHECK_EQUAL(-inf_val + test_type(-2), -inf_val);\n   BOOST_CHECK_EQUAL(-inf_val - test_type(-2), -inf_val);\n\n   BOOST_CHECK_EQUAL(test_type(2) + inf_val, inf_val);\n   BOOST_CHECK_EQUAL(test_type(2) - inf_val, -inf_val);\n   BOOST_CHECK_EQUAL(test_type(-2) + inf_val, inf_val);\n   BOOST_CHECK_EQUAL(test_type(-2) - inf_val, -inf_val);\n   BOOST_CHECK_EQUAL(test_type(2) + (-inf_val), -inf_val);\n   BOOST_CHECK_EQUAL(test_type(2) - (-inf_val), inf_val);\n   BOOST_CHECK_EQUAL(test_type(-2) + (-inf_val), -inf_val);\n   BOOST_CHECK_EQUAL(test_type(-2) - (-inf_val), inf_val);\n\n   BOOST_CHECK((boost::math::isnan)(inf_val - inf_val));\n   BOOST_CHECK_EQUAL(inf_val * 2, inf_val);\n   BOOST_CHECK_EQUAL(-inf_val * 2, -inf_val);\n   BOOST_CHECK_EQUAL(inf_val * -2, -inf_val);\n   BOOST_CHECK_EQUAL(-inf_val * -2, inf_val);\n   BOOST_CHECK_EQUAL(inf_val * test_type(-2), -inf_val);\n   BOOST_CHECK_EQUAL(-inf_val * test_type(-2), inf_val);\n   BOOST_CHECK((boost::math::isnan)(inf_val * 0));\n   BOOST_CHECK((boost::math::isnan)(-inf_val * 0));\n   BOOST_CHECK_EQUAL(inf_val / 2, inf_val);\n   BOOST_CHECK_EQUAL(-inf_val / 2, -inf_val);\n   BOOST_CHECK_EQUAL(inf_val / -2, -inf_val);\n   BOOST_CHECK_EQUAL(-inf_val / -2, inf_val);\n   BOOST_CHECK_EQUAL(inf_val / test_type(-2), -inf_val);\n   BOOST_CHECK_EQUAL(-inf_val / test_type(-2), inf_val);\n   BOOST_CHECK_EQUAL(inf_val / 0, inf_val);\n   BOOST_CHECK_EQUAL(-inf_val / 0, -inf_val);\n   BOOST_CHECK((boost::math::isnan)(inf_val / inf_val));\n   BOOST_CHECK((boost::math::isnan)(-inf_val / inf_val));\n   // Things involving nan:\n   BOOST_CHECK((boost::math::isnan)(nan_val + 2));\n   BOOST_CHECK((boost::math::isnan)(nan_val - 2));\n   BOOST_CHECK((boost::math::isnan)(nan_val + 0));\n   BOOST_CHECK((boost::math::isnan)(nan_val - 0));\n   BOOST_CHECK((boost::math::isnan)(nan_val + inf_val));\n   BOOST_CHECK((boost::math::isnan)(nan_val - inf_val));\n   BOOST_CHECK((boost::math::isnan)(nan_val + nan_val));\n   BOOST_CHECK((boost::math::isnan)(nan_val - nan_val));\n   BOOST_CHECK((boost::math::isnan)(2 + nan_val));\n   BOOST_CHECK((boost::math::isnan)(2 - nan_val));\n   BOOST_CHECK((boost::math::isnan)(0 - nan_val));\n   BOOST_CHECK((boost::math::isnan)(0 - nan_val));\n   BOOST_CHECK((boost::math::isnan)(inf_val + nan_val));\n   BOOST_CHECK((boost::math::isnan)(inf_val - nan_val));\n   BOOST_CHECK((boost::math::isnan)(nan_val * 2));\n   BOOST_CHECK((boost::math::isnan)(nan_val / 2));\n   BOOST_CHECK((boost::math::isnan)(nan_val * 0));\n   BOOST_CHECK((boost::math::isnan)(nan_val / 0));\n   BOOST_CHECK((boost::math::isnan)(nan_val * inf_val));\n   BOOST_CHECK((boost::math::isnan)(nan_val / inf_val));\n   BOOST_CHECK((boost::math::isnan)(nan_val * nan_val));\n   BOOST_CHECK((boost::math::isnan)(nan_val / nan_val));\n   BOOST_CHECK((boost::math::isnan)(2 * nan_val));\n   BOOST_CHECK((boost::math::isnan)(2 / nan_val));\n   BOOST_CHECK((boost::math::isnan)(0 / nan_val));\n   BOOST_CHECK((boost::math::isnan)(0 / nan_val));\n   BOOST_CHECK((boost::math::isnan)(inf_val * nan_val));\n   BOOST_CHECK((boost::math::isnan)(inf_val / nan_val));\n   // Corner cases:\n   BOOST_CHECK_EQUAL((max_val * half) / half, max_val);\n   BOOST_CHECK_EQUAL((max_val / 2) * 2, max_val);\n   BOOST_CHECK_EQUAL((min_val / half) * half, min_val);\n   BOOST_CHECK_EQUAL((min_val * 2) / 2, min_val);\n   BOOST_CHECK_EQUAL(max_val + min_val, max_val);\n   BOOST_CHECK_EQUAL(min_val + max_val, max_val);\n   BOOST_CHECK_EQUAL(max_val - min_val, max_val);\n   BOOST_CHECK_EQUAL(min_val - max_val, -max_val);\n   // Signed zeros:\n   BOOST_CHECK(boost::math::signbit(min_val * -min_val));\n   BOOST_CHECK(boost::math::signbit(min_val * min_val) == 0);\n   BOOST_CHECK(boost::math::signbit(-min_val * -min_val) == 0);\n   BOOST_CHECK(boost::math::signbit(-min_val * min_val));\n   BOOST_CHECK(boost::math::signbit(min_val / max_val) == 0);\n   BOOST_CHECK(boost::math::signbit(min_val / -max_val));\n   BOOST_CHECK(boost::math::signbit(-min_val / -max_val) == 0);\n   BOOST_CHECK(boost::math::signbit(-min_val / max_val));\n   BOOST_CHECK(boost::math::signbit(min_val / 2) == 0);\n   BOOST_CHECK(boost::math::signbit(min_val / -2));\n   BOOST_CHECK(boost::math::signbit(-min_val / -2) == 0);\n   BOOST_CHECK(boost::math::signbit(-min_val / 2));\n   test_type neg_zero = min_val * -min_val;\n   test_type zero     = 0;\n   // Arithmetic involving signed zero:\n   BOOST_CHECK_EQUAL(-neg_zero, 0);\n   BOOST_CHECK(!boost::math::signbit(-neg_zero));\n   BOOST_CHECK_EQUAL(neg_zero + 2, 2);\n   BOOST_CHECK_EQUAL(neg_zero + test_type(2), 2);\n   BOOST_CHECK_EQUAL(2 + neg_zero, 2);\n   BOOST_CHECK_EQUAL(test_type(2) + neg_zero, 2);\n   BOOST_CHECK_EQUAL(neg_zero + -2, -2);\n   BOOST_CHECK_EQUAL(neg_zero + test_type(-2), -2);\n   BOOST_CHECK_EQUAL(-2 + neg_zero, -2);\n   BOOST_CHECK_EQUAL(test_type(-2) + neg_zero, -2);\n   BOOST_CHECK_EQUAL(neg_zero - 2, -2);\n   BOOST_CHECK_EQUAL(neg_zero - test_type(2), -2);\n   BOOST_CHECK_EQUAL(2 - neg_zero, 2);\n   BOOST_CHECK_EQUAL(test_type(2) - neg_zero, 2);\n   BOOST_CHECK_EQUAL(neg_zero - -2, 2);\n   BOOST_CHECK_EQUAL(neg_zero - test_type(-2), 2);\n   BOOST_CHECK_EQUAL(-2 - neg_zero, -2);\n   BOOST_CHECK_EQUAL(test_type(-2) - neg_zero, -2);\n   BOOST_CHECK(!boost::math::signbit(test_type(2) + test_type(-2)));\n   BOOST_CHECK(!boost::math::signbit(test_type(2) - test_type(2)));\n   BOOST_CHECK(!boost::math::signbit(test_type(-2) - test_type(-2)));\n   BOOST_CHECK(!boost::math::signbit(test_type(-2) + test_type(2)));\n   BOOST_CHECK(!boost::math::signbit(zero + zero));\n   BOOST_CHECK(!boost::math::signbit(zero - zero));\n   BOOST_CHECK(!boost::math::signbit(neg_zero + zero));\n   BOOST_CHECK(!boost::math::signbit(zero + neg_zero));\n   BOOST_CHECK(boost::math::signbit(neg_zero + neg_zero));\n   BOOST_CHECK(boost::math::signbit(neg_zero - zero));\n   BOOST_CHECK(!boost::math::signbit(zero - neg_zero));\n   BOOST_CHECK(!boost::math::signbit(neg_zero - neg_zero));\n   small = 0.25;\n   BOOST_CHECK(!boost::math::signbit(floor(small)));\n   BOOST_CHECK(!boost::math::signbit(round(small)));\n   BOOST_CHECK(!boost::math::signbit(trunc(small)));\n   small = -small;\n   BOOST_CHECK(boost::math::signbit(ceil(small)));\n   BOOST_CHECK(boost::math::signbit(round(small)));\n   BOOST_CHECK(boost::math::signbit(trunc(small)));\n\n   BOOST_CHECK_EQUAL(neg_zero * 2, 0);\n   BOOST_CHECK_EQUAL(neg_zero * test_type(2), 0);\n   BOOST_CHECK_EQUAL(2 * neg_zero, 0);\n   BOOST_CHECK_EQUAL(test_type(2) * neg_zero, 0);\n   BOOST_CHECK_EQUAL(neg_zero * -2, 0);\n   BOOST_CHECK_EQUAL(neg_zero * test_type(-2), 0);\n   BOOST_CHECK_EQUAL(-2 * neg_zero, 0);\n   BOOST_CHECK_EQUAL(test_type(-2) * neg_zero, 0);\n   BOOST_CHECK(boost::math::signbit(neg_zero * 2));\n   BOOST_CHECK(boost::math::signbit(neg_zero * test_type(2)));\n   BOOST_CHECK(boost::math::signbit(2 * neg_zero));\n   BOOST_CHECK(boost::math::signbit(test_type(2) * neg_zero));\n   BOOST_CHECK(!boost::math::signbit(neg_zero * -2));\n   BOOST_CHECK(!boost::math::signbit(neg_zero * test_type(-2)));\n   BOOST_CHECK(!boost::math::signbit(-2 * neg_zero));\n   BOOST_CHECK(!boost::math::signbit(test_type(-2) * neg_zero));\n\n   BOOST_CHECK_EQUAL(neg_zero / 2, 0);\n   BOOST_CHECK_EQUAL(neg_zero / test_type(2), 0);\n   BOOST_CHECK_EQUAL(2 / neg_zero, -inf_val);\n   BOOST_CHECK_EQUAL(test_type(2) / neg_zero, -inf_val);\n   BOOST_CHECK_EQUAL(neg_zero / -2, 0);\n   BOOST_CHECK_EQUAL(neg_zero / test_type(-2), 0);\n   BOOST_CHECK_EQUAL(-2 / neg_zero, inf_val);\n   BOOST_CHECK_EQUAL(test_type(-2) / neg_zero, inf_val);\n   BOOST_CHECK(boost::math::signbit(neg_zero / 2));\n   BOOST_CHECK(boost::math::signbit(neg_zero / test_type(2)));\n   BOOST_CHECK(boost::math::signbit(2 / neg_zero));\n   BOOST_CHECK(boost::math::signbit(test_type(2) / neg_zero));\n   BOOST_CHECK(!boost::math::signbit(neg_zero / -2));\n   BOOST_CHECK(!boost::math::signbit(neg_zero / test_type(-2)));\n   BOOST_CHECK(!boost::math::signbit(-2 / neg_zero));\n   BOOST_CHECK(!boost::math::signbit(test_type(-2) / neg_zero));\n\n   BOOST_CHECK(boost::math::signbit(neg_zero.convert_to<double>()));\n   BOOST_CHECK(boost::math::signbit(neg_zero.convert_to<float>()));\n   BOOST_CHECK(boost::math::signbit(neg_zero.convert_to<long double>()));\n   BOOST_CHECK(!boost::math::signbit(zero.convert_to<double>()));\n   BOOST_CHECK(!boost::math::signbit(zero.convert_to<float>()));\n   BOOST_CHECK(!boost::math::signbit(zero.convert_to<long double>()));\n\n   // Conversions to other types of special values:\n   if (std::numeric_limits<float>::has_infinity)\n   {\n      BOOST_CHECK_EQUAL(inf_val.convert_to<float>(), std::numeric_limits<float>::infinity());\n      BOOST_CHECK_EQUAL((-inf_val).convert_to<float>(), -std::numeric_limits<float>::infinity());\n   }\n   if (std::numeric_limits<float>::has_quiet_NaN)\n   {\n      BOOST_CHECK((boost::math::isnan)(nan_val.convert_to<float>()));\n   }\n   if (std::numeric_limits<double>::has_infinity)\n   {\n      BOOST_CHECK_EQUAL(inf_val.convert_to<double>(), std::numeric_limits<double>::infinity());\n      BOOST_CHECK_EQUAL((-inf_val).convert_to<double>(), -std::numeric_limits<double>::infinity());\n   }\n   if (std::numeric_limits<double>::has_quiet_NaN)\n   {\n      BOOST_CHECK((boost::math::isnan)(nan_val.convert_to<double>()));\n   }\n   if (std::numeric_limits<long double>::has_infinity)\n   {\n      BOOST_CHECK_EQUAL(inf_val.convert_to<long double>(), std::numeric_limits<long double>::infinity());\n      BOOST_CHECK_EQUAL((-inf_val).convert_to<long double>(), -std::numeric_limits<long double>::infinity());\n   }\n   if (std::numeric_limits<long double>::has_quiet_NaN)\n   {\n      BOOST_CHECK((boost::math::isnan)(nan_val.convert_to<long double>()));\n   }\n   //\n   // Bug https://svn.boost.org/trac/boost/attachment/ticket/12580\n   //\n   using std::ldexp;\n   test_type a(1);\n   test_type b = ldexp(test_type(0.99), -std::numeric_limits<test_type>::digits);\n   good_type ga(1);\n   good_type gb = ldexp(good_type(0.99), -std::numeric_limits<good_type>::digits);\n   BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));\n\n   b  = ldexp(test_type(0.5), -std::numeric_limits<test_type>::digits);\n   gb = ldexp(good_type(0.5), -std::numeric_limits<good_type>::digits);\n   BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));\n\n   b  = ldexp(test_type(1), -std::numeric_limits<test_type>::digits);\n   gb = ldexp(good_type(1), -std::numeric_limits<good_type>::digits);\n   BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));\n\n   b  = ldexp(test_type(0.50000000001), -std::numeric_limits<test_type>::digits);\n   gb = ldexp(good_type(0.50000000001), -std::numeric_limits<good_type>::digits);\n   BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));\n\n   a  = a + ldexp(a, -20);\n   ga = ga + ldexp(ga, -20);\n   BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));\n\n   b  = ldexp(test_type(0.5), -std::numeric_limits<test_type>::digits);\n   gb = ldexp(good_type(0.5), -std::numeric_limits<good_type>::digits);\n   BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));\n\n   b  = ldexp(test_type(1), -std::numeric_limits<test_type>::digits);\n   gb = ldexp(good_type(1), -std::numeric_limits<good_type>::digits);\n   BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));\n\n   b  = ldexp(test_type(0.50000000001), -std::numeric_limits<test_type>::digits);\n   gb = ldexp(good_type(0.50000000001), -std::numeric_limits<good_type>::digits);\n   BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));\n\n   a  = 1;\n   a  = boost::math::float_prior(a);\n   ga = 1;\n   ga = boost::math::float_prior(ga);\n   BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));\n\n   b  = ldexp(test_type(0.5), -std::numeric_limits<test_type>::digits);\n   gb = ldexp(good_type(0.5), -std::numeric_limits<good_type>::digits);\n   BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));\n\n   b  = ldexp(test_type(1), -std::numeric_limits<test_type>::digits);\n   gb = ldexp(good_type(1), -std::numeric_limits<good_type>::digits);\n   BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));\n\n   b  = ldexp(test_type(0.50000000001), -std::numeric_limits<test_type>::digits);\n   gb = ldexp(good_type(0.50000000001), -std::numeric_limits<good_type>::digits);\n   BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));\n\n   a = boost::math::float_next(test_type(1));\n   ga = boost::math::float_next(good_type(1));\n   b  = ldexp(boost::math::float_prior(test_type(1)), -std::numeric_limits<test_type>::digits);\n   gb = ldexp(boost::math::float_prior(good_type(1)), -std::numeric_limits<test_type>::digits);\n   BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));\n\n   b = ldexp(b, -1);\n   gb = ldexp(gb, -1);\n   BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));\n\n   a = 1.75;  // even mantissa, not a power of 2\n   ga = 1.75;\n   b  = ldexp(test_type(1), -std::numeric_limits<test_type>::digits);\n   gb = ldexp(good_type(1), -std::numeric_limits<test_type>::digits);\n   BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));\n   b = ldexp(b, -1);\n   gb = ldexp(gb, -1);\n   BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));\n\n   b  = ldexp(boost::math::float_prior(test_type(1)), -std::numeric_limits<test_type>::digits);\n   gb = ldexp(boost::math::float_prior(good_type(1)), -std::numeric_limits<test_type>::digits);\n   BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));\n\n   b  = ldexp(b, -1);\n   gb = ldexp(gb, -1);\n   BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));\n\n   b  = ldexp(test_type(0.75), -std::numeric_limits<test_type>::digits);  // even mantissa not a power of 2.\n   gb = ldexp(good_type(0.75), -std::numeric_limits<test_type>::digits);\n   BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));\n\n   b  = ldexp(b, -1);\n   gb = ldexp(gb, -1);\n   BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));\n\n   BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));\n   BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));\n   BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));\n   #endif\n}\n\nint main()\n{\n   // compile times are too long for CI when ASAN is enabled, prune things down a bit:\n#if !defined(BOOST_CI_ASAN_BUILD) && !defined(BOOST_CI_USAN_BUID)\n   test_special_cases();\n#endif\n   unsigned error_count = 0;\n   for (unsigned i = 0; i < 100000; ++i)\n   {\n      good_type a = generate_random<good_type>();\n      good_type b = generate_random<good_type>();\n      test_type ta(a);\n      test_type tb(b);\n      BOOST_CHECK_EQUAL(test_type(a * b), ta * tb);\n      BOOST_CHECK_EQUAL(test_type(-a * b), -ta * tb);\n      BOOST_CHECK_EQUAL(test_type(a * -b), ta * -tb);\n      BOOST_CHECK_EQUAL(test_type(-a * -b), -ta * -tb);\n\n      BOOST_CHECK_EQUAL(test_type(a + b), ta + tb);\n      BOOST_CHECK_EQUAL(test_type(-a + b), -ta + tb);\n      BOOST_CHECK_EQUAL(test_type(a + -b), ta + -tb);\n      BOOST_CHECK_EQUAL(test_type(-a + -b), -ta + -tb);\n\n      BOOST_CHECK_EQUAL(test_type(a - b), ta - tb);\n      BOOST_CHECK_EQUAL(test_type(-a - b), -ta - tb);\n      BOOST_CHECK_EQUAL(test_type(a - -b), ta - -tb);\n      BOOST_CHECK_EQUAL(test_type(-a - -b), -ta - -tb);\n\n      BOOST_CHECK_EQUAL(test_type(a / b), ta / tb);\n      BOOST_CHECK_EQUAL(test_type(-a / b), -ta / tb);\n      BOOST_CHECK_EQUAL(test_type(a / -b), ta / -tb);\n      BOOST_CHECK_EQUAL(test_type(-a / -b), -ta / -tb);\n\n      BOOST_CHECK_EQUAL(test_type(sqrt(a)), sqrt(ta));\n      BOOST_CHECK_EQUAL(test_type(floor(a)), floor(ta));\n      BOOST_CHECK_EQUAL(test_type(floor(-a)), floor(-ta));\n      BOOST_CHECK_EQUAL(test_type(ceil(a)), ceil(ta));\n      BOOST_CHECK_EQUAL(test_type(ceil(-a)), ceil(-ta));\n\n#ifdef TEST_MPFR\n      //\n      // Conversions:\n      //\n      BOOST_CHECK_EQUAL(a.convert_to<double>(), ta.convert_to<double>());\n      BOOST_CHECK_EQUAL(a.convert_to<float>(), ta.convert_to<float>());\n      BOOST_CHECK_EQUAL(b.convert_to<double>(), tb.convert_to<double>());\n      BOOST_CHECK_EQUAL(b.convert_to<float>(), tb.convert_to<float>());\n#else\n      BOOST_CHECK_EQUAL(a, ta.convert_to<double>());\n      BOOST_CHECK_EQUAL(static_cast<float>(a), ta.convert_to<float>());\n      BOOST_CHECK_EQUAL(b, tb.convert_to<double>());\n      BOOST_CHECK_EQUAL(static_cast<float>(b), tb.convert_to<float>());\n#endif\n\n      static boost::random::mt19937 i_gen;\n\n      int si = i_gen();\n      BOOST_CHECK_EQUAL(test_type(a * si), ta * si);\n      BOOST_CHECK_EQUAL(test_type(-a * si), -ta * si);\n      BOOST_CHECK_EQUAL(test_type(-a * -si), -ta * -si);\n      BOOST_CHECK_EQUAL(test_type(a * -si), ta * -si);\n      unsigned ui = std::abs(si);\n      BOOST_CHECK_EQUAL(test_type(a * ui), ta * ui);\n      BOOST_CHECK_EQUAL(test_type(-a * ui), -ta * ui);\n\n      // Divide:\n      BOOST_CHECK_EQUAL(test_type(a / si), ta / si);\n      BOOST_CHECK_EQUAL(test_type(-a / si), -ta / si);\n      BOOST_CHECK_EQUAL(test_type(-a / -si), -ta / -si);\n      BOOST_CHECK_EQUAL(test_type(a / -si), ta / -si);\n      BOOST_CHECK_EQUAL(test_type(a / ui), ta / ui);\n      BOOST_CHECK_EQUAL(test_type(-a / ui), -ta / ui);\n      // Error reporting:\n      if ((unsigned)boost::detail::test_errors() != error_count)\n      {\n         error_count = boost::detail::test_errors();\n         std::cout << std::setprecision(std::numeric_limits<test_type>::max_digits10) << std::scientific;\n         std::cout << \"a (mpfr) = \" << a << std::endl;\n         std::cout << \"a (test) = \" << ta << std::endl;\n         std::cout << \"b (mpfr) = \" << b << std::endl;\n         std::cout << \"b (test) = \" << tb << std::endl;\n         std::cout << \"si       = \" << si << std::endl;\n         std::cout << \"ui       = \" << ui << std::endl;\n      }\n   }\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cpp_bin_float_conv.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include <cstdint>\n\ntemplate <class T>\nT generate_random()\n{\n   typedef int                   e_type;\n   static boost::random::mt19937 gen;\n   T                             val      = gen();\n   T                             prev_val = -1;\n   while (val != prev_val)\n   {\n      val *= (gen.max)();\n      prev_val = val;\n      val += gen();\n   }\n   e_type e;\n   val = frexp(val, &e);\n\n   static boost::random::uniform_int_distribution<e_type> ui(-20, 20);\n   return ldexp(val, ui(gen));\n}\n\ntemplate <class T>\nvoid check_round(const T& val, bool check_extended = false)\n{\n   double d1    = val.template convert_to<double>();\n   double d2    = boost::math::nextafter(d1, d1 < val ? DBL_MAX : -DBL_MAX);\n   T      diff1 = abs(d1 - val);\n   T      diff2 = abs(d2 - val);\n   if (diff2 < diff1)\n   {\n      // Some debugging code here...\n      std::cout << val.str() << std::endl;\n      std::cout << std::setprecision(18);\n      std::cout << d1 << std::endl;\n      std::cout << d2 << std::endl;\n      std::cout << diff1 << std::endl;\n      std::cout << diff2 << std::endl;\n      d1 = val.template convert_to<double>();\n   }\n   BOOST_CHECK(diff2 >= diff1);\n   BOOST_CHECK_EQUAL(boost::math::signbit(val), boost::math::signbit(d1));\n\n   float f1 = val.template convert_to<float>();\n   float f2 = boost::math::nextafter(f1, f1 < val ? FLT_MAX : -FLT_MAX);\n   BOOST_CHECK(((abs(f1 - val) <= abs(f2 - val))));\n   BOOST_CHECK_EQUAL(boost::math::signbit(val), boost::math::signbit(f1));\n\n#if !defined(BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS)\n\n   if (check_extended)\n   {\n      //\n      // We should check long double as well:\n      //\n      long double l1 = val.template convert_to<long double>();\n      long double l2 = boost::math::nextafter(d1, d1 < val ? LDBL_MAX : -LDBL_MAX);\n      diff1          = abs(l1 - val);\n      diff2          = abs(l2 - val);\n      if (diff2 < diff1)\n      {\n         // Some debugging code here...\n         std::cout << val.str() << std::endl;\n         std::cout << std::setprecision(18);\n         std::cout << l1 << std::endl;\n         std::cout << l2 << std::endl;\n         std::cout << diff1 << std::endl;\n         std::cout << diff2 << std::endl;\n         l1 = val.template convert_to<long double>();\n      }\n      BOOST_CHECK(diff2 >= diff1);\n      BOOST_CHECK_EQUAL(boost::math::signbit(val), boost::math::signbit(l1));\n   }\n\n#endif\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n   cpp_int          i(20);\n   cpp_bin_float_50 f50(i);\n   BOOST_CHECK_EQUAL(f50, 20);\n   f50 = i.convert_to<cpp_bin_float_50>();\n   BOOST_CHECK_EQUAL(f50, 20);\n\n   int1024_t         i1024(45);\n   cpp_bin_float_100 f100(i1024);\n   BOOST_CHECK_EQUAL(f100, 45);\n   f100 = i1024.convert_to<cpp_bin_float_100>();\n   BOOST_CHECK_EQUAL(f100, 45);\n\n   uint1024_t        ui1024(55);\n   cpp_bin_float_100 f100b(ui1024);\n   BOOST_CHECK_EQUAL(f100b, 55);\n   f100b = ui1024.convert_to<cpp_bin_float_100>();\n   BOOST_CHECK_EQUAL(f100b, 55);\n\n   typedef number<cpp_int_backend<32, 32>, et_off> i32_t;\n   i32_t                                           i32(67);\n   cpp_bin_float_100                               f100c(i32);\n   BOOST_CHECK_EQUAL(f100c, 67);\n   f100c = i32.convert_to<cpp_bin_float_100>();\n   BOOST_CHECK_EQUAL(f100c, 67);\n\n   typedef number<cpp_int_backend<32, 32, unsigned_magnitude>, et_off> ui32_t;\n   ui32_t                                                              ui32(98);\n   cpp_bin_float_100                                                   f100d(ui32);\n   BOOST_CHECK_EQUAL(f100d, 98);\n   f100d = ui32.convert_to<cpp_bin_float_100>();\n   BOOST_CHECK_EQUAL(f100d, 98);\n\n   typedef number<cpp_int_backend<64, 64>, et_off> i64_t;\n   i64_t                                           i64(67);\n   cpp_bin_float_100                               f100e(i64);\n   BOOST_CHECK_EQUAL(f100e, 67);\n   f100e = i64.convert_to<cpp_bin_float_100>();\n   BOOST_CHECK_EQUAL(f100e, 67);\n\n   typedef number<cpp_int_backend<64, 64, unsigned_magnitude>, et_off> ui64_t;\n   ui64_t                                                              ui64(98);\n   cpp_bin_float_100                                                   f100f(ui64);\n   BOOST_CHECK_EQUAL(f100f, 98);\n   f100f = ui64.convert_to<cpp_bin_float_100>();\n   BOOST_CHECK_EQUAL(f100f, 98);\n\n   typedef number<cpp_int_backend<128, 128>, et_off> i128_t;\n   i128_t                                            i128(67);\n   cpp_bin_float_100                                 f100g(i128);\n   BOOST_CHECK_EQUAL(f100g, 67);\n   f100g = i128.convert_to<cpp_bin_float_100>();\n   BOOST_CHECK_EQUAL(f100g, 67);\n\n   typedef number<cpp_int_backend<128, 128, unsigned_magnitude>, et_off> ui128_t;\n   ui128_t                                                               ui128(98);\n   cpp_bin_float_100                                                     f100h(ui128);\n   BOOST_CHECK_EQUAL(f100h, 98);\n   f100h = ui128.convert_to<cpp_bin_float_100>();\n   BOOST_CHECK_EQUAL(f100h, 98);\n\n   cpp_bin_float_quad q = (std::numeric_limits<float>::min)();\n   BOOST_CHECK_EQUAL(q.convert_to<float>(), (std::numeric_limits<float>::min)());\n   q = (std::numeric_limits<float>::max)();\n   BOOST_CHECK_EQUAL(q.convert_to<float>(), (std::numeric_limits<float>::max)());\n   q = (std::numeric_limits<float>::denorm_min)();\n   BOOST_CHECK_EQUAL(q.convert_to<float>(), (std::numeric_limits<float>::denorm_min)());\n   // See https://svn.boost.org/trac/boost/ticket/12512:\n   boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<128, boost::multiprecision::backends::digit_base_2, void, std::int64_t> > ext_float(\"1e-646456978\");\n   BOOST_CHECK_EQUAL(ext_float.convert_to<float>(), 0);\n\n   q = -(std::numeric_limits<float>::min)();\n   BOOST_CHECK_EQUAL(q.convert_to<float>(), -(std::numeric_limits<float>::min)());\n   q = -(std::numeric_limits<float>::max)();\n   BOOST_CHECK_EQUAL(q.convert_to<float>(), -(std::numeric_limits<float>::max)());\n   q = -(std::numeric_limits<float>::denorm_min)();\n   BOOST_CHECK_EQUAL(q.convert_to<float>(), -(std::numeric_limits<float>::denorm_min)());\n   // See https://svn.boost.org/trac/boost/ticket/12512:\n   ext_float = boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<128, boost::multiprecision::backends::digit_base_2, void, std::int64_t> >(\"-1e-646456978\");\n   BOOST_CHECK_EQUAL(ext_float.convert_to<float>(), 0);\n   ext_float = (std::numeric_limits<double>::max)();\n   ext_float *= 16;\n   if (std::numeric_limits<double>::has_infinity)\n   {\n      BOOST_CHECK_EQUAL(ext_float.convert_to<double>(), std::numeric_limits<double>::infinity());\n   }\n   else\n   {\n      BOOST_CHECK_EQUAL(ext_float.convert_to<double>(), (std::numeric_limits<double>::max)());\n   }\n   ext_float = -ext_float;\n   if (std::numeric_limits<double>::has_infinity)\n   {\n      BOOST_CHECK_EQUAL(ext_float.convert_to<double>(), -std::numeric_limits<double>::infinity());\n   }\n   else\n   {\n      BOOST_CHECK_EQUAL(ext_float.convert_to<double>(), -(std::numeric_limits<double>::max)());\n   }\n   //\n   // Check for double rounding when the result would be a denorm.\n   // See https://svn.boost.org/trac/boost/ticket/12527\n   //\n   cpp_bin_float_50 r1 = ldexp(cpp_bin_float_50(0x8000000000000bffull), -63 - 1023);\n   check_round(r1);\n   r1 = -r1;\n   check_round(r1);\n\n   r1 = ldexp(cpp_bin_float_50(0x8000017f), -31 - 127);\n   check_round(r1);\n   r1 = -r1;\n   check_round(r1);\n   //\n   // Check conversion to signed zero works OK:\n   //\n   r1 = -ldexp(cpp_bin_float_50(1), -3000);\n   check_round(r1);\n   r1 = 0;\n   r1 = -r1;\n   BOOST_CHECK(boost::math::signbit(r1));\n   check_round(r1);\n   //\n   // Check boundary as the exponent drops below what a double can cope with\n   // but we will be rounding up:\n   //\n   r1 = 3;\n   r1 = ldexp(r1, std::numeric_limits<double>::min_exponent);\n   do\n   {\n      check_round(r1);\n      check_round(boost::math::float_next(r1));\n      check_round(boost::math::float_prior(r1));\n      r1 = ldexp(r1, -1);\n   } while (ilogb(r1) > std::numeric_limits<double>::min_exponent - 5 - std::numeric_limits<double>::digits);\n   r1 = -3;\n   r1 = ldexp(r1, std::numeric_limits<double>::min_exponent);\n   do\n   {\n      check_round(r1);\n      check_round(boost::math::float_next(r1));\n      check_round(boost::math::float_prior(r1));\n      r1 = ldexp(r1, -1);\n   } while (ilogb(r1) > std::numeric_limits<double>::min_exponent - 5 - std::numeric_limits<double>::digits);\n   //\n   // Again when not rounding up:\n   //\n   r1 = 1;\n   r1 = ldexp(r1, std::numeric_limits<double>::min_exponent);\n   do\n   {\n      check_round(r1);\n      check_round(boost::math::float_next(r1));\n      check_round(boost::math::float_prior(r1));\n      r1 = ldexp(r1, -1);\n   } while (ilogb(r1) > std::numeric_limits<double>::min_exponent - 5 - std::numeric_limits<double>::digits);\n   r1 = -1;\n   r1 = ldexp(r1, std::numeric_limits<double>::min_exponent);\n   do\n   {\n      check_round(r1);\n      check_round(boost::math::float_next(r1));\n      check_round(boost::math::float_prior(r1));\n      r1 = ldexp(r1, -1);\n   } while (ilogb(r1) > std::numeric_limits<double>::min_exponent - 5 - std::numeric_limits<double>::digits);\n   //\n   // Test random conversions:\n   //\n   for (unsigned j = 0; j < 10000; ++j)\n   {\n      check_round(generate_random<cpp_bin_float_50>(), true);\n   }\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cpp_bin_float_io.cpp",
    "content": "// Copyright John Maddock 2013.\n\n// Use, modification and distribution are subject to the\n// Boost Software License, Version 1.0.\n// (See accompanying file LICENSE_1_0.txt\n// or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include <boost/chrono.hpp>\n#include \"test.hpp\"\n#include <boost/array.hpp>\n#include <iostream>\n#include <iomanip>\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\ntemplate <class Clock>\nstruct stopwatch\n{\n   typedef typename Clock::duration duration;\n   stopwatch()\n   {\n      m_start = Clock::now();\n   }\n   duration elapsed()\n   {\n      return Clock::now() - m_start;\n   }\n   void reset()\n   {\n      m_start = Clock::now();\n   }\n\n private:\n   typename Clock::time_point m_start;\n};\n\nvoid print_flags(std::ios_base::fmtflags f)\n{\n   std::cout << \"Formatting flags were: \";\n   if (f & std::ios_base::scientific)\n      std::cout << \"scientific \";\n   if (f & std::ios_base::fixed)\n      std::cout << \"fixed \";\n   if (f & std::ios_base::showpoint)\n      std::cout << \"showpoint \";\n   if (f & std::ios_base::showpos)\n      std::cout << \"showpos \";\n   std::cout << std::endl;\n}\n\ntemplate <class T>\nvoid test()\n{\n   typedef T                                mp_t;\n   boost::array<std::ios_base::fmtflags, 9> f =\n       {{std::ios_base::fmtflags(0), std::ios_base::showpoint, std::ios_base::showpos, std::ios_base::scientific, std::ios_base::scientific | std::ios_base::showpos,\n         std::ios_base::scientific | std::ios_base::showpoint, std::ios_base::fixed, std::ios_base::fixed | std::ios_base::showpoint,\n         std::ios_base::fixed | std::ios_base::showpos}};\n\n   boost::array<boost::array<const char*, 13 * 9>, 40> string_data = {{\n#include \"libs/multiprecision/test/string_data.ipp\"\n   }};\n\n   double num   = 123456789.0;\n   double denom = 1;\n   double val   = num;\n   for (unsigned j = 0; j < 40; ++j)\n   {\n      unsigned col = 0;\n      for (unsigned prec = 1; prec < 14; ++prec)\n      {\n         for (unsigned i = 0; i < f.size(); ++i, ++col)\n         {\n            std::stringstream ss;\n            ss.precision(prec);\n            ss.flags(f[i]);\n            ss << mp_t(val);\n            const char* expect = string_data[j][col];\n            if (ss.str() != expect)\n            {\n               std::cout << std::setprecision(20) << \"Testing value \" << val << std::endl;\n               print_flags(f[i]);\n               std::cout << \"Precision is: \" << prec << std::endl;\n               std::cout << \"Got:      \" << ss.str() << std::endl;\n               std::cout << \"Expected: \" << expect << std::endl;\n               ++boost::detail::test_errors();\n               mp_t(val).str(prec, f[i]); // for debugging\n            }\n         }\n      }\n      num = -num;\n      if (j & 1)\n         denom *= 8;\n      val = num / denom;\n   }\n\n   boost::array<const char*, 13 * 9> zeros =\n       {{\"0\", \"0.\", \"+0\", \"0.0e+00\", \"+0.0e+00\", \"0.0e+00\", \"0.0\", \"0.0\", \"+0.0\", \"0\", \"0.0\", \"+0\", \"0.00e+00\", \"+0.00e+00\", \"0.00e+00\", \"0.00\", \"0.00\", \"+0.00\", \"0\", \"0.00\", \"+0\", \"0.000e+00\", \"+0.000e+00\", \"0.000e+00\", \"0.000\", \"0.000\", \"+0.000\", \"0\", \"0.000\", \"+0\", \"0.0000e+00\", \"+0.0000e+00\", \"0.0000e+00\", \"0.0000\", \"0.0000\", \"+0.0000\", \"0\", \"0.0000\", \"+0\", \"0.00000e+00\", \"+0.00000e+00\", \"0.00000e+00\", \"0.00000\", \"0.00000\", \"+0.00000\", \"0\", \"0.00000\", \"+0\", \"0.000000e+00\", \"+0.000000e+00\", \"0.000000e+00\", \"0.000000\", \"0.000000\", \"+0.000000\", \"0\", \"0.000000\", \"+0\", \"0.0000000e+00\", \"+0.0000000e+00\", \"0.0000000e+00\", \"0.0000000\", \"0.0000000\", \"+0.0000000\", \"0\", \"0.0000000\", \"+0\", \"0.00000000e+00\", \"+0.00000000e+00\", \"0.00000000e+00\", \"0.00000000\", \"0.00000000\", \"+0.00000000\", \"0\", \"0.00000000\", \"+0\", \"0.000000000e+00\", \"+0.000000000e+00\", \"0.000000000e+00\", \"0.000000000\", \"0.000000000\", \"+0.000000000\", \"0\", \"0.000000000\", \"+0\", \"0.0000000000e+00\", \"+0.0000000000e+00\", \"0.0000000000e+00\", \"0.0000000000\", \"0.0000000000\", \"+0.0000000000\", \"0\", \"0.0000000000\", \"+0\", \"0.00000000000e+00\", \"+0.00000000000e+00\", \"0.00000000000e+00\", \"0.00000000000\", \"0.00000000000\", \"+0.00000000000\", \"0\", \"0.00000000000\", \"+0\", \"0.000000000000e+00\", \"+0.000000000000e+00\", \"0.000000000000e+00\", \"0.000000000000\", \"0.000000000000\", \"+0.000000000000\", \"0\", \"0.000000000000\", \"+0\", \"0.0000000000000e+00\", \"+0.0000000000000e+00\", \"0.0000000000000e+00\", \"0.0000000000000\", \"0.0000000000000\", \"+0.0000000000000\"}};\n\n   unsigned col = 0;\n   val          = 0;\n   for (unsigned prec = 1; prec < 14; ++prec)\n   {\n      for (unsigned i = 0; i < f.size(); ++i, ++col)\n      {\n         std::stringstream ss;\n         ss.precision(prec);\n         ss.flags(f[i]);\n         ss << mp_t(val);\n         const char* expect = zeros[col];\n         if (ss.str() != expect)\n         {\n            std::cout << std::setprecision(20) << \"Testing value \" << val << std::endl;\n            print_flags(f[i]);\n            std::cout << \"Precision is: \" << prec << std::endl;\n            std::cout << \"Got:      \" << ss.str() << std::endl;\n            std::cout << \"Expected: \" << expect << std::endl;\n            ++boost::detail::test_errors();\n            mp_t(val).str(prec, f[i]); // for debugging\n         }\n      }\n   }\n\n   if (std::numeric_limits<mp_t>::has_infinity)\n   {\n      T val = std::numeric_limits<T>::infinity();\n      BOOST_CHECK_EQUAL(val.str(), \"inf\");\n      BOOST_CHECK_EQUAL(val.str(0, std::ios_base::showpos), \"+inf\");\n      val = -val;\n      BOOST_CHECK_EQUAL(val.str(), \"-inf\");\n      BOOST_CHECK_EQUAL(val.str(0, std::ios_base::showpos), \"-inf\");\n\n      val = static_cast<T>(\"inf\");\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      val = static_cast<T>(\"+inf\");\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      val = static_cast<T>(\"-inf\");\n      BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n   }\n   if (std::numeric_limits<mp_t>::has_quiet_NaN)\n   {\n      T val = std::numeric_limits<T>::quiet_NaN();\n      BOOST_CHECK_EQUAL(val.str(), \"nan\");\n      val = static_cast<T>(\"nan\");\n      BOOST_CHECK((boost::math::isnan)(val));\n   }\n   //\n   // Min and max values:\n   //\n   T t((std::numeric_limits<T>::max)().str(std::numeric_limits<T>::max_digits10, std::ios_base::scientific));\n   BOOST_CHECK_EQUAL(t, (std::numeric_limits<T>::max)());\n   t = T((std::numeric_limits<T>::min)().str(std::numeric_limits<T>::max_digits10, std::ios_base::scientific));\n   BOOST_CHECK_EQUAL(t, (std::numeric_limits<T>::min)());\n   t = T((std::numeric_limits<T>::lowest)().str(std::numeric_limits<T>::max_digits10, std::ios_base::scientific));\n   BOOST_CHECK_EQUAL(t, (std::numeric_limits<T>::lowest)());\n}\n\ntemplate <class T>\nT generate_random()\n{\n   typedef typename T::backend_type::exponent_type e_type;\n   static boost::random::mt19937                   gen;\n   T                                               val      = gen();\n   T                                               prev_val = -1;\n   while (val != prev_val)\n   {\n      val *= (gen.max)();\n      prev_val = val;\n      val += gen();\n   }\n   e_type e;\n   val = frexp(val, &e);\n\n   static boost::random::uniform_int_distribution<e_type> ui(0, std::numeric_limits<T>::max_exponent);\n   return ldexp(val, ui(gen));\n}\n\ntemplate <class T>\nvoid do_round_trip(const T& val, std::ios_base::fmtflags f)\n{\n   std::stringstream ss;\n   ss << std::setprecision(std::numeric_limits<T>::max_digits10);\n   ss.flags(f);\n   ss << val;\n   T new_val = static_cast<T>(ss.str());\n   BOOST_CHECK_EQUAL(new_val, val);\n   new_val = static_cast<T>(val.str(0, f));\n   BOOST_CHECK_EQUAL(new_val, val);\n}\n\ntemplate <class T>\nvoid do_round_trip(const T& val)\n{\n   do_round_trip(val, std::ios_base::fmtflags(0));\n   do_round_trip(val, std::ios_base::fmtflags(std::ios_base::scientific));\n   if ((fabs(val) > 1) && (fabs(val) < 1e100))\n      do_round_trip(val, std::ios_base::fmtflags(std::ios_base::fixed));\n\n   static int error_count = 0;\n\n   if (error_count != boost::detail::test_errors())\n   {\n      error_count = boost::detail::test_errors();\n      std::cout << \"Errors occurred while testing value....\";\n      if (val.backend().sign())\n         std::cout << \"-\";\n      std::cout << boost::multiprecision::cpp_int(val.backend().bits()) << \"e\" << val.backend().exponent() << std::endl;\n   }\n}\n\ntemplate <class T>\nvoid test_round_trip()\n{\n   std::cout << \"Testing type \" << typeid(T).name() << std::endl;\n   std::cout << \"digits = \" << std::numeric_limits<T>::digits << std::endl;\n   std::cout << \"digits10 = \" << std::numeric_limits<T>::digits10 << std::endl;\n   std::cout << \"max_digits10 = \" << std::numeric_limits<T>::max_digits10 << std::endl;\n\n   stopwatch<boost::chrono::high_resolution_clock> w;\n\n#ifndef CI_SUPPRESS_KNOWN_ISSUES\n   while (boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() < 200)\n#else\n   while (boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() < 50)\n#endif\n   {\n      T val = generate_random<T>();\n      do_round_trip(val);\n      do_round_trip(T(-val));\n      do_round_trip(T(1 / val));\n      do_round_trip(T(-1 / val));\n\n      if (boost::detail::test_errors() > 200)\n         break; // escape if there are too many errors.\n   }\n\n   std::cout << \"Execution time = \" << boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() << \"s\" << std::endl;\n}\n\n#if !defined(TEST1) && !defined(TEST2)\n#define TEST1\n#define TEST2\n#endif\n\nint main()\n{\n   using namespace boost::multiprecision;\n#ifdef TEST1\n   test<number<cpp_bin_float<113, digit_base_2> > >();\n   test_round_trip<number<cpp_bin_float<113, digit_base_2> > >();\n#endif\n#ifdef TEST2\n   test<number<cpp_bin_float<53, digit_base_2> > >();\n   test_round_trip<number<cpp_bin_float<53, digit_base_2> > >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cpp_bin_float_round.cpp",
    "content": "// Copyright John Maddock 2016.\n\n// Use, modification and distribution are subject to the\n// Boost Software License, Version 1.0.\n// (See accompanying file LICENSE_1_0.txt\n// or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//\n// This file takes way too long to run to be part of the main regression test suite,\n// but is useful in probing for errors in cpp_bin_float's rounding code.\n// It cycles through every single value of type float, and rounds those numbers\n// plus some closely related ones and compares the results to those produced by MPFR.\n//\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/math/special_functions/next.hpp>\n#include \"test.hpp\"\n\nusing namespace boost::multiprecision;\n\ntypedef number<mpfr_float_backend<35> >                                                     good_type;\ntypedef number<cpp_bin_float<std::numeric_limits<good_type>::digits, digit_base_2>, et_off> test_type;\n\nint main()\n{\n   float f = (std::numeric_limits<float>::max)();\n\n   do\n   {\n      float     fr1, fr2;\n      good_type gf(f), gf2(f);\n      test_type tf(f), tf2(f);\n      fr1 = gf.convert_to<float>();\n      fr2 = tf.convert_to<float>();\n      BOOST_CHECK_EQUAL(fr1, fr2);\n      // next represenation:\n      gf = boost::math::float_next(gf2);\n      tf = boost::math::float_next(tf2);\n      BOOST_CHECK_NE(gf, gf2);\n      BOOST_CHECK_NE(tf, tf2);\n      fr1 = gf.convert_to<float>();\n      fr2 = tf.convert_to<float>();\n      BOOST_CHECK_EQUAL(fr1, fr2);\n      // previous representation:\n      gf = boost::math::float_prior(gf2);\n      tf = boost::math::float_prior(tf2);\n      BOOST_CHECK_NE(gf, gf2);\n      BOOST_CHECK_NE(tf, tf2);\n      fr1 = gf.convert_to<float>();\n      fr2 = tf.convert_to<float>();\n      BOOST_CHECK_EQUAL(fr1, fr2);\n\n      // Create ands test ties:\n      int e;\n      std::frexp(f, &e);\n      float extra = std::ldexp(1.0f, e - std::numeric_limits<float>::digits - 1);\n      gf          = gf2 += extra;\n      tf          = tf2 += extra;\n      fr1         = gf.convert_to<float>();\n      fr2         = tf.convert_to<float>();\n      BOOST_CHECK_EQUAL(fr1, fr2);\n      // next represenation:\n      gf = boost::math::float_next(gf2);\n      tf = boost::math::float_next(tf2);\n      BOOST_CHECK_NE(gf, gf2);\n      BOOST_CHECK_NE(tf, tf2);\n      fr1 = gf.convert_to<float>();\n      fr2 = tf.convert_to<float>();\n      BOOST_CHECK_EQUAL(fr1, fr2);\n      // previous representation:\n      gf = boost::math::float_prior(gf2);\n      tf = boost::math::float_prior(tf2);\n      BOOST_CHECK_NE(gf, gf2);\n      BOOST_CHECK_NE(tf, tf2);\n      fr1 = gf.convert_to<float>();\n      fr2 = tf.convert_to<float>();\n      BOOST_CHECK_EQUAL(fr1, fr2);\n\n      f = boost::math::float_prior(f);\n   } while (f);\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cpp_bin_float_serial.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2013 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//\n// Compare arithmetic results using fixed_int to GMP results.\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include \"test_float_serial.hpp\"\n\n#if !defined(TEST1) && !defined(TEST2)\n#define TEST1\n#define TEST2\n#endif\n\nint main()\n{\n   using namespace boost::multiprecision;\n#ifdef TEST1\n   test<cpp_bin_float_50>();\n#endif\n#ifdef TEST2\n   test<cpp_bin_float_quad>();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cpp_bin_float_tgamma.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2021.\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#include \"test.hpp\"\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\nnamespace local\n{\n  template<typename T> constexpr T (max)(T a, T b) { return a > b ? a : b; }\n\n  template<class T>\n  void test()\n  {\n     // N[Gamma[5/2], 120]\n     const T control_tgamma_2_and_half(\"1.32934038817913702047362561250585888709816209209179034616035584238968346344327413603121299255390849906217011771821192800\");\n\n     // N[Gamma[500/2], 120]\n     const T control_tgamma_2_fifty   (\"1.29314250436364309292832582080974738839793748706951226669917697084512949902204448379552716614841127978037140294127577317E490\");\n\n     const T tgamma_2_and_half = boost::math::tgamma(T(T(5)   / 2));\n     const T tgamma_2_fifty    = boost::math::tgamma(T(T(500) / 2));\n\n     BOOST_CHECK_CLOSE_FRACTION(tgamma_2_and_half, control_tgamma_2_and_half, T(std::numeric_limits<T>::epsilon() * T(1.0E6)));\n     BOOST_CHECK_CLOSE_FRACTION(tgamma_2_fifty   , control_tgamma_2_fifty,    T(std::numeric_limits<T>::epsilon() * T(1.0E6)));\n  }\n}\n\nint main()\n{\n   using big_float_type_016 = boost::multiprecision::number<boost::multiprecision::cpp_bin_float<(local::max)((int) (std::numeric_limits<double>::digits + 1), 16)>>;\n   using big_float_type_035 = boost::multiprecision::number<boost::multiprecision::cpp_bin_float<(local::max)((int) (std::numeric_limits<double>::digits + 1), 35)>>;\n   using big_float_type_105 = boost::multiprecision::number<boost::multiprecision::cpp_bin_float<105>>;\n\n   local::test<big_float_type_016>();\n   local::test<big_float_type_035>();\n   local::test<big_float_type_105>();\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cpp_dec_float_conv.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nint main()\n{\n   using namespace boost::multiprecision;\n   //\n   // Test interconversions between different precisions:\n   //\n   cpp_dec_float_50  f1(2);\n   cpp_dec_float_100 f2(3);\n\n   cpp_dec_float_100 f3 = f1; // implicit conversion OK\n   BOOST_TEST(f3 == 2);\n   cpp_dec_float_50 f4(f2); // explicit conversion OK\n   BOOST_TEST(f4 == 3);\n\n   f2 = f1;\n   BOOST_TEST(f2 == 2);\n   f2 = 4;\n   f1 = static_cast<cpp_dec_float_50>(f2);\n   BOOST_TEST(f1 == 4);\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cpp_dec_float_round.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2013 Christopher Kormanyos. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n\n// Test case for ticket:\n// #8065: Multiprecision rounding issue\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include \"test.hpp\"\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include <boost/math/special_functions/round.hpp>\n\ntemplate <int N>\nstatic bool round_test_imp()\n{\n   typedef boost::multiprecision::cpp_dec_float<N>                                       mp_backend_type;\n   typedef boost::multiprecision::number<mp_backend_type, boost::multiprecision::et_off> mp_type;\n\n   const mp_type original_digits(1.0F);\n\n   const mp_type scale = pow(mp_type(10), N);\n\n   mp_type these_digits = original_digits * scale;\n\n   these_digits = boost::math::round(these_digits);\n   these_digits /= scale;\n\n   const std::string result = these_digits.str();\n\n   return (result == original_digits.str());\n}\n\ntemplate <int N>\nstruct round_test\n{\n   static bool test()\n   {\n      return (round_test_imp<N>() && round_test<N - 1>::test());\n   }\n};\n\ntemplate <>\nstruct round_test<0>\n{\n   static bool test()\n   {\n      return round_test_imp<0>();\n   }\n};\n\nint main()\n{\n   //\n   // Test cpp_dec_float rounding with boost::math::round() at various precisions:\n   //\n   const bool round_test_result = round_test<40>::test();\n\n   BOOST_CHECK_EQUAL(round_test_result, true);\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cpp_dec_float_serial.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2013 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//\n// Compare arithmetic results using fixed_int to GMP results.\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include \"test_float_serial.hpp\"\n\n#if !defined(TEST1) && !defined(TEST2)\n#define TEST1\n#define TEST2\n#endif\n\nint main()\n{\n   using namespace boost::multiprecision;\n#ifdef TEST1\n   test<cpp_dec_float_50>();\n#endif\n#ifdef TEST2\n   test<number<cpp_dec_float<100, std::int64_t, std::allocator<char> > > >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cpp_dec_float_tgamma.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2021.\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#include \"test.hpp\"\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nnamespace local\n{\n  template<typename T> constexpr T (max)(T a, T b) { return a > b ? a : b; }\n\n  template<class T>\n  void test()\n  {\n     // N[Gamma[5/2], 120]\n     const T control_tgamma_2_and_half(\"1.32934038817913702047362561250585888709816209209179034616035584238968346344327413603121299255390849906217011771821192800\");\n\n     // N[Gamma[500/2], 120]\n     const T control_tgamma_2_fifty   (\"1.29314250436364309292832582080974738839793748706951226669917697084512949902204448379552716614841127978037140294127577317E490\");\n\n     const T tgamma_2_and_half = boost::math::tgamma(T(T(5)   / 2));\n     const T tgamma_2_fifty    = boost::math::tgamma(T(T(500) / 2));\n\n     BOOST_CHECK_CLOSE_FRACTION(tgamma_2_and_half, control_tgamma_2_and_half, T(std::numeric_limits<T>::epsilon() * T(1.0E6)));\n     BOOST_CHECK_CLOSE_FRACTION(tgamma_2_fifty   , control_tgamma_2_fifty,    T(std::numeric_limits<T>::epsilon() * T(1.0E6)));\n  }\n}\n\nint main()\n{\n   using big_float_type_016 = boost::multiprecision::number<boost::multiprecision::cpp_dec_float<(local::max)((int) (std::numeric_limits<double>::digits + 1), 16)>>;\n   using big_float_type_035 = boost::multiprecision::number<boost::multiprecision::cpp_dec_float<(local::max)((int) (std::numeric_limits<double>::digits + 1), 35)>>;\n   using big_float_type_105 = boost::multiprecision::number<boost::multiprecision::cpp_dec_float<105>>;\n\n   local::test<big_float_type_016>();\n   local::test<big_float_type_035>();\n   local::test<big_float_type_105>();\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cpp_int.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//\n// Compare arithmetic results using fixed_int to GMP results.\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n//\n// This ensures all our code gets tested, even though it may\n// not be the fastest configuration in normal use:\n//\n#define BOOST_MP_USE_LIMB_SHIFT\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include \"timer.hpp\"\n#include \"test.hpp\"\n\n#ifdef _MSC_VER\n#pragma warning(disable : 4127) //  Conditional expression is constant\n#endif\n\n#if !defined(TEST1) && !defined(TEST2) && !defined(TEST3) && !defined(TEST4) && !defined(TEST5) && !defined(TEST6)\n#define TEST1\n#define TEST2\n#define TEST3\n#define TEST4\n#define TEST5\n#define TEST6\n#endif\n\ntemplate <class T>\nT generate_random(unsigned bits_wanted)\n{\n   static boost::random::mt19937               gen;\n   typedef boost::random::mt19937::result_type random_type;\n\n   T        max_val;\n   unsigned digits;\n   if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits))\n   {\n      max_val = (std::numeric_limits<T>::max)();\n      digits  = std::numeric_limits<T>::digits;\n   }\n   else\n   {\n      max_val = T(1) << bits_wanted;\n      digits  = bits_wanted;\n   }\n\n   unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n   while ((random_type(1) << bits_per_r_val) > (gen.max)())\n      --bits_per_r_val;\n\n   unsigned terms_needed = digits / bits_per_r_val + 1;\n\n   T val = 0;\n   for (unsigned i = 0; i < terms_needed; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   val %= max_val;\n   return val;\n}\n\ntemplate <class T>\nstruct is_checked_cpp_int : public std::integral_constant<bool, false>\n{};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public std::integral_constant<bool, true>\n{};\n\ntemplate <class Number>\nstruct tester\n{\n   typedef Number                                         test_type;\n   typedef typename test_type::backend_type::checked_type checked;\n\n   unsigned     last_error_count;\n   timer tim;\n\n   boost::multiprecision::mpz_int a, b, c, d;\n   int                            si;\n   unsigned                       ui;\n   boost::multiprecision::double_limb_type large_ui;\n   test_type                      a1, b1, c1, d1;\n\n   void t1()\n   {\n      using namespace boost::multiprecision;\n      BOOST_CHECK_EQUAL(a.str(), a1.str());\n      BOOST_CHECK_EQUAL(b.str(), b1.str());\n      BOOST_CHECK_EQUAL(c.str(), c1.str());\n      BOOST_CHECK_EQUAL(d.str(), d1.str());\n      BOOST_CHECK_EQUAL(mpz_int(a + b).str(), test_type(a1 + b1).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) += b).str(), (test_type(a1) += b1).str());\n      BOOST_CHECK_EQUAL((mpz_int(b) += a).str(), (test_type(b1) += a1).str());\n      BOOST_CHECK_EQUAL(mpz_int(a - b).str(), test_type(a1 - b1).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) -= b).str(), (test_type(a1) -= b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(mpz_int(-a) + b).str(), test_type(test_type(-a1) + b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(mpz_int(-a) - b).str(), test_type(test_type(-a1) - b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(c * d).str(), test_type(c1 * d1).str());\n      BOOST_CHECK_EQUAL((mpz_int(c) *= d).str(), (test_type(c1) *= d1).str());\n      BOOST_CHECK_EQUAL((mpz_int(d) *= c).str(), (test_type(d1) *= c1).str());\n      BOOST_CHECK_EQUAL(mpz_int(c * -d).str(), test_type(c1 * -d1).str());\n      BOOST_CHECK_EQUAL(mpz_int(-c * d).str(), test_type(-c1 * d1).str());\n      BOOST_CHECK_EQUAL((mpz_int(c) *= -d).str(), (test_type(c1) *= -d1).str());\n      BOOST_CHECK_EQUAL((mpz_int(-d) *= c).str(), (test_type(-d1) *= c1).str());\n      BOOST_CHECK_EQUAL(mpz_int(b * c).str(), test_type(b1 * c1).str());\n      BOOST_CHECK_EQUAL(mpz_int(a / b).str(), test_type(a1 / b1).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) /= b).str(), (test_type(a1) /= b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(a / -b).str(), test_type(a1 / -b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(-a / b).str(), test_type(-a1 / b1).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) /= -b).str(), (test_type(a1) /= -b1).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) /= b).str(), (test_type(-a1) /= b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(a / d).str(), test_type(a1 / d1).str());\n      BOOST_CHECK_EQUAL(mpz_int(a % b).str(), test_type(a1 % b1).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) %= b).str(), (test_type(a1) %= b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(a % -b).str(), test_type(a1 % -b1).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) %= -b).str(), (test_type(a1) %= -b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(-a % b).str(), test_type(-a1 % b1).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) %= b).str(), (test_type(-a1) %= b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(a % d).str(), test_type(a1 % d1).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) %= d).str(), (test_type(a1) %= d1).str());\n\n      if (!std::numeric_limits<test_type>::is_bounded)\n      {\n         test_type p = a1 * b1;\n         test_type r;\n         divide_qr(p, b1, p, r);\n         BOOST_CHECK_EQUAL(p, a1);\n         BOOST_CHECK_EQUAL(r, test_type(0));\n\n         p = a1 * d1;\n         divide_qr(p, d1, p, r);\n         BOOST_CHECK_EQUAL(p, a1);\n         BOOST_CHECK_EQUAL(r, test_type(0));\n\n         divide_qr(p, test_type(1), p, r);\n         BOOST_CHECK_EQUAL(p, a1);\n         BOOST_CHECK_EQUAL(r, test_type(0));\n      }\n   }\n\n   void t2()\n   {\n      using namespace boost::multiprecision;\n      // bitwise ops:\n      BOOST_CHECK_EQUAL(mpz_int(a | b).str(), test_type(a1 | b1).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) |= b).str(), (test_type(a1) |= b1).str());\n      if (!is_checked_cpp_int<test_type>::value)\n      {\n         BOOST_CHECK_EQUAL(mpz_int(-a | b).str(), test_type(-a1 | b1).str());\n         BOOST_CHECK_EQUAL((mpz_int(-a) |= b).str(), (test_type(-a1) |= b1).str());\n         BOOST_CHECK_EQUAL(mpz_int(a | -b).str(), test_type(a1 | -b1).str());\n         BOOST_CHECK_EQUAL((mpz_int(a) |= -b).str(), (test_type(a1) |= -b1).str());\n         BOOST_CHECK_EQUAL(mpz_int(-a | -b).str(), test_type(-a1 | -b1).str());\n         BOOST_CHECK_EQUAL((mpz_int(-a) |= -b).str(), (test_type(-a1) |= -b1).str());\n      }\n      BOOST_CHECK_EQUAL(mpz_int(a & b).str(), test_type(a1 & b1).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) &= b).str(), (test_type(a1) &= b1).str());\n      if (!is_checked_cpp_int<test_type>::value)\n      {\n         BOOST_CHECK_EQUAL(mpz_int(-a & b).str(), test_type(-a1 & b1).str());\n         BOOST_CHECK_EQUAL((mpz_int(-a) &= b).str(), (test_type(-a1) &= b1).str());\n         BOOST_CHECK_EQUAL(mpz_int(a & -b).str(), test_type(a1 & -b1).str());\n         BOOST_CHECK_EQUAL((mpz_int(a) &= -b).str(), (test_type(a1) &= -b1).str());\n         BOOST_CHECK_EQUAL(mpz_int(-a & -b).str(), test_type(-a1 & -b1).str());\n         BOOST_CHECK_EQUAL((mpz_int(-a) &= -b).str(), (test_type(-a1) &= -b1).str());\n      }\n      BOOST_CHECK_EQUAL(mpz_int(a ^ b).str(), test_type(a1 ^ b1).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) ^= b).str(), (test_type(a1) ^= b1).str());\n      if (!is_checked_cpp_int<test_type>::value)\n      {\n         BOOST_CHECK_EQUAL(mpz_int(-a ^ b).str(), test_type(-a1 ^ b1).str());\n         BOOST_CHECK_EQUAL((mpz_int(-a) ^= b).str(), (test_type(-a1) ^= b1).str());\n         BOOST_CHECK_EQUAL(mpz_int(a ^ -b).str(), test_type(a1 ^ -b1).str());\n         BOOST_CHECK_EQUAL((mpz_int(a) ^= -b).str(), (test_type(a1) ^= -b1).str());\n         BOOST_CHECK_EQUAL(mpz_int(-a ^ -b).str(), test_type(-a1 ^ -b1).str());\n         BOOST_CHECK_EQUAL((mpz_int(-a) ^= -b).str(), (test_type(-a1) ^= -b1).str());\n      }\n      // Shift ops:\n      for (unsigned i = 0; i < 128; ++i)\n      {\n         if (!std::numeric_limits<test_type>::is_bounded)\n         {\n            BOOST_CHECK_EQUAL(mpz_int(a << i).str(), test_type(a1 << i).str());\n            BOOST_CHECK_EQUAL(mpz_int(-a << i).str(), test_type(-a1 << i).str());\n         }\n         else if (!is_checked_cpp_int<test_type>::value)\n         {\n            test_type t1(mpz_int(a << i).str());\n            test_type t2 = a1 << i;\n            BOOST_CHECK_EQUAL(t1, t2);\n            t1 = test_type(mpz_int(-a << i).str());\n            t2 = -a1 << i;\n            BOOST_CHECK_EQUAL(t1, t2);\n         }\n         BOOST_CHECK_EQUAL(mpz_int(a >> i).str(), test_type(a1 >> i).str());\n         if (!is_checked_cpp_int<test_type>::value)\n         {\n            BOOST_CHECK_EQUAL(mpz_int(-a >> i).str(), test_type(-a1 >> i).str());\n         }\n      }\n      // gcd/lcm\n      BOOST_CHECK_EQUAL(mpz_int(gcd(a, b)).str(), test_type(gcd(a1, b1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(c, d)).str(), test_type(lcm(c1, d1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(-a, b)).str(), test_type(gcd(-a1, b1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(-c, d)).str(), test_type(lcm(-c1, d1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(-a, -b)).str(), test_type(gcd(-a1, -b1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(-c, -d)).str(), test_type(lcm(-c1, -d1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(a, -b)).str(), test_type(gcd(a1, -b1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(-a, -b)).str(), test_type(gcd(-a1, -b1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(c, -d)).str(), test_type(lcm(c1, -d1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(-c, -d)).str(), test_type(lcm(-c1, -d1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(mpz_int(0), b)).str(), test_type(gcd(test_type(0), b1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(mpz_int(0), -b)).str(), test_type(gcd(test_type(0), -b1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(a, mpz_int(0))).str(), test_type(gcd(a1, test_type(0))).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(-a, mpz_int(0))).str(), test_type(gcd(a1, test_type(0))).str());\n      // Integer sqrt:\n      mpz_int   r;\n      test_type r1;\n      BOOST_CHECK_EQUAL(sqrt(a, r).str(), sqrt(a1, r1).str());\n      BOOST_CHECK_EQUAL(r.str(), r1.str());\n   }\n\n   void t3()\n   {\n      using namespace boost::multiprecision;\n      // Now check operations involving signed integers:\n      BOOST_CHECK_EQUAL(mpz_int(a + si).str(), test_type(a1 + si).str());\n      BOOST_CHECK_EQUAL(mpz_int(a + -si).str(), test_type(a1 + -si).str());\n      BOOST_CHECK_EQUAL(mpz_int(-a + si).str(), test_type(-a1 + si).str());\n      BOOST_CHECK_EQUAL(mpz_int(si + a).str(), test_type(si + a1).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) += si).str(), (test_type(a1) += si).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) += -si).str(), (test_type(a1) += -si).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) += si).str(), (test_type(-a1) += si).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) += -si).str(), (test_type(-a1) += -si).str());\n      BOOST_CHECK_EQUAL(mpz_int(a - si).str(), test_type(a1 - si).str());\n      BOOST_CHECK_EQUAL(mpz_int(a - -si).str(), test_type(a1 - -si).str());\n      BOOST_CHECK_EQUAL(mpz_int(-a - si).str(), test_type(-a1 - si).str());\n      BOOST_CHECK_EQUAL(mpz_int(si - a).str(), test_type(si - a1).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) -= si).str(), (test_type(a1) -= si).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) -= -si).str(), (test_type(a1) -= -si).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) -= si).str(), (test_type(-a1) -= si).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) -= -si).str(), (test_type(-a1) -= -si).str());\n      BOOST_CHECK_EQUAL(mpz_int(b * si).str(), test_type(b1 * si).str());\n      BOOST_CHECK_EQUAL(mpz_int(b * -si).str(), test_type(b1 * -si).str());\n      BOOST_CHECK_EQUAL(mpz_int(-b * si).str(), test_type(-b1 * si).str());\n      BOOST_CHECK_EQUAL(mpz_int(si * b).str(), test_type(si * b1).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) *= si).str(), (test_type(a1) *= si).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) *= -si).str(), (test_type(a1) *= -si).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) *= si).str(), (test_type(-a1) *= si).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) *= -si).str(), (test_type(-a1) *= -si).str());\n      BOOST_CHECK_EQUAL(mpz_int(a / si).str(), test_type(a1 / si).str());\n      BOOST_CHECK_EQUAL(mpz_int(a / -si).str(), test_type(a1 / -si).str());\n      BOOST_CHECK_EQUAL(mpz_int(-a / si).str(), test_type(-a1 / si).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) /= si).str(), (test_type(a1) /= si).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) /= -si).str(), (test_type(a1) /= -si).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) /= si).str(), (test_type(-a1) /= si).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) /= -si).str(), (test_type(-a1) /= -si).str());\n      BOOST_CHECK_EQUAL(mpz_int(a % si).str(), test_type(a1 % si).str());\n      BOOST_CHECK_EQUAL(mpz_int(a % -si).str(), test_type(a1 % -si).str());\n      BOOST_CHECK_EQUAL(mpz_int(-a % si).str(), test_type(-a1 % si).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) %= si).str(), (test_type(a1) %= si).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) %= -si).str(), (test_type(a1) %= -si).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) %= si).str(), (test_type(-a1) %= si).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) %= -si).str(), (test_type(-a1) %= -si).str());\n      if ((si > 0) || !is_checked_cpp_int<test_type>::value)\n      {\n         BOOST_CHECK_EQUAL(mpz_int(a | si).str(), test_type(a1 | si).str());\n         BOOST_CHECK_EQUAL((mpz_int(a) |= si).str(), (test_type(a1) |= si).str());\n         BOOST_CHECK_EQUAL(mpz_int(a & si).str(), test_type(a1 & si).str());\n         BOOST_CHECK_EQUAL((mpz_int(a) &= si).str(), (test_type(a1) &= si).str());\n         BOOST_CHECK_EQUAL(mpz_int(a ^ si).str(), test_type(a1 ^ si).str());\n         BOOST_CHECK_EQUAL((mpz_int(a) ^= si).str(), (test_type(a1) ^= si).str());\n         BOOST_CHECK_EQUAL(mpz_int(si | a).str(), test_type(si | a1).str());\n         BOOST_CHECK_EQUAL(mpz_int(si & a).str(), test_type(si & a1).str());\n         BOOST_CHECK_EQUAL(mpz_int(si ^ a).str(), test_type(si ^ a1).str());\n      }\n      BOOST_CHECK_EQUAL(mpz_int(gcd(a, si)).str(), test_type(gcd(a1, si)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(si, b)).str(), test_type(gcd(si, b1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(c, si)).str(), test_type(lcm(c1, si)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(si, d)).str(), test_type(lcm(si, d1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(-a, si)).str(), test_type(gcd(-a1, si)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(-si, b)).str(), test_type(gcd(-si, b1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(-c, si)).str(), test_type(lcm(-c1, si)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(-si, d)).str(), test_type(lcm(-si, d1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(-a, -si)).str(), test_type(gcd(-a1, -si)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(-si, -b)).str(), test_type(gcd(-si, -b1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(-c, -si)).str(), test_type(lcm(-c1, -si)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(-si, -d)).str(), test_type(lcm(-si, -d1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(a, -si)).str(), test_type(gcd(a1, -si)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(si, -b)).str(), test_type(gcd(si, -b1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(c, -si)).str(), test_type(lcm(c1, -si)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(si, -d)).str(), test_type(lcm(si, -d1)).str());\n   }\n\n   void t4()\n   {\n      using namespace boost::multiprecision;\n      // Now check operations involving unsigned integers:\n      BOOST_CHECK_EQUAL(mpz_int(a + ui).str(), test_type(a1 + ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(-a + ui).str(), test_type(-a1 + ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(ui + a).str(), test_type(ui + a1).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) += ui).str(), (test_type(a1) += ui).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) += ui).str(), (test_type(-a1) += ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(a - ui).str(), test_type(a1 - ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(-a - ui).str(), test_type(-a1 - ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(ui - a).str(), test_type(ui - a1).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) -= ui).str(), (test_type(a1) -= ui).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) -= ui).str(), (test_type(-a1) -= ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(b * ui).str(), test_type(b1 * ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(-b * ui).str(), test_type(-b1 * ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(ui * b).str(), test_type(ui * b1).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) *= ui).str(), (test_type(a1) *= ui).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) *= ui).str(), (test_type(-a1) *= ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(a / ui).str(), test_type(a1 / ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(-a / ui).str(), test_type(-a1 / ui).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) /= ui).str(), (test_type(a1) /= ui).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) /= ui).str(), (test_type(-a1) /= ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(a % ui).str(), test_type(a1 % ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(-a % ui).str(), test_type(-a1 % ui).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) %= ui).str(), (test_type(a1) %= ui).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) %= ui).str(), (test_type(-a1) %= ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(a | ui).str(), test_type(a1 | ui).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) |= ui).str(), (test_type(a1) |= ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(a & ui).str(), test_type(a1 & ui).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) &= ui).str(), (test_type(a1) &= ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(a ^ ui).str(), test_type(a1 ^ ui).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) ^= ui).str(), (test_type(a1) ^= ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(ui | a).str(), test_type(ui | a1).str());\n      BOOST_CHECK_EQUAL(mpz_int(ui & a).str(), test_type(ui & a1).str());\n      BOOST_CHECK_EQUAL(mpz_int(ui ^ a).str(), test_type(ui ^ a1).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(a, ui)).str(), test_type(gcd(a1, ui)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(ui, b)).str(), test_type(gcd(ui, b1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(c, ui)).str(), test_type(lcm(c1, ui)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(ui, d)).str(), test_type(lcm(ui, d1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(-a, ui)).str(), test_type(gcd(-a1, ui)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(-c, ui)).str(), test_type(lcm(-c1, ui)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(ui, -b)).str(), test_type(gcd(ui, -b1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(ui, -d)).str(), test_type(lcm(ui, -d1)).str());\n\n      if (std::numeric_limits<test_type>::is_modulo && checked::value)\n      {\n         static mpz_int m = mpz_int(1) << std::numeric_limits<test_type>::digits;\n         mpz_int        t(a);\n         test_type      t1(a1);\n         for (unsigned i = 0; i < 10; ++i)\n         {\n            t *= a;\n            t %= m;\n            t += a;\n            t %= m;\n            t1 *= a1;\n            t1 += a1;\n         }\n         BOOST_CHECK_EQUAL(t.str(), t1.str());\n      }\n   }\n   void t4_large()\n   {\n      using namespace boost::multiprecision;\n      // Now check operations involving unsigned integers:\n      BOOST_CHECK_EQUAL(mpz_int(a + large_ui).str(), test_type(a1 + large_ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(-a + large_ui).str(), test_type(-a1 + large_ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(large_ui + a).str(), test_type(large_ui + a1).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) += large_ui).str(), (test_type(a1) += large_ui).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) += large_ui).str(), (test_type(-a1) += large_ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(a - large_ui).str(), test_type(a1 - large_ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(-a - large_ui).str(), test_type(-a1 - large_ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(large_ui - a).str(), test_type(large_ui - a1).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) -= large_ui).str(), (test_type(a1) -= large_ui).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) -= large_ui).str(), (test_type(-a1) -= large_ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(b * large_ui).str(), test_type(b1 * large_ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(-b * large_ui).str(), test_type(-b1 * large_ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(large_ui * b).str(), test_type(large_ui * b1).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) *= large_ui).str(), (test_type(a1) *= large_ui).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) *= large_ui).str(), (test_type(-a1) *= large_ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(a / large_ui).str(), test_type(a1 / large_ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(-a / large_ui).str(), test_type(-a1 / large_ui).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) /= large_ui).str(), (test_type(a1) /= large_ui).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) /= large_ui).str(), (test_type(-a1) /= large_ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(a % large_ui).str(), test_type(a1 % large_ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(-a % large_ui).str(), test_type(-a1 % large_ui).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) %= large_ui).str(), (test_type(a1) %= large_ui).str());\n      BOOST_CHECK_EQUAL((mpz_int(-a) %= large_ui).str(), (test_type(-a1) %= large_ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(a | large_ui).str(), test_type(a1 | large_ui).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) |= large_ui).str(), (test_type(a1) |= large_ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(a & large_ui).str(), test_type(a1 & large_ui).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) &= large_ui).str(), (test_type(a1) &= large_ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(a ^ large_ui).str(), test_type(a1 ^ large_ui).str());\n      BOOST_CHECK_EQUAL((mpz_int(a) ^= large_ui).str(), (test_type(a1) ^= large_ui).str());\n      BOOST_CHECK_EQUAL(mpz_int(large_ui | a).str(), test_type(large_ui | a1).str());\n      BOOST_CHECK_EQUAL(mpz_int(large_ui & a).str(), test_type(large_ui & a1).str());\n      BOOST_CHECK_EQUAL(mpz_int(large_ui ^ a).str(), test_type(large_ui ^ a1).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(a, large_ui)).str(), test_type(gcd(a1, large_ui)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(large_ui, b)).str(), test_type(gcd(large_ui, b1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(c, large_ui)).str(), test_type(gcd(c1, large_ui)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(c, large_ui)).str(), test_type(lcm(c1, large_ui)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(large_ui, d)).str(), test_type(lcm(large_ui, d1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(-a, large_ui)).str(), test_type(gcd(-a1, large_ui)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(-c, large_ui)).str(), test_type(lcm(-c1, large_ui)).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(large_ui, -b)).str(), test_type(gcd(large_ui, -b1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(large_ui, -d)).str(), test_type(lcm(large_ui, -d1)).str());\n   }\n\n   void t5()\n   {\n      using namespace boost::multiprecision;\n      //\n      // Now integer functions:\n      //\n      mpz_int   z1, z2;\n      test_type t1, t2;\n      divide_qr(a, b, z1, z2);\n      divide_qr(a1, b1, t1, t2);\n      BOOST_CHECK_EQUAL(z1.str(), t1.str());\n      BOOST_CHECK_EQUAL(z2.str(), t2.str());\n      BOOST_CHECK_EQUAL(integer_modulus(a, si), integer_modulus(a1, si));\n      BOOST_CHECK_EQUAL(integer_modulus(a, ui), integer_modulus(a1, ui));\n      BOOST_CHECK_EQUAL(mpz_int(integer_modulus(a, large_ui)).str(), test_type(integer_modulus(a1, large_ui)).str());\n      BOOST_CHECK_EQUAL(lsb(a), lsb(a1));\n      BOOST_CHECK_EQUAL(msb(a), msb(a1));\n\n      for (unsigned i = 0; i < 1000; i += 13)\n      {\n         BOOST_CHECK_EQUAL(bit_test(a, i), bit_test(a1, i));\n      }\n      if (!std::numeric_limits<test_type>::is_modulo)\n      {\n         // We have to take care that our powers don't grow too large, otherwise this takes \"forever\",\n         // also don't test for modulo types, as these may give a different result from arbitrary\n         // precision types:\n         BOOST_CHECK_EQUAL(mpz_int(pow(d, ui % 19)).str(), test_type(pow(d1, ui % 19)).str());\n         BOOST_CHECK_EQUAL(mpz_int(powm(a, b, c)).str(), test_type(powm(a1, b1, c1)).str());\n         BOOST_CHECK_EQUAL(mpz_int(powm(a, b, ui)).str(), test_type(powm(a1, b1, ui)).str());\n         BOOST_CHECK_EQUAL(mpz_int(powm(a, ui, c)).str(), test_type(powm(a1, ui, c1)).str());\n      }\n      BOOST_CHECK_EQUAL(lsb(a), lsb(a1));\n      BOOST_CHECK_EQUAL(msb(a), msb(a1));\n   }\n\n   static void test_bug_cases()\n   {\n      if (!std::numeric_limits<test_type>::is_bounded)\n      {\n         // https://svn.boost.org/trac/boost/ticket/7878\n         test_type a(\"0x1000000000000000000000000000000000000000000000000000000000000000\");\n         test_type b = 0xFFFFFFFF;\n         test_type c = a * b + b; // quotient has 1 in the final place\n         test_type q, r;\n         divide_qr(c, b, q, r);\n         BOOST_CHECK_EQUAL(a + 1, q);\n         BOOST_CHECK_EQUAL(r, 0);\n\n         b = static_cast<test_type>(\"0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\");\n         c = a * b + b; // quotient has 1 in the final place\n         divide_qr(c, b, q, r);\n         BOOST_CHECK_EQUAL(a + 1, q);\n         BOOST_CHECK_EQUAL(r, 0);\n         //\n         // Not a bug, but test some other special cases that don't otherwise occur through\n         // random testing:\n         //\n         c = a * b; // quotient has zero in the final place\n         divide_qr(c, b, q, r);\n         BOOST_CHECK_EQUAL(q, a);\n         BOOST_CHECK_EQUAL(r, 0);\n         divide_qr(c, a, q, r);\n         BOOST_CHECK_EQUAL(q, b);\n         BOOST_CHECK_EQUAL(r, 0);\n         ++c;\n         divide_qr(c, b, q, r);\n         BOOST_CHECK_EQUAL(q, a);\n         BOOST_CHECK_EQUAL(r, 1);\n      }\n      // Bug https://svn.boost.org/trac/boost/ticket/8126:\n      test_type a(\"-4294967296\");\n      test_type b(\"4294967296\");\n      test_type c(\"-1\");\n      a = (a / b);\n      BOOST_CHECK_EQUAL(a, -1);\n      a = -4294967296;\n      a = (a / b) * c;\n      BOOST_CHECK_EQUAL(a, 1);\n      a = -23;\n      b = 23;\n      a = (a / b) * c;\n      BOOST_CHECK_EQUAL(a, 1);\n      a = -23;\n      a = (a / b) / c;\n      BOOST_CHECK_EQUAL(a, 1);\n      a = test_type(\"-26607734784073568386365259775\");\n      b = test_type(\"8589934592\");\n      a = a / b;\n      BOOST_CHECK_EQUAL(a, test_type(\"-3097548007973652377\"));\n      // Bug https://svn.boost.org/trac/boost/ticket/8133:\n      a           = test_type(\"0x12345600012434ffffffffffffffffffffffff\");\n      unsigned ui = 0xffffffff;\n      a           = a - ui;\n      BOOST_CHECK_EQUAL(a, test_type(\"0x12345600012434ffffffffffffffff00000000\"));\n      a = test_type(\"0x12345600012434ffffffffffffffffffffffff\");\n#ifndef BOOST_NO_LONG_LONG\n      unsigned long long ull = 0xffffffffffffffffuLL;\n      a                      = a - ull;\n      BOOST_CHECK_EQUAL(a, test_type(\"0x12345600012434ffffffff0000000000000000\"));\n#endif\n      //\n      // Now check that things which should be zero really are\n      // https://svn.boost.org/trac/boost/ticket/8145:\n      //\n      a = -1;\n      a += 1;\n      BOOST_CHECK_EQUAL(a, 0);\n      a = 1;\n      a += -1;\n      BOOST_CHECK_EQUAL(a, 0);\n      a = -1;\n      a += test_type(1);\n      BOOST_CHECK_EQUAL(a, 0);\n      a = 1;\n      a += test_type(-1);\n      BOOST_CHECK_EQUAL(a, 0);\n      a = test_type(\"0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\");\n      a -= test_type(\"0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\");\n      BOOST_CHECK_EQUAL(a, 0);\n      a = -test_type(\"0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\");\n      a += test_type(\"0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\");\n      BOOST_CHECK_EQUAL(a, 0);\n      a = 2;\n      a *= 0;\n      BOOST_CHECK_EQUAL(a, 0);\n      a = -2;\n      a *= 0;\n      BOOST_CHECK_EQUAL(a, 0);\n      a = 2;\n      a *= test_type(0);\n      BOOST_CHECK_EQUAL(a, 0);\n      a = -2;\n      a *= test_type(0);\n      BOOST_CHECK_EQUAL(a, 0);\n      a = -2;\n      a /= 50;\n      BOOST_CHECK_EQUAL(a, 0);\n      a = -test_type(\"0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\");\n      a /= (1 + test_type(\"0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\"));\n      BOOST_CHECK_EQUAL(a, 0);\n      // https://svn.boost.org/trac/boost/ticket/8160\n      a = 1;\n      a = 0 / test_type(1);\n      BOOST_CHECK_EQUAL(a, 0);\n      a = 1;\n      a = 0 % test_type(25);\n      BOOST_CHECK_EQUAL(a, 0);\n#if !defined(TEST2) && !defined(TEST6)\n      // https://svn.boost.org/trac/boost/ticket/11364\n      a           = 0xfffffffeu;\n      b           = -2;\n      c           = a ^ b;\n      test_type d = ~(a ^ ~b);\n      BOOST_CHECK_EQUAL(c, d);\n#endif\n#if defined(TEST2) || defined(TEST3) || defined(TEST6)\n      // https://svn.boost.org/trac/boost/ticket/11648\n      a = (std::numeric_limits<test_type>::max)() - 69;\n      b = a / 139;\n      ++b;\n      c           = a / b;\n      test_type r = a % b;\n      BOOST_CHECK(r < b);\n      BOOST_CHECK_EQUAL(a - c * b, r);\n#endif\n      for (ui = 0; ui < 1000; ++ui)\n      {\n         boost::multiprecision::mpz_int t;\n         boost::multiprecision::mpz_int s1 = sqrt(boost::multiprecision::mpz_int(ui), t);\n         a                                 = sqrt(test_type(ui), b);\n         BOOST_CHECK_EQUAL(a.str(), s1.str());\n         BOOST_CHECK_EQUAL(b.str(), t.str());\n         a = sqrt(test_type(ui) + test_type(0));\n         BOOST_CHECK_EQUAL(a.str(), s1.str());\n         a = sqrt(test_type(ui) * test_type(1));\n         BOOST_CHECK_EQUAL(a.str(), s1.str());\n         a = sqrt(test_type(ui) * 1, b);\n         BOOST_CHECK_EQUAL(a.str(), s1.str());\n         BOOST_CHECK_EQUAL(b.str(), t.str());\n      }\n      a = -1;\n      ++a;\n      BOOST_CHECK_EQUAL(a, 0);\n      ++--a;\n      BOOST_CHECK_EQUAL(a, 0);\n      --++a;\n      BOOST_CHECK_EQUAL(a, 0);\n\n      {\n         typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<> >                                                                                            bigint;\n         //typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void> >   u64;\n         //typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<128, 128, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void> > u128;\n         typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void> > u256;\n         typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<256, 256, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void> >   s256;\n         //typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<160, 160, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void> > u160;\n         //typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<160, 160, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void> >   s160;\n         //typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<512, 512, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void> > u512;\n         //typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<512, 512, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void> >   s512;\n\n         {\n            u256   a = 14;\n            bigint b = bigint(\"115792089237316195423570985008687907853269984665640564039457584007913129639948\");\n            // to fix cast `a` to dev::bigint\n            BOOST_CHECK(a < b);\n         }\n         {\n            u256            a      = 1;\n            std::uint64_t amount = 1;\n            u256            b      = a << amount;\n            BOOST_CHECK_EQUAL(b, 2);\n\n            u256 high_bit = u256(0);\n            bit_set(high_bit, 255);\n            BOOST_CHECK_EQUAL(a << 255, high_bit);\n            BOOST_CHECK_EQUAL(a << std::uint64_t(256), 0);\n            BOOST_CHECK_EQUAL(a << 0, a);\n\n            u256 c = 3;\n            BOOST_CHECK_EQUAL(c, 3);\n            BOOST_CHECK_EQUAL(c << std::uint64_t(256), 0);\n            BOOST_CHECK_EQUAL(c << 0, c);\n\n            // Bug workaround:\n            BOOST_CHECK_EQUAL(static_cast<u256>(bigint(u256(3)) << 255), u256(1) << 255);\n         }\n         {\n            BOOST_CHECK_EQUAL(u256(3) << 255, u256(1) << 255);\n\n            u256            a      = 1;\n            std::uint64_t amount = 1;\n            u256            b      = a >> amount;\n            BOOST_CHECK_EQUAL(b, 0);\n            BOOST_CHECK_EQUAL(a >> 255, 0);\n            BOOST_CHECK_EQUAL(a >> std::uint64_t(256), 0);\n            BOOST_CHECK_EQUAL(a >> std::uint64_t(-1), 0);\n\n            u256 h;\n            bit_set(h, 255);\n            BOOST_CHECK_EQUAL(h >> 0, u256(1) << 255);\n            BOOST_CHECK_EQUAL(h >> 1, u256(1) << 254);\n            BOOST_CHECK_EQUAL(h >> 2, u256(1) << 253);\n            BOOST_CHECK_EQUAL(h >> 254, u256(1) << 1);\n            BOOST_CHECK_EQUAL(h >> 255, u256(1) << 0);\n            BOOST_CHECK_EQUAL(h >> 256, 0);\n            BOOST_CHECK_EQUAL(h >> std::uint64_t(-1), 0);\n\n            u256 g;\n            bit_set(g, 255);\n            bit_set(g, 254);\n            BOOST_CHECK_EQUAL(g >> 255, 1);\n            BOOST_CHECK_EQUAL(g >> 254, 3);\n            BOOST_CHECK_EQUAL(g >> 253, 3 << 1);\n            BOOST_CHECK_EQUAL(g >> 252, 3 << 2);\n            BOOST_CHECK_EQUAL(g >> 251, 3 << 3);\n            BOOST_CHECK_EQUAL(g >> 0, u256(3) << 254);\n            BOOST_CHECK_EQUAL(g >> 1, u256(3) << 253);\n            BOOST_CHECK_EQUAL(g >> 2, u256(3) << 252);\n            BOOST_CHECK_EQUAL(g >> 3, u256(3) << 251);\n            BOOST_CHECK_EQUAL(g >> 100, u256(3) << 154);\n            BOOST_CHECK_EQUAL(g >> 256, 0);\n            BOOST_CHECK_EQUAL(g >> 257, 0);\n            BOOST_CHECK_EQUAL(g >> std::uint32_t(-1), 0);\n            BOOST_CHECK_EQUAL(g >> std::uint64_t(-1), 0);\n            BOOST_CHECK_EQUAL(g >> std::uint16_t(-1), 0);\n            BOOST_CHECK_EQUAL(g >> (std::uint16_t(-1) - 1), 0);\n         }\n         {\n            s256     a      = 1;\n            uint64_t amount = 1;\n            s256     b      = a >> amount;\n            BOOST_CHECK_EQUAL(b, 0);\n            BOOST_CHECK_EQUAL(a >> 255, 0);\n            BOOST_CHECK_EQUAL(a >> std::uint64_t(256), 0);\n            BOOST_CHECK_EQUAL(a >> std::uint64_t(-1), 0);\n\n            s256 n = -1;\n            BOOST_CHECK_EQUAL(n >> 0, n);\n            BOOST_CHECK_EQUAL(n >> 1, n);\n            BOOST_CHECK_EQUAL(n >> 2, n);\n            BOOST_CHECK_EQUAL(n >> 254, n);\n            BOOST_CHECK_EQUAL(n >> 255, n);\n            BOOST_CHECK_EQUAL(n >> 256, n);\n            BOOST_CHECK_EQUAL(n >> 257, n);\n            BOOST_CHECK_EQUAL(n >> ~std::uint64_t(0), n);\n\n            // Test min value. This actually -(2^256-1), not -(2^255) as in C.\n            s256 h = (std::numeric_limits<s256>::min)();\n            BOOST_CHECK_LT(h, 0);\n            BOOST_CHECK_EQUAL(h >> 0, h);\n            BOOST_CHECK_EQUAL(h >> 256, -1);\n\n            // Test EVM min value.\n            s256 g = s256(-1) << 255;\n            BOOST_CHECK_LT(g, 0);\n            BOOST_CHECK_EQUAL(static_cast<u256>(g), u256(1) << 255);\n            BOOST_CHECK_EQUAL(g >> 0, g);\n            BOOST_CHECK_EQUAL(static_cast<u256>(g >> 1), u256(0b11) << 254);\n            BOOST_CHECK_EQUAL(static_cast<u256>(g >> 2), u256(0b111) << 253);\n            BOOST_CHECK_EQUAL(static_cast<u256>(g >> 3), u256(0b1111) << 252);\n\n            BOOST_CHECK_EQUAL(static_cast<u256>(g >> 255), ~u256(0));\n            BOOST_CHECK_EQUAL(static_cast<u256>(g >> 254), ~u256(0b1));\n            BOOST_CHECK_EQUAL(static_cast<u256>(g >> 253), ~u256(0b11));\n\n            // Test shifting more that one bit.\n            s256 k = s256(0b111) << 252;\n            BOOST_CHECK_EQUAL(k, u256(0b111) << 252);\n            BOOST_CHECK_EQUAL(k >> 1, u256(0b111) << 251);\n            BOOST_CHECK_EQUAL(k >> 2, u256(0b111) << 250);\n            BOOST_CHECK_EQUAL(k >> 252, 0b111);\n            BOOST_CHECK_EQUAL(k >> 253, 0b11);\n            BOOST_CHECK_EQUAL(k >> 254, 0b1);\n            BOOST_CHECK_EQUAL(k >> 255, 0);\n            BOOST_CHECK_EQUAL(k >> 256, 0);\n            BOOST_CHECK_EQUAL(k >> ~std::uint32_t(0), 0);\n\n            // Division equivalence.\n\n            // Built-in type:\n            if (std::numeric_limits<std::int64_t>::is_specialized)\n            {\n               std::int64_t d = (std::numeric_limits<std::int64_t>::min)();\n               BOOST_CHECK_EQUAL(d >> 1, d / 2);\n               int64_t e = d + 1;\n               BOOST_CHECK_EQUAL(e >> 1, e / 2 - 1);\n\n               // Boost type:\n               BOOST_CHECK_EQUAL(h >> 1, h / 2 - 1);\n            }\n         }\n      }\n   }\n\n   void test()\n   {\n      using namespace boost::multiprecision;\n\n      test_bug_cases();\n\n      last_error_count = 0;\n\n      BOOST_CHECK_EQUAL(Number(), 0);\n\n      for (int i = 0; i < 10000; ++i)\n      {\n         a = generate_random<mpz_int>(1000);\n         b = generate_random<mpz_int>(512);\n         c = generate_random<mpz_int>(256);\n         d = generate_random<mpz_int>(32);\n\n         si = d.convert_to<int>();\n         ui = si;\n         large_ui = c.convert_to<boost::multiprecision::double_limb_type>();\n\n         a1 = static_cast<test_type>(a.str());\n         b1 = static_cast<test_type>(b.str());\n         c1 = static_cast<test_type>(c.str());\n         d1 = static_cast<test_type>(d.str());\n\n         t1();\n         t2();\n#ifndef SLOW_COMPILER\n         t3();\n         t4();\n         t4_large();\n         t5();\n#endif\n\n         if (last_error_count != (unsigned)boost::detail::test_errors())\n         {\n            last_error_count = boost::detail::test_errors();\n            std::cout << std::hex << std::showbase;\n\n            std::cout << \"a    = \" << a << std::endl;\n            std::cout << \"a1   = \" << a1 << std::endl;\n            std::cout << \"b    = \" << b << std::endl;\n            std::cout << \"b1   = \" << b1 << std::endl;\n            std::cout << \"c    = \" << c << std::endl;\n            std::cout << \"c1   = \" << c1 << std::endl;\n            std::cout << \"d    = \" << d << std::endl;\n            std::cout << \"d1   = \" << d1 << std::endl;\n            std::cout << \"a + b   = \" << a + b << std::endl;\n            std::cout << \"a1 + b1 = \" << a1 + b1 << std::endl;\n            std::cout << std::dec;\n            std::cout << \"a - b   = \" << a - b << std::endl;\n            std::cout << \"a1 - b1 = \" << a1 - b1 << std::endl;\n            std::cout << \"-a + b   = \" << mpz_int(-a) + b << std::endl;\n            std::cout << \"-a1 + b1 = \" << test_type(-a1) + b1 << std::endl;\n            std::cout << \"-a - b   = \" << mpz_int(-a) - b << std::endl;\n            std::cout << \"-a1 - b1 = \" << test_type(-a1) - b1 << std::endl;\n            std::cout << \"c*d    = \" << c * d << std::endl;\n            std::cout << \"c1*d1  = \" << c1 * d1 << std::endl;\n            std::cout << \"b*c    = \" << b * c << std::endl;\n            std::cout << \"b1*c1  = \" << b1 * c1 << std::endl;\n            std::cout << \"a/b    = \" << a / b << std::endl;\n            std::cout << \"a1/b1  = \" << a1 / b1 << std::endl;\n            std::cout << \"a/d    = \" << a / d << std::endl;\n            std::cout << \"a1/d1  = \" << a1 / d1 << std::endl;\n            std::cout << \"a%b    = \" << a % b << std::endl;\n            std::cout << \"a1%b1  = \" << a1 % b1 << std::endl;\n            std::cout << \"a%d    = \" << a % d << std::endl;\n            std::cout << \"a1%d1  = \" << a1 % d1 << std::endl;\n         }\n\n         //\n         // Check to see if test is taking too long.\n         // Tests run on the compiler farm time out after 300 seconds,\n         // so don't get too close to that:\n         //\n#ifndef CI_SUPPRESS_KNOWN_ISSUES\n         if (tim.elapsed() > 200)\n#else\n         if (tim.elapsed() > 25)\n#endif\n         {\n            std::cout << \"Timeout reached, aborting tests now....\\n\";\n            break;\n         }\n      }\n   }\n};\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n#ifdef TEST1\n   tester<cpp_int> t1;\n   t1.test();\n#endif\n#ifdef TEST2\n   tester<number<cpp_int_backend<2048, 2048, signed_magnitude, checked, void> > > t2;\n   t2.test();\n#endif\n#ifdef TEST3\n   // Unchecked test verifies modulo arithmetic:\n   tester<number<cpp_int_backend<2048, 2048, signed_magnitude, unchecked, void> > > t3;\n   t3.test();\n#endif\n#ifdef TEST4\n   tester<number<cpp_int_backend<0, 2048, signed_magnitude, unchecked, std::allocator<char> > > > t4;\n   t4.test();\n#endif\n#ifdef TEST5\n   tester<number<cpp_int_backend<0, 2048, signed_magnitude, unchecked> > > t5;\n   t5.test();\n#endif\n#ifdef TEST6\n   tester<number<cpp_int_backend<2048, 2048, signed_magnitude, checked, void> > > t6;\n   t6.test();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cpp_int_conv.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#include <boost/multiprecision/cpp_int.hpp>\n\nint main()\n{\n   using namespace boost::multiprecision;\n   //\n   // Test interconversions between different precisions:\n   //\n   cpp_int                                                           i1(2);\n   int128_t                                                          i2(3);\n   int256_t                                                          i3(4);\n   number<cpp_int_backend<32, 32, signed_magnitude, checked, void> > i4(5);\n\n   i1 = i3;\n   BOOST_TEST(i1 == 4);\n   i1 = i4;\n   BOOST_TEST(i1 == 5);\n\n   i3 = -1234567;\n   i4 = -5677334;\n   i1 = i3;\n   BOOST_TEST(i1 == -1234567);\n   i1 = i4;\n   BOOST_TEST(i1 == -5677334);\n\n   i3 = i2;\n   BOOST_TEST(i3 == 3);\n\n   i3 = -1234567;\n\n   uint128_t i5(i3);\n   BOOST_TEST(i5 == -1234567);\n\n   int128_t i6(i4);\n   BOOST_TEST(i6 == -5677334);\n\n   number<cpp_int_backend<32, 32, signed_magnitude, unchecked, void>, et_off> i7(i3);\n   BOOST_TEST(i7 == -1234567);\n\n   int256_t i8(i6);\n   BOOST_TEST(i8 == -5677334);\n\n   i7.assign(4.0);\n   BOOST_TEST(i7 == 4);\n\n   number<cpp_int_backend<30, 30, signed_magnitude, checked, void>, et_off> i9(-5677334);\n   i7 = i9;\n   BOOST_TEST(i7 == -5677334);\n   i7 = number<cpp_int_backend<32, 32, signed_magnitude, checked, void>, et_off>(i9);\n   BOOST_TEST(i7 == -5677334);\n\n   i9 = static_cast<number<cpp_int_backend<30, 30, signed_magnitude, checked, void>, et_off> >(i7);\n   BOOST_TEST(i9 == -5677334);\n\n   ++i9;\n   i7 = i9;\n   BOOST_TEST(i7 == 1 - 5677334);\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cpp_int_deserial.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//\n// Compare arithmetic results using fixed_int to GMP results.\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include \"test.hpp\"\n\n#include <iostream>\n#include <iomanip>\n#include <fstream>\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/archive/binary_iarchive.hpp>\n#include <boost/archive/binary_oarchive.hpp>\n#include <boost/exception/all.hpp>\n#include <boost/filesystem.hpp>\n#include <boost/filesystem/fstream.hpp>\n\nboost::filesystem::path root;\n\ntemplate <class T>\nvoid test64()\n{\n   using namespace boost::multiprecision;\n\n   const char* text_array[] = {\n       \"4991075498124186\",\n       \"-4991075498124186\",\n       \"750\",\n       \"-750\",\n       \"415210192158791091\",\n       \"-415210192158791091\",\n       \"2172493004228646\",\n       \"-2172493004228646\",\n       \"993\",\n       \"-993\",\n       \"801484291299519218\",\n       \"-801484291299519218\",\n       \"294605502329193119\",\n       \"-294605502329193119\",\n       \"52506\",\n       \"-52506\",\n       \"1509449075377\",\n       \"-1509449075377\",\n       \"2042599\",\n       \"-2042599\",\n       \"228\",\n       \"-228\",\n       \"38666759073\",\n       \"-38666759073\",\n       \"611489\",\n       \"-611489\",\n       \"5393\",\n       \"-5393\",\n       \"12930071684\",\n       \"-12930071684\",\n       \"3606852234541437552\",\n       \"-3606852234541437552\",\n       \"3764404188985662264\",\n       \"-3764404188985662264\",\n       \"13300301596736993408\",\n       \"-13300301596736993408\",\n       \"3519758520509816019\",\n       \"-3519758520509816019\",\n       \"811951798554103911\",\n       \"-811951798554103911\",\n       \"2440\",\n       \"-2440\",\n       \"175149377023342\",\n       \"-175149377023342\",\n       \"5347169560611466452\",\n       \"-5347169560611466452\",\n       \"187134495165780485\",\n       \"-187134495165780485\",\n       \"761263991097466327\",\n       \"-761263991097466327\",\n       \"205\",\n       \"-205\",\n       \"7437277938\",\n       \"-7437277938\",\n       \"2530448830165700\",\n       \"-2530448830165700\",\n       \"3771546153060183\",\n       \"-3771546153060183\",\n       \"1238034\",\n       \"-1238034\",\n       \"1470\",\n       \"-1470\",\n       \"7\",\n       \"-7\",\n       \"203065689\",\n       \"-203065689\",\n       \"130\",\n       \"-130\",\n       \"74717518653749632\",\n       \"-74717518653749632\",\n       \"3028698162338\",\n       \"-3028698162338\",\n       \"3471587482356581\",\n       \"-3471587482356581\",\n       \"34698219712863216\",\n       \"-34698219712863216\",\n       \"941191493582057728\",\n       \"-941191493582057728\",\n       \"14803251323\",\n       \"-14803251323\",\n       \"552076672455\",\n       \"-552076672455\",\n       \"410481316632532\",\n       \"-410481316632532\",\n       \"6\",\n       \"-6\",\n       \"3851011\",\n       \"-3851011\",\n       \"12895806074024545\",\n       \"-12895806074024545\",\n       \"59538\",\n       \"-59538\",\n       \"944776298737546117\",\n       \"-944776298737546117\",\n       \"25010240662345\",\n       \"-25010240662345\",\n       \"29657097213970\",\n       \"-29657097213970\",\n       \"88000252\",\n       \"-88000252\",\n       \"545263458410825\",\n       \"-545263458410825\",\n       \"216600129907865\",\n       \"-216600129907865\",\n       \"262741237793873\",\n       \"-262741237793873\",\n       \"226964744\",\n       \"-226964744\",\n       \"111776857\",\n       \"-111776857\",\n       \"346922769\",\n       \"-346922769\",\n       \"7324307011273\",\n       \"-7324307011273\",\n       \"182\",\n       \"-182\",\n       \"4204\",\n       \"-4204\",\n       \"60455\",\n       \"-60455\",\n       \"35250836865461\",\n       \"-35250836865461\",\n       \"4100298085120029\",\n       \"-4100298085120029\",\n       \"6\",\n       \"-6\",\n       \"3262369\",\n       \"-3262369\",\n       \"103928\",\n       \"-103928\",\n       \"82055266594432948\",\n       \"-82055266594432948\",\n       \"8\",\n       \"-8\",\n       \"1731\",\n       \"-1731\",\n       \"338\",\n       \"-338\",\n       \"13202690186510006305\",\n       \"-13202690186510006305\",\n       \"3916209444926814\",\n       \"-3916209444926814\",\n       \"1801701990484582\",\n       \"-1801701990484582\",\n       \"54042343363098\",\n       \"-54042343363098\",\n       \"86\",\n       \"-86\",\n       \"1346703\",\n       \"-1346703\",\n       \"34499847353417\",\n       \"-34499847353417\",\n       \"870972860051498248\",\n       \"-870972860051498248\",\n       \"2676223213\",\n       \"-2676223213\",\n       \"10\",\n       \"-10\",\n       \"2207730666882\",\n       \"-2207730666882\",\n       \"256557933\",\n       \"-256557933\",\n       \"742\",\n       \"-742\",\n       \"17809514\",\n       \"-17809514\",\n       \"41738\",\n       \"-41738\",\n       \"937490350973899\",\n       \"-937490350973899\",\n       \"10\",\n       \"-10\",\n       \"2153955175933399\",\n       \"-2153955175933399\",\n       \"21\",\n       \"-21\",\n       \"9767\",\n       \"-9767\",\n       \"160991545\",\n       \"-160991545\",\n       \"5537202949\",\n       \"-5537202949\",\n       \"1729222816\",\n       \"-1729222816\",\n       \"880543773\",\n       \"-880543773\",\n       \"4994415770\",\n       \"-4994415770\",\n       \"5667270210124\",\n       \"-5667270210124\",\n       \"1789552738407096\",\n       \"-1789552738407096\",\n       \"52084908492459\",\n       \"-52084908492459\",\n       \"419923376385918098\",\n       \"-419923376385918098\",\n       \"193184120308428\",\n       \"-193184120308428\",\n       \"3716593161704457\",\n       \"-3716593161704457\",\n       \"835313\",\n       \"-835313\",\n       \"47794728416344\",\n       \"-47794728416344\",\n       \"32162267350660\",\n       \"-32162267350660\",\n       \"1\",\n       \"-1\",\n       \"6746653265049\",\n       \"-6746653265049\",\n       \"72924075986572\",\n       \"-72924075986572\",\n       \"4061\",\n       \"-4061\",\n       \"1776612112178\",\n       \"-1776612112178\",\n       \"798\",\n       \"-798\",\n       \"266401037\",\n       \"-266401037\",\n       \"6773927626\",\n       \"-6773927626\",\n       \"935572859041371\",\n       \"-935572859041371\",\n       \"2667878767142547263\",\n       \"-2667878767142547263\",\n       \"107694081993\",\n       \"-107694081993\",\n       \"2478862\",\n       \"-2478862\",\n       \"75439252494463178\",\n       \"-75439252494463178\",\n       \"502732137506\",\n       \"-502732137506\",\n       \"1345285828338743\",\n       \"-1345285828338743\",\n       \"15181\",\n       \"-15181\",\n       \"6\",\n       \"-6\",\n       \"503497089658971\",\n       \"-503497089658971\",\n       \"3925896855680859\",\n       \"-3925896855680859\",\n       \"259231\",\n       \"-259231\",\n       \"7499637741115431\",\n       \"-7499637741115431\",\n       \"16282283214\",\n       \"-16282283214\",\n       \"1664259700668569315\",\n       \"-1664259700668569315\",\n       \"63205423227654\",\n       \"-63205423227654\",\n       \"122839112\",\n       \"-122839112\",\n       \"254133246000861645\",\n       \"-254133246000861645\",\n       \"324448699\",\n       \"-324448699\",\n       \"2634830651678498499\",\n       \"-2634830651678498499\",\n       \"65612160397\",\n       \"-65612160397\",\n       \"7064926544\",\n       \"-7064926544\",\n       \"3816\",\n       \"-3816\",\n       \"1964\",\n       \"-1964\",\n       \"208639360759781\",\n       \"-208639360759781\",\n       \"3910\",\n       \"-3910\",\n       \"95080\",\n       \"-95080\",\n       \"175945\",\n       \"-175945\",\n       \"5880392757177227\",\n       \"-5880392757177227\",\n       \"17254376508100660\",\n       \"-17254376508100660\",\n       \"16568677462108662019\",\n       \"-16568677462108662019\",\n       \"193490\",\n       \"-193490\",\n       \"6055816\",\n       \"-6055816\",\n       \"4421583059373970\",\n       \"-4421583059373970\",\n       \"34879\",\n       \"-34879\",\n       \"52778\",\n       \"-52778\",\n       \"0\",\n       \"0\",\n       \"935000170463558922\",\n       \"-935000170463558922\",\n       \"173\",\n       \"-173\",\n       \"10327678\",\n       \"-10327678\",\n       \"45810516546119519\",\n       \"-45810516546119519\",\n       \"8712\",\n       \"-8712\",\n       \"1932876094515139\",\n       \"-1932876094515139\",\n       \"84388\",\n       \"-84388\",\n       \"2050813773845403160\",\n       \"-2050813773845403160\",\n       \"1542848238524\",\n       \"-1542848238524\",\n       \"1555584758215827\",\n       \"-1555584758215827\",\n       \"3571489748\",\n       \"-3571489748\",\n       \"18291705113053112226\",\n       \"-18291705113053112226\",\n       \"5713248\",\n       \"-5713248\",\n       \"43\",\n       \"-43\",\n       \"7537188724850197\",\n       \"-7537188724850197\",\n       \"3450872745386207\",\n       \"-3450872745386207\",\n       \"335595262120\",\n       \"-335595262120\",\n       \"481778267224\",\n       \"-481778267224\",\n       \"86277827129\",\n       \"-86277827129\",\n       \"132147177032651\",\n       \"-132147177032651\",\n       \"222305704702019735\",\n       \"-222305704702019735\",\n       \"15454425372201\",\n       \"-15454425372201\",\n       \"37444\",\n       \"-37444\",\n       \"14915074751748\",\n       \"-14915074751748\",\n       \"322332143987563\",\n       \"-322332143987563\",\n       \"126997604\",\n       \"-126997604\",\n       \"484901511158709\",\n       \"-484901511158709\",\n       \"7452547923\",\n       \"-7452547923\",\n       \"43400437\",\n       \"-43400437\",\n       \"950\",\n       \"-950\",\n       \"133435748899\",\n       \"-133435748899\",\n       \"13225323986\",\n       \"-13225323986\",\n       \"113\",\n       \"-113\",\n       \"31298263\",\n       \"-31298263\",\n       \"33\",\n       \"-33\",\n       \"11093233\",\n       \"-11093233\",\n       \"13921728621\",\n       \"-13921728621\",\n       \"256811828405\",\n       \"-256811828405\",\n       \"568533463853249\",\n       \"-568533463853249\",\n       \"384553\",\n       \"-384553\",\n       \"1046793359495877872\",\n       \"-1046793359495877872\",\n       \"3513488911471240501\",\n       \"-3513488911471240501\",\n       \"999\",\n       \"-999\",\n       \"3257\",\n       \"-3257\",\n       \"141868737283\",\n       \"-141868737283\",\n       \"97723548\",\n       \"-97723548\",\n       \"380232796\",\n       \"-380232796\",\n       \"11615871\",\n       \"-11615871\",\n       \"2\",\n       \"-2\",\n       \"516935083428\",\n       \"-516935083428\",\n       \"2767393\",\n       \"-2767393\",\n       \"74918721\",\n       \"-74918721\",\n       \"7083\",\n       \"-7083\",\n       \"497484184665289623\",\n       \"-497484184665289623\",\n       \"3309660146889781\",\n       \"-3309660146889781\",\n       \"795624163\",\n       \"-795624163\",\n       \"1739075\",\n       \"-1739075\",\n       \"38737391516580422\",\n       \"-38737391516580422\",\n       \"33363484068\",\n       \"-33363484068\",\n       \"453947517553\",\n       \"-453947517553\",\n       \"7206\",\n       \"-7206\",\n       \"912\",\n       \"-912\",\n       \"1070565937975\",\n       \"-1070565937975\",\n       \"3607679046\",\n       \"-3607679046\",\n       \"503313\",\n       \"-503313\",\n       \"5384337\",\n       \"-5384337\",\n       \"7913554120377\",\n       \"-7913554120377\",\n       \"4112847188\",\n       \"-4112847188\",\n       \"8191226371802\",\n       \"-8191226371802\",\n       \"41268527630506\",\n       \"-41268527630506\",\n       \"446828884957609\",\n       \"-446828884957609\",\n       \"17378379828995102574\",\n       \"-17378379828995102574\",\n       \"802194395\",\n       \"-802194395\",\n       \"6459076776036\",\n       \"-6459076776036\",\n       \"189\",\n       \"-189\",\n       \"456272745323742742\",\n       \"-456272745323742742\",\n       \"35245\",\n       \"-35245\",\n       \"4142317167\",\n       \"-4142317167\",\n       \"240455833189507891\",\n       \"-240455833189507891\",\n       \"32426861928\",\n       \"-32426861928\",\n       \"3464\",\n       \"-3464\",\n       \"15152220677\",\n       \"-15152220677\",\n       \"8550134950160679\",\n       \"-8550134950160679\",\n       \"226598734\",\n       \"-226598734\",\n       \"35686909663\",\n       \"-35686909663\",\n       \"59277903563\",\n       \"-59277903563\",\n       \"6946537179316043375\",\n       \"-6946537179316043375\",\n       \"516198226\",\n       \"-516198226\",\n       \"54\",\n       \"-54\",\n       \"27406574726722597\",\n       \"-27406574726722597\",\n       \"717765982\",\n       \"-717765982\",\n       \"540734180837\",\n       \"-540734180837\",\n       \"381\",\n       \"-381\",\n       \"2883798342\",\n       \"-2883798342\",\n       \"2454889904722697593\",\n       \"-2454889904722697593\",\n       \"5324758776781459411\",\n       \"-5324758776781459411\",\n       \"0\",\n       \"0\",\n       \"3\",\n       \"-3\",\n       \"758016775051877\",\n       \"-758016775051877\",\n       \"6368641396491647651\",\n       \"-6368641396491647651\",\n       \"2409862725919775\",\n       \"-2409862725919775\",\n       \"19831125\",\n       \"-19831125\",\n       \"19839578195623645\",\n       \"-19839578195623645\",\n       \"19556929453271\",\n       \"-19556929453271\",\n       \"245\",\n       \"-245\",\n       \"83382\",\n       \"-83382\",\n       \"30044944\",\n       \"-30044944\",\n       \"10307835790108389\",\n       \"-10307835790108389\",\n       \"266904\",\n       \"-266904\",\n       \"29\",\n       \"-29\",\n       \"1691697088175268\",\n       \"-1691697088175268\",\n       \"6361142035143\",\n       \"-6361142035143\",\n       \"440939789\",\n       \"-440939789\",\n       \"19836890767598\",\n       \"-19836890767598\",\n       \"78676472953102968\",\n       \"-78676472953102968\",\n       \"1663\",\n       \"-1663\",\n       \"7103\",\n       \"-7103\",\n       \"2602952185917450011\",\n       \"-2602952185917450011\",\n       \"8018\",\n       \"-8018\",\n       \"244\",\n       \"-244\",\n       \"1908\",\n       \"-1908\",\n       \"394626\",\n       \"-394626\",\n       \"559\",\n       \"-559\",\n       \"2692219006891972\",\n       \"-2692219006891972\",\n       \"13265871632018922\",\n       \"-13265871632018922\",\n       \"124\",\n       \"-124\",\n       \"222927115625\",\n       \"-222927115625\",\n       \"1283014176523\",\n       \"-1283014176523\",\n       \"63800278885\",\n       \"-63800278885\",\n       \"0\",\n       \"0\",\n       \"1829\",\n       \"-1829\",\n       \"13920824467759\",\n       \"-13920824467759\",\n       \"5133342577177325\",\n       \"-5133342577177325\",\n       \"11207577826\",\n       \"-11207577826\",\n       \"1482655119893\",\n       \"-1482655119893\",\n       \"200471339\",\n       \"-200471339\",\n       \"14758141\",\n       \"-14758141\",\n       \"29794\",\n       \"-29794\",\n       \"17080244\",\n       \"-17080244\",\n       \"699\",\n       \"-699\",\n       \"33751076\",\n       \"-33751076\",\n       \"16396192\",\n       \"-16396192\",\n       \"98\",\n       \"-98\",\n       \"81983490866862\",\n       \"-81983490866862\",\n       \"102679\",\n       \"-102679\",\n       \"13\",\n       \"-13\",\n       \"300\",\n       \"-300\",\n       \"195317\",\n       \"-195317\",\n       \"8257\",\n       \"-8257\",\n       \"9944069581\",\n       \"-9944069581\",\n       \"63162\",\n       \"-63162\",\n       \"2814124367772394\",\n       \"-2814124367772394\",\n       \"136699870\",\n       \"-136699870\",\n       \"2298044154057333478\",\n       \"-2298044154057333478\",\n       \"14\",\n       \"-14\",\n       \"15514009231077760\",\n       \"-15514009231077760\",\n       \"183794877561119741\",\n       \"-183794877561119741\",\n       \"1799598\",\n       \"-1799598\",\n       \"1873291206216770568\",\n       \"-1873291206216770568\",\n       \"31\",\n       \"-31\",\n       \"5025013349\",\n       \"-5025013349\",\n       \"26376\",\n       \"-26376\",\n       \"905247925\",\n       \"-905247925\",\n       \"36545804839\",\n       \"-36545804839\",\n       \"960743\",\n       \"-960743\",\n       \"90208569247342191\",\n       \"-90208569247342191\",\n       \"148711261716954186\",\n       \"-148711261716954186\",\n       \"15491943\",\n       \"-15491943\",\n       \"15539960\",\n       \"-15539960\",\n       \"15\",\n       \"-15\",\n       \"39\",\n       \"-39\",\n       \"7901\",\n       \"-7901\",\n       \"2124324987051603\",\n       \"-2124324987051603\",\n       \"45033487059826453\",\n       \"-45033487059826453\",\n       \"87387056\",\n       \"-87387056\",\n       \"13621\",\n       \"-13621\",\n       \"36002\",\n       \"-36002\",\n       \"130430\",\n       \"-130430\",\n       \"65703401\",\n       \"-65703401\",\n       \"7703922866\",\n       \"-7703922866\",\n       \"171\",\n       \"-171\",\n       \"61731\",\n       \"-61731\",\n       \"1387\",\n       \"-1387\",\n       \"8049274895\",\n       \"-8049274895\",\n       \"1951008680589745867\",\n       \"-1951008680589745867\",\n       \"2763480591525312699\",\n       \"-2763480591525312699\",\n       \"446243894833471417\",\n       \"-446243894833471417\",\n       \"5396319104693\",\n       \"-5396319104693\",\n       \"162371331057\",\n       \"-162371331057\",\n       \"370769520766475\",\n       \"-370769520766475\",\n       \"1\",\n       \"-1\",\n       \"361477542\",\n       \"-361477542\",\n       \"999\",\n       \"-999\",\n       \"5869928506\",\n       \"-5869928506\",\n       \"10725949\",\n       \"-10725949\",\n       \"16\",\n       \"-16\",\n       \"4934609875259411\",\n       \"-4934609875259411\",\n       \"3909261\",\n       \"-3909261\",\n       \"1\",\n       \"-1\",\n       \"96362\",\n       \"-96362\",\n       \"24\",\n       \"-24\",\n       \"206089594430410490\",\n       \"-206089594430410490\",\n       \"104\",\n       \"-104\",\n       \"5836462606744621\",\n       \"-5836462606744621\",\n       \"4267837773445\",\n       \"-4267837773445\",\n       \"485898\",\n       \"-485898\",\n       \"115640927033286\",\n       \"-115640927033286\",\n       \"1554\",\n       \"-1554\",\n       \"8719162940811\",\n       \"-8719162940811\",\n       \"2870768607\",\n       \"-2870768607\",\n       \"1052349661\",\n       \"-1052349661\",\n       \"23867197\",\n       \"-23867197\",\n       \"45326966103\",\n       \"-45326966103\",\n       \"90260998217302\",\n       \"-90260998217302\",\n       \"1523891\",\n       \"-1523891\",\n       \"666993\",\n       \"-666993\",\n       \"107936212247500\",\n       \"-107936212247500\",\n       \"1559140486984\",\n       \"-1559140486984\",\n       \"5874\",\n       \"-5874\",\n       \"5388740994398251\",\n       \"-5388740994398251\",\n       \"9448163810439\",\n       \"-9448163810439\",\n       \"1654654\",\n       \"-1654654\",\n       \"10590\",\n       \"-10590\",\n       \"54734468\",\n       \"-54734468\",\n       \"30749964\",\n       \"-30749964\",\n       \"9811424\",\n       \"-9811424\",\n       \"526166608342\",\n       \"-526166608342\",\n       \"4115859427270797\",\n       \"-4115859427270797\",\n       \"596517644188027\",\n       \"-596517644188027\",\n       \"14364215824260\",\n       \"-14364215824260\",\n       \"187\",\n       \"-187\",\n       \"24260378\",\n       \"-24260378\",\n       \"55791469491162660\",\n       \"-55791469491162660\",\n       \"2106900391\",\n       \"-2106900391\",\n       \"217782523580138\",\n       \"-217782523580138\",\n       \"1216259\",\n       \"-1216259\",\n       \"3275398462\",\n       \"-3275398462\",\n       \"343016100304169644\",\n       \"-343016100304169644\",\n       \"957668440\",\n       \"-957668440\",\n       \"6471546279\",\n       \"-6471546279\",\n       \"614957732\",\n       \"-614957732\",\n       \"130810411909693\",\n       \"-130810411909693\",\n       \"792104\",\n       \"-792104\",\n       \"465\",\n       \"-465\",\n       \"7782172074\",\n       \"-7782172074\",\n       \"55034847\",\n       \"-55034847\",\n       \"6775527365\",\n       \"-6775527365\",\n       \"12803753747546578\",\n       \"-12803753747546578\",\n       \"6126135608700535\",\n       \"-6126135608700535\",\n       \"12740679\",\n       \"-12740679\",\n       \"1266634072040501\",\n       \"-1266634072040501\",\n       \"348269777058432218\",\n       \"-348269777058432218\",\n       \"2184392953733\",\n       \"-2184392953733\",\n       \"9522770891\",\n       \"-9522770891\",\n       \"37077445\",\n       \"-37077445\",\n       \"1364\",\n       \"-1364\",\n       \"375540696398769\",\n       \"-375540696398769\",\n       \"24230\",\n       \"-24230\",\n       \"43119671230\",\n       \"-43119671230\",\n       \"1029673322569841213\",\n       \"-1029673322569841213\",\n       \"14194736\",\n       \"-14194736\",\n       \"4439459006245050525\",\n       \"-4439459006245050525\",\n       \"2016679919307343642\",\n       \"-2016679919307343642\",\n       \"68490\",\n       \"-68490\",\n       \"138373187496830016\",\n       \"-138373187496830016\",\n       \"12\",\n       \"-12\",\n       \"72731399395\",\n       \"-72731399395\",\n       \"103249241\",\n       \"-103249241\",\n       \"686434193208\",\n       \"-686434193208\",\n       \"2220097226366547\",\n       \"-2220097226366547\",\n       \"389615851678\",\n       \"-389615851678\",\n       \"1188756152\",\n       \"-1188756152\",\n       \"3527\",\n       \"-3527\",\n       \"64606107042\",\n       \"-64606107042\",\n       \"1628835\",\n       \"-1628835\",\n       \"14\",\n       \"-14\",\n       \"3398525351\",\n       \"-3398525351\",\n       \"192736533293843919\",\n       \"-192736533293843919\",\n       \"62739\",\n       \"-62739\",\n       \"29797\",\n       \"-29797\",\n       \"27022533997970320\",\n       \"-27022533997970320\",\n       \"85203884819644813\",\n       \"-85203884819644813\",\n       \"16723\",\n       \"-16723\",\n       \"720455425\",\n       \"-720455425\",\n       \"21193\",\n       \"-21193\",\n       \"911\",\n       \"-911\",\n       \"7564\",\n       \"-7564\",\n       \"9937\",\n       \"-9937\",\n       \"17698\",\n       \"-17698\",\n       \"3154835669492701\",\n       \"-3154835669492701\",\n       \"714419922\",\n       \"-714419922\",\n       \"3441710384\",\n       \"-3441710384\",\n       \"2302757\",\n       \"-2302757\",\n       \"13\",\n       \"-13\",\n       \"191092534665719086\",\n       \"-191092534665719086\",\n       \"2671438117955\",\n       \"-2671438117955\",\n       \"269195401\",\n       \"-269195401\",\n       \"1257367614616\",\n       \"-1257367614616\",\n       \"15233\",\n       \"-15233\",\n       \"242652372681\",\n       \"-242652372681\",\n       \"379035516581309513\",\n       \"-379035516581309513\",\n       \"234696334636228\",\n       \"-234696334636228\",\n       \"2190428804113181503\",\n       \"-2190428804113181503\",\n       \"5182131\",\n       \"-5182131\",\n       \"35710270\",\n       \"-35710270\",\n       \"30830418043327\",\n       \"-30830418043327\",\n       \"157\",\n       \"-157\",\n       \"56976290639537\",\n       \"-56976290639537\",\n       \"429094\",\n       \"-429094\",\n       \"8166\",\n       \"-8166\",\n       \"259284720\",\n       \"-259284720\",\n       \"1974\",\n       \"-1974\",\n       \"414549061889\",\n       \"-414549061889\",\n       \"12126192\",\n       \"-12126192\",\n       \"477683\",\n       \"-477683\",\n       \"26\",\n       \"-26\",\n       \"200991115623\",\n       \"-200991115623\",\n       \"105657935189602\",\n       \"-105657935189602\",\n       \"137401581416017\",\n       \"-137401581416017\",\n       \"3133\",\n       \"-3133\",\n       \"41301\",\n       \"-41301\",\n       \"9120545960887397\",\n       \"-9120545960887397\",\n       \"615\",\n       \"-615\",\n       \"1677628\",\n       \"-1677628\",\n       \"487311\",\n       \"-487311\",\n       \"6467819698256\",\n       \"-6467819698256\",\n       \"2721454\",\n       \"-2721454\",\n       \"356423793\",\n       \"-356423793\",\n       \"525408497\",\n       \"-525408497\",\n       \"1791793366931794\",\n       \"-1791793366931794\",\n       \"16267730984\",\n       \"-16267730984\",\n       \"787\",\n       \"-787\",\n       \"82\",\n       \"-82\",\n       \"8594582631777749056\",\n       \"-8594582631777749056\",\n       \"494351\",\n       \"-494351\",\n       \"5138\",\n       \"-5138\",\n       \"404787056092544\",\n       \"-404787056092544\",\n       \"235074602368269\",\n       \"-235074602368269\",\n       \"14\",\n       \"-14\",\n       \"364870\",\n       \"-364870\",\n       \"592299531695979194\",\n       \"-592299531695979194\",\n       \"243533\",\n       \"-243533\",\n       \"228268671797977\",\n       \"-228268671797977\",\n       \"150\",\n       \"-150\",\n       \"2109092292\",\n       \"-2109092292\",\n       \"10814341\",\n       \"-10814341\",\n       \"229344736512\",\n       \"-229344736512\",\n       \"506659\",\n       \"-506659\",\n       \"15065\",\n       \"-15065\",\n       \"73012461469893725\",\n       \"-73012461469893725\",\n       \"183623698\",\n       \"-183623698\",\n       \"30820\",\n       \"-30820\"};\n\n   boost::filesystem::ifstream is(root / \"cpp_int64_serial64.txt\");\n   std::cout << \"Testing cpp_int64_serial64.txt with T=\" << typeid(T).name() << std::endl;\n   //is.peek();\n   BOOST_CHECK(is.good());\n   //char c = is.peek();\n   //std::size_t s;\n   //is >> s;\n   boost::archive::text_iarchive ia(is);\n   for (unsigned i = 0; i < sizeof(text_array) / sizeof(text_array[0]); ++i)\n   {\n      T val;\n      ia >> val;\n      BOOST_CHECK_EQUAL(val, T(text_array[i]));\n   }\n\n   boost::filesystem::ifstream is2(root / \"cpp_int64_serial32.txt\");\n   std::cout << \"Testing cpp_int64_serial32.txt with T=\" << typeid(T).name() << std::endl;\n   //is2.peek();\n   BOOST_CHECK(is2.good());\n   boost::archive::text_iarchive ia2(is2);\n   for (unsigned i = 0; i < sizeof(text_array) / sizeof(text_array[0]); ++i)\n   {\n      T val;\n      ia2 >> val;\n      BOOST_CHECK_EQUAL(val, T(text_array[i]));\n   }\n}\n\ntemplate <class T>\nvoid test128()\n{\n   using namespace boost::multiprecision;\n\n   const char* text_array[] = {\n       \"27388486965920179246162874599461\",\n       \"-27388486965920179246162874599461\",\n       \"144684\",\n       \"-144684\",\n       \"40075268927703813213972787292005375\",\n       \"-40075268927703813213972787292005375\",\n       \"185882978840350932616815972016599\",\n       \"-185882978840350932616815972016599\",\n       \"118042\",\n       \"-118042\",\n       \"18836407318976510834104635573348923563\",\n       \"-18836407318976510834104635573348923563\",\n       \"305594372610563985628870243265194313\",\n       \"-305594372610563985628870243265194313\",\n       \"992608567\",\n       \"-992608567\",\n       \"1079802217950896854831728\",\n       \"-1079802217950896854831728\",\n       \"382261429251\",\n       \"-382261429251\",\n       \"7995\",\n       \"-7995\",\n       \"1691954012304306190464\",\n       \"-1691954012304306190464\",\n       \"252558125876\",\n       \"-252558125876\",\n       \"63408135\",\n       \"-63408135\",\n       \"1923885021482774859879\",\n       \"-1923885021482774859879\",\n       \"218151618018868077912122028563473880039\",\n       \"-218151618018868077912122028563473880039\",\n       \"1830482607233486577967554117978261568\",\n       \"-1830482607233486577967554117978261568\",\n       \"232684363792492642717810801641182199046\",\n       \"-232684363792492642717810801641182199046\",\n       \"18951107105103656564987041230801322761\",\n       \"-18951107105103656564987041230801322761\",\n       \"18602001100058210837668227206289280804\",\n       \"-18602001100058210837668227206289280804\",\n       \"619312\",\n       \"-619312\",\n       \"3300635207581175104869860370\",\n       \"-3300635207581175104869860370\",\n       \"35913874076527213864347472731883210240\",\n       \"-35913874076527213864347472731883210240\",\n       \"22584003535744275158325315387889625225\",\n       \"-22584003535744275158325315387889625225\",\n       \"1087569784912004503372385117646999025\",\n       \"-1087569784912004503372385117646999025\",\n       \"53419\",\n       \"-53419\",\n       \"6365946347248672643\",\n       \"-6365946347248672643\",\n       \"923074766928095495451885549346\",\n       \"-923074766928095495451885549346\",\n       \"791386027675064089452885112122\",\n       \"-791386027675064089452885112122\",\n       \"1095850863769\",\n       \"-1095850863769\",\n       \"585462\",\n       \"-585462\",\n       \"7\",\n       \"-7\",\n       \"14396352646034696\",\n       \"-14396352646034696\",\n       \"103513\",\n       \"-103513\",\n       \"236879494739813627852695329647307484\",\n       \"-236879494739813627852695329647307484\",\n       \"833105528657041028703317\",\n       \"-833105528657041028703317\",\n       \"403987552870100762517310706932\",\n       \"-403987552870100762517310706932\",\n       \"9241069445104304081394313010837003\",\n       \"-9241069445104304081394313010837003\",\n       \"7747462702643357490732429745555870341\",\n       \"-7747462702643357490732429745555870341\",\n       \"24325940392988231200\",\n       \"-24325940392988231200\",\n       \"3169332595628505508931977\",\n       \"-3169332595628505508931977\",\n       \"2956433455556566120076606972499\",\n       \"-2956433455556566120076606972499\",\n       \"97\",\n       \"-97\",\n       \"162358208806282\",\n       \"-162358208806282\",\n       \"450940116154946927404473774882465\",\n       \"-450940116154946927404473774882465\",\n       \"451641858\",\n       \"-451641858\",\n       \"1225696755823790187144596188382442861\",\n       \"-1225696755823790187144596188382442861\",\n       \"29784146626131423063590613\",\n       \"-29784146626131423063590613\",\n       \"234254347872215512272431905\",\n       \"-234254347872215512272431905\",\n       \"1188109449997714\",\n       \"-1188109449997714\",\n       \"67931289973154010244863599404\",\n       \"-67931289973154010244863599404\",\n       \"15985550526478899202524298413\",\n       \"-15985550526478899202524298413\",\n       \"44969358144856504665069077764\",\n       \"-44969358144856504665069077764\",\n       \"2433869372731414379\",\n       \"-2433869372731414379\",\n       \"389948478409995\",\n       \"-389948478409995\",\n       \"42980455782580666\",\n       \"-42980455782580666\",\n       \"32377741714896213765436617\",\n       \"-32377741714896213765436617\",\n       \"14147536\",\n       \"-14147536\",\n       \"7281984\",\n       \"-7281984\",\n       \"1940499846845\",\n       \"-1940499846845\",\n       \"431464371512114469628917178\",\n       \"-431464371512114469628917178\",\n       \"7407337220313553496076208494128\",\n       \"-7407337220313553496076208494128\",\n       \"30\",\n       \"-30\",\n       \"1327411295501\",\n       \"-1327411295501\",\n       \"66903469770\",\n       \"-66903469770\",\n       \"1681234517540805320612830262883456\",\n       \"-1681234517540805320612830262883456\",\n       \"100\",\n       \"-100\",\n       \"1619033\",\n       \"-1619033\",\n       \"31778\",\n       \"-31778\",\n       \"157454929543174151967897543014505981946\",\n       \"-157454929543174151967897543014505981946\",\n       \"71577966086399886868276034834304\",\n       \"-71577966086399886868276034834304\",\n       \"39053861540146327519720396203958\",\n       \"-39053861540146327519720396203958\",\n       \"744644565611021440442223814\",\n       \"-744644565611021440442223814\",\n       \"141620\",\n       \"-141620\",\n       \"2207944969567\",\n       \"-2207944969567\",\n       \"203426602629118177589459157758\",\n       \"-203426602629118177589459157758\",\n       \"4687930831049614526662210561259545215\",\n       \"-4687930831049614526662210561259545215\",\n       \"13741620425001328569\",\n       \"-13741620425001328569\",\n       \"28\",\n       \"-28\",\n       \"19919840763987597711639960\",\n       \"-19919840763987597711639960\",\n       \"58845502926990870\",\n       \"-58845502926990870\",\n       \"46503\",\n       \"-46503\",\n       \"227899590091810\",\n       \"-227899590091810\",\n       \"520269641\",\n       \"-520269641\",\n       \"533635134464326491653819104191\",\n       \"-533635134464326491653819104191\",\n       \"32\",\n       \"-32\",\n       \"2311765742988497575052179436185\",\n       \"-2311765742988497575052179436185\",\n       \"104\",\n       \"-104\",\n       \"13174010\",\n       \"-13174010\",\n       \"9157004287034859\",\n       \"-9157004287034859\",\n       \"13439929054075798978\",\n       \"-13439929054075798978\",\n       \"1005710832260650449\",\n       \"-1005710832260650449\",\n       \"45810516546119519\",\n       \"-45810516546119519\",\n       \"10111031832823515595\",\n       \"-10111031832823515595\",\n       \"1556666498630726306813245\",\n       \"-1556666498630726306813245\",\n       \"3776079563026301615061583892830\",\n       \"-3776079563026301615061583892830\",\n       \"3554220000452135447940601650\",\n       \"-3554220000452135447940601650\",\n       \"342914370059615129601458555955512766\",\n       \"-342914370059615129601458555955512766\",\n       \"37211915143242116097464702285\",\n       \"-37211915143242116097464702285\",\n       \"8426589576380612848355737491164\",\n       \"-8426589576380612848355737491164\",\n       \"32989222860\",\n       \"-32989222860\",\n       \"2242563523293104833112476952\",\n       \"-2242563523293104833112476952\",\n       \"26340698264302762867393911\",\n       \"-26340698264302762867393911\",\n       \"7\",\n       \"-7\",\n       \"690707180838394286313288\",\n       \"-690707180838394286313288\",\n       \"4152835666147840816597477625\",\n       \"-4152835666147840816597477625\",\n       \"4307204\",\n       \"-4307204\",\n       \"5538028691958331075031052\",\n       \"-5538028691958331075031052\",\n       \"15605\",\n       \"-15605\",\n       \"779689768131768618\",\n       \"-779689768131768618\",\n       \"31804890425581409493\",\n       \"-31804890425581409493\",\n       \"82342246867680606750756320822\",\n       \"-82342246867680606750756320822\",\n       \"9901401020017005286056280532528545058\",\n       \"-9901401020017005286056280532528545058\",\n       \"23964619045267142735208\",\n       \"-23964619045267142735208\",\n       \"23105481037040\",\n       \"-23105481037040\",\n       \"9261441758156913859636303647639218\",\n       \"-9261441758156913859636303647639218\",\n       \"60070546007507763924924\",\n       \"-60070546007507763924924\",\n       \"12326765403330476150347768542599\",\n       \"-12326765403330476150347768542599\",\n       \"1754723286\",\n       \"-1754723286\",\n       \"28\",\n       \"-28\",\n       \"89432086134972543173032616112\",\n       \"-89432086134972543173032616112\",\n       \"57126030796671809943615335657436\",\n       \"-57126030796671809943615335657436\",\n       \"14251136561\",\n       \"-14251136561\",\n       \"34939118696445841694152507070732\",\n       \"-34939118696445841694152507070732\",\n       \"62242533492272937541\",\n       \"-62242533492272937541\",\n       \"743045397928995080970748460370011005\",\n       \"-743045397928995080970748460370011005\",\n       \"657268729381871210499613874\",\n       \"-657268729381871210499613874\",\n       \"5257773746486582\",\n       \"-5257773746486582\",\n       \"40168363520567402312420813782551098\",\n       \"-40168363520567402312420813782551098\",\n       \"61834553929623600\",\n       \"-61834553929623600\",\n       \"8827879038299859860036523950621910882\",\n       \"-8827879038299859860036523950621910882\",\n       \"18187363614017047925823\",\n       \"-18187363614017047925823\",\n       \"1117818522952984212179\",\n       \"-1117818522952984212179\",\n       \"2656685\",\n       \"-2656685\",\n       \"409037\",\n       \"-409037\",\n       \"184490923222475885977498171480\",\n       \"-184490923222475885977498171480\",\n       \"802095\",\n       \"-802095\",\n       \"1362431392\",\n       \"-1362431392\",\n       \"22261578528\",\n       \"-22261578528\",\n       \"29290981558101942713268861928118\",\n       \"-29290981558101942713268861928118\",\n       \"47302301317848473766508256110200\",\n       \"-47302301317848473766508256110200\",\n       \"148503360374909444835237781907560612329\",\n       \"-148503360374909444835237781907560612329\",\n       \"30589987607\",\n       \"-30589987607\",\n       \"9336827203045\",\n       \"-9336827203045\",\n       \"30107043678267266207220294684045\",\n       \"-30107043678267266207220294684045\",\n       \"1084118892329\",\n       \"-1084118892329\",\n       \"7041095740\",\n       \"-7041095740\",\n       \"15\",\n       \"-15\",\n       \"610704633153562426576938052064937496\",\n       \"-610704633153562426576938052064937496\",\n       \"595347631\",\n       \"-595347631\",\n       \"7667191853556\",\n       \"-7667191853556\",\n       \"44454027936868155101947565993903816\",\n       \"-44454027936868155101947565993903816\",\n       \"85883611\",\n       \"-85883611\",\n       \"360758748839243518516454792370840\",\n       \"-360758748839243518516454792370840\",\n       \"2790927324\",\n       \"-2790927324\",\n       \"3742465736365768915898498156617091585\",\n       \"-3742465736365768915898498156617091585\",\n       \"147479413949146319856130\",\n       \"-147479413949146319856130\",\n       \"1039208893123161146877445631451\",\n       \"-1039208893123161146877445631451\",\n       \"4014354216767740814\",\n       \"-4014354216767740814\",\n       \"119781181099519678732165162824065718973\",\n       \"-119781181099519678732165162824065718973\",\n       \"78562776301070\",\n       \"-78562776301070\",\n       \"559\",\n       \"-559\",\n       \"11280106118161133960100664534446\",\n       \"-11280106118161133960100664534446\",\n       \"4606016388942561437580270830022\",\n       \"-4606016388942561437580270830022\",\n       \"57670561868327441370011\",\n       \"-57670561868327441370011\",\n       \"71416894909097014471844\",\n       \"-71416894909097014471844\",\n       \"3968198792173455589573\",\n       \"-3968198792173455589573\",\n       \"13149823145733642608775252727\",\n       \"-13149823145733642608775252727\",\n       \"264546856712400799367073649733688068\",\n       \"-264546856712400799367073649733688068\",\n       \"181571595840115131057831601\",\n       \"-181571595840115131057831601\",\n       \"137320082754\",\n       \"-137320082754\",\n       \"106737570210691788059038313\",\n       \"-106737570210691788059038313\",\n       \"266197717365288449213562655531\",\n       \"-266197717365288449213562655531\",\n       \"2641672529147341\",\n       \"-2641672529147341\",\n       \"151305657535708132064629059130\",\n       \"-151305657535708132064629059130\",\n       \"8838288455460932557542\",\n       \"-8838288455460932557542\",\n       \"229580992302363\",\n       \"-229580992302363\",\n       \"381276009\",\n       \"-381276009\",\n       \"2189254995814346543537\",\n       \"-2189254995814346543537\",\n       \"241062663892019429783\",\n       \"-241062663892019429783\",\n       \"1289\",\n       \"-1289\",\n       \"3768499169854362\",\n       \"-3768499169854362\",\n       \"46\",\n       \"-46\",\n       \"113123194090149\",\n       \"-113123194090149\",\n       \"257162014338572986111\",\n       \"-257162014338572986111\",\n       \"125826984535179834218224\",\n       \"-125826984535179834218224\",\n       \"380714866068747567944322727593\",\n       \"-380714866068747567944322727593\",\n       \"104303598841139\",\n       \"-104303598841139\",\n       \"1065280345148327648773363223393307192\",\n       \"-1065280345148327648773363223393307192\",\n       \"20248493338789246233167313227932895840\",\n       \"-20248493338789246233167313227932895840\",\n       \"162538\",\n       \"-162538\",\n       \"173739\",\n       \"-173739\",\n       \"5359750034437798426950\",\n       \"-5359750034437798426950\",\n       \"665876738146930\",\n       \"-665876738146930\",\n       \"709289441745698432\",\n       \"-709289441745698432\",\n       \"202728866936448\",\n       \"-202728866936448\",\n       \"6\",\n       \"-6\",\n       \"15800583732744199482624014690\",\n       \"-15800583732744199482624014690\",\n       \"29779074291232\",\n       \"-29779074291232\",\n       \"984339779461760\",\n       \"-984339779461760\",\n       \"767398\",\n       \"-767398\",\n       \"415462781851563431292700828131108380\",\n       \"-415462781851563431292700828131108380\",\n       \"1147933945700269690596156182506\",\n       \"-1147933945700269690596156182506\",\n       \"42450738679031729\",\n       \"-42450738679031729\",\n       \"2577950950157\",\n       \"-2577950950157\",\n       \"2522521710801514347400568661434422\",\n       \"-2522521710801514347400568661434422\",\n       \"13819658998892401541\",\n       \"-13819658998892401541\",\n       \"496658145774859954943564\",\n       \"-496658145774859954943564\",\n       \"518126\",\n       \"-518126\",\n       \"1401\",\n       \"-1401\",\n       \"65673247548918355271934\",\n       \"-65673247548918355271934\",\n       \"1902619525684055188\",\n       \"-1902619525684055188\",\n       \"32325262934\",\n       \"-32325262934\",\n       \"768343207102\",\n       \"-768343207102\",\n       \"7717131697976593508998559\",\n       \"-7717131697976593508998559\",\n       \"318668224221205716681\",\n       \"-318668224221205716681\",\n       \"373695949349041942234118586\",\n       \"-373695949349041942234118586\",\n       \"2374230638947377832537387112\",\n       \"-2374230638947377832537387112\",\n       \"38727149332417950712342749093\",\n       \"-38727149332417950712342749093\",\n       \"50641097967663747879422486643603294439\",\n       \"-50641097967663747879422486643603294439\",\n       \"155679557293775199\",\n       \"-155679557293775199\",\n       \"9584524694361179551000251851\",\n       \"-9584524694361179551000251851\",\n       \"1555\",\n       \"-1555\",\n       \"153598430081275298827470966254180164\",\n       \"-153598430081275298827470966254180164\",\n       \"1792977580\",\n       \"-1792977580\",\n       \"40513995299101921791\",\n       \"-40513995299101921791\",\n       \"205149194684558953622782831493255495\",\n       \"-205149194684558953622782831493255495\",\n       \"8569592230593344920443\",\n       \"-8569592230593344920443\",\n       \"508895\",\n       \"-508895\",\n       \"19768102480409470254\",\n       \"-19768102480409470254\",\n       \"137276814223629775094893592279819\",\n       \"-137276814223629775094893592279819\",\n       \"294000609851122741\",\n       \"-294000609851122741\",\n       \"65049209437230122275\",\n       \"-65049209437230122275\",\n       \"23362940999728532813\",\n       \"-23362940999728532813\",\n       \"88836918597358775734007849873044275046\",\n       \"-88836918597358775734007849873044275046\",\n       \"434035006963316670\",\n       \"-434035006963316670\",\n       \"622\",\n       \"-622\",\n       \"581347029549389573249184843256799\",\n       \"-581347029549389573249184843256799\",\n       \"180338559687589565\",\n       \"-180338559687589565\",\n       \"561053757585637776917747\",\n       \"-561053757585637776917747\",\n       \"32239\",\n       \"-32239\",\n       \"33901075413575967103\",\n       \"-33901075413575967103\",\n       \"8932885164594123487128517542485517028\",\n       \"-8932885164594123487128517542485517028\",\n       \"83521148713289418108751633969571232369\",\n       \"-83521148713289418108751633969571232369\",\n       \"7\",\n       \"-7\",\n       \"97\",\n       \"-97\",\n       \"148574175322938930280707441746\",\n       \"-148574175322938930280707441746\",\n       \"34819851973902418549646788688822516665\",\n       \"-34819851973902418549646788688822516665\",\n       \"8315372482034321202893445528412\",\n       \"-8315372482034321202893445528412\",\n       \"78070260632520\",\n       \"-78070260632520\",\n       \"1694579890551276986736768820881486\",\n       \"-1694579890551276986736768820881486\",\n       \"148949594888574520284515061\",\n       \"-148949594888574520284515061\",\n       \"7155\",\n       \"-7155\",\n       \"54025120576002\",\n       \"-54025120576002\",\n       \"6486075462638233\",\n       \"-6486075462638233\",\n       \"381736014892858568664127676041586\",\n       \"-381736014892858568664127676041586\",\n       \"20417033368\",\n       \"-20417033368\",\n       \"129\",\n       \"-129\",\n       \"4369312912082114047863415327506\",\n       \"-4369312912082114047863415327506\",\n       \"3425863567263779336359928\",\n       \"-3425863567263779336359928\",\n       \"126664685306324611\",\n       \"-126664685306324611\",\n       \"79290635423234192686030222410\",\n       \"-79290635423234192686030222410\",\n       \"89904040753844842469288403271470296\",\n       \"-89904040753844842469288403271470296\",\n       \"303078\",\n       \"-303078\",\n       \"24403696\",\n       \"-24403696\",\n       \"71519894287768242731407528483177175738\",\n       \"-71519894287768242731407528483177175738\",\n       \"43562121429\",\n       \"-43562121429\",\n       \"27030\",\n       \"-27030\",\n       \"24600\",\n       \"-24600\",\n       \"248387716733\",\n       \"-248387716733\",\n       \"371528\",\n       \"-371528\",\n       \"4787877250361840261744279869821\",\n       \"-4787877250361840261744279869821\",\n       \"4997511746500297909058528782721320\",\n       \"-4997511746500297909058528782721320\",\n       \"1586\",\n       \"-1586\",\n       \"31554014671157226899246\",\n       \"-31554014671157226899246\",\n       \"2859985988700258455304314\",\n       \"-2859985988700258455304314\",\n       \"4509508709806307404851\",\n       \"-4509508709806307404851\",\n       \"9\",\n       \"-9\",\n       \"1637744\",\n       \"-1637744\",\n       \"12479552255352789077760938\",\n       \"-12479552255352789077760938\",\n       \"976489633596851129859012248183437\",\n       \"-976489633596851129859012248183437\",\n       \"851806998881827048562\",\n       \"-851806998881827048562\",\n       \"906771089783845862955091\",\n       \"-906771089783845862955091\",\n       \"80038352079069729\",\n       \"-80038352079069729\",\n       \"17388136706500\",\n       \"-17388136706500\",\n       \"61145989\",\n       \"-61145989\",\n       \"94774844620540266019\",\n       \"-94774844620540266019\",\n       \"408281\",\n       \"-408281\",\n       \"952903032817435\",\n       \"-952903032817435\",\n       \"1631092620569808\",\n       \"-1631092620569808\",\n       \"2138\",\n       \"-2138\",\n       \"212824926871186875960728065608\",\n       \"-212824926871186875960728065608\",\n       \"4268162925\",\n       \"-4268162925\",\n       \"36\",\n       \"-36\",\n       \"223723\",\n       \"-223723\",\n       \"16415665053\",\n       \"-16415665053\",\n       \"25788643\",\n       \"-25788643\",\n       \"70220421074486178069\",\n       \"-70220421074486178069\",\n       \"4575797377\",\n       \"-4575797377\",\n       \"76884751129407965501107148587666\",\n       \"-76884751129407965501107148587666\",\n       \"29088346935783207\",\n       \"-29088346935783207\",\n       \"45914004714587007155631909758206960989\",\n       \"-45914004714587007155631909758206960989\",\n       \"248\",\n       \"-248\",\n       \"5579572272102752655174722938686\",\n       \"-5579572272102752655174722938686\",\n       \"30175831892260274369581289965353458\",\n       \"-30175831892260274369581289965353458\",\n       \"1237805257371\",\n       \"-1237805257371\",\n       \"4843618316827222290521953980935538236\",\n       \"-4843618316827222290521953980935538236\",\n       \"240\",\n       \"-240\",\n       \"15807477184070179658\",\n       \"-15807477184070179658\",\n       \"4142567393\",\n       \"-4142567393\",\n       \"12811809209743734075\",\n       \"-12811809209743734075\",\n       \"1485630615919152225304\",\n       \"-1485630615919152225304\",\n       \"7910273036167\",\n       \"-7910273036167\",\n       \"8463758727276424785250829495444564\",\n       \"-8463758727276424785250829495444564\",\n       \"64731869997654405671780238192304416\",\n       \"-64731869997654405671780238192304416\",\n       \"23615438174870\",\n       \"-23615438174870\",\n       \"352157140910141\",\n       \"-352157140910141\",\n       \"5\",\n       \"-5\",\n       \"59221\",\n       \"-59221\",\n       \"2569479\",\n       \"-2569479\",\n       \"542857439184063766884246909368\",\n       \"-542857439184063766884246909368\",\n       \"1823313067549638501383110895210828\",\n       \"-1823313067549638501383110895210828\",\n       \"3270724720703321\",\n       \"-3270724720703321\",\n       \"301251143\",\n       \"-301251143\",\n       \"2479800639\",\n       \"-2479800639\",\n       \"91698905921\",\n       \"-91698905921\",\n       \"2871719453817880\",\n       \"-2871719453817880\",\n       \"15334399950643828095\",\n       \"-15334399950643828095\",\n       \"5526\",\n       \"-5526\",\n       \"233477156\",\n       \"-233477156\",\n       \"133654\",\n       \"-133654\",\n       \"16379095557010108528\",\n       \"-16379095557010108528\",\n       \"781428672272181160786182179076882317\",\n       \"-781428672272181160786182179076882317\",\n       \"8296349327720787412560043280221269761\",\n       \"-8296349327720787412560043280221269761\",\n       \"10281035380942381640132947771350381026\",\n       \"-10281035380942381640132947771350381026\",\n       \"21040070113550157615461288\",\n       \"-21040070113550157615461288\",\n       \"25742884982404545443527\",\n       \"-25742884982404545443527\",\n       \"32454973901024441799985592013\",\n       \"-32454973901024441799985592013\",\n       \"743\",\n       \"-743\",\n       \"48093509516189552\",\n       \"-48093509516189552\",\n       \"3310081024\",\n       \"-3310081024\",\n       \"555885664598428773514\",\n       \"-555885664598428773514\",\n       \"12816465810736\",\n       \"-12816465810736\",\n       \"318\",\n       \"-318\",\n       \"11177674634623001920713776522758\",\n       \"-11177674634623001920713776522758\",\n       \"4478260629000\",\n       \"-4478260629000\",\n       \"7\",\n       \"-7\",\n       \"16047003680147439\",\n       \"-16047003680147439\",\n       \"183\",\n       \"-183\",\n       \"59147119480091828181670682607031985\",\n       \"-59147119480091828181670682607031985\",\n       \"14760016\",\n       \"-14760016\",\n       \"6274417502047620562218369346380\",\n       \"-6274417502047620562218369346380\",\n       \"14026544807038936634796795\",\n       \"-14026544807038936634796795\",\n       \"17158839999\",\n       \"-17158839999\",\n       \"15548352769483287520249305142\",\n       \"-15548352769483287520249305142\",\n       \"362163\",\n       \"-362163\",\n       \"3476850886273368477018353\",\n       \"-3476850886273368477018353\",\n       \"12190143908040407488\",\n       \"-12190143908040407488\",\n       \"521525508150081044\",\n       \"-521525508150081044\",\n       \"433309060522200\",\n       \"-433309060522200\",\n       \"2165455650813681324517\",\n       \"-2165455650813681324517\",\n       \"6819348098387524497126647285\",\n       \"-6819348098387524497126647285\",\n       \"464251630203\",\n       \"-464251630203\",\n       \"145993167313\",\n       \"-145993167313\",\n       \"23955493117052698447116654044\",\n       \"-23955493117052698447116654044\",\n       \"1249962737542647752328381\",\n       \"-1249962737542647752328381\",\n       \"25985762\",\n       \"-25985762\",\n       \"8825811397396758414408048174991\",\n       \"-8825811397396758414408048174991\",\n       \"456322584656453621447742298\",\n       \"-456322584656453621447742298\",\n       \"3635296824314\",\n       \"-3635296824314\",\n       \"48071792\",\n       \"-48071792\",\n       \"573327609505513\",\n       \"-573327609505513\",\n       \"32947066161183\",\n       \"-32947066161183\",\n       \"3572119014464\",\n       \"-3572119014464\",\n       \"339951878200713991932774\",\n       \"-339951878200713991932774\",\n       \"9829263561931267281756747918204\",\n       \"-9829263561931267281756747918204\",\n       \"99133551353390277845579505558\",\n       \"-99133551353390277845579505558\",\n       \"87647698384969946179713959\",\n       \"-87647698384969946179713959\",\n       \"812\",\n       \"-812\",\n       \"874259982778101\",\n       \"-874259982778101\",\n       \"427106308211321596930989851275848063\",\n       \"-427106308211321596930989851275848063\",\n       \"182604408166381257\",\n       \"-182604408166381257\",\n       \"1027122202590661838104329309513\",\n       \"-1027122202590661838104329309513\",\n       \"1354315694936\",\n       \"-1354315694936\",\n       \"6079470672663034486\",\n       \"-6079470672663034486\",\n       \"141187763548195492188625309258190962\",\n       \"-141187763548195492188625309258190962\",\n       \"5948423816691427\",\n       \"-5948423816691427\",\n       \"3790826071191932816\",\n       \"-3790826071191932816\",\n       \"475187449013755049\",\n       \"-475187449013755049\",\n       \"134916830618137216019136180544\",\n       \"-134916830618137216019136180544\",\n       \"289548281081\",\n       \"-289548281081\",\n       \"56088\",\n       \"-56088\",\n       \"71309468310269123716\",\n       \"-71309468310269123716\",\n       \"4319226187100950\",\n       \"-4319226187100950\",\n       \"64155929243330777086\",\n       \"-64155929243330777086\",\n       \"1346606607492942300949980881912922\",\n       \"-1346606607492942300949980881912922\",\n       \"56691962171349121239043134503543\",\n       \"-56691962171349121239043134503543\",\n       \"179884054884043\",\n       \"-179884054884043\",\n       \"1457175629136147646463304750253\",\n       \"-1457175629136147646463304750253\",\n       \"298847019807831033427383443102915235\",\n       \"-298847019807831033427383443102915235\",\n       \"3724333984635632125440253\",\n       \"-3724333984635632125440253\",\n       \"75997801235764509433\",\n       \"-75997801235764509433\",\n       \"624924035973776\",\n       \"-624924035973776\",\n       \"663853\",\n       \"-663853\",\n       \"39794266307878236329712249281466\",\n       \"-39794266307878236329712249281466\",\n       \"68236356\",\n       \"-68236356\",\n       \"874551267305634766833\",\n       \"-874551267305634766833\",\n       \"3069873585346853407835416677633253152\",\n       \"-3069873585346853407835416677633253152\",\n       \"128022182325463\",\n       \"-128022182325463\",\n       \"102685407245351562527197662841526650696\",\n       \"-102685407245351562527197662841526650696\",\n       \"1268696403523315749290280644252872285\",\n       \"-1268696403523315749290280644252872285\",\n       \"962551179\",\n       \"-962551179\",\n       \"5397346809016967977013332103668812\",\n       \"-5397346809016967977013332103668812\",\n       \"19\",\n       \"-19\",\n       \"1383556287038543763721\",\n       \"-1383556287038543763721\",\n       \"596132342851497\",\n       \"-596132342851497\",\n       \"386032274487026935724854\",\n       \"-386032274487026935724854\",\n       \"913487342891468949707909122983\",\n       \"-913487342891468949707909122983\",\n       \"60948098701787507435146\",\n       \"-60948098701787507435146\",\n       \"2022832067596000203\",\n       \"-2022832067596000203\",\n       \"25656479\",\n       \"-25656479\",\n       \"2346119770800025007571\",\n       \"-2346119770800025007571\",\n       \"376371975341\",\n       \"-376371975341\",\n       \"9\",\n       \"-9\",\n       \"2942356530044344965\",\n       \"-2942356530044344965\",\n       \"3932381905103911287794534670998227\",\n       \"-3932381905103911287794534670998227\",\n       \"3218056320\",\n       \"-3218056320\",\n       \"102738821\",\n       \"-102738821\",\n       \"234572888397008437041293767052858\",\n       \"-234572888397008437041293767052858\",\n       \"5858001549782605027037905592031557\",\n       \"-5858001549782605027037905592031557\",\n       \"90718950\",\n       \"-90718950\",\n       \"39428225166028193\",\n       \"-39428225166028193\",\n       \"1383746282\",\n       \"-1383746282\",\n       \"915121\",\n       \"-915121\",\n       \"8970289\",\n       \"-8970289\",\n       \"4322641789\",\n       \"-4322641789\",\n       \"260209037\",\n       \"-260209037\",\n       \"6609227084602664174553003642710\",\n       \"-6609227084602664174553003642710\",\n       \"37231518369001507\",\n       \"-37231518369001507\",\n       \"4301528568595403190\",\n       \"-4301528568595403190\",\n       \"2333077100212\",\n       \"-2333077100212\",\n       \"11565\",\n       \"-11565\",\n       \"255726621336514413017008354182674709\",\n       \"-255726621336514413017008354182674709\",\n       \"17395422733913073065750181\",\n       \"-17395422733913073065750181\",\n       \"125019234224449492\",\n       \"-125019234224449492\",\n       \"4740360722276299853297125\",\n       \"-4740360722276299853297125\",\n       \"7568347\",\n       \"-7568347\",\n       \"17122026961016863428287\",\n       \"-17122026961016863428287\",\n       \"112577394987931131505768113032531171\",\n       \"-112577394987931131505768113032531171\",\n       \"7046212555452856822490707564\",\n       \"-7046212555452856822490707564\",\n       \"33256103762317100748101545285090311772\",\n       \"-33256103762317100748101545285090311772\",\n       \"104639691131091\",\n       \"-104639691131091\",\n       \"74043463548796243\",\n       \"-74043463548796243\",\n       \"49942702457067622169669481\",\n       \"-49942702457067622169669481\",\n       \"12806\",\n       \"-12806\",\n       \"4194227136755752775246633399\",\n       \"-4194227136755752775246633399\",\n       \"22363149786\",\n       \"-22363149786\",\n       \"53844\",\n       \"-53844\",\n       \"6204108132585699\",\n       \"-6204108132585699\",\n       \"133987\",\n       \"-133987\",\n       \"47357030709179941308475\",\n       \"-47357030709179941308475\",\n       \"167735124254221045\",\n       \"-167735124254221045\",\n       \"58394613871\",\n       \"-58394613871\",\n       \"214\",\n       \"-214\",\n       \"97085709128533841718123\",\n       \"-97085709128533841718123\",\n       \"9049249133086876221572990732831\",\n       \"-9049249133086876221572990732831\",\n       \"1860834869623152381150863486\",\n       \"-1860834869623152381150863486\",\n       \"3868776\",\n       \"-3868776\",\n       \"714752211\",\n       \"-714752211\",\n       \"117044601375672047600456567336894\",\n       \"-117044601375672047600456567336894\",\n       \"38202\",\n       \"-38202\",\n       \"1706135867048\",\n       \"-1706135867048\",\n       \"568201454130\",\n       \"-568201454130\",\n       \"10071543790040355676774628\",\n       \"-10071543790040355676774628\",\n       \"3955606956905\",\n       \"-3955606956905\",\n       \"1710822834542941\",\n       \"-1710822834542941\",\n       \"28185453895207483\",\n       \"-28185453895207483\",\n       \"2241403707806732425937134125743\",\n       \"-2241403707806732425937134125743\",\n       \"24424908461669836348\",\n       \"-24424908461669836348\",\n       \"39965\",\n       \"-39965\",\n       \"5776\",\n       \"-5776\",\n       \"161984235115107451958835599550261843326\",\n       \"-161984235115107451958835599550261843326\",\n       \"29821471341\",\n       \"-29821471341\",\n       \"3087720\",\n       \"-3087720\",\n       \"234408055908870511236228564329\",\n       \"-234408055908870511236228564329\",\n       \"367687929171771055426419375659\",\n       \"-367687929171771055426419375659\",\n       \"31\",\n       \"-31\",\n       \"14038375921\",\n       \"-14038375921\",\n       \"1272562766857183500104765994611086188\",\n       \"-1272562766857183500104765994611086188\",\n       \"5395131009\",\n       \"-5395131009\",\n       \"34630426722601695384252351222\",\n       \"-34630426722601695384252351222\",\n       \"16553\",\n       \"-16553\",\n       \"11084856402443484655\",\n       \"-11084856402443484655\",\n       \"4497048086787\",\n       \"-4497048086787\",\n       \"32568631422747274845485\",\n       \"-32568631422747274845485\",\n       \"262201867566\",\n       \"-262201867566\",\n       \"3603196342\",\n       \"-3603196342\",\n       \"32228667062769096924274427075075163477\",\n       \"-32228667062769096924274427075075163477\",\n       \"693196875773858622\",\n       \"-693196875773858622\",\n       \"375838207\",\n       \"-375838207\",\n   };\n\n   boost::filesystem::ifstream is(root / \"cpp_int128_serial64.txt\");\n   std::cout << \"Testing cpp_int128_serial64.txt with T=\" << typeid(T).name() << std::endl;\n   //is.peek();\n   BOOST_CHECK(is.good());\n   boost::archive::text_iarchive ia(is);\n   for (unsigned i = 0; i < sizeof(text_array) / sizeof(text_array[0]); ++i)\n   {\n#ifndef BOOST_NO_EXCEPTIONS\n      try\n      {\n#endif\n         T val;\n         ia >> val;\n         BOOST_CHECK_EQUAL(val, T(text_array[i]));\n#ifndef BOOST_NO_EXCEPTIONS\n      }\n      catch (const boost::exception& e)\n      {\n         std::cout << \"Caught boost::exception with:\\n\";\n         std::cout << diagnostic_information(e);\n      }\n      catch (const std::exception& e)\n      {\n         std::cout << \"Caught std::exception with:\\n\";\n         std::cout << e.what() << std::endl;\n      }\n#endif\n   }\n\n   boost::filesystem::ifstream is2(root / \"cpp_int128_serial32.txt\");\n   std::cout << \"Testing cpp_int128_serial32.txt with T=\" << typeid(T).name() << std::endl;\n   //is2.peek();\n   BOOST_CHECK(is2.good());\n   boost::archive::text_iarchive ia2(is2);\n   for (unsigned i = 0; i < sizeof(text_array) / sizeof(text_array[0]); ++i)\n   {\n#ifndef BOOST_NO_EXCEPTIONS\n      try\n      {\n#endif\n         T val;\n         ia2 >> val;\n         BOOST_CHECK_EQUAL(val, T(text_array[i]));\n#ifndef BOOST_NO_EXCEPTIONS\n      }\n      catch (const boost::exception& e)\n      {\n         std::cout << \"Caught boost::exception with:\\n\";\n         std::cout << diagnostic_information(e);\n      }\n      catch (const std::exception& e)\n      {\n         std::cout << \"Caught std::exception with:\\n\";\n         std::cout << e.what() << std::endl;\n      }\n#endif\n   }\n}\n\ntemplate <class T>\nvoid test1024()\n{\n   using namespace boost::multiprecision;\n\n   const char* text_array[] = {\n       \"199116592524695642085302184291534972104821103496846288349049702743455488423756865233534697793799569802866670981662356904270988544309072648691983459024063468708849163858558300444260495432655880504371186304007206097685833870163932928823469130199562442992\",\n       \"-199116592524695642085302184291534972104821103496846288349049702743455488423756865233534697793799569802866670981662356904270988544309072648691983459024063468708849163858558300444260495432655880504371186304007206097685833870163932928823469130199562442992\",\n       \"900593985907599133309438051698408853499625\",\n       \"-900593985907599133309438051698408853499625\",\n       \"1999874529133918706984995533406759076286565612920872635155416162504047196283513226624804224664215451103787410646351770677862238993331622942206185777454355265435238628326337253875004975201674224657309748975788962678417182798452737039836018579998386385843839364431684621083773420995\",\n       \"-1999874529133918706984995533406759076286565612920872635155416162504047196283513226624804224664215451103787410646351770677862238993331622942206185777454355265435238628326337253875004975201674224657309748975788962678417182798452737039836018579998386385843839364431684621083773420995\",\n       \"3984622917724894533997006216154563211907361459910318973090457115167740283771041468834030135879776466911564784436671674308756100400008317797390250537451443539509892669634431827675333761787371583170220547281395030543315815109821053621124047969069733480692532\",\n       \"-3984622917724894533997006216154563211907361459910318973090457115167740283771041468834030135879776466911564784436671674308756100400008317797390250537451443539509892669634431827675333761787371583170220547281395030543315815109821053621124047969069733480692532\",\n       \"3232318919913083002600961037970380935109\",\n       \"-3232318919913083002600961037970380935109\",\n       \"31063287987662242043295268121189412701158946907681323476663158129071217086758046387444487305432940821201595312001091888440038537739012180871591529361766112029121819690067004102150186222757899576567650712850787690098182019345491656562683693940513570929164008316791512277994247388861874767036310283032\",\n       \"-31063287987662242043295268121189412701158946907681323476663158129071217086758046387444487305432940821201595312001091888440038537739012180871591529361766112029121819690067004102150186222757899576567650712850787690098182019345491656562683693940513570929164008316791512277994247388861874767036310283032\",\n       \"551891699448873731005410917251662274314405815829594429768196331539904618164780043996715480720882109933893638976491102937306842056459564612366897777250359518885611699552940726261111066137661097166708199216229508773692203174236076409923801944639195246263554709054412966237162836449108\",\n       \"-551891699448873731005410917251662274314405815829594429768196331539904618164780043996715480720882109933893638976491102937306842056459564612366897777250359518885611699552940726261111066137661097166708199216229508773692203174236076409923801944639195246263554709054412966237162836449108\",\n       \"335366696367917734077308183957523963605452915968160245855756922088011\",\n       \"-335366696367917734077308183957523963605452915968160245855756922088011\",\n       \"516747586835313993425742202038941743391184401954870801073750702371672555461045948927255871449025485037535181895965683819085832663856528858925035833888106053116851498798112586463619731478072279623\",\n       \"-516747586835313993425742202038941743391184401954870801073750702371672555461045948927255871449025485037535181895965683819085832663856528858925035833888106053116851498798112586463619731478072279623\",\n       \"266698476906140000185555171296233707414383217616977634049828438937252114299738535337312010987594\",\n       \"-266698476906140000185555171296233707414383217616977634049828438937252114299738535337312010987594\",\n       \"1742740128166122778815789893503\",\n       \"-1742740128166122778815789893503\",\n       \"9724178186350731882862121812371154796147496227432585250532513144071077406366937493221094046638206862261142165156227060439590867019554905722401562859987295808994814401942\",\n       \"-9724178186350731882862121812371154796147496227432585250532513144071077406366937493221094046638206862261142165156227060439590867019554905722401562859987295808994814401942\",\n       \"78669120642064259414462176059292690866387576703089703385165678245138348243792107699164\",\n       \"-78669120642064259414462176059292690866387576703089703385165678245138348243792107699164\",\n       \"20818242466417733255855534640058104588616172091806661117670\",\n       \"-20818242466417733255855534640058104588616172091806661117670\",\n       \"4285795302257142023279557595265352619153550443850366091691013701573116876759469534501053640452948548428208657312557380072256478428969426137868124810140942586250078976271\",\n       \"-4285795302257142023279557595265352619153550443850366091691013701573116876759469534501053640452948548428208657312557380072256478428969426137868124810140942586250078976271\",\n       \"582604000062572804923757892130426287093735944713405746172610139142407500801888662008036220641936720421041737454101798928020195070207248743108048751731809924563484418793905813766932871306262995484219521766924610729803972858084042961494083239630079092513694133586118612073236719306830956983397633251414977754\",\n       \"-582604000062572804923757892130426287093735944713405746172610139142407500801888662008036220641936720421041737454101798928020195070207248743108048751731809924563484418793905813766932871306262995484219521766924610729803972858084042961494083239630079092513694133586118612073236719306830956983397633251414977754\",\n       \"15244715246682897475794438496539784661328456725495852276384174914973848673559621029178770197754207946620279120766931180917955631763555863913554513123775304647102553401018292948818112379521732233018874991323186887132286586138108436833252904592044083624364585617172057137372527454560587256796482346\",\n       \"-15244715246682897475794438496539784661328456725495852276384174914973848673559621029178770197754207946620279120766931180917955631763555863913554513123775304647102553401018292948818112379521732233018874991323186887132286586138108436833252904592044083624364585617172057137372527454560587256796482346\",\n       \"2162895251469736394155373749298870491019042810468937007114239114834965434324532372477043450771464135064045267665496385710799863273304844467062688237563757141742551576106360777697871874341148850361709074093167368004234386954371485929893986000482110508651966963502456247924228172005161782355542551339301544053\",\n       \"-2162895251469736394155373749298870491019042810468937007114239114834965434324532372477043450771464135064045267665496385710799863273304844467062688237563757141742551576106360777697871874341148850361709074093167368004234386954371485929893986000482110508651966963502456247924228172005161782355542551339301544053\",\n       \"1598979420051373213779067102428825857258960753077031910510837547866117340690938015398588975672437163347616966444506118889316096334851198017036793976867532695462600493286904022181865571035930456030653116939922200581824528814030699118802949188745959300411809512397337408237271478944565611123755566305\",\n       \"-1598979420051373213779067102428825857258960753077031910510837547866117340690938015398588975672437163347616966444506118889316096334851198017036793976867532695462600493286904022181865571035930456030653116939922200581824528814030699118802949188745959300411809512397337408237271478944565611123755566305\",\n       \"16972265575362228409871949532650408574482631199000565615577589612763707133618421955651468786564593364791708076161039592041831568321621510957105628787468779948579969928175938436896904310402554255504042135507367561049409553354413837219069382497010795375231533129182910408442845936728120354915635936898\",\n       \"-16972265575362228409871949532650408574482631199000565615577589612763707133618421955651468786564593364791708076161039592041831568321621510957105628787468779948579969928175938436896904310402554255504042135507367561049409553354413837219069382497010795375231533129182910408442845936728120354915635936898\",\n       \"6578842255326490592104075020940649831283616551660\",\n       \"-6578842255326490592104075020940649831283616551660\",\n       \"21683239365736925204171059844091235529220850759783534345105279221261364632686763920546656745741380892718845596049305277834093327836699551790128153290026473154694088594033146472697265593756340629571314831536187835497879992488\",\n       \"-21683239365736925204171059844091235529220850759783534345105279221261364632686763920546656745741380892718845596049305277834093327836699551790128153290026473154694088594033146472697265593756340629571314831536187835497879992488\",\n       \"82705023096235991529043144815694768432078642064433253929157769869969882959684824083733064475507849892985247689495254462302557886989778499312762640233348268023648079139590178633699092745191633841431797230103981800388019961016410936969661694491101422518397720383375579079432440889617406834440612316345\",\n       \"-82705023096235991529043144815694768432078642064433253929157769869969882959684824083733064475507849892985247689495254462302557886989778499312762640233348268023648079139590178633699092745191633841431797230103981800388019961016410936969661694491101422518397720383375579079432440889617406834440612316345\",\n       \"182226847821689839702269917063301483274601928154240894497051272590070015871573462612330908644446070144310876769617182637134479859518870301265103824148955731473219622377635930380500965073993471768564617573332989796817488809960475386339256946590978228792909775228312826022751099327081513175259103822462404\",\n       \"-182226847821689839702269917063301483274601928154240894497051272590070015871573462612330908644446070144310876769617182637134479859518870301265103824148955731473219622377635930380500965073993471768564617573332989796817488809960475386339256946590978228792909775228312826022751099327081513175259103822462404\",\n       \"5047815496286192631875136121482961684854345143375644371655857541129061222585290469283326779682311519927896776754142231238721306654582346292285270137340078762804088754913299932236143865279819208519978638432654788640663782736369734346995034407838300134017424349501474133378173964391719130592921725\",\n       \"-5047815496286192631875136121482961684854345143375644371655857541129061222585290469283326779682311519927896776754142231238721306654582346292285270137340078762804088754913299932236143865279819208519978638432654788640663782736369734346995034407838300134017424349501474133378173964391719130592921725\",\n       \"22536736652558441743601984420319740\",\n       \"-22536736652558441743601984420319740\",\n       \"327447539579270438292704828441807528233522606163188888154105354488483374541037700785580710347093169240568594799687437260325328617564586900214241043337\",\n       \"-327447539579270438292704828441807528233522606163188888154105354488483374541037700785580710347093169240568594799687437260325328617564586900214241043337\",\n       \"576979741896869527546425470124797714231020028752356356333225775983321871157857129520067018389689110139112275805449955044770978296650876883361429976430221447982628049254445385786013507310850518003697984237866336100952912645415854388908568224414707\",\n       \"-576979741896869527546425470124797714231020028752356356333225775983321871157857129520067018389689110139112275805449955044770978296650876883361429976430221447982628049254445385786013507310850518003697984237866336100952912645415854388908568224414707\",\n       \"755708508440402225863498155833596268190934339616501653733913066972752009318647339364141109604780235018474569114884922495929398288656171192074004071372424004589137926220537255429717898046520571796147507616408370836807000016827363741604261172604190\",\n       \"-755708508440402225863498155833596268190934339616501653733913066972752009318647339364141109604780235018474569114884922495929398288656171192074004071372424004589137926220537255429717898046520571796147507616408370836807000016827363741604261172604190\",\n       \"28048724901616569597172899970128263950954786552499389660847160202213362969018987235256727605\",\n       \"-28048724901616569597172899970128263950954786552499389660847160202213362969018987235256727605\",\n       \"173167043910755577166191737374818499849624950\",\n       \"-173167043910755577166191737374818499849624950\",\n       \"48\",\n       \"-48\",\n       \"18463009925253820920449684292621801312807473363997541122773157125946854399091765241363833326106601909427978296931833223183788301543\",\n       \"-18463009925253820920449684292621801312807473363997541122773157125946854399091765241363833326106601909427978296931833223183788301543\",\n       \"31164619961775222493397145731379707\",\n       \"-31164619961775222493397145731379707\",\n       \"1816096570786800455898299961483294949815377533170208282553387279497784999672154364831631933541855425071102266426105906939977630773287626616160771806315066360322795263086589842632991562964241768039371149116395673886243340566387264938743398973079853460222114803451321466708714785006727\",\n       \"-1816096570786800455898299961483294949815377533170208282553387279497784999672154364831631933541855425071102266426105906939977630773287626616160771806315066360322795263086589842632991562964241768039371149116395673886243340566387264938743398973079853460222114803451321466708714785006727\",\n       \"286006007227658140199584887789816189451349886507993355022297173895214040208905643298365570365441499922605759964419143497079708873231260957597650186760056343574600947950687835678669676590667783184666\",\n       \"-286006007227658140199584887789816189451349886507993355022297173895214040208905643298365570365441499922605759964419143497079708873231260957597650186760056343574600947950687835678669676590667783184666\",\n       \"18358404935882372210070601728050732884947257854425817110955248936260198050228809460271322586740505320746909919918679627100695097433534409202108416481259416338560209999440019558569552164395624923489329323411399738280552853025588689733098861097523\",\n       \"-18358404935882372210070601728050732884947257854425817110955248936260198050228809460271322586740505320746909919918679627100695097433534409202108416481259416338560209999440019558569552164395624923489329323411399738280552853025588689733098861097523\",\n       \"4134722455319345214940599980631794346657332870755359010455452155626594269008814501180484509879573967565890465226873255542092192607602138135728673418643645201766135430371744351074472506612976620427027592918016747144700651239945277040717933887512645490432181939225775342965\",\n       \"-4134722455319345214940599980631794346657332870755359010455452155626594269008814501180484509879573967565890465226873255542092192607602138135728673418643645201766135430371744351074472506612976620427027592918016747144700651239945277040717933887512645490432181939225775342965\",\n       \"54920807074733793884577529077249631831162657302693894027178095216669108940322624411834499900757281913727092273510264248215928273287884179463378853565331877701638585020489866284361829333257710807106023052404897652297092714031250456279772808462426750654556160069174238558295987347555132735561420095\",\n       \"-54920807074733793884577529077249631831162657302693894027178095216669108940322624411834499900757281913727092273510264248215928273287884179463378853565331877701638585020489866284361829333257710807106023052404897652297092714031250456279772808462426750654556160069174238558295987347555132735561420095\",\n       \"399265560197794252401617167580850085282220794173216714093253564006986475971645145366672323528680289510504223856530994241334812625576574784650620927403732184\",\n       \"-399265560197794252401617167580850085282220794173216714093253564006986475971645145366672323528680289510504223856530994241334812625576574784650620927403732184\",\n       \"31621966437344909804014117858935966136505781977117316516659445266533686603282356943749115958158394083237531612132476116831423261618528802877894233115470068483988764082981116838784931515017818535550110918\",\n       \"-31621966437344909804014117858935966136505781977117316516659445266533686603282356943749115958158394083237531612132476116831423261618528802877894233115470068483988764082981116838784931515017818535550110918\",\n       \"1606985215548409716503362538444761880543201213399618535731027289265156579177336621807120077949866098802813413615868269176538634784089984273973440941833767736805385007543715097934592673987261460898859324638806817938705575451364443949120235151257544\",\n       \"-1606985215548409716503362538444761880543201213399618535731027289265156579177336621807120077949866098802813413615868269176538634784089984273973440941833767736805385007543715097934592673987261460898859324638806817938705575451364443949120235151257544\",\n       \"285683190193\",\n       \"-285683190193\",\n       \"8061697887583266465310973659826347597097558972448901485453524610917952084739066859639084715521710210973596165921\",\n       \"-8061697887583266465310973659826347597097558972448901485453524610917952084739066859639084715521710210973596165921\",\n       \"6219223289787909965098172528033914428025426344931365048240610134846930087708486382224526942350364117413020461482722657384885935391455080562169318712277658961972965925941924792948343565934378704158420349097774074011993945850670748056251470218258676908828627471885\",\n       \"-6219223289787909965098172528033914428025426344931365048240610134846930087708486382224526942350364117413020461482722657384885935391455080562169318712277658961972965925941924792948343565934378704158420349097774074011993945850670748056251470218258676908828627471885\",\n       \"697258758163542187076749918900636966609908531786609361940000240519\",\n       \"-697258758163542187076749918900636966609908531786609361940000240519\",\n       \"1046098084657831111818175325887422175023162118504873435909952452494852374571808810176243062515313047215471029884493246457829292480590847793716267629027995295229796393654811459791589585169546388254745922345946744655803804613032804268083425871981695717315478983498539611218241664930157839795\",\n       \"-1046098084657831111818175325887422175023162118504873435909952452494852374571808810176243062515313047215471029884493246457829292480590847793716267629027995295229796393654811459791589585169546388254745922345946744655803804613032804268083425871981695717315478983498539611218241664930157839795\",\n       \"2484434366380099043156299869169661345741558449531766681226478781813341982338634464499146134940119727735818398667362505498484418919464161091166892386016324225384189876252889149071097656823108497551033588357003722\",\n       \"-2484434366380099043156299869169661345741558449531766681226478781813341982338634464499146134940119727735818398667362505498484418919464161091166892386016324225384189876252889149071097656823108497551033588357003722\",\n       \"308286676308193197031410043742676292328591745213481644733897249474373496522533072738438449939815750248898922885290011346375849968712988888608255565930075126704466104946675008196710396726585487442780152614905677\",\n       \"-308286676308193197031410043742676292328591745213481644733897249474373496522533072738438449939815750248898922885290011346375849968712988888608255565930075126704466104946675008196710396726585487442780152614905677\",\n       \"1578729146192540123786163537348004400750916878495381648015362308555564957146975794392752284685500828245809393902172165166570\",\n       \"-1578729146192540123786163537348004400750916878495381648015362308555564957146975794392752284685500828245809393902172165166570\",\n       \"753635193017654981561112585877756433926946338453536513833144933556077262395793429496030381482043731560006145122148417766008778064151654898372617208349138764363280371778703526306929669285807019015087056633479893959366709941765720251266\",\n       \"-753635193017654981561112585877756433926946338453536513833144933556077262395793429496030381482043731560006145122148417766008778064151654898372617208349138764363280371778703526306929669285807019015087056633479893959366709941765720251266\",\n       \"1023056796494340203037740397557237363844811192683830278749294166121707658052654599305485368530300819052987687826810994785603794931372101763295285975973124930171986523205085256147491724466952116413750593896486505408297359237231028\",\n       \"-1023056796494340203037740397557237363844811192683830278749294166121707658052654599305485368530300819052987687826810994785603794931372101763295285975973124930171986523205085256147491724466952116413750593896486505408297359237231028\",\n       \"7279368955234841237989689629914561920962002431310686381873314222568640123479287155739276546923764190325442924090937031964044572030997024902955450149096922769606827151526955803170246823486172000556133026264782831784752812128580068\",\n       \"-7279368955234841237989689629914561920962002431310686381873314222568640123479287155739276546923764190325442924090937031964044572030997024902955450149096922769606827151526955803170246823486172000556133026264782831784752812128580068\",\n       \"424617380576309116241807458648692744450386557212868763669113075114477578778872841574527732081207492431831870311301491048670446826911900920994644694\",\n       \"-424617380576309116241807458648692744450386557212868763669113075114477578778872841574527732081207492431831870311301491048670446826911900920994644694\",\n       \"7046686003127119093099476961562427444038611347486414217752094860417190797774076723407713585872307944642824878964077822345\",\n       \"-7046686003127119093099476961562427444038611347486414217752094860417190797774076723407713585872307944642824878964077822345\",\n       \"19949119701600514825288852843654302777880460105733015351003691242645123465142555331932685718332487926262997425529449487067278953683\",\n       \"-19949119701600514825288852843654302777880460105733015351003691242645123465142555331932685718332487926262997425529449487067278953683\",\n       \"16469140092633375339743693580164888653727421730589027379476942842394844761208703483677054585417793177811566576822391363212778421263249183342676114446881502895872964885316569671443951931393367071689754985\",\n       \"-16469140092633375339743693580164888653727421730589027379476942842394844761208703483677054585417793177811566576822391363212778421263249183342676114446881502895872964885316569671443951931393367071689754985\",\n       \"1061702816480363701187846694728343109042150409401045998\",\n       \"-1061702816480363701187846694728343109042150409401045998\",\n       \"7391047600385760425390763210856013417540808412389899\",\n       \"-7391047600385760425390763210856013417540808412389899\",\n       \"3720217478561502591416009227591582869882982470098168796813426264578076670286029029195560760567\",\n       \"-3720217478561502591416009227591582869882982470098168796813426264578076670286029029195560760567\",\n       \"66106892589637039037744676327200772291368517688108041167197715930935273497569759111332854815299471155925869011997907566713674005971100914739364454164984587128896600583993354569858550495377843782520710717979164977585093\",\n       \"-66106892589637039037744676327200772291368517688108041167197715930935273497569759111332854815299471155925869011997907566713674005971100914739364454164984587128896600583993354569858550495377843782520710717979164977585093\",\n       \"655105381318829622535325161492573443039473032159228692157069475333288969363672255837498503071757247193471076794288004751047135238604867298249068617214132553959376152373616588040808707670098140225261882200984527500899566180951300745344526414599508\",\n       \"-655105381318829622535325161492573443039473032159228692157069475333288969363672255837498503071757247193471076794288004751047135238604867298249068617214132553959376152373616588040808707670098140225261882200984527500899566180951300745344526414599508\",\n       \"32279098297\",\n       \"-32279098297\",\n       \"91236285260894969491370094562444170610185292123928049180398654028165920269699400153752501142438076\",\n       \"-91236285260894969491370094562444170610185292123928049180398654028165920269699400153752501142438076\",\n       \"76148543022827828542260034575767140554118312303651220784462009876431985956698652362044\",\n       \"-76148543022827828542260034575767140554118312303651220784462009876431985956698652362044\",\n       \"83588868584829923837376678742649596503169974719002042708417338297148455364317505115231903770625036463360146776147319869172298475847924715607135999201658410499586149882123548133278995113231076277183588359228055211291455848766205373827838498451914146847385535315038611426\",\n       \"-83588868584829923837376678742649596503169974719002042708417338297148455364317505115231903770625036463360146776147319869172298475847924715607135999201658410499586149882123548133278995113231076277183588359228055211291455848766205373827838498451914146847385535315038611426\",\n       \"963957921647213\",\n       \"-963957921647213\",\n       \"13301565202923219609572812103802050473736468733\",\n       \"-13301565202923219609572812103802050473736468733\",\n       \"4746350713999103687568954691814\",\n       \"-4746350713999103687568954691814\",\n       \"2001142907044963200442678450863815898813903676660733058871895239756077633074421909013654237542517301596550011117510574893770558703407744684777702961205416292826384730912647565673208707968211244040320246494312087239093502776249390829799552970184550131203169359608726456455152480928583576591394902496106626144\",\n       \"-2001142907044963200442678450863815898813903676660733058871895239756077633074421909013654237542517301596550011117510574893770558703407744684777702961205416292826384730912647565673208707968211244040320246494312087239093502776249390829799552970184550131203169359608726456455152480928583576591394902496106626144\",\n       \"107594281614292318387817778890700162347725421105656330924973717308436245329157596183845769858366750239404646287651057292302740816759738471158092800874582432179112119211566698620828469639621669897519755264598100204713172616980523260714264267451063089420215\",\n       \"-107594281614292318387817778890700162347725421105656330924973717308436245329157596183845769858366750239404646287651057292302740816759738471158092800874582432179112119211566698620828469639621669897519755264598100204713172616980523260714264267451063089420215\",\n       \"1748285028280968559027056769483145164710362048627307365465656148480028444958644903475995728328069875726460568057080202853997524099097288749318318801615657840242878599655077486108729249226195564937733374638566648902211364103190286203200478747078106163053\",\n       \"-1748285028280968559027056769483145164710362048627307365465656148480028444958644903475995728328069875726460568057080202853997524099097288749318318801615657840242878599655077486108729249226195564937733374638566648902211364103190286203200478747078106163053\",\n       \"11460180193889065606722132385926501525431980106546682247601052575855000134486061731618687473242633808411918689848577390823351808790715520481001965421879800810352399655561482898353748786253207752078326991084961012083\",\n       \"-11460180193889065606722132385926501525431980106546682247601052575855000134486061731618687473242633808411918689848577390823351808790715520481001965421879800810352399655561482898353748786253207752078326991084961012083\",\n       \"574927035874041759213679385423821561867\",\n       \"-574927035874041759213679385423821561867\",\n       \"120643345454198941508563017089006360092589256126170227342940319190269214269775023269721267117406618\",\n       \"-120643345454198941508563017089006360092589256126170227342940319190269214269775023269721267117406618\",\n       \"43211052397169822368769320044098366176065820670381470825125490923898893035078574715878390619044493658716106759475917845349930472007385257270090791727486873231922936861573077702054193955871675235660795444516942345577520753954381850029768\",\n       \"-43211052397169822368769320044098366176065820670381470825125490923898893035078574715878390619044493658716106759475917845349930472007385257270090791727486873231922936861573077702054193955871675235660795444516942345577520753954381850029768\",\n       \"9844479373748707013063227964029459596247847016794211846228318515960354387966950301750833297921955723417061013994092483915173465284502461089399372968661262420490350455873655690633576331503541999665999411319072898423762904939498903689838493823091884957816736065194017711554932378966207638596446\",\n       \"-9844479373748707013063227964029459596247847016794211846228318515960354387966950301750833297921955723417061013994092483915173465284502461089399372968661262420490350455873655690633576331503541999665999411319072898423762904939498903689838493823091884957816736065194017711554932378966207638596446\",\n       \"1549569662025720311251404569332722105893198679127923795355656951920288528581705427103792360667449800130523485559533763978458224547356178202688985769505\",\n       \"-1549569662025720311251404569332722105893198679127923795355656951920288528581705427103792360667449800130523485559533763978458224547356178202688985769505\",\n       \"36315742657\",\n       \"-36315742657\",\n       \"8921164792041877158829344493852966827789686565858639796763485931102357440731861058782552324538917399828752311227018705861210803742330995498617328892413590387831390338234562492080836551321361310716484078814\",\n       \"-8921164792041877158829344493852966827789686565858639796763485931102357440731861058782552324538917399828752311227018705861210803742330995498617328892413590387831390338234562492080836551321361310716484078814\",\n       \"3564428449813842615037566955460603551635405941961408429533479906924825068973042239756262262787799344453371579266807953907224412476869508\",\n       \"-3564428449813842615037566955460603551635405941961408429533479906924825068973042239756262262787799344453371579266807953907224412476869508\",\n       \"803208608149818042371281509635155439483\",\n       \"-803208608149818042371281509635155439483\",\n       \"4866189324296232234061833332746205890326919472641667725283106186358795590420827732306960443344464312769726502055107509\",\n       \"-4866189324296232234061833332746205890326919472641667725283106186358795590420827732306960443344464312769726502055107509\",\n       \"207298564235033398879052037508717471071493511497187540585110196743\",\n       \"-207298564235033398879052037508717471071493511497187540585110196743\",\n       \"193717918520883498325012985935003601959305178471191450716579245791510632312265720137365047580022087853055977679260908512014775411818562756581294466392949427067700253919565514470785071872659525583000795812531290669561365815697655594188906\",\n       \"-193717918520883498325012985935003601959305178471191450716579245791510632312265720137365047580022087853055977679260908512014775411818562756581294466392949427067700253919565514470785071872659525583000795812531290669561365815697655594188906\",\n       \"2437877491739207\",\n       \"-2437877491739207\",\n       \"37013774102202564305419053038604891745828779816673570038156288209445014156533018002446399548329104265253840467051874818175306349349752734572291264362672503100264435752942371629071789078883405034467875813374259058124047248097835249024123072756933\",\n       \"-37013774102202564305419053038604891745828779816673570038156288209445014156533018002446399548329104265253840467051874818175306349349752734572291264362672503100264435752942371629071789078883405034467875813374259058124047248097835249024123072756933\",\n       \"354494755327\",\n       \"-354494755327\",\n       \"11780642893082070770985419994433169541426957824422257433844\",\n       \"-11780642893082070770985419994433169541426957824422257433844\",\n       \"485430660154648600595640793061533874664308049695155979729256186778257302321647241550949220266916178753497849914452979205318162\",\n       \"-485430660154648600595640793061533874664308049695155979729256186778257302321647241550949220266916178753497849914452979205318162\",\n       \"23858852603627264837843140314865296322097028936336850188878465502728409524610276592851077626292364546252755103916928846389671162429425418906991891502973\",\n       \"-23858852603627264837843140314865296322097028936336850188878465502728409524610276592851077626292364546252755103916928846389671162429425418906991891502973\",\n       \"2073475025890625790912875485180905813499103080617022204722722710095631077512485124044881139986135538169181486312704584071614904004373594716419\",\n       \"-2073475025890625790912875485180905813499103080617022204722722710095631077512485124044881139986135538169181486312704584071614904004373594716419\",\n       \"15280710757061816529388583850582811170979066299366854920512818520549969116440063183787310498271091672343434592650388724950511822972092076\",\n       \"-15280710757061816529388583850582811170979066299366854920512818520549969116440063183787310498271091672343434592650388724950511822972092076\",\n       \"6382485371693619169022055595031229091762638736860010414889365673981891166426242136610234221929171470107008843300114050380584829581671837693187024514818\",\n       \"-6382485371693619169022055595031229091762638736860010414889365673981891166426242136610234221929171470107008843300114050380584829581671837693187024514818\",\n       \"12185224224701673175361331319115762816895575796767843658049699617134858039026831564288739190981827007791493862865956911735574421879562096311558676154252796632277351699205162505700258194809563580445507\",\n       \"-12185224224701673175361331319115762816895575796767843658049699617134858039026831564288739190981827007791493862865956911735574421879562096311558676154252796632277351699205162505700258194809563580445507\",\n       \"34003980273948488873087243030302546934071096333462110121575903766367670827215796429777573314114296018716373089777559546454127470648315079633590832262220530391541976999162677539194732289306375110039265026554808460597438607169664283497662076280786\",\n       \"-34003980273948488873087243030302546934071096333462110121575903766367670827215796429777573314114296018716373089777559546454127470648315079633590832262220530391541976999162677539194732289306375110039265026554808460597438607169664283497662076280786\",\n       \"122848198938353223588037911092014612429998780961520627899382186456109045142826399845219049519395028055840868305519753136489752495357572137972700299899629238691174342998161949671331013802430679284465951931850871392212632\",\n       \"-122848198938353223588037911092014612429998780961520627899382186456109045142826399845219049519395028055840868305519753136489752495357572137972700299899629238691174342998161949671331013802430679284465951931850871392212632\",\n       \"43537967438743700082839955990027575248714598937547106788531846714509188167960975769453819977500278194590313507781727399526395127656584060420218121352097776308452702567298202679209230473699619650828718821287113120498048345913575657082695406163703126042367182026511481872506111256791596\",\n       \"-43537967438743700082839955990027575248714598937547106788531846714509188167960975769453819977500278194590313507781727399526395127656584060420218121352097776308452702567298202679209230473699619650828718821287113120498048345913575657082695406163703126042367182026511481872506111256791596\",\n       \"58406767675650075287505789516356411545831826432139397101494864325157903449602707567656548116973052773130530151058837990354645940288559829449340220508188691146281802100553666536211206823508084744153463134410959296949868335640749454837\",\n       \"-58406767675650075287505789516356411545831826432139397101494864325157903449602707567656548116973052773130530151058837990354645940288559829449340220508188691146281802100553666536211206823508084744153463134410959296949868335640749454837\",\n       \"845873210129906374353022076245969947869460127750482252356111232286849327159845231580563758295137285209548293776383830614553566014483472912208993044958366148170162204310293796785477227702675371216304957228188615867576567406231041038281756292397397561\",\n       \"-845873210129906374353022076245969947869460127750482252356111232286849327159845231580563758295137285209548293776383830614553566014483472912208993044958366148170162204310293796785477227702675371216304957228188615867576567406231041038281756292397397561\",\n       \"53588224463377221082233930622411910641801456988689291134720826079004949443094787414435\",\n       \"-53588224463377221082233930622411910641801456988689291134720826079004949443094787414435\",\n       \"72112722851930798700228005210608826370783262851441860040831117968729809788108346159403319971018904246301591088717098607465649205797470097967252119620134427778008686902310907006410363397508152328805949858597088819284277\",\n       \"-72112722851930798700228005210608826370783262851441860040831117968729809788108346159403319971018904246301591088717098607465649205797470097967252119620134427778008686902310907006410363397508152328805949858597088819284277\",\n       \"641918660703774309882129738043218549030513645540611429936046631082566036061356980177384685321883957675631751681520848096394297317163463488891570190724496654177980091225725954578443264041706056677969812886935701\",\n       \"-641918660703774309882129738043218549030513645540611429936046631082566036061356980177384685321883957675631751681520848096394297317163463488891570190724496654177980091225725954578443264041706056677969812886935701\",\n       \"30\",\n       \"-30\",\n       \"6394573041749544637932142063252660876011988517352129759808021807615786602503160259195561963658103141713195046053277921040817887800559226509891982140334607813922841396821838502087774297750475588617168795\",\n       \"-6394573041749544637932142063252660876011988517352129759808021807615786602503160259195561963658103141713195046053277921040817887800559226509891982140334607813922841396821838502087774297750475588617168795\",\n       \"1786466222561817425577249373742981037566301146961591730677121116610853649457567467081637483584212899635954801237845898555279493690732411882920175456222801107258417531725553455448259056866349458253419178431317512242742160\",\n       \"-1786466222561817425577249373742981037566301146961591730677121116610853649457567467081637483584212899635954801237845898555279493690732411882920175456222801107258417531725553455448259056866349458253419178431317512242742160\",\n       \"137832029750529182794342751962197941412491800492104\",\n       \"-137832029750529182794342751962197941412491800492104\",\n       \"8108038128324706368474080686463548136481517039342729533539080912561382244733668445971779623479147878923993970600643926905142316004585446689923640217524203592135814813370649929971097550423245537858260\",\n       \"-8108038128324706368474080686463548136481517039342729533539080912561382244733668445971779623479147878923993970600643926905142316004585446689923640217524203592135814813370649929971097550423245537858260\",\n       \"5002261098184392173934780113066967242\",\n       \"-5002261098184392173934780113066967242\",\n       \"690951335667913995812417540653386648776452918801140879728454196755039750563977820072442505506359908874725801630758561609054355988759175228289\",\n       \"-690951335667913995812417540653386648776452918801140879728454196755039750563977820072442505506359908874725801630758561609054355988759175228289\",\n       \"10674213497798883899476403327832261239905267095517429500221095458852845305968864392299051608409658803957443554649236067724400487971044164121242198029786220\",\n       \"-10674213497798883899476403327832261239905267095517429500221095458852845305968864392299051608409658803957443554649236067724400487971044164121242198029786220\",\n       \"17992446102498398809906415490084711513529803098403245836231064924343042871622653363618957583240979467823413823373231710836844132776133330230504849252207785917957852664671150869449421757327447929003162434828411052366071580989788644644058346\",\n       \"-17992446102498398809906415490084711513529803098403245836231064924343042871622653363618957583240979467823413823373231710836844132776133330230504849252207785917957852664671150869449421757327447929003162434828411052366071580989788644644058346\",\n       \"33842687090178160518628086932775600899160163731425276680317104716407292755478424345380082755988441733647290183079908808136196734777398636133355822624652625917768049717031860506349867723992592655421369270624555109106177714680336653018611913032875963068852500326353648887921416851020395037162987766\",\n       \"-33842687090178160518628086932775600899160163731425276680317104716407292755478424345380082755988441733647290183079908808136196734777398636133355822624652625917768049717031860506349867723992592655421369270624555109106177714680336653018611913032875963068852500326353648887921416851020395037162987766\",\n       \"1054083826397869852970042065169251590328234555837539271102624160027471295945233271106117930450857346874100524858325086710499923040919634021718345296558298025504382070214470223730\",\n       \"-1054083826397869852970042065169251590328234555837539271102624160027471295945233271106117930450857346874100524858325086710499923040919634021718345296558298025504382070214470223730\",\n       \"136407237437852413879681494779911076041207111591826209650287776324941155126675066585977968663006698647245\",\n       \"-136407237437852413879681494779911076041207111591826209650287776324941155126675066585977968663006698647245\",\n       \"2224879942826211211569920900726660211869323323310097306306571308813333981073744504097938050565302837264530253763057896699924896596092066791400879438413472679293844669326318441711505238433328261842523388469632517312478257062414756535170295711651910005290949014898120581894\",\n       \"-2224879942826211211569920900726660211869323323310097306306571308813333981073744504097938050565302837264530253763057896699924896596092066791400879438413472679293844669326318441711505238433328261842523388469632517312478257062414756535170295711651910005290949014898120581894\",\n       \"4047288308565310307500509489225346109923522467464514519968591592559230455772855713422415453581291554663695129034041054508221015627588797163542760075301595269083019308332323602089140\",\n       \"-4047288308565310307500509489225346109923522467464514519968591592559230455772855713422415453581291554663695129034041054508221015627588797163542760075301595269083019308332323602089140\",\n       \"1035816948031741587849086409216542916935656696246164119153928232713320856714123588940050533131790722677035036233284471386922732645880058503610308346951059222695446014860710224009856786160873437306753478940623814638264314179274958950671363159961289293\",\n       \"-1035816948031741587849086409216542916935656696246164119153928232713320856714123588940050533131790722677035036233284471386922732645880058503610308346951059222695446014860710224009856786160873437306753478940623814638264314179274958950671363159961289293\",\n       \"1718216153801609870534260896130470102834028900689159827595233108230047\",\n       \"-1718216153801609870534260896130470102834028900689159827595233108230047\",\n       \"157320\",\n       \"-157320\",\n       \"4922208547816973044459635133646703969879372571533096054296883386644122380530951726299847426987732042397595779976830474678726947018304354845591378517358359470056483109237714380888286233563680472388849805778688479350769638569123934902\",\n       \"-4922208547816973044459635133646703969879372571533096054296883386644122380530951726299847426987732042397595779976830474678726947018304354845591378517358359470056483109237714380888286233563680472388849805778688479350769638569123934902\",\n       \"3067476257285335874566823333688543442128450810079871657467124491543338509419265027748695014643813306181544035536165512867635982606378678645467114585754422748255288790715628747169903578478381870157776988838327310364853622786578500012302428307039672498275\",\n       \"-3067476257285335874566823333688543442128450810079871657467124491543338509419265027748695014643813306181544035536165512867635982606378678645467114585754422748255288790715628747169903578478381870157776988838327310364853622786578500012302428307039672498275\",\n       \"883397505237211649947418585007890070022882946801242047716792933816916920312758\",\n       \"-883397505237211649947418585007890070022882946801242047716792933816916920312758\",\n       \"1100016596294277930396702074837291475694950629762363744759571589030108139933298189695770187024515803626715526690351811923084433342467648792302262756272887683638924910835436501074742486120762849764143752164258427412169550392618539176353678199434066032915\",\n       \"-1100016596294277930396702074837291475694950629762363744759571589030108139933298189695770187024515803626715526690351811923084433342467648792302262756272887683638924910835436501074742486120762849764143752164258427412169550392618539176353678199434066032915\",\n       \"3318653243827753930075076609367167950215271547197165956541578677095035789105230285577300537970253024380004869448887191421072498566168883197146749684037295491\",\n       \"-3318653243827753930075076609367167950215271547197165956541578677095035789105230285577300537970253024380004869448887191421072498566168883197146749684037295491\",\n       \"18917325422442253597680054225840324956976833511185836470606776355469702018395215498115502098244359450586779118546945991879765584863693947599352077215049091215099400154668038964846442469328921458041398569034401548536622210828439622386945359553017072968575829651399459030775837160233158886103\",\n       \"-18917325422442253597680054225840324956976833511185836470606776355469702018395215498115502098244359450586779118546945991879765584863693947599352077215049091215099400154668038964846442469328921458041398569034401548536622210828439622386945359553017072968575829651399459030775837160233158886103\",\n       \"254366786216910043665990950804997231945088908428747001184159373059058493118875749329803453882635522927040165937386417763335659992218458086511885522609981363333096153519757022667758401739961262948319999739472528794701\",\n       \"-254366786216910043665990950804997231945088908428747001184159373059058493118875749329803453882635522927040165937386417763335659992218458086511885522609981363333096153519757022667758401739961262948319999739472528794701\",\n       \"37544442396527426899195446849672655465276344502770712178079384432684510232491164260359865664795991038222782506894463672347582854\",\n       \"-37544442396527426899195446849672655465276344502770712178079384432684510232491164260359865664795991038222782506894463672347582854\",\n       \"15673578372504731899692149900135775418224632075238646337867467957107034530818946478167665455128984412394389268797819166734444989508179006505772666514111230952795610254140089645092544526629237404643329919824803563866840859270664303879742294839213766102351871211663636813556965\",\n       \"-15673578372504731899692149900135775418224632075238646337867467957107034530818946478167665455128984412394389268797819166734444989508179006505772666514111230952795610254140089645092544526629237404643329919824803563866840859270664303879742294839213766102351871211663636813556965\",\n       \"27481560151479303283253590172063634693210359375791056643367262359056676411581745877899312410880682306069203702180378974272137310962\",\n       \"-27481560151479303283253590172063634693210359375791056643367262359056676411581745877899312410880682306069203702180378974272137310962\",\n       \"59764850084546321076270115679381459961266663920938595034931337715038895288728780241940147905268936247355365797839452044959717373177405268037975305459371499345817108953258614141073965011536848191412758145014880201415800076045236677519189441266640929126443802253464497061850704733496580039504966534\",\n       \"-59764850084546321076270115679381459961266663920938595034931337715038895288728780241940147905268936247355365797839452044959717373177405268037975305459371499345817108953258614141073965011536848191412758145014880201415800076045236677519189441266640929126443802253464497061850704733496580039504966534\",\n       \"236346389410506959600114343181511587020869234266420558654132661642154355113727359542557485608210379840787154866691122790684707204957449484562815548156526563035046035495563526969340\",\n       \"-236346389410506959600114343181511587020869234266420558654132661642154355113727359542557485608210379840787154866691122790684707204957449484562815548156526563035046035495563526969340\",\n       \"8815935276532889936007554615797399527468399687615548740700254897861864429815615560728972825692565852981716178182277189313249729477257089767951370396136769451014576455113\",\n       \"-8815935276532889936007554615797399527468399687615548740700254897861864429815615560728972825692565852981716178182277189313249729477257089767951370396136769451014576455113\",\n       \"15766842373922966734945972936934487778733908393732\",\n       \"-15766842373922966734945972936934487778733908393732\",\n       \"6595752830737826074851600247398704243439581\",\n       \"-6595752830737826074851600247398704243439581\",\n       \"883607119507167020680444599092885224088612050268051636998275726360170767104266391951078564780752590643878108107048593830807317310688757872408858062530074042278525133611486569437859217448040432508288719355266779546627635013182590336527\",\n       \"-883607119507167020680444599092885224088612050268051636998275726360170767104266391951078564780752590643878108107048593830807317310688757872408858062530074042278525133611486569437859217448040432508288719355266779546627635013182590336527\",\n       \"33694907409791755762655404952802940988899691249\",\n       \"-33694907409791755762655404952802940988899691249\",\n       \"323333915936767999634844119809319135460509879311229599308354939953168279\",\n       \"-323333915936767999634844119809319135460509879311229599308354939953168279\",\n       \"109533461242727456317187321637480456637352670377446387229311720642342270936669079\",\n       \"-109533461242727456317187321637480456637352670377446387229311720642342270936669079\",\n       \"1385911310557366456440256909064094890695543397784942861180089270740259394708721160036253862597269877264942393141524860354011688095362554758164667579347793400229024555480224078270156224230580104617746710199310164986752840215359839845498564497854670854\",\n       \"-1385911310557366456440256909064094890695543397784942861180089270740259394708721160036253862597269877264942393141524860354011688095362554758164667579347793400229024555480224078270156224230580104617746710199310164986752840215359839845498564497854670854\",\n       \"29774115054799535833930768716897017350284486426186383584162324318962025027678962428276603554895692141466695531519088683268104074739324371129542465293986416152097350166384444454811692728264434003142202934260616565733198831279676615440572524973775003086833767426\",\n       \"-29774115054799535833930768716897017350284486426186383584162324318962025027678962428276603554895692141466695531519088683268104074739324371129542465293986416152097350166384444454811692728264434003142202934260616565733198831279676615440572524973775003086833767426\",\n       \"74696367101640724890251441072354635571976155536130046140237438589798381789554793148406818355661257862104683281722318017709028012486180422540427675980472782459468162926394976288225872264456693023891477557259759177462765826175659413065496505969367440547828089465241517425279607801825661125137502490209352550\",\n       \"-74696367101640724890251441072354635571976155536130046140237438589798381789554793148406818355661257862104683281722318017709028012486180422540427675980472782459468162926394976288225872264456693023891477557259759177462765826175659413065496505969367440547828089465241517425279607801825661125137502490209352550\",\n       \"1204196594639385922414846449687106633371016123988162000948048507502126642148118\",\n       \"-1204196594639385922414846449687106633371016123988162000948048507502126642148118\",\n       \"846833858170919771038203149272750341572762713657689308208261686002409383861625765452744323828942233333\",\n       \"-846833858170919771038203149272750341572762713657689308208261686002409383861625765452744323828942233333\",\n       \"182161452241374047273456867899515861555380897442569148219001470598361338903885535593714631480225974535244035939079461012689178031931288032512442603044979036705163872936026346865633839654342088060028594652808131903888369770826412770233292335398149959646\",\n       \"-182161452241374047273456867899515861555380897442569148219001470598361338903885535593714631480225974535244035939079461012689178031931288032512442603044979036705163872936026346865633839654342088060028594652808131903888369770826412770233292335398149959646\",\n       \"982677520230623904675071524585093908331832014895485448777250229533226440326748097093798644810\",\n       \"-982677520230623904675071524585093908331832014895485448777250229533226440326748097093798644810\",\n       \"2470642728099219780778259687407342337194729387462688122808418202258274933287\",\n       \"-2470642728099219780778259687407342337194729387462688122808418202258274933287\",\n       \"21642\",\n       \"-21642\",\n       \"28109476527429648692470007325789564480573483619310804793750563939329019602047743826734114282192488430735600284398989680911911960943283501628534649887574302741936678165842670818369902783900366003306472118461382044113045381589251197206074842928328220219584087542112389580462137108895790086\",\n       \"-28109476527429648692470007325789564480573483619310804793750563939329019602047743826734114282192488430735600284398989680911911960943283501628534649887574302741936678165842670818369902783900366003306472118461382044113045381589251197206074842928328220219584087542112389580462137108895790086\",\n       \"24473934394139795039432356490797923225705279667816043556538102097065\",\n       \"-24473934394139795039432356490797923225705279667816043556538102097065\",\n       \"967666937415492520370655115944840613051857445576119169258498049770608556022671644163127742796054969198094856\",\n       \"-967666937415492520370655115944840613051857445576119169258498049770608556022671644163127742796054969198094856\",\n       \"8777670436928270404636672844045971126192291209566648012730356503650458463860437163044293866063131499188106079322582985846405009457295181485284286775546965040263973340573887093705724765371051485505998527923498980801571623582212444207027545811844533625560957194790459778850062900748\",\n       \"-8777670436928270404636672844045971126192291209566648012730356503650458463860437163044293866063131499188106079322582985846405009457295181485284286775546965040263973340573887093705724765371051485505998527923498980801571623582212444207027545811844533625560957194790459778850062900748\",\n       \"10519677007822794739900735125229787943972331835720269482799977\",\n       \"-10519677007822794739900735125229787943972331835720269482799977\",\n       \"1590072871278743537180333082100146324295480429097445157011611168462260468069742799519303496051313133424632939883615906533434106640128123864165917007171699524724790769928823375793283671051479570198286895253998686473352852617282646423776591164499455695311138248299\",\n       \"-1590072871278743537180333082100146324295480429097445157011611168462260468069742799519303496051313133424632939883615906533434106640128123864165917007171699524724790769928823375793283671051479570198286895253998686473352852617282646423776591164499455695311138248299\",\n       \"383577258388475022706431955525247573599499248581278423720457780337892379126935\",\n       \"-383577258388475022706431955525247573599499248581278423720457780337892379126935\",\n       \"4092674502161259843824589343985242161447501042778080381002610852870457757982768392530808942900298511043488661625193784801456963642409098266685508736530379429664593489447947572985105744943017018734265426997872693998175650632205202701888817395372790067319643794599452089403576233527127077671169622\",\n       \"-4092674502161259843824589343985242161447501042778080381002610852870457757982768392530808942900298511043488661625193784801456963642409098266685508736530379429664593489447947572985105744943017018734265426997872693998175650632205202701888817395372790067319643794599452089403576233527127077671169622\",\n       \"13404427613900927247182634952369430867149749267930075884187025351198408344520192279603454195813154024830997527858376982434391797362547445527455503408360391999256823815839930266546427915841779\",\n       \"-13404427613900927247182634952369430867149749267930075884187025351198408344520192279603454195813154024830997527858376982434391797362547445527455503408360391999256823815839930266546427915841779\",\n       \"1782731694176936358469465341561020425473553201468123279175729849215977910638614519237563454448377541145186523281923996935231617014737050458102419525422740666362815640052502503060273650753054955785368306923652680382227789211754118567371586934\",\n       \"-1782731694176936358469465341561020425473553201468123279175729849215977910638614519237563454448377541145186523281923996935231617014737050458102419525422740666362815640052502503060273650753054955785368306923652680382227789211754118567371586934\",\n       \"71445070949104597011738157784103420085714634511010244724089831548057084941763190363056184849082451693612273802898122477866754965092090652561708550\",\n       \"-71445070949104597011738157784103420085714634511010244724089831548057084941763190363056184849082451693612273802898122477866754965092090652561708550\",\n       \"29824403422520048745171796949849941396331286906646046322404644703962912292598789686250791183932008392905170486032131129329348882564734443795544653928497362304776093305233881623231624358963434097033411434801644527775046832916455013625115699965097251269229855092992005057236242615322851235046388965677957662\",\n       \"-29824403422520048745171796949849941396331286906646046322404644703962912292598789686250791183932008392905170486032131129329348882564734443795544653928497362304776093305233881623231624358963434097033411434801644527775046832916455013625115699965097251269229855092992005057236242615322851235046388965677957662\",\n       \"3305915750647269729664177438631754300633043385617699516297426765949911376314744190602062381040796872234391958\",\n       \"-3305915750647269729664177438631754300633043385617699516297426765949911376314744190602062381040796872234391958\",\n       \"3478784122562389625603\",\n       \"-3478784122562389625603\",\n       \"92086546733522598295324541515522297712847163647680019382995445215746554554174953976307228051786981849535290733112403050554954140651771516865900059530798935625857134201153825877196274813040051834092674214044263432436343855130586740109759258782054166065929\",\n       \"-92086546733522598295324541515522297712847163647680019382995445215746554554174953976307228051786981849535290733112403050554954140651771516865900059530798935625857134201153825877196274813040051834092674214044263432436343855130586740109759258782054166065929\",\n       \"65957872354116509297400621319564903702253130516097675674670945971981309842410416012915540911950348439255536201700835793048055599890677253563036692899622137331645054971331690373584438379720134181489517623643988341292887235850459604282122921452528\",\n       \"-65957872354116509297400621319564903702253130516097675674670945971981309842410416012915540911950348439255536201700835793048055599890677253563036692899622137331645054971331690373584438379720134181489517623643988341292887235850459604282122921452528\",\n       \"4165190074711498372705686642027748628010631591673700346085849569414502903758312031393196903476997644869669022781414821544378466903717692187198478658086148256293129853045819435002914\",\n       \"-4165190074711498372705686642027748628010631591673700346085849569414502903758312031393196903476997644869669022781414821544378466903717692187198478658086148256293129853045819435002914\",\n       \"502172553703744753908380772164642649304217792528090440716191580724484473328235664927817984771636372875409898830005825976063650593238541433729038373056225370315599153406133185392320847\",\n       \"-502172553703744753908380772164642649304217792528090440716191580724484473328235664927817984771636372875409898830005825976063650593238541433729038373056225370315599153406133185392320847\",\n       \"25810339190726741831136349797818105994358611764887668315197822821632935574011575463532742868091838388104842551381619490991039627647851601302773448573544037953054558472548\",\n       \"-25810339190726741831136349797818105994358611764887668315197822821632935574011575463532742868091838388104842551381619490991039627647851601302773448573544037953054558472548\",\n       \"4665422938667922731390545239525991067478667357298476881860826251089436662146540827982134227087684685030991914103761128873483160892760746361799786480055617662181625815248230938316973880302906675299954379007760370823224832674779\",\n       \"-4665422938667922731390545239525991067478667357298476881860826251089436662146540827982134227087684685030991914103761128873483160892760746361799786480055617662181625815248230938316973880302906675299954379007760370823224832674779\",\n       \"2223735597830224864049890057834039493638098960775167604145066375240100821674008194961337124741661084219067145508494176034464042665143434078149689607318313818865277681569064932224810481504434495675653041063465302100041302802648038458370477008560806359234416742985635022084248641500377\",\n       \"-2223735597830224864049890057834039493638098960775167604145066375240100821674008194961337124741661084219067145508494176034464042665143434078149689607318313818865277681569064932224810481504434495675653041063465302100041302802648038458370477008560806359234416742985635022084248641500377\",\n       \"42345447563490737654515925924136916105150662665879987625806652403110474948139404742355256883201223238547442445427767854602327889485658289780295383306283583160293766253974742903668207523228749309062814526339073599070\",\n       \"-42345447563490737654515925924136916105150662665879987625806652403110474948139404742355256883201223238547442445427767854602327889485658289780295383306283583160293766253974742903668207523228749309062814526339073599070\",\n       \"40757494492054593189505181124883370961902335356122875708839948469462201920152164929215445\",\n       \"-40757494492054593189505181124883370961902335356122875708839948469462201920152164929215445\",\n       \"489422217562968312762274110453276604934633603473056760608254327080440181671628006090249666021287247215269380617364913734802444913151007354363389984204873709403053283740243705411640696405073698784366581571968399\",\n       \"-489422217562968312762274110453276604934633603473056760608254327080440181671628006090249666021287247215269380617364913734802444913151007354363389984204873709403053283740243705411640696405073698784366581571968399\",\n       \"203828256280853345400063519072625079280180030947163985710628295241982787474897521472368518281000277120011930353824152022905149681658066777399408021281560972784695745183483128330447721487075906552349941557379095078354083487747855104922\",\n       \"-203828256280853345400063519072625079280180030947163985710628295241982787474897521472368518281000277120011930353824152022905149681658066777399408021281560972784695745183483128330447721487075906552349941557379095078354083487747855104922\",\n       \"12579256107866823853770946314828592500732374403508913980712874463292391864755987195690537357503818366347747743186695890433\",\n       \"-12579256107866823853770946314828592500732374403508913980712874463292391864755987195690537357503818366347747743186695890433\",\n       \"26755461309842501536357032592700549777692476999989333013567704060006230872678556198949194222172481328325450314710024939575841488411640806870121381285742075565712411648904027990740378131995279017965737335010708563099143288460848557783\",\n       \"-26755461309842501536357032592700549777692476999989333013567704060006230872678556198949194222172481328325450314710024939575841488411640806870121381285742075565712411648904027990740378131995279017965737335010708563099143288460848557783\",\n       \"179718434482969588987690660522936295504619795328517541448501507443327040584026830018965223706205351139318424383916072860628585971720095475736018979361135523338248920218527202\",\n       \"-179718434482969588987690660522936295504619795328517541448501507443327040584026830018965223706205351139318424383916072860628585971720095475736018979361135523338248920218527202\",\n       \"4559476727415984415667742638506394832394804942241662737080235712002719322907465863068712531182175979070036317680566622\",\n       \"-4559476727415984415667742638506394832394804942241662737080235712002719322907465863068712531182175979070036317680566622\",\n       \"18056873734891410248496182290389914805111823879862689239017282732\",\n       \"-18056873734891410248496182290389914805111823879862689239017282732\",\n       \"28355632329442976457768532159881703427555635510700435885472670967222653884076177077876502624372493819303621756857250806505170393973261606631093857830885883244831587318220509004\",\n       \"-28355632329442976457768532159881703427555635510700435885472670967222653884076177077876502624372493819303621756857250806505170393973261606631093857830885883244831587318220509004\",\n       \"1459732654931833317515433139762665712773308964783227471709926780387231673576225461320924899820938949422193790260955695331912805657904286897274122419209888368548603\",\n       \"-1459732654931833317515433139762665712773308964783227471709926780387231673576225461320924899820938949422193790260955695331912805657904286897274122419209888368548603\",\n       \"841297417411594292128977\",\n       \"-841297417411594292128977\",\n       \"4242195673983737600970155103235752981938372024288592013363272064075708471058134960551862070710453189027317281773782487650970\",\n       \"-4242195673983737600970155103235752981938372024288592013363272064075708471058134960551862070710453189027317281773782487650970\",\n       \"197127905405798244\",\n       \"-197127905405798244\",\n       \"6563407470658357675196420807382675727943443587151170499642011999875762151944659352887984041897388778521562733\",\n       \"-6563407470658357675196420807382675727943443587151170499642011999875762151944659352887984041897388778521562733\",\n       \"171120862433529862507872013528755671195868254123500416552655719933624587064946914905766882327146949422149531556848478731913777486790475986722345662117903207153341\",\n       \"-171120862433529862507872013528755671195868254123500416552655719933624587064946914905766882327146949422149531556848478731913777486790475986722345662117903207153341\",\n       \"187214460763227398586269742130045771591887383985328887736156741862960369193610822715922978601952519088940029424980096549841026833488303831185375087247455968007157419452960145311595471\",\n       \"-187214460763227398586269742130045771591887383985328887736156741862960369193610822715922978601952519088940029424980096549841026833488303831185375087247455968007157419452960145311595471\",\n       \"2673090487374081993731207525489391145288488762290600450482603424170240599600446740180718555900667741328318482506598059839151491967628487386391045037818794920023261735737921639708995039726148095626857322210114264941784225627483927045402749218\",\n       \"-2673090487374081993731207525489391145288488762290600450482603424170240599600446740180718555900667741328318482506598059839151491967628487386391045037818794920023261735737921639708995039726148095626857322210114264941784225627483927045402749218\",\n       \"299586874531112789052013025908546379682766040499696938471256503832571345345612339844529913907580250563145642647\",\n       \"-299586874531112789052013025908546379682766040499696938471256503832571345345612339844529913907580250563145642647\",\n       \"405538475580851874887939920459327617092961192248480802208813876830531489658564864824178266672271683879464330412787024584249226414349424728066961849584546083679996737251131765131648932944495100981642907933045304884221229278087094810231012513599884296417415741723145516546902774087770992604\",\n       \"-405538475580851874887939920459327617092961192248480802208813876830531489658564864824178266672271683879464330412787024584249226414349424728066961849584546083679996737251131765131648932944495100981642907933045304884221229278087094810231012513599884296417415741723145516546902774087770992604\",\n       \"4289997525579508886804910999084475469759259557183118236485054735737485047460566798688052482933027075995626140181076328124548622067825535609834113884951451721787266314523910215228638324453588589604475728750868849529649579405314779527171490876426202137784122981787297800640695809335850632264276817218\",\n       \"-4289997525579508886804910999084475469759259557183118236485054735737485047460566798688052482933027075995626140181076328124548622067825535609834113884951451721787266314523910215228638324453588589604475728750868849529649579405314779527171490876426202137784122981787297800640695809335850632264276817218\",\n       \"8307592530302620538620421474950064873013\",\n       \"-8307592530302620538620421474950064873013\",\n       \"668153113826415803744690433659063449914674108460\",\n       \"-668153113826415803744690433659063449914674108460\",\n       \"46917857009025361535384034419352878543368877134948287044907072634745489626203425426919312434872888667388137952819558853009128820322712955326948275185023832843664510785316937903\",\n       \"-46917857009025361535384034419352878543368877134948287044907072634745489626203425426919312434872888667388137952819558853009128820322712955326948275185023832843664510785316937903\",\n       \"72692276728923532198738657661593229541714898424777445103294553106601965453652630548922019551752677856073619742879036073418\",\n       \"-72692276728923532198738657661593229541714898424777445103294553106601965453652630548922019551752677856073619742879036073418\",\n       \"1365147498021014007274145395277247416653740352472059016216427940658523565320578614021663036729154339063385098348763260722534882240886880631939819\",\n       \"-1365147498021014007274145395277247416653740352472059016216427940658523565320578614021663036729154339063385098348763260722534882240886880631939819\",\n       \"114300720014386070718720229683003272046146186775381997423967458204765959963431901037954797839956346151530366909939183214\",\n       \"-114300720014386070718720229683003272046146186775381997423967458204765959963431901037954797839956346151530366909939183214\",\n       \"6762\",\n       \"-6762\",\n       \"52958329794842511544564431607079502085929565913139912125121000214082684350382689340216127453430020886928460043472604757294523852724883994706799227072659732722150629405334684502120793494615254736603105282342926917766772004919\",\n       \"-52958329794842511544564431607079502085929565913139912125121000214082684350382689340216127453430020886928460043472604757294523852724883994706799227072659732722150629405334684502120793494615254736603105282342926917766772004919\",\n       \"176688206756700071063559027466389453920766491733115376426152125336429137613213551729990793300311032785623\",\n       \"-176688206756700071063559027466389453920766491733115376426152125336429137613213551729990793300311032785623\",\n       \"1922483080110348257033411950111656752298655371856953617086529843662865561409994291993287457671153478029077149725149857725\",\n       \"-1922483080110348257033411950111656752298655371856953617086529843662865561409994291993287457671153478029077149725149857725\",\n       \"116652054071220139544336382432735630060274666911983\",\n       \"-116652054071220139544336382432735630060274666911983\",\n       \"5174104538080339543938990263794928249064915674657896129852899608936285960971761863486556625630466310050160624211680012958157394810117796321101931191821302341708281726643201876685372393200977149042032383466554582623637450297592330981838876150680862436764327264788138788126029954523641986\",\n       \"-5174104538080339543938990263794928249064915674657896129852899608936285960971761863486556625630466310050160624211680012958157394810117796321101931191821302341708281726643201876685372393200977149042032383466554582623637450297592330981838876150680862436764327264788138788126029954523641986\",\n       \"56602051214329308908684928399837460067357624824927409574521689818931407829513021195830603280968596169697964984976489620035360483629559652883726214824557656337088813049173231800245733072858891481768028465352155733037356970930661713472640527903665\",\n       \"-56602051214329308908684928399837460067357624824927409574521689818931407829513021195830603280968596169697964984976489620035360483629559652883726214824557656337088813049173231800245733072858891481768028465352155733037356970930661713472640527903665\",\n       \"50465855132621952642877529162542254312895872248149199085828932352785530557943935823716975491349313488156548806716473058702726383127266\",\n       \"-50465855132621952642877529162542254312895872248149199085828932352785530557943935823716975491349313488156548806716473058702726383127266\",\n       \"2103822150383069790413887708626272542825699206757181614299988243654634518589287733034323781018255\",\n       \"-2103822150383069790413887708626272542825699206757181614299988243654634518589287733034323781018255\",\n       \"2884145868221566190464654384898336516944031094549949335240745089189320393412625205715458573411537464678090067152741985416827426839574623518965109414118185662809105887512018969132683541056905460490486376635525002751775036410408309529607280059108670794204594780445621\",\n       \"-2884145868221566190464654384898336516944031094549949335240745089189320393412625205715458573411537464678090067152741985416827426839574623518965109414118185662809105887512018969132683541056905460490486376635525002751775036410408309529607280059108670794204594780445621\",\n       \"17151949587338385537174755341574689039375819189521363664160085642631581896638291949680521029535105884955679278095750173056302788876858996886433270550139444896998901\",\n       \"-17151949587338385537174755341574689039375819189521363664160085642631581896638291949680521029535105884955679278095750173056302788876858996886433270550139444896998901\",\n       \"480533356849702776352763749832742587425919427139102525668442168835109831060078665166920712330431373189225474215620302495581803094913110624590177406888394624128938633526464614177040468306987399\",\n       \"-480533356849702776352763749832742587425919427139102525668442168835109831060078665166920712330431373189225474215620302495581803094913110624590177406888394624128938633526464614177040468306987399\",\n       \"4048293905596052205036948911452380394795846231788449\",\n       \"-4048293905596052205036948911452380394795846231788449\",\n       \"26995137345178218227830930364666340738\",\n       \"-26995137345178218227830930364666340738\",\n       \"774397441571262230984201650112220858044164538606555323635490088358801192583611522683260312754942754317572391764052135170163899209038840031703432786259696586141227827701639190998818229513\",\n       \"-774397441571262230984201650112220858044164538606555323635490088358801192583611522683260312754942754317572391764052135170163899209038840031703432786259696586141227827701639190998818229513\",\n       \"18762561208181880394479657197069746737270753294648933008217092757003616838536799737540224936022419848244051559923181261528435902887894811151076237\",\n       \"-18762561208181880394479657197069746737270753294648933008217092757003616838536799737540224936022419848244051559923181261528435902887894811151076237\",\n       \"907239775827042770755661550314761787115062100342977397902609610238855670466824379\",\n       \"-907239775827042770755661550314761787115062100342977397902609610238855670466824379\",\n       \"752510106807455900379909618532778973994453687695730898309343615105390212836204453042377052183212876905061\",\n       \"-752510106807455900379909618532778973994453687695730898309343615105390212836204453042377052183212876905061\",\n       \"1594387591422875707361322970839625151131381378174641793551465510142159417127028702651513859466122585110982922292801583543059620610053622982905425511766811223211156471041084636387606630303692709955363035\",\n       \"-1594387591422875707361322970839625151131381378174641793551465510142159417127028702651513859466122585110982922292801583543059620610053622982905425511766811223211156471041084636387606630303692709955363035\",\n       \"23316150037708287470080374296114607254763375473373018965703611900047553929551418522455587001961482391010828529091929849671267100179126145618520750402550331537136654\",\n       \"-23316150037708287470080374296114607254763375473373018965703611900047553929551418522455587001961482391010828529091929849671267100179126145618520750402550331537136654\",\n       \"206570606519236414660405117101821960086150934143523942248291980694989781221204732295572458288359135192620910534498754440751275665591490740002481374496819362873621178489882031204314197626575326338703982006151642904\",\n       \"-206570606519236414660405117101821960086150934143523942248291980694989781221204732295572458288359135192620910534498754440751275665591490740002481374496819362873621178489882031204314197626575326338703982006151642904\",\n       \"64632739363686102310668199833121081452653123828159756435580680576799270035485260582762183515021072594277553694799435773660728228989363057503956061322371391729597055325808343868799201699918264379213943162952380242502610323\",\n       \"-64632739363686102310668199833121081452653123828159756435580680576799270035485260582762183515021072594277553694799435773660728228989363057503956061322371391729597055325808343868799201699918264379213943162952380242502610323\",\n       \"589421411734420159501267976455896411309276255208891167201590523330271039604417032437154142085688410405533459836702131617092573518938815446609802434772431958960872071215171855513041280388698254907927340515117391166070141683457342784\",\n       \"-589421411734420159501267976455896411309276255208891167201590523330271039604417032437154142085688410405533459836702131617092573518938815446609802434772431958960872071215171855513041280388698254907927340515117391166070141683457342784\",\n       \"78879805619934569024599381571707822806614963415349200270284875054237164864359624372158647647863797008340316828012300755667110314855460503179181117097385701319739187114139718329827695009617428401620773545555394848573360317456047893463046622890050301003010952433178967879125505419476694805185008787411114258\",\n       \"-78879805619934569024599381571707822806614963415349200270284875054237164864359624372158647647863797008340316828012300755667110314855460503179181117097385701319739187114139718329827695009617428401620773545555394848573360317456047893463046622890050301003010952433178967879125505419476694805185008787411114258\",\n       \"23502781763641178064404023959903165549857567200280242514656186491195674181432757323176594593508102253721487854615955222259753262265267416938\",\n       \"-23502781763641178064404023959903165549857567200280242514656186491195674181432757323176594593508102253721487854615955222259753262265267416938\",\n       \"409297139610776763506123895143481451963282099839420969098705456374184360544846067009871040867462673178544358986308342020083146065020599826820240081787171394155098100110040672410422987400472449240126519719022700797622570738\",\n       \"-409297139610776763506123895143481451963282099839420969098705456374184360544846067009871040867462673178544358986308342020083146065020599826820240081787171394155098100110040672410422987400472449240126519719022700797622570738\",\n       \"23333202714794325323697505\",\n       \"-23333202714794325323697505\",\n       \"88926553698672071141130629238070206100425021951043909308812007686747474756572535280975280230894876905612920792259781652532353624660383165526934048092970256374163978700915230573599950689593884285235239417830600259906139092309559397593337924686035082341037174504874298230037865321327\",\n       \"-88926553698672071141130629238070206100425021951043909308812007686747474756572535280975280230894876905612920792259781652532353624660383165526934048092970256374163978700915230573599950689593884285235239417830600259906139092309559397593337924686035082341037174504874298230037865321327\",\n       \"193216483164388919875865726156220378900478525465101761599275916110098513\",\n       \"-193216483164388919875865726156220378900478525465101761599275916110098513\",\n       \"445147927105811334112201187535182947887817402193430490222008844342623483790016955826328140200646698573333197769902932812101243075968229955686369555029175781\",\n       \"-445147927105811334112201187535182947887817402193430490222008844342623483790016955826328140200646698573333197769902932812101243075968229955686369555029175781\",\n       \"404724915427015100236245877077487335897861954733139220931559056131326351438847042320598819539736832267015136080413912317007525653866157576085879981310860858916082141809558153661155248226776118160741627797764071433035028151035984348656570943456141740411122305727778772350559929918941\",\n       \"-404724915427015100236245877077487335897861954733139220931559056131326351438847042320598819539736832267015136080413912317007525653866157576085879981310860858916082141809558153661155248226776118160741627797764071433035028151035984348656570943456141740411122305727778772350559929918941\",\n       \"15881033668267446564985922502808887168130126414945171534501886241573767046656582600501857191275522198094812554481448361027945717673462595782212036129626347287630493102505400\",\n       \"-15881033668267446564985922502808887168130126414945171534501886241573767046656582600501857191275522198094812554481448361027945717673462595782212036129626347287630493102505400\",\n       \"2137415689988797072560582676089346590053122445\",\n       \"-2137415689988797072560582676089346590053122445\",\n       \"323798850186148580554863589187091135845440166774430133093440314556959379021941132307127400322225854705093073925068652013957143959242670668925116774275979824\",\n       \"-323798850186148580554863589187091135845440166774430133093440314556959379021941132307127400322225854705093073925068652013957143959242670668925116774275979824\",\n       \"173508106063459544226297157276274728721118210069318517925122848577242175434996938459695476331454013223646557993405407002578179119005445994337106614223750746479653994536225606203430489837348181146905602085037927766933972128185498665420530967676198121700174\",\n       \"-173508106063459544226297157276274728721118210069318517925122848577242175434996938459695476331454013223646557993405407002578179119005445994337106614223750746479653994536225606203430489837348181146905602085037927766933972128185498665420530967676198121700174\",\n       \"78355099355274385235041105626642472390321765441120677546321753788293394435411913702107288104186287888107050196021354011143759436476044341380451\",\n       \"-78355099355274385235041105626642472390321765441120677546321753788293394435411913702107288104186287888107050196021354011143759436476044341380451\",\n       \"14082584100725485095810331470851521352703939751219746773401724408039845947212432002741091564650266209598267452042246073901010147451656273871799778680203026839107331149\",\n       \"-14082584100725485095810331470851521352703939751219746773401724408039845947212432002741091564650266209598267452042246073901010147451656273871799778680203026839107331149\",\n       \"2451726111242013614644472867015070800954350593117210091845723358334627905121894871023262409519589588967063261046514660829821816464168656627289239433694932574140916666824\",\n       \"-2451726111242013614644472867015070800954350593117210091845723358334627905121894871023262409519589588967063261046514660829821816464168656627289239433694932574140916666824\",\n       \"20065158625055757494521923831526555875918181556943569250588125153526936260221797604217490757723244157360646025073105062346371489195519447915244240862375631489025063124997553195851549786517441567063889510370756857238499576234680378947724748027600877684623953611544337343413268969959530489689129071097842283967\",\n       \"-20065158625055757494521923831526555875918181556943569250588125153526936260221797604217490757723244157360646025073105062346371489195519447915244240862375631489025063124997553195851549786517441567063889510370756857238499576234680378947724748027600877684623953611544337343413268969959530489689129071097842283967\",\n       \"2877720628966736569525036642910772915862211025917410379176852591593786965122381483084242795700755306144132542301154682139822037092615315519\",\n       \"-2877720628966736569525036642910772915862211025917410379176852591593786965122381483084242795700755306144132542301154682139822037092615315519\",\n       \"3795119948781692972575431\",\n       \"-3795119948781692972575431\",\n       \"117633423107664842386614454295318823031546808284886498133093442797780366695865088951102734835036375188027702346663647830425172733187275067584200082224814835976110754843437513016147344252016745713239843138800215136235719850541984478206795380204540097476184957279443\",\n       \"-117633423107664842386614454295318823031546808284886498133093442797780366695865088951102734835036375188027702346663647830425172733187275067584200082224814835976110754843437513016147344252016745713239843138800215136235719850541984478206795380204540097476184957279443\",\n       \"6028200577464886742220964264433220606667469744201474633845587044124944417457573648621749660231277732832613157240821087790368844691241612\",\n       \"-6028200577464886742220964264433220606667469744201474633845587044124944417457573648621749660231277732832613157240821087790368844691241612\",\n       \"1117820580139700758941594748763781946255037110167582749384133756752449839190401944216912957650664993553129645500059553210763046702311000117537213965255288711420760932554622971299296197897\",\n       \"-1117820580139700758941594748763781946255037110167582749384133756752449839190401944216912957650664993553129645500059553210763046702311000117537213965255288711420760932554622971299296197897\",\n       \"894440058986616656162159749909897\",\n       \"-894440058986616656162159749909897\",\n       \"11758059164722075820822351813564721682251718268398125058702252593271794825804844012676212580269973081943948588059900469592179919885984813401833621636489306\",\n       \"-11758059164722075820822351813564721682251718268398125058702252593271794825804844012676212580269973081943948588059900469592179919885984813401833621636489306\",\n       \"48260623373995703142149825869126942692445720237750683695954821352777035904885960923027672480964040682023869233942201916828693522743832886088998972188767776078279426029402097202986260065462533610836932273188567823090315418748142243190815560532101505961513910649086153182477090526300312187507612192\",\n       \"-48260623373995703142149825869126942692445720237750683695954821352777035904885960923027672480964040682023869233942201916828693522743832886088998972188767776078279426029402097202986260065462533610836932273188567823090315418748142243190815560532101505961513910649086153182477090526300312187507612192\",\n       \"155032044456958560653742313851007803134963800248495609164183285804227615140653638264588439258316691251377924988538500569549816017742093617863981847156274851353234781166567436349214058632603830394495548221403249818520855020397602702298881144444526972675887598504476681959777521420493375210129749627151599\",\n       \"-155032044456958560653742313851007803134963800248495609164183285804227615140653638264588439258316691251377924988538500569549816017742093617863981847156274851353234781166567436349214058632603830394495548221403249818520855020397602702298881144444526972675887598504476681959777521420493375210129749627151599\",\n       \"117\",\n       \"-117\",\n       \"31151175335\",\n       \"-31151175335\",\n       \"35374964788462894211615124919986334396217303170433399786403229831899783789349053619411986131305536842776505623498475004759495592581325624956208728845327562674600497034793430703900584828213353358028973193115581365893453195729236094397513635\",\n       \"-35374964788462894211615124919986334396217303170433399786403229831899783789349053619411986131305536842776505623498475004759495592581325624956208728845327562674600497034793430703900584828213353358028973193115581365893453195729236094397513635\",\n       \"11796859242834559349330645424007719279425086069437451547961817738176345052586077262730615110965711332407717403184353050831388270460861280643450803074302303211224953369570563468013937668078037503909168201005260137906679740236981824660385730820591421051254923150011711560287985553001992949325890751138512\",\n       \"-11796859242834559349330645424007719279425086069437451547961817738176345052586077262730615110965711332407717403184353050831388270460861280643450803074302303211224953369570563468013937668078037503909168201005260137906679740236981824660385730820591421051254923150011711560287985553001992949325890751138512\",\n       \"170647522893580509002975714845089353418304318223993041052613489603839464032767136346831417604396147862171608710351258359424720597066331032122844389758062085194297618983116731697591466836398130208912823480520907032976237477074428855652406620425725105496\",\n       \"-170647522893580509002975714845089353418304318223993041052613489603839464032767136346831417604396147862171608710351258359424720597066331032122844389758062085194297618983116731697591466836398130208912823480520907032976237477074428855652406620425725105496\",\n       \"5281478654865951520041163170269381080147277352244478257096792252048711710697114547916527006005288159091362187924\",\n       \"-5281478654865951520041163170269381080147277352244478257096792252048711710697114547916527006005288159091362187924\",\n       \"4612981530909908953399866319425198830164041651329116814589068706471983209837216442140437916749761739590696654721694691453248631167747384468652625616153898389404331335686814768720227658621123619760490072200457566243849427676890450504279708348832752925128591526859889728\",\n       \"-4612981530909908953399866319425198830164041651329116814589068706471983209837216442140437916749761739590696654721694691453248631167747384468652625616153898389404331335686814768720227658621123619760490072200457566243849427676890450504279708348832752925128591526859889728\",\n       \"230942413272730226530444519509994205060147713549648054777582719550812782352234600742222169014506643621109087605680440174002739494059492224354791764876753787909937534165450961813280650662325436679754051868455414\",\n       \"-230942413272730226530444519509994205060147713549648054777582719550812782352234600742222169014506643621109087605680440174002739494059492224354791764876753787909937534165450961813280650662325436679754051868455414\",\n       \"528690042093345595850504247\",\n       \"-528690042093345595850504247\",\n       \"31537765402865704303346035013066893813209666897703115111579537190812318360668479310525622135277986713283804\",\n       \"-31537765402865704303346035013066893813209666897703115111579537190812318360668479310525622135277986713283804\",\n       \"1599362772260782365940237955777469665833441883265981514825058091831969039328944925726126036206151420504388513842915084045761\",\n       \"-1599362772260782365940237955777469665833441883265981514825058091831969039328944925726126036206151420504388513842915084045761\",\n       \"22018294718309903690696646065850459504307668740106965970119563766751726997751841635147532383629353261767951801681466624415627829013290232821085001690020179707527003163210966668639431417007076432036482650137410011799888860384641536214437778644612376970907784011215\",\n       \"-22018294718309903690696646065850459504307668740106965970119563766751726997751841635147532383629353261767951801681466624415627829013290232821085001690020179707527003163210966668639431417007076432036482650137410011799888860384641536214437778644612376970907784011215\",\n       \"139228864110515195216553853606798559408959520596931103855825362443397424774758172\",\n       \"-139228864110515195216553853606798559408959520596931103855825362443397424774758172\",\n       \"438362563301076\",\n       \"-438362563301076\",\n       \"536477710240446158400855952047098861739032777002422842180036166459742934651199360607978321612514452622744911025658574877961214107174719449789017540265828279486524590338437269953368890994755662873267173870955360800125978287820421262971848425170065\",\n       \"-536477710240446158400855952047098861739032777002422842180036166459742934651199360607978321612514452622744911025658574877961214107174719449789017540265828279486524590338437269953368890994755662873267173870955360800125978287820421262971848425170065\",\n       \"498862087303189047484286815556440094292974761004818123941676688570935488959257235857771896260779999415327140115975996793571922312686472323161351487622438079274047587863856806852283080757914159158900221821\",\n       \"-498862087303189047484286815556440094292974761004818123941676688570935488959257235857771896260779999415327140115975996793571922312686472323161351487622438079274047587863856806852283080757914159158900221821\",\n       \"397485490350112467732556257997195088092587231213238688938663359508903507782996482344687130558398493814503644541315765003280501133111\",\n       \"-397485490350112467732556257997195088092587231213238688938663359508903507782996482344687130558398493814503644541315765003280501133111\",\n       \"849712043650971777004742171643106324862754090831744200814795006972518085972931752076874433562783731671435108431684162545599206785950669723461026526402295759448129538027792947274880743875232398841880484354651333627643180878756213653\",\n       \"-849712043650971777004742171643106324862754090831744200814795006972518085972931752076874433562783731671435108431684162545599206785950669723461026526402295759448129538027792947274880743875232398841880484354651333627643180878756213653\",\n       \"31939357424827970804026114453315327769012263471221072258182242042519626638563054352273477096407109171097657867287701617587164195568409977479696410846577473709461543239341493963739506308939662837999529461859333741861608567355869490150265338213466190360633042086859245316851129010609\",\n       \"-31939357424827970804026114453315327769012263471221072258182242042519626638563054352273477096407109171097657867287701617587164195568409977479696410846577473709461543239341493963739506308939662837999529461859333741861608567355869490150265338213466190360633042086859245316851129010609\",\n       \"59075219415446517463799317419672630289040\",\n       \"-59075219415446517463799317419672630289040\",\n       \"61544636348619846793635535253831658039274289566061329628\",\n       \"-61544636348619846793635535253831658039274289566061329628\",\n       \"470399936237982365631161793432085070263103572484796818885564848815758149943921811891860946060341559711899471195599373649384438242044515090831782134530922053677106020022279456123296157017910183495235140194390296804039743799564279602012304465862001339612585603213921336997140271860031180936085302533520084\",\n       \"-470399936237982365631161793432085070263103572484796818885564848815758149943921811891860946060341559711899471195599373649384438242044515090831782134530922053677106020022279456123296157017910183495235140194390296804039743799564279602012304465862001339612585603213921336997140271860031180936085302533520084\",\n       \"4263018257494613144043214865050835432323223259669979976818528797978364036590648420\",\n       \"-4263018257494613144043214865050835432323223259669979976818528797978364036590648420\",\n       \"1030364360168890027890816549580\",\n       \"-1030364360168890027890816549580\",\n       \"792685786141580556314148491833336274593743818\",\n       \"-792685786141580556314148491833336274593743818\",\n       \"641446086312126555467875106303989084781624843543297958597183735580271101775752996685163\",\n       \"-641446086312126555467875106303989084781624843543297958597183735580271101775752996685163\",\n       \"5495154319842093167496249323058689957423462\",\n       \"-5495154319842093167496249323058689957423462\",\n       \"11789599234651983989010071854908355935861398361186377696491616773407893531669446332781833177934487486443699554324479061335467496521890118734937498733191672611144989167953103344991959519028482263752023000602387955366518706202210024461852086754020196\",\n       \"-11789599234651983989010071854908355935861398361186377696491616773407893531669446332781833177934487486443699554324479061335467496521890118734937498733191672611144989167953103344991959519028482263752023000602387955366518706202210024461852086754020196\",\n       \"11868320247536683221143642841170454891656934116545619261841381472878070159790790558172360288429121201484338870667354265884102674537478716958516286215910855456088033052883980008436942265685062267471783017549551768359416886934474316919451518061351858590202914987178911670\",\n       \"-11868320247536683221143642841170454891656934116545619261841381472878070159790790558172360288429121201484338870667354265884102674537478716958516286215910855456088033052883980008436942265685062267471783017549551768359416886934474316919451518061351858590202914987178911670\",\n       \"1284156757531040914593221\",\n       \"-1284156757531040914593221\",\n       \"9523156885736314276851029956129745152608513178870686801769759111308470996123088771851122858908132203444859152976097503444227519069060806081448518797562327844612222984531692130770\",\n       \"-9523156885736314276851029956129745152608513178870686801769759111308470996123088771851122858908132203444859152976097503444227519069060806081448518797562327844612222984531692130770\",\n       \"31415032545650652773467205308921957370624743383488073117109921420678201637023554362493982589097031342230335705038785983149366806922747914694551472092848890719761600241693293020110370962350805350\",\n       \"-31415032545650652773467205308921957370624743383488073117109921420678201637023554362493982589097031342230335705038785983149366806922747914694551472092848890719761600241693293020110370962350805350\",\n       \"38540294830367981299370153716758943624066595675817723365819908936210186285351422767835324962411068698716556932780434832522209505361628036446058246936860795564022909013649\",\n       \"-38540294830367981299370153716758943624066595675817723365819908936210186285351422767835324962411068698716556932780434832522209505361628036446058246936860795564022909013649\",\n       \"1489\",\n       \"-1489\",\n       \"2270684970894467473228397152522666196967234885\",\n       \"-2270684970894467473228397152522666196967234885\",\n       \"623594270429426955031234189496487600662597646571928622449980935215346797035198838197888222869632091525558748378610334926140669245375114542239425712378426359715133474059991644743953906535538195465100677512751053\",\n       \"-623594270429426955031234189496487600662597646571928622449980935215346797035198838197888222869632091525558748378610334926140669245375114542239425712378426359715133474059991644743953906535538195465100677512751053\",\n       \"60223901057086672916139687208371207252559034742838976658538850201068490068101652675647609676435807962967919811849514616239086913537412970210091632651259826174103338368751134965303230126211398438698151879240977404460468186851886617548182773561840252412981638510923\",\n       \"-60223901057086672916139687208371207252559034742838976658538850201068490068101652675647609676435807962967919811849514616239086913537412970210091632651259826174103338368751134965303230126211398438698151879240977404460468186851886617548182773561840252412981638510923\",\n       \"352083164097278474078005845682075986531119761078051415723391468152762696096016941577257179144242535089572306180818322625093102190964224730315213843217203692079968682\",\n       \"-352083164097278474078005845682075986531119761078051415723391468152762696096016941577257179144242535089572306180818322625093102190964224730315213843217203692079968682\",\n       \"256914715526573594304760664453685512541013676570328830117752884150636769825195172277797835580253224279327546275273345112399482552434310216245805227544453571042746897560531287112979681556135355\",\n       \"-256914715526573594304760664453685512541013676570328830117752884150636769825195172277797835580253224279327546275273345112399482552434310216245805227544453571042746897560531287112979681556135355\",\n       \"3929812712463085187666519605941080752665430680003082969619532219612559124276337233356486033607557565841182562299051203553436156356748939\",\n       \"-3929812712463085187666519605941080752665430680003082969619532219612559124276337233356486033607557565841182562299051203553436156356748939\",\n       \"1342865274232326934240128816495975896816628726930390134403022164244814040962732527145178443776536620876592577\",\n       \"-1342865274232326934240128816495975896816628726930390134403022164244814040962732527145178443776536620876592577\",\n       \"75482499101235806844482700363651520608393572186840116071510831\",\n       \"-75482499101235806844482700363651520608393572186840116071510831\",\n       \"157079333706470320589362721287335446436100673921262275021919536009571391130921654202277262407403872423297032197476611916298599850639905615780935087993369908937\",\n       \"-157079333706470320589362721287335446436100673921262275021919536009571391130921654202277262407403872423297032197476611916298599850639905615780935087993369908937\",\n       \"21096758435207806377330934948465784354053655\",\n       \"-21096758435207806377330934948465784354053655\",\n       \"7296202760566732448484088809683111106213594240238214600327977304983210800704941723091693567279115428088283219305211898160182\",\n       \"-7296202760566732448484088809683111106213594240238214600327977304983210800704941723091693567279115428088283219305211898160182\",\n       \"9473711847689244707278408760608984165904137893454069938633516224794155238069623008814110071678551847797982066773376077\",\n       \"-9473711847689244707278408760608984165904137893454069938633516224794155238069623008814110071678551847797982066773376077\",\n       \"424157689387860814675639\",\n       \"-424157689387860814675639\",\n       \"2311915845008175998603844058297620909349923283750536586587937434312377733844702049651807722475434283757267961177665307169760829875889028168476878787006491399930630338344642910500797043234542368361571429181649829252175786093011520179318\",\n       \"-2311915845008175998603844058297620909349923283750536586587937434312377733844702049651807722475434283757267961177665307169760829875889028168476878787006491399930630338344642910500797043234542368361571429181649829252175786093011520179318\",\n       \"74548539487073557220326968093479867500276859338046876248826540472060313997\",\n       \"-74548539487073557220326968093479867500276859338046876248826540472060313997\",\n       \"11654322736763\",\n       \"-11654322736763\",\n       \"53007278098826078101002711940372616336\",\n       \"-53007278098826078101002711940372616336\",\n       \"79488890173950413261690334491844393856301694056413503617980571504653230048955\",\n       \"-79488890173950413261690334491844393856301694056413503617980571504653230048955\",\n       \"408713674815985937940894525901270256192656939969702057871\",\n       \"-408713674815985937940894525901270256192656939969702057871\",\n       \"793896474068238367668141234719022911425186020423846578406386752245064555357695445408188930726837363615519065571656957027286833070564842125230923415365473419\",\n       \"-793896474068238367668141234719022911425186020423846578406386752245064555357695445408188930726837363615519065571656957027286833070564842125230923415365473419\",\n       \"174808944301193943551146900431326706416195767876909997906726651518289372951\",\n       \"-174808944301193943551146900431326706416195767876909997906726651518289372951\",\n       \"15518425275704712437859509478557555507942868590674242179846381629609574039655947926978374551659365245896461352380663149726832850553382303285336261869176813113104452944002526144559297701143263522625331250816271032050756743914895178056748128568613436826595\",\n       \"-15518425275704712437859509478557555507942868590674242179846381629609574039655947926978374551659365245896461352380663149726832850553382303285336261869176813113104452944002526144559297701143263522625331250816271032050756743914895178056748128568613436826595\",\n       \"704584697906407199708590092378103021972791431202757824957775774072784740246334320005088181512002963310761780580704786814454975765\",\n       \"-704584697906407199708590092378103021972791431202757824957775774072784740246334320005088181512002963310761780580704786814454975765\",\n       \"657607704878895067543343694899228430336912631528241927302696775319590907402199923852512833112461947631065129028125536463067298383212071017877117414800369576545371975736320978897530313093703317591926126573581594016017999087405971954224745504107290022634832416486976440197266126685274050284770811156390509\",\n       \"-657607704878895067543343694899228430336912631528241927302696775319590907402199923852512833112461947631065129028125536463067298383212071017877117414800369576545371975736320978897530313093703317591926126573581594016017999087405971954224745504107290022634832416486976440197266126685274050284770811156390509\",\n       \"7494538701531220\",\n       \"-7494538701531220\",\n       \"7300727560805294687539012803042995909238449713032452769229667883869087209620881400305875438962218813943386360970483979638425963787311826059269116699436735359914333529525984293006337531416122388956292154685035813667508959604499191395591577891525195678171\",\n       \"-7300727560805294687539012803042995909238449713032452769229667883869087209620881400305875438962218813943386360970483979638425963787311826059269116699436735359914333529525984293006337531416122388956292154685035813667508959604499191395591577891525195678171\",\n       \"255504587698518445312717922712930691081197792561411090916056798257637114731417865482714584651043811829851492818242972929470506766333616107450122580899272969326648134119416080989201012163771767787520485155594757300555185954280304839051723173371630921394024027714555984796981691309\",\n       \"-255504587698518445312717922712930691081197792561411090916056798257637114731417865482714584651043811829851492818242972929470506766333616107450122580899272969326648134119416080989201012163771767787520485155594757300555185954280304839051723173371630921394024027714555984796981691309\",\n       \"1957270404535432491577732407654814296272924990076105665080976425316855184394075979033347631859\",\n       \"-1957270404535432491577732407654814296272924990076105665080976425316855184394075979033347631859\",\n       \"403660520770889026052145363858883993968408567876919963129339377184354008618147803968877043087318952555532301757740363864562971760902711427500126603597011858241477379568684342423222828785569617251693287873736233651273385183220731182322820758659074766543835657767799241434709242669340338048971\",\n       \"-403660520770889026052145363858883993968408567876919963129339377184354008618147803968877043087318952555532301757740363864562971760902711427500126603597011858241477379568684342423222828785569617251693287873736233651273385183220731182322820758659074766543835657767799241434709242669340338048971\",\n       \"1360462270574406\",\n       \"-1360462270574406\",\n       \"41324796834060083364741632465744604155931640433410301186397363904266930128665463361513275697352082859944863112972305377171961651196393476069297383272360\",\n       \"-41324796834060083364741632465744604155931640433410301186397363904266930128665463361513275697352082859944863112972305377171961651196393476069297383272360\",\n       \"3704475702528052685702177087226789799951985298635254026584051739803799717979\",\n       \"-3704475702528052685702177087226789799951985298635254026584051739803799717979\",\n       \"15324664249401045013727127578266722880923015582445744082290396086739217665923549238159714472241913755511109729288179218537980252473553017573593867710189\",\n       \"-15324664249401045013727127578266722880923015582445744082290396086739217665923549238159714472241913755511109729288179218537980252473553017573593867710189\",\n       \"991713895885660445361195566630120268552033337199519129194545503121325658310309321599773356998546067469176345858459212673467904704287664190684736527585420239571896710231\",\n       \"-991713895885660445361195566630120268552033337199519129194545503121325658310309321599773356998546067469176345858459212673467904704287664190684736527585420239571896710231\",\n       \"496917928889709928816019707237559067993121139550552680620307451932907944813916325593269613319259002416192\",\n       \"-496917928889709928816019707237559067993121139550552680620307451932907944813916325593269613319259002416192\",\n       \"5420780319939699155212032775979062279900280911343420051629512809105059842240345509925762577052334971725879572674586223682520124367213762780782010484201065072155930114824432335178466411605479995327050114745584339793378334895820002004268553531081904844570983717097867410603089\",\n       \"-5420780319939699155212032775979062279900280911343420051629512809105059842240345509925762577052334971725879572674586223682520124367213762780782010484201065072155930114824432335178466411605479995327050114745584339793378334895820002004268553531081904844570983717097867410603089\",\n       \"34178515956045799076849256172156569827315750483663840127186371829050429609564171778221768139311136758783705861242122641003313096493057103420927909105632095530710317446888521007163646123762242884609239534269531565599291518871943322912836596141732912619557997670259415580841015283\",\n       \"-34178515956045799076849256172156569827315750483663840127186371829050429609564171778221768139311136758783705861242122641003313096493057103420927909105632095530710317446888521007163646123762242884609239534269531565599291518871943322912836596141732912619557997670259415580841015283\",\n       \"24753103731553244306801885710094553322976800783421479907592940309642834383335499833992007826858595009726122\",\n       \"-24753103731553244306801885710094553322976800783421479907592940309642834383335499833992007826858595009726122\",\n       \"1303658351822779358400767265190404914258468501671414115714852481575404440331055726991532424857235529818287464081864\",\n       \"-1303658351822779358400767265190404914258468501671414115714852481575404440331055726991532424857235529818287464081864\",\n       \"82442525420\",\n       \"-82442525420\",\n       \"40181847350075911374014072545070982\",\n       \"-40181847350075911374014072545070982\",\n       \"6331081104259962585725418329411543440752124680199\",\n       \"-6331081104259962585725418329411543440752124680199\",\n       \"669444625991257897062056995037426293652388602030282843269573026219936289974215349592874907406715089995765108583608936617284270069188005340481379259012388729065198804182112491651898040335690016003489264765600281922569438256615076042625367641\",\n       \"-669444625991257897062056995037426293652388602030282843269573026219936289974215349592874907406715089995765108583608936617284270069188005340481379259012388729065198804182112491651898040335690016003489264765600281922569438256615076042625367641\",\n       \"1168675103592556804163240443883135991575851814861660107303310966160744170850036726911375287483597293098658196142018318809369957616827451967868069658172182991177709289250815148540710360498467949152008438530805196222119517692659923705203865993818359838900924606163081858543\",\n       \"-1168675103592556804163240443883135991575851814861660107303310966160744170850036726911375287483597293098658196142018318809369957616827451967868069658172182991177709289250815148540710360498467949152008438530805196222119517692659923705203865993818359838900924606163081858543\",\n       \"2496566005249030514809106685776267657051598627391700353125416989638685021308242404184826752692976528990582207413089494945\",\n       \"-2496566005249030514809106685776267657051598627391700353125416989638685021308242404184826752692976528990582207413089494945\",\n       \"75831002519613645538052701409851076434071446092420445852577692671\",\n       \"-75831002519613645538052701409851076434071446092420445852577692671\",\n       \"1595257514333333836407007696922732712451830781457969960247677871324618039799\",\n       \"-1595257514333333836407007696922732712451830781457969960247677871324618039799\",\n       \"2352103706291595728734823852677068972089963637096939637892631185119057636184628093243\",\n       \"-2352103706291595728734823852677068972089963637096939637892631185119057636184628093243\",\n       \"55150603036064305927003551612930888862894407146543079948823875920053285006001048840253371944560550042245523051895932284432859\",\n       \"-55150603036064305927003551612930888862894407146543079948823875920053285006001048840253371944560550042245523051895932284432859\",\n       \"183652285344198865127020235735671716726282119574663849914811753120306798386549535194663979983946501785937569600701888628541389188176220321121981286091051\",\n       \"-183652285344198865127020235735671716726282119574663849914811753120306798386549535194663979983946501785937569600701888628541389188176220321121981286091051\",\n       \"1670967627370678916184944999086\",\n       \"-1670967627370678916184944999086\",\n       \"1779553803107116970428487453385844908445190212603430402358107740295247\",\n       \"-1779553803107116970428487453385844908445190212603430402358107740295247\",\n       \"163081585689520939847508610298505981110843\",\n       \"-163081585689520939847508610298505981110843\",\n       \"24608823059620600828775541561806855624217762717902459681958610060078155650689789569089307408156194776319918700684027035605476736967141308737778808097438\",\n       \"-24608823059620600828775541561806855624217762717902459681958610060078155650689789569089307408156194776319918700684027035605476736967141308737778808097438\",\n       \"176229540909991348680999108287461921475890812511086227972678364382149132437628380310728470828832129727355735848528049467023561657293359463509078809812981500824290722272220174525789664137788219060477887820838690954729061422727025173596051655147380497411055372159528861310774057097642760262454\",\n       \"-176229540909991348680999108287461921475890812511086227972678364382149132437628380310728470828832129727355735848528049467023561657293359463509078809812981500824290722272220174525789664137788219060477887820838690954729061422727025173596051655147380497411055372159528861310774057097642760262454\",\n       \"1521679829312851456536026361859335013780557838686738466687399128709926436847394871570976840503705308125705873792672378389916115357657382793749503126640771533338992032259981620506047817865492352874670892991966609760209061301594191537869902100817987599206558753487441796712670736855202929172147294\",\n       \"-1521679829312851456536026361859335013780557838686738466687399128709926436847394871570976840503705308125705873792672378389916115357657382793749503126640771533338992032259981620506047817865492352874670892991966609760209061301594191537869902100817987599206558753487441796712670736855202929172147294\",\n       \"4157696366999482544605875019162016856282588665242578471972156413342580075270416675018859586511300869507848273592737229363773252760313860357749814761595582127449880857952033970115380383676900743584438652262171904692777471245621134891056589732734422433379524779439127971588536170244050150621694478\",\n       \"-4157696366999482544605875019162016856282588665242578471972156413342580075270416675018859586511300869507848273592737229363773252760313860357749814761595582127449880857952033970115380383676900743584438652262171904692777471245621134891056589732734422433379524779439127971588536170244050150621694478\",\n       \"1080490672913509861800536351320773525291317691569674170377657976498332490333353859955175522548201462648648619481614475899104059632553936657464424434357970937863187647621979084401315431140833788114037982\",\n       \"-1080490672913509861800536351320773525291317691569674170377657976498332490333353859955175522548201462648648619481614475899104059632553936657464424434357970937863187647621979084401315431140833788114037982\",\n       \"3194906436319924706167835645658948826079202290534790460576542221669512825113141647211107781595153842508704176837984748167835595231049849647151228364465638129922085890581512323653\",\n       \"-3194906436319924706167835645658948826079202290534790460576542221669512825113141647211107781595153842508704176837984748167835595231049849647151228364465638129922085890581512323653\",\n       \"66347107100300795802324266184385521196001191250641925506321442631467978776436571080979857829987956896197464196707824641007632965810482791998323932299431716570622215408517414037865201951734572676314196738287234254247520531646927798844\",\n       \"-66347107100300795802324266184385521196001191250641925506321442631467978776436571080979857829987956896197464196707824641007632965810482791998323932299431716570622215408517414037865201951734572676314196738287234254247520531646927798844\",\n       \"11755070349326455201\",\n       \"-11755070349326455201\",\n       \"156651043578414506824194498430628709042640792209942834690006663445469241908219457011408374641207896652700963717365255757469753081082784\",\n       \"-156651043578414506824194498430628709042640792209942834690006663445469241908219457011408374641207896652700963717365255757469753081082784\",\n       \"6564614203586776498688508944538260136293893809517937442849470545503761844\",\n       \"-6564614203586776498688508944538260136293893809517937442849470545503761844\",\n       \"598962115054858410821731842471416988283668169539322479066058751789827287104304434155465947780173527582423899421590786844022599493768874809775192652719882115272582161354987\",\n       \"-598962115054858410821731842471416988283668169539322479066058751789827287104304434155465947780173527582423899421590786844022599493768874809775192652719882115272582161354987\",\n       \"14443508661606107679701498958114275550218690763128482677663411487796540412372251008043398613017374358807500824\",\n       \"-14443508661606107679701498958114275550218690763128482677663411487796540412372251008043398613017374358807500824\",\n       \"39256841936111992\",\n       \"-39256841936111992\",\n       \"22003604980409010500616552575366573651583935479333537954768716122155414073009794841075971673796002258058407019824164705801672155808939681382770846685292342660131406075122591374505200827365481659521834044185780365112968118493953141135082476859603163146563\",\n       \"-22003604980409010500616552575366573651583935479333537954768716122155414073009794841075971673796002258058407019824164705801672155808939681382770846685292342660131406075122591374505200827365481659521834044185780365112968118493953141135082476859603163146563\",\n       \"892612825794032675237656399315067134384177542558409873295423125742291209107349193521326932311978865\",\n       \"-892612825794032675237656399315067134384177542558409873295423125742291209107349193521326932311978865\",\n       \"124621\",\n       \"-124621\",\n       \"39935862547719441432334200243323687785328282085889753818085154826607463592957499184719152632875679930608636031007549318604365\",\n       \"-39935862547719441432334200243323687785328282085889753818085154826607463592957499184719152632875679930608636031007549318604365\",\n       \"53150384435463\",\n       \"-53150384435463\",\n       \"5038617365140462881167623487900113792134127235018266576334866703847563260548724132738580936393867769669999269123356358833922994762144381270134211004782972194957315491988474542647182488355728455727224128393875804308265676177706683756178477181259888932449640561270717525443984031839\",\n       \"-5038617365140462881167623487900113792134127235018266576334866703847563260548724132738580936393867769669999269123356358833922994762144381270134211004782972194957315491988474542647182488355728455727224128393875804308265676177706683756178477181259888932449640561270717525443984031839\",\n       \"18681375094308610932506726878974665535026964461038388\",\n       \"-18681375094308610932506726878974665535026964461038388\",\n       \"1694490961016050821118863403337160606621945374045986683635096733891067660467665114977365173029439236924493435715113229950328428294138767438612886428848619529462540214870987656585503501640006260787493433146977269874730836153316545758154447988098965049\",\n       \"-1694490961016050821118863403337160606621945374045986683635096733891067660467665114977365173029439236924493435715113229950328428294138767438612886428848619529462540214870987656585503501640006260787493433146977269874730836153316545758154447988098965049\",\n       \"34981000632270288897102343437813403379909519445061202916917950066646896121823399718762441640573618996405513221104482936830650441434933771175014497076492252938974657476531072878259814088155492254761929\",\n       \"-34981000632270288897102343437813403379909519445061202916917950066646896121823399718762441640573618996405513221104482936830650441434933771175014497076492252938974657476531072878259814088155492254761929\",\n       \"68186095594637277569008966718516358384203015123161693897355580993692840848969688\",\n       \"-68186095594637277569008966718516358384203015123161693897355580993692840848969688\",\n       \"1134126702908819566229008255313053760389444389322516415435539141233919754193425951992416106929842896080872524876962976885893778825250951315557865558643443244064361902243653517585491772912650759627537475187929799073482588432081\",\n       \"-1134126702908819566229008255313053760389444389322516415435539141233919754193425951992416106929842896080872524876962976885893778825250951315557865558643443244064361902243653517585491772912650759627537475187929799073482588432081\",\n       \"1219660173804105678519644769228717229961\",\n       \"-1219660173804105678519644769228717229961\",\n       \"9337788234986472797155798668633720432652335098955723216110827539222560791046580758896359512684081023719629520191135356937552064341414985563338865755044029781700472823138498290646709782655770432472849\",\n       \"-9337788234986472797155798668633720432652335098955723216110827539222560791046580758896359512684081023719629520191135356937552064341414985563338865755044029781700472823138498290646709782655770432472849\",\n       \"150424008592708034173259810113475930440810989335879628469427925370034758050373228994166602606657381400670968588175849346743433462784970176019171026242734\",\n       \"-150424008592708034173259810113475930440810989335879628469427925370034758050373228994166602606657381400670968588175849346743433462784970176019171026242734\",\n       \"10709102135708711290774115917568703434210917471089837954174155027939142290457621570052339242896415391737492196297186964273273691467020576606\",\n       \"-10709102135708711290774115917568703434210917471089837954174155027939142290457621570052339242896415391737492196297186964273273691467020576606\",\n       \"590791035282122817187786741012881114662078084344037620155645055415644697693432897703240908766855757699902350106663298\",\n       \"-590791035282122817187786741012881114662078084344037620155645055415644697693432897703240908766855757699902350106663298\",\n       \"6644806769073273664533505828539666955754832084759883392732355768142191452695685189350231701935219212931529500767858294148963537439795792593286239876735316935797953104882\",\n       \"-6644806769073273664533505828539666955754832084759883392732355768142191452695685189350231701935219212931529500767858294148963537439795792593286239876735316935797953104882\",\n       \"176511387805688073718855394072841750443509085589889404547084544683339270522709736525152936011885659232618530216217042113370236595468110548243408426032715706575057369503893468170961068580632412998988853143083945510800966719\",\n       \"-176511387805688073718855394072841750443509085589889404547084544683339270522709736525152936011885659232618530216217042113370236595468110548243408426032715706575057369503893468170961068580632412998988853143083945510800966719\",\n       \"18197814169943971748763655537459580789924675680558018542859068281859940671016292870607058355\",\n       \"-18197814169943971748763655537459580789924675680558018542859068281859940671016292870607058355\",\n       \"53665744969332986906645019910160121106654070883148709396576439910412784742262054480460348\",\n       \"-53665744969332986906645019910160121106654070883148709396576439910412784742262054480460348\",\n       \"15114701057818447666738431676226302502804615316350076959331191793491140183426763779197478527183420304400143976231566802442732838190730866504640269901006105030291550705062305121857555495397899088813125248050183715824996357342602508\",\n       \"-15114701057818447666738431676226302502804615316350076959331191793491140183426763779197478527183420304400143976231566802442732838190730866504640269901006105030291550705062305121857555495397899088813125248050183715824996357342602508\",\n       \"4538684087847049584760102928758931951663047136365690317969652570682351595540576228149035948547456528545997589204036236408244581413584178489307193893093917026883317801237483886776457347545442242\",\n       \"-4538684087847049584760102928758931951663047136365690317969652570682351595540576228149035948547456528545997589204036236408244581413584178489307193893093917026883317801237483886776457347545442242\",\n       \"68104327977018907402564677909296985240865850899633815987571\",\n       \"-68104327977018907402564677909296985240865850899633815987571\",\n       \"21126389218307474702937983111939394337442364463717300558898463056361786715220551813192286109604739592089468027639535160949266165405455186969313451687709111127347596851523580180558147019220445717949314588542773729044755127625855190216933115799293871340\",\n       \"-21126389218307474702937983111939394337442364463717300558898463056361786715220551813192286109604739592089468027639535160949266165405455186969313451687709111127347596851523580180558147019220445717949314588542773729044755127625855190216933115799293871340\",\n       \"78222020599461507025837080263377239508386033815939450849751163859949403589369059725826445373571398499131861482443466775202688633343807807754044978711136865112845737811903231211872791854642958065042325855161499335\",\n       \"-78222020599461507025837080263377239508386033815939450849751163859949403589369059725826445373571398499131861482443466775202688633343807807754044978711136865112845737811903231211872791854642958065042325855161499335\",\n       \"4085759411276713693098232266986821269735231020974977020052575836176404619187789208196423060444205\",\n       \"-4085759411276713693098232266986821269735231020974977020052575836176404619187789208196423060444205\",\n       \"1184210350766462097978915832676647869625660103053116596342\",\n       \"-1184210350766462097978915832676647869625660103053116596342\",\n       \"194539222104802835983292205414714434524058762756885327380706701321718655745439492716048166059927935241719149428879885478\",\n       \"-194539222104802835983292205414714434524058762756885327380706701321718655745439492716048166059927935241719149428879885478\",\n       \"302225946492334746161844140625842416406247812604200025274581247745184222647724964120371508273766497009905662425211\",\n       \"-302225946492334746161844140625842416406247812604200025274581247745184222647724964120371508273766497009905662425211\",\n       \"28866482602752218187265274692665814018194886187165103251546083935605515506785082873738653268219928502362268\",\n       \"-28866482602752218187265274692665814018194886187165103251546083935605515506785082873738653268219928502362268\",\n       \"5544952079050015240077157700940320243659550435014574041421348665396935579816611507888574593385073797911479160663545693602347256422370826097076074812916781822541849687962368590784552937977886205\",\n       \"-5544952079050015240077157700940320243659550435014574041421348665396935579816611507888574593385073797911479160663545693602347256422370826097076074812916781822541849687962368590784552937977886205\",\n       \"323710452268087591982845307319501376132372316351918100708894690678941776259635618528227710164786257540427054071430282571860354523279847215012107332817795823639212909924515178824923234673149086462596636590350327539723310798213754665082582892561015344012\",\n       \"-323710452268087591982845307319501376132372316351918100708894690678941776259635618528227710164786257540427054071430282571860354523279847215012107332817795823639212909924515178824923234673149086462596636590350327539723310798213754665082582892561015344012\",\n       \"6298178214804809482382903740893261997309254126083786539013344521457218202089579665480198608566443109151164759409311083172285986019510870966646266562147239668466233708302275847273212515270194723859620577435475775917236877537636439092304144350\",\n       \"-6298178214804809482382903740893261997309254126083786539013344521457218202089579665480198608566443109151164759409311083172285986019510870966646266562147239668466233708302275847273212515270194723859620577435475775917236877537636439092304144350\",\n       \"577024710470352032965427500450059067959437337861971906117178872729996600387523062943239129117535935908310731558466601208272240830153365070900204066680943610473920336450708951789975218349225167580113063050191\",\n       \"-577024710470352032965427500450059067959437337861971906117178872729996600387523062943239129117535935908310731558466601208272240830153365070900204066680943610473920336450708951789975218349225167580113063050191\",\n       \"37972747755906620986262153\",\n       \"-37972747755906620986262153\",\n       \"183829698115229455555876942979003514516640128880295179243921716692283845612914437405435307612733660894727800824835948\",\n       \"-183829698115229455555876942979003514516640128880295179243921716692283845612914437405435307612733660894727800824835948\",\n       \"2423832959667360118257064702737609023425800632192836723430775336591100757144072935869557583342500327350488117394557246526227000890820814931134670064874494870718496008517213657614840456624436847012780602721278103167235601948187645617975091973272873241569047573971620372584048698612150640\",\n       \"-2423832959667360118257064702737609023425800632192836723430775336591100757144072935869557583342500327350488117394557246526227000890820814931134670064874494870718496008517213657614840456624436847012780602721278103167235601948187645617975091973272873241569047573971620372584048698612150640\",\n       \"3689827013849535585619411952203826247332426367647260820678883970327796902123440577075450728217270007491470250603087878349241859733492652613679\",\n       \"-3689827013849535585619411952203826247332426367647260820678883970327796902123440577075450728217270007491470250603087878349241859733492652613679\",\n       \"38998054937697595881540875647042048333681659113425435564641134367164935592905762620334835531916327661633470289669510511757807865630506235328273222918421117111281556873070254844441312814372799410820410797988722601761642743512387994633124078\",\n       \"-38998054937697595881540875647042048333681659113425435564641134367164935592905762620334835531916327661633470289669510511757807865630506235328273222918421117111281556873070254844441312814372799410820410797988722601761642743512387994633124078\",\n       \"1742133972499057105001733325633478018605566678002165515479191311988758932166961086848659714709\",\n       \"-1742133972499057105001733325633478018605566678002165515479191311988758932166961086848659714709\",\n       \"2553559760939673132290078919768155422943752579897989356503182382672252331377594911957598202962666902881961594758670198463065653145968650999812730247666\",\n       \"-2553559760939673132290078919768155422943752579897989356503182382672252331377594911957598202962666902881961594758670198463065653145968650999812730247666\",\n       \"51684745772714675394936241781816223514919452679364520537119434050698905337439734233644472369565180889405426257288782419010082579894095799847229362421193687113981266355014802762308095739808334529392234853485537967988890313769779739241401223407407962126345943032536670110549434751102\",\n       \"-51684745772714675394936241781816223514919452679364520537119434050698905337439734233644472369565180889405426257288782419010082579894095799847229362421193687113981266355014802762308095739808334529392234853485537967988890313769779739241401223407407962126345943032536670110549434751102\",\n       \"672712112462360351910518120594120040601436948606148058222300198559244738922266341042360305651450642724475561271288385956130680220169715\",\n       \"-672712112462360351910518120594120040601436948606148058222300198559244738922266341042360305651450642724475561271288385956130680220169715\",\n       \"813447070819324251037079581265526580292907576372477729204338404955584410222478934593619630935314222063003252993694281837026881675600656782635846343833\",\n       \"-813447070819324251037079581265526580292907576372477729204338404955584410222478934593619630935314222063003252993694281837026881675600656782635846343833\",\n       \"1117610225194419065337568894513493776564803226432743080986022521406296090276409739149656072953983798754546991402130235309864912523411568994\",\n       \"-1117610225194419065337568894513493776564803226432743080986022521406296090276409739149656072953983798754546991402130235309864912523411568994\",\n       \"54306983641232120685850754812687679873466315381427348676538013927626387380179070467333206768501131364932160162454016646002006230714059820560113529334910854401021111543333022008153795820172235468858146103351502311717114025204496145038\",\n       \"-54306983641232120685850754812687679873466315381427348676538013927626387380179070467333206768501131364932160162454016646002006230714059820560113529334910854401021111543333022008153795820172235468858146103351502311717114025204496145038\",\n       \"113450443712297816016750119935548807386514765087946158026225637996838314569438356054721778395168\",\n       \"-113450443712297816016750119935548807386514765087946158026225637996838314569438356054721778395168\",\n       \"7352437924947754601546368441398130\",\n       \"-7352437924947754601546368441398130\",\n       \"9846278286558101102640461230277730613939270868227307780570935600269093778822376992893008780014141741647103776048800092788896154696011762350215865588521108549\",\n       \"-9846278286558101102640461230277730613939270868227307780570935600269093778822376992893008780014141741647103776048800092788896154696011762350215865588521108549\",\n       \"73473583275712621559167315389071668112406649781987949641633299346855217310106910560443921944813054763213555679810164708505\",\n       \"-73473583275712621559167315389071668112406649781987949641633299346855217310106910560443921944813054763213555679810164708505\",\n       \"44337393529749818041445106472308772039346354808448275796454672077580119659002042203928900642842510640740800196651911559238276834896411685658708100385336014325\",\n       \"-44337393529749818041445106472308772039346354808448275796454672077580119659002042203928900642842510640740800196651911559238276834896411685658708100385336014325\",\n       \"3029057656526271554842230678161240050706458471766453329711413581607557927250588221517218424325311508555983065479955684772259815134067055583713776773155106422220131994155338255582516687249210697344355756374535219768311432253647445765860280496088041768667890441415297183\",\n       \"-3029057656526271554842230678161240050706458471766453329711413581607557927250588221517218424325311508555983065479955684772259815134067055583713776773155106422220131994155338255582516687249210697344355756374535219768311432253647445765860280496088041768667890441415297183\",\n       \"730896103566527607730753327836819245922931354292181064204035921357800084090450560460429017252539616543803713640582458341962589048267291080308369681271304618861351862971290465709198912575367354463123427808437784040240907793877567792057788579265909741136\",\n       \"-730896103566527607730753327836819245922931354292181064204035921357800084090450560460429017252539616543803713640582458341962589048267291080308369681271304618861351862971290465709198912575367354463123427808437784040240907793877567792057788579265909741136\",\n       \"875972480821342956908137350797672986141068914679963791517259506036957992167704898826150763674879737404204136150\",\n       \"-875972480821342956908137350797672986141068914679963791517259506036957992167704898826150763674879737404204136150\",\n       \"80978095866121182143792129768500985270760294511412625411940522384234727394805988434574920055266468176140927390504528795674710202014688877516082928870193399763361133821060656660414289111945500870045554749239179606901392281466574470956468260058934\",\n       \"-80978095866121182143792129768500985270760294511412625411940522384234727394805988434574920055266468176140927390504528795674710202014688877516082928870193399763361133821060656660414289111945500870045554749239179606901392281466574470956468260058934\",\n       \"5108366192611283244622529332098588886037670912044545212175942213533408183226647011059305581499429284848730575416013640342256910485443191764062474694987448384264155646101960915742145430768592056025304400156363995432483639209748602875976799644331086294285921358845745557709942066403846\",\n       \"-5108366192611283244622529332098588886037670912044545212175942213533408183226647011059305581499429284848730575416013640342256910485443191764062474694987448384264155646101960915742145430768592056025304400156363995432483639209748602875976799644331086294285921358845745557709942066403846\",\n       \"6930180124964356147220207591422279016208371685360099598238746492283122379172191493127595009844321810224523734815981086376030176488602168657385920504832784693281301596520980175713179280297526196841775\",\n       \"-6930180124964356147220207591422279016208371685360099598238746492283122379172191493127595009844321810224523734815981086376030176488602168657385920504832784693281301596520980175713179280297526196841775\",\n       \"127195984139760103169058839514903174746000769823723851981181127452175305070890259297605399965306923149188386831728624922603033165495625460062407066507409867399121450024\",\n       \"-127195984139760103169058839514903174746000769823723851981181127452175305070890259297605399965306923149188386831728624922603033165495625460062407066507409867399121450024\",\n       \"766856719860424381068595879781443086540018712198126893034614346925577170838696737465130140374926102571846639744916246\",\n       \"-766856719860424381068595879781443086540018712198126893034614346925577170838696737465130140374926102571846639744916246\",\n       \"24452524790653436824651691432192056396622748\",\n       \"-24452524790653436824651691432192056396622748\",\n       \"21600696784921267417096322615448095147085787610512586576154030214298480866233496998058741115961394009177458631301020467184235259516317585587331608708009650567889604390408691257559911506849475326601795863368339333809604283115447728657967640020590611529\",\n       \"-21600696784921267417096322615448095147085787610512586576154030214298480866233496998058741115961394009177458631301020467184235259516317585587331608708009650567889604390408691257559911506849475326601795863368339333809604283115447728657967640020590611529\",\n       \"3758893374497950117544956548495424355416942972081749559738750\",\n       \"-3758893374497950117544956548495424355416942972081749559738750\",\n       \"139402452879531227967305026093373374931960661729048047992046850704933112027363474989587334281949398194424695097699435389253833391313981068405251271500306551642365788\",\n       \"-139402452879531227967305026093373374931960661729048047992046850704933112027363474989587334281949398194424695097699435389253833391313981068405251271500306551642365788\",\n       \"25612506870374484873779089622294846964717659760278221279975070009760319283018786412097109135597197982352674303356191527475964885419517878154272980015867348900662204209918494643594136945278141027429152743583659050244679551461363259179124592558207169009059175419818764353589040423929215554316106\",\n       \"-25612506870374484873779089622294846964717659760278221279975070009760319283018786412097109135597197982352674303356191527475964885419517878154272980015867348900662204209918494643594136945278141027429152743583659050244679551461363259179124592558207169009059175419818764353589040423929215554316106\",\n       \"2947281537862409310348470927599528845929360328199550369835553099926787046871370053629653311891644595607839493\",\n       \"-2947281537862409310348470927599528845929360328199550369835553099926787046871370053629653311891644595607839493\",\n       \"5238370098473928109261593022401423141534005322972191017431019829640519389374820628584873426299810704519554264840639788753962805520465217577654353515132848032321812308255870691241084866912560646162061587045231920247690379479011365117594385434098375615768143923448693726900625714250700557084631365841487720\",\n       \"-5238370098473928109261593022401423141534005322972191017431019829640519389374820628584873426299810704519554264840639788753962805520465217577654353515132848032321812308255870691241084866912560646162061587045231920247690379479011365117594385434098375615768143923448693726900625714250700557084631365841487720\",\n       \"12442661493742591574470274906943075194519541250480406451734421223577085372382129292566795701869646895013888531785728273885219518563236237522720693500170071741905622101669444727271767185013757679737024246566421692125582577245793910930758790508707497799356723763185459314157218014300646936606\",\n       \"-12442661493742591574470274906943075194519541250480406451734421223577085372382129292566795701869646895013888531785728273885219518563236237522720693500170071741905622101669444727271767185013757679737024246566421692125582577245793910930758790508707497799356723763185459314157218014300646936606\",\n       \"196768397706108832434401218046908395079672619951322343962935515221968814879\",\n       \"-196768397706108832434401218046908395079672619951322343962935515221968814879\",\n       \"105448359738523054755775683879539460376932545724741416465977687344195271654833613392218097960778272870252224864512166575087075095234145517359783987574090392012176562600550144885565709822164722304408771214923078090216303447672907406306494260347265557611811281654313383497\",\n       \"-105448359738523054755775683879539460376932545724741416465977687344195271654833613392218097960778272870252224864512166575087075095234145517359783987574090392012176562600550144885565709822164722304408771214923078090216303447672907406306494260347265557611811281654313383497\",\n       \"427047\",\n       \"-427047\",\n       \"81856543863229949865307411717645038275510945758537814749232160844289351485471852172626662270166132792505150910334705532703104971400349296170150117058939300885252778996956\",\n       \"-81856543863229949865307411717645038275510945758537814749232160844289351485471852172626662270166132792505150910334705532703104971400349296170150117058939300885252778996956\",\n       \"1157793815124456718861516590400363995161915570086903147642852686851669744820819994596924330213342515606147016987948857909\",\n       \"-1157793815124456718861516590400363995161915570086903147642852686851669744820819994596924330213342515606147016987948857909\",\n       \"940896637988538567397975357071445094467989790092928263312671948706628805236843480432542018263224679720038185333011214261501267693681777878339707753984890375587248023646920869739576148750778030\",\n       \"-940896637988538567397975357071445094467989790092928263312671948706628805236843480432542018263224679720038185333011214261501267693681777878339707753984890375587248023646920869739576148750778030\",\n       \"1277092697774915455425325818506548913089778045288703511320462361515661192684081707471069783269077123507880082821996357021946680618631451261991566032521034200533398597806696743013088727321199529921154950435385831032453193119895011784079743410\",\n       \"-1277092697774915455425325818506548913089778045288703511320462361515661192684081707471069783269077123507880082821996357021946680618631451261991566032521034200533398597806696743013088727321199529921154950435385831032453193119895011784079743410\",\n       \"12484594365439504824667126116411560379532608011162188261784732952579595718551939216912931261112627180909253846258363935011877417495984302385508560070358584377699655038250487243650598\",\n       \"-12484594365439504824667126116411560379532608011162188261784732952579595718551939216912931261112627180909253846258363935011877417495984302385508560070358584377699655038250487243650598\",\n       \"1741383885783666349682975645698617932237500743715841391107227784204719855585223522172382200426887024717924383874873388819696857115564677905327552504\",\n       \"-1741383885783666349682975645698617932237500743715841391107227784204719855585223522172382200426887024717924383874873388819696857115564677905327552504\",\n       \"9368096919796958094889245340222417626105947858557433047800723019\",\n       \"-9368096919796958094889245340222417626105947858557433047800723019\",\n       \"76669478098694609561491577319843969528266563067895013521486786451595735010640930020326448743208375914951894083260394091483935932234283855098968632145970697415601093343\",\n       \"-76669478098694609561491577319843969528266563067895013521486786451595735010640930020326448743208375914951894083260394091483935932234283855098968632145970697415601093343\",\n       \"1876639712516985144893922794716264029310990922149953750634405350881578456885688177463809312620\",\n       \"-1876639712516985144893922794716264029310990922149953750634405350881578456885688177463809312620\",\n       \"186077\",\n       \"-186077\",\n       \"24038469015057796648084289920894727399732658423825146209930020877671076098132117966877846149087015358546337692428012385515366055633105998821389203\",\n       \"-24038469015057796648084289920894727399732658423825146209930020877671076098132117966877846149087015358546337692428012385515366055633105998821389203\",\n       \"20641259550745643346234485579665129143463532482322387615585139677830682894079763990366000612134891527828252798370386444670430513385825695220928137556290078834398139256712344468615779923734232143070994661634892049806652900001420233970754048793898042171067992448201191787158435561\",\n       \"-20641259550745643346234485579665129143463532482322387615585139677830682894079763990366000612134891527828252798370386444670430513385825695220928137556290078834398139256712344468615779923734232143070994661634892049806652900001420233970754048793898042171067992448201191787158435561\",\n       \"90558282393161622936261650596857143828421884875124973816361813844395166\",\n       \"-90558282393161622936261650596857143828421884875124973816361813844395166\",\n       \"893374152282726891992085958120127485743572202276100990922171\",\n       \"-893374152282726891992085958120127485743572202276100990922171\",\n       \"104601387324033669002784175389856736439866138446091862232274237956270168921868535320405566731385430625654533746364405250312870593863224985439702639684142355791792905233795969344981850689932028254291726954427057743196839190399880526778270712454970430735459654847\",\n       \"-104601387324033669002784175389856736439866138446091862232274237956270168921868535320405566731385430625654533746364405250312870593863224985439702639684142355791792905233795969344981850689932028254291726954427057743196839190399880526778270712454970430735459654847\",\n       \"1100640547822452822259608780637373041065326977053681954192776181527618577050122442455730624660403304296015412329954372289398853654524721225006003581004995451247487399511260858844108588935136691954558538445962684147337611140312567681054887671734241832035049841922672004195071\",\n       \"-1100640547822452822259608780637373041065326977053681954192776181527618577050122442455730624660403304296015412329954372289398853654524721225006003581004995451247487399511260858844108588935136691954558538445962684147337611140312567681054887671734241832035049841922672004195071\",\n       \"2967167885422023119778255262377939967247041745814218496240360\",\n       \"-2967167885422023119778255262377939967247041745814218496240360\",\n       \"2766027933722171046554231292404911532459570636916540872038932307272865118512724883948205112046666709093487559219830075352753072061667201\",\n       \"-2766027933722171046554231292404911532459570636916540872038932307272865118512724883948205112046666709093487559219830075352753072061667201\",\n       \"1003655344057107767912014692725976261732681876044961311820943946784371\",\n       \"-1003655344057107767912014692725976261732681876044961311820943946784371\",\n       \"21900502732037517315370094764239443613058564433\",\n       \"-21900502732037517315370094764239443613058564433\",\n       \"45583003657081227658306304711498324162428223935090104\",\n       \"-45583003657081227658306304711498324162428223935090104\",\n       \"204245432840569041148483982796093177932369679988233999329901019356075995960\",\n       \"-204245432840569041148483982796093177932369679988233999329901019356075995960\",\n       \"54884247902140437035368361407902527545416356458607442580170745253262030\",\n       \"-54884247902140437035368361407902527545416356458607442580170745253262030\",\n       \"5334518155628744158007803052398794311169463840470474113725097881874982744596886959948255678621385420985539108742608260405936297075345765000664456806209794363451383928857878909914356480954702762980348813177584480927161733854397043441077512115118243\",\n       \"-5334518155628744158007803052398794311169463840470474113725097881874982744596886959948255678621385420985539108742608260405936297075345765000664456806209794363451383928857878909914356480954702762980348813177584480927161733854397043441077512115118243\",\n       \"586483295964769639990961973863221490702912450472376751506581704396550840803536849728609056194074161983174132325139036388003751640146943\",\n       \"-586483295964769639990961973863221490702912450472376751506581704396550840803536849728609056194074161983174132325139036388003751640146943\",\n       \"5160489070412055213478248749143153314027313193274772183541029614946527505345515388990899156035333461408310459047357741425430914259324755065994103\",\n       \"-5160489070412055213478248749143153314027313193274772183541029614946527505345515388990899156035333461408310459047357741425430914259324755065994103\",\n       \"2027629455583867858236950998133711110883394281732352207813586603417947074456218393483520509566027\",\n       \"-2027629455583867858236950998133711110883394281732352207813586603417947074456218393483520509566027\",\n       \"5188557124098846103707325218\",\n       \"-5188557124098846103707325218\",\n       \"400020709349724273938863924454731823809936035083490166372176005731818513778095755824243823423942457408986667759613017098976884623086030827980554523509430858361367786615095252152639811158705182507617454882805400018345969632806081496172562211701111188286396198492796040003060705842273291\",\n       \"-400020709349724273938863924454731823809936035083490166372176005731818513778095755824243823423942457408986667759613017098976884623086030827980554523509430858361367786615095252152639811158705182507617454882805400018345969632806081496172562211701111188286396198492796040003060705842273291\",\n       \"5077741618469045793277646564358992920960476333244601450034145830501181786188670069707891777075377020328052369395749044352605314330803964782636667529924732654192256597972743806214879074858492363595605\",\n       \"-5077741618469045793277646564358992920960476333244601450034145830501181786188670069707891777075377020328052369395749044352605314330803964782636667529924732654192256597972743806214879074858492363595605\",\n       \"7696189909584112429236607890412659528293987626026266720440261172438548134466224807156242301070086176781584925647653568383958946454001\",\n       \"-7696189909584112429236607890412659528293987626026266720440261172438548134466224807156242301070086176781584925647653568383958946454001\",\n       \"417308020029030078568441933098093721107857721939799845259428192907357371830765301672126412079562811182564973992528737210195074535804805307396531464692210817793443042424312992541689337630019211372\",\n       \"-417308020029030078568441933098093721107857721939799845259428192907357371830765301672126412079562811182564973992528737210195074535804805307396531464692210817793443042424312992541689337630019211372\",\n       \"1322555438304138854190608504305314090997872332525802468309\",\n       \"-1322555438304138854190608504305314090997872332525802468309\",\n       \"2243252463390097730206022598597097545362441865345445435367208364900608574068701725911900977005694987837525981666534993121316833074810732688679185645071871012387337549509711648733018\",\n       \"-2243252463390097730206022598597097545362441865345445435367208364900608574068701725911900977005694987837525981666534993121316833074810732688679185645071871012387337549509711648733018\",\n       \"996999631246356886686476319402220462702895536107891846414650166937411337235327374798687258137003461594493394303654723633588050290355700009203863700819430055925538137094125943576776423062708423296431824562515335853105906638174471031706521164070138118239692600817313403027773040755\",\n       \"-996999631246356886686476319402220462702895536107891846414650166937411337235327374798687258137003461594493394303654723633588050290355700009203863700819430055925538137094125943576776423062708423296431824562515335853105906638174471031706521164070138118239692600817313403027773040755\",\n       \"7407232727584141857860413969133193973271286288996885370643743601041844697247425570485073230177615935516189249509933008589795827697527731537095440446937896691012576063103682886965547257404970422133160836803032660735755375228\",\n       \"-7407232727584141857860413969133193973271286288996885370643743601041844697247425570485073230177615935516189249509933008589795827697527731537095440446937896691012576063103682886965547257404970422133160836803032660735755375228\",\n       \"66507856432274251794176455954413617080912111625650403908424515766595169565610373272262880697471290673940957493067336542878127434500093321175322023848113318710961186458831481208336221616883931621941707175292010516439902743884847403671155360181449053131615233540637713255704186616742945621336873834200241\",\n       \"-66507856432274251794176455954413617080912111625650403908424515766595169565610373272262880697471290673940957493067336542878127434500093321175322023848113318710961186458831481208336221616883931621941707175292010516439902743884847403671155360181449053131615233540637713255704186616742945621336873834200241\",\n       \"31961863828553380988033812855214593359459211110640445946699728653449149746905536006308298520671497324063634041\",\n       \"-31961863828553380988033812855214593359459211110640445946699728653449149746905536006308298520671497324063634041\",\n       \"119618377523937755424839832529346904290447125277702998330825686745624714380165535983701718800753406524499580430492483313401840673306022\",\n       \"-119618377523937755424839832529346904290447125277702998330825686745624714380165535983701718800753406524499580430492483313401840673306022\",\n       \"405681915481957710524110670648088015005969944212725894176433228902381563426021784100141533714164168640878972504794623170560976727288628780986689105062652396339731589340681696758070055865849332874664598654305386\",\n       \"-405681915481957710524110670648088015005969944212725894176433228902381563426021784100141533714164168640878972504794623170560976727288628780986689105062652396339731589340681696758070055865849332874664598654305386\",\n       \"80071205989351736846133464673563483\",\n       \"-80071205989351736846133464673563483\",\n       \"9700773864531435625616214899914065324460851600463291968860331922457988802290698665249481817160070262860115617949877440060186269123630022169856579023685715276196199558700467573542360702057439871151548632003937134635666\",\n       \"-9700773864531435625616214899914065324460851600463291968860331922457988802290698665249481817160070262860115617949877440060186269123630022169856579023685715276196199558700467573542360702057439871151548632003937134635666\",\n       \"64944106993602113652248278796057650905995695388886180354923002182559697540323513\",\n       \"-64944106993602113652248278796057650905995695388886180354923002182559697540323513\",\n       \"37929576313535611121803978435959309812321783154717\",\n       \"-37929576313535611121803978435959309812321783154717\",\n       \"1201000338412478811264460901269015663629403940922465995711563366282532392888117164309460791962587700786925689531323402454933712\",\n       \"-1201000338412478811264460901269015663629403940922465995711563366282532392888117164309460791962587700786925689531323402454933712\",\n       \"470447114867440006531646544662395180489380\",\n       \"-470447114867440006531646544662395180489380\",\n       \"1886414975033222890759454788368278722523410826550821944244006726465034055937087351501071112805393425149681091697659539390880213755450593178650888546158680682861726300055346238147353584\",\n       \"-1886414975033222890759454788368278722523410826550821944244006726465034055937087351501071112805393425149681091697659539390880213755450593178650888546158680682861726300055346238147353584\",\n       \"4664892726074011412424061191534682518434402852534244066439859284421669515547644494221267860310050082413903960265959420616932209365599069348\",\n       \"-4664892726074011412424061191534682518434402852534244066439859284421669515547644494221267860310050082413903960265959420616932209365599069348\",\n       \"28780798756024002725983431800204693077146606485161761312577563898465001036018344\",\n       \"-28780798756024002725983431800204693077146606485161761312577563898465001036018344\",\n       \"32330329650876\",\n       \"-32330329650876\",\n       \"2119979291121167235646126537631495326938621591198105160016067466298282031395514388037592761773940160529230271536093864046314956321286102399202685013097514391108059946817681956440747156573\",\n       \"-2119979291121167235646126537631495326938621591198105160016067466298282031395514388037592761773940160529230271536093864046314956321286102399202685013097514391108059946817681956440747156573\",\n       \"263699852555513851494126759556555000194041870735492675256368970869569739794241286439438865360257448383332427174288750874993061959293095843277366404592822430413842608440069138162513296663098194916628650623285377787520407274835441660863529425698257\",\n       \"-263699852555513851494126759556555000194041870735492675256368970869569739794241286439438865360257448383332427174288750874993061959293095843277366404592822430413842608440069138162513296663098194916628650623285377787520407274835441660863529425698257\",\n       \"1128694221447083514833565943172494061961392351570236661606778701297263608082693757967704225149730415407045688293665284383612835316877341572601586213504558102647155013466806252198360829785603030320627697854353131933390896\",\n       \"-1128694221447083514833565943172494061961392351570236661606778701297263608082693757967704225149730415407045688293665284383612835316877341572601586213504558102647155013466806252198360829785603030320627697854353131933390896\",\n       \"6916983731776108089130775823204431120044571113273264\",\n       \"-6916983731776108089130775823204431120044571113273264\",\n       \"75914457793044064895413508037682032379902701971013411488690441608545\",\n       \"-75914457793044064895413508037682032379902701971013411488690441608545\",\n       \"8879499247714081140479921556021160510154213025912153490299817518668111141293995912780879974244590421191162074944570118497100570991099380592606670090324723096261264086252974733149488230484359814997329229447712203652808121303397231512080257394400660537777330\",\n       \"-8879499247714081140479921556021160510154213025912153490299817518668111141293995912780879974244590421191162074944570118497100570991099380592606670090324723096261264086252974733149488230484359814997329229447712203652808121303397231512080257394400660537777330\",\n       \"1724506383335075569722951957439066815\",\n       \"-1724506383335075569722951957439066815\",\n       \"1194371342067583821224146035467746385145120448082902327311395191487125759843115454058224224089457130\",\n       \"-1194371342067583821224146035467746385145120448082902327311395191487125759843115454058224224089457130\",\n       \"116571209611185337284731713897921002952811284109399364843701582086430272601727355870457693093\",\n       \"-116571209611185337284731713897921002952811284109399364843701582086430272601727355870457693093\",\n       \"26168929789567416417896877953711683735315284288420053745760833960409035809279614614583672230970848586995471196762264833662013726559369765619103011658619869727814614782931489481458661981043479676591818357\",\n       \"-26168929789567416417896877953711683735315284288420053745760833960409035809279614614583672230970848586995471196762264833662013726559369765619103011658619869727814614782931489481458661981043479676591818357\",\n       \"243012047985288247713378637185988647187985010392388570351653505841125573018162558460717652828862937\",\n       \"-243012047985288247713378637185988647187985010392388570351653505841125573018162558460717652828862937\",\n       \"10664054546419657059895154308389295209775305216580625182685797954089483388356503442301133821162999463846286618424679215827037042324\",\n       \"-10664054546419657059895154308389295209775305216580625182685797954089483388356503442301133821162999463846286618424679215827037042324\",\n       \"93382430984727342024648229617198660330774557968214720265565362040755873830899272200516094884487181897372100083086702655979998495443\",\n       \"-93382430984727342024648229617198660330774557968214720265565362040755873830899272200516094884487181897372100083086702655979998495443\",\n       \"13126062810625043063456380164790384012915764511630796458248365510538114092330596186281347044586364215270683612292866613952971844005196715563009674494624957852022027173471052976928718844001264455268592601375542242160924315548654836823549859553\",\n       \"-13126062810625043063456380164790384012915764511630796458248365510538114092330596186281347044586364215270683612292866613952971844005196715563009674494624957852022027173471052976928718844001264455268592601375542242160924315548654836823549859553\",\n       \"9368582362765814557187196024001227849888168077472266659772600971697428366492708926906258905590833059706396684592884687526358204703256054330603971127944678906\",\n       \"-9368582362765814557187196024001227849888168077472266659772600971697428366492708926906258905590833059706396684592884687526358204703256054330603971127944678906\",\n       \"278701771665221100457912961846034172\",\n       \"-278701771665221100457912961846034172\",\n       \"382464310254920012603200760\",\n       \"-382464310254920012603200760\",\n       \"1086701652931645659413181704075891369501487115000150234704055924790606399915277424771761502385407750848874457084738431566772206432850777390818546802908541311070886519070558468667864533850452989704316665227997074954119733405730362633188789872620053510199052652185571293239445061650299573526583634686290646340\",\n       \"-1086701652931645659413181704075891369501487115000150234704055924790606399915277424771761502385407750848874457084738431566772206432850777390818546802908541311070886519070558468667864533850452989704316665227997074954119733405730362633188789872620053510199052652185571293239445061650299573526583634686290646340\",\n       \"1436027919103852779047018224513001412434295916624702899496423156978055321701822379\",\n       \"-1436027919103852779047018224513001412434295916624702899496423156978055321701822379\",\n       \"358956740433261819154697401028765647885314537021358004573\",\n       \"-358956740433261819154697401028765647885314537021358004573\",\n       \"2570919810686260443090976956907911580117431201667893432876299852175711324820817103455438469322058313607578962386364736310503021461418759938196980029731001153192509640082331671491566785848363799371983266719541295357316341488191889371987260280114237\",\n       \"-2570919810686260443090976956907911580117431201667893432876299852175711324820817103455438469322058313607578962386364736310503021461418759938196980029731001153192509640082331671491566785848363799371983266719541295357316341488191889371987260280114237\",\n       \"25162923422743354542149586612896418135445747897968173426132346622460254031452425686287824478617146278670264713886155228992283141903843330748647605337845897726364270262270221388553425764365596646869122752625837519793121116201637138123589\",\n       \"-25162923422743354542149586612896418135445747897968173426132346622460254031452425686287824478617146278670264713886155228992283141903843330748647605337845897726364270262270221388553425764365596646869122752625837519793121116201637138123589\",\n       \"4278027626\",\n       \"-4278027626\",\n       \"13701895078474585475247137503379489809369496012756504256009512583880126487325483060\",\n       \"-13701895078474585475247137503379489809369496012756504256009512583880126487325483060\",\n       \"840786904525379769789300537711189060152537247097220818494507832789559514433741881148404020369408737305833463880040532404710981950433015449671738772090021173041178316879389133142755654332186395733035047829330146580877246938698632854141466195209370012956133251007728880713807067719044277\",\n       \"-840786904525379769789300537711189060152537247097220818494507832789559514433741881148404020369408737305833463880040532404710981950433015449671738772090021173041178316879389133142755654332186395733035047829330146580877246938698632854141466195209370012956133251007728880713807067719044277\",\n       \"3276292788321967735809171244238550320799741743618059640716169790896705284371\",\n       \"-3276292788321967735809171244238550320799741743618059640716169790896705284371\",\n       \"1444750318330952168038880813831551223482419869563017466378766743222046493652050967605113492030925684948366811229446235163057029451862026449099533578455062305802501669339640305034074716552601620379378463996993533643594750826540\",\n       \"-1444750318330952168038880813831551223482419869563017466378766743222046493652050967605113492030925684948366811229446235163057029451862026449099533578455062305802501669339640305034074716552601620379378463996993533643594750826540\",\n       \"24086541858702055427502392901637\",\n       \"-24086541858702055427502392901637\",\n       \"4330081338691920762224608526717824389301173480290111106078901689480766861452007892469366598230052182293662205113692558414456231710116801557663552676919\",\n       \"-4330081338691920762224608526717824389301173480290111106078901689480766861452007892469366598230052182293662205113692558414456231710116801557663552676919\",\n       \"27418448940760548112970686808757044592831257648000991603843244426565505080207854209562533723933529598541150\",\n       \"-27418448940760548112970686808757044592831257648000991603843244426565505080207854209562533723933529598541150\",\n       \"4864349348505372641735591623253935562079434294533303015906939805788562228545435455999490952132421630107381486091394263343039603335970384360527032450993718152333512135859319365168\",\n       \"-4864349348505372641735591623253935562079434294533303015906939805788562228545435455999490952132421630107381486091394263343039603335970384360527032450993718152333512135859319365168\",\n       \"1626611771502100547320818336906281142864525046004643066115702536679123387159152005305066\",\n       \"-1626611771502100547320818336906281142864525046004643066115702536679123387159152005305066\",\n       \"14293419224795219525714860242008460020503397376158988250120766700936504062\",\n       \"-14293419224795219525714860242008460020503397376158988250120766700936504062\",\n       \"8260753138917023233566421292298962764237807151943318525543970544500632597376493524337437826032865212814429643010352970402898369401423576606526232369458199913160215970566401517084565439231237176671986172844275163759328663201716196906130863901168073596480102005930047541965611641872232312988889482629\",\n       \"-8260753138917023233566421292298962764237807151943318525543970544500632597376493524337437826032865212814429643010352970402898369401423576606526232369458199913160215970566401517084565439231237176671986172844275163759328663201716196906130863901168073596480102005930047541965611641872232312988889482629\",\n       \"5277758874516137277732773354886538661032533122667342258245153872341673598212237223809452902009488931372563068631458175710208259076234089320690\",\n       \"-5277758874516137277732773354886538661032533122667342258245153872341673598212237223809452902009488931372563068631458175710208259076234089320690\",\n       \"1604105217156493424796219158328988017738562338480346273566670218046\",\n       \"-1604105217156493424796219158328988017738562338480346273566670218046\",\n   };\n\n   boost::filesystem::ifstream is(root / \"cpp_int1024_serial64.txt\");\n   std::cout << \"Testing cpp_int1024_serial64.txt with T=\" << typeid(T).name() << std::endl;\n   //is.peek();\n   BOOST_CHECK(is.good());\n   boost::archive::text_iarchive ia(is);\n   for (unsigned i = 0; i < sizeof(text_array) / sizeof(text_array[0]); ++i)\n   {\n#ifndef BOOST_NO_EXCEPTIONS\n      try\n      {\n#endif\n         T val;\n         ia >> val;\n         BOOST_CHECK_EQUAL(val, T(text_array[i]));\n#ifndef BOOST_NO_EXCEPTIONS\n      }\n      catch (const boost::exception& e)\n      {\n         std::cout << \"Caught boost::exception with:\\n\";\n         std::cout << diagnostic_information(e);\n      }\n      catch (const std::exception& e)\n      {\n         std::cout << \"Caught std::exception with:\\n\";\n         std::cout << e.what() << std::endl;\n      }\n#endif\n   }\n\n   boost::filesystem::ifstream is2(root / \"cpp_int1024_serial32.txt\");\n   std::cout << \"Testing cpp_int1024_serial32.txt with T=\" << typeid(T).name() << std::endl;\n   //is2.peek();\n   BOOST_CHECK(is2.good());\n   boost::archive::text_iarchive ia2(is2);\n   for (unsigned i = 0; i < sizeof(text_array) / sizeof(text_array[0]); ++i)\n   {\n#ifndef BOOST_NO_EXCEPTIONS\n      try\n      {\n#endif\n         T val;\n         ia2 >> val;\n         BOOST_CHECK_EQUAL(val, T(text_array[i]));\n#ifndef BOOST_NO_EXCEPTIONS\n      }\n      catch (const boost::exception& e)\n      {\n         std::cout << \"Caught boost::exception with:\\n\";\n         std::cout << diagnostic_information(e);\n      }\n      catch (const std::exception& e)\n      {\n         std::cout << \"Caught std::exception with:\\n\";\n         std::cout << e.what() << std::endl;\n      }\n#endif\n   }\n}\n\nint main(int argc, char const* argv[])\n{\n   if (argc == 2)\n   {\n      root = argv[1];\n      std::cout << \"Setting root directory to \" << argv[1] << std::endl;\n   }\n   using namespace boost::multiprecision;\n   test64<cpp_int>();\n   test64<number<cpp_int_backend<64, 64> > >();\n   test128<cpp_int>();\n   test128<number<cpp_int_backend<128, 128> > >();\n   test1024<cpp_int>();\n   test1024<number<cpp_int_backend<1024, 1024> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cpp_int_import_export.cpp",
    "content": "// Copyright John Maddock 2015.\n\n// Use, modification and distribution are subject to the\n// Boost Software License, Version 1.0.\n// (See accompanying file LICENSE_1_0.txt\n// or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include <boost/algorithm/string/case_conv.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include \"test.hpp\"\n#include <iostream>\n#include <iomanip>\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\ntemplate <class T>\nstruct unchecked_type\n{\n   typedef T type;\n};\n\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct unchecked_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::unchecked, Allocator>, ExpressionTemplates> type;\n};\n\ntemplate <class T>\nT generate_random()\n{\n   typedef typename unchecked_type<T>::type unchecked_T;\n\n   static const unsigned limbs = std::numeric_limits<T>::is_specialized && std::numeric_limits<T>::is_bounded ? std::numeric_limits<T>::digits / std::numeric_limits<unsigned>::digits + 3 : 20;\n\n   static boost::random::uniform_int_distribution<unsigned> ui(0, limbs);\n   static boost::random::mt19937                            gen;\n   unchecked_T                                              val = gen();\n   unsigned                                                 lim = ui(gen);\n   for (unsigned i = 0; i < lim; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   return val;\n}\n\ntemplate <class T>\nvoid test_round_trip_neg(T val, const std::integral_constant<bool, true>&)\n{\n   // Try some negative values:\n   std::vector<unsigned char> cv;\n   T                          newval;\n   val = -val;\n   export_bits(val, std::back_inserter(cv), 8, false);\n   import_bits(newval, cv.begin(), cv.end(), 8, false);\n   BOOST_CHECK_EQUAL(-val, newval);\n}\n\ntemplate <class T>\nvoid test_round_trip_neg(const T&, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class T>\nvoid test_round_trip(T val)\n{\n   std::vector<unsigned char> cv;\n   export_bits(val, std::back_inserter(cv), 8);\n   T newval;\n   import_bits(newval, cv.begin(), cv.end());\n   BOOST_CHECK_EQUAL(val, newval);\n   // Should get the same value if we reverse the bytes:\n   std::reverse(cv.begin(), cv.end());\n   newval = 0;\n   import_bits(newval, cv.begin(), cv.end(), 8, false);\n   BOOST_CHECK_EQUAL(val, newval);\n   // Also try importing via pointers as these may memcpy:\n   newval = 0;\n   import_bits(newval, &cv[0], &cv[0] + cv.size(), 8, false);\n   BOOST_CHECK_EQUAL(val, newval);\n\n   cv.clear();\n   export_bits(val, std::back_inserter(cv), 8, false);\n   import_bits(newval, cv.begin(), cv.end(), 8, false);\n   BOOST_CHECK_EQUAL(val, newval);\n   std::reverse(cv.begin(), cv.end());\n   newval = 0;\n   import_bits(newval, cv.begin(), cv.end(), 8, true);\n   BOOST_CHECK_EQUAL(val, newval);\n\n   std::vector<std::uintmax_t> bv;\n   export_bits(val, std::back_inserter(bv), std::numeric_limits<std::uintmax_t>::digits);\n   import_bits(newval, bv.begin(), bv.end());\n   BOOST_CHECK_EQUAL(val, newval);\n   // Should get the same value if we reverse the values:\n   std::reverse(bv.begin(), bv.end());\n   newval = 0;\n   import_bits(newval, bv.begin(), bv.end(), std::numeric_limits<std::uintmax_t>::digits, false);\n   BOOST_CHECK_EQUAL(val, newval);\n   // Also try importing via pointers as these may memcpy:\n   newval = 0;\n   import_bits(newval, &bv[0], &bv[0] + bv.size(), std::numeric_limits<std::uintmax_t>::digits, false);\n   BOOST_CHECK_EQUAL(val, newval);\n\n   bv.clear();\n   export_bits(val, std::back_inserter(bv), std::numeric_limits<std::uintmax_t>::digits, false);\n   import_bits(newval, bv.begin(), bv.end(), std::numeric_limits<std::uintmax_t>::digits, false);\n   BOOST_CHECK_EQUAL(val, newval);\n   //\n   // Try with an unconventional number of bits, to model some machine with guard bits:\n   //\n   bv.clear();\n   export_bits(val, std::back_inserter(bv), std::numeric_limits<std::uintmax_t>::digits - 3);\n   import_bits(newval, bv.begin(), bv.end(), std::numeric_limits<std::uintmax_t>::digits - 3);\n   BOOST_CHECK_EQUAL(val, newval);\n\n   bv.clear();\n   export_bits(val, std::back_inserter(bv), std::numeric_limits<std::uintmax_t>::digits - 3, false);\n   import_bits(newval, bv.begin(), bv.end(), std::numeric_limits<std::uintmax_t>::digits - 3, false);\n   BOOST_CHECK_EQUAL(val, newval);\n\n   cv.clear();\n   export_bits(val, std::back_inserter(cv), 6);\n   import_bits(newval, cv.begin(), cv.end(), 6);\n   BOOST_CHECK_EQUAL(val, newval);\n\n   cv.clear();\n   export_bits(val, std::back_inserter(cv), 6, false);\n   import_bits(newval, cv.begin(), cv.end(), 6, false);\n   BOOST_CHECK_EQUAL(val, newval);\n\n   test_round_trip_neg(val, std::integral_constant<bool, std::numeric_limits<T>::is_signed>());\n}\n\ntemplate <class T>\nvoid test_round_trip()\n{\n   std::cout << std::hex;\n   std::cerr << std::hex;\n   for (unsigned i = 0; i < 1000; ++i)\n   {\n      T val = generate_random<T>();\n      test_round_trip(val);\n   }\n   //\n   // Bug cases.\n   // See https://github.com/boostorg/multiprecision/issues/21\n   T bug(1);\n   bug << std::numeric_limits<T>::digits - 1;\n   --bug;\n   test_round_trip(bug);\n}\n\nint main()\n{\n   test_round_trip<boost::multiprecision::cpp_int>();\n   test_round_trip<boost::multiprecision::checked_int1024_t>();\n   test_round_trip<boost::multiprecision::checked_uint512_t>();\n   test_round_trip<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::unsigned_magnitude, boost::multiprecision::checked, void> > >();\n   test_round_trip<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<23, 23, boost::multiprecision::unsigned_magnitude, boost::multiprecision::checked, void> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cpp_int_karatsuba.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//\n// Compare arithmetic results using fixed_int to GMP results.\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n//\n// This ensures all our code gets tested, even though it may\n// not be the fastest configuration in normal use:\n//\n#define BOOST_MP_USE_LIMB_SHIFT\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include \"timer.hpp\"\n#include \"test.hpp\"\n\n#ifdef _MSC_VER\n#pragma warning(disable : 4127) //  Conditional expression is constant\n#endif\n\n#ifndef TEST\n#define TEST 0\n#endif\n\ntemplate <class T>\nT generate_random(unsigned bits_wanted)\n{\n   static boost::random::mt19937               gen;\n   typedef boost::random::mt19937::result_type random_type;\n\n   T        max_val;\n   unsigned digits;\n   if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits))\n   {\n      max_val = (std::numeric_limits<T>::max)();\n      digits  = std::numeric_limits<T>::digits;\n   }\n   else\n   {\n      max_val = T(1) << bits_wanted;\n      digits  = bits_wanted;\n   }\n\n   unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n   while ((random_type(1) << bits_per_r_val) > (gen.max)())\n      --bits_per_r_val;\n\n   unsigned terms_needed = digits / bits_per_r_val + 1;\n\n   T val = 0;\n   for (unsigned i = 0; i < terms_needed; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   val %= max_val;\n   return val;\n}\n\ntemplate <class T>\nstruct is_checked_cpp_int : public std::integral_constant<bool, false>\n{};\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>\nstruct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public std::integral_constant<bool, true>\n{};\n\ntemplate <class N>\ntypename std::enable_if<boost::multiprecision::backends::is_fixed_precision<typename N::backend_type>::value && !is_checked_cpp_int<N>::value>::type test(const N&)\n{\n   using namespace boost::multiprecision;\n\n   static unsigned last_error_count = 0;\n\n   timer tim;\n\n   do\n   {\n      // Test modular arithmetic by filling all the bits of our test type:\n      mpz_int f = generate_random<mpz_int>(std::numeric_limits<N>::digits + 2);\n      mpz_int g = generate_random<mpz_int>(std::numeric_limits<N>::digits + 2);\n      mpz_int mask(1);\n      mask <<= std::numeric_limits<N>::digits;\n      --mask;\n      f &= mask;\n      g &= mask;\n      mpz_int r = (f * g) & mask;\n\n      N f1(f);\n      N g1(g);\n      N r1 = f1 * g1;\n      BOOST_CHECK_EQUAL(r1.str(), r.str());\n\n      if (last_error_count != (unsigned)boost::detail::test_errors())\n      {\n         last_error_count = boost::detail::test_errors();\n         std::cout << std::hex << std::showbase;\n         std::cout << f1 << std::endl;\n         std::cout << f << std::endl;\n         std::cout << g1 << std::endl;\n         std::cout << g << std::endl;\n         std::cout << r1 << std::endl;\n         std::cout << r << std::endl;\n      }\n\n      static boost::random::mt19937             gen;\n      boost::random::uniform_int_distribution<> d(12, std::numeric_limits<N>::digits);\n      f = generate_random<mpz_int>(d(gen));\n      g = generate_random<mpz_int>(d(gen));\n      r = (f * g) & mask;\n\n      f1 = N(f);\n      g1 = N(g);\n      r1 = f1 * g1;\n      BOOST_CHECK_EQUAL(r1.str(), r.str());\n\n      if (last_error_count != (unsigned)boost::detail::test_errors())\n      {\n         last_error_count = boost::detail::test_errors();\n         std::cout << std::hex << std::showbase;\n         std::cout << f1 << std::endl;\n         std::cout << f << std::endl;\n         std::cout << g1 << std::endl;\n         std::cout << g << std::endl;\n         std::cout << r1 << std::endl;\n         std::cout << r << std::endl;\n      }\n\n#ifndef CI_SUPPRESS_KNOWN_ISSUES\n      if (tim.elapsed() > 200)\n#else\n      if (tim.elapsed() > 25)\n#endif\n      {\n         std::cout << \"Timeout reached, aborting tests now....\\n\";\n         break;\n      }\n\n   } while (true);\n   //\n   // Special cases:\n   //\n   mpz_int mask;\n   if (std::numeric_limits<N>::is_bounded)\n      mask = mpz_int((std::numeric_limits<N>::max)());\n   mpz_int a, b;\n   N       x, y;\n\n   unsigned upper_limit = std::numeric_limits<N>::is_bounded ? std::numeric_limits<N>::digits - 1 : 8192 * 2;\n   for (unsigned i = 1024; i < upper_limit; i *= 2)\n   {\n      a = 1;\n      a <<= i;\n      --a;\n      x = 1;\n      x <<= i;\n      --x;\n\n      b = a * a;\n      if (std::numeric_limits<N>::is_bounded)\n         b &= mask;\n      y = x * x;\n\n      BOOST_CHECK_EQUAL(y.str(), b.str());\n\n      if (last_error_count != (unsigned)boost::detail::test_errors())\n      {\n         last_error_count = boost::detail::test_errors();\n         std::cout << std::hex << std::showbase;\n         std::cout << a << std::endl;\n         std::cout << x << std::endl;\n         std::cout << b << std::endl;\n         std::cout << y << std::endl;\n      }\n   }\n}\ntemplate <class N>\ntypename std::enable_if<!(boost::multiprecision::backends::is_fixed_precision<typename N::backend_type>::value && !is_checked_cpp_int<N>::value)>::type test(const N&)\n{\n   using namespace boost::multiprecision;\n\n   static unsigned last_error_count = 0;\n\n   timer tim;\n\n   mpz_int mask;\n   if (std::numeric_limits<N>::is_bounded)\n      mask = mpz_int((std::numeric_limits<N>::max)());\n   do\n   {\n      // Test modular arithmetic by filling all the bits of our test type:\n      static boost::random::mt19937             gen;\n      boost::random::uniform_int_distribution<> d(12, std::numeric_limits<N>::is_bounded ? std::numeric_limits<N>::digits : 100000);\n      mpz_int                                   f = generate_random<mpz_int>(d(gen));\n      mpz_int                                   g = generate_random<mpz_int>(d(gen));\n      mpz_int                                   r = f * g;\n      if (std::numeric_limits<N>::is_bounded)\n         r &= mask;\n\n      N f1(f);\n      N g1(g);\n      N r1 = f1 * g1;\n      BOOST_CHECK_EQUAL(r1.str(), r.str());\n\n      if (last_error_count != (unsigned)boost::detail::test_errors())\n      {\n         last_error_count = boost::detail::test_errors();\n         std::cout << std::hex << std::showbase;\n         std::cout << f1 << std::endl;\n         std::cout << f << std::endl;\n         std::cout << g1 << std::endl;\n         std::cout << g << std::endl;\n         std::cout << r1 << std::endl;\n         std::cout << r << std::endl;\n      }\n\n#ifndef CI_SUPPRESS_KNOWN_ISSUES\n      if (tim.elapsed() > 200)\n#else\n      if (tim.elapsed() > 25)\n#endif\n      {\n         std::cout << \"Timeout reached, aborting tests now....\\n\";\n         break;\n      }\n\n   } while (true);\n   //\n   // Special cases:\n   //\n   mpz_int a, b;\n   N       x, y;\n\n   unsigned upper_limit = std::numeric_limits<N>::is_bounded ? std::numeric_limits<N>::digits - 1 : 8192 * 2;\n   for (unsigned i = 1024; i < upper_limit; i *= 2)\n   {\n      a = 1;\n      a <<= i;\n      --a;\n      x = 1;\n      x <<= i;\n      --x;\n\n      b = a * a;\n      if (std::numeric_limits<N>::is_bounded)\n         b &= mask;\n      y = x * x;\n\n      BOOST_CHECK_EQUAL(y.str(), b.str());\n\n      if (last_error_count != (unsigned)boost::detail::test_errors())\n      {\n         last_error_count = boost::detail::test_errors();\n         std::cout << std::hex << std::showbase;\n         std::cout << a << std::endl;\n         std::cout << x << std::endl;\n         std::cout << b << std::endl;\n         std::cout << y << std::endl;\n      }\n   }\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n#if (TEST == 1) || (TEST == 0)\n   test(cpp_int());\n#endif\n#if (TEST == 2) || (TEST == 0)\n   test(number<cpp_int_backend<8192, 8192, signed_magnitude, unchecked, void> >());\n#endif\n#if (TEST == 3) || (TEST == 0)\n   test(number<cpp_int_backend<8192, 8192, signed_magnitude, unchecked, std::allocator<char> > >());\n#endif\n#if (TEST == 4) || (TEST == 0)\n   test(number<cpp_int_backend<8192, 8192, unsigned_magnitude, unchecked> >());\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cpp_int_left_shift.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//\n// Compare results of truncated left shift to gmp, see:\n// https://svn.boost.org/trac/boost/ticket/12790\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST1) && !defined(TEST2) && !defined(TEST3)\n#define TEST1\n#define TEST2\n#define TEST3\n#endif\n\ntemplate <class T>\nT generate_random(unsigned bits_wanted)\n{\n   static boost::random::mt19937               gen;\n   typedef boost::random::mt19937::result_type random_type;\n\n   T        max_val;\n   unsigned digits;\n   if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits))\n   {\n      max_val = (std::numeric_limits<T>::max)();\n      digits  = std::numeric_limits<T>::digits;\n   }\n   else\n   {\n      max_val = T(1) << bits_wanted;\n      digits  = bits_wanted;\n   }\n\n   unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n   while ((random_type(1) << bits_per_r_val) > (gen.max)())\n      --bits_per_r_val;\n\n   unsigned terms_needed = digits / bits_per_r_val + 1;\n\n   T val = 0;\n   for (unsigned i = 0; i < terms_needed; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   val %= max_val;\n   return val;\n}\n\ntemplate <class T>\nvoid test_value(const T& val)\n{\n   boost::multiprecision::mpz_int z(val.str()), mask(1);\n   mask <<= std::numeric_limits<T>::digits;\n   --mask;\n\n   for (unsigned i = 0; i <= std::numeric_limits<T>::digits + 2; ++i)\n   {\n      BOOST_CHECK_EQUAL((val << i).str(), boost::multiprecision::mpz_int(((z << i) & mask)).str());\n   }\n}\n\nvoid test(const std::integral_constant<int, 200>&) {}\n\ntemplate <int N>\nvoid test(std::integral_constant<int, N> const&)\n{\n   test(std::integral_constant<int, N + 4>());\n\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<N, N, boost::multiprecision::unsigned_magnitude>, boost::multiprecision::et_off> mp_type;\n\n   std::cout << \"Running tests for precision: \" << N << std::endl;\n\n   mp_type mp(-1);\n   test_value(mp);\n\n   for (unsigned i = 0; i < 1000; ++i)\n      test_value(generate_random<mp_type>(std::numeric_limits<mp_type>::digits));\n}\n\nint main()\n{\n   test(std::integral_constant<int, 24>());\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cpp_int_lit.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2013 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include \"test.hpp\"\n\n#if !(BOOST_WORKAROUND(BOOST_MSVC, <= 1900) && defined(CI_SUPPRESS_KNOWN_ISSUES)) && defined(BOOST_MP_USER_DEFINED_LITERALS)\n\nusing namespace boost::multiprecision;\n\ntemplate <class T>\nvoid test_literal(T val, const char* p)\n{\n   BOOST_CHECK_EQUAL(val, cpp_int(p));\n}\n\n#define TEST_LITERAL(x)                                      \\\n   {                                                         \\\n      constexpr auto val1       = BOOST_JOIN(x, _cppi);      \\\n      constexpr int1024_t val2  = BOOST_JOIN(x, _cppi1024);  \\\n      constexpr auto      val3  = BOOST_JOIN(x, _cppui);     \\\n      constexpr uint1024_t val4 = BOOST_JOIN(x, _cppui1024); \\\n      test_literal(val1, BOOST_STRINGIZE(x));                \\\n      test_literal(val2, BOOST_STRINGIZE(x));                \\\n      test_literal(val3, BOOST_STRINGIZE(x));                \\\n      test_literal(val4, BOOST_STRINGIZE(x));                \\\n      /* Negative values: */                                 \\\n      constexpr auto val5      = -BOOST_JOIN(x, _cppi);      \\\n      constexpr int1024_t val6 = -BOOST_JOIN(x, _cppi1024);  \\\n      constexpr auto      val7 = -val1;                      \\\n      constexpr int1024_t val8 = -val2;                      \\\n      BOOST_CHECK_EQUAL(val5, -cpp_int(val1));               \\\n      BOOST_CHECK_EQUAL(val6, -cpp_int(val1));               \\\n      BOOST_CHECK_EQUAL(val7, -cpp_int(val1));               \\\n      BOOST_CHECK_EQUAL(val8, -cpp_int(val1));               \\\n   }\n\nint main()\n{\n   using namespace boost::multiprecision::literals;\n   TEST_LITERAL(0x0);\n   TEST_LITERAL(0x00000);\n   TEST_LITERAL(0x10000000);\n   TEST_LITERAL(0x1234500000000123450000000123345000678000000456000000567000000fefabc00000000000000);\n   return boost::report_errors();\n}\n\n#else\n\nint main() { return 0; }\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cpp_int_serial.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//\n// Compare arithmetic results using fixed_int to GMP results.\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include \"timer.hpp\"\n#include \"test.hpp\"\n\n#include <iostream>\n#include <iomanip>\n#include <sstream>\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/archive/binary_iarchive.hpp>\n#include <boost/archive/xml_iarchive.hpp>\n#include <boost/archive/binary_oarchive.hpp>\n#include <boost/archive/xml_oarchive.hpp>\n#include <boost/exception/all.hpp>\n\ntemplate <class T>\nT generate_random(unsigned bits_wanted)\n{\n   static boost::random::mt19937               gen;\n   typedef boost::random::mt19937::result_type random_type;\n\n   T        max_val;\n   unsigned digits;\n   if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits))\n   {\n      max_val = (std::numeric_limits<T>::max)();\n      digits  = std::numeric_limits<T>::digits;\n   }\n   else\n   {\n      max_val = T(1) << bits_wanted;\n      digits  = bits_wanted;\n   }\n\n   unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n   while ((random_type(1) << bits_per_r_val) > (gen.max)())\n      --bits_per_r_val;\n\n   unsigned terms_needed = digits / bits_per_r_val + 1;\n\n   T val = 0;\n   for (unsigned i = 0; i < terms_needed; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   val %= max_val;\n   return val;\n}\n\ntemplate <class T>\nvoid test_neg(const T& x, const std::integral_constant<bool, true>&)\n{\n   T val = -x;\n#ifndef BOOST_NO_EXCEPTIONS\n   try\n   {\n#endif\n      std::stringstream             ss;\n      boost::archive::text_oarchive oa(ss);\n      oa << static_cast<const T&>(val);\n      boost::archive::text_iarchive ia(ss);\n      T                             val2;\n      ia >> val2;\n      BOOST_CHECK_EQUAL(val, val2);\n\n      ss.clear();\n      boost::archive::binary_oarchive ob(ss);\n      ob << static_cast<const T&>(val);\n      boost::archive::binary_iarchive ib(ss);\n      ib >> val2;\n      BOOST_CHECK_EQUAL(val, val2);\n#ifndef BOOST_NO_EXCEPTIONS\n   }\n   catch (const boost::exception& e)\n   {\n      std::cout << \"Caught boost::exception with:\\n\";\n      std::cout << diagnostic_information(e);\n   }\n   catch (const std::exception& e)\n   {\n      std::cout << \"Caught std::exception with:\\n\";\n      std::cout << e.what() << std::endl;\n   }\n#endif\n}\ntemplate <class T>\nvoid test_neg(const T&, const std::integral_constant<bool, false>&) {}\n\ntemplate <class T>\nvoid test()\n{\n   using namespace boost::multiprecision;\n\n   boost::random::mt19937 gen;\n   boost::uniform_int<>   d(3, std::numeric_limits<T>::is_bounded ? std::numeric_limits<T>::digits : 3000);\n   timer                  tim;\n\n   while (true)\n   {\n      T val = generate_random<T>(d(gen));\n#ifndef BOOST_NO_EXCEPTIONS\n      try\n      {\n#endif\n         T val2;\n         {\n            std::stringstream             ss;\n            boost::archive::text_oarchive oa(ss);\n            oa << static_cast<const T&>(val);\n            boost::archive::text_iarchive ia(ss);\n            ia >> val2;\n            BOOST_CHECK_EQUAL(val, val2);\n         }\n         {\n            std::stringstream               ss;\n            boost::archive::binary_oarchive ob(ss);\n            ob << static_cast<const T&>(val);\n            boost::archive::binary_iarchive ib(ss);\n            ib >> val2;\n            BOOST_CHECK_EQUAL(val, val2);\n         }\n         {\n            std::stringstream ss;\n            {\n               boost::archive::xml_oarchive oc(ss);\n               oc << boost::serialization::make_nvp(\"value\", static_cast<const T&>(val));\n            }\n            boost::archive::xml_iarchive ic(ss);\n            ic >> boost::serialization::make_nvp(\"value\", val2);\n            BOOST_CHECK_EQUAL(val, val2);\n         }\n\n#ifndef BOOST_NO_EXCEPTIONS\n      }\n      catch (const boost::exception& e)\n      {\n         std::cout << \"Caught boost::exception with:\\n\";\n         std::cout << diagnostic_information(e);\n      }\n      catch (const std::exception& e)\n      {\n         std::cout << \"Caught std::exception with:\\n\";\n         std::cout << e.what() << std::endl;\n      }\n#endif\n      test_neg(val, std::integral_constant<bool, std::numeric_limits<T>::is_signed>());\n      //\n      // Check to see if test is taking too long.\n      // Tests run on the compiler farm time out after 300 seconds,\n      // so don't get too close to that:\n      //\n#ifndef CI_SUPPRESS_KNOWN_ISSUES\n      if (tim.elapsed() > 150)\n#else\n      if (tim.elapsed() > 25)\n#endif\n      {\n         std::cout << \"Timeout reached, aborting tests now....\\n\";\n         break;\n      }\n   }\n}\n\n#if !defined(TEST1) && !defined(TEST2) && !defined(TEST3) && !defined(TEST4)\n#define TEST1\n#define TEST2\n#define TEST3\n#define TEST4\n#endif\n\nint main()\n{\n   using namespace boost::multiprecision;\n#ifdef TEST1\n   test<cpp_int>();\n#endif\n#ifdef TEST2\n   test<number<cpp_int_backend<61, 61, unsigned_magnitude, unchecked, void> > >();\n#endif\n#ifdef TEST3\n   test<number<cpp_int_backend<120, 120, signed_magnitude, unchecked, void> > >();\n#endif\n#ifdef TEST4\n   test<int1024_t>();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cpp_rat_serial.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//\n// Compare arithmetic results using fixed_int to GMP results.\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include \"timer.hpp\"\n#include \"test.hpp\"\n\n#include <iostream>\n#include <iomanip>\n#include <sstream>\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/archive/binary_iarchive.hpp>\n#include <boost/archive/binary_oarchive.hpp>\n#include <boost/archive/xml_iarchive.hpp>\n#include <boost/archive/xml_oarchive.hpp>\n#include <boost/exception/all.hpp>\n\ntemplate <class T>\nT generate_random(unsigned bits_wanted)\n{\n   static boost::random::mt19937               gen;\n   typedef boost::random::mt19937::result_type random_type;\n\n   T        max_val;\n   unsigned digits;\n   if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits))\n   {\n      max_val = (std::numeric_limits<T>::max)();\n      digits  = std::numeric_limits<T>::digits;\n   }\n   else\n   {\n      max_val = T(1) << bits_wanted;\n      digits  = bits_wanted;\n   }\n\n   unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n   while ((random_type(1) << bits_per_r_val) > (gen.max)())\n      --bits_per_r_val;\n\n   unsigned terms_needed = digits / bits_per_r_val + 1;\n\n   T val = 0;\n   for (unsigned i = 0; i < terms_needed; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   val %= max_val;\n   if (!val)\n      val = 1;\n   return val;\n}\n\ntemplate <class T>\nvoid test_neg(const T& x, const std::integral_constant<bool, true>&)\n{\n   T val = -x;\n#ifndef BOOST_NO_EXCEPTIONS\n   try\n   {\n#endif\n      T val2;\n      {\n         std::stringstream             ss;\n         boost::archive::text_oarchive oa(ss);\n         oa << static_cast<const T&>(val);\n         boost::archive::text_iarchive ia(ss);\n         ia >> val2;\n         BOOST_CHECK_EQUAL(val, val2);\n      }\n      {\n         std::stringstream               ss;\n         boost::archive::binary_oarchive ob(ss);\n         ob << static_cast<const T&>(val);\n         boost::archive::binary_iarchive ib(ss);\n         ib >> val2;\n         BOOST_CHECK_EQUAL(val, val2);\n      }\n      {\n         std::stringstream ss;\n         {\n            boost::archive::xml_oarchive ob(ss);\n            ob << boost::serialization::make_nvp(\"value\", static_cast<const T&>(val));\n         }\n         boost::archive::xml_iarchive ib(ss);\n         ib >> boost::serialization::make_nvp(\"value\", val2);\n         BOOST_CHECK_EQUAL(val, val2);\n      }\n#ifndef BOOST_NO_EXCEPTIONS\n   }\n   catch (const boost::exception& e)\n   {\n      std::cout << \"Caught boost::exception with:\\n\";\n      std::cout << diagnostic_information(e);\n   }\n   catch (const std::exception& e)\n   {\n      std::cout << \"Caught std::exception with:\\n\";\n      std::cout << e.what() << std::endl;\n   }\n#endif\n}\ntemplate <class T>\nvoid test_neg(const T&, const std::integral_constant<bool, false>&) {}\n\ntemplate <class T>\nvoid test()\n{\n   using namespace boost::multiprecision;\n\n   boost::random::mt19937 gen;\n   boost::uniform_int<>   d(3, std::numeric_limits<T>::is_bounded ? std::numeric_limits<T>::digits : 3000);\n   timer                  tim;\n\n   while (true)\n   {\n      T val(generate_random<typename component_type<T>::type>(d(gen)), generate_random<typename component_type<T>::type>(d(gen)));\n#ifndef BOOST_NO_EXCEPTIONS\n      try\n      {\n#endif\n         std::stringstream             ss;\n         boost::archive::text_oarchive oa(ss);\n         oa << static_cast<const T&>(val);\n         boost::archive::text_iarchive ia(ss);\n         T                             val2;\n         ia >> val2;\n         BOOST_CHECK_EQUAL(val, val2);\n\n         ss.clear();\n         boost::archive::binary_oarchive ob(ss);\n         ob << static_cast<const T&>(val);\n         boost::archive::binary_iarchive ib(ss);\n         ib >> val2;\n         BOOST_CHECK_EQUAL(val, val2);\n#ifndef BOOST_NO_EXCEPTIONS\n      }\n      catch (const boost::exception& e)\n      {\n         std::cout << \"Caught boost::exception with:\\n\";\n         std::cout << diagnostic_information(e);\n      }\n      catch (const std::exception& e)\n      {\n         std::cout << \"Caught std::exception with:\\n\";\n         std::cout << e.what() << std::endl;\n      }\n#endif\n      test_neg(val, std::integral_constant<bool, std::numeric_limits<T>::is_signed>());\n\n      //\n      // Check to see if test is taking too long.\n      // Tests run on the compiler farm time out after 300 seconds,\n      // so don't get too close to that:\n      //\n#ifndef CI_SUPPRESS_KNOWN_ISSUES\n      if (tim.elapsed() > 150)\n#else\n      if (tim.elapsed() > 25)\n#endif\n      {\n         std::cout << \"Timeout reached, aborting tests now....\\n\";\n         break;\n      }\n   }\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n   test<cpp_rational>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_cpp_rational.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock.\n//  Copyright 2022 Christopher Kormanyos.\n//  Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//\n// Compare arithmetic results using fixed_int to GMP results.\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <random>\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/cpp_int.hpp>\n#include \"timer.hpp\"\n#include \"test.hpp\"\n\n#ifdef _MSC_VER\n#pragma warning(disable : 4127) //  Conditional expression is constant\n#endif\n\n#if !defined(TEST1) && !defined(TEST2) && !defined(TEST3) && !defined(TEST4) && !defined(TEST5) && !defined(TEST6)\n#define TEST1\n#define TEST2\n#define TEST3\n#define TEST4\n#define TEST5\n#define TEST6\n#endif\n\nnamespace local_random\n{\n\nusing generator_type = std::mt19937;\nusing random_type    = typename generator_type::result_type;\n\ngenerator_type& my_generator()\n{\n  static generator_type generator_instance;\n\n  return generator_instance;\n}\n\ntemplate <class T>\nT generate_random(unsigned bits_wanted)\n{\n   T        max_val;\n   unsigned digits;\n   if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits))\n   {\n      max_val = (std::numeric_limits<T>::max)();\n      digits  = std::numeric_limits<T>::digits;\n   }\n   else\n   {\n      max_val = T(1) << bits_wanted;\n      digits  = bits_wanted;\n   }\n\n   unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n   while ((random_type(1) << bits_per_r_val) > (my_generator().max)())\n      --bits_per_r_val;\n\n   unsigned terms_needed = digits / bits_per_r_val + 1;\n\n   T val = 0;\n   for (unsigned i = 0; i < terms_needed; ++i)\n   {\n      val *= (my_generator().max)();\n      val += my_generator()();\n   }\n   val %= max_val;\n   return val;\n}\n\n}\n\ntemplate <class Number>\nstruct tester\n{\n   using test_type  = Number;\n   using checked    = typename test_type::backend_type::checked_type;\n   using timer_type = boost::multiprecision::test_detail::timer_template<int, std::chrono::high_resolution_clock>;\n\n   unsigned   last_error_count;\n   timer_type tim;\n\n   boost::multiprecision::mpz_int a, b, c, d;\n   int                            si;\n   unsigned                       ui;\n   boost::multiprecision::double_limb_type large_ui;\n   test_type                      a1, b1, c1, d1;\n\n   static constexpr int double_limb_type_digit_counter()\n   {\n      return static_cast<int>(sizeof(boost::multiprecision::double_limb_type)) * 8;\n   }\n\n   void t1()\n   {\n      //\n      // Arithmetic, non-mixed:\n      //\n      boost::multiprecision::mpq_rational x(a, b), y(c, d), z;\n      boost::multiprecision::cpp_rational x1(a1, b1), y1(c1, d1), z1;\n\n      BOOST_CHECK_EQUAL(x.str(), x1.str());\n      BOOST_CHECK_EQUAL(y.str(), y1.str());\n\n      // positive x, y:\n      z = x + y;\n      z1 = x1 + y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x - y;\n      z1 = x1 - y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x * y;\n      z1 = x1 * y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x / y;\n      z1 = x1 / y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      \n      // negative y:\n      y = -y;\n      y1 = -y1;\n      BOOST_CHECK(y < 0);\n      z  = x + y;\n      z1 = x1 + y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x - y;\n      z1 = x1 - y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x * y;\n      z1 = x1 * y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x / y;\n      z1 = x1 / y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      \n      // negative x:\n      x.swap(y);\n      x1.swap(y1);\n      BOOST_CHECK(x < 0);\n      z  = x + y;\n      z1 = x1 + y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x - y;\n      z1 = x1 - y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x * y;\n      z1 = x1 * y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x / y;\n      z1 = x1 / y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // negative x, y:\n      y = -y;\n      y1 = -y1;\n      BOOST_CHECK(x < 0);\n      BOOST_CHECK(y < 0);\n      z  = x + y;\n      z1 = x1 + y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x - y;\n      z1 = x1 - y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x * y;\n      z1 = x1 * y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x / y;\n      z1 = x1 / y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // Inplace, negative x, y:\n      BOOST_CHECK(x < 0);\n      BOOST_CHECK(y < 0);\n      z = x;\n      z += y;\n      z1 = x1;\n      z1 += y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x;\n      z -= y;\n      z1 = x1;\n      z1 -= y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x;\n      z *= y;\n      z1 = x1;\n      z1 *= y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x;\n      z *= z;\n      z1 = x1;\n      z1 *= z1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x;\n      z /= y;\n      z1 = x1;\n      z1 /= y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // Inplace, negative x:\n      y  = -y;\n      y1 = -y1;\n      BOOST_CHECK(x < 0);\n      z = x;\n      z += y;\n      z1 = x1;\n      z1 += y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x;\n      z -= y;\n      z1 = x1;\n      z1 -= y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x;\n      z *= y;\n      z1 = x1;\n      z1 *= y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x;\n      z *= z;\n      z1 = x1;\n      z1 *= z1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x;\n      z /= y;\n      z1 = x1;\n      z1 /= y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // Inplace, negative y:\n      x.swap(y);\n      x1.swap(y1);\n      BOOST_CHECK(y < 0);\n      z = x;\n      z += y;\n      z1 = x1;\n      z1 += y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x;\n      z -= y;\n      z1 = x1;\n      z1 -= y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x;\n      z *= y;\n      z1 = x1;\n      z1 *= y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x;\n      z *= z;\n      z1 = x1;\n      z1 *= z1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x;\n      z /= y;\n      z1 = x1;\n      z1 /= y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // Inplace, positive x, y:\n      y = -y;\n      y1 = -y1;\n      BOOST_CHECK(x > 0);\n      BOOST_CHECK(y > 0);\n      z = x;\n      z += y;\n      z1 = x1;\n      z1 += y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x;\n      z -= y;\n      z1 = x1;\n      z1 -= y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x;\n      z *= y;\n      z1 = x1;\n      z1 *= y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x;\n      z *= z;\n      z1 = x1;\n      z1 *= z1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x;\n      z /= y;\n      z1 = x1;\n      z1 /= y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      BOOST_CHECK_EQUAL((x == y), (x1 == y1));\n      BOOST_CHECK_EQUAL((x != y), (x1 != y1));\n      BOOST_CHECK_EQUAL((x <= y), (x1 <= y1));\n      BOOST_CHECK_EQUAL((x >= y), (x1 >= y1));\n      BOOST_CHECK_EQUAL((x < y), (x1 < y1));\n      BOOST_CHECK_EQUAL((x > y), (x1 > y1));\n\n      z = x;\n      z1 = x1;\n      BOOST_CHECK_EQUAL((x == z), (x1 == z1));\n      BOOST_CHECK_EQUAL((x != z), (x1 != z1));\n      BOOST_CHECK_EQUAL((x <= z), (x1 <= z1));\n      BOOST_CHECK_EQUAL((x >= z), (x1 >= z1));\n      BOOST_CHECK_EQUAL((x < z), (x1 < z1));\n      BOOST_CHECK_EQUAL((x > z), (x1 > z1));\n   }\n\n   void t2()\n   {\n      //\n      // Mixed with signed integer:\n      //\n      boost::multiprecision::mpq_rational x(a, b), y(c, d), z;\n      boost::multiprecision::cpp_rational x1(a1, b1), y1(c1, d1), z1;\n\n      BOOST_CHECK_EQUAL(x.str(), x1.str());\n      BOOST_CHECK_EQUAL(y.str(), y1.str());\n\n      // Both positive:\n      z = x + si;\n      z1 = x1 + si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x - si;\n      z1 = x1 - si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x * si;\n      z1 = x1 * si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x / si;\n      z1 = x1 / si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = si + x;\n      z1 = si + x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = si - x;\n      z1 = si - x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = si * x;\n      z1 = si * x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = si / x;\n      z1 = si / x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // x negative:\n      x = -x;\n      x1 = -x1;\n      z  = x + si;\n      z1 = x1 + si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x - si;\n      z1 = x1 - si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x * si;\n      z1 = x1 * si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x / si;\n      z1 = x1 / si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = si + x;\n      z1 = si + x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = si - x;\n      z1 = si - x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = si * x;\n      z1 = si * x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = si / x;\n      z1 = si / x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // x and si both negative:\n      z  = x + si;\n      z1 = x1 + si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x - si;\n      z1 = x1 - si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x * si;\n      z1 = x1 * si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x / si;\n      z1 = x1 / si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = si + x;\n      z1 = si + x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = si - x;\n      z1 = si - x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = si * x;\n      z1 = si * x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = si / x;\n      z1 = si / x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // si negative:\n      x = -x;\n      x1 = -x1;\n      z  = x + si;\n      z1 = x1 + si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x - si;\n      z1 = x1 - si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x * si;\n      z1 = x1 * si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x / si;\n      z1 = x1 / si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = si + x;\n      z1 = si + x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = si - x;\n      z1 = si - x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = si * x;\n      z1 = si * x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = si / x;\n      z1 = si / x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      si = -si;\n      // Inplace:\n      z = x;\n      z1 = x1;\n      z += si;\n      z1 += si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = x;\n      z1 = x1;\n      z -= si;\n      z1 -= si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z *= si;\n      z1 *= si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z /= si;\n      z1 /= si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // si negative:\n      si = -si;\n      z  = x;\n      z1 = x1;\n      z += si;\n      z1 += si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z -= si;\n      z1 -= si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z *= si;\n      z1 *= si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z /= si;\n      z1 /= si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // Both negative:\n      x  = -x;\n      x1 = -x1;\n      z  = x;\n      z1 = x1;\n      z += si;\n      z1 += si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z -= si;\n      z1 -= si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z *= si;\n      z1 *= si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z /= si;\n      z1 /= si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // x negative:\n      si = -si;\n      z  = x;\n      z1 = x1;\n      z += si;\n      z1 += si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z -= si;\n      z1 -= si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z *= si;\n      z1 *= si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z /= si;\n      z1 /= si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      BOOST_CHECK_EQUAL((x == si), (x1 == si));\n      BOOST_CHECK_EQUAL((x != si), (x1 != si));\n      BOOST_CHECK_EQUAL((x <= si), (x1 <= si));\n      BOOST_CHECK_EQUAL((x >= si), (x1 >= si));\n      BOOST_CHECK_EQUAL((x < si), (x1 < si));\n      BOOST_CHECK_EQUAL((x > si), (x1 > si));\n\n      z = si;\n      z1 = si;\n      BOOST_CHECK_EQUAL((x == si), (x1 == si));\n      BOOST_CHECK_EQUAL((x != si), (x1 != si));\n      BOOST_CHECK_EQUAL((x <= si), (x1 <= si));\n      BOOST_CHECK_EQUAL((x >= si), (x1 >= si));\n      BOOST_CHECK_EQUAL((x < si), (x1 < si));\n      BOOST_CHECK_EQUAL((x > si), (x1 > si));\n   }\n\n   void t3()\n   {\n      //\n      // Mixed with unsigned integer:\n      //\n      boost::multiprecision::mpq_rational x(a, b), y(c, d), z;\n      boost::multiprecision::cpp_rational x1(a1, b1), y1(c1, d1), z1;\n\n      BOOST_CHECK_EQUAL(x.str(), x1.str());\n      BOOST_CHECK_EQUAL(y.str(), y1.str());\n\n      // Both positive:\n      z  = x + ui;\n      z1 = x1 + ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x - ui;\n      z1 = x1 - ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x * ui;\n      z1 = x1 * ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x / ui;\n      z1 = x1 / ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = ui + x;\n      z1 = ui + x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = ui - x;\n      z1 = ui - x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = ui * x;\n      z1 = ui * x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = ui / x;\n      z1 = ui / x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // x negative:\n      x  = -x;\n      x1 = -x1;\n      z  = x + ui;\n      z1 = x1 + ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x - ui;\n      z1 = x1 - ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x * ui;\n      z1 = x1 * ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x / ui;\n      z1 = x1 / ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = ui + x;\n      z1 = ui + x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = ui - x;\n      z1 = ui - x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = ui * x;\n      z1 = ui * x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = ui / x;\n      z1 = ui / x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      x = -x;\n      x1 = -x1;\n      // Inplace:\n      z  = x;\n      z1 = x1;\n      z += ui;\n      z1 += ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z -= ui;\n      z1 -= ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z *= ui;\n      z1 *= ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z /= ui;\n      z1 /= ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // x negative:\n      x  = -x;\n      x1 = -x1;\n      z  = x;\n      z1 = x1;\n      z += ui;\n      z1 += ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z -= ui;\n      z1 -= ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z *= ui;\n      z1 *= ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z /= ui;\n      z1 /= ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      x = -x;\n      x1 = -x1;\n\n      BOOST_CHECK_EQUAL((x == ui), (x1 == ui));\n      BOOST_CHECK_EQUAL((x != ui), (x1 != ui));\n      BOOST_CHECK_EQUAL((x <= ui), (x1 <= ui));\n      BOOST_CHECK_EQUAL((x >= ui), (x1 >= ui));\n      BOOST_CHECK_EQUAL((x < ui), (x1 < ui));\n      BOOST_CHECK_EQUAL((x > ui), (x1 > ui));\n\n      z  = ui;\n      z1 = ui;\n      BOOST_CHECK_EQUAL((x == ui), (x1 == ui));\n      BOOST_CHECK_EQUAL((x != ui), (x1 != ui));\n      BOOST_CHECK_EQUAL((x <= ui), (x1 <= ui));\n      BOOST_CHECK_EQUAL((x >= ui), (x1 >= ui));\n      BOOST_CHECK_EQUAL((x < ui), (x1 < ui));\n      BOOST_CHECK_EQUAL((x > ui), (x1 > ui));\n   }\n\n   void t4()\n   {\n      //\n      // Mixed with unsigned long integer:\n      //\n      boost::multiprecision::mpq_rational x(a, b), y(c, d), z;\n      boost::multiprecision::cpp_rational x1(a1, b1), y1(c1, d1), z1;\n\n      BOOST_CHECK_EQUAL(x.str(), x1.str());\n      BOOST_CHECK_EQUAL(y.str(), y1.str());\n\n      // Both positive:\n      z  = x + large_ui;\n      z1 = x1 + large_ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x - large_ui;\n      z1 = x1 - large_ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x * large_ui;\n      z1 = x1 * large_ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x / large_ui;\n      z1 = x1 / large_ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = large_ui + x;\n      z1 = large_ui + x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = large_ui - x;\n      z1 = large_ui - x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = large_ui * x;\n      z1 = large_ui * x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = large_ui / x;\n      z1 = large_ui / x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // x negative:\n      x  = -x;\n      x1 = -x1;\n      z  = x + large_ui;\n      z1 = x1 + large_ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x - large_ui;\n      z1 = x1 - large_ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x * large_ui;\n      z1 = x1 * large_ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x / large_ui;\n      z1 = x1 / large_ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = large_ui + x;\n      z1 = large_ui + x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = large_ui - x;\n      z1 = large_ui - x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = large_ui * x;\n      z1 = large_ui * x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = large_ui / x;\n      z1 = large_ui / x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      x  = -x;\n      x1 = -x1;\n      // Inplace:\n      z  = x;\n      z1 = x1;\n      z += large_ui;\n      z1 += large_ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z -= large_ui;\n      z1 -= large_ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z *= large_ui;\n      z1 *= large_ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z /= large_ui;\n      z1 /= large_ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // x negative:\n      x  = -x;\n      x1 = -x1;\n      z  = x;\n      z1 = x1;\n      z += large_ui;\n      z1 += large_ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z -= large_ui;\n      z1 -= large_ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z *= large_ui;\n      z1 *= large_ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z /= large_ui;\n      z1 /= large_ui;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      x  = -x;\n      x1 = -x1;\n\n      BOOST_CHECK_EQUAL((x == large_ui), (x1 == large_ui));\n      BOOST_CHECK_EQUAL((x != large_ui), (x1 != large_ui));\n      BOOST_CHECK_EQUAL((x <= large_ui), (x1 <= large_ui));\n      BOOST_CHECK_EQUAL((x >= large_ui), (x1 >= large_ui));\n      BOOST_CHECK_EQUAL((x < large_ui), (x1 < large_ui));\n      BOOST_CHECK_EQUAL((x > large_ui), (x1 > large_ui));\n\n      z  = large_ui;\n      z1 = large_ui;\n      BOOST_CHECK_EQUAL((x == large_ui), (x1 == large_ui));\n      BOOST_CHECK_EQUAL((x != large_ui), (x1 != large_ui));\n      BOOST_CHECK_EQUAL((x <= large_ui), (x1 <= large_ui));\n      BOOST_CHECK_EQUAL((x >= large_ui), (x1 >= large_ui));\n      BOOST_CHECK_EQUAL((x < large_ui), (x1 < large_ui));\n      BOOST_CHECK_EQUAL((x > large_ui), (x1 > large_ui));\n   }\n\n   void t5()\n   {\n      //\n      // Special cases:\n      //\n      boost::multiprecision::mpq_rational x(a, b), y(c, d), z;\n      boost::multiprecision::cpp_rational x1(a1, b1), y1(c1, d1), z1;\n\n      BOOST_CHECK_EQUAL(x.str(), x1.str());\n      BOOST_CHECK_EQUAL(y.str(), y1.str());\n\n      BOOST_CHECK_EQUAL(x1 * 0, 0);\n      BOOST_CHECK_EQUAL(x1 * 1, x1);\n      BOOST_CHECK_EQUAL(x1 * -1, -x1);\n\n      z = x * y;\n      z1 = x1;\n      x1 = x1 * y1;\n      BOOST_CHECK_EQUAL(z.str(), x1.str());\n      x1 = z1;\n\n      x1 = y1 * x1;\n      BOOST_CHECK_EQUAL(z.str(), x1.str());\n      x1 = z1;\n\n      z = x * si;\n      x1 = x1 * si;\n      BOOST_CHECK_EQUAL(z.str(), x1.str());\n      x1 = z1;\n\n      x1 = si * x1;\n      BOOST_CHECK_EQUAL(z.str(), x1.str());\n      x1 = z1;\n\n      z1 = x1;\n      z1 *= 0;\n      BOOST_CHECK_EQUAL(z1, 0);\n      z1 = x1;\n      z1 *= 1;\n      BOOST_CHECK_EQUAL(z1, x1);\n      z1 = x1;\n      z1 *= -1;\n      BOOST_CHECK_EQUAL(z1, -x1);\n\n      z1 = x1 / x1;\n      BOOST_CHECK_EQUAL(z1, 1);\n      z1 = x1 / -x1;\n      BOOST_CHECK_EQUAL(z1, -1);\n      z = x / y;\n      z1 = x1;\n      z1 = z1 / y1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z1 = y1;\n      z1 = x1 / z1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      z = x / si;\n      z1 = x1;\n      z1 = z1 / si;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z = si / x;\n      z1 = x1;\n      z1 = si / z1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      BOOST_CHECK_THROW(z1 = x1 / 0, std::overflow_error);\n      z1= x1;\n      BOOST_CHECK_THROW(z1 /= 0, std::overflow_error);\n      z1 = x1;\n      z1 /= 1;\n      BOOST_CHECK_EQUAL(z1, x1);\n      z1 /= -1;\n      BOOST_CHECK_EQUAL(z1, -x1);\n      z1 = x1 / 1;\n      BOOST_CHECK_EQUAL(z1, x1);\n      z1 = x1 / -1;\n      BOOST_CHECK_EQUAL(z1, -x1);\n\n      z1 = 0;\n      BOOST_CHECK_EQUAL(z1 * si, 0);\n      BOOST_CHECK_EQUAL(z1 / si, 0);\n      BOOST_CHECK_EQUAL(z1 + si, si);\n      BOOST_CHECK_EQUAL(z1 - si, -si);\n      z1 *= si;\n      BOOST_CHECK_EQUAL(z1, 0);\n      z1 /= si;\n      BOOST_CHECK_EQUAL(z1, 0);\n      z1 += si;\n      BOOST_CHECK_EQUAL(z1, si);\n      z1 = 0;\n      z1 -= si;\n      BOOST_CHECK_EQUAL(z1, -si);\n\n      z1 = si;\n      z1 /= si;\n      BOOST_CHECK_EQUAL(z1, 1);\n      z1 = si;\n      z1 /= -si;\n      BOOST_CHECK_EQUAL(z1, -1);\n      z1 = -si;\n      z1 /= si;\n      BOOST_CHECK_EQUAL(z1, -1);\n      z1 = -si;\n      z1 /= -si;\n      BOOST_CHECK_EQUAL(z1, 1);\n\n      x1 = si;\n      z1 = si / x1;\n      BOOST_CHECK_EQUAL(z1, 1);\n      x1 = si;\n      z1 = x1 / si;\n      BOOST_CHECK_EQUAL(z1, 1);\n      x1 = -si;\n      z1 = si / x1;\n      BOOST_CHECK_EQUAL(z1, -1);\n      x1 = -si;\n      z1 = x1 / si;\n      BOOST_CHECK_EQUAL(z1, -1);\n      x1 = -si;\n      z1 = -si / x1;\n      BOOST_CHECK_EQUAL(z1, 1);\n      x1 = -si;\n      z1 = x1 / -si;\n      BOOST_CHECK_EQUAL(z1, 1);\n      x1 = si;\n      z1 = -si / x1;\n      BOOST_CHECK_EQUAL(z1, -1);\n      x1 = si;\n      z1 = x1 / -si;\n      BOOST_CHECK_EQUAL(z1, -1);\n   }\n\n   void t6()\n   {\n      //\n      // Mixed with signed integer:\n      //\n      boost::multiprecision::mpq_rational x(a, b), y(c, d), z;\n      boost::multiprecision::cpp_rational x1(a1, b1), y1(c1, d1), z1;\n\n      boost::multiprecision::mpz_int bi = local_random::generate_random<boost::multiprecision::mpz_int>(1000);\n      boost::multiprecision::cpp_int bi1(bi.str());\n\n      BOOST_CHECK_EQUAL(x.str(), x1.str());\n      BOOST_CHECK_EQUAL(y.str(), y1.str());\n      BOOST_CHECK_EQUAL(bi.str(), bi1.str());\n\n      // Both positive:\n      z  = x + bi;\n      z1 = x1 + bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x - bi;\n      z1 = x1 - bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x * bi;\n      z1 = x1 * bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x / bi;\n      z1 = x1 / bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = bi + x;\n      z1 = bi1 + x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = bi - x;\n      z1 = bi1 - x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = bi * x;\n      z1 = bi1 * x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = bi / x;\n      z1 = bi1 / x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // x negative:\n      x  = -x;\n      x1 = -x1;\n      z  = x + bi;\n      z1 = x1 + bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x - bi;\n      z1 = x1 - bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x * bi;\n      z1 = x1 * bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x / bi;\n      z1 = x1 / bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = bi + x;\n      z1 = bi1 + x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = bi - x;\n      z1 = bi1 - x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = bi * x;\n      z1 = bi1 * x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = bi / x;\n      z1 = bi1 / x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // x and bi both negative:\n      z  = x + bi;\n      z1 = x1 + bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x - bi;\n      z1 = x1 - bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x * bi;\n      z1 = x1 * bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x / bi;\n      z1 = x1 / bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = bi + x;\n      z1 = bi1 + x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = bi - x;\n      z1 = bi1 - x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = bi * x;\n      z1 = bi1 * x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = bi / x;\n      z1 = bi1 / x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // bi negative:\n      x  = -x;\n      x1 = -x1;\n      z  = x + bi;\n      z1 = x1 + bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x - bi;\n      z1 = x1 - bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x * bi;\n      z1 = x1 * bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x / bi;\n      z1 = x1 / bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = bi + x;\n      z1 = bi1 + x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = bi - x;\n      z1 = bi1 - x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = bi * x;\n      z1 = bi1 * x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = bi / x;\n      z1 = bi1 / x1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      bi = -bi;\n      bi1 = -bi1;\n      // Inplace:\n      z  = x;\n      z1 = x1;\n      z += bi;\n      z1 += bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z -= bi;\n      z1 -= bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z *= bi;\n      z1 *= bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z /= bi;\n      z1 /= bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // bi negative:\n      bi = -bi;\n      bi1 = -bi1;\n      z  = x;\n      z1 = x1;\n      z += bi;\n      z1 += bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z -= bi;\n      z1 -= bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z *= bi;\n      z1 *= bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z /= bi;\n      z1 /= bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // Both negative:\n      x  = -x;\n      x1 = -x1;\n      z  = x;\n      z1 = x1;\n      z += bi;\n      z1 += bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z -= bi;\n      z1 -= bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z *= bi;\n      z1 *= bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z /= bi;\n      z1 /= bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      // x negative:\n      bi = -bi;\n      bi1 = -bi1;\n      z  = x;\n      z1 = x1;\n      z += bi;\n      z1 += bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z -= bi;\n      z1 -= bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z *= bi;\n      z1 *= bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n      z  = x;\n      z1 = x1;\n      z /= bi;\n      z1 /= bi1;\n      BOOST_CHECK_EQUAL(z.str(), z1.str());\n\n      BOOST_CHECK_EQUAL((x == bi), (x1 == bi1));\n      BOOST_CHECK_EQUAL((x != bi), (x1 != bi1));\n      BOOST_CHECK_EQUAL((x <= bi), (x1 <= bi1));\n      BOOST_CHECK_EQUAL((x >= bi), (x1 >= bi1));\n      BOOST_CHECK_EQUAL((x < bi), (x1 < bi1));\n      BOOST_CHECK_EQUAL((x > bi), (x1 > bi1));\n\n      z  = bi;\n      z1 = bi1;\n      BOOST_CHECK_EQUAL((x == bi), (x1 == bi1));\n      BOOST_CHECK_EQUAL((x != bi), (x1 != bi1));\n      BOOST_CHECK_EQUAL((x <= bi), (x1 <= bi1));\n      BOOST_CHECK_EQUAL((x >= bi), (x1 >= bi1));\n      BOOST_CHECK_EQUAL((x < bi), (x1 < bi1));\n      BOOST_CHECK_EQUAL((x > bi), (x1 > bi1));\n   }\n\n   void test()\n   {\n      using namespace boost::multiprecision;\n\n      last_error_count = 0;\n\n      BOOST_CHECK_EQUAL(Number(), 0);\n\n      constexpr auto ilim = 10000;\n\n      constexpr auto large_ui_digits_to_get = double_limb_type_digit_counter();\n\n      // Ensure at compile-time that the amount of digits to get for large_ui is OK.\n      static_assert(large_ui_digits_to_get >= std::numeric_limits<unsigned>::digits,\n                    \"Error: Ensure that the amount of digits to get for large_ui is really correct.\");\n\n      for (auto i = 0; i < ilim; ++i)\n      {\n         a = local_random::generate_random<mpz_int>(1000);\n         b = local_random::generate_random<mpz_int>(1000);\n         c = local_random::generate_random<mpz_int>(1000);\n         d = local_random::generate_random<mpz_int>(1000);\n\n         si = local_random::generate_random<int>\n              (\n                 static_cast<unsigned>(std::numeric_limits<int>::digits - 2)\n              );\n\n         ui = local_random::generate_random<unsigned>\n              (\n                 static_cast<unsigned>(std::numeric_limits<unsigned>::digits - 2)\n              );\n\n         large_ui =\n              local_random::generate_random<boost::multiprecision::double_limb_type>\n              (\n                 static_cast<unsigned>(large_ui_digits_to_get - 2)\n              );\n\n         const auto a_represented_as_string = a.str();\n         const auto b_represented_as_string = b.str();\n         const auto c_represented_as_string = c.str();\n         const auto d_represented_as_string = d.str();\n\n         a1 = static_cast<test_type>(a_represented_as_string);\n         b1 = static_cast<test_type>(b_represented_as_string);\n         c1 = static_cast<test_type>(c_represented_as_string);\n         d1 = static_cast<test_type>(d_represented_as_string);\n\n         #if defined(TEST1)\n         t1();\n         #endif\n\n         #if defined(TEST2)\n         t2();\n         #endif\n\n         #if defined(TEST3)\n         t3();\n         #endif\n\n         #if defined(TEST4)\n         t4();\n         #endif\n\n         #if defined(TEST5)\n         t5();\n         #endif\n\n         #if defined(TEST6)\n         t6();\n         #endif\n\n         if (last_error_count != static_cast<unsigned>(boost::detail::test_errors()))\n         {\n            last_error_count = boost::detail::test_errors();\n            std::cout << std::hex << std::showbase;\n\n            std::cout << \"a    = \" << a << std::endl;\n            std::cout << \"a1   = \" << a1 << std::endl;\n            std::cout << \"b    = \" << b << std::endl;\n            std::cout << \"b1   = \" << b1 << std::endl;\n            std::cout << \"c    = \" << c << std::endl;\n            std::cout << \"c1   = \" << c1 << std::endl;\n            std::cout << \"d    = \" << d << std::endl;\n            std::cout << \"d1   = \" << d1 << std::endl;\n            std::cout << \"a + b   = \" << a + b << std::endl;\n            std::cout << \"a1 + b1 = \" << a1 + b1 << std::endl;\n            std::cout << std::dec;\n            std::cout << \"a - b   = \" << a - b << std::endl;\n            std::cout << \"a1 - b1 = \" << a1 - b1 << std::endl;\n            std::cout << \"-a + b   = \" << mpz_int(-a) + b << std::endl;\n            std::cout << \"-a1 + b1 = \" << test_type(-a1) + b1 << std::endl;\n            std::cout << \"-a - b   = \" << mpz_int(-a) - b << std::endl;\n            std::cout << \"-a1 - b1 = \" << test_type(-a1) - b1 << std::endl;\n            std::cout << \"c*d    = \" << c * d << std::endl;\n            std::cout << \"c1*d1  = \" << c1 * d1 << std::endl;\n            std::cout << \"b*c    = \" << b * c << std::endl;\n            std::cout << \"b1*c1  = \" << b1 * c1 << std::endl;\n            std::cout << \"a/b    = \" << a / b << std::endl;\n            std::cout << \"a1/b1  = \" << a1 / b1 << std::endl;\n            std::cout << \"a/d    = \" << a / d << std::endl;\n            std::cout << \"a1/d1  = \" << a1 / d1 << std::endl;\n            std::cout << \"a%b    = \" << a % b << std::endl;\n            std::cout << \"a1%b1  = \" << a1 % b1 << std::endl;\n            std::cout << \"a%d    = \" << a % d << std::endl;\n            std::cout << \"a1%d1  = \" << a1 % d1 << std::endl;\n         }\n\n         //\n         // Check to see if test is taking too long.\n         // Tests run on the compiler farm time out after 300 seconds,\n         // so don't get too close to that:\n         //\n#ifndef CI_SUPPRESS_KNOWN_ISSUES\n         if (tim.elapsed() > timer_type::seconds(180))\n#else\n         if (tim.elapsed() > timer_type::seconds(20))\n#endif\n         {\n            std::cout << \"Timeout reached, aborting tests now....\\n\";\n            std::cout << \"Loop count reached is i: \" << i << \"\\n\";\n            break;\n         }\n      }\n   }\n};\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n   tester<cpp_int> t1;\n   t1.test();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_eigen_interop.cpp",
    "content": "//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <iostream>\n#include <Eigen/Dense>\n\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/multiprecision/logged_adaptor.hpp>\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/mpc.hpp>\n\n#include \"test.hpp\"\n\nusing namespace Eigen;\n\nnamespace Eigen {\ntemplate <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct NumTraits<boost::multiprecision::number<Backend, ExpressionTemplates> >\n{\n   typedef boost::multiprecision::number<Backend, ExpressionTemplates>                          self_type;\n   typedef typename boost::multiprecision::scalar_result_from_possible_complex<self_type>::type Real;\n   typedef self_type                                                                            NonInteger; // Not correct but we can't do much better??\n   typedef double                                                                               Literal;\n   typedef self_type                                                                            Nested;\n   enum\n   {\n      IsComplex             = boost::multiprecision::number_category<self_type>::value == boost::multiprecision::number_kind_complex,\n      IsInteger             = boost::multiprecision::number_category<self_type>::value == boost::multiprecision::number_kind_integer,\n      ReadCost              = 1,\n      AddCost               = 4,\n      MulCost               = 8,\n      IsSigned              = std::numeric_limits<self_type>::is_specialized ? std::numeric_limits<self_type>::is_signed : true,\n      RequireInitialization = 1,\n   };\n   static Real epsilon()\n   {\n      return std::numeric_limits<Real>::epsilon();\n   }\n   static Real dummy_precision()\n   {\n      return sqrt(epsilon());\n   }\n   static Real highest()\n   {\n      return (std::numeric_limits<Real>::max)();\n   }\n   static Real lowest()\n   {\n      return (std::numeric_limits<Real>::min)();\n   }\n   static int digits10_imp(const std::integral_constant<bool, true>&)\n   {\n      return std::numeric_limits<Real>::digits10;\n   }\n   template <bool B>\n   static int digits10_imp(const std::integral_constant<bool, B>&)\n   {\n      return Real::default_precision();\n   }\n   static int digits10()\n   {\n      return digits10_imp(std::integral_constant<bool, std::numeric_limits<Real>::digits10 && (std::numeric_limits<Real>::digits10 != INT_MAX) ? true : false > ());\n   }\n};\n\n#define BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(A)                                                                                                                                                                       \\\n   template <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates, typename BinaryOp>                                                                                              \\\n   struct ScalarBinaryOpTraits<boost::multiprecision::number<Backend, ExpressionTemplates>, A, BinaryOp>                                                                                                           \\\n   {                                                                                                                                                                                                               \\\n      static_assert(boost::multiprecision::is_compatible_arithmetic_type<A, boost::multiprecision::number<Backend, ExpressionTemplates> >::value, \"Interoperability with this arithmetic type is not supported.\"); \\\n      typedef boost::multiprecision::number<Backend, ExpressionTemplates> ReturnType;                                                                                                                              \\\n   };                                                                                                                                                                                                              \\\n   template <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates, typename BinaryOp>                                                                                              \\\n   struct ScalarBinaryOpTraits<A, boost::multiprecision::number<Backend, ExpressionTemplates>, BinaryOp>                                                                                                           \\\n   {                                                                                                                                                                                                               \\\n      static_assert(boost::multiprecision::is_compatible_arithmetic_type<A, boost::multiprecision::number<Backend, ExpressionTemplates> >::value, \"Interoperability with this arithmetic type is not supported.\"); \\\n      typedef boost::multiprecision::number<Backend, ExpressionTemplates> ReturnType;                                                                                                                              \\\n   };\n\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(float)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(double)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(long double)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(char)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(unsigned char)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(signed char)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(short)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(unsigned short)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(int)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(unsigned int)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(long)\nBOOST_MP_EIGEN_SCALAR_TRAITS_DECL(unsigned long)\n#if 0\n   template<class Backend, boost::multiprecision::expression_template_option ExpressionTemplates, class Backend2, boost::multiprecision::expression_template_option ExpressionTemplates2, typename BinaryOp>\n   struct ScalarBinaryOpTraits<boost::multiprecision::number<Backend, ExpressionTemplates>, boost::multiprecision::number<Backend2, ExpressionTemplates2>, BinaryOp>\n   {\n      static_assert(\n         boost::multiprecision::is_compatible_arithmetic_type<boost::multiprecision::number<Backend2, ExpressionTemplates2>, boost::multiprecision::number<Backend, ExpressionTemplates> >::value\n         || boost::multiprecision::is_compatible_arithmetic_type<boost::multiprecision::number<Backend, ExpressionTemplates>, boost::multiprecision::number<Backend2, ExpressionTemplates2> >::value, \"Interoperability with this arithmetic type is not supported.\");\n      typedef typename std::conditional<std::is_convertible<boost::multiprecision::number<Backend2, ExpressionTemplates2>, boost::multiprecision::number<Backend, ExpressionTemplates> >::value,\n         boost::multiprecision::number<Backend, ExpressionTemplates>, boost::multiprecision::number<Backend2, ExpressionTemplates2> >::type ReturnType;\n   };\n\n   template<unsigned D, typename BinaryOp>\n   struct ScalarBinaryOpTraits<boost::multiprecision::number<boost::multiprecision::backends::mpc_complex_backend<D>, boost::multiprecision::et_on>, boost::multiprecision::mpfr_float, BinaryOp>\n   {\n      typedef boost::multiprecision::number<boost::multiprecision::backends::mpc_complex_backend<D>, boost::multiprecision::et_on> ReturnType;\n   };\n\n   template<typename BinaryOp>\n   struct ScalarBinaryOpTraits<boost::multiprecision::mpfr_float, boost::multiprecision::mpc_complex, BinaryOp>\n   {\n      typedef boost::multiprecision::number<boost::multiprecision::backends::mpc_complex_backend<0>, boost::multiprecision::et_on> ReturnType;\n   };\n\n   template<class Backend, boost::multiprecision::expression_template_option ExpressionTemplates, typename BinaryOp>\n   struct ScalarBinaryOpTraits<boost::multiprecision::number<Backend, ExpressionTemplates>, boost::multiprecision::number<Backend, ExpressionTemplates>, BinaryOp>\n   {\n      typedef boost::multiprecision::number<Backend, ExpressionTemplates> ReturnType;\n   };\n#endif\ntemplate <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates, class tag, class Arg1, class Arg2, class Arg3, class Arg4, typename BinaryOp>\nstruct ScalarBinaryOpTraits<boost::multiprecision::number<Backend, ExpressionTemplates>, boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, BinaryOp>\n{\n   static_assert(std::is_convertible<typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, boost::multiprecision::number<Backend, ExpressionTemplates> >::value, \"Interoperability with this arithmetic type is not supported.\");\n   typedef boost::multiprecision::number<Backend, ExpressionTemplates> ReturnType;\n};\n\ntemplate <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class Backend, boost::multiprecision::expression_template_option ExpressionTemplates, typename BinaryOp>\nstruct ScalarBinaryOpTraits<boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, boost::multiprecision::number<Backend, ExpressionTemplates>, BinaryOp>\n{\n   static_assert(std::is_convertible<typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, boost::multiprecision::number<Backend, ExpressionTemplates> >::value, \"Interoperability with this arithmetic type is not supported.\");\n   typedef boost::multiprecision::number<Backend, ExpressionTemplates> ReturnType;\n};\n\n} // namespace Eigen\n\ntemplate <class T>\nstruct related_number\n{\n   typedef T type;\n};\n/*\ntemplate <>\nstruct related_number<boost::multiprecision::cpp_bin_float_50>\n{\n   typedef boost::multiprecision::cpp_bin_float_quad type;\n};\ntemplate <>\nstruct related_number<boost::multiprecision::cpp_dec_float_100>\n{\n   typedef boost::multiprecision::cpp_dec_float_50 type;\n};*/\n\ntemplate <class Num>\nvoid example1()\n{\n   // expected results first:\n   Matrix<Num, 2, 2> r1, r2;\n   r1 << 3, 5, 4, 8;\n   r2 << -1, -1, 2, 0;\n   Matrix<Num, 3, 1> r3;\n   r3 << -1, -4, -6;\n\n   Matrix<Num, 2, 2> a;\n   a << 1, 2, 3, 4;\n   Matrix<Num, Dynamic, Dynamic> b(2, 2);\n   b << 2, 3, 1, 4;\n   std::cout << \"a + b =\\n\"\n             << a + b << std::endl;\n   BOOST_CHECK_EQUAL(a + b, r1);\n   std::cout << \"a - b =\\n\"\n             << a - b << std::endl;\n   BOOST_CHECK_EQUAL(a - b, r2);\n   std::cout << \"Doing a += b;\" << std::endl;\n   a += b;\n   std::cout << \"Now a =\\n\"\n             << a << std::endl;\n   Matrix<Num, 3, 1> v(1, 2, 3);\n   Matrix<Num, 3, 1> w(1, 0, 0);\n   std::cout << \"-v + w - v =\\n\"\n             << -v + w - v << std::endl;\n   BOOST_CHECK_EQUAL(-v + w - v, r3);\n}\n\ntemplate <class Num>\nvoid example2()\n{\n   Matrix<Num, 2, 2> a;\n   a << 1, 2, 3, 4;\n   Matrix<Num, 3, 1> v(1, 2, 3);\n   std::cout << \"a * 2.5 =\\n\"\n             << a * 2.5 << std::endl;\n   std::cout << \"0.1 * v =\\n\"\n             << 0.1 * v << std::endl;\n   std::cout << \"Doing v *= 2;\" << std::endl;\n   v *= 2;\n   std::cout << \"Now v =\\n\"\n             << v << std::endl;\n   Num n(4);\n   std::cout << \"Doing v *= Num;\" << std::endl;\n   v *= n;\n   std::cout << \"Now v =\\n\"\n             << v << std::endl;\n   typedef typename related_number<Num>::type related_type;\n   related_type                               r(6);\n   std::cout << \"Doing v *= RelatedType;\" << std::endl;\n   v *= r;\n   std::cout << \"Now v =\\n\"\n             << v << std::endl;\n   std::cout << \"RelatedType * v =\\n\"\n             << r * v << std::endl;\n   std::cout << \"Doing v *= RelatedType^2;\" << std::endl;\n   v *= r * r;\n   std::cout << \"Now v =\\n\"\n             << v << std::endl;\n   std::cout << \"RelatedType^2 * v =\\n\"\n             << r * r * v << std::endl;\n\n   static_assert(std::is_same<typename Eigen::ScalarBinaryOpTraits<Num, related_type, Eigen::internal::scalar_product_op<Num, related_type> >::ReturnType, Num>::value, \"Incorrect type.\");\n}\n\ntemplate <class Num>\nvoid example3()\n{\n   using namespace std;\n   Matrix<Num, Dynamic, Dynamic> a = Matrix<Num, Dynamic, Dynamic>::Random(2, 2);\n   cout << \"Here is the matrix a\\n\"\n        << a << endl;\n   cout << \"Here is the matrix a^T\\n\"\n        << a.transpose() << endl;\n   cout << \"Here is the conjugate of a\\n\"\n        << a.conjugate() << endl;\n   cout << \"Here is the matrix a^*\\n\"\n        << a.adjoint() << endl;\n}\n\ntemplate <class Num>\nvoid example4()\n{\n   Matrix<Num, 2, 2> mat;\n   mat << 1, 2,\n       3, 4;\n   Matrix<Num, 2, 1> u(-1, 1), v(2, 0);\n   std::cout << \"Here is mat*mat:\\n\"\n             << mat * mat << std::endl;\n   std::cout << \"Here is mat*u:\\n\"\n             << mat * u << std::endl;\n   std::cout << \"Here is u^T*mat:\\n\"\n             << u.transpose() * mat << std::endl;\n   std::cout << \"Here is u^T*v:\\n\"\n             << u.transpose() * v << std::endl;\n   std::cout << \"Here is u*v^T:\\n\"\n             << u * v.transpose() << std::endl;\n   std::cout << \"Let's multiply mat by itself\" << std::endl;\n   mat = mat * mat;\n   std::cout << \"Now mat is mat:\\n\"\n             << mat << std::endl;\n}\n\ntemplate <class Num>\nvoid example5()\n{\n   using namespace std;\n   Matrix<Num, 3, 1> v(1, 2, 3);\n   Matrix<Num, 3, 1> w(0, 1, 2);\n   cout << \"Dot product: \" << v.dot(w) << endl;\n   Num dp = v.adjoint() * w; // automatic conversion of the inner product to a scalar\n   cout << \"Dot product via a matrix product: \" << dp << endl;\n   cout << \"Cross product:\\n\"\n        << v.cross(w) << endl;\n}\n\ntemplate <class Num>\nvoid example6()\n{\n   using namespace std;\n   Matrix<Num, 2, 2> mat;\n   mat << 1, 2,\n       3, 4;\n   cout << \"Here is mat.sum():       \" << mat.sum() << endl;\n   cout << \"Here is mat.prod():      \" << mat.prod() << endl;\n   cout << \"Here is mat.mean():      \" << mat.mean() << endl;\n   cout << \"Here is mat.minCoeff():  \" << mat.minCoeff() << endl;\n   cout << \"Here is mat.maxCoeff():  \" << mat.maxCoeff() << endl;\n   cout << \"Here is mat.trace():     \" << mat.trace() << endl;\n}\n\ntemplate <class Num>\nvoid example7()\n{\n   using namespace std;\n\n   Array<Num, Dynamic, Dynamic> m(2, 2);\n\n   // assign some values coefficient by coefficient\n   m(0, 0) = 1.0;\n   m(0, 1) = 2.0;\n   m(1, 0) = 3.0;\n   m(1, 1) = m(0, 1) + m(1, 0);\n\n   // print values to standard output\n   cout << m << endl\n        << endl;\n\n   // using the comma-initializer is also allowed\n   m << 1.0, 2.0,\n       3.0, 4.0;\n\n   // print values to standard output\n   cout << m << endl;\n}\n\ntemplate <class Num>\nvoid example8()\n{\n   using namespace std;\n   Array<Num, Dynamic, Dynamic> a(3, 3);\n   Array<Num, Dynamic, Dynamic> b(3, 3);\n   a << 1, 2, 3,\n       4, 5, 6,\n       7, 8, 9;\n   b << 1, 2, 3,\n       1, 2, 3,\n       1, 2, 3;\n\n   // Adding two arrays\n   cout << \"a + b = \" << endl\n        << a + b << endl\n        << endl;\n   // Subtracting a scalar from an array\n   cout << \"a - 2 = \" << endl\n        << a - 2 << endl;\n}\n\ntemplate <class Num>\nvoid example9()\n{\n   using namespace std;\n   Array<Num, Dynamic, Dynamic> a(2, 2);\n   Array<Num, Dynamic, Dynamic> b(2, 2);\n   a << 1, 2,\n       3, 4;\n   b << 5, 6,\n       7, 8;\n   cout << \"a * b = \" << endl\n        << a * b << endl;\n}\n\ntemplate <class Num>\nvoid example10()\n{\n   using namespace std;\n   Array<Num, Dynamic, 1> a = Array<Num, Dynamic, 1>::Random(5);\n   a *= 2;\n   cout << \"a =\" << endl\n        << a << endl;\n   cout << \"a.abs() =\" << endl\n        << a.abs() << endl;\n   cout << \"a.abs().sqrt() =\" << endl\n        << a.abs().sqrt() << endl;\n   cout << \"a.min(a.abs().sqrt()) =\" << endl\n        << (a.min)(a.abs().sqrt()) << endl;\n}\n\ntemplate <class Num>\nvoid example11()\n{\n   using namespace std;\n   Matrix<Num, Dynamic, Dynamic> m(2, 2);\n   Matrix<Num, Dynamic, Dynamic> n(2, 2);\n   Matrix<Num, Dynamic, Dynamic> result(2, 2);\n   m << 1, 2,\n       3, 4;\n   n << 5, 6,\n       7, 8;\n   result = m * n;\n   cout << \"-- Matrix m*n: --\" << endl\n        << result << endl\n        << endl;\n   result = m.array() * n.array();\n   cout << \"-- Array m*n: --\" << endl\n        << result << endl\n        << endl;\n   result = m.cwiseProduct(n);\n   cout << \"-- With cwiseProduct: --\" << endl\n        << result << endl\n        << endl;\n   result = m.array() + 4;\n   cout << \"-- Array m + 4: --\" << endl\n        << result << endl\n        << endl;\n}\n\ntemplate <class Num>\nvoid example12()\n{\n   using namespace std;\n   Matrix<Num, Dynamic, Dynamic> m(2, 2);\n   Matrix<Num, Dynamic, Dynamic> n(2, 2);\n   Matrix<Num, Dynamic, Dynamic> result(2, 2);\n   m << 1, 2,\n       3, 4;\n   n << 5, 6,\n       7, 8;\n\n   result = (m.array() + 4).matrix() * m;\n   cout << \"-- Combination 1: --\" << endl\n        << result << endl\n        << endl;\n   result = (m.array() * n.array()).matrix() * m;\n   cout << \"-- Combination 2: --\" << endl\n        << result << endl\n        << endl;\n}\n\ntemplate <class Num>\nvoid example13()\n{\n   using namespace std;\n   Matrix<Num, Dynamic, Dynamic> m(4, 4);\n   m << 1, 2, 3, 4,\n       5, 6, 7, 8,\n       9, 10, 11, 12,\n       13, 14, 15, 16;\n   cout << \"Block in the middle\" << endl;\n   cout << m.template block<2, 2>(1, 1) << endl\n        << endl;\n   for (int i = 1; i <= 3; ++i)\n   {\n      cout << \"Block of size \" << i << \"x\" << i << endl;\n      cout << m.block(0, 0, i, i) << endl\n           << endl;\n   }\n}\n\ntemplate <class Num>\nvoid example14()\n{\n   using namespace std;\n   Array<Num, 2, 2> m;\n   m << 1, 2,\n       3, 4;\n   Array<Num, 4, 4> a = Array<Num, 4, 4>::Constant(0.6);\n   cout << \"Here is the array a:\" << endl\n        << a << endl\n        << endl;\n   a.template block<2, 2>(1, 1) = m;\n   cout << \"Here is now a with m copied into its central 2x2 block:\" << endl\n        << a << endl\n        << endl;\n   a.block(0, 0, 2, 3) = a.block(2, 1, 2, 3);\n   cout << \"Here is now a with bottom-right 2x3 block copied into top-left 2x2 block:\" << endl\n        << a << endl\n        << endl;\n}\n\ntemplate <class Num>\nvoid example15()\n{\n   using namespace std;\n   Eigen::Matrix<Num, Dynamic, Dynamic> m(3, 3);\n   m << 1, 2, 3,\n       4, 5, 6,\n       7, 8, 9;\n   cout << \"Here is the matrix m:\" << endl\n        << m << endl;\n   cout << \"2nd Row: \" << m.row(1) << endl;\n   m.col(2) += 3 * m.col(0);\n   cout << \"After adding 3 times the first column into the third column, the matrix m is:\\n\";\n   cout << m << endl;\n}\n\ntemplate <class Num>\nvoid example16()\n{\n   using namespace std;\n   Matrix<Num, 4, 4> m;\n   m << 1, 2, 3, 4,\n       5, 6, 7, 8,\n       9, 10, 11, 12,\n       13, 14, 15, 16;\n   cout << \"m.leftCols(2) =\" << endl\n        << m.leftCols(2) << endl\n        << endl;\n   cout << \"m.bottomRows<2>() =\" << endl\n        << m.template bottomRows<2>() << endl\n        << endl;\n   m.topLeftCorner(1, 3) = m.bottomRightCorner(3, 1).transpose();\n   cout << \"After assignment, m = \" << endl\n        << m << endl;\n}\n\ntemplate <class Num>\nvoid example17()\n{\n   using namespace std;\n   Array<Num, Dynamic, 1> v(6);\n   v << 1, 2, 3, 4, 5, 6;\n   cout << \"v.head(3) =\" << endl\n        << v.head(3) << endl\n        << endl;\n   cout << \"v.tail<3>() = \" << endl\n        << v.template tail<3>() << endl\n        << endl;\n   v.segment(1, 4) *= 2;\n   cout << \"after 'v.segment(1,4) *= 2', v =\" << endl\n        << v << endl;\n}\n\ntemplate <class Num>\nvoid example18()\n{\n   using namespace std;\n   Matrix<Num, 2, 2> mat;\n   mat << 1, 2,\n       3, 4;\n   cout << \"Here is mat.sum():       \" << mat.sum() << endl;\n   cout << \"Here is mat.prod():      \" << mat.prod() << endl;\n   cout << \"Here is mat.mean():      \" << mat.mean() << endl;\n   cout << \"Here is mat.minCoeff():  \" << mat.minCoeff() << endl;\n   cout << \"Here is mat.maxCoeff():  \" << mat.maxCoeff() << endl;\n   cout << \"Here is mat.trace():     \" << mat.trace() << endl;\n\n   BOOST_CHECK_EQUAL(mat.sum(), 10);\n   BOOST_CHECK_EQUAL(mat.prod(), 24);\n   BOOST_CHECK_EQUAL(mat.mean(), Num(5) / 2);\n   BOOST_CHECK_EQUAL(mat.minCoeff(), 1);\n   BOOST_CHECK_EQUAL(mat.maxCoeff(), 4);\n   BOOST_CHECK_EQUAL(mat.trace(), 5);\n}\n\ntemplate <class Num>\nvoid example18a()\n{\n   using namespace std;\n   Matrix<Num, 2, 2> mat;\n   mat << 1, 2,\n       3, 4;\n   cout << \"Here is mat.sum():       \" << mat.sum() << endl;\n   cout << \"Here is mat.prod():      \" << mat.prod() << endl;\n   cout << \"Here is mat.mean():      \" << mat.mean() << endl;\n   //cout << \"Here is mat.minCoeff():  \" << mat.minCoeff() << endl;\n   //cout << \"Here is mat.maxCoeff():  \" << mat.maxCoeff() << endl;\n   cout << \"Here is mat.trace():     \" << mat.trace() << endl;\n}\n\ntemplate <class Num>\nvoid example19()\n{\n   using namespace std;\n   Matrix<Num, Dynamic, 1>       v(2);\n   Matrix<Num, Dynamic, Dynamic> m(2, 2), n(2, 2);\n\n   v << -1,\n       2;\n\n   m << 1, -2,\n       -3, 4;\n   cout << \"v.squaredNorm() = \" << v.squaredNorm() << endl;\n   cout << \"v.norm() = \" << v.norm() << endl;\n   cout << \"v.lpNorm<1>() = \" << v.template lpNorm<1>() << endl;\n   cout << \"v.lpNorm<Infinity>() = \" << v.template lpNorm<Infinity>() << endl;\n   cout << endl;\n   cout << \"m.squaredNorm() = \" << m.squaredNorm() << endl;\n   cout << \"m.norm() = \" << m.norm() << endl;\n   cout << \"m.lpNorm<1>() = \" << m.template lpNorm<1>() << endl;\n   cout << \"m.lpNorm<Infinity>() = \" << m.template lpNorm<Infinity>() << endl;\n}\n\ntemplate <class Num>\nvoid example20()\n{\n   using namespace std;\n   Matrix<Num, 3, 3> A;\n   Matrix<Num, 3, 1> b;\n   A << 1, 2, 3, 4, 5, 6, 7, 8, 10;\n   b << 3, 3, 4;\n   cout << \"Here is the matrix A:\\n\"\n        << A << endl;\n   cout << \"Here is the vector b:\\n\"\n        << b << endl;\n   Matrix<Num, 3, 1> x = A.colPivHouseholderQr().solve(b);\n   cout << \"The solution is:\\n\"\n        << x << endl;\n}\n\ntemplate <class Num>\nvoid example21()\n{\n   using namespace std;\n   Matrix<Num, 2, 2> A, b;\n   A << 2, -1, -1, 3;\n   b << 1, 2, 3, 1;\n   cout << \"Here is the matrix A:\\n\"\n        << A << endl;\n   cout << \"Here is the right hand side b:\\n\"\n        << b << endl;\n   Matrix<Num, 2, 2> x = A.ldlt().solve(b);\n   cout << \"The solution is:\\n\"\n        << x << endl;\n}\n\ntemplate <class Num>\nvoid example22()\n{\n   using namespace std;\n   Matrix<Num, Dynamic, Dynamic> A              = Matrix<Num, Dynamic, Dynamic>::Random(100, 100);\n   Matrix<Num, Dynamic, Dynamic> b              = Matrix<Num, Dynamic, Dynamic>::Random(100, 50);\n   Matrix<Num, Dynamic, Dynamic> x              = A.fullPivLu().solve(b);\n   Matrix<Num, Dynamic, Dynamic> axmb           = A * x - b;\n   double                        relative_error = static_cast<double>(abs(axmb.norm() / b.norm())); // norm() is L2 norm\n   cout << \"norm1 = \" << axmb.norm() << endl;\n   cout << \"norm2 = \" << b.norm() << endl;\n   cout << \"The relative error is:\\n\"\n        << relative_error << endl;\n}\n\ntemplate <class Num>\nvoid example23()\n{\n   using namespace std;\n   Matrix<Num, 2, 2> A;\n   A << 1, 2, 2, 3;\n   cout << \"Here is the matrix A:\\n\"\n        << A << endl;\n   SelfAdjointEigenSolver<Matrix<Num, 2, 2> > eigensolver(A);\n   if (eigensolver.info() != Success)\n   {\n      std::cout << \"Eigenvalue solver failed!\" << endl;\n   }\n   else\n   {\n      cout << \"The eigenvalues of A are:\\n\"\n           << eigensolver.eigenvalues() << endl;\n      cout << \"Here's a matrix whose columns are eigenvectors of A \\n\"\n           << \"corresponding to these eigenvalues:\\n\"\n           << eigensolver.eigenvectors() << endl;\n   }\n}\n\ntemplate <class Num>\nvoid example24()\n{\n   using namespace std;\n   Matrix<Num, 3, 3> A;\n   A << 1, 2, 1,\n       2, 1, 0,\n       -1, 1, 2;\n   cout << \"Here is the matrix A:\\n\"\n        << A << endl;\n   cout << \"The determinant of A is \" << A.determinant() << endl;\n   cout << \"The inverse of A is:\\n\"\n        << A.inverse() << endl;\n}\n\ntemplate <class Num>\nvoid test_integer_type()\n{\n   example1<Num>();\n   //example2<Num>();\n   example18<Num>();\n}\n\ntemplate <class Num>\nvoid test_float_type()\n{\n   std::cout << \"Epsilon    = \" << Eigen::NumTraits<Num>::epsilon() << std::endl;\n   std::cout << \"Dummy Prec = \" << Eigen::NumTraits<Num>::dummy_precision() << std::endl;\n   std::cout << \"Highest    = \" << Eigen::NumTraits<Num>::highest() << std::endl;\n   std::cout << \"Lowest     = \" << Eigen::NumTraits<Num>::lowest() << std::endl;\n   std::cout << \"Digits10   = \" << Eigen::NumTraits<Num>::digits10() << std::endl;\n\n   example1<Num>();\n   example2<Num>();\n   example4<Num>();\n   example5<Num>();\n   example6<Num>();\n   example7<Num>();\n   example8<Num>();\n   example9<Num>();\n   example10<Num>();\n   example11<Num>();\n   example12<Num>();\n   example13<Num>();\n   example14<Num>();\n   example15<Num>();\n   example16<Num>();\n   example17<Num>();\n   example18<Num>();\n   example19<Num>();\n   example20<Num>();\n   example21<Num>();\n   example22<Num>();\n   example23<Num>();\n   example24<Num>();\n}\n\ntemplate <class Num>\nvoid test_complex_type()\n{\n   std::cout << \"Epsilon    = \" << Eigen::NumTraits<Num>::epsilon() << std::endl;\n   std::cout << \"Dummy Prec = \" << Eigen::NumTraits<Num>::dummy_precision() << std::endl;\n   std::cout << \"Highest    = \" << Eigen::NumTraits<Num>::highest() << std::endl;\n   std::cout << \"Lowest     = \" << Eigen::NumTraits<Num>::lowest() << std::endl;\n   std::cout << \"Digits10   = \" << Eigen::NumTraits<Num>::digits10() << std::endl;\n\n   example1<Num>();\n   example2<Num>();\n   example3<Num>();\n   example4<Num>();\n   example5<Num>();\n   example7<Num>();\n   example8<Num>();\n   example9<Num>();\n   example11<Num>();\n   example12<Num>();\n   example13<Num>();\n   example14<Num>();\n   example15<Num>();\n   example16<Num>();\n   example17<Num>();\n   example18a<Num>();\n   example19<Num>();\n   example20<Num>();\n   example21<Num>();\n   example22<Num>();\n   // example23<Num>();  //requires comparisons.\n   example24<Num>();\n}\n\nnamespace boost {\nnamespace multiprecision {\n\ntemplate <unsigned D>\ninline void log_postfix_event(const mpc_complex_backend<D>& val, const char* event_description)\n{\n   if (mpfr_nan_p(mpc_realref(val.data())))\n   {\n      std::cout << \"Found a NaN! \" << event_description << std::endl;\n   }\n}\n\n}\n} // namespace boost::multiprecision\n\nint main()\n{\n   using namespace boost::multiprecision;\n   test_complex_type<mpc_complex>();\n#if 0\n   test_integer_type<int>();\n\n   test_float_type<double>();\n   test_complex_type<std::complex<double> >();\n\n   test_float_type<boost::multiprecision::cpp_dec_float_100>();\n   test_float_type<boost::multiprecision::cpp_bin_float_50>();\n   test_float_type<boost::multiprecision::mpfr_float>();\n\n   test_integer_type<boost::multiprecision::int256_t>();\n   test_integer_type<boost::multiprecision::cpp_int>();\n   test_integer_type<boost::multiprecision::cpp_rational>();\n   test_integer_type<boost::multiprecision::mpz_int>();\n   test_integer_type<boost::multiprecision::mpq_rational>();\n\n#endif\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_eigen_interop_cpp_bin_float_1.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\n#include \"eigen.hpp\"\n\nint main()\n{\n   using namespace boost::multiprecision;\n   test_float_type<double>();\n   test_float_type<boost::multiprecision::cpp_bin_float_50>();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_eigen_interop_cpp_bin_float_2.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\n#include \"eigen.hpp\"\n\nint main()\n{\n   using namespace boost::multiprecision;\n   test_float_type_2<double>();\n   test_float_type_2<boost::multiprecision::cpp_bin_float_50>();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_eigen_interop_cpp_bin_float_3.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n\n#include \"eigen.hpp\"\n\nint main()\n{\n   using namespace boost::multiprecision;\n   test_float_type_3<double>();\n   test_float_type_3<boost::multiprecision::cpp_bin_float_50>();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_eigen_interop_cpp_dec_float.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\n#include \"eigen.hpp\"\n\ntemplate <>\nstruct related_number<boost::multiprecision::cpp_dec_float_100>\n{\n   typedef boost::multiprecision::cpp_dec_float_50 type;\n};\n\nint main()\n{\n   using namespace boost::multiprecision;\n   test_float_type<double>();\n   test_float_type<boost::multiprecision::cpp_dec_float_100>();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_eigen_interop_cpp_dec_float_2.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\n#include \"eigen.hpp\"\n\ntemplate <>\nstruct related_number<boost::multiprecision::cpp_dec_float_100>\n{\n   typedef boost::multiprecision::cpp_dec_float_50 type;\n};\n\nint main()\n{\n   using namespace boost::multiprecision;\n   //test_float_type_2<double>();\n   test_float_type_2<boost::multiprecision::cpp_dec_float_100>();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_eigen_interop_cpp_dec_float_3.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\n#include \"eigen.hpp\"\n\ntemplate <>\nstruct related_number<boost::multiprecision::cpp_dec_float_100>\n{\n   typedef boost::multiprecision::cpp_dec_float_50 type;\n};\n\nint main()\n{\n   using namespace boost::multiprecision;\n   //test_float_type_2<double>();\n   test_float_type_3<boost::multiprecision::cpp_dec_float_100>();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_eigen_interop_cpp_int.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n\n#include \"eigen.hpp\"\n\nint main()\n{\n   using namespace boost::multiprecision;\n   test_integer_type<int>();\n   test_integer_type<boost::multiprecision::int256_t>();\n   test_integer_type<boost::multiprecision::cpp_int>();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_eigen_interop_gmp.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/gmp.hpp>\n\n#include \"eigen.hpp\"\n\nint main()\n{\n   using namespace boost::multiprecision;\n   test_integer_type<boost::multiprecision::mpz_int>();\n   test_integer_type<boost::multiprecision::mpq_rational>();\n\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_eigen_interop_gmp_2.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/gmp.hpp>\n\n#include \"eigen.hpp\"\n\nint main()\n{\n   test_float_type<boost::multiprecision::mpf_float_50>();\n   test_float_type<boost::multiprecision::mpf_float>();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_eigen_interop_mpc.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/mpc.hpp>\n\n#include \"eigen.hpp\"\n\nint main()\n{\n   using namespace boost::multiprecision;\n   test_complex_type<mpc_complex>();\n   test_complex_type<mpc_complex_50>();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_eigen_interop_mpfr_1.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/mpfr.hpp>\n\n#include \"eigen.hpp\"\n\nint main()\n{\n   using namespace boost::multiprecision;\n   test_float_type<boost::multiprecision::mpfr_float>();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_eigen_interop_mpfr_2.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/mpfr.hpp>\n\n#include \"eigen.hpp\"\n\nint main()\n{\n   using namespace boost::multiprecision;\n   test_float_type_2<boost::multiprecision::mpfr_float>();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_eigen_interop_mpfr_3.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/mpfr.hpp>\n\n#include \"eigen.hpp\"\n\nint main()\n{\n   using namespace boost::multiprecision;\n   test_float_type_3<boost::multiprecision::mpfr_float>();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_eigen_interop_mpfr_4.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/mpfr.hpp>\n\n#include \"eigen.hpp\"\n\nint main()\n{\n   using namespace boost::multiprecision;\n   test_float_type<boost::multiprecision::mpfr_float_50>();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_eigen_interop_mpfr_5.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/mpfr.hpp>\n\n#include \"eigen.hpp\"\n\nint main()\n{\n   using namespace boost::multiprecision;\n   test_float_type_2<boost::multiprecision::mpfr_float_50>();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_eigen_interop_mpfr_6.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2018 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/mpfr.hpp>\n\n#include \"eigen.hpp\"\n\nint main()\n{\n   using namespace boost::multiprecision;\n   test_float_type_3<boost::multiprecision::mpfr_float_50>();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_exp.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#pragma warning(disable : 4127)\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n//#  define TEST_MPF\n#define TEST_BACKEND\n#define TEST_CPP_DEC_FLOAT\n#define TEST_MPFI_50\n#define TEST_FLOAT128\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(TEST_MPFR_50)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_MPFI_50)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n\ntemplate <class T>\nvoid test()\n{\n   std::cout << \"Testing type \" << typeid(T).name() << std::endl;\n   static const boost::array<const char*, 51u> data =\n       {{\n           \"1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n           \"9.47747587596218770242116751705184563668845029215054154915126374673142219159548534317576897266130328412495991561490384353e76\",\n           \"8.98225489794452370997623936390755615068333094834545092387689795875746440121970819499035111276893290879203289092353747850e153\",\n           \"8.51291041070124257524798251795398355552294928156627848633073113916721592074889256105483993631579761345100284245144410506e230\",\n           \"8.06809030516483860484254925989129017112482132468761563276276594763374886826841745433660192438855214332469192411759402790e307\",\n           \"7.64651312322841630493169711336894888932951818957138997327518186691187347879142222644283389432604713409023263917264358401e384\",\n           \"7.24696436606255985380192585665173794455118215150711210905481870053193336336731228464367470327868286988180495111406609690e461\",\n           \"6.86829299533155197480610865771404565313986987801060270120621935139741577246731459024227828759564450034267891072352816870e538\",\n           \"6.50940811722948585242669672360741252715012399316164518226061001845519670701239429603657927628755169479689062519606799624e615\",\n           \"6.16927583978348964454665652571294215251327375137123272041877979478545511090085756858225302357977159539777447847855503405e692\",\n           \"5.84691629437043896753869572004324228849833391140408095171257918435296982661233664069534601413835876272500275725690968474e769\",\n           \"5.54140081286660645835370762406928689330724181979654545550204201113926269281603301564114980528619942840737770415885783439e846\",\n           \"5.25184925229805200184933663459660562493261505058724212670923083643709964294855282715531768162298567379648573804433968486e923\",\n           \"4.97742745928448409225535325233998957076879979440190164347796593390995994951755710667491911026476108957070504003155645761e1000\",\n           \"4.71734486697204622371883518659702954552385115723942808636490157561056417525827884479573988899517566587636669779645610803e1077\",\n           \"4.47085221753216236037602345430121605512330975424643767098987010800161616413051148037751552110081034066081309007796182114e1154\",\n           \"4.23723940366531198300986713567588008777043812458400705569721660157434941774066620870256745107265536124077734836797938268e1231\",\n           \"4.01583342289144005397455901781647949754375366066998182220342540048111140676724909947493787596336610499122085983712119281e1308\",\n           \"3.80599643873362813900306284477369187319506389058898599816705625750135796510808933786432614186155972485637939057212164098e1385\",\n           \"3.60712394320959592074309301816510372687695286650188776957291994751966018917404878612237961367128638199290387601511358836e1462\",\n           \"3.41864301533745457066062991907289263038319874930395315315257927161138360206596116102724713069518697248463965164712972907e1539\",\n           \"3.24001067063873569456703204286462007769933831045558617578289414699244767403736057931834775727420762410328297596596814910e1616\",\n           \"3.07071229688386868087623659761166306563170839771162347830514606977592027644137144160294469813988158463967740978461420862e1693\",\n           \"2.91026017157373047094077218552378456052150304677863670611408570458991015300131731261787644801415538043027268185097710615e1770\",\n           \"2.75819205688636078700279174380111581147323147951670302427494196210176478494486073721584055059489736040565979466551070179e1847\",\n           \"2.61406986804110104534167739704643351039975992759905579635058824027507742375380077276380178376470686987855503581867681046e1924\",\n           \"2.47747841124391945459619002346303925269640785743990333362087223895627681769816204236257960940497519376881830373722711456e2001\",\n           \"2.34802418757813746316913800667907927718925648696508255347624141597281474683823345136640610924639820192825966082309575303e2078\",\n           \"2.22533425939475124828943430510333464605535146852848680647615867629953075390889821397228584866395924176189346073006180260e2155\",\n           \"2.10905517593659363154553947631071808925462553114068144748077359132255993441363479041540672158497404660986163617828972963e2232\",\n           \"1.99885195510122536266653916064141606295420554580140619900425370702471778604391774578696867899999534265169574306808906810e2309\",\n           \"1.89440711840917173277691572886942144916664047407963356271198286654087884646102070148271284410118233470318337745546895603e2386\",\n           \"1.79541977639739687088375911648976940254141946934175300605485966288703931992861387257771264702798405630917098672594899744e2463\",\n           \"1.70160476180317540861346545791118106171203487587101437710693054174454895160403997508137760007058856854991413121389834429e2540\",\n           \"1.61269180804119796097157014527479883521656118500417752963675677684343588976915851637637232001139108420659882326614772004e2617\",\n           \"1.52842477060722969066998464046690349841548269556677423378408183476489015878816585045578141383463708674469365281537792914e2694\",\n           \"1.44856088916530600122626623629347336702026699647293500058111037526381692645547938577338582002157148103479049071921438452e2771\",\n           \"1.37287008819265239873777879432333192404914357037749380145412895230166352318128978403808382142784030558123748263528360645e2848\",\n           \"1.30113431416759441771790128053911040907207490879890145597562380328956450092799014856149474809345424672958343296615764490e2925\",\n           \"1.23314690739099822369963411660419632130352733806319401863570442920347696015409870236230656305563674376063778482449716744e3002\",\n           \"1.16871200663155636468514484039368694043851858077879103221831997264419096417014996945143145495038265243932745953706526253e3079\",\n           \"1.10764398487979357804590117089134596938734185016144401218934115168561552640448889215089150481162977776214124397487013110e3156\",\n           \"1.04976691458528698318220729857405616816444374000182094405930946710168752954926612218474430081526312018810817657409158490e3233\",\n           \"9.94914060836531582868347569174220216007647278536863127198023584205669825317884219144692385409156165042162234017403353704e3309\",\n           \"9.42927401023380446961314339401657458785389811652244742482194123119943160577946366372207045050095290781679375214307398844e3386\",\n           \"8.93657169598281164656322298275337750103095739790107943666668184304335665562867744740310577868880098719252549186849812451e3463\",\n           \"8.46961426624835911826517103631490619655296714141872141145089865045804196205328364155921945616925875458926717336478525196e3540\",\n           \"8.02705648870740089929294815816002943860908317454595055392168733404583122074223427054310572378841634984243492063192095337e3617\",\n           \"7.60762342267101369970765191988545810374824800500875923752736467467657167098026707905341603949108433696304383346239333297e3694\",\n           \"7.21010674617694221027190468649359000420209460539838589305387835463807416706224777302997789297329446308541513638035437482e3771\",\n           \"6.83336127500041943234365059231968669406267422759442985746460610830503287734479988530512309065240678799786759250323660701e3848\",\n       }};\n\n   T pi = static_cast<T>(\"3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609\");\n\n   unsigned max_err = 0;\n   for (unsigned k = 0; k < data.size(); k++)\n   {\n      T        val = exp(sqrt((pi * (100 * k)) * (100 * k)));\n      T        e   = relative_error(val, T(data[k]));\n      unsigned err = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         max_err = err;\n      }\n      val = exp(-sqrt((pi * (100 * k)) * (100 * k)));\n      e   = relative_error(val, T(1 / T(data[k])));\n      err = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         max_err = err;\n      }\n   }\n   std::cout << \"Max error was: \" << max_err << std::endl;\n#if defined(BOOST_INTEL) && defined(TEST_FLOAT128)\n   BOOST_TEST(max_err < 40000);\n#elif defined(TEST_CPP_BIN_FLOAT)\n   BOOST_TEST(max_err < 6200);\n#else\n   BOOST_TEST(max_err < 5000);\n#endif\n\n   static const boost::array<boost::array<T, 2>, 12> exact_data =\n       {{\n           {{std::ldexp(1.0, -50), static_cast<T>(\"1.00000000000000088817841970012562676935794497867573073630970950828771105957980924149923657574337470594698012676100224953\")}},\n           {{std::ldexp(1.0, -20), static_cast<T>(\"1.00000095367477115374544678824955687428365188553281789775169686343569285229334215539516690752571791280462887427635269562\")}},\n           {{std::ldexp(1.0, -10), static_cast<T>(\"1.00097703949241653524284529261160650646585162918174419940186408264916250428896869173656853690882467186075613761065459261\")}},\n           {{0.25, static_cast<T>(\"1.28402541668774148407342056806243645833628086528146308921750729687220776586723800275330641943955356890166283174967968731\")}},\n           {{0.5, static_cast<T>(\"1.64872127070012814684865078781416357165377610071014801157507931164066102119421560863277652005636664300286663775630779700\")}},\n           {{0.75, static_cast<T>(\"2.11700001661267466854536981983709561013449158470240342177913303081098453336401282000279156026661579821888590471901551426\")}},\n           {{10, static_cast<T>(\"22026.4657948067165169579006452842443663535126185567810742354263552252028185707925751991209681645258954515555010924578367\")}},\n           {{10.5, static_cast<T>(\"36315.5026742466377389120269013166179689315579671275857607480190550842856628099187749764427758174866310742771977376827512\")}},\n           {{25, static_cast<T>(\"7.20048993373858725241613514661261579152235338133952787362213864472320593107782569745000325654258093194727871848859163684e10\")}},\n           {{31.25, static_cast<T>(\"3.72994612957188849046766396046821396700589012875701157893019118883826370993674081486706667149871508642909416337810227575e13\")}},\n           {{static_cast<T>(\"65.8489821531948043946370515385267739671725127642242491414646009018723940871209979825570160646597753164901406969542\"), static_cast<T>(\"39614081257132168796771975168.0\")}},\n           {{static_cast<T>(\"65.15583497263485908521981941706859739909701262986399388734392089237900046515130326695115273766335662894813921593\"), static_cast<T>(\"19807040628566084398385987584.0\")}},\n       }};\n\n   max_err = 0;\n   for (unsigned k = 0; k < exact_data.size(); k++)\n   {\n      T        val = exp(exact_data[k][0]);\n      T        e   = relative_error(val, exact_data[k][1]);\n      unsigned err = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         max_err = err;\n      }\n      val = exp(-exact_data[k][0]);\n      e   = relative_error(val, T(1 / exact_data[k][1]));\n      err = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         max_err = err;\n      }\n   }\n   std::cout << \"Max error was: \" << max_err << std::endl;\n   BOOST_TEST(max_err < 60);\n\n   BOOST_TEST(exp(T(0)) == 1);\n\n   if (!boost::multiprecision::is_interval_number<T>::value)\n   {\n      T bug_case = -1.05 * log((std::numeric_limits<T>::max)());\n      for (unsigned i = 0; bug_case > -20 / std::numeric_limits<T>::epsilon(); ++i, bug_case *= 1.05)\n      {\n         if (std::numeric_limits<T>::has_infinity)\n         {\n            BOOST_CHECK_EQUAL(exp(bug_case), 0);\n         }\n         else\n         {\n            BOOST_CHECK_LE(exp(bug_case), (std::numeric_limits<T>::min)());\n         }\n      }\n      bug_case = log((std::numeric_limits<T>::max)()) / -1.0005;\n      for (unsigned i = 0; i < 20; ++i, bug_case /= 1.05)\n      {\n         BOOST_CHECK_GE(exp(bug_case), (std::numeric_limits<T>::min)());\n      }\n   }\n}\n\nint main()\n{\n#ifdef TEST_BACKEND\n   test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();\n#endif\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::mpf_float_50>();\n   test<boost::multiprecision::mpf_float_100>();\n#endif\n#ifdef TEST_MPFR_50\n   test<boost::multiprecision::mpfr_float_50>();\n   test<boost::multiprecision::mpfr_float_100>();\n#endif\n#ifdef TEST_MPFI_50\n   test<boost::multiprecision::mpfi_float_50>();\n   test<boost::multiprecision::mpfi_float_100>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>();\n   test<boost::multiprecision::cpp_dec_float_100>();\n#ifndef SLOW_COMPILER\n   // Some \"peculiar\" digit counts which stress our code:\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();\n   // Check low multiprecision digit counts.\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >();\n#endif\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_fixed_int.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//\n// Compare arithmetic results using fixed_int to GMP results.\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/fixed_int.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include \"test.hpp\"\n\ntemplate <class T>\nT generate_random(unsigned bits_wanted)\n{\n   static boost::random::mt19937               gen;\n   typedef boost::random::mt19937::result_type random_type;\n\n   T        max_val;\n   unsigned digits;\n   if (std::numeric_limits<T>::is_bounded && (bits_wanted == std::numeric_limits<T>::digits))\n   {\n      max_val = (std::numeric_limits<T>::max)();\n      digits  = std::numeric_limits<T>::digits;\n   }\n   else\n   {\n      max_val = T(1) << bits_wanted;\n      digits  = bits_wanted;\n   }\n\n   unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n   while ((random_type(1) << bits_per_r_val) > (gen.max)())\n      --bits_per_r_val;\n\n   unsigned terms_needed = digits / bits_per_r_val + 1;\n\n   T val = 0;\n   for (unsigned i = 0; i < terms_needed; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   val %= max_val;\n   return val;\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n   typedef number<fixed_int<1024, true> > packed_type;\n   unsigned                               last_error_count = 0;\n   for (int i = 0; i < 1000; ++i)\n   {\n      mpz_int a = generate_random<mpz_int>(1000);\n      mpz_int b = generate_random<mpz_int>(512);\n      mpz_int c = generate_random<mpz_int>(256);\n      mpz_int d = generate_random<mpz_int>(32);\n\n      int si = d.convert_to<int>();\n\n      packed_type a1 = a.str();\n      packed_type b1 = b.str();\n      packed_type c1 = c.str();\n      packed_type d1 = d.str();\n\n      BOOST_CHECK_EQUAL(a.str(), a1.str());\n      BOOST_CHECK_EQUAL(b.str(), b1.str());\n      BOOST_CHECK_EQUAL(c.str(), c1.str());\n      BOOST_CHECK_EQUAL(d.str(), d1.str());\n      BOOST_CHECK_EQUAL(mpz_int(a + b).str(), packed_type(a1 + b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(a - b).str(), packed_type(a1 - b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(mpz_int(-a) + b).str(), packed_type(packed_type(-a1) + b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(mpz_int(-a) - b).str(), packed_type(packed_type(-a1) - b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(c * d).str(), packed_type(c1 * d1).str());\n      BOOST_CHECK_EQUAL(mpz_int(c * -d).str(), packed_type(c1 * -d1).str());\n      BOOST_CHECK_EQUAL(mpz_int(-c * d).str(), packed_type(-c1 * d1).str());\n      BOOST_CHECK_EQUAL(mpz_int(b * c).str(), packed_type(b1 * c1).str());\n      BOOST_CHECK_EQUAL(mpz_int(a / b).str(), packed_type(a1 / b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(a / -b).str(), packed_type(a1 / -b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(-a / b).str(), packed_type(-a1 / b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(a / d).str(), packed_type(a1 / d1).str());\n      BOOST_CHECK_EQUAL(mpz_int(a % b).str(), packed_type(a1 % b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(a % -b).str(), packed_type(a1 % -b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(-a % b).str(), packed_type(-a1 % b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(a % d).str(), packed_type(a1 % d1).str());\n      // bitwise ops:\n      BOOST_CHECK_EQUAL(mpz_int(a | b).str(), packed_type(a1 | b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(a & b).str(), packed_type(a1 & b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(a ^ b).str(), packed_type(a1 ^ b1).str());\n      // Now check operations involving integers:\n      BOOST_CHECK_EQUAL(mpz_int(a + si).str(), packed_type(a1 + si).str());\n      BOOST_CHECK_EQUAL(mpz_int(a + -si).str(), packed_type(a1 + -si).str());\n      BOOST_CHECK_EQUAL(mpz_int(-a + si).str(), packed_type(-a1 + si).str());\n      BOOST_CHECK_EQUAL(mpz_int(si + a).str(), packed_type(si + a1).str());\n      BOOST_CHECK_EQUAL(mpz_int(a - si).str(), packed_type(a1 - si).str());\n      BOOST_CHECK_EQUAL(mpz_int(a - -si).str(), packed_type(a1 - -si).str());\n      BOOST_CHECK_EQUAL(mpz_int(-a - si).str(), packed_type(-a1 - si).str());\n      BOOST_CHECK_EQUAL(mpz_int(si - a).str(), packed_type(si - a1).str());\n      BOOST_CHECK_EQUAL(mpz_int(b * si).str(), packed_type(b1 * si).str());\n      BOOST_CHECK_EQUAL(mpz_int(b * -si).str(), packed_type(b1 * -si).str());\n      BOOST_CHECK_EQUAL(mpz_int(-b * si).str(), packed_type(-b1 * si).str());\n      BOOST_CHECK_EQUAL(mpz_int(si * b).str(), packed_type(si * b1).str());\n      BOOST_CHECK_EQUAL(mpz_int(a / si).str(), packed_type(a1 / si).str());\n      BOOST_CHECK_EQUAL(mpz_int(a / -si).str(), packed_type(a1 / -si).str());\n      BOOST_CHECK_EQUAL(mpz_int(-a / si).str(), packed_type(-a1 / si).str());\n      BOOST_CHECK_EQUAL(mpz_int(a % si).str(), packed_type(a1 % si).str());\n      BOOST_CHECK_EQUAL(mpz_int(a % -si).str(), packed_type(a1 % -si).str());\n      BOOST_CHECK_EQUAL(mpz_int(-a % si).str(), packed_type(-a1 % si).str());\n      BOOST_CHECK_EQUAL(mpz_int(a | si).str(), packed_type(a1 | si).str());\n      BOOST_CHECK_EQUAL(mpz_int(a & si).str(), packed_type(a1 & si).str());\n      BOOST_CHECK_EQUAL(mpz_int(a ^ si).str(), packed_type(a1 ^ si).str());\n      BOOST_CHECK_EQUAL(mpz_int(si | a).str(), packed_type(si | a1).str());\n      BOOST_CHECK_EQUAL(mpz_int(si & a).str(), packed_type(si & a1).str());\n      BOOST_CHECK_EQUAL(mpz_int(si ^ a).str(), packed_type(si ^ a1).str());\n      BOOST_CHECK_EQUAL(mpz_int(gcd(a, b)).str(), packed_type(gcd(a1, b1)).str());\n      BOOST_CHECK_EQUAL(mpz_int(lcm(c, d)).str(), packed_type(lcm(c1, d1)).str());\n\n      if (last_error_count != boost::detail::test_errors())\n      {\n         last_error_count = boost::detail::test_errors();\n         std::cout << std::hex << std::showbase;\n\n         std::cout << \"a    = \" << a << std::endl;\n         std::cout << \"a1   = \" << a1 << std::endl;\n         std::cout << \"b    = \" << b << std::endl;\n         std::cout << \"b1   = \" << b1 << std::endl;\n         std::cout << \"c    = \" << c << std::endl;\n         std::cout << \"c1   = \" << c1 << std::endl;\n         std::cout << \"d    = \" << d << std::endl;\n         std::cout << \"d1   = \" << d1 << std::endl;\n         std::cout << \"a + b   = \" << a + b << std::endl;\n         std::cout << \"a1 + b1 = \" << a1 + b1 << std::endl;\n         std::cout << std::dec;\n         std::cout << \"a - b   = \" << a - b << std::endl;\n         std::cout << \"a1 - b1 = \" << a1 - b1 << std::endl;\n         std::cout << \"-a + b   = \" << mpz_int(-a) + b << std::endl;\n         std::cout << \"-a1 + b1 = \" << packed_type(-a1) + b1 << std::endl;\n         std::cout << \"-a - b   = \" << mpz_int(-a) - b << std::endl;\n         std::cout << \"-a1 - b1 = \" << packed_type(-a1) - b1 << std::endl;\n         std::cout << \"c*d    = \" << c * d << std::endl;\n         std::cout << \"c1*d1  = \" << c1 * d1 << std::endl;\n         std::cout << \"b*c    = \" << b * c << std::endl;\n         std::cout << \"b1*c1  = \" << b1 * c1 << std::endl;\n         std::cout << \"a/b    = \" << a / b << std::endl;\n         std::cout << \"a1/b1  = \" << a1 / b1 << std::endl;\n         std::cout << \"a/d    = \" << a / d << std::endl;\n         std::cout << \"a1/d1  = \" << a1 / d1 << std::endl;\n         std::cout << \"a%b    = \" << a % b << std::endl;\n         std::cout << \"a1%b1  = \" << a1 % b1 << std::endl;\n         std::cout << \"a%d    = \" << a % d << std::endl;\n         std::cout << \"a1%d1  = \" << a1 % d1 << std::endl;\n      }\n   }\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_fixed_zero_precision_io.cpp",
    "content": "// Copyright John Maddock 2022.\n\n// Use, modification and distribution are subject to the\n// Boost Software License, Version 1.0.\n// (See accompanying file LICENSE_1_0.txt\n// or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n#define BOOST_CHRONO_HEADER_ONLY\n\n#ifdef TEST_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n#ifdef TEST_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#ifdef TEST_MPFR\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#ifdef TEST_MPF\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include <boost/chrono.hpp>\n#include \"test.hpp\"\n#include <boost/array.hpp>\n#include <iostream>\n#include <iomanip>\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\n#if defined(TEST_MPF)\ntemplate <unsigned N, boost::multiprecision::expression_template_option ET>\nbool has_bad_bankers_rounding(const boost::multiprecision::number<boost::multiprecision::gmp_float<N>, ET>&)\n{\n   return true;\n}\n#endif\ntemplate <class T>\nbool has_bad_bankers_rounding(const T&)\n{\n   return false;\n}\n\nbool is_bankers_rounding_error(const std::string& s, const std::string& expect)\n{\n   // This check isn't foolproof: that would require *much* more sophisticated code!!!\n   std::string::size_type l = expect.size();\n   if (l != s.size())\n      return false;\n   std::string::size_type len = s.find('e');\n   if (len == std::string::npos)\n      len = l - 1;\n   else\n      --len;\n   for (unsigned i = 0; i < len; ++i)\n   {\n      char c1 = s[i];\n      char c2 = expect[i];\n      if (c1 != c2)\n         return false;\n   }\n   if (s[len] != expect[len] + 1)\n      return false;\n   return true;\n}\n\ntemplate <class Clock>\nstruct stopwatch\n{\n   typedef typename Clock::duration duration;\n   stopwatch()\n   {\n      m_start = Clock::now();\n   }\n   duration elapsed()\n   {\n      return Clock::now() - m_start;\n   }\n   void reset()\n   {\n      m_start = Clock::now();\n   }\n\n private:\n   typename Clock::time_point m_start;\n};\n\ntemplate <class T>\nstruct exponent_type\n{\n   typedef int type;\n};\ntemplate <class T, boost::multiprecision::expression_template_option ET>\nstruct exponent_type<boost::multiprecision::number<T, ET> >\n{\n   typedef typename T::exponent_type type;\n};\n\ntemplate <class T>\nT generate_random_float()\n{\n   BOOST_MATH_STD_USING\n   typedef typename exponent_type<T>::type e_type;\n   static boost::random::mt19937           gen;\n   T                                       val      = gen();\n   T                                       prev_val = -1;\n   while (val != prev_val)\n   {\n      val *= (gen.max)();\n      prev_val = val;\n      val += gen();\n   }\n   e_type e;\n   val = frexp(val, &e);\n\n   static const int                                       max_exponent_value = (std::min)(static_cast<int>(std::numeric_limits<T>::max_exponent - std::numeric_limits<T>::digits - 20), 40);\n   static boost::random::uniform_int_distribution<e_type> ui(0, max_exponent_value);\n   return ldexp(val, ui(gen));\n}\n\ntemplate <class Float>\nvoid test_fixed_io()\n{\n   std::cout << \"Testing type \" << typeid(Float).name() << std::endl;\n   std::cout << \"digits = \" << std::numeric_limits<Float>::digits << std::endl;\n   std::cout << \"digits10 = \" << std::numeric_limits<Float>::digits10 << std::endl;\n   std::cout << \"max_digits10 = \" << std::numeric_limits<Float>::max_digits10 << std::endl;\n\n   stopwatch<boost::chrono::high_resolution_clock> w;\n\n   int count = 0;\n\n#ifndef CI_SUPPRESS_KNOWN_ISSUES\n   while (boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() < 200)\n#else\n   while (boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() < 50)\n#endif\n   {\n      double val = generate_random_float<double>();\n      Float  f(val);\n#ifdef BOOST_MSVC\n      if (val > 0.5 && val < 1)\n         val = 1;\n#endif\n      std::stringstream ss1, ss2;\n      ss1 << std::fixed << std::setprecision(0) << val;\n      ss2 << std::fixed << std::setprecision(0) << f;\n      if (ss1.str() != ss2.str())\n      {\n         if (has_bad_bankers_rounding(Float()) && is_bankers_rounding_error(ss2.str(), ss1.str()))\n         {\n            std::cout << \"Ignoring bankers-rounding error with GMP mp_f.\\n\";\n         }\n         else\n         {\n            std::cout << std::setprecision(20) << \"Testing value \" << val << std::endl;\n            std::cout << \"Got:      \" << ss2.str() << std::endl;\n            std::cout << \"Expected: \" << ss1.str() << std::endl;\n            ++boost::detail::test_errors();\n            Float(val).str(0, std::ios_base::fixed);\n         }\n      }\n      ++count;\n      if (boost::detail::test_errors() > 100)\n         break;\n   }\n\n   std::cout << \"Execution time = \" << boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() << \"s\" << std::endl;\n   std::cout << \"Total values tested: \" << count << std::endl;\n}\n\n\nint main()\n{\n#if defined(BOOST_MSVC) && (BOOST_MSVC < 1920)\n   std::cout << \"MSVC prior to 14.2 does not perform bankers rounding for double IO, as a result all our test cases are incorrect, so there's nothing we can productively test here.\" << std::endl;\n#else\n   using namespace boost::multiprecision;\n#ifdef TEST_BIN_FLOAT\n   test_fixed_io<number<cpp_bin_float<113, digit_base_2, void, std::int16_t> > >();\n#endif\n#ifdef TEST_DEC_FLOAT\n   test_fixed_io<cpp_dec_float_50>();\n#endif\n#ifdef TEST_MPFR\n   test_fixed_io<boost::multiprecision::mpfr_float_50>();\n#endif\n#ifdef TEST_MPF\n   test_fixed_io<boost::multiprecision::mpf_float_50>();\n#endif\n#ifdef TEST_FLOAT128\n   test_fixed_io<boost::multiprecision::float128>();\n#endif\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_float128_serial.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2013 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//\n// Compare arithmetic results using fixed_int to GMP results.\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/float128.hpp>\n#include \"test_float_serial.hpp\"\n\nint main()\n{\n   using namespace boost::multiprecision;\n   test<float128>();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_float_conversions.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2015 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/math/constants/constants.hpp>\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n   static_assert((std::is_convertible<float, cpp_bin_float_single>::value), \"Error check\");\n   static_assert(!(std::is_convertible<double, cpp_bin_float_single>::value), \"Error check\");\n   static_assert(!(std::is_convertible<long double, cpp_bin_float_single>::value), \"Error check\");\n\n   cpp_bin_float_single s = boost::math::constants::pi<cpp_bin_float_single>();\n   std::cout << s << std::endl;\n\n   typedef number<backends::cpp_bin_float<11, backends::digit_base_2, void, boost::int8_t, -14, 15>, et_off> cpp_bin_float_half;\n\n   static_assert(!(std::is_convertible<float, cpp_bin_float_half>::value), \"Error check\");\n   static_assert(!(std::is_convertible<double, cpp_bin_float_half>::value), \"Error check\");\n   static_assert(!(std::is_convertible<long double, cpp_bin_float_half>::value), \"Error check\");\n#ifdef BOOST_HAS_FLOAT128\n   static_assert(!(std::is_convertible<__float128, cpp_bin_float_half>::value), \"Error check\");\n#endif\n\n   cpp_bin_float_half hs = boost::math::constants::pi<cpp_bin_float_half>();\n   std::cout << hs << std::endl;\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_float_io.cpp",
    "content": "// Copyright John Maddock 2011.\n\n// Use, modification and distribution are subject to the\n// Boost Software License, Version 1.0.\n// (See accompanying file LICENSE_1_0.txt\n// or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#if !defined(TEST_MPF_50) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128)\n#define TEST_MPF_50\n#define TEST_CPP_DEC_FLOAT\n#define TEST_MPFR_50\n#define TEST_MPFI_50\n#define TEST_FLOAT128\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(TEST_MPFR_50)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_MPFI_50)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include \"test.hpp\"\n#include <boost/array.hpp>\n#include <iostream>\n#include <iomanip>\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\n#if defined(TEST_MPF_50)\ntemplate <unsigned N, boost::multiprecision::expression_template_option ET>\nbool has_bad_bankers_rounding(const boost::multiprecision::number<boost::multiprecision::gmp_float<N>, ET>&)\n{\n   return true;\n}\n#endif\n#if defined(TEST_FLOAT128) && defined(BOOST_INTEL)\nbool has_bad_bankers_rounding(const boost::multiprecision::float128&)\n{\n   return true;\n}\n#endif\ntemplate <class T>\nbool has_bad_bankers_rounding(const T&)\n{\n   return false;\n}\n\nbool is_bankers_rounding_error(const std::string& s, const char* expect)\n{\n   // This check isn't foolproof: that would require *much* more sophisticated code!!!\n   std::string::size_type l = std::strlen(expect);\n   if (l != s.size())\n      return false;\n   std::string::size_type len = s.find('e');\n   if (len == std::string::npos)\n      len = l - 1;\n   else\n      --len;\n   if (s.compare(0, len, expect, len))\n      return false;\n   if (s[len] != expect[len] + 1)\n      return false;\n   return true;\n}\n\nvoid print_flags(std::ios_base::fmtflags f)\n{\n   std::cout << \"Formatting flags were: \";\n   if (f & std::ios_base::scientific)\n      std::cout << \"scientific \";\n   if (f & std::ios_base::fixed)\n      std::cout << \"fixed \";\n   if (f & std::ios_base::showpoint)\n      std::cout << \"showpoint \";\n   if (f & std::ios_base::showpos)\n      std::cout << \"showpos \";\n   std::cout << std::endl;\n}\n\ntemplate <class T>\nvoid test()\n{\n   typedef T                                mp_t;\n   boost::array<std::ios_base::fmtflags, 9> f =\n       {{std::ios_base::fmtflags(0), std::ios_base::showpoint, std::ios_base::showpos, std::ios_base::scientific, std::ios_base::scientific | std::ios_base::showpos,\n         std::ios_base::scientific | std::ios_base::showpoint, std::ios_base::fixed, std::ios_base::fixed | std::ios_base::showpoint,\n         std::ios_base::fixed | std::ios_base::showpos}};\n\n   boost::array<boost::array<const char*, 13 * 9>, 40> string_data = {{\n#include \"libs/multiprecision/test/string_data.ipp\"\n   }};\n\n   double num   = 123456789.0;\n   double denom = 1;\n   double val   = num;\n   for (unsigned j = 0; j < 40; ++j)\n   {\n      unsigned col = 0;\n      for (unsigned prec = 1; prec < 14; ++prec)\n      {\n         for (unsigned i = 0; i < f.size(); ++i, ++col)\n         {\n            std::stringstream ss;\n            ss.precision(prec);\n            ss.flags(f[i]);\n            ss << mp_t(val);\n            const char* expect = string_data[j][col];\n            if (ss.str() != expect)\n            {\n               if (has_bad_bankers_rounding(mp_t()) && is_bankers_rounding_error(ss.str(), expect))\n               {\n                  std::cout << \"Ignoring bankers-rounding error with GMP mp_f.\\n\";\n               }\n               else\n               {\n                  std::cout << std::setprecision(20) << \"Testing value \" << val << std::endl;\n                  print_flags(f[i]);\n                  std::cout << \"Precision is: \" << prec << std::endl;\n                  std::cout << \"Got:      \" << ss.str() << std::endl;\n                  std::cout << \"Expected: \" << expect << std::endl;\n                  ++boost::detail::test_errors();\n                  mp_t(val).str(prec, f[i]); // for debugging\n               }\n            }\n         }\n      }\n      num = -num;\n      if (j & 1)\n         denom *= 8;\n      val = num / denom;\n   }\n\n   boost::array<const char*, 13 * 9> zeros =\n       {{\"0\", \"0.\", \"+0\", \"0.0e+00\", \"+0.0e+00\", \"0.0e+00\", \"0.0\", \"0.0\", \"+0.0\", \"0\", \"0.0\", \"+0\", \"0.00e+00\", \"+0.00e+00\", \"0.00e+00\", \"0.00\", \"0.00\", \"+0.00\", \"0\", \"0.00\", \"+0\", \"0.000e+00\", \"+0.000e+00\", \"0.000e+00\", \"0.000\", \"0.000\", \"+0.000\", \"0\", \"0.000\", \"+0\", \"0.0000e+00\", \"+0.0000e+00\", \"0.0000e+00\", \"0.0000\", \"0.0000\", \"+0.0000\", \"0\", \"0.0000\", \"+0\", \"0.00000e+00\", \"+0.00000e+00\", \"0.00000e+00\", \"0.00000\", \"0.00000\", \"+0.00000\", \"0\", \"0.00000\", \"+0\", \"0.000000e+00\", \"+0.000000e+00\", \"0.000000e+00\", \"0.000000\", \"0.000000\", \"+0.000000\", \"0\", \"0.000000\", \"+0\", \"0.0000000e+00\", \"+0.0000000e+00\", \"0.0000000e+00\", \"0.0000000\", \"0.0000000\", \"+0.0000000\", \"0\", \"0.0000000\", \"+0\", \"0.00000000e+00\", \"+0.00000000e+00\", \"0.00000000e+00\", \"0.00000000\", \"0.00000000\", \"+0.00000000\", \"0\", \"0.00000000\", \"+0\", \"0.000000000e+00\", \"+0.000000000e+00\", \"0.000000000e+00\", \"0.000000000\", \"0.000000000\", \"+0.000000000\", \"0\", \"0.000000000\", \"+0\", \"0.0000000000e+00\", \"+0.0000000000e+00\", \"0.0000000000e+00\", \"0.0000000000\", \"0.0000000000\", \"+0.0000000000\", \"0\", \"0.0000000000\", \"+0\", \"0.00000000000e+00\", \"+0.00000000000e+00\", \"0.00000000000e+00\", \"0.00000000000\", \"0.00000000000\", \"+0.00000000000\", \"0\", \"0.00000000000\", \"+0\", \"0.000000000000e+00\", \"+0.000000000000e+00\", \"0.000000000000e+00\", \"0.000000000000\", \"0.000000000000\", \"+0.000000000000\", \"0\", \"0.000000000000\", \"+0\", \"0.0000000000000e+00\", \"+0.0000000000000e+00\", \"0.0000000000000e+00\", \"0.0000000000000\", \"0.0000000000000\", \"+0.0000000000000\"}};\n\n   unsigned col = 0;\n   val          = 0;\n   for (unsigned prec = 1; prec < 14; ++prec)\n   {\n      for (unsigned i = 0; i < f.size(); ++i, ++col)\n      {\n         std::stringstream ss;\n         ss.precision(prec);\n         ss.flags(f[i]);\n         ss << mp_t(val);\n         const char* expect = zeros[col];\n         if (ss.str() != expect)\n         {\n            std::cout << std::setprecision(20) << \"Testing value \" << val << std::endl;\n            print_flags(f[i]);\n            std::cout << \"Precision is: \" << prec << std::endl;\n            std::cout << \"Got:      \" << ss.str() << std::endl;\n            std::cout << \"Expected: \" << expect << std::endl;\n            ++boost::detail::test_errors();\n            mp_t(val).str(prec, f[i]); // for debugging\n         }\n      }\n   }\n\n   if (std::numeric_limits<mp_t>::has_infinity)\n   {\n      T val = std::numeric_limits<T>::infinity();\n      BOOST_CHECK_EQUAL(val.str(), \"inf\");\n      BOOST_CHECK_EQUAL(val.str(0, std::ios_base::showpos), \"+inf\");\n      val = -val;\n      BOOST_CHECK_EQUAL(val.str(), \"-inf\");\n      BOOST_CHECK_EQUAL(val.str(0, std::ios_base::showpos), \"-inf\");\n\n      val = static_cast<T>(\"inf\");\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      val = static_cast<T>(\"+inf\");\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      val = static_cast<T>(\"-inf\");\n      BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n   }\n   if (std::numeric_limits<mp_t>::has_quiet_NaN)\n   {\n      T val = std::numeric_limits<T>::quiet_NaN();\n      BOOST_CHECK_EQUAL(val.str(), \"nan\");\n      val = static_cast<T>(\"nan\");\n      BOOST_CHECK((boost::math::isnan)(val));\n   }\n   //\n   // Bug cases:\n   //\n   // https://github.com/boostorg/multiprecision/issues/113\n   //\n   {\n      T val(\"99.9809\");\n      BOOST_CHECK_EQUAL(val.str(3, std::ios_base::fixed), \"99.981\");\n   }\n}\n\ntemplate <class T>\nT generate_random()\n{\n   typedef typename T::backend_type::exponent_type e_type;\n   static boost::random::mt19937                   gen;\n   T                                               val      = gen();\n   T                                               prev_val = -1;\n   while (val != prev_val)\n   {\n      val *= (gen.max)();\n      prev_val = val;\n      val += gen();\n   }\n   e_type e;\n   val = frexp(val, &e);\n\n   static boost::random::uniform_int_distribution<e_type> ui(0, std::numeric_limits<T>::max_exponent - 10);\n   return ldexp(val, ui(gen));\n}\n\ntemplate <class T>\nstruct max_digits10_proxy\n{\n   static const unsigned value = std::numeric_limits<T>::digits10 + 5;\n};\n#ifdef TEST_CPP_DEC_FLOAT\ntemplate <unsigned D, boost::multiprecision::expression_template_option ET>\nstruct max_digits10_proxy<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D>, ET> >\n{\n   static const unsigned value = std::numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D>, ET> >::max_digits10;\n};\n#endif\n#ifdef TEST_MPF_50\ntemplate <unsigned D, boost::multiprecision::expression_template_option ET>\nstruct max_digits10_proxy<boost::multiprecision::number<boost::multiprecision::gmp_float<D>, ET> >\n{\n   static const unsigned value = std::numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<D>, ET> >::max_digits10;\n};\n#endif\n#ifdef TEST_MPFR_50\ntemplate <unsigned D, boost::multiprecision::expression_template_option ET>\nstruct max_digits10_proxy<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D>, ET> >\n{\n   static const unsigned value = std::numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D>, ET> >::max_digits10;\n};\n#endif\n\ntemplate <class T>\nvoid do_round_trip(const T& val, std::ios_base::fmtflags f)\n{\n   std::stringstream ss;\n   ss << std::setprecision(std::numeric_limits<T>::max_digits10);\n   ss.flags(f);\n   ss << val;\n   T new_val = static_cast<T>(ss.str());\n   BOOST_CHECK_EQUAL(new_val, val);\n   new_val = static_cast<T>(val.str(f & std::ios_base::fixed ? std::numeric_limits<T>::max_digits10 : 0, f));\n   BOOST_CHECK_EQUAL(new_val, val);\n}\n\ntemplate <class T>\nvoid do_round_trip(const T& val)\n{\n   do_round_trip(val, std::ios_base::fmtflags(0));\n   do_round_trip(val, std::ios_base::fmtflags(std::ios_base::scientific));\n   if ((fabs(val) > 1) && (fabs(val) < 1e100))\n      do_round_trip(val, std::ios_base::fmtflags(std::ios_base::fixed));\n}\n\ntemplate <class T>\nvoid test_round_trip()\n{\n   for (unsigned i = 0; i < 1000; ++i)\n   {\n      T val = generate_random<T>();\n      do_round_trip(val);\n      do_round_trip(T(-val));\n      do_round_trip(T(1 / val));\n      do_round_trip(T(-1 / val));\n   }\n}\n\ntemplate<typename T>\nvoid test_to_string()\n{\n   using std::to_string;\n   T x0{\"23.43\"};\n   BOOST_CHECK_EQUAL(to_string(x0), \"23.430000\");\n\n   T x1{\"1e-9\"};\n   BOOST_CHECK_EQUAL(to_string(x1), \"0.000000\");\n\n   T x2{\"123456789\"};\n   BOOST_CHECK_EQUAL(to_string(x2), \"123456789.000000\");\n}\n\n#ifdef TEST_FLOAT128\nvoid test_hexadecimal_floating_point()\n{\n   using boost::multiprecision::float128;\n\n   float128 x = 0x1p+0Q;\n\n   std::string s = x.str(0, std::ios_base::fmtflags(std::ios_base::fixed | std::ios_base::scientific));\n   BOOST_CHECK_EQUAL(s, \"0x1p+0\");\n\n   s = x.str(0, std::ios_base::fmtflags(std::ios_base::floatfield));\n   BOOST_CHECK_EQUAL(s, \"0x1p+0\");\n\n   x = -1;\n   s = x.str(0, std::ios_base::fmtflags(std::ios_base::floatfield));\n   BOOST_CHECK_EQUAL(s, \"-0x1p+0\");\n\n   // hexadecimal representation of pi; test a round trip:\n   float128 pi1 = 0x1.921fb54442d18469898cc51701b8p+1Q;\n   s            = pi1.str(0, std::ios_base::fmtflags(std::ios_base::floatfield));\n   float128 pi2(s);\n   BOOST_CHECK_EQUAL(pi1, pi2);\n}\n#endif\n\nint main()\n{\n#ifdef TEST_MPFR_50\n   test<boost::multiprecision::mpfr_float_50>();\n   test<boost::multiprecision::mpfr_float_100>();\n\n   test_round_trip<boost::multiprecision::mpfr_float_50>();\n   test_round_trip<boost::multiprecision::mpfr_float_100>();\n\n   test_to_string<boost::multiprecision::mpfr_float_50>();\n   test_to_string<boost::multiprecision::mpfr_float_100>();\n\n#endif\n#ifdef TEST_MPFI_50\n   test<boost::multiprecision::mpfr_float_50>();\n   test<boost::multiprecision::mpfr_float_100>();\n\n   test_round_trip<boost::multiprecision::mpfr_float_50>();\n   test_round_trip<boost::multiprecision::mpfr_float_100>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>();\n   test<boost::multiprecision::cpp_dec_float_100>();\n\n   // cpp_dec_float has extra guard digits that messes this up:\n   test_round_trip<boost::multiprecision::cpp_dec_float_50>();\n   test_round_trip<boost::multiprecision::cpp_dec_float_100>();\n\n   test_to_string<boost::multiprecision::cpp_dec_float_50>();\n   test_to_string<boost::multiprecision::cpp_dec_float_100>();\n\n#endif\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::mpf_float_50>();\n   test<boost::multiprecision::mpf_float_100>();\n   /*\n   // I can't get this to work with mpf_t - mpf_str appears\n   // not to actually print enough decimal digits:\n   test_round_trip<boost::multiprecision::mpf_float_50>();\n   test_round_trip<boost::multiprecision::mpf_float_100>();\n   */\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n   test_hexadecimal_floating_point();\n   test_to_string<boost::multiprecision::float128>();\n#ifndef BOOST_INTEL\n   test_round_trip<boost::multiprecision::float128>();\n#endif\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_float_serial.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2013 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include \"timer.hpp\"\n#include \"test.hpp\"\n\n#include <iostream>\n#include <iomanip>\n#include <sstream>\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/archive/binary_iarchive.hpp>\n#include <boost/archive/binary_oarchive.hpp>\n#include <boost/archive/xml_iarchive.hpp>\n#include <boost/archive/xml_oarchive.hpp>\n#include <boost/exception/all.hpp>\n\n#ifndef BOOST_MP_TEST_FLOAT_SERIAL_HPP\n#define BOOST_MP_TEST_FLOAT_SERIAL_HPP\n\ntemplate <class T>\nT generate_random(unsigned /*bits_wanted*/)\n{\n   typedef typename T::backend_type::exponent_type e_type;\n   static boost::random::mt19937                   gen;\n   T                                               val      = gen();\n   T                                               prev_val = -1;\n   while (val != prev_val)\n   {\n      val *= (gen.max)();\n      prev_val = val;\n      val += gen();\n   }\n   e_type e;\n   val = frexp(val, &e);\n\n   static boost::random::uniform_int_distribution<e_type> ui(std::numeric_limits<T>::min_exponent + 1, std::numeric_limits<T>::max_exponent - 1);\n   return ldexp(val, ui(gen));\n}\n\ntemplate <class T>\nvoid test()\n{\n   timer tim;\n\n   while (true)\n   {\n      T           val     = generate_random<T>(boost::math::tools::digits<T>());\n      int         test_id = 0;\n      std::string stream_contents;\n#ifndef BOOST_NO_EXCEPTIONS\n      try\n      {\n#endif\n         test_id = 0;\n         {\n            std::stringstream             ss(std::ios_base::in | std::ios_base::out | std::ios_base::binary);\n            boost::archive::text_oarchive oa(ss);\n            oa << static_cast<const T&>(val);\n            stream_contents = ss.str();\n            boost::archive::text_iarchive ia(ss);\n            T                             val2;\n            ia >> val2;\n            BOOST_CHECK_EQUAL(val, val2);\n         }\n         {\n            std::stringstream ss(std::ios_base::in | std::ios_base::out | std::ios_base::binary);\n            {\n               boost::archive::xml_oarchive oa(ss);\n               oa << boost::serialization::make_nvp(\"value\", static_cast<const T&>(val));\n               stream_contents = ss.str();\n            }\n            boost::archive::xml_iarchive ia(ss);\n            T                            val2;\n            ia >> boost::serialization::make_nvp(\"value\", val2);\n            BOOST_CHECK_EQUAL(val, val2);\n         }\n         {\n            std::stringstream ss(std::ios_base::in | std::ios_base::out | std::ios_base::binary);\n            ++test_id;\n            boost::archive::binary_oarchive ba(ss);\n            ba << static_cast<const T&>(val);\n            stream_contents = ss.str();\n            boost::archive::binary_iarchive ib(ss);\n            T                               val2;\n            ib >> val2;\n            BOOST_CHECK_EQUAL(val, val2);\n         }\n         {\n            std::stringstream ss(std::ios_base::in | std::ios_base::out | std::ios_base::binary);\n            val = -val;\n            ++test_id;\n            boost::archive::text_oarchive oa2(ss);\n            oa2 << static_cast<const T&>(val);\n            stream_contents = ss.str();\n            boost::archive::text_iarchive ia2(ss);\n            T                             val2;\n            ia2 >> val2;\n            BOOST_CHECK_EQUAL(val, val2);\n         }\n         {\n            std::stringstream ss(std::ios_base::in | std::ios_base::out | std::ios_base::binary);\n            ++test_id;\n            {\n               boost::archive::xml_oarchive oa2(ss);\n               oa2 << boost::serialization::make_nvp(\"value\", static_cast<const T&>(val));\n               stream_contents = ss.str();\n            }\n            boost::archive::xml_iarchive ia2(ss);\n            T                            val2;\n            ia2 >> boost::serialization::make_nvp(\"value\", val2);\n            BOOST_CHECK_EQUAL(val, val2);\n         }\n         {\n            std::stringstream ss(std::ios_base::in | std::ios_base::out | std::ios_base::binary);\n            ++test_id;\n            boost::archive::binary_oarchive ba2(ss);\n            ba2 << static_cast<const T&>(val);\n            stream_contents = ss.str();\n            boost::archive::binary_iarchive ib2(ss);\n            T                               val2;\n            ib2 >> val2;\n            BOOST_CHECK_EQUAL(val, val2);\n         }\n#ifndef BOOST_NO_EXCEPTIONS\n      }\n      catch (const boost::exception& e)\n      {\n         std::cout << \"Caught boost::exception with:\\n\";\n         std::cout << diagnostic_information(e);\n         std::cout << \"Failed test ID = \" << test_id << std::endl;\n         std::cout << \"Stream contents were: \\n\"\n                   << stream_contents << std::endl;\n         ++boost::detail::test_errors();\n         break;\n      }\n      catch (const std::exception& e)\n      {\n         std::cout << \"Caught std::exception with:\\n\";\n         std::cout << e.what() << std::endl;\n         std::cout << \"Failed test ID = \" << test_id << std::endl;\n         std::cout << \"Stream contents were: \\n\"\n                   << stream_contents << std::endl;\n         ++boost::detail::test_errors();\n         break;\n      }\n#endif\n      //\n      // Check to see if test is taking too long.\n      // Tests run on the compiler farm time out after 300 seconds,\n      // so don't get too close to that:\n      //\n#ifndef CI_SUPPRESS_KNOWN_ISSUES\n      if (tim.elapsed() > 150)\n#else\n      if (tim.elapsed() > 25)\n#endif\n      {\n         std::cout << \"Timeout reached, aborting tests now....\\n\";\n         break;\n      }\n   }\n}\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_fpclassify.cpp",
    "content": "//  Copyright John Maddock 2006.\n//  Copyright Paul A. Bristow 2007\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <cmath>\n#include <math.h>\n#include <boost/limits.hpp>\n#include <boost/math/special_functions/fpclassify.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPQ) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n#define TEST_MPFR_50\n#define TEST_MPFI_50\n#define TEST_BACKEND\n#define TEST_CPP_DEC_FLOAT\n#define TEST_FLOAT128\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_MPFR_50\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#ifdef TEST_MPFI_50\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n\n#ifdef _MSC_VER\n#pragma warning(disable : 4127) //  conditional expression is constant\n#endif\n\nconst char* method_name(const boost::math::detail::native_tag&)\n{\n   return \"Native\";\n}\n\nconst char* method_name(const boost::math::detail::generic_tag<true>&)\n{\n   return \"Generic (with numeric limits)\";\n}\n\nconst char* method_name(const boost::math::detail::generic_tag<false>&)\n{\n   return \"Generic (without numeric limits)\";\n}\n\nconst char* method_name(const boost::math::detail::ieee_tag&)\n{\n   return \"IEEE std\";\n}\n\nconst char* method_name(const boost::math::detail::ieee_copy_all_bits_tag&)\n{\n   return \"IEEE std, copy all bits\";\n}\n\nconst char* method_name(const boost::math::detail::ieee_copy_leading_bits_tag&)\n{\n   return \"IEEE std, copy leading bits\";\n}\n\ntemplate <class T>\nvoid test()\n{\n   T t = 2;\n   T u = 2;\n   BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_NORMAL);\n   BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_NORMAL);\n   BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), true);\n   BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), true);\n   BOOST_CHECK_EQUAL((::boost::math::isinf)(t), false);\n   BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), false);\n   BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false);\n   BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false);\n   BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), true);\n   BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), true);\n   BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (::boost::math::fpclassify)(t + 0));\n   if (std::numeric_limits<T>::is_specialized)\n   {\n      t = (std::numeric_limits<T>::max)();\n      BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_NORMAL);\n      BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_NORMAL);\n      BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), true);\n      BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), true);\n      BOOST_CHECK_EQUAL((::boost::math::isinf)(t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), true);\n      BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), true);\n      BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (::boost::math::fpclassify)(t + 0));\n      t = (std::numeric_limits<T>::min)();\n      BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_NORMAL);\n      BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_NORMAL);\n      BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), true);\n      BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), true);\n      BOOST_CHECK_EQUAL((::boost::math::isinf)(t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), true);\n      BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), true);\n      BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (::boost::math::fpclassify)(t + 0));\n   }\n   if (std::numeric_limits<T>::has_denorm)\n   {\n      t = (std::numeric_limits<T>::min)();\n      t /= 2;\n      if (t != 0)\n      {\n         BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_SUBNORMAL);\n         BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_SUBNORMAL);\n         BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), true);\n         BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), true);\n         BOOST_CHECK_EQUAL((::boost::math::isinf)(t), false);\n         BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), false);\n         BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false);\n         BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false);\n         BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), false);\n         BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), false);\n         BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (::boost::math::fpclassify)(t + 0));\n      }\n      t = std::numeric_limits<T>::denorm_min();\n      if ((t != 0) && (t < (std::numeric_limits<T>::min)()))\n      {\n         BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_SUBNORMAL);\n         BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_SUBNORMAL);\n         BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), true);\n         BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), true);\n         BOOST_CHECK_EQUAL((::boost::math::isinf)(t), false);\n         BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), false);\n         BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false);\n         BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false);\n         BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), false);\n         BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), false);\n         BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (::boost::math::fpclassify)(t + 0));\n      }\n   }\n   else\n   {\n      std::cout << \"Denormalised forms not tested\" << std::endl;\n   }\n   t = 0;\n   BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_ZERO);\n   BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_ZERO);\n   BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), true);\n   BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), true);\n   BOOST_CHECK_EQUAL((::boost::math::isinf)(t), false);\n   BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), false);\n   BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false);\n   BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false);\n   BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), false);\n   BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), false);\n   BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (::boost::math::fpclassify)(t + 0));\n   t /= -u; // create minus zero if it exists\n   BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_ZERO);\n   BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_ZERO);\n   BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), true);\n   BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), true);\n   BOOST_CHECK_EQUAL((::boost::math::isinf)(t), false);\n   BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), false);\n   BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false);\n   BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false);\n   BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), false);\n   BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), false);\n   BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (::boost::math::fpclassify)(t + 0));\n   // infinity:\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      // At least one std::numeric_limits<T>::infinity)() returns zero\n      // (Compaq true64 cxx), hence the check.\n      t = (std::numeric_limits<T>::infinity)();\n      BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_INFINITE);\n      BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_INFINITE);\n      BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isinf)(t), true);\n      BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), true);\n      BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), false);\n      BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (::boost::math::fpclassify)(t + 0));\n#if !defined(BOOST_BORLANDC) && !(defined(__DECCXX) && !defined(_IEEE_FP))\n      // divide by zero on Borland triggers a C++ exception :-(\n      // divide by zero on Compaq CXX triggers a C style signal :-(\n      t = 2;\n      u = 0;\n      t /= u;\n      BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_INFINITE);\n      BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_INFINITE);\n      BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isinf)(t), true);\n      BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), true);\n      BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), false);\n      BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (::boost::math::fpclassify)(t + 0));\n      t = -2;\n      t /= u;\n      BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_INFINITE);\n      BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_INFINITE);\n      BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isinf)(t), true);\n      BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), true);\n      BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), false);\n      BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (::boost::math::fpclassify)(t + 0));\n#else\n      std::cout << \"Infinities from divide by zero not tested\" << std::endl;\n#endif\n   }\n   else\n   {\n      std::cout << \"Infinity not tested\" << std::endl;\n   }\n#ifndef BOOST_BORLANDC\n   // NaN's:\n   // Note that Borland throws an exception if we even try to obtain a Nan\n   // by calling std::numeric_limits<T>::quiet_NaN() !!!!!!!\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      t = std::numeric_limits<T>::quiet_NaN();\n      BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_NAN);\n      BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_NAN);\n      BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isinf)(t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isnan)(t), true);\n      BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), true);\n      BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), false);\n   }\n   else\n   {\n      std::cout << \"Quiet NaN's not tested\" << std::endl;\n   }\n   if (std::numeric_limits<T>::has_signaling_NaN)\n   {\n      t = std::numeric_limits<T>::signaling_NaN();\n      BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_NAN);\n      BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_NAN);\n      BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isinf)(t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isnan)(t), true);\n      BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), true);\n      BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), false);\n      BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), false);\n   }\n   else\n   {\n      std::cout << \"Signaling NaN's not tested\" << std::endl;\n   }\n#endif\n   //\n   // Try sign manipulation functions as well:\n   //\n   T one(1), minus_one(-1), zero(0);\n   BOOST_CHECK((::boost::math::sign)(one) > 0);\n   BOOST_CHECK((::boost::math::sign)(minus_one) < 0);\n   BOOST_CHECK((::boost::math::sign)(zero) == 0);\n   BOOST_CHECK((::boost::math::sign)(one + 2) > 0);\n   BOOST_CHECK((::boost::math::sign)(minus_one - 30) < 0);\n   BOOST_CHECK((::boost::math::sign)(-zero) == 0);\n\n   BOOST_CHECK((::boost::math::signbit)(one) == 0);\n   BOOST_CHECK((::boost::math::signbit)(minus_one) > 0);\n   BOOST_CHECK((::boost::math::signbit)(zero) == 0);\n   BOOST_CHECK((::boost::math::signbit)(one + 2) == 0);\n   BOOST_CHECK((::boost::math::signbit)(minus_one - 30) > 0);\n   //BOOST_CHECK((::boost::math::signbit)(-zero) == 0);\n\n   BOOST_CHECK((::boost::math::signbit)(boost::math::changesign(one)) > 0);\n   BOOST_CHECK_EQUAL(boost::math::changesign(one), minus_one);\n   BOOST_CHECK((::boost::math::signbit)(boost::math::changesign(minus_one)) == 0);\n   BOOST_CHECK_EQUAL(boost::math::changesign(minus_one), one);\n   //BOOST_CHECK((::boost::math::signbit)(zero) == 0);\n   BOOST_CHECK((::boost::math::signbit)(boost::math::changesign(one + 2)) > 0);\n   BOOST_CHECK_EQUAL(boost::math::changesign(one + 2), -3);\n   BOOST_CHECK((::boost::math::signbit)(boost::math::changesign(minus_one - 30)) == 0);\n   BOOST_CHECK_EQUAL(boost::math::changesign(minus_one - 30), 31);\n   //BOOST_CHECK((::boost::math::signbit)(-zero) == 0);\n\n   BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(one, one)) == 0);\n   BOOST_CHECK_EQUAL(boost::math::copysign(one, one), one);\n   BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(one, minus_one)) > 0);\n   BOOST_CHECK_EQUAL(boost::math::copysign(one, minus_one), minus_one);\n   BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(minus_one, one)) == 0);\n   BOOST_CHECK_EQUAL(boost::math::copysign(minus_one, one), one);\n   BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(minus_one, minus_one)) > 0);\n   BOOST_CHECK_EQUAL(boost::math::copysign(minus_one, minus_one), minus_one);\n   BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(one + 1, one + 2)) == 0);\n   BOOST_CHECK_EQUAL(boost::math::copysign(one + 1, one + 2), 2);\n   BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(one + 30, minus_one - 20)) > 0);\n   BOOST_CHECK_EQUAL(boost::math::copysign(one + 30, minus_one - 20), -31);\n   BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(minus_one + 2, one + 2)) == 0);\n   BOOST_CHECK_EQUAL(boost::math::copysign(minus_one - 2, one + 2), 3);\n   BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(minus_one - 20, minus_one - 30)) > 0);\n   BOOST_CHECK_EQUAL(boost::math::copysign(minus_one - 20, minus_one - 30), -21);\n\n   // Things involving signed zero, need to detect it first:\n   T neg_zero_test = -(std::numeric_limits<T>::min)();\n   neg_zero_test /= (std::numeric_limits<T>::max)();\n   if (std::numeric_limits<T>::has_infinity && (one / neg_zero_test < 0))\n   {\n#ifndef TEST_MPFI_50\n      // Note that testing this with mpfi is in the \"too difficult\" drawer at present.\n      std::cout << neg_zero_test << std::endl;\n      BOOST_CHECK_EQUAL(neg_zero_test, 0);\n      BOOST_CHECK((::boost::math::sign)(neg_zero_test) == 0);\n      // We got -INF, so we have a signed zero:\n      BOOST_CHECK((::boost::math::signbit)(neg_zero_test) > 0);\n      BOOST_CHECK((::boost::math::signbit)(boost::math::changesign(zero)) > 0);\n      BOOST_CHECK_EQUAL(boost::math::changesign(zero), 0);\n      BOOST_CHECK((::boost::math::signbit)(boost::math::changesign(neg_zero_test)) == 0);\n      BOOST_CHECK_EQUAL(boost::math::changesign(neg_zero_test), 0);\n      BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(zero, one)) == 0);\n      BOOST_CHECK_EQUAL(boost::math::copysign(zero, one), 0);\n      BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(zero, minus_one)) > 0);\n      BOOST_CHECK_EQUAL(boost::math::copysign(zero, minus_one), 0);\n      BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(neg_zero_test, one)) == 0);\n      BOOST_CHECK_EQUAL(boost::math::copysign(neg_zero_test, one), 0);\n      BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(neg_zero_test, minus_one)) > 0);\n      BOOST_CHECK_EQUAL(boost::math::copysign(neg_zero_test, minus_one), 0);\n#endif\n   }\n}\n\nint main()\n{\n   BOOST_MATH_CONTROL_FP;\n   // start by printing some information:\n#ifdef isnan\n   std::cout << \"Platform has isnan macro.\" << std::endl;\n#endif\n#ifdef fpclassify\n   std::cout << \"Platform has fpclassify macro.\" << std::endl;\n#endif\n#ifdef BOOST_HAS_FPCLASSIFY\n   std::cout << \"Platform has FP_NORMAL macro.\" << std::endl;\n#endif\n   std::cout << \"FP_ZERO: \" << (int)FP_ZERO << std::endl;\n   std::cout << \"FP_NORMAL: \" << (int)FP_NORMAL << std::endl;\n   std::cout << \"FP_INFINITE: \" << (int)FP_INFINITE << std::endl;\n   std::cout << \"FP_NAN: \" << (int)FP_NAN << std::endl;\n   std::cout << \"FP_SUBNORMAL: \" << (int)FP_SUBNORMAL << std::endl;\n\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::mpf_float_50>();\n   test<boost::multiprecision::mpf_float_100>();\n#endif\n#ifdef TEST_MPFR_50\n   test<boost::multiprecision::mpfr_float_50>();\n   test<boost::multiprecision::mpfr_float_100>();\n#endif\n#ifdef TEST_MPFI_50\n   test<boost::multiprecision::mpfi_float_50>();\n   test<boost::multiprecision::mpfi_float_100>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>();\n   test<boost::multiprecision::cpp_dec_float_100>();\n#endif\n#ifdef TEST_BACKEND\n   test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_gcd.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2020 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#define BOOST_MP_GCD_DEBUG\n\n#include \"test.hpp\"\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random.hpp>\n#include <map>\n#include <tuple>\n//\n// clang in c++14 mode only has a problem with this file: it's an order of instantiation\n// issue caused by us using cpp_int within the gcd algorithm as an error check.\n// Just exclude that combination from testing for now as it's purely a testing issue\n// and we have other compilers that cover this sanity check...\n//\n#if !(defined(__clang__) && (__cplusplus > 201300))\n\nusing boost::multiprecision::cpp_int;\n\nstd::tuple<std::vector<cpp_int>, std::vector<cpp_int>, std::vector<cpp_int> >& get_test_vector(std::size_t bits)\n{\n   static std::map<std::size_t, std::tuple<std::vector<cpp_int>, std::vector<cpp_int>, std::vector<cpp_int> > > data;\n\n   std::tuple<std::vector<cpp_int>, std::vector<cpp_int>, std::vector<cpp_int> >& result = data[bits];\n\n   if (std::get<0>(result).size() == 0)\n   {\n      boost::random::mt19937                     mt;\n      boost::random::uniform_int_distribution<cpp_int> ui(cpp_int(1) << (bits - 1), cpp_int(1) << bits);\n\n      std::vector<cpp_int>& a = std::get<0>(result);\n      std::vector<cpp_int>& b = std::get<1>(result);\n      std::vector<cpp_int>& c = std::get<2>(result);\n\n      for (unsigned i = 0; i < 1000; ++i)\n      {\n         a.push_back(ui(mt));\n         b.push_back(ui(mt));\n         if (b.back() > a.back())\n            b.back().swap(a.back());\n         c.push_back(0);\n      }\n   }\n   return result;\n}\n\nstd::vector<cpp_int>& get_test_vector_a(std::size_t bits)\n{\n   return std::get<0>(get_test_vector(bits));\n}\nstd::vector<cpp_int>& get_test_vector_b(std::size_t bits)\n{\n   return std::get<1>(get_test_vector(bits));\n}\nstd::vector<cpp_int>& get_test_vector_c(std::size_t bits)\n{\n   return std::get<2>(get_test_vector(bits));\n}\n\ncpp_int gcd_euler(cpp_int u, cpp_int v)\n{\n   while (v)\n   {\n      cpp_int t(v);\n      v = u % v;\n      u = t;\n   }\n   return u;\n}\n\nnamespace boost {\nnamespace multiprecision {\nnamespace backends {\n\nstd::size_t total_lehmer_gcd_calls      = 0;\nstd::size_t total_lehmer_gcd_bits_saved = 0;\nstd::size_t total_lehmer_gcd_cycles     = 0;\n\n}}}\n\n\nint main()\n{\n   using boost::multiprecision::backends::total_lehmer_gcd_calls;\n   using boost::multiprecision::backends::total_lehmer_gcd_bits_saved;\n   using boost::multiprecision::backends::total_lehmer_gcd_cycles;\n\n   unsigned bits = 2048;\n\n   std::vector<cpp_int>& a = get_test_vector_a(bits);\n   std::vector<cpp_int>& b = get_test_vector_b(bits);\n   std::vector<cpp_int>& c = get_test_vector_c(bits);\n\n   for (unsigned i = 0; i < a.size(); ++i)\n   {\n      c[i] = gcd(a[i], b[i]);\n      cpp_int t = gcd_euler(a[i], b[i]);\n      BOOST_CHECK_EQUAL(t, c[i]);\n   }\n\n   float average_bits_saved_per_lehmer_call = static_cast<float>(total_lehmer_gcd_bits_saved) / total_lehmer_gcd_calls;\n   float average_number_of_euler_cycles_saved = static_cast<float>(total_lehmer_gcd_cycles) / total_lehmer_gcd_calls;\n\n   std::cout << \"Average number of bits saved per Lehmer call:           \" << average_bits_saved_per_lehmer_call << std::endl;\n   std::cout << \"Average number of Euclid cycles saved per Lehmer call:  \" << average_number_of_euler_cycles_saved << std::endl;\n\n#ifndef BOOST_HAS_INT128\n   BOOST_CHECK_GT(average_bits_saved_per_lehmer_call, 30);\n#else\n   BOOST_CHECK_GT(average_bits_saved_per_lehmer_call, 62);\n#endif\n\n   return boost::report_errors();\n}\n\n#else\n\nint main() { return 0; }\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_generic_conv.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/random.hpp>\n\n#ifdef TEST_GMP\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_TOMMATH\n#include <boost/multiprecision/tommath.hpp>\n#endif\n#ifdef TEST_MPFR\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n\nint main()\n{\n   using namespace boost::multiprecision;\n   using namespace boost::random;\n\n   independent_bits_engine<mt11213b, 1024, cpp_int> gen;\n   mt11213b                                         small_gen;\n\n   for (unsigned i = 0; i < 100; ++i)\n   {\n      cpp_int c = gen();\n      //\n      // Integer to integer conversions first:\n      //\n#ifdef TEST_GMP\n      mpz_int z(c);\n      cpp_int t(z);\n      BOOST_CHECK_EQUAL(t, c);\n      z.assign(-c);\n      t.assign(-z);\n      BOOST_CHECK_EQUAL(t, c);\n#endif\n#ifdef TEST_TOMMATH\n      tom_int tom(c);\n      cpp_int t2(tom);\n      BOOST_CHECK_EQUAL(t2, c);\n      tom.assign(-c);\n      t2.assign(-tom);\n      BOOST_CHECK_EQUAL(t2, c);\n#endif\n      //\n      // Now integer to float:\n      //\n      typedef number<cpp_dec_float<500> > dec_float_500;\n      dec_float_500                       df(c);\n      dec_float_500                       df2(c.str());\n      BOOST_CHECK_EQUAL(df, df2);\n      df.assign(-c);\n      df2 = -df2;\n      BOOST_CHECK_EQUAL(df, df2);\n#ifdef TEST_GMP\n      typedef number<gmp_float<500> > mpf_type;\n      mpf_type                        mpf(c);\n      mpf_type                        mpf2(c.str());\n      BOOST_CHECK_EQUAL(mpf, mpf2);\n      mpf.assign(-c);\n      mpf2 = -mpf2;\n      BOOST_CHECK_EQUAL(mpf, mpf2);\n#endif\n#ifdef TEST_MPFR\n      typedef number<mpfr_float_backend<500> > mpfr_type;\n      mpfr_type                                mpfr(c);\n      mpfr_type                                mpfr2(c.str());\n      BOOST_CHECK_EQUAL(mpfr, mpfr2);\n      mpfr.assign(-c);\n      mpfr2 = -mpfr2;\n      BOOST_CHECK_EQUAL(mpfr, mpfr2);\n#endif\n      //\n      // Now float to float:\n      //\n      df.assign(c);\n      df /= dec_float_500(gen());\n      dec_float_500 tol(\"1e-500\");\n#ifdef TEST_GMP\n      mpf.assign(df);\n      mpf2 = static_cast<mpf_type>(df.str());\n      BOOST_CHECK_EQUAL(mpf, mpf2);\n      df.assign(mpf);\n      df2 = static_cast<dec_float_500>(mpf.str());\n      BOOST_CHECK(fabs((df - df2) / df) < tol);\n#endif\n#ifdef TEST_MPFR\n      mpfr.assign(df);\n      mpfr2 = static_cast<mpfr_type>(df.str());\n      BOOST_CHECK_EQUAL(mpfr, mpfr2);\n      df.assign(mpfr);\n      df2 = static_cast<dec_float_500>(mpfr.str());\n      BOOST_CHECK(fabs((df - df2) / df) < tol);\n#endif\n      //\n      // Rational to rational conversions:\n      //\n      cpp_rational cppr(c, gen()), cppr2, cppr3;\n#ifdef TEST_GMP\n      mpq_rational mpq(cppr);\n      cppr2.assign(mpq);\n      BOOST_CHECK_EQUAL(cppr, cppr2);\n#endif\n#ifdef TEST_TOMMATH\n      tom_rational tr(cppr);\n      cppr3.assign(tr);\n      BOOST_CHECK_EQUAL(cppr, cppr3);\n#endif\n      //\n      // Integer to rational conversions:\n      //\n#ifdef TEST_GMP\n      mpq.assign(c);\n      mpq_rational mpq2 = static_cast<mpq_rational>(c.str());\n      BOOST_CHECK_EQUAL(mpq, mpq2);\n#endif\n#ifdef TEST_TOMMATH\n      tr.assign(c);\n      tom_rational tr2 = static_cast<tom_rational>(c.str());\n      BOOST_CHECK_EQUAL(tr, tr2);\n#endif\n      //\n      // Rational to float:\n      //\n      df.assign(cppr);\n      df2.assign(numerator(cppr));\n      df2 /= dec_float_500(denominator(cppr));\n      BOOST_CHECK(fabs(df - df2) / df2 < tol);\n      //\n      // Float to rational:\n      //\n      static const int                                       max_range = std::numeric_limits<double>::digits >= std::numeric_limits<int>::digits ? (std::numeric_limits<int>::max)() : (1 << (std::numeric_limits<double>::digits - 1)) - 1;\n      static const int                                       min_range = std::numeric_limits<double>::digits >= std::numeric_limits<int>::digits ? (std::numeric_limits<int>::min)() : -(1 << (std::numeric_limits<double>::digits - 1)) + 1;\n      static const boost::random::uniform_int_distribution<> i_val_dist(min_range, max_range);\n      static const boost::random::uniform_int_distribution<> i_exp_dist(std::numeric_limits<double>::min_exponent, std::numeric_limits<double>::max_exponent - 2 - std::numeric_limits<int>::digits);\n      int                                                    iv   = i_val_dist(small_gen);\n      int                                                    eval = i_exp_dist(small_gen);\n      double                                                 dv   = iv;\n      dv                                                          = ldexp(dv, eval);\n      cppr                                                        = dv;\n      cppr2                                                       = iv;\n      cpp_int cppi                                                = 1;\n      cppi <<= abs(eval);\n      if (eval < 0)\n         cppr2 /= cppi;\n      else\n         cppr2 *= cppi;\n      BOOST_CHECK_EQUAL(cppr, cppr2);\n      //\n      // Again but with bigger numbers:\n      //\n      cpp_int                      cppi2 = gen();\n      number<cpp_bin_float<1030> > cppbf(cppi2);\n      cppbf = ldexp(cppbf, eval);\n      cppr.assign(cppbf);\n      cppr2 = cppi2;\n      if (eval < 0)\n         cppr2 /= cppi;\n      else\n         cppr2 *= cppi;\n      BOOST_CHECK_EQUAL(cppr, cppr2);\n      //\n      // MSVC will compile either the code above, or\n      // the code below, but not both in the same file.\n      // Other compilers including Intel in msvc-compatibity\n      // mode have no such difficulty.  Indeed the fact that\n      // the presence of the code below causes the code above to\n      // fail to compile strongly suggests a compiler bug.\n      //\n#if !defined(BOOST_MSVC)\n      //\n      // Again but with bigger base 10 numbers:\n      //\n      number<cpp_dec_float<std::numeric_limits<int1024_t>::digits10 + 3> > cppdec2(cppi2);\n      cppdec2 = scalbn(cppdec2, eval);\n      cppr.assign(cppdec2);\n      cppr2 = cppi2;\n      cppi  = 10;\n      cppi  = pow(cppi, abs(eval));\n      if (eval < 0)\n         cppr2 /= cppi;\n      else\n         cppr2 *= cppi;\n      BOOST_CHECK_EQUAL(cppr, cppr2);\n#endif\n   }\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_gmp_conversions.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#include <boost/multiprecision/gmp.hpp>\n\nint main()\n{\n   using namespace boost::multiprecision;\n   //\n   // Test interconversions between GMP supported backends:\n   //\n   mpf_t mpf;\n   mpz_t mpz;\n   mpq_t mpq;\n   mpf_init2(mpf, 100);\n   mpf_set_ui(mpf, 2u);\n   mpz_init(mpz);\n   mpz_set_ui(mpz, 2u);\n   mpq_init(mpq);\n   mpq_set_ui(mpq, 2u, 1u);\n\n   BOOST_TEST(mpf_float(mpf) == 2);\n   BOOST_TEST(mpf_float_50(mpf) == 2);\n   BOOST_TEST(mpf_float(mpz) == 2);\n   BOOST_TEST(mpf_float_50(mpz) == 2);\n   BOOST_TEST(mpf_float(mpq) == 2);\n   BOOST_TEST(mpf_float_50(mpq) == 2);\n\n   mpf_float    f0;\n   mpf_float_50 f50;\n   f0 = mpf;\n   BOOST_TEST(f0 == 2);\n   f0 = 0;\n   f0 = mpz;\n   BOOST_TEST(f0 == 2);\n   f0 = 0;\n   f0 = mpq;\n   BOOST_TEST(f0 == 2);\n\n   f50 = mpf;\n   BOOST_TEST(f50 == 2);\n   f50 = 0;\n   f50 = mpz;\n   BOOST_TEST(f50 == 2);\n   f50 = 0;\n   f50 = mpq;\n   BOOST_TEST(f50 == 2);\n\n   f50 = 4;\n   f0  = f50;\n   BOOST_TEST(f0 == 4);\n   f0  = 3;\n   f50 = f0;\n   BOOST_TEST(f50 == 3);\n   f50 = 4;\n   BOOST_TEST(mpf_float(f50) == 4);\n   BOOST_TEST(mpf_float_50(f0) == 3);\n\n   mpz_int      iz(2);\n   mpq_rational rat(2);\n   f50 = iz;\n   BOOST_TEST(f50 == 2);\n   f0 = iz;\n   BOOST_TEST(f0 == 2);\n   BOOST_TEST(mpf_float(iz) == 2);\n   BOOST_TEST(mpf_float_50(iz) == 2);\n   BOOST_TEST(mpf_float(rat) == 2);\n   BOOST_TEST(mpf_float_50(rat) == 2);\n\n   BOOST_TEST(mpz_int(mpf) == 2);\n   BOOST_TEST(mpz_int(mpz) == 2);\n   BOOST_TEST(mpz_int(mpq) == 2);\n   iz = 3;\n   iz = mpz_int(mpf); // explicit conversion only\n   BOOST_TEST(iz == 2);\n   iz = 3;\n   iz = mpz;\n   BOOST_TEST(iz == 2);\n   iz = 4;\n   iz = mpz_int(mpq); // explicit conversion only\n   BOOST_TEST(iz == 2);\n   f0  = 2;\n   f50 = 2;\n\n   BOOST_TEST(mpz_int(f0) == 2);\n   BOOST_TEST(mpz_int(f50) == 2);\n   rat = 2;\n   BOOST_TEST(mpz_int(rat) == 2);\n   iz = 3;\n   iz = static_cast<mpz_int>(f0);\n   BOOST_TEST(iz == 2);\n   iz = 3;\n   iz = static_cast<mpz_int>(f50);\n   BOOST_TEST(iz == 2);\n   iz = 3;\n   iz = static_cast<mpz_int>(rat);\n   BOOST_TEST(iz == 2);\n\n   BOOST_TEST(mpq_rational(mpz) == 2);\n   BOOST_TEST(mpq_rational(mpq) == 2);\n   BOOST_TEST(mpq_rational(iz) == 2);\n   rat = 3;\n   rat = mpz;\n   BOOST_TEST(rat == 2);\n   rat = 3;\n   rat = mpq;\n   BOOST_TEST(rat == 2);\n   rat = 3;\n   rat = iz;\n   BOOST_TEST(rat == 2);\n\n   iz = numerator(rat);\n   BOOST_TEST(iz == 2);\n   iz = denominator(rat);\n   BOOST_TEST(iz == 1);\n   //\n   // Conversion to floating point types\n   // see https://github.com/boostorg/multiprecision/issues/178\n   //\n   rat = 3;\n   rat /= 4;\n   BOOST_TEST(rat.convert_to<float>() == 0.75);\n   BOOST_TEST(rat.convert_to<double>() == 0.75);\n   BOOST_TEST(rat.convert_to<long double>() == 0.75);\n#ifdef BOOST_HAS_FLOAT128\n   BOOST_TEST(rat.convert_to<__float128>() == 0.75);\n#endif\n\n   //\n   // Conversions involving precision only,\n   // note that mpf_t precisions are only approximate:\n   //\n   mpf_float::default_precision(30);\n   f50 = 2;\n   mpf_float_100 f100(3);\n   mpf_float     f0a(4);\n   mpf_float     f0b(f100);\n   BOOST_TEST(f0a.precision() >= 30);\n   BOOST_TEST(f0b.precision() >= 100);\n   f0a = f100;\n   BOOST_TEST(f0a == 3);\n   BOOST_TEST(f0a.precision() >= 100);\n\n   f100 = f50;\n   BOOST_TEST(f100 == 2);\n\n   mpf_clear(mpf);\n   mpz_clear(mpz);\n   mpq_clear(mpq);\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_hash.cpp",
    "content": "// Copyright John Maddock 2015.\n\n// Use, modification and distribution are subject to the\n// Boost Software License, Version 1.0.\n// (See accompanying file LICENSE_1_0.txt\n// or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include <boost/multiprecision/debug_adaptor.hpp>\n#include <boost/multiprecision/logged_adaptor.hpp>\n\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#ifdef TEST_GMP\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_MPFR\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#ifdef TEST_MPFI\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef TEST_TOMMATH\n#include <boost/multiprecision/tommath.hpp>\n#endif\n\n#include <boost/functional/hash.hpp>\n\n#include \"test.hpp\"\n#include <functional> // std::hash\n#include <iostream>\n#include <iomanip>\n\ntemplate <class T>\nvoid test()\n{\n   T           val = 23;\n   std::size_t t1  = boost::hash<T>()(val);\n   BOOST_CHECK(t1);\n\n   std::size_t t2 = std::hash<T>()(val);\n   BOOST_CHECK_EQUAL(t1, t2);\n   val            = -23;\n   std::size_t t3 = boost::hash<T>()(val);\n   BOOST_CHECK_NE(t1, t3);\n   t2 = std::hash<T>()(val);\n   BOOST_CHECK_EQUAL(t3, t2);\n}\n\nint main()\n{\n   test<boost::multiprecision::cpp_int>();\n   test<boost::multiprecision::checked_int1024_t>();\n   //test<boost::multiprecision::checked_uint512_t >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::signed_magnitude, boost::multiprecision::checked, void> > >();\n\n   test<boost::multiprecision::cpp_bin_float_100>();\n   test<boost::multiprecision::cpp_dec_float_100>();\n\n   test<boost::multiprecision::cpp_rational>();\n\n   test<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::cpp_int::backend_type> > >();\n\n   test<boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_int::backend_type> > >();\n\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n#endif\n#ifdef TEST_GMP\n   test<boost::multiprecision::mpz_int>();\n   test<boost::multiprecision::mpq_rational>();\n   test<boost::multiprecision::mpf_float>();\n#endif\n\n#ifdef TEST_MPFR\n   test<boost::multiprecision::mpfr_float_50>();\n#endif\n#ifdef TEST_MPFI\n   test<boost::multiprecision::mpfi_float_50>();\n#endif\n\n#ifdef TEST_TOMMATH\n   test<boost::multiprecision::tom_int>();\n   test<boost::multiprecision::tom_rational>();\n#endif\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_int_io.cpp",
    "content": "// Copyright John Maddock 2011.\n\n// Use, modification and distribution are subject to the\n// Boost Software License, Version 1.0.\n// (See accompanying file LICENSE_1_0.txt\n// or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#if !defined(TEST_MPZ) && !defined(TEST_TOMMATH) && !defined(TEST_CPP_INT)\n#define TEST_TOMMATH\n#define TEST_MPZ\n#define TEST_CPP_INT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPZ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(TEST_TOMMATH)\n#include <boost/multiprecision/tommath.hpp>\n#endif\n#ifdef TEST_CPP_INT\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n\n#include <boost/algorithm/string/case_conv.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include \"test.hpp\"\n#include <iostream>\n#include <iomanip>\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\ntemplate <class T>\nstruct unchecked_type\n{\n   typedef T type;\n};\n\n#ifdef TEST_CPP_INT\ntemplate <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct unchecked_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >\n{\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::unchecked, Allocator>, ExpressionTemplates> type;\n};\n#endif\n\ntemplate <class T>\nT generate_random()\n{\n   typedef typename unchecked_type<T>::type unchecked_T;\n\n   static const unsigned limbs = std::numeric_limits<T>::is_specialized && std::numeric_limits<T>::is_bounded ? std::numeric_limits<T>::digits / std::numeric_limits<unsigned>::digits + 3 : 20;\n\n   static boost::random::uniform_int_distribution<unsigned> ui(0, limbs);\n   static boost::random::mt19937                            gen;\n   unchecked_T                                              val = gen();\n   unsigned                                                 lim = ui(gen);\n   for (unsigned i = 0; i < lim; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   return val;\n}\n\ntemplate <class T>\nvoid do_round_trip(const T& val, std::ios_base::fmtflags f)\n{\n   std::stringstream ss;\n   ss << std::setprecision(std::numeric_limits<T>::max_digits10);\n   ss.flags(f);\n   ss << val;\n   T new_val = static_cast<T>(ss.str());\n   BOOST_CHECK_EQUAL(new_val, val);\n   new_val = static_cast<T>(val.str(0, f));\n   BOOST_CHECK_EQUAL(new_val, val);\n   ss >> new_val;\n   BOOST_CHECK_EQUAL(new_val, val);\n}\n\ntemplate <class T>\nvoid do_round_trip(const T& val)\n{\n   do_round_trip(val, std::ios_base::fmtflags(0));\n   if (val >= 0)\n   {\n      do_round_trip(val, std::ios_base::fmtflags(std::ios_base::showbase | std::ios_base::hex));\n      do_round_trip(val, std::ios_base::fmtflags(std::ios_base::showbase | std::ios_base::oct));\n   }\n}\n\ntemplate <class T>\nvoid negative_round_trip(T val, const std::integral_constant<bool, true>&)\n{\n   do_round_trip(T(-val));\n}\ntemplate <class T>\nvoid negative_round_trip(T, const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class T>\nvoid negative_spots(const std::integral_constant<bool, true>&)\n{\n   BOOST_CHECK_EQUAL(T(-1002).str(), \"-1002\");\n   if (!std::numeric_limits<T>::is_modulo)\n   {\n#ifndef BOOST_NO_EXCEPTIONS\n      BOOST_CHECK_THROW(T(-2).str(0, std::ios_base::oct), std::runtime_error);\n      BOOST_CHECK_THROW(T(-2).str(0, std::ios_base::hex), std::runtime_error);\n#endif\n   }\n}\ntemplate <class T>\nvoid negative_spots(const std::integral_constant<bool, false>&)\n{\n}\n\ntemplate <class T>\nvoid test_round_trip()\n{\n   for (unsigned i = 0; i < 1000; ++i)\n   {\n      T val = generate_random<T>();\n      do_round_trip(val);\n      negative_round_trip(val, std::integral_constant<bool, std::numeric_limits<T>::is_signed>());\n   }\n\n   BOOST_CHECK_EQUAL(T(1002).str(), \"1002\");\n   BOOST_CHECK_EQUAL(T(1002).str(0, std::ios_base::showpos), \"+1002\");\n   BOOST_CHECK_EQUAL(T(1002).str(0, std::ios_base::oct), \"1752\");\n   BOOST_CHECK_EQUAL(T(1002).str(0, std::ios_base::oct | std::ios_base::showbase), \"01752\");\n   BOOST_CHECK_EQUAL(T(1002).str(0, std::ios_base::hex), \"3ea\");\n   BOOST_CHECK_EQUAL(T(1002).str(0, std::ios_base::hex | std::ios_base::showbase), \"0x3ea\");\n   BOOST_CHECK_EQUAL(T(1002).str(0, std::ios_base::hex | std::ios_base::uppercase), \"3EA\");\n   BOOST_CHECK_EQUAL(T(1002).str(0, std::ios_base::hex | std::ios_base::showbase | std::ios_base::uppercase), \"0X3EA\");\n   BOOST_CHECK_EQUAL(T(1002).str(0, std::ios_base::dec), \"1002\");\n   BOOST_CHECK_EQUAL(T(1002).str(0, std::ios_base::dec | std::ios_base::showbase), \"1002\");\n\n   negative_spots<T>(std::integral_constant<bool, std::numeric_limits<T>::is_signed>());\n}\n\nint main()\n{\n#ifdef TEST_MPZ\n   test_round_trip<boost::multiprecision::mpz_int>();\n#endif\n#ifdef TEST_TOMMATH\n   test_round_trip<boost::multiprecision::tom_int>();\n#endif\n#ifdef TEST_CPP_INT\n   test_round_trip<boost::multiprecision::cpp_int>();\n   test_round_trip<boost::multiprecision::checked_int1024_t>();\n   test_round_trip<boost::multiprecision::checked_uint512_t>();\n   test_round_trip<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<32, 32, boost::multiprecision::signed_magnitude, boost::multiprecision::checked, void> > >();\n   test_round_trip<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<32, 32, boost::multiprecision::unsigned_magnitude, boost::multiprecision::checked, void> > >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_int_sqrt.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include \"test.hpp\"\n\nusing Integer = boost::multiprecision::cpp_int;\n\nvoid check_sqrt(const Integer& s, const Integer& r, const Integer& v) {\n   BOOST_CHECK_EQUAL(s * s + r, v);\n   BOOST_CHECK_GE(r, Integer(0));\n   BOOST_CHECK_LE(s * s, v);\n   BOOST_CHECK_GT((s + 1) * (s + 1), v);\n}\n\ntemplate<typename I>\nvoid check(const I& v) {\n   I r;\n   I s = boost::multiprecision::sqrt(v, r);\n   check_sqrt(Integer(s), Integer(r), Integer(v));\n}\n\nvoid check_types(const Integer& v) {\n   using namespace boost::multiprecision;\n   size_t bits = 0;\n   if (v > 0) {\n      bits = msb(v);\n   }\n   if (bits < 32) {\n      check(static_cast<uint32_t>(v));\n   }\n   if (bits < 64) {\n      check(static_cast<uint64_t>(v));\n   }\n   if (bits < 128) {\n      check(uint128_t(v));\n   }\n   if (bits < 256) {\n      check(uint256_t(v));\n   }\n   if (bits < 512) {\n      check(uint512_t(v));\n   }\n   check(v);\n}\n\nvoid check_near(const Integer& v) {\n   check_types(v);\n   for (size_t j = 0; j < 8; j++) {\n      check_types(v - Integer(1 << j));\n      check_types(v - Integer(1 << j) - 1);\n      check_types(v - Integer(1 << j) + 1);\n      check_types(v + Integer(1 << j));\n      check_types(v + Integer(1 << j) - 1);\n      check_types(v + Integer(1 << j) + 1);\n   }\n}\n\nvoid test_first() {\n   for (size_t i = 0; i < (1 << 16); i++) {\n      check_types(Integer(i));\n   }\n}\n\nvoid test_perfect() {\n   for (size_t i = 256; i < (1 << 14); i++) {\n      check_near(Integer(i) * Integer(i));\n   }\n}\n\nvoid test_powers() {\n   for (size_t i = 24; i < 2048; i++) {\n      check_near(Integer(i) << i);\n   }\n}\n\nvoid test_big() {\n   for (size_t bits = 128; bits <= 2048; bits *= 2) {\n      Integer i = Integer(1) << bits;\n      Integer s = (i >> 8);\n      Integer step = (i - s) / (1 << 8);\n      for (Integer j = s; j <= i; j += step) {\n         check_near(j);\n      }\n   }\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n   test_first();\n   test_perfect();\n   test_powers();\n   test_big();\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_log.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n//#  define TEST_MPF\n#define TEST_BACKEND\n#define TEST_CPP_DEC_FLOAT\n#define TEST_MPFR_50\n#define TEST_MPFI_50\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_MPFR_50\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#ifdef TEST_MPFI_50\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n\ntemplate <class T>\nvoid test()\n{\n   std::cout << \"Testing type \" << typeid(T).name() << std::endl;\n   static const boost::array<const char*, 101> data =\n       {{\n           \"-2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806\",\n           \"10.355073440919378699690477472036470469315794905372650461119520557405966250191554948388847794306923706128373152780234988638443954821327953543032075228882306893901540038156503265416950932549208174713640840670002321534598356631953006304821201484830902632165858733357596733427094375150860310219829690440417223992885533566388118595248523193740778052893647271700612136670114224280374211626787106078693643289\",\n           \"11.741365414719872359995630593475834957852130639032528348910839621576752378207582766840832626901446337859064321328454096088656817987112409176281442608184950888327275070356290649885618053367245169005379545357345645235094776018156840041023694466493107510640907700621694994008944652785168884717808235919056023540605910031676977750466679901495978099025342154131430098841939052890393197699093697421676686108\",\n           \"12.552295188839391064403078983058501313786961042419051509346988474726615643710688192053158471717695991904853941837387256340073310064341282022830248452137946273986542713154937759697687656073485311102053666502633006429446632794099471395918827441203897096147814416727830805903830888831170139661499031930347916453836121200110772307492771615813954882033814741470466415076136175748560866462690250372712624427\",\n           \"13.12765917900902322346243585913156826327069465639834188399662474212182724479008698347907678965083909936781641397385483495362268256360763444317213586059490467781653518008717313901614800566992248144716374322429987750723867821114358979404591879648104388637035609754399283274014767545593886580941165664957384975221949645055255781874944374229417864853289321901220692566918330756199433299461690335766708584\",\n           \"13.573946210017730027239177097297058651455670148127333215055495986565964988037166389618503523561570994165268599045375753512400565200059790703280760252213714757212213525833556727462647729566258301490115414864748436290794191111843775262434063842232241185107471214859854864335150887423144285468856056851239653315249148749701603523173627966758652109489308872414194066451074827802642589890222384815709071028\",\n           \"13.938589284701101831675037903832444894846690407420628610481163937380536465305805316181768586604603341197033655576371082304146219991693253987043452241307224478718013872459287813264283001906622959681872321576087143975972033651747378310838673897181549722528073649569290162541997276292708638316653324605571398691171391912961431088832002969546541039753774950645926800096854799942237644831671997679785482847\",\n           \"14.246890620897408672445451566098178524763429935510610216690355229695078778430708804421870639655370744549370273426124295240527401708361100923871708589722651960428863955835558634640426846383161118062310502176054546468600516588908689567134867002953229862887953032595529925511011383644740837050282379317993152702704798000312156694502691021267028423979454580574052732764336948692001989411724963233511159783\",\n           \"14.51395339092117324610526432755496036199337959182144260442491096061930765841595850793460014941610881052330595683873016973224744403781498772061971443926277312865243350174522677227134957935047605429941424114476598970997223505479765426888886686275495180653025817201214478249415383537946915840293549927935267010481189550187682053892807264533011114305883442850485847010726074555176479027986850883182954118\",\n           \"14.749519451795537716462643672888549370666057639128212044001868590062813335472483708120056955187220713486931180221186191741860718823347399129280491176499608998857949407351247432513825095161942372289203657231256344909997480732110798704027258108845584594081552703009126596026870753341888414903979390651641367952487019992866762344920748102417282166652161104367292712971759633790964534907923779335451109079\",\n           \"14.960240475644662390024535772058360495972689995692264619118050620984863397335883147741001175137837088856196207660064061839685086120444324885420172384357780225067863432546453923434326358834374021700709153791633034800554630092122384413882780201869241166113270104158152592921242256738530713688528178980864650875690860545577283508963373084295388766350046816560200649161822618828666606722223620871032632611\",\n           \"15.150860829728925816270269964092673433542841210964830162793225770535551518840933315190406262273098573795238063523955485390896001670839635976377071048140363687808579387495186737492639543519534774851635101169579614712607935494886581440494071142193798729857001548284675533558490478467589884332536443679208006567281631805562767928329937083844501800478013385969649342207304490375728237042482944784544838254\",\n           \"15.324883579506436493570233597448883519693351814374549397498489035148221882270042436654099306811313261346823941672888447313628931256927773946985727814886420570056552118783468127543676769633344136209500636666830026098080195180498059221494203817961212365532443050015541947762494604799890429565189588245725920948145579035449699519788465993549043152027361890729572024195346130030456992216388648768722394836\",\n           \"15.484968991583560712862164152602532972505596882865402498065644250737301955125596006515274461619204302558285733320299957799185995441209009451408808376560872924206710117585718578727591708553957297729203457443101522435265312291388453827953066056871634785359329503731609907767433693085428240202927311226115616775436485821324503901092891486358733365244513748729928672060637178808283856096451123227237766837\",\n           \"15.633184933296400322886411216914351313442169047575854720677392808712745585778888867637029115450088924031428350724038141381219620588274493330817678181565157141965018413952386880843987389414299029950277357119925470077396582940505069596480801954154029286187951921181728705116872415271634077604874063371227144842898712603028462623610688275714711124501733417572553751110494225479183571648948845731888607993\",\n           \"15.771170674177108994750017157264759379388540187789301748807798065200414118407271774235601089093934343495795521812477515931432709195503245641975701807702026215615357450518151317247119115864533992757135781852491298348627270712291588580073932563653614422839620206266586292520948221873093053975823776289996754936187304352159896156876771015468496811587576227636095095473566772184717633945339405330371627545\",\n           \"15.900247714739125237305645451417508966665591345786220672552302840334525160137723176098165167253830541655084109190400464710649206788771240950251243759258268060695212680017248831015574286848979270728739089100870231114250075432989803029255029492399141798408644860336753530942734586654467728627658977642688053752033223720047083446705808444218983029996407752310091763448795485193086044050699179075227514085\",\n           \"16.021496956952197922992283502641894579962626483154818954043789565712934054541190510263229676242727892630672492409948339732534439120465067507199758379167701667321617794907607307728874859663168072318224068053703928672394393376652024298292046951118253912008558176064907492479298408285769067404165601995001682495873893492451380569168665052480684672167775365328449822100602627386235888117607629689989295358\",\n           \"16.135813783442291449575041100809653925479234724736343542177079039059170241908162244448865517513646317913575323823536275208044355623776985732503939829900060864487127004364547143183319169525031486430688761890355067541570726092642869160866842639424318480923069734468346837396224375681293323049896437786794370196393419740684520457519876260717581058279975484300455393801884203407282602155622048760192869731\",\n           \"16.243948224975912162101874242338089698927747514172297963501304802721456885123447742525917146000081948350317670558217990170315910524955950657647628011646020228669505156094231753926456488583104510177838897523717492728937537629972877557426292386450904986250829454391823373783104867874948543639133365724217397301073161382317429508046689262594057712721480553629716238053162259132557499326959178271755311819\",\n           \"16.346534812891312020017737390565972522861639520956794183631801030677318559517349930264816297286373068267542772472219372292428845683416042271115312027071601889325060155482892443418582095080544516697369324049179348198348320350032057951783059238791085449471373733253488008998200818236407442435705194113745206455080467406424910471012832247972967952311217374959559350158619575075500673005632848486334892081\",\n           \"16.444115140490340128500589643685615592593325439192231430163649023292793816677629077048173396104592590442505550803932707806677495894373323443853064668488945973357469342360809555842080876327526869093152265593359032627507962690981132695345232937664935403696772586286371082469152648334224734697834132478315542287352614722743239776066558016553826776123247656549922477370984130115175375533899599151832866777\",\n           \"16.537155171118865136534989063582757364253199496897225305411818162632163606557745471767961160436879104964882723479325928591604518246962419687548390063992529356693298596378658322800277364077966826234091623459656551097008920549618056923279473982070326894236928331513682937597704431571923632859325944958271156630648510192786810276479282782233678225160061893949554276261365074478039201200141096034185340788\",\n           \"16.626058695701082390621404187251773798561764113151150041596109882112467488919141098521165822165293765039118029510544981683905860141438867442019067534265891760023149100317968826679154566584457042877767867250357368225093921585968539417839705388349710086788853906351301543791493808667435475597486845630653110450254081800953162013336880338884388603160347478448669890791767227275369657780841518987171046251\",\n           \"16.711177924047687436041681081297469757517395732698719962499711839818824068470368594816509809165130772248099176990649818696451892735033114399817499272685517472929769530848678764490613732856699010061350335113220658748043901782349324603111802594973838523650919828685995473213566914734286172266839140529583990377667556754261878256224596588519392559788652514828861263680954096492024398529162625680677258884\",\n           \"16.792821912654942574589969785414406627855177803111176492774370259331640542125643510644899208865670120639893723574191986313708664152776559897034386961403215067476041927571306948209653637016541256814370701598681758297129259567548154765775910932763810160923332344469835976310776610418278334876476195529920021337399751846302536974621623453741347064741080510495703994896565552519309503521053051550623483165\",\n           \"16.871263338577273117049933407315211807184894736082799946337588399915643695388836578819581481279897851015095335198849942961931601540668917787952832251688896660707943869197097893837964754891796695592066084995854170120209827918603483811654385230282025426754327077293929504883381435192439219366582495078959939830875435944938000044089717015334115741229281828493468876793032191535756728196375330663180727281\",\n           \"16.946743994200631806033476403925371852051109645526740171061759524387799979304956484613870531865187139791227191840781754383935422487885452369507952721547705027535773654885832127821314459521240798742974634464887793874048016231828535132695506414037947185201173465247385982934992490469404967587724592554548395276895353595409898385619478502390678687463962622836411208115179925881515699871702165077675857036\",\n           \"17.019479282236065828727803356580529388797042464710975507911282243104151862598751845439937481303609237769338953879291798328663979939210753132559510492288100384177867237190989151135211416672909332732482371326996189543048703303285313799031214641216166381411885795576234361808712082618702464622338883787915216150436372783047860816587095332458688921705641277515576461385290501276378977328383137813013202605\",\n           \"17.089661921583428533920885090473894674921519340994685086552627218992626938319872359613748323826158856027837200411438668460410538403836237956276065714403575420148736981655027235218177614075251822388622713232585428029969533906061654341819894513492491624632974192525592636008127939368987600981961744622054023981036109865947530952316809705151315101400446930619393266624895135955182323721805890693892489067\",\n           \"17.157465024686670167940702199808038440453826682770881229464136716214305217066325160993039686330328188786987064692354236198505670650108871009195717920051441546822338399371747349503874711833721760676087218038457960626001087951737722106836691584985009357268276351001658789309901363541541142239028890280836555429745898638761562947010206765922958485242984359891337645169887782296197402533921841201821435322\",\n           \"17.223044670108153088406971612680579462250390145455205711423224535559905829397735171751863831903325186673310251936245608147861310604382786127429364616442074955520795624793164764110780962566943990430036624945190166480864873260501647262851147587875798742974124100786387378932173276365815649310057053480347330487890156980245097594505867694166591312545929965230291418670445516669557156689966248314016354044\",\n           \"17.286542066533530981819924644041556546839394128235306235416269038138274222049809140847092268150839206354707638710275634022335650694777681817694798501418812448888688173373947001904190184008892957674606496333161081431327984331509197841574297574788702287443502123119313877415278877304866456565176360773848651195816021879148876985173267277031263646152871873014441183590471141901167533828621963866651938359\",\n           \"17.348085383681499172852340212837946913681349503319833895379599364916346996678774115472356552172467728498192423708290186696353892633802275272186862935888864564436104200250553583802585096479988444811879111645109656880728153108808638274341978968354895482288870990505393394330150686285205409461910256828313237800771316014620729111128197408712519655232673726993167731090657784157432284844410962540306871812\",\n           \"17.407791309811451413991402934776587727274692304168979758129844486195147501475844430031581045491342304862802756719012802717759227086944920237646742600183730387935914237410099970497154963215669635477250725760034883360834134873909027143784365748082991457136260982918509631214089379283854791699127985575276751950639814381413022404340898037317031344649130788109442934133748721229332612763230675387867060167\",\n           \"17.465766383402858316731575043043871754932551869660069657366289253587674381952187793692876332186097637634087898052217367730831337525450143144735163993701984235559102178727289467801811444923511321849112339058962832869205150513708620081533545907748750224381419445198858131583714181742840318906599828122743306582674187117835956409356596804579817623463035229848008072471150460106195548408352347746742847561\",\n           \"17.522108137193897711249955720342223562404817078270264273905715197834637314555104238731504974899534359198079882854402652102198388084110484760619705504323190957788898675675472299192322756141627162323541713415099172067523105704142354142286507565791349450889277448545966302507723270185283899864397011417078910276215036241179611950839739662625626455044878609357243901835302874736030320059872773022839076998\",\n           \"17.576906085439158795399613853863097303860835367703382634217979275105020336999327656009595436350031662565840865227976662242781789960872250051998481804897622287887086985238091438506085053631982050247194140738539987379268409303934286420729479452837709138518786355198810012076646196653084861659638299340083440855659993917810136693887499673110592919880225890667600561450738971059427382635508450091570097859\",\n           \"17.630242579482716539323837128846626753956194314343736063283695118187974605321998609676585457221722093540967455603842712855190915316171267768551204188316976169082878976713161041600921069589708836776259260899700342542761959107817464710887483018031112156977258240064220687983570300417350906046032596793701224117336432612122346984445322343505811317200044404325245524587348610225714892960184376194438742903\",\n           \"17.682193552177642930469311075041540632454794315173833851548924954045201903733019976720709429894183669091622069055829864963447674638381460850277690319942206492046322144914184638283615681017449686491773099947404077379395563267125512703092895031616346899622091168324459335139948282486097513426616067084251033517363717148785943762510534333490466778398817865864252996839848563898275763467374270388303474531\",\n           \"17.732829168042892302590066897013224260526349617442757064898532827287653373154374250085440081248759495538523122114463120786358068331952209807684385821625688206899889794184992102701935895298679767555036775735985597715341448247873700759325978422207409167388561946150223833135803435044691082980471455256218231653367433009869225710546713847446382266908465706428817510556416763430212167661925983678317689559\",\n           \"17.782214393127773091907390576928321922818609345162469668288248606737448584265787291899115365824350981071781548351963523796289812496283393676088371363622146243894946956855177324929267339605228930435844698103907214217720043808120931206339233299438914243909015437719067832873971853535761149326746352476616918607787268605165583917095714007024394600276277913067861955743579281638075879563801550521361400101\",\n           \"17.830409496196797333256263738087407756305793204876426547866274663003566432384680240879632999625725708300091127739268764655234592101254713785942646078437589939733647676861210608435791914827456291767449764007558390614584486670558546409061408823289149666666818024559557140308187730981247373784664587280435856629009596287509432264978977660915985852234235063815941899607957940727152099219426925372856581083\",\n           \"17.877470490934232288852811743259662703350866532641876235327240424382634438025700311951299570329496669487738366928514133455422447732866797861412283887178678146519925852345567722230587799483201967913067391020608007825990349366451164476805546339769760220805534987675878347990806759564468339408725207557557011408435539499579334714364702076041798486860978860009676392441269681660376828431489832998763783258\",\n           \"17.923449527306267869903426070004616586122783729793624019886904269965872168854615384174781325332961537402467089754136043237824345234828497017675462013908498436584882632257634259557543282397560432131425953734774375224901224027834174376390115551172850840545446370919691863863162138436779349056977625063368614038926314141157758995633570593909444840439875814859101692914284555504462737973961801589348562421\",\n           \"17.968395238938123096275003449517382823058653367901994410453731720353712579214128295617333869516953666517153266184450063833611730223713367177888956257642697863674682557764474491249664869634869467450632518845976225157445436929203774807794710993549169067538180609230496568688211520386012533845072853251411123534511690847284034061828924979836346301147669327210040586682352268581578885354613616677879192008\",\n           \"18.012353052308072938755867264876761138384940766536728123219303502872235608220456049765985905816906980541771912193578395286636524639567005562096644259687421270993689984646487799760867557580378976263785987858028882916593402367582926712749625025395229096162602944095765767003293442756802839571379406129666952518296572179431801499117577022831811590456125422748646995266409456422225586206021840322692382857\",\n           \"18.055365462686668331727160748231009519565746647193730385530909331597852334952578425145279427250887034166658709337134491235522678908221793937220809954557808901763389178392831492051282059480629151432246720826269576988663211852119754955967569929315382922357289706041278636253185833298598511399638105081736687620508948263244525471222947804257016135464845038301780535378180021273347494295813215232102999649\",\n           \"18.097472281022918092839876166164329437973263728374666387409900363304423095913608188979786368122872685324785740303523457754035383735336598870745063200445496969465305638435393742921093080855121166597064087151732410717510776813994536867846471600876935467557239720329955864393503091522335217308468551898804050931884864074974187930869095426636541733964836470414482229854405996155347764481217202728996408614\",\n           \"18.138710855372574931023279730094645378686287349356676919424498204049762635832652703081045863264164065707461503608812437952726945167389204858679677978907656542126675434222486013764292798698974541262372833651362936600851261171024940667498778746253799866490414715539561648775214507198558445051277115507846030240001071535504590488750762226492938922487331198045407471864288427126708589240674067562104543957\",\n           \"18.179116269955114571377487963612019905652085216126618591531831326851631273535837433851652060806307371522002942828348086254592323263632131183438294055667010855067061587674644272103122258118876651912890486407250279668447142712674562099014392095571206458285314302909409592642841502932705416119595372330139185232535836986175505626716905102551635720868328845059106716603941432470493828723765413424721976223\",\n           \"18.218721524498032554193215680552580137491683034589488437319060302272592206508827557611431375182704552154497537575444766904464774327453349109721410510507102426285778233008253433639863695380913463970388673098705619991229471182831382051550803100625573309055088036785775202381313835883262855970305798706681563291905495590616431781211404743717763365778127660253455212146746026811363929209719531660648504082\",\n           \"18.25755769616561915104320634671335949819923250838247367135480870103002754055972575277617781066800125225275977232426410882766773084485826986957597205108505829168630501177398318211279559799848433615486396320080576991739828304477785924273653352846964138446264644904849824507615174857436913763769835408524950658917536946876135419383532210821743200063786350760207420579200676223678007228393958258720083932\",\n           \"18.295654086063005239961930900603578763176327716162022442528659338478895027684612801134718048445578078864512023650622689532231640803798279071247213212940626166721703242773412064293396910008891332614727995930235839898502680907757808722725076622433926254807390507349193089487065273859422711581690536923283818694448490391002663699373577479984089586448960986922914070154319198856799480586814831572660049059\",\n           \"18.333038352045729366070360053860247416881993539906325936417001019639836810235521744851872438194534698737793818113182566661284551265375926400252096198917463166081789346386579278436021220544269108158036360716265068681920333271695665204550361645092770414267870574761534021576748772414710332296686656677922105572480136623006540318287771752403257225484193416375374630295739694584359181669584822144217946089\",\n           \"18.369736629342788833545154829965612197972030184654204521583836723612431388284128470120361520079152081604731214550025504583810749093225662462708297813392905679444268263153178673045591535099590243771860299493196201337328463166245762316637806913270164277457975112426005180292583426915918675383435395598215385153247994877265654873384456838948090969392401887506081626510459117637684719849016393221041720966\",\n           \"18.405773640310900146133080088261946202976690317466294344672811637024889157611521518848738302063682147953709444704912322724498748005402509152494514057803322060491136048741666988817114427555111210963923209356023892097003244960804568051496345885676927757469123572277620624446804627512970828422692616021227425852662243212443997074981005547833762050079432581680067106949297497692327125068990077901522226957\",\n           \"18.441172794474399698182030074721740031645602552534420544604120821167467838337449892992771747357276011553142091110875268371883702350672621604391781630952792517951394285585851496086739721764180588422789463043949353454011941863375479066641639870318143091000764755109263681792932398864353035859720611512874738125344871434992639512151401272538083058455878170262156351968871089395179837425273523581266914745\",\n           \"18.47595627986464597709414934346663732189241252367556916529377819718435871713823800089497791390570676646849082185155969226893554048129639509679051447135722658187695404706235925157146425104283059827944524324932672824661552843990966903508121362067629390223781365207266998003720499319458536728358620338853555386727837290179454339519141841532839938596761951045619471589862830891354308681626977577420483375\",\n           \"18.510145146551442627414905806735913567003712650812295077443330836708330498077617580007887630002806998527489958357928811323358164284670780912045286972377274734553167811143903532773133805470585887337986897779623231393980154689146471547983633489101760043708991315746940120025902341173853793429617026275691215584867628750464940410772709161351434979639911956946479201132978330304672548030931942250342827294\",\n           \"18.54375938315397840777373858913955248239941847920328667581513228848814216209238117867823746808674105485439472281080229047484288277191323337476914908731578203036561093352990739771860442165984753982600021729206737097284114048195126812337180690412756158211962923840645830361425158816448002373708570542607328640280411811505735178290827333249222248570577590327817428193141575383830773736064963674654660788\",\n           \"18.576817987027647186937851258336640937668818840595786321214115700990580993937301728456982569596955182509352640277092493549853424411966677818012248002654715239100874590037738307469713048325570874520232570867464224788639656453937494219294174471955373301736672685268384577575584576576899158917424074434177408506824723823546414342198182263466224674661649356568188397290822447447185825387180657594093708751\",\n           \"18.609339028743835443520046961477709286939310853034399826433866146117641838882532805452792636721283076369348347017617290496488517658040508081002292362699460963188796636919359563770588812590411785597112719721757265655201721601867128800954165396591923271771796713301912904158675092529178443570927414653982088273331584295588174225100793199329706639345162173054259175639620324704962515101988919574683797276\",\n           \"18.641339711410638424722499047013449967887089663871032284600678326435618587023360889502435665997102476809993062067289899429492640057255987173558009597289702007868879986681400023832856533473923548707096670227832737339287908558274044368146372966754230837592655179154123960009424338853507410779228164259856997555111697864450713171508666161000757176178710802248263025585993364498172063037657704404452535503\",\n           \"18.672836425322050368486113163967894536152542145032787472779137579977190277914128508177973702344749215422866489255932015284354044054928123475206880037062819389112504714106095639732288437854189846017324055713142277768438434138800721340366655917386856186887417022606078557020556496094324427190459240576788558291551699271849591355480496655647717244614207638067307680084952591605729876523430439516165337322\",\n           \"18.703844798370253311556748128890196309240890383998201893987314003630502067675284072677315790931434159739316058047067634433988116165753705089479010402482501330164866808933095532965233351834719435836698735379881853925522288987702030512098787246242665060494288818182785084700362957305908534097737840396555283267034806128689898134337131513408714563437722088348519474128730338455257510535561818243515295123\",\n           \"18.734379742609172948695846511449581634565683544125106511957075355113091757584835040550323433523983103087395353257534872811737536865777209110758107808331702363999663358869296693765232701087487872606287651215678117982769333263424530048349886338191672000649776344735688777038908317935895545479771750928675097454702913124841960320021274672197296187088995346243239131294305233657221950357770047779041168948\",\n           \"18.764455497316603659697964676682244441947566581055018250974850982088974686459881812049067093753928158863642280317022246479491132048354932411165733919156970301233277913734990931824860100667882748928084034147822613522025142522120240087012670818451468498896073922908905983528384054249374818979283244638542138214163225714979901542761366770616662189716515808719831023436094002277345660650710470976214503432\",\n           \"18.794085668866182740204823781307373749785233327862921970091261536522099678420128101122831261188800902247301052497120590553831148856384993334702795779266689462427228385943774192181671843132138022659399715350825905060669445319905454600530058604054055511420322690455781203696250448217551628254838303648547201462249630753150471851402187751539728462449395082445265630322991793425964521071134426892761087686\",\n           \"18.82328326768867946516209716586995768024335839807194833176766112965627616145648993732694510000805245875257813926012495009414082293067923695618654400188454857448056930551075037023425200611189368317293241290052197494133870263300149851324237139757643613913686228545143709137199633423670636305032456696459165988858650794045361585281861601603030153235699981659298052458840307661288883784791255308752353561\",\n           \"18.852060742573912900871064645288864648159675216435305629278797553184221367993840166607573470069267053513735624040087819326415506386854437946403720812228284865900153407303755694944652909440890918000505344963394853809579466102995490946923404655914747241389209313457700354163158136320973199396402856713949800424774426208733366034958384913000571799639761622099679737940788622933241370717844146251711932128\",\n           \"18.880430012539655701065719740012642650514689061888847292472446317260576484360479108374318422256748212928421929786176000015552730066213309405093412502424231235041703778572229968621812094224953783751727048234887878221529796434400738059144871066371011576734445290684672478932371976691435646196856591582073749970279840730554499319160664075936135140351358832332481792115613668240634181554442075595951874232\",\n           \"18.908402496471717232311467781165733233171140941896760455553034330908971709296619686804159498334964006649119069488646486948675866965781697617293443993292894960273992948681816600748607581132058645469709895004815813032481899164996133398853203604094641445335770040577643758444125343960451089873183667195183097301272165939070294009329717796749663916249651314647264543061678516229808974080105230884519025421\",\n           \"18.935989140719681524355183827184271883117018713616424044375161718824065979531438908152091359516789236304421957752893530968312896089478807820652680723918795442056690234785900341761515097938048245785367391810983836804772037480360220145546699221066508593371664219887047644628393373836620900288539062774663891696384999640649150431067240627749142322666676970274474792135970231868616050929898319819448939034\",\n           \"18.963200444815204167404888798469665227431788358892299847438551435971105813566329353339851076750530262901184430318825907802984559086828099838800823075902608236275943927671387049630228757166718632225359114181378374769186216486342164672374303171089906235756037703334480067642792992542669516647312965086899057259968955796081732571906843773036664256360263051447703790357359429377002031207739864979999279347\",\n           \"18.990046485464088033353325238570094871523592746407402454864447659438418650897352188003827603659585905257296788261872980663015351591030286798753545075312871886708540373690732957230479307213846083134185408782477823043603415914158563765104431367119681516469558190435321626296408405773925785846797696565762444462069369032104851518168840362055319574446706630124442642806832354006488607879109906061011225994\",\n           \"19.016536938949335590921908878972071081608578803308502271146163132935001206102423418117835863551157682291011036313549071538079474102791095379250735204641651869626255407971202952320707788423726057706822543117840676308428340234652209177652929619836857962138281947043694787969753375808877555756525156889419987622193160096718082756877689454214937644538436622120458515758071395625444960838247998451767464267\",\n           \"19.042681102069820040323211057777714109150558076228575985448688497208727928412122242888431932498284067180966108960090928128416538326586163291672353531766027111567123306015724614143020205136706498507055346813817986209642505418179828757157587146552894936306186818734849750397304488535715134906592464324381660408650130874094490704788761416060096501351661608424222204094369103147551037672603814369634649173\",\n           \"19.068487911727958175697030382906549671323284692477975980792892280404995909757933182996822232452584791269433004172376138676679805214029937405307084300414313959313789831600985178255638111559270519906326622715617717964168412002699242926437873012736620082535900009120622005729068876661407020205549742970102634687260159098231611555026386636952356914915597529253373429394903680674472796958663494038067669179\",\n           \"19.093965963269656159901801532857652686731313095114787279282350143184060615248880952958892345276101741792959203039945279273255821413683057071718873479055914318955623580559627285483449590741119271240498698177664589148961791164562328382134513604070535948997556425774535241433839196056647337630745324677877037589790564832932809741759428622931327986353687891898499439791429917840804474313864245639140963876\",\n           \"19.119123527670705331793258647026174473061813878914781070641605073424527485626683566355878191198143709838509389044950724156590593262994411423265514055870555330957166471517671117689943118929441254707396532385048466111853801352620946858612646592880180562600210076019427990165200479741063391057955342589569972650353707736819649707138135073772494722116787681314798945037658461538374603477221825614061123586\",\n           \"19.143968567655614969812922707872905228504499895574401195919290684664632292543319151929670686365568982588326143748358606442800755409560708661213139514248609009613770051771501624762852458893105259920477327438788243371302722213272226600736522283567127277667156871770413468147870394343816746792945999572244176333552811712447483231232773171106511438260175071145300046115843401710072061507331123043607901766\",\n           \"19.168508752827482780609154136923082745746771414212427034681109262302000645968087085215520638009496537393752178754873475983837687377025695010556483691979309217953419255985001727184619660158435191823702770674175581797631578786818852604111682506864006199186805540809913091091561814668081471402749434233431033452441548505582706019452955567976154397574205270457372773342241946969622998755580434262211071558\",\n           \"19.192751473880834042563713562225153433521577940186973776803866639536641104273721851582869330116346851241224039623128541122821371810756925681002641212419779923811384320279466454221232217629041792882431116499214977303106306157966687858071257893713340199820635963233697984370035461108601863346164084264967404520613456100656965925875472210769471793070984755357524002396981276686789870757739219539841324669\",\n           \"19.216703855963329593992083348877341510356872855419154524286060224198192164950344042194924570763041352943159776496534086655621090662648765929073480563926604513272233491262353914647091955902924297702861031248271549558718609763974479507490837350364617085882753391176792131259310397149374028556893735115741447201974608383790314541221313482249282941830681505989160209022143487123591182161037084387107577471\",\n           \"19.240372771246783136336288622974117018573581443774444767997147210768023102387819846722491865244820295698055584478151667485670300985795814036287612086238394489310685917822308982062485897587424683040075624404469719368214374255580054164790522993745386564072906888203344350441788631572056395846260169628655731587443716443908470481602481327796867951175756539602824534024677208143458306390998693538144276002\",\n           \"19.263764850762979509196317705761686108092922892356892210254799469999751475179529646750512177469718303426094538082717842694993912366018532429385996195100165328675330327321101942399890523238950583083919577089467043577581159099371618262297126999910295820866611740582812686480215151994304295620401944519281853807987442610790122820927006439539980791908595120476521299636624843377591628005484740938263373595\",\n           \"19.286886495555294522450851525927489255646333848651043717882790718796769943763203547772413744395083720600670009266257171342692898145198064660758379840502214228374875168690401725272168814130387964227940171355345107459707413634435078254467165459318134413588306046635342334572072865760417877208230914828250259039270224031775041480686581149991980042698893384296012208438178584526032640636530664689171174514\",\n           \"19.309743887193036513569909003754932688390195189494409126081957694707453295769725463252527373922995550848707616892717734716346726926003376949988744940329952938435722400261306789658518736487435455592323288866363564460056999876237001095092480820045715217327131479089102764865100373961878408215166685028270522348153253852064527393390794401890890932406298166622224431486187051653736399833197687524233000392\",\n           \"19.332342997691718269365647851051829244300572144237799985690236148794296859647334840581772744190077146167636205171422529047782401411481872480699008041273574144705390909628455554205882856537701103044535844002047328262877230706418721410147702147287802942241134713881576962004492246225067150128745210304021219616585555420191917418786300056829952680702638022710700076784220324428140020802898115083347702904\",\n           \"19.354689598879088211883278917315015191222443867565368209411861608347893184500809153071123456883339348988675265028178228103174790923741638364554293709103213239495123865898742141584076941660965692453426480770865774436380303703020587851939728834028918714275983773159730132531253761589283704592841895713231304417993106469276962707965968679020792759185611101812841427933459395519877074670185732532077876915\",\n           \"19.376789271243668798743209719830951710660724013826759987563467708214368337563307069810449676142525612003499201086112645501159094078378318648014400550345870757023544381773094826620272453238529286555419097429861755219673554476395943490245768513403194721941361801918811127988057063915654267554707302094460700078255016831241731287084620030531370389406858605301314913503432729894455360413554796057743624785\",\n           \"19.398647412299738536733101983020344760416543000933452586938357216391679714568872063480206587627849607725892049860100424409512218327903976557192129920072602449053963631370720893361294311430877864798057636106390383386608343478253049758287190639090148001663846660919016228401517981946486814580501445191763231914170223651871543954569563229752867364010807484149328122287932691728836607206296504503654291916\",\n           \"19.420269244500125639443026886412358511499173347101740173789245348545649777799992933455717128782979425999232096035698012165274922488616903998818326535687811364645463339885951676665882203155018792792505473796600843314336576346118972683035247786115152970665197263535031125663311669153219106967873840911780618890220192918885584791820817380351857621444438732170662912318105800373867459654881916254806601924\",\n           \"19.441659822725832764853886827062860938003360575287073851586808019473777348197590834815623551815029267586554639358825375063360984210103069003729612683914916394217674289812465439813541316938870999354861402160375582810342455043995730819816948505547453029096197833928688735935982538915244747599958654970407704104602569366784225221531104839626781845870092648147888203880688567605208831444945817857785153427\",\n           \"19.462824041379362514202453738329145059871795167945778128620896576209292571177865023083134487492542931078517939464890630420523665550799939651548618906955780515811541533057671943504991862669514142328738958049297858093270685582461594213632344682911288013670395835728596839923778216755784200501989248577166652556656745561631320914185098036550279972269808563352717494278133064808018424486494613581670904697\",\n           \"19.483766641106643718481178395114340475919752681994355643610181441860832131581914604665304968112958314746911243491535376957183544987386808635080341126118126364286470448001964590403332961518317007864293940732767763315935539659300785943459751426720740528037173390794501709108627539732588206226415399674048608843262175783293190807110169521287571898125826758063922707869247389042070537305271065057452360137\",\n           \"19.504492215170652185153425611551614568097792837031617515988255748353971463776213613651972980845739009653411602074763823583486335276886222365741099356087975815479321535979397651959714956358141934399110351847826398926624666313434326948757230737160647513320407575743953348133831681915668076630219831345596329489041495050445409516995558844346940248424949708046529076568535423815692145534030368195098701895\",\n           \"19.52500521549816144973266072401605164852396136071234571245810367391072812166019661923143396972741343266046339927362413412251126099193801965681827360699083448218860273549526903661234475357554150017778848244185893299525191263899191588797634058235164494448438674653809951435022502560679429105527325418829543863756825670476364629140951247734867887985343458291386040322597855003211338820555010939867273248\",\n           \"19.545309958419535630089123088329455125777373731767323301911891787605488456921558805681207304272616222501167615837357366396904683096528060072684210523189673108467018417135186800678628444987751206147451054525963839562634340820804697604369657105969423354842149829173951943549166420900709500398322624130365195674097282456714104812933002700523506427441210494461469512180706693823193924457440917371176532034\",\n           \"19.565410630120075532420489068555321524954362381908007338302983473268528473151341321768804731192210840056455228388636731122203200610869021021871133154865620432257415783302175345843898977949742849569372169004904667621738405749986270376895267386643049526766451459390277406632576412790748533372863644721976845168460840162066672290292749672668879524315410824251032084115058493720402881895485689493165441193\",\n       }};\n\n   T pi    = static_cast<T>(\"3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609\");\n   T tenth = 1;\n   tenth /= 10;\n   T logten = log(T(10));\n\n   unsigned max_err = 0;\n   for (unsigned k = 0; k < data.size(); k++)\n   {\n      T        val = boost::multiprecision::log(tenth + pi * (100 * k) * (100 * k));\n      T        e   = relative_error(val, T(data[k]));\n      unsigned err = e.template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n\n      val = boost::multiprecision::log(1 / (tenth + pi * (100 * k) * (100 * k)));\n      e   = relative_error(val, T(-T(data[k])));\n      err = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         max_err = err;\n      }\n\n      val = boost::multiprecision::log10(tenth + pi * (100 * k) * (100 * k));\n      e   = relative_error(val, T(T(data[k]) / logten));\n      err = e.template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n\n      val = boost::multiprecision::log10(1 / (tenth + pi * (100 * k) * (100 * k)));\n      e   = relative_error(val, T(-T(data[k]) / logten));\n      err = e.template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n   }\n   std::cout << \"Max error was: \" << max_err << std::endl;\n#if defined(BOOST_INTEL) && defined(TEST_FLOAT128)\n   BOOST_TEST(max_err < 20);\n#else\n   BOOST_TEST(max_err < 10);\n#endif\n   BOOST_TEST(log(T(1)) == 0);\n   //\n   // Some tricky special cases:\n   //\n   BOOST_CHECK((boost::math::isfinite)(log((std::numeric_limits<T>::max)())));\n   BOOST_CHECK((boost::math::isfinite)(log((std::numeric_limits<T>::min)())));\n   BOOST_CHECK((boost::math::isfinite)(log10((std::numeric_limits<T>::max)())));\n   BOOST_CHECK((boost::math::isfinite)(log10((std::numeric_limits<T>::min)())));\n}\n\nint main()\n{\n#ifdef TEST_BACKEND\n   test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();\n#endif\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::mpf_float_50>();\n   test<boost::multiprecision::mpf_float_100>();\n#endif\n#ifdef TEST_MPFR_50\n   test<boost::multiprecision::mpfr_float_50>();\n   test<boost::multiprecision::mpfr_float_100>();\n#endif\n#ifdef TEST_MPFI_50\n   test<boost::multiprecision::mpfi_float_50>();\n   test<boost::multiprecision::mpfi_float_100>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>();\n   test<boost::multiprecision::cpp_dec_float_100>();\n#ifndef SLOW_COMPLER\n   // Some \"peculiar\" digit counts which stress our code:\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();\n   // Check low multiprecision digit counts.\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >();\n#endif\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_miller_rabin.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/miller_rabin.hpp>\n#include <boost/math/special_functions/prime.hpp>\n#include <boost/random.hpp>\n#include <random>\n#include <iostream>\n#include <iomanip>\n#include \"test.hpp\"\n\ntemplate <class I>\nvoid test()\n{\n   //\n   // Very simple test program to verify that the GMP's Miller-Rabin\n   // implementation and this one agree on whether some random numbers\n   // are prime or not.  Of course these are probabilistic tests so there's\n   // no reason why they should actually agree - except the probability of\n   // disagreement for 25 trials is almost infinitely small.\n   //\n   using namespace boost::random;\n   using namespace boost::multiprecision;\n\n   typedef I test_type;\n\n   static const unsigned test_bits =\n      std::numeric_limits<test_type>::digits && (std::numeric_limits<test_type>::digits <= 256)\n         ? std::numeric_limits<test_type>::digits\n         : 128;\n\n   independent_bits_engine<mt11213b, test_bits, test_type> gen;\n   //\n   // We must use a different generator for the tests and number generation, otherwise\n   // we get false positives.  Further we use the same random number engine for the\n   // Miller Rabin test as GMP uses internally:\n   //\n   mt19937 gen2;\n\n   //\n   // Begin by testing the primes in our table as all these should return true:\n   //\n   for (unsigned i = 1; i < boost::math::max_prime; ++i)\n   {\n      BOOST_TEST(miller_rabin_test(test_type(boost::math::prime(i)), 25, gen));\n      BOOST_TEST(mpz_probab_prime_p(mpz_int(boost::math::prime(i)).backend().data(), 25));\n   }\n   //\n   // Now test some random values and compare GMP's native routine with ours.\n   //\n   for (unsigned i = 0; i < 10000; ++i)\n   {\n      test_type n              = gen();\n      bool      is_prime_boost = miller_rabin_test(n, 25, gen2);\n      bool      is_gmp_prime   = mpz_probab_prime_p(mpz_int(n).backend().data(), 25) ? true : false;\n      if (is_prime_boost && is_gmp_prime)\n      {\n         std::cout << \"We have a prime: \" << std::hex << std::showbase << n << std::endl;\n      }\n      if (is_prime_boost != is_gmp_prime)\n         std::cout << std::hex << std::showbase << \"n = \" << n << std::endl;\n      BOOST_CHECK_EQUAL(is_prime_boost, is_gmp_prime);\n   }\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n   test<mpz_int>();\n   test<number<gmp_int, et_off> >();\n   test<std::uint64_t>();\n   test<std::uint32_t>();\n\n   test<cpp_int>();\n   test<number<cpp_int_backend<64, 64, unsigned_magnitude, checked, void>, et_off> >();\n   test<checked_uint128_t>();\n   test<checked_uint1024_t>();\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_mixed.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2015 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_MATH_TEST_MIXED_HPP\n#define BOOST_MATH_TEST_MIXED_HPP\n\n#include \"test.hpp\"\n\ntemplate <class Big, class Small>\nvoid test_floats(const std::integral_constant<bool, true>)\n{\n   Big big_val = boost::math::constants::pi<Big>();\n   Small small   = boost::math::constants::pi<Small>();\n   Small small2   = boost::math::constants::e<Small>();\n   Big r;\n\n   r = big_val + small;\n   BOOST_CHECK_EQUAL(r, big_val + Big(small));\n   r = small + big_val;\n   BOOST_CHECK_EQUAL(r, big_val + Big(small));\n   r = small + small;\n   BOOST_CHECK_EQUAL(r, Small(small + small));\n\n   r = big_val - small;\n   BOOST_CHECK_EQUAL(r, big_val - Big(small));\n   r = small - big_val;\n   BOOST_CHECK_EQUAL(r, Big(small) - big_val);\n   r = small - small2;\n   BOOST_CHECK_EQUAL(r, Small(small - small2));\n\n   r = big_val * small;\n   BOOST_CHECK_EQUAL(r, big_val * Big(small));\n   r = small * big_val;\n   BOOST_CHECK_EQUAL(r, Big(small) * big_val);\n   r = small * small2;\n   BOOST_CHECK_EQUAL(r, Small(small * small2));\n\n   r = big_val / small;\n   BOOST_CHECK_EQUAL(r, big_val / Big(small));\n   r = small / big_val;\n   BOOST_CHECK_EQUAL(r, Big(small) / big_val);\n   r = small / small2;\n   BOOST_CHECK_EQUAL(r, Small(small / small2));\n\n}\n\ntemplate <class Big, class Small>\nvoid test_floats(const std::integral_constant<bool, false>){}\n\ntemplate <class Big, class Small>\nvoid test()\n{\n   Big big_val = 1;\n   big_val += std::numeric_limits<Big>::epsilon();\n   Small small_val = 1;\n\n   BOOST_CHECK_EQUAL(big_val == small_val, false);\n   BOOST_CHECK_EQUAL(big_val <= small_val, false);\n   BOOST_CHECK_EQUAL(big_val >= small_val, true);\n   BOOST_CHECK_EQUAL(big_val < small_val, false);\n   BOOST_CHECK_EQUAL(big_val > small_val, true);\n   BOOST_CHECK_EQUAL(big_val != small_val, true);\n   BOOST_CHECK_EQUAL(small_val == big_val, false);\n   BOOST_CHECK_EQUAL(small_val <= big_val, true);\n   BOOST_CHECK_EQUAL(small_val >= big_val, false);\n   BOOST_CHECK_EQUAL(small_val < big_val, true);\n   BOOST_CHECK_EQUAL(small_val > big_val, false);\n   BOOST_CHECK_EQUAL(small_val != big_val, true);\n   // Again with expression templates, on one the other, or both args:\n   BOOST_CHECK_EQUAL(big_val == small_val * 1, false);\n   BOOST_CHECK_EQUAL(big_val <= small_val * 1, false);\n   BOOST_CHECK_EQUAL(big_val >= small_val * 1, true);\n   BOOST_CHECK_EQUAL(big_val < small_val * 1, false);\n   BOOST_CHECK_EQUAL(big_val > small_val * 1, true);\n   BOOST_CHECK_EQUAL(big_val != small_val * 1, true);\n   BOOST_CHECK_EQUAL(small_val * 1 == big_val, false);\n   BOOST_CHECK_EQUAL(small_val * 1 <= big_val, true);\n   BOOST_CHECK_EQUAL(small_val * 1 >= big_val, false);\n   BOOST_CHECK_EQUAL(small_val * 1 < big_val, true);\n   BOOST_CHECK_EQUAL(small_val * 1 > big_val, false);\n   BOOST_CHECK_EQUAL(small_val * 1 != big_val, true);\n   BOOST_CHECK_EQUAL(big_val * 1 == small_val, false);\n   BOOST_CHECK_EQUAL(big_val * 1 <= small_val, false);\n   BOOST_CHECK_EQUAL(big_val * 1 >= small_val, true);\n   BOOST_CHECK_EQUAL(big_val * 1 < small_val, false);\n   BOOST_CHECK_EQUAL(big_val * 1 > small_val, true);\n   BOOST_CHECK_EQUAL(big_val * 1 != small_val, true);\n   BOOST_CHECK_EQUAL(small_val == big_val * 1, false);\n   BOOST_CHECK_EQUAL(small_val <= big_val * 1, true);\n   BOOST_CHECK_EQUAL(small_val >= big_val * 1, false);\n   BOOST_CHECK_EQUAL(small_val < big_val * 1, true);\n   BOOST_CHECK_EQUAL(small_val > big_val * 1, false);\n   BOOST_CHECK_EQUAL(small_val != big_val * 1, true);\n   BOOST_CHECK_EQUAL(big_val * 1 == small_val * 1, false);\n   BOOST_CHECK_EQUAL(big_val * 1 <= small_val * 1, false);\n   BOOST_CHECK_EQUAL(big_val * 1 >= small_val * 1, true);\n   BOOST_CHECK_EQUAL(big_val * 1 < small_val * 1, false);\n   BOOST_CHECK_EQUAL(big_val * 1 > small_val * 1, true);\n   BOOST_CHECK_EQUAL(big_val * 1 != small_val * 1, true);\n   BOOST_CHECK_EQUAL(small_val * 1 == big_val * 1, false);\n   BOOST_CHECK_EQUAL(small_val * 1 <= big_val * 1, true);\n   BOOST_CHECK_EQUAL(small_val * 1 >= big_val * 1, false);\n   BOOST_CHECK_EQUAL(small_val * 1 < big_val * 1, true);\n   BOOST_CHECK_EQUAL(small_val * 1 > big_val * 1, false);\n   BOOST_CHECK_EQUAL(small_val * 1 != big_val * 1, true);\n\n   BOOST_CHECK_EQUAL(small_val + big_val, Big(small_val) + big_val);\n   BOOST_CHECK_EQUAL(small_val - big_val, Big(small_val) - big_val);\n   BOOST_CHECK_EQUAL(small_val * big_val, Big(small_val) * big_val);\n   BOOST_CHECK_EQUAL(small_val / big_val, Big(small_val) / big_val);\n   BOOST_CHECK_EQUAL(big_val + small_val, big_val + Big(small_val));\n   BOOST_CHECK_EQUAL(big_val - small_val, big_val - Big(small_val));\n   BOOST_CHECK_EQUAL(big_val * small_val, big_val * Big(small_val));\n   BOOST_CHECK_EQUAL(big_val / small_val, big_val / Big(small_val));\n   // Again with expression templates, on one the other, or both args:\n   BOOST_CHECK_EQUAL(small_val + (big_val * 1), Big(small_val) + (big_val * 1));\n   BOOST_CHECK_EQUAL(small_val - (big_val * 1), Big(small_val) - (big_val * 1));\n   BOOST_CHECK_EQUAL(small_val * (big_val * 1), Big(small_val) * (big_val * 1));\n   BOOST_CHECK_EQUAL(small_val / (big_val * 1), Big(small_val) / (big_val * 1));\n   BOOST_CHECK_EQUAL((big_val * 1) + small_val, (big_val * 1) + Big(small_val));\n   BOOST_CHECK_EQUAL((big_val * 1) - small_val, (big_val * 1) - Big(small_val));\n   BOOST_CHECK_EQUAL((big_val * 1) * small_val, (big_val * 1) * Big(small_val));\n   BOOST_CHECK_EQUAL((big_val * 1) / small_val, (big_val * 1) / Big(small_val));\n   BOOST_CHECK_EQUAL((small_val * 1) + big_val, Big((small_val * 1)) + big_val);\n   BOOST_CHECK_EQUAL((small_val * 1) - big_val, Big((small_val * 1)) - big_val);\n   BOOST_CHECK_EQUAL((small_val * 1) * big_val, Big((small_val * 1)) * big_val);\n   BOOST_CHECK_EQUAL((small_val * 1) / big_val, Big((small_val * 1)) / big_val);\n   BOOST_CHECK_EQUAL(big_val + (small_val * 1), big_val + Big((small_val * 1)));\n   BOOST_CHECK_EQUAL(big_val - (small_val * 1), big_val - Big((small_val * 1)));\n   BOOST_CHECK_EQUAL(big_val * (small_val * 1), big_val * Big((small_val * 1)));\n   BOOST_CHECK_EQUAL(big_val / (small_val * 1), big_val / Big((small_val * 1)));\n   BOOST_CHECK_EQUAL((small_val * 1) + (big_val * 1), Big((small_val * 1)) + (big_val * 1));\n   BOOST_CHECK_EQUAL((small_val * 1) - (big_val * 1), Big((small_val * 1)) - (big_val * 1));\n   BOOST_CHECK_EQUAL((small_val * 1) * (big_val * 1), Big((small_val * 1)) * (big_val * 1));\n   BOOST_CHECK_EQUAL((small_val * 1) / (big_val * 1), Big((small_val * 1)) / (big_val * 1));\n   BOOST_CHECK_EQUAL((big_val * 1) + (small_val * 1), (big_val * 1) + Big((small_val * 1)));\n   BOOST_CHECK_EQUAL((big_val * 1) - (small_val * 1), (big_val * 1) - Big((small_val * 1)));\n   BOOST_CHECK_EQUAL((big_val * 1) * (small_val * 1), (big_val * 1) * Big((small_val * 1)));\n   BOOST_CHECK_EQUAL((big_val * 1) / (small_val * 1), (big_val * 1) / Big((small_val * 1)));\n\n   big_val = 1;\n   big_val -= std::numeric_limits<Big>::epsilon();\n\n   BOOST_CHECK_EQUAL(big_val == small_val, false);\n   BOOST_CHECK_EQUAL(big_val <= small_val, true);\n   BOOST_CHECK_EQUAL(big_val >= small_val, false);\n   BOOST_CHECK_EQUAL(big_val < small_val, true);\n   BOOST_CHECK_EQUAL(big_val > small_val, false);\n   BOOST_CHECK_EQUAL(big_val != small_val, true);\n   BOOST_CHECK_EQUAL(small_val == big_val, false);\n   BOOST_CHECK_EQUAL(small_val <= big_val, false);\n   BOOST_CHECK_EQUAL(small_val >= big_val, true);\n   BOOST_CHECK_EQUAL(small_val < big_val, false);\n   BOOST_CHECK_EQUAL(small_val > big_val, true);\n   BOOST_CHECK_EQUAL(small_val != big_val, true);\n   // Again with expression templates, on one the other, or both args:\n   BOOST_CHECK_EQUAL(big_val == small_val * 1, false);\n   BOOST_CHECK_EQUAL(big_val <= small_val * 1, true);\n   BOOST_CHECK_EQUAL(big_val >= small_val * 1, false);\n   BOOST_CHECK_EQUAL(big_val < small_val * 1, true);\n   BOOST_CHECK_EQUAL(big_val > small_val * 1, false);\n   BOOST_CHECK_EQUAL(big_val != small_val * 1, true);\n   BOOST_CHECK_EQUAL(small_val * 1 == big_val, false);\n   BOOST_CHECK_EQUAL(small_val * 1 <= big_val, false);\n   BOOST_CHECK_EQUAL(small_val * 1 >= big_val, true);\n   BOOST_CHECK_EQUAL(small_val * 1 < big_val, false);\n   BOOST_CHECK_EQUAL(small_val * 1 > big_val, true);\n   BOOST_CHECK_EQUAL(small_val * 1 != big_val, true);\n   BOOST_CHECK_EQUAL(big_val * 1 == small_val, false);\n   BOOST_CHECK_EQUAL(big_val * 1 <= small_val, true);\n   BOOST_CHECK_EQUAL(big_val * 1 >= small_val, false);\n   BOOST_CHECK_EQUAL(big_val * 1 < small_val, true);\n   BOOST_CHECK_EQUAL(big_val * 1 > small_val, false);\n   BOOST_CHECK_EQUAL(big_val * 1 != small_val, true);\n   BOOST_CHECK_EQUAL(small_val == big_val * 1, false);\n   BOOST_CHECK_EQUAL(small_val <= big_val * 1, false);\n   BOOST_CHECK_EQUAL(small_val >= big_val * 1, true);\n   BOOST_CHECK_EQUAL(small_val < big_val * 1, false);\n   BOOST_CHECK_EQUAL(small_val > big_val * 1, true);\n   BOOST_CHECK_EQUAL(small_val != big_val * 1, true);\n   BOOST_CHECK_EQUAL(big_val * 1 == small_val * 1, false);\n   BOOST_CHECK_EQUAL(big_val * 1 <= small_val * 1, true);\n   BOOST_CHECK_EQUAL(big_val * 1 >= small_val * 1, false);\n   BOOST_CHECK_EQUAL(big_val * 1 < small_val * 1, true);\n   BOOST_CHECK_EQUAL(big_val * 1 > small_val * 1, false);\n   BOOST_CHECK_EQUAL(big_val * 1 != small_val * 1, true);\n   BOOST_CHECK_EQUAL(small_val * 1 == big_val * 1, false);\n   BOOST_CHECK_EQUAL(small_val * 1 <= big_val * 1, false);\n   BOOST_CHECK_EQUAL(small_val * 1 >= big_val * 1, true);\n   BOOST_CHECK_EQUAL(small_val * 1 < big_val * 1, false);\n   BOOST_CHECK_EQUAL(small_val * 1 > big_val * 1, true);\n   BOOST_CHECK_EQUAL(small_val * 1 != big_val * 1, true);\n\n   BOOST_CHECK_EQUAL(small_val + big_val, Big(small_val) + big_val);\n   BOOST_CHECK_EQUAL(small_val - big_val, Big(small_val) - big_val);\n   BOOST_CHECK_EQUAL(small_val * big_val, Big(small_val) * big_val);\n   BOOST_CHECK_EQUAL(small_val / big_val, Big(small_val) / big_val);\n   BOOST_CHECK_EQUAL(big_val + small_val, big_val + Big(small_val));\n   BOOST_CHECK_EQUAL(big_val - small_val, big_val - Big(small_val));\n   BOOST_CHECK_EQUAL(big_val * small_val, big_val * Big(small_val));\n   BOOST_CHECK_EQUAL(big_val / small_val, big_val / Big(small_val));\n   // Again with expression templates, on one the other, or both args:\n   BOOST_CHECK_EQUAL(small_val + (big_val * 1), Big(small_val) + (big_val * 1));\n   BOOST_CHECK_EQUAL(small_val - (big_val * 1), Big(small_val) - (big_val * 1));\n   BOOST_CHECK_EQUAL(small_val * (big_val * 1), Big(small_val) * (big_val * 1));\n   BOOST_CHECK_EQUAL(small_val / (big_val * 1), Big(small_val) / (big_val * 1));\n   BOOST_CHECK_EQUAL((big_val * 1) + small_val, (big_val * 1) + Big(small_val));\n   BOOST_CHECK_EQUAL((big_val * 1) - small_val, (big_val * 1) - Big(small_val));\n   BOOST_CHECK_EQUAL((big_val * 1) * small_val, (big_val * 1) * Big(small_val));\n   BOOST_CHECK_EQUAL((big_val * 1) / small_val, (big_val * 1) / Big(small_val));\n   BOOST_CHECK_EQUAL((small_val * 1) + big_val, Big((small_val * 1)) + big_val);\n   BOOST_CHECK_EQUAL((small_val * 1) - big_val, Big((small_val * 1)) - big_val);\n   BOOST_CHECK_EQUAL((small_val * 1) * big_val, Big((small_val * 1)) * big_val);\n   BOOST_CHECK_EQUAL((small_val * 1) / big_val, Big((small_val * 1)) / big_val);\n   BOOST_CHECK_EQUAL(big_val + (small_val * 1), big_val + Big((small_val * 1)));\n   BOOST_CHECK_EQUAL(big_val - (small_val * 1), big_val - Big((small_val * 1)));\n   BOOST_CHECK_EQUAL(big_val * (small_val * 1), big_val * Big((small_val * 1)));\n   BOOST_CHECK_EQUAL(big_val / (small_val * 1), big_val / Big((small_val * 1)));\n   BOOST_CHECK_EQUAL((small_val * 1) + (big_val * 1), Big((small_val * 1)) + (big_val * 1));\n   BOOST_CHECK_EQUAL((small_val * 1) - (big_val * 1), Big((small_val * 1)) - (big_val * 1));\n   BOOST_CHECK_EQUAL((small_val * 1) * (big_val * 1), Big((small_val * 1)) * (big_val * 1));\n   BOOST_CHECK_EQUAL((small_val * 1) / (big_val * 1), Big((small_val * 1)) / (big_val * 1));\n   BOOST_CHECK_EQUAL((big_val * 1) + (small_val * 1), (big_val * 1) + Big((small_val * 1)));\n   BOOST_CHECK_EQUAL((big_val * 1) - (small_val * 1), (big_val * 1) - Big((small_val * 1)));\n   BOOST_CHECK_EQUAL((big_val * 1) * (small_val * 1), (big_val * 1) * Big((small_val * 1)));\n   BOOST_CHECK_EQUAL((big_val * 1) / (small_val * 1), (big_val * 1) / Big((small_val * 1)));\n\n   test_floats<Big, Small>(std::integral_constant<bool, boost::multiprecision::number_category<Big>::value == boost::multiprecision::number_kind_floating_point>());\n}\n\n#endif // BOOST_MATH_TEST_MIXED_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_mixed_cpp_bin_float.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include \"test_mixed.hpp\"\n\nint main()\n{\n#ifndef BOOST_NO_EXCEPTIONS\n   try\n   {\n#endif\n      typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<100>, boost::multiprecision::et_on>  big_type1;\n      typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<50>, boost::multiprecision::et_on>   small_type1;\n      typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<100>, boost::multiprecision::et_off> big_type2;\n      typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<50>, boost::multiprecision::et_off>  small_type2;\n\n      test<big_type1, small_type1>();\n      test<big_type2, small_type2>();\n      test<big_type1, small_type2>();\n      test<big_type2, small_type1>();\n\n      typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<100, boost::multiprecision::digit_base_10, std::allocator<char> >, boost::multiprecision::et_on> big_type1a;\n\n      test<big_type1, big_type1a>();\n#ifndef BOOST_NO_EXCEPTIONS\n   }\n   catch (const std::exception& e)\n   {\n      std::cout << \"Failed with unexpected exception: \" << e.what() << std::endl;\n      return 1;\n   }\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_mixed_cpp_dec_float.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include \"test_mixed.hpp\"\n\nint main()\n{\n#ifndef BOOST_NO_EXCEPTIONS\n   try\n   {\n#endif\n      typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_on>  big_type1;\n      typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_on>   small_type1;\n      typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_off> big_type2;\n      typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off>  small_type2;\n\n      test<big_type1, small_type1>();\n      test<big_type2, small_type2>();\n      test<big_type1, small_type2>();\n      test<big_type2, small_type1>();\n#ifndef BOOST_NO_EXCEPTIONS\n   }\n   catch (const std::exception& e)\n   {\n      std::cout << \"Failed with unexpected exception: \" << e.what() << std::endl;\n      return 1;\n   }\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_mixed_cpp_int.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//\n// Compare arithmetic results using fixed_int to GMP results.\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include \"test.hpp\"\n\ntemplate <class Number, class BigNumber>\nvoid test()\n{\n   using namespace boost::multiprecision;\n   typedef Number test_type;\n\n   test_type h = (std::numeric_limits<test_type>::max)();\n   test_type l = (std::numeric_limits<test_type>::max)();\n   BigNumber r;\n\n   add(r, h, h);\n   BOOST_CHECK_EQUAL(r, cpp_int(h) + cpp_int(h));\n\n   multiply(r, h, h);\n   BOOST_CHECK_EQUAL(r, cpp_int(h) * cpp_int(h));\n\n   if (std::numeric_limits<test_type>::is_signed)\n   {\n      subtract(r, l, h);\n      BOOST_CHECK_EQUAL(r, cpp_int(l) - cpp_int(h));\n      subtract(r, h, l);\n      BOOST_CHECK_EQUAL(r, cpp_int(h) - cpp_int(l));\n      multiply(r, l, l);\n      BOOST_CHECK_EQUAL(r, cpp_int(l) * cpp_int(l));\n   }\n\n   //\n   // Try again with integer types as the source:\n   //\n   enum\n   {\n      max_digits = std::numeric_limits<test_type>::is_signed ? std::numeric_limits<long long>::digits : std::numeric_limits<unsigned long long>::digits\n   };\n   enum\n   {\n      require_digits = std::numeric_limits<test_type>::digits <= 2 * max_digits ? std::numeric_limits<test_type>::digits / 2 : max_digits\n   };\n\n   using uint_least = typename boost::multiprecision::detail::uint_t<require_digits>::least;\n   using int_least = typename boost::multiprecision::detail::int_t<require_digits>::least;\n   using i_type = typename std::conditional<std::numeric_limits<test_type>::is_signed, int_least, uint_least>::type;\n\n   i_type ih = (std::numeric_limits<i_type>::max)();\n   i_type il = (std::numeric_limits<i_type>::max)();\n\n   add(r, ih, ih);\n   BOOST_CHECK_EQUAL(r, cpp_int(ih) + cpp_int(ih));\n\n   multiply(r, ih, ih);\n   BOOST_CHECK_EQUAL(r, cpp_int(ih) * cpp_int(ih));\n\n   if (std::numeric_limits<test_type>::is_signed)\n   {\n      subtract(r, il, ih);\n      BOOST_CHECK_EQUAL(r, cpp_int(il) - cpp_int(ih));\n      subtract(r, ih, il);\n      BOOST_CHECK_EQUAL(r, cpp_int(ih) - cpp_int(il));\n      multiply(r, il, il);\n      BOOST_CHECK_EQUAL(r, cpp_int(il) * cpp_int(il));\n   }\n}\n\nvoid test_rational_mixed()\n{\n   using namespace boost::multiprecision;\n   cpp_int      a(2);\n   cpp_rational r(10);\n\n   BOOST_CHECK_EQUAL(a + -r, -8);\n   BOOST_CHECK_EQUAL(-r + a, -8);\n   BOOST_CHECK_EQUAL(-a + r, 8);\n   BOOST_CHECK_EQUAL(r + -a, 8);\n\n   BOOST_CHECK_EQUAL(a - -r, 12);\n   BOOST_CHECK_EQUAL(-r - a, -12);\n   BOOST_CHECK_EQUAL(-a - r, -12);\n   BOOST_CHECK_EQUAL(r - -a, 12);\n\n   BOOST_CHECK_EQUAL(a * -r, -20);\n   BOOST_CHECK_EQUAL(-r * a, -20);\n   BOOST_CHECK_EQUAL(-a * r, -20);\n   BOOST_CHECK_EQUAL(r * -a, -20);\n\n   BOOST_CHECK_EQUAL(a / -r, cpp_rational(-2, 10));\n   BOOST_CHECK_EQUAL(-r / a, -5);\n   BOOST_CHECK_EQUAL(cpp_rational(-a / r), cpp_rational(-2, 10));\n   BOOST_CHECK_EQUAL(r / -a, -5);\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n   test_rational_mixed();\n\n   test<checked_int512_t, checked_int1024_t>();\n   test<checked_int256_t, checked_int512_t>();\n   test<number<cpp_int_backend<64, 64, signed_magnitude, checked, void>, et_off>, checked_int128_t>();\n   test<std::int64_t, checked_int128_t>();\n   test<number<cpp_int_backend<4096, 4096, signed_magnitude, checked, void>, et_off>, cpp_int>();\n   test<number<cpp_int_backend<4096> >, cpp_int>();\n\n   test<checked_uint512_t, checked_uint1024_t>();\n   test<checked_uint256_t, checked_uint512_t>();\n   test<number<cpp_int_backend<64, 64, unsigned_magnitude, checked, void>, et_off>, checked_uint128_t>();\n   test<std::uint64_t, checked_int128_t>();\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_mixed_float.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//\n// Compare arithmetic results using fixed_int to GMP results.\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#ifdef TEST_GMP\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_MPFR\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include \"test.hpp\"\n\ntemplate <class Number, class BigNumber>\nvoid test()\n{\n   using namespace boost::multiprecision;\n   typedef Number test_type;\n\n   test_type a = 1;\n   a /= 3;\n   test_type b = -a;\n\n   BigNumber r;\n   BOOST_CHECK_EQUAL(add(r, a, a), BigNumber(a) + BigNumber(a));\n   BOOST_CHECK_EQUAL(subtract(r, a, b), BigNumber(a) - BigNumber(b));\n   BOOST_CHECK_EQUAL(subtract(r, b, a), BigNumber(b) - BigNumber(a));\n   BOOST_CHECK_EQUAL(multiply(r, a, a), BigNumber(a) * BigNumber(a));\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n   test<cpp_dec_float_50, cpp_dec_float_100>();\n\n#ifdef TEST_GMP\n   test<mpf_float_50, mpf_float_100>();\n#endif\n#ifdef TEST_MPFR\n   test<mpfr_float_50, mpfr_float_100>();\n#endif\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_mixed_move_cpp_int.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2020 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//\n// Compare arithmetic results using fixed_int to GMP results.\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include \"test.hpp\"\n\n#ifdef __clang__\n#if __has_feature(address_sanitizer) || __has_feature(memory_sanitizer)\n// memory sanitizer is incompatible with this test:\n# define DISABLE_THIS_TEST\n#endif\n#endif\n#ifdef BOOST_CI_ASAN_BUILD\n#define DISABLE_THIS_TEST\n#endif\n\n#ifndef DISABLE_THIS_TEST\n\nunsigned alloc_count = 0;\nvoid* operator new(std::size_t count)\n{\n   ++alloc_count;\n   return std::malloc(count);\n}\nvoid* operator new[](std::size_t count)\n{\n   ++alloc_count;\n   return std::malloc(count);\n}\nvoid operator delete(void* p)noexcept\n{\n   return std::free(p);\n}\nvoid operator delete(void* p, std::size_t)\n{\n   return ::operator delete(p);\n}\nvoid operator delete[](void* p)noexcept\n{\n   return std::free(p);\n}\nvoid operator delete[](void* p, std::size_t)\n{\n   return ::operator delete[](p);\n}\n\n\n\ntemplate <class From, class To>\nvoid test_one(From val)\n{\n   From copy(val);\n   To   target(val);\n   alloc_count = 0;\n   To   moved(std::move(copy));\n   BOOST_CHECK_EQUAL(alloc_count, 0);\n   BOOST_CHECK_EQUAL(moved, target);\n   copy = val;\n   moved = 0;\n   BOOST_CHECK_EQUAL(copy, val);\n   BOOST_CHECK_EQUAL(moved, 0);\n   alloc_count = 0;\n   moved = std::move(copy);\n   BOOST_CHECK_EQUAL(alloc_count, 0);\n   BOOST_CHECK_EQUAL(moved, target);\n}\n\ntemplate <class From, class To>\nvoid test()\n{\n   From val(10);\n   From limit = pow(From(2), 1000);\n\n   while (val < limit)\n   {\n      test_one<From, To>(val);\n      test_one<From, To>(-val);\n      val *= 100;\n      val /= 3;\n   }\n}\n\ntemplate <class From, class To>\nvoid test_operations()\n{\n   From a = From(1) << 150;\n   From b = From(1) << 149;\n   {\n      alloc_count = 0;\n      To c        = a * b;\n      BOOST_CHECK_EQUAL(alloc_count, 0);\n      BOOST_CHECK_EQUAL(c, a * b);\n   }\n   {\n      alloc_count = 0;\n      To c;\n      multiply(c, a, b);\n      BOOST_CHECK_EQUAL(alloc_count, 0);\n      BOOST_CHECK_EQUAL(c, a * b);\n   }\n   {\n      alloc_count = 0;\n      To c        = a + b;\n      BOOST_CHECK_EQUAL(alloc_count, 0);\n      BOOST_CHECK_EQUAL(c, a + b);\n   }\n   {\n      alloc_count = 0;\n      To c;\n      add(c, a, b);\n      BOOST_CHECK_EQUAL(alloc_count, 0);\n      BOOST_CHECK_EQUAL(c, a + b);\n   }\n   {\n      alloc_count = 0;\n      To c        = -a;\n      BOOST_CHECK_EQUAL(alloc_count, 0);\n      BOOST_CHECK_EQUAL(c, -a);\n   }\n   {\n      alloc_count = 0;\n      To c        = a - b;\n      BOOST_CHECK_EQUAL(alloc_count, 0);\n      BOOST_CHECK_EQUAL(c, a - b);\n   }\n   {\n      alloc_count = 0;\n      To c;\n      subtract(c, a, b);\n      BOOST_CHECK_EQUAL(alloc_count, 0);\n      BOOST_CHECK_EQUAL(c, a - b);\n   }\n   {\n      alloc_count = 0;\n      To c        = a / b;\n      BOOST_CHECK_EQUAL(alloc_count, 0);\n      BOOST_CHECK_EQUAL(c, a / b);\n   }\n   {\n      alloc_count = 0;\n      To c        = a % b;\n      BOOST_CHECK_EQUAL(alloc_count, 0);\n      BOOST_CHECK_EQUAL(c, a % b);\n   }\n   {\n      alloc_count = 0;\n      To c        = a << 1;\n      BOOST_CHECK_EQUAL(alloc_count, 0);\n      BOOST_CHECK_EQUAL(c, a << 1);\n   }\n   {\n      alloc_count = 0;\n      To c        = a >> 1;\n      BOOST_CHECK_EQUAL(alloc_count, 0);\n      BOOST_CHECK_EQUAL(c, a >> 1);\n   }\n   {\n      alloc_count = 0;\n      To c        = a | b;\n      BOOST_CHECK_EQUAL(alloc_count, 0);\n      BOOST_CHECK_EQUAL(c, a | b);\n   }\n   {\n      alloc_count = 0;\n      To c        = a & b;\n      BOOST_CHECK_EQUAL(alloc_count, 0);\n      BOOST_CHECK_EQUAL(c, a & b);\n   }\n   {\n      alloc_count = 0;\n      To c        = a ^ b;\n      BOOST_CHECK_EQUAL(alloc_count, 0);\n      BOOST_CHECK_EQUAL(c, a ^ b);\n   }\n   {\n      alloc_count = 0;\n      To c        = gcd(a, b);\n      BOOST_CHECK_EQUAL(c, gcd(a, b));\n   }\n   {\n      alloc_count = 0;\n      To c        = lcm(a, b);\n      BOOST_CHECK_EQUAL(c, lcm(a, b));\n   }\n   {\n      alloc_count = 0;\n      To c        = pow(a, 2);\n      BOOST_CHECK_EQUAL(c, pow(a, 2));\n   }\n   {\n      alloc_count = 0;\n      To c        = powm(a, b, 2);\n      BOOST_CHECK_EQUAL(c, powm(a, b, 2));\n   }\n   {\n      alloc_count = 0;\n      To c        = sqrt(a);\n      BOOST_CHECK_EQUAL(c, sqrt(a));\n   }\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n   //\n   // Our \"From\" type has the MinBits argument as small as possible,\n   // should it be larger than the default used in cpp_int then we\n   // may get allocations causing the tests above to fail since the\n   // internal cache in type From is larger than that of cpp_int and so\n   // allocation may be needed even on a move.\n   //\n   test<number<cpp_int_backend<sizeof(limb_type) * CHAR_BIT * 2> >, cpp_int>();\n\n   typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<512> > To;\n   test_operations<cpp_int, To>();\n\n   return boost::report_errors();\n}\n\n#else\nint main(){ return 0; }\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_mixed_mpf_float.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/gmp.hpp>\n#include \"test_mixed.hpp\"\n\nint main()\n{\n#ifndef BOOST_NO_EXCEPTIONS\n   try\n   {\n#endif\n      typedef boost::multiprecision::number<boost::multiprecision::gmp_float<100>, boost::multiprecision::et_on>  big_type1;\n      typedef boost::multiprecision::number<boost::multiprecision::gmp_float<50>, boost::multiprecision::et_on>   small_type1;\n      typedef boost::multiprecision::number<boost::multiprecision::gmp_float<100>, boost::multiprecision::et_off> big_type2;\n      typedef boost::multiprecision::number<boost::multiprecision::gmp_float<50>, boost::multiprecision::et_off>  small_type2;\n\n      test<big_type1, small_type1>();\n      test<big_type2, small_type2>();\n      test<big_type1, small_type2>();\n      test<big_type2, small_type1>();\n#ifndef BOOST_NO_EXCEPTIONS\n   }\n   catch (const std::exception& e)\n   {\n      std::cout << \"Failed with unexpected exception: \" << e.what() << std::endl;\n      return 1;\n   }\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_mixed_mpfr_float.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/mpfr.hpp>\n#include \"test_mixed.hpp\"\n\nint main()\n{\n#ifndef BOOST_NO_EXCEPTIONS\n   try\n   {\n#endif\n      typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<100>, boost::multiprecision::et_on>  big_type1;\n      typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<50>, boost::multiprecision::et_on>   small_type1;\n      typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<100>, boost::multiprecision::et_off> big_type2;\n      typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<50>, boost::multiprecision::et_off>  small_type2;\n\n      test<big_type1, small_type1>();\n      test<big_type2, small_type2>();\n      test<big_type1, small_type2>();\n      test<big_type2, small_type1>();\n#ifndef BOOST_NO_EXCEPTIONS\n   }\n   catch (const std::exception& e)\n   {\n      std::cout << \"Failed with unexpected exception: \" << e.what() << std::endl;\n      return 1;\n   }\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_move.cpp",
    "content": "// Copyright John Maddock 2012.\n\n// Use, modification and distribution are subject to the\n// Boost Software License, Version 1.0.\n// (See accompanying file LICENSE_1_0.txt\n// or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/config.hpp>\n#include <vector>\n\n#if !defined(TEST_GMP) && !defined(TEST_MPFR) && !defined(TEST_TOMMATH) && !defined(TEST_CPP_INT) && !defined(TEST_MPC)\n#define TEST_GMP\n#define TEST_MPFR\n#define TEST_TOMMATH\n#define TEST_CPP_INT\n#define TEST_MPC\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_GMP)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(TEST_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#ifdef TEST_TOMMATH\n#include <boost/multiprecision/tommath.hpp>\n#endif\n#ifdef TEST_CPP_INT\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n#ifdef TEST_MPC\n#include <boost/multiprecision/mpc.hpp>\n#endif\n\n#include \"test.hpp\"\n\nunsigned allocation_count = 0;\n\nvoid* (*alloc_func_ptr)(size_t);\nvoid* (*realloc_func_ptr)(void*, size_t, size_t);\nvoid (*free_func_ptr)(void*, size_t);\n\nvoid* alloc_func(size_t n)\n{\n   ++allocation_count;\n   return (*alloc_func_ptr)(n);\n}\n\nvoid free_func(void* p, size_t n)\n{\n   (*free_func_ptr)(p, n);\n}\n\nvoid* realloc_func(void* p, size_t old, size_t n)\n{\n   ++allocation_count;\n   return (*realloc_func_ptr)(p, old, n);\n}\n\ntemplate <class T>\nvoid do_something(const T&)\n{\n}\n\ntemplate <class T>\nvoid test_std_lib()\n{\n   std::vector<T> v;\n   for (unsigned i = 0; i < 100; ++i)\n      v.insert(v.begin(), i);\n\n   T a(2), b(3);\n   std::swap(a, b);\n   BOOST_TEST(a == 3);\n   BOOST_TEST(b == 2);\n}\n\ntemplate <class T, class A>\nvoid test_move_and_assign(T x, A val)\n{\n   // move away from x, then assign val to x.\n   T z(x);\n   T y(std::move(x));\n   x.assign(val);\n   BOOST_CHECK_EQUAL(x, T(val));\n   BOOST_CHECK_EQUAL(z, y);\n}\n\ntemplate <class T>\nvoid test_move_and_assign()\n{\n   T x(23);\n   test_move_and_assign(x, static_cast<short>(2));\n   test_move_and_assign(x, static_cast<int>(2));\n   test_move_and_assign(x, static_cast<long>(2));\n   test_move_and_assign(x, static_cast<long long>(2));\n   test_move_and_assign(x, static_cast<unsigned short>(2));\n   test_move_and_assign(x, static_cast<unsigned int>(2));\n   test_move_and_assign(x, static_cast<unsigned long>(2));\n   test_move_and_assign(x, static_cast<unsigned long long>(2));\n   test_move_and_assign(x, static_cast<float>(2));\n   test_move_and_assign(x, static_cast<double>(2));\n   test_move_and_assign(x, static_cast<long double>(2));\n   test_move_and_assign(x, x);\n   test_move_and_assign(x, \"23\");\n}\n\nint main()\n{\n#if defined(TEST_MPFR) || defined(TEST_GMP)\n#if defined(MPFR_VERSION) && (MPFR_VERSION_MAJOR > 3)\n   mpfr_mp_memory_cleanup();\n#endif\n   mp_get_memory_functions(&alloc_func_ptr, &realloc_func_ptr, &free_func_ptr);\n   mp_set_memory_functions(&alloc_func, &realloc_func, &free_func);\n#endif\n\n   using namespace boost::multiprecision;\n\n#ifdef TEST_MPFR\n   {\n      test_std_lib<mpfr_float_50>();\n      mpfr_float_50 a = 2;\n      if (allocation_count)\n      {\n         //\n         // We can only conduct meaningful tests if we're actually using our custom allocators,\n         // there are some situations where mpfr-4.x doesn't call them even though we've\n         // done everything requested to make them work....\n         //\n         allocation_count = 0;\n         mpfr_float_50 b  = std::move(a);\n         BOOST_TEST(allocation_count == 0);\n         //\n         // Move assign - we rely on knowledge of the internals to make this test work!!\n         //\n         mpfr_float_50 c(3);\n         do_something(b);\n         do_something(c);\n         const void* p = b.backend().data()[0]._mpfr_d;\n         BOOST_TEST(c.backend().data()[0]._mpfr_d != p);\n         c = std::move(b);\n         BOOST_TEST(c.backend().data()[0]._mpfr_d == p);\n         BOOST_TEST(b.backend().data()[0]._mpfr_d != p);\n         //\n         // Again with variable precision, this we can test more easily:\n         //\n         mpfr_float d, e;\n         d.precision(100);\n         e.precision(1000);\n         d                = 2;\n         e                = 3;\n         allocation_count = 0;\n         BOOST_TEST(d == 2);\n         d = std::move(e);\n         BOOST_TEST(allocation_count == 0);\n         BOOST_TEST(d == 3);\n         e = 2;\n         BOOST_TEST(e == 2);\n         d = std::move(e);\n         e = d;\n         BOOST_TEST(e == d);\n\n         test_move_and_assign<mpfr_float>();\n         test_move_and_assign<mpfr_float_50>();\n      }\n   }\n#endif\n#ifdef TEST_MPC\n   {\n      test_std_lib<mpc_complex_50>();\n      mpc_complex_50 a = 2;\n      if (allocation_count)\n      {\n         //\n         // We can only conduct meaningful tests if we're actually using our custom allocators,\n         // there are some situations where mpfr-4.x doesn't call them even though we've\n         // done everything requested to make them work....\n         //\n         allocation_count = 0;\n         mpc_complex_50 b = std::move(a);\n         BOOST_TEST(allocation_count == 0);\n         //\n         // Move assign - we rely on knowledge of the internals to make this test work!!\n         //\n         mpc_complex_50 c(3);\n         do_something(b);\n         do_something(c);\n         //\n         // Again with variable precision, this we can test more easily:\n         //\n         mpc_complex d, e;\n         d.precision(100);\n         e.precision(1000);\n         d                = 2;\n         e                = 3;\n         allocation_count = 0;\n         BOOST_TEST(d == 2);\n         d = std::move(e);\n         BOOST_TEST(allocation_count == 0);\n         BOOST_TEST(d == 3);\n         e = 2;\n         BOOST_TEST(e == 2);\n         d = std::move(e);\n         e = d;\n         BOOST_TEST(e == d);\n\n         test_move_and_assign<mpc_complex>();\n         test_move_and_assign<mpc_complex_50>();\n      }\n   }\n#endif\n#ifdef TEST_GMP\n   {\n      test_std_lib<mpf_float_50>();\n      mpf_float_50 a = 2;\n      BOOST_TEST(allocation_count); // sanity check that we are tracking allocations\n      allocation_count = 0;\n      mpf_float_50 b   = std::move(a);\n      BOOST_TEST(allocation_count == 0);\n      //\n      // Move assign: this requires knowledge of the internals to test!!\n      //\n      mpf_float_50 c(3);\n      do_something(b);\n      do_something(c);\n      const void* p = b.backend().data()[0]._mp_d;\n      BOOST_TEST(c.backend().data()[0]._mp_d != p);\n      c = std::move(b);\n      BOOST_TEST(c.backend().data()[0]._mp_d == p);\n      BOOST_TEST(b.backend().data()[0]._mp_d != p);\n      //\n      // Again with variable precision, this we can test more easily:\n      //\n      mpf_float d, e;\n      d.precision(100);\n      e.precision(1000);\n      d                = 2;\n      e                = 3;\n      allocation_count = 0;\n      BOOST_TEST(d == 2);\n      d = std::move(e);\n      BOOST_TEST(allocation_count == 0);\n      BOOST_TEST(d == 3);\n      e = 2;\n      BOOST_TEST(e == 2);\n      d = std::move(e);\n      e = d;\n      BOOST_TEST(e == d);\n\n      test_move_and_assign<mpf_float>();\n      test_move_and_assign<mpf_float_50>();\n   }\n   {\n      test_std_lib<mpz_int>();\n      mpz_int a = 2;\n      BOOST_TEST(allocation_count); // sanity check that we are tracking allocations\n      allocation_count = 0;\n      mpz_int b        = std::move(a);\n      BOOST_TEST(allocation_count == 0);\n\n      //\n      // Move assign:\n      //\n      mpz_int d, e;\n      d = 2;\n      d <<= 1000;\n      e                = 3;\n      allocation_count = 0;\n      e                = std::move(d);\n      BOOST_TEST(allocation_count == 0);\n      e = 2;\n      BOOST_TEST(e == 2);\n      d = std::move(e);\n      e = d;\n      BOOST_TEST(e == d);\n\n      test_move_and_assign<mpz_int>();\n   }\n   {\n      test_std_lib<mpq_rational>();\n      mpq_rational a = 2;\n      BOOST_TEST(allocation_count); // sanity check that we are tracking allocations\n      allocation_count = 0;\n      mpq_rational b   = std::move(a);\n      BOOST_TEST(allocation_count == 0);\n\n      //\n      // Move assign:\n      //\n      mpq_rational d, e;\n      d                = mpz_int(2) << 1000;\n      e                = 3;\n      allocation_count = 0;\n      e                = std::move(d);\n      BOOST_TEST(allocation_count == 0);\n      d = 2;\n      BOOST_TEST(d == 2);\n      d = std::move(e);\n      e = d;\n      BOOST_TEST(e == d);\n\n      test_move_and_assign<mpq_rational>();\n   }\n#endif\n#ifdef TEST_TOMMATH\n   {\n      test_std_lib<tom_int>();\n      tom_int     a = 2;\n      void const* p = a.backend().data().dp;\n      tom_int     b = std::move(a);\n      BOOST_TEST(b.backend().data().dp == p);\n      // We can't test this, as it will assert inside data():\n      //BOOST_TEST(a.backend().data().dp == 0);\n\n      //\n      // Move assign:\n      //\n      tom_int d, e;\n      d = 2;\n      d <<= 1000;\n      e = 3;\n      p = d.backend().data().dp;\n      BOOST_TEST(p != e.backend().data().dp);\n      e = std::move(d);\n      BOOST_TEST(e.backend().data().dp == p);\n      d = 2;\n      BOOST_TEST(d == 2);\n      d = std::move(e);\n      e = d;\n      BOOST_TEST(e == d);\n\n      test_move_and_assign<tom_int>();\n   }\n#endif\n#ifdef TEST_CPP_INT\n   {\n      test_std_lib<cpp_int>();\n      cpp_int a = 2;\n      a <<= 1000; // Force dynamic allocation.\n      void const* p = a.backend().limbs();\n      cpp_int     b = std::move(a);\n      BOOST_TEST(b.backend().limbs() == p);\n\n      //\n      // Move assign:\n      //\n      cpp_int d, e;\n      d = 2;\n      d <<= 1000;\n      e = 3;\n      e <<= 1000;\n      p = d.backend().limbs();\n      BOOST_TEST(p != e.backend().limbs());\n      e = std::move(d);\n      BOOST_TEST(e.backend().limbs() == p);\n      d = 2;\n      BOOST_TEST(d == 2);\n      d = std::move(e);\n      e = d;\n      BOOST_TEST(e == d);\n\n      test_move_and_assign<cpp_int>();\n      test_move_and_assign<int512_t>();\n   }\n#endif\n   return boost::report_errors();\n}\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_mpc_conversions.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#include <boost/multiprecision/mpc.hpp>\n#include <boost/multiprecision/gmp.hpp>\n\nint main()\n{\n   using namespace boost::multiprecision;\n   //\n   // Test interconversions between GMP supported backends:\n   //\n   mpf_t  mpf;\n   mpz_t  mpz;\n   mpq_t  mpq;\n   mpfr_t mpfr;\n   mpf_init2(mpf, 100);\n   mpf_set_ui(mpf, 2u);\n   mpz_init(mpz);\n   mpz_set_ui(mpz, 2u);\n   mpq_init(mpq);\n   mpq_set_ui(mpq, 2u, 1u);\n   mpfr_init(mpfr);\n   mpfr_set_ui(mpfr, 2u, GMP_RNDN);\n\n   BOOST_TEST(mpc_complex(mpf) == 2);\n   BOOST_TEST(mpc_complex_50(mpf) == 2);\n   BOOST_TEST(mpc_complex(mpz) == 2);\n   BOOST_TEST(mpc_complex_50(mpz) == 2);\n   BOOST_TEST(mpc_complex(mpq) == 2);\n   BOOST_TEST(mpc_complex_50(mpq) == 2);\n   BOOST_TEST(mpc_complex(mpfr) == 2);\n   BOOST_TEST(mpc_complex_50(mpfr) == 2);\n\n   mpc_complex    f0;\n   mpc_complex_50 f50;\n   f0 = mpf;\n   BOOST_TEST(f0 == 2);\n   f0 = 0;\n   f0 = mpz;\n   BOOST_TEST(f0 == 2);\n   f0 = 0;\n   f0 = mpq;\n   BOOST_TEST(f0 == 2);\n   f0 = mpfr;\n   BOOST_TEST(f0 == 2);\n\n   f50 = mpf;\n   BOOST_TEST(f50 == 2);\n   f50 = 0;\n   f50 = mpz;\n   BOOST_TEST(f50 == 2);\n   f50 = 0;\n   f50 = mpq;\n   BOOST_TEST(f50 == 2);\n   f50 = mpfr;\n   BOOST_TEST(f50 == 2);\n\n   f50 = 4;\n   f0  = f50;\n   BOOST_TEST(f0 == 4);\n   f0  = 3;\n   f50 = f0;\n   BOOST_TEST(f50 == 3);\n   f50 = 4;\n   BOOST_TEST(mpc_complex(f50) == 4);\n   BOOST_TEST(mpc_complex_50(f0) == 3);\n\n   mpz_int      iz(2);\n   mpq_rational rat(2);\n   mpf_float    gf(2);\n   f50 = 3;\n   f50 = iz;\n   BOOST_TEST(f50 == 2);\n   f50 = 3;\n   f0  = iz;\n   BOOST_TEST(f0 == 2);\n   f50 = 3;\n   f0  = gf;\n   BOOST_TEST(f0 == 2);\n   BOOST_TEST(mpc_complex(iz) == 2);\n   BOOST_TEST(mpc_complex_50(iz) == 2);\n   BOOST_TEST(mpc_complex(rat) == 2);\n   BOOST_TEST(mpc_complex_50(rat) == 2);\n   BOOST_TEST(mpc_complex(gf) == 2);\n   BOOST_TEST(mpc_complex_50(gf) == 2);\n\n   //\n   // Conversions involving precision only:\n   //\n   mpc_complex::default_precision(30);\n   f50 = 2;\n   mpc_complex_100 f100(3);\n   mpc_complex     f0a(4);\n   mpc_complex     f0b(f100);\n   BOOST_TEST(f0a.precision() == 30);\n   BOOST_TEST(f0b.precision() == 100);\n   f0a = f100;\n   BOOST_TEST(f0a == 3);\n   BOOST_TEST(f0a.precision() == 100); // precision preserved on assignment\n\n   f100 = f50;\n   BOOST_TEST(f100 == 2);\n\n   f50 = static_cast<mpc_complex_50>(f100);\n\n   mpf_clear(mpf);\n   mpz_clear(mpz);\n   mpq_clear(mpq);\n   mpfr_clear(mpfr);\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_mpc_overloads.cpp",
    "content": "//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#include <type_traits>\n#include \"test.hpp\"\n#include <boost/multiprecision/mpc.hpp>\n#include <boost/math/constants/constants.hpp>\n\nusing boost::multiprecision::mpc_complex_100;\n\ntemplate <class Complex>\nvoid test_overloads()\n{\n   typedef typename Complex::value_type Real;\n   Complex                              ya = {5.2, 7.4};\n   Complex                              yb = {8.2, 7.3};\n   Real                                 h  = 0.0001;\n   auto                                 I0 = (ya + yb) * h;\n   Complex                              I1 = I0 / 2 + yb * h;\n\n   //I1 = I0;  // not supposed to work.\n\n   Complex                      z{2, 3};\n   typename Complex::value_type theta = 0.2;\n   int                          n     = 2;\n   using std::sin;\n   Complex arg = z * sin(theta) - n * theta;\n\n   using std::exp;\n   Real    v    = 0.2;\n   Real    cotv = 7.8;\n   Real    cscv = 8.2;\n   Complex den  = z + v * cscv * exp(-v * cotv);\n\n   boost::multiprecision::number<boost::multiprecision::backends::mpc_complex_backend<100> > a = 2;\n   boost::multiprecision::number<boost::multiprecision::backends::mpc_complex_backend<100> > b = 3;\n   /*\n  if (a <= b) {\n    b = a;\n  }*/\n}\n\ntemplate <class F, class Real>\ntypename std::result_of_t<F(Real)> some_functional(F f, Real a, Real b)\n{\n   if (a <= -boost::math::tools::max_value<Real>())\n   {\n      return f(a);\n   }\n\n   return f(b);\n}\n\ntemplate <class Complex>\nvoid test_functional()\n{\n   typedef typename Complex::value_type Real;\n   auto                                 f      = [](Real x) -> Complex { Complex z(x, 3); return z; };\n   Real                                 a      = 0;\n   Real                                 b      = 1;\n   Complex                              result = some_functional(f, a, b);\n}\n\nint main()\n{\n   test_overloads<mpc_complex_100>();\n   test_functional<mpc_complex_100>();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_mpf_precisions.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include \"test.hpp\"\n\n#include <boost/multiprecision/gmp.hpp>\n\ntemplate <class T>\nT make_rvalue_copy(const T a)\n{\n   return a;\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n   //\n   // Test change of default precision:\n   //\n   mpf_float::default_precision(100);\n   mpf_float a(\"0.1\");\n   BOOST_CHECK_GE(a.precision(), 100);\n   mpf_float::default_precision(20);\n   {\n      // test assignment from lvalue:\n      mpf_float b(2);\n      BOOST_CHECK_GE(b.precision(), 20);\n      b = a;\n      BOOST_CHECK_EQUAL(b.precision(), a.precision());\n   }\n   {\n      // test assignment from rvalue:\n      mpf_float b(2);\n      BOOST_CHECK_GE(b.precision(), 20);\n      b = make_rvalue_copy(a);\n      BOOST_CHECK_EQUAL(b.precision(), a.precision());\n   }\n   mpf_float::default_precision(20);\n   {\n      // test construct from lvalue:\n      mpf_float b(a);\n      BOOST_CHECK_EQUAL(b.precision(), a.precision());\n   }\n   {\n      // test construct from rvalue:\n      mpf_float b(make_rvalue_copy(a));\n      BOOST_CHECK_EQUAL(b.precision(), a.precision());\n   }\n   {\n      mpf_float f150(2, 150);\n      BOOST_CHECK_GE(f150.precision(), 150);\n   }\n   {\n      mpf_float f150(\"1.2\", 150);\n      BOOST_CHECK_GE(f150.precision(), 150);\n   }\n   //\n   // From https://github.com/boostorg/multiprecision/issues/65\n   //\n   {\n      mpf_float a(2);\n      a.precision(100);\n      BOOST_CHECK_EQUAL(a, 2);\n      BOOST_CHECK_GE(a.precision(), 100);\n   }\n\n   //\n   // string_view with explicit precision:\n   //\n#ifndef BOOST_NO_CXX17_HDR_STRING_VIEW\n   {\n      std::string      s(\"222\");\n      std::string_view v(s.c_str(), 1);\n      mpf_float        f(v, 100);\n      BOOST_CHECK_EQUAL(f, 2);\n      BOOST_CHECK_GE(f.precision(), 100);\n   }\n#endif\n   // Swap:\n   {\n      mpf_float x(2, 100); // 100 digits precision.\n      mpf_float y(3, 50);  // 50 digits precision.\n      swap(x, y);\n      BOOST_CHECK_EQUAL(x, 3);\n      BOOST_CHECK_EQUAL(y, 2);\n      BOOST_CHECK_GE(x.precision(), 50);\n      BOOST_CHECK_GE(y.precision(), 100);\n      x.swap(y);\n      BOOST_CHECK_EQUAL(x, 2);\n      BOOST_CHECK_EQUAL(y, 3);\n      BOOST_CHECK_GE(x.precision(), 100);\n      BOOST_CHECK_GE(y.precision(), 50);\n      x = std::move(mpf_float(y));\n      BOOST_CHECK_EQUAL(x, y);\n      BOOST_CHECK_EQUAL(x.precision(), y.precision());\n   }\n   {\n      mpf_float c(4), d(8), e(9), f;\n      f = (c + d) * d / e;\n      mpf_float g((c + d) * d / e);\n   }\n   {\n      mpf_float::default_precision(100);\n      mpf_float f1;\n      f1 = 3;\n      BOOST_CHECK_GE(f1.precision(), 100);\n      f1 = 3.5;\n      BOOST_CHECK_GE(f1.precision(), 100);\n      mpf_float f2(3.5);\n      BOOST_CHECK_GE(f2.precision(), 100);\n      mpf_float f3(\"5.1\");\n      BOOST_CHECK_GE(f3.precision(), 100);\n\n      mpf_float::default_precision(50);\n      mpf_float f4(f3, 50);\n      BOOST_CHECK_GE(f4.precision(), 50);\n      f4.assign(f1, f4.precision());\n      BOOST_CHECK_GE(f4.precision(), 50);\n   }\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_mpfi.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include \"test.hpp\"\n#include <boost/multiprecision/mpfi.hpp>\n#include <boost/multiprecision/random.hpp>\n\nusing namespace boost::multiprecision;\nusing namespace boost::random;\n\nvoid test_exp()\n{\n   std::cout << \"Testing exp\\n\";\n\n   mpfr_float_50 val = 1.25;\n\n   for (unsigned i = 0; i < 2000; ++i)\n   {\n      mpfr_float_100 a(val);\n      mpfr_float_100 b  = exp(a);\n      mpfi_float_50  in = val;\n      in                = exp(in);\n      BOOST_CHECK((boost::math::isfinite)(in));\n      BOOST_CHECK(lower(in) <= b);\n      BOOST_CHECK(upper(in) >= b);\n      b  = log(a);\n      in = val;\n      in = log(in);\n      BOOST_CHECK((boost::math::isfinite)(in));\n      BOOST_CHECK(lower(in) <= b);\n      BOOST_CHECK(upper(in) >= b);\n      val *= 1.01;\n   }\n   val = 1;\n   for (unsigned i = 0; i < 2000; ++i)\n   {\n      mpfr_float_100 a(val);\n      mpfr_float_100 b  = exp(a);\n      mpfi_float_50  in = val;\n      in                = exp(in);\n      BOOST_CHECK((boost::math::isfinite)(in));\n      BOOST_CHECK(lower(in) <= b);\n      BOOST_CHECK(upper(in) >= b);\n      b  = log(a);\n      in = val;\n      in = log(in);\n      BOOST_CHECK((boost::math::isfinite)(in));\n      BOOST_CHECK(lower(in) <= b);\n      BOOST_CHECK(upper(in) >= b);\n      val /= 1.01;\n   }\n}\n\nvoid test_pow()\n{\n   std::cout << \"Testing pow function\\n\";\n\n   mt19937                                  gen;\n   uniform_real_distribution<mpfr_float_50> dist1(0, 400);\n\n   for (unsigned i = 0; i < 5000; ++i)\n   {\n      mpfr_float_50 base, p;\n      base = dist1(gen);\n      p    = dist1(gen);\n      mpfr_float_100 a, b, r;\n      a = base;\n      b = p;\n      r = pow(a, b);\n      mpfi_float_50 ai, bi, ri;\n      ai = base;\n      bi = p;\n      ri = pow(ai, bi);\n      BOOST_CHECK((boost::math::isfinite)(ri));\n      BOOST_CHECK(lower(ri) <= r);\n      BOOST_CHECK(upper(ri) >= r);\n   }\n}\n\nvoid test_trig()\n{\n   std::cout << \"Testing trig functions\\n\";\n\n   mt19937                                  gen;\n   uniform_real_distribution<mpfr_float_50> dist1(-1.57079632679, 1.57079632679);\n   uniform_real_distribution<mpfr_float_50> dist2(-1, 1);\n\n   for (unsigned i = 0; i < 5000; ++i)\n   {\n      mpfr_float_50 val;\n      val               = dist1(gen);\n      mpfr_float_100 a  = val;\n      mpfr_float_100 b  = sin(a);\n      mpfi_float_50  a2 = val;\n      mpfi_float_50  b2 = sin(a2);\n      BOOST_CHECK((boost::math::isfinite)(b2));\n      BOOST_CHECK(lower(b2) <= b);\n      BOOST_CHECK(upper(b2) >= b);\n      b  = cos(a);\n      b2 = cos(a2);\n      BOOST_CHECK((boost::math::isfinite)(b2));\n      BOOST_CHECK(lower(b2) <= b);\n      BOOST_CHECK(upper(b2) >= b);\n      b  = tan(a);\n      b2 = tan(a2);\n      BOOST_CHECK((boost::math::isfinite)(b2));\n      BOOST_CHECK(lower(b2) <= b);\n      BOOST_CHECK(upper(b2) >= b);\n   }\n   for (unsigned i = 0; i < 5000; ++i)\n   {\n      mpfr_float_50 val;\n      val               = dist2(gen);\n      mpfr_float_100 a  = val;\n      mpfr_float_100 b  = asin(a);\n      mpfi_float_50  a2 = val;\n      mpfi_float_50  b2 = asin(a2);\n      BOOST_CHECK((boost::math::isfinite)(b2));\n      BOOST_CHECK(lower(b2) <= b);\n      BOOST_CHECK(upper(b2) >= b);\n      b  = acos(a);\n      b2 = acos(a2);\n      BOOST_CHECK((boost::math::isfinite)(b2));\n      BOOST_CHECK(lower(b2) <= b);\n      BOOST_CHECK(upper(b2) >= b);\n      b  = atan(a);\n      b2 = atan(a2);\n      BOOST_CHECK((boost::math::isfinite)(b2));\n      BOOST_CHECK(lower(b2) <= b);\n      BOOST_CHECK(upper(b2) >= b);\n   }\n}\n\nvoid test_hyp()\n{\n   std::cout << \"Testing hyperbolic trig functions\\n\";\n\n   mt19937                                  gen;\n   uniform_real_distribution<mpfr_float_50> dist1(-10, 10);\n   uniform_real_distribution<mpfr_float_50> dist2(-1, 1);\n\n   for (unsigned i = 0; i < 5000; ++i)\n   {\n      mpfr_float_50 val;\n      val               = dist1(gen);\n      mpfr_float_100 a  = val;\n      mpfr_float_100 b  = sinh(a);\n      mpfi_float_50  a2 = val;\n      mpfi_float_50  b2 = sinh(a2);\n      BOOST_CHECK((boost::math::isfinite)(b2));\n      BOOST_CHECK(lower(b2) <= b);\n      BOOST_CHECK(upper(b2) >= b);\n      b  = cosh(a);\n      b2 = cosh(a2);\n      BOOST_CHECK((boost::math::isfinite)(b2));\n      BOOST_CHECK(lower(b2) <= b);\n      BOOST_CHECK(upper(b2) >= b);\n      b  = tanh(a);\n      b2 = tanh(a2);\n      BOOST_CHECK((boost::math::isfinite)(b2));\n      BOOST_CHECK(lower(b2) <= b);\n      BOOST_CHECK(upper(b2) >= b);\n   }\n}\n\nvoid test_intervals()\n{\n   mpfi_float_50 a(1, 2);\n   mpfi_float_50 b(1.5, 2.5);\n   BOOST_CHECK_EQUAL(lower(a), 1);\n   BOOST_CHECK_EQUAL(upper(a), 2);\n   BOOST_CHECK_EQUAL(median(a), 1.5);\n   BOOST_CHECK_EQUAL(width(a), 1);\n   mpfi_float_50 r = intersect(a, b);\n   BOOST_CHECK_EQUAL(lower(r), 1.5);\n   BOOST_CHECK_EQUAL(upper(r), 2);\n   r = hull(a, b);\n   BOOST_CHECK_EQUAL(lower(r), 1);\n   BOOST_CHECK_EQUAL(upper(r), 2.5);\n   BOOST_CHECK(overlap(a, b));\n   BOOST_CHECK(in(mpfr_float_50(1.5), a));\n   BOOST_CHECK(in(mpfr_float_50(1), a));\n   BOOST_CHECK(in(mpfr_float_50(2), a));\n   BOOST_CHECK(!zero_in(a));\n   b = mpfi_float_50(1.5, 1.75);\n   BOOST_CHECK(subset(b, a));\n   BOOST_CHECK(proper_subset(b, a));\n   BOOST_CHECK(!empty(a));\n   BOOST_CHECK(!singleton(a));\n   b = mpfi_float_50(5, 6);\n   r = intersect(a, b);\n   BOOST_CHECK(empty(r));\n}\n\n#ifdef TEST_SPECIAL\n#include \"math/table_type.hpp\"\n#include <boost/math/special_functions.hpp>\n\n#define T mpfi_float_50\n\ntypedef number<mpfi_float_backend<25> > mpfi_float_25;\n\nvoid test_log1p_expm1()\n{\n#include \"../../math/test/log1p_expm1_data.ipp\"\n\n   std::cout << std::setprecision(std::numeric_limits<mpfi_float_25>::max_digits10);\n   std::cout << \"Testing log1p and expm1\\n\";\n\n   for (unsigned i = 0; i < log1p_expm1_data.size(); ++i)\n   {\n      mpfi_float_25 in(log1p_expm1_data[i][0]);\n      mpfi_float_25 out = boost::math::log1p(in);\n      mpfi_float_25 expected(log1p_expm1_data[i][1]);\n      if (!subset(expected, out))\n      {\n         std::cout << in << std::endl;\n         std::cout << out << std::endl;\n         std::cout << expected << std::endl;\n         BOOST_CHECK(lower(out) <= lower(expected));\n         BOOST_CHECK(upper(out) >= upper(expected));\n      }\n      out      = boost::math::expm1(in);\n      expected = mpfi_float_25(log1p_expm1_data[i][2]);\n      if (!subset(expected, out))\n      {\n         std::cout << in << std::endl;\n         std::cout << out << std::endl;\n         std::cout << expected << std::endl;\n         BOOST_CHECK(lower(out) <= lower(expected));\n         BOOST_CHECK(upper(out) >= upper(expected));\n      }\n   }\n}\n\nvoid test_bessel()\n{\n#include \"../../math/test/bessel_i_int_data.ipp\"\n#include \"../../math/test/bessel_i_data.ipp\"\n\n   std::cout << std::setprecision(std::numeric_limits<mpfi_float_25>::max_digits10);\n   std::cout << \"Testing Bessel Functions\\n\";\n\n   for (unsigned i = 0; i < bessel_i_int_data.size(); ++i)\n   {\n      int           v = boost::lexical_cast<int>(static_cast<const char*>(bessel_i_int_data[i][0]));\n      mpfi_float_25 in(bessel_i_int_data[i][1]);\n      mpfi_float_25 out = boost::math::cyl_bessel_i(v, in);\n      mpfi_float_25 expected(bessel_i_int_data[i][2]);\n      if (!subset(expected, out))\n      {\n         std::cout << in << std::endl;\n         std::cout << out << std::endl;\n         std::cout << expected << std::endl;\n         BOOST_CHECK(lower(out) <= lower(expected));\n         BOOST_CHECK(upper(out) >= upper(expected));\n      }\n   }\n}\n\n#endif\n\nint main()\n{\n#ifdef TEST_SPECIAL\n   test_log1p_expm1();\n   test_bessel();\n#endif\n   test_intervals();\n   test_exp();\n   test_pow();\n   test_trig();\n   test_hyp();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_mpfi_precisions.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include \"test.hpp\"\n\n#include <boost/multiprecision/mpfi.hpp>\n\ntemplate <class T>\nT make_rvalue_copy(const T a)\n{\n   return a;\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n   //\n   // Test change of default precision:\n   //\n   mpfi_float::default_precision(100);\n   mpfi_float a(\"0.1\");\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   mpfi_float::default_precision(20);\n   {\n      // test assignment from lvalue:\n      mpfi_float b(2);\n      BOOST_CHECK_EQUAL(b.precision(), 20);\n      b = a;\n      BOOST_CHECK_EQUAL(b.precision(), a.precision());\n   }\n   {\n      // test assignment from rvalue:\n      mpfi_float b(2);\n      BOOST_CHECK_EQUAL(b.precision(), 20);\n      b = make_rvalue_copy(a);\n      BOOST_CHECK_EQUAL(b.precision(), a.precision());\n   }\n   mpfi_float::default_precision(20);\n   {\n      // test construct from lvalue:\n      mpfi_float b(a);\n      BOOST_CHECK_EQUAL(b.precision(), 100);\n   }\n   {\n      // test construct from rvalue:\n      mpfi_float b(make_rvalue_copy(a));\n      BOOST_CHECK_EQUAL(b.precision(), 100);\n   }\n   {\n      mpfi_float f150(2, 2, 150);\n      BOOST_CHECK_EQUAL(f150.precision(), 150);\n   }\n   {\n      mpfi_float f150(\"1.2\", \"1.2\", 150);\n      BOOST_CHECK_EQUAL(f150.precision(), 150);\n   }\n   //\n   // From https://github.com/boostorg/multiprecision/issues/65\n   //\n   {\n      mpfi_float a(2);\n      a.precision(100);\n      BOOST_CHECK_EQUAL(a, 2);\n      BOOST_CHECK_EQUAL(a.precision(), 100);\n   }\n\n   //\n   // string_view with explicit precision:\n   //\n#ifndef BOOST_NO_CXX17_HDR_STRING_VIEW\n   {\n      std::string      s(\"222\");\n      std::string_view v(s.c_str(), 1);\n      mpfi_float       f(v, v, 100);\n      BOOST_CHECK_EQUAL(f, 2);\n      BOOST_CHECK_EQUAL(f.precision(), 100);\n   }\n#endif\n   // Swap:\n   {\n      mpfi_float x(2, 2, 100); // 100 digits precision.\n      mpfi_float y(3, 3, 50);  // 50 digits precision.\n      swap(x, y);\n      BOOST_CHECK_EQUAL(x, 3);\n      BOOST_CHECK_EQUAL(y, 2);\n      BOOST_CHECK_EQUAL(x.precision(), 50);\n      BOOST_CHECK_EQUAL(y.precision(), 100);\n      x.swap(y);\n      BOOST_CHECK_EQUAL(x, 2);\n      BOOST_CHECK_EQUAL(y, 3);\n      BOOST_CHECK_EQUAL(x.precision(), 100);\n      BOOST_CHECK_EQUAL(y.precision(), 50);\n      x = std::move(mpfi_float(y));\n      BOOST_CHECK_EQUAL(x, y);\n      BOOST_CHECK_EQUAL(x.precision(), y.precision());\n   }\n   {\n      mpfi_float c(4), d(8), e(9), f;\n      f = (c + d) * d / e;\n      mpfi_float g((c + d) * d / e);\n   }\n   {\n      mpfi_float::default_precision(100);\n      mpfi_float f1;\n      f1 = 3;\n      BOOST_CHECK_EQUAL(f1.precision(), 100);\n      f1 = 3.5;\n      BOOST_CHECK_EQUAL(f1.precision(), 100);\n      mpfi_float f2(3.5);\n      BOOST_CHECK_EQUAL(f2.precision(), 100);\n      mpfi_float f3(\"5.1\");\n      BOOST_CHECK_EQUAL(f3.precision(), 100);\n\n      mpfi_float::default_precision(50);\n      mpfi_float f4(f3, 50);\n      BOOST_CHECK_EQUAL(f4.precision(), 50);\n      f4.assign(f1, f4.precision());\n      BOOST_CHECK_EQUAL(f4.precision(), 50);\n   }\n   {\n      //\n      // Check additional non-member functions,\n      // see https://github.com/boostorg/multiprecision/issues/91\n      //\n      mpfi_float::default_precision(100);\n      mpfi_float f1;\n      f1 = 3;\n      BOOST_CHECK_EQUAL(f1.precision(), 100);\n      mpfi_float::default_precision(20);\n      BOOST_CHECK_EQUAL(lower(f1).precision(), 100);\n      BOOST_CHECK_EQUAL(upper(f1).precision(), 100);\n      BOOST_CHECK_EQUAL(median(f1).precision(), 100);\n      BOOST_CHECK_EQUAL(width(f1).precision(), 100);\n      BOOST_CHECK_EQUAL(intersect(f1, f1).precision(), 100);\n      BOOST_CHECK_EQUAL(hull(f1, f1).precision(), 100);\n\n      BOOST_CHECK_EQUAL(asinh(f1).precision(), 100);\n      BOOST_CHECK_EQUAL(acosh(f1).precision(), 100);\n      BOOST_CHECK_EQUAL(atanh(f1).precision(), 100);\n      BOOST_CHECK_EQUAL(log1p(f1).precision(), 100);\n      BOOST_CHECK_EQUAL(expm1(f1).precision(), 100);\n      BOOST_CHECK_EQUAL(cbrt(f1).precision(), 100);\n   }\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_mpfr_conversions.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/multiprecision/gmp.hpp>\n\nint main()\n{\n   using namespace boost::multiprecision;\n   //\n   // Test interconversions between GMP supported backends:\n   //\n   mpf_t  mpf;\n   mpz_t  mpz;\n   mpq_t  mpq;\n   mpfr_t mpfr;\n   mpf_init2(mpf, 100);\n   mpf_set_ui(mpf, 2u);\n   mpz_init(mpz);\n   mpz_set_ui(mpz, 2u);\n   mpq_init(mpq);\n   mpq_set_ui(mpq, 2u, 1u);\n   mpfr_init(mpfr);\n   mpfr_set_ui(mpfr, 2u, GMP_RNDN);\n\n   BOOST_TEST(mpfr_float(mpf) == 2);\n   BOOST_TEST(mpfr_float_50(mpf) == 2);\n   BOOST_TEST(mpfr_float(mpz) == 2);\n   BOOST_TEST(mpfr_float_50(mpz) == 2);\n   BOOST_TEST(mpfr_float(mpq) == 2);\n   BOOST_TEST(mpfr_float_50(mpq) == 2);\n   BOOST_TEST(mpfr_float(mpfr) == 2);\n   BOOST_TEST(mpfr_float_50(mpfr) == 2);\n\n   mpfr_float    f0;\n   mpfr_float_50 f50;\n   f0 = mpf;\n   BOOST_TEST(f0 == 2);\n   f0 = 0;\n   f0 = mpz;\n   BOOST_TEST(f0 == 2);\n   f0 = 0;\n   f0 = mpq;\n   BOOST_TEST(f0 == 2);\n   f0 = mpfr;\n   BOOST_TEST(f0 == 2);\n\n   f50 = mpf;\n   BOOST_TEST(f50 == 2);\n   f50 = 0;\n   f50 = mpz;\n   BOOST_TEST(f50 == 2);\n   f50 = 0;\n   f50 = mpq;\n   BOOST_TEST(f50 == 2);\n   f50 = mpfr;\n   BOOST_TEST(f50 == 2);\n\n   f50 = 4;\n   f0  = f50;\n   BOOST_TEST(f0 == 4);\n   f0  = 3;\n   f50 = f0;\n   BOOST_TEST(f50 == 3);\n   f50 = 4;\n   BOOST_TEST(mpfr_float(f50) == 4);\n   BOOST_TEST(mpfr_float_50(f0) == 3);\n\n   mpz_int      iz(2);\n   mpq_rational rat(2);\n   mpf_float    gf(2);\n   f50 = 3;\n   f50 = iz;\n   BOOST_TEST(f50 == 2);\n   f50 = 3;\n   f0  = iz;\n   BOOST_TEST(f0 == 2);\n   f50 = 3;\n   f0  = gf;\n   BOOST_TEST(f0 == 2);\n   BOOST_TEST(mpfr_float(iz) == 2);\n   BOOST_TEST(mpfr_float_50(iz) == 2);\n   BOOST_TEST(mpfr_float(rat) == 2);\n   BOOST_TEST(mpfr_float_50(rat) == 2);\n   BOOST_TEST(mpfr_float(gf) == 2);\n   BOOST_TEST(mpfr_float_50(gf) == 2);\n\n   //\n   // Conversions involving precision only:\n   //\n   mpfr_float::default_precision(30);\n   f50 = 2;\n   mpfr_float_100 f100(3);\n   mpfr_float     f0a(4);\n   mpfr_float     f0b(f100);\n   BOOST_TEST(f0a.precision() == 30);\n   BOOST_TEST(f0b.precision() == 100);\n   f0a = f100;\n   BOOST_TEST(f0a == 3);\n   BOOST_TEST(f0a.precision() == 100); // precision preserved on assignment\n\n   f100 = f50;\n   BOOST_TEST(f100 == 2);\n\n   f50 = static_cast<mpfr_float_50>(f100);\n\n   mpf_clear(mpf);\n   mpz_clear(mpz);\n   mpq_clear(mpq);\n   mpfr_clear(mpfr);\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_mpfr_mpc_precisions.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include \"test.hpp\"\n\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/multiprecision/mpc.hpp>\n\ntemplate <class T>\nT make_rvalue_copy(const T a)\n{\n   return a;\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n   //\n   // Test change of default precision:\n   //\n   mpfr_float::default_precision(100);\n   mpfr_float a(\"0.1\");\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   mpfr_float::default_precision(20);\n   {\n      // test assignment from lvalue:\n      mpfr_float b(2);\n      BOOST_CHECK_EQUAL(b.precision(), 20);\n      b = a;\n      BOOST_CHECK_EQUAL(b.precision(), a.precision());\n   }\n   {\n      // test assignment from rvalue:\n      mpfr_float b(2);\n      BOOST_CHECK_EQUAL(b.precision(), 20);\n      b = make_rvalue_copy(a);\n      BOOST_CHECK_EQUAL(b.precision(), a.precision());\n   }\n   mpfr_float::default_precision(20);\n   {\n      // test construct from lvalue:\n      mpfr_float b(a);\n      BOOST_CHECK_EQUAL(b.precision(), 100);\n   }\n   {\n      // test construct from rvalue:\n      mpfr_float b(make_rvalue_copy(a));\n      BOOST_CHECK_EQUAL(b.precision(), 100);\n   }\n   mpc_complex::default_precision(100);\n   mpc_complex ca(\"0.1\");\n   BOOST_CHECK_EQUAL(ca.precision(), 100);\n   mpc_complex::default_precision(20);\n   {\n      // test assignment from lvalue:\n      mpc_complex b(2);\n      BOOST_CHECK_EQUAL(b.precision(), 20);\n      b = ca;\n      BOOST_CHECK_EQUAL(b.precision(), ca.precision());\n   }\n   {\n      // test assignment from rvalue:\n      mpc_complex b(2);\n      BOOST_CHECK_EQUAL(b.precision(), 20);\n      b = make_rvalue_copy(ca);\n      BOOST_CHECK_EQUAL(b.precision(), ca.precision());\n   }\n   {\n      // test construct from lvalue:\n      mpc_complex b(ca);\n      BOOST_CHECK_EQUAL(b.precision(), ca.precision());\n   }\n   {\n      // test construct from rvalue:\n      mpc_complex b(make_rvalue_copy(ca));\n      BOOST_CHECK_EQUAL(b.precision(), ca.precision());\n   }\n   // real and imaginary:\n   BOOST_CHECK_EQUAL(ca.real().precision(), 100);\n   BOOST_CHECK_EQUAL(ca.imag().precision(), 100);\n   BOOST_CHECK_EQUAL(real(ca).precision(), 100);\n   BOOST_CHECK_EQUAL(imag(ca).precision(), 100);\n\n   //\n   // Construction at specific precision:\n   //\n   {\n      mpfr_float f150(mpfr_float(), 150u);\n      BOOST_CHECK_EQUAL(f150.precision(), 150);\n      mpc_complex f150c(mpc_complex(), 150u);\n      BOOST_CHECK_EQUAL(f150c.precision(), 150);\n      mpc_complex f150cc(mpfr_float(), mpfr_float(), 150u);\n      BOOST_CHECK_EQUAL(f150cc.precision(), 150);\n   }\n   {\n      mpfr_float f150(2, 150);\n      BOOST_CHECK_EQUAL(f150.precision(), 150);\n   }\n   {\n      mpfr_float f150(\"1.2\", 150);\n      BOOST_CHECK_EQUAL(f150.precision(), 150);\n   }\n   //\n   // Copying precision:\n   //\n   {\n      mpc_complex c(ca.backend().data());\n      BOOST_CHECK_EQUAL(c.precision(), 100);\n      mpc_complex_100 c100(2);\n      mpc_complex     d(c100);\n      BOOST_CHECK_EQUAL(d.precision(), 100);\n      mpfr_float_100 f100(2);\n      mpc_complex    e(f100);\n      BOOST_CHECK_EQUAL(d.precision(), 100);\n   }\n   //\n   // Check that the overloads for precision don't mess up 2-arg\n   // construction:\n   //\n   {\n      mpc_complex c(2, 3u);\n      BOOST_CHECK_EQUAL(c.real(), 2);\n      BOOST_CHECK_EQUAL(c.imag(), 3);\n   }\n   //\n   // 3-arg complex number construction with 3rd arg a precision:\n   //\n   {\n      mpc_complex c(2, 3, 100);\n      BOOST_CHECK_EQUAL(c.precision(), 100);\n      mpfr_float_50 x(2), y(3);\n      mpc_complex   z(x, y, 100);\n      BOOST_CHECK_EQUAL(c.precision(), 100);\n   }\n   //\n   // From https://github.com/boostorg/multiprecision/issues/65\n   //\n   {\n      mpfr_float a(2);\n      a.precision(100);\n      BOOST_CHECK_EQUAL(a, 2);\n      BOOST_CHECK_EQUAL(a.precision(), 100);\n   }\n   {\n      mpc_complex a(2, 3);\n      a.precision(100);\n      BOOST_CHECK_EQUAL(a.real(), 2);\n      BOOST_CHECK_EQUAL(a.imag(), 3);\n      BOOST_CHECK_EQUAL(a.precision(), 100);\n   }\n   {\n      mpc_complex::default_precision(1000);\n      mpfr_float::default_precision(1000);\n      mpc_complex a(\"1.324719827394086120398419082734980126734089612309871092830981236748901273498071240986123094861246981263481263489016238947147129807419028748901273409127349087124612576129076541203975704195690418570914657910465091256016501650916509165097164509164509761409561097561097650791650971465097165097162059761209561029756019265019726509126509172650971625097162450971309756104975610274650917825018740981274098127409182375701465172340923847120836540491320467127043127893281461230951097260126309812374091265091824981231236409851274\",\n                    \"-0.80743891267394610982659071452346156102764312401571972642394120395608291471029347812645125986123123904123471209381289471230512983491286102875870192091283712396550981723409812740981263471230498715096104897123094710923879065981740928740981271801391209238470129560941870129387409812883437894183883841283700483832883218128438938184289148239164079329657861209381892037483468937489237419236509823723705612893489712412306531274812364980127304981648712483248732\");\n      mpc_complex::default_precision(40);\n      mpfr_float::default_precision(40);\n      BOOST_CHECK_EQUAL(a, a);\n   }\n\n   //\n   // string_view with explicit precision:\n   //\n#ifndef BOOST_NO_CXX17_HDR_STRING_VIEW\n   {\n      std::string      s(\"222\");\n      std::string_view v(s.c_str(), 1);\n      mpfr_float       f(v, 100);\n      BOOST_CHECK_EQUAL(f, 2);\n      BOOST_CHECK_EQUAL(f.precision(), 100);\n   }\n   {\n      std::string      x(\"222\"), y(\"333\");\n      std::string_view vx(x.c_str(), 1), vy(y.c_str(), 1);\n      mpc_complex      c(vx, vy, 100);\n      BOOST_CHECK_EQUAL(c.real(), 2);\n      BOOST_CHECK_EQUAL(c.imag(), 3);\n      BOOST_CHECK_EQUAL(c.precision(), 100);\n   }\n#endif\n   {\n      mpc_complex::default_precision(100);\n      mpfr_float::default_precision(100);\n      mpfr_float a(1);\n      mpfr_float b(2);\n\n      mpc_complex::default_precision(50);\n      mpfr_float::default_precision(50);\n\n      mpc_complex z(a, b);\n\n      BOOST_CHECK_EQUAL(z.precision(), 100);\n   }\n   // Swap:\n   {\n      mpfr_float x(2, 100); // 100 digits precision.\n      mpfr_float y(3, 50);  // 50 digits precision.\n      swap(x, y);\n      BOOST_CHECK_EQUAL(x, 3);\n      BOOST_CHECK_EQUAL(y, 2);\n      BOOST_CHECK_EQUAL(x.precision(), 50);\n      BOOST_CHECK_EQUAL(y.precision(), 100);\n      x.swap(y);\n      BOOST_CHECK_EQUAL(x, 2);\n      BOOST_CHECK_EQUAL(y, 3);\n      BOOST_CHECK_EQUAL(x.precision(), 100);\n      BOOST_CHECK_EQUAL(y.precision(), 50);\n      x = std::move(mpfr_float(y));\n      BOOST_CHECK_EQUAL(x, y);\n      BOOST_CHECK_EQUAL(x.precision(), y.precision());\n   }\n   {\n      mpc_complex x(2, 3, 100); // 100 digits precision.\n      mpc_complex y(3, 4, 50);  // 50 digits precision.\n      swap(x, y);\n      BOOST_CHECK_EQUAL(x.real(), 3);\n      BOOST_CHECK_EQUAL(x.imag(), 4);\n      BOOST_CHECK_EQUAL(y.real(), 2);\n      BOOST_CHECK_EQUAL(y.imag(), 3);\n      BOOST_CHECK_EQUAL(x.precision(), 50);\n      BOOST_CHECK_EQUAL(y.precision(), 100);\n      x.swap(y);\n      BOOST_CHECK_EQUAL(x.real(), 2);\n      BOOST_CHECK_EQUAL(x.imag(), 3);\n      BOOST_CHECK_EQUAL(y.real(), 3);\n      BOOST_CHECK_EQUAL(y.imag(), 4);\n      BOOST_CHECK_EQUAL(x.precision(), 100);\n      BOOST_CHECK_EQUAL(y.precision(), 50);\n      x = std::move(mpc_complex(y));\n      BOOST_CHECK_EQUAL(x, y);\n      BOOST_CHECK_EQUAL(x.precision(), y.precision());\n   }\n   {\n      mpfr_float c(4), d(8), e(9), f;\n      f = (c + d) * d / e;\n      mpfr_float g((c + d) * d / e);\n   }\n   {\n      mpfr_float::default_precision(100);\n      mpfr_float f1;\n      f1 = 3;\n      BOOST_CHECK_EQUAL(f1.precision(), 100);\n      f1 = 3.5;\n      BOOST_CHECK_EQUAL(f1.precision(), 100);\n      mpfr_float f2(3.5);\n      BOOST_CHECK_EQUAL(f2.precision(), 100);\n      mpfr_float f3(\"5.1\");\n      BOOST_CHECK_EQUAL(f3.precision(), 100);\n\n      mpfr_float::default_precision(50);\n      mpfr_float f4(f3, 50);\n      BOOST_CHECK_EQUAL(f4.precision(), 50);\n      f4.assign(f1, f4.precision());\n      BOOST_CHECK_EQUAL(f4.precision(), 50);\n   }\n   {\n      //\n      // Overloads of Math lib functions, discovered while fixing\n      // https://github.com/boostorg/multiprecision/issues/91\n      //\n      mpfr_float::default_precision(100);\n      mpfr_float f1;\n      f1 = 3;\n      BOOST_CHECK_EQUAL(f1.precision(), 100);\n      mpfr_float::default_precision(20);\n      BOOST_CHECK_EQUAL(asinh(f1).precision(), 100);\n      BOOST_CHECK_EQUAL(acosh(f1).precision(), 100);\n      BOOST_CHECK_EQUAL(atanh(f1).precision(), 100);\n      BOOST_CHECK_EQUAL(cbrt(f1).precision(), 100);\n      BOOST_CHECK_EQUAL(erf(f1).precision(), 100);\n      BOOST_CHECK_EQUAL(erfc(f1).precision(), 100);\n      BOOST_CHECK_EQUAL(expm1(f1).precision(), 100);\n      BOOST_CHECK_EQUAL(lgamma(f1).precision(), 100);\n      BOOST_CHECK_EQUAL(tgamma(f1).precision(), 100);\n      BOOST_CHECK_EQUAL(log1p(f1).precision(), 100);\n   }\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_native_integer.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2012 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//\n// Compare arithmetic results using fixed_int to GMP results.\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/integer.hpp>\n#include \"test.hpp\"\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4146)\n#endif\n\ntemplate <class I, class H>\nvoid test()\n{\n   using namespace boost::multiprecision;\n\n   I i(0);\n\n#ifndef BOOST_NO_EXCEPTIONS\n   BOOST_CHECK_THROW(lsb(i), std::domain_error);\n#endif\n   BOOST_CHECK(bit_test(bit_set(i, 0), 0));\n   BOOST_CHECK_EQUAL(bit_set(i, 0), 1);\n   BOOST_CHECK_EQUAL(bit_unset(i, 0), 0);\n   BOOST_CHECK_EQUAL(bit_flip(bit_set(i, 0), 0), 0);\n\n   unsigned max_index = (std::numeric_limits<I>::digits) - 1;\n   BOOST_CHECK(bit_test(bit_set(i, max_index), max_index));\n   BOOST_CHECK_EQUAL(bit_unset(i, max_index), 0);\n   BOOST_CHECK_EQUAL(bit_flip(bit_set(i, max_index), max_index), 0);\n   i = 0;\n   bit_set(i, max_index);\n   BOOST_CHECK_EQUAL(lsb(i), max_index);\n   BOOST_CHECK_EQUAL(msb(i), max_index);\n   bit_set(i, max_index / 2);\n   BOOST_CHECK_EQUAL(lsb(i), max_index / 2);\n   BOOST_CHECK_EQUAL(msb(i), max_index);\n\n#ifndef BOOST_NO_EXCEPTIONS\n   if (std::numeric_limits<I>::is_signed)\n   {\n      i = static_cast<I>(-1);\n      BOOST_CHECK_THROW(lsb(i), std::domain_error);\n   }\n#endif\n   H mx = (std::numeric_limits<H>::max)();\n\n   BOOST_CHECK_EQUAL(multiply(i, mx, mx), static_cast<I>(mx) * static_cast<I>(mx));\n   BOOST_CHECK_EQUAL(add(i, mx, mx), static_cast<I>(mx) + static_cast<I>(mx));\n   if (std::numeric_limits<I>::is_signed)\n   {\n      BOOST_CHECK_EQUAL(subtract(i, mx, static_cast<H>(-mx)), static_cast<I>(mx) - static_cast<I>(-mx));\n      BOOST_CHECK_EQUAL(add(i, static_cast<H>(-mx), static_cast<H>(-mx)), static_cast<I>(-mx) + static_cast<I>(-mx));\n   }\n\n   i   = (std::numeric_limits<I>::max)();\n   I j = 12345;\n   I r, q;\n   divide_qr(i, j, q, r);\n   BOOST_CHECK_EQUAL(q, i / j);\n   BOOST_CHECK_EQUAL(r, i % j);\n   BOOST_CHECK_EQUAL(integer_modulus(i, j), i % j);\n   I p = 456;\n   BOOST_CHECK_EQUAL(powm(i, p, j), pow(cpp_int(i), static_cast<unsigned>(p)) % j);\n\n   for (I i = 0; i < (2 < 8) - 1; ++i)\n   {\n      I j = i * i;\n      I s, r;\n      s = sqrt(j, r);\n      BOOST_CHECK_EQUAL(s, i);\n      BOOST_CHECK(r == 0);\n      j += 3;\n      s = sqrt(i, r);\n      BOOST_CHECK_EQUAL(s, i);\n      BOOST_CHECK(r == 3);\n   }\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n   test<std::int16_t, boost::int8_t>();\n   test<std::int32_t, std::int16_t>();\n   test<std::int64_t, std::int32_t>();\n   test<std::uint16_t, boost::uint8_t>();\n   test<std::uint32_t, std::uint16_t>();\n   test<std::uint64_t, std::uint32_t>();\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_nothrow_cpp_bin_float.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2015 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <type_traits>\n\n//\n// Move construct:\n//\nstatic_assert(std::is_nothrow_move_constructible<boost::multiprecision::cpp_bin_float_100>::value, \"is_nothrow_move_constructible test\");\n//\n// Move assign:\n//\nstatic_assert(std::is_nothrow_move_assignable<boost::multiprecision::cpp_bin_float_100>::value, \"is_nothrow_move_assignable test\");\n\n//\n// Construct:\n//\nstatic_assert(std::is_nothrow_default_constructible<boost::multiprecision::cpp_bin_float_100>::value, \"is_nothrow_default_constructible test\");\n//\n// Copy construct:\n//\nstatic_assert(std::is_nothrow_copy_constructible<boost::multiprecision::cpp_bin_float_100>::value, \"is_nothrow_copy_constructible test\");\n//\n// Assign:\n//\nstatic_assert(std::is_nothrow_copy_assignable<boost::multiprecision::cpp_bin_float_100>::value, \"is_nothrow_copy_assignable test\");\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_nothrow_cpp_dec_float.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2015 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include <type_traits>\n\n//\n// Move construct:\n//\nstatic_assert(std::is_nothrow_move_constructible<boost::multiprecision::cpp_dec_float_100>::value, \"is_nothrow_move_constructible test\");\n//\n// Move assign:\n//\nstatic_assert(std::is_nothrow_move_assignable<boost::multiprecision::cpp_dec_float_100>::value, \"is_nothrow_move_assignable test\");\n//\n// Construct:\n//\nstatic_assert(std::is_nothrow_default_constructible<boost::multiprecision::cpp_dec_float_100>::value, \"is_nothrow_constructible test\");\n//\n// Copy construct:\n//\nstatic_assert(std::is_nothrow_copy_constructible<boost::multiprecision::cpp_dec_float_100>::value, \"is_nothrow_copy_constructible test\");\n//\n// Assign:\n//\nstatic_assert(std::is_nothrow_copy_assignable<boost::multiprecision::cpp_dec_float_100>::value, \"is_nothrow_copy_assignable test\");\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_nothrow_cpp_int.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2015 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <type_traits>\n\n//\n// Move construct:\n//\nstatic_assert(std::is_nothrow_move_constructible<boost::multiprecision::cpp_int>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_constructible<boost::multiprecision::int128_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_constructible<boost::multiprecision::checked_int128_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_constructible<boost::multiprecision::uint128_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_constructible<boost::multiprecision::checked_uint128_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_constructible<boost::multiprecision::int512_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_constructible<boost::multiprecision::checked_int512_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_constructible<boost::multiprecision::uint512_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_constructible<boost::multiprecision::checked_uint512_t>::value, \"noexcept test\");\n//\n// Move assign:\n//\nstatic_assert(std::is_nothrow_move_assignable<boost::multiprecision::cpp_int>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_assignable<boost::multiprecision::int128_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_assignable<boost::multiprecision::checked_int128_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_assignable<boost::multiprecision::uint128_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_assignable<boost::multiprecision::checked_uint128_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_assignable<boost::multiprecision::int512_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_assignable<boost::multiprecision::checked_int512_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_assignable<boost::multiprecision::uint512_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_assignable<boost::multiprecision::checked_uint512_t>::value, \"noexcept test\");\n//\n// Construct:\n//\nstatic_assert(std::is_nothrow_default_constructible<boost::multiprecision::cpp_int>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_default_constructible<boost::multiprecision::int128_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_default_constructible<boost::multiprecision::checked_int128_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_default_constructible<boost::multiprecision::uint128_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_default_constructible<boost::multiprecision::checked_uint128_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_default_constructible<boost::multiprecision::int512_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_default_constructible<boost::multiprecision::checked_int512_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_default_constructible<boost::multiprecision::uint512_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_default_constructible<boost::multiprecision::checked_uint512_t>::value, \"noexcept test\");\n//\n// Copy construct:\n//\nstatic_assert(!std::is_nothrow_copy_constructible<boost::multiprecision::cpp_int>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_copy_constructible<boost::multiprecision::int128_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_copy_constructible<boost::multiprecision::checked_int128_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_copy_constructible<boost::multiprecision::uint128_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_copy_constructible<boost::multiprecision::checked_uint128_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_copy_constructible<boost::multiprecision::int512_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_copy_constructible<boost::multiprecision::checked_int512_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_copy_constructible<boost::multiprecision::uint512_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_copy_constructible<boost::multiprecision::checked_uint512_t>::value, \"noexcept test\");\n//\n// Assign:\n//\nstatic_assert(!std::is_nothrow_copy_assignable<boost::multiprecision::cpp_int>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_copy_assignable<boost::multiprecision::int128_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_copy_assignable<boost::multiprecision::checked_int128_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_copy_assignable<boost::multiprecision::uint128_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_copy_assignable<boost::multiprecision::checked_uint128_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_copy_assignable<boost::multiprecision::int512_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_copy_assignable<boost::multiprecision::checked_int512_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_copy_assignable<boost::multiprecision::uint512_t>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_copy_assignable<boost::multiprecision::checked_uint512_t>::value, \"noexcept test\");\n//\n// Construct from int:\n//\nstatic_assert(noexcept(boost::multiprecision::cpp_int(std::declval<boost::multiprecision::signed_limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::int128_t(std::declval<boost::multiprecision::signed_limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::checked_int128_t(std::declval<boost::multiprecision::signed_limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::uint128_t(std::declval<boost::multiprecision::signed_limb_type>())), \"noexcept test\");\nstatic_assert(!noexcept(boost::multiprecision::checked_uint128_t(std::declval<boost::multiprecision::signed_limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::int512_t(std::declval<boost::multiprecision::signed_limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::checked_int512_t(std::declval<boost::multiprecision::signed_limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::uint512_t(std::declval<boost::multiprecision::signed_limb_type>())), \"noexcept test\");\nstatic_assert(!noexcept(boost::multiprecision::checked_uint512_t(std::declval<boost::multiprecision::signed_limb_type>())), \"noexcept test\");\n//\n// Construct from unsigned int:\n//\nstatic_assert(noexcept(boost::multiprecision::cpp_int(std::declval<boost::multiprecision::limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::int128_t(std::declval<boost::multiprecision::limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::checked_int128_t(std::declval<boost::multiprecision::limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::uint128_t(std::declval<boost::multiprecision::limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::checked_uint128_t(std::declval<boost::multiprecision::limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::int512_t(std::declval<boost::multiprecision::limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::checked_int512_t(std::declval<boost::multiprecision::limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::uint512_t(std::declval<boost::multiprecision::limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::checked_uint512_t(std::declval<boost::multiprecision::limb_type>())), \"noexcept test\");\n//\n// Assign from int:\n//\nstatic_assert(noexcept(std::declval<boost::multiprecision::cpp_int>() = std::declval<boost::multiprecision::signed_limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::int128_t>() = std::declval<boost::multiprecision::signed_limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::checked_int128_t>() = std::declval<boost::multiprecision::signed_limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::uint128_t>() = std::declval<boost::multiprecision::signed_limb_type>()), \"noexcept test\");\nstatic_assert(!noexcept(std::declval<boost::multiprecision::checked_uint128_t>() = std::declval<boost::multiprecision::signed_limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::int512_t>() = std::declval<boost::multiprecision::signed_limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::checked_int512_t>() = std::declval<boost::multiprecision::signed_limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::uint512_t>() = std::declval<boost::multiprecision::signed_limb_type>()), \"noexcept test\");\nstatic_assert(!noexcept(std::declval<boost::multiprecision::checked_uint512_t>() = std::declval<boost::multiprecision::signed_limb_type>()), \"noexcept test\");\n//\n// Assign from unsigned int:\n//\nstatic_assert(noexcept(std::declval<boost::multiprecision::cpp_int>() = std::declval<boost::multiprecision::limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::int128_t>() = std::declval<boost::multiprecision::limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::checked_int128_t>() = std::declval<boost::multiprecision::limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::uint128_t>() = std::declval<boost::multiprecision::limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::checked_uint128_t>() = std::declval<boost::multiprecision::limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::int512_t>() = std::declval<boost::multiprecision::limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::checked_int512_t>() = std::declval<boost::multiprecision::limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::uint512_t>() = std::declval<boost::multiprecision::limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::checked_uint512_t>() = std::declval<boost::multiprecision::limb_type>()), \"noexcept test\");\n\n#if defined(BOOST_LITTLE_ENDIAN) && !defined(BOOST_MP_TEST_NO_LE)\n//\n// We can also nothrow construct from a double_limb_type (or smaller obviously) as long as double_limb_type is smaller than the type\n// in question (so don't test 128-bit integers in case double_limb_type is __int128).\n//\n// Construct from int:\n//\nstatic_assert(noexcept(boost::multiprecision::cpp_int(std::declval<boost::multiprecision::signed_double_limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::int512_t(std::declval<boost::multiprecision::signed_double_limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::checked_int512_t(std::declval<boost::multiprecision::signed_double_limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::uint512_t(std::declval<boost::multiprecision::signed_double_limb_type>())), \"noexcept test\");\nstatic_assert(!noexcept(boost::multiprecision::checked_uint512_t(std::declval<boost::multiprecision::signed_double_limb_type>())), \"noexcept test\");\n//\n// Construct from unsigned int:\n//\nstatic_assert(noexcept(boost::multiprecision::cpp_int(std::declval<boost::multiprecision::double_limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::int512_t(std::declval<boost::multiprecision::double_limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::checked_int512_t(std::declval<boost::multiprecision::double_limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::uint512_t(std::declval<boost::multiprecision::double_limb_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::checked_uint512_t(std::declval<boost::multiprecision::double_limb_type>())), \"noexcept test\");\n//\n// Assign from int:\n//\nstatic_assert(noexcept(std::declval<boost::multiprecision::cpp_int>() = std::declval<boost::multiprecision::signed_double_limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::int512_t>() = std::declval<boost::multiprecision::signed_double_limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::checked_int512_t>() = std::declval<boost::multiprecision::signed_double_limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::uint512_t>() = std::declval<boost::multiprecision::signed_double_limb_type>()), \"noexcept test\");\nstatic_assert(!noexcept(std::declval<boost::multiprecision::checked_uint512_t>() = std::declval<boost::multiprecision::signed_double_limb_type>()), \"noexcept test\");\n//\n// Assign from unsigned int:\n//\nstatic_assert(noexcept(std::declval<boost::multiprecision::cpp_int>() = std::declval<boost::multiprecision::double_limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::int512_t>() = std::declval<boost::multiprecision::double_limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::checked_int512_t>() = std::declval<boost::multiprecision::double_limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::uint512_t>() = std::declval<boost::multiprecision::double_limb_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::checked_uint512_t>() = std::declval<boost::multiprecision::double_limb_type>()), \"noexcept test\");\n\n#endif // little endian\n\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<32, 32, boost::multiprecision::signed_magnitude, boost::multiprecision::checked, void> >     checked_int32_t;\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<32, 32, boost::multiprecision::unsigned_magnitude, boost::multiprecision::checked, void> >   checked_uint32_t;\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<32, 32, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void> >   unchecked_int32_t;\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<32, 32, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void> > unchecked_uint32_t;\n\n//\n// Construct from int:\n//\nstatic_assert(noexcept(unchecked_int32_t(std::declval<std::int32_t>())), \"noexcept test\");\nstatic_assert(noexcept(checked_int32_t(std::declval<std::int32_t>())), \"noexcept test\");\nstatic_assert(noexcept(unchecked_uint32_t(std::declval<std::int32_t>())), \"noexcept test\");\nstatic_assert(!noexcept(checked_uint32_t(std::declval<std::int32_t>())), \"noexcept test\");\n//\n// Construct from unsigned int:\n//\nstatic_assert(noexcept(unchecked_int32_t(std::declval<std::uint32_t>())), \"noexcept test\");\nstatic_assert(noexcept(checked_int32_t(std::declval<std::uint32_t>())), \"noexcept test\");\nstatic_assert(noexcept(unchecked_uint32_t(std::declval<std::uint32_t>())), \"noexcept test\");\nstatic_assert(noexcept(checked_uint32_t(std::declval<std::uint32_t>())), \"noexcept test\");\n//\n// Assign from int:\n//\nstatic_assert(noexcept(std::declval<unchecked_int32_t>() = std::declval<std::int32_t>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<checked_int32_t>() = std::declval<std::int32_t>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<unchecked_uint32_t>() = std::declval<std::int32_t>()), \"noexcept test\");\nstatic_assert(!noexcept(std::declval<checked_uint32_t>() = std::declval<std::int32_t>()), \"noexcept test\");\n//\n// Assign from unsigned int:\n//\nstatic_assert(noexcept(std::declval<unchecked_int32_t>() = std::declval<std::uint32_t>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<checked_int32_t>() = std::declval<std::uint32_t>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<unchecked_uint32_t>() = std::declval<std::uint32_t>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<checked_uint32_t>() = std::declval<std::uint32_t>()), \"noexcept test\");\n\n//\n// And finally some things which should *not* be noexcept:\n//\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<30, 30, boost::multiprecision::signed_magnitude, boost::multiprecision::checked, void> >     checked_int30_t;\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<30, 30, boost::multiprecision::unsigned_magnitude, boost::multiprecision::checked, void> >   checked_uint30_t;\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<30, 30, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void> >   unchecked_int30_t;\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<30, 30, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void> > unchecked_uint30_t;\n\n//\n// Construct from int:\n//\nstatic_assert(!noexcept(checked_int30_t(std::declval<std::int32_t>())), \"noexcept test\");\nstatic_assert(!noexcept(checked_uint30_t(std::declval<std::int32_t>())), \"noexcept test\");\nstatic_assert(!noexcept(checked_int32_t(std::declval<std::int64_t>())), \"noexcept test\");\nstatic_assert(!noexcept(checked_uint32_t(std::declval<std::int64_t>())), \"noexcept test\");\n//\n// Construct from unsigned int:\n//\nstatic_assert(!noexcept(checked_int30_t(std::declval<std::uint32_t>())), \"noexcept test\");\nstatic_assert(!noexcept(checked_uint30_t(std::declval<std::uint32_t>())), \"noexcept test\");\nstatic_assert(!noexcept(checked_int32_t(std::declval<std::uint64_t>())), \"noexcept test\");\nstatic_assert(!noexcept(checked_uint32_t(std::declval<std::uint64_t>())), \"noexcept test\");\n//\n// Assign from int:\n//\nstatic_assert(!noexcept(std::declval<checked_int30_t>() = std::declval<std::int32_t>()), \"noexcept test\");\nstatic_assert(!noexcept(std::declval<checked_uint30_t>() = std::declval<std::int32_t>()), \"noexcept test\");\nstatic_assert(!noexcept(std::declval<checked_int32_t>() = std::declval<std::int64_t>()), \"noexcept test\");\nstatic_assert(!noexcept(std::declval<checked_uint32_t>() = std::declval<std::int64_t>()), \"noexcept test\");\n//\n// Assign from unsigned int:\n//\nstatic_assert(!noexcept(std::declval<checked_int30_t>() = std::declval<std::uint32_t>()), \"noexcept test\");\nstatic_assert(!noexcept(std::declval<checked_uint30_t>() = std::declval<std::uint32_t>()), \"noexcept test\");\nstatic_assert(!noexcept(std::declval<checked_int32_t>() = std::declval<std::uint64_t>()), \"noexcept test\");\nstatic_assert(!noexcept(std::declval<checked_uint32_t>() = std::declval<std::uint64_t>()), \"noexcept test\");\n\n//\n// Check regular construct/assign as well, see https://github.com/boostorg/multiprecision/issues/383\n//\n//\n// Move assign:\n//\nstatic_assert(std::is_move_assignable<boost::multiprecision::cpp_int>::value, \"noexcept test\");\nstatic_assert(std::is_move_assignable<boost::multiprecision::int128_t>::value, \"noexcept test\");\nstatic_assert(std::is_move_assignable<boost::multiprecision::checked_int128_t>::value, \"noexcept test\");\nstatic_assert(std::is_move_assignable<boost::multiprecision::uint128_t>::value, \"noexcept test\");\nstatic_assert(std::is_move_assignable<boost::multiprecision::checked_uint128_t>::value, \"noexcept test\");\nstatic_assert(std::is_move_assignable<boost::multiprecision::int512_t>::value, \"noexcept test\");\nstatic_assert(std::is_move_assignable<boost::multiprecision::checked_int512_t>::value, \"noexcept test\");\nstatic_assert(std::is_move_assignable<boost::multiprecision::uint512_t>::value, \"noexcept test\");\nstatic_assert(std::is_move_assignable<boost::multiprecision::checked_uint512_t>::value, \"noexcept test\");\n//\n// Construct:\n//\nstatic_assert(std::is_default_constructible<boost::multiprecision::cpp_int>::value, \"noexcept test\");\nstatic_assert(std::is_default_constructible<boost::multiprecision::int128_t>::value, \"noexcept test\");\nstatic_assert(std::is_default_constructible<boost::multiprecision::checked_int128_t>::value, \"noexcept test\");\nstatic_assert(std::is_default_constructible<boost::multiprecision::uint128_t>::value, \"noexcept test\");\nstatic_assert(std::is_default_constructible<boost::multiprecision::checked_uint128_t>::value, \"noexcept test\");\nstatic_assert(std::is_default_constructible<boost::multiprecision::int512_t>::value, \"noexcept test\");\nstatic_assert(std::is_default_constructible<boost::multiprecision::checked_int512_t>::value, \"noexcept test\");\nstatic_assert(std::is_default_constructible<boost::multiprecision::uint512_t>::value, \"noexcept test\");\nstatic_assert(std::is_default_constructible<boost::multiprecision::checked_uint512_t>::value, \"noexcept test\");\n//\n// Copy construct:\n//\nstatic_assert(std::is_copy_constructible<boost::multiprecision::cpp_int>::value, \"noexcept test\");\nstatic_assert(std::is_copy_constructible<boost::multiprecision::int128_t>::value, \"noexcept test\");\nstatic_assert(std::is_copy_constructible<boost::multiprecision::checked_int128_t>::value, \"noexcept test\");\nstatic_assert(std::is_copy_constructible<boost::multiprecision::uint128_t>::value, \"noexcept test\");\nstatic_assert(std::is_copy_constructible<boost::multiprecision::checked_uint128_t>::value, \"noexcept test\");\nstatic_assert(std::is_copy_constructible<boost::multiprecision::int512_t>::value, \"noexcept test\");\nstatic_assert(std::is_copy_constructible<boost::multiprecision::checked_int512_t>::value, \"noexcept test\");\nstatic_assert(std::is_copy_constructible<boost::multiprecision::uint512_t>::value, \"noexcept test\");\nstatic_assert(std::is_copy_constructible<boost::multiprecision::checked_uint512_t>::value, \"noexcept test\");\n//\n// Assign:\n//\nstatic_assert(std::is_copy_assignable<boost::multiprecision::cpp_int>::value, \"noexcept test\");\nstatic_assert(std::is_copy_assignable<boost::multiprecision::int128_t>::value, \"noexcept test\");\nstatic_assert(std::is_copy_assignable<boost::multiprecision::checked_int128_t>::value, \"noexcept test\");\nstatic_assert(std::is_copy_assignable<boost::multiprecision::uint128_t>::value, \"noexcept test\");\nstatic_assert(std::is_copy_assignable<boost::multiprecision::checked_uint128_t>::value, \"noexcept test\");\nstatic_assert(std::is_copy_assignable<boost::multiprecision::int512_t>::value, \"noexcept test\");\nstatic_assert(std::is_copy_assignable<boost::multiprecision::checked_int512_t>::value, \"noexcept test\");\nstatic_assert(std::is_copy_assignable<boost::multiprecision::uint512_t>::value, \"noexcept test\");\nstatic_assert(std::is_copy_assignable<boost::multiprecision::checked_uint512_t>::value, \"noexcept test\");\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_nothrow_cpp_rational.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2015 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <type_traits>\n\ntypedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::int128_t::backend_type> >  rat128_t;\ntypedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::uint128_t::backend_type> > urat128_t;\ntypedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::int512_t::backend_type> >  rat512_t;\ntypedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::uint512_t::backend_type> > urat512_t;\n\ntypedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::checked_int128_t::backend_type> >  checked_rat128_t;\ntypedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::checked_uint128_t::backend_type> > checked_urat128_t;\ntypedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::checked_int512_t::backend_type> >  checked_rat512_t;\ntypedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::checked_uint512_t::backend_type> > checked_urat512_t;\n\n//\n// Move construct:\n//\nstatic_assert(std::is_nothrow_move_constructible<boost::multiprecision::cpp_rational>::value, \"is_nothrow_move_constructible test\");\nstatic_assert(std::is_nothrow_move_constructible<rat128_t>::value, \"is_nothrow_move_constructible test\");\nstatic_assert(std::is_nothrow_move_constructible<checked_rat128_t>::value, \"is_nothrow_move_constructible test\");\nstatic_assert(std::is_nothrow_move_constructible<urat128_t>::value, \"is_nothrow_move_constructible test\");\nstatic_assert(std::is_nothrow_move_constructible<checked_urat128_t>::value, \"is_nothrow_move_constructible test\");\nstatic_assert(std::is_nothrow_move_constructible<rat512_t>::value, \"is_nothrow_move_constructible test\");\nstatic_assert(std::is_nothrow_move_constructible<checked_rat512_t>::value, \"is_nothrow_move_constructible test\");\nstatic_assert(std::is_nothrow_move_constructible<urat512_t>::value, \"is_nothrow_move_constructible test\");\nstatic_assert(std::is_nothrow_move_constructible<checked_urat512_t>::value, \"is_nothrow_move_constructible test\");\n//\n// Move assign:\n//\nstatic_assert(std::is_nothrow_move_assignable<boost::multiprecision::cpp_rational>::value, \"is_nothrow_move_assignable test\");\nstatic_assert(std::is_nothrow_move_assignable<rat128_t>::value, \"is_nothrow_move_assignable test\");\nstatic_assert(std::is_nothrow_move_assignable<checked_rat128_t>::value, \"is_nothrow_move_assignable test\");\nstatic_assert(std::is_nothrow_move_assignable<urat128_t>::value, \"is_nothrow_move_assignable test\");\nstatic_assert(std::is_nothrow_move_assignable<checked_urat128_t>::value, \"is_nothrow_move_assignable test\");\nstatic_assert(std::is_nothrow_move_assignable<rat512_t>::value, \"is_nothrow_move_assignable test\");\nstatic_assert(std::is_nothrow_move_assignable<checked_rat512_t>::value, \"is_nothrow_move_assignable test\");\nstatic_assert(std::is_nothrow_move_assignable<urat512_t>::value, \"is_nothrow_move_assignable test\");\nstatic_assert(std::is_nothrow_move_assignable<checked_urat512_t>::value, \"is_nothrow_move_assignable test\");\n\n#if 0\n//\n// Everything below could/should be made to work, given modifications to Boost.Rational\n//\n\n\n//\n// Construct:\n//\n#ifdef BOOST_HAS_NOTHROW_CONSTRUCTOR\nstatic_assert(boost::has_nothrow_constructor<boost::multiprecision::cpp_rational>::value);\nstatic_assert(boost::has_nothrow_constructor<rat128_t>::value);\nstatic_assert(boost::has_nothrow_constructor<checked_rat128_t>::value);\nstatic_assert(boost::has_nothrow_constructor<urat128_t>::value);\nstatic_assert(boost::has_nothrow_constructor<checked_urat128_t>::value);\nstatic_assert(boost::has_nothrow_constructor<rat512_t>::value);\nstatic_assert(boost::has_nothrow_constructor<checked_rat512_t>::value);\nstatic_assert(boost::has_nothrow_constructor<urat512_t>::value);\nstatic_assert(boost::has_nothrow_constructor<checked_urat512_t>::value);\n#endif\n//\n// Copy construct:\n//\n#ifdef BOOST_HAS_NOTHROW_COPY\nstatic_assert(!boost::has_nothrow_copy<boost::multiprecision::cpp_rational>::value);\nstatic_assert(boost::has_nothrow_copy<rat128_t>::value);\nstatic_assert(boost::has_nothrow_copy<checked_rat128_t>::value);\nstatic_assert(boost::has_nothrow_copy<urat128_t>::value);\nstatic_assert(boost::has_nothrow_copy<checked_urat128_t>::value);\nstatic_assert(boost::has_nothrow_copy<rat512_t>::value);\nstatic_assert(boost::has_nothrow_copy<checked_rat512_t>::value);\nstatic_assert(boost::has_nothrow_copy<urat512_t>::value);\nstatic_assert(boost::has_nothrow_copy<checked_urat512_t>::value);\n#endif\n//\n// Assign:\n//\n#ifdef BOOST_HAS_NOTHROW_ASSIGN\nstatic_assert(!boost::has_nothrow_assign<boost::multiprecision::cpp_rational>::value);\nstatic_assert(boost::has_nothrow_assign<rat128_t>::value);\nstatic_assert(boost::has_nothrow_assign<checked_rat128_t>::value);\nstatic_assert(boost::has_nothrow_assign<urat128_t>::value);\nstatic_assert(boost::has_nothrow_assign<checked_urat128_t>::value);\nstatic_assert(boost::has_nothrow_assign<rat512_t>::value);\nstatic_assert(boost::has_nothrow_assign<checked_rat512_t>::value);\nstatic_assert(boost::has_nothrow_assign<urat512_t>::value);\nstatic_assert(boost::has_nothrow_assign<checked_urat512_t>::value);\n#endif\n//\n// Construct from int:\n//\nstatic_assert(noexcept(boost::multiprecision::cpp_rational(std::declval<boost::multiprecision::signed_limb_type>())));\nstatic_assert(noexcept(rat128_t(std::declval<boost::multiprecision::signed_limb_type>())));\nstatic_assert(noexcept(checked_rat128_t(std::declval<boost::multiprecision::signed_limb_type>())));\nstatic_assert(noexcept(urat128_t(std::declval<boost::multiprecision::signed_limb_type>())));\nstatic_assert(!noexcept(checked_urat128_t(std::declval<boost::multiprecision::signed_limb_type>())));\nstatic_assert(noexcept(rat512_t(std::declval<boost::multiprecision::signed_limb_type>())));\nstatic_assert(noexcept(checked_rat512_t(std::declval<boost::multiprecision::signed_limb_type>())));\nstatic_assert(noexcept(urat512_t(std::declval<boost::multiprecision::signed_limb_type>())));\nstatic_assert(!noexcept(checked_urat512_t(std::declval<boost::multiprecision::signed_limb_type>())));\n//\n// Construct from unsigned int:\n//\nstatic_assert(noexcept(boost::multiprecision::cpp_rational(std::declval<boost::multiprecision::limb_type>())));\nstatic_assert(noexcept(rat128_t(std::declval<boost::multiprecision::limb_type>())));\nstatic_assert(noexcept(checked_rat128_t(std::declval<boost::multiprecision::limb_type>())));\nstatic_assert(noexcept(urat128_t(std::declval<boost::multiprecision::limb_type>())));\nstatic_assert(noexcept(checked_urat128_t(std::declval<boost::multiprecision::limb_type>())));\nstatic_assert(noexcept(rat512_t(std::declval<boost::multiprecision::limb_type>())));\nstatic_assert(noexcept(checked_rat512_t(std::declval<boost::multiprecision::limb_type>())));\nstatic_assert(noexcept(urat512_t(std::declval<boost::multiprecision::limb_type>())));\nstatic_assert(noexcept(checked_urat512_t(std::declval<boost::multiprecision::limb_type>())));\n//\n// Assign from int:\n//\nstatic_assert(noexcept(std::declval<boost::multiprecision::cpp_rational>() = std::declval<boost::multiprecision::signed_limb_type>()));\nstatic_assert(noexcept(std::declval<rat128_t>() = std::declval<boost::multiprecision::signed_limb_type>()));\nstatic_assert(noexcept(std::declval<checked_rat128_t>() = std::declval<boost::multiprecision::signed_limb_type>()));\nstatic_assert(noexcept(std::declval<urat128_t>() = std::declval<boost::multiprecision::signed_limb_type>()));\nstatic_assert(!noexcept(std::declval<checked_urat128_t>() = std::declval<boost::multiprecision::signed_limb_type>()));\nstatic_assert(noexcept(std::declval<rat512_t>() = std::declval<boost::multiprecision::signed_limb_type>()));\nstatic_assert(noexcept(std::declval<checked_rat512_t>() = std::declval<boost::multiprecision::signed_limb_type>()));\nstatic_assert(noexcept(std::declval<urat512_t>() = std::declval<boost::multiprecision::signed_limb_type>()));\nstatic_assert(!noexcept(std::declval<checked_urat512_t>() = std::declval<boost::multiprecision::signed_limb_type>()));\n//\n// Assign from unsigned int:\n//\nstatic_assert(noexcept(std::declval<boost::multiprecision::cpp_rational>() = std::declval<boost::multiprecision::limb_type>()));\nstatic_assert(noexcept(std::declval<rat128_t>() = std::declval<boost::multiprecision::limb_type>()));\nstatic_assert(noexcept(std::declval<checked_rat128_t>() = std::declval<boost::multiprecision::limb_type>()));\nstatic_assert(noexcept(std::declval<urat128_t>() = std::declval<boost::multiprecision::limb_type>()));\nstatic_assert(noexcept(std::declval<checked_urat128_t>() = std::declval<boost::multiprecision::limb_type>()));\nstatic_assert(noexcept(std::declval<rat512_t>() = std::declval<boost::multiprecision::limb_type>()));\nstatic_assert(noexcept(std::declval<checked_rat512_t>() = std::declval<boost::multiprecision::limb_type>()));\nstatic_assert(noexcept(std::declval<urat512_t>() = std::declval<boost::multiprecision::limb_type>()));\nstatic_assert(noexcept(std::declval<checked_urat512_t>() = std::declval<boost::multiprecision::limb_type>()));\n\n#if defined(BOOST_LITTLE_ENDIAN)\n//\n// Construct from int:\n//\nstatic_assert(noexcept(boost::multiprecision::cpp_rational(std::declval<boost::multiprecision::signed_double_limb_type>())));\nstatic_assert(noexcept(rat128_t(std::declval<boost::multiprecision::signed_double_limb_type>())));\nstatic_assert(noexcept(checked_rat128_t(std::declval<boost::multiprecision::signed_double_limb_type>())));\nstatic_assert(noexcept(urat128_t(std::declval<boost::multiprecision::signed_double_limb_type>())));\nstatic_assert(!noexcept(checked_urat128_t(std::declval<boost::multiprecision::signed_double_limb_type>())));\nstatic_assert(noexcept(rat512_t(std::declval<boost::multiprecision::signed_double_limb_type>())));\nstatic_assert(noexcept(checked_rat512_t(std::declval<boost::multiprecision::signed_double_limb_type>())));\nstatic_assert(noexcept(urat512_t(std::declval<boost::multiprecision::signed_double_limb_type>())));\nstatic_assert(!noexcept(checked_urat512_t(std::declval<boost::multiprecision::signed_double_limb_type>())));\n//\n// Construct from unsigned int:\n//\nstatic_assert(noexcept(boost::multiprecision::cpp_rational(std::declval<boost::multiprecision::double_limb_type>())));\nstatic_assert(noexcept(rat128_t(std::declval<boost::multiprecision::double_limb_type>())));\nstatic_assert(noexcept(checked_rat128_t(std::declval<boost::multiprecision::double_limb_type>())));\nstatic_assert(noexcept(urat128_t(std::declval<boost::multiprecision::double_limb_type>())));\nstatic_assert(noexcept(checked_urat128_t(std::declval<boost::multiprecision::double_limb_type>())));\nstatic_assert(noexcept(rat512_t(std::declval<boost::multiprecision::double_limb_type>())));\nstatic_assert(noexcept(checked_rat512_t(std::declval<boost::multiprecision::double_limb_type>())));\nstatic_assert(noexcept(urat512_t(std::declval<boost::multiprecision::double_limb_type>())));\nstatic_assert(noexcept(checked_urat512_t(std::declval<boost::multiprecision::double_limb_type>())));\n//\n// Assign from int:\n//\nstatic_assert(noexcept(std::declval<boost::multiprecision::cpp_rational>() = std::declval<boost::multiprecision::signed_double_limb_type>()));\nstatic_assert(noexcept(std::declval<rat128_t>() = std::declval<boost::multiprecision::signed_double_limb_type>()));\nstatic_assert(noexcept(std::declval<checked_rat128_t>() = std::declval<boost::multiprecision::signed_double_limb_type>()));\nstatic_assert(noexcept(std::declval<urat128_t>() = std::declval<boost::multiprecision::signed_double_limb_type>()));\nstatic_assert(!noexcept(std::declval<checked_urat128_t>() = std::declval<boost::multiprecision::signed_double_limb_type>()));\nstatic_assert(noexcept(std::declval<rat512_t>() = std::declval<boost::multiprecision::signed_double_limb_type>()));\nstatic_assert(noexcept(std::declval<checked_rat512_t>() = std::declval<boost::multiprecision::signed_double_limb_type>()));\nstatic_assert(noexcept(std::declval<urat512_t>() = std::declval<boost::multiprecision::signed_double_limb_type>()));\nstatic_assert(!noexcept(std::declval<checked_urat512_t>() = std::declval<boost::multiprecision::signed_double_limb_type>()));\n//\n// Assign from unsigned int:\n//\nstatic_assert(noexcept(std::declval<boost::multiprecision::cpp_rational>() = std::declval<boost::multiprecision::double_limb_type>()));\nstatic_assert(noexcept(std::declval<rat128_t>() = std::declval<boost::multiprecision::double_limb_type>()));\nstatic_assert(noexcept(std::declval<checked_rat128_t>() = std::declval<boost::multiprecision::double_limb_type>()));\nstatic_assert(noexcept(std::declval<urat128_t>() = std::declval<boost::multiprecision::double_limb_type>()));\nstatic_assert(noexcept(std::declval<checked_urat128_t>() = std::declval<boost::multiprecision::double_limb_type>()));\nstatic_assert(noexcept(std::declval<rat512_t>() = std::declval<boost::multiprecision::double_limb_type>()));\nstatic_assert(noexcept(std::declval<checked_rat512_t>() = std::declval<boost::multiprecision::double_limb_type>()));\nstatic_assert(noexcept(std::declval<urat512_t>() = std::declval<boost::multiprecision::double_limb_type>()));\nstatic_assert(noexcept(std::declval<checked_urat512_t>() = std::declval<boost::multiprecision::double_limb_type>()));\n\n#endif\n#endif // little endian\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_nothrow_float128.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2015 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/float128.hpp>\n#include <type_traits>\n\n//\n// Move construct:\n//\nstatic_assert(std::is_nothrow_move_constructible<boost::multiprecision::float128>::value, \"noexcept test\");\n//\n// Move assign:\n//\nstatic_assert(std::is_nothrow_move_assignable<boost::multiprecision::float128>::value, \"noexcept test\");\n//\n// Construct:\n//\nstatic_assert(std::is_nothrow_default_constructible<boost::multiprecision::float128>::value, \"noexcept test\");\n//\n// Copy construct:\n//\nstatic_assert(std::is_nothrow_copy_constructible<boost::multiprecision::float128>::value, \"noexcept test\");\n//\n// Assign:\n//\nstatic_assert(std::is_nothrow_copy_assignable<boost::multiprecision::float128>::value, \"noexcept test\");\n\nstatic_assert(noexcept(boost::multiprecision::float128()), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::float128(std::declval<const boost::multiprecision::float128&>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::float128(std::declval<boost::multiprecision::float128>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::float128(std::declval<const float128_type&>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::float128(std::declval<float128_type>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::float128(std::declval<const double&>())), \"noexcept test\");\nstatic_assert(noexcept(boost::multiprecision::float128(std::declval<double>())), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::float128&>() = std::declval<const boost::multiprecision::float128&>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::float128&>() = std::declval<boost::multiprecision::float128>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::float128&>() = std::declval<const float128_type&>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::float128&>() = std::declval<float128_type>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::float128&>() = std::declval<const double&>()), \"noexcept test\");\nstatic_assert(noexcept(std::declval<boost::multiprecision::float128&>() = std::declval<double>()), \"noexcept test\");\n\nstruct any_convert\n{\n   template <class T>\n   operator T() const; // Can throw!\n};\n\nstatic_assert(!noexcept(boost::multiprecision::float128(std::declval<const any_convert&>())), \"noexcept test\");\nstatic_assert(!noexcept(boost::multiprecision::float128(std::declval<any_convert>())), \"noexcept test\");\nstatic_assert(!noexcept(std::declval<boost::multiprecision::float128&>() = std::declval<const any_convert&>()), \"noexcept test\");\nstatic_assert(!noexcept(std::declval<boost::multiprecision::float128&>() = std::declval<any_convert>()), \"noexcept test\");\n\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_nothrow_gmp.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2015 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/gmp.hpp>\n#include <type_traits>\n\n//\n// Move construct:\n//\nstatic_assert(std::is_nothrow_move_constructible<boost::multiprecision::mpz_int>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_constructible<boost::multiprecision::mpq_rational>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_constructible<boost::multiprecision::mpf_float>::value, \"noexcept test\");\n//\n// Move assign:\n//\nstatic_assert(std::is_nothrow_move_assignable<boost::multiprecision::mpz_int>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_assignable<boost::multiprecision::mpq_rational>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_assignable<boost::multiprecision::mpf_float>::value, \"noexcept test\");\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_nothrow_mpfr.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////\n//  Copyright 2015 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/multiprecision/mpfr.hpp>\n#include <type_traits>\n\n//\n// Move construct:\n//\nstatic_assert(std::is_nothrow_move_constructible<boost::multiprecision::mpfr_float>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_constructible<boost::multiprecision::mpfr_float_100>::value, \"noexcept test\");\n//\n// Move assign:\n//\nstatic_assert(std::is_nothrow_move_assignable<boost::multiprecision::mpfr_float>::value, \"noexcept test\");\nstatic_assert(std::is_nothrow_move_assignable<boost::multiprecision::mpfr_float_100>::value, \"noexcept test\");\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_numeric_limits.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) &&         \\\n    !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPQ) && \\\n    !defined(TEST_TOMMATH) && !defined(TEST_CPP_INT) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n#define TEST_MPF\n#define TEST_BACKEND\n#define TEST_MPZ\n#define TEST_MPFR\n#define TEST_MPFR_50\n#define TEST_CPP_DEC_FLOAT\n#define TEST_MPQ\n#define TEST_TOMMATH\n#define TEST_CPP_INT\n#define TEST_MPFI_50\n#define TEST_FLOAT128\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50) || defined(TEST_MPF) || defined(TEST_MPZ) || defined(TEST_MPQ)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#if defined(TEST_MPFR) || defined(TEST_MPFR_50)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_MPFI_50)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef TEST_TOMMATH\n#include <boost/multiprecision/tommath.hpp>\n#endif\n#ifdef TEST_CPP_INT\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\n#define PRINT(x) \\\n   std::cout << BOOST_STRINGIZE(x) << \" = \" << std::numeric_limits<Number>::x << std::endl;\n\ntemplate <class Number>\nvoid test_specific(const std::integral_constant<int, boost::multiprecision::number_kind_floating_point>&)\n{\n   Number minv, maxv;\n   minv = (std::numeric_limits<Number>::min)();\n   maxv = (std::numeric_limits<Number>::max)();\n   BOOST_CHECK((boost::math::isnormal)(minv));\n   BOOST_CHECK((boost::math::isnormal)(maxv));\n   BOOST_CHECK((boost::math::isnormal)(log(minv)));\n   BOOST_CHECK((boost::math::isnormal)(log(maxv)));\n   BOOST_CHECK((boost::math::isnormal)(sqrt(minv)));\n   BOOST_CHECK((boost::math::isnormal)(sqrt(maxv)));\n\n   if (std::numeric_limits<Number>::is_specialized)\n   {\n      if (std::numeric_limits<Number>::has_quiet_NaN)\n      {\n         BOOST_TEST((boost::math::isnan)(std::numeric_limits<Number>::quiet_NaN()));\n         BOOST_TEST(FP_NAN == (boost::math::fpclassify)(std::numeric_limits<Number>::quiet_NaN()));\n         BOOST_TEST(!(boost::math::isfinite)(std::numeric_limits<Number>::quiet_NaN()));\n         BOOST_TEST(!(boost::math::isnormal)(std::numeric_limits<Number>::quiet_NaN()));\n         BOOST_TEST(!(boost::math::isinf)(std::numeric_limits<Number>::quiet_NaN()));\n      }\n      if (std::numeric_limits<Number>::has_signaling_NaN)\n      {\n         BOOST_TEST((boost::math::isnan)(std::numeric_limits<Number>::signaling_NaN()));\n         BOOST_TEST(FP_NAN == (boost::math::fpclassify)(std::numeric_limits<Number>::signaling_NaN()));\n         BOOST_TEST(!(boost::math::isfinite)(std::numeric_limits<Number>::signaling_NaN()));\n         BOOST_TEST(!(boost::math::isnormal)(std::numeric_limits<Number>::signaling_NaN()));\n         BOOST_TEST(!(boost::math::isinf)(std::numeric_limits<Number>::signaling_NaN()));\n      }\n      if (std::numeric_limits<Number>::has_infinity)\n      {\n         BOOST_TEST((boost::math::isinf)(std::numeric_limits<Number>::infinity()));\n         BOOST_TEST(FP_INFINITE == (boost::math::fpclassify)(std::numeric_limits<Number>::infinity()));\n         BOOST_TEST(!(boost::math::isfinite)(std::numeric_limits<Number>::infinity()));\n         BOOST_TEST(!(boost::math::isnormal)(std::numeric_limits<Number>::infinity()));\n         BOOST_TEST(!(boost::math::isnan)(std::numeric_limits<Number>::infinity()));\n      }\n      if (std::numeric_limits<Number>::has_denorm == std::denorm_present)\n      {\n         BOOST_TEST(FP_SUBNORMAL == (boost::math::fpclassify)(std::numeric_limits<Number>::denorm_min()));\n         BOOST_TEST(FP_SUBNORMAL == (boost::math::fpclassify)((std::numeric_limits<Number>::min)() / 2));\n         BOOST_TEST((boost::math::isfinite)(std::numeric_limits<Number>::denorm_min()));\n         BOOST_TEST(!(boost::math::isnormal)(std::numeric_limits<Number>::denorm_min()));\n         BOOST_TEST(!(boost::math::isinf)(std::numeric_limits<Number>::denorm_min()));\n         BOOST_TEST(!(boost::math::isnan)(std::numeric_limits<Number>::denorm_min()));\n         BOOST_TEST(0 == std::numeric_limits<Number>::denorm_min() / 2);\n         BOOST_TEST(0 != (std::numeric_limits<Number>::min)() / 2);\n         BOOST_TEST(0 != std::numeric_limits<Number>::denorm_min());\n      }\n   }\n   Number n = 0;\n   BOOST_TEST((boost::math::fpclassify)(n) == FP_ZERO);\n   BOOST_TEST((boost::math::isfinite)(n));\n   BOOST_TEST(!(boost::math::isnormal)(n));\n   BOOST_TEST(!(boost::math::isinf)(n));\n   BOOST_TEST(!(boost::math::isnan)(n));\n   n = 2;\n   BOOST_TEST((boost::math::fpclassify)(n) == FP_NORMAL);\n   BOOST_TEST((boost::math::isfinite)(n));\n   BOOST_TEST((boost::math::isnormal)(n));\n   BOOST_TEST(!(boost::math::isinf)(n));\n   BOOST_TEST(!(boost::math::isnan)(n));\n\n   if (std::numeric_limits<Number>::round_style == std::round_to_nearest)\n   {\n      BOOST_CHECK_EQUAL(std::numeric_limits<Number>::round_error(), 0.5);\n   }\n   else if (std::numeric_limits<Number>::round_style != std::round_indeterminate)\n   {\n      // Round error is 1.0:\n      BOOST_CHECK_EQUAL(std::numeric_limits<Number>::round_error(), 1);\n   }\n   else\n   {\n      // Round error is presumably somewhere between 0.5 and 1:\n      BOOST_CHECK((std::numeric_limits<Number>::round_error() <= 1) && (std::numeric_limits<Number>::round_error() >= 0.5));\n   }\n}\n\ntemplate <class Number>\nvoid test_specific(const std::integral_constant<int, boost::multiprecision::number_kind_integer>&)\n{\n   if (std::numeric_limits<Number>::is_modulo)\n   {\n      if (!std::numeric_limits<Number>::is_signed)\n      {\n         BOOST_TEST(1 + (std::numeric_limits<Number>::max)() == 0);\n         BOOST_TEST(--Number(0) == (std::numeric_limits<Number>::max)());\n      }\n   }\n}\n\ntemplate <class Number, class T>\nvoid test_specific(const T&)\n{\n}\n\ntemplate <class Number>\nvoid test()\n{\n   typedef typename std::conditional<\n       std::numeric_limits<Number>::is_specialized,\n       typename boost::multiprecision::number_category<Number>::type,\n       std::integral_constant<int, 500> // not a number type\n       >::type fp_test_type;\n\n   test_specific<Number>(fp_test_type());\n\n   //\n   // Note really a test just yet, but we can at least print out all the values:\n   //\n   std::cout << \"numeric_limits values for type \" << typeid(Number).name() << std::endl;\n\n   PRINT(is_specialized);\n   if (std::numeric_limits<Number>::is_integer)\n   {\n      std::cout << std::hex << std::showbase;\n   }\n   std::cout << \"max()\"\n             << \" = \" << (std::numeric_limits<Number>::max)() << std::endl;\n   if (std::numeric_limits<Number>::is_integer)\n   {\n      std::cout << std::dec;\n   }\n   std::cout << \"max()\"\n             << \" = \" << (std::numeric_limits<Number>::max)() << std::endl;\n   std::cout << \"min()\"\n             << \" = \" << (std::numeric_limits<Number>::min)() << std::endl;\n   PRINT(lowest());\n   PRINT(digits);\n   PRINT(digits10);\n   PRINT(max_digits10);\n   PRINT(is_signed);\n   PRINT(is_integer);\n   PRINT(is_exact);\n   PRINT(radix);\n   PRINT(epsilon());\n   PRINT(round_error());\n   PRINT(min_exponent);\n   PRINT(min_exponent10);\n   PRINT(max_exponent);\n   PRINT(max_exponent10);\n   PRINT(has_infinity);\n   PRINT(has_quiet_NaN);\n   PRINT(has_signaling_NaN);\n   PRINT(has_denorm);\n   PRINT(has_denorm_loss);\n   PRINT(infinity());\n   PRINT(quiet_NaN());\n   PRINT(signaling_NaN());\n   PRINT(denorm_min());\n   PRINT(is_iec559);\n   PRINT(is_bounded);\n   PRINT(is_modulo);\n   PRINT(traps);\n   PRINT(tinyness_before);\n   PRINT(round_style);\n}\n\nint main()\n{\n#ifdef TEST_BACKEND\n   test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();\n#endif\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::mpf_float_50>();\n#endif\n#ifdef TEST_MPF\n   boost::multiprecision::mpf_float::default_precision(1000);\n   /*\n   boost::multiprecision::mpf_float r;\n   r.precision(50);\n   BOOST_TEST(r.precision() >= 50);\n   */\n   BOOST_TEST(boost::multiprecision::mpf_float::default_precision() == 1000);\n   test<boost::multiprecision::mpf_float>();\n#endif\n#ifdef TEST_MPZ\n   test<boost::multiprecision::mpz_int>();\n#endif\n#ifdef TEST_MPQ\n   test<boost::multiprecision::mpq_rational>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>();\n   test<boost::multiprecision::cpp_dec_float_100>();\n#endif\n#ifdef TEST_MPFR\n   test<boost::multiprecision::mpfr_float>();\n#endif\n#ifdef TEST_MPFR_50\n   test<boost::multiprecision::mpfr_float_50>();\n#endif\n#ifdef TEST_MPFI_50\n   test<boost::multiprecision::mpfi_float_50>();\n   test<boost::multiprecision::mpfi_float>();\n#endif\n#ifdef TEST_TOMMATH\n   test<boost::multiprecision::tom_int>();\n#endif\n#ifdef TEST_CPP_INT\n   test<boost::multiprecision::cpp_int>();\n   test<boost::multiprecision::int256_t>();\n   test<boost::multiprecision::uint512_t>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<200, 200, boost::multiprecision::unsigned_magnitude, boost::multiprecision::checked, void> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<70, 70, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void> > >();\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_optional_compat.cpp",
    "content": "/*\n *  (c) Copyright Andrey Semashev 2018.\n *\n *  Use, modification and distribution are subject to the\n *  Boost Software License, Version 1.0. (See accompanying file\n *  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n */\n/*\n * The test verifies that Boost.Multiprecision does not cause conflict with Boost.Optional\n * because of its restricted conversion constructors and operators. See comments in:\n *\n * https://github.com/boostorg/integer/pull/11\n */\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/optional/optional.hpp>\n#include <boost/core/lightweight_test.hpp>\n\ninline boost::optional<boost::multiprecision::int128_t> foo()\n{\n   return boost::optional<boost::multiprecision::int128_t>(10);\n}\n\nint main()\n{\n   boost::optional<boost::multiprecision::int128_t> num = foo();\n   BOOST_TEST(!!num);\n   BOOST_TEST(*num == 10);\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_pow.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n//#  define TEST_MPF\n#define TEST_BACKEND\n#define TEST_CPP_DEC_FLOAT\n#define TEST_MPFR_50\n#define TEST_MPFI_50\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(TEST_MPFR_50)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_MPFI_50)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n\ntemplate <class T>\nvoid test()\n{\n   std::cout << \"Testing type: \" << typeid(T).name() << std::endl;\n   static const boost::array<boost::array<const char*, 3>, 702> data =\n       {{\n           {{\"9.85291419463953934609889984130859375e4\", \"8.4167086266170372255146503448486328125e2\", \"8.66781019918879108354226292713799369912745098619466567318041467361236175866573114777000418440761829061824953361563557580935951901405814080757565313129904800947783606850513184296612628910656615168927761935861462770335134108408073175949783551491164949747086136599355880600420490275164555515512645668845e4202\"}},\n           {{\"1.652914355109703592461301013827323913574218750e1\", \"4.936528947862250937816952500725165009498596191406250e-2\", \"1.14852190138491736562279120519668390081141778746743826681517181158751264571350304943298501284647564489716027476004029804110782430201351750715968215799574772058637701195873519618784612525011353325208230847515250406858209757415407239793739704829281917272032288615255140733409015874140869835291148547238\"}},\n           {{\"2.95673953882856110908505797851830720901489257812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"5.3091550971799097169423475861549377441406250e2\", \"9.16137091634529046709182958669115589757019722367818747705232600776240821857227718551873067599347313641575272826830417174591636547915061517391300131065931465784194067711359196329143298499263726513131614582697830908424187934868152998838921216586737465291051289708299364409624364999366486746226077050764e249\"}},\n           {{\"6.085814876798215132883140832120716368081048130989074707031250e-5\", \"7.65778516457987279864028096199035644531250e2\", \"5.27056224622668410282266686919173718609676411389459024877282902746284033954589536288634973757568176464096389580016576960309487231057438455595655805167665817497028295657665023126747065443986739792258870082022889306909488139458069146748438042701949551909468708242176394539901613782225328586614222105675e-3229\"}},\n           {{\"2.722646144868545725614694674732163548469543457031250e-1\", \"4.8695443455590336004346063702996616484597325325012207031250e-4\", \"9.99366682241962146368589809577120011723198308450433185299366732500677873637460155970547267099719914327909694930518383012498797681761846242526638144261306834523078708261122471803832490341687603813336927181436827534082878781252668704774445437548691251936499670077735883150461534069270846997649139259014e-1\"}},\n           {{\"1.15866069758449596882599053060403093695640563964843750e-1\", \"4.91253262757665787319183436920866370201110839843750e-1\", \"3.46868982488456565751167443881314840659743514173491612010770748877346398177489343237604160804413931931718223750314831998907846386274396179552445359933868165880372381338724806279781831953896898649659594755834925976964179275873971118494605322798850925802574178528777014182338769959249415096934378557388e-1\"}},\n           {{\"4.72825938314130529761314392089843750e5\", \"1.228931327397812367507867747917771339416503906250e1\", \"5.47245157077269889091085696140795527282280334677569169487973419233796250189843816560261965111196061138868370890204338231535198008079068304184762140493830719955323588998399173073261634891767823614143691840392792367527470000847416054709559319143615840412839768396194451923527439592939735228732869467965e69\"}},\n           {{\"1.2955657225533417658880352973937988281250e4\", \"1.81521083299418428680382930906489491462707519531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.91729899451736210436889587963352494969987265352294254442114149825297350300933403119961677078224257818567229354512108221647637427508041941647518586565006416113534560289731038664091154857692367872604020422463457596747145816854139701847749519264660326361171185139298113322096978245544144264234481020815e7\"}},\n           {{\"1.7430590914513759344117715954780578613281250e3\", \"1.5572745970949500304847390452778199687600135803222656250e-2\", \"1.12324923143821767715038683964417533829057341785931080679952341815408539775130405061465897612861320390765996927155081774925717154208894105154455487856335006846587865128269477586014136390788140643457017602926503892493119037260205017744346004538379559837051387829449807650507431889923695496342461088404\"}},\n           {{\"5.947230963297863581829005852341651916503906250e1\", \"2.4796058491402149168147950319962546927854418754577636718750e-4\", \"1.00101355895664265703253905800820834352012946978175213925289823900262226487475877307647753894219794796436589570196875943062842928843129407133278574235943906905626144071246066853301987332156463703818534415183682692042219695734377740067313312425523058170350486981674302932951851973390826740834796342180\"}},\n           {{\"1.6890881194976660012148708678303421493183122947812080383300781250e-6\", \"7.315835005101905608171364292502403259277343750e1\", \"5.06485337562137503941405427253471002412719863672407294570575625371322654317127374055512455786988091092329605000808871766177184698431732837248355728401235010135527651826220232715652024742668291949645619992685612328535253252695622896976648954823150769316159100729259724133493553742448044299816541989455e-423\"}},\n           {{\"4.72470471679805708838453814912838879536138847470283508300781250e-6\", \"1.9315009754541449638054473325610160827636718750e1\", \"1.36613880262643802742756290736395850668317512466586871167321608424137867570108690626258507320043808302565319397131444616166042735793688809613906106252620462557968555895414582976985576875374557668514391264049547180886976991031038592004458693177738810104222966751846844587127740341157319952915743398285e-103\"}},\n           {{\"5.4204233294109713248154491793684428557753562927246093750e-3\", \"2.5117484913880550045917061652289703488349914550781250e-2\", \"8.77171703127754502681310204125715941650801721154976863870699221072355335125966565182666925044598746890911836338141033359039531496488403405876863230608143768785806156629534985369811294999635059473513624761915818310578096052710097713441725036078711101258417410421951107958524860020565804089659046743943e-1\"}},\n           {{\"1.0381492965649719018017549387877807021141052246093750e-1\", \"4.02775539432865528274851918411059159552678465843200683593750e-5\", \"9.99908769642175788386137778958539300137602918424410284952085874015336769726750047569734816766197409755257562872230833189101650544474710424482558254479079319860825174137124403380959665595507587367668848404286717760343524270837960434045414179621713212480893218438355518348995643697164109731552178914851e-1\"}},\n           {{\"3.826356416302296565845608711242675781250e3\", \"3.046966451443047785296869278681697323918342590332031250e-3\", \"1.02545504718938094372102791727911930176506035001600018053644429991055918696319033730794852043021666923875675436795843500904336366408589219201909169612259476814126333181168932741070039124737361896932592045285182764869916877379718622220890978571031406624988992549594836404906978120992311725853941493659\"}},\n           {{\"1.3367248690647914877160928881494328379631042480468750e-1\", \"1.207016212032306157198036089539527893066406250e1\", \"2.82608741435940656086722594561546646099634760918110959565977761208896418216166536561903222226214939613599640463597249764023513875896636280664458251642404729724932181291845871312202787897768372355186920789243514016890287945724482698867187289280837997988218972650355222505584789955736058952829050123955e-11\"}},\n           {{\"7.8880385490801472769817337393760681152343750e2\", \"1.46278561425722486433187441434711217880249023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1.72840141730863663391876877521764355960382145920572562742914162972208384723706307292705275033115082012368548682595775882643927894139786449383322664316773126131611883398659050539189893838100041408464889082404113404032943316931275847874983317572290683797208861989532362102600980996636385789799495020849e4\"}},\n           {{\"6.0290844501169942759588593617081642150878906250e1\", \"2.73159824509963122807221225230023264884948730468750e-1\", \"3.06403097260563050081855800637166449495962164712719263330810086375883439970326530663445685346228862337912240907582664457942174627433334293660419014781254710335542481599007896808711916825623070383641755045318205803207383228319360990374222920104547227487223738392731388028498147565624523546346417715655\"}},\n           {{\"5.2188207927001606378780707018449902534484863281250e-1\", \"1.00797343550563134328967862529680132865905761718750e-1\", \"9.36552325485277806964373331313098838333278330423455390715861973295876349888773267892681165876113176797510574847645252615081953879524429911159719101193921387688552351634752458416166446355778230365755243829643708299147847893065939954861919388676503519612640610354931769525373202729617723199328630093636e-1\"}},\n           {{\"6.21172003041995424155174987390637397766113281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"8.6091943502081919400601914271753400953457457944750785827636718750e-7\", \"1.00000157241706535645559625081132898066253320364132991765749046567536915342813631920409642832019004224458248512335711478395060579077427182783938451114029622700384959716532968625901664719629811957905865676402174328291417935322613778738659214041802729741480722967793087943757739011593472415850478420639\"}},\n           {{\"8.933489431168359015678070988997205859050154685974121093750e-4\", \"4.1532229397912578860996291041374206542968750e2\", \"4.91021563983953636397848520840523223624643742835964326188016961937573012460753870407293657436708430593126320103796954182972032017026192445957161066771807675200884423939605981304732630092257312925408813941089831976477439943114677798839623996214029155361569909503935179401196449493080818512569086682097e-1267\"}},\n           {{\"5.55105519395504379644989967346191406250e4\", \"2.205612949903890118719118618173524737358093261718750e-1\", \"1.11282177288045201072507504088709286277978249266318510332909847928909226338145185595245293917086320817076726850666066198249106037631163063795831697507293260413136608221812252367908447186422344164553977681855896096040438700902356349275031836676568495994537852124264298684105398360497193752327260914137e1\"}},\n           {{\"2.64139377644600310476863391784263512818142771720886230468750e-5\", \"7.78537344498752810831310178230069141136482357978820800781250e-5\", \"9.99179632299559171314926709030763809736309139005374052895886931807671532458904052556141342139885810036321222015645710865315806166952058325774560966552187527103940189373824279065702873017246336399071137612269219545181070886990906061668084063703411460250321467244169857420435253409159030432098292621067e-1\"}},\n           {{\"1.04207364225271594477817416191101074218750e4\", \"9.490963248606765212400659947888925671577453613281250e-4\", \"1.00881927761618177965011845644574187803759898330801723609976606642566910129111150781463974721119043760111173993259232795682413324213317011846206782754096089290427628991647487342082014619699610677423897602146820644840945077548746946762791624180147374361784328110343084702444523109612274014821745626982\"}},\n           {{\"3.3151932056626380942998544298916385741904377937316894531250e-4\", \"5.69130350190431280252290058285780105507001280784606933593750e-5\", \"9.99544126695324189746630737456946723361046661345027805407888971023026631339988056392642825478722792254481831582440796961181158845762815786131168245934078509438401554967954057934563178474479427510608187860234090448388699710858468168174057416883471915845617321874136073232354461932587707630236256378020e-1\"}},\n           {{\"1.88337177923367888807137937590141518739983439445495605468750e-4\", \"4.32540268863411711208755150437355041503906250e2\", \"5.75229630554212330195665922771148699451829771147200356624805857657236782065140481467338634818457146889580617522654929450001033313425457042558128784684181381335537144806647956114444609625124141647264003246426211941949785732284342909061255617831919446477154897012961652269654460432165747451828975060062e-1612\"}},\n           {{\"3.9545929052570905071206652792170643806457519531250e-1\", \"2.677916713784273921835146770042968000780092552304267883300781250e-6\", \"9.99997515679857005761440503886095927815406391244413835291624899797364615653895949902813000744851723242602512239539568754651988070279277456656779917196036522934849059282355864096704432345340316634144618927930200708582994637711792811242475638942101629267185320507818308058050356385241284795438747530570e-1\"}},\n           {{\"4.18765706320910169324633898213505744934082031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.16291806714740175721090054139494895935058593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.21448401185251170746394861880464242649255630391558005989017991140563422704674077045117022763467561974222030061746655113958910240758539727055748249625892285904547489203480154655618632992990390332430221914382681227157928848406067945057161854616129785541408035327136685741399621377579757754012545382969e1\"}},\n           {{\"1.28834086985551640736069600734481355175375938415527343750e-3\", \"3.5070592325596103289164773286756826564669609069824218750e-3\", \"9.76932835372685523370171735287063726416767225734834615849134547109660778793799398169080725972094573408844765674179657286895933198717192952354877012591779343412877647689917686841315165602494901218010719779271020694334581849406783713948998204010537229621398578990055098138781426451663477493080600789821e-1\"}},\n           {{\"2.097206120446792887435094598913565278053283691406250e-2\", \"4.58040082173553630973117378744063898921012878417968750e-2\", \"8.37769288971832154015429547694831033608424622845142547611771987181607855769209591840464089347717993026475816138178319620101164703046235086673631394869476080594839931563796671833715053698127488579638544943331524253087769152813629459325853986427109398088052746438762088357925061124187186100435982047033e-1\"}},\n           {{\"2.86348409095251425380765364359092473023338243365287780761718750e-6\", \"1.661473408152986941388462582835927605628967285156250e-1\", \"1.19957610695947876947018322120150143406142221469373757924519795345150006977773403730313023369079301615734601162566867121616810596830759956044509310651071485457850172811241087990683705383118703983140409701647142571470333867908682196499347683237058377349085352136214854181401946343510795949868835711429e-1\"}},\n           {{\"1.43297873345568077638745307922363281250e5\", \"1.41681240009364082165985165850941029930254444479942321777343750e-5\", \"1.00016822776212044529668140515271000711944889104836686684000447554242511520504646895662976301872271981369559245931879055379226726537073846553544561947637792091890791964244339592472180091648456672557297620691698497967178088487062658421331764320606009571740080394934111049676474128724114098218934644280\"}},\n           {{\"3.60098653144944158555063040694221854209899902343750e-1\", \"2.03376339210932499668160744477063417434692382812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1.25275538744154336055615419863736730746930928726962752118772852620054361808569416481449220736645770958820155429279907622983889720952174836443567087662689941130263300184594808723215176724531461369529244321399979413684112346655770810116945662086924599874483949305102682382993398648882273436739947930631e-1\"}},\n           {{\"5.295402011714999248107038631872001133160665631294250488281250e-5\", \"4.561361486960971434179157313337782397866249084472656250e-3\", \"9.56082033932816309081231125453071826327896674917466727856568147854623107132514590973229074834141556000908164346345063684708226886531162257152516511661460364047957606893852284251293056880030888612998267350454535860387161852393199580592248818623376237183284153405740445167284591706260229351268548628924e-1\"}},\n           {{\"1.44301800298425852986383688403293490409851074218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"7.143083929538946623763462362433074304135516285896301269531250e-6\", \"1.00000261963485792416853927136569198682383793838454319729684734973539039182323306199235318171814360855994012568229358281529883676852371448365509202038288834881570383584403906835594533516647281713968932211752518665238323196577224701747937440185305151190908616249351775361542696295892178890063882257116\"}},\n           {{\"6.228038096295846273720009378394024679437279701232910156250e-4\", \"3.25094187232484732597015408828156068921089172363281250e-2\", \"7.86658469541403998034943500870243069476823132486007751990824694615782893644279173776512596334159142603325455113617967643461939139102971978114976150505918018758878971981207590718138194009315889095960072548673588879789986017926322494375432269097377546556386620403909103214427884440798206932883636297352e-1\"}},\n           {{\"9.8555361955851549282670021057128906250e2\", \"2.19375835372379413001908687874674797058105468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"3.69327012293708811121144971175263370083910101169553278058859848877086709080419562447585355719348842415619132355236627485649548952876411849102018675375354238273102815474095986357261970461229247085634624604985094330242448976955585994530902647027597520370418448678147789523361182103563378206595110636366e6\"}},\n           {{\"3.5879392216430850207076197477817913750186562538146972656250e-4\", \"6.9182884453136028746200736350147053599357604980468750e-2\", \"5.77635990889125108309690852819112724262223736693646969131631611067612444282401471024845889526676870050656945639578159737127915466435929600368572355785708484463627825178182883323088006398240693308602881027224033181200011330121428663774743869527395379215026638702157803494202819893449358544841576526785e-1\"}},\n           {{\"4.961468486142577603459358215332031250e3\", \"5.36919182658175953015700088144512847065925598144531250e-2\", \"1.57915370211935194723362359441601671775858730114448762856923579370262681814508708674839371719677055754578289843591415190008400693094242195743768201495967775525358591358166609121796030602701836084062498854380733868656008519376928763241674707747769169741392588580100945268376807756367217092609019332523\"}},\n           {{\"4.24495621335822494657116776828331694559892639517784118652343750e-6\", \"2.412731330413380170796244783559814095497131347656250e-1\", \"5.05650148888948869811331120941963319541414375806822687983830138205938420862200064078576598469877831249406211581526927963122105281131255004573845222711684347603254852806653766035434125383812586900316395999300527269121533046942253679078218107723668449508163238533047093749711627477323541829484653131292e-2\"}},\n           {{\"4.4864042703223833814263343811035156250e5\", \"1.57545512531989570200255390552968037809478119015693664550781250e-6\", \"1.00002050314697607659431018359659361183713303212753613120902527904331498111603138394334757418054814218670389608976827498549914166555768752494414195237102560486571709642923543196007200071132086884670852209514113439317507321835737223329599950365222037362534859303381396326717532288233329927808913598785\"}},\n           {{\"6.497495709023816743865609169006347656250e3\", \"1.67233186866778105184039304731413722038269042968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.37780724079840208711014533649991541109470796504084314835156759344214993302863952807171583660778803863957191115559320339273255056520571556246744533838811694006166732957726755945662570959533321672076547914911635593118101608294069731654269467619949055336628326621660012876406202543146880009002104821553e6\"}},\n           {{\"6.0967436711242051217141124652698636054992675781250e-2\", \"1.5704484143598296556551541236501634557498618960380554199218750e-6\", \"9.99995606813099499267634389464438683850041060806908350269346321155672893761130577244819124593817984249660934044363638948086248241297434338993626965911693249278796597285537898160766381999495115463474497883772569241592760426493272254012575287314033420480717621539078495596903806489817283498263020744184e-1\"}},\n           {{\"7.575034551306392138769751909421756863594055175781250e-2\", \"1.25659927896368083096931278497265793703263625502586364746093750e-5\", \"9.99967576340235983529748322865757677186118554170023614050204881657758768441183672920424294568610952334609747551908015545068832481235294176033402023954402315837530793201944548984799957607361928025651266738940647431602585783131780321746876553060340085541214977820888348264644079307051095179685852079945e-1\"}},\n           {{\"7.230949225422644496830137939014093717560172080993652343750e-4\", \"1.59957635240683257102367598179171181982383131980895996093750e-4\", \"9.98843860017333489092110505899347130551976013147438321970353479326257793437223848104429707854561661175450570835038515201752789245106905767296900600611401551754756721658819816241278926439311942572630487380703760937536160330693843537976099522621025621041857521661138411993182809798954282325807746896512e-1\"}},\n           {{\"2.22347866336470469832420349121093750e4\", \"2.67574314969844628819828358246013522148132324218750e-1\", \"1.45597650920700334896440864288586774552136744768533970151074149218272851829624764505239431335468131476208480181217427109189696065749387968903474055278714181692867425657254225967806378137696550459591101296481511902742572646395696145586249150843548288850238158312747067673295059110101209836587291678717e1\"}},\n           {{\"1.6196975420412198717889928900603990769013762474060058593750e-5\", \"4.98433649539913870007978857756825163960456848144531250e-2\", \"5.77061455335439039778043359172467746025200146785630273407892949860314031306268447375871357416922980298986141833641561954857127992214135487677696097641048847861017455164355255934271546462888696419881919311556223441720520985938735112636787538160901409982382930452852563601752376961873325250302513132303e-1\"}},\n           {{\"1.1078580283775937842527525845071068033576011657714843750e-2\", \"1.18652221207551884308087353225857896177330985665321350097656250e-5\", \"9.99946575396258084502018839446238846584110705812867877643924485585779113197512036317728340100285410504878437697437320927763146715271389949541429089452281046460116468251613835907291530307473134875676645637754443536935426771393775580503285493873005924313301673550096584687732186248324962291699197441007e-1\"}},\n           {{\"4.0090085615093388029042675846369547798531129956245422363281250e-6\", \"1.5153243776850145379609183238223124590149382129311561584472656250e-6\", \"9.99981169291887424157759932262067246066753044936086128253970315838989839817149914187581608688565806547274970455207936904774502513857569845689591879527047150474914557088218340646463900082270385606124499095033110795779754466447281328092278318076549095302554108789079991538595665731579745334006426859960e-1\"}},\n           {{\"1.19021350263737038868705475636033952469006180763244628906250e-4\", \"1.68290288542928294646117137745022773742675781250e1\", \"9.04852417540620009944566041453719467211390230149498516011819535440728246929538100576552383464173953438153608848998091884909329517100819960017904887302473398843345408874822800579053111675353115760245493436345787702548498655314405766561270926511701674435330529881522800583133171192665005622617374333010e-67\"}},\n           {{\"3.242762654672085015491664328202148226409917697310447692871093750e-6\", \"4.4540895454217880808367446832107816589996218681335449218750e-4\", \"9.94386254687686946963322383552185492075977337531973213930838015838274376322044860137122810561067818353529641305366066211688682157075369267213623551618566522232634253178245524174116891287095569137130501326353904791232655125453161983083517758472031555434930112729665552915867163490039363051308443099856e-1\"}},\n           {{\"6.15810616566200508259498747065663337707519531250e-1\", \"3.16615056291079111083774932922096922993659973144531250e-2\", \"9.84767212442093730437806115126470445228033445461780019945996712538430276008229376762120777978183512697217805509135802054380845495119030204478634136438561790634012659775242132306345870420149133737299397362388964674004273429551607587049902912378874846355087545159480302396357641147726629312485985544367e-1\"}},\n           {{\"4.986398000750906066969037055969238281250e4\", \"1.7761072017031686345574573171468557575281010940670967102050781250e-6\", \"1.00001921243238237193183827489311170506446717993399056537282384027062526108337893488664380391849139457202726524784919352515463921911589077429652463880766791641171380378763553978844617450998857121720620679684506344842701809891676387117033562056914974016308650056416678855410514380179891286420315463385\"}},\n           {{\"1.3982947813147638953523710370063781738281250e3\", \"3.4349953058313833706427509184777591144666075706481933593750e-5\", \"1.00024882796344591385461239880845260384691776851307067376321212831043330119768926261152601978474535337925904198175128520020096443925386965960197623129024285407478015708065567539370247164906581380771634920314388644089046167410745320267558557473972499677590220735439622489041126850128421653983634543138\"}},\n           {{\"5.53823542724402595460730935883475467562675476074218750e-2\", \"3.895135030254805045060728652117632009321823716163635253906250e-5\", \"9.99887300842861835164017418113429559930804468019069798605482088141983665217815479503166341320807290829070352700865762573462007338287440579346738382811838185553843038382146930720875234411175792603385681200743384496310942148612050283753172718455515566946341846284557394785250850393323918755270713010620e-1\"}},\n           {{\"1.4112136137383384630084037780761718750e5\", \"9.9875418797880222143703576875850558280944824218750e-1\", \"1.39052029796505087174799036572060834290339669936231503015871931355721722463161747207749930806516332386763841930651054884331973674982367750538370231486178766251016302345689298357523496706436693633349722362506875465430935461687316908940273568043577086452494403668755303085058972545116855832701160169233e5\"}},\n           {{\"2.896681342684133284243533368318423981691012158989906311035156250e-6\", \"1.1586534546002158485578092950163409113883972167968750e-1\", \"2.28205556117411408113652874564375329933423424935399606070975188165013549346043442272013469493594176280229509402715241333520310808546934629428072668916547032154136142048364995378685732366063433675907163954131129548865718748066808278449447269502355535592014434886553141414017802588692926998785625006881e-1\"}},\n           {{\"6.80370452266789652639999985694885253906250e3\", \"2.55585667546695538554502036276971921324729919433593750e-3\", \"1.02281231404359612151527353897929180348478744328820333025332541070807332704656155540376559985312945856024293947964716753864592850899748540597581561259020876390111605898100116321942106603048757052249826147692127068934907088939143183343054183800841834132202006495897859489577613318023621649632711626369\"}},\n           {{\"4.625041131443131210351782378609186707763001322746276855468750e-5\", \"1.52163427846739888679716834474220377160236239433288574218750e-4\", \"9.98482342652643471998471847918276729621115291527655407478347392440646810723671728307137559792389469491363165496772939188998042052370839020230988405367662374022902953797332354477989367493245470167443057076807839721016298819277997067517609396627866901281229526562169916899579412733467953808761281274902e-1\"}},\n           {{\"4.5082293215957577103836229071021080017089843750e1\", \"1.06839470475542444583005874392256373539566993713378906250e-3\", \"1.00407725957483558818239220892424948692876561612077691060007144800995480352451729509031292920021843587131856132257906499443064130817064638818765366250131236399994854411601609832821870319397908684888708832193783247348840517389795509100198832759307607589651546707827898198086014636944156848700425178047\"}},\n           {{\"2.97403319008989266980513832550059305503964424133300781250e-3\", \"3.864747748818575523443996644346043467521667480468750e-1\", \"1.05563040619657475424023632617553458144221260647471757349470769600263284068856263065983919485584722356671096360406091314847188039821446085937501687228128412834520625095444394738723676139779119999762553228944695777339743845083698817002881418226410778165865331625883646946752393289471811888730325566680e-1\"}},\n           {{\"2.383250807842116500978590920567512512207031250e2\", \"1.66302465811868707690202029425563523545861244201660156250e-3\", \"1.00914434741735633383477956146627482536171366958054332840551181784200344603582400731522959980543848217816660950109678863255860871237640121402147335369863635255623422637578873942180607947824451388135749116333642343887949089848641558138185462358132315292011403950110303162349396320495083970574820485984\"}},\n           {{\"1.71423190201370800878066802397370338439941406250e1\", \"5.22776453453089651191021403064951300621032714843750e-1\", \"4.41715373496456388539324810858409600194977863833255435782643057881295200486872481370727134110261522844531904021514609023835218872201273620577170073750362820523072032985530745444647038907617563505404059737966630343043214665700476103118304785807103469358517871674775523305518419709923690374745267779192\"}},\n           {{\"2.24202183750390773639082908630371093750e5\", \"2.8860613713892332640731375192899577086791396141052246093750e-4\", \"1.00356204426464651318381353366766656275190463831503522239513652128295092897680949875433153708401966246976000272332294389517143726474038495934684353460128449357504408039179941027444904612222505017810534008770086553370099204575810832664720970035523251219105643922854038752127247330051903230606763080754\"}},\n           {{\"6.682549242769675323927458521211519837379455566406250e-2\", \"4.37453434835288135218434035778045654296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"7.23884289615444976971058885660437787480627352137562427420631247881049437291942148842029267007686370097695430731343288589752635360722257432905786816202418979845289181427172830309982121527477449228884669859681103900842455539708329644639171581286590973017189366587396069226010533102477610964537380565038e-6\"}},\n           {{\"7.08735989603501259637141629355028271675109863281250e-1\", \"4.931705772743737270502606406807899475097656250e1\", \"4.22994581178880428430588361219833883540463488675474104323353907511764504539625188516288826354093370529125373667749527512470360034116957923611728143647053700596011110669882224710437210488847861184277118067955181730553186100384807049379684590737156995709498402541295775367296456895644229479101255193586e-8\"}},\n           {{\"2.320149423239581665256991982460021972656250e3\", \"4.4481031013119287642609833710594102740287780761718750e-2\", \"1.41156739924941071144222113991630683194620198146427652318978812945951687592217439817665385168004660248141475796965481088709894832854582569992290051260681221672250427616673943995167609515610097891251991676291118804434690243303234426750763059520585143335380969303297852505455054177640936866538646738978\"}},\n           {{\"5.53282998141260031843557953834533691406250e3\", \"3.8412160262591260107001289725303649902343750e2\", \"5.58373770974866315239700400474362989477383658235694014601763955308120813900734144800418886820772189374330395186134971653113939250757648994415649668842051891937875262317539557069792723676293862948593761228728392700591159530165592758768030540795599964339740660316188438257430600649159884119157424191581e1437\"}},\n           {{\"1.85718777739859418943524360656738281250e5\", \"5.22760764621501818278162532216413183050462976098060607910156250e-7\", \"1.00000634214788464577855189457084479231510812185767194037441581727975561469887723538341241488476848396809344125019310357146729535769441778199276860378224675705997700022744347653159656289098028240954603207536444605258988369343538458427994444681579339406242882282677673848923548267602318784029338545299\"}},\n           {{\"2.26509465497761368624196620658040046691894531250e1\", \"1.03762510179397637877229954028734937310218811035156250e-2\", \"1.03290580019042823129797947218377400320349309579887379648069219653044521496312022139633395975447973076157177628011296170468228189168841156259900536323684747126636993787966799478738521263932697630770091216225209592893137197359045523997671979624680066252774430678393930591603773849047796785558663064178\"}},\n           {{\"3.00476295219746433740048985328030539676547050476074218750e-3\", \"8.0240930815382398577639833092689514160156250e1\", \"4.14136997855533491337740509094908136487500777275671775674006769752964040924959289897651192452522290539206601428332553008348132654735739834724305690164751538343877568881013821199733121651153278576916744941958595422652696891642421407236449964345890318648778746090208231400439749942969896805715062234843e-203\"}},\n           {{\"9.7079889666732196928933262825012207031250e3\", \"4.44245980458260469880826804001117125153541564941406250e-3\", \"1.04162803810086699019811359451605453492327199203637588333443087016790236547076001612983024940969264195708947484110311219661303765376669460085704437741732903824466154100734799424439147057676949660911617676769474501254927589549167841876728171722481679869607753266592648983928705022178056753619502736504\"}},\n           {{\"4.66389224589813756668976729713449458358809351921081542968750e-5\", \"8.41598683219974930125317769125103950500488281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"3.53382042139791789590459891074340066702060120383660058981707324170432197791546635984529280576877432127625617337120709804544743161881268886942872653531280982977576133511801284796672543413476367564502976743587063883733930418435751755822485352709171649159924126024328941448624940766411726855902924670549e-37\"}},\n           {{\"3.5980841563362578328089114165777573361992835998535156250e-3\", \"3.89106070923696201191432919586077332496643066406250e-1\", \"1.11957324795765157901703029938063916662894000731995996196921601505519523032651152137148283098242267387419838627536448762986353433569901640648734154364900058234967711292575255307936095926242393050569604396410567616604312846123878721000606629431359673384574670669906697802557686478096291498804903738631e-1\"}},\n           {{\"8.29546112810515936034083672723227209644392132759094238281250e-5\", \"2.58324466499312066503080131951719522476196289062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.86659658288740565122000959721270284304946720479579271651550103638161205367495371607443353257219806398111103943515458202894485596325631197266478165244814107159447017816960534609382148164169335790367935277372018345236031109996214855557877416239874683021494253068006756484498147004540748744410389570461e-11\"}},\n           {{\"8.633345938915559791837495140498504042625427246093750e-2\", \"1.53080323158965114771490334533154964447021484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.35233729973545869852697007160756749812975339497681040282999017995032382608550729201580422775220111291799102420635253476809267746237352183450521514570985348430714476644398637263228584608977432119909919809882847191196859131282077491115028311403034792745466352775458252803189617423439193439791933123479e-2\"}},\n           {{\"4.96802530016260956990947761369170621037483215332031250e-2\", \"7.025196835724334398776136367814615368843078613281250e-3\", \"9.79130174131074712614824707606461473196424333567411409743609116414751816130489331857231684597817414740294362613028844768413127008896909984819847802879905875872491406317289520166024819440680050252863090346899246519659384416734528764367429297819383807550500609868490474715994290375146313368129823880737e-1\"}},\n           {{\"1.24702033554851823282660916447639465332031250e1\", \"1.710705957554977231852011421153747505741193890571594238281250e-5\", \"1.00004316789477874277620263489613820769653924396429221925198065527832144152145855155330213971456389989525794479500052652310504867952437063466242776820964127214900733034755428153463014611408545155223418498794841462940237893200540509678171081868776875097700422657888013910264387140255547155547751726595\"}},\n           {{\"8.14130989781463318757936953318221640074625611305236816406250e-6\", \"5.476743603534721671621809946373105049133300781250e-1\", \"1.63199095965818056903859668356569903606584619352293451010588563431807635376986054905897873784109387681218165026966672415089273447045333707684197569751029547891913778442699838628510300753325723159251992398807517774034918042863197611983714480066975243968618918488213538490759809651966026386013669113012e-3\"}},\n           {{\"9.4831604756264176181446146074449643492698669433593750e-2\", \"5.873187053422951808476226709387901792069897055625915527343750e-6\", \"9.99986164907695049446699147999970503354260553000953839878275159076458261755428730763560216631851642537174133195419034054495238529976374508256949441111167727864128507860277033299044051865971449902820004978297018651282279654117307535005136847959876138249613275046667240315151303933181873427450473536424e-1\"}},\n           {{\"6.724396223986286655338595608100149547681212425231933593750e-4\", \"7.25371945127648842799317208118736743927001953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"9.74287216286274945633266572714083322962101975717027023442493643122162512912802620909159732325958549010615659395950026917825109006470507725724883444926417334797999132724229966674370457592343778072797597317430071335665732334697884217471229705559230148495486170835726019893708870900510074940623722192258e-24\"}},\n           {{\"2.30442309265876887366175651550292968750e5\", \"5.100776150045996035209405761179368710145354270935058593750e-6\", \"1.00006298512189780533426621327292231284630240394286315128868176668180396156679505765231684868863847590833570938788465357619602169740491681317033999860409913654411707265663879954547321897801703570651803262843624273611588702980486012373865440788314427239276089286730821085936329475836740228791493079509\"}},\n           {{\"5.67608898683707252530439291149377822875976562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"6.0768302191256316291401162743568420410156250e2\", \"1.67068196412266823466861212116241893055807436102731155140415238019317223182255528301301262470626159261154640191153443230288813541880287940859066915763205210708548641176944414442344483827370453800486623574896474317715521007693847769491979549043149389934860292588058888100428936865217794693086764880012e458\"}},\n           {{\"2.8133724660645658150315284729003906250e5\", \"6.7634484407087152105231275811547675402835011482238769531250e-5\", \"1.00084899099059737772913859365556118027581054407285954758329055990529529377511066455820790791091871502993434775634942750452313898053395589443975739777882392931281046995883876066279980856281434476038018812014179817821871586805042023183706725376177160577170143175806815414662475357051404586743878413781\"}},\n           {{\"3.3498352383764867443161072912971576442942023277282714843750e-4\", \"3.208520821056923266745286582590779289603233337402343750e-3\", \"9.74653990782509243550836183201075823369159155519692846798314436930630346572690178245424014813711682670551067058906680367646181984756645025448347553573937829174199564122446362713993201587207768412845129431576839987405545810458778769778400165994012026984577717831659943902405397254874487260228557294263e-1\"}},\n           {{\"1.173650036641017777583329007029533386230468750e2\", \"3.780534896009259959726023225812241435050964355468750e-1\", \"6.05893503437891990856263354837986270829833882333366791751057714437977103925035624856886729661425365010268503431934637684230477655839134293793513971115798026793973457123299079643692631311303731259185411381265912635677151301389868547814580071368806352687212447229499485791883769033890017890187866384697\"}},\n           {{\"6.35473191480731591582298278808593750e5\", \"8.153326462586494471906917169690132141113281250e1\", \"1.39785593586175436998336047723152633390674636830187065022507274459265394076960202352145842758484227495355755965560336623550772098175134115092702375767668586879200691996181864401350579269221993542974245130770033239773182375358583651870979382999043883377805409110023459275245515025837447884289450716490e473\"}},\n           {{\"1.20953010742292040959000587463378906250e5\", \"1.81528620999166889760090271010994911193847656250e-1\", \"8.36836082188852137389175804388074236213762814888145199618983165421342520318145120542719392963440700570926350816427711317556249274733873103430368341047528787950522843632555485443202700694068291761260828423023146529348899979040923182831897371799138328552240635790031739904574931369069808189107688786563\"}},\n           {{\"5.028268644236564069438522039945382857695221900939941406250e-4\", \"1.49148497614115050149963259684682270744815468788146972656250e-5\", \"9.99886724184991506266822294352662914256716265702852450641368490227402118731911016182228523518485801671330942930187800995820804252420406598640376923122551567922827288661396415930336442260706727249870079649992447995120206397679683465259479974096061438201134430443691684817587750638183840953282722156209e-1\"}},\n           {{\"1.7762360570648558178927234330046758259413763880729675292968750e-5\", \"7.16881559843790408872998831668610364431515336036682128906250e-5\", \"9.99216151571584206550599285631558723279674057106881165894202136106399680298454020164284514110193651012658901118782805914666290560642145072003861919887611842296547047036059520963486973019219177746829500434614825844519776793639037139709040279058532565912742721673028532604681375807832044191447365386410e-1\"}},\n           {{\"5.4447075299350728982972213998436927795410156250e1\", \"7.8942499435862384474802203038201753315661335363984107971191406250e-7\", \"1.00000315551756552929413349733123431754994533967419962917545562731445729245526256276165331606875912022797791137395975129631042701829381104269734643785979371368397149024305719491289967486350643357572991392648348784068298353851347894101762457227438358667841811859357203913787202416700523836489423208926\"}},\n           {{\"3.479528655391823122045025229454040527343750e2\", \"1.706470553795544006780993129268608754500746726989746093750e-3\", \"1.01003641035516199003729871729172100472722683758579980406598003587323081240911466133797745466321375213116846128724578817241014105529656120259049841543565831847323023771528373536119517374544673647922841984354734790648175557634969225996223997613913923117328699599574593399806697328078695200917124733876\"}},\n           {{\"4.8968324713172875495281743951636599376797676086425781250e-3\", \"1.965286254903626561628751656662927871366264298558235168457031250e-6\", \"9.99989546369402488423594127072150976413227845609208465040224219805251052465526350038203035493184013561718362361567469358800995276604754108514280603768744650567983276404672018483263585666869718723877857972643772304671740644914409892158811218430582592069739462405196179208350796857344173822141379782399e-1\"}},\n           {{\"1.46846575134083542901741736841358942911028861999511718750e-6\", \"1.13961295777929194628086406737565994262695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.25155431004176641664360564432608271749851863826540763464893400702786658931519008803678187122457752047812131114041410952546777155616546380522319343918668230249104290662019435519965989945104554644065424460926764956490748710036580200886547368376656130754697653950693222962392418484839778727280176131769e-7\"}},\n           {{\"4.922583286355184384319727541878819465637207031250e-1\", \"2.167012857499329633870210898294317303225398063659667968750e-4\", \"9.99846424401823072211356827414998110501335375349159811161820098061831954942111055007312660415928636319873898347702590642507419097876493991759663677610295879480797600223758201686500279349159643821096880668703139199785910150322740521690695804135686666464835791331742866153491003010427701847514162106732e-1\"}},\n           {{\"2.088918420244419849041150882840156555175781250e1\", \"1.3745112355220467925676075537921860814094543457031250e-1\", \"1.51853459491101499462028153198307960464036529321862426769066486207166171296494170498179583135034855145454026518293079000045567402865046530341818676848400774327944796661350087157800975247279219703171839848135584471839442165788564723636737356977396947188532339857132058951624239309379955278406455872013\"}},\n           {{\"6.59693951898326247373915975913405418395996093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"8.5839050428511724441515973182958987308666110038757324218750e-5\", \"1.00016195756688330761491474273615136423552556614577036197755742996689336001512360595235890000441982158893267294826116899101351409093661584157256387065246323209052057870928088601548025462625595893993027794606583868972654751596093207938303600634384394989635869479864226583469214082919105133232859648980\"}},\n           {{\"4.721903022822039201855659484863281250e4\", \"1.3687261479564427624211475631454959511756896972656250e-1\", \"4.36273289377674003549552956596428296006868194528902491172931330043916572933784595495824585583342079403134944318241053700848989680616524963231553615168899405338957973320487490472555612135391925458093520067531657179731576065041675903036737870428047782297012296101361469066116145701281560378942697624754\"}},\n           {{\"4.820349777574789310388703178489322453970089554786682128906250e-5\", \"1.201141639511502318474200912135074759135022759437561035156250e-4\", \"9.98806768192609411674337267672424056960083232464271360229113542018960233572696008296128150338304172594110837781004501757127999427554595909914289685513812993265024374119615672800606621652602006481141937435665444874495693840170640030665928027259502446424921700891997624978473239252852217099622859393453e-1\"}},\n           {{\"9.54197957425642506734675407642498612403869628906250e-1\", \"3.34304142023469919031697372702183201909065246582031250e-4\", \"9.99984326565139803772938990236401058117431661922045573846220380640349699832779123098058540753008622857674232899802697126593866411818203678224123515319186907350469596960547397261912465753250671926347546302198056587430826863955515669743258039245240360599418185587449465990312391796474083173534248199413e-1\"}},\n           {{\"6.409606992637384337285766378045082092285156250e1\", \"1.0081673204983155756053747609257698059082031250e2\", \"1.44157504422123306075307680246115279780269010737951173392922320903011026254261224810748434749033392788723902179648854339741924679540874536758451693815806813776859218948113244848659597589114467756894234559650445795659560796369660440795499707193716216403592941616722628011042403021580672267269382135734e182\"}},\n           {{\"1.22311589009840382402671821182593703269958496093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.1046934915771231197623158948317723115906119346618652343750e-4\", \"1.00004238976442526402787977257335501538186147626008780569692886964327726967250839556988250363044075945205489441982444641281650300897861533023502296756146804366735904879346020295258735438264424281840920414740589412010520817925020516062766522452589181209496869654998063536725728358771467633669371863258\"}},\n           {{\"6.3929111843020800733938813209533691406250e3\", \"1.28391975830675164615968242287635803222656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"7.69505481296349945509651870173004703548467117826619443587513918127052944692060859604078331125022112009253571107992368448403956917792261351644585277417570509975725723863004283151424512684410008159602519982839123505049564570077423370661622862250195728714873045142974264003278199036815752137105673556433e4\"}},\n           {{\"9.8319065323364611685974523425102233886718750e1\", \"4.16849063361153184814611449837684631347656250e2\", \"4.25770980590636267172342833096299211879468172398651157530921609762966193936659345808702337762714296668889853763786019297633422123145533613492472992798929637639386760407400078511978818609469799050619387136981965857651597610392961103496543359101531210986834447630570812748220097342632073167798940478519e830\"}},\n           {{\"5.473175005590576347458409145474433898925781250e1\", \"1.2556940190600926476882648330501979216933250427246093750e-2\", \"1.05154283217149739996322394073132732110285973177101672144476243536792403202554641841303821681674178605013975392578098758039213562899690576014988268448654777051869934823936115258309781471880324840875908371004233345043851515355481534420805940488435409518654838065662552503310797307929345306698760361427\"}},\n           {{\"6.4912383638254911311094019765732809901237487792968750e-2\", \"1.850202617176646691099506369937444105744361877441406250e-2\", \"9.50660946670306311914365279482095005173354041210571854577128244379583503141132158648667793122314902465794942399303782457347308120094047863238127874892080844189140303644281120192942849585627941033052970332875969503978268193734299765207776684899260119431935484734340685682552324678913617232469193989216e-1\"}},\n           {{\"2.2469270547648281062189101753290287888376042246818542480468750e-5\", \"3.52982695718321792810456827282905578613281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"3.90763013958916250310703922628537395346144248614383500040096138375431039104002049367585390738671354254176978486242291556216285278163895739264649656370403930009408842065500683071987767757954595210907449882232438368368764844630512751091553559176805208777768953085505825846870225770460080538105432353809e-17\"}},\n           {{\"1.03776311938838771311566233634948730468750e4\", \"3.67758461032731062689826728728803573176264762878417968750e-3\", \"1.03459301282359622046275858130909175858605738103500377882461906122638713902728757596922241637837677972497613038491667511030599129584893938038824302224512570610802632172627579650514542361582967805126424931338365938119495726516045340017819117717607391845493489250022446019685368890472485823905828290701\"}},\n           {{\"5.444635317520329920171207049861550331115722656250e-2\", \"2.08467925444702359527582302689552307128906250e2\", \"3.09056011709343327076534816446309237286970058275834540830372719698670511928227959632093780315386474610345825780828956917908117330975173563693122316666283875774232598613235043753932040992980072681882395580571647274880789017536786697004043527146342091119566202577901703268215449281872604307112909919335e-264\"}},\n           {{\"4.321410913909301143576158210635185241699218750e1\", \"1.79962553627032728620349644188536331057548522949218750e-2\", \"1.07012654071632775332556853428357456635166481137753650401618414453228087751942869456669180112375507267782856652222749904765639096915852769878278766680206962666525967341796532563009425557062229126958039051450556007688280632610398536337196273409572525834486954342631282999563123455233960154445776600968\"}},\n           {{\"8.8519539520932943865716424625134095549583435058593750e-2\", \"2.3201497260401708899735240265727043151855468750e1\", \"3.71305713463862717236321613646893663926389070764619904563621824742856237889605485601780242185666715109642520925666586793175066523791156636682971412268154170045092095602942426637119803498838588967096817482914325839210531169438704998222940708453881877588305201012231120626503012557840854056737490425114e-25\"}},\n           {{\"5.118003582399178455139554522190792340552434325218200683593750e-5\", \"2.53194625802088957300384208792820572853088378906250e-2\", \"7.78675898815841251401603750577856756795950441245444722873452268896478608982683458941926503132911522781757532432483294128491039729829837206496101278313685758061174666050134299787052246310316361371623036791254936884792176693736621135978412809784428098496835040268753660201880757384305210529998116341854e-1\"}},\n           {{\"2.3274146614903198568291564640730939572677016258239746093750e-4\", \"5.386407398328963954184378515321895974921062588691711425781250e-5\", \"9.99549497162550438458304414161333920701781715268855145062033883882900750111819551249273252859663946257284929221986573479403421187776431235203160677411657816941834327558315579342010850796902138914924928940560282841455433144115320935123004884062392612303227832917659972351800421646517607120651251528968e-1\"}},\n           {{\"2.888209173418870195746421813964843750e5\", \"3.7267907937487687597410968010080978274345397949218750e-3\", \"1.04797427152199505899776613380207153019163891696040089708565511495563600355422445163531206665239877024907641710076156338867860992891601417074486301976244681251883409289427117509266966735400170413169626794460003914944960446253186507533452481416547111722260834345331494363350198444447590272333886931493\"}},\n           {{\"9.1176907448884685436496511101722717285156250e2\", \"6.3428728361785488232271745800971984863281250e2\", \"2.61412399451200792430940441597911814328017657658519351363425803166936981320098511499093754150499459010245435176020174953699548406222107608392288974835149178057255386825625780361600243592099112823611022187187648569904297395013151014275208089987059198137284635106672418842688183845527005332642735224166e1877\"}},\n           {{\"2.99902079785064756833889987319707870483398437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"9.684975926456249788534802469541773461969569325447082519531250e-6\", \"1.00001063692844088210456002419855074011148005470079145471634788112628295771788190807123424233524759763995207569368229563514564551401717941193555837507092120724642714186373549513618453183103215293207086254916107790393722326161402579919794484826396299503609272588338890824693538523484869461094064640920\"}},\n           {{\"7.728544599046511575579643249511718750e5\", \"4.4897834852120803786346137087548413546755909919738769531250e-4\", \"1.00610574384563796400321310101756992783528974702739913146260646865660943239706104030906315422031586966995536370399679280585793557349882649609015460449277306668457058524687099432479479161198093426061867258598346229732606275929747805949435342506588647203249401335413541148238532118555631296171613732580\"}},\n           {{\"9.2977037287730581738287582993507385253906250e1\", \"8.3526187246175812375903468876003898913040757179260253906250e-5\", \"1.00037864179461996490975401602514900577512361928909810135170262283211442500106334885446423595314421485481346967556782507370070595069946883492382064486384013379235733594798086474310298773717536986583185147038897974675666723220012717870637206407697176312759927758943687773764377471241445265488722941855\"}},\n           {{\"1.0859392704197159673640271648764610290527343750e2\", \"2.5420532850914867237235306163256609579548239707946777343750e-4\", \"1.00119232709184950657347355900529943667776581936561333029642844322931651851922987396688070423513516427393233449332830940932893802869470044377136541346608056612546712420915411514501773616973022311857494372432610405714927103499401270099666054931681878021711299630772502630342850129330691538468637467235\"}},\n           {{\"6.089552101270304992794990539550781250e5\", \"3.93997641600216752522101160138845443725585937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"6.18201219777662049133348544929685038145294798461233898669466368271726917449741209374562376908881805268589020897308399041338055306698995074087125055703556791502100679603522120055594862139867723186128435543540272128120797808148788656196331354569711892744404054200303870971480027638854018077003767037387e22\"}},\n           {{\"4.17002058199641822966441395692527294158935546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.276387753247702787221320996913220824353629723191261291503906250e-6\", \"1.00000325050709508111108865304342178215954684414490544574201155545551225580135488259163273316494247157849444894518301320733204512003009459708444645141220074915996395890189435364804366091830247042355490183040883445209891891864651638351487974364904897430627412415757188029347485931227191708441175016047\"}},\n           {{\"7.67550081598081896869234519442670716671273112297058105468750e-5\", \"3.093588605415642511786700197262689471244812011718750e-1\", \"5.33361058888703312937877266409714100834748582910004102998779521040115944440359724219966898465717158230452195981198500825979353396690326287544928081118745655488492150353523103453131904616559184005975246310430624687681784477200062656846973772093687820868635241069192671298954998139357716654945366635020e-2\"}},\n           {{\"9.119288514356249943375587463378906250e5\", \"7.77150273145831363419411275117454351857304573059082031250e-4\", \"1.01072215443565297495212875757828431150173416786594077990011283253611684077171961857977658555772993227256701225998130851047810587496804030395055038866276482446366864045774522304245866613460132889356389785400787106849829332460233953000396006079677394660376277801825929937944079178448460996666434091599\"}},\n           {{\"5.4142012264591812709113582968711853027343750e1\", \"1.8952259288250325680938446204493175173411145806312561035156250e-5\", \"1.00007565289778675652984140979321399062757791371437603651125252179594586538728496280877795475718254343845999376499222253067347916841829323365254311918387151598991472092918535912843066893311920458448486904240767256448921472261918689220109607027673999114234655407258002618927723100761498362332050377153\"}},\n           {{\"8.0087992188598966514234689384466037154197692871093750e-2\", \"9.651251454841747090540593490004539489746093750e1\", \"1.51542106881981491731489464208722559455080283729538316329978070693260585378415308395373558536702307332302792317627310748549719761801156867236663991267318247059438589418271824484275577584765219427298744283723772247523591169183694405713456066811755471408195734266771535080425449850856084868376311119689e-106\"}},\n           {{\"1.09156997362350409730424871668219566345214843750e1\", \"8.10878062686337663933500152779743075370788574218750e-3\", \"1.01957066747628902940966302510092960488528925253540221172663471275503400990771789589916604068584334436432589666410671717466013196522730609847023637947764642131621149159485396625786863911618319465245064605684158683676154002669412578226202367577007287146331656090836085181386754790207143710478024828107\"}},\n           {{\"5.27981737437816178726279758848249912261962890625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"7.41970852096179633861083857482299208641052246093750e-1\", \"3.43686253241293502543031164235680564280493113934425702290586259672655229919415634458697404687915141160074152506872313697917935113169212018685900336128740210227144508079482606408290248099236632255964024354639101204012497824568760884660053718968331056137812934970479251589590682389747704367113989950745\"}},\n           {{\"2.9763242468503051441075513139367103576660156250e1\", \"9.124583619162003742530941963195800781250e2\", \"4.69742603562041824153926447786929280716116286355510132564473072728789802885515779796188477871744149730979853211785348379587523589298115735526488355106077778856284664084128422453984824424076757383964141778964343798745285559893404942252682634909106936299245602255752362338032501973165524906979409622054e1344\"}},\n           {{\"8.1227700762963667511940002441406250e5\", \"4.92673741168140821855558897368609905242919921875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1.30484996489149406381687564563779425178418692009670007244171321324888859123491778857160269626310259110411696125879945417306210294026918965107428093516365217530286177050990880067424193779915234192484015646474192080157981645949288654940510168136275269591421630149209078542082633232345605476593203338075e29\"}},\n           {{\"6.75063843580995381898901541717350482940673828125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1.02748489106749621435632491284195566549897193908691406250e-3\", \"1.00196404947416174365030420006016203648060565955934806957206111637856432455172895201651727892958586584412299635092294986305134023877029915464080887124975616815060819276759381700802994334432976763795102196206567937500407359464356440088544622676160266170981561234435498384331071158546292310523236254753\"}},\n           {{\"3.5017444416405400261282920837402343750e4\", \"7.802827554512200072811545226159068988636136054992675781250e-4\", \"1.00819798888901128629632317940565742032581044787310510298394051237610722547925779466083057852335930819436022531750188258730486171674268778076637531078630844955462136795806889121317307097195981029957098770479755079052235805500969330960373439119072852284817639069793570751583988153638659438922106591664\"}},\n           {{\"1.2656495085348353768495144322514533996582031250e1\", \"1.553526777035119332782617251886847498099086806178092956542968750e-6\", \"1.00000394312365539989563625486331626137964273811834798695005780013495760538177217100805072673596190622159320905648378255454000218262505715454699578920413495174693604468418384665870032433868756106543653906692751058614669494849726609491390952522788637204327400613561970408136313418894648226391505731573\"}},\n           {{\"2.15745882397261681817646206127392360940575599670410156250e-3\", \"2.37905683348865193416088459343882277607917785644531250e-2\", \"8.64117851649613850769514625497977880278916078343037571542452910699608639199334716242087257033679813405503457913766626678856765747940796988239184619492044398845847330875248279377691256718144764352787323595310916665202454075432835782224634142882556904024349917556799442289975480861859420905292552431968e-1\"}},\n           {{\"1.041453721678808896911050396738573908805847167968750e-1\", \"8.37802182325172850596572970971465110778808593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"5.88526852493738132239113873166539203263138672058127955706951262195153797473038707601101237196070886256644090185553908945280688151557324839521372121066434881841798255953853902832020964805296391060444306684398308798244411237112095640393380398474592654522034844007881900667824504043884214270458892007901e-9\"}},\n           {{\"3.07012551115110277066833077697083353996276855468750e-1\", \"2.688791941473964719477862672647461295127868652343750e-1\", \"7.27959056811329343392664000245431816256252125501370190635108304735068414726869009253945094404747463601079257760616120868020903017002340732110943618640264478113302579667971697324950504699622151612181100300886867598913337113652973737056690812163582367071363756081204514554722838161602803979904270771466e-1\"}},\n           {{\"3.8785555274741909670410677790641784667968750e1\", \"3.6812395300311884227539849234744906425476074218750e-2\", \"1.14414942990692656452341784125767590353064260907248467847740571016135049928321189261126610028098851785915087403250818786340815261171401002033061136458109120291157079359913768807250954139969052510045722307049663169894534742927788300920701107994896596920105547258658675585904959114220585301112702429345\"}},\n           {{\"7.2600458186699787233031599953392287716269493103027343750e-3\", \"3.0641341074503714025922818109393119812011718750e-1\", \"2.21086963011262781557962916039162488992600789192717542131434452153601149170623279185807445011140592247466432290015786700658875253434281122713288249913633617033214856219833669907164464033302015146556043425711342744639683355773156696931162767677537366527811567871143970446954952970890842842464186617910e-1\"}},\n           {{\"4.11288422352877880427968193544074892997741699218750e-2\", \"2.51736412939929010690320865251123905181884765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"3.24565288563751822331299972603179488550349468370067144446751898852644002616709216207408151506565589257442807820798232055968358812640290558093447292295273379034573533601586226697268290915360691120466719143962043078879323957769794563236709847407432551615445562560818926972156677354022231138620495943375e-4\"}},\n           {{\"3.834137867264226078987121582031250e5\", \"5.00384576840691153165607829578220844268798828125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"8.70586881100241909365086281828106615321437784717557599878404325717613404517722842063862151116432421295729131945352592123500947115034261116251456345076603582494211858526398683989440066160175940760838173788310914276938532934671434380694237696835717084352874743706871899256563045584501545107582617433574e27\"}},\n           {{\"1.45287638810286156079709662947152537526562809944152832031250e-5\", \"2.12685751933480298196330049442792642366839572787284851074218750e-6\", \"9.99976308406201382296511195677454028213966050559386949061001176100458674306535766658075727649858861936143578824990999294178518894376297296437371242014351633015801209221765213206140971726863151455918302666401442029878834264175629251102478211077868646609228275473662440136138981614575523961652841689231e-1\"}},\n           {{\"1.060607787842173799219835927942767739295959472656250e-1\", \"3.6653855504344872232036500747653917642310261726379394531250e-6\", \"9.99991775850777769594805464682102392095766388724998006545282885743063065509840288039071353911521871815954556155694843177720505424196812072094678443706799908575637539974472545844157811962504294140635183658965312242832638263593804028788156476482121148602286677141129409544764834011834242854688050032534e-1\"}},\n           {{\"5.8808637709003045920819197078799334121868014335632324218750e-5\", \"2.2895041482392727849592972688697045668959617614746093750e-4\", \"9.97772228399557115917897595553123200059617745525398631036747902716221825268917059130877148214691312502174434355597848183024102187672671321353149180399633699090375168044589993636218162674313714376215322688591337150653523844732601246528148296899452660176207080310884559549441104143585753370139662688312e-1\"}},\n           {{\"1.82088437442942030486392468446865677833557128906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.18170819309718790101129681779923430440248921513557434082031250e-6\", \"1.00000130754723378331003328108523077660890480086159377400421770916129060299296337133805493313328717117334983973342138421022906982702012383037259191961910456959250943670084798790257349266900179703918444391347033677458675178576414635996649806132816647233201959427396166295868642002149628537093670669003\"}},\n           {{\"1.81790864213692415773948596324771642684936523437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"4.11112317505943991591266239993274211883544921875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1.16716616089260899158634927691311476940264689424270830038830803482761816779192664467113169986590716888439242048069862364270415910055880132349242712046577768880635878273030333655678293456983297487516817843334720432032181949191565525929129951842591644277698817197191950932369312197425519306770280944742e1\"}},\n           {{\"3.1168221364156203344464302062988281250e5\", \"2.94098588905476396315741283160605235025286674499511718750e-3\", \"1.03790338780611240821364394096187689009151442337723127625883997000112224823851501188946812750320424873330954741819494803462494193607811995436113951374495986635400485180461374008937550605117989616259238001766980179462154007176099462553721961527948038831707776585902099492828100272597482214965326918683\"}},\n           {{\"1.390878641265953438721503232500253943726420402526855468750e-3\", \"3.3010272380812644144043588312342762947082519531250e-1\", \"1.14022877396721831842223346046335424470246823884137406233750859143164782910052273120452909159294424816461360814736670369100321052363875210113861850087708357854957657313512898387152990311841659387594066789695419982631901574195401313785030478101180804642923588217360853722001240454059693137169086797197e-1\"}},\n           {{\"2.70245297975474845853308125676051076879957690834999084472656250e-6\", \"2.27192418381639527069637551903724670410156250e2\", \"8.66297652134236153231549630311782646457435806521553869102045806271290140313907532572617601088189845177879703715370369231877915346831429034626669722739550299919960838955152823532091259662956246982857242736145549200749997723311019597549168518852317671248226020048798842889139150504890040937192852486477e-1266\"}},\n           {{\"1.249171446812304111517732962965965270996093750e2\", \"1.151409165552330193804664304479956626892089843750e1\", \"1.38260599513773427745927397841453042338248242456988517458147773019568704658853879515960004076402277283883489795069346406439823839016514254977654510204974986928186171239215823810556312920621087546486393810430469767985081698483192169492133075210737954383435371131440185644678524564816434215238704654516e24\"}},\n           {{\"3.118362310192143922904506325721740722656250e3\", \"2.07745884054014173791813391289906576275825500488281250e-2\", \"1.18191130436089764539875276066824383600066278177797976268794231640866698789531115667856789828761726794355968881132857750694814866048339710833375629295256557712732385065863487440162509225900966765667937759713986800012768351783498265785505802770202831716066805035224331887004845557896771449008224340669\"}},\n           {{\"1.490792061643138310955691849812865257263183593750e1\", \"9.4237360550309404061408713459968566894531250e2\", \"6.27012834121533023666785182346229437241289754499051958039863912420351581912036946871768101343922573098899177777951053704877386501476998681242293961635818871027535060307630949907397555951449420495765047830618356183657814571149049220337636474144629773918060565875711712572574729922979876342390263324772e1105\"}},\n           {{\"6.6662061859632616494727996858671303925802931189537048339843750e-7\", \"9.21273515382789454086776004260173067450523376464843750e-3\", \"8.7720486288821936974478857366077028717039276900173868840215586570851328800318849625174063894064299296365776744832842535347287057849725364966061157585147600109227112263672943360146015080190661943495120908398140804149413536576847081616293061568452054226035633596561472067627264621732339446631526745150e-1\"}},\n           {{\"1.380789864323115345712267298949882388114929199218750e-1\", \"5.93562727297856326913461089134216308593750e2\", \"4.09060418138444387424424059062331178711979043905828333720448765913252697584689444873629369083510366476460104106313375773568706388071930121668811178870306890980290075045537520987441428335324653171796426529164093528427568372203611999068229147036397950044150945977202609787933363721956655499688121770967e-511\"}},\n           {{\"2.1677105043294141069054603576660156250e3\", \"1.114162712132173898085807373092848138185217976570129394531250e-4\", \"1.00085620226622470905732844417905757963463091991631468675045664887604696934739150514381777470211904644648980514762573227291787791600677422794047913591269830095072415283470532919592193733010388187339828883232881043401853930198928232094973120867346831075681954343729371567448461485192448773328157967492\"}},\n           {{\"8.66129276411148731409928025470890133874490857124328613281250e-5\", \"2.63230476162026535980054120500426506623625755310058593750e-3\", \"9.75677926316087201992937434104172212635183402081845367050961907386982900528845357336855433020027701890844425355924313158894887243517734179729721860852203216211626732274220956786288208809210677612308603888585509873354794360927290410971415768734554863757722931375046183502833124862440220040682623894401e-1\"}},\n           {{\"3.350575803404289660855641663772530591813847422599792480468750e-5\", \"3.16747650803829827736990409903228282928466796875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"6.69762726818915994102636669640248641695258916516178220951615332541358403169898089796085534108216181605452622185779736827460245748311614902401628390881069582094010945399117381574868399439034359201699565625835678615787458358138834274021214751543009200113868243044350923559610553355961511493945076046223e-15\"}},\n           {{\"6.533819307718820648678281770571629749611020088195800781250e-5\", \"5.88128239916411388321648701094090938568115234375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.44239576906295172295161064728901353975092629051590219076800377900713837403284136783431262977433666893756151770251819781412876948522321366628456614260642901179077056688683539196520237460889892611407142177331136348438247424975172992629120895139251739138531630904163246094893508737465346231066931419052e-25\"}},\n           {{\"9.58824111169796669855713844299316406250e4\", \"4.767758882233408712636446580290794372558593750e1\", \"3.29079715270199960942963556473318847100392035825806894633874834481890517355918139252275167622132083673533042352315135079499274198112245747602316235108479674713674202663546893395644195003527204518806401402778881498713093151993690595544754136969841959488665417573929913679381495568123074940059218587082e237\"}},\n           {{\"9.8046254480724974803007576440450066002085804939270019531250e-5\", \"1.9238006181862110643976393475895747542381286621093750e-1\", \"1.69367957215417366534795032414092044927898150798664469523819577887485052498975506353682229088031835479896261249192998498541269057857290594440231095317424708287026045610877468508170913712129807960043309223866462243177903185979844369471346406937023243553333556543631914530281862882346915332974736594434e-1\"}},\n           {{\"4.22715824828159014714401564560830593109130859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1.73237473383745509636355563998222351074218750e2\", \"2.85142181625610748727512967615608623642319089823180852116567338775155480625397140714648406228861247464456116191851444571000366236244452154069748412545940070600491678946250810802096421175871317523376451483012224450957973158915531091130907648484702974041033736125577265886371493322366154555363836169078e108\"}},\n           {{\"6.9664712703758069345383319159736856818199157714843750e-2\", \"3.57526947921747250802582129836082458496093750e2\", \"2.21776552625627356590336877317582904052748969026951170943346144361121751863809186842688158978930311760773848599440472082708351294025960471667864592532594991999006914698692274398613842119283225752843571850040859177332114176284555447226936581391382855150937157990431287391269415649433263516860035782138e-414\"}},\n           {{\"8.870316572117269515729276463389396667480468750e1\", \"1.340709584692019973317655967548489570617675781250e1\", \"1.30679204065692425620221532321916410120280977665891018935099692677903142836365793713310074103183167526509810778546217793360039724544105606790669360053805611269103519872268834740224972933178750433774433912507891375768945267742879488012985036171398185645729556921004734943776799979369402749984084043452e26\"}},\n           {{\"1.38894800193875870772397540520159964216873049736022949218750e-4\", \"8.2883437025022566047027794411405920982360839843750e-1\", \"6.35222056499059860815119534190744388049132560559707635179974362835024292102863415735162094842301916959003527949486946878329851243593307281685479130665725517616797588026104563060365221513904192277451172225341242860418605162130720263571624685346061029050164764398879401328940031001593736913742594656342e-4\"}},\n           {{\"1.09816947397275884975090254336294037784682586789131164550781250e-5\", \"5.58183945899629990446480509724835883389459922909736633300781250e-6\", \"9.99936261439304212269593793274631621066678586897953594510473482514688267255174393243589871913940083113695300948318689338051222055912287552167309726448706279958229666015743107592418824002439360290161725288760084420735569321637244499982204153705684126108823317986930400592132185032791247608619277879575e-1\"}},\n           {{\"2.3109699651686566035380110406549647450447082519531250e-1\", \"8.05549814372709782617221208056434988975524902343750e-1\", \"3.07259003265165794231974650932471010325197411080114721904301457157547097334313567798534807882346741414784333355642286915364891740931795753032224983168581398136163731017251242792429565442336378918505638415347606482959367519064678452374991852143987534832456623394400259546622175052847902597251732867983e-1\"}},\n           {{\"8.496704164419041638289797901961719617247581481933593750e-3\", \"5.06998079666728116224327926886417117202654480934143066406250e-5\", \"9.99758288631873273226282145885741739757443924805027385096536700548341955223394388330738555808413815209906793614975662061712919602993250011794563507497959691981853673962928960543216580974445772540799559436678586781978389593065105455927885069982188267742598791601651598840088278986439446428992363728811e-1\"}},\n           {{\"1.5731138538713305024430155754089355468750e4\", \"3.280717754969959891160960485656516993913101032376289367675781250e-6\", \"1.00003170338187821543987107336746662729109295981087069294808638827112958850528655867141095917778641007871411889107729782401763128246612168904257048743190385169980528080025389670873111442583914650963121405799362630066123464254273948242629742051351814124726982856264616340030151043214382406894418159834\"}},\n           {{\"2.39202138047558889866195386275649070739746093750e1\", \"5.4911818191854854376288130879402160644531250e2\", \"1.27339014094927962826314328575939814304054781018385168289190485168514741352754753149678911930165646861374735328175462043586928267957865268734389479790773849220996848074070389175534751472812216991107745875007249116250242613067032470443930894251972922681126465003519414999032823440924453088711434009253e757\"}},\n           {{\"1.64634850170019781216979026794433593750e4\", \"1.580523129961241765584212259909691056236624717712402343750e-3\", \"1.01546348252503362826107105198333600916123885616351929759095090370675683807853397698537671019348523544289454424258903395372242729481623263158900841743559291226322042608326721672299094222138476822715326186152957264351608036142453170432188932360709929281850323115131827188070509946087921486355921396837\"}},\n           {{\"1.29984771123733180422585298252613483782624825835227966308593750e-5\", \"5.486733068536071497578454625454469351097941398620605468750e-5\", \"9.99382895797564405052408771210317692764125583490813721738650031785719409851796983570805688722349822979681595897622086712994137349075757656980372150545265412692073900115244181782170626388308672797472118433651575906690160786295103594530704832482562910548180219532761382129979082146445301288761331520852e-1\"}},\n           {{\"3.344994107622141221725087234517559409141540527343750e-1\", \"5.7036284170717499364400282502174377441406250e2\", \"5.40485852822901975442109716898610918193900542520961776863305069906497895793489542547982159745108266280524490077140951661552295048439266934614559790866489193897427949324691009938697269495988925070011169411841665487299534902136008055662912091113639828368592572760704050198717640286295766255031666140310e-272\"}},\n           {{\"4.5876926668516091467608930543065071105957031250e1\", \"6.940088848410982599879126553332753246650099754333496093750e-4\", \"1.00265878013514519296809865295705868217393246867225559245606227172893223522667583594724300322356488286875380629025637162385262938162022625886814529504008804417980773476428819488610083450291142913844379562656183905757559036430981251862699509205398028210683848825112302095809741897956564300820095580866\"}},\n           {{\"1.83659034529005538161072763614356517791748046875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"4.28717719818835121259326115250587463378906250e2\", \"1.53726930767980134628351414040002163694004937538301878071492381306637265403593248974390687238745936146996356402451151949754817939176416474547668969917407094657482938942615901000965138448816198787619804034435155352704149778316444976717855180409986287616695020212770570197624985971189801426264668362739e113\"}},\n           {{\"8.6965619711067474297341850508757943316595628857612609863281250e-6\", \"1.5347053247153283339621054892631946131587028503417968750e-2\", \"8.36245700894899388555856775460955394048641742342223378203581109445790321544636857502869379407622931929904915591813410010543421311751441003345169506628319334514393326009523930245673734273160199057057608984977895920935149203153332718973184503752228376603699406900321208889195409621350940486281346111426e-1\"}},\n           {{\"4.77866412699338716230101908877259120345115661621093750e-2\", \"1.16847487332184418740155251725809648633003234863281250e-1\", \"7.00939095440309291336847802488312895385004430053772751642212203497067924870860269568166321148643247526572505972984054880543549485653717067216843154655077419087852705718322510631592242331848706588637404925586365121042986696317386544833327481602868949385627978856713298735650783856235081147982296346628e-1\"}},\n           {{\"1.5496379919649280054727569222450256347656250e3\", \"2.11204960957075971172969275357900187373161315917968750e-2\", \"1.16782897318171377990330689886402903355059628193684114132825684051875757607797689933491076299185969963004000061078683006351157287011440524301691431503915118755080894616168235485089522630543579349054155603272650786560006738889360398191602249883148592535791585897969899944427735543027279681332101510149\"}},\n           {{\"2.4700067947116121649742126464843750e5\", \"1.524990827307894439290869570413633482530713081359863281250e-3\", \"1.01911645804528060285295007365522901933244353571254108413776362642912835636609229733378877024828901273387523484327765744744502840827542422973162779826478327376782490303695679704814420712110588844007646988152318154340574171527693080085147287526207828218450010980129801914952299876654249129807403026665\"}},\n           {{\"3.037235491867054356165955830704206164227798581123352050781250e-5\", \"4.511103232652476435760036110877990722656250e1\", \"1.62158625261315621796784260963880908165199570383258880752909601743905724906716730454255511124675934144867399204404978430279501754463613692043192608111413253272638040513583589571469911855611383025946828382761211165356334768347578605666178294674917101334371471550226399719868797818976469869780054171828e-204\"}},\n           {{\"1.79856395286417303225334762828424572944641113281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1.3205911557676336696770177936421930553478887304663658142089843750e-6\", \"1.00000077517217823836935248077849892691299847903424265238524662417641027601052147271170002075034613200815926835872160958521395863660559755851166354980024967551112970300127247095245969854003499125350435566412954660499861774431261483707515396163088724936940160199016889915664585852452649068941190636190\"}},\n           {{\"4.4135593735414602178934728726744651794433593750e-1\", \"3.4264101814415937496960395947098731994628906250e1\", \"6.74548555036519520791276201322845305843766995125882533366758793048355043544777974793130718057932582612619627280143295972890756755586060864163343519807569602024123450673829021330095007485505005460893008699595178496760510808546265795771516348135206769564722897763853591915237047669941031110007831969575e-13\"}},\n           {{\"5.6917199182992317219031974673271179199218750e2\", \"4.980431025421458990365408681100234389305114746093750e-1\", \"2.35629700595091638395832213480888201727086153567756638562745744247364577078732772888391063571800696941049290536498639573875131887930844892410621248852158649248884548273739508794634953342193256645662324249539648039244590505104994015484168576899587920875428234320711411322714373060714140422162212909132e1\"}},\n           {{\"5.76954356011381364402468285845770878950133919715881347656250e-5\", \"5.2511187291456451475823996588587760925292968750e-1\", \"5.94463304445870155806025859667737584217029774659090091223865132706141204011793568374081383686497430278169952431756767677964164234313821914580067310902314296078439102264644178954457549643252195734243656729528702645014237867821529512634908260975861471735012585206572278726071364924835281322609605715766e-3\"}},\n           {{\"1.0512376808920871428367285749239101733110146597027778625488281250e-6\", \"1.803264129332194443122716620564460754394531250e2\", \"9.01096635654174895730364890004274506998670967372315294988820585742497849923309225303695080415166238118944235696360277258545630995713146996451284285658251097270549397299546887024456736142173128664145649440632706184379221313274424739352233838868194748496986549948050292922466160812395403732938083994855e-1079\"}},\n           {{\"1.281632386074353924243496294366195797920227050781250e-1\", \"1.1652410215525389958202140405774116516113281250e2\", \"1.07879719574926016494490747415323778012199705593394831943581938296777477488312425323506097154699459156568032482136467971947677672762383992541647262353219851774496336332221673599562229050781431336707003943210680119687255794953033119424826346843688505841414943672869216307940977860809662475253945553141e-104\"}},\n           {{\"7.872022514530490298056975007057189941406250e2\", \"6.397605722050214716034588491311296820640563964843750e-2\", \"1.53207555977032989055018208938771579303277505887799197079806149426805566503858217166434829573392590992745607709024458374528640995879305116834709101892580164791296787623750765678369128997876794757719509455355831607218534572758406336319858307548393197701741434159035106328532033366541994641153056109739\"}},\n           {{\"1.854131908725732955645071342587471008300781250e2\", \"5.69406846692120716113549860892817378044128417968750e-1\", \"1.95656735368615067592522859512955039643574891198504549379998394284320814651945584264960315505975008311532240586619468218955713277820799989277348072854744621874725681637220043518336051308494199906438625737004480910828551371454866506648373987268921256736551339157313351536645840751017335445520822528269e1\"}},\n           {{\"3.99959450842199415454558675264706835150718688964843750e-3\", \"2.8670957835011812164793809643015265464782714843750e-1\", \"2.05340685717906270754605609530501932449443307474519553599524954021671059012176997891604734383935653924096296837478833892286774229478680952581431502458132810484806788952807655375243507984165689501659897282979828575230799553474262829100370309746639962529485962944150334131789310986002849666502428526895e-1\"}},\n           {{\"1.84674139572777286713578526189394324319437146186828613281250e-4\", \"2.255716592993170510617062518576858565211296081542968750e-2\", \"8.23722070622293990830799081708429380180065314114356604329745073190591014971022286949735867992102290979570786194665670044964971913376468986554402193499702945966888241927569660743521069322430532256408138686743620372490125687831732257527068587575688326301178711197108267406944507908002982504230542257301e-1\"}},\n           {{\"3.584739111909031635150313377380371093750e4\", \"7.602453022229758516914444044232368469238281250e1\", \"1.78031144785764416938612223102409855040299356306284612439958299013225825622202999580381834230141933121841779061836895061770649393695477680433223418771879979265527918578121214616513115300315506936777567650603403724811526574832706041635294702581230395655527148395841553708668562384577527922279281988840e346\"}},\n           {{\"3.71269374692093090395417220861418172717094421386718750e-2\", \"5.327041985305960299741309671439637440926162526011466979980468750e-7\", \"9.99998245586875139489901271639028340713779059130027015276766418411283294006537627833255021572845938748168207820412482122290518617722205438714506223415635135045747382101925106285222804464701875561904552995223695133038388901912278020591663993121292169965721308487953050363811103359158918910384771899011e-1\"}},\n           {{\"1.70108553436059684038639261416392400860786437988281250e-2\", \"5.1660750468378145586548222389922102593118324875831604003906250e-6\", \"9.99978954129792622644650032269094574319631975777438486754903659150962464082118122945419410503323172656817200054190506282421527117453082829189458035945776425795407971906137471812197621061779135748565507246203908206485915975691199432826508885650310574999400116127525787480206412253878273855862615753183e-1\"}},\n           {{\"2.09225836667166789993643760681152343750e5\", \"6.8566937448334350224676825291680870577692985534667968750e-4\", \"1.00843563284699754528712961596450017035453860350588570410059871012011253379813933654529429045301434484839481489237559065322374683637748571974104032389976926103159187339564349254244671809494052575105796625285810628759847430784136996879048594191371809811836063684074535025913318716848524590469577859424\"}},\n           {{\"1.21714727542868383913798879802925512194633483886718750e-1\", \"7.04024274981674075615800667549137870082631707191467285156250e-5\", \"9.99851738180285989619013743122680620229360476738383672375457223596142024538032582334141363701685216531955627726353087504478019029760906182307020379318817894422274668875967247480704625723584657033632048027924110460864147683431850155444025526123837240535234902995892523890236573378473187948012001689440e-1\"}},\n           {{\"5.077368207710659725115376339488193480065092444419860839843750e-5\", \"3.97089812664133678943301219987915828824043273925781250e-3\", \"9.61496103531524292145269969904333508188364139708137329208759077302004651060803860997069231846146525416244529356233531058823752839075298907756560474430217361656059248345442657322781131236619023757967452575027788503647455091630937116588678330308533380860226144011143233073363114955647590755520397783133e-1\"}},\n           {{\"1.05107095024027863416904438054189085960388183593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.03411347779367872590228216722607612609863281250e1\", \"2.75435618440696236423847758785039217191601787351549036022831398969378880644344551767328463505949691251600586393797511528994909897140379260738080763330267660481025359227717949542759648019166102411005065795694130304853332521480946507674204615568889856249883941530835820527992056685661760535222848429821\"}},\n           {{\"6.049918012597592072501773152737314376281574368476867675781250e-5\", \"8.188377133726698957616463303565979003906250e2\", \"8.65759593884760895858132938458504295554865358684199156580525629386190771627069601339728387260476959873950047671147626130674714736942807728977752816985626622779230687686049014608462755984076183185977629942323400832151270339085974963175219245006492664764899739861651980200882059489983917901390447959952e-3455\"}},\n           {{\"6.5174474814096265617990866303443908691406250e2\", \"5.077102163366880004926814939913981561403488740324974060058593750e-7\", \"1.00000328979143507415685697811442096253363291297955720636385496027164054688294193762566482130745852122932064218776073663482596744861678935376393042841878114830402198126626873661961854660156517253426476105318520395463096676472118157780746408448524800033381676594338617857965937768629354079942055143731\"}},\n           {{\"4.6388449163862754964782197930617257952690124511718750e-3\", \"1.588924357889719374270498519763350486755371093750e1\", \"8.33715260820791317269987064747412391800309849955602033217225409481400578667858265909262657939940738177907804353137088637745857746470695800199690029742037073210058760217313184489359114691758908649867287570270285365266943814797806817843515342646282514312200010453327035336204860831498248439822619093280e-38\"}},\n           {{\"1.4905828579579060615481478357935429812641814351081848144531250e-5\", \"1.7031751825887083903743324242441303795203566551208496093750e-4\", \"9.98108922622050827087546461298822670842973092479525322691759952475540660272868395330655428828449033553950251437644999243615808527145214868010990354809843842150796169597464947831412602935689456012651060606674408759590837715937317107067113406559618224088301687347090716482594166112826991011166298362788e-1\"}},\n           {{\"7.50315265219419380571252986555919051170349121093750e-1\", \"6.0622251774968738402549206512048840522766113281250e-1\", \"8.40175419689520964937445314051307565108961445693694723005043311860973648366068520257018285775532813235354539177271941463790001972938524250513944002301467776271129144936307452041012641877576914077850978415809262774052418002232753061586235460151777159128199018488311311211799819289180487350061980646390e-1\"}},\n           {{\"4.268470367888721342733426844517907738918438553810119628906250e-5\", \"3.258430440221719658457424917408218334458069875836372375488281250e-6\", \"9.99967215285852515192073395540137950482554540502668958238310575910483321879481952698928091493628164541705483350832773369892703138436296385686888980010809861693571807457349075609182274750398269557656870778473684116326560067055000556274923680535552295628380182973673412404308833575096574012516864815095e-1\"}},\n           {{\"2.62667296496937296979012899100780487060546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"6.98943432793326180699211569447015790501609444618225097656250e-7\", \"1.00000067498249093796554190906335150484537007905333805853084798522029363004660855846859261868482180160316566139837296027351379815963628562093199672797915615284584800543052123602981811247334355647141931097257473080865200634384690696676990980451941954802180365065774462909125574737179287520936788897430\"}},\n           {{\"6.70966669446914210084287333302199840545654296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"9.1631038456329054128768341058730584336444735527038574218750e-6\", \"1.00001744257181843369125556914164986065767377720999640888705793438430385027106235014113094055738186706162642114104415940235112867181288621050157885040444050793876376258047873939583048138039901310315757778797936384132441774545886210926930901727852204521859059543099653693673834002390277355781829097039\"}},\n           {{\"7.41203371899830177426338195800781250e5\", \"1.080452434978750069676303735555222829134436324238777160644531250e-6\", \"1.00001460353450390109753320201848917579634289514937879484407258848004890744776169944597998175250117503923620359242409184317540187082543653993640048666001395047165769964336795615132413269257911431079896523695358479509374941248440346987424514128254145411471716437568325046246372300034330801593929796699\"}},\n           {{\"1.6915925563799362407735316082835197448730468750e1\", \"6.180263869277183297334943290479714050889015197753906250e-3\", \"1.01763302348245649415440222014057755125288511751974439494118531238495212343084716356590900135150471489029857630623786718849006602487868725615880115082270216521029606377055101314827010471252021762724425333126829904634616800319752383603387644619737656819562990847546393907303039685961266007323499371276\"}},\n           {{\"4.71460529249768889314964326331391930580139160156250e-1\", \"3.65188827816496541345259174704551696777343750e2\", \"5.57039862156640741370099717884062397571736028728524050580037613318788846117662035095375103738860527021001943141141148597120492387251375648252287053831107964249223144395667696166786054472499439767489130687268705183565392558321079668035341534647161063188715235627145576677691259556611945549071489064974e-120\"}},\n           {{\"6.649823635178329084283177508041262626647949218750e-1\", \"2.0412485989929366955730749566555459750816226005554199218750e-4\", \"9.99916721594674747376600569188805403610749202879145587384797447934876298553391460440217614450811626491475153827239769211949770987067539929764774811195211928780393852025574440532735397207179531706592529705918782911567387089221968997852275611755107175151890770337885129722749288992344581262036121822096e-1\"}},\n           {{\"1.1689344174400408519431948661804199218750e4\", \"8.15678606859390242789231706410646438598632812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1.51388885705521092082676462955313303770964042418254877907252507964234420916080103781270109330079123766686738994000772870583969928581773756873588657991143050640555136731739608625215812170605441235916882843841833089297543893622016574335981753027769495373907938555110085958780955474425308783814139862813e33\"}},\n           {{\"9.764006258263712920153487573315942427143454551696777343750e-4\", \"1.864429866329895268961536203278228640556335449218750e-1\", \"2.74623224798347601232565592691979711045580692330641567994756260200814740060669606546590062265074708542429821154943403107394779336685935160305728814542562226163058396994725320974264154815235226634053969860486205541938719842224052325659161610602552591765080618174794519808159266445853952938084827117419e-1\"}},\n           {{\"1.87868482843651634084380930289626121520996093750e1\", \"7.1692987273281232774024829268455505371093750e1\", \"2.12028119371494031430335044645564708556145176065304647173808454044697019950167941050283479818252925468559303066000892193796628006878431527857608384081735638513924751307741786259324802053021768713537078672257166368405154064404708746524318561350343547073960189134086007775921344634528456932868446419630e91\"}},\n           {{\"6.1095693489192053675651550292968750e4\", \"8.61245994668030334651120938360691070556640625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1.657007928541288294811583817545569607832014464676038743964777536498999871997260503817641545878415793384542051422692777345680017433348671458013853303440317187339805594208064853234977344701458031672246519856148886015816160733326713509830759728307312465258659896898040851868954253501173778760212364320e41\"}},\n           {{\"5.12940713132187653400251292623579502105712890625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.285644350198942550142847118799238614883506670594215393066406250e-6\", \"1.00000373701282973747520930655159796229096921541589463952802693848825441766023480118817224366828254246104620872707491850843628745742807472462411859435943238658855518813616022964453910564185237673973654468864102738810104394810487407665604967406614750596030541491730666890517480494969397423025082726828\"}},\n           {{\"5.9691952797515383295377452976815391139098210260272026062011718750e-7\", \"1.5718058210615070579467891787039945938886376097798347473144531250e-6\", \"9.99977473944483761872828387581066184030968843746303338716635967128051482967926885604187120298468309076374477372898167140591203610593108721399453839682426096478159671434202750765691646383078954275710747248498138805135910075991839124150638583040898450493059066421550145802666193053679045930003027645237e-1\"}},\n           {{\"3.686062142486083992309886525617912411689758300781250e-1\", \"1.49260037966346908013329231046384393266635015606880187988281250e-5\", \"9.9998510356549311348447592218399988108920778960674235069856751667182339392598123994325942355644458229974167672565122670312318271933327236417417637712072186685889850127900657063502042279027378895935315299539289874632736786085798675859434221092674392826093829832333880551302119483318252762377651960870e-1\"}},\n           {{\"2.75108139709647048221086151897907257080078125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"4.503704308271892386983381584286689758300781250e1\", \"6.22207684654158090072166193557643641149481975652647701708530399277363664695064351610680468504557225898194931419933867113331640493326162327026706800979963281990313857552256767561246682453632232432467037080629483164984556210425989798928121976072588554960434306958147259366170108308967342505596481568498e19\"}},\n           {{\"1.811624556732920154900057241320610046386718750e1\", \"2.552600004410090513530875999670399778551654890179634094238281250e-6\", \"1.00000739442221122260724005033635770725844741914207974197964181739354726511926916714698090584379202017604302885037125163720681613028683344989131816590462063741786918631523895090976438946284620031268598318287495015673164204411596879025777677083658398098322196424671094954029116891354161564494388093193\"}},\n           {{\"8.96493500879970817152297968277707695960998535156250e-1\", \"8.5687515754119067423744127154350280761718750e2\", \"2.18186472758714615747935532618938695169587522725634994323764763361322541875338494379271005378981383706775962465651100098009942121578720737172235160080858098630748438403135919432305006360154000115695658966205609995229485314131439314904570801339124033312271333615588491334684665719513845178970476180503e-41\"}},\n           {{\"1.2661287980897948171610245537976879859343171119689941406250e-4\", \"4.90879340262861951771355961682274937629699707031250e-3\", \"9.56902896481771879143877379682638527882901861190229819789042792546979238367054331337767498254741605069110970147845996240165269976456347023401814558426675219095881612725781553874494895757386564444732770552998856125193687086542254594118439921159929235553297916239134941949770234940282427408194492643353e-1\"}},\n           {{\"1.051797461093969659464905652690447368513559922575950622558593750e-6\", \"6.5937410071820754323135282959356118226423859596252441406250e-5\", \"9.99092782662380324729163640655313848714756101648128347661760755472309885143398472302956067855710190800993042892779094559399021527010697359107101541167758299014549008387517426503427862359734988159027154498990787998696863714462719474369182220777439814743092111459144669908819231194636468040015004769487e-1\"}},\n           {{\"2.26677931802150922635519236791878938674926757812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"5.01284500605095928449372877366840839385986328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"6.04799524981909743425238268974274974124170089470250115095198088233403741098790024678291238778471336000887693628348108623078030852501843027636021269414992355439834109447548416843301419510567977485938290387496561912410461657784176868621026947292962832450377901755820567805673466030070278228671530695195e1\"}},\n           {{\"1.47645383833588006439185846829786896705627441406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"8.3477044596248651942005380988121032714843750e2\", \"1.81864953170833366001029957686457080479745389229343183507996187270256012032168347753440691289295163599099444007484206082939466510290612710007371495952373847856242772883552123786185299979765598455416935895627334117098932505280856391911876837712397381549095944110724452719067485663398985307194410072346e141\"}},\n           {{\"6.8369046056257509746956202434375882148742675781250e-1\", \"3.83530767198103986204138493576465407386422157287597656250e-3\", \"9.98542687144721504190991783229244229904437024428948393594123834827455412276977464755147963505927618995184986289919531376928027005710396398910486083058794955925781790662773364003988254537015097017811287414007455159323257827799204950099119284414629154584347927772687791013118617040392415483793228615528e-1\"}},\n           {{\"1.002053539055872133367586229724111035466194152832031250e-3\", \"4.21472319667746432969579473137855529785156250e2\", \"9.08953646324319429602818744612054042909432561532126770140572825180403651664408870454180981154606920328617475099247353850589948028434533205453640961164641456021776839621300753911422835934782850338468313312210488559936609343534193099022841479411388023651172446221865345603921529386692401675022261632417e-1265\"}},\n           {{\"5.1523280283123824574431637302041053771972656250e1\", \"3.605102571810556155718074933247407898306846618652343750e-3\", \"1.01431289853951002532506377614168990948051280337886607436878494527645645147723859636940385995419356184615086203041458176935646525562258868511947236909026624331932959131571326296466151873473074426347666272446566573176007728397599624815497760954111152173140369195400219514948443921717606923360226206339\"}},\n           {{\"1.50327863210486480966210365295410156250e5\", \"3.2592870520402448164531961083412170410156250e2\", \"2.21705224525603686559675227491858310594380597690754424568785114801297385692314088399732454361300955075549296567427255869777962816305497530312793581969492733775461667703068826501146498955373099052386164214730524062952781381010426318671419140310052915928431939434595652675036589780009141539593357125642e1687\"}},\n           {{\"2.5210395048109605952227352254624292982043698430061340332031250e-5\", \"3.0457256960016615724914923468702454556478187441825866699218750e-5\", \"9.99677562816744661723525153627124442052964231793875730324917063167910023632186323828596851920875156111103787347156093646859907405739307639598484356543171131155872282222202848608366838457688692164646235280817749009555765844448651859985081286265963272205351701235959915053427147246220456364075290757788e-1\"}},\n           {{\"6.69572868673203203115917858667671680450439453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"6.1676327121801987523122545731268928648205474019050598144531250e-6\", \"1.00001172763619213033390863469162514923787137097731257478379858496528955583730797624990721270466292542630978166836841730894536953419182253636303821927335171827673847960943549331513055995583023583227615832251837950408037083523512010882821232754743304332778547391577736073428707081283889265580574098969\"}},\n           {{\"3.90611154895943855080986395478248596191406250e2\", \"2.09392819734250876240189143118186620995402336120605468750e-3\", \"1.01257436238989364436740053785780748984877719711041249303794530677616720891994615335093220833940115128861191606642103642393403535957041953141054150817528925853538686389534782202437853737346681413564667163289005149907512827692491679645604032151505662903966426036149340526908388743360309704155643902314\"}},\n           {{\"1.857389689084788551554083824157714843750e4\", \"7.3490044908232137962911245665509341051802039146423339843750e-6\", \"1.00007223974053029723271350039259412141636069806425386754509098025549121050837680692710943206684686658573776447604596802766176331791002163659401284496154417281082333498905606330772551902793976098371405853098920109852460783688567109865594724989116482969799710457089092798143235841330467446343910216945\"}},\n           {{\"1.7607061517663445556536316871643066406250e4\", \"4.74889370868937987779645482078194618225097656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1.45316765019878240189602403680427223818770335223288608146347951094991305163036799974448576646914163732716464031107846083674367407256925355345653200850687798959392811940414372053909694215614805160729642095127896071955737496902022738055554549005006428357198315347861922794020063710653902271293794797134e20\"}},\n           {{\"8.59257176966675461152189718916361016454175114631652832031250e-5\", \"9.236406780605612709678098326548933982849121093750e-1\", \"1.75626791055079856222412335079669380796397627500002019826921615591957724636638189051537678939438100683331885757581588353701345439775420172078880839292692181866988352748585676000159933320197094086021294353349620582341779917757035411891306338495037492064154895428084541796948375617939605049956389592963e-4\"}},\n           {{\"1.1837336674405312878085791417070993247762089595198631286621093750e-6\", \"1.6732627760162928912601384978664498248690506443381309509277343750e-6\", \"9.99977165516365318634154013098062676051482936340600676508115018286371174310194281664961388300484701624347701999911368618575116158865905431420415090042447533719781066713262060337264603666364847020671540664275635449461141562032657119830142469510330575908700332922190579477083626027776803818572001718803e-1\"}},\n           {{\"2.7929704683754344451962481343798572197556495666503906250e-3\", \"2.9713508936206637842114552938710403395816683769226074218750e-4\", \"9.98254178388410952430693242810343707992963411946313883778028696826023938537768767830025754426281554000607392763511414140886618834915773502093937010404359418681811029932841236322654028803608283276794373781000755359892344545988755782370138251235941283542297935477464591913844965660089628462450619495872e-1\"}},\n           {{\"3.38113855762533148663351312279701232910156250e1\", \"3.093016660149662663478742352651806868379935622215270996093750e-5\", \"1.00010890478594524709067739908022368917088132812449962876399165997211946438304504899291487317819472340328330375585022333633583894340550549675803507677712058170618442005704437605073252304959372965881786681685588681179433355904579852317919540925268445449423495866437480095339165546614783853750408452453\"}},\n           {{\"2.06425930083115716229258396197110414505004882812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"6.22320068732874709382940636714920401573181152343750e-1\", \"1.56994381329744106645164401249639056164129850194015191524774235721349310749300345652229762055800940290782810800288250321003967654939060262541583665184611869025848444849240326580936044484294913651408991979990620894378054306407392449503735235963890733618686812461995281192108663576402590588669671991241\"}},\n           {{\"1.340876954053071834493948699673637747764587402343750e-1\", \"1.4827341861663803634918679108523065224289894104003906250e-3\", \"9.97025233069613645577452155667707700431529405119046003459330154763708616924139333978711947517286910376855122315920165412886432318792826535847675162918439845483335638190760733366507881163660357422897573743052858674336878106847554903297760383077263299654131223242076136517464708165444087161451001347315e-1\"}},\n           {{\"1.1379582983750003677414497360587120056152343750e2\", \"2.035002012363793124196179040730214637733297422528266906738281250e-6\", \"1.00000963457189792748049744783509653303667431326364869818483704842948351380610875652979437988682746278703117572921123081696661945181740330111308085604188704279357002138744426600265673193487995475006875655840336689027158444662492494587307695412667171074545903613666004574014189607190377465209019809696\"}},\n           {{\"1.4373394351522417568614575777985464810626581311225891113281250e-5\", \"2.32214836393443135875713778659701347351074218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"5.69028929542482647910462333162857910188985784876407542387662931701295222184216133407420608557785163630976401541135533394749225188544894532723554319205860877128881077879568220494222775086397987960274421371074192662130785663013334009285908262792624635778476059436229937151198221859566242280319019160525e-12\"}},\n           {{\"1.4004427278933599154697731137275695800781250e2\", \"3.53744104780148727051880541694117709994316101074218750e-3\", \"1.01763558978681810389405573088195138451898513946030420888756116873548356901540068272802595421797514887115185086583712361722645481445016465906573909064890341678510048829617311165144452645678278211232399208153808746476971992206798944801345917584439323122735213774632862994806449009371980892407850308879\"}},\n           {{\"3.3377061563606758021194309549173340201377868652343750e-2\", \"5.1634069105928119824966415762901306152343750e1\", \"5.74932879103617263287699269441230578657539752277509100498121992886363492927534654879230172186557771810338441534937330485904491247273189306610489852019997049552119104082607943340924820476508529648819831797793990936006114678588935819382061714015089476930073162215255275726210879447826384500950556498380e-77\"}},\n           {{\"4.28996264268685627030208706855773925781250e3\", \"5.5584348273515146732215441716107307001948356628417968750e-3\", \"1.04758858160148749573207693865097611258682532053580644741708378607626299571741454781489071163331961478583318303704887429698138745438016282037356465726871543404600493318018423949357845164509841052287336032095968547544265578409278441961772371247405527391823186341452132702680834735192488255543508774968\"}},\n           {{\"1.2811034459606310265122885994060197845101356506347656250e-2\", \"3.43418931353877687762121695413952693343162536621093750e-2\", \"8.61015280162581259611603041281312219714750672075712379519625520748837900282815093599469657102449329452585522609992906027038154076071639645146113938200595344162570525215006263974571317023675884323716943933613404725430584249433688012398115002318410911938391274174242791011414117839535968615208469771466e-1\"}},\n           {{\"5.1667251794698457190158080720721045508980751037597656250e-3\", \"1.8038118503281862947023109211563962617219658568501472473144531250e-6\", \"9.99990502044552423124036840709042864832582112050272720529614683113869481837430803897286965523406403026476324601866776220157395635334324411401951420003880457537783083750584239021034205680737146324172685990190142433894632845319189846259349630351570776916287281796804645673831673367339618359511691534945e-1\"}},\n           {{\"1.27899907316783210262656211853027343750e5\", \"5.2253602409032748332684548131510382518172264099121093750e-4\", \"1.00616341899333551359328361392752162344577264467244472586370749414301840554961173829121346442368844768868155278219296270614015234651325697529392935793355916715136924941286676982861345063267744784667777743656327428634674404454023683239192093835032100591051537658643852513812450455406749057692109035777\"}},\n           {{\"7.11730850188353797420859336853027343750e4\", \"9.60788079495505627572460305430013249861076474189758300781250e-5\", \"1.00107405241322382059953913596876333435454811871669131165966566428674069591664017854016649566117750922070455790150785398980453750449040916943909541516125417685189264145037334413362116738563574347465747605135946915752491452923545893529316360034715492483804067411471432361687478500733144787639791290510\"}},\n           {{\"7.253438265676650189561769366264343261718750e2\", \"3.29954091776851328177144750952720642089843750e2\", \"7.04970290589109038711395049954355776776342381310886782453562200726034000844667284742622588171082170563883520775218082400856123793786048177341878726458251943347876583569178437736653743701492064380769184875657546923031668880530296652280260428229230807500261114316496980898463695380987245993698126306466e943\"}},\n           {{\"1.05425305597257192857796326279640197753906250e1\", \"9.4121156168923067464326948083908064290881156921386718750e-4\", \"1.00221940552517387456904940935153668768677803438018028587024892341085297549561710698873774378670329922261139925263482590967131460066291169951663366614190003024630959832086281000186573153943388176622129526851339850140935108594752581778544126368342198113455082270613501744317697800189856112116044092035\"}},\n           {{\"2.06616686835977376654471804329205042449757456779479980468750e-4\", \"1.69516133890853029630996218202199088409543037414550781250e-3\", \"9.85720096393058346372084885893839606320554663169456270644249004310463500725457211657627998908535169742871675934174757999843761965159654941281377745862394591058408452525449223020548106433276286869407305925521861569746775217097838170535894284575048909646530082294345563168457886536304399266956794807072e-1\"}},\n           {{\"3.64402451110348510332492821817140793427824974060058593750e-4\", \"3.20455824353290882888778412507235771045088768005371093750e-3\", \"9.74947852438644348963594070779458486239729374924703758041706549021145269914102751629698949629550481353884433142728878758835488685283460683679637491539837448325034596988851330419929610091798061933767303224300754233414005420110971299300889653323675957445130038468323617573447274322484402694978713617040e-1\"}},\n           {{\"9.2924091843635910401401692415568334126874106004834175109863281250e-7\", \"1.10041539819032330171921785222366452217102050781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.30375096076042540689175588676000039497925847630595558133397707131285132566953633275113891277016515974090275087097707081223643727147456085023753621384884096242056199349318008502416132788061805089253485591443085259511013177192516510953942353610198267062490629651968866334656113567343023162640866499116e-7\"}},\n           {{\"4.70374294317859518955657338601383798959432169795036315917968750e-6\", \"1.29316103610866321105277165770530700683593750e2\", \"1.15122965827666394521150958097124834553922749706241413675626621322918765539817839286128014659593143570942315119838489669350005299860384297452971974330427527438060831168176929743817135707477251203472467806027668891154074309800997369457141925072379579611854152032663703570089179850821080592817602489379e-689\"}},\n           {{\"7.90111168678090834346927628928369813365861773490905761718750e-6\", \"2.50142935632569063386654306668788194656372070312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1.72554973148662694166759157160166169303284736393781157514352684466477860400705537599392645875431865905681445772161441577785663278326674184262006684080907675404076284363331862467589217294540329968481020258307213288969704999028809892457240851077890832023610976308448700744934847296072460694151132193050e-13\"}},\n           {{\"2.1947022453851494638854546792572364211082458496093750e-3\", \"4.5540294660816549310311529552564024925231933593750e-1\", \"6.15537644035230762511257501642891052274838428807882763659106583075479589103986905326616108567723817554261320425463998387402938492727716723367633134645452074625478383896044161060182209094299460842378984988424538062120485203568234956869861031978112571715328186447068917826940102237728367749115256994036e-2\"}},\n           {{\"9.5937575276791223601383085117788596107857301831245422363281250e-7\", \"4.7060044781868145946646109223365783691406250e2\", \"8.34074971005352694977724271428304704379730503069979006543824421982543154474277701862893673330086806692863058917258547615336829675716810145864841475235135109391399496144355613620559781473891279309689200469472005874869702401500915898827498117462493418903426151104912981808366378491461635507492430973906e-2833\"}},\n           {{\"2.2073016502121220128174172714352607727050781250e1\", \"1.0681513883705921275427130900936845137039199471473693847656250e-5\", \"1.00003305295163452281794976529673484400203041012190269638476184821369788032078572490628055955783906515975070132315405678121749687518303529356301281556543290455691541229667405975677836660331331546866945589821129205572181796808319706436826468956587053252695087454167269382499127173288396374118362076812\"}},\n           {{\"1.857807898420785932103171944618225097656250e3\", \"1.30823413709633314283564686775207519531250e2\", \"4.59033859659617126254628613087390514142443448071790104857905386498498208916927300817260750485505223182216712213534955208892328370772179606978553650153083374335774046910050899642665243305280141884413167811281876091816572586748238812963621916941228650345907682195313189327181720960131248296641667634950e427\"}},\n           {{\"1.28002693604745983830747735332522552198497578501701354980468750e-5\", \"8.28203848010336862728308915393427014350891113281250e-1\", \"8.86706798756547273034023259748332998697114154360428093064398895642136945343512222443801509462788398508116083101485126653725181025691107909977090006260480711914768000641955268595050193784354949171562687163857371073429271907026305099383798868693635018067191669439164014101281294813574568021616736489720e-5\"}},\n           {{\"2.0022337970233214377024921759584685787558555603027343750e-3\", \"3.62365481395694466471013583941385149955749511718750e-1\", \"1.0523546079739996170682601256693200584550474946824826454017096763153491367530797919426756788342306442393933513442225888083878538329106122737524305933086973617593454993892855732284108545200057872375959005456512921309099752780291866382542273850296660218802026761451051971279229272132557960744013745380e-1\"}},\n           {{\"1.469752780871477591687415675814065707527333870530128479003906250e-6\", \"5.86458989513311337860024252677249023690819740295410156250e-4\", \"9.92154549068701501199366439766982295808371482320630816324433379463381296202639580495789257638722760912167367897485745357403740992265341544963450873213458100774396760614353635868165234585261876587876465994053070011062897736386668244554072898747895651881702386350638799402464850863950102149208151366166e-1\"}},\n           {{\"1.69869769328567166155607992550358176231384277343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1.0945166435334793483824533666393108433112502098083496093750e-4\", \"1.00005799594795372584357977768556944656253178249587480331145989344864034282666379944361611058467140259982713730781408566683105999320504528967383185252941819780496432948156779669264240460517640856647134097150209519411486934323027426354907715934579141058953345456267906766103552413735697517517849566921\"}},\n           {{\"3.151839759293328825151547789573669433593750e3\", \"1.023840290841496539209209970522351795807480812072753906250e-3\", \"1.00828189958217090945616829239889322422890752450091752768664294850744665096849748731214361917701488824218313674215416049035608435896320044761285630475680013499593324921963112908846599652343142683769107300940314664453753090942709855630290654440762603604322610449245678270429752911593206005276375357381\"}},\n           {{\"3.55087476619042874403930909465998411178588867187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"7.9895693178775673004565760493278503417968750e1\", \"9.32018908151418417859876732852718049962350652342105850490583184901223805273843023839695354873994074279947349253543933474250055215956442663452932535132575000870445343325403706967004656960749057879238157659107219147411710899538754744145348815414311088777452109665676822468399972746650501593917415911950e43\"}},\n           {{\"1.267754887968159891897812485694885253906250e3\", \"1.00502285798295979898919760842090909136459231376647949218750e-4\", \"1.00071834700218288240776940900136375146363527699090847426981092022769405513480212911323057036382071349683106853880233005923304991341200308955960878969600681793506999384869035120625501911973134511693383019876699301926591009688967553141397068289179934328294897849913598948019612426308123680588484240861\"}},\n           {{\"8.1522004810576163436053320765495300292968750e2\", \"5.7502531130550421992198018017461436102166771888732910156250e-5\", \"1.00038554010810039170759525901230037332621377704113376782308969416671995519944631372963790226541075839243378526551356024850278824940678165140037685990966568856425831851096416371162933528342527414028064433797747326021549595783932074419350022816349807211737168691836224208314746714465025589975731455428\"}},\n           {{\"2.65027968976974648285249713808298110961914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1.003165491246268459235579939559102058410644531250e1\", \"1.76325996094662828651112161237788953415887952374670102134300653855113287125254830377423982732034899162480399742930099350206403828614662703257591959653574878666923823464038672614887656376458325931158457664475267311806542914278433869759036943522883194636568041344283954333960707999807543121267715345128e4\"}},\n           {{\"3.651827512952488177688792347908020019531250e3\", \"1.675564512656399074330693110823631286621093750e1\", \"4.92218138915478317609234268428449378609898504811886050861657038624663939529613919692032879990877291035109701590929770282532279774612429349026418707716959296859399988519535881353467118924067126621065164445440389423581971051504964356883522778929468170495170856030672143818408689238481847643503940756672e59\"}},\n           {{\"3.0606423484740545451834869972174146823817864060401916503906250e-6\", \"2.20328027949478477687250688177300617098808288574218750e-2\", \"7.55974238261708442675674596584944622380379860666888634356645875331625278958028151760326676909826129760886331850336797218123658397234427228603106790759796963957806080469839015421053939928057033567772138680185158581228274260396763090865346625773393191666291620910582819221973998350912562080963747333068e-1\"}},\n           {{\"2.04040793254407122731208801269531250e5\", \"2.86284726793166655056666058953851461410522460937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1.58821325525680163465105847555152044190569200388116750112228338962598195492329497459385020613020256287552717930952139248724578086838832538138376726496296560875204247514233017557960719338882649967806582509446295835645176351140001109236587197833843059204085625918013701386357232953416141714287393580849e15\"}},\n           {{\"3.02716069476693064643768593668937683105468750e2\", \"6.040399597266724041055852012505056336522102355957031250e-3\", \"1.03510986044313446578771317219744132510998690381352607017246273580247626695630046904160285453167383058665284858123740052884532347981837364373948718495188424769656549948930405672217230120189497151355681193015659186537151773454794215525893522934864014682466868462268390720016762737891468184834184088104\"}},\n           {{\"4.4755257017978976818994851782917976379394531250e1\", \"4.42494522046174552087904885411262512207031250e1\", \"1.11929646387532568976168597828914488086907276576025509760458985730962224619833220482536328707584889009590311478709195034015122056954215000823555978179815671349373291996702460104546989380293121918158085134301955237814810326108959984625471199876172816491246653847194071812034535823558646590118729075911e73\"}},\n           {{\"7.8992094491693660529563203454017639160156250e2\", \"1.043723953933383654657518491148948669433593750e2\", \"2.67759107384668464385278885844815795751161179367906982405379998416580527424480738041217566954239691080320039512890036456504748798096287871747642118148076943027438116523332662829876900574449886819108021138850402281937549768122792675121441618853423616832699349260369305453263152392638804725787763327554e302\"}},\n           {{\"2.548011737897549686127085522002744255587458610534667968750e-4\", \"5.159276612773364134589826335286488756537437438964843750e-3\", \"9.58205367007949169809279999461100360912902896399937272021332641770690450812544971532999275755132753113048328902348279538087441845456071781043743985319802898282971020600433571724744632298362925010469603804610543751544460798372376992115798540860563907814359172789945116001784572399034814979737998689779e-1\"}},\n           {{\"1.899287505000893725082278251647949218750e4\", \"5.41078495521190028227920265635475516319274902343750e-1\", \"2.06563424507714690167714042623337538555278963530996591844954713364193688715643758076458567982650781640747670966188519005031306885869355129425908043628325745338231076914378682618756362764508582923824741998110533664940173863055464267380496758389944654061554957122449256611900453680459384297799878623896e2\"}},\n           {{\"2.910204774159799723243224889301927760243415832519531250e-2\", \"3.10728022839575198851824744394889421528205275535583496093750e-5\", \"9.99890103192413085441074667861315652249320196657611339570482857071941674209639709864703891665811884603908304481549592842627180817065779143546842079140388383757073035382383336415119892457712538117493661547669850819233137331852231641783994865993482070326235283184181541427573679758103030801595943776744e-1\"}},\n           {{\"3.148720015370035980595275759696960449218750e3\", \"3.43125111933481261039524667921796208247542381286621093750e-3\", \"1.02802334347014804115203210525086340106221839607209085819487247743041255274944512485633547164774253058201682853956553615818500164452268935135547407521495805328007119673698391733155607980906430692803512122247717040507439060960157575458288088753689807084410223837216910150868125550872659514690258206478\"}},\n           {{\"7.5756156366840954807448382801737807312747463583946228027343750e-6\", \"5.5077687409354258996074804599629715085029602050781250e-2\", \"5.22360322691615293009344442522576915365414410103567546362459956848539698481031529793394942148327475172323264893580159766513287240943753652400314434832413344966940876720610075372213401767379175382193046077868122711719538872402153088637192089166340900530573304907112834730373371836607562222448960151481e-1\"}},\n           {{\"2.627455089699745616194093145168153569102287292480468750e-2\", \"1.541165243980346986063523218035697937011718750e2\", \"2.65627927121210139869453772647172972010233396005753285235163657937204725700240182301143436917519389589272478600896823141333467649759723515447005854045233682059842082604402664004516169590843725236432591088329366055949159027684989904142732333954835416376354569871287255391194720780011944013876616447352e-244\"}},\n           {{\"4.808176103728658290492603555321693420410156250e1\", \"3.8367829196169225269841263070702552795410156250e1\", \"3.41928564331678515981471338829811408659000181192686008443981749115702769340722053174798292070290561882896008338642826088125297911559295342634515669888076588557229523820060662923011009955171952757056636448724507715649589034168433634032429475749149003931613573665241664071010924406015748971161354696738e64\"}},\n           {{\"3.205378732913250132696703076362609863281250e3\", \"9.12063633247133534681996835935535727912792935967445373535156250e-7\", \"1.00000736273879463173771441699203291296246037525214803383466819484064993717806192280443913585501602480713195981402804796752564583674811227808842648414027111557663920686825861938638104671353044668858964832448138218436863850713355695690765716750462185486284733337309942715764828383697583139810455212638\"}},\n           {{\"3.6191217634682889062180954908853891538456082344055175781250e-4\", \"4.522771028821393922078608618164707877440378069877624511718750e-5\", \"9.99641674908429772727741716066692522684337586976236285526703123104244360091941899419901468194625324926731894302874406101537005325420303987745335631550541398216024526757166654981325659490102941309976706722307972204026369136295841549401634445497494285259254938938876164197916350437289297642860805084296e-1\"}},\n           {{\"5.477271508647585385176626004977151751518249511718750e-2\", \"3.5462262102851867034622457275361284700920805335044860839843750e-6\", \"9.99989699815221047195237797415460745692681672883768835967449812852073485700626675461871958759788593113792388910307095890907937872017129700062714402629139690850899327106043179965950904385626167111246937006767223675683130961170323257583625795510235931710927527056466356951973276658601609644129515473818e-1\"}},\n           {{\"3.15637438341709639644250273704528808593750e3\", \"4.72407848923734441370925196679309010505676269531250e-1\", \"4.49825547286670319702380922050187415294618434375837006137892453203122331928047047306492172079078511814726958266726273319242885369558258257128888847286538356045014816657847217085941522774109065130033471139571270092091883178037417387674630454737070888538218688730956097543661382768897165490297639608102e1\"}},\n           {{\"3.4350329493606416508555412292480468750e5\", \"1.27250150145350989297488020213222625898197293281555175781250e-4\", \"1.00162336779090582285668555617540990956375149416793870895822616882369079038963730293631724525621870732184904017056404166569755879690536542415147024291651047693012257723344966042105272046767388935297934745863474716190137901174215179659999117641456704254362366255369408392878120515423933846401645588741\"}},\n           {{\"1.0507424512953348312294110655784606933593750e3\", \"1.445127440723827295281436744467384869494708254933357238769531250e-6\", \"1.00001005416673874970641874885661095503816717227379033676876612730865335989893449582345456543451081149107465171659175604293715962189257810117721711365871006508720993220186972724366817623975260748578680835030711473739357905906032894783455531711583331359705157662673931729626022752940417931688341732378\"}},\n           {{\"8.1865791008610611827547853813769052067073062062263488769531250e-6\", \"5.695354392083072300745349991757393581792712211608886718750e-4\", \"9.93351224746448996937113594504910401882994345207771800323049779691276470148213924723483955246436042747455629177564845224233210837232201105509371449087604601761437328836060853287056217115691403748052298316839138971392756481564106383080155540424716692745736592178985310629391299501759133150627938918074e-1\"}},\n           {{\"6.947962131099967922343019210984493838623166084289550781250e-4\", \"4.0103218964951963698695180937647819519042968750e1\", \"2.23006490342279217571806140077665886981099414044595093418295957860943720284086984665743578056568297229139299500245761284073691802977046208070538242215508979634862568996291341587581554469156573033924350089621252836592701785348565193758908337598409016657851371246098654329684058361927838809573986193758e-127\"}},\n           {{\"1.10592794589664117665961384773254394531250e3\", \"3.2526082185098381671650713542476296424865722656250e-1\", \"9.77248676688621920044634297401786442645385941311525110002800741928600473067163385046961591455772161080604895545524410628330763921136911631698147157554500689676133210576592147935248743333122279013651774018515939625427205237675732186795164784795174668611013924030393724917154265078516887725307445272803\"}},\n           {{\"1.253916421410064036988038504993880906113190576434135437011718750e-6\", \"7.335796045204858728538965806365013122558593750e-1\", \"4.68392795308248572652843135364969720382138943730339914636303299072150410868121378543408470390954010868594468316840003936924097765196715356527524435528061810352989069642830612407823386666008449194429503821925534277567874494596141278120854458833913072506701454712189004957264318701887957792196559450829e-5\"}},\n           {{\"1.4312473954279103516284976649330928921699523925781250e-1\", \"6.20942048850905869983307638904079794883728027343750e-1\", \"2.99052723424150661886931649071103918452644460542298398165637531920915224385808227208964029010419121462212498905692527594903577506198009266794868206489817939747878141799591393368960481067737790483228614343187263432824490432996787531286395390254093241449602142598445964130129975312810018929887788198701e-1\"}},\n           {{\"3.43751575420593244447609038161317585036158561706542968750e-3\", \"1.512066870517058703171642264351248741149902343750e1\", \"5.57663597564430277353448388417312985615626273703902768815220625590828356254147933705830400685411299593103143556639123246778758775852967467852603984265071153374722320323459885871194691907711626373620710017973655475923376123554952810313797438555025227910644691182176423627488188876492434022067149277036e-38\"}},\n           {{\"2.1747239559097812774610125607921418122714385390281677246093750e-5\", \"2.91971825175046888034557923674583435058593750e2\", \"4.50169709235325052632986882192448754882997090613648358141414144591089112598426944965520244801106015239482741658118850562377407270011579313225688643981938806077750575133252661340927273680933994486522267294226372481412223764992202845720067257372057887189374997685336348698935086839444322249450808054944e-1362\"}},\n           {{\"5.6185681578075793003940532899243009978818008676171302795410156250e-7\", \"1.298760937531341988493416295114002423360943794250488281250e-3\", \"9.81481816351315594384727007893186507859436644672331091167617928065788693663352781510746621160037607384076966766971591864898782687655354341611390803359295084395315487119152362491516158659729010541073082819881189326119491997777097209681555255784910126963441436697354364542857530552913114970532656768045e-1\"}},\n           {{\"2.69252008622562698292313143610954284667968750e2\", \"1.153305143347518879615165587892988696694374084472656250e-2\", \"1.06666279730568497198113724274678005155752498157046477782004178363192374164474721840040331312046115275560496984877594971350062701246211629447728806246316863840490103633689163217579393790965785864180257773316151663393300617519826348688668218517932804149442470238145344903593621930871763066878050548745\"}},\n           {{\"3.16092590727489834989683004096150398254394531250e1\", \"3.48064997212848559193787423282628878951072692871093750e-2\", \"1.12772520348616005115304677929962056919100702599904589876944000234727659228749834981600423100421009690523247572724398560756474248595294433046382239886297029833469577515642633205214954504439619606667497183510745512915018311469959758235733226013623764492488909973197069967553629996698907871574676780407\"}},\n           {{\"1.1141752247844277428842629795724405994405969977378845214843750e-5\", \"2.0751562277949120449704878410557284951210021972656250e-1\", \"9.37919294955190238371406645550683331410621638917073656116684574199081255090910984115004225393137968138900076398279876623105976571541314203892497339063273916638860131717065142379547629145053297558185567155580289078804833133323155623898592227362901992618266649001082738287327625009340169715002810953003e-2\"}},\n           {{\"1.548186783606525160350564362943259766325354576110839843750e-4\", \"5.6206047199489783281964316863366093457443639636039733886718750e-6\", \"9.99950690212005897959136097299917160482075781519044088208212676575453006587694459400083447882136665068803314657182010357110987268971672741796887858729353234727108572424227132082469362733286450718291677866426969142840900462763239110268260519434037322501413834614893396154343681850902784948541773957467e-1\"}},\n           {{\"2.28067710108071286176367742370985070010647177696228027343750e-4\", \"4.22516467629786623624865704584863124182447791099548339843750e-5\", \"9.99645746030268443121474912265456530387059240825775542503945117534294341852612112033263023994402497137577664903179947031417093395690539107266054577344864123860512144985801819409282408928976825661093887120497669159146596001826170808186934642139325551337232119779982282458342982953928951761806573163414e-1\"}},\n           {{\"2.207390838128851555666187778115272521972656250e2\", \"1.6363542834888315915869635985835373048757901415228843688964843750e-6\", \"1.00000883141260854728883702175584015782702915499431300231183450474406119123947650012070542489465023521252692179702983050986429423066780728766911719282820886407479657520041375764406817735028802434658714254220988205387649994799335160542734586791578044041036401530550092162441750788372567864862832251789\"}},\n           {{\"2.11115639194152252336444952618421666556969285011291503906250e-4\", \"4.9161117879115010964596876874566078186035156250e1\", \"2.03851749220927707096105838017357917405034340382528308320810037826391303266735158295669708446462859180309945589089175400795292926848603356140832744578280150360981737396616217244331933441226205091493168502347016694353942358220609837333188158011389094568440922575728826317171755408132992139505746448351e-181\"}},\n           {{\"2.38633916347037029481725767254829406738281250e2\", \"2.4735015620527917690196773037314414978027343750e1\", \"6.50492562190358454748346649100342667975057580840217621906828483604765156733043048058740688210262627421835218492853562454601684989325985386603026971417507963657922417960947826930994787046883004260577743222590669257927836671693436821127356903028204248621426323317746936948905014560414890048500518981483e58\"}},\n           {{\"4.1649649013569605901508019485390832414850592613220214843750e-5\", \"3.075261121906532935099676251411437988281250e1\", \"1.95708970459274514353705613356165057031575229424640773311770967490560575262481854947938662630918869775857057855329254545872812061129308665775656748897011265399787487814796202063476887242748791769330372489092700441649278984973352735989854637536188114328280137258357850310518955976767163293227505459553e-135\"}},\n           {{\"5.60807874972006062050389196826927218353375792503356933593750e-5\", \"2.702445063506279812962085351557561807567253708839416503906250e-5\", \"9.99735500279497094553640363695299701240525058593455541261394700469821111611056791299453732067954961427582921898800842237144105286658409494042658058247679724238096009700396852983653186891371272750369926281385138909360300419604531575348226930671075101518323161673992501032516753200240811209353821343888e-1\"}},\n           {{\"5.00853676861336616008002486921668605646118521690368652343750e-6\", \"4.006455503457152644841698929667472839355468750e1\", \"4.42868005311869594653291738037482789532744928595938052618021862026535850449639612018073258671047578104461913132613998217526422325806836712765473733283115693708797988431341752008408657974271055896785613419004497755473106128411938210880970972796033569804407750025332012993610194266901383355037197031359e-213\"}},\n           {{\"5.353231678137881681323051452636718750e5\", \"3.62778514750403147104407253209501504898071289062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"6.05603230256580909333512613256181086069213372778044080861620436376260245170503316441303581724403388552683668422287401763124771418367914789920284987220255387646685601968642931765033670724000770308127910918065433865509022691461489073952236533017504964013454255542118759406756885123664390687006240095440e20\"}},\n           {{\"3.229767642669518004638895547486754367128014564514160156250e-5\", \"1.890503050233357953402446582913398742675781250e2\", \"1.01732691727954660011725367716319147371899471036670702622303272300897410300692262400537048572027256759129565470020582895602617924506137374758437886475976576037363655165839084170315722377939735400391371695808916328159137254265306017499308291350722410467152148965233006027461767679652965168830636324127e-849\"}},\n           {{\"1.090489414238134486367926001548767089843750e3\", \"4.65254774353689448673776496434584259986877441406250e-1\", \"2.58980988503590960516637371738014660727349100194484396379725478994088734700803526572947540745308063381145664972855458934861597057007568531182327714420486870282357356343021375166932444789575430439279485545025094851301007569967666444995213425647227644871269194317170084391746473828083433195180432304317e1\"}},\n           {{\"2.447434794350212996505433693528175354003906250e2\", \"4.8299511254984222805020088742367079248651862144470214843750e-4\", \"1.00266010667859458204491495940561046268243246346579041029260554228176172232635197593622622290922199036969298596977304010218474771392718302157017833152484401953670784025973565870850532277945591072432075029519001358625355897190571211275599240174542923282378185576537237233948130696870807231732661924935\"}},\n           {{\"1.51488749663457274436950683593750e4\", \"1.02354275702668705760531309145733303012093529105186462402343750e-6\", \"1.00000985234516448019885473896561732145157443536520866911511897918118736186775473199587722487758817093449012349451559620294147840372481518705271731392645893056248771116553702829600792931868987911801336627246125357506584399976395776801325943965572049289654345210028541577738692060413098304903948601150\"}},\n           {{\"2.67331385687573711007480881107767345383763313293457031250e-3\", \"4.37764930215238656785459170350804924964904785156250e-1\", \"7.47571438862309533743624874136133366541454712127562663177399504286662183346894197246880043192629661657584457838166576178504996182224295507635623850476949534360416194135273172780271343507597813231256012656614579448387095352094197763495149376101171772035626900389244626161777607049448871411562278802652e-2\"}},\n           {{\"1.018085344443409034909109323052689433097839355468750e-2\", \"2.7221184783694063469283719314262270927429199218750e-2\", \"8.82611384964605354323505795669056920339301763307089989948479130915805719954810517867370884785746904749334148062069679398152101779177523464996450923425943206891878509254410570738031307822715129842441609577961369156460374327926946469260053825787159767563643637983753386908235973617270978178126680100594e-1\"}},\n           {{\"1.00731276656660706514401226741028949618339538574218750e-1\", \"5.18228984435489814508457584452116861939430236816406250e-3\", \"9.88175560346904726742930639398687086396036352224271818500936901685374885901648764892385495076288151387225190990418969616688304224966648010000551417499596854632379457426863173605879611399961688292945890600044144991480340984880181190619092493192482621545694847376381337620163394916517599662918605010835e-1\"}},\n           {{\"9.8780468779964552975339509011121208459371700882911682128906250e-7\", \"8.4829576004481441486859694123268127441406250e2\", \"5.06922896545426989764243576324057040501874322165012440675766666713649225255160119756183042369835830558457195704471707778294936068250116736974227601059618844500705991834404101497665868066256287785153513125539305523985206318973305432078184236844170690028706643163133079135912179653756316354134757605909e-5095\"}},\n           {{\"4.41825747491548099787905812263488769531250e1\", \"7.7982746222263199520341458992334082722663879394531250e-2\", \"1.34369652134197483793288072833308732535658609465509415675669768410932243039179437886058214288267645007975345260332874670014492568423533076540783205684921434471069515293441857790677592200203989418352589897685209311617733829289352336172155226574531882652742067029068005584363117523423189997997484568014\"}},\n           {{\"1.5296844845662072032155265333130955696105957031250e-1\", \"1.634608212615425469138932812462883248372236266732215881347656250e-6\", \"9.99996930989216600191785450269008898634303181250066938686025190496179003638914112281154344493820093586185759774048968741774280050131382009162499732926045936023057461223555387483027406180587409400576483490119308402153097647327397891029914779646839934539999749442740222968027612552511977099477561837845e-1\"}},\n           {{\"1.5459068196982534573180601000785827636718750e3\", \"5.8071194443214402269859419902786612510681152343750e-2\", \"1.53179160234960851931903141810390484338949709737193408192930930410912781308171727424842710235568081208824229115859793069399719735722193263870374052840504012604354910230724690998586625239385836126384899034476217672957422789468436133936022499041037971795682906772214055897416212584774512114169944288303\"}},\n           {{\"1.06149875426708788185223286681946319731650874018669128417968750e-5\", \"7.825390041638166649384800166444620117545127868652343750e-3\", \"9.14272969225465289903926091127128136862591595250320697667906487225773277795209213908946435749298160698748843670986774816760975159538180372090105486573778335998950914987159909756145213525174507361115992516851061441846585401483368166991251261491681595295047033029078105940961946982855869715287402727788e-1\"}},\n           {{\"1.7094285962280424476245066500723623903468251228332519531250e-4\", \"1.450141513690568874708763935643673903541639447212219238281250e-5\", \"9.99874220008245006855542326558513156408919554643242887993818629193137080289456989925446796371679686209603602304321606023129900225876158421172053263787015124593801332165057745276555467837973732533352070833078756655605565367486807321355073518225701436176826535604183999704696382097767183866284922545237e-1\"}},\n           {{\"6.8916512912179988745164926911002112319692969322204589843750e-5\", \"5.0330071326271585974154731957241892814636230468750e-1\", \"8.0431310666453857009883974778955214813162656180917019674667856365061641342629676408687942955216557038170696029057610396511938999928187929291101943535550497469155161289193841088940635225677546354860358907449034170591377521605530181623881365718072538006198487060738937169647737729128339219664578636910e-3\"}},\n           {{\"4.27946433404347626492381095886230468750e4\", \"6.700893693973940896599361671803762874333187937736511230468750e-6\", \"1.00007146201085226752984788738357625307865767014027631803309640949680577376696724418376175136252913773532105485594068985474036691750060444806287575074228772867146937453568465581121950409526897590340390497454647087617789150538474509489560078795836109491866150406233412810302502603589419003168433407796\"}},\n           {{\"5.40162932367991470775092643918924295576289296150207519531250e-5\", \"8.23362153160343446245406084926798939704895019531250e-1\", \"3.06423742747299574139652654980590788059822860773454214351500321781043318590458743790589432652553137712034307825892416077869655718345307052092676953436188880309769835515354046500269913785918625489459139881331406660934866445646807527177908193314853725313276753369974838311556362819425625446719126859340e-4\"}},\n           {{\"6.98480482930233392835361883044242858886718750e1\", \"4.824235502562374379789678080499015777604654431343078613281250e-5\", \"1.00020487356414235503163915728935712973913169358041240146118411664231468676920896629650395007895636986611826729763726166983962518312776000911959157822099221405201493001705233813919293314432879950393142137203274049451871519519207057550355386892818843802770417350657588091700213982000763521441126819299\"}},\n           {{\"1.011744866879515029722824692726135253906250e3\", \"2.80096038819214743220697982906131073832511901855468750e-2\", \"1.21386628363111930567875501391228231832773971221469956618940994372919354601446271218977478634940587702534597215097311823723977361204234536761437991482874205192547888855528921579052205936359371957155208181288324241439984156409711039174371275245144079425493549183603159162251977135775037801563222969321\"}},\n           {{\"4.585276426770756863504630018724128603935241699218750e-3\", \"3.2042680303031754671105879594961152179166674613952636718750e-4\", \"9.98276019906690498641979219227000354726256121309260540509550375256349346398739094196651394582546860191649946783658447448964727247382391275461932541094336719168645988397711787831199214881092736264632640564846015317413042211277375865471754751928875230345189863352333606975129830522964976988522205012182e-1\"}},\n           {{\"7.605178759788278064490896213101223111152648925781250e-2\", \"4.478670111360627537067102821310982108116149902343750e-2\", \"8.91022318181765750138709868330053023824369950588567785742389327678334961200987486582852651651749970246817747258718976307116965890616698349626417133054222982034680094324870404036435780314465221090580409266996951521555820905007542674615310907131989836681135988524628981589839950536317534105789412104573e-1\"}},\n           {{\"8.7444178759210960467018400321670412722596665844321250915527343750e-7\", \"9.167217375397957368141077516554560133954510092735290527343750e-6\", \"9.99872128426369981492114383609632051952305521589536821086005990494116094292173923739983506376030713210025133335713606540746004193037337306885070775500980783374129579854971973151969528024543815880504327167057351706595072153954661171897742253459693134310482723707663819212838281958152922341896338434956e-1\"}},\n           {{\"1.91138738236028468236327171325683593750e5\", \"1.41870493681337528357744304230436682701110839843750e-1\", \"5.61393719165089070084284302313399424679983675134163509852591590498735859530953368982681984829992497504960254661066913076235623948356021050016415986014420596315994017260378613566207333104954408470522228787617243604128057260092817202582188202107977088110567991555379686212833460754614025473450009263444\"}},\n           {{\"3.9593580509452585829421877861022949218750e3\", \"9.6634279823755485708258738952736166538670659065246582031250e-5\", \"1.00080082312808327988582209522378397852005304579172107085124537382297137225033557828343923139785908077173538670582197264674005612125502043965115623737220659926592486850580770115661984729610019606048664824477525628872443957605574420631353398611478369946179434030057548832782863477926163435959118485879\"}},\n           {{\"9.527494822481512651290991300356836291030049324035644531250e-4\", \"7.36644237252481737243670067982748150825500488281250e-2\", \"5.99043290744436080750367189311776962864514898582236218043546095145053426015403970275978470316955018068268507145854768132371105755976745328665490014149700831691054362640281890694866429566348288921720874015164835895723114083232661342953621394611916380955923119767515256749281015210664840084139488728470e-1\"}},\n           {{\"2.484228956307928110188928960688770075648790225386619567871093750e-6\", \"9.5599312498941491078596754960017278790473937988281250e-2\", \"2.91195173359063670429359403048505978785219394151399979472770021116863735850753993687072273831783588580026886709426140199445066463954822741869299289627867228462101496659941594784834735871174181621098355725481647468654367330416914560339262972917390166297854884128515599346578674725441419457079115897184e-1\"}},\n           {{\"4.9491118980876490240916609764099121093750e2\", \"3.004862775930479124042449257103726267814636230468750e-1\", \"6.45161540440045450223953783783894469144373503171768310299316311211396701039652476264548018632004490940551121650475174226555299061745541449779441170912616150358121670452871969103360706271231784736206842228875578338918267487091360709713844820843854370488212897734417544669039756642667411365232861750622\"}},\n           {{\"5.86830898821921187469285996485268697142601013183593750e-2\", \"5.157145004755338615898274667870282428339123725891113281250e-4\", \"9.98538706799650092346821769070662036641738082636479009372539733284347573229317564170016552698886694627816395005478215973507005929122925461962335439146679105934195547032542346569150966461707254588652749552262131982196536881226818665443124490222705261425197752741794319954946333545210933092733146260794e-1\"}},\n           {{\"7.83501026710203586844727396965026855468750e3\", \"3.3878804079488164524569526747654890641570091247558593750e-3\", \"1.03084303369653734759444079184018763110189145271757350290747789171120440011979438908956047437954061198621891331998729346005011749200857634828740000563446280260144290233886419978479827799434112209614567540357757105949708290107985650241181647155069956615108211465282807906696708079090952998142539773200\"}},\n           {{\"7.24040157384670202134202554589137434959411621093750e-1\", \"3.2139750306174955096771839180291863158345222473144531250e-3\", \"9.98962718742601158545306104847042012373529894592940838744141601234699871358047935296869274717524339141323620050266212255881930805755665793284647269071772742030623661802389270250239007055699061760303889999391509361560603832488400525248124730452423718749922363976939807153833465852271516354356322016570e-1\"}},\n           {{\"2.3773749185601933398004348418908193707466125488281250e-1\", \"4.166703987089275251776143704773858189582824707031250e-1\", \"5.49589428217805567802447379970866851398217501608629580197067814528656191899243702632356211673360505654178344944705028006574948563210523891802606219873940153904076904718577079606890006710252221715434732369471615966209956056482424699085238332051063676105524207191799310422842401999054890360978090765282e-1\"}},\n           {{\"3.0164787400072270884265890344977378845214843750e1\", \"1.92136460953186087863286957144737243652343750e1\", \"2.67051217459346602496477010560417251705712700254048639078839264060325224717762633346441800378240849611262512392424682983226473649608304764571881449403455973384432668551726106109236708017847884189936294979084049530151497877322166267026808199785689058092334141134841250691148642129989881676444005953065e28\"}},\n           {{\"2.6354055582639710278436417922875989461317658424377441406250e-4\", \"4.228204328677160894756070774747058749198913574218750e-1\", \"3.06662853666315384518454771688957273896640018166337060934230580664851581626370131366235045252515485872195142490483479220526746937459904335480861408290098145258297721984393013560504944686230699800648442282165588666276252945193146150539010418085408269547841393316042913883904363908615604194055289620194e-2\"}},\n           {{\"2.26046063075346914672536513535305857658386230468750e-2\", \"1.3627038921997222664650450951739912852644920349121093750e-2\", \"9.49669691356986597021713215820093379236513850713669538194655152931335203737791678558428932820631859896635045077055245394317491407809178976243739664980597540207413635355482092381212167318467695663002155241642388129246468412919845420697165678187848016391630764936016535264450983179524692369001196616367e-1\"}},\n           {{\"7.443698646524410378333413973450660705566406250e-2\", \"7.9213801433691943820747383142588660120964050292968750e-2\", \"8.14010675669123183496921521116811427733135459824631474903189627969592690975861278168724266785431509343760131532834105760648359541103464859507378780843287835638142981311936553660415847409900494706845746029735940277531884780112929935900839635096070137371899495277565868989524061668633390669303733877713e-1\"}},\n           {{\"2.587073658438795997760450973146362230181694030761718750e-2\", \"1.947141104726958928949898108839988708496093750e2\", \"8.94285469588168562425042075510651649105332456874498432065780910860149873485515925490595348642217083245456881656394030092730262652761300876175697759058061470631341983801941103052127203347591729319027059625352617883993869442078699806792081819748879905962225386908139580991345038356748418452094703929970e-310\"}},\n           {{\"5.98084615325454649337189039215445518493652343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"7.54141705573080567892238490479428492108127102255821228027343750e-7\", \"1.00000134883014846657688131845485191611848674206835683154280061306464539283951337684813473177431132125670490032207511582839375165363167348982592154407605611359695341748966890300250815981718309647127029989133813099179248600056821756358657145575917892530126627067999467459186401635829661375435200555943\"}},\n           {{\"6.95026071869872530406553323700791224837303161621093750e-4\", \"7.3122523971193590860973010592260834528133273124694824218750e-6\", \"9.99946829922765932774347186827261089119719545372876939189761602548364480617029835514052044796339343249676137993597737045638155557799285710458997819509839368231591299591459306098956962406996519241338464726435617191918273092870466980318418139849371272285377732672340181070589663937610591450209282798517e-1\"}},\n           {{\"2.240734448249001586894735282839974388480186462402343750e-2\", \"5.72011372485644930879419844949040907522430643439292907714843750e-6\", \"9.99978273147710365618565727465750018434266860028552780634511158239820481200127637360576082082285493761515451879661983436902590331857062933298024957408602175417434650700857480478630047039957552639826605254005583176460691229891227955796802817287827361621819443402008175782397464338976239485836367013797e-1\"}},\n           {{\"1.026963361521984101701332470213401393266394734382629394531250e-4\", \"2.11791001950321867638993289517657103715464472770690917968750e-4\", \"9.98056858099165538580460452287541225753365554206313892868475688098072267264713973803329319240088967254425048329384938932204820454762680502689447633583472338302047491675207245782389326788006117820440333632657775030341985234164850042741621548603372080092391251779877542034296864156086357253603371919108e-1\"}},\n           {{\"8.6703705286307886090924057498341426253318786621093750e-3\", \"1.52133920341677693691129213959811750100925564765930175781250e-4\", \"9.99277952718489198651035604747543743540115676651768417733688848831717723612326298765655588890670608573536137096893609251918929861039853578444897886108139617036413401117695629638378951997111811960041138307910848973294872108144596558607179052633028242671568000242144929604511881481654385461936722413631e-1\"}},\n           {{\"2.52535597921406917976128170266747474670410156250e1\", \"1.67545906951556844433071091771125793457031250e2\", \"8.98282264364143312494924261974141234695472294090992155155562018911995536275433125782292778674260525238398016330461123980463532873852775335243553615531641077025771609462191107211129184970987736565747180479720790198029098762244705019025351383419378700872375798060833692002857187730789356240125924455777e234\"}},\n           {{\"2.616405991228279162896797060966491699218750e3\", \"1.04737226836765842108434299007058143615722656250e1\", \"6.25310610377006493866619672909110501466370730517133791833746014957247005356303121141646462034804208859942897670276612700251850886627624409691966399085604959689485003780186276442904234165384933316935452289326908453230024435075360037297385764282630607352032826861327915100978947458904222670931759368924e35\"}},\n           {{\"2.820025944394430328365785953792510554194450378417968750e-2\", \"5.2890336039443846876881294427619195630541071295738220214843750e-6\", \"9.99981126663120663978315445418195178347518855090095327320928958000002380082757914082726230053423120527749961157170801907113926659877545130473348116514066094356797962151622116993547396704816898570832090901788549840104993042307779674567777216024811187461718618588120530554820575895739988590245022632269e-1\"}},\n           {{\"1.05597237376428054744792461860924959182739257812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"9.74456803510535429779793048510327935218811035156250e-1\", \"1.05450439582280470237419243848514333965208787934652393730167951372955494178606431812200728304139567804628971230701860498398849175230634941866518705534394558725303044357497118657164159909944927143807152603979711611331658711835035945317940163428557910521645089962892594811777021284923659424445609434015\"}},\n           {{\"1.9223890780950902978929661912843585014343261718750e-1\", \"1.08349612860076613971363479471676782850408926606178283691406250e-5\", \"9.99982133131096723846335477747571205458555360592772378989843831769539959961315480174186773210831188200236203659966289556452394505676789152783853641019895730138295352465651299769502538786481056285110475730395967855975688507419189456451422446526295567348482093213471867865722148473015661603656725132323e-1\"}},\n           {{\"1.0463193386008525267243385314941406250e6\", \"7.4762865805834757826353609289071755483746528625488281250e-3\", \"1.10918690854877106790971565776367526216180983995819057803660864422406143847654780992569076690586240873186597255294638451033694659817944978005382660886521706741399259776875547778479274738700590433170032223482808245749786294093246294856718197278358866518098957741521257199802713807166809120449267805013\"}},\n           {{\"6.36259548895734333359697210141803225269541144371032714843750e-6\", \"1.228097727883958611982961883768439292907714843750e1\", \"1.52598782338450286286135450458954573598472802663327374811636800203700927786701774385033841837545251692421774984587119423266677067201879737268514092791650544542213882071172025510515697098553107823303332247548034598510867132891098061561608401432719775239528846321974734634143406918807796517003534735158e-64\"}},\n           {{\"2.130622669214181965626972448113463087793206796050071716308593750e-6\", \"2.38534614031968601466360269114375114440917968750e1\", \"5.19098455118066498520013706754490677591984461696830181149035955535619874262474066374087254218809585126187088590005269981305550987677753928730521021427525334082765124171365549957770314171493849134109885501003714622689267145862269434956103582260650590467252136804225198053437675495933201621005291059680e-136\"}},\n           {{\"1.402904015919878020213218405842781066894531250e2\", \"1.13722689335705595681247359607368707656860351562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.76476316747050528850692000246200519522360470716902181350858525854503943786512297020242024222896565430817144786078487939900580658865175044648134728561580288938753166434593435107710997858417174150763109875175878816362192204521588377137231081824131646740939989148534654273494711671253618986609286323224e2\"}},\n           {{\"4.372017573127668583765625953674316406250e4\", \"5.5089836882907093240646645426750183105468750e2\", \"3.50016375413563777673770541325000240347503109832508653488647336857427144256430628344920480322962866090482161278435394130795573385145704869750655237320185554045574687208211132875092396633526114578443250901360527371315672281676871350085960576744972765455104647558784495896122434499365424664074824652372e2556\"}},\n           {{\"2.826577182614404106300587393718615203397348523139953613281250e-5\", \"1.0106583572245043299792435775863452818157384172081947326660156250e-6\", \"9.99989414562934374733570123984537478193847375990023521202992404597564318809152441993727777418090556514104681985844118458823465596529403699968559686663737740106923387493303105200565503166558779713221587331443491180025140468746214432126679720477339697928392369627582889524402889778083449486287091857918e-1\"}},\n           {{\"1.8213158806543649700926401635570073267444968223571777343750e-6\", \"4.6651819945007291789984549268410773947834968566894531250e-3\", \"9.40207373373989750079079577094631199620167306803671706440022399491116271902378455342284164919251165911009699545436187010204381502830971843813249510091499154307328869929569251004649662529059388775244320275509563520973233815719214546857449027774185623555318990471004404713606927167122651605783870374832e-1\"}},\n           {{\"1.46755915364810964092612266540527343750e5\", \"7.890436978365517006750451400876045227050781250e1\", \"4.64484232464543513497888195163429809804134777698713994865506287396508104602871734408178720046618390944324170991778876210342419644694461221793882529660281950244593440074231456401876196827229747637594809904497759425267031152839358279700896103069795279548051852526590187125738047135851503597639320208298e407\"}},\n           {{\"8.3043328767694905400276184082031250e5\", \"2.526375713999676198007193761441158130764961242675781250e-3\", \"1.03503345548731106338710812130725055986503423501253010837510324365889248445099107670056377581266593900575457325985155519568071726317821696776190852210129272438899726884098324950090040468317646989831449979292183766681690581501814228892321721246601040936202160676525600474705308542633568308584316650080\"}},\n           {{\"8.810761098079578951001167297363281250e5\", \"7.333727906319231770737587794428691267967224121093750e-2\", \"2.72892191263152309368418398483858745615162148917317277888912958706672096823639413941816735201743610855503568372158123380568416223942437204395543055191166267974357638190306465483077702922759360128463612732981531386413914170095452050612671264384868877433570747466951378322325020744405691770060335633788\"}},\n           {{\"7.53729022560753492143703624606132507324218750e1\", \"1.44997674051331170439263495985926510911667719483375549316406250e-6\", \"1.00000626746844722828444925305995099577313805301524404103686494009081743532235207019307339151083010194102029079910572707461595043287395038108777455456317947638812268175715959797135803525856300281211049078122806988241700281453385528141559419083370029575853474851945010647429584718991721854559935746944\"}},\n           {{\"9.29196125311857485939981415867805480957031250e1\", \"2.8736407594167267740004056975067214807495474815368652343750e-4\", \"1.00130310607123242618493657884019907082179077698498276221909900016213891825242765534255421206798520599892641330780794108614272121210817595736511473642012182311222406630247676600611837624670300497417793849558413334183751618128852678982366003027694097779362865347129226028454653385495003448455051752341\"}},\n           {{\"1.43727353532569850358413532376289367675781250e1\", \"2.29608176142756548188117449171841144561767578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"4.54783993491495810650470280449947427623348347028981499281421336796280567779408506141109574684107695839213640033321254129078108321583824176685378348816016878194065833488610016432724082665467588150668096361892027109844713789484964974482948538692616206482165899790288506924374902752205806598101379280087e2\"}},\n           {{\"2.70759640224985531631318735890090465545654296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"7.3053673155641374314939184841932728886604309082031250e-2\", \"1.07547877767428083419096142604570911700485352561609679581466039671852713698452759329634869067401784752327384511745999840407965753203664746748858043080448574928987130431330974864221970333531951352649388383982665219131905566066113253186390249711325528920747650049981618690921655600270254173866304929129\"}},\n           {{\"4.86911459659213416298687016059432153269881382584571838378906250e-6\", \"4.644152955186586773095314129022881388664245605468750e-1\", \"3.4101267379164705515949071061179798401970959719776627431996781118094045712804741707881326020834426423441290104362376100384993102590570489653592904886896014643278015566215567423158647343389452934468386848973834157280506928166240077741426052002687656557079088494350099594841014879134383100929203824540e-3\"}},\n           {{\"7.848546904342432184442657217005034908652305603027343750e-3\", \"1.462948744347492002759736351436004042625427246093750e-2\", \"9.31540724563669307320322491667157973956200661651434919571593303846115863894103669513415833366999982869469042192760040827577397824232012793869428364179080549290195624467934132481201575233560543620306283174662613044511585064238810137330925608875093333350849757044686376810419383361338035393598016327803e-1\"}},\n           {{\"3.721202627829229459166526794433593750e4\", \"3.94908530795382262112980242818593978881835937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1.12206584334504219728846621264973553250302703946785171831645645721830894010675262018545815052840050758849380777393422282576480781495344500008748097426459462508969278927821357065182790433439566919608820582252667225317461885443234193297904549706413625058399088149505555110903375380342716569207812657836e18\"}},\n           {{\"2.37172835747338208930989900125041458522900938987731933593750e-4\", \"6.407577645033786170603029574976972071453928947448730468750e-5\", \"9.99465320336479719185464362393617871174305860472162937262848024567759736497677820188393809529906684006391677099787283285239332531375600773760223206100883246634220752238455329498878968166316454533321577818353913376078773928516840980584615525022113173652501922620733886925072518116022140332545581471584e-1\"}},\n           {{\"3.53605103337158652720972895622253417968750e2\", \"2.8458247691311680682701990008354187011718750e2\", \"1.83532969791885885135620378353794410619553188299174712267165316998085251325072529407513466403156971688912550231810700054288873685181499788137652636209514628912399831379317778239395084315052983947372535292000124065735878003968456173427606734312841500343489942261612441073694733682134245803236657004841e725\"}},\n           {{\"8.3104808982436933329331421593799689162551658228039741516113281250e-7\", \"4.155393517188396557138219122862210497260093688964843750e-3\", \"9.43482075927723057531497663442495255886217925614713738709933378320005101165593393456330280592636199704470243210249220699112677280162135519833702952111992891673206729843009842099688221317242192847449764385413153153282253151503752131156497992327652425308884952829049613144312048128169217759285595530627e-1\"}},\n           {{\"1.1466602000178882008185610175132751464843750e3\", \"3.3412765154888893448514863848686218261718750e2\", \"1.74479451169065114507177142090694649425184490446641781570460948781576584635840991601731927655494758023459925015377386019778946251375096661299820054396659345784163916943122911769409035509491324432205386045800229510005976694475685559497072577311014446199955236237444975977941360792089045512126998703937e1022\"}},\n           {{\"1.592844639464667579886736348271369934082031250e2\", \"2.373685961415714085198658267472637817263603210449218750e-2\", \"1.12790541394790276732931574594592716168427963234746835691403175587826006982488095536822241070760245600803352183137207993347315747261870544496930500337717553335079860285134922718636682581363247953489931749833309595523465412068635376914524529775388476847978990731073661981262435307448746968442209991247\"}},\n           {{\"1.010374635480884575322590990253956988453865051269531250e-3\", \"3.8335008475018355511565459892153739929199218750e1\", \"1.46827959515471898774763024079995706113716782750728469166998382738205474672874505408339070961454993286360763402251395607969974201963555866889613983970569781895238062738547839409015372756811222082668539050479266568911339662981230077013588037391296361362960017408451588351832195207411208108858157498757e-115\"}},\n           {{\"1.66695565004290529032004997134208679199218750e1\", \"8.71804015666434395370743004605174064636230468750e-1\", \"1.16219309185108283690353246115834277672387666007297244563945515894098174972467389980428784832971321037184548414733298149740082669071577857913503517445753714679820984984835536300423998074680014379718142053804437180632038614386541542054507333387434066222641647278889877313111291185910035634611028423893e1\"}},\n           {{\"1.2846460229611635440960526466369628906250e4\", \"2.3245763842937037679803324863314628601074218750e1\", \"3.24945391385140670639469572823424256394544549042741674612450176003078448450232834405677926416541827735839125915448795224664876170676948629996836691342006517593947756961464160491430339434651171508096026536520981556090838358776179831242252299597098299062165399439487062435923683313278394249407345431587e95\"}},\n           {{\"1.04339649065651030425752598951305571972625330090522766113281250e-5\", \"1.573485708305823038699600147083401679992675781250e1\", \"4.13059686908080605126564483508274490473647130063580548021629986277623406548383789633827569651948273474979014022501027829260141472868965231700274633764760142846471542740886183449424861759202613481741450387488820213753956013540876031520080117102079251759436887925675362188501650887210343405664270909838e-79\"}},\n           {{\"5.98527292754746476077798433834686875343322753906250e-1\", \"5.92842618905841398438405498438896756852045655250549316406250e-5\", \"9.99969570850103897852254602475534171540024098089888531491644885537022647868647455296214377097624078476427734613966180360314627711193584708132475074727707481960045949327090840155765239976195485323033627665295521041657350135494380406033384926325020170964497589858453537791112107981125863527921983931294e-1\"}},\n           {{\"1.201708216294719881386821036528544937027618288993835449218750e-5\", \"1.83573171858579975435077358270063996315002441406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"9.28605001646404799122123246583375017811401439409264242217956456924187147921073178601773640157007541107990624712528914809901097933653148466740296742087373566926721281981068789281547799916665066119657434350735735616423796448248252402292977828214490771898387468010213868209841336736006316556313401379158e-10\"}},\n           {{\"1.790278581302762177074328064918518066406250e3\", \"1.03754584982387711988849332556128501892089843750e1\", \"5.63044664995037750836987820374386953646551425036186940515842751543311970070428773125366390621088048509415536569966741084563251083225715464442813762547476523458275835451374563942157742199280762833831415410370539590912680755089996665637460577287883121257390441169299493248423283996313182295602073608455e33\"}},\n           {{\"7.710751773353188842641259270749287679791450500488281250e-3\", \"2.641820563533838139846920967102050781250e2\", \"6.43972399050369154988520798910605088410360743083682368257478281007222478749780386934407011016164443028717189065642983648339942330570417348717676304330188520673656075843370307967688074309785894752170432378373350782687762813282030251151752809306457995236444306078641839344649086096494148698382826630683e-559\"}},\n           {{\"1.225859617238612845540046691894531250e5\", \"1.01372669446815572924860959780346547631779685616493225097656250e-5\", \"1.00011878102928302779143036441761880708224532433147368168056931216968198406137164127175122694955536795144107173837990207593653143943257391177552069467355860858316175819319731322452047752960070552385154812027281420138955970684262089648831370958477699568344849874652831370849460274952408206982772881433\"}},\n           {{\"5.82595149644963838930777910718461498618125915527343750e-2\", \"4.8505876863872399547749844628263815593527397140860557556152343750e-7\", \"9.99998621052671820010209082288722125377109323080442152434584440919377662337625060557131747020218413297035621822998191924210038600199853200536989949496907248450515440309961142400248274163420688419892365590086355187405743025995286488853302886303794885670413483577122364857720736276931131470386157699818e-1\"}},\n           {{\"9.01125395544224438992841896833851933479309082031250e-2\", \"8.218060702910854331548762274906039237976074218750e-1\", \"1.38368157061396129371090614663532617206257134398324144105974743560347038187851945959992361814602150755480311739774866352614225040566667708793196627370259194113771020229764238603211377558658426209396490633521450588911944454397547213176293597692411663128824894095155297793732492904564527595779976674988e-1\"}},\n           {{\"4.409654394722450909682720521232113242149353027343750e-1\", \"1.024539904317003369271787960315123200416564941406250e-1\", \"9.19534075097294910062427312364961024864527797483767863624171403928319226867976521096128692940847528103007338680691678979870596291215052686966371603169090630798213135736273205172476019108353742027081191692977102801637543740660392501627319952653856947188066651067307484842658131091249553304134437847486e-1\"}},\n           {{\"1.93717944386320728433759086328791454434394836425781250e-2\", \"7.08574263216941169218898721737787127494812011718750e-2\", \"7.56194064144518235667018224449588679976819296337783156090494451036523029483949448332763991177580492553296509263765798810431727918219796862387760870580577134565230417714219352767669331762365217747400655499790736729474440290141888015988952364748907315410294417222286566628219298383793200309754712308589e-1\"}},\n           {{\"3.6647989268164383247494697570800781250e2\", \"7.71145011595037033202970633283257484436035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"5.92304236247268349096312573893392045307545699411902317264880124837981164329935084560551082257778103184407170649203234984204658334295355705120603551098245781624244872037069412927213696722873101986921044921101077821551960590243440000669839151585453297946266135519928259442687204452169702512081165606273e19\"}},\n           {{\"1.32708985351551091298460960388183593750e5\", \"6.56531833894015816668887630669360078172758221626281738281250e-5\", \"1.00077473925602097877583679698815018000110220247989590351745049914772258652489667683543311902850183669682134777670514222872443151397469262756195899010288195180434965887160900063533882057343026426147190468334739066751949659071732450855977621834587152702675615140712006936143437739732339126497413250346\"}},\n           {{\"3.5277504526489622094231890514492988586425781250e1\", \"2.2020744129417768597534177388297393918037414550781250e-1\", \"2.19164668712694362712251058826210564533792000244902438405631163228898011483361552530774835675890492313952004188178746361986328169935055931569379688204574777223286241370824460769287348812931304022631646073013552253933784290828875633916987679684918077103703055564642008994164871305721849760321403415697\"}},\n           {{\"5.2672115056769689545035362243652343750e2\", \"4.0259402110544599204255966640175756765529513359069824218750e-4\", \"1.00252610964243996116042029581448234570507107619387893463104238190901401098561255564385433004137657583567661490188312636640964083001255112695679226528406143723662756570159800308402030438165398677929717369572388554610405821138849352686065896479954227526563362385890018562652478441542017212666618852941\"}},\n           {{\"2.85382232656423795447153679560869932174682617187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1.216220843310176213947215728694573044776916503906250e-1\", \"1.13603045090195516704596534175318401579207918841598587146324536013529784552205952203801294482696233870522877138037982641276177183524409958004888324787356863626406890600708780844863240402886258989044381114275612277702992295412653204859730899096318397139691123133990243168861782693287239971524166152533\"}},\n           {{\"3.9338169463328451214145786707376828417181968688964843750e-3\", \"1.02640519319720624480396509170532226562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"3.39863675434390989723351064011214037513398262547140577736762821607782111942948883337093856726075063500818067573716198405459606323946322650536233861891286348318106161892821504014313663700097828008365436512713907896457061009150442887680100088324705807016079909429412724343222986472982422270499720872159e-3\"}},\n           {{\"1.9072397321581938740564510226249694824218750e3\", \"5.1298095404607061765026032595926608337322250008583068847656250e-6\", \"1.00003874831722429751496737922917004435479965257235816453591525868492670813319281541168275796018004391940278219820598993631669244673032352035813333397881915928790424205764915135090114218540888704442481908590391442502493189810976009897523082978954781479402200004590037271385433077485827559023806478611\"}},\n           {{\"2.083523763392070122790755704045295715332031250e2\", \"5.7732837226565194486916851590585508802178082987666130065917968750e-7\", \"1.00000308249415661310193935943862153702303875909245307529450912006821815453371252563642757366042171762708256721399309832054533722706035892679765533583739735266608823632317266441068592608135365434098808509810551746075126687287986572543900322800829577692516676548344312574211742425657072976921014511642\"}},\n           {{\"9.71724513689399464055895805358886718750e3\", \"1.5360000160986392791703791793622713157674297690391540527343750e-5\", \"1.00014104020491665960642725547509974756116986496973147973056122194845971531406444606607453003866992922578566310810305178136382912507500272971783788119308610688740112803511843108270710764262658648334376396166426766278251188688321297859103006142315969456950763638190401996565523343208463418705191958244\"}},\n           {{\"1.398026293941192073040993837373946462321327999234199523925781250e-6\", \"3.51936644048749802671238740003900602459907531738281250e-2\", \"6.22241870897130620142553713444278896319414844301127628403550478555392596780554049192378201563747768162180873879073883732945738916895322915439456198565943172406197196260279982663959045275534018807122490359500452521705604768928620538202140216274727339329295923594705918674314862791990908520063913560002e-1\"}},\n           {{\"1.827650077322046442973579871704714605584740638732910156250e-3\", \"4.8431895026975723794748773798346519470214843750e1\", \"2.44507161334831975914976330209249902713146345349963201960249788428960802366282255229864854849664361912073985037641790912699757539023105844864929631975643935921225809946412808629805438733741027621604921419911409131275740749522537202228860884159853851509071131465735369871648912668689687943767400944117e-133\"}},\n           {{\"2.4987224228926152136409655213356018066406250e1\", \"4.7047570824358175833879158744821324944496154785156250e-2\", \"1.16348084392128872602170011561254935010976642009637548196335495165701186585536416597718806964461847864028617635977334329848073696152520245124091137376311572172062522206250814543168673719325221226847866492589752767830775399781911226358430095279351842770613889036173222279808875420192058143269430231674\"}},\n           {{\"9.7372871127818103271014948951744827354559674859046936035156250e-7\", \"6.491316379063438724017487402306869626045227050781250e-2\", \"4.07165047632947683093273589058329846367047057355046748020009102510780065766705586588667687646255828190502946698129852184038457736930348397388946238687402139213354445146888181529201139114650892414118512134805367250310852437034078342906915160983796227481872425495472151960083249503055095175373933146792e-1\"}},\n           {{\"4.4155834567063219006644025910190975992009043693542480468750e-4\", \"4.025802670302487543466107844380985625321045517921447753906250e-6\", \"9.99968900351231822950433739312428495072856038776486153703336951900488129027691896751286362525813536862927182360156159008954621569331770038862723809677808006540779343891491372231781933232571078612298233285052166498857617406809139173150092488738015228536389093793575323664246229233166651636689627818170e-1\"}},\n           {{\"1.694399654820086253970146117353579029440879821777343750e-3\", \"2.7072429437320841283387551357009215280413627624511718750e-3\", \"9.82874963902734961145255850699575978876746826231267390332055952052622176060893943203741788304684214781121351119738947541263489494899175563981247061980860747331222509426652450764505228926170316851952179492921780437496906593243321687842665376169899786546461700589626075813241454757704572169462564574837e-1\"}},\n           {{\"1.033763461817003553733229637145996093750e4\", \"1.289890172095206274938128387930191820487380027770996093750e-3\", \"1.01199452382152846374481951076631164582584661608322894290555407864227990207508639820617740715279797178581146570337346215682655494757376897027306747771093102874076785395996716253897920655609144243672317898938847395985100637001354712944101351050038536687079382428227717980685264632621156939159222226580\"}},\n           {{\"3.112833052343313977594618791044922545552253723144531250e-2\", \"4.01353477046427009958251552745878143468871712684631347656250e-6\", \"9.99986074588519454560640521673442935641990554362956049271045530697088039943872329332770296441408515271037076808977915428133116228156704302455915102356256867263136007644093137679299480159178566422686424390921886424606676712277018147908640199369062110318937373042728100659267805929813035245614797996696e-1\"}},\n           {{\"5.28149186098080924978148686932399868965148925781250e-1\", \"9.1665797514525820588460192084312438964843750e2\", \"7.28853014056156731737794697397317103994217559431541111572375406126519183769444357872853226505354592130101907012445487770770781129901235873025553849331106253792412404560306141938477978026852566898693906386886543485615404988699045603447639500571979436388663669239796393481965967462640474331680310932353e-255\"}},\n           {{\"2.2225059936295621376700637483736500144004821777343750e-1\", \"4.642048948494684736942872405052185058593750e2\", \"6.32843078440077439221637641999286892206805235377727400014747144482178933184733036820827184969102097810334387052048590277206436733653974464975608297721942370810634826788083279979408768576378602999295622590369226553818034587114239802440932660296228167167346743576531361276267309223102513376997022773121e-304\"}},\n           {{\"2.6440159763177344575524330139160156250e5\", \"2.48515468216955248692556779133155941963195800781250e-1\", \"2.22595558957063988125039996231413212457799685089809815878697787456948885300739760428233740293311835672030485009491199517382307607053064251483492857230753137256332086797523013500249415836024187602707789116720162609479623122987122977570646771495383250532455162474303561808394969890452286012410188771582e1\"}},\n           {{\"1.09582116879168154355284059420228004455566406250e1\", \"5.1206272980605938016651634825393557548522949218750e-1\", \"3.40731230607113577867418131365007953849097556433032366687124266265609534681297061468250410931194577479128955229993084028648709681104213544161468193428670594705798621530529153971465865443890890717329532471903443507290510241292018220973611927868861647858691705199882686680328023542042496509604517393163\"}},\n           {{\"2.8765032923235537509754067286849021911621093750e1\", \"3.296369943075922037678537890315055847167968750e1\", \"1.22908880787878338117870181426636174855444573322349359087228723914632875946311491878034980145023441888073390972797385266938998183475968716718276000295270333868881283934630328911650991709812223171518435502540229986453603655260898220094106548795285001784222894626512051690586979041086530161063766088286e48\"}},\n           {{\"5.4319233558115521650136447995294020074652507901191711425781250e-6\", \"7.054908153364996056941191304723304256185656413435935974121093750e-7\", \"9.99991447218133598413920881391105179265568552579320617946001886143605253717825160221002770761833078341617996929941439664383856515269642825892255570319730959451798678974258583863414985420861854967974576953145352608585972242996479479728931155364675877878808323939895254383920003458645959690646207544957e-1\"}},\n           {{\"4.2445062073765684948489784744651842629536986351013183593750e-4\", \"2.426176577767188979883883348520612344145774841308593750e-2\", \"8.28295177297287815001307142572162153750668927480049029937221930255174310738192949066940496577252702629998657734311395912708887847618250337367575924375521236807234588840327753338387239581722861162855798729933237542178055913633273793008757291901196363208416962469352000552707123078294608807586649015685e-1\"}},\n           {{\"1.307332736315109170122106263534078607335686683654785156250e-3\", \"5.28858724063975630660591753517962843034183606505393981933593750e-6\", \"9.99964885633207072968580726334787422174518544602461721143383625224899368056665861649907581709049484723249000855383620986446956783244965088674964206494776757278305799759524067667215395257158003498553463221431113016348494389058271382782227321845047125985119505752219731349818937084514014330356212827292e-1\"}},\n           {{\"5.05693319148356598344284940083070978289470076560974121093750e-5\", \"3.71295988486159203589842547899024793878197669982910156250e-3\", \"9.63937121881680868303835544307084885674388908256423717510775350630463810161245157254316013064889945722190309457613724784742119883122943867724213022530021363225255978426044946346577578461808416905152263622045415849140604671011655772958990313726815312540544848648362428160986497782665450731113127323529e-1\"}},\n           {{\"4.844239692035090411081910133361816406250e4\", \"3.984134589118280486697010189800494117662310600280761718750e-4\", \"1.00430738669558002031403659131744896728312485313631409231096866927631637993851247415735380222493024677897434245013356617271278547792035688620287749522586547267897264556329014249359221662180556496497208175354676304526200770138492165863545577626683932270268515447259703077574615595169323328662157853185\"}},\n           {{\"3.7078480365654198358527082746149972081184387207031250e-2\", \"5.5250170899286410453044027235591784119606018066406250e-2\", \"8.33573197351168666887962631201029384882638323647836131662987813863879776215233605661322116050262224430353678691583537529582375506359810080440891529163886160078411813398386404062767305381544566179454141780145518165423921596307439563187082576279320332050551415851387221311994490392675793780232895364275e-1\"}},\n           {{\"9.716555147724156995536759495735168457031250e2\", \"4.591663841877569041116657899692654609680175781250e-1\", \"2.35377653844658353569031679679735299370922232948810544763027212743048187579990164187893014793934410534408779634667801500692064187926463087757507629287841868368096408503740782370080191376158895711024144836742418575636184986247750729343991462010937031402061673932392367262371858670977341473615463130359e1\"}},\n           {{\"2.192645859365482010616688057780265808105468750e2\", \"6.96729316179001942387419288316152687912108376622200012207031250e-6\", \"1.00003755636032301823537943813016356575902489314188145066916221494580392625081472816947024292161874513732270899683702071327371665141574567958235034154797657204764921080200596842458370044167411926333595258330617813605034939486089552138840272033589961004832483480269032835319807553392086565465392533307\"}},\n           {{\"3.079132493049849261801398370153037831187248229980468750e-3\", \"5.05463804011641570923529798164963722229003906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.01796919571840276681288861157787148204747502682382876961304668410493347723226232435621763407251840958497596600197906374696494268910490419389807332560043086656936398322936521311486726743408171670806339766715147358441693728848925652781609216889389399280179459317545232154188799226490332505068768929180e-13\"}},\n           {{\"2.72793625008602248271927237510681152343750e2\", \"3.45107876494454290927649253717390820384025573730468750e-2\", \"1.21356364414706225993709314217781803611734556534595777181951409142649823132949473277169982486320740015805393683502787636048469072138860871755431959907851351864995912275227191432009279405103766593019141570051245200073079914866268809278471723253071227068595740039873872137154853304817823898235004618070\"}},\n           {{\"7.23608622250063859837609925307333469390869140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"9.31713845716947162145515903830528259277343750e1\", \"1.20546015073919711264373148066122758661068546232444031541084969085534241548251886930568813690809866385000095984750691172127616802373754602142656508934912781801862005537086317665378844206989588374435568687107987862008034665185792976330120721552229886514045101504253350965371418298181204870517230728955e80\"}},\n           {{\"2.570723035364298993954434990882873535156250e3\", \"2.69790274993758974475532852466130862012505531311035156250e-3\", \"1.02140974620888944930305959435799702728843289682449376214925750857783066006891649041158724227299321084257799199351924992147805951706584524451302681812312203333848599297059927350897068391576429287666840858314350106940048605718179391844174140189607359928083054157216235380992076831905704302805940691484\"}},\n           {{\"6.270713787727346643805503845214843750e5\", \"9.7721370519921515454195293237660280283307656645774841308593750e-6\", \"1.00013045496457016358902387902369248820481792505684604793782357003458740283012026953971512527832247937686018956926918760579827820618149654974789601261789353438501933209142889274324701479760186259188286221595702693452369288516143444427753506877231697874469255361407264955531595418134590240336559943863\"}},\n           {{\"1.22109376852135853575020973948994651436805725097656250e-1\", \"2.11543635047828820815521422282756702770711854100227355957031250e-6\", \"9.99995551589729160336804918676630911396340574056049766519068518427735361038006808700598379055737548489964622176597729664945550621782605173209704608243388212974829930345797712949588621847644770093271093043600103623962707878170666514346008821208975619634087411931268385031450753049330763535153583731711e-1\"}},\n           {{\"1.529009903540106893315986269499262562021613121032714843750e-3\", \"4.07910792856703210418345406651496887207031250e2\", \"3.09437152552687759915144210042422837004776738858769798785362828201158918075365450163702134968526881164477730298716543350719085306748967317190021537573795780001155496528795641888775374745803795044275135632851107711558035622505495812638847592959079891240357223230602055612544312975892640303394964825816e-1149\"}},\n           {{\"3.3357488035001949810975929722189903259277343750e1\", \"2.224099109229280202271183952689170837402343750e1\", \"7.53927322890034742368017335227292720005783821228941858003370629012694382557138392281089806659775813675293365836774015539525201899124038456550795641920581579865504101847353382339574548922971435920120403286201070202878099356466592276232925556211910029587973272230882852354333961947656943741233580547242e33\"}},\n           {{\"2.938860932228841704727528849616646766662597656250e-1\", \"2.8315213921096252973688689458242606633575633168220520019531250e-5\", \"9.99965326837122789351065801513643019379691746234431978717545032882563543159129029000520238088911519893688798595680083260598269929340163335960195938697476035130411906261845669886681524297055544969116053569875568029319976030656002722062158836225698022385486930605555120535915405105091329811282147529892e-1\"}},\n           {{\"1.0536390034124033263651654124259948730468750e3\", \"4.51733416318811920042719521006802096962928771972656250e-2\", \"1.36944656525417845173858897538026176879580880507614615066496128471220543538723767528991906038383446820702565624708556443997649629495841259671527437077527127938789704415913380536996498286764720566639200198900869760387706475703380674649201567096875423075710829719565752777057995176317511826228555593581\"}},\n           {{\"7.04420993592731428016920358636809851304860785603523254394531250e-7\", \"1.8351438488835314366554030129918828606605529785156250e-1\", \"7.42999851704960956730922360017793140547106959683768718211070193339741510527923658661871542385815054985958418322575081567325471819065963185600217971978825670497003073742499873659741487280818814513977323524960437583297927902838999554519027556228317521167236540123085211060151247184818776639943050911394e-2\"}},\n           {{\"1.364533448228305205702781677246093750e5\", \"3.64161706602405751964646185570018133148550987243652343750e-3\", \"1.04399795038635921897857958256316651977445152567453727222518284598769789391999595233661749274120961391885225992798836625746470159354169324537076101684572935560321844745400772917299981122731280255675880379891143456808614768985468915540339803333726839718219814716863124296189939533443325484535601906033\"}},\n           {{\"2.96565824250737205147743225097656250e3\", \"2.516110448737411964259536034660413861274719238281250e-1\", \"7.47522068392867838732450708572135930567101005550555468267204809080882851453167258980507378379243415338266777301093835073449659828508711197010120745211201439735694186362327003324753635700543968787946652069972776477402704033680932298818937199049452926851734709666219333409709557278942834445272506685923\"}},\n           {{\"3.49571885007329983636736869812011718750e4\", \"4.0503044287507061760322812915546819567680358886718750e-4\", \"1.00424637003637001346519445137047903985527298734444205998841513031143713650570988838061609722582515075163633719319500702266902153041674931227041528924269656845803454259997891649918404783522081199789884938037449889035577760958358376931686006190221056227385652828889051574541455553647177469994824093880\"}},\n           {{\"3.48704350707848789170384407043457031250e2\", \"5.94470451369696548105103772741131251677870750427246093750e-4\", \"1.00348622623956426654419790365515385008204532308719120294458056691444071691627567637464093877906643804041743573926720499607391861016395825332249134843376717727039444569339034648222083969616342813466476442089528251404075917497087087133158228565604726619218594367232783173627524996497743616209681950686\"}},\n           {{\"1.568663540524837252121415076544508337974548339843750e-1\", \"2.923824443941481013298222535468084970489144325256347656250e-4\", \"9.99458548775941655985641049562781270043468152203580071617312952591624765716886645437516907451083025631663787001723138256606416990037410952933773901687094742927210507959414283830075225958048767485241813607677989510714884949211624158456814965576504829085206941026015695802504061055800475236320588403791e-1\"}},\n           {{\"3.02555496695998127343329997529508545994758605957031250e-2\", \"7.43476200926107111399687710218131542205810546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"5.07162439112148019358772224877510168973399161717373536875684406796915754460308189843582561832996734392043166689610197386058626738901780367190433337506557349349095623450517180395264699151519926104197461968535179024894054340573408793813826035189319052898390671701445304365679647915192850527101155372317e-12\"}},\n           {{\"1.1330105736971599981188774108886718750e4\", \"1.63391498739915612750661644270167016657069325447082519531250e-4\", \"1.00152645922689671305334533143447522531808487470636607472600090062282095427316474560067944838274073843864628772883486893974636361201579261003896147984190781801313303984627253458134496161410984325183430174864002871499528387099093919980953756534711057395376377803880481128200568335684903772454493560544\"}},\n           {{\"2.0028908021549927070736885070800781250e4\", \"8.6391933296204024372855201363563537597656250e2\", \"1.92699766759603617897105296135509926340232009672802063778499835631207758035200425882438232730073541633716557508264570905405926283429555595877466543065569320408150504538307810614249593452939955155496934950121411097262064539453295031460705244148452908856502571794692573823194011760644101511653087442625e3716\"}},\n           {{\"1.32507839540064445080225219442127126967534422874450683593750e-4\", \"1.518878628834884239040547981858253479003906250e2\", \"1.03647722584318600030967144335207527953463651392633257231597431308252840118498779108498324584815641015064709374407448575779770810144009458027431983385495055750280990347720737478088901276233575808268895728220588756650828610378844764861577519796740508015409537773234457412772265295624580311112182954835e-589\"}},\n           {{\"3.5760343141490902318935241055442020297050476074218750e-2\", \"5.25925527701659852259155614184749083506176248192787170410156250e-6\", \"9.99982482017295343923291140868824543861889706024267738325920940955163642168596277387382324596268313941030962899361898533933991225186157467591500415565798572470081783136017764613428509329263882432996891459823007909353566621634663513526224023265569627278594547455316883257611223218894909706813593928661e-1\"}},\n           {{\"6.37895215316995745524764060974121093750e3\", \"1.3360686442100041778149877025327896262751892209053039550781250e-5\", \"1.00011705660623425091805720617137318115223118739797033368829524572193511821979599497313069101487866374165387923697805554918674050522785359139471078208862147954503878603840716656103170817064574728416607854591674468869938491395161398773239010400175784333016262331344116781579064223044329496394945074676\"}},\n           {{\"7.381043432400802295489938842365518212318420410156250e-2\", \"2.785260961407158135936038001467807134758913889527320861816406250e-6\", \"9.99992740925564330652806516420746938988010148239633275154076421571630454719695668630175026322867662102076692387029189869547293172340508820534949790931051258505036554857756821592275590340005422029182367955076901146714768419205676755504470790282646601620852828276821380880075367804416790635127471984294e-1\"}},\n           {{\"2.2460666646297293482348322868347167968750e4\", \"3.5622485300151595311035634949803352355957031250e1\", \"1.01973918494886267810001894567464669163247766970377570638787946610322435627850446066260492108701967988500602281478606685233882133420407449502588207373547970434356681888963673609480451591224779378429762251379481389292664486026843607177275521955621777327928762357765933587555111806380884809909558908126e155\"}},\n           {{\"9.008001827101250191809356238081818446516990661621093750e-4\", \"9.6443272576535524209795369188213953748345375061035156250e-4\", \"9.93259995118943779913113450886803213157300236441759177808360979990670369813799397673229074691051859756881735508284831070803950318509897851789286938821324800564473083981421925321740139076048924264684734691750703913517330543410997193207195299362629750503027996358069377923999788650279477370768077765657e-1\"}},\n           {{\"9.4182003413893980905413627624511718750e4\", \"7.774193002886642601045527611880459062376758083701133728027343750e-7\", \"1.00000890381075384949081595209139696411199492416870417459364082687864113657489926105641478106668362778068330268736600393352152923274282322515415108939987073582719187381060734722668227714154297709452559911296248629890116220184188866083605360898785001127921221360852853375996265543887873427220880943937\"}},\n           {{\"3.7369273199951797900797423324092960683628916740417480468750e-5\", \"5.54122149350758519403825630433857440948486328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.92632813942166735469252865298175146289395053013193471532530902730842579927583105349449489218906918310069151271847219223504300355763614013961247019308729802033635205970100220700085021558381217246935232153985446384879850169504304149149649141113162707552300166988589633450196697040655835196191118606631e-25\"}},\n           {{\"1.3620738122341888645672192126312438631430268287658691406250e-4\", \"2.62468618182947011518990620970726013183593750e2\", \"2.23349312978912488484797519539255018773821880984944037182332190114599517402131412348320914129812507474815113624208263309735483442308554370722059051755362465566371079854655405434396337539491832247301779055162543337811300162664812836135792078898777055591459214033387458633919871456241380657515870584905e-1015\"}},\n           {{\"4.9943935269132489338517189025878906250e4\", \"3.826691408876888544909888878464698791503906250e1\", \"6.25800762575108176129137940894321369236803059535403474287787709049193999989553876351149791249607106743078893765328229169808063556877194151113548299740103775991789375636892691914854010648529483996498522632062568652379746122433944483375027665116468292026500341138320088041194003298397510386237462266236e179\"}},\n           {{\"6.485392961276647838531062006950378417968750e1\", \"4.190817698307106042854286442889133468270301818847656250e-3\", \"1.01763841928646063179945311430619776672100366204545937731495139936077193534063748395270846081233643612207997993464082794803985613863394615181696471224069637239381759785944556677466232970035407360811317566511537057177507901702757204703329800142152099723806486139061978862458791045685416916469263617024\"}},\n           {{\"1.261853587411265742446175863733515143394470214843750e-3\", \"4.1870787456376986138129048242717544781044125556945800781250e-4\", \"9.97208954505633083962348848418154736485944843062550245347612203304547965531131555025237286475690843458460809325029245321285039436520603179307117618768371875438665250167675789128497710216048233584274468422162333906486838232593986287174975031846178589748114260487176217087771250070897293526267935699686e-1\"}},\n           {{\"4.35488942342848749831318855285644531250e4\", \"4.98678835531215099763358011841773986816406250e2\", \"2.28936120581079817550967747499324146341809782859497306106568788729215792440868081012592482836115918565108733027645928062811796100015424546044055914594061783213133483941275372186699846142681689537346156745852091720729474664315028859269079769914368203114147150204153490030106741528606576208240181832379e2313\"}},\n           {{\"9.5207914036902785426264017587527632713317871093750e-1\", \"1.08107909706786978198955750940513098612427711486816406250e-3\", \"9.99946912731466247972527890006754510895764819973853843000662583785640845446566388520861934833991540886888853432324685563515222422612660717906957938307798158191679485565611171204322088502967506340693425660800080176478497228519680488062210430869030836704176100634086409155754383655120084467598988079204e-1\"}},\n           {{\"1.0409068401303045448003103956580162048339843750e1\", \"1.936739214855335831089178100228309631347656250e2\", \"1.11210338662691592819619664979726597449100163292683513479170961681889868927958630114518483290408310841588879531996056535646660865328863109763975044243074863201932805945130071457158971557983161341534770079019284360491414192422030250649176833692020314068650401152520803465262499102820988511235853988648e197\"}},\n           {{\"1.971498010271299783369158831192180514335632324218750e-1\", \"5.08739590531112617632913952547824010252952575683593750e-3\", \"9.91773157361409781701715493663763866515090466561690289420891165770114164193580683686846646130438934752909209919079027125210567061374829822112866779201464446464651026659338435230202216580437945262368984290532688736997482187636274012593325315635831427955296981578931251003363149110123293975764983649974e-1\"}},\n           {{\"2.79971511541740710526937618851661682128906250e2\", \"5.787218752022283210778574868982104817405343055725097656250e-4\", \"1.00326623969490901566461359485954800182836515927200276988639325398663724684484176518830065683294723102506600723636309590040090118084917994679575687454329398419185701984750026134555302778342008308134679599723649132979721129657717437355628051914400727321111879908949789141417261266151891576137055521720\"}},\n           {{\"6.471802775221924264315020991489291191101074218750e-2\", \"3.54396046637904049703138298355042934417724609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"6.11393159288848940315388484390073955173736785149894558116032886653088516351969818186256818732041463123159800744120590173108691581334056179094211775690837141959813271450679799058611736101514220405786918675156348944553549256908731766892776136986705072991002327432436231317606705791658862062772822668961e-5\"}},\n           {{\"4.6847849382473068544641137123107910156250e3\", \"8.085034584903098675567889586091041564941406250e1\", \"5.97762155395492793734284548790084346203097684458052431296538227291993735975496781864258983550151454075639982388971649044469779839674940147551147838593024539580668837295332526092577626791361518961708496544368414553255175123291725694241746786254191457634438577633532650001615818789185478534006606741407e296\"}},\n           {{\"1.5439145955192981607417834766238229349255561828613281250e-2\", \"9.3029150204543831215175941906636580824851989746093750e-3\", \"9.61942064374907006758472323953419672912600288860094391695046538452658427001421356899386802781741233841276963853691331000772213773371503948038327239870459585412114416103967368390201886001946927622637207918880459451317082626408706757400699845882572764664471363683650469561537447695573432201521718527705e-1\"}},\n           {{\"6.48003875925739691865601344034075736999511718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"3.261210824526329004127700450510474183829501271247863769531250e-5\", \"1.00006094496769763278820872383817879036100529479018908630432836412716347076273911182394224909321200839758060396148281450949863621182268008379068612869939290370399199699187329868380547441347229000962054100848350577521278040241049817698210922858722233509600098748764436396006044192563867258556456726002\"}},\n           {{\"1.02255146268133501052943756803870201110839843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"5.8993269109875526301500769932317780330777168273925781250e-3\", \"1.00013156917767091552599892235129254853484398955770015153844565825349128084659104946293310766324345122756751921898192510410177121820174080396618577123202206891707775599129806431636068338328182197155856712217515198962725685962829886150997851437588418591804207516238583892908865355284748545102405714042\"}},\n           {{\"2.81888129121324254811042919754981994628906250e2\", \"4.073526023631882098108292211691150441765785217285156250e-3\", \"1.02324693289074461806065314601130588099455748535483252525100029761881094483032981058215632709470546862166291555062468221229877852679809354657976457141823806639541535849041446001105725715917762334478759524935613974359759936992996718201195710259035985781666122257084622777055529931477121573215140197696\"}},\n           {{\"2.0718540452792653982008741486708913726033642888069152832031250e-5\", \"5.35292300705978618680092040449380874633789062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"8.48850440195174823298359540121818302112603372945421421598869878434979555804675505735326375593302973038814914197710751833892726619856756218734694899102028024355384042325664532283875944124268902285546831042825514027899847395159917919088321233227951525026080119430650746383889735094027434636578283016912e-26\"}},\n           {{\"4.31935286049695476781606906513388821622356772422790527343750e-5\", \"2.674460276028911646364547016752055696997558698058128356933593750e-6\", \"9.99973122517169758868298611393816315674468708382437784046013092517874934197350186005397961789565235843871109955511656116413964407693637441952651815512224774438246717669200447114406421198392169132912944363201879586414171509537947822165122722681222879324770937027844102716000158168894762456660415032672e-1\"}},\n           {{\"5.6072865956525586847219652653073751480405917391180992126464843750e-7\", \"6.380308531301886202031017902847054301673779264092445373535156250e-7\", \"9.99990816207746297627000228090032149940299388165914304992280548917955938225443662692605137525666097388080408339273626056667955459490552137971306327684500228508064672496432612203803093818358636762048072433804065084080756285538210846111127149390742779965190790248566867146590543170273767758612958658971e-1\"}},\n           {{\"4.943658727909295636307462906700038729468360543251037597656250e-5\", \"6.081072865861608534032711759209632873535156250e1\", \"1.41889634080305711655291544430541860422410170311666966191109605478799772032330347327796646352426019590688459329571978188218768772574725991603534645626444629132445446486278236532522655245444099755490849273965885852698636839519891473821647868673766453693048753250768728056307822453273785810806442880557e-262\"}},\n           {{\"4.578630412410618737339973449707031250e5\", \"1.279961392849584456143929855898022651672363281250e1\", \"2.85252911535679891073378835901479886089967576299789401385670015780551662533990060451545346245206661914640102653229509656129118798311517873586006356564037704026911300448200277564257378774264510533411693099418541902845247573044373703549276907520323049567611007543654341177174512295005876331502328496351e72\"}},\n           {{\"2.08423524510303792567356140352785587310791015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1.35070210371325316600632504560053348541259765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.69650994818884808551478851790421398330849110943521821889862054443832715742450095948994740658527477301306542925058870703929885411081233767845292798598894899925369153906803097693018622562446710881324699679389099964263723003154543262693904642747226514772235244787350437914151428906711221635213885798789\"}},\n           {{\"7.0350735533994179782268929557176306843757629394531250e-2\", \"8.66736311094788106856867671012878417968750e2\", \"7.68909935340978860422757035820741960584342288164122209394216788923406587897458745269054408633969378408300698489680800368145152233150125878615072546588959342193206959268161227822392820692595901101440058139059566058188384350410226233241151749648406111214064140648607944967440645591239738930953785109368e-1000\"}},\n           {{\"4.44777561798017704859375953674316406250e4\", \"4.37314005329937316446375916711986064910888671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.12314549862845492717877595964768115546325186339715764453604920761210996544623734651949041265076846799054130789000520895961692269440989421981634150513113011053879079524507516981642085862682964932699084859566571367826867471772759871670601934760070910316789800074922999274803369631048113774053097073929e20\"}},\n           {{\"4.78949184649386006640270352363586425781250e3\", \"1.791833511743041071895277127623558044433593750e2\", \"2.79637132177375382162263956935980813855595791264327736518378404210637984016731507340572257630052502643907564502937056932274446805895054500000116906646009851736492937513833076602489625307279653461589071484812740516746714953908730424736460829219077432204380475346934742691432944334479643432469277088306e659\"}},\n           {{\"6.22325830215437599690631031990051269531250e3\", \"2.25225952793516384642380501190928043797612190246582031250e-3\", \"1.01987069469372759270453628912642728954230513534833089604954661995171725801656380902963421144934906141234552439696120736550210382743489449329697576830407056888118360526079463661066722214220114165138840831176499526985462507289995825151030297233511088604059436353741508088143154130210563278515547311543\"}},\n           {{\"9.1240044070163778613946625739572482416406273841857910156250e-5\", \"2.34400553054916376341521022652614192338660359382629394531250e-4\", \"9.97821977486950583166084719161557689663568325790003522306021158417755185644936647878316368235185593329253132043532554677812935724747863173935255764658313396824835230126055857216828346612262350441572667853382236006603976105644273478945602579828808105896550462847104108659412377316272488653010471184196e-1\"}},\n           {{\"1.33795627811531119277788093313574790954589843750e1\", \"1.4818381285251529879158291502783129089948488399386405944824218750e-6\", \"1.00000384349299045776862801360403732363545774843774701655200272080627739941386437175886379606902727479191090187794979610761904053274682140855025508483613322969568848488035529156236560186742600966591613965074184599845133474883618868818832890976311295886503114503738779326119140373893527826165039256344\"}},\n           {{\"7.0693904131002636859193444252014160156250e3\", \"7.520701131772273129172390326857566833496093750e1\", \"3.16601617096668251300410633861451144300904853213668949893514704576723535839139585890152639279492333481781656085682222252609689619088940700517823681224990153082715763605916833922234577262387169239662906567674441665483003247288718595609022710170750805174093013421029787059183231600348513197446175716344e289\"}},\n           {{\"1.4680947481997885795124147989554330706596374511718750e-1\", \"6.551502580580362278261929986911127343773841857910156250e-3\", \"9.87508829078291473496350060709599928627355203095913409392108636898471105714839831302147923025254259824329731513966469918955762532776229610929533035120642195606951641982085398951090528368050382553009140996960228822308531093162518295270230167711636888797942089811261515649759631850124542086583338696866e-1\"}},\n           {{\"2.13403424835757107302924850955605506896972656250e1\", \"6.748819597020269678289139392290962859988212585449218750e-3\", \"1.02087023232278898673025082821180943357336233310089987611387411667231521549575677239762600896132782138671932320359043850059141855317509884880628897347559802452573752440941620827448739200875424446592178873469737214134752340014718109265906882735838254335143242217171430272779729156476847140495477447567\"}},\n           {{\"7.9523384475269076610004503891104832291603088378906250e-3\", \"2.848516784813468483150700194528326392173767089843750e-1\", \"2.52320441273088937482705455163451804728010853035570734024869989669472225400000323970014547943529070869582874785761555559916107563529628329435884632549334664560080647778917243975126257892837384804686623525333256233581024540617818741704180357848449262419278792476592443919338009722004675820379508226554e-1\"}},\n           {{\"4.86469155616132400629658683044453937327489256858825683593750e-5\", \"5.2287743444463866127058793153992155566811561584472656250e-3\", \"9.49398596693121402232511551773946216238940594887656584112333721649128338309222255715733045830942439483758414668436262063880698192055748811167639524982228502529443333539688201437948685066022343441584667892362197265423697997073104183476242310932155094648160217817878533689247152065556146288540676206268e-1\"}},\n           {{\"9.97061023610679164619341463549062609672546386718750e-2\", \"5.8806435521089213125378591939806938171386718750e1\", \"1.31339250305317586137103280435203540286641209041963686984564977317675267872546421630007855518104235103746292194256810045376453068069833982650717834727768128915903290190711155087191155109113681049655966851631090461344965018352997694452739029417934674832819743056725077543693812469593253205921308221308e-59\"}},\n           {{\"9.250672288777586627084303927404107525944709777832031250e-3\", \"6.580410957004390049007724883267655968666076660156250e-2\", \"7.3479441170322764076883455903714667808123745049715180864128469285725740507392126144584630714483987624811982136825764300996419478406647597069868650694836325508907243957328574154916156467594981153576656803869050960269309839419957622805799157028500973756402769602128058256241358541254395091132685326210e-1\"}},\n           {{\"1.2714451115926221973495557904243469238281250e3\", \"6.1883631944992800733018611936131492257118225097656250e-2\", \"1.55634262177085310455272777009125596103461766420555774353254576944288801886851836915203973701385795773437574206488784269131348804974222211728133676956373754063980028710578189114584286886146802067657659439377822750677886486205610448378645450751753499248735236114037268909383185086028320044219137753422\"}},\n           {{\"1.422058718410514757124474272131919860839843750e2\", \"2.49175822061007323782177991233766078948974609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.31499443769464065089935605375459683035642863575091614297392875457512297919442473147075015935528487370816930373009973708163470195938036050657595355692444453780282744702410807810566482106290630446087507470829783752836539009991223629616484834464198297022741851935670638283977884632514115384409382379451e5\"}},\n           {{\"1.7983084647168379888171330094337463378906250e2\", \"5.15740741801222002740900940409574104705825448036193847656250e-5\", \"1.00026780930725147708425182905646433452420215464014520968261578887024273841780021979940791064143678705875846798937060716374571767664452465951073901977576420551043883735274454852404885141087100496560513919957329201186421887438051030917217421635429456043545707951122601188323754670287140035060211268236\"}},\n           {{\"1.416174937472059980336780427023768424987792968750e1\", \"8.06659473408631241819755075539433164522051811218261718750e-4\", \"1.00214037426842670551611147350147052752193345171802567422360034056719592273707967867550926051192650203531759829732673928643729296057128383914827597014066465351929167430158631190618779931772000386360976972135737607634338444086468691888473748375182457345550820744493891034677687786078596412978684852640\"}},\n           {{\"3.036204456962959472021701401445170631632208824157714843750e-4\", \"1.777555595293553447611145656992448493838310241699218750e-2\", \"8.65907453809699509460147409829901675941527854788885630333979265214696163822247505595008528776776735251807610239492515526114770917079309768787319965003601255566849812163333057688474056980168539317656182802355025321396669769362336327872219770789870937515083196007462468888621524361865732646086424336453e-1\"}},\n           {{\"1.8815079698449000716209411621093750e4\", \"1.96075222779542400530772283673286437988281250e2\", \"1.33268783679377583213014321394305562443708551652324893198731298378098553656636607906131354129802125769805603337990709647117721910862833606977379369954861887407787985331605230823250624512728814254652735899657072127956911865541366861599183456838203731048557393074731179271410020592240238165188774584943e838\"}},\n           {{\"8.89727582886910006720881938235834240913391113281250e-1\", \"1.041279960771747739589621062350488500669598579406738281250e-3\", \"9.9987834430235824472224814411122243776265486577981177293571821321821517441659311658576556678112989769575007643432909365063217328716826322973493501036244864951726160136161783061801068077323413577888781728469725649419290963386640028890564993827733767871754809898250945769328951487990853772174957746180e-1\"}},\n           {{\"1.83083205221824460440238624414632795378565788269042968750e-5\", \"8.5130581526808327907929196953773498535156250e1\", \"5.08759465190948202575969824985581134108808966132826957045953621966485495100532942367792704772987024490520063202480279983957515910756497430137889290866515761789926914423548570454774810411630371091100113544891279153106437138536746735808516608107152208446229082973737250416694137957514739571766896873306e-404\"}},\n           {{\"3.346653408259039663751391313617489231546642258763313293457031250e-6\", \"3.7868598858803215989610180258750915527343750e2\", \"3.52212078787830927194297643296251781134291925779877466674871728836105722487573580131785145484495276918545575844013070305855330551951353365366550132397674036846629030890995284036782751533644901503503905390007269189142085867922573306793968734446410118933272999821289312420310855129959801669881803865858e-2074\"}},\n           {{\"5.3392773503090527415166147151559528083453187718987464904785156250e-7\", \"6.207661898675727671229399029506623719498747959733009338378906250e-7\", \"9.99991034310800110010707678195555035460840436574922962233018600570397473321611757701145927433415065972844383465094874922585959664097551124468322387734536918015102243687653110114625528443011692213994065730522520240541725522418247328328568974843758308408263849244150678651666777627782107985602066092068e-1\"}},\n           {{\"2.19994195074324068173154955729842185974121093750e1\", \"3.06707480325778616969678580517211230471730232238769531250e-3\", \"1.00952545862365855685219042115608145190455235613268820530406120489310419092421063376518661644406509494089174786391890344365290616699827245940846567812410266752069452669091303167176618868615804832415636793311353407444727299687139263635273616648724056070625009496090575286667611858626054037393426920940\"}},\n           {{\"9.494261316265068537459392850053063739323988556861877441406250e-6\", \"3.33658593189578134285966370953246951103210449218750e-1\", \"2.10953513637051167906362488703903898283324995313357160919327331939686921714903739192273840983847338772103005796728222224591772689334463276313863779738778665022741134644128703431090827473653846081611135627094959784765932765625500258444912393296945910143335619574776807349923037475968356403544804516261e-2\"}},\n           {{\"1.58204381201744226359551248606294393539428710937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1.699670888752343416014042865036515195242827758193016052246093750e-6\", \"1.00000077966919198536118506000604021848342587459233214812502825319036185927111842640720441778472762148840769009480654434988580516960635247026640481971290957649218368276357248615028690535272593446475039055115505472342603119011692356413204456935489635677140077206818440909527541341514742179392759484948\"}},\n           {{\"7.89159836081502775182242026552614788670325651764869689941406250e-7\", \"4.816961061463680380256846547126770019531250e2\", \"1.94147359401180853490618926342983857830809890106752620847948172427377774972592621604834694930262822082783398795004418901297871494637794539318032606545630879764294273346094400196886499691750495365869112152459387957968585556903274684614177896724684391146995388586545846815713970966406314356957705636188e-2940\"}},\n           {{\"1.289097083842133870348334312438964843750e5\", \"6.9303987741382092058195496520056622102856636047363281250e-3\", \"1.08496647090160629262865176257751429047729744058064486558757367783712447981236338124011887293782800275409466363098994983981904989007840757365461380428739706364354348918768376442904733609028311603151255847131247523710764847675936168535507206845244124708518371354311381017836653040028826211975497871572\"}},\n           {{\"1.88979339146257488413205294364161090925335884094238281250e-3\", \"1.507462797900369366743689170107245445251464843750e1\", \"8.76918423991144038304021445193438173201942067819279237648900596695575024236585474624026460405210909663314261583560910578839787952809598740673148266220449752385049510413309645447866767727463403580780664879153239139760411591518829772808581212853680494395035365090735562853954119264286528501466090236373e-42\"}},\n           {{\"8.41517212362860789198748534545302391052246093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"3.64690954096749919699504971504211425781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.36385641555849335879047779054573450503531219143280186506059811952516602814802026798922317458022305556248077861115239238036534162971730930403784483407045473794360984711531633071954017599185535725837014265828161774595330813847033913388549400091383297967089159291617295023155265969142242902513558326176e3\"}},\n           {{\"7.794539153729454028507461771368980407714843750e1\", \"1.375701859744113164651935221627354621887207031250e1\", \"1.06022076559461302576262215724290203547920286581395364873074659478022575993646868223512587189711310741927159850526321306597320278985726000202501743927791980296512242522543006053260060771089791556404973296770985910119125940674256012428243689156025466514102435785983398909290409351186888763744330929933e26\"}},\n           {{\"1.53996830801468109712004661560058593750e5\", \"1.5575394558063157535165998979209689423441886901855468750e-2\", \"1.20447431374301175187511662239775886280442123057569989101048717965641664163683965122530380365781626549245733448495292659434928101251174655724999866929500920292760069066534315397658186379331270528348085084759405281722204998903474609597521346801285181467380964556686904383585877178604246579963496131145\"}},\n           {{\"1.58292085642406949773430824279785156250e5\", \"2.39839658341223938009534322191029787063598632812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.95369184630899349835322600435195771430552393938403392920497743251505007693757163085390208500076347439614593692001276141903681987497427879862172599262551403341684739246319058993775975522937386429303489479759146923528741632009619169067978673180741577543638362298805900307916877489621750277562246056785e12\"}},\n           {{\"1.3400796278978785267099738121032714843750e4\", \"1.930784873528596304326221400060603627935051918029785156250e-3\", \"1.01851774851557016267678896947673493426952146980838508956199625705868791978344101642179134412654468177801448310465798049263061832294449615311708734175434429497593168411288076223275335865898358255932555661831601275564405349791579099870920484601878548075981946266790952650050188664408833668093366337128\"}},\n           {{\"6.575650904605106461531249806284904479980468750e1\", \"2.95349579102368409166956553235650062561035156250e1\", \"4.92883670959819008737323351550818895693909971573197862669756297233542900030950953480711710193053129535412775508169382249001427538228339649766961919628309117712145393012207284297044617755253176225355208718450804357511545954540599873761726532747435308616642768909463909723766874135347528684022648860560e53\"}},\n           {{\"7.73401481707858096115160151384770870208740234375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2.491481202776960799383232370018959045410156250e2\", \"2.21022119284238444262099118632640694751857489911985882302778583637174384391251394588072250813144879442061174245455228341031066580984347413608919792407019123272438031870871777573323381609534176617167457318208979616222032754767955294734636001910121462806120247278470491361024670390806812831433737112379e221\"}},\n           {{\"1.109788988632283901134001347088542388519272208213806152343750e-5\", \"1.3221937740391638271830743178725242614746093750e1\", \"3.07947867569658321194458380597181231565685445537647073748124994390202466909582021155440785847623999110729024670271166064504654713592331835440877924887265726281088902886492996205474623955394661696347608605548560131153946508949187941058346142181719469523416895370937975489878692955467549849494731965625e-66\"}},\n           {{\"6.01388538493091151515557157836155965924263000488281250e-2\", \"2.600229311077009085274511224206150927784619852900505065917968750e-6\", \"9.99992690524283092045041727666257712294170472055655983655789156306985603524706361035867762480294454684826579379760817381252880474747063748101481751389649370586878847928039436815138481244723824252557644191693486953238362877605577315573573222917218930477592061427550313462645068276263623663297863327092e-1\"}},\n           {{\"2.155348014323840710737556491949362680315971374511718750e-2\", \"4.0581281467163221599037115083774551749229431152343750e-2\", \"8.55799445393602464144976083125961944702079982479924287374752573999342183140040918969698718557087349720031284500593972794455976395816766982409031253828819168807248785638632014800512514311905184872890032777260194266023572565329278809193542262172193713145497824126566400120337339261082686915643720103934e-1\"}},\n           // Integer exponents:\n           {{\"1.250e-01\", \"0.0e+00\", \"1.0e+00\"}},\n           {{\"-1.250e-01\", \"0.0e+00\", \"1.0e+00\"}},\n           {{\"7.50e-01\", \"0.0e+00\", \"1.0e+00\"}},\n           {{\"-7.50e-01\", \"0.0e+00\", \"1.0e+00\"}},\n           {{\"1.0e+00\", \"0.0e+00\", \"1.0e+00\"}},\n           {{\"-1.0e+00\", \"0.0e+00\", \"1.0e+00\"}},\n           {{\"1.250e+00\", \"0.0e+00\", \"1.0e+00\"}},\n           {{\"-1.250e+00\", \"0.0e+00\", \"1.0e+00\"}},\n           {{\"5.5250e+01\", \"0.0e+00\", \"1.0e+00\"}},\n           {{\"-5.5250e+01\", \"0.0e+00\", \"1.0e+00\"}},\n           {{\"1.250e-01\", \"1.0e+00\", \"1.250e-01\"}},\n           {{\"-1.250e-01\", \"1.0e+00\", \"-1.250e-01\"}},\n           {{\"7.50e-01\", \"1.0e+00\", \"7.50e-01\"}},\n           {{\"-7.50e-01\", \"1.0e+00\", \"-7.50e-01\"}},\n           {{\"1.0e+00\", \"1.0e+00\", \"1.0e+00\"}},\n           {{\"-1.0e+00\", \"1.0e+00\", \"-1.0e+00\"}},\n           {{\"1.250e+00\", \"1.0e+00\", \"1.250e+00\"}},\n           {{\"-1.250e+00\", \"1.0e+00\", \"-1.250e+00\"}},\n           {{\"5.5250e+01\", \"1.0e+00\", \"5.5250e+01\"}},\n           {{\"-5.5250e+01\", \"1.0e+00\", \"-5.5250e+01\"}},\n           {{\"1.250e-01\", \"2.0e+00\", \"1.56250e-02\"}},\n           {{\"-1.250e-01\", \"2.0e+00\", \"1.56250e-02\"}},\n           {{\"7.50e-01\", \"2.0e+00\", \"5.6250e-01\"}},\n           {{\"-7.50e-01\", \"2.0e+00\", \"5.6250e-01\"}},\n           {{\"1.0e+00\", \"2.0e+00\", \"1.0e+00\"}},\n           {{\"-1.0e+00\", \"2.0e+00\", \"1.0e+00\"}},\n           {{\"1.250e+00\", \"2.0e+00\", \"1.56250e+00\"}},\n           {{\"-1.250e+00\", \"2.0e+00\", \"1.56250e+00\"}},\n           {{\"5.5250e+01\", \"2.0e+00\", \"3.05256250e+03\"}},\n           {{\"-5.5250e+01\", \"2.0e+00\", \"3.05256250e+03\"}},\n           {{\"1.250e-01\", \"3.0e+00\", \"1.9531250e-03\"}},\n           {{\"-1.250e-01\", \"3.0e+00\", \"-1.9531250e-03\"}},\n           {{\"7.50e-01\", \"3.0e+00\", \"4.218750e-01\"}},\n           {{\"-7.50e-01\", \"3.0e+00\", \"-4.218750e-01\"}},\n           {{\"1.0e+00\", \"3.0e+00\", \"1.0e+00\"}},\n           {{\"-1.0e+00\", \"3.0e+00\", \"-1.0e+00\"}},\n           {{\"1.250e+00\", \"3.0e+00\", \"1.9531250e+00\"}},\n           {{\"-1.250e+00\", \"3.0e+00\", \"-1.9531250e+00\"}},\n           {{\"5.5250e+01\", \"3.0e+00\", \"1.686540781250e+05\"}},\n           {{\"-5.5250e+01\", \"3.0e+00\", \"-1.686540781250e+05\"}},\n           {{\"1.250e-01\", \"4.0e+00\", \"2.441406250e-04\"}},\n           {{\"-1.250e-01\", \"4.0e+00\", \"2.441406250e-04\"}},\n           {{\"7.50e-01\", \"4.0e+00\", \"3.16406250e-01\"}},\n           {{\"-7.50e-01\", \"4.0e+00\", \"3.16406250e-01\"}},\n           {{\"1.0e+00\", \"4.0e+00\", \"1.0e+00\"}},\n           {{\"-1.0e+00\", \"4.0e+00\", \"1.0e+00\"}},\n           {{\"1.250e+00\", \"4.0e+00\", \"2.441406250e+00\"}},\n           {{\"-1.250e+00\", \"4.0e+00\", \"2.441406250e+00\"}},\n           {{\"5.5250e+01\", \"4.0e+00\", \"9.318137816406250e+06\"}},\n           {{\"-5.5250e+01\", \"4.0e+00\", \"9.318137816406250e+06\"}},\n           {{\"1.250e-01\", \"5.0e+00\", \"3.05175781250e-05\"}},\n           {{\"-1.250e-01\", \"5.0e+00\", \"-3.05175781250e-05\"}},\n           {{\"7.50e-01\", \"5.0e+00\", \"2.3730468750e-01\"}},\n           {{\"-7.50e-01\", \"5.0e+00\", \"-2.3730468750e-01\"}},\n           {{\"1.0e+00\", \"5.0e+00\", \"1.0e+00\"}},\n           {{\"-1.0e+00\", \"5.0e+00\", \"-1.0e+00\"}},\n           {{\"1.250e+00\", \"5.0e+00\", \"3.05175781250e+00\"}},\n           {{\"-1.250e+00\", \"5.0e+00\", \"-3.05175781250e+00\"}},\n           {{\"5.5250e+01\", \"5.0e+00\", \"5.1482711435644531250e+08\"}},\n           {{\"-5.5250e+01\", \"5.0e+00\", \"-5.1482711435644531250e+08\"}},\n           {{\"1.250e-01\", \"6.0e+00\", \"3.8146972656250e-06\"}},\n           {{\"-1.250e-01\", \"6.0e+00\", \"3.8146972656250e-06\"}},\n           {{\"7.50e-01\", \"6.0e+00\", \"1.779785156250e-01\"}},\n           {{\"-7.50e-01\", \"6.0e+00\", \"1.779785156250e-01\"}},\n           {{\"1.0e+00\", \"6.0e+00\", \"1.0e+00\"}},\n           {{\"-1.0e+00\", \"6.0e+00\", \"1.0e+00\"}},\n           {{\"1.250e+00\", \"6.0e+00\", \"3.8146972656250e+00\"}},\n           {{\"-1.250e+00\", \"6.0e+00\", \"3.8146972656250e+00\"}},\n           {{\"5.5250e+01\", \"6.0e+00\", \"2.84441980681936035156250e+10\"}},\n           {{\"-5.5250e+01\", \"6.0e+00\", \"2.84441980681936035156250e+10\"}},\n           {{\"1.250e-01\", \"7.0e+00\", \"4.768371582031250e-07\"}},\n           {{\"-1.250e-01\", \"7.0e+00\", \"-4.768371582031250e-07\"}},\n           {{\"7.50e-01\", \"7.0e+00\", \"1.33483886718750e-01\"}},\n           {{\"-7.50e-01\", \"7.0e+00\", \"-1.33483886718750e-01\"}},\n           {{\"1.0e+00\", \"7.0e+00\", \"1.0e+00\"}},\n           {{\"-1.0e+00\", \"7.0e+00\", \"-1.0e+00\"}},\n           {{\"1.250e+00\", \"7.0e+00\", \"4.768371582031250e+00\"}},\n           {{\"-1.250e+00\", \"7.0e+00\", \"-4.768371582031250e+00\"}},\n           {{\"5.5250e+01\", \"7.0e+00\", \"1.571541943267696594238281250e+12\"}},\n           {{\"-5.5250e+01\", \"7.0e+00\", \"-1.571541943267696594238281250e+12\"}},\n           {{\"1.250e-01\", \"8.0e+00\", \"5.96046447753906250e-08\"}},\n           {{\"-1.250e-01\", \"8.0e+00\", \"5.96046447753906250e-08\"}},\n           {{\"7.50e-01\", \"8.0e+00\", \"1.0011291503906250e-01\"}},\n           {{\"-7.50e-01\", \"8.0e+00\", \"1.0011291503906250e-01\"}},\n           {{\"1.0e+00\", \"8.0e+00\", \"1.0e+00\"}},\n           {{\"-1.0e+00\", \"8.0e+00\", \"1.0e+00\"}},\n           {{\"1.250e+00\", \"8.0e+00\", \"5.96046447753906250e+00\"}},\n           {{\"-1.250e+00\", \"8.0e+00\", \"5.96046447753906250e+00\"}},\n           {{\"5.5250e+01\", \"8.0e+00\", \"8.682769236554023683166503906250e+13\"}},\n           {{\"-5.5250e+01\", \"8.0e+00\", \"8.682769236554023683166503906250e+13\"}},\n           {{\"1.250e-01\", \"9.0e+00\", \"7.4505805969238281250e-09\"}},\n           {{\"-1.250e-01\", \"9.0e+00\", \"-7.4505805969238281250e-09\"}},\n           {{\"7.50e-01\", \"9.0e+00\", \"7.50846862792968750e-02\"}},\n           {{\"-7.50e-01\", \"9.0e+00\", \"-7.50846862792968750e-02\"}},\n           {{\"1.0e+00\", \"9.0e+00\", \"1.0e+00\"}},\n           {{\"-1.0e+00\", \"9.0e+00\", \"-1.0e+00\"}},\n           {{\"1.250e+00\", \"9.0e+00\", \"7.4505805969238281250e+00\"}},\n           {{\"-1.250e+00\", \"9.0e+00\", \"-7.4505805969238281250e+00\"}},\n           {{\"5.5250e+01\", \"9.0e+00\", \"4.7972300031960980849494934082031250e+15\"}},\n           {{\"-5.5250e+01\", \"9.0e+00\", \"-4.7972300031960980849494934082031250e+15\"}},\n           {{\"1.250e-01\", \"1.0e+01\", \"9.313225746154785156250e-10\"}},\n           {{\"-1.250e-01\", \"1.0e+01\", \"9.313225746154785156250e-10\"}},\n           {{\"7.50e-01\", \"1.0e+01\", \"5.6313514709472656250e-02\"}},\n           {{\"-7.50e-01\", \"1.0e+01\", \"5.6313514709472656250e-02\"}},\n           {{\"1.0e+00\", \"1.0e+01\", \"1.0e+00\"}},\n           {{\"-1.0e+00\", \"1.0e+01\", \"1.0e+00\"}},\n           {{\"1.250e+00\", \"1.0e+01\", \"9.313225746154785156250e+00\"}},\n           {{\"-1.250e+00\", \"1.0e+01\", \"9.313225746154785156250e+00\"}},\n           {{\"5.5250e+01\", \"1.0e+01\", \"2.65046957676584419193459510803222656250e+17\"}},\n           {{\"-5.5250e+01\", \"1.0e+01\", \"2.65046957676584419193459510803222656250e+17\"}},\n           {{\"1.250e-01\", \"1.10e+01\", \"1.164153218269348144531250e-10\"}},\n           {{\"-1.250e-01\", \"1.10e+01\", \"-1.164153218269348144531250e-10\"}},\n           {{\"7.50e-01\", \"1.10e+01\", \"4.223513603210449218750e-02\"}},\n           {{\"-7.50e-01\", \"1.10e+01\", \"-4.223513603210449218750e-02\"}},\n           {{\"1.0e+00\", \"1.10e+01\", \"1.0e+00\"}},\n           {{\"-1.0e+00\", \"1.10e+01\", \"-1.0e+00\"}},\n           {{\"1.250e+00\", \"1.10e+01\", \"1.164153218269348144531250e+01\"}},\n           {{\"-1.250e+00\", \"1.10e+01\", \"-1.164153218269348144531250e+01\"}},\n           {{\"5.5250e+01\", \"1.10e+01\", \"1.464384441163128916043863797187805175781250e+19\"}},\n           {{\"-5.5250e+01\", \"1.10e+01\", \"-1.464384441163128916043863797187805175781250e+19\"}},\n           {{\"1.250e-01\", \"1.20e+01\", \"1.45519152283668518066406250e-11\"}},\n           {{\"-1.250e-01\", \"1.20e+01\", \"1.45519152283668518066406250e-11\"}},\n           {{\"7.50e-01\", \"1.20e+01\", \"3.16763520240783691406250e-02\"}},\n           {{\"-7.50e-01\", \"1.20e+01\", \"3.16763520240783691406250e-02\"}},\n           {{\"1.0e+00\", \"1.20e+01\", \"1.0e+00\"}},\n           {{\"-1.0e+00\", \"1.20e+01\", \"1.0e+00\"}},\n           {{\"1.250e+00\", \"1.20e+01\", \"1.45519152283668518066406250e+01\"}},\n           {{\"-1.250e+00\", \"1.20e+01\", \"1.45519152283668518066406250e+01\"}},\n           {{\"5.5250e+01\", \"1.20e+01\", \"8.090724037426287261142347479462623596191406250e+20\"}},\n           {{\"-5.5250e+01\", \"1.20e+01\", \"8.090724037426287261142347479462623596191406250e+20\"}},\n           {{\"1.250e-01\", \"1.30e+01\", \"1.8189894035458564758300781250e-12\"}},\n           {{\"-1.250e-01\", \"1.30e+01\", \"-1.8189894035458564758300781250e-12\"}},\n           {{\"7.50e-01\", \"1.30e+01\", \"2.3757264018058776855468750e-02\"}},\n           {{\"-7.50e-01\", \"1.30e+01\", \"-2.3757264018058776855468750e-02\"}},\n           {{\"1.0e+00\", \"1.30e+01\", \"1.0e+00\"}},\n           {{\"-1.0e+00\", \"1.30e+01\", \"-1.0e+00\"}},\n           {{\"1.250e+00\", \"1.30e+01\", \"1.8189894035458564758300781250e+01\"}},\n           {{\"-1.250e+00\", \"1.30e+01\", \"-1.8189894035458564758300781250e+01\"}},\n           {{\"5.5250e+01\", \"1.30e+01\", \"4.4701250306780237117811469824030995368957519531250e+22\"}},\n           {{\"-5.5250e+01\", \"1.30e+01\", \"-4.4701250306780237117811469824030995368957519531250e+22\"}},\n           {{\"1.250e-01\", \"1.40e+01\", \"2.273736754432320594787597656250e-13\"}},\n           {{\"-1.250e-01\", \"1.40e+01\", \"2.273736754432320594787597656250e-13\"}},\n           {{\"7.50e-01\", \"1.40e+01\", \"1.781794801354408264160156250e-02\"}},\n           {{\"-7.50e-01\", \"1.40e+01\", \"1.781794801354408264160156250e-02\"}},\n           {{\"1.0e+00\", \"1.40e+01\", \"1.0e+00\"}},\n           {{\"-1.0e+00\", \"1.40e+01\", \"1.0e+00\"}},\n           {{\"1.250e+00\", \"1.40e+01\", \"2.273736754432320594787597656250e+01\"}},\n           {{\"-1.250e+00\", \"1.40e+01\", \"2.273736754432320594787597656250e+01\"}},\n           {{\"5.5250e+01\", \"1.40e+01\", \"2.46974407944960810075908370777771249413490295410156250e+24\"}},\n           {{\"-5.5250e+01\", \"1.40e+01\", \"2.46974407944960810075908370777771249413490295410156250e+24\"}},\n           {{\"1.250e-01\", \"1.50e+01\", \"2.84217094304040074348449707031250e-14\"}},\n           {{\"-1.250e-01\", \"1.50e+01\", \"-2.84217094304040074348449707031250e-14\"}},\n           {{\"7.50e-01\", \"1.50e+01\", \"1.33634610101580619812011718750e-02\"}},\n           {{\"-7.50e-01\", \"1.50e+01\", \"-1.33634610101580619812011718750e-02\"}},\n           {{\"1.0e+00\", \"1.50e+01\", \"1.0e+00\"}},\n           {{\"-1.0e+00\", \"1.50e+01\", \"-1.0e+00\"}},\n           {{\"1.250e+00\", \"1.50e+01\", \"2.84217094304040074348449707031250e+01\"}},\n           {{\"-1.250e+00\", \"1.50e+01\", \"-2.84217094304040074348449707031250e+01\"}},\n           {{\"5.5250e+01\", \"1.50e+01\", \"1.364533603895908475669393748547186153009533882141113281250e+26\"}},\n           {{\"-5.5250e+01\", \"1.50e+01\", \"-1.364533603895908475669393748547186153009533882141113281250e+26\"}},\n           {{\"1.250e-01\", \"1.60e+01\", \"3.5527136788005009293556213378906250e-15\"}},\n           {{\"-1.250e-01\", \"1.60e+01\", \"3.5527136788005009293556213378906250e-15\"}},\n           {{\"7.50e-01\", \"1.60e+01\", \"1.0022595757618546485900878906250e-02\"}},\n           {{\"-7.50e-01\", \"1.60e+01\", \"1.0022595757618546485900878906250e-02\"}},\n           {{\"1.0e+00\", \"1.60e+01\", \"1.0e+00\"}},\n           {{\"-1.0e+00\", \"1.60e+01\", \"1.0e+00\"}},\n           {{\"1.250e+00\", \"1.60e+01\", \"3.5527136788005009293556213378906250e+01\"}},\n           {{\"-1.250e+00\", \"1.60e+01\", \"3.5527136788005009293556213378906250e+01\"}},\n           {{\"5.5250e+01\", \"1.60e+01\", \"7.539048161524894328073400460723203495377674698829650878906250e+27\"}},\n           {{\"-5.5250e+01\", \"1.60e+01\", \"7.539048161524894328073400460723203495377674698829650878906250e+27\"}},\n           {{\"1.250e-01\", \"1.70e+01\", \"4.440892098500626161694526672363281250e-16\"}},\n           {{\"-1.250e-01\", \"1.70e+01\", \"-4.440892098500626161694526672363281250e-16\"}},\n           {{\"7.50e-01\", \"1.70e+01\", \"7.51694681821390986442565917968750e-03\"}},\n           {{\"-7.50e-01\", \"1.70e+01\", \"-7.51694681821390986442565917968750e-03\"}},\n           {{\"1.0e+00\", \"1.70e+01\", \"1.0e+00\"}},\n           {{\"-1.0e+00\", \"1.70e+01\", \"-1.0e+00\"}},\n           {{\"1.250e+00\", \"1.70e+01\", \"4.440892098500626161694526672363281250e+01\"}},\n           {{\"-1.250e+00\", \"1.70e+01\", \"-4.440892098500626161694526672363281250e+01\"}},\n           {{\"5.5250e+01\", \"1.70e+01\", \"4.1653241092425041162605537545495699311961652711033821105957031250e+29\"}},\n           {{\"-5.5250e+01\", \"1.70e+01\", \"-4.1653241092425041162605537545495699311961652711033821105957031250e+29\"}},\n           {{\"1.250e-01\", \"1.80e+01\", \"5.55111512312578270211815834045410156250e-17\"}},\n           {{\"-1.250e-01\", \"1.80e+01\", \"5.55111512312578270211815834045410156250e-17\"}},\n           {{\"7.50e-01\", \"1.80e+01\", \"5.6377101136604323983192443847656250e-03\"}},\n           {{\"-7.50e-01\", \"1.80e+01\", \"5.6377101136604323983192443847656250e-03\"}},\n           {{\"1.0e+00\", \"1.80e+01\", \"1.0e+00\"}},\n           {{\"-1.0e+00\", \"1.80e+01\", \"1.0e+00\"}},\n           {{\"1.250e+00\", \"1.80e+01\", \"5.55111512312578270211815834045410156250e+01\"}},\n           {{\"-1.250e+00\", \"1.80e+01\", \"5.55111512312578270211815834045410156250e+01\"}},\n           {{\"5.5250e+01\", \"1.80e+01\", \"2.30134157035648352423395594938863738698588131228461861610412597656250e+31\"}},\n           {{\"-5.5250e+01\", \"1.80e+01\", \"2.30134157035648352423395594938863738698588131228461861610412597656250e+31\"}},\n           {{\"1.250e-01\", \"1.90e+01\", \"6.9388939039072283776476979255676269531250e-18\"}},\n           {{\"-1.250e-01\", \"1.90e+01\", \"-6.9388939039072283776476979255676269531250e-18\"}},\n           {{\"7.50e-01\", \"1.90e+01\", \"4.228282585245324298739433288574218750e-03\"}},\n           {{\"-7.50e-01\", \"1.90e+01\", \"-4.228282585245324298739433288574218750e-03\"}},\n           {{\"1.0e+00\", \"1.90e+01\", \"1.0e+00\"}},\n           {{\"-1.0e+00\", \"1.90e+01\", \"-1.0e+00\"}},\n           {{\"1.250e+00\", \"1.90e+01\", \"6.9388939039072283776476979255676269531250e+01\"}},\n           {{\"-1.250e+00\", \"1.90e+01\", \"-6.9388939039072283776476979255676269531250e+01\"}},\n           {{\"5.5250e+01\", \"1.90e+01\", \"1.271491217621957147139260662037222156309699425037251785397529602050781250e+33\"}},\n           {{\"-5.5250e+01\", \"1.90e+01\", \"-1.271491217621957147139260662037222156309699425037251785397529602050781250e+33\"}},\n           {{\n               \"-1\",\n               \"18446744073709551615\",\n               \"-1\",\n           }},\n           {{\n               \"-1\",\n               \"18446744073709551614\",\n               \"1\",\n           }},\n       }};\n\n   unsigned max_err = 0;\n   for (unsigned k = 0; k < data.size(); k++)\n   {\n      T        val = pow(T(data[k][0]), T(data[k][1]));\n      T        e   = relative_error(val, T(data[k][2]));\n      unsigned err = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         max_err = err;\n      }\n      val = pow(T(data[k][0]), -T(data[k][1]));\n      e   = relative_error(val, T(1 / T(data[k][2])));\n      err = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         max_err = err;\n      }\n   }\n   std::cout << \"Max error was: \" << max_err << std::endl;\n   //\n   // Special cases come last:\n   //\n   BOOST_CHECK_EQUAL(pow(T(0), T(0)), 1);\n   BOOST_CHECK_EQUAL(pow(T(0), 0), 1);\n   BOOST_CHECK_EQUAL(pow(T(0), T(2)), 0);\n   BOOST_CHECK_EQUAL(pow(T(0), 2), 0);\n   BOOST_CHECK_EQUAL(pow(T(1), T(0)), 1);\n   BOOST_CHECK_EQUAL(pow(T(1), 0), 1);\n   BOOST_CHECK_EQUAL(pow(T(1), T(2)), 1);\n   BOOST_CHECK_EQUAL(pow(T(1), 2), 1);\n\n   if (!boost::multiprecision::is_interval_number<T>::value)\n   {\n      T bug_case = -1.05 * log((std::numeric_limits<T>::max)()) / log(T(1.01));\n\n      for (unsigned i = 0; i < 100; ++i, bug_case *= 1.05)\n      {\n         if (std::numeric_limits<T>::has_infinity)\n         {\n            BOOST_CHECK_EQUAL(pow(T(1.01), bug_case), 0);\n         }\n         else\n         {\n            BOOST_CHECK_LE(pow(T(1.01), bug_case), (std::numeric_limits<T>::min)());\n         }\n      }\n   }\n}\n\nint main()\n{\n#ifdef TEST_BACKEND\n   test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();\n#endif\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::mpf_float_50>();\n   test<boost::multiprecision::mpf_float_100>();\n#endif\n#ifdef TEST_MPFR_50\n   test<boost::multiprecision::mpfr_float_50>();\n   test<boost::multiprecision::mpfr_float_100>();\n#endif\n#ifdef TEST_MPFI_50\n   test<boost::multiprecision::mpfi_float_50>();\n   test<boost::multiprecision::mpfi_float_100>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>();\n   test<boost::multiprecision::cpp_dec_float_100>();\n#ifndef SLOW_COMPLER\n   // Some \"peculiar\" digit counts which stress our code:\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();\n   // Check low multiprecision digit counts.\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >();\n#endif\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_preserve_all_precision.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <thread>\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include <boost/math/special_functions/relative_difference.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#include <boost/math/quadrature/tanh_sinh.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF) && !defined(TEST_MPFR) && !defined(TEST_MPFI) && !defined(TEST_MPC)\n#define TEST_MPF\n#define TEST_MPFR\n#define TEST_MPFI\n#define TEST_MPC\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#if defined(TEST_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_MPFI)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#if defined(TEST_MPC)\n#include <boost/multiprecision/mpc.hpp>\n#endif\n\ntemplate <class T>\nT new_value()\n{\n   return T(\"0.1\");\n}\n\ntemplate <class Other>\nOther make_other_big_value()\n{\n   if constexpr (std::numeric_limits<Other>::is_integer && !std::numeric_limits<Other>::is_bounded)\n      return (Other(1) << 1000) + 1;\n   else if constexpr (!std::numeric_limits<Other>::is_integer && std::numeric_limits<Other>::is_exact && (std::numeric_limits<Other>::max_exponent == std::numeric_limits<Other>::min_exponent))\n   {\n      using value_type = typename Other::value_type;\n      return Other(1) / ((value_type(1) << 1000) + 1);\n   }\n   else if constexpr (std::numeric_limits<Other>::is_integer)\n   {\n      return (std::numeric_limits<Other>::max)();\n   }\n   else\n   {\n      using std::ldexp;\n      return ldexp(Other(1) / 3, 30);\n   }\n}\n\ntemplate <class T>\nunsigned precision_of(const T&)\n{\n   return std::numeric_limits<T>::min_exponent ? std::numeric_limits<T>::digits10 : 1 + std::numeric_limits<T>::digits10;\n}\n\ntemplate <class Backend, boost::multiprecision::expression_template_option ET>\ntypename std::enable_if<boost::multiprecision::detail::is_variable_precision<boost::multiprecision::number<Backend, ET> >::value, unsigned>::type \n   precision_of(const boost::multiprecision::number<Backend, ET>& val)\n{\n   return val.precision();\n}\ntemplate <class Backend, boost::multiprecision::expression_template_option ET>\ntypename std::enable_if<!boost::multiprecision::detail::is_variable_precision<boost::multiprecision::number<Backend, ET> >::value &&\n    std::numeric_limits<boost::multiprecision::number<Backend, ET>>::is_integer \n   && !std::numeric_limits<boost::multiprecision::number<Backend, ET>>::is_bounded, unsigned>::type \n   precision_of(const boost::multiprecision::number<Backend, ET>& val)\n{\n   return 1 + boost::multiprecision::detail::digits2_2_10(1 + msb(val) - lsb(val));\n}\ntemplate <class Backend, boost::multiprecision::expression_template_option ET>\ntypename std::enable_if<!boost::multiprecision::detail::is_variable_precision<boost::multiprecision::number<Backend, ET> >::value &&\n    !std::numeric_limits<boost::multiprecision::number<Backend, ET>>::is_integer \n   && std::numeric_limits<boost::multiprecision::number<Backend, ET>>::is_exact, unsigned>::type \n   precision_of(const boost::multiprecision::number<Backend, ET>& val)\n{\n   return (std::max)(precision_of(numerator(val)), precision_of(denominator(val)));\n}\n\ntemplate <class T, class Other>\nvoid test_mixed()\n{\n   T::thread_default_precision(10);\n   T::thread_default_variable_precision_options(boost::multiprecision::variable_precision_options::preserve_all_precision);\n   Other big_a(make_other_big_value<Other>()), big_b(make_other_big_value<Other>()), big_c(make_other_big_value<Other>()), big_d(make_other_big_value<Other>());\n\n   unsigned target_precision;\n   if constexpr (std::is_integral_v<Other>)\n   {\n      if constexpr (std::is_unsigned_v<Other>)\n      {\n         using backend_t = typename T::backend_type;\n         using smallest_unsigned = std::tuple_element_t<0, typename backend_t::unsigned_types>;\n         target_precision        = (std::max)(T::thread_default_precision(), (std::max)(precision_of(big_a), precision_of(smallest_unsigned(0))));\n      }\n      else\n      {\n         using backend_t = typename T::backend_type;\n         using smallest_signed = std::tuple_element_t<0, typename backend_t::signed_types>;\n         target_precision        = (std::max)(T::thread_default_precision(), (std::max)(precision_of(big_a), precision_of(smallest_signed(0))));\n      }\n   }\n   else if constexpr (std::is_floating_point_v<Other>)\n   {\n      using backend_t         = typename T::backend_type;\n      using smallest_float = std::tuple_element_t<0, typename backend_t::float_types>;\n      target_precision        = (std::max)(T::thread_default_precision(), (std::max)(precision_of(big_a), precision_of(smallest_float(0))));\n   }\n   else\n      target_precision = (std::max)(T::thread_default_precision(), precision_of(big_a));\n\n   T a(big_a);\n   // We don't guarentee equivalent decimal precision, only that we can round trip (same number of bits):\n   BOOST_CHECK_LE(std::abs((int)a.precision() - (int)target_precision), 2);\n   if constexpr(!std::numeric_limits<Other>::is_exact || std::numeric_limits<Other>::is_integer)\n   {\n      BOOST_CHECK_EQUAL(static_cast<Other>(a), big_a);\n   }\n   else\n   {\n      // Other is a rational - we can't round trip!\n      T r = static_cast<T>(static_cast<Other>(a));\n      if constexpr ((boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_floating_point) && std::is_same_v<T, typename T::value_type>)\n      {// doesn't work for intervals:\n         BOOST_CHECK_EQUAL(r, a);\n      }\n   }\n   T b(std::move(big_d));\n   BOOST_CHECK_LE(std::abs((int)b.precision() - (int)target_precision), 2);\n   if constexpr (std::is_assignable_v<T, Other>)\n   {\n      a = new_value<T>();\n      BOOST_CHECK_EQUAL(a.precision(), T::thread_default_precision());\n      a = big_b;\n      BOOST_CHECK_LE(std::abs((int)a.precision() - (int)target_precision), 2);\n      if constexpr (!std::numeric_limits<Other>::is_exact || std::numeric_limits<Other>::is_integer)\n      {\n         BOOST_CHECK_EQUAL(static_cast<Other>(a), big_b);\n      }\n      else\n      {\n         // Other is a rational - we can't round trip!\n         T r = static_cast<T>(static_cast<Other>(a));\n         BOOST_CHECK_EQUAL(r, a);\n      }\n      b = new_value<T>();\n      BOOST_CHECK_EQUAL(b.precision(), T::thread_default_precision());\n      b = std::move(big_c);\n      BOOST_CHECK_LE(std::abs((int)b.precision() - (int)target_precision), 2);\n      b = new_value<T>();\n      BOOST_CHECK_EQUAL(b.precision(), T::thread_default_precision());\n\n      if constexpr (!std::is_assignable_v<Other, T>)\n      {\n         a = new_value<T>();\n         BOOST_CHECK_EQUAL(a.precision(), T::thread_default_precision());\n         a = b + big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a = new_value<T>();\n         BOOST_CHECK_EQUAL(a.precision(), T::thread_default_precision());\n         a = b * big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a = new_value<T>();\n         BOOST_CHECK_EQUAL(a.precision(), T::thread_default_precision());\n         a = b - big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a = new_value<T>();\n         BOOST_CHECK_EQUAL(a.precision(), T::thread_default_precision());\n         a = b / big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a = new_value<T>();\n         BOOST_CHECK_EQUAL(a.precision(), T::thread_default_precision());\n         a += big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a = new_value<T>();\n         BOOST_CHECK_EQUAL(a.precision(), T::thread_default_precision());\n         a -= big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a = new_value<T>();\n         BOOST_CHECK_EQUAL(a.precision(), T::thread_default_precision());\n         a *= big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a = new_value<T>();\n         BOOST_CHECK_EQUAL(a.precision(), T::thread_default_precision());\n         a /= big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n      }\n   }\n   if constexpr (!std::is_same_v<T, typename T::value_type>)\n   {\n      T cc(big_a, big_b);\n      BOOST_CHECK_LE(std::abs((int)cc.precision() - (int)target_precision), 2);\n      T dd(big_a, big_b, 55);\n      BOOST_CHECK_EQUAL(dd.precision(), 55);\n      T aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 10);\n      aa.assign(big_a);\n      BOOST_CHECK_LE(std::abs((int)aa.precision() - (int)target_precision), 2);\n      aa.assign(big_a, big_b);\n      BOOST_CHECK_LE(std::abs((int)aa.precision() - (int)target_precision), 2);\n      if constexpr (0 && std::is_constructible_v<T, Other, Other, int>)\n      {\n         aa.assign(big_a, big_b, 55);\n         BOOST_CHECK_EQUAL(aa.precision(), 55);\n      }\n   }\n   else\n   {\n      if constexpr (std::is_constructible_v<T, Other, int>)\n      {\n         T aa(big_a, 55);\n         BOOST_CHECK_EQUAL(aa.precision(), 55);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), T::thread_default_precision());\n         aa.assign(big_a, 55);\n         BOOST_CHECK_EQUAL(aa.precision(), 55);\n      }\n      else\n      {\n         T aa;\n         BOOST_CHECK_EQUAL(aa.precision(), T::thread_default_precision());\n         aa.assign(big_a);\n         BOOST_CHECK_EQUAL(aa.precision(), target_precision);\n      }\n   }\n}\n\n\ntemplate <class T>\nvoid test()\n{\n   T::thread_default_precision(100);\n   T::thread_default_variable_precision_options(boost::multiprecision::variable_precision_options::preserve_all_precision);\n\n   T hp1(\"0.1\"), hp2(\"0.3\"), hp3(\"0.11\"), hp4(\"0.1231\");\n\n   BOOST_CHECK_EQUAL(hp1.precision(), 100);\n   BOOST_CHECK_EQUAL(hp2.precision(), 100);\n\n   T::thread_default_precision(35);\n\n   T a(hp1);\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a = hp1;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a = std::move(hp1);\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   T b(std::move(hp2));\n   BOOST_CHECK_EQUAL(b.precision(), 100);\n   b = new_value<T>();\n   BOOST_CHECK_EQUAL(b.precision(), 35);\n\n   a = b + hp3;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a = hp3 * b;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a += hp3;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a *= hp4;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a -= b * hp3;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n\n   if constexpr (!std::is_same_v<T, typename T::value_type>)\n   {\n      //\n      // If we have a component type: ie we are an interval or a complex number, then\n      // operations involving the component type should match those of T:\n      //\n      using component_t = typename T::value_type;\n      component_t::thread_default_precision(100);\n      component_t::thread_default_variable_precision_options(boost::multiprecision::variable_precision_options::preserve_source_precision);\n\n      component_t cp1(\"0.1\"), cp2(\"0.3\"), cp3(\"0.11\"), cp4(\"0.1231\");\n\n      BOOST_CHECK_EQUAL(cp1.precision(), 100);\n      BOOST_CHECK_EQUAL(cp2.precision(), 100);\n\n      component_t::thread_default_precision(35);\n\n      T aa(cp1);\n      BOOST_CHECK_EQUAL(aa.precision(), 100);\n      T cc(cp1, cp2);\n      BOOST_CHECK_EQUAL(cc.precision(), 100);\n      T dd(cp1, cp2, 55);\n      BOOST_CHECK_EQUAL(dd.precision(), 55);\n      aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      if constexpr (std::is_assignable_v<T, component_t>)\n      {\n         aa = cp1;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa = std::move(cp1);\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n      }\n      T bb(std::move(cp2));\n      BOOST_CHECK_EQUAL(bb.precision(), 100);\n      bb = new_value<T>();\n      BOOST_CHECK_EQUAL(bb.precision(), 35);\n\n      if constexpr (boost::multiprecision::is_compatible_arithmetic_type<component_t, T>::value)\n      {\n         aa = bb + cp3;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa = cp3 * bb;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa += cp3;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         aa -= cp3;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa *= cp4;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         aa /= cp4;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa -= bb * cp3;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n      }\n      aa.assign(cp1);\n      BOOST_CHECK_EQUAL(aa.precision(), 100);\n      aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(cp1, cp2);\n      BOOST_CHECK_EQUAL(aa.precision(), 100);\n      aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(cp1, cp2, 20);\n      BOOST_CHECK_EQUAL(aa.precision(), 20);\n      aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n   }\n   else\n   {\n      T aa(hp4, 20);\n      BOOST_CHECK_EQUAL(aa.precision(), 20);\n      aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(hp4);\n      BOOST_CHECK_EQUAL(aa.precision(), 100);\n      aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(hp4, 20);\n      BOOST_CHECK_EQUAL(aa.precision(), 20);\n   }\n\n   test_mixed<T, char>();\n   test_mixed<T, unsigned char>();\n   test_mixed<T, signed char>();\n   test_mixed<T, short>();\n   test_mixed<T, unsigned short>();\n   test_mixed<T, int>();\n   test_mixed<T, unsigned int>();\n   test_mixed<T, long>();\n   test_mixed<T, unsigned long>();\n   test_mixed<T, long long>();\n   test_mixed<T, unsigned long long>();\n   test_mixed<T, float>();\n   test_mixed<T, double>();\n   test_mixed<T, long double>();\n   //\n   // Test with other compatible multiprecision types:\n   //\n   test_mixed<T, boost::multiprecision::mpz_int>();\n   test_mixed<T, boost::multiprecision::cpp_int>();\n   test_mixed<T, boost::multiprecision::mpq_rational>();\n   test_mixed<T, boost::multiprecision::cpp_rational>();\n   test_mixed<T, boost::multiprecision::cpp_bin_float_100>();\n   // cpp_dec_float has guard digits which breaks our tests:\n   //test_mixed<T, boost::multiprecision::cpp_dec_float_100>();\n#if !defined(TEST_MPFR) && !defined(TEST_MPFI) && !defined(TEST_MPC)\n   test_mixed<T, boost::multiprecision::mpf_float_100>();\n#endif\n#if defined(TEST_MPFR) || defined(TEST_MPC) || defined(TEST_MPFI)\n   test_mixed<T, boost::multiprecision::mpfr_float_100>();\n#endif\n}\n\nint main()\n{\n#ifdef TEST_MPF\n   test<boost::multiprecision::mpf_float>();\n   test<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, boost::multiprecision::et_off>>();\n#endif\n#ifdef TEST_MPFR\n   test<boost::multiprecision::mpfr_float>();\n   test<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off> >();\n#endif\n#ifdef TEST_MPFI\n   test<boost::multiprecision::mpfi_float>();\n   test<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, boost::multiprecision::et_off> >();\n#endif\n#ifdef TEST_MPC\n   test<boost::multiprecision::mpc_complex>();\n   test<boost::multiprecision::number<boost::multiprecision::mpc_complex_backend<0>, boost::multiprecision::et_off> >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_preserve_component_precision.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <thread>\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include <boost/math/special_functions/relative_difference.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#include <boost/math/quadrature/tanh_sinh.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF) && !defined(TEST_MPFR) && !defined(TEST_MPFI) && !defined(TEST_MPC)\n#define TEST_MPF\n#define TEST_MPFR\n#define TEST_MPFI\n#define TEST_MPC\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#if defined(TEST_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_MPFI)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#if defined(TEST_MPC)\n#include <boost/multiprecision/mpc.hpp>\n#endif\n\ntemplate <class T>\nT new_value()\n{\n   return T(\"0.1\");\n}\n\ntemplate <class Other>\nOther make_other_big_value()\n{\n   if constexpr (std::numeric_limits<Other>::is_integer && !std::numeric_limits<Other>::is_bounded)\n      return (Other(1) << 1000) + 1;\n   else if constexpr (!std::numeric_limits<Other>::is_integer && std::numeric_limits<Other>::is_exact && (std::numeric_limits<Other>::max_exponent == std::numeric_limits<Other>::min_exponent))\n   {\n      using value_type = typename Other::value_type;\n      return Other(1) / ((value_type(1) << 1000) + 1);\n   }\n   else\n      return (std::numeric_limits<Other>::max)();\n}\n\ntemplate <class T, class Other>\nvoid test_mixed()\n{\n   T::thread_default_precision(10);\n   T::thread_default_variable_precision_options(boost::multiprecision::variable_precision_options::preserve_component_precision);\n   Other big_a(make_other_big_value<Other>()), big_b(make_other_big_value<Other>()), big_c(make_other_big_value<Other>()), big_d(make_other_big_value<Other>());\n\n   unsigned target_precision;\n   if constexpr (std::is_same<Other, typename T::value_type>::value)\n      target_precision = Other::thread_default_precision();\n   else\n      target_precision = T::thread_default_precision();\n\n   T a(big_a);\n   BOOST_CHECK_EQUAL(a.precision(), target_precision);\n   T b(std::move(big_d));\n   BOOST_CHECK_EQUAL(b.precision(), target_precision);\n   if constexpr (std::is_assignable_v<T, Other>)\n   {\n      a = big_b;\n      BOOST_CHECK_EQUAL(a.precision(), target_precision);\n      b = std::move(big_c);\n      BOOST_CHECK_EQUAL(b.precision(), target_precision);\n\n      if constexpr (!std::is_assignable_v<Other, T>)\n      {\n         a = b + big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a = b * big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a = b - big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a = b / big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a += big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a -= big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a *= big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a /= big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n      }\n   }\n   if constexpr (!std::is_same_v<T, typename T::value_type>)\n   {\n      T cc(big_a, big_b);\n      BOOST_CHECK_EQUAL(cc.precision(), target_precision);\n      T dd(big_a, big_b, 55);\n      BOOST_CHECK_EQUAL(dd.precision(), 55);\n      T aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), target_precision);\n      aa.assign(big_a);\n      BOOST_CHECK_EQUAL(aa.precision(), target_precision);\n      aa.assign(big_a, big_b);\n      BOOST_CHECK_EQUAL(aa.precision(), target_precision);\n      if constexpr (0 && std::is_constructible_v<T, Other, Other, int>)\n      {\n         aa.assign(big_a, big_b, 55);\n         BOOST_CHECK_EQUAL(aa.precision(), 55);\n      }\n   }\n   else\n   {\n      if constexpr (std::is_constructible_v<T, Other, int>)\n      {\n         T aa(big_a, 55);\n         BOOST_CHECK_EQUAL(aa.precision(), 55);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), target_precision);\n         aa.assign(big_a, 55);\n         BOOST_CHECK_EQUAL(aa.precision(), 55);\n      }\n      else\n      {\n         T aa;\n         BOOST_CHECK_EQUAL(aa.precision(), target_precision);\n         aa.assign(big_a);\n         BOOST_CHECK_EQUAL(aa.precision(), target_precision);\n      }\n   }\n}\n\n\ntemplate <class T>\nvoid test()\n{\n   T::thread_default_precision(100);\n   T::thread_default_variable_precision_options(boost::multiprecision::variable_precision_options::preserve_component_precision);\n\n   T hp1(\"0.1\"), hp2(\"0.3\"), hp3(\"0.11\"), hp4(\"0.1231\");\n\n   BOOST_CHECK_EQUAL(hp1.precision(), 100);\n   BOOST_CHECK_EQUAL(hp2.precision(), 100);\n\n   T::thread_default_precision(35);\n\n   T a(hp1);\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a = hp1;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a = std::move(hp1);\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   T b(std::move(hp2));\n   BOOST_CHECK_EQUAL(b.precision(), 100);\n   b = new_value<T>();\n   BOOST_CHECK_EQUAL(b.precision(), 35);\n\n   a = b + hp3;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a = hp3 * b;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a += hp3;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a *= hp4;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a -= b * hp3;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n\n   if constexpr (!std::is_same_v<T, typename T::value_type>)\n   {\n      //\n      // If we have a component type: ie we are an interval or a complex number, then\n      // operations involving the component type should match those of T:\n      //\n      using component_t = typename T::value_type;\n      component_t::thread_default_precision(100);\n      component_t::thread_default_variable_precision_options(boost::multiprecision::variable_precision_options::preserve_source_precision);\n\n      component_t cp1(\"0.1\"), cp2(\"0.3\"), cp3(\"0.11\"), cp4(\"0.1231\");\n\n      BOOST_CHECK_EQUAL(cp1.precision(), 100);\n      BOOST_CHECK_EQUAL(cp2.precision(), 100);\n\n      component_t::thread_default_precision(35);\n\n      T aa(cp1);\n      BOOST_CHECK_EQUAL(aa.precision(), 100);\n      T cc(cp1, cp2);\n      BOOST_CHECK_EQUAL(cc.precision(), 100);\n      T dd(cp1, cp2, 55);\n      BOOST_CHECK_EQUAL(dd.precision(), 55);\n      aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      if constexpr (std::is_assignable_v<T, component_t>)\n      {\n         aa = cp1;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa = std::move(cp1);\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n      }\n      T bb(std::move(cp2));\n      BOOST_CHECK_EQUAL(bb.precision(), 100);\n      bb = new_value<T>();\n      BOOST_CHECK_EQUAL(bb.precision(), 35);\n\n      if constexpr (boost::multiprecision::is_compatible_arithmetic_type<component_t, T>::value)\n      {\n         aa = bb + cp3;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa = cp3 * bb;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa += cp3;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         aa -= cp3;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa *= cp4;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         aa /= cp4;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa -= bb * cp3;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n      }\n      aa.assign(cp1);\n      BOOST_CHECK_EQUAL(aa.precision(), 100);\n      aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(cp1, cp2);\n      BOOST_CHECK_EQUAL(aa.precision(), 100);\n      aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(cp1, cp2, 20);\n      BOOST_CHECK_EQUAL(aa.precision(), 20);\n      aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n   }\n   else\n   {\n      T aa(hp4, 20);\n      BOOST_CHECK_EQUAL(aa.precision(), 20);\n      aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(hp4);\n      BOOST_CHECK_EQUAL(aa.precision(), 100);\n      aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(hp4, 20);\n      BOOST_CHECK_EQUAL(aa.precision(), 20);\n   }\n\n   test_mixed<T, char>();\n   test_mixed<T, unsigned char>();\n   test_mixed<T, signed char>();\n   test_mixed<T, short>();\n   test_mixed<T, unsigned short>();\n   test_mixed<T, int>();\n   test_mixed<T, unsigned int>();\n   test_mixed<T, long>();\n   test_mixed<T, unsigned long>();\n   test_mixed<T, long long>();\n   test_mixed<T, unsigned long long>();\n   test_mixed<T, float>();\n   test_mixed<T, double>();\n   test_mixed<T, long double>();\n   //\n   // Test with other compatible multiprecision types:\n   //\n   test_mixed<T, boost::multiprecision::mpz_int>();\n   test_mixed<T, boost::multiprecision::cpp_int>();\n   test_mixed<T, boost::multiprecision::mpq_rational>();\n   test_mixed<T, boost::multiprecision::cpp_rational>();\n   test_mixed<T, boost::multiprecision::cpp_bin_float_100>();\n   test_mixed<T, boost::multiprecision::cpp_dec_float_100>();\n   test_mixed<T, boost::multiprecision::mpf_float_100>();\n#if defined(TEST_MPFR) || defined(TEST_MPC) || defined(TEST_MPFI)\n   test_mixed<T, boost::multiprecision::mpfr_float_100>();\n#endif\n}\n\nint main()\n{\n#ifdef TEST_MPF\n   test<boost::multiprecision::mpf_float>();\n   test<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, boost::multiprecision::et_off>>();\n#endif\n#ifdef TEST_MPFR\n   test<boost::multiprecision::mpfr_float>();\n   test<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off> >();\n#endif\n#ifdef TEST_MPFI\n   test<boost::multiprecision::mpfi_float>();\n   test<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, boost::multiprecision::et_off> >();\n#endif\n#ifdef TEST_MPC\n   test<boost::multiprecision::mpc_complex>();\n   test<boost::multiprecision::number<boost::multiprecision::mpc_complex_backend<0>, boost::multiprecision::et_off> >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_preserve_related_precision.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <thread>\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include <boost/math/special_functions/relative_difference.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#include <boost/math/quadrature/tanh_sinh.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF) && !defined(TEST_MPFR) && !defined(TEST_MPFI) && !defined(TEST_MPC)\n#define TEST_MPF\n#define TEST_MPFR\n#define TEST_MPFI\n#define TEST_MPC\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#if defined(TEST_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_MPFI)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#if defined(TEST_MPC)\n#include <boost/multiprecision/mpc.hpp>\n#endif\n\ntemplate <class T>\nT new_value()\n{\n   return T(\"0.1\");\n}\n\ntemplate <class Other>\nOther make_other_big_value()\n{\n   if constexpr (std::numeric_limits<Other>::is_integer && !std::numeric_limits<Other>::is_bounded)\n      return (Other(1) << 1000) + 1;\n   else if constexpr (!std::numeric_limits<Other>::is_integer && std::numeric_limits<Other>::is_exact && (std::numeric_limits<Other>::max_exponent == std::numeric_limits<Other>::min_exponent))\n   {\n      using value_type = typename Other::value_type;\n      return Other(1) / ((value_type(1) << 1000) + 1);\n   }\n   else\n      return (std::numeric_limits<Other>::max)();\n}\n\ntemplate <class T, class U>\nstruct is_related_type : public std::false_type {};\n\ntemplate <>\nstruct is_related_type<boost::multiprecision::mpf_float, boost::multiprecision::mpf_float_100> : public std::true_type\n{};\ntemplate <>\nstruct is_related_type<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, boost::multiprecision::et_off>, boost::multiprecision::mpf_float_100> : public std::true_type\n{};\n\n#if defined(TEST_MPFR)\ntemplate <>\nstruct is_related_type<boost::multiprecision::mpfr_float, boost::multiprecision::mpfr_float_100> : public std::true_type\n{};\ntemplate <>\nstruct is_related_type<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off>, boost::multiprecision::mpfr_float_100> : public std::true_type\n{};\n#endif\n#if defined(TEST_MPFI)\ntemplate <>\nstruct is_related_type<boost::multiprecision::mpfi_float, boost::multiprecision::mpfr_float_100> : public std::true_type\n{};\ntemplate <>\nstruct is_related_type<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, boost::multiprecision::et_off>, boost::multiprecision::mpfr_float_100> : public std::true_type\n{};\n#endif\n#if defined(TEST_MPC)\ntemplate <>\nstruct is_related_type<boost::multiprecision::mpc_complex, boost::multiprecision::mpfr_float_100> : public std::true_type\n{};\ntemplate <>\nstruct is_related_type<boost::multiprecision::number<boost::multiprecision::mpc_complex_backend<0>, boost::multiprecision::et_off>, boost::multiprecision::mpfr_float_100> : public std::true_type\n{};\n#endif\n\ntemplate <class T, class Other>\nvoid test_mixed()\n{\n   T::thread_default_precision(10);\n   T::thread_default_variable_precision_options(boost::multiprecision::variable_precision_options::preserve_related_precision);\n   Other big_a(make_other_big_value<Other>()), big_b(make_other_big_value<Other>()), big_c(make_other_big_value<Other>()), big_d(make_other_big_value<Other>());\n\n   unsigned target_precision;\n   if constexpr (is_related_type<T, Other>::value)\n      target_precision = std::numeric_limits<Other>::digits10;\n   else\n      target_precision = T::thread_default_precision();\n\n   T a(big_a);\n   BOOST_CHECK_EQUAL(a.precision(), target_precision);\n   T b(std::move(big_d));\n   BOOST_CHECK_EQUAL(b.precision(), target_precision);\n   if constexpr (std::is_assignable_v<T, Other>)\n   {\n      a = big_b;\n      BOOST_CHECK_EQUAL(a.precision(), target_precision);\n      b = std::move(big_c);\n      BOOST_CHECK_EQUAL(b.precision(), target_precision);\n\n      if constexpr (!std::is_assignable_v<Other, T>)\n      {\n         a = b + big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a = b * big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a = b - big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a = b / big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a += big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a -= big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a *= big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a /= big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n      }\n   }\n   if constexpr (!std::is_same_v<T, typename T::value_type>)\n   {\n      T cc(big_a, big_b);\n      BOOST_CHECK_EQUAL(cc.precision(), target_precision);\n      T dd(big_a, big_b, 55);\n      BOOST_CHECK_EQUAL(dd.precision(), 55);\n      T aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 10);\n      aa.assign(big_a);\n      BOOST_CHECK_EQUAL(aa.precision(), target_precision);\n      aa.assign(big_a, big_b);\n      BOOST_CHECK_EQUAL(aa.precision(), target_precision);\n      if constexpr (0 && std::is_constructible_v<T, Other, Other, int>)\n      {\n         aa.assign(big_a, big_b, 55);\n         BOOST_CHECK_EQUAL(aa.precision(), 55);\n      }\n   }\n   else\n   {\n      if constexpr (std::is_constructible_v<T, Other, int>)\n      {\n         T aa(big_a, 55);\n         BOOST_CHECK_EQUAL(aa.precision(), 55);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), T::thread_default_precision());\n         aa.assign(big_a, 55);\n         BOOST_CHECK_EQUAL(aa.precision(), 55);\n      }\n      else\n      {\n         T aa;\n         BOOST_CHECK_EQUAL(aa.precision(), target_precision);\n         aa.assign(big_a);\n         BOOST_CHECK_EQUAL(aa.precision(), target_precision);\n      }\n   }\n}\n\n\ntemplate <class T>\nvoid test()\n{\n   T::thread_default_precision(100);\n   T::thread_default_variable_precision_options(boost::multiprecision::variable_precision_options::preserve_related_precision);\n\n   T hp1(\"0.1\"), hp2(\"0.3\"), hp3(\"0.11\"), hp4(\"0.1231\");\n\n   BOOST_CHECK_EQUAL(hp1.precision(), 100);\n   BOOST_CHECK_EQUAL(hp2.precision(), 100);\n\n   T::thread_default_precision(35);\n\n   T a(hp1);\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a = hp1;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a = std::move(hp1);\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   T b(std::move(hp2));\n   BOOST_CHECK_EQUAL(b.precision(), 100);\n   b = new_value<T>();\n   BOOST_CHECK_EQUAL(b.precision(), 35);\n\n   a = b + hp3;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a = hp3 * b;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a += hp3;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a *= hp4;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a -= b * hp3;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n\n   if constexpr (!std::is_same_v<T, typename T::value_type>)\n   {\n      //\n      // If we have a component type: ie we are an interval or a complex number, then\n      // operations involving the component type should match those of T:\n      //\n      using component_t = typename T::value_type;\n      component_t::thread_default_precision(100);\n      component_t::thread_default_variable_precision_options(boost::multiprecision::variable_precision_options::preserve_source_precision);\n\n      component_t cp1(\"0.1\"), cp2(\"0.3\"), cp3(\"0.11\"), cp4(\"0.1231\");\n\n      BOOST_CHECK_EQUAL(cp1.precision(), 100);\n      BOOST_CHECK_EQUAL(cp2.precision(), 100);\n\n      component_t::thread_default_precision(35);\n\n      T aa(cp1);\n      BOOST_CHECK_EQUAL(aa.precision(), 100);\n      T cc(cp1, cp2);\n      BOOST_CHECK_EQUAL(cc.precision(), 100);\n      T dd(cp1, cp2, 55);\n      BOOST_CHECK_EQUAL(dd.precision(), 55);\n      aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      if constexpr (std::is_assignable_v<T, component_t>)\n      {\n         aa = cp1;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa = std::move(cp1);\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n      }\n      T bb(std::move(cp2));\n      BOOST_CHECK_EQUAL(bb.precision(), 100);\n      bb = new_value<T>();\n      BOOST_CHECK_EQUAL(bb.precision(), 35);\n\n      if constexpr (boost::multiprecision::is_compatible_arithmetic_type<component_t, T>::value)\n      {\n         aa = bb + cp3;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa = cp3 * bb;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa += cp3;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         aa -= cp3;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa *= cp4;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         aa /= cp4;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa -= bb * cp3;\n         BOOST_CHECK_EQUAL(aa.precision(), 100);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n      }\n      aa.assign(cp1);\n      BOOST_CHECK_EQUAL(aa.precision(), 100);\n      aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(cp1, cp2);\n      BOOST_CHECK_EQUAL(aa.precision(), 100);\n      aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(cp1, cp2, 20);\n      BOOST_CHECK_EQUAL(aa.precision(), 20);\n      aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n   }\n   else\n   {\n      T aa(hp4, 20);\n      BOOST_CHECK_EQUAL(aa.precision(), 20);\n      aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(hp4);\n      BOOST_CHECK_EQUAL(aa.precision(), 100);\n      aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(hp4, 20);\n      BOOST_CHECK_EQUAL(aa.precision(), 20);\n   }\n\n   test_mixed<T, char>();\n   test_mixed<T, unsigned char>();\n   test_mixed<T, signed char>();\n   test_mixed<T, short>();\n   test_mixed<T, unsigned short>();\n   test_mixed<T, int>();\n   test_mixed<T, unsigned int>();\n   test_mixed<T, long>();\n   test_mixed<T, unsigned long>();\n   test_mixed<T, long long>();\n   test_mixed<T, unsigned long long>();\n   test_mixed<T, float>();\n   test_mixed<T, double>();\n   test_mixed<T, long double>();\n   //\n   // Test with other compatible multiprecision types:\n   //\n   test_mixed<T, boost::multiprecision::mpz_int>();\n   test_mixed<T, boost::multiprecision::cpp_int>();\n   test_mixed<T, boost::multiprecision::mpq_rational>();\n   test_mixed<T, boost::multiprecision::cpp_rational>();\n   test_mixed<T, boost::multiprecision::cpp_bin_float_100>();\n   test_mixed<T, boost::multiprecision::cpp_dec_float_100>();\n   test_mixed<T, boost::multiprecision::mpf_float_100>();\n#if defined(TEST_MPFR) || defined(TEST_MPC) || defined(TEST_MPFI)\n   test_mixed<T, boost::multiprecision::mpfr_float_100>();\n#endif\n}\n\nint main()\n{\n#ifdef TEST_MPF\n   test<boost::multiprecision::mpf_float>();\n   test<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, boost::multiprecision::et_off>>();\n#endif\n#ifdef TEST_MPFR\n   test<boost::multiprecision::mpfr_float>();\n   test<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off> >();\n#endif\n#ifdef TEST_MPFI\n   test<boost::multiprecision::mpfi_float>();\n   test<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, boost::multiprecision::et_off> >();\n#endif\n#ifdef TEST_MPC\n   test<boost::multiprecision::mpc_complex>();\n   test<boost::multiprecision::number<boost::multiprecision::mpc_complex_backend<0>, boost::multiprecision::et_off> >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_preserve_source_precision.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <thread>\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include <boost/math/special_functions/relative_difference.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#include <boost/math/quadrature/tanh_sinh.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF) && !defined(TEST_MPFR) && !defined(TEST_MPFI) && !defined(TEST_MPC)\n#define TEST_MPF\n#define TEST_MPFR\n#define TEST_MPFI\n#define TEST_MPC\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#if defined(TEST_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_MPFI)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#if defined(TEST_MPC)\n#include <boost/multiprecision/mpc.hpp>\n#endif\n\ntemplate <class T>\nT new_value()\n{\n   return T(\"0.1\");\n}\n\ntemplate <class Other>\nOther make_other_big_value()\n{\n   if constexpr (std::numeric_limits<Other>::is_integer && !std::numeric_limits<Other>::is_bounded)\n      return (Other(1) << 1000) + 1;\n   else if constexpr (!std::numeric_limits<Other>::is_integer && std::numeric_limits<Other>::is_exact && (std::numeric_limits<Other>::max_exponent == std::numeric_limits<Other>::min_exponent))\n   {\n      using value_type = typename Other::value_type;\n      return Other(1) / ((value_type(1) << 1000) + 1);\n   }\n   else\n      return (std::numeric_limits<Other>::max)();\n}\n\ntemplate <class T, class Other>\nvoid test_mixed()\n{\n   T::thread_default_precision(10);\n   T::thread_default_variable_precision_options(boost::multiprecision::variable_precision_options::preserve_source_precision);\n   Other big_a(make_other_big_value<Other>()), big_b(make_other_big_value<Other>()), big_c(make_other_big_value<Other>()), big_d(make_other_big_value<Other>());\n\n   unsigned target_precision;\n   if constexpr (std::is_same<Other, typename T::value_type>::value)\n      target_precision = Other::thread_default_precision();\n   else\n      target_precision = T::thread_default_precision();\n\n   T a(big_a);\n   BOOST_CHECK_EQUAL(a.precision(), target_precision);\n   T b(std::move(big_d));\n   BOOST_CHECK_EQUAL(b.precision(), target_precision);\n   if constexpr (std::is_assignable_v<T, Other>)\n   {\n      a = big_b;\n      BOOST_CHECK_EQUAL(a.precision(), target_precision);\n      b = std::move(big_c);\n      BOOST_CHECK_EQUAL(b.precision(), target_precision);\n\n      if constexpr (!std::is_assignable_v<Other, T>)\n      {\n         a = b + big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a = b * big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a = b - big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a = b / big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a += big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a -= big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a *= big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n         a /= big_a;\n         BOOST_CHECK_EQUAL(a.precision(), target_precision);\n      }\n   }\n   if constexpr (!std::is_same_v<T, typename T::value_type>)\n   {\n      T cc(big_a, big_b);\n      BOOST_CHECK_EQUAL(cc.precision(), target_precision);\n      T dd(big_a, big_b, 55);\n      BOOST_CHECK_EQUAL(dd.precision(), 55);\n      T aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), target_precision);\n      aa.assign(big_a);\n      BOOST_CHECK_EQUAL(aa.precision(), target_precision);\n      aa.assign(big_a, big_b);\n      BOOST_CHECK_EQUAL(aa.precision(), target_precision);\n      if constexpr (0 && std::is_constructible_v<T, Other, Other, int>)\n      {\n         aa.assign(big_a, big_b, 55);\n         BOOST_CHECK_EQUAL(aa.precision(), 55);\n      }\n   }\n   else\n   {\n      if constexpr (std::is_constructible_v<T, Other, int>)\n      {\n         T aa(big_a, 55);\n         BOOST_CHECK_EQUAL(aa.precision(), 55);\n         aa = new_value<T>();\n         BOOST_CHECK_EQUAL(aa.precision(), target_precision);\n         aa.assign(big_a, 55);\n         BOOST_CHECK_EQUAL(aa.precision(), 55);\n      }\n      else\n      {\n         T aa;\n         BOOST_CHECK_EQUAL(aa.precision(), target_precision);\n         aa.assign(big_a);\n         BOOST_CHECK_EQUAL(aa.precision(), target_precision);\n      }\n   }\n}\n\n\ntemplate <class T>\nvoid test()\n{\n   T::thread_default_precision(100);\n   T::thread_default_variable_precision_options(boost::multiprecision::variable_precision_options::preserve_source_precision);\n\n   T hp1(\"0.1\"), hp2(\"0.3\"), hp3(\"0.11\"), hp4(\"0.1231\");\n\n   BOOST_CHECK_EQUAL(hp1.precision(), 100);\n   BOOST_CHECK_EQUAL(hp2.precision(), 100);\n\n   T::thread_default_precision(35);\n\n   T a(hp1);\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a = hp1;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a = std::move(hp1);\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   T b(std::move(hp2));\n   BOOST_CHECK_EQUAL(b.precision(), 100);\n   b = new_value<T>();\n   BOOST_CHECK_EQUAL(b.precision(), 35);\n\n   a = b + hp3;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a = hp3 * b;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a += hp3;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a *= hp4;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a -= b * hp3;\n   BOOST_CHECK_EQUAL(a.precision(), 100);\n   a = new_value<T>();\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n\n   if constexpr (!std::is_same_v<T, typename T::value_type>)\n   {\n      //\n      // If we have a component type: ie we are an interval or a complex number, then\n      // operations involving the component type should match those of T:\n      //\n      using component_t = typename T::value_type;\n      component_t::thread_default_precision(100);\n      component_t::thread_default_variable_precision_options(boost::multiprecision::variable_precision_options::preserve_source_precision);\n\n      component_t cp1(\"0.1\"), cp2(\"0.3\"), cp3(\"0.11\"), cp4(\"0.1231\");\n\n      BOOST_CHECK_EQUAL(cp1.precision(), 100);\n      BOOST_CHECK_EQUAL(cp2.precision(), 100);\n      BOOST_CHECK_EQUAL(cp3.precision(), 100);\n      BOOST_CHECK_EQUAL(cp4.precision(), 100);\n\n      component_t::thread_default_precision(35);\n\n      T aa(cp1);\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      T cc(cp1, cp2);\n      BOOST_CHECK_EQUAL(cc.precision(), 35);\n      T dd(cp1, cp2, 55);\n      BOOST_CHECK_EQUAL(dd.precision(), 55);\n\n      if constexpr (std::is_assignable_v<T, component_t>)\n      {\n         aa = cp1;\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa = std::move(cp1);\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n      }\n      T bb(std::move(cp2));\n      BOOST_CHECK_EQUAL(bb.precision(), 35);\n\n      if constexpr (boost::multiprecision::is_compatible_arithmetic_type<component_t, T>::value)\n      {\n         aa = bb + cp3;\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa = cp3 * bb;\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa += cp3;\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa = new_value<T>();\n         aa -= cp3;\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa *= cp4;\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa = new_value<T>();\n         aa /= cp4;\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n         aa -= bb * cp3;\n         BOOST_CHECK_EQUAL(aa.precision(), 35);\n      }\n      aa.assign(cp1);\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(cp1, cp2);\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(cp1, cp2, 20);\n      BOOST_CHECK_EQUAL(aa.precision(), 20);\n   }\n   else\n   {\n      T aa(hp4, 20);\n      BOOST_CHECK_EQUAL(aa.precision(), 20);\n      aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(hp4);\n      BOOST_CHECK_EQUAL(aa.precision(), 100);\n      aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(hp4, 20);\n      BOOST_CHECK_EQUAL(aa.precision(), 20);\n   }\n\n   if constexpr (boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_complex)\n   {\n      T aa(1, 2, 75);\n      BOOST_CHECK_EQUAL(aa.precision(), 75);\n      BOOST_CHECK_EQUAL(aa.real().precision(), 75);\n      BOOST_CHECK_EQUAL(aa.imag().precision(), 75);\n      BOOST_CHECK_EQUAL(real(aa).precision(), 75);\n      BOOST_CHECK_EQUAL(imag(aa).precision(), 75);\n      BOOST_CHECK_EQUAL(abs(aa).precision(), 75);\n      BOOST_CHECK_EQUAL(arg(aa).precision(), 75);\n      BOOST_CHECK_EQUAL(norm(aa).precision(), 75);\n   }\n\n   test_mixed<T, char>();\n   test_mixed<T, unsigned char>();\n   test_mixed<T, signed char>();\n   test_mixed<T, short>();\n   test_mixed<T, unsigned short>();\n   test_mixed<T, int>();\n   test_mixed<T, unsigned int>();\n   test_mixed<T, long>();\n   test_mixed<T, unsigned long>();\n   test_mixed<T, long long>();\n   test_mixed<T, unsigned long long>();\n   test_mixed<T, float>();\n   test_mixed<T, double>();\n   test_mixed<T, long double>();\n   //\n   // Test with other compatible multiprecision types:\n   //\n   test_mixed<T, boost::multiprecision::mpz_int>();\n   test_mixed<T, boost::multiprecision::cpp_int>();\n   test_mixed<T, boost::multiprecision::mpq_rational>();\n   test_mixed<T, boost::multiprecision::cpp_rational>();\n   test_mixed<T, boost::multiprecision::cpp_bin_float_100>();\n   test_mixed<T, boost::multiprecision::cpp_dec_float_100>();\n   test_mixed<T, boost::multiprecision::mpf_float_100>();\n#if defined(TEST_MPFR) || defined(TEST_MPC) || defined(TEST_MPFI)\n   test_mixed<T, boost::multiprecision::mpfr_float_100>();\n#endif\n}\n\nint main()\n{\n#ifdef TEST_MPF\n   test<boost::multiprecision::mpf_float>();\n   test<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, boost::multiprecision::et_off>>();\n#endif\n#ifdef TEST_MPFR\n   test<boost::multiprecision::mpfr_float>();\n   test<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off> >();\n#endif\n#ifdef TEST_MPFI\n   test<boost::multiprecision::mpfi_float>();\n   test<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, boost::multiprecision::et_off> >();\n#endif\n#ifdef TEST_MPC\n   test<boost::multiprecision::mpc_complex>();\n   test<boost::multiprecision::number<boost::multiprecision::mpc_complex_backend<0>, boost::multiprecision::et_off> >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_preserve_target_precision.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <thread>\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include <boost/math/special_functions/relative_difference.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#include <boost/math/quadrature/tanh_sinh.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF) && !defined(TEST_MPFR) && !defined(TEST_MPFI) && !defined(TEST_MPC)\n#define TEST_MPF\n#define TEST_MPFR\n#define TEST_MPFI\n#define TEST_MPC\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\n#if defined(TEST_MPFR)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_MPFI)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#if defined(TEST_MPC)\n#include <boost/multiprecision/mpc.hpp>\n#endif\n\ntemplate <class T>\nT new_value()\n{\n   return T(\"0.1\");\n}\n\ntemplate <class Other>\nOther make_other_big_value()\n{\n   if constexpr (std::numeric_limits<Other>::is_integer && !std::numeric_limits<Other>::is_bounded)\n      return (Other(1) << 1000) + 1;\n   else if constexpr (!std::numeric_limits<Other>::is_integer && std::numeric_limits<Other>::is_exact && (std::numeric_limits<Other>::max_exponent == std::numeric_limits<Other>::min_exponent))\n   {\n      using value_type = typename Other::value_type;\n      return Other(1) / ((value_type(1) << 1000) + 1);\n   }\n   else\n      return (std::numeric_limits<Other>::max)();\n}\n\ntemplate <class T, class Other>\nvoid test_mixed()\n{\n   T::thread_default_precision(10);\n   T::thread_default_variable_precision_options(boost::multiprecision::variable_precision_options::preserve_target_precision);\n   Other big_a(make_other_big_value<Other>()), big_b(make_other_big_value<Other>()), big_c(make_other_big_value<Other>()), big_d(make_other_big_value<Other>());\n\n   T a(big_a);\n   BOOST_CHECK_EQUAL(a.precision(), 10);\n   T b(std::move(big_d));\n   BOOST_CHECK_EQUAL(a.precision(), 10);\n   if constexpr (std::is_assignable_v<T, Other>)\n   {\n      a = big_b;\n      BOOST_CHECK_EQUAL(a.precision(), 10);\n      b = std::move(big_c);\n      BOOST_CHECK_EQUAL(a.precision(), 10);\n\n      if constexpr (!std::is_assignable_v<Other, T>)\n      {\n         a = b + big_a;\n         BOOST_CHECK_EQUAL(a.precision(), 10);\n         a = b * big_a;\n         BOOST_CHECK_EQUAL(a.precision(), 10);\n         a = b - big_a;\n         BOOST_CHECK_EQUAL(a.precision(), 10);\n         a = b / big_a;\n         BOOST_CHECK_EQUAL(a.precision(), 10);\n         a += big_a;\n         BOOST_CHECK_EQUAL(a.precision(), 10);\n         a -= big_a;\n         BOOST_CHECK_EQUAL(a.precision(), 10);\n         a *= big_a;\n         BOOST_CHECK_EQUAL(a.precision(), 10);\n         a /= big_a;\n         BOOST_CHECK_EQUAL(a.precision(), 10);\n      }\n   }\n   if constexpr (!std::is_same_v<T, typename T::value_type>)\n   {\n      T cc(big_a, big_b);\n      BOOST_CHECK_EQUAL(cc.precision(), 10);\n      T dd(big_a, big_b, 55);\n      BOOST_CHECK_EQUAL(dd.precision(), 55);\n      T aa = new_value<T>();\n      BOOST_CHECK_EQUAL(aa.precision(), 10);\n      aa.assign(big_a);\n      BOOST_CHECK_EQUAL(aa.precision(), 10);\n      aa.assign(big_a, big_b);\n      BOOST_CHECK_EQUAL(aa.precision(), 10);\n      if constexpr (0 && std::is_constructible_v<T, Other, Other, int>)\n      {\n         aa.assign(big_a, big_b, 55);\n         BOOST_CHECK_EQUAL(aa.precision(), 55);\n      }\n   }\n   else\n   {\n      if constexpr (std::is_constructible_v<T, Other, int>)\n      {\n         T aa(big_a, 55);\n         BOOST_CHECK_EQUAL(aa.precision(), 55);\n         aa.precision(10);\n         BOOST_CHECK_EQUAL(aa.precision(), 10);\n         aa.assign(big_a);\n         BOOST_CHECK_EQUAL(aa.precision(), 10);\n         aa.assign(big_a, 55);\n         BOOST_CHECK_EQUAL(aa.precision(), 55);\n      }\n      else\n      {\n         T aa;\n         BOOST_CHECK_EQUAL(aa.precision(), 10);\n         aa.assign(big_a);\n         BOOST_CHECK_EQUAL(aa.precision(), 10);\n      }\n   }\n}\n\ntemplate <class T>\nvoid test()\n{\n   T::thread_default_precision(100);\n   T::thread_default_variable_precision_options(boost::multiprecision::variable_precision_options::preserve_target_precision);\n\n   T hp1(\"0.1\"), hp2(\"0.3\"), hp3(\"0.11\"), hp4(\"0.1231\");\n\n   BOOST_CHECK_EQUAL(hp1.precision(), 100);\n   BOOST_CHECK_EQUAL(hp2.precision(), 100);\n\n   T::thread_default_precision(35);\n\n   T a(hp1);\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a = hp1;\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a = std::move(hp1);\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   T b(std::move(hp2));\n   BOOST_CHECK_EQUAL(b.precision(), 35);\n\n   a = b + hp3;\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a = hp3 * b;\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a += hp3;\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a *= hp4;\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n   a -= b * hp3;\n   BOOST_CHECK_EQUAL(a.precision(), 35);\n\n   if constexpr (!std::is_same_v<T, typename T::value_type>)\n   {\n      //\n      // If we have a component type: ie we are an interval or a complex number, then\n      // operations involving the component type should match those of T:\n      //\n      using component_t = typename T::value_type;\n      component_t::thread_default_precision(100);\n      component_t::thread_default_variable_precision_options(boost::multiprecision::variable_precision_options::preserve_source_precision);\n\n      component_t cp1(\"0.1\"), cp2(\"0.3\"), cp3(\"0.11\"), cp4(\"0.1231\");\n\n      BOOST_CHECK_EQUAL(cp1.precision(), 100);\n      BOOST_CHECK_EQUAL(cp2.precision(), 100);\n\n      T::thread_default_precision(35);\n\n      T aa(cp1);\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      T cc(cp1, cp2);\n      BOOST_CHECK_EQUAL(cc.precision(), 35);\n      T dd(cp1, cp2, 20);\n      BOOST_CHECK_EQUAL(dd.precision(), 20);\n      aa = cp1;\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa = std::move(cp1);\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      T bb(std::move(cp2));\n      BOOST_CHECK_EQUAL(bb.precision(), 35);\n\n      aa = bb + cp3;\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa = cp3 * bb;\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa += cp3;\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa -= cp3;\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa *= cp4;\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa /= cp4;\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa -= bb * cp3;\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      \n      aa.assign(cp1);\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(cp1, cp2);\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(cp1, cp2, 20);\n      BOOST_CHECK_EQUAL(aa.precision(), 20);\n   }\n   else\n   {\n      T aa(hp4, 20);\n      BOOST_CHECK_EQUAL(aa.precision(), 20);\n      aa.precision(35);\n      aa.assign(hp4);\n      BOOST_CHECK_EQUAL(aa.precision(), 35);\n      aa.assign(hp4, 20);\n      BOOST_CHECK_EQUAL(aa.precision(), 20);\n   }\n\n   test_mixed<T, char>();\n   test_mixed<T, unsigned char>();\n   test_mixed<T, signed char>();\n   test_mixed<T, short>();\n   test_mixed<T, unsigned short>();\n   test_mixed<T, int>();\n   test_mixed<T, unsigned int>();\n   test_mixed<T, long>();\n   test_mixed<T, unsigned long>();\n   test_mixed<T, long long>();\n   test_mixed<T, unsigned long long>();\n   test_mixed<T, float>();\n   test_mixed<T, double>();\n   test_mixed<T, long double>();\n   //\n   // Test with other compatible multiprecision types:\n   //\n   test_mixed<T, boost::multiprecision::mpz_int>();\n   test_mixed<T, boost::multiprecision::cpp_int>();\n   test_mixed<T, boost::multiprecision::mpq_rational>();\n   test_mixed<T, boost::multiprecision::cpp_rational>();\n   test_mixed<T, boost::multiprecision::cpp_bin_float_100>();\n   test_mixed<T, boost::multiprecision::cpp_dec_float_100>();\n   test_mixed<T, boost::multiprecision::mpf_float_100>();\n#if defined(TEST_MPFR) || defined(TEST_MPC) || defined(TEST_MPFI)\n   test_mixed<T, boost::multiprecision::mpfr_float_100>();\n#endif\n}\n\nint main()\n{\n#ifdef TEST_MPF\n   test<boost::multiprecision::mpf_float>();\n   test<boost::multiprecision::number<boost::multiprecision::gmp_float<0>, boost::multiprecision::et_off>>();\n#endif\n#ifdef TEST_MPFR\n   test<boost::multiprecision::mpfr_float>();\n   test<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off> >();\n#endif\n#ifdef TEST_MPFI\n   test<boost::multiprecision::mpfi_float>();\n   test<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, boost::multiprecision::et_off> >();\n#endif\n#ifdef TEST_MPC\n   test<boost::multiprecision::mpc_complex>();\n   test<boost::multiprecision::number<boost::multiprecision::mpc_complex_backend<0>, boost::multiprecision::et_off> >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_rat_float_interconv.cpp",
    "content": "// Copyright John Maddock 2013.\n\n// Use, modification and distribution are subject to the\n// Boost Software License, Version 1.0.\n// (See accompanying file LICENSE_1_0.txt\n// or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#if defined(TEST1) || defined(TEST2) || defined(TEST3) || defined(TEST4)\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/cpp_int.hpp>\n#else\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#include <boost/math/special_functions/next.hpp>\n\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include <boost/chrono.hpp>\n#include \"test.hpp\"\n#include <boost/array.hpp>\n#include <iostream>\n#include <iomanip>\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\ntemplate <class Clock>\nstruct stopwatch\n{\n   typedef typename Clock::duration duration;\n   stopwatch()\n   {\n      m_start = Clock::now();\n   }\n   duration elapsed()\n   {\n      return Clock::now() - m_start;\n   }\n   void reset()\n   {\n      m_start = Clock::now();\n   }\n\n private:\n   typename Clock::time_point m_start;\n};\n\ntemplate <class T>\nstruct exponent_type\n{\n   typedef int type;\n};\ntemplate <class T, boost::multiprecision::expression_template_option ET>\nstruct exponent_type<boost::multiprecision::number<T, ET> >\n{\n   typedef typename T::exponent_type type;\n};\n\ntemplate <class T>\nT generate_random_float()\n{\n   BOOST_MATH_STD_USING\n   typedef typename exponent_type<T>::type e_type;\n   static boost::random::mt19937           gen;\n   T                                       val      = gen();\n   T                                       prev_val = -1;\n   while (val != prev_val)\n   {\n      val *= (gen.max)();\n      prev_val = val;\n      val += gen();\n   }\n   e_type e;\n   val = frexp(val, &e);\n\n   static const int                                       max_exponent_value = (std::min)(static_cast<int>(std::numeric_limits<T>::max_exponent - std::numeric_limits<T>::digits - 20), 2000);\n   static boost::random::uniform_int_distribution<e_type> ui(0, max_exponent_value);\n   return ldexp(val, ui(gen));\n}\n\ntemplate <class Float, class Rat>\nvoid do_round_trip(const Float& val)\n{\n   BOOST_MATH_STD_USING\n   Rat   rat(val);\n   Float new_f(rat);\n   BOOST_CHECK_EQUAL(val, new_f);\n   //\n   // Try adding or subtracting an insignificant amount\n   // (0.25ulp) from rat and check that it rounds to the same value:\n   //\n   typename exponent_type<Float>::type e;\n   Float                               t = frexp(val, &e);\n   (void)t; // warning suppression\n   e -= std::numeric_limits<Float>::digits + 2;\n   BOOST_MP_ASSERT(val == (val + ldexp(Float(1), e)));\n   Rat                                                               delta, rounded;\n   typedef typename boost::multiprecision::component_type<Rat>::type i_type;\n   i_type                                                            i(1);\n   i <<= (e < 0 ? -e : e);\n   if (e > 0)\n      delta.assign(i);\n   else\n      delta = Rat(i_type(1), i);\n   rounded = rat + delta;\n   new_f   = static_cast<Float>(rounded);\n   BOOST_CHECK_EQUAL(val, new_f);\n   rounded = rat - delta;\n   new_f   = static_cast<Float>(rounded);\n   BOOST_CHECK_EQUAL(val, new_f);\n\n   delta /= 2;\n   rounded = rat + delta;\n   new_f   = static_cast<Float>(rounded);\n   BOOST_CHECK_EQUAL(val, new_f);\n   rounded = rat - delta;\n   new_f   = static_cast<Float>(rounded);\n   BOOST_CHECK_EQUAL(val, new_f);\n\n   delta /= 2;\n   rounded = rat + delta;\n   new_f   = static_cast<Float>(rounded);\n   BOOST_CHECK_EQUAL(val, new_f);\n   rounded = rat - delta;\n   new_f   = static_cast<Float>(rounded);\n   BOOST_CHECK_EQUAL(val, new_f);\n}\n\ntemplate <class Float, class Rat>\nvoid test_round_trip()\n{\n   std::cout << \"Testing types \" << typeid(Float).name() << \" <<==>> \" << typeid(Rat).name() << std::endl;\n   std::cout << \"digits = \" << std::numeric_limits<Float>::digits << std::endl;\n   std::cout << \"digits10 = \" << std::numeric_limits<Float>::digits10 << std::endl;\n   std::cout << \"max_digits10 = \" << std::numeric_limits<Float>::max_digits10 << std::endl;\n\n   stopwatch<boost::chrono::high_resolution_clock> w;\n\n   int count = 0;\n\n#ifndef CI_SUPPRESS_KNOWN_ISSUES\n   while (boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() < 200)\n#else\n   while (boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() < 50)\n#endif\n   {\n      Float val = generate_random_float<Float>();\n      do_round_trip<Float, Rat>(val);\n      do_round_trip<Float, Rat>(Float(-val));\n      do_round_trip<Float, Rat>(Float(1 / val));\n      do_round_trip<Float, Rat>(Float(-1 / val));\n      count += 4;\n      if (boost::detail::test_errors() > 100)\n         break;\n   }\n\n   std::cout << \"Execution time = \" << boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() << \"s\" << std::endl;\n   std::cout << \"Total values tested: \" << count << std::endl;\n}\n\ntemplate <class Int>\nInt generate_random_int()\n{\n   static boost::random::mt19937                                                       gen;\n   static boost::random::uniform_int_distribution<boost::random::mt19937::result_type> d(1, 20);\n\n   int lim;\n   Int cppi(0);\n\n   lim = d(gen);\n\n   for (int i = 0; i < lim; ++i)\n   {\n      cppi *= (gen.max)();\n      cppi += gen();\n   }\n   return cppi;\n}\n\ntemplate <class Float, class Rat>\nvoid test_random_rationals()\n{\n   std::cout << \"Testing types \" << typeid(Float).name() << \" <<==>> \" << typeid(Rat).name() << std::endl;\n   std::cout << \"digits = \" << std::numeric_limits<Float>::digits << std::endl;\n   std::cout << \"digits10 = \" << std::numeric_limits<Float>::digits10 << std::endl;\n   std::cout << \"max_digits10 = \" << std::numeric_limits<Float>::max_digits10 << std::endl;\n\n   typedef typename boost::multiprecision::component_type<Rat>::type i_type;\n   stopwatch<boost::chrono::high_resolution_clock>                   w;\n\n   int count = 0;\n\n#ifndef CI_SUPPRESS_KNOWN_ISSUES\n   while (boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() < 200)\n#else\n   while (boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() < 50)\n#endif\n   {\n      Rat   rat(generate_random_int<i_type>(), generate_random_int<i_type>());\n      Float f(rat);\n      Rat   new_rat(f); // rounded value\n      int   c = new_rat.compare(rat);\n      if (c < 0)\n      {\n         // If f was rounded down, next float up must be above the original value:\n         f = boost::math::float_next(f);\n         new_rat.assign(f);\n         BOOST_CHECK(new_rat >= rat);\n      }\n      else if (c > 0)\n      {\n         // If f was rounded up, next float down must be below the original value:\n         f = boost::math::float_prior(f);\n         new_rat.assign(f);\n         BOOST_CHECK(new_rat <= rat);\n      }\n      else\n      {\n         // Values were equal... nothing to test.\n      }\n      if (boost::detail::test_errors() > 100)\n         break;\n   }\n\n   std::cout << \"Execution time = \" << boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() << \"s\" << std::endl;\n   std::cout << \"Total values tested: \" << count << std::endl;\n}\n\n#if defined(TEST2)\n\nvoid double_spot_tests()\n{\n   boost::multiprecision::cpp_rational rat = 1;\n   boost::multiprecision::cpp_rational twiddle(boost::multiprecision::cpp_int(1), boost::multiprecision::cpp_int(boost::multiprecision::cpp_int(1) << 54));\n   rat += boost::multiprecision::cpp_rational(boost::multiprecision::cpp_int(1), boost::multiprecision::cpp_int(boost::multiprecision::cpp_int(1) << 50));\n\n   double d = rat.convert_to<double>();\n\n   rat += twiddle;\n   BOOST_CHECK_EQUAL(d, rat.convert_to<double>());\n   rat += twiddle;\n   // tie: round to even rounds down\n   BOOST_CHECK_EQUAL(d, rat.convert_to<double>());\n   rat += twiddle;\n   BOOST_CHECK_NE(d, rat.convert_to<double>());\n   rat -= twiddle;\n   BOOST_CHECK_EQUAL(d, rat.convert_to<double>());\n   rat += boost::multiprecision::cpp_rational(boost::multiprecision::cpp_int(1), boost::multiprecision::cpp_int(boost::multiprecision::cpp_int(1) << 52));\n   // tie, but last bit is now a 1 so we round up:\n   BOOST_CHECK_NE(d, rat.convert_to<double>());\n}\n\n#endif\n\nint main()\n{\n   using namespace boost::multiprecision;\n#if defined(TEST1) && !defined(BOOST_MSVC)\n   test_round_trip<number<cpp_bin_float<113, digit_base_2, void, std::int16_t> >, cpp_rational>();\n#elif defined(TEST2)\n   double_spot_tests();\n   test_round_trip<double, cpp_rational>();\n#elif defined(TEST3) && !defined(BOOST_MSVC)\n   test_random_rationals<number<cpp_bin_float<113, digit_base_2, void, std::int16_t> >, cpp_rational>();\n#elif defined(TEST4)\n   test_random_rationals<double, cpp_rational>();\n#elif defined(TEST5)\n   // This does not work: gmp does not correctly round integer to float or\n   // rational to float conversions:\n   test_round_trip<double, mpq_rational>();\n#elif defined(TEST6)\n   test_round_trip<mpfr_float_100, mpq_rational>();\n#elif defined(TEST7)\n   test_random_rationals<mpfr_float_100, mpq_rational>();\n#elif defined(TEST8)\n   test_random_rationals<double, mpq_rational>();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_rational_io.cpp",
    "content": "// Copyright John Maddock 2011.\n\n// Use, modification and distribution are subject to the\n// Boost Software License, Version 1.0.\n// (See accompanying file LICENSE_1_0.txt\n// or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#if !defined(TEST_MPQ) && !defined(TEST_TOMMATH) && !defined(TEST_CPP_INT)\n#define TEST_MPQ\n#define TEST_TOMMATH\n#define TEST_CPP_INT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPQ)\n#include <boost/multiprecision/gmp.hpp>\n#include <boost/multiprecision/rational_adaptor.hpp>\n#endif\n#if defined(TEST_TOMMATH)\n#include <boost/multiprecision/tommath.hpp>\n#endif\n#ifdef TEST_CPP_INT\n#include <boost/multiprecision/cpp_int.hpp>\n#endif\n\n#include <boost/algorithm/string/case_conv.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n#include <boost/rational.hpp>\n#include \"test.hpp\"\n#include <iostream>\n#include <iomanip>\n\ntemplate <class T>\nT generate_random()\n{\n   typedef typename boost::multiprecision::component_type<T>::type int_type;\n   static boost::random::uniform_int_distribution<unsigned>        ui(0, 20);\n   static boost::random::mt19937                                   gen;\n   int_type                                                        val = int_type(gen());\n   unsigned                                                        lim = ui(gen);\n   for (unsigned i = 0; i < lim; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   int_type denom = int_type(gen());\n   lim            = ui(gen);\n   for (unsigned i = 0; i < lim; ++i)\n   {\n      denom *= (gen.max)();\n      denom += gen();\n   }\n   return T(val, denom);\n}\n\ntemplate <class T>\nvoid do_round_trip(const T& val, std::ios_base::fmtflags f, const std::integral_constant<bool, true>&)\n{\n   std::stringstream ss;\n   ss << std::setprecision(std::numeric_limits<T>::max_digits10);\n   ss.flags(f);\n   ss << val;\n   T new_val = static_cast<T>(ss.str());\n   BOOST_CHECK_EQUAL(new_val, val);\n   new_val = static_cast<T>(val.str(0, f));\n   BOOST_CHECK_EQUAL(new_val, val);\n}\n\ntemplate <class T>\nvoid do_round_trip(const T& val, std::ios_base::fmtflags f, const std::integral_constant<bool, false>&)\n{\n   std::stringstream ss;\n   ss << std::setprecision(std::numeric_limits<T>::digits10 + 4);\n   ss.flags(f);\n   ss << val;\n   T new_val;\n   ss >> new_val;\n   BOOST_CHECK_EQUAL(new_val, val);\n}\n\ntemplate <class T>\nstruct is_number : public std::integral_constant<bool, false>\n{};\ntemplate <class T>\nstruct is_number<boost::multiprecision::number<T> > : public std::integral_constant<bool, true>\n{};\n\ntemplate <class T>\nvoid do_round_trip(const T& val, std::ios_base::fmtflags f)\n{\n   do_round_trip(val, f, is_number<T>());\n}\n\ntemplate <class T>\nvoid do_round_trip(const T& val)\n{\n   do_round_trip(val, std::ios_base::fmtflags(0));\n   if (val >= 0)\n   {\n      do_round_trip(val, std::ios_base::fmtflags(std::ios_base::showbase | std::ios_base::hex));\n      do_round_trip(val, std::ios_base::fmtflags(std::ios_base::showbase | std::ios_base::oct));\n   }\n}\n\ntemplate <class T>\nvoid test_round_trip()\n{\n   for (unsigned i = 0; i < 1000; ++i)\n   {\n      T val = generate_random<T>();\n      do_round_trip(val);\n      do_round_trip(T(-val));\n   }\n}\n\nint main()\n{\n#ifdef TEST_MPQ\n   test_round_trip<boost::multiprecision::mpq_rational>();\n   test_round_trip<boost::rational<boost::multiprecision::mpz_int> >();\n   test_round_trip<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> > >();\n#endif\n#ifdef TEST_TOMMATH\n   test_round_trip<boost::rational<boost::multiprecision::tom_int> >();\n   test_round_trip<boost::multiprecision::tom_rational>();\n#endif\n#ifdef TEST_CPP_INT\n   test_round_trip<boost::rational<boost::multiprecision::cpp_int> >();\n   test_round_trip<boost::multiprecision::cpp_rational>();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_roots_10k_digits.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2021.\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <cmath>\n\n#include <boost/math/constants/constants.hpp>\n#include <boost/math/special_functions/cbrt.hpp>\n#include <boost/detail/lightweight_test.hpp>\n#include \"test.hpp\"\n\n#if defined(TEST_CPP_DEC_FLOAT)\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#elif defined(TEST_CPP_BIN_FLOAT)\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#else\n#error ERROR!!: Backend type must be specified as cpp_dec_float or cpp_bin_float\n#endif\n\n#if defined(TEST_CPP_DEC_FLOAT)\nusing big_float_type =\n   boost::multiprecision::number<boost::multiprecision::cpp_dec_float<10001, std::int32_t, std::allocator<void>>,\n                                 boost::multiprecision::et_off>;\n#elif defined(TEST_CPP_BIN_FLOAT)\nusing big_float_type =\n   boost::multiprecision::number<boost::multiprecision::cpp_bin_float<10001>,\n                                 boost::multiprecision::et_off>;\n#endif\n\nstatic const std::string str_control_sqrt_pi\n{\n   // N[Sqrt[Pi], 10003]\n   \"1.\"\n   \"77245385090551602729816748334114518279754945612238712821380778985291128459103218137495065673854466541622682362428257066623615286572442260252509370960278706846203769865310512284992517302895082622893209537926796280017463901535147972051670019018523401858544697449491264031392177552590621640541933250090639840761373347747515343366798978936585183640879545116516173876005906739343179133280985484624818490205465485219561325156164746751504273876105610799612710721006037204448367236529661370809432349883166842\"\n   \"42138457096091204204277857780686947665700052183056851254133966369446541815107166938833219429293570622688652244205421499480499207564863988748385059306402182140292858112330649789452036211490789622873894032459781985131348712665125062932600446563821096750268124969305954204615607619522173915250702077927580990543329006622230676144696612481887430699788352050614644438541853079735742571791856359597499599522638492422038891039664064472939728413450430021405642334330392617561341763363200170376541634763206692\"\n   \"76541812835762490326904508485320134192435989730871193799482938730111262561658818884785977875963761363218634246546641333954355703201522654193952186030497310513829498439659165614245955421226615102478536098095510395600789402188099613382854025016800745802729119366425192820510001936350073914643295493433951928853735459200563766502880540575532123189009126322819150914980836695624483100852221923973646324842863261145766932425371577377894414090544573595351225626391080239236909732127905807617134603914574791\"\n   \"87979412485021844514581134188888041322095533218464670972749102856526270784545326222784880098238583630075495095476406237708338835722543662156748132766838424497242087451616183320507799148018466681423669365190284546385761482785703777438837629747998273770543158368241099868322850380552635536972229313380526442841037231204396700430761245413831179227827536371559839837688453702784298570709051122384053677901338541458531620807304313806973998743669316601381707927205604195488285806309311163629704786781402696\"\n   \"32729627012261359858977545052894831130166840015320748519824024633375558517135680193412289759807195687402505715021417837925436430303659282112509258806189031170745431279039535536606826110011889657420487275939199769955383521150866962555964413705038292449535903106362345305647171162168587254586874400296117579217231905540571986817275884190896496579066965156017283514829038565511698072107953309161308435985243894654406821655003275379960238665037988864815211865799958571865637751133159747535960434137766451\"\n   \"19143460134292508116324806409073773212629335747472967679341271602966512080989809057799660305102181625557978907487076211076238026267854297015027109153504985351492390832484280828987595575678848892608420885521269510357370208661259115541320440373560864338837123962064293902378666311632616788841922798194995240394245784220443030420430420710969273392946085104969289739161855607837870336428902342932718872968029721581659426129728366395905041130374745743509749058016326916537576909810974856253778503428799421\"\n   \"92237718584431832793731298006587036861923010217454505203084553303861950660236433411532059741224264265354216558150036472691946382544124557259473900719227187097960549897246028226024291050774020812375674807627637743706345046314773769480331683570762058749578173350996762873387396702968819066142614457371322822803935444608377601058646738943855776887203971767059273166300903112608144884308624114292247965454026163755158658735198437217550552729506415043576875838149359401055659121503770441973880370568097143\"\n   \"46316360543413650766999757621198118425874225208140436406211723091974394552459677817421914643335067146364622594792319497003496602563521033780660380527031652454546473640620830298273494336728477353020224705290099569815670586403988563683495649528828785196447555742560145992685258185630853805815521997029234802948217957003929547687673787467561474545052585171167541520282662279997703869334225001229773162123949246270758331680646407392937845782141854983327867648187925679501328451126001547882983039709412279\"\n   \"55902739831214814542270184266024781981043333772958400258388865676834533309029610949987493741347827363468214661024873730434936857350647979436639913666636603319139931587665621516162917711861823216570008465885793874989357083653900514427893078319984999817593256144124629695956174126257098794338275338500025352194488355589261749748777846288722492925959751808959292006560416637867369908737627136240495219624777863935793728863172669947043866416226163725769669214230953364155781068802438762255656909570411119\"\n   \"29329419336352138037692136273833819830244199702433009694861871085709025954822085641199104101975680270188980749875221764846725695738526974653312988267258169188864563262749529655208476443369725290231293888886172298365388606288519962105545717369008144991518103776264256672840522144402197474662350151152362302177635204375528607776725412022934171898265399118147904685922433784252070116245217876908741620845115578154869546824111382745732829225060159722322499657545023166289561501837132083717115348063673894\"\n   \"84784931733912365683566355325605210062481299782871796389101124979761290941248031177301331861287374931225016243776603184702614422553084037673001012318502465258727480230169728594169868719593244190651723315464820772603457688308424446360645013191255421752939510434522411080231562909169615412193930561011909418881134283861918284802421983092749258272200999073585007397309735049927566442729112512571291910898288904993996164103611931626599002802954273008381997697092303742727834454911765521727836256287601109\"\n   \"32255166208473363670412549865951932837423711585439714475260616254908137088745696670626628429325335237376819359653018249154079718880795628014895902440140901732999360367466419259926341267462502903084686933106760552768358294991902944382941262207244383387383548710992639420375250818632065102216297040032248061383121651896089049818986478224426012401989866131191974000724370814801426098855240714118230250496450467294859726495929559243052613611357840645183272467390330059195315273771949648585941670957079135\"\n   \"71208139601650594925038121644613819126162372924247652609612531066175456224775667644691793111255733602951238632893409556672518588271987281331623238463434788117754723046679700987197077876381886561795342566290582176594347588749226787782077620870028951701108941253050356669850986454100131214591137167354223024474855215031201885575271538221316878310661190616431479234818598289682964444446955675311396049275406706727731378970529259539526600249211331795365053974029709734540190671438970125900686013617665195\"\n   \"72687973099508055015643127762385528631050133875254380128109439190154705505999016058166069149685688494423898119657391772817914836040519357475938801038970500508903809193141729096407992797218919755568891010603646639884446522998359060486644235315895267693359444400323126004223165102112972082074042502545061418356462067134650264595901028481832509792442369881199067775187248038964466592173037308569206019569002906903553691216483666182982442288272244187675860189834556893273733860435288050615748230733969445\"\n   \"78474186530443308066397549429129132930287814868929519508417573058826618191732980441004823285545754081618814817035570021561095057968747348503333241797516372109425551635208880511652501824782287983124319365126912208588242222571057432428595460772815216094389152993482877724386484010334934164007837418595795609461194089041646498368598284869636334697311192787059989803426741803667268274124973752207354967929168154574421280242660244525949811268984027714993375818153211296815116998257206433839865521131667998\"\n   \"74512421646225811715024003745050832887130969530089731910093749817808392479440994244361969834871331949567903534204867346327056330005149544805112071035184999837985308493647201573304757781804018320982970610322298262945817088234849408510513828178436106441430254484968445676566840061568603570598998353863859883837419232118812833359937727090858195866745019480954611611719835213422118817496211290873149331743041280454519097165935298512044878386738845240577474305934119341688461016838983599740017586415986514\"\n   \"51965095819944262457264453202270514559808838737526755650009008351031467134854677665539462037409247069039645130697247550595241566609004807391855534514872365159293944313924460101335463214967481524634943153469869484903659475912163559450595979781245452991730567329359129587659197544325565931786590196906663660605545155793513382316688065094804799038912675532718180916008233951288936444383999718074935106457889746868054217381258669110448983865029170831101859533263398090772529353443250670518769803568857168\"\n   \"81835780060242683956246672119403771630768027385648763921020087919307224817553753988989799661812800625463458080710413482016553607229817002580132804265299140542713714123053939394621458358275171332093085623946345810925244720567080038158311521284798948447278515121112424067234765368019140869005781922146420504119187767393112983163459560389549526407730300520215721662742451140651602410469652635646458070101544719747869732605487813151166471073804854444267443665951138325602700664792462223823426368037830362\"\n   \"27148019393536469444732501183428218507918036245748038005705684585804838509534865536011973735674935924281652500573775492013522068651524096611313931230523448030488329336880235249613516999100262182701401504389238091694167813318978739897687026397995882771057905474944084757566412920735280686916139219650606013122253782257621358161138006091059023485172621478918566759728124236443373302790962384533760569520986820661689101431363706295375429013500518704424423442146446635034690739595018396356194261104794702\"\n   \"87456163704731907717663415135937863802506788792267061610451079193210848607297617511818706631398952702233269765053328557068418415112262788617649292213008542622876443659388901497338772639102584246387768685926405110265670628494557418283207462950444098917779203101595858810344307567330365427189853237793572718692349471296873907788505052029451976937216634259196159341629632641232237930653691385003947028744939958011043046386152534477079048794401892421173982979396566405475605645350343613825952457743905288\"\n   \"66\"\n};\n\nstatic const std::string str_control_pisot\n{\n   // Consider a fascinating near-integer number with a lot of zeros,\n   // a so-called, Pisot number.\n\n   // N[((2/(27 + 3 Sqrt[69]))^(1/3) + (1/3) ((27 + 3 Sqrt[69])/2)^(1/3))^30000, 10003]\n   // The exact page at Wolftam Alpha that can calculate this number is:\n   // https://www.wolframalpha.com/input/?i=N%5B%28%282%2F%2827+%2B+3+Sqrt%5B69%5D%29%29%5E%281%2F3%29+%2B+%281%2F3%29+%28%2827+%2B+3+Sqrt%5B69%5D%29%2F2%29%5E%281%2F3%29%29%5E30000%2C+10003%5D\n\n   \"5.\"\n   \"04316596065665493215059469242757481077610274680893503167844467712875718226486210610398076581934068275385782540821330947870035477787176694685987718254576565515786375180403084108087720197360263045377599299252600787464343711547834066265665424226316713797047087646002867659572088255372994141399119295425729390551598734162316493172898778929854821816913956381635362412821599451025319364903651110221515233814364527904893091337135424027258899192161986823235528295581059873200107875550497563219302434498746973\"\n   \"20814894295138750508150895446761509382533298841076293708877836604655306868577285538664595048264681443930199901657433773640659222556791170905179712854907731191277888814410873665970386217401864110691757499520236594196403021789595612659015207824257477907567818590472521187834397950104895326861429034026538474079051464877355002168754758452522250419043608706810782792271044572273623687966932417337841611669591984103046776829649194090438705230027320037702374804434310323316910942614411443802983487519201990\"\n   \"59562790511888049750265002682883521913896858496289686123578807667253851478579344449553914415375194372851217961223158428624231899492121175279814486360858048056575120864817906982359465546791033345570306144306889182376593558188718231183977511187240921162728629126713811608658037408930071516876158725341127622968866605210362611399728215256794224599912431852531227205445323135206226637942724364187507359956181911218068991795777326796261608752343775804668422381361446090681588594231684449905631308569143981\"\n   \"61104641435976464505827310532042357277805504151076128744133166097040034356155594355699310372567007362846011243924380051721179466481515865177147916094265318673753576167289982789156765819918501461470394696987900055057821804367427737785530796529257310070440503552865770656588911341336781719293479609751349965199241672156885820419323697826495675216785846761301665051497508373554704845376808917106579182046296637409148513289873712928793514345917581372183082138176837444493669698475749155502722721819149673\"\n   \"73068945254294933017249747634880287892338097288098981994162698166278766445393167015463543161066099447878202204982468188542002904684676309826229889306798208587300602722354767354500448057391481009249110193387058874499065448114445643788142392205726681802780327973470136681753346929095906271088971584210825489831313413876761278854904865782491262488363942031887926523248561357047739970904671044807781324238352577584241803357451705736527054197950691951908858510985383906254985074673094196111657808386987133\"\n   \"10344086360548451070819222570296482527242703056995074918767257414142822271890334717277643954342541859509907472906259527629621846811719367901786024179895120064929613306517810763374494997293082055502432076618464586027616119815676773736360189991491957175057346133494837930827478266538261093888716461076377076699523221210638410121119502728028192147321213391939138517117401805454360045347532235299958021923292027677884065299422286086252105068056807793476844454728320229479895050738642250650424537785366800\"\n   \"82426933681881662317694955672636170867065177268568641882560696136399378938092363061534206649910677121667830726528065065115430787822086187067816894109743170406015960678013961777060204838325510730464182561678677866776664114588829507728845970964346546857260085067375205588321834061968066477136954754650582659722182787527038013350885360773847158970095196369406644986845955931896822762457057294441289666846719625035790435931009430361335058057283719525424750533492243401220689154316788170873900888499149058\"\n   \"82791350768045506828033944542308221148888187376496354399413641511521268300533409275323047144881568429552172625312395819678941865586820107952918459296302076757812530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\"\n   \"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\"\n   \"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\"\n   \"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000130894\"\n   \"81144651747951236035489454929072510241720588227917512706315775959573028069494819317749753909502880822522513852251922077408850982456907715693706849952685092996714802140486783196224591724342709356982736044367860439732958936561891275647223613057765646621093148215162220607946164242694428625785134442405595081929385908408997293032313197351343122456184929825694410538985099005649944281269485885003854631983177652291928247833224724739470073685255628874084632409328244867790072740306641208410784729145026418\"\n   \"39979089421596194425472165578935561066171415528986970540137110968042622101039687541512504650792127611653419022003559870999707092195268658469247447023020525845219500954469609653377662845171315396632622078093863467489530686087070384206729526376552079363297449193397802413100986722167407526420829915123927261615512384940124596832534371123301398663197780250502055058559468959359270528574014858166221903008468713118704341049404460009686327493935610433214782810024753045226307991672445787675574109694262312\"\n   \"11145499426482553852623279261922068531320965208068159173874513535948741238646443865707546944537551630947807901099480889585312592101994045117110058723564574602784905031701397065185758292341410282766048237930128673558313294127312232986141003880964672012780620154659135043376705292119911497020913371656546652080631096962434428853407463428964047028385461450774375621283530438935701361719555114064935507016351711366822390479821669249539058602250563907802883915793827509214138670896771346930036795134153954\"\n   \"12614845274332289375572914965666103280434189995736578368489983718312997135507213909760008434894911666727883219968251092951782420006186638047586450238092418753928237145956209661039483486342922895231063933556593966455655337130545768190919525316022134436605220904112976181830667719194987401487083318674802988854162959819380836946082331599524262746254371194008455335100511575399853393989205829635294039833907532465672925195976719223986566158148447432642878876393174990625370999994436703961567355244807342\"\n   \"69520641509898359015919277259612693573103507245475766862906920585023739066501517668430030086321626352865287081845785302216800971241480075909946702545978734966313183497339950198090782159728060732277203943611763413586858764551979183951623117755116853112134485823173566471719295417944467155436759146240378961164970793485454582634507950507263335329774425734366159044434769283194752971059777295937298636851773307465268720002428067710554915705131921586485915706058588546940127798302503433978964008455133493\"\n   \"81377493873988568454747394555631322019995974349284897738681796214043648315850753309356488047165462695097002375464907491747011057687497039054057966902781968701738366805404618496287646992501561538984505139538837143696192930809348816477556056131508918563803091019843961483373516766792142628561297000391741657862041350478818272826493800507083056161770890242060904410455232572423354649059801137081343658420929866819323305436461528792337009143429528398908615401610285467879096995482235819088087170007172084\"\n   \"19200822408181677356654363526604525957125493746470602005173044123902131293500348212963003814048430419681143694193562181860541774246853516513052798389919270163992446463727779357701165620885423995382643338114200119079737025997410561889640258558778992205266673912623015354974700417348049919786128796213631654305377502373403534621197573237204087833472227750274081961941830295476410425392309508980002436399077209866428844044550242714253720047714826171774213541484239371095511846919312369075331533699620236\"\n   \"82029292972878352449179621419103939233902274750203384387435157086116363044339285082959598074623165693670827043027578937417097999903630537953141651179848326672037726918504834056001686619269163272418061895808182857874697372932191591163332075685243434819720224387476770995163639439295727754087687364735109641505765032061100086727178993910597551270640961004749914285104529318068253424299184344438067191184804803834191597230187778600478472083276828758014931933417546242450249754712385119736481807160467673\"\n   \"70904104094257523331122117513138127146204955443643419997609850963761672445279987087328471556603601094954443309436688190549302755292682697985196968743116624708516670254571842252732826810514201166286267256453342635852209107896954083931866292261343402422275337258151166893091264000780411251304831871670820972593920181986511958104229235575222334489531671074281201465449355239054615343692684276140882286660146413938639484415391107647591465166673502924457584083168747424556139933572957677237294159113337504\"\n   \"42E3663\"\n};\n\ntemplate <class T>\nconst T& test_control_value_sqrt_pi() { return T(); }\n\ntemplate <>\nconst big_float_type& test_control_value_sqrt_pi<big_float_type>()\n{\n  static const big_float_type val(str_control_sqrt_pi);\n\n  return val;\n}\n\ntemplate <class T>\nconst T& test_control_value_pisot() { return T(); }\n\ntemplate <>\nconst big_float_type& test_control_value_pisot<big_float_type>()\n{\n  static const big_float_type val(str_control_pisot);\n\n  return val;\n}\n\ntemplate <class T>\nbool test_sqrt_pi(const T tol = std::numeric_limits<T>::epsilon() * 1000000U)\n{\n   using std::fabs;\n   using std::sqrt;\n\n   const T sqrt_pi = sqrt(boost::math::constants::pi<T>());\n\n   const T closeness = fabs(1 - fabs(sqrt_pi / test_control_value_sqrt_pi<T>()));\n\n   const bool result_is_ok = (closeness < tol);\n\n   return result_is_ok;\n}\n\ntemplate <class T>\nbool test_pisot(const T tol = std::numeric_limits<T>::epsilon() * 1000000U)\n{\n   using std::cbrt;\n   using std::fabs;\n   using std::pow;\n   using std::sqrt;\n\n   const T term  = T(27U) + (sqrt(T(69)) * 3U);\n\n   const T pisot = pow(cbrt(2 / term) + (cbrt(term / 2) / 3), 30000U);\n\n   const T closeness = fabs(1 - fabs(pisot / test_control_value_pisot<T>()));\n\n   const bool result_is_ok = (closeness < tol);\n\n   return result_is_ok;\n}\n\ntemplate <class T>\nbool test_sqrt_pi_modify_one_digit_to_fail(const T tol = std::numeric_limits<T>::epsilon() * 1000000U)\n{\n   using std::fabs;\n   using std::sqrt;\n\n   const T sqrt_pi = sqrt(boost::math::constants::pi<T>());\n\n   std::string str_wrong(str_control_sqrt_pi);\n\n   // We will now purposefully modify the string at position 9502.\n   // This is the character '8' at the beginning of the final complete\n   // line of the initialization of the string str_control_sqrt_pi.\n   if(str_wrong[9502U] == (char) '8')\n   {\n     str_wrong[9502U] = (char) '9';\n   }\n\n   const T control(str_wrong);\n\n   const T closeness = fabs(1 - fabs(sqrt_pi / control));\n\n   // Ensure that the answer is wrong (which is the correct behavior).\n   const bool wrong_result_is_ok = (closeness > tol);\n\n   return wrong_result_is_ok;\n}\n\nint main()\n{\n    #if defined(TEST_CPP_DEC_FLOAT)\n    const big_float_type local_tol = std::numeric_limits<big_float_type>::epsilon() * 100U;\n    #elif defined(TEST_CPP_BIN_FLOAT)\n    const big_float_type local_tol = std::numeric_limits<big_float_type>::epsilon() * 1000000U;\n    #endif\n\n   {\n      const bool result_sqrt_pi_is_ok = test_sqrt_pi<big_float_type>(local_tol);\n      BOOST_CHECK_EQUAL(result_sqrt_pi_is_ok, true);\n   }\n\n   {\n      const bool result_pisot_is_ok = test_pisot<big_float_type>(local_tol);\n      BOOST_CHECK_EQUAL(result_pisot_is_ok, true);\n   }\n\n   {\n      const bool result_sqrt_pi_modify_one_digit_to_fail_is_ok = test_sqrt_pi_modify_one_digit_to_fail<big_float_type>(local_tol);\n      BOOST_CHECK_EQUAL(result_sqrt_pi_modify_one_digit_to_fail_is_ok, true);\n   }\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_round.cpp",
    "content": "//  (C) Copyright John Maddock 2007.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/math/special_functions/round.hpp>\n#include <boost/math/special_functions/trunc.hpp>\n#include <boost/math/special_functions/modf.hpp>\n#include <boost/math/special_functions/sign.hpp>\n#include <boost/random/mersenne_twister.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n#define TEST_MPFR_50\n#define TEST_MPFI_50\n#define TEST_BACKEND\n#define TEST_CPP_DEC_FLOAT\n#define TEST_FLOAT128\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_MPFR_50\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#ifdef TEST_MPFI_50\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n\n#ifdef BOOST_MSVC\n#pragma warning(disable : 4127)\n#endif\n\nboost::mt19937 rng;\n\ntemplate <class T>\nT get_random()\n{\n   //\n   // Fill all the bits in T with random values,\n   // likewise set the exponent to a random value\n   // that will still fit inside a T, and always\n   // have a remainder as well as an integer part.\n   //\n   int bits     = boost::math::tools::digits<T>();\n   int shift    = 0;\n   int exponent = rng() % (bits - 4);\n   T   result   = 0;\n   while (bits > 0)\n   {\n      result += ldexp(static_cast<T>(rng()), shift);\n      shift += std::numeric_limits<int>::digits;\n      bits -= std::numeric_limits<int>::digits;\n   }\n   return rng() & 1u ? T(-ldexp(frexp(result, &bits), exponent)) : T(ldexp(frexp(result, &bits), exponent));\n}\n\ntemplate <class T, class U>\ntypename std::enable_if<!boost::multiprecision::is_interval_number<T>::value>::type check_within_half(T a, U u)\n{\n   BOOST_MATH_STD_USING\n   if (fabs(a - u) > 0.5f)\n   {\n      BOOST_ERROR(\"Rounded result differed by more than 0.5 from the original\");\n      std::cerr << \"Values were: \" << std::setprecision(35) << std::setw(40)\n                << std::left << a << u << std::endl;\n   }\n   if ((fabs(a - u) == 0.5f) && (fabs(static_cast<T>(u)) < fabs(a)))\n   {\n      BOOST_ERROR(\"Rounded result was towards zero with boost::round\");\n      std::cerr << \"Values were: \" << std::setprecision(35) << std::setw(40)\n                << std::left << a << u << std::endl;\n   }\n}\ntemplate <class T, class U>\ntypename std::enable_if<boost::multiprecision::is_interval_number<T>::value>::type check_within_half(T a, U u)\n{\n   BOOST_MATH_STD_USING\n   if (upper(T(fabs(a - u))) > 0.5f)\n   {\n      BOOST_ERROR(\"Rounded result differed by more than 0.5 from the original\");\n      std::cerr << \"Values were: \" << std::setprecision(35) << std::setw(40)\n                << std::left << a << u << std::endl;\n   }\n   if ((upper(T(fabs(a - u))) == 0.5f) && (fabs(static_cast<T>(u)) < fabs(a)))\n   {\n      BOOST_ERROR(\"Rounded result was towards zero with boost::round\");\n      std::cerr << \"Values were: \" << std::setprecision(35) << std::setw(40)\n                << std::left << a << u << std::endl;\n   }\n}\n\n//\n// We may not have an abs overload for long long so provide a fall back:\n//\ninline unsigned safe_abs(int const& v)\n{\n   return v < 0 ? static_cast<unsigned>(1u) + static_cast<unsigned>(-(v + 1)) : v;\n}\ninline unsigned long safe_abs(long const& v)\n{\n   return v < 0 ? static_cast<unsigned long>(1u) + static_cast<unsigned long>(-(v + 1)) : v;\n}\ninline unsigned long long safe_abs(long long const& v)\n{\n   return v < 0 ? static_cast<unsigned long long>(1u) + static_cast<unsigned long long>(-(v + 1)) : v;\n}\ntemplate <class T>\ninline typename std::enable_if<!boost::multiprecision::detail::is_integral<T>::value, T>::type safe_abs(T const& v)\n{\n   return v < 0 ? -v : v;\n}\n\ntemplate <class T, class U>\nvoid check_trunc_result(T a, U u)\n{\n   BOOST_MATH_STD_USING\n   if (fabs(a - u) >= 1)\n   {\n      BOOST_ERROR(\"Rounded result differed by more than 1 from the original\");\n      std::cerr << \"Values were: \" << std::setprecision(35) << std::setw(40)\n                << std::left << a << u << std::endl;\n   }\n   if (abs(a) < safe_abs(u))\n   {\n      BOOST_ERROR(\"Truncated result had larger absolute value than the original\");\n      std::cerr << \"Values were: \" << std::setprecision(35) << std::setw(40)\n                << std::left << a << u << std::endl;\n   }\n   if (fabs(static_cast<T>(u)) > fabs(a))\n   {\n      BOOST_ERROR(\"Rounded result was away from zero with boost::trunc\");\n      std::cerr << \"Values were: \" << std::setprecision(35) << std::setw(40)\n                << std::left << a << u << std::endl;\n   }\n}\n\ntemplate <class T, class U>\nvoid check_modf_result(T a, T fract, U ipart)\n{\n   BOOST_MATH_STD_USING\n   if (fract + ipart != a)\n   {\n      BOOST_ERROR(\"Fractional and integer results do not add up to the original value\");\n      std::cerr << \"Values were: \" << std::setprecision(35) << \" \"\n                << std::left << a << ipart << \" \" << fract << std::endl;\n   }\n   if ((boost::math::sign(a) != boost::math::sign(fract)) && boost::math::sign(fract))\n   {\n      BOOST_ERROR(\"Original and fractional parts have differing signs\");\n      std::cerr << \"Values were: \" << std::setprecision(35) << \" \"\n                << std::left << a << ipart << \" \" << fract << std::endl;\n   }\n   if ((boost::math::sign(a) != boost::math::sign(ipart)) && boost::math::sign(ipart))\n   {\n      BOOST_ERROR(\"Original and integer parts have differing signs\");\n      std::cerr << \"Values were: \" << std::setprecision(35) << \" \"\n                << std::left << a << ipart << \" \" << ipart << std::endl;\n   }\n   if (fabs(a - ipart) >= 1)\n   {\n      BOOST_ERROR(\"Rounded result differed by more than 1 from the original\");\n      std::cerr << \"Values were: \" << std::setprecision(35) << std::setw(40)\n                << std::left << a << ipart << std::endl;\n   }\n}\n\ntemplate <class T>\nvoid test()\n{\n   BOOST_MATH_STD_USING\n\n   for (int i = 0; i < 1000; ++i)\n   {\n      T arg = get_random<T>();\n      T r   = round(arg);\n      check_within_half(arg, r);\n      BOOST_TEST(r == round(arg + 0));\n      r = trunc(arg);\n      check_trunc_result(arg, r);\n      BOOST_TEST(r == trunc(arg + 0));\n      T frac = modf(arg, &r);\n      check_modf_result(arg, frac, r);\n\n      if (abs(r) < (std::numeric_limits<int>::max)())\n      {\n         int i = iround(arg);\n         check_within_half(arg, i);\n         BOOST_TEST(i == iround(arg + 0));\n         i = itrunc(arg);\n         check_trunc_result(arg, i);\n         BOOST_TEST(i == itrunc(arg + 0));\n         r = modf(arg, &i);\n         check_modf_result(arg, r, i);\n      }\n      if (abs(r) < (std::numeric_limits<long>::max)())\n      {\n         long l = lround(arg);\n         check_within_half(arg, l);\n         BOOST_TEST(l == lround(arg + 0));\n         l = ltrunc(arg);\n         check_trunc_result(arg, l);\n         BOOST_TEST(l == ltrunc(arg + 0));\n         r = modf(arg, &l);\n         check_modf_result(arg, r, l);\n      }\n\n#ifdef BOOST_HAS_LONG_LONG\n      if (abs(r) < (std::numeric_limits<long long>::max)())\n      {\n         long long ll = llround(arg);\n         check_within_half(arg, ll);\n         BOOST_TEST(ll == llround(arg + 0));\n         ll = lltrunc(arg);\n         check_trunc_result(arg, ll);\n         BOOST_TEST(ll == lltrunc(arg + 0));\n         r = modf(arg, &ll);\n         check_modf_result(arg, r, ll);\n      }\n#endif\n   }\n   //\n   // Test boundary cases:\n   //\n   if (std::numeric_limits<T>::digits >= std::numeric_limits<int>::digits)\n   {\n      int si = iround(static_cast<T>((std::numeric_limits<int>::max)()));\n      check_within_half(static_cast<T>((std::numeric_limits<int>::max)()), si);\n      BOOST_TEST(si == iround(static_cast<T>((std::numeric_limits<int>::max)()) + 0));\n      si = iround(static_cast<T>((std::numeric_limits<int>::min)()));\n      check_within_half(static_cast<T>((std::numeric_limits<int>::min)()), si);\n      BOOST_TEST(si == iround(static_cast<T>((std::numeric_limits<int>::min)()) + 0));\n      si = itrunc(static_cast<T>((std::numeric_limits<int>::max)()));\n      check_trunc_result(static_cast<T>((std::numeric_limits<int>::max)()), si);\n      BOOST_TEST(si == itrunc(static_cast<T>((std::numeric_limits<int>::max)()) + 0));\n      si = itrunc(static_cast<T>((std::numeric_limits<int>::min)()));\n      check_trunc_result(static_cast<T>((std::numeric_limits<int>::min)()), si);\n      BOOST_TEST(si == itrunc(static_cast<T>((std::numeric_limits<int>::min)()) + 0));\n\n      si = iround(static_cast<T>((std::numeric_limits<int>::max)() - 1));\n      check_within_half(static_cast<T>((std::numeric_limits<int>::max)() - 1), si);\n      si = iround(static_cast<T>((std::numeric_limits<int>::min)() + 1));\n      check_within_half(static_cast<T>((std::numeric_limits<int>::min)() + 1), si);\n      si = itrunc(static_cast<T>((std::numeric_limits<int>::max)() - 1));\n      check_trunc_result(static_cast<T>((std::numeric_limits<int>::max)() - 1), si);\n      si = itrunc(static_cast<T>((std::numeric_limits<int>::min)() + 1));\n      check_trunc_result(static_cast<T>((std::numeric_limits<int>::min)() + 1), si);\n   }\n   if (std::numeric_limits<T>::digits >= std::numeric_limits<long>::digits)\n   {\n      long k = lround(static_cast<T>((std::numeric_limits<long>::max)()));\n      check_within_half(static_cast<T>((std::numeric_limits<long>::max)()), k);\n      BOOST_TEST(k == lround(static_cast<T>((std::numeric_limits<long>::max)()) + 0));\n      k = lround(static_cast<T>((std::numeric_limits<long>::min)()));\n      check_within_half(static_cast<T>((std::numeric_limits<long>::min)()), k);\n      BOOST_TEST(k == lround(static_cast<T>((std::numeric_limits<long>::min)()) + 0));\n      k = ltrunc(static_cast<T>((std::numeric_limits<long>::max)()));\n      check_trunc_result(static_cast<T>((std::numeric_limits<long>::max)()), k);\n      BOOST_TEST(k == ltrunc(static_cast<T>((std::numeric_limits<long>::max)()) + 0));\n      k = ltrunc(static_cast<T>((std::numeric_limits<long>::min)()));\n      check_trunc_result(static_cast<T>((std::numeric_limits<long>::min)()), k);\n      BOOST_TEST(k == ltrunc(static_cast<T>((std::numeric_limits<long>::min)()) + 0));\n\n      k = lround(static_cast<T>((std::numeric_limits<long>::max)() - 1));\n      check_within_half(static_cast<T>((std::numeric_limits<long>::max)() - 1), k);\n      k = lround(static_cast<T>((std::numeric_limits<long>::min)() + 1));\n      check_within_half(static_cast<T>((std::numeric_limits<long>::min)() + 1), k);\n      k = ltrunc(static_cast<T>((std::numeric_limits<long>::max)() - 1));\n      check_trunc_result(static_cast<T>((std::numeric_limits<long>::max)() - 1), k);\n      k = ltrunc(static_cast<T>((std::numeric_limits<long>::min)() + 1));\n      check_trunc_result(static_cast<T>((std::numeric_limits<long>::min)() + 1), k);\n   }\n#ifndef BOOST_NO_LONG_LONG\n   if (std::numeric_limits<T>::digits >= std::numeric_limits<long long>::digits)\n   {\n      long long j = llround(static_cast<T>((std::numeric_limits<long long>::max)()));\n      check_within_half(static_cast<T>((std::numeric_limits<long long>::max)()), j);\n      BOOST_TEST(j == llround(static_cast<T>((std::numeric_limits<long long>::max)()) + 0));\n      j = llround(static_cast<T>((std::numeric_limits<long long>::min)()));\n      check_within_half(static_cast<T>((std::numeric_limits<long long>::min)()), j);\n      BOOST_TEST(j == llround(static_cast<T>((std::numeric_limits<long long>::min)()) + 0));\n      j = lltrunc(static_cast<T>((std::numeric_limits<long long>::max)()));\n      check_trunc_result(static_cast<T>((std::numeric_limits<long long>::max)()), j);\n      BOOST_TEST(j == lltrunc(static_cast<T>((std::numeric_limits<long long>::max)()) + 0));\n      j = lltrunc(static_cast<T>((std::numeric_limits<long long>::min)()));\n      check_trunc_result(static_cast<T>((std::numeric_limits<long long>::min)()), j);\n      BOOST_TEST(j == lltrunc(static_cast<T>((std::numeric_limits<long long>::min)()) + 0));\n\n      j = llround(static_cast<T>((std::numeric_limits<long long>::max)() - 1));\n      check_within_half(static_cast<T>((std::numeric_limits<long long>::max)() - 1), j);\n      j = llround(static_cast<T>((std::numeric_limits<long long>::min)() + 1));\n      check_within_half(static_cast<T>((std::numeric_limits<long long>::min)() + 1), j);\n      j = lltrunc(static_cast<T>((std::numeric_limits<long long>::max)() - 1));\n      check_trunc_result(static_cast<T>((std::numeric_limits<long long>::max)() - 1), j);\n      j = lltrunc(static_cast<T>((std::numeric_limits<long long>::min)() + 1));\n      check_trunc_result(static_cast<T>((std::numeric_limits<long long>::min)() + 1), j);\n   }\n#endif\n   //\n   // Finish off by testing the error handlers:\n   //\n   T result;\n#ifndef BOOST_NO_EXCEPTIONS\n   BOOST_CHECK_THROW(result = static_cast<T>(iround(static_cast<T>(1e20))), boost::math::rounding_error);\n   BOOST_CHECK_THROW(result = static_cast<T>(iround(static_cast<T>(-1e20))), boost::math::rounding_error);\n   BOOST_CHECK_THROW(result = static_cast<T>(lround(static_cast<T>(1e20))), boost::math::rounding_error);\n   BOOST_CHECK_THROW(result = static_cast<T>(lround(static_cast<T>(-1e20))), boost::math::rounding_error);\n#ifdef BOOST_HAS_LONG_LONG\n   BOOST_CHECK_THROW(result = static_cast<T>(llround(static_cast<T>(1e20))), boost::math::rounding_error);\n   BOOST_CHECK_THROW(result = static_cast<T>(llround(static_cast<T>(-1e20))), boost::math::rounding_error);\n#endif\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      BOOST_CHECK_EQUAL(static_cast<T>(round(std::numeric_limits<T>::infinity())), std::numeric_limits<T>::infinity()); // See C99 Annex F.\n      BOOST_CHECK_THROW(result = static_cast<T>(iround(std::numeric_limits<T>::infinity())), boost::math::rounding_error);\n      BOOST_CHECK_THROW(result = static_cast<T>(iround(-std::numeric_limits<T>::infinity())), boost::math::rounding_error);\n      BOOST_CHECK_THROW(result = static_cast<T>(lround(std::numeric_limits<T>::infinity())), boost::math::rounding_error);\n      BOOST_CHECK_THROW(result = static_cast<T>(lround(-std::numeric_limits<T>::infinity())), boost::math::rounding_error);\n#ifdef BOOST_HAS_LONG_LONG\n      BOOST_CHECK_THROW(result = static_cast<T>(llround(std::numeric_limits<T>::infinity())), boost::math::rounding_error);\n      BOOST_CHECK_THROW(result = static_cast<T>(llround(-std::numeric_limits<T>::infinity())), boost::math::rounding_error);\n#endif\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      BOOST_CHECK((boost::multiprecision::isnan)(round(std::numeric_limits<T>::quiet_NaN())));\n      BOOST_CHECK_THROW(result = static_cast<T>(iround(std::numeric_limits<T>::quiet_NaN())), boost::math::rounding_error);\n      BOOST_CHECK_THROW(result = static_cast<T>(lround(std::numeric_limits<T>::quiet_NaN())), boost::math::rounding_error);\n#ifdef BOOST_HAS_LONG_LONG\n      BOOST_CHECK_THROW(result = static_cast<T>(llround(std::numeric_limits<T>::quiet_NaN())), boost::math::rounding_error);\n#endif\n   }\n   BOOST_CHECK_THROW(result = static_cast<T>(itrunc(static_cast<T>(1e20))), boost::math::rounding_error);\n   BOOST_CHECK_THROW(result = static_cast<T>(itrunc(static_cast<T>(-1e20))), boost::math::rounding_error);\n   BOOST_CHECK_THROW(result = static_cast<T>(ltrunc(static_cast<T>(1e20))), boost::math::rounding_error);\n   BOOST_CHECK_THROW(result = static_cast<T>(ltrunc(static_cast<T>(-1e20))), boost::math::rounding_error);\n#ifdef BOOST_HAS_LONG_LONG\n   BOOST_CHECK_THROW(result = static_cast<T>(lltrunc(static_cast<T>(1e20))), boost::math::rounding_error);\n   BOOST_CHECK_THROW(result = static_cast<T>(lltrunc(static_cast<T>(-1e20))), boost::math::rounding_error);\n#endif\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      BOOST_CHECK_EQUAL(static_cast<T>(trunc(std::numeric_limits<T>::infinity())), std::numeric_limits<T>::infinity());\n      BOOST_CHECK_EQUAL(static_cast<T>(trunc(-std::numeric_limits<T>::infinity())), -std::numeric_limits<T>::infinity());\n      BOOST_CHECK_THROW(result = static_cast<T>(itrunc(std::numeric_limits<T>::infinity())), boost::math::rounding_error);\n      BOOST_CHECK_THROW(result = static_cast<T>(itrunc(-std::numeric_limits<T>::infinity())), boost::math::rounding_error);\n      BOOST_CHECK_THROW(result = static_cast<T>(ltrunc(std::numeric_limits<T>::infinity())), boost::math::rounding_error);\n      BOOST_CHECK_THROW(result = static_cast<T>(ltrunc(-std::numeric_limits<T>::infinity())), boost::math::rounding_error);\n#ifdef BOOST_HAS_LONG_LONG\n      BOOST_CHECK_THROW(result = static_cast<T>(lltrunc(std::numeric_limits<T>::infinity())), boost::math::rounding_error);\n      BOOST_CHECK_THROW(result = static_cast<T>(lltrunc(-std::numeric_limits<T>::infinity())), boost::math::rounding_error);\n#endif\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      BOOST_CHECK((boost::multiprecision::isnan)(trunc(std::numeric_limits<T>::quiet_NaN())));\n      BOOST_CHECK_THROW(result = static_cast<T>(itrunc(std::numeric_limits<T>::quiet_NaN())), boost::math::rounding_error);\n      BOOST_CHECK_THROW(result = static_cast<T>(ltrunc(std::numeric_limits<T>::quiet_NaN())), boost::math::rounding_error);\n#ifdef BOOST_HAS_LONG_LONG\n      BOOST_CHECK_THROW(result = static_cast<T>(lltrunc(std::numeric_limits<T>::quiet_NaN())), boost::math::rounding_error);\n#endif\n   }\n   if (std::numeric_limits<T>::digits >= std::numeric_limits<int>::digits)\n   {\n      BOOST_CHECK_THROW(result = static_cast<T>(itrunc(static_cast<T>((std::numeric_limits<int>::max)()) + 1)), boost::math::rounding_error);\n      BOOST_CHECK_THROW(result = static_cast<T>(itrunc(static_cast<T>((std::numeric_limits<int>::min)()) - 1)), boost::math::rounding_error);\n   }\n   if (std::numeric_limits<T>::digits >= std::numeric_limits<long>::digits)\n   {\n      BOOST_CHECK_THROW(result = static_cast<T>(ltrunc(static_cast<T>((std::numeric_limits<long>::max)()) + 1)), boost::math::rounding_error);\n      BOOST_CHECK_THROW(result = static_cast<T>(ltrunc(static_cast<T>((std::numeric_limits<long>::min)()) - 1)), boost::math::rounding_error);\n   }\n#ifndef BOOST_NO_LONG_LONG\n   if (std::numeric_limits<T>::digits >= std::numeric_limits<long long>::digits)\n   {\n      BOOST_CHECK_THROW(result = static_cast<T>(lltrunc(static_cast<T>((std::numeric_limits<long long>::max)()) + 1)), boost::math::rounding_error);\n      BOOST_CHECK_THROW(result = static_cast<T>(lltrunc(static_cast<T>((std::numeric_limits<long long>::min)()) - 1)), boost::math::rounding_error);\n   }\n#endif\n   if (std::numeric_limits<T>::digits >= std::numeric_limits<int>::digits)\n   {\n      BOOST_CHECK_THROW(result = static_cast<T>(iround(static_cast<T>((std::numeric_limits<int>::max)()) + 1)), boost::math::rounding_error);\n      BOOST_CHECK_THROW(result = static_cast<T>(iround(static_cast<T>((std::numeric_limits<int>::min)()) - 1)), boost::math::rounding_error);\n   }\n   if (std::numeric_limits<T>::digits >= std::numeric_limits<long>::digits)\n   {\n      BOOST_CHECK_THROW(result = static_cast<T>(lround(static_cast<T>((std::numeric_limits<long>::max)()) + 1)), boost::math::rounding_error);\n      BOOST_CHECK_THROW(result = static_cast<T>(lround(static_cast<T>((std::numeric_limits<long>::min)()) - 1)), boost::math::rounding_error);\n   }\n#ifndef BOOST_NO_LONG_LONG\n   if (std::numeric_limits<T>::digits >= std::numeric_limits<long long>::digits)\n   {\n      BOOST_CHECK_THROW(result = static_cast<T>(llround(static_cast<T>((std::numeric_limits<long long>::max)()) + 1)), boost::math::rounding_error);\n      BOOST_CHECK_THROW(result = static_cast<T>(llround(static_cast<T>((std::numeric_limits<long long>::min)()) - 1)), boost::math::rounding_error);\n   }\n#endif\n#endif\n}\n\nint main()\n{\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::mpf_float_50>();\n   test<boost::multiprecision::mpf_float_100>();\n#endif\n#ifdef TEST_MPFR_50\n   test<boost::multiprecision::mpfr_float_50>();\n   test<boost::multiprecision::mpfr_float_100>();\n#endif\n#ifdef TEST_MPFI_50\n   test<boost::multiprecision::mpfi_float_50>();\n   test<boost::multiprecision::mpfi_float_100>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>();\n   test<boost::multiprecision::cpp_dec_float_100>();\n#ifndef SLOW_COMPLER\n   // Some \"peculiar\" digit counts which stress our code:\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();\n#endif\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::cpp_bin_float_100>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();\n#endif\n#ifdef TEST_BACKEND\n   test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_sf_import_c99.cpp",
    "content": "//  (C) Copyright John Maddock 2016.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifdef _MSC_VER\n#pragma warning(disable : 4127) // conditional expression is constant\n#endif\n\n#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) \\\n         && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) \\\n         && !defined(TEST_CPP_DEC_FLOAT_2) && !defined(TEST_CPP_DEC_FLOAT_3) && !defined(TEST_CPP_DEC_FLOAT_4) \\\n         && !defined(TEST_CPP_DEC_FLOAT_5) && !defined(TEST_CPP_DEC_FLOAT_6) && !defined(TEST_CPP_BIN_FLOAT_2) && !defined(TEST_CPP_BIN_FLOAT_3)\\\n         && !defined(TEST_MPFI_DEBUG_ADAPTOR) && !defined(TEST_MPFR_DEBUG_ADAPTOR) && !defined(TEST_MPFI_LOGGED_ADAPTOR) && !defined(TEST_MPFR_LOGGED_ADAPTOR)\n#define TEST_MPF_50\n#define TEST_MPFR_50\n#define TEST_MPFI_50\n#define TEST_CPP_DEC_FLOAT\n#define TEST_CPP_DEC_FLOAT_2\n#define TEST_CPP_DEC_FLOAT_3\n#define TEST_CPP_DEC_FLOAT_4\n#define TEST_CPP_DEC_FLOAT_5\n#define TEST_CPP_DEC_FLOAT_6\n#define TEST_FLOAT128\n#define TEST_CPP_BIN_FLOAT\n#define TEST_CPP_BIN_FLOAT_2\n#define TEST_CPP_BIN_FLOAT_3\n#define TEST_MPFI_DEBUG_ADAPTOR\n#define TEST_MPFR_DEBUG_ADAPTOR\n#define TEST_MPFI_LOGGED_ADAPTOR\n#define TEST_MPFR_LOGGED_ADAPTOR\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_MPFR_50\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#ifdef TEST_MPFI_50\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_2) || defined(TEST_CPP_DEC_FLOAT_3) || defined(TEST_CPP_DEC_FLOAT_4) || defined(TEST_CPP_DEC_FLOAT_5) || defined(TEST_CPP_DEC_FLOAT_6)\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#if defined(TEST_CPP_BIN_FLOAT) || defined(TEST_CPP_BIN_FLOAT_2) || defined(TEST_CPP_BIN_FLOAT_3)\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/debug_adaptor.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#ifdef TEST_MPFI_DEBUG_ADAPTOR\n#  include <boost/multiprecision/mpfi.hpp>\n#  include <boost/multiprecision/debug_adaptor.hpp>\n#endif\n#ifdef TEST_MPFR_DEBUG_ADAPTOR\n#  include <boost/multiprecision/mpfr.hpp>\n#  include <boost/multiprecision/debug_adaptor.hpp>\n#endif\n#ifdef TEST_MPFI_LOGGED_ADAPTOR\n#  include <boost/multiprecision/mpfi.hpp>\n#  include <boost/multiprecision/logged_adaptor.hpp>\n#endif\n#ifdef TEST_MPFR_LOGGED_ADAPTOR\n#  include <boost/multiprecision/mpfr.hpp>\n#  include <boost/multiprecision/logged_adaptor.hpp>\n#endif\n\n#include <boost/math/constants/constants.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#include \"test.hpp\"\n\n#ifdef signbit\n#undef signbit\n#endif\n#ifdef sign\n#undef sign\n#endif\n#ifdef changesign\n#undef changesign\n#endif\n#ifdef copysign\n#undef copysign\n#endif\n#ifdef fpclassify\n#undef fpclassify\n#endif\n#ifdef isinf\n#undef isinf\n#endif\n#ifdef isnan\n#undef isnan\n#endif\n#ifdef isnormal\n#undef isnormal\n#endif\n\n#ifdef MPFR_VERSION_MAJOR\n#define BOOST_MPFR_VERSION MPFR_VERSION_MAJOR * 10000 + MPFR_VERSION_MINOR * 100 + MPFR_VERSION_PATCHLEVEL\n#endif\n\ntemplate <class T, class U>\nvoid test_less(T a, U b)\n{\n   BOOST_CHECK(a < b);\n   BOOST_CHECK(a <= b);\n   BOOST_CHECK(!(a > b));\n   BOOST_CHECK(!(a >= b));\n   BOOST_CHECK(!(a == b));\n   BOOST_CHECK((a != b));\n\n   BOOST_CHECK(b > a);\n   BOOST_CHECK(b >= a);\n   BOOST_CHECK(!(b < a));\n   BOOST_CHECK(!(b <= a));\n   BOOST_CHECK(!(b == a));\n   BOOST_CHECK((b != a));\n\n   BOOST_CHECK(isless(a, b));\n   BOOST_CHECK(islessequal(a, b));\n   BOOST_CHECK(!isgreater(a, b));\n   BOOST_CHECK(!isgreaterequal(a, b));\n   BOOST_CHECK(islessgreater(a, b));\n\n   BOOST_CHECK(!isless(b, a));\n   BOOST_CHECK(!islessequal(b, a));\n   BOOST_CHECK(isgreater(b, a));\n   BOOST_CHECK(isgreaterequal(b, a));\n   BOOST_CHECK(islessgreater(b, a));\n}\ntemplate <class T, class U>\nvoid test_equal(T a, U b)\n{\n   BOOST_CHECK(!(a < b));\n   BOOST_CHECK(a <= b);\n   BOOST_CHECK(!(a > b));\n   BOOST_CHECK((a >= b));\n   BOOST_CHECK((a == b));\n   BOOST_CHECK(!(a != b));\n\n   BOOST_CHECK(!(b > a));\n   BOOST_CHECK(b >= a);\n   BOOST_CHECK(!(b < a));\n   BOOST_CHECK((b <= a));\n   BOOST_CHECK((b == a));\n   BOOST_CHECK(!(b != a));\n\n   BOOST_CHECK(!isless(a, b));\n   BOOST_CHECK(islessequal(a, b));\n   BOOST_CHECK(!isgreater(a, b));\n   BOOST_CHECK(isgreaterequal(a, b));\n   BOOST_CHECK(!islessgreater(a, b));\n\n   BOOST_CHECK(!isless(b, a));\n   BOOST_CHECK(islessequal(b, a));\n   BOOST_CHECK(!isgreater(b, a));\n   BOOST_CHECK(isgreaterequal(b, a));\n   BOOST_CHECK(!islessgreater(b, a));\n}\ntemplate <class T, class U>\nvoid test_unordered(T a, U b)\n{\n   BOOST_CHECK(!(a < b));\n   BOOST_CHECK(!(a <= b));\n   BOOST_CHECK(!(a > b));\n   BOOST_CHECK(!(a >= b));\n   BOOST_CHECK(!(a == b));\n   BOOST_CHECK((a != b));\n\n   BOOST_CHECK(!(b > a));\n   BOOST_CHECK(!(b >= a));\n   BOOST_CHECK(!(b < a));\n   BOOST_CHECK(!(b <= a));\n   BOOST_CHECK(!(b == a));\n   BOOST_CHECK((b != a));\n\n   BOOST_CHECK(!isless(a, b));\n   BOOST_CHECK(!islessequal(a, b));\n   BOOST_CHECK(!isgreater(a, b));\n   BOOST_CHECK(!isgreaterequal(a, b));\n   BOOST_CHECK(!islessgreater(a, b));\n\n   BOOST_CHECK(!isless(b, a));\n   BOOST_CHECK(!islessequal(b, a));\n   BOOST_CHECK(!isgreater(b, a));\n   BOOST_CHECK(!isgreaterequal(b, a));\n   BOOST_CHECK(!islessgreater(b, a));\n}\n\ntemplate <class T>\nvoid test()\n{\n   //\n   // Basic sanity checks for C99 functions which are just imported versions\n   // from Boost.Math.  These should still be found via ADL so no using declarations here...\n   //\n   T val = 2;\n   BOOST_CHECK(signbit(val) == 0);\n   BOOST_CHECK(signbit(val + 2) == 0);\n   val = -val;\n   BOOST_CHECK(signbit(val));\n   BOOST_CHECK(signbit(val * 2));\n\n   val = 2;\n   BOOST_CHECK_EQUAL(sign(val), 1);\n   BOOST_CHECK_EQUAL(sign(val + 2), 1);\n   val = -val;\n   BOOST_CHECK_EQUAL(sign(val), -1);\n   BOOST_CHECK_EQUAL(sign(val * 2), -1);\n   val = 0;\n   BOOST_CHECK_EQUAL(sign(val), 0);\n   BOOST_CHECK_EQUAL(sign(val * 2), 0);\n\n   val = 2;\n   BOOST_CHECK_EQUAL(changesign(val), -2);\n   BOOST_CHECK_EQUAL(changesign(val * 2), -4);\n   val = -2;\n   BOOST_CHECK_EQUAL(changesign(val), 2);\n   BOOST_CHECK_EQUAL(changesign(val * 2), 4);\n   val = 0;\n   BOOST_CHECK_EQUAL(changesign(val), 0);\n   BOOST_CHECK_EQUAL(changesign(val * 2), 0);\n   // Things involving signed zero, need to detect it first:\n   T neg_zero_test = -(std::numeric_limits<T>::min)();\n   neg_zero_test /= (std::numeric_limits<T>::max)();\n   T    one(1);\n   bool test_signed_zero = !boost::multiprecision::is_interval_number<T>::value && std::numeric_limits<T>::has_infinity && (one / neg_zero_test < 0);\n   if (test_signed_zero)\n   {\n      BOOST_CHECK(signbit(changesign(val)));\n      BOOST_CHECK(signbit(changesign(val * 2)));\n   }\n\n   T s = 2;\n   val = 3;\n   BOOST_CHECK_EQUAL(copysign(val, s), 3);\n   BOOST_CHECK_EQUAL(copysign(val, s * -2), -3);\n   BOOST_CHECK_EQUAL(copysign(-2 * val, s), 6);\n   BOOST_CHECK_EQUAL(copysign(-2 * val, 2 * s), 6);\n   s = -2;\n   BOOST_CHECK_EQUAL(copysign(val, s), -3);\n   BOOST_CHECK_EQUAL(copysign(val, s * -2), 3);\n   BOOST_CHECK_EQUAL(copysign(-2 * val, s), -6);\n   BOOST_CHECK_EQUAL(copysign(-2 * val, 2 * s), -6);\n   val = -3;\n   BOOST_CHECK_EQUAL(copysign(val, s), -3);\n   BOOST_CHECK_EQUAL(copysign(val, s * -2), 3);\n   BOOST_CHECK_EQUAL(copysign(-2 * val, s), -6);\n   BOOST_CHECK_EQUAL(copysign(-2 * val, 2 * s), -6);\n   s = 0;\n   BOOST_CHECK_EQUAL(copysign(val, s), 3);\n   // Things involving signed zero, need to detect it first:\n   if (test_signed_zero)\n   {\n      BOOST_CHECK_EQUAL(copysign(val, s * -2), -3);\n   }\n   BOOST_CHECK_EQUAL(copysign(-2 * val, s), 6);\n   BOOST_CHECK_EQUAL(copysign(-2 * val, 2 * s), 6);\n   // Things involving signed zero, need to detect it first:\n   if (test_signed_zero)\n   {\n      s = changesign(s);\n      if (signbit(s))\n      {\n         BOOST_CHECK_EQUAL(copysign(val, s), -3);\n         BOOST_CHECK_EQUAL(copysign(val, s * -2), 3);\n         BOOST_CHECK_EQUAL(copysign(-2 * val, s), -6);\n         BOOST_CHECK_EQUAL(copysign(-2 * val, 2 * s), -6);\n      }\n   }\n\n   val = 3;\n   BOOST_CHECK_EQUAL(fpclassify(val), FP_NORMAL);\n   BOOST_CHECK_EQUAL(fpclassify(val * 3), FP_NORMAL);\n   BOOST_CHECK(!isinf(val));\n   BOOST_CHECK(!isinf(val + 2));\n   BOOST_CHECK(!isnan(val));\n   BOOST_CHECK(!isnan(val + 2));\n   BOOST_CHECK(isnormal(val));\n   BOOST_CHECK(isnormal(val + 2));\n   val = -3;\n   BOOST_CHECK_EQUAL(fpclassify(val), FP_NORMAL);\n   BOOST_CHECK_EQUAL(fpclassify(val * 3), FP_NORMAL);\n   BOOST_CHECK(!isinf(val));\n   BOOST_CHECK(!isinf(val + 2));\n   BOOST_CHECK(!isnan(val));\n   BOOST_CHECK(!isnan(val + 2));\n   BOOST_CHECK(isnormal(val));\n   BOOST_CHECK(isnormal(val + 2));\n   val = 0;\n   BOOST_CHECK_EQUAL(fpclassify(val), FP_ZERO);\n   BOOST_CHECK_EQUAL(fpclassify(val * 3), FP_ZERO);\n   BOOST_CHECK(!isinf(val));\n   BOOST_CHECK(!isinf(val + 2));\n   BOOST_CHECK(!isnan(val));\n   BOOST_CHECK(!isnan(val + 2));\n   BOOST_CHECK(!isnormal(val));\n   BOOST_CHECK(!isnormal(val * 2));\n   BOOST_CHECK(!isnormal(val * -2));\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      val = std::numeric_limits<T>::infinity();\n      BOOST_CHECK_EQUAL(fpclassify(val), FP_INFINITE);\n      BOOST_CHECK_EQUAL(fpclassify(val * 3), FP_INFINITE);\n      BOOST_CHECK(isinf(val));\n      BOOST_CHECK(isinf(val + 2));\n      BOOST_CHECK(!isnan(val));\n      BOOST_CHECK(!isnan(val + 2));\n      BOOST_CHECK(!isnormal(val));\n      BOOST_CHECK(!isnormal(val + 2));\n      val = -val;\n      BOOST_CHECK_EQUAL(fpclassify(val), FP_INFINITE);\n      BOOST_CHECK_EQUAL(fpclassify(val * 3), FP_INFINITE);\n      BOOST_CHECK(isinf(val));\n      BOOST_CHECK(isinf(val + 2));\n      BOOST_CHECK(!isnan(val));\n      BOOST_CHECK(!isnan(val + 2));\n      BOOST_CHECK(!isnormal(val));\n      BOOST_CHECK(!isnormal(val + 2));\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      val = std::numeric_limits<T>::quiet_NaN();\n      BOOST_CHECK_EQUAL(fpclassify(val), FP_NAN);\n      BOOST_CHECK_EQUAL(fpclassify(val * 3), FP_NAN);\n      BOOST_CHECK(!isinf(val));\n      BOOST_CHECK(!isinf(val + 2));\n      BOOST_CHECK(isnan(val));\n      BOOST_CHECK(isnan(val + 2));\n      BOOST_CHECK(!isnormal(val));\n      BOOST_CHECK(!isnormal(val + 2));\n   }\n   s   = 8 * std::numeric_limits<T>::epsilon();\n   val = 2.5;\n   BOOST_CHECK_CLOSE_FRACTION(asinh(val), T(\"1.6472311463710957106248586104436196635044144301932365282203100930843983757633104078778420255069424907777006132075516484778755360595913172299093829522950397895699619540523579875476513967578478619028438291006578604823887119907434\"), s);\n   BOOST_CHECK_CLOSE_FRACTION(asinh(val + T(0)), T(\"1.6472311463710957106248586104436196635044144301932365282203100930843983757633104078778420255069424907777006132075516484778755360595913172299093829522950397895699619540523579875476513967578478619028438291006578604823887119907434\"), s);\n   BOOST_CHECK_CLOSE_FRACTION(acosh(val), T(\"1.5667992369724110786640568625804834938620823510926588639329459980122148134693922696279968499622201141051039184050936311066453565386393240356562374302417843319480223211857615778787272615171906055455922537080327062362258846337050\"), s);\n   BOOST_CHECK_CLOSE_FRACTION(acosh(val + T(0)), T(\"1.5667992369724110786640568625804834938620823510926588639329459980122148134693922696279968499622201141051039184050936311066453565386393240356562374302417843319480223211857615778787272615171906055455922537080327062362258846337050\"), s);\n   val = 0.5;\n   BOOST_CHECK_CLOSE_FRACTION(atanh(val), T(\"0.5493061443340548456976226184612628523237452789113747258673471668187471466093044834368078774068660443939850145329789328711840021129652599105264009353836387053015813845916906835896868494221804799518712851583979557605727959588753\"), s);\n   BOOST_CHECK_CLOSE_FRACTION(atanh(val + T(0)), T(\"0.5493061443340548456976226184612628523237452789113747258673471668187471466093044834368078774068660443939850145329789328711840021129652599105264009353836387053015813845916906835896868494221804799518712851583979557605727959588753\"), s);\n   val = 55.25;\n   BOOST_CHECK_CLOSE_FRACTION(cbrt(val), T(\"3.8087058015466360309383876359583281382991983919300128125378938779672144843676192684301168479657279498120767424724024965319869248797423276064015643361426189576415670917818313417529572608229017809069355688606687557031643655896118\"), s);\n   BOOST_CHECK_CLOSE_FRACTION(cbrt(val + T(0)), T(\"3.8087058015466360309383876359583281382991983919300128125378938779672144843676192684301168479657279498120767424724024965319869248797423276064015643361426189576415670917818313417529572608229017809069355688606687557031643655896118\"), s);\n   if (!boost::multiprecision::is_interval_number<T>::value)\n   {\n      val = 2.75;\n      BOOST_CHECK_CLOSE_FRACTION(erf(val), T(\"0.9998993780778803631630956080249130432349352621422640655161095794654526422025908961447328296681056892975214344779300734620255391682713519265048496199034963706976420982849598189071465666866369396765001072187538732800143945532487\"), s);\n      BOOST_CHECK_CLOSE_FRACTION(erf(val + T(0)), T(\"0.9998993780778803631630956080249130432349352621422640655161095794654526422025908961447328296681056892975214344779300734620255391682713519265048496199034963706976420982849598189071465666866369396765001072187538732800143945532487\"), s);\n      BOOST_CHECK_CLOSE_FRACTION(erfc(val), T(\"0.0001006219221196368369043919750869567650647378577359344838904205345473577974091038552671703318943107024785655220699265379744608317286480734951503800965036293023579017150401810928534333133630603234998927812461267199856054467512\"), s);\n      BOOST_CHECK_CLOSE_FRACTION(erfc(val + T(0)), T(\"0.0001006219221196368369043919750869567650647378577359344838904205345473577974091038552671703318943107024785655220699265379744608317286480734951503800965036293023579017150401810928534333133630603234998927812461267199856054467512\"), s);\n   }\n   val = 0.125;\n   BOOST_CHECK_CLOSE_FRACTION(expm1(val), T(\"0.1331484530668263168290072278117938725655031317451816259128200360788235778800483865139399907949417285732315270156473075657048210452584733998785564025916995261162759280700397984729320345630340659469435372721057879969170503978449\"), s);\n   BOOST_CHECK_CLOSE_FRACTION(expm1(val + T(0)), T(\"0.1331484530668263168290072278117938725655031317451816259128200360788235778800483865139399907949417285732315270156473075657048210452584733998785564025916995261162759280700397984729320345630340659469435372721057879969170503978449\"), s);\n\n   val = 20;\n   s   = 2;\n   BOOST_CHECK_EQUAL(fdim(val, s), 18);\n   BOOST_CHECK_EQUAL(fdim(s, val), 0);\n   BOOST_CHECK_EQUAL(fdim(val, s * 2), 16);\n   BOOST_CHECK_EQUAL(fdim(s * 2, val), 0);\n   BOOST_CHECK_EQUAL(fdim(val, 2), 18);\n   BOOST_CHECK_EQUAL(fdim(2, val), 0);\n\n   BOOST_CHECK_EQUAL(fmax(val, s), val);\n   BOOST_CHECK_EQUAL(fmax(s, val), val);\n   BOOST_CHECK_EQUAL(fmax(val * 2, s), val * 2);\n   BOOST_CHECK_EQUAL(fmax(val, s * 2), val);\n   BOOST_CHECK_EQUAL(fmax(val * 2, s * 2), val * 2);\n   BOOST_CHECK_EQUAL(fmin(val, s), s);\n   BOOST_CHECK_EQUAL(fmin(s, val), s);\n   BOOST_CHECK_EQUAL(fmin(val * 2, s), s);\n   BOOST_CHECK_EQUAL(fmin(val, s * 2), s * 2);\n   BOOST_CHECK_EQUAL(fmin(val * 2, s * 2), s * 2);\n\n   BOOST_CHECK_EQUAL(fmax(val, 2), val);\n   BOOST_CHECK_EQUAL(fmax(val, 2.0), val);\n   BOOST_CHECK_EQUAL(fmax(20, s), val);\n   BOOST_CHECK_EQUAL(fmax(20.0, s), val);\n   BOOST_CHECK_EQUAL(fmin(val, 2), s);\n   BOOST_CHECK_EQUAL(fmin(val, 2.0), s);\n   BOOST_CHECK_EQUAL(fmin(20, s), s);\n   BOOST_CHECK_EQUAL(fmin(20.0, s), s);\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      BOOST_CHECK_EQUAL(fmax(val, std::numeric_limits<T>::quiet_NaN()), val);\n      BOOST_CHECK_EQUAL(fmax(std::numeric_limits<T>::quiet_NaN(), val), val);\n      BOOST_CHECK_EQUAL(fmin(val, std::numeric_limits<T>::quiet_NaN()), val);\n      BOOST_CHECK_EQUAL(fmin(std::numeric_limits<T>::quiet_NaN(), val), val);\n   }\n   if (std::numeric_limits<double>::has_quiet_NaN)\n   {\n      BOOST_CHECK_EQUAL(fmax(val, std::numeric_limits<double>::quiet_NaN()), val);\n      BOOST_CHECK_EQUAL(fmax(std::numeric_limits<double>::quiet_NaN(), val), val);\n      BOOST_CHECK_EQUAL(fmin(val, std::numeric_limits<double>::quiet_NaN()), val);\n      BOOST_CHECK_EQUAL(fmin(std::numeric_limits<double>::quiet_NaN(), val), val);\n   }\n\n   test_less(s, val);\n   test_less(2, val);\n   test_less(s, 20);\n   test_less(s + 0, val);\n   test_less(s, val * 1);\n   test_less(s * 1, val * 1);\n   test_less(s * 1, 20);\n   test_less(s + 2, val * 2);\n\n   test_equal(val, val);\n   test_equal(20, val);\n   test_equal(val, 20);\n   test_equal(val + 0, val);\n   test_equal(val, val * 1);\n   test_equal(val * 1, val * 1);\n   test_equal(val * 1, 20);\n   test_equal(val * 20, val * 20);\n\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      s = std::numeric_limits<T>::quiet_NaN();\n      test_unordered(s, val);\n      test_unordered(s, 20);\n      test_unordered(s + 0, val);\n      test_unordered(s, val * 1);\n      test_unordered(s * 1, val * 1);\n      test_unordered(s * 1, 20);\n      test_unordered(s + 2, val * 2);\n      if (std::numeric_limits<double>::has_quiet_NaN)\n      {\n         double n = std::numeric_limits<double>::quiet_NaN();\n         test_unordered(n, val);\n      }\n   }\n\n   T tol = 8 * std::numeric_limits<T>::epsilon();\n   s     = 2;\n   BOOST_CHECK_CLOSE_FRACTION(T(hypot(val, s)), T(\"20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530\"), tol);\n   BOOST_CHECK_CLOSE_FRACTION(T(hypot(val, 2)), T(\"20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530\"), tol);\n   BOOST_CHECK_CLOSE_FRACTION(T(hypot(val, 2.0)), T(\"20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530\"), tol);\n   BOOST_CHECK_CLOSE_FRACTION(T(hypot(20, s)), T(\"20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530\"), tol);\n   BOOST_CHECK_CLOSE_FRACTION(T(hypot(20.0, s)), T(\"20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530\"), tol);\n   BOOST_CHECK_CLOSE_FRACTION(T(hypot(val * 1, s)), T(\"20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530\"), tol);\n   BOOST_CHECK_CLOSE_FRACTION(T(hypot(val * 1, s * 1)), T(\"20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530\"), tol);\n   BOOST_CHECK_CLOSE_FRACTION(T(hypot(val * 1, 2)), T(\"20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530\"), tol);\n   BOOST_CHECK_CLOSE_FRACTION(T(hypot(val * 1, 2.0)), T(\"20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530\"), tol);\n   BOOST_CHECK_CLOSE_FRACTION(T(hypot(20, s * 1)), T(\"20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530\"), tol);\n   BOOST_CHECK_CLOSE_FRACTION(T(hypot(20.0, s * 1)), T(\"20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530\"), tol);\n\n   BOOST_CHECK_CLOSE_FRACTION(lgamma(val), T(\"39.339884187199494036224652394567381081691457206897853119937969989377572554993874476249340525204204720861169039582\"), tol);\n   BOOST_CHECK_CLOSE_FRACTION(lgamma(val + 0), T(\"39.339884187199494036224652394567381081691457206897853119937969989377572554993874476249340525204204720861169039582\"), tol);\n\n   BOOST_CHECK_EQUAL(lrint(val), 20);\n   BOOST_CHECK_EQUAL(lrint(val * 2), 40);\n   BOOST_CHECK_EQUAL(llrint(val), 20);\n   BOOST_CHECK_EQUAL(llrint(val * 2), 40);\n\n   val = 0.125;\n   BOOST_CHECK_CLOSE_FRACTION(log1p(val), T(\"0.117783035656383454538794109470521705068480712564733141107348638794807720528133786929641528638208114949935615070\"), tol);\n   BOOST_CHECK_CLOSE_FRACTION(log1p(val + 0), T(\"0.117783035656383454538794109470521705068480712564733141107348638794807720528133786929641528638208114949935615070\"), tol);\n   val = 20;\n   BOOST_CHECK_CLOSE_FRACTION(T(log2(val)), T(\"4.321928094887362347870319429489390175864831393024580612054756395815934776608625215850139743359370155099657371710\"), tol);\n   BOOST_CHECK_CLOSE_FRACTION(T(log2(val + 0)), T(\"4.321928094887362347870319429489390175864831393024580612054756395815934776608625215850139743359370155099657371710\"), tol);\n\n   BOOST_CHECK_EQUAL(T(nearbyint(val)), 20);\n   BOOST_CHECK_EQUAL(T(nearbyint(val + 0.25)), 20);\n   BOOST_CHECK_EQUAL(T(rint(val)), 20);\n   BOOST_CHECK_EQUAL(T(rint(val + 0.25)), 20);\n\n   BOOST_CHECK_GT(nextafter(val, T(200)), val);\n   BOOST_CHECK_GT(nextafter(val + 0, T(200)), val);\n   BOOST_CHECK_GT(nextafter(val + 0, T(200) + 1), val);\n   BOOST_CHECK_GT(nextafter(val, T(200) + 1), val);\n\n   BOOST_CHECK_GT(nexttoward(val, T(200)), val);\n   BOOST_CHECK_GT(nexttoward(val + 0, T(200)), val);\n   BOOST_CHECK_GT(nexttoward(val + 0, T(200) + 1), val);\n   BOOST_CHECK_GT(nexttoward(val, T(200) + 1), val);\n\n   val = 21;\n   s   = 5;\n   BOOST_CHECK_EQUAL(T(remainder(val, s)), 1);\n   BOOST_CHECK_EQUAL(T(remainder(val, 5)), 1);\n   BOOST_CHECK_EQUAL(T(remainder(21, s)), 1);\n   BOOST_CHECK_EQUAL(T(remainder(val * 1, s)), 1);\n   BOOST_CHECK_EQUAL(T(remainder(val * 1, s * 1)), 1);\n   BOOST_CHECK_EQUAL(T(remainder(val, s * 1)), 1);\n   BOOST_CHECK_EQUAL(T(remainder(val * 1, 5)), 1);\n   BOOST_CHECK_EQUAL(T(remainder(21, s * 1)), 1);\n   int i(0);\n   BOOST_CHECK_EQUAL(T(remquo(val, s, &i)), 1);\n   BOOST_CHECK_EQUAL(i, 4);\n   i = 0;\n   BOOST_CHECK_EQUAL(T(remquo(val, 5, &i)), 1);\n   BOOST_CHECK_EQUAL(i, 4);\n   i = 0;\n   BOOST_CHECK_EQUAL(T(remquo(21, s, &i)), 1);\n   BOOST_CHECK_EQUAL(i, 4);\n   i = 0;\n   BOOST_CHECK_EQUAL(T(remquo(val * 1, s, &i)), 1);\n   BOOST_CHECK_EQUAL(i, 4);\n   i = 0;\n   BOOST_CHECK_EQUAL(T(remquo(val * 1, s * 1, &i)), 1);\n   BOOST_CHECK_EQUAL(i, 4);\n   i = 0;\n   BOOST_CHECK_EQUAL(T(remquo(val, s * 1, &i)), 1);\n   BOOST_CHECK_EQUAL(i, 4);\n   i = 0;\n   BOOST_CHECK_EQUAL(T(remquo(val * 1, 5, &i)), 1);\n   BOOST_CHECK_EQUAL(i, 4);\n   i = 0;\n   BOOST_CHECK_EQUAL(T(remquo(21, s * 1, &i)), 1);\n   BOOST_CHECK_EQUAL(i, 4);\n   i   = 0;\n   val = 5.25;\n   tol = 3000;\n   BOOST_CHECK_CLOSE_FRACTION(tgamma(val), T(\"35.211611852799685705225257690531248115026311138908448314086859575901217653313145619623624570033258659272301335544\"), tol);\n   BOOST_CHECK_CLOSE_FRACTION(tgamma(val + 1), T(\"184.86096222719834995243260287528905260388813347926935364895601277348139267989401450302402899267460796117958201160\"), tol);\n\n   BOOST_CHECK_CLOSE_FRACTION(T(exp2(val)), T(\"38.054627680087074134959999057935229289375106958842157216608071191022933383261349115865003025220405558913196632792\"), tol);\n   BOOST_CHECK_CLOSE_FRACTION(T(exp2(val + 1)), T(\"76.109255360174148269919998115870458578750213917684314433216142382045866766522698231730006050440811117826393265585\"), tol);\n   val = 15;\n   BOOST_CHECK_CLOSE_FRACTION(T(exp2(val)), T(32768uL), tol);\n   BOOST_CHECK_CLOSE_FRACTION(T(exp2(val + 1)), T(65536uL), tol);\n\n   i = fpclassify(val) + isgreaterequal(val, s) + islessequal(val, s) + isnan(val) + isunordered(val, s) + isfinite(val) + isinf(val) + islessgreater(val, s) + isnormal(val) + signbit(val) + isgreater(val, s) + isless(val, s);\n}\n\ntemplate <class T>\nvoid test_poison()\n{\n   // use these macros as proxies for determining C99 support:\n#if defined(FP_ILOGB0) && defined(FP_INFINITE)\n   //\n   // These tests verify that our function overloads for Boost.Multiprecision\n   // don't do anything nasty to the std:: overloads for built in types:\n   //\n   using namespace std;\n   using namespace boost::multiprecision;\n   //using namespace boost::math;\n\n   T   a(2), b(0.3f), c(4), result(0);\n   int i;\n\n   result += abs(a);\n   result += cosh(a);\n   result += fmod(a, b);\n   result += logb(a);\n   result += remquo(a, b, &i);\n   result += acos(b);\n   result += erf(a);\n   result += frexp(a, &i);\n   result += lrint(a);\n   result += rint(a);\n   result += acosh(b);\n   result += erfc(b);\n   result += hypot(a, b);\n   result += lround(c);\n   result += round(c);\n   result += asin(b);\n   result += exp2(a);\n   result += ilogb(b);\n   result += modf(a, &b);\n   result += scalbln(a, i);\n   result += asinh(b);\n   result += exp(b);\n   result += ldexp(a, i);\n   result += scalbn(a, i);\n   result += atan(b);\n   result += expm1(a);\n   result += lgamma(a);\n   result += sin(b);\n   result += atan2(a, c);\n   result += fabs(a);\n   result += llrint(a);\n   result += sinh(b);\n   result += atanh(b);\n   result += fdim(a, b);\n   result += llround(a);\n   result += nearbyint(a);\n   result += sqrt(b);\n   result += cbrt(a);\n   result += floor(b);\n   result += log(a);\n   result += nextafter(a, b);\n   result += tan(b);\n   result += ceil(b);\n   result += fma(a, b, c);\n   result += log10(a);\n   result += nexttoward(a, b);\n   result += tanh(a);\n   result += copysign(a, b);\n   result += fmax(a, b);\n   result += log1p(a);\n   result += pow(a, b);\n   result += tgamma(a);\n   result += cos(b);\n   result += fmin(a, b);\n   result += log2(a);\n   result += remainder(a, b);\n   result += trunc(b);\n   result += (min)(a, b);\n   result += (max)(a, b);\n\n#if !BOOST_WORKAROUND(BOOST_LIBSTDCXX_VERSION, < 60000)\n\n   i = fpclassify(a) + isgreaterequal(a, b) + islessequal(a, b) + isnan(a) + isunordered(a, b) + isfinite(a) + isinf(a) + islessgreater(a, b) + isnormal(a) + signbit(a) + isgreater(a, b) + isless(a, b);\n#endif\n#endif\n}\n\ntemplate <class T>\nbool type_sets_errno(const T&)\n{\n   return true;\n}\n#ifdef TEST_MPFR_50\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nbool type_sets_errno(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>&)\n{\n   return false;\n}\n#endif\n#ifdef TEST_MPFR_DEBUG_ADAPTOR\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nbool type_sets_errno(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>&)\n{\n   return false;\n}\n#endif\n#ifdef TEST_MPFI_DEBUG_ADAPTOR\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nbool type_sets_errno(const boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>&)\n{\n   return false;\n}\n#endif\n#ifdef TEST_MPFR_LOGGED_ADAPTOR\ntemplate <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>\nbool type_sets_errno(const boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType> >, ExpressionTemplates>&)\n{\n   return false;\n}\n#endif\n#ifdef TEST_MPFI_LOGGED_ADAPTOR\ntemplate <unsigned Digits10, boost::multiprecision::expression_template_option ExpressionTemplates>\nbool type_sets_errno(const boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::mpfi_float_backend<Digits10> >, ExpressionTemplates>&)\n{\n   return false;\n}\n#endif\n#ifdef TEST_FLOAT128\nbool type_sets_errno(const boost::multiprecision::float128&)\n{\n   return false;\n}\n#endif\n\ntemplate <class T>\ntypename std::enable_if<std::numeric_limits<T>::is_specialized>::type check_invalid(const T& val)\n{\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      BOOST_CHECK(isnan(val));\n   }\n   else\n   {\n      BOOST_CHECK_EQUAL(val, 0);\n   }\n   if (type_sets_errno(val))\n      BOOST_CHECK_EQUAL(errno, EDOM);\n   errno = 0;\n}\n\ntemplate <class T>\ntypename std::enable_if<!std::numeric_limits<T>::is_specialized>::type check_invalid(const T& val)\n{\n   check_invalid(static_cast<typename T::result_type>(val));\n}\n\ntemplate <class T>\nvoid check_erange(const T& val)\n{\n   if (type_sets_errno(val))\n      BOOST_CHECK_EQUAL(errno, ERANGE);\n   errno = 0;\n}\n\ntemplate <class T>\nvoid test_c99_appendix_F()\n{\n   //\n   // Tests conformance to non-normative appendix F.9.1 of C99, basically how to handle\n   // special cases, infinities and NaN's.\n   //\n   errno = 0;\n   T tol = std::numeric_limits<T>::epsilon();\n   // F.9.1.1:\n   T arg = 1;\n   T val = acos(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = 2;\n   check_invalid(acos(arg));\n   arg = -2;\n   check_invalid(acos(arg));\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      check_invalid(acos(arg));\n      arg = -std::numeric_limits<T>::infinity();\n      check_invalid(acos(arg));\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(acos(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(acos(arg));\n   }\n   // F.9.1.2:\n   arg = 0;\n   val = asin(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = asin(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   arg = 2;\n   check_invalid(asin(arg));\n   arg = -2;\n   check_invalid(asin(arg));\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      check_invalid(asin(arg));\n      arg = -std::numeric_limits<T>::infinity();\n      check_invalid(asin(arg));\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(asin(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(asin(arg));\n   }\n   // F.9.1.3:\n   arg = 0;\n   val = atan(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = atan(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      val = atan(arg);\n      BOOST_CHECK_EQUAL(val, boost::math::constants::half_pi<T>());\n      arg = -std::numeric_limits<T>::infinity();\n      val = atan(arg);\n      BOOST_CHECK_EQUAL(val, -boost::math::constants::half_pi<T>());\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(asin(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(asin(arg));\n   }\n   // F.9.1.4:\n   arg    = 0;\n   T arg2 = 0;\n   val    = atan2(arg, arg2);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = atan2(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   arg2 = -arg2;\n   if (signbit(arg2))\n   {\n      arg = 0;\n      val = atan2(arg, arg2);\n      BOOST_CHECK_EQUAL(val, boost::math::constants::pi<T>());\n      BOOST_CHECK(signbit(val) == 0);\n      arg = -arg;\n      val = atan2(arg, arg2);\n      BOOST_CHECK_EQUAL(val, -boost::math::constants::pi<T>());\n      BOOST_CHECK(signbit(val));\n   }\n   arg  = 0;\n   arg2 = -2;\n   val  = atan2(arg, arg2);\n   BOOST_CHECK_EQUAL(val, boost::math::constants::pi<T>());\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = atan2(arg, arg2);\n      BOOST_CHECK_EQUAL(val, -boost::math::constants::pi<T>());\n   }\n   arg  = 0;\n   arg2 = 2;\n   val  = atan2(arg, arg2);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = atan2(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   arg  = -2;\n   arg2 = 0;\n   val  = atan2(arg, arg2);\n   BOOST_CHECK_EQUAL(val, -boost::math::constants::half_pi<T>());\n   arg2 = -arg2;\n   if (signbit(arg2))\n   {\n      val = atan2(arg, arg2);\n      BOOST_CHECK_EQUAL(val, -boost::math::constants::half_pi<T>());\n   }\n   arg  = 2;\n   arg2 = 0;\n   val  = atan2(arg, arg2);\n   BOOST_CHECK_EQUAL(val, boost::math::constants::half_pi<T>());\n   arg2 = -arg2;\n   if (signbit(arg2))\n   {\n      val = atan2(arg, arg2);\n      BOOST_CHECK_EQUAL(val, boost::math::constants::half_pi<T>());\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg  = 2;\n      arg2 = -std::numeric_limits<T>::infinity();\n      val  = atan2(arg, arg2);\n      BOOST_CHECK_EQUAL(val, boost::math::constants::pi<T>());\n      arg = -arg;\n      val = atan2(arg, arg2);\n      BOOST_CHECK_EQUAL(val, -boost::math::constants::pi<T>());\n      arg  = 2;\n      arg2 = std::numeric_limits<T>::infinity();\n      val  = atan2(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val) == 0);\n      arg = -arg;\n      if (signbit(-T(0)))\n      {\n         val = atan2(arg, arg2);\n         BOOST_CHECK_EQUAL(val, 0);\n         BOOST_CHECK(signbit(val));\n      }\n      arg  = std::numeric_limits<T>::infinity();\n      arg2 = 2;\n      val  = atan2(arg, arg2);\n      BOOST_CHECK_EQUAL(val, boost::math::constants::half_pi<T>());\n      arg = -arg;\n      val = atan2(arg, arg2);\n      BOOST_CHECK_EQUAL(val, -boost::math::constants::half_pi<T>());\n      arg  = std::numeric_limits<T>::infinity();\n      arg2 = -2;\n      val  = atan2(arg, arg2);\n      BOOST_CHECK_EQUAL(val, boost::math::constants::half_pi<T>());\n      arg = -arg;\n      val = atan2(arg, arg2);\n      BOOST_CHECK_EQUAL(val, -boost::math::constants::half_pi<T>());\n      arg  = std::numeric_limits<T>::infinity();\n      arg2 = -std::numeric_limits<T>::infinity();\n      val  = atan2(arg, arg2);\n      BOOST_CHECK_CLOSE_FRACTION(val, boost::math::constants::three_quarters_pi<T>(), tol);\n      arg = -arg;\n      val = atan2(arg, arg2);\n      BOOST_CHECK_CLOSE_FRACTION(val, -boost::math::constants::three_quarters_pi<T>(), tol);\n      arg  = std::numeric_limits<T>::infinity();\n      arg2 = std::numeric_limits<T>::infinity();\n      val  = atan2(arg, arg2);\n      BOOST_CHECK_CLOSE_FRACTION(val, ldexp(boost::math::constants::pi<T>(), -2), tol);\n      arg = -arg;\n      val = atan2(arg, arg2);\n      BOOST_CHECK_CLOSE_FRACTION(val, -ldexp(boost::math::constants::pi<T>(), -2), tol);\n      if (std::numeric_limits<T>::has_quiet_NaN)\n      {\n         arg  = std::numeric_limits<T>::quiet_NaN();\n         arg2 = 2;\n         check_invalid(atan2(arg, arg2));\n         std::swap(arg, arg2);\n         check_invalid(atan2(arg, arg2));\n         arg = std::numeric_limits<T>::quiet_NaN();\n         check_invalid(atan2(arg, arg2));\n      }\n   }\n   // F.9.1.5:\n   arg = 0;\n   val = cos(arg);\n   BOOST_CHECK_EQUAL(val, 1);\n   arg = -arg;\n   BOOST_CHECK_EQUAL(val, 1);\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      check_invalid(cos(arg));\n      arg = -std::numeric_limits<T>::infinity();\n      check_invalid(cos(arg));\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(cos(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(cos(arg));\n   }\n   // F.9.1.6:\n   arg = 0;\n   val = sin(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = sin(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      check_invalid(sin(arg));\n      arg = -std::numeric_limits<T>::infinity();\n      check_invalid(sin(arg));\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(sin(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(sin(arg));\n   }\n   // F.9.1.7:\n   arg = 0;\n   val = tan(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = tan(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      check_invalid(tan(arg));\n      arg = -std::numeric_limits<T>::infinity();\n      check_invalid(tan(arg));\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(tan(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(tan(arg));\n   }\n   // F.9.2.1:\n   arg = 1;\n   val = acosh(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   check_invalid(acosh(arg));\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      val = acosh(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n\n      arg = -std::numeric_limits<T>::infinity();\n      check_invalid(acosh(arg));\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(acosh(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(acosh(arg));\n   }\n   // F.9.2.2:\n   arg = 0;\n   val = asinh(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = asinh(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      val = asinh(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n\n      arg = -std::numeric_limits<T>::infinity();\n      val = asinh(arg);\n      BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(asinh(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(asinh(arg));\n   }\n   // F.9.2.3:\n   arg = 0;\n   val = atanh(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = atanh(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   arg = 2;\n   check_invalid(atanh(arg));\n   arg = -3;\n   check_invalid(atanh(arg));\n\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = 1;\n      val = atanh(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      BOOST_CHECK(signbit(val) == 0);\n      check_erange(val);\n      arg = -arg;\n      val = atanh(arg);\n      BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n      BOOST_CHECK(signbit(val));\n      check_erange(val);\n\n      arg = std::numeric_limits<T>::infinity();\n      check_invalid(atanh(arg));\n      arg = -std::numeric_limits<T>::infinity();\n      check_invalid(atanh(arg));\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(atanh(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(atanh(arg));\n   }\n   // F.9.2.4:\n   arg = 0;\n   val = cosh(arg);\n   BOOST_CHECK_EQUAL(val, 1);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = cosh(arg);\n      BOOST_CHECK_EQUAL(val, 1);\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = (std::numeric_limits<T>::max)();\n      val = cosh(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -arg;\n      val = cosh(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = std::numeric_limits<T>::infinity();\n      val = cosh(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -arg;\n      val = cosh(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(cosh(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(cosh(arg));\n   }\n   // F.9.2.5:\n   arg = 0;\n   val = sinh(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = sinh(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = (std::numeric_limits<T>::max)();\n      val = sinh(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -arg;\n      val = sinh(arg);\n      BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n      arg = std::numeric_limits<T>::infinity();\n      val = sinh(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -arg;\n      val = sinh(arg);\n      BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(sinh(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(sinh(arg));\n   }\n   // F.9.2.6:\n   arg = 0;\n   val = tanh(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = tanh(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   arg = (std::numeric_limits<T>::max)();\n   val = tanh(arg);\n   BOOST_CHECK_EQUAL(val, 1);\n   arg = -arg;\n   val = tanh(arg);\n   BOOST_CHECK_EQUAL(val, -1);\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      val = tanh(arg);\n      BOOST_CHECK_EQUAL(val, 1);\n      arg = -arg;\n      val = tanh(arg);\n      BOOST_CHECK_EQUAL(val, -1);\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(tanh(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(tanh(arg));\n   }\n   // F.9.3.1:\n   arg = 0;\n   val = exp(arg);\n   BOOST_CHECK_EQUAL(val, 1);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = exp(arg);\n      BOOST_CHECK_EQUAL(val, 1);\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      val = exp(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -arg;\n      val = exp(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val) == 0);\n      arg = (std::numeric_limits<T>::max)();\n      val = exp(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -arg;\n      val = exp(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val) == 0);\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(exp(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(exp(arg));\n   }\n   // F.9.3.2:\n   arg = 0;\n   val = exp2(arg);\n   BOOST_CHECK_EQUAL(val, 1);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = exp2(arg);\n      BOOST_CHECK_EQUAL(val, 1);\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      val = exp2(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -arg;\n      val = exp2(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val) == 0);\n      arg = (std::numeric_limits<T>::max)();\n      val = exp2(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -arg;\n      val = exp2(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val) == 0);\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(exp2(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(exp2(arg));\n   }\n   // F.9.3.3:\n   arg = 0;\n   val = expm1(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = expm1(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      val = expm1(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -arg;\n      val = expm1(arg);\n      BOOST_CHECK_EQUAL(val, -1);\n      arg = (std::numeric_limits<T>::max)();\n      val = expm1(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -arg;\n      val = expm1(arg);\n      BOOST_CHECK_EQUAL(val, -1);\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(expm1(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(expm1(arg));\n   }\n   // F.9.3.4:\n   arg = 0;\n   int ival;\n   val = frexp(arg, &ival);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK_EQUAL(ival, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = frexp(arg, &ival);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n      BOOST_CHECK(signbit(val));\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      val = frexp(arg, &ival);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -arg;\n      val = frexp(arg, &ival);\n      BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      val = frexp(arg, &ival);\n      BOOST_CHECK(isnan(val));\n   }\n   // F.9.3.5:\n   typename T::backend_type::exponent_type eval;\n   typename T::backend_type::exponent_type fp_ilogb0 = (std::numeric_limits<typename T::backend_type::exponent_type>::min)();\n   typename T::backend_type::exponent_type fp_ilogbnan =\n#ifdef FP_ILOGBNAN\n       FP_ILOGBNAN < 0 ? (std::numeric_limits<typename T::backend_type::exponent_type>::min)() : (std::numeric_limits<typename T::backend_type::exponent_type>::max)();\n#else\n       INT_MAX;\n#endif\n\n   arg  = 0;\n   eval = ilogb(arg);\n   BOOST_CHECK_EQUAL(eval, fp_ilogb0);\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg  = std::numeric_limits<T>::infinity();\n      eval = ilogb(arg);\n      BOOST_CHECK_EQUAL(eval, (std::numeric_limits<typename T::backend_type::exponent_type>::max)());\n      arg  = -arg;\n      eval = ilogb(arg);\n      BOOST_CHECK_EQUAL(eval, (std::numeric_limits<typename T::backend_type::exponent_type>::max)());\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg  = std::numeric_limits<T>::quiet_NaN();\n      eval = ilogb(arg);\n      BOOST_CHECK_EQUAL(eval, fp_ilogbnan);\n   }\n   // F.9.3.7:\n   arg = 1;\n   val = log(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = 0;\n      val = log(arg);\n      BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n      check_erange(val);\n      arg = -arg;\n      if (signbit(arg))\n      {\n         val = log(arg);\n         BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n         check_erange(val);\n      }\n      arg = -1;\n      check_invalid(log(arg));\n      arg = -std::numeric_limits<T>::infinity();\n      check_invalid(log(arg));\n      arg = std::numeric_limits<T>::infinity();\n      val = log(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(log(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(log(arg));\n   }\n   // F.9.3.8:\n   arg = 1;\n   val = log10(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = 0;\n      val = log10(arg);\n      BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n      check_erange(val);\n      arg = -arg;\n      if (signbit(arg))\n      {\n         val = log10(arg);\n         BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n         check_erange(val);\n      }\n      arg = -1;\n      check_invalid(log10(arg));\n      arg = -std::numeric_limits<T>::infinity();\n      check_invalid(log10(arg));\n      arg = std::numeric_limits<T>::infinity();\n      val = log10(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(log10(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(log10(arg));\n   }\n   // F.9.3.9:\n   arg = 0;\n   val = log1p(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = log1p(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = -1;\n      val = log1p(arg);\n      BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n      check_erange(val);\n      arg = -2;\n      check_invalid(log1p(arg));\n      arg = -std::numeric_limits<T>::infinity();\n      check_invalid(log1p(arg));\n      arg = std::numeric_limits<T>::infinity();\n      val = log1p(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(log1p(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(log1p(arg));\n   }\n   // F.9.3.10:\n   arg = 1;\n   val = log2(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = 0;\n      val = log2(arg);\n      BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n      check_erange(val);\n      arg = -arg;\n      if (signbit(arg))\n      {\n         val = log2(arg);\n         BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n         check_erange(val);\n      }\n      arg = -1;\n      check_invalid(log2(arg));\n      arg = -std::numeric_limits<T>::infinity();\n      check_invalid(log2(arg));\n      arg = std::numeric_limits<T>::infinity();\n      val = log2(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(log2(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(log2(arg));\n   }\n   // F.9.3.11:\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = 0;\n      val = logb(arg);\n      BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n      check_erange(val);\n      arg = -arg;\n      if (signbit(arg))\n      {\n         val = logb(arg);\n         BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n         check_erange(val);\n      }\n      arg = std::numeric_limits<T>::infinity();\n      val = logb(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -std::numeric_limits<T>::infinity();\n      val = logb(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(logb(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(logb(arg));\n   }\n   // F.9.3.13:\n   arg = 0;\n   val = scalbn(arg, 2);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = scalbn(arg, 2);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      val = scalbn(arg, -100);\n      BOOST_CHECK_EQUAL(val, arg);\n      arg = -arg;\n      val = scalbn(arg, -100);\n      BOOST_CHECK_EQUAL(val, arg);\n   }\n   // F.9.4.1:\n   arg = 0;\n   val = cbrt(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = cbrt(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n#if !(defined(TEST_FLOAT128) && defined(BOOST_GCC_VERSION) && (BOOST_GCC_VERSION < 40800))\n   //\n   // This test fails with early implementations of libquadmath - not our issue!\n   //\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      val = cbrt(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -std::numeric_limits<T>::infinity();\n      val = cbrt(arg);\n      BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n   }\n#endif\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(cbrt(arg));\n      arg = -std::numeric_limits<T>::quiet_NaN();\n      check_invalid(cbrt(arg));\n   }\n   // F.9.4.2:\n   arg = 0;\n   val = fabs(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = fabs(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val) == 0);\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      val = fabs(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -std::numeric_limits<T>::infinity();\n      val = fabs(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n   }\n   // F.9.4.3:\n   arg  = 2;\n   arg2 = 0;\n   val  = hypot(arg, arg2);\n   BOOST_CHECK_EQUAL(val, arg);\n   arg2 = -arg2;\n   val  = hypot(arg, arg2);\n   BOOST_CHECK_EQUAL(val, arg);\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg  = std::numeric_limits<T>::infinity();\n      arg2 = 2;\n      val  = hypot(arg, arg2);\n      BOOST_CHECK_EQUAL(val, arg);\n      arg = -arg;\n      val = hypot(arg, arg2);\n      BOOST_CHECK_EQUAL(val, -arg);\n      arg2 = std::numeric_limits<T>::quiet_NaN();\n      val  = hypot(arg, arg2);\n      BOOST_CHECK_EQUAL(val, -arg);\n      arg = -arg;\n      val = hypot(arg, arg2);\n      BOOST_CHECK_EQUAL(val, arg);\n   }\n   // F.9.4.4:\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg  = 0;\n      arg2 = -3;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      check_erange(val);\n      arg = -arg;\n      if (signbit(arg))\n      {\n         val = pow(arg, arg2);\n         BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n         check_erange(val);\n      }\n      arg  = 0;\n      arg2 = -2;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      check_erange(val);\n      arg = -arg;\n      if (signbit(arg))\n      {\n         val = pow(arg, arg2);\n         BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n         check_erange(val);\n      }\n      arg  = 0;\n      arg2 = 3;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val) == 0);\n      arg = -arg;\n      if (signbit(arg))\n      {\n         val = pow(arg, arg2);\n         BOOST_CHECK_EQUAL(val, 0);\n         BOOST_CHECK(signbit(val));\n      }\n      arg  = 0;\n      arg2 = 2;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val) == 0);\n      arg = -arg;\n      if (signbit(arg))\n      {\n         val = pow(arg, arg2);\n         BOOST_CHECK_EQUAL(val, 0);\n         BOOST_CHECK(signbit(val) == 0);\n      }\n      arg  = -1;\n      arg2 = std::numeric_limits<T>::infinity();\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 1);\n      arg2 = -std::numeric_limits<T>::infinity();\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 1);\n      arg  = 1;\n      arg2 = 0;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 1);\n      arg2 = std::numeric_limits<T>::infinity();\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 1);\n      arg2 = -std::numeric_limits<T>::infinity();\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 1);\n      arg2 = std::numeric_limits<T>::quiet_NaN();\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 1);\n      arg  = 0;\n      arg2 = 0;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 1);\n      arg2 = -arg2;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 1);\n      arg = std::numeric_limits<T>::infinity();\n      val = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 1);\n      arg2 = -arg2;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 1);\n      arg = std::numeric_limits<T>::quiet_NaN();\n      val = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 1);\n      arg2 = -arg2;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 1);\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg  = -2.5;\n      arg2 = 2.5;\n      check_invalid(pow(arg, arg2));\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg  = 0.5;\n      arg2 = -std::numeric_limits<T>::infinity();\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -0.25;\n      val = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg  = 2.5;\n      arg2 = -std::numeric_limits<T>::infinity();\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 0);\n      arg = -arg;\n      val = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 0);\n      arg  = 2.5;\n      arg2 = std::numeric_limits<T>::infinity();\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -arg;\n      val = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg  = -std::numeric_limits<T>::infinity();\n      arg2 = -3;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 0);\n      if (signbit(-T(0)))\n         BOOST_CHECK(signbit(val));\n      arg2 = -2;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val) == 0);\n      arg2 = -2.5;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val) == 0);\n      arg2 = 3;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n      arg2 = 2;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg2 = 2.5;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg  = -arg; // +INF\n      arg2 = -2;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val) == 0);\n      arg2 = -3;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val) == 0);\n      arg2 = -3.5;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val) == 0);\n      arg2 = 2;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg2 = 3;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg2 = 3.5;\n      val  = pow(arg, arg2);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n   }\n   // F.9.4.5:\n   arg = 0;\n   val = sqrt(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = sqrt(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n#if !(defined(TEST_FLOAT128) && defined(BOOST_GCC_VERSION) && (BOOST_GCC_VERSION < 40800))\n   //\n   // This test fails with early implementations of libquadmath - not our issue!\n   //\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      val = sqrt(arg);\n      BOOST_CHECK_EQUAL(val, arg);\n      arg = -arg;\n      check_invalid(sqrt(arg));\n   }\n#endif\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(sqrt(arg));\n   }\n   // F.9.5.1:\n   arg = 0;\n   val = erf(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = erf(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      val = erf(arg);\n      BOOST_CHECK_EQUAL(val, 1);\n      arg = -arg;\n      val = erf(arg);\n      BOOST_CHECK_EQUAL(val, -1);\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(erf(arg));\n   }\n   // F.9.5.2:\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      val = erfc(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val) == 0);\n      arg = -arg;\n      val = erfc(arg);\n      BOOST_CHECK_EQUAL(val, 2);\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(erfc(arg));\n   }\n   // F.9.5.3:\n   arg = 1;\n   val = lgamma(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = 2;\n   val = lgamma(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n#if !defined(BOOST_MPFR_VERSION) || (BOOST_MPFR_VERSION > 30103)\n   arg = 0;\n   val = lgamma(arg);\n   BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n   check_erange(val);\n   arg = -1;\n   val = lgamma(arg);\n   BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n   check_erange(val);\n   arg = -2;\n   val = lgamma(arg);\n   BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n   check_erange(val);\n   arg = -std::numeric_limits<T>::infinity();\n   val = lgamma(arg);\n   BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n#endif\n   arg = std::numeric_limits<T>::infinity();\n   val = lgamma(arg);\n   BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(lgamma(arg));\n   }\n   // F.9.5.4:\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = 0;\n      val = tgamma(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      check_erange(val);\n      arg = -arg;\n      if (signbit(arg))\n      {\n         val = tgamma(arg);\n         BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n         check_erange(val);\n      }\n      arg = -1;\n      check_invalid(tgamma(arg));\n      arg = -std::numeric_limits<T>::infinity();\n      check_invalid(tgamma(arg));\n      arg = std::numeric_limits<T>::infinity();\n      val = tgamma(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(tgamma(arg));\n   }\n   // F.9.6.1:\n   arg = 0;\n   val = ceil(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = ceil(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      val = ceil(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -arg;\n      val = ceil(arg);\n      BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(ceil(arg));\n   }\n   // F.9.6.2:\n   arg = 0;\n   val = floor(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = floor(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      val = floor(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -arg;\n      val = floor(arg);\n      BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(floor(arg));\n   }\n   // F.9.6.3:\n   arg = 0;\n   val = nearbyint(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = nearbyint(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      val = nearbyint(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -arg;\n      val = nearbyint(arg);\n      BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(nearbyint(arg));\n   }\n   // F.9.6.4:\n   arg = 0;\n   val = rint(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = rint(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      val = rint(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -arg;\n      val = rint(arg);\n      BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(rint(arg));\n   }\n   // F.9.6.6:\n   arg = 0;\n   val = round(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = round(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      val = round(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -arg;\n      val = round(arg);\n      BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(round(arg));\n   }\n   // F.9.6.8:\n   arg = 0;\n   val = trunc(arg);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = trunc(arg);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      val = trunc(arg);\n      BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());\n      arg = -arg;\n      val = trunc(arg);\n      BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg = std::numeric_limits<T>::quiet_NaN();\n      check_invalid(trunc(arg));\n   }\n   // F.9.7.1:\n   arg  = 0;\n   arg2 = 2;\n   val  = fmod(arg, arg2);\n   BOOST_CHECK_EQUAL(val, 0);\n   BOOST_CHECK(signbit(val) == 0);\n   arg = -arg;\n   if (signbit(arg))\n   {\n      val = fmod(arg, arg2);\n      BOOST_CHECK_EQUAL(val, 0);\n      BOOST_CHECK(signbit(val));\n   }\n   if (std::numeric_limits<T>::has_infinity)\n   {\n      arg = std::numeric_limits<T>::infinity();\n      check_invalid(fmod(arg, arg2));\n      arg = -arg;\n      check_invalid(fmod(arg, arg2));\n      arg  = 2;\n      arg2 = 0;\n      check_invalid(fmod(arg, arg2));\n      check_invalid(fmod(arg, -arg2));\n   }\n   if (std::numeric_limits<T>::has_quiet_NaN)\n   {\n      arg  = std::numeric_limits<T>::quiet_NaN();\n      arg2 = 2;\n      check_invalid(fmod(arg, arg2));\n      swap(arg, arg2);\n      check_invalid(fmod(arg, arg2));\n      check_invalid(fmod(arg2, arg2));\n   }\n   //\n   // Bugs:\n   //\n   int sign = 0;\n   boost::math::lgamma(T(0.000001), &sign);\n   BOOST_CHECK_EQUAL(sign, 1);\n   sign = 0;\n   boost::math::lgamma(T(0.5), &sign);\n   BOOST_CHECK_EQUAL(sign, 1);\n   sign = 0;\n   boost::math::lgamma(T(0.9), &sign);\n   BOOST_CHECK_EQUAL(sign, 1);\n   sign = 0;\n   boost::math::lgamma(T(1.1), &sign);\n   BOOST_CHECK_EQUAL(sign, 1);\n   sign = 0;\n   boost::math::lgamma(T(1.9), &sign);\n   BOOST_CHECK_EQUAL(sign, 1);\n   sign = 0;\n   boost::math::lgamma(T(2.1), &sign);\n   BOOST_CHECK_EQUAL(sign, 1);\n   sign = 0;\n   boost::math::lgamma(T(20), &sign);\n   BOOST_CHECK_EQUAL(sign, 1);\n   sign = 0;\n   boost::math::lgamma(T(-0.0000000000001), &sign);\n   BOOST_CHECK_EQUAL(sign, -1);\n   sign = 0;\n   boost::math::lgamma(T(-0.5), &sign);\n   BOOST_CHECK_EQUAL(sign, -1);\n   sign = 0;\n   boost::math::lgamma(T(-1.5), &sign);\n   BOOST_CHECK_EQUAL(sign, 1);\n   sign = 0;\n   boost::math::lgamma(T(-2.5), &sign);\n   BOOST_CHECK_EQUAL(sign, -1);\n   sign = 0;\n   boost::math::lgamma(T(-3.5), &sign);\n   BOOST_CHECK_EQUAL(sign, 1);\n}\n\ntemplate <class T>\nvoid test_c99_appendix_F_tgammaq_addon_for_float128()\n{\n#if defined(TEST_FLOAT128)\n  // Special tests of tgamma for positive and negative\n  // real values in the neighborhood of the origin.\n\n   // At Wolfram Alpha: N[Gamma[1/3], 201]\n   const T tgamma_third\n   (\n     \"2.\"\n     \"67893853470774763365569294097467764412868937795730\"\n     \"11009504283275904176101677438195409828890411887894\"\n     \"19159049200072263335719084569504472259977713367708\"\n     \"46976816728982305000321834255032224715694181755545\"\n   );\n\n   // Create a string such as \"1e-84\", where 84 exemplifies (digits10*5 + 5)/6\n   // and the exponent varies depending on the value of digits10 for the type.\n   // Consider, for instance digits10=100. In this case n_exp=(100*5 + 5)/6 = 84.\n\n   const int n_exp =(std::max)(((std::numeric_limits<T>::digits10 * 5) + 5) / 6, 1);\n\n   const T tgamma_tol(\"1e-\" + boost::lexical_cast<std::string>(n_exp));\n\n   // Check tgamma(1/3 - n) for n in 0...24.\n   for(int n = 0; n < 25; ++n)\n   {\n      const T tgamma_val = tgamma(T((T(1) / T(3)) - T(n)));\n\n      T tgamma_control(tgamma_third);\n\n      for(unsigned int k = 0U; k < static_cast<unsigned int>(n); ++k)\n      {\n         tgamma_control *= -3;\n         tgamma_control /= ((3U * (k + 1U)) - 1U);\n      }\n\n      BOOST_CHECK_CLOSE_FRACTION(tgamma_val, tgamma_control, tgamma_tol);\n   }\n\n   // Check tgamma(1/3 + n) for n in 0...24.\n   for(unsigned int n = 0U; n < 25U; ++n)\n   {\n      const T tgamma_val = tgamma(T((T(1) / T(3)) + T(n)));\n\n      T tgamma_control(tgamma_third);\n\n      for(unsigned int k = 0U; k < n; ++k)\n      {\n         tgamma_control /= 3;\n         tgamma_control *= ((3U * (k + 1U)) - 2U);\n      }\n\n      BOOST_CHECK_CLOSE_FRACTION(tgamma_val, tgamma_control, tgamma_tol);\n   }\n#endif\n}\n\nint main()\n{\n   test_poison<float>();\n   test_poison<double>();\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::mpf_float_50>();\n   test<boost::multiprecision::mpf_float_100>();\n#endif\n#ifdef TEST_MPFR_50\n   std::cout << \"Testing MPFR: \" << MPFR_VERSION_STRING << std::endl;\n   test<boost::multiprecision::mpfr_float_50>();\n   test<boost::multiprecision::mpfr_float_100>();\n   test_c99_appendix_F<boost::multiprecision::mpfr_float_50>();\n#endif\n#ifdef TEST_MPFI_50\n   test<boost::multiprecision::mpfi_float_50>();\n   test<boost::multiprecision::mpfi_float_100>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>();\n#if !(defined(__GNUC__) && defined(_WIN32)) // Object file too large otherwise\n   test<boost::multiprecision::cpp_dec_float_100>();\n#endif\n   test_c99_appendix_F<boost::multiprecision::cpp_dec_float_50>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT_2\n   // Some \"peculiar\" digit counts which stress our code:\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();\n#if !(defined(__GNUC__) && defined(_WIN32)) // Object file too large otherwise\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();\n#endif\n#endif\n#ifdef TEST_CPP_DEC_FLOAT_3\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();\n#if !(defined(__GNUC__) && defined(_WIN32)) // Object file too large otherwise\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();\n#endif\n#endif\n#ifdef TEST_CPP_DEC_FLOAT_4\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();\n#if !(defined(__GNUC__) && defined(_WIN32)) // Object file too large otherwise\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();\n#endif\n#endif\n#ifdef TEST_CPP_DEC_FLOAT_5\n   #if defined(__MINGW32__) || defined(__MINGW64__) // Weak workaround just to, let's say, get green\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long > > >();\n   #else\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();\n   #endif\n#endif\n#ifdef TEST_CPP_DEC_FLOAT_6\n   #if defined(__MINGW32__) || defined(__MINGW64__) // Weak workaround just to, let's say, get green\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long > > >();\n   #else\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();\n   #endif\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<100>, boost::multiprecision::et_on> >();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT_2\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT_3\n   test_c99_appendix_F<boost::multiprecision::cpp_bin_float_50>();\n   test_c99_appendix_F<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<100>, boost::multiprecision::et_on> >();\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n   test_c99_appendix_F<boost::multiprecision::float128>();\n   test_c99_appendix_F_tgammaq_addon_for_float128<boost::multiprecision::float128>();\n#endif\n#ifdef TEST_MPFI_DEBUG_ADAPTOR\n   test<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfi_float_backend<50> > > >();\n   //test_c99_appendix_F<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfi_float_backend<50> > > >();\n#endif\n#ifdef TEST_MPFR_DEBUG_ADAPTOR\n   test<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<50> > > >();\n   test_c99_appendix_F<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::mpfr_float_backend<50> > > >();\n#endif\n#ifdef TEST_MPFI_LOGGED_ADAPTOR\n   test<boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::mpfi_float_backend<50> > > >();\n   //test_c99_appendix_F<boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::mpfi_float_backend<50> > > >();\n#endif\n#ifdef TEST_MPFR_LOGGED_ADAPTOR\n   test<boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::mpfr_float_backend<50> > > >();\n   test_c99_appendix_F<boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::mpfr_float_backend<50> > > >();\n#endif\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_signed_zero.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/math/special_functions/sign.hpp>\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#if !defined(TEST_CPP_BIN_FLOAT) && !defined(TEST_DOUBLE) && !defined(TEST_MPFR_FLOAT)\n#define TEST_CPP_BIN_FLOAT\n#define TEST_DOUBLE\n#define TEST_MPFR_FLOAT\n#endif\n\n\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n#ifdef TEST_MPFR_FLOAT\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n\ntemplate <class T>\nstruct extract_value_type\n{\n   typedef typename T::value_type type;\n};\ntemplate <>\nstruct extract_value_type<double>\n{\n   typedef double type;\n};\n\ntemplate <class T>\nvoid test()\n{\n   using value_type = typename extract_value_type<T>::type;\n\n   using std::real;\n   using std::signbit;\n\n   T mp_zero{0};\n   T mp_m_zero{-mp_zero};\n   T mp_finite{2};\n   T mp_m_finite{-2};\n   T mp_big{!std::is_same<T, value_type>::value ? std::numeric_limits<value_type>::has_infinity ? std::numeric_limits<value_type>::infinity() : (std::numeric_limits<value_type>::max)() : std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity()\n                                                                                                                                                                                                     : (std::numeric_limits<T>::max)()};\n   T mp_m_big{-mp_big};\n   T mp_small{!std::is_same<T, value_type>::value ? (std::numeric_limits<value_type>::min)() : (std::numeric_limits<T>::min)()};\n   T mp_m_small{-mp_small};\n\n   T result;\n   //\n   // Multiplications:\n   //\n   result = mp_zero * mp_finite;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_zero * mp_m_finite;\n   BOOST_TEST(signbit(result));\n   result = mp_m_zero * mp_finite;\n   BOOST_TEST(signbit(result));\n   result = mp_m_zero * mp_m_finite;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_zero * -mp_finite;\n   BOOST_TEST(signbit(result));\n   result = -mp_zero * mp_finite;\n   BOOST_TEST(signbit(result));\n   result = -mp_zero * -mp_finite;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_small * mp_small;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_small * mp_m_small;\n   BOOST_TEST(signbit(result));\n   result = mp_m_small * mp_m_small;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_small * -mp_small;\n   BOOST_TEST(signbit(result));\n   result = -mp_small * -mp_small;\n   BOOST_TEST(signbit(result) == 0);\n   //\n   // Divisions:\n   //\n   result = mp_zero / mp_finite;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_zero / mp_m_finite;\n   BOOST_TEST(signbit(result));\n   result = mp_m_zero / mp_finite;\n   BOOST_TEST(signbit(result));\n   result = mp_m_zero / mp_m_finite;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_zero / -mp_finite;\n   BOOST_TEST(signbit(result));\n   result = -mp_zero / mp_finite;\n   BOOST_TEST(signbit(result));\n   result = -mp_zero / -mp_finite;\n   BOOST_TEST(signbit(result) == 0);\n\n   result = mp_small / mp_big;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_small / mp_m_big;\n   BOOST_TEST(signbit(result));\n   result = mp_m_small / mp_big;\n   BOOST_TEST(signbit(result));\n   result = mp_m_small / mp_m_big;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_small / -mp_big;\n   BOOST_TEST(signbit(result));\n   result = -mp_small / mp_big;\n   BOOST_TEST(signbit(result));\n   result = -mp_small / -mp_big;\n   BOOST_TEST(signbit(result) == 0);\n   //\n   // Additions:\n   //\n   result = mp_zero + mp_zero;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_zero + mp_m_zero;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_m_zero + mp_zero;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_m_zero + mp_m_zero;\n   BOOST_TEST(signbit(result));\n   //\n   // Subtractions:\n   //\n   result = mp_zero - mp_zero;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_zero - mp_m_zero;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_m_zero - mp_zero;\n   BOOST_TEST(signbit(result));\n   result = mp_m_zero - mp_m_zero;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_finite - mp_finite;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_finite + mp_m_finite;\n   BOOST_TEST(signbit(result) == 0);\n\n   //\n   // Over again for one arg an integer:\n   //\n   int i_zero{0};\n   int i_finite{2};\n   int i_m_finite{-2};\n   result = i_zero * mp_finite;\n   BOOST_TEST(signbit(result) == 0);\n   result = i_zero * mp_m_finite;\n   BOOST_TEST(signbit(result));\n   result = i_zero * -mp_finite;\n   BOOST_TEST(signbit(result));\n   result = mp_zero * i_finite;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_m_zero * i_finite;\n   BOOST_TEST(signbit(result));\n   result = mp_zero * i_m_finite;\n   BOOST_TEST(signbit(result));\n   //\n   // Divisions:\n   //\n   result = i_zero / mp_finite;\n   BOOST_TEST(signbit(result) == 0);\n   result = i_zero / mp_m_finite;\n   BOOST_TEST(signbit(result));\n   result = mp_zero / i_m_finite;\n   BOOST_TEST(signbit(result));\n   result = -mp_zero / i_finite;\n   BOOST_TEST(signbit(result));\n   //\n   // Additions:\n   //\n   result = mp_zero + i_zero;\n   BOOST_TEST(signbit(result) == 0);\n#ifndef TEST_MPFR_FLOAT\n   //\n   // There appears to be a bug in mpfr_add_ui here:\n   //\n   result = i_zero + mp_m_zero;\n   BOOST_TEST(signbit(result) == 0);\n#endif\n   //\n   // Subtractions:\n   //\n   result = mp_zero - i_zero;\n   BOOST_TEST(signbit(result) == 0);\n   result = i_zero - mp_m_zero;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_m_zero - i_zero;\n   BOOST_TEST(signbit(result));\n   result = i_finite - mp_finite;\n   BOOST_TEST(signbit(result) == 0);\n   result = i_finite + mp_m_finite;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_finite - i_finite;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_finite + i_m_finite;\n   BOOST_TEST(signbit(result) == 0);\n   //\n   // Over again for one arg a float:\n   //\n   float f_zero{0};\n   float f_m_zero{-f_zero};\n   float f_finite{2};\n   float f_m_finite{-2};\n   result = f_zero * mp_finite;\n   BOOST_TEST(signbit(result) == 0);\n   result = f_zero * mp_m_finite;\n   BOOST_TEST(signbit(result));\n   result = f_zero * -mp_finite;\n   BOOST_TEST(signbit(result));\n   result = mp_zero * f_finite;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_m_zero * f_finite;\n   BOOST_TEST(signbit(result));\n   result = mp_zero * f_m_finite;\n   BOOST_TEST(signbit(result));\n   //\n   // Divisions:\n   //\n   result = f_zero / mp_finite;\n   BOOST_TEST(signbit(result) == 0);\n   result = f_zero / mp_m_finite;\n   BOOST_TEST(signbit(result));\n   result = mp_zero / f_m_finite;\n   BOOST_TEST(signbit(result));\n   result = -mp_zero / f_finite;\n   BOOST_TEST(signbit(result));\n   //\n   // Additions:\n   //\n   result = f_zero + mp_zero;\n   BOOST_TEST(signbit(result) == 0);\n   result = f_zero + mp_m_zero;\n   BOOST_TEST(signbit(result) == 0);\n   result = f_m_zero + mp_zero;\n   BOOST_TEST(signbit(result) == 0);\n   result = f_m_zero + mp_m_zero;\n   BOOST_TEST(signbit(result));\n   //\n   // Subtractions:\n   //\n   result = f_zero - mp_zero;\n   BOOST_TEST(signbit(result) == 0);\n   result = f_zero - mp_m_zero;\n   BOOST_TEST(signbit(result) == 0);\n   result = f_m_zero - mp_zero;\n   BOOST_TEST(signbit(result));\n   result = f_m_zero - mp_m_zero;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_zero - f_zero;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_zero - f_m_zero;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_m_zero - f_zero;\n   BOOST_TEST(signbit(result));\n   result = mp_m_zero - f_m_zero;\n   BOOST_TEST(signbit(result) == 0);\n   result = f_finite - mp_finite;\n   BOOST_TEST(signbit(result) == 0);\n   result = f_finite + mp_m_finite;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_finite - f_finite;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_finite + f_m_finite;\n   BOOST_TEST(signbit(result) == 0);\n   //\n   // Special cases:\n   //\n   result = mp_m_zero * mp_m_zero;\n   BOOST_TEST(signbit(result) == 0);\n   result = mp_m_zero + mp_m_zero;\n   BOOST_TEST(signbit(result));\n   result = mp_zero + mp_zero;\n   BOOST_TEST(signbit(result) == 0);\n   result = abs(mp_m_zero);\n   BOOST_TEST(signbit(result) == 0);\n   result = fabs(mp_m_zero);\n   BOOST_TEST(signbit(result) == 0);\n   result = sqrt(mp_m_zero);\n   BOOST_TEST(signbit(result));\n}\n\nint main()\n{\n#ifdef TEST_DOUBLE\n   test<double>();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type>, boost::multiprecision::et_on>>();\n#endif\n#ifdef TEST_MPFR_FLOAT\n   test<boost::multiprecision::mpfr_float_50>();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_sin.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n#define TEST_MPFR_50\n#define TEST_MPFI_50\n#define TEST_BACKEND\n#define TEST_CPP_DEC_FLOAT\n#define TEST_FLOAT128\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(TEST_MPFR_50)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_MPFI_50)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n\ntemplate <class T>\nstruct has_poor_large_value_support\n{\n   static const bool value = false;\n};\n#ifdef TEST_CPP_DEC_FLOAT\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct has_poor_large_value_support<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >\n{\n   static const bool value = true;\n};\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct has_poor_large_value_support<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >\n{\n   static const bool value = true;\n};\n#endif\n\ntemplate <class T>\nvoid test()\n{\n   std::cout << \"Testing type: \" << typeid(T).name() << std::endl;\n   static const boost::array<const char*, 101u> data =\n       {{\n           \"-9.71360659712083391437631022096936715962104815777147739346439739644168480837178969413799829610404829247283169084501281105e-1\",\n           \"-5.95431113317256105006804890684659010940293672390817519158205264611725147142085353698349092164137652363446368483953564682e-1\",\n           \"5.09924118934356013545988500545586843463766955556781588535384546070893806324487181574368899833574915659357543038822935347e-1\",\n           \"9.90602974910637417521410554344955057938063175873799034495811832851567842600306335485818201417146475654562543760051881571e-1\",\n           \"2.57755634110962773819397192502372718147953063328591480930319110437537556577887190430547163274290595074462686853519200826e-1\",\n           \"-7.90852129665907861812449876176102241731921451584589870529143390612597378289323905030142878920134443274067663564142249906e-1\",\n           \"-8.70636054394434218558219672958497111094237434037462776135170928197514857325641761722162169311905082223410873872693125021e-1\",\n           \"1.16142192225871586802402588799179588339908282696987123538816621894316618250692422106879105583060486278819650782761165055e-1\",\n           \"9.60641850565339311654365605083646127348817546384991780755200411966145627086231307074524787693440076802209868233548778731e-1\",\n           \"6.28318825240308217440049590303028869715272770671179428040549526344092598897275498972932981684079339892035243316790587027e-1\",\n           \"-4.73718579778960595001132927360485548840577209745936881040433718918629103032639945353908537818475936329314134212199346978e-1\",\n           \"-9.95432766494621395340223548609251497842694553405493731879049259799325119533316838972006879914623359183523219011870805961e-1\",\n           \"-2.97704078652633309130390182393607392013126109733352620573058826659738026681661456497779386104992235762190242017128767206e-1\",\n           \"7.64723391125286889782047394187107836056829439952009227196240883193721606229047061163517791688110517783506991004016374431e-1\",\n           \"8.90335717074674250432504838435892622513509178529392798127561987551398090841490265311069534613651712468228001675091153605e-1\",\n           \"-7.47469618974513669394515485690188234127771130501791709462887130373371023385813212165673231177548426835629029005547008861e-2\",\n           \"-9.48261778982069330544079494960981900232314056127899219497335245577354566418258722147558010380033694835705634428764954401e-1\",\n           \"-6.60119969404606610211922488494059074732492583049845598285779387022002845776084527598443564095143849120847643366330179739e-1\",\n           \"4.36693827009658961576344650626557410722590226545637608661764593658572210930294024902150766064738444736422263939746970132e-1\",\n           \"9.98541130824430070642243744636010968399851408459030982248969144276197147611376115185206245742327729890090526273555800490e-1\",\n           \"3.37137695943362070360548307779555944485385294617304662646987679063953108310365389494460188124285214040163147170304540339e-1\",\n           \"-7.37272196933518190054375156317136276073182897209685319124536092629865074949247291797880288692223977281455156619510259042e-1\",\n           \"-9.08495699506960201290293288218820500948312195353635174830883006841931398581001427066173033535720385301624330783999899511e-1\",\n           \"3.32224697427099307204044509056982627738295866011152619834749776109067529453431741767996787924292629814505731320175556430e-2\",\n           \"9.34241854135599266375493853147210486293657026766576383005045752264274587199837314096798394557243705656211732557069413970e-1\",\n           \"6.90779551281016826784976005137338585011513089446563025258584317423906941741640583083551185645679047405447557105684226754e-1\",\n           \"-3.98913888475082839741071010629509607776766095858433376450534753556286110518195743624946499527251336022805096741714382999e-1\",\n           \"-9.99922692526403520897313527841668431397204867244750030781062964701898557028332255650446046614062333174844253917288331438e-1\",\n           \"-3.75988292423704532504216998833472116186771022412627192871974303806891208635376610998425108046077306043945435504842144332e-1\",\n           \"7.08546019140379445669962535829318394094758212505515423960726677977484727061149949358051741627739138448760095710063342839e-1\",\n           \"9.25084597170819667485373176055260044057716794391569156042799693611964098948722923916237050181882167134906470192542857299e-1\",\n           \"8.35947487571472125423673177137150279693224632368449469153892167972732129345714981936363891382927399742266512920038864004e-3\",\n           \"-9.18606321039298722214219289469027246078943851192917449117591801249272620492502932760495762195965214412326830491755901723e-1\",\n           \"-7.20244550473164405555518647469765134103488938825118543602681358279149452868549672550326500728323814331193184035259160414e-1\",\n           \"3.60444097985855629825697367385029316833790934188475151408740160657889784929257301330229580694580194294034115152177674537e-1\",\n           \"9.99575062430677992414643463029115424067356090568060307410717467085018957489304987413609313388961297483138454662118061646e-1\",\n           \"4.14188682766963304833862149212585018360876819555612195218295874225032162838027842720351664698295767693697842043579048219e-1\",\n           \"-6.78594534657286312316409269272929566493548786915986771929001823358451551885758307761400157853363173388867780400090112946e-1\",\n           \"-9.40073722462713282312837596921874850901167502371739429501407718251639587081137893231736511487958940802467918593519005653e-1\",\n           \"-4.99269632411748222821310824324558181913141458235676771744322439351386139493233963671531219603373207564905654915871172017e-2\",\n           \"9.01382218619061521491363679812206948759377256420255657634443270431495336446996377562469573885297156497163691224107230524e-1\",\n           \"7.48464012406957686684753003872919309910943477238245908909177973105841950470333390670719219379167068809799710776770734833e-1\",\n           \"-3.21350982331168500558883709193541886146178412146971245706190880193067020283050714591560922441331235332970961845050217575e-1\",\n           \"-9.97498841702838239659412520756556451623238132913559678626409839807628110807613195403956929948379909495726426243705794281e-1\",\n           \"-4.51672806064485973599605876288778011355969815150135195358334589946828629430271875346142404286368814526016297993583170592e-1\",\n           \"6.47469539349743367777844577149239337681085253251300560380374646379682072633705733561446355539618404778987844138766238618e-1\",\n           \"9.53437154306238691456130012770111782377503876017231780889420296856266641153714110120975772709549811845909173386912105405e-1\",\n           \"9.14081116365893107669584386407698218216480671014671832303147213716318806206478591012619084058741626713939006968851852873e-2\",\n           \"-8.82599332954202005638662236444958997569939600897565089251125658458817750203393016337212996488633688567918453254294067039e-1\",\n           \"-7.75389136447631492669594511701990356678047393586968390929688701894781023967621486245394406725747074772996680491766725244e-1\",\n           \"0\",\n           \"9.21877670451674413245307018032333288624288893879527153976730741889055419244554390143014969580425598422296522787223865492e-1\",\n           \"7.14420247379307162288182477560228852605155250738051326022559557923361829606843109334201812861061126243914893718333771523e-1\",\n           \"-3.68229061503980158220203193441625324286779814470455045264018328963975686564161509474566417124652588774892207244798533238e-1\",\n           \"-9.99783810945210864429782835782052003838999970584938136857974918523615732378678641269300999292060748749245257644847852880e-1\",\n           \"-4.06565491434208630299086167510578859920684132980243005899494321151205958987020300473732138517681916554185382528057861016e-1\",\n           \"6.84710967469127345624707128760638003100107237269026812211460044517359789036617753689648451870956943571853410785082804567e-1\",\n           \"9.37190534692875414284475879207349713030454322911019395907169592096165438597133651606167760904128838721803617281109050826e-1\",\n           \"4.15761692057244148543310701200534576325308397337003695681679007540324069366547327722258885686349619359915993749152386902e-2\",\n           \"-9.04970579658619470380865991258110513843850446973806499697900678159194774744593408797468966041695053471205276923200577190e-1\",\n           \"-7.42894062146919717307486895770712177633720181625852464705801879158549930143011385755502810839808877188169347497140463278e-1\",\n           \"3.29255843672460745277513964057060067396377984587222455665841087186879420769340447084849343957766905952270152874052907066e-1\",\n           \"9.98054859318969984153930327705164465077718593220578997216979734167429154849012382322757855259404199572095265136279871773e-1\",\n           \"4.44198837297768694342150710437773511448850303134514239359160353596186338967438818161771076138440975975069051604632938785e-1\",\n           \"-6.53817599431343721060913145888825198919543068369083977787231740776950274433927919565042681494795499030972133972973154991e-1\",\n           \"-9.50882691455803790808811011811129940528171185220498569922200361836899859377942311459807744784166538095896117442350480286e-1\",\n           \"-8.30804396823694462619418608693397504202900045660409997788297791645107264729830105800672434941805906654953509298579082883e-2\",\n           \"8.86498500176738212245618093138553877114943127333459437678466772704535139826656179981455385901664422134192971441152486596e-1\",\n           \"7.70083171278361495868782270594413506070341191348346709317329019377797940394556787220273230008072684372906392335068211595e-1\",\n           \"-2.89713235318575682157337623325710322388267200178020040738121279630672170355171163891332847251952971324782327373734923025e-1\",\n           \"-9.94599945986602107902462030221489305674036413322184167100620086215068494963807086265519051279456167270901961176645890910e-1\",\n           \"-4.81064018790479216363003919039401079745827607566793090566247167201506427394383426836725220489510187378030886775425254046e-1\",\n           \"6.21793567954698234151923123976248746751871911018984490371928031737872104124834908200003970971778452547150523318639635937e-1\",\n           \"9.62930462544790791995256817531759605974030310743258985429278608944994805716203043054967792555227147404499205611680348343e-1\",\n           \"1.24441037037160425420824052419427892644210865386492893504553391973646623439822770473194845274620957661128504291608680469e-1\",\n           \"-8.66493376243885476034533210550037276824055111358129259572484897399197578809821587005093985112028866251515011805996119334e-1\",\n           \"-7.95940555954229526911811786010975888490876487056728372525209250018208474961217211282867562886053609351620626802054272020e-1\",\n           \"2.49669618482792917975718339302754781070461300705127317300546100189317933291972223791458678771914034385073586648459580423e-1\",\n           \"9.89425045617789945796335206411736550560149597573171983909624851636680028232543261568285131480585113303281176722731984359e-1\",\n           \"5.17097284014384149171097163430722725596083616428334032893201431916692899725128152827282357887267679461332587145165393473e-1\",\n           \"-5.88694253013035419947972745515246684318073372460957150709985237608958241550865774225576562359889367149484593966586261944e-1\",\n           \"-9.73313013442224866478107643999632554759604190263325143130961313777287157745245701134838602677190253924612391775436901182e-1\",\n           \"-1.65586435334914172055850479429458408174448669771862313204835451683387762284114799645762688524058144409210946183564694437e-1\",\n           \"8.44989803230758608979729460217254170202748876564967551526138387646760352687916491884649142029664716335759879232648284164e-1\",\n           \"8.20421500340164168068753907367027481963552257850283600606773656660614708517253273174848291641569969886126754639035754147e-1\",\n           \"-2.09194241612317592929856274655591551278574667482924447651723415490434554354833563537792618079275726893013991849104465053e-1\",\n           \"-9.82539107299636472172005507105476251789057582568202763534005396813858490465264145708502581273803767931004018272989858624e-1\",\n           \"-5.52236319725534543207688775430217404447704139560595336544456138148662731976576062425879410116209671353021251780801885578e-1\",\n           \"5.54576894095302137473562870411642498454159878739464625116831971740997730359915227524075717328436463081497500485416831879e-1\",\n           \"9.82012389338213987427432686899213579991770436451929205950504261612336440523069987734051927060071228336651935114247230018e-1\",\n           \"2.06445480789661722781085666935934466710665000093111315471318244086154187788240397407764949071589419997001126229699279918e-1\",\n           \"-8.22024967814241172490083350373664443948382772873119098939533117836179462362265599942085298240078400862839510315401568501e-1\",\n           \"-8.43483668915081157881609334416452212500481988371373212797897630926101856989377353686006695443683562952698091745372956064e-1\",\n           \"1.68357099807987317797633647903674089665368628422558854222230995142941489911909308417314277825877040168111682241442337249e-1\",\n           \"9.73954039060780508698548127540108987785881109985102169990241290387386676882934112332475075476604334818263785540220696343e-1\",\n           \"5.86420359093869515237687266954561200160006212641211187483350874672859136679499954407470935299385535928011115437979374327e-1\",\n           \"-5.19500491219840443397382144913775579016253538466887540765306393159738082663675375499840773403952929977354698339617261390e-1\",\n           \"-9.89013546180296021750901758474634735102493497248279924875522015911873550276888689676425102442986261848126775556194306727e-1\",\n           \"-2.46947514812703938169894550153319655995779907820829748198209521180129269232387596803077057086642606505827139155491603712e-1\",\n           \"7.97638583669534812597149574893980942155226403291812660315816507318428697361476484505958849067790885048775312980075497096e-1\",\n           \"8.65087179683067252708187359165577777305998628817518314353161876891989239932835217904989326717355654871984067712207255166e-1\",\n       }};\n\n   std::uintmax_t max_err = 0;\n   for (unsigned k = 0; k < data.size(); k++)\n   {\n      static const T euler_gamma = static_cast<T>(\"5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1\");\n      T              val         = sin(euler_gamma * ((100 * k) - 5000));\n      T              e           = relative_error(val, T(data[k]));\n      unsigned       err         = e.template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n      val = sin(-euler_gamma * ((100 * k) - 5000));\n      e   = relative_error(val, T(-T(data[k])));\n      err = e.template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n   }\n   std::cout << \"Max error was: \" << max_err << std::endl;\n   BOOST_TEST(max_err < 5000000000uLL);\n\n   static const boost::array<const char*, 51u> small_data =\n       {{\n           \"0.010890646307437399028563191160252839599929232814970922208664909237494716181484215717644776933044418903207919912063594159099133490979634344811936925144447725948305353257042599564404885434349760121009797816724142318243738364307036155852011004353462651092012819894667485840322627440332163428546845499107471983896711023161969130462687924045508477090891879273259947713367290982391204265694893491531721581439\",\n           \"0.029754394000520972141380267705677256353702996169858414168445272181777338962866552847084800544086743338130195210005002660881957584567978770485056322086472328896988088721899728258224129935989180857437073412730903070983582129359565450458299328041955729258476583848159389714290107649243089149974776893563078190705561325124542669960182002956940545214147678093802442811362846262655415145897575707676223535749\",\n           \"0.04860754948595027759689273751438643634234576398271158524070718139962965653841137425728738193533514318422431877217110239554743968609870039776938201724688048349972662394084789924867267405853696017478160702683117974766657840965270625814482422398422216605490620054574252910928068433847115132429726072853170339113804838625536981361490008602432476302086066307320875870985443111858828925332085101376920451257\",\n           \"0.067443401266329792365583268418977022587089806595860818790246293104463576184436096833111903064801552379988362224633198052490234517656318474005568709048710308123967082103235230201516378834855764348740505470176912466587139988300259624310153055247378188811239571439869254255368050758213303082097176168650573121101094016896349982672715603054645687782535250201448606757920212668324401846105554332382154705308\",\n           \"0.086255244004175604199645786226683865650130764638142939010554245919172299560583634262067769465886944689883333394099120765964771092069938753689253686543017871063587988437235057514131760587649504670117933814486942187589706655157340717185354058186603027300571692666150552274324933749082047517987509942119060274537912867956274549119040817359639741746006374702951412541338483858389306953539029174581171144916\",\n           \"0.10503638090893519164596691292161072193010174143933600597680115817738720676321226654184308409972393036413684625874294713490753271261380987552528236660688624108474124469034444076627315674234385578608111398112242272762722849083801773818689342174907858373883192220827687618321085007917387951532673599267211035785307947515638810735621964273183425401191468313574763898720597251843424536611952986478638938787\",\n           \"0.12378012612096459891996422671239906394195356627713556749926735466337892925173796651675302282473738808218327028589606894825728784823540605065317506645900565980161901287116410208049542818796994171203890952761651470187834173644651508025088970034800067245131759655003164127161058084682831906406941473650395873577925901419536540828468001386512234321890242266327761400155849351025221609783793228816606096155\",\n           \"0.14247980709161433833827358255114404185333478069639957369769805221957506649654851981837061160249376538785737485777248817812720592537597263252706422066438137522011148566625861552209380620325080441618503257506798981598559897331754555335688284111417797211888381141445522536739542765207936516297907076923899840216864191777039028622886076254231994264908278499537587536902686114072117102531777746791366147472\",\n           \"0.16112876695857673825462942280040873226725445145336882995544646098546697397681955191516861690559627281570477802647683153249828731761062718487424104325152088763220776831248566486363299448443795266104568555186977695939803420793575204146124697832793773870449082377964029658283741910741804550762511379894890589132658450368609377005630322641674351408014813725947288936865021810537922503050280596331958949813\",\n           \"0.17972036691564914131189073707203611766536704952071818203835281740755093560444625679032703078557333645546302532200674729781663838075105196332695024246509042831095553050804767663788014113177991938252225120228302734228632787082072480689719322299247090887229731260135165819595797392665106642595359433094386743214852929965104946276195924300495453775467378376551444126292108291215861133471208854009513721707\",\n           \"0.19824798857606934571352609051549058593435535174283382080060738672122306773474119459815363636791069253463660528114022041674780565798655265640072669329819802234483545444085426470661233958030668844326674768815456315879868376252722369574694411591080512527683145774214215193268992508938562109669843137270238454905091555179756374512457742554641355319960601765568460966738628365652972463731882673979926092423\",\n           \"0.2167050363285819704223187876642169717474346025766606244643176750460657731203611217470241676182041675112171974414875203007374497968642376196256262296063879827128970901451226217571636202438144440234868076467587220541438440149682254317134405302648426790500751310485432990930185087578150399032543990173811106465656404530116032387260432178319507278340110997943206401370789106214680733463126804159766688178\",\n           \"0.23508493968539701289801441539326267060915175918342580386836036980227948313782327655061004506711767031388143537081826986030990557707922203603349984851809173788402101756510017046639631528282698404857654444279509591873678208318484036337040837844539190863615310872984455261973647897667843302241773795592355085118273592671348602240382153223466391512738221253451636183066773121830262978729780866153048605159\",\n           \"0.2533811556212047542679161173582151227103672187769971543582388259784795155332622779547839459016647290250036005712168909799523370471647322112833886051217950625710683025675691585734514265087749450457714578451290681140064635291501640395753290532318406110106892218388811781561305402570000283806458134435822529043797962340420841850011846648265787470508569124672250211852546600514370101687713861131209463861\",\n           \"0.27158717090241435065755609312085387589073221253701701142877476904254125053252466469600403650634482409879186635717002370089097070045821182432642232618427944489732133359996899812980722107011126957850576210476679069162561257167921627603536603943342268770727524690332400255408587654094512383349857596775777725888982277559281982571487656535560758087235441872907962373375423740325723506626374882319859924962\",\n           \"0.28969650440578692965912855479777150523900698183973110358010443581781966348171378962307935462457921708108325003566673849851640304571019200113280406744551445148200341554501141174444530008329262826786160080931309057528673711507934822659456861163197618813727062179453555460400169858233923358238607875306523866767536243361049306545596678120228677505849040202788510059415993219975440657979707947898632705847\",\n           \"0.30770270942563778634443222550824378057595253208974144909939396933701715445493088586920897452838893301853350676955400357197838773823140696209649573828382477454711986806154497998912926265388494228459988323524548750870702083339285969468391846533348589851520262990720843670148790211009236063622194282315540801467216625666505663699480592080398449845511909092071640909885054719301078547683325662349532658001\",\n           \"0.32559937596878634249263192973385963275552570142977727375619908690982968889531407133936548327912894149757305868454394002531385820341045863161146695151908269553629121372700695833373968533510661265854738947940689721812230819575490874211279007289828369964583273676393398981064015459284982970048174649094549631109312941188691838118955683939990881732219088392629316401227525790752712758279892546851835776728\",\n           \"0.34338013303643689435259984865624959352259286039436985939426483729323987764837568376066164703227630278807584950278626035763399164177429894322425866236150336898079573258157833074772287354310049676029566569737995054499018518699450946056626536479822852758163848528920078247789349605898976290484284018984355696648190967701849464571286257873661615051036433297599097073117151941857301740816310919312668936753\",\n           \"0.36103865089217782674224266392907326208964452822379102503439414768728197653534265911503054023760783622236800804794470785631737993143180071550223728801984904852623160397230839644629077782630949486339104760008566935013234195735777070582106661423219379374522941522832331186147905332977726043795737008218909226025962294880541867964419424128310806148008435847967256901208159302482322730929744194185143496647\",\n           \"0.37856864331529191294683302986737462527422720295203122486985051910813389831630458742420433021640718832999264813674938157273375290592788753133996741859965258034273428657399863159488519434113093863042179261649202584979828347495161391780592433454809420632605178105958049630938532568156789806946629309375790343585791884755866400295470651281289167454617624179556306285775538273640784278475358303871406797294\",\n           \"0.3959638698385755489557710011250921602780605301308457595569865098132061251227321128681128349835212212508810246299921462519655630208347321575504292305860152320513799100372630595769065936291506594220617567642210250680560302662459931036815131767702563357378794733903424219866581554015722958062178902473414883933807190920961687912191470152974845756609418554739641361171541363409996648143043979357302190703\",\n           \"0.41321813796987028521091431473013916161596830805293649687424341688961507413716621591649879163383882641673238540682782626959358955002216003316726344623613626809950993449214457071292961126188761860214007662067345193545393653191742497646193189677890657992964660139924463087072704096969748995358605459064076775540679952182100013584273877612509536257834358450242426357122974687246428904315337788603554112487\",\n           \"0.43032530539651581726649227346608528709372859200683817125277384462849187532000288969537766724897319030479860713591459932866508254904869456423088312945970943686450425589907227275358186473310644458353392107693439475272544181726520566221333846008220008702070460626739342310039148106649726719665728169819714333172605016313499067227953767878741853545763313707499816244740855778447731454065384788859848319503\",\n           \"0.44727928217193967651655712666040617006236300257644793444619887007723922383970962870988815495150987337761018019128790177957898245520422485269324604484642139354461290347689315448558082058132330317789105861674569680430563377440355102600184370927625450804550114009478901349833826102470780452480255838220723171955252412104006070322080932915859579006653276371401264439817338080069936810866666557553662506811\",\n           \"0.46407403288360522126660904671571257203469668709200603873826642103612288853249598361813813213381052968904786566929537791978751985511297321991996818974870946807510786919602279514706154473236597480481149516597293844121405001964448599792635426082163120478756812832932606227610137817312140031064078333902425335570730565173883252754294319888872518149175050583958244086010074110878967984441526026195572046031\",\n           \"0.48070357880154616464768530714893198018226307768872832018696934136162055774617690112915494983829868655926209174893609677823844628976682666861087174925649829592164380174433963170047900751735818142724368678683601091750819984658303806035572915499999180599872513173096429390456178642478189724903758698238722978406369084171804020040246631229610021517925007543961283845124822740019511921386188934760298241688\",\n           \"0.49716200000672278683141570737786924159326600032981923078600441023882683095816876734389429898823686013764499093454507915253215528870989821318738227798745591597923864925733083640574132559603114206682739488541451077277291582357627881380008066440685837422009543184722898767087492264154499861112499590934108906196324393034778681622285346845867860458748417916763883649390228287689107774312170267691257606116\",\n           \"0.51344343749844216224309565441486087365890516381683759696704839526386373494321578458551193514743669178342420835082611868891019193801223760604220552152028015878259509179672236586872004169442377393342941368136686044214656339879518691219516228434732537186028321245942076903928921929607502848888640267094590400556200402256089794954485061564115688273804254406706725374971267431122825004095102239220991848356\",\n           \"0.52954209528009218542956877037980380998240467111773187487177084701668417706002935457309027480414979338624119758863233287969233845786459113619958146654397106933375312089626001011352424174223416515118670901639015699899005014886945323983797633471828049323917701068414699189471811508040323789047713536270617216249222074877291822920747392986535291960399633972613345908694327479738445245500914715996152461985\",\n           \"0.54545224242244689926647810432697721723945987179773365856990386707254353534614807468692870318816991084937065603191754270239773531928848863926268254420020634174904439920465735399587679402503040251639815041072160696029528969373711375024524059535996077596844557011786411865071706766713049961515353664484996577751962474564968659755104983468313555304855249829815310291744255989014492588353749587481644931913\",\n           \"0.56116821510380861353700162760755101727268623115746212675907859515911800480855365905235006799852352328451502804871577600277181740574994973635138803211912076695967558806493981733454148905054449991651227073996616835900542604367257843601995979944175684600136575098939764120745952964355353589317556067474680987527548079297833539998258342242865222215681747969549869015697939554127499557081626950060916329896\",\n           \"0.57668441862626054773920164705882295031880435874490231795930393597704964539534854834250638055542815083463738683146430082379073149079998953871974990605030531115748567904948229002538680465351816034414085890696196467615521969543006224204433997063527288514443404935419253943724579872472854300703798475966107579038880496698051818375532546368197809806544115496171522444187250876233927302975709248591908972346\",\n           \"0.59199532940731223634617420193837196766186356068263223313261061480558639436412180991021350240470913092271149633483820904350945127229180169976070379470147429711011056203078210298313829635000565303787641997857930629432231274870246836108452732993007541125359738273485061324228778750531830069944570036169084871305329515261365955383178502917713214334808810726412625844210978481512366368025275438632291862785\",\n           \"0.60709549694622869462483067245797028399468956070763942538530335526853282815406226053099893555611232739741099281199863420254333016184720313024881100010161759837083928797224725640021095785125988238992410296927225409984765886863313873892022531648958451940083661715815760806237878803609330649695132473889046508160482887768573723088361332267243452286610176948724186843039692112797106039213976473403724518188\",\n           \"0.62197954576434335539696684219824327976988998993669475584026026679831221725774460365328908947620452777457191790806959938899059379387140391128845696987642418506611453321626607869801717870254836897328796165084605948086983949944714226464644755644542238083403302661596239269476252222614109836597348873471190787660391585694078779921390758232910639208518119325492789999941075221166054973249356136808607130253\",\n           \"0.6366421773186640485920116318191204083389644098160828009666722635549477083039305904975813615643101060893999315509501318081025137289051787335454356108133761354485193083183997634369795655283340428506642872565827559825155045924936470784378552800563136355526499002558162019410271880717338646318471375684163442601830537613691628498474632262547856029932241457937391840960919415488213025664314613747543749464\",\n           \"0.65107817188809080279752785471799265973958362274943758073000075578938519480042543196041314945170036193559782763524413154927612489597355144799562963417455961310886431794132437757357185377007718709790504976900339191552944965308823754898079933186431693664015814010551367365293786806527034958873669211570906132849013497458819941168651227792824572805777219160376304646562062564773441718051418178414899683019\",\n           \"0.6652823904315739978766556052897347198651017349760138699519597733553278561013395851136458951983261597283585391502588949649092379467069209284755289821255744166256794329589771465045421874634188329764638118238723545310838064785644468083837991172367935880462068347034222894524074808990476036821633127927532229213401486467496527893691588255513769781016943243185567913995336109327864083859254466073492381187\",\n           \"0.67924977641755138662041086036801948989088186294785002709809874961811116536667286127777672928127306388394020078452402417993836722984523906631302047812425809759286220237826357465064765092612104224837992075711035615650942777454297235908308024053950635657488001916036801234116581671119069849133344664024677517075723660642709275823456343659009540444032487248071553674961012055521740306092600444870718199652\",\n           \"0.69297535762401272778114932738244728669670875114228232862389083194872888693112134130021641463393969624412179768291914405554577080353247136859984307940401373940521815913274464950964347624918449081645304540343160683388727015489772202472645406318288749244334156857814927405528763108558137488794292057315715995191324964500528600378291562277858608403425720078390497455476055579003286296442406491998525563297\",\n           \"0.70645424790855122905182233963742667718470686911515869065744744473731249895412640632516625097411541437953942564566468313798077366853928608154168668667806938130662439220702019172328936889436324187304262248463334787504456805683070026006307765178787997020889111556678907849442591478755800698808480163225125777511828352357189284217101098738405458071150544253514248561787426067001460586251699075230390564367\",\n           \"0.71968164894777168289159927814596788937422432901416956306230349431557362414856173295064125294878325237342190029914430775648665560145040598898117000971783978541799092281781000633902779626437866517288284324732827083065703448279654800632624171861777710582293639879819116932680545313562525074940809403693475624332169458744562386580074420532959714281903926902622613852892104465683714186704831143197300465955\",\n           \"0.73265285194543608674851404628602868786755398311878599262050209465658337331457767882450516660833910207846986678480603058221329185506983962144302950162737505562091432645466997334653618075359372680522922578429510783107155224742867979206003853893418268095936450823867623873015528453108944563276576646508412198497923383466470895808777876544429706485835161864475122029711660543090876323595451165397047981956\",\n           \"0.74536323930873866831066285008063416514858255428941319323031554151661731879818806472410911187787504167842137286019020264008471692607030872105020489874402631524823767448432915438225335869622093354538021006314536198469136634364850042715775621307965524560308901397550829610851125072518884822515926626213581949190024268711827023522012804341871590177804438418738255381261594827085100659777173578154500251787\",\n           \"0.75780828629211358196731753685850074775187628883294491833833279769413437275246840580617185041212744084038976069700142887035937511309419495512390089087847775651833369173386038513330257480188204696687136231267595399438343156895032682495327740328291738325217778497473260463740600852973600297913238958828132336080624048815574113414592522918778477418427876829087439774857073733879539765547872800792711360592\",\n           \"0.76998356260799010064124325420889481428942836988785464918451704687709959533402569414853910266075223008145347866420469852220997470992987183595134711278161994827010482478666523199914707457365681979989417199177427808129308850228595726632468139527316915481709465938257650120793934685421343443942356060396291075752713480402305699120964704579260218579751719693291565685728074939857101460901984240449471777639\",\n           \"0.78188473400392189344901888012886357289691591193533323711550248487573232160560048524966536928562079994581390209192526509899176077393862245482807165569409036943146775931090958041945317489351020506180957959482939768275851398130892970557450783138983566392455270904228057175489097967314871299150832712632639718878702471658606369540854496281803565819545728647765960328269135853132407415684491934581417388002\",\n           \"0.79350756380552895006859336306152006552993066088382163294295016384877329185292344719536879395060919553184640006473875955257330264813115929942877156894433233876161573894628944452740080653935089289153173836334040374431360850336851424574668632837338016740333716530963434291489645017931035529052587483629111178971917421121398732580060101294617212337648611654041575132820234403350225337355214099696493406567\",\n           \"0.80484791442470288298134387731514331459831415420391927496917008531718727007136925375073869996549995938671025493755987802316807560672754205522916341547950527416285009447065632296220924964603370109747266700136618832767813938243784759073035555035361911772169687111972294262096081393656654067512785827139608367560009298721819281091010743363153063005841441400130721362346287552727162527118465104052539630019\",\n           \"0.81590174883253870457705586780548750833668862852238889952372206236774966573191832400412494946116015154305873210759963247859431688393192829248700535837612167242633896627292821666890819736549652534738107012873094812825219601489880060491958385552979476621004236099490018887651186347086675381603801017940808290855340870383683075409122477045713172106217670870448929077822708030574128623585863036730829850118\",\n       }};\n\n   max_err = 0;\n   for (unsigned k = 0; k < small_data.size(); k++)\n   {\n      static const T euler_gamma = static_cast<T>(\"5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1\");\n      T              val         = sin((euler_gamma + k) / 53);\n      T              e           = relative_error(val, T(small_data[k]));\n      unsigned       err         = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         max_err = err;\n      }\n      val = sin(-(euler_gamma + k) / 53);\n      e   = relative_error(val, T(-T(small_data[k])));\n      err = e.template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n   }\n   std::cout << \"Max error was: \" << max_err << std::endl;\n   BOOST_TEST(max_err < 20);\n\n   //\n   // Test with some exact binary values as input - this tests our code\n   // rather than the test data:\n   //\n   static const boost::array<boost::array<T, 2>, 9> exact_data =\n       {{{{0.5, static_cast<T>(\"0.479425538604203000273287935215571388081803367940600675188616613125535000287814832209631274684348269086132091084505717418\")}},\n         {{0.25, static_cast<T>(\"0.247403959254522929596848704849389195893390980386965810676544830494398136043486821690984848527973792338327197752176516138\")}},\n         {{0.75, static_cast<T>(\"0.681638760023334166733241952779893935338382394659229909213625262151100388887003782753145274849781911981438190343146876189\")}},\n         {{std::ldexp(1.0, -20), static_cast<T>(\"9.53674316406105439710335272649306549801506698739838753888815787489707114648106832493113326022411646219016312547902694921e-7\")}},\n         {{2, static_cast<T>(\"0.909297426825681695396019865911744842702254971447890268378973011530967301540783544620126688924959380309967896742399486261\")}},\n         {{5, static_cast<T>(\"-0.958924274663138468893154406155993973352461543964601778131672454235102558086559603076995955429532866596530638461663378937\")}},\n         {{10, static_cast<T>(\"-0.544021110889369813404747661851377281683643012916223891574184012616757209640493425707075673894983216158293824238262832286\")}},\n         {{0, 0}},\n         {{static_cast<T>(\"1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332354692230477529111586267970406424055872514205135096926055277982231147447746519098221440548783296672306423782411689339158263560095457282428346173017430522716332410669680363012457064\"), 1}}}};\n   max_err = 0;\n   for (unsigned k = 0; k < exact_data.size(); k++)\n   {\n      T        val = sin(exact_data[k][0]);\n      T        e   = relative_error(val, exact_data[k][1]);\n      unsigned err = e.template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n   }\n   std::cout << \"Max error was: \" << max_err << std::endl;\n   BOOST_TEST(max_err < 20);\n\n#include \"sincos.ipp\"\n   max_err = 0;\n   for (unsigned k = 0; k < sincos.size(); k++)\n   {\n      T        val = sin(sincos[k][0]);\n      T        e   = relative_error(val, sincos[k][1]);\n      unsigned err = e.template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n   }\n   std::cout << \"Max error was: \" << max_err << std::endl;\n   BOOST_TEST(max_err < 20);\n\n   if (has_poor_large_value_support<T>::value)\n   {\n      T bug_value = 12 / std::numeric_limits<T>::epsilon();\n      for (unsigned i = 0; i < 20; ++i, bug_value *= 1.1)\n      {\n         BOOST_TEST(sin(bug_value) == 0);\n      }\n   }\n}\n\nint main()\n{\n#ifdef TEST_BACKEND\n   test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();\n#endif\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::mpf_float_50>();\n   test<boost::multiprecision::mpf_float_100>();\n#endif\n#ifdef TEST_MPFR_50\n   test<boost::multiprecision::mpfr_float_50>();\n   test<boost::multiprecision::mpfr_float_100>();\n#endif\n#ifdef TEST_MPFI_50\n   test<boost::multiprecision::mpfi_float_50>();\n   test<boost::multiprecision::mpfi_float_100>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>();\n   test<boost::multiprecision::cpp_dec_float_100>();\n#ifndef SLOW_COMPLER\n   // Some \"peculiar\" digit counts which stress our code:\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();\n   // Check low multiprecision digit counts.\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >();\n#endif\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_sin_near_half_pi.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include <boost/math/special_functions/relative_difference.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) && !defined(TEST_MPFR_50)\n#define TEST_MPF_50\n#define TEST_CPP_DEC_FLOAT\n#define TEST_FLOAT128\n#define TEST_CPP_BIN_FLOAT\n#define TEST_MPFR_50\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#include <boost/multiprecision/mpfr.hpp>\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n\ntemplate <class T>\nvoid test()\n{\n   typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<1000> > mpfr_float_1000;\n\n   for (int n = 0; n <= 20; ++n)\n   {\n      std::cout << \"Testing n = \" << n << std::endl;\n      T boundary = boost::math::constants::half_pi<T>() * n;\n      T val      = boundary;\n      if((n == 0) && ((std::numeric_limits<T>::min_exponent <= std::numeric_limits<mpfr_float_1000>::min_exponent) || (!std::numeric_limits<T>::is_specialized)))\n         continue;\n      for (unsigned i = 0; i < 200; ++i)\n      {\n         mpfr_float_1000 comparison(val);\n         comparison = sin(comparison);\n         T found = sin(val);\n         T expected = T(comparison);\n         BOOST_CHECK_LE(boost::math::epsilon_difference(found, expected), 20);\n         val = boost::math::float_next(val);\n      }\n      val = boundary;\n      for (unsigned i = 0; i < 200; ++i)\n      {\n         val = boost::math::float_prior(val);\n         mpfr_float_1000 comparison(val);\n         comparison = sin(comparison);\n         T found = sin(val);\n         T expected = T(comparison);\n         BOOST_CHECK_LE(boost::math::epsilon_difference(found, expected), 20);\n      }\n   }\n}\n\nint main()\n{\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::mpf_float_50>();\n   test<boost::multiprecision::mpf_float_100>();\n   boost::multiprecision::mpf_float::default_precision(50);\n   test<boost::multiprecision::mpf_float>();\n   boost::multiprecision::mpf_float::default_precision(100);\n   test<boost::multiprecision::mpf_float>();\n#endif\n#ifdef TEST_MPFR_50\n   boost::multiprecision::mpfr_float::default_precision(50);\n   test<boost::multiprecision::mpfr_float>();\n   boost::multiprecision::mpfr_float::default_precision(100);\n   test<boost::multiprecision::mpfr_float>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>();\n   test<boost::multiprecision::cpp_dec_float_100>();\n#ifndef SLOW_COMPLER\n   // Some \"peculiar\" digit counts which stress our code:\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();\n   // Check low multiprecision digit counts.\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >();\n#endif\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::cpp_bin_float_quad>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_sinh.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n#define TEST_MPFR_50\n#define TEST_MPFI_50\n#define TEST_BACKEND\n#define TEST_CPP_DEC_FLOAT\n#define TEST_FLOAT128\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(TEST_MPFR_50)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_MPFI_50)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n\ntemplate <class T>\nvoid test()\n{\n   std::cout << \"Testing type: \" << typeid(T).name() << std::endl;\n   static const boost::array<const char*, 51u> data =\n       {{\n           \"0.33937643772780730649735035088117439284797964277099188367427256402032493952288848579083622213428182842627923924487560393743204013166230906610274533504451302298480596207257724471359936027198954417317381228420986152562253196896619001418292769103034561794393400788635610424360775622370491149170501475453034747306600304507650361914904138327962144190354572359428689767990353722392457982930942617983634601752\",\n           \"5.9746833446871871874685235810964396457491766537010251792063372398172074828151074989468673672535421045923659313715467371148678693662985453590831122722616951299822923837410906027605763677066945998696776562438704017846907508677186762421899376364636371743116519071733413775650991880222096045615827530741679305666041641331859757012015389431793705875600863391408448065773828563483223117178640044499399723744\",\n           \"383.32826140718915582837967448860824902040431804683461630967288341613741467095168380744762629948507973653220772087887989292128183196493611623766470283358542341824134250511562240487252437079958429586344329111208041197054162309164204144237855212391474938076935722386012246677813568519769393617755607372817372398764101401294149353978426057544810680225593132066193858006901125069663362991172745649465725272\",\n           \"180470.88334757918167934673473709881208559849920820465419382707969109187448281704429118605409224039018180517847684905660962429505828088398660499158213746722168139372781263849989865384042531846290813274318773753295025006473736660333640052386121946183935053629928496714560749082485275242374067168149435272169334475060524974384307351757201698786200303374802146857634893509516262245925287553380389076772488\",\n           \"6.2781497954189513207977998975338639259302378413658035459603622432839117790845430762753614618299222131433987986511235061633658516824123179660244932375967566163895461895213509376427850290780942550513918615228886566287592461085762554208269169000672149592375451149457664991726947185145469263932975075681560662428417041932848357447220175607720561540370653825438750168143857523868718856189519864027430308779e8\",\n           \"1.6137831147508521132232267071463247985636947830692243664921522457394294988129666666745854084767325882717254318322908201512400243137564101564235450151960593110176457803621675408660678871179456625850704076654060872094257085919134755925910859520026379969099492921728083639989029675808598278170215911879751320574053132699172028082102336989338403081942130794464992491330850160862146024982135931859868176809e13\",\n           \"3.065121004865094886953119667134247741359538615435533822684602797608029400610449009335078883525336625519599034934744634528257351124420564267197918749480389135525897886434344884370577475363556341414615470556433033106705280531443046669163916446454890662947185057748542735928453570069226294801221403438864013368364219717148075652123561545773399076318560221173734215703610924057158101731263882232550297741e18\",\n           \"4.3016893602106215864771434464025735547192956887049374680649926707919814241961779812200280749930256501997849507695395125441756421661413154730888574483309057229943886742437071251707738990393977398403536175642762242808350076543018009682725019125106175929448866428526984370017465117236484653179596869643117790492866002064306593104169410537341890174831622159415936125041593936992634719906123727028419057537e24\",\n           \"4.4608685929681360001024935791890661655506049487122331222491789265929503651540405036031990380918459104583255735620288691363060079360758406339887417913286769718423759522832754263499878135869223253358698774066131403822428286318351390574838877307934317251880890827523325360658275060099119902102399714992704146743744108968362755624325107486994088414126705458507082103811086372240878942983212662081104875997e31\",\n           \"3.4181315955816806472569357441100390029536003312981931954091744304974491527743599822230006760631204302243855667216955365986192324833652299336285826148922073950348547795494738267861098328516497599288314822606511466743212319770180141969147554023326883651348621187276823849839283609071336923316655316828855943689100621619083822127788284160652232283630351386798636794979234576432977468152969056493038423561e39\",\n           \"1.9352946282727908101414530212785249763640776919052480158881659190625166733449770912626442628329346416132299268886589920690636914906717492301836773331460154604580407945460359957380672599434023197425489039882987443681919056322268437224184910074985583829184831034293865504101338027818555871946080687710035062238789949143319550108801094190098446234092310048150477274502060870736716324117412815209633124145e48\",\n           \"8.0964449511890098565841496436016431651692307764702784234901741408135381374668439020986470675941110923614446905696410406066640351065195237123718468440597743167713019447544827353458477844468727834630038609140168354634397475741840053079910210908251252223665806813131724262334693137656218010287981601097259534068903471812189212459231851835393208367369054618963204727992168556204168791513644815218096463093e57\",\n           \"2.5028257092625174549175008952222569141816383637904981644379473858250736896174216539673733521627607209322019413420937570273676341726636306931304501320694017061891400181233108050930610234076339285157392030024769366663118692571469493256243952018705693924919037621083041696227375589264811876761430035546270312014570431860268644276406457398485042029556392894799022733858611415899182421526634018060028309384e68\",\n           \"5.7168370213792649967466315312864179662895170192695050789061362839510836418124645968032989149068311018994324517420345278843446068634292140996241291031113395887824145000873531937856827299256489358571593850210528248202703396455363364446996158929674989959483681393263782486430231288067231095140919741928337466492665857902913114664767450432510739209971738097074002526312039248809036478310948111740897528204e79\",\n           \"9.6487261169670031207955841899729386502708125098394777808615183927342163909284025992243201020435915122698808649711566042372911206942311277943247994427354130507790526857797833309691667375441761513692598664419973302444660838882173718713387158013802112502169254860961105745895124415352002289485483908952674562396552790441656755711709645516914188860464353624992313010889765422981069429049436524222321550149e91\",\n           \"1.2032977660238608232537005158851668311089986235965463249220377778638489972355974848209035082333822309902237165042868213438627625544096344578102199846440476859557339736747791529782018329078191477783605471526120462726353510147373798347292650122930289404816748193194907382572774906323766342758092979989633448828636445074016110331338699464788279882402189027828261039788079556739180915346692779065476431369e105\",\n           \"1.1088306081278288754492401130897590262404571813281460605683836139669281218442501421935533170636990866165181664561596333701204545493730707210930818738817252706131805203538144119244917164949716209095542194899833868499263375700313934257155600824601418042452138211549248837967344874095248283887929145923103153332810091693393888809653081365270947112297406471162377655179657693898463736926911943490619163092e119\",\n           \"7.5499880591625965663868042832675300901799245732418501707646792135512053284835138294796976048691668315442427834949618514094329533376442442492757936744857569785450769927581802961191319878260712808001736830227501518832554201816224207300614310712430470538022948957433004823102746037654096845266998518623332118892916505020627868405618942429551700207476696585635930562973459491424179233918050890206232214765e133\",\n           \"3.798536358006797624025033016530070695826982685154937173246022092345982280900791849578041210970037835270398289956157015064696375146357207576854029748413680946201805214954504282866534528711715039215051307866373994662368105368505465037259587291440042344663580680646178313958620437868058550744621854406871361710599007951099013146571208384054250556080476992977623024059268095813712424244902009427293468485e149\",\n           \"1.4121319341572581270215359848706630542776633675711529687593487346259283960708095601494823112486631023721124235640943167173029348028743563902367757599140008654691320430919753414890689949599421028277624880392344132646738394546195638261279687543208503932172926275294218429086816560213399180179494004109164546844899632385177835442946174653663068675983237955855108059376913611877439522917217336109804190399e166\",\n           \"3.8790307719997974510664339744260233373881096199933152202662556556779783775106563986911859526413282055258612522499767709123313205863879946518297779104337686883587019222829967005608205535314284003183828513113021722123872387036435113517356676447376715595408179555267871947671679098986651665719279348025058713817796876795915844151719103197410787508530261619841035613531487094949084263218956635085585632719e183\",\n           \"7.8733605373835840397434523264038598405672829925651165847065668324385430746087633348848905637835428739401439679896923081980364912472282573695612463537585283007941057172128277340402716645674443632827653710173742423648839359547777694778576675604645880219833375227941998426325886558435214355022240854563558864080627758653439429917072753785194675103766900514602432580639079224631229479607396935864512990879e201\",\n           \"1.1808262995038900942517891457926200063018079695348469762725520377876370005771518954251015338402886097689762895044056273430051256244413916763438966705458118354189107806216991150264176024521937328179762640422127608560103802431672144866013216405157197709788484197720057702118788168789816074560208078260433548283881535909071116553897893659656781376448427981358955547508806938614921874867135186509274509121e221\",\n           \"1.3085817499987842655130548827168955655838432140245228169691892267707778790498773914833199368916114043966197329562444577848635313938483757629541576533880917215885485474416704968999200090496252044959849927443732134176975867869986011315975625868009065373046224716063168977788103866885720471095547385342868632018951910603936835789387464412366605713487321530237148912677199033012777178113821791621549557963e241\",\n           \"1.0715308148006899161903881353829644069217121138682658034413051575604561649576261428568888094218620444635013220705511245290719605273316790249367622122178650529000528086055415007045458486410501636380119413632657994999412652188430063128470336817401482172580366374079331295129200936246446347832380606353293858222758687479612927181530236387227215663399410099251455256898414199913458340065553949424990477448e262\",\n           \"6.483319651006309502237640505955012384293570932602353784849377890534620180296272226076424490097577093511886503973590409376477611667988893542117173598716788837179265384921201772013611631892729250835822804494742316330406688475091973437669111728949960922002370308207819760146543720499389938855072810566961589413895110830251224194598788696990065693705615156654866578134664648091752361824241438921952031149e283\",\n           \"2.8985391304542768293172709775230767981477721528885408305355619530690119426207269563049756824939397157221877775531212262059946098575425050827283362457005503261796116156917077778477251551070762614233325253060283603452216492681531839154649232080928787066338399915850327381614672456102374248950210248266796072457623370079195574322846594267768883120374288952014885152055438195794090975578878933873824774214e306\",\n           \"9.57524433627083921372674145950563946532138741951042299439035158875449060589509856903496678820625880407684156184675763001790613289835869844325821965070261880894138207436003366195024403902162467929095155787852409710735775347490909311196315332711680552044467458169615366116872469435840608534489425322247278926672059747911266981024366989976214521515026692183039600169984107883592297128416659318858313127e329\",\n           \"2.3372734503362369375381009524197350830316472034721759761797536237738670471009423543542251572488229045699598160834162677357730620072441755506075897500940629883044875771104686291523502165266242030847074909362622098365719455332359938746138629161304717385265309980898079489959955157644566232440805137701071311495653330606071611331941246434767948905863368638163788562679785940566685500460815077065003612487e354\",\n           \"4.2155879126937199240969909448599186868484717887298729605150033299123534992857332918168135230843738695925698383815575417820480732378749635394939513838137876524333991937836847074991505476867647762082587225838063325020413513077128321581439429001485977751765798011101092072613053687422983352140468569171564773941232256057064161142341661775359191159220450305300322654184921617310753474842253496677498824723e379\",\n           \"5.6181811613375701248970224378256740494692066242437602652469740512738297599235414593999616891945156186827736326184687322137498447792007445397397290336810468925670064733464757082986791232916898141597610692740388799796632396708149027243436859752526805112778790645096555770227809873695589969805678601106157556386974221647669590827712353133603091803570183764883405340587430017053183637835511899658145649708e405\",\n           \"5.532511069282205350923830187073466127274584467195468607886763750877294392993663821432158885753563495238131394373865428654052604326264330104646257659760161386620716716703631608643312613245804625511813964275109451513736558514977338129201153666764317441936156609643185133981728847167450887861106642311329612564652645663234240748195490808151911497393974690166034839217817023634217121406163178148652748479e432\",\n           \"4.0256666306761331240653217136731531623017017695713942917027851762705346357330788586411431378972009980532310757689380174461664677676028378924382554201434975574729861177781849023768222381429947872325368088023224591306630434887529215459580760863075907686248521168590309636468448648513752893851767315693469638980874648457114335557202115472595647478331668869318302753802858726588719006447471192697846325955e460\",\n           \"2.1644237346681663424601781769159797919834245365230735589058796985974745594485988855971413936820871935714602237643458356241187573307428309041919648027960168541647193436225977495680484218384107820095589356463058222584008532497069179993678533431131233629312850771528970443634604290143149079209513868130585713006080733488491160321145735562062411305931183571279530201672366980412430529846635995189699318073e489\",\n           \"8.5987580981195983662047247216936066485731760315371506386077056691409579856014763032619539539935299716110411688793466397984311640631361934500807639285587334983206556915704635831992012926186843826981296831658998834850783404713050829093753126189556625095994621605300047199962332098857236359801681157419606676412198783092816364336047306243999363335004760439115355072350465422891365411868472688286678516314e518\",\n           \"2.5241673163187127276134610716954724162270290228773641734420864618245211926017624829840685860130579257772126398622324109858115624706486522844752512951837805396709793171502497523431473021570806024043139443284538862368635312799539108264084028032731295487282188616820261689634926427135060887942797635147693849950058672753458576476491733064455826768562371858057444914175251596852571637211466017938478085247e549\",\n           \"5.475067911823387661325942057081957044927796274441278042805014835144678321092623034147031518807063234976073102574257079170283458172046752719724152941316842521196069804425876507927418423409523739261726681120662097159943049401039490818332686968135012747332468921142470970507219403290422458185430415836291605355383658657658638112408092789126678938878667507151950931633694006471359998448912249374833586727e580\",\n           \"8.7750549689950256776639468724574158629603320014390275681028674550826357080136422399476213432791376656222763800628593282303459051561266270006921840049305819767639184391149913915312831894296821356222752594264134130151457242713539248421883837353442181724530706933220158507240760325182068001553294949268596178418634164323874971937997072367419479635154591248667559627811893588163238012665671798461211917208e612\",\n           \"1.0392000158337773273751156576416024664653679689973856373456304843339302977923254238376497044027728158058903302390909588333829463843362779584402914847447592731182614369968957680281500946805571235013941407979569788567794900810257154433592958167545186687137810101848000107335074486050959387974516414654638879740966175786016492797845169374594168995878543584318334800124941205910589727264397237600733483158e646\",\n           \"9.0936326753636727240574546678839170665019169110943878894933093211555976995701468041449327370073681898690638466136204694745206283652338526673125958055131610409923286526192661778126811265116493171283319361595267283588121098349703951929669281966675596890266483864217591555707552765565756842701056144290075867893520379419521775913047964393758374891516340929062076304350159966063972713118995033247759001609e679\",\n           \"5.8798281636930489964162009429009257867906792508058801627042121953599912951265315933723440185825519080102988056836911095299854840387008575164090793635997912930561430335216151607097220208013034399895832350235280120270626904356196935166701773768680311063264380891331021514518757839220818506905997847228783439015252768055166165941582030353226255576433910936297965207260585437762430381969160714956727596198e714\",\n           \"2.8091881292911108404345975896815558958477835260737794579417284512413473388968057587088555041266297486841923628702282019643659456724373332519583025947015025975126598748630623031951723754960589046233996595466021913942587558326660593063197905288573353559106884645285531497626940379800500474282446929237914568534665868703742731713632349090897884403966643055728471509474896855575286123275564417626861566706e750\",\n           \"9.917129372597671132067673866739246238179742417231064062960232866725337575281938597212073697168000155027158148165861617400080837699968785505107579831803685516054837447325150388867488754170677228096524224392410232206238263933144338637103531441623303187445874039234973380151391274490746625993568552049954630793219419614845431626975962881182662815760423226111647056071831411664335144052772436215105801395e786\",\n           \"2.5869027163543111121878679987081647715187872826677398475096738640583659800068967379551376322170347537454918190603891312949716382621902484616361664158953484778255247083652726854621059785392022847887382779010079407502679229021085320675903109573769331277413372272363218896397965662581357886739691376204316908974081821980432178065394228926767529685562155837452626029223937027004015040825450642409597700449e824\",\n           \"4.9861251931207080923785686798881789193813879610842675205361210155894774686328710893906543682447029206928934967525495260314937837003448878215156341411477636831113484416124080974502217578408248150338565305116223944900839866528622960352723938548713319425798453345402992146078868053263606234074443024155243450623634720912438841022969909473424559262711669905282193529250216454066716533180418518228387188393e862\",\n           \"7.1012569014339068241101751233953234216522840280342406520909288232012799547871960723719836516359548198842749536961644100550279020276709043358260853581760590386456213180291689322352732545965831405519844109680619067101311180959399339922706596098526969148981173519865139508665631317310424178378833370605922449094745510812618563813537347841030916512147874232760564378443782164868016244561788356251308121716e901\",\n           \"7.4730215360486642135431754747074885377840195683583018254892502245011973712084221116813364423492802080799768174534590613188275471080608467087354983850284805514875889145266688973752185071777341375422809910165581997555433091939959406569831183459872344778707098094941193489061532160249775856426569696127193453339548371679229676272663084782830276508737129506676031759345288056484158647796152349867328841634e941\",\n           \"5.8109375364209112227579654658730977030869454388607076903639465992296616832002964138000947668837140543325908222688655359602408511410663722770167244801973012245657865182739637159804595049180263175014778215232564251739259624759589953677661356104554831551073263668188283861123521688445132164147762321111597028523130093864153999974376790494383016372210442340324038686843345053322425194077414241243050491297e982\",\n           \"3.33875955701899627718146291382268063073604182131575843695486667154496711979350813988644889979275310892951143249901398447859083674739840084454465850475774696325142148671937407108540250845900941142800157345665761403930889797424808979569550325271558518404559007551625637761142662107757913763221912282957681784053564387104062317729788737215450574233690655931888608424916152893688106181220341997128198692e1024\",\n           \"1.4174672877823334709610117319768830739080734407353905145632612088824955720198734996604261250019291955883620333545750761619015467840567122066622229379056280064206319780047687015558007624774062399477328822231085767309831266032616053065858739373818651687128093335640388513396191118537181280334430292439188737524362269789272308905723812818882228503013875816702686587035844437102478263525616196832018321602e1067\",\n           \"4.4466189016791091516801723880812533528438597080549410911235655611382010503145789286158745555771483577943662768773465284793798720178177605712848440200402906836390133865748188969184005230383247111166918721449908133920663776952786683837038180436264738937354101153867171804315769471050303182129269442292354388037298125177941217926845803005587166270803697433886463469168814941555804311717400657004050157245e1110\",\n       }};\n\n   T eg = static_cast<T>(\"5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1\");\n\n   unsigned max_err = 0;\n   for (unsigned k = 0; k < data.size(); k++)\n   {\n      const T  x   = eg + k;\n      T        val = boost::multiprecision::sinh(x * x);\n      T        e   = relative_error(val, T(data[k]));\n      unsigned err = e.template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n      val = boost::multiprecision::sinh(-x * x);\n      e   = relative_error(val, T(-T(data[k])));\n      err = e.template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n   }\n\n   boost::array<const char*, 50> small_values =\n       {{\n           \"8.223167319358299807036616344469138485821440027829633696917375433348917938654659351596020080036406671343718039863220496616e-01\",\n           \"2.526123168081683079141251505420579055197542874276608074880949653019810769068593790606537020961198741487692473633089323967e-01\",\n           \"8.342981744595282037256218647969712476322487890550784823763249893556153270975172951404094950587944959561849750490537201329e-02\",\n           \"2.778135016068299789938671680845480653984976507019542653788637161116587306168290886761259072846829249121589698206609261524e-02\",\n           \"9.259391565199916442789400306996794489540862711193761818262415211084389468754315525525896238827358889826875006042447587516e-03\",\n           \"3.086424653287772358219607529932097884435043040527155440187640095572710676452654803730003577747633690318001961509535020849e-03\",\n           \"1.028806765851002064810061084014826478832745077469708149635730407866217436751337520417458090265791086156438275231514030381e-03\",\n           \"3.429355348425226988441198390119109217716503769838753365112550442738406326637684639052252898314646892490045395290022292013e-04\",\n           \"1.143118429558603374406653541544292690548937361618336125287018361332072426474632105217297150810234138626767253281422813482e-04\",\n           \"3.810394757818873406266877296641684693312194735341898368873067089928172619067423751257049691985638480762032673977695116880e-05\",\n           \"1.270131585666421832817527834137477593266387525701388601975733237436369505733715799310429349744168792375082834509467436523e-05\",\n           \"4.233771952120219947940459634636576539101577724347428305072378100562649548884420218224692461748739725090626754420296122389e-06\",\n           \"1.411257317369659013704209000288436132710449162963127340562961271337242582661013580874165903770246169179192268836124421074e-06\",\n           \"4.704191057897475365825409916786898392364235667906752767514580467152163619657508910797742266406961516358439252434955007668e-07\",\n           \"1.568063685965773714045928492719360014894368531987759414833778466374819836545157375950693756664550256136222396871173634254e-07\",\n           \"5.226878953219226673524993193392503058475862017726848548717100658392470633650387274004511940515056405069137033934323251644e-08\",\n           \"1.742292984406408185991240874995689487745140228031202510923711784729440494088066989430128101759261047316736074663327672115e-08\",\n           \"5.807643281354693692124967044009687283114597355717062156493618245876910131607338183944830908381903728560328284173507220743e-09\",\n           \"1.935881093784897887701686451485601671131342930785061493703969418728524594573922282309665275558709040519461560600768780392e-09\",\n           \"6.452936979282992955422916851920785543106383715381924626175995859924351552325880931187614903984801793287071578640505194508e-10\",\n           \"2.150978993094330985008279519046512957825521218238790792201835497215534851989750722105234826300738623838446309250309905466e-10\",\n           \"7.169929976981103283311786261663531258230547972690500493476881079295129579131280734024784107219045379345460886663104148486e-11\",\n           \"2.389976658993701094435441884684454421835327948893136184573938864819002944442339456827931472237274353903634036758669394620e-11\",\n           \"7.966588863312336981450798799860506345287566898810744342680146925029151178981033890759916168189916177504592939240995619757e-12\",\n           \"2.655529621104112327150241298135440075805848488054800577703768668100658036999584228451100239039042920681377381394421710121e-12\",\n           \"8.851765403680374423834128412864530361591097252230621965426275532533242581680245794741067906285298655116802944992368126680e-13\",\n           \"2.950588467893458141278042461784956914687338675140497707333871358819185395356569206661450997145748756956497959702280685427e-13\",\n           \"9.835294892978193804260141412430145318398649753331401112621871794012928366988233744354238387090649589382104704221708773516e-14\",\n           \"3.278431630992731268086713799445120869198593899364655036314007566906378666339665297288092596796135684816883503781385164489e-14\",\n           \"1.092810543664243756028904599641030626636532928735904320784337625844108091213506619051042206148385975354700234586478575025e-14\",\n           \"3.642701812214145853429681998738987398752764686754626492252324567456938623579239392678142797020213493844816454129960310753e-15\",\n           \"1.214233937404715284476560666243942169089106312534317920490462975351305354471020532764015606315872085933262687299655265697e-15\",\n           \"4.047446458015717614921868887478923169619805517194433471908835726595116905187672132801369948377551282604828733616045843751e-16\",\n           \"1.349148819338572538307289629159608313551890152969010184597042496758528297346351553643241208769191557898925543369605617734e-16\",\n           \"4.497162731128575127690965430532015584807024576774799020494128293451281927637267192489558050090835454302448780391749096414e-17\",\n           \"1.499054243709525042563655143510671412452985626833998379862387948592418229228808284088934491020852037924756758483008288052e-17\",\n           \"4.996847479031750141878850478368904541825005460277179305602161748681654262243578435201096986093377131577325573917436618470e-18\",\n           \"1.665615826343916713959616826122968174447164290616980189746184851537351248309665330601503343215376981550822569162631313560e-18\",\n           \"5.552052754479722379865389420409893912541965834349657578615232567585047309856390957625702896178052275806406957076143469634e-19\",\n           \"1.850684251493240793288463140136631304096139902769381795814754672989850701401641374814254071564872119933498619234778448524e-19\",\n           \"6.168947504977469310961543800455437680289164351695283493312025632359317744715643192414807145394613572397590534364339391526e-20\",\n           \"2.056315834992489770320514600151812560095228784236601072113743484455321300338926430301421880927367590178440922006775473367e-20\",\n           \"6.854386116641632567735048667172708533650333231531203539518552950777817440179277823487619201513258000884052637516041835420e-21\",\n           \"2.284795372213877522578349555724236177883428507451482660054557452824460619777642844796449091646418601791047308814504431261e-21\",\n           \"7.615984574046258408594498519080787259611422468149787192854095139994568043598766360557598146279482678180281335390895949036e-22\",\n           \"2.538661524682086136198166173026929086537140604567639372655275057673980680372673609490963070062819520295998328327889923353e-22\",\n           \"8.462205082273620453993887243423096955123801934429554813185698344472203995997708879527322555715697860578416576045982358004e-23\",\n           \"2.820735027424540151331295747807698985041267308484077168753311108116374235508697904826049959781116012127075951788533527897e-23\",\n           \"9.402450091415133837770985826025663283470891027171945709804152456669015193736201020401750153196590359525341207466344738924e-24\",\n           \"3.134150030471711279256995275341887761156963675682933328476437810109959425395050019306074135780459168092270327572635795510e-24\",\n       }};\n\n   max_err = 0;\n   T v     = 0.75;\n   for (unsigned k = 0; k < small_values.size(); ++k)\n   {\n      T        val = boost::multiprecision::sinh(v);\n      T        e   = relative_error(val, T(small_values[k]));\n      unsigned err = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         max_err = err;\n      }\n      val = boost::multiprecision::sinh(-v);\n      e   = relative_error(val, T(-T(small_values[k])));\n      err = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         max_err = err;\n      }\n      v /= 3;\n   }\n\n   std::cout << \"Max error was: \" << max_err << std::endl;\n   BOOST_TEST(max_err < 2000);\n}\n\nint main()\n{\n#ifdef TEST_BACKEND\n   test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();\n#endif\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::mpf_float_50>();\n   test<boost::multiprecision::mpf_float_100>();\n#endif\n#ifdef TEST_MPFR_50\n   test<boost::multiprecision::mpfr_float_50>();\n   test<boost::multiprecision::mpfr_float_100>();\n#endif\n#ifdef TEST_MPFI_50\n   test<boost::multiprecision::mpfi_float_50>();\n   test<boost::multiprecision::mpfi_float_100>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>();\n   test<boost::multiprecision::cpp_dec_float_100>();\n#ifndef SLOW_COMPLER\n   // Some \"peculiar\" digit counts which stress our code:\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();\n   // Check low multiprecision digit counts.\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >();\n#endif\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_sqrt.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n#define TEST_MPFR_50\n#define TEST_MPFI_50\n#define TEST_BACKEND\n#define TEST_CPP_DEC_FLOAT\n#define TEST_FLOAT128\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(TEST_MPFR_50)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_MPFI_50)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n\ntemplate <class T>\nvoid test()\n{\n   static const boost::array<const char*, 101u> data =\n       {{\n           \"0\",\n           \"1.77245385090551602729816748334114518279754945612238712821380778985291128459103218137495065673854466541622682362428257066623615286572442260252509370960278706846203769865310512284992517302895082622893209537926796280017463901535147972051670019018523401858544697449491264031392177552590621640541933250090639840761373347747515343366798978936585183640879545116516173876005906739343179133280985484624818490205465485219561325156164746751504273876105610799612710721006037204448367236529661370809432349883166842421384570960912042042778577806869476657000521830568512541339663694465418151071669388332194292935706226886522442054214994804992075648639887483850593064021821402928581123306497894520362114907896228738940324597819851313487126651250629326004465638210967502681249693059542046156076195221739152507020779275809905433290066222306761446966124818874306997883520506146444385418530797357425717918563595974995995226384924220388910396640644729397284134504300214056423343303926175613417633632001703765416347632066927654181283576249032690450848532013419243598973087119379948293873011126256165881888478597787596376136\",\n           \"2.50662827463100050241576528481104525300698674060993831662992357634229365460784197494659583837805726611600997266520387964486632361812673618095785565596614793191343548045812373113732780431301993880264715023446550489842580232941386277966868361303367582384418115607849009560004137515027529165146122584386186492069906092666409118801573969725237770253874824784863348864259750658951309573876342725192688040202857185924973630809978452538550099964101929825864558813716963467480152897452330473583474775619896089188931497718648548480469365216002979523919601823809165790411297975297712884880166754700558630196824142164233836361751921305615135984170982837036342343558097687424487526178010922324284883919536725153974582825630336511862808790203551930088145604026487771415650048376723275094136806424717481635184471307383168191953698843723340165605500555063029823385865249561125896634362311039438867484401970215424844692673432572876116452243380115662703163531763018031226825617668891776095502388960424467990521700581770868994182958846287294933254842394882655811767896697230383860684402997328870793925904767307522570843\",\n           \"3.06998012383946546543865487466779458212212931325292345360920786339428774168895114940961908166467541760759370742449261902703454294050994162164179758776674921695210543321431976582792749695268039936031183310664759907107096641183589015949857072626264281130269822115622663836956231385381805315027562932655928781117811850728886383553772535550181070778545447895443834405205758132853217474114166659516983365541988620856642054467498643554872029717170398214071471942791253118514487638811304670059307541182798357443181785843119089299569008318867284816553359946310778010700675312493633986577498099096587006610844378385188518085716548910095121883158502955712612589941408660542373794977570528185247073824741671612893506514342410201362222059007498227945177352958046758148141756202994673600560820713848287574799339070054752116909136251765469324207685490757710781971553227808407026035595494277776874273936176792674139758867775825077183338566625556426910971465911191049352588901212917090887839548860059100937478465817844825147395110789153650851340493729565322385491250242078198566481445683133486898404370694024388072677\",\n           \"3.54490770181103205459633496668229036559509891224477425642761557970582256918206436274990131347708933083245364724856514133247230573144884520505018741920557413692407539730621024569985034605790165245786419075853592560034927803070295944103340038037046803717089394898982528062784355105181243281083866500181279681522746695495030686733597957873170367281759090233032347752011813478686358266561970969249636980410930970439122650312329493503008547752211221599225421442012074408896734473059322741618864699766333684842769141921824084085557155613738953314001043661137025082679327388930836302143338776664388585871412453773044884108429989609984151297279774967701186128043642805857162246612995789040724229815792457477880649195639702626974253302501258652008931276421935005362499386119084092312152390443478305014041558551619810866580132444613522893932249637748613995767041012292888770837061594714851435837127191949991990452769848440777820793281289458794568269008600428112846686607852351226835267264003407530832695264133855308362567152498065380901697064026838487197946174238759896587746022252512331763776957195575192752273\",\n           \"3.96332729760601101334502876512018303152235975639619479270725806219673871802657165722877418785963403123274056479329535362288655768235647487599476465537517349983459959396942125116402730874711739662452418728544662333652033991382097872017643021546533893998444782653493302314148486254376557154660429700133894837513481248619445021033294987995072089685196890751303705448870314051631971912137432499217943513505107459328579034234471969034380444279483175756904340168935694146646969758408612915912693951504143726276325727089094957428376128777490747011483653095038326498799910297470352498638922548951534285262912166233490129232297588127154122989932582549543207430381783967345221251717788180706706197608063733887726205509696294918128904282730298886608490931339746624769514837195042182809390984886538469878790432756760740967852006981627342718373868089930899834470763073879097175124340898791818850834951894187606842759251386865815997713188572196024482151907891258713869124247005410786490332294268446455782911914942752568277824622418634516620092362780994044583559067632108995042187023154200764184950878131638370936876\",\n           \"4.34160752734960595617808776374477460723265336870727556185727396662220923171777437150069768940869308257867815441035461967651472282081172615279256504443662226606580627885152042042903335792297058916252842051925089290836831715454034263505813680769125291515266958692652530407528011558306762163905143207811598688431871170088962518292286615299738096190444738533203161905492043851016820053962091086343470680514156330656554108208679889001485483033545415301817702473378043508312559202170115728182897990337699623761986171416615021158179762123766012269021534563660979972864906653441725316241881374716900480598276640840394699718984639649897058274667150152948516142801074260038108590401332448730361188129358652703927446859710621067457990618378017703891730724396666299819790072397688972686459430503026856861736069218065420528347106866972580915029753621255304587561985717307629932540410639210302482882847873727015801634901755832519840544096758977294231047035556754992897011888753217953080197537610448726652746992121685068257440261763964980703424121083058605934982281210054435774069392790646709404966217005552197344493\",\n           \"4.68947209983475140722248849561783002846415813208241069816339837584532567997445983205028355189765592648498726557587869684603896433394456735512692292415879610033794342501630732934996209978740746985164578019897211786300244708711916089199260058311084265831293902281791295846169702839730909351250374703986364508165540235333505281067384239291594323539816814423865582516577000094943855922812941268841597446572000848645702560088494072507948045804364964153467630734509663721026050762887316466331441449595084971862668493255933265611225629677595775797966272446890047531313544059153687362017301654537115283160575298256857111770084802622759507512748413868494678293024737576577634559012937002405564693237564782661478500575417457048864770102766387138956802222948987452086048547098754786648793023622941962569186040944009281487954082049335826413270469685003200962898734900372045181956983558503256265211391593721293841419380653006415407706145131700572194167555007645631927616801157793244790467083152103173240943823769137606544644820547634530641496507929783339735192083140914072272339899107017006649210880028740845785609\",\n           \"5.01325654926200100483153056962209050601397348121987663325984715268458730921568394989319167675611453223201994533040775928973264723625347236191571131193229586382687096091624746227465560862603987760529430046893100979685160465882772555933736722606735164768836231215698019120008275030055058330292245168772372984139812185332818237603147939450475540507749649569726697728519501317902619147752685450385376080405714371849947261619956905077100199928203859651729117627433926934960305794904660947166949551239792178377862995437297096960938730432005959047839203647618331580822595950595425769760333509401117260393648284328467672723503842611230271968341965674072684687116195374848975052356021844648569767839073450307949165651260673023725617580407103860176291208052975542831300096753446550188273612849434963270368942614766336383907397687446680331211001110126059646771730499122251793268724622078877734968803940430849689385346865145752232904486760231325406327063526036062453651235337783552191004777920848935981043401163541737988365917692574589866509684789765311623535793394460767721368805994657741587851809534615045141685\",\n           \"5.31736155271654808189450245002343554839264836836716138464142336955873385377309654412485197021563399624868047087284771199870845859717326780757528112880836120538611309595931536854977551908685247868679628613780388840052391704605443916155010057055570205575634092348473792094176532657771864921625799750271919522284120043242546030100396936809755550922638635349548521628017720218029537399842956453874455470616396455658683975468494240254512821628316832398838132163018111613345101709588984112428297049649500527264153712882736126128335733420608429971001565491705537624018991083396254453215008164996582878807118680659567326162644984414976226945919662451551779192065464208785743369919493683561086344723688686216820973793459553940461379953751887978013396914632902508043749079178626138468228585665217457521062337827429716299870198666920284340898374456622920993650561518439333156255592392072277153755690787924987985679154772661166731189921934188191852403512900642169270029911778526840252900896005111296249042896200782962543850728747098071352545596040257730796919261358139844881619033378768497645665435793362789128409\",\n           \"5.60499121639792869931128243386880089385432377521078326495835339365228337765188797433638433752458537394171467057445629904555420755398315175666449466777454516186127276489666213119783783503829250827797595051437870440938931280680358959301715436419833364761665112542860561623096658225538557287000997305661352632293104827706037023135997795899396723258283708659284220534304000728311717413345472853792896822724499122866947121737000944102509490771269197783584170349935127887498647119562411695900883847124507613781432804229894058444676290534036738474342530360927632101836180145945813951643250885687876144098262191352431818136969137533863587873139725102593606754797723773610593636883665209271759639631465381618953021812982067002849796433240989364353192362974216155114226322430340671719312492223369487631048057665757861195096925695551107847621963544401115555199917577802008717751423237289036673475431186363543556380872803928482717387196307480474684969943012499128760245113496312609854517190311704797289830560651678579059756085781560282375298034806741180400732788584921019507521738918616603376508365622727087150932\",\n           \"5.87856438167412823505442087789707097199843492103867437517314210715732455817816855246687780176492612349299503748836474526021467611461493586217913925495851405816296682706960791383913340375739628111898270614813266755200083564799407766788027485532332352024027224698199060815938197172865670956402289304658624389748945536687871488565787601288863899811544146566179125054361345491299666333144296548463580152591320203647485383402648565396566035890953872530543987300700877916661520962595410666627445873003711787722452859856569260494472375128936533790154715039734447084354515787738062350432618897439009684320850395595213875985248081961123885179420668160222435104348738172793787396737481265016580386986993101160673821650068377182350730255005754757604683510524357896861879706617761317908260663342673848298530050583191985919675390877532981022238129601627016291632330926779809631293070560375804444455958596407594955858475081851191996245268822870776361657887467004531332263395611291120089229481068789229695018187723686024313640325575962035428327239557079268995825494033666401736558372076816062703768818475224366442780\",\n           \"6.13996024767893093087730974933558916424425862650584690721841572678857548337790229881923816332935083521518741484898523805406908588101988324328359517553349843390421086642863953165585499390536079872062366621329519814214193282367178031899714145252528562260539644231245327673912462770763610630055125865311857562235623701457772767107545071100362141557090895790887668810411516265706434948228333319033966731083977241713284108934997287109744059434340796428142943885582506237028975277622609340118615082365596714886363571686238178599138016637734569633106719892621556021401350624987267973154996198193174013221688756770377036171433097820190243766317005911425225179882817321084747589955141056370494147649483343225787013028684820402724444118014996455890354705916093516296283512405989347201121641427696575149598678140109504233818272503530938648415370981515421563943106455616814052071190988555553748547872353585348279517735551650154366677133251112853821942931822382098705177802425834181775679097720118201874956931635689650294790221578307301702680987459130644770982500484156397132962891366266973796808741388048776145354\",\n           \"6.39067324283344282612593456066836977441869915362953508565729525367923342752058036792717988019560288813706968456779323116609349360225813396901702110619796078057334552019514797946669652098699860634363540091309264934180808145340898043417996593792792270890934539784162252743214627553825160296688912049057995757459733133778428381528832147374042143201083422723391419017423476330077549613969668943960552183346770788992856348755201584958184758568943497685412776464637452851023132948222137176500877587016169499594616364239121570837276604948806785595382545249190023683014214186698190428219840682236280784558646634466507658233281348215201532077497422563499058676631131322841280086826370841460898715011137512038685864392079526912553523177019272440755510704279946872616455555313590656257840391404433847924673482299505689689769822347893968864046186358674105429643912021090605610906309627700793415194628412350783590691473324467581637253579290246840759262280795786394666829277098636383739586574194509405681992353099095656288666217128758044223382834658781601679058686559406948665993762673723079305381020139309264407402\",\n           \"6.63191504395654222093463225517095044257167358492883535520176025342395774211712657468200830942121109644363941340107615485128085049415855416468332623498613542536495098385995084442339062608583978638604918143347913056760626947758803721255941289939544782980624105947726287394246015934530636662452762740891034120692720860989191872617116876270993379145692068344563800080161568845297279023268580882621139265056001709415926357601143767499984660052292050156852098465716279953503805000122483365981348049448669145674005237424902758331184292667285733831838736385479377968893647208473593030642721808734551034183742049017463013327984017500270415348903044357529006803230836576763451403141885042163557880315832238470993889819388689962997828261446921618788229788339158160824684571810429272556119989956914418082964164895325888955223056217505031535326694543563995771654860377141087298652099371042888622930700365091746883791244230649741108473410207660026523417093735663777713562847430184433298925557785602803469943746593977417910571201562354064143775475359422531818578919533441219169564634992179085747739421396934533170253\",\n           \"6.86468424647826745014070025117717964024823451584566770298700199608686799810550334183271384036184024738713075357138304363500729701192009148330990514337822154917664169841019331985106373480242557119822580196465316734207821863081970176402541887949909079651180860550135778414330866329785285584237686124445664832783599634024854488870218943262246632754953077685614238917113547631797236909830439953169012672877303232625810370072296875077876422022480554261365112845624378648826827015798512264531843127157809664230543124721508342792582642801227649598361094857362199437229919720183995231808663615464777549808840564458629976163064258768399634097749419103019327558046204392219063653339901570969874642832022669018679996962548734797438261313737916279431144129292768130662584134756962916924264725125780137451698441993315631510366262043104603857813311015159104411207656587159892683007990478175317339407414253752547566811439103970532316615414849940518882874013736359501398823560697095317586441184708051608329999378177452455843424936412317738990534790002839870054268627101977849744783551897006721190846394315014179836658\",\n           \"7.08981540362206410919266993336458073119019782448954851285523115941164513836412872549980262695417866166490729449713028266494461146289769041010037483841114827384815079461242049139970069211580330491572838151707185120069855606140591888206680076074093607434178789797965056125568710210362486562167733000362559363045493390990061373467195915746340734563518180466064695504023626957372716533123941938499273960821861940878245300624658987006017095504422443198450842884024148817793468946118645483237729399532667369685538283843648168171114311227477906628002087322274050165358654777861672604286677553328777171742824907546089768216859979219968302594559549935402372256087285611714324493225991578081448459631584914955761298391279405253948506605002517304017862552843870010724998772238168184624304780886956610028083117103239621733160264889227045787864499275497227991534082024585777541674123189429702871674254383899983980905539696881555641586562578917589136538017200856225693373215704702453670534528006815061665390528267710616725134304996130761803394128053676974395892348477519793175492044505024663527553914391150385504545\",\n           \"7.30801444381621929576410414169825272457257572273051004511973439898925887398217614148081823016200949202834301901341123741998769012029715026961550074765354322325117408706019312795809700115432061001422232366558866090103569420172751971374783210350559722862260759626145820691043338967446065368729759698186882375361190232710825561214648603121419802078232806394885971508914082308000592725279784010670779537521209568997392415395010518735400320816396054990550737425086661554419518324971399666539322809263579915158239535250650034449433728950585403021312904469201906868572755498527768200566105436948987083446413896510763908286033307148367944294928994814851182637242369700047960905551015550891703778083820346244133873451184266447103836670847395501001367479270898875772403881434563877248062713559640372882766006167571899610660259996723172304669594755157014583499099899215181509673430723657636479581940652958938443019241663200400679385786760329883423015546482354218805580324551932049528493376425537320109696781135375077474891741199783559527857010245972108769520093587637938249980386334004821761518122012885593787752\",\n           \"7.51988482389300150724729585443313575902096022182981494988977072902688096382352592483978751513417179834802991799561163893459897085438020854287356696789844379574030644137437119341198341293905981640794145070339651469527740698824158833900605083910102747153254346823547028680012412545082587495438367753158559476209718277999227356404721909175713310761624474354590046592779251976853928721629028175578064120608571557774920892429935357615650299892305789477593676441150890402440458692356991420750424326859688267566794493155945645441408095648008938571758805471427497371233893925893138654640500264101675890590472426492701509085255763916845407952512948511109027030674293062273462578534032766972854651758610175461923748476891009535588426370610655790264436812079463314246950145130169825282410419274152444905553413922149504575861096531170020496816501665189089470157595748683377689903086933118316602453205910646274534078020297718628349356730140346988109490595289054093680476853006675328286507166881273403971565101745312606982548876538861884799764527184647967435303690091691151582053208991986612381777714301922567712528\",\n           \"7.72594721818665232400474478573212164113820580488963719814529844615257171391366083837598391841280737832475169393182272541886671862529201489762301217381727573506969107619318907033743713523584964748522235434860386240308259592226625308659565532071953554996921178294803994916620561170523298903408385287659414301910401193614716492481152548641726819012461794117027835912991336708840836650710281453954679059886797070453447940199379600879845764678851272615250256962113900000364647452410778972648375707943133926939195015381201426487954498462993056064744870715359730063675217952027028557542103700913113678148959057734510658771520791956879881016752781141774540974358264943959912543543231872348745595316009779251124673800869204892703157616225827295653493619371958957677652500482852408284671621135986394278188285088465620289846607059129785050607459357597788813170941394726408533348925805369815717709891710786025165701419078226562572328981485933748567540138562641027503508306197019193198804817270177795577482266694943462207325431350513542160949582976461379550638607760760045294712529920901600994240565773585313185966\",\n           \"7.92665459521202202669005753024036606304471951279238958541451612439347743605314331445754837571926806246548112958659070724577311536471294975198952931075034699966919918793884250232805461749423479324904837457089324667304067982764195744035286043093067787996889565306986604628296972508753114309320859400267789675026962497238890042066589975990144179370393781502607410897740628103263943824274864998435887027010214918657158068468943938068760888558966351513808680337871388293293939516817225831825387903008287452552651454178189914856752257554981494022967306190076652997599820594940704997277845097903068570525824332466980258464595176254308245979865165099086414860763567934690442503435576361413412395216127467775452411019392589836257808565460597773216981862679493249539029674390084365618781969773076939757580865513521481935704013963254685436747736179861799668941526147758194350248681797583637701669903788375213685518502773731631995426377144392048964303815782517427738248494010821572980664588536892911565823829885505136555649244837269033240184725561988089167118135264217990084374046308401528369901756263276741873753\",\n           \"8.12240393759049993775056085790344905374064693901884539671441829845338578772903259406144188243219398035169276840513008383162269420554517811059936012081975520344394583550625149140104890709858952675303897227339074601057818074118589698571155136079180679720382723235231538458633009534010518571057778133890494075838487054606092393806209145857916456072372240571169803355429160587649756506023316970860684505132706954885924145348134169632738593180936266392964765757145617588713808060798434336980045883860242149289652316891255507207532033909817967022156020135008789172223827513417867030366597530330645580768779589871599830015247516272684746457878444123615590973536303130500232072733480785298450742941376024222195955073652956648240243919431159576650278660779563988680861574614265500071902828098808112054130736935301171188377689518808421589113550324566036499684989624896195759485888011688106014339156094756792157734665908674538715149602342862415095116193802949560661722409343540501008020488626114518430540516030303410754550714099923563850234789351977675338732716128448507828986158960243138593921163553099984790877\",\n           \"8.31354547584695967940566378712267275288624539467359186240950261388420109063530469298372814586792322543394723656678356561805557643176058539909258806409526952143256265316829288574367192300134911326662579540672482872991356622029261017993364337446668505438648868283461277399259103747660496390168344220787056266691284920945026070198958124599742654165567628853365640939746555309453490999458540074120276825684247685153740702582674467303878126564742370625497947819552642763989933468008133993752611603522750223144711829552595043853200184607806501342069297514482919782863001913353586468996478801683403541333200250999752731449803793607515150980663437341133381305911283161078249341037269510562017916894714417589792091216017912110414165892331827272726552875986295229205099562827308056238370455191631964062828836731217300323551683849308479366652512262425881556198411502851577353998426212961146886854599036602811970862235743112454698389727605325232872049778977783694191972600155385422071256805381015864689257913905946358386236370406339271062529911829230871245337410607604318231151206871615890518289557823950960924210\",\n           \"8.50039005178969681405606694066857144339871874464321576831825225912653747873113563539576206921739603496466768191005963101509608216565231580166435976841183722328004091691395570837807106693569643325702021135074219386315687196397182977310724857959339705673410615655661738050498092907663921364482163693412990352699674010982361328463115845819153103736613515518538534444209396391044515527047534370066166976494484027905402462724778219101349242704419346472667550031765101749789603575074461809215731212887738126264415774177469700439565715044625979289026800701352092929127409916129794527211068956300531815748065200493298365734410099333662178356881545890691882401846675346795963611125059579096807842008824231421616080054119488676338739204001665175181321425845571967990452486774866455322197409200481385043451140315730188098217149173808292210439135828385844496694628703028478095465983540068867270220327383626367373083798876294946716176284955504565982296829544751335108774407823029718852800476212574258039209896227934401044333736396538381519446030490401670705477490565602459130058989097840050168516571928831986962913\",\n           \"8.68321505469921191235617552748954921446530673741455112371454793324441846343554874300139537881738616515735630882070923935302944564162345230558513008887324453213161255770304084085806671584594117832505684103850178581673663430908068527011627361538250583030533917385305060815056023116613524327810286415623197376863742340177925036584573230599476192380889477066406323810984087702033640107924182172686941361028312661313108216417359778002970966067090830603635404946756087016625118404340231456365795980675399247523972342833230042316359524247532024538043069127321959945729813306883450632483762749433800961196553281680789399437969279299794116549334300305897032285602148520076217180802664897460722376258717305407854893719421242134915981236756035407783461448793332599639580144795377945372918861006053713723472138436130841056694213733945161830059507242510609175123971434615259865080821278420604965765695747454031603269803511665039681088193517954588462094071113509985794023777506435906160395075220897453305493984243370136514880523527929961406848242166117211869964562420108871548138785581293418809932434011104394688986\",\n           \"8.86226925452758013649083741670572591398774728061193564106903894926455642295516090687475328369272332708113411812141285333118076432862211301262546854801393534231018849326552561424962586514475413114466047689633981400087319507675739860258350095092617009292723487247456320156960887762953108202709666250453199203806866738737576716833994894682925918204397725582580869380029533696715895666404927423124092451027327426097806625780823733757521369380528053998063553605030186022241836182648306854047161749415834212106922854804560210213892889034347383285002609152842562706698318472327090755358346941660971464678531134432612210271074974024960378243199437419252965320109107014642905616532489472601810574539481143694701622989099256567435633256253146630022328191054837513406248465297710230780380976108695762535103896379049527166450331111533807234830624094371534989417602530732221927092653986787128589592817979874979976131924621101944551983203223646986420672521501070282116716519630878067088168160008518827081738160334638270906417881245163452254242660067096217994865435596899741469365055631280829409442392988937981880682\",\n           \"9.03777677270990269726949426172862835196387072970673604230446563698972563128792797577778210699007499500445574250898762044933778750351774122552995617564832932129894429850247153326323323596747185514513829114667599621242841895828094634599104752390660626316359597361160805506977060785864672892966797271805786612860244448725471833865343085096665002696889160030343332226214610521511200144375391579536397373156980251473081426535067176615086187889982851260244145348339114794114481076655003899438879933457078775812975837503314934547103980296764470525861438620896571785240248887907778823513254337650341006992728965834432443948838718849505116031704247005966435163013464172640987633315418180257980416126510536269126886862377598402609093638096342316879109441931256004415158100347181648434500606990925357893191947800032622820087068319734681796146574385134374500536260087114364120328174363307505811192446227573869975931538764994397186624871438876822552201130556306754697296734741569342977980309931897617697257730057945805570021974106384510091603635687409774141632668637120038927426728226929784072977105651339473101367\",\n           \"9.20994037151839639631596462400338374636638793975877036082762359018286322506685344822885724499402625282278112227347785708110362882152982486492539276330024765085631629964295929748378249085804119808093549931994279721321289923550767047849571217878792843390809466346867991510868694156145415945082688797967786343353435552186659150661317606650543212335636343686331503215617274398559652422342499978550950096625965862569926163402495930664616089151511194642214415828373759355543462916433914010177922623548395072329545357529357267898707024956601854449660079838932334032102025937480901959732494297289761019832533135155565554257149646730285365649475508867137837769824225981627121384932711584555741221474225014838680519543027230604086666177022494683835532058874140274444425268608984020801682462141544862724398017210164256350727408755296407972623056472273132345914659683425221078106786482833330622821808530378022419276603327475231550015699876669280732914397733573148057766703638751272663518646580177302812435397453534475442185332367460952554021481188695967156473750726234595699444337049400460695213112082073164218031\",\n           \"9.37894419966950281444497699123566005692831626416482139632679675169065135994891966410056710379531185296997453115175739369207792866788913471025384584831759220067588685003261465869992419957481493970329156039794423572600489417423832178398520116622168531662587804563582591692339405679461818702500749407972729016331080470667010562134768478583188647079633628847731165033154000189887711845625882537683194893144001697291405120176988145015896091608729928306935261469019327442052101525774632932662882899190169943725336986511866531222451259355191551595932544893780095062627088118307374724034603309074230566321150596513714223540169605245519015025496827736989356586049475153155269118025874004811129386475129565322957001150834914097729540205532774277913604445897974904172097094197509573297586047245883925138372081888018562975908164098671652826540939370006401925797469800744090363913967117006512530422783187442587682838761306012830815412290263401144388335110015291263855233602315586489580934166304206346481887647538275213089289641095269061282993015859566679470384166281828144544679798214034013298421760057481691571217\",\n           \"9.54495610016641218053318050888027529952710202531153199575774210745792169686775867122286336893013980770883110393522762476818358876088129524710547725582400752350379006684967820956995284778747313445279111803934019554639715103722176378053227974233654201464826899178346960385701319012743023002834221825212678330062853593931422954382790959273783367681208829081125750296573583945273785727616528225035230730367043489573228646448365807546311686441424497747445818035366984113867781703025697773957490231025374107987159920796065423503962296590063470579872505263841733246548152591941651333013912614638133883335123920373070975004252305213546254181990284206802141740422901313199964786740911915995115427439794642825914605300283815175742959582878011011823566253034650282755730842497543625168601556462908567644285914941630229285900004349592874758990965409149767611455899099763319215107166406191621967564685710927764812630422088568711352107239482256315420275932243379732104022438119314824626037473517483829358567542790510299355289069031782291584296420055747908391149240325877115257851162524812619999740512151814664737655\",\n           \"9.70812956277849627020013008432023090142391629970752953381907255677408677683608283777972133699852226057384221251532058096143107203837634058545789370004650021408813594346758795590127624936380909477521162346782666694927945494282229717053636144889370566148233104188061190841182087686652430168640066046228725465172358875908141846376474355637636250095973439621439980693326786799959495956257525100473767694685408934461084692899974993028686930219291782447513786152395692604500383372485738542065647909407318214440351068221656470065118040045018410800167501279347597149519022186563837419966281229875188530501814945342053480368694378460223735611289594593646472862387163956627509412278526670700766402504793826839677765281076427340901353768173748184477638624215647772178191872811543334258915265427131978394362810703976093768885428630849932102391562462424663355002600929871388002261215265969294828417306845017134019844876207436524153517810279329274165301203983428519852972984397790790147707779427760025639355001932966608597649497333189984495365421369654196836993842047830874262598283161232047618963368717192374581237\",\n           \"9.86860538583256911820721127887475338860580572014113804764764567126280797502596779665406841324694419448453464475175038076268453561722477590781196193451866802150809759490712608888093911291954287843130175265867101964469755453143964084226755674039351003953563412948117884754289084798586264882426396661496381950383124624978217697985543751868445611832757526512148116901823991753587937386414616186527759915861182575983960867544511432164162055576224548617161606250500799648602173880407153261952724142638011741327947253437647196929757560958075420545787575757761080599830662321444781770561880447820833072140574469797429581558718245198502380676502327269925525873736136551448095090807729668471638614047172598418830416390391932045518785962567615347617805861430300764479148941742520703366317243140861995853488523921623877514753981220597859917397820846973107706661150411207144792858833362409021546109104485305007696344300462841655088641041139133938632803072811438751371559900802700904742289494188612587210415338399019832109459618353269954649298194490921810882187710461971651611477483705188781040460993037832290727754\",\n           \"10.0265130985240020096630611392441810120279469624397532665196943053691746184313678997863833535122290644640398906608155185794652944725069447238314226238645917276537419218324949245493112172520797552105886009378620195937032093176554511186747344521347032953767246243139603824001655006011011666058449033754474596827962437066563647520629587890095108101549929913945339545703900263580523829550537090077075216081142874369989452323991381015420039985640771930345823525486785386992061158980932189433389910247958435675572599087459419392187746086401191809567840729523666316164519190119085153952066701880223452078729656865693534544700768522246054393668393134814536937423239074969795010471204368929713953567814690061589833130252134604745123516081420772035258241610595108566260019350689310037654722569886992654073788522953267276781479537489336066242200222025211929354346099824450358653744924415775546993760788086169937877069373029150446580897352046265081265412705207212490730247067556710438200955584169787196208680232708347597673183538514917973301936957953062324707158678892153544273761198931548317570361906923009028337\",\n           \"10.1819721846243116158211195253926465666143347779815073047979911288728454119358550456874471060202706503091805338588626998024526166707650425773136658258074400903070578475129191134262714581830920726995815514653824789384673555040322558822640155690142138250981661144460598431698331929864441089428405069965236237150722105664811612049206741649626761309984600129580251270318577455853101292940548425839036066861121228690420716119923444705834233799961792271274742610225908970795751081615038981535248648458311885095799828145600663740483135495656806225462943772037314913924014868167062651948437081797920497967655996219852832742745294377907352391106793565373082008386931837077219804533025205245429016269305924868300059131465990367513110617768155977075582917392828200481639719171646996937843435515414397834073681939587838302796801187221313907962667869992989319909211964361393188990384040622902615977028693735275429763987359474700539603288721055646644016768647749162193038655134281042688011723482785471924105498640148127126652745316007086053077591814555887669601195725983108276147651242913586147914229810924624624361\",\n           \"10.3350931404633683691947436472707444709708693615480182604123950370334349544443021679231379500921649218800863593926760528756661011078126321844492668291462478393476503125536591219070509735210428947761875792828673301887541398513337078226608138436426593790404989932058023039769630384800611394806279966525193241106630459881453504032664228967399745528185257298594581458987077801324925958107100694837096169968690367946833033746754352596262639045628825434791015203759110279895685375377254959267384242428992179590079538654788434703331515082118259553412887391533698850248031662366010669929529784194795489078820235616519309873494295540734349932360576182477685064907138632368679604675882383935711506161826635113153997912713265877050477273997328780264216580134895532814312026671290109568535316587756940503116601114428904476514966934012890148992229020985082631236739332830184773141236150086303025054599442020885304151228567409725486746114685532611428843970696553723054870710919524255238928541738356450696516302034137957025179252274911492305284875580251537498242752152958407117066303014561567387290966125697410459079\",\n           \"10.4859783938191844505415935988555812169983910386669556187311537807971601489415184480294324534243750962935064587431065554132339655732601450466677346771766404683525586939467074949776376839516117900277707447519492965025773007813570350841194233890993183787851607015508682597768217867560501711087754801339252398186169563368609851974003387177803015256072875765438214167126280799321733391301521412815249368328101551446918784488181577223454487520647934057527710710187315407383842241034812304414618212426764289725514443697625658320934830119552552349454613146318727307440539214183275364282577270889732517818803743197835075972826771689559984211698450313448053374104683526842305753510193148049529361498811259623906343956382898276922773672099874559380274456904526382655867821184634279087424431765532414870700646132525635436192820560367779661664927428988733468931949806424994253052465407314901679252685856376776344476864227019344231976962348967817311235507614203388405955265951309377513783090550287722753128747261754207014515315881341170594023794216162541770211605362973081229737656368414853828067103315720270750873\",\n           \"10.6347231054330961637890049000468710967852967367343227692828467391174677075461930882497039404312679924973609417456954239974169171943465356151505622576167224107722261919186307370995510381737049573735925722756077768010478340921088783231002011411114041115126818469694758418835306531554372984325159950054383904456824008648509206020079387361951110184527727069909704325603544043605907479968591290774891094123279291131736795093698848050902564325663366479767626432603622322669020341917796822485659409929900105452830742576547225225667146684121685994200313098341107524803798216679250890643001632999316575761423736131913465232528996882995245389183932490310355838413092841757148673983898736712217268944737737243364194758691910788092275990750377595602679382926580501608749815835725227693645717133043491504212467565485943259974039733384056868179674891324584198730112303687866631251118478414455430751138157584997597135830954532233346237984386837638370480702580128433854005982355705368050580179201022259249808579240156592508770145749419614270509119208051546159383852271627968976323806675753699529133087158672557825682\",\n           \"10.7814158709708600973470860025697540134833131069132002021875135200480437122785122611113481677522707878078270440052147356092727695527920302171183192478655274869472668345393510398722323555179529207792958553208776624344340893028683838808544904189559530608618288330229561660785494464076778823090275262667649435818366046674470097351430635081878043122218079020162033184280808128488592626175069016310564044843363282384351603178223984429085151346774445891706273636784622362866483557972819012892787057761108736681050757369877123799164633273904139629258646240624506200184033024483531204256854941841214015611888414080581230610166978791113905519323893487804024647095097676311979368148451812686908830353037070405782315727089541764339584093637958422138796375184575441595432133925090181949043536072178753049486872204759334059020258970699357154378751215836144836352430031659044940188023466979385706234766354871873384990411026120082971281373943799958524209806200235642459562870710282507653952117525804197309040193746636407624935115304309270078857483676519373602411048897743124249850703751765985347181558029527375643215\",\n           \"10.9261393381382494183949485187745355142392643001293200037804399336898503279246222062168613731063277954463829865410973870577192080366472062964040509440033278743615823412810808078908898807870613199997974098405643999383690286991545964650196935814017029950722564391559018285106664794338502744786047104831103687602494259961816398342935032870065474763913436754495569767978627808003615457573685732588153239217166014299098858554629191013913370517654023841228586351241202877223367260494855558385058038046339898004510183855157527283289679410125378588229499416948431610345648489884658061910043475079418189307489137285545541133794341838958556245644032832230955632382851912531436083565766604594268028883405369333102861811110938475059430428576302304134018133552423994855168237965050769662481212059909922125002130317511819126236377187306085364203705624983640591322488295607424619160166746461204981597459574970519980426620414393119798825541827904061106147335114790118012457207318406183818422346913078125642646008877987007918624713747892824771389677121777686596898164466209882065864762628266271132718624356253452793196\",\n           \"11.0689707511584805117811434659236005479075122572654030261378132541766399464801053452268915436339505264869099960261186473580786841783940799119071862844203935756997737196827013181251824477181865522696656125604284386736805412679099995442756521262882968085901005737598504818120062960533623452879232321601862728439436565082413065419068437974996041360159534876356676912365960559399896203071153029799663110896121451617844812242705440244059051070332217484066565235938948140400311999208370258263622580614733135218175221722605324220534894428960790855444760163600390939087544087363052520657480331091788922029648714976820617337239621908921583216442263332160508780261589523500129489988435510612958327244523134689294673236630152564918827636287844901928132768223334355784295928691382783374669003085509906226346278070859886444582772115212199422165986886962139084337282264595688658520928296714120909731973712859435413818042451694188522026870751629872095477433593107333415373943667221266057108367464732484461448541683512088757459353259534085109191456436195932802460979824143610395941363551604400219577421540555259221554\",\n           \"11.2099824327958573986225648677376017877086475504215665299167067873045667553037759486727686750491707478834293411489125980911084151079663035133289893355490903237225455297933242623956756700765850165559519010287574088187786256136071791860343087283966672952333022508572112324619331645107711457400199461132270526458620965541207404627199559179879344651656741731856844106860800145662343482669094570758579364544899824573389424347400188820501898154253839556716834069987025577499729423912482339180176769424901522756286560845978811688935258106807347694868506072185526420367236029189162790328650177137575228819652438270486363627393827506772717574627945020518721350959544754722118727376733041854351927926293076323790604362596413400569959286648197872870638472594843231022845264486068134343862498444673897526209611533151572239019385139110221569524392708880223111039983515560401743550284647457807334695086237272708711276174560785696543477439261496094936993988602499825752049022699262521970903438062340959457966112130335715811951217156312056475059606961348236080146557716984203901504347783723320675301673124545417430186\",\n           \"11.3492422124642983926102856582985015285395067466832927043380356548562390804853608284602050743042816031793047600978062552284631473271698301080420930678002935270860213755533376410950434831683129266708417862791056849585318715091316511224772804579306952692391203428022706911552905897215022011255923056920968598357445951686767158007175858503283841137547847702169068881757041416256682026875119665861386894957609106355261396135163282225259885976498039746087649186814655905823222925759171803884806349350968882196634773164961078791229532476208824156202390581863307496926197095334795614010135645721792945689410813947143894261828309379674182914788493173415091362063280686801906811659162851572848118095721313328315435166989609801810101070813864563570801067282282192253552931615123833493584040857696592187534301264584146553957310718712255292573453576205261351861700915480639583301267167270018138941290820062263217901164511455735107338870881079416882936221444752202024321144178837275657426737380444900404799010786716522164241960362132578101367581203971478969200704781556667157536062389987737624943537002727294733986\",\n           \"11.4868138076131153078093551672152110823792896720438206208589815428358866831391271502916151740432833498923733353034882653574261402114885623063517466286983135609311347428616058487641764580040391132399123735354188924995726084316672645564644522404101010145113496826905661533851564869311026284567807835770793084267376582965078917724760751368098985709220493218989081195410084107253702771346532326060479533778255009456352092653858186317227040032545274297836762746748179412232929420302325855877594918256439049163258491252026402004889017462470314144712637559338394573924897045814379676299403438700340396558709369818377199922811836650582080165464955651223303653264959752987238908036388800978603698543078745746928727371682109974731915482666302457811317513367974821492659153756397368790555646602353958513206947086398520237613898204615597814371058763275824648368925762130837683909032578524176198944131412130278847693768941107158139354113448426375117837953121182384305427053092552066260458822741364621133976801759853058864467919702658753108948232787444346415009083332605651415456404729714544798893173653905698148137\",\n           \"11.6227571644752653007277348109508691363662508507756756751036701167061120453681652358829612013449512186720692331837632298664953191556594884903747923711091159798037951823211201052540116242903833376452779227088949634320335447650281101165924512030256613650508677820241405437704762762206782047959767675141661427645411489541320052642562158115270383536284327256491550000081996990946292465147038958140512483013436893674439652156220554266153922101105181022227884639488325310071375913459006514297537440977563220662148148970327960819157453757205132071390336936162228686072898193957868554143074268366176486204705456695741921244062641977969446800006474326691825663289023526630549872030867738441378997270522928994756399267446297804673669222384728768703789276705361232508520458717382592703150193394825544156320863346704391789739396085519417964187584947528508961792799045137827190950383493042007176116232841260864577432961637844272929218361324891683925506702245396833672138534821860627603036634022415963773401638269124800251684954328516467828750283529560003793822429188759689400075614871516086231035596052689743737025\",\n           \"11.7571287633482564701088417557941419439968698420773487503462842143146491163563371049337556035298522469859900749767294905204293522292298717243582785099170281163259336541392158276782668075147925622379654122962653351040016712959881553357605497106466470404805444939639812163187639434573134191280457860931724877949789107337574297713157520257772779962308829313235825010872269098259933266628859309692716030518264040729497076680529713079313207178190774506108797460140175583332304192519082133325489174600742357544490571971313852098894475025787306758030943007946889416870903157547612470086523779487801936864170079119042775197049616392224777035884133632044487020869747634558757479347496253003316077397398620232134764330013675436470146051001150951520936702104871579372375941323552263581652132668534769659706010116638397183935078175506596204447625920325403258326466185355961926258614112075160888891191719281518991171695016370238399249053764574155272331577493400906266452679122258224017845896213757845939003637544737204862728065115192407085665447911415853799165098806733280347311674415363212540753763695044873288556\",\n           \"11.8899818928180330400350862953605490945670792691885843781217741865902161540797149716863225635789020936982216943798860608686596730470694246279842939661255204995037987819082637534920819262413521898735725618563398700095610197414629361605292906463960168199533434796047990694244545876312967146398128910040168451254044374585833506309988496398521626905559067225391111634661094215489591573641229749765383054051532237798573710270341590710314133283844952727071302050680708243994090927522583874773808185451243117882897718126728487228512838633247224103445095928511497949639973089241105749591676764685460285578873649870047038769689276438146236896979774764862962229114535190203566375515336454212011859282419120166317861652908888475438671284819089665982547279401923987430854451158512654842817295465961540963637129827028222290355602094488202815512160426979269950341228922163729152537302269637545655250485568256282052827775416059744799313956571658807344645572367377614160737274101623235947099688280533936734873574482825770483347386725590354986027708834298213375067720289632698512656106946260229255485263439491511281063\",\n           \"12.0213668967023250475121483705231298685008638313363655540949682389613264866896132906306098642187026618532213215211701448267391188368047667853571572694775536356753264174403972755252732243831827044176139209024924394250581368618462046261557956041495153611139167826243672443648055383775943303041688490663671373136155053510360540267843423005332353653056262845689595224998209096627100780784418138991680078849703487894125005007545215782339870314429009558182449825490593249314052067759681658697789673578678949212809806351598964422253804794344853941490798950989758297119239095904492398955585999875857616109880042018712293986158989479506589338238909339482879806698524858243147005443655293460070165320341112926446082098108538465624611435423462989443724332948895564374322613862644840100579844319808606840135928070026153435302458230552287194862404115544729553555860135767866296645359954013075856567898559441124011177102556776336026301858215217613058011231118563314739369153408486077998475470304773205610152830759374129202640779824926230644346880253659061205608241669503029250691241581669322113673069664040300361434\",\n           \"12.1513313969589473215460257145568651201497518877897922428050262513288347242121973389754626809925134955645428561432377800707082867615886711829398230527046072149152117757833141185434477765869902183850205483276767851442668275870416792912369988091698336520343468857746751071883637173754271209585483303314697136442637145609733795560874016392837967424129624669796698075496202528858880383635774883501185883268804218639948489991597161620364526639036982352505612319544441359778240876504358105343789015081880171993801331134760442658432233574812308195804501595367608510691945957205786397773541197798945975331217200866768614798768369352312293373100870145040568859670724160372893783528980570376945737242122861351956826347861801637766043000626205823928280244639867984099618586640713739887577174825475613963518050410729443551908819114265689677577478145683280934590715455378138742260694148005560374430740814239204990726910962840148903954657341678891978442315098243895522200158153790667123362932646639672146391300060334021960329885543548050873714607049607780426796959929658969497274971918388832149882433776112378434610\",\n           \"12.2799204953578618617546194986711783284885172530116938144368314535771509667558045976384763266587016704303748296979704761081381717620397664865671903510669968678084217328572790633117099878107215974412473324265903962842838656473435606379942829050505712452107928846249065534782492554152722126011025173062371512447124740291554553421509014220072428311418179158177533762082303253141286989645666663806793346216795448342656821786999457421948811886868159285628588777116501247405795055524521868023723016473119342977272714337247635719827603327546913926621343978524311204280270124997453594630999239638634802644337751354075407234286619564038048753263401182285045035976563464216949517991028211274098829529896668645157402605736964080544888823602999291178070941183218703259256702481197869440224328285539315029919735628021900846763654500706187729683074196303084312788621291123362810414238197711110749709574470717069655903547110330030873335426650222570764388586364476419741035560485166836355135819544023640374991386327137930058958044315661460340536197491826128954196500096831279426592578273253394759361748277609755229071\",\n           \"12.4071769563386121910871723833880162795828461928567098974966545289703789921372252696246545971698126579135877653699779946636530700600709582176756559672195094792342638905717358599494762112026557836025246676548757396012224731074603580436169013312966381300981288214643884821974524286813435148379353275063447888532961343423260740356759285255609628548615681581561321713204134717540225393296689839237372943143825839653692927609315322726052991713273927559728897504704226043113857065570762959566602644918216789694969199672638429429945004464808633659900365281397958778937764586125792705750168571832536005054994358820565709437950496363494452954047921238695415144815274982050006786314548526164253480435527360117258227218473895919440988655875440528203125946747677251876874785141679432309253336655217406754914545493066933803303046355614733012876287373212014898518464354302511069792971558150198002542994517182497196658469446954272237277648451310578098894153010149839496340312748322929392343542401192635791443342446849357926898503374322883315593972409393470519281160983565963805711107788379316117321935018451317463295\",\n           \"12.5331413731550025120788264240552262650349337030496915831496178817114682730392098747329791918902863305800498633260193982243316180906336809047892782798307396595671774022906186556866390215650996940132357511723275244921290116470693138983434180651683791192209057803924504780002068757513764582573061292193093246034953046333204559400786984862618885126937412392431674432129875329475654786938171362596344020101428592962486815404989226269275049982050964912932279406858481733740076448726165236791737387809948044594465748859324274240234682608001489761959800911904582895205648987648856442440083377350279315098412071082116918180875960652807567992085491418518171171779048843712243763089005461162142441959768362576987291412815168255931404395101775965044072802013243885707825024188361637547068403212358740817592235653691584095976849421861670082802750277531514911692932624780562948317181155519719433742200985107712422346336716286438058226121690057831351581765881509015613412808834445888047751194480212233995260850290885434497091479423143647466627421197441327905883948348615191930342201498664435396962952383653761285421\",\n           \"12.6578523191369022687748451647920884211351618089655179455231284731368243638831930092692097344570437079901479457687357718509226590879392775115842265975597049724341563061418697031268607830263630749575108233222183077768581512869483056352211926808706010251598533367951222352547093385705143351301673698003798847470899037622815846893505998436154809431208770604783851594929676185652397778605631719747005946930957513095696933347983859316339644080864356270066190757023433598780191812725848826161342208170182063208964958296027351135838121377963924650053695239000481943588371643194130257120532938135164021072988780496867855135805902766925269096358874433009794964404505124093744345096904976475426376615294176138495927979455477696384319750513407338903997493563537351640190122018222196334825106936172049588584462292486129117684021653955548443028996098787136328122645959968477838803895341464736220878601918003630919411584046348014738162733741711244046308733521756823739827300238391611818552174369697043280135230378038036669764857912765848567411839492389221128518450325850349211951118365174902595493189143091128924607\",\n           \"12.7813464856668856522518691213367395488373983072590701713145905073584668550411607358543597603912057762741393691355864623321869872045162679380340422123959215611466910403902959589333930419739972126872708018261852986836161629068179608683599318758558454178186907956832450548642925510765032059337782409811599151491946626755685676305766429474808428640216684544678283803484695266015509922793933788792110436669354157798571269751040316991636951713788699537082555292927490570204626589644427435300175517403233899918923272847824314167455320989761357119076509049838004736602842837339638085643968136447256156911729326893301531646656269643040306415499484512699811735326226264568256017365274168292179743002227502407737172878415905382510704635403854488151102140855989374523291111062718131251568078280886769584934696459901137937953964469578793772809237271734821085928782404218121122181261925540158683038925682470156718138294664893516327450715858049368151852456159157278933365855419727276747917314838901881136398470619819131257733243425751608844676566931756320335811737311881389733198752534744615861076204027861852881480\",\n           \"12.9036588082705845248371543632003751697456908407741692410784368848786088725089065725375873804520087666996942746345726834840639975755506362717246534706442221166298621207504273622834658505486588760226060303402875348318760592759886407055350301443543632102422510097863033684320708847504885397025676888805608608575632588352908208382177260510976770708247524111302977184221988730373831487689478022518795416243743368791870779402875990432576302206741559354874008433704301896418503322037242979413682693250947191295393881165307605408058206874512520008288998516843589530555818279993680055875466221805842339665434759158713770816962051147931208116808824595295514375045899970471981704078070597035475020898965145851209954427460157152268663408082085125094326139800815655980081696754509782998928240270234248524845103756193355528876937225771208802709529190373396585475974586241329821820837801569449366833520227139445910446436020810058939318594350345270816751238237726135838608689569520523122450244404454913108932211269247818789816060744177821446724166244434311897023559474757455995497570838056986157112960941696803729504\",\n           \"13.0248225820488178685342632912343238216979601061218266855718218998666276951533231145020930682260792477360344632310638590295441684624351784583776951333098667981974188365545612612871000737689117674875852615577526787251049514636210279051744104230737587454580087607795759122258403467492028649171542962343479606529561351026688755487685984589921428857133421559960948571647613155305046016188627325903041204154246899196966232462603966700445644910063624590545310742013413052493767760651034718454869397101309887128595851424984506347453928637129803680706460369098293991859471996032517594872564412415070144179482992252118409915695391894969117482400145045884554842840322278011432577120399734619108356438807595811178234057913186320237397185513405311167519217318999889945937021719306691805937829150908057058520820765419626158504132060091774274508926086376591376268595715192288979762123191763090744864854362118104740490470526749755952163229027693188269314110667026497869103566625965385924059261283134617995824097636505520477232078529189494211027236324917581780494684363016330732220817837194012821489865101665659203348\",\n           \"13.1448695675323697034354136539313425180677406990253396231413553532158284729201772491011000710677650219054903693738656249197132353617817043139899355573740668204032909567434296038746304150062741309218977952141761472466065644454165057415693463642194136073230607947203262919479440729879071393287017368357538247791027372780044529165958694345741149609916405379143996738502906726395310549057499135876771945647726253389292849661459433071570826833703064597528372476669325238379807256995707509496936873280377426680968490544204144850652418667102858872780887677263338414336218554299503848227359603371483052714037382060524446989585125868194539667288699342590529933341716843693870456228542919094333819496744852442099842703290379050058483746581999303382422470703068869484513287507363016362925163918396245228476769779932001778978178333151597445957345163009522871315976591629005355442432626542153837481717190476686292454901373614541009740405739756345322959707818426567664529141400786956674079108340389783956916039981285613130422619726646882192158229279130067633381058950064006933912115038270746168224845260024281286513\",\n           \"13.2638300879130844418692645103419008851433471698576707104035205068479154842342531493640166188424221928872788268021523097025617009883171083293666524699722708507299019677199016888467812521716795727720983628669582611352125389551760744251188257987908956596124821189545257478849203186906127332490552548178206824138544172197838374523423375254198675829138413668912760016032313769059455804653716176524227853011200341883185271520228753499996932010458410031370419693143255990700761000024496673196269609889733829134801047484980551666236858533457146766367747277095875593778729441694718606128544361746910206836748409803492602665596803500054083069780608871505801360646167315352690280628377008432711576063166447694198777963877737992599565652289384323757645957667831632164936914362085854511223997991382883616592832979065177791044611243501006307065338908712799154330972075428217459730419874208577724586140073018349376758248846129948221694682041532005304683418747132755542712569486036886659785111557120560693988749318795483582114240312470812828755095071884506363715783906688243833912926998435817149547884279386906634051\",\n           \"13.3817331184947121778387694156683631366934609178535869224734646839530858830882778845431320165557527082867167385741007241233972349668341335799303120558949874914731632596672292536486840252369343075578062661394846729290886120806335230931470676125584836958188275362750631959355148413735909208659653125785489545299880650571571989789816736276472548899331360413686815340230072317761139617108693201596677053371411718241422778714572140731264458353536124425397143067303995240635567710414918725517399711583125030933885900593041624549493909270279061801044266813541511476059360070953132414715897099793064187618904913446179695444823627572975718616435530412231897626821211591630120456854888471296525545355847536852618755937846705639827645780754110681069739162703086029559215644121294709889120500305321671981859220528418810561091642459738043327836329007402390418543140043048855442197107222952090170835732458531444797752568765756885481280298531950424829111511736236703060978513393719587267334516212509718247535160103206224947196863863264871876290808068433102976710291998849009357718081807090905471789659277124839575212\",\n           \"13.4986063691111464245935803057163445333446588880954505218387843221811866477814509702726201994868384090085699517429739877130502525078353243003832198065078057206125867558943180721358516952593492926100016791442634700742497189485375590347895515367419024810678201127613962063650779588258427129303547853247317558007027886497918350521735648476962160113303483169507138322563300579235728423638552959320773585796896051727660519635215799533389594349417041464679040078438099479890297375500511781991113346083206493978277223781060900609203238286306467871141396991230768088662632124270257464480586088316850690383023345309392492732989705825016919526022563362954082266181904414071139631058950012713540527049102477938879051900769524120919579312018938311603558253092272074870766079137716555254983943200583248719785173513772917080626726235739995775731701263869010544645677727292023394850886826745691463821983518385802531448450511994014078687762847948523441279737079750421003933691499255395954393282954286628119050279442723264746413216878905804503870657461514746916596067609999603045774298320322180133249625717533859092149\",\n           \"13.6144763601762444379926521651240108493489429948062675392899749011656367981822455178853834668853591318227100171777478230478862293910435061059034482102617694499353623610929608083252219728860071814777496237554962825789860436664713007380885823257620705055571016537859083323332155283573726935538232458058826315899029704394102678491521465094178345832292296568693637792747393915301530583743993444025896838065118897343043328452916631236017814449542928117422626902025859794220329730506629124433815526321617718341415931415683837830843770074490481176348422362162861812661346849873918814224705384024355691424864367748319171681413896659635516678441852608440834144162761248958567982479001381585906063881204351628751599665209292094281446522809539191841105420891950899912208472122984294731662074195162813392306707005283151329632622622723286645815527491117005404146816741085203466335075802165744347567892995323123529815454414242781188328567365653543913086263285794736485546877191137857066664712691746005042143722635223400766012268118857311779477233465292274708583508374133748593182509627918787117455241091542819813359\",\n           \"13.7293684929565349002814005023543592804964690316913354059740039921737359962110066836654276807236804947742615071427660872700145940238401829666198102867564430983532833968203866397021274696048511423964516039293063346841564372616394035280508377589981815930236172110027155682866173265957057116847537224889132966556719926804970897774043788652449326550990615537122847783422709526359447381966087990633802534575460646525162074014459375015575284404496110852273022569124875729765365403159702452906368625431561932846108624944301668558516528560245529919672218971472439887445983944036799046361732723092955509961768112891725995232612851753679926819549883820603865511609240878443812730667980314193974928566404533803735999392509746959487652262747583255886228825858553626132516826951392583384852945025156027490339688398663126302073252408620920771562662203031820882241531317431978536601598095635063467881482850750509513362287820794106463323082969988103776574802747271900279764712139419063517288236941610321665999875635490491168684987282463547798106958000567974010853725420395569948956710379401344238169278863002835967332\",\n           \"13.8433071145943080802284382623942725643459634316370295832402490811584690521837914916840395377602432304386346321516022467700817063042586192089471811215559491096430603765490105342479464734028031685014017988597008866099563434747509151656359907403458022227708855288944495192855866834164923404580317751114810233440974813740088485452355904551218828581183511828392819322800423143611251652965268254587551056785058961962030307952250857929384076417852708688910729480334385710261322295627380646587526400594088017012104793668923859704481465512725231143313046840031532848517753228102569245860823651766421422437423742518931925679240338180398466042655884199628267998290371715502966743259677385997995351151244386978277483823663420757491844034607904266068469818830496093618976553620949696221798505339106720245367168877405376645269053274617909080172273096809275302452571198400347118006550023013802032386296495237116432503947861118574507348019315687686050292633217476405553408632695073744388341821217781854190838168727859124017786167368413748894627539001773837225674001211236781270826204317868935713403376698315709386501\",\n           \"13.9563155783525897163028298734019451091984537120228258009450472188267318438067135063202368534135430885083946298549306330756477989556178368665622436754180093476324880937959506547854538083370019416256575776948316707917842310903894619857591393548227911657101468449311608259623964684665016119377046647048049581386101096936670413063222259162339202191273628263372563875815041957309547200658623166127371954284217563921132238888463255849732942787630189806285692737078454631222616459782467155377806421107402656800251572053070998411099760060179547316216902478018563990476197410484317348357273331772258891407220597320756586444959820203436442764666649896682610015685305787123195940452350461973507211933252869415122355860564522872963830841829314900168567809701229312807570848373079796018588703327116777837136272491150569217486925114594308036945621245791848046986349492932929571328689798094081442393417715210813349185572333277619344160965594558435011430506853671006276522611925991500789685436288350432338677840599188216306552667639876278614865474090999682755277088033035543967117665417559338997296158961230538684255\",\n           \"14.0684162995042542216674654868534900853924743962472320944901951275359770399233794961508506556929677794549617967276360905381168930018337020653807687724763883010138302750489219880498862993622224095549373405969163535890073412613574826759778017493325279749388170684537388753850910851919272805375112411195909352449662070600051584320215271787478297061945044327159674754973100028483156776843882380652479233971600254593710768026548221752384413741309489246040289220352899116307815228866194939899432434878525491558800547976779979683367688903278732739389881734067014259394063217746106208605190496361134584948172589477057133531025440786827852253824524160548403487907421272973290367703881100721669407971269434798443550172625237114659431030829916141687040666884696235625814564129626435994637907086882588770755812283202784446386224614800747923981140905500960288869620470111613554587095067550976879563417478116388152425814195901924622311843539510171658250266502293689578285040347337973437140124945630951972283147130741281963393446164290359192448952378935001920557624942274221681701969732105101994763264008622253735683\",\n           \"14.1796308072441282183853398667291614623803956489790970257104623188232902767282574509996052539083573233298145889942605653298892229257953808202007496768222965476963015892248409827994013842316066098314567630341437024013971121228118377641336015214818721486835757959593011225113742042072497312433546600072511872609098678198012274693439183149268146912703636093212939100804725391474543306624788387699854792164372388175649060124931797401203419100884488639690168576804829763558693789223729096647545879906533473937107656768729633634222862245495581325600417464454810033071730955572334520857335510665755434348564981509217953643371995843993660518911909987080474451217457122342864898645198315616289691926316982991152259678255881050789701321000503460803572510568774002144999754447633636924860956177391322005616623420647924346632052977845409157572899855099445598306816404917155508334824637885940574334850876779996796181107939376311128317312515783517827307603440171245138674643140940490734106905601363012333078105653542123345026860999226152360678825610735394879178469695503958635098408901004932705510782878230077100909\",\n           \"14.2899797929645988880465370254439290463492686909646365784756651098966688981604710380521849261282420820080718993444184921140050946072295733777832552069831871497137709875484943005092844538329601721866028257517525127400112068229653107318786632214087321828354194286744189213884282476820178532929026410946336549250316411573632399544976436381304928255592757344082191936540818455775028244579956105065883479913799108021321113869783952904182528280242051379454218665561448727584030626615636178822706926814162499131369332023155252856087861647757703882420420084149242345266216149260241941567215880661724399293386262636274265942504563029111804888220594251821006906781849767633589028769011495517300679816156698760917682079890665846007154923427386849193920295060178471954901369186035029069580960675884569751521212531321426347035716993287569668349433572526231363707210075671937119893845403234179825305216364116472043430327447622673443562491607514186170086950732726413599236608453920182597620790203604341499252603323429275866821091530657037950087409657380807571921060480257877831704466578263052537696771142883837667113\",\n           \"14.3994831552013127711282056937351191001504093681728491932833832593979434994003430971466998201017992112805329010979828688660650916169722207860723532331591812462512916668982966008728885975214700393366748922112781560669442805260850747279232150993153692443149737581771637951619052246592314537389589547596925358885851353137852240888588511143973759301432800806312328067688373837578111007355067907342413561415117098106229593114120795475094598890952936412656420669510625019084604237747484641036400610081271857751008108979431957256358635365498727651936976456111883065483148617986465457792466402273815217241817163501352405823111497054361243886482686577961223780674009485714921257768842405600740516816638273826990939617065159558546972545307457270500896948955482426026947281134410487716638801651876698608693876104397820386663227664888754028406305427233767301780066332483940467863387166158701953351518332400189178702153049021261024299343478982543905250789402003398874430729393561464367541193884402280665307850918818544192856877565661864230591257923543269259287766045586392906627455350388206936516877511705006505488\",\n           \"14.5081600415254637821968107724614159379846815250015966632796986302946639359084284397562134794977873371225673488011687447300524372638777391491271044047013009672846765153462292968052361902815148016221806543555516416870983561046485697445468525590089690561736144515682350187091487327533880302736617743526917603555494921673130404909292620569107730648244440333842777280190694749887082191823918012255416939347228605499563575333082299453802606427072078361952092566154166904748856523531473204373911618483373304549076618565708179979210316820872299882348744668938414281930060202535519438925657354409407529756410826043868530687455675261372284869586600498214736517437102860130625263737648428644588668437974421283838793145810608177937448518286819323950509354081962798121406813386052183361387375237142429814580328643754914782720125219937145864600464244591497580867134545593652723923600055555437968222771839658325503488203860238775496018875409219820657867877489532429308420073127288519458470515585824162233002589242653827817278322155993680288963941768325132608929167231803325441134141466079523533004874074960297398614\",\n           \"14.6160288876324385915282082833965054491451514454610200902394687979785177479643522829616364603240189840566860380268224748399753802405943005392310014953070864465023481741203862559161940023086412200284446473311773218020713884034550394274956642070111944572452151925229164138208667793489213073745951939637376475072238046542165112242929720624283960415646561278977194301782816461600118545055956802134155907504241913799478483079002103747080064163279210998110147485017332310883903664994279933307864561852715983031647907050130006889886745790117080604262580893840381373714551099705553640113221087389797416689282779302152781657206661429673588858985798962970236527448473940009592181110203110178340755616764069248826774690236853289420767334169479100200273495854179775154480776286912775449612542711928074576553201233514379922132051999344634460933918951031402916699819979843036301934686144731527295916388130591787688603848332640080135877157352065976684603109296470843761116064910386409905698675285107464021939356227075015494978348239956711905571402049194421753904018717527587649996077266800964352303624402577118757550\",\n           \"14.7231074538527950476608918508913485210193928960438010156179716284477839899656296406728660773561791479300392640548844362423376122815685515054605750659875846934795898267446279294839998923205284269250511553190404067373365705229426342396747030473106863384763359235329631176350397962888021561481413516660292977014970409803172385929807914633372249932127302974588451306885951998924516950174494016508742886729576894104195203891310671564861400064652564905406159871623321437476286879872259083518836208723342177364371256650666793948295098750435124566209886842002880143316847324199429697285209003531473719741904014483758049310397090719533728097260541450500261317080346355382466832396046849587639939461239781658290728113330095841108422751523386313998448194981539672857289889090299694644812449713503451035671101363587351933041787935726164774892898031020620075494054191750748238175302842601156452243294124366476294688491666489019848361123258726182091191116324806207133930412068583323189688687308435693004227410778794481033787991938082837748996778982096020946799825701362360467247804846582233346459021849435486394414\",\n           \"14.8294128592903342463108620791209811162154136750542777284601531691224280305317915513146089525434202545204740516997954296244402311661887141413394532911541491603071708609940180070016261017915762557510278422457087524038813467378351272004581598457324467747373030877616178977537315248779792746942842469899245159612381076176060345997493587854288545462033896684057639832634271247921538572263389626921342927751757718681583536839938535751092658431596624136867197010308317749181005637423090876543873298238850113918296817041690209369633579425326504751223838947047626606883955090485790288429021610217101252189548742578539077253367329082514118063765427191960206852366367930126992346062168587627226173914689723039724555064028133389228017987680521282524145956765953246086551097796047782148791998851951221419883319817993999053278752506962511065678830257218401748568500747333591882058597483002531463654177181720203177842917132707292556291289892843397045703928170161651798774202385266858024628481292908429107158745626477532254897607152843489836358490936853541807395474017791353789095258403694863885903856428866385139618\",\n           \"14.9349616137730772518742205278502213908354666769768829412154208873914099415699826430905240500055519452566108757946045864392050766773281378318859154769239371884763198843033880284347786378856604370045769280031694584512791649322990279975840486835965869228399135416024953621164643532400693170358493033550812154255730604795122027373166382306083361422620489180286334685541856384068029463428651261328445748342560926139564774421725776053820917605563776256951832599871875185183132937072360851486597203051765984337363986545459745401275505488192448731938753525598111844098064910555199796449249197864727749286292996338718305630998619908744286323602224649686053449748987583874785327499948813912602137839272202488683363930706928086605262922617223633664247999608682512707009348695830289960455591428363355858586332036652696876145134314146004076987087103822970399358514255536649174532275760391584685618135079679840634515711782148326692482011033477006288036228152078965813370535741600755067904328039271925962758975702936379448509324264036066209770450856159966672496255612322665295729865499903170425957082810506551820498\",\n           \"15.0397696477860030144945917088662715180419204436596298997795414580537619276470518496795750302683435966960598359912232778691979417087604170857471339357968875914806128827487423868239668258781196328158829014067930293905548139764831766780121016782020549430650869364709405736002482509016517499087673550631711895241943655599845471280944381835142662152324894870918009318555850395370785744325805635115612824121714311554984178485987071523130059978461157895518735288230178080488091738471398284150084865371937653513358898631189129088281619129601787714351761094285499474246778785178627730928100052820335178118094485298540301817051152783369081590502589702221805406134858612454692515706806553394570930351722035092384749695378201907117685274122131158052887362415892662849390029026033965056482083854830488981110682784429900915172219306234004099363300333037817894031519149736675537980617386623663320490641182129254906815604059543725669871346028069397621898119057810818736095370601335065657301433376254680794313020349062521396509775307772376959952905436929593487060738018338230316410641798397322476355542860384513542506\",\n           \"15.1438523405392099196696941526680757548021305645205291142290551070202545969870806060651771792665589490055461678011089894664863226391200155446121001161264758488222957146306674042780025430540877651260123695207749882929804823786072408198311834035741094722904703994169074927527266054117152533255107532619942528281884626828101541096773239563535294095652383393617113444649817226044992144468812474731988014146393516008194986121551417317503118242518823714684606734325443399645596959933855453707336231367089097896345978026922587762215370241399967794400041904056720435869378522780399983882254234030896553717060098405070969432588607227990450595751600391582489120049548888787130887917656163272514952919890907132626716845497133112466950843147056634292546916486178521992255691504244921986125000809530997425200716615625657674011024011250858696591746091527644535689099940477872177573673286692409322089652390467243801596188075140733650997142370201841877916119994009448748653226635048181819256281784782880874622975340845523108222703652277923638344521781640569055426282343260980758922970221905010015543051560514662433274\",\n           \"15.2472245463115253370040636354083283666887786708714985639777668988830176955007183975627913778852644689341469297550544080185597077331715777153346360021007242495125392214774851264280715894226066393672643745253857483137929607374086675166192281961765358804770989187738591443219457532796617012663647789609431774075740567432008038961013943937307134814420860312306044163504297043835283963554752015900991148417739158394289066018572722217110593352847089201745718938357549727957979705487561467680940950578965108092971745951832261598491593612429568718722411875570411732507363965110669584642166670193068764600247928278340651032872526563501469069542627171043818450750969393729921266850657068206236571831577209919077311206015198636883915870987141318717046234082051220681758363352349761727350749598802358775860890853785340760259057433823505166593652654890358333190798767847250596060513312651361844271657521510045055877766996925314299833842766830666961654150747864536564429858555272922415110649733857674682620223561453248275694304210618254529601023775975491296511721889498789622849848564452286751061016082497088131584\",\n           \"15.3499006191973273271932743733389729106106465662646172680460393169714387084447557470480954083233770880379685371224630951351727147025497081082089879388337460847605271660715988291396374847634019968015591655332379953553548320591794507974928536313132140565134911057811331918478115692690902657513781466327964390558905925364443191776886267775090535389272723947721917202602879066426608737057083329758491682770994310428321027233749321777436014858585199107035735971395626559257243819405652335029653770591399178721590892921559544649784504159433642408276679973155389005350337656246816993288749049548293503305422189192594259042858274455047560941579251477856306294970704330271186897488785264092623536912370835806446753257171205100681111029503749113972588676479023379074070878101497336800280410356924143787399669535027376058454568125882734662103842745378855390985776613904203513017797747138888437136968088396337069879433887912538591669283312778213455485732955595524676294450606458545443919774430029550468739232908922412573697555394576825425670246864782661192745625121039099283240722841566743449202185347012194036339\",\n           \"15.4518944363733046480094895714642432822764116097792743962905968923051434278273216767519678368256147566495033878636454508377334372505840297952460243476345514701393821523863781406748742704716992949704447086972077248061651918445325061731913106414390710999384235658960798983324112234104659780681677057531882860382080238722943298496230509728345363802492358823405567182598267341768167330142056290790935811977359414090689588039875920175969152935770254523050051392422780000072929490482155794529675141588626785387839003076240285297590899692598611212948974143071946012735043590405405711508420740182622735629791811546902131754304158391375976203350556228354908194871652988791982508708646374469749119063201955850224934760173840978540631523245165459130698723874391791535530500096570481656934324227197278855637657017693124057969321411825957010121491871519557762634188278945281706669785161073963143541978342157205033140283815645312514465796297186749713508027712528205500701661239403838639760963454035559115496453338988692441465086270102708432189916595292275910127721552152009058942505984180320198848113154717062637193\",\n           \"15.5532194199919290973914478271101509782761473427556110871326128562635425877948922439065276333739001292422317859939226322742544533781551368669476914135913677167870569871992237487074670090250710391585542749455379676350917711973517231870663274531838871780463639607198142971742006771650734656927254936190760891498433170178096075966621078837969943641749478412326387664953246784721461426256026142642356786959544769333983224947181138296945030840334549653119000316260143077956508210419522473362562194412180815212162799927642323378945617932239804210721035735661553698229406968222610664812153679540697776845028123042956550110363507444357710659863250974690713371372128989567244046052322175878868097778138345843971318806979435481065172044184336853266870505659167792988132948583467977404968694959221486656240243417746389624264522689502159242881137811206933660406168854853625265097649099854630342455703384775379760129637369884518317406075014753125436006487026676158299533450354777908097205026564092618416813042451075357865075958584347010560603909401672674530473016380690156057342486458799820056849296157803970758151\",\n           \"15.6538885577994285336615322473375966991656095021435737363246099636760165366202196502339470259559417674183944684300887447920118633727001251716571523443596918848444675379732072543560564133448336770198458947224033362634921875944735296488201053135882187385898631210771646381454433721775116899072292857866394011427204808403618078909248941183413487233021402017272788966706121586469579730897499975748868490518551337318808652816220884250194097501134581362589451191335370815112714612837896607752466579681001969484402775834313370422194201064429923758665189369487888128968954146148578820551889951620171166054882708759173934381781451338459291737123198762967272009330015190135251071755806152473036989743744301736751164450587318893784207514998879026913548107957822584996296731105979982593758231329776234669559571495246544966721659816165141685360821041442768655874261766471614879723279695129605131434774277154659938308116466122952625429526707433155213455467498548671879756157972690042396634723002326783535035168700456971324492035298595293576869795744389366846556161860716979752870417581809090754427851499367674362389\",\n           \"15.7539144225679246209830112311867562489275000482982979660467978944730262881956936027247186896733459505337734582610770093614470487327551772081823931905589550005108629069012648755348782514228521197088346998693251351381154586496257153314478419466512135062477857636559546187276312380852109985976404783376323163746995587475215213229589580070616867837675337919606283901588189302295510731616001258677000217918798250564696325480908966629389997769717889909303798070409227548291667767301493099723866749466998823232247966469030308331085073105913646005885136696884725098040065704027444469765094470600930146845779530531161938075234915622678545819344667609350674211649145259963974499132458151510972295814587234589477382477724361318542752546281937647008728052174217050786598039517009852677136114528982242252373617954020044735443912957185708403871758652762532215592658585695740093871059422733899587935643096714258513937804831673775551390957596911031295963904326636986587614829199748400378284270489821119258092593559132400132757457303025648114989713809051372859786312670557557455024113430415444733469786577609605818156\",\n           \"15.8533091904240440533801150604807321260894390255847791708290322487869548721062866289150967514385361249309622591731814144915462307294258995039790586215006939993383983758776850046561092349884695864980967491417864933460813596552839148807057208618613557599377913061397320925659394501750622861864171880053557935005392499447778008413317995198028835874078756300521482179548125620652788764854972999687177405402042983731431613693788787613752177711793270302761736067574277658658787903363445166365077580601657490510530290835637982971350451510996298804593461238015330599519964118988140999455569019580613714105164866493396051692919035250861649195973033019817282972152713586938088500687115272282682479043225493555090482203878517967251561713092119554643396372535898649907805934878016873123756393954615387951516173102704296387140802792650937087349547235972359933788305229551638870049736359516727540333980757675042737103700554746326399085275428878409792860763156503485547649698802164314596132917707378582313164765977101027311129848967453806648036945112397617833423627052843598016874809261680305673980351252655348374751\",\n           \"15.9520846581496442456835073500703066451779451051014841539242701086762015613192896323745559106469019887460414126185431359961253757915198034227258433864250836161583392878779461056493265572605574360603888584134116652015717511381633174846503017116671061672690227704542137628252959797331559476487739925081575856685236012972763809030119081042926665276791590604864556488405316065408861219952886936162336641184918936697605192640548272076353846488495049719651439648905433484003530512876695233728489114894850158179246113864820837838500720026182528991300469647511661287205697325018876335964502449498974863642135604197870197848793495324492868083775898735465533757619639262635723010975848105068325903417106605865046292138037866182138413986125566393404019074389870752413124723753587841540468575699565237256318701348228914889961059600076085302269512336986876298095168455531799946876677717621683146126707236377496395703746431798350019356976580256457555721053870192650781008973533558052075870268801533388874712868860234888763155218624129421405763678812077319239075778407441953464485710013630549293699630738008836738523\",\n           \"16.0502522595242423047658196757944506380174575705759839278253230321445250829639481910961471931453116564538738497439478557175108609739886591120839569490500534822875304849736326488209685631259797055597162087990625950864597269364766964393819102203843223113243118426671582284256752979792222658121065967489791739897901556464359571005944335246989093673473307922127953030743811956112527855213800208534921642131401366328104759081292508449281353427532625724955074014554055167375410461346511957866858023371199864971286184642392511378752324547642788064420065819699737323404789938130114304157002506318247766787276624518432056105705328622750000206435275106450682964574301892472715679021266368586162764998585907621481532861299023329709215002403001723015543872591121222930217538067739593739604698257682609428654874555491602494919829715215979019400567591170934142751177256545981785724618392334660345395676518512531709484372866958613593771143352725257746445919068135186009397759278633269127719426191365945433194069995854695522773330552489914970861258642696680947645047295192118341734641074275298677776747132725952692040\",\n           \"16.1478230807732358804057911156359975578643269683364195005563293802325983679008984974142648714564442396471730040316476902098875094502600153583773509818474040254222873787323736489817652011370386406266250541511480202000072979598788155627873931210965950356003142252258291831141254744970185472236595284729309004225710563295709356523567610266397233789715267714804425396668330717742603267969954704057766975076430627334443597598422164729733865234176455146920250925398679022857258803104782468690438474584298601058258695871408692587584948563444892617899745726543714797413684357745555329038056593572733989924153298466060559153513812177648291034169614177512283257755959087939669505720323242559668932499003542818847651691092512987952257177634187849222278857431112238824103335198289105119122009380272498965826349738709572199722545419521302521285254070487073289909851344138939360922891594389079867498143873584750623589649101531017564978708138390620735321513779148712154176474583208544330503651654716904907116042682578169464107303714557388993154579350605533888231564568424188460142954331592433579506586890005695885131\",\n           \"16.2448078751809998755011217158068981074812938780376907934288365969067715754580651881228837648643879607033855368102601676632453884110903562211987202416395104068878916710125029828020978141971790535060779445467814920211563614823717939714231027215836135944076544647046307691726601906802103714211555626778098815167697410921218478761241829171583291214474448114233960671085832117529951301204663394172136901026541390977184829069626833926547718636187253278592953151429123517742761612159686867396009176772048429857930463378251101441506406781963593404431204027001757834444765502683573406073319506066129116153755917974319966003049503254536949291575688824723118194707260626100046414546696157059690148588275204844439191014730591329648048783886231915330055732155912797736172314922853100014380565619761622410826147387060234237675537903761684317822710064913207299936997924979239151897177602337621202867831218951358431546933181734907743029920468572483019023238760589912132344481868708100201604097725222903686108103206060682150910142819984712770046957870395535067746543225689701565797231792048627718784232710619996958175\",\n           \"16.3412170769233839606963694201612486691212128081356542739834914529370956581095536199949227667563196669751881720330847867749383217493562824508538192834810436530795251403748280815986888683090444963568544342830253998350516075153587022434123870840098964485733650438270480924257439534833868943235183119239136909416092084248849001763157362588633568969048428387870886333191418072195613026763062715704979389513606318621766300613512341969898200938319702408657590012474789777007123467808768282135872999150490149110158277006503250724953661837621574840115483372782860303277647284047119064007533593648396594330123081102605014990883472685835045389875767425672113541605338848610128464772662573977617761213414690520480262408650017838431407962017900140324046253143316145470737963355177005851379248147035370433387833420553321888460391167558380062662113254804107448975955978227341116496076743206260952106365143827443135137267145015186532545755133066280336384345677654367847031873202744469936264238113240447117511360963000412145400308169673233984915808549522819952866570114619293558801485679439444177553637843192666077022\",\n           \"16.4370608141699779533272474043612773161336096733770488551072483958825670966030102770671692026351162758060426915952129701085867802729318106406251695179863885464546615845148228047143539122431375925160247632834389582278394024330480487104411090951724620355644351152169170545009407362559853715960254174609992367516445002937337915452344034027633137804671869009243012191216273628143810422653645542449220632441502889291380255597379975105906010494299091436098925393391453500383425028779847395212818216089937829167091842984754080301999529208965785570901563511025237838322249140592553123941513540557406487062630678801556860907709013663182736461628834763074768624936750014768974286417533180445348738169351441886657201423938621061945983927061958409374247097943865562851972717122204967234909902165207404812597672553085816768537588350650139595857211821910608937442187518672584714044022382415383735643991420907608195400673486843199910879900829598881279040861315931094524028380978241183376771806462591007552168307790120399348941306657109189741410463773559051033330925696056841916167522766228211393262242421521807262490\",\n           \"16.5323489215027158446880825763336276539766654254272088764809875681257710901986514691251337281589597719030480979213983912333851607240138763154510692762929645134059390271108447868644173448984649545846075027064353386413401987057840078259547584916364797582515654545908036217306641693761885158675919161061304000673810487248591975444958643217446048240102727684132123680636339276356809494454912918773518940016680535088516253123764670882202459282812565757616402645579638779334204722728987624467180608880772319027534713555789150175287611585325048568498467487723808179090257348438123807077849594237725002857165318916587733119054901238012585296647106745143265490190013740659650259863719019289349488568359299562334530428982968033376892598005685239623058868742620448370226790430347712128643558758014939672725409586893221245647244200231825250935867451601474997763673733348363862073700502793354719022161931458435920378330557182605440069878979638381549353114629450034341931427150761577849342839121295284737993268351881523490532278330519022627550209271545051013287036978208888323804801374289519895876593198148288412392\",\n           \"16.6270909516939193588113275742453455057724907893471837248190052277684021812706093859674562917358464508678944731335671312361111528635211707981851761281905390428651253063365857714873438460026982265332515908134496574598271324405852203598672867489333701087729773656692255479851820749532099278033668844157411253338256984189005214039791624919948530833113525770673128187949311061890698199891708014824055365136849537030748140516534893460775625312948474125099589563910528552797986693601626798750522320704550044628942365910519008770640036921561300268413859502896583956572600382670717293799295760336680708266640050199950546289960758721503030196132687468226676261182256632215649868207453902112403583378942883517958418243203582422082833178466365454545310575197259045841019912565461611247674091038326392812565767346243460064710336769861695873330502452485176311239682300570315470799685242592229377370919807320562394172447148622490939677945521065046574409955795556738838394520031077084414251361076203172937851582781189271677247274081267854212505982365846174249067482121520863646230241374323178103657911564790192184842\",\n           \"16.7212961868837069596057427052330107838993265239842708646860851842703326371466460550285293861073853336430183927150625107744808082403658130218547877377223408626609338367841882539006706085525641360251738080907390644127125042595230279880637143368202331046893342048365464875596596339640431519843405480605327189233621288814329341353255673008710460439879747397502025941747471573127868412038250150005699065690619898644879967858901930028888717317423009915633225475656314991246247179300655948036458387420845855288877301555946710757857081888614708196039221016144384209347600898967572348354997689536324424925550167367649124956548098079407104673133738019223267238283865985764961736835718647168600253346670325018729936886914389649147361585260144938350502362779387053821926782839707071611980639055740818753798912061341260095450383120266085280004484309135011098574017285860156410583019562874766816141902023632532127548071497727038984896353454326117060152368514028177470621582059370306418123530554777252590192842881894048535435254976906742189935635359698594705800588739642243011198473083262224352068070947521888133964\",\n           \"16.8149736491937860979338473016064026815629713256323497948750601809568501329556639230091530125737561218251440117233688971366626226619494552699934840033236354855838182946899863935935135051148775248339278515431361132281679384204107687790514630925950009428499533762858168486928997467661567186100299191698405789687931448311811106940799338769819016977485112597785266160291200218493515224003641856137869046817349736860084136521100283230752847231380759335075251104980538366249594135868723508770265154137352284134429841268968217533402887160211021542302759108278289630550854043783744185492975265706362843229478657405729545441090741260159076361941917530778082026439317132083178091065099562781527891889439614485685906543894620100854938929972296809305957708892264846534267896729102201515793747667010846289314417299727358358529077708665332354286589063320334666559975273340602615325426971186711002042629355909063066914261841178544815216158892244142405490982903749738628073534048893782956355157093511439186949168195503573717926825734468084712589410442022354120219836575476305852256521675584981012952509686818126145279\",\n           \"16.9081321108119800703237241338254436690744863062204119333243683660599775226753565893209713389767766163161342358021127981271381134650847016286405604432987298022336098638563576267935354939301846494369816655337783246226209880075011315863553918585959135040655522896546602388719639509065495093614444330145112109456097752772698468793609700122810958534616000768715917714125275538225625413748533473685169190832331617113246579894504494307284312332165945233891016849490928121382853036960384597592081111721835630475340517447933339362704327966786541965781642013462403621512902647219230788448655730199762241068447349463838875501396349840327689919737332595302012041802495467706531267072999713901403393223067607382639770962103669304655143862584052038284208763832029931753811022041122025100304848953045363327544205876760304756720535938198106981928743202962212743831014622551526319592553193580573329441708624935281603762989949456873712545791427861490109968314910368234559629841124132807220595321318685022115111820471491845170412521830502033004342105561816928208532788908700951934092518100776316736470776442731692226738\",\n           \"17.0007801035793936281121338813371428867974374892864315366365045182530749574622712707915241384347920699293353638201192620301921643313046316033287195368236744465600818338279114167561421338713928665140404227014843877263137439279436595462144971591867941134682123131132347610099618581532784272896432738682598070539934802196472265692623169163830620747322703103707706888841879278208903105409506874013233395298896805581080492544955643820269848540883869294533510006353020349957920715014892361843146242577547625252883154835493940087913143008925195857805360140270418585825481983225958905442213791260106363149613040098659673146882019866732435671376309178138376480369335069359192722225011915819361568401764846284323216010823897735267747840800333035036264285169114393598090497354973291064439481840096277008690228063146037619643429834761658442087827165677168899338925740605695619093196708013773454044065476725273474616759775258989343235256991100913196459365908950267021754881564605943770560095242514851607841979245586880208866747279307676303889206098080334141095498113120491826011797819568010033703314385766397392583\",\n           \"17.0929259281098732308568909665181706090496358902951216052253094189082758184705768795728909606854105818308409911054301261308877905438819451701225816708775064163858458811220345957117443399486918793485162274149097723524277233813071363121925271943987039923392571390254618731212423397735256468820990712184553680703600120940437674047217109360209678344268629771031575160683542930850707582417669810552350662093148256275597877537621451125081219588556687019419120479317429823172107590283143446497248490970649768152464725806707130059311761908605648006129152794658287289985756220544649174887465478997809837771313116429454050449336877009922282134713999375548742678240072088620118531202157406755008724496781361076606758611169943346574996481406674965729735501106625955985540926899693816341047327437159278090340558983247348348622180363741547423011416478126650485047347378185921229539834418983942666680991963426108094492973587943493986808103947127419030775318104983559336517699874867642430990267257306908318775712545165790980870833770357342634597715966182879292691159156387989718754333799048530940386842225448232251458\",\n           \"17.1845776624693504399278552427660121759014355872173486225007203824024372840436910407549731315312720641661312015514244338979423498353490793511266853712442843525886341505446387699669856777170226001440090937353259650728051196433419270760984455065871632331371517893432279015787092579337531691612539497018543844203336945831070057415570861416522661341142055293762783441277787020381532046055783982924019170148071336852167967942723659657524174803803803905087308384416784431284819770363195053820968301578868801810080541678810607866404802296225462621786603189632403039176608470841164659717593262258932759900746120866956926679585397696382726469136456383993490336779413736927110713121992182458332821162549136160976369409523883489900369202140222731089221360463387016825261552399416009215359001253955577936829021948708246676341112942870776695271407974775582902477226815721865733052145151608560413760572173015439460907252134033256691370749495569198954137521453923556632774376333569072404958969821817487022660731421354245851272428708325787898296874181411803997899332362008586913072670711064770984500148015011826261837\",\n           \"17.2757431704407540851904450153949790380186687458654220684915230386503275825407063160604517288734546119505644391694970728295669021023983949819859759900830880079629779705059154865670128635551815720536815841099639525614851417689538084914680867424196821634089586241442130192038834512446570011888290802100133594182555986337723487386416534433468263224465623305274641330130540795411919391711267934371941107593205550581646424497484790190474300721785629523248847972136552642048161447129520586107875881613551369904113055686380180469790846706208691893855593511420750973530511165283555627597887745887134627634145517416050748158800890514425554639321377870923909855121500878983383395887478657227223962509627436500904372492098670589675883214674156834456454663362930882283624845127465731275714349781314030602882871329526710766294672136474269162102821374407938659858184740917810129868058466378108500499655709083903249046674366509191153761430075951411439469754773409282874508134728609913829574500910503209081050228705417132900939410588699788540167873020190018123072161219964179184690554184874930100756126982018853834025\",\n           \"17.3664301093984238247123510549790984289306134748291022474290958664888369268710974860027907576347723303147126176414184787060588912832469046111702601777464890642632251154060816817161334316918823566501136820770035716334732686181613705402325472307650116606106783477061012163011204623322704865562057283124639475372748468035585007316914646119895238476177895413281264762196817540406728021584836434537388272205662532262621643283471955600594193213418166120727080989351217403325023680868046291273159196135079849504794468566646008463271904849506404907608613825464391989145962661376690126496752549886760192239310656336157879887593855859958823309866860061179406457120429704015243436160532979492144475251743461081570978743884248426983196247351207081556692289758666519927916028959075589074583772201210742744694427687226168211338842746789032366011901448502121835024794286923051973016164255684120993153139149490806320653960702333007936217638703590917692418814222701997158804755501287181232079015044179490661098796848674027302976104705585992281369648433223442373992912484021774309627757116258683761986486802220878937797\",\n           \"17.4566459378143413191692225015426086274031136235582935243632385313858201877701704036484032520749642131133778450955342272025602510829158221972777670586061661701347328186526764805212080639525455982292015938346325289124302844332447725669617702921917808500525274187600536620801147819163613587837238728871997225991025080525180442534466864555824862414662339955733621810264862776187374419901285240431490175974449378317927398381519709919509933689563116335690204265534027606560764875449531405967998639356231702870487782798115026659692007825259723146752469612698767331463901780062493519689225278109283378310274389559679038834170680206517259537270404175432248633893701903077868034694197984698018454399995348712691476944938462701653906803877183551688371651410557476681964972950883316889946306025542494264115645449898893118484226513921500673490556592825150254681189771557834158711489644867165103165017573599086205249218767497287654393905135560681295542932352259490763907188060867843701402082704725079265886683176519491584308173914664681606671056250177292407244890772315688524722948557271250549147036005452988137053\",\n           \"17.5463979224170035169103569936773167710489071842695682164094650343960555822548938246261708686464008628120698086564271575140642653268871532667049895917630355233940483632068661179612946301911395716185300516412585342889806163058970394576807852912357307669092680925494306692002896260519270415602285809070330544448934264866486383161101778807666439177712377349404344204981825461265916701713439907634881628142000030147481541566984916776985069974871350878105191169601874427236107028216631331508432342933927262432252048403053983936328555651202085666743721276666416053287908582708399019416116728290391041137776899514963685453226344913930595188919687985925439640490668381197141268324607645626999418743675707607782207977941235558303966153142486351061701922818541439990955033863706292565895764497302237144629129915168217734367589190606338115923850388544120876370105674692788127644053617727607207239081379150797391284871402801013281516570366080963892214472234112621858777932368224243266851672272297127593365190407239608295928071192401106453278389676417859068237527688061268702479082098130209555748133337115265799590\",\n           \"17.6356931450223847051632626336912129159953047631160231255194263214719736745345056574006334052947783704789851124650942357806440283438448075865374177648755421744889004812088237415174002112721888433569481184443980026560025069439822330036408245659699705607208167409459718244781459151859701286920686791397587316924683661006361446569736280386659169943463243969853737516308403647389899899943288964539074045777396061094245615020794569618969810767286161759163196190210263374998456288778623199988233761901113536316735857956970778148341712538680960137046414511920334125306354736321418705129785669231702905296255118678564162795574424588337165553826200448066730531304621451838136219021244379504974116096097930348202146495020513154705219076501726427281405053157307369058563911985328395372478199002802154489559015174957595775902617263259894306671438880488104887489699278033942889387921168112741333336787578922278486757542524555357598873580646861232908497366240101359399679018683387336026768844320636768908505456317105807294092097672788610628498171867123780698747648210099920520967511623044818811130645542567309932834\",\n           \"17.7245385090551602729816748334114518279754945612238712821380778985291128459103218137495065673854466541622682362428257066623615286572442260252509370960278706846203769865310512284992517302895082622893209537926796280017463901535147972051670019018523401858544697449491264031392177552590621640541933250090639840761373347747515343366798978936585183640879545116516173876005906739343179133280985484624818490205465485219561325156164746751504273876105610799612710721006037204448367236529661370809432349883166842421384570960912042042778577806869476657000521830568512541339663694465418151071669388332194292935706226886522442054214994804992075648639887483850593064021821402928581123306497894520362114907896228738940324597819851313487126651250629326004465638210967502681249693059542046156076195221739152507020779275809905433290066222306761446966124818874306997883520506146444385418530797357425717918563595974995995226384924220388910396640644729397284134504300214056423343303926175613417633632001703765416347632066927654181283576249032690450848532013419243598973087119379948293873011126256165881888478597787596376136\",\n       }};\n\n   T pi = static_cast<T>(\"3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019893809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913152\");\n\n   unsigned max_err = 0;\n   for (unsigned k = 0; k < data.size(); k++)\n   {\n      T        val = sqrt(pi * k);\n      T        e   = relative_error(val, T(data[k]));\n      unsigned err = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         max_err = err;\n      }\n   }\n   std::cout << \"Max error was: \" << max_err << std::endl;\n#if defined(BOOST_INTEL) && defined(TEST_FLOAT128)\n   BOOST_TEST(max_err < 30);\n#else\n   BOOST_TEST(max_err < 20);\n#endif\n   //\n   // Some tricky special cases:\n   //\n   BOOST_CHECK((boost::math::isfinite)(sqrt((std::numeric_limits<T>::max)())));\n   BOOST_CHECK((boost::math::isfinite)(sqrt((std::numeric_limits<T>::min)())));\n}\n\nint main()\n{\n#ifdef TEST_BACKEND\n   test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();\n#endif\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::mpf_float_50>();\n   test<boost::multiprecision::mpf_float_100>();\n#endif\n#ifdef TEST_MPFR_50\n   test<boost::multiprecision::mpfr_float_50>();\n   test<boost::multiprecision::mpfr_float_100>();\n#endif\n#ifdef TEST_MPFI_50\n   test<boost::multiprecision::mpfi_float_50>();\n   test<boost::multiprecision::mpfi_float_100>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>();\n   test<boost::multiprecision::cpp_dec_float_100>();\n#ifndef SLOW_COMPLER\n   // Some \"peculiar\" digit counts which stress our code:\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();\n   // Check low multiprecision digit counts.\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >();\n   // Check up to 1000 multiprecision digits.\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<500> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<1000> > >();\n#endif\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_tan.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n#define TEST_MPFI_50\n#define TEST_BACKEND\n#define TEST_CPP_DEC_FLOAT\n#define TEST_MPFR_50\n#define TEST_FLOAT128\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(TEST_MPFR_50)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_MPFI_50)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n\ntemplate <class T>\nstruct has_poor_large_value_support\n{\n   static const bool value = false;\n};\n#ifdef TEST_CPP_DEC_FLOAT\ntemplate <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct has_poor_large_value_support<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >\n{\n   static const bool value = true;\n};\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\ntemplate <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>\nstruct has_poor_large_value_support<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >\n{\n   static const bool value = true;\n};\n#endif\n\ntemplate <class T>\nvoid test()\n{\n   std::cout << \"Testing type: \" << typeid(T).name() << std::endl;\n   static const boost::array<boost::array<const char*, 2>, 500> data =\n       {{\n           {{\"0\", \"0\"}},\n           {{\"0.03125\", \"0.03126017650125595642059651621507489147877835880393069701338513042228140662868270178810496567920444849\"}},\n           {{\"0.0625\", \"0.06258150756627501465828481747745378814263718044751609194477198396918772026898277636891147279909599223\"}},\n           {{\"0.09375\", \"0.09402562724573195576489755283678159034525247904824579838425258406126459673745015890895186868431790389\"}},\n           {{\"0.125\", \"0.1256551365751309677926782186297740007586657638922255426688666139272557034809288714758416649081949452\"}},\n           {{\"0.15625\", \"0.1575341073252716106852257741724104906661974475121544257009051769486388715993896887955248205741956572\"}},\n           {{\"0.1875\", \"0.1897286107180591328910833700730338162710122536010363055257273177325079653665703027537671734777793159\"}},\n           {{\"0.21875\", \"0.2223072805534313308722888175879995822319104918387718270273535559005416973923742249393961682186904743\"}},\n           {{\"0.25\", \"0.2553419212210362665044822364904736782042016388008226217404756502588831981346542579493165026310550454\"}},\n           {{\"0.28125\", \"0.2889081724405147260015884454642448286982056723714186732378896291489603033944207768995735063901118923\"}},\n           {{\"0.3125\", \"0.3230862443517455201183006557179619743037036164759656335249943943470835620899848486165999610265179128\"}},\n           {{\"0.34375\", \"0.3579617388480169983883959631794471406375375900948760280972554801967920011385682070576100261097824193\"}},\n           {{\"0.375\", \"0.3936265759256327582294137871012180981856966444080712949818309739116951585799388015457993878787997269\"}},\n           {{\"0.40625\", \"0.4301800474642300490203296054472752679963181652078151755042924196261397876727827800621729454863519218\"}},\n           {{\"0.4375\", \"0.467730025452391799921342706961992620413738282701114114727311802060193364671415150855360089743973883\"}},\n           {{\"0.46875\", \"0.5063943574962298120708227547071771387085972911587370796115595547436950963394141008177411206688111652\"}},\n           {{\"0.5\", \"0.5463024898437905132551794657802853832975517201797912461640913859329075105180258157151806482706562186\"}},\n           {{\"0.53125\", \"0.5875973675914432213941588631578976924522062928763012976297627647411436985181631978010052165746790249\"}},\n           {{\"0.5625\", \"0.630437673835884766852611429299775209903293946951939898251650513745196222165381994293674222073197888\"}},\n           {{\"0.59375\", \"0.6750004851442429076631779494777229128864061685897319107997999948317524157945835559284790797708856594\"}},\n           {{\"0.625\", \"0.7214844409909044199895178832795946807605892812145963657590722733756611374332889471678213489198161525\"}},\n           {{\"0.65625\", \"0.770113551344208705005983660052773240245517035179766333813336659352553100285016757206110401160028615\"}},\n           {{\"0.6875\", \"0.8211418015898941219114239653747117008753716453086877023306268412086961091026737960147423436480371207\"}},\n           {{\"0.71875\", \"0.874858760554482349539671907932155532231782257040588572549027780010892786023906162883923961511720127\"}},\n           {{\"0.75\", \"0.9315964599440724611652027565739364281886913399722189970823760758473440872606463942290222395451727347\"}},\n           {{\"0.78125\", \"0.9917378983632686802568573899299023689572109767948642785884455151680071204845003794305054375396567381\"}},\n           {{\"0.8125\", \"1.055727639411919906905928322585893795895648561782414602487481288436493656539800004691156074588329712\"}},\n           {{\"0.84375\", \"1.124085134704560944131255965236688143403009777898521429483610660496648114350313475950507899270640935\"}},\n           {{\"0.875\", \"1.197421629234347972339226617276609445975806623418086002265951386950959459751336541541255052511392263\"}},\n           {{\"0.90625\", \"1.276461828982383445402617843263224436254612963462020761243811395954456362359102470162910199798207331\"}},\n           {{\"0.9375\", \"1.362071976376228231137266640571127531383954502011184315622281795551984309995647087587519913956728759\"}},\n           {{\"0.96875\", \"1.455296662469072910283351203225910848640458285194500237036240390915811463257413817682188441906818248\"}},\n           {{\"1\", \"1.557407724654902230506974807458360173087250772381520038383946605698861397151727289555099965202242984\"}},\n           {{\"1.03125\", \"1.669970130353601668362228999287655840466243330137306547430306024592587314737242276409239980979443174\"}},\n           {{\"1.0625\", \"1.794932157265411111412512666640647365321540790157497713363548060626019826336277151761592643681562889\"}},\n           {{\"1.09375\", \"1.934751011916103924218794082343652203808222523749686394781135509079848569244264225172363092871198012\"}},\n           {{\"1.125\", \"2.092571276372179004423733981234886782259941716148720572913991515339894408382371607574079035650497628\"}},\n           {{\"1.15625\", \"2.272484060247449371554848155118626331407879143446651944395567708418983252993702557436552564850427597\"}},\n           {{\"1.1875\", \"2.479912917556758792437515574454698934001624072586467858166295252178386457324268836053055868956236971\"}},\n           {{\"1.21875\", \"2.722205296368710926927932441765877991142333599010908457349133016162381084884183783877142234320889929\"}},\n           {{\"1.25\", \"3.009569673862831288157563894386243931391637699606062181047618417194668052548525026087449023543493348\"}},\n           {{\"1.28125\", \"3.356619539863437446801254212059537717694035906934171604782430676182834617443082960603002796648697006\"}},\n           {{\"1.3125\", \"3.785038166535876194630450975067081020082611278470578710038656250838244608554256510046862645943214168\"}},\n           {{\"1.34375\", \"4.328443997051826678273102914917348524900160978527585314859991445919675557868173766988955991311583481\"}},\n           {{\"1.375\", \"5.04191525648136332110647205436422898660842030191113551461354742130497045161358084541551547909572374\"}},\n           {{\"1.40625\", \"6.02236781523945747670227618692239447637023828129226996489330674807031833318199939459376428890858723\"}},\n           {{\"1.4375\", \"7.457597366497314807346683309400119820853357043059007743950216525315136075258562571085388447049580691\"}},\n           {{\"1.46875\", \"9.765431722939984318153137075537986427219225446494026346174651506537333303940271000197727980305021618\"}},\n           {{\"1.5\", \"14.10141994717171938764608365198775644565954357723586186612326758608969627041415526864870292630944229\"}},\n           {{\"1.53125\", \"25.27361509038201021888564593774203447137999639112919943365223977030408052066444435679945642193151117\"}},\n           {{\"1.5625\", \"120.5325057225426126499709994255564804478992494692406282802019970839232698437518852292295322760051977\"}},\n           {{\"1.59375\", \"-43.55836040673973128976461522014256814059799632626649998645431997677346427573993827534701436489680689\"}},\n           {{\"1.625\", \"-18.43086276236962258434966752738448975654856844592479276671012332110139541995382323486170528839748939\"}},\n           {{\"1.65625\", \"-11.67374867215481348216513536293945130766869617358776549669176281104274968860961548954064974733991076\"}},\n           {{\"1.6875\", \"-8.529773993911653209272999783778324026196719414411590092375294867302897481134537117581472896391856125\"}},\n           {{\"1.71875\", \"-6.709482397820695376442251396240149572345307174060614879543507453718786710576833294867753884694537068\"}},\n           {{\"1.75\", \"-5.520379922509330168089935698420205500301122430036809938027371836902288281994865833387763391132527793\"}},\n           {{\"1.78125\", \"-4.681280325336429567316481395066494078522124421106252324368679821712511116596067067167862140573504461\"}},\n           {{\"1.8125\", \"-4.056414052170035671394695838412072312925972547334020477371203912084804008892977770267448199074447777\"}},\n           {{\"1.84375\", \"-3.572185661861125859870109039981697499670205624150737204067785923886464814599307447743073100872203818\"}},\n           {{\"1.875\", \"-3.185238919501229169914672833591055563068190813252958079987355697225012578404488535638528315769681186\"}},\n           {{\"1.90625\", \"-2.868371726567042158384165205507273428429609298347592604875428057959086996590505442480814626239318494\"}},\n           {{\"1.9375\", \"-2.603652912010850547260718033703880538638622594696262109914178307203938532760442947667909676035790898\"}},\n           {{\"1.96875\", \"-2.378782114044268462754557076702009514149544247914950239975234530609231791907385965883627186285245033\"}},\n           {{\"2\", \"-2.185039863261518991643306102313682543432017746227663164562955869966773747209194182319743542104728548\"}},\n           {{\"2.03125\", \"-2.016072402071886080344963601799448100479409508905552305715636690184075224937451135890591580854847922\"}},\n           {{\"2.0625\", \"-1.86713988123437020407782794323860043132451055327769468817959958079457004467338400013589662215485346\"}},\n           {{\"2.09375\", \"-1.734634103946532053863260773540976834775727590591832428183425859927779370855756294581920109583545138\"}},\n           {{\"2.125\", \"-1.615759423973460045704218998135983105718634789435135146363364502252797531256854000679335498343468236\"}},\n           {{\"2.15625\", \"-1.508315836353881219959349807787957061590021089263168744744644715237923771519750208817662219357365791\"}},\n           {{\"2.1875\", \"-1.410548011813148830578875195416796900655621273730614063607851296345238287109255775298602026828637775\"}},\n           {{\"2.21875\", \"-1.321038011883972941371242354544773427461451983076687172335288474134737150563349929598365091185906691\"}},\n           {{\"2.25\", \"-1.238627616224096475286573358483115818987811679840895892063010057942989763968416082248247538779346115\"}},\n           {{\"2.28125\", \"-1.162361144121629479886631062456510653121514437736910570208484412489182649570861593071569298439919991\"}},\n           {{\"2.3125\", \"-1.091442725473163592445273166049218471062020679322657236270267019564600575624640388147984118518979059\"}},\n           {{\"2.34375\", \"-1.025203931548868392935198625444103909279764848147237361743751176005185409221197679274034521026108332\"}},\n           {{\"2.375\", \"-0.9630789471610371325783309326887526239686440615099207880230611368370468000350460791927023591069451265\"}},\n           {{\"2.40625\", \"-0.9045853091742213054875350240709441597937968403208608690036487459318455608785453421438664490396695609\"}},\n           {{\"2.4375\", \"-0.8493088059488314622450104194218363224080665638942044768228802750401486144919082454646163741529209686\"}},\n           {{\"2.46875\", \"-0.7968915235352686521345041809817019192899787435677815043081356746793473472915009329509869865385574704\"}},\n           {{\"2.5\", \"-0.747022297238660279355352687825274557904116956883011279066593089700271855760843718388592769933778409\"}},\n           {{\"2.53125\", \"-0.699429020084844342139783831016239425344370000759297142831905446726651787263273111657622358057530982\"}},\n           {{\"2.5625\", \"-0.653872397910572369605836837404416068498526729423046632151562590225826018439381877458767572737519508\"}},\n           {{\"2.59375\", \"-0.6101408409895599924272199138429116429964861640554001463611527892708422318404310839955568952517348978\"}},\n           {{\"2.625\", \"-0.5680462555551780726648895974757705443146437970424414412380682777625097984947690751561280498460825515\"}},\n           {{\"2.65625\", \"-0.5274205529869757121326571336563206310413652365485599902702063856643631953989601868253259786432770197\"}},\n           {{\"2.6875\", \"-0.4881127351190876547388242189029165584838796506348536005759885166591812246270986452391896414818116207\"}},\n           {{\"2.71875\", \"-0.4499864448356251166356611982487791354890745233650543094554613558499691453012194865420102877343872536\"}},\n           {{\"2.75\", \"-0.412917894484932487763966873261129123736255820362062889934249403216388494265361969753200463293305801\"}},\n           {{\"2.78125\", \"-0.3767941025635464453019403649599866905758314392515266200296815335892123350214817069316692446879993786\"}},\n           {{\"2.8125\", \"-0.3415113829599005939054709337126887266408130303329754956325710946559071503247227755879401227074384719\"}},\n           {{\"2.84375\", \"-0.3069740418053874743538801719778118186539092328300496832334808000582741898558068313989599567333495833\"}},\n           {{\"2.875\", \"-0.2730932453907306446782089914481699536905769611886147850801712661656164014954781669815730570254890551\"}},\n           {{\"2.90625\", \"-0.2397860292133634315864717364763276794949749917725083450148739709007738169658284872978100162537831057\"}},\n           {{\"2.9375\", \"-0.2069744234334290889140606202259876249518274239071734165293810142417092926391409078539182667795178826\"}},\n           {{\"2.96875\", \"-0.1745846741378176862031217701953393007964354401947395498383109594878301292911980508212117939922029155\"}},\n           {{\"3\", \"-0.1425465430742778052956354105339134932260922849018046476332389766888585952215385380591060583477669114\"}},\n           {{\"3.03125\", \"-0.1107926710961848652307179061543482824777047419183290635786540267776792824053626901819122659270065422\"}},\n           {{\"3.0625\", \"-0.07925799258597813975964847855303205226643624625818783981886842299834648957527837719024324414633813629\"}},\n           {{\"3.09375\", \"-0.04787918970239737242913390208792864526960233706882073548585416320272138422285616307162127608218497512\"}},\n           {{\"3.125\", \"-0.01659417649935840190191646601956655481659118246051776036792478758448298530865094236374141834995963483\"}},\n           {{\"3.15625\", \"0.01465839615112051363829193218735346545420611046761168233490628016451488745447998876530695315188732072\"}},\n           {{\"3.1875\", \"0.04593962329265888212191655478619122278727029224118607262776824432506068644004151566997697327162767079\"}},\n           {{\"3.21875\", \"0.07731082437922182842323045510047455560710445548270932232603347976675416898602720984389229982663062937\"}},\n           {{\"3.25\", \"0.1088340255133297195139603974000083015109646348076838424061656004036607221464457317348103204356071731\"}},\n           {{\"3.28125\", \"0.1405724535178196442425946789234394740490046721659763531803771463602023716095051057689530418533761391\"}},\n           {{\"3.3125\", \"0.172591050272744891901962315250310519786980119755314731828011976218754514667360156546007027602360458\"}},\n           {{\"3.34375\", \"0.2049570163396922924222670027465798026391019465616329916778651389384367221289434591672530287680469817\"}},\n           {{\"3.375\", \"0.237740393762143806988724415397077124401764815151774813277613941354927085310634989951327775643776322\"}},\n           {{\"3.40625\", \"0.2710146991120596316784994914008470605846614604634004480958302230976152416477575814862222371539690966\"}},\n           {{\"3.4375\", \"0.3048576194048116313509686061976383012732471442214687629070980813100980504220010433668547826451536192\"}},\n           {{\"3.46875\", \"0.33935178550149794902043849733017382894738729159656755127388089028458110314950118486374283672385814\"}},\n           {{\"3.5\", \"0.3745856401585946663305125799891473884508822842892592306930231225774355972615263725457922224498281269\"}},\n           {{\"3.53125\", \"0.4106544211005646795132687105613188412302653916099336518744517138690111552283413041415216571077234329\"}},\n           {{\"3.5625\", \"0.447661283553583556404846819303519593092219301719424669894622854440119111664920988209774876249304265\"}},\n           {{\"3.59375\", \"0.4857185918149514991806435613800961704649349211376530235980832426061445834319868210377502054789684188\"}},\n           {{\"3.625\", \"0.5249494159434426029201266393240939090334746308513972623727472919160131375298663507047002581644827389\"}},\n           {{\"3.65625\", \"0.5654892779403682511970427653303379875705726194565986095362182202060326386665976843463927284690694492\"}},\n           {{\"3.6875\", \"0.6074882023842700195137806696254362966726637333828709216522375901698082716779542882925451551904376524\"}},\n           {{\"3.71875\", \"0.6511131401046877694771154604832169765858772246556092408841970307496747807017677126165226354908150626\"}},\n           {{\"3.75\", \"0.6965508511114601330600221624003410002384063251948773727536766307711270568580190864635818668189622464\"}},\n           {{\"3.78125\", \"0.7440113559767865266278722337979770721544668975249127911732590346704528413537145792818180362367062195\"}},\n           {{\"3.8125\", \"0.7937320950520845038640709755691971987193904745863880210276991068348251595048327258835950484424829585\"}},\n           {{\"3.84375\", \"0.8459829748791345210684014414635237310065611239815471815195561711011715779741435605360151278986068963\"}},\n           {{\"3.875\", \"0.9010725345768489830226429310383860542057548011724428357500976339946729939388193110037885928433616767\"}},\n           {{\"3.90625\", \"0.9593555370605378999830231072930600308342084750238673386763085477722047681353378531697620720257631096\"}},\n           {{\"3.9375\", \"1.021242388200347736200680021836703924511025898807046899043703227626470466798902950286611342705663006\"}},\n           {{\"3.96875\", \"1.087210922446937924973630130633474302114867753655250594086911814333271884554141747835703519160797518\"}},\n           {{\"4\", \"1.157821282349577583137342418267323923119762767367142130084857189358985762063503791325897570132020188\"}},\n           {{\"4.03125\", \"1.233734886297294089608083483431716940428204649552146125435266924766182484146724296986257289579785258\"}},\n           {{\"4.0625\", \"1.315738861236497278595002752513023767487817470172494220905161864739955592222079472915707284820672627\"}},\n           {{\"4.09375\", \"1.404777873409928816791398747372142291632709052730067982243952454765008272213717678329031865335794425\"}},\n           {{\"4.125\", \"1.501996112821481350670183703711495663471610930233216088609964712367465201389736354667815373825067405\"}},\n           {{\"4.15625\", \"1.608793425833300449400383022559449738336897468383397721431496100147808519893555398680197430417094739\"}},\n           {{\"4.1875\", \"1.726901492741173774258474522465444605840834193796631414995320087774658896048364103982815258692096685\"}},\n           {{\"4.21875\", \"1.858488933532261262387603943116424040560957193049648082245398381173590809878153982869279424951736518\"}},\n           {{\"4.25\", \"2.006309027858059435312199733843025004203991000201116744630971025635743461495678364523854925961565933\"}},\n           {{\"4.28125\", \"2.173911671176453464233801926617652208987805422324233358984523813313677124319401603031463553334586795\"}},\n           {{\"4.3125\", \"2.365954706436810886261405424430153147538433069393544616996159851851045098884294543485330531184033036\"}},\n           {{\"4.34375\", \"2.58867360110912318951821732893635523217217883697807084314676743075156168098379747192932679404932885\"}},\n           {{\"4.375\", \"2.850612135014197347464512007371469511624647336547380863597026522958389351638925329325864211361675359\"}},\n           {{\"4.40625\", \"3.163800603288976619542297558662099459127776345948257172928079751633780670148333702513937775996967237\"}},\n           {{\"4.4375\", \"3.545737656638732611056781822478653525618506322500845353570490033964184425114602742381228738013800916\"}},\n           {{\"4.46875\", \"4.022897320897881433471367965265766624497222626661161034375557752511167850308209715183529923181209519\"}},\n           {{\"4.5\", \"4.63733205455118446831908669495962673002033167604849908135592490784364853630436659035964429989580423\"}},\n           {{\"4.53125\", \"5.460110732358225081268571201584576241967507554680233568022847841671382048904153089722943992228366072\"}},\n           {{\"4.5625\", \"6.621566538917184779658822397475662809951450423939232173471067230932326374886115835513736745573657993\"}},\n           {{\"4.59375\", \"8.389349373172668043480112406855801804399985563752529469857319424831372393351619823015010870227400011\"}},\n           {{\"4.625\", \"11.41394586984414667039249686700424655784704375419079662399301751232175345550471908433956600220150528\"}},\n           {{\"4.65625\", \"17.794217921195291872116110930917322871062931030345133311457707064544221956249568351463091932558272\"}},\n           {{\"4.6875\", \"40.17012705640036449304190879290789586501901676251470634007061519017512737181345480527620292167336129\"}},\n           {{\"4.71875\", \"-157.2053810419425516610333761767147984621064081691004376958977511691902151494982722512124394464246881\"}},\n           {{\"4.75\", \"-26.57541423100021444925624133456621507049828719711987551420375127874685894467704404079281767156965171\"}},\n           {{\"4.78125\", \"-14.49904303397407169401387138739025359024482851876427547784737429808056788404653273313794074954104547\"}},\n           {{\"4.8125\", \"-9.955517692663199659497301146983549868138803040917546840671025802878897403111578981570237166977305366\"}},\n           {{\"4.84375\", \"-7.568770928466597669950125714728032038595443682400782384350047230172533622281584347829485301888539665\"}},\n           {{\"4.875\", \"-6.095345265174791895543529207308251915058396610943153120402963827367536675687235397631104150517714925\"}},\n           {{\"4.90625\", \"-5.093551747761417849838605582864480592041118085930024194611183352044275362666663197560756285563557591\"}},\n           {{\"4.9375\", \"-4.366960809832423113382187614785174399552256061595826665894310062349100292377458713017173941901099366\"}},\n           {{\"4.96875\", \"-3.814918596744426621193354615307784649480559936141816068738250826073519922812423391628708426424484949\"}},\n           {{\"5\", \"-3.380515006246585636982705879447343908709569208285459877176820980918346010201206056831791856009410428\"}},\n           {{\"5.03125\", \"-3.029148102302771164961521436423971160566131129828714146460894246137584114582867735365596418294127015\"}},\n           {{\"5.0625\", \"-2.73856823245603647865430226656274757425295307326689315789016177502179223572750955725123296691662252\"}},\n           {{\"5.09375\", \"-2.493817050876063510228483889992811590654110757263765873027034424090589388194896708294715609776449821\"}},\n           {{\"5.125\", \"-2.284466361999853132376034939699606124682746442696980078901017290742647881722505799438755300967817548\"}},\n           {{\"5.15625\", \"-2.103023353734157432798966856819893312894278382156270431204069828145019096032929826221618815522735662\"}},\n           {{\"5.1875\", \"-1.94396519241478443283285298645374010314101176847753574637302261542129293949555826361500398886874374\"}},\n           {{\"5.21875\", \"-1.803131092461690600361529359360266463729989122374270260332052248390551413451160551386405337128358437\"}},\n           {{\"5.25\", \"-1.677326406624389127684834446781355734878514221167662440011355600468562011653802826535309338734910053\"}},\n           {{\"5.28125\", \"-1.564057206075927617852462348582481289639348906743456817576975327632362277790709160010002260498590699\"}},\n           {{\"5.3125\", \"-1.461347784441303570775301256747389266430752496556055422309798378517676612642129660840051802732712867\"}},\n           {{\"5.34375\", \"-1.36761235448791393113713404156603997628029078648313063442112198771680848353561063900933679869893461\"}},\n           {{\"5.375\", \"-1.281563046345464215429873432637423222317866003116950751512613373376845314748305445490135781753417754\"}},\n           {{\"5.40625\", \"-1.202142762311081825673780483344209940977316276937937096782702116019344314429792428912212274465011549\"}},\n           {{\"5.4375\", \"-1.128475389186388730418668294914420100814289081230956940736485357975544285270667364906582995184004442\"}},\n           {{\"5.46875\", \"-1.059828347715565927266867602143137996921061876523369816266086983272908895834550263458873978282357056\"}},\n           {{\"5.5\", \"-0.9955840522138850177019161740702867286905993509040201421089147368547994233084178348523042915084083077\"}},\n           {{\"5.53125\", \"-0.9352178996735373313249149491276249977722839556692437323635652451207536878974422360418217978053551773\"}},\n           {{\"5.5625\", \"-0.8782811077026627420028846442823333510762218192932291958379466783448865095622083395150126065512344446\"}},\n           {{\"5.59375\", \"-0.8243871973186229222115460053416379931615277523370335469512772188350449840600638037662602397836368723\"}},\n           {{\"5.625\", \"-0.7732012463758734614771474685457909254527078194270700631060606366411896649393019485319264721701600447\"}},\n           {{\"5.65625\", \"-0.7244312708999757737148502388902211557937330882505616499576249426224616653330080051888518816616123148\"}},\n           {{\"5.6875\", \"-0.6778212563139696041943536024958433042316769928076303165171422834039846729764625273526488517789737417\"}},\n           {{\"5.71875\", \"-0.6331454792161440424929262529011204753164261484247750443857435235991899745283883164285814469564729784\"}},\n           {{\"5.75\", \"-0.5902038468644901054170195032663081108054249240846444267071062035473153343668376567479794165486184472\"}},\n           {{\"5.78125\", \"-0.5488180452487470465583585186996023704202388711137425402809495353782052794835324270116435144444853907\"}},\n           {{\"5.8125\", \"-0.5088283340526268433264568968479225952416460593340160732760808861658301198202358775409378607410253813\"}},\n           {{\"5.84375\", \"-0.4700908624280941936361204610007198415053847982327139590868905985009927783431252538270334618349713453\"}},\n           {{\"5.875\", \"-0.4324754064907757695440115128522408464584984965503283137576460100497915888775090560945910034482914049\"}},\n           {{\"5.90625\", \"-0.3958634500577715728387322802090283590444850041488349012771936138475077409268246305105488709941047507\"}},\n           {{\"5.9375\", \"-0.3601465460097104261765989532960199175446047549989388477273964911510226366930877544365028188123550406\"}},\n           {{\"5.96875\", \"-0.3252249079465421281971924062604461228563045080514509080291865924060718896122952297947720584304400305\"}},\n           {{\"6\", \"-0.2910061913847491570536995888681755428311555709123391316088271933046559131122021519996248059475229616\"}},\n           {{\"6.03125\", \"-0.2574044312501190948926553260844066507272665964422420930835303888833069876363053415593229084989769505\"}},\n           {{\"6.0625\", \"-0.2243391083295019990486082083153394557139168759436924449745473819036543999446390847474833972561431122\"}},\n           {{\"6.09375\", \"-0.1917343220126000636733861789852210342976612418141698349764104452472624060435608559813294673409175422\"}},\n           {{\"6.125\", \"-0.1595180503486741129487427411798597329274963598657430717585348638114328150730071113710855848882228728\"}},\n           {{\"6.15625\", \"-0.1276214813658537291522157530092700353508309312306960197241502999632222071779029887930485312029959035\"}},\n           {{\"6.1875\", \"-0.09597840190639155007190320592294119000151190572960121328263061886000450929267149036536453259308092125\"}},\n           {{\"6.21875\", \"-0.06452463203653075216342354397349405171379838323909874171208799994716724111404978040328803565744248937\"}},\n           {{\"6.25\", \"-0.03319749448301144438419631194317525127766038457693080701966081495473675499225984399367237591921526005\"}},\n           {{\"6.28125\", \"-0.001935309595765553843691829525274435788517976054625627169224279956186864996201309127614969112751901202\"}},\n           {{\"6.3125\", \"0.02932309291350979792274199376680897224174579057648744678958323756547521586508413864276599103614351545\"}},\n           {{\"6.34375\", \"0.06063885372047505801221326406404454670246033034497805406862823133882341608599003383282431176702261307\"}},\n           {{\"6.375\", \"0.09207356314350050835492397132807778236841887606137324897895572241559097713132233298612222140840431269\"}},\n           {{\"6.40625\", \"0.1236897479096077296070838372979705928368188283231838414804934929274025398571452124588393065510099759\"}},\n           {{\"6.4375\", \"0.1555513736514298191439929689618245053471522825437403514671018199418895089031472964835239198291348668\"}},\n           {{\"6.46875\", \"0.1877243718114725376401948692378642961122451437059168414418744613043681130520375192781612678122611322\"}},\n           {{\"6.5\", \"0.220277200345896811825735903245910395013134783433298671312565971040207859095962733489570927809983752\"}},\n           {{\"6.53125\", \"0.253281448628424489171015810263074415662213222146436493340123226398154356922736152388141063544543841\"}},\n           {{\"6.5625\", \"0.2868124983022992902396435016696204994189572656467726352599962917225918966603261177449285587256173481\"}},\n           {{\"6.59375\", \"0.3209502535782458942725336084114371332732723992168430541003499245591367871623197594684565991267905584\"}},\n           {{\"6.625\", \"0.3557799567143647005420612267605866339037398845912245431900523492992941964222774204935357299525662811\"}},\n           {{\"6.65625\", \"0.3913931072527633586303310805574337028074307951034635414359349547707586122479246892158861767238081689\"}},\n           {{\"6.6875\", \"0.4278885071761893999613016206982314187458164558702387841850210320754507932238151571774989545334487634\"}},\n           {{\"6.71875\", \"0.4653734586819128141559933341200671578345456984030117446615279672146457039797505409854792515433603876\"}},\n           {{\"6.75\", \"0.5039651470083475548132524571742890116543823430974166616625221219450482100216791892806202009417424483\"}},\n           {{\"6.78125\", \"0.5437922480355643338730870787135605883829637094412174029296025101763018004204025974330398781596165429\"}},\n           {{\"6.8125\", \"0.5849968096716556782374159174641655681779685895667304240747256104820508784969531169383146463204412289\"}},\n           {{\"6.84375\", \"0.6277364679474334892591612082171255002710958195004825881252644517358490289176441185242244713866378973\"}},\n           {{\"6.875\", \"0.6721870741034611638659173114401257239025537597591200195749563598359978601937626091399638175089362186\"}},\n           {{\"6.90625\", \"0.7185458288995548400076077740862700950460682676000352992576300205153430366069275776925317595307700138\"}},\n           {{\"6.9375\", \"0.7670350464671162556530262845461572442649216262010355745804068537455730294466119988902478588983034749\"}},\n           {{\"6.96875\", \"0.8179067044246350052260597321820256016080683284701549230268748786223049718597359248253027839270497755\"}},\n           {{\"7\", \"0.8714479827243187364564508896003135663222034245984200644480154523301674476556679351044748556811165168\"}},\n           {{\"7.03125\", \"0.927988055100702558366453168987743089267307369461721117972360539733706484657902890137954063374826404\"}},\n           {{\"7.0625\", \"0.9879064802291251594676053789880311203133455080943572829265181459625625927973428370265184881799942024\"}},\n           {{\"7.09375\", \"1.0516436537462216418830263449985522705286903110788757629051396054699693751826899237943523838887297\"}},\n           {{\"7.125\", \"1.119713940340697920929231941973033073135897434271449197914919579212768620587877263960959541708252549\"}},\n           {{\"7.15625\", \"1.192722326901007588684149485242155872646533354464514409876904886587006629927655098723914331692457874\"}},\n           {{\"7.1875\", \"1.271385753083766195102512866837447084316821755807112034055075019301218550802923593730276046614253933\"}},\n           {{\"7.21875\", \"1.356560730687106090381626490498188582130942795512557181635747233593968595718598671759051546605979157\"}},\n           {{\"7.25\", \"1.449279530126825400966804908182545262594041927922324311633865090981669827371184783228521282728877249\"}},\n           {{\"7.28125\", \"1.550798206734497978345598394969907597227586253061565831974177990152095709794984147425013361851865459\"}},\n           {{\"7.3125\", \"1.662661250535958572647253880444919849918733690439628459569418630367100238120581497993662350014826086\"}},\n           {{\"7.34375\", \"1.78678998697496418766617671089138013384203233815466866101103271149031802024685694556034074365409757\"}},\n           {{\"7.375\", \"1.925605576103531021088436315604614476223254075602410795428544750301783382496712246458936951616523844\"}},\n           {{\"7.40625\", \"2.082203514638078116771326575602059859463528643293617740928645387731580498162533103205305011512631601\"}},\n           {{\"7.4375\", \"2.26060669237264261355866723509904048590096081733761353611694012356866351200745710198451308329107618\"}},\n           {{\"7.46875\", \"2.466141609729379985621243345839389610788373993111041429799962056660510586368685947727836988290301937\"}},\n           {{\"7.5\", \"2.706013866772690776762802272387995008883446304522264964682388787620940583840910641036913840080466461\"}},\n           {{\"7.53125\", \"2.990217991868365275378986251269668199642886675694545360724616292050097614350992705530127905271866877\"}},\n           {{\"7.5625\", \"3.333032524336291185691514966848310245587002670642998146766838315216031204958906362527023258344720302\"}},\n           {{\"7.59375\", \"3.755592314437586774843968169016218401146579356484719112952387050721790775719524338750656820475167322\"}},\n           {{\"7.625\", \"4.290567124941375634141691032410770755182292184491365711713765284134592087921445364428118108025228059\"}},\n           {{\"7.65625\", \"4.991276730757292357917427430609014256293569739250152073504758948209194194425629988371488577185989884\"}},\n           {{\"7.6875\", \"5.9510718925579227833281678276540391546652969268664831508775318977823975271243707799244732578159289\"}},\n           {{\"7.71875\", \"7.349587230185289251288167334999299680627536804325241700547934306594013397091284138506685042660382893\"}},\n           {{\"7.75\", \"9.582397403456211211397313849974932847186773522851876679318331037683816539880381009086487008735246101\"}},\n           {{\"7.78125\", \"13.72492306901017608779850845108579464520662673186624419937919970195919428249551440291202224739747059\"}},\n           {{\"7.8125\", \"24.09322543772519084215097143980037097594901385135011887012038200799428585198794379628997732285582328\"}},\n           {{\"7.84375\", \"97.73268930511967729279698949083284985794762903146492273796908122393941623833579266193628175149777252\"}},\n           {{\"7.875\", \"-47.57043136522765090736927872199715977332175052521738553413789183297556632881030788665564177584345509\"}},\n           {{\"7.90625\", \"-19.11460505409424788533123395282424237931209756369617281068252559403871558997768678144456749005346186\"}},\n           {{\"7.9375\", \"-11.94556191307435573940630678240021478719574633441063345522218692801937432207824662871635357235633214\"}},\n           {{\"7.96875\", \"-8.674912622365588398920385347547421582720453172032529527100491584226967033946983107374195473719464544\"}},\n           {{\"8\", \"-6.799711455220378699925262759608633364881412661473712848121891484119304982720857546088989511220313601\"}},\n           {{\"8.03125\", \"-5.581950808689684669549294209348398629337304002995630540331278821921778288507014685935916701606576575\"}},\n           {{\"8.0625\", \"-4.726032195156837427410372612416284237028321048638455837876262548466898310633589798461547191163836986\"}},\n           {{\"8.09375\", \"-4.090461187975555242897409987452358342061343516721018283559611963305885456193756951211377465919516297\"}},\n           {{\"8.125\", \"-3.599001897974260972151248247566727216299014591900000335282979733754229851045581086180509810930082767\"}},\n           {{\"8.15625\", \"-3.206943184854794792051938572955176223102804950834430935020353335808782541779058955201736266932317623\"}},\n           {{\"8.1875\", \"-2.886329592416760158849088002905458575851623094189615497250550481681316568867901585210424096370674517\"}},\n           {{\"8.21875\", \"-2.618783945156319374614290552008768448544289531418583013216952580114253625700948540561589098351543348\"}},\n           {{\"8.25\", \"-2.391728174447109499408796092049518207948088283366738019362364536579358984891061627461448588900266354\"}},\n           {{\"8.28125\", \"-2.196262571237231366422169733787602194377870425422442983742466664711276453593062387209663908411122531\"}},\n           {{\"8.3125\", \"-2.025912262702788461190762240682190168816613310552683831653429045356666462021227127736084042613847923\"}},\n           {{\"8.34375\", \"-1.875853575963005310284960792984729880727224645450131943927210730483841090952411053279594957173517387\"}},\n           {{\"8.375\", \"-1.74241880761627240539700340437602803932808901813845968268891377391077356174950266498464542879686652\"}},\n           {{\"8.40625\", \"-1.622769124048113033597644536164719722449235338830292053581380926565132897863391794369515824501033615\"}},\n           {{\"8.4375\", \"-1.514672563181530134110926429438194143845293739750523302549165608155316405124742878421871789886842147\"}},\n           {{\"8.46875\", \"-1.416349739641873214089748540260482127074454913435673678582846741597865860350934848935327297727726336\"}},\n           {{\"8.5\", \"-1.326364327785606923837177509628989183019847616858933039728626565320594601352898256466729337047543442\"}},\n           {{\"8.53125\", \"-1.243543859514378322699255610900405730249411506966951588519354941299030591219071989214839064576899506\"}},\n           {{\"8.5625\", \"-1.166921477042600182902656425322990210134485019242760863805503078706720819497128002394896106356209544\"}},\n           {{\"8.59375\", \"-1.095692443843841888393214442111438580869887527193049760552789795233066505667689248095554577112371625\"}},\n           {{\"8.625\", \"-1.029181226242794530622671562005776602295969084821805226400002870767989174122034536280082461534287795\"}},\n           {{\"8.65625\", \"-0.9668162629797675117200288525867759956705289684684092618655305272884560415249588622588640534660859208\"}},\n           {{\"8.6875\", \"-0.9081104046373177832576347663891532295331575111187881417687389316634049160994876797510769206182893432\"}},\n           {{\"8.71875\", \"-0.8526455881926773939956486059670750827771160223765816890633669305249823793389660138647216198961396045\"}},\n           {{\"8.75\", \"-0.8000607122131663748996935033554250873516322431753295881939448427095672520914736920285067785494755945\"}},\n           {{\"8.78125\", \"-0.7500419570576314664068876238355166376078921127752475362685197014336164568978380363973382424380027378\"}},\n           {{\"8.8125\", \"-0.7023149914660190721137439943663886714896255005161995584377885528996116609571672651781263426423264383\"}},\n           {{\"8.84375\", \"-0.6566386479456336287953742502996364274330999062289317807304964691314686325574451710087769117377447232\"}},\n           {{\"8.875\", \"-0.6127997515327654285376783646363991279819055057055158641281938301880811035156798875165049539694804864\"}},\n           {{\"8.90625\", \"-0.5706088613603129182915651449940477497513792905530365057563881633464714239146849295760180740616051507\"}},\n           {{\"8.9375\", \"-0.529896739873168003806242065594283411489762262385879653776325422716635759568492302090915293632301029\"}},\n           {{\"8.96875\", \"-0.4905114059515517049978410600006085544703557897386518199219966407731976599471950962402695227799723485\"}},\n           {{\"9\", \"-0.4523156594418098405903708757987855343087169256619843288072463344895615552699928891423222740611696987\"}},\n           {{\"9.03125\", \"-0.4151849883541607117552210974950947708368354992200219503945689498048994961045141832240492234717107402\"}},\n           {{\"9.0625\", \"-0.3790057881989822857530457874776947516302198077664862408128815699029163107706671425087481058924528226\"}},\n           {{\"9.09375\", \"-0.3436738369929040836550521796260295565231979408984456062837271050291411394204206333260572683795806063\"}},\n           {{\"9.125\", \"-0.3090929803907614767471346771315481283472474354946281905565967857578879461207205702332049986857635056\"}},\n           {{\"9.15625\", \"-0.2751739899376987485248300510983424723605373451217689431344224438486165931202115441514245211478398115\"}},\n           {{\"9.1875\", \"-0.2418335641420615678638155264698574025131647248333694816193249713183100110082265076470052022707012095\"}},\n           {{\"9.21875\", \"-0.2089934473583106794872121428783074116994340488341375724854578952783525682316496422613143306038638671\"}},\n           {{\"9.25\", \"-0.1765796456511299761112751840598406521389487242985432214413528930195762314982591148356765022144220392\"}},\n           {{\"9.28125\", \"-0.144521722122150591814619269577170465800891448238859437753351534510505894724788264050561053752147101\"}},\n           {{\"9.3125\", \"-0.1127521567973819422597203631074129348120757432615503831725905368424112610292538623181492998345439551\"}},\n           {{\"9.34375\", \"-0.08120575823178342176032872038448411443172784451696952348584885928982452335749552547386985037617069992\"}},\n           {{\"9.375\", \"-0.0498191155899860392003104787951054631853528180570175470879940653716436714322811615959161544657494618\"}},\n           {{\"9.40625\", \"-0.01853008118625405320915271202115144102822290582324439033642733950763784110773883754760179758258022532\"}},\n           {{\"9.4375\", \"0.01272272563027105977935573889462983744829956962204063464126832673322950722546841176709360279348538747\"}},\n           {{\"9.46875\", \"0.04400040173584953885682440835958114627885199630660893827828903912727543614728912707303196060753625141\"}},\n           {{\"9.5\", \"0.07536423875739405740654014205323665789342966267450384287846707728875924157814476147945907817392192786\"}},\n           {{\"9.53125\", \"0.1068762048461025163674352287858142449224256724379234993543813605972685100190359293029737215855453465\"}},\n           {{\"9.5625\", \"0.1385994377761661718602480104778901941178589868631124656851160671189176086579048746331765092114253163\"}},\n           {{\"9.59375\", \"0.1705987577719601866335639057437200427987763331813918550294340474134857881430332967127222805799022305\"}},\n           {{\"9.625\", \"0.2029412090417411123603662227278784038776298381618810811646084653751029723759416476460088872408054991\"}},\n           {{\"9.65625\", \"0.2356966398441474632357392833080328068352054698543206659897268100728097017667724684606559049124154157\"}},\n           {{\"9.6875\", \"0.268938332074403309291166325486527607211725274017137932139784676368590535825858340593417854926297648\"}},\n           {{\"9.71875\", \"0.3027436928841933821970886411755473788376234496119460628913545818204169198969541686968930178216130025\"}},\n           {{\"9.75\", \"0.3371950228159297335621484819773554194812863370480952763499236064163820830033268339692324715894157813\"}},\n           {{\"9.78125\", \"0.3723803774359345699506506000690612357176932379964207743390433297005778841484733220050565284302113607\"}},\n           {{\"9.8125\", \"0.4083945426204256871181400863951603330453056915705065091908373104020696107020950522244595815242992\"}},\n           {{\"9.84375\", \"0.4453401476523343154827952361952568691359033281221121303793343966901885521315031273219697042193257942\"}},\n           {{\"9.875\", \"0.4833289453490298299990038076226424305503958067355696981733291906588949898848660168661363237230401676\"}},\n           {{\"9.90625\", \"0.5224832948561672053074357426518017813969502851835052528668887798173320745102979706674984553747785107\"}},\n           {{\"9.9375\", \"0.5629378909036186388354128640753191217895638800506841967942363059454826038558876839732857927717227769\"}},\n           {{\"9.96875\", \"0.6048417937509008993401606503437317082375426212574423350794174057182764889826011397690814642006452007\"}},\n           {{\"10\", \"0.6483608274590866712591249330098086768168743429837249756336279673958556003746239008717172062971522862\"}},\n           {{\"10.03125\", \"0.6936804314743542712398847790886887683057558913351293442530262309817850224201884209136086813403394689\"}},\n           {{\"10.0625\", \"0.7410090731101333158449425961247175839017373828496178608167740610459452518219259199024083200316084101\"}},\n           {{\"10.09375\", \"0.7905823581871925973468103245168030277845433796367670128316098222165598426689171297882306893568062531\"}},\n           {{\"10.125\", \"0.8426680163689236497241316220032744251657095955743734411730267063148126128540903336099720150350195161\"}},\n           {{\"10.15625\", \"0.8975719901861101829801016952033465293839624897512338971033212391126217276476390113488747550991133784\"}},\n           {{\"10.1875\", \"0.9556459274758633915064588099748061258315512098776637126437164255246444193412583209025710708854064641\"}},\n           {{\"10.21875\", \"1.017296473311965646505591388794303117791831049823203228782533350726187433458132860834038283268836837\"}},\n           {{\"10.25\", \"1.082996890215945275135930985916637983213229101767681562664207604721345006616414244816945101012068962\"}},\n           {{\"10.28125\", \"1.153301720414501166084164165377670663086784905305525053523750216145961391216299317767459210812275763\"}},\n           {{\"10.3125\", \"1.228865465058231603544476514726969780448778330773071834149679410133713041325810373844792660869193974\"}},\n           {{\"10.34375\", \"1.310466629156747359552320115718026861262813059499884349607868463460206624928464716803324337065850131\"}},\n           {{\"10.375\", \"1.399039024262115717131604647733708995170160567832938194238903453989697561972061091597355404503662754\"}},\n           {{\"10.40625\", \"1.49571302349195916111981867105861656396166182988283681852423319036111614206596318006249059781485835\"}},\n           {{\"10.4375\", \"1.601870670512520509271426433671643695090231605946938642547694243879213679699085414650549829075718711\"}},\n           {{\"10.46875\", \"1.719220395521651499721208794808194478968865549194510942718291121399341439043920644901884496910696737\"}},\n           {{\"10.5\", \"1.849899993421927279907583573513910565419553685959044018741794327382830123593588324994882461965573398\"}},\n           {{\"10.53125\", \"1.996621179417850643664093294309064624983038139124591902589207528735600835709855269195187933895652101\"}},\n           {{\"10.5625\", \"2.162876723677546330469959787105963848827689014945066557592989408260164364548287694286197662196239537\"}},\n           {{\"10.59375\", \"2.3532442330793790868766441879841993750130572630209439743618231460831573709883106394866434440837641\"}},\n           {{\"10.625\", \"2.573843631271674362526537866893410697197766596999920083319154750577002457483161716337803596844925106\"}},\n           {{\"10.65625\", \"2.833047421190427952095570132770964879184235914846751261896726812931990128759669900544999535061769791\"}},\n           {{\"10.6875\", \"3.142623220176844496098570587446827716363816198180813628746017544330426339542323699691642256030772053\"}},\n           {{\"10.71875\", \"3.519650155321593637030342256680131753850278370827948246193900683195030354927519452141570420409057437\"}},\n           {{\"10.75\", \"3.989898450288877172272878730129464264004901452428968181149190336688176169073686050444717716156454253\"}},\n           {{\"10.78125\", \"4.594165609870243515783279467995060486532380531283432068617070247011706442921648714627407953983920726\"}},\n           {{\"10.8125\", \"5.401101953070107889048337369479695723086844105989269027204537226522869955593746957868263836003479647\"}},\n           {{\"10.84375\", \"6.535875415517406207251199308597767679104658091064327476058394143828942638073632382427758536504917985\"}},\n           {{\"10.875\", \"8.253411766339305537723460693388679535974907155823982004597806731192500887738499761977958603336992426\"}},\n           {{\"10.90625\", \"11.16537284500979684723686544686940420453225367789354062936636940962591367864691678374577954865828186\"}},\n           {{\"10.9375\", \"17.1999620041711094734838984205883317149769089588687370821690524219299315809266573264745104659869829\"}},\n           {{\"10.96875\", \"37.27070620721793879698276661020742630154681506539144657714408230209752760393928366701053772541231071\"}},\n           {{\"11\", \"-225.9508464541951420257954832034531539516575098851311946310945881123661134104031654779989090875181672\"}},\n           {{\"11.03125\", \"-28.01838123473997016830887833476199550560697066011986939559933525309909705318537405182199378012840027\"}},\n           {{\"11.0625\", \"-14.91962506867234581945151895985710289930225918712794589354339983163930894702818997439864076091931126\"}},\n           {{\"11.09375\", \"-10.15307233756673521728139815893864848321827456537331024001764086854554203725293661816927668294489745\"}},\n           {{\"11.125\", \"-7.683249828520493578856827081745572284486853920128557099054138395954224416767780846216824234128741871\"}},\n           {{\"11.15625\", \"-6.170065007339837672004969274368706522165797321914087418607341946608032746141308987068347258026539261\"}},\n           {{\"11.1875\", \"-5.146216397928971013498356330072590228022047015189051411856482418633925739244947714746552179251733944\"}},\n           {{\"11.21875\", \"-4.406134215367990783634732996136714284665546485639321948525683144032506137127272195504713779988841399\"}},\n           {{\"11.25\", \"-3.845243526046256589195292015214843119217023542577367989034898325348687250589462590349993156554307721\"}},\n           {{\"11.28125\", \"-3.404725196340913894767892653680241020178288686778598191582702368768260415894176917496336011269246961\"}},\n           {{\"11.3125\", \"-3.048957435167265586183006322737827462691340358802500561060757089057213237102895081676386924312658609\"}},\n           {{\"11.34375\", \"-2.755105539085522466956356685286240136460553349428076133380205505661678601069631697225730693586354901\"}},\n           {{\"11.375\", \"-2.507856046343293846165268336837981024254374791359792671451310995149841786950224129840033693800933455\"}},\n           {{\"11.40625\", \"-2.296555085357014688557714000971300925194148838031073606034513705752180239656706450912207637184212202\"}},\n           {{\"11.4375\", \"-2.113560858723099424307258719446955475134681339177645144130883477669849838830392714536871823793018366\"}},\n           {{\"11.46875\", \"-1.953248965442351814769641861822757418968218808226145477990020040801933787597505710461744957513141637\"}},\n           {{\"11.5\", \"-1.811387450326824859772397320474032833639713335926721521705076560469479148263546424971811321096648723\"}},\n           {{\"11.53125\", \"-1.684730597525019137697751820797269016453098562968854704274935631922618587469362028272636692210544871\"}},\n           {{\"11.5625\", \"-1.570747064811472615228088301480862011854346986220267355439332676174065617757164643849543074172144195\"}},\n           {{\"11.59375\", \"-1.467433230574720919411941987695161181959171583863783447843463212366085434611122065381627004242638947\"}},\n           {{\"11.625\", \"-1.373182138457896453349468046455100980035443259553659899722906361390876088856423969181083376455705666\"}},\n           {{\"11.65625\", \"-1.286689630920366616376314221177221139006716016538511655589760746532540573609680625603641074608188434\"}},\n           {{\"11.6875\", \"-1.206885914221201720054271911345572193315238450358663840449617121968073512366326525649980278803416278\"}},\n           {{\"11.71875\", \"-1.132884861825656481798873135046969210301345541577298019300751660619960162890235612177970957925478595\"}},\n           {{\"11.75\", \"-1.063945912486004409710559363045985530861938320222047288703751234746510874929602501339045816423036172\"}},\n           {{\"11.78125\", \"-0.9994450559333915167440624304322053019403928948191033206551515159313846021422418864273459645373449009\"}},\n           {{\"11.8125\", \"-0.9388524723222944773205643428254523492068640072627707382490811032852295370278108292005146916272238994\"}},\n           {{\"11.84375\", \"-0.881715108900528303919177723946502416645736801861050134491985441499235913287446780705353461545417442\"}},\n           {{\"11.875\", \"-0.8276429652929236471146892695710241706925495072977152657326004944101623406458452837545349486881138268\"}},\n           {{\"11.90625\", \"-0.7762981960095720820932228114020179373213795483270746275212139165301756520252573166217954465331159458\"}},\n           {{\"11.9375\", \"-0.7273863753138267917778418153001732955258816548283145725251801363629114248343367970028832122142992284\"}},\n           {{\"11.96875\", \"-0.6806494377457210277597470928336025589584620324058462321470850608946457200573674297093242265437051282\"}},\n           {{\"12\", \"-0.6358599286615807924609379429390076061509587586686860914514606814656551214484123291399643068894751555\"}},\n           {{\"12.03125\", \"-0.5928162873294508906897144974924364212100987037074180867630829726623330818215300743873013630492129075\"}},\n           {{\"12.0625\", \"-0.5513389500434250704976885869765975030435162971228425993732710884431519725994082993307502135366704687\"}},\n           {{\"12.09375\", \"-0.5112671090040856778211886692327830312529713244160725823950417285454010972749346501560988873183882094\"}},\n           {{\"12.125\", \"-0.472455998959126666328373026314261347130558625459848565935809588092219192527888607849005967299526205\"}},\n           {{\"12.15625\", \"-0.4347746110466813389220145482909141465629503223075144609806539759358566301078783883593960376790796208\"}},\n           {{\"12.1875\", \"-0.3981037542382981122358374348325646108510087325306228562334315140437947730049798142715674391074029588\"}},\n           {{\"12.21875\", \"-0.3623344008952777173267729097645609415931859827734307762367947830110639831467043405387353622176899024\"}},\n           {{\"12.25\", \"-0.3273662654331959909797507119051924955282853934206185144087221653583658953364484322496982215172064596\"}},\n           {{\"12.28125\", \"-0.2931065748149348906573126400315634011327627839945547849105543140713203189089283254450491988430709458\"}},\n           {{\"12.3125\", \"-0.2594689972120933396662267471796226223140842016040887149108653318448105627021634377488137220685751418\"}},\n           {{\"12.34375\", \"-0.2263727011714726746425617255174464360665584672063083345910005855017649693977414015628137560181413471\"}},\n           {{\"12.375\", \"-0.1937415223592955920421472499371716132396126974936842056246045191659136204224066400221303821918510103\"}},\n           {{\"12.40625\", \"-0.1615032187034938758288345646836288312549849485871893783750506125037934982810946747034471565118071181\"}},\n           {{\"12.4375\", \"-0.1295887977200466002615144930375243133915724779506460096421464176334192279649808190617654665646655393\"}},\n           {{\"12.46875\", \"-0.09793190214949804406939767223801097423536917158984066549241688209747906679339832186909184479038423885\"}},\n           {{\"12.5\", \"-0.06646824186327419610199266949441387194390610792357612079517505380578030434009894147743014400122005453\"}},\n           {{\"12.53125\", \"-0.03513506141616282076636047393093268566965509833708523530838721391339373252314877573835767237228949322\"}},\n           {{\"12.5625\", \"-0.003870633688692445796420680716701608075985971581256241161345780831826430572573689071744247468488929075\"}},\n           {{\"12.59375\", \"0.02738622916941998236655243276631287278486472025157424329703232697741123275406245628528750156873296529\"}},\n           {{\"12.625\", \"0.05869665578128338112635128913606850911677921227526205464651894469274626817414600063862113806671147531\"}},\n           {{\"12.65625\", \"0.09012219459725165729474121609816933257302657281344601700769732387220992191083677289387048548334265912\"}},\n           {{\"12.6875\", \"0.1217252999603408610668897042413571531127645503736599822403036205555496676066474076056000689949341066\"}},\n           {{\"12.71875\", \"0.1535698333828775342772949638706552097777256705040011551078273258533143177119249497623834514512966756\"}},\n           {{\"12.75\", \"0.1857215886751401902594186441708939448272141506734588329272148156845153012668419405756499880982943312\"}},\n           {{\"12.78125\", \"0.2182488502657797346752690950871572837813792443000041521932413723748578742375061893600646885986149118\"}},\n           {{\"12.8125\", \"0.2512229950428828425999138094132092852018197118941615412720196242900796512859843472371170313836583775\"}},\n           {{\"12.84375\", \"0.2847191493692259054394416502657415422614131291273802036428533121457701035912610846112501083132620008\"}},\n           {{\"12.875\", \"0.3188169146481101964165914224483354040480603343474688683709071564169780696806924149291320418944830542\"}},\n           {{\"12.90625\", \"0.3536011770209831976646321735648611242564793780159081807119024532891168112397727872069370118132852613\"}},\n           {{\"12.9375\", \"0.389163019575800390066324389631248715515481435421443727622672043630746566664120384677948936473787333\"}},\n           {{\"12.96875\", \"0.4256007589819842824595519481972026675555296385735056063290277948532474177383987445148843331908874667\"}},\n           {{\"13\", \"0.4630211329364895955117902835081206683532120959519440470950206693928302579327807145125758116501924079\"}},\n           {{\"13.03125\", \"0.5015406704601738993466207755375547536965260852964643732753893793547109382261801451895601761930463122\"}},\n           {{\"13.0625\", \"0.5412872842615681585626378992160244527886510964571032692368478641312818490839188830849928560962861538\"}},\n           {{\"13.09375\", \"0.5824021335357886328662589223215248727421699777193264549116653046243519880397055116969487363618353957\"}},\n           {{\"13.125\", \"0.6250418172930577232327055575810817395750497037126950514585195397519699819130820731538599564259401139\"}},\n           {{\"13.15625\", \"0.6693809734298055686754246761212833674742679018564325405072602539903766997859347462285344333571366362\"}},\n           {{\"13.1875\", \"0.7156153783773706463324211230116191534127258818669295732823217991324981875804470761472072117982861964\"}},\n           {{\"13.21875\", \"0.7639656678174816067986696149135126827704120185065555912507382354963651332883430075609034401555571502\"}},\n           {{\"13.25\", \"0.8146818327614344736464451806034453710444224291621571573625236805118070729970340362557654528804594448\"}},\n           {{\"13.28125\", \"0.8680486902251570873258425734584921956065820604675624643643164481487468794096033758920520511975882962\"}},\n           {{\"13.3125\", \"0.9243925880092635749600582006440809362226783655074073519865821148035556209179629462013383469424274175\"}},\n           {{\"13.34375\", \"0.984089684751991735962930471741445607987192320278600727525448404432994693600540790050738561865588772\"}},\n           {{\"13.375\", \"1.04757625822842897028900134354672689006793126569323519874122370449523706721491998653522405351511\"}},\n           {{\"13.40625\", \"1.115361649708918497565229580465214098442269312226313131576538895853120727413355048723361997440716611\"}},\n           {{\"13.4375\", \"1.188044669282090096413968423531415025467187597047077575491037309801518019505454161493737933958668965\"}},\n           {{\"13.46875\", \"1.266334595496805761839284321117713547689424188079416196364317291844437171872585239983180116380091394\"}},\n           {{\"13.5\", \"1.351078347287010480371085577712699470101212829099407611657174914155576868564657173832374341089513584\"}},\n           {{\"13.53125\", \"1.443296057137394170028536177718664041051292527024487177527337760724543655637891131854085251072201818\"}},\n           {{\"13.5625\", \"1.544228244055125768572769325179666059641117940456933228593668266762756226316757718141030898582889678\"}},\n           {{\"13.59375\", \"1.65539925635608625536146268504299540984757874423396346584219270902415141849546774423536235044651061\"}},\n           {{\"13.625\", \"1.778703933748487611100295794480392286774372855795510955005500225382241572963111907877924106343034439\"}},\n           {{\"13.65625\", \"1.916528050760659646742064707886848214342582893475968412683323141359371632373241621750396872855231387\"}},\n           {{\"13.6875\", \"2.071918975654530318165994049833557729201414960634819277207514404216213840009455116234485076356302166\"}},\n           {{\"13.71875\", \"2.248832798150414958768559692131859458258869348641929756045263587943996112471489439485863476093034658\"}},\n           {{\"13.75\", \"2.452501131436276534259505261160229408535827308333544989748716942417182101185885609613251793631088723\"}},\n           {{\"13.78125\", \"2.689991141885544485574819071146851902487462547699495662222675009146133600868249015967786252574495347\"}},\n           {{\"13.8125\", \"2.971088997454883061146937345921981294715821069297105784485484470539822403438727250351950923586461683\"}},\n           {{\"13.84375\", \"3.309747852278236334086030022253642441335045150382837946015733966046635972988597769925369044448793434\"}},\n           {{\"13.875\", \"3.726571412380592611642200928513525816649689030739311675986112325390668863787780356510815096395312152\"}},\n           {{\"13.90625\", \"4.253314099623669334835259848593744934346239237141072606237802004691075608138259425654524049734148683\"}},\n           {{\"13.9375\", \"4.941607147834976432334070015221138910450692007921150173618524899066416996751652602822476062787651509\"}},\n           {{\"13.96875\", \"5.881399525150031955799636707531603412059246766703476508448423108137501182284498677930575806202198028\"}},\n           {{\"14\", \"7.244606616094805116868776904419943839744730261240134752545587919443539234559937291680749763590851956\"}},\n           {{\"14.03125\", \"9.406028188605279696133223875198323737712453281000019998207973537233195589286463672078393783342949057\"}},\n           {{\"14.0625\", \"13.36790967265482265511197119971831749461310263946778620293662813338523575832270133240885318460296722\"}},\n           {{\"14.09375\", \"23.0180098105772480411418077991835591801343058014965291845911306402355660736744079654039102037142972\"}},\n           {{\"14.125\", \"82.18587088008837479889498738727608856213126524631858084352266182200806013924238364295643998983071042\"}},\n           {{\"14.15625\", \"-52.39613928846073424250555787725052081495348867793023995281290229927733884543365803704289494278819236\"}},\n           {{\"14.1875\", \"-19.85087749437963381473636677142019044036915990708056158011806608744982156130940528545579140382954901\"}},\n           {{\"14.21875\", \"-12.23024032878110918179097238079573616977352169397336130087278904329232109578073694396971060087189843\"}},\n           {{\"14.25\", \"-8.825007825823643194479070661167279551172813025945214108644920017576189426949178857879125100439566237\"}},\n           {{\"14.28125\", \"-6.892346926954325909059194856822673062063097995636142714599547668355292064875194893124728097012275365\"}},\n           {{\"14.3125\", \"-5.644866498825540128381929944705578552248933555730964244899773528736917184084590171390597212873718595\"}},\n           {{\"14.34375\", \"-4.771610252795610046024685797665514766422880378783577882983742818079026166693261845053770481989424557\"}},\n           {{\"14.375\", \"-4.125051680440956814255997242162117938555651270642110578618995113301257483035180159821309310658332941\"}},\n           {{\"14.40625\", \"-3.626194314229776036712561256911661725676439848577743170654748551410882288678506147976699754338337632\"}},\n           {{\"14.4375\", \"-3.228918544653384166822369480885301355908586468628448310353628937744136710166892378083809771029038072\"}},\n           {{\"14.46875\", \"-2.904489208401961365438740405970863838028715766433251544998958231462070708355920879083964796103033733\"}},\n           {{\"14.5\", \"-2.634069132503832833409607035052858278935807513368801311481801280408668028920599740332367971681453643\"}},\n           {{\"14.53125\", \"-2.404794639925577553244012746285864594559572350297129379452932406519481483010765023196033751578709703\"}},\n           {{\"14.5625\", \"-2.207581089523679545128355853946391835592464237094323506839360879131859583353800754571132350944473674\"}},\n           {{\"14.59375\", \"-2.035829586659772321235017007716845648434117124540496962900856683971781311984497273615528750368081422\"}},\n           {{\"14.625\", \"-1.884630768865435904935595378906947231717012177189752377379403964925875302521199447518722408719775981\"}},\n           {{\"14.65625\", \"-1.750256190835124208623312849116061326812165846025415986783560739453729962659158203940996884358758139\"}},\n           {{\"14.6875\", \"-1.629822991609989147184189043054819627629510818289435539398133590083260226275976603564527843030512624\"}},\n           {{\"14.71875\", \"-1.521066667289361457373930052890176846963182405346389200320517277799503677666772192617687500257521097\"}},\n           {{\"14.75\", \"-1.42218336083774197380789085745137021789867848279597800468450871698744869740438289092755542692570482\"}},\n           {{\"14.78125\", \"-1.331718058572613129017722401996663023341875099157808098995252549045562547044521935057437210333349552\"}},\n           {{\"14.8125\", \"-1.248483823169844883793467308858957913772012915051151771810074084965259104516379708093866536649015936\"}},\n           {{\"14.84375\", \"-1.171502454280969620050113939757468091964527953537892858826299161314598145955301346129774398985079725\"}},\n           {{\"14.875\", \"-1.09996022360423379094065298284739111500559223495806048377446355428125902586706149601540328954397664\"}},\n           {{\"14.90625\", \"-1.033174396383465269461739738697259215672589493553897443441659340076220701053186730617856132398548093\"}},\n           {{\"14.9375\", \"-0.9705675907155131163149460322607739770705545946870992276893226926978460501228871025636381103213358614\"}},\n           {{\"14.96875\", \"-0.9116479124475490508064737825953723368462225788875404013990634500526165327350899245784037598875471869\"}},\n           {{\"15\", \"-0.8559934009085187640261927782380296049897864414742962979687446281783012594486541122545103129259226012\"}},\n           {{\"15.03125\", \"-0.8032397302332296612432159755337281904284459733163994877022298441144059785603187789136637043263789466\"}},\n           {{\"15.0625\", \"-0.7530703960754939484978446924032015414437125508200990314934869704250553438069278960228507610120908637\"}},\n           {{\"15.09375\", \"-0.7052088187318415299725928408540094093554358958059088325375638362095004704432693353838375709463129551\"}},\n           {{\"15.125\", \"-0.659411937622644225218300893404169827076548649885412227383887901950221923526355502978543776575055119\"}},\n           {{\"15.15625\", \"-0.6154649762727536414801474029122625793755198617269250343988631456453788448149731706979351529235579577\"}},\n           {{\"15.1875\", \"-0.5731771332183040948793178896118867037269598773610412277642977614409075169432893108977656087532808068\"}},\n           {{\"15.21875\", \"-0.5323780107028691176788965668440942781647156607765742951342412648358988559400799809724920990286528734\"}},\n           {{\"15.25\", \"-0.4929146351866012621666401573415074523464609163340854530825224584649245974424596583470196176643838565\"}},\n           {{\"15.28125\", \"-0.4546489554738299415350063572461193751006928326854122963028434583535719327916356408447934270192962049\"}},\n           {{\"15.3125\", \"-0.4174557284251085623680148206370333657407709127949181945517726979253617292255491330234726669774559159\"}},\n           {{\"15.34375\", \"-0.3812207207302419203446046603506711987787377766806738457878506795815713138223264722913354548269137032\"}},\n           {{\"15.375\", \"-0.3458391695028422582485004568448026536356203654713446806415710694635885346246660520826948870993463705\"}},\n           {{\"15.40625\", \"-0.311214455551825073642663079591570618837743590849903018274057606911872122304533000910107606645650336\"}},\n           {{\"15.4375\", \"-0.2772569518534830079599506190692912755868921271423525814120233867695893487373304945292237740353757468\"}},\n           {{\"15.46875\", \"-0.2438830165543173054192587099181568413614402066070223778896735213919894343566763962867244846621486138\"}},\n           {{\"15.5\", \"-0.2110141052012553133863173741408514435037061655011970687100846880180438182550528565062101594891245018\"}},\n           {{\"15.53125\", \"-0.1785759811388596991279739233477573236616687666102227187311862264495771634608666297275574790232136991\"}},\n           {{\"15.5625\", \"-0.1464980063716879847555275878278898667317766571375499828106145375100216949704230935552550931052323183\"}},\n           {{\"15.59375\", \"-0.1147124978452713735943481847220917786442201384229215777788278473922030662630912256721375261600875605\"}},\n       }};\n\n   unsigned max_err = 0;\n   for (unsigned k = 0; k < data.size(); k++)\n   {\n      T        val = tan(T(data[k][0]));\n      T        e   = relative_error(val, T(data[k][1]));\n      unsigned err = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         max_err = err;\n      }\n      val = tan(-T(data[k][0]));\n      e   = relative_error(val, T(-T(data[k][1])));\n      err = e.template convert_to<unsigned>();\n      if (err > max_err)\n      {\n         max_err = err;\n      }\n   }\n   std::cout << \"Max error was: \" << max_err << std::endl;\n\n   if (has_poor_large_value_support<T>::value)\n   {\n      T bug_value = 12 / std::numeric_limits<T>::epsilon();\n      for (unsigned i = 0; i < 20; ++i, bug_value *= 1.1)\n      {\n         BOOST_TEST(tan(bug_value) == 0);\n      }\n   }\n}\n\nint main()\n{\n#ifdef TEST_BACKEND\n   test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();\n#endif\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::mpf_float_50>();\n   test<boost::multiprecision::mpf_float_100>();\n#endif\n#ifdef TEST_MPFR_50\n   test<boost::multiprecision::mpfr_float_50>();\n   test<boost::multiprecision::mpfr_float_100>();\n#endif\n#ifdef TEST_MPFI_50\n   test<boost::multiprecision::mpfi_float_50>();\n   test<boost::multiprecision::mpfi_float_100>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>();\n   test<boost::multiprecision::cpp_dec_float_100>();\n#ifndef SLOW_COMPLER\n   // Some \"peculiar\" digit counts which stress our code:\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();\n   // Check low multiprecision digit counts.\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >();\n#endif\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_tanh.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Christopher Kormanyos 2002 - 2011.\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n// This work is based on an earlier work:\n// \"Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations\",\n// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT)\n#define TEST_MPF_50\n#define TEST_MPFR_50\n#define TEST_MPFI_50\n#define TEST_BACKEND\n#define TEST_CPP_DEC_FLOAT\n#define TEST_FLOAT128\n#define TEST_CPP_BIN_FLOAT\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#if defined(TEST_MPFR_50)\n#include <boost/multiprecision/mpfr.hpp>\n#endif\n#if defined(TEST_MPFI_50)\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n#ifdef TEST_BACKEND\n#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n#include <boost/multiprecision/cpp_dec_float.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#endif\n\ntemplate <class T>\nvoid test()\n{\n   std::cout << \"Testing type: \" << typeid(T).name() << std::endl;\n   static const boost::array<const char*, 51u> data =\n       {{\n           \"0.32137338579537729992840434899278935725496267444911714908205287462634251052210833615032073534299473485492692600156322137421801432333125051088723502425037485776412801577568405892077585206768190530859883094571475323319480739773193974206966728764224286661945738178210577326172938196062277314761537881936346874075881338768208490193827960565412814349738654540520356903367084438822830345189856017860672463017\",\n           \"0.98628073997374759901559180515206275902189609982907214282364143439537215491113710345866034807991101303183938339561499559327886956280789743287824488269072297413440935381715378233031399015496124706604318545539544610760151756970229801074280545428642122005982857974921606264103186878499260552388713716032507770319550435738767597150644370033277228635793175246197730488375240713357827246166262087899961098648\",\n           \"0.99999659728082161113542951278514830809677661658635225532792520501703544628367875293677270218317428676793098034276042396396797568103263882451732810190507733063467333056356770774002596898762991629653041854653269824642873291146068535300466473399592751219449187768646625229500705182676930009096545254478199838990703077597971823456671241141900968900216742636822174010867343154474773040184900973368250708724\",\n           \"0.9999999999846483268200051609594321550129159997920576480976206867496512752486590660437091205989616108531910897733432934135954788151766561209164605337537937873588006552145390152387235783207736999759875845070169747521389728857476525437483543080651125798739562649414879487621858466223255239845627205850217328574865852922872737234283038190096982410137471391847466112651349436875974689271288261759782261321\",\n           \"0.9999999999999999987314527242099750648171958211319474558707792311593804963057878814487720997303512134007272111464990650500302215773762906820778949397525329109311974741708703536680512747226155618703318739024344621256722269608969415280035337052044425138281821760268269187377517243951584969175035549994883451471918693502477485385682884154959809285569290940740978684264145737164182111806308430952867505356\",\n           \"0.9999999999999999999999999980800953069847308586840237590563929855339557065536765765234844240789584487443451033349994294426525006157530320529970966048109743850154174651033567146346966529198814047607015842020039899630884318521543225160212193994911746894335846264878066530266737005606770102869237101848445559941638381625615207320468184414917265299980278164193202897754476112968080358662232635784904263624\",\n           \"0.9999999999999999999999999999999999999467800140220866754762922747687784133233134010432889959570821554455247528344437918197518545105332713456859236726383195243056599177018396579766073961540714510399202497404647103138524118065391185503678895059096790300665805648569647351935897874460587855127436472608470703384261586158923066272124216158518232588330799027603391275039552776308636189531809031683723259525\",\n           \"0.9999999999999999999999999999999999999999999999999729795912960133359928587562229512337339217831178574875626619226954752643039860388090399659478676726654102118545764943682017611574275691203710439707807193180604656837503862242700430179591666329131728631752773789406064618682879167351725013888294859467540832310795515139677375807407622028485242969471516812171475098378942187864794497220152019202351747432\",\n           \"0.9999999999999999999999999999999999999999999999999999999999999997487354938310440650220692519525261552411539996830587326435051159231522052011310872619940247463640019105467860778515384738650636054646551611609757125760437266415865214306396520500343113189907306851418957620080971645943305760132385139924583154317156560414548076370893360020924960120441059315311380109752919823616149973862196846266297710225\",\n           \"0.9999999999999999999999999999999999999999999999999999999999999999999999999999999572050575304159358359221596743379014313563214857593401545331495211888415913558896516895286943572966865708195832339959764445194449615969154689769557903166971249521898883489362426386924297872088925852892350150865941427355319827260914834268754732102528105919811851193667193380541054520023003326858641189063542651960743457613\",\n           \"0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999998665016733514821204959171836698281165918083005790816030823236096080522860514417075411055633676502699904415882389102672678124683084429720879962355892225321369091298491658349178472270952759208443767848312111069127329160464884932271685986610697222434145553035947750809388321614695213754318979469071722942883\",\n           \"0.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999992372516628147584832950728021842198359205201519966391076994594773600474674435473005118571751514446148292787696117866094991476340344341061706866751156257825144909115117822189019766805825304055482958970512463798453229341693148012213183553546720540880444569824125592343803193018989122964\",\n           \"0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999920180539244323143459416025663362517256166793900312667214543096238752838226369161775531456005541374878274529461511286842988937830155704737448202558382612829022464635400289328916240002670783433827234852858267621807568393874737879853500598862298495727481132883728328\",\n           \"0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999998470116425957155787153557938061034698436461173594805292722874130433614266475136267606498346730583487791266503943659174886554170377537630914770998114573340081594827150737005158607830579000912020838690230498119348251553312722575955142752845289\",\n           \"0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999462931048083476382670449719737943481963930626760625326765703815392249622625483433043363664396638162612437367800102332819699131841317348173451308570776544874933173719394861336636728378134900422312720743996219523365098\",\n           \"0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999996546783689748726752364896615532860288057097437452774779386074906915819380531729493071959232887620213723607155628959529584572083388979892309086717786559916703004365603135284141639480887703759\",\n           \"0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999593332381019647939423999969519583099837564321056588766269967853479478603122899456262904869063959564274215899007623362296377022418464303752396325625838280378647335\",\n           \"0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999122842714667567128203355585346559126606029196080721845292399104475997315344844970601651757832506169948906646054332493537761143729664\",\n           \"0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999965347272050374435790597917065458623422102880662825928396981295898014081371503733411536311258910851858\",\n           \"0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999974926240515037403282500845454464621558236030794140169313830052413917\",\n           \"0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999667705192725716176070161727364499\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n           \"1.\",\n       }};\n\n   T eg = static_cast<T>(\"5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1\");\n\n   unsigned max_err = 0;\n   for (unsigned k = 0; k < data.size(); k++)\n   {\n      const T  x   = eg + k;\n      T        val = boost::multiprecision::tanh(x * x);\n      T        e   = relative_error(val, T(data[k]));\n      unsigned err = e.template convert_to<unsigned>();\n      if (err > max_err)\n         max_err = err;\n   }\n   std::cout << \"Max error was: \" << max_err << std::endl;\n   BOOST_TEST(max_err < 100);\n}\n\nint main()\n{\n#ifdef TEST_BACKEND\n   test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();\n#endif\n#ifdef TEST_MPF_50\n   test<boost::multiprecision::mpf_float_50>();\n   test<boost::multiprecision::mpf_float_100>();\n#endif\n#ifdef TEST_MPFR_50\n   test<boost::multiprecision::mpfr_float_50>();\n   test<boost::multiprecision::mpfr_float_100>();\n#endif\n#ifdef TEST_MPFI_50\n   test<boost::multiprecision::mpfi_float_50>();\n   test<boost::multiprecision::mpfi_float_100>();\n#endif\n#ifdef TEST_CPP_DEC_FLOAT\n   test<boost::multiprecision::cpp_dec_float_50>();\n   test<boost::multiprecision::cpp_dec_float_100>();\n#ifndef SLOW_COMPLER\n   // Some \"peculiar\" digit counts which stress our code:\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();\n#endif\n#endif\n#ifdef TEST_FLOAT128\n   test<boost::multiprecision::float128>();\n#endif\n#ifdef TEST_CPP_BIN_FLOAT\n   test<boost::multiprecision::cpp_bin_float_50>();\n   test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_test.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2011 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include \"test.hpp\"\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\nvoid proc_that_throws()\n{\n   throw std::runtime_error(\"\");\n}\n\nint main()\n{\n   boost::multiprecision::cpp_dec_float_50 a1(1), a2(1), b(3), c(-2);\n\n   BOOST_WARN(a1);\n   BOOST_WARN(a1 == b);\n   BOOST_CHECK(a1);\n   BOOST_CHECK(a1 == b);\n   BOOST_CHECK(boost::detail::test_errors() == 1);\n   --boost::detail::test_errors();\n\n   boost::multiprecision::cpp_dec_float_50 a_tol = a1 + a1 * 100 * std::numeric_limits<boost::multiprecision::cpp_dec_float_50>::epsilon();\n   boost::multiprecision::cpp_dec_float_50 tol   = 100 * std::numeric_limits<boost::multiprecision::cpp_dec_float_50>::epsilon();\n\n   BOOST_CHECK_CLOSE(a1, a_tol, tol * 102); // Passes\n   BOOST_WARN_CLOSE(a1, a_tol, tol * 98);   // fails\n   BOOST_CHECK_CLOSE(a1, a_tol, tol * 98);  // fails\n   BOOST_CHECK(boost::detail::test_errors() == 1);\n   --boost::detail::test_errors();\n\n   BOOST_CHECK_CLOSE_FRACTION(a1, a_tol, tol * 1.02); // Passes\n   BOOST_WARN_CLOSE_FRACTION(a1, a_tol, tol * 0.98);  // fails\n   BOOST_CHECK_CLOSE_FRACTION(a1, a_tol, tol * 0.98); // fails\n   BOOST_CHECK(boost::detail::test_errors() == 1);\n   --boost::detail::test_errors();\n\n   BOOST_CHECK_EQUAL(a1, a2);\n   BOOST_WARN_EQUAL(a1, b);\n   BOOST_CHECK_EQUAL(a1, b);\n   BOOST_CHECK(boost::detail::test_errors() == 1);\n   --boost::detail::test_errors();\n\n   BOOST_CHECK_NE(a1, b);\n   BOOST_WARN_NE(a1, a2);\n   BOOST_CHECK_NE(a1, a2);\n   BOOST_CHECK(boost::detail::test_errors() == 1);\n   --boost::detail::test_errors();\n\n   BOOST_CHECK_GT(a1, c);\n   BOOST_WARN_GT(a1, a2);\n   BOOST_CHECK_GT(a1, a2);\n   BOOST_CHECK(boost::detail::test_errors() == 1);\n   --boost::detail::test_errors();\n\n   BOOST_CHECK_LT(a1, b);\n   BOOST_WARN_LT(a1, a2);\n   BOOST_CHECK_LT(a1, a2);\n   BOOST_CHECK(boost::detail::test_errors() == 1);\n   --boost::detail::test_errors();\n\n   BOOST_CHECK_GE(a1, a2);\n   BOOST_CHECK_GE(a1, c);\n   BOOST_WARN_GE(a1, b);\n   BOOST_CHECK_GE(a1, b);\n   BOOST_CHECK(boost::detail::test_errors() == 1);\n   --boost::detail::test_errors();\n\n   BOOST_CHECK_LE(a1, a2);\n   BOOST_CHECK_LE(a1, b);\n   BOOST_WARN_LE(a1, c);\n   BOOST_CHECK_LE(a1, c);\n   BOOST_CHECK(boost::detail::test_errors() == 1);\n   --boost::detail::test_errors();\n\n#ifndef BOOST_NO_EXCEPTIONS\n   BOOST_CHECK_THROW(proc_that_throws(), std::runtime_error);\n   BOOST_CHECK_THROW(a1 + b + c, std::runtime_error);\n#endif\n   BOOST_CHECK(boost::detail::test_errors() == 1);\n   --boost::detail::test_errors();\n\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_threaded_precision.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2021 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <thread>\n#include <boost/detail/lightweight_test.hpp>\n#include <boost/array.hpp>\n#include <boost/math/special_functions/relative_difference.hpp>\n#include <boost/math/special_functions/gamma.hpp>\n#include <boost/math/quadrature/tanh_sinh.hpp>\n#include \"test.hpp\"\n\n#if !defined(TEST_MPF_50) && !defined(TEST_MPFR_50)\n#define TEST_MPF_50\n#define TEST_MPFR_50\n\n#ifdef _MSC_VER\n#pragma message(\"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\")\n#endif\n#ifdef __GNUC__\n#pragma warning \"CAUTION!!: No backend type specified so testing everything.... this will take some time!!\"\n#endif\n\n#endif\n\n#include <boost/multiprecision/mpfr.hpp>\n\n#if defined(TEST_MPF_50)\n#include <boost/multiprecision/gmp.hpp>\n#endif\n\ntemplate <class T>\nvoid thread_test_proc(unsigned digits)\n{\n   typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<1000> > mpfr_float_1000;\n\n   if (!mpfr_buildopt_tls_p())\n      return;\n\n   T::thread_default_precision(digits);\n\n   T result, value;\n\n   value = boost::math::constants::pi<T>();\n   result.assign(boost::math::constants::pi<mpfr_float_1000>().str());\n   BOOST_CHECK_LE(boost::math::epsilon_difference(value, result), 20);\n   BOOST_CHECK_EQUAL(value.precision(), digits);\n\n   for (unsigned i = 20; i < 500; ++i)\n   {\n      T arg(i);\n      arg /= 3;\n      value = boost::math::tgamma(arg);\n      BOOST_CHECK_EQUAL(value.precision(), digits);\n      result.assign(boost::math::tgamma(mpfr_float_1000(arg)).str());\n      BOOST_CHECK_LE(boost::math::epsilon_difference(value, result), 800);\n   }\n\n   //\n   // Try tanh_sinh integration:\n   //\n   using namespace boost::math::constants;\n   boost::math::quadrature::tanh_sinh<T> integrator;\n   T                                     tol = 500;\n   // Example 1:\n   auto f1         = [](const T& t) { return static_cast<T>(t * boost::math::log1p(t)); };\n   T Q          = integrator.integrate(f1, (T)0, (T)1);\n   T Q_expected = half<T>() * half<T>();\n   BOOST_CHECK_EQUAL(Q.precision(), digits);\n   BOOST_CHECK_EQUAL(Q_expected.precision(), digits);\n   BOOST_CHECK_LE(boost::math::epsilon_difference(Q, Q_expected), tol);\n\n   // Example 2:\n   auto f2    = [](const T& t) { return static_cast<T>(t * t * atan(t)); };\n   Q          = integrator.integrate(f2, (T)0, (T)1);\n   Q_expected = (pi<T>() - 2 + 2 * ln_two<T>()) / 12;\n   BOOST_CHECK_EQUAL(Q.precision(), digits);\n   BOOST_CHECK_EQUAL(Q_expected.precision(), digits);\n   BOOST_CHECK_LE(boost::math::epsilon_difference(Q, Q_expected), tol);\n\n   // Example 3:\n   auto f3    = [](const T& t) { return static_cast<T>(exp(t) * cos(t)); };\n   Q          = integrator.integrate(f3, (T)0, half_pi<T>());\n   Q_expected = boost::math::expm1(half_pi<T>()) * half<T>();\n   BOOST_CHECK_EQUAL(Q.precision(), digits);\n   BOOST_CHECK_EQUAL(Q_expected.precision(), digits);\n   BOOST_CHECK_LE(boost::math::epsilon_difference(Q, Q_expected), tol);\n\n   // Example 4:\n   auto f4    = [](T x) -> T { T t0 = sqrt(x*x + 2); return atan(t0)/(t0*(x*x+1)); };\n   Q          = integrator.integrate(f4, (T)0, (T)1);\n   Q_expected = 5 * pi<T>() * pi<T>() / 96;\n   BOOST_CHECK_EQUAL(Q.precision(), digits);\n   BOOST_CHECK_EQUAL(Q_expected.precision(), digits);\n   BOOST_CHECK_LE(boost::math::epsilon_difference(Q, Q_expected), tol);\n\n   // Example 5:\n   auto f5    = [](const T& t)->T { return sqrt(t) * log(t); };\n   Q          = integrator.integrate(f5, (T)0, (T)1);\n   Q_expected = -4 / (T)9;\n   BOOST_CHECK_EQUAL(Q.precision(), digits);\n   BOOST_CHECK_EQUAL(Q_expected.precision(), digits);\n   BOOST_CHECK_LE(boost::math::epsilon_difference(Q, Q_expected), tol);\n\n   // Example 6:\n   auto f6    = [](const T& t)->T { return sqrt(1 - t * t); };\n   Q          = integrator.integrate(f6, (T)0, (T)1);\n   Q_expected = pi<T>() / 4;\n   BOOST_CHECK_EQUAL(Q.precision(), digits);\n   BOOST_CHECK_EQUAL(Q_expected.precision(), digits);\n   BOOST_CHECK_LE(boost::math::epsilon_difference(Q, Q_expected), tol);\n}\n\nint main()\n{\n#ifdef TEST_MPF_50\n   {\n      std::thread t1(thread_test_proc<boost::multiprecision::mpf_float>, 35);\n      std::thread t2(thread_test_proc<boost::multiprecision::mpf_float>, 55);\n      std::thread t3(thread_test_proc<boost::multiprecision::mpf_float>, 75);\n      std::thread t4(thread_test_proc<boost::multiprecision::mpf_float>, 105);\n      std::thread t5(thread_test_proc<boost::multiprecision::mpf_float>, 305);\n\n      t1.join();\n      t2.join();\n      t3.join();\n      t4.join();\n      t5.join();\n   }\n#endif\n#ifdef TEST_MPFR_50\n   {\n      std::thread t1(thread_test_proc<boost::multiprecision::mpfr_float>, 35);\n      std::thread t2(thread_test_proc<boost::multiprecision::mpfr_float>, 55);\n      std::thread t3(thread_test_proc<boost::multiprecision::mpfr_float>, 75);\n      std::thread t4(thread_test_proc<boost::multiprecision::mpfr_float>, 105);\n      std::thread t5(thread_test_proc<boost::multiprecision::mpfr_float>, 305);\n\n      t1.join();\n      t2.join();\n      t3.join();\n      t4.join();\n      t5.join();\n   }\n#endif\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_trailing_io_delim.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2022 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt).\n\n#ifdef TEST_CPP_INT\n#include <boost/multiprecision/cpp_int.hpp>\n#include <boost/multiprecision/cpp_bin_float.hpp>\n#include <boost/multiprecision/cpp_complex.hpp>\n#endif\n#ifdef TEST_GMP\n#include <boost/multiprecision/gmp.hpp>\n#endif\n#ifdef TEST_TOMMATH\n#include <boost/multiprecision/tommath.hpp>\n#endif\n#ifdef TEST_FLOAT128\n#include <boost/multiprecision/float128.hpp>\n#include <boost/multiprecision/complex128.hpp>\n#endif\n#ifdef TEST_MPC\n#include <boost/multiprecision/mpc.hpp>\n#endif\n#ifdef TEST_MPFI\n#include <boost/multiprecision/mpfi.hpp>\n#endif\n\n#include <sstream>\n#include \"test.hpp\"\n\ntemplate <class T>\nvoid test_integer()\n{\n   std::istringstream iss(\"123#\");\n   T                  val;\n   iss >> val;\n   BOOST_CHECK_EQUAL(val, 123);\n}\n\ntemplate <class T>\nvoid test_rational()\n{\n   {\n      std::istringstream iss(\"123#\");\n      T                  val;\n      iss >> val;\n      BOOST_CHECK_EQUAL(val, 123);\n   }\n   {\n      std::istringstream iss(\"123/23#\");\n      T                  val;\n      iss >> val;\n      BOOST_CHECK_EQUAL(val, T(123, 23));\n   }\n}\n\ntemplate <class T>\nvoid test_float()\n{\n   std::istringstream iss(\"123.0#\");\n   T                  val;\n   iss >> val;\n   BOOST_CHECK_EQUAL(val, 123.0);\n}\n\ntemplate <class T>\nvoid test_complex()\n{\n   {\n      std::istringstream iss(\"123.0#\");\n      T                  val;\n      iss >> val;\n      BOOST_CHECK_EQUAL(val, 123.0);\n   }\n   {\n      std::istringstream iss(\"(123.0,23.0)#\");\n      T                  val;\n      iss >> val;\n      BOOST_CHECK_EQUAL(val, T(123.0, 23.0));\n   }\n}\n\ntemplate <class T>\nvoid test_interval()\n{\n   {\n      std::istringstream iss(\"123.0#\");\n      T                  val;\n      iss >> val;\n      BOOST_CHECK_EQUAL(val, 123.0);\n   }\n   {\n      std::istringstream iss(\"{123.0,124.0}#\");\n      T                  val;\n      iss >> val;\n      std::cout << val << std::endl;\n      BOOST_CHECK_EQUAL(val, T(123.0, 124.0));\n   }\n}\n\n\nint main()\n{\n#ifdef TEST_CPP_INT\n   test_integer<boost::multiprecision::cpp_int>();\n   test_rational<boost::multiprecision::cpp_rational>();\n   test_float<boost::multiprecision::cpp_bin_float_50>();\n   test_complex<boost::multiprecision::cpp_complex_50>();\n#endif\n#ifdef TEST_GMP\n   test_integer<boost::multiprecision::mpz_int>();\n   test_rational<boost::multiprecision::mpq_rational>();\n   test_float<boost::multiprecision::mpf_float_50>();\n#endif\n#ifdef TEST_TOMMATH\n   test_integer<boost::multiprecision::tom_int>();\n   test_rational<boost::multiprecision::tom_rational>();\n#endif\n#ifdef TEST_FLOAT128\n   test_float<boost::multiprecision::float128>();\n   test_complex<boost::multiprecision::complex128>();\n#endif\n#ifdef TEST_MPC\n   test_float<boost::multiprecision::mpfr_float_50>();\n   test_complex<boost::multiprecision::mpc_complex_50>();\n#endif\n#ifdef TEST_MPFI\n   test_interval<boost::multiprecision::mpfi_float_50>();\n#endif\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/test_unchecked_cpp_int.cpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright 2017 John Maddock. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n//\n// Check results of truncated overflow.\n//\n\n#ifdef _MSC_VER\n#define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include <boost/multiprecision/cpp_int.hpp>\n#include \"test.hpp\"\n#include <boost/random/mersenne_twister.hpp>\n#include <boost/random/uniform_int.hpp>\n\ntemplate <class T>\nT generate_random(unsigned bits_wanted)\n{\n   static boost::random::mt19937               gen;\n   typedef boost::random::mt19937::result_type random_type;\n\n   T        max_val;\n   unsigned digits;\n   if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits))\n   {\n      max_val = (std::numeric_limits<T>::max)();\n      digits  = std::numeric_limits<T>::digits;\n   }\n   else\n   {\n      max_val = T(1) << bits_wanted;\n      digits  = bits_wanted;\n   }\n\n   unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1;\n   while ((random_type(1) << bits_per_r_val) > (gen.max)())\n      --bits_per_r_val;\n\n   unsigned terms_needed = digits / bits_per_r_val + 1;\n\n   T val = 0;\n   for (unsigned i = 0; i < terms_needed; ++i)\n   {\n      val *= (gen.max)();\n      val += gen();\n   }\n   val %= max_val;\n   return val;\n}\n\ntemplate <class Number>\nvoid test()\n{\n   using namespace boost::multiprecision;\n   typedef Number test_type;\n\n   for (unsigned i = 30; i < std::numeric_limits<test_type>::digits; ++i)\n   {\n      for (unsigned j = std::numeric_limits<test_type>::digits - i - 1; j < std::numeric_limits<test_type>::digits; ++j)\n      {\n         for (unsigned k = 0; k < 10; ++k)\n         {\n            test_type a = static_cast<test_type>(generate_random<cpp_int>(i));\n            test_type b = static_cast<test_type>(generate_random<cpp_int>(j));\n            test_type c = static_cast<test_type>(cpp_int(a) * cpp_int(b));\n            test_type d = a * b;\n            BOOST_CHECK_EQUAL(c, d);\n\n            if ((k == 0) && (j == 0))\n            {\n               for (unsigned s = 1; s < std::numeric_limits<test_type>::digits; ++s)\n                  BOOST_CHECK_EQUAL(a << s, test_type(cpp_int(a) << s));\n            }\n         }\n      }\n   }\n}\n\nint main()\n{\n   using namespace boost::multiprecision;\n\n   test<int512_t>();\n   test<uint512_t>();\n\n   //\n   // We also need to test type with \"odd\" bit counts in order to ensure full code coverage:\n   //\n   test<number<cpp_int_backend<528, 528, signed_magnitude, unchecked, void> > >();\n   test<number<cpp_int_backend<528, 528, unsigned_magnitude, unchecked, void> > >();\n   test<number<cpp_int_backend<48, 48, signed_magnitude, unchecked, void> > >();\n   test<number<cpp_int_backend<48, 48, unsigned_magnitude, unchecked, void> > >();\n   return boost::report_errors();\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/timer.hpp",
    "content": "///////////////////////////////////////////////////////////////\n//  Copyright Beman Dawes 1994-99.\n//  Copyright 2020 John Maddock.\n//  Copyright 2022 Christopher Kormanyos.\n//  Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_MP_TIMER_HPP\n#define BOOST_MP_TIMER_HPP\n\n#include <chrono>\n\n// This file now reflects the 2022 work-over. We have replaced the\n// original timer facility (which had been based on std::clock())\n// with C++11's equivalent <chrono> counterparts.\n\nnamespace boost { namespace multiprecision { namespace test_detail {\n\ntemplate <class ClockType = std::chrono::high_resolution_clock>\nstruct stopwatch;\n\ntemplate <class ResultType,\n          class ClockType = std::chrono::high_resolution_clock>\nclass timer_template;\n\ntemplate <class ClockType>\nstruct stopwatch\n{\nprivate:\n   using clock_type = ClockType;\n\npublic:\n   using duration_type = typename clock_type::duration;\n\n   stopwatch() : m_start(clock_type::now()) { }\n\n   stopwatch(const stopwatch& other) : m_start(other.m_start) { }\n   stopwatch(stopwatch&& other) noexcept : m_start(other.m_start) { }\n\n   auto operator=(const stopwatch& other) -> stopwatch&\n   {\n      if(this != &other)\n      {\n         m_start = other.m_start;\n      }\n\n      return *this;\n   }\n\n   auto operator=(stopwatch&& other) noexcept -> stopwatch&\n   {\n      m_start = other.m_start;\n\n      return *this;\n   }\n\n   ~stopwatch() { }\n\n   auto elapsed() const -> duration_type\n   {\n      return (clock_type::now() - m_start);\n   }\n\n   auto elapsed_max() const -> duration_type\n   {\n      return (std::chrono::time_point<clock_type>::max)() - m_start;\n   }\n\n   static constexpr auto elapsed_min() -> duration_type\n   {\n      return (std::chrono::time_point<clock_type>::min)() -  std::chrono::time_point<clock_type>();\n   }\n\n   void reset()\n   {\n      m_start = clock_type::now();\n   }\n\nprivate:\n   typename clock_type::time_point m_start;\n};\n\n\ntemplate <class ResultType,\n          class ClockType>\nclass timer_template : public stopwatch<ClockType>\n{\nprivate:\n   using clock_type      = ClockType;\n   using base_class_type = stopwatch<clock_type>;\n\npublic:\n   using result_type = ResultType;\n\n   timer_template() { }\n\n   ~timer_template() { }\n\n   void restart() { base_class_type::reset(); }\n\n   auto elapsed() const -> result_type\n   {\n      // Return the elapsed time in seconds.\n      return std::chrono::duration_cast<std::chrono::duration<result_type>>(base_class_type::elapsed()).count();\n   }\n\n   auto elapsed_max() const -> result_type\n   {\n      return std::chrono::duration_cast<std::chrono::duration<result_type>>(base_class_type::elapsed_max()).count();\n   }\n\n   static constexpr auto elapsed_min() -> result_type\n   {\n      return std::chrono::duration_cast<std::chrono::duration<result_type>>(base_class_type::elapsed_min()).count();\n   }\n\n   static constexpr result_type seconds(result_type s) { return static_cast<result_type>(s * static_cast<result_type>(1)); }\n\n};\n\n} // namespace test_detail\n} // namespace multiprecision\n} // namespace boost\n\n// TODO: Might prefer to have the relatively common\n// name \"timer\" to be shielded with a namespace.\n\nusing timer = boost::multiprecision::test_detail::timer_template<double, std::chrono::high_resolution_clock>;\n\n#endif // BOOST_MP_TIMER_HPP\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/common/init.hpp",
    "content": "/*\n * Copyright (c) 2004 Michael Stevens\n * Use, modification and distribution are subject to the\n * Boost Software License, Version 1.0. (See accompanying file\n * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n */\n\n/*\n * Default construct test when possible\n */\n\ntemplate <class E>\nstruct default_construct\n{\n   static void test() {}\n};\ntemplate <class VC>\nstruct default_construct<boost::numeric::ublas::vector_container<VC> >\n{\n   static void test()\n   {\n      VC default_constuct;\n      initialize_vector(default_constuct);\n      std::cout << \"default construct = \" << default_constuct << std::endl;\n   }\n};\ntemplate <class MC>\nstruct default_construct<boost::numeric::ublas::matrix_container<MC> >\n{\n   static void test()\n   {\n      MC default_constuct;\n      initialize_vector(default_constuct);\n      std::cout << \"default construct = \" << default_constuct << std::endl;\n   }\n};\n\n/*\n * Initialise test values in vector/matrix\n */\n\ntemplate <class V>\nvoid initialize_vector(V& v)\n{\n   typename V::size_type size = v.size();\n   for (typename V::size_type i = 0; i < size; ++i)\n      v[i] = typename V::value_type(i + 1.f);\n}\n\ntemplate <class M>\nvoid initialize_matrix_impl(M& m, ublas::packed_proxy_tag)\n{\n   typename M::size_type size1 = m.size1();\n#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION\n   for (typename M::iterator1 i = m.begin1(); i != m.end1(); ++i)\n      for (typename M::iterator2 j = i.begin(); j != i.end(); ++j)\n         *j = typename M::value_type(i.index1() * size1 + j.index2() + 1.f);\n#else\n   for (typename M::iterator1 i = m.begin1(); i != m.end1(); ++i)\n      for (typename M::iterator2 j = ublas::begin(i, ublas::iterator1_tag()); j != ublas::end(i, ublas::iterator1_tag()); ++j)\n         *j = typename M::value_type(i.index1() * size1 + j.index2() + 1.f);\n#endif\n}\n\ntemplate <class M>\nvoid initialize_matrix_impl(M& m, ublas::sparse_proxy_tag)\n{\n   typename M::size_type size1 = m.size1();\n   typename M::size_type size2 = m.size2();\n   for (typename M::size_type i = 0; i < size1; ++i)\n      for (typename M::size_type j = 0; j < size2; ++j)\n         m(i, j) = typename M::value_type(i * size1 + j + 1.f);\n}\n\ntemplate <class M>\nvoid initialize_matrix(M& m)\n{\n   initialize_matrix_impl(m, typename M::storage_category());\n}\n\ntemplate <class M>\nvoid initialize_matrix(M& m, ublas::lower_tag)\n{\n   typename M::size_type size1 = m.size1();\n   typename M::size_type size2 = m.size2();\n   for (typename M::size_type i = 0; i < size1; ++i)\n   {\n      typename M::size_type j = 0;\n      for (; j <= i; ++j)\n         m(i, j) = i * size1 + j + 1.f;\n      for (; j < size2; ++j)\n         m(i, j) = 0.f;\n   }\n}\ntemplate <class M>\nvoid initialize_matrix(M& m, ublas::upper_tag)\n{\n   typename M::size_type size1 = m.size1();\n   typename M::size_type size2 = m.size2();\n   for (typename M::size_type i = 0; i < size1; ++i)\n   {\n      typename M::size_type j = 0;\n      for (; j < i; ++j)\n         m(i, j) = 0.f;\n      for (; j < size2; ++j)\n         m(i, j) = i * size1 + j + 1.f;\n   }\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/common/testhelper.hpp",
    "content": "// Copyright 2008 Gunter Winkler <guwi17@gmx.de>\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef _HPP_TESTHELPER_\n#define _HPP_TESTHELPER_\n\n#include <utility>\n\nstatic unsigned _success_counter = 0;\nstatic unsigned _fail_counter    = 0;\n\nstatic inline void assertTrue(const char* message, bool condition)\n{\n#ifndef NOMESSAGES\n   std::cout << message;\n#endif\n   if (condition)\n   {\n      ++_success_counter;\n      std::cout << \"1\\n\"; // success\n   }\n   else\n   {\n      ++_fail_counter;\n      std::cout << \"0\\n\"; // failed\n   }\n}\n\ntemplate <class T>\nvoid assertEquals(const char* message, T expected, T actual)\n{\n#ifndef NOMESSAGES\n   std::cout << message;\n#endif\n   if (expected == actual)\n   {\n      ++_success_counter;\n      std::cout << \"1\\n\"; // success\n   }\n   else\n   {\n#ifndef NOMESSAGES\n      std::cout << \" expected \" << expected << \" actual \" << actual << \" \";\n#endif\n      ++_fail_counter;\n      std::cout << \"0\\n\"; // failed\n   }\n}\n\nstatic std::pair<unsigned, unsigned> getResults()\n{\n   return std::make_pair(_success_counter, _fail_counter);\n}\n\ntemplate <class M1, class M2>\nbool compare(const boost::numeric::ublas::matrix_expression<M1>& m1,\n             const boost::numeric::ublas::matrix_expression<M2>& m2)\n{\n   size_t size1 = (std::min)(m1().size1(), m2().size1());\n   size_t size2 = (std::min)(m1().size2(), m2().size2());\n   for (size_t i = 0; i < size1; ++i)\n   {\n      for (size_t j = 0; j < size2; ++j)\n      {\n         if (m1()(i, j) != m2()(i, j))\n            return false;\n      }\n   }\n   return true;\n}\n\ntemplate <class M1, class M2>\nbool compare(const boost::numeric::ublas::vector_expression<M1>& m1,\n             const boost::numeric::ublas::vector_expression<M2>& m2)\n{\n   size_t size = (std::min)(m1().size(), m2().size());\n   for (size_t i = 0; i < size; ++i)\n   {\n      if (m1()(i) != m2()(i))\n         return false;\n   }\n   return true;\n}\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test1.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test1.hpp\"\n\nint main()\n{\n   test_vector();\n   test_matrix_vector();\n   test_matrix();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test1.hpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#ifndef TEST1_H\n#define TEST1_H\n\n#ifdef _MSC_VER\n#pragma warning(disable : 4800 4996 4127 4100)\n#endif\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\n#ifdef TEST_ET\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_on> mp_test_type;\n#else\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off> mp_test_type;\n#endif\n//typedef double mp_test_type;\n\n#define USE_RANGE\n#define USE_SLICE\n#define USE_FLOAT\n#define USE_UNBOUNDED_ARRAY\n#define USE_STD_VECTOR\n#define USE_BOUNDED_VECTOR USE_MATRIX\n#define USE_UNBOUNDED_ARRAY\n#define USE_MAP_ARRAY\n#define USE_STD_MAP\n#define USE_MAPPED_VECTOR\n#define USE_COMPRESSED_VECTOR\n#define USE_COORDINATE_VECTOR\n#define USE_MAPPED_MATRIX\n#define USE_COMPRESSED_MATRIX\n#define USE_COORDINATE_MATRIX\n\n#include <iostream>\n\n#include <boost/numeric/ublas/vector.hpp>\n#include <boost/numeric/ublas/vector_proxy.hpp>\n#include <boost/numeric/ublas/matrix.hpp>\n#include <boost/numeric/ublas/matrix_proxy.hpp>\n#include <boost/numeric/ublas/io.hpp>\n\nnamespace ublas = boost::numeric::ublas;\n\n#include \"common/init.hpp\"\n\nvoid test_vector();\nvoid test_matrix_vector();\nvoid test_matrix();\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test11.cpp",
    "content": "//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test1.hpp\"\n\n// Test vector expression templates\ntemplate <class V, int N>\nstruct test_my_vector\n{\n   typedef typename V::value_type                             value_type;\n   typedef typename V::size_type                              size_type;\n   typedef typename ublas::type_traits<value_type>::real_type real_type;\n\n   template <class VP>\n   void test_container_with(VP& v1) const\n   {\n      // Container type tests in addition to expression types\n      // Insert and erase\n      v1.insert_element(0, 55);\n      v1.erase_element(1);\n      v1.clear();\n   }\n\n   template <class VP>\n   void test_expression_with(VP& v1, VP& v2, VP& v3) const\n   {\n      // Expression type tests\n      value_type t;\n      size_type  i;\n      real_type  n;\n\n      // Default Construct\n      default_construct<VP>::test();\n\n      // Copy and swap\n      initialize_vector(v1);\n      initialize_vector(v2);\n      v1 = v2;\n      std::cout << \"v1 = v2 = \" << v1 << std::endl;\n      v1.assign_temporary(v2);\n      std::cout << \"v1.assign_temporary (v2) = \" << v1 << std::endl;\n      v1.swap(v2);\n      std::cout << \"v1.swap (v2) = \" << v1 << \" \" << v2 << std::endl;\n\n      // Zero assignment\n      v1 = ublas::zero_vector<>(v1.size());\n      std::cout << \"v1.zero_vector = \" << v1 << std::endl;\n      v1 = v2;\n\n#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING\n      // Project range and slice\n      initialize_vector(v1);\n      initialize_vector(v2);\n      project(v1, ublas::range(0, 1))     = project(v2, ublas::range(0, 1));\n      project(v1, ublas::range(0, 1))     = project(v2, ublas::slice(0, 1, 1));\n      project(v1, ublas::slice(2, -1, 2)) = project(v2, ublas::slice(0, 1, 2));\n      project(v1, ublas::slice(2, -1, 2)) = project(v2, ublas::range(0, 2));\n      std::cout << \"v1 = range/slice \" << v1 << std::endl;\n#endif\n\n      // Unary vector operations resulting in a vector\n      initialize_vector(v1);\n      v2 = -v1;\n      std::cout << \"- v1 = \" << v2 << std::endl;\n      v2 = ublas::conj(v1);\n      std::cout << \"conj (v1) = \" << v2 << std::endl;\n\n      // Binary vector operations resulting in a vector\n      initialize_vector(v1);\n      initialize_vector(v2);\n      v3 = v1 + v2;\n      std::cout << \"v1 + v2 = \" << v3 << std::endl;\n      v3 = v1 - v2;\n      std::cout << \"v1 - v2 = \" << v3 << std::endl;\n      v3 = ublas::element_prod(v1, v2);\n      std::cout << \"element_prod (v1, v2) = \" << v3 << std::endl;\n\n      // Scaling a vector\n      t = N;\n      initialize_vector(v1);\n      v2 = value_type(1.) * v1;\n      std::cout << \"1. * v1 = \" << v2 << std::endl;\n      v2 = t * v1;\n      std::cout << \"N * v1 = \" << v2 << std::endl;\n      initialize_vector(v1);\n      v2 = v1 * value_type(1.);\n      std::cout << \"v1 * 1. = \" << v2 << std::endl;\n      v2 = v1 * t;\n      std::cout << \"v1 * value_type(N) = \" << v2 << std::endl;\n      // test interop with integer\n      v2 = v1 * N;\n\n      std::cout << \"v1 * N = \" << v2 << std::endl;\n\n      // Some assignments\n      initialize_vector(v1);\n      initialize_vector(v2);\n      v2 += v1;\n      std::cout << \"v2 += v1 = \" << v2 << std::endl;\n      v2 -= v1;\n      std::cout << \"v2 -= v1 = \" << v2 << std::endl;\n      v2 = v2 + v1;\n      std::cout << \"v2 = v2 + v1 = \" << v2 << std::endl;\n      v2 = v2 - v1;\n      std::cout << \"v2 = v2 - v1 = \" << v2 << std::endl;\n      v1 *= value_type(1.);\n      std::cout << \"v1 *= 1. = \" << v1 << std::endl;\n      v1 *= t;\n      std::cout << \"v1 *= value_type(N) = \" << v1 << std::endl;\n      // test interop with integer\n      v1 *= N;\n      std::cout << \"v1 *= N = \" << v1 << std::endl;\n\n      // Unary vector operations resulting in a scalar\n      initialize_vector(v1);\n      t = ublas::sum(v1);\n      std::cout << \"sum (v1) = \" << t << std::endl;\n      n = ublas::norm_1(v1);\n      std::cout << \"norm_1 (v1) = \" << n << std::endl;\n      n = ublas::norm_2(v1);\n      std::cout << \"norm_2 (v1) = \" << n << std::endl;\n      n = ublas::norm_inf(v1);\n      std::cout << \"norm_inf (v1) = \" << n << std::endl;\n\n      i = ublas::index_norm_inf(v1);\n      std::cout << \"index_norm_inf (v1) = \" << i << std::endl;\n\n      // Binary vector operations resulting in a scalar\n      initialize_vector(v1);\n      initialize_vector(v2);\n      t = ublas::inner_prod(v1, v2);\n      std::cout << \"inner_prod (v1, v2) = \" << t << std::endl;\n\n      // Scalar and Binary vector expression resulting in a vector\n      initialize_vector(v1);\n      initialize_vector(v2);\n      v1 = v1 * ublas::inner_prod(v1, v2);\n      std::cout << \"v1 * inner_prod (v1, v2) = \" << v1 << std::endl;\n   }\n\n   void operator()() const\n   {\n      V v1(N), v2(N), v3(N);\n      test_expression_with(v1, v2, v3);\n      test_container_with(v1);\n\n#ifdef USE_RANGE\n      ublas::vector_range<V> vr1(v1, ublas::range(0, N)),\n          vr2(v2, ublas::range(0, N)),\n          vr3(v3, ublas::range(0, N));\n      test_expression_with(vr1, vr2, vr3);\n#endif\n\n#ifdef USE_SLICE\n      ublas::vector_slice<V> vs1(v1, ublas::slice(0, 1, N)),\n          vs2(v2, ublas::slice(0, 1, N)),\n          vs3(v3, ublas::slice(0, 1, N));\n      test_expression_with(vs1, vs2, vs3);\n#endif\n   }\n};\n\n// Test vector\nvoid test_vector()\n{\n   std::cout << \"test_vector\" << std::endl;\n\n#ifdef USE_BOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, bounded_array\" << std::endl;\n   test_my_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, bounded_array\" << std::endl;\n   test_my_vector<ublas::vector<double, ublas::bounded_array<double, 3> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, bounded_array\" << std::endl;\n   test_my_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, bounded_array\" << std::endl;\n   test_my_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_UNBOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, unbounded_array\" << std::endl;\n   test_my_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, unbounded_array\" << std::endl;\n   test_my_vector<ublas::vector<double, ublas::unbounded_array<double> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, unbounded_array\" << std::endl;\n   test_my_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, unbounded_array\" << std::endl;\n   test_my_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_STD_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, std::vector\" << std::endl;\n   test_my_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, std::vector\" << std::endl;\n   test_my_vector<ublas::vector<double, std::vector<double> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, std::vector\" << std::endl;\n   test_my_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, std::vector\" << std::endl;\n   test_my_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_BOUNDED_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, bounded\" << std::endl;\n   test_my_vector<ublas::bounded_vector<mp_test_type, 3>, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, bounded\" << std::endl;\n   test_my_vector<ublas::bounded_vector<double, 3>, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, bounded\" << std::endl;\n   test_my_vector<ublas::bounded_vector<std::complex<mp_test_type>, 3>, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, bounded\" << std::endl;\n   test_my_vector<ublas::bounded_vector<std::complex<double>, 3>, 3>()();\n#endif\n#endif\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test12.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test1.hpp\"\n\n// Test matrix & vector expression templates\ntemplate <class V, class M, int N>\nstruct test_my_matrix_vector\n{\n   typedef typename V::value_type value_type;\n\n   template <class VP, class MP>\n   void test_with(VP& v1, VP& v2, MP& m1) const\n   {\n      {\n         // Rows and columns\n         initialize_matrix(m1);\n         for (int i = 0; i < N; ++i)\n         {\n            v1 = ublas::row(m1, i);\n            std::cout << \"row (m, \" << i << \") = \" << v1 << std::endl;\n            v1 = ublas::column(m1, i);\n            std::cout << \"column (m, \" << i << \") = \" << v1 << std::endl;\n         }\n\n         // Outer product\n         initialize_vector(v1);\n         initialize_vector(v2);\n         m1 = ublas::outer_prod(v1, v2);\n         std::cout << \"outer_prod (v1, v2) = \" << m1 << std::endl;\n\n         // Matrix vector product\n         initialize_matrix(m1);\n         initialize_vector(v1);\n         v2 = ublas::prod(m1, v1);\n         std::cout << \"prod (m1, v1) = \" << v2 << std::endl;\n         v2 = ublas::prod(v1, m1);\n         std::cout << \"prod (v1, m1) = \" << v2 << std::endl;\n      }\n   }\n   void operator()() const\n   {\n      {\n         V v1(N), v2(N);\n         M m1(N, N);\n         test_with(v1, v2, m1);\n\n         ublas::matrix_row<M> mr1(m1, 0), mr2(m1, 1);\n         test_with(mr1, mr2, m1);\n\n         ublas::matrix_column<M> mc1(m1, 0), mc2(m1, 1);\n         test_with(mc1, mc2, m1);\n\n#ifdef USE_RANGE\n         ublas::matrix_vector_range<M> mvr1(m1, ublas::range(0, N), ublas::range(0, N)),\n             mvr2(m1, ublas::range(0, N), ublas::range(0, N));\n         test_with(mvr1, mvr2, m1);\n#endif\n\n#ifdef USE_SLICE\n         ublas::matrix_vector_slice<M> mvs1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             mvs2(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));\n         test_with(mvs1, mvs2, m1);\n#endif\n      }\n   }\n};\n\n// Test matrix & vector\nvoid test_matrix_vector()\n{\n   std::cout << \"test_matrix_vector\" << std::endl;\n\n#ifdef USE_MATRIX\n#ifdef USE_BOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,\n                         ublas::matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,\n                         ublas::matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,\n                         ublas::matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,\n                         ublas::matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_UNBOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,\n                         ublas::matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,\n                         ublas::matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,\n                         ublas::matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,\n                         ublas::matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_STD_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,\n                         ublas::matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<double, std::vector<double> >,\n                         ublas::matrix<double, ublas::row_major, std::vector<double> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,\n                         ublas::matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,\n                         ublas::matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()();\n#endif\n#endif\n#endif\n#endif\n\n#ifdef USE_BOUNDED_MATRIX\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, bounded\" << std::endl;\n   test_my_matrix_vector<ublas::bounded_vector<mp_test_type, 3>,\n                         ublas::bounded_matrix<mp_test_type, 3, 3>, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, bounded\" << std::endl;\n   test_my_matrix_vector<ublas::bounded_vector<double, 3>,\n                         ublas::bounded_matrix<double, 3, 3>, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, bounded\" << std::endl;\n   test_my_matrix_vector<ublas::bounded_vector<std::complex<mp_test_type>, 3>,\n                         ublas::bounded_matrix<std::complex<mp_test_type>, 3, 3>, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, bounded\" << std::endl;\n   test_my_matrix_vector<ublas::bounded_vector<std::complex<double>, 3>,\n                         ublas::bounded_matrix<std::complex<double>, 3, 3>, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_VECTOR_OF_VECTOR\n#ifdef USE_BOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,\n                         ublas::vector_of_vector<mp_test_type, ublas::row_major, ublas::bounded_array<ublas::bounded_array<mp_test_type, 3>, 3 + 1> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,\n                         ublas::vector_of_vector<double, ublas::row_major, ublas::bounded_array<ublas::bounded_array<double, 3>, 3 + 1> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,\n                         ublas::vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<ublas::bounded_array<std::complex<mp_test_type>, 3>, 3 + 1> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,\n                         ublas::vector_of_vector<std::complex<double>, ublas::row_major, ublas::bounded_array<ublas::bounded_array<std::complex<double>, 3>, 3 + 1> >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_UNBOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,\n                         ublas::vector_of_vector<mp_test_type, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,\n                         ublas::vector_of_vector<double, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<double> > >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,\n                         ublas::vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<std::complex<mp_test_type> > > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,\n                         ublas::vector_of_vector<std::complex<double>, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<std::complex<double> > > >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_STD_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,\n                         ublas::vector_of_vector<mp_test_type, ublas::row_major, std::vector<std::vector<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<double, std::vector<double> >,\n                         ublas::vector_of_vector<double, ublas::row_major, std::vector<std::vector<double> > >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,\n                         ublas::vector_of_vector<std::complex<mp_test_type>, ublas::row_major, std::vector<std::vector<std::complex<mp_test_type> > > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,\n                         ublas::vector_of_vector<std::complex<double>, ublas::row_major, std::vector<std::vector<std::complex<double> > > >, 3>()();\n#endif\n#endif\n#endif\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test13.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test1.hpp\"\n\n// Test matrix expression templates\ntemplate <class M, int N>\nstruct test_my_matrix\n{\n   typedef typename M::value_type value_type;\n\n   template <class VP>\n   void test_container_with(VP& v1) const\n   {\n      // Container type tests in addition to expression types\n      // Insert and erase\n      v1.insert_element(0, 0, 55);\n      v1.erase_element(1, 1);\n      v1.clear();\n   }\n\n   template <class MP>\n   void test_expression_with(MP& m1, MP& m2, MP& m3) const\n   {\n      value_type t;\n\n      // Default Construct\n      default_construct<MP>::test();\n\n      // Copy and swap\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      m1 = m2;\n      std::cout << \"m1 = m2 = \" << m1 << std::endl;\n      m1.assign_temporary(m2);\n      std::cout << \"m1.assign_temporary (m2) = \" << m1 << std::endl;\n      m1.swap(m2);\n      std::cout << \"m1.swap (m2) = \" << m1 << \" \" << m2 << std::endl;\n\n      // Zero assignment\n      m1 = ublas::zero_matrix<>(m1.size1(), m1.size2());\n      std::cout << \"m1.zero_matrix = \" << m1 << std::endl;\n      m1 = m2;\n\n#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING\n      // Project range and slice\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      project(m1, ublas::range(0, 1), ublas::range(0, 1))         = project(m2, ublas::range(0, 1), ublas::range(0, 1));\n      project(m1, ublas::range(0, 1), ublas::range(0, 1))         = project(m2, ublas::slice(0, 1, 1), ublas::slice(0, 1, 1));\n      project(m1, ublas::slice(2, -1, 2), ublas::slice(2, -1, 2)) = project(m2, ublas::slice(0, 1, 2), ublas::slice(0, 1, 2));\n      project(m1, ublas::slice(2, -1, 2), ublas::slice(2, -1, 2)) = project(m2, ublas::range(0, 2), ublas::range(0, 2));\n      std::cout << \"m1 = range/slice \" << m1 << std::endl;\n#endif\n\n      // Unary matrix operations resulting in a matrix\n      initialize_matrix(m1);\n      m2 = -m1;\n      std::cout << \"- m1 = \" << m2 << std::endl;\n      m2 = ublas::conj(m1);\n      std::cout << \"conj (m1) = \" << m2 << std::endl;\n\n      // Binary matrix operations resulting in a matrix\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      m3 = m1 + m2;\n      std::cout << \"m1 + m2 = \" << m3 << std::endl;\n      m3 = m1 - m2;\n      std::cout << \"m1 - m2 = \" << m3 << std::endl;\n      m3 = ublas::element_prod(m1, m2);\n      std::cout << \"element_prod (m1, m2) = \" << m3 << std::endl;\n\n      // Scaling a matrix\n      t = N;\n      initialize_matrix(m1);\n      m2 = value_type(1.) * m1;\n      std::cout << \"1. * m1 = \" << m2 << std::endl;\n      m2 = t * m1;\n      std::cout << \"N * m1 = \" << m2 << std::endl;\n      initialize_matrix(m1);\n      m2 = m1 * value_type(1.);\n      std::cout << \"m1 * 1. = \" << m2 << std::endl;\n      m2 = m1 * t;\n      std::cout << \"m1 * N = \" << m2 << std::endl;\n\n      // Some assignments\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      m2 += m1;\n      std::cout << \"m2 += m1 = \" << m2 << std::endl;\n      m2 -= m1;\n      std::cout << \"m2 -= m1 = \" << m2 << std::endl;\n      m2 = m2 + m1;\n      std::cout << \"m2 = m2 + m1 = \" << m2 << std::endl;\n      m2 = m2 - m1;\n      std::cout << \"m2 = m2 - m1 = \" << m2 << std::endl;\n      m1 *= value_type(1.);\n      std::cout << \"m1 *= 1. = \" << m1 << std::endl;\n      m1 *= t;\n      std::cout << \"m1 *= N = \" << m1 << std::endl;\n\n      // Transpose\n      initialize_matrix(m1);\n      m2 = ublas::trans(m1);\n      std::cout << \"trans (m1) = \" << m2 << std::endl;\n\n      // Hermitean\n      initialize_matrix(m1);\n      m2 = ublas::herm(m1);\n      std::cout << \"herm (m1) = \" << m2 << std::endl;\n\n      // Matrix multiplication\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      m3 = ublas::prod(m1, m2);\n      std::cout << \"prod (m1, m2) = \" << m3 << std::endl;\n   }\n\n   void operator()() const\n   {\n      M m1(N, N), m2(N, N), m3(N, N);\n      test_expression_with(m1, m2, m3);\n      test_container_with(m1);\n\n#ifdef USE_RANGE\n      ublas::matrix_range<M> mr1(m1, ublas::range(0, N), ublas::range(0, N)),\n          mr2(m2, ublas::range(0, N), ublas::range(0, N)),\n          mr3(m3, ublas::range(0, N), ublas::range(0, N));\n      test_expression_with(mr1, mr2, mr3);\n#endif\n\n#ifdef USE_SLICE\n      ublas::matrix_slice<M> ms1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n          ms2(m2, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n          ms3(m3, ublas::slice(0, 1, N), ublas::slice(0, 1, N));\n      test_expression_with(ms1, ms2, ms3);\n#endif\n   }\n};\n\n// Test matrix\nvoid test_matrix()\n{\n   std::cout << \"test_matrix\" << std::endl;\n\n#ifdef USE_MATRIX\n#ifdef USE_BOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, bounded_array\" << std::endl;\n   test_my_matrix<ublas::matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, bounded_array\" << std::endl;\n   test_my_matrix<ublas::matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, bounded_array\" << std::endl;\n   test_my_matrix<ublas::matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, bounded_array\" << std::endl;\n   test_my_matrix<ublas::matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_UNBOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_STD_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, std::vector\" << std::endl;\n   test_my_matrix<ublas::matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, std::vector\" << std::endl;\n   test_my_matrix<ublas::matrix<double, ublas::row_major, std::vector<double> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, std::vector\" << std::endl;\n   test_my_matrix<ublas::matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, std::vector\" << std::endl;\n   test_my_matrix<ublas::matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()();\n#endif\n#endif\n#endif\n#endif\n\n#ifdef USE_BOUNDED_MATRIX\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, bounded\" << std::endl;\n   test_my_matrix<ublas::bounded_matrix<mp_test_type, 3, 3>, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, bounded\" << std::endl;\n   test_my_matrix<ublas::bounded_matrix<double, 3, 3>, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, bounded\" << std::endl;\n   test_my_matrix<ublas::bounded_matrix<std::complex<mp_test_type>, 3, 3>, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, bounded\" << std::endl;\n   test_my_matrix<ublas::bounded_matrix<std::complex<double>, 3, 3>, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_VECTOR_OF_VECTOR\n#ifdef USE_BOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, bounded_array\" << std::endl;\n   test_my_matrix<ublas::vector_of_vector<mp_test_type, ublas::row_major, ublas::bounded_array<ublas::bounded_array<mp_test_type, 3>, 3 + 1> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, bounded_array\" << std::endl;\n   test_my_matrix<ublas::vector_of_vector<double, ublas::row_major, ublas::bounded_array<ublas::bounded_array<double, 3>, 3 + 1> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, bounded_array\" << std::endl;\n   test_my_matrix<ublas::vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<ublas::bounded_array<std::complex<mp_test_type>, 3>, 3 + 1> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, bounded_array\" << std::endl;\n   test_my_matrix<ublas::vector_of_vector<std::complex<double>, ublas::row_major, ublas::bounded_array<ublas::bounded_array<std::complex<double>, 3>, 3 + 1> >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_UNBOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::vector_of_vector<mp_test_type, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::vector_of_vector<double, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<double> > >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<std::complex<mp_test_type> > > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::vector_of_vector<std::complex<double>, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<std::complex<double> > > >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_STD_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, std::vector\" << std::endl;\n   test_my_matrix<ublas::vector_of_vector<mp_test_type, ublas::row_major, std::vector<std::vector<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, std::vector\" << std::endl;\n   test_my_matrix<ublas::vector_of_vector<double, ublas::row_major, std::vector<std::vector<double> > >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, std::vector\" << std::endl;\n   test_my_matrix<ublas::vector_of_vector<std::complex<mp_test_type>, ublas::row_major, std::vector<std::vector<std::complex<mp_test_type> > > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, std::vector\" << std::endl;\n   test_my_matrix<ublas::vector_of_vector<std::complex<double>, ublas::row_major, std::vector<std::vector<std::complex<double> > > >, 3>()();\n#endif\n#endif\n#endif\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test2.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test2.hpp\"\n\nint main()\n{\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type\" << std::endl;\n   test_blas_1<ublas::vector<mp_test_type>, 3>().test();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double\" << std::endl;\n   test_blas_1<ublas::vector<double>, 3>().test();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>\" << std::endl;\n   test_blas_1<ublas::vector<std::complex<mp_test_type> >, 3>().test();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>\" << std::endl;\n   test_blas_1<ublas::vector<std::complex<double> >, 3>().test();\n#endif\n#endif\n\n   std::cout << \"test_blas_2\" << std::endl;\n\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type\" << std::endl;\n   test_blas_2<ublas::vector<mp_test_type>, ublas::matrix<mp_test_type>, 3>().test();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double\" << std::endl;\n   test_blas_2<ublas::vector<double>, ublas::matrix<double>, 3>().test();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>\" << std::endl;\n   test_blas_2<ublas::vector<std::complex<mp_test_type> >, ublas::matrix<std::complex<mp_test_type> >, 3>().test();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>\" << std::endl;\n   test_blas_2<ublas::vector<std::complex<double> >, ublas::matrix<std::complex<double> >, 3>().test();\n#endif\n#endif\n\n   std::cout << \"test_blas_3\" << std::endl;\n\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type\" << std::endl;\n   test_blas_3<ublas::matrix<mp_test_type>, 3>().test();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double\" << std::endl;\n   test_blas_3<ublas::matrix<double>, 3>().test();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>\" << std::endl;\n   test_blas_3<ublas::matrix<std::complex<mp_test_type> >, 3>().test();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>\" << std::endl;\n   test_blas_3<ublas::matrix<std::complex<double> >, 3>().test();\n#endif\n#endif\n\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test2.hpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#ifndef TEST2_H\n#define TEST2_H\n#ifdef _MSC_VER\n#pragma warning(disable : 4800 4996 4127 4100 4018)\n#endif\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\n#ifdef TEST_ET\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_on> mp_test_type;\n#else\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off> mp_test_type;\n#endif\n//typedef double mp_test_type;\n\n#define USE_RANGE\n#define USE_SLICE\n#define USE_FLOAT\n#define USE_UNBOUNDED_ARRAY\n#define USE_STD_VECTOR\n#define USE_BOUNDED_VECTOR USE_MATRIX\n#define USE_UNBOUNDED_ARRAY\n#define USE_MAP_ARRAY\n#define USE_STD_MAP\n#define USE_MAPPED_VECTOR\n#define USE_COMPRESSED_VECTOR\n#define USE_COORDINATE_VECTOR\n#define USE_MAPPED_MATRIX\n#define USE_COMPRESSED_MATRIX\n#define USE_COORDINATE_MATRIX\n\n#include <iostream>\n\n#include <boost/numeric/ublas/vector.hpp>\n#include <boost/numeric/ublas/matrix.hpp>\n#include <boost/numeric/ublas/triangular.hpp>\n#include <boost/numeric/ublas/io.hpp>\n#include <boost/numeric/ublas/blas.hpp>\n\nnamespace ublas = boost::numeric::ublas;\n\n#include \"common/init.hpp\"\n\ntemplate <class V, int N>\nstruct test_blas_1\n{\n   typedef typename V::value_type                             value_type;\n   typedef typename ublas::type_traits<value_type>::real_type real_type;\n\n   void test();\n};\n\ntemplate <class V, class M, int N>\nstruct test_blas_2\n{\n   typedef typename V::value_type value_type;\n\n   void test();\n};\n\ntemplate <class M, int N>\nstruct test_blas_3\n{\n   typedef typename M::value_type value_type;\n\n   void test();\n};\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test21.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test2.hpp\"\n\ntemplate <class V, int N>\nvoid test_blas_1<V, N>::test()\n{\n   {\n      value_type t;\n      real_type  n;\n      V          v1(N), v2(N);\n\n      // _asum\n      initialize_vector(v1);\n      n = ublas::blas_1::asum(v1);\n      std::cout << \"asum (v1) = \" << n << std::endl;\n\n      // _amax\n      initialize_vector(v1);\n      n = ublas::blas_1::amax(v1);\n      std::cout << \"amax (v1) = \" << n << std::endl;\n\n      // _nrm2\n      initialize_vector(v1);\n      n = ublas::blas_1::nrm2(v1);\n      std::cout << \"nrm2 (v1) = \" << n << std::endl;\n\n      // _dot\n      // _dotu\n      // _dotc\n      initialize_vector(v1);\n      initialize_vector(v2);\n      t = ublas::blas_1::dot(v1, v2);\n      std::cout << \"dot (v1, v2) = \" << t << std::endl;\n      t = ublas::blas_1::dot(ublas::conj(v1), v2);\n      std::cout << \"dot (conj (v1), v2) = \" << t << std::endl;\n\n      // _copy\n      initialize_vector(v2);\n      ublas::blas_1::copy(v1, v2);\n      std::cout << \"copy (v1, v2) = \" << v1 << std::endl;\n\n      // _swap\n      initialize_vector(v1);\n      initialize_vector(v2);\n      ublas::blas_1::swap(v1, v2);\n      std::cout << \"swap (v1, v2) = \" << v1 << \" \" << v2 << std::endl;\n\n      // _scal\n      // csscal\n      // zdscal\n      initialize_vector(v1);\n      ublas::blas_1::scal(v1, value_type(1));\n      std::cout << \"scal (v1, 1) = \" << v1 << std::endl;\n\n      // _axpy\n      initialize_vector(v1);\n      initialize_vector(v2);\n      ublas::blas_1::axpy(v1, value_type(1), v2);\n      std::cout << \"axpy (v1, 1, v2) = \" << v1 << std::endl;\n\n      // _rot\n      initialize_vector(v1);\n      initialize_vector(v2);\n      ublas::blas_1::rot(value_type(1), v1, value_type(1), v2);\n      std::cout << \"rot (1, v1, 1, v2) = \" << v1 << \" \" << v2 << std::endl;\n   }\n}\n\n#ifdef USE_FLOAT\ntemplate struct test_blas_1<ublas::vector<mp_test_type>, 3>;\n#endif\n\n#ifdef USE_DOUBLE\ntemplate struct test_blas_1<ublas::vector<double>, 3>;\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\ntemplate struct test_blas_1<ublas::vector<std::complex<mp_test_type> >, 3>;\n#endif\n\n#ifdef USE_DOUBLE\ntemplate struct test_blas_1<ublas::vector<std::complex<double> >, 3>;\n#endif\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test22.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test2.hpp\"\n\ntemplate <class V, class M, int N>\nvoid test_blas_2<V, M, N>::test()\n{\n   {\n      V v1(N), v2(N);\n      M m(N, N);\n\n      // _t_mv\n      initialize_vector(v1);\n      initialize_matrix(m);\n      ublas::blas_2::tmv(v1, m);\n      std::cout << \"tmv (v1, m) = \" << v1 << std::endl;\n      initialize_vector(v1);\n      initialize_matrix(m);\n      ublas::blas_2::tmv(v1, ublas::trans(m));\n      std::cout << \"tmv (v1, trans (m)) = \" << v1 << std::endl;\n#ifdef USE_STD_COMPLEX\n      initialize_vector(v1);\n      initialize_matrix(m);\n      ublas::blas_2::tmv(v1, ublas::herm(m));\n      std::cout << \"tmv (v1, herm (m)) = \" << v1 << std::endl;\n#endif\n\n      // _t_sv\n      initialize_vector(v1);\n      initialize_vector(v2);\n      initialize_matrix(m, ublas::lower_tag());\n      ublas::blas_2::tsv(v1, m, ublas::lower_tag());\n      std::cout << \"tsv (v1, m) = \" << v1 << \" \" << ublas::prod(m, v1) - v2 << std::endl;\n      initialize_vector(v1);\n      initialize_vector(v2);\n      initialize_matrix(m, ublas::upper_tag());\n      ublas::blas_2::tsv(v1, ublas::trans(m), ublas::lower_tag());\n      std::cout << \"tsv (v1, trans (m)) = \" << v1 << \" \" << ublas::prod(ublas::trans(m), v1) - v2 << std::endl;\n#ifdef USE_STD_COMPLEX\n      initialize_vector(v1);\n      initialize_vector(v2);\n      initialize_matrix(m, ublas::upper_tag());\n      ublas::blas_2::tsv(v1, ublas::herm(m), ublas::lower_tag());\n      std::cout << \"tsv (v1, herm (m)) = \" << v1 << \" \" << ublas::prod(ublas::herm(m), v1) - v2 << std::endl;\n#endif\n      initialize_vector(v1);\n      initialize_vector(v2);\n      initialize_matrix(m, ublas::upper_tag());\n      ublas::blas_2::tsv(v1, m, ublas::upper_tag());\n      std::cout << \"tsv (v1, m) = \" << v1 << \" \" << ublas::prod(m, v1) - v2 << std::endl;\n      initialize_vector(v1);\n      initialize_vector(v2);\n      initialize_matrix(m, ublas::lower_tag());\n      ublas::blas_2::tsv(v1, ublas::trans(m), ublas::upper_tag());\n      std::cout << \"tsv (v1, trans (m)) = \" << v1 << \" \" << ublas::prod(ublas::trans(m), v1) - v2 << std::endl;\n#ifdef USE_STD_COMPLEX\n      initialize_vector(v1);\n      initialize_vector(v2);\n      initialize_matrix(m, ublas::lower_tag());\n      ublas::blas_2::tsv(v1, ublas::herm(m), ublas::upper_tag());\n      std::cout << \"tsv (v1, herm (m)) = \" << v1 << \" \" << ublas::prod(ublas::herm(m), v1) - v2 << std::endl;\n#endif\n\n      // _g_mv\n      // _s_mv\n      // _h_mv\n      initialize_vector(v1);\n      initialize_vector(v2);\n      initialize_matrix(m);\n      ublas::blas_2::gmv(v1, value_type(1), value_type(1), m, v2);\n      std::cout << \"gmv (v1, 1, 1, m, v2) = \" << v1 << std::endl;\n      ublas::blas_2::gmv(v1, value_type(1), value_type(1), ublas::trans(m), v2);\n      std::cout << \"gmv (v1, 1, 1, trans (m), v2) = \" << v1 << std::endl;\n#ifdef USE_STD_COMPLEX\n      ublas::blas_2::gmv(v1, value_type(1), value_type(1), ublas::herm(m), v2);\n      std::cout << \"gmv (v1, 1, 1, herm (m), v2) = \" << v1 << std::endl;\n#endif\n\n      // _g_r\n      // _g_ru\n      // _g_rc\n      initialize_vector(v1);\n      initialize_vector(v2);\n      initialize_matrix(m);\n      ublas::blas_2::gr(m, value_type(1), v1, v2);\n      std::cout << \"gr (m, 1, v1, v2) = \" << m << std::endl;\n      ublas::blas_2::gr(m, value_type(1), v1, ublas::conj(v2));\n      std::cout << \"gr (m, 1, v1, conj (v2)) = \" << m << std::endl;\n\n      // _s_r\n      initialize_vector(v1);\n      initialize_matrix(m);\n      ublas::blas_2::sr(m, value_type(1), v1);\n      std::cout << \"sr (m, 1, v1) = \" << m << std::endl;\n\n#ifdef USE_STD_COMPLEX\n      // _h_r\n      initialize_vector(v1);\n      initialize_matrix(m);\n      ublas::blas_2::hr(m, value_type(1), v1);\n      std::cout << \"hr (m, 1, v1) = \" << m << std::endl;\n#endif\n\n      // _s_r2\n      initialize_vector(v1);\n      initialize_vector(v2);\n      initialize_matrix(m);\n      ublas::blas_2::sr2(m, value_type(1), v1, v2);\n      std::cout << \"sr2 (m, 1, v1, v2) = \" << m << std::endl;\n\n#ifdef USE_STD_COMPLEX\n      // _h_r2\n      initialize_vector(v1);\n      initialize_vector(v2);\n      initialize_matrix(m);\n      ublas::blas_2::hr2(m, value_type(1), v1, v2);\n      std::cout << \"hr2 (m, 1, v1, v2) = \" << m << std::endl;\n#endif\n   }\n}\n\n#ifdef USE_FLOAT\ntemplate struct test_blas_2<ublas::vector<mp_test_type>, ublas::matrix<mp_test_type>, 3>;\n#endif\n\n#ifdef USE_DOUBLE\ntemplate struct test_blas_2<ublas::vector<double>, ublas::matrix<double>, 3>;\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\ntemplate struct test_blas_2<ublas::vector<std::complex<mp_test_type> >, ublas::matrix<std::complex<mp_test_type> >, 3>;\n#endif\n\n#ifdef USE_DOUBLE\ntemplate struct test_blas_2<ublas::vector<std::complex<double> >, ublas::matrix<std::complex<double> >, 3>;\n#endif\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test23.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test2.hpp\"\n\ntemplate <class M, int N>\nvoid test_blas_3<M, N>::test()\n{\n   {\n      M m1(N, N), m2(N, N), m3(N, N);\n\n      // _t_mm\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      ublas::blas_3::tmm(m1, value_type(1), m2, m1);\n      std::cout << \"tmm (m1, 1, m2, m1) = \" << m1 << std::endl;\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      ublas::blas_3::tmm(m1, value_type(1), m2, ublas::trans(m1));\n      std::cout << \"tmm (m1, 1, m2, trans (m1)) = \" << m1 << std::endl;\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      ublas::blas_3::tmm(m1, value_type(1), ublas::trans(m2), m1);\n      std::cout << \"tmm (m1, 1, trans (m2), m1) = \" << m1 << std::endl;\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      ublas::blas_3::tmm(m1, value_type(1), ublas::trans(m2), ublas::trans(m1));\n      std::cout << \"tmm (m1, 1, trans (m2), trans (m1)) = \" << m1 << std::endl;\n#ifdef USE_STD_COMPLEX\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      ublas::blas_3::tmm(m1, value_type(1), m2, ublas::herm(m1));\n      std::cout << \"tmm (m1, 1, m2, herm (m1)) = \" << m1 << std::endl;\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      ublas::blas_3::tmm(m1, value_type(1), ublas::herm(m2), m1);\n      std::cout << \"tmm (m1, 1, herm (m2), m1) = \" << m1 << std::endl;\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      ublas::blas_3::tmm(m1, value_type(1), ublas::trans(m2), ublas::herm(m1));\n      std::cout << \"tmm (m1, 1, trans (m2), herm (m1)) = \" << m1 << std::endl;\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      ublas::blas_3::tmm(m1, value_type(1), ublas::herm(m2), ublas::trans(m1));\n      std::cout << \"tmm (m1, 1, herm (m2), trans (m1)) = \" << m1 << std::endl;\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      ublas::blas_3::tmm(m1, value_type(1), ublas::herm(m2), ublas::herm(m1));\n      std::cout << \"tmm (m1, 1, herm (m2), herm (m1)) = \" << m1 << std::endl;\n#endif\n\n      // _t_sm\n      initialize_matrix(m1);\n      initialize_matrix(m2, ublas::lower_tag());\n      initialize_matrix(m3);\n      ublas::blas_3::tsm(m1, value_type(1), m2, ublas::lower_tag());\n      std::cout << \"tsm (m1, 1, m2) = \" << m1 << \" \" << ublas::prod(m2, m1) - value_type(1) * m3 << std::endl;\n      initialize_matrix(m1);\n      initialize_matrix(m2, ublas::upper_tag());\n      ublas::blas_3::tsm(m1, value_type(1), ublas::trans(m2), ublas::lower_tag());\n      std::cout << \"tsm (m1, 1, trans (m2)) = \" << m1 << \" \" << ublas::prod(ublas::trans(m2), m1) - value_type(1) * m3 << std::endl;\n#ifdef USE_STD_COMPLEX\n      initialize_matrix(m1);\n      initialize_matrix(m2, ublas::upper_tag());\n      ublas::blas_3::tsm(m1, value_type(1), ublas::herm(m2), ublas::lower_tag());\n      std::cout << \"tsm (m1, 1, herm (m2)) = \" << m1 << \" \" << ublas::prod(ublas::herm(m2), m1) - value_type(1) * m3 << std::endl;\n#endif\n      initialize_matrix(m1);\n      initialize_matrix(m2, ublas::upper_tag());\n      ublas::blas_3::tsm(m1, value_type(1), m2, ublas::upper_tag());\n      std::cout << \"tsm (m1, 1, m2) = \" << m1 << \" \" << ublas::prod(m2, m1) - value_type(1) * m3 << std::endl;\n      initialize_matrix(m1);\n      initialize_matrix(m2, ublas::lower_tag());\n      ublas::blas_3::tsm(m1, value_type(1), ublas::trans(m2), ublas::upper_tag());\n      std::cout << \"tsm (m1, 1, trans (m2)) = \" << m1 << \" \" << ublas::prod(ublas::trans(m2), m1) - value_type(1) * m3 << std::endl;\n#ifdef USE_STD_COMPLEX\n      initialize_matrix(m1);\n      initialize_matrix(m2, ublas::lower_tag());\n      ublas::blas_3::tsm(m1, value_type(1), ublas::herm(m2), ublas::upper_tag());\n      std::cout << \"tsm (m1, 1, herm (m2)) = \" << m1 << \" \" << ublas::prod(ublas::herm(m2), m1) - value_type(1) * m3 << std::endl;\n#endif\n\n      // _g_mm\n      // _s_mm\n      // _h_mm\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      initialize_matrix(m3);\n      ublas::blas_3::gmm(m1, value_type(1), value_type(1), m2, m3);\n      std::cout << \"gmm (m1, 1, 1, m2, m3) = \" << m1 << std::endl;\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      initialize_matrix(m3);\n      ublas::blas_3::gmm(m1, value_type(1), value_type(1), ublas::trans(m2), m3);\n      std::cout << \"gmm (m1, 1, 1, trans (m2), m3) = \" << m1 << std::endl;\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      initialize_matrix(m3);\n      ublas::blas_3::gmm(m1, value_type(1), value_type(1), m2, ublas::trans(m3));\n      std::cout << \"gmm (m1, 1, 1, m2, trans (m3)) = \" << m1 << std::endl;\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      initialize_matrix(m3);\n      ublas::blas_3::gmm(m1, value_type(1), value_type(1), ublas::trans(m2), ublas::trans(m3));\n      std::cout << \"gmm (m1, 1, 1, trans (m2), trans (m3)) = \" << m1 << std::endl;\n#ifdef USE_STD_COMPLEX\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      initialize_matrix(m3);\n      ublas::blas_3::gmm(m1, value_type(1), value_type(1), ublas::herm(m2), m3);\n      std::cout << \"gmm (m1, 1, 1, herm (m2), m3) = \" << m1 << std::endl;\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      initialize_matrix(m3);\n      ublas::blas_3::gmm(m1, value_type(1), value_type(1), m2, ublas::herm(m3));\n      std::cout << \"gmm (m1, 1, 1, m2, herm (m3)) = \" << m1 << std::endl;\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      initialize_matrix(m3);\n      ublas::blas_3::gmm(m1, value_type(1), value_type(1), ublas::herm(m2), ublas::trans(m3));\n      std::cout << \"gmm (m1, 1, 1, herm (m2), trans (m3)) = \" << m1 << std::endl;\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      initialize_matrix(m3);\n      ublas::blas_3::gmm(m1, value_type(1), value_type(1), ublas::trans(m2), ublas::herm(m3));\n      std::cout << \"gmm (m1, 1, 1, trans (m2), herm (m3)) = \" << m1 << std::endl;\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      initialize_matrix(m3);\n      ublas::blas_3::gmm(m1, value_type(1), value_type(1), ublas::herm(m2), ublas::herm(m3));\n      std::cout << \"gmm (m1, 1, 1, herm (m2), herm (m3)) = \" << m1 << std::endl;\n#endif\n\n      // s_rk\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      ublas::blas_3::srk(m1, value_type(1), value_type(1), m2);\n      std::cout << \"srk (m1, 1, 1, m2) = \" << m1 << std::endl;\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      ublas::blas_3::srk(m1, value_type(1), value_type(1), ublas::trans(m2));\n      std::cout << \"srk (m1, 1, 1, trans (m2)) = \" << m1 << std::endl;\n\n#ifdef USE_STD_COMPLEX\n      // h_rk\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      ublas::blas_3::hrk(m1, value_type(1), value_type(1), m2);\n      std::cout << \"hrk (m1, 1, 1, m2) = \" << m1 << std::endl;\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      ublas::blas_3::hrk(m1, value_type(1), value_type(1), ublas::herm(m2));\n      std::cout << \"hrk (m1, 1, 1, herm (m2)) = \" << m1 << std::endl;\n#endif\n\n      // s_r2k\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      initialize_matrix(m3);\n      ublas::blas_3::sr2k(m1, value_type(1), value_type(1), m2, m3);\n      std::cout << \"sr2k (m1, 1, 1, m2, m3) = \" << m1 << std::endl;\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      initialize_matrix(m3);\n      ublas::blas_3::sr2k(m1, value_type(1), value_type(1), ublas::trans(m2), ublas::trans(m3));\n      std::cout << \"sr2k (m1, 1, 1, trans (m2), trans (m3)) = \" << m1 << std::endl;\n\n#ifdef USE_STD_COMPLEX\n      // h_r2k\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      initialize_matrix(m3);\n      ublas::blas_3::hr2k(m1, value_type(1), value_type(1), m2, m3);\n      std::cout << \"hr2k (m1, 1, 1, m2, m3) = \" << m1 << std::endl;\n      initialize_matrix(m1);\n      initialize_matrix(m2);\n      initialize_matrix(m3);\n      ublas::blas_3::hr2k(m1, value_type(1), value_type(1), ublas::herm(m2), ublas::herm(m3));\n      std::cout << \"hr2k (m1, 1, 1, herm (m2), herm (m3)) = \" << m1 << std::endl;\n#endif\n   }\n}\n\n#ifdef USE_FLOAT\ntemplate struct test_blas_3<ublas::matrix<mp_test_type>, 3>;\n#endif\n\n#ifdef USE_DOUBLE\ntemplate struct test_blas_3<ublas::matrix<double>, 3>;\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\ntemplate struct test_blas_3<ublas::matrix<std::complex<mp_test_type> >, 3>;\n#endif\n\n#ifdef USE_DOUBLE\ntemplate struct test_blas_3<ublas::matrix<std::complex<double> >, 3>;\n#endif\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test3.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test3.hpp\"\n\nint main()\n{\n   test_vector();\n   test_matrix_vector();\n   test_matrix();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test3.hpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#ifndef TEST3_H\n#define TEST3_H\n\n#ifdef _MSC_VER\n#pragma warning(disable : 4800 4996 4127 4100)\n#endif\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\n#ifdef TEST_ET\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_on> mp_test_type;\n#else\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off> mp_test_type;\n#endif\n//typedef double mp_test_type;\n\n#define USE_RANGE\n#define USE_SLICE\n#define USE_FLOAT\n#define USE_UNBOUNDED_ARRAY\n#define USE_STD_VECTOR\n#define USE_BOUNDED_VECTOR USE_MATRIX\n#define USE_UNBOUNDED_ARRAY\n#define USE_MAP_ARRAY\n#define USE_STD_MAP\n#define USE_MAPPED_VECTOR\n#define USE_COMPRESSED_VECTOR\n#define USE_COORDINATE_VECTOR\n#define USE_MAPPED_MATRIX\n#define USE_COMPRESSED_MATRIX\n#define USE_COORDINATE_MATRIX\n\n#include <iostream>\n\n#include <boost/numeric/ublas/vector.hpp>\n#include <boost/numeric/ublas/vector_proxy.hpp>\n#include <boost/numeric/ublas/vector_sparse.hpp>\n#include <boost/numeric/ublas/matrix.hpp>\n#include <boost/numeric/ublas/matrix_proxy.hpp>\n#include <boost/numeric/ublas/matrix_sparse.hpp>\n#include <boost/numeric/ublas/vector_sparse.hpp>\n#ifdef USE_GENERALIZED_VECTOR_OF_VECTOR\n#include <boost/numeric/ublas/vector_of_vector.hpp>\n#endif\n#include <boost/numeric/ublas/io.hpp>\n\nnamespace ublas = boost::numeric::ublas;\n\n#include \"common/init.hpp\"\n\nvoid test_vector();\nvoid test_matrix_vector();\nvoid test_matrix();\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test31.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test3.hpp\"\n\n// Test vector expression templates\ntemplate <class V, int N>\nstruct test_my_vector\n{\n   typedef typename V::value_type                             value_type;\n   typedef typename V::size_type                              size_type;\n   typedef typename ublas::type_traits<value_type>::real_type real_type;\n\n   template <class VP>\n   void test_with(VP& v1, VP& v2, VP& v3) const\n   {\n      {\n         value_type t;\n         size_type  i;\n         real_type  n;\n\n         // Default Construct\n         default_construct<VP>::test();\n\n         // Copy and swap\n         initialize_vector(v1);\n         initialize_vector(v2);\n         v1 = v2;\n         std::cout << \"v1 = v2 = \" << v1 << std::endl;\n         v1.assign_temporary(v2);\n         std::cout << \"v1.assign_temporary (v2) = \" << v1 << std::endl;\n         v1.swap(v2);\n         std::cout << \"v1.swap (v2) = \" << v1 << \" \" << v2 << std::endl;\n\n         // Zero assignment\n         v1 = ublas::zero_vector<>(v1.size());\n         std::cout << \"v1.zero_vector = \" << v1 << std::endl;\n         v1 = v2;\n\n#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING\n         // Project range and slice\n         initialize_vector(v1);\n         initialize_vector(v2);\n         project(v1, ublas::range(0, 1))     = project(v2, ublas::range(0, 1));\n         project(v1, ublas::range(0, 1))     = project(v2, ublas::slice(0, 1, 1));\n         project(v1, ublas::slice(2, -1, 2)) = project(v2, ublas::slice(0, 1, 2));\n         project(v1, ublas::slice(2, -1, 2)) = project(v2, ublas::range(0, 2));\n         std::cout << \"v1 = range/slice \" << v1 << std::endl;\n#endif\n\n         // Unary vector operations resulting in a vector\n         initialize_vector(v1);\n         v2 = -v1;\n         std::cout << \"- v1 = \" << v2 << std::endl;\n         v2 = ublas::conj(v1);\n         std::cout << \"conj (v1) = \" << v2 << std::endl;\n\n         // Binary vector operations resulting in a vector\n         initialize_vector(v1);\n         initialize_vector(v2);\n         initialize_vector(v3);\n         v3 = v1 + v2;\n         std::cout << \"v1 + v2 = \" << v3 << std::endl;\n\n         v3 = v1 - v2;\n         std::cout << \"v1 - v2 = \" << v3 << std::endl;\n\n         // Scaling a vector\n         t = N;\n         initialize_vector(v1);\n         v2 = value_type(1.) * v1;\n         std::cout << \"1. * v1 = \" << v2 << std::endl;\n         v2 = t * v1;\n         std::cout << \"N * v1 = \" << v2 << std::endl;\n         initialize_vector(v1);\n         v2 = v1 * value_type(1.);\n         std::cout << \"v1 * 1. = \" << v2 << std::endl;\n         v2 = v1 * t;\n         std::cout << \"v1 * N = \" << v2 << std::endl;\n\n         // Some assignments\n         initialize_vector(v1);\n         initialize_vector(v2);\n         v2 += v1;\n         std::cout << \"v2 += v1 = \" << v2 << std::endl;\n         v2 -= v1;\n         std::cout << \"v2 -= v1 = \" << v2 << std::endl;\n         v2 = v2 + v1;\n         std::cout << \"v2 = v2 + v1 = \" << v2 << std::endl;\n         v2 = v2 - v1;\n         std::cout << \"v2 = v2 - v1 = \" << v2 << std::endl;\n         v1 *= value_type(1.);\n         std::cout << \"v1 *= 1. = \" << v1 << std::endl;\n         v1 *= t;\n         std::cout << \"v1 *= N = \" << v1 << std::endl;\n\n         // Unary vector operations resulting in a scalar\n         initialize_vector(v1);\n         t = ublas::sum(v1);\n         std::cout << \"sum (v1) = \" << t << std::endl;\n         n = ublas::norm_1(v1);\n         std::cout << \"norm_1 (v1) = \" << n << std::endl;\n         n = ublas::norm_2(v1);\n         std::cout << \"norm_2 (v1) = \" << n << std::endl;\n         n = ublas::norm_inf(v1);\n         std::cout << \"norm_inf (v1) = \" << n << std::endl;\n\n         i = ublas::index_norm_inf(v1);\n         std::cout << \"index_norm_inf (v1) = \" << i << std::endl;\n\n         // Binary vector operations resulting in a scalar\n         initialize_vector(v1);\n         initialize_vector(v2);\n         t = ublas::inner_prod(v1, v2);\n         std::cout << \"inner_prod (v1, v2) = \" << t << std::endl;\n      }\n   }\n   void operator()() const\n   {\n      {\n         V v1(N, N), v2(N, N), v3(N, N);\n         test_with(v1, v2, v3);\n\n#ifdef USE_RANGE\n         ublas::vector_range<V> vr1(v1, ublas::range(0, N)),\n             vr2(v2, ublas::range(0, N)),\n             vr3(v3, ublas::range(0, N));\n         test_with(vr1, vr2, vr3);\n#endif\n\n#ifdef USE_SLICE\n         ublas::vector_slice<V> vs1(v1, ublas::slice(0, 1, N)),\n             vs2(v2, ublas::slice(0, 1, N)),\n             vs3(v3, ublas::slice(0, 1, N));\n         test_with(vs1, vs2, vs3);\n#endif\n      }\n   }\n};\n\n// Test vector\nvoid test_vector()\n{\n   std::cout << \"test_vector\" << std::endl;\n\n#ifdef USE_SPARSE_VECTOR\n#ifdef USE_MAP_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, map_array\" << std::endl;\n   test_my_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, map_array\" << std::endl;\n   test_my_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, map_array\" << std::endl;\n   test_my_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, map_array\" << std::endl;\n   test_my_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_STD_MAP\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, std::map\" << std::endl;\n   test_my_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, std::map\" << std::endl;\n   test_my_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, std::map\" << std::endl;\n   test_my_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, std::map\" << std::endl;\n   test_my_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >, 3>()();\n#endif\n#endif\n#endif\n#endif\n\n#ifdef USE_COMPRESSED_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type compressed\" << std::endl;\n   test_my_vector<ublas::compressed_vector<mp_test_type>, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double compressed\" << std::endl;\n   test_my_vector<ublas::compressed_vector<double>, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type> compressed\" << std::endl;\n   test_my_vector<ublas::compressed_vector<std::complex<mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double> compressed\" << std::endl;\n   test_my_vector<ublas::compressed_vector<std::complex<double> >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_COORDINATE_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type coordinate\" << std::endl;\n   test_my_vector<ublas::coordinate_vector<mp_test_type>, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double coordinate\" << std::endl;\n   test_my_vector<ublas::coordinate_vector<double>, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type> coordinate\" << std::endl;\n   test_my_vector<ublas::coordinate_vector<std::complex<mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double> coordinate\" << std::endl;\n   test_my_vector<ublas::coordinate_vector<std::complex<double> >, 3>()();\n#endif\n#endif\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test32.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test3.hpp\"\n\n// Test matrix & vector expression templates\ntemplate <class V, class M, int N>\nstruct test_my_matrix_vector\n{\n   typedef typename V::value_type value_type;\n\n   template <class VP, class MP>\n   void test_with(VP& v1, VP& v2, MP& m1) const\n   {\n      {\n         // Rows and columns\n         initialize_matrix(m1);\n         for (int i = 0; i < N; ++i)\n         {\n            v1 = ublas::row(m1, i);\n            std::cout << \"row (m, \" << i << \") = \" << v1 << std::endl;\n            v1 = ublas::column(m1, i);\n            std::cout << \"column (m, \" << i << \") = \" << v1 << std::endl;\n         }\n\n         // Outer product\n         initialize_vector(v1);\n         initialize_vector(v2);\n         m1 = ublas::outer_prod(v1, v2);\n         std::cout << \"outer_prod (v1, v2) = \" << m1 << std::endl;\n\n         // Matrix vector product\n         initialize_matrix(m1);\n         initialize_vector(v1);\n         v2 = ublas::prod(m1, v1);\n         std::cout << \"prod (m1, v1) = \" << v2 << std::endl;\n         v2 = ublas::prod(v1, m1);\n         std::cout << \"prod (v1, m1) = \" << v2 << std::endl;\n      }\n   }\n   void operator()() const\n   {\n      {\n         V v1(N, N), v2(N, N);\n         M m1(N, N, N * N);\n\n         test_with(v1, v2, m1);\n\n         ublas::matrix_row<M> mr1(m1, 0), mr2(m1, N - 1);\n         test_with(mr1, mr2, m1);\n\n         ublas::matrix_column<M> mc1(m1, 0), mc2(m1, N - 1);\n         test_with(mc1, mc2, m1);\n\n#ifdef USE_RANGE\n         ublas::matrix_vector_range<M> mvr1(m1, ublas::range(0, N), ublas::range(0, N)),\n             mvr2(m1, ublas::range(0, N), ublas::range(0, N));\n         test_with(mvr1, mvr2, m1);\n#endif\n\n#ifdef USE_SLICE\n         ublas::matrix_vector_slice<M> mvs1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             mvs2(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));\n         test_with(mvs1, mvs2, m1);\n#endif\n      }\n   }\n};\n\n// Test matrix & vector\nvoid test_matrix_vector()\n{\n   std::cout << \"test_matrix_vector\" << std::endl;\n\n#ifdef USE_SPARSE_MATRIX\n#ifdef USE_MAP_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, map_array\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >,\n                         ublas::mapped_matrix<mp_test_type, ublas::row_major, ublas::map_array<std::size_t, mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, map_array\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >,\n                         ublas::mapped_matrix<double, ublas::row_major, ublas::map_array<std::size_t, double> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, map_array\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >,\n                         ublas::mapped_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::map_array<std::size_t, std::complex<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, map_array\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >,\n                         ublas::mapped_matrix<std::complex<double>, ublas::row_major, ublas::map_array<std::size_t, std::complex<double> > >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_STD_MAP\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, std::map\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >,\n                         ublas::mapped_matrix<mp_test_type, ublas::row_major, std::map<std::size_t, mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, std::map\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >,\n                         ublas::mapped_matrix<double, ublas::row_major, std::map<std::size_t, double> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, std::map\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >,\n                         ublas::mapped_matrix<std::complex<mp_test_type>, ublas::row_major, std::map<std::size_t, std::complex<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, std::map\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >,\n                         ublas::mapped_matrix<std::complex<double>, ublas::row_major, std::map<std::size_t, std::complex<double> > >, 3>()();\n#endif\n#endif\n#endif\n#endif\n\n#ifdef USE_SPARSE_VECTOR_OF_SPARSE_VECTOR\n#ifdef USE_MAP_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, mapped_vector map_array\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >,\n                         ublas::mapped_vector<mp_test_type, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, mapped_vector map_array\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >,\n                         ublas::mapped_vector<double, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, double> > >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, mapped_vector map_array\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >,\n                         ublas::mapped_vector<std::complex<mp_test_type>, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, std::complex<mp_test_type> > > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>,mapped_vector map_array\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >,\n                         ublas::mapped_vector<std::complex<double>, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, std::complex<double> > > >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_STD_MAP\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, mapped_vector std::map\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >,\n                         ublas::mapped_vector<mp_test_type, ublas::row_major, std::map<std::size_t, std::map<std::size_t, mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, mapped_vector std::map\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >,\n                         ublas::mapped_vector<double, ublas::row_major, std::map<std::size_t, std::map<std::size_t, double> > >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, mapped_vector std::map\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >,\n                         ublas::mapped_vector<std::complex<mp_test_type>, ublas::row_major, std::map<std::size_t, std::map<std::size_t, std::complex<mp_test_type> > > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, mapped_vector std::map\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >,\n                         ublas::mapped_vector<std::complex<double>, ublas::row_major, std::map<std::size_t, std::map<std::size_t, std::complex<double> > > >, 3>()();\n#endif\n#endif\n#endif\n#endif\n\n#ifdef USE_GENERALIZED_VECTOR_OF_VECTOR\n#ifdef USE_MAP_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, generalized_vector_of_vector map_array\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >,\n                         ublas::generalized_vector_of_vector<mp_test_type, ublas::row_major, ublas::vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> > > >, 3>()();\n   test_my_matrix_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >,\n                         ublas::generalized_vector_of_vector<mp_test_type, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >, ublas::map_array<std::size_t, ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> > > > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, generalized_vector_of_vector map_array\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >,\n                         ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> > > >, 3>()();\n   test_my_matrix_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >,\n                         ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >, ublas::map_array<std::size_t, ublas::mapped_vector<double, ublas::map_array<std::size_t, double> > > > >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, generalized_vector_of_vector map_array\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >,\n                         ublas::generalized_vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > > > >, 3>()();\n   test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >,\n                         ublas::generalized_vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >, ublas::map_array<std::size_t, ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > > > > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, generalized_vector_of_vector map_array\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >,\n                         ublas::generalized_vector_of_vector<std::complex<double>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > > > >, 3>()();\n   test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >,\n                         ublas::generalized_vector_of_vector<std::complex<double>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >, ublas::map_array<std::size_t, ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > > > > >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_STD_MAP\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, generalized_vector_of_vector std::map\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >,\n                         ublas::generalized_vector_of_vector<mp_test_type, ublas::row_major, ublas::vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> > > >, 3>()();\n   test_my_matrix_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >,\n                         ublas::generalized_vector_of_vector<mp_test_type, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >, std::map<std::size_t, ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> > > > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, generalized_vector_of_vector std::map\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >,\n                         ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::vector<ublas::mapped_vector<double, std::map<std::size_t, double> > > >, 3>()();\n   test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >,\n                         ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >, std::map<std::size_t, ublas::mapped_vector<double, std::map<std::size_t, double> > > > >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, generalized_vector_of_vector std::map\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >,\n                         ublas::generalized_vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > > > >, 3>()();\n   test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >,\n                         ublas::generalized_vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >, std::map<std::size_t, ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > > > > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, generalized_vector_of_vector std::map\" << std::endl;\n   test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >,\n                         ublas::generalized_vector_of_vector<std::complex<double>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > > > >, 3>()();\n   test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >,\n                         ublas::generalized_vector_of_vector<std::complex<double>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >, std::map<std::size_t, ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > > > > >, 3>()();\n#endif\n#endif\n#endif\n#endif\n\n#ifdef USE_COMPRESSED_MATRIX\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type compressed\" << std::endl;\n   test_my_matrix_vector<ublas::compressed_vector<mp_test_type>,\n                         ublas::compressed_matrix<mp_test_type>, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double compressed\" << std::endl;\n   test_my_matrix_vector<ublas::compressed_vector<double>,\n                         ublas::compressed_matrix<double>, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type> compressed\" << std::endl;\n   test_my_matrix_vector<ublas::compressed_vector<std::complex<mp_test_type> >,\n                         ublas::compressed_matrix<std::complex<mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double> compressed\" << std::endl;\n   test_my_matrix_vector<ublas::compressed_vector<std::complex<double> >,\n                         ublas::compressed_matrix<std::complex<double> >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_COORDINATE_MATRIX\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type coordinate\" << std::endl;\n   test_my_matrix_vector<ublas::coordinate_vector<mp_test_type>,\n                         ublas::coordinate_matrix<mp_test_type>, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double coordinate\" << std::endl;\n   test_my_matrix_vector<ublas::coordinate_vector<double>,\n                         ublas::coordinate_matrix<double>, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type> coordinate\" << std::endl;\n   test_my_matrix_vector<ublas::coordinate_vector<std::complex<mp_test_type> >,\n                         ublas::coordinate_matrix<std::complex<mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double> coordinate\" << std::endl;\n   test_my_matrix_vector<ublas::coordinate_vector<std::complex<double> >,\n                         ublas::coordinate_matrix<std::complex<double> >, 3>()();\n#endif\n#endif\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test33.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test3.hpp\"\n\n// Test matrix expression templates\ntemplate <class M, int N>\nstruct test_my_matrix\n{\n   typedef typename M::value_type value_type;\n\n   template <class MP>\n   void test_with(MP& m1, MP& m2, MP& m3) const\n   {\n      {\n         value_type t;\n\n         // Default Construct\n         default_construct<MP>::test();\n\n         // Copy and swap\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         m1 = m2;\n         std::cout << \"m1 = m2 = \" << m1 << std::endl;\n         m1.assign_temporary(m2);\n         std::cout << \"m1.assign_temporary (m2) = \" << m1 << std::endl;\n         m1.swap(m2);\n         std::cout << \"m1.swap (m2) = \" << m1 << \" \" << m2 << std::endl;\n\n         // Zero assignment\n         m1 = ublas::zero_matrix<>(m1.size1(), m1.size2());\n         std::cout << \"m1.zero_matrix = \" << m1 << std::endl;\n         m1 = m2;\n\n#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING\n         // Project range and slice\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         project(m1, ublas::range(0, 1), ublas::range(0, 1))         = project(m2, ublas::range(0, 1), ublas::range(0, 1));\n         project(m1, ublas::range(0, 1), ublas::range(0, 1))         = project(m2, ublas::slice(0, 1, 1), ublas::slice(0, 1, 1));\n         project(m1, ublas::slice(2, -1, 2), ublas::slice(2, -1, 2)) = project(m2, ublas::slice(0, 1, 2), ublas::slice(0, 1, 2));\n         project(m1, ublas::slice(2, -1, 2), ublas::slice(2, -1, 2)) = project(m2, ublas::range(0, 2), ublas::range(0, 2));\n         std::cout << \"m1 = range/slice \" << m1 << std::endl;\n#endif\n\n         // Unary matrix operations resulting in a matrix\n         initialize_matrix(m1);\n         m2 = -m1;\n         std::cout << \"- m1 = \" << m2 << std::endl;\n         m2 = ublas::conj(m1);\n         std::cout << \"conj (m1) = \" << m2 << std::endl;\n\n         // Binary matrix operations resulting in a matrix\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         initialize_matrix(m3);\n         m3 = m1 + m2;\n         std::cout << \"m1 + m2 = \" << m3 << std::endl;\n         m3 = m1 - m2;\n         std::cout << \"m1 - m2 = \" << m3 << std::endl;\n\n         // Scaling a matrix\n         t = N;\n         initialize_matrix(m1);\n         m2 = value_type(1.) * m1;\n         std::cout << \"1. * m1 = \" << m2 << std::endl;\n         m2 = t * m1;\n         std::cout << \"N * m1 = \" << m2 << std::endl;\n         initialize_matrix(m1);\n         m2 = m1 * value_type(1.);\n         std::cout << \"m1 * 1. = \" << m2 << std::endl;\n         m2 = m1 * t;\n         std::cout << \"m1 * N = \" << m2 << std::endl;\n\n         // Some assignments\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         m2 += m1;\n         std::cout << \"m2 += m1 = \" << m2 << std::endl;\n         m2 -= m1;\n         std::cout << \"m2 -= m1 = \" << m2 << std::endl;\n         m2 = m2 + m1;\n         std::cout << \"m2 = m2 + m1 = \" << m2 << std::endl;\n         m2 = m2 - m1;\n         std::cout << \"m2 = m2 - m1 = \" << m2 << std::endl;\n         m1 *= value_type(1.);\n         std::cout << \"m1 *= 1. = \" << m1 << std::endl;\n         m1 *= t;\n         std::cout << \"m1 *= N = \" << m1 << std::endl;\n\n         // Transpose\n         initialize_matrix(m1);\n         m2 = ublas::trans(m1);\n         std::cout << \"trans (m1) = \" << m2 << std::endl;\n\n         // Hermitean\n         initialize_matrix(m1);\n         m2 = ublas::herm(m1);\n         std::cout << \"herm (m1) = \" << m2 << std::endl;\n\n         // Matrix multiplication\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         m3 = ublas::prod(m1, m2);\n         std::cout << \"prod (m1, m2) = \" << m3 << std::endl;\n      }\n   }\n   void operator()() const\n   {\n      {\n         M m1(N, N, N * N), m2(N, N, N * N), m3(N, N, N * N);\n         test_with(m1, m2, m3);\n\n#ifdef USE_RANGE\n         ublas::matrix_range<M> mr1(m1, ublas::range(0, N), ublas::range(0, N)),\n             mr2(m2, ublas::range(0, N), ublas::range(0, N)),\n             mr3(m3, ublas::range(0, N), ublas::range(0, N));\n         test_with(mr1, mr2, mr3);\n#endif\n\n#ifdef USE_SLICE\n         ublas::matrix_slice<M> ms1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             ms2(m2, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             ms3(m3, ublas::slice(0, 1, N), ublas::slice(0, 1, N));\n         test_with(ms1, ms2, ms3);\n#endif\n      }\n   }\n};\n\n// Test matrix\nvoid test_matrix()\n{\n   std::cout << \"test_matrix\" << std::endl;\n\n#ifdef USE_SPARSE_MATRIX\n#ifdef USE_MAP_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, mapped_matrix map_array\" << std::endl;\n   test_my_matrix<ublas::mapped_matrix<mp_test_type, ublas::row_major, ublas::map_array<std::size_t, mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, mapped_matrix map_array\" << std::endl;\n   test_my_matrix<ublas::mapped_matrix<double, ublas::row_major, ublas::map_array<std::size_t, double> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, mapped_matrix map_array\" << std::endl;\n   test_my_matrix<ublas::mapped_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::map_array<std::size_t, std::complex<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, mapped_matrix map_array\" << std::endl;\n   test_my_matrix<ublas::mapped_matrix<std::complex<double>, ublas::row_major, ublas::map_array<std::size_t, std::complex<double> > >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_STD_MAP\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, mapped_matrix std::map\" << std::endl;\n   test_my_matrix<ublas::mapped_matrix<mp_test_type, ublas::row_major, std::map<std::size_t, mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, mapped_matrix std::map\" << std::endl;\n   test_my_matrix<ublas::mapped_matrix<double, ublas::row_major, std::map<std::size_t, double> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, mapped_matrix std::map\" << std::endl;\n   test_my_matrix<ublas::mapped_matrix<std::complex<mp_test_type>, ublas::row_major, std::map<std::size_t, std::complex<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, mapped_matrix std::map\" << std::endl;\n   test_my_matrix<ublas::mapped_matrix<std::complex<double>, ublas::row_major, std::map<std::size_t, std::complex<double> > >, 3>()();\n#endif\n#endif\n#endif\n#endif\n\n#ifdef USE_SPARSE_VECTOR_OF_SPARSE_VECTOR\n#ifdef USE_MAP_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, mapped_vector_of_mapped_vector map_array\" << std::endl;\n   test_my_matrix<ublas::mapped_vector_of_mapped_vector<mp_test_type, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, mapped_vector_of_mapped_vector map_array\" << std::endl;\n   test_my_matrix<ublas::mapped_vector_of_mapped_vector<double, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, double> > >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, mapped_vector_of_mapped_vector map_array\" << std::endl;\n   test_my_matrix<ublas::mapped_vector_of_mapped_vector<std::complex<mp_test_type>, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, std::complex<mp_test_type> > > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, mapped_vector_of_mapped_vectormap_array\" << std::endl;\n   test_my_matrix<ublas::mapped_vector_of_mapped_vector<std::complex<double>, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, std::complex<double> > > >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_STD_MAP\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, mapped_vector_of_mapped_vector std::map\" << std::endl;\n   test_my_matrix<ublas::mapped_vector_of_mapped_vector<mp_test_type, ublas::row_major, std::map<std::size_t, std::map<std::size_t, mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, mapped_vector_of_mapped_vector std::map\" << std::endl;\n   test_my_matrix<ublas::mapped_vector_of_mapped_vector<double, ublas::row_major, std::map<std::size_t, std::map<std::size_t, double> > >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, mapped_vector_of_mapped_vector std::map\" << std::endl;\n   test_my_matrix<ublas::mapped_vector_of_mapped_vector<std::complex<mp_test_type>, ublas::row_major, std::map<std::size_t, std::map<std::size_t, std::complex<mp_test_type> > > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, mapped_vector_of_mapped_vector std::map\" << std::endl;\n   test_my_matrix<ublas::mapped_vector_of_mapped_vector<std::complex<double>, ublas::row_major, std::map<std::size_t, std::map<std::size_t, std::complex<double> > > >, 3>()();\n#endif\n#endif\n#endif\n#endif\n\n#ifdef USE_GENERALIZED_VECTOR_OF_VECTOR\n#ifdef USE_MAP_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type,generalized_vector_of_vector map_array\" << std::endl;\n   test_my_matrix<ublas::generalized_vector_of_vector<mp_test_type, ublas::row_major, ublas::vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> > > >, 3>()();\n   test_my_matrix<ublas::generalized_vector_of_vector<mp_test_type, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >, ublas::map_array<std::size_t, ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> > > > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, generalized_vector_of_vector map_array\" << std::endl;\n   test_my_matrix<ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> > > >, 3>()();\n   test_my_matrix<ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >, ublas::map_array<std::size_t, ublas::mapped_vector<double, ublas::map_array<std::size_t, double> > > > >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, generalized_vector_of_vector map_array\" << std::endl;\n   test_my_matrix<ublas::generalized_vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > > > >, 3>()();\n   test_my_matrix<ublas::generalized_vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >, ublas::map_array<std::size_t, ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > > > > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, generalized_vector_of_vector map_array\" << std::endl;\n   test_my_matrix<ublas::generalized_vector_of_vector<std::complex<double>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > > > >, 3>()();\n   test_my_matrix<ublas::generalized_vector_of_vector<std::complex<double>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >, ublas::map_array<std::size_t, ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > > > > >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_STD_MAP\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, generalized_vector_of_vector std::map\" << std::endl;\n   test_my_matrix<ublas::generalized_vector_of_vector<mp_test_type, ublas::row_major, ublas::vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> > > >, 3>()();\n   test_my_matrix<ublas::generalized_vector_of_vector<mp_test_type, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >, std::map<std::size_t, ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> > > > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, generalized_vector_of_vector std::map\" << std::endl;\n   test_my_matrix<ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::vector<ublas::mapped_vector<double, std::map<std::size_t, double> > > >, 3>()();\n   test_my_matrix<ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >, std::map<std::size_t, ublas::mapped_vector<double, std::map<std::size_t, double> > > > >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, generalized_vector_of_vector std::map\" << std::endl;\n   test_my_matrix<ublas::generalized_vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > > > >, 3>()();\n   test_my_matrix<ublas::generalized_vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >, std::map<std::size_t, ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > > > > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, generalized_vector_of_vector std::map\" << std::endl;\n   test_my_matrix<ublas::generalized_vector_of_vector<std::complex<double>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > > > >, 3>()();\n   test_my_matrix<ublas::generalized_vector_of_vector<std::complex<double>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >, std::map<std::size_t, ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > > > > >, 3>()();\n#endif\n#endif\n#endif\n#endif\n\n#ifdef USE_COMPRESSED_MATRIX\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type compressed_matrix\" << std::endl;\n   test_my_matrix<ublas::compressed_matrix<mp_test_type>, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double compressed_matrix\" << std::endl;\n   test_my_matrix<ublas::compressed_matrix<double>, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type> compressed_matrix\" << std::endl;\n   test_my_matrix<ublas::compressed_matrix<std::complex<mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double> compressed_matrix\" << std::endl;\n   test_my_matrix<ublas::compressed_matrix<std::complex<double> >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_COORDINATE_MATRIX\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type coordinate_matrix\" << std::endl;\n   test_my_matrix<ublas::coordinate_matrix<mp_test_type>, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double coordinate_matrix\" << std::endl;\n   test_my_matrix<ublas::coordinate_matrix<double>, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type> coordinate_matrix\" << std::endl;\n   test_my_matrix<ublas::coordinate_matrix<std::complex<mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double> coordinate_matrix\" << std::endl;\n   test_my_matrix<ublas::coordinate_matrix<std::complex<double> >, 3>()();\n#endif\n#endif\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test4.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test4.hpp\"\n\nint main()\n{\n   test_matrix_vector();\n   test_matrix();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test4.hpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#ifndef TEST4_H\n#define TEST4_H\n\n#ifdef _MSC_VER\n#pragma warning(disable : 4800 4996 4127 4100)\n#endif\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\n#ifdef TEST_ET\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_on> mp_test_type;\n#else\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off> mp_test_type;\n#endif\n//typedef double mp_test_type;\n\n#define USE_RANGE\n#define USE_SLICE\n#define USE_FLOAT\n#define USE_UNBOUNDED_ARRAY\n#define USE_STD_VECTOR\n#define USE_BOUNDED_VECTOR USE_MATRIX\n#define USE_UNBOUNDED_ARRAY\n#define USE_MAP_ARRAY\n#define USE_STD_MAP\n#define USE_MAPPED_VECTOR\n#define USE_COMPRESSED_VECTOR\n#define USE_COORDINATE_VECTOR\n#define USE_MAPPED_MATRIX\n#define USE_COMPRESSED_MATRIX\n#define USE_COORDINATE_MATRIX\n\n#include <iostream>\n\n#include <boost/numeric/ublas/vector.hpp>\n#include <boost/numeric/ublas/matrix.hpp>\n#include <boost/numeric/ublas/matrix_proxy.hpp>\n#include <boost/numeric/ublas/banded.hpp>\n#include <boost/numeric/ublas/io.hpp>\n\nnamespace ublas = boost::numeric::ublas;\n\n#include \"common/init.hpp\"\n\n//#define USE_BANDED\n#define USE_DIAGONAL\n\nvoid test_matrix_vector();\nvoid test_matrix();\n\n// FIXME slice are failing in assignment to zero elements\n#undef USE_SLICE\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test42.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test4.hpp\"\n\n// Test matrix & vector expression templates\ntemplate <class V, class M, int N>\nstruct test_my_matrix_vector\n{\n   typedef typename V::value_type value_type;\n\n   template <class VP, class MP>\n   void test_with(VP& v1, VP& v2, MP& m1) const\n   {\n      {\n#ifndef USE_DIAGONAL\n         // Rows and columns\n         initialize_matrix(m1);\n         for (int i = 0; i < N; ++i)\n         {\n            v2 = ublas::row(m1, i);\n            std::cout << \"row (m, \" << i << \") = \" << v2 << std::endl;\n            v2 = ublas::column(m1, i);\n            std::cout << \"column (m, \" << i << \") = \" << v2 << std::endl;\n         }\n\n         // Outer product\n         initialize_vector(v1);\n         initialize_vector(v2);\n         v1(0)     = 0;\n         v1(N - 1) = 0;\n         m1        = ublas::outer_prod(v1, v2);\n         std::cout << \"outer_prod (v1, v2) = \" << m1 << std::endl;\n\n         // Matrix vector product\n         initialize_matrix(m1);\n         initialize_vector(v1);\n         v2 = ublas::prod(m1, v1);\n         std::cout << \"prod (m1, v1) = \" << v2 << std::endl;\n         v2 = ublas::prod(v1, m1);\n         std::cout << \"prod (v1, m1) = \" << v2 << std::endl;\n#else\n      (void)v1;  // warning suppression\n      (void)v2;  // warning suppression\n      (void)m1;  // warning suppression\n#endif\n      }\n   }\n   void operator()() const\n   {\n      {\n         V v1(N), v2(N);\n#ifdef USE_BANDED\n         M m1(N, N, 1, 1);\n#endif\n#ifdef USE_DIAGONAL\n         M m1(N, N);\n#endif\n         test_with(v1, v2, m1);\n\n         ublas::matrix_row<M> mr1(m1, 1), mr2(m1, 1);\n         test_with(mr1, mr2, m1);\n\n         ublas::matrix_column<M> mc1(m1, 1), mc2(m1, 1);\n         test_with(mc1, mc2, m1);\n\n#ifdef USE_RANGE\n         ublas::matrix_vector_range<M> mvr1(m1, ublas::range(0, N), ublas::range(0, N)),\n             mvr2(m1, ublas::range(0, N), ublas::range(0, N));\n         test_with(mvr1, mvr2, m1);\n#endif\n\n#ifdef USE_SLICE\n         ublas::matrix_vector_slice<M> mvs1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             mvs2(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));\n         test_with(mvs1, mvs2, m1);\n#endif\n      }\n   }\n\n   void operator()(int) const\n   {\n#ifdef USE_ADAPTOR\n      {\n#ifdef USE_BANDED\n         V                        v1(N), v2(N);\n         M                        m1(N, N, 1, 1);\n         ublas::banded_adaptor<M> bam1(m1, 1, 1);\n         test_with(v1, v2, bam1);\n\n         ublas::matrix_row<ublas::banded_adaptor<M> > mr1(bam1, 1), mr2(bam1, 1);\n         test_with(mr1, mr2, bam1);\n\n         ublas::matrix_column<ublas::banded_adaptor<M> > mc1(bam1, 1), mc2(bam1, 1);\n         test_with(mc1, mc2, bam1);\n\n#ifdef USE_RANGE\n         ublas::matrix_vector_range<ublas::banded_adaptor<M> > mvr1(bam1, ublas::range(0, N), ublas::range(0, N)),\n             mvr2(bam1, ublas::range(0, N), ublas::range(0, N));\n         test_with(mvr1, mvr2, bam1);\n#endif\n\n#ifdef USE_SLICE\n         ublas::matrix_vector_slice<ublas::banded_adaptor<M> > mvs1(bam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             mvs2(bam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));\n         test_with(mvs1, mvs2, bam1);\n#endif\n#endif\n#ifdef USE_DIAGONAL\n         V                          v1(N), v2(N);\n         M                          m1(N, N);\n         ublas::diagonal_adaptor<M> dam1(m1);\n         test_with(v1, v2, dam1);\n\n         ublas::matrix_row<ublas::diagonal_adaptor<M> > mr1(dam1, 1), mr2(dam1, 1);\n         test_with(mr1, mr2, dam1);\n\n         ublas::matrix_column<ublas::diagonal_adaptor<M> > mc1(dam1, 1), mc2(dam1, 1);\n         test_with(mc1, mc2, dam1);\n\n#ifdef USE_RANGE\n         ublas::matrix_vector_range<ublas::diagonal_adaptor<M> > mvr1(dam1, ublas::range(0, N), ublas::range(0, N)),\n             mvr2(dam1, ublas::range(0, N), ublas::range(0, N));\n         test_with(mvr1, mvr2, dam1);\n#endif\n\n#ifdef USE_SLICE\n         ublas::matrix_vector_slice<ublas::diagonal_adaptor<M> > mvs1(dam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             mvs2(dam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));\n         test_with(mvs1, mvs2, dam1);\n#endif\n#endif\n      }\n#endif\n   }\n};\n\n// Test matrix & vector\nvoid test_matrix_vector()\n{\n   std::cout << \"test_matrix_vector\" << std::endl;\n\n#ifdef USE_BANDED\n#ifdef USE_BOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,\n                         ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()();\n   test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,\n                         ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,\n                         ublas::banded_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()();\n   test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,\n                         ublas::banded_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(0);\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,\n                         ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,\n                         ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,\n                         ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,\n                         ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(0);\n#endif\n#endif\n#endif\n\n#ifdef USE_UNBOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,\n                         ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()();\n   test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,\n                         ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,\n                         ublas::banded_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()();\n   test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,\n                         ublas::banded_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()(0);\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,\n                         ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,\n                         ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,\n                         ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,\n                         ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(0);\n#endif\n#endif\n#endif\n\n#ifdef USE_STD_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,\n                         ublas::banded_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()();\n   test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,\n                         ublas::banded_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<double, std::vector<double> >,\n                         ublas::banded_matrix<double, ublas::row_major, std::vector<double> >, 3>()();\n   test_my_matrix_vector<ublas::vector<double, std::vector<double> >,\n                         ublas::banded_matrix<double, ublas::row_major, std::vector<double> >, 3>()(0);\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,\n                         ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,\n                         ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,\n                         ublas::banded_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,\n                         ublas::banded_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()(0);\n#endif\n#endif\n#endif\n#endif\n\n#ifdef USE_DIAGONAL\n#ifdef USE_BOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,\n                         ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()();\n   test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,\n                         ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,\n                         ublas::diagonal_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()();\n   test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,\n                         ublas::diagonal_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(0);\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,\n                         ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,\n                         ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,\n                         ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,\n                         ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(0);\n#endif\n#endif\n#endif\n\n#ifdef USE_UNBOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,\n                         ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()();\n   test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,\n                         ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,\n                         ublas::diagonal_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()();\n   test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,\n                         ublas::diagonal_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()(0);\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,\n                         ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,\n                         ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,\n                         ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,\n                         ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(0);\n#endif\n#endif\n#endif\n\n#ifdef USE_STD_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,\n                         ublas::diagonal_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()();\n   test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,\n                         ublas::diagonal_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<double, std::vector<double> >,\n                         ublas::diagonal_matrix<double, ublas::row_major, std::vector<double> >, 3>()();\n   test_my_matrix_vector<ublas::vector<double, std::vector<double> >,\n                         ublas::diagonal_matrix<double, ublas::row_major, std::vector<double> >, 3>()(0);\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,\n                         ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,\n                         ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,\n                         ublas::diagonal_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,\n                         ublas::diagonal_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()(0);\n#endif\n#endif\n#endif\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test43.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test4.hpp\"\n\n// Test matrix expression templates\ntemplate <class M, int N>\nstruct test_my_matrix\n{\n   typedef typename M::value_type value_type;\n\n   template <class MP>\n   void test_with(MP& m1, MP& m2, MP& m3) const\n   {\n      {\n         value_type t;\n\n         // Default Construct\n         default_construct<MP>::test();\n\n         // Copy and swap\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         m1 = m2;\n         std::cout << \"m1 = m2 = \" << m1 << std::endl;\n         m1.assign_temporary(m2);\n         std::cout << \"m1.assign_temporary (m2) = \" << m1 << std::endl;\n         m1.swap(m2);\n         std::cout << \"m1.swap (m2) = \" << m1 << \" \" << m2 << std::endl;\n\n         // Zero assignment\n         m1 = ublas::zero_matrix<>(m1.size1(), m1.size2());\n         std::cout << \"m1.zero_matrix = \" << m1 << std::endl;\n         m1 = m2;\n\n         // Unary matrix operations resulting in a matrix\n         initialize_matrix(m1);\n         m2 = -m1;\n         std::cout << \"- m1 = \" << m2 << std::endl;\n         m2 = ublas::conj(m1);\n         std::cout << \"conj (m1) = \" << m2 << std::endl;\n\n         // Binary matrix operations resulting in a matrix\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         m3 = m1 + m2;\n         std::cout << \"m1 + m2 = \" << m3 << std::endl;\n         m3 = m1 - m2;\n         std::cout << \"m1 - m2 = \" << m3 << std::endl;\n\n         // Scaling a matrix\n         t = N;\n         initialize_matrix(m1);\n         m2 = value_type(1.) * m1;\n         std::cout << \"1. * m1 = \" << m2 << std::endl;\n         m2 = t * m1;\n         std::cout << \"N * m1 = \" << m2 << std::endl;\n         initialize_matrix(m1);\n         m2 = m1 * value_type(1.);\n         std::cout << \"m1 * 1. = \" << m2 << std::endl;\n         m2 = m1 * t;\n         std::cout << \"m1 * N = \" << m2 << std::endl;\n\n         // Some assignments\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         m2 += m1;\n         std::cout << \"m2 += m1 = \" << m2 << std::endl;\n         m2 -= m1;\n         std::cout << \"m2 -= m1 = \" << m2 << std::endl;\n         m2 = m2 + m1;\n         std::cout << \"m2 = m2 + m1 = \" << m2 << std::endl;\n         m2 = m2 - m1;\n         std::cout << \"m2 = m2 - m1 = \" << m2 << std::endl;\n         m1 *= value_type(1.);\n         std::cout << \"m1 *= 1. = \" << m1 << std::endl;\n         m1 *= t;\n         std::cout << \"m1 *= N = \" << m1 << std::endl;\n\n         // Transpose\n         initialize_matrix(m1);\n         m2 = ublas::trans(m1);\n         std::cout << \"trans (m1) = \" << m2 << std::endl;\n\n         // Hermitean\n         initialize_matrix(m1);\n         m2 = ublas::herm(m1);\n         std::cout << \"herm (m1) = \" << m2 << std::endl;\n\n         // Matrix multiplication\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         // Banded times banded isn't banded\n         std::cout << \"prod (m1, m2) = \" << ublas::prod(m1, m2) << std::endl;\n      }\n   }\n   void operator()() const\n   {\n      {\n#ifdef USE_BANDED\n         M m1(N, N, 1, 1), m2(N, N, 1, 1), m3(N, N, 1, 1);\n#endif\n#ifdef USE_DIAGONAL\n         M m1(N, N), m2(N, N), m3(N, N);\n#endif\n         test_with(m1, m2, m3);\n\n#ifdef USE_RANGE\n         ublas::matrix_range<M> mr1(m1, ublas::range(0, N), ublas::range(0, N)),\n             mr2(m2, ublas::range(0, N), ublas::range(0, N)),\n             mr3(m3, ublas::range(0, N), ublas::range(0, N));\n         test_with(mr1, mr2, mr3);\n#endif\n\n#ifdef USE_SLICE\n         ublas::matrix_slice<M> ms1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             ms2(m2, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             ms3(m3, ublas::slice(0, 1, N), ublas::slice(0, 1, N));\n         test_with(ms1, ms2, ms3);\n#endif\n      }\n\n#ifdef USE_ADAPTOR\n      {\n#ifdef USE_BANDED\n         M                        m1(N, N, 1, 1), m2(N, N, 1, 1), m3(N, N, 1, 1);\n         ublas::banded_adaptor<M> bam1(m1, 1, 1), bam2(m2, 1, 1), bam3(m3, 1, 1);\n         test_with(bam1, bam2, bam3);\n\n#ifdef USE_RANGE\n         ublas::matrix_range<ublas::banded_adaptor<M> > mr1(bam1, ublas::range(0, N), ublas::range(0, N)),\n             mr2(bam2, ublas::range(0, N), ublas::range(0, N)),\n             mr3(bam3, ublas::range(0, N), ublas::range(0, N));\n         test_with(mr1, mr2, mr3);\n#endif\n\n#ifdef USE_SLICE\n         ublas::matrix_slice<ublas::banded_adaptor<M> > ms1(bam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             ms2(bam2, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             ms3(bam3, ublas::slice(0, 1, N), ublas::slice(0, 1, N));\n         test_with(ms1, ms2, ms3);\n#endif\n#endif\n#ifdef USE_DIAGONAL\n         M                          m1(N, N), m2(N, N), m3(N, N);\n         ublas::diagonal_adaptor<M> dam1(m1), dam2(m2), dam3(m3);\n         test_with(dam1, dam2, dam3);\n\n#ifdef USE_RANGE\n         ublas::matrix_range<ublas::diagonal_adaptor<M> > mr1(dam1, ublas::range(0, N), ublas::range(0, N)),\n             mr2(dam2, ublas::range(0, N), ublas::range(0, N)),\n             mr3(dam3, ublas::range(0, N), ublas::range(0, N));\n         test_with(mr1, mr2, mr3);\n#endif\n\n#ifdef USE_SLICE\n         ublas::matrix_slice<ublas::diagonal_adaptor<M> > ms1(dam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             ms2(dam2, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             ms3(dam3, ublas::slice(0, 1, N), ublas::slice(0, 1, N));\n         test_with(ms1, ms2, ms3);\n#endif\n#endif\n      }\n#endif\n   }\n};\n\n// Test matrix\nvoid test_matrix()\n{\n   std::cout << \"test_matrix\" << std::endl;\n\n#ifdef USE_BANDED\n#ifdef USE_BOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, bounded_array\" << std::endl;\n   test_my_matrix<ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, bounded_array\" << std::endl;\n   test_my_matrix<ublas::banded_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, bounded_array\" << std::endl;\n   test_my_matrix<ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, bounded_array\" << std::endl;\n   test_my_matrix<ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_UNBOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::banded_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_STD_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, std::vector\" << std::endl;\n   test_my_matrix<ublas::banded_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, std::vector\" << std::endl;\n   test_my_matrix<ublas::banded_matrix<double, ublas::row_major, std::vector<double> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, std::vector\" << std::endl;\n   test_my_matrix<ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, std::vector\" << std::endl;\n   test_my_matrix<ublas::banded_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()();\n#endif\n#endif\n#endif\n#endif\n\n#ifdef USE_DIAGONAL\n#ifdef USE_BOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, bounded_array\" << std::endl;\n   test_my_matrix<ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, bounded_array\" << std::endl;\n   test_my_matrix<ublas::diagonal_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, bounded_array\" << std::endl;\n   test_my_matrix<ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, bounded_array\" << std::endl;\n   test_my_matrix<ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_UNBOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::diagonal_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_STD_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, std::vector\" << std::endl;\n   test_my_matrix<ublas::diagonal_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, std::vector\" << std::endl;\n   test_my_matrix<ublas::diagonal_matrix<double, ublas::row_major, std::vector<double> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, std::vector\" << std::endl;\n   test_my_matrix<ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, std::vector\" << std::endl;\n   test_my_matrix<ublas::diagonal_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()();\n#endif\n#endif\n#endif\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test5.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test5.hpp\"\n\nint main()\n{\n   test_matrix_vector();\n   test_matrix();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test5.hpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#ifndef TEST5_H\n#define TEST5_H\n\n#ifdef _MSC_VER\n#pragma warning(disable : 4800 4996 4127 4100)\n#endif\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\n#ifdef TEST_ET\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_on> mp_test_type;\n#else\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off> mp_test_type;\n#endif\n//typedef double mp_test_type;\n\n#define USE_RANGE\n#define USE_SLICE\n#define USE_FLOAT\n#define USE_UNBOUNDED_ARRAY\n#define USE_STD_VECTOR\n#define USE_BOUNDED_VECTOR USE_MATRIX\n#define USE_UNBOUNDED_ARRAY\n#define USE_MAP_ARRAY\n#define USE_STD_MAP\n#define USE_MAPPED_VECTOR\n#define USE_COMPRESSED_VECTOR\n#define USE_COORDINATE_VECTOR\n#define USE_MAPPED_MATRIX\n#define USE_COMPRESSED_MATRIX\n#define USE_COORDINATE_MATRIX\n\n#include <iostream>\n\n#include <boost/numeric/ublas/vector.hpp>\n#include <boost/numeric/ublas/matrix.hpp>\n#include <boost/numeric/ublas/matrix_proxy.hpp>\n#include <boost/numeric/ublas/triangular.hpp>\n#include <boost/numeric/ublas/io.hpp>\n\nnamespace ublas = boost::numeric::ublas;\n\n#include \"common/init.hpp\"\n\nvoid test_matrix_vector();\nvoid test_matrix();\n\n// FIXME slice are failing in assignment to zero elements\n#undef USE_SLICE\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test52.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test5.hpp\"\n\n// Test matrix & vector expression templates\ntemplate <class V, class M, int N>\nstruct test_my_matrix_vector\n{\n   typedef typename V::value_type value_type;\n\n   template <class VP, class MP>\n   void test_with(VP& v1, VP& v2, MP& m1) const\n   {\n      {\n         // Rows and columns\n         initialize_matrix(m1);\n         for (int i = 0; i < N; ++i)\n         {\n            v2 = ublas::row(m1, i);\n            std::cout << \"row (m, \" << i << \") = \" << v2 << std::endl;\n            v2 = ublas::column(m1, i);\n            std::cout << \"column (m, \" << i << \") = \" << v2 << std::endl;\n         }\n\n         // Outer product\n         initialize_vector(v1);\n         initialize_vector(v2);\n         v1(0)     = 0;\n         v2(N - 1) = 0;\n         m1        = ublas::outer_prod(v1, v2);\n         std::cout << \"outer_prod (v1, v2) = \" << m1 << std::endl;\n\n         // Matrix vector product\n         initialize_matrix(m1);\n         initialize_vector(v1);\n         v2 = ublas::prod(m1, v1);\n         std::cout << \"prod (m1, v1) = \" << v2 << std::endl;\n         v2 = ublas::prod(v1, m1);\n         std::cout << \"prod (v1, m1) = \" << v2 << std::endl;\n      }\n   }\n   void operator()() const\n   {\n      {\n         V v1(N), v2(N);\n         M m1(N, N);\n         test_with(v1, v2, m1);\n\n         ublas::matrix_row<M> mr1(m1, N - 1), mr2(m1, N - 1);\n         test_with(mr1, mr2, m1);\n\n         ublas::matrix_column<M> mc1(m1, 0), mc2(m1, 0);\n         test_with(mc1, mc2, m1);\n\n#ifdef USE_RANGE\n         ublas::matrix_vector_range<M> mvr1(m1, ublas::range(0, N), ublas::range(0, N)),\n             mvr2(m1, ublas::range(0, N), ublas::range(0, N));\n         test_with(mvr1, mvr2, m1);\n#endif\n\n#ifdef USE_SLICE\n         ublas::matrix_vector_slice<M> mvs1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             mvs2(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));\n         test_with(mvs1, mvs2, m1);\n#endif\n      }\n   }\n\n   void operator()(int) const\n   {\n#ifdef USE_ADAPTOR\n      {\n         V                            v1(N), v2(N);\n         M                            m1(N, N);\n         ublas::triangular_adaptor<M> tam1(m1);\n         test_with(v1, v2, tam1);\n\n         ublas::matrix_row<ublas::triangular_adaptor<M> > mr1(tam1, N - 1), mr2(tam1, N - 1);\n         test_with(mr1, mr2, tam1);\n\n         ublas::matrix_column<ublas::triangular_adaptor<M> > mc1(tam1, 0), mc2(tam1, 0);\n         test_with(mc1, mc2, tam1);\n\n#ifdef USE_RANGE\n         ublas::matrix_vector_range<ublas::triangular_adaptor<M> > mvr1(tam1, ublas::range(0, N), ublas::range(0, N)),\n             mvr2(tam1, ublas::range(0, N), ublas::range(0, N));\n         test_with(mvr1, mvr2, tam1);\n#endif\n\n#ifdef USE_SLICE\n         ublas::matrix_vector_slice<ublas::triangular_adaptor<M> > mvs1(tam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             mvs2(tam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));\n         test_with(mvs1, mvs2, tam1);\n#endif\n      }\n#endif\n   }\n};\n\n// Test matrix & vector\nvoid test_matrix_vector()\n{\n   std::cout << \"test_matrix_vector\" << std::endl;\n\n#ifdef USE_BOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,\n                         ublas::triangular_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()();\n   test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,\n                         ublas::triangular_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,\n                         ublas::triangular_matrix<double, ublas::lower, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()();\n   test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,\n                         ublas::triangular_matrix<double, ublas::lower, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(0);\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,\n                         ublas::triangular_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,\n                         ublas::triangular_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,\n                         ublas::triangular_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,\n                         ublas::triangular_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(0);\n#endif\n#endif\n#endif\n\n#ifdef USE_UNBOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,\n                         ublas::triangular_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()();\n   test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,\n                         ublas::triangular_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,\n                         ublas::triangular_matrix<double, ublas::lower, ublas::row_major, ublas::unbounded_array<double> >, 3>()();\n   test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,\n                         ublas::triangular_matrix<double, ublas::lower, ublas::row_major, ublas::unbounded_array<double> >, 3>()(0);\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,\n                         ublas::triangular_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,\n                         ublas::triangular_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,\n                         ublas::triangular_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,\n                         ublas::triangular_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(0);\n#endif\n#endif\n#endif\n\n#ifdef USE_STD_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,\n                         ublas::triangular_matrix<mp_test_type, ublas::lower, ublas::row_major, std::vector<mp_test_type> >, 3>()();\n   test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,\n                         ublas::triangular_matrix<mp_test_type, ublas::lower, ublas::row_major, std::vector<mp_test_type> >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<double, std::vector<double> >,\n                         ublas::triangular_matrix<double, ublas::lower, ublas::row_major, std::vector<double> >, 3>()();\n   test_my_matrix_vector<ublas::vector<double, std::vector<double> >,\n                         ublas::triangular_matrix<double, ublas::lower, ublas::row_major, std::vector<double> >, 3>()(0);\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,\n                         ublas::triangular_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,\n                         ublas::triangular_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(0);\n\n   std::cout << \"std::complex<double>, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,\n                         ublas::triangular_matrix<std::complex<double>, ublas::lower, ublas::row_major, std::vector<std::complex<double> > >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,\n                         ublas::triangular_matrix<std::complex<double>, ublas::lower, ublas::row_major, std::vector<std::complex<double> > >, 3>()(0);\n#endif\n#endif\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test53.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test5.hpp\"\n\n// Test matrix expression templates\ntemplate <class M, int N>\nstruct test_my_matrix\n{\n   typedef typename M::value_type value_type;\n\n   template <class MP>\n   void test_with(MP& m1, MP& m2, MP& m3) const\n   {\n      {\n         value_type t;\n\n         // Default Construct\n         default_construct<MP>::test();\n\n         // Copy and swap\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         m1 = m2;\n         std::cout << \"m1 = m2 = \" << m1 << std::endl;\n         m1.assign_temporary(m2);\n         std::cout << \"m1.assign_temporary (m2) = \" << m1 << std::endl;\n         m1.swap(m2);\n         std::cout << \"m1.swap (m2) = \" << m1 << \" \" << m2 << std::endl;\n\n         // Zero assignment\n         m1 = ublas::zero_matrix<>(m1.size1(), m1.size2());\n         std::cout << \"m1.zero_matrix = \" << m1 << std::endl;\n         m1 = m2;\n\n         // Unary matrix operations resulting in a matrix\n         initialize_matrix(m1);\n         m2 = -m1;\n         std::cout << \"- m1 = \" << m2 << std::endl;\n         m2 = ublas::conj(m1);\n         std::cout << \"conj (m1) = \" << m2 << std::endl;\n\n         // Binary matrix operations resulting in a matrix\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         m3 = m1 + m2;\n         std::cout << \"m1 + m2 = \" << m3 << std::endl;\n         m3 = m1 - m2;\n         std::cout << \"m1 - m2 = \" << m3 << std::endl;\n\n         // Scaling a matrix\n         t = N;\n         initialize_matrix(m1);\n         m2 = value_type(1.) * m1;\n         std::cout << \"1. * m1 = \" << m2 << std::endl;\n         m2 = t * m1;\n         std::cout << \"N * m1 = \" << m2 << std::endl;\n         initialize_matrix(m1);\n         m2 = m1 * value_type(1.);\n         std::cout << \"m1 * 1. = \" << m2 << std::endl;\n         m2 = m1 * t;\n         std::cout << \"m1 * N = \" << m2 << std::endl;\n\n         // Some assignments\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         m2 += m1;\n         std::cout << \"m2 += m1 = \" << m2 << std::endl;\n         m2 -= m1;\n         std::cout << \"m2 -= m1 = \" << m2 << std::endl;\n         m2 = m2 + m1;\n         std::cout << \"m2 = m2 + m1 = \" << m2 << std::endl;\n         m2 = m2 - m1;\n         std::cout << \"m2 = m2 - m1 = \" << m2 << std::endl;\n         m1 *= value_type(1.);\n         std::cout << \"m1 *= 1. = \" << m1 << std::endl;\n         m1 *= t;\n         std::cout << \"m1 *= N = \" << m1 << std::endl;\n\n         // Transpose\n         initialize_matrix(m1);\n         // Transpose of a triangular isn't triangular of the same kind\n         std::cout << \"trans (m1) = \" << ublas::trans(m1) << std::endl;\n\n         // Hermitian\n         initialize_matrix(m1);\n         // Hermitian of a triangular isn't hermitian of the same kind\n         std::cout << \"herm (m1) = \" << ublas::herm(m1) << std::endl;\n\n         // Matrix multiplication\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         m3 = ublas::prod(m1, m2);\n         std::cout << \"prod (m1, m2) = \" << m3 << std::endl;\n      }\n   }\n   void operator()() const\n   {\n      {\n         M m1(N, N), m2(N, N), m3(N, N);\n         test_with(m1, m2, m3);\n\n#ifdef USE_RANGE\n         ublas::matrix_range<M> mr1(m1, ublas::range(0, N), ublas::range(0, N)),\n             mr2(m2, ublas::range(0, N), ublas::range(0, N)),\n             mr3(m3, ublas::range(0, N), ublas::range(0, N));\n         test_with(mr1, mr2, mr3);\n#endif\n\n#ifdef USE_SLICE\n         ublas::matrix_slice<M> ms1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             ms2(m2, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             ms3(m3, ublas::slice(0, 1, N), ublas::slice(0, 1, N));\n         test_with(ms1, ms2, ms3);\n#endif\n      }\n\n#ifdef USE_ADAPTOR\n      {\n         M                            m1(N, N), m2(N, N), m3(N, N);\n         ublas::triangular_adaptor<M> tam1(m1), tam2(m2), tam3(m3);\n         test_with(tam1, tam2, tam3);\n\n#ifdef USE_RANGE\n         ublas::matrix_range<ublas::triangular_adaptor<M> > mr1(tam1, ublas::range(0, N), ublas::range(0, N)),\n             mr2(tam2, ublas::range(0, N), ublas::range(0, N)),\n             mr3(tam3, ublas::range(0, N), ublas::range(0, N));\n         test_with(mr1, mr2, mr3);\n#endif\n\n#ifdef USE_SLICE\n         ublas::matrix_slice<ublas::triangular_adaptor<M> > ms1(tam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             ms2(tam2, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             ms3(tam3, ublas::slice(0, 1, N), ublas::slice(0, 1, N));\n         test_with(ms1, ms2, ms3);\n#endif\n      }\n#endif\n   }\n};\n\n// Test matrix\nvoid test_matrix()\n{\n   std::cout << \"test_matrix\" << std::endl;\n\n#ifdef USE_BOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, bounded_array\" << std::endl;\n   test_my_matrix<ublas::triangular_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, bounded_array\" << std::endl;\n   test_my_matrix<ublas::triangular_matrix<double, ublas::lower, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, bounded_array\" << std::endl;\n   test_my_matrix<ublas::triangular_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, bounded_array\" << std::endl;\n   test_my_matrix<ublas::triangular_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_UNBOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::triangular_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::triangular_matrix<double, ublas::lower, ublas::row_major, ublas::unbounded_array<double> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::triangular_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::triangular_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_STD_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, std::vector\" << std::endl;\n   test_my_matrix<ublas::triangular_matrix<mp_test_type, ublas::lower, ublas::row_major, std::vector<mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, std::vector\" << std::endl;\n   test_my_matrix<ublas::triangular_matrix<double, ublas::lower, ublas::row_major, std::vector<double> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, std::vector\" << std::endl;\n   test_my_matrix<ublas::triangular_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, std::vector\" << std::endl;\n   test_my_matrix<ublas::triangular_matrix<std::complex<double>, ublas::lower, ublas::row_major, std::vector<std::complex<double> > >, 3>()();\n#endif\n#endif\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test6.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test6.hpp\"\n\nint main()\n{\n   test_matrix_vector();\n   test_matrix();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test6.hpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#ifndef TEST6_H\n#define TEST6_H\n\n#ifdef _MSC_VER\n#pragma warning(disable : 4800 4996 4127 4100)\n#endif\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\n#ifdef TEST_ET\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_on> mp_test_type;\n#else\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off> mp_test_type;\n#endif\n//typedef double mp_test_type;\n\n#define USE_RANGE\n#define USE_SLICE\n#define USE_FLOAT\n#define USE_UNBOUNDED_ARRAY\n#define USE_BOUNDED_ARRAY\n#define USE_STD_VECTOR\n#define USE_BOUNDED_VECTOR USE_MATRIX\n#define USE_UNBOUNDED_ARRAY\n#define USE_MAP_ARRAY\n#define USE_STD_MAP\n#define USE_MAPPED_VECTOR\n#define USE_COMPRESSED_VECTOR\n#define USE_COORDINATE_VECTOR\n#define USE_MAPPED_MATRIX\n#define USE_COMPRESSED_MATRIX\n#define USE_COORDINATE_MATRIX\n\n#include <iostream>\n\n#include <boost/numeric/ublas/vector.hpp>\n#include <boost/numeric/ublas/matrix.hpp>\n#include <boost/numeric/ublas/matrix_proxy.hpp>\n#include <boost/numeric/ublas/symmetric.hpp>\n#include <boost/numeric/ublas/io.hpp>\n\nnamespace ublas = boost::numeric::ublas;\n\n#include \"common/init.hpp\"\n\nvoid test_matrix_vector();\nvoid test_matrix();\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test62.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test6.hpp\"\n\n// Test matrix & vector expression templates\ntemplate <class V, class M, int N>\nstruct test_my_matrix_vector\n{\n   typedef typename V::value_type value_type;\n\n   template <class VP, class MP>\n   void test_with(VP& v1, VP& v2, MP& m1) const\n   {\n      {\n         // Rows and columns\n         initialize_matrix(m1);\n         for (int i = 0; i < N; ++i)\n         {\n            v2 = ublas::row(m1, i);\n            std::cout << \"row (m, \" << i << \") = \" << v2 << std::endl;\n            v2 = ublas::column(m1, i);\n            std::cout << \"column (m, \" << i << \") = \" << v2 << std::endl;\n         }\n\n         // Outer product\n         initialize_vector(v1);\n         initialize_vector(v2);\n         v1(0)     = 0;\n         v1(N - 1) = 0;\n         v2(0)     = 0;\n         v2(N - 1) = 0;\n         m1        = ublas::outer_prod(v1, v2);\n         std::cout << \"outer_prod (v1, v2) = \" << m1 << std::endl;\n\n         // Matrix vector product\n         initialize_matrix(m1);\n         initialize_vector(v1);\n         v2 = ublas::prod(m1, v1);\n         std::cout << \"prod (m1, v1) = \" << v2 << std::endl;\n         v2 = ublas::prod(v1, m1);\n         std::cout << \"prod (v1, m1) = \" << v2 << std::endl;\n      }\n   }\n   void operator()() const\n   {\n      {\n         V v1(N), v2(N);\n         M m1(N, N);\n         test_with(v1, v2, m1);\n\n         ublas::matrix_row<M> mr1(m1, N - 1), mr2(m1, N - 1);\n         test_with(mr1, mr2, m1);\n\n         ublas::matrix_column<M> mc1(m1, 0), mc2(m1, 0);\n         test_with(mc1, mc2, m1);\n\n#ifdef USE_RANGE\n         ublas::matrix_vector_range<M> mvr1(m1, ublas::range(0, N), ublas::range(0, N)),\n             mvr2(m1, ublas::range(0, N), ublas::range(0, N));\n         test_with(mvr1, mvr2, m1);\n#endif\n\n#ifdef USE_SLICE\n         ublas::matrix_vector_slice<M> mvs1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             mvs2(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));\n         test_with(mvs1, mvs2, m1);\n#endif\n      }\n   }\n\n   void operator()(int) const\n   {\n#ifdef USE_ADAPTOR\n      {\n         V                           v1(N), v2(N);\n         M                           m1(N, N);\n         ublas::symmetric_adaptor<M> tam1(m1);\n         test_with(v1, v2, tam1);\n\n         ublas::matrix_row<ublas::symmetric_adaptor<M> > mr1(tam1, N - 1), mr2(tam1, N - 1);\n         test_with(mr1, mr2, tam1);\n\n         ublas::matrix_column<ublas::symmetric_adaptor<M> > mc1(tam1, 0), mc2(tam1, 0);\n         test_with(mc1, mc2, tam1);\n\n#ifdef USE_RANGE\n         ublas::matrix_vector_range<ublas::symmetric_adaptor<M> > mvr1(tam1, ublas::range(0, N), ublas::range(0, N)),\n             mvr2(tam1, ublas::range(0, N), ublas::range(0, N));\n         test_with(mvr1, mvr2, tam1);\n#endif\n\n#ifdef USE_SLICE\n         ublas::matrix_vector_slice<ublas::symmetric_adaptor<M> > mvs1(tam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             mvs2(tam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));\n         test_with(mvs1, mvs2, tam1);\n#endif\n      }\n#endif\n   }\n};\n\n// Test matrix & vector\nvoid test_matrix_vector()\n{\n   std::cout << \"test_matrix_vector\" << std::endl;\n\n#ifdef USE_BOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,\n                         ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()();\n   test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,\n                         ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,\n                         ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()();\n   test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,\n                         ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(0);\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,\n                         ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,\n                         ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,\n                         ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,\n                         ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(0);\n#endif\n#endif\n#endif\n\n#ifdef USE_UNBOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,\n                         ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()();\n   test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,\n                         ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,\n                         ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, ublas::unbounded_array<double> >, 3>()();\n   test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,\n                         ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, ublas::unbounded_array<double> >, 3>()(0);\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,\n                         ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,\n                         ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,\n                         ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,\n                         ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(0);\n#endif\n#endif\n#endif\n\n#ifdef USE_STD_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,\n                         ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, std::vector<mp_test_type> >, 3>()();\n   test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,\n                         ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, std::vector<mp_test_type> >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<double, std::vector<double> >,\n                         ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, std::vector<double> >, 3>()();\n   test_my_matrix_vector<ublas::vector<double, std::vector<double> >,\n                         ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, std::vector<double> >, 3>()(0);\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,\n                         ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,\n                         ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(0);\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,\n                         ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, std::vector<std::complex<double> > >, 3>()();\n   test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,\n                         ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, std::vector<std::complex<double> > >, 3>()(0);\n#endif\n#endif\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test63.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test6.hpp\"\n\n// Test matrix expression templates\ntemplate <class M, int N>\nstruct test_my_matrix\n{\n   typedef typename M::value_type value_type;\n\n   template <class MP>\n   void test_with(MP& m1, MP& m2, MP& m3) const\n   {\n      {\n         value_type t;\n\n         // Default Construct\n         default_construct<MP>::test();\n\n         // Copy and swap\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         m1 = m2;\n         std::cout << \"m1 = m2 = \" << m1 << std::endl;\n         m1.assign_temporary(m2);\n         std::cout << \"m1.assign_temporary (m2) = \" << m1 << std::endl;\n         m1.swap(m2);\n         std::cout << \"m1.swap (m2) = \" << m1 << \" \" << m2 << std::endl;\n\n         // Zero assignment\n         m1 = ublas::zero_matrix<>(m1.size1(), m1.size2());\n         std::cout << \"m1.zero_matrix = \" << m1 << std::endl;\n         m1 = m2;\n\n         // Unary matrix operations resulting in a matrix\n         initialize_matrix(m1);\n         m2 = -m1;\n         std::cout << \"- m1 = \" << m2 << std::endl;\n         m2 = ublas::conj(m1);\n         std::cout << \"conj (m1) = \" << m2 << std::endl;\n\n         // Binary matrix operations resulting in a matrix\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         m3 = m1 + m2;\n         std::cout << \"m1 + m2 = \" << m3 << std::endl;\n         m3 = m1 - m2;\n         std::cout << \"m1 - m2 = \" << m3 << std::endl;\n\n         // Scaling a matrix\n         t = N;\n         initialize_matrix(m1);\n         m2 = value_type(1.) * m1;\n         std::cout << \"1. * m1 = \" << m2 << std::endl;\n         m2 = t * m1;\n         std::cout << \"N * m1 = \" << m2 << std::endl;\n         initialize_matrix(m1);\n         m2 = m1 * value_type(1.);\n         std::cout << \"m1 * 1. = \" << m2 << std::endl;\n         m2 = m1 * t;\n         std::cout << \"m1 * N = \" << m2 << std::endl;\n\n         // Some assignments\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         m2 += m1;\n         std::cout << \"m2 += m1 = \" << m2 << std::endl;\n         m2 -= m1;\n         std::cout << \"m2 -= m1 = \" << m2 << std::endl;\n         m2 = m2 + m1;\n         std::cout << \"m2 = m2 + m1 = \" << m2 << std::endl;\n         m2 = m2 - m1;\n         std::cout << \"m2 = m1 - m1 = \" << m2 << std::endl;\n         m1 *= value_type(1.);\n         std::cout << \"m1 *= 1. = \" << m1 << std::endl;\n         m1 *= t;\n         std::cout << \"m1 *= N = \" << m1 << std::endl;\n\n         // Transpose\n         initialize_matrix(m1);\n         m2 = ublas::trans(m1);\n         std::cout << \"trans (m1) = \" << m2 << std::endl;\n\n         // Hermitean\n         initialize_matrix(m1);\n         m2 = ublas::herm(m1);\n         std::cout << \"herm (m1) = \" << m2 << std::endl;\n\n         // Matrix multiplication\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         m3 = ublas::prod(m1, m2);\n         std::cout << \"prod (m1, m2) = \" << m3 << std::endl;\n      }\n   }\n   void operator()() const\n   {\n      {\n         M m1(N, N), m2(N, N), m3(N, N);\n         test_with(m1, m2, m3);\n\n#ifdef USE_RANGE\n         ublas::matrix_range<M> mr1(m1, ublas::range(0, N), ublas::range(0, N)),\n             mr2(m2, ublas::range(0, N), ublas::range(0, N)),\n             mr3(m3, ublas::range(0, N), ublas::range(0, N));\n         test_with(mr1, mr2, mr3);\n#endif\n\n#ifdef USE_SLICE\n         ublas::matrix_slice<M> ms1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             ms2(m2, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             ms3(m3, ublas::slice(0, 1, N), ublas::slice(0, 1, N));\n         test_with(ms1, ms2, ms3);\n#endif\n      }\n\n#ifdef USE_ADAPTOR\n      {\n         M                           m1(N, N), m2(N, N), m3(N, N);\n         ublas::symmetric_adaptor<M> sam1(m1), sam2(m2), sam3(m3);\n         test_with(sam1, sam2, sam3);\n\n#ifdef USE_RANGE\n         ublas::matrix_range<ublas::symmetric_adaptor<M> > mr1(sam1, ublas::range(0, N), ublas::range(0, N)),\n             mr2(sam2, ublas::range(0, N), ublas::range(0, N)),\n             mr3(sam3, ublas::range(0, N), ublas::range(0, N));\n         test_with(mr1, mr2, mr3);\n#endif\n\n#ifdef USE_SLICE\n         ublas::matrix_slice<ublas::symmetric_adaptor<M> > ms1(sam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             ms2(sam2, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             ms3(sam3, ublas::slice(0, 1, N), ublas::slice(0, 1, N));\n         test_with(ms1, ms2, ms3);\n#endif\n      }\n#endif\n   }\n};\n\n// Test matrix\nvoid test_matrix()\n{\n   std::cout << \"test_matrix\" << std::endl;\n\n#ifdef USE_BOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, bounded_array\" << std::endl;\n   test_my_matrix<ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, bounded_array\" << std::endl;\n   test_my_matrix<ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, bounded_array\" << std::endl;\n   test_my_matrix<ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, bounded_array\" << std::endl;\n   test_my_matrix<ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_UNBOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, ublas::unbounded_array<double> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_STD_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"mp_test_type, std::vector\" << std::endl;\n   test_my_matrix<ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, std::vector<mp_test_type> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"double, std::vector\" << std::endl;\n   test_my_matrix<ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, std::vector<double> >, 3>()();\n#endif\n\n#ifdef USE_STD_COMPLEX\n#ifdef USE_FLOAT\n   std::cout << \"std::complex<mp_test_type>, std::vector\" << std::endl;\n   test_my_matrix<ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"std::complex<double>, std::vector\" << std::endl;\n   test_my_matrix<ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, std::vector<std::complex<double> > >, 3>()();\n#endif\n#endif\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test7.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include <iostream>\n\n#include <boost/numeric/interval.hpp>\n#include <boost/numeric/interval/io.hpp>\n\n#include <boost/numeric/ublas/vector.hpp>\n#include <boost/numeric/ublas/matrix.hpp>\n#include <boost/numeric/ublas/io.hpp>\n\n#include \"test7.hpp\"\n\n// this testcase requires fix of task #2473\n\nint main()\n{\n   test_vector();\n   test_matrix_vector();\n   test_matrix();\n   return 0;\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test7.hpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#ifndef TEST7_H\n#define TEST7_H\n\n#ifdef _MSC_VER\n#pragma warning(disable : 4800 4996)\n#endif\n\n#include <boost/multiprecision/cpp_dec_float.hpp>\n\n#ifdef TEST_ET\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_on> mp_test_type;\n#else\ntypedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off> mp_test_type;\n#endif\n//typedef double mp_test_type;\n\n#define USE_RANGE\n#define USE_SLICE\n#define USE_FLOAT\n#define USE_UNBOUNDED_ARRAY\n#define USE_BOUNDED_ARRAY\n#define USE_STD_VECTOR\n#define USE_BOUNDED_VECTOR USE_MATRIX\n#define USE_UNBOUNDED_ARRAY\n#define USE_MAP_ARRAY\n#define USE_STD_MAP\n#define USE_MAPPED_VECTOR\n#define USE_COMPRESSED_VECTOR\n#define USE_COORDINATE_VECTOR\n#define USE_MAPPED_MATRIX\n#define USE_COMPRESSED_MATRIX\n#define USE_COORDINATE_MATRIX\n\n#include <iostream>\n\n#include <boost/numeric/interval.hpp>\n#include <boost/numeric/interval/io.hpp>\n\n#include <boost/numeric/ublas/vector.hpp>\n#include <boost/numeric/ublas/vector_proxy.hpp>\n#include <boost/numeric/ublas/matrix.hpp>\n#include <boost/numeric/ublas/matrix_proxy.hpp>\n#include <boost/numeric/ublas/io.hpp>\n\nnamespace ublas = boost::numeric::ublas;\n\n#include \"common/init.hpp\"\n\nvoid test_vector();\nvoid test_matrix_vector();\nvoid test_matrix();\n\n#endif\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test71.cpp",
    "content": "//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n//\n// This file fails to compile - appears to be a known uBlas issue :-(\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test7.hpp\"\n\n// Test vector expression templates\ntemplate <class V, int N>\nstruct test_my_vector\n{\n   typedef typename V::value_type                             value_type;\n   typedef typename V::size_type                              size_type;\n   typedef typename ublas::type_traits<value_type>::real_type real_type;\n\n   template <class VP>\n   void test_with(VP& v1, VP& v2, VP& v3) const\n   {\n      {\n         value_type t;\n         size_type  i;\n         real_type  n;\n\n         // Copy and swap\n         initialize_vector(v1);\n         initialize_vector(v2);\n         v1 = v2;\n         std::cout << \"v1 = v2 = \" << v1 << std::endl;\n         v1.assign_temporary(v2);\n         std::cout << \"v1.assign_temporary (v2) = \" << v1 << std::endl;\n         v1.swap(v2);\n         std::cout << \"v1.swap (v2) = \" << v1 << \" \" << v2 << std::endl;\n\n         // Zero assignment\n         v1 = ublas::zero_vector<value_type>(v1.size());\n         std::cout << \"v1.zero_vector = \" << v1 << std::endl;\n         v1 = v2;\n\n         // Unary vector operations resulting in a vector\n         initialize_vector(v1);\n         v2 = -v1;\n         std::cout << \"- v1 = \" << v2 << std::endl;\n         v2 = ublas::conj(v1);\n         std::cout << \"conj (v1) = \" << v2 << std::endl;\n\n         // Binary vector operations resulting in a vector\n         initialize_vector(v1);\n         initialize_vector(v2);\n         v3 = v1 + v2;\n         std::cout << \"v1 + v2 = \" << v3 << std::endl;\n\n         v3 = v1 - v2;\n         std::cout << \"v1 - v2 = \" << v3 << std::endl;\n\n         // Scaling a vector\n         t = value_type(N);\n         initialize_vector(v1);\n         v2 = value_type(1.) * v1;\n         std::cout << \"1. * v1 = \" << v2 << std::endl;\n         //            v2 = t * v1;\n         std::cout << \"N * v1 = \" << v2 << std::endl;\n         initialize_vector(v1);\n         //            v2 = v1 * value_type (1.);\n         std::cout << \"v1 * 1. = \" << v2 << std::endl;\n         //            v2 = v1 * t;\n         std::cout << \"v1 * N = \" << v2 << std::endl;\n\n         // Some assignments\n         initialize_vector(v1);\n         initialize_vector(v2);\n         v2 += v1;\n         std::cout << \"v2 += v1 = \" << v2 << std::endl;\n         v2 -= v1;\n         std::cout << \"v2 -= v1 = \" << v2 << std::endl;\n         v2 = v2 + v1;\n         std::cout << \"v2 = v2 + v1 = \" << v2 << std::endl;\n         v2 = v2 - v1;\n         std::cout << \"v2 = v2 - v1 = \" << v2 << std::endl;\n         v1 *= value_type(1.);\n         std::cout << \"v1 *= 1. = \" << v1 << std::endl;\n         v1 *= t;\n         std::cout << \"v1 *= N = \" << v1 << std::endl;\n\n         // Unary vector operations resulting in a scalar\n         initialize_vector(v1);\n         t = ublas::sum(v1);\n         std::cout << \"sum (v1) = \" << t << std::endl;\n         n = ublas::norm_1(v1);\n         std::cout << \"norm_1 (v1) = \" << n << std::endl;\n         n = ublas::norm_2(v1);\n         std::cout << \"norm_2 (v1) = \" << n << std::endl;\n         n = ublas::norm_inf(v1);\n         std::cout << \"norm_inf (v1) = \" << n << std::endl;\n\n         i = ublas::index_norm_inf(v1);\n         std::cout << \"index_norm_inf (v1) = \" << i << std::endl;\n\n         // Binary vector operations resulting in a scalar\n         initialize_vector(v1);\n         initialize_vector(v2);\n         t = ublas::inner_prod(v1, v2);\n         std::cout << \"inner_prod (v1, v2) = \" << t << std::endl;\n      }\n   }\n   void operator()() const\n   {\n      {\n         V v1(N), v2(N), v3(N);\n         test_with(v1, v2, v3);\n\n#ifdef USE_RANGE\n         ublas::vector_range<V> vr1(v1, ublas::range(0, N)),\n             vr2(v2, ublas::range(0, N)),\n             vr3(v3, ublas::range(0, N));\n         test_with(vr1, vr2, vr3);\n#endif\n\n#ifdef USE_SLICE\n         ublas::vector_slice<V> vs1(v1, ublas::slice(0, 1, N)),\n             vs2(v2, ublas::slice(0, 1, N)),\n             vs3(v3, ublas::slice(0, 1, N));\n         test_with(vs1, vs2, vs3);\n#endif\n      }\n   }\n};\n\n// Test vector\nvoid test_vector()\n{\n   std::cout << \"test_vector\" << std::endl;\n\n#ifdef USE_BOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"boost::numeric::interval<mp_test_type>, bounded_array\" << std::endl;\n   test_my_vector<ublas::vector<boost::numeric::interval<mp_test_type>, ublas::bounded_array<boost::numeric::interval<mp_test_type>, 3> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"boost::numeric::interval<double>, bounded_array\" << std::endl;\n   test_my_vector<ublas::vector<boost::numeric::interval<double>, ublas::bounded_array<boost::numeric::interval<double>, 3> >, 3>()();\n#endif\n#endif\n\n#ifdef USE_UNBOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"boost::numeric::interval<mp_test_type>, unbounded_array\" << std::endl;\n   test_my_vector<ublas::vector<boost::numeric::interval<mp_test_type>, ublas::unbounded_array<boost::numeric::interval<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"boost::numeric::interval<double>, unbounded_array\" << std::endl;\n   test_my_vector<ublas::vector<boost::numeric::interval<double>, ublas::unbounded_array<boost::numeric::interval<double> > >, 3>()();\n#endif\n#endif\n\n#ifdef USE_STD_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"boost::numeric::interval<mp_test_type>, std::vector\" << std::endl;\n   test_my_vector<ublas::vector<boost::numeric::interval<mp_test_type>, std::vector<boost::numeric::interval<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"boost::numeric::interval<double>, std::vector\" << std::endl;\n   test_my_vector<ublas::vector<boost::numeric::interval<double>, std::vector<boost::numeric::interval<double> > >, 3>()();\n#endif\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test72.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test7.hpp\"\n\n// Test matrix & vector expression templates\ntemplate <class V, class M, int N>\nstruct test_my_matrix_vector\n{\n   typedef typename V::value_type value_type;\n\n   template <class VP, class MP>\n   void test_with(VP& v1, VP& v2, MP& m1) const\n   {\n      {\n         // Rows and columns\n         initialize_matrix(m1);\n         for (int i = 0; i < N; ++i)\n         {\n            v1 = ublas::row(m1, i);\n            std::cout << \"row (m, \" << i << \") = \" << v1 << std::endl;\n            v1 = ublas::column(m1, i);\n            std::cout << \"column (m, \" << i << \") = \" << v1 << std::endl;\n         }\n\n         // Outer product\n         initialize_vector(v1);\n         initialize_vector(v2);\n         m1 = ublas::outer_prod(v1, v2);\n         std::cout << \"outer_prod (v1, v2) = \" << m1 << std::endl;\n\n         // Matrix vector product\n         initialize_matrix(m1);\n         initialize_vector(v1);\n         v2 = ublas::prod(m1, v1);\n         std::cout << \"prod (m1, v1) = \" << v2 << std::endl;\n         v2 = ublas::prod(v1, m1);\n         std::cout << \"prod (v1, m1) = \" << v2 << std::endl;\n      }\n   }\n   void operator()() const\n   {\n      {\n         V v1(N), v2(N);\n         M m1(N, N);\n         test_with(v1, v2, m1);\n\n         ublas::matrix_row<M> mr1(m1, 0), mr2(m1, 1);\n         test_with(mr1, mr2, m1);\n\n         ublas::matrix_column<M> mc1(m1, 0), mc2(m1, 1);\n         test_with(mc1, mc2, m1);\n\n#ifdef USE_RANGE\n         ublas::matrix_vector_range<M> mvr1(m1, ublas::range(0, N), ublas::range(0, N)),\n             mvr2(m1, ublas::range(0, N), ublas::range(0, N));\n         test_with(mvr1, mvr2, m1);\n#endif\n\n#ifdef USE_SLICE\n         ublas::matrix_vector_slice<M> mvs1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             mvs2(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));\n         test_with(mvs1, mvs2, m1);\n#endif\n      }\n   }\n};\n\n// Test matrix & vector\nvoid test_matrix_vector()\n{\n   std::cout << \"test_matrix_vector\" << std::endl;\n\n#ifdef USE_MATRIX\n#ifdef USE_BOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"boost::numeric::interval<mp_test_type>, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<boost::numeric::interval<mp_test_type>, ublas::bounded_array<boost::numeric::interval<mp_test_type>, 3> >,\n                         ublas::matrix<boost::numeric::interval<mp_test_type>, ublas::row_major, ublas::bounded_array<boost::numeric::interval<mp_test_type>, 3 * 3> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"boost::numeric::interval<double>, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<boost::numeric::interval<double>, ublas::bounded_array<boost::numeric::interval<double>, 3> >,\n                         ublas::matrix<boost::numeric::interval<double>, ublas::row_major, ublas::bounded_array<boost::numeric::interval<double>, 3 * 3> >, 3>()();\n#endif\n#endif\n\n#ifdef USE_UNBOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"boost::numeric::interval<mp_test_type>, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<boost::numeric::interval<mp_test_type>, ublas::unbounded_array<boost::numeric::interval<mp_test_type> > >,\n                         ublas::matrix<boost::numeric::interval<mp_test_type>, ublas::row_major, ublas::unbounded_array<boost::numeric::interval<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"boost::numeric::interval<double>, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<boost::numeric::interval<double>, ublas::unbounded_array<boost::numeric::interval<double> > >,\n                         ublas::matrix<boost::numeric::interval<double>, ublas::row_major, ublas::unbounded_array<boost::numeric::interval<double> > >, 3>()();\n#endif\n#endif\n\n#ifdef USE_STD_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"boost::numeric::interval<mp_test_type>, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<boost::numeric::interval<mp_test_type>, std::vector<boost::numeric::interval<mp_test_type> > >,\n                         ublas::matrix<boost::numeric::interval<mp_test_type>, ublas::row_major, std::vector<boost::numeric::interval<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"boost::numeric::interval<double>, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<boost::numeric::interval<double>, std::vector<boost::numeric::interval<double> > >,\n                         ublas::matrix<boost::numeric::interval<double>, ublas::row_major, std::vector<boost::numeric::interval<double> > >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_VECTOR_OF_VECTOR\n#ifdef USE_BOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"boost::numeric::interval<mp_test_type>, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<boost::numeric::interval<mp_test_type>, ublas::bounded_array<boost::numeric::interval<mp_test_type>, 3> >,\n                         ublas::vector_of_vector<boost::numeric::interval<mp_test_type>, ublas::row_major, ublas::bounded_array<ublas::bounded_array<boost::numeric::interval<mp_test_type>, 3>, 3 + 1> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"boost::numeric::interval<double>, bounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<boost::numeric::interval<double>, ublas::bounded_array<boost::numeric::interval<double>, 3> >,\n                         ublas::vector_of_vector<boost::numeric::interval<double>, ublas::row_major, ublas::bounded_array<ublas::bounded_array<boost::numeric::interval<double>, 3>, 3 + 1> >, 3>()();\n#endif\n#endif\n\n#ifdef USE_UNBOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"boost::numeric::interval<mp_test_type>, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<boost::numeric::interval<mp_test_type>, ublas::unbounded_array<boost::numeric::interval<mp_test_type> > >,\n                         ublas::vector_of_vector<boost::numeric::interval<mp_test_type>, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<boost::numeric::interval<mp_test_type> > > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"boost::numeric::interval<double>, unbounded_array\" << std::endl;\n   test_my_matrix_vector<ublas::vector<boost::numeric::interval<double>, ublas::unbounded_array<boost::numeric::interval<double> > >,\n                         ublas::vector_of_vector<boost::numeric::interval<double>, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<boost::numeric::interval<double> > > >, 3>()();\n#endif\n#endif\n\n#ifdef USE_STD_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"boost::numeric::interval<mp_test_type>, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<boost::numeric::interval<mp_test_type>, std::vector<boost::numeric::interval<mp_test_type> > >,\n                         ublas::vector_of_vector<boost::numeric::interval<mp_test_type>, ublas::row_major, std::vector<std::vector<boost::numeric::interval<mp_test_type> > > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"boost::numeric::interval<double>, std::vector\" << std::endl;\n   test_my_matrix_vector<ublas::vector<boost::numeric::interval<double>, std::vector<boost::numeric::interval<double> > >,\n                         ublas::vector_of_vector<boost::numeric::interval<double>, ublas::row_major, std::vector<std::vector<boost::numeric::interval<double> > > >, 3>()();\n#endif\n#endif\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/test/ublas_interop/test73.cpp",
    "content": "//\n//  Copyright (c) 2000-2002\n//  Joerg Walter, Mathias Koch\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  The authors gratefully acknowledge the support of\n//  GeNeSys mbH & Co. KG in producing this work.\n//\n\n#if defined(__GNUC__) && (__GNUC__ >= 9)\n#pragma GCC diagnostic ignored \"-Wdeprecated-copy\"\n#endif\n\n#include \"test7.hpp\"\n\n// Test matrix expression templates\ntemplate <class M, int N>\nstruct test_my_matrix\n{\n   typedef typename M::value_type value_type;\n\n   template <class MP>\n   void test_with(MP& m1, MP& m2, MP& m3) const\n   {\n      {\n         value_type t;\n\n         // Copy and swap\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         m1 = m2;\n         std::cout << \"m1 = m2 = \" << m1 << std::endl;\n         m1.assign_temporary(m2);\n         std::cout << \"m1.assign_temporary (m2) = \" << m1 << std::endl;\n         m1.swap(m2);\n         std::cout << \"m1.swap (m2) = \" << m1 << \" \" << m2 << std::endl;\n\n         // Zero assignment\n         m1 = ublas::zero_matrix<value_type>(m1.size1(), m1.size2());\n         std::cout << \"m1.zero_matrix = \" << m1 << std::endl;\n         m1 = m2;\n\n         // Unary matrix operations resulting in a matrix\n         initialize_matrix(m1);\n         m2 = -m1;\n         std::cout << \"- m1 = \" << m2 << std::endl;\n         m2 = ublas::conj(m1);\n         std::cout << \"conj (m1) = \" << m2 << std::endl;\n\n         // Binary matrix operations resulting in a matrix\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         m3 = m1 + m2;\n         std::cout << \"m1 + m2 = \" << m3 << std::endl;\n         m3 = m1 - m2;\n         std::cout << \"m1 - m2 = \" << m3 << std::endl;\n\n         // Scaling a matrix\n         t = N;\n         initialize_matrix(m1);\n         m2 = value_type(1.) * m1;\n         std::cout << \"1. * m1 = \" << m2 << std::endl;\n         m2 = t * m1;\n         std::cout << \"N * m1 = \" << m2 << std::endl;\n         initialize_matrix(m1);\n         m2 = m1 * value_type(1.);\n         std::cout << \"m1 * 1. = \" << m2 << std::endl;\n         m2 = m1 * t;\n         std::cout << \"m1 * N = \" << m2 << std::endl;\n\n         // Some assignments\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         m2 += m1;\n         std::cout << \"m2 += m1 = \" << m2 << std::endl;\n         m2 -= m1;\n         std::cout << \"m2 -= m1 = \" << m2 << std::endl;\n         m2 = m2 + m1;\n         std::cout << \"m2 = m2 + m1 = \" << m2 << std::endl;\n         m2 = m2 - m1;\n         std::cout << \"m2 = m1 - m1 = \" << m2 << std::endl;\n         m1 *= value_type(1.);\n         std::cout << \"m1 *= 1. = \" << m1 << std::endl;\n         m1 *= t;\n         std::cout << \"m1 *= N = \" << m1 << std::endl;\n\n         // Transpose\n         initialize_matrix(m1);\n         m2 = ublas::trans(m1);\n         std::cout << \"trans (m1) = \" << m2 << std::endl;\n\n         // Hermitean\n         initialize_matrix(m1);\n         m2 = ublas::herm(m1);\n         std::cout << \"herm (m1) = \" << m2 << std::endl;\n\n         // Matrix multiplication\n         initialize_matrix(m1);\n         initialize_matrix(m2);\n         m3 = ublas::prod(m1, m2);\n         std::cout << \"prod (m1, m2) = \" << m3 << std::endl;\n      }\n   }\n   void operator()() const\n   {\n      {\n         M m1(N, N), m2(N, N), m3(N, N);\n         test_with(m1, m2, m3);\n\n#ifdef USE_RANGE\n         ublas::matrix_range<M> mr1(m1, ublas::range(0, N), ublas::range(0, N)),\n             mr2(m2, ublas::range(0, N), ublas::range(0, N)),\n             mr3(m3, ublas::range(0, N), ublas::range(0, N));\n         test_with(mr1, mr2, mr3);\n#endif\n\n#ifdef USE_SLICE\n         ublas::matrix_slice<M> ms1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             ms2(m2, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),\n             ms3(m3, ublas::slice(0, 1, N), ublas::slice(0, 1, N));\n         test_with(ms1, ms2, ms3);\n#endif\n      }\n   }\n};\n\n// Test matrix\nvoid test_matrix()\n{\n   std::cout << \"test_matrix\" << std::endl;\n\n#ifdef USE_MATRIX\n#ifdef USE_BOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"boost::numeric::interval<mp_test_type>, bounded_array\" << std::endl;\n   test_my_matrix<ublas::matrix<boost::numeric::interval<mp_test_type>, ublas::row_major, ublas::bounded_array<boost::numeric::interval<mp_test_type>, 3 * 3> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"boost::numeric::interval<double>, bounded_array\" << std::endl;\n   test_my_matrix<ublas::matrix<boost::numeric::interval<double>, ublas::row_major, ublas::bounded_array<boost::numeric::interval<double>, 3 * 3> >, 3>()();\n#endif\n#endif\n\n#ifdef USE_UNBOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"boost::numeric::interval<mp_test_type>, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::matrix<boost::numeric::interval<mp_test_type>, ublas::row_major, ublas::unbounded_array<boost::numeric::interval<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"boost::numeric::interval<double>, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::matrix<boost::numeric::interval<double>, ublas::row_major, ublas::unbounded_array<boost::numeric::interval<double> > >, 3>()();\n#endif\n#endif\n\n#ifdef USE_STD_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"boost::numeric::interval<mp_test_type>, std::vector\" << std::endl;\n   test_my_matrix<ublas::matrix<boost::numeric::interval<mp_test_type>, ublas::row_major, std::vector<boost::numeric::interval<mp_test_type> > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"boost::numeric::interval<double>, std::vector\" << std::endl;\n   test_my_matrix<ublas::matrix<boost::numeric::interval<double>, ublas::row_major, std::vector<boost::numeric::interval<double> > >, 3>()();\n#endif\n#endif\n#endif\n\n#ifdef USE_VECTOR_OF_VECTOR\n#ifdef USE_BOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"boost::numeric::interval<mp_test_type>, bounded_array\" << std::endl;\n   test_my_matrix<ublas::vector_of_vector<boost::numeric::interval<mp_test_type>, ublas::row_major, ublas::bounded_array<ublas::bounded_array<boost::numeric::interval<mp_test_type>, 3>, 3 + 1> >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"boost::numeric::interval<double>, bounded_array\" << std::endl;\n   test_my_matrix<ublas::vector_of_vector<boost::numeric::interval<double>, ublas::row_major, ublas::bounded_array<ublas::bounded_array<boost::numeric::interval<double>, 3>, 3 + 1> >, 3>()();\n#endif\n#endif\n\n#ifdef USE_UNBOUNDED_ARRAY\n#ifdef USE_FLOAT\n   std::cout << \"boost::numeric::interval<mp_test_type>, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::vector_of_vector<boost::numeric::interval<mp_test_type>, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<boost::numeric::interval<mp_test_type> > > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"boost::numeric::interval<double>, unbounded_array\" << std::endl;\n   test_my_matrix<ublas::vector_of_vector<boost::numeric::interval<double>, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<boost::numeric::interval<double> > > >, 3>()();\n#endif\n#endif\n\n#ifdef USE_STD_VECTOR\n#ifdef USE_FLOAT\n   std::cout << \"boost::numeric::interval<mp_test_type>, std::vector\" << std::endl;\n   test_my_matrix<ublas::vector_of_vector<boost::numeric::interval<mp_test_type>, ublas::row_major, std::vector<std::vector<boost::numeric::interval<mp_test_type> > > >, 3>()();\n#endif\n\n#ifdef USE_DOUBLE\n   std::cout << \"boost::numeric::interval<double>, std::vector\" << std::endl;\n   test_my_matrix<ublas::vector_of_vector<boost::numeric::interval<double>, ublas::row_major, std::vector<std::vector<boost::numeric::interval<double> > > >, 3>()();\n#endif\n#endif\n#endif\n}\n"
  },
  {
    "path": "examples/libraries/multiprecision-Boost_1_81_0/tools/sincos.cpp",
    "content": "// Copyright John Maddock 2013.\n// Use, modification and distribution are subject to the\n// Boost Software License, Version 1.0.\n// (See accompanying file LICENSE_1_0.txt\n// or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//[special_data_example\n\n#include <boost/multiprecision/mpfr.hpp>\n#include <boost/math/tools/test_data.hpp>\n#include <boost/test/included/prg_exec_monitor.hpp>\n#include <boost/math/tools/tuple.hpp>\n#include <fstream>\n\nusing namespace boost::math::tools;\nusing namespace boost::math;\nusing namespace std;\nusing namespace boost::multiprecision;\n\ntypedef number<mpfr_float_backend<1000> > mp_type;\n\n\nboost::math::tuple<mp_type, mp_type, mp_type> generate(mp_type a)\n{\n   mp_type ts, tc;\n   ts = sin(a);\n   tc = cos(a);\n   return boost::math::make_tuple(a, ts, tc);\n}\n\nint cpp_main(int argc, char*argv [])\n{\n   parameter_info<mp_type> arg1, arg2;\n   test_data<mp_type> data;\n\n   bool cont;\n   std::string line;\n\n   if(argc < 1)\n      return 1;\n\n   do{\n      //\n      // User interface which prompts for \n      // range of input parameters:\n      //\n      if(0 == get_user_parameter_info(arg1, \"a\"))\n         return 1;\n      arg1.type |= dummy_param;\n\n      data.insert(&generate, arg1);\n\n      std::cout << \"Any more data [y/n]?\";\n      std::getline(std::cin, line);\n      boost::algorithm::trim(line);\n      cont = (line == \"y\");\n   }while(cont);\n   //\n   // Just need to write the results to a file:\n   //\n   std::cout << \"Enter name of test data file [default=sincos.ipp]\";\n   std::getline(std::cin, line);\n   boost::algorithm::trim(line);\n   if(line == \"\")\n      line = \"sincos.ipp\";\n   std::ofstream ofs(line.c_str());\n   line.erase(line.find('.'));\n   ofs << std::scientific << std::setprecision(500);\n   write_code(ofs, data, line.c_str());\n\n   return 0;\n}\n\n//]\n\n"
  },
  {
    "path": "examples/libraries/rapidcsv/.travis.yml",
    "content": "language:\n  - cpp\n\nsudo:\n  - false\n\nos:\n  - linux\n  - osx\n\ndist:\n  - xenial\n\nscript:\n  - mkdir -p build\n  - cd build\n  - cmake ..\n  - make\n  - ctest -C unit --output-on-failure\n  - ctest -C perf --verbose\n\n"
  },
  {
    "path": "examples/libraries/rapidcsv/CMakeLists.txt",
    "content": "# Project\ncmake_minimum_required(VERSION 3.1 FATAL_ERROR)\nproject(rapidcsv VERSION 1.0 LANGUAGES CXX)\nset (CMAKE_CXX_STANDARD 11)\nif(MSVC)\n  if(CMAKE_CXX_FLAGS MATCHES \"/W[0-4]\")\n    string(REGEX REPLACE \"/W[0-4]\" \"/W4\" CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS}\")\n  else()\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} /W4\")\n  endif()\nelse()\n  set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -g -Wall -Wextra -Wpedantic -Wshadow -Wpointer-arith \\\n                       -Wcast-qual -Wno-missing-braces -Wswitch-default -Wcast-align -Wunreachable-code \\\n                       -Wundef -Wuninitialized\")\nendif()\n\ninclude(CheckIncludeFileCXX)\ncheck_include_file_cxx(codecvt HAS_CODECVT)\nif(HAS_CODECVT)\n  add_definitions(-DHAS_CODECVT)\nendif()\n\n# Ccache\nfind_program(CCACHE_PROGRAM ccache)\nif(CCACHE_PROGRAM)\n  message(STATUS \"Found ccache\")\n  set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE \"${CCACHE_PROGRAM}\")\nendif()\n\n# Test init\ninclude(CTest)\nenable_testing()\ninclude_directories(\"src\")\nset(LIB_HEADERS \"src/rapidcsv.h\")\nset(TEST_HEADERS \"tests/unittest.h\")\n\n# Test macro add_perf_test\nmacro (add_perf_test testname)\n  add_executable(${testname} tests/${testname}.cpp)\n  add_test(NAME ${testname} CONFIGURATIONS perf Release COMMAND \"${PROJECT_BINARY_DIR}/${testname}\")\nendmacro (add_perf_test)\n\n# Test macro add_unit_test\nmacro (add_unit_test testname)\n  add_executable(${testname} tests/${testname}.cpp)\n  add_test(NAME ${testname} CONFIGURATIONS unit Debug COMMAND \"${PROJECT_BINARY_DIR}/${testname}\")\nendmacro (add_unit_test)\n\n# Unit tests\nif(1)\n  add_unit_test(test001)\n  add_unit_test(test002)\n  add_unit_test(test003)\n  add_unit_test(test004)\n  add_unit_test(test005)\n  add_unit_test(test006)\n  add_unit_test(test007)\n  add_unit_test(test008)\n  add_unit_test(test009)\n  add_unit_test(test010)\n  add_unit_test(test011)\n  add_unit_test(test012)\n  add_unit_test(test013)\n  add_unit_test(test014)\n  add_unit_test(test015)\n  add_unit_test(test016)\n  add_unit_test(test017)\n  add_unit_test(test018)\n  add_unit_test(test019)\n  add_unit_test(test020)\n  add_unit_test(test021)\n  add_unit_test(test022)\n  add_unit_test(test023)\n  add_unit_test(test024)\n  add_unit_test(test025)\n  add_unit_test(test026)\n  add_unit_test(test027)\n  add_unit_test(test028)\n  add_unit_test(test029)\n  add_unit_test(test030)\n  add_unit_test(test031)\n  add_unit_test(test032)\n  add_unit_test(test033)\n  add_unit_test(test034)\n  add_unit_test(test035)\n  add_unit_test(test036)\n  add_unit_test(test037)\n  add_unit_test(test038)\n  add_unit_test(test039)\n  add_executable(test040 tests/test040.cpp tests/test040b.cpp)\n  add_test(NAME text040 CONFIGURATIONS unit COMMAND \"${PROJECT_BINARY_DIR}/test040\")\n  add_unit_test(test041)\n  add_unit_test(test042)\n  add_unit_test(test043)\n  add_unit_test(test044)\n  add_unit_test(test045)\n  add_unit_test(test046)\n  add_unit_test(test047)\n  add_unit_test(test048)\n  add_unit_test(test049)\n  add_unit_test(test050)\n  add_unit_test(test051)\n  add_unit_test(test052)\n  add_unit_test(test053)\n  add_unit_test(test054)\n  add_unit_test(test055)\n  add_unit_test(test056)\n  if (HAS_CODECVT)\n    add_unit_test(test057)\n    add_unit_test(test058)\n    add_unit_test(test059)\n    add_unit_test(test060)\n  endif()\n  add_unit_test(test061)\n  add_unit_test(test062)\n  add_unit_test(test063)\n  add_unit_test(test064)\n  add_unit_test(test065)\n  add_unit_test(test066)\nendif()\n  \n# perf tests\nadd_perf_test(ptest001)\nadd_perf_test(ptest002)\n\n# Examples\nadd_executable(ex001 examples/ex001.cpp)\nadd_executable(ex002 examples/ex002.cpp)\nadd_executable(ex003 examples/ex003.cpp)\nadd_executable(ex004 examples/ex004.cpp)\nadd_executable(ex005 examples/ex005.cpp)\nadd_executable(ex006 examples/ex006.cpp)\nadd_executable(ex007 examples/ex007.cpp)\nadd_executable(ex008 examples/ex008.cpp)\nadd_executable(ex009 examples/ex009.cpp)\n\n"
  },
  {
    "path": "examples/libraries/rapidcsv/LICENSE",
    "content": "BSD 3-Clause License\n\nCopyright (c) 2017, Kristofer Berggren\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "examples/libraries/rapidcsv/README.md",
    "content": "Rapidcsv\n========\n\n| **Linux + Mac** | **Windows** |\n|-----------------|-------------|\n| [![Build status](https://travis-ci.com/d99kris/rapidcsv.svg?branch=master)](https://travis-ci.com/d99kris/rapidcsv) | [![Build status](https://ci.appveyor.com/api/projects/status/yyc65as5ln6m6i8l/branch/master?svg=true)](https://ci.appveyor.com/project/d99kris/rapidcsv/branch/master) |\n\nRapidcsv is a C++ header-only library for CSV parsing. While the name\nadmittedly was inspired by the rapidjson project, the objectives are not the\nsame. The goal of rapidcsv is to be an easy-to-use CSV library enabling rapid\ndevelopment. For optimal performance (be it CPU or memory usage) a CSV parser\nimplemented for the specific use-case is likely to be more performant.\n\nExample Usage\n=============\nHere is a simple example reading a CSV file and getting 'Close' column as a\nvector of floats.\n\n[colhdr.csv](examples/colhdr.csv) content:\n```\n    Open,High,Low,Close,Volume,Adj Close\n    64.529999,64.800003,64.139999,64.620003,21705200,64.620003\n    64.419998,64.730003,64.190002,64.620003,20235200,64.620003\n    64.330002,64.389999,64.050003,64.360001,19259700,64.360001\n    64.610001,64.949997,64.449997,64.489998,19384900,64.489998\n    64.470001,64.690002,64.300003,64.620003,21234600,64.620003\n```\n\n[ex001.cpp](examples/ex001.cpp) content:\n```cpp\n    #include <iostream>\n    #include <vector>\n    #include \"rapidcsv.h\"\n\n    int main()\n    {\n      rapidcsv::Document doc(\"examples/colhdr.csv\");\n\n      std::vector<float> col = doc.GetColumn<float>(\"Close\");\n      std::cout << \"Read \" << col.size() << \" values.\" << std::endl;\n    }\n```\n\nRefer to section [More Examples](#more-examples) below for more examples.\nThe [tests](tests/) directory also contains many simple usage examples.\n\nSupported Platforms\n===================\nRapidcsv is implemented using C++11 with the intention of being portable. It's\nbeen tested on:\n- macOS Catalina 10.15\n- Ubuntu 20.04 LTS\n- Windows 10 / Visual Studio 2015\n\nInstallation\n============\nSimply copy\n[src/rapidcsv.h](https://raw.githubusercontent.com/d99kris/rapidcsv/master/src/rapidcsv.h)\nto your project/include directory and include it. \n\nMore Examples\n=============\n\nSeveral of the following examples are also provided in the `examples/`\ndirectory and can be executed directly under Linux and macOS. Example running\nex001.cpp:\n\n```\n    ./examples/ex001.cpp\n```\n\n\nReading a File with Column and Row Headers\n------------------------------------------\nBy default rapidcsv treats the first row as column headers, and the first\ncolumn is treated as data. This allows accessing columns using their labels,\nbut not rows or cells (only using indices). In order to treat the first column\nas row headers one needs to use LabelParams and set pRowNameIdx to 0.\n\n### Column and Row Headers\n[colrowhdr.csv](examples/colrowhdr.csv) content:\n```\n    Date,Open,High,Low,Close,Volume,Adj Close\n    2017-02-24,64.529999,64.800003,64.139999,64.620003,21705200,64.620003\n    2017-02-23,64.419998,64.730003,64.190002,64.620003,20235200,64.620003\n    2017-02-22,64.330002,64.389999,64.050003,64.360001,19259700,64.360001\n    2017-02-21,64.610001,64.949997,64.449997,64.489998,19384900,64.489998\n    2017-02-17,64.470001,64.690002,64.300003,64.620003,21234600,64.620003\n```\n\n[ex002.cpp](examples/ex002.cpp) content:\n```cpp\n    #include <iostream>\n    #include <vector>\n    #include \"rapidcsv.h\"\n\n    int main()\n    {\n      rapidcsv::Document doc(\"examples/colrowhdr.csv\", rapidcsv::LabelParams(0, 0));\n\n      std::vector<float> close = doc.GetRow<float>(\"2017-02-22\");\n      std::cout << \"Read \" << close.size() << \" values.\" << std::endl;\n\n      long long volume = doc.GetCell<long long>(\"Volume\", \"2017-02-22\");\n      std::cout << \"Volume \" << volume << \" on 2017-02-22.\" << std::endl;\n    }\n```\n\n### Row Headers Only\n[rowhdr.csv](examples/rowhdr.csv) content:\n```\n    2017-02-24,64.529999,64.800003,64.139999,64.620003,21705200,64.620003\n    2017-02-23,64.419998,64.730003,64.190002,64.620003,20235200,64.620003\n    2017-02-22,64.330002,64.389999,64.050003,64.360001,19259700,64.360001\n    2017-02-21,64.610001,64.949997,64.449997,64.489998,19384900,64.489998\n    2017-02-17,64.470001,64.690002,64.300003,64.620003,21234600,64.620003\n```\n\n[ex003.cpp](examples/ex003.cpp) content:\n```cpp\n    #include <iostream>\n    #include <vector>\n    #include \"rapidcsv.h\"\n\n    int main()\n    {\n      rapidcsv::Document doc(\"examples/rowhdr.csv\", rapidcsv::LabelParams(-1, 0));\n\n      std::vector<std::string> row = doc.GetRow<std::string>(\"2017-02-22\");\n      std::cout << \"Read \" << row.size() << \" values.\" << std::endl;\n    }\n```\n\n### No Headers\n[nohdr.csv](examples/nohdr.csv) content:\n```\n    64.529999,64.800003,64.139999,64.620003,21705200,64.620003\n    64.419998,64.730003,64.190002,64.620003,20235200,64.620003\n    64.330002,64.389999,64.050003,64.360001,19259700,64.360001\n    64.610001,64.949997,64.449997,64.489998,19384900,64.489998\n    64.470001,64.690002,64.300003,64.620003,21234600,64.620003\n```\n\n[ex004.cpp](examples/ex004.cpp) content:\n```cpp\n    #include <iostream>\n    #include <vector>\n    #include \"rapidcsv.h\"\n\n    int main()\n    {\n      rapidcsv::Document doc(\"examples/nohdr.csv\", rapidcsv::LabelParams(-1, -1));\n\n      std::vector<float> close = doc.GetColumn<float>(5);\n      std::cout << \"Read \" << close.size() << \" values.\" << std::endl;\n\n      long long volume = doc.GetCell<long long>(4, 2);\n      std::cout << \"Volume \" << volume << \" on 2017-02-22.\" << std::endl;\n    }\n```\n\nReading a File with Custom Separator\n------------------------------------\nFor reading of files with custom separator (i.e. not comma), one need to\nspecify the SeparatorParams argument. The following example reads a file using\nsemi-colon as separator.\n\n[semi.csv](examples/semi.csv) content:\n```\n    Date;Open;High;Low;Close;Volume;Adj Close\n    2017-02-24;64.529999;64.800003;64.139999;64.620003;21705200;64.620003\n    2017-02-23;64.419998;64.730003;64.190002;64.620003;20235200;64.620003\n    2017-02-22;64.330002;64.389999;64.050003;64.360001;19259700;64.360001\n    2017-02-21;64.610001;64.949997;64.449997;64.489998;19384900;64.489998\n    2017-02-17;64.470001;64.690002;64.300003;64.620003;21234600;64.620003\n```\n\n[ex005.cpp](examples/ex005.cpp) content:\n```cpp\n    #include <iostream>\n    #include <vector>\n    #include \"rapidcsv.h\"\n\n    int main()\n    {\n      rapidcsv::Document doc(\"examples/semi.csv\", rapidcsv::LabelParams(0, 0),\n                             rapidcsv::SeparatorParams(';'));\n\n      std::vector<float> close = doc.GetColumn<float>(\"Close\");\n      std::cout << \"Read \" << close.size() << \" values.\" << std::endl;\n\n      long long volume = doc.GetCell<long long>(\"Volume\", \"2017-02-22\");\n      std::cout << \"Volume \" << volume << \" on 2017-02-22.\" << std::endl;\n    }\n```\n\nSupported Get/Set Data Types\n----------------------------\nThe internal cell representation in the Document class is using std::string\nand when other types are requested, standard conversion routines are used.\nAll standard conversions are relatively straight-forward, with the\nexception of `char` for which rapidcsv interprets the cell's (first) byte\nas a character. The following example illustrates the supported data types.\n\n[colrowhdr.csv](examples/colrowhdr.csv) content:\n```\n    Date,Open,High,Low,Close,Volume,Adj Close\n    2017-02-24,64.529999,64.800003,64.139999,64.620003,21705200,64.620003\n    2017-02-23,64.419998,64.730003,64.190002,64.620003,20235200,64.620003\n    2017-02-22,64.330002,64.389999,64.050003,64.360001,19259700,64.360001\n    2017-02-21,64.610001,64.949997,64.449997,64.489998,19384900,64.489998\n    2017-02-17,64.470001,64.690002,64.300003,64.620003,21234600,64.620003\n```\n\n[ex006.cpp](examples/ex006.cpp) content:\n```cpp\n    #include <iostream>\n    #include <vector>\n    #include \"rapidcsv.h\"\n\n    int main()\n    {\n      rapidcsv::Document doc(\"examples/colrowhdr.csv\", rapidcsv::LabelParams(0, 0));\n\n      std::cout << doc.GetCell<std::string>(\"Volume\", \"2017-02-22\") << std::endl;\n      std::cout << doc.GetCell<int>(\"Volume\", \"2017-02-22\") << std::endl;\n      std::cout << doc.GetCell<long>(\"Volume\", \"2017-02-22\") << std::endl;\n      std::cout << doc.GetCell<long long>(\"Volume\", \"2017-02-22\") << std::endl;\n      std::cout << doc.GetCell<unsigned>(\"Volume\", \"2017-02-22\") << std::endl;\n      std::cout << doc.GetCell<unsigned long>(\"Volume\", \"2017-02-22\") << std::endl;\n      std::cout << doc.GetCell<unsigned long long>(\"Volume\", \"2017-02-22\") << std::endl;\n      std::cout << doc.GetCell<float>(\"Volume\", \"2017-02-22\") << std::endl;\n      std::cout << doc.GetCell<double>(\"Volume\", \"2017-02-22\") << std::endl;\n      std::cout << doc.GetCell<long double>(\"Volume\", \"2017-02-22\") << std::endl;\n      std::cout << doc.GetCell<char>(\"Volume\", \"2017-02-22\") << std::endl;\n    }\n\n```\n\nGlobal Custom Data Type Conversion\n----------------------------------\nOne may override conversion routines (or add new ones) by implementing ToVal()\nand/or ToStr(). Below is an example overriding int conversion, to instead provide\ntwo decimal fixed-point numbers. Also see \n[tests/test035.cpp](https://github.com/d99kris/rapidcsv/blob/master/tests/test035.cpp)\nfor a test overriding ToVal() and ToStr().\n\n[ex008.cpp](examples/ex008.cpp) content:\n```cpp\n    #include <iostream>\n    #include <vector>\n    #include \"rapidcsv.h\"\n\n    namespace rapidcsv\n    {\n      template<>\n      void Converter<int>::ToVal(const std::string& pStr, int& pVal) const\n      {\n        pVal = static_cast<int>(roundf(100.0f * std::stof(pStr)));\n      }\n    }\n\n    int main()\n    {\n      rapidcsv::Document doc(\"examples/colrowhdr.csv\", rapidcsv::LabelParams(0, 0));\n\n      std::vector<int> close = doc.GetColumn<int>(\"Close\");\n      std::cout << \"close[0]  = \" << close[0] << std::endl;\n      std::cout << \"close[1]  = \" << close[1] << std::endl;\n    }\n```\n\nCustom Data Type Conversion Per Call\n------------------------------------\nIt is also possible to override conversions on a per-call basis, enabling more\nflexibility. This is illustrated in the following example. Additional conversion\noverride usage can be found in the test \n[tests/test063.cpp](https://github.com/d99kris/rapidcsv/blob/master/tests/test063.cpp)\n\n[ex009.cpp](examples/ex009.cpp) content:\n```cpp\n    #include <iostream>\n    #include <vector>\n    #include \"rapidcsv.h\"\n\n    void ConvFixPoint(const std::string& pStr, int& pVal)\n    {\n      pVal = static_cast<int>(roundf(100.0f * std::stof(pStr)));\n    }\n\n    struct MyStruct\n    {\n      int val = 0;\n    };\n\n    void ConvMyStruct(const std::string& pStr, MyStruct& pVal)\n    {\n      pVal.val = static_cast<int>(roundf(100.0f * std::stof(pStr)));\n    }\n\n    int main()\n    {\n      rapidcsv::Document doc(\"examples/colrowhdr.csv\", rapidcsv::LabelParams(0, 0));\n\n      std::cout << \"regular         = \" << doc.GetCell<int>(\"Close\", \"2017-02-21\") << \"\\n\";\n      std::cout << \"fixpointfunc    = \" << doc.GetCell<int>(\"Close\", \"2017-02-21\", ConvFixPoint) << \"\\n\";\n\n      auto convFixLambda = [](const std::string& pStr, int& pVal) { pVal = static_cast<int>(roundf(100.0f * stof(pStr))); };\n      std::cout << \"fixpointlambda  = \" << doc.GetCell<int>(\"Close\", \"2017-02-21\", convFixLambda) << \"\\n\";\n\n      std::cout << \"mystruct        = \" << doc.GetCell<MyStruct>(\"Close\", \"2017-02-21\", ConvMyStruct).val << \"\\n\";\n    }\n```\n\nReading CSV Data from a Stream or String\n----------------------------------------\nIn addition to specifying a filename, rapidcsv supports constructing a Document\nfrom a stream and, indirectly through stringstream, from a string. Here is a\nsimple example reading CSV data from a string:\n\n[ex007.cpp](examples/ex007.cpp) content:\n```cpp\n    #include <iostream>\n    #include <vector>\n    #include \"rapidcsv.h\"\n\n    int main()\n    {\n      const std::string& csv =\n        \"Date,Open,High,Low,Close,Volume,Adj Close\\n\"\n        \"2017-02-24,64.529999,64.800003,64.139999,64.620003,21705200,64.620003\\n\"\n        \"2017-02-23,64.419998,64.730003,64.190002,64.620003,20235200,64.620003\\n\"\n        \"2017-02-22,64.330002,64.389999,64.050003,64.360001,19259700,64.360001\\n\"\n        \"2017-02-21,64.610001,64.949997,64.449997,64.489998,19384900,64.489998\\n\"\n        \"2017-02-17,64.470001,64.690002,64.300003,64.620003,21234600,64.620003\\n\"\n        ;\n\n      std::stringstream sstream(csv);\n      rapidcsv::Document doc(sstream, rapidcsv::LabelParams(0, 0));\n\n      std::vector<float> close = doc.GetColumn<float>(\"Close\");\n      std::cout << \"Read \" << close.size() << \" values.\" << std::endl;\n\n      long long volume = doc.GetCell<long long>(\"Volume\", \"2017-02-22\");\n      std::cout << \"Volume \" << volume << \" on 2017-02-22.\" << std::endl;\n    }\n```\n\nReading a File with Invalid Numbers (e.g. Empty Cells) as Numeric Data\n-----------------------------------------------------------------------\nBy default rapidcsv throws an exception if one tries to access non-numeric\ndata as a numeric data type, as it basically propagates the underlying\nconversion routines' exceptions to the calling application.\n\nThe reason for this is to ensure data correctness. If one wants to be able\nto read data with invalid numbers as numeric data types, one can use\nConverterParams to configure the converter to default to a numeric value.\nThe value is configurable and by default it's\nstd::numeric_limits<long double>::signaling_NaN() for float types, and 0 for\ninteger types. Example:\n\n```cpp\n    rapidcsv::Document doc(\"file.csv\", rapidcsv::LabelParams(),\n                           rapidcsv::SeparatorParams(),\n                           rapidcsv::ConverterParams(true));\n```\n\nCheck if a Column Exists\n------------------------\nRapidcsv provides the methods GetColumnNames() and GetRowNames() to retrieve\nthe column and row names. To check whether a particular column name exists\none can for example do:\n\n```cpp\n    rapidcsv::Document doc(\"file.csv\");\n    std::vector<std::string> columnNames = doc.GetColumnNames();\n    bool columnExists =\n      (std::find(columnNames.begin(), columnNames.end(), \"A\") != columnNames.end());\n```\n\nUTF-16 and UTF-8\n----------------\nRapidcsv's preferred encoding for non-ASCII text is UTF-8. UTF-16 LE and\nUTF-16 BE can be read and written by rapidcsv on systems where codecvt header\nis present. Define HAS_CODECVT before including rapidcsv.h in order to enable\nthe functionality. Rapidcsv unit tests automatically detects the presence of\ncodecvt and sets HAS_CODECVT as needed, see [CMakeLists.txt](CMakeLists.txt)\nfor reference. When enabled, the UTF-16 encoding of any loaded file is\nautomatically detected.\n\nAPI Documentation\n=================\nThe following classes makes up the Rapidcsv interface:\n - [class rapidcsv::Document](doc/rapidcsv_Document.md)\n - [class rapidcsv::SeparatorParams](doc/rapidcsv_SeparatorParams.md)\n - [class rapidcsv::LabelParams](doc/rapidcsv_LabelParams.md)\n - [class rapidcsv::ConverterParams](doc/rapidcsv_ConverterParams.md)\n - [class rapidcsv::no_converter](doc/rapidcsv_no_converter.md)\n - [class rapidcsv::Converter< T >](doc/rapidcsv_Converter.md)\n\nTechnical Details\n=================\nRapidcsv uses cmake for its tests. Commands to build and execute the test suite:\n\n    mkdir -p build && cd build && cmake .. && make && ctest -C unit --output-on-failure && ctest -C perf --verbose ; cd -\n\nRapidcsv uses [doxyman2md](https://github.com/d99kris/doxyman2md) to generate\nits API documentation:\n\n    doxyman2md src doc\n\nRapidcsv uses Uncrustify to ensure consistent code formatting:\n\n    uncrustify -c uncrustify.cfg --no-backup src/rapidcsv.h\n\nAlternatives\n============\nThere are many CSV parsers for C++, for example:\n- [CSV Parser](https://github.com/AriaFallah/csv-parser)\n- [CSVparser](https://github.com/MyBoon/CSVparser)\n- [Fast C++ CSV Parser](https://github.com/ben-strasser/fast-cpp-csv-parser)\n- [Vince's CSV Parser](https://github.com/vincentlaucsb/csv-parser)\n\nLicense\n=======\nRapidcsv is distributed under the BSD 3-Clause license. See\n[LICENSE](https://github.com/d99kris/rapidcsv/blob/master/LICENSE) file.\n\nContributions\n=============\nBugs, PRs, etc are welcome on the GitHub project page\nhttps://github.com/d99kris/rapidcsv\n\nKeywords\n========\nc++, c++11, csv parser, comma separated values, single header library.\n\n"
  },
  {
    "path": "examples/libraries/rapidcsv/appveyor.yml",
    "content": "# Specify version format\nversion: \"{build}\"\n\n# Operating system (build VM template)\nos: Visual Studio 2015\n\n# build platform, i.e. Win32 (instead of x86), x64, Any CPU. This setting is optional.\nplatform: \n  - x64\n\n# specify custom environment variables\nenvironment:\n  MSVC_DEFAULT_OPTIONS: ON\n\n# build configuration, i.e. Debug, Release, etc.\nconfiguration:\n  - Debug\n  - Release\n\n# scripts that are called at very beginning, before repo cloning\ninit:\n  - cmd: cmake --version\n  - cmd: msbuild /version\n\n# clone directory\nclone_folder: C:\\projects\\rapidcsv\n\n# scripts to run before build\nbefore_build:\n  - cmd: cd C:\\projects\\rapidcsv\n  - cmd: md build\n  - cmd: cd build\n  - cmd: if \"%platform%\"==\"Win32\" set CMAKE_GENERATOR_NAME=Visual Studio 14 2015\n  - cmd: if \"%platform%\"==\"x64\"   set CMAKE_GENERATOR_NAME=Visual Studio 14 2015 Win64\n  - cmd: cmake -G \"%CMAKE_GENERATOR_NAME%\" -DCMAKE_BUILD_TYPE=%configuration% ..\n\nbuild:\n  project: C:\\projects\\rapidcsv\\build\\rapidcsv.sln  # path to Visual Studio solution or project\n  parallel: true                                    # enable MSBuild parallel builds\n  verbosity: quiet                                  # MSBuild verb level (quiet|minimal|normal|detailed)\n\ntest_script:\n  - cmd: cd C:\\projects\\rapidcsv\\build\n  - cmd: if \"%configuration%\"==\"Debug\"    ctest -C Debug   --output-on-failure\n  - cmd: if \"%configuration%\"==\"Release\"  ctest -C Release --verbose\n\n"
  },
  {
    "path": "examples/libraries/rapidcsv/doc/README.md",
    "content": "# API Documentation\n - [class rapidcsv::Document](rapidcsv_Document.md)\n - [class rapidcsv::no_converter](rapidcsv_no_converter.md)\n - [class rapidcsv::Converter< T >](rapidcsv_Converter.md)\n - [class rapidcsv::SeparatorParams](rapidcsv_SeparatorParams.md)\n - [class rapidcsv::LabelParams](rapidcsv_LabelParams.md)\n - [class rapidcsv::ConverterParams](rapidcsv_ConverterParams.md)\n"
  },
  {
    "path": "examples/libraries/rapidcsv/doc/rapidcsv_Converter.md",
    "content": "## class rapidcsv::Converter< T >\n\nClass providing conversion to/from numerical datatypes and strings. Only intended for rapidcsv internal usage, but exposed externally to allow specialization for custom datatype conversions.  \n\n---\n\n```c++\ntemplate<typename T> Converter (const ConverterParams & pConverterParams)\n```\nConstructor. \n\n**Parameters**\n- `pConverterParams` specifies how conversion of non-numerical values to numerical datatype shall be handled. \n\n---\n\n```c++\ntemplate<typename T> void ToStr (const T & pVal, std::string & pStr)\n```\nConverts numerical value to string representation. \n\n**Parameters**\n- `pVal` numerical value \n- `pStr` output string \n\n---\n\n```c++\ntemplate<> void Converter< std::string >::ToStr (const std::string & pVal, std::string & pStr)\n```\nSpecialized implementation handling string to string conversion. \n\n**Parameters**\n- `pVal` string \n- `pStr` string \n\n---\n\n```c++\ntemplate<typename T> void ToVal (const std::string & pStr, T & pVal)\n```\nConverts string holding a numerical value to numerical datatype representation. \n\n**Parameters**\n- `pVal` numerical value \n- `pStr` output string \n\n---\n\n```c++\ntemplate<> void Converter< std::string >::ToVal (const std::string & pStr, std::string & pVal)\n```\nSpecialized implementation handling string to string conversion. \n\n**Parameters**\n- `pVal` string \n- `pStr` string \n\n---\n\n###### API documentation generated using [Doxyman2md](https://github.com/d99kris/doxyman2md)\n\n"
  },
  {
    "path": "examples/libraries/rapidcsv/doc/rapidcsv_ConverterParams.md",
    "content": "## class rapidcsv::ConverterParams\n\nDatastructure holding parameters controlling how invalid numbers (including empty strings) should be handled.  \n\n---\n\n```c++\nConverterParams (const bool pHasDefaultConverter = false, const long double pDefaultFloat = std::numeric_limits<long double>::signaling_NaN(), const long long pDefaultInteger = 0)\n```\nConstructor. \n\n**Parameters**\n- `pHasDefaultConverter` specifies if conversion of non-numerical strings shall be converted to a default numerical value, instead of causing an exception to be thrown (default). \n- `pDefaultFloat` floating-point default value to represent invalid numbers. \n- `pDefaultInteger` integer default value to represent invalid numbers. \n\n---\n\n###### API documentation generated using [Doxyman2md](https://github.com/d99kris/doxyman2md)\n\n"
  },
  {
    "path": "examples/libraries/rapidcsv/doc/rapidcsv_Document.md",
    "content": "## class rapidcsv::Document\n\nClass representing a CSV document.  \n\n---\n\n```c++\nDocument (const std::string & pPath = std::string(), const LabelParams & pLabelParams = LabelParams(), const SeparatorParams & pSeparatorParams = SeparatorParams(), const ConverterParams & pConverterParams = ConverterParams())\n```\nConstructor. \n\n**Parameters**\n- `pPath` specifies the path of an existing CSV-file to populate the Document data with. \n- `pLabelParams` specifies which row and column should be treated as labels. \n- `pSeparatorParams` specifies which field and row separators should be used. \n- `pConverterParams` specifies how invalid numbers (including empty strings) should be handled. \n\n---\n\n```c++\nDocument (std::istream & pStream, const LabelParams & pLabelParams = LabelParams(), const SeparatorParams & pSeparatorParams = SeparatorParams(), const ConverterParams & pConverterParams = ConverterParams())\n```\nConstructor. \n\n**Parameters**\n- `pStream` specifies an input stream to read CSV data from. \n- `pLabelParams` specifies which row and column should be treated as labels. \n- `pSeparatorParams` specifies which field and row separators should be used. \n- `pConverterParams` specifies how invalid numbers (including empty strings) should be handled. \n\n---\n\n```c++\nDocument (const Document & pDocument)\n```\nCopy constructor. \n\n**Parameters**\n- `pDocument` specifies the Document instance to copy. \n\n---\n\n```c++\ntemplate<typename T > T GetCell (const size_t pColumnIdx, const size_t pRowIdx)\n```\nGet cell by index. \n\n**Parameters**\n- `pColumnIdx` zero-based column index. \n- `pRowIdx` zero-based row index. \n\n**Returns:**\n- cell data. \n\n---\n\n```c++\ntemplate<typename T > T GetCell (const size_t pColumnIdx, const size_t pRowIdx, ConvFunc< T > pToVal)\n```\nGet cell by index. \n\n**Parameters**\n- `pColumnIdx` zero-based column index. \n- `pRowIdx` zero-based row index. \n- `pToVal` conversion function. \n\n**Returns:**\n- cell data. \n\n---\n\n```c++\ntemplate<typename T > T GetCell (const std::string & pColumnName, const std::string & pRowName)\n```\nGet cell by name. \n\n**Parameters**\n- `pColumnName` column label name. \n- `pRowName` row label name. \n\n**Returns:**\n- cell data. \n\n---\n\n```c++\ntemplate<typename T > T GetCell (const std::string & pColumnName, const std::string & pRowName, ConvFunc< T > pToVal)\n```\nGet cell by name. \n\n**Parameters**\n- `pColumnName` column label name. \n- `pRowName` row label name. \n- `pToVal` conversion function. \n\n**Returns:**\n- cell data. \n\n---\n\n```c++\ntemplate<typename T > T GetCell (const std::string & pColumnName, const size_t pRowIdx)\n```\nGet cell by column name and row index. \n\n**Parameters**\n- `pColumnName` column label name. \n- `pRowIdx` zero-based row index. \n\n**Returns:**\n- cell data. \n\n---\n\n```c++\ntemplate<typename T > T GetCell (const std::string & pColumnName, const size_t pRowIdx, ConvFunc< T > pToVal)\n```\nGet cell by column name and row index. \n\n**Parameters**\n- `pColumnName` column label name. \n- `pRowIdx` zero-based row index. \n- `pToVal` conversion function. \n\n**Returns:**\n- cell data. \n\n---\n\n```c++\ntemplate<typename T > T GetCell (const size_t pColumnIdx, const std::string & pRowName)\n```\nGet cell by column index and row name. \n\n**Parameters**\n- `pColumnIdx` zero-based column index. \n- `pRowName` row label name. \n\n**Returns:**\n- cell data. \n\n---\n\n```c++\ntemplate<typename T > T GetCell (const size_t pColumnIdx, const std::string & pRowName, ConvFunc< T > pToVal)\n```\nGet cell by column index and row name. \n\n**Parameters**\n- `pColumnIdx` zero-based column index. \n- `pRowName` row label name. \n- `pToVal` conversion function. \n\n**Returns:**\n- cell data. \n\n---\n\n```c++\ntemplate<typename T > std::vector<T> GetColumn (const size_t pColumnIdx)\n```\nGet column by index. \n\n**Parameters**\n- `pColumnIdx` zero-based column index. \n\n**Returns:**\n- vector of column data. \n\n---\n\n```c++\ntemplate<typename T > std::vector<T> GetColumn (const size_t pColumnIdx, ConvFunc< T > pToVal)\n```\nGet column by index. \n\n**Parameters**\n- `pColumnIdx` zero-based column index. \n- `pToVal` conversion function. \n\n**Returns:**\n- vector of column data. \n\n---\n\n```c++\ntemplate<typename T > std::vector<T> GetColumn (const std::string & pColumnName)\n```\nGet column by name. \n\n**Parameters**\n- `pColumnName` column label name. \n\n**Returns:**\n- vector of column data. \n\n---\n\n```c++\ntemplate<typename T > std::vector<T> GetColumn (const std::string & pColumnName, ConvFunc< T > pToVal)\n```\nGet column by name. \n\n**Parameters**\n- `pColumnName` column label name. \n- `pToVal` conversion function. \n\n**Returns:**\n- vector of column data. \n\n---\n\n```c++\nsize_t GetColumnCount ()\n```\nGet number of data columns (excluding label columns). \n\n**Returns:**\n- column count. \n\n---\n\n```c++\nstd::string GetColumnName (const ssize_t pColumnIdx)\n```\nGet column name. \n\n**Parameters**\n- `pColumnIdx` zero-based column index. \n\n**Returns:**\n- column name. \n\n---\n\n```c++\nstd::vector<std::string> GetColumnNames ()\n```\nGet column names. \n\n**Returns:**\n- vector of column names. \n\n---\n\n```c++\ntemplate<typename T > std::vector<T> GetRow (const size_t pRowIdx)\n```\nGet row by index. \n\n**Parameters**\n- `pRowIdx` zero-based row index. \n\n**Returns:**\n- vector of row data. \n\n---\n\n```c++\ntemplate<typename T > std::vector<T> GetRow (const size_t pRowIdx, ConvFunc< T > pToVal)\n```\nGet row by index. \n\n**Parameters**\n- `pRowIdx` zero-based row index. \n- `pToVal` conversion function. \n\n**Returns:**\n- vector of row data. \n\n---\n\n```c++\ntemplate<typename T > std::vector<T> GetRow (const std::string & pRowName)\n```\nGet row by name. \n\n**Parameters**\n- `pRowName` row label name. \n\n**Returns:**\n- vector of row data. \n\n---\n\n```c++\ntemplate<typename T > std::vector<T> GetRow (const std::string & pRowName, ConvFunc< T > pToVal)\n```\nGet row by name. \n\n**Parameters**\n- `pRowName` row label name. \n- `pToVal` conversion function. \n\n**Returns:**\n- vector of row data. \n\n---\n\n```c++\nsize_t GetRowCount ()\n```\nGet number of data rows (excluding label rows). \n\n**Returns:**\n- row count. \n\n---\n\n```c++\nstd::string GetRowName (const ssize_t pRowIdx)\n```\nGet row name. \n\n**Parameters**\n- `pRowIdx` zero-based column index. \n\n**Returns:**\n- row name. \n\n---\n\n```c++\nstd::vector<std::string> GetRowNames ()\n```\nGet row names. \n\n**Returns:**\n- vector of row names. \n\n---\n\n```c++\nvoid Load (const std::string & pPath)\n```\nRead Document data from file. \n\n**Parameters**\n- `pPath` specifies the path of an existing CSV-file to populate the Document data with. \n\n---\n\n```c++\nvoid RemoveColumn (const size_t pColumnIdx)\n```\nRemove column by index. \n\n**Parameters**\n- `pColumnIdx` zero-based column index. \n\n---\n\n```c++\nvoid RemoveColumn (const std::string & pColumnName)\n```\nRemove column by name. \n\n**Parameters**\n- `pColumnName` column label name. \n\n---\n\n```c++\nvoid RemoveRow (const size_t pRowIdx)\n```\nRemove row by index. \n\n**Parameters**\n- `pRowIdx` zero-based row index. \n\n---\n\n```c++\nvoid RemoveRow (const std::string & pRowName)\n```\nRemove row by name. \n\n**Parameters**\n- `pRowName` row label name. \n\n---\n\n```c++\nvoid Save (const std::string & pPath = std::string())\n```\nWrite Document data to file. \n\n**Parameters**\n- `pPath` optionally specifies the path where the CSV-file will be created (if not specified, the original path provided when creating or loading the Document data will be used). \n\n---\n\n```c++\nvoid Save (std::ostream & pStream)\n```\nWrite Document data to stream. \n\n**Parameters**\n- `pStream` specifies an output stream to write the data to. \n\n---\n\n```c++\ntemplate<typename T > void SetCell (const size_t pColumnIdx, const size_t pRowIdx, const T & pCell)\n```\nSet cell by index. \n\n**Parameters**\n- `pRowIdx` zero-based row index. \n- `pColumnIdx` zero-based column index. \n- `pCell` cell data. \n\n---\n\n```c++\ntemplate<typename T > void SetCell (const std::string & pColumnName, const std::string & pRowName, const T & pCell)\n```\nSet cell by name. \n\n**Parameters**\n- `pColumnName` column label name. \n- `pRowName` row label name. \n- `pCell` cell data. \n\n---\n\n```c++\ntemplate<typename T > void SetColumn (const size_t pColumnIdx, const std::vector< T > & pColumn)\n```\nSet column by index. \n\n**Parameters**\n- `pColumnIdx` zero-based column index. \n- `pColumn` vector of column data. \n\n---\n\n```c++\ntemplate<typename T > void SetColumn (const std::string & pColumnName, const std::vector< T > & pColumn)\n```\nSet column by name. \n\n**Parameters**\n- `pColumnName` column label name. \n- `pColumn` vector of column data. \n\n---\n\n```c++\nvoid SetColumnName (size_t pColumnIdx, const std::string & pColumnName)\n```\nSet column name. \n\n**Parameters**\n- `pColumnIdx` zero-based column index. \n- `pColumnName` column name. \n\n---\n\n```c++\ntemplate<typename T > void SetRow (const size_t pRowIdx, const std::vector< T > & pRow)\n```\nSet row by index. \n\n**Parameters**\n- `pRowIdx` zero-based row index. \n- `pRow` vector of row data. \n\n---\n\n```c++\ntemplate<typename T > void SetRow (const std::string & pRowName, const std::vector< T > & pRow)\n```\nSet row by name. \n\n**Parameters**\n- `pRowName` row label name. \n- `pRow` vector of row data. \n\n---\n\n```c++\nvoid SetRowName (size_t pRowIdx, const std::string & pRowName)\n```\nSet row name. \n\n**Parameters**\n- `pRowIdx` zero-based row index. \n- `pRowName` row name. \n\n---\n\n###### API documentation generated using [Doxyman2md](https://github.com/d99kris/doxyman2md)\n\n"
  },
  {
    "path": "examples/libraries/rapidcsv/doc/rapidcsv_LabelParams.md",
    "content": "## class rapidcsv::LabelParams\n\nDatastructure holding parameters controlling which row and column should be treated as labels.  \n\n---\n\n```c++\nLabelParams (const int pColumnNameIdx = 0, const int pRowNameIdx = \\-1)\n```\nConstructor. \n\n**Parameters**\n- `pColumnNameIdx` specifies the zero-based row index of the column labels, setting it to -1 prevents column lookup by label name, and gives access to all rows as document data. Default: 0 \n- `pRowNameIdx` specifies the zero-based column index of the row labels, setting it to -1 prevents row lookup by label name, and gives access to all columns as document data. Default: -1 \n\n---\n\n###### API documentation generated using [Doxyman2md](https://github.com/d99kris/doxyman2md)\n\n"
  },
  {
    "path": "examples/libraries/rapidcsv/doc/rapidcsv_SeparatorParams.md",
    "content": "## class rapidcsv::SeparatorParams\n\nDatastructure holding parameters controlling how the CSV data fields are separated.  \n\n---\n\n```c++\nSeparatorParams (const char pSeparator = ',', const bool pTrim = false, const bool pHasCR = sPlatformHasCR, const bool pQuotedLinebreaks = false)\n```\nConstructor. \n\n**Parameters**\n- `pSeparator` specifies the column separator (default ','). \n- `pTrim` specifies whether to trim leading and trailing spaces from cells read. \n- `pHasCR` specifies whether a new document (i.e. not an existing document read) should use CR/LF instead of only LF (default is to use standard behavior of underlying platforms - CR/LF for Win, and LF for others). \n- `pQuotedLinebreaks` specifies whether to allow line breaks in quoted text. \n\n---\n\n###### API documentation generated using [Doxyman2md](https://github.com/d99kris/doxyman2md)\n\n"
  },
  {
    "path": "examples/libraries/rapidcsv/doc/rapidcsv_no_converter.md",
    "content": "## class rapidcsv::no_converter\n\nException thrown when attempting to access Document data in a datatype which is not supported by the Converter class.  \n\n---\n\n###### API documentation generated using [Doxyman2md](https://github.com/d99kris/doxyman2md)\n\n"
  },
  {
    "path": "examples/libraries/rapidcsv/examples/colhdr.csv",
    "content": "Open,High,Low,Close,Volume,Adj Close\n64.529999,64.800003,64.139999,64.620003,21705200,64.620003\n64.419998,64.730003,64.190002,64.620003,20235200,64.620003\n64.330002,64.389999,64.050003,64.360001,19259700,64.360001\n64.610001,64.949997,64.449997,64.489998,19384900,64.489998\n64.470001,64.690002,64.300003,64.620003,21234600,64.620003\n"
  },
  {
    "path": "examples/libraries/rapidcsv/examples/colrowhdr.csv",
    "content": "Date,Open,High,Low,Close,Volume,Adj Close\n2017-02-24,64.529999,64.800003,64.139999,64.620003,21705200,64.620003\n2017-02-23,64.419998,64.730003,64.190002,64.620003,20235200,64.620003\n2017-02-22,64.330002,64.389999,64.050003,64.360001,19259700,64.360001\n2017-02-21,64.610001,64.949997,64.449997,64.489998,19384900,64.489998\n2017-02-17,64.470001,64.690002,64.300003,64.620003,21234600,64.620003\n"
  },
  {
    "path": "examples/libraries/rapidcsv/examples/ex001.cpp",
    "content": "#if 0\nTMP=$(mktemp -d)\nc++ -std=c++11 -I src -o ${TMP}/a.out ${0} && ${TMP}/a.out ${@:1} ; RV=${?}\nrm -rf ${TMP}\nexit ${RV}\n#endif\n\n#include <iostream>\n#include <vector>\n#include \"rapidcsv.h\"\n\nint main()\n{\n  rapidcsv::Document doc(\"examples/colhdr.csv\");\n\n  std::vector<float> col = doc.GetColumn<float>(\"Close\");\n  std::cout << \"Read \" << col.size() << \" values.\" << std::endl;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/examples/ex002.cpp",
    "content": "#if 0\nTMP=$(mktemp -d)\nc++ -std=c++11 -I src -o ${TMP}/a.out ${0} && ${TMP}/a.out ${@:1} ; RV=${?}\nrm -rf ${TMP}\nexit ${RV}\n#endif\n\n#include <iostream>\n#include <vector>\n#include \"rapidcsv.h\"\n\nint main()\n{\n  rapidcsv::Document doc(\"examples/colrowhdr.csv\", rapidcsv::LabelParams(0, 0));\n\n  std::vector<float> close = doc.GetRow<float>(\"2017-02-22\");\n  std::cout << \"Read \" << close.size() << \" values.\" << std::endl;\n\n  long long volume = doc.GetCell<long long>(\"Volume\", \"2017-02-22\");\n  std::cout << \"Volume \" << volume << \" on 2017-02-22.\" << std::endl;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/examples/ex003.cpp",
    "content": "#if 0\nTMP=$(mktemp -d)\nc++ -std=c++11 -I src -o ${TMP}/a.out ${0} && ${TMP}/a.out ${@:1} ; RV=${?}\nrm -rf ${TMP}\nexit ${RV}\n#endif\n\n#include <iostream>\n#include <vector>\n#include \"rapidcsv.h\"\n\nint main()\n{\n  rapidcsv::Document doc(\"examples/rowhdr.csv\", rapidcsv::LabelParams(-1, 0));\n\n  std::vector<std::string> row = doc.GetRow<std::string>(\"2017-02-22\");\n  std::cout << \"Read \" << row.size() << \" values.\" << std::endl;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/examples/ex004.cpp",
    "content": "#if 0\nTMP=$(mktemp -d)\nc++ -std=c++11 -I src -o ${TMP}/a.out ${0} && ${TMP}/a.out ${@:1} ; RV=${?}\nrm -rf ${TMP}\nexit ${RV}\n#endif\n\n#include <iostream>\n#include <vector>\n#include \"rapidcsv.h\"\n\nint main()\n{\n  rapidcsv::Document doc(\"examples/nohdr.csv\", rapidcsv::LabelParams(-1, -1));\n\n  std::vector<float> close = doc.GetColumn<float>(5);\n  std::cout << \"Read \" << close.size() << \" values.\" << std::endl;\n\n  long long volume = doc.GetCell<long long>(4, 2);\n  std::cout << \"Volume \" << volume << \" on 2017-02-22.\" << std::endl;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/examples/ex005.cpp",
    "content": "#if 0\nTMP=$(mktemp -d)\nc++ -std=c++11 -I src -o ${TMP}/a.out ${0} && ${TMP}/a.out ${@:1} ; RV=${?}\nrm -rf ${TMP}\nexit ${RV}\n#endif\n\n#include <iostream>\n#include <vector>\n#include \"rapidcsv.h\"\n\nint main()\n{\n  rapidcsv::Document doc(\"examples/semi.csv\", rapidcsv::LabelParams(0, 0),\n                         rapidcsv::SeparatorParams(';'));\n\n  std::vector<float> close = doc.GetColumn<float>(\"Close\");\n  std::cout << \"Read \" << close.size() << \" values.\" << std::endl;\n\n  long long volume = doc.GetCell<long long>(\"Volume\", \"2017-02-22\");\n  std::cout << \"Volume \" << volume << \" on 2017-02-22.\" << std::endl;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/examples/ex006.cpp",
    "content": "#if 0\nTMP=$(mktemp -d)\nc++ -std=c++11 -I src -o ${TMP}/a.out ${0} && ${TMP}/a.out ${@:1} ; RV=${?}\nrm -rf ${TMP}\nexit ${RV}\n#endif\n\n#include <iostream>\n#include <vector>\n#include \"rapidcsv.h\"\n\nint main()\n{\n  rapidcsv::Document doc(\"examples/colrowhdr.csv\", rapidcsv::LabelParams(0, 0));\n\n  std::cout << doc.GetCell<std::string>(\"Volume\", \"2017-02-22\") << std::endl;\n  std::cout << doc.GetCell<int>(\"Volume\", \"2017-02-22\") << std::endl;\n  std::cout << doc.GetCell<long>(\"Volume\", \"2017-02-22\") << std::endl;\n  std::cout << doc.GetCell<long long>(\"Volume\", \"2017-02-22\") << std::endl;\n  std::cout << doc.GetCell<unsigned>(\"Volume\", \"2017-02-22\") << std::endl;\n  std::cout << doc.GetCell<unsigned long>(\"Volume\", \"2017-02-22\") << std::endl;\n  std::cout << doc.GetCell<unsigned long long>(\"Volume\", \"2017-02-22\") << std::endl;\n  std::cout << doc.GetCell<float>(\"Volume\", \"2017-02-22\") << std::endl;\n  std::cout << doc.GetCell<double>(\"Volume\", \"2017-02-22\") << std::endl;\n  std::cout << doc.GetCell<long double>(\"Volume\", \"2017-02-22\") << std::endl;\n  std::cout << doc.GetCell<char>(\"Volume\", \"2017-02-22\") << std::endl;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/examples/ex007.cpp",
    "content": "#if 0\nTMP=$(mktemp -d)\nc++ -std=c++11 -I src -o ${TMP}/a.out ${0} && ${TMP}/a.out ${@:1} ; RV=${?}\nrm -rf ${TMP}\nexit ${RV}\n#endif\n\n#include <iostream>\n#include <vector>\n#include \"rapidcsv.h\"\n\nint main()\n{\n  const std::string& csv =\n    \"Date,Open,High,Low,Close,Volume,Adj Close\\n\"\n    \"2017-02-24,64.529999,64.800003,64.139999,64.620003,21705200,64.620003\\n\"\n    \"2017-02-23,64.419998,64.730003,64.190002,64.620003,20235200,64.620003\\n\"\n    \"2017-02-22,64.330002,64.389999,64.050003,64.360001,19259700,64.360001\\n\"\n    \"2017-02-21,64.610001,64.949997,64.449997,64.489998,19384900,64.489998\\n\"\n    \"2017-02-17,64.470001,64.690002,64.300003,64.620003,21234600,64.620003\\n\"\n  ;\n\n  std::stringstream sstream(csv);\n  rapidcsv::Document doc(sstream, rapidcsv::LabelParams(0, 0));\n\n  std::vector<float> close = doc.GetColumn<float>(\"Close\");\n  std::cout << \"Read \" << close.size() << \" values.\" << std::endl;\n\n  long long volume = doc.GetCell<long long>(\"Volume\", \"2017-02-22\");\n  std::cout << \"Volume \" << volume << \" on 2017-02-22.\" << std::endl;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/examples/ex008.cpp",
    "content": "#if 0\nTMP=$(mktemp -d)\nc++ -std=c++11 -I src -o ${TMP}/a.out ${0} && ${TMP}/a.out ${@:1} ; RV=${?}\nrm -rf ${TMP}\nexit ${RV}\n#endif\n\n#include <iostream>\n#include <vector>\n#include \"rapidcsv.h\"\n\nnamespace rapidcsv\n{\n  template<>\n  void Converter<int>::ToVal(const std::string& pStr, int& pVal) const\n  {\n    pVal = static_cast<int>(roundf(100.0f * std::stof(pStr)));\n  }\n}\n\nint main()\n{\n  rapidcsv::Document doc(\"examples/colrowhdr.csv\", rapidcsv::LabelParams(0, 0));\n\n  std::vector<int> close = doc.GetColumn<int>(\"Close\");\n  std::cout << \"close[0]  = \" << close[0] << std::endl;\n  std::cout << \"close[1]  = \" << close[1] << std::endl;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/examples/ex009.cpp",
    "content": "#if 0\nTMP=$(mktemp -d)\nc++ -std=c++11 -I src -o ${TMP}/a.out ${0} && ${TMP}/a.out ${@:1} ; RV=${?}\nrm -rf ${TMP}\nexit ${RV}\n#endif\n\n#include <iostream>\n#include <vector>\n#include \"rapidcsv.h\"\n\nvoid ConvFixPoint(const std::string& pStr, int& pVal)\n{\n  pVal = static_cast<int>(roundf(100.0f * std::stof(pStr)));\n}\n\nstruct MyStruct\n{\n  int val = 0;\n};\n\nvoid ConvMyStruct(const std::string& pStr, MyStruct& pVal)\n{\n  pVal.val = static_cast<int>(roundf(100.0f * std::stof(pStr)));\n}\n\nint main()\n{\n  rapidcsv::Document doc(\"examples/colrowhdr.csv\", rapidcsv::LabelParams(0, 0));\n\n  std::cout << \"regular         = \" << doc.GetCell<int>(\"Close\", \"2017-02-21\") << \"\\n\";\n  std::cout << \"fixpointfunc    = \" << doc.GetCell<int>(\"Close\", \"2017-02-21\", ConvFixPoint) << \"\\n\";\n\n  auto convFixLambda = [](const std::string& pStr, int& pVal) { pVal = static_cast<int>(roundf(100.0f * stof(pStr))); };\n  std::cout << \"fixpointlambda  = \" << doc.GetCell<int>(\"Close\", \"2017-02-21\", convFixLambda) << \"\\n\";\n\n  std::cout << \"mystruct        = \" << doc.GetCell<MyStruct>(\"Close\", \"2017-02-21\", ConvMyStruct).val << \"\\n\";\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/examples/nohdr.csv",
    "content": "64.529999,64.800003,64.139999,64.620003,21705200,64.620003\n64.419998,64.730003,64.190002,64.620003,20235200,64.620003\n64.330002,64.389999,64.050003,64.360001,19259700,64.360001\n64.610001,64.949997,64.449997,64.489998,19384900,64.489998\n64.470001,64.690002,64.300003,64.620003,21234600,64.620003\n"
  },
  {
    "path": "examples/libraries/rapidcsv/examples/rowhdr.csv",
    "content": "2017-02-24,64.529999,64.800003,64.139999,64.620003,21705200,64.620003\n2017-02-23,64.419998,64.730003,64.190002,64.620003,20235200,64.620003\n2017-02-22,64.330002,64.389999,64.050003,64.360001,19259700,64.360001\n2017-02-21,64.610001,64.949997,64.449997,64.489998,19384900,64.489998\n2017-02-17,64.470001,64.690002,64.300003,64.620003,21234600,64.620003\n"
  },
  {
    "path": "examples/libraries/rapidcsv/examples/semi.csv",
    "content": "Date;Open;High;Low;Close;Volume;Adj Close\n2017-02-24;64.529999;64.800003;64.139999;64.620003;21705200;64.620003\n2017-02-23;64.419998;64.730003;64.190002;64.620003;20235200;64.620003\n2017-02-22;64.330002;64.389999;64.050003;64.360001;19259700;64.360001\n2017-02-21;64.610001;64.949997;64.449997;64.489998;19384900;64.489998\n2017-02-17;64.470001;64.690002;64.300003;64.620003;21234600;64.620003\n"
  },
  {
    "path": "examples/libraries/rapidcsv/run.sh",
    "content": "#!/usr/bin/env bash\n\nBUILD=\"0\"\nTESTS=\"0\"\nEXAMPLES=\"0\"\nDOC=\"0\"\nSRC=\"0\"\nALL=\"0\"\ncase \"${1%/}\" in\n  build)\n    BUILD=\"1\"\n    ;;\n\n  tests)\n    TESTS=\"1\"\n    ;;\n\n  examples)\n    EXAMPLES=\"1\"\n    ;;\n\n  doc)\n    DOC=\"1\"\n    ;;\n\n  src)\n    SRC=\"1\"\n    ;;\n\n  all)\n    BUILD=\"1\"\n    TESTS=\"1\"\n    EXAMPLES=\"1\"\n    DOC=\"1\"\n    SRC=\"1\"\n    TEST=\"1\"\n    ;;\n\n  *)\n    echo \"usage: run.sh <build|test|examples|gendoc|format|all>\"\n    echo \"  build     - build tests and examples\"\n    echo \"  tests     - perform build and run tests\"\n    echo \"  examples  - run examples\"\n    echo \"  doc       - generate/update API documentation in doc/\"\n    echo \"  src       - reformat source code files using uncrustify\"\n    echo \"  all       - performs all actions above\"\n    exit 1\n    ;;\nesac\n\nif [[ \"${BUILD}\" == \"1\" ]] || [[ \"${TESTS}\" == \"1\" ]]; then\n    mkdir -p build && cd build && cmake .. && make\n    if [[ \"${?}\" != \"0\" ]]; then\n        echo \"build failed, exiting.\"\n        exit 1\n    fi\n    cd - > /dev/null\nfi\n\nif [[ \"${TESTS}\" == \"1\" ]]; then\n    cd build && ctest -C unit --output-on-failure && ctest -C perf --verbose\n    if [[ \"${?}\" != \"0\" ]]; then\n        echo \"tests failed, exiting.\"\n        exit 1\n    fi\n    cd - > /dev/null\nfi\n\nif [[ \"${EXAMPLES}\" == \"1\" ]]; then\n    for EXAMPLE in examples/*.cpp; do\n      ./${EXAMPLE}\n      if [[ \"${?}\" != \"0\" ]]; then\n          echo \"${EXAMPLE} failed, exiting.\"\n          exit 1\n      fi\n    done\nfi\n\nif [[ \"${DOC}\" == \"1\" ]]; then\n    doxyman2md src doc\n    if [[ \"${?}\" != \"0\" ]]; then\n        echo \"doc failed, exiting.\"\n        exit 1\n    fi\nfi\n\nif [[ \"${SRC}\" == \"1\" ]]; then\n    TMPDIR=$(mktemp -d)\n    for SRC in examples/*.cpp; do\n      DST=\"${TMPDIR}/$(basename ${SRC})\"\n      printf \"\\n\\n\\n\\n\\n\\n\"  > ${DST}         # add 6 blank lines\n      tail -n +8 ${SRC}     >> ${DST}         # skip header (first 7 lines) \n      head -7 ${SRC}         > ${DST}.header  # store header separately (first 7 lines)\n    done\n    \n    uncrustify -c uncrustify.cfg --replace --no-backup src/rapidcsv.h tests/*.cpp tests/*.h ${TMPDIR}/*.cpp\n    if [[ \"${?}\" != \"0\" ]]; then\n        rm -rf ${TMPDIR}\n        echo \"src failed, exiting.\"\n        exit 1\n    fi\n\n    for DST in examples/*.cpp; do\n      SRC=\"${TMPDIR}/$(basename ${DST})\"\n      cat ${SRC}.header      > ${DST}.tmp\n      cat ${SRC}            >> ${DST}.tmp\n\n      cmp --silent ${DST} ${DST}.tmp\n      if [[ \"${?}\" != \"0\" ]]; then\n          cat ${DST}.tmp > ${DST}\n      fi\n      rm ${DST}.tmp\n    done\n\n    rm -rf ${TMPDIR}\nfi\n\nexit 0\n"
  },
  {
    "path": "examples/libraries/rapidcsv/src/rapidcsv.h",
    "content": "/*\n * rapidcsv.h\n *\n * URL:      https://github.com/d99kris/rapidcsv\n * Version:  7.00\n *\n * Copyright (C) 2017-2020 Kristofer Berggren\n * All rights reserved.\n *\n * rapidcsv is distributed under the BSD 3-Clause license, see LICENSE for details.\n *\n */\n\n#pragma once\n\n#include <algorithm>\n#include <cassert>\n#include <cmath>\n#ifdef HAS_CODECVT\n#include <codecvt>\n#endif\n#include <fstream>\n#include <functional>\n#include <iostream>\n#include <map>\n#include <sstream>\n#include <string>\n#include <typeinfo>\n#include <vector>\n\n#if defined(_MSC_VER)\n#include <BaseTsd.h>\ntypedef SSIZE_T ssize_t;\n#endif\n\nnamespace rapidcsv\n{\n#if defined(_MSC_VER)\n  static const bool sPlatformHasCR = true;\n#else\n  static const bool sPlatformHasCR = false;\n#endif\n\n  /**\n   * @brief     Datastructure holding parameters controlling how invalid numbers (including\n   *            empty strings) should be handled.\n   */\n  struct ConverterParams\n  {\n    /**\n     * @brief   Constructor\n     * @param   pHasDefaultConverter  specifies if conversion of non-numerical strings shall be\n     *                                converted to a default numerical value, instead of causing\n     *                                an exception to be thrown (default).\n     * @param   pDefaultFloat         floating-point default value to represent invalid numbers.\n     * @param   pDefaultInteger       integer default value to represent invalid numbers.\n     */\n    explicit ConverterParams(const bool pHasDefaultConverter = false,\n                             const long double pDefaultFloat = std::numeric_limits<long double>::signaling_NaN(),\n                             const long long pDefaultInteger = 0)\n      : mHasDefaultConverter(pHasDefaultConverter)\n      , mDefaultFloat(pDefaultFloat)\n      , mDefaultInteger(pDefaultInteger)\n    {\n    }\n\n    /**\n     * @brief   specifies if conversion of non-numerical strings shall be converted to a default\n     *          numerical value, instead of causing an exception to be thrown (default).\n     */\n    bool mHasDefaultConverter;\n\n    /**\n     * @brief   floating-point default value to represent invalid numbers.\n     */\n    long double mDefaultFloat;\n\n    /**\n     * @brief   integer default value to represent invalid numbers.\n     */\n    long long mDefaultInteger;\n  };\n\n  /**\n   * @brief     Exception thrown when attempting to access Document data in a datatype which\n   *            is not supported by the Converter class.\n   */\n  class no_converter : public std::exception\n  {\n    /**\n     * @brief   Provides details about the exception\n     * @returns an explanatory string\n     */\n    virtual const char* what() const throw()\n    {\n      return \"unsupported conversion datatype\";\n    }\n  };\n\n  /**\n   * @brief     Class providing conversion to/from numerical datatypes and strings. Only\n   *            intended for rapidcsv internal usage, but exposed externally to allow\n   *            specialization for custom datatype conversions.\n   */\n  template<typename T>\n  class Converter\n  {\n  public:\n    /**\n     * @brief   Constructor\n     * @param   pConverterParams      specifies how conversion of non-numerical values to\n     *                                numerical datatype shall be handled.\n     */\n    Converter(const ConverterParams& pConverterParams)\n      : mConverterParams(pConverterParams)\n    {\n    }\n\n    /**\n     * @brief   Converts numerical value to string representation.\n     * @param   pVal                  numerical value\n     * @param   pStr                  output string\n     */\n    void ToStr(const T& pVal, std::string& pStr) const\n    {\n      if (typeid(T) == typeid(int) ||\n          typeid(T) == typeid(long) ||\n          typeid(T) == typeid(long long) ||\n          typeid(T) == typeid(unsigned) ||\n          typeid(T) == typeid(unsigned long) ||\n          typeid(T) == typeid(unsigned long long) ||\n          typeid(T) == typeid(float) ||\n          typeid(T) == typeid(double) ||\n          typeid(T) == typeid(long double) ||\n          typeid(T) == typeid(char))\n      {\n        std::ostringstream out;\n        out << pVal;\n        pStr = out.str();\n      }\n      else\n      {\n        throw no_converter();\n      }\n    }\n\n    /**\n     * @brief   Converts string holding a numerical value to numerical datatype representation.\n     * @param   pVal                  numerical value\n     * @param   pStr                  output string\n     */\n    void ToVal(const std::string& pStr, T& pVal) const\n    {\n      try\n      {\n        if (typeid(T) == typeid(int))\n        {\n          pVal = static_cast<T>(std::stoi(pStr));\n          return;\n        }\n        else if (typeid(T) == typeid(long))\n        {\n          pVal = static_cast<T>(std::stol(pStr));\n          return;\n        }\n        else if (typeid(T) == typeid(long long))\n        {\n          pVal = static_cast<T>(std::stoll(pStr));\n          return;\n        }\n        else if (typeid(T) == typeid(unsigned))\n        {\n          pVal = static_cast<T>(std::stoul(pStr));\n          return;\n        }\n        else if (typeid(T) == typeid(unsigned long))\n        {\n          pVal = static_cast<T>(std::stoul(pStr));\n          return;\n        }\n        else if (typeid(T) == typeid(unsigned long long))\n        {\n          pVal = static_cast<T>(std::stoull(pStr));\n          return;\n        }\n      }\n      catch (...)\n      {\n        if (!mConverterParams.mHasDefaultConverter)\n        {\n          throw;\n        }\n        else\n        {\n          pVal = static_cast<T>(mConverterParams.mDefaultInteger);\n          return;\n        }\n      }\n\n      try\n      {\n        if (typeid(T) == typeid(float))\n        {\n          pVal = static_cast<T>(std::stof(pStr));\n          return;\n        }\n        else if (typeid(T) == typeid(double))\n        {\n          pVal = static_cast<T>(std::stod(pStr));\n          return;\n        }\n        else if (typeid(T) == typeid(long double))\n        {\n          pVal = static_cast<T>(std::stold(pStr));\n          return;\n        }\n      }\n      catch (...)\n      {\n        if (!mConverterParams.mHasDefaultConverter)\n        {\n          throw;\n        }\n        else\n        {\n          pVal = static_cast<T>(mConverterParams.mDefaultFloat);\n          return;\n        }\n      }\n\n      if (typeid(T) == typeid(char))\n      {\n        pVal = static_cast<T>(pStr[0]);\n        return;\n      }\n      else\n      {\n        throw no_converter();\n      }\n    }\n\n  private:\n    const ConverterParams& mConverterParams;\n  };\n\n  /**\n   * @brief     Specialized implementation handling string to string conversion.\n   * @param     pVal                  string\n   * @param     pStr                  string\n   */\n  template<>\n  inline void Converter<std::string>::ToStr(const std::string& pVal, std::string& pStr) const\n  {\n    pStr = pVal;\n  }\n\n  /**\n   * @brief     Specialized implementation handling string to string conversion.\n   * @param     pVal                  string\n   * @param     pStr                  string\n   */\n  template<>\n  inline void Converter<std::string>::ToVal(const std::string& pStr, std::string& pVal) const\n  {\n    pVal = pStr;\n  }\n\n  template<typename T>\n  using ConvFunc = std::function<void (const std::string & pStr, T & pVal)>;\n\n  /**\n   * @brief     Datastructure holding parameters controlling which row and column should be\n   *            treated as labels.\n   */\n  struct LabelParams\n  {\n    /**\n     * @brief   Constructor\n     * @param   pColumnNameIdx        specifies the zero-based row index of the column labels, setting\n     *                                it to -1 prevents column lookup by label name, and gives access\n     *                                to all rows as document data. Default: 0\n     * @param   pRowNameIdx           specifies the zero-based column index of the row labels, setting\n     *                                it to -1 prevents row lookup by label name, and gives access\n     *                                to all columns as document data. Default: -1\n     */\n    explicit LabelParams(const int pColumnNameIdx = 0, const int pRowNameIdx = -1)\n      : mColumnNameIdx(pColumnNameIdx)\n      , mRowNameIdx(pRowNameIdx)\n    {\n    }\n\n    /**\n     * @brief   specifies the zero-based row index of the column labels.\n     */\n    int mColumnNameIdx;\n\n    /**\n     * @brief   specifies the zero-based column index of the row labels.\n     */\n    int mRowNameIdx;\n  };\n\n  /**\n   * @brief     Datastructure holding parameters controlling how the CSV data fields are separated.\n   */\n  struct SeparatorParams\n  {\n    /**\n     * @brief   Constructor\n     * @param   pSeparator            specifies the column separator (default ',').\n     * @param   pTrim                 specifies whether to trim leading and trailing spaces from\n     *                                cells read.\n     * @param   pHasCR                specifies whether a new document (i.e. not an existing document read)\n     *                                should use CR/LF instead of only LF (default is to use standard\n     *                                behavior of underlying platforms - CR/LF for Win, and LF for others).\n     * @param   pQuotedLinebreaks     specifies whether to allow line breaks in quoted text.\n     */\n    explicit SeparatorParams(const char pSeparator = ',', const bool pTrim = false,\n                             const bool pHasCR = sPlatformHasCR, const bool pQuotedLinebreaks = false)\n      : mSeparator(pSeparator)\n      , mTrim(pTrim)\n      , mHasCR(pHasCR)\n      , mQuotedLinebreaks(pQuotedLinebreaks)\n    {\n    }\n\n    /**\n     * @brief   specifies the column separator.\n     */\n    char mSeparator;\n\n    /**\n     * @brief   specifies whether to trim leading and trailing spaces from cells read.\n     */\n    bool mTrim;\n\n    /**\n     * @brief   specifies whether new documents should use CR/LF instead of LF.\n     */\n    bool mHasCR;\n\n    /**\n     * @brief   specifies whether to allow line breaks in quoted text.\n     */\n    bool mQuotedLinebreaks;\n  };\n\n  /**\n   * @brief     Class representing a CSV document.\n   */\n  class Document\n  {\n  public:\n    /**\n     * @brief   Constructor\n     * @param   pPath                 specifies the path of an existing CSV-file to populate the Document\n     *                                data with.\n     * @param   pLabelParams          specifies which row and column should be treated as labels.\n     * @param   pSeparatorParams      specifies which field and row separators should be used.\n     * @param   pConverterParams      specifies how invalid numbers (including empty strings) should be\n     *                                handled.\n     */\n    explicit Document(const std::string& pPath = std::string(),\n                      const LabelParams& pLabelParams = LabelParams(),\n                      const SeparatorParams& pSeparatorParams = SeparatorParams(),\n                      const ConverterParams& pConverterParams = ConverterParams())\n      : mPath(pPath)\n      , mLabelParams(pLabelParams)\n      , mSeparatorParams(pSeparatorParams)\n      , mConverterParams(pConverterParams)\n    {\n      if (!mPath.empty())\n      {\n        ReadCsv();\n      }\n    }\n\n    /**\n     * @brief   Constructor\n     * @param   pStream               specifies an input stream to read CSV data from.\n     * @param   pLabelParams          specifies which row and column should be treated as labels.\n     * @param   pSeparatorParams      specifies which field and row separators should be used.\n     * @param   pConverterParams      specifies how invalid numbers (including empty strings) should be\n     *                                handled.\n     */\n    explicit Document(std::istream& pStream,\n                      const LabelParams& pLabelParams = LabelParams(),\n                      const SeparatorParams& pSeparatorParams = SeparatorParams(),\n                      const ConverterParams& pConverterParams = ConverterParams())\n      : mPath()\n      , mLabelParams(pLabelParams)\n      , mSeparatorParams(pSeparatorParams)\n      , mConverterParams(pConverterParams)\n    {\n      ReadCsv(pStream);\n    }\n\n\n    /**\n     * @brief   Copy constructor\n     * @param   pDocument             specifies the Document instance to copy.\n     */\n    explicit Document(const Document& pDocument)\n      : mPath(pDocument.mPath)\n      , mLabelParams(pDocument.mLabelParams)\n      , mSeparatorParams(pDocument.mSeparatorParams)\n      , mConverterParams(pDocument.mConverterParams)\n      , mData(pDocument.mData)\n      , mColumnNames(pDocument.mColumnNames)\n      , mRowNames(pDocument.mRowNames)\n    {\n    }\n\n    /**\n     * @brief   Read Document data from file.\n     * @param   pPath                 specifies the path of an existing CSV-file to populate the Document\n     *                                data with.\n     */\n    void Load(const std::string& pPath)\n    {\n      mPath = pPath;\n      ReadCsv();\n    }\n\n    /**\n     * @brief   Write Document data to file.\n     * @param   pPath                 optionally specifies the path where the CSV-file will be created\n     *                                (if not specified, the original path provided when creating or\n     *                                loading the Document data will be used).\n     */\n    void Save(const std::string& pPath = std::string())\n    {\n      if (!pPath.empty())\n      {\n        mPath = pPath;\n      }\n      WriteCsv();\n    }\n\n    /**\n     * @brief   Write Document data to stream.\n     * @param   pStream               specifies an output stream to write the data to.\n     */\n    void Save(std::ostream& pStream)\n    {\n      WriteCsv(pStream);\n    }\n\n    /**\n     * @brief   Get column by index.\n     * @param   pColumnIdx            zero-based column index.\n     * @returns vector of column data.\n     */\n    template<typename T>\n    std::vector<T> GetColumn(const size_t pColumnIdx) const\n    {\n      const ssize_t columnIdx = pColumnIdx + (mLabelParams.mRowNameIdx + 1);\n      std::vector<T> column;\n      Converter<T> converter(mConverterParams);\n      for (auto itRow = mData.begin(); itRow != mData.end(); ++itRow)\n      {\n        if (std::distance(mData.begin(), itRow) > mLabelParams.mColumnNameIdx)\n        {\n          T val;\n          converter.ToVal(itRow->at(columnIdx), val);\n          column.push_back(val);\n        }\n      }\n      return column;\n    }\n\n    /**\n     * @brief   Get column by index.\n     * @param   pColumnIdx            zero-based column index.\n     * @param   pToVal                conversion function.\n     * @returns vector of column data.\n     */\n    template<typename T>\n    std::vector<T> GetColumn(const size_t pColumnIdx, ConvFunc<T> pToVal) const\n    {\n      const ssize_t columnIdx = pColumnIdx + (mLabelParams.mRowNameIdx + 1);\n      std::vector<T> column;\n      for (auto itRow = mData.begin(); itRow != mData.end(); ++itRow)\n      {\n        if (std::distance(mData.begin(), itRow) > mLabelParams.mColumnNameIdx)\n        {\n          T val;\n          pToVal(itRow->at(columnIdx), val);\n          column.push_back(val);\n        }\n      }\n      return column;\n    }\n\n    /**\n     * @brief   Get column by name.\n     * @param   pColumnName           column label name.\n     * @returns vector of column data.\n     */\n    template<typename T>\n    std::vector<T> GetColumn(const std::string& pColumnName) const\n    {\n      const ssize_t columnIdx = GetColumnIdx(pColumnName);\n      if (columnIdx < 0)\n      {\n        throw std::out_of_range(\"column not found: \" + pColumnName);\n      }\n      return GetColumn<T>(columnIdx);\n    }\n\n    /**\n     * @brief   Get column by name.\n     * @param   pColumnName           column label name.\n     * @param   pToVal                conversion function.\n     * @returns vector of column data.\n     */\n    template<typename T>\n    std::vector<T> GetColumn(const std::string& pColumnName, ConvFunc<T> pToVal) const\n    {\n      const ssize_t columnIdx = GetColumnIdx(pColumnName);\n      if (columnIdx < 0)\n      {\n        throw std::out_of_range(\"column not found: \" + pColumnName);\n      }\n      return GetColumn<T>(columnIdx, pToVal);\n    }\n\n    /**\n     * @brief   Set column by index.\n     * @param   pColumnIdx            zero-based column index.\n     * @param   pColumn               vector of column data.\n     */\n    template<typename T>\n    void SetColumn(const size_t pColumnIdx, const std::vector<T>& pColumn)\n    {\n      const size_t columnIdx = pColumnIdx + (mLabelParams.mRowNameIdx + 1);\n\n      while (pColumn.size() + (mLabelParams.mColumnNameIdx + 1) > GetDataRowCount())\n      {\n        std::vector<std::string> row;\n        row.resize(GetDataColumnCount());\n        mData.push_back(row);\n      }\n\n      if ((columnIdx + 1) > GetDataColumnCount())\n      {\n        for (auto itRow = mData.begin(); itRow != mData.end(); ++itRow)\n        {\n          itRow->resize(columnIdx + 1 + (mLabelParams.mRowNameIdx + 1));\n        }\n      }\n\n      Converter<T> converter(mConverterParams);\n      for (auto itRow = pColumn.begin(); itRow != pColumn.end(); ++itRow)\n      {\n        std::string str;\n        converter.ToStr(*itRow, str);\n        mData.at(std::distance(pColumn.begin(), itRow) + (mLabelParams.mColumnNameIdx + 1)).at(columnIdx) = str;\n      }\n    }\n\n    /**\n     * @brief   Set column by name.\n     * @param   pColumnName           column label name.\n     * @param   pColumn               vector of column data.\n     */\n    template<typename T>\n    void SetColumn(const std::string& pColumnName, const std::vector<T>& pColumn)\n    {\n      const ssize_t columnIdx = GetColumnIdx(pColumnName);\n      if (columnIdx < 0)\n      {\n        throw std::out_of_range(\"column not found: \" + pColumnName);\n      }\n      SetColumn<T>(columnIdx, pColumn);\n    }\n\n    /**\n     * @brief   Remove column by index.\n     * @param   pColumnIdx            zero-based column index.\n     */\n    void RemoveColumn(const size_t pColumnIdx)\n    {\n      const ssize_t columnIdx = pColumnIdx + (mLabelParams.mRowNameIdx + 1);\n      for (auto itRow = mData.begin(); itRow != mData.end(); ++itRow)\n      {\n        itRow->erase(itRow->begin() + columnIdx);\n      }\n    }\n\n    /**\n     * @brief   Remove column by name.\n     * @param   pColumnName           column label name.\n     */\n    void RemoveColumn(const std::string& pColumnName)\n    {\n      ssize_t columnIdx = GetColumnIdx(pColumnName);\n      if (columnIdx < 0)\n      {\n        throw std::out_of_range(\"column not found: \" + pColumnName);\n      }\n\n      RemoveColumn(columnIdx);\n    }\n\n    /**\n     * @brief   Get number of data columns (excluding label columns).\n     * @returns column count.\n     */\n    size_t GetColumnCount() const\n    {\n      const ssize_t count = static_cast<ssize_t>((mData.size() > 0) ? mData.at(0).size() : 0) -\n        (mLabelParams.mRowNameIdx + 1);\n      return (count >= 0) ? count : 0;\n    }\n\n    /**\n     * @brief   Get row by index.\n     * @param   pRowIdx               zero-based row index.\n     * @returns vector of row data.\n     */\n    template<typename T>\n    std::vector<T> GetRow(const size_t pRowIdx) const\n    {\n      const ssize_t rowIdx = pRowIdx + (mLabelParams.mColumnNameIdx + 1);\n      std::vector<T> row;\n      Converter<T> converter(mConverterParams);\n      for (auto itCol = mData.at(rowIdx).begin(); itCol != mData.at(rowIdx).end(); ++itCol)\n      {\n        if (std::distance(mData.at(rowIdx).begin(), itCol) > mLabelParams.mRowNameIdx)\n        {\n          T val;\n          converter.ToVal(*itCol, val);\n          row.push_back(val);\n        }\n      }\n      return row;\n    }\n\n    /**\n     * @brief   Get row by index.\n     * @param   pRowIdx               zero-based row index.\n     * @param   pToVal                conversion function.\n     * @returns vector of row data.\n     */\n    template<typename T>\n    std::vector<T> GetRow(const size_t pRowIdx, ConvFunc<T> pToVal) const\n    {\n      const ssize_t rowIdx = pRowIdx + (mLabelParams.mColumnNameIdx + 1);\n      std::vector<T> row;\n      Converter<T> converter(mConverterParams);\n      for (auto itCol = mData.at(rowIdx).begin(); itCol != mData.at(rowIdx).end(); ++itCol)\n      {\n        if (std::distance(mData.at(rowIdx).begin(), itCol) > mLabelParams.mRowNameIdx)\n        {\n          T val;\n          pToVal(*itCol, val);\n          row.push_back(val);\n        }\n      }\n      return row;\n    }\n\n    /**\n     * @brief   Get row by name.\n     * @param   pRowName              row label name.\n     * @returns vector of row data.\n     */\n    template<typename T>\n    std::vector<T> GetRow(const std::string& pRowName) const\n    {\n      ssize_t rowIdx = GetRowIdx(pRowName);\n      if (rowIdx < 0)\n      {\n        throw std::out_of_range(\"row not found: \" + pRowName);\n      }\n      return GetRow<T>(rowIdx);\n    }\n\n    /**\n     * @brief   Get row by name.\n     * @param   pRowName              row label name.\n     * @param   pToVal                conversion function.\n     * @returns vector of row data.\n     */\n    template<typename T>\n    std::vector<T> GetRow(const std::string& pRowName, ConvFunc<T> pToVal) const\n    {\n      ssize_t rowIdx = GetRowIdx(pRowName);\n      if (rowIdx < 0)\n      {\n        throw std::out_of_range(\"row not found: \" + pRowName);\n      }\n      return GetRow<T>(rowIdx, pToVal);\n    }\n\n    /**\n     * @brief   Set row by index.\n     * @param   pRowIdx               zero-based row index.\n     * @param   pRow                  vector of row data.\n     */\n    template<typename T>\n    void SetRow(const size_t pRowIdx, const std::vector<T>& pRow)\n    {\n      const size_t rowIdx = pRowIdx + (mLabelParams.mColumnNameIdx + 1);\n\n      while ((rowIdx + 1) > GetDataRowCount())\n      {\n        std::vector<std::string> row;\n        row.resize(GetDataColumnCount());\n        mData.push_back(row);\n      }\n\n      if (pRow.size() > GetDataColumnCount())\n      {\n        for (auto itRow = mData.begin(); itRow != mData.end(); ++itRow)\n        {\n          itRow->resize(pRow.size() + (mLabelParams.mRowNameIdx + 1));\n        }\n      }\n\n      Converter<T> converter(mConverterParams);\n      for (auto itCol = pRow.begin(); itCol != pRow.end(); ++itCol)\n      {\n        std::string str;\n        converter.ToStr(*itCol, str);\n        mData.at(rowIdx).at(std::distance(pRow.begin(), itCol) + (mLabelParams.mRowNameIdx + 1)) = str;\n      }\n    }\n\n    /**\n     * @brief   Set row by name.\n     * @param   pRowName              row label name.\n     * @param   pRow                  vector of row data.\n     */\n    template<typename T>\n    void SetRow(const std::string& pRowName, const std::vector<T>& pRow)\n    {\n      ssize_t rowIdx = GetRowIdx(pRowName);\n      if (rowIdx < 0)\n      {\n        throw std::out_of_range(\"row not found: \" + pRowName);\n      }\n      return SetRow<T>(rowIdx, pRow);\n    }\n\n    /**\n     * @brief   Remove row by index.\n     * @param   pRowIdx               zero-based row index.\n     */\n    void RemoveRow(const size_t pRowIdx)\n    {\n      const ssize_t rowIdx = pRowIdx + (mLabelParams.mColumnNameIdx + 1);\n      mData.erase(mData.begin() + rowIdx);\n    }\n\n    /**\n     * @brief   Remove row by name.\n     * @param   pRowName              row label name.\n     */\n    void RemoveRow(const std::string& pRowName)\n    {\n      ssize_t rowIdx = GetRowIdx(pRowName);\n      if (rowIdx < 0)\n      {\n        throw std::out_of_range(\"row not found: \" + pRowName);\n      }\n\n      RemoveRow(rowIdx);\n    }\n\n    /**\n     * @brief   Get number of data rows (excluding label rows).\n     * @returns row count.\n     */\n    size_t GetRowCount() const\n    {\n      const ssize_t count = static_cast<ssize_t>(mData.size()) - (mLabelParams.mColumnNameIdx + 1);\n      return (count >= 0) ? count : 0;\n    }\n\n    /**\n     * @brief   Get cell by index.\n     * @param   pColumnIdx            zero-based column index.\n     * @param   pRowIdx               zero-based row index.\n     * @returns cell data.\n     */\n    template<typename T>\n    T GetCell(const size_t pColumnIdx, const size_t pRowIdx) const\n    {\n      const ssize_t columnIdx = pColumnIdx + (mLabelParams.mRowNameIdx + 1);\n      const ssize_t rowIdx = pRowIdx + (mLabelParams.mColumnNameIdx + 1);\n\n      T val;\n      Converter<T> converter(mConverterParams);\n      converter.ToVal(mData.at(rowIdx).at(columnIdx), val);\n      return val;\n    }\n\n    /**\n     * @brief   Get cell by index.\n     * @param   pColumnIdx            zero-based column index.\n     * @param   pRowIdx               zero-based row index.\n     * @param   pToVal                conversion function.\n     * @returns cell data.\n     */\n    template<typename T>\n    T GetCell(const size_t pColumnIdx, const size_t pRowIdx, ConvFunc<T> pToVal) const\n    {\n      const ssize_t columnIdx = pColumnIdx + (mLabelParams.mRowNameIdx + 1);\n      const ssize_t rowIdx = pRowIdx + (mLabelParams.mColumnNameIdx + 1);\n\n      T val;\n      pToVal(mData.at(rowIdx).at(columnIdx), val);\n      return val;\n    }\n\n    /**\n     * @brief   Get cell by name.\n     * @param   pColumnName           column label name.\n     * @param   pRowName              row label name.\n     * @returns cell data.\n     */\n    template<typename T>\n    T GetCell(const std::string& pColumnName, const std::string& pRowName) const\n    {\n      const ssize_t columnIdx = GetColumnIdx(pColumnName);\n      if (columnIdx < 0)\n      {\n        throw std::out_of_range(\"column not found: \" + pColumnName);\n      }\n\n      const ssize_t rowIdx = GetRowIdx(pRowName);\n      if (rowIdx < 0)\n      {\n        throw std::out_of_range(\"row not found: \" + pRowName);\n      }\n\n      return GetCell<T>(columnIdx, rowIdx);\n    }\n\n    /**\n     * @brief   Get cell by name.\n     * @param   pColumnName           column label name.\n     * @param   pRowName              row label name.\n     * @param   pToVal                conversion function.\n     * @returns cell data.\n     */\n    template<typename T>\n    T GetCell(const std::string& pColumnName, const std::string& pRowName, ConvFunc<T> pToVal) const\n    {\n      const ssize_t columnIdx = GetColumnIdx(pColumnName);\n      if (columnIdx < 0)\n      {\n        throw std::out_of_range(\"column not found: \" + pColumnName);\n      }\n\n      const ssize_t rowIdx = GetRowIdx(pRowName);\n      if (rowIdx < 0)\n      {\n        throw std::out_of_range(\"row not found: \" + pRowName);\n      }\n\n      return GetCell<T>(columnIdx, rowIdx, pToVal);\n    }\n\n    /**\n     * @brief   Get cell by column name and row index.\n     * @param   pColumnName           column label name.\n     * @param   pRowIdx               zero-based row index.\n     * @returns cell data.\n     */\n    template<typename T>\n    T GetCell(const std::string& pColumnName, const size_t pRowIdx) const\n    {\n      const ssize_t columnIdx = GetColumnIdx(pColumnName);\n      if (columnIdx < 0)\n      {\n        throw std::out_of_range(\"column not found: \" + pColumnName);\n      }\n\n      return GetCell<T>(columnIdx, pRowIdx);\n    }\n\n    /**\n     * @brief   Get cell by column name and row index.\n     * @param   pColumnName           column label name.\n     * @param   pRowIdx               zero-based row index.\n     * @param   pToVal                conversion function.\n     * @returns cell data.\n     */\n    template<typename T>\n    T GetCell(const std::string& pColumnName, const size_t pRowIdx, ConvFunc<T> pToVal) const\n    {\n      const ssize_t columnIdx = GetColumnIdx(pColumnName);\n      if (columnIdx < 0)\n      {\n        throw std::out_of_range(\"column not found: \" + pColumnName);\n      }\n\n      return GetCell<T>(columnIdx, pRowIdx, pToVal);\n    }\n\n    /**\n     * @brief   Get cell by column index and row name.\n     * @param   pColumnIdx            zero-based column index.\n     * @param   pRowName              row label name.\n     * @returns cell data.\n     */\n    template<typename T>\n    T GetCell(const size_t pColumnIdx, const std::string& pRowName) const\n    {\n      const ssize_t rowIdx = GetRowIdx(pRowName);\n      if (rowIdx < 0)\n      {\n        throw std::out_of_range(\"row not found: \" + pRowName);\n      }\n\n      return GetCell<T>(pColumnIdx, rowIdx);\n    }\n\n    /**\n     * @brief   Get cell by column index and row name.\n     * @param   pColumnIdx            zero-based column index.\n     * @param   pRowName              row label name.\n     * @param   pToVal                conversion function.\n     * @returns cell data.\n     */\n    template<typename T>\n    T GetCell(const size_t pColumnIdx, const std::string& pRowName, ConvFunc<T> pToVal) const\n    {\n      const ssize_t rowIdx = GetRowIdx(pRowName);\n      if (rowIdx < 0)\n      {\n        throw std::out_of_range(\"row not found: \" + pRowName);\n      }\n\n      return GetCell<T>(pColumnIdx, rowIdx, pToVal);\n    }\n\n    /**\n     * @brief   Set cell by index.\n     * @param   pRowIdx               zero-based row index.\n     * @param   pColumnIdx            zero-based column index.\n     * @param   pCell                 cell data.\n     */\n    template<typename T>\n    void SetCell(const size_t pColumnIdx, const size_t pRowIdx, const T& pCell)\n    {\n      const size_t columnIdx = pColumnIdx + (mLabelParams.mRowNameIdx + 1);\n      const size_t rowIdx = pRowIdx + (mLabelParams.mColumnNameIdx + 1);\n\n      while ((rowIdx + 1) > GetDataRowCount())\n      {\n        std::vector<std::string> row;\n        row.resize(GetDataColumnCount());\n        mData.push_back(row);\n      }\n\n      if ((columnIdx + 1) > GetDataColumnCount())\n      {\n        for (auto itRow = mData.begin(); itRow != mData.end(); ++itRow)\n        {\n          itRow->resize(columnIdx + 1);\n        }\n      }\n\n      std::string str;\n      Converter<T> converter(mConverterParams);\n      converter.ToStr(pCell, str);\n      mData.at(rowIdx).at(columnIdx) = str;\n    }\n\n    /**\n     * @brief   Set cell by name.\n     * @param   pColumnName           column label name.\n     * @param   pRowName              row label name.\n     * @param   pCell                 cell data.\n     */\n    template<typename T>\n    void SetCell(const std::string& pColumnName, const std::string& pRowName, const T& pCell)\n    {\n      const ssize_t columnIdx = GetColumnIdx(pColumnName);\n      if (columnIdx < 0)\n      {\n        throw std::out_of_range(\"column not found: \" + pColumnName);\n      }\n\n      const ssize_t rowIdx = GetRowIdx(pRowName);\n      if (rowIdx < 0)\n      {\n        throw std::out_of_range(\"row not found: \" + pRowName);\n      }\n\n      SetCell<T>(columnIdx, rowIdx, pCell);\n    }\n\n    /**\n     * @brief   Get column name\n     * @param   pColumnIdx            zero-based column index.\n     * @returns column name.\n     */\n    std::string GetColumnName(const ssize_t pColumnIdx)\n    {\n      const ssize_t columnIdx = pColumnIdx + (mLabelParams.mRowNameIdx + 1);\n      if (mLabelParams.mColumnNameIdx < 0)\n      {\n        throw std::out_of_range(\"column name row index < 0: \" + std::to_string(mLabelParams.mColumnNameIdx));\n      }\n\n      return mData.at(mLabelParams.mColumnNameIdx).at(columnIdx);\n    }\n\n    /**\n     * @brief   Set column name\n     * @param   pColumnIdx            zero-based column index.\n     * @param   pColumnName           column name.\n     */\n    void SetColumnName(size_t pColumnIdx, const std::string& pColumnName)\n    {\n      const ssize_t columnIdx = pColumnIdx + (mLabelParams.mRowNameIdx + 1);\n      mColumnNames[pColumnName] = columnIdx;\n      if (mLabelParams.mColumnNameIdx < 0)\n      {\n        throw std::out_of_range(\"column name row index < 0: \" + std::to_string(mLabelParams.mColumnNameIdx));\n      }\n\n      mData.at(mLabelParams.mColumnNameIdx).at(columnIdx) = pColumnName;\n    }\n\n    /**\n     * @brief   Get column names\n     * @returns vector of column names.\n     */\n    std::vector<std::string> GetColumnNames()\n    {\n      if (mLabelParams.mColumnNameIdx >= 0)\n      {\n        return std::vector<std::string>(mData.at(mLabelParams.mColumnNameIdx).begin() +\n                                        (mLabelParams.mRowNameIdx + 1),\n                                        mData.at(mLabelParams.mColumnNameIdx).end());\n      }\n\n      return std::vector<std::string>();\n    }\n\n    /**\n     * @brief   Get row name\n     * @param   pRowIdx               zero-based column index.\n     * @returns row name.\n     */\n    std::string GetRowName(const ssize_t pRowIdx)\n    {\n      const ssize_t rowIdx = pRowIdx + (mLabelParams.mColumnNameIdx + 1);\n      if (mLabelParams.mRowNameIdx < 0)\n      {\n        throw std::out_of_range(\"row name column index < 0: \" + std::to_string(mLabelParams.mRowNameIdx));\n      }\n\n      return mData.at(rowIdx).at(mLabelParams.mRowNameIdx);\n    }\n\n    /**\n     * @brief   Set row name\n     * @param   pRowIdx               zero-based row index.\n     * @param   pRowName              row name.\n     */\n    void SetRowName(size_t pRowIdx, const std::string& pRowName)\n    {\n      const ssize_t rowIdx = pRowIdx + (mLabelParams.mColumnNameIdx + 1);\n      mRowNames[pRowName] = rowIdx;\n      if (mLabelParams.mRowNameIdx < 0)\n      {\n        throw std::out_of_range(\"row name column index < 0: \" + std::to_string(mLabelParams.mRowNameIdx));\n      }\n\n      mData.at(rowIdx).at(mLabelParams.mRowNameIdx) = pRowName;\n    }\n\n    /**\n     * @brief   Get row names\n     * @returns vector of row names.\n     */\n    std::vector<std::string> GetRowNames()\n    {\n      std::vector<std::string> rownames;\n      if (mLabelParams.mRowNameIdx >= 0)\n      {\n        for (auto itRow = mData.begin(); itRow != mData.end(); ++itRow)\n        {\n          if (std::distance(mData.begin(), itRow) > mLabelParams.mColumnNameIdx)\n          {\n            rownames.push_back(itRow->at(mLabelParams.mRowNameIdx));\n          }\n        }\n      }\n      return rownames;\n    }\n\n  private:\n    void ReadCsv()\n    {\n      std::ifstream stream;\n      stream.exceptions(std::ifstream::failbit | std::ifstream::badbit);\n      stream.open(mPath, std::ios::binary);\n\n#ifdef HAS_CODECVT\n      stream.seekg(0, std::ios::end);\n      std::streamsize length = stream.tellg();\n      stream.seekg(0, std::ios::beg);\n\n      std::vector<char> bom(2, '\\0');\n      if (length >= 2)\n      {\n        stream.read(bom.data(), 2);\n      }\n\n      static const std::vector<char> bomU16le = { '\\xff', '\\xfe' };\n      static const std::vector<char> bomU16be = { '\\xfe', '\\xff' };\n      if ((bom == bomU16le) || (bom == bomU16be))\n      {\n        mIsUtf16 = true;\n        mIsLE = (bom == bomU16le);\n\n        std::wifstream wstream;\n        wstream.exceptions(std::wifstream::failbit | std::wifstream::badbit);\n        wstream.open(mPath, std::ios::binary);\n        if (mIsLE)\n        {\n          wstream.imbue(std::locale(wstream.getloc(),\n                                    new std::codecvt_utf16<wchar_t, 0x10ffff,\n                                                           static_cast<std::codecvt_mode>(std::consume_header |\n                                                                                          std::little_endian)>));\n        }\n        else\n        {\n          wstream.imbue(std::locale(wstream.getloc(),\n                                    new std::codecvt_utf16<wchar_t, 0x10ffff,\n                                                           std::consume_header>));\n        }\n        std::wstringstream wss;\n        wss << wstream.rdbuf();\n        std::string utf8 = ToString(wss.str());\n        std::stringstream ss(utf8);\n        ReadCsv(ss);\n      }\n      else\n#endif\n      {\n        stream.seekg(0, std::ios::beg);\n        ReadCsv(stream);\n      }\n    }\n\n    void ReadCsv(std::istream& pStream)\n    {\n      pStream.seekg(0, std::ios::end);\n      std::streamsize fileLength = pStream.tellg();\n      pStream.seekg(0, std::ios::beg);\n      const std::streamsize bufLength = 64 * 1024;\n      std::vector<char> buffer(bufLength);\n      std::vector<std::string> row;\n      std::string cell;\n      bool quoted = false;\n      int cr = 0;\n      int lf = 0;\n\n      // check for UTF-8 Byte order mark and skip it when found\n      if (std::min(fileLength, bufLength) >= 3)\n      {\n        pStream.read(buffer.data(), 3);\n        if (!std::equal(buffer.begin(), buffer.begin() + 3, \"\\xEF\\xBB\\xBF\"))\n        {\n          // file does not start with a UTF-8 Byte order mark\n          pStream.seekg(0, std::ios::beg);\n        }\n        else\n        {\n          // file did start with a UTF-8 Byte order mark\n          fileLength -= 3;\n        }\n      }\n\n      while (fileLength > 0)\n      {\n        std::streamsize readLength = std::min(fileLength, bufLength);\n        pStream.read(buffer.data(), readLength);\n        for (int i = 0; i < readLength; ++i)\n        {\n          if (buffer[i] == '\"')\n          {\n            if (cell.empty() || cell[0] == '\"')\n            {\n              quoted = !quoted;\n            }\n            cell += buffer[i];\n          }\n          else if (buffer[i] == mSeparatorParams.mSeparator)\n          {\n            if (!quoted)\n            {\n              row.push_back(mSeparatorParams.mTrim ? Trim(cell) : cell);\n              cell.clear();\n            }\n            else\n            {\n              cell += buffer[i];\n            }\n          }\n          else if (buffer[i] == '\\r')\n          {\n            if (mSeparatorParams.mQuotedLinebreaks && quoted)\n            {\n              cell += buffer[i];\n            }\n            else\n            {\n              ++cr;\n            }\n          }\n          else if (buffer[i] == '\\n')\n          {\n            if (mSeparatorParams.mQuotedLinebreaks && quoted)\n            {\n              cell += buffer[i];\n            }\n            else\n            {\n              ++lf;\n              row.push_back(mSeparatorParams.mTrim ? Trim(cell) : cell);\n              cell.clear();\n              mData.push_back(row);\n              row.clear();\n              quoted = false;\n            }\n          }\n          else\n          {\n            cell += buffer[i];\n          }\n        }\n        fileLength -= readLength;\n      }\n\n      // Handle last line without linebreak\n      if (!cell.empty() || !row.empty())\n      {\n        row.push_back(mSeparatorParams.mTrim ? Trim(cell) : cell);\n        cell.clear();\n        mData.push_back(row);\n        row.clear();\n      }\n\n      // Assume CR/LF if at least half the linebreaks have CR\n      mSeparatorParams.mHasCR = (cr > (lf / 2));\n\n      // Set up column labels\n      if ((mLabelParams.mColumnNameIdx >= 0) &&\n          (static_cast<ssize_t>(mData.size()) > mLabelParams.mColumnNameIdx))\n      {\n        int i = 0;\n        for (auto& columnName : mData[mLabelParams.mColumnNameIdx])\n        {\n          mColumnNames[columnName] = i++;\n        }\n      }\n\n      // Set up row labels\n      if ((mLabelParams.mRowNameIdx >= 0) &&\n          (static_cast<ssize_t>(mData.size()) >\n           (mLabelParams.mColumnNameIdx + 1)))\n      {\n        int i = 0;\n        for (auto& dataRow : mData)\n        {\n          if (static_cast<ssize_t>(dataRow.size()) > mLabelParams.mRowNameIdx)\n          {\n            mRowNames[dataRow[mLabelParams.mRowNameIdx]] = i++;\n          }\n        }\n      }\n    }\n\n    void WriteCsv() const\n    {\n#ifdef HAS_CODECVT\n      if (mIsUtf16)\n      {\n        std::stringstream ss;\n        WriteCsv(ss);\n        std::string utf8 = ss.str();\n        std::wstring wstr = ToWString(utf8);\n\n        std::wofstream wstream;\n        wstream.exceptions(std::wofstream::failbit | std::wofstream::badbit);\n        wstream.open(mPath, std::ios::binary | std::ios::trunc);\n\n        if (mIsLE)\n        {\n          wstream.imbue(std::locale(wstream.getloc(),\n                                    new std::codecvt_utf16<wchar_t, 0x10ffff,\n                                                           static_cast<std::codecvt_mode>(std::little_endian)>));\n        }\n        else\n        {\n          wstream.imbue(std::locale(wstream.getloc(),\n                                    new std::codecvt_utf16<wchar_t, 0x10ffff>));\n        }\n\n        wstream << (wchar_t) 0xfeff;\n        wstream << wstr;\n      }\n      else\n#endif\n      {\n        std::ofstream stream;\n        stream.exceptions(std::ofstream::failbit | std::ofstream::badbit);\n        stream.open(mPath, std::ios::binary | std::ios::trunc);\n        WriteCsv(stream);\n      }\n    }\n\n    void WriteCsv(std::ostream& pStream) const\n    {\n      for (auto itr = mData.begin(); itr != mData.end(); ++itr)\n      {\n        for (auto itc = itr->begin(); itc != itr->end(); ++itc)\n        {\n          if ((std::string::npos == itc->find(mSeparatorParams.mSeparator)) ||\n              ((itc->length() >= 2) && ((*itc)[0] == '\\\"') && ((*itc)[itc->length() - 1] == '\\\"')))\n          {\n            pStream << *itc;\n          }\n          else\n          {\n            pStream << '\"' << *itc << '\"';\n          }\n\n          if (std::distance(itc, itr->end()) > 1)\n          {\n            pStream << mSeparatorParams.mSeparator;\n          }\n        }\n        pStream << (mSeparatorParams.mHasCR ? \"\\r\\n\" : \"\\n\");\n      }\n    }\n\n    ssize_t GetColumnIdx(const std::string& pColumnName) const\n    {\n      if (mLabelParams.mColumnNameIdx >= 0)\n      {\n        if (mColumnNames.find(pColumnName) != mColumnNames.end())\n        {\n          return mColumnNames.at(pColumnName) - (mLabelParams.mRowNameIdx + 1);\n        }\n      }\n      return -1;\n    }\n\n    ssize_t GetRowIdx(const std::string& pRowName) const\n    {\n      if (mLabelParams.mRowNameIdx >= 0)\n      {\n        if (mRowNames.find(pRowName) != mRowNames.end())\n        {\n          return mRowNames.at(pRowName) - (mLabelParams.mColumnNameIdx + 1);\n        }\n      }\n      return -1;\n    }\n\n    size_t GetDataRowCount() const\n    {\n      return mData.size();\n    }\n\n    size_t GetDataColumnCount() const\n    {\n      return (mData.size() > 0) ? mData.at(0).size() : 0;\n    }\n\n#ifdef HAS_CODECVT\n#if defined(_MSC_VER)\n#pragma warning (disable: 4996)\n#endif\n    static std::string ToString(const std::wstring& pWStr)\n    {\n      size_t len = std::wcstombs(nullptr, pWStr.c_str(), 0) + 1;\n      char* cstr = new char[len];\n      std::wcstombs(cstr, pWStr.c_str(), len);\n      std::string str(cstr);\n      delete[] cstr;\n      return str;\n    }\n\n    static std::wstring ToWString(const std::string& pStr)\n    {\n      size_t len = 1 + mbstowcs(nullptr, pStr.c_str(), 0);\n      wchar_t* wcstr = new wchar_t[len];\n      std::mbstowcs(wcstr, pStr.c_str(), len);\n      std::wstring wstr(wcstr);\n      delete[] wcstr;\n      return wstr;\n    }\n#if defined(_MSC_VER)\n#pragma warning (default: 4996)\n#endif\n#endif\n\n    static std::string Trim(const std::string& pStr)\n    {\n      std::string str = pStr;\n\n      // ltrim\n      str.erase(str.begin(), std::find_if(str.begin(), str.end(), [](int ch) { return !isspace(ch); }));\n\n      // rtrim\n      str.erase(std::find_if(str.rbegin(), str.rend(), [](int ch) { return !isspace(ch); }).base(), str.end());\n\n      return str;\n    }\n\n  private:\n    std::string mPath;\n    LabelParams mLabelParams;\n    SeparatorParams mSeparatorParams;\n    ConverterParams mConverterParams;\n    std::vector<std::vector<std::string>> mData;\n    std::map<std::string, size_t> mColumnNames;\n    std::map<std::string, size_t> mRowNames;\n#ifdef HAS_CODECVT\n    bool mIsUtf16 = false;\n    bool mIsLE = false;\n#endif\n  };\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/msft.csv",
    "content": "Date,Open,High,Low,Close,Volume,Adj Close\n2017-02-24,64.529999,64.800003,64.139999,64.620003,21705200,64.620003\n2017-02-23,64.419998,64.730003,64.190002,64.620003,20235200,64.620003\n2017-02-22,64.330002,64.389999,64.050003,64.360001,19259700,64.360001\n2017-02-21,64.610001,64.949997,64.449997,64.489998,19384900,64.489998\n2017-02-17,64.470001,64.690002,64.300003,64.620003,21234600,64.620003\n2017-02-16,64.739998,65.239998,64.440002,64.519997,20524700,64.519997\n2017-02-15,64.50,64.57,64.160004,64.529999,16917000,64.529999\n2017-02-14,64.410004,64.720001,64.019997,64.57,23065900,64.57\n2017-02-13,64.239998,64.860001,64.129997,64.720001,22920100,64.33\n2017-02-10,64.25,64.300003,63.98,64.00,18170700,63.614338\n2017-02-09,63.52,64.440002,63.32,64.059998,22644400,63.673974\n2017-02-08,63.57,63.810001,63.220001,63.34,18096400,62.958315\n2017-02-07,63.740002,63.779999,63.23,63.43,20277200,63.047773\n2017-02-06,63.50,63.650002,63.139999,63.639999,19796400,63.256507\n2017-02-03,63.50,63.700001,63.07,63.68,30301800,63.296267\n2017-02-02,63.25,63.41,62.75,63.169998,45827000,62.789338\n2017-02-01,64.360001,64.620003,63.470001,63.580002,39671500,63.196871\n2017-01-31,64.860001,65.150002,64.260002,64.650002,25270500,64.260423\n2017-01-30,65.690002,65.790001,64.800003,65.129997,31651400,64.737526\n2017-01-27,65.389999,65.910004,64.889999,65.779999,44818000,65.38361\n2017-01-26,64.120003,64.540001,63.549999,64.269997,43554600,63.882708\n2017-01-25,63.950001,64.099998,63.450001,63.68,23672700,63.296267\n2017-01-24,63.200001,63.740002,62.939999,63.52,24672900,63.137231\n2017-01-23,62.700001,63.119999,62.57,62.959999,23097600,62.580604\n2017-01-20,62.669998,62.82,62.369999,62.740002,30213500,62.361932\n2017-01-19,62.240002,62.98,62.200001,62.299999,18451700,61.924581\n2017-01-18,62.669998,62.700001,62.119999,62.50,19670100,62.123377\n2017-01-17,62.68,62.700001,62.029999,62.529999,20664000,62.153195\n2017-01-13,62.619999,62.869999,62.349998,62.700001,19422300,62.322172\n2017-01-12,63.060001,63.400002,61.950001,62.610001,20968200,62.232715\n2017-01-11,62.610001,63.23,62.43,63.189999,21517300,62.809218\n2017-01-10,62.73,63.07,62.279999,62.619999,18593000,62.242653\n2017-01-09,62.759998,63.080002,62.540001,62.639999,20256600,62.262533\n2017-01-06,62.299999,63.150002,62.040001,62.84,19922900,62.461328\n2017-01-05,62.189999,62.66,62.029999,62.299999,24876000,61.924581\n2017-01-04,62.48,62.75,62.119999,62.299999,21340000,61.924581\n2017-01-03,62.790001,62.84,62.130001,62.580002,20694100,62.202897\n2016-12-30,62.959999,62.990002,62.029999,62.139999,25579900,61.765546\n2016-12-29,62.860001,63.200001,62.73,62.900002,10250600,62.520968\n2016-12-28,63.400002,63.400002,62.830002,62.990002,14653300,62.610426\n2016-12-27,63.209999,64.07,63.209999,63.279999,11763200,62.898675\n2016-12-23,63.450001,63.540001,62.799999,63.240002,12403800,62.858919\n2016-12-22,63.84,64.099998,63.41,63.549999,22176600,63.167049\n2016-12-21,63.43,63.700001,63.119999,63.540001,17096300,63.157111\n2016-12-20,63.689999,63.799999,63.029999,63.540001,26028400,63.157111\n2016-12-19,62.560001,63.77,62.419998,63.619999,34338200,63.236627\n2016-12-16,62.950001,62.950001,62.119999,62.299999,42453100,61.924581\n2016-12-15,62.700001,63.150002,62.299999,62.580002,27669900,62.202897\n2016-12-14,63.00,63.450001,62.529999,62.68,30352700,62.302293\n2016-12-13,62.50,63.419998,62.240002,62.98,35718900,62.600484\n2016-12-12,61.82,62.299999,61.720001,62.169998,20198100,61.795364\n2016-12-09,61.18,61.990002,61.130001,61.970001,27349400,61.596572\n2016-12-08,61.299999,61.580002,60.84,61.009998,21220800,60.642354\n2016-12-07,60.009998,61.380001,59.799999,61.369999,30809000,61.000185\n2016-12-06,60.43,60.459999,59.799999,59.950001,19907000,59.588744\n2016-12-05,59.700001,60.59,59.560001,60.220001,23552700,59.857117\n2016-12-02,59.080002,59.470001,58.799999,59.25,25515700,58.892961\n2016-12-01,60.110001,60.150002,58.939999,59.200001,34542100,58.843263\n2016-11-30,60.860001,61.18,60.220001,60.259998,34655400,59.896873\n2016-11-29,60.650002,61.41,60.52,61.09,22366700,60.721874\n2016-11-28,60.34,61.02,60.209999,60.610001,20732600,60.244767\n2016-11-25,60.299999,60.529999,60.130001,60.529999,8409600,60.165247\n2016-11-23,61.009998,61.099998,60.25,60.400002,21848900,60.036033\n2016-11-22,60.98,61.259998,60.810001,61.119999,23206700,60.751692\n2016-11-21,60.50,60.970001,60.419998,60.860001,19652600,60.49326\n2016-11-18,60.779999,61.139999,60.299999,60.349998,27686300,59.986331\n2016-11-17,60.41,60.950001,59.970001,60.639999,32132700,60.274585\n2016-11-16,58.939999,59.66,58.810001,59.650002,27332500,59.290552\n2016-11-15,58.330002,59.490002,58.32,58.869999,35904100,58.51525\n2016-11-14,59.02,59.080002,57.279999,58.119999,41328400,57.38212\n2016-11-11,58.23,59.119999,58.009998,59.02,38767800,58.270695\n2016-11-10,60.48,60.490002,57.630001,58.700001,57822400,57.954758\n2016-11-09,60.00,60.59,59.200001,60.169998,49632500,59.406093\n2016-11-08,60.549999,60.779999,60.150002,60.470001,22935400,59.702287\n2016-11-07,59.779999,60.52,59.779999,60.419998,31664800,59.652919\n2016-11-04,58.650002,59.279999,58.52,58.709999,28697000,57.964629\n2016-11-03,59.529999,59.639999,59.110001,59.209999,21600400,58.458281\n2016-11-02,59.82,59.93,59.299999,59.43,22147000,58.67549\n2016-11-01,59.970001,60.02,59.25,59.799999,24533000,59.040791\n2016-10-31,60.16,60.419998,59.919998,59.919998,26434700,59.159266\n2016-10-28,60.009998,60.52,59.580002,59.869999,33574700,59.109902\n2016-10-27,60.610001,60.830002,60.09,60.099998,28479900,59.336982\n2016-10-26,60.810001,61.200001,60.470001,60.630001,29911600,59.860255\n2016-10-25,60.849998,61.369999,60.799999,60.990002,35137200,60.215685\n2016-10-24,59.939999,61.00,59.93,61.00,54067000,60.225557\n2016-10-21,60.279999,60.450001,59.490002,59.66,80032200,58.902569\n2016-10-20,57.50,57.52,56.66,57.25,49455600,56.523166\n2016-10-19,57.470001,57.84,57.400002,57.529999,22878400,56.79961\n2016-10-18,57.529999,57.950001,57.41,57.66,19149500,56.927961\n2016-10-17,57.360001,57.459999,56.869999,57.220001,23830000,56.493548\n2016-10-14,57.119999,57.740002,57.119999,57.419998,27402500,56.691006\n2016-10-13,56.700001,57.299999,56.32,56.919998,25313700,56.197354\n2016-10-12,57.110001,57.27,56.400002,57.110001,22177500,56.384944\n2016-10-11,57.889999,58.02,56.889999,57.189999,26497400,56.463926\n2016-10-10,57.91,58.389999,57.869999,58.040001,18196500,57.303137\n2016-10-07,57.849998,57.98,57.419998,57.799999,20089000,57.066183\n2016-10-06,57.740002,57.860001,57.279999,57.740002,16212600,57.006947\n2016-10-05,57.290001,57.959999,57.259998,57.639999,16726400,56.908214\n2016-10-04,57.27,57.599998,56.970001,57.240002,20085900,56.513295\n2016-10-03,57.41,57.549999,57.060001,57.419998,19189500,56.691006\n2016-09-30,57.57,57.77,57.34,57.599998,29910800,56.868721\n2016-09-29,57.810001,58.169998,57.209999,57.400002,25463500,56.671263\n2016-09-28,57.880001,58.060001,57.669998,58.029999,20536400,57.293262\n2016-09-27,56.93,58.060001,56.68,57.950001,28065100,57.21428\n2016-09-26,57.080002,57.139999,56.830002,56.900002,21688700,56.177611\n2016-09-23,57.869999,57.91,57.380001,57.43,19955300,56.700881\n2016-09-22,57.919998,58.00,57.630001,57.82,19822200,57.085929\n2016-09-21,57.509998,57.849998,57.080002,57.759998,33707300,57.02669\n2016-09-20,57.349998,57.349998,56.75,56.810001,17384000,56.088754\n2016-09-19,57.27,57.75,56.849998,56.93,20937100,56.207229\n2016-09-16,57.630001,57.630001,56.75,57.25,44607000,56.523166\n2016-09-15,56.150002,57.349998,55.98,57.189999,26847000,56.463926\n2016-09-14,56.389999,56.630001,56.029999,56.259998,24062500,55.545733\n2016-09-13,56.50,56.650002,56.049999,56.529999,30130200,55.812306\n2016-09-12,56.00,57.209999,55.610001,57.049999,29303000,56.325704\n2016-09-09,56.790001,57.52,56.209999,56.209999,35113900,55.496369\n2016-09-08,57.630001,57.790001,57.18,57.43,20146100,56.700881\n2016-09-07,57.470001,57.84,57.41,57.66,17493400,56.927961\n2016-09-06,57.779999,57.799999,57.209999,57.610001,16278400,56.878596\n2016-09-02,57.669998,58.189999,57.419998,57.669998,18900500,56.937832\n2016-09-01,57.009998,57.82,57.009998,57.59,26075400,56.85885\n2016-08-31,57.650002,57.799999,57.299999,57.459999,20860300,56.730499\n2016-08-30,57.98,58.189999,57.610001,57.889999,16930200,57.15504\n2016-08-29,58.18,58.599998,58.099998,58.099998,16417200,57.362373\n2016-08-26,58.279999,58.700001,57.689999,58.029999,20971200,57.293262\n2016-08-25,57.880001,58.290001,57.779999,58.169998,18552600,57.431484\n2016-08-24,57.799999,58.040001,57.720001,57.950001,18151500,57.21428\n2016-08-23,57.900002,58.18,57.849998,57.889999,18732400,57.15504\n2016-08-22,57.599998,57.75,57.259998,57.669998,15221900,56.937832\n2016-08-19,57.43,57.73,57.200001,57.619999,17271000,56.888468\n2016-08-18,57.419998,57.700001,57.27,57.599998,14214300,56.868721\n2016-08-17,57.540001,57.68,57.23,57.560001,18856400,56.829232\n2016-08-16,57.610001,57.619999,57.27,57.439999,20523500,56.710753\n2016-08-15,58.009998,58.50,57.959999,58.119999,19283900,57.026691\n2016-08-12,58.029999,58.189999,57.619999,57.939999,21655200,56.850076\n2016-08-11,58.029999,58.450001,58.029999,58.299999,18162300,57.203305\n2016-08-10,58.16,58.32,57.82,58.02,15756900,56.928573\n2016-08-09,58.169998,58.50,58.02,58.200001,16920700,57.105187\n2016-08-08,58.060001,58.09,57.779999,58.060001,19473500,56.967822\n2016-08-05,57.650002,58.209999,57.450001,57.959999,29335200,56.8697\n2016-08-04,56.799999,57.52,56.669998,57.389999,26587700,56.310423\n2016-08-03,56.68,57.110001,56.490002,56.970001,22075600,55.898326\n2016-08-02,56.849998,56.900002,56.310001,56.580002,35122000,55.515663\n2016-08-01,56.599998,56.75,56.139999,56.580002,26003400,55.515663\n2016-07-29,56.259998,56.759998,56.049999,56.68,30558700,55.61378\n2016-07-28,56.00,56.369999,55.720001,56.209999,37550400,55.15262\n2016-07-27,56.610001,56.799999,56.110001,56.189999,32327500,55.132996\n2016-07-26,56.52,57.290001,56.509998,56.759998,28079000,55.692273\n2016-07-25,56.470001,56.740002,56.259998,56.73,25610600,55.662839\n2016-07-22,56.080002,56.630001,55.779999,56.57,32157200,55.505849\n2016-07-21,55.98,56.23,55.759998,55.799999,32776700,54.750333\n2016-07-20,56.150002,56.84,55.529999,55.91,89893300,54.858264\n2016-07-19,53.709999,53.900002,52.93,53.09,53336500,52.091312\n2016-07-18,53.700001,54.34,53.549999,53.959999,31433900,52.944945\n2016-07-15,53.950001,54.00,53.209999,53.700001,32024400,52.689838\n2016-07-14,53.84,53.990002,53.580002,53.740002,24545500,52.729086\n2016-07-13,53.560001,53.860001,53.18,53.509998,25356800,52.50341\n2016-07-12,52.939999,53.400002,52.790001,53.209999,27317600,52.209054\n2016-07-11,52.50,52.830002,52.470001,52.59,22269200,51.600718\n2016-07-08,51.73,52.360001,51.549999,52.299999,28391000,51.316172\n2016-07-07,51.419998,51.610001,51.07,51.380001,19585200,50.41348\n2016-07-06,50.779999,51.540001,50.389999,51.380001,28167500,50.41348\n2016-07-05,50.830002,51.279999,50.740002,51.169998,24806400,50.207428\n2016-07-01,51.130001,51.720001,51.07,51.16,21400400,50.197618\n2016-06-30,50.720001,51.299999,50.50,51.169998,28527800,50.207428\n2016-06-29,49.91,50.720001,49.799999,50.540001,31304000,49.589282\n2016-06-28,48.919998,49.470001,48.669998,49.439999,38140700,48.509972\n2016-06-27,49.099998,49.150002,48.040001,48.43,50216300,47.518973\n2016-06-24,49.810001,50.939999,49.52,49.830002,133503000,48.892638\n2016-06-23,51.279999,52.060001,51.150002,51.91,29028800,50.933509\n2016-06-22,51.080002,51.459999,50.950001,50.990002,28816800,50.030817\n2016-06-21,50.200001,51.43,50.16,51.189999,34097800,50.227052\n2016-06-20,50.639999,50.830002,50.029999,50.07,35607900,49.128122\n2016-06-17,50.41,50.43,49.82,50.130001,45710500,49.186994\n2016-06-16,49.52,50.470001,49.509998,50.389999,31188600,49.442102\n2016-06-15,49.779999,50.119999,49.689999,49.689999,33757600,48.755269\n2016-06-14,49.900002,50.099998,49.57,49.830002,42577100,48.892638\n2016-06-13,49.580002,50.720001,49.060001,50.139999,83217800,49.196805\n2016-06-10,51.049999,52.049999,51.040001,51.48,25833200,50.511598\n2016-06-09,52.00,52.00,51.490002,51.619999,20305700,50.648963\n2016-06-08,52.02,52.439999,51.869999,52.040001,21149400,51.061065\n2016-06-07,52.240002,52.73,52.099998,52.099998,20866800,51.119934\n2016-06-06,51.990002,52.349998,51.889999,52.130001,18243300,51.149372\n2016-06-03,52.380001,52.419998,51.599998,51.790001,23081300,50.815768\n2016-06-02,52.639999,52.740002,51.84,52.48,22840800,51.492786\n2016-06-01,52.439999,52.950001,52.439999,52.849998,25324800,51.855825\n2016-05-31,52.259998,53.00,52.080002,53.00,37653100,52.003005\n2016-05-27,51.919998,52.32,51.77,52.32,17653700,51.335796\n2016-05-26,51.93,51.98,51.360001,51.889999,24335200,50.913885\n2016-05-25,51.919998,52.490002,51.790001,52.119999,24040200,51.139558\n2016-05-24,50.700001,51.709999,50.400002,51.59,34757900,50.619529\n2016-05-23,50.599998,50.68,49.98,50.029999,26118700,49.088873\n2016-05-20,50.48,51.220001,50.400002,50.619999,23905800,49.667775\n2016-05-19,50.470001,50.619999,49.82,50.32,23842400,49.373419\n2016-05-18,50.48,51.139999,50.299999,50.810001,24907500,49.854203\n2016-05-17,51.720001,51.73,50.360001,50.509998,27803500,49.559843\n2016-05-16,50.799999,51.959999,50.75,51.830002,20032000,50.501787\n2016-05-13,51.439999,51.900002,51.040001,51.080002,22592300,49.771007\n2016-05-12,51.200001,51.810001,50.919998,51.509998,24102800,50.189984\n2016-05-11,51.130001,51.779999,51.00,51.049999,24039100,49.741774\n2016-05-10,50.330002,51.099998,50.189999,51.02,22891000,49.712543\n2016-05-09,50.490002,50.59,50.00,50.07,17951600,48.786888\n2016-05-06,49.919998,50.389999,49.66,50.389999,24715600,49.098687\n2016-05-05,49.869999,50.299999,49.73,49.939999,25390700,48.660218\n2016-05-04,49.84,50.060001,49.459999,49.869999,24257600,48.592012\n2016-05-03,50.34,50.41,49.599998,49.779999,26460200,48.504319\n2016-05-02,50.00,50.75,49.779999,50.610001,33114500,49.31305\n2016-04-29,49.349998,50.25,49.349998,49.869999,48411700,48.592012\n2016-04-28,50.619999,50.77,49.560001,49.900002,43134800,48.621246\n2016-04-27,51.48,51.50,50.549999,50.939999,43369300,49.634592\n2016-04-26,52.259998,52.349998,51.09,51.439999,33532600,50.121779\n2016-04-25,51.779999,52.130001,51.630001,52.110001,33226900,50.774611\n2016-04-22,51.91,52.43,50.77,51.779999,126834100,50.453066\n2016-04-21,55.799999,56.23,55.419998,55.779999,38909100,54.35056\n2016-04-20,56.290001,56.50,55.490002,55.59,36195700,54.165431\n2016-04-19,56.630001,56.77,55.68,56.389999,29596800,54.944929\n2016-04-18,55.490002,56.59,55.209999,56.459999,23150300,55.013135\n2016-04-15,55.299999,55.919998,55.110001,55.650002,28793800,54.223894\n2016-04-14,55.220001,55.580002,55.07,55.360001,20877100,53.941325\n2016-04-13,55.119999,55.439999,54.889999,55.349998,20818000,53.931579\n2016-04-12,54.369999,54.779999,53.759998,54.650002,24944300,53.249521\n2016-04-11,54.490002,55.150002,54.299999,54.310001,21414200,52.918234\n2016-04-08,54.669998,55.279999,54.32,54.419998,22167200,53.025412\n2016-04-07,54.869999,54.91,54.23,54.459999,19225100,53.064387\n2016-04-06,54.360001,55.200001,54.209999,55.119999,21188700,53.707474\n2016-04-05,55.189999,55.299999,54.459999,54.560001,19272300,53.161827\n2016-04-04,55.43,55.66,55.00,55.43,18928800,54.009531\n2016-04-01,55.049999,55.610001,54.57,55.57,24399200,54.145943\n2016-03-31,54.950001,55.59,54.860001,55.23,26360500,53.814656\n2016-03-30,54.93,55.639999,54.900002,55.049999,23008300,53.639268\n2016-03-29,53.66,54.860001,53.450001,54.709999,23924300,53.307981\n2016-03-28,54.209999,54.290001,53.330002,53.540001,17025100,52.167966\n2016-03-24,53.84,54.330002,53.73,54.209999,19950000,52.820794\n2016-03-23,54.110001,54.240002,53.740002,53.970001,20129000,52.586946\n2016-03-22,53.610001,54.25,53.459999,54.07,23124100,52.684382\n2016-03-21,53.25,53.93,52.93,53.860001,23925700,52.479765\n2016-03-18,54.919998,54.970001,53.450001,53.490002,67625500,52.119248\n2016-03-17,54.209999,55.00,54.00,54.66,28223900,53.259263\n2016-03-16,53.450001,54.599998,53.400002,54.349998,31691700,52.957206\n2016-03-15,52.75,53.59,52.740002,53.59,21104800,52.216683\n2016-03-14,52.709999,53.59,52.630001,53.169998,24083600,51.807445\n2016-03-11,53.00,53.07,52.380001,53.07,32275700,51.710009\n2016-03-10,52.93,52.939999,51.16,52.049999,38387800,50.716147\n2016-03-09,51.889999,52.849998,51.860001,52.84,28251600,51.485903\n2016-03-08,50.799999,52.130001,50.599998,51.650002,33835100,50.3264\n2016-03-07,51.560001,51.799999,50.580002,51.029999,38407800,49.722286\n2016-03-04,52.400002,52.450001,51.709999,52.029999,33034200,50.696659\n2016-03-03,52.970001,52.970001,51.779999,52.349998,24427800,51.008458\n2016-03-02,52.41,52.959999,52.16,52.950001,29289900,51.593085\n2016-03-01,50.970001,52.59,50.919998,52.580002,33024500,51.232568\n2016-02-29,51.349998,51.650002,50.66,50.880001,31654000,49.576132\n2016-02-26,52.599998,52.68,51.099998,51.299999,35975900,49.985367\n2016-02-25,51.73,52.099998,50.610001,52.099998,26939500,50.764865\n2016-02-24,50.689999,51.50,50.200001,51.360001,33014500,50.043831\n2016-02-23,52.34,52.369999,50.98,51.18,28895300,49.868443\n2016-02-22,52.279999,53.00,52.279999,52.650002,25008300,51.300774\n2016-02-19,51.970001,52.279999,51.529999,51.82,33559100,50.492042\n2016-02-18,52.330002,52.950001,52.099998,52.189999,27176000,50.852559\n2016-02-17,51.490002,52.77,51.450001,52.419998,40789000,51.076664\n2016-02-16,50.900002,51.09,50.130001,51.09,37291200,49.780749\n2016-02-12,50.25,50.68,49.75,50.50,34243300,48.855094\n2016-02-11,48.68,50.110001,48.509998,49.689999,48878600,48.071477\n2016-02-10,49.889999,50.389999,49.52,49.709999,38237000,48.090826\n2016-02-09,49.02,50.240002,48.669998,49.279999,46740500,47.674832\n2016-02-08,49.549999,49.57,48.189999,49.41,59290500,47.800598\n2016-02-05,51.939999,52.00,49.560001,50.16,62009000,48.526169\n2016-02-04,52.099998,52.810001,51.369999,52.00,46987100,50.306236\n2016-02-03,53.25,53.389999,51.259998,52.16,57559800,50.461024\n2016-02-02,54.169998,54.259998,52.650002,53.00,56313800,51.273663\n2016-02-01,54.880001,55.09,54.50,54.709999,44208500,52.927964\n2016-01-29,54.73,55.09,54.00,55.09,83611700,53.295587\n2016-01-28,51.860001,52.209999,51.25,52.060001,62513800,50.364283\n2016-01-27,52.009998,52.200001,51.02,51.220001,36775200,49.551643\n2016-01-26,51.790001,52.439999,51.549999,52.169998,28900800,50.470697\n2016-01-25,51.939999,52.650002,51.650002,51.790001,34707700,50.103077\n2016-01-22,51.41,52.330002,51.259998,52.290001,37555800,50.586791\n2016-01-21,51.00,51.580002,50.299999,50.48,40191200,48.835745\n2016-01-20,49.98,51.380001,49.099998,50.790001,63273000,49.135649\n2016-01-19,51.48,51.68,50.060001,50.560001,43564500,48.913141\n2016-01-15,51.310001,51.970001,50.34,50.990002,70739100,49.329136\n2016-01-14,52.00,53.419998,51.57,53.110001,52381900,51.380081\n2016-01-13,53.799999,54.07,51.299999,51.639999,66883600,49.957961\n2016-01-12,52.759998,53.099998,52.060001,52.779999,36095500,51.060828\n2016-01-11,52.509998,52.849998,51.459999,52.299999,36943800,50.596463\n2016-01-08,52.369999,53.279999,52.150002,52.330002,48754000,50.625489\n2016-01-07,52.700001,53.490002,52.07,52.169998,56564900,50.470697\n2016-01-06,54.32,54.400002,53.639999,54.049999,39518900,52.289462\n2016-01-05,54.93,55.389999,54.540001,55.049999,34079700,53.256889\n2016-01-04,54.32,54.799999,53.389999,54.799999,53778000,53.015032\n2015-12-31,56.040001,56.189999,55.419998,55.48,26529600,53.672883\n2015-12-30,56.470001,56.779999,56.290001,56.310001,21704500,54.47585\n2015-12-29,56.290001,56.849998,56.060001,56.549999,27731400,54.708031\n2015-12-28,55.349998,55.950001,54.98,55.950001,22458300,54.127576\n2015-12-24,55.860001,55.959999,55.43,55.669998,9558500,53.856693\n2015-12-23,55.700001,55.880001,55.439999,55.82,27279800,54.001809\n2015-12-22,54.990002,55.48,54.50,55.349998,28322200,53.547117\n2015-12-21,54.880001,55.349998,54.23,54.830002,37246300,53.044058\n2015-12-18,55.77,56.00,54.029999,54.130001,84684200,52.366858\n2015-12-17,56.360001,56.790001,55.529999,55.700001,41280900,53.885719\n2015-12-16,55.540001,56.25,54.759998,56.130001,37503300,54.301713\n2015-12-15,55.66,55.900002,55.09,55.200001,39843000,53.402005\n2015-12-14,54.330002,55.209999,53.68,55.139999,46768900,53.343958\n2015-12-11,54.709999,55.099998,54.009998,54.060001,39549500,52.299138\n2015-12-10,55.389999,55.66,55.009998,55.27,31620700,53.469725\n2015-12-09,55.369999,55.869999,54.509998,54.98,36373200,53.18917\n2015-12-08,55.470001,56.099998,54.990002,55.790001,32878000,53.972787\n2015-12-07,55.790001,55.970001,55.290001,55.810001,30709800,53.992136\n2015-12-04,54.119999,56.23,54.099998,55.91,43963700,54.088878\n2015-12-03,55.490002,55.77,53.93,54.200001,38627800,52.434577\n2015-12-02,55.32,55.959999,55.060001,55.209999,47274900,53.411678\n2015-12-01,54.41,55.23,54.299999,55.220001,39952800,53.421354\n2015-11-30,54.540001,54.959999,54.00,54.349998,56241400,52.579689\n2015-11-27,53.799999,54.080002,53.790001,53.93,9009100,52.173371\n2015-11-25,54.09,54.23,53.689999,53.689999,21005100,51.941187\n2015-11-24,53.919998,54.439999,53.580002,54.25,24600000,52.482948\n2015-11-23,54.25,54.459999,53.75,54.189999,28235900,52.424901\n2015-11-20,54.25,54.299999,53.27,54.189999,37147600,52.424901\n2015-11-19,53.990002,54.66,53.779999,53.939999,28149200,52.183044\n2015-11-18,53.00,53.98,52.98,53.849998,29710000,52.095975\n2015-11-17,53.169998,53.529999,52.849998,52.970001,31551300,51.244642\n2015-11-16,53.080002,53.889999,52.849998,53.77,32165200,51.670308\n2015-11-13,53.07,53.290001,52.529999,52.84,36848200,50.776624\n2015-11-12,53.48,53.98,53.189999,53.32,35361100,51.23788\n2015-11-11,53.700001,54.200001,53.459999,53.650002,36516300,51.554995\n2015-11-10,54.07,54.130001,53.27,53.509998,55283700,51.420459\n2015-11-09,54.549999,54.869999,53.560001,54.16,32513100,52.045079\n2015-11-06,54.09,54.98,53.959999,54.919998,32851200,52.775399\n2015-11-05,54.490002,54.700001,54.00,54.380001,31468500,52.256489\n2015-11-04,54.18,54.880001,54.060001,54.400002,37087800,52.275708\n2015-11-03,52.93,54.389999,52.900002,54.150002,36596900,52.035471\n2015-11-02,52.849998,53.360001,52.619999,53.240002,30285000,51.161006\n2015-10-30,53.32,53.990002,52.619999,52.639999,46619800,50.584433\n2015-10-29,53.540001,53.830002,53.220001,53.360001,30202100,51.276319\n2015-10-28,53.540001,53.98,52.860001,53.98,47000800,51.872107\n2015-10-27,53.990002,54.369999,53.580002,53.689999,50999900,51.593431\n2015-10-26,52.529999,54.32,52.50,54.25,64633300,52.131564\n2015-10-23,52.299999,54.07,52.25,52.869999,135227100,50.805452\n2015-10-22,47.529999,48.950001,47.09,48.029999,56637100,46.154451\n2015-10-21,47.919998,47.990002,47.110001,47.200001,25144300,45.356864\n2015-10-20,47.439999,47.810001,47.02,47.77,30574000,45.904606\n2015-10-19,47.419998,47.880001,47.02,47.619999,29387600,45.760461\n2015-10-16,47.02,47.540001,46.900002,47.509998,26450300,45.654756\n2015-10-15,47.009998,47.029999,46.529999,47.009998,27189400,45.174281\n2015-10-14,46.650002,47.099998,46.529999,46.68,24697800,44.857169\n2015-10-13,46.560001,47.130001,46.560001,46.889999,19987800,45.058968\n2015-10-12,46.98,47.07,46.50,47.00,19769100,45.164673\n2015-10-09,47.450001,47.540001,46.919998,47.110001,28600600,45.270378\n2015-10-08,46.560001,47.52,46.50,47.450001,33772700,45.597102\n2015-10-07,47.099998,47.349998,45.950001,46.799999,27711500,44.972482\n2015-10-06,46.330002,47.18,46.220001,46.75,27017200,44.924436\n2015-10-05,45.75,46.889999,45.700001,46.630001,34369300,44.809123\n2015-10-02,44.27,45.57,43.919998,45.57,41839000,43.790514\n2015-10-01,44.75,44.75,43.75,44.610001,28657900,42.868002\n2015-09-30,43.880001,44.299999,43.66,44.259998,34958900,42.531667\n2015-09-29,43.369999,43.57,43.049999,43.439999,32763600,41.743688\n2015-09-28,43.830002,44.09,43.209999,43.290001,27613800,41.599548\n2015-09-25,44.48,44.73,43.759998,43.939999,29384600,42.224163\n2015-09-24,43.450001,44.130001,43.27,43.91,27905600,42.195336\n2015-09-23,43.93,44.169998,43.509998,43.869999,17145200,42.156897\n2015-09-22,43.380001,44.049999,43.310001,43.900002,28085900,42.185728\n2015-09-21,43.619999,44.470001,43.599998,44.110001,26177200,42.387527\n2015-09-18,43.50,43.990002,43.330002,43.48,63143700,41.782127\n2015-09-17,44.290001,45.00,44.080002,44.25,32768200,42.522059\n2015-09-16,43.970001,44.380001,43.84,44.299999,23372200,42.570106\n2015-09-15,43.189999,44.290001,43.080002,43.98,28882200,42.262602\n2015-09-14,43.43,43.439999,42.860001,43.040001,23656000,41.35931\n2015-09-11,43.139999,43.59,42.939999,43.48,27132500,41.782127\n2015-09-10,43.119999,43.790001,42.75,43.290001,31366600,41.599548\n2015-09-09,44.209999,44.400002,42.91,43.07,33469500,41.388137\n2015-09-08,43.299999,44.00,43.200001,43.889999,32469800,42.176117\n2015-09-04,42.810001,43.040001,42.200001,42.610001,37138800,40.946101\n2015-09-03,43.41,43.98,43.279999,43.50,28285200,41.801346\n2015-09-02,42.360001,43.380001,41.880001,43.360001,37671500,41.666814\n2015-09-01,42.169998,42.59,41.66,41.82,49688900,40.186949\n2015-08-31,43.560001,43.93,43.099998,43.52,34441700,41.820566\n2015-08-28,43.400002,44.150002,43.389999,43.93,28246700,42.214555\n2015-08-27,43.23,43.950001,42.93,43.900002,50943200,42.185728\n2015-08-26,42.009998,42.84,41.060001,42.709999,63408000,41.042195\n2015-08-25,42.57,43.240002,40.389999,40.470001,70616600,38.889668\n2015-08-24,40.450001,42.689999,39.720001,41.68,88753700,40.052417\n2015-08-21,45.299999,45.48,43.07,43.07,70053100,41.388137\n2015-08-20,46.07,46.470001,45.66,45.66,36238200,43.876999\n2015-08-19,46.779999,47.080002,46.299999,46.610001,31444000,44.789903\n2015-08-18,46.84,47.43,46.700001,47.27,23574100,45.42413\n2015-08-17,46.810001,47.450001,46.57,47.32,21099700,45.174282\n2015-08-14,46.529999,47.099998,46.52,47.00,21473400,44.868793\n2015-08-13,47.060001,47.099998,46.490002,46.73,22627200,44.611036\n2015-08-12,46.189999,46.900002,45.709999,46.740002,30181400,44.620584\n2015-08-11,46.82,46.939999,45.900002,46.41,29237400,44.305546\n2015-08-10,46.950001,47.490002,46.84,47.330002,23079900,45.183831\n2015-08-07,46.389999,46.779999,46.259998,46.740002,19163000,44.620584\n2015-08-06,47.709999,47.77,46.330002,46.619999,27368000,44.506023\n2015-08-05,47.98,48.41,47.540001,47.580002,26959700,45.422495\n2015-08-04,46.75,47.709999,46.68,47.540001,33403900,45.384308\n2015-08-03,46.98,47.00,46.450001,46.810001,24125900,44.68741\n2015-07-31,47.290001,47.369999,46.50,46.700001,31201500,44.582397\n2015-07-30,46.259998,47.400002,45.93,46.880001,39777900,44.754235\n2015-07-29,45.400002,46.779999,45.259998,46.290001,40945900,44.190989\n2015-07-28,45.580002,45.639999,44.790001,45.34,34328900,43.284066\n2015-07-27,45.939999,46.009998,45.25,45.349998,39701400,43.293611\n2015-07-24,45.91,46.32,45.799999,45.939999,32333200,43.856857\n2015-07-23,45.27,46.23,45.099998,46.110001,33934000,44.01915\n2015-07-22,45.439999,46.93,45.200001,45.540001,59152400,43.474997\n2015-07-21,46.779999,47.330002,46.48,47.279999,42781900,45.136095\n2015-07-20,46.650002,47.130001,46.439999,46.919998,30631900,44.792419\n2015-07-17,46.549999,46.779999,46.259998,46.619999,29467100,44.506023\n2015-07-16,46.009998,46.689999,45.970001,46.66,26271700,44.54421\n2015-07-15,45.68,45.889999,45.43,45.759998,26629600,43.685019\n2015-07-14,45.450001,45.959999,45.310001,45.619999,22880300,43.551368\n2015-07-13,44.98,45.619999,44.950001,45.540001,28178300,43.474997\n2015-07-10,45.009998,45.139999,44.57,44.610001,25465800,42.587168\n2015-07-09,44.75,45.220001,44.50,44.52,32099800,42.501249\n2015-07-08,44.439999,44.900002,44.029999,44.240002,39785900,42.233946\n2015-07-07,44.34,44.490002,43.32,44.299999,36435800,42.291223\n2015-07-06,43.959999,44.48,43.950001,44.389999,23034000,42.377142\n2015-07-02,44.48,44.75,44.060001,44.400002,21752000,42.386691\n2015-07-01,44.459999,45.23,44.099998,44.450001,28343900,42.434423\n2015-06-30,44.709999,44.720001,43.939999,44.150002,35945400,42.148027\n2015-06-29,45.040001,45.23,44.360001,44.369999,34081700,42.358049\n2015-06-26,45.650002,46.279999,45.029999,45.259998,49835300,43.207691\n2015-06-25,46.029999,46.060001,45.50,45.650002,20616000,43.58001\n2015-06-24,45.669998,46.25,45.549999,45.639999,34890900,43.570461\n2015-06-23,46.130001,46.279999,45.619999,45.91,25896500,43.828219\n2015-06-22,46.330002,46.720001,46.16,46.23,20318100,44.133708\n2015-06-19,46.790001,46.830002,45.990002,46.099998,63837000,44.009602\n2015-06-18,46.220001,46.799999,46.169998,46.720001,32658300,44.601491\n2015-06-17,45.73,46.07,45.360001,45.970001,28704100,43.885499\n2015-06-16,45.349998,46.240002,45.299999,45.830002,27070300,43.751848\n2015-06-15,45.450001,45.650002,45.02,45.48,33254500,43.417717\n2015-06-12,46.220001,46.470001,45.900002,45.970001,23931000,43.885499\n2015-06-11,46.66,46.919998,46.130001,46.439999,27347800,44.334185\n2015-06-10,45.790001,46.830002,45.689999,46.610001,28417400,44.496478\n2015-06-09,45.759998,45.939999,45.459999,45.650002,24406100,43.58001\n2015-06-08,46.299999,46.43,45.669998,45.73,22121600,43.656381\n2015-06-05,46.310001,46.52,45.84,46.139999,25438100,44.047789\n2015-06-04,46.790001,47.16,46.200001,46.360001,27745500,44.257814\n2015-06-03,47.369999,47.740002,46.82,46.849998,27955200,44.725593\n2015-06-02,46.93,47.349998,46.619999,46.919998,21498300,44.792419\n2015-06-01,47.060001,47.77,46.619999,47.23,28837300,45.088363\n2015-05-29,47.43,47.57,46.59,46.860001,36519600,44.735142\n2015-05-28,47.50,48.02,47.389999,47.450001,19283700,45.298389\n2015-05-27,46.82,47.77,46.619999,47.610001,27335600,45.451133\n2015-05-26,46.830002,46.880001,46.189999,46.59,29581900,44.477385\n2015-05-22,47.299999,47.349998,46.82,46.900002,25720600,44.773329\n2015-05-21,47.279999,47.599998,47.009998,47.419998,22410700,45.269746\n2015-05-20,47.389999,47.93,47.27,47.580002,25047900,45.422495\n2015-05-19,47.560001,47.810001,47.18,47.580002,28574800,45.422495\n2015-05-18,47.98,48.220001,47.610001,48.009998,24136500,45.53705\n2015-05-15,48.869999,48.91,48.049999,48.299999,28642700,45.812113\n2015-05-14,48.029999,48.82,48.029999,48.720001,32980900,46.210482\n2015-05-13,48.189999,48.32,47.57,47.630001,34184600,45.176626\n2015-05-12,46.849998,47.68,46.419998,47.349998,29928300,44.911046\n2015-05-11,47.549999,47.91,47.369999,47.369999,24609400,44.930017\n2015-05-08,47.549999,47.98,47.52,47.75,35364900,45.290444\n2015-05-07,46.27,47.09,46.16,46.700001,32971700,44.294529\n2015-05-06,47.57,47.77,46.02,46.279999,52433000,43.896161\n2015-05-05,47.82,48.16,47.310001,47.599998,50369200,45.148169\n2015-05-04,48.369999,48.869999,48.18,48.240002,34039500,45.755206\n2015-05-01,48.580002,48.880001,48.400002,48.66,38937300,46.153571\n2015-04-30,48.700001,49.540001,48.599998,48.639999,64725500,46.134601\n2015-04-29,48.720001,49.310001,48.50,49.060001,47804600,46.532969\n2015-04-28,47.779999,49.209999,47.700001,49.16,60730800,46.627816\n2015-04-27,47.23,48.130001,47.220001,48.029999,59248200,45.55602\n2015-04-24,45.66,48.139999,45.650002,47.869999,130933700,45.404262\n2015-04-23,42.889999,43.610001,42.799999,43.34,46309500,41.107599\n2015-04-22,42.669998,43.130001,42.549999,42.990002,25064300,40.775629\n2015-04-21,43.00,43.150002,42.529999,42.639999,26013800,40.443655\n2015-04-20,41.73,43.169998,41.68,42.91,46057700,40.699748\n2015-04-17,41.669998,41.740002,41.16,41.619999,42387600,39.476193\n2015-04-16,41.950001,42.34,41.82,42.16,22509700,39.988379\n2015-04-15,41.759998,42.459999,41.68,42.259998,27343600,40.083227\n2015-04-14,41.799999,42.029999,41.389999,41.650002,24244400,39.504651\n2015-04-13,41.400002,42.060001,41.389999,41.759998,30276700,39.608982\n2015-04-10,41.630001,41.950001,41.41,41.720001,28022000,39.571045\n2015-04-09,41.25,41.619999,41.25,41.48,25723900,39.343405\n2015-04-08,41.459999,41.689999,41.040001,41.419998,24753400,39.286495\n2015-04-07,41.610001,41.91,41.310001,41.529999,28809400,39.390829\n2015-04-06,40.34,41.779999,40.18,41.549999,39223700,39.409799\n2015-04-02,40.66,40.740002,40.119999,40.290001,37487500,38.214702\n2015-04-01,40.599998,40.759998,40.310001,40.720001,36865300,38.622554\n2015-03-31,40.779999,41.029999,40.540001,40.66,34887200,38.565643\n2015-03-30,41.099998,41.540001,40.91,40.959999,35049700,38.85019\n2015-03-27,41.119999,41.43,40.830002,40.970001,34401400,38.859676\n2015-03-26,41.220001,41.610001,40.919998,41.209999,37495600,39.087312\n2015-03-25,42.919998,42.93,41.439999,41.459999,43469900,39.324435\n2015-03-24,42.779999,43.169998,42.75,42.900002,25513300,40.690264\n2015-03-23,42.880001,43.130001,42.779999,42.860001,26246100,40.652324\n2015-03-20,42.560001,42.98,42.490002,42.880001,71904500,40.671294\n2015-03-19,42.259998,42.59,42.220001,42.290001,33879100,40.111684\n2015-03-18,41.43,42.830002,41.330002,42.50,44194800,40.310867\n2015-03-17,41.369999,41.830002,41.150002,41.700001,31673400,39.552074\n2015-03-16,41.470001,41.639999,41.279999,41.560001,35273500,39.419286\n2015-03-13,40.700001,41.470001,40.610001,41.380001,58007700,39.248558\n2015-03-12,41.330002,41.650002,40.860001,41.02,59992500,38.9071\n2015-03-11,42.310001,42.369999,41.84,41.98,32215300,39.817651\n2015-03-10,42.349998,42.709999,42.029999,42.029999,39159700,39.865075\n2015-03-09,42.189999,43.130001,42.189999,42.849998,32108000,40.642837\n2015-03-06,43.00,43.110001,42.150002,42.360001,36248800,40.178078\n2015-03-05,43.07,43.240002,42.82,43.110001,23193500,40.889447\n2015-03-04,43.009998,43.209999,42.880001,43.060001,25748700,40.842023\n2015-03-03,43.560001,43.830002,43.09,43.279999,31748600,41.050688\n2015-03-02,43.669998,44.189999,43.549999,43.880001,31924000,41.619785\n2015-02-27,44.130001,44.200001,43.66,43.849998,33807700,41.591328\n2015-02-26,43.990002,44.23,43.889999,44.060001,28957300,41.790514\n2015-02-25,43.950001,44.09,43.799999,43.990002,29759800,41.72412\n2015-02-24,44.150002,44.299999,43.919998,44.09,25271700,41.818967\n2015-02-23,43.700001,44.189999,43.650002,44.150002,32518800,41.875878\n2015-02-20,43.509998,43.880001,43.290001,43.860001,29721100,41.600815\n2015-02-19,43.18,43.529999,43.049999,43.50,27603400,41.259358\n2015-02-18,43.630001,43.700001,43.389999,43.529999,27111700,41.287811\n2015-02-17,43.970001,44.00,43.189999,43.580002,33695700,41.335239\n2015-02-13,43.380001,43.869999,43.150002,43.869999,40264900,41.316268\n2015-02-12,42.66,43.09,42.509998,43.09,33268800,40.581674\n2015-02-11,42.650002,42.650002,42.209999,42.380001,38262500,39.913005\n2015-02-10,42.740002,42.77,42.18,42.599998,29670700,40.120196\n2015-02-09,42.240002,42.740002,42.209999,42.360001,31381100,39.894169\n2015-02-06,42.68,42.790001,42.150002,42.41,34616600,39.941257\n2015-02-05,42.220001,42.639999,41.860001,42.450001,36548200,39.97893\n2015-02-04,41.939999,42.209999,41.360001,41.84,41614800,39.404438\n2015-02-03,41.630001,41.93,41.049999,41.599998,52082400,39.178407\n2015-02-02,40.59,41.369999,40.23,41.279999,50352500,38.877035\n2015-01-30,41.549999,41.580002,40.349998,40.400002,78004900,38.048264\n2015-01-29,40.93,42.119999,40.790001,42.009998,63585300,39.564541\n2015-01-28,42.740002,42.790001,41.16,41.189999,84507100,38.792274\n2015-01-27,42.950001,43.200001,42.110001,42.66,169164000,40.176705\n2015-01-26,47.00,47.130001,46.240002,47.009998,42525500,44.273484\n2015-01-23,47.360001,47.389999,46.799999,47.18,26211600,44.43359\n2015-01-22,46.380001,47.139999,46.080002,47.130001,35898000,44.386501\n2015-01-21,45.939999,46.139999,45.48,45.919998,39081100,43.246934\n2015-01-20,46.299999,46.650002,45.57,46.389999,36161900,43.689576\n2015-01-16,45.310001,46.279999,45.169998,46.240002,35695300,43.54831\n2015-01-15,46.220001,46.380001,45.41,45.48,32750800,42.832548\n2015-01-14,45.959999,46.240002,45.619999,45.959999,29675300,43.284607\n2015-01-13,46.970001,47.91,46.060001,46.360001,35270600,43.661323\n2015-01-12,47.419998,47.540001,46.360001,46.599998,23651900,43.887351\n2015-01-09,47.610001,47.82,46.900002,47.189999,23944200,44.443006\n2015-01-08,46.75,47.75,46.720001,47.59,29645200,44.819723\n2015-01-07,45.98,46.459999,45.490002,46.23,29114100,43.53889\n2015-01-06,46.380001,46.75,45.540001,45.650002,36447900,42.992654\n2015-01-05,46.369999,46.73,46.25,46.330002,39673900,43.633071\n2015-01-02,46.66,47.419998,46.540001,46.759998,27913900,44.038037\n2014-12-31,46.73,47.439999,46.450001,46.450001,21552500,43.746085\n2014-12-30,47.439999,47.619999,46.84,47.02,16384700,44.282904\n2014-12-29,47.700001,47.779999,47.259998,47.450001,14439500,44.687873\n2014-12-26,48.41,48.41,47.82,47.880001,13197800,45.092843\n2014-12-24,48.639999,48.639999,48.080002,48.139999,11437800,45.337706\n2014-12-23,48.369999,48.799999,48.130001,48.450001,23648100,45.629662\n2014-12-22,47.779999,48.119999,47.709999,47.98,26566000,45.18702\n2014-12-19,47.630001,48.099998,47.169998,47.66,64551200,44.885648\n2014-12-18,46.580002,47.52,46.34,47.52,40105600,44.753798\n2014-12-17,45.049999,45.950001,44.900002,45.740002,34970900,43.077416\n2014-12-16,45.900002,46.34,45.130001,45.16,47801400,42.531176\n2014-12-15,47.200001,47.669998,46.549999,46.669998,29247800,43.953276\n2014-12-12,46.779999,47.73,46.669998,46.950001,34248400,44.216979\n2014-12-11,47.080002,47.740002,46.68,47.169998,29060400,44.42417\n2014-12-10,47.580002,47.66,46.700001,46.900002,30431800,44.16989\n2014-12-09,47.110001,47.919998,47.049999,47.59,24330500,44.819723\n2014-12-08,48.259998,48.349998,47.450001,47.700001,26663100,44.92332\n2014-12-05,48.82,48.970001,48.380001,48.419998,27313400,45.601406\n2014-12-04,48.389999,49.060001,48.200001,48.84,30320400,45.996959\n2014-12-03,48.439999,48.50,47.810001,48.080002,23534800,45.281201\n2014-12-02,48.84,49.049999,48.200001,48.459999,25773500,45.639078\n2014-12-01,47.880001,48.779999,47.709999,48.619999,31191600,45.789764\n2014-11-28,47.950001,48.200001,47.610001,47.810001,21534400,45.026918\n2014-11-26,47.490002,47.990002,47.279999,47.75,27163600,44.970409\n2014-11-25,47.66,47.970001,47.450001,47.470001,28008000,44.706709\n2014-11-24,47.990002,48.00,47.389999,47.59,35434200,44.819723\n2014-11-21,49.02,49.049999,47.57,47.98,42884800,45.18702\n2014-11-20,48.00,48.700001,47.869999,48.700001,21510600,45.865109\n2014-11-19,48.66,48.75,47.93,48.220001,26177500,45.413051\n2014-11-18,49.130001,49.330002,48.700001,48.740002,23995500,45.902782\n2014-11-17,49.41,49.709999,49.139999,49.459999,30318600,46.28891\n2014-11-14,49.740002,50.049999,49.389999,49.580002,29081700,46.401219\n2014-11-13,48.810001,49.650002,48.709999,49.610001,26210400,46.429294\n2014-11-12,48.560001,48.919998,48.52,48.779999,22722100,45.652508\n2014-11-11,48.849998,48.950001,48.650002,48.869999,23445200,45.736737\n2014-11-10,48.650002,49.150002,48.549999,48.889999,36370100,45.755456\n2014-11-07,48.919998,48.919998,48.290001,48.68,28000600,45.55892\n2014-11-06,47.860001,48.860001,47.790001,48.700001,33037800,45.577639\n2014-11-05,47.799999,47.900002,47.259998,47.860001,22449600,44.791494\n2014-11-04,47.299999,47.73,47.25,47.57,21530800,44.520087\n2014-11-03,46.889999,47.459999,46.73,47.439999,23130400,44.39842\n2014-10-31,46.939999,46.970001,46.48,46.950001,35849700,43.939838\n2014-10-30,46.32,46.32,45.77,46.049999,30073900,43.09754\n2014-10-29,46.439999,46.700001,46.34,46.619999,30276100,43.630994\n2014-10-28,45.860001,46.50,45.77,46.490002,29049800,43.509332\n2014-10-27,45.709999,46.099998,45.709999,45.91,30371300,42.966516\n2014-10-24,46.830002,46.900002,45.18,46.130001,61076700,43.172412\n2014-10-23,44.619999,45.450001,44.529999,45.02,45451900,42.133579\n2014-10-22,45.00,45.07,44.23,44.380001,33570900,41.534612\n2014-10-21,44.360001,44.98,44.189999,44.880001,36433800,42.002555\n2014-10-20,43.060001,44.139999,42.810001,44.080002,34527900,41.253847\n2014-10-17,43.200001,43.939999,42.790001,43.630001,40683300,40.832698\n2014-10-16,42.529999,43.080002,42.220001,42.740002,49040400,39.99976\n2014-10-15,43.00,43.389999,42.099998,43.220001,60218700,40.448985\n2014-10-14,43.869999,44.380001,43.560001,43.73,38115700,40.926285\n2014-10-13,43.82,44.560001,43.490002,43.650002,37100200,40.851416\n2014-10-10,45.599998,46.119999,43.950001,44.029999,51978100,41.20705\n2014-10-09,46.50,46.799999,45.740002,45.849998,34422800,42.910362\n2014-10-08,45.48,46.889999,45.34,46.779999,33031000,43.780736\n2014-10-07,45.860001,45.93,45.419998,45.529999,25723700,42.610879\n2014-10-06,46.119999,46.299999,45.919998,46.09,20604000,43.134976\n2014-10-03,45.98,46.299999,45.610001,46.09,32453200,43.134976\n2014-10-02,45.830002,46.099998,45.639999,45.759998,25119400,42.826132\n2014-10-01,46.27,46.529999,45.849998,45.900002,38088400,42.957159\n2014-09-30,46.369999,46.48,46.009998,46.360001,33033100,43.387666\n2014-09-29,45.98,46.560001,45.759998,46.439999,26091000,43.462535\n2014-09-26,45.93,46.619999,45.759998,46.41,27078800,43.434459\n2014-09-25,46.880001,47.09,46.029999,46.040001,33077400,43.088182\n2014-09-24,46.630001,47.110001,46.34,47.080002,26582700,44.061505\n2014-09-23,46.849998,46.98,46.470001,46.560001,33430300,43.574844\n2014-09-22,47.299999,47.380001,46.98,47.060001,38686100,44.042786\n2014-09-19,46.810001,47.57,46.599998,47.52,202522400,44.473293\n2014-09-18,46.59,46.830002,46.459999,46.68,35556600,43.687149\n2014-09-17,46.259998,46.689999,46.23,46.52,38311900,43.537407\n2014-09-16,46.389999,46.849998,46.290001,46.759998,27910600,43.762018\n2014-09-15,46.540001,46.709999,46.099998,46.240002,37667600,43.27536\n2014-09-12,46.91,47.02,46.599998,46.700001,38244700,43.705867\n2014-09-11,46.740002,47.00,46.470001,47.00,29216400,43.986632\n2014-09-10,46.82,46.939999,46.279999,46.84,27302400,43.83689\n2014-09-09,46.470001,46.970001,46.419998,46.759998,40302400,43.762018\n2014-09-08,46.02,46.799999,45.990002,46.470001,45736700,43.490614\n2014-09-05,45.110001,45.93,45.110001,45.91,36939400,42.966516\n2014-09-04,44.740002,45.27,44.720001,45.259998,26475500,42.358189\n2014-09-03,44.529999,45.110001,44.529999,44.959999,33684500,42.077424\n2014-09-02,45.43,45.459999,44.849998,45.09,22976800,42.19909\n2014-08-29,45.09,45.439999,44.860001,45.43,21607600,42.517292\n2014-08-28,44.75,44.98,44.610001,44.880001,17657600,42.002555\n2014-08-27,44.900002,45.00,44.759998,44.869999,21287900,41.993194\n2014-08-26,45.310001,45.400002,44.939999,45.009998,14873100,42.124218\n2014-08-25,45.400002,45.439999,45.040001,45.169998,16910000,42.273959\n2014-08-22,45.349998,45.470001,45.07,45.150002,18294500,42.255245\n2014-08-21,44.84,45.25,44.830002,45.220001,22285500,42.320756\n2014-08-20,45.34,45.400002,44.900002,44.950001,24770500,42.068067\n2014-08-19,44.970001,45.34,44.830002,45.330002,28139500,42.423704\n2014-08-18,44.939999,45.110001,44.68,45.110001,26891100,41.955761\n2014-08-15,44.580002,44.900002,44.400002,44.790001,41611300,41.658137\n2014-08-14,44.080002,44.419998,44.009998,44.27,19313200,41.174497\n2014-08-13,43.68,44.18,43.52,44.080002,22889500,40.997783\n2014-08-12,43.040001,43.59,43.00,43.52,21431100,40.476939\n2014-08-11,43.259998,43.450001,43.02,43.200001,20351600,40.179315\n2014-08-08,43.23,43.32,42.91,43.200001,28942700,40.179315\n2014-08-07,42.84,43.450001,42.650002,43.23,30314900,40.207216\n2014-08-06,42.740002,43.169998,42.209999,42.740002,24634000,39.751481\n2014-08-05,43.310001,43.459999,42.830002,43.080002,26266400,40.067707\n2014-08-04,42.970001,43.470001,42.810001,43.369999,34277400,40.337426\n2014-08-01,43.209999,43.25,42.599998,42.860001,31170300,39.863089\n2014-07-31,43.380001,43.689999,43.080002,43.16,31537500,40.142111\n2014-07-30,44.07,44.099998,43.290001,43.580002,31921400,40.532745\n2014-07-29,43.91,44.09,43.639999,43.889999,27763100,40.821067\n2014-07-28,44.360001,44.509998,43.93,43.970001,29684200,40.895474\n2014-07-25,44.299999,44.66,44.299999,44.50,26737700,41.388414\n2014-07-24,44.93,45.00,44.32,44.400002,30725300,41.295408\n2014-07-23,45.450001,45.450001,44.619999,44.869999,52362900,41.732541\n2014-07-22,45.00,45.150002,44.59,44.830002,43095800,41.695341\n2014-07-21,44.560001,45.16,44.220001,44.84,37604400,41.70464\n2014-07-18,44.650002,44.84,44.25,44.689999,43407500,41.565127\n2014-07-17,45.450001,45.709999,44.25,44.529999,82180300,41.416315\n2014-07-16,42.509998,44.310001,42.48,44.080002,63318000,40.997783\n2014-07-15,42.330002,42.470001,42.029999,42.450001,28748700,39.481757\n2014-07-14,42.220001,42.450001,42.040001,42.139999,21881100,39.193432\n2014-07-11,41.700001,42.09,41.48,42.09,24083000,39.146929\n2014-07-10,41.369999,42.00,41.049999,41.689999,21854700,38.774897\n2014-07-09,41.98,41.990002,41.529999,41.669998,18445900,38.756295\n2014-07-08,41.869999,42.00,41.610001,41.779999,31218200,38.858604\n2014-07-07,41.75,42.119999,41.709999,41.990002,21952400,39.053923\n2014-07-03,41.91,41.990002,41.560001,41.799999,15969300,38.877206\n2014-07-02,41.73,41.900002,41.529999,41.900002,20208100,38.970216\n2014-07-01,41.860001,42.150002,41.689999,41.869999,26917000,38.942311\n2014-06-30,42.169998,42.209999,41.700001,41.700001,30793100,38.7842\n2014-06-27,41.610001,42.290001,41.509998,42.25,74640000,39.295741\n2014-06-26,41.93,41.939999,41.43,41.720001,23604400,38.802802\n2014-06-25,41.700001,42.049999,41.459999,42.029999,20049100,39.091123\n2014-06-24,41.830002,41.939999,41.560001,41.75,26509100,38.830703\n2014-06-23,41.73,42.00,41.689999,41.990002,18743900,39.053923\n2014-06-20,41.450001,41.830002,41.380001,41.68,47764900,38.765598\n2014-06-19,41.57,41.77,41.330002,41.509998,19828200,38.607483\n2014-06-18,41.610001,41.740002,41.18,41.650002,27097000,38.737697\n2014-06-17,41.290001,41.91,40.34,41.68,22518600,38.765598\n2014-06-16,41.040001,41.610001,41.040001,41.50,24205300,38.598184\n2014-06-13,41.099998,41.57,40.860001,41.23,26310000,38.347063\n2014-06-12,40.810001,40.880001,40.290001,40.580002,29818900,37.742515\n2014-06-11,40.93,41.07,40.77,40.860001,18040000,38.002935\n2014-06-10,41.029999,41.16,40.860001,41.110001,15117700,38.235454\n2014-06-09,41.389999,41.48,41.02,41.27,15019200,38.384267\n2014-06-06,41.48,41.66,41.240002,41.48,24060500,38.579582\n2014-06-05,40.59,41.25,40.400002,41.209999,31865200,38.328461\n2014-06-04,40.209999,40.369999,39.860001,40.32,23209000,37.500693\n2014-06-03,40.599998,40.68,40.25,40.290001,18068900,37.472792\n2014-06-02,40.950001,41.09,40.68,40.790001,18504300,37.93783\n2014-05-30,40.450001,40.970001,40.25,40.939999,34567600,38.07734\n2014-05-29,40.150002,40.349998,39.91,40.34,19888200,37.519295\n2014-05-28,40.139999,40.189999,39.82,40.009998,25711500,37.212368\n2014-05-27,40.259998,40.259998,39.810001,40.189999,26160600,37.379782\n2014-05-23,40.369999,40.369999,40.00,40.119999,18020000,37.314677\n2014-05-22,40.290001,40.349998,39.849998,40.099998,20201800,37.296075\n2014-05-21,39.799999,40.349998,39.740002,40.349998,22398700,37.528594\n2014-05-20,39.68,39.939999,39.459999,39.68,21320900,36.905444\n2014-05-19,39.610001,39.82,39.459999,39.75,24537400,36.97055\n2014-05-16,39.669998,39.84,39.27,39.830002,29867100,37.044957\n2014-05-15,40.09,40.400002,39.509998,39.599998,37793200,36.831037\n2014-05-14,40.299999,40.450001,40.049999,40.240002,18818700,37.426289\n2014-05-13,39.919998,40.50,39.849998,40.419998,27004800,37.593699\n2014-05-12,39.740002,40.02,39.650002,39.970001,22782600,36.914745\n2014-05-09,39.540001,39.849998,39.369999,39.540001,29647600,36.517614\n2014-05-08,39.34,39.900002,38.970001,39.639999,32120400,36.609968\n2014-05-07,39.220001,39.509998,38.509998,39.419998,41744500,36.406784\n2014-05-06,39.290001,39.349998,38.950001,39.060001,27112400,36.074305\n2014-05-05,39.52,39.639999,39.299999,39.43,22460900,36.416021\n2014-05-02,40.310001,40.34,39.66,39.689999,43416600,36.656146\n2014-05-01,40.240002,40.360001,39.950001,40.00,28787400,36.942451\n2014-04-30,40.400002,40.50,40.169998,40.400002,35458700,37.311877\n2014-04-29,41.099998,41.189999,40.389999,40.509998,29636200,37.413466\n2014-04-28,40.139999,41.290001,40.09,40.869999,50610200,37.745948\n2014-04-25,40.290001,40.68,39.75,39.91,56876800,36.85933\n2014-04-24,39.740002,39.970001,39.299999,39.860001,42381600,36.813153\n2014-04-23,39.990002,39.990002,39.470001,39.689999,24602800,36.656146\n2014-04-22,39.959999,40.139999,39.830002,39.990002,27056700,36.933217\n2014-04-21,40.130001,40.150002,39.790001,39.939999,22221200,36.887036\n2014-04-17,40.009998,40.200001,39.509998,40.009998,36688400,36.951685\n2014-04-16,40.060001,40.419998,39.91,40.400002,30615800,37.311877\n2014-04-15,39.34,39.959999,39.049999,39.75,33968700,36.711561\n2014-04-14,39.110001,39.41,38.900002,39.18,32006600,36.185131\n2014-04-11,39.00,39.790001,39.00,39.209999,34330200,36.212837\n2014-04-10,40.439999,40.689999,39.09,39.360001,45960800,36.351372\n2014-04-09,39.93,40.549999,39.880001,40.470001,27398700,37.376526\n2014-04-08,39.75,39.93,39.200001,39.82,35918600,36.77621\n2014-04-07,39.959999,40.27,39.740002,39.799999,37559600,36.757738\n2014-04-04,41.25,41.389999,39.639999,39.869999,51409600,36.822387\n2014-04-03,41.290001,41.290001,40.709999,41.009998,30139600,37.875246\n2014-04-02,41.439999,41.66,41.169998,41.349998,28666700,38.189257\n2014-04-01,41.150002,41.59,41.07,41.419998,32605000,38.253906\n2014-03-31,40.43,41.50,40.400002,40.990002,46886300,37.856778\n2014-03-28,39.790001,40.639999,39.68,40.299999,43472700,37.219519\n2014-03-27,39.740002,39.970001,39.34,39.360001,35369200,36.351372\n2014-03-26,40.48,40.709999,39.599998,39.790001,41977500,36.748504\n2014-03-25,40.66,40.990002,39.959999,40.34,43193100,37.256462\n2014-03-24,40.34,40.639999,39.860001,40.50,46098400,37.404232\n2014-03-21,40.720001,40.939999,40.009998,40.16,80721800,37.090221\n2014-03-20,39.25,40.650002,39.240002,40.330002,59269800,37.247228\n2014-03-19,39.470001,39.549999,38.91,39.27,35597200,36.268252\n2014-03-18,38.259998,39.900002,38.220001,39.549999,64063900,36.526848\n2014-03-17,37.900002,38.41,37.790001,38.049999,20479600,35.141506\n2014-03-14,37.650002,38.139999,37.509998,37.700001,27195600,34.818261\n2014-03-13,38.419998,38.450001,37.639999,37.889999,32169700,34.993736\n2014-03-12,37.799999,38.43,37.790001,38.27,30494100,35.34469\n2014-03-11,37.869999,38.23,37.720001,38.02,25216400,35.1138\n2014-03-10,37.990002,38.009998,37.720001,37.82,19006600,34.929087\n2014-03-07,38.279999,38.360001,37.689999,37.900002,26591600,35.002974\n2014-03-06,38.139999,38.240002,37.889999,38.150002,23582200,35.233864\n2014-03-05,38.25,38.27,37.93,38.110001,20520100,35.196921\n2014-03-04,38.200001,38.48,38.07,38.41,26802400,35.473988\n2014-03-03,37.919998,38.130001,37.490002,37.779999,29717500,34.892144\n2014-02-28,37.98,38.459999,37.82,38.310001,41215000,35.381634\n2014-02-27,37.450001,37.889999,37.23,37.860001,33903400,34.96603\n2014-02-26,37.580002,37.740002,37.189999,37.470001,41041800,34.605842\n2014-02-25,37.610001,37.849998,37.349998,37.540001,30736500,34.670491\n2014-02-24,37.689999,37.98,37.540001,37.689999,32085100,34.809023\n2014-02-21,37.939999,38.349998,37.860001,37.98,38021300,35.076857\n2014-02-20,37.57,37.869999,37.400002,37.75,27526100,34.864438\n2014-02-19,37.220001,37.75,37.209999,37.509998,29750400,34.642782\n2014-02-18,37.630001,37.779999,37.41,37.419998,32834000,34.559661\n2014-02-14,37.389999,37.779999,37.330002,37.619999,31407500,34.485778\n2014-02-13,37.330002,37.860001,37.330002,37.610001,37635500,34.476613\n2014-02-12,37.349998,37.599998,37.299999,37.470001,27051800,34.348277\n2014-02-11,36.880001,37.259998,36.860001,37.169998,32141400,34.073268\n2014-02-10,36.630001,36.799999,36.290001,36.799999,26767000,33.734094\n2014-02-07,36.32,36.59,36.009998,36.560001,33260500,33.514091\n2014-02-06,35.799999,36.25,35.689999,36.18,35351800,33.165749\n2014-02-05,36.290001,36.470001,35.799999,35.82,55814400,32.835741\n2014-02-04,36.970001,37.189999,36.25,36.349998,54697900,33.321584\n2014-02-03,37.740002,37.990002,36.43,36.48,64063100,33.440755\n2014-01-31,36.950001,37.889999,36.560001,37.84,93162300,34.68745\n2014-01-30,36.790001,36.880001,36.23,36.860001,35036300,33.789097\n2014-01-29,35.98,36.880001,35.900002,36.66,52745900,33.605759\n2014-01-28,36.119999,36.389999,35.75,36.27,36205500,33.248251\n2014-01-27,36.869999,36.889999,35.98,36.029999,44420800,33.028245\n2014-01-24,37.450001,37.549999,36.529999,36.810001,76395500,33.743263\n2014-01-23,36.09,36.130001,35.52,36.060001,43954000,33.055748\n2014-01-22,36.259998,36.32,35.75,35.93,21904300,32.936577\n2014-01-21,36.82,36.82,36.060001,36.169998,31567300,33.15658\n2014-01-17,36.830002,36.830002,36.150002,36.380001,46267500,33.349087\n2014-01-16,36.689999,37.00,36.310001,36.889999,38018700,33.816596\n2014-01-15,35.900002,36.790001,35.849998,36.759998,44812600,33.697426\n2014-01-14,34.73,35.880001,34.630001,35.779999,41623300,32.799073\n2014-01-13,35.990002,36.02,34.830002,34.98,45901900,32.065724\n2014-01-10,35.900002,36.150002,35.75,36.040001,40548800,33.037414\n2014-01-09,35.880001,35.91,35.400002,35.529999,36516300,32.569901\n2014-01-08,36.00,36.139999,35.580002,35.759998,59971700,32.780739\n2014-01-07,36.330002,36.490002,36.209999,36.41,35802800,33.376587\n2014-01-06,36.849998,36.889999,36.110001,36.130001,43603700,33.119916\n2014-01-03,37.200001,37.220001,36.599998,36.91,31134800,33.834931\n2014-01-02,37.349998,37.400002,37.099998,37.16,30632200,34.064103\n2013-12-31,37.400002,37.580002,37.220001,37.41,17503500,34.293274\n2013-12-30,37.220001,37.380001,36.900002,37.290001,16290500,34.183273\n2013-12-27,37.580002,37.619999,37.169998,37.290001,14563000,34.183273\n2013-12-26,37.200001,37.490002,37.169998,37.439999,17612800,34.320774\n2013-12-24,36.720001,37.169998,36.639999,37.080002,14243000,33.990769\n2013-12-23,36.810001,36.889999,36.549999,36.619999,25128700,33.56909\n2013-12-20,36.200001,36.93,36.189999,36.799999,62649100,33.734094\n2013-12-19,36.509998,36.549999,36.080002,36.25,34160100,33.229917\n2013-12-18,36.360001,36.599998,35.529999,36.580002,63192100,33.532426\n2013-12-17,36.939999,37.110001,36.330002,36.52,45687700,33.477423\n2013-12-16,36.73,37.00,36.540001,36.889999,31734200,33.816596\n2013-12-13,37.419998,37.450001,36.619999,36.689999,40066100,33.633258\n2013-12-12,37.639999,37.639999,37.18,37.220001,36012800,34.119105\n2013-12-11,38.060001,38.299999,37.389999,37.610001,39853400,34.476613\n2013-12-10,38.610001,38.900002,38.02,38.110001,37828600,34.934956\n2013-12-09,38.560001,38.869999,38.369999,38.709999,30286000,35.484967\n2013-12-06,38.419998,38.549999,37.990002,38.360001,36457300,35.164128\n2013-12-05,38.849998,38.880001,37.18,38.00,116305000,34.83412\n2013-12-04,38.209999,38.98,38.119999,38.939999,51983600,35.695805\n2013-12-03,38.139999,38.490002,38.080002,38.310001,52109800,35.118294\n2013-12-02,38.09,38.779999,38.060001,38.450001,42950400,35.24663\n2013-11-29,37.82,38.290001,37.82,38.130001,22090400,34.95329\n2013-11-27,37.57,37.759998,37.490002,37.599998,26002100,34.467444\n2013-11-26,37.57,37.650002,37.349998,37.349998,34465300,34.238272\n2013-11-25,37.93,37.950001,37.57,37.639999,30646800,34.504112\n2013-11-22,37.529999,37.68,37.330002,37.57,27982000,34.439944\n2013-11-21,37.27,37.529999,37.259998,37.400002,23064700,34.284109\n2013-11-20,36.919998,37.41,36.860001,37.080002,32229900,33.990769\n2013-11-19,36.849998,37.23,36.669998,36.740002,44275000,33.679095\n2013-11-18,37.349998,37.580002,37.07,37.200001,53277500,33.844099\n2013-11-15,37.950001,38.02,37.720001,37.84,50601300,34.426363\n2013-11-14,37.869999,38.130001,37.720001,38.02,46183700,34.590125\n2013-11-13,36.98,38.16,36.900002,38.16,44957600,34.717494\n2013-11-12,37.380001,37.599998,37.200001,37.360001,31651600,33.989665\n2013-11-11,37.689999,37.779999,37.349998,37.59,26872500,34.198916\n2013-11-08,37.669998,37.779999,37.34,37.779999,36737800,34.371774\n2013-11-07,37.959999,38.009998,37.43,37.50,60437400,34.117035\n2013-11-06,37.240002,38.220001,37.060001,38.18,88948800,34.735691\n2013-11-05,35.790001,36.709999,35.77,36.639999,51681900,33.334617\n2013-11-04,35.59,35.98,35.549999,35.939999,28060700,32.697765\n2013-11-01,35.669998,35.689999,35.389999,35.529999,40264600,32.324752\n2013-10-31,35.66,35.689999,35.34,35.41,41682300,32.215579\n2013-10-30,35.529999,35.790001,35.43,35.540001,36997700,32.333852\n2013-10-29,35.630001,35.720001,35.259998,35.52,31702200,32.315656\n2013-10-28,35.610001,35.73,35.27,35.57,38383600,32.361144\n2013-10-25,35.880001,36.290001,35.470001,35.73,113494000,32.50671\n2013-10-24,33.82,34.099998,33.57,33.720001,53209700,30.678039\n2013-10-23,34.349998,34.490002,33.669998,33.759998,58600500,30.714428\n2013-10-22,35.02,35.099998,34.52,34.580002,40438500,31.460457\n2013-10-21,34.98,35.200001,34.91,34.990002,27433500,31.833469\n2013-10-18,34.82,34.990002,34.330002,34.959999,41811700,31.806173\n2013-10-17,34.450001,34.990002,34.369999,34.919998,31359200,31.769781\n2013-10-16,34.599998,34.900002,34.560001,34.639999,35111600,31.515042\n2013-10-15,34.669998,34.990002,34.470001,34.490002,47097800,31.378576\n2013-10-14,33.900002,34.50,33.779999,34.450001,27757900,31.342183\n2013-10-11,33.68,34.139999,33.68,34.130001,30033300,31.051052\n2013-10-10,33.310001,33.889999,33.259998,33.759998,42875100,30.714428\n2013-10-09,33.07,33.349998,32.959999,33.07,35878600,30.086675\n2013-10-08,33.310001,33.330002,32.799999,33.009998,41017600,30.032087\n2013-10-07,33.599998,33.709999,33.200001,33.299999,35069300,30.295926\n2013-10-04,33.689999,33.990002,33.619999,33.880001,33008100,30.823605\n2013-10-03,33.880001,34.00,33.419998,33.860001,38703800,30.805409\n2013-10-02,33.360001,34.029999,33.290001,33.919998,46946800,30.859994\n2013-10-01,33.349998,33.610001,33.299999,33.580002,36718700,30.550669\n2013-09-30,33.00,33.310001,32.700001,33.279999,39839500,30.27773\n2013-09-27,32.880001,33.75,32.869999,33.27,55348000,30.268634\n2013-09-26,32.639999,33.00,32.59,32.77,28504000,29.81374\n2013-09-25,32.490002,32.799999,32.400002,32.509998,28907500,29.577193\n2013-09-24,32.869999,32.869999,32.150002,32.450001,40685000,29.522608\n2013-09-23,32.540001,32.970001,32.50,32.740002,39826100,29.786447\n2013-09-20,33.41,33.48,32.689999,32.790001,102904900,29.831936\n2013-09-19,33.48,33.68,33.32,33.639999,42026600,30.605254\n2013-09-18,32.990002,33.400002,32.830002,33.32,64099900,30.314122\n2013-09-17,33.419998,33.470001,32.900002,32.93,84716500,29.959306\n2013-09-16,33.380001,33.50,32.73,32.799999,52839700,29.841032\n2013-09-13,32.77,33.07,32.509998,33.029999,40899000,30.050283\n2013-09-12,32.720001,32.779999,32.59,32.689999,32860200,29.740955\n2013-09-11,32.57,32.93,32.529999,32.740002,39087500,29.786447\n2013-09-10,31.90,32.400002,31.790001,32.389999,56881200,29.46802\n2013-09-09,31.219999,31.790001,31.200001,31.66,49628500,28.803875\n2013-09-06,31.309999,31.389999,31.129999,31.15,75434900,28.339883\n2013-09-05,31.10,31.440001,30.950001,31.23,71644900,28.412666\n2013-09-04,31.389999,31.469999,31.110001,31.200001,142320600,28.385374\n2013-09-03,31.75,32.07,31.290001,31.879999,154507000,29.004028\n2013-08-30,33.369999,33.48,33.09,33.400002,42790200,30.386907\n2013-08-29,32.93,33.599998,32.799999,33.549999,45284700,30.523373\n2013-08-28,33.389999,33.599998,33.00,33.02,44257400,30.041187\n2013-08-27,33.52,34.099998,33.150002,33.259998,58522300,30.259534\n2013-08-26,34.400002,34.669998,34.029999,34.150002,72786800,31.069248\n2013-08-23,35.169998,35.200001,34.00,34.75,225493800,31.615119\n2013-08-22,32.189999,32.490002,32.099998,32.389999,31169900,29.46802\n2013-08-21,31.610001,32.009998,31.540001,31.610001,37409100,28.758386\n2013-08-20,31.440001,31.90,31.370001,31.620001,22979600,28.767485\n2013-08-19,31.76,31.969999,31.379999,31.389999,27902500,28.558232\n2013-08-16,31.790001,31.99,31.66,31.799999,32866300,28.931245\n2013-08-15,32.00,32.18,30.84,31.790001,33338000,28.922148\n2013-08-14,32.139999,33.360001,31.700001,32.349998,48519600,29.431627\n2013-08-13,32.509998,32.549999,32.209999,32.23,39464100,29.322454\n2013-08-12,32.459999,32.970001,32.459999,32.869999,25493700,29.695464\n2013-08-09,32.77,32.900002,32.470001,32.700001,26800700,29.541884\n2013-08-08,32.240002,33.07,32.049999,32.889999,59034400,29.713533\n2013-08-07,31.540001,32.099998,31.25,32.060001,38078600,28.963695\n2013-08-06,31.549999,31.67,31.379999,31.58,36331500,28.530052\n2013-08-05,31.90,32.00,31.639999,31.700001,30984000,28.638463\n2013-08-02,31.690001,31.90,31.57,31.889999,29199900,28.810112\n2013-08-01,32.060001,32.09,31.60,31.67,42557900,28.61136\n2013-07-31,31.969999,32.049999,31.709999,31.84,43898400,28.764941\n2013-07-30,31.780001,32.119999,31.549999,31.85,45799500,28.773976\n2013-07-29,31.469999,31.60,31.40,31.540001,28870700,28.493916\n2013-07-26,31.26,31.620001,31.209999,31.620001,38633600,28.566189\n2013-07-25,31.620001,31.65,31.25,31.389999,63213000,28.358401\n2013-07-24,32.040001,32.189999,31.889999,31.959999,52803100,28.873351\n2013-07-23,31.91,32.040001,31.709999,31.82,65810400,28.746873\n2013-07-22,31.700001,32.009998,31.60,32.009998,79040700,28.918521\n2013-07-19,32.400002,32.669998,31.02,31.40,248428500,28.367435\n2013-07-18,35.720001,35.889999,35.220001,35.439999,49547100,32.017257\n2013-07-17,36.34,36.389999,35.490002,35.740002,37285100,32.288287\n2013-07-16,36.009998,36.43,35.959999,36.27,36378500,32.767099\n2013-07-15,35.66,36.220001,35.580002,36.169998,34142600,32.676755\n2013-07-12,35.580002,35.73,35.279999,35.669998,35501200,32.225044\n2013-07-11,35.00,35.77,34.900002,35.689999,53638300,32.243113\n2013-07-10,34.34,34.810001,34.32,34.700001,29658800,31.348727\n2013-07-09,34.580002,34.599998,34.139999,34.349998,25318500,31.032528\n2013-07-08,34.349998,34.59,33.98,34.330002,32396900,31.014462\n2013-07-05,34.09,34.240002,33.580002,34.209999,26085900,30.906049\n2013-07-03,33.66,34.369999,33.599998,34.009998,15994400,30.725364\n2013-07-02,34.41,34.439999,33.630001,33.939999,37630000,30.662125\n2013-07-01,34.75,34.990002,34.330002,34.360001,31055400,31.041564\n2013-06-28,34.380001,34.790001,34.34,34.540001,65545500,31.20418\n2013-06-27,34.52,34.779999,34.50,34.619999,28993100,31.276452\n2013-06-26,34.119999,34.48,33.889999,34.349998,48665900,31.032528\n2013-06-25,34.080002,34.380001,33.459999,33.669998,44073400,30.418201\n2013-06-24,32.939999,34.200001,32.57,33.720001,56109000,30.463375\n2013-06-21,33.66,33.73,33.049999,33.27,85338500,30.056834\n2013-06-20,34.259998,34.330002,33.369999,33.490002,54493700,30.255588\n2013-06-19,34.959999,35.09,34.59,34.59,30816200,31.249351\n2013-06-18,34.970001,35.169998,34.900002,34.98,28616500,31.601684\n2013-06-17,34.689999,35.16,34.630001,35.00,49670100,31.619753\n2013-06-14,34.549999,34.689999,34.25,34.400002,53192600,31.077702\n2013-06-13,34.990002,35.02,34.59,34.720001,45654900,31.366796\n2013-06-12,35.139999,35.27,34.849998,35.00,37372700,31.619753\n2013-06-11,35.049999,35.18,34.68,34.84,39435900,31.475206\n2013-06-10,35.509998,35.650002,35.139999,35.470001,35994500,32.044362\n2013-06-07,35.25,35.779999,35.060001,35.669998,40757300,32.225044\n2013-06-06,34.84,35.110001,34.490002,34.959999,37618500,31.583616\n2013-06-05,34.599998,34.889999,34.43,34.779999,46025100,31.420999\n2013-06-04,35.619999,35.740002,34.77,34.990002,65529500,31.610721\n2013-06-03,34.919998,35.630001,34.830002,35.59,51252600,32.152772\n2013-05-31,34.82,35.279999,34.790001,34.900002,56165700,31.529412\n2013-05-30,34.849998,35.25,34.810001,35.029999,51131000,31.646855\n2013-05-29,34.740002,35.02,34.57,34.880001,38412200,31.511344\n2013-05-28,34.419998,35.18,34.41,35.02,48212100,31.637822\n2013-05-24,33.919998,34.279999,33.900002,34.27,33174400,30.960256\n2013-05-23,34.23,34.549999,33.900002,34.150002,51102700,30.851846\n2013-05-22,34.790001,34.84,34.360001,34.610001,66047500,31.267419\n2013-05-21,35.099998,35.27,34.720001,34.849998,48702400,31.484239\n2013-05-20,34.73,35.099998,34.68,35.080002,54020800,31.692029\n2013-05-17,34.130001,34.869999,34.099998,34.869999,60666700,31.502307\n2013-05-16,33.639999,34.150002,33.549999,34.080002,59382900,30.788607\n2013-05-15,33.450001,33.900002,33.43,33.849998,46303900,30.580817\n2013-05-14,32.860001,33.529999,32.799999,33.529999,56870100,30.291723\n2013-05-13,32.610001,33.07,32.549999,33.029999,36027600,29.632225\n2013-05-10,32.669998,32.720001,32.32,32.689999,36394900,29.3272\n2013-05-09,32.849998,33.00,32.59,32.66,46417800,29.300287\n2013-05-08,33.07,33.240002,32.650002,32.990002,51595700,29.596342\n2013-05-07,33.650002,33.790001,33.240002,33.310001,43078300,29.883424\n2013-05-06,33.419998,33.91,33.25,33.75,40978300,30.27816\n2013-05-03,33.23,33.52,33.080002,33.490002,46784600,30.044908\n2013-05-02,32.630001,33.169998,32.389999,33.16,46059500,29.748853\n2013-05-01,32.93,33.080002,32.599998,32.720001,54330900,29.354117\n2013-04-30,32.560001,33.110001,32.279999,33.099998,75165200,29.695024\n2013-04-29,31.799999,32.68,31.77,32.610001,59116400,29.255432\n2013-04-26,31.90,31.98,31.450001,31.790001,47799300,28.519785\n2013-04-25,31.709999,32.84,31.540001,31.940001,110700200,28.654354\n2013-04-24,30.620001,31.92,30.60,31.76,90946600,28.49287\n2013-04-23,30.700001,30.90,30.379999,30.60,59126900,27.452199\n2013-04-22,30.299999,31.18,30.27,30.83,137904000,27.658538\n2013-04-19,29.620001,30.24,29.610001,29.77,99790700,26.70758\n2013-04-18,28.950001,28.98,28.50,28.790001,56906600,25.828393\n2013-04-17,28.85,29.040001,28.60,28.83,52840700,25.864277\n2013-04-16,28.90,29.139999,28.700001,28.969999,52797300,25.989875\n2013-04-15,28.65,28.98,28.51,28.690001,56332900,25.738679\n2013-04-12,28.85,29.02,28.66,28.790001,62886300,25.828393\n2013-04-11,29.10,29.200001,28.73,28.940001,130923200,25.962962\n2013-04-10,29.57,30.32,29.52,30.280001,71116700,27.165117\n2013-04-09,28.73,29.82,28.68,29.610001,77733800,26.56404\n2013-04-08,28.73,28.73,28.469999,28.59,34759500,25.648966\n2013-04-05,28.219999,28.780001,28.110001,28.700001,50927300,25.747651\n2013-04-04,28.389999,28.610001,28.27,28.60,45263200,25.657937\n2013-04-03,28.75,28.950001,28.540001,28.559999,35062800,25.622051\n2013-04-02,28.59,28.85,28.52,28.799999,28456500,25.837363\n2013-04-01,28.639999,28.66,28.360001,28.610001,29201100,25.666909\n2013-03-28,28.32,28.66,28.26,28.610001,55453800,25.666909\n2013-03-27,28.139999,28.450001,28.08,28.370001,36047400,25.451598\n2013-03-26,28.24,28.34,28.110001,28.16,27824300,25.263199\n2013-03-25,28.299999,28.35,27.959999,28.16,44154000,25.263199\n2013-03-22,28.190001,28.34,28.10,28.25,28720900,25.343941\n2013-03-21,28.110001,28.360001,28.049999,28.110001,34233200,25.218344\n2013-03-20,28.34,28.49,28.18,28.32,35447800,25.40674\n2013-03-19,28.120001,28.219999,28.030001,28.18,51901600,25.281143\n2013-03-18,27.879999,28.280001,27.809999,28.10,44809400,25.209372\n2013-03-15,28.030001,28.16,27.98,28.040001,92710300,25.155545\n2013-03-14,28.00,28.16,27.93,28.139999,55914800,25.245256\n2013-03-13,27.870001,28.02,27.75,27.92,29093400,25.047888\n2013-03-12,27.84,27.950001,27.639999,27.91,39255200,25.038917\n2013-03-11,27.940001,27.969999,27.67,27.870001,36627500,25.003032\n2013-03-08,28.25,28.33,27.959999,28.00,37667800,25.119659\n2013-03-07,28.110001,28.280001,28.01,28.139999,29196700,25.245256\n2013-03-06,28.209999,28.23,27.780001,28.09,51448500,25.200401\n2013-03-05,28.290001,28.540001,28.16,28.35,41432200,25.433655\n2013-03-04,27.85,28.15,27.700001,28.15,38157500,25.254228\n2013-03-01,27.719999,27.98,27.52,27.950001,34849700,25.074803\n2013-02-28,27.879999,27.969999,27.74,27.799999,35840200,24.940232\n2013-02-27,27.42,28.00,27.33,27.809999,36394700,24.949203\n2013-02-26,27.379999,27.60,27.34,27.370001,49923300,24.554467\n2013-02-25,27.969999,28.049999,27.370001,27.370001,48011800,24.554467\n2013-02-22,27.68,27.76,27.48,27.76,31425900,24.904348\n2013-02-21,27.74,27.74,27.23,27.49,49078500,24.662122\n2013-02-20,28.129999,28.200001,27.83,27.870001,44110200,25.003032\n2013-02-19,27.879999,28.09,27.799999,28.049999,38781400,25.164515\n2013-02-15,28.040001,28.16,27.879999,28.01,49650900,24.92229\n2013-02-14,27.92,28.059999,27.870001,28.040001,32663200,24.948984\n2013-02-13,27.93,28.110001,27.879999,28.030001,41715600,24.940086\n2013-02-12,27.879999,28.00,27.75,27.879999,35990900,24.80662\n2013-02-11,27.65,27.92,27.50,27.860001,32247700,24.788826\n2013-02-08,27.35,27.709999,27.309999,27.549999,33318500,24.512998\n2013-02-07,27.35,27.389999,27.10,27.280001,38028300,24.272763\n2013-02-06,27.379999,27.540001,27.25,27.34,41889600,24.326148\n2013-02-05,27.620001,27.66,27.360001,27.50,35410400,24.46851\n2013-02-04,27.870001,28.02,27.42,27.440001,50540000,24.415125\n2013-02-01,27.67,28.049999,27.549999,27.93,55565900,24.851109\n2013-01-31,27.790001,27.969999,27.40,27.450001,50530000,24.424023\n2013-01-30,28.01,28.190001,27.76,27.85,43580500,24.779928\n2013-01-29,27.82,28.129999,27.60,28.01,49242600,24.92229\n2013-01-28,28.01,28.23,27.76,27.91,56056500,24.833313\n2013-01-25,27.58,28.23,27.389999,27.879999,81847700,24.80662\n2013-01-24,27.700001,28.07,27.469999,27.629999,101739300,24.584179\n2013-01-23,27.200001,27.639999,27.200001,27.610001,50387700,24.566385\n2013-01-22,27.299999,27.450001,27.00,27.15,58650600,24.157093\n2013-01-18,27.10,27.290001,27.040001,27.25,52167700,24.246069\n2013-01-17,27.190001,27.469999,27.059999,27.25,51685900,24.246069\n2013-01-16,27.15,27.23,27.01,27.040001,41077400,24.05922\n2013-01-15,26.83,27.290001,26.83,27.209999,48244500,24.210478\n2013-01-14,26.90,27.08,26.76,26.889999,48324400,23.925754\n2013-01-11,26.49,26.93,26.280001,26.83,55512100,23.872368\n2013-01-10,26.65,26.98,26.290001,26.459999,71431300,23.543155\n2013-01-09,26.719999,26.75,26.559999,26.700001,49047900,23.7567\n2013-01-08,26.75,26.790001,26.459999,26.549999,44703100,23.623234\n2013-01-07,26.77,26.879999,26.639999,26.690001,37110400,23.747802\n2013-01-04,27.27,27.34,26.73,26.74,52521100,23.792289\n2013-01-03,27.629999,27.65,27.16,27.25,48294400,24.246069\n2013-01-02,27.25,27.73,27.15,27.620001,52899300,24.575283\n2012-12-31,26.59,26.77,26.370001,26.709999,42749500,23.765596\n2012-12-28,26.709999,26.90,26.549999,26.549999,28239900,23.623234\n2012-12-27,26.889999,27.09,26.57,26.959999,39394000,23.988037\n2012-12-26,27.030001,27.200001,26.700001,26.860001,31631100,23.899062\n2012-12-24,27.200001,27.25,27.00,27.059999,20842400,24.077014\n2012-12-21,27.450001,27.49,27.00,27.450001,98776500,24.424023\n2012-12-20,27.360001,27.68,27.15,27.68,52607300,24.628668\n2012-12-19,27.690001,27.73,27.25,27.309999,53519900,24.299455\n2012-12-18,27.25,27.629999,27.139999,27.559999,50486900,24.521896\n2012-12-17,26.790001,27.219999,26.68,27.10,42046100,24.112605\n2012-12-14,27.110001,27.129999,26.700001,26.809999,42077500,23.854573\n2012-12-13,27.32,27.52,26.950001,27.110001,45080100,24.121503\n2012-12-12,27.530001,27.620001,27.08,27.24,43966300,24.237171\n2012-12-11,27.049999,27.49,27.049999,27.32,52282800,24.308353\n2012-12-10,26.559999,26.969999,26.52,26.940001,47031100,23.970243\n2012-12-07,26.82,26.82,26.370001,26.459999,46162100,23.543155\n2012-12-06,26.809999,26.98,26.610001,26.73,39182300,23.783392\n2012-12-05,26.379999,26.93,26.26,26.67,68283800,23.730006\n2012-12-04,26.50,26.629999,26.34,26.370001,49777500,23.463078\n2012-12-03,26.780001,26.82,26.40,26.43,53173800,23.516463\n2012-11-30,27.049999,27.129999,26.49,26.620001,83690200,23.685519\n2012-11-29,27.110001,27.360001,26.860001,26.950001,69551400,23.979141\n2012-11-28,27.01,27.389999,26.77,27.360001,53018400,24.343944\n2012-11-27,27.360001,27.379999,27.040001,27.08,45018600,24.094809\n2012-11-26,27.540001,27.58,27.17,27.389999,85198700,24.370636\n2012-11-23,27.23,27.77,27.200001,27.700001,57845700,24.646464\n2012-11-21,26.709999,27.17,26.67,26.950001,66360300,23.979141\n2012-11-20,26.76,26.799999,26.459999,26.709999,47070400,23.765596\n2012-11-19,26.799999,26.799999,26.469999,26.73,57179300,23.783392\n2012-11-16,26.67,26.700001,26.34,26.52,64083300,23.596542\n2012-11-15,26.879999,26.969999,26.629999,26.66,50955600,23.721108\n2012-11-14,27.24,27.290001,26.799999,26.84,76086100,23.881266\n2012-11-13,27.02,27.299999,26.75,27.09,131689200,24.103707\n2012-11-12,28.940001,29.01,28.209999,28.219999,61112300,24.904494\n2012-11-09,28.879999,29.190001,28.809999,28.83,43291200,25.442827\n2012-11-08,29.120001,29.370001,28.799999,28.809999,49841800,25.425176\n2012-11-07,29.530001,29.83,29.049999,29.08,57871800,25.663455\n2012-11-06,29.82,30.200001,29.610001,29.860001,43401500,26.351815\n2012-11-05,29.620001,29.74,29.33,29.629999,38070800,26.148836\n2012-11-02,29.59,29.77,29.33,29.50,57131600,26.03411\n2012-11-01,28.84,29.559999,28.82,29.52,72047900,26.051761\n2012-10-31,28.549999,28.879999,28.50,28.540001,69464100,25.186899\n2012-10-26,27.860001,28.34,27.84,28.209999,57790000,24.895669\n2012-10-25,28.190001,28.200001,27.860001,27.879999,54084300,24.60444\n2012-10-24,28.16,28.200001,27.870001,27.90,53320400,24.62209\n2012-10-23,27.77,28.200001,27.76,28.049999,64414800,24.754467\n2012-10-22,28.73,28.83,27.83,28.00,83374000,24.710342\n2012-10-19,29.049999,29.08,28.50,28.639999,90470800,25.275149\n2012-10-18,29.65,29.73,29.26,29.50,59238500,26.03411\n2012-10-17,29.299999,29.639999,29.09,29.59,44206100,26.113536\n2012-10-16,29.450001,29.74,29.32,29.49,47739400,26.025285\n2012-10-15,29.370001,29.719999,29.25,29.51,42440200,26.042936\n2012-10-12,28.969999,29.32,28.799999,29.200001,46464700,25.769357\n2012-10-11,29.219999,29.25,28.870001,28.950001,41488500,25.548729\n2012-10-10,29.15,29.309999,28.950001,28.98,47227100,25.575203\n2012-10-09,29.68,29.74,29.18,29.280001,45121100,25.839958\n2012-10-08,29.639999,29.92,29.549999,29.780001,29752000,26.281214\n2012-10-05,30.23,30.25,29.74,29.85,41133900,26.34299\n2012-10-04,29.969999,30.030001,29.57,30.030001,43634900,26.501842\n2012-10-03,29.75,29.99,29.67,29.860001,46655900,26.351815\n2012-10-02,29.68,29.889999,29.50,29.66,43338900,26.175312\n2012-10-01,29.809999,29.98,29.42,29.49,54042700,26.025285\n2012-09-28,30.18,30.26,29.74,29.76,54229300,26.263564\n2012-09-27,30.17,30.40,29.889999,30.16,47129900,26.616568\n2012-09-26,30.280001,30.60,30.040001,30.17,54672000,26.625393\n2012-09-25,30.950001,31.00,30.360001,30.389999,54266400,26.819546\n2012-09-24,31.00,31.07,30.639999,30.780001,46825900,27.163726\n2012-09-21,31.43,31.610001,31.09,31.190001,102348900,27.525556\n2012-09-20,30.950001,31.48,30.91,31.450001,45543000,27.75501\n2012-09-19,31.09,31.190001,31.040001,31.049999,48871900,27.402004\n2012-09-18,31.10,31.209999,31.030001,31.18,34542700,27.516731\n2012-09-17,31.190001,31.26,31.040001,31.209999,36488500,27.543205\n2012-09-14,31.01,31.25,30.809999,31.209999,51422800,27.543205\n2012-09-13,30.889999,31.18,30.40,30.940001,45047300,27.304928\n2012-09-12,30.940001,31.18,30.73,30.780001,32775800,27.163726\n2012-09-11,30.690001,30.91,30.610001,30.790001,25191800,27.172552\n2012-09-10,30.83,30.90,30.51,30.719999,40524000,27.110775\n2012-09-07,31.040001,31.07,30.73,30.950001,42649100,27.313754\n2012-09-06,30.50,31.360001,30.459999,31.35,48371700,27.666758\n2012-09-05,30.219999,30.530001,30.209999,30.389999,33650000,26.819546\n2012-09-04,30.450001,30.66,30.15,30.389999,48556700,26.819546\n2012-08-31,30.60,30.959999,30.379999,30.82,36590100,27.199026\n2012-08-30,30.530001,30.610001,30.219999,30.32,23982100,26.75777\n2012-08-29,30.65,30.75,30.440001,30.65,23346800,27.048999\n2012-08-28,30.700001,30.799999,30.52,30.629999,23947900,27.031348\n2012-08-27,30.93,30.959999,30.59,30.690001,34691100,27.0843\n2012-08-24,30.25,30.629999,30.18,30.559999,22943300,26.969573\n2012-08-23,30.389999,30.40,30.08,30.26,28355600,26.70482\n2012-08-22,30.59,30.76,30.469999,30.540001,33437400,26.951924\n2012-08-21,30.76,30.959999,30.610001,30.799999,28822700,27.181375\n2012-08-20,30.82,30.85,30.58,30.74,23737700,27.128425\n2012-08-17,30.92,30.92,30.59,30.90,32589900,27.269627\n2012-08-16,30.360001,30.940001,30.26,30.780001,35787200,27.163726\n2012-08-15,30.110001,30.280001,30.02,30.200001,24351000,26.651869\n2012-08-14,30.299999,30.389999,30.01,30.129999,34551400,26.590092\n2012-08-13,30.35,30.459999,30.16,30.389999,23049100,26.643044\n2012-08-10,30.50,30.620001,30.25,30.42,27810300,26.669346\n2012-08-09,30.389999,30.65,30.299999,30.50,24920800,26.739482\n2012-08-08,30.209999,30.469999,30.110001,30.33,26257600,26.590442\n2012-08-07,30.07,30.35,29.870001,30.26,28002900,26.529073\n2012-08-06,30.00,30.110001,29.809999,29.950001,27471800,26.257296\n2012-08-03,29.530001,29.940001,29.48,29.75,35859400,26.081954\n2012-08-02,29.209999,29.530001,28.969999,29.190001,39520500,25.591\n2012-08-01,29.59,29.65,29.209999,29.41,31721800,25.783874\n2012-07-31,29.48,29.709999,29.33,29.469999,37620900,25.836476\n2012-07-30,29.75,29.82,29.459999,29.639999,28905000,25.985516\n2012-07-27,29.48,29.85,29.18,29.76,44242600,26.090721\n2012-07-26,29.23,29.50,29.09,29.16,45301400,25.564698\n2012-07-25,29.24,29.33,28.780001,28.83,45579500,25.275386\n2012-07-24,29.24,29.360001,28.90,29.15,47723300,25.555931\n2012-07-23,29.57,29.58,29.01,29.280001,55151900,25.669904\n2012-07-20,31.00,31.049999,30.049999,30.120001,64021700,26.406335\n2012-07-19,30.51,30.799999,30.379999,30.67,46663200,26.888522\n2012-07-18,29.60,30.450001,29.459999,30.450001,41090400,26.695648\n2012-07-17,29.639999,29.860001,29.200001,29.66,33771300,26.00305\n2012-07-16,29.48,29.530001,29.040001,29.440001,27900600,25.810176\n2012-07-13,28.76,29.48,28.719999,29.389999,39085000,25.76634\n2012-07-12,29.15,29.18,28.540001,28.629999,63523600,25.100044\n2012-07-11,29.709999,29.74,29.110001,29.299999,39184900,25.687436\n2012-07-10,30.08,30.219999,29.51,29.74,37534100,26.073187\n2012-07-09,30.120001,30.23,29.780001,30.00,30680800,26.30113\n2012-07-06,30.610001,30.700001,29.950001,30.190001,38294800,26.467704\n2012-07-05,30.59,30.780001,30.379999,30.700001,28801900,26.914824\n2012-07-03,30.23,30.76,30.17,30.76,20938100,26.967426\n2012-07-02,30.620001,30.620001,30.209999,30.559999,30589100,26.792084\n2012-06-29,30.450001,30.690001,30.139999,30.59,55227200,26.818386\n2012-06-28,29.98,30.049999,29.42,29.91,45328400,26.222227\n2012-06-27,30.190001,30.50,30.030001,30.17,33781700,26.45017\n2012-06-26,30.00,30.27,29.940001,30.02,38421300,26.318665\n2012-06-25,30.299999,30.32,29.620001,29.870001,42217200,26.187159\n2012-06-22,30.299999,30.73,30.030001,30.700001,45098100,26.914824\n2012-06-21,30.959999,31.139999,30.059999,30.139999,48456600,26.423868\n2012-06-20,30.93,31.049999,30.639999,30.93,36257100,27.116465\n2012-06-19,30.190001,31.110001,30.049999,30.700001,75725800,26.914824\n2012-06-18,29.99,30.030001,29.709999,29.84,58679900,26.160857\n2012-06-15,29.59,30.08,29.49,30.02,62314400,26.318665\n2012-06-14,29.33,29.459999,28.879999,29.34,39458900,25.722505\n2012-06-13,29.219999,29.440001,29.049999,29.129999,32984600,25.538397\n2012-06-12,29.10,29.299999,28.84,29.290001,35337900,25.678671\n2012-06-11,29.73,29.809999,28.82,28.90,46361900,25.336755\n2012-06-08,29.209999,29.68,29.049999,29.65,42551100,25.994283\n2012-06-07,29.639999,29.700001,29.17,29.23,37792800,25.626067\n2012-06-06,28.879999,29.370001,28.809999,29.35,46860500,25.731273\n2012-06-05,28.51,28.75,28.389999,28.51,45715400,24.994841\n2012-06-04,28.620001,28.780001,28.32,28.549999,47926300,25.029908\n2012-06-01,28.76,28.959999,28.440001,28.450001,56634300,24.942239\n2012-05-31,29.299999,29.42,28.940001,29.190001,39134000,25.591\n2012-05-30,29.35,29.48,29.120001,29.34,41585500,25.722505\n2012-05-29,29.379999,29.719999,29.219999,29.559999,37758800,25.91538\n2012-05-25,29.200001,29.360001,29.01,29.059999,29507200,25.477028\n2012-05-24,29.16,29.299999,28.76,29.07,52575000,25.485795\n2012-05-23,29.35,29.40,28.639999,29.110001,65171000,25.520864\n2012-05-22,29.690001,29.879999,29.50,29.76,39504900,26.090721\n2012-05-21,29.10,29.790001,29.059999,29.75,38787900,26.081954\n2012-05-18,29.790001,29.809999,29.17,29.27,56205300,25.661136\n2012-05-17,29.99,30.209999,29.709999,29.719999,48484000,26.055652\n2012-05-16,30.309999,30.32,29.74,29.90,60083700,26.213459\n2012-05-15,30.639999,30.799999,30.15,30.209999,61822800,26.485237\n2012-05-14,30.82,31.040001,30.639999,30.68,40528900,26.721947\n2012-05-11,30.690001,31.540001,30.690001,31.16,43459300,27.140022\n2012-05-10,30.860001,31.02,30.450001,30.74,43839200,26.774206\n2012-05-09,30.190001,30.83,30.10,30.76,50309300,26.791626\n2012-05-08,30.48,30.780001,30.17,30.50,46328300,26.565169\n2012-05-07,30.700001,30.860001,30.57,30.65,48641400,26.695817\n2012-05-04,31.450001,31.57,30.92,30.98,57927200,26.983243\n2012-05-03,31.879999,31.90,31.610001,31.76,31501300,27.662615\n2012-05-02,31.85,31.93,31.639999,31.799999,37385300,27.697454\n2012-05-01,32.049999,32.34,31.950001,32.009998,43832300,27.880361\n2012-04-30,31.98,32.110001,31.92,32.02,35697200,27.889073\n2012-04-27,32.119999,32.220001,31.879999,31.98,41419100,27.854232\n2012-04-26,32.119999,32.23,31.92,32.110001,40308100,27.967462\n2012-04-25,31.92,32.32,31.870001,32.200001,62495500,28.045851\n2012-04-24,32.209999,32.52,31.83,31.92,40871100,27.801974\n2012-04-23,32.310001,32.50,32.029999,32.119999,61398200,27.97617\n2012-04-20,32.150002,32.889999,32.049999,32.419998,106045000,28.237466\n2012-04-19,31.129999,31.68,30.940001,31.01,54781200,27.009374\n2012-04-18,31.280001,31.309999,31.040001,31.139999,40552900,27.122601\n2012-04-17,31.27,31.610001,31.200001,31.440001,34361500,27.383899\n2012-04-16,30.99,31.190001,30.77,31.08,38124800,27.070343\n2012-04-13,30.889999,31.16,30.719999,30.809999,39749200,26.835175\n2012-04-12,30.48,31.040001,30.42,30.98,38304000,26.983243\n2012-04-11,30.43,30.530001,30.23,30.35,43014000,26.434521\n2012-04-10,31.059999,31.190001,30.299999,30.469999,54131300,26.539039\n2012-04-09,31.219999,31.40,30.969999,31.10,31056400,27.087763\n2012-04-05,31.15,31.629999,31.049999,31.52,50368600,27.453578\n2012-04-04,31.66,31.690001,31.049999,31.209999,49455900,27.18357\n2012-04-03,32.16,32.189999,31.66,31.940001,42752100,27.819394\n2012-04-02,32.220001,32.459999,31.950001,32.290001,35853600,28.12424\n2012-03-30,32.400002,32.41,32.040001,32.259998,31749400,28.098108\n2012-03-29,32.060001,32.189999,31.809999,32.119999,37038500,27.97617\n2012-03-28,32.52,32.700001,32.040001,32.189999,41344800,28.037139\n2012-03-27,32.650002,32.700001,32.400002,32.52,36274900,28.324567\n2012-03-26,32.189999,32.610001,32.150002,32.59,36758300,28.385536\n2012-03-23,32.099998,32.110001,31.719999,32.009998,35912200,27.880361\n2012-03-22,31.809999,32.09,31.790001,32.00,31749500,27.871653\n2012-03-21,31.959999,32.150002,31.82,31.91,37928600,27.793263\n2012-03-20,32.099998,32.150002,31.74,31.99,41566800,27.862943\n2012-03-19,32.540001,32.610001,32.150002,32.200001,44789200,28.045851\n2012-03-16,32.91,32.950001,32.50,32.599998,65626400,28.394245\n2012-03-15,32.790001,32.939999,32.580002,32.849998,49068300,28.611992\n2012-03-14,32.529999,32.880001,32.490002,32.77,41986900,28.542315\n2012-03-13,32.240002,32.689999,32.150002,32.669998,48951700,28.455214\n2012-03-12,31.969999,32.200001,31.82,32.040001,34073600,27.906493\n2012-03-09,32.099998,32.16,31.92,31.99,34628400,27.862943\n2012-03-08,32.040001,32.209999,31.90,32.009998,36747400,27.880361\n2012-03-07,31.67,31.92,31.530001,31.84,34340400,27.732294\n2012-03-06,31.540001,31.98,31.49,31.559999,51932900,27.488417\n2012-03-05,32.009998,32.049999,31.620001,31.799999,45240000,27.697454\n2012-03-02,32.310001,32.439999,32.00,32.080002,47314200,27.941333\n2012-03-01,31.93,32.389999,31.85,32.290001,77344100,28.12424\n2012-02-29,31.889999,32.00,31.610001,31.74,59323600,27.645195\n2012-02-28,31.41,31.93,31.379999,31.870001,45230600,27.758425\n2012-02-27,31.24,31.50,31.10,31.35,34568400,27.30551\n2012-02-24,31.48,31.50,31.24,31.48,35575400,27.418738\n2012-02-23,31.200001,31.59,31.00,31.370001,35034700,27.32293\n2012-02-22,31.450001,31.68,31.18,31.27,49253200,27.235831\n2012-02-21,31.18,31.610001,31.15,31.440001,50829900,27.383899\n2012-02-17,31.200001,31.32,30.950001,31.25,70036500,27.218411\n2012-02-16,30.309999,31.549999,30.299999,31.290001,94705100,27.253251\n2012-02-15,30.33,30.389999,30.030001,30.049999,43311300,26.173223\n2012-02-14,30.33,30.459999,29.85,30.25,59644000,26.347422\n2012-02-13,30.629999,30.77,30.43,30.58,33319800,26.460652\n2012-02-10,30.639999,30.799999,30.360001,30.50,44605300,26.391428\n2012-02-09,30.68,30.799999,30.48,30.77,50481600,26.625058\n2012-02-08,30.26,30.67,30.219999,30.66,49659100,26.529875\n2012-02-07,30.15,30.49,30.049999,30.35,39242400,26.261635\n2012-02-06,30.040001,30.219999,29.969999,30.200001,28039700,26.131841\n2012-02-03,30.139999,30.40,30.09,30.24,41838500,26.166452\n2012-02-02,29.90,30.17,29.709999,29.950001,52223300,25.915518\n2012-02-01,29.790001,30.049999,29.76,29.889999,67409900,25.863599\n2012-01-31,29.66,29.700001,29.23,29.530001,50572400,25.552095\n2012-01-30,28.969999,29.620001,28.83,29.610001,51114800,25.621318\n2012-01-27,29.450001,29.530001,29.17,29.23,44187700,25.292506\n2012-01-26,29.610001,29.700001,29.40,29.50,49102800,25.526135\n2012-01-25,29.07,29.65,29.07,29.559999,59231700,25.578053\n2012-01-24,29.469999,29.57,29.18,29.34,51703300,25.387689\n2012-01-23,29.549999,29.950001,29.35,29.73,76078100,25.725152\n2012-01-20,28.82,29.74,28.75,29.709999,165902900,25.707846\n2012-01-19,28.16,28.440001,28.030001,28.120001,74053500,24.332032\n2012-01-18,28.309999,28.40,27.969999,28.23,64860600,24.427213\n2012-01-17,28.40,28.65,28.17,28.26,72395300,24.453173\n2012-01-13,27.93,28.25,27.790001,28.25,60196100,24.44452\n2012-01-12,27.870001,28.02,27.65,28.00,49370800,24.228196\n2012-01-11,27.43,27.98,27.370001,27.719999,65582400,23.985914\n2012-01-10,27.93,28.15,27.75,27.84,60014400,24.08975\n2012-01-09,28.049999,28.10,27.719999,27.74,59706800,24.00322\n2012-01-06,27.530001,28.190001,27.530001,28.110001,99455500,24.323379\n2012-01-05,27.379999,27.73,27.290001,27.68,56081400,23.951303\n2012-01-04,26.82,27.469999,26.780001,27.40,80516100,23.70902\n2012-01-03,26.549999,26.959999,26.389999,26.77,64731500,23.163887\n2011-12-30,26.00,26.120001,25.91,25.959999,27395700,22.462998\n2011-12-29,25.950001,26.049999,25.860001,26.02,22616900,22.514917\n2011-12-28,26.110001,26.15,25.76,25.82,29822500,22.341858\n2011-12-27,25.959999,26.139999,25.93,26.040001,21287200,22.532223\n2011-12-23,25.91,26.040001,25.73,26.030001,23205800,22.52357\n2011-12-22,25.82,25.860001,25.48,25.809999,35794100,22.333205\n2011-12-21,26.01,26.190001,25.440001,25.76,64132500,22.289941\n2011-12-20,25.860001,26.10,25.809999,26.030001,60767600,22.52357\n2011-12-19,26.02,26.120001,25.459999,25.530001,52258300,22.090924\n2011-12-16,25.67,26.17,25.629999,26.00,101408100,22.497611\n2011-12-15,25.719999,25.879999,25.540001,25.559999,46213900,22.116882\n2011-12-14,25.719999,25.860001,25.57,25.59,47926400,22.142841\n2011-12-13,25.75,26.10,25.65,25.76,54581100,22.289941\n2011-12-12,25.41,25.57,25.290001,25.51,38945900,22.073618\n2011-12-09,25.52,25.870001,25.50,25.700001,53788500,22.238024\n2011-12-08,25.48,25.719999,25.370001,25.40,60522200,21.978435\n2011-12-07,25.67,25.76,25.34,25.60,62667000,22.151494\n2011-12-06,25.809999,25.870001,25.610001,25.66,46175300,22.203411\n2011-12-05,25.780001,25.799999,25.50,25.700001,56818400,22.238024\n2011-12-02,25.59,25.620001,25.16,25.219999,52293800,21.822682\n2011-12-01,25.559999,25.629999,25.200001,25.280001,48545400,21.874601\n2011-11-30,25.370001,25.59,25.139999,25.58,81350900,22.134188\n2011-11-29,24.82,25.040001,24.75,24.84,40917100,21.493871\n2011-11-28,24.940001,24.969999,24.690001,24.870001,46766700,21.519831\n2011-11-25,24.379999,24.67,24.299999,24.299999,26164600,21.026613\n2011-11-23,24.610001,24.790001,24.469999,24.469999,49099700,21.173712\n2011-11-22,24.889999,24.959999,24.65,24.790001,49204500,21.450608\n2011-11-21,25.24,25.25,24.90,25.00,61882500,21.632318\n2011-11-18,25.48,25.50,25.15,25.299999,47626200,21.891905\n2011-11-17,26.01,26.040001,25.440001,25.540001,70977500,22.099577\n2011-11-16,26.469999,26.51,26.040001,26.07,53262800,22.558181\n2011-11-15,26.559999,26.940001,26.40,26.74,43874200,23.137927\n2011-11-14,26.879999,27.00,26.65,26.76,34199200,22.982174\n2011-11-11,26.58,27.08,26.57,26.91,37903000,23.110997\n2011-11-10,26.469999,26.50,26.120001,26.280001,32514400,22.569938\n2011-11-09,26.59,26.75,26.059999,26.200001,62950900,22.501232\n2011-11-08,27.01,27.200001,26.690001,27.16,47822500,23.325704\n2011-11-07,26.209999,26.82,26.129999,26.799999,42589700,23.016526\n2011-11-04,26.379999,26.40,26.00,26.25,36549200,22.544173\n2011-11-03,26.24,26.59,25.98,26.530001,65836100,22.784644\n2011-11-02,26.10,26.200001,25.700001,26.01,53533100,22.338055\n2011-11-01,26.190001,26.32,25.860001,25.99,61182600,22.320878\n2011-10-31,26.76,27.00,26.620001,26.629999,46799000,22.870526\n2011-10-28,27.139999,27.190001,26.790001,26.98,57712100,23.171115\n2011-10-27,27.129999,27.40,26.65,27.25,74512400,23.402998\n2011-10-26,27.030001,27.059999,26.10,26.59,63029900,22.836173\n2011-10-25,27.08,27.23,26.719999,26.809999,53554600,23.025115\n2011-10-24,27.059999,27.40,27.040001,27.190001,56897800,23.351469\n2011-10-21,27.15,27.190001,26.799999,27.16,76620600,23.325704\n2011-10-20,27.26,27.34,26.40,27.040001,76300200,23.222646\n2011-10-19,27.370001,27.469999,27.01,27.129999,42880000,23.299938\n2011-10-18,26.940001,27.40,26.799999,27.309999,52487900,23.454527\n2011-10-17,27.110001,27.42,26.85,26.98,39453300,23.171115\n2011-10-14,27.309999,27.50,27.02,27.27,50947700,23.420175\n2011-10-13,26.76,27.200001,26.620001,27.18,43823500,23.342881\n2011-10-12,27.18,27.309999,26.90,26.959999,52489800,23.153938\n2011-10-11,26.860001,27.07,26.719999,27.00,38826200,23.188292\n2011-10-10,26.58,26.969999,26.469999,26.940001,41815300,23.136763\n2011-10-07,26.34,26.51,26.200001,26.25,52741600,22.544173\n2011-10-06,25.90,26.40,25.700001,26.34,55111400,22.621467\n2011-10-05,25.42,26.16,25.16,25.889999,94061300,22.234995\n2011-10-04,24.299999,25.389999,24.26,25.34,83485400,21.762641\n2011-10-03,24.719999,25.34,24.52,24.530001,64592500,21.066993\n2011-09-30,25.200001,25.50,24.879999,24.889999,54060500,21.376169\n2011-09-29,25.98,26.17,25.09,25.450001,63407300,21.857113\n2011-09-28,25.93,26.370001,25.51,25.58,60736200,21.968759\n2011-09-27,25.66,25.92,25.450001,25.67,55620700,22.046054\n2011-09-26,25.190001,25.52,24.73,25.440001,51057600,21.848524\n2011-09-23,24.90,25.15,24.690001,25.059999,64768100,21.52217\n2011-09-22,25.299999,25.65,24.60,25.059999,96278300,21.52217\n2011-09-21,27.049999,27.059999,25.969999,25.99,72750700,22.320878\n2011-09-20,27.309999,27.50,26.93,26.98,49211900,23.171115\n2011-09-19,26.799999,27.309999,26.60,27.209999,52324900,23.368644\n2011-09-16,27.049999,27.27,26.83,27.120001,89681500,23.291352\n2011-09-15,26.73,27.030001,26.309999,26.99,67808300,23.179703\n2011-09-14,26.17,26.799999,25.889999,26.50,66739200,22.758879\n2011-09-13,25.92,26.190001,25.809999,26.040001,48792300,22.36382\n2011-09-12,25.440001,25.93,25.27,25.889999,55046100,22.234995\n2011-09-09,26.00,26.18,25.50,25.74,64529200,22.106171\n2011-09-08,26.00,26.66,25.950001,26.219999,65811900,22.518407\n2011-09-07,25.690001,26.00,25.57,26.00,41961000,22.329466\n2011-09-06,25.200001,25.59,25.110001,25.51,54929300,21.908642\n2011-09-02,25.780001,26.00,25.66,25.799999,43894400,22.1577\n2011-09-01,26.459999,26.860001,26.209999,26.209999,60510800,22.509819\n2011-08-31,26.290001,26.709999,26.26,26.60,59300800,22.844762\n2011-08-30,25.73,26.43,25.700001,26.23,57341400,22.526996\n2011-08-29,25.530001,25.860001,25.370001,25.84,38863200,22.192054\n2011-08-26,24.51,25.34,24.42,25.25,71957000,21.685347\n2011-08-25,25.08,25.16,24.50,24.57,48192000,21.101345\n2011-08-24,24.65,24.93,24.42,24.90,45329700,21.384758\n2011-08-23,24.030001,24.75,24.030001,24.719999,59670600,21.230169\n2011-08-22,24.42,24.49,23.790001,23.98,54721000,20.594638\n2011-08-19,24.41,24.620001,23.91,24.049999,77397900,20.654756\n2011-08-18,24.57,25.09,24.030001,24.67,105714200,21.187228\n2011-08-17,25.25,25.700001,24.93,25.25,50923700,21.685347\n2011-08-16,25.219999,25.59,25.049999,25.35,54251500,21.77123\n2011-08-15,25.24,25.58,25.15,25.51,56529400,21.77123\n2011-08-12,25.129999,25.34,24.65,25.10,64787100,21.42132\n2011-08-11,24.50,25.379999,24.40,25.190001,90690100,21.49813\n2011-08-10,24.950001,25.09,24.10,24.200001,127819900,20.653225\n2011-08-09,24.709999,25.620001,24.030001,25.58,126268900,21.83097\n2011-08-08,25.02,25.60,24.389999,24.48,134257200,20.892187\n2011-08-05,25.969999,26.10,25.23,25.68,112071700,21.916315\n2011-08-04,26.530001,26.870001,25.93,25.940001,92949500,22.138209\n2011-08-03,26.83,27.00,26.48,26.92,64581200,22.974579\n2011-08-02,26.98,27.450001,26.76,26.799999,63883100,22.872165\n2011-08-01,27.51,27.690001,26.75,27.27,61838400,23.273283\n2011-07-29,27.52,27.709999,27.26,27.40,104394800,23.384229\n2011-07-28,27.290001,28.07,27.209999,27.719999,83761400,23.657329\n2011-07-27,27.879999,27.99,27.200001,27.33,71488700,23.324489\n2011-07-26,27.82,28.15,27.780001,28.08,74636500,23.964568\n2011-07-25,27.26,28.09,27.190001,27.91,108482400,23.819483\n2011-07-22,26.860001,27.549999,26.68,27.530001,76380600,23.495177\n2011-07-21,27.040001,27.309999,26.65,27.10,81737400,23.128198\n2011-07-20,27.280001,27.35,26.98,27.059999,49795400,23.09406\n2011-07-19,26.809999,27.639999,26.780001,27.540001,86730600,23.503712\n2011-07-18,26.629999,26.90,26.26,26.59,44501900,22.692944\n2011-07-15,26.469999,26.93,26.469999,26.780001,49132400,22.855098\n2011-07-14,26.620001,27.01,26.360001,26.469999,46382300,22.590531\n2011-07-13,26.60,26.959999,26.51,26.629999,40861800,22.727081\n2011-07-12,26.549999,26.790001,26.34,26.540001,47319300,22.650273\n2011-07-11,26.620001,26.799999,26.49,26.629999,43999800,22.727081\n2011-07-08,26.540001,26.98,26.51,26.92,58320700,22.974579\n2011-07-07,26.49,26.879999,26.360001,26.77,51946500,22.846563\n2011-07-06,25.969999,26.370001,25.959999,26.33,48744200,22.47105\n2011-07-05,26.10,26.15,25.90,26.030001,37805300,22.215019\n2011-07-01,25.93,26.17,25.84,26.02,52906200,22.206484\n2011-06-30,25.74,26.00,25.66,26.00,52535400,22.189415\n2011-06-29,25.709999,25.709999,25.360001,25.620001,66051000,21.865109\n2011-06-28,25.299999,25.92,25.16,25.799999,81032100,22.018726\n2011-06-27,24.23,25.459999,24.23,25.200001,92044200,21.506664\n2011-06-24,24.51,24.540001,24.190001,24.299999,101387200,20.738568\n2011-06-23,24.440001,24.65,24.200001,24.629999,59470400,21.020203\n2011-06-22,24.60,24.809999,24.59,24.65,44287300,21.037272\n2011-06-21,24.52,24.860001,24.40,24.76,49708700,21.131151\n2011-06-20,24.17,24.66,24.16,24.469999,54338400,20.883653\n2011-06-17,24.219999,24.299999,23.98,24.26,83320400,20.704431\n2011-06-16,23.75,24.10,23.65,24.00,57184100,20.482537\n2011-06-15,24.00,24.01,23.67,23.74,49410200,20.260642\n2011-06-14,24.299999,24.450001,24.190001,24.219999,42894500,20.670293\n2011-06-13,23.790001,24.190001,23.700001,24.040001,47572500,20.516675\n2011-06-10,24.02,24.02,23.690001,23.709999,49327200,20.235039\n2011-06-09,24.01,24.040001,23.82,23.959999,42878700,20.448398\n2011-06-08,23.90,24.02,23.860001,23.940001,42205000,20.431331\n2011-06-07,24.09,24.17,23.90,24.059999,41112600,20.533743\n2011-06-06,23.889999,24.25,23.77,24.01,54778700,20.491071\n2011-06-03,24.049999,24.139999,23.84,23.91,60697700,20.405727\n2011-06-02,24.49,24.65,24.18,24.219999,51487800,20.670293\n2011-06-01,24.99,25.10,24.370001,24.43,74033500,20.849516\n2011-05-31,24.959999,25.059999,24.700001,25.01,60196300,21.34451\n2011-05-27,24.68,24.90,24.65,24.76,50251000,21.131151\n2011-05-26,24.35,25.030001,24.32,24.67,78016600,21.054341\n2011-05-25,24.17,24.309999,24.16,24.190001,34904200,20.644691\n2011-05-24,24.200001,24.290001,24.040001,24.15,47691800,20.610552\n2011-05-23,24.209999,24.25,24.030001,24.17,52692500,20.627621\n2011-05-20,24.719999,24.870001,24.440001,24.49,45451500,20.900722\n2011-05-19,24.85,24.879999,24.50,24.719999,37783600,21.097012\n2011-05-18,24.530001,24.74,24.25,24.690001,53931100,21.07141\n2011-05-17,24.40,24.700001,24.27,24.52,82882100,20.926325\n2011-05-16,24.959999,25.07,24.50,24.57,91350900,20.832447\n2011-05-13,25.280001,25.32,24.950001,25.030001,66812300,21.222473\n2011-05-12,25.35,25.389999,25.10,25.32,77400000,21.468358\n2011-05-11,25.65,25.66,25.209999,25.360001,78600000,21.502274\n2011-05-10,25.379999,25.85,25.25,25.67,120798700,21.765117\n2011-05-09,25.799999,25.959999,25.67,25.83,38696400,21.900777\n2011-05-06,26.07,26.219999,25.75,25.870001,55993000,21.934693\n2011-05-05,26.049999,26.08,25.68,25.790001,55600000,21.866863\n2011-05-04,25.85,26.25,25.790001,26.059999,73292300,22.09579\n2011-05-03,25.60,25.85,25.49,25.809999,71892900,21.883819\n2011-05-02,25.940001,26.00,25.48,25.66,89825600,21.756638\n2011-04-29,26.549999,26.639999,25.360001,25.92,319317900,21.977087\n2011-04-28,26.459999,26.870001,26.40,26.709999,80200000,22.646912\n2011-04-27,26.299999,26.389999,26.129999,26.379999,52689000,22.367112\n2011-04-26,25.74,26.440001,25.67,26.190001,69200000,22.206015\n2011-04-25,25.559999,25.620001,25.34,25.610001,33525100,21.714244\n2011-04-21,25.790001,25.889999,25.360001,25.52,46892300,21.637935\n2011-04-20,25.540001,26.00,25.51,25.76,61608600,21.841426\n2011-04-19,25.00,25.17,24.870001,25.15,38892400,21.324218\n2011-04-18,25.10,25.280001,24.719999,25.08,58045100,21.264866\n2011-04-15,25.459999,25.559999,25.18,25.370001,65080400,21.510753\n2011-04-14,25.42,25.440001,25.09,25.42,55239900,21.553146\n2011-04-13,25.65,25.870001,25.559999,25.629999,38144700,21.731201\n2011-04-12,25.83,25.85,25.549999,25.639999,36920400,21.73968\n2011-04-11,26.190001,26.25,25.799999,25.98,34286300,22.027959\n2011-04-08,26.17,26.280001,25.959999,26.07,39887600,22.104269\n2011-04-07,26.190001,26.26,25.969999,26.200001,46134700,22.214494\n2011-04-06,25.98,26.309999,25.860001,26.15,65581400,22.172099\n2011-04-05,25.82,26.18,25.74,25.780001,73651100,21.858384\n2011-04-04,25.450001,25.66,25.41,25.549999,35433700,21.66337\n2011-04-01,25.530001,25.530001,25.309999,25.48,63114200,21.604019\n2011-03-31,25.60,25.68,25.34,25.389999,63233700,21.527709\n2011-03-30,25.60,25.719999,25.50,25.610001,41999300,21.714244\n2011-03-29,25.34,25.52,25.299999,25.49,40763500,21.612498\n2011-03-28,25.66,25.719999,25.379999,25.41,48973200,21.544667\n2011-03-25,25.93,25.950001,25.59,25.620001,57029800,21.722723\n2011-03-24,25.60,25.870001,25.50,25.809999,38696700,21.883819\n2011-03-23,25.23,25.610001,25.18,25.540001,43969000,21.654893\n2011-03-22,25.299999,25.459999,25.23,25.299999,30895600,21.4514\n2011-03-21,25.18,25.58,25.15,25.33,46878100,21.476837\n2011-03-18,25.059999,25.18,24.799999,24.799999,85486700,21.027459\n2011-03-17,25.059999,25.219999,24.75,24.780001,62497000,21.010503\n2011-03-16,25.219999,25.280001,24.68,24.790001,100725400,21.018982\n2011-03-15,25.08,25.469999,25.00,25.389999,76067300,21.527709\n2011-03-14,25.49,25.76,25.35,25.690001,54473400,21.782075\n2011-03-11,25.41,25.85,25.360001,25.68,49905800,21.773596\n2011-03-10,25.620001,25.709999,25.35,25.41,66549500,21.544667\n2011-03-09,25.809999,25.98,25.66,25.889999,39789100,21.95165\n2011-03-08,25.77,26.02,25.65,25.91,50549800,21.968608\n2011-03-07,26.129999,26.27,25.549999,25.719999,64980400,21.80751\n2011-03-04,26.219999,26.24,25.799999,25.950001,70437200,22.002524\n2011-03-03,26.26,26.40,26.18,26.200001,68271500,22.214494\n2011-03-02,26.110001,26.370001,26.040001,26.08,48658200,22.112748\n2011-03-01,26.60,26.780001,26.15,26.16,60055000,22.180578\n2011-02-28,26.690001,26.860001,26.51,26.58,51379900,22.536689\n2011-02-25,26.91,26.950001,26.50,26.549999,53006300,22.511251\n2011-02-24,26.639999,27.059999,26.50,26.77,64494200,22.697786\n2011-02-23,26.530001,26.860001,26.43,26.59,60234100,22.545168\n2011-02-22,26.780001,27.10,26.52,26.59,60889000,22.545168\n2011-02-18,27.129999,27.209999,26.99,27.059999,68667800,22.943671\n2011-02-17,26.969999,27.370001,26.91,27.209999,57207300,23.070853\n2011-02-16,27.049999,27.07,26.60,27.02,70817900,22.909757\n2011-02-15,27.040001,27.33,26.950001,26.959999,44116500,22.858883\n2011-02-14,27.209999,27.27,26.950001,27.23,56766200,22.95215\n2011-02-11,27.76,27.809999,27.07,27.25,83939700,22.969008\n2011-02-10,27.93,27.940001,27.290001,27.50,76672400,23.179733\n2011-02-09,28.190001,28.26,27.91,27.969999,52905100,23.575895\n2011-02-08,28.10,28.34,28.049999,28.280001,34904200,23.837195\n2011-02-07,27.799999,28.34,27.790001,28.200001,68980900,23.769763\n2011-02-04,27.700001,27.84,27.51,27.77,40412200,23.407316\n2011-02-03,27.969999,27.969999,27.540001,27.65,60340100,23.306168\n2011-02-02,27.93,28.110001,27.879999,27.940001,45824000,23.550609\n2011-02-01,27.799999,28.059999,27.610001,27.99,62810700,23.592754\n2011-01-31,27.77,27.90,27.42,27.73,65029000,23.373599\n2011-01-28,28.90,28.93,27.450001,27.75,141249400,23.390458\n2011-01-27,28.75,29.459999,28.49,28.870001,146938600,24.334506\n2011-01-26,28.51,28.99,28.50,28.780001,74628800,24.258645\n2011-01-25,28.139999,28.450001,28.120001,28.450001,42436600,23.980488\n2011-01-24,28.02,28.559999,27.99,28.379999,52047800,23.921484\n2011-01-21,28.40,28.43,28.02,28.02,58080300,23.618041\n2011-01-20,28.50,28.549999,28.129999,28.35,58613600,23.896198\n2011-01-19,28.459999,28.68,28.27,28.469999,50005900,23.997345\n2011-01-18,28.16,28.74,28.139999,28.66,53322700,24.157496\n2011-01-14,28.08,28.379999,27.91,28.299999,62688400,23.854052\n2011-01-13,28.33,28.389999,28.01,28.190001,67077600,23.761334\n2011-01-12,28.120001,28.59,28.07,28.549999,52631100,24.064777\n2011-01-11,28.200001,28.25,28.049999,28.110001,50298900,23.693902\n2011-01-10,28.26,28.40,28.040001,28.219999,57573600,23.78662\n2011-01-07,28.639999,28.74,28.25,28.60,73762000,24.106923\n2011-01-06,28.040001,28.85,27.860001,28.82,88026300,24.29236\n2011-01-05,27.90,28.01,27.77,28.00,58998700,23.601183\n2011-01-04,27.940001,28.17,27.85,28.09,54405600,23.677044\n2011-01-03,28.049999,28.18,27.92,27.98,53443800,23.584324\n2010-12-31,27.799999,27.92,27.629999,27.91,24752000,23.525322\n2010-12-30,27.92,28.00,27.780001,27.85,20786100,23.474748\n2010-12-29,27.940001,28.120001,27.879999,27.969999,19502500,23.575895\n2010-12-28,27.969999,28.17,27.959999,28.01,23042200,23.609612\n2010-12-27,28.120001,28.200001,27.879999,28.07,21652800,23.660185\n2010-12-23,27.969999,28.32,27.959999,28.299999,24902500,23.854052\n2010-12-22,28.01,28.40,27.98,28.190001,42252300,23.761334\n2010-12-21,27.85,28.139999,27.76,28.07,38153000,23.660185\n2010-12-20,27.950001,27.99,27.68,27.809999,52811000,23.441031\n2010-12-17,27.92,28.09,27.75,27.90,87456500,23.516892\n2010-12-16,27.76,27.99,27.66,27.99,57680200,23.592754\n2010-12-15,27.530001,27.99,27.530001,27.85,69634200,23.474748\n2010-12-14,27.309999,27.75,27.26,27.620001,64070500,23.280882\n2010-12-13,27.27,27.450001,27.17,27.25,47943900,22.969008\n2010-12-10,27.190001,27.40,27.110001,27.34,37625800,23.044869\n2010-12-09,27.280001,27.34,27.01,27.08,47148300,22.825715\n2010-12-08,26.83,27.24,26.799999,27.23,41666800,22.95215\n2010-12-07,27.08,27.129999,26.85,26.870001,57860500,22.648707\n2010-12-06,26.93,26.98,26.76,26.84,36264200,22.62342\n2010-12-03,26.809999,27.059999,26.780001,27.02,52622000,22.775142\n2010-12-02,26.24,26.98,26.200001,26.889999,91759200,22.665564\n2010-12-01,25.57,26.25,25.559999,26.040001,74123500,21.949101\n2010-11-30,25.049999,25.469999,25.00,25.26,75282100,21.291639\n2010-11-29,25.190001,25.42,24.93,25.309999,56603600,21.333783\n2010-11-26,25.209999,25.41,25.17,25.25,21356500,21.283209\n2010-11-24,25.200001,25.459999,25.16,25.370001,56825900,21.384358\n2010-11-23,25.57,25.60,25.09,25.120001,69742500,21.173633\n2010-11-22,25.65,25.74,25.440001,25.73,53350500,21.687801\n2010-11-19,25.799999,25.83,25.60,25.690001,52423200,21.654086\n2010-11-18,25.709999,26.08,25.610001,25.84,59514000,21.78052\n2010-11-17,25.90,25.91,25.549999,25.57,58299700,21.552937\n2010-11-16,26.040001,26.040001,25.65,25.809999,65339200,21.755233\n2010-11-15,26.33,26.50,26.17,26.200001,51794600,21.949101\n2010-11-12,26.469999,26.52,26.10,26.27,64962200,22.007743\n2010-11-11,26.68,26.719999,26.280001,26.68,62073100,22.351222\n2010-11-10,27.01,27.08,26.809999,26.940001,52277300,22.569037\n2010-11-09,26.809999,27.110001,26.709999,26.950001,58538600,22.577415\n2010-11-08,26.68,28.870001,26.58,26.809999,71670800,22.460129\n2010-11-05,27.17,27.190001,26.530001,26.85,110953700,22.49364\n2010-11-04,27.41,27.43,27.01,27.139999,93599300,22.736587\n2010-11-03,27.459999,27.49,26.959999,27.030001,110255300,22.644435\n2010-11-02,27.059999,27.42,27.02,27.389999,54402100,22.946025\n2010-11-01,26.879999,27.219999,26.700001,26.950001,61912100,22.577415\n2010-10-29,27.15,27.200001,26.48,26.67,114193200,22.342844\n2010-10-28,26.209999,26.379999,25.92,26.280001,80730300,22.016121\n2010-10-27,25.790001,26.110001,25.620001,26.049999,64805500,21.823437\n2010-10-26,25.120001,25.969999,25.059999,25.90,69304200,21.697775\n2010-10-25,25.24,25.35,25.17,25.190001,50912400,21.102971\n2010-10-22,25.52,25.540001,25.27,25.379999,25837900,21.262143\n2010-10-21,25.40,25.540001,25.049999,25.42,50032400,21.295654\n2010-10-20,25.26,25.40,25.10,25.309999,56283600,21.203501\n2010-10-19,25.27,25.370001,24.950001,25.10,66150900,21.027574\n2010-10-18,25.59,25.950001,25.450001,25.82,48330500,21.630754\n2010-10-15,25.360001,25.549999,25.23,25.540001,68954800,21.396185\n2010-10-14,25.290001,25.34,25.00,25.23,51949100,21.136481\n2010-10-13,25.02,25.540001,24.889999,25.34,75336500,21.228634\n2010-10-12,24.65,24.93,24.43,24.83,50141500,20.80138\n2010-10-11,24.74,24.74,24.50,24.59,27587800,20.60032\n2010-10-08,24.620001,24.65,24.370001,24.57,41327800,20.583565\n2010-10-07,24.620001,24.75,24.280001,24.530001,50096100,20.550055\n2010-10-06,24.32,24.540001,24.129999,24.43,50489700,20.46628\n2010-10-05,24.059999,24.450001,23.91,24.35,78152900,20.39926\n2010-10-04,23.959999,23.99,23.780001,23.91,98143400,20.030648\n2010-10-01,24.77,24.82,24.299999,24.379999,62672300,20.424391\n2010-09-30,24.610001,24.83,24.360001,24.49,61262700,20.516544\n2010-09-29,24.629999,24.66,24.40,24.50,44318900,20.524922\n2010-09-28,24.799999,24.90,24.35,24.68,56041200,20.675718\n2010-09-27,24.85,24.99,24.59,24.73,43603300,20.717605\n2010-09-24,24.639999,24.799999,24.58,24.780001,51948800,20.759493\n2010-09-23,24.51,24.59,24.360001,24.43,46201800,20.46628\n2010-09-22,24.889999,24.969999,24.360001,24.610001,94299400,20.617075\n2010-09-21,25.42,25.42,25.08,25.15,52675700,21.069461\n2010-09-20,25.280001,25.52,25.110001,25.43,49838700,21.304032\n2010-09-17,25.40,25.530001,25.08,25.219999,70341600,21.128103\n2010-09-16,25.059999,25.370001,25.049999,25.33,44548300,21.220256\n2010-09-15,25.10,25.219999,24.92,25.120001,56201900,21.044329\n2010-09-14,25.040001,25.35,24.889999,25.030001,87160400,20.968931\n2010-09-13,24.200001,25.290001,24.09,25.110001,114680400,21.035951\n2010-09-10,23.98,24.030001,23.790001,23.85,58284300,19.980384\n2010-09-09,24.190001,24.209999,23.99,24.01,46028900,20.114424\n2010-09-08,24.07,24.200001,23.74,23.93,65512400,20.047404\n2010-09-07,24.10,24.299999,23.92,23.959999,51928700,20.072535\n2010-09-03,24.24,24.450001,24.200001,24.290001,64189100,20.348995\n2010-09-02,23.879999,23.950001,23.709999,23.940001,48837100,20.055782\n2010-09-01,23.67,23.950001,23.540001,23.90,65235900,20.022271\n2010-08-31,23.60,23.73,23.32,23.469999,66074600,19.662037\n2010-08-30,23.74,23.82,23.60,23.639999,45453100,19.804455\n2010-08-27,23.879999,24.02,23.51,23.93,60939400,20.047404\n2010-08-26,24.09,24.190001,23.790001,23.82,49105300,19.955251\n2010-08-25,24.00,24.219999,23.870001,24.10,47404800,20.189822\n2010-08-24,24.09,24.35,24.00,24.040001,66522500,20.139557\n2010-08-23,24.440001,24.639999,24.24,24.280001,51643000,20.340617\n2010-08-20,24.309999,24.40,24.200001,24.23,49560100,20.298729\n2010-08-19,24.620001,24.74,24.209999,24.440001,54064600,20.474657\n2010-08-18,24.68,24.950001,24.41,24.82,46818900,20.793003\n2010-08-17,24.709999,24.959999,24.60,24.709999,52912600,20.700849\n2010-08-16,24.360001,24.610001,24.299999,24.50,40909700,20.416015\n2010-08-13,24.35,24.67,24.24,24.40,45263500,20.332684\n2010-08-12,24.42,24.68,24.360001,24.49,70240500,20.407682\n2010-08-11,24.68,24.90,24.559999,24.860001,76746900,20.716006\n2010-08-10,25.33,25.34,24.879999,25.07,87257700,20.890999\n2010-08-09,25.549999,25.73,25.370001,25.610001,57096500,21.340986\n2010-08-06,25.18,25.559999,25.02,25.549999,55982100,21.290986\n2010-08-05,25.49,25.58,25.209999,25.370001,64922100,21.140992\n2010-08-04,26.15,26.24,25.440001,25.73,78531900,21.440982\n2010-08-03,26.200001,26.35,25.969999,26.16,56877700,21.799304\n2010-08-02,25.99,26.379999,25.75,26.33,55044600,21.940966\n2010-07-30,25.75,25.84,25.35,25.809999,83534800,21.507646\n2010-07-29,26.129999,26.41,25.60,26.030001,69446200,21.690975\n2010-07-28,26.07,26.190001,25.83,25.950001,69704800,21.62431\n2010-07-27,26.139999,26.24,25.959999,26.16,60672100,21.799304\n2010-07-26,25.860001,26.200001,25.799999,26.10,67249900,21.749306\n2010-07-23,25.84,26.02,25.25,25.809999,108520100,21.507646\n2010-07-22,25.51,25.99,25.469999,25.84,73016400,21.532646\n2010-07-21,25.60,25.65,24.98,25.120001,73297300,20.932666\n2010-07-20,24.860001,25.48,24.700001,25.48,45530700,21.232655\n2010-07-19,24.959999,25.299999,24.91,25.23,38181800,21.024328\n2010-07-16,25.51,25.639999,24.879999,24.889999,65064800,20.741004\n2010-07-15,25.50,25.59,24.98,25.51,56934700,21.257655\n2010-07-14,25.50,25.610001,25.120001,25.440001,72808100,21.199324\n2010-07-13,25.139999,25.299999,24.90,25.129999,61928700,20.940997\n2010-07-12,24.43,24.889999,24.42,24.83,49854200,20.691006\n2010-07-09,24.33,24.41,24.15,24.27,53806100,20.224355\n2010-07-08,24.60,24.620001,23.969999,24.41,50758100,20.341017\n2010-07-07,23.82,24.32,23.610001,24.299999,79965300,20.249353\n2010-07-06,23.700001,24.09,23.58,23.82,73592000,19.849366\n2010-07-02,23.360001,23.48,23.049999,23.27,62485100,19.391048\n2010-07-01,23.09,23.32,22.73,23.16,92239400,19.299384\n2010-06-30,23.299999,23.68,22.950001,23.01,81050500,19.174388\n2010-06-29,24.129999,24.200001,23.110001,23.309999,119882100,19.424379\n2010-06-28,24.51,24.610001,24.120001,24.309999,73784800,20.257686\n2010-06-25,25.049999,25.110001,24.309999,24.530001,156256700,20.441015\n2010-06-24,25.459999,25.719999,24.93,25.00,85243400,20.832668\n2010-06-23,25.780001,25.780001,25.219999,25.309999,61466200,21.090993\n2010-06-22,26.16,26.450001,25.76,25.77,55985400,21.474315\n2010-06-21,26.780001,26.889999,25.889999,25.950001,54625300,21.62431\n2010-06-18,26.370001,26.530001,26.17,26.440001,52075600,22.03263\n2010-06-17,26.559999,26.67,26.040001,26.370001,47995500,21.974299\n2010-06-16,26.469999,26.58,26.23,26.32,48698000,21.932633\n2010-06-15,25.75,26.65,25.74,26.58,81641500,22.149293\n2010-06-14,25.860001,25.959999,25.469999,25.50,50972400,21.249322\n2010-06-11,25.040001,25.719999,24.77,25.66,68057700,21.382651\n2010-06-10,25.129999,25.15,24.780001,25.00,78930900,20.832668\n2010-06-09,25.219999,25.52,24.75,24.790001,87794000,20.657675\n2010-06-08,25.25,25.26,24.65,25.110001,87355000,20.924332\n2010-06-07,25.82,25.83,25.24,25.290001,80456200,21.074328\n2010-06-04,26.10,26.57,25.620001,25.790001,89832200,21.490981\n2010-06-03,26.549999,26.93,26.41,26.860001,67837000,22.382619\n2010-06-02,26.059999,26.48,25.73,26.459999,65718800,22.049295\n2010-06-01,25.530001,26.309999,25.52,25.889999,76152400,21.574311\n2010-05-28,25.84,26.120001,25.66,25.799999,67496900,21.499313\n2010-05-27,25.73,26.360001,25.73,26.00,136433600,21.665975\n2010-05-26,26.23,26.610001,24.559999,25.01,176684100,20.841002\n2010-05-25,25.65,26.33,25.379999,26.07,98373600,21.724306\n2010-05-24,26.85,26.860001,26.26,26.27,73711700,21.890968\n2010-05-21,26.629999,27.110001,26.440001,26.84,117596300,22.365953\n2010-05-20,27.65,27.84,27.040001,27.110001,87991100,22.590946\n2010-05-19,28.52,28.690001,27.790001,28.24,61746700,23.532582\n2010-05-18,28.870001,29.00,28.40,28.60,52690600,23.832573\n2010-05-17,29.120001,29.23,28.450001,28.940001,46053300,24.007566\n2010-05-14,29.200001,29.209999,28.639999,28.93,63334000,23.999271\n2010-05-13,29.26,29.73,29.18,29.24,45188800,24.256435\n2010-05-12,28.98,29.58,28.92,29.440001,47146800,24.422348\n2010-05-11,28.68,29.65,28.57,28.879999,63789400,23.957791\n2010-05-10,29.01,29.48,28.709999,28.940001,86653300,24.007566\n2010-05-07,28.93,28.950001,27.32,28.209999,173718100,23.401984\n2010-05-06,29.59,29.879999,27.91,28.98,128613000,24.040748\n2010-05-05,29.77,30.09,29.690001,29.85,66833800,24.762469\n2010-05-04,30.52,30.549999,29.75,30.129999,82085600,24.994746\n2010-05-03,30.67,31.059999,30.58,30.860001,43989500,25.600328\n2010-04-30,31.07,31.08,30.52,30.540001,63214800,25.334868\n2010-04-29,30.93,31.43,30.67,31.00,52665200,25.716467\n2010-04-28,30.92,31.00,30.620001,30.91,64557900,25.641806\n2010-04-27,30.950001,31.25,30.75,30.85,68730900,25.592032\n2010-04-26,31.00,31.280001,30.860001,31.110001,63649300,25.807719\n2010-04-23,31.120001,31.58,30.65,30.959999,126766600,25.683283\n2010-04-22,31.040001,31.530001,30.90,31.389999,84847600,26.039996\n2010-04-21,31.33,31.50,31.23,31.33,55343100,25.990222\n2010-04-20,31.219999,31.440001,31.129999,31.360001,52199500,26.01511\n2010-04-19,30.77,31.25,30.76,31.040001,64970300,25.74965\n2010-04-16,30.790001,30.98,30.60,30.67,88703100,25.442711\n2010-04-15,30.82,30.950001,30.709999,30.870001,52745400,25.608624\n2010-04-14,30.790001,31.00,30.66,30.82,68941200,25.567145\n2010-04-13,30.15,30.50,30.129999,30.450001,41374600,25.260207\n2010-04-12,30.25,30.49,30.209999,30.32,37068800,25.152363\n2010-04-09,29.950001,30.41,29.90,30.34,54752500,25.168955\n2010-04-08,29.32,29.98,29.299999,29.92,63713800,24.820538\n2010-04-07,29.16,29.559999,29.139999,29.35,58318800,24.347687\n2010-04-06,29.15,29.58,28.98,29.32,47366800,24.3228\n2010-04-05,29.129999,29.43,29.030001,29.27,34331200,24.281322\n2010-04-01,29.35,29.540001,28.620001,29.16,74768100,24.19007\n2010-03-31,29.639999,29.719999,29.17,29.290001,63760000,24.297914\n2010-03-30,29.629999,29.860001,29.50,29.77,34954800,24.696104\n2010-03-29,29.709999,29.82,29.549999,29.59,33336000,24.546782\n2010-03-26,30.09,30.200001,29.59,29.66,55595500,24.604851\n2010-03-25,29.83,30.57,29.799999,30.01,73168700,24.895199\n2010-03-24,29.719999,29.85,29.60,29.65,33987700,24.596556\n2010-03-23,29.59,29.90,29.41,29.879999,42026600,24.787355\n2010-03-22,29.50,29.700001,29.389999,29.60,37718200,24.555078\n2010-03-19,29.76,29.90,29.35,29.59,81332100,24.546782\n2010-03-18,29.629999,29.719999,29.50,29.610001,43845200,24.563374\n2010-03-17,29.50,29.870001,29.40,29.629999,50385700,24.579964\n2010-03-16,29.42,29.49,29.200001,29.370001,36723500,24.364279\n2010-03-15,29.18,29.370001,29.01,29.290001,37512000,24.297914\n2010-03-12,29.32,29.379999,29.040001,29.27,31700200,24.281322\n2010-03-11,28.889999,29.190001,28.85,29.18,35349700,24.206661\n2010-03-10,28.860001,29.110001,28.799999,28.969999,44891400,24.032452\n2010-03-09,28.559999,29.110001,28.549999,28.799999,50271600,23.891426\n2010-03-08,28.52,28.93,28.50,28.629999,39414500,23.750401\n2010-03-05,28.66,28.68,28.42,28.59,56001800,23.717219\n2010-03-04,28.459999,28.65,28.27,28.629999,42890600,23.750401\n2010-03-03,28.51,28.610001,28.35,28.459999,48442100,23.609375\n2010-03-02,29.08,29.299999,28.24,28.459999,93123900,23.609375\n2010-03-01,28.77,29.049999,28.530001,29.02,43805400,24.073931\n2010-02-26,28.65,28.85,28.51,28.67,40370600,23.783584\n2010-02-25,28.27,28.65,28.02,28.60,48735300,23.725515\n2010-02-24,28.52,28.790001,28.379999,28.629999,43165900,23.750401\n2010-02-23,28.68,28.83,28.09,28.33,52266200,23.501532\n2010-02-22,28.84,28.940001,28.65,28.73,36707100,23.833357\n2010-02-19,28.790001,28.92,28.690001,28.77,44451800,23.866541\n2010-02-18,28.59,29.030001,28.51,28.969999,42856500,24.032452\n2010-02-17,28.530001,28.65,28.360001,28.59,45882900,23.717219\n2010-02-16,28.129999,28.370001,28.02,28.35,51935600,23.518124\n2010-02-12,27.809999,28.059999,27.58,27.93,81117200,23.061864\n2010-02-11,27.93,28.40,27.700001,28.120001,65993700,23.218748\n2010-02-10,28.030001,28.24,27.84,27.99,48591300,23.111406\n2010-02-09,27.969999,28.34,27.75,28.01,59195800,23.12792\n2010-02-08,28.01,28.08,27.57,27.719999,52820600,22.888466\n2010-02-05,28.00,28.280001,27.57,28.02,80960100,23.136177\n2010-02-04,28.379999,28.50,27.809999,27.84,77850000,22.987551\n2010-02-03,28.26,28.790001,28.120001,28.629999,61397900,23.639855\n2010-02-02,28.370001,28.50,28.139999,28.459999,54413700,23.499485\n2010-02-01,28.389999,28.48,27.92,28.41,85931100,23.458201\n2010-01-29,29.90,29.92,27.66,28.18,193888500,23.26829\n2010-01-28,29.84,29.870001,28.889999,29.16,117513700,24.077477\n2010-01-27,29.35,29.82,29.02,29.67,63949500,24.498586\n2010-01-26,29.200001,29.85,29.09,29.50,66639900,24.358216\n2010-01-25,29.24,29.66,29.10,29.32,63373000,24.20959\n2010-01-22,30.00,30.200001,28.84,28.959999,102004600,23.912336\n2010-01-21,30.610001,30.719999,30.00,30.01,73086700,24.779325\n2010-01-20,30.809999,30.940001,30.309999,30.59,54849500,25.258232\n2010-01-19,30.75,31.24,30.68,31.10,46575700,25.67934\n2010-01-15,31.08,31.24,30.709999,30.860001,79913200,25.481172\n2010-01-14,30.309999,31.10,30.26,30.959999,63228100,25.563741\n2010-01-13,30.26,30.52,30.01,30.35,51863500,25.060064\n2010-01-12,30.15,30.40,29.91,30.07,65912100,24.828866\n2010-01-11,30.709999,30.76,30.120001,30.27,68754700,24.994007\n2010-01-08,30.280001,30.879999,30.24,30.66,51197400,25.316031\n2010-01-07,30.629999,30.700001,30.190001,30.450001,50559700,25.142634\n2010-01-06,30.879999,31.08,30.52,30.77,58182400,25.406859\n2010-01-05,30.85,31.10,30.639999,30.959999,49749600,25.563741\n2010-01-04,30.620001,31.10,30.59,30.950001,38409100,25.555485\n2009-12-31,30.98,30.99,30.48,30.48,31929700,25.167404\n2009-12-30,31.15,31.290001,30.799999,30.959999,42006200,25.563741\n2009-12-29,31.35,31.50,31.23,31.389999,29716200,25.918793\n2009-12-28,31.00,31.18,30.889999,31.17,25384000,25.737139\n2009-12-24,30.879999,31.00,30.76,31.00,11083900,25.59677\n2009-12-23,30.709999,30.950001,30.690001,30.92,28362700,25.530714\n2009-12-22,30.60,30.93,30.540001,30.82,36321000,25.448143\n2009-12-21,30.40,30.84,30.370001,30.52,40129100,25.200433\n2009-12-18,29.84,30.450001,29.799999,30.360001,94118000,25.068321\n2009-12-17,29.950001,29.959999,29.57,29.60,43691200,24.440787\n2009-12-16,30.07,30.41,30.040001,30.10,55737800,24.853638\n2009-12-15,29.889999,30.209999,29.879999,30.02,49473200,24.787582\n2009-12-14,29.91,30.16,29.90,30.110001,34651200,24.861895\n2009-12-11,29.969999,30.00,29.790001,29.85,43744200,24.647212\n2009-12-10,29.709999,29.959999,29.66,29.870001,45940200,24.663727\n2009-12-09,29.469999,29.809999,29.25,29.709999,44713300,24.531613\n2009-12-08,29.52,29.74,29.379999,29.57,37402200,24.416015\n2009-12-07,29.780001,30.08,29.68,29.790001,38082700,24.597671\n2009-12-04,30.049999,30.370001,29.83,29.98,58810700,24.754553\n2009-12-03,29.84,30.200001,29.76,29.83,43095200,24.630698\n2009-12-02,29.90,29.99,29.65,29.780001,36308600,24.589414\n2009-12-01,29.52,30.049999,29.41,30.01,49904200,24.779325\n2009-11-30,29.15,29.450001,29.00,29.41,44172000,24.283903\n2009-11-27,29.110001,29.389999,28.75,29.219999,29357900,24.127019\n2009-11-25,29.809999,29.860001,29.58,29.790001,32033500,24.597671\n2009-11-24,29.950001,29.99,29.75,29.91,37341400,24.696754\n2009-11-23,29.84,30.01,29.700001,29.940001,41832700,24.721526\n2009-11-20,29.66,29.77,29.43,29.620001,42647100,24.457301\n2009-11-19,29.99,30.00,29.700001,29.780001,51967700,24.589414\n2009-11-18,30.00,30.139999,29.809999,30.110001,59431200,24.861895\n2009-11-17,29.50,30.00,29.469999,30.00,75648900,24.771068\n2009-11-16,29.610001,29.799999,29.370001,29.540001,54129500,24.283905\n2009-11-13,29.469999,29.790001,29.370001,29.629999,53037600,24.357889\n2009-11-12,29.01,29.49,29.00,29.360001,55352400,24.135932\n2009-11-11,29.08,29.299999,29.02,29.120001,49693400,23.938636\n2009-11-10,28.90,29.280001,28.809999,29.01,65881100,23.848208\n2009-11-09,28.620001,29.00,28.530001,28.99,57518000,23.831766\n2009-11-06,28.379999,28.629999,28.200001,28.52,38908500,23.445394\n2009-11-05,28.52,28.74,28.280001,28.469999,52681700,23.40429\n2009-11-04,27.690001,28.389999,27.620001,28.059999,63898400,23.067242\n2009-11-03,27.639999,27.74,27.43,27.530001,50294800,22.631547\n2009-11-02,27.700001,28.049999,27.41,27.879999,62428900,22.919269\n2009-10-30,28.030001,28.40,27.66,27.73,73371800,22.795959\n2009-10-29,28.07,28.41,27.85,28.219999,65225500,23.198773\n2009-10-28,28.24,28.77,27.950001,28.02,73542400,23.03436\n2009-10-27,28.73,28.879999,28.440001,28.59,69685800,23.502939\n2009-10-26,28.129999,29.02,28.110001,28.68,124149700,23.576925\n2009-10-23,29.200001,29.35,27.879999,28.02,281761000,23.03436\n2009-10-22,26.559999,26.719999,26.129999,26.59,61600000,21.858802\n2009-10-21,26.459999,26.75,26.389999,26.58,61672700,21.850581\n2009-10-20,26.42,26.51,25.940001,26.370001,54604700,21.677947\n2009-10-19,26.49,26.58,26.25,26.360001,48143200,21.669726\n2009-10-16,26.450001,26.629999,26.10,26.50,56500900,21.784816\n2009-10-15,25.90,26.709999,25.90,26.709999,65620100,21.957449\n2009-10-14,26.139999,26.200001,25.82,25.959999,45365500,21.340898\n2009-10-13,25.59,25.940001,25.52,25.809999,37749000,21.217588\n2009-10-12,25.66,25.889999,25.549999,25.719999,29145800,21.143602\n2009-10-09,25.57,25.790001,25.459999,25.549999,39520000,21.00385\n2009-10-08,25.440001,25.90,25.219999,25.67,60521300,21.102499\n2009-10-07,24.99,25.18,24.879999,25.10,38472700,20.63392\n2009-10-06,24.68,25.209999,24.66,25.110001,48795300,20.642141\n2009-10-05,24.98,25.059999,24.52,24.639999,60804900,20.255768\n2009-10-02,24.459999,25.09,24.43,24.959999,51219700,20.518829\n2009-10-01,25.41,25.469999,24.799999,24.879999,75958100,20.453064\n2009-09-30,25.76,25.99,25.379999,25.719999,63533400,21.143602\n2009-09-29,25.91,25.959999,25.690001,25.75,39050300,21.168264\n2009-09-28,25.60,26.16,25.60,25.83,44358000,21.23403\n2009-09-25,25.690001,25.82,25.52,25.549999,50158900,21.00385\n2009-09-24,25.92,26.110001,25.66,25.940001,56302900,21.324458\n2009-09-23,25.92,26.25,25.639999,25.709999,60599900,21.135381\n2009-09-22,25.40,25.82,25.290001,25.77,61376700,21.184706\n2009-09-21,25.110001,25.370001,25.10,25.299999,28878700,20.798333\n2009-09-18,25.459999,25.48,25.10,25.26,68016500,20.765451\n2009-09-17,25.059999,25.379999,25.059999,25.299999,42428800,20.798333\n2009-09-16,25.25,25.35,24.950001,25.200001,50055800,20.716127\n2009-09-15,24.969999,25.27,24.860001,25.200001,44716600,20.716127\n2009-09-14,24.65,25.09,24.639999,25.00,42806800,20.551713\n2009-09-11,24.93,25.17,24.809999,24.860001,54303500,20.436624\n2009-09-10,24.799999,25.049999,24.65,25.00,46256000,20.551713\n2009-09-09,24.74,24.950001,24.67,24.780001,49900300,20.370858\n2009-09-08,24.620001,24.84,24.41,24.82,53737100,20.40374\n2009-09-04,24.09,24.799999,24.08,24.620001,44999700,20.239327\n2009-09-03,23.91,24.139999,23.76,24.110001,34120000,19.820072\n2009-09-02,23.82,24.139999,23.780001,23.860001,40771300,19.614555\n2009-09-01,24.35,24.74,23.90,24.00,62608500,19.729644\n2009-08-31,24.57,24.85,24.290001,24.65,49592800,20.263989\n2009-08-28,25.07,25.49,24.610001,24.68,55808000,20.288651\n2009-08-27,24.41,24.780001,24.299999,24.690001,45495600,20.296872\n2009-08-26,24.59,24.75,24.42,24.549999,41079000,20.181781\n2009-08-25,24.60,24.82,24.459999,24.639999,43980300,20.255768\n2009-08-24,24.41,24.73,24.280001,24.639999,54180900,20.255768\n2009-08-21,23.93,24.42,23.77,24.41,69011400,20.066692\n2009-08-20,23.60,23.870001,23.540001,23.67,39505900,19.458362\n2009-08-19,23.25,23.719999,23.25,23.65,41821300,19.44192\n2009-08-18,23.290001,23.65,23.27,23.58,38878900,19.384375\n2009-08-17,23.32,23.60,23.23,23.25,42474400,19.006224\n2009-08-14,23.620001,23.799999,23.51,23.690001,46330200,19.365912\n2009-08-13,23.629999,23.85,23.40,23.620001,38954500,19.308689\n2009-08-12,23.129999,23.90,23.030001,23.530001,61972300,19.235116\n2009-08-11,23.32,23.40,23.049999,23.129999,33615800,18.908126\n2009-08-10,23.459999,23.549999,23.299999,23.42,35261900,19.145194\n2009-08-07,23.75,23.82,23.50,23.559999,46169700,19.259639\n2009-08-06,23.93,23.98,23.27,23.459999,59686000,19.177892\n2009-08-05,23.84,24.25,23.790001,23.809999,53310300,19.464007\n2009-08-04,23.68,23.790001,23.530001,23.77,49218300,19.431309\n2009-08-03,23.82,23.860001,23.50,23.83,46902900,19.480357\n2009-07-31,23.77,24.07,23.50,23.52,54258200,19.226941\n2009-07-30,24.200001,24.43,23.709999,23.809999,67820000,19.464007\n2009-07-29,23.73,23.91,23.34,23.799999,73626900,19.455833\n2009-07-28,22.99,23.549999,22.90,23.469999,70288400,19.186067\n2009-07-27,23.440001,23.450001,22.90,23.110001,80950000,18.891778\n2009-07-24,23.610001,23.889999,22.809999,23.450001,215135700,19.169719\n2009-07-23,24.93,25.719999,24.84,25.559999,106060500,20.894583\n2009-07-22,24.700001,24.90,24.51,24.799999,66192500,20.273305\n2009-07-21,24.690001,24.83,24.370001,24.83,52028400,20.297829\n2009-07-20,24.440001,24.530001,24.15,24.530001,47798000,20.052588\n2009-07-17,24.40,24.450001,24.10,24.290001,52860100,19.856395\n2009-07-16,23.93,24.440001,23.860001,24.440001,64555100,19.979016\n2009-07-15,23.75,24.120001,23.559999,24.120001,67238700,19.717425\n2009-07-14,23.200001,23.219999,22.860001,23.110001,45448700,18.891778\n2009-07-13,22.42,23.290001,22.139999,23.23,67584000,18.989874\n2009-07-10,22.190001,22.540001,22.15,22.389999,43229200,18.303197\n2009-07-09,22.65,22.809999,22.370001,22.440001,46981200,18.344072\n2009-07-08,22.309999,22.690001,22.00,22.559999,73023400,18.442167\n2009-07-07,23.08,23.139999,22.459999,22.530001,52842500,18.417644\n2009-07-06,23.209999,23.280001,22.870001,23.200001,49207700,18.965351\n2009-07-02,23.76,24.040001,23.209999,23.370001,65422200,19.104321\n2009-07-01,24.049999,24.299999,23.959999,24.040001,54908400,19.652027\n2009-06-30,23.969999,24.24,23.629999,23.77,66452400,19.431309\n2009-06-29,23.60,24.030001,23.549999,23.860001,62854900,19.504882\n2009-06-26,23.57,23.690001,23.32,23.35,65126400,19.087971\n2009-06-25,23.43,23.92,23.200001,23.790001,57724300,19.447659\n2009-06-24,23.450001,23.75,23.360001,23.469999,54287700,19.186067\n2009-06-23,23.379999,23.66,23.209999,23.34,56752700,19.079796\n2009-06-22,23.950001,23.950001,23.25,23.280001,71291600,19.030748\n2009-06-19,24.040001,24.34,23.75,24.07,115459000,19.67655\n2009-06-18,23.620001,23.690001,23.299999,23.50,58852200,19.210592\n2009-06-17,23.50,23.82,23.17,23.68,86483100,19.357737\n2009-06-16,23.469999,24.110001,23.440001,23.450001,105295600,19.169719\n2009-06-15,23.23,23.540001,23.02,23.42,69089600,19.145194\n2009-06-12,22.90,23.379999,22.74,23.33,50963500,19.071621\n2009-06-11,22.59,23.26,22.57,22.83,65124600,18.662885\n2009-06-10,22.17,22.620001,22.120001,22.549999,61297200,18.433993\n2009-06-09,22.059999,22.32,21.879999,22.08,50887700,18.049781\n2009-06-08,21.98,22.32,21.629999,22.049999,49000600,18.025257\n2009-06-05,21.959999,22.309999,21.809999,22.139999,59579200,18.098829\n2009-06-04,21.77,21.90,21.58,21.83,42330000,17.845413\n2009-06-03,21.309999,21.76,21.290001,21.73,56039600,17.763666\n2009-06-02,21.360001,21.98,21.200001,21.40,48935700,17.4939\n2009-06-01,21.00,21.50,20.860001,21.40,57317100,17.4939\n2009-05-29,20.559999,20.940001,20.299999,20.889999,46134900,17.076989\n2009-05-28,20.32,20.629999,20.049999,20.450001,45480800,16.717303\n2009-05-27,20.25,20.60,20.07,20.129999,42892900,16.45571\n2009-05-26,19.540001,20.450001,19.450001,20.34,44991700,16.62738\n2009-05-22,19.93,20.17,19.469999,19.75,37318700,16.145072\n2009-05-21,20.139999,20.23,19.51,19.82,58232800,16.202294\n2009-05-20,20.41,20.690001,20.219999,20.379999,47450700,16.660078\n2009-05-19,20.51,20.74,20.25,20.309999,51368300,16.602855\n2009-05-18,20.360001,20.60,20.24,20.60,46073800,16.733652\n2009-05-15,20.129999,20.50,19.98,20.219999,61289900,16.424972\n2009-05-14,19.83,20.23,19.799999,20.059999,54539500,16.295002\n2009-05-13,19.92,20.00,19.67,19.75,49281700,16.043186\n2009-05-12,19.51,20.059999,19.469999,19.889999,71966800,16.156909\n2009-05-11,19.200001,19.73,19.01,19.32,63762600,15.693891\n2009-05-08,19.459999,19.639999,19.139999,19.42,67597600,15.775122\n2009-05-07,19.959999,19.99,19.139999,19.32,68727200,15.693891\n2009-05-06,20.059999,20.07,19.610001,19.790001,59639100,16.075679\n2009-05-05,20.139999,20.24,19.639999,19.790001,66835500,16.075679\n2009-05-04,20.370001,20.40,19.98,20.190001,54313400,16.400604\n2009-05-01,20.190001,20.35,19.860001,20.24,63224500,16.441219\n2009-04-30,20.60,21.10,20.01,20.26,87439900,16.457466\n2009-04-29,20.110001,20.889999,20.059999,20.25,79301600,16.449342\n2009-04-28,20.25,20.27,19.790001,19.93,76685200,16.189402\n2009-04-27,20.549999,20.82,20.280001,20.40,68219600,16.571189\n2009-04-24,19.82,21.200001,19.50,20.91,168478500,16.985469\n2009-04-23,18.92,18.940001,18.469999,18.92,86116300,15.368966\n2009-04-22,18.76,19.190001,18.700001,18.780001,59401000,15.255242\n2009-04-21,18.59,19.08,18.57,18.969999,60928300,15.409581\n2009-04-20,18.889999,18.950001,18.57,18.610001,62937200,15.117149\n2009-04-17,19.690001,19.690001,19.00,19.200001,61398500,15.596414\n2009-04-16,19.16,19.780001,18.99,19.76,67688700,16.051309\n2009-04-15,19.209999,19.25,18.51,18.83,72725500,15.295857\n2009-04-14,19.440001,19.549999,19.00,19.35,63796300,15.718261\n2009-04-13,19.690001,19.85,19.370001,19.59,44444700,15.913216\n2009-04-09,19.450001,19.700001,19.219999,19.67,55759600,15.978201\n2009-04-08,18.969999,19.620001,18.959999,19.190001,56408900,15.588291\n2009-04-07,18.76,19.139999,18.629999,18.76,65815200,15.238996\n2009-04-06,18.540001,18.76,18.27,18.76,47476100,15.238996\n2009-04-03,19.129999,19.15,18.43,18.75,81858400,15.230872\n2009-04-02,19.50,19.889999,19.00,19.290001,99082300,15.669522\n2009-04-01,18.23,19.360001,18.18,19.309999,96438900,15.685767\n2009-03-31,17.83,18.790001,17.780001,18.370001,92423300,14.922194\n2009-03-30,17.74,17.76,17.27,17.48,49633000,14.199234\n2009-03-27,18.540001,18.620001,18.049999,18.129999,47670400,14.727238\n2009-03-26,18.17,18.879999,18.120001,18.83,63775100,15.295857\n2009-03-25,17.98,18.309999,17.52,17.879999,73927100,14.524159\n2009-03-24,18.040001,18.209999,17.84,17.93,50044100,14.564776\n2009-03-23,17.370001,18.59,17.309999,18.33,71600000,14.889701\n2009-03-20,17.32,17.65,16.879999,17.059999,81725500,13.858063\n2009-03-19,17.370001,17.450001,16.92,17.139999,58994600,13.923048\n2009-03-18,17.030001,17.219999,16.60,16.959999,70710700,13.776831\n2009-03-17,16.32,16.90,16.26,16.90,62481000,13.728093\n2009-03-16,16.82,16.959999,16.24,16.25,67028900,13.200089\n2009-03-13,16.98,17.049999,16.18,16.65,82965800,13.525014\n2009-03-12,17.01,17.040001,16.48,17.01,93694100,13.817448\n2009-03-11,16.629999,17.200001,16.43,17.110001,84522200,13.898679\n2009-03-10,15.37,16.620001,15.25,16.48,95184200,13.386921\n2009-03-09,15.20,15.74,15.10,15.15,66479100,12.306545\n2009-03-06,15.35,15.62,14.87,15.28,92821400,12.412145\n2009-03-05,15.86,15.88,15.27,15.27,89708500,12.404023\n2009-03-04,16.120001,16.40,15.89,16.120001,69285100,13.094489\n2009-03-03,16.030001,16.24,15.64,15.88,80476600,12.899534\n2009-03-02,15.96,16.25,15.72,15.79,80602100,12.826425\n2009-02-27,16.290001,16.52,16.10,16.15,93428000,13.118858\n2009-02-26,17.049999,17.08,16.42,16.42,83219500,13.338183\n2009-02-25,17.01,17.24,16.459999,16.959999,105894600,13.776831\n2009-02-24,17.030001,17.35,16.360001,17.17,122674500,13.947418\n2009-02-23,18.02,18.15,17.16,17.209999,70803400,13.979909\n2009-02-20,17.77,18.190001,17.66,18.00,69413800,14.621638\n2009-02-19,18.299999,18.379999,17.809999,17.91,49195600,14.548529\n2009-02-18,18.219999,18.450001,18.00,18.120001,54946900,14.719116\n2009-02-17,18.49,18.50,17.889999,18.09,75853300,14.694746\n2009-02-13,19.27,19.469999,19.040001,19.09,47416000,15.401458\n2009-02-12,18.969999,19.32,18.540001,19.26,75323200,15.538611\n2009-02-11,18.940001,19.49,18.92,19.209999,58599000,15.498271\n2009-02-10,19.25,19.799999,18.700001,18.799999,83953200,15.167491\n2009-02-09,19.639999,19.77,19.26,19.440001,52196400,15.683832\n2009-02-06,19.16,19.93,19.059999,19.66,86746000,15.861324\n2009-02-05,18.51,19.139999,18.25,19.040001,75195200,15.36112\n2009-02-04,18.540001,19.00,18.50,18.629999,75618000,15.030338\n2009-02-03,17.85,18.610001,17.60,18.50,86865100,14.925457\n2009-02-02,17.030001,18.129999,17.00,17.83,88871700,14.384914\n2009-01-30,17.74,17.790001,17.10,17.10,62370900,13.795963\n2009-01-29,17.780001,17.959999,17.559999,17.59,49192800,14.191286\n2009-01-28,17.799999,18.309999,17.76,18.040001,64145500,14.554338\n2009-01-27,17.780001,17.969999,17.43,17.66,61695000,14.247761\n2009-01-26,17.290001,17.809999,17.23,17.629999,92476500,14.223557\n2009-01-23,16.969999,17.49,16.75,17.200001,117020600,13.876642\n2009-01-22,18.049999,18.18,17.07,17.110001,222436600,13.804031\n2009-01-21,18.870001,19.450001,18.459999,19.379999,68340900,15.635424\n2009-01-20,19.459999,19.620001,18.370001,18.48,89873000,14.909321\n2009-01-16,19.629999,19.91,19.15,19.709999,79634100,15.901662\n2009-01-15,19.07,19.299999,18.52,19.24,96169800,15.522475\n2009-01-14,19.530001,19.68,19.01,19.09,80257500,15.401458\n2009-01-13,19.52,19.99,19.52,19.82,65843500,15.990409\n2009-01-12,19.709999,19.790001,19.299999,19.469999,52163500,15.708035\n2009-01-09,20.17,20.299999,19.41,19.52,49815300,15.748375\n2009-01-08,19.629999,20.190001,19.549999,20.120001,70255400,16.232444\n2009-01-07,20.190001,20.290001,19.48,19.51,72709900,15.740307\n2009-01-06,20.75,21.00,20.610001,20.76,58083400,16.748784\n2009-01-05,20.200001,20.67,20.059999,20.52,61475200,16.555156\n2009-01-02,19.530001,20.40,19.370001,20.33,50084000,16.401867\n2008-12-31,19.309999,19.68,19.27,19.440001,46419000,15.683832\n2008-12-30,19.01,19.49,19.00,19.34,43224100,15.603154\n2008-12-29,19.15,19.209999,18.639999,18.959999,58512800,15.296576\n2008-12-26,19.200001,19.33,19.09,19.129999,23101000,15.433729\n2008-12-24,19.26,19.450001,19.10,19.17,16880400,15.466001\n2008-12-23,19.280001,19.57,19.01,19.280001,47511400,15.554747\n2008-12-22,19.24,19.290001,18.889999,19.18,58575400,15.474069\n2008-12-19,19.42,19.799999,19.110001,19.120001,113530400,15.425662\n2008-12-18,19.860001,20.02,18.99,19.299999,80759200,15.570882\n2008-12-17,19.809999,20.049999,19.50,19.66,78922700,15.861324\n2008-12-16,19.209999,20.18,19.00,20.110001,97688700,16.224376\n2008-12-15,19.34,19.440001,18.889999,19.040001,59925900,15.36112\n2008-12-12,19.15,19.85,18.700001,19.360001,78112600,15.61929\n2008-12-11,20.110001,20.120001,19.309999,19.450001,83564300,15.6919\n2008-12-10,20.82,20.959999,20.299999,20.610001,61499000,16.627767\n2008-12-09,20.620001,21.25,20.459999,20.60,80484900,16.619699\n2008-12-08,20.35,21.25,20.139999,21.01,107225000,16.950479\n2008-12-05,18.91,19.98,18.469999,19.870001,91996200,16.030749\n2008-12-04,19.40,19.92,18.790001,19.110001,78719200,15.417594\n2008-12-03,18.65,19.90,18.60,19.870001,80961500,16.030749\n2008-12-02,18.99,19.309999,18.559999,19.15,79689800,15.449865\n2008-12-01,19.879999,19.950001,18.60,18.610001,79639900,15.014204\n2008-11-28,20.23,20.309999,20.02,20.219999,28650800,16.313121\n2008-11-26,19.73,20.68,19.73,20.49,79678300,16.530952\n2008-11-25,20.860001,20.93,19.549999,19.99,92948100,16.127561\n2008-11-24,19.889999,20.940001,19.870001,20.690001,125289900,16.692309\n2008-11-21,18.02,19.700001,17.98,19.68,157231900,15.87746\n2008-11-20,18.120001,18.84,17.50,17.530001,139532800,14.14288\n2008-11-19,19.629999,19.950001,18.25,18.290001,103010500,14.756034\n2008-11-18,19.50,19.66,18.75,19.620001,108966500,15.829053\n2008-11-17,19.74,20.24,19.15,19.32,97289000,15.482136\n2008-11-14,20.559999,21.34,19.65,20.059999,96624500,16.075137\n2008-11-13,20.15,21.25,18.74,21.25,148413700,17.028747\n2008-11-12,20.889999,21.00,20.280001,20.299999,90162300,16.267461\n2008-11-11,21.290001,21.299999,20.790001,21.200001,78014500,16.98868\n2008-11-10,21.85,21.969999,21.190001,21.299999,67106800,17.068814\n2008-11-07,21.32,21.540001,21.00,21.50,71256300,17.229085\n2008-11-06,21.870001,22.08,20.860001,20.879999,95509700,16.732246\n2008-11-05,23.33,23.34,22.049999,22.08,81179700,17.69387\n2008-11-04,23.129999,23.66,22.870001,23.530001,72123000,18.855832\n2008-11-03,22.48,22.91,22.209999,22.620001,61923500,18.126601\n2008-10-31,22.530001,22.91,22.120001,22.33,93055200,17.894208\n2008-10-30,23.690001,23.879999,22.389999,22.629999,95323000,18.134613\n2008-10-29,23.129999,23.969999,22.700001,23.00,111701800,18.431114\n2008-10-28,21.639999,23.209999,21.34,23.10,134088800,18.51125\n2008-10-27,21.67,21.959999,21.02,21.18,117683900,16.972653\n2008-10-24,21.059999,22.860001,20.950001,21.959999,153919700,17.597707\n2008-10-23,21.549999,22.59,20.889999,22.32,154774100,17.886194\n2008-10-22,23.040001,23.059999,20.90,21.530001,150054800,17.253126\n2008-10-21,24.299999,25.01,23.27,23.360001,100385600,18.719602\n2008-10-20,24.200001,24.75,23.01,24.719999,93484300,19.809441\n2008-10-17,23.57,25.110001,23.309999,23.93,133673100,19.176373\n2008-10-16,22.940001,24.190001,21.309999,24.190001,161147800,19.384725\n2008-10-15,23.780001,24.25,22.48,22.66,113280200,18.158654\n2008-10-14,25.639999,25.73,23.60,24.10,165674900,19.312603\n2008-10-13,22.860001,25.50,22.629999,25.50,144935400,20.434496\n2008-10-10,21.790001,22.35,20.65,21.50,228467500,17.229085\n2008-10-09,23.77,23.91,22.07,22.299999,131948700,17.870167\n2008-10-08,22.90,24.299999,22.50,23.01,171598600,18.439128\n2008-10-07,24.98,25.209999,23.139999,23.23,145941200,18.615425\n2008-10-06,25.629999,25.99,24.139999,24.91,146374600,19.961698\n2008-10-03,26.370001,27.469999,26.24,26.32,114289400,21.091605\n2008-10-02,26.18,26.530001,25.700001,26.25,93819800,21.035511\n2008-10-01,26.379999,26.99,26.280001,26.48,88957000,21.219822\n2008-09-30,25.77,26.690001,25.540001,26.690001,107192700,21.388107\n2008-09-29,26.940001,27.66,25.01,25.01,134383100,20.041834\n2008-09-26,26.17,27.559999,26.139999,27.40,100744300,21.957066\n2008-09-25,25.82,26.879999,25.74,26.610001,96203500,21.323998\n2008-09-24,25.58,26.09,25.459999,25.719999,80250300,20.610793\n2008-09-23,25.66,26.17,25.34,25.440001,92181300,20.386416\n2008-09-22,26.219999,26.32,25.32,25.40,105207700,20.354361\n2008-09-19,26.370001,26.40,23.50,25.16,134926100,20.162036\n2008-09-18,24.799999,25.35,24.01,25.26,132291300,20.242172\n2008-09-17,25.73,25.870001,24.50,24.57,106972100,19.689238\n2008-09-16,26.09,26.49,25.52,25.99,111729700,20.827159\n2008-09-15,26.92,27.49,26.73,26.82,82349400,21.492282\n2008-09-12,27.139999,27.74,26.940001,27.620001,75628500,22.133365\n2008-09-11,26.10,27.459999,26.030001,27.34,72913300,21.908986\n2008-09-10,26.52,26.860001,26.25,26.440001,75064900,21.187768\n2008-09-09,26.200001,26.60,26.049999,26.10,85735700,20.915308\n2008-09-08,26.209999,26.33,25.67,26.120001,62110800,20.931336\n2008-09-05,26.030001,26.219999,25.629999,25.65,82305200,20.554699\n2008-09-04,26.74,26.889999,26.35,26.35,66141900,21.115647\n2008-09-03,27.00,27.18,26.84,26.90,57127700,21.55639\n2008-09-02,27.67,27.76,27.059999,27.10,66079200,21.716661\n2008-08-29,27.68,27.780001,27.290001,27.290001,50735500,21.868919\n2008-08-28,27.610001,28.01,27.60,27.940001,48372600,22.389798\n2008-08-27,27.34,27.790001,27.129999,27.559999,33975300,22.085283\n2008-08-26,27.58,27.719999,27.17,27.27,44774400,21.852891\n2008-08-25,27.610001,27.84,27.459999,27.66,51381300,22.165418\n2008-08-22,27.23,27.879999,27.219999,27.84,47930400,22.309662\n2008-08-21,27.10,27.23,26.860001,27.18,43614200,21.780769\n2008-08-20,27.540001,27.58,27.17,27.290001,41497200,21.868919\n2008-08-19,27.540001,27.75,27.27,27.32,40332900,21.892958\n2008-08-18,27.780001,28.049999,27.549999,27.690001,38078200,22.10131\n2008-08-15,27.98,28.15,27.58,27.809999,47267400,22.19709\n2008-08-14,27.82,28.280001,27.559999,27.91,49732300,22.276907\n2008-08-13,28.07,28.50,27.76,27.91,51165200,22.276907\n2008-08-12,27.780001,28.360001,27.58,28.120001,62813000,22.444523\n2008-08-11,27.860001,28.40,27.66,27.90,68743800,22.268925\n2008-08-08,27.35,28.23,27.190001,28.129999,80814100,22.452504\n2008-08-07,26.90,27.75,26.73,27.389999,82565800,21.861859\n2008-08-06,26.73,27.16,26.379999,27.02,95550000,21.566537\n2008-08-05,25.639999,26.280001,25.50,26.209999,84297600,20.920019\n2008-08-04,25.389999,25.549999,25.110001,25.280001,60588300,20.177722\n2008-08-01,25.92,25.950001,25.07,25.440001,82720200,20.305429\n2008-07-31,25.85,26.280001,25.709999,25.719999,60461000,20.528916\n2008-07-30,26.200001,26.49,25.90,26.23,51977700,20.935982\n2008-07-29,25.52,26.190001,25.40,26.110001,66368200,20.840203\n2008-07-28,26.059999,26.110001,25.34,25.50,59707800,20.353319\n2008-07-25,25.639999,26.219999,25.50,26.16,58682300,20.880111\n2008-07-24,26.09,26.17,25.440001,25.440001,81092600,20.305429\n2008-07-23,25.860001,26.84,25.85,26.43,79408800,21.095617\n2008-07-22,25.540001,25.940001,25.48,25.799999,88657200,20.592769\n2008-07-21,25.66,26.17,25.530001,25.639999,77575600,20.465062\n2008-07-18,26.360001,26.469999,25.110001,25.860001,150277000,20.640661\n2008-07-17,27.58,27.91,27.110001,27.52,96526100,21.965622\n2008-07-16,26.129999,27.290001,25.92,27.26,82060400,21.758097\n2008-07-15,24.93,26.639999,24.93,26.15,92719300,20.872129\n2008-07-14,25.48,25.809999,25.07,25.15,51216200,20.073959\n2008-07-11,25.16,25.639999,24.870001,25.25,69532600,20.153777\n2008-07-10,25.200001,25.67,24.98,25.450001,57830600,20.313411\n2008-07-09,25.790001,25.85,25.18,25.23,54255800,20.137813\n2008-07-08,25.93,26.200001,25.51,25.85,65553200,20.632679\n2008-07-07,26.110001,26.389999,25.450001,26.030001,71527600,20.776349\n2008-07-03,25.969999,26.10,25.60,25.98,37074500,20.73644\n2008-07-02,26.90,27.00,25.879999,25.879999,84669000,20.656623\n2008-07-01,27.27,27.379999,26.440001,26.870001,100327800,21.446812\n2008-06-30,27.73,27.98,27.49,27.51,57830500,21.95764\n2008-06-27,27.68,27.91,27.459999,27.629999,73450200,22.053419\n2008-06-26,28.030001,28.200001,27.75,27.75,67049100,22.1492\n2008-06-25,27.809999,28.67,27.76,28.35,64280200,22.628102\n2008-06-24,27.92,28.01,27.51,27.73,65218300,22.133236\n2008-06-23,28.299999,28.41,27.790001,27.969999,57145300,22.324797\n2008-06-20,28.90,28.92,28.10,28.23,97480400,22.532321\n2008-06-19,28.549999,29.190001,28.33,28.93,62037800,23.09104\n2008-06-18,28.549999,28.860001,28.459999,28.459999,49677800,22.7159\n2008-06-17,29.040001,29.120001,28.790001,28.799999,44256700,22.987277\n2008-06-16,29.02,29.110001,28.639999,28.93,74718900,23.09104\n2008-06-13,28.629999,29.57,28.50,29.07,131969100,23.202783\n2008-06-12,27.40,28.549999,27.190001,28.24,113996300,22.540303\n2008-06-11,27.85,27.940001,27.110001,27.120001,59330800,21.646354\n2008-06-10,27.360001,28.290001,27.32,27.889999,77433900,22.260943\n2008-06-09,27.65,27.91,27.299999,27.709999,66787100,22.117273\n2008-06-06,27.99,28.17,27.49,27.49,78500800,21.941676\n2008-06-05,27.719999,28.299999,27.60,28.299999,76063400,22.588193\n2008-06-04,27.280001,27.639999,27.200001,27.540001,79567400,21.981585\n2008-06-03,27.91,28.309999,27.27,27.309999,86616700,21.798005\n2008-06-02,28.24,28.360001,27.549999,27.799999,77028400,22.189108\n2008-05-30,28.379999,28.700001,28.200001,28.32,63399200,22.604156\n2008-05-29,28.209999,28.68,28.139999,28.309999,47699200,22.596175\n2008-05-28,28.559999,28.57,28.040001,28.18,52318500,22.492413\n2008-05-27,28.110001,28.50,28.049999,28.440001,47334500,22.699937\n2008-05-23,28.26,28.33,27.950001,28.049999,48890700,22.38865\n2008-05-22,28.280001,28.700001,28.18,28.469999,52203100,22.723882\n2008-05-21,28.809999,29.049999,28.190001,28.25,60125100,22.548285\n2008-05-20,29.299999,29.309999,28.629999,28.76,75767600,22.955351\n2008-05-19,29.870001,29.889999,29.309999,29.459999,59615000,23.514069\n2008-05-16,30.469999,30.48,29.92,29.99,81538200,23.937099\n2008-05-15,29.98,30.530001,29.940001,30.450001,53355800,24.304258\n2008-05-14,29.889999,30.26,29.73,29.93,66730400,23.88921\n2008-05-13,30.00,30.129999,29.530001,29.780001,70934700,23.769485\n2008-05-12,29.40,30.059999,29.35,29.99,64278800,23.849301\n2008-05-09,29.209999,29.549999,28.950001,29.389999,51621200,23.372155\n2008-05-08,29.280001,29.389999,29.00,29.27,69589900,23.276727\n2008-05-07,29.690001,30.139999,29.08,29.209999,88775000,23.229011\n2008-05-06,29.00,29.860001,28.93,29.700001,93582000,23.618681\n2008-05-05,29.93,30.23,28.99,29.08,119687700,23.125631\n2008-05-02,29.59,29.620001,28.860001,29.24,66024200,23.252869\n2008-05-01,28.50,29.49,28.48,29.40,71699400,23.380108\n2008-04-30,28.74,29.209999,28.51,28.52,74733600,22.680296\n2008-04-29,28.799999,28.90,28.450001,28.639999,84428900,22.775724\n2008-04-28,29.799999,29.84,28.82,28.99,97473000,23.054059\n2008-04-25,30.049999,30.389999,29.60,29.83,145194900,23.722062\n2008-04-24,31.629999,32.099998,31.16,31.799999,115416700,25.288688\n2008-04-23,30.450001,31.459999,30.299999,31.450001,98351500,25.010354\n2008-04-22,30.639999,30.700001,29.969999,30.25,67387500,24.056064\n2008-04-21,30.190001,30.60,30.120001,30.42,54411700,24.191255\n2008-04-18,30.01,30.10,29.610001,30.00,73658900,23.857253\n2008-04-17,29.120001,29.34,28.90,29.219999,48743300,23.236964\n2008-04-16,28.57,29.049999,28.379999,28.950001,54107400,23.02225\n2008-04-15,28.120001,28.48,28.030001,28.25,34310000,22.46558\n2008-04-14,28.24,28.309999,27.93,28.059999,43418100,22.314484\n2008-04-11,28.870001,29.01,28.209999,28.280001,54373700,22.489438\n2008-04-10,28.83,29.40,28.799999,29.110001,65591600,23.149489\n2008-04-09,28.719999,29.040001,28.540001,28.889999,45839300,22.974534\n2008-04-08,28.940001,29.00,28.540001,28.75,44733500,22.863201\n2008-04-07,29.549999,29.59,29.030001,29.16,44428600,23.18925\n2008-04-04,29.129999,29.26,28.74,29.16,43860800,23.18925\n2008-04-03,29.00,29.32,28.799999,29.00,38961400,23.062011\n2008-04-02,29.57,29.58,29.00,29.16,49499400,23.18925\n2008-04-01,28.83,29.540001,28.629999,29.50,65796200,23.459632\n2008-03-31,27.879999,28.59,27.84,28.379999,46780600,22.568961\n2008-03-28,28.23,28.43,27.83,27.91,49244000,22.195198\n2008-03-27,28.48,28.49,28.00,28.049999,47894400,22.306531\n2008-03-26,29.030001,29.07,28.379999,28.559999,45868100,22.712105\n2008-03-25,29.33,29.370001,28.940001,29.139999,49149000,23.173345\n2008-03-24,29.33,29.40,29.059999,29.17,48294700,23.197203\n2008-03-20,28.74,29.219999,28.59,29.18,60170200,23.205155\n2008-03-19,29.379999,29.59,28.620001,28.620001,61442100,22.75982\n2008-03-18,28.67,29.48,28.67,29.42,83695300,23.396013\n2008-03-17,27.299999,28.73,27.280001,28.299999,84490100,22.505342\n2008-03-14,28.719999,29.01,27.639999,27.959999,105214900,22.234959\n2008-03-13,28.540001,28.99,28.16,28.620001,84552200,22.75982\n2008-03-12,29.43,29.49,28.540001,28.629999,75993800,22.767771\n2008-03-11,28.40,29.34,28.379999,29.280001,98740700,23.28468\n2008-03-10,27.83,28.26,27.75,28.049999,72175100,22.306531\n2008-03-07,27.34,28.07,27.32,27.870001,77597600,22.163389\n2008-03-06,28.059999,28.17,27.50,27.57,91127700,21.924815\n2008-03-05,27.75,28.41,27.700001,28.120001,106489800,22.362199\n2008-03-04,27.02,27.629999,26.959999,27.59,86925600,21.940721\n2008-03-03,27.24,27.389999,26.870001,26.99,76544300,21.463575\n2008-02-29,27.690001,27.83,27.02,27.200001,117411400,21.630577\n2008-02-28,28.02,28.27,27.799999,27.93,83002900,22.211103\n2008-02-27,28.190001,28.68,28.10,28.26,75199500,22.473533\n2008-02-26,27.74,28.860001,27.67,28.379999,108923500,22.568961\n2008-02-25,27.65,28.24,27.48,27.84,109974300,22.139531\n2008-02-22,28.24,28.389999,27.200001,27.68,125705400,22.012293\n2008-02-21,28.620001,28.959999,27.959999,28.10,98776500,22.346294\n2008-02-20,28.15,28.26,27.92,28.219999,93056200,22.441722\n2008-02-19,28.799999,28.84,28.07,28.17,68261200,22.401961\n2008-02-15,28.309999,28.639999,28.25,28.42,68166100,22.513295\n2008-02-14,28.879999,29.040001,28.459999,28.50,69113500,22.576668\n2008-02-13,28.620001,29.049999,28.530001,28.959999,88986200,22.941063\n2008-02-12,28.43,28.620001,28.110001,28.34,84365900,22.449922\n2008-02-11,28.52,28.610001,27.91,28.209999,156814100,22.34694\n2008-02-08,28.290001,29.08,28.24,28.559999,124872000,22.624197\n2008-02-07,28.34,28.780001,27.90,28.120001,164964900,22.275646\n2008-02-06,29.280001,29.35,28.290001,28.52,138315600,22.592512\n2008-02-05,29.91,29.940001,28.889999,29.07,137534100,23.028201\n2008-02-04,30.49,30.719999,30.110001,30.190001,119998600,23.915425\n2008-02-01,31.059999,33.25,30.25,30.450001,291138900,24.121388\n2008-01-31,31.91,32.740002,31.719999,32.599998,103642200,25.824538\n2008-01-30,32.560001,32.799999,32.049999,32.200001,106432600,25.507675\n2008-01-29,32.849998,32.889999,32.349998,32.599998,68023000,25.824538\n2008-01-28,33.02,33.099998,32.419998,32.720001,81019000,25.9196\n2008-01-25,34.900002,35.00,32.869999,32.939999,196992300,26.093874\n2008-01-24,32.349998,33.360001,32.119999,33.25,155640400,26.339446\n2008-01-23,31.48,32.049999,31.040001,31.93,137597400,25.29379\n2008-01-22,31.540001,32.529999,31.50,31.959999,108521400,25.317554\n2008-01-18,33.16,34.00,32.970001,33.009998,117062000,26.149325\n2008-01-17,33.540001,33.799999,32.970001,33.110001,94247800,26.228544\n2008-01-16,33.419998,33.650002,32.509998,33.23,120778500,26.323602\n2008-01-15,34.029999,34.380001,34.00,34.00,61606200,26.933569\n2008-01-14,34.459999,34.57,34.080002,34.389999,52792200,27.242512\n2008-01-11,34.139999,34.240002,33.720001,33.91,55187900,26.862274\n2008-01-10,34.349998,34.50,33.779999,34.330002,72446000,27.194984\n2008-01-09,33.360001,34.540001,33.349998,34.439999,74305500,27.28212\n2008-01-08,34.709999,34.709999,33.400002,33.450001,79148300,26.497879\n2008-01-07,34.549999,34.799999,34.25,34.610001,80164300,27.416789\n2008-01-04,35.189999,35.200001,34.09,34.380001,72090800,27.234592\n2008-01-03,35.220001,35.650002,34.860001,35.369999,49599600,28.018832\n2008-01-02,35.790001,35.959999,35.00,35.220001,63004200,27.90001\n2007-12-31,35.900002,35.990002,35.52,35.599998,35229700,28.20103\n2007-12-28,36.099998,36.23,35.669998,36.119999,33447200,28.612955\n2007-12-27,36.349998,36.549999,35.939999,35.970001,33311100,28.494132\n2007-12-26,36.41,36.639999,36.259998,36.610001,30252400,29.001117\n2007-12-24,36.130001,36.720001,36.049999,36.580002,29622600,28.977353\n2007-12-21,35.900002,36.060001,35.75,36.060001,83240500,28.565427\n2007-12-20,35.290001,35.790001,35.080002,35.52,59345000,28.137658\n2007-12-19,34.689999,35.139999,34.380001,34.790001,58469100,27.559379\n2007-12-18,34.639999,35.00,34.209999,34.740002,52791800,27.519771\n2007-12-17,35.029999,35.130001,34.360001,34.389999,58121200,27.242512\n2007-12-14,35.049999,35.84,35.009998,35.310001,71126200,27.971304\n2007-12-13,34.48,35.450001,34.279999,35.220001,73913200,27.90001\n2007-12-12,34.610001,35.09,33.93,34.470001,63345400,27.305887\n2007-12-11,34.73,34.990002,33.93,34.099998,55070700,27.012784\n2007-12-10,34.639999,34.950001,34.470001,34.759998,36083500,27.535612\n2007-12-07,34.610001,34.700001,34.220001,34.529999,40771000,27.353415\n2007-12-06,34.259998,34.610001,33.869999,34.549999,49209700,27.369258\n2007-12-05,33.139999,34.52,33.029999,34.150002,84894700,27.052395\n2007-12-04,32.740002,33.240002,32.630001,32.77,54801500,25.959208\n2007-12-03,33.50,33.639999,32.68,32.919998,61770600,26.07803\n2007-11-30,33.919998,34.119999,33.189999,33.599998,71027800,26.616702\n2007-11-29,33.580002,33.93,33.310001,33.59,53633600,26.608782\n2007-11-28,33.380001,33.889999,32.900002,33.700001,88585000,26.69592\n2007-11-27,33.27,33.599998,32.68,33.060001,84178400,26.188936\n2007-11-26,34.09,34.369999,32.93,32.970001,80335000,26.117641\n2007-11-23,34.360001,34.439999,33.709999,34.110001,33467200,27.020707\n2007-11-21,34.400002,34.73,34.18,34.23,89518700,27.115766\n2007-11-20,34.23,34.970001,34.099998,34.580002,100009400,27.393025\n2007-11-19,33.959999,34.240002,33.869999,33.959999,63026200,26.901882\n2007-11-16,33.860001,34.259998,33.709999,34.09,71113800,27.004864\n2007-11-15,33.759998,34.099998,33.549999,33.759998,64014100,26.743448\n2007-11-14,34.619999,34.75,33.75,33.93,84063100,26.878118\n2007-11-13,33.540001,34.669998,33.380001,34.459999,104311500,27.297963\n2007-11-12,33.32,33.709999,33.02,33.380001,84865200,26.355289\n2007-11-09,34.18,34.540001,33.650002,33.73,125136900,26.631632\n2007-11-08,35.599998,35.900002,34.400002,34.740002,133742400,27.429082\n2007-11-07,36.040001,36.16,35.450001,35.52,74897800,28.044933\n2007-11-06,36.59,36.66,35.869999,36.41,100966700,28.747635\n2007-11-05,36.759998,37.099998,36.630001,36.73,75485400,29.000292\n2007-11-02,37.220001,37.50,36.419998,37.060001,96389800,29.260846\n2007-11-01,36.529999,37.490002,36.360001,37.060001,152078800,29.260846\n2007-10-31,35.52,37.00,35.509998,36.810001,185635800,29.063457\n2007-10-30,34.369999,35.59,34.349998,35.57,107297300,28.08441\n2007-10-29,34.849998,35.290001,34.450001,34.57,114655600,27.294857\n2007-10-26,36.009998,36.029999,34.560001,35.029999,288121200,27.658051\n2007-10-25,31.57,32.220001,31.49,31.99,169588700,25.257809\n2007-10-24,30.85,31.299999,30.50,31.25,77979200,24.67354\n2007-10-23,30.709999,31.120001,30.709999,30.90,49956200,24.397196\n2007-10-22,30.120001,30.700001,30.120001,30.51,58785100,24.089271\n2007-10-19,31.09,31.09,30.110001,30.17,75200200,23.820823\n2007-10-18,31.219999,31.23,30.629999,31.16,49208600,24.60248\n2007-10-17,30.75,31.23,30.65,31.08,86092400,24.539316\n2007-10-16,30.24,30.58,30.23,30.32,56286200,23.939255\n2007-10-15,30.10,30.33,30.00,30.040001,47150500,23.718181\n2007-10-12,30.030001,30.40,29.950001,30.17,31121100,23.820823\n2007-10-11,30.299999,30.629999,29.790001,29.91,50788400,23.615539\n2007-10-10,30.040001,30.370001,30.030001,30.23,32251500,23.868195\n2007-10-09,30.030001,30.389999,30.00,30.10,63603100,23.765554\n2007-10-08,29.66,29.85,29.60,29.84,30265400,23.56027\n2007-10-05,29.889999,29.99,29.73,29.84,45012300,23.56027\n2007-10-04,29.559999,29.77,29.440001,29.709999,37868000,23.457627\n2007-10-03,29.709999,29.85,29.290001,29.450001,37633900,23.252345\n2007-10-02,29.700001,29.85,29.57,29.700001,33700900,23.449733\n2007-10-01,29.459999,29.790001,29.41,29.77,43875100,23.505002\n2007-09-28,29.49,29.690001,29.23,29.459999,45819100,23.260239\n2007-09-27,29.700001,29.719999,29.440001,29.49,43407100,23.283926\n2007-09-26,29.68,29.85,29.48,29.50,60337000,23.291822\n2007-09-25,29.139999,29.559999,29.110001,29.559999,75621000,23.339195\n2007-09-24,28.809999,29.610001,28.799999,29.08,104459800,22.960209\n2007-09-21,28.690001,28.809999,28.440001,28.65,135636100,22.620701\n2007-09-20,28.48,28.58,28.34,28.42,67168900,22.439104\n2007-09-19,28.870001,28.91,28.299999,28.67,94242200,22.636493\n2007-09-18,28.700001,28.969999,28.27,28.93,77462400,22.841777\n2007-09-17,28.790001,28.879999,28.620001,28.73,39536500,22.683866\n2007-09-14,28.98,29.110001,28.879999,29.040001,33496600,22.928628\n2007-09-13,29.120001,29.26,28.959999,29.16,35288600,23.023374\n2007-09-12,28.809999,29.17,28.799999,28.93,42364700,22.841777\n2007-09-11,28.629999,28.950001,28.58,28.93,34380800,22.841777\n2007-09-10,28.67,28.75,28.41,28.48,37247600,22.486477\n2007-09-07,28.620001,28.83,28.32,28.440001,52160900,22.454896\n2007-09-06,28.559999,29.01,28.549999,28.91,45430800,22.825985\n2007-09-05,28.65,28.73,28.42,28.48,47669800,22.486477\n2007-09-04,28.50,29.10,28.48,28.809999,45689600,22.74703\n2007-08-31,28.700001,28.92,28.360001,28.73,42511900,22.683866\n2007-08-30,28.42,28.93,28.32,28.450001,33690700,22.462792\n2007-08-29,28.129999,28.610001,27.82,28.59,45753700,22.573329\n2007-08-28,28.299999,28.49,27.91,27.93,43924400,22.052223\n2007-08-27,28.610001,28.77,28.40,28.49,32789500,22.494373\n2007-08-24,28.209999,28.84,28.07,28.809999,45158900,22.74703\n2007-08-23,28.280001,28.33,28.10,28.299999,33886600,22.344357\n2007-08-22,28.27,28.32,28.01,28.219999,44763500,22.281193\n2007-08-21,28.10,28.32,27.870001,28.07,50786200,22.16276\n2007-08-20,28.18,28.49,28.08,28.26,49952000,22.312776\n2007-08-17,28.09,28.25,27.82,28.25,76747700,22.30488\n2007-08-16,27.879999,28.35,27.51,27.809999,81447400,21.957476\n2007-08-15,28.24,28.99,28.049999,28.10,48117700,22.186448\n2007-08-14,28.77,28.889999,28.200001,28.27,42944100,22.320672\n2007-08-13,28.940001,28.99,28.440001,28.629999,55492300,22.525954\n2007-08-10,28.90,29.049999,28.26,28.709999,76576200,22.588898\n2007-08-09,29.639999,30.10,28.92,29.299999,72964500,23.053107\n2007-08-08,29.719999,30.01,29.209999,30.00,52898600,23.603865\n2007-08-07,29.33,29.790001,29.049999,29.549999,49163000,23.249806\n2007-08-06,29.049999,29.540001,28.75,29.540001,59530500,23.24194\n2007-08-03,29.450001,29.780001,28.90,28.959999,61535500,22.785597\n2007-08-02,29.190001,29.790001,29.02,29.52,47938300,23.226203\n2007-08-01,28.950001,29.549999,28.82,29.299999,80006300,23.053107\n2007-07-31,29.709999,29.719999,28.98,28.99,66554000,22.809201\n2007-07-30,29.41,29.49,28.950001,29.40,67499600,23.131787\n2007-07-27,29.93,30.00,29.360001,29.389999,69214600,23.123919\n2007-07-26,30.24,30.530001,29.51,29.98,87025300,23.588129\n2007-07-25,30.99,31.299999,30.370001,30.709999,54950100,24.162489\n2007-07-24,31.01,31.48,30.709999,30.799999,59729300,24.233301\n2007-07-23,31.360001,31.52,31.120001,31.190001,48910600,24.540152\n2007-07-20,31.15,31.200001,30.790001,31.16,98292600,24.516548\n2007-07-19,31.049999,31.84,30.93,31.51,121159300,24.791926\n2007-07-18,30.51,30.969999,30.50,30.92,64414400,24.327717\n2007-07-17,30.02,30.879999,30.01,30.780001,77539600,24.217566\n2007-07-16,29.76,30.24,29.719999,30.030001,48023200,23.627469\n2007-07-13,29.940001,30.02,29.66,29.82,42173000,23.462241\n2007-07-12,29.559999,30.110001,29.440001,30.07,54302400,23.65894\n2007-07-11,29.24,29.65,29.209999,29.49,48017000,23.202599\n2007-07-10,29.700001,29.99,29.18,29.33,66013500,23.076712\n2007-07-09,29.860001,29.950001,29.809999,29.870001,33831400,23.501582\n2007-07-06,29.91,30.040001,29.66,29.969999,57541000,23.580261\n2007-07-05,30.049999,30.219999,29.83,29.99,47838500,23.595997\n2007-07-03,29.790001,30.219999,29.780001,30.02,35202600,23.619601\n2007-07-02,29.67,29.799999,29.49,29.74,47316000,23.399298\n2007-06-29,29.870001,29.93,29.040001,29.469999,71193900,23.186863\n2007-06-28,29.860001,29.969999,29.68,29.83,46055200,23.47011\n2007-06-27,29.360001,29.950001,29.360001,29.870001,53468600,23.501582\n2007-06-26,29.549999,29.799999,29.50,29.52,48340300,23.226203\n2007-06-25,29.469999,29.77,29.379999,29.49,53905800,23.202599\n2007-06-22,30.00,30.10,29.450001,29.49,86219900,23.202599\n2007-06-21,29.98,30.299999,29.91,30.219999,56564800,23.776959\n2007-06-20,30.440001,30.51,29.959999,30.01,46861600,23.611733\n2007-06-19,30.48,30.66,30.379999,30.459999,46802600,23.96579\n2007-06-18,30.690001,30.719999,30.42,30.51,45412600,24.005131\n2007-06-15,30.860001,30.879999,30.43,30.49,100933000,23.989395\n2007-06-14,30.35,30.709999,30.299999,30.52,59065700,24.012999\n2007-06-13,29.969999,30.41,29.85,30.389999,64435600,23.910715\n2007-06-12,29.959999,30.24,29.77,29.85,56981800,23.485846\n2007-06-11,29.940001,30.25,29.93,30.02,48467400,23.619601\n2007-06-08,29.58,30.059999,29.41,30.049999,61346200,23.643204\n2007-06-07,30.02,30.290001,29.59,29.620001,71971400,23.304883\n2007-06-06,30.370001,30.530001,30.25,30.290001,38217500,23.832036\n2007-06-05,30.620001,30.629999,30.33,30.58,44265000,24.060206\n2007-06-04,30.42,30.76,30.40,30.719999,41434500,24.170357\n2007-06-01,30.790001,30.90,30.549999,30.59,39469400,24.068074\n2007-05-31,31.120001,31.16,30.610001,30.690001,85290500,24.146754\n2007-05-30,30.549999,31.129999,30.51,31.110001,57376800,24.477208\n2007-05-29,30.49,30.83,30.389999,30.790001,42373100,24.225434\n2007-05-25,30.280001,30.66,30.18,30.48,47726500,23.981526\n2007-05-24,30.540001,30.799999,29.959999,30.17,64046400,23.73762\n2007-05-23,30.84,30.84,30.57,30.58,46322500,24.060206\n2007-05-22,30.90,30.93,30.66,30.690001,39999500,24.146754\n2007-05-21,30.73,31.16,30.73,31.049999,41836400,24.43\n2007-05-18,30.969999,30.99,30.58,30.83,58453000,24.256905\n2007-05-17,31.030001,31.139999,30.959999,30.98,41045600,24.374924\n2007-05-16,31.00,31.09,30.809999,31.07,45833600,24.445736\n2007-05-15,30.90,31.09,30.84,30.90,75013900,24.311981\n2007-05-14,30.84,30.99,30.809999,30.969999,70188500,24.288378\n2007-05-11,30.57,30.98,30.549999,30.889999,43425300,24.225637\n2007-05-10,30.68,30.93,30.530001,30.58,55398600,23.982519\n2007-05-09,30.700001,30.93,30.57,30.780001,51735000,24.13937\n2007-05-08,30.68,30.940001,30.58,30.75,60551700,24.115842\n2007-05-07,30.52,30.76,30.48,30.709999,59889100,24.084471\n2007-05-04,30.68,30.700001,30.290001,30.559999,104385900,23.966833\n2007-05-03,30.60,31.00,30.530001,30.969999,82036800,24.288378\n2007-05-02,30.389999,30.690001,30.299999,30.610001,80686700,24.006047\n2007-05-01,29.940001,30.42,29.90,30.40,73539300,23.841353\n2007-04-30,30.129999,30.370001,29.940001,29.940001,67788800,23.480596\n2007-04-27,30.17,30.74,30.00,30.120001,128298800,23.621762\n2007-04-26,29.09,29.35,28.91,29.10,68760300,22.821822\n2007-04-25,28.860001,29.00,28.690001,28.99,39475000,22.735553\n2007-04-24,28.790001,28.959999,28.59,28.790001,34236700,22.578703\n2007-04-23,28.959999,28.99,28.67,28.780001,41739100,22.57086\n2007-04-20,28.98,29.10,28.700001,29.02,60311500,22.759081\n2007-04-19,28.34,28.889999,28.26,28.690001,43648800,22.500277\n2007-04-18,28.610001,28.67,28.360001,28.60,41778400,22.429694\n2007-04-17,28.629999,28.889999,28.559999,28.85,33170200,22.625758\n2007-04-16,28.60,28.75,28.209999,28.73,30740100,22.531647\n2007-04-13,28.43,28.700001,28.10,28.610001,36002900,22.437537\n2007-04-12,28.059999,28.620001,28.040001,28.540001,43762100,22.382639\n2007-04-11,28.299999,28.57,27.99,28.110001,44050200,22.045409\n2007-04-10,28.50,28.639999,28.219999,28.40,38643100,22.272842\n2007-04-09,28.58,28.719999,28.389999,28.57,31384600,22.406166\n2007-04-05,28.32,28.65,28.299999,28.549999,30131200,22.39048\n2007-04-04,28.01,28.780001,27.90,28.50,63244200,22.351268\n2007-04-03,27.860001,28.059999,27.75,27.870001,39821300,21.857188\n2007-04-02,27.889999,27.93,27.559999,27.74,41977600,21.755234\n2007-03-30,27.75,27.950001,27.50,27.870001,47061000,21.857188\n2007-03-29,27.84,27.85,27.49,27.75,42629900,21.763077\n2007-03-28,27.58,28.00,27.40,27.639999,46947000,21.676808\n2007-03-27,28.040001,28.16,27.65,27.719999,58979800,21.739549\n2007-03-26,27.940001,28.219999,27.700001,28.219999,47491500,22.131676\n2007-03-23,28.219999,28.27,27.799999,28.02,50519800,21.974826\n2007-03-22,28.52,28.549999,28.01,28.27,47934900,22.17089\n2007-03-21,27.90,28.52,27.559999,28.52,72808200,22.366954\n2007-03-20,27.93,28.16,27.76,27.84,47902400,21.83366\n2007-03-19,27.34,27.83,27.200001,27.83,49412000,21.825817\n2007-03-16,27.35,27.48,27.200001,27.33,65055300,21.43369\n2007-03-15,27.32,27.469999,27.200001,27.280001,51757100,21.394478\n2007-03-14,26.82,27.40,26.73,27.40,75730300,21.488587\n2007-03-13,27.25,27.40,26.709999,26.719999,75169500,20.955294\n2007-03-12,27.18,27.48,27.129999,27.440001,36516400,21.519958\n2007-03-09,27.42,27.48,27.030001,27.290001,80125000,21.40232\n2007-03-08,27.719999,27.85,26.60,27.32,72175200,21.425847\n2007-03-07,27.76,27.90,27.549999,27.610001,52044700,21.653282\n2007-03-06,27.799999,27.940001,27.65,27.83,49361800,21.825817\n2007-03-05,27.49,27.91,27.41,27.549999,56454300,21.606225\n2007-03-02,28.02,28.16,27.76,27.76,63254700,21.77092\n2007-03-01,27.82,28.33,27.73,28.09,80175700,22.029724\n2007-02-28,27.950001,28.25,27.92,28.17,86333300,22.092464\n2007-02-27,28.709999,28.969999,27.790001,27.870001,87143300,21.857188\n2007-02-26,28.959999,29.09,28.82,29.07,63481900,22.798293\n2007-02-23,29.219999,29.280001,28.889999,28.90,63787100,22.66497\n2007-02-22,29.309999,29.540001,29.16,29.389999,57754400,23.049255\n2007-02-21,28.75,29.389999,28.74,29.35,68604900,23.017885\n2007-02-20,28.629999,28.860001,28.469999,28.83,53978200,22.610072\n2007-02-16,28.91,28.940001,28.65,28.74,109340300,22.539489\n2007-02-15,29.58,29.65,29.219999,29.459999,63858100,23.104152\n2007-02-14,29.17,29.690001,29.15,29.40,55588600,23.057098\n2007-02-13,29.040001,29.200001,28.959999,29.01,50348100,22.751239\n2007-02-12,28.889999,29.09,28.83,28.940001,52774400,22.617916\n2007-02-09,29.35,29.40,28.93,28.98,69823100,22.649177\n2007-02-08,29.24,29.799999,29.200001,29.26,48749000,22.86801\n2007-02-07,29.639999,29.700001,29.25,29.370001,65145500,22.95398\n2007-02-06,29.59,29.75,29.219999,29.51,79281100,23.063396\n2007-02-05,29.969999,30.02,29.41,29.610001,99102100,23.141551\n2007-02-02,30.82,30.84,30.129999,30.190001,60401700,23.594847\n2007-02-01,30.84,30.940001,30.370001,30.559999,55355800,23.884018\n2007-01-31,30.41,31.10,30.35,30.860001,73968400,24.118482\n2007-01-30,30.57,30.639999,30.139999,30.48,61900400,23.821494\n2007-01-29,30.65,30.780001,30.34,30.530001,57605900,23.860573\n2007-01-26,31.219999,31.23,30.60,30.60,96103700,23.91528\n2007-01-25,31.08,31.48,30.450001,30.450001,97378700,23.798049\n2007-01-24,30.780001,31.299999,30.65,31.09,58527800,24.298237\n2007-01-23,30.629999,30.959999,30.52,30.74,49171200,24.024696\n2007-01-22,31.059999,31.120001,30.51,30.719999,56143900,24.009065\n2007-01-19,30.73,31.110001,30.690001,31.110001,75826900,24.313869\n2007-01-18,31.15,31.370001,30.799999,31.00,56364300,24.227898\n2007-01-17,31.26,31.440001,31.01,31.10,58519600,24.306053\n2007-01-16,31.26,31.450001,31.030001,31.16,62379600,24.352945\n2007-01-12,30.65,31.389999,30.639999,31.209999,103972500,24.392022\n2007-01-11,29.76,30.75,29.65,30.700001,99464300,23.993435\n2007-01-10,29.799999,29.889999,29.43,29.66,55017400,23.180628\n2007-01-09,30.00,30.18,29.73,29.959999,44636600,23.415091\n2007-01-08,29.65,30.10,29.530001,29.93,50220200,23.391645\n2007-01-05,29.629999,29.75,29.450001,29.639999,44607200,23.164996\n2007-01-04,29.700001,29.969999,29.440001,29.809999,45774500,23.297859\n2007-01-03,29.91,30.25,29.40,29.860001,76935100,23.336937\n2006-12-29,29.860001,30.15,29.83,29.860001,41739800,23.336937\n2006-12-28,29.860001,30.030001,29.809999,29.98,26690600,23.430722\n2006-12-27,29.99,30.129999,29.91,30.02,31248400,23.461984\n2006-12-26,29.530001,30.00,29.40,29.99,37098300,23.438537\n2006-12-22,29.83,29.860001,29.620001,29.639999,37971700,23.164996\n2006-12-21,30.129999,30.139999,29.889999,29.98,32270500,23.430722\n2006-12-20,29.99,30.24,29.969999,30.09,31202100,23.516692\n2006-12-19,29.709999,30.17,29.530001,29.99,53822100,23.438537\n2006-12-18,30.190001,30.26,29.780001,29.889999,56986800,23.360383\n2006-12-15,30.139999,30.23,30.030001,30.190001,102783700,23.594847\n2006-12-14,29.540001,30.08,29.52,30.07,85866500,23.501061\n2006-12-13,29.60,29.60,29.32,29.549999,46002500,23.094657\n2006-12-12,29.559999,29.629999,29.219999,29.43,68529400,23.000873\n2006-12-11,29.190001,29.75,29.110001,29.540001,107712000,23.086843\n2006-12-08,28.82,29.40,28.799999,29.40,108854900,22.977426\n2006-12-07,28.959999,29.07,28.809999,28.85,46831100,22.547577\n2006-12-06,29.10,29.129999,28.870001,28.99,48564100,22.656992\n2006-12-05,29.360001,29.40,29.030001,29.129999,45606000,22.766408\n2006-12-04,29.23,29.52,29.17,29.33,55123400,22.922718\n2006-12-01,29.23,29.299999,28.90,29.120001,72257000,22.758594\n2006-11-30,29.42,29.57,29.33,29.360001,53297400,22.946165\n2006-11-29,29.440001,29.780001,29.43,29.57,58775100,23.110288\n2006-11-28,29.34,29.42,29.129999,29.389999,52602300,22.96961\n2006-11-27,29.690001,29.74,29.33,29.48,72722100,23.039949\n2006-11-24,29.66,29.84,29.639999,29.76,20456700,23.258782\n2006-11-22,29.969999,30.00,29.82,29.92,43907200,23.38383\n2006-11-21,29.91,30.00,29.790001,29.92,66446600,23.38383\n2006-11-20,29.52,30.00,29.50,29.889999,85703800,23.360383\n2006-11-17,29.309999,29.540001,29.280001,29.40,49356700,22.977426\n2006-11-16,29.139999,29.639999,29.129999,29.469999,64328500,23.032134\n2006-11-15,29.129999,29.360001,29.110001,29.120001,63943200,22.758594\n2006-11-14,29.280001,29.42,29.07,29.23,63012500,22.844563\n2006-11-13,29.190001,29.459999,29.16,29.35,47271800,22.860195\n2006-11-10,29.17,29.290001,29.15,29.24,37855100,22.774517\n2006-11-09,29.110001,29.40,29.00,29.26,89407500,22.790095\n2006-11-08,28.780001,29.23,28.66,28.98,77403300,22.572008\n2006-11-07,28.860001,29.07,28.799999,28.950001,56511200,22.548642\n2006-11-06,28.77,29.049999,28.76,28.84,60446200,22.462965\n2006-11-03,28.85,28.93,28.610001,28.73,41124500,22.377287\n2006-11-02,28.709999,28.860001,28.58,28.77,58674400,22.408443\n2006-11-01,28.780001,28.99,28.700001,28.809999,75895900,22.439598\n2006-10-31,28.66,28.85,28.559999,28.709999,61861700,22.361709\n2006-10-30,28.35,28.84,28.32,28.530001,47296800,22.221512\n2006-10-27,28.49,28.790001,28.25,28.34,89060100,22.073524\n2006-10-26,28.33,28.41,28.040001,28.35,69964200,22.081313\n2006-10-25,28.280001,28.459999,28.139999,28.309999,40717100,22.050157\n2006-10-24,28.43,28.43,28.129999,28.280001,61409600,22.026791\n2006-10-23,28.299999,28.690001,28.18,28.450001,48525000,22.159201\n2006-10-20,28.48,28.49,28.17,28.43,48887800,22.143623\n2006-10-19,28.35,28.450001,28.120001,28.290001,44730800,22.03458\n2006-10-18,28.50,28.700001,28.26,28.52,40630800,22.213723\n2006-10-17,28.24,28.51,28.17,28.440001,40122600,22.151412\n2006-10-16,28.48,28.60,28.33,28.450001,49744800,22.159201\n2006-10-13,28.34,28.690001,28.309999,28.370001,129751900,22.096891\n2006-10-12,27.58,28.290001,27.540001,28.219999,120174900,21.980057\n2006-10-11,27.459999,27.67,27.42,27.540001,37219600,21.450418\n2006-10-10,27.690001,27.75,27.440001,27.690001,34598500,21.56725\n2006-10-09,27.799999,27.93,27.620001,27.719999,33366300,21.590616\n2006-10-06,27.76,28.00,27.65,27.870001,36452200,21.707449\n2006-10-05,27.92,28.110001,27.780001,27.92,81967200,21.746393\n2006-10-04,27.389999,27.959999,27.370001,27.940001,82191200,21.761971\n2006-10-03,27.370001,27.48,27.209999,27.370001,39386200,21.318008\n2006-10-02,27.32,27.49,27.15,27.360001,52908100,21.310219\n2006-09-29,27.35,27.42,27.209999,27.35,34283500,21.30243\n2006-09-28,27.469999,27.52,27.26,27.40,44179700,21.341374\n2006-09-27,27.18,27.469999,27.120001,27.440001,66233900,21.37253\n2006-09-26,26.91,27.32,26.879999,27.200001,54766500,21.185598\n2006-09-25,26.809999,27.190001,26.790001,26.950001,67903900,20.990878\n2006-09-22,26.83,26.85,26.48,26.66,47712500,20.765001\n2006-09-21,27.24,27.25,26.85,26.90,58495100,20.951933\n2006-09-20,27.01,27.23,26.99,27.18,71676400,21.17002\n2006-09-19,26.74,26.940001,26.719999,26.860001,43039100,20.920778\n2006-09-18,26.74,27.040001,26.67,26.790001,49135000,20.866257\n2006-09-15,26.58,26.940001,26.49,26.85,126057700,20.912989\n2006-09-14,25.99,26.50,25.98,26.33,74324500,20.50797\n2006-09-13,25.82,26.10,25.82,25.98,37706700,20.235361\n2006-09-12,25.90,25.98,25.719999,25.93,52248800,20.196417\n2006-09-11,25.43,25.950001,25.42,25.91,55608200,20.180839\n2006-09-08,25.530001,25.790001,25.459999,25.60,36866800,19.939386\n2006-09-07,25.48,25.700001,25.389999,25.43,51266900,19.806976\n2006-09-06,25.51,25.719999,25.51,25.610001,50160400,19.947175\n2006-09-05,25.690001,25.959999,25.559999,25.610001,44222400,19.947175\n2006-09-01,25.889999,25.969999,25.639999,25.84,31594600,20.126318\n2006-08-31,25.870001,25.98,25.68,25.700001,26380500,20.017275\n2006-08-30,25.85,25.889999,25.639999,25.799999,30283100,20.095162\n2006-08-29,25.92,25.98,25.629999,25.84,42711200,20.126318\n2006-08-28,25.84,26.00,25.690001,25.950001,34190900,20.211995\n2006-08-25,25.709999,26.00,25.690001,25.85,33115900,20.134107\n2006-08-24,25.82,25.860001,25.50,25.74,35933300,20.048429\n2006-08-23,25.65,25.950001,25.52,25.67,44648500,19.993908\n2006-08-22,26.01,26.25,25.620001,25.620001,89312400,19.954964\n2006-08-21,25.66,26.129999,25.559999,26.120001,88398300,20.344405\n2006-08-18,25.049999,25.799999,24.98,25.790001,128414800,20.087374\n2006-08-17,24.700001,24.75,24.610001,24.700001,45674800,19.238393\n2006-08-16,24.610001,24.73,24.469999,24.700001,52373600,19.238393\n2006-08-15,24.549999,24.65,24.440001,24.620001,48994500,19.176082\n2006-08-14,24.52,24.60,24.35,24.530001,47831900,19.035882\n2006-08-11,24.43,24.450001,24.200001,24.43,30255500,18.958279\n2006-08-10,24.370001,24.60,24.34,24.459999,31753400,18.981559\n2006-08-09,24.49,24.639999,24.34,24.440001,44405700,18.96604\n2006-08-08,24.389999,24.52,24.200001,24.34,58171300,18.888437\n2006-08-07,24.280001,24.48,24.190001,24.219999,36862400,18.795313\n2006-08-04,24.40,24.49,24.15,24.290001,45690400,18.849636\n2006-08-03,24.190001,24.48,24.15,24.209999,43155300,18.787553\n2006-08-02,24.120001,24.40,24.030001,24.299999,46462000,18.857395\n2006-08-01,24.02,24.200001,23.85,23.99,49168700,18.616828\n2006-07-31,24.07,24.42,24.01,24.059999,40254400,18.67115\n2006-07-28,24.08,24.280001,24.059999,24.25,51705800,18.818595\n2006-07-27,24.58,24.60,23.77,23.870001,85386800,18.523706\n2006-07-26,24.120001,24.530001,24.10,24.370001,54942100,18.911718\n2006-07-25,24.00,24.290001,23.90,24.219999,60075800,18.795313\n2006-07-24,24.01,24.110001,23.790001,24.00,59586700,18.624588\n2006-07-21,24.08,24.15,23.00,23.870001,175483800,18.523706\n2006-07-20,23.440001,23.450001,22.780001,22.85,76605200,17.732161\n2006-07-19,22.82,23.459999,22.719999,23.40,82188200,18.158973\n2006-07-18,22.59,22.76,22.48,22.74,65047300,17.646797\n2006-07-17,22.290001,22.610001,22.26,22.48,37053500,17.445031\n2006-07-14,22.280001,22.549999,22.23,22.290001,67499400,17.297587\n2006-07-13,22.370001,22.610001,22.25,22.26,73099500,17.274306\n2006-07-12,22.790001,22.879999,22.620001,22.639999,77379300,17.569195\n2006-07-11,23.370001,23.370001,22.74,23.10,88676300,17.926167\n2006-07-10,23.43,23.66,23.379999,23.50,50565100,18.236576\n2006-07-07,23.389999,23.549999,23.299999,23.299999,63168800,18.081371\n2006-07-06,23.450001,23.610001,23.42,23.48,44775200,18.221055\n2006-07-05,23.48,23.52,23.299999,23.35,53093500,18.120173\n2006-07-03,23.530001,23.719999,23.450001,23.700001,25711400,18.391782\n2006-06-30,23.540001,23.65,23.299999,23.299999,73048800,18.081371\n2006-06-29,23.32,23.629999,23.219999,23.469999,121395500,18.213295\n2006-06-28,22.959999,23.25,22.91,23.16,71906500,17.972728\n2006-06-27,22.889999,23.16,22.84,22.860001,84759100,17.739921\n2006-06-26,22.65,22.889999,22.629999,22.82,53644100,17.708879\n2006-06-23,22.85,22.870001,22.50,22.50,60532600,17.460552\n2006-06-22,23.059999,23.17,22.780001,22.879999,76590600,17.75544\n2006-06-21,22.610001,23.15,22.530001,23.08,91660300,17.910646\n2006-06-20,22.540001,22.76,22.50,22.559999,90598500,17.507113\n2006-06-19,22.139999,22.60,22.120001,22.549999,129640900,17.499352\n2006-06-16,21.969999,22.280001,21.790001,22.10,147506500,17.150142\n2006-06-15,22.01,22.129999,21.799999,22.07,121577300,17.126861\n2006-06-14,21.59,21.940001,21.549999,21.879999,86081500,16.979416\n2006-06-13,21.73,22.030001,21.459999,21.51,113175300,16.692288\n2006-06-12,21.959999,22.10,21.700001,21.709999,74309700,16.847492\n2006-06-09,22.15,22.190001,21.889999,21.92,52573800,17.010458\n2006-06-08,22.030001,22.209999,21.969999,22.110001,104126900,17.157903\n2006-06-07,22.15,22.389999,22.01,22.040001,73827500,17.103581\n2006-06-06,22.549999,22.559999,21.98,22.129999,126601300,17.173422\n2006-06-05,22.719999,22.73,22.49,22.50,63914100,17.460552\n2006-06-02,22.870001,22.99,22.67,22.76,73935600,17.662318\n2006-06-01,22.74,22.84,22.620001,22.82,80230800,17.708879\n2006-05-31,23.26,23.35,22.65,22.65,120202000,17.576955\n2006-05-30,23.549999,23.76,23.139999,23.15,52497500,17.964967\n2006-05-26,23.77,23.879999,23.559999,23.719999,46861600,18.407301\n2006-05-25,23.57,23.92,23.540001,23.74,83052700,18.422822\n2006-05-24,22.99,23.540001,22.98,23.50,107356700,18.236576\n2006-05-23,23.110001,23.379999,22.77,22.790001,79986300,17.6856\n2006-05-22,22.48,23.02,22.450001,22.879999,87322300,17.75544\n2006-05-19,22.790001,22.90,22.52,22.559999,100071200,17.507113\n2006-05-18,22.84,23.139999,22.76,22.83,95476400,17.71664\n2006-05-17,22.889999,23.08,22.73,22.73,98598300,17.639037\n2006-05-16,23.16,24.00,22.91,23.01,82095100,17.856324\n2006-05-15,23.10,23.23,23.030001,23.15,67314800,17.964967\n2006-05-12,23.139999,23.370001,23.049999,23.17,83115900,17.910646\n2006-05-11,23.709999,23.790001,23.15,23.219999,92916700,17.949296\n2006-05-10,23.67,23.790001,23.59,23.77,76563300,18.374453\n2006-05-09,23.75,24.00,23.49,23.620001,75345900,18.258501\n2006-05-08,23.85,25.00,23.51,23.73,80693500,18.343532\n2006-05-05,23.66,23.950001,23.52,23.799999,131604300,18.397642\n2006-05-04,23.35,23.67,23.139999,23.440001,171257400,18.119359\n2006-05-03,23.99,24.02,23.15,23.17,211527100,17.910646\n2006-05-02,24.49,25.00,23.90,24.01,190533500,18.559975\n2006-05-01,24.32,25.00,24.09,24.290001,174800900,18.776418\n2006-04-28,24.23,24.50,24.00,24.15,591052200,18.668196\n2006-04-27,26.969999,27.629999,26.940001,27.25,96509600,21.064528\n2006-04-26,27.08,27.23,27.00,27.10,39190000,20.948577\n2006-04-25,27.09,27.209999,27.02,27.110001,49222500,20.956307\n2006-04-24,27.07,27.25,26.98,27.110001,42318400,20.956307\n2006-04-21,27.049999,27.389999,27.00,27.15,58528000,20.987226\n2006-04-20,27.049999,27.190001,26.700001,27.030001,45648300,20.894466\n2006-04-19,27.110001,27.190001,26.959999,27.030001,45111100,20.894466\n2006-04-18,26.940001,27.50,26.82,27.219999,56272700,21.041337\n2006-04-17,27.030001,27.049999,26.73,26.84,35796200,20.747594\n2006-04-13,27.08,27.200001,27.00,27.07,28160000,20.925386\n2006-04-12,27.10,27.200001,26.969999,27.200001,32183000,21.025878\n2006-04-11,27.290001,27.32,27.00,27.129999,42953400,20.971766\n2006-04-10,27.23,27.440001,27.200001,27.290001,39432000,21.095449\n2006-04-07,27.610001,27.719999,27.23,27.25,47249400,21.064528\n2006-04-06,27.66,27.719999,27.370001,27.559999,51885500,21.304161\n2006-04-05,27.879999,27.940001,27.639999,27.74,41539300,21.443303\n2006-04-04,27.60,27.799999,27.469999,27.639999,45470000,21.366001\n2006-04-03,27.67,27.73,27.440001,27.559999,57605300,21.304161\n2006-03-31,27.299999,27.540001,27.209999,27.209999,62190500,21.033607\n2006-03-30,27.030001,27.389999,27.00,27.23,54612000,21.049067\n2006-03-29,26.950001,27.200001,26.92,27.02,53150300,20.886736\n2006-03-28,27.01,27.209999,26.809999,26.90,58520500,20.793974\n2006-03-27,27.01,27.299999,27.00,27.01,59908600,20.879006\n2006-03-24,26.709999,27.209999,26.620001,27.01,69157600,20.879006\n2006-03-23,27.08,27.10,26.66,26.85,73682900,20.755324\n2006-03-22,27.08,27.50,26.799999,27.15,145696100,20.987226\n2006-03-21,27.74,28.219999,27.68,27.74,73199600,21.443303\n2006-03-20,27.700001,27.99,27.67,27.889999,67094100,21.559254\n2006-03-17,27.35,27.66,27.27,27.50,120615000,21.25778\n2006-03-16,27.34,27.48,27.219999,27.27,73793700,21.079988\n2006-03-15,27.200001,27.450001,27.01,27.360001,57152000,21.149559\n2006-03-14,27.040001,27.379999,26.99,27.23,39821800,21.049067\n2006-03-13,27.18,27.290001,26.940001,27.110001,40342600,20.956307\n2006-03-10,27.059999,27.219999,26.879999,27.17,41297200,21.002687\n2006-03-09,27.27,27.42,27.00,27.00,45360700,20.871275\n2006-03-08,26.99,27.50,26.969999,27.25,57547400,21.064528\n2006-03-07,26.90,27.10,26.809999,27.059999,51613900,20.917655\n2006-03-06,26.92,27.15,26.83,26.91,53054100,20.801704\n2006-03-03,26.809999,27.16,26.74,26.93,45218800,20.817165\n2006-03-02,27.02,27.10,26.90,26.969999,41850300,20.848084\n2006-03-01,26.98,27.200001,26.950001,27.139999,53061200,20.979496\n2006-02-28,26.950001,27.299999,26.870001,26.870001,65036100,20.770785\n2006-02-27,26.75,27.26,26.67,27.049999,51301500,20.909925\n2006-02-24,26.59,26.74,26.52,26.629999,44753800,20.585261\n2006-02-23,26.73,26.889999,26.540001,26.66,47359100,20.608452\n2006-02-22,26.530001,26.860001,26.469999,26.719999,43043100,20.654832\n2006-02-21,26.719999,26.719999,26.34,26.540001,50216100,20.515691\n2006-02-17,26.67,26.809999,26.559999,26.700001,41513200,20.639373\n2006-02-16,26.85,26.90,26.57,26.809999,48868500,20.724403\n2006-02-15,26.60,26.93,26.50,26.879999,62808900,20.778513\n2006-02-14,26.41,26.68,26.35,26.65,58432900,20.53115\n2006-02-13,26.629999,26.700001,26.34,26.389999,46707000,20.330846\n2006-02-10,26.620001,26.889999,26.51,26.690001,52127000,20.561967\n2006-02-09,26.959999,27.030001,26.65,26.66,52861700,20.538854\n2006-02-08,27.01,27.08,26.709999,26.91,51795200,20.731454\n2006-02-07,26.950001,27.15,26.809999,26.940001,72159500,20.754566\n2006-02-06,27.51,27.540001,27.09,27.17,60170500,20.931758\n2006-02-03,27.48,27.700001,27.34,27.540001,75022700,21.216807\n2006-02-02,27.969999,27.99,27.549999,27.68,55073400,21.324662\n2006-02-01,27.959999,28.07,27.76,28.040001,68448800,21.602006\n2006-01-31,27.91,28.379999,27.870001,28.15,94841300,21.686749\n2006-01-30,27.82,28.18,27.780001,28.00,103999200,21.57119\n2006-01-27,27.23,27.950001,27.190001,27.790001,134520700,21.409406\n2006-01-26,26.559999,26.719999,26.309999,26.50,69509300,20.41559\n2006-01-25,26.41,26.57,26.23,26.40,59072100,20.33855\n2006-01-24,26.34,26.450001,26.219999,26.280001,63040700,20.246103\n2006-01-23,26.41,26.530001,26.299999,26.35,47925600,20.300031\n2006-01-20,27.01,27.01,26.26,26.41,79165900,20.346254\n2006-01-19,26.870001,27.24,26.85,27.02,60367600,20.816198\n2006-01-18,26.74,26.98,26.700001,26.83,52376200,20.669822\n2006-01-17,26.90,27.190001,26.90,26.99,58566600,20.793086\n2006-01-13,27.030001,27.25,27.01,27.190001,41418000,20.947166\n2006-01-12,27.25,27.26,26.969999,27.139999,45994800,20.908645\n2006-01-11,27.01,27.389999,26.90,27.290001,70120700,21.024207\n2006-01-10,26.65,27.02,26.59,27.00,64921900,20.80079\n2006-01-09,26.93,27.07,26.76,26.860001,55625000,20.692935\n2006-01-06,26.889999,27.00,26.49,26.91,100963000,20.731454\n2006-01-05,26.959999,27.129999,26.91,26.99,48245500,20.793086\n2006-01-04,26.77,27.08,26.77,26.969999,57975600,20.777677\n2006-01-03,26.25,27.00,26.10,26.84,79973000,20.677526\n2005-12-30,26.15,26.309999,26.10,26.15,49044600,20.14595\n2005-12-29,26.41,26.50,26.26,26.27,34495500,20.238399\n2005-12-28,26.51,26.66,26.35,26.389999,35444400,20.330846\n2005-12-27,26.68,26.85,26.450001,26.459999,37819000,20.384774\n2005-12-23,26.52,26.67,26.440001,26.639999,30689200,20.523446\n2005-12-22,26.709999,26.780001,26.42,26.59,91276900,20.484926\n2005-12-21,26.870001,26.91,26.709999,26.73,75800900,20.592782\n2005-12-20,26.76,26.879999,26.67,26.860001,62960600,20.692935\n2005-12-19,26.82,26.870001,26.65,26.83,68680100,20.669822\n2005-12-16,26.879999,27.08,26.809999,26.90,88542500,20.72375\n2005-12-15,27.08,27.110001,26.809999,26.92,79018100,20.739158\n2005-12-14,27.00,27.24,26.85,27.09,65076200,20.870126\n2005-12-13,27.290001,27.43,27.00,27.129999,104285500,20.900941\n2005-12-12,27.700001,27.75,27.33,27.450001,63757200,21.14747\n2005-12-09,27.709999,27.83,27.639999,27.709999,48467000,21.347773\n2005-12-08,27.709999,27.809999,27.60,27.690001,63931600,21.332366\n2005-12-07,27.67,27.75,27.549999,27.75,55583200,21.37859\n2005-12-06,27.90,27.92,27.68,27.690001,65980000,21.332366\n2005-12-05,27.93,28.02,27.709999,27.85,47517300,21.45563\n2005-12-02,27.82,28.10,27.790001,28.01,42319600,21.578894\n2005-12-01,27.73,28.10,27.73,27.889999,61006100,21.486445\n2005-11-30,27.68,27.77,27.629999,27.68,55904700,21.324662\n2005-11-29,27.790001,27.790001,27.60,27.68,62220400,21.324662\n2005-11-28,27.790001,27.85,27.530001,27.75,57517200,21.37859\n2005-11-25,27.799999,27.940001,27.469999,27.76,44082500,21.386294\n2005-11-23,27.92,28.09,27.74,27.92,70541300,21.509558\n2005-11-22,28.059999,28.08,27.860001,27.91,104253300,21.501854\n2005-11-21,28.07,28.24,27.84,28.16,65794400,21.694453\n2005-11-18,28.120001,28.25,27.90,28.07,75431200,21.625117\n2005-11-17,27.85,28.00,27.76,27.969999,91351000,21.548077\n2005-11-16,27.48,27.879999,27.440001,27.74,86277000,21.370886\n2005-11-15,27.33,27.540001,27.25,27.50,65081000,21.18599\n2005-11-14,27.360001,27.440001,27.200001,27.370001,67152200,21.024207\n2005-11-11,27.15,27.389999,27.129999,27.280001,51945600,20.955073\n2005-11-10,26.940001,27.15,26.639999,27.09,73314800,20.809125\n2005-11-09,26.98,27.15,26.940001,26.959999,59562100,20.709265\n2005-11-08,26.940001,27.18,26.77,27.049999,60091700,20.778398\n2005-11-07,26.719999,27.08,26.700001,27.01,77104800,20.747673\n2005-11-04,26.530001,26.709999,26.450001,26.66,57464000,20.478821\n2005-11-03,26.60,26.639999,26.25,26.440001,73421600,20.309829\n2005-11-02,25.93,26.50,25.93,26.459999,75067100,20.325191\n2005-11-01,25.610001,26.10,25.610001,25.959999,71370400,19.941117\n2005-10-31,25.610001,25.799999,25.50,25.700001,75122100,19.7414\n2005-10-28,25.10,25.60,25.10,25.530001,106559300,19.610815\n2005-10-27,25.219999,25.27,24.85,24.85,61566100,19.088474\n2005-10-26,24.969999,25.33,24.93,25.110001,58178100,19.288192\n2005-10-25,24.950001,25.129999,24.83,25.030001,41310500,19.226741\n2005-10-24,24.889999,25.10,24.68,25.10,51868000,19.280511\n2005-10-21,24.91,25.00,24.57,24.780001,69431200,19.034704\n2005-10-20,25.049999,25.129999,24.74,24.790001,58830600,19.042385\n2005-10-19,24.559999,25.09,24.50,25.09,66574500,19.272829\n2005-10-18,24.49,24.83,24.450001,24.57,69328200,18.873392\n2005-10-17,24.68,24.690001,24.440001,24.530001,46924400,18.842667\n2005-10-14,24.709999,24.73,24.50,24.67,53846700,18.950207\n2005-10-13,24.309999,24.73,24.27,24.59,70192000,18.888755\n2005-10-12,24.49,24.700001,24.27,24.299999,71294400,18.665992\n2005-10-11,24.51,24.549999,24.25,24.41,76567300,18.750488\n2005-10-10,24.67,24.68,24.35,24.459999,48880900,18.788895\n2005-10-07,24.77,24.84,24.52,24.59,50768700,18.888755\n2005-10-06,24.66,24.950001,24.530001,24.73,81724600,18.996295\n2005-10-05,25.040001,25.049999,24.67,24.67,73684700,18.950207\n2005-10-04,25.360001,25.389999,24.75,24.98,151666300,19.188332\n2005-10-03,25.709999,25.73,25.440001,25.50,55341300,19.58777\n2005-09-30,25.91,25.950001,25.610001,25.73,57644500,19.764443\n2005-09-29,25.610001,26.00,25.50,25.940001,66807100,19.925755\n2005-09-28,25.389999,25.870001,25.379999,25.67,71019400,19.718355\n2005-09-27,25.370001,25.450001,25.299999,25.34,48797900,19.464866\n2005-09-26,25.40,25.49,25.209999,25.27,56203700,19.411096\n2005-09-23,25.309999,25.540001,25.120001,25.27,66396800,19.411096\n2005-09-22,25.49,25.60,25.15,25.34,71314900,19.464866\n2005-09-21,25.799999,25.90,25.43,25.49,68281800,19.580088\n2005-09-20,26.07,26.219999,25.690001,25.84,61043400,19.84894\n2005-09-19,26.09,26.27,25.860001,26.00,61832300,19.971843\n2005-09-16,26.34,26.40,25.969999,26.07,187384300,20.025614\n2005-09-15,26.370001,26.43,26.219999,26.27,60357200,20.179244\n2005-09-14,26.52,26.639999,26.299999,26.309999,54969600,20.209969\n2005-09-13,26.540001,26.76,26.370001,26.48,63422900,20.340554\n2005-09-12,26.620001,26.75,26.52,26.610001,40550500,20.440414\n2005-09-09,26.620001,26.82,26.530001,26.58,41515800,20.417369\n2005-09-08,26.799999,26.879999,26.52,26.610001,52552300,20.440414\n2005-09-07,26.940001,27.110001,26.82,26.85,44656100,20.624769\n2005-09-06,27.059999,27.290001,26.98,27.00,46089000,20.739991\n2005-09-02,27.209999,27.27,26.969999,27.02,52047500,20.755355\n2005-09-01,27.379999,27.389999,27.15,27.200001,75974500,20.893621\n2005-08-31,27.17,27.440001,27.040001,27.379999,65210200,21.031887\n2005-08-30,27.059999,27.23,26.959999,27.18,55163200,20.878258\n2005-08-29,26.809999,27.23,26.809999,27.15,52307700,20.855213\n2005-08-26,27.059999,27.08,26.870001,26.969999,36774600,20.716946\n2005-08-25,26.90,27.09,26.85,27.030001,39306300,20.763036\n2005-08-24,26.84,27.16,26.780001,26.809999,63645000,20.594043\n2005-08-23,26.84,27.07,26.74,26.870001,48296700,20.640133\n2005-08-22,26.790001,27.17,26.77,26.91,41691700,20.670858\n2005-08-19,26.85,26.91,26.700001,26.719999,36043500,20.524909\n2005-08-18,26.889999,27.08,26.799999,26.82,40861900,20.601724\n2005-08-17,26.82,27.15,26.66,26.950001,52413100,20.701585\n2005-08-16,27.030001,27.139999,26.700001,26.74,46894600,20.540273\n2005-08-15,26.98,27.299999,26.690001,27.129999,45976600,20.83985\n2005-08-12,27.08,27.139999,26.90,27.049999,52006500,20.716947\n2005-08-11,26.98,27.299999,26.889999,27.27,48646800,20.88544\n2005-08-10,27.41,27.50,26.85,26.950001,62818800,20.64036\n2005-08-09,27.219999,27.51,27.01,27.35,64761800,20.94671\n2005-08-08,27.799999,27.84,27.08,27.129999,77207200,20.778217\n2005-08-05,27.290001,27.940001,27.25,27.76,82212400,21.260719\n2005-08-04,27.16,27.50,27.049999,27.32,91461400,20.923734\n2005-08-03,26.76,27.43,26.73,27.25,139422400,20.870122\n2005-08-02,25.90,26.90,25.870001,26.809999,137510100,20.533137\n2005-08-01,25.809999,26.049999,25.76,25.92,61346800,19.851507\n2005-07-29,25.780001,26.00,25.59,25.610001,59524400,19.614086\n2005-07-28,25.75,25.85,25.66,25.75,44738700,19.721308\n2005-07-27,25.610001,25.799999,25.530001,25.719999,57977300,19.698332\n2005-07-26,25.719999,25.74,25.530001,25.540001,51476400,19.560475\n2005-07-25,25.690001,25.90,25.65,25.690001,45174600,19.675356\n2005-07-22,25.99,26.34,25.629999,25.68,97558900,19.667697\n2005-07-21,26.299999,26.48,26.00,26.440001,112932100,20.249763\n2005-07-20,26.00,26.23,25.879999,26.190001,71424800,20.058294\n2005-07-19,25.790001,26.25,25.75,26.16,113290100,20.035317\n2005-07-18,25.709999,25.790001,25.549999,25.549999,39668000,19.568133\n2005-07-15,26.040001,26.10,25.75,25.790001,56472800,19.751944\n2005-07-14,25.790001,26.10,25.790001,25.969999,69506800,19.889801\n2005-07-13,25.530001,25.75,25.48,25.66,44749200,19.652379\n2005-07-12,25.24,25.620001,25.200001,25.610001,63384800,19.614086\n2005-07-11,25.15,25.379999,25.110001,25.290001,61525400,19.369006\n2005-07-08,24.639999,25.120001,24.629999,25.09,56104000,19.21583\n2005-07-07,24.58,24.709999,24.50,24.65,80082900,18.878844\n2005-07-06,24.969999,25.08,24.690001,24.700001,64214600,18.917139\n2005-07-05,24.66,25.190001,24.620001,24.98,61883500,19.131583\n2005-07-01,24.85,24.99,24.67,24.709999,69718400,18.924797\n2005-06-30,25.059999,25.139999,24.82,24.84,82018200,19.024361\n2005-06-29,25.219999,25.32,25.00,25.09,55859900,19.21583\n2005-06-28,25.09,25.200001,25.030001,25.07,53058100,19.200512\n2005-06-27,25.07,25.25,25.030001,25.049999,61636200,19.185195\n2005-06-24,25.219999,25.40,25.040001,25.040001,57970700,19.177537\n2005-06-23,25.17,25.620001,25.15,25.309999,105159800,19.384323\n2005-06-22,25.110001,25.26,25.030001,25.07,60492700,19.200512\n2005-06-21,25.08,25.190001,25.040001,25.15,81084000,19.261782\n2005-06-20,24.98,25.280001,24.93,25.110001,50538900,19.231148\n2005-06-17,25.27,25.290001,24.92,25.040001,90821300,19.177537\n2005-06-16,25.219999,25.23,24.950001,25.040001,65918800,19.177537\n2005-06-15,25.40,25.41,25.110001,25.26,50764800,19.346029\n2005-06-14,25.309999,25.440001,25.24,25.360001,44243300,19.422617\n2005-06-13,25.360001,25.49,25.26,25.309999,49104100,19.384323\n2005-06-10,25.49,25.52,25.34,25.43,39459800,19.476228\n2005-06-09,25.40,25.610001,25.35,25.51,52767900,19.537498\n2005-06-08,25.549999,25.620001,25.34,25.40,45369700,19.453251\n2005-06-07,25.33,25.83,25.309999,25.51,54511400,19.537498\n2005-06-06,25.379999,25.50,25.309999,25.370001,40756900,19.430276\n2005-06-03,25.700001,25.809999,25.34,25.43,79659500,19.476228\n2005-06-02,25.709999,25.860001,25.639999,25.790001,27212500,19.751944\n2005-06-01,25.73,26.00,25.610001,25.809999,54621000,19.767261\n2005-05-31,25.99,26.030001,25.75,25.799999,46131100,19.759602\n2005-05-27,25.83,26.09,25.809999,26.07,54978000,19.966389\n2005-05-26,25.75,26.00,25.73,25.90,50579200,19.83619\n2005-05-25,25.68,25.77,25.50,25.709999,35749000,19.690673\n2005-05-24,25.799999,25.879999,25.719999,25.75,61287700,19.721308\n2005-05-23,25.74,26.07,25.74,25.85,75421100,19.797896\n2005-05-20,25.879999,25.92,25.73,25.74,64444500,19.713649\n2005-05-19,25.75,26.049999,25.700001,25.92,52120800,19.851507\n2005-05-18,25.50,25.84,25.42,25.700001,71182400,19.683015\n2005-05-17,25.309999,25.50,25.25,25.459999,39983200,19.499204\n2005-05-16,25.23,25.50,25.190001,25.49,50577300,19.52218\n2005-05-13,25.030001,25.379999,24.99,25.299999,77204300,19.315394\n2005-05-12,24.84,25.110001,24.83,25.00,74540700,19.086358\n2005-05-11,24.889999,24.969999,24.639999,24.91,59463300,19.017647\n2005-05-10,25.040001,25.08,24.82,24.90,62235100,19.010012\n2005-05-09,25.23,25.33,25.049999,25.110001,61872400,19.170338\n2005-05-06,25.33,25.48,25.190001,25.219999,64322600,19.254317\n2005-05-05,25.200001,25.33,25.08,25.23,59362300,19.261952\n2005-05-04,25.34,25.40,25.110001,25.209999,86864200,19.246683\n2005-05-03,25.129999,25.40,25.09,25.360001,67867800,19.361202\n2005-05-02,25.23,25.360001,24.950001,25.23,54376700,19.261952\n2005-04-29,24.879999,25.299999,24.790001,25.299999,98641200,19.315394\n2005-04-28,24.82,24.92,24.440001,24.450001,83623100,18.666459\n2005-04-27,24.66,25.15,24.629999,24.99,47732800,19.078723\n2005-04-26,24.950001,25.25,24.74,24.76,60464300,18.903129\n2005-04-25,25.07,25.280001,24.860001,24.99,75457900,19.078723\n2005-04-22,25.049999,25.25,24.780001,24.98,80087500,19.071089\n2005-04-21,24.48,25.389999,24.469999,25.280001,93562300,19.300126\n2005-04-20,24.66,24.700001,24.299999,24.32,91923500,18.567209\n2005-04-19,24.709999,24.799999,24.450001,24.629999,65956200,18.803879\n2005-04-18,24.450001,24.84,24.40,24.65,75766400,18.819149\n2005-04-15,24.58,24.90,24.41,24.459999,100251600,18.674092\n2005-04-14,25.01,25.139999,24.83,24.84,66754400,18.964205\n2005-04-13,25.23,25.450001,24.99,25.040001,60929300,19.116897\n2005-04-12,24.92,25.35,24.799999,25.32,67517800,19.330663\n2005-04-11,25.030001,25.110001,24.860001,24.969999,47791800,19.063454\n2005-04-08,25.07,25.25,24.91,24.940001,47956300,19.040551\n2005-04-07,24.66,25.129999,24.629999,25.10,77451500,19.162704\n2005-04-06,24.469999,24.940001,24.450001,24.67,78020200,18.834418\n2005-04-05,24.219999,24.50,24.120001,24.469999,73549600,18.681727\n2005-04-04,24.110001,24.26,23.940001,24.23,62196400,18.498498\n2005-04-01,24.24,24.35,24.10,24.120001,64619600,18.414519\n2005-03-31,24.25,24.309999,24.120001,24.17,62382300,18.452691\n2005-03-30,24.040001,24.190001,24.00,24.16,59585700,18.445056\n2005-03-29,24.139999,24.24,23.82,23.92,74231700,18.261827\n2005-03-28,24.40,24.469999,24.18,24.200001,49802000,18.475595\n2005-03-24,24.24,24.469999,24.200001,24.280001,78820900,18.536671\n2005-03-23,23.99,24.389999,23.959999,24.18,79293300,18.460326\n2005-03-22,24.190001,24.27,23.959999,23.99,102113300,18.315269\n2005-03-21,24.35,24.360001,24.15,24.200001,71446200,18.475595\n2005-03-18,24.530001,24.91,24.280001,24.309999,135904000,18.559574\n2005-03-17,24.639999,24.68,24.530001,24.540001,60573200,18.73517\n2005-03-16,24.82,24.969999,24.559999,24.629999,74841400,18.803879\n2005-03-15,25.10,25.24,24.889999,24.91,71469400,19.017647\n2005-03-14,25.08,25.15,24.959999,25.110001,65550500,19.170338\n2005-03-11,25.450001,25.48,25.059999,25.09,60617900,19.155069\n2005-03-10,25.43,25.48,25.25,25.43,59132900,19.414644\n2005-03-09,25.389999,25.57,25.280001,25.309999,62991800,19.323028\n2005-03-08,25.40,25.620001,25.34,25.40,52871800,19.391739\n2005-03-07,25.17,25.790001,25.16,25.469999,80407400,19.445181\n2005-03-04,25.209999,25.299999,25.129999,25.17,63058200,19.216145\n2005-03-03,25.299999,25.309999,25.139999,25.17,52183600,19.216145\n2005-03-02,25.190001,25.48,25.16,25.26,67739000,19.284856\n2005-03-01,25.190001,25.41,25.129999,25.280001,56394800,19.300126\n2005-02-28,25.219999,25.370001,25.129999,25.16,82728000,19.208511\n2005-02-25,25.33,25.379999,25.15,25.25,62467700,19.277222\n2005-02-24,25.18,25.440001,25.15,25.370001,85236300,19.368837\n2005-02-23,25.24,25.35,25.17,25.200001,83689400,19.239049\n2005-02-22,25.25,25.49,25.200001,25.23,96419200,19.261952\n2005-02-18,25.639999,25.65,25.40,25.48,77091100,19.452816\n2005-02-17,25.709999,25.860001,25.60,25.65,67024800,19.582603\n2005-02-16,25.870001,25.93,25.67,25.790001,57506600,19.689488\n2005-02-15,26.00,26.08,25.860001,25.93,76551600,19.796371\n2005-02-14,25.93,26.120001,25.91,26.01,58694000,19.796371\n2005-02-11,26.030001,26.120001,25.809999,25.969999,83835900,19.765926\n2005-02-10,26.10,26.129999,26.00,26.059999,71796400,19.834425\n2005-02-09,26.25,26.309999,26.040001,26.07,77874800,19.842037\n2005-02-08,26.190001,26.34,26.16,26.24,61343700,19.971425\n2005-02-07,26.27,26.299999,26.059999,26.16,57763400,19.910536\n2005-02-04,26.17,26.370001,26.139999,26.32,61246500,20.032313\n2005-02-03,26.370001,26.40,26.10,26.18,62545400,19.925759\n2005-02-02,26.42,26.50,26.280001,26.459999,79329500,20.138868\n2005-02-01,26.25,26.43,26.219999,26.389999,57981700,20.08559\n2005-01-31,26.35,26.52,26.16,26.280001,71442100,20.00187\n2005-01-28,26.540001,26.65,25.959999,26.18,110466500,19.925759\n2005-01-27,25.950001,26.16,25.85,26.110001,93204100,19.872482\n2005-01-26,26.07,26.17,25.90,26.01,64974500,19.796371\n2005-01-25,25.76,26.190001,25.75,26.02,67580700,19.803982\n2005-01-24,25.76,26.00,25.639999,25.67,69010900,19.537595\n2005-01-21,25.950001,26.129999,25.639999,25.65,76501000,19.522372\n2005-01-20,25.84,26.10,25.74,25.860001,58380100,19.682205\n2005-01-19,26.209999,26.26,25.92,25.98,58114100,19.773537\n2005-01-18,26.030001,26.35,25.84,26.32,69146400,20.032313\n2005-01-14,26.40,26.450001,26.040001,26.120001,92180800,19.880093\n2005-01-13,26.68,26.799999,26.16,26.27,89861600,19.994258\n2005-01-12,26.77,26.85,26.620001,26.780001,72940600,20.382423\n2005-01-11,26.690001,26.82,26.610001,26.73,64712000,20.344367\n2005-01-10,26.60,26.860001,26.540001,26.799999,70376600,20.397644\n2005-01-07,26.82,26.889999,26.620001,26.67,68723300,20.298701\n2005-01-06,26.85,27.059999,26.639999,26.75,76890500,20.359589\n2005-01-05,26.84,27.10,26.76,26.780001,72463500,20.382423\n2005-01-04,26.870001,27.10,26.66,26.84,109442100,20.428089\n2005-01-03,26.799999,26.950001,26.65,26.74,65002900,20.351978\n2004-12-31,26.75,26.90,26.68,26.719999,54959500,20.336755\n2004-12-30,26.889999,26.940001,26.75,26.76,48355400,20.3672\n2004-12-29,26.85,27.00,26.82,26.90,47594900,20.473755\n2004-12-28,26.85,27.030001,26.799999,26.950001,55075900,20.511811\n2004-12-27,27.01,27.10,26.82,26.85,55958500,20.4357\n2004-12-23,26.870001,27.15,26.83,27.01,65801900,20.557477\n2004-12-22,26.84,27.15,26.780001,26.969999,63651900,20.527032\n2004-12-21,27.00,27.17,26.940001,27.07,94646100,20.603143\n2004-12-20,27.01,27.15,26.889999,26.950001,85552800,20.511811\n2004-12-17,27.00,27.32,26.799999,26.959999,126184400,20.519421\n2004-12-16,27.15,27.280001,27.01,27.16,88997500,20.671642\n2004-12-15,27.219999,27.40,27.07,27.110001,106303900,20.633588\n2004-12-14,27.049999,27.33,27.040001,27.23,127843200,20.72492\n2004-12-13,27.10,27.280001,26.91,27.25,93812500,20.740142\n2004-12-10,27.08,27.18,27.040001,27.08,70949200,20.610754\n2004-12-09,27.129999,27.360001,26.940001,27.23,83006000,20.72492\n2004-12-08,27.01,27.360001,26.91,27.360001,95655000,20.823864\n2004-12-07,27.26,27.379999,27.00,27.07,111656000,20.603143\n2004-12-06,27.10,27.440001,27.07,27.33,55297400,20.801031\n2004-12-03,27.16,27.440001,27.139999,27.23,76498400,20.72492\n2004-12-02,27.27,27.40,26.92,27.09,96088300,20.618365\n2004-12-01,26.950001,27.280001,26.809999,27.25,99889000,20.740142\n2004-11-30,26.75,27.01,26.700001,26.809999,75960400,20.405255\n2004-11-29,26.639999,26.950001,26.610001,26.77,67079900,20.374812\n2004-11-26,26.559999,26.82,26.549999,26.60,24398700,20.245423\n2004-11-24,26.620001,26.73,26.40,26.639999,60069200,20.275867\n2004-11-23,26.52,26.700001,26.40,26.530001,70459700,20.192146\n2004-11-22,26.75,26.82,26.10,26.65,92410800,20.283478\n2004-11-19,27.030001,27.07,26.84,26.860001,85808600,20.443311\n2004-11-18,27.129999,27.17,27.00,27.07,63249900,20.603143\n2004-11-17,27.25,27.35,27.059999,27.17,58830700,20.679254\n2004-11-16,27.33,27.34,27.049999,27.120001,64522600,20.641199\n2004-11-15,27.34,27.50,27.200001,27.389999,104468000,20.846697\n2004-11-12,30.16,30.200001,29.799999,29.969999,162269000,20.466143\n2004-11-11,29.889999,30.08,29.82,29.98,87358900,20.472972\n2004-11-10,29.92,30.00,29.690001,29.73,84097700,20.30225\n2004-11-09,29.43,29.889999,29.35,29.77,100401000,20.329566\n2004-11-08,29.18,29.48,29.129999,29.280001,112802100,19.994952\n2004-11-05,29.209999,29.360001,29.030001,29.309999,95337700,20.015437\n2004-11-04,28.379999,29.00,28.379999,29.00,87867700,19.803743\n2004-11-03,28.65,28.65,28.309999,28.469999,79666700,19.441812\n2004-11-02,28.26,28.469999,28.030001,28.24,89417100,19.284748\n2004-11-01,28.16,28.280001,27.959999,28.08,72930900,19.175486\n2004-10-29,28.120001,28.15,27.799999,27.969999,80010100,19.100368\n2004-10-28,28.110001,28.540001,27.90,28.01,63059600,19.127684\n2004-10-27,27.860001,28.35,27.58,28.15,72392600,19.223288\n2004-10-26,27.709999,27.90,27.629999,27.90,76966600,19.052566\n2004-10-25,27.67,27.77,27.549999,27.629999,61529500,18.868186\n2004-10-22,28.299999,28.34,27.58,27.74,101912800,18.943304\n2004-10-21,28.809999,28.889999,28.469999,28.559999,94988500,19.503272\n2004-10-20,28.219999,28.75,28.120001,28.700001,69078100,19.598877\n2004-10-19,28.530001,28.59,28.17,28.18,57026500,19.243775\n2004-10-18,28.07,28.450001,27.98,28.41,50350700,19.400839\n2004-10-15,27.969999,28.24,27.82,27.99,49828500,19.114026\n2004-10-14,28.040001,28.16,27.799999,27.799999,41548700,18.984277\n2004-10-13,28.190001,28.27,27.940001,28.030001,49500700,19.141342\n2004-10-12,27.83,28.16,27.809999,28.030001,56412900,19.141342\n2004-10-11,28.200001,28.219999,27.93,28.059999,44691000,19.161828\n2004-10-08,28.10,28.33,27.969999,27.99,49556600,19.114026\n2004-10-07,28.540001,28.59,28.16,28.17,38401500,19.236946\n2004-10-06,28.389999,28.549999,28.23,28.530001,56999600,19.482786\n2004-10-05,28.15,28.450001,28.10,28.379999,58017700,19.380352\n2004-10-04,28.440001,28.459999,28.07,28.120001,62016200,19.202802\n2004-10-01,27.82,28.32,27.780001,28.25,66302800,19.291577\n2004-09-30,27.59,27.790001,27.52,27.65,71218000,18.881844\n2004-09-29,27.26,27.690001,27.23,27.58,61529300,18.834042\n2004-09-28,27.209999,27.360001,27.040001,27.27,62055100,18.622347\n2004-09-27,27.17,27.32,27.129999,27.190001,47813600,18.567716\n2004-09-24,27.389999,27.459999,27.190001,27.290001,49859800,18.636005\n2004-09-23,27.190001,27.389999,27.17,27.35,52155800,18.676978\n2004-09-22,27.280001,27.74,27.07,27.120001,68409000,18.519914\n2004-09-21,27.450001,27.530001,27.25,27.26,73874400,18.615518\n2004-09-20,27.440001,27.65,27.33,27.51,51513600,18.78624\n2004-09-17,27.389999,27.530001,27.26,27.51,65283000,18.78624\n2004-09-16,27.219999,27.35,27.17,27.26,35951500,18.615518\n2004-09-15,27.360001,27.40,27.139999,27.190001,52605700,18.567716\n2004-09-14,27.370001,27.51,27.27,27.440001,55920000,18.738438\n2004-09-13,27.530001,27.57,26.74,27.25,48239200,18.608689\n2004-09-10,27.34,27.51,27.18,27.49,52664500,18.772582\n2004-09-09,27.299999,27.469999,27.18,27.280001,56904700,18.629176\n2004-09-08,27.299999,27.469999,27.139999,27.26,53278100,18.615518\n2004-09-07,27.290001,27.379999,27.16,27.360001,44893400,18.683807\n2004-09-03,27.459999,27.620001,27.10,27.110001,46174400,18.513085\n2004-09-02,27.40,27.68,27.35,27.620001,42161700,18.861358\n2004-09-01,27.23,27.52,27.139999,27.389999,48507500,18.704293\n2004-08-31,27.290001,27.32,27.049999,27.299999,52106700,18.642833\n2004-08-30,27.299999,27.389999,26.85,27.299999,36679600,18.642833\n2004-08-27,27.50,27.65,27.450001,27.459999,33248700,18.752095\n2004-08-26,27.459999,27.60,27.389999,27.440001,35465500,18.738438\n2004-08-25,27.209999,27.67,27.18,27.549999,53512700,18.813555\n2004-08-24,27.40,27.459999,27.09,27.24,40835300,18.60186\n2004-08-23,27.27,27.33,27.120001,27.24,39572200,18.60186\n2004-08-20,27.129999,27.370001,27.040001,27.200001,46494800,18.519914\n2004-08-19,27.35,27.450001,27.01,27.120001,46293000,18.465444\n2004-08-18,26.93,27.50,26.889999,27.459999,58844000,18.696942\n2004-08-17,27.219999,27.379999,26.98,27.049999,56879700,18.417781\n2004-08-16,27.030001,27.200001,26.959999,27.09,54347200,18.445017\n2004-08-13,27.01,27.25,26.98,27.02,43333200,18.397356\n2004-08-12,27.23,27.309999,26.860001,26.879999,50279700,18.302032\n2004-08-11,27.389999,27.51,27.200001,27.41,53097300,18.662898\n2004-08-10,27.299999,27.75,27.25,27.719999,57632700,18.87397\n2004-08-09,27.26,27.280001,27.10,27.18,51877500,18.506296\n2004-08-06,27.379999,27.860001,27.059999,27.139999,75628000,18.47906\n2004-08-05,28.16,28.209999,27.52,27.530001,55591700,18.744604\n2004-08-04,28.01,28.200001,27.99,28.059999,46217900,19.105469\n2004-08-03,28.379999,28.42,28.00,28.07,53990900,19.112278\n2004-08-02,28.27,28.549999,28.16,28.52,52267000,19.418674\n2004-07-30,28.450001,28.809999,28.33,28.49,59552900,19.398248\n2004-07-29,28.780001,28.799999,28.25,28.48,60148400,19.391439\n2004-07-28,28.34,28.790001,28.280001,28.58,62718800,19.459527\n2004-07-27,28.700001,28.76,28.129999,28.440001,72968400,19.364204\n2004-07-26,28.360001,28.709999,28.200001,28.66,72387600,19.513997\n2004-07-23,28.379999,28.40,28.02,28.030001,97372700,19.085044\n2004-07-22,29.07,29.299999,28.83,29.00,124640700,19.745496\n2004-07-21,29.889999,29.889999,28.809999,28.860001,201518000,19.650173\n2004-07-20,28.00,28.48,27.85,28.32,89010700,19.282498\n2004-07-19,27.620001,28.26,27.60,27.950001,60354500,19.030573\n2004-07-16,28.18,28.200001,27.25,27.48,66406300,18.710559\n2004-07-15,28.049999,28.200001,27.799999,27.870001,46759700,18.976103\n2004-07-14,27.40,28.360001,27.34,28.129999,87656300,19.153131\n2004-07-13,27.91,27.950001,27.60,27.60,43274100,18.792266\n2004-07-12,27.67,28.00,27.59,27.889999,45757300,18.98972\n2004-07-09,27.780001,28.00,27.639999,27.860001,50249300,18.969294\n2004-07-08,27.879999,28.15,27.549999,27.639999,59125100,18.8195\n2004-07-07,27.67,28.32,27.549999,28.10,66255700,19.132705\n2004-07-06,28.32,28.33,27.940001,28.02,69158900,19.078235\n2004-07-02,28.620001,28.68,28.40,28.57,36690100,19.452718\n2004-07-01,28.700001,28.84,28.26,28.629999,78441400,19.49357\n2004-06-30,28.57,28.799999,28.389999,28.559999,83544400,19.445909\n2004-06-29,28.18,28.58,28.18,28.50,55371700,19.405057\n2004-06-28,28.60,28.75,28.17,28.280001,77024100,19.255264\n2004-06-25,28.48,28.629999,28.25,28.57,71136500,19.452718\n2004-06-24,28.48,28.65,28.360001,28.389999,65503800,19.330159\n2004-06-23,28.200001,28.379999,28.00,28.299999,58558400,19.26888\n2004-06-22,28.15,28.35,27.809999,28.290001,98932000,19.262073\n2004-06-21,28.219999,28.66,28.120001,28.35,116881700,19.302925\n2004-06-18,27.77,28.50,27.700001,28.35,134218700,19.302925\n2004-06-17,27.309999,27.92,27.290001,27.77,105427500,18.908015\n2004-06-16,27.34,27.50,27.15,27.32,67431100,18.601619\n2004-06-15,26.99,27.60,26.969999,27.41,114183400,18.662898\n2004-06-14,26.549999,26.90,26.530001,26.90,67377500,18.31565\n2004-06-10,26.379999,26.790001,26.379999,26.77,48109200,18.227136\n2004-06-09,26.40,26.65,26.40,26.469999,50385500,18.022871\n2004-06-08,26.280001,26.65,26.24,26.60,58447700,18.111386\n2004-06-07,26.02,26.43,25.969999,26.43,65218600,17.995637\n2004-06-04,26.030001,26.24,25.940001,25.950001,48815300,17.668815\n2004-06-03,26.049999,26.129999,25.860001,25.889999,45933100,17.627961\n2004-06-02,26.120001,26.280001,26.01,26.129999,54020000,17.791372\n2004-06-01,26.129999,26.27,25.870001,26.110001,48369500,17.777756\n2004-05-28,26.139999,26.35,26.02,26.23,37393000,17.85946\n2004-05-27,26.16,26.190001,25.92,26.190001,49071900,17.832226\n2004-05-26,25.99,26.15,25.85,26.139999,50306900,17.798181\n2004-05-25,25.709999,26.190001,25.60,26.10,66615000,17.770947\n2004-05-24,26.049999,26.17,25.74,25.76,56250500,17.539448\n2004-05-21,25.969999,26.200001,25.780001,25.889999,57809300,17.627961\n2004-05-20,25.75,25.870001,25.59,25.73,52089900,17.519021\n2004-05-19,26.030001,26.27,25.620001,25.620001,60052800,17.444125\n2004-05-18,25.700001,25.969999,25.639999,25.83,58158600,17.587109\n2004-05-17,25.469999,25.790001,25.42,25.540001,55149600,17.389655\n2004-05-14,26.00,26.17,25.639999,25.860001,43775300,17.607536\n2004-05-13,25.82,26.190001,25.790001,26.10,63861500,17.770947\n2004-05-12,25.870001,26.00,25.43,25.940001,64145600,17.662006\n2004-05-11,26.09,26.110001,25.790001,25.940001,57917200,17.662006\n2004-05-10,25.629999,26.049999,25.620001,25.93,64621400,17.655197\n2004-05-07,26.030001,26.379999,25.75,25.780001,68290200,17.553066\n2004-05-06,26.16,26.34,26.030001,26.120001,62693900,17.784565\n2004-05-05,26.32,26.60,26.25,26.299999,51841700,17.907122\n2004-05-04,26.35,26.540001,26.02,26.33,55496400,17.927549\n2004-05-03,26.190001,26.52,26.190001,26.35,65916200,17.941167\n2004-04-30,26.59,26.75,25.959999,26.129999,66172200,17.791372\n2004-04-29,26.51,26.940001,26.309999,26.48,77787300,18.02968\n2004-04-28,27.01,27.049999,26.469999,26.559999,72842200,18.084151\n2004-04-27,27.16,27.370001,27.129999,27.219999,80716800,18.533531\n2004-04-26,27.450001,27.549999,27.10,27.24,89391000,18.547149\n2004-04-23,27.40,27.719999,27.34,27.540001,258269000,18.751413\n2004-04-22,25.51,25.99,25.469999,25.950001,99207700,17.668815\n2004-04-21,25.360001,25.49,25.200001,25.450001,49252000,17.328376\n2004-04-20,25.65,25.879999,25.280001,25.33,59902600,17.246669\n2004-04-19,25.08,25.60,25.059999,25.530001,44592100,17.382846\n2004-04-16,25.33,25.40,25.110001,25.16,51768600,17.13092\n2004-04-15,25.530001,25.73,25.10,25.219999,73756900,17.171772\n2004-04-14,25.389999,25.68,25.379999,25.51,61079600,17.369228\n2004-04-13,25.68,25.77,25.41,25.450001,56971500,17.328376\n2004-04-12,25.48,25.74,25.43,25.610001,38786800,17.437316\n2004-04-08,25.82,25.85,25.360001,25.48,45294600,17.348801\n2004-04-07,25.74,25.780001,25.35,25.59,63268900,17.423698\n2004-04-06,25.77,25.90,25.66,25.799999,48992000,17.566682\n2004-04-05,25.809999,25.98,25.73,25.950001,53800300,17.668815\n2004-04-02,25.48,25.90,25.440001,25.85,98043800,17.600727\n2004-04-01,24.950001,25.110001,24.85,25.08,69051900,17.07645\n2004-03-31,25.200001,25.200001,24.870001,24.93,70533200,16.974318\n2004-03-30,25.209999,25.33,25.030001,25.200001,59010400,17.158156\n2004-03-29,25.25,25.40,25.00,25.309999,51881600,17.233052\n2004-03-26,25.110001,25.51,25.00,25.030001,61584900,17.042406\n2004-03-25,24.60,25.24,24.58,25.190001,85677900,17.151347\n2004-03-24,24.379999,24.58,24.18,24.41,97584700,16.620261\n2004-03-23,24.65,24.66,24.110001,24.15,91696300,16.443232\n2004-03-22,24.48,24.84,24.01,24.50,127605200,16.68154\n2004-03-19,24.77,24.940001,24.559999,24.629999,86281600,16.770054\n2004-03-18,24.959999,25.030001,24.58,24.889999,123231000,16.947082\n2004-03-17,25.25,25.459999,25.110001,25.129999,56241400,17.110493\n2004-03-16,25.26,25.370001,25.10,25.18,65453800,17.144538\n2004-03-15,25.299999,25.43,25.059999,25.16,68835300,17.13092\n2004-03-12,25.379999,25.51,25.23,25.379999,64137100,17.280713\n2004-03-11,25.18,25.780001,25.07,25.09,90536300,17.083259\n2004-03-10,25.65,25.799999,25.35,25.370001,75155800,17.273905\n2004-03-09,25.799999,25.969999,25.540001,25.719999,81111700,17.512212\n2004-03-08,26.309999,26.35,25.809999,25.83,69367800,17.587109\n2004-03-05,26.23,26.60,26.200001,26.35,59849800,17.941167\n2004-03-04,26.33,26.42,26.209999,26.370001,44023200,17.954784\n2004-03-03,26.35,26.549999,26.219999,26.370001,54998700,17.954784\n2004-03-02,26.610001,26.690001,26.35,26.389999,66331000,17.968401\n2004-03-01,26.629999,26.719999,26.50,26.700001,51912300,18.179475\n2004-02-27,26.469999,26.620001,26.35,26.530001,58266500,18.063725\n2004-02-26,26.59,26.65,26.41,26.50,66602700,18.043298\n2004-02-25,26.90,26.99,26.610001,26.700001,64275700,18.179475\n2004-02-24,26.610001,26.950001,26.549999,26.879999,55426500,18.302032\n2004-02-23,26.73,26.76,26.48,26.610001,50256800,18.118195\n2004-02-20,26.66,26.799999,26.50,26.57,57821900,18.090959\n2004-02-19,26.92,26.98,26.43,26.459999,61840600,18.016062\n2004-02-18,26.90,27.110001,26.74,26.77,50334700,18.227136\n2004-02-17,26.719999,27.10,26.59,26.99,43477000,18.376929\n2004-02-13,26.98,27.059999,26.50,26.59,67541100,18.104577\n2004-02-12,27.09,27.15,26.93,26.950001,44537000,18.349694\n2004-02-11,26.969999,27.23,26.85,27.15,51515300,18.485869\n2004-02-10,26.870001,27.15,26.82,27.02,37790600,18.397356\n2004-02-09,27.190001,27.23,26.85,26.90,48108500,18.31565\n2004-02-06,27.030001,27.190001,26.93,27.08,47209600,18.438208\n2004-02-05,27.059999,27.17,26.83,26.959999,55527500,18.356502\n2004-02-04,27.219999,27.43,27.01,27.01,60648000,18.390547\n2004-02-03,27.40,27.549999,27.18,27.290001,47993800,18.581193\n2004-02-02,27.610001,27.799999,27.24,27.40,62891800,18.656089\n2004-01-30,27.84,27.90,27.549999,27.65,40528700,18.826309\n2004-01-29,27.809999,27.950001,27.57,27.91,63748400,19.003338\n2004-01-28,28.299999,28.440001,27.469999,27.709999,71336000,18.867161\n2004-01-27,28.639999,28.719999,28.219999,28.25,63196200,19.234837\n2004-01-26,28.49,28.83,28.32,28.799999,58299600,19.60932\n2004-01-23,28.280001,28.76,28.219999,28.48,127259100,19.391439\n2004-01-22,28.360001,28.440001,27.940001,28.01,78425200,19.071426\n2004-01-21,28.129999,28.299999,27.85,28.299999,53570600,19.26888\n2004-01-20,27.98,28.200001,27.93,28.10,63068500,19.132705\n2004-01-16,27.709999,27.879999,27.530001,27.809999,63983400,18.93525\n2004-01-15,27.549999,27.719999,27.42,27.540001,58504100,18.751413\n2004-01-14,27.52,27.73,27.469999,27.700001,43907000,18.860354\n2004-01-13,27.549999,27.639999,27.26,27.43,51555900,18.676516\n2004-01-12,27.67,27.73,27.35,27.57,55845200,18.771839\n2004-01-09,28.030001,28.059999,27.59,27.66,67079900,18.833118\n2004-01-08,28.389999,28.48,28.00,28.16,58810800,19.173557\n2004-01-07,28.17,28.309999,28.01,28.209999,54298200,19.207601\n2004-01-06,28.190001,28.280001,28.07,28.24,46950800,19.228028\n2004-01-05,27.73,28.18,27.719999,28.139999,67333700,19.15994\n2004-01-02,27.58,27.77,27.33,27.450001,44487700,18.690134\n2003-12-31,27.42,27.549999,27.23,27.370001,42198900,18.635664\n2003-12-30,27.41,27.549999,27.40,27.52,34406600,18.737795\n2003-12-29,27.209999,27.530001,27.16,27.459999,40426700,18.696942\n2003-12-26,27.049999,27.25,27.00,27.209999,12076900,18.526722\n2003-12-24,27.139999,27.16,27.00,27.040001,19924200,18.410974\n2003-12-23,27.17,27.34,27.01,27.15,39609000,18.485869\n2003-12-22,27.16,27.43,26.969999,27.18,43894800,18.506296\n2003-12-19,27.49,27.549999,27.190001,27.360001,76856400,18.628855\n2003-12-18,27.10,27.450001,27.049999,27.40,61177800,18.656089\n2003-12-17,27.040001,27.08,26.85,27.040001,53712300,18.410974\n2003-12-16,26.83,27.16,26.77,27.059999,73978000,18.42459\n2003-12-15,27.049999,27.10,26.68,26.74,88860600,18.206709\n2003-12-12,26.690001,26.809999,26.50,26.65,69154100,18.14543\n2003-12-11,26.59,26.77,26.280001,26.610001,79309000,18.118195\n2003-12-10,26.450001,26.629999,26.379999,26.59,82853700,18.104577\n2003-12-09,26.440001,26.610001,26.25,26.379999,103547100,17.961592\n2003-12-08,26.120001,26.34,25.809999,26.24,90504000,17.866269\n2003-12-05,25.959999,26.48,25.92,25.98,96610900,17.689241\n2003-12-04,25.719999,26.23,25.66,26.200001,87202400,17.839035\n2003-12-03,25.82,26.07,25.620001,25.67,93121600,17.478168\n2003-12-02,25.950001,26.09,25.610001,25.66,85121700,17.47136\n2003-12-01,25.90,26.209999,25.50,25.84,101914600,17.593918\n2003-11-28,25.50,25.75,25.40,25.709999,33402600,17.505403\n2003-11-26,25.610001,25.629999,25.32,25.450001,69758400,17.328376\n2003-11-25,25.870001,25.950001,25.379999,25.40,85663800,17.294331\n2003-11-24,25.33,25.809999,25.280001,25.73,99463800,17.519021\n2003-11-21,25.33,25.379999,25.08,25.110001,70712900,17.096877\n2003-11-20,25.17,25.629999,25.08,25.10,106845700,17.090068\n2003-11-19,25.290001,25.540001,25.17,25.35,78853300,17.260287\n2003-11-18,25.33,25.84,25.120001,25.15,106868300,17.124111\n2003-11-17,25.389999,25.440001,24.84,25.15,103900200,17.124111\n2003-11-14,25.700001,26.02,25.440001,25.50,83146400,17.362419\n2003-11-13,25.860001,25.93,25.450001,25.690001,78949500,17.491786\n2003-11-12,25.85,26.139999,25.60,25.98,75877300,17.689241\n2003-11-11,26.01,26.08,25.67,25.799999,64990700,17.566682\n2003-11-10,26.120001,26.23,26.00,26.00,54579100,17.702859\n2003-11-07,26.379999,26.49,26.030001,26.10,57822100,17.770947\n2003-11-06,26.26,26.299999,26.00,26.23,68189800,17.85946\n2003-11-05,26.15,26.32,26.00,26.10,61514400,17.770947\n2003-11-04,26.59,26.620001,26.01,26.07,84026100,17.75052\n2003-11-03,26.35,26.75,26.290001,26.68,57772300,18.165857\n2003-10-31,26.370001,26.440001,26.110001,26.139999,69623700,17.798181\n2003-10-30,27.01,27.040001,25.91,26.120001,98729400,17.784565\n2003-10-29,27.16,27.25,26.66,26.74,73551500,18.206709\n2003-10-28,27.09,27.219999,26.879999,27.200001,71752600,18.519914\n2003-10-27,26.91,27.10,26.82,26.91,65619100,18.322459\n2003-10-24,27.27,27.40,26.42,26.610001,210558300,18.118195\n2003-10-23,28.719999,29.08,28.10,28.91,67357900,19.684217\n2003-10-22,29.030001,29.209999,28.799999,28.889999,48798500,19.670599\n2003-10-21,29.35,29.43,29.17,29.35,44166800,19.983804\n2003-10-20,28.950001,29.370001,28.799999,29.35,38794500,19.983804\n2003-10-17,29.280001,29.290001,28.799999,28.93,49960000,19.697835\n2003-10-16,28.91,29.309999,28.799999,29.23,42232500,19.902098\n2003-10-15,29.200001,29.26,28.700001,29.07,57242100,19.793157\n2003-10-14,28.66,28.77,28.48,28.68,34851300,19.418674\n2003-10-13,28.98,29.10,28.50,28.780001,39320300,19.486383\n2003-10-10,28.91,29.200001,28.67,28.91,37604700,19.574403\n2003-10-09,29.219999,29.35,28.799999,28.940001,62653300,19.594716\n2003-10-08,29.360001,29.360001,28.68,28.82,46989100,19.513465\n2003-10-07,29.01,29.370001,28.92,29.139999,52356800,19.730131\n2003-10-06,29.15,29.299999,28.91,29.190001,34047600,19.763986\n2003-10-03,29.16,29.459999,28.93,29.08,57303000,19.689506\n2003-10-02,28.450001,28.75,28.190001,28.50,38143600,19.2968\n2003-10-01,28.030001,28.629999,27.809999,28.52,58375900,19.310342\n2003-09-30,28.59,28.610001,27.75,27.799999,63333700,18.822843\n2003-09-29,28.41,28.91,28.10,28.83,47380300,19.520236\n2003-09-26,28.27,28.780001,28.139999,28.190001,49864700,19.086905\n2003-09-25,28.469999,28.959999,28.219999,28.24,56224500,19.120759\n2003-09-24,29.610001,29.700001,28.42,28.459999,66336500,19.269716\n2003-09-23,29.120001,29.709999,28.879999,29.60,57827800,20.041589\n2003-09-22,29.389999,30.00,28.809999,29.07,65678700,19.682735\n2003-09-19,29.76,29.969999,29.52,29.959999,92433800,20.285337\n2003-09-18,28.49,29.51,28.42,29.50,67268100,19.97388\n2003-09-17,28.76,28.950001,28.469999,28.50,47221600,19.2968\n2003-09-16,28.41,28.950001,28.32,28.90,52060600,19.567632\n2003-09-15,28.370001,28.610001,28.33,28.360001,41432300,19.202009\n2003-09-12,27.48,28.40,27.450001,28.34,55777200,19.188467\n2003-09-11,27.66,28.110001,27.59,27.84,37813300,18.849927\n2003-09-10,28.030001,28.18,27.48,27.549999,54763500,18.653573\n2003-09-09,28.65,28.709999,28.309999,28.370001,44315200,19.20878\n2003-09-08,28.389999,28.92,28.34,28.84,46105300,19.527007\n2003-09-05,28.23,28.75,28.17,28.379999,64024500,19.215549\n2003-09-04,28.10,28.469999,27.99,28.43,59840800,19.249404\n2003-09-03,27.42,28.40,27.379999,28.299999,109437800,19.161383\n2003-09-02,26.700001,27.299999,26.469999,27.26,74168900,18.45722\n2003-08-29,26.459999,26.549999,26.35,26.52,34503000,17.95618\n2003-08-28,26.50,26.58,26.24,26.51,46211200,17.949409\n2003-08-27,26.51,26.58,26.299999,26.42,30633900,17.888472\n2003-08-26,26.309999,26.67,25.959999,26.57,47546000,17.990034\n2003-08-25,26.309999,26.540001,26.23,26.50,36132900,17.942638\n2003-08-22,26.780001,26.950001,26.209999,26.219999,65846300,17.753055\n2003-08-21,26.65,26.73,26.129999,26.24,63802700,17.766597\n2003-08-20,26.299999,26.530001,26.00,26.450001,56739300,17.908785\n2003-08-19,25.85,26.65,25.77,26.620001,72952900,18.023889\n2003-08-18,25.559999,25.83,25.459999,25.700001,45817400,17.400974\n2003-08-15,25.610001,25.66,25.43,25.540001,27607900,17.292641\n2003-08-14,25.66,25.709999,25.52,25.629999,37338300,17.353578\n2003-08-13,25.790001,25.889999,25.50,25.60,39636900,17.333266\n2003-08-12,25.709999,25.77,25.450001,25.73,38208400,17.421286\n2003-08-11,25.610001,25.99,25.540001,25.610001,36433900,17.340037\n2003-08-08,25.879999,25.98,25.50,25.58,33241400,17.319724\n2003-08-07,25.719999,25.809999,25.450001,25.709999,44258500,17.407744\n2003-08-06,25.540001,26.190001,25.43,25.65,56294900,17.367119\n2003-08-05,26.309999,26.540001,25.60,25.66,58825800,17.37389\n2003-08-04,26.15,26.41,25.75,26.18,51825600,17.725973\n2003-08-01,26.33,26.51,26.120001,26.17,42649700,17.719202\n2003-07-31,26.60,26.99,26.309999,26.41,64504800,17.881701\n2003-07-30,26.459999,26.57,26.17,26.23,41240300,17.759826\n2003-07-29,26.879999,26.90,26.24,26.469999,62391100,17.922325\n2003-07-28,26.940001,27.00,26.49,26.610001,52658300,18.017118\n2003-07-25,26.280001,26.950001,26.07,26.889999,54173000,18.206699\n2003-07-24,26.780001,26.92,25.98,26.00,53556600,17.604098\n2003-07-23,26.42,26.65,26.139999,26.450001,49828200,17.908785\n2003-07-22,26.280001,26.559999,26.129999,26.379999,51791000,17.861388\n2003-07-21,26.870001,26.91,26.00,26.040001,48480800,17.631182\n2003-07-18,27.110001,27.23,26.75,26.889999,63388400,18.206699\n2003-07-17,27.139999,27.27,26.540001,26.690001,72805000,18.071284\n2003-07-16,27.559999,27.620001,27.200001,27.52,49838900,18.633261\n2003-07-15,27.469999,27.530001,27.10,27.27,53567600,18.463991\n2003-07-14,27.629999,27.809999,27.049999,27.40,60464400,18.552011\n2003-07-11,26.950001,27.450001,26.889999,27.309999,50377300,18.491073\n2003-07-10,27.25,27.42,26.59,26.91,55350800,18.220241\n2003-07-09,27.559999,27.700001,27.25,27.469999,62300700,18.599406\n2003-07-08,27.26,27.799999,27.25,27.700001,61896800,18.755136\n2003-07-07,27.02,27.549999,26.950001,27.42,88960800,18.565553\n2003-07-03,26.690001,26.950001,26.41,26.50,39440900,17.942638\n2003-07-02,26.50,26.93,26.450001,26.879999,94069300,18.199928\n2003-07-01,25.59,26.200001,25.389999,26.15,60926000,17.70566\n2003-06-30,25.940001,26.120001,25.50,25.639999,48073100,17.360349\n2003-06-27,25.950001,26.34,25.530001,25.629999,76040300,17.353578\n2003-06-26,25.389999,26.51,25.209999,25.75,51758100,17.434828\n2003-06-25,25.639999,25.99,25.139999,25.26,60483500,17.103058\n2003-06-24,25.65,26.040001,25.52,25.700001,51820300,17.400974\n2003-06-23,26.139999,26.24,25.49,25.780001,52584500,17.455141\n2003-06-20,26.34,26.379999,26.01,26.33,86048900,17.827535\n2003-06-19,26.09,26.389999,26.01,26.07,63626900,17.651493\n2003-06-18,25.98,26.43,25.709999,26.07,89957700,17.651493\n2003-06-17,25.639999,26.139999,25.530001,25.959999,122213900,17.577014\n2003-06-16,24.799999,25.42,24.67,25.389999,69658600,17.191078\n2003-06-13,25.200001,25.25,24.49,24.65,55157500,16.690039\n2003-06-12,24.969999,25.139999,24.74,24.99,66177700,16.920246\n2003-06-11,24.67,24.959999,24.42,24.879999,75768600,16.845767\n2003-06-10,23.940001,24.75,23.85,24.68,80655300,16.710352\n2003-06-09,23.719999,23.98,23.60,23.75,73610000,16.080666\n2003-06-06,24.440001,24.559999,23.65,23.67,119629400,16.0265\n2003-06-05,24.469999,24.52,24.01,24.09,115877900,16.310874\n2003-06-04,24.99,25.219999,24.74,24.870001,83484600,16.838997\n2003-06-03,24.75,24.92,24.57,24.879999,61058200,16.845767\n2003-06-02,24.98,25.030001,24.57,24.639999,66310800,16.683268\n2003-05-30,24.73,24.91,24.51,24.610001,85096700,16.662956\n2003-05-29,24.469999,24.67,24.23,24.40,75451300,16.520769\n2003-05-28,24.780001,24.870001,24.299999,24.41,91467000,16.52754\n2003-05-27,24.25,24.889999,24.219999,24.790001,68486800,16.784831\n2003-05-23,24.200001,24.540001,24.030001,24.219999,76968000,16.398894\n2003-05-22,24.200001,24.27,24.040001,24.16,93157100,16.358269\n2003-05-21,24.629999,24.709999,23.889999,24.030001,108960900,16.270249\n2003-05-20,24.860001,25.00,24.50,24.629999,52677600,16.676497\n2003-05-19,25.40,25.540001,24.74,24.76,55336300,16.764518\n2003-05-16,25.879999,26.049999,25.41,25.57,60620900,17.312953\n2003-05-15,25.85,26.01,25.57,25.790001,45450200,17.461912\n2003-05-14,26.08,26.18,25.540001,25.620001,45021000,17.346808\n2003-05-13,26.040001,26.200001,25.889999,25.99,44501900,17.597327\n2003-05-12,26.15,26.469999,26.059999,26.200001,53900800,17.739515\n2003-05-09,25.90,26.50,25.889999,26.360001,58913600,17.847847\n2003-05-08,25.75,26.139999,25.709999,25.74,46401400,17.428057\n2003-05-07,26.110001,26.35,25.84,25.99,49120000,17.597327\n2003-05-06,25.860001,26.50,25.82,26.370001,54299500,17.854618\n2003-05-05,26.25,26.389999,25.84,25.860001,50391500,17.509307\n2003-05-02,25.65,26.290001,25.559999,26.10,52695400,17.671806\n2003-05-01,25.540001,25.950001,25.34,25.719999,42085800,17.414515\n2003-04-30,25.73,25.879999,25.25,25.57,55566800,17.312953\n2003-04-29,25.950001,26.25,25.68,25.799999,65877300,17.468681\n2003-04-28,25.389999,25.940001,25.32,25.74,56287600,17.428057\n2003-04-25,25.33,25.639999,25.17,25.219999,53657400,17.075975\n2003-04-24,25.48,25.719999,25.32,25.49,51703600,17.258787\n2003-04-23,25.75,25.99,25.469999,25.719999,55559300,17.414515\n2003-04-22,25.059999,25.799999,25.030001,25.76,58844000,17.441599\n2003-04-21,25.610001,25.610001,25.08,25.209999,41557800,17.069204\n2003-04-17,24.77,25.540001,24.74,25.50,58356600,17.265558\n2003-04-16,25.60,25.74,24.60,24.92,86178700,16.872851\n2003-04-15,24.68,24.790001,24.10,24.60,63399000,16.656185\n2003-04-14,24.27,24.879999,24.00,24.76,51599600,16.764518\n2003-04-11,24.889999,25.18,23.950001,24.200001,71565500,16.385353\n2003-04-10,24.709999,24.790001,24.280001,24.59,51608900,16.649414\n2003-04-09,25.610001,25.67,24.540001,24.57,76875800,16.635872\n2003-04-08,25.309999,25.83,25.200001,25.58,54132100,17.319724\n2003-04-07,26.23,26.43,25.17,25.17,65627100,17.042121\n2003-04-04,25.76,25.799999,24.93,25.09,55740600,16.987955\n2003-04-03,25.99,26.09,25.60,25.73,57394300,17.421286\n2003-04-02,25.10,26.00,25.10,25.719999,68282500,17.414515\n2003-04-01,24.459999,24.700001,24.25,24.35,49803200,16.486915\n2003-03-31,24.25,24.709999,24.01,24.209999,71384000,16.392123\n2003-03-28,24.67,25.10,24.60,24.67,39584600,16.703581\n2003-03-27,24.940001,25.26,24.59,25.040001,60043300,16.954101\n2003-03-26,25.459999,25.620001,25.24,25.25,51673600,17.096287\n2003-03-25,25.60,25.75,25.030001,25.49,63595100,17.258787\n2003-03-24,25.549999,25.93,25.18,25.290001,61105200,17.123371\n2003-03-21,26.75,26.799999,26.030001,26.57,85586800,17.990034\n2003-03-20,26.02,26.52,25.67,26.25,71798500,17.773368\n2003-03-19,25.98,26.43,25.74,26.32,73652100,17.820764\n2003-03-18,25.889999,26.040001,25.50,26.040001,78108800,17.631182\n2003-03-17,24.52,25.950001,24.33,25.93,100983800,17.556703\n2003-03-14,24.68,24.959999,24.26,24.860001,75451400,16.832226\n2003-03-13,23.719999,24.74,23.440001,24.67,80701300,16.703581\n2003-03-12,22.809999,23.440001,22.549999,23.389999,72379500,15.836917\n2003-03-11,23.059999,23.26,22.76,22.799999,53990700,15.437439\n2003-03-10,23.309999,23.459999,22.889999,22.950001,48413600,15.539002\n2003-03-07,22.950001,23.790001,22.90,23.559999,66167600,15.952021\n2003-03-06,23.17,23.50,23.129999,23.27,54607600,15.755668\n2003-03-05,23.07,23.549999,23.049999,23.440001,55415900,15.870772\n2003-03-04,23.58,23.66,23.059999,23.07,56605700,15.620251\n2003-03-03,24.02,24.120001,23.40,23.540001,50653500,15.93848\n2003-02-28,23.74,24.07,23.549999,23.700001,56585400,16.046813\n2003-02-27,23.90,24.209999,23.299999,23.58,75434300,15.965563\n2003-02-26,24.07,24.469999,23.58,23.610001,57096000,15.985876\n2003-02-25,23.540001,24.27,23.379999,24.190001,68113000,16.378582\n2003-02-24,24.440001,24.50,23.84,24.07,62403700,16.297332\n2003-02-21,24.290001,24.799999,23.700001,24.629999,56853200,16.676497\n2003-02-20,24.77,24.870001,24.10,24.139999,50897200,16.344727\n2003-02-19,24.82,24.879999,24.17,24.530001,46902700,16.60879\n2003-02-18,24.620001,24.99,24.40,24.959999,57415500,16.845767\n2003-02-14,47.25,48.50,46.77,48.299999,90446400,16.299089\n2003-02-13,46.41,47.119999,46.130001,46.990002,73558200,15.857024\n2003-02-12,46.549999,47.099998,46.259998,46.439999,71315200,15.671422\n2003-02-11,47.299999,47.669998,46.00,46.439999,84292000,15.671422\n2003-02-10,46.799999,47.52,46.540001,47.380001,74081400,15.988631\n2003-02-07,47.880001,47.950001,46.41,46.580002,75208000,15.718667\n2003-02-06,46.860001,47.619999,46.560001,47.419998,83312000,16.002128\n2003-02-05,47.830002,48.529999,46.73,46.959999,101072000,15.846899\n2003-02-04,47.799999,47.939999,46.880001,47.32,81854800,15.968383\n2003-02-03,47.93,49.099998,47.459999,48.560001,80129800,16.386829\n2003-01-31,47.450001,48.349998,47.029999,47.459999,106858400,16.015627\n2003-01-30,50.16,50.169998,48.189999,48.240002,87877400,16.278843\n2003-01-29,48.73,50.040001,47.93,49.91,106884000,16.842393\n2003-01-28,49.689999,49.700001,48.560001,48.82,86151200,16.474566\n2003-01-27,49.32,50.599998,48.41,49.169998,114838600,16.592675\n2003-01-24,52.029999,52.049999,49.700001,49.849998,103027000,16.822145\n2003-01-23,51.950001,52.540001,51.459999,52.279999,71374800,17.642161\n2003-01-22,51.59,52.400002,50.91,51.00,86948000,17.210219\n2003-01-21,51.869999,52.150002,51.290001,51.330002,86159200,17.32158\n2003-01-17,52.939999,53.00,51.310001,51.459999,155876000,17.365448\n2003-01-16,56.32,56.650002,55.110001,55.349998,81371000,18.678149\n2003-01-15,57.00,57.32,56.189999,56.27,59622600,18.988608\n2003-01-14,56.330002,57.00,56.189999,56.970001,54206400,19.224827\n2003-01-13,56.52,56.75,55.77,56.389999,60817800,19.029103\n2003-01-10,55.099998,56.299999,54.900002,55.919998,67730200,18.870498\n2003-01-09,54.720001,55.919998,54.529999,55.810001,61808000,18.833379\n2003-01-08,55.369999,55.549999,54.110001,54.240002,64566000,18.303575\n2003-01-07,54.919998,56.009998,54.68,55.799999,80517400,18.830004\n2003-01-06,54.02,55.23,53.799999,54.77,59456200,18.482425\n2003-01-03,53.59,53.799999,52.880001,53.790001,55546800,18.151719\n2003-01-02,52.299999,53.75,51.709999,53.720001,67025200,18.128098\n2002-12-31,52.740002,52.990002,51.259998,51.700001,58208800,17.446438\n2002-12-30,53.009998,53.240002,52.27,52.75,48019600,17.800766\n2002-12-27,53.279999,54.00,52.900002,52.970001,40891600,17.875006\n2002-12-26,54.029999,54.689999,53.169998,53.389999,37228000,18.016737\n2002-12-24,53.540001,54.23,53.52,53.82,18386000,18.161843\n2002-12-23,53.049999,54.279999,52.900002,54.00,48798400,18.222585\n2002-12-20,53.490002,53.720001,52.950001,53.040001,98294600,17.898628\n2002-12-19,53.25,54.75,52.880001,53.110001,82686600,17.92225\n2002-12-18,53.84,54.400002,52.790001,53.529999,62709400,18.06398\n2002-12-17,54.419998,54.990002,53.779999,54.360001,49549800,18.344069\n2002-12-16,53.00,54.549999,52.669998,54.48,60140400,18.384563\n2002-12-13,53.68,53.75,52.490002,52.50,65245400,17.716402\n2002-12-12,55.00,55.060001,53.689999,54.169998,55242000,18.279952\n2002-12-11,53.849998,55.009998,53.580002,54.66,69186200,18.445305\n2002-12-10,53.560001,54.48,53.48,54.009998,63730200,18.225959\n2002-12-09,55.00,55.220001,53.509998,53.529999,63862800,18.06398\n2002-12-06,54.869999,55.740002,54.220001,55.470001,71670200,18.718644\n2002-12-05,56.950001,57.09,55.299999,55.34,68435800,18.674775\n2002-12-04,56.130001,57.439999,55.82,56.540001,83892000,19.079721\n2002-12-03,57.279999,57.349998,56.41,56.709999,58457400,19.137088\n2002-12-02,58.650002,58.959999,57.009998,57.689999,63735000,19.467794\n2002-11-29,58.43,58.630001,57.68,57.68,28393000,19.46442\n2002-11-27,57.599998,58.610001,57.400002,58.080002,55191800,19.599403\n2002-11-26,57.639999,58.25,56.779999,56.900002,68650400,19.201206\n2002-11-25,58.060001,58.639999,57.57,58.23,61583000,19.65002\n2002-11-22,57.450001,58.299999,57.049999,58.220001,70002000,19.646646\n2002-11-21,56.98,58.00,56.779999,57.84,82922200,19.518413\n2002-11-20,55.009998,56.900002,54.93,56.619999,76435400,19.106717\n2002-11-19,55.549999,55.799999,54.310001,54.860001,76403400,18.512796\n2002-11-18,56.950001,57.029999,55.740002,55.849998,58086400,18.846876\n2002-11-15,56.599998,56.919998,55.669998,56.689999,77533600,19.130339\n2002-11-14,55.990002,57.00,55.869999,56.990002,78337000,19.231577\n2002-11-13,54.240002,55.93,54.110001,55.360001,107370200,18.681524\n2002-11-12,54.099998,55.43,53.900002,54.509998,81398600,18.394686\n2002-11-11,55.07,55.099998,53.82,53.860001,58341200,18.175341\n2002-11-08,56.00,56.549999,55.009998,55.099998,64522200,18.593785\n2002-11-07,56.200001,56.619999,55.50,56.009998,73699600,18.900869\n2002-11-06,56.990002,57.099998,55.529999,57.029999,115407000,19.245074\n2002-11-05,55.779999,56.799999,55.580002,56.68,76658200,19.126965\n2002-11-04,56.75,57.25,55.52,56.099998,139964200,18.93124\n2002-11-01,52.43,53.240002,51.900002,53.00,105097800,17.885129\n2002-10-31,53.189999,54.07,52.849998,53.470001,105973800,18.043734\n2002-10-30,52.200001,53.389999,51.630001,53.110001,94451200,17.92225\n2002-10-29,52.150002,52.490002,50.849998,52.07,90517200,17.571296\n2002-10-28,53.400002,53.50,51.509998,51.950001,79906600,17.530802\n2002-10-25,51.25,52.799999,51.16,52.68,75425800,17.777144\n2002-10-24,53.360001,53.369999,50.900002,51.23,95833400,17.287833\n2002-10-23,51.43,53.259998,51.43,53.200001,110866600,17.952621\n2002-10-22,51.43,51.93,51.029999,51.669998,87159000,17.436313\n2002-10-21,51.970001,52.990002,51.360001,52.509998,112378600,17.719776\n2002-10-18,52.599998,53.200001,51.139999,53.150002,152817200,17.935748\n2002-10-17,52.279999,52.50,50.049999,50.77,182602400,17.132604\n2002-10-16,50.389999,51.259998,50.279999,50.41,95437400,17.01112\n2002-10-15,51.259998,52.369999,50.650002,52.290001,133374200,17.645537\n2002-10-14,48.25,49.330002,47.84,49.290001,76216200,16.633171\n2002-10-11,47.360001,48.900002,47.009998,48.869999,108828800,16.491439\n2002-10-10,44.00,46.619999,43.25,46.380001,118515000,15.651176\n2002-10-09,44.23,45.450001,43.810001,43.990002,123142600,14.844658\n2002-10-08,44.75,45.98,44.130001,44.990002,115667600,15.182113\n2002-10-07,43.810001,45.060001,43.689999,44.049999,89790000,14.864905\n2002-10-04,45.389999,45.57,43.689999,43.77,107120400,14.770417\n2002-10-03,45.299999,46.59,44.599998,44.799999,105221400,15.117996\n2002-10-02,46.099998,46.810001,45.16,45.610001,103488600,15.391335\n2002-10-01,44.32,46.25,43.189999,46.23,110636600,15.600557\n2002-09-30,44.869999,45.040001,43.110001,43.740002,115577000,14.760294\n2002-09-27,46.040001,47.099998,45.189999,45.25,81011600,15.269851\n2002-09-26,47.110001,47.50,45.950001,46.200001,100852200,15.590434\n2002-09-25,46.400002,46.959999,45.049999,46.509998,107116600,15.695044\n2002-09-24,44.830002,46.48,44.630001,45.639999,104142200,15.401458\n2002-09-23,46.599998,46.709999,44.810001,45.23,89783800,15.263102\n2002-09-20,47.709999,48.00,47.299999,47.459999,130619200,16.015627\n2002-09-19,46.68,47.82,46.59,47.200001,77777600,15.927889\n2002-09-18,46.720001,48.240002,46.66,47.75,83951800,16.113489\n2002-09-17,48.669998,48.900002,47.209999,47.290001,73343400,15.95826\n2002-09-16,47.599998,48.130001,47.049999,47.779999,50166200,16.123613\n2002-09-13,46.900002,48.259998,46.849998,47.91,59549200,16.167482\n2002-09-12,48.150002,48.299999,47.02,47.150002,63726800,15.911017\n2002-09-11,50.23,51.099998,48.529999,48.580002,77443200,16.393578\n2002-09-10,48.540001,49.82,48.349998,49.790001,83950000,16.801898\n2002-09-09,47.25,48.950001,46.630001,48.700001,81653200,16.434072\n2002-09-06,47.75,48.27,47.470001,47.82,69918400,16.137111\n2002-09-05,47.50,47.52,45.880001,45.91,90438800,15.492572\n2002-09-04,47.450001,48.599998,47.150002,48.209999,80232000,16.268718\n2002-09-03,48.52,48.52,47.00,47.02,74452600,15.867147\n2002-08-30,50.139999,50.48,49.00,49.080002,58138400,16.562305\n2002-08-29,48.889999,51.00,48.52,50.580002,94275600,17.068488\n2002-08-28,50.48,50.66,49.299999,49.380001,68875000,16.663542\n2002-08-27,52.330002,52.450001,50.650002,50.84,65470200,17.156226\n2002-08-26,52.50,52.650002,51.18,52.099998,55652400,17.581419\n2002-08-23,52.66,52.849998,51.84,52.220001,57929200,17.621915\n2002-08-22,52.849998,53.450001,52.599998,53.23,72517600,17.962744\n2002-08-21,51.560001,52.380001,51.150002,52.279999,81203400,17.642161\n2002-08-20,51.380001,51.700001,50.75,51.040001,70317600,17.223717\n2002-08-19,50.040001,52.049999,49.849998,52.00,79848200,17.547674\n2002-08-16,49.43,50.23,48.919998,50.00,69334000,16.872764\n2002-08-15,49.959999,50.740002,48.75,49.77,98745600,16.795149\n2002-08-14,47.25,49.73,47.209999,49.709999,96706000,16.774901\n2002-08-13,47.990002,49.700001,46.919998,47.060001,100122800,15.880646\n2002-08-12,47.610001,48.75,47.599998,48.470001,56866600,16.356457\n2002-08-09,48.150002,49.150002,47.66,48.119999,69049400,16.238347\n2002-08-08,47.110001,49.00,46.41,48.91,88748000,16.504937\n2002-08-07,47.00,47.299999,45.16,47.09,86349400,15.890769\n2002-08-06,44.900002,47.25,44.84,45.669998,88715800,15.411582\n2002-08-05,44.290001,45.169998,43.810001,43.990002,78941600,14.844658\n2002-08-02,45.509998,45.849998,43.799999,44.41,85947600,14.986389\n2002-08-01,47.580002,48.09,45.50,45.75,92002800,15.438579\n2002-07-31,47.610001,48.00,46.360001,47.98,93875600,16.191104\n2002-07-30,47.549999,48.830002,47.330002,48.099998,122690600,16.231598\n2002-07-29,46.849998,48.299999,46.549999,48.25,112148600,16.282217\n2002-07-26,43.740002,45.41,43.68,45.349998,123538000,15.303596\n2002-07-25,45.450001,45.709999,42.439999,42.830002,163411400,14.45321\n2002-07-24,41.75,46.360001,41.41,46.23,202307800,15.600557\n2002-07-23,46.490002,46.799999,42.970001,43.009998,168061600,14.513951\n2002-07-22,48.950001,49.990002,45.900002,47.509998,180069800,16.032499\n2002-07-19,49.869999,50.889999,48.810001,49.560001,112543400,16.724284\n2002-07-18,52.060001,52.740002,50.66,51.110001,91053600,17.247339\n2002-07-17,52.52,53.299999,51.169998,52.00,98034800,17.547674\n2002-07-16,51.310001,52.799999,50.639999,51.25,97154600,17.294583\n2002-07-15,51.389999,51.860001,48.00,51.799999,136965600,17.480183\n2002-07-12,53.369999,53.73,51.48,51.860001,95733800,17.500431\n2002-07-11,52.040001,53.07,51.25,52.91,129550600,17.854758\n2002-07-10,53.689999,54.200001,52.130001,52.240002,90673400,17.628664\n2002-07-09,53.310001,54.73,52.970001,53.209999,85277200,17.955995\n2002-07-08,54.41,54.93,52.580002,52.919998,63199400,17.858132\n2002-07-05,53.09,54.900002,53.049999,54.849998,35673600,18.509421\n2002-07-03,51.240002,52.52,50.450001,51.84,80936600,17.493681\n2002-07-02,52.380001,52.919998,51.330002,51.439999,82814200,17.358699\n2002-07-01,54.119999,54.389999,52.580002,52.66,66473800,17.770395\n2002-06-28,54.549999,55.790001,54.00,54.700001,89555600,18.458804\n2002-06-27,54.599998,54.939999,52.860001,54.919998,95812400,18.533043\n2002-06-26,51.049999,54.389999,51.049999,54.130001,112131400,18.266454\n2002-06-25,54.700001,55.00,52.799999,52.950001,84025200,17.868257\n2002-06-24,52.09,54.639999,51.849998,54.16,104523200,18.276578\n2002-06-21,53.400002,54.549999,52.279999,52.279999,116820000,17.642161\n2002-06-20,54.369999,55.099998,53.900002,54.099998,86401200,18.25633\n2002-06-19,55.470001,55.939999,54.32,54.360001,81247000,18.344069\n2002-06-18,55.529999,56.290001,55.349998,55.990002,77518400,18.894121\n2002-06-17,55.66,56.439999,55.369999,55.68,94486600,18.78951\n2002-06-14,53.150002,55.549999,53.00,55.25,109433600,18.644404\n2002-06-13,54.84,55.48,54.200001,54.220001,79771600,18.296825\n2002-06-12,52.580002,55.779999,52.50,55.540001,136198600,18.742266\n2002-06-11,53.240002,54.18,52.419998,52.57,74368200,17.740024\n2002-06-10,51.650002,53.299999,51.459999,52.82,71825400,17.824387\n2002-06-07,49.889999,52.599998,49.860001,51.98,97834400,17.540925\n2002-06-06,51.50,52.139999,50.00,51.900002,78703400,17.513929\n2002-06-05,50.43,51.75,50.330002,51.66,66969400,17.432939\n2002-06-04,49.50,51.23,49.240002,49.98,88008400,16.866014\n2002-06-03,50.990002,51.639999,49.169998,49.419998,88439000,16.677039\n2002-05-31,52.900002,53.419998,50.880001,50.91,66468000,17.179848\n2002-05-30,51.639999,53.360001,51.43,52.639999,63213000,17.763645\n2002-05-29,51.650002,52.720001,51.549999,52.049999,45393200,17.564547\n2002-05-28,53.59,53.689999,51.75,52.32,49602000,17.65566\n2002-05-24,54.139999,54.52,53.040001,53.259998,35982000,17.972867\n2002-05-23,53.700001,54.84,53.009998,54.82,51412800,18.499298\n2002-05-22,51.869999,53.720001,51.849998,53.689999,54169400,18.117973\n2002-05-21,53.950001,54.599998,52.130001,52.189999,63120000,17.61179\n2002-05-20,55.50,55.549999,53.50,54.009998,52115800,18.225959\n2002-05-17,56.209999,56.400002,55.27,56.029999,54646200,18.907619\n2002-05-16,54.709999,56.029999,54.650002,55.740002,53406400,18.809757\n2002-05-15,54.490002,56.439999,53.860001,54.75,70412000,18.475676\n2002-05-14,54.400002,55.099998,53.98,54.880001,64832400,18.519546\n2002-05-13,50.450001,52.91,49.75,52.689999,64819000,17.780518\n2002-05-10,52.529999,52.669998,49.990002,50.049999,64408800,16.889636\n2002-05-09,54.400002,55.00,51.900002,52.119999,83288200,17.588168\n2002-05-08,51.27,54.970001,51.220001,54.970001,101242000,18.549917\n2002-05-07,49.18,50.290001,48.349998,49.470001,88385400,16.693913\n2002-05-06,49.439999,50.540001,48.369999,48.619999,66299400,16.407075\n2002-05-03,51.259998,51.68,49.509998,49.560001,71628000,16.724284\n2002-05-02,52.639999,54.07,51.150002,51.209999,79009200,17.281084\n2002-05-01,52.16,53.189999,50.66,52.75,76413000,17.800766\n2002-04-30,52.099998,53.299999,51.919998,52.259998,77384000,17.635412\n2002-04-29,51.470001,52.91,51.439999,52.240002,70246000,17.628664\n2002-04-26,54.07,54.450001,51.459999,51.50,62776600,17.378947\n2002-04-25,52.900002,54.450001,52.880001,53.73,57290400,18.131472\n2002-04-24,53.849998,54.43,53.00,53.02,61220400,17.891879\n2002-04-23,55.700001,55.82,53.299999,53.990002,68281400,18.219211\n2002-04-22,56.52,56.700001,55.00,55.59,51465200,18.759139\n2002-04-19,57.439999,57.98,56.860001,57.200001,104268600,19.302442\n2002-04-18,56.790001,57.310001,52.68,56.369999,74794800,19.022353\n2002-04-17,57.950001,58.279999,56.419998,56.630001,55158600,19.110092\n2002-04-16,56.400002,58.099998,56.360001,57.810001,51921600,19.50829\n2002-04-15,56.00,56.75,55.400002,55.689999,47388800,18.792884\n2002-04-12,55.150002,56.259998,54.860001,55.93,52297600,18.873874\n2002-04-11,55.889999,56.450001,54.50,54.790001,58165800,18.489175\n2002-04-10,55.119999,57.110001,55.060001,56.299999,75636400,18.998732\n2002-04-09,57.330002,57.43,54.799999,54.869999,63413000,18.51617\n2002-04-08,54.299999,57.310001,54.259998,57.220001,73389600,19.309191\n2002-04-05,56.889999,57.299999,55.84,55.869999,50166000,18.853626\n2002-04-04,55.98,56.970001,55.419998,56.450001,61763800,19.04935\n2002-04-03,57.439999,57.610001,55.50,56.330002,76931400,19.008856\n2002-04-02,58.900002,59.09,57.110001,57.279999,76509400,19.329438\n2002-04-01,59.830002,60.400002,59.200001,60.380001,47010000,20.37555\n2002-03-28,59.950001,60.650002,59.66,60.310001,43901200,20.351928\n2002-03-27,58.799999,59.880001,58.59,59.439999,47318400,20.058341\n2002-03-26,59.099998,60.919998,58.310001,59.080002,69357200,19.936858\n2002-03-25,60.48,60.779999,59.150002,59.23,47752400,19.987476\n2002-03-22,61.049999,61.139999,60.220001,60.450001,41341400,20.399171\n2002-03-21,60.209999,61.59,59.830002,61.360001,46123400,20.706256\n2002-03-20,61.400002,62.02,60.099998,60.099998,55235200,20.281061\n2002-03-19,62.18,63.00,61.50,62.23,36376400,20.999841\n2002-03-18,62.740002,62.990002,61.200001,62.139999,52296800,20.96947\n2002-03-15,61.00,62.509998,60.970001,62.490002,69086800,21.087581\n2002-03-14,62.139999,62.240002,61.049999,61.220001,51819600,20.659012\n2002-03-13,62.080002,63.02,61.950001,62.099998,44387400,20.955972\n2002-03-12,62.52,62.799999,61.669998,62.540001,66407200,21.104453\n2002-03-11,63.509998,65.00,63.00,64.339996,43718200,21.711871\n2002-03-08,63.630001,64.699997,63.169998,63.950001,57701800,21.580265\n2002-03-07,63.669998,63.880001,61.860001,62.720001,58079200,21.165195\n2002-03-06,62.91,63.700001,62.189999,63.630001,49835400,21.472279\n2002-03-05,63.00,63.880001,62.34,63.080002,55926400,21.286679\n2002-03-04,61.240002,63.50,60.869999,63.299999,74464200,21.360919\n2002-03-01,59.049999,61.419998,58.849998,61.369999,62115600,20.70963\n2002-02-28,58.779999,59.700001,58.139999,58.34,68068000,19.687141\n2002-02-27,59.07,60.150002,57.990002,58.389999,65750000,19.704013\n2002-02-26,59.099998,60.00,57.900002,58.549999,63276200,19.758006\n2002-02-25,57.939999,59.889999,57.889999,59.080002,51832200,19.936858\n2002-02-22,58.049999,58.75,57.150002,57.990002,71347800,19.569032\n2002-02-21,59.720001,60.27,58.009998,58.049999,59398400,19.589278\n2002-02-20,59.400002,60.360001,58.799999,59.900002,50492000,20.213571\n2002-02-19,59.91,60.139999,58.599998,58.93,52262600,19.886239\n2002-02-15,61.700001,62.060001,60.200001,60.23,50179800,20.324931\n2002-02-14,62.00,62.990002,61.32,61.68,57267000,20.814241\n2002-02-13,60.259998,61.880001,59.950001,61.82,54168600,20.861485\n2002-02-12,60.490002,60.849998,60.02,60.139999,44973800,20.29456\n2002-02-11,60.009998,61.240002,59.59,61.130001,50899600,20.628641\n2002-02-08,60.119999,60.66,58.830002,60.650002,61283000,20.466663\n2002-02-07,60.299999,61.610001,59.75,59.799999,63314000,20.179825\n2002-02-06,61.610001,61.889999,60.25,60.400002,66103000,20.382299\n2002-02-05,60.799999,62.23,60.50,61.150002,66772600,20.63539\n2002-02-04,62.400002,62.689999,60.75,61.119999,70308400,20.625266\n2002-02-01,64.150002,64.50,62.470001,62.66,63462200,21.144947\n2002-01-31,63.060001,63.810001,62.119999,63.709999,69566200,21.499275\n2002-01-30,62.450001,62.900002,61.330002,62.849998,66100000,21.209063\n2002-01-29,63.900002,64.50,61.990002,62.32,58666000,21.030212\n2002-01-28,64.230003,64.400002,62.91,63.82,41622000,21.536395\n2002-01-25,64.190002,64.849998,63.509998,63.799999,48981200,21.529646\n2002-01-24,64.099998,65.18,63.799999,64.599998,83886000,21.79961\n2002-01-23,64.050003,64.709999,63.240002,63.740002,80403000,21.5094\n2002-01-22,66.610001,66.629997,64.25,64.459999,76837200,21.752367\n2002-01-18,67.099998,67.849998,65.419998,66.099998,107140400,22.305793\n2002-01-17,68.529999,70.00,68.400002,69.860001,78958000,23.574626\n2002-01-16,68.849998,69.839996,67.849998,67.870003,61955400,22.90309\n2002-01-15,68.660004,69.620003,68.50,69.550003,60717400,23.470015\n2002-01-14,68.300003,69.040001,67.739998,68.470001,50997800,23.105563\n2002-01-11,69.519997,70.32,68.099998,68.610001,72993200,23.152806\n2002-01-10,68.480003,69.800003,68.129997,69.279999,50296600,23.378901\n2002-01-09,69.720001,70.620003,68.550003,68.709999,76304000,23.186551\n2002-01-08,68.690002,69.860001,68.00,69.379997,47736400,23.412646\n2002-01-07,69.75,70.019997,68.349998,68.559998,58508800,23.135933\n2002-01-04,69.25,69.910004,68.669998,68.900002,52731400,23.250669\n2002-01-03,67.110001,69.25,67.089996,69.230003,67590800,23.36203\n2002-01-02,66.650002,67.110001,65.510002,67.040001,48124000,22.623002\n2001-12-31,67.839996,68.480003,66.25,66.25,43006200,22.356412\n2001-12-28,68.230003,68.849998,67.699997,67.870003,28787200,22.90309\n2001-12-27,67.980003,68.709999,67.260002,67.849998,32406600,22.89634\n2001-12-26,67.419998,69.07,67.389999,67.68,29328000,22.838973\n2001-12-24,67.720001,68.029999,67.199997,67.269997,11701600,22.700615\n2001-12-21,68.010002,68.019997,67.00,67.540001,84307600,22.791729\n2001-12-20,69.150002,69.25,66.620003,66.760002,78585000,22.528515\n2001-12-19,68.620003,69.889999,68.449997,69.489998,56996200,23.449766\n2001-12-18,68.919998,69.400002,68.599998,69.269997,47255200,23.375526\n2001-12-17,67.169998,69.110001,67.160004,68.980003,57079800,23.277666\n2001-12-14,66.019997,67.949997,65.93,67.440002,43000600,22.757984\n2001-12-13,67.129997,68.239998,66.07,66.269997,53227800,22.36316\n2001-12-12,67.160004,67.980003,66.25,67.949997,47884200,22.930085\n2001-12-11,67.660004,68.129997,67.07,67.32,54334000,22.717489\n2001-12-10,67.519997,68.449997,66.860001,67.059998,38367400,22.62975\n2001-12-07,68.25,68.839996,66.550003,67.830002,42334800,22.889592\n2001-12-06,67.980003,69.00,67.550003,68.650002,56026200,23.166305\n2001-12-05,66.489998,68.169998,65.199997,68.099998,74243000,22.980704\n2001-12-04,65.00,66.080002,64.099998,66.00,51005800,22.272048\n2001-12-03,63.830002,65.230003,63.799999,64.769997,47211800,21.856977\n2001-11-30,64.660004,65.080002,63.93,64.209999,48234200,21.668003\n2001-11-29,63.119999,64.900002,62.950001,64.839996,54034400,21.880599\n2001-11-28,63.169998,64.120003,62.73,62.799999,54536600,21.192191\n2001-11-27,64.790001,65.07,62.75,63.740002,90819000,21.5094\n2001-11-26,64.989998,65.709999,64.400002,65.139999,41983600,21.981836\n2001-11-23,64.379997,64.809998,63.619999,64.709999,15754600,21.83673\n2001-11-21,64.360001,64.599998,63.48,64.050003,50785200,21.614011\n2001-11-20,66.449997,67.800003,65.029999,65.400002,65921800,22.069575\n2001-11-19,66.25,66.970001,65.699997,66.540001,56005000,22.454274\n2001-11-16,66.360001,66.610001,64.949997,65.75,59249000,22.187684\n2001-11-15,66.099998,67.050003,65.449997,66.120003,77922000,22.312544\n2001-11-14,68.230003,68.339996,65.790001,65.949997,88625600,22.255174\n2001-11-13,66.800003,67.949997,66.599998,67.900002,60159600,22.913214\n2001-11-12,64.699997,66.440002,63.650002,65.790001,57752800,22.201183\n2001-11-09,64.339996,65.650002,63.91,65.209999,48013600,22.005458\n2001-11-08,64.459999,66.059998,63.66,64.419998,74227800,21.738868\n2001-11-07,64.220001,65.050003,64.029999,64.25,58899000,21.681501\n2001-11-06,62.700001,64.940002,62.16,64.779999,68612000,21.860352\n2001-11-05,61.860001,64.029999,61.75,63.27,66401600,21.350795\n2001-11-02,61.93,63.02,60.509998,61.400002,83360000,20.719754\n2001-11-01,60.080002,62.25,59.599998,61.84,109671200,20.868234\n2001-10-31,59.299999,60.73,58.099998,58.150002,64700000,19.623025\n2001-10-30,58.919998,59.540001,58.189999,58.880001,57395600,19.869367\n2001-10-29,62.099998,62.200001,59.540001,59.639999,55129400,20.125832\n2001-10-26,62.32,63.630001,62.080002,62.200001,64509400,20.989718\n2001-10-25,60.610001,62.599998,59.57,62.560001,75318200,21.111202\n2001-10-24,60.50,61.619999,59.619999,61.32,79141400,20.692757\n2001-10-23,60.470001,61.439999,59.400002,60.43,80325000,20.392422\n2001-10-22,57.900002,60.18,57.470001,60.16,72323600,20.301309\n2001-10-19,57.400002,58.009998,55.630001,57.900002,91219600,19.538661\n2001-10-18,56.34,57.580002,55.50,56.75,78348000,19.150587\n2001-10-17,59.119999,59.299999,55.98,56.029999,73710600,18.907619\n2001-10-16,57.869999,58.91,57.209999,58.450001,66169000,19.724261\n2001-10-15,55.900002,58.50,55.849998,58.060001,68437000,19.592654\n2001-10-12,55.700001,56.639999,54.549999,56.380001,63307000,19.025729\n2001-10-11,55.759998,56.84,54.59,56.32,83742600,19.005481\n2001-10-10,53.599998,55.75,53.00,55.509998,86349200,18.732142\n2001-10-09,57.50,57.57,54.189999,54.560001,99477600,18.41156\n2001-10-08,56.799999,58.650002,56.740002,58.040001,60605800,19.585904\n2001-10-05,56.16,58.00,54.939999,57.720001,80844400,19.477919\n2001-10-04,56.919998,58.400002,56.209999,56.439999,101778000,19.045975\n2001-10-03,52.48,56.93,52.400002,56.23,97199200,18.97511\n2001-10-02,51.630001,53.549999,51.560001,53.049999,80860800,17.902002\n2001-10-01,50.939999,52.50,50.41,51.790001,69999600,17.476809\n2001-09-28,49.619999,51.59,48.98,51.169998,116641200,17.267586\n2001-09-27,50.099998,50.68,48.00,49.959999,81191200,16.859265\n2001-09-26,51.509998,51.799999,49.549999,50.27,58524400,16.963877\n2001-09-25,52.27,53.00,50.16,51.299999,84940600,17.311455\n2001-09-24,50.650002,52.450001,49.869999,52.009998,85580200,17.551048\n2001-09-21,47.919998,50.599998,47.50,49.709999,184976600,16.774901\n2001-09-20,52.349998,52.610001,50.669998,50.759998,117983200,17.129229\n2001-09-19,54.459999,54.700001,50.599998,53.869999,126950200,18.178715\n2001-09-18,53.41,55.00,53.169998,54.32,83182600,18.33057\n2001-09-17,54.02,55.099998,52.799999,52.91,127502000,17.854758\n2001-09-10,54.919998,57.950001,54.700001,57.580002,84471800,19.430675\n2001-09-07,56.110001,57.360001,55.310001,55.400002,89863800,18.695023\n2001-09-06,56.560001,58.389999,55.900002,56.02,112356800,18.904245\n2001-09-05,56.18,58.389999,55.389999,57.740002,89470600,19.484668\n2001-09-04,57.189999,59.080002,56.07,56.099998,67189200,18.93124\n2001-08-31,56.849998,58.060001,56.299999,57.049999,57900800,19.251823\n2001-08-30,59.040001,59.66,56.52,56.939999,97632000,19.214703\n2001-08-29,61.049999,61.299999,59.540001,60.25,48170000,20.33168\n2001-08-28,62.34,62.950001,60.580002,60.740002,47422800,20.497034\n2001-08-27,61.900002,63.360001,61.57,62.310001,44562800,21.026839\n2001-08-24,59.599998,62.279999,59.23,62.049999,63399000,20.939099\n2001-08-23,60.669998,61.529999,59.00,59.119999,51813200,19.950355\n2001-08-22,61.130001,61.150002,59.080002,60.66,78107200,20.470037\n2001-08-21,62.700001,63.200001,60.709999,60.779999,47111800,20.510531\n2001-08-20,61.66,62.75,61.099998,62.700001,48371200,21.158446\n2001-08-17,63.779999,64.129997,61.50,61.880001,52234200,20.881733\n2001-08-16,62.84,64.709999,62.700001,64.620003,43905600,21.806361\n2001-08-15,64.709999,65.050003,63.200001,63.200001,39503000,21.327173\n2001-08-14,65.75,66.089996,64.449997,64.690002,36481200,21.829982\n2001-08-13,65.239998,65.989998,64.75,65.830002,32675400,22.214681\n2001-08-10,64.769997,65.860001,62.900002,65.519997,51756400,22.110068\n2001-08-09,64.980003,65.550003,64.300003,65.010002,45536200,21.937968\n2001-08-08,66.510002,67.239998,64.489998,64.860001,54996400,21.887349\n2001-08-07,66.040001,67.050003,65.989998,66.349998,31347800,22.390157\n2001-08-06,66.529999,67.120003,65.68,66.129997,27831600,22.315916\n2001-08-03,67.300003,67.360001,66.00,66.889999,43260400,22.572383\n2001-08-02,67.209999,67.540001,66.260002,67.449997,54198400,22.761357\n2001-08-01,66.800003,66.809998,65.760002,66.470001,55679000,22.430652\n2001-07-31,66.010002,67.389999,65.849998,66.190002,59031600,22.336165\n2001-07-30,65.650002,66.879997,65.540001,65.800003,42196400,22.204558\n2001-07-27,66.050003,66.25,65.050003,65.470001,65396000,22.093197\n2001-07-26,67.120003,67.32,65.50,66.589996,77974000,22.471145\n2001-07-25,66.260002,67.519997,65.610001,67.480003,74065400,22.771483\n2001-07-24,67.00,67.989998,65.699997,66.32,67530200,22.380034\n2001-07-23,69.239998,69.239998,66.349998,67.089996,79999400,22.639873\n2001-07-20,68.029999,69.400002,67.940002,69.18,124203600,23.345156\n2001-07-19,71.220001,73.00,71.220001,72.57,76549400,24.489129\n2001-07-18,70.599998,71.50,69.870003,70.57,57590800,23.814218\n2001-07-17,70.660004,72.010002,70.139999,71.82,63241000,24.236038\n2001-07-16,71.449997,72.160004,70.150002,71.18,55990800,24.020066\n2001-07-13,71.400002,72.00,70.940002,71.339996,58934600,24.074058\n2001-07-12,70.699997,72.050003,70.330002,71.599998,128078000,24.161797\n2001-07-11,64.209999,66.75,64.199997,66.50,73822600,22.440776\n2001-07-10,65.900002,66.25,64.349998,64.480003,66562600,21.759117\n2001-07-09,66.199997,66.910004,65.040001,65.690002,66476600,22.167438\n2001-07-06,68.300003,68.400002,65.669998,66.059998,67467800,22.292294\n2001-07-05,70.220001,70.720001,68.440002,68.510002,49242600,23.119061\n2001-07-03,70.300003,70.800003,69.93,70.470001,28037400,23.780473\n2001-07-02,72.050003,73.150002,70.150002,70.599998,72810200,23.824342\n2001-06-29,72.599998,73.410004,71.400002,73.00,94283800,24.634235\n2001-06-28,71.550003,76.150002,70.529999,72.739998,128975600,24.546496\n2001-06-27,69.860001,71.529999,69.360001,71.139999,69199800,24.006568\n2001-06-26,67.82,70.209999,67.699997,70.139999,63077000,23.669113\n2001-06-25,69.099998,69.809998,67.769997,68.849998,49215600,23.233795\n2001-06-22,70.00,70.610001,68.580002,68.830002,51092000,23.227047\n2001-06-21,69.150002,70.550003,68.919998,69.839996,69603800,23.567875\n2001-06-20,67.139999,69.589996,67.099998,69.410004,64108400,23.422772\n2001-06-19,68.209999,68.849998,66.849998,67.32,63457400,22.717489\n2001-06-18,67.949997,67.959999,66.010002,66.879997,56846800,22.569008\n2001-06-15,67.510002,68.300003,66.400002,68.019997,108354400,22.953707\n2001-06-14,70.220001,70.550003,68.400002,68.900002,71972400,23.250669\n2001-06-13,72.050003,72.300003,70.639999,70.690002,55302400,23.854714\n2001-06-12,71.019997,72.410004,70.809998,72.080002,66714600,24.323777\n2001-06-11,72.849998,72.849998,71.510002,72.120003,47345600,24.337275\n2001-06-08,73.699997,73.75,72.050003,73.190002,51867000,24.698352\n2001-06-07,72.120003,73.730003,72.080002,73.68,66960000,24.863705\n2001-06-06,72.889999,73.480003,71.550003,72.360001,80022800,24.418264\n2001-06-05,70.760002,73.080002,70.50,72.599998,89454200,24.499252\n2001-06-04,70.550003,71.019997,69.800003,70.779999,43736600,23.885084\n2001-06-01,69.599998,70.699997,68.699997,70.339996,57587600,23.736603\n2001-05-31,69.489998,70.379997,68.400002,69.18,70682600,23.345156\n2001-05-30,69.559998,70.580002,68.650002,69.190002,86501800,23.348531\n2001-05-29,70.800003,71.75,70.050003,70.339996,71210800,23.736603\n2001-05-25,71.660004,71.900002,70.360001,70.910004,52747600,23.928955\n2001-05-24,69.940002,71.779999,69.269997,71.720001,80781600,24.202293\n2001-05-23,70.389999,71.599998,69.510002,69.699997,93637400,23.520631\n2001-05-22,69.449997,70.349998,69.18,70.309998,83455600,23.726479\n2001-05-21,68.050003,69.989998,67.75,68.790001,103491600,23.213549\n2001-05-18,67.690002,69.199997,67.25,68.089996,90605400,22.977328\n2001-05-17,69.099998,70.139999,67.550003,68.169998,106984800,23.004325\n2001-05-16,67.699997,69.879997,67.330002,69.160004,91893800,23.338408\n2001-05-15,68.739998,69.300003,68.00,68.269997,61385600,23.03807\n2001-05-14,69.129997,69.199997,68.300003,68.720001,44968000,23.189927\n2001-05-11,69.959999,70.00,68.650002,69.400002,51128800,23.419396\n2001-05-10,71.129997,71.239998,69.959999,70.00,64334600,23.621869\n2001-05-09,71.239998,71.300003,69.860001,70.400002,76676600,23.756852\n2001-05-08,71.75,72.099998,70.75,72.059998,75084000,24.317026\n2001-05-07,70.830002,72.150002,70.699997,71.379997,109356200,24.087556\n2001-05-04,68.00,71.050003,67.959999,70.75,119538400,23.874961\n2001-05-03,69.25,70.18,68.139999,68.529999,66273400,23.125809\n2001-05-02,71.00,71.150002,69.349998,69.760002,92864400,23.540881\n2001-05-01,67.660004,70.300003,67.599998,70.169998,83702800,23.679236\n2001-04-30,68.529999,69.059998,67.68,67.75,74368200,22.862595\n2001-04-27,69.529999,69.68,66.209999,67.120003,121572400,22.649999\n2001-04-26,70.07,71.00,68.25,69.129997,118737600,23.328282\n2001-04-25,67.57,69.790001,67.25,69.690002,76744000,23.517259\n2001-04-24,68.199997,69.93,67.139999,67.550003,89176600,22.795105\n2001-04-23,68.110001,68.470001,66.900002,68.25,92171200,23.031322\n2001-04-20,70.300003,71.099998,68.50,69.00,192919600,23.284414\n2001-04-19,65.809998,69.00,65.75,68.040001,159375600,22.960457\n2001-04-18,63.389999,66.309998,63.00,65.43,156696400,22.079699\n2001-04-17,60.52,62.110001,60.040001,61.48,85149200,20.74675\n2001-04-16,61.400002,61.580002,60.119999,60.790001,65857400,20.513906\n2001-04-12,59.560001,62.310001,59.349998,62.18,87520000,20.982969\n2001-04-11,60.650002,61.50,59.700001,60.040001,109879600,20.260815\n2001-04-10,57.950001,60.09,57.779999,59.68,109199400,20.139331\n2001-04-09,56.57,57.419998,55.66,57.150002,56295600,19.285569\n2001-04-06,56.375,57.1875,55.0625,56.1875,92622000,18.960768\n2001-04-05,53.75,57.375,53.50,56.75,113364000,19.150587\n2001-04-04,53.375,55.00,51.0625,51.9375,104046600,17.526583\n2001-04-03,55.3125,55.3125,52.75,53.375,94187600,18.011675\n2001-04-02,54.8125,56.9375,54.625,55.8125,75924000,18.834222\n2001-03-30,55.75,56.1875,53.875,54.6875,91201600,18.454585\n2001-03-29,55.375,57.1875,54.5625,55.375,86985000,18.686586\n2001-03-28,57.375,57.9375,55.375,55.5625,78681600,18.749859\n2001-03-27,56.0625,58.5625,55.875,58.25,95135600,19.65677\n2001-03-26,57.125,57.50,55.5625,56.0625,63118600,18.918586\n2001-03-23,54.9375,57.00,54.375,56.5625,99519600,19.087314\n2001-03-22,50.5625,54.0625,50.50,54.00,126363200,18.222585\n2001-03-21,52.25,53.25,49.75,50.0625,124988600,16.893855\n2001-03-20,54.5625,56.125,52.625,52.6875,91822800,17.779675\n2001-03-19,54.50,55.50,53.125,54.3125,61036400,18.328039\n2001-03-16,52.50,55.125,52.484299,54.5625,112848800,18.412403\n2001-03-15,55.3125,56.078098,53.50,53.6875,71638400,18.11713\n2001-03-14,52.50,55.25,52.1875,54.00,90686200,18.222585\n2001-03-13,52.1875,54.75,52.00,54.1875,91035600,18.285858\n2001-03-12,54.6875,55.00,51.625,51.9375,114376000,17.526583\n2001-03-09,57.9375,58.1875,54.875,56.6875,103794400,19.129496\n2001-03-08,60.3125,60.5937,58.4375,59.25,54626000,19.994225\n2001-03-07,59.875,61.125,59.3125,60.6875,59743600,20.479317\n2001-03-06,58.625,60.00,58.375,59.4375,66781800,20.057498\n2001-03-05,57.25,58.625,56.5625,57.4375,49383600,19.382587\n2001-03-02,57.50,58.125,56.4375,56.6875,79800800,19.129496\n2001-03-01,58.5625,59.50,56.25,59.359299,81781600,20.031108\n2001-02-28,59.5625,60.078098,58.1875,59.00,84608400,19.909861\n2001-02-27,59.375,61.1875,58.671799,59.375,99148600,20.036407\n2001-02-26,57.625,59.9375,57.375,59.5625,87936800,20.09968\n2001-02-23,54.4375,57.50,54.3125,56.75,92620600,19.150587\n2001-02-22,56.3125,56.8125,53.875,55.1875,100816400,18.623313\n2001-02-21,55.25,58.0625,55.1875,56.25,63947200,18.981859\n2001-02-20,57.375,58.25,55.375,55.875,60730800,18.855313\n2001-02-16,57.00,58.25,56.125,57.3125,66958400,19.340405\n2001-02-15,59.00,60.1875,57.875,58.8125,65627800,19.846588\n2001-02-14,57.625,59.00,56.375,58.375,61728400,19.698952\n2001-02-13,59.625,61.0625,58.125,58.1875,76070600,19.635679\n2001-02-12,58.8125,59.4375,57.1875,58.75,71289400,19.825497\n2001-02-09,61.3125,61.5625,58.50,59.125,100575200,19.952043\n2001-02-08,63.75,64.50,62.00,62.25,88041200,21.006591\n2001-02-07,62.00,65.0625,61.8125,64.6875,126061800,21.829138\n2001-02-06,62.0625,63.8125,61.6875,62.5625,96442000,21.112045\n2001-02-05,60.75,62.0625,60.25,61.9375,51399200,20.901136\n2001-02-02,62.50,63.375,60.75,60.8125,71100000,20.521499\n2001-02-01,60.8125,62.625,60.375,62.375,71792800,21.048773\n2001-01-31,63.00,63.75,61.00,61.0625,81898800,20.605863\n2001-01-30,64.50,64.75,62.875,63.375,57276800,21.386228\n2001-01-29,63.5625,64.625,63.50,64.50,84983800,21.765865\n2001-01-26,61.00,64.3125,61.00,64.00,93080000,21.597137\n2001-01-25,62.75,64.00,61.5625,61.8125,85657400,20.858954\n2001-01-24,61.00,63.4375,60.75,62.9375,110455000,21.238591\n2001-01-23,59.75,60.9375,58.9375,60.5625,70295200,20.437135\n2001-01-22,60.75,61.00,59.00,60.125,76673000,20.289498\n2001-01-19,60.00,61.4375,58.875,61.00,209348800,20.584772\n2001-01-18,53.6875,56.1875,52.625,55.50,109788800,18.728768\n2001-01-17,53.625,54.875,52.5625,52.9375,72844200,17.864038\n2001-01-16,53.375,53.50,51.125,52.5625,68462400,17.737493\n2001-01-12,54.875,55.00,52.50,53.50,73712000,18.053857\n2001-01-11,53.00,55.75,52.3125,55.00,101854800,18.56004\n2001-01-10,51.00,53.8125,50.75,52.875,90230200,17.842948\n2001-01-09,50.00,52.625,49.75,51.8125,114965400,17.484401\n2001-01-08,48.9375,49.75,46.6875,48.9375,79817600,16.514217\n2001-01-05,48.50,49.875,47.5625,49.125,93414600,16.57749\n2001-01-04,47.8125,50.50,46.875,48.4375,112397000,16.34549\n2001-01-03,43.1875,48.875,43.125,47.9375,135962200,16.176762\n2001-01-02,44.125,45.00,42.875,43.375,82413200,14.637122\n2000-12-29,43.9375,45.8125,43.00,43.375,99977600,14.637122\n2000-12-28,45.125,46.25,43.875,44.5625,77619200,15.037851\n2000-12-27,46.125,46.8125,45.00,46.4375,69003800,15.670579\n2000-12-26,46.875,48.5625,45.875,46.875,66941600,15.818216\n2000-12-22,44.75,47.125,44.75,46.4375,109551800,15.670579\n2000-12-21,40.75,45.125,40.3125,43.4375,163173000,14.658213\n2000-12-20,42.8125,44.00,41.375,41.50,149037800,14.004394\n2000-12-19,47.4375,48.00,44.50,44.8125,120271800,15.122214\n2000-12-18,49.00,50.00,47.00,47.8125,107187400,16.13458\n2000-12-15,51.046799,52.00,47.75,49.1875,116899800,16.598581\n2000-12-14,57.9375,58.734299,55.375,55.50,71201400,18.728768\n2000-12-13,60.50,60.50,56.8125,57.25,98360400,19.319314\n2000-12-12,57.8125,60.00,56.75,58.375,63106000,19.698952\n2000-12-11,55.50,58.75,55.00,58.0625,95576200,19.593497\n2000-12-08,54.625,55.875,53.4375,54.4375,120939800,18.370221\n2000-12-07,53.4375,54.00,52.25,53.125,145308400,17.927311\n2000-12-06,60.00,60.0625,56.0625,56.6875,90560800,19.129496\n2000-12-05,59.1875,60.50,58.25,59.875,101734400,20.205134\n2000-12-04,57.25,59.00,55.1875,56.4375,80407200,19.045132\n2000-12-01,58.0625,60.625,56.0625,56.625,109809800,19.108405\n2000-11-30,62.00,62.0625,57.00,57.375,197200800,19.361496\n2000-11-29,66.8125,67.125,63.25,65.0625,98280400,21.955684\n2000-11-28,69.375,69.75,66.8125,67.00,127446200,22.609503\n2000-11-27,71.4375,72.25,70.625,70.6875,85307600,23.85387\n2000-11-24,69.00,70.4375,68.50,69.9375,34439200,23.600778\n2000-11-22,66.0625,69.50,66.00,68.25,76343200,23.031322\n2000-11-21,67.375,69.25,67.375,67.75,59487600,22.862595\n2000-11-20,68.125,68.50,65.5625,67.1875,80157200,22.672776\n2000-11-17,69.4375,70.00,67.796799,69.0625,106525600,23.305505\n2000-11-16,69.4375,71.50,68.9375,68.9375,92128600,23.263323\n2000-11-15,69.0625,70.875,68.6875,70.0625,60422200,23.64296\n2000-11-14,68.00,69.8125,67.3125,68.8125,84218600,23.221141\n2000-11-13,66.6875,68.125,64.406197,66.4375,83364800,22.419685\n2000-11-10,69.9375,70.3125,66.8125,67.375,93744400,22.736049\n2000-11-09,68.50,71.3125,68.4375,70.875,91058600,23.917142\n2000-11-08,71.125,72.375,68.00,69.4375,206149400,23.43205\n2000-11-07,69.75,71.875,69.50,70.50,104331200,23.790597\n2000-11-06,68.6875,70.125,68.25,69.50,74851400,23.453141\n2000-11-03,69.25,69.625,68.0625,68.25,68711000,23.031322\n2000-11-02,70.375,70.843697,69.625,70.3125,77985200,23.727324\n2000-11-01,68.50,70.0625,68.4375,69.625,81309400,23.495323\n2000-10-31,69.00,69.50,68.00,68.875,104474000,23.242232\n2000-10-30,67.50,70.125,67.375,69.0625,110057600,23.305505\n2000-10-27,64.6875,69.1875,64.625,67.6875,124292400,22.841504\n2000-10-26,61.00,65.0625,60.8125,64.4375,114826600,21.744774\n2000-10-25,61.9375,63.4375,60.4375,61.25,167603800,20.669135\n2000-10-24,62.625,62.9375,60.1875,61.50,94427400,20.753499\n2000-10-23,64.625,66.25,60.6875,62.125,185170400,20.964409\n2000-10-20,61.3125,66.125,61.125,65.1875,160378600,21.997866\n2000-10-19,58.4375,62.1875,58.00,61.875,256993200,20.880045\n2000-10-18,49.625,53.25,48.4375,51.75,110536400,17.46331\n2000-10-17,51.875,52.4375,50.25,50.4375,81276600,17.0204\n2000-10-16,53.50,53.8125,49.5625,50.375,119759000,16.999309\n2000-10-13,53.875,54.875,52.125,53.75,104521200,18.138221\n2000-10-12,56.3125,56.875,53.8125,54.375,90219600,18.34913\n2000-10-11,54.00,56.9375,54.00,55.75,101205800,18.813131\n2000-10-10,53.9375,55.5625,53.8125,54.5625,62066200,18.412403\n2000-10-09,55.625,55.75,53.00,54.1875,58323600,18.285858\n2000-10-06,55.8125,56.75,54.75,55.5625,61794000,18.749859\n2000-10-05,55.50,57.25,55.25,55.375,81099400,18.686586\n2000-10-04,56.375,56.5625,54.50,55.4375,136453400,18.707677\n2000-10-03,59.5625,59.8125,56.50,56.5625,85374000,19.087314\n2000-10-02,60.50,60.8125,58.25,59.125,58562400,19.952043\n2000-09-29,61.00,61.3125,58.625,60.3125,74053600,20.352771\n2000-09-28,60.8125,61.875,60.625,61.3125,52360400,20.690226\n2000-09-27,63.4375,63.5625,59.8125,60.625,106155600,20.458226\n2000-09-26,60.9375,65.875,60.4375,62.6875,155704800,21.154227\n2000-09-25,63.25,63.50,60.4375,61.25,53484200,20.669135\n2000-09-22,61.125,63.50,61.00,63.25,84476600,21.344046\n2000-09-21,64.00,65.125,63.5625,64.1875,48952200,21.66041\n2000-09-20,64.875,65.00,63.1875,64.25,67791400,21.681501\n2000-09-19,63.625,65.75,63.375,65.00,79311200,21.934593\n2000-09-18,64.25,64.625,62.1875,63.00,69037800,21.259682\n2000-09-15,65.4375,65.625,63.3125,64.1875,99915200,21.66041\n2000-09-14,68.6875,68.75,65.6875,65.8125,78503000,22.208775\n2000-09-13,67.5625,68.75,67.1875,68.25,40744800,23.031322\n2000-09-12,68.75,69.3125,67.625,68.125,46781200,22.98914\n2000-09-11,69.125,69.6875,68.0625,68.8125,48495200,23.221141\n2000-09-08,70.375,70.875,69.1875,69.3125,56709600,23.389869\n2000-09-07,70.00,72.0625,69.4375,70.0625,111711200,23.64296\n2000-09-06,70.0625,70.6875,69.3125,69.4375,62960800,23.43205\n2000-09-05,70.00,70.6875,69.8125,70.125,50755200,23.664051\n2000-09-01,70.00,70.625,69.6875,70.1875,37629800,23.685142\n2000-08-31,70.875,72.00,69.6875,69.8125,72575400,23.558596\n2000-08-30,70.6875,70.9375,69.6875,70.00,53498800,23.621869\n2000-08-29,71.1875,72.75,70.875,70.9375,59400200,23.938233\n2000-08-28,70.1875,72.125,70.125,71.3125,56421600,24.064779\n2000-08-25,70.6875,71.6875,70.5625,70.625,52729400,23.832779\n2000-08-24,70.625,71.1875,69.9375,71.125,42405400,24.001506\n2000-08-23,70.8125,71.125,70.375,70.75,36726800,23.874961\n2000-08-22,70.8125,72.4375,70.218697,71.25,54428200,24.043688\n2000-08-21,70.6875,70.8125,70.0625,70.625,34119600,23.832779\n2000-08-18,71.125,71.4375,70.00,71.00,54438800,23.959324\n2000-08-17,71.125,72.00,70.5625,71.5625,36112800,24.149143\n2000-08-16,71.875,72.25,70.5625,71.00,44976200,23.959324\n2000-08-15,72.00,73.00,71.50,71.625,40714200,24.170234\n2000-08-14,72.3125,73.375,71.375,72.1875,53427000,24.360052\n2000-08-11,72.4375,72.6875,71.625,72.4375,35629600,24.444416\n2000-08-10,73.8125,74.0625,71.75,72.625,48986000,24.507689\n2000-08-09,73.75,74.875,73.125,74.25,63945600,25.056054\n2000-08-08,70.0625,74.6875,70.00,74.125,138038800,25.013872\n2000-08-07,70.1875,71.125,69.75,70.00,52741800,23.621869\n2000-08-04,69.4375,69.875,68.1875,69.125,38107400,23.326596\n2000-08-03,68.1875,70.375,68.125,70.25,54543400,23.706233\n2000-08-02,68.5625,70.4375,68.50,69.375,48269200,23.41096\n2000-08-01,69.9375,70.0625,68.1875,68.6875,47163600,23.178959\n2000-07-31,70.1875,71.125,69.25,69.8125,70283800,23.558596\n2000-07-28,70.9375,71.8125,69.625,69.6875,75645600,23.516414\n2000-07-27,67.875,70.125,67.50,69.375,74337600,23.41096\n2000-07-26,69.0625,69.50,67.25,67.8125,85404600,22.883686\n2000-07-25,70.8125,71.00,68.375,69.00,64188600,23.284414\n2000-07-24,72.0625,72.125,70.00,70.5625,56165600,23.811688\n2000-07-21,74.75,75.00,71.875,72.3125,56100600,24.402234\n2000-07-20,73.4375,75.25,73.125,74.8125,54690600,25.245873\n2000-07-19,76.0625,77.50,72.8125,73.125,139924600,24.676417\n2000-07-18,77.625,79.50,77.4375,78.50,70617200,26.490239\n2000-07-17,78.25,79.5625,77.50,78.1875,53992800,26.384784\n2000-07-14,79.50,79.75,78.4375,78.9375,51180600,26.637876\n2000-07-13,78.8125,80.00,77.375,79.9375,80843200,26.975331\n2000-07-12,78.25,81.00,77.1875,80.3125,58370200,27.101877\n2000-07-11,78.8125,80.50,78.50,79.125,37164800,26.701148\n2000-07-10,80.6875,81.3125,79.375,79.4375,52689800,26.806603\n2000-07-07,81.265602,82.875,80.5625,82.00,54153200,27.671332\n2000-07-06,78.875,81.6875,78.50,80.9375,47873200,27.312786\n2000-07-05,79.875,79.875,78.25,78.50,34824400,26.490239\n2000-07-03,79.6875,80.0625,79.375,80.00,15734800,26.996422\n2000-06-30,77.0625,80.00,76.6875,80.00,52356400,26.996422\n2000-06-29,78.25,78.9375,77.0625,77.1875,38449000,26.047329\n2000-06-28,79.00,80.0625,78.625,78.9375,37459200,26.637876\n2000-06-27,79.25,80.125,78.375,78.8125,31071200,26.595694\n2000-06-26,77.50,80.125,77.50,79.50,48287000,26.827694\n2000-06-23,79.9375,80.0625,77.00,77.6875,49811600,26.216056\n2000-06-22,81.375,82.00,79.3125,79.875,87315200,26.95424\n2000-06-21,77.00,82.1875,76.9375,80.6875,160399600,27.228422\n2000-06-20,73.875,75.25,73.75,74.9375,62275000,25.288054\n2000-06-19,72.5625,73.8125,72.00,73.6875,46604800,24.866235\n2000-06-16,72.625,73.125,71.50,72.5625,68710600,24.486598\n2000-06-15,70.8125,72.6875,70.625,72.375,65592600,24.423325\n2000-06-14,69.8125,71.00,69.50,70.50,79992400,23.790597\n2000-06-13,66.75,68.00,66.125,67.875,44289200,22.904777\n2000-06-12,69.00,69.00,66.375,66.875,49260600,22.567321\n2000-06-09,69.625,69.6875,68.3125,68.8125,35710200,23.221141\n2000-06-08,71.5625,72.125,68.25,68.8125,94765600,23.221141\n2000-06-07,69.25,70.75,67.125,70.50,76310600,23.790597\n2000-06-06,68.1875,69.875,67.8125,69.625,99019000,23.495323\n2000-06-05,66.015602,68.375,66.00,66.875,64400000,22.567321\n2000-06-02,66.00,66.75,65.00,66.3125,80463200,22.377503\n2000-06-01,64.375,66.00,63.8125,64.5625,94507200,21.786956\n2000-05-31,63.640598,63.703098,62.0625,62.5625,54968200,21.112045\n2000-05-30,62.4375,64.125,62.00,63.375,68536400,21.386228\n2000-05-26,62.0625,62.625,60.375,61.4375,55822000,20.732408\n2000-05-25,64.5625,64.75,61.125,61.50,94348800,20.753499\n2000-05-24,63.125,66.5625,63.00,65.5625,85482400,22.124411\n2000-05-23,63.875,65.5625,63.0625,63.1875,57963200,21.322955\n2000-05-22,65.125,65.25,62.4375,64.1875,69955000,21.66041\n2000-05-19,65.375,65.9375,64.50,65.0625,66578000,21.955684\n2000-05-18,68.0625,68.0625,65.875,66.1875,53640400,22.335321\n2000-05-17,68.875,69.125,67.25,67.6875,53242000,22.841504\n2000-05-16,69.5625,70.625,69.0625,69.50,48410600,23.453141\n2000-05-15,69.00,69.4375,68.00,69.375,33899600,23.41096\n2000-05-12,68.4375,69.75,68.25,68.8125,37886000,23.221141\n2000-05-11,66.625,68.125,65.75,67.875,58390800,22.904777\n2000-05-10,67.75,67.875,65.75,66.1875,67740000,22.335321\n2000-05-09,70.1875,70.4375,67.50,67.8125,60778400,22.883686\n2000-05-08,70.9375,71.375,69.6875,69.8125,36187600,23.558596\n2000-05-05,70.25,71.8125,69.875,71.125,36402200,24.001506\n2000-05-04,70.3125,71.25,69.3125,70.4375,43317200,23.769506\n2000-05-03,70.375,70.8125,68.8125,70.5625,55354800,23.811688\n2000-05-02,72.8125,73.50,69.50,69.875,97716200,23.579687\n2000-05-01,72.875,74.00,71.6875,73.4375,107811000,24.781872\n2000-04-28,70.75,71.00,68.25,69.75,78082600,23.537505\n2000-04-27,67.4375,69.9375,67.375,69.8125,77669800,23.558596\n2000-04-26,70.00,71.125,67.375,68.00,107091200,22.946959\n2000-04-25,68.75,69.50,67.625,69.375,159517400,23.41096\n2000-04-24,67.25,68.00,65.00,66.625,313645800,22.482958\n2000-04-20,78.625,79.875,77.50,78.9375,52387400,26.637876\n2000-04-19,81.4375,81.50,78.125,78.6875,53715400,26.553512\n2000-04-18,76.50,81.9375,75.875,80.5625,91794600,27.18624\n2000-04-17,74.25,76.00,73.00,75.875,119772200,25.604419\n2000-04-14,79.125,79.50,73.25,74.125,151217800,25.013872\n2000-04-13,80.875,82.25,79.00,79.25,94316200,26.74333\n2000-04-12,82.125,82.25,78.75,79.375,153003800,26.785512\n2000-04-11,85.125,86.0625,83.50,83.875,71961800,28.304061\n2000-04-10,88.625,88.625,86.00,86.0625,60685400,29.042244\n2000-04-07,87.00,89.375,85.00,89.0625,82613600,30.05461\n2000-04-06,87.875,88.00,85.265602,86.00,66421400,29.021153\n2000-04-05,88.25,88.50,85.875,86.375,82887600,29.147699\n2000-04-04,91.5625,92.00,84.9375,88.5625,181244400,29.885883\n2000-04-03,94.4375,96.50,90.00,90.875,260118200,30.666248\n2000-03-31,106.00,108.25,104.125,106.25,64281400,35.854623\n2000-03-30,106.1875,108.625,102.50,103.375,64178400,34.884439\n2000-03-29,105.1875,108.9375,105.125,107.1875,64363800,36.170987\n2000-03-28,103.625,107.4375,102.375,104.3125,81114400,35.200803\n2000-03-27,107.765602,108.25,103.9375,104.0625,111434000,35.116439\n2000-03-24,112.625,115.00,109.5625,111.6875,112196800,37.689536\n2000-03-23,106.8125,112.875,106.625,111.875,148224000,37.752809\n2000-03-22,102.8125,105.625,101.125,103.25,93975800,34.842257\n2000-03-21,96.75,103.125,96.50,102.75,81648800,34.673529\n2000-03-20,98.75,99.75,96.50,97.375,47773000,32.859707\n2000-03-17,95.25,99.50,94.50,99.375,81161600,33.534618\n2000-03-16,95.9375,96.6875,93.25,95.375,77300800,32.184797\n2000-03-15,94.5625,96.625,93.6875,95.375,53208000,32.184797\n2000-03-14,98.625,99.25,95.125,95.125,73489200,32.100433\n2000-03-13,97.625,100.25,97.50,98.00,61831800,33.070617\n2000-03-10,99.5625,102.50,99.50,101.00,85589000,34.082983\n2000-03-09,95.3125,100.00,95.00,100.00,88198800,33.745527\n2000-03-08,93.8125,96.1875,91.00,95.5625,94290000,32.248069\n2000-03-07,96.125,97.50,91.9375,92.875,135061000,31.341158\n2000-03-06,96.00,97.375,90.125,90.625,93609400,30.581884\n2000-03-03,94.75,98.875,93.875,96.125,101435200,32.437888\n2000-03-02,91.8125,95.375,91.125,93.375,106932600,31.509886\n2000-03-01,89.625,94.093697,88.9375,90.8125,106889800,30.645157\n2000-02-29,91.75,91.75,88.875,89.375,58437400,30.160065\n2000-02-28,90.25,92.125,88.125,91.5625,76131800,30.898248\n2000-02-25,94.6875,94.703102,90.50,91.3125,65301400,30.813885\n2000-02-24,94.25,95.875,92.00,94.75,69733200,31.973887\n2000-02-23,93.50,95.75,92.0625,94.25,75847200,31.805159\n2000-02-22,95.125,97.125,92.8125,93.8125,66296200,31.657523\n2000-02-18,100.00,100.0625,94.875,95.0625,79063000,32.079342\n2000-02-17,98.50,99.6875,97.140602,99.625,80343400,33.618982\n2000-02-16,99.25,100.1875,97.125,97.625,65202600,32.944071\n2000-02-15,99.75,100.00,98.125,98.5625,71027600,33.260435\n2000-02-14,101.234299,101.75,99.0625,99.625,81028600,33.618982\n2000-02-11,104.875,104.875,99.125,99.9375,115559000,33.724436\n2000-02-10,103.890602,106.5625,102.50,106.00,54527800,35.770259\n2000-02-09,109.4375,109.4375,103.875,104.00,55090000,35.095348\n2000-02-08,106.4375,110.00,106.4375,109.9375,56229000,37.098989\n2000-02-07,106.8125,106.875,104.25,106.625,40005800,35.981168\n2000-02-04,104.375,108.00,104.140602,106.5625,55365400,35.960077\n2000-02-03,102.0625,104.1875,100.125,103.625,49186000,34.968803\n2000-02-02,102.4375,103.9375,100.50,100.8125,49915600,34.01971\n2000-02-01,98.50,103.25,97.6875,102.9375,70196600,34.736802\n2000-01-31,97.625,98.1875,94.875,97.875,73194200,33.028435\n2000-01-28,98.125,100.25,97.25,98.25,58225400,33.154981\n2000-01-27,99.890602,101.1875,97.25,98.75,63654800,33.323708\n2000-01-26,102.4375,103.50,99.125,99.375,49365000,33.534618\n2000-01-25,101.00,103.875,99.5625,102.8125,59823200,34.69462\n2000-01-24,103.796799,105.6875,100.8125,101.25,63597600,34.167346\n2000-01-21,107.00,107.25,103.25,103.75,68416200,35.010985\n2000-01-20,107.0625,109.6875,105.875,106.00,56349800,35.770259\n2000-01-19,110.50,111.50,106.00,107.00,97568200,36.107714\n2000-01-18,111.8125,116.50,111.75,115.3125,81483600,38.912811\n2000-01-14,107.1875,113.9375,105.75,112.25,73416400,37.879354\n2000-01-13,104.375,108.625,101.50,107.8125,83144000,36.381897\n2000-01-12,108.50,108.875,104.4375,105.8125,66532400,35.706986\n2000-01-11,111.50,114.25,108.6875,109.375,46743600,36.90917\n2000-01-10,113.4375,113.6875,111.375,112.25,44963600,37.879354\n2000-01-07,108.625,112.25,107.3125,111.4375,62013600,37.605172\n2000-01-06,112.1875,113.875,108.375,110.00,54976600,37.12008\n2000-01-05,111.125,116.375,109.375,113.8125,64059600,38.406628\n2000-01-04,113.5625,117.125,112.25,112.625,54119000,38.0059\n2000-01-03,117.375,118.625,112.00,116.5625,53228400,39.33463\n1999-12-31,117.50,117.75,116.25,116.75,12517600,39.397903\n1999-12-30,117.875,119.9375,117.125,117.625,22360000,39.693176\n1999-12-29,116.9375,118.375,116.8125,117.9375,17449200,39.798631\n1999-12-28,118.75,118.8125,117.0625,117.50,24591000,39.650995\n1999-12-27,118.4375,119.25,116.125,119.125,32202200,40.199359\n1999-12-23,117.25,119.25,116.75,117.4375,31028400,39.629904\n1999-12-22,116.296799,118.00,115.125,117.5625,38565200,39.672085\n1999-12-21,112.375,116.625,110.625,115.875,57446000,39.10263\n1999-12-20,114.8125,115.00,111.1875,112.75,39433800,38.048082\n1999-12-17,116.625,117.125,113.625,115.25,105898800,38.89172\n1999-12-16,109.25,115.00,108.9375,113.6875,128660200,38.364446\n1999-12-15,98.5625,108.75,98.50,108.4375,155571600,36.592806\n1999-12-14,96.1875,101.125,95.3125,98.6875,144116200,33.302617\n1999-12-13,93.609299,96.9375,92.75,96.625,52691600,32.606616\n1999-12-10,93.375,94.125,92.25,93.875,36836000,31.678614\n1999-12-09,92.00,93.3125,91.4375,92.75,46258200,31.298977\n1999-12-08,93.125,94.3125,91.6875,91.75,40955800,30.961521\n1999-12-07,94.75,94.875,92.875,93.00,56859200,31.38334\n1999-12-06,95.25,97.1875,94.75,95.4375,49098200,32.205888\n1999-12-03,95.8125,97.125,95.734299,96.125,64100600,32.437888\n1999-12-02,93.0625,95.25,92.875,94.8125,55473800,31.994978\n1999-12-01,91.0625,93.9375,90.875,93.1875,48864200,31.446613\n1999-11-30,89.75,92.875,89.5625,91.046799,64145600,30.724222\n1999-11-29,90.125,92.0625,89.50,90.1875,51460200,30.434247\n1999-11-26,91.625,93.375,91.00,91.125,28514200,30.750612\n1999-11-24,89.5625,92.25,89.50,91.6875,53771000,30.94043\n1999-11-23,89.25,91.375,88.375,89.625,70787400,30.244429\n1999-11-22,89.625,90.375,88.4375,89.8125,90596600,30.307702\n1999-11-19,84.4375,86.5625,84.375,86.00,58226000,29.021153\n1999-11-18,84.9375,85.8125,84.50,84.9375,64493200,28.662607\n1999-11-17,86.4375,87.0625,85.00,85.00,66819000,28.683698\n1999-11-16,86.9375,87.75,85.875,87.3125,59165200,29.464063\n1999-11-15,88.25,88.50,86.9375,87.00,47080400,29.358609\n1999-11-12,89.75,90.00,87.0625,89.1875,49414200,30.096792\n1999-11-11,88.25,90.4375,88.25,89.625,69274600,30.244429\n1999-11-10,88.125,89.125,86.4375,87.125,69385400,29.400791\n1999-11-09,89.75,89.875,86.4375,88.875,109769800,29.991337\n1999-11-08,84.8125,90.75,84.375,89.9375,243819200,30.349884\n1999-11-05,91.8125,92.875,90.50,91.5625,70167400,30.898248\n1999-11-04,92.3125,92.75,90.3125,91.75,54239400,30.961521\n1999-11-03,92.9375,93.50,91.50,92.00,44517000,31.045885\n1999-11-02,92.75,94.50,91.9375,92.5625,46349000,31.235704\n1999-11-01,93.25,94.1875,92.125,92.375,53261200,31.172431\n1999-10-29,91.4375,94.00,91.25,92.5625,79452600,31.235704\n1999-10-28,90.00,90.875,89.3125,89.875,70570400,30.328793\n1999-10-27,91.50,91.625,89.6875,90.875,54416600,30.666248\n1999-10-26,94.375,95.25,92.265602,92.375,52467600,31.172431\n1999-10-25,92.00,93.5625,91.125,92.4375,30492200,31.193522\n1999-10-22,93.5625,93.875,91.75,92.6875,43650600,31.277886\n1999-10-21,90.5625,93.125,90.50,93.0625,60801200,31.404431\n1999-10-20,91.5625,92.375,90.25,92.25,88090600,31.130249\n1999-10-19,88.25,89.25,85.25,86.3125,69945600,29.126608\n1999-10-18,87.1875,88.00,85.0625,87.875,75312800,29.653882\n1999-10-15,89.50,89.8125,87.3125,88.0625,73788000,29.717155\n1999-10-14,90.875,92.234299,89.6875,90.6875,42737800,30.602975\n1999-10-13,92.00,93.125,90.3125,91.0625,38098400,30.729521\n1999-10-12,94.00,94.3125,92.375,92.5625,27668600,31.235704\n1999-10-11,94.625,95.00,94.125,94.3125,19943800,31.82625\n1999-10-08,93.50,95.1875,92.125,94.9375,35697000,32.03716\n1999-10-07,93.6875,95.0625,92.6875,93.75,46036400,31.636432\n1999-10-06,92.3125,94.00,92.0625,93.6875,35500200,31.615341\n1999-10-05,92.75,93.875,89.50,91.8125,43397000,30.982612\n1999-10-04,90.50,92.625,90.25,92.5625,29998000,31.235704\n1999-10-01,90.1875,90.625,88.3125,89.984299,44239000,30.365676\n1999-09-30,90.00,91.6875,88.8125,90.5625,47455400,30.560793\n1999-09-29,91.5625,92.125,89.125,89.50,37484400,30.202247\n1999-09-28,91.25,92.6875,89.0625,92.125,46000600,31.088067\n1999-09-27,92.00,92.9375,90.875,91.4375,34132200,30.856066\n1999-09-24,90.1875,91.375,88.875,90.9375,70277000,30.687339\n1999-09-23,96.875,96.875,90.015602,91.1875,71073600,30.771703\n1999-09-22,94.75,96.625,93.6875,96.0625,48531600,32.416797\n1999-09-21,96.5625,96.5625,94.125,94.625,47082800,31.931705\n1999-09-20,96.00,97.875,95.00,97.5625,48601800,32.92298\n1999-09-17,94.375,96.50,93.8125,96.4375,79773400,32.543343\n1999-09-16,92.875,94.0625,90.625,94.00,45796000,31.720796\n1999-09-15,95.50,95.75,92.375,92.625,48413800,31.256795\n1999-09-14,93.6875,95.5625,93.625,95.0625,40207800,32.079342\n1999-09-13,94.50,94.8125,93.375,93.875,27870800,31.678614\n1999-09-10,95.0625,95.3125,94.00,95.00,34455000,32.058251\n1999-09-09,92.4375,94.140602,91.796799,94.0625,38475200,31.741887\n1999-09-08,93.6875,94.6875,92.0625,92.25,42568200,31.130249\n1999-09-07,94.875,96.6875,93.75,94.25,47028000,31.805159\n1999-09-03,93.75,96.4375,93.50,95.875,52098000,32.353524\n1999-09-02,91.50,92.5625,90.6875,91.8125,33340800,30.982612\n1999-09-01,92.3125,93.4375,91.625,92.375,36607200,31.172431\n1999-08-31,91.8125,93.125,90.125,92.5625,46882800,31.235704\n1999-08-30,92.875,93.4375,91.5625,92.25,33300800,31.130249\n1999-08-27,95.0625,95.125,92.375,93.25,41948400,31.467704\n1999-08-26,95.375,96.375,93.6875,94.625,61246000,31.931705\n1999-08-25,93.625,96.00,93.1875,95.3125,81877600,32.163706\n1999-08-24,87.0625,93.50,87.0625,92.1875,120450000,31.109158\n1999-08-23,84.3125,86.625,83.875,86.4375,60447000,29.16879\n1999-08-20,84.00,84.781197,83.0625,83.375,46072800,28.135333\n1999-08-19,84.5625,85.125,83.125,83.8125,71478200,28.28297\n1999-08-18,84.4375,86.1875,84.0625,85.00,58361200,28.683698\n1999-08-17,85.4375,85.50,82.9375,84.5625,51749000,28.536061\n1999-08-16,85.0625,85.890602,82.3125,84.3125,57321800,28.451698\n1999-08-13,82.9375,85.625,82.75,84.6875,65099800,28.578243\n1999-08-12,83.9375,84.1875,81.625,81.75,61062000,27.586969\n1999-08-11,84.00,84.6875,82.3125,84.1875,66105200,28.409516\n1999-08-10,83.5625,84.0625,81.625,82.9375,62743000,27.987697\n1999-08-09,85.625,85.8125,83.6875,83.8125,39333600,28.28297\n1999-08-06,86.0625,86.4375,84.9375,85.125,67205800,28.72588\n1999-08-05,85.375,86.375,84.75,85.75,76634000,28.93679\n1999-08-04,85.125,87.1875,84.75,84.9375,75573400,28.662607\n1999-08-03,85.875,86.0625,84.375,84.75,55051200,28.599334\n1999-08-02,85.6875,86.9375,84.375,84.8125,48050600,28.620425\n1999-07-30,87.625,88.625,85.50,85.8125,51127400,28.957881\n1999-07-29,88.6875,88.8125,86.3125,86.9375,57968200,29.337518\n1999-07-28,89.1875,90.50,88.375,90.00,62215200,30.370975\n1999-07-27,88.8125,89.75,88.00,88.8125,65513000,29.970246\n1999-07-26,88.875,89.8125,87.625,87.625,50885000,29.569518\n1999-07-23,91.5625,91.75,89.6875,90.25,68833200,30.455338\n1999-07-22,94.375,94.50,90.00,91.0625,60904200,30.729521\n1999-07-21,93.625,95.3125,93.00,94.6875,54050800,31.952796\n1999-07-20,96.4375,96.75,92.3125,93.3125,92287400,31.488795\n1999-07-19,100.00,100.75,97.8125,98.375,81181600,33.197162\n1999-07-16,95.50,99.875,95.00,99.4375,115369800,33.555709\n1999-07-15,95.00,95.25,93.75,94.375,40926200,31.847341\n1999-07-14,93.75,95.00,92.50,94.9375,37985200,32.03716\n1999-07-13,93.125,94.0625,92.8125,93.625,30845000,31.59425\n1999-07-12,93.1875,94.75,92.375,94.1875,43847800,31.784068\n1999-07-09,92.375,93.3125,92.25,93.25,33884200,31.467704\n1999-07-08,91.8125,93.00,90.6875,92.5625,37790400,31.235704\n1999-07-07,90.0625,92.3125,89.875,92.3125,33834600,31.15134\n1999-07-06,92.25,92.9375,89.25,89.5625,45419400,30.223338\n1999-07-02,90.875,92.125,90.3125,92.00,32094800,31.045885\n1999-07-01,89.875,91.50,88.375,91.1875,47737800,30.771703\n1999-06-30,87.75,90.25,86.75,90.1875,57610200,30.434247\n1999-06-29,86.6875,88.0625,86.00,88.00,38973200,29.696064\n1999-06-28,85.50,86.8125,84.9375,86.75,31701000,29.274245\n1999-06-25,85.375,86.4375,84.375,84.9375,24933000,28.662607\n1999-06-24,85.75,86.25,84.00,84.625,33559000,28.557152\n1999-06-23,85.9375,87.375,85.0625,86.00,33942000,29.021153\n1999-06-22,88.4375,88.4375,86.25,86.50,38751000,29.189881\n1999-06-21,84.875,89.00,84.875,88.9375,56194400,30.012428\n1999-06-18,82.3125,85.00,82.125,85.00,69116200,28.683698\n1999-06-17,80.6875,83.00,80.50,82.875,44475200,27.966606\n1999-06-16,79.0625,81.625,78.9375,81.00,48325200,27.333877\n1999-06-15,78.0625,78.875,76.6875,77.6875,36981000,26.216056\n1999-06-14,78.75,79.6875,77.4375,77.5625,28369800,26.173875\n1999-06-11,80.00,80.50,77.5625,78.125,34543000,26.363693\n1999-06-10,81.875,82.3125,79.0625,79.875,35277400,26.95424\n1999-06-09,80.125,82.625,80.00,82.3125,53310800,27.776787\n1999-06-08,79.875,82.125,79.00,79.375,41516400,26.785512\n1999-06-07,79.9375,81.0625,79.1875,80.25,32392200,27.080786\n1999-06-04,76.9375,79.6875,76.75,79.5625,35668200,26.848785\n1999-06-03,78.375,78.9375,76.125,76.375,32934400,25.773146\n1999-06-02,78.0625,78.625,76.25,78.4375,42812600,26.469148\n1999-06-01,80.625,80.75,78.4375,78.50,36046400,26.490239\n1999-05-28,78.75,80.875,78.125,80.6875,41548000,27.228422\n1999-05-27,78.25,79.4375,77.50,78.375,56702200,26.448057\n1999-05-26,77.1875,78.50,75.50,78.50,52022800,26.490239\n1999-05-25,76.75,79.25,76.125,76.25,50791600,25.730965\n1999-05-24,77.875,77.875,76.0625,77.25,38990000,26.06842\n1999-05-21,78.50,79.00,77.00,77.5625,56568800,26.173875\n1999-05-20,79.5625,80.00,78.375,78.4375,42386200,26.469148\n1999-05-19,79.875,79.875,77.25,79.3125,46510800,26.764421\n1999-05-18,79.8125,80.25,77.9375,78.6875,63858400,26.553512\n1999-05-17,77.375,79.5625,77.00,79.125,66850200,26.701148\n1999-05-14,78.875,79.9375,76.625,76.875,84401000,25.941874\n1999-05-13,81.125,81.75,79.125,79.125,51737200,26.701148\n1999-05-12,80.75,81.00,79.25,80.50,60142600,27.165149\n1999-05-11,80.75,81.015602,79.4375,79.875,42786200,26.95424\n1999-05-10,79.875,80.50,78.25,79.6875,46218000,26.890967\n1999-05-07,79.625,80.375,78.00,79.0625,48011600,26.680057\n1999-05-06,80.6875,81.125,77.50,77.9375,74021000,26.30042\n1999-05-05,79.125,79.875,76.4375,79.125,67028200,26.701148\n1999-05-04,80.50,81.8125,77.75,78.0625,66502200,26.342602\n1999-05-03,81.4375,81.50,78.5625,79.875,67180000,26.95424\n1999-04-30,82.75,83.75,79.875,81.3125,58558600,27.439332\n1999-04-29,82.375,83.6875,80.406197,82.0625,60880600,27.692423\n1999-04-28,85.3125,86.50,81.718697,82.125,55963400,27.713514\n1999-04-27,88.75,88.75,83.9375,84.00,58665800,28.346243\n1999-04-26,87.1875,88.9375,86.75,88.00,48349800,29.696064\n1999-04-23,85.00,87.00,83.00,86.00,56592000,29.021153\n1999-04-22,85.00,85.25,83.375,84.9375,55096400,28.662607\n1999-04-21,82.125,82.50,80.00,82.00,92732800,27.671332\n1999-04-20,82.25,84.00,80.00,83.125,108459400,28.05097\n1999-04-19,86.875,88.125,80.375,81.00,75389000,27.333877\n1999-04-16,89.0625,89.125,85.875,86.625,44774000,29.232063\n1999-04-15,87.3125,89.875,83.875,88.875,72594600,29.991337\n1999-04-14,90.8125,91.125,85.875,85.875,52944000,28.978972\n1999-04-13,93.125,93.125,89.1875,90.125,46746800,30.413156\n1999-04-12,91.625,93.625,91.375,93.00,37858800,31.38334\n1999-04-09,94.25,95.00,93.00,94.25,31816800,31.805159\n1999-04-08,93.25,94.625,91.00,94.5625,38637000,31.910614\n1999-04-07,94.875,95.00,91.25,93.3125,46910200,31.488795\n1999-04-06,95.1875,95.625,93.25,94.0625,39674800,31.741887\n1999-04-05,94.3125,95.015602,93.50,94.9375,39848600,32.03716\n1999-04-01,91.25,92.875,90.265602,92.6875,41106000,31.277886\n1999-03-31,94.50,94.625,89.125,89.625,58752600,30.244429\n1999-03-30,93.375,93.50,92.25,93.00,67502400,31.38334\n1999-03-29,90.125,92.625,87.875,92.375,79777000,31.172431\n1999-03-26,178.9375,180.375,175.75,178.125,94687600,30.05461\n1999-03-25,173.0625,180.0625,172.50,179.9375,109447600,30.360429\n1999-03-24,167.00,171.8125,163.125,171.25,82634400,28.894608\n1999-03-23,172.6875,174.125,166.25,166.5625,69581200,28.103697\n1999-03-22,172.9375,174.9375,172.00,172.8125,55719200,29.158245\n1999-03-19,173.875,174.125,169.875,171.1875,91980400,28.884062\n1999-03-18,166.4375,172.5625,166.1875,172.4375,56231200,29.094972\n1999-03-17,169.0625,169.4375,166.75,167.125,44919600,28.198606\n1999-03-16,165.50,170.00,164.25,169.0625,68554000,28.525516\n1999-03-15,160.5625,166.00,157.875,165.875,60609600,27.987697\n1999-03-12,162.625,162.75,156.8125,160.1875,73395200,27.028058\n1999-03-11,161.00,164.5625,159.3125,161.4375,62948400,27.238968\n1999-03-10,162.3125,162.50,159.1875,161.375,53114800,27.228422\n1999-03-09,159.875,164.75,159.75,161.8125,90129600,27.302241\n1999-03-08,155.50,159.234299,155.00,159.00,46726000,26.827694\n1999-03-05,154.75,155.375,153.125,154.9375,47302800,26.142238\n1999-03-04,151.125,153.50,148.125,152.25,61696400,25.688783\n1999-03-03,149.00,150.6875,147.0625,149.625,76798400,25.245873\n1999-03-02,151.875,154.125,147.625,148.5625,58569600,25.066599\n1999-03-01,149.5625,152.5625,149.50,151.75,58332000,25.604419\n1999-02-26,152.375,152.50,149.50,150.125,59273200,25.330236\n1999-02-25,152.375,153.75,149.625,153.50,70817200,25.899692\n1999-02-24,156.4375,159.375,152.75,152.875,67696800,25.794237\n1999-02-23,152.9375,155.625,150.50,155.4375,95106800,26.226602\n1999-02-22,148.25,149.00,144.75,148.8125,92514400,25.108781\n1999-02-19,147.4375,149.25,145.75,147.75,73085600,24.929508\n1999-02-18,150.9375,151.375,143.984299,145.75,117035200,24.592053\n1999-02-17,152.9375,154.125,148.50,150.00,101215600,25.309145\n1999-02-16,159.75,159.875,154.5625,156.25,73666800,26.363693\n1999-02-12,161.6875,163.6875,157.125,157.75,62930400,26.616785\n1999-02-11,162.75,163.875,160.375,162.75,60366000,27.460423\n1999-02-10,159.875,164.375,158.625,160.625,73694000,27.101877\n1999-02-09,164.9375,166.75,159.75,160.0625,77293600,27.006967\n1999-02-08,162.5625,165.5625,161.625,165.25,109866800,27.882242\n1999-02-05,160.25,161.625,154.875,160.00,127945200,26.996422\n1999-02-04,168.125,168.375,158.875,159.0625,89151600,26.83824\n1999-02-03,166.375,169.875,166.00,166.8125,73749200,28.145879\n1999-02-02,172.50,172.5625,166.25,167.625,91965600,28.28297\n1999-02-01,175.4375,175.9375,170.8125,172.9375,81729200,29.179336\n1999-01-29,174.75,175.125,170.875,175.00,79571600,29.527336\n1999-01-28,171.75,174.0625,169.8125,174.00,78838400,29.358609\n1999-01-27,172.50,174.4375,168.50,168.625,98048000,28.451698\n1999-01-26,165.50,171.75,164.50,171.5625,120203200,28.947335\n1999-01-25,161.6875,163.3125,159.125,161.875,103076400,27.312786\n1999-01-22,155.625,160.234299,155.25,156.25,82160000,26.363693\n1999-01-21,161.75,163.3125,157.75,158.3125,80077200,26.711694\n1999-01-20,166.9375,167.75,162.484299,162.625,125481200,27.439332\n1999-01-19,151.375,158.375,150.875,155.625,102741600,26.258238\n1999-01-15,142.9375,150.00,141.375,149.75,59344000,25.266964\n1999-01-14,145.25,145.5625,141.50,141.75,59214000,23.917142\n1999-01-13,136.00,147.75,136.00,143.8125,75346000,24.265143\n1999-01-12,148.125,148.125,141.00,142.1875,57907200,23.990961\n1999-01-11,150.875,150.9375,144.25,147.50,46463200,24.887326\n1999-01-08,152.1875,152.50,147.00,149.875,50244800,25.288054\n1999-01-07,149.75,150.625,148.25,150.50,51150400,25.393509\n1999-01-06,149.50,151.50,146.75,151.25,69064800,25.520055\n1999-01-05,141.875,148.00,141.4375,146.50,64281600,24.718599\n1999-01-04,139.609299,145.25,139.375,141.00,69305200,23.790597\n1998-12-31,139.1875,140.00,138.00,138.6875,23834400,23.400414\n1998-12-30,140.875,143.359299,138.875,139.00,34942800,23.453141\n1998-12-29,142.5625,142.5625,139.625,140.50,29651600,23.706233\n1998-12-28,143.00,143.625,141.50,142.375,23636400,24.022597\n1998-12-24,143.625,144.00,141.50,141.75,13832400,23.917142\n1998-12-23,140.375,143.8125,139.375,143.5625,34940000,24.222961\n1998-12-22,140.50,140.50,137.375,138.4375,41350000,23.358232\n1998-12-21,138.625,142.1875,137.75,140.4375,48112000,23.695687\n1998-12-18,135.00,138.25,134.125,137.8125,59648000,23.252777\n1998-12-17,134.1875,134.875,132.25,134.375,46963600,22.672776\n1998-12-16,132.50,135.125,129.125,133.75,60024000,22.567321\n1998-12-15,129.3125,132.00,129.25,131.875,51719600,22.250957\n1998-12-14,132.75,133.75,127.6875,127.9375,64077600,21.586592\n1998-12-11,131.00,134.6875,130.75,134.00,51728800,22.609503\n1998-12-10,133.125,134.625,131.375,131.5625,57015600,22.19823\n1998-12-09,132.125,133.8125,130.00,133.625,44781600,22.54623\n1998-12-08,132.875,134.25,129.75,131.1875,77585200,22.134957\n1998-12-07,127.6875,133.75,126.75,133.5625,89809200,22.535685\n1998-12-04,124.9375,127.375,124.00,127.375,44352000,21.491683\n1998-12-03,126.875,128.9375,122.00,122.125,51426800,20.605863\n1998-12-02,129.1875,129.75,125.50,126.75,65759600,21.386228\n1998-12-01,120.25,129.75,120.125,129.50,86330800,21.850229\n1998-11-30,129.375,130.265594,121.9375,122.00,70900000,20.584772\n1998-11-27,125.125,128.125,124.3125,128.0625,26335600,21.607683\n1998-11-25,122.6875,124.375,120.75,124.25,41394000,20.964409\n1998-11-24,118.6875,125.0625,118.625,121.6875,101114800,20.532044\n1998-11-23,112.50,120.1875,112.50,119.1875,110870400,20.110225\n1998-11-20,112.75,113.75,111.25,113.625,48405200,19.171678\n1998-11-19,109.0625,112.50,109.0625,111.75,45220800,18.855313\n1998-11-18,109.5625,111.0625,109.125,109.75,41691200,18.517858\n1998-11-17,109.00,112.375,108.9375,111.875,58744000,18.876404\n1998-11-16,111.3125,111.75,107.50,108.8125,42620400,18.359676\n1998-11-13,108.4375,110.50,108.375,110.00,28368800,18.56004\n1998-11-12,110.25,111.125,108.50,108.75,38526800,18.34913\n1998-11-11,113.4375,114.75,110.875,111.0625,63899200,18.739313\n1998-11-10,110.125,113.4375,110.0625,112.0625,72075600,18.908041\n1998-11-09,109.1875,111.375,108.8125,110.6875,68956800,18.67604\n1998-11-06,106.0625,109.75,105.9375,109.3125,74461200,18.44404\n1998-11-05,105.3125,107.625,105.25,106.375,76727200,17.948402\n1998-11-04,105.8125,107.3125,104.875,105.50,67459600,17.800766\n1998-11-03,105.50,106.5625,104.75,105.1875,36546800,17.748038\n1998-11-02,106.375,106.875,105.00,105.8125,48388400,17.853493\n1998-10-30,107.25,108.1875,105.125,105.875,59322800,17.864038\n1998-10-29,105.4375,107.50,105.4375,106.625,52402800,17.990584\n1998-10-28,104.875,106.625,104.875,105.6875,56808400,17.832402\n1998-10-27,107.75,107.875,105.00,105.4375,65434800,17.79022\n1998-10-26,106.8125,108.00,105.6875,107.0625,59678400,18.064403\n1998-10-23,109.00,110.00,106.1875,106.375,59882000,17.948402\n1998-10-22,106.00,110.125,105.25,110.00,81910800,18.56004\n1998-10-21,104.875,106.875,103.0625,106.4375,125377200,17.958948\n1998-10-20,103.25,103.375,99.625,100.25,94368400,16.914946\n1998-10-19,104.125,104.1875,101.125,102.9375,60177600,17.368401\n1998-10-16,106.00,106.50,104.00,105.0625,68620000,17.726947\n1998-10-15,100.125,105.625,99.625,105.4375,66253600,17.79022\n1998-10-14,95.875,101.375,95.875,100.1875,62403200,16.9044\n1998-10-13,99.50,99.75,95.75,96.4375,47995600,16.271671\n1998-10-12,99.25,101.00,98.50,99.75,51502800,16.830582\n1998-10-09,93.1875,97.00,92.25,96.875,72661600,16.34549\n1998-10-08,90.5625,91.875,87.75,91.1875,144719200,15.385851\n1998-10-07,97.375,99.75,93.375,94.125,90710400,15.881489\n1998-10-06,102.50,103.625,97.375,97.625,76550000,16.472035\n1998-10-05,102.50,102.875,96.50,101.1875,114937600,17.073128\n1998-10-02,103.375,105.1875,101.00,104.125,65889600,17.568765\n1998-10-01,108.0625,109.50,104.00,104.0625,65442400,17.55822\n1998-09-30,112.3125,113.5625,110.031197,110.0625,38875600,18.570585\n1998-09-29,111.8125,114.00,111.375,112.875,48743200,19.045132\n1998-09-28,113.00,114.375,109.75,111.3125,41405200,18.781495\n1998-09-25,109.125,113.125,108.625,113.0625,47878400,19.076768\n1998-09-24,113.125,114.625,109.00,110.125,63521600,18.581131\n1998-09-23,109.625,113.875,108.50,113.625,65263600,19.171678\n1998-09-22,108.4375,109.875,106.75,109.1875,43082000,18.422949\n1998-09-21,102.50,108.0625,102.375,107.875,45872000,18.201494\n1998-09-18,105.75,106.25,104.3125,105.375,47361600,17.779675\n1998-09-17,105.3125,106.50,104.8125,104.9375,45178400,17.705856\n1998-09-16,107.875,108.50,106.125,108.1875,42886800,18.254221\n1998-09-15,105.875,108.4375,105.125,108.3125,49367600,18.275312\n1998-09-14,104.9375,107.0625,104.875,106.00,45086800,17.885129\n1998-09-11,101.125,104.625,100.125,104.25,58989200,17.589856\n1998-09-10,100.00,101.125,98.6875,100.75,60758000,16.999309\n1998-09-09,102.25,104.4375,101.625,102.25,65480800,17.252401\n1998-09-08,100.00,102.0625,99.0625,101.968697,60625600,17.204937\n1998-09-04,99.6875,100.25,96.125,96.625,50890400,16.303308\n1998-09-03,98.75,100.75,98.375,99.25,67506800,16.746218\n1998-09-02,101.8125,104.25,100.25,100.5625,63438400,16.967673\n1998-09-01,95.25,101.75,94.50,101.25,140112400,17.083673\n1998-08-31,104.875,106.50,95.75,95.9375,132690400,16.187308\n1998-08-28,108.25,109.625,104.75,105.25,72730000,17.758584\n1998-08-27,110.5625,112.75,108.50,109.25,74874000,18.433494\n1998-08-26,111.25,113.75,110.875,112.5625,44804400,18.992405\n1998-08-25,111.375,113.6875,111.125,112.8125,58026800,19.034586\n1998-08-24,110.3125,112.00,110.00,110.375,26319200,18.623313\n1998-08-21,111.125,111.875,108.75,110.625,59523600,18.665495\n1998-08-20,110.125,112.75,109.6875,112.5625,49970400,18.992405\n1998-08-19,112.25,112.75,110.25,110.5625,55709600,18.654949\n1998-08-18,107.875,111.8125,107.375,111.25,70591200,18.77095\n1998-08-17,103.50,107.375,103.00,107.3125,54073200,18.106584\n1998-08-14,104.6875,105.0625,103.50,104.25,29566400,17.589856\n1998-08-13,104.125,106.00,103.75,103.9375,51193200,17.537129\n1998-08-12,104.3125,105.1875,103.00,105.0625,53760000,17.726947\n1998-08-11,102.875,104.375,102.00,103.4375,60976400,17.452765\n1998-08-10,105.8125,106.3125,104.4375,104.4375,46763200,17.621493\n1998-08-07,107.4375,107.50,105.0625,105.875,54972400,17.864038\n1998-08-06,103.75,106.9375,103.625,106.875,68308000,18.032766\n1998-08-05,104.125,106.25,101.50,104.3125,120208800,17.600402\n1998-08-04,108.625,109.625,104.1875,104.50,91412000,17.632038\n1998-08-03,109.125,110.875,107.375,108.4375,73566400,18.296403\n1998-07-31,112.9375,113.515602,109.9375,109.9375,53705200,18.549495\n1998-07-30,111.9375,113.625,110.75,113.4375,72746400,19.140041\n1998-07-29,113.25,114.25,110.0625,110.6875,59738000,18.67604\n1998-07-28,116.00,116.875,112.00,112.25,78378400,18.939677\n1998-07-27,113.125,116.75,110.6875,116.75,58998000,19.698952\n1998-07-24,113.75,115.625,112.50,113.8125,60366400,19.203314\n1998-07-23,116.3125,117.50,113.00,113.00,51029600,19.066223\n1998-07-22,112.00,117.25,111.875,116.75,71654400,19.698952\n1998-07-21,116.875,119.00,112.50,112.8125,74605200,19.034586\n1998-07-20,118.1875,119.50,116.8125,117.00,45794800,19.741133\n1998-07-17,117.50,119.625,115.9375,117.9375,83108400,19.899316\n1998-07-16,118.0625,118.875,116.625,117.375,65125200,19.804406\n1998-07-15,116.00,118.00,115.625,117.375,48690000,19.804406\n1998-07-14,118.25,118.75,115.50,116.50,56972400,19.65677\n1998-07-13,114.125,118.25,113.625,117.5625,69223200,19.836043\n1998-07-10,111.125,113.25,109.875,113.1875,45396800,19.097859\n1998-07-09,110.00,112.00,109.75,111.00,43690000,18.728768\n1998-07-08,108.125,110.125,106.75,109.875,41553600,18.538949\n1998-07-07,107.8125,108.5625,106.50,107.9375,32422800,18.212039\n1998-07-06,106.875,108.0625,105.375,107.8125,35307600,18.190948\n1998-07-02,108.8125,109.125,107.125,107.25,27321200,18.096039\n1998-07-01,109.125,110.125,107.1875,109.375,53470400,18.454585\n1998-06-30,105.25,108.5625,104.625,108.375,77010000,18.285858\n1998-06-29,105.50,107.6875,105.25,107.4375,65906000,18.127675\n1998-06-26,102.25,104.625,102.00,104.4375,55680400,17.621493\n1998-06-25,105.875,106.875,101.375,101.5625,88969600,17.136401\n1998-06-24,101.6875,105.125,99.9375,104.9375,105724800,17.705856\n1998-06-23,95.8125,100.875,95.25,100.75,124675200,16.999309\n1998-06-22,94.75,95.9375,93.6875,95.8125,48969600,16.166217\n1998-06-19,92.875,94.75,92.50,94.6875,91226800,15.976398\n1998-06-18,90.8125,91.75,90.375,91.1875,39228400,15.385851\n1998-06-17,89.9375,92.375,89.75,91.0625,76147600,15.36476\n1998-06-16,86.3125,89.9375,85.50,89.875,61138400,15.164396\n1998-06-15,84.6875,87.3125,84.5625,85.9375,42846000,14.500031\n1998-06-12,84.875,86.125,84.00,85.75,41323600,14.468395\n1998-06-11,86.4375,87.125,85.125,85.3125,41271200,14.394576\n1998-06-10,86.625,88.375,85.875,86.00,33290400,14.510577\n1998-06-09,85.3125,87.5625,85.25,87.0625,35690400,14.68985\n1998-06-08,85.625,86.3125,85.00,85.6875,18886400,14.457849\n1998-06-05,85.875,86.50,84.75,86.25,34431600,14.552759\n1998-06-04,84.6875,86.125,83.625,86.0625,33717600,14.521122\n1998-06-03,85.875,86.4375,84.125,84.3125,36010800,14.225849\n1998-06-02,84.0625,85.9375,83.875,85.50,38570800,14.426213\n1998-06-01,83.875,84.609299,83.125,83.75,42436800,14.13094\n1998-05-29,86.375,86.50,84.75,84.8125,34091200,14.310213\n1998-05-28,85.75,86.375,85.0625,86.3125,30746800,14.563304\n1998-05-27,82.875,86.125,82.875,86.00,58574400,14.510577\n1998-05-26,85.3125,86.1875,83.50,83.625,44473600,14.109849\n1998-05-22,86.625,86.75,85.4375,85.5625,36129200,14.436758\n1998-05-21,85.8125,87.375,85.50,86.375,36680000,14.57385\n1998-05-20,86.125,86.875,85.375,85.75,35698800,14.468395\n1998-05-19,85.8125,86.9375,85.5625,86.50,52234400,14.594941\n1998-05-18,84.50,86.50,84.50,86.0625,80395600,14.521122\n1998-05-15,90.125,90.1875,88.75,89.4375,48150800,15.090578\n1998-05-14,85.875,91.00,85.8125,88.9375,94774400,15.006214\n1998-05-13,88.6875,88.75,86.50,86.9375,80680400,14.668759\n1998-05-12,83.25,85.75,83.25,85.6875,64147200,14.457849\n1998-05-11,86.125,86.1875,84.0625,84.25,51474400,14.215303\n1998-05-08,81.875,86.125,81.875,85.75,96274800,14.468395\n1998-05-07,86.1875,86.25,83.1875,83.375,78022000,14.067667\n1998-05-06,87.50,87.50,86.00,86.375,48110800,14.57385\n1998-05-05,87.625,89.5625,87.00,87.75,50828000,14.80585\n1998-05-04,89.1875,89.875,87.9375,88.0625,37899600,14.858577\n1998-05-01,90.1875,90.50,88.125,89.625,35996000,15.122214\n1998-04-30,91.50,91.625,89.6875,90.125,54473600,15.206578\n1998-04-29,90.0625,91.50,89.625,90.50,50061600,15.269851\n1998-04-28,92.125,92.25,89.015602,89.875,56668000,15.164396\n1998-04-27,89.50,90.531197,88.50,90.3125,58752000,15.238215\n1998-04-24,93.50,94.75,91.875,92.125,51436000,15.544033\n1998-04-23,97.25,97.375,94.140602,94.50,64215200,15.944762\n1998-04-22,96.00,99.125,95.625,98.875,80154000,16.682945\n1998-04-21,94.6875,95.00,93.125,94.875,51938400,16.008034\n1998-04-20,92.375,95.00,92.1875,94.625,45535200,15.965853\n1998-04-17,91.50,92.25,90.3125,92.125,37402800,15.544033\n1998-04-16,90.375,92.0625,90.1875,91.6875,39695600,15.470215\n1998-04-15,89.25,91.375,88.875,91.375,40498400,15.417488\n1998-04-14,88.6875,89.5625,87.50,88.4375,28476800,14.92185\n1998-04-13,88.8125,89.00,86.75,88.625,33156400,14.953487\n1998-04-09,87.9375,89.625,87.50,89.00,33619200,15.01676\n1998-04-08,86.75,89.00,86.625,88.9375,36793200,15.006214\n1998-04-07,89.3125,90.625,86.75,87.25,62630800,14.721486\n1998-04-06,92.625,92.625,89.0625,89.9375,74232000,15.174942\n1998-04-03,92.00,93.0625,91.50,93.00,40987600,15.69167\n1998-04-02,90.6875,91.9375,89.875,91.3125,41414800,15.406942\n1998-04-01,89.8125,90.625,88.50,90.375,36835600,15.24876\n1998-03-31,88.625,89.75,88.50,89.50,38177200,15.101123\n1998-03-30,88.0625,88.625,87.125,87.9375,27463200,14.837487\n1998-03-27,89.375,89.375,87.5625,87.8125,38924000,14.816396\n1998-03-26,88.50,89.5625,87.50,88.25,45441200,14.890214\n1998-03-25,90.50,90.9375,87.25,88.8125,124244800,14.985123\n1998-03-24,84.1875,85.0625,83.4375,84.9375,32281600,14.331304\n1998-03-23,81.1875,84.625,81.0625,83.875,55050000,14.15203\n1998-03-20,82.125,83.00,80.50,81.8125,56310000,13.80403\n1998-03-19,81.50,82.3125,81.25,82.00,30299200,13.835666\n1998-03-18,80.0625,81.8125,79.875,81.75,33887600,13.793484\n1998-03-17,81.6875,81.6875,79.6875,80.375,53842400,13.561484\n1998-03-16,82.4375,82.75,81.375,82.00,27979600,13.835666\n1998-03-13,82.4375,83.00,81.5625,82.375,32542400,13.898939\n1998-03-12,82.50,82.625,80.8125,81.875,47962000,13.814575\n1998-03-11,82.00,82.00,79.75,80.6875,39838800,13.614211\n1998-03-10,81.1875,81.50,79.9375,81.50,47406400,13.751302\n1998-03-09,82.50,82.50,79.50,79.593697,52256000,13.429656\n1998-03-06,80.3125,82.75,80.25,82.75,51404800,13.962212\n1998-03-05,79.25,81.4375,79.25,80.0625,92255600,13.508756\n1998-03-04,82.4375,83.8125,81.5625,82.3125,71513600,13.888394\n1998-03-03,82.625,84.5625,82.5625,84.50,50753600,14.257485\n1998-03-02,85.875,85.875,83.0625,83.3125,50093600,14.057121\n1998-02-27,85.5625,86.00,84.5625,84.75,47532400,14.299667\n1998-02-26,85.50,85.6875,84.4375,85.50,61388000,14.426213\n1998-02-25,83.4375,85.00,83.0625,84.9375,94944400,14.331304\n1998-02-24,83.375,84.9375,81.875,82.125,118302000,13.856757\n1998-02-23,80.9375,81.6875,79.375,81.625,120803600,13.772393\n1998-02-20,155.50,155.75,152.875,155.125,86092000,13.086937\n1998-02-19,155.50,156.0625,154.25,154.875,73773600,13.065846\n1998-02-18,154.625,156.00,153.75,154.625,76608800,13.044755\n1998-02-17,158.50,158.50,153.875,154.375,85673600,13.023664\n1998-02-13,158.625,158.75,157.375,157.50,42203200,13.287301\n1998-02-12,158.0625,158.9375,156.4375,158.75,76658400,13.392756\n1998-02-11,159.375,160.0625,157.0625,158.9375,76460000,13.408574\n1998-02-10,157.25,159.50,156.75,159.25,48099200,13.434938\n1998-02-09,158.75,158.875,155.625,157.1875,54681600,13.260938\n1998-02-06,155.375,158.25,155.125,158.125,50070400,13.340029\n1998-02-05,158.125,158.75,154.75,155.4375,67014400,13.113301\n1998-02-04,155.875,158.00,155.0625,156.8125,61940800,13.229301\n1998-02-03,155.125,156.125,153.8125,155.875,61374400,13.15021\n1998-02-02,151.75,155.125,150.50,154.875,98397600,13.065846\n1998-01-30,148.625,150.00,147.625,149.1875,50071200,12.586027\n1998-01-29,148.9375,150.125,147.50,148.25,73571200,12.506936\n1998-01-28,146.25,149.50,145.50,149.00,79387200,12.570209\n1998-01-27,142.375,145.875,141.5625,145.1875,97540800,12.248572\n1998-01-26,139.875,141.875,138.453094,141.75,74277600,11.958571\n1998-01-23,138.75,139.4375,136.703094,138.25,63312000,11.663298\n1998-01-22,135.5625,139.875,135.3125,138.625,159139200,11.694934\n1998-01-21,137.25,138.4375,135.625,137.00,85567200,11.557843\n1998-01-20,134.125,138.00,134.00,137.8125,64956000,11.626389\n1998-01-16,132.375,135.375,132.3125,135.25,72943200,11.410206\n1998-01-15,130.375,133.00,129.875,132.3125,50622400,11.162388\n1998-01-14,132.125,132.50,129.25,131.125,54774400,11.062206\n1998-01-13,129.50,132.25,128.125,132.125,66945600,11.146569\n1998-01-12,124.625,130.00,124.375,129.50,78393600,10.925114\n1998-01-09,130.0625,131.50,125.875,127.00,87534400,10.714205\n1998-01-08,128.625,132.125,127.50,130.50,77619200,11.009478\n1998-01-07,129.875,131.1875,127.50,129.5625,61492800,10.930387\n1998-01-06,129.75,133.00,129.25,131.125,67834400,11.062206\n1998-01-05,131.25,133.625,127.875,130.375,80377600,10.998933\n1998-01-02,129.625,131.50,129.50,131.125,39748000,11.062206\n1997-12-31,131.00,131.50,129.00,129.25,46147200,10.904023\n1997-12-30,126.4375,131.00,126.25,130.25,77864800,10.988387\n1997-12-29,122.375,126.75,122.125,126.3125,67815200,10.656205\n1997-12-26,118.875,120.75,118.75,120.75,32388800,10.186931\n1997-12-24,123.75,123.875,118.00,118.9375,88411200,10.034022\n1997-12-23,127.0625,128.25,123.00,123.3125,67195200,10.403113\n1997-12-22,129.125,130.00,125.875,127.00,59063200,10.714205\n1997-12-19,128.75,130.1875,126.25,128.6875,138065600,10.856569\n1997-12-18,134.50,134.75,130.375,130.875,98774400,11.041115\n1997-12-17,139.875,140.375,135.50,135.625,51472000,11.441843\n1997-12-16,135.875,140.375,135.00,139.0625,65401600,11.731843\n1997-12-15,136.4375,137.00,133.00,136.125,84305600,11.484025\n1997-12-12,137.75,138.50,136.00,136.75,54308000,11.536752\n1997-12-11,140.375,141.00,138.875,139.0625,70189600,11.731843\n1997-12-10,142.25,143.25,141.00,142.25,66434400,12.000753\n1997-12-09,145.00,145.375,143.50,144.3125,51782400,12.174754\n1997-12-08,143.50,146.625,143.125,146.125,49952800,12.327663\n1997-12-05,142.125,144.75,142.125,143.125,48136000,12.074571\n1997-12-04,144.75,145.875,142.25,142.5625,62630400,12.027117\n1997-12-03,141.6875,145.0625,141.00,144.6875,57712000,12.20639\n1997-12-02,143.5625,144.875,142.00,142.25,50167200,12.000753\n1997-12-01,141.9375,144.00,141.625,143.8125,49006400,12.132572\n1997-11-28,141.25,142.25,141.125,141.50,17392800,11.93748\n1997-11-26,139.00,141.875,138.25,141.5625,63053600,11.942753\n1997-11-25,135.875,139.25,135.75,139.00,56463200,11.726571\n1997-11-24,137.125,138.125,135.50,135.50,39084000,11.431297\n1997-11-21,137.8125,138.00,136.375,137.875,68220800,11.631661\n1997-11-20,135.25,137.125,134.875,136.875,53680800,11.547298\n1997-11-19,133.625,135.125,133.375,135.0625,31720800,11.394388\n1997-11-18,134.9375,135.50,133.75,134.00,36683200,11.304752\n1997-11-17,134.50,135.8125,133.4375,134.875,60094400,11.37857\n1997-11-14,131.625,133.875,131.375,133.3125,46663200,11.246752\n1997-11-13,130.0625,131.625,129.1875,131.5625,60094400,11.099115\n1997-11-12,130.125,131.00,129.00,129.1875,45784000,10.898751\n1997-11-11,130.4375,131.4375,129.375,130.625,37013600,11.020024\n1997-11-10,131.625,132.50,129.75,130.1875,36764800,10.983115\n1997-11-07,130.0625,132.00,129.875,131.5625,63628800,11.099115\n1997-11-06,133.25,133.50,131.75,132.0625,40266400,11.141297\n1997-11-05,134.50,134.625,132.50,133.5625,42512800,11.267842\n1997-11-04,134.00,134.9375,133.1875,134.25,49134400,11.325843\n1997-11-03,131.625,134.25,131.3125,134.125,67714400,11.315297\n1997-10-31,131.00,131.50,129.625,130.00,46808800,10.967296\n1997-10-30,129.50,131.375,128.50,128.625,72097600,10.851296\n1997-10-29,133.75,135.0625,130.125,130.875,85532800,11.041115\n1997-10-28,132.25,135.00,123.50,133.375,160057600,11.252024\n1997-10-27,134.875,136.25,128.625,128.875,96795200,10.872387\n1997-10-24,136.875,137.25,133.25,135.375,70030400,11.420752\n1997-10-23,132.00,137.25,132.00,135.625,66413600,11.441843\n1997-10-22,138.375,138.50,135.375,135.6875,55775200,11.447116\n1997-10-21,136.125,139.234299,135.3125,138.50,115682400,11.684389\n1997-10-20,133.00,135.25,127.50,132.625,154052800,11.188751\n1997-10-17,133.125,134.625,130.375,132.25,87720000,11.157115\n1997-10-16,136.125,136.625,132.25,133.906204,47327200,11.296839\n1997-10-15,135.75,136.00,134.875,135.75,45003200,11.452388\n1997-10-14,137.125,137.375,135.375,136.6875,33361600,11.531479\n1997-10-13,137.00,137.875,136.5625,136.75,19051200,11.536752\n1997-10-10,138.3125,138.75,136.25,136.50,24893600,11.515661\n1997-10-09,138.50,139.625,138.125,138.9375,34672800,11.721298\n1997-10-08,136.625,139.0625,136.25,139.00,71196800,11.726571\n1997-10-07,135.00,137.6875,134.625,136.5625,54548800,11.520934\n1997-10-06,135.875,136.25,134.25,135.125,41776800,11.399661\n1997-10-03,134.9375,136.25,133.375,134.9375,60284800,11.383843\n1997-10-02,133.75,134.625,132.75,133.1875,28831200,11.236206\n1997-10-01,132.50,134.50,131.375,133.875,61466400,11.294206\n1997-09-30,134.4375,135.75,132.25,132.3125,43892800,11.162388\n1997-09-29,133.50,134.75,132.875,134.50,27505600,11.346934\n1997-09-26,133.625,133.75,131.625,133.375,36652000,11.252024\n1997-09-25,132.875,134.125,132.0625,132.75,39272000,11.199297\n1997-09-24,135.625,136.0625,132.125,132.4375,60040000,11.172933\n1997-09-23,133.5625,135.50,133.125,135.50,39946400,11.431297\n1997-09-22,135.00,135.875,133.1875,133.3125,43251200,11.246752\n1997-09-19,132.25,135.25,132.00,135.1875,77435200,11.404934\n1997-09-18,134.25,135.125,131.4375,132.25,61077600,11.157115\n1997-09-17,136.625,136.75,132.625,133.1875,61609600,11.236206\n1997-09-16,131.75,137.00,131.00,136.375,102538400,11.505116\n1997-09-15,135.625,137.25,130.625,130.6875,129003200,11.025296\n1997-09-12,136.875,138.375,135.625,137.9375,48576000,11.636934\n1997-09-11,135.00,137.375,132.875,136.8125,61779200,11.542025\n1997-09-10,138.875,139.125,135.0625,135.125,53294400,11.399661\n1997-09-09,139.25,140.25,138.375,139.50,39465600,11.768753\n1997-09-08,137.75,139.8125,137.75,139.3125,42416000,11.752934\n1997-09-05,139.0625,139.6875,136.25,137.3125,48398400,11.584207\n1997-09-04,136.00,138.50,135.75,138.1875,44476000,11.658025\n1997-09-03,137.625,138.875,136.1875,136.5625,42872800,11.520934\n1997-09-02,133.125,137.50,133.00,137.1875,50112800,11.573661\n1997-08-29,132.0625,133.875,131.75,132.1875,37857600,11.151842\n1997-08-28,133.50,133.75,132.00,132.0625,43641600,11.141297\n1997-08-27,135.25,135.3125,133.00,134.5625,49371200,11.352206\n1997-08-26,136.00,136.875,134.75,135.00,34327200,11.389115\n1997-08-25,137.875,139.00,135.625,136.50,38856800,11.515661\n1997-08-22,135.25,137.50,134.125,137.25,72161600,11.578934\n1997-08-21,141.625,142.375,137.50,137.875,64412000,11.631661\n1997-08-20,139.00,140.6875,137.00,140.5625,51433600,11.858389\n1997-08-19,134.75,139.00,134.625,138.8125,91013600,11.710753\n1997-08-18,133.00,133.875,131.00,133.875,69969600,11.294206\n1997-08-15,135.50,136.00,132.75,132.875,51078400,11.209842\n1997-08-14,136.00,136.75,134.125,136.25,45900800,11.49457\n1997-08-13,138.125,138.25,134.75,136.0625,66731200,11.478752\n1997-08-12,139.375,139.75,135.8125,136.00,60887200,11.473479\n1997-08-11,140.00,140.25,136.375,138.25,72696000,11.663298\n1997-08-08,142.8125,143.125,140.00,140.00,66815200,11.810935\n1997-08-07,144.3125,144.375,142.00,143.9375,43947200,12.143117\n1997-08-06,143.3125,144.625,142.25,143.4375,43410400,12.100935\n1997-08-05,142.25,144.375,142.00,143.3125,59333600,12.09039\n1997-08-04,140.25,142.00,139.4375,141.5625,46312800,11.942753\n1997-08-01,141.375,141.8125,139.1875,140.625,58912800,11.863662\n1997-07-31,142.00,142.125,140.875,141.375,42240800,11.926935\n1997-07-30,140.75,142.00,139.625,141.125,78324000,11.905844\n1997-07-29,136.75,140.0625,136.125,139.9375,79061600,11.805662\n1997-07-28,139.25,139.375,135.75,137.00,56404000,11.557843\n1997-07-25,138.50,142.25,137.25,138.50,90308800,11.684389\n1997-07-24,138.375,140.375,135.625,138.00,141855200,11.642207\n1997-07-23,145.25,146.875,141.00,141.4375,95556000,11.932208\n1997-07-22,136.875,144.8125,136.75,144.125,101384000,12.158935\n1997-07-21,140.875,141.00,133.75,135.9375,127223200,11.468207\n1997-07-18,145.00,147.375,140.00,140.50,158927200,11.853116\n1997-07-17,150.50,150.75,146.50,149.50,131668000,12.612391\n1997-07-16,142.375,149.50,140.00,148.4375,111217600,12.522754\n1997-07-15,138.0625,139.25,136.625,138.468704,75503200,11.681749\n1997-07-14,130.8125,136.00,130.50,135.9375,57424000,11.468207\n1997-07-11,130.25,131.0625,128.4375,129.75,38094400,10.946205\n1997-07-10,130.50,131.25,128.875,129.875,43780800,10.956751\n1997-07-09,132.50,132.625,129.50,130.75,48266400,11.030569\n1997-07-08,129.375,131.3125,128.9375,131.25,36007200,11.072751\n1997-07-07,130.625,131.75,129.375,129.50,39320000,10.925114\n1997-07-03,130.0625,130.0625,128.50,129.5625,28764000,10.930387\n1997-07-02,125.625,128.50,124.0625,128.375,53237600,10.830205\n1997-07-01,126.4375,126.875,123.25,124.9375,59377600,10.540205\n1997-06-30,127.875,128.75,126.1875,126.375,38286400,10.661478\n1997-06-27,129.125,130.00,127.25,127.50,38198400,10.756387\n1997-06-26,130.125,130.8125,127.875,128.25,37312000,10.81966\n1997-06-25,132.875,133.25,129.8125,130.4375,49576000,11.004206\n1997-06-24,129.50,132.125,128.375,132.0625,39319200,11.141297\n1997-06-23,129.875,131.50,128.00,128.0625,35724800,10.803841\n1997-06-20,129.375,131.375,128.50,129.875,64240000,10.956751\n1997-06-19,128.375,130.75,128.00,129.3125,65519200,10.909296\n1997-06-18,133.25,133.50,130.0625,130.1875,55657600,10.983115\n1997-06-17,131.50,134.9375,130.875,134.1875,53191200,11.32057\n1997-06-16,129.625,131.375,128.875,131.375,40612800,11.083297\n1997-06-13,126.75,130.0625,126.5625,129.625,50116000,10.93566\n1997-06-12,126.75,128.125,125.375,127.00,44614400,10.714205\n1997-06-11,124.8125,127.375,123.5625,127.00,49056800,10.714205\n1997-06-10,125.125,127.0625,123.75,124.8125,53135200,10.529659\n1997-06-09,124.875,126.125,122.50,125.125,48200000,10.556023\n1997-06-06,121.375,124.3125,121.00,124.0625,35964000,10.466386\n1997-06-05,120.265602,121.50,119.50,120.5625,35892000,10.171113\n1997-06-04,120.625,122.25,118.25,119.1875,54639200,10.055113\n1997-06-03,123.375,123.50,120.625,120.75,41995200,10.186931\n1997-06-02,125.00,125.50,123.125,124.375,38939200,10.49275\n1997-05-30,117.50,125.625,117.50,124.00,83337600,10.461113\n1997-05-29,127.25,129.0625,125.00,125.875,51111200,10.619296\n1997-05-28,127.25,127.25,124.875,125.875,52241600,10.619296\n1997-05-27,122.75,127.375,122.375,126.625,69036000,10.682568\n1997-05-23,121.375,123.00,120.875,122.875,28904800,10.366204\n1997-05-22,121.00,121.625,119.75,120.625,33655200,10.176386\n1997-05-21,120.625,122.9375,119.75,120.375,76620000,10.155295\n1997-05-20,115.875,119.25,115.25,119.125,64876800,10.04984\n1997-05-19,116.125,117.125,115.125,115.125,45632000,9.712385\n1997-05-16,116.375,117.00,114.875,115.4375,59913600,9.738748\n1997-05-15,116.00,117.875,115.875,117.125,41861600,9.881112\n1997-05-14,118.375,118.625,115.625,115.875,60744800,9.775657\n1997-05-13,118.375,119.25,116.875,117.75,49813600,9.93384\n1997-05-12,117.50,118.50,117.00,118.125,42976000,9.965476\n1997-05-09,118.00,118.50,115.75,116.75,58392000,9.849476\n1997-05-08,115.25,118.125,115.125,116.375,53834400,9.817839\n1997-05-07,116.375,119.00,115.125,115.50,70532800,9.744021\n1997-05-06,119.375,119.75,116.375,117.3125,74770400,9.89693\n1997-05-05,119.625,120.75,115.50,120.1875,111063200,10.139476\n1997-05-02,122.00,123.50,118.9375,120.75,96192000,10.186931\n1997-05-01,122.00,123.25,119.25,121.00,72325600,10.208022\n1997-04-30,118.625,122.625,118.375,121.50,90204000,10.250204\n1997-04-29,117.375,119.125,116.50,119.00,73953600,10.039294\n1997-04-28,113.75,115.0625,111.625,114.875,67224000,9.691294\n1997-04-25,113.50,115.375,113.25,113.625,58566400,9.585839\n1997-04-24,116.625,117.875,112.75,114.125,118163200,9.628021\n1997-04-23,110.625,115.75,110.375,115.125,102814400,9.712385\n1997-04-22,107.625,110.8125,107.50,110.625,82300000,9.332747\n1997-04-21,107.00,111.875,106.125,107.625,155695200,9.079656\n1997-04-18,104.00,107.625,103.00,107.625,231764000,9.079656\n1997-04-17,98.50,100.00,97.50,98.125,71720800,8.2782\n1997-04-16,96.625,98.50,96.25,98.25,42710400,8.288745\n1997-04-15,97.875,99.00,95.875,97.125,84440000,8.193836\n1997-04-14,94.75,97.375,93.375,97.375,59107200,8.214927\n1997-04-11,95.50,97.25,94.9375,95.00,60033600,8.014563\n1997-04-10,97.75,97.75,95.50,96.75,67913600,8.162199\n1997-04-09,99.125,99.25,97.75,98.00,73762400,8.267654\n1997-04-08,96.625,98.25,95.50,98.25,53339200,8.288745\n1997-04-07,95.625,97.625,95.00,95.875,76511200,8.088381\n1997-04-04,93.75,96.75,93.75,94.1875,94964000,7.946017\n1997-04-03,91.00,95.375,90.625,95.125,92252800,8.025108\n1997-04-02,92.875,93.625,91.00,92.00,63331200,7.761471\n1997-04-01,90.125,93.75,89.75,93.25,86680800,7.866926\n1997-03-31,93.125,94.50,91.25,91.6875,93825600,7.735108\n1997-03-27,95.125,96.125,91.00,93.75,93919200,7.909108\n1997-03-26,90.75,94.625,90.625,94.25,81270400,7.95129\n1997-03-25,90.625,91.375,88.875,90.3125,89701600,7.619107\n1997-03-24,93.125,93.50,87.625,90.125,186269600,7.603289\n1997-03-21,96.50,97.125,92.875,94.00,85829600,7.930199\n1997-03-20,96.625,97.75,95.375,96.00,81410400,8.098927\n1997-03-19,97.75,98.25,94.9375,96.75,111560000,8.162199\n1997-03-18,100.625,100.8125,98.875,99.625,59012000,8.404745\n1997-03-17,98.50,100.75,98.00,100.50,83958400,8.478564\n1997-03-14,99.75,100.25,98.875,99.00,61327200,8.352018\n1997-03-13,98.25,100.125,98.00,99.625,45505600,8.404745\n1997-03-12,97.75,99.50,97.75,98.75,43234400,8.330927\n1997-03-11,99.625,100.5625,98.375,98.375,47577600,8.299291\n1997-03-10,97.125,100.125,95.9375,100.00,45997600,8.436382\n1997-03-07,98.375,99.50,96.50,96.75,46032000,8.162199\n1997-03-06,100.75,100.875,97.734299,97.75,57018400,8.246563\n1997-03-05,99.50,101.00,99.25,100.875,46393600,8.5102\n1997-03-04,99.25,100.125,98.625,99.125,63920800,8.362563\n1997-03-03,97.00,100.125,96.625,99.50,53874400,8.3942\n1997-02-28,96.125,98.375,95.4375,97.50,78412000,8.225472\n1997-02-27,100.25,100.25,96.00,96.125,56628800,8.109472\n1997-02-26,99.50,100.375,98.375,100.25,48849600,8.457473\n1997-02-25,100.00,101.015602,98.875,99.50,63941600,8.3942\n1997-02-24,94.25,100.25,94.00,100.125,68599200,8.446927\n1997-02-21,94.875,95.375,94.00,95.00,61131200,8.014563\n1997-02-20,96.875,97.50,95.125,95.25,75395200,8.035654\n1997-02-19,97.375,98.125,96.50,97.50,56383200,8.225472\n1997-02-18,97.625,97.875,96.25,97.375,52545600,8.214927\n1997-02-14,99.375,100.50,97.625,97.875,57395200,8.257109\n1997-02-13,100.50,101.125,99.375,100.00,58292000,8.436382\n1997-02-12,98.375,100.00,97.50,99.875,72001600,8.425836\n1997-02-11,98.25,98.625,95.125,98.50,88834400,8.309836\n1997-02-10,100.75,101.50,97.625,97.75,66804800,8.246563\n1997-02-07,98.375,100.50,97.50,100.375,62448000,8.468018\n1997-02-06,98.25,98.375,96.00,97.125,102122400,8.193836\n1997-02-05,103.125,103.50,96.875,98.375,110099200,8.299291\n1997-02-04,102.375,103.25,100.50,103.125,56464000,8.700019\n1997-02-03,102.625,103.390602,101.125,102.375,60804800,8.636746\n1997-01-31,101.875,103.25,100.875,102.00,86516000,8.605109\n1997-01-30,98.25,101.25,98.00,101.125,79937600,8.531291\n1997-01-29,96.75,97.375,95.75,97.25,48933600,8.204381\n1997-01-28,98.375,98.75,94.75,95.625,64656800,8.06729\n1997-01-27,96.50,97.390602,95.50,96.125,53263200,8.109472\n1997-01-24,95.125,97.75,94.375,95.9375,89817600,8.093654\n1997-01-23,98.125,99.75,94.50,94.75,105048000,7.993472\n1997-01-22,95.125,98.50,94.625,97.375,129236800,8.214927\n1997-01-21,90.625,95.0625,89.625,95.00,114592000,8.014563\n1997-01-20,87.00,92.875,86.625,90.75,146220800,7.656016\n1997-01-17,85.625,87.75,85.50,87.125,65368800,7.350198\n1997-01-16,85.00,87.125,85.00,86.00,58688000,7.255288\n1997-01-15,85.625,86.25,84.375,84.625,53058400,7.139288\n1997-01-14,84.25,86.625,84.25,85.375,63728000,7.202561\n1997-01-13,85.125,85.50,83.50,83.75,50361600,7.06547\n1997-01-10,82.00,84.375,81.625,84.25,66556800,7.107652\n1997-01-09,83.75,83.75,82.25,82.375,47763200,6.94947\n1997-01-08,85.00,85.234299,83.125,83.375,50593600,7.033833\n1997-01-07,84.50,85.125,83.375,85.00,36880800,7.170925\n1997-01-06,84.625,85.25,83.125,84.375,55948000,7.118197\n1997-01-03,82.25,84.75,82.00,84.625,44131200,7.139288\n1997-01-02,83.125,83.125,80.75,81.625,54480800,6.886197\n1996-12-31,84.00,84.25,82.50,82.625,34367200,6.97056\n1996-12-30,85.375,85.625,83.50,83.50,27279200,7.044379\n1996-12-27,85.50,85.75,84.015602,84.25,19079200,7.107652\n1996-12-26,85.25,86.125,85.125,85.50,27905600,7.213106\n1996-12-24,84.125,85.125,83.125,84.875,16246400,7.160379\n1996-12-23,84.125,84.75,82.875,83.75,36892800,7.06547\n1996-12-20,85.50,85.625,83.375,83.625,90414400,7.054924\n1996-12-19,84.00,85.125,83.00,84.875,94609600,7.160379\n1996-12-18,81.375,82.75,80.00,82.625,61796800,6.97056\n1996-12-17,76.625,80.125,76.375,79.875,68944800,6.73856\n1996-12-16,80.25,80.75,76.50,76.75,64883200,6.474923\n1996-12-13,81.125,82.00,79.234299,80.00,74532000,6.749105\n1996-12-12,85.00,85.25,81.00,81.00,78272800,6.833469\n1996-12-11,81.00,83.625,80.125,83.375,113558400,7.033833\n1996-12-10,84.375,84.5625,81.75,81.875,125725600,6.907288\n1996-12-09,78.375,81.875,78.00,81.75,94718400,6.896742\n1996-12-06,149.00,154.50,148.265594,152.875,110238400,6.448559\n1996-12-05,153.375,155.375,151.875,153.00,74950400,6.453832\n1996-12-04,155.125,155.25,152.125,153.25,102542400,6.464378\n1996-12-03,158.375,159.50,154.625,154.6875,77563200,6.525014\n1996-12-02,157.50,157.75,155.25,157.75,64502400,6.654196\n1996-11-29,155.50,157.125,155.50,156.875,17152000,6.617287\n1996-11-27,154.125,155.75,153.75,155.50,44446400,6.559287\n1996-11-26,154.00,155.375,152.375,153.75,108238400,6.485469\n1996-11-25,151.125,153.625,150.50,153.50,75129600,6.474923\n1996-11-22,150.75,152.50,149.375,150.50,94424000,6.348377\n1996-11-21,154.50,154.625,150.00,150.375,130718400,6.343105\n1996-11-20,156.00,158.00,153.25,153.25,123857600,6.464378\n1996-11-19,150.50,155.875,150.25,155.875,104739200,6.575105\n1996-11-18,149.375,151.75,148.625,150.375,98585600,6.343105\n1996-11-15,150.75,150.875,147.375,149.00,104041600,6.285104\n1996-11-14,145.25,149.625,145.25,149.625,114969600,6.311468\n1996-11-13,143.625,145.75,143.125,145.00,90409600,6.116377\n1996-11-12,144.00,145.875,141.50,141.75,81156800,5.979286\n1996-11-11,143.375,144.75,143.00,143.625,38593600,6.058377\n1996-11-08,143.375,143.50,141.50,143.50,67369600,6.053104\n1996-11-07,144.75,146.125,143.125,143.50,76742400,6.053104\n1996-11-06,141.375,144.50,141.00,144.50,71438400,6.095286\n1996-11-05,138.50,141.50,138.3125,141.50,86417600,5.96874\n1996-11-04,137.25,138.375,136.75,138.00,36006400,5.821103\n1996-11-01,137.25,138.75,136.50,137.375,56531200,5.79474\n1996-10-31,136.375,137.375,136.125,137.25,37028800,5.789467\n1996-10-30,135.375,137.00,134.875,136.25,60526400,5.747285\n1996-10-29,136.875,137.375,134.875,135.375,66756800,5.710376\n1996-10-28,136.6875,137.625,136.25,136.625,51240000,5.763103\n1996-10-25,136.625,137.875,136.125,136.4375,53084800,5.755194\n1996-10-24,134.875,137.375,133.875,136.625,81417600,5.763103\n1996-10-23,132.625,134.75,131.75,134.50,67443200,5.673467\n1996-10-22,133.125,133.375,131.25,132.50,113806400,5.589103\n1996-10-21,134.75,136.00,133.50,134.00,71401600,5.652376\n1996-10-18,134.00,135.00,133.5625,134.75,69646400,5.684012\n1996-10-17,138.25,139.00,135.50,135.50,49097600,5.715649\n1996-10-16,138.75,138.9375,137.00,138.00,36427200,5.821103\n1996-10-15,138.75,139.125,137.375,138.875,61206400,5.858013\n1996-10-14,137.375,138.125,136.375,136.625,36091200,5.763103\n1996-10-11,134.625,137.25,134.25,137.125,36523200,5.784194\n1996-10-10,133.75,136.125,133.375,133.75,51739200,5.64183\n1996-10-09,136.00,136.125,133.25,134.50,64955200,5.673467\n1996-10-08,137.75,137.75,135.00,135.375,48465600,5.710376\n1996-10-07,136.375,138.125,135.875,137.50,42432000,5.800012\n1996-10-04,134.625,136.625,134.25,136.375,45166400,5.752558\n1996-10-03,134.75,135.125,133.625,134.00,58294400,5.652376\n1996-10-02,132.875,135.75,132.375,134.75,68760000,5.684012\n1996-10-01,131.75,133.875,130.875,132.125,69124800,5.573285\n1996-09-30,133.50,134.875,131.75,131.875,89574400,5.562739\n1996-09-27,132.50,135.25,131.25,134.375,98372800,5.668194\n1996-09-26,135.75,136.125,131.75,132.00,92604800,5.568012\n1996-09-25,137.50,137.875,135.375,135.625,44067200,5.720921\n1996-09-24,137.50,138.375,136.125,136.875,72520000,5.773649\n1996-09-23,137.625,138.125,136.25,137.75,46385600,5.810558\n1996-09-20,137.00,138.625,135.875,138.125,104849600,5.826376\n1996-09-19,136.50,138.25,135.75,137.75,75912000,5.810558\n1996-09-18,134.00,137.875,133.25,136.50,86049600,5.757831\n1996-09-17,132.875,134.625,132.25,133.875,75624000,5.647103\n1996-09-16,131.125,133.125,131.00,131.50,62409600,5.546921\n1996-09-13,129.625,131.375,128.875,131.00,80137600,5.52583\n1996-09-12,125.50,129.50,125.1875,128.625,95944000,5.425648\n1996-09-11,123.9375,125.50,123.625,125.125,36387200,5.278011\n1996-09-10,124.75,125.125,123.625,124.375,38904000,5.246375\n1996-09-09,122.50,125.00,122.25,124.875,41747200,5.267466\n1996-09-06,122.00,122.75,121.625,122.50,41921600,5.167284\n1996-09-05,122.75,122.75,121.50,121.50,40372800,5.125102\n1996-09-04,123.375,123.625,122.9375,123.375,27126400,5.204193\n1996-09-03,122.00,123.375,120.625,123.375,48524800,5.204193\n1996-08-30,124.25,124.25,122.50,122.50,28088000,5.167284\n1996-08-29,125.25,125.25,123.625,124.125,34182400,5.235829\n1996-08-28,125.00,125.75,124.875,125.625,32070400,5.299102\n1996-08-27,123.125,124.75,123.00,124.75,28038400,5.262193\n1996-08-26,123.375,123.75,122.75,122.875,31944000,5.183102\n1996-08-23,124.875,125.00,123.25,123.25,44006400,5.19892\n1996-08-22,124.125,125.125,123.50,125.00,50236800,5.272739\n1996-08-21,122.50,123.50,121.75,123.50,49345600,5.209466\n1996-08-20,123.75,124.125,123.25,123.375,25678400,5.204193\n1996-08-19,123.875,124.125,122.25,123.50,43131200,5.209466\n1996-08-16,125.125,125.25,123.75,124.25,47598400,5.241102\n1996-08-15,124.75,125.75,124.375,125.125,35556800,5.278011\n1996-08-14,123.875,125.125,123.75,124.875,52032000,5.267466\n1996-08-13,125.00,125.875,123.375,123.50,72508800,5.209466\n1996-08-12,124.25,126.125,124.00,125.25,66187200,5.283284\n1996-08-09,124.75,125.50,123.875,124.50,44313600,5.251648\n1996-08-08,124.125,125.875,123.75,125.25,54379200,5.283284\n1996-08-07,124.375,125.125,122.875,124.75,76790400,5.262193\n1996-08-06,121.625,124.125,120.875,124.00,67388800,5.230557\n1996-08-05,123.50,123.75,121.25,121.75,55072000,5.135647\n1996-08-02,122.125,123.875,120.625,123.375,109289600,5.204193\n1996-08-01,117.875,120.875,117.375,120.625,96025600,5.088193\n1996-07-31,119.00,119.625,117.625,117.875,56320000,4.972193\n1996-07-30,117.875,118.75,116.125,118.625,66976000,5.003829\n1996-07-29,119.25,119.875,116.75,116.875,56748800,4.930011\n1996-07-26,119.50,119.50,118.25,119.125,59304000,5.02492\n1996-07-25,116.00,118.75,115.125,118.50,100920000,4.998556\n1996-07-24,109.50,115.75,109.50,114.75,192225600,4.840374\n1996-07-23,120.00,120.00,110.25,112.125,257678400,4.729647\n1996-07-22,121.015602,121.50,117.875,119.75,144475200,5.051284\n1996-07-19,117.75,121.625,117.75,120.984299,99208000,5.103349\n1996-07-18,117.25,120.00,115.875,119.875,98537600,5.056556\n1996-07-17,117.75,118.125,115.625,117.125,126208000,4.940556\n1996-07-16,110.25,115.625,107.50,115.375,182100800,4.866738\n1996-07-15,112.375,113.75,109.875,110.625,111832000,4.666374\n1996-07-12,115.1875,115.1875,110.484299,112.375,139478400,4.740192\n1996-07-11,118.25,118.375,113.75,114.50,140915200,4.829829\n1996-07-10,120.00,120.00,118.125,119.50,77980800,5.040738\n1996-07-09,120.875,121.375,120.00,120.00,35571200,5.061829\n1996-07-08,118.50,120.75,118.125,120.3125,64432000,5.075011\n1996-07-05,120.125,120.125,118.375,118.375,35331200,4.993283\n1996-07-03,121.625,122.875,120.625,121.125,44243200,5.109284\n1996-07-02,122.375,122.625,121.25,121.625,38548800,5.130375\n1996-07-01,120.25,122.50,120.125,122.3125,47862400,5.159375\n1996-06-28,120.50,121.00,119.125,120.125,52000000,5.067102\n1996-06-27,120.50,121.00,119.00,119.9375,77582400,5.059193\n1996-06-26,121.875,122.00,119.00,120.50,71457600,5.08292\n1996-06-25,124.25,124.25,121.375,122.00,41145600,5.146193\n1996-06-24,124.00,125.125,123.00,124.125,48102400,5.235829\n1996-06-21,122.375,124.125,121.50,123.875,56806400,5.225284\n1996-06-20,122.00,122.484299,119.00,121.75,102228800,5.135647\n1996-06-19,122.50,123.125,121.375,121.75,73409600,5.135647\n1996-06-18,124.50,124.50,122.00,122.375,74585600,5.162011\n1996-06-17,123.125,125.00,122.375,124.625,57499200,5.25692\n1996-06-14,124.75,125.00,122.875,123.00,55944000,5.188375\n1996-06-13,125.125,125.875,123.75,124.625,62577600,5.25692\n1996-06-12,122.875,125.375,122.75,125.00,88844800,5.272739\n1996-06-11,120.75,123.25,120.625,122.125,65259200,5.151466\n1996-06-10,121.00,121.25,119.984299,120.625,45819200,5.088193\n1996-06-07,117.625,121.25,117.625,121.25,70198400,5.114556\n1996-06-06,121.75,123.00,119.75,119.8125,88136000,5.05392\n1996-06-05,118.00,121.25,117.875,120.875,50968000,5.098738\n1996-06-04,118.625,118.875,116.25,117.875,65852800,4.972193\n1996-06-03,118.75,119.50,118.125,118.375,31684800,4.993283\n1996-05-31,118.5625,119.375,118.00,118.75,40259200,5.009102\n1996-05-30,117.25,118.25,116.625,118.25,33824000,4.988011\n1996-05-29,117.375,118.25,116.625,117.125,33569600,4.940556\n1996-05-28,118.75,119.140602,117.125,117.25,43376000,4.945829\n1996-05-24,118.50,119.00,118.25,118.50,26443200,4.998556\n1996-05-23,116.875,119.125,116.875,118.50,51976000,4.998556\n1996-05-22,115.00,117.25,114.625,116.875,45646400,4.930011\n1996-05-21,116.75,116.875,115.125,115.125,42113600,4.856192\n1996-05-20,117.375,117.875,116.625,116.75,38457600,4.924738\n1996-05-17,117.875,118.00,116.375,117.00,35392000,4.935283\n1996-05-16,116.00,117.375,115.625,117.125,67092800,4.940556\n1996-05-15,119.00,119.75,117.375,117.625,56323200,4.961647\n1996-05-14,119.25,120.00,118.234299,119.00,76832000,5.019647\n1996-05-13,115.00,118.875,115.00,118.625,95606400,5.003829\n1996-05-10,114.375,115.140602,114.125,114.875,43913600,4.845647\n1996-05-09,114.25,115.125,113.25,113.50,47776000,4.787647\n1996-05-08,112.875,114.375,110.75,114.25,77851200,4.819283\n1996-05-07,111.625,113.50,111.625,113.125,47366400,4.771828\n1996-05-06,111.00,112.375,109.625,111.75,75852800,4.713828\n1996-05-03,112.50,114.50,110.125,110.875,75300800,4.676919\n1996-05-02,115.125,115.25,111.125,111.625,87340800,4.708556\n1996-05-01,112.875,115.25,112.625,115.125,65014400,4.856192\n1996-04-30,112.625,113.25,111.875,113.25,28441600,4.777101\n1996-04-29,113.375,113.50,112.00,112.625,34267200,4.750738\n1996-04-26,112.75,113.875,112.375,113.50,54296000,4.787647\n1996-04-25,111.50,113.75,110.25,112.75,63896000,4.75601\n1996-04-24,113.00,113.125,111.25,111.50,69251200,4.703283\n1996-04-23,112.75,113.25,111.375,112.625,57139200,4.750738\n1996-04-22,110.50,113.375,110.25,112.75,92758400,4.75601\n1996-04-19,111.625,112.125,109.50,109.75,169492800,4.629465\n1996-04-18,106.00,109.25,105.50,109.00,133958400,4.597828\n1996-04-17,105.25,106.00,104.3125,105.9375,62630400,4.468646\n1996-04-16,104.25,105.50,104.00,105.25,80116800,4.439646\n1996-04-15,101.00,103.625,101.00,103.515602,50102400,4.366486\n1996-04-12,101.125,101.625,100.50,101.125,33737600,4.265646\n1996-04-11,101.50,102.375,99.625,101.125,62465600,4.265646\n1996-04-10,101.50,103.00,101.25,101.625,51910400,4.286737\n1996-04-09,104.00,104.00,101.50,101.625,66942400,4.286737\n1996-04-08,102.50,103.875,101.875,103.75,73753600,4.376373\n1996-04-04,104.625,104.875,103.50,104.375,28961600,4.402737\n1996-04-03,104.125,105.125,103.375,104.50,46072000,4.408009\n1996-04-02,102.75,105.00,102.625,104.625,54396800,4.413282\n1996-04-01,103.140602,103.50,102.125,102.75,31692800,4.334191\n1996-03-29,102.375,104.125,102.125,103.125,53508800,4.350009\n1996-03-28,101.875,103.50,101.125,102.25,54955200,4.3131\n1996-03-27,103.25,104.00,101.125,102.50,52729600,4.323646\n1996-03-26,99.375,102.875,98.75,102.75,79899200,4.334191\n1996-03-25,101.50,102.375,98.8125,99.875,63379200,4.212918\n1996-03-22,101.125,101.4375,99.75,101.125,48046400,4.265646\n1996-03-21,104.25,104.375,100.50,100.75,66313600,4.249827\n1996-03-20,106.25,106.625,103.734299,104.625,92944000,4.413282\n1996-03-19,106.375,107.0625,104.75,106.875,92491200,4.508192\n1996-03-18,102.375,105.875,102.375,105.25,119472000,4.439646\n1996-03-15,100.00,103.125,99.625,102.375,121721600,4.318373\n1996-03-14,101.125,101.875,99.625,99.625,60640000,4.202373\n1996-03-13,98.234299,101.00,97.75,100.875,156710400,4.2551\n1996-03-12,96.25,96.625,94.75,95.75,76888000,4.038918\n1996-03-11,95.125,96.625,95.125,96.50,74592000,4.070554\n1996-03-08,95.50,97.50,94.75,95.125,108524800,4.012554\n1996-03-07,97.125,97.625,96.625,97.3125,44291200,4.104827\n1996-03-06,98.25,98.875,97.00,97.00,44256000,4.091645\n1996-03-05,96.00,98.265602,95.75,98.125,57369600,4.1391\n1996-03-04,96.00,97.375,95.50,96.25,72564800,4.060009\n1996-03-01,98.375,98.625,94.625,95.50,157652800,4.028372\n1996-02-29,99.00,100.125,98.5625,98.6875,61723200,4.162827\n1996-02-28,100.75,102.00,99.875,100.125,60051200,4.223464\n1996-02-27,100.75,100.8125,99.734299,100.125,60958400,4.223464\n1996-02-26,103.00,103.25,100.50,100.625,63696000,4.244555\n1996-02-23,102.625,103.625,101.875,103.50,102640000,4.365828\n1996-02-22,100.00,102.625,100.00,102.50,106500800,4.323646\n1996-02-21,97.75,100.125,97.50,99.875,80046400,4.212918\n1996-02-20,97.25,98.50,96.875,97.75,64182400,4.123282\n1996-02-16,98.75,99.25,97.875,97.875,62206400,4.128554\n1996-02-15,98.50,99.125,97.75,98.50,52195200,4.154918\n1996-02-14,100.125,100.125,98.375,98.75,80212800,4.165464\n1996-02-13,97.75,100.25,97.50,99.625,114513600,4.202373\n1996-02-12,99.75,101.125,99.125,99.50,87779200,4.1971\n1996-02-09,98.75,100.25,98.50,100.125,122832000,4.223464\n1996-02-08,96.625,99.50,95.50,98.875,103924800,4.170736\n1996-02-07,96.00,97.125,95.484299,96.875,65555200,4.086372\n1996-02-06,96.50,97.50,95.625,96.50,98158400,4.070554\n1996-02-05,92.75,97.25,92.75,97.125,126480000,4.096918\n1996-02-02,94.00,94.125,92.125,93.00,44686400,3.922918\n1996-02-01,92.25,94.25,92.00,94.125,78587200,3.970372\n1996-01-31,90.75,92.625,90.125,92.50,68774400,3.901827\n1996-01-30,90.875,91.375,90.625,90.8125,45120000,3.830645\n1996-01-29,90.75,91.25,89.359299,90.375,39587200,3.81219\n1996-01-26,89.125,90.875,89.00,90.50,50881600,3.817463\n1996-01-25,91.375,91.625,89.00,89.375,59881600,3.770008\n1996-01-24,89.875,92.50,89.50,91.25,92217600,3.849099\n1996-01-23,91.375,91.75,89.25,89.50,66473600,3.775281\n1996-01-22,91.625,92.75,90.875,92.00,82643200,3.880736\n1996-01-19,90.25,93.25,89.625,91.875,227440000,3.875463\n1996-01-18,85.50,88.875,85.00,87.625,121331200,3.69619\n1996-01-17,84.75,87.50,84.625,84.875,143078400,3.58019\n1996-01-16,83.625,86.484299,83.25,86.375,122006400,3.643462\n1996-01-15,85.875,85.875,81.875,82.50,84572800,3.480007\n1996-01-12,86.50,86.875,83.875,85.75,80544000,3.617099\n1996-01-11,83.50,86.875,83.125,86.625,116617600,3.654008\n1996-01-10,80.50,83.25,80.484299,82.375,181571200,3.474735\n1996-01-09,86.00,86.00,79.875,80.1875,177424000,3.382462\n1996-01-08,86.50,87.625,86.125,86.25,11377600,3.63819\n1996-01-05,86.25,87.625,86.125,86.375,62083200,3.643462\n1996-01-04,87.25,87.50,84.875,87.375,102353600,3.685644\n1996-01-03,89.125,90.125,86.75,86.875,62857600,3.664553\n1996-01-02,87.875,89.75,87.375,89.75,57779200,3.785826\n1995-12-29,87.25,88.75,86.25,87.75,52342400,3.701463\n1995-12-28,88.25,88.50,87.25,87.375,49777600,3.685644\n1995-12-27,90.375,90.625,88.375,88.875,40539200,3.748917\n1995-12-26,90.25,91.25,89.875,90.25,34707200,3.806917\n1995-12-22,90.125,90.875,89.125,90.50,36057600,3.817463\n1995-12-21,87.75,90.00,87.375,90.00,60593600,3.796372\n1995-12-20,91.125,91.375,87.00,87.125,84980800,3.675099\n1995-12-19,87.375,91.015602,87.375,90.875,84340800,3.833281\n1995-12-18,88.375,89.00,85.375,87.00,99460800,3.669826\n1995-12-15,89.125,89.75,87.25,88.375,115470400,3.727826\n1995-12-14,92.25,93.50,88.625,88.75,92822400,3.743644\n1995-12-13,91.125,92.125,90.50,91.75,39577600,3.87019\n1995-12-12,93.00,93.125,91.125,91.375,44739200,3.854372\n1995-12-11,94.50,94.75,93.00,93.125,61924800,3.92819\n1995-12-08,92.625,94.625,92.234299,94.50,147041600,3.98619\n1995-12-07,91.125,92.00,88.859299,90.50,132876800,3.817463\n1995-12-06,86.125,91.00,86.00,90.625,145272000,3.822736\n1995-12-05,87.875,88.125,85.125,86.00,104528000,3.627644\n1995-12-04,86.125,89.625,85.25,87.875,130436800,3.706735\n1995-12-01,87.125,87.875,85.875,86.25,96124800,3.63819\n1995-11-30,89.50,89.75,86.875,87.125,93512000,3.675099\n1995-11-29,91.875,92.50,89.25,89.75,91067200,3.785826\n1995-11-28,87.00,91.50,86.50,91.50,86537600,3.859645\n1995-11-27,88.625,89.50,87.140602,87.25,79100800,3.680372\n1995-11-24,87.625,88.25,87.375,88.00,15014400,3.712008\n1995-11-22,88.375,89.50,87.25,87.375,65428800,3.685644\n1995-11-21,85.875,88.75,84.25,88.00,130163200,3.712008\n1995-11-20,88.375,89.375,85.75,86.00,115296000,3.627644\n1995-11-17,90.00,90.625,87.375,87.375,143803200,3.685644\n1995-11-16,90.50,91.843697,89.625,89.875,195126400,3.791099\n1995-11-15,94.375,94.625,91.875,94.00,108686400,3.965099\n1995-11-14,95.875,96.00,93.875,94.00,75657600,3.965099\n1995-11-13,96.625,97.25,96.0625,96.3125,59003200,4.062645\n1995-11-10,98.50,99.00,96.609299,96.875,60819200,4.086372\n1995-11-09,96.50,99.015602,96.00,99.00,99814400,4.176009\n1995-11-08,93.875,95.50,93.375,95.25,71280000,4.017827\n1995-11-07,96.50,97.375,92.875,93.00,115921600,3.922918\n1995-11-06,97.00,98.875,96.875,97.375,87729600,4.107463\n1995-11-03,100.00,100.125,98.75,99.50,40635200,4.1971\n1995-11-02,98.625,100.375,98.25,100.00,63504000,4.218191\n1995-11-01,100.125,101.00,98.25,98.375,72819200,4.149645\n1995-10-31,103.00,103.375,99.75,100.00,91958400,4.218191\n1995-10-30,99.25,103.375,98.50,102.75,125464000,4.334191\n1995-10-27,97.50,100.140602,97.375,100.00,130683200,4.218191\n1995-10-26,95.75,98.125,95.375,98.00,82841600,4.133827\n1995-10-25,97.625,97.75,95.875,95.875,60211200,4.044191\n1995-10-24,96.375,98.125,96.375,97.50,68681600,4.112736\n1995-10-23,95.00,97.125,94.50,96.375,93473600,4.065281\n1995-10-20,96.50,96.875,94.875,95.50,79984000,4.028372\n1995-10-19,95.25,97.00,94.75,96.75,95840000,4.0811\n1995-10-18,98.25,98.625,94.875,95.625,294329600,4.033645\n1995-10-17,87.25,91.50,86.75,91.125,123140800,3.843826\n1995-10-16,85.75,87.375,85.50,86.75,61067200,3.659281\n1995-10-13,88.50,88.75,86.00,86.25,68644800,3.63819\n1995-10-12,87.00,88.125,86.625,87.625,78700800,3.69619\n1995-10-11,85.875,87.375,85.00,86.625,107009600,3.654008\n1995-10-10,81.25,84.125,80.375,83.75,157644800,3.532735\n1995-10-09,84.875,85.75,82.75,83.125,108614400,3.506371\n1995-10-06,87.50,89.00,85.50,85.875,76616000,3.622371\n1995-10-05,86.00,87.50,85.00,87.50,101289600,3.690917\n1995-10-04,88.125,88.125,85.50,86.125,73473600,3.632917\n1995-10-03,88.125,89.25,87.25,88.875,80736000,3.748917\n1995-10-02,90.50,90.875,88.125,88.25,67731200,3.722553\n1995-09-29,91.625,92.75,90.0625,90.50,95158400,3.817463\n1995-09-28,89.00,91.50,88.875,91.50,105510400,3.859645\n1995-09-27,88.00,88.75,83.375,88.625,140756800,3.738372\n1995-09-26,90.375,91.875,88.125,88.25,76548800,3.722553\n1995-09-25,90.50,90.625,88.50,90.234299,57878400,3.806255\n1995-09-22,89.875,90.75,89.00,89.75,99899200,3.785826\n1995-09-21,91.25,93.0625,90.50,90.625,83836800,3.822736\n1995-09-20,93.50,94.625,92.625,93.125,44652800,3.92819\n1995-09-19,92.00,94.50,91.50,93.3125,58011200,3.936099\n1995-09-18,93.25,93.375,90.875,92.00,76827200,3.880736\n1995-09-15,94.75,95.375,92.50,93.4375,88316800,3.941372\n1995-09-14,96.125,96.50,94.75,94.875,54230400,4.002009\n1995-09-13,96.125,97.00,95.125,96.125,61208000,4.054736\n1995-09-12,97.75,97.75,95.625,96.25,71155200,4.060009\n1995-09-11,95.375,97.875,95.00,97.625,77408000,4.118009\n1995-09-08,93.75,95.625,93.25,95.50,64417600,4.028372\n1995-09-07,94.25,96.625,93.25,94.625,93932800,3.991463\n1995-09-06,95.25,96.50,93.00,93.50,100265600,3.944008\n1995-09-05,90.875,95.125,90.25,95.00,92052800,4.007281\n1995-09-01,91.75,92.00,89.375,89.75,80262400,3.785826\n1995-08-31,93.375,94.00,91.50,92.50,38764800,3.901827\n1995-08-30,92.875,93.75,91.50,93.25,79499200,3.933463\n1995-08-29,90.125,91.875,87.00,91.875,163929600,3.875463\n1995-08-28,94.375,94.375,89.875,90.0625,112622400,3.799008\n1995-08-25,96.375,96.75,94.375,94.375,73489600,3.980918\n1995-08-24,98.125,98.125,95.50,96.125,95275200,4.054736\n1995-08-23,100.00,100.50,97.50,97.875,111188800,4.128554\n1995-08-22,95.125,99.375,94.375,99.3125,94320000,4.189191\n1995-08-21,97.50,98.25,94.375,94.50,110491200,3.98619\n1995-08-18,99.6875,99.75,97.00,97.125,77502400,4.096918\n1995-08-17,98.875,100.75,98.640602,99.125,74564800,4.181282\n1995-08-16,98.375,98.875,97.125,98.75,38118400,4.165464\n1995-08-15,99.25,99.375,96.875,98.375,63267200,4.149645\n1995-08-14,96.875,99.25,95.75,98.75,88872000,4.165464\n1995-08-11,94.75,96.625,92.125,96.50,97195200,4.070554\n1995-08-10,97.00,97.125,93.875,94.125,71883200,3.970372\n1995-08-09,97.75,98.125,96.00,96.50,144384000,4.070554\n1995-08-08,94.125,94.875,93.375,93.50,43913600,3.944008\n1995-08-07,94.50,95.50,91.75,93.625,64273600,3.949281\n1995-08-04,91.375,93.875,91.25,93.875,77705600,3.959827\n1995-08-03,88.00,91.375,87.50,91.125,113536000,3.843826\n1995-08-02,91.00,92.625,88.00,89.00,129804800,3.75419\n1995-08-01,90.75,90.890602,87.875,89.50,166144000,3.775281\n1995-07-31,93.125,93.50,90.00,90.50,101435200,3.817463\n1995-07-28,96.00,96.00,92.00,92.625,158468800,3.907099\n1995-07-27,96.50,97.625,96.25,96.50,52916800,4.070554\n1995-07-26,97.625,98.125,94.875,96.00,77470400,4.049463\n1995-07-25,95.50,97.625,95.00,96.375,109422400,4.065281\n1995-07-24,92.625,93.75,92.125,93.625,94811200,3.949281\n1995-07-21,94.00,96.00,91.75,92.00,169257600,3.880736\n1995-07-20,95.25,97.375,94.00,96.125,177848000,4.054736\n1995-07-19,97.00,98.75,88.50,94.50,305092800,3.98619\n1995-07-18,107.00,107.125,101.25,101.875,289624000,4.297282\n1995-07-17,107.75,109.25,106.50,109.00,155830400,4.597828\n1995-07-14,98.25,103.625,98.00,103.625,89905600,4.3711\n1995-07-13,100.125,101.50,98.125,100.125,84811200,4.223464\n1995-07-12,96.75,100.00,96.75,99.875,94675200,4.212918\n1995-07-11,99.00,99.125,96.50,96.50,78227200,4.070554\n1995-07-10,96.00,99.75,95.75,98.875,111982400,4.170736\n1995-07-07,92.875,95.625,92.75,95.625,66699200,4.033645\n1995-07-06,90.625,93.00,90.375,92.75,47070400,3.912372\n1995-07-05,91.625,92.00,90.375,90.6875,48547200,3.825372\n1995-07-03,90.875,91.125,90.375,90.9375,16763200,3.835917\n1995-06-30,89.625,91.00,89.625,90.375,53342400,3.81219\n1995-06-29,88.00,89.75,88.00,89.375,57643200,3.770008\n1995-06-28,86.75,89.00,84.875,87.875,107286400,3.706735\n1995-06-27,89.50,90.50,86.75,86.875,66004800,3.664553\n1995-06-26,91.00,91.125,89.50,89.75,41048000,3.785826\n1995-06-23,90.75,92.1875,90.25,91.125,46356800,3.843826\n1995-06-22,90.625,92.00,90.625,91.875,46296000,3.875463\n1995-06-21,91.875,92.375,90.00,90.50,57224000,3.817463\n1995-06-20,90.375,91.375,89.75,91.375,56670400,3.854372\n1995-06-19,87.25,89.890602,86.875,89.8125,78982400,3.788463\n1995-06-16,85.00,87.50,84.875,87.00,92278400,3.669826\n1995-06-15,84.00,85.00,83.875,84.875,43912000,3.58019\n1995-06-14,83.375,84.125,82.75,83.8125,43096000,3.535371\n1995-06-13,84.125,84.75,83.375,83.875,37691200,3.538008\n1995-06-12,84.625,84.75,83.25,83.75,45832000,3.532735\n1995-06-09,83.75,85.875,82.625,84.875,81214400,3.58019\n1995-06-08,84.125,84.625,83.625,84.125,29320000,3.548553\n1995-06-07,82.875,84.75,82.125,84.00,64590400,3.54328\n1995-06-06,84.875,86.015602,83.125,83.125,49036800,3.506371\n1995-06-05,82.625,85.375,81.75,84.75,55852800,3.574917\n1995-06-02,83.75,84.125,82.625,83.125,55556800,3.506371\n1995-06-01,85.00,85.625,83.875,84.125,61153600,3.548553\n1995-05-31,83.25,84.75,81.00,84.6875,119756800,3.57228\n1995-05-30,88.00,88.375,82.625,83.00,99612800,3.501098\n1995-05-26,89.1875,89.25,87.00,87.50,52934400,3.690917\n1995-05-25,87.875,89.375,87.125,89.25,43440000,3.764735\n1995-05-24,89.125,89.50,87.00,87.50,68684800,3.690917\n1995-05-23,87.50,88.50,86.031197,88.50,55516800,3.733099\n1995-05-22,85.375,87.50,84.00,87.25,91382400,3.680372\n1995-05-19,84.25,85.50,84.00,85.375,45190400,3.60128\n1995-05-18,85.625,86.75,84.625,84.625,58326400,3.569644\n1995-05-17,85.25,86.875,85.125,86.00,66515200,3.627644\n1995-05-16,81.50,85.015602,81.50,84.875,86708800,3.58019\n1995-05-15,80.625,82.00,79.875,81.3125,35232000,3.429916\n1995-05-12,81.375,82.25,80.375,80.75,36192000,3.406189\n1995-05-11,79.125,81.50,79.00,81.375,38673600,3.432553\n1995-05-10,80.125,80.375,78.875,79.25,38688000,3.342916\n1995-05-09,80.00,80.375,79.125,79.8125,36748800,3.366644\n1995-05-08,79.875,80.375,79.125,79.875,43988800,3.36928\n1995-05-05,81.375,81.625,79.875,80.00,43707200,3.374553\n1995-05-04,81.50,83.25,81.00,81.50,66524800,3.437826\n1995-05-03,80.25,81.00,80.25,80.875,61566400,3.411462\n1995-05-02,82.125,82.25,79.50,79.5625,78099200,3.356098\n1995-05-01,81.875,83.75,81.75,82.125,65550400,3.464189\n1995-04-28,78.875,82.125,78.625,81.75,92104000,3.448371\n1995-04-27,79.625,80.50,76.375,78.625,128844800,3.316553\n1995-04-26,79.75,80.25,79.125,79.625,44305600,3.358735\n1995-04-25,77.625,80.125,77.625,80.00,69371200,3.374553\n1995-04-24,75.375,77.765602,75.125,77.75,68089600,3.279643\n1995-04-21,75.625,75.875,74.875,75.00,53555200,3.163643\n1995-04-20,76.50,76.875,74.00,75.25,83913600,3.174189\n1995-04-19,76.625,77.00,75.50,76.125,59163200,3.211098\n1995-04-18,77.375,77.50,76.00,76.75,75609600,3.237462\n1995-04-17,75.50,78.125,75.50,77.375,187913600,3.263825\n1995-04-13,71.75,72.50,71.125,72.50,32814400,3.058188\n1995-04-12,72.125,73.25,70.75,71.625,40430400,3.021279\n1995-04-11,71.625,72.140602,71.125,72.125,43624000,3.04237\n1995-04-10,69.50,71.25,69.375,70.9375,43169600,2.992279\n1995-04-07,70.25,70.75,69.50,69.625,43148800,2.936915\n1995-04-06,70.625,70.875,69.4375,70.00,35414400,2.952734\n1995-04-05,69.875,70.625,68.75,70.625,65792000,2.979097\n1995-04-04,70.25,71.50,69.75,69.875,66689600,2.947461\n1995-04-03,71.00,71.375,69.50,70.00,65617600,2.952734\n1995-03-31,71.75,72.125,70.50,71.125,63080000,3.000188\n1995-03-30,72.50,72.75,70.375,72.125,75011200,3.04237\n1995-03-29,73.625,74.00,72.0625,72.25,65763200,3.047643\n1995-03-28,72.875,74.00,72.875,73.625,47603200,3.105643\n1995-03-27,72.75,73.875,72.625,73.00,61008000,3.079279\n1995-03-24,73.25,74.125,73.125,73.875,65683200,3.116189\n1995-03-23,71.375,73.25,71.25,72.75,105286400,3.068734\n1995-03-22,70.50,71.00,69.875,70.9375,52464000,2.992279\n1995-03-21,71.25,71.50,70.375,70.4375,74772800,2.971188\n1995-03-20,70.125,71.50,70.00,71.125,37772800,3.000188\n1995-03-17,70.50,71.75,69.875,69.9375,59868800,2.950097\n1995-03-16,70.00,70.50,69.625,70.125,47510400,2.958006\n1995-03-15,71.75,71.875,70.375,70.50,57294400,2.973825\n1995-03-14,69.375,72.00,69.25,71.75,78643200,3.026552\n1995-03-13,68.625,69.6875,68.25,69.00,34550400,2.910552\n1995-03-10,67.875,68.75,66.50,68.5625,44324800,2.892097\n1995-03-09,68.50,68.75,66.875,67.875,58238400,2.863097\n1995-03-08,65.75,68.625,65.75,68.50,140096000,2.889461\n1995-03-07,64.375,66.015602,64.25,65.343697,91750400,2.756322\n1995-03-06,63.25,64.375,62.875,64.3125,45156800,2.712824\n1995-03-03,63.625,63.875,63.125,63.625,31776000,2.683824\n1995-03-02,63.25,63.75,63.125,63.75,26038400,2.689097\n1995-03-01,63.125,64.00,62.75,63.25,52032000,2.668006\n1995-02-28,61.875,63.25,61.75,63.00,52544000,2.65746\n1995-02-27,61.375,62.00,61.125,61.75,28592000,2.604733\n1995-02-24,61.375,61.875,61.25,61.25,34177600,2.583642\n1995-02-23,61.25,62.125,61.00,61.625,59939200,2.59946\n1995-02-22,59.75,62.00,59.625,61.50,60902400,2.594187\n1995-02-21,60.50,60.75,59.50,59.75,55392000,2.520369\n1995-02-17,60.75,60.875,60.25,60.375,37824000,2.546733\n1995-02-16,60.875,61.125,60.25,60.875,56744000,2.567824\n1995-02-15,60.125,61.375,59.625,60.75,147001600,2.562551\n1995-02-14,62.125,62.25,61.50,61.875,31121600,2.610006\n1995-02-13,62.00,62.75,61.625,62.00,38160000,2.615278\n1995-02-10,62.00,62.625,61.50,62.00,49862400,2.615278\n1995-02-09,62.125,62.50,61.75,61.875,42398400,2.610006\n1995-02-08,61.25,62.00,61.00,61.875,49150400,2.610006\n1995-02-07,60.75,61.125,60.625,61.00,33152000,2.573096\n1995-02-06,60.125,61.125,60.125,60.875,48345600,2.567824\n1995-02-03,59.50,60.50,59.25,60.125,60332800,2.536187\n1995-02-02,58.75,59.375,58.375,59.00,46312000,2.488733\n1995-02-01,59.375,60.75,58.984299,59.125,66705600,2.494005\n1995-01-31,59.125,59.75,58.25,59.375,59945600,2.504551\n1995-01-30,60.125,60.125,58.875,59.00,55164800,2.488733\n1995-01-27,60.125,60.25,59.75,59.875,58376000,2.525642\n1995-01-26,60.875,61.00,59.75,59.875,80836800,2.525642\n1995-01-25,61.625,62.25,61.00,61.75,52459200,2.604733\n1995-01-24,63.00,63.125,62.00,62.015598,36739200,2.615936\n1995-01-23,61.00,63.00,60.50,62.8125,53843200,2.649551\n1995-01-20,62.875,63.50,61.25,61.625,82388800,2.59946\n1995-01-19,64.50,65.00,63.4375,63.50,67108800,2.678551\n1995-01-18,64.875,65.25,64.25,65.0625,50504000,2.74446\n1995-01-17,64.75,65.125,64.375,64.625,73932800,2.726006\n1995-01-16,63.25,64.50,63.00,64.125,74648000,2.704915\n1995-01-13,62.00,63.00,61.875,62.75,41307200,2.646915\n1995-01-12,61.25,62.125,61.00,61.25,26996800,2.583642\n1995-01-11,61.125,61.75,60.75,61.375,31512000,2.588915\n1995-01-10,60.625,61.50,60.50,61.00,42184000,2.573096\n1995-01-09,60.875,61.00,59.75,60.25,46000000,2.54146\n1995-01-06,59.875,61.25,59.75,60.625,46681600,2.557278\n1995-01-05,60.875,61.00,59.375,59.625,39824000,2.515096\n1995-01-04,60.25,60.75,59.50,60.625,51611200,2.557278\n1995-01-03,61.50,61.50,60.125,60.1875,39545600,2.538824\n1994-12-30,61.875,61.875,61.125,61.125,20686400,2.578369\n1994-12-29,60.875,61.875,60.625,61.8125,23446400,2.607369\n1994-12-28,60.75,61.00,60.00,61.00,34961600,2.573096\n1994-12-27,61.00,61.625,60.625,60.75,20566400,2.562551\n1994-12-23,60.625,61.375,60.375,60.875,19486400,2.567824\n1994-12-22,61.50,62.00,60.25,60.625,57355200,2.557278\n1994-12-21,60.25,61.625,60.125,61.50,69395200,2.594187\n1994-12-20,62.625,62.75,58.75,59.875,253456000,2.525642\n1994-12-19,63.375,63.625,62.50,62.625,31507200,2.641642\n1994-12-16,63.625,64.25,63.203098,63.375,54020800,2.673278\n1994-12-15,63.375,64.125,63.00,63.50,28854400,2.678551\n1994-12-14,62.50,63.625,62.50,63.25,33641600,2.668006\n1994-12-13,63.375,63.50,62.25,62.75,30219200,2.646915\n1994-12-12,63.125,63.50,61.625,63.125,65313600,2.662733\n1994-12-09,62.50,63.25,62.25,63.125,79956800,2.662733\n1994-12-08,63.125,63.75,62.25,62.50,41934400,2.636369\n1994-12-07,63.50,63.875,63.00,63.00,36744000,2.65746\n1994-12-06,63.25,64.125,63.00,63.375,38830400,2.673278\n1994-12-05,63.375,64.25,63.125,63.3125,38166400,2.670642\n1994-12-02,62.75,63.25,62.00,63.25,37715200,2.668006\n1994-12-01,62.625,63.4062,62.50,62.5625,43096000,2.639006\n1994-11-30,64.25,64.25,62.75,62.875,40934400,2.652188\n1994-11-29,63.625,64.375,63.50,64.125,37673600,2.704915\n1994-11-28,62.50,63.50,62.25,63.375,43449600,2.673278\n1994-11-25,61.75,62.375,61.625,62.25,12563200,2.625824\n1994-11-23,61.625,62.0625,61.0625,61.50,87507200,2.594187\n1994-11-22,63.25,63.875,61.875,62.00,56358400,2.615278\n1994-11-21,64.50,64.75,63.375,63.50,35560000,2.678551\n1994-11-18,64.125,64.75,64.00,64.125,25694400,2.704915\n1994-11-17,64.625,64.75,63.875,64.25,33232000,2.710188\n1994-11-16,64.75,64.875,64.50,64.625,30196800,2.726006\n1994-11-15,64.50,65.125,64.25,64.5625,52544000,2.72337\n1994-11-14,62.75,64.50,62.75,64.50,48934400,2.720733\n1994-11-11,62.25,62.6875,60.75,62.25,132899200,2.625824\n1994-11-10,63.50,64.375,63.50,63.6875,24689600,2.68646\n1994-11-09,64.25,64.625,63.125,63.75,60206400,2.689097\n1994-11-08,61.875,63.875,61.6875,63.625,43328000,2.683824\n1994-11-07,61.50,62.00,60.875,61.875,47094400,2.610006\n1994-11-04,62.625,63.125,61.3125,61.50,46947200,2.594187\n1994-11-03,63.00,63.25,62.375,62.625,63441600,2.641642\n1994-11-02,62.75,64.125,62.50,63.00,61408000,2.65746\n1994-11-01,62.75,62.875,62.125,62.75,39624000,2.646915\n1994-10-31,62.25,63.75,62.00,63.00,59932800,2.65746\n1994-10-28,61.625,62.375,61.375,62.125,58414400,2.620551\n1994-10-27,61.125,61.625,60.75,61.625,41238400,2.59946\n1994-10-26,59.875,61.125,59.75,61.00,97904000,2.573096\n1994-10-25,58.75,59.75,58.375,59.6875,44780800,2.517733\n1994-10-24,59.50,59.50,58.375,58.875,57145600,2.48346\n1994-10-21,59.25,59.625,58.375,59.375,67099200,2.504551\n1994-10-20,58.25,59.875,57.875,59.625,136558400,2.515096\n1994-10-19,56.625,58.00,56.25,57.625,59488000,2.430733\n1994-10-18,55.25,56.75,55.0625,56.625,52686400,2.388551\n1994-10-17,56.00,56.25,55.00,55.125,31160000,2.325278\n1994-10-14,57.25,57.375,55.1875,55.9375,99878400,2.359551\n1994-10-13,56.625,57.75,56.625,57.25,63033600,2.414914\n1994-10-12,55.875,56.50,55.75,56.25,27912000,2.372732\n1994-10-11,55.125,56.625,55.125,55.8125,55692800,2.354278\n1994-10-10,54.375,55.375,54.375,54.75,39480000,2.30946\n1994-10-07,54.625,54.875,53.875,54.375,51518400,2.293641\n1994-10-06,55.50,55.875,54.25,54.50,40790400,2.298914\n1994-10-05,54.875,55.875,54.125,55.50,50985600,2.341096\n1994-10-04,56.00,56.125,54.875,55.00,42622400,2.320005\n1994-10-03,56.125,56.375,55.50,55.875,28833600,2.356914\n1994-09-30,56.50,57.50,56.125,56.125,34608000,2.36746\n1994-09-29,56.875,57.25,56.375,56.50,27105600,2.383278\n1994-09-28,56.625,57.50,56.50,57.00,33355200,2.404369\n1994-09-27,55.50,56.50,54.875,56.50,50585600,2.383278\n1994-09-26,56.00,56.00,55.25,55.5625,29921600,2.343732\n1994-09-23,56.875,57.50,56.00,56.00,48371200,2.362187\n1994-09-22,57.25,57.50,56.625,57.00,44320000,2.404369\n1994-09-21,56.3125,57.375,55.00,57.25,82948800,2.414914\n1994-09-20,56.875,57.125,55.9375,56.00,40276800,2.362187\n1994-09-19,57.125,57.25,56.625,56.875,48350400,2.399096\n1994-09-16,58.00,58.125,56.75,56.875,52921600,2.399096\n1994-09-15,57.625,58.25,57.375,58.25,40640000,2.457096\n1994-09-14,57.75,58.125,57.50,57.625,29968000,2.430733\n1994-09-13,56.375,57.875,56.375,57.5625,41134400,2.428096\n1994-09-12,57.125,57.125,55.875,56.125,36238400,2.36746\n1994-09-09,56.125,57.875,55.875,56.875,60800000,2.399096\n1994-09-08,57.00,58.00,57.00,57.9375,28377600,2.443914\n1994-09-07,56.25,57.8125,56.125,56.875,43588800,2.399096\n1994-09-06,55.875,56.25,55.6875,56.00,28804800,2.362187\n1994-09-02,56.50,56.50,55.75,56.00,46964800,2.362187\n1994-09-01,57.00,57.00,55.75,56.125,115568000,2.36746\n1994-08-31,58.375,59.25,57.75,58.125,60968000,2.451823\n1994-08-30,57.00,58.50,56.625,58.375,39851200,2.462369\n1994-08-29,57.375,58.125,57.00,57.0625,56625600,2.407005\n1994-08-26,56.375,57.75,56.25,56.875,60961600,2.399096\n1994-08-25,55.875,56.75,55.75,56.1875,55174400,2.370096\n1994-08-24,55.50,56.00,55.50,55.75,35246400,2.351641\n1994-08-23,54.625,56.375,54.50,55.50,58363200,2.341096\n1994-08-22,55.00,55.00,54.50,54.625,62835200,2.304187\n1994-08-19,55.875,56.00,54.75,54.875,74761600,2.314732\n1994-08-18,55.875,56.375,55.375,55.50,61276800,2.341096\n1994-08-17,55.375,56.25,55.125,55.875,79790400,2.356914\n1994-08-16,54.875,55.125,54.00,54.875,56779200,2.314732\n1994-08-15,55.50,55.50,54.375,54.4375,36113600,2.296278\n1994-08-12,55.375,55.625,54.875,55.25,38088000,2.33055\n1994-08-11,53.875,56.00,53.875,55.25,81428800,2.33055\n1994-08-10,53.50,54.375,53.25,54.125,48646400,2.283096\n1994-08-09,53.00,53.875,52.75,53.50,40198400,2.256732\n1994-08-08,52.375,53.00,52.00,53.00,34537600,2.235641\n1994-08-05,52.625,52.875,52.25,52.50,31204800,2.21455\n1994-08-04,53.50,53.625,52.75,52.75,40192000,2.225096\n1994-08-03,53.75,54.00,53.125,53.375,58771200,2.251459\n1994-08-02,53.75,54.625,52.625,52.8125,95249600,2.227732\n1994-08-01,51.625,53.625,51.50,53.375,83934400,2.251459\n1994-07-29,49.875,51.625,49.625,51.50,67064000,2.172368\n1994-07-28,49.50,50.25,49.25,49.50,39899200,2.088004\n1994-07-27,50.375,50.375,49.50,49.50,29291200,2.088004\n1994-07-26,51.125,51.25,49.75,50.375,54308800,2.124914\n1994-07-25,50.625,51.625,50.25,51.1875,51513600,2.159186\n1994-07-22,48.50,50.75,47.25,50.5625,152916800,2.132823\n1994-07-21,48.625,48.875,47.50,47.75,85740800,2.014186\n1994-07-20,50.00,50.00,47.875,48.375,112604800,2.04055\n1994-07-19,50.625,50.625,49.625,50.125,70126400,2.114368\n1994-07-18,51.50,51.75,49.50,50.50,150499200,2.130186\n1994-07-15,48.75,49.375,48.00,48.625,45520000,2.051095\n1994-07-14,49.375,49.625,48.375,48.75,81446400,2.056368\n1994-07-13,48.25,49.50,47.875,49.50,82956800,2.088004\n1994-07-12,48.25,48.25,46.875,48.00,83752000,2.024732\n1994-07-11,49.625,49.625,47.75,48.375,85406400,2.04055\n1994-07-08,49.875,50.875,49.125,49.50,48945600,2.088004\n1994-07-07,48.50,50.50,47.9375,50.375,89667200,2.124914\n1994-07-06,48.5625,49.00,47.75,48.3125,89254400,2.037913\n1994-07-05,50.375,51.00,49.00,49.125,40430400,2.072186\n1994-07-01,51.625,51.75,49.859299,50.25,66622400,2.119641\n1994-06-30,51.75,52.125,51.00,51.625,40827200,2.177641\n1994-06-29,51.375,51.875,50.875,51.375,53435200,2.167096\n1994-06-28,52.00,52.75,50.1875,51.3125,99417600,2.164459\n1994-06-27,49.75,52.125,49.375,51.875,76161600,2.188187\n1994-06-24,50.00,50.375,49.25,49.50,81454400,2.088004\n1994-06-23,51.50,52.25,50.00,50.125,85979200,2.114368\n1994-06-22,52.75,53.00,51.25,51.50,82924800,2.172368\n1994-06-21,52.125,53.375,52.00,52.625,86995200,2.219823\n1994-06-20,52.50,53.50,52.375,53.50,45668800,2.256732\n1994-06-17,53.50,53.625,52.875,53.00,47622400,2.235641\n1994-06-16,54.25,54.25,53.50,53.5625,48478400,2.259369\n1994-06-15,53.625,54.625,53.25,54.25,58860800,2.288369\n1994-06-14,53.125,54.125,53.00,53.5625,59249600,2.259369\n1994-06-13,52.625,53.375,51.875,52.875,56628800,2.230368\n1994-06-10,52.25,53.00,51.875,52.5625,53726400,2.217187\n1994-06-09,51.875,52.5625,51.75,52.25,79356800,2.204005\n1994-06-08,53.625,53.625,51.625,52.00,203835200,2.193459\n1994-06-07,54.00,54.25,53.50,53.625,166171200,2.262005\n1994-06-06,52.625,54.625,51.75,54.50,764504000,2.298914\n1994-06-03,52.50,53.50,52.25,52.875,86841600,2.230368\n1994-06-02,53.25,53.375,52.00,52.25,60291200,2.204005\n1994-06-01,53.50,53.50,52.375,53.00,100764800,2.235641\n1994-05-31,52.25,53.765598,51.875,53.75,76000000,2.267278\n1994-05-27,51.75,52.75,51.25,52.375,47544000,2.209277\n1994-05-26,52.75,52.75,51.25,52.00,64296000,2.193459\n1994-05-25,51.00,52.75,50.25,52.50,86003200,2.21455\n1994-05-24,51.25,51.875,50.25,51.125,85144000,2.15655\n1994-05-23,49.00,51.00,48.50,50.5625,74947200,2.132823\n1994-05-20,98.00,99.25,97.25,97.75,78140800,2.061641\n1994-05-19,97.25,99.00,97.00,98.375,89651200,2.074823\n1994-05-18,95.25,97.50,94.75,97.0625,96953600,2.047141\n1994-05-17,95.00,95.25,93.50,94.625,122464000,1.995732\n1994-05-16,96.25,96.75,94.75,95.00,56633600,2.003641\n1994-05-13,97.50,97.50,94.50,96.50,179920000,2.035277\n1994-05-12,93.50,95.296799,93.25,94.50,58998400,1.993095\n1994-05-11,94.00,94.25,92.75,93.50,57433600,1.972004\n1994-05-10,93.00,94.50,92.75,94.00,65305600,1.98255\n1994-05-09,91.75,93.625,91.625,92.25,47600000,1.945641\n1994-05-06,93.25,94.25,90.875,92.50,96403200,1.950913\n1994-05-05,95.25,96.25,94.00,94.375,56374400,1.990459\n1994-05-04,93.75,95.25,92.75,95.125,68889600,2.006277\n1994-05-03,95.25,95.50,93.25,93.50,41929600,1.972004\n1994-05-02,92.75,95.5625,92.00,95.50,79260800,2.014186\n1994-04-29,92.00,93.50,91.25,92.50,56803200,1.950913\n1994-04-28,95.25,95.25,91.75,92.125,141382400,1.943004\n1994-04-26,94.50,95.25,94.00,94.9375,113193600,2.002322\n1994-04-25,92.00,94.25,91.50,93.75,142745600,1.977277\n1994-04-22,92.00,92.75,90.75,91.75,66060800,1.935095\n1994-04-21,89.50,91.75,89.25,91.50,141980800,1.929822\n1994-04-20,88.50,89.625,87.00,89.50,104732800,1.88764\n1994-04-19,87.00,89.50,85.75,88.125,291273600,1.85864\n1994-04-18,84.75,85.75,82.25,83.00,78006400,1.750549\n1994-04-15,83.50,85.25,83.50,84.875,35241600,1.790095\n1994-04-14,84.50,85.25,83.75,84.125,53088000,1.774277\n1994-04-13,84.75,85.50,83.00,84.875,69644800,1.790095\n1994-04-12,86.75,86.75,84.00,84.75,84969600,1.787458\n1994-04-11,87.00,87.25,86.00,87.00,40400000,1.834913\n1994-04-08,89.75,90.00,86.75,87.00,118710400,1.834913\n1994-04-07,89.25,90.125,88.75,89.75,76630400,1.892913\n1994-04-06,87.50,89.25,87.25,89.00,80780800,1.877095\n1994-04-05,85.25,87.75,85.00,87.75,101878400,1.850731\n1994-04-04,82.50,85.75,82.00,84.50,73996800,1.782186\n1994-03-31,83.50,85.75,82.50,84.75,72297600,1.787458\n1994-03-30,82.75,85.00,82.50,83.625,86860800,1.763731\n1994-03-29,86.50,86.50,82.50,82.50,78339200,1.740004\n1994-03-28,87.50,88.00,83.75,86.375,118403200,1.821731\n1994-03-25,87.00,89.25,87.00,87.50,102051200,1.845459\n1994-03-24,85.75,87.25,85.00,87.25,60166400,1.840186\n1994-03-23,85.25,87.50,85.00,86.25,116441600,1.819095\n1994-03-22,82.25,85.75,82.25,84.75,89024000,1.787458\n1994-03-21,85.00,85.375,83.00,83.25,65078400,1.755822\n1994-03-18,84.50,85.00,83.50,84.75,36857600,1.787458\n1994-03-17,84.75,85.25,84.50,84.50,30992000,1.782186\n1994-03-16,85.00,85.25,84.50,84.75,41286400,1.787458\n1994-03-15,84.00,85.25,83.50,84.875,62934400,1.790095\n1994-03-14,82.50,84.25,82.25,83.875,69203200,1.769004\n1994-03-11,81.00,82.25,80.75,81.75,34857600,1.724186\n1994-03-10,81.50,82.25,80.50,80.875,46588800,1.705731\n1994-03-09,81.25,81.75,80.00,80.875,37024000,1.705731\n1994-03-08,81.25,81.25,79.75,81.00,24723200,1.708367\n1994-03-07,81.25,82.25,80.75,81.25,30540800,1.71364\n1994-03-04,81.00,81.50,80.50,81.00,25705600,1.708367\n1994-03-03,83.00,83.25,80.50,81.00,31564800,1.708367\n1994-03-02,81.75,83.00,81.00,82.75,68499200,1.745276\n1994-03-01,83.00,83.25,82.25,83.25,48070400,1.755822\n1994-02-28,81.25,83.00,81.00,82.50,55494400,1.740004\n1994-02-25,80.25,81.25,79.75,81.00,52995200,1.708367\n1994-02-24,80.00,80.75,79.25,79.875,82553600,1.68464\n1994-02-23,79.75,82.00,78.25,81.00,139462400,1.708367\n1994-02-22,80.00,80.25,78.50,79.50,63235200,1.676731\n1994-02-18,78.50,80.75,78.50,80.00,79465600,1.687276\n1994-02-17,79.00,79.50,78.00,78.625,85017600,1.658276\n1994-02-16,80.25,80.25,78.75,78.75,43731200,1.660913\n1994-02-15,79.75,80.25,79.25,79.75,28876800,1.682004\n1994-02-14,79.00,79.50,78.75,79.125,55270400,1.668822\n1994-02-11,79.25,79.50,78.00,78.75,53747200,1.660913\n1994-02-10,79.75,80.75,79.00,79.375,66620800,1.674095\n1994-02-09,78.50,80.25,78.00,79.625,98585600,1.679367\n1994-02-08,80.50,80.50,78.00,78.75,149875200,1.660913\n1994-02-07,79.75,81.25,79.50,80.75,118851200,1.703095\n1994-02-04,84.00,84.50,81.25,81.25,78217600,1.71364\n1994-02-03,84.25,84.50,83.50,84.50,31792000,1.782186\n1994-02-02,84.75,85.50,84.00,84.00,40924800,1.77164\n1994-02-01,85.00,85.75,84.50,85.125,44003200,1.795368\n1994-01-31,85.25,85.875,84.75,85.125,62566400,1.795368\n1994-01-28,84.50,85.50,84.25,84.875,41875200,1.790095\n1994-01-27,84.00,84.75,83.25,84.25,51129600,1.776913\n1994-01-26,85.00,85.00,84.00,84.25,50489600,1.776913\n1994-01-25,85.25,85.375,84.00,85.125,70361600,1.795368\n1994-01-24,86.00,87.00,85.00,85.25,38374400,1.798004\n1994-01-21,86.25,87.00,85.00,86.25,99078400,1.819095\n1994-01-20,83.25,86.375,83.25,86.25,145004800,1.819095\n1994-01-19,83.75,84.25,82.50,83.25,76563200,1.755822\n1994-01-18,85.25,85.50,84.00,84.625,43686400,1.784822\n1994-01-17,85.25,86.00,84.50,84.75,30755200,1.787458\n1994-01-14,85.50,86.00,84.75,85.625,45216000,1.805913\n1994-01-13,84.75,85.50,84.00,85.375,40755200,1.80064\n1994-01-12,85.00,85.75,83.75,85.50,39488000,1.803277\n1994-01-11,85.00,86.00,84.375,85.25,35360000,1.798004\n1994-01-10,85.00,86.50,85.00,85.75,74185600,1.808549\n1994-01-07,84.25,85.75,83.25,85.25,70832000,1.798004\n1994-01-06,82.625,84.75,82.50,84.625,82006400,1.784822\n1994-01-05,80.25,82.50,80.00,82.25,53974400,1.734731\n1994-01-04,80.25,80.75,79.25,80.50,45302400,1.697822\n1994-01-03,80.50,80.75,79.25,80.125,36646400,1.689913\n1993-12-31,81.00,81.50,80.25,80.625,22995200,1.700458\n1993-12-30,81.75,82.25,80.75,81.25,25328000,1.71364\n1993-12-29,82.75,83.50,80.50,81.50,48988800,1.718913\n1993-12-28,80.50,83.00,80.50,82.75,27776000,1.745276\n1993-12-27,80.75,81.25,79.75,80.50,24537600,1.697822\n1993-12-23,81.00,82.25,80.75,80.875,31820800,1.705731\n1993-12-22,82.25,82.50,81.00,81.125,24169600,1.711004\n1993-12-21,82.00,82.50,81.50,82.50,31008000,1.740004\n1993-12-20,81.00,82.00,80.50,82.00,35462400,1.729458\n1993-12-17,80.50,80.50,79.75,80.50,26112000,1.697822\n1993-12-16,80.00,81.00,79.75,80.00,29113600,1.687276\n1993-12-15,80.00,81.00,79.75,79.75,35219200,1.682004\n1993-12-14,81.00,81.50,79.25,80.00,47414400,1.687276\n1993-12-13,81.50,82.00,80.75,81.375,20112000,1.716276\n1993-12-10,81.25,82.25,80.75,81.875,19916800,1.726822\n1993-12-09,83.50,83.50,80.50,81.125,61465600,1.711004\n1993-12-08,83.00,83.75,82.25,83.50,105900800,1.761095\n1993-12-07,85.00,86.00,85.00,85.50,32780800,1.803277\n1993-12-06,85.00,85.50,84.00,84.875,59337600,1.790095\n1993-12-03,83.75,86.50,83.50,85.75,114502400,1.808549\n1993-12-02,82.00,83.00,81.75,82.875,51936000,1.747913\n1993-12-01,80.50,82.25,80.50,81.50,58886400,1.718913\n1993-11-30,78.50,80.50,78.25,80.00,44153600,1.687276\n1993-11-29,79.00,80.00,79.00,79.50,32105600,1.676731\n1993-11-26,79.00,79.25,78.75,79.00,6403200,1.666185\n1993-11-24,77.50,79.75,77.50,78.75,32467200,1.660913\n1993-11-23,77.75,78.50,77.25,77.375,98256000,1.631913\n1993-11-22,79.75,79.75,76.50,77.00,80355200,1.624003\n1993-11-19,79.75,80.25,79.50,80.125,38403200,1.689913\n1993-11-18,80.75,81.50,80.00,80.25,48438400,1.692549\n1993-11-17,82.75,83.00,80.75,80.75,72217600,1.703095\n1993-11-16,81.00,82.75,80.50,82.25,47664000,1.734731\n1993-11-15,82.00,82.00,80.50,80.50,29244800,1.697822\n1993-11-12,81.75,82.50,81.75,81.875,34339200,1.726822\n1993-11-11,81.25,82.50,81.00,81.625,31158400,1.721549\n1993-11-10,80.00,81.625,79.00,81.375,57177600,1.716276\n1993-11-09,79.00,80.00,78.00,78.25,36320000,1.650367\n1993-11-08,79.00,79.50,77.75,78.50,28819200,1.65564\n1993-11-05,76.25,79.00,76.00,78.75,56432000,1.660913\n1993-11-04,78.75,79.00,76.50,76.50,63177600,1.613458\n1993-11-03,80.00,80.50,77.75,78.50,56796800,1.65564\n1993-11-02,81.25,81.50,79.50,80.25,42422400,1.692549\n1993-11-01,80.25,81.50,79.75,80.875,30163200,1.705731\n1993-10-29,79.50,80.25,79.25,80.125,39843200,1.689913\n1993-10-28,79.75,80.50,78.75,79.00,56009600,1.666185\n1993-10-27,79.50,80.50,79.50,79.875,45564800,1.68464\n1993-10-26,80.50,80.75,79.25,79.50,66944000,1.676731\n1993-10-25,80.50,81.25,79.00,80.50,48553600,1.697822\n1993-10-22,79.25,80.75,79.25,80.375,47625600,1.695185\n1993-10-21,78.75,80.00,78.00,79.50,127142400,1.676731\n1993-10-20,80.50,81.75,79.25,81.00,81590400,1.708367\n1993-10-19,82.00,84.00,79.50,80.25,91392000,1.692549\n1993-10-18,81.00,83.25,80.75,83.00,67750400,1.750549\n1993-10-15,82.25,83.00,80.25,80.75,126425600,1.703095\n1993-10-14,83.75,84.00,82.00,82.125,63257600,1.732095\n1993-10-13,83.75,84.25,81.25,83.25,62409600,1.755822\n1993-10-12,84.25,85.25,82.25,84.25,79296000,1.776913\n1993-10-11,84.50,84.75,82.25,84.00,36457600,1.77164\n1993-10-08,84.25,84.75,82.25,84.50,38086400,1.782186\n1993-10-07,85.00,85.75,83.75,84.125,41596800,1.774277\n1993-10-06,83.25,85.50,83.00,84.875,77321600,1.790095\n1993-10-05,82.75,84.75,82.50,83.25,86931200,1.755822\n1993-10-04,82.50,84.00,82.50,82.625,40505600,1.74264\n1993-10-01,82.50,83.25,82.00,82.00,46048000,1.729458\n1993-09-30,82.75,83.25,82.25,82.50,38400000,1.740004\n1993-09-29,83.75,84.00,80.75,83.00,87529600,1.750549\n1993-09-28,82.25,84.25,82.25,84.00,84012800,1.77164\n1993-09-27,81.75,82.50,81.25,82.25,73472000,1.734731\n1993-09-24,78.50,80.75,78.50,80.00,91481600,1.687276\n1993-09-23,77.25,79.25,76.75,78.75,72214400,1.660913\n1993-09-22,76.00,78.00,75.25,77.25,72051200,1.629276\n1993-09-21,75.50,77.375,74.75,76.00,57846400,1.602913\n1993-09-20,76.25,77.75,75.00,75.625,34691200,1.595003\n1993-09-17,75.50,76.50,75.25,76.00,25286400,1.602913\n1993-09-16,76.75,77.25,75.75,76.00,25641600,1.602913\n1993-09-15,75.75,76.75,74.375,76.50,60428800,1.613458\n1993-09-14,76.00,76.25,74.25,75.25,57756800,1.587094\n1993-09-13,78.50,78.50,76.25,76.375,33481600,1.610822\n1993-09-10,77.00,78.25,76.25,78.00,56540800,1.645094\n1993-09-09,75.00,76.50,74.50,76.25,29856000,1.608185\n1993-09-08,74.00,74.75,73.25,74.50,54777600,1.571276\n1993-09-07,75.75,76.25,74.25,74.75,38659200,1.576549\n1993-09-03,76.50,76.75,75.25,75.75,26800000,1.59764\n1993-09-02,77.25,78.50,76.125,76.625,55497600,1.616094\n1993-09-01,75.25,77.25,75.00,76.75,86035200,1.618731\n1993-08-31,73.75,75.50,73.50,75.125,93020800,1.584458\n1993-08-30,72.50,73.25,71.75,72.625,54012800,1.531731\n1993-08-27,72.25,72.50,71.25,71.875,67763200,1.515912\n1993-08-26,73.50,73.75,71.50,72.125,136256000,1.521185\n1993-08-25,75.00,76.00,72.875,74.25,68800000,1.566003\n1993-08-24,76.50,77.00,75.75,75.875,39417600,1.600276\n1993-08-23,75.50,78.25,75.50,77.00,59472000,1.624003\n1993-08-20,73.50,76.75,73.25,76.25,73683200,1.608185\n1993-08-19,77.25,77.875,73.75,74.25,114742400,1.566003\n1993-08-18,77.75,79.25,76.50,77.25,66012800,1.629276\n1993-08-17,78.00,78.50,76.00,77.25,54272000,1.629276\n1993-08-16,75.75,78.25,75.50,77.75,78451200,1.639822\n1993-08-13,74.00,75.75,73.00,75.25,61900800,1.587094\n1993-08-12,72.50,74.50,72.25,74.00,77366400,1.560731\n1993-08-11,71.25,73.00,71.125,72.375,95974400,1.526458\n1993-08-10,73.00,73.25,70.375,71.00,192028800,1.497458\n1993-08-09,73.25,74.00,72.25,73.00,70876800,1.53964\n1993-08-06,74.75,75.875,72.75,73.25,71760000,1.544912\n1993-08-05,73.50,75.00,73.25,74.75,67910400,1.576549\n1993-08-04,73.25,73.75,71.75,73.00,94416000,1.53964\n1993-08-03,73.00,73.25,72.00,73.00,85136000,1.53964\n1993-08-02,74.75,75.75,72.25,72.75,148208000,1.534367\n1993-07-30,73.00,74.25,72.00,74.00,287936000,1.560731\n1993-07-29,78.00,80.75,77.50,79.00,96534400,1.666185\n1993-07-28,76.00,79.50,74.75,78.25,113459200,1.650367\n1993-07-27,78.50,78.75,75.50,75.50,112220800,1.592367\n1993-07-26,78.25,79.25,77.75,78.25,65801600,1.650367\n1993-07-23,77.00,78.25,76.75,77.625,92790400,1.637185\n1993-07-22,80.75,81.75,76.75,77.625,147584000,1.637185\n1993-07-21,78.50,79.00,76.75,79.00,178963200,1.666185\n1993-07-20,79.25,80.50,78.00,80.50,74822400,1.697822\n1993-07-19,79.50,80.25,78.00,78.75,122435200,1.660913\n1993-07-16,83.25,83.25,80.75,81.125,86217600,1.711004\n1993-07-15,84.25,84.25,82.75,83.50,34432000,1.761095\n1993-07-14,83.00,85.50,82.50,84.25,43491200,1.776913\n1993-07-13,84.00,84.00,82.50,82.75,36476800,1.745276\n1993-07-12,84.75,84.75,83.50,83.75,26540800,1.766367\n1993-07-09,85.00,85.00,83.50,84.625,50000000,1.784822\n1993-07-08,84.00,85.50,84.00,84.875,70105600,1.790095\n1993-07-07,82.125,84.25,81.25,83.375,182569600,1.758458\n1993-07-06,86.75,87.75,85.25,86.00,47721600,1.813822\n1993-07-02,87.25,87.50,86.50,87.25,25404800,1.840186\n1993-07-01,88.25,88.50,86.50,87.125,57907200,1.837549\n1993-06-30,89.25,90.25,87.25,88.00,56422400,1.856004\n1993-06-29,90.25,91.75,88.50,89.00,42361600,1.877095\n1993-06-28,88.75,90.25,88.50,90.25,52224000,1.903459\n1993-06-25,88.50,89.25,86.75,88.50,45484800,1.866549\n1993-06-24,88.25,89.50,87.25,88.50,35782400,1.866549\n1993-06-23,88.00,89.25,87.75,88.625,33129600,1.869186\n1993-06-22,89.25,89.75,87.25,88.00,41062400,1.856004\n1993-06-21,88.75,89.25,87.00,88.625,68102400,1.869186\n1993-06-18,90.50,91.25,87.00,87.50,75910400,1.845459\n1993-06-17,91.50,91.75,90.50,90.875,28083200,1.91664\n1993-06-16,92.75,93.25,89.25,91.25,66966400,1.92455\n1993-06-15,93.00,93.00,91.50,92.50,42345600,1.950913\n1993-06-14,91.00,92.25,90.25,92.25,40489600,1.945641\n1993-06-11,91.75,92.50,89.00,89.375,67542400,1.885004\n1993-06-10,91.25,92.50,89.50,91.125,56544000,1.921913\n1993-06-09,92.75,93.00,90.75,91.00,62480000,1.919277\n1993-06-08,93.00,93.25,90.75,92.25,48131200,1.945641\n1993-06-07,94.25,95.75,93.00,93.25,52761600,1.966732\n1993-06-04,94.00,94.50,93.50,94.00,32652800,1.98255\n1993-06-03,95.75,96.00,94.50,94.625,23936000,1.995732\n1993-06-02,95.75,97.50,95.25,95.75,70710400,2.019459\n1993-06-01,93.00,98.00,92.75,96.25,173088000,2.030004\n1993-05-28,93.50,93.75,91.75,92.625,35136000,1.95355\n1993-05-27,95.00,95.50,93.00,94.125,95052800,1.985186\n1993-05-26,91.50,95.25,91.25,95.25,87484800,2.008913\n1993-05-25,91.75,92.00,90.00,91.25,36716800,1.92455\n1993-05-24,92.25,94.00,92.00,92.125,64252800,1.943004\n1993-05-21,93.50,94.25,92.00,92.50,75500800,1.950913\n1993-05-20,92.25,95.25,92.00,94.125,150256000,1.985186\n1993-05-19,90.75,93.00,89.50,92.50,181017600,1.950913\n1993-05-18,86.75,88.75,86.50,88.50,84185600,1.866549\n1993-05-17,85.75,86.625,85.25,86.50,27763200,1.824368\n1993-05-14,86.00,86.75,84.75,85.50,49116800,1.803277\n1993-05-13,85.75,86.00,84.50,85.75,43708800,1.808549\n1993-05-12,87.50,88.00,85.75,86.25,48272000,1.819095\n1993-05-11,88.25,88.75,87.25,87.75,38220800,1.850731\n1993-05-10,88.50,90.00,88.00,89.125,69091200,1.879731\n1993-05-07,87.25,87.75,86.50,87.00,31798400,1.834913\n1993-05-06,89.00,89.75,86.75,87.25,47244800,1.840186\n1993-05-05,88.00,90.00,87.50,89.25,51868800,1.882368\n1993-05-04,86.75,88.50,86.50,88.00,49664000,1.856004\n1993-05-03,85.50,87.00,85.00,86.125,38096000,1.816458\n1993-04-30,85.00,86.75,85.00,85.50,46825600,1.803277\n1993-04-29,85.75,85.75,84.00,85.50,49660800,1.803277\n1993-04-28,83.00,86.00,82.75,86.00,55372800,1.813822\n1993-04-27,80.50,82.75,80.25,82.50,58208000,1.740004\n1993-04-26,81.50,82.50,79.75,80.375,65376000,1.695185\n1993-04-23,83.00,83.25,80.75,81.375,89296000,1.716276\n1993-04-22,84.50,85.00,82.875,83.25,79872000,1.755822\n1993-04-21,86.75,86.75,84.25,84.875,92528000,1.790095\n1993-04-20,86.75,87.50,85.00,86.75,46009600,1.82964\n1993-04-19,87.00,87.25,85.00,87.00,45673600,1.834913\n1993-04-16,87.25,87.75,85.50,87.00,49600000,1.834913\n1993-04-15,88.00,89.875,86.00,87.125,109152000,1.837549\n1993-04-14,89.00,90.25,87.75,89.00,38592000,1.877095\n1993-04-13,90.25,92.25,88.75,88.875,53337600,1.874459\n1993-04-12,88.75,91.25,88.50,90.125,48976000,1.900822\n1993-04-08,90.00,90.25,88.25,89.00,40185600,1.877095\n1993-04-07,90.00,90.50,89.25,90.25,39417600,1.903459\n1993-04-06,91.75,93.00,89.25,89.75,55699200,1.892913\n1993-04-05,88.75,92.25,88.00,91.50,61187200,1.929822\n1993-04-02,91.75,92.00,89.75,89.75,73251200,1.892913\n1993-04-01,92.50,94.75,92.50,93.00,100412800,1.961459\n1993-03-31,91.25,94.25,90.75,92.50,179660800,1.950913\n1993-03-30,88.50,91.25,87.25,91.00,140777600,1.919277\n1993-03-29,86.75,88.50,86.75,87.00,48262400,1.834913\n1993-03-26,88.00,88.25,86.00,86.625,28380800,1.827004\n1993-03-25,86.50,88.25,86.375,87.375,43833600,1.842822\n1993-03-24,83.25,86.75,83.00,86.25,50576000,1.819095\n1993-03-23,83.50,85.00,83.00,83.125,34409600,1.753186\n1993-03-22,83.25,84.00,82.50,83.375,34083200,1.758458\n1993-03-19,85.75,85.75,84.00,84.25,45404800,1.776913\n1993-03-18,85.75,86.75,85.00,85.25,34406400,1.798004\n1993-03-17,86.75,87.50,85.25,85.375,39644800,1.80064\n1993-03-16,88.25,88.75,87.00,87.75,36336000,1.850731\n1993-03-15,89.25,89.25,87.00,87.625,35347200,1.848095\n1993-03-12,86.00,89.25,85.25,89.00,73580800,1.877095\n1993-03-11,85.25,87.75,85.00,86.50,57779200,1.824368\n1993-03-10,84.50,85.75,83.50,85.00,26592000,1.792731\n1993-03-09,84.00,85.00,83.75,84.25,41312000,1.776913\n1993-03-08,82.625,84.50,82.00,83.625,48022400,1.763731\n1993-03-05,83.50,85.00,82.50,82.75,35724800,1.745276\n1993-03-04,84.75,84.75,81.75,83.75,56659200,1.766367\n1993-03-03,84.75,85.50,83.50,84.75,42352000,1.787458\n1993-03-02,81.75,84.75,81.25,84.625,38380800,1.784822\n1993-03-01,83.75,83.75,81.25,81.50,26432000,1.718913\n1993-02-26,84.25,85.00,83.00,83.375,29833600,1.758458\n1993-02-25,82.50,85.00,82.50,84.375,60806400,1.779549\n1993-02-24,79.00,84.00,78.75,83.875,77548800,1.769004\n1993-02-23,78.00,80.50,76.75,79.50,105974400,1.676731\n1993-02-22,79.75,81.00,76.75,76.75,76256000,1.618731\n1993-02-19,81.875,82.00,79.50,79.75,97094400,1.682004\n1993-02-18,81.25,82.75,79.00,81.625,138553600,1.721549\n1993-02-17,81.00,81.25,77.25,80.25,121913600,1.692549\n1993-02-16,82.875,83.75,79.75,80.125,91180800,1.689913\n1993-02-12,85.25,85.25,83.25,83.625,34752000,1.763731\n1993-02-11,86.25,86.50,84.75,85.25,31635200,1.798004\n1993-02-10,84.50,86.25,84.00,85.50,39193600,1.803277\n1993-02-09,86.75,87.25,83.50,83.875,64550400,1.769004\n1993-02-08,88.50,89.00,85.00,85.75,92665600,1.808549\n1993-02-05,84.75,89.50,82.25,89.00,177216000,1.877095\n1993-02-04,87.75,87.75,84.50,85.00,124214400,1.792731\n1993-02-03,89.50,90.25,88.00,88.375,71728000,1.863913\n1993-02-02,87.375,89.50,87.25,89.00,70371200,1.877095\n1993-02-01,86.25,88.00,85.50,87.50,42854400,1.845459\n1993-01-29,87.50,88.00,85.75,86.50,39424000,1.824368\n1993-01-28,86.25,87.125,84.75,87.00,77030400,1.834913\n1993-01-27,87.50,87.75,85.50,86.25,64192000,1.819095\n1993-01-26,88.50,90.00,87.50,88.00,42345600,1.856004\n1993-01-25,89.25,90.25,87.75,88.50,49609600,1.866549\n1993-01-22,89.75,90.25,88.75,89.375,49088000,1.885004\n1993-01-21,87.75,90.00,86.75,89.50,73363200,1.88764\n1993-01-20,88.50,89.00,87.75,88.375,47968000,1.863913\n1993-01-19,89.00,89.25,88.25,88.375,52960000,1.863913\n1993-01-18,89.50,89.75,88.25,89.25,50611200,1.882368\n1993-01-15,87.50,91.00,87.00,89.75,181958400,1.892913\n1993-01-14,92.25,94.00,90.50,91.25,121264000,1.92455\n1993-01-13,89.50,92.25,88.25,91.25,83696000,1.92455\n1993-01-12,89.00,91.25,88.75,89.75,85129600,1.892913\n1993-01-11,87.25,89.25,86.25,89.125,58348800,1.879731\n1993-01-08,87.25,88.25,86.25,87.125,43977600,1.837549\n1993-01-07,89.00,89.875,87.00,87.25,58748800,1.840186\n1993-01-06,87.00,89.25,86.75,89.00,87440000,1.877095\n1993-01-05,85.00,86.75,84.75,86.50,71529600,1.824368\n1993-01-04,85.00,85.75,84.50,85.125,72646400,1.795368\n1992-12-31,86.00,86.25,85.25,85.375,30851200,1.80064\n1992-12-30,86.75,87.00,85.25,85.875,50860800,1.811186\n1992-12-29,87.25,87.50,86.25,86.50,60035200,1.824368\n1992-12-28,87.25,87.75,86.00,87.50,45731200,1.845459\n1992-12-24,87.25,87.25,86.00,87.25,32723200,1.840186\n1992-12-23,88.00,88.25,86.00,87.25,59974400,1.840186\n1992-12-22,91.00,91.50,87.00,87.75,56928000,1.850731\n1992-12-21,89.75,92.00,89.25,90.50,64928000,1.908731\n1992-12-18,89.00,90.25,88.50,90.00,74387200,1.898186\n1992-12-17,87.25,90.25,87.00,90.00,51859200,1.898186\n1992-12-16,86.50,88.25,85.25,87.00,73792000,1.834913\n1992-12-15,87.25,87.75,85.50,86.375,45289600,1.821731\n1992-12-14,86.75,88.25,86.50,87.125,51286400,1.837549\n1992-12-11,88.50,89.00,85.75,86.375,112934400,1.821731\n1992-12-10,90.00,91.75,88.50,89.00,89296000,1.877095\n1992-12-09,91.75,93.25,91.25,92.00,26048000,1.940368\n1992-12-08,93.75,94.00,91.50,92.50,26908800,1.950913\n1992-12-07,92.00,93.50,91.00,93.375,46422400,1.969368\n1992-12-04,91.50,92.50,91.25,91.75,23548800,1.935095\n1992-12-03,90.75,92.50,90.50,91.625,26048000,1.932459\n1992-12-02,93.00,93.50,90.50,90.75,49881600,1.914004\n1992-12-01,92.75,93.50,92.00,93.125,33593600,1.964095\n1992-11-30,92.50,93.25,91.75,93.125,35251200,1.964095\n1992-11-27,91.50,92.50,91.00,91.75,17593600,1.935095\n1992-11-25,92.00,92.50,90.25,91.125,53152000,1.921913\n1992-11-24,91.25,92.75,89.25,91.50,145513600,1.929822\n1992-11-23,90.25,91.75,87.25,88.50,309884800,1.866549\n1992-11-20,94.00,95.00,93.75,95.00,41113600,2.003641\n1992-11-19,92.25,95.00,92.25,94.00,46857600,1.98255\n1992-11-18,90.50,92.50,89.875,92.00,33273600,1.940368\n1992-11-17,92.875,94.00,89.25,90.00,56649600,1.898186\n1992-11-16,93.00,93.50,92.25,92.75,19312000,1.956186\n1992-11-13,93.50,93.75,92.50,93.25,25811200,1.966732\n1992-11-12,93.75,94.25,92.00,93.50,46960000,1.972004\n1992-11-11,92.75,95.00,92.25,93.75,60748800,1.977277\n1992-11-10,92.00,93.25,91.50,92.875,38710400,1.958822\n1992-11-09,92.75,92.75,90.50,91.875,54796800,1.937731\n1992-11-06,91.75,93.25,91.25,92.75,61155200,1.956186\n1992-11-05,89.00,92.25,88.25,91.875,90361600,1.937731\n1992-11-04,88.25,89.75,88.00,88.50,23657600,1.866549\n1992-11-03,89.50,89.75,87.625,88.25,35267200,1.861277\n1992-11-02,89.00,90.00,87.75,89.625,31091200,1.890277\n1992-10-30,89.875,90.00,88.50,88.75,24998400,1.871822\n1992-10-29,88.75,90.00,88.50,90.00,32774400,1.898186\n1992-10-28,88.25,88.75,87.25,88.50,36172800,1.866549\n1992-10-27,90.00,90.25,87.50,88.00,49116800,1.856004\n1992-10-26,88.50,90.25,87.75,90.00,40121600,1.898186\n1992-10-23,90.25,90.25,88.25,88.625,46006400,1.869186\n1992-10-22,90.00,90.25,88.25,89.75,49174400,1.892913\n1992-10-21,88.25,90.00,87.75,90.00,60396800,1.898186\n1992-10-20,88.25,89.75,87.00,87.875,84150400,1.853368\n1992-10-19,85.00,88.25,85.00,87.875,83280000,1.853368\n1992-10-16,84.75,85.50,83.75,85.375,47644800,1.80064\n1992-10-15,83.25,84.75,82.75,84.50,35942400,1.782186\n1992-10-14,84.375,85.00,83.00,83.50,47456000,1.761095\n1992-10-13,84.75,85.375,83.25,84.25,86643200,1.776913\n1992-10-12,83.00,84.00,82.75,83.875,34700800,1.769004\n1992-10-09,83.50,83.50,81.50,82.375,40182400,1.737367\n1992-10-08,82.25,84.50,81.75,83.375,59532800,1.758458\n1992-10-07,82.50,84.25,81.00,81.125,58153600,1.711004\n1992-10-06,82.25,83.50,81.25,82.50,74316800,1.740004\n1992-10-05,78.50,81.75,75.75,81.75,71347200,1.724186\n1992-10-02,79.25,79.75,78.00,78.75,36803200,1.660913\n1992-10-01,80.00,81.00,79.50,79.625,47804800,1.679367\n1992-09-30,79.75,80.50,78.75,80.50,59843200,1.697822\n1992-09-29,77.00,79.00,77.00,78.75,39392000,1.660913\n1992-09-28,76.50,78.25,76.25,77.00,52854400,1.624003\n1992-09-25,80.25,80.375,76.00,78.75,41817600,1.660913\n1992-09-24,79.25,80.50,79.25,80.25,36953600,1.692549\n1992-09-23,77.75,79.75,77.50,79.125,37654400,1.668822\n1992-09-22,79.00,79.125,77.50,77.75,30777600,1.639822\n1992-09-21,78.75,79.50,78.25,79.125,31811200,1.668822\n1992-09-18,81.25,81.50,78.375,79.875,71683200,1.68464\n1992-09-17,80.50,81.50,80.25,81.125,23590400,1.711004\n1992-09-16,79.75,81.75,79.50,80.375,35708800,1.695185\n1992-09-15,81.50,81.75,80.00,81.25,44614400,1.71364\n1992-09-14,79.75,82.00,79.75,81.75,95100800,1.724186\n1992-09-11,78.50,79.25,78.00,78.75,30796800,1.660913\n1992-09-10,78.25,79.00,77.50,79.00,53302400,1.666185\n1992-09-09,76.75,78.375,76.50,78.125,60982400,1.647731\n1992-09-08,76.00,76.875,75.25,76.75,49376000,1.618731\n1992-09-04,76.25,76.50,75.50,76.00,28585600,1.602913\n1992-09-03,75.75,77.25,75.50,76.625,85296000,1.616094\n1992-09-02,74.50,75.75,73.75,75.375,61955200,1.589731\n1992-09-01,74.00,74.625,73.25,74.50,30825600,1.571276\n1992-08-31,74.25,75.00,73.50,74.50,25651200,1.571276\n1992-08-28,73.50,74.50,73.50,74.375,49468800,1.56864\n1992-08-27,72.00,74.00,72.00,73.625,88028800,1.552822\n1992-08-26,70.25,72.25,70.25,71.625,50016000,1.51064\n1992-08-25,68.75,70.75,68.50,70.375,37123200,1.484276\n1992-08-24,69.625,70.00,68.75,69.00,42800000,1.455276\n1992-08-21,70.50,70.875,69.00,69.75,52710400,1.471094\n1992-08-20,69.50,70.75,69.00,70.375,36534400,1.484276\n1992-08-19,69.50,70.50,68.75,69.25,27433600,1.460549\n1992-08-18,69.00,70.75,68.00,69.50,66313600,1.465821\n1992-08-17,70.75,71.00,69.50,69.50,63318400,1.465821\n1992-08-14,71.00,71.75,70.75,71.00,33942400,1.497458\n1992-08-13,71.25,71.75,70.50,70.875,28227200,1.494821\n1992-08-12,71.75,72.50,70.75,71.00,30441600,1.497458\n1992-08-11,71.25,71.875,70.00,71.375,33436800,1.505367\n1992-08-10,71.00,72.50,70.75,70.875,42067200,1.494821\n1992-08-07,71.50,73.75,70.50,70.75,55008000,1.492185\n1992-08-06,71.50,72.00,70.25,71.50,3705600,1.508003\n1992-08-05,73.75,73.75,71.25,72.00,60150400,1.518549\n1992-08-04,74.00,74.50,73.50,73.875,31430400,1.558094\n1992-08-03,72.75,74.25,72.00,73.75,31516800,1.555458\n1992-07-31,73.50,73.50,72.25,72.75,35312000,1.534367\n1992-07-30,73.50,74.50,73.00,73.125,32035200,1.542276\n1992-07-29,74.50,74.75,72.00,74.00,145273600,1.560731\n1992-07-28,73.50,74.50,72.75,74.00,45363200,1.560731\n1992-07-27,72.75,73.50,72.25,73.00,30512000,1.53964\n1992-07-24,71.125,73.75,71.00,72.75,76259200,1.534367\n1992-07-23,69.75,72.25,68.75,71.00,68441600,1.497458\n1992-07-22,71.75,71.75,69.50,70.00,59008000,1.476367\n1992-07-21,70.00,72.75,69.50,71.75,45907200,1.513276\n1992-07-20,69.50,70.25,68.50,69.25,48707200,1.460549\n1992-07-17,71.75,72.00,69.75,70.25,59865600,1.48164\n1992-07-16,71.00,72.25,70.75,72.25,42291200,1.523821\n1992-07-15,71.75,73.25,71.00,71.50,80172800,1.508003\n1992-07-14,70.50,71.50,70.25,71.125,41116800,1.500094\n1992-07-13,69.75,71.25,68.50,70.00,35113600,1.476367\n1992-07-10,69.25,70.00,67.625,69.50,28905600,1.465821\n1992-07-09,69.00,70.75,68.25,69.00,61174400,1.455276\n1992-07-08,68.00,69.00,65.50,68.625,93417600,1.447367\n1992-07-07,69.75,69.75,67.25,68.00,54396800,1.434185\n1992-07-06,70.00,70.25,67.75,69.50,36224000,1.465821\n1992-07-02,72.75,73.00,68.75,69.875,80563200,1.47373\n1992-07-01,70.25,72.75,69.50,72.125,45136000,1.521185\n1992-06-30,72.75,73.00,69.50,70.00,74048000,1.476367\n1992-06-29,68.50,72.75,68.25,72.25,90963200,1.523821\n1992-06-26,69.50,69.75,65.75,66.75,140982400,1.407821\n1992-06-25,72.25,72.25,66.50,70.00,165340800,1.476367\n1992-06-24,73.75,73.75,71.75,72.25,34096000,1.523821\n1992-06-23,74.75,75.75,72.75,73.50,57420800,1.550185\n1992-06-22,73.25,74.50,71.50,74.25,54080000,1.566003\n1992-06-19,73.50,74.25,72.75,73.50,43110400,1.550185\n1992-06-18,73.00,74.75,71.00,72.25,53356800,1.523821\n1992-06-17,72.50,73.25,71.50,72.375,70032000,1.526458\n1992-06-16,75.50,76.50,72.50,72.75,57376000,1.534367\n1992-06-15,75.00,78.00,75.00,75.75,54940800,1.59764\n1992-06-12,110.25,113.000004,108.875004,112.50,138028800,1.581822\n1992-06-11,112.50,115.250004,107.499996,108.00,130732800,1.518549\n1992-06-10,115.250004,115.50,111.999996,112.50,65456000,1.581822\n1992-06-09,118.50,119.000004,114.00,114.999996,84604800,1.616973\n1992-06-08,120.75,120.999996,118.250004,118.250004,40227200,1.66267\n1992-06-05,122.499996,123.00,120.75,120.999996,40937600,1.701337\n1992-06-04,123.249996,123.500004,122.499996,122.625,41753600,1.724186\n1992-06-03,122.499996,124.250004,122.499996,123.00,28188800,1.729458\n1992-06-02,124.250004,124.50,122.25,122.874996,42585600,1.727701\n1992-06-01,120.500004,124.250004,120.00,124.250004,68528000,1.747034\n1992-05-29,119.750004,122.25,119.499996,120.999996,89916800,1.701337\n1992-05-28,114.75,119.499996,114.500004,119.000004,62700800,1.673216\n1992-05-27,115.749996,116.25,114.75,114.999996,31164800,1.616973\n1992-05-26,116.000004,117.00,114.999996,115.50,38217600,1.624003\n1992-05-22,117.00,117.00,114.999996,115.749996,36969600,1.627519\n1992-05-21,117.00,117.00,115.250004,116.625,48566400,1.639822\n1992-05-20,114.500004,117.00,114.500004,116.750004,58800000,1.641579\n1992-05-19,113.25,114.500004,113.25,114.500004,51238400,1.609943\n1992-05-18,110.750004,113.499996,110.499996,112.749996,37526400,1.585337\n1992-05-15,110.25,111.500004,109.50,110.000004,40812800,1.54667\n1992-05-14,112.749996,113.000004,109.250004,110.750004,72307200,1.557216\n1992-05-13,113.750004,114.249996,111.00,112.749996,64320000,1.585337\n1992-05-12,114.75,115.250004,112.749996,114.249996,49904000,1.606428\n1992-05-11,114.75,115.250004,113.25,114.00,41110400,1.602913\n1992-05-08,116.000004,117.00,113.25,114.500004,59820800,1.609943\n1992-05-07,116.000004,116.499996,114.249996,114.999996,40579200,1.616973\n1992-05-06,117.00,117.249996,115.50,116.000004,50016000,1.631034\n1992-05-05,113.750004,117.500004,113.25,116.499996,59244800,1.638064\n1992-05-04,113.499996,116.000004,112.50,114.00,73920000,1.602913\n1992-05-01,110.499996,114.00,110.25,113.750004,62083200,1.599397\n1992-04-30,111.999996,112.749996,109.749996,110.25,95868800,1.550185\n1992-04-29,109.50,111.500004,108.249996,111.375,137308800,1.566003\n1992-04-28,113.750004,114.500004,107.000004,108.999996,199875200,1.532609\n1992-04-27,112.50,116.499996,112.50,113.25,99584000,1.592367\n1992-04-24,116.000004,116.750004,111.999996,112.250004,90393600,1.578306\n1992-04-23,118.50,119.000004,112.250004,115.749996,115334400,1.627519\n1992-04-22,116.499996,118.50,114.500004,117.624996,61788800,1.653882\n1992-04-21,118.250004,118.50,115.50,116.124996,99244800,1.632791\n1992-04-20,124.50,125.000004,115.50,118.125,226118400,1.660913\n1992-04-16,129.00,129.00,126.999996,127.625004,66393600,1.794489\n1992-04-15,128.750004,129.249996,126.500004,128.874996,223305600,1.812064\n1992-04-14,118.250004,120.249996,116.499996,117.00,72806400,1.645094\n1992-04-13,116.750004,118.125,114.249996,117.500004,45552000,1.652125\n1992-04-10,121.250004,122.000004,114.00,116.000004,126444800,1.631034\n1992-04-09,118.250004,120.249996,116.625,120.00,70006400,1.687276\n1992-04-08,115.749996,117.500004,113.25,117.249996,105388800,1.64861\n1992-04-07,122.000004,122.499996,115.749996,116.000004,72758400,1.631034\n1992-04-06,117.75,121.625004,117.75,121.250004,40121600,1.704852\n1992-04-03,117.500004,119.25,116.750004,117.500004,59532800,1.652125\n1992-04-02,120.500004,121.50,116.750004,117.00,56918400,1.645094\n1992-04-01,117.249996,120.75,117.00,120.500004,74201600,1.694307\n1992-03-31,120.500004,122.000004,117.75,118.50,86700800,1.666185\n1992-03-30,121.50,122.000004,120.00,120.00,40713600,1.687276\n1992-03-27,124.50,125.000004,119.499996,121.250004,89971200,1.704852\n1992-03-26,128.750004,129.00,124.250004,125.000004,60403200,1.75758\n1992-03-25,127.50,129.249996,126.999996,128.499996,36739200,1.806792\n1992-03-24,129.00,129.875004,126.500004,127.50,70227200,1.792731\n1992-03-23,128.499996,129.249996,127.749996,128.499996,37843200,1.806792\n1992-03-20,127.50,129.00,127.50,128.499996,35772800,1.806792\n1992-03-19,126.999996,130.250004,126.249996,127.50,111574400,1.792731\n1992-03-18,128.499996,129.00,126.00,126.375,69228800,1.776913\n1992-03-17,125.375004,128.750004,124.749996,128.000004,94473600,1.799762\n1992-03-16,120.999996,124.250004,120.500004,124.250004,55132800,1.747034\n1992-03-13,122.499996,123.00,120.500004,120.999996,36761600,1.701337\n1992-03-12,120.249996,121.50,118.50,121.125,50025600,1.703095\n1992-03-11,122.25,123.249996,119.25,120.249996,39532800,1.690791\n1992-03-10,119.499996,122.750004,119.25,121.749996,45478400,1.711882\n1992-03-09,118.749996,120.500004,118.250004,119.000004,30425600,1.673216\n1992-03-06,120.75,122.000004,116.750004,118.250004,61865600,1.66267\n1992-03-05,122.499996,123.249996,119.25,121.250004,55689600,1.704852\n1992-03-04,123.249996,124.250004,121.749996,122.499996,33084800,1.722428\n1992-03-03,123.500004,125.25,122.499996,123.249996,27734400,1.732973\n1992-03-02,123.75,125.750004,121.749996,123.00,34876800,1.729458\n1992-02-28,125.000004,126.500004,122.25,123.500004,58275200,1.736489\n1992-02-27,122.750004,125.25,122.750004,124.875,79577600,1.755822\n1992-02-26,116.000004,122.000004,116.000004,122.000004,100668800,1.715398\n1992-02-25,114.999996,116.499996,113.25,115.749996,57388800,1.627519\n1992-02-24,114.500004,116.499996,113.000004,114.875004,59049600,1.615216\n1992-02-21,117.00,118.50,113.750004,114.500004,91116800,1.609943\n1992-02-20,116.000004,119.25,115.749996,117.500004,74323200,1.652125\n1992-02-19,117.999996,117.999996,113.499996,115.125,145372800,1.618731\n1992-02-18,119.25,122.25,117.999996,118.250004,73692800,1.66267\n1992-02-14,122.25,122.499996,117.999996,118.50,82630400,1.666185\n1992-02-13,125.499996,126.500004,121.50,122.499996,97356800,1.722428\n1992-02-12,118.625004,126.75,118.625004,125.750004,83340800,1.768125\n1992-02-11,124.250004,124.749996,121.50,122.499996,41078400,1.722428\n1992-02-10,125.625,126.00,122.000004,124.50,41369600,1.750549\n1992-02-07,126.249996,127.50,123.999996,125.750004,36499200,1.768125\n1992-02-06,126.500004,129.00,125.750004,126.249996,62355200,1.775155\n1992-02-05,124.749996,128.499996,123.500004,127.250004,71212800,1.789216\n1992-02-04,125.25,126.00,122.499996,124.50,58438400,1.750549\n1992-02-03,118.250004,125.499996,117.500004,125.000004,80265600,1.75758\n1992-01-31,123.500004,123.75,119.750004,120.249996,49948800,1.690791\n1992-01-30,124.50,124.749996,121.50,123.500004,41923200,1.736489\n1992-01-29,122.499996,125.750004,121.749996,124.50,97344000,1.750549\n1992-01-28,120.999996,121.749996,116.000004,120.75,95539200,1.697822\n1992-01-27,124.749996,125.499996,120.500004,120.624996,46233600,1.696064\n1992-01-24,124.50,125.499996,123.999996,124.625004,37756800,1.752307\n1992-01-23,125.499996,129.375,123.75,125.000004,75590400,1.75758\n1992-01-22,120.00,125.499996,119.000004,125.499996,56131200,1.76461\n1992-01-21,122.25,123.00,116.000004,119.375004,120019200,1.678489\n1992-01-20,127.250004,127.250004,122.499996,122.499996,58860800,1.722428\n1992-01-17,127.749996,129.500004,123.75,126.500004,85027200,1.778671\n1992-01-16,131.25,132.00,127.50,127.749996,58761600,1.796246\n1992-01-15,128.750004,133.250004,128.25,131.499996,65292800,1.848974\n1992-01-14,127.50,128.499996,126.00,128.25,44006400,1.803277\n1992-01-13,123.999996,128.874996,122.750004,127.125,52803200,1.787458\n1992-01-10,126.999996,127.749996,123.999996,125.25,64640000,1.761095\n1992-01-09,124.250004,129.00,123.999996,127.250004,88348800,1.789216\n1992-01-08,119.000004,125.750004,118.749996,124.250004,90761600,1.747034\n1992-01-07,116.499996,120.249996,115.749996,120.00,64361600,1.687276\n1992-01-06,113.25,117.75,112.374996,116.499996,63056000,1.638064\n1992-01-03,114.00,114.249996,111.75,113.000004,38246400,1.588852\n1992-01-02,110.750004,114.75,109.50,114.00,74265600,1.602913\n1991-12-31,110.750004,111.999996,108.75,111.249996,40512000,1.564246\n1991-12-30,110.499996,111.249996,109.50,110.750004,35523200,1.557216\n1991-12-27,108.249996,111.500004,107.750004,110.375004,36656000,1.551943\n1991-12-26,106.250004,108.249996,105.75,107.874996,24326400,1.516791\n1991-12-24,106.749996,107.499996,105.999996,106.250004,23993600,1.493943\n1991-12-23,103.250004,106.749996,102.500004,106.749996,46112000,1.500973\n1991-12-20,104.000004,105.00,102.249996,103.250004,35356800,1.451761\n1991-12-19,102.375,103.250004,101.25,102.75,38115200,1.44473\n1991-12-18,102.00,103.250004,101.25,102.875004,33561600,1.446488\n1991-12-17,102.00,103.50,100.250004,101.874996,27478400,1.432427\n1991-12-16,102.00,102.249996,100.749996,102.125004,27225600,1.435943\n1991-12-13,102.249996,102.75,101.499996,102.00,26192000,1.434185\n1991-12-12,101.000004,103.250004,100.50,102.00,36979200,1.434185\n1991-12-11,102.125004,102.75,99.500004,100.749996,39132800,1.416609\n1991-12-10,102.00,102.00,99.999996,101.750004,46252800,1.43067\n1991-12-09,103.250004,103.749996,101.25,102.00,57718400,1.434185\n1991-12-06,101.499996,105.249996,101.000004,104.25,51580800,1.465821\n1991-12-05,101.750004,102.249996,100.749996,101.750004,24892800,1.43067\n1991-12-04,101.750004,102.999996,99.999996,102.00,36297600,1.434185\n1991-12-03,101.000004,102.75,99.500004,101.375004,64995200,1.425397\n1991-12-02,96.249996,101.499996,96.00,101.25,55852800,1.423639\n1991-11-29,94.750002,97.749996,94.750002,97.250004,20524800,1.367397\n1991-11-27,94.249998,95.500002,94.000002,95.25,15008000,1.339276\n1991-11-26,96.125004,96.249996,92.749998,94.50,58809600,1.32873\n1991-11-25,95.749998,96.999996,95.25,95.625,33724800,1.344548\n1991-11-22,96.999996,97.50,95.25,96.00,38102400,1.349821\n1991-11-21,96.249996,97.250004,95.749998,97.250004,35558400,1.367397\n1991-11-20,96.999996,97.50,96.00,96.500004,36441600,1.356851\n1991-11-19,96.249996,97.374996,94.249998,96.249996,71974400,1.353336\n1991-11-18,95.25,97.749996,94.999998,97.250004,72432000,1.367397\n1991-11-15,99.00,100.50,94.750002,94.999998,71590400,1.33576\n1991-11-14,101.499996,101.499996,98.750004,99.249996,44371200,1.395518\n1991-11-13,99.500004,101.750004,98.750004,101.000004,57523200,1.420124\n1991-11-12,98.25,100.749996,98.000004,99.875004,80035200,1.404306\n1991-11-11,96.00,98.000004,95.625,97.50,40563200,1.370912\n1991-11-08,94.999998,96.75,94.999998,95.25,36492800,1.339276\n1991-11-07,95.500002,95.749998,94.50,94.750002,20892800,1.332245\n1991-11-06,94.000002,95.500002,93.250002,95.25,38307200,1.339276\n1991-11-05,91.249998,94.50,91.000002,93.75,51737600,1.318185\n1991-11-04,92.25,92.500002,90.75,91.000002,28838400,1.279518\n1991-11-01,93.499998,93.75,91.999998,92.625,34294400,1.302366\n1991-10-31,94.50,95.25,93.250002,93.874998,41091200,1.319942\n1991-10-30,90.75,94.750002,90.75,94.50,65590400,1.32873\n1991-10-29,90.250002,90.75,89.749998,90.75,36521600,1.276003\n1991-10-28,89.500002,90.250002,87.75,90.250002,37952000,1.268972\n1991-10-25,90.250002,90.75,89.25,89.500002,28080000,1.258427\n1991-10-24,90.499998,90.499998,89.25,90.250002,26940800,1.268972\n1991-10-23,91.750002,91.999998,89.749998,90.250002,36723200,1.268972\n1991-10-22,91.50,92.749998,91.249998,91.375002,32496000,1.284791\n1991-10-21,90.00,91.50,89.749998,91.000002,28704000,1.279518\n1991-10-18,90.00,91.249998,89.749998,90.00,37843200,1.265457\n1991-10-17,90.75,90.75,88.50,89.25,95561600,1.254912\n1991-10-16,91.50,91.50,89.875002,90.75,100198400,1.276003\n1991-10-15,92.25,92.25,90.75,91.375002,57852800,1.284791\n1991-10-14,90.00,92.25,90.00,92.25,50624000,1.297094\n1991-10-11,90.75,91.000002,87.75,89.625,69920000,1.260185\n1991-10-10,90.499998,90.499998,88.50,89.749998,42048000,1.261942\n1991-10-09,89.500002,91.249998,89.25,89.500002,60931200,1.258427\n1991-10-08,88.000002,89.500002,88.000002,89.25,37708800,1.254912\n1991-10-07,87.250002,88.875,86.749998,88.50,27187200,1.244366\n1991-10-04,88.000002,88.999998,87.499998,88.125,26457600,1.239094\n1991-10-03,86.500002,88.249998,86.25,87.499998,34630400,1.230306\n1991-10-02,88.50,90.499998,86.25,87.00,67219200,1.223275\n1991-10-01,88.999998,89.25,88.000002,88.875,19625600,1.249639\n1991-09-30,88.249998,89.500002,87.00,88.999998,27699200,1.251397\n1991-09-27,89.500002,89.500002,87.75,88.249998,33273600,1.240851\n1991-09-26,87.499998,90.00,87.250002,89.25,48000000,1.254912\n1991-09-25,88.000002,88.375002,86.500002,87.75,25766400,1.233821\n1991-09-24,85.249998,88.249998,85.249998,88.000002,47625600,1.237336\n1991-09-23,86.25,86.500002,84.499998,84.874998,49769600,1.193396\n1991-09-20,86.749998,87.00,85.999998,86.500002,30316800,1.216245\n1991-09-19,85.000002,87.250002,84.75,86.25,51363200,1.21273\n1991-09-18,84.00,85.50,83.749998,84.75,26940800,1.191639\n1991-09-17,82.750002,84.75,82.000002,84.499998,23366400,1.188124\n1991-09-16,82.999998,83.500002,82.249998,82.999998,21686400,1.167033\n1991-09-13,85.50,85.750002,82.50,82.999998,51360000,1.167033\n1991-09-12,82.999998,85.750002,82.999998,85.624998,53808000,1.203942\n1991-09-11,80.500002,82.249998,80.500002,82.000002,64032000,1.152972\n1991-09-10,82.000002,82.50,79.999998,79.999998,65936000,1.124851\n1991-09-09,80.749998,81.499998,80.25,80.749998,31913600,1.135396\n1991-09-06,81.00,82.249998,80.25,80.749998,50787200,1.135396\n1991-09-05,82.999998,82.999998,79.999998,80.500002,58457600,1.131881\n1991-09-04,83.25,83.500002,81.00,82.624998,38467200,1.16176\n1991-09-03,85.000002,85.000002,82.50,83.125002,33494400,1.16879\n1991-08-30,85.750002,86.25,84.499998,85.249998,22032000,1.198669\n1991-08-29,85.999998,86.500002,85.000002,85.750002,27974400,1.2057\n1991-08-28,84.75,86.749998,84.499998,85.624998,41558400,1.203942\n1991-08-27,84.75,85.000002,84.00,84.75,34204800,1.191639\n1991-08-26,84.75,85.249998,83.500002,85.249998,44134400,1.198669\n1991-08-23,84.00,86.500002,84.00,85.249998,43161600,1.198669\n1991-08-22,84.250002,85.249998,83.25,84.00,43625600,1.181093\n1991-08-21,82.000002,84.499998,81.75,84.00,73212800,1.181093\n1991-08-20,80.625,81.874998,79.999998,80.500002,57324800,1.131881\n1991-08-19,77.500002,81.250002,76.999998,80.25,85424000,1.128366\n1991-08-16,80.749998,82.375002,80.25,81.75,52073600,1.149457\n1991-08-15,82.50,83.25,81.00,81.499998,45459200,1.145942\n1991-08-14,82.750002,83.500002,82.000002,82.50,67008000,1.160002\n1991-08-13,83.749998,83.749998,82.249998,82.50,94496000,1.160002\n1991-08-12,79.750002,83.749998,79.750002,82.999998,56899200,1.167033\n1991-08-09,78.75,82.000002,78.250002,80.749998,114806400,1.135396\n1991-08-08,76.000002,79.249998,76.000002,79.000002,91852800,1.11079\n1991-08-07,74.749998,76.50,74.500002,76.000002,69235200,1.068608\n1991-08-06,72.250002,75.00,72.250002,74.500002,53097600,1.047517\n1991-08-05,73.249998,73.249998,71.749998,72.250002,28252800,1.015881\n1991-08-02,73.750002,74.749998,73.249998,73.249998,81369600,1.029942\n1991-08-01,73.750002,73.999998,73.000002,73.249998,53942400,1.029942\n1991-07-31,73.000002,73.999998,72.75,73.50,111628800,1.033457\n1991-07-30,70.50,73.000002,69.75,72.75,78038400,1.022911\n1991-07-29,70.999998,71.25,68.749998,70.249998,136467200,0.98776\n1991-07-26,67.000002,71.749998,66.75,70.999998,149292800,0.998305\n1991-07-25,67.000002,67.999998,65.875002,66.00,90211200,0.928002\n1991-07-24,67.000002,67.249998,64.999998,65.500002,54320000,0.920972\n1991-07-23,67.999998,68.25,66.499998,66.499998,35596800,0.935032\n1991-07-22,66.75,68.749998,66.499998,67.50,35136000,0.949093\n1991-07-19,67.50,67.999998,66.00,67.750002,24441600,0.952608\n1991-07-18,67.999998,69.250002,66.75,67.000002,25654400,0.942063\n1991-07-17,65.749998,67.750002,64.999998,67.750002,40524800,0.952608\n1991-07-16,70.000002,70.000002,67.50,67.50,42732800,0.949093\n1991-07-15,68.749998,70.249998,68.500002,69.874998,36761600,0.982487\n1991-07-12,67.000002,68.500002,66.00,67.999998,35174400,0.956123\n1991-07-11,65.749998,66.75,64.999998,66.250002,51148800,0.931517\n1991-07-10,68.25,68.749998,64.999998,65.25,67308800,0.917457\n1991-07-09,67.50,68.749998,66.499998,67.875,76947200,0.954366\n1991-07-08,60.75,67.249998,60.499998,67.000002,109184000,0.942063\n1991-07-05,63.75,63.75,61.50,61.750002,78758400,0.868244\n1991-07-03,64.50,64.999998,61.750002,64.000002,191628800,0.899881\n1991-07-02,71.25,72.250002,67.999998,68.125002,43920000,0.957881\n1991-07-01,68.749998,71.625,67.750002,71.374998,72387200,1.003578\n1991-06-28,67.750002,68.749998,65.500002,68.125002,61526400,0.957881\n1991-06-27,67.750002,68.25,66.75,67.999998,56508800,0.956123\n1991-06-26,99.00,101.499999,98.250003,100.750002,96636800,0.944406\n1991-06-25,99.249999,100.250004,98.000004,98.750001,97228800,0.925659\n1991-06-24,101.000001,101.499999,97.499997,98.124999,79692800,0.9198\n1991-06-21,101.25,103.000002,101.25,102.249996,67680000,0.958467\n1991-06-20,101.000001,101.749998,99.00,100.750002,187996800,0.944406\n1991-06-19,109.750002,109.750002,103.000002,103.374996,157036800,0.969012\n1991-06-18,113.249997,113.499996,109.750002,111.500004,46848000,1.045174\n1991-06-17,113.750004,114.75,112.50,113.499996,29417600,1.063921\n1991-06-14,111.249996,113.750004,110.999997,113.499996,46358400,1.063921\n1991-06-13,110.999997,112.250001,110.499999,110.999997,38000000,1.040487\n1991-06-12,110.749998,112.250001,110.25,111.125001,51065600,1.041659\n1991-06-11,110.999997,112.999998,110.499999,110.625003,41846400,1.036972\n1991-06-10,110.25,110.999997,109.750002,110.499999,29494400,1.0358\n1991-06-07,109.750002,110.25,108.749997,110.25,51984000,1.033457\n1991-06-06,112.749999,112.999998,110.499999,111.125001,32678400,1.041659\n1991-06-05,112.50,114.250002,112.000002,112.000002,41385600,1.049861\n1991-06-04,112.000002,113.499996,110.499999,112.999998,35033600,1.059235\n1991-06-03,109.500003,112.250001,108.999996,112.000002,46947200,1.049861\n1991-05-31,110.499999,110.999997,108.00,109.750002,81782400,1.02877\n1991-05-30,110.124996,111.750003,108.999996,110.25,61833600,1.033457\n1991-05-29,111.249996,112.000002,109.750002,110.25,64198400,1.033457\n1991-05-28,110.499999,111.750003,110.000001,110.749998,43939200,1.038144\n1991-05-24,110.000001,112.50,109.500003,110.000001,67929600,1.031113\n1991-05-23,107.000004,109.750002,107.000004,109.500003,67750400,1.026426\n1991-05-22,102.750003,106.749996,102.249996,106.749996,88780800,1.000649\n1991-05-21,99.749997,103.250001,99.499998,101.999997,83568000,0.956123\n1991-05-20,99.499998,99.999996,97.749996,99.125004,65936000,0.929174\n1991-05-17,99.00,99.499998,98.000004,99.249999,44812800,0.930345\n1991-05-16,99.249999,99.999996,98.500002,99.375003,70243200,0.931517\n1991-05-15,100.250004,100.500003,96.624996,98.000004,111158400,0.918628\n1991-05-14,102.624999,103.250001,100.750002,101.25,58812800,0.949093\n1991-05-13,103.250001,103.749999,101.25,103.124997,68745600,0.966669\n1991-05-10,106.249998,107.000004,101.999997,102.750003,52070400,0.963154\n1991-05-09,103.250001,105.999999,102.750003,105.75,76294400,0.991275\n1991-05-08,101.000001,103.250001,100.250004,103.000002,57590400,0.965497\n1991-05-07,103.250001,103.749999,101.25,101.25,50902400,0.949093\n1991-05-06,100.500003,103.250001,100.250004,102.750003,44755200,0.963154\n1991-05-03,100.500003,101.25,99.749997,101.25,23043200,0.949093\n1991-05-02,101.25,102.500004,100.250004,100.500003,66886400,0.942063\n1991-05-01,98.500002,100.750002,96.999999,100.750002,111628800,0.944406\n1991-04-30,97.749996,99.249999,96.000003,99.00,115174400,0.928002\n1991-04-29,101.25,101.499999,97.749996,97.749996,71254400,0.916285\n1991-04-26,100.250004,102.249996,98.750001,100.750002,88371200,0.944406\n1991-04-25,102.500004,103.749999,100.500003,100.750002,65705600,0.944406\n1991-04-24,101.499999,104.750004,100.500003,103.000002,82128000,0.965497\n1991-04-23,102.249996,103.000002,100.500003,101.625003,103910400,0.952608\n1991-04-22,105.999999,106.249998,101.749998,102.125001,139708800,0.957295\n1991-04-19,106.249998,109.500003,105.000003,107.250003,96585600,1.005336\n1991-04-18,111.249996,112.000002,108.00,110.000001,88083200,1.031113\n1991-04-17,114.000003,117.499998,111.125001,111.500004,128380800,1.045174\n1991-04-16,113.750004,114.500001,110.000001,112.250001,81331200,1.052204\n1991-04-15,105.999999,114.250002,105.000003,113.750004,88819200,1.066265\n1991-04-12,109.500003,110.000001,103.749999,107.250003,176729600,1.005336\n1991-04-11,108.499998,111.500004,108.00,110.999997,47936000,1.040487\n1991-04-10,109.750002,110.25,105.500001,107.500002,74336000,1.007679\n1991-04-09,111.500004,113.249997,109.750002,110.25,60768000,1.033457\n1991-04-08,110.000001,113.249997,109.500003,111.375,46524800,1.044002\n1991-04-05,114.000003,114.250002,108.999996,110.000001,108912000,1.031113\n1991-04-04,114.000003,116.750001,112.749999,113.750004,73846400,1.066265\n1991-04-03,112.749999,116.750001,112.749999,113.750004,91776000,1.066265\n1991-04-02,107.500002,112.50,106.749996,112.250001,96252800,1.052204\n1991-04-01,105.999999,107.750001,104.499996,106.749996,59203200,1.000649\n1991-03-28,107.250003,108.249999,105.999999,106.125003,30489600,0.99479\n1991-03-27,105.000003,109.250004,105.000003,107.750001,91932800,1.010022\n1991-03-26,98.750001,105.250002,98.750001,105.124998,89926400,0.985416\n1991-03-25,94.000002,98.750001,94.000002,98.250003,59820800,0.920972\n1991-03-22,94.50,95.499996,92.999997,93.750003,95686400,0.87879\n1991-03-21,99.499998,100.750002,94.000002,94.749999,119187200,0.888164\n1991-03-20,99.00,101.000001,98.750001,99.00,83216000,0.928002\n1991-03-19,98.250003,101.000001,96.75,99.00,92505600,0.928002\n1991-03-18,96.250002,99.749997,96.000003,99.249999,66214400,0.930345\n1991-03-15,98.250003,98.750001,96.250002,96.624996,76928000,0.905739\n1991-03-14,101.499999,101.499999,96.999999,98.000004,100214400,0.918628\n1991-03-13,96.000003,101.124996,96.000003,100.500003,110265600,0.942063\n1991-03-12,98.250003,98.874996,95.625,95.750004,152883200,0.897537\n1991-03-11,101.749998,102.500004,97.749996,99.249999,160966400,0.930345\n1991-03-08,104.499996,105.999999,101.749998,102.500004,134697600,0.96081\n1991-03-07,104.249997,107.500002,103.50,103.999998,165388800,0.974871\n1991-03-06,112.50,112.999998,106.749996,107.250003,101088000,1.005336\n1991-03-05,107.250003,112.50,107.000004,111.500004,76352000,1.045174\n1991-03-04,105.75,107.500002,104.499996,107.000004,47020800,1.002992\n1991-03-01,103.000002,106.249998,101.999997,105.75,77721600,0.991275\n1991-02-28,105.999999,106.249998,103.250001,103.749999,55008000,0.972527\n1991-02-27,102.249996,105.75,101.25,105.250002,87670400,0.986588\n1991-02-26,101.499999,102.500004,100.500003,101.749998,55539200,0.95378\n1991-02-25,103.250001,103.999998,101.499999,103.000002,88521600,0.965497\n1991-02-22,99.749997,104.499996,99.749997,102.249996,105340800,0.958467\n1991-02-21,103.000002,103.50,99.999996,99.999996,68275200,0.937376\n1991-02-20,101.749998,103.999998,101.499999,102.750003,52550400,0.963154\n1991-02-19,102.249996,103.50,101.499999,102.500004,66560000,0.96081\n1991-02-15,101.499999,104.249997,101.25,103.250001,115449600,0.96784\n1991-02-14,105.250002,105.500001,99.00,100.750002,133702400,0.944406\n1991-02-13,102.500004,105.624996,101.749998,105.500001,95491200,0.988931\n1991-02-12,103.250001,104.750004,102.500004,103.250001,96204800,0.96784\n1991-02-11,104.125002,104.499996,102.249996,104.249997,152336000,0.977214\n1991-02-08,103.000002,104.750004,101.749998,103.999998,74230400,0.974871\n1991-02-07,106.249998,108.999996,102.249996,103.000002,133462400,0.965497\n1991-02-06,101.000001,106.499997,100.500003,105.75,106348800,0.991275\n1991-02-05,99.249999,101.999997,98.000004,101.25,88736000,0.949093\n1991-02-04,99.999996,100.750002,98.000004,99.125004,88233600,0.929174\n1991-02-01,99.00,101.000001,97.249998,99.749997,117878400,0.935032\n1991-01-31,96.500001,99.499998,96.000003,98.124999,111417600,0.9198\n1991-01-30,92.499999,96.500001,91.500003,96.250002,148582400,0.902224\n1991-01-29,92.25,94.374996,90.00,92.499999,146979200,0.867073\n1991-01-28,89.000004,94.000002,89.000004,92.25,130985600,0.864729\n1991-01-25,90.749997,90.999996,89.000004,89.500002,86889600,0.838951\n1991-01-24,89.250003,90.875001,88.749996,90.499998,86083200,0.848325\n1991-01-23,88.249998,90.249999,88.249998,89.000004,77081600,0.834264\n1991-01-22,89.624997,90.999996,87.374997,88.875,113715200,0.833093\n1991-01-21,84.624999,90.00,84.624999,89.500002,154512000,0.838951\n1991-01-18,82.500003,85.50,82.250004,85.250001,103030400,0.799113\n1991-01-17,85.999998,86.249997,83.749998,83.999997,163526400,0.787396\n1991-01-16,78.500001,82.874997,78.250002,82.250004,139913600,0.770992\n1991-01-15,76.749999,79.499997,76.749999,78.374997,83436800,0.734668\n1991-01-14,77.249997,77.499996,75.500004,76.749999,58656000,0.719436\n1991-01-11,78.500001,78.999999,76.749999,78.000003,62006400,0.731153\n1991-01-10,74.25,78.75,74.25,78.250002,123888000,0.733497\n1991-01-09,74.000001,75.750003,73.500003,74.000001,115622400,0.693658\n1991-01-08,74.749998,75.249996,72.999996,73.500003,76438400,0.688971\n1991-01-07,75.249996,77.750004,74.749998,74.875002,87552000,0.70186\n1991-01-04,74.999997,76.50,74.999997,75.874998,58483200,0.711234\n1991-01-03,74.749998,76.000002,74.749998,75.249996,52822400,0.705375\n1991-01-02,74.999997,75.249996,74.749998,74.749998,38105600,0.700688\n1990-12-31,74.999997,75.249996,74.499999,75.249996,23702400,0.705375\n1990-12-28,74.499999,75.249996,74.25,74.999997,20265600,0.703032\n1990-12-27,74.999997,75.249996,74.499999,74.749998,22627200,0.700688\n1990-12-26,75.249996,75.750003,74.499999,74.999997,16214400,0.703032\n1990-12-24,75.500004,75.500004,74.749998,75.249996,13548800,0.705375\n1990-12-21,75.750003,76.000002,75.249996,75.750003,33468800,0.710062\n1990-12-20,74.25,76.000002,74.000001,75.500004,46992000,0.707719\n1990-12-19,75.375,75.750003,74.749998,74.875002,34262400,0.70186\n1990-12-18,74.499999,75.750003,74.25,75.249996,51872000,0.705375\n1990-12-17,72.999996,74.25,72.499998,74.000001,27286400,0.693658\n1990-12-14,72.999996,74.25,72.499998,73.624998,48633600,0.690143\n1990-12-13,72.999996,73.500003,71.750001,72.749997,50707200,0.681941\n1990-12-12,71.750001,72.749997,70.500001,72.499998,71558400,0.679597\n1990-12-11,73.250004,74.499999,72.00,72.125004,61766400,0.676082\n1990-12-10,73.250004,75.375,72.749997,74.000001,55526400,0.693658\n1990-12-07,74.25,75.249996,72.249999,74.25,81920000,0.696001\n1990-12-06,76.250001,76.749999,74.000001,74.749998,108201600,0.700688\n1990-12-05,74.499999,75.750003,74.25,75.249996,68630400,0.705375\n1990-12-04,73.500003,75.249996,72.999996,74.499999,54547200,0.698345\n1990-12-03,73.250004,74.499999,72.749997,73.874997,68240000,0.692486\n1990-11-30,71.249999,74.25,70.500001,72.249999,72163200,0.677254\n1990-11-29,70.249998,71.249999,69.75,71.249999,65865600,0.66788\n1990-11-28,72.249999,72.749997,70.249998,70.375002,77619200,0.659678\n1990-11-27,70.500001,72.249999,69.75,71.875,63417600,0.673739\n1990-11-26,68.50,70.500001,67.749999,70.249998,47577600,0.658506\n1990-11-23,69.250002,70.249998,68.50,68.75,22060800,0.644446\n1990-11-21,67.999998,68.999999,67.000002,68.75,60739200,0.644446\n1990-11-20,69.250002,70.500001,68.125002,68.250001,68864000,0.639759\n1990-11-19,67.999998,69.75,67.999998,69.500001,45552000,0.651476\n1990-11-16,67.50,68.75,67.250001,67.999998,67075200,0.637415\n1990-11-15,68.999999,69.250002,67.250001,67.874999,63129600,0.636244\n1990-11-14,68.50,69.999999,68.250001,69.500001,59721600,0.651476\n1990-11-13,68.75,69.500001,67.749999,68.625,67654400,0.643274\n1990-11-12,66.000001,69.250002,66.000001,68.874999,87657600,0.645618\n1990-11-09,64.750002,65.499999,64.499999,64.750002,43344000,0.606951\n1990-11-08,63.499998,64.750002,63.00,63.499998,43462400,0.595234\n1990-11-07,63.750001,64.750002,63.499998,63.750001,63100800,0.597577\n1990-11-06,65.749998,66.50,63.499998,64.25,59212800,0.602264\n1990-11-05,65.25,66.000001,64.750002,65.624999,50700800,0.615153\n1990-11-02,63.499998,65.749998,63.249999,65.000001,74764800,0.609294\n1990-11-01,63.00,64.25,62.750001,63.499998,49440000,0.595234\n1990-10-31,64.499999,65.25,63.750001,63.750001,61200000,0.597577\n1990-10-30,62.500002,64.25,62.00,63.875001,52563200,0.598749\n1990-10-29,63.750001,64.25,62.00,62.500002,67881600,0.58586\n1990-10-26,63.750001,64.499999,63.249999,63.374999,59126400,0.594062\n1990-10-25,65.499999,66.25,64.00,64.750002,51497600,0.606951\n1990-10-24,63.499998,65.499999,63.249999,65.375,54732800,0.612809\n1990-10-23,63.750001,65.749998,63.249999,64.25,71884800,0.602264\n1990-10-22,62.00,64.750002,61.75,64.00,80294400,0.59992\n1990-10-19,62.00,63.249999,60.500001,62.00,170336000,0.581173\n1990-10-18,57.000001,61.500001,56.749998,61.124999,123737600,0.572971\n1990-10-17,54.750001,56.749998,53.500002,56.499999,135820800,0.529617\n1990-10-16,56.749998,57.624999,54.00,54.625002,300886400,0.512042\n1990-10-15,57.749999,58.000002,55.499999,56.499999,130332800,0.529617\n1990-10-12,58.50,58.749999,54.00,57.000001,109251200,0.534304\n1990-10-11,59.75,60.250002,57.000001,58.000002,83811200,0.543678\n1990-10-10,62.00,62.249999,58.999998,59.50,115593600,0.557739\n1990-10-09,65.25,66.000001,62.500002,63.00,66374400,0.590547\n1990-10-08,66.000001,66.50,64.499999,66.000001,38678400,0.618668\n1990-10-05,63.00,65.749998,62.249999,64.750002,82099200,0.606951\n1990-10-04,65.25,65.749998,64.00,64.125,69292800,0.601092\n1990-10-03,65.499999,67.375,65.25,65.749998,57600000,0.616325\n1990-10-02,68.250001,68.50,65.499999,65.875002,83465600,0.617496\n1990-10-01,64.750002,67.50,64.499999,67.125001,131619200,0.629213\n1990-09-28,58.250001,63.499998,58.000002,63.00,97980800,0.590547\n1990-09-27,60.999999,61.500001,58.250001,59.250001,65724800,0.555395\n1990-09-26,60.500001,60.75,59.50,60.250002,39267200,0.564769\n1990-09-25,59.625,60.500001,58.749999,60.375001,53308800,0.565941\n1990-09-24,59.50,59.999999,57.50,58.50,81436800,0.548365\n1990-09-21,59.75,60.75,58.50,60.500001,79891200,0.567112\n1990-09-20,61.500001,62.00,59.75,59.75,52444800,0.560082\n1990-09-19,63.00,63.249999,61.75,62.00,52694400,0.581173\n1990-09-18,60.625,62.374998,59.75,61.75,60636800,0.57883\n1990-09-17,59.50,61.75,59.250001,60.75,70390400,0.569456\n1990-09-14,57.000001,60.250002,56.375,59.75,67670400,0.560082\n1990-09-13,58.000002,58.50,57.000001,57.50,49865600,0.538991\n1990-09-12,56.25,57.749999,55.750002,57.375,75014400,0.537819\n1990-09-11,56.000001,56.499999,54.499998,55.499999,78867200,0.520244\n1990-09-10,58.749999,59.999999,55.750002,55.750002,74246400,0.522587\n1990-09-07,57.000001,58.999998,56.499999,57.749999,53702400,0.541334\n1990-09-06,58.000002,58.50,56.25,57.50,115616000,0.538991\n1990-09-05,62.500002,63.00,58.50,58.999998,54675200,0.553052\n1990-09-04,60.999999,62.500002,60.75,62.249999,47376000,0.583516\n1990-08-31,59.999999,62.00,59.250001,61.500001,40736000,0.576486\n1990-08-30,60.75,62.374998,59.999999,59.999999,65379200,0.562425\n1990-08-29,62.500002,63.750001,59.999999,60.500001,77952000,0.567112\n1990-08-28,60.250002,63.249999,59.999999,62.875,79824000,0.589375\n1990-08-27,58.999998,61.249998,58.999998,60.75,110115200,0.569456\n1990-08-24,52.249998,57.749999,52.249998,57.25,95443200,0.536648\n1990-08-23,52.500001,53.750001,50.999999,51.75,107443200,0.485092\n1990-08-22,55.00,55.499999,53.374998,53.750001,79232000,0.503839\n1990-08-21,54.249999,54.750001,50.75,54.249999,165648000,0.508526\n1990-08-20,60.250002,60.500001,55.499999,55.499999,113600000,0.520244\n1990-08-17,60.999999,61.75,59.999999,60.250002,95225600,0.564769\n1990-08-16,64.00,64.499999,61.75,61.75,53328000,0.57883\n1990-08-15,64.750002,65.749998,64.25,64.25,51408000,0.602264\n1990-08-14,65.25,65.875002,63.750001,64.25,33708800,0.602264\n1990-08-13,63.750001,65.499999,63.249999,65.000001,53942400,0.609294\n1990-08-10,65.125,65.749998,62.750001,64.499999,73184000,0.604607\n1990-08-09,64.00,65.749998,63.249999,65.125,77052800,0.610466\n1990-08-08,62.500002,64.00,62.00,63.499998,86259200,0.595234\n1990-08-07,61.249998,62.249999,59.999999,61.249998,91065600,0.574143\n1990-08-06,61.500001,62.00,58.50,60.500001,113184000,0.567112\n1990-08-03,65.499999,65.749998,60.375001,63.249999,117177600,0.59289\n1990-08-02,65.499999,66.749999,64.25,66.000001,91769600,0.618668\n1990-08-01,66.25,67.250001,63.750001,66.749999,111113600,0.625698\n1990-07-31,68.250001,68.625,66.000001,66.50,42307200,0.623355\n1990-07-30,68.50,68.999999,65.749998,67.999998,87955200,0.637415\n1990-07-27,68.50,69.999999,67.749999,68.999999,51017600,0.646789\n1990-07-26,71.249999,74.000001,66.000001,68.75,303321600,0.644446\n1990-07-25,69.999999,71.750001,68.75,71.500002,60147200,0.670224\n1990-07-24,72.499998,72.499998,66.749999,69.500001,137100800,0.651476\n1990-07-23,73.250004,74.000001,71.249999,72.00,74201600,0.674911\n1990-07-20,76.999998,78.250002,72.999996,73.250004,87724800,0.686628\n1990-07-19,75.375,76.749999,73.750002,76.749999,63132800,0.719436\n1990-07-18,77.249997,77.750004,75.500004,76.000002,41849600,0.712406\n1990-07-17,79.375002,79.499997,76.999998,77.750004,54473600,0.72881\n1990-07-16,78.75,80.750001,78.500001,79.249998,48729600,0.74287\n1990-07-13,77.750004,80.500002,77.499996,78.374997,93628800,0.734668\n1990-07-12,75.249996,77.750004,75.249996,77.499996,89040000,0.726466\n1990-07-11,74.000001,75.750003,73.250004,75.500004,28918400,0.707719\n1990-07-10,74.25,74.999997,73.500003,73.750002,29696000,0.691315\n1990-07-09,73.500003,74.749998,73.250004,74.25,37315200,0.696001\n1990-07-06,72.125004,74.000001,71.750001,73.250004,41801600,0.686628\n1990-07-05,71.500002,72.499998,70.75,72.249999,61852800,0.677254\n1990-07-03,73.374999,73.500003,71.500002,72.00,79257600,0.674911\n1990-07-02,76.000002,76.000002,73.624998,73.750002,35472000,0.691315\n1990-06-29,76.50,76.50,75.249996,76.000002,34953600,0.712406\n1990-06-28,76.625004,77.249997,76.124997,76.50,30051200,0.717092\n1990-06-27,74.749998,76.50,74.499999,76.250001,35760000,0.714749\n1990-06-26,75.249996,75.624999,74.499999,74.749998,50198400,0.700688\n1990-06-25,75.624999,76.50,74.25,74.499999,68979200,0.698345\n1990-06-22,77.249997,77.750004,75.500004,75.750003,34032000,0.710062\n1990-06-21,77.499996,77.750004,76.000002,76.999998,34304000,0.721779\n1990-06-20,75.375,77.750004,74.999997,77.625,39561600,0.727638\n1990-06-19,74.749998,75.500004,73.750002,74.999997,41715200,0.703032\n1990-06-18,75.750003,76.250001,74.499999,74.875002,52790400,0.70186\n1990-06-15,74.499999,76.999998,74.499999,76.000002,51552000,0.712406\n1990-06-14,76.50,76.749999,74.25,75.500004,58204800,0.707719\n1990-06-13,75.874998,77.750004,75.125001,76.50,80265600,0.717092\n1990-06-12,75.500004,76.000002,74.499999,75.874998,46656000,0.711234\n1990-06-11,72.999996,75.500004,72.999996,74.875002,58236800,0.70186\n1990-06-08,72.00,73.750002,71.500002,73.500003,63766400,0.688971\n1990-06-07,73.250004,73.750002,71.00,72.00,90118400,0.674911\n1990-06-06,73.250004,74.499999,72.499998,72.999996,86288000,0.684284\n1990-06-05,77.249997,77.499996,72.749997,73.374999,80256000,0.687799\n1990-06-04,74.875002,77.249997,74.000001,76.50,59158400,0.717092\n1990-06-01,73.250004,75.249996,72.999996,75.125001,69065600,0.704204\n1990-05-31,74.749998,75.500004,72.499998,72.999996,69436800,0.684284\n1990-05-30,76.124997,76.50,74.749998,75.500004,65072000,0.707719\n1990-05-29,74.25,75.500004,74.000001,75.249996,61478400,0.705375\n1990-05-25,74.25,76.250001,74.000001,74.25,104688000,0.696001\n1990-05-24,76.749999,78.75,76.000002,76.50,146649600,0.717092\n1990-05-23,72.00,76.000002,71.875,75.874998,141180800,0.711234\n1990-05-22,71.00,72.249999,68.999999,71.500002,142435200,0.670224\n1990-05-21,68.75,72.249999,68.75,70.249998,159593600,0.658506\n1990-05-18,64.624998,69.250002,64.499999,68.250001,101820800,0.639759\n1990-05-17,64.750002,65.25,64.25,64.750002,41731200,0.606951\n1990-05-16,64.499999,64.750002,63.499998,64.750002,38553600,0.606951\n1990-05-15,65.499999,65.749998,64.25,64.750002,54118400,0.606951\n1990-05-14,66.25,66.50,65.499999,65.749998,47232000,0.616325\n1990-05-11,65.000001,66.000001,63.249999,65.499999,49164800,0.613981\n1990-05-10,63.249999,65.000001,62.750001,64.499999,48800000,0.604607\n1990-05-09,62.875,63.249999,62.00,62.750001,35164800,0.588203\n1990-05-08,62.750001,63.499998,62.249999,62.750001,50822400,0.588203\n1990-05-07,62.00,66.000001,61.500001,64.00,97347200,0.59992\n1990-05-04,59.50,61.75,58.999998,61.75,47811200,0.57883\n1990-05-03,58.50,59.75,58.250001,58.999998,45891200,0.553052\n1990-05-02,57.25,58.50,57.25,58.250001,33264000,0.546021\n1990-05-01,58.749999,58.749999,56.749998,57.125001,52473600,0.535476\n1990-04-30,56.25,58.000002,55.750002,58.000002,51449600,0.543678\n1990-04-27,57.125001,57.25,55.624998,56.25,57123200,0.527274\n1990-04-26,58.50,58.749999,57.25,57.375,46294400,0.537819\n1990-04-25,58.250001,58.749999,57.000001,58.000002,53868800,0.543678\n1990-04-24,59.75,59.75,56.499999,58.000002,47913600,0.543678\n1990-04-23,58.874999,59.50,57.25,58.999998,64876800,0.553052\n1990-04-20,59.999999,60.500001,58.749999,59.250001,44659200,0.555395\n1990-04-19,59.999999,61.249998,59.250001,59.50,58003200,0.557739\n1990-04-18,61.625001,61.75,58.749999,60.625,97795200,0.568284\n1990-04-17,60.625,63.00,59.75,62.00,66777600,0.581173\n1990-04-16,60.999999,61.75,60.124998,60.75,39468800,0.569456\n1990-04-12,121.749999,121.999998,119.999997,120.750003,48252800,0.565941\n1990-04-11,118.500003,121.000002,118.250004,121.000002,70371200,0.567112\n1990-04-10,114.624996,117.999996,114.500001,117.999996,45187200,0.553052\n1990-04-09,113.750004,115.249998,113.750004,114.500001,31174400,0.536648\n1990-04-06,114.75,115.249998,113.249997,114.250002,72876800,0.535476\n1990-04-05,116.874996,117.125004,114.500001,114.500001,66368000,0.536648\n1990-04-04,116.000004,118.750002,115.499997,117.00,79644800,0.548365\n1990-04-03,112.749999,116.250003,112.50,116.000004,84643200,0.543678\n1990-04-02,109.750002,112.374996,109.250004,111.500004,74057600,0.522587\n1990-03-30,110.000001,110.999997,109.250004,110.749998,36691200,0.519072\n1990-03-29,110.375004,112.749999,110.000001,110.499999,64784000,0.5179\n1990-03-28,112.250001,112.250001,108.499998,110.999997,99532800,0.520244\n1990-03-27,111.125001,112.999998,110.749998,112.50,52515200,0.527274\n1990-03-26,110.499999,112.50,110.375004,111.500004,55929600,0.522587\n1990-03-23,112.000002,113.249997,108.999996,110.25,53596800,0.516728\n1990-03-22,113.499996,113.750004,110.25,111.249996,92419200,0.521415\n1990-03-21,112.875003,115.499997,112.250001,113.249997,69840000,0.530789\n1990-03-20,116.500002,116.750001,112.50,112.999998,92144000,0.529617\n1990-03-19,113.750004,117.00,112.999998,116.500002,81171200,0.546021\n1990-03-16,112.000002,115.249998,111.750003,114.000003,118899200,0.534304\n1990-03-15,107.874996,111.750003,107.750001,110.999997,81676800,0.520244\n1990-03-14,107.250003,108.749997,105.999999,107.874996,130966400,0.505597\n1990-03-13,108.499998,108.999996,106.249998,106.249998,85203200,0.497981\n1990-03-12,106.249998,108.749997,105.999999,108.249999,68873600,0.507355\n1990-03-09,105.999999,108.00,105.250002,106.499997,75744000,0.499153\n1990-03-08,103.000002,107.250003,101.749998,106.249998,88976000,0.497981\n1990-03-07,104.750004,105.500001,102.750003,102.750003,47606400,0.481577\n1990-03-06,104.750004,105.000003,102.500004,104.499996,68630400,0.489779\n1990-03-05,103.50,105.75,102.249996,105.250002,75526400,0.493294\n1990-03-02,100.250004,104.375001,100.125,103.749999,100208000,0.486264\n1990-03-01,98.500002,101.749998,98.500002,99.999996,76867200,0.468688\n1990-02-28,98.000004,99.749997,98.000004,98.750001,39312000,0.462829\n1990-02-27,99.499998,99.499998,98.000004,98.000004,62019200,0.459314\n1990-02-26,97.499997,99.999996,97.249998,99.249999,69219200,0.465173\n1990-02-23,95.750004,97.749996,95.499996,97.499997,56851200,0.456971\n1990-02-22,96.75,98.250003,96.250002,96.374997,60809600,0.451698\n1990-02-21,98.750001,99.999996,95.750004,96.124998,103347200,0.450526\n1990-02-20,97.749996,100.500003,96.999999,100.250004,132652800,0.46986\n1990-02-16,98.250003,98.750001,97.749996,98.000004,70876800,0.459314\n1990-02-15,94.999998,98.000004,94.999998,96.999999,89494400,0.454627\n1990-02-14,95.249997,95.249997,94.50,94.999998,35868800,0.445253\n1990-02-13,94.999998,95.249997,94.50,94.749999,58752000,0.444082\n1990-02-12,94.50,95.499996,94.000002,94.749999,56086400,0.444082\n1990-02-09,94.250001,94.749999,94.000002,94.50,62380800,0.44291\n1990-02-08,93.624999,94.999998,93.249996,94.250001,95225600,0.441738\n1990-02-07,93.500004,94.749999,92.999997,93.249996,134150400,0.437051\n1990-02-06,94.000002,94.250001,92.25,94.000002,81964800,0.440567\n1990-02-05,93.624999,94.250001,93.249996,94.250001,59731200,0.441738\n1990-02-02,92.999997,95.499996,92.999997,93.750003,71395200,0.439395\n1990-02-01,92.499999,94.250001,92.499999,93.750003,89193600,0.439395\n1990-01-31,92.000001,92.499999,91.250004,92.499999,112937600,0.433536\n1990-01-30,91.750002,92.499999,90.00,91.250004,73107200,0.427678\n1990-01-29,91.500003,92.25,90.249999,91.500003,55078400,0.428849\n1990-01-26,90.499998,91.250004,90.00,90.749997,68083200,0.425334\n1990-01-25,91.500003,92.499999,90.499998,90.749997,112752000,0.425334\n1990-01-24,87.999999,90.749997,87.124998,90.749997,180345600,0.425334\n1990-01-23,90.999996,91.250004,89.250003,89.750001,139347200,0.420647\n1990-01-22,94.000002,94.000002,90.499998,90.749997,167686400,0.425334\n1990-01-19,95.249997,96.000003,93.500004,94.124997,99257600,0.441152\n1990-01-18,89.624997,94.999998,89.500002,94.999998,292361600,0.445253\n1990-01-17,87.999999,90.499998,87.000003,87.500001,97587200,0.410102\n1990-01-16,85.50,89.250003,84.500004,88.749996,80092800,0.41596\n1990-01-15,85.749999,87.000003,85.250001,86.125002,62467200,0.403657\n1990-01-12,85.124997,87.250002,83.999997,86.125002,148908800,0.403657\n1990-01-11,88.749996,89.500002,85.000002,86.499996,95772800,0.405415\n1990-01-10,90.00,91.250004,88.125003,88.249998,103766400,0.413617\n1990-01-09,90.999996,92.000001,90.249999,90.749997,70300800,0.425334\n1990-01-08,89.500002,90.999996,88.499997,90.999996,58982400,0.426506\n1990-01-05,91.500003,92.000001,89.500002,89.624997,69564800,0.420061\n1990-01-04,89.250003,92.000001,88.749996,91.874997,125740800,0.430607\n1990-01-03,89.500002,90.249999,88.499997,89.250003,113772800,0.418304\n1990-01-02,87.250002,88.749996,86.125002,88.749996,53033600,0.41596\n1989-12-29,85.50,88.249998,85.250001,87.000003,77628800,0.407758\n1989-12-28,83.499999,85.749999,83.000001,85.250001,123091200,0.399556\n1989-12-27,85.999998,87.000003,85.250001,86.249997,62796800,0.404243\n1989-12-26,85.875003,86.375001,84.750003,85.50,23817600,0.400728\n1989-12-22,83.499999,86.249997,82.750002,85.749999,54892800,0.4019\n1989-12-21,82.750002,83.499999,81.249999,83.499999,55020800,0.391354\n1989-12-20,81.249999,83.000001,80.750001,82.750002,111008000,0.387839\n1989-12-19,78.250002,80.500002,77.750004,80.374998,70473600,0.376708\n1989-12-18,77.249997,78.999999,76.999998,78.250002,78435200,0.366748\n1989-12-15,78.250002,78.500001,74.999997,76.999998,107164800,0.36089\n1989-12-14,78.999999,79.749996,78.000003,78.000003,61516800,0.365577\n1989-12-13,80.750001,82.500003,79.249998,80.000004,95788800,0.37495\n1989-12-12,83.749998,83.749998,80.500002,82.500003,93628800,0.386668\n1989-12-11,84.750003,84.750003,81.999996,83.000001,103376000,0.389011\n1989-12-08,85.50,85.999998,83.000001,84.750003,107625600,0.397213\n1989-12-07,83.999997,86.249997,83.999997,85.50,40348800,0.400728\n1989-12-06,86.499996,87.000003,84.500004,85.250001,57382400,0.399556\n1989-12-05,86.750004,87.250002,85.999998,86.750004,44048000,0.406587\n1989-12-04,85.000002,87.250002,84.375,86.249997,40534400,0.404243\n1989-12-01,87.124998,87.75,84.874998,85.000002,52070400,0.398385\n1989-11-30,83.999997,87.250002,83.749998,87.000003,111209600,0.407758\n1989-11-29,87.500001,87.999999,84.249996,85.50,85894400,0.400728\n1989-11-28,87.000003,88.249998,86.249997,87.000003,56662400,0.407758\n1989-11-27,87.500001,87.75,85.749999,86.750004,37280000,0.406587\n1989-11-24,88.875,89.000004,87.500001,87.624996,17971200,0.410688\n1989-11-22,88.249998,88.499997,87.500001,88.249998,38230400,0.413617\n1989-11-21,86.499996,88.499997,86.499996,88.125003,67116800,0.413031\n1989-11-20,86.750004,86.750004,84.500004,86.499996,56937600,0.405415\n1989-11-17,87.624996,88.249998,86.750004,86.874999,31651200,0.407173\n1989-11-16,89.000004,89.250003,86.249997,87.500001,68054400,0.410102\n1989-11-15,86.750004,89.250003,86.249997,88.499997,94492800,0.414789\n1989-11-14,88.749996,89.250003,85.999998,86.499996,95241600,0.405415\n1989-11-13,84.500004,88.249998,83.749998,88.125003,178905600,0.413031\n1989-11-10,83.999997,85.000002,83.749998,84.500004,59168000,0.396041\n1989-11-09,83.999997,84.500004,82.500003,83.749998,111526400,0.392526\n1989-11-08,82.125,84.500004,81.999996,83.25,106486400,0.390183\n1989-11-07,77.499996,82.374999,77.249997,81.00,131542400,0.379637\n1989-11-06,78.250002,79.749996,76.50,77.249997,88025600,0.362061\n1989-11-03,76.50,78.75,76.250001,78.250002,98755200,0.366748\n1989-11-02,80.874996,80.874996,76.000002,76.250001,226051200,0.357375\n1989-11-01,81.749997,83.000001,81.749997,82.125,74649600,0.38491\n1989-10-31,80.250003,81.999996,80.000004,81.749997,56563200,0.383152\n1989-10-30,78.000003,79.749996,77.874999,79.625001,45920000,0.373193\n1989-10-27,77.750004,78.000003,76.250001,76.999998,97040000,0.36089\n1989-10-26,78.75,80.250003,77.499996,77.750004,135459200,0.364405\n1989-10-25,81.499998,82.750002,79.249998,79.749996,71481600,0.373779\n1989-10-24,82.500003,82.500003,78.75,80.874996,157088000,0.379051\n1989-10-23,84.750003,85.749999,82.500003,83.124996,60912000,0.389597\n1989-10-20,83.999997,85.50,82.500003,85.250001,93542400,0.399556\n1989-10-19,81.00,85.999998,80.250003,84.249996,179424000,0.39487\n1989-10-18,78.875004,80.750001,78.500001,80.500002,134784000,0.377294\n1989-10-17,75.249996,81.499998,74.25,78.624996,177206400,0.368506\n1989-10-16,70.75,76.250001,68.999999,75.750003,253065600,0.355031\n1989-10-13,77.750004,78.000003,72.999996,73.500003,102643200,0.344486\n1989-10-12,80.000004,80.500002,78.250002,78.500001,58880000,0.36792\n1989-10-11,80.250003,80.500002,78.999999,80.000004,106400000,0.37495\n1989-10-10,82.500003,83.000001,80.750001,81.249999,68297600,0.380809\n1989-10-09,79.499997,81.999996,78.999999,81.749997,58534400,0.383152\n1989-10-06,79.625001,80.500002,78.250002,79.749996,87609600,0.373779\n1989-10-05,75.500004,82.250004,75.249996,79.249998,284758400,0.371435\n1989-10-04,68.999999,75.750003,68.50,75.500004,260019200,0.353859\n1989-10-03,70.500001,70.500001,68.874999,68.999999,68918400,0.323395\n1989-10-02,68.250001,69.999999,67.999998,69.625,50428800,0.326324\n1989-09-29,67.999998,69.500001,67.749999,68.50,64323200,0.321051\n1989-09-28,66.50,67.999998,66.50,67.999998,41427200,0.318708\n1989-09-27,66.25,67.375,65.749998,66.624999,69235200,0.312263\n1989-09-26,67.000002,67.50,66.50,67.250001,39987200,0.315193\n1989-09-25,66.000001,67.999998,65.499999,67.000002,69939200,0.314021\n1989-09-22,65.499999,66.000001,64.750002,66.000001,43948800,0.309334\n1989-09-21,65.749998,66.749999,64.499999,65.499999,89350400,0.306991\n1989-09-20,62.750001,65.000001,62.249999,65.000001,72128000,0.304647\n1989-09-19,63.750001,64.00,62.500002,62.500002,49203200,0.29293\n1989-09-18,62.500002,63.499998,62.500002,63.499998,39110400,0.297617\n1989-09-15,64.00,64.499999,62.500002,62.750001,89148800,0.294102\n1989-09-14,62.750001,64.499999,62.249999,63.750001,78163200,0.298789\n1989-09-13,60.999999,63.499998,60.500001,62.249999,181020800,0.291758\n1989-09-12,59.50,60.999999,59.250001,60.250002,67795200,0.282384\n1989-09-11,58.749999,59.50,58.50,59.375001,27907200,0.278283\n1989-09-08,58.000002,59.50,57.749999,58.999998,39785600,0.276526\n1989-09-07,58.999998,59.250001,58.000002,58.250001,41904000,0.273011\n1989-09-06,59.75,59.999999,58.749999,59.250001,42377600,0.277698\n1989-09-05,59.75,60.999999,59.625,59.999999,93340800,0.281213\n1989-09-01,58.999998,60.250002,58.749999,59.874999,44409600,0.280627\n1989-08-31,59.50,59.75,58.749999,58.749999,14198400,0.275354\n1989-08-30,58.749999,59.625,58.50,59.250001,40377600,0.277698\n1989-08-29,59.874999,59.999999,58.375,58.50,54416000,0.274182\n1989-08-28,58.749999,59.50,58.250001,59.125002,28540800,0.277112\n1989-08-25,58.749999,59.250001,57.749999,58.874999,85145600,0.27594\n1989-08-24,59.874999,60.500001,58.250001,58.999998,92764800,0.276526\n1989-08-23,58.625,59.625,58.000002,59.250001,46092800,0.277698\n1989-08-22,56.000001,58.749999,56.000001,58.375,64771200,0.273597\n1989-08-21,57.50,57.874998,56.000001,56.125,32096000,0.263051\n1989-08-18,56.499999,57.749999,56.499999,57.50,24912000,0.269496\n1989-08-17,55.750002,56.749998,55.25,56.499999,39958400,0.264809\n1989-08-16,57.749999,58.000002,55.499999,55.875001,46668800,0.261879\n1989-08-15,57.000001,58.000002,56.624999,57.50,17856000,0.269496\n1989-08-14,57.749999,57.749999,57.000001,57.000001,68988800,0.267152\n1989-08-11,58.999998,59.50,57.749999,57.749999,61472000,0.270667\n1989-08-10,58.999998,58.999998,58.250001,58.50,48339200,0.274182\n1989-08-09,58.874999,59.999999,58.749999,58.749999,113772800,0.275354\n1989-08-08,57.50,59.250001,57.50,58.999998,110547200,0.276526\n1989-08-07,57.749999,58.000002,57.000001,57.749999,93571200,0.270667\n1989-08-04,54.750001,57.50,54.499998,57.000001,178128000,0.267152\n1989-08-03,54.374999,55.25,54.249999,55.00,27590400,0.257778\n1989-08-02,54.00,54.750001,54.00,54.249999,28368000,0.254263\n1989-08-01,54.750001,55.25,54.00,54.249999,62134400,0.254263\n1989-07-31,54.00,55.00,53.750001,54.750001,33334400,0.256607\n1989-07-28,54.00,54.499998,53.249999,54.249999,29216000,0.254263\n1989-07-27,53.625001,54.00,53.249999,53.750001,45561600,0.25192\n1989-07-26,52.75,53.249999,51.999999,52.75,123638400,0.247233\n1989-07-25,55.00,57.000001,51.500001,51.999999,326028800,0.243718\n1989-07-24,54.750001,55.750002,54.249999,55.25,38361600,0.25895\n1989-07-21,53.00,56.499999,52.75,55.25,99763200,0.25895\n1989-07-20,54.249999,55.25,53.500002,53.500002,44524800,0.250748\n1989-07-19,54.00,54.499998,53.249999,54.125,29763200,0.253677\n1989-07-18,53.249999,54.249999,53.249999,53.500002,42982400,0.250748\n1989-07-17,52.75,53.500002,52.500001,53.249999,31289600,0.249576\n1989-07-14,53.249999,53.500002,51.75,52.75,42768000,0.247233\n1989-07-13,53.124999,53.750001,52.500001,53.00,33408000,0.248405\n1989-07-12,53.00,53.500002,51.999999,53.249999,52156800,0.249576\n1989-07-11,54.875001,55.499999,53.249999,53.500002,43488000,0.250748\n1989-07-10,53.750001,55.00,53.500002,54.875001,27257600,0.257192\n1989-07-07,52.75,54.249999,52.625001,53.500002,41456000,0.250748\n1989-07-06,55.750002,56.000001,52.375002,52.75,94780800,0.247233\n1989-07-05,54.499998,55.499999,54.00,55.25,26537600,0.25895\n1989-07-03,53.124999,54.249999,53.124999,54.00,14688000,0.253091\n1989-06-30,51.999999,53.500002,51.250002,53.00,67248000,0.248405\n1989-06-29,52.875,52.875,51.250002,51.999999,77196800,0.243718\n1989-06-28,54.00,54.00,51.999999,52.75,57456000,0.247233\n1989-06-27,54.750001,55.25,53.750001,53.875,35897600,0.252506\n1989-06-26,55.25,55.499999,54.249999,54.750001,30240000,0.256607\n1989-06-23,55.499999,56.000001,55.25,55.374999,33536000,0.259536\n1989-06-22,55.25,55.499999,55.00,55.499999,36070400,0.260122\n1989-06-21,53.249999,56.000001,53.249999,55.00,80496000,0.257778\n1989-06-20,56.499999,56.749998,54.499998,54.499998,45804800,0.255435\n1989-06-19,57.000001,57.000001,55.499999,56.499999,27158400,0.264809\n1989-06-16,56.624999,57.000001,56.25,56.749998,47360000,0.26598\n1989-06-15,57.749999,57.749999,56.25,56.749998,52112000,0.26598\n1989-06-14,57.749999,58.000002,56.499999,57.749999,47302400,0.270667\n1989-06-13,58.375,58.50,57.25,57.25,40563200,0.268324\n1989-06-12,59.75,60.250002,58.625,58.999998,51680000,0.276526\n1989-06-09,59.75,60.124998,59.250001,59.75,36144000,0.280041\n1989-06-08,59.75,60.250002,59.50,59.75,29216000,0.280041\n1989-06-07,58.749999,59.999999,58.749999,59.75,44928000,0.280041\n1989-06-06,56.749998,58.625,56.499999,58.50,53897600,0.274182\n1989-06-05,58.50,58.50,56.499999,56.749998,61414400,0.26598\n1989-06-02,60.124998,60.250002,58.250001,58.250001,54041600,0.273011\n1989-06-01,60.250002,60.75,59.75,59.999999,62796800,0.281213\n1989-05-31,58.999998,60.999999,58.999998,60.500001,80969600,0.283556\n1989-05-30,58.999998,59.625,58.50,58.999998,63907200,0.276526\n1989-05-26,58.000002,58.999998,57.749999,58.874999,37884800,0.27594\n1989-05-25,57.50,58.50,57.000001,57.50,33840000,0.269496\n1989-05-24,56.125,57.50,55.750002,57.50,69363200,0.269496\n1989-05-23,58.250001,58.999998,56.25,56.624999,97545600,0.265395\n1989-05-22,58.250001,59.50,57.749999,59.250001,74275200,0.277698\n1989-05-19,58.125001,59.50,58.125001,58.250001,62566400,0.273011\n1989-05-18,57.25,58.625,57.25,58.250001,52572800,0.273011\n1989-05-17,56.375,58.000002,56.375,57.375,89811200,0.26891\n1989-05-16,54.750001,56.499999,54.499998,56.25,83433600,0.263637\n1989-05-15,54.125,55.00,54.00,54.750001,74736000,0.256607\n1989-05-12,54.625002,55.00,53.500002,54.249999,71091200,0.254263\n1989-05-11,54.249999,54.249999,53.500002,54.00,34400000,0.253091\n1989-05-10,53.500002,54.750001,53.249999,54.00,58752000,0.253091\n1989-05-09,51.75,53.500002,51.500001,53.00,54588800,0.248405\n1989-05-08,51.999999,52.249998,50.999999,51.500001,49001600,0.241374\n1989-05-05,53.249999,53.249999,51.75,51.999999,35827200,0.243718\n1989-05-04,54.249999,54.249999,52.249998,52.500001,37424000,0.246061\n1989-05-03,54.00,54.750001,54.00,54.00,28857600,0.253091\n1989-05-02,54.750001,55.00,53.500002,54.00,34371200,0.253091\n1989-05-01,55.374999,56.000001,54.249999,54.625002,33737600,0.256021\n1989-04-28,54.750001,56.25,53.750001,55.875001,69782400,0.261879\n1989-04-27,54.00,54.875001,54.00,54.750001,34588800,0.256607\n1989-04-26,55.00,55.00,53.625001,54.00,44508800,0.253091\n1989-04-25,55.499999,55.750002,54.499998,54.750001,24896000,0.256607\n1989-04-24,55.00,55.499999,54.499998,55.125,29331200,0.258364\n1989-04-21,56.000001,56.000001,55.00,55.25,58188800,0.25895\n1989-04-20,55.00,56.499999,54.499998,56.000001,138800000,0.262465\n1989-04-19,55.00,55.750002,54.499998,54.875001,168969600,0.257192\n1989-04-18,52.500001,53.249999,51.999999,53.249999,69334400,0.249576\n1989-04-17,51.250002,52.375002,50.75,51.500001,51638400,0.241374\n1989-04-14,49.250001,51.250002,49.250001,50.75,62624000,0.237859\n1989-04-13,47.749998,50.375001,47.499999,48.749999,92880000,0.228485\n1989-04-12,51.75,51.75,47.624999,48.125001,71020800,0.225556\n1989-04-11,51.500001,51.999999,50.375001,51.375001,28726400,0.240788\n1989-04-10,51.250002,52.249998,51.250002,51.375001,28668800,0.240788\n1989-04-07,51.250002,51.75,50.999999,51.250002,29446400,0.240203\n1989-04-06,50.50,51.500001,50.250001,51.250002,51680000,0.240203\n1989-04-05,49.999998,50.50,49.749999,50.375001,19641600,0.236102\n1989-04-04,50.250001,50.250001,49.50,49.999998,25027200,0.234344\n1989-04-03,49.999998,50.75,49.625,50.250001,35049600,0.235516\n1989-03-31,49.999998,50.250001,49.50,49.874999,29734400,0.233758\n1989-03-30,49.749999,49.999998,49.125001,49.874999,46742400,0.233758\n1989-03-29,49.749999,49.749999,49.250001,49.50,30009600,0.232\n1989-03-28,50.250001,50.50,49.250001,49.749999,70803200,0.233172\n1989-03-27,49.999998,50.625,49.50,49.749999,75542400,0.233172\n1989-03-23,48.749999,50.250001,48.749999,50.250001,87811200,0.235516\n1989-03-22,49.50,49.749999,48.50,49.000002,167024000,0.229657\n1989-03-21,46.750002,49.999998,46.25,49.874999,224467200,0.233758\n1989-03-20,46.374999,46.499999,45.750001,46.499999,238995200,0.21794\n1989-03-17,50.250001,50.50,46.00,46.499999,245577600,0.21794\n1989-03-16,50.75,51.500001,50.50,51.250002,102886400,0.240203\n1989-03-15,52.75,52.75,50.250001,50.250001,104889600,0.235516\n1989-03-14,53.249999,53.249999,52.249998,52.75,63718400,0.247233\n1989-03-13,51.999999,52.75,51.75,52.75,60204800,0.247233\n1989-03-10,51.500001,52.500001,50.999999,51.75,66902400,0.242546\n1989-03-09,52.75,52.75,51.500001,51.75,123305600,0.242546\n1989-03-08,53.750001,54.499998,52.375002,52.500001,253612800,0.246061\n1989-03-07,59.75,59.999999,53.249999,53.500002,788688000,0.250748\n1989-03-06,61.75,62.249999,60.999999,62.00,56633600,0.290586\n1989-03-03,60.75,62.00,60.500001,61.75,68947200,0.289415\n1989-03-02,59.250001,60.999999,59.250001,60.75,92304000,0.284728\n1989-03-01,59.999999,60.250002,59.250001,59.250001,59888000,0.277698\n1989-02-28,59.999999,60.250002,58.999998,59.50,43443200,0.278869\n1989-02-27,58.749999,60.250002,58.50,59.75,68787200,0.280041\n1989-02-24,60.250002,60.75,58.749999,58.749999,76016000,0.275354\n1989-02-23,60.250002,60.75,59.250001,60.375001,75945600,0.28297\n1989-02-22,61.500001,61.75,59.999999,59.999999,95513600,0.281213\n1989-02-21,62.249999,62.750001,61.500001,61.75,33753600,0.289415\n1989-02-17,63.00,63.249999,62.249999,62.500002,29692800,0.29293\n1989-02-16,62.500002,63.499998,61.249998,62.750001,61385600,0.294102\n1989-02-15,60.500001,62.249999,60.250002,62.249999,81936000,0.291758\n1989-02-14,61.875,62.249999,59.999999,60.250002,62956800,0.282384\n1989-02-13,61.500001,62.00,60.999999,61.249998,94073600,0.287071\n1989-02-10,63.00,63.499998,61.625001,61.875,129036800,0.290001\n1989-02-09,62.00,64.750002,61.75,63.750001,199036800,0.298789\n1989-02-08,62.00,64.00,61.500001,62.500002,133315200,0.29293\n1989-02-07,60.625,62.500002,60.500001,62.124999,127094400,0.291172\n1989-02-06,60.75,60.999999,59.75,60.500001,87580800,0.283556\n1989-02-03,60.500001,62.500002,59.999999,60.999999,91324800,0.2859\n1989-02-02,59.50,63.00,59.250001,60.875,180028800,0.285314\n1989-02-01,59.50,59.75,58.999998,59.250001,131212800,0.277698\n1989-01-31,58.999998,60.250002,58.50,59.625,125091200,0.279455\n1989-01-30,55.499999,58.749999,55.25,58.50,110086400,0.274182\n1989-01-27,54.125,56.499999,53.750001,55.374999,166419200,0.259536\n1989-01-26,52.625001,54.499998,52.500001,54.249999,87132800,0.254263\n1989-01-25,53.00,53.249999,52.500001,53.00,49046400,0.248405\n1989-01-24,53.00,53.500002,52.500001,52.75,56217600,0.247233\n1989-01-23,54.00,54.00,52.875,53.00,52227200,0.248405\n1989-01-20,53.500002,54.374999,53.249999,54.125,61027200,0.253677\n1989-01-19,52.249998,53.750001,52.249998,53.500002,84297600,0.250748\n1989-01-18,51.75,51.75,50.250001,51.500001,63632000,0.241374\n1989-01-17,52.625001,52.875,51.250002,51.500001,41744000,0.241374\n1989-01-16,53.249999,54.125,52.75,53.124999,27532800,0.24899\n1989-01-13,52.500001,53.249999,52.500001,53.00,35568000,0.248405\n1989-01-12,52.249998,53.750001,52.249998,52.500001,54588800,0.246061\n1989-01-11,51.875,52.500001,51.500001,52.500001,48297600,0.246061\n1989-01-10,52.249998,52.500001,51.75,51.999999,54128000,0.243718\n1989-01-09,53.00,53.249999,52.124999,52.500001,46006400,0.246061\n1989-01-06,53.500002,53.750001,53.00,53.00,59052800,0.248405\n1989-01-05,54.750001,54.750001,53.249999,53.374998,47244800,0.250162\n1989-01-04,53.500002,54.875001,53.500002,54.249999,53897600,0.254263\n1989-01-03,53.500002,53.750001,52.75,53.625001,51824000,0.251334\n1988-12-30,53.500002,54.249999,53.249999,53.249999,63820800,0.249576\n1988-12-29,51.999999,53.500002,51.999999,53.249999,38275200,0.249576\n1988-12-28,51.999999,52.249998,51.75,52.249998,21267200,0.244889\n1988-12-27,51.999999,52.500001,51.75,51.75,30771200,0.242546\n1988-12-23,51.75,51.999999,51.500001,51.999999,17120000,0.243718\n1988-12-22,52.500001,53.00,51.75,51.999999,74592000,0.243718\n1988-12-21,51.500001,52.500001,51.250002,52.249998,46438400,0.244889\n1988-12-20,51.375001,52.500001,50.999999,51.250002,92188800,0.240203\n1988-12-19,50.625,51.500001,50.50,50.75,83532800,0.237859\n1988-12-16,48.749999,50.250001,48.749999,49.749999,51795200,0.233172\n1988-12-15,49.000002,49.250001,48.50,49.000002,23196800,0.229657\n1988-12-14,47.749998,48.749999,47.499999,48.375,28006400,0.226728\n1988-12-13,47.25,47.749998,47.25,47.749998,39168000,0.223798\n1988-12-12,48.749999,49.000002,47.375,47.375,38892800,0.222041\n1988-12-09,48.749999,49.250001,48.50,49.000002,22304000,0.229657\n1988-12-08,49.250001,49.50,48.749999,49.000002,40176000,0.229657\n1988-12-07,49.50,49.999998,49.125001,49.250001,30886400,0.230829\n1988-12-06,49.50,49.749999,49.000002,49.749999,44364800,0.233172\n1988-12-05,49.749999,50.50,48.749999,49.50,70140800,0.232\n1988-12-02,48.50,50.250001,48.50,49.749999,91497600,0.233172\n1988-12-01,47.499999,49.50,47.000001,49.000002,82006400,0.229657\n1988-11-30,47.25,47.749998,47.25,47.25,35193600,0.221455\n1988-11-29,47.000001,47.499999,46.750002,47.499999,21872000,0.222627\n1988-11-28,46.25,47.499999,46.25,47.000001,58736000,0.220283\n1988-11-25,46.25,46.499999,45.750001,46.374999,11462400,0.217354\n1988-11-23,46.25,47.000001,46.00,46.875001,56547200,0.219697\n1988-11-22,46.00,46.499999,45.499998,46.00,30310400,0.215596\n1988-11-21,46.00,46.25,45.249999,46.00,47100800,0.215596\n1988-11-18,46.25,46.750002,45.750001,46.624998,34428800,0.218526\n1988-11-17,46.25,46.750002,45.750001,46.00,65865600,0.215596\n1988-11-16,47.125,47.25,45.499998,46.25,199008000,0.216768\n1988-11-15,48.50,48.50,46.499999,47.000001,93900800,0.220283\n1988-11-14,48.000001,48.749999,47.499999,48.50,34329600,0.227314\n1988-11-11,48.50,49.000002,47.499999,47.624999,54934400,0.223213\n1988-11-10,49.749999,50.50,49.000002,49.000002,78796800,0.229657\n1988-11-09,48.000001,49.999998,47.749998,49.749999,124732800,0.233172\n1988-11-08,47.25,49.000002,47.000001,48.624999,56604800,0.227899\n1988-11-07,46.499999,47.000001,46.00,46.750002,55065600,0.219112\n1988-11-04,46.499999,47.749998,46.499999,46.499999,106601600,0.21794\n1988-11-03,47.25,47.749998,46.125,47.25,118339200,0.221455\n1988-11-02,48.749999,48.749999,46.750002,47.25,221801600,0.221455\n1988-11-01,49.000002,49.749999,48.749999,48.749999,53280000,0.228485\n1988-10-31,49.250001,49.250001,48.50,49.000002,41283200,0.229657\n1988-10-28,49.250001,49.749999,48.50,49.50,46540800,0.232\n1988-10-27,49.250001,49.50,47.749998,49.50,114336000,0.232\n1988-10-26,50.250001,50.50,48.50,49.749999,157420800,0.233172\n1988-10-25,51.999999,52.249998,49.999998,50.50,74547200,0.236687\n1988-10-24,53.249999,53.249999,51.875,51.999999,28627200,0.243718\n1988-10-21,53.00,53.500002,52.500001,53.00,24262400,0.248405\n1988-10-20,52.75,54.00,52.75,53.500002,73296000,0.250748\n1988-10-19,53.500002,53.750001,52.249998,53.249999,80681600,0.249576\n1988-10-18,51.75,52.75,51.250002,52.500001,37222400,0.246061\n1988-10-17,51.250002,52.500001,51.250002,51.999999,25673600,0.243718\n1988-10-14,51.999999,52.249998,50.999999,51.250002,56764800,0.240203\n1988-10-13,50.375001,52.249998,50.250001,51.500001,82467200,0.241374\n1988-10-12,49.50,51.75,49.000002,50.625,137532800,0.237273\n1988-10-11,49.749999,50.50,49.000002,49.749999,65952000,0.233172\n1988-10-10,49.999998,49.999998,47.749998,49.250001,106358400,0.230829\n1988-10-07,49.999998,50.250001,47.875002,49.749999,208064000,0.233172\n1988-10-06,50.250001,50.75,49.999998,49.999998,33609600,0.234344\n1988-10-05,51.250002,51.250002,49.999998,50.250001,67088000,0.235516\n1988-10-04,51.500001,51.999999,50.874999,51.124998,29260800,0.239617\n1988-10-03,51.250002,51.75,50.50,51.375001,41097600,0.240788\n1988-09-30,52.75,53.00,51.75,52.249998,37251200,0.244889\n1988-09-29,52.75,53.500002,52.500001,53.00,56460800,0.248405\n1988-09-28,52.249998,53.00,51.75,53.00,25516800,0.248405\n1988-09-27,51.999999,52.249998,51.500001,51.999999,35366400,0.243718\n1988-09-26,53.750001,54.00,51.75,52.375002,50211200,0.245475\n1988-09-23,54.499998,54.499998,53.750001,53.750001,35091200,0.25192\n1988-09-22,54.00,55.00,53.750001,54.499998,59686400,0.255435\n1988-09-21,53.500002,54.00,53.500002,53.750001,16054400,0.25192\n1988-09-20,51.999999,53.249999,51.75,53.249999,53625600,0.249576\n1988-09-19,52.500001,52.500001,50.999999,51.75,44697600,0.242546\n1988-09-16,52.249998,52.500001,51.75,51.999999,48700800,0.243718\n1988-09-15,54.00,54.249999,51.999999,52.249998,72921600,0.244889\n1988-09-14,54.875001,55.25,53.750001,54.00,79212800,0.253091\n1988-09-13,53.249999,54.249999,52.75,54.00,40608000,0.253091\n1988-09-12,53.750001,55.00,53.500002,53.750001,43257600,0.25192\n1988-09-09,51.75,54.750001,51.500001,54.00,111123200,0.253091\n1988-09-08,51.500001,53.249999,51.250002,51.999999,69206400,0.243718\n1988-09-07,52.249998,52.75,50.75,51.75,72115200,0.242546\n1988-09-06,51.500001,52.500001,51.250002,51.999999,67750400,0.243718\n1988-09-02,49.749999,51.75,49.50,51.500001,115328000,0.241374\n1988-09-01,49.50,49.749999,48.000001,48.874998,82380800,0.229071\n1988-08-31,51.500001,51.75,49.250001,49.999998,71884800,0.234344\n1988-08-30,51.999999,52.249998,50.999999,51.250002,20966400,0.240203\n1988-08-29,51.999999,52.500001,51.75,52.124999,35033600,0.244304\n1988-08-26,50.75,51.75,50.75,51.375001,24451200,0.240788\n1988-08-25,50.250001,51.500001,49.999998,50.75,72633600,0.237859\n1988-08-24,49.50,51.625,49.250001,51.500001,102585600,0.241374\n1988-08-23,48.25,49.749999,47.749998,49.375,88313600,0.231415\n1988-08-22,50.250001,50.50,47.749998,48.000001,110172800,0.22497\n1988-08-19,52.75,53.00,50.250001,50.50,67376000,0.236687\n1988-08-18,52.75,53.249999,52.500001,52.75,32025600,0.247233\n1988-08-17,52.500001,53.875,51.375001,52.500001,59110400,0.246061\n1988-08-16,50.50,52.75,50.250001,52.500001,90876800,0.246061\n1988-08-15,51.999999,52.249998,49.999998,50.75,41081600,0.237859\n1988-08-12,51.75,52.249998,51.500001,51.999999,58262400,0.243718\n1988-08-11,50.999999,51.999999,49.999998,51.75,123104000,0.242546\n1988-08-10,51.250002,51.75,49.999998,50.50,113168000,0.236687\n1988-08-09,53.00,53.249999,50.999999,51.75,138828800,0.242546\n1988-08-08,53.750001,53.750001,52.75,53.249999,148320000,0.249576\n1988-08-05,55.499999,55.499999,51.75,53.500002,201600000,0.250748\n1988-08-04,56.25,56.499999,55.499999,55.499999,53494400,0.260122\n1988-08-03,57.25,57.50,55.499999,56.25,91987200,0.263637\n1988-08-02,58.50,58.749999,56.749998,57.50,65475200,0.269496\n1988-08-01,59.75,59.999999,58.50,58.50,51824000,0.274182\n1988-07-29,58.50,59.999999,58.250001,59.50,59385600,0.278869\n1988-07-28,57.50,58.50,57.000001,58.250001,57945600,0.273011\n1988-07-27,58.250001,58.999998,57.50,57.624999,68140800,0.270081\n1988-07-26,58.000002,58.999998,56.749998,58.000002,228960000,0.271839\n1988-07-25,62.00,62.500002,60.250002,60.500001,52704000,0.283556\n1988-07-22,60.75,62.500002,60.500001,61.75,68816000,0.289415\n1988-07-21,63.750001,64.00,60.500001,60.999999,128937600,0.2859\n1988-07-20,66.50,66.50,63.750001,64.00,111094400,0.29996\n1988-07-19,67.250001,67.50,65.749998,66.000001,36460800,0.309334\n1988-07-18,67.250001,67.749999,67.000002,67.50,20102400,0.316364\n1988-07-15,67.000002,67.250001,66.25,67.000002,31577600,0.314021\n1988-07-14,66.749999,67.000002,66.000001,67.000002,34848000,0.314021\n1988-07-13,65.499999,66.749999,65.000001,66.749999,57427200,0.312849\n1988-07-12,67.000002,67.250001,64.750002,65.624999,90000000,0.307576\n1988-07-11,68.75,68.75,66.749999,66.749999,65763200,0.312849\n1988-07-08,67.999998,68.75,67.749999,68.50,40089600,0.321051\n1988-07-07,68.250001,68.999999,67.749999,68.75,68428800,0.322223\n1988-07-06,69.75,70.500001,68.50,68.75,89379200,0.322223\n1988-07-05,67.50,69.75,67.000002,69.625,48096000,0.326324\n1988-07-01,67.000002,67.999998,66.749999,67.999998,42940800,0.318708\n1988-06-30,66.25,67.000002,66.000001,67.000002,31548800,0.314021\n1988-06-29,66.000001,66.50,65.499999,65.749998,49808000,0.308162\n1988-06-28,64.00,66.000001,63.750001,65.749998,32140800,0.308162\n1988-06-27,65.25,65.25,64.00,64.00,23628800,0.29996\n1988-06-24,66.000001,66.25,65.000001,65.25,28553600,0.305819\n1988-06-23,67.000002,67.250001,65.749998,66.000001,41052800,0.309334\n1988-06-22,65.000001,67.50,64.374999,67.000002,127324800,0.314021\n1988-06-21,62.500002,64.00,62.500002,64.00,39715200,0.29996\n1988-06-20,62.750001,63.00,62.00,62.750001,28137600,0.294102\n1988-06-17,63.499998,64.25,62.750001,63.00,42105600,0.295273\n1988-06-16,63.249999,63.750001,63.00,63.499998,73712000,0.297617\n1988-06-15,62.750001,64.00,62.500002,64.00,51033600,0.29996\n1988-06-14,63.00,63.499998,62.750001,63.00,60377600,0.295273\n1988-06-13,62.500002,63.00,62.249999,62.374998,31116800,0.292344\n1988-06-10,61.75,62.750001,61.249998,62.249999,45014400,0.291758\n1988-06-09,62.249999,62.875,61.625001,61.75,69264000,0.289415\n1988-06-08,60.75,62.500002,60.75,62.00,66281600,0.290586\n1988-06-07,60.999999,62.00,60.375001,60.999999,82166400,0.2859\n1988-06-06,59.50,60.999999,59.250001,60.75,81747200,0.284728\n1988-06-03,58.999998,59.75,58.749999,59.50,34832000,0.278869\n1988-06-02,59.50,59.999999,58.749999,58.999998,63228800,0.276526\n1988-06-01,58.250001,59.999999,57.749999,59.250001,95788800,0.277698\n1988-05-31,55.499999,58.250001,55.25,58.000002,44048000,0.271839\n1988-05-27,56.25,56.25,55.499999,55.499999,33148800,0.260122\n1988-05-26,56.000001,57.000001,55.750002,56.125,43385600,0.263051\n1988-05-25,56.499999,57.000001,55.499999,55.750002,53580800,0.261294\n1988-05-24,55.00,56.749998,54.750001,56.749998,55324800,0.26598\n1988-05-23,56.25,56.499999,54.499998,55.00,50227200,0.257778\n1988-05-20,57.25,57.749999,56.000001,56.25,42521600,0.263637\n1988-05-19,56.000001,57.25,55.750002,57.000001,57728000,0.267152\n1988-05-18,58.000002,58.375,56.499999,56.749998,81372800,0.26598\n1988-05-17,58.999998,59.250001,58.000002,58.000002,70428800,0.271839\n1988-05-16,56.749998,58.874999,56.749998,58.250001,59788800,0.273011\n1988-05-13,56.499999,57.000001,56.25,56.749998,17913600,0.26598\n1988-05-12,55.750002,56.499999,55.499999,56.000001,26409600,0.262465\n1988-05-11,56.499999,56.499999,55.00,55.750002,59484800,0.261294\n1988-05-10,57.25,57.624999,56.25,57.000001,46828800,0.267152\n1988-05-09,57.25,58.250001,56.749998,57.25,34790400,0.268324\n1988-05-06,56.749998,58.000002,56.749998,57.25,43977600,0.268324\n1988-05-05,56.749998,57.25,56.25,57.000001,24883200,0.267152\n1988-05-04,56.749998,57.749999,56.000001,57.125001,75152000,0.267738\n1988-05-03,55.25,57.000001,55.25,56.499999,62739200,0.264809\n1988-05-02,54.499998,55.25,53.500002,55.00,49260800,0.257778\n1988-04-29,55.00,55.00,54.249999,54.499998,64771200,0.255435\n1988-04-28,55.499999,55.750002,55.00,55.374999,28467200,0.259536\n1988-04-27,55.750002,56.000001,54.249999,55.499999,47894400,0.260122\n1988-04-26,55.750002,56.499999,55.25,55.750002,46454400,0.261294\n1988-04-25,55.25,55.750002,54.750001,55.125,23385600,0.258364\n1988-04-22,54.499998,55.750002,54.499998,55.25,33926400,0.25895\n1988-04-21,55.00,55.499999,53.750001,54.374999,63977600,0.254849\n1988-04-20,54.249999,55.00,53.750001,54.499998,65404800,0.255435\n1988-04-19,54.750001,57.000001,54.00,54.249999,75772800,0.254263\n1988-04-18,54.00,55.25,53.750001,54.750001,48051200,0.256607\n1988-04-15,53.249999,55.00,52.75,54.249999,114220800,0.254263\n1988-04-14,55.499999,56.499999,52.75,53.00,110028800,0.248405\n1988-04-13,56.000001,57.000001,55.499999,57.000001,42204800,0.267152\n1988-04-12,57.25,57.749999,55.00,55.750002,52444800,0.261294\n1988-04-11,58.50,58.50,57.000001,57.50,40406400,0.269496\n1988-04-08,57.50,58.50,57.125001,58.000002,57974400,0.271839\n1988-04-07,58.250001,58.749999,57.25,57.25,74921600,0.268324\n1988-04-06,56.000001,58.250001,55.750002,58.125001,75296000,0.272425\n1988-04-05,55.499999,56.000001,54.499998,56.000001,41760000,0.262465\n1988-04-04,56.000001,56.499999,54.499998,55.25,47721600,0.25895\n1988-03-31,54.499998,56.499999,54.499998,56.499999,50256000,0.264809\n1988-03-30,56.749998,57.000001,54.249999,54.750001,100713600,0.256607\n1988-03-29,57.25,58.250001,56.25,56.499999,80710400,0.264809\n1988-03-28,55.499999,57.000001,55.00,56.875002,67145600,0.266566\n1988-03-25,56.749998,57.624999,55.750002,56.125,47331200,0.263051\n1988-03-24,58.749999,58.749999,55.750002,56.499999,159840000,0.264809\n1988-03-23,61.75,62.374998,58.749999,58.999998,151200000,0.276526\n1988-03-22,58.749999,60.75,58.749999,60.250002,115833600,0.282384\n1988-03-21,58.50,58.749999,56.749998,58.749999,198720000,0.275354\n1988-03-18,63.750001,64.00,58.250001,58.250001,169920000,0.273011\n1988-03-17,65.000001,65.499999,63.750001,63.875001,125308800,0.299374\n1988-03-16,62.750001,64.750002,62.00,64.750002,54547200,0.303475\n1988-03-15,63.750001,63.750001,62.249999,62.500002,43760000,0.29293\n1988-03-14,62.249999,63.750001,61.500001,63.625002,46281600,0.298203\n1988-03-11,62.500002,63.00,60.999999,62.500002,84297600,0.29293\n1988-03-10,64.25,65.000001,62.374998,62.750001,97948800,0.294102\n1988-03-09,63.499998,64.499999,63.249999,64.00,81734400,0.29996\n1988-03-08,63.00,64.750002,62.750001,63.875001,96896000,0.299374\n1988-03-07,60.999999,62.750001,60.75,62.625001,78003200,0.293516\n1988-03-04,60.999999,61.249998,59.75,60.75,68355200,0.284728\n1988-03-03,59.999999,61.500001,59.75,60.999999,83664000,0.2859\n1988-03-02,58.999998,60.75,58.749999,59.50,67894400,0.278869\n1988-03-01,59.75,59.999999,58.50,58.999998,43299200,0.276526\n1988-02-29,58.50,59.50,58.000002,59.375001,39324800,0.278283\n1988-02-26,58.250001,58.749999,57.25,58.250001,29923200,0.273011\n1988-02-25,59.75,60.500001,57.874998,58.125001,61558400,0.272425\n1988-02-24,59.50,60.75,59.50,59.874999,79558400,0.280627\n1988-02-23,58.749999,59.999999,58.749999,59.50,91728000,0.278869\n1988-02-22,58.749999,58.999998,58.000002,58.749999,52227200,0.275354\n1988-02-19,58.250001,58.749999,57.749999,58.749999,53164800,0.275354\n1988-02-18,57.25,58.999998,57.000001,58.000002,84153600,0.271839\n1988-02-17,58.000002,58.749999,57.25,57.50,101318400,0.269496\n1988-02-16,55.00,57.749999,54.499998,57.50,67334400,0.269496\n1988-02-12,54.750001,56.25,54.499998,55.25,80220800,0.25895\n1988-02-11,54.00,54.750001,53.750001,54.750001,69436800,0.256607\n1988-02-10,53.00,54.00,52.500001,53.750001,77024000,0.25192\n1988-02-09,52.249998,53.00,51.999999,52.75,49939200,0.247233\n1988-02-08,50.75,52.500001,50.75,51.75,72876800,0.242546\n1988-02-05,51.999999,53.500002,51.250002,51.500001,94102400,0.241374\n1988-02-04,53.00,53.249999,49.749999,50.999999,114710400,0.239031\n1988-02-03,55.750002,55.750002,52.249998,52.75,75801600,0.247233\n1988-02-02,55.25,56.000001,54.750001,55.750002,60752000,0.261294\n1988-02-01,56.749998,57.000001,55.00,55.25,48729600,0.25895\n1988-01-29,56.499999,57.000001,54.499998,55.750002,66700800,0.261294\n1988-01-28,56.000001,56.749998,56.000001,56.499999,29318400,0.264809\n1988-01-27,54.750001,56.25,54.750001,55.750002,100409600,0.261294\n1988-01-26,55.00,55.875001,54.249999,54.499998,43558400,0.255435\n1988-01-25,54.249999,56.25,54.249999,55.750002,75497600,0.261294\n1988-01-22,55.624998,56.125,52.75,53.875,75296000,0.252506\n1988-01-21,54.249999,56.25,54.249999,55.00,125107200,0.257778\n1988-01-20,56.749998,57.25,52.500001,54.00,208800000,0.253091\n1988-01-19,56.000001,58.250001,55.750002,57.25,47417600,0.268324\n1988-01-18,58.000002,58.000002,56.25,57.25,30038400,0.268324\n1988-01-15,58.999998,59.250001,57.749999,57.749999,92172800,0.270667\n1988-01-14,57.25,58.000002,56.000001,56.25,40608000,0.263637\n1988-01-13,56.000001,58.50,54.750001,56.749998,96147200,0.26598\n1988-01-12,58.000002,58.50,54.249999,56.749998,168480000,0.26598\n1988-01-11,55.750002,58.000002,54.750001,57.874998,143568000,0.271253\n1988-01-08,60.250002,61.75,55.624998,56.000001,145440000,0.262465\n1988-01-07,58.000002,60.625,57.50,60.500001,90675200,0.283556\n1988-01-06,57.25,59.75,57.000001,58.50,121680000,0.274182\n1988-01-05,57.25,58.000002,56.499999,57.000001,155520000,0.267152\n1988-01-04,54.750001,56.499999,54.499998,56.000001,110345600,0.262465\n1987-12-31,55.25,55.750002,53.750001,54.249999,61545600,0.254263\n1987-12-30,54.499998,56.000001,54.249999,55.750002,70704000,0.261294\n1987-12-29,51.250002,55.00,50.50,54.499998,79459200,0.255435\n1987-12-28,53.00,53.249999,49.999998,51.250002,50716800,0.240203\n1987-12-24,53.249999,53.750001,53.00,53.249999,12672000,0.249576\n1987-12-23,53.249999,53.750001,52.249998,53.249999,60710400,0.249576\n1987-12-22,51.500001,53.00,49.999998,52.500001,41772800,0.246061\n1987-12-21,52.500001,53.500002,50.75,51.500001,51161600,0.241374\n1987-12-18,52.500001,53.750001,51.999999,51.999999,52486400,0.243718\n1987-12-17,54.750001,54.750001,51.75,51.999999,94016000,0.243718\n1987-12-16,50.50,54.750001,50.250001,54.249999,105536000,0.254263\n1987-12-15,51.250002,51.875,49.999998,51.250002,112217600,0.240203\n1987-12-14,48.000001,50.999999,47.749998,50.75,95110400,0.237859\n1987-12-11,47.749998,48.50,46.750002,48.000001,72473600,0.22497\n1987-12-10,45.499998,49.50,44.249999,47.499999,165600000,0.222627\n1987-12-09,47.25,48.25,46.00,46.25,83792000,0.216768\n1987-12-08,43.249998,47.499999,42.999999,47.499999,112521600,0.222627\n1987-12-07,42.999999,43.75,42.250002,43.249998,66211200,0.202707\n1987-12-04,40.250001,42.375001,40.000002,41.999999,121750400,0.196849\n1987-12-03,44.249999,44.750001,40.250001,40.375,127670400,0.189233\n1987-12-02,43.500001,44.750001,42.75,44.00,68515200,0.206223\n1987-12-01,44.500002,45.750001,42.999999,43.75,73539200,0.205051\n1987-11-30,44.249999,45.00,40.50,44.750001,164160000,0.209738\n1987-11-27,46.00,46.25,45.00,45.249999,18316800,0.212081\n1987-11-25,47.499999,47.749998,46.00,46.00,32153600,0.215596\n1987-11-24,48.50,49.000002,45.499998,47.499999,72230400,0.222627\n1987-11-23,47.25,48.749999,47.000001,47.749998,44640000,0.223798\n1987-11-20,45.499998,47.749998,44.750001,47.499999,82467200,0.222627\n1987-11-19,48.25,48.50,46.00,46.25,75024000,0.216768\n1987-11-18,47.499999,48.000001,45.00,48.000001,89308800,0.22497\n1987-11-17,46.750002,47.499999,45.249999,46.750002,69321600,0.219112\n1987-11-16,48.749999,49.749999,47.499999,47.749998,59472000,0.223798\n1987-11-13,49.999998,50.250001,48.25,48.25,58492800,0.226142\n1987-11-12,50.75,51.999999,49.000002,49.999998,99171200,0.234344\n1987-11-11,47.499999,49.250001,47.25,49.000002,54617600,0.229657\n1987-11-10,46.499999,48.50,45.499998,47.000001,91164800,0.220283\n1987-11-09,46.750002,47.499999,45.499998,47.000001,86585600,0.220283\n1987-11-06,50.250001,50.50,47.000001,47.499999,75353600,0.222627\n1987-11-05,49.000002,51.250002,48.749999,50.50,81430400,0.236687\n1987-11-04,47.000001,50.75,46.00,48.749999,95340800,0.228485\n1987-11-03,49.250001,49.999998,43.75,48.000001,116150400,0.22497\n1987-11-02,49.250001,50.999999,48.50,50.250001,84771200,0.235516\n1987-10-30,49.749999,52.249998,48.50,49.749999,168480000,0.233172\n1987-10-29,41.250001,48.749999,41.250001,47.749998,167040000,0.223798\n1987-10-28,40.000002,42.500001,38.499999,41.250001,149760000,0.193334\n1987-10-27,40.749999,42.999999,39.25,41.250001,234720000,0.193334\n1987-10-26,46.499999,48.000001,37.25,39.25,148320000,0.18396\n1987-10-23,52.500001,53.00,47.499999,48.25,112764800,0.226142\n1987-10-22,56.749998,58.000002,50.999999,53.249999,223200000,0.249576\n1987-10-21,51.75,60.500001,49.999998,56.624999,262080000,0.265395\n1987-10-20,46.00,51.999999,42.999999,48.000001,324000000,0.22497\n1987-10-19,61.500001,63.499998,45.00,45.249999,146880000,0.212081\n1987-10-16,70.500001,74.499999,64.25,64.750002,210240000,0.303475\n1987-10-15,70.500001,72.749997,69.999999,70.500001,128822400,0.330425\n1987-10-14,73.250004,74.749998,70.75,71.249999,114220800,0.33394\n1987-10-13,72.249999,74.000001,71.00,73.250004,96809600,0.343314\n1987-10-12,72.00,72.999996,68.999999,71.500002,117187200,0.335112\n1987-10-09,72.249999,75.249996,71.750001,71.750001,93888000,0.336284\n1987-10-08,73.250004,74.25,69.500001,72.00,96940800,0.337455\n1987-10-07,74.000001,75.249996,71.500002,72.999996,125638400,0.342142\n1987-10-06,78.999999,79.249998,73.374999,73.750002,203040000,0.345657\n1987-10-05,73.500003,78.999999,73.500003,78.999999,184320000,0.370263\n1987-10-02,68.999999,72.749997,68.75,72.499998,131644800,0.339799\n1987-10-01,66.25,68.75,66.000001,68.50,127222400,0.321051\n1987-09-30,64.00,66.624999,64.00,66.25,85680000,0.310506\n1987-09-29,64.499999,65.25,63.625002,64.25,57411200,0.301132\n1987-09-28,62.00,65.25,61.75,64.00,95542400,0.29996\n1987-09-25,61.500001,65.000001,61.249998,62.00,82454400,0.290586\n1987-09-24,59.999999,63.249999,59.999999,61.249998,118438400,0.287071\n1987-09-23,57.749999,60.375001,57.749999,60.250002,107696000,0.282384\n1987-09-22,53.500002,57.749999,53.00,57.25,82006400,0.268324\n1987-09-21,53.500002,57.25,53.00,53.500002,85548800,0.250748\n1987-09-18,116.000004,116.000004,114.000003,114.999999,31651200,0.269496\n1987-09-17,117.00,117.499998,113.750004,116.000004,69436800,0.271839\n1987-09-16,117.999996,119.999997,116.750001,116.750001,57715200,0.273597\n1987-09-15,119.499999,119.499999,116.250003,117.875001,39052800,0.276233\n1987-09-14,116.500002,119.999997,116.500002,119.25,94464000,0.279455\n1987-09-11,114.500001,116.500002,114.000003,116.250003,41040000,0.272425\n1987-09-10,113.249997,115.749996,112.999998,114.500001,58176000,0.268324\n1987-09-09,112.000002,114.000003,111.500004,112.749999,60710400,0.264223\n1987-09-08,111.750003,112.000002,108.249999,111.500004,96336000,0.261294\n1987-09-04,115.249998,115.499997,111.750003,112.000002,48355200,0.262465\n1987-09-03,116.250003,117.749997,113.750004,115.249998,70934400,0.270081\n1987-09-02,112.50,115.249998,112.250001,114.999999,78393600,0.269496\n1987-09-01,117.999996,118.750002,112.999998,113.499996,93859200,0.26598\n1987-08-31,119.749998,120.249996,116.750001,118.750002,84326400,0.278283\n1987-08-28,116.000004,121.250001,116.000004,120.249996,114796800,0.281799\n1987-08-27,115.499997,116.250003,114.250002,115.749996,72432000,0.271253\n1987-08-26,114.75,117.999996,114.250002,115.499997,114105600,0.270667\n1987-08-25,112.749999,116.750001,111.500004,114.75,185961600,0.26891\n1987-08-24,107.000004,112.250001,105.500001,111.750003,97747200,0.261879\n1987-08-21,105.000003,108.249999,105.000003,107.000004,68976000,0.250748\n1987-08-20,102.500004,105.75,102.500004,105.250002,82051200,0.246647\n1987-08-19,102.500004,102.750003,100.500003,102.500004,48902400,0.240203\n1987-08-18,103.50,103.999998,101.499999,102.500004,46944000,0.240203\n1987-08-17,103.50,104.249997,103.000002,104.249997,33667200,0.244304\n1987-08-14,103.000002,103.749999,102.500004,103.50,50832000,0.242546\n1987-08-13,99.999996,104.499996,99.999996,103.000002,80640000,0.241374\n1987-08-12,101.499999,101.749998,99.999996,99.999996,42364800,0.234344\n1987-08-11,103.999998,104.499996,101.000001,101.499999,68544000,0.237859\n1987-08-10,103.749999,103.999998,102.500004,103.50,56448000,0.242546\n1987-08-07,101.000001,104.499996,100.750002,103.50,171014400,0.242546\n1987-08-06,97.499997,101.625003,97.499997,101.000001,152553600,0.236687\n1987-08-05,94.000002,98.500002,93.750003,97.249998,211190400,0.227899\n1987-08-04,91.750002,93.750003,91.750002,93.750003,135072000,0.219697\n1987-08-03,94.000002,94.50,91.250004,91.750002,116352000,0.215011\n1987-07-31,96.500001,96.500001,92.000001,94.000002,186624000,0.220283\n1987-07-30,99.249999,99.249999,96.000003,96.999999,55555200,0.227314\n1987-07-29,99.499998,99.749997,97.749996,99.249999,27676800,0.232586\n1987-07-28,100.250004,101.749998,99.249999,99.499998,38160000,0.233172\n1987-07-27,98.500002,99.749997,96.999999,99.749997,41817600,0.233758\n1987-07-24,98.000004,99.499998,97.749996,98.500002,57744000,0.230829\n1987-07-23,99.999996,99.999996,94.000002,97.749996,148492800,0.229071\n1987-07-22,99.249999,100.500003,98.500002,99.999996,53366400,0.234344\n1987-07-21,99.499998,101.000001,98.500002,99.249999,36547200,0.232586\n1987-07-20,101.999997,101.999997,99.249999,99.499998,42019200,0.233172\n1987-07-17,101.999997,103.999998,101.749998,102.249996,51264000,0.239617\n1987-07-16,102.500004,103.000002,99.999996,101.999997,72979200,0.239031\n1987-07-15,105.000003,105.75,102.249996,102.249996,96768000,0.239617\n1987-07-14,99.999996,105.250002,99.499998,105.000003,152812800,0.246061\n1987-07-13,96.999999,99.499998,96.000003,99.249999,48326400,0.232586\n1987-07-10,95.249997,97.499997,94.000002,96.999999,75830400,0.227314\n1987-07-09,93.750003,98.000004,93.249996,95.750004,92707200,0.224384\n1987-07-08,90.999996,94.749999,88.499997,93.249996,193449600,0.218526\n1987-07-07,97.249998,97.249998,89.500002,90.249999,197078400,0.211495\n1987-07-06,99.749997,101.000001,96.999999,97.499997,65491200,0.228485\n1987-07-02,102.750003,102.750003,98.750001,99.999996,56880000,0.234344\n1987-07-01,101.749998,103.250001,101.499999,102.500004,21945600,0.240203\n1987-06-30,104.499996,104.750004,101.749998,101.999997,38332800,0.239031\n1987-06-29,104.750004,104.750004,102.500004,104.249997,25632000,0.244304\n1987-06-26,104.750004,105.250002,103.749999,104.750004,21945600,0.245475\n1987-06-25,104.499996,105.000003,103.50,104.499996,44035200,0.244889\n1987-06-24,103.250001,105.999999,103.250001,104.750004,82684800,0.245475\n1987-06-23,103.749999,103.749999,100.500003,102.750003,100771200,0.240788\n1987-06-22,105.000003,105.000003,103.000002,103.749999,87436800,0.243132\n1987-06-19,105.250002,106.249998,103.999998,104.499996,40809600,0.244889\n1987-06-18,103.50,105.000003,101.999997,104.874999,56188800,0.245768\n1987-06-17,100.750002,103.999998,100.750002,103.749999,71078400,0.243132\n1987-06-16,98.250003,101.499999,98.000004,100.250004,73526400,0.23493\n1987-06-15,98.250003,99.749997,96.250002,98.250003,125222400,0.230243\n1987-06-12,97.499997,101.499999,97.249998,98.250003,196156800,0.230243\n1987-06-11,105.250002,105.75,97.249998,97.499997,268704000,0.228485\n1987-06-10,108.999996,109.500003,101.25,103.50,176256000,0.242546\n1987-06-09,109.750002,110.000001,108.499998,108.999996,25833600,0.255435\n1987-06-08,109.250004,110.000001,107.500002,109.750002,111571200,0.257192\n1987-06-05,112.50,112.999998,107.000004,109.250004,59270400,0.256021\n1987-06-04,113.249997,113.249997,111.750003,112.50,20390400,0.263637\n1987-06-03,112.999998,114.75,112.999998,113.249997,21628800,0.265395\n1987-06-02,112.999998,114.75,110.999997,112.50,51552000,0.263637\n1987-06-01,115.249998,115.249998,112.999998,112.999998,30326400,0.264809\n1987-05-29,116.250003,118.250004,114.999999,115.249998,80380800,0.270081\n1987-05-28,109.500003,116.500002,109.250004,116.250003,108662400,0.272425\n1987-05-27,109.500003,112.000002,108.999996,109.500003,48758400,0.256607\n1987-05-26,108.249999,110.000001,108.00,109.500003,46886400,0.256607\n1987-05-22,111.500004,112.000002,107.750001,108.249999,64627200,0.253677\n1987-05-21,109.750002,112.749999,109.750002,111.500004,93312000,0.261294\n1987-05-20,110.749998,110.749998,107.250003,109.500003,228355200,0.256607\n1987-05-19,115.249998,115.249998,111.249996,111.249996,78336000,0.260708\n1987-05-18,119.25,119.25,112.000002,115.249998,172598400,0.270081\n1987-05-15,122.499996,122.499996,119.25,119.25,84326400,0.279455\n1987-05-14,121.749999,125.000004,121.749999,122.750004,59961600,0.287657\n1987-05-13,119.499999,122.249997,119.499999,121.749999,73382400,0.285314\n1987-05-12,123.000003,124.249998,117.00,118.750002,148464000,0.278283\n1987-05-11,126.499998,126.499998,122.874999,123.000003,127382400,0.288243\n1987-05-08,118.500003,128.25,118.500003,126.499998,150048000,0.296445\n1987-05-07,112.999998,118.500003,112.250001,118.250004,289699200,0.277112\n1987-05-06,115.749996,116.750001,112.50,112.999998,153504000,0.264809\n1987-05-05,107.250003,115.749996,107.250003,115.749996,110995200,0.271253\n1987-05-04,105.000003,107.750001,104.499996,107.000004,34531200,0.250748\n1987-05-01,103.999998,105.250002,102.750003,105.000003,37843200,0.246061\n1987-04-30,103.250001,106.249998,101.749998,103.999998,88041600,0.243718\n1987-04-29,106.249998,108.999996,103.250001,103.250001,85161600,0.24196\n1987-04-28,99.00,106.499997,98.000004,106.249998,111081600,0.24899\n1987-04-27,99.00,99.749997,97.249998,99.00,53107200,0.232\n1987-04-24,98.500002,99.499998,97.249998,99.00,54172800,0.232\n1987-04-23,98.500002,99.499998,96.999999,98.500002,48326400,0.230829\n1987-04-22,97.249998,98.750001,97.249998,98.500002,74678400,0.230829\n1987-04-21,95.750004,98.000004,93.750003,97.249998,113184000,0.227899\n1987-04-20,98.500002,99.499998,95.499996,95.750004,100310400,0.224384\n1987-04-16,96.000003,100.500003,95.750004,98.500002,188092800,0.230829\n1987-04-15,94.749999,96.999999,94.749999,96.000003,95961600,0.22497\n1987-04-14,92.499999,95.499996,90.999996,94.000002,87379200,0.220283\n1987-04-13,95.499996,95.499996,92.000001,92.499999,50256000,0.216768\n1987-04-10,94.999998,95.750004,94.749999,95.625,43372800,0.224091\n1987-04-09,96.75,96.75,94.250001,94.999998,71568000,0.222627\n1987-04-08,94.000002,97.749996,94.000002,96.75,106214400,0.226728\n1987-04-07,99.249999,99.249999,94.000002,94.000002,73728000,0.220283\n1987-04-06,99.749997,99.999996,97.499997,99.249999,98956800,0.232586\n1987-04-03,94.999998,100.250004,94.999998,99.749997,155606400,0.233758\n1987-04-02,92.499999,96.999999,92.499999,94.999998,159955200,0.222627\n1987-04-01,96.75,98.750001,90.499998,90.999996,259430400,0.213253\n1987-03-31,95.499996,99.00,95.499996,96.75,125337600,0.226728\n1987-03-30,91.750002,96.75,88.499997,96.75,186134400,0.226728\n1987-03-27,89.750001,93.750003,89.750001,91.750002,120873600,0.215011\n1987-03-26,89.874996,90.00,89.000004,89.250003,33379200,0.209152\n1987-03-25,90.249999,90.749997,89.250003,89.874996,33840000,0.210617\n1987-03-24,87.500001,90.749997,87.500001,90.249999,69609600,0.211495\n1987-03-23,90.249999,91.500003,88.749996,89.624997,67478400,0.210031\n1987-03-20,91.250004,91.250004,89.750001,90.249999,38246400,0.211495\n1987-03-19,89.500002,91.250004,87.999999,91.250004,62812800,0.213839\n1987-03-18,85.50,90.249999,85.50,89.500002,119347200,0.209738\n1987-03-17,82.250004,85.50,81.999996,85.000002,54547200,0.199192\n1987-03-16,82.500003,82.500003,79.749996,82.250004,88473600,0.192748\n1987-03-13,85.875003,86.499996,81.00,82.750002,105120000,0.19392\n1987-03-12,85.50,86.499996,83.499999,85.875003,71337600,0.201243\n1987-03-11,85.50,85.999998,84.500004,85.50,43862400,0.200364\n1987-03-10,81.749997,85.250001,81.499998,84.249996,74102400,0.197435\n1987-03-09,83.25,83.499999,81.249999,81.749997,38275200,0.191576\n1987-03-06,83.499999,83.999997,81.249999,83.25,63561600,0.195091\n1987-03-05,79.749996,85.250001,79.749996,83.499999,128188800,0.195677\n1987-03-04,74.499999,80.000004,74.25,79.749996,98179200,0.186889\n1987-03-03,74.499999,75.249996,73.500003,74.499999,81100800,0.174586\n1987-03-02,76.749999,76.749999,74.000001,74.499999,79516800,0.174586\n1987-02-27,77.249997,77.750004,75.500004,76.749999,37555200,0.179859\n1987-02-26,74.499999,79.499997,72.999996,77.249997,145209600,0.181031\n1987-02-25,75.750003,77.125002,74.000001,74.499999,65001600,0.174586\n1987-02-24,72.249999,76.000002,72.249999,75.750003,120816000,0.177516\n1987-02-23,67.999998,73.250004,66.50,72.249999,125913600,0.169313\n1987-02-20,68.75,68.75,67.000002,67.999998,87897600,0.159354\n1987-02-19,71.500002,71.500002,67.999998,68.75,317750400,0.161111\n1987-02-18,76.50,77.750004,71.500002,71.750001,128592000,0.168142\n1987-02-17,76.000002,76.749999,74.25,76.50,70732800,0.179273\n1987-02-13,76.749999,77.750004,74.25,76.000002,81763200,0.178101\n1987-02-12,71.750001,77.125002,71.750001,76.749999,185731200,0.179859\n1987-02-11,68.75,71.750001,68.75,71.750001,60307200,0.168142\n1987-02-10,68.250001,68.50,66.749999,68.50,44668800,0.160526\n1987-02-09,68.75,68.75,67.874999,68.250001,136080000,0.15994\n1987-02-06,71.500002,71.875,68.50,68.874999,45619200,0.161404\n1987-02-05,72.00,72.499998,70.75,71.500002,42652800,0.167556\n1987-02-04,71.750001,72.249999,71.00,72.00,31737600,0.168728\n1987-02-03,72.999996,73.750002,70.500001,71.750001,59328000,0.168142\n1987-02-02,73.125,74.499999,72.999996,72.999996,46915200,0.171071\n1987-01-30,68.75,73.250004,67.749999,73.125,104169600,0.171364\n1987-01-29,71.750001,72.499998,67.250001,68.75,79228800,0.161111\n1987-01-28,71.500002,72.749997,69.500001,71.750001,76723200,0.168142\n1987-01-27,68.75,72.499998,68.75,71.500002,114105600,0.167556\n1987-01-26,67.999998,69.500001,65.749998,68.75,116553600,0.161111\n1987-01-23,74.499999,77.499996,67.50,67.50,317894400,0.158182\n1987-01-22,67.749999,74.749998,65.749998,74.499999,116035200,0.174586\n1987-01-21,65.000001,69.500001,63.750001,67.749999,108489600,0.158768\n1987-01-20,64.00,66.50,63.750001,65.000001,95760000,0.152324\n1987-01-19,61.75,64.00,60.500001,64.00,88243200,0.14998\n1987-01-16,63.249999,63.249999,60.500001,61.75,65433600,0.144707\n1987-01-15,59.999999,64.750002,59.999999,63.249999,117014400,0.148223\n1987-01-14,59.999999,60.250002,58.749999,59.999999,69465600,0.140606\n1987-01-13,61.249998,61.249998,58.999998,59.999999,76320000,0.140606\n1987-01-12,58.000002,62.249999,57.50,61.75,128793600,0.144707\n1987-01-09,55.750002,58.250001,55.499999,58.000002,63705600,0.135919\n1987-01-08,54.249999,56.25,54.249999,55.750002,61488000,0.130647\n1987-01-07,51.250002,54.00,51.250002,54.00,60998400,0.126546\n1987-01-06,50.50,51.500001,50.250001,51.250002,40032000,0.120101\n1987-01-05,47.749998,50.999999,47.499999,50.50,48499200,0.118344\n1987-01-02,48.25,48.749999,47.499999,47.749998,12643200,0.111899\n1986-12-31,47.749998,49.000002,47.749998,48.25,23356800,0.113071\n1986-12-30,47.25,48.000001,46.750002,47.749998,25401600,0.111899\n1986-12-29,49.250001,49.749999,47.25,47.25,41702400,0.110728\n1986-12-26,49.375,49.749999,49.250001,49.250001,3715200,0.115414\n1986-12-24,49.50,49.50,49.250001,49.375,7027200,0.115707\n1986-12-23,49.000002,49.50,49.000002,49.50,23788800,0.116\n1986-12-22,48.50,49.50,48.50,49.000002,18316800,0.114829\n1986-12-19,47.499999,49.000002,47.499999,48.50,56592000,0.113657\n1986-12-18,47.000001,47.499999,46.750002,47.375,12672000,0.11102\n1986-12-17,46.499999,47.25,46.499999,47.000001,23356800,0.110142\n1986-12-16,46.25,47.25,46.25,46.499999,77299200,0.10897\n1986-12-15,47.25,47.499999,45.249999,46.00,50774400,0.107798\n1986-12-12,49.000002,49.000002,47.25,47.25,25286400,0.110728\n1986-12-11,48.624999,49.250001,48.50,49.000002,11635200,0.114829\n1986-12-10,48.25,48.749999,47.749998,48.624999,27590400,0.11395\n1986-12-09,48.50,48.749999,48.000001,48.25,16099200,0.113071\n1986-12-08,49.000002,49.50,47.749998,48.50,22665600,0.113657\n1986-12-05,49.250001,49.50,49.000002,49.000002,107510400,0.114829\n1986-12-04,48.624999,49.749999,48.25,49.250001,42508800,0.115414\n1986-12-03,49.000002,49.50,48.50,48.624999,35164800,0.11395\n1986-12-02,49.000002,49.999998,49.000002,49.000002,28771200,0.114829\n1986-12-01,49.749999,49.999998,48.50,48.749999,40291200,0.114243\n1986-11-28,50.50,50.75,49.250001,49.749999,41328000,0.116586\n1986-11-26,50.999999,51.250002,50.50,50.50,38793600,0.118344\n1986-11-25,50.50,51.250002,50.250001,50.999999,95788800,0.119515\n1986-11-24,46.750002,50.75,45.249999,50.50,173836800,0.118344\n1986-11-21,45.499998,47.25,45.499998,46.750002,91065600,0.109556\n1986-11-20,41.999999,45.249999,41.999999,45.249999,98179200,0.106041\n1986-11-19,40.50,42.250002,40.50,41.999999,48729600,0.098424\n1986-11-18,42.75,42.999999,40.50,40.50,59673600,0.094909\n1986-11-17,42.500001,43.249998,41.999999,42.75,24307200,0.100182\n1986-11-14,42.124998,42.500001,41.250001,42.500001,18720000,0.099596\n1986-11-13,42.75,42.999999,41.999999,42.124998,30211200,0.098717\n1986-11-12,42.75,43.75,42.250002,42.75,34156800,0.100182\n1986-11-11,42.75,43.249998,42.75,42.75,11894400,0.100182\n1986-11-10,44.249999,44.249999,42.250002,42.500001,28684800,0.099596\n1986-11-07,44.500002,44.750001,43.500001,44.249999,44323200,0.103697\n1986-11-06,43.500001,45.499998,43.249998,44.500002,72576000,0.104283\n1986-11-05,40.999998,43.75,40.749999,43.500001,45100800,0.10194\n1986-11-04,39.50,40.999998,39.50,40.999998,54403200,0.096081\n1986-11-03,39.000001,39.749999,39.000001,39.50,42192000,0.092566\n1986-10-31,39.25,39.749999,38.499999,38.749998,63734400,0.090808\n1986-10-30,38.499999,39.749999,38.25,39.25,44380800,0.09198\n1986-10-29,39.624999,39.749999,38.000001,38.499999,53222400,0.090222\n1986-10-28,38.749998,40.250001,38.749998,39.624999,142646400,0.092859\n1986-10-27,37.750002,38.749998,37.750002,38.749998,125654400,0.090808\n1986-10-24,37.750002,37.750002,36.499998,37.499999,101376000,0.087879\n1986-10-23,37.750002,38.000001,37.374999,37.750002,70444800,0.088465\n1986-10-22,37.750002,38.125,37.499999,37.750002,54576000,0.088465\n1986-10-21,36.499998,37.750002,36.499998,37.750002,112377600,0.088465\n1986-10-20,36.00,36.750001,35.250001,36.249999,43545600,0.08495\n1986-10-17,35.00,36.249999,35.00,36.00,124444800,0.084364\n1986-10-16,35.00,35.250001,34.75,35.00,21859200,0.08202\n1986-10-15,33.500001,35.250001,33.500001,35.00,63532800,0.08202\n1986-10-14,33.25,33.75,33.25,33.500001,12873600,0.078505\n1986-10-13,34.499999,34.499999,33.000001,33.000001,27129600,0.077334\n1986-10-10,33.000001,35.250001,32.50,34.499999,76752000,0.080849\n1986-10-09,32.00,33.75,32.00,33.000001,92563200,0.077334\n1986-10-08,31.124999,32.375001,30.750001,32.00,119606400,0.07499\n1986-10-07,30.50,31.749999,30.50,31.124999,59788800,0.07294\n1986-10-06,29.000001,31.00,29.000001,30.50,85334400,0.071475\n1986-10-03,28.00,28.500001,28.00,28.25,14716800,0.066202\n1986-10-02,28.00,28.500001,27.749999,28.00,22723200,0.065616\n1986-10-01,28.25,28.75,27.50,28.00,32428800,0.065616\n1986-09-30,28.25,28.75,28.25,28.25,5184000,0.066202\n1986-09-29,29.000001,29.000001,28.25,28.25,6192000,0.066202\n1986-09-26,29.000001,29.25,28.75,29.000001,2332800,0.06796\n1986-09-25,29.625001,29.75,29.000001,29.000001,5155200,0.06796\n1986-09-24,29.999999,29.999999,29.499999,29.625001,4780800,0.069424\n1986-09-23,29.499999,30.25,29.499999,29.999999,5961600,0.070303\n1986-09-22,29.75,29.75,29.499999,29.499999,4492800,0.069131\n1986-09-19,29.75,29.999999,29.499999,29.75,2505600,0.069717\n1986-09-18,29.499999,30.25,29.499999,29.75,5356800,0.069717\n1986-09-17,28.75,29.999999,28.500001,29.499999,8035200,0.069131\n1986-09-16,28.75,29.000001,28.25,28.75,5184000,0.067374\n1986-09-15,28.25,28.75,27.749999,28.75,22492800,0.067374\n1986-09-12,29.000001,29.25,28.25,28.25,24451200,0.066202\n1986-09-11,30.25,30.50,29.000001,29.000001,35654400,0.06796\n1986-09-10,30.750001,31.00,30.25,30.25,10886400,0.070889\n1986-09-09,30.25,31.50,30.25,30.750001,37526400,0.072061\n1986-09-08,30.50,30.750001,30.25,30.25,9619200,0.070889\n1986-09-05,29.25,30.50,29.000001,30.50,26352000,0.071475\n1986-09-04,27.50,29.25,27.50,29.25,39427200,0.068546\n1986-09-03,27.50,27.50,26.250001,27.00,18316800,0.063273\n1986-09-02,28.500001,28.500001,27.375001,27.749999,5212800,0.06503\n1986-08-29,29.25,29.499999,28.00,28.500001,25430400,0.066788\n1986-08-28,29.25,29.499999,29.25,29.25,3427200,0.068546\n1986-08-27,29.25,29.499999,29.000001,29.25,9532800,0.068546\n1986-08-26,29.499999,29.499999,29.25,29.25,10857600,0.068546\n1986-08-25,29.499999,29.499999,29.000001,29.499999,2419200,0.069131\n1986-08-22,29.999999,30.25,29.000001,29.499999,5760000,0.069131\n1986-08-21,29.999999,30.50,29.999999,29.999999,49536000,0.070303\n1986-08-20,30.25,30.25,29.999999,29.999999,20764800,0.070303\n1986-08-19,30.25,30.375,29.75,30.25,20390400,0.070889\n1986-08-18,30.624999,30.750001,30.25,30.25,12787200,0.070889\n1986-08-15,30.50,30.750001,30.25,30.624999,6105600,0.071768\n1986-08-14,29.75,30.750001,29.75,30.50,20131200,0.071475\n1986-08-13,29.499999,29.75,29.25,29.75,6883200,0.069717\n1986-08-12,28.75,29.499999,28.75,29.499999,9993600,0.069131\n1986-08-11,28.25,29.000001,28.25,28.75,7948800,0.067374\n1986-08-08,27.50,28.25,27.50,27.749999,4147200,0.06503\n1986-08-07,27.749999,28.00,27.249999,27.50,3657600,0.064445\n1986-08-06,28.00,28.25,27.249999,27.749999,18316800,0.06503\n1986-08-05,28.25,28.500001,28.00,28.00,2822400,0.065616\n1986-08-04,28.25,28.25,27.50,28.25,12441600,0.066202\n1986-08-01,28.500001,28.75,28.00,28.25,12902400,0.066202\n1986-07-31,28.75,29.000001,28.500001,28.500001,15638400,0.066788\n1986-07-30,29.75,29.75,27.749999,28.75,26409600,0.067374\n1986-07-29,30.50,30.750001,29.25,29.75,14054400,0.069717\n1986-07-28,31.250001,31.250001,30.50,30.50,11808000,0.071475\n1986-07-25,31.00,31.50,31.00,31.250001,20448000,0.073232\n1986-07-24,30.50,31.50,30.50,31.00,14140800,0.072647\n1986-07-23,30.750001,31.250001,29.999999,29.999999,20793600,0.070303\n1986-07-22,29.75,30.750001,29.75,30.750001,10512000,0.072061\n1986-07-21,29.75,30.25,29.75,29.75,3513600,0.069717\n1986-07-18,29.499999,29.999999,28.75,29.75,12326400,0.069717\n1986-07-17,29.000001,29.499999,28.75,29.499999,6940800,0.069131\n1986-07-16,28.25,29.000001,28.25,29.000001,9360000,0.06796\n1986-07-15,27.625,28.500001,27.249999,28.00,13190400,0.065616\n1986-07-14,27.249999,28.25,27.249999,27.625,28598400,0.064738\n1986-07-11,27.249999,28.500001,27.249999,28.00,17395200,0.065616\n1986-07-10,28.00,28.25,26.00,27.249999,46886400,0.063859\n1986-07-09,29.25,29.25,27.749999,28.00,46137600,0.065616\n1986-07-08,29.999999,29.999999,29.000001,29.25,14256000,0.068546\n1986-07-07,31.250001,31.250001,29.999999,29.999999,14054400,0.070303\n1986-07-03,31.00,31.50,31.00,31.250001,14140800,0.073232\n1986-07-02,30.750001,30.750001,30.50,30.750001,52617600,0.072061\n1986-07-01,30.750001,30.750001,30.50,30.750001,47577600,0.072061\n1986-06-30,29.75,31.50,29.499999,30.750001,62352000,0.072061\n1986-06-27,29.999999,30.25,29.499999,29.75,10396800,0.069717\n1986-06-26,31.00,31.250001,29.999999,29.999999,19152000,0.070303\n1986-06-25,31.50,31.749999,31.00,31.00,15235200,0.072647\n1986-06-24,31.749999,32.00,31.250001,31.50,14572800,0.073818\n1986-06-23,31.375,31.749999,30.750001,31.749999,46195200,0.074404\n1986-06-20,31.250001,31.50,31.250001,31.375,3801600,0.073525\n1986-06-19,31.50,31.749999,31.00,31.250001,8467200,0.073232\n1986-06-18,31.749999,31.749999,31.00,31.50,4348800,0.073818\n1986-06-17,31.50,32.249999,31.50,31.749999,13075200,0.074404\n1986-06-16,31.50,31.749999,31.00,31.250001,9590400,0.073232\n1986-06-13,31.50,31.749999,31.250001,31.50,7891200,0.073818\n1986-06-12,32.75,32.75,31.250001,31.50,13708800,0.073818\n1986-06-11,32.75,32.75,32.249999,32.75,2304000,0.076748\n1986-06-10,32.75,32.75,32.249999,32.75,3427200,0.076748\n1986-06-09,34.25,34.25,32.75,32.75,12672000,0.076748\n1986-06-06,34.25,34.25,33.75,34.25,3427200,0.080263\n1986-06-05,33.75,34.25,33.500001,34.25,13708800,0.080263\n1986-06-04,33.999999,34.25,33.500001,33.75,4723200,0.079091\n1986-06-03,33.999999,33.999999,33.500001,33.999999,5011200,0.079677\n1986-06-02,35.00,35.00,33.999999,33.999999,19728000,0.079677\n1986-05-30,33.999999,35.50,33.999999,35.00,27072000,0.08202\n1986-05-29,33.000001,34.25,32.75,33.75,45676800,0.079091\n1986-05-28,32.00,33.000001,32.00,33.000001,15523200,0.077334\n1986-05-27,31.00,32.00,31.00,32.00,13881600,0.07499\n1986-05-23,31.00,31.50,31.00,31.00,4089600,0.072647\n1986-05-22,31.00,31.250001,31.00,31.00,4406400,0.072647\n1986-05-21,31.50,31.749999,31.00,31.00,8092800,0.072647\n1986-05-20,31.749999,31.749999,31.250001,31.50,61977600,0.073818\n1986-05-19,32.249999,32.249999,31.50,31.749999,11001600,0.074404\n1986-05-16,32.00,33.000001,32.00,32.249999,11952000,0.075576\n1986-05-15,32.00,32.50,32.00,32.00,3801600,0.07499\n1986-05-14,32.249999,32.249999,32.00,32.00,9302400,0.07499\n1986-05-13,32.00,32.50,32.00,32.249999,3830400,0.075576\n1986-05-12,31.749999,32.75,31.749999,32.00,10483200,0.07499\n1986-05-09,32.00,32.00,31.749999,31.749999,6076800,0.074404\n1986-05-08,31.749999,32.00,31.50,32.00,3542400,0.07499\n1986-05-07,31.749999,32.00,31.250001,31.749999,5155200,0.074404\n1986-05-06,31.749999,32.249999,31.749999,31.749999,9734400,0.074404\n1986-05-05,31.749999,31.749999,31.50,31.50,3254400,0.073818\n1986-05-02,31.749999,32.249999,31.50,31.749999,20246400,0.074404\n1986-05-01,32.249999,32.249999,31.250001,31.749999,54345600,0.074404\n1986-04-30,33.000001,33.25,31.50,32.249999,30902400,0.075576\n1986-04-29,33.999999,33.999999,32.75,33.000001,30326400,0.077334\n1986-04-28,33.75,34.25,33.500001,33.999999,28886400,0.079677\n1986-04-25,32.00,35.124999,32.00,33.75,85795200,0.079091\n1986-04-24,28.874999,32.249999,28.75,31.749999,62352000,0.074404\n1986-04-23,28.75,29.000001,28.500001,28.874999,15609600,0.067667\n1986-04-22,29.25,29.25,28.75,28.75,15552000,0.067374\n1986-04-21,29.25,29.499999,28.500001,29.25,22924800,0.068546\n1986-04-18,30.25,30.25,29.000001,29.25,21628800,0.068546\n1986-04-17,29.999999,30.25,29.999999,30.25,22003200,0.070889\n1986-04-16,29.000001,30.25,28.75,29.999999,31910400,0.070303\n1986-04-15,29.000001,29.000001,28.00,29.000001,9302400,0.06796\n1986-04-14,28.75,29.25,28.75,29.000001,12153600,0.06796\n1986-04-11,28.500001,29.25,28.500001,28.75,17222400,0.067374\n1986-04-10,28.00,28.500001,27.50,28.25,13881600,0.066202\n1986-04-09,27.50,28.25,27.50,28.00,12153600,0.065616\n1986-04-08,27.249999,28.00,27.249999,27.50,10252800,0.064445\n1986-04-07,27.749999,28.00,26.750001,27.249999,16560000,0.063859\n1986-04-04,27.749999,28.00,27.749999,27.749999,26582400,0.06503\n1986-04-03,27.749999,28.500001,27.749999,27.749999,23040000,0.06503\n1986-04-02,27.249999,28.00,27.249999,27.50,27014400,0.064445\n1986-04-01,27.50,27.50,27.249999,27.249999,11088000,0.063859\n1986-03-31,27.749999,27.749999,27.00,27.50,12873600,0.064445\n1986-03-27,27.249999,27.749999,27.249999,27.749999,16848000,0.06503\n1986-03-26,26.50,27.50,26.250001,27.249999,22752000,0.063859\n1986-03-25,26.00,26.50,25.75,26.50,32083200,0.062101\n1986-03-24,26.750001,26.750001,25.75,26.00,65289600,0.060929\n1986-03-21,27.50,28.00,26.250001,26.750001,59990400,0.062687\n1986-03-20,28.25,28.25,27.249999,27.50,58435200,0.064445\n1986-03-19,28.75,29.000001,28.00,28.25,47894400,0.066202\n1986-03-18,29.499999,29.75,28.500001,28.75,67766400,0.067374\n1986-03-17,29.000001,29.75,29.000001,29.499999,133171200,0.069131\n1986-03-14,28.00,29.499999,28.00,29.000001,308160000,0.06796\n1986-03-13,25.499999,29.25,25.499999,28.00,1031788800,0.065616\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/perftest.h",
    "content": "#pragma once\n\n#include <chrono>\n\nnamespace perftest\n{\n  class Timer\n  {\n  public:\n    void Start()\n    {\n      // Timestamp\n      start = std::chrono::high_resolution_clock::now();\n    }\n\n    void Stop()\n    {\n      // Timestamps\n      stop = std::chrono::high_resolution_clock::now();\n      poststop = std::chrono::high_resolution_clock::now();\n\n      // Calculate duration\n      std::chrono::duration<double> span =\n        std::chrono::duration_cast<std::chrono::duration<double>>(stop - start - (poststop - stop));\n\n      // Store\n      lastspan = span.count();\n      spans.push_back(lastspan);\n    }\n\n    double GetLastDurationSec()\n    {\n      return lastspan;\n    }\n\n    double GetLastDurationUs()\n    {\n      return GetLastDurationSec() * 1000000.0;\n    }\n\n    double GetMedianDurationSec()\n    {\n      double median = 0;\n      if (spans.size() > 0)\n      {\n        sort(spans.begin(), spans.end());\n        median = spans.at(spans.size() / 2);\n      }\n\n      return median;\n    }\n\n    double GetMedianDurationUs()\n    {\n      return GetMedianDurationSec() * 1000000.0;\n    }\n\n    void ReportMedian()\n    {\n      std::cout << \"Test median duration                           Elapsed   \";\n      std::cout << static_cast<long long>(round(GetMedianDurationUs())) << \" us\\n\";\n    }\n\n  private:\n    std::chrono::high_resolution_clock::time_point start;\n    std::chrono::high_resolution_clock::time_point stop;\n    std::chrono::high_resolution_clock::time_point poststop;\n    double lastspan;\n    std::vector<double> spans;\n  };\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/ptest001.cpp",
    "content": "// ptest001.cpp - file load and get data by column, row and cell\n\n#include <rapidcsv.h>\n#include \"perftest.h\"\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  try\n  {\n    perftest::Timer timer;\n\n    for (int i = 0; i < 10; ++i)\n    {\n      timer.Start();\n\n      rapidcsv::Document doc(\"../tests/msft.csv\", rapidcsv::LabelParams(0, 0));\n      const std::vector<double>& column = doc.GetColumn<double>(\"Close\");\n      const std::vector<double>& row = doc.GetRow<double>(\"2016-05-23\");\n      const double cell = doc.GetCell<double>(\"Close\", \"2016-05-23\");\n\n      timer.Stop();\n\n      // dummy usage of variables\n      (void) column;\n      (void) row;\n      (void) cell;\n    }\n\n    timer.ReportMedian();\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/ptest002.cpp",
    "content": "// ptest002.cpp - file load\n\n#include <rapidcsv.h>\n#include \"perftest.h\"\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  try\n  {\n    perftest::Timer timer;\n\n    for (int i = 0; i < 10; ++i)\n    {\n      timer.Start();\n\n      rapidcsv::Document doc(\"../tests/msft.csv\");\n\n      timer.Stop();\n    }\n\n    timer.ReportMedian();\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test001.cpp",
    "content": "// test001.cpp - read cell value\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,3,9,81\\n\"\n    \"2,4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 0), 3);\n    unittest::ExpectEqual(int, doc.GetCell<int>(1, 0), 9);\n    unittest::ExpectEqual(int, doc.GetCell<int>(2, 0), 81);\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"A\", \"2\"), \"4\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"B\", \"2\"), \"16\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"C\", \"2\"), \"256\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test002.cpp",
    "content": "// test002.cpp - set cell value\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"-,A,B,C\\n\"\n    \"1,3,9,81\\n\"\n    \"2,4,16,256\\n\"\n  ;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,0,0,0\\n\"\n    \"2,0,0,0\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n\n    doc.SetCell<int>(0, 0, 3);\n    doc.SetCell<int>(1, 0, 9);\n    doc.SetCell<int>(2, 0, 81);\n\n    doc.SetCell<std::string>(\"A\", \"2\", \"4\");\n    doc.SetCell<std::string>(\"B\", \"2\", \"16\");\n    doc.SetCell<std::string>(\"C\", \"2\", \"256\");\n\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 0), 3);\n    unittest::ExpectEqual(int, doc.GetCell<int>(1, 0), 9);\n    unittest::ExpectEqual(int, doc.GetCell<int>(2, 0), 81);\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"A\", \"2\"), \"4\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"B\", \"2\"), \"16\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"C\", \"2\"), \"256\");\n\n    doc.Save();\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test003.cpp",
    "content": "// test003.cpp - read column values\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,3,9,81\\n\"\n    \"2,4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n\n    std::vector<int> ints;\n    std::vector<std::string> strs;\n\n    ints = doc.GetColumn<int>(0);\n    unittest::ExpectEqual(size_t, ints.size(), 2);\n    unittest::ExpectEqual(int, ints.at(0), 3);\n    unittest::ExpectEqual(int, ints.at(1), 4);\n\n    ints = doc.GetColumn<int>(\"B\");\n    unittest::ExpectEqual(size_t, ints.size(), 2);\n    unittest::ExpectEqual(int, ints.at(0), 9);\n    unittest::ExpectEqual(int, ints.at(1), 16);\n\n    strs = doc.GetColumn<std::string>(2);\n    unittest::ExpectEqual(size_t, strs.size(), 2);\n    unittest::ExpectEqual(std::string, strs.at(0), \"81\");\n    unittest::ExpectEqual(std::string, strs.at(1), \"256\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test004.cpp",
    "content": "// test004.cpp - set column values\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"-,A,B,C\\n\"\n    \"1,3,9,81\\n\"\n    \"2,4,16,256\\n\"\n  ;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,0,0,0\\n\"\n    \"2,0,0,0\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n\n    doc.SetColumn<int>(0, std::vector<int>({ 3, 4 }));\n    doc.SetColumn<int>(\"B\", std::vector<int>({ 9, 16 }));\n    doc.SetColumn<std::string>(2, std::vector<std::string>({ \"81\", \"256\" }));\n\n    std::vector<int> ints;\n    std::vector<std::string> strs;\n\n    ints = doc.GetColumn<int>(0);\n    unittest::ExpectEqual(size_t, ints.size(), 2);\n    unittest::ExpectEqual(int, ints.at(0), 3);\n    unittest::ExpectEqual(int, ints.at(1), 4);\n\n    strs = doc.GetColumn<std::string>(1);\n    unittest::ExpectEqual(size_t, strs.size(), 2);\n    unittest::ExpectEqual(std::string, strs.at(0), \"9\");\n    unittest::ExpectEqual(std::string, strs.at(1), \"16\");\n\n    ints = doc.GetColumn<int>(\"C\");\n    unittest::ExpectEqual(size_t, ints.size(), 2);\n    unittest::ExpectEqual(int, ints.at(0), 81);\n    unittest::ExpectEqual(int, ints.at(1), 256);\n\n    doc.Save();\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test005.cpp",
    "content": "// test005.cpp - read row values\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,3,9,81\\n\"\n    \"2,4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n\n    std::vector<int> ints;\n    std::vector<std::string> strs;\n\n    ints = doc.GetRow<int>(0);\n    unittest::ExpectEqual(size_t, ints.size(), 3);\n    unittest::ExpectEqual(int, ints.at(0), 3);\n    unittest::ExpectEqual(int, ints.at(1), 9);\n    unittest::ExpectEqual(int, ints.at(2), 81);\n\n    strs = doc.GetRow<std::string>(\"2\");\n    unittest::ExpectEqual(size_t, strs.size(), 3);\n    unittest::ExpectEqual(std::string, strs.at(0), \"4\");\n    unittest::ExpectEqual(std::string, strs.at(1), \"16\");\n    unittest::ExpectEqual(std::string, strs.at(2), \"256\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test006.cpp",
    "content": "// test006.cpp - set row values\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"-,A,B,C\\n\"\n    \"1,3,9,81\\n\"\n    \"2,4,16,256\\n\"\n  ;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,0,0,0\\n\"\n    \"2,0,0,0\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n\n    doc.SetRow<int>(0, std::vector<int>({ 3, 9, 81 }));\n    doc.SetRow<std::string>(\"2\", std::vector<std::string>({ \"4\", \"16\", \"256\" }));\n\n    std::vector<int> ints;\n    std::vector<std::string> strs;\n\n    ints = doc.GetRow<int>(\"1\");\n    unittest::ExpectEqual(size_t, ints.size(), 3);\n    unittest::ExpectEqual(int, ints.at(0), 3);\n    unittest::ExpectEqual(int, ints.at(1), 9);\n    unittest::ExpectEqual(int, ints.at(2), 81);\n\n    strs = doc.GetRow<std::string>(1);\n    unittest::ExpectEqual(size_t, strs.size(), 3);\n    unittest::ExpectEqual(std::string, strs.at(0), \"4\");\n    unittest::ExpectEqual(std::string, strs.at(1), \"16\");\n    unittest::ExpectEqual(std::string, strs.at(2), \"256\");\n\n    doc.Save();\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test007.cpp",
    "content": "// test007.cpp - delete columns\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"-,B,D\\n\"\n    \"0,4,256\\n\"\n    \"1,9,6561\\n\"\n    \"2,16,65536\\n\"\n    \"3,25,390625\\n\"\n  ;\n\n  std::string csv =\n    \"-,A,B,C,D\\n\"\n    \"0,2,4,16,256\\n\"\n    \"1,3,9,81,6561\\n\"\n    \"2,4,16,256,65536\\n\"\n    \"3,5,25,625,390625\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n\n    doc.RemoveColumn(\"C\");\n    doc.RemoveColumn(0);\n\n    doc.Save();\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test008.cpp",
    "content": "// test008.cpp - delete rows\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"-,A,B,C,D\\n\"\n    \"1,3,9,81,6561\\n\"\n    \"2,4,16,256,65536\\n\"\n  ;\n\n  std::string csv =\n    \"-,A,B,C,D\\n\"\n    \"0,2,4,16,256\\n\"\n    \"1,3,9,81,6561\\n\"\n    \"2,4,16,256,65536\\n\"\n    \"3,5,25,625,390625\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n\n    doc.RemoveRow(\"3\");\n    doc.RemoveRow(0);\n\n    doc.Save();\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test009.cpp",
    "content": "// test009.cpp - generate new document by row\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \",A,B,C,D\\n\"\n    \"0,2,4,16,256\\n\"\n    \"1,3,9,81,6561\\n\"\n    \"2,4,16,256,65536\\n\"\n    \"3,5,25,625,390625\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n\n  try\n  {\n    rapidcsv::Document doc(\"\", rapidcsv::LabelParams(0, 0), rapidcsv::SeparatorParams(',', false, false));\n\n    doc.SetRow<int>(0, std::vector<int>({ 2, 4 }));\n    doc.SetRow<int>(1, std::vector<int>({ 3, 9, 81, 6561 }));\n    doc.SetRow<int>(2, std::vector<int>({ 4, 16, 256, 65536 }));\n    doc.SetRow<int>(3, std::vector<int>({ 5, 25, 625, 390625 }));\n\n    doc.SetCell<int>(2, 0, 16);\n    doc.SetCell<int>(3, 0, 256);\n\n    doc.SetColumnName(0, \"A\");\n    doc.SetColumnName(1, \"B\");\n    doc.SetColumnName(2, \"C\");\n    doc.SetColumnName(3, \"D\");\n\n    doc.SetRowName(0, \"0\");\n    doc.SetRowName(1, \"1\");\n    doc.SetRowName(2, \"2\");\n    doc.SetRowName(3, \"3\");\n\n    doc.Save(path);\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test010.cpp",
    "content": "// test010.cpp - generate new document by column\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \",A,B,C,D\\n\"\n    \"0,2,4,16,256\\n\"\n    \"1,3,9,81,6561\\n\"\n    \"2,4,16,256,65536\\n\"\n    \"3,5,25,625,390625\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n\n  try\n  {\n    rapidcsv::Document doc(\"\", rapidcsv::LabelParams(0, 0), rapidcsv::SeparatorParams(',', false, false));\n\n    doc.SetColumn<int>(0, std::vector<int>({ 2, 3 }));\n    doc.SetColumn<int>(1, std::vector<int>({ 4, 9, 16, 25 }));\n    doc.SetColumn<int>(2, std::vector<int>({ 16, 81, 256, 625 }));\n    doc.SetColumn<int>(3, std::vector<int>({ 256, 6561, 65536, 390625 }));\n\n    doc.SetCell<int>(0, 2, 4);\n    doc.SetCell<int>(0, 3, 5);\n\n    doc.SetColumnName(0, \"A\");\n    doc.SetColumnName(1, \"B\");\n    doc.SetColumnName(2, \"C\");\n    doc.SetColumnName(3, \"D\");\n\n    doc.SetRowName(0, \"0\");\n    doc.SetRowName(1, \"1\");\n    doc.SetRowName(2, \"2\");\n    doc.SetRowName(3, \"3\");\n\n    doc.Save(path);\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test011.cpp",
    "content": "// test011.cpp - generate new document by cell\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \",A,B,C\\n\"\n    \"1,3,9,81\\n\"\n    \"2,4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n\n  try\n  {\n    rapidcsv::Document doc(\"\", rapidcsv::LabelParams(0, 0), rapidcsv::SeparatorParams(',', false, false));\n\n    doc.SetCell<int>(0, 0, 3);\n    doc.SetCell<int>(1, 0, 9);\n    doc.SetCell<int>(2, 0, 81);\n\n    doc.SetCell<int>(0, 1, 4);\n    doc.SetCell<int>(1, 1, 16);\n    doc.SetCell<int>(2, 1, 256);\n\n    doc.SetColumnName(0, \"A\");\n    doc.SetColumnName(1, \"B\");\n    doc.SetColumnName(2, \"C\");\n\n    doc.SetRowName(0, \"1\");\n    doc.SetRowName(1, \"2\");\n\n    doc.Save(path);\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test012.cpp",
    "content": "// test012.cpp - read cell value, no row labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"A,B,C\\n\"\n    \"3,9,81\\n\"\n    \"4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path);\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 0), 3);\n    unittest::ExpectEqual(int, doc.GetCell<int>(1, 0), 9);\n    unittest::ExpectEqual(int, doc.GetCell<int>(2, 0), 81);\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(0, 1), \"4\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(1, 1), \"16\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(2, 1), \"256\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test013.cpp",
    "content": "// test013.cpp - set cell value, no row labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"A,B,C\\n\"\n    \"3,9,81\\n\"\n    \"4,16,256\\n\"\n  ;\n\n  std::string csv =\n    \"A,B,C\\n\"\n    \"0,0,0\\n\"\n    \"0,0,0\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path);\n\n    doc.SetCell<int>(0, 0, 3);\n    doc.SetCell<int>(1, 0, 9);\n    doc.SetCell<int>(2, 0, 81);\n\n    doc.SetCell<std::string>(0, 1, \"4\");\n    doc.SetCell<std::string>(1, 1, \"16\");\n    doc.SetCell<std::string>(2, 1, \"256\");\n\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 0), 3);\n    unittest::ExpectEqual(int, doc.GetCell<int>(1, 0), 9);\n    unittest::ExpectEqual(int, doc.GetCell<int>(2, 0), 81);\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(0, 1), \"4\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(1, 1), \"16\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(2, 1), \"256\");\n\n    doc.Save();\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test014.cpp",
    "content": "// test014.cpp - read column values, no row labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"A,B,C\\n\"\n    \"3,9,81\\n\"\n    \"4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path);\n\n    std::vector<int> ints;\n    std::vector<std::string> strs;\n\n    ints = doc.GetColumn<int>(0);\n    unittest::ExpectEqual(size_t, ints.size(), 2);\n    unittest::ExpectEqual(int, ints.at(0), 3);\n    unittest::ExpectEqual(int, ints.at(1), 4);\n\n    ints = doc.GetColumn<int>(\"B\");\n    unittest::ExpectEqual(size_t, ints.size(), 2);\n    unittest::ExpectEqual(int, ints.at(0), 9);\n    unittest::ExpectEqual(int, ints.at(1), 16);\n\n    strs = doc.GetColumn<std::string>(2);\n    unittest::ExpectEqual(size_t, strs.size(), 2);\n    unittest::ExpectEqual(std::string, strs.at(0), \"81\");\n    unittest::ExpectEqual(std::string, strs.at(1), \"256\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test015.cpp",
    "content": "// test015.cpp - set column values, no row labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"A,B,C\\n\"\n    \"3,9,81\\n\"\n    \"4,16,256\\n\"\n  ;\n\n  std::string csv =\n    \"A,B,C\\n\"\n    \"0,0,0\\n\"\n    \"0,0,0\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path);\n\n    doc.SetColumn<int>(0, std::vector<int>({ 3, 4 }));\n    doc.SetColumn<int>(\"B\", std::vector<int>({ 9, 16 }));\n    doc.SetColumn<std::string>(2, std::vector<std::string>({ \"81\", \"256\" }));\n\n    std::vector<int> ints;\n    std::vector<std::string> strs;\n\n    ints = doc.GetColumn<int>(0);\n    unittest::ExpectEqual(size_t, ints.size(), 2);\n    unittest::ExpectEqual(int, ints.at(0), 3);\n    unittest::ExpectEqual(int, ints.at(1), 4);\n\n    strs = doc.GetColumn<std::string>(1);\n    unittest::ExpectEqual(size_t, strs.size(), 2);\n    unittest::ExpectEqual(std::string, strs.at(0), \"9\");\n    unittest::ExpectEqual(std::string, strs.at(1), \"16\");\n\n    ints = doc.GetColumn<int>(\"C\");\n    unittest::ExpectEqual(size_t, ints.size(), 2);\n    unittest::ExpectEqual(int, ints.at(0), 81);\n    unittest::ExpectEqual(int, ints.at(1), 256);\n\n    doc.Save();\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test016.cpp",
    "content": "// test016.cpp - read row values, no row labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"A,B,C\\n\"\n    \"3,9,81\\n\"\n    \"4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path);\n\n    std::vector<int> ints;\n    std::vector<std::string> strs;\n\n    ints = doc.GetRow<int>(0);\n    unittest::ExpectEqual(size_t, ints.size(), 3);\n    unittest::ExpectEqual(int, ints.at(0), 3);\n    unittest::ExpectEqual(int, ints.at(1), 9);\n    unittest::ExpectEqual(int, ints.at(2), 81);\n\n    strs = doc.GetRow<std::string>(1);\n    unittest::ExpectEqual(size_t, strs.size(), 3);\n    unittest::ExpectEqual(std::string, strs.at(0), \"4\");\n    unittest::ExpectEqual(std::string, strs.at(1), \"16\");\n    unittest::ExpectEqual(std::string, strs.at(2), \"256\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test017.cpp",
    "content": "// test017.cpp - set row values, no row labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"A,B,C\\n\"\n    \"3,9,81\\n\"\n    \"4,16,256\\n\"\n  ;\n\n  std::string csv =\n    \"A,B,C\\n\"\n    \"0,0,0\\n\"\n    \"0,0,0\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path);\n\n    doc.SetRow<int>(0, std::vector<int>({ 3, 9, 81 }));\n    doc.SetRow<std::string>(1, std::vector<std::string>({ \"4\", \"16\", \"256\" }));\n\n    std::vector<int> ints;\n    std::vector<std::string> strs;\n\n    ints = doc.GetRow<int>(0);\n    unittest::ExpectEqual(size_t, ints.size(), 3);\n    unittest::ExpectEqual(int, ints.at(0), 3);\n    unittest::ExpectEqual(int, ints.at(1), 9);\n    unittest::ExpectEqual(int, ints.at(2), 81);\n\n    strs = doc.GetRow<std::string>(1);\n    unittest::ExpectEqual(size_t, strs.size(), 3);\n    unittest::ExpectEqual(std::string, strs.at(0), \"4\");\n    unittest::ExpectEqual(std::string, strs.at(1), \"16\");\n    unittest::ExpectEqual(std::string, strs.at(2), \"256\");\n\n    doc.Save();\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test018.cpp",
    "content": "// test018.cpp - delete columns, no row labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"B,D\\n\"\n    \"4,256\\n\"\n    \"9,6561\\n\"\n    \"16,65536\\n\"\n    \"25,390625\\n\"\n  ;\n\n  std::string csv =\n    \"A,B,C,D\\n\"\n    \"2,4,16,256\\n\"\n    \"3,9,81,6561\\n\"\n    \"4,16,256,65536\\n\"\n    \"5,25,625,390625\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path);\n\n    doc.RemoveColumn(\"C\");\n    doc.RemoveColumn(0);\n\n    doc.Save();\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test019.cpp",
    "content": "// test019.cpp - delete rows, no row labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"A,B,C,D\\n\"\n    \"3,9,81,6561\\n\"\n    \"4,16,256,65536\\n\"\n  ;\n\n  std::string csv =\n    \"A,B,C,D\\n\"\n    \"2,4,16,256\\n\"\n    \"3,9,81,6561\\n\"\n    \"4,16,256,65536\\n\"\n    \"5,25,625,390625\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path);\n\n    doc.RemoveRow(3);\n    doc.RemoveRow(0);\n\n    doc.Save();\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test020.cpp",
    "content": "// test020.cpp - generate new document by row, no row labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"A,B,C,D\\n\"\n    \"2,4,16,256\\n\"\n    \"3,9,81,6561\\n\"\n    \"4,16,256,65536\\n\"\n    \"5,25,625,390625\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n\n  try\n  {\n    rapidcsv::Document doc(\"\", rapidcsv::LabelParams(), rapidcsv::SeparatorParams(',', false, false));\n\n    doc.SetRow<int>(0, std::vector<int>({ 2, 4 }));\n    doc.SetRow<int>(1, std::vector<int>({ 3, 9, 81, 6561 }));\n    doc.SetRow<int>(2, std::vector<int>({ 4, 16, 256, 65536 }));\n    doc.SetRow<int>(3, std::vector<int>({ 5, 25, 625, 390625 }));\n\n    doc.SetCell<int>(2, 0, 16);\n    doc.SetCell<int>(3, 0, 256);\n\n    doc.SetColumnName(0, \"A\");\n    doc.SetColumnName(1, \"B\");\n    doc.SetColumnName(2, \"C\");\n    doc.SetColumnName(3, \"D\");\n\n    doc.Save(path);\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test021.cpp",
    "content": "// test021.cpp - generate new document by column, no row labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"A,B,C,D\\n\"\n    \"2,4,16,256\\n\"\n    \"3,9,81,6561\\n\"\n    \"4,16,256,65536\\n\"\n    \"5,25,625,390625\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n\n  try\n  {\n    rapidcsv::Document doc(\"\", rapidcsv::LabelParams(), rapidcsv::SeparatorParams(',', false, false));\n\n    doc.SetColumn<int>(0, std::vector<int>({ 2, 3 }));\n    doc.SetColumn<int>(1, std::vector<int>({ 4, 9, 16, 25 }));\n    doc.SetColumn<int>(2, std::vector<int>({ 16, 81, 256, 625 }));\n    doc.SetColumn<int>(3, std::vector<int>({ 256, 6561, 65536, 390625 }));\n\n    doc.SetCell<int>(0, 2, 4);\n    doc.SetCell<int>(0, 3, 5);\n\n    doc.SetColumnName(0, \"A\");\n    doc.SetColumnName(1, \"B\");\n    doc.SetColumnName(2, \"C\");\n    doc.SetColumnName(3, \"D\");\n\n    doc.Save(path);\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test022.cpp",
    "content": "// test022.cpp - generate new document by cell, no row labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"A,B,C\\n\"\n    \"3,9,81\\n\"\n    \"4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n\n  try\n  {\n    rapidcsv::Document doc(\"\", rapidcsv::LabelParams(), rapidcsv::SeparatorParams(',', false, false));\n\n    doc.SetCell<int>(0, 0, 3);\n    doc.SetCell<int>(1, 0, 9);\n    doc.SetCell<int>(2, 0, 81);\n\n    doc.SetCell<int>(0, 1, 4);\n    doc.SetCell<int>(1, 1, 16);\n    doc.SetCell<int>(2, 1, 256);\n\n    doc.SetColumnName(0, \"A\");\n    doc.SetColumnName(1, \"B\");\n    doc.SetColumnName(2, \"C\");\n\n    doc.Save(path);\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test023.cpp",
    "content": "// test023.cpp - read cell value, no row/column labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"3,9,81\\n\"\n    \"4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(-1, -1));\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 0), 3);\n    unittest::ExpectEqual(int, doc.GetCell<int>(1, 0), 9);\n    unittest::ExpectEqual(int, doc.GetCell<int>(2, 0), 81);\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(0, 1), \"4\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(1, 1), \"16\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(2, 1), \"256\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test024.cpp",
    "content": "// test024.cpp - set cell value, no row/column labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"3,9,81\\n\"\n    \"4,16,256\\n\"\n  ;\n\n  std::string csv =\n    \"0,0,0\\n\"\n    \"0,0,0\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(-1, -1));\n\n    doc.SetCell<int>(0, 0, 3);\n    doc.SetCell<int>(1, 0, 9);\n    doc.SetCell<int>(2, 0, 81);\n\n    doc.SetCell<std::string>(0, 1, \"4\");\n    doc.SetCell<std::string>(1, 1, \"16\");\n    doc.SetCell<std::string>(2, 1, \"256\");\n\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 0), 3);\n    unittest::ExpectEqual(int, doc.GetCell<int>(1, 0), 9);\n    unittest::ExpectEqual(int, doc.GetCell<int>(2, 0), 81);\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(0, 1), \"4\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(1, 1), \"16\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(2, 1), \"256\");\n\n    doc.Save();\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test025.cpp",
    "content": "// test025.cpp - read column values, no row/column labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"3,9,81\\n\"\n    \"4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(-1, -1));\n\n    std::vector<int> ints;\n    std::vector<std::string> strs;\n\n    ints = doc.GetColumn<int>(0);\n    unittest::ExpectEqual(size_t, ints.size(), 2);\n    unittest::ExpectEqual(int, ints.at(0), 3);\n    unittest::ExpectEqual(int, ints.at(1), 4);\n\n    ints = doc.GetColumn<int>(1);\n    unittest::ExpectEqual(size_t, ints.size(), 2);\n    unittest::ExpectEqual(int, ints.at(0), 9);\n    unittest::ExpectEqual(int, ints.at(1), 16);\n\n    strs = doc.GetColumn<std::string>(2);\n    unittest::ExpectEqual(size_t, strs.size(), 2);\n    unittest::ExpectEqual(std::string, strs.at(0), \"81\");\n    unittest::ExpectEqual(std::string, strs.at(1), \"256\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test026.cpp",
    "content": "// test026.cpp - set column values, no row/column labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"3,9,81\\n\"\n    \"4,16,256\\n\"\n  ;\n\n  std::string csv =\n    \"0,0,0\\n\"\n    \"0,0,0\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(-1, -1));\n\n    doc.SetColumn<int>(0, std::vector<int>({ 3, 4 }));\n    doc.SetColumn<int>(1, std::vector<int>({ 9, 16 }));\n    doc.SetColumn<std::string>(2, std::vector<std::string>({ \"81\", \"256\" }));\n\n    std::vector<int> ints;\n    std::vector<std::string> strs;\n\n    ints = doc.GetColumn<int>(0);\n    unittest::ExpectEqual(size_t, ints.size(), 2);\n    unittest::ExpectEqual(int, ints.at(0), 3);\n    unittest::ExpectEqual(int, ints.at(1), 4);\n\n    strs = doc.GetColumn<std::string>(1);\n    unittest::ExpectEqual(size_t, strs.size(), 2);\n    unittest::ExpectEqual(std::string, strs.at(0), \"9\");\n    unittest::ExpectEqual(std::string, strs.at(1), \"16\");\n\n    ints = doc.GetColumn<int>(2);\n    unittest::ExpectEqual(size_t, ints.size(), 2);\n    unittest::ExpectEqual(int, ints.at(0), 81);\n    unittest::ExpectEqual(int, ints.at(1), 256);\n\n    doc.Save();\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test027.cpp",
    "content": "// test027.cpp - read row values, no row/column labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"3,9,81\\n\"\n    \"4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(-1, -1));\n\n    std::vector<int> ints;\n    std::vector<std::string> strs;\n\n    ints = doc.GetRow<int>(0);\n    unittest::ExpectEqual(size_t, ints.size(), 3);\n    unittest::ExpectEqual(int, ints.at(0), 3);\n    unittest::ExpectEqual(int, ints.at(1), 9);\n    unittest::ExpectEqual(int, ints.at(2), 81);\n\n    strs = doc.GetRow<std::string>(1);\n    unittest::ExpectEqual(size_t, strs.size(), 3);\n    unittest::ExpectEqual(std::string, strs.at(0), \"4\");\n    unittest::ExpectEqual(std::string, strs.at(1), \"16\");\n    unittest::ExpectEqual(std::string, strs.at(2), \"256\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test028.cpp",
    "content": "// test028.cpp - set row values, no row/column labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"3,9,81\\n\"\n    \"4,16,256\\n\"\n  ;\n\n  std::string csv =\n    \"0,0,0\\n\"\n    \"0,0,0\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(-1, -1));\n\n    doc.SetRow<int>(0, std::vector<int>({ 3, 9, 81 }));\n    doc.SetRow<std::string>(1, std::vector<std::string>({ \"4\", \"16\", \"256\" }));\n\n    std::vector<int> ints;\n    std::vector<std::string> strs;\n\n    ints = doc.GetRow<int>(0);\n    unittest::ExpectEqual(size_t, ints.size(), 3);\n    unittest::ExpectEqual(int, ints.at(0), 3);\n    unittest::ExpectEqual(int, ints.at(1), 9);\n    unittest::ExpectEqual(int, ints.at(2), 81);\n\n    strs = doc.GetRow<std::string>(1);\n    unittest::ExpectEqual(size_t, strs.size(), 3);\n    unittest::ExpectEqual(std::string, strs.at(0), \"4\");\n    unittest::ExpectEqual(std::string, strs.at(1), \"16\");\n    unittest::ExpectEqual(std::string, strs.at(2), \"256\");\n\n    doc.Save();\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test029.cpp",
    "content": "// test029.cpp - delete columns, no row/column labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"4,256\\n\"\n    \"9,6561\\n\"\n    \"16,65536\\n\"\n    \"25,390625\\n\"\n  ;\n\n  std::string csv =\n    \"2,4,16,256\\n\"\n    \"3,9,81,6561\\n\"\n    \"4,16,256,65536\\n\"\n    \"5,25,625,390625\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(-1, -1));\n\n    doc.RemoveColumn(2);\n    doc.RemoveColumn(0);\n\n    doc.Save();\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test030.cpp",
    "content": "// test030.cpp - delete rows, no row/column labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"3,9,81,6561\\n\"\n    \"4,16,256,65536\\n\"\n  ;\n\n  std::string csv =\n    \"2,4,16,256\\n\"\n    \"3,9,81,6561\\n\"\n    \"4,16,256,65536\\n\"\n    \"5,25,625,390625\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(-1, -1));\n\n    doc.RemoveRow(3);\n    doc.RemoveRow(0);\n\n    doc.Save();\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test031.cpp",
    "content": "// test031.cpp - generate new document by row, no row/column labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"2,4,16,256\\n\"\n    \"3,9,81,6561\\n\"\n    \"4,16,256,65536\\n\"\n    \"5,25,625,390625\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n\n  try\n  {\n    rapidcsv::Document doc(\"\", rapidcsv::LabelParams(-1, -1), rapidcsv::SeparatorParams(',', false, false));\n\n    doc.SetRow<int>(0, std::vector<int>({ 2, 4 }));\n    doc.SetRow<int>(1, std::vector<int>({ 3, 9, 81, 6561 }));\n    doc.SetRow<int>(2, std::vector<int>({ 4, 16, 256, 65536 }));\n    doc.SetRow<int>(3, std::vector<int>({ 5, 25, 625, 390625 }));\n\n    doc.SetCell<int>(2, 0, 16);\n    doc.SetCell<int>(3, 0, 256);\n\n    doc.Save(path);\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test032.cpp",
    "content": "// test032.cpp - generate new document by column, no row/column labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"2,4,16,256\\n\"\n    \"3,9,81,6561\\n\"\n    \"4,16,256,65536\\n\"\n    \"5,25,625,390625\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n\n  try\n  {\n    rapidcsv::Document doc(\"\", rapidcsv::LabelParams(-1, -1), rapidcsv::SeparatorParams(',', false, false));\n\n    doc.SetColumn<int>(0, std::vector<int>({ 2, 3 }));\n    doc.SetColumn<int>(1, std::vector<int>({ 4, 9, 16, 25 }));\n    doc.SetColumn<int>(2, std::vector<int>({ 16, 81, 256, 625 }));\n    doc.SetColumn<int>(3, std::vector<int>({ 256, 6561, 65536, 390625 }));\n\n    doc.SetCell<int>(0, 2, 4);\n    doc.SetCell<int>(0, 3, 5);\n\n    doc.Save(path);\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test033.cpp",
    "content": "// test033.cpp - generate new document by cell, no row/column labels\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"3,9,81\\n\"\n    \"4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n\n  try\n  {\n    rapidcsv::Document doc(\"\", rapidcsv::LabelParams(-1, -1), rapidcsv::SeparatorParams(',', false, false));\n\n    doc.SetCell<int>(0, 0, 3);\n    doc.SetCell<int>(1, 0, 9);\n    doc.SetCell<int>(2, 0, 81);\n\n    doc.SetCell<int>(0, 1, 4);\n    doc.SetCell<int>(1, 1, 16);\n    doc.SetCell<int>(2, 1, 256);\n\n    doc.Save(path);\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test034.cpp",
    "content": "// test034.cpp - copy document\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,3,9,81\\n\"\n    \"2,4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  std::string pathcopy = unittest::TempPath();\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n\n    rapidcsv::Document doccopy(doc);\n\n    doccopy.Save(pathcopy);\n\n    std::string csvread = unittest::ReadFile(pathcopy);\n\n    unittest::ExpectEqual(std::string, csv, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n  unittest::DeleteFile(pathcopy);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test035.cpp",
    "content": "// test035.cpp - custom conversion\n\n#include <iomanip>\n#include <math.h>\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\n// Data requested as ints to be converted to fixed-point two decimal numbers\nnamespace rapidcsv\n{\n  template<>\n  void Converter<int>::ToVal(const std::string& pStr, int& pVal) const\n  {\n    pVal = static_cast<int>(roundf(100.0f * std::stof(pStr)));\n  }\n\n  template<>\n  void Converter<int>::ToStr(const int& pVal, std::string& pStr) const\n  {\n    std::ostringstream out;\n    out << std::fixed << std::setprecision(2) << static_cast<float>(pVal) / 100.0f;\n    pStr = out.str();\n  }\n}\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"1,10,100,1000\\n\"\n    \"0.1,0.01,0.001,0.006\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(-1, -1));\n\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 0), 100);\n    unittest::ExpectEqual(int, doc.GetCell<int>(1, 0), 1000);\n    unittest::ExpectEqual(int, doc.GetCell<int>(2, 0), 10000);\n    unittest::ExpectEqual(int, doc.GetCell<int>(3, 0), 100000);\n\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 1), 10);\n    unittest::ExpectEqual(int, doc.GetCell<int>(1, 1), 1);\n    unittest::ExpectEqual(int, doc.GetCell<int>(2, 1), 0);\n    unittest::ExpectEqual(int, doc.GetCell<int>(3, 1), 1);\n\n    doc.SetCell<int>(0, 0, 12345);\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(0, 0), \"123.45\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test036.cpp",
    "content": "// test036.cpp - supported datatypes\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"int,32767\\n\"\n    \"long,2147483647\\n\"\n    \"long long,9223372036854775807\\n\"\n    \"unsigned,65535\\n\"\n    \"unsigned long,4294967295\\n\"\n    \"unsigned long long,18446744073709551615\\n\"\n    \"float,3.3E38\\n\"\n    \"double,1.6E308\\n\"\n    \"long double,1.6E308\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(-1, -1));\n\n    unittest::ExpectEqual(int, doc.GetCell<int>(1, 0), 32767);\n    unittest::ExpectEqual(long, doc.GetCell<long>(1, 1), 2147483647);\n    unittest::ExpectEqual(long long, doc.GetCell<long long>(1, 2), 9223372036854775807);\n\n    unittest::ExpectEqual(unsigned, doc.GetCell<unsigned>(1, 3), 65535);\n    unittest::ExpectEqual(unsigned long, doc.GetCell<unsigned long>(1, 4), 4294967295);\n    unittest::ExpectEqual(unsigned long long, doc.GetCell<unsigned long long>(1, 5), 18446744073709551615llu);\n\n    float floatval = doc.GetCell<float>(1, 6);\n    unittest::ExpectTrue((floatval > 3.2E38) && (floatval < 3.4E38));\n\n    double doubleval = doc.GetCell<double>(1, 7);\n    unittest::ExpectTrue((doubleval > 1.5E308) && (doubleval < 1.7E308));\n\n    long double longdoubleval = doc.GetCell<long double>(1, 8);\n    unittest::ExpectTrue((longdoubleval > 1.5E308) && (longdoubleval < 1.7E308));\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test037.cpp",
    "content": "// test036.cpp - double quote handling\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"1997,Ford,,Truck\\n\"\n    \" 1997, Ford, E350, Truck\\n\"\n    \" 1997 , Ford , E350 , Truck \\n\"\n    \"\\\"1997\\\",\\\"Ford\\\",\\\"E350\\\",\\\"Truck\\\"\\n\"\n    \"1997,Ford,E350,\\\"Super, luxurious truck\\\"\\n\"\n    \"1997,Ford,E350,\\\"Super, \\\"\\\"luxurious, fast\\\"\\\" truck\\\"\\n\"\n\n    \"Los Angeles,34°03'N,118°15'W,US\\n\"\n    \"New York City,40°42'46\\\"N,74°00'21\\\"W,US\\n\"\n    \"Paris,48°51'24\\\"N,2°21'03\\\"E,France\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(-1, -1));\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(0, 0), \"1997\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(1, 0), \"Ford\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(2, 0), \"\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(3, 0), \"Truck\");\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(0, 1), \" 1997\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(1, 1), \" Ford\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(2, 1), \" E350\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(3, 1), \" Truck\");\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(0, 2), \" 1997 \");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(1, 2), \" Ford \");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(2, 2), \" E350 \");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(3, 2), \" Truck \");\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(0, 3), \"\\\"1997\\\"\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(1, 3), \"\\\"Ford\\\"\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(2, 3), \"\\\"E350\\\"\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(3, 3), \"\\\"Truck\\\"\");\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(0, 4), \"1997\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(1, 4), \"Ford\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(2, 4), \"E350\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(3, 4), \"\\\"Super, luxurious truck\\\"\");\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(0, 5), \"1997\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(1, 5), \"Ford\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(2, 5), \"E350\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(3, 5), \"\\\"Super, \\\"\\\"luxurious, fast\\\"\\\" truck\\\"\");\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(0, 6), \"Los Angeles\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(1, 6), \"34°03'N\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(2, 6), \"118°15'W\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(3, 6), \"US\");\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(0, 7), \"New York City\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(1, 7), \"40°42'46\\\"N\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(2, 7), \"74°00'21\\\"W\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(3, 7), \"US\");\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(0, 8), \"Paris\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(1, 8), \"48°51'24\\\"N\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(2, 8), \"2°21'03\\\"E\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(3, 8), \"France\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test038.cpp",
    "content": "// test038.cpp - read windows CR/LF linebreaks\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,3,9,81\\r\\n\"\n    \"2,4,16,256\\r\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(0, 0), \"3\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(1, 0), \"9\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(2, 0), \"81\");\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(0, 1), \"4\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(1, 1), \"16\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(2, 1), \"256\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test039.cpp",
    "content": "// test039.cpp - write windows CR/LF linebreaks\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\r\\n\"\n    \"1,3,9,81\\r\\n\"\n    \"2,4,16,256\\r\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(0, 0), \"3\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(1, 0), \"9\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(2, 0), \"81\");\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(0, 1), \"4\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(1, 1), \"16\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(2, 1), \"256\");\n\n    doc.Save();\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csv, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test040.cpp",
    "content": "// test040.cpp - multiple translation units, part 1\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint help_func();\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,3,9,81\\n\"\n    \"2,4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 0), 3);\n    unittest::ExpectEqual(int, doc.GetCell<int>(1, 0), 9);\n    unittest::ExpectEqual(int, doc.GetCell<int>(2, 0), 81);\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"A\", \"2\"), \"4\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"B\", \"2\"), \"16\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"C\", \"2\"), \"256\");\n\n    rv += help_func();\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test040b.cpp",
    "content": "// test040b.cpp - multiple translation units, part 2\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint help_func()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,3,9,81\\n\"\n    \"2,4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 0), 3);\n    unittest::ExpectEqual(int, doc.GetCell<int>(1, 0), 9);\n    unittest::ExpectEqual(int, doc.GetCell<int>(2, 0), 81);\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"A\", \"2\"), \"4\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"B\", \"2\"), \"16\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"C\", \"2\"), \"256\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test041.cpp",
    "content": "// test041.cpp - handling no linebreak at end of last line\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,3,9,81\\n\"\n    \"2,4,16,256\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 0), 3);\n    unittest::ExpectEqual(int, doc.GetCell<int>(1, 0), 9);\n    unittest::ExpectEqual(int, doc.GetCell<int>(2, 0), 81);\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"A\", \"2\"), \"4\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"B\", \"2\"), \"16\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"C\", \"2\"), \"256\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test042.cpp",
    "content": "// test042.cpp - test GetColumnCount() and GetRowCount()\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,3,9,81\\n\"\n    \"2,4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc1(path, rapidcsv::LabelParams(0, 0));\n    unittest::ExpectEqual(size_t, doc1.GetColumnCount(), 3);\n    unittest::ExpectEqual(size_t, doc1.GetRowCount(), 2);\n\n    rapidcsv::Document doc2(path, rapidcsv::LabelParams(-1, -1));\n    unittest::ExpectEqual(size_t, doc2.GetColumnCount(), 4);\n    unittest::ExpectEqual(size_t, doc2.GetRowCount(), 3);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test043.cpp",
    "content": "// test043.cpp - read column and row values as char\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,a,b,c\\n\"\n    \"2,x,y,z\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n\n    std::vector<char> chars;\n\n    chars = doc.GetColumn<char>(0);\n    unittest::ExpectEqual(size_t, chars.size(), 2);\n    unittest::ExpectEqual(char, chars.at(0), 'a');\n    unittest::ExpectEqual(char, chars.at(1), 'x');\n\n    chars = doc.GetColumn<char>(\"B\");\n    unittest::ExpectEqual(size_t, chars.size(), 2);\n    unittest::ExpectEqual(char, chars.at(0), 'b');\n    unittest::ExpectEqual(char, chars.at(1), 'y');\n\n    chars = doc.GetRow<char>(\"2\");\n    unittest::ExpectEqual(size_t, chars.size(), 3);\n    unittest::ExpectEqual(char, chars.at(0), 'x');\n    unittest::ExpectEqual(char, chars.at(1), 'y');\n    unittest::ExpectEqual(char, chars.at(2), 'z');\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test044.cpp",
    "content": "// test044.cpp - set column values as char\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"-,A,B,C\\n\"\n    \"1,a,b,c\\n\"\n    \"2,x,y,z\\n\"\n  ;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,0,0,0\\n\"\n    \"2,0,0,0\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n\n    doc.SetColumn<char>(0, std::vector<char>({ 'a', 'x' }));\n    doc.SetColumn<char>(1, std::vector<char>({ 'b', 'y' }));\n    doc.SetColumn<char>(\"C\", std::vector<char>({ 'c', 'z' }));\n\n    doc.Save();\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test045.cpp",
    "content": "// test045.cpp - read data with custom separator\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-;A;B;C\\n\"\n    \"1;3;9;81\\n\"\n    \"2;4;16;256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0), rapidcsv::SeparatorParams(';'));\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 0), 3);\n    unittest::ExpectEqual(int, doc.GetCell<int>(1, 0), 9);\n    unittest::ExpectEqual(int, doc.GetCell<int>(2, 0), 81);\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"A\", \"2\"), \"4\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"B\", \"2\"), \"16\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"C\", \"2\"), \"256\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test046.cpp",
    "content": "// test046.cpp - write data with custom separator\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"-;A;B;C\\n\"\n    \"1;3;9;81\\n\"\n    \"2;4;16;256\\n\"\n  ;\n\n  std::string csv =\n    \"-;A;B;C\\n\"\n    \"1;0;0;0\\n\"\n    \"2;0;0;0\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0), rapidcsv::SeparatorParams(';'));\n\n    doc.SetCell<int>(0, 0, 3);\n    doc.SetCell<int>(1, 0, 9);\n    doc.SetCell<int>(2, 0, 81);\n\n    doc.SetCell<std::string>(\"A\", \"2\", \"4\");\n    doc.SetCell<std::string>(\"B\", \"2\", \"16\");\n    doc.SetCell<std::string>(\"C\", \"2\", \"256\");\n\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 0), 3);\n    unittest::ExpectEqual(int, doc.GetCell<int>(1, 0), 9);\n    unittest::ExpectEqual(int, doc.GetCell<int>(2, 0), 81);\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"A\", \"2\"), \"4\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"B\", \"2\"), \"16\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"C\", \"2\"), \"256\");\n\n    doc.Save();\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test047.cpp",
    "content": "// test047.cpp - exception on invalid conversion\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,,x,#\\n\"\n    \"2,,y,$\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n\n    ExpectException(doc.GetCell<int>(0, 0), std::invalid_argument);\n    ExpectException(doc.GetCell<int>(1, 0), std::invalid_argument);\n    ExpectException(doc.GetCell<int>(2, 0), std::invalid_argument);\n\n    ExpectException(doc.GetCell<double>(0, 1), std::invalid_argument);\n    ExpectException(doc.GetCell<double>(1, 1), std::invalid_argument);\n    ExpectException(doc.GetCell<double>(2, 1), std::invalid_argument);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test048.cpp",
    "content": "// test048.cpp - default conversion to default values\n\n#include <cmath>\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,,x,#\\n\"\n    \"2,,y,$\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0), rapidcsv::SeparatorParams(),\n                           rapidcsv::ConverterParams(true));\n\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 0), 0);\n    unittest::ExpectEqual(long long, doc.GetCell<long long>(1, 0), 0);\n    unittest::ExpectEqual(unsigned int, doc.GetCell<unsigned int>(2, 0), 0);\n\n    unittest::ExpectTrue(std::isnan(doc.GetCell<double>(0, 1)));\n    unittest::ExpectTrue(std::isnan(doc.GetCell<long double>(1, 1)));\n    unittest::ExpectTrue(std::isnan(doc.GetCell<float>(2, 1)));\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test049.cpp",
    "content": "// test049.cpp - default conversion to custom values\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,,x,#\\n\"\n    \"2,,y,$\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0), rapidcsv::SeparatorParams(),\n                           rapidcsv::ConverterParams(true, 0.0, 1));\n\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 0), 1);\n    unittest::ExpectEqual(long long, doc.GetCell<long long>(1, 0), 1);\n    unittest::ExpectEqual(unsigned int, doc.GetCell<unsigned int>(2, 0), 1);\n\n    unittest::ExpectEqual(double, doc.GetCell<double>(0, 1), 0.0);\n    unittest::ExpectEqual(long double, doc.GetCell<long double>(1, 1), 0.0);\n    unittest::ExpectEqual(float, doc.GetCell<float>(2, 1), 0.0);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test050.cpp",
    "content": "// test050.cpp - read column header / label by index\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,3,9,81\\n\"\n    \"2,4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n    unittest::ExpectEqual(std::string, doc.GetColumnName(0), \"A\");\n    unittest::ExpectEqual(std::string, doc.GetColumnName(1), \"B\");\n    unittest::ExpectEqual(std::string, doc.GetColumnName(2), \"C\");\n    ExpectException(doc.GetColumnName(3), std::out_of_range);\n\n    rapidcsv::Document doc2(path, rapidcsv::LabelParams(-1, -1));\n    ExpectException(doc2.GetColumnName(0), std::out_of_range);\n\n    rapidcsv::Document doc3(path, rapidcsv::LabelParams(0, -1));\n    unittest::ExpectEqual(std::string, doc3.GetColumnName(0), \"-\");\n    unittest::ExpectEqual(std::string, doc3.GetColumnName(1), \"A\");\n    unittest::ExpectEqual(std::string, doc3.GetColumnName(2), \"B\");\n    unittest::ExpectEqual(std::string, doc3.GetColumnName(3), \"C\");\n    ExpectException(doc3.GetColumnName(4), std::out_of_range);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test051.cpp",
    "content": "// test051.cpp - get column and row names\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,3,9,81\\n\"\n    \"2,4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n    std::vector<std::string> columnNames = doc.GetColumnNames();\n    unittest::ExpectEqual(size_t, columnNames.size(), 3);\n    unittest::ExpectEqual(std::string, columnNames[0], \"A\");\n    unittest::ExpectEqual(std::string, columnNames[1], \"B\");\n    unittest::ExpectEqual(std::string, columnNames[2], \"C\");\n\n    std::vector<std::string> rowNames = doc.GetRowNames();\n    unittest::ExpectEqual(size_t, rowNames.size(), 2);\n    unittest::ExpectEqual(std::string, rowNames[0], \"1\");\n    unittest::ExpectEqual(std::string, rowNames[1], \"2\");\n\n    rapidcsv::Document doc2(path, rapidcsv::LabelParams(0, -1));\n    std::vector<std::string> columnNames2 = doc2.GetColumnNames();\n    unittest::ExpectEqual(size_t, columnNames2.size(), 4);\n    unittest::ExpectEqual(std::string, columnNames2[0], \"-\");\n    unittest::ExpectEqual(std::string, columnNames2[1], \"A\");\n    unittest::ExpectEqual(std::string, columnNames2[2], \"B\");\n    unittest::ExpectEqual(std::string, columnNames2[3], \"C\");\n\n    rapidcsv::Document doc3(path, rapidcsv::LabelParams(-1, 0));\n    std::vector<std::string> rowNames2 = doc3.GetRowNames();\n    unittest::ExpectEqual(size_t, rowNames2.size(), 3);\n    unittest::ExpectEqual(std::string, rowNames2[0], \"-\");\n    unittest::ExpectEqual(std::string, rowNames2[1], \"1\");\n    unittest::ExpectEqual(std::string, rowNames2[2], \"2\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test052.cpp",
    "content": "// test052.cpp - read numbers with scientific notation\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,1.2e10,2.00E-07,1e100\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n\n    double eps1 = 1.0e7;\n    double exp1 = 1.2e10;\n    double val1 = doc.GetCell<double>(\"A\", \"1\");\n    unittest::ExpectTrue(fabs(val1 - exp1) < eps1);\n\n    double eps2 = 1.0e-10;\n    double exp2 = 2.00e-07;\n    double val2 = doc.GetCell<double>(\"B\", \"1\");\n    unittest::ExpectTrue(fabs(val2 - exp2) < eps2);\n\n    double eps3 = 1e97;\n    double exp3 = 1e100;\n    double val3 = doc.GetCell<double>(\"C\", \"1\");\n    unittest::ExpectTrue(fabs(val3 - exp3) < eps3);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test053.cpp",
    "content": "// test053.cpp - write numbers with scientific notation\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvref =\n    \"-,A,B,C\\n\"\n    \"1,1.2e10,2.00E-07,1e100\\n\"\n  ;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,0,0,0\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc1(path, rapidcsv::LabelParams(0, 0));\n\n    doc1.SetCell<double>(\"A\", \"1\", 1.2e10);\n    doc1.SetCell<double>(\"B\", \"1\", 2.00E-07);\n    doc1.SetCell<double>(\"C\", \"1\", 1e100);\n\n    doc1.Save();\n\n    rapidcsv::Document doc2(path, rapidcsv::LabelParams(0, 0));\n\n    double eps1 = 1.0e7;\n    double exp1 = 1.2e10;\n    double val1 = doc2.GetCell<double>(\"A\", \"1\");\n    unittest::ExpectTrue(fabs(val1 - exp1) < eps1);\n\n    double eps2 = 1.0e-10;\n    double exp2 = 2.00e-07;\n    double val2 = doc2.GetCell<double>(\"B\", \"1\");\n    unittest::ExpectTrue(fabs(val2 - exp2) < eps2);\n\n    double eps3 = 1e97;\n    double exp3 = 1e100;\n    double val3 = doc2.GetCell<double>(\"C\", \"1\");\n    unittest::ExpectTrue(fabs(val3 - exp3) < eps3);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test054.cpp",
    "content": "// test054.cpp - read from stream\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,3,9,81\\n\"\n    \"2,4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    // stream from file\n    std::ifstream fstream;\n    fstream.exceptions(std::ifstream::failbit | std::ifstream::badbit);\n    fstream.open(path, std::ios::binary | std::ios::ate);\n    rapidcsv::Document doc1(fstream, rapidcsv::LabelParams(0, 0));\n    fstream.close();\n\n    unittest::ExpectEqual(int, doc1.GetCell<int>(0, 0), 3);\n    unittest::ExpectEqual(int, doc1.GetCell<int>(1, 0), 9);\n    unittest::ExpectEqual(int, doc1.GetCell<int>(2, 0), 81);\n\n    unittest::ExpectEqual(std::string, doc1.GetCell<std::string>(\"A\", \"2\"), \"4\");\n    unittest::ExpectEqual(std::string, doc1.GetCell<std::string>(\"B\", \"2\"), \"16\");\n    unittest::ExpectEqual(std::string, doc1.GetCell<std::string>(\"C\", \"2\"), \"256\");\n\n    // stream from string\n    std::istringstream sstream(csv);\n    rapidcsv::Document doc2(sstream, rapidcsv::LabelParams(0, 0));\n\n    unittest::ExpectEqual(int, doc2.GetCell<int>(0, 0), 3);\n    unittest::ExpectEqual(int, doc2.GetCell<int>(1, 0), 9);\n    unittest::ExpectEqual(int, doc2.GetCell<int>(2, 0), 81);\n\n    unittest::ExpectEqual(std::string, doc2.GetCell<std::string>(\"A\", \"2\"), \"4\");\n    unittest::ExpectEqual(std::string, doc2.GetCell<std::string>(\"B\", \"2\"), \"16\");\n    unittest::ExpectEqual(std::string, doc2.GetCell<std::string>(\"C\", \"2\"), \"256\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test055.cpp",
    "content": "// test055.cpp - write to stream\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,3,9,81\\n\"\n    \"2,4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  std::string outpath = unittest::TempPath();\n\n  try\n  {\n    // to file stream\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n    std::ofstream ostream;\n    ostream.exceptions(std::ifstream::failbit | std::ifstream::badbit);\n    ostream.open(outpath, std::ios::binary | std::ios::ate);\n    doc.Save(ostream);\n    ostream.close();\n\n    std::string csvread = unittest::ReadFile(outpath);\n    unittest::ExpectEqual(std::string, csv, csvread);\n\n    // to string stream\n    std::ostringstream sstream;\n    doc.Save(sstream);\n    unittest::ExpectEqual(std::string, csv, sstream.str());\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test056.cpp",
    "content": "// test056.cpp - write cells containing separator character\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,\\\"3,8\\\",9,81\\n\"\n    \"2,4,16,\\\"256,8\\\"\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n  std::string outpath = unittest::TempPath();\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n    doc.SetCell<std::string>(\"C\", \"2\", \"256,8\");\n    doc.Save(outpath);\n    std::string csvread = unittest::ReadFile(outpath);\n    unittest::ExpectEqual(std::string, csv, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n  unittest::DeleteFile(outpath);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test057.cpp",
    "content": "// test057.cpp - read UTF-16 LE\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  const unsigned char u16le[] =\n  {\n    0xff, 0xfe,\n    0x2d, 0x00, 0x2c, 0x00, 0x41, 0x00, 0x2c, 0x00, 0x42, 0x00, 0x2c, 0x00,\n    0x43, 0x00, 0x0a, 0x00, 0x31, 0x00, 0x2c, 0x00, 0x33, 0x00, 0x2c, 0x00,\n    0x39, 0x00, 0x2c, 0x00, 0x38, 0x00, 0x31, 0x00, 0x0a, 0x00, 0x32, 0x00,\n    0x2c, 0x00, 0x34, 0x00, 0x2c, 0x00, 0x31, 0x00, 0x36, 0x00, 0x2c, 0x00,\n    0x32, 0x00, 0x35, 0x00, 0x36, 0x00, 0x0a, 0x00\n  };\n  const unsigned int u16le_len = 58;\n\n  std::string csv(reinterpret_cast<const char *>(u16le), u16le_len);\n  // \"-,A,B,C\\n\"\n  // \"1,3,9,81\\n\"\n  // \"2,4,16,256\\n\"\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 0), 3);\n    unittest::ExpectEqual(int, doc.GetCell<int>(1, 0), 9);\n    unittest::ExpectEqual(int, doc.GetCell<int>(2, 0), 81);\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"A\", \"2\"), \"4\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"B\", \"2\"), \"16\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"C\", \"2\"), \"256\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test058.cpp",
    "content": "// test058.cpp - read UTF-16 BE\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  const unsigned char u16be[] =\n  {\n    0xfe, 0xff,\n    0x00, 0x2d, 0x00, 0x2c, 0x00, 0x41, 0x00, 0x2c, 0x00, 0x42, 0x00, 0x2c,\n    0x00, 0x43, 0x00, 0x0a, 0x00, 0x31, 0x00, 0x2c, 0x00, 0x33, 0x00, 0x2c,\n    0x00, 0x39, 0x00, 0x2c, 0x00, 0x38, 0x00, 0x31, 0x00, 0x0a, 0x00, 0x32,\n    0x00, 0x2c, 0x00, 0x34, 0x00, 0x2c, 0x00, 0x31, 0x00, 0x36, 0x00, 0x2c,\n    0x00, 0x32, 0x00, 0x35, 0x00, 0x36, 0x00, 0x0a\n  };\n  const unsigned int u16be_len = 58;\n\n  std::string csv(reinterpret_cast<const char *>(u16be), u16be_len);\n  // \"-,A,B,C\\n\"\n  // \"1,3,9,81\\n\"\n  // \"2,4,16,256\\n\"\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 0), 3);\n    unittest::ExpectEqual(int, doc.GetCell<int>(1, 0), 9);\n    unittest::ExpectEqual(int, doc.GetCell<int>(2, 0), 81);\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"A\", \"2\"), \"4\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"B\", \"2\"), \"16\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"C\", \"2\"), \"256\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test059.cpp",
    "content": "// test059.cpp - write UTF-16 LE\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  const unsigned char refu16le[] =\n  {\n    0xff, 0xfe,\n    0x2d, 0x00, 0x2c, 0x00, 0x41, 0x00, 0x2c, 0x00, 0x42, 0x00, 0x2c, 0x00,\n    0x43, 0x00, 0x0a, 0x00, 0x31, 0x00, 0x2c, 0x00, 0x33, 0x00, 0x2c, 0x00,\n    0x39, 0x00, 0x2c, 0x00, 0x38, 0x00, 0x31, 0x00, 0x0a, 0x00, 0x32, 0x00,\n    0x2c, 0x00, 0x34, 0x00, 0x2c, 0x00, 0x31, 0x00, 0x36, 0x00, 0x2c, 0x00,\n    0x32, 0x00, 0x35, 0x00, 0x36, 0x00, 0x0a, 0x00\n  };\n  const unsigned int refu16le_len = 58;\n\n  std::string csvref(reinterpret_cast<const char *>(refu16le), refu16le_len);\n  // \"-,A,B,C\\n\"\n  // \"1,3,9,81\\n\"\n  // \"2,4,16,256\\n\"\n\n  const unsigned char u16le[] =\n  {\n    0xff, 0xfe,\n    0x2d, 0x00, 0x2c, 0x00, 0x41, 0x00, 0x2c, 0x00, 0x42, 0x00, 0x2c, 0x00,\n    0x43, 0x00, 0x0a, 0x00, 0x31, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x2c, 0x00,\n    0x30, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x0a, 0x00, 0x32, 0x00, 0x2c, 0x00,\n    0x30, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x0a, 0x00\n  };\n  const unsigned int u16le_len = 50;\n\n  std::string csv(reinterpret_cast<const char *>(u16le), u16le_len);\n  // \"-,A,B,C\\n\"\n  // \"1,0,0,0\\n\"\n  // \"2,0,0,0\\n\"\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n\n    doc.SetCell<int>(0, 0, 3);\n    doc.SetCell<int>(1, 0, 9);\n    doc.SetCell<int>(2, 0, 81);\n\n    doc.SetCell<std::string>(\"A\", \"2\", \"4\");\n    doc.SetCell<std::string>(\"B\", \"2\", \"16\");\n    doc.SetCell<std::string>(\"C\", \"2\", \"256\");\n\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 0), 3);\n    unittest::ExpectEqual(int, doc.GetCell<int>(1, 0), 9);\n    unittest::ExpectEqual(int, doc.GetCell<int>(2, 0), 81);\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"A\", \"2\"), \"4\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"B\", \"2\"), \"16\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"C\", \"2\"), \"256\");\n\n    doc.Save();\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test060.cpp",
    "content": "// test060.cpp - write UTF-16 BE\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  const unsigned char refu16be[] =\n  {\n    0xfe, 0xff,\n    0x00, 0x2d, 0x00, 0x2c, 0x00, 0x41, 0x00, 0x2c, 0x00, 0x42, 0x00, 0x2c,\n    0x00, 0x43, 0x00, 0x0a, 0x00, 0x31, 0x00, 0x2c, 0x00, 0x33, 0x00, 0x2c,\n    0x00, 0x39, 0x00, 0x2c, 0x00, 0x38, 0x00, 0x31, 0x00, 0x0a, 0x00, 0x32,\n    0x00, 0x2c, 0x00, 0x34, 0x00, 0x2c, 0x00, 0x31, 0x00, 0x36, 0x00, 0x2c,\n    0x00, 0x32, 0x00, 0x35, 0x00, 0x36, 0x00, 0x0a\n  };\n  const unsigned int refu16be_len = 58;\n\n  std::string csvref(reinterpret_cast<const char *>(refu16be), refu16be_len);\n  // \"-,A,B,C\\n\"\n  // \"1,3,9,81\\n\"\n  // \"2,4,16,256\\n\"\n\n  const unsigned char u16be[] =\n  {\n    0xfe, 0xff,\n    0x00, 0x2d, 0x00, 0x2c, 0x00, 0x41, 0x00, 0x2c, 0x00, 0x42, 0x00, 0x2c,\n    0x00, 0x43, 0x00, 0x0a, 0x00, 0x31, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x2c,\n    0x00, 0x30, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x0a, 0x00, 0x32, 0x00, 0x2c,\n    0x00, 0x30, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x0a\n  };\n  const unsigned int u16be_len = 50;\n\n  std::string csv(reinterpret_cast<const char *>(u16be), u16be_len);\n  // \"-,A,B,C\\n\"\n  // \"1,0,0,0\\n\"\n  // \"2,0,0,0\\n\"\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n\n    doc.SetCell<int>(0, 0, 3);\n    doc.SetCell<int>(1, 0, 9);\n    doc.SetCell<int>(2, 0, 81);\n\n    doc.SetCell<std::string>(\"A\", \"2\", \"4\");\n    doc.SetCell<std::string>(\"B\", \"2\", \"16\");\n    doc.SetCell<std::string>(\"C\", \"2\", \"256\");\n\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 0), 3);\n    unittest::ExpectEqual(int, doc.GetCell<int>(1, 0), 9);\n    unittest::ExpectEqual(int, doc.GetCell<int>(2, 0), 81);\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"A\", \"2\"), \"4\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"B\", \"2\"), \"16\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"C\", \"2\"), \"256\");\n\n    doc.Save();\n\n    std::string csvread = unittest::ReadFile(path);\n\n    unittest::ExpectEqual(std::string, csvref, csvread);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test061.cpp",
    "content": "// test061.cpp - read trimmed cell values\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-, A,B , C \\n\"\n    \" 1,3 , 9 , 81\\n\"\n    \"2 ,4  , 16, 256  \\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0), rapidcsv::SeparatorParams(',', true));\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"A\", \"1\"), \"3\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"B\", \"1\"), \"9\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"C\", \"1\"), \"81\");\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"A\", \"2\"), \"4\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"B\", \"2\"), \"16\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(\"C\", \"2\"), \"256\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test062.cpp",
    "content": "// test062.cpp - read cell value by mixed name / index\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,3,9,81\\n\"\n    \"2,4,16,256\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n    unittest::ExpectEqual(int, doc.GetCell<int>(\"A\", 0), 3);\n    unittest::ExpectEqual(int, doc.GetCell<int>(\"B\", 0), 9);\n    unittest::ExpectEqual(int, doc.GetCell<int>(\"C\", 0), 81);\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(0, \"2\"), \"4\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(1, \"2\"), \"16\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(2, \"2\"), \"256\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test063.cpp",
    "content": "// test063.cpp - custom conversion per call\n\n#include <iomanip>\n#include <math.h>\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\n// Conversion function for int data to be converted to fixed-point two decimal numbers\nvoid ToVal(const std::string& pStr, int& pVal)\n{\n  pVal = static_cast<int>(roundf(100.0f * std::stof(pStr)));\n}\n\nstruct Struct\n{\n  int val = 0;\n};\n\nvoid ToStruct(const std::string& pStr, Struct& pVal)\n{\n  pVal.val = static_cast<int>(roundf(100.0f * std::stof(pStr)));\n}\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,1,10,100,1000\\n\"\n    \"2,0.1,0.01,0.001,0.006\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, 0));\n\n    // ToVal\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 0, ToVal), 100);\n    unittest::ExpectEqual(int, doc.GetCell<int>(1, \"1\", ToVal), 1000);\n    unittest::ExpectEqual(int, doc.GetCell<int>(\"A\", 0, ToVal), 100);\n    unittest::ExpectEqual(int, doc.GetCell<int>(\"B\", \"1\", ToVal), 1000);\n\n    unittest::ExpectEqual(int, doc.GetRow<int>(0, ToVal).at(0), 100);\n    unittest::ExpectEqual(int, doc.GetRow<int>(\"2\", ToVal).at(0), 10);\n\n    unittest::ExpectEqual(int, doc.GetColumn<int>(0, ToVal).at(0), 100);\n    unittest::ExpectEqual(int, doc.GetColumn<int>(\"B\", ToVal).at(0), 1000);\n\n    // ToStruct\n    unittest::ExpectEqual(int, doc.GetCell<Struct>(0, 0, ToStruct).val, 100);\n    unittest::ExpectEqual(int, doc.GetCell<Struct>(1, \"1\", ToStruct).val, 1000);\n    unittest::ExpectEqual(int, doc.GetCell<Struct>(\"A\", 0, ToStruct).val, 100);\n    unittest::ExpectEqual(int, doc.GetCell<Struct>(\"B\", \"1\", ToStruct).val, 1000);\n\n    unittest::ExpectEqual(int, doc.GetRow<Struct>(0, ToStruct).at(0).val, 100);\n    unittest::ExpectEqual(int, doc.GetRow<Struct>(\"2\", ToStruct).at(0).val, 10);\n\n    unittest::ExpectEqual(int, doc.GetColumn<Struct>(0, ToStruct).at(0).val, 100);\n    unittest::ExpectEqual(int, doc.GetColumn<Struct>(\"B\", ToStruct).at(0).val, 1000);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test064.cpp",
    "content": "// test063.cpp - linebreaks in quoted text\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csv =\n    \"-,A,B,C\\n\"\n    \"1,3,9,81\\n\"\n    \"2,4,16,256\\n\"\n    \"text,\\\"quoted text\\\",\\\"quoted\\ntext\\nwith\\nlinebreaks\\\",\\\"\\\"\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csv);\n\n  try\n  {\n    rapidcsv::SeparatorParams seppar;\n    seppar.mQuotedLinebreaks = true;\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(-1, -1), seppar, rapidcsv::ConverterParams());\n\n    unittest::ExpectEqual(size_t, doc.GetRowCount(), 4);\n    unittest::ExpectEqual(size_t, doc.GetColumnCount(), 4);\n\n    unittest::ExpectEqual(char, doc.GetCell<char>(0, 0), '-');\n    unittest::ExpectEqual(char, doc.GetCell<char>(1, 0), 'A');\n    unittest::ExpectEqual(char, doc.GetCell<char>(2, 0), 'B');\n    unittest::ExpectEqual(char, doc.GetCell<char>(3, 0), 'C');\n\n    unittest::ExpectEqual(int, doc.GetCell<int>(0, 1), 1);\n    unittest::ExpectEqual(int, doc.GetCell<int>(1, 1), 3);\n    unittest::ExpectEqual(int, doc.GetCell<int>(2, 1), 9);\n    unittest::ExpectEqual(int, doc.GetCell<int>(3, 1), 81);\n\n    unittest::ExpectEqual(unsigned int, doc.GetCell<unsigned int>(0, 2), 2);\n    unittest::ExpectEqual(unsigned int, doc.GetCell<unsigned int>(1, 2), 4);\n    unittest::ExpectEqual(unsigned int, doc.GetCell<unsigned int>(2, 2), 16);\n    unittest::ExpectEqual(unsigned int, doc.GetCell<unsigned int>(3, 2), 256);\n\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(0, 3), \"text\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(1, 3), \"\\\"quoted text\\\"\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(2, 3), \"\\\"quoted\\ntext\\nwith\\nlinebreaks\\\"\");\n    unittest::ExpectEqual(std::string, doc.GetCell<std::string>(3, 3), \"\\\"\\\"\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test065.cpp",
    "content": "// test065.cpp - row/column count with header index out of data size\n\n#include <rapidcsv.h>\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvEmpty = \"\";\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csvEmpty);\n\n  try\n  {\n    // empty doc, column header index 0, no row header\n    rapidcsv::Document doc1(path, rapidcsv::LabelParams(0, -1));\n    unittest::ExpectEqual(size_t, doc1.GetRowCount(), 0);\n    unittest::ExpectEqual(size_t, doc1.GetColumnCount(), 0);\n\n    // empty doc, row header index 0, no row header\n    rapidcsv::Document doc2(path, rapidcsv::LabelParams(-1, 0));\n    unittest::ExpectEqual(size_t, doc2.GetRowCount(), 0);\n    unittest::ExpectEqual(size_t, doc2.GetColumnCount(), 0);\n\n    std::string csv =\n      \"-,A,B,C\\n\"\n      \"1,3,9,81\\n\"\n      \"2,4,16,256\\n\"\n    ;\n\n    // doc with three rows, column header index 10, no row header\n    std::istringstream sstream3(csv);\n    rapidcsv::Document doc3(sstream3, rapidcsv::LabelParams(10, -1));\n    unittest::ExpectEqual(size_t, doc3.GetRowCount(), 0);\n    unittest::ExpectEqual(size_t, doc3.GetColumnCount(), 4);\n\n    // doc with three rows, row header index 10, no column header\n    std::istringstream sstream4(csv);\n    rapidcsv::Document doc4(sstream4, rapidcsv::LabelParams(-1, 10));\n    unittest::ExpectEqual(size_t, doc4.GetRowCount(), 3);\n    unittest::ExpectEqual(size_t, doc4.GetColumnCount(), 0);\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/test066.cpp",
    "content": "// test066.cpp - test UTF-8 Byte order mark skipping\n\n#include \"rapidcsv.h\"\n#include \"unittest.h\"\n\nint main()\n{\n  int rv = 0;\n\n  std::string csvWithBom =\n    \"\\xef\\xbb\\xbfID\\n\"\n    \"1\\n\"\n  ;\n\n  std::string path = unittest::TempPath();\n  unittest::WriteFile(path, csvWithBom);\n\n  try\n  {\n    rapidcsv::Document doc(path, rapidcsv::LabelParams(0, -1));\n    unittest::ExpectEqual(size_t, doc.GetRowCount(), 1);\n    unittest::ExpectEqual(std::string, doc.GetColumn<std::string>(\"ID\")[0], \"1\");\n  }\n  catch (const std::exception& ex)\n  {\n    std::cout << ex.what() << std::endl;\n    rv = 1;\n  }\n\n  unittest::DeleteFile(path);\n\n  return rv;\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/tests/unittest.h",
    "content": "#pragma once\n\n#ifndef _MSC_VER\n#include <unistd.h>\n#else\n#include <io.h>\n#endif\n\n#include <fstream>\n#include <string>\n#include <sstream>\n\n\n#define ExpectEqual(t, a, b) ExpectEqualFun<t>(a, b, #a, #b, __FILE__, __LINE__)\n#define ExpectTrue(a) ExpectTrueFun(a, #a, __FILE__, __LINE__)\n\n#define ExpectException(expr, excp)                                                           \\\n  do                                                                                          \\\n  {                                                                                           \\\n    bool success = false;                                                                     \\\n    try                                                                                       \\\n    {                                                                                         \\\n      expr;                                                                                   \\\n    }                                                                                         \\\n    catch (const excp &)                                                                      \\\n    {                                                                                         \\\n      success = true;                                                                         \\\n    }                                                                                         \\\n    catch (const std::exception& ex)                                                          \\\n    {                                                                                         \\\n      std::stringstream ss;                                                                   \\\n      ss << unittest::detail::FileName(__FILE__) << \":\" << std::to_string(__LINE__);          \\\n      ss << \" ExpectException failed: unexpected exception '\" << typeid(ex).name();           \\\n      ss << \"' thrown.\" << std::endl;                                                         \\\n      throw std::runtime_error(ss.str());                                                     \\\n    }                                                                                         \\\n                                                                                              \\\n    if (!success)                                                                             \\\n    {                                                                                         \\\n      std::stringstream ss;                                                                   \\\n      ss << unittest::detail::FileName(__FILE__) << \":\" << std::to_string(__LINE__);          \\\n      ss << \" ExpectException failed: expected exception '\" << #excp << \"' not thrown.\";      \\\n      ss << std::endl;                                                                        \\\n      throw std::runtime_error(ss.str());                                                     \\\n    }                                                                                         \\\n  }                                                                                           \\\n  while (0)\n\n\nnamespace unittest\n{\n  namespace detail\n  {\n    inline std::string FileName(const std::string& pPath)\n    {\n      const std::size_t slash = pPath.rfind(\"/\");\n      std::string name = (slash != std::string::npos) ? pPath.substr(slash + 1) : pPath;\n      return name;\n    }\n  }\n\n  inline std::string TempPath()\n  {\n    char name[] = \"rapidcsvtest.XXXXXX\";\n#ifndef _MSC_VER\n    int fd = mkstemp(name);\n    close(fd);\n#else\n    _mktemp_s(name, strlen(name) + 1);\n#endif\n    return std::string(name);\n  }\n\n  inline void WriteFile(const std::string& pPath, const std::string& pData)\n  {\n    std::ofstream outfile;\n    outfile.open(pPath, std::ifstream::out | std::ifstream::binary);\n    outfile << pData;\n    outfile.close();\n  }\n\n  inline std::string ReadFile(const std::string& pPath)\n  {\n    std::ifstream infile;\n    infile.open(pPath, std::ifstream::in | std::ifstream::binary);\n    std::string data((std::istreambuf_iterator<char>(infile)), std::istreambuf_iterator<char>());\n    infile.close();\n    return data;\n  }\n\n  inline void DeleteFile(const std::string& pPath)\n  {\n    std::remove(pPath.c_str());\n  }\n\n  template<typename T>\n  inline void ExpectEqualFun(T pTest, T pRef, const std::string& testName,\n                             const std::string& refName, const std::string& filePath, int lineNo)\n  {\n    if (pTest != pRef)\n    {\n      std::stringstream ss;\n      ss << detail::FileName(filePath) << \":\" << std::to_string(lineNo);\n      ss << \" ExpectEqual failed: \" << testName << \" != \" << refName << std::endl;\n      ss << testName << \" = '\" << pTest << \"'\" << std::endl;\n      ss << refName << \" = '\" << pRef << \"'\" << std::endl;\n\n      throw std::runtime_error(ss.str());\n    }\n  }\n\n  inline void ExpectTrueFun(bool pTest, const std::string& testName, const std::string& filePath,\n                            int lineNo)\n  {\n    if (!pTest)\n    {\n      std::stringstream ss;\n      ss << detail::FileName(filePath) << \":\" << std::to_string(lineNo);\n      ss << \" ExpectTrue failed: \" << testName << \" == false\" << std::endl;\n\n      throw std::runtime_error(ss.str());\n    }\n  }\n}\n"
  },
  {
    "path": "examples/libraries/rapidcsv/uncrustify.cfg",
    "content": "# Uncrustify 0.64\n\n#\n# General options\n#\n\n# The type of line endings. Default=Auto\nnewlines                        = lf       # auto/lf/crlf/cr\n\n# The original size of tabs in the input. Default=8\ninput_tab_size                  = 2        # number\n\n# The size of tabs in the output (only used if align_with_tabs=true). Default=8\noutput_tab_size                 = 2        # number\n\n# The ASCII value of the string escape char, usually 92 (\\) or 94 (^). (Pawn)\nstring_escape_char              = 92       # number\n\n# Alternate string escape char for Pawn. Only works right before the quote char.\nstring_escape_char2             = 0        # number\n\n# Replace tab characters found in string literals with the escape sequence \\t instead.\nstring_replace_tab_chars        = false    # false/true\n\n# Allow interpreting '>=' and '>>=' as part of a template in 'void f(list<list<B>>=val);'.\n# If true, 'assert(x<0 && y>=3)' will be broken. Default=False\n# Improvements to template detection may make this option obsolete.\ntok_split_gte                   = false    # false/true\n\n# Override the default ' *INDENT-OFF*' in comments for disabling processing of part of the file.\ndisable_processing_cmt          = \"\"         # string\n\n# Override the default ' *INDENT-ON*' in comments for enabling processing of part of the file.\nenable_processing_cmt           = \"\"         # string\n\n# Enable parsing of digraphs. Default=False\nenable_digraphs                 = false    # false/true\n\n# Control what to do with the UTF-8 BOM (recommend 'remove')\nutf8_bom                        = remove   # ignore/add/remove/force\n\n# If the file contains bytes with values between 128 and 255, but is not UTF-8, then output as UTF-8\nutf8_byte                       = false    # false/true\n\n# Force the output encoding to UTF-8\nutf8_force                      = false    # false/true\n\n#\n# Indenting\n#\n\n# The number of columns to indent per level.\n# Usually 2, 3, 4, or 8. Default=8\nindent_columns                  = 2        # number\n\n# The continuation indent. If non-zero, this overrides the indent of '(' and '=' continuation indents.\n# For FreeBSD, this is set to 4. Negative value is absolute and not increased for each ( level\nindent_continue                 = 0        # number\n\n# How to use tabs when indenting code\n# 0=spaces only\n# 1=indent with tabs to brace level, align with spaces (default)\n# 2=indent and align with tabs, using spaces when not on a tabstop\nindent_with_tabs                = 0        # number\n\n# Comments that are not a brace level are indented with tabs on a tabstop.\n# Requires indent_with_tabs=2. If false, will use spaces.\nindent_cmt_with_tabs            = false    # false/true\n\n# Whether to indent strings broken by '\\' so that they line up\nindent_align_string             = false    # false/true\n\n# The number of spaces to indent multi-line XML strings.\n# Requires indent_align_string=True\nindent_xml_string               = 0        # number\n\n# Spaces to indent '{' from level\nindent_brace                    = 0        # number\n\n# Whether braces are indented to the body level\nindent_braces                   = false    # false/true\n\n# Disabled indenting function braces if indent_braces is true\nindent_braces_no_func           = false    # false/true\n\n# Disabled indenting class braces if indent_braces is true\nindent_braces_no_class          = false    # false/true\n\n# Disabled indenting struct braces if indent_braces is true\nindent_braces_no_struct         = false    # false/true\n\n# Indent based on the size of the brace parent, i.e. 'if' => 3 spaces, 'for' => 4 spaces, etc.\nindent_brace_parent             = false    # false/true\n\n# Indent based on the paren open instead of the brace open in '({\\n', default is to indent by brace.\nindent_paren_open_brace         = false    # false/true\n\n# indent a C# delegate by another level, default is to not indent by another level.\nindent_cs_delegate_brace        = false    # false/true\n\n# Whether the 'namespace' body is indented\nindent_namespace                = true     # false/true\n\n# Only indent one namespace and no sub-namespaces.\n# Requires indent_namespace=true.\nindent_namespace_single_indent  = false    # false/true\n\n# The number of spaces to indent a namespace block\nindent_namespace_level          = 2        # number\n\n# If the body of the namespace is longer than this number, it won't be indented.\n# Requires indent_namespace=true. Default=0 (no limit)\nindent_namespace_limit          = 0        # number\n\n# Whether the 'extern \"C\"' body is indented\nindent_extern                   = false    # false/true\n\n# Whether the 'class' body is indented\nindent_class                    = true     # false/true\n\n# Whether to indent the stuff after a leading base class colon\nindent_class_colon              = false    # false/true\n\n# Indent based on a class colon instead of the stuff after the colon.\n# Requires indent_class_colon=true. Default=False\nindent_class_on_colon           = false    # false/true\n\n# Whether to indent the stuff after a leading class initializer colon\nindent_constr_colon             = false    # false/true\n\n# Virtual indent from the ':' for member initializers. Default=2\nindent_ctor_init_leading        = 2        # number\n\n# Additional indenting for constructor initializer list\nindent_ctor_init                = 0        # number\n\n# False=treat 'else\\nif' as 'else if' for indenting purposes\n# True=indent the 'if' one level\nindent_else_if                  = false    # false/true\n\n# Amount to indent variable declarations after a open brace. neg=relative, pos=absolute\nindent_var_def_blk              = 0        # number\n\n# Indent continued variable declarations instead of aligning.\nindent_var_def_cont             = false    # false/true\n\n# Indent continued shift expressions ('<<' and '>>') instead of aligning.\n# Turn align_left_shift off when enabling this.\nindent_shift                    = false    # false/true\n\n# True:  force indentation of function definition to start in column 1\n# False: use the default behavior\nindent_func_def_force_col1      = false    # false/true\n\n# True:  indent continued function call parameters one indent level\n# False: align parameters under the open paren\nindent_func_call_param          = false    # false/true\n\n# Same as indent_func_call_param, but for function defs\nindent_func_def_param           = false    # false/true\n\n# Same as indent_func_call_param, but for function protos\nindent_func_proto_param         = false    # false/true\n\n# Same as indent_func_call_param, but for class declarations\nindent_func_class_param         = false    # false/true\n\n# Same as indent_func_call_param, but for class variable constructors\nindent_func_ctor_var_param      = false    # false/true\n\n# Same as indent_func_call_param, but for templates\nindent_template_param           = false    # false/true\n\n# Double the indent for indent_func_xxx_param options\nindent_func_param_double        = false    # false/true\n\n# Indentation column for standalone 'const' function decl/proto qualifier\nindent_func_const               = 0        # number\n\n# Indentation column for standalone 'throw' function decl/proto qualifier\nindent_func_throw               = 0        # number\n\n# The number of spaces to indent a continued '->' or '.'\n# Usually set to 0, 1, or indent_columns.\nindent_member                   = 0        # number\n\n# Spaces to indent single line ('//') comments on lines before code\nindent_sing_line_comments       = 0        # number\n\n# If set, will indent trailing single line ('//') comments relative\n# to the code instead of trying to keep the same absolute column\nindent_relative_single_line_comments = false    # false/true\n\n# Spaces to indent 'case' from 'switch'\n# Usually 0 or indent_columns.\nindent_switch_case              = 0        # number\n\n# Spaces to shift the 'case' line, without affecting any other lines\n# Usually 0.\nindent_case_shift               = 0        # number\n\n# Spaces to indent '{' from 'case'.\n# By default, the brace will appear under the 'c' in case.\n# Usually set to 0 or indent_columns.\nindent_case_brace               = 0        # number\n\n# Whether to indent comments found in first column\nindent_col1_comment             = false    # false/true\n\n# How to indent goto labels\n#   >0: absolute column where 1 is the leftmost column\n#  <=0: subtract from brace indent\n# Default=1\nindent_label                    = 1        # number\n\n# Same as indent_label, but for access specifiers that are followed by a colon. Default=1\nindent_access_spec              = -2       # number\n\n# Indent the code after an access specifier by one level.\n# If set, this option forces 'indent_access_spec=0'\nindent_access_spec_body         = false    # false/true\n\n# If an open paren is followed by a newline, indent the next line so that it lines up after the open paren (not recommended)\nindent_paren_nl                 = false    # false/true\n\n# Controls the indent of a close paren after a newline.\n# 0: Indent to body level\n# 1: Align under the open paren\n# 2: Indent to the brace level\nindent_paren_close              = 0        # number\n\n# Controls the indent of a comma when inside a paren.If TRUE, aligns under the open paren\nindent_comma_paren              = false    # false/true\n\n# Controls the indent of a BOOL operator when inside a paren.If TRUE, aligns under the open paren\nindent_bool_paren               = false    # false/true\n\n# If 'indent_bool_paren' is true, controls the indent of the first expression. If TRUE, aligns the first expression to the following ones\nindent_first_bool_expr          = false    # false/true\n\n# If an open square is followed by a newline, indent the next line so that it lines up after the open square (not recommended)\nindent_square_nl                = false    # false/true\n\n# Don't change the relative indent of ESQL/C 'EXEC SQL' bodies\nindent_preserve_sql             = false    # false/true\n\n# Align continued statements at the '='. Default=True\n# If FALSE or the '=' is followed by a newline, the next line is indent one tab.\nindent_align_assign             = false    # false/true\n\n# Indent OC blocks at brace level instead of usual rules.\nindent_oc_block                 = false    # false/true\n\n# Indent OC blocks in a message relative to the parameter name.\n# 0=use indent_oc_block rules, 1+=spaces to indent\nindent_oc_block_msg             = 0        # number\n\n# Minimum indent for subsequent parameters\nindent_oc_msg_colon             = 0        # number\n\n# If true, prioritize aligning with initial colon (and stripping spaces from lines, if necessary).\n# Default=True.\nindent_oc_msg_prioritize_first_colon = true     # false/true\n\n# If indent_oc_block_msg and this option are on, blocks will be indented the way that Xcode does by default (from keyword if the parameter is on its own line; otherwise, from the previous indentation level).\nindent_oc_block_msg_xcode_style = false    # false/true\n\n# If indent_oc_block_msg and this option are on, blocks will be indented from where the brace is relative to a msg keyword.\nindent_oc_block_msg_from_keyword = false    # false/true\n\n# If indent_oc_block_msg and this option are on, blocks will be indented from where the brace is relative to a msg colon.\nindent_oc_block_msg_from_colon  = false    # false/true\n\n# If indent_oc_block_msg and this option are on, blocks will be indented from where the block caret is.\nindent_oc_block_msg_from_caret  = false    # false/true\n\n# If indent_oc_block_msg and this option are on, blocks will be indented from where the brace is.\nindent_oc_block_msg_from_brace  = false    # false/true\n\n# When identing after virtual brace open and newline add further spaces to reach this min. indent.\nindent_min_vbrace_open          = 0        # number\n\n# TRUE: When identing after virtual brace open and newline add further spaces after regular indent to reach next tabstop.\nindent_vbrace_open_on_tabstop   = false    # false/true\n\n# If true, a brace followed by another token (not a newline) will indent all contained lines to match the token.Default=True.\nindent_token_after_brace        = true     # false/true\n\n# If true, cpp lambda body will be indentedDefault=False.\nindent_cpp_lambda_body          = false    # false/true\n\n# Indent the continuation of ternary operator.\n#  0: (Default) off\n#  1: When the `if_false` is a continuation, indent it under `if_false`\n#  2: When the `:` is a continuation, indent it under `?`\nindent_ternary_operator         = 2\n\n#\n# Spacing options\n#\n\n# Add or remove space around arithmetic operator '+', '-', '/', '*', etc\n# also '>>>' '<<' '>>' '%' '|'\nsp_arith                        = force    # ignore/add/remove/force\n\n# Add or remove space around assignment operator '=', '+=', etc\nsp_assign                       = force    # ignore/add/remove/force\n\n# Add or remove space around '=' in C++11 lambda capture specifications. Overrides sp_assign\nsp_cpp_lambda_assign            = force    # ignore/add/remove/force\n\n# Add or remove space after the capture specification in C++11 lambda.\nsp_cpp_lambda_paren             = remove   # ignore/add/remove/force\n\n# Add or remove space around assignment operator '=' in a prototype\nsp_assign_default               = force    # ignore/add/remove/force\n\n# Add or remove space before assignment operator '=', '+=', etc. Overrides sp_assign.\nsp_before_assign                = force    # ignore/add/remove/force\n\n# Add or remove space after assignment operator '=', '+=', etc. Overrides sp_assign.\nsp_after_assign                 = force    # ignore/add/remove/force\n\n# Add or remove space in 'NS_ENUM ('\nsp_enum_paren                   = force    # ignore/add/remove/force\n\n# Add or remove space around assignment '=' in enum\nsp_enum_assign                  = force    # ignore/add/remove/force\n\n# Add or remove space before assignment '=' in enum. Overrides sp_enum_assign.\nsp_enum_before_assign           = force    # ignore/add/remove/force\n\n# Add or remove space after assignment '=' in enum. Overrides sp_enum_assign.\nsp_enum_after_assign            = force    # ignore/add/remove/force\n\n# Add or remove space around preprocessor '##' concatenation operator. Default=Add\nsp_pp_concat                    = add      # ignore/add/remove/force\n\n# Add or remove space after preprocessor '#' stringify operator. Also affects the '#@' charizing operator.\nsp_pp_stringify                 = ignore   # ignore/add/remove/force\n\n# Add or remove space before preprocessor '#' stringify operator as in '#define x(y) L#y'.\nsp_before_pp_stringify          = ignore   # ignore/add/remove/force\n\n# Add or remove space around boolean operators '&&' and '||'\nsp_bool                         = force    # ignore/add/remove/force\n\n# Add or remove space around compare operator '<', '>', '==', etc\nsp_compare                      = force    # ignore/add/remove/force\n\n# Add or remove space inside '(' and ')'\nsp_inside_paren                 = remove   # ignore/add/remove/force\n\n# Add or remove space between nested parens: '((' vs ') )'\nsp_paren_paren                  = remove   # ignore/add/remove/force\n\n# Add or remove space between back-to-back parens: ')(' vs ') ('\nsp_cparen_oparen                = remove   # ignore/add/remove/force\n\n# Whether to balance spaces inside nested parens\nsp_balance_nested_parens        = false    # false/true\n\n# Add or remove space between ')' and '{'\nsp_paren_brace                  = force    # ignore/add/remove/force\n\n# Add or remove space before pointer star '*'\nsp_before_ptr_star              = remove   # ignore/add/remove/force\n\n# Add or remove space before pointer star '*' that isn't followed by a variable name\n# If set to 'ignore', sp_before_ptr_star is used instead.\nsp_before_unnamed_ptr_star      = force    # ignore/add/remove/force\n\n# Add or remove space between pointer stars '*'\nsp_between_ptr_star             = force    # ignore/add/remove/force\n\n# Add or remove space after pointer star '*', if followed by a word.\nsp_after_ptr_star               = force    # ignore/add/remove/force\n\n# Add or remove space after pointer star '*', if followed by a qualifier.\nsp_after_ptr_star_qualifier     = force    # ignore/add/remove/force\n\n# Add or remove space after a pointer star '*', if followed by a func proto/def.\nsp_after_ptr_star_func          = force    # ignore/add/remove/force\n\n# Add or remove space after a pointer star '*', if followed by an open paren (function types).\nsp_ptr_star_paren               = force    # ignore/add/remove/force\n\n# Add or remove space before a pointer star '*', if followed by a func proto/def.\nsp_before_ptr_star_func         = remove   # ignore/add/remove/force\n\n# Add or remove space before a reference sign '&'\nsp_before_byref                 = remove   # ignore/add/remove/force\n\n# Add or remove space before a reference sign '&' that isn't followed by a variable name\n# If set to 'ignore', sp_before_byref is used instead.\nsp_before_unnamed_byref         = force    # ignore/add/remove/force\n\n# Add or remove space after reference sign '&', if followed by a word.\nsp_after_byref                  = force    # ignore/add/remove/force\n\n# Add or remove space after a reference sign '&', if followed by a func proto/def.\nsp_after_byref_func             = force    # ignore/add/remove/force\n\n# Add or remove space before a reference sign '&', if followed by a func proto/def.\nsp_before_byref_func            = remove   # ignore/add/remove/force\n\n# Add or remove space between type and word. Default=Force\nsp_after_type                   = force    # ignore/add/remove/force\n\n# Add or remove space before the paren in the D constructs 'template Foo(' and 'class Foo('.\nsp_before_template_paren        = force    # ignore/add/remove/force\n\n# Add or remove space in 'template <' vs 'template<'.\n# If set to ignore, sp_before_angle is used.\nsp_template_angle               = remove   # ignore/add/remove/force\n\n# Add or remove space before '<>'\nsp_before_angle                 = remove   # ignore/add/remove/force\n\n# Add or remove space inside '<' and '>'\nsp_inside_angle                 = remove   # ignore/add/remove/force\n\n# Add or remove space after '<>'\nsp_after_angle                  = remove   # ignore/add/remove/force\n\n# Add or remove space between '<>' and '(' as found in 'new List<byte>(foo);'\nsp_angle_paren                  = remove   # ignore/add/remove/force\n\n# Add or remove space between '<>' and '()' as found in 'new List<byte>();'\nsp_angle_paren_empty            = remove   # ignore/add/remove/force\n\n# Add or remove space between '<>' and a word as in 'List<byte> m;' or 'template <typename T> static ...'\nsp_angle_word                   = force    # ignore/add/remove/force\n\n# Add or remove space between '>' and '>' in '>>' (template stuff C++/C# only). Default=Add\nsp_angle_shift                  = remove   # ignore/add/remove/force\n\n# Permit removal of the space between '>>' in 'foo<bar<int> >' (C++11 only). Default=False\n# sp_angle_shift cannot remove the space without this option.\nsp_permit_cpp11_shift           = true     # false/true\n\n# Add or remove space before '(' of 'if', 'for', 'switch', 'while', etc.\nsp_before_sparen                = force    # ignore/add/remove/force\n\n# Add or remove space inside if-condition '(' and ')'\nsp_inside_sparen                = remove   # ignore/add/remove/force\n\n# Add or remove space before if-condition ')'. Overrides sp_inside_sparen.\nsp_inside_sparen_close          = remove   # ignore/add/remove/force\n\n# Add or remove space after if-condition '('. Overrides sp_inside_sparen.\nsp_inside_sparen_open           = remove   # ignore/add/remove/force\n\n# Add or remove space after ')' of 'if', 'for', 'switch', and 'while', etc.\nsp_after_sparen                 = remove   # ignore/add/remove/force\n\n# Add or remove space between ')' and '{' of 'if', 'for', 'switch', and 'while', etc.\nsp_sparen_brace                 = force    # ignore/add/remove/force\n\n# Add or remove space between 'invariant' and '(' in the D language.\nsp_invariant_paren              = force    # ignore/add/remove/force\n\n# Add or remove space after the ')' in 'invariant (C) c' in the D language.\nsp_after_invariant_paren        = force    # ignore/add/remove/force\n\n# Add or remove space before empty statement ';' on 'if', 'for' and 'while'\nsp_special_semi                 = force    # ignore/add/remove/force\n\n# Add or remove space before ';'. Default=Remove\nsp_before_semi                  = remove   # ignore/add/remove/force\n\n# Add or remove space before ';' in non-empty 'for' statements\nsp_before_semi_for              = remove   # ignore/add/remove/force\n\n# Add or remove space before a semicolon of an empty part of a for statement.\nsp_before_semi_for_empty        = remove   # ignore/add/remove/force\n\n# Add or remove space after ';', except when followed by a comment. Default=Add\nsp_after_semi                   = add      # ignore/add/remove/force\n\n# Add or remove space after ';' in non-empty 'for' statements. Default=Force\nsp_after_semi_for               = force    # ignore/add/remove/force\n\n# Add or remove space after the final semicolon of an empty part of a for statement: for ( ; ; <here> ).\nsp_after_semi_for_empty         = force    # ignore/add/remove/force\n\n# Add or remove space before '[' (except '[]')\nsp_before_square                = remove   # ignore/add/remove/force\n\n# Add or remove space before '[]'\nsp_before_squares               = remove   # ignore/add/remove/force\n\n# Add or remove space inside a non-empty '[' and ']'\nsp_inside_square                = remove   # ignore/add/remove/force\n\n# Add or remove space after ','\nsp_after_comma                  = force    # ignore/add/remove/force\n\n# Add or remove space before ','. Default=Remove\nsp_before_comma                 = remove   # ignore/add/remove/force\n\n# Add or remove space between ',' and ']' in multidimensional array type 'int[,,]'\nsp_after_mdatype_commas         = remove   # ignore/add/remove/force\n\n# Add or remove space between '[' and ',' in multidimensional array type 'int[,,]'\nsp_before_mdatype_commas        = remove   # ignore/add/remove/force\n\n# Add or remove space between ',' in multidimensional array type 'int[,,]'\nsp_between_mdatype_commas       = remove   # ignore/add/remove/force\n\n# Add or remove space between an open paren and comma: '(,' vs '( ,'. Default=Force\nsp_paren_comma                  = remove   # ignore/add/remove/force\n\n# Add or remove space before the variadic '...' when preceded by a non-punctuator\nsp_before_ellipsis              = remove   # ignore/add/remove/force\n\n# Add or remove space after class ':'\nsp_after_class_colon            = force    # ignore/add/remove/force\n\n# Add or remove space before class ':'\nsp_before_class_colon           = force    # ignore/add/remove/force\n\n# Add or remove space after class constructor ':'\nsp_after_constr_colon           = force    # ignore/add/remove/force\n\n# Add or remove space before class constructor ':'\nsp_before_constr_colon          = force    # ignore/add/remove/force\n\n# Add or remove space before case ':'. Default=Remove\nsp_before_case_colon            = remove   # ignore/add/remove/force\n\n# Add or remove space between 'operator' and operator sign\nsp_after_operator               = force    # ignore/add/remove/force\n\n# Add or remove space between the operator symbol and the open paren, as in 'operator ++('\nsp_after_operator_sym           = force    # ignore/add/remove/force\n\n# Add or remove space between the operator symbol and the open paren when the operator has no arguments, as in 'operator *()'\nsp_after_operator_sym_empty     = force    # ignore/add/remove/force\n\n# Add or remove space after C/D cast, i.e. 'cast(int)a' vs 'cast(int) a' or '(int)a' vs '(int) a'\nsp_after_cast                   = force    # ignore/add/remove/force\n\n# Add or remove spaces inside cast parens\nsp_inside_paren_cast            = remove   # ignore/add/remove/force\n\n# Add or remove space between the type and open paren in a C++ cast, i.e. 'int(exp)' vs 'int (exp)'\nsp_cpp_cast_paren               = remove   # ignore/add/remove/force\n\n# Add or remove space between 'sizeof' and '('\nsp_sizeof_paren                 = remove   # ignore/add/remove/force\n\n# Add or remove space after the tag keyword (Pawn)\nsp_after_tag                    = force    # ignore/add/remove/force\n\n# Add or remove space inside enum '{' and '}'\nsp_inside_braces_enum           = force    # ignore/add/remove/force\n\n# Add or remove space inside struct/union '{' and '}'\nsp_inside_braces_struct         = force    # ignore/add/remove/force\n\n# Add or remove space inside '{' and '}'\nsp_inside_braces                = force    # ignore/add/remove/force\n\n# Add or remove space inside '{}'\nsp_inside_braces_empty          = force    # ignore/add/remove/force\n\n# Add or remove space between return type and function name\n# A minimum of 1 is forced except for pointer return types.\nsp_type_func                    = force    # ignore/add/remove/force\n\n# Add or remove space between function name and '(' on function declaration\nsp_func_proto_paren             = remove   # ignore/add/remove/force\n\n# Add or remove space between function name and '()' on function declaration without parameters\nsp_func_proto_paren_empty       = remove   # ignore/add/remove/force\n\n# Add or remove space between function name and '(' on function definition\nsp_func_def_paren               = remove   # ignore/add/remove/force\n\n# Add or remove space between function name and '()' on function definition without parameters\nsp_func_def_paren_empty         = remove   # ignore/add/remove/force\n\n# Add or remove space inside empty function '()'\nsp_inside_fparens               = remove   # ignore/add/remove/force\n\n# Add or remove space inside function '(' and ')'\nsp_inside_fparen                = remove   # ignore/add/remove/force\n\n# Add or remove space inside the first parens in the function type: 'void (*x)(...)'\nsp_inside_tparen                = remove   # ignore/add/remove/force\n\n# Add or remove between the parens in the function type: 'void (*x)(...)'\nsp_after_tparen_close           = remove   # ignore/add/remove/force\n\n# Add or remove space between ']' and '(' when part of a function call.\nsp_square_fparen                = remove   # ignore/add/remove/force\n\n# Add or remove space between ')' and '{' of function\nsp_fparen_brace                 = force    # ignore/add/remove/force\n\n# Java: Add or remove space between ')' and '{{' of double brace initializer.\nsp_fparen_dbrace                = force    # ignore/add/remove/force\n\n# Add or remove space between function name and '(' on function calls\nsp_func_call_paren              = remove   # ignore/add/remove/force\n\n# Add or remove space between function name and '()' on function calls without parameters.\n# If set to 'ignore' (the default), sp_func_call_paren is used.\nsp_func_call_paren_empty        = remove   # ignore/add/remove/force\n\n# Add or remove space between the user function name and '(' on function calls\n# You need to set a keyword to be a user function, like this: 'set func_call_user _' in the config file.\nsp_func_call_user_paren         = remove   # ignore/add/remove/force\n\n# Add or remove space between a constructor/destructor and the open paren\nsp_func_class_paren             = remove   # ignore/add/remove/force\n\n# Add or remove space between a constructor without parameters or destructor and '()'\nsp_func_class_paren_empty       = remove   # ignore/add/remove/force\n\n# Add or remove space between 'return' and '('\nsp_return_paren                 = force    # ignore/add/remove/force\n\n# Add or remove space between '__attribute__' and '('\nsp_attribute_paren              = force    # ignore/add/remove/force\n\n# Add or remove space between 'defined' and '(' in '#if defined (FOO)'\nsp_defined_paren                = remove   # ignore/add/remove/force\n\n# Add or remove space between 'throw' and '(' in 'throw (something)'\nsp_throw_paren                  = remove   # ignore/add/remove/force\n\n# Add or remove space between 'throw' and anything other than '(' as in '@throw [...];'\nsp_after_throw                  = force    # ignore/add/remove/force\n\n# Add or remove space between 'catch' and '(' in 'catch (something) { }'\n# If set to ignore, sp_before_sparen is used.\nsp_catch_paren                  = force    # ignore/add/remove/force\n\n# Add or remove space between 'version' and '(' in 'version (something) { }' (D language)\n# If set to ignore, sp_before_sparen is used.\nsp_version_paren                = force    # ignore/add/remove/force\n\n# Add or remove space between 'scope' and '(' in 'scope (something) { }' (D language)\n# If set to ignore, sp_before_sparen is used.\nsp_scope_paren                  = force    # ignore/add/remove/force\n\n# Add or remove space between 'super' and '(' in 'super (something)'. Default=Remove\nsp_super_paren                  = remove   # ignore/add/remove/force\n\n# Add or remove space between 'this' and '(' in 'this (something)'. Default=Remove\nsp_this_paren                   = remove   # ignore/add/remove/force\n\n# Add or remove space between macro and value\nsp_macro                        = force    # ignore/add/remove/force\n\n# Add or remove space between macro function ')' and value\nsp_macro_func                   = force    # ignore/add/remove/force\n\n# Add or remove space between 'else' and '{' if on the same line\nsp_else_brace                   = force    # ignore/add/remove/force\n\n# Add or remove space between '}' and 'else' if on the same line\nsp_brace_else                   = force    # ignore/add/remove/force\n\n# Add or remove space between '}' and the name of a typedef on the same line\nsp_brace_typedef                = force    # ignore/add/remove/force\n\n# Add or remove space between 'catch' and '{' if on the same line\nsp_catch_brace                  = force    # ignore/add/remove/force\n\n# Add or remove space between '}' and 'catch' if on the same line\nsp_brace_catch                  = force    # ignore/add/remove/force\n\n# Add or remove space between 'finally' and '{' if on the same line\nsp_finally_brace                = force    # ignore/add/remove/force\n\n# Add or remove space between '}' and 'finally' if on the same line\nsp_brace_finally                = force    # ignore/add/remove/force\n\n# Add or remove space between 'try' and '{' if on the same line\nsp_try_brace                    = force    # ignore/add/remove/force\n\n# Add or remove space between get/set and '{' if on the same line\nsp_getset_brace                 = force    # ignore/add/remove/force\n\n# Add or remove space between a variable and '{' for C++ uniform initialization. Default=Add\nsp_word_brace                   = add      # ignore/add/remove/force\n\n# Add or remove space between a variable and '{' for a namespace. Default=Add\nsp_word_brace_ns                = add      # ignore/add/remove/force\n\n# Add or remove space before the '::' operator\nsp_before_dc                    = remove   # ignore/add/remove/force\n\n# Add or remove space after the '::' operator\nsp_after_dc                     = remove   # ignore/add/remove/force\n\n# Add or remove around the D named array initializer ':' operator\nsp_d_array_colon                = force    # ignore/add/remove/force\n\n# Add or remove space after the '!' (not) operator. Default=Remove\nsp_not                          = remove   # ignore/add/remove/force\n\n# Add or remove space after the '~' (invert) operator. Default=Remove\nsp_inv                          = remove   # ignore/add/remove/force\n\n# Add or remove space after the '&' (address-of) operator. Default=Remove\n# This does not affect the spacing after a '&' that is part of a type.\nsp_addr                         = remove   # ignore/add/remove/force\n\n# Add or remove space around the '.' or '->' operators. Default=Remove\nsp_member                       = remove   # ignore/add/remove/force\n\n# Add or remove space after the '*' (dereference) operator. Default=Remove\n# This does not affect the spacing after a '*' that is part of a type.\nsp_deref                        = remove   # ignore/add/remove/force\n\n# Add or remove space after '+' or '-', as in 'x = -5' or 'y = +7'. Default=Remove\nsp_sign                         = remove   # ignore/add/remove/force\n\n# Add or remove space before or after '++' and '--', as in '(--x)' or 'y++;'. Default=Remove\nsp_incdec                       = remove   # ignore/add/remove/force\n\n# Add or remove space before a backslash-newline at the end of a line. Default=Add\nsp_before_nl_cont               = add      # ignore/add/remove/force\n\n# Add or remove space after the scope '+' or '-', as in '-(void) foo;' or '+(int) bar;'\nsp_after_oc_scope               = force    # ignore/add/remove/force\n\n# Add or remove space after the colon in message specs\n# '-(int) f:(int) x;' vs '-(int) f: (int) x;'\nsp_after_oc_colon               = force    # ignore/add/remove/force\n\n# Add or remove space before the colon in message specs\n# '-(int) f: (int) x;' vs '-(int) f : (int) x;'\nsp_before_oc_colon              = force    # ignore/add/remove/force\n\n# Add or remove space after the colon in immutable dictionary expression\n# 'NSDictionary *test = @{@\"foo\" :@\"bar\"};'\nsp_after_oc_dict_colon          = force    # ignore/add/remove/force\n\n# Add or remove space before the colon in immutable dictionary expression\n# 'NSDictionary *test = @{@\"foo\" :@\"bar\"};'\nsp_before_oc_dict_colon         = force    # ignore/add/remove/force\n\n# Add or remove space after the colon in message specs\n# '[object setValue:1];' vs '[object setValue: 1];'\nsp_after_send_oc_colon          = force    # ignore/add/remove/force\n\n# Add or remove space before the colon in message specs\n# '[object setValue:1];' vs '[object setValue :1];'\nsp_before_send_oc_colon         = force    # ignore/add/remove/force\n\n# Add or remove space after the (type) in message specs\n# '-(int)f: (int) x;' vs '-(int)f: (int)x;'\nsp_after_oc_type                = force    # ignore/add/remove/force\n\n# Add or remove space after the first (type) in message specs\n# '-(int) f:(int)x;' vs '-(int)f:(int)x;'\nsp_after_oc_return_type         = force    # ignore/add/remove/force\n\n# Add or remove space between '@selector' and '('\n# '@selector(msgName)' vs '@selector (msgName)'\n# Also applies to @protocol() constructs\nsp_after_oc_at_sel              = force    # ignore/add/remove/force\n\n# Add or remove space between '@selector(x)' and the following word\n# '@selector(foo) a:' vs '@selector(foo)a:'\nsp_after_oc_at_sel_parens       = force    # ignore/add/remove/force\n\n# Add or remove space inside '@selector' parens\n# '@selector(foo)' vs '@selector( foo )'\n# Also applies to @protocol() constructs\nsp_inside_oc_at_sel_parens      = force    # ignore/add/remove/force\n\n# Add or remove space before a block pointer caret\n# '^int (int arg){...}' vs. ' ^int (int arg){...}'\nsp_before_oc_block_caret        = force    # ignore/add/remove/force\n\n# Add or remove space after a block pointer caret\n# '^int (int arg){...}' vs. '^ int (int arg){...}'\nsp_after_oc_block_caret         = force    # ignore/add/remove/force\n\n# Add or remove space between the receiver and selector in a message.\n# '[receiver selector ...]'\nsp_after_oc_msg_receiver        = force    # ignore/add/remove/force\n\n# Add or remove space after @property.\nsp_after_oc_property            = force    # ignore/add/remove/force\n\n# Add or remove space around the ':' in 'b ? t : f'\nsp_cond_colon                   = force    # ignore/add/remove/force\n\n# Add or remove space before the ':' in 'b ? t : f'. Overrides sp_cond_colon.\nsp_cond_colon_before            = force    # ignore/add/remove/force\n\n# Add or remove space after the ':' in 'b ? t : f'. Overrides sp_cond_colon.\nsp_cond_colon_after             = force    # ignore/add/remove/force\n\n# Add or remove space around the '?' in 'b ? t : f'\nsp_cond_question                = force    # ignore/add/remove/force\n\n# Add or remove space before the '?' in 'b ? t : f'. Overrides sp_cond_question.\nsp_cond_question_before         = force    # ignore/add/remove/force\n\n# Add or remove space after the '?' in 'b ? t : f'. Overrides sp_cond_question.\nsp_cond_question_after          = force    # ignore/add/remove/force\n\n# In the abbreviated ternary form (a ?: b), add/remove space between ? and :.'. Overrides all other sp_cond_* options.\nsp_cond_ternary_short           = force    # ignore/add/remove/force\n\n# Fix the spacing between 'case' and the label. Only 'ignore' and 'force' make sense here.\nsp_case_label                   = force    # ignore/add/remove/force\n\n# Control the space around the D '..' operator.\nsp_range                        = force    # ignore/add/remove/force\n\n# Control the spacing after ':' in 'for (TYPE VAR : EXPR)'\nsp_after_for_colon              = force    # ignore/add/remove/force\n\n# Control the spacing before ':' in 'for (TYPE VAR : EXPR)'\nsp_before_for_colon             = force    # ignore/add/remove/force\n\n# Control the spacing in 'extern (C)' (D)\nsp_extern_paren                 = force    # ignore/add/remove/force\n\n# Control the space after the opening of a C++ comment '// A' vs '//A'\nsp_cmt_cpp_start                = force    # ignore/add/remove/force\n\n# TRUE: If space is added with sp_cmt_cpp_start, do it after doxygen sequences like '///', '///<', '//!' and '//!<'.\nsp_cmt_cpp_doxygen              = false    # false/true\n\n# TRUE: If space is added with sp_cmt_cpp_start, do it after Qt translator or meta-data comments like '//:', '//=', and '//~'.\nsp_cmt_cpp_qttr                 = false    # false/true\n\n# Controls the spaces between #else or #endif and a trailing comment\nsp_endif_cmt                    = force    # ignore/add/remove/force\n\n# Controls the spaces after 'new', 'delete' and 'delete[]'\nsp_after_new                    = force    # ignore/add/remove/force\n\n# Controls the spaces between new and '(' in 'new()'\nsp_between_new_paren            = force    # ignore/add/remove/force\n\n# Controls the spaces before a trailing or embedded comment\nsp_before_tr_emb_cmt            = force    # ignore/add/remove/force\n\n# Number of spaces before a trailing or embedded comment\nsp_num_before_tr_emb_cmt        = 0        # number\n\n# Control space between a Java annotation and the open paren.\nsp_annotation_paren             = force    # ignore/add/remove/force\n\n# If true, vbrace tokens are dropped to the previous token and skipped.\nsp_skip_vbrace_tokens           = false    # false/true\n\n#\n# Code alignment (not left column spaces/tabs)\n#\n\n# Whether to keep non-indenting tabs\nalign_keep_tabs                 = false    # false/true\n\n# Whether to use tabs for aligning\nalign_with_tabs                 = false    # false/true\n\n# Whether to bump out to the next tab when aligning\nalign_on_tabstop                = false    # false/true\n\n# Whether to left-align numbers\n#align_number_left               = false    # false/true\n\n# Whether to keep whitespace not required for alignment.\nalign_keep_extra_space          = false    # false/true\n\n# Align variable definitions in prototypes and functions\nalign_func_params               = false    # false/true\n\n# Align parameters in single-line functions that have the same name.\n# The function names must already be aligned with each other.\nalign_same_func_call_params     = false    # false/true\n\n# The span for aligning variable definitions (0=don't align)\nalign_var_def_span              = 0        # number\n\n# How to align the star in variable definitions.\n#  0=Part of the type     'void *   foo;'\n#  1=Part of the variable 'void     *foo;'\n#  2=Dangling             'void    *foo;'\nalign_var_def_star_style        = 0        # number\n\n# How to align the '&' in variable definitions.\n#  0=Part of the type\n#  1=Part of the variable\n#  2=Dangling\nalign_var_def_amp_style         = 0        # number\n\n# The threshold for aligning variable definitions (0=no limit)\nalign_var_def_thresh            = 0        # number\n\n# The gap for aligning variable definitions\nalign_var_def_gap               = 0        # number\n\n# Whether to align the colon in struct bit fields\nalign_var_def_colon             = false    # false/true\n\n# Whether to align any attribute after the variable name\nalign_var_def_attribute         = false    # false/true\n\n# Whether to align inline struct/enum/union variable definitions\nalign_var_def_inline            = false    # false/true\n\n# The span for aligning on '=' in assignments (0=don't align)\nalign_assign_span               = 0        # number\n\n# The threshold for aligning on '=' in assignments (0=no limit)\nalign_assign_thresh             = 0        # number\n\n# The span for aligning on '=' in enums (0=don't align)\nalign_enum_equ_span             = 0        # number\n\n# The threshold for aligning on '=' in enums (0=no limit)\nalign_enum_equ_thresh           = 0        # number\n\n# The span for aligning class (0=don't align)\nalign_var_class_span            = 0        # number\n\n# The threshold for aligning class member definitions (0=no limit)\nalign_var_class_thresh          = 0        # number\n\n# The gap for aligning class member definitions\nalign_var_class_gap             = 0        # number\n\n# The span for aligning struct/union (0=don't align)\nalign_var_struct_span           = 0        # number\n\n# The threshold for aligning struct/union member definitions (0=no limit)\nalign_var_struct_thresh         = 0        # number\n\n# The gap for aligning struct/union member definitions\nalign_var_struct_gap            = 0        # number\n\n# The span for aligning struct initializer values (0=don't align)\nalign_struct_init_span          = 0        # number\n\n# The minimum space between the type and the synonym of a typedef\nalign_typedef_gap               = 0        # number\n\n# The span for aligning single-line typedefs (0=don't align)\nalign_typedef_span              = 0        # number\n\n# How to align typedef'd functions with other typedefs\n# 0: Don't mix them at all\n# 1: align the open paren with the types\n# 2: align the function type name with the other type names\nalign_typedef_func              = 0        # number\n\n# Controls the positioning of the '*' in typedefs. Just try it.\n# 0: Align on typedef type, ignore '*'\n# 1: The '*' is part of type name: typedef int  *pint;\n# 2: The '*' is part of the type, but dangling: typedef int *pint;\nalign_typedef_star_style        = 0        # number\n\n# Controls the positioning of the '&' in typedefs. Just try it.\n# 0: Align on typedef type, ignore '&'\n# 1: The '&' is part of type name: typedef int  &pint;\n# 2: The '&' is part of the type, but dangling: typedef int &pint;\nalign_typedef_amp_style         = 0        # number\n\n# The span for aligning comments that end lines (0=don't align)\nalign_right_cmt_span            = 0        # number\n\n# If aligning comments, mix with comments after '}' and #endif with less than 3 spaces before the comment\nalign_right_cmt_mix             = false    # false/true\n\n# If a trailing comment is more than this number of columns away from the text it follows,\n# it will qualify for being aligned. This has to be > 0 to do anything.\nalign_right_cmt_gap             = 0        # number\n\n# Align trailing comment at or beyond column N; 'pulls in' comments as a bonus side effect (0=ignore)\nalign_right_cmt_at_col          = 0        # number\n\n# The span for aligning function prototypes (0=don't align)\nalign_func_proto_span           = 0        # number\n\n# Minimum gap between the return type and the function name.\nalign_func_proto_gap            = 0        # number\n\n# Align function protos on the 'operator' keyword instead of what follows\nalign_on_operator               = false    # false/true\n\n# Whether to mix aligning prototype and variable declarations.\n# If true, align_var_def_XXX options are used instead of align_func_proto_XXX options.\nalign_mix_var_proto             = false    # false/true\n\n# Align single-line functions with function prototypes, uses align_func_proto_span\nalign_single_line_func          = false    # false/true\n\n# Aligning the open brace of single-line functions.\n# Requires align_single_line_func=true, uses align_func_proto_span\nalign_single_line_brace         = false    # false/true\n\n# Gap for align_single_line_brace.\nalign_single_line_brace_gap     = 0        # number\n\n# The span for aligning ObjC msg spec (0=don't align)\nalign_oc_msg_spec_span          = 0        # number\n\n# Whether to align macros wrapped with a backslash and a newline.\n# This will not work right if the macro contains a multi-line comment.\nalign_nl_cont                   = false    # false/true\n\n# # Align macro functions and variables together\nalign_pp_define_together        = false    # false/true\n\n# The minimum space between label and value of a preprocessor define\nalign_pp_define_gap             = 0        # number\n\n# The span for aligning on '#define' bodies (0=don't align, other=number of lines including comments between blocks)\nalign_pp_define_span            = 0        # number\n\n# Align lines that start with '<<' with previous '<<'. Default=True\nalign_left_shift                = true     # false/true\n\n# Align text after asm volatile () colons.\nalign_asm_colon                 = false    # false/true\n\n# Span for aligning parameters in an Obj-C message call on the ':' (0=don't align)\nalign_oc_msg_colon_span         = 0        # number\n\n# If true, always align with the first parameter, even if it is too short.\nalign_oc_msg_colon_first        = false    # false/true\n\n# Aligning parameters in an Obj-C '+' or '-' declaration on the ':'\nalign_oc_decl_colon             = false    # false/true\n\n#\n# Newline adding and removing options\n#\n\n# Whether to collapse empty blocks between '{' and '}'\nnl_collapse_empty_body          = false    # false/true\n\n# Don't split one-line braced assignments - 'foo_t f = { 1, 2 };'\nnl_assign_leave_one_liners      = true     # false/true\n\n# Don't split one-line braced statements inside a class xx { } body\nnl_class_leave_one_liners       = false    # false/true\n\n# Don't split one-line enums: 'enum foo { BAR = 15 };'\nnl_enum_leave_one_liners        = false    # false/true\n\n# Don't split one-line get or set functions\nnl_getset_leave_one_liners      = false    # false/true\n\n# Don't split one-line function definitions - 'int foo() { return 0; }'\nnl_func_leave_one_liners        = false    # false/true\n\n# Don't split one-line C++11 lambdas - '[]() { return 0; }'\nnl_cpp_lambda_leave_one_liners  = true     # false/true\n\n# Don't split one-line if/else statements - 'if(a) b++;'\nnl_if_leave_one_liners          = false    # false/true\n\n# Don't split one-line while statements - 'while(a) b++;'\nnl_while_leave_one_liners       = false    # false/true\n\n# Don't split one-line OC messages\nnl_oc_msg_leave_one_liner       = false    # false/true\n\n# Add or remove newline between Objective-C block signature and '{'\nnl_oc_block_brace               = remove   # ignore/add/remove/force\n\n# Add or remove newlines at the start of the file\nnl_start_of_file                = force    # ignore/add/remove/force\n\n# The number of newlines at the start of the file (only used if nl_start_of_file is 'add' or 'force'\nnl_start_of_file_min            = 0        # number\n\n# Add or remove newline at the end of the file\nnl_end_of_file                  = force    # ignore/add/remove/force\n\n# The number of newlines at the end of the file (only used if nl_end_of_file is 'add' or 'force')\nnl_end_of_file_min              = 1        # number\n\n# Add or remove newline between '=' and '{'\nnl_assign_brace                 = remove   # ignore/add/remove/force\n\n# Add or remove newline between '=' and '[' (D only)\nnl_assign_square                = remove   # ignore/add/remove/force\n\n# Add or remove newline after '= [' (D only). Will also affect the newline before the ']'\nnl_after_square_assign          = remove   # ignore/add/remove/force\n\n# The number of blank lines after a block of variable definitions at the top of a function body\n# 0 = No change (default)\nnl_func_var_def_blk             = 0        # number\n\n# The number of newlines before a block of typedefs\n# 0 = No change (default)\n# the option 'nl_after_access_spec' takes preference over 'nl_typedef_blk_start'\nnl_typedef_blk_start            = 0        # number\n\n# The number of newlines after a block of typedefs\n# 0 = No change (default)\nnl_typedef_blk_end              = 0        # number\n\n# The maximum consecutive newlines within a block of typedefs\n# 0 = No change (default)\nnl_typedef_blk_in               = 0        # number\n\n# The number of newlines before a block of variable definitions not at the top of a function body\n# 0 = No change (default)\n# the option 'nl_after_access_spec' takes preference over 'nl_var_def_blk_start'\nnl_var_def_blk_start            = 0        # number\n\n# The number of newlines after a block of variable definitions not at the top of a function body\n# 0 = No change (default)\nnl_var_def_blk_end              = 0        # number\n\n# The maximum consecutive newlines within a block of variable definitions\n# 0 = No change (default)\nnl_var_def_blk_in               = 0        # number\n\n# Add or remove newline between a function call's ')' and '{', as in:\n# list_for_each(item, &list) { }\nnl_fcall_brace                  = force    # ignore/add/remove/force\n\n# Add or remove newline between 'enum' and '{'\nnl_enum_brace                   = force    # ignore/add/remove/force\n\n# Add or remove newline between 'struct and '{'\nnl_struct_brace                 = force    # ignore/add/remove/force\n\n# Add or remove newline between 'union' and '{'\nnl_union_brace                  = force    # ignore/add/remove/force\n\n# Add or remove newline between 'if' and '{'\nnl_if_brace                     = force    # ignore/add/remove/force\n\n# Add or remove newline between '}' and 'else'\nnl_brace_else                   = force    # ignore/add/remove/force\n\n# Add or remove newline between 'else if' and '{'\n# If set to ignore, nl_if_brace is used instead\nnl_elseif_brace                 = force    # ignore/add/remove/force\n\n# Add or remove newline between 'else' and '{'\nnl_else_brace                   = force    # ignore/add/remove/force\n\n# Add or remove newline between 'else' and 'if'\nnl_else_if                      = remove   # ignore/add/remove/force\n\n# Add or remove newline between '}' and 'finally'\nnl_brace_finally                = force    # ignore/add/remove/force\n\n# Add or remove newline between 'finally' and '{'\nnl_finally_brace                = force    # ignore/add/remove/force\n\n# Add or remove newline between 'try' and '{'\nnl_try_brace                    = force    # ignore/add/remove/force\n\n# Add or remove newline between get/set and '{'\nnl_getset_brace                 = force    # ignore/add/remove/force\n\n# Add or remove newline between 'for' and '{'\nnl_for_brace                    = force    # ignore/add/remove/force\n\n# Add or remove newline between 'catch' and '{'\nnl_catch_brace                  = force    # ignore/add/remove/force\n\n# Add or remove newline between '}' and 'catch'\nnl_brace_catch                  = force    # ignore/add/remove/force\n\n# Add or remove newline between '}' and ']'\nnl_brace_square                 = force    # ignore/add/remove/force\n\n# Add or remove newline between '}' and ')' in a function invocation\nnl_brace_fparen                 = ignore   # ignore/add/remove/force\n\n# Add or remove newline between 'while' and '{'\nnl_while_brace                  = force    # ignore/add/remove/force\n\n# Add or remove newline between 'scope (x)' and '{' (D)\nnl_scope_brace                  = force    # ignore/add/remove/force\n\n# Add or remove newline between 'unittest' and '{' (D)\nnl_unittest_brace               = force    # ignore/add/remove/force\n\n# Add or remove newline between 'version (x)' and '{' (D)\nnl_version_brace                = force    # ignore/add/remove/force\n\n# Add or remove newline between 'using' and '{'\nnl_using_brace                  = force    # ignore/add/remove/force\n\n# Add or remove newline between two open or close braces.\n# Due to general newline/brace handling, REMOVE may not work.\nnl_brace_brace                  = ignore   # ignore/add/remove/force\n\n# Add or remove newline between 'do' and '{'\nnl_do_brace                     = force    # ignore/add/remove/force\n\n# Add or remove newline between '}' and 'while' of 'do' statement\nnl_brace_while                  = force    # ignore/add/remove/force\n\n# Add or remove newline between 'switch' and '{'\nnl_switch_brace                 = force    # ignore/add/remove/force\n\n# Add or remove newline between 'synchronized' and '{'\nnl_synchronized_brace           = force    # ignore/add/remove/force\n\n# Add a newline between ')' and '{' if the ')' is on a different line than the if/for/etc.\n# Overrides nl_for_brace, nl_if_brace, nl_switch_brace, nl_while_switch and nl_catch_brace.\nnl_multi_line_cond              = false    # false/true\n\n# Force a newline in a define after the macro name for multi-line defines.\nnl_multi_line_define            = false    # false/true\n\n# Whether to put a newline before 'case' statement, not after the first 'case'\nnl_before_case                  = false    # false/true\n\n# Add or remove newline between ')' and 'throw'\nnl_before_throw                 = force    # ignore/add/remove/force\n\n# Whether to put a newline after 'case' statement\nnl_after_case                   = false    # false/true\n\n# Add or remove a newline between a case ':' and '{'. Overrides nl_after_case.\nnl_case_colon_brace             = force    # ignore/add/remove/force\n\n# Newline between namespace and {\nnl_namespace_brace              = force    # ignore/add/remove/force\n\n# Add or remove newline between 'template<>' and whatever follows.\nnl_template_class               = force    # ignore/add/remove/force\n\n# Add or remove newline between 'class' and '{'\nnl_class_brace                  = force    # ignore/add/remove/force\n\n# Add or remove newline before/after each ',' in the base class list,\n#   (tied to pos_class_comma).\nnl_class_init_args              = force    # ignore/add/remove/force\n\n# Add or remove newline after each ',' in the constructor member initialization.\n# Related to nl_constr_colon, pos_constr_colon and pos_constr_comma.\nnl_constr_init_args             = force    # ignore/add/remove/force\n\n# Add or remove newline before first element, after comma, and after last element in enum\nnl_enum_own_lines               = force    # ignore/add/remove/force\n\n# Add or remove newline between return type and function name in a function definition\nnl_func_type_name               = remove   # ignore/add/remove/force\n\n# Add or remove newline between return type and function name inside a class {}\n# Uses nl_func_type_name or nl_func_proto_type_name if set to ignore.\nnl_func_type_name_class         = remove   # ignore/add/remove/force\n\n# Add or remove newline between class specification and '::' in 'void A::f() { }'\n# Only appears in separate member implementation (does not appear with in-line implmementation)\nnl_func_class_scope             = remove   # ignore/add/remove/force\n\n# Add or remove newline between function scope and name\n# Controls the newline after '::' in 'void A::f() { }'\nnl_func_scope_name              = remove   # ignore/add/remove/force\n\n# Add or remove newline between return type and function name in a prototype\nnl_func_proto_type_name         = remove   # ignore/add/remove/force\n\n# Add or remove newline between a function name and the opening '(' in the declaration\nnl_func_paren                   = remove   # ignore/add/remove/force\n\n# Add or remove newline between a function name and the opening '(' in the definition\nnl_func_def_paren               = remove   # ignore/add/remove/force\n\n# Add or remove newline after '(' in a function declaration\nnl_func_decl_start              = remove   # ignore/add/remove/force\n\n# Add or remove newline after '(' in a function definition\nnl_func_def_start               = remove   # ignore/add/remove/force\n\n# Overrides nl_func_decl_start when there is only one parameter.\nnl_func_decl_start_single       = remove   # ignore/add/remove/force\n\n# Overrides nl_func_def_start when there is only one parameter.\nnl_func_def_start_single        = remove   # ignore/add/remove/force\n\n# Whether to add newline after '(' in a function declaration if '(' and ')' are in different lines.\nnl_func_decl_start_multi_line   = false    # false/true\n\n# Whether to add newline after '(' in a function definition if '(' and ')' are in different lines.\nnl_func_def_start_multi_line    = false    # false/true\n\n# Add or remove newline after each ',' in a function declaration\nnl_func_decl_args               = ignore   # ignore/add/remove/force\n\n# Add or remove newline after each ',' in a function definition\nnl_func_def_args                = ignore   # ignore/add/remove/force\n\n# Whether to add newline after each ',' in a function declaration if '(' and ')' are in different lines.\nnl_func_decl_args_multi_line    = false    # false/true\n\n# Whether to add newline after each ',' in a function definition if '(' and ')' are in different lines.\nnl_func_def_args_multi_line     = false    # false/true\n\n# Add or remove newline before the ')' in a function declaration\nnl_func_decl_end                = remove   # ignore/add/remove/force\n\n# Add or remove newline before the ')' in a function definition\nnl_func_def_end                 = remove   # ignore/add/remove/force\n\n# Overrides nl_func_decl_end when there is only one parameter.\nnl_func_decl_end_single         = remove   # ignore/add/remove/force\n\n# Overrides nl_func_def_end when there is only one parameter.\nnl_func_def_end_single          = remove   # ignore/add/remove/force\n\n# Whether to add newline before ')' in a function declaration if '(' and ')' are in different lines.\nnl_func_decl_end_multi_line     = false    # false/true\n\n# Whether to add newline before ')' in a function definition if '(' and ')' are in different lines.\nnl_func_def_end_multi_line      = false    # false/true\n\n# Add or remove newline between '()' in a function declaration.\nnl_func_decl_empty              = remove   # ignore/add/remove/force\n\n# Add or remove newline between '()' in a function definition.\nnl_func_def_empty               = remove   # ignore/add/remove/force\n\n# Whether to add newline after '(' in a function call if '(' and ')' are in different lines.\nnl_func_call_start_multi_line   = false    # false/true\n\n# Whether to add newline after each ',' in a function call if '(' and ')' are in different lines.\nnl_func_call_args_multi_line    = false    # false/true\n\n# Whether to add newline before ')' in a function call if '(' and ')' are in different lines.\nnl_func_call_end_multi_line     = false    # false/true\n\n# Whether to put each OC message parameter on a separate line\n# See nl_oc_msg_leave_one_liner\nnl_oc_msg_args                  = false    # false/true\n\n# Add or remove newline between function signature and '{'\nnl_fdef_brace                   = force    # ignore/add/remove/force\n\n# Add or remove newline between C++11 lambda signature and '{'\nnl_cpp_ldef_brace               = force    # ignore/add/remove/force\n\n# Add or remove a newline between the return keyword and return expression.\nnl_return_expr                  = remove   # ignore/add/remove/force\n\n# Whether to put a newline after semicolons, except in 'for' statements\nnl_after_semicolon              = false    # false/true\n\n# Java: Control the newline between the ')' and '{{' of the double brace initializer.\nnl_paren_dbrace_open            = force    # ignore/add/remove/force\n\n# Whether to put a newline after brace open.\n# This also adds a newline before the matching brace close.\nnl_after_brace_open             = false    # false/true\n\n# If nl_after_brace_open and nl_after_brace_open_cmt are true, a newline is\n# placed between the open brace and a trailing single-line comment.\nnl_after_brace_open_cmt         = false    # false/true\n\n# Whether to put a newline after a virtual brace open with a non-empty body.\n# These occur in un-braced if/while/do/for statement bodies.\nnl_after_vbrace_open            = false    # false/true\n\n# Whether to put a newline after a virtual brace open with an empty body.\n# These occur in un-braced if/while/do/for statement bodies.\nnl_after_vbrace_open_empty      = false    # false/true\n\n# Whether to put a newline after a brace close.\n# Does not apply if followed by a necessary ';'.\nnl_after_brace_close            = false    # false/true\n\n# Whether to put a newline after a virtual brace close.\n# Would add a newline before return in: 'if (foo) a++; return;'\nnl_after_vbrace_close           = false    # false/true\n\n# Control the newline between the close brace and 'b' in: 'struct { int a; } b;'\n# Affects enums, unions and structures. If set to ignore, uses nl_after_brace_close\nnl_brace_struct_var             = force    # ignore/add/remove/force\n\n# Whether to alter newlines in '#define' macros\nnl_define_macro                 = false    # false/true\n\n# Whether to remove blanks after '#ifxx' and '#elxx', or before '#elxx' and '#endif'. Does not affect top-level #ifdefs.\nnl_squeeze_ifdef                = false    # false/true\n\n# Makes the nl_squeeze_ifdef option affect the top-level #ifdefs as well.\nnl_squeeze_ifdef_top_level      = false    # false/true\n\n# Add or remove blank line before 'if'\nnl_before_if                    = ignore   # ignore/add/remove/force\n\n# Add or remove blank line after 'if' statement\nnl_after_if                     = ignore   # ignore/add/remove/force XXX\n\n# Add or remove blank line before 'for'\nnl_before_for                   = ignore   # ignore/add/remove/force\n\n# Add or remove blank line after 'for' statement\nnl_after_for                    = ignore   # ignore/add/remove/force XXX\n\n# Add or remove blank line before 'while'\nnl_before_while                 = force    # ignore/add/remove/force\n\n# Add or remove blank line after 'while' statement\nnl_after_while                  = ignore   # ignore/add/remove/force XXX\n\n# Add or remove blank line before 'switch'\nnl_before_switch                = force    # ignore/add/remove/force\n\n# Add or remove blank line after 'switch' statement\nnl_after_switch                 = ignore   # ignore/add/remove/force\n\n# Add or remove blank line before 'synchronized'\nnl_before_synchronized          = force    # ignore/add/remove/force\n\n# Add or remove blank line after 'synchronized' statement\nnl_after_synchronized           = force    # ignore/add/remove/force\n\n# Add or remove blank line before 'do'\nnl_before_do                    = force    # ignore/add/remove/force\n\n# Add or remove blank line after 'do/while' statement\nnl_after_do                     = force    # ignore/add/remove/force\n\n# Whether to double-space commented-entries in struct/union/enum\nnl_ds_struct_enum_cmt           = false    # false/true\n\n# force nl before } of a struct/union/enum\n# (lower priority than 'eat_blanks_before_close_brace')\nnl_ds_struct_enum_close_brace   = false    # false/true\n\n# Add or remove blank line before 'func_class_def'\nnl_before_func_class_def        = 0        # number\n\n# Add or remove blank line before 'func_class_proto'\nnl_before_func_class_proto      = 0        # number\n\n# Add or remove a newline before/after a class colon,\n#   (tied to pos_class_colon).\nnl_class_colon                  = remove   # ignore/add/remove/force\n\n# Add or remove a newline around a class constructor colon.\n# Related to nl_constr_init_args, pos_constr_colon and pos_constr_comma.\nnl_constr_colon                 = force    # ignore/add/remove/force\n\n# Change simple unbraced if statements into a one-liner\n# 'if(b)\\n i++;' => 'if(b) i++;'\nnl_create_if_one_liner          = false    # false/true\n\n# Change simple unbraced for statements into a one-liner\n# 'for (i=0;i<5;i++)\\n foo(i);' => 'for (i=0;i<5;i++) foo(i);'\nnl_create_for_one_liner         = false    # false/true\n\n# Change simple unbraced while statements into a one-liner\n# 'while (i<5)\\n foo(i++);' => 'while (i<5) foo(i++);'\nnl_create_while_one_liner       = false    # false/true\n\n#  Change a one-liner if statement into simple unbraced if\n# 'if(b) i++;' => 'if(b) i++;'\nnl_split_if_one_liner           = false    # false/true\n\n# Change a one-liner for statement into simple unbraced for\n# 'for (i=0;<5;i++) foo(i);' => 'for (i=0;<5;i++) foo(i);'\nnl_split_for_one_liner          = false    # false/true\n\n# Change simple unbraced while statements into a one-liner while\n# 'while (i<5)\\n foo(i++);' => 'while (i<5) foo(i++);'\nnl_split_while_one_liner        = false    # false/true\n\n#\n# Positioning options\n#\n\n# The position of arithmetic operators in wrapped expressions\npos_arith                       = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force\n\n# The position of assignment in wrapped expressions.\n# Do not affect '=' followed by '{'\npos_assign                      = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force\n\n# The position of boolean operators in wrapped expressions\npos_bool                        = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force\n\n# The position of comparison operators in wrapped expressions\npos_compare                     = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force\n\n# The position of conditional (b ? t : f) operators in wrapped expressions\npos_conditional                 = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force\n\n# The position of the comma in wrapped expressions\npos_comma                       = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force\n\n# The position of the comma in enum entries\npos_enum_comma                  = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force\n\n# The position of the comma in the base class list if there are more than one line,\n#   (tied to nl_class_init_args).\npos_class_comma                 = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force\n\n# The position of the comma in the constructor initialization list.\n# Related to nl_constr_colon, nl_constr_init_args and pos_constr_colon.\npos_constr_comma                = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force\n\n# The position of trailing/leading class colon, between class and base class list\n#   (tied to nl_class_colon).\npos_class_colon                 = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force\n\n# The position of colons between constructor and member initialization,\n# (tied to UO_nl_constr_colon).\n# Related to nl_constr_colon, nl_constr_init_args and pos_constr_comma.\npos_constr_colon                = ignore   # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force\n\n#\n# Line Splitting options\n#\n\n# Try to limit code width to N number of columns\ncode_width                      = 120      # number\n\n# Whether to fully split long 'for' statements at semi-colons\nls_for_split_full               = false    # false/true\n\n# Whether to fully split long function protos/calls at commas\nls_func_split_full              = false    # false/true\n\n# Whether to split lines as close to code_width as possible and ignore some groupings\nls_code_width                   = false    # false/true\n\n#\n# Blank line options\n#\n\n# The maximum consecutive newlines (3 = 2 blank lines)\nnl_max                          = 0        # number\n\n# The number of newlines after a function prototype, if followed by another function prototype\nnl_after_func_proto             = 0        # number\n\n# The number of newlines after a function prototype, if not followed by another function prototype\nnl_after_func_proto_group       = 0        # number\n\n# The number of newlines after a function class prototype, if followed by another function class prototype\nnl_after_func_class_proto       = 0        # number\n\n# The number of newlines after a function class prototype, if not followed by another function class prototype\nnl_after_func_class_proto_group = 0        # number\n\n# The number of newlines before a multi-line function def body\nnl_before_func_body_def         = 0        # number\n\n# The number of newlines before a multi-line function prototype body\nnl_before_func_body_proto       = 0        # number\n\n# The number of newlines after '}' of a multi-line function body\nnl_after_func_body              = 0        # number\n\n# The number of newlines after '}' of a multi-line function body in a class declaration\nnl_after_func_body_class        = 0        # number\n\n# The number of newlines after '}' of a single line function body\nnl_after_func_body_one_liner    = 0        # number\n\n# The minimum number of newlines before a multi-line comment.\n# Doesn't apply if after a brace open or another multi-line comment.\nnl_before_block_comment         = 0        # number\n\n# The minimum number of newlines before a single-line C comment.\n# Doesn't apply if after a brace open or other single-line C comments.\nnl_before_c_comment             = 0        # number\n\n# The minimum number of newlines before a CPP comment.\n# Doesn't apply if after a brace open or other CPP comments.\nnl_before_cpp_comment           = 0        # number\n\n# Whether to force a newline after a multi-line comment.\nnl_after_multiline_comment      = false    # false/true\n\n# Whether to force a newline after a label's colon.\nnl_after_label_colon            = false    # false/true\n\n# The number of newlines after '}' or ';' of a struct/enum/union definition\nnl_after_struct                 = 0        # number\n\n# The number of newlines before a class definition\nnl_before_class                 = 0        # number\n\n# The number of newlines after '}' or ';' of a class definition\nnl_after_class                  = 0        # number\n\n# The number of newlines before a 'private:', 'public:', 'protected:', 'signals:', or 'slots:' label.\n# Will not change the newline count if after a brace open.\n# 0 = No change.\nnl_before_access_spec           = 0        # number\n\n# The number of newlines after a 'private:', 'public:', 'protected:', 'signals:' or 'slots:' label.\n# 0 = No change.\n# the option 'nl_after_access_spec' takes preference over 'nl_typedef_blk_start' and 'nl_var_def_blk_start'\nnl_after_access_spec            = 0        # number\n\n# The number of newlines between a function def and the function comment.\n# 0 = No change.\nnl_comment_func_def             = 0        # number\n\n# The number of newlines after a try-catch-finally block that isn't followed by a brace close.\n# 0 = No change.\nnl_after_try_catch_finally      = 0        # number\n\n# The number of newlines before and after a property, indexer or event decl.\n# 0 = No change.\nnl_around_cs_property           = 0        # number\n\n# The number of newlines between the get/set/add/remove handlers in C#.\n# 0 = No change.\nnl_between_get_set              = 0        # number\n\n# Add or remove newline between C# property and the '{'\nnl_property_brace               = force    # ignore/add/remove/force\n\n# Whether to remove blank lines after '{'\neat_blanks_after_open_brace     = false    # false/true\n\n# Whether to remove blank lines before '}'\neat_blanks_before_close_brace   = false    # false/true\n\n# How aggressively to remove extra newlines not in preproc.\n# 0: No change\n# 1: Remove most newlines not handled by other config\n# 2: Remove all newlines and reformat completely by config\nnl_remove_extra_newlines        = 0        # number\n\n# Whether to put a blank line before 'return' statements, unless after an open brace.\nnl_before_return                = false    # false/true\n\n# Whether to put a blank line after 'return' statements, unless followed by a close brace.\nnl_after_return                 = false    # false/true\n\n# Whether to put a newline after a Java annotation statement.\n# Only affects annotations that are after a newline.\nnl_after_annotation             = force    # ignore/add/remove/force\n\n# Controls the newline between two annotations.\nnl_between_annotation           = force    # ignore/add/remove/force\n\n#\n# Code modifying options (non-whitespace)\n#\n\n# Add or remove braces on single-line 'do' statement\nmod_full_brace_do               = force    # ignore/add/remove/force\n\n# Add or remove braces on single-line 'for' statement\nmod_full_brace_for              = force    # ignore/add/remove/force\n\n# Add or remove braces on single-line function definitions. (Pawn)\nmod_full_brace_function         = force    # ignore/add/remove/force\n\n# Add or remove braces on single-line 'if' statement. Will not remove the braces if they contain an 'else'.\nmod_full_brace_if               = force    # ignore/add/remove/force\n\n# Make all if/elseif/else statements in a chain be braced or not. Overrides mod_full_brace_if.\n# If any must be braced, they are all braced.  If all can be unbraced, then the braces are removed.\nmod_full_brace_if_chain         = false    # false/true\n\n# Make all if/elseif/else statements with at least one 'else' or 'else if' fully braced.\n# If mod_full_brace_if_chain is used together with this option, all if-else chains will get braces,\n# and simple 'if' statements will lose them (if possible).\nmod_full_brace_if_chain_only    = false    # false/true\n\n# Don't remove braces around statements that span N newlines\nmod_full_brace_nl               = 0        # number\n\n# Add or remove braces on single-line 'while' statement\nmod_full_brace_while            = force    # ignore/add/remove/force\n\n# Add or remove braces on single-line 'using ()' statement\nmod_full_brace_using            = force    # ignore/add/remove/force\n\n# Add or remove unnecessary paren on 'return' statement\nmod_paren_on_return             = remove   # ignore/add/remove/force\n\n# Whether to change optional semicolons to real semicolons\nmod_pawn_semicolon              = false    # false/true\n\n# Add parens on 'while' and 'if' statement around bools\nmod_full_paren_if_bool          = false    # false/true\n\n# Whether to remove superfluous semicolons\nmod_remove_extra_semicolon      = false    # false/true\n\n# If a function body exceeds the specified number of newlines and doesn't have a comment after\n# the close brace, a comment will be added.\nmod_add_long_function_closebrace_comment = 0        # number\n\n# If a namespace body exceeds the specified number of newlines and doesn't have a comment after\n# the close brace, a comment will be added.\nmod_add_long_namespace_closebrace_comment = 0        # number\n\n# If a class body exceeds the specified number of newlines and doesn't have a comment after\n# the close brace, a comment will be added.\nmod_add_long_class_closebrace_comment = 0        # number\n\n# If a switch body exceeds the specified number of newlines and doesn't have a comment after\n# the close brace, a comment will be added.\nmod_add_long_switch_closebrace_comment = 0        # number\n\n# If an #ifdef body exceeds the specified number of newlines and doesn't have a comment after\n# the #endif, a comment will be added.\nmod_add_long_ifdef_endif_comment = 0        # number\n\n# If an #ifdef or #else body exceeds the specified number of newlines and doesn't have a comment after\n# the #else, a comment will be added.\nmod_add_long_ifdef_else_comment = 0        # number\n\n# If TRUE, will sort consecutive single-line 'import' statements [Java, D]\nmod_sort_import                 = false    # false/true\n\n# If TRUE, will sort consecutive single-line 'using' statements [C#]\nmod_sort_using                  = false    # false/true\n\n# If TRUE, will sort consecutive single-line '#include' statements [C/C++] and '#import' statements [Obj-C]\n# This is generally a bad idea, as it may break your code.\nmod_sort_include                = false    # false/true\n\n# If TRUE, it will move a 'break' that appears after a fully braced 'case' before the close brace.\nmod_move_case_break             = false    # false/true\n\n# Will add or remove the braces around a fully braced case statement.\n# Will only remove the braces if there are no variable declarations in the block.\nmod_case_brace                  = force    # ignore/add/remove/force\n\n# If TRUE, it will remove a void 'return;' that appears as the last statement in a function.\nmod_remove_empty_return         = false    # false/true\n\n# If TRUE, it will organize the properties (Obj-C)\nmod_sort_oc_properties          = false    # false/true\n\n# Determines weight of atomic/nonatomic (Obj-C)\nmod_sort_oc_property_thread_safe_weight = 0        # number\n\n# Determines weight of readwrite (Obj-C)\nmod_sort_oc_property_readwrite_weight = 0        # number\n\n# Determines weight of reference type (retain, copy, assign, weak, strong) (Obj-C)\nmod_sort_oc_property_reference_weight = 0        # number\n\n# Determines weight of getter type (getter=) (Obj-C)\nmod_sort_oc_property_getter_weight = 0        # number\n\n# Determines weight of setter type (setter=) (Obj-C)\nmod_sort_oc_property_setter_weight = 0        # number\n\n# Determines weight of nullability type (nullable/nonnull) (Obj-C)\nmod_sort_oc_property_nullability_weight = 0        # number\n\n#\n# Comment modifications\n#\n\n# Try to wrap comments at cmt_width columns\ncmt_width                       = 0        # number\n\n# Set the comment reflow mode (default: 0)\n# 0: no reflowing (apart from the line wrapping due to cmt_width)\n# 1: no touching at all\n# 2: full reflow\ncmt_reflow_mode                 = 0        # number\n\n# Whether to convert all tabs to spaces in comments. Default is to leave tabs inside comments alone, unless used for indenting.\ncmt_convert_tab_to_spaces       = false    # false/true\n\n# If false, disable all multi-line comment changes, including cmt_width. keyword substitution and leading chars.\n# Default=True.\ncmt_indent_multi                = true     # false/true\n\n# Whether to group c-comments that look like they are in a block\ncmt_c_group                     = false    # false/true\n\n# Whether to put an empty '/*' on the first line of the combined c-comment\ncmt_c_nl_start                  = false    # false/true\n\n# Whether to put a newline before the closing '*/' of the combined c-comment\ncmt_c_nl_end                    = false    # false/true\n\n# Whether to group cpp-comments that look like they are in a block\ncmt_cpp_group                   = false    # false/true\n\n# Whether to put an empty '/*' on the first line of the combined cpp-comment\ncmt_cpp_nl_start                = false    # false/true\n\n# Whether to put a newline before the closing '*/' of the combined cpp-comment\ncmt_cpp_nl_end                  = false    # false/true\n\n# Whether to change cpp-comments into c-comments\ncmt_cpp_to_c                    = false    # false/true\n\n# Whether to put a star on subsequent comment lines\ncmt_star_cont                   = false    # false/true\n\n# The number of spaces to insert at the start of subsequent comment lines\ncmt_sp_before_star_cont         = 0        # number\n\n# The number of spaces to insert after the star on subsequent comment lines\ncmt_sp_after_star_cont          = 0        # number\n\n# For multi-line comments with a '*' lead, remove leading spaces if the first and last lines of\n# the comment are the same length. Default=True\ncmt_multi_check_last            = true     # false/true\n\n# For multi-line comments with a '*' lead, remove leading spaces if the first and last lines of\n# the comment are the same length AND if the length is bigger as the first_len minimum. Default=4\ncmt_multi_first_len_minimum     = 4        # number\n\n# The filename that contains text to insert at the head of a file if the file doesn't start with a C/C++ comment.\n# Will substitute $(filename) with the current file's name.\ncmt_insert_file_header          = \"\"         # string\n\n# The filename that contains text to insert at the end of a file if the file doesn't end with a C/C++ comment.\n# Will substitute $(filename) with the current file's name.\ncmt_insert_file_footer          = \"\"         # string\n\n# The filename that contains text to insert before a function implementation if the function isn't preceded with a C/C++ comment.\n# Will substitute $(function) with the function name and $(javaparam) with the javadoc @param and @return stuff.\n# Will also substitute $(fclass) with the class name: void CFoo::Bar() { ... }\ncmt_insert_func_header          = \"\"         # string\n\n# The filename that contains text to insert before a class if the class isn't preceded with a C/C++ comment.\n# Will substitute $(class) with the class name.\ncmt_insert_class_header         = \"\"         # string\n\n# The filename that contains text to insert before a Obj-C message specification if the method isn't preceded with a C/C++ comment.\n# Will substitute $(message) with the function name and $(javaparam) with the javadoc @param and @return stuff.\ncmt_insert_oc_msg_header        = \"\"         # string\n\n# If a preprocessor is encountered when stepping backwards from a function name, then\n# this option decides whether the comment should be inserted.\n# Affects cmt_insert_oc_msg_header, cmt_insert_func_header and cmt_insert_class_header.\ncmt_insert_before_preproc       = false    # false/true\n\n# If a function is declared inline to a class definition, then\n# this option decides whether the comment should be inserted.\n# Affects cmt_insert_func_header.\ncmt_insert_before_inlines       = true     # false/true\n\n# If the function is a constructor/destructor, then\n# this option decides whether the comment should be inserted.\n# Affects cmt_insert_func_header.\ncmt_insert_before_ctor_dtor     = false    # false/true\n\n#\n# Preprocessor options\n#\n\n# Control indent of preprocessors inside #if blocks at brace level 0 (file-level)\npp_indent                       = remove   # ignore/add/remove/force\n\n# Whether to indent #if/#else/#endif at the brace level (true) or from column 1 (false)\npp_indent_at_level              = false    # false/true\n\n# Specifies the number of columns to indent preprocessors per level at brace level 0 (file-level).\n# If pp_indent_at_level=false, specifies the number of columns to indent preprocessors per level at brace level > 0 (function-level).\n# Default=1.\npp_indent_count                 = 0        # number\n\n# Add or remove space after # based on pp_level of #if blocks\npp_space                        = remove   # ignore/add/remove/force\n\n# Sets the number of spaces added with pp_space\npp_space_count                  = 0        # number\n\n# The indent for #region and #endregion in C# and '#pragma region' in C/C++\npp_indent_region                = 0        # number\n\n# Whether to indent the code between #region and #endregion\npp_region_indent_code           = false    # false/true\n\n# If pp_indent_at_level=true, sets the indent for #if, #else and #endif when not at file-level.\n# 0:  indent preprocessors using output_tab_size.\n# >0: column at which all preprocessors will be indented.\npp_indent_if                    = 0        # number\n\n# Control whether to indent the code between #if, #else and #endif.\npp_if_indent_code               = false    # false/true\n\n# Whether to indent '#define' at the brace level (true) or from column 1 (false)\npp_define_at_level              = 0        # false/true\n\n#\n# Use or Do not Use options\n#\n\n# True:  indent_func_call_param will be used (default)\n# False: indent_func_call_param will NOT be used\nuse_indent_func_call_param      = true     # false/true\n\n# The value of the indentation for a continuation line is calculate differently if the line is:\n#   a declaration :your case with QString fileName ...\n#   an assigment  :your case with pSettings = new QSettings( ...\n# At the second case the option value might be used twice:\n#   at the assigment\n#   at the function call (if present)\n# To prevent the double use of the option value, use this option with the value 'true'.\n# True:  indent_continue will be used only once\n# False: indent_continue will be used every time (default)\nuse_indent_continue_only_once   = false    # false/true\n\n# SIGNAL/SLOT Qt macros have special formatting options. See options_for_QT.cpp for details.\n# Default=True.\nuse_options_overriding_for_qt_macros = true     # false/true\n\n#\n# Warn levels - 1: error, 2: warning (default), 3: note\n#\n\n# Warning is given if doing tab-to-\\t replacement and we have found one in a C# verbatim string literal.\nwarn_level_tabs_found_in_verbatim_string_literals = 2        # number\n\n# You can force a token to be a type with the 'type' option.\n# Example:\n# type myfoo1 myfoo2\n#\n# You can create custom macro-based indentation using macro-open,\n# macro-else and macro-close.\n# Example:\n# macro-open  BEGIN_TEMPLATE_MESSAGE_MAP\n# macro-open  BEGIN_MESSAGE_MAP\n# macro-close END_MESSAGE_MAP\n#\n# You can assign any keyword to any type with the set option.\n# set func_call_user _ N_\n#\n# The full syntax description of all custom definition config entries\n# is shown below:\n#\n# define custom tokens as:\n# - embed whitespace in token using '' escape character, or\n#   put token in quotes\n# - these: ' \" and ` are recognized as quote delimiters\n#\n# type token1 token2 token3 ...\n#             ^ optionally specify multiple tokens on a single line\n# define def_token output_token\n#                  ^ output_token is optional, then NULL is assumed\n# macro-open token\n# macro-close token\n# macro-else token\n# set id token1 token2 ...\n#               ^ optionally specify multiple tokens on a single line\n#     ^ id is one of the names in token_enum.h sans the CT_ prefix,\n#       e.g. PP_PRAGMA\n#\n# all tokens are separated by any mix of ',' commas, '=' equal signs\n# and whitespace (space, tab)\n#\n# You can add support for other file extensions using the 'file_ext' command.\n# The first arg is the language name used with the '-l' option.\n# The remaining args are file extensions, matched with 'endswith'.\n#   file_ext CPP .ch .cxx .cpp.in\n#\n# option(s) with 'not default' value: 0\n#\n"
  },
  {
    "path": "examples/test.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"7 + 3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"int x{7};\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"7\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"x\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"17\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"x + 10\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"C++17\",\n   \"language\": \"C++17\",\n   \"name\": \"xcpp17\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": \"text/x-c++src\",\n   \"file_extension\": \".cpp\",\n   \"mimetype\": \"text/x-c++src\",\n   \"name\": \"c++\",\n   \"version\": \"17\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  }
]